From aa67a43c976212f7cca7bd2fc80560d1b5ae4e13 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Thu, 17 Nov 2022 08:13:22 +0100 Subject: [PATCH 001/339] rustc grumbles --- .../runtimes/assets/westmint/src/lib.rs | 51 +++++++++++-------- .../assets/westmint/src/xcm_config.rs | 10 ++-- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 12f9c4966a1..1ce1db3ca11 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -223,7 +223,11 @@ parameter_types! { pub type AssetsForceOrigin = EnsureRoot; -impl pallet_assets::Config for Runtime { +// We should perhaps come up with a new name. "ReserveBackedAssets" collides with XCM terminology +// and falsly implies that they are actually backed by some reserve. In reality, the user is +// _trusting_ some `CreateOrigin` (AccountId) that the asset is what they claim. +type TrustBackedAssetClasses = pallet_assets::Instance1; +impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type AssetId = AssetId; @@ -319,7 +323,7 @@ impl InstanceFilter for ProxyType { ProxyType::NonTransfer => !matches!( c, RuntimeCall::Balances { .. } | - RuntimeCall::Assets { .. } | + RuntimeCall::TrustBackedAssets { .. } | RuntimeCall::Uniques { .. } ), ProxyType::CancelProxy => matches!( @@ -331,7 +335,7 @@ impl InstanceFilter for ProxyType { ProxyType::Assets => { matches!( c, - RuntimeCall::Assets { .. } | + RuntimeCall::TrustBackedAssets { .. } | RuntimeCall::Utility { .. } | RuntimeCall::Multisig { .. } | RuntimeCall::Uniques { .. } @@ -339,12 +343,12 @@ impl InstanceFilter for ProxyType { }, ProxyType::AssetOwner => matches!( c, - RuntimeCall::Assets(pallet_assets::Call::create { .. }) | - RuntimeCall::Assets(pallet_assets::Call::destroy { .. }) | - RuntimeCall::Assets(pallet_assets::Call::transfer_ownership { .. }) | - RuntimeCall::Assets(pallet_assets::Call::set_team { .. }) | - RuntimeCall::Assets(pallet_assets::Call::set_metadata { .. }) | - RuntimeCall::Assets(pallet_assets::Call::clear_metadata { .. }) | + RuntimeCall::Assets(TrustBackedAssetClasses::Call::create { .. }) | + RuntimeCall::Assets(TrustBackedAssetClasses::Call::destroy { .. }) | + RuntimeCall::Assets(TrustBackedAssetClasses::Call::transfer_ownership { .. }) | + RuntimeCall::Assets(TrustBackedAssetClasses::Call::set_team { .. }) | + RuntimeCall::Assets(TrustBackedAssetClasses::Call::set_metadata { .. }) | + RuntimeCall::Assets(TrustBackedAssetClasses::Call::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | @@ -361,13 +365,15 @@ impl InstanceFilter for ProxyType { ), ProxyType::AssetManager => matches!( c, - RuntimeCall::Assets(pallet_assets::Call::mint { .. }) | - RuntimeCall::Assets(pallet_assets::Call::burn { .. }) | - RuntimeCall::Assets(pallet_assets::Call::freeze { .. }) | - RuntimeCall::Assets(pallet_assets::Call::thaw { .. }) | - RuntimeCall::Assets(pallet_assets::Call::freeze_asset { .. }) | - RuntimeCall::Assets(pallet_assets::Call::thaw_asset { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetClasses::Call::mint { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetClasses::Call::burn { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetClasses::Call::freeze { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetClasses::Call::thaw { .. }) | + RuntimeCall::TrustBackedAssets( + TrustBackedAssetClasses::Call::freeze_asset { .. } + ) | RuntimeCall::TrustBackedAssets( + TrustBackedAssetClasses::Call::thaw_asset { .. } + ) | RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::thaw { .. }) | @@ -506,7 +512,9 @@ impl pallet_collator_selection::Config for Runtime { impl pallet_asset_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type Fungibles = Assets; + // TODO + // This should be able to take assets from any pallet instance. + type Fungibles = TrustBackedAssets; type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< pallet_assets::BalanceToAssetBalance, AssetsToBlockAuthor, @@ -585,7 +593,7 @@ construct_runtime!( Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, // The main stage. - Assets: pallet_assets::{Pallet, Call, Storage, Event} = 50, + TrustBackedAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, } ); @@ -621,7 +629,10 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, - (), + // TODO + // 1. Move this instance https://substrate.stackexchange.com/questions/4343/how-to-migrate-storage-from-a-default-pallet-instance-to-an-actual-one + // 2. Make sure this migration applies to the old instance + pallet_assets::migration::v1::MigrateToV1, >; #[cfg(feature = "runtime-benchmarks")] @@ -632,7 +643,7 @@ extern crate frame_benchmarking; mod benches { define_benchmarks!( [frame_system, SystemBench::] - [pallet_assets, Assets] + [pallet_assets, TrustBackedAssets] [pallet_balances, Balances] [pallet_multisig, Multisig] [pallet_proxy, Proxy] diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 4f55696c69e..e2896ed15c3 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -17,6 +17,8 @@ use super::{ AccountId, AllPalletsWithSystem, AssetId, Assets, Authorship, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, + AccountId, AssetId, Authorship, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, + Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssets, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, @@ -49,7 +51,7 @@ parameter_types! { pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); pub const Local: MultiLocation = Here.into_location(); pub AssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); + PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } @@ -82,7 +84,7 @@ pub type CurrencyTransactor = CurrencyAdapter< /// Means for transacting assets besides the native currency on this chain. pub type FungiblesTransactor = FungiblesAdapter< // Use this fungibles implementation: - Assets, + TrustBackedAssets, // Use this currency when it is a fungible asset matching the given location or name: ConvertedConcreteId< AssetId, @@ -96,7 +98,7 @@ pub type FungiblesTransactor = FungiblesAdapter< AccountId, // We only want to allow teleports of known assets. We use non-zero issuance as an indication // that this asset is known. - parachains_common::impls::NonZeroIssuance, + parachains_common::impls::NonZeroIssuance, // The account to use for tracking teleports. CheckingAccount, >; @@ -187,7 +189,7 @@ impl xcm_executor::Config for XcmConfig { AsPrefixedGeneralIndex, JustTry, >, - Assets, + TrustBackedAssets, cumulus_primitives_utility::XcmFeesTo32ByteAccount< FungiblesTransactor, AccountId, From 9ab17393047b42ed6e7db71b936b7f7409c730b6 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Thu, 17 Nov 2022 08:41:37 +0100 Subject: [PATCH 002/339] add second instance --- .../runtimes/assets/westmint/src/lib.rs | 34 +++++++++++++++++-- .../assets/westmint/src/xcm_config.rs | 34 ++++++++++++++++++- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 1ce1db3ca11..34d53fb4622 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -63,7 +63,9 @@ use parachains_common::{ opaque, AccountId, AssetId, AuraId, Balance, BlockNumber, Hash, Header, Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; -use xcm_config::{XcmConfig, XcmOriginToTransactDispatchOrigin}; +use xcm_config::{ + ForeignCreators, MultiLocationForAssetId, XcmConfig, XcmOriginToTransactDispatchOrigin, +}; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; @@ -244,6 +246,27 @@ impl pallet_assets::Config for Runtime { type AssetAccountDeposit = AssetAccountDeposit; } +/// Assets managed by some foreign location. +type ForeignAssetClasses = pallet_assets::Instance2; +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = MultiLocationForAssetId; + type Currency = Balances; + type CreateOrigin = ForeignCreators; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type WeightInfo = weights::pallet_assets::WeightInfo; + type AssetAccountDeposit = AssetAccountDeposit; + type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; +} + parameter_types! { // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. pub const DepositBase: Balance = deposit(1, 88); @@ -514,9 +537,12 @@ impl pallet_asset_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; // TODO // This should be able to take assets from any pallet instance. - type Fungibles = TrustBackedAssets; + type Fungibles = (ForeignAssets, TrustBackedAssets); type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< - pallet_assets::BalanceToAssetBalance, + ( + ForeignAssets::BalanceToAssetBalance, + TrustBackedAssets::BalanceToAssetBalance, + ), AssetsToBlockAuthor, >; } @@ -595,6 +621,7 @@ construct_runtime!( // The main stage. TrustBackedAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, + ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 52, } ); @@ -644,6 +671,7 @@ mod benches { define_benchmarks!( [frame_system, SystemBench::] [pallet_assets, TrustBackedAssets] + [pallet_assets, ForeignAssets] [pallet_balances, Balances] [pallet_multisig, Multisig] [pallet_proxy, Proxy] diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index e2896ed15c3..b7e2c9ca25e 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -23,6 +23,7 @@ use super::{ use frame_support::{ match_types, parameter_types, traits::{ConstU32, Everything, Nothing, PalletInfoAccess}, + traits::{EnsureOriginWithArg, Everything, PalletInfoAccess}, }; use pallet_xcm::XcmPassthrough; use parachains_common::{ @@ -31,7 +32,7 @@ use parachains_common::{ AssetFeeAsExistentialDepositMultiplier, DenyReserveTransferToRelayChain, DenyThenTry, }, }; -use polkadot_parachain::primitives::Sibling; +use polkadot_parachain::primitives::{Id as ParaId, Sibling}; use sp_runtime::traits::ConvertInto; use xcm::latest::prelude::*; use xcm_builder::{ @@ -253,3 +254,34 @@ impl cumulus_pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; } + +pub type MultiLocationForAssetId = MultiLocation; + +pub type SovereignAccountOf = ( + SiblingParachainConvertsVia, + AccountId32Aliases, + ParentIsPreset, +); + +// `EnsureOriginWithArg` impl for `CreateOrigin` which allows only XCM origins that are locations +// containing the class location. +pub struct ForeignCreators; +impl EnsureOriginWithArg for ForeignCreators { + type Success = AccountId; + + fn try_origin( + o: RuntimeOrigin, + a: &MultiLocation, + ) -> sp_std::result::Result { + let origin_location = pallet_xcm::EnsureXcm::::try_origin(o.clone())?; + if !a.starts_with(&origin_location) { + return Err(o) + } + SovereignAccountOf::convert(origin_location).map_err(|_| o) + } + + #[cfg(feature = "runtime-benchmarks")] + fn successful_origin(a: &MultiLocation) -> RuntimeOrigin { + pallet_xcm::Origin::Xcm(a.clone()).into() + } +} From df40d77e2f90a6f4c4381b7c8c30ebd9dba1849f Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Thu, 17 Nov 2022 08:47:06 +0100 Subject: [PATCH 003/339] leave some todos --- parachains/runtimes/assets/westmint/src/xcm_config.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index b7e2c9ca25e..29ba8304b62 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -51,6 +51,7 @@ parameter_types! { pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); pub const Local: MultiLocation = Here.into_location(); + // todo: accept all instances, perhaps need a type for each instance? pub AssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); @@ -85,12 +86,12 @@ pub type CurrencyTransactor = CurrencyAdapter< /// Means for transacting assets besides the native currency on this chain. pub type FungiblesTransactor = FungiblesAdapter< // Use this fungibles implementation: - TrustBackedAssets, + TrustBackedAssets, // todo: accept all instances // Use this currency when it is a fungible asset matching the given location or name: ConvertedConcreteId< AssetId, Balance, - AsPrefixedGeneralIndex, + AsPrefixedGeneralIndex, // todo: accept all instances JustTry, >, // Convert an XCM MultiLocation into a local account id: @@ -99,7 +100,7 @@ pub type FungiblesTransactor = FungiblesAdapter< AccountId, // We only want to allow teleports of known assets. We use non-zero issuance as an indication // that this asset is known. - parachains_common::impls::NonZeroIssuance, + parachains_common::impls::NonZeroIssuance, // todo: accept all instances // The account to use for tracking teleports. CheckingAccount, >; @@ -187,10 +188,10 @@ impl xcm_executor::Config for XcmConfig { ConvertedConcreteId< AssetId, Balance, - AsPrefixedGeneralIndex, + AsPrefixedGeneralIndex, // todo: accept all instances JustTry, >, - TrustBackedAssets, + TrustBackedAssets, // todo: accept all instances cumulus_primitives_utility::XcmFeesTo32ByteAccount< FungiblesTransactor, AccountId, From 94717a415be98b51207e8b58ccb207bbc4f3941f Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Thu, 17 Nov 2022 10:41:47 +0100 Subject: [PATCH 004/339] fix AssetsToBlockAuthor --- parachains/common/src/impls.rs | 11 ++++++----- parachains/runtimes/assets/westmint/src/lib.rs | 14 ++++++++------ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/parachains/common/src/impls.rs b/parachains/common/src/impls.rs index 284a431835a..87edb28d9f8 100644 --- a/parachains/common/src/impls.rs +++ b/parachains/common/src/impls.rs @@ -71,17 +71,18 @@ where /// A `HandleCredit` implementation that naively transfers the fees to the block author. /// Will drop and burn the assets in case the transfer fails. -pub struct AssetsToBlockAuthor(PhantomData); -impl HandleCredit, pallet_assets::Pallet> for AssetsToBlockAuthor +pub struct AssetsToBlockAuthor(PhantomData<(R, I)>); +impl HandleCredit, pallet_assets::Pallet> for AssetsToBlockAuthor where - R: pallet_authorship::Config + pallet_assets::Config, + I: 'static, + R: pallet_authorship::Config + pallet_assets::Config, AccountIdOf: From + Into, { - fn handle_credit(credit: CreditOf, pallet_assets::Pallet>) { + fn handle_credit(credit: CreditOf, pallet_assets::Pallet>) { if let Some(author) = pallet_authorship::Pallet::::author() { // In case of error: Will drop the result triggering the `OnDrop` of the imbalance. - let _ = pallet_assets::Pallet::::resolve(&author, credit); + let _ = pallet_assets::Pallet::::resolve(&author, credit); } } } diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 34d53fb4622..a0c225c391e 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -535,14 +535,16 @@ impl pallet_collator_selection::Config for Runtime { impl pallet_asset_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - // TODO + // TODO https://github.com/paritytech/substrate/issues/12724 // This should be able to take assets from any pallet instance. - type Fungibles = (ForeignAssets, TrustBackedAssets); + type Fungibles = TrustBackedAssets; type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< - ( - ForeignAssets::BalanceToAssetBalance, - TrustBackedAssets::BalanceToAssetBalance, - ), + pallet_assets::BalanceToAssetBalance< + Balances, + Runtime, + ConvertInto, + pallet_assets::Instance1, + >, AssetsToBlockAuthor, >; } From 47d96e0192705d8d1c333564abb85ad942f6dc46 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Fri, 18 Nov 2022 10:51:45 +0100 Subject: [PATCH 005/339] make it almost compile --- parachains/common/src/xcm_config.rs | 19 +++++--- .../runtimes/assets/westmint/src/lib.rs | 46 ++++++++++--------- .../assets/westmint/src/xcm_config.rs | 24 +++++++--- 3 files changed, 54 insertions(+), 35 deletions(-) diff --git a/parachains/common/src/xcm_config.rs b/parachains/common/src/xcm_config.rs index 9a9774ae94f..49bd563387d 100644 --- a/parachains/common/src/xcm_config.rs +++ b/parachains/common/src/xcm_config.rs @@ -82,24 +82,29 @@ pub struct AssetFeeAsExistentialDepositMultiplier cumulus_primitives_utility::ChargeWeightInFungibles< AccountIdOf, - pallet_assets::Pallet, + // todo: I don't understand why `frame_support` is the instance here??? but it compiles... + pallet_assets::Pallet, > for AssetFeeAsExistentialDepositMultiplier where - Runtime: pallet_assets::Config, + Runtime: pallet_assets::Config, WeightToFee: WeightToFeePolynomial, BalanceConverter: BalanceConversion< CurrencyBalance, - ::AssetId, - ::Balance, + >::AssetId, + >::Balance, >, AccountIdOf: From + Into, { fn charge_weight_in_fungibles( - asset_id: as Inspect>>::AssetId, + asset_id: as Inspect>>::AssetId, weight: Weight, - ) -> Result< as Inspect>>::Balance, XcmError> - { + ) -> Result< + as Inspect< + AccountIdOf, + >>::Balance, + XcmError, + > { let amount = WeightToFee::weight_to_fee(&weight); // If the amount gotten is not at least the ED, then make it be the ED of the asset // This is to avoid burning assets and decreasing the supply diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index a0c225c391e..a8b2bd600cb 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -228,8 +228,8 @@ pub type AssetsForceOrigin = EnsureRoot; // We should perhaps come up with a new name. "ReserveBackedAssets" collides with XCM terminology // and falsly implies that they are actually backed by some reserve. In reality, the user is // _trusting_ some `CreateOrigin` (AccountId) that the asset is what they claim. -type TrustBackedAssetClasses = pallet_assets::Instance1; -impl pallet_assets::Config for Runtime { +pub type TrustBackedAssetsInstance = pallet_assets::Instance1; +impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type AssetId = AssetId; @@ -251,9 +251,11 @@ type ForeignAssetClasses = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; - type AssetId = MultiLocationForAssetId; + // TODO: impl Copy for MultiLocation or relax AssetId to Clone? + // https://github.com/paritytech/substrate/pull/12731 + type AssetId = AssetId; // MultiLocationForAssetId; type Currency = Balances; - type CreateOrigin = ForeignCreators; + type CreateOrigin = AsEnsureOriginWithArg>; // ForeignCreators; type ForceOrigin = AssetsForceOrigin; type AssetDeposit = AssetDeposit; type MetadataDepositBase = MetadataDepositBase; @@ -339,6 +341,7 @@ impl Default for ProxyType { Self::Any } } +type TrustBackedAssetsCall = pallet_assets::Call; impl InstanceFilter for ProxyType { fn filter(&self, c: &RuntimeCall) -> bool { match self { @@ -366,12 +369,12 @@ impl InstanceFilter for ProxyType { }, ProxyType::AssetOwner => matches!( c, - RuntimeCall::Assets(TrustBackedAssetClasses::Call::create { .. }) | - RuntimeCall::Assets(TrustBackedAssetClasses::Call::destroy { .. }) | - RuntimeCall::Assets(TrustBackedAssetClasses::Call::transfer_ownership { .. }) | - RuntimeCall::Assets(TrustBackedAssetClasses::Call::set_team { .. }) | - RuntimeCall::Assets(TrustBackedAssetClasses::Call::set_metadata { .. }) | - RuntimeCall::Assets(TrustBackedAssetClasses::Call::clear_metadata { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::destroy { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::transfer_ownership { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | @@ -388,15 +391,13 @@ impl InstanceFilter for ProxyType { ), ProxyType::AssetManager => matches!( c, - RuntimeCall::TrustBackedAssets(TrustBackedAssetClasses::Call::mint { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetClasses::Call::burn { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetClasses::Call::freeze { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetClasses::Call::thaw { .. }) | - RuntimeCall::TrustBackedAssets( - TrustBackedAssetClasses::Call::freeze_asset { .. } - ) | RuntimeCall::TrustBackedAssets( - TrustBackedAssetClasses::Call::thaw_asset { .. } - ) | RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::mint { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::burn { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze_asset { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw_asset { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::thaw { .. }) | @@ -536,14 +537,15 @@ impl pallet_collator_selection::Config for Runtime { impl pallet_asset_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; // TODO https://github.com/paritytech/substrate/issues/12724 - // This should be able to take assets from any pallet instance. + // This should be able to take assets from any pallet instance. For now we only allow + // sufficient, trust backed assets to pay for transaction fees. type Fungibles = TrustBackedAssets; type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< pallet_assets::BalanceToAssetBalance< Balances, Runtime, ConvertInto, - pallet_assets::Instance1, + TrustBackedAssetsInstance, >, AssetsToBlockAuthor, >; @@ -661,7 +663,7 @@ pub type Executive = frame_executive::Executive< // TODO // 1. Move this instance https://substrate.stackexchange.com/questions/4343/how-to-migrate-storage-from-a-default-pallet-instance-to-an-actual-one // 2. Make sure this migration applies to the old instance - pallet_assets::migration::v1::MigrateToV1, + (), //pallet_assets::migration::v1::MigrateToV1, >; #[cfg(feature = "runtime-benchmarks")] diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 29ba8304b62..5adf40767a3 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -18,14 +18,15 @@ use super::{ ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, AccountId, AssetId, Authorship, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, - Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssets, WeightToFee, XcmpQueue, + Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, TrustBackedAssets, + WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, traits::{ConstU32, Everything, Nothing, PalletInfoAccess}, traits::{EnsureOriginWithArg, Everything, PalletInfoAccess}, }; -use pallet_xcm::XcmPassthrough; +use pallet_xcm::{EnsureXcm, XcmPassthrough}; use parachains_common::{ impls::ToStakingPot, xcm_config::{ @@ -43,7 +44,7 @@ use xcm_builder::{ SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, }; -use xcm_executor::{traits::JustTry, XcmExecutor}; +use xcm_executor::{traits::{Convert, JustTry}, XcmExecutor}; parameter_types! { pub const WestendLocation: MultiLocation = MultiLocation::parent(); @@ -183,7 +184,12 @@ impl xcm_executor::Config for XcmConfig { AssetFeeAsExistentialDepositMultiplier< Runtime, WeightToFee, - pallet_assets::BalanceToAssetBalance, + pallet_assets::BalanceToAssetBalance< + Balances, + Runtime, + ConvertInto, + TrustBackedAssetsInstance, + >, >, ConvertedConcreteId< AssetId, @@ -274,8 +280,14 @@ impl EnsureOriginWithArg for ForeignCreators { o: RuntimeOrigin, a: &MultiLocation, ) -> sp_std::result::Result { - let origin_location = pallet_xcm::EnsureXcm::::try_origin(o.clone())?; - if !a.starts_with(&origin_location) { + let origin_location = EnsureXcm::try_origin(o.clone())?; + + // dirty hack, should port vvv into master and use `starts_with` + // https://github.com/paritytech/polkadot/commit/e640d826513c45a0452138c8908a699e19ac0143 + if a.parents != origin_location.parents || + a.interior.len() != origin_location.interior.len() || + !a.interior.iter().zip(origin_location.interior.iter()).all(|(l, r)| l == r) + { return Err(o) } SovereignAccountOf::convert(origin_location).map_err(|_| o) From 1e0515e1aeee67097fa5a3295e2a6fee25de5c5e Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Fri, 18 Nov 2022 11:02:33 +0100 Subject: [PATCH 006/339] make it actually compile --- parachains/runtimes/assets/westmint/src/xcm_config.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 5adf40767a3..8cb3d0c584f 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -25,6 +25,7 @@ use frame_support::{ match_types, parameter_types, traits::{ConstU32, Everything, Nothing, PalletInfoAccess}, traits::{EnsureOriginWithArg, Everything, PalletInfoAccess}, + traits::{EnsureOrigin, EnsureOriginWithArg, Everything, PalletInfoAccess}, }; use pallet_xcm::{EnsureXcm, XcmPassthrough}; use parachains_common::{ @@ -280,7 +281,7 @@ impl EnsureOriginWithArg for ForeignCreators { o: RuntimeOrigin, a: &MultiLocation, ) -> sp_std::result::Result { - let origin_location = EnsureXcm::try_origin(o.clone())?; + let origin_location = EnsureXcm::::try_origin(o.clone())?; // dirty hack, should port vvv into master and use `starts_with` // https://github.com/paritytech/polkadot/commit/e640d826513c45a0452138c8908a699e19ac0143 From 6de6313909cf88bc5122106b937b75f4c2f5fc79 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Fri, 18 Nov 2022 11:15:24 +0100 Subject: [PATCH 007/339] fix logical error --- .../runtimes/assets/westmint/src/xcm_config.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 8cb3d0c584f..2aa7affbc3f 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -18,8 +18,8 @@ use super::{ ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, AccountId, AssetId, Authorship, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, - Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, TrustBackedAssets, - WeightToFee, XcmpQueue, + Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssets, + TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, @@ -45,7 +45,10 @@ use xcm_builder::{ SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, }; -use xcm_executor::{traits::{Convert, JustTry}, XcmExecutor}; +use xcm_executor::{ + traits::{Convert, JustTry}, + XcmExecutor, +}; parameter_types! { pub const WestendLocation: MultiLocation = MultiLocation::parent(); @@ -286,8 +289,8 @@ impl EnsureOriginWithArg for ForeignCreators { // dirty hack, should port vvv into master and use `starts_with` // https://github.com/paritytech/polkadot/commit/e640d826513c45a0452138c8908a699e19ac0143 if a.parents != origin_location.parents || - a.interior.len() != origin_location.interior.len() || - !a.interior.iter().zip(origin_location.interior.iter()).all(|(l, r)| l == r) + a.interior.len() < origin_location.interior.len() || + !origin_location.interior.iter().zip(a.interior.iter()).all(|(l, r)| l == r) { return Err(o) } From 35d1e577ae09012985b799332b175c2a1cf9b29c Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Fri, 18 Nov 2022 15:53:46 +0100 Subject: [PATCH 008/339] cargo fmt to resolve duplicate imports on merge --- parachains/runtimes/assets/westmint/src/lib.rs | 4 ++-- parachains/runtimes/assets/westmint/src/xcm_config.rs | 11 +++-------- .../collectives-polkadot/src/xcm_config.rs | 7 +++---- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index a8b2bd600cb..00c03e56e8d 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -247,8 +247,8 @@ impl pallet_assets::Config for Runtime { } /// Assets managed by some foreign location. -type ForeignAssetClasses = pallet_assets::Instance2; -impl pallet_assets::Config for Runtime { +type ForeignAssetsInstance = pallet_assets::Instance2; +impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; // TODO: impl Copy for MultiLocation or relax AssetId to Clone? diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 2aa7affbc3f..74f661815cb 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -15,17 +15,12 @@ use super::{ AccountId, AllPalletsWithSystem, AssetId, Assets, Authorship, Balance, Balances, ParachainInfo, - ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, - XcmpQueue, - AccountId, AssetId, Authorship, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, - Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssets, - TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + TrustBackedAssets, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Everything, Nothing, PalletInfoAccess}, - traits::{EnsureOriginWithArg, Everything, PalletInfoAccess}, - traits::{EnsureOrigin, EnsureOriginWithArg, Everything, PalletInfoAccess}, + traits::{ConstU32, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing, PalletInfoAccess}, }; use pallet_xcm::{EnsureXcm, XcmPassthrough}; use parachains_common::{ diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index 2cb82656c37..fb0bd3b4195 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -31,10 +31,9 @@ use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - FixedWeightBounds, IsConcrete, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - UsingComponents, + FixedWeightBounds, IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, }; use xcm_executor::XcmExecutor; From 362a9078df6a5d6b7b2eff50544b990c25072c1f Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Fri, 18 Nov 2022 20:35:00 +0100 Subject: [PATCH 009/339] fix deps to make compile --- Cargo.lock | 2 +- parachains/common/src/xcm_config.rs | 13 ++++++------- parachains/runtimes/assets/westmint/src/lib.rs | 17 ++++++++--------- .../runtimes/assets/westmint/src/xcm_config.rs | 16 +++++----------- 4 files changed, 20 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c908727eac7..23b7c2f887e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5310,7 +5310,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#4e1e17cccd499dfe49e8c1bed01957953aa4c839" +source = "git+https://github.com/paritytech/substrate?branch=master#087ec5a5b2c9a960fe0f8dc658ab5b21fe8199b3" dependencies = [ "frame-benchmarking", "frame-support", diff --git a/parachains/common/src/xcm_config.rs b/parachains/common/src/xcm_config.rs index 49bd563387d..b0c774dc6d2 100644 --- a/parachains/common/src/xcm_config.rs +++ b/parachains/common/src/xcm_config.rs @@ -82,25 +82,24 @@ pub struct AssetFeeAsExistentialDepositMultiplier cumulus_primitives_utility::ChargeWeightInFungibles< AccountIdOf, - // todo: I don't understand why `frame_support` is the instance here??? but it compiles... - pallet_assets::Pallet, + pallet_assets::Pallet, > for AssetFeeAsExistentialDepositMultiplier where - Runtime: pallet_assets::Config, + Runtime: pallet_assets::Config, WeightToFee: WeightToFeePolynomial, BalanceConverter: BalanceConversion< CurrencyBalance, - >::AssetId, - >::Balance, + >::AssetId, + >::Balance, >, AccountIdOf: From + Into, { fn charge_weight_in_fungibles( - asset_id: as Inspect>>::AssetId, + asset_id: as Inspect>>::AssetId, weight: Weight, ) -> Result< - as Inspect< + as Inspect< AccountIdOf, >>::Balance, XcmError, diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 00c03e56e8d..5c42cd12ffc 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -234,6 +234,7 @@ impl pallet_assets::Config for Runtime { type Balance = Balance; type AssetId = AssetId; type Currency = Balances; + type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = AssetsForceOrigin; type AssetDeposit = AssetDeposit; type MetadataDepositBase = MetadataDepositBase; @@ -251,8 +252,7 @@ type ForeignAssetsInstance = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; - // TODO: impl Copy for MultiLocation or relax AssetId to Clone? - // https://github.com/paritytech/substrate/pull/12731 + // TODO: need HasCompact for MultiLocation type AssetId = AssetId; // MultiLocationForAssetId; type Currency = Balances; type CreateOrigin = AsEnsureOriginWithArg>; // ForeignCreators; @@ -266,7 +266,6 @@ impl pallet_assets::Config for Runtime { type Extra = (); type WeightInfo = weights::pallet_assets::WeightInfo; type AssetAccountDeposit = AssetAccountDeposit; - type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; } parameter_types! { @@ -369,12 +368,12 @@ impl InstanceFilter for ProxyType { }, ProxyType::AssetOwner => matches!( c, - RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::destroy { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::transfer_ownership { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::create { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::destroy { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::transfer_ownership { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_metadata { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 74f661815cb..3c396c95e0d 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -14,7 +14,7 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, AssetId, Assets, Authorship, Balance, Balances, ParachainInfo, + AccountId, AllPalletsWithSystem, AssetId, Authorship, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssets, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; @@ -52,7 +52,7 @@ parameter_types! { pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); pub const Local: MultiLocation = Here.into_location(); // todo: accept all instances, perhaps need a type for each instance? - pub AssetsPalletLocation: MultiLocation = + pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } @@ -91,7 +91,7 @@ pub type FungiblesTransactor = FungiblesAdapter< ConvertedConcreteId< AssetId, Balance, - AsPrefixedGeneralIndex, // todo: accept all instances + AsPrefixedGeneralIndex, // todo: accept all instances JustTry, >, // Convert an XCM MultiLocation into a local account id: @@ -193,7 +193,7 @@ impl xcm_executor::Config for XcmConfig { ConvertedConcreteId< AssetId, Balance, - AsPrefixedGeneralIndex, // todo: accept all instances + AsPrefixedGeneralIndex, // todo: accept all instances JustTry, >, TrustBackedAssets, // todo: accept all instances @@ -280,13 +280,7 @@ impl EnsureOriginWithArg for ForeignCreators { a: &MultiLocation, ) -> sp_std::result::Result { let origin_location = EnsureXcm::::try_origin(o.clone())?; - - // dirty hack, should port vvv into master and use `starts_with` - // https://github.com/paritytech/polkadot/commit/e640d826513c45a0452138c8908a699e19ac0143 - if a.parents != origin_location.parents || - a.interior.len() < origin_location.interior.len() || - !origin_location.interior.iter().zip(a.interior.iter()).all(|(l, r)| l == r) - { + if !a.starts_with(&origin_location) { return Err(o) } SovereignAccountOf::convert(origin_location).map_err(|_| o) From b8ed7e7c64f0a0dc3be0edb53bdceee77738b00a Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Fri, 18 Nov 2022 21:20:53 +0100 Subject: [PATCH 010/339] fmt --- parachains/common/src/xcm_config.rs | 4 +++- parachains/runtimes/assets/westmint/src/lib.rs | 7 ++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/parachains/common/src/xcm_config.rs b/parachains/common/src/xcm_config.rs index b0c774dc6d2..702065d05e9 100644 --- a/parachains/common/src/xcm_config.rs +++ b/parachains/common/src/xcm_config.rs @@ -96,7 +96,9 @@ where From + Into, { fn charge_weight_in_fungibles( - asset_id: as Inspect>>::AssetId, + asset_id: as Inspect< + AccountIdOf, + >>::AssetId, weight: Weight, ) -> Result< as Inspect< diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 5c42cd12ffc..b58baf30779 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -234,7 +234,7 @@ impl pallet_assets::Config for Runtime { type Balance = Balance; type AssetId = AssetId; type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; + type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = AssetsForceOrigin; type AssetDeposit = AssetDeposit; type MetadataDepositBase = MetadataDepositBase; @@ -370,8 +370,9 @@ impl InstanceFilter for ProxyType { c, RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::create { .. }) | RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::destroy { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::transfer_ownership { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::TrustBackedAssets( + TrustBackedAssetsCall::transfer_ownership { .. } + ) | RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_team { .. }) | RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_metadata { .. }) | RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | From 633366b172fd04cf7ab7c5226b17d411199b113a Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 22 Nov 2022 00:29:08 +0100 Subject: [PATCH 011/339] (pallet-assets/pallet-asset-tx-payment) pathched with `sv-locked-for-gav-xcm-v3-and-bridges-plus-assets` --- Cargo.lock | 463 ++++++++++++++++++++++++----------------------------- Cargo.toml | 356 ++++++++++++++++++++-------------------- 2 files changed, 391 insertions(+), 428 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 23b7c2f887e..ed7176dcda1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -469,7 +469,7 @@ dependencies = [ [[package]] name = "beefy-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "async-trait", @@ -506,7 +506,7 @@ dependencies = [ [[package]] name = "beefy-gadget-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "beefy-gadget", "beefy-primitives", @@ -526,7 +526,7 @@ dependencies = [ [[package]] name = "beefy-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "beefy-primitives", "sp-api", @@ -536,7 +536,7 @@ dependencies = [ [[package]] name = "beefy-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "scale-info", @@ -2847,7 +2847,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", ] @@ -2870,7 +2870,7 @@ checksum = "85dcb89d2b10c5f6133de2efd8c11959ce9dbb46a2f7a4cab208c4eeda6ce1ab" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -2893,7 +2893,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "Inflector", "array-bytes", @@ -2944,7 +2944,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2955,7 +2955,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2971,7 +2971,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -3000,7 +3000,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "bitflags", "frame-metadata", @@ -3032,7 +3032,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "Inflector", "cfg-expr", @@ -3046,7 +3046,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3058,7 +3058,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "proc-macro2", "quote", @@ -3068,7 +3068,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "log", @@ -3086,7 +3086,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3101,7 +3101,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "sp-api", @@ -3110,7 +3110,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "parity-scale-codec", @@ -3992,7 +3992,7 @@ dependencies = [ "pallet-conviction-voting", "pallet-democracy", "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking 4.0.0-dev (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-election-provider-support-benchmarking", "pallet-elections-phragmen", "pallet-fast-unstake", "pallet-gilt", @@ -4027,7 +4027,7 @@ dependencies = [ "pallet-vesting", "pallet-whitelist", "pallet-xcm", - "pallet-xcm-benchmarks 0.9.31 (git+https://github.com/paritytech//polkadot?branch=locked-for-gav-xcm-v3-and-bridges)", + "pallet-xcm-benchmarks", "parity-scale-codec", "polkadot-primitives", "polkadot-runtime-common", @@ -5272,7 +5272,7 @@ checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#4e1e17cccd499dfe49e8c1bed01957953aa4c839" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "frame-benchmarking", @@ -5293,8 +5293,9 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#4e1e17cccd499dfe49e8c1bed01957953aa4c839" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "pallet-transaction-payment", @@ -5310,7 +5311,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#087ec5a5b2c9a960fe0f8dc658ab5b21fe8199b3" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5324,7 +5325,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -5340,7 +5341,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -5356,7 +5357,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -5371,7 +5372,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5395,7 +5396,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5415,7 +5416,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5430,7 +5431,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "beefy-primitives", "frame-support", @@ -5446,7 +5447,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "beefy-merkle-tree", @@ -5469,7 +5470,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5487,7 +5488,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5531,7 +5532,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5548,7 +5549,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "bitflags", "frame-benchmarking", @@ -5577,7 +5578,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "bitflags", "parity-scale-codec", @@ -5589,7 +5590,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "proc-macro2", "quote", @@ -5599,7 +5600,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "assert_matches", "frame-benchmarking", @@ -5616,7 +5617,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5634,14 +5635,14 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", "frame-support", "frame-system", "log", - "pallet-election-provider-support-benchmarking 4.0.0-dev (git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges)", + "pallet-election-provider-support-benchmarking", "parity-scale-codec", "rand 0.7.3", "scale-info", @@ -5658,20 +5659,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#87f3fdea8f227d33322c439d45a9e1796637e972" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-system", - "parity-scale-codec", - "sp-npos-elections", - "sp-runtime", -] - -[[package]] -name = "pallet-election-provider-support-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5684,7 +5672,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5702,7 +5690,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5720,7 +5708,7 @@ dependencies = [ [[package]] name = "pallet-gilt" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5735,7 +5723,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5758,7 +5746,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5774,7 +5762,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5794,7 +5782,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5811,7 +5799,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5828,7 +5816,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "ckb-merkle-mountain-range", "frame-benchmarking", @@ -5846,7 +5834,7 @@ dependencies = [ [[package]] name = "pallet-mmr-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -5861,7 +5849,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5877,7 +5865,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -5894,7 +5882,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5914,7 +5902,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "sp-api", @@ -5924,7 +5912,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -5941,7 +5929,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5964,7 +5952,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5981,7 +5969,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -5996,7 +5984,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -6010,7 +5998,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6028,7 +6016,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6043,7 +6031,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6061,7 +6049,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6077,7 +6065,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -6098,7 +6086,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6114,7 +6102,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -6128,7 +6116,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6151,7 +6139,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6162,7 +6150,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "log", "sp-arithmetic", @@ -6171,7 +6159,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -6200,7 +6188,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6218,7 +6206,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6237,7 +6225,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-support", "frame-system", @@ -6253,7 +6241,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -6268,7 +6256,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -6279,7 +6267,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6296,7 +6284,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6311,7 +6299,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6327,7 +6315,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6342,7 +6330,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6392,23 +6380,6 @@ dependencies = [ "xcm-executor", ] -[[package]] -name = "pallet-xcm-benchmarks" -version = "0.9.31" -source = "git+https://github.com/paritytech/polkadot?branch=master#40aefb4ac396bcd098755c6d57dac7b284a343e7" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", - "xcm", - "xcm-executor", -] - [[package]] name = "parachain-info" version = "0.1.0" @@ -7561,7 +7532,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.31" -source = "git+https://github.com/paritytech/polkadot?branch=master#40aefb4ac396bcd098755c6d57dac7b284a343e7" +source = "git+https://github.com/paritytech//polkadot?branch=locked-for-gav-xcm-v3-and-bridges#9fc6b88ccc7abc1418ff5260e8cc492e647306a0" dependencies = [ "async-trait", "futures", @@ -7857,7 +7828,7 @@ dependencies = [ "pallet-collective", "pallet-democracy", "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking 4.0.0-dev (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-election-provider-support-benchmarking", "pallet-elections-phragmen", "pallet-fast-unstake", "pallet-grandpa", @@ -8172,7 +8143,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.31" -source = "git+https://github.com/paritytech/polkadot?branch=master#40aefb4ac396bcd098755c6d57dac7b284a343e7" +source = "git+https://github.com/paritytech//polkadot?branch=locked-for-gav-xcm-v3-and-bridges#9fc6b88ccc7abc1418ff5260e8cc492e647306a0" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -8249,7 +8220,7 @@ dependencies = [ "sp-transaction-pool", "sp-version", "substrate-wasm-builder", - "test-runtime-constants 0.9.31 (git+https://github.com/paritytech//polkadot?branch=locked-for-gav-xcm-v3-and-bridges)", + "test-runtime-constants", "xcm", "xcm-builder", "xcm-executor", @@ -8258,7 +8229,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.31" -source = "git+https://github.com/paritytech/polkadot?branch=master#40aefb4ac396bcd098755c6d57dac7b284a343e7" +source = "git+https://github.com/paritytech//polkadot?branch=locked-for-gav-xcm-v3-and-bridges#9fc6b88ccc7abc1418ff5260e8cc492e647306a0" dependencies = [ "frame-benchmarking", "frame-system", @@ -8304,7 +8275,7 @@ dependencies = [ "sp-state-machine", "substrate-test-client", "tempfile", - "test-runtime-constants 0.9.31 (git+https://github.com/paritytech/polkadot?branch=master)", + "test-runtime-constants", "tokio", "tracing-gum", ] @@ -8832,7 +8803,7 @@ checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "env_logger", "log", @@ -8999,7 +8970,7 @@ dependencies = [ "pallet-utility", "pallet-vesting", "pallet-xcm", - "pallet-xcm-benchmarks 0.9.31 (git+https://github.com/paritytech//polkadot?branch=locked-for-gav-xcm-v3-and-bridges)", + "pallet-xcm-benchmarks", "parity-scale-codec", "polkadot-parachain 0.9.31", "polkadot-primitives", @@ -9196,7 +9167,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "log", "sp-core", @@ -9207,7 +9178,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "futures", @@ -9234,7 +9205,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "futures", "futures-timer", @@ -9257,7 +9228,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -9273,7 +9244,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -9290,7 +9261,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9301,7 +9272,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "chrono", @@ -9341,7 +9312,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "fnv", "futures", @@ -9369,7 +9340,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "hash-db", "kvdb", @@ -9394,7 +9365,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "futures", @@ -9418,7 +9389,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "futures", @@ -9447,7 +9418,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "fork-tree", @@ -9489,7 +9460,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "futures", "jsonrpsee", @@ -9511,7 +9482,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "fork-tree", "parity-scale-codec", @@ -9524,7 +9495,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "futures", @@ -9548,7 +9519,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "lazy_static", "lru 0.7.8", @@ -9575,7 +9546,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "environmental", "parity-scale-codec", @@ -9591,7 +9562,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "log", "parity-scale-codec", @@ -9606,7 +9577,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "cfg-if 1.0.0", "libc", @@ -9626,7 +9597,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "ahash", "array-bytes", @@ -9667,7 +9638,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "finality-grandpa", "futures", @@ -9688,7 +9659,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "ansi_term", "futures", @@ -9705,7 +9676,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "async-trait", @@ -9720,7 +9691,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "async-trait", @@ -9767,7 +9738,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "cid", "futures", @@ -9787,7 +9758,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "bitflags", @@ -9813,7 +9784,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "ahash", "futures", @@ -9831,7 +9802,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "futures", @@ -9852,7 +9823,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "fork-tree", @@ -9882,7 +9853,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "futures", @@ -9901,7 +9872,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "bytes", @@ -9931,7 +9902,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "futures", "libp2p", @@ -9944,7 +9915,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -9953,7 +9924,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "futures", "hash-db", @@ -9983,7 +9954,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "futures", "jsonrpsee", @@ -10006,7 +9977,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "futures", "jsonrpsee", @@ -10019,7 +9990,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "futures", "hex", @@ -10038,7 +10009,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "directories", @@ -10109,7 +10080,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "log", "parity-scale-codec", @@ -10123,7 +10094,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -10142,7 +10113,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "futures", "libc", @@ -10161,7 +10132,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "chrono", "futures", @@ -10179,7 +10150,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "ansi_term", "atty", @@ -10210,7 +10181,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10221,7 +10192,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "futures", @@ -10248,7 +10219,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "futures", @@ -10262,7 +10233,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "futures", "futures-timer", @@ -10764,7 +10735,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "hash-db", "log", @@ -10782,7 +10753,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "blake2", "proc-macro-crate", @@ -10794,7 +10765,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "scale-info", @@ -10807,7 +10778,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "integer-sqrt", "num-traits", @@ -10822,7 +10793,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "scale-info", @@ -10835,7 +10806,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "parity-scale-codec", @@ -10847,7 +10818,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "sp-api", @@ -10859,7 +10830,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "futures", "log", @@ -10877,7 +10848,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "futures", @@ -10896,7 +10867,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "parity-scale-codec", @@ -10914,7 +10885,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "merlin", @@ -10937,7 +10908,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "scale-info", @@ -10951,7 +10922,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "scale-info", @@ -10964,7 +10935,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "base58", @@ -11010,7 +10981,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "blake2", "byteorder", @@ -11024,7 +10995,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "proc-macro2", "quote", @@ -11035,7 +11006,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -11044,7 +11015,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "proc-macro2", "quote", @@ -11054,7 +11025,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "environmental", "parity-scale-codec", @@ -11065,7 +11036,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "finality-grandpa", "log", @@ -11083,7 +11054,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -11097,7 +11068,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "bytes", "futures", @@ -11123,7 +11094,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "lazy_static", "sp-core", @@ -11134,7 +11105,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "futures", @@ -11151,7 +11122,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "thiserror", "zstd", @@ -11160,7 +11131,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "log", "parity-scale-codec", @@ -11176,7 +11147,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "scale-info", @@ -11190,7 +11161,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "sp-api", "sp-core", @@ -11200,7 +11171,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "backtrace", "lazy_static", @@ -11210,7 +11181,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "rustc-hash", "serde", @@ -11220,7 +11191,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "either", "hash256-std-hasher", @@ -11243,7 +11214,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -11261,7 +11232,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "Inflector", "proc-macro-crate", @@ -11273,7 +11244,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "log", "parity-scale-codec", @@ -11287,7 +11258,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#4e1e17cccd499dfe49e8c1bed01957953aa4c839" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "serde", "serde_json", @@ -11296,7 +11267,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "scale-info", @@ -11310,7 +11281,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "scale-info", @@ -11321,7 +11292,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "hash-db", "log", @@ -11343,12 +11314,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "impl-serde", "parity-scale-codec", @@ -11361,7 +11332,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "log", "sp-core", @@ -11374,7 +11345,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "futures-timer", @@ -11390,7 +11361,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "sp-std", @@ -11402,7 +11373,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "sp-api", "sp-runtime", @@ -11411,7 +11382,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "log", @@ -11427,7 +11398,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "ahash", "hash-db", @@ -11450,7 +11421,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "impl-serde", "parity-scale-codec", @@ -11467,7 +11438,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -11478,7 +11449,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "impl-trait-for-tuples", "log", @@ -11491,7 +11462,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -11580,7 +11551,7 @@ dependencies = [ "pallet-uniques", "pallet-utility", "pallet-xcm", - "pallet-xcm-benchmarks 0.9.31 (git+https://github.com/paritytech/polkadot?branch=master)", + "pallet-xcm-benchmarks", "parachain-info", "parachains-common", "parity-scale-codec", @@ -11644,7 +11615,7 @@ dependencies = [ "pallet-uniques", "pallet-utility", "pallet-xcm", - "pallet-xcm-benchmarks 0.9.31 (git+https://github.com/paritytech/polkadot?branch=master)", + "pallet-xcm-benchmarks", "parachain-info", "parachains-common", "parity-scale-codec", @@ -11787,7 +11758,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "platforms", ] @@ -11795,7 +11766,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -11816,7 +11787,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "futures-util", "hyper", @@ -11829,7 +11800,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "async-trait", "jsonrpsee", @@ -11842,7 +11813,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "jsonrpsee", "log", @@ -11863,7 +11834,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "array-bytes", "async-trait", @@ -11899,7 +11870,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#4e1e17cccd499dfe49e8c1bed01957953aa4c839" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11910,7 +11881,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "ansi_term", "build-helper", @@ -12027,18 +11998,6 @@ dependencies = [ "sp-runtime", ] -[[package]] -name = "test-runtime-constants" -version = "0.9.31" -source = "git+https://github.com/paritytech/polkadot?branch=master#40aefb4ac396bcd098755c6d57dac7b284a343e7" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-runtime", -] - [[package]] name = "textwrap" version = "0.15.1" @@ -12435,7 +12394,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" dependencies = [ "clap 4.0.18", "frame-try-runtime", @@ -13076,7 +13035,7 @@ dependencies = [ "pallet-collective", "pallet-democracy", "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking 4.0.0-dev (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-election-provider-support-benchmarking", "pallet-elections-phragmen", "pallet-fast-unstake", "pallet-grandpa", @@ -13107,7 +13066,7 @@ dependencies = [ "pallet-utility", "pallet-vesting", "pallet-xcm", - "pallet-xcm-benchmarks 0.9.31 (git+https://github.com/paritytech//polkadot?branch=locked-for-gav-xcm-v3-and-bridges)", + "pallet-xcm-benchmarks", "parity-scale-codec", "polkadot-parachain 0.9.31", "polkadot-primitives", @@ -13135,7 +13094,7 @@ dependencies = [ "sp-transaction-pool", "sp-version", "substrate-wasm-builder", - "westend-runtime-constants 0.9.31 (git+https://github.com/paritytech//polkadot?branch=locked-for-gav-xcm-v3-and-bridges)", + "westend-runtime-constants", "xcm", "xcm-builder", "xcm-executor", @@ -13153,18 +13112,6 @@ dependencies = [ "sp-runtime", ] -[[package]] -name = "westend-runtime-constants" -version = "0.9.31" -source = "git+https://github.com/paritytech/polkadot?branch=master#40aefb4ac396bcd098755c6d57dac7b284a343e7" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-runtime", -] - [[package]] name = "westmint-runtime" version = "1.0.0" @@ -13203,7 +13150,7 @@ dependencies = [ "pallet-uniques", "pallet-utility", "pallet-xcm", - "pallet-xcm-benchmarks 0.9.31 (git+https://github.com/paritytech/polkadot?branch=master)", + "pallet-xcm-benchmarks", "parachain-info", "parachains-common", "parity-scale-codec", @@ -13224,7 +13171,7 @@ dependencies = [ "sp-transaction-pool", "sp-version", "substrate-wasm-builder", - "westend-runtime-constants 0.9.31 (git+https://github.com/paritytech/polkadot?branch=master)", + "westend-runtime-constants", "xcm", "xcm-builder", "xcm-executor", @@ -13526,4 +13473,4 @@ dependencies = [ [[patch.unused]] name = "node-inspect" version = "0.9.0-dev" -source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges#87f3fdea8f227d33322c439d45a9e1796637e972" +source = "git+https://github.com/paritytech//substrate?branch=sv-locked-for-gav-xcm-v3-and-bridges-plus-assets#ab9809d10decf643925e06c82e70df30e2c4e42c" diff --git a/Cargo.toml b/Cargo.toml index 365ec722a6e..768a5d0f673 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,180 +61,192 @@ codegen-units = 1 # Once XCMv3 PR is merged, we may remove both Substrate and Polkadot patch section. [patch."https://github.com/paritytech/substrate"] -beefy-gadget = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -beefy-gadget-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -beefy-merkle-tree = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -beefy-primitives = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -fork-tree = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-benchmarking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-benchmarking-cli = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-election-provider-solution-type = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-election-provider-support = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-executive = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-support = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-support-procedural = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-support-procedural-tools = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-support-procedural-tools-derive = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-system = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-system-benchmarking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -frame-try-runtime = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -node-inspect = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-aura = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-authority-discovery = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-authorship = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-babe = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-bags-list = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-balances = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-beefy = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-beefy-mmr = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-bounties = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-child-bounties = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-collective = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-contracts = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-contracts-primitives = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-conviction-voting = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-democracy = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-election-provider-multi-phase = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-elections-phragmen = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-fast-unstake = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-gilt = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-grandpa = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-identity = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-im-online = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-indices = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-membership = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-mmr = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-mmr-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-multisig = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-nomination-pools = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-offences = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-preimage = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-proxy = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-randomness-collective-flip = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-ranked-collective = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-recovery = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-referenda = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-scheduler = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-session = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-society = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-staking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-staking-reward-curve = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-staking-reward-fn = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-sudo = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-timestamp = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-tips = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-transaction-payment = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-transaction-payment-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-treasury = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-utility = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-uniques = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-vesting = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -pallet-whitelist = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -remote-externalities = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-allocator = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-authority-discovery = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-basic-authorship = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-block-builder = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-chain-spec = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-chain-spec-derive = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-cli = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-client-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-client-db = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-consensus = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-consensus-aura = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-consensus-babe = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-consensus-babe-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-consensus-epochs = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-consensus-slots = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-executor = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-executor-common = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-executor-wasmi = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-executor-wasmtime = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-finality-grandpa = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-finality-grandpa-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-informant = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-keystore = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-network = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-network-common = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-network-gossip = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-network-light = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-network-sync = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-offchain = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-peerset = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-proposer-metrics = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-rpc-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-rpc-server = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-service = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-state-db = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-sync-state-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-sysinfo = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-telemetry = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-tracing = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-tracing-proc-macro = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-transaction-pool = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-transaction-pool-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sc-utils = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-api-proc-macro = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-application-crypto = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-arithmetic = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-authority-discovery = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-authorship = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-block-builder = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-blockchain = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-consensus = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-consensus-aura = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-consensus-babe = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-consensus-slots = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-consensus-vrf = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-core = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-core-hashing = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-core-hashing-proc-macro = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-database = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-debug-derive = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-externalities = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-finality-grandpa = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-inherents = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-io = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-keyring = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-keystore = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-maybe-compressed-blob = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-mmr-primitives = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-npos-elections = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-offchain = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-panic-handler = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-runtime = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-runtime-interface = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-runtime-interface-proc-macro = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-session = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-staking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-state-machine = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-std = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-storage = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-tasks = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-timestamp = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-tracing = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-transaction-pool = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-transaction-storage-proof = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-trie = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-version = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-version-proc-macro = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -sp-wasm-interface = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -substrate-build-script-utils = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -substrate-frame-rpc-system = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -substrate-prometheus-endpoint = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -substrate-state-trie-migration-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -substrate-wasm-builder = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } -try-runtime-cli = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges" } +beefy-gadget = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +beefy-gadget-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +beefy-merkle-tree = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +beefy-primitives = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +fork-tree = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-benchmarking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-benchmarking-cli = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-election-provider-solution-type = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-election-provider-support = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-executive = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-support = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-support-procedural = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-support-procedural-tools = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-support-procedural-tools-derive = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-system = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-system-benchmarking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +frame-try-runtime = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +node-inspect = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-alliance = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-asset-tx-payment = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-assets = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-aura = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-authority-discovery = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-authorship = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-babe = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-bags-list = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-balances = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-beefy = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-beefy-mmr = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-bounties = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-child-bounties = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-collective = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-contracts = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-contracts-primitives = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-conviction-voting = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-democracy = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-election-provider-multi-phase = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-election-provider-support-benchmarking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-elections-phragmen = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-fast-unstake = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-gilt = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-grandpa = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-identity = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-im-online = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-indices = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-membership = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-mmr = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-mmr-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-multisig = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-nomination-pools = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-offences = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-offences-benchmarking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-session-benchmarking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-preimage = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-proxy = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-ranked-collective = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-recovery = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-referenda = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-scheduler = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-session = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-society = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-staking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-staking-reward-curve = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-staking-reward-fn = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-sudo = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-timestamp = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-tips = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-transaction-payment = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-transaction-payment-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-treasury = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-utility = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-uniques = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-vesting = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +pallet-whitelist = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +remote-externalities = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-allocator = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-authority-discovery = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-basic-authorship = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-block-builder = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-chain-spec = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-chain-spec-derive = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-cli = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-client-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-client-db = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-consensus = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-consensus-aura = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-consensus-babe = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-consensus-babe-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-consensus-epochs = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-consensus-slots = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-executor = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-executor-common = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-executor-wasmi = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-executor-wasmtime = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-finality-grandpa = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-finality-grandpa-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-informant = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-keystore = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-network = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-network-common = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-network-gossip = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-network-light = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-network-sync = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-offchain = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-peerset = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-proposer-metrics = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-rpc-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-rpc-server = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-service = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-state-db = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-sync-state-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-sysinfo = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-telemetry = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-tracing = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-tracing-proc-macro = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-transaction-pool = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-transaction-pool-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sc-utils = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-api = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-api-proc-macro = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-application-crypto = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets", version="6.0.0"} +sp-arithmetic = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-authority-discovery = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-authorship = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-block-builder = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-blockchain = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-consensus = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-consensus-aura = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-consensus-babe = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-consensus-slots = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-consensus-vrf = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-core = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets", version="6.0.0" } +sp-core-hashing = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-core-hashing-proc-macro = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-database = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-debug-derive = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-externalities = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-finality-grandpa = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-inherents = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-io = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-keyring = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-keystore = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-maybe-compressed-blob = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-mmr-primitives = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-npos-elections = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-offchain = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-panic-handler = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-runtime = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets", version="6.0.0"} +sp-runtime-interface = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-runtime-interface-proc-macro = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-session = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-staking = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-state-machine = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-std = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-storage = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-tasks = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-timestamp = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-tracing = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-transaction-pool = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-transaction-storage-proof = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-trie = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets", version="6.0.0" } +sp-version = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-version-proc-macro = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-wasm-interface = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +substrate-build-script-utils = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +substrate-frame-rpc-system = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +substrate-prometheus-endpoint = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +substrate-state-trie-migration-rpc = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +substrate-wasm-builder = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +try-runtime-cli = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-weights = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +substrate-test-client = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +substrate-test-utils-derive = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } +sp-serializer = { git = "https://github.com/paritytech//substrate", branch = "sv-locked-for-gav-xcm-v3-and-bridges-plus-assets" } [patch."https://github.com/paritytech/polkadot"] kusama-runtime = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } kusama-runtime-constants = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } +westend-runtime-constants = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } pallet-xcm = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } polkadot-approval-distribution = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } polkadot-availability-bitfield-distribution = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } @@ -290,3 +302,7 @@ xcm = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-ga xcm-builder = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } xcm-executor = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } xcm-procedural = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } +polkadot-node-subsystem-test-helpers = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } +polkadot-test-client = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } +polkadot-test-service = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } +pallet-xcm-benchmarks = { git = "https://github.com/paritytech//polkadot", branch = "locked-for-gav-xcm-v3-and-bridges" } From 5f7f8c2a01bd74ca5e346142c6daf181c7110573 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Tue, 22 Nov 2022 21:24:25 +0100 Subject: [PATCH 012/339] statemine progress --- .../runtimes/assets/statemine/src/lib.rs | 63 +++++++++++++------ .../assets/statemine/src/xcm_config.rs | 27 ++++---- .../runtimes/assets/statemint/src/lib.rs | 3 + .../runtimes/assets/westmint/src/lib.rs | 16 ++++- 4 files changed, 76 insertions(+), 33 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index a30fb2e3278..4e1b20bb822 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -228,11 +228,13 @@ parameter_types! { pub type AssetsForceOrigin = EitherOfDiverse, EnsureXcm>>; -impl pallet_assets::Config for Runtime { +pub type TrustBackedAssetsInstance = pallet_assets::Instance1; +impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type AssetId = AssetId; type Currency = Balances; + type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = AssetsForceOrigin; type AssetDeposit = AssetDeposit; type MetadataDepositBase = MetadataDepositBase; @@ -243,6 +245,8 @@ impl pallet_assets::Config for Runtime { type Extra = (); type WeightInfo = weights::pallet_assets::WeightInfo; type AssetAccountDeposit = AssetAccountDeposit; + #[cfg(feature = "runtime-benchmarks")] + type Helper = (); } parameter_types! { @@ -317,6 +321,7 @@ impl Default for ProxyType { Self::Any } } +type TrustBackedAssetsCall = pallet_assets::Call; impl InstanceFilter for ProxyType { fn filter(&self, c: &RuntimeCall) -> bool { match self { @@ -324,7 +329,7 @@ impl InstanceFilter for ProxyType { ProxyType::NonTransfer => !matches!( c, RuntimeCall::Balances { .. } | - RuntimeCall::Assets { .. } | + RuntimeCall::TrustBackedAssets { .. } | RuntimeCall::Uniques { .. } ), ProxyType::CancelProxy => matches!( @@ -336,7 +341,7 @@ impl InstanceFilter for ProxyType { ProxyType::Assets => { matches!( c, - RuntimeCall::Assets { .. } | + RuntimeCall::TrustBackedAssets { .. } | RuntimeCall::Utility { .. } | RuntimeCall::Multisig { .. } | RuntimeCall::Uniques { .. } @@ -344,12 +349,13 @@ impl InstanceFilter for ProxyType { }, ProxyType::AssetOwner => matches!( c, - RuntimeCall::Assets(pallet_assets::Call::create { .. }) | - RuntimeCall::Assets(pallet_assets::Call::destroy { .. }) | - RuntimeCall::Assets(pallet_assets::Call::transfer_ownership { .. }) | - RuntimeCall::Assets(pallet_assets::Call::set_team { .. }) | - RuntimeCall::Assets(pallet_assets::Call::set_metadata { .. }) | - RuntimeCall::Assets(pallet_assets::Call::clear_metadata { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::create { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::destroy { .. }) | + RuntimeCall::TrustBackedAssets( + TrustBackedAssetsCall::transfer_ownership { .. } + ) | RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_metadata { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | @@ -366,12 +372,12 @@ impl InstanceFilter for ProxyType { ), ProxyType::AssetManager => matches!( c, - RuntimeCall::Assets(pallet_assets::Call::mint { .. }) | - RuntimeCall::Assets(pallet_assets::Call::burn { .. }) | - RuntimeCall::Assets(pallet_assets::Call::freeze { .. }) | - RuntimeCall::Assets(pallet_assets::Call::thaw { .. }) | - RuntimeCall::Assets(pallet_assets::Call::freeze_asset { .. }) | - RuntimeCall::Assets(pallet_assets::Call::thaw_asset { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::mint { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::burn { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze_asset { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw_asset { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | @@ -516,9 +522,17 @@ impl pallet_collator_selection::Config for Runtime { impl pallet_asset_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type Fungibles = Assets; + // TODO https://github.com/paritytech/substrate/issues/12724 + // This should be able to take assets from any pallet instance. For now we only allow + // sufficient, trust backed assets to pay for transaction fees. + type Fungibles = TrustBackedAssets; type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< - pallet_assets::BalanceToAssetBalance, + pallet_assets::BalanceToAssetBalance< + Balances, + Runtime, + ConvertInto, + TrustBackedAssetsInstance, + >, AssetsToBlockAuthor, >; } @@ -595,7 +609,7 @@ construct_runtime!( Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, // The main stage. - Assets: pallet_assets::{Pallet, Call, Storage, Event} = 50, + TrustBackedAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, } ); @@ -631,9 +645,18 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, - (), + MigrateAssetsPallet, >; +pub struct MigrateAssetsPallet; +impl frame_support::traits::OnRuntimeUpgrade for MigrateAssetsPallet { + fn on_runtime_upgrade() -> Weight { + use frame_support::storage::migration; + migration::move_pallet(b"Assets", b"TrustBackedAssets"); + ::DbWeight::get().writes(1) + } +} + #[cfg(feature = "runtime-benchmarks")] #[macro_use] extern crate frame_benchmarking; @@ -642,7 +665,7 @@ extern crate frame_benchmarking; mod benches { define_benchmarks!( [frame_system, SystemBench::] - [pallet_assets, Assets] + [pallet_assets, TrustBackedAssets] [pallet_balances, Balances] [pallet_multisig, Multisig] [pallet_proxy, Proxy] diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 4841ee7c518..6ee9044d8fd 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -14,9 +14,9 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, AssetId, Assets, Authorship, Balance, Balances, ParachainInfo, - ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, - XcmpQueue, + AccountId, AllPalletsWithSystem, AssetId, Authorship, Balance, Balances, ParachainInfo, + ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + TrustBackedAssets, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, @@ -48,8 +48,8 @@ parameter_types! { pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); pub const Local: MultiLocation = Here.into_location(); - pub AssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); + pub TrustBackedAssetsPalletLocation: MultiLocation = + PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } @@ -82,12 +82,12 @@ pub type CurrencyTransactor = CurrencyAdapter< /// Means for transacting assets besides the native currency on this chain. pub type FungiblesTransactor = FungiblesAdapter< // Use this fungibles implementation: - Assets, + TrustBackedAssets, // Use this currency when it is a fungible asset matching the given location or name: ConvertedConcreteId< AssetId, Balance, - AsPrefixedGeneralIndex, + AsPrefixedGeneralIndex, JustTry, >, // Convert an XCM MultiLocation into a local account id: @@ -96,7 +96,7 @@ pub type FungiblesTransactor = FungiblesAdapter< AccountId, // We only want to allow teleports of known assets. We use non-zero issuance as an indication // that this asset is known. - parachains_common::impls::NonZeroIssuance, + parachains_common::impls::NonZeroIssuance, // The account to use for tracking teleports. CheckingAccount, >; @@ -183,15 +183,20 @@ impl xcm_executor::Config for XcmConfig { AssetFeeAsExistentialDepositMultiplier< Runtime, WeightToFee, - pallet_assets::BalanceToAssetBalance, + pallet_assets::BalanceToAssetBalance< + Balances, + Runtime, + ConvertInto, + TrustBackedAssetsInstance, + >, >, ConvertedConcreteId< AssetId, Balance, - AsPrefixedGeneralIndex, + AsPrefixedGeneralIndex, JustTry, >, - Assets, + TrustBackedAssets, cumulus_primitives_utility::XcmFeesTo32ByteAccount< FungiblesTransactor, AccountId, diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index 8c96c4268f3..c2683aaab8a 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -263,6 +263,7 @@ impl pallet_assets::Config for Runtime { type Balance = Balance; type AssetId = AssetId; type Currency = Balances; + type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = AssetsForceOrigin; type AssetDeposit = AssetDeposit; type MetadataDepositBase = MetadataDepositBase; @@ -273,6 +274,8 @@ impl pallet_assets::Config for Runtime { type Extra = (); type WeightInfo = weights::pallet_assets::WeightInfo; type AssetAccountDeposit = AssetAccountDeposit; + #[cfg(feature = "runtime-benchmarks")] + type Helper = (); } parameter_types! { diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index b58baf30779..0f1f7c17a55 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -245,6 +245,8 @@ impl pallet_assets::Config for Runtime { type Extra = (); type WeightInfo = weights::pallet_assets::WeightInfo; type AssetAccountDeposit = AssetAccountDeposit; + #[cfg(feature = "runtime-benchmarks")] + type Helper = (); } /// Assets managed by some foreign location. @@ -252,7 +254,6 @@ type ForeignAssetsInstance = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; - // TODO: need HasCompact for MultiLocation type AssetId = AssetId; // MultiLocationForAssetId; type Currency = Balances; type CreateOrigin = AsEnsureOriginWithArg>; // ForeignCreators; @@ -266,6 +267,8 @@ impl pallet_assets::Config for Runtime { type Extra = (); type WeightInfo = weights::pallet_assets::WeightInfo; type AssetAccountDeposit = AssetAccountDeposit; + #[cfg(feature = "runtime-benchmarks")] + type Helper = (); } parameter_types! { @@ -663,9 +666,18 @@ pub type Executive = frame_executive::Executive< // TODO // 1. Move this instance https://substrate.stackexchange.com/questions/4343/how-to-migrate-storage-from-a-default-pallet-instance-to-an-actual-one // 2. Make sure this migration applies to the old instance - (), //pallet_assets::migration::v1::MigrateToV1, + MigrateAssetsPallet, //pallet_assets::migration::v1::MigrateToV1, >; +pub struct MigrateAssetsPallet; +impl frame_support::traits::OnRuntimeUpgrade for MigrateAssetsPallet { + fn on_runtime_upgrade() -> Weight { + use frame_support::storage::migration; + migration::move_pallet(b"Assets", b"TrustBackedAssets"); + ::DbWeight::get().writes(1) + } +} + #[cfg(feature = "runtime-benchmarks")] #[macro_use] extern crate frame_benchmarking; From e8afde4bfa753ac382229eb6c918fbd257cc486e Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Tue, 22 Nov 2022 21:29:04 +0100 Subject: [PATCH 013/339] ForeignCreators :tada: --- parachains/runtimes/assets/westmint/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 0f1f7c17a55..0b4c55f0ae8 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -254,9 +254,9 @@ type ForeignAssetsInstance = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; - type AssetId = AssetId; // MultiLocationForAssetId; + type AssetId = MultiLocationForAssetId; type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; // ForeignCreators; + type CreateOrigin = ForeignCreators; type ForceOrigin = AssetsForceOrigin; type AssetDeposit = AssetDeposit; type MetadataDepositBase = MetadataDepositBase; From e569b68889e2ce8f081ac3211613d937d10d7bb8 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Wed, 30 Nov 2022 21:48:20 +0100 Subject: [PATCH 014/339] fix AssetFeeAsExistentialDepositMultiplier --- parachains/common/src/xcm_config.rs | 27 ++++++++++--------- .../assets/statemine/src/xcm_config.rs | 1 + .../runtimes/assets/westmint/src/lib.rs | 13 +++++++++ .../assets/westmint/src/xcm_config.rs | 1 + parachains/runtimes/testing/penpal/src/lib.rs | 5 ++-- .../testing/rococo-parachain/src/lib.rs | 5 ++-- 6 files changed, 35 insertions(+), 17 deletions(-) diff --git a/parachains/common/src/xcm_config.rs b/parachains/common/src/xcm_config.rs index 702065d05e9..bcf7e3b118e 100644 --- a/parachains/common/src/xcm_config.rs +++ b/parachains/common/src/xcm_config.rs @@ -76,34 +76,35 @@ impl ShouldExecute for DenyReserveTransferToRelayChain { /// A `ChargeFeeInFungibles` implementation that converts the output of /// a given WeightToFee implementation an amount charged in /// a particular assetId from pallet-assets -pub struct AssetFeeAsExistentialDepositMultiplier( - PhantomData<(Runtime, WeightToFee, BalanceConverter)>, -); -impl +pub struct AssetFeeAsExistentialDepositMultiplier< + Runtime, + WeightToFee, + BalanceConverter, + AssetInstance: 'static, +>(PhantomData<(Runtime, WeightToFee, BalanceConverter, AssetInstance)>); +impl cumulus_primitives_utility::ChargeWeightInFungibles< AccountIdOf, - pallet_assets::Pallet, - > for AssetFeeAsExistentialDepositMultiplier + pallet_assets::Pallet, + > for AssetFeeAsExistentialDepositMultiplier where - Runtime: pallet_assets::Config, + Runtime: pallet_assets::Config, WeightToFee: WeightToFeePolynomial, BalanceConverter: BalanceConversion< CurrencyBalance, - >::AssetId, - >::Balance, + >::AssetId, + >::Balance, >, AccountIdOf: From + Into, { fn charge_weight_in_fungibles( - asset_id: as Inspect< + asset_id: as Inspect< AccountIdOf, >>::AssetId, weight: Weight, ) -> Result< - as Inspect< - AccountIdOf, - >>::Balance, + as Inspect>>::Balance, XcmError, > { let amount = WeightToFee::weight_to_fee(&weight); diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 6ee9044d8fd..e23808d7170 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -189,6 +189,7 @@ impl xcm_executor::Config for XcmConfig { ConvertInto, TrustBackedAssetsInstance, >, + TrustBackedAssetsInstance, >, ConvertedConcreteId< AssetId, diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 0b4c55f0ae8..6aed43eb88f 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -249,6 +249,19 @@ impl pallet_assets::Config for Runtime { type Helper = (); } +// This is frustrating... +// use pallet_assets::BenchmarkHelper; +// pub struct XcmBenchmarkHelper; +// #[cfg(feature = "runtime-benchmarks")] +// impl> BenchmarkHelper for XcmBenchmarkHelper { +// fn create_asset_id(id: u32) -> AssetId { +// match id { +// x => MultiLocationForAssetId { parents: 1, interior: X1(Parachain(x)) }, +// _ => MultiLocationForAssetId { parents: 0, interior: Here }, +// } +// } +// } + /// Assets managed by some foreign location. type ForeignAssetsInstance = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 3c396c95e0d..62a70c6535a 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -189,6 +189,7 @@ impl xcm_executor::Config for XcmConfig { ConvertInto, TrustBackedAssetsInstance, >, + TrustBackedAssetsInstance, >, ConvertedConcreteId< AssetId, diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index 48d40c3008c..067d2713e31 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -35,7 +35,7 @@ use frame_support::{ construct_runtime, dispatch::DispatchClass, parameter_types, - traits::Everything, + traits::{AsEnsureOriginWithArg, Everything}, weights::{ constants::WEIGHT_PER_SECOND, ConstantMultiplier, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial, @@ -44,7 +44,7 @@ use frame_support::{ }; use frame_system::{ limits::{BlockLength, BlockWeights}, - EnsureRoot, + EnsureRoot, EnsureSigned, }; use smallvec::smallvec; use sp_api::impl_runtime_apis; @@ -398,6 +398,7 @@ impl pallet_assets::Config for Runtime { type Balance = Balance; type AssetId = AssetId; type Currency = Balances; + type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = EnsureRoot; type AssetDeposit = AssetDeposit; type MetadataDepositBase = MetadataDepositBase; diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index c854c7b0a01..3f7642bbd62 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -42,7 +42,7 @@ pub use frame_support::{ construct_runtime, dispatch::DispatchClass, match_types, parameter_types, - traits::{EitherOfDiverse, Everything, IsInVec, Randomness}, + traits::{AsEnsureOriginWithArg, EitherOfDiverse, Everything, IsInVec, Randomness}, weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, ConstantMultiplier, IdentityFee, Weight, @@ -51,7 +51,7 @@ pub use frame_support::{ }; use frame_system::{ limits::{BlockLength, BlockWeights}, - EnsureRoot, + EnsureRoot, EnsureSigned, }; pub use pallet_balances::Call as BalancesCall; pub use pallet_timestamp::Call as TimestampCall; @@ -513,6 +513,7 @@ impl pallet_assets::Config for Runtime { type Balance = u64; type AssetId = AssetId; type Currency = Balances; + type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = AdminOrigin; type AssetDeposit = AssetDeposit; type MetadataDepositBase = MetadataDepositBase; From c4875867e0556a604804a5d58611d070712f98cd Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Wed, 30 Nov 2022 22:04:20 +0100 Subject: [PATCH 015/339] no default instance --- parachains/common/src/impls.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parachains/common/src/impls.rs b/parachains/common/src/impls.rs index 87edb28d9f8..91112cdae92 100644 --- a/parachains/common/src/impls.rs +++ b/parachains/common/src/impls.rs @@ -71,7 +71,7 @@ where /// A `HandleCredit` implementation that naively transfers the fees to the block author. /// Will drop and burn the assets in case the transfer fails. -pub struct AssetsToBlockAuthor(PhantomData<(R, I)>); +pub struct AssetsToBlockAuthor(PhantomData<(R, I)>); impl HandleCredit, pallet_assets::Pallet> for AssetsToBlockAuthor where I: 'static, From 4191a4dffc6c8329d7ba026c5fee6d64aea8e128 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Thu, 1 Dec 2022 08:42:51 +0100 Subject: [PATCH 016/339] instantiate statemint --- parachains/common/src/impls.rs | 2 +- .../runtimes/assets/statemine/src/lib.rs | 4 +- .../runtimes/assets/statemint/src/lib.rs | 56 ++++++++++++------- .../assets/statemint/src/xcm_config.rs | 16 +++--- .../runtimes/assets/westmint/src/lib.rs | 19 +------ .../assets/westmint/src/xcm_config.rs | 10 ++++ 6 files changed, 61 insertions(+), 46 deletions(-) diff --git a/parachains/common/src/impls.rs b/parachains/common/src/impls.rs index 91112cdae92..880a59c78c4 100644 --- a/parachains/common/src/impls.rs +++ b/parachains/common/src/impls.rs @@ -72,7 +72,7 @@ where /// A `HandleCredit` implementation that naively transfers the fees to the block author. /// Will drop and burn the assets in case the transfer fails. pub struct AssetsToBlockAuthor(PhantomData<(R, I)>); -impl HandleCredit, pallet_assets::Pallet> for AssetsToBlockAuthor +impl HandleCredit, pallet_assets::Pallet> for AssetsToBlockAuthor where I: 'static, R: pallet_authorship::Config + pallet_assets::Config, diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 4e1b20bb822..2a2e1fce7cc 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -321,7 +321,7 @@ impl Default for ProxyType { Self::Any } } -type TrustBackedAssetsCall = pallet_assets::Call; +type TrustBackedAssetsCall = pallet_assets::Call; impl InstanceFilter for ProxyType { fn filter(&self, c: &RuntimeCall) -> bool { match self { @@ -533,7 +533,7 @@ impl pallet_asset_tx_payment::Config for Runtime { ConvertInto, TrustBackedAssetsInstance, >, - AssetsToBlockAuthor, + AssetsToBlockAuthor, >; } diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index c2683aaab8a..4f039309ddf 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -258,7 +258,9 @@ parameter_types! { pub type AssetsForceOrigin = EitherOfDiverse, EnsureXcm>>; -impl pallet_assets::Config for Runtime { +pub type TrustBackedAssetsInstance = pallet_assets::Instance1; +type TrustBackedAssetsCall = pallet_assets::Call; +impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type AssetId = AssetId; @@ -357,7 +359,7 @@ impl InstanceFilter for ProxyType { ProxyType::NonTransfer => !matches!( c, RuntimeCall::Balances { .. } | - RuntimeCall::Assets { .. } | + RuntimeCall::TrustBackedAssets { .. } | RuntimeCall::Uniques { .. } ), ProxyType::CancelProxy => matches!( @@ -369,7 +371,7 @@ impl InstanceFilter for ProxyType { ProxyType::Assets => { matches!( c, - RuntimeCall::Assets { .. } | + RuntimeCall::TrustBackedAssets { .. } | RuntimeCall::Utility { .. } | RuntimeCall::Multisig { .. } | RuntimeCall::Uniques { .. } @@ -377,12 +379,13 @@ impl InstanceFilter for ProxyType { }, ProxyType::AssetOwner => matches!( c, - RuntimeCall::Assets(pallet_assets::Call::create { .. }) | - RuntimeCall::Assets(pallet_assets::Call::destroy { .. }) | - RuntimeCall::Assets(pallet_assets::Call::transfer_ownership { .. }) | - RuntimeCall::Assets(pallet_assets::Call::set_team { .. }) | - RuntimeCall::Assets(pallet_assets::Call::set_metadata { .. }) | - RuntimeCall::Assets(pallet_assets::Call::clear_metadata { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::create { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::destroy { .. }) | + RuntimeCall::TrustBackedAssets( + TrustBackedAssetsCall::transfer_ownership { .. } + ) | RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_metadata { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | @@ -399,12 +402,12 @@ impl InstanceFilter for ProxyType { ), ProxyType::AssetManager => matches!( c, - RuntimeCall::Assets(pallet_assets::Call::mint { .. }) | - RuntimeCall::Assets(pallet_assets::Call::burn { .. }) | - RuntimeCall::Assets(pallet_assets::Call::freeze { .. }) | - RuntimeCall::Assets(pallet_assets::Call::thaw { .. }) | - RuntimeCall::Assets(pallet_assets::Call::freeze_asset { .. }) | - RuntimeCall::Assets(pallet_assets::Call::thaw_asset { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::mint { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::burn { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze_asset { .. }) | + RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw_asset { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | @@ -549,10 +552,15 @@ impl pallet_collator_selection::Config for Runtime { impl pallet_asset_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type Fungibles = Assets; + type Fungibles = TrustBackedAssets; type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< - pallet_assets::BalanceToAssetBalance, - AssetsToBlockAuthor, + pallet_assets::BalanceToAssetBalance< + Balances, + Runtime, + ConvertInto, + TrustBackedAssetsInstance, + >, + AssetsToBlockAuthor, >; } @@ -628,7 +636,7 @@ construct_runtime!( Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, // The main stage. - Assets: pallet_assets::{Pallet, Call, Storage, Event} = 50, + TrustBackedAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, } ); @@ -664,8 +672,18 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, + MigrateAssetsPallet, >; +pub struct MigrateAssetsPallet; +impl frame_support::traits::OnRuntimeUpgrade for MigrateAssetsPallet { + fn on_runtime_upgrade() -> Weight { + use frame_support::storage::migration; + migration::move_pallet(b"Assets", b"TrustBackedAssets"); + ::DbWeight::get().writes(1) + } +} + #[cfg(feature = "runtime-benchmarks")] #[macro_use] extern crate frame_benchmarking; diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index bb9d82680fe..5f8d419c446 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -14,9 +14,9 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, AssetId, Assets, Authorship, Balance, Balances, ParachainInfo, - ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, - XcmpQueue, + AccountId, AllPalletsWithSystem, AssetId, Authorship, Balance, Balances, ParachainInfo, + ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + TrustBackedAssets, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, @@ -45,8 +45,8 @@ parameter_types! { pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); pub const Local: MultiLocation = MultiLocation::here(); - pub AssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); + pub TrustBackedAssetsPalletLocation: MultiLocation = + PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } @@ -79,12 +79,12 @@ pub type CurrencyTransactor = CurrencyAdapter< /// Means for transacting assets besides the native currency on this chain. pub type FungiblesTransactor = FungiblesAdapter< // Use this fungibles implementation: - Assets, + TrustBackedAssets, // Use this currency when it is a fungible asset matching the given location or name: ConvertedConcreteId< AssetId, Balance, - AsPrefixedGeneralIndex, + AsPrefixedGeneralIndex, JustTry, >, // Convert an XCM MultiLocation into a local account id: @@ -93,7 +93,7 @@ pub type FungiblesTransactor = FungiblesAdapter< AccountId, // We only want to allow teleports of known assets. We use non-zero issuance as an indication // that this asset is known. - parachains_common::impls::NonZeroIssuance, + parachains_common::impls::NonZeroIssuance, // The account to use for tracking teleports. CheckingAccount, >; diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 6aed43eb88f..d446d4807da 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -249,19 +249,6 @@ impl pallet_assets::Config for Runtime { type Helper = (); } -// This is frustrating... -// use pallet_assets::BenchmarkHelper; -// pub struct XcmBenchmarkHelper; -// #[cfg(feature = "runtime-benchmarks")] -// impl> BenchmarkHelper for XcmBenchmarkHelper { -// fn create_asset_id(id: u32) -> AssetId { -// match id { -// x => MultiLocationForAssetId { parents: 1, interior: X1(Parachain(x)) }, -// _ => MultiLocationForAssetId { parents: 0, interior: Here }, -// } -// } -// } - /// Assets managed by some foreign location. type ForeignAssetsInstance = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { @@ -281,7 +268,7 @@ impl pallet_assets::Config for Runtime { type WeightInfo = weights::pallet_assets::WeightInfo; type AssetAccountDeposit = AssetAccountDeposit; #[cfg(feature = "runtime-benchmarks")] - type Helper = (); + type Helper = (); //XcmBenchmarkHelper; } parameter_types! { @@ -356,7 +343,7 @@ impl Default for ProxyType { Self::Any } } -type TrustBackedAssetsCall = pallet_assets::Call; +type TrustBackedAssetsCall = pallet_assets::Call; impl InstanceFilter for ProxyType { fn filter(&self, c: &RuntimeCall) -> bool { match self { @@ -563,7 +550,7 @@ impl pallet_asset_tx_payment::Config for Runtime { ConvertInto, TrustBackedAssetsInstance, >, - AssetsToBlockAuthor, + AssetsToBlockAuthor, >; } diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 62a70c6535a..fee07a16433 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -57,6 +57,16 @@ parameter_types! { pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } +// This is frustrating... +// use pallet_assets::BenchmarkHelper; +// pub struct XcmBenchmarkHelper; +// #[cfg(feature = "runtime-benchmarks")] +// impl> BenchmarkHelper for XcmBenchmarkHelper { +// fn create_asset_id(id: u32) -> MultiLocation { +// (Parent, Parachain(id)).into() +// } +// } + /// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. From d9d5a9dd0b05d7a6a653e44f6e6f1be60cc6f4d9 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 22 Dec 2022 12:47:42 +0100 Subject: [PATCH 017/339] compile tests --- parachains/runtimes/assets/statemine/tests/tests.rs | 6 ++++-- parachains/runtimes/assets/westmint/tests/tests.rs | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index 974f89ec1ee..ab2d2e80620 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -6,13 +6,15 @@ use frame_support::{ }; use parachains_common::{AccountId, AuraId}; pub use statemine_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, Assets, Balances, ExistentialDeposit, - Runtime, SessionKeys, System, + constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, Runtime, + SessionKeys, System, TrustBackedAssets, }; use xcm::latest::prelude::*; use xcm_executor::traits::WeightTrader; pub const ALICE: [u8; 32] = [1u8; 32]; +type Assets = TrustBackedAssets; + #[test] fn test_asset_xcm_trader() { ExtBuilder::::default() diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 1bd8f7c5ec8..482a60d3b59 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -6,14 +6,16 @@ use frame_support::{ }; use parachains_common::{AccountId, AuraId}; pub use westmint_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, Assets, Balances, ExistentialDeposit, - Runtime, SessionKeys, System, + constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, Runtime, + SessionKeys, System, TrustBackedAssets, }; use xcm::latest::prelude::*; use xcm_executor::traits::WeightTrader; pub const ALICE: [u8; 32] = [1u8; 32]; +type Assets = TrustBackedAssets; + #[test] fn test_asset_xcm_trader() { ExtBuilder::::default() From 4a9dec9d7e19881dddfbd087f896b49fde908de3 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 11 Nov 2022 11:29:20 +0100 Subject: [PATCH 018/339] Init of pallet with `transfer_asset_via_bridge` call Init of pallet with `transfer_asset_via_bridge` call Init of pallet with `transfer_asset_via_bridge` call - setup basic tests --- Cargo.lock | 17 + Cargo.toml | 1 + .../pallets/bridge-assets-transfer/Cargo.toml | 40 ++ .../pallets/bridge-assets-transfer/src/lib.rs | 385 ++++++++++++++++++ .../runtimes/assets/statemine/Cargo.toml | 2 + .../runtimes/assets/statemine/src/lib.rs | 11 +- .../assets/statemine/src/xcm_config.rs | 21 +- 7 files changed, 472 insertions(+), 5 deletions(-) create mode 100644 parachains/pallets/bridge-assets-transfer/Cargo.toml create mode 100644 parachains/pallets/bridge-assets-transfer/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index ed7176dcda1..5cc63dd432f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -713,6 +713,22 @@ dependencies = [ "thiserror", ] +[[package]] +name = "bridge-assets-transfer" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", + "sp-version", + "xcm", + "xcm-builder", +] + [[package]] name = "bs58" version = "0.4.0" @@ -11517,6 +11533,7 @@ name = "statemine-runtime" version = "2.0.0" dependencies = [ "asset-test-utils", + "bridge-assets-transfer", "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", diff --git a/Cargo.toml b/Cargo.toml index 768a5d0f673..c12925ed25a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,7 @@ members = [ "primitives/utility", "polkadot-parachain", "parachains/common", + "parachains/pallets/bridge-assets-transfer", "parachains/pallets/parachain-info", "parachains/pallets/ping", "parachains/runtimes/testing/rococo-parachain", diff --git a/parachains/pallets/bridge-assets-transfer/Cargo.toml b/parachains/pallets/bridge-assets-transfer/Cargo.toml new file mode 100644 index 00000000000..08b0f58a210 --- /dev/null +++ b/parachains/pallets/bridge-assets-transfer/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "bridge-assets-transfer" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "Apache-2.0" +homepage = "https://docs.substrate.io/" +repository = "https://github.com/paritytech/cumulus/" +description = "Pallet message transfers through bridges" +readme = "README.md" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.3.0", default-features = false, features = ["derive"] } +log = { version = "0.4.14", default-features = false } + +# Substrate +sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + +# Polkadot +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } + +[dev-dependencies] +sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", branch = "master" } + +[features] +default = ["std"] +std = [ + "codec/std", + "scale-info/std", + "sp-std/std", + "sp-runtime/std", + "frame-support/std", + "frame-system/std", + "xcm/std", +] diff --git a/parachains/pallets/bridge-assets-transfer/src/lib.rs b/parachains/pallets/bridge-assets-transfer/src/lib.rs new file mode 100644 index 00000000000..c4b3ecb48ca --- /dev/null +++ b/parachains/pallets/bridge-assets-transfer/src/lib.rs @@ -0,0 +1,385 @@ +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! # Bridge Asset Transfer Pallet +//! +//! A utility which could help move assets through bridges, e.g. move assets between different global consensus... + +// Ensure we're `no_std` when compiling for Wasm. +#![cfg_attr(not(feature = "std"), no_std)] + +pub use pallet::*; +use xcm::prelude::*; + +/// The log target of this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-assets-transfer"; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::pallet] + #[pallet::generate_store(pub (super) trait Store)] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + /// The overarching event type. + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + + /// XCM sender which sends messages to the BridgeHub + type BridgeXcmSender: SendXcm; + + // TODO: store as persistent and create add_bridge/remove_bridge - then we can have generic impl and dont need to hardcode NetworkId/ParaId in runtime + /// Configuration for supported bridged networks + type SupportedBridges: Get< + sp_std::prelude::Vec<(NetworkId, MultiLocation, Option)>, + >; + + /// Runtime's universal location + type UniversalLocation: Get; + } + + #[pallet::error] + #[cfg_attr(test, derive(PartialEq))] + pub enum Error { + InvalidConfiguration, + UnsupportedDestination, + BridgeCallError(#[codec(skip)] &'static str), + } + + #[pallet::event] + #[pallet::generate_deposit(pub (super) fn deposit_event)] + pub enum Event { + // TODO: add here xcm_hash? + /// Transfer was successfully entered to the system (does not mean already delivered) + TransferInitiated(XcmHash), + } + + #[pallet::call] + impl Pallet { + /// Transfer asset via bridge to different global consensus + /// + /// Parameters: + /// + /// * `assets`: + /// * `destination`: Different consensus location, where the assets will be deposited, e.g. Polkadot's Statemint: `X2(GlobalConsensus(NetworkId::Polkadot), Parachain(1000))` + /// + // TODO: correct weigth + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn transfer_asset_via_bridge( + origin: OriginFor, + assets: VersionedMultiAssets, + destination: VersionedMultiLocation, + ) -> DispatchResult { + let _ = ensure_signed(origin)?; + + // Check remote destination + let remote_destination = Self::ensure_remote_destination(destination)?; + + // TODO: do some checks + // TODO: check assets? + // TODO: check enought fee? + + // Deposit assets into `AccountId` that corresponds to the bridge + // hub. In this way, Statemine acts as a reserve location to the + // bridge, such that it need not trust any consensus system from + // `./Parent/Parent/...`. (It may trust Polkadot, but would + // Polkadot trust Kusama with its DOT?) + + // TODO: xcm - withdraw and fire ReserveAssetDeposited to the other side + + // TODO: send message through bridge + // Construct and send `Xcm(vec![Instruction])` to + // `./Parent/BridgeHubParaId`. + + // TODO: prepare ReserveAssetDeposited msg to bridge to the other side? + let xcm: Xcm<()> = + sp_std::vec![Instruction::ReserveAssetDeposited(Default::default())].into(); + + // TODO: how to compensate if this call fails? + log::info!( + target: LOG_TARGET, + "[T::BridgeXcmSender] send to bridge, remote_destination: {:?}, xcm: {:?}", + remote_destination, + xcm, + ); + // call bridge + let (ticket, fees) = + T::BridgeXcmSender::validate(&mut Some(remote_destination), &mut Some(xcm)) + .map_err(Self::convert_to_error)?; + log::info!( + target: LOG_TARGET, + "[T::BridgeXcmSender::validate] (TODO: process) fees: {:?}", + fees + ); + // TODO: what to do with fees - we have fees here, pay here or ignore? + // TODO: use fn send_msg + let xcm_hash = T::BridgeXcmSender::deliver(ticket).map_err(Self::convert_to_error)?; + + Self::deposit_event(Event::TransferInitiated(xcm_hash)); + Ok(()) + } + } + + impl Pallet { + /// Validates destination and check if we support bridging to this remote global consensus + /// + /// Returns: correct remote location, where we should be able to bridge + pub(crate) fn ensure_remote_destination( + destination: VersionedMultiLocation, + ) -> Result> { + match destination { + VersionedMultiLocation::V3(location) => { + ensure!(location.parent_count() == 2, Error::::UnsupportedDestination); + let local_network = T::UniversalLocation::get() + .global_consensus() + .map_err(|_| Error::::InvalidConfiguration)?; + let remote_network = location + .interior() + .global_consensus() + .map_err(|_| Error::::UnsupportedDestination)?; + ensure!(local_network != remote_network, Error::::UnsupportedDestination); + ensure!( + T::SupportedBridges::get() + .iter() + .find(|sb| sb.0 == remote_network) + .is_some(), + Error::::UnsupportedDestination + ); + Ok(location) + }, + _ => Err(Error::::UnsupportedDestination), + } + } + + fn convert_to_error(error: SendError) -> Error { + log::error!(target: LOG_TARGET, "SendError occurred, error: {:?}", error); + match error { + SendError::NotApplicable => Error::::BridgeCallError("NotApplicable"), + SendError::Transport(error) => Error::::BridgeCallError(error), + SendError::Unroutable => Error::::BridgeCallError("Unroutable"), + SendError::DestinationUnsupported => + Error::::BridgeCallError("DestinationUnsupported"), + SendError::ExceedsMaxMessageSize => + Error::::BridgeCallError("ExceedsMaxMessageSize"), + SendError::MissingArgument => Error::::BridgeCallError("MissingArgument"), + SendError::Fees => Error::::BridgeCallError("Fees"), + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate as bridge_assets_transfer; + + use frame_support::{parameter_types, sp_io, sp_tracing}; + use sp_runtime::{ + testing::{Header, H256}, + traits::{BlakeTwo256, IdentityLookup}, + }; + use sp_version::RuntimeVersion; + use xcm_builder::{NetworkExportTable, UnpaidRemoteExporter}; + + type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; + type Block = frame_system::mocking::MockBlock; + + frame_support::construct_runtime!( + pub enum TestRuntime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + BridgeAssetsTransfer: bridge_assets_transfer::{Pallet, Call, Event} = 52, + } + ); + + parameter_types! { + pub const BlockHashCount: u64 = 250; + pub Version: RuntimeVersion = RuntimeVersion { + spec_name: sp_version::create_runtime_str!("test"), + impl_name: sp_version::create_runtime_str!("system-test"), + authoring_version: 1, + spec_version: 1, + impl_version: 1, + apis: sp_version::create_apis_vec!([]), + transaction_version: 1, + state_version: 1, + }; + } + + impl frame_system::Config for TestRuntime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockLength = (); + type BlockWeights = (); + type Version = Version; + type PalletInfo = PalletInfo; + type AccountData = (); + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = frame_support::traits::Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; + } + + parameter_types! { + // UniversalLocation as statemine + pub const RelayNetwork: NetworkId = NetworkId::Kusama; + pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(1000)); + // Test bridge cfg + pub TestBridgeTable: sp_std::prelude::Vec<(NetworkId, MultiLocation, Option)> = sp_std::vec![ + (NetworkId::Wococo, (Parent, Parachain(1013)).into(), None), + (NetworkId::Polkadot, (Parent, Parachain(1003)).into(), None), + ]; + } + + std::thread_local! { + static ROUTED_MESSAGE: std::cell::RefCell>> = std::cell::RefCell::new(None); + } + + pub struct ThreadLocalXcmRouter; + impl SendXcm for ThreadLocalXcmRouter { + type Ticket = Option>; + + fn validate( + destination: &mut Option, + message: &mut Option>, + ) -> SendResult { + log::info!( + target: super::LOG_TARGET, + "[ThreadLocalXcmRouter]: destination: {:?}, message: {:?}", + destination, + message + ); + Ok((message.take(), MultiAssets::default())) + } + + fn deliver(ticket: Self::Ticket) -> Result { + match ticket { + Some(msg) => { + ROUTED_MESSAGE.with(|rm| *rm.borrow_mut() = Some(msg)); + Ok([0u8; 32]) + }, + None => Err(SendError::MissingArgument), + } + } + } + + /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus + pub type TestBridgeXcmSender = UnpaidRemoteExporter< + NetworkExportTable, + ThreadLocalXcmRouter, + UniversalLocation, + >; + + impl Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgeXcmSender = TestBridgeXcmSender; + type SupportedBridges = TestBridgeTable; + type UniversalLocation = UniversalLocation; + } + + pub(crate) fn new_test_ext() -> sp_io::TestExternalities { + sp_tracing::try_init_simple(); + frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into() + } + + #[test] + fn test_ensure_remote_destination() { + new_test_ext().execute_with(|| { + // v2 not supported + assert_eq!( + BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V2( + xcm::v2::MultiLocation::default() + )), + Err(Error::::UnsupportedDestination) + ); + + // v3 - "parent: 0" wrong + assert_eq!( + BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(0, X2(GlobalConsensus(Wococo), Parachain(1000))) + )), + Err(Error::::UnsupportedDestination) + ); + // v3 - "parent: 1" wrong + assert_eq!( + BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(1, X2(GlobalConsensus(Wococo), Parachain(1000))) + )), + Err(Error::::UnsupportedDestination) + ); + + // v3 - Rococo is not supported + assert_eq!( + BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))) + )), + Err(Error::::UnsupportedDestination) + ); + + // v3 - ok + assert_eq!( + BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1000))) + )), + Ok(MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1000)))) + ); + }) + } + + #[test] + fn test_transfer_asset_via_bridge_works() { + new_test_ext().execute_with(|| { + assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); + + let assets = VersionedMultiAssets::V3(MultiAssets::default()); + let destination = VersionedMultiLocation::V3(MultiLocation::new( + 2, + X2(GlobalConsensus(Wococo), Parachain(1000)), + )); + + let result = BridgeAssetsTransfer::transfer_asset_via_bridge( + RuntimeOrigin::signed(1), + assets, + destination, + ); + assert_eq!(result, Ok(())); + assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_some())); + }); + } +} diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index 0880249c314..2e3109b1d56 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -68,6 +68,7 @@ cumulus-primitives-utility = { path = "../../../../primitives/utility", default- pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } +bridge-assets-transfer = { path = "../../../../parachains/pallets/bridge-assets-transfer", default-features = false } pallet-xcm-benchmarks = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false, optional = true } @@ -177,4 +178,5 @@ std = [ "pallet-collator-selection/std", "parachain-info/std", "parachains-common/std", + "bridge-assets-transfer/std", ] diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 2a2e1fce7cc..e64ed09565b 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -63,7 +63,7 @@ use parachains_common::{ opaque, AccountId, AssetId, AuraId, Balance, BlockNumber, Hash, Header, Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; -use xcm_config::{KsmLocation, XcmConfig}; +use xcm_config::{BridgeXcmSender, KsmLocation, XcmConfig}; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; @@ -74,6 +74,7 @@ use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use xcm::latest::BodyId; use xcm_executor::XcmExecutor; +use crate::xcm_config::{BridgeTable, UniversalLocation}; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; impl_opaque_keys! { @@ -569,6 +570,13 @@ impl pallet_uniques::Config for Runtime { type Locker = (); } +impl bridge_assets_transfer::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type BridgeXcmSender = BridgeXcmSender; + type SupportedBridges = BridgeTable; + type UniversalLocation = UniversalLocation; +} + // Create the runtime by composing the FRAME pallets that were previously configured. construct_runtime!( pub enum Runtime where @@ -611,6 +619,7 @@ construct_runtime!( // The main stage. TrustBackedAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, + BridgeAssetsTransfer: bridge_assets_transfer::{Pallet, Call, Event} = 52, } ); diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index e23808d7170..d5c9e41e9ef 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -36,9 +36,10 @@ use xcm_builder::{ AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, AsPrefixedGeneralIndex, ConvertedConcreteId, CurrencyAdapter, EnsureXcmOrigin, FungiblesAdapter, IsConcrete, - NativeAsset, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, + NativeAsset, NetworkExportTable, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UnpaidRemoteExporter, + UsingComponents, WeightInfoBounds, }; use xcm_executor::{traits::JustTry, XcmExecutor}; @@ -46,7 +47,7 @@ parameter_types! { pub const KsmLocation: MultiLocation = MultiLocation::parent(); pub const RelayNetwork: NetworkId = NetworkId::Kusama; pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())); pub const Local: MultiLocation = Here.into_location(); pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); @@ -266,3 +267,15 @@ impl cumulus_pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; } + +parameter_types! { + /// BridgedNetworkConsensus + Multilocation-to-LocalGlobalConsensusBridgeHub + LocalGlobalConsensusBridgeHub + pub BridgeTable: sp_std::prelude::Vec<(NetworkId, MultiLocation, Option)> = sp_std::vec![ + (NetworkId::Wococo, (Parent, Parachain(1013)).into(), None), + (NetworkId::Polkadot, (Parent, Parachain(1003)).into(), None), + ]; +} + +/// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus +pub type BridgeXcmSender = + UnpaidRemoteExporter, XcmRouter, UniversalLocation>; From 39ba56492addf6e5bf27a136c9297aded30c3b95 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 14 Dec 2022 16:31:15 +0100 Subject: [PATCH 019/339] Init of pallet with `transfer_asset_via_bridge` call --- Cargo.lock | 34 +- .../pallets/bridge-assets-transfer/Cargo.toml | 10 +- .../src/benchmarking.rs | 889 ++++++++++++++++++ .../pallets/bridge-assets-transfer/src/lib.rs | 243 ++++- .../bridge-assets-transfer/src/weights.rs | 91 ++ .../runtimes/assets/statemine/Cargo.toml | 6 +- .../runtimes/assets/statemine/src/lib.rs | 8 +- .../assets/statemine/src/xcm_config.rs | 23 +- 8 files changed, 1241 insertions(+), 63 deletions(-) create mode 100644 parachains/pallets/bridge-assets-transfer/src/benchmarking.rs create mode 100644 parachains/pallets/bridge-assets-transfer/src/weights.rs diff --git a/Cargo.lock b/Cargo.lock index 5cc63dd432f..00bd69c68fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -713,22 +713,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "bridge-assets-transfer" -version = "0.1.0" -dependencies = [ - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", - "sp-version", - "xcm", - "xcm-builder", -] - [[package]] name = "bs58" version = "0.4.0" @@ -5501,6 +5485,22 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-bridge-assets-transfer" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", + "sp-version", + "xcm", + "xcm-builder", +] + [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" @@ -11533,7 +11533,6 @@ name = "statemine-runtime" version = "2.0.0" dependencies = [ "asset-test-utils", - "bridge-assets-transfer", "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", @@ -11558,6 +11557,7 @@ dependencies = [ "pallet-aura", "pallet-authorship", "pallet-balances", + "pallet-bridge-assets-transfer", "pallet-collator-selection", "pallet-multisig", "pallet-proxy", diff --git a/parachains/pallets/bridge-assets-transfer/Cargo.toml b/parachains/pallets/bridge-assets-transfer/Cargo.toml index 08b0f58a210..03783091815 100644 --- a/parachains/pallets/bridge-assets-transfer/Cargo.toml +++ b/parachains/pallets/bridge-assets-transfer/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "bridge-assets-transfer" +name = "pallet-bridge-assets-transfer" version = "0.1.0" authors = ["Parity Technologies "] edition = "2021" @@ -22,10 +22,10 @@ frame-system = { git = "https://github.com/paritytech/substrate", default-featur # Polkadot xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } [dev-dependencies] sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", branch = "master" } [features] default = ["std"] @@ -37,4 +37,10 @@ std = [ "frame-support/std", "frame-system/std", "xcm/std", + "xcm-builder/std", ] +runtime-benchmarks = [ + "sp-runtime/runtime-benchmarks", + "frame-system/runtime-benchmarks", +] +try-runtime = ["frame-support/try-runtime"] diff --git a/parachains/pallets/bridge-assets-transfer/src/benchmarking.rs b/parachains/pallets/bridge-assets-transfer/src/benchmarking.rs new file mode 100644 index 00000000000..e2e1579fcc9 --- /dev/null +++ b/parachains/pallets/bridge-assets-transfer/src/benchmarking.rs @@ -0,0 +1,889 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Alliance pallet benchmarking. + +use sp_runtime::traits::{Bounded, Hash, StaticLookup}; +use sp_std::{ + cmp, + convert::{TryFrom, TryInto}, + mem::size_of, + prelude::*, +}; + +use frame_benchmarking::{account, benchmarks_instance_pallet}; +use frame_support::traits::{EnsureOrigin, Get, UnfilteredDispatchable}; +use frame_system::{Pallet as System, RawOrigin as SystemOrigin}; + +use super::{Call as AllianceCall, Pallet as Alliance, *}; + +const SEED: u32 = 0; + +const MAX_BYTES: u32 = 1_024; + +fn assert_last_event, I: 'static>(generic_event: >::RuntimeEvent) { + frame_system::Pallet::::assert_last_event(generic_event.into()); +} + +fn cid(input: impl AsRef<[u8]>) -> Cid { + use sha2::{Digest, Sha256}; + let mut hasher = Sha256::new(); + hasher.update(input); + let result = hasher.finalize(); + Cid::new_v0(&*result) +} + +fn rule(input: impl AsRef<[u8]>) -> Cid { + cid(input) +} + +fn announcement(input: impl AsRef<[u8]>) -> Cid { + cid(input) +} + +fn funded_account, I: 'static>(name: &'static str, index: u32) -> T::AccountId { + let account: T::AccountId = account(name, index, SEED); + T::Currency::make_free_balance_be(&account, BalanceOf::::max_value() / 100u8.into()); + account +} + +fn founder, I: 'static>(index: u32) -> T::AccountId { + funded_account::("founder", index) +} + +fn fellow, I: 'static>(index: u32) -> T::AccountId { + funded_account::("fellow", index) +} + +fn ally, I: 'static>(index: u32) -> T::AccountId { + funded_account::("ally", index) +} + +fn outsider, I: 'static>(index: u32) -> T::AccountId { + funded_account::("outsider", index) +} + +fn generate_unscrupulous_account, I: 'static>(index: u32) -> T::AccountId { + funded_account::("unscrupulous", index) +} + +fn set_members, I: 'static>() { + let founders: BoundedVec<_, T::MaxMembersCount> = + BoundedVec::try_from(vec![founder::(1), founder::(2)]).unwrap(); + Members::::insert(MemberRole::Founder, founders.clone()); + + let fellows: BoundedVec<_, T::MaxMembersCount> = + BoundedVec::try_from(vec![fellow::(1), fellow::(2)]).unwrap(); + fellows.iter().for_each(|who| { + T::Currency::reserve(&who, T::AllyDeposit::get()).unwrap(); + >::insert(&who, T::AllyDeposit::get()); + }); + Members::::insert(MemberRole::Fellow, fellows.clone()); + + let allies: BoundedVec<_, T::MaxMembersCount> = + BoundedVec::try_from(vec![ally::(1)]).unwrap(); + allies.iter().for_each(|who| { + T::Currency::reserve(&who, T::AllyDeposit::get()).unwrap(); + >::insert(&who, T::AllyDeposit::get()); + }); + Members::::insert(MemberRole::Ally, allies); + + T::InitializeMembers::initialize_members(&[founders.as_slice(), fellows.as_slice()].concat()); +} + +benchmarks_instance_pallet! { + // This tests when proposal is created and queued as "proposed" + propose_proposed { + let b in 1 .. MAX_BYTES; + let x in 2 .. T::MaxFounders::get(); + let y in 0 .. T::MaxFellows::get(); + let p in 1 .. T::MaxProposals::get(); + + let m = x + y; + + let bytes_in_storage = b + size_of::() as u32 + 32; + + // Construct `members`. + let founders = (0 .. x).map(founder::).collect::>(); + let proposer = founders[0].clone(); + let fellows = (0 .. y).map(fellow::).collect::>(); + + Alliance::::init_members( + SystemOrigin::Root.into(), + founders, + fellows, + vec![], + )?; + + let threshold = m; + // Add previous proposals. + for i in 0 .. p - 1 { + // Proposals should be different so that different proposal hashes are generated + let proposal: T::Proposal = AllianceCall::::set_rule { + rule: rule(vec![i as u8; b as usize]) + }.into(); + Alliance::::propose( + SystemOrigin::Signed(proposer.clone()).into(), + threshold, + Box::new(proposal), + bytes_in_storage, + )?; + } + + let proposal: T::Proposal = AllianceCall::::set_rule { rule: rule(vec![p as u8; b as usize]) }.into(); + + }: propose(SystemOrigin::Signed(proposer.clone()), threshold, Box::new(proposal.clone()), bytes_in_storage) + verify { + // New proposal is recorded + let proposal_hash = T::Hashing::hash_of(&proposal); + assert_eq!(T::ProposalProvider::proposal_of(proposal_hash), Some(proposal)); + } + + vote { + // We choose 5 (3 founders + 2 fellows) as a minimum so we always trigger a vote in the voting loop (`for j in ...`) + let x in 3 .. T::MaxFounders::get(); + let y in 2 .. T::MaxFellows::get(); + + let m = x + y; + + let p = T::MaxProposals::get(); + let b = MAX_BYTES; + let bytes_in_storage = b + size_of::() as u32 + 32; + + // Construct `members`. + let founders = (0 .. x).map(founder::).collect::>(); + let proposer = founders[0].clone(); + let fellows = (0 .. y).map(fellow::).collect::>(); + + let mut members = Vec::with_capacity(founders.len() + fellows.len()); + members.extend(founders.clone()); + members.extend(fellows.clone()); + + Alliance::::init_members( + SystemOrigin::Root.into(), + founders, + fellows, + vec![], + )?; + + // Threshold is 1 less than the number of members so that one person can vote nay + let threshold = m - 1; + + // Add previous proposals + let mut last_hash = T::Hash::default(); + for i in 0 .. p { + // Proposals should be different so that different proposal hashes are generated + let proposal: T::Proposal = AllianceCall::::set_rule { + rule: rule(vec![i as u8; b as usize]) + }.into(); + Alliance::::propose( + SystemOrigin::Signed(proposer.clone()).into(), + threshold, + Box::new(proposal.clone()), + b, + )?; + last_hash = T::Hashing::hash_of(&proposal); + } + + let index = p - 1; + // Have almost everyone vote aye on last proposal, while keeping it from passing. + for j in 0 .. m - 3 { + let voter = &members[j as usize]; + Alliance::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + true, + )?; + } + + let voter = members[m as usize - 3].clone(); + // Voter votes aye without resolving the vote. + Alliance::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + true, + )?; + + // Voter switches vote to nay, but does not kill the vote, just updates + inserts + let approve = false; + + // Whitelist voter account from further DB operations. + let voter_key = frame_system::Account::::hashed_key_for(&voter); + frame_benchmarking::benchmarking::add_to_whitelist(voter_key.into()); + }: _(SystemOrigin::Signed(voter), last_hash.clone(), index, approve) + verify { + } + + veto { + let p in 1 .. T::MaxProposals::get(); + + let m = 3; + let b = MAX_BYTES; + let bytes_in_storage = b + size_of::() as u32 + 32; + + // Construct `members`. + let founders = (0 .. m).map(founder::).collect::>(); + let vetor = founders[0].clone(); + + Alliance::::init_members( + SystemOrigin::Root.into(), + founders, + vec![], + vec![], + )?; + + // Threshold is one less than total members so that two nays will disapprove the vote + let threshold = m - 1; + + // Add proposals + let mut last_hash = T::Hash::default(); + for i in 0 .. p { + // Proposals should be different so that different proposal hashes are generated + let proposal: T::Proposal = AllianceCall::::set_rule { + rule: rule(vec![i as u8; b as usize]) + }.into(); + Alliance::::propose( + SystemOrigin::Signed(vetor.clone()).into(), + threshold, + Box::new(proposal.clone()), + bytes_in_storage, + )?; + last_hash = T::Hashing::hash_of(&proposal); + } + + }: _(SystemOrigin::Signed(vetor), last_hash.clone()) + verify { + // The proposal is removed + assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); + } + + close_early_disapproved { + // We choose 4 (2 founders + 2 fellows) as a minimum so we always trigger a vote in the voting loop (`for j in ...`) + let x in 2 .. T::MaxFounders::get(); + let y in 2 .. T::MaxFellows::get(); + let p in 1 .. T::MaxProposals::get(); + + let m = x + y; + + let bytes = 100; + let bytes_in_storage = bytes + size_of::() as u32 + 32; + + // Construct `members`. + let founders = (0 .. x).map(founder::).collect::>(); + let fellows = (0 .. y).map(fellow::).collect::>(); + + let mut members = Vec::with_capacity(founders.len() + fellows.len()); + members.extend(founders.clone()); + members.extend(fellows.clone()); + + Alliance::::init_members( + SystemOrigin::Root.into(), + founders, + fellows, + vec![], + )?; + + let proposer = members[0].clone(); + let voter = members[1].clone(); + + // Threshold is total members so that one nay will disapprove the vote + let threshold = m; + + // Add previous proposals + let mut last_hash = T::Hash::default(); + for i in 0 .. p { + // Proposals should be different so that different proposal hashes are generated + let proposal: T::Proposal = AllianceCall::::set_rule { + rule: rule(vec![i as u8; bytes as usize]) + }.into(); + Alliance::::propose( + SystemOrigin::Signed(proposer.clone()).into(), + threshold, + Box::new(proposal.clone()), + bytes_in_storage, + )?; + last_hash = T::Hashing::hash_of(&proposal); + assert_eq!(T::ProposalProvider::proposal_of(last_hash), Some(proposal)); + } + + let index = p - 1; + // Have most everyone vote aye on last proposal, while keeping it from passing. + for j in 2 .. m - 1 { + let voter = &members[j as usize]; + Alliance::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + true, + )?; + } + + // Voter votes aye without resolving the vote. + Alliance::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + true, + )?; + + // Voter switches vote to nay, which kills the vote + Alliance::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + false, + )?; + + // Whitelist voter account from further DB operations. + let voter_key = frame_system::Account::::hashed_key_for(&voter); + frame_benchmarking::benchmarking::add_to_whitelist(voter_key.into()); + }: close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::MAX, bytes_in_storage) + verify { + // The last proposal is removed. + assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); + } + + close_early_approved { + let b in 1 .. MAX_BYTES; + // We choose 4 (2 founders + 2 fellows) as a minimum so we always trigger a vote in the voting loop (`for j in ...`) + let x in 2 .. T::MaxFounders::get(); + let y in 2 .. T::MaxFellows::get(); + let p in 1 .. T::MaxProposals::get(); + + let m = x + y; + let bytes_in_storage = b + size_of::() as u32 + 32; + + // Construct `members`. + let founders = (0 .. x).map(founder::).collect::>(); + let fellows = (0 .. y).map(fellow::).collect::>(); + + let mut members = Vec::with_capacity(founders.len() + fellows.len()); + members.extend(founders.clone()); + members.extend(fellows.clone()); + + Alliance::::init_members( + SystemOrigin::Root.into(), + founders, + fellows, + vec![], + )?; + + let proposer = members[0].clone(); + let voter = members[1].clone(); + + // Threshold is 2 so any two ayes will approve the vote + let threshold = 2; + + // Add previous proposals + let mut last_hash = T::Hash::default(); + for i in 0 .. p { + // Proposals should be different so that different proposal hashes are generated + let proposal: T::Proposal = AllianceCall::::set_rule { + rule: rule(vec![i as u8; b as usize]) + }.into(); + Alliance::::propose( + SystemOrigin::Signed(proposer.clone()).into(), + threshold, + Box::new(proposal.clone()), + bytes_in_storage, + )?; + last_hash = T::Hashing::hash_of(&proposal); + assert_eq!(T::ProposalProvider::proposal_of(last_hash), Some(proposal)); + } + + let index = p - 1; + // Caller switches vote to nay on their own proposal, allowing them to be the deciding approval vote + Alliance::::vote( + SystemOrigin::Signed(proposer.clone()).into(), + last_hash.clone(), + index, + false, + )?; + + // Have almost everyone vote nay on last proposal, while keeping it from failing. + for j in 2 .. m - 1 { + let voter = &members[j as usize]; + Alliance::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + false, + )?; + } + + // Member zero is the first aye + Alliance::::vote( + SystemOrigin::Signed(members[0].clone()).into(), + last_hash.clone(), + index, + true, + )?; + + let voter = members[1].clone(); + // Caller switches vote to aye, which passes the vote + Alliance::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + true, + )?; + }: close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::MAX, bytes_in_storage) + verify { + // The last proposal is removed. + assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); + } + + close_disapproved { + // We choose 2 (2 founders / 2 fellows) as a minimum so we always trigger a vote in the voting loop (`for j in ...`) + let x in 2 .. T::MaxFounders::get(); + let y in 2 .. T::MaxFellows::get(); + let p in 1 .. T::MaxProposals::get(); + + let m = x + y; + + let bytes = 100; + let bytes_in_storage = bytes + size_of::() as u32 + 32; + + // Construct `members`. + let founders = (0 .. x).map(founder::).collect::>(); + let fellows = (0 .. y).map(fellow::).collect::>(); + + let mut members = Vec::with_capacity(founders.len() + fellows.len()); + members.extend(founders.clone()); + members.extend(fellows.clone()); + + Alliance::::init_members( + SystemOrigin::Root.into(), + founders, + fellows, + vec![], + )?; + + let proposer = members[0].clone(); + let voter = members[1].clone(); + + // Threshold is one less than total members so that two nays will disapprove the vote + let threshold = m - 1; + + // Add proposals + let mut last_hash = T::Hash::default(); + for i in 0 .. p { + // Proposals should be different so that different proposal hashes are generated + let proposal: T::Proposal = AllianceCall::::set_rule { + rule: rule(vec![i as u8; bytes as usize]) + }.into(); + Alliance::::propose( + SystemOrigin::Signed(proposer.clone()).into(), + threshold, + Box::new(proposal.clone()), + bytes_in_storage, + )?; + last_hash = T::Hashing::hash_of(&proposal); + assert_eq!(T::ProposalProvider::proposal_of(last_hash), Some(proposal)); + } + + let index = p - 1; + // Have almost everyone vote aye on last proposal, while keeping it from passing. + // A few abstainers will be the nay votes needed to fail the vote. + for j in 2 .. m - 1 { + let voter = &members[j as usize]; + Alliance::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + true, + )?; + } + + Alliance::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + false, + )?; + + System::::set_block_number(T::BlockNumber::max_value()); + + }: close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::MAX, bytes_in_storage) + verify { + // The last proposal is removed. + assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); + } + + close_approved { + let b in 1 .. MAX_BYTES; + // We choose 4 (2 founders + 2 fellows) as a minimum so we always trigger a vote in the voting loop (`for j in ...`) + let x in 2 .. T::MaxFounders::get(); + let y in 2 .. T::MaxFellows::get(); + let p in 1 .. T::MaxProposals::get(); + + let m = x + y; + let bytes_in_storage = b + size_of::() as u32 + 32; + + // Construct `members`. + let founders = (0 .. x).map(founder::).collect::>(); + let fellows = (0 .. y).map(fellow::).collect::>(); + + let mut members = Vec::with_capacity(founders.len() + fellows.len()); + members.extend(founders.clone()); + members.extend(fellows.clone()); + + Alliance::::init_members( + SystemOrigin::Root.into(), + founders, + fellows, + vec![], + )?; + + let proposer = members[0].clone(); + let voter = members[1].clone(); + + // Threshold is two, so any two ayes will pass the vote + let threshold = 2; + + // Add proposals + let mut last_hash = T::Hash::default(); + for i in 0 .. p { + // Proposals should be different so that different proposal hashes are generated + let proposal: T::Proposal = AllianceCall::::set_rule { + rule: rule(vec![i as u8; b as usize]) + }.into(); + Alliance::::propose( + SystemOrigin::Signed(proposer.clone()).into(), + threshold, + Box::new(proposal.clone()), + bytes_in_storage, + )?; + last_hash = T::Hashing::hash_of(&proposal); + assert_eq!(T::ProposalProvider::proposal_of(last_hash), Some(proposal)); + } + + // The prime member votes aye, so abstentions default to aye. + Alliance::::vote( + SystemOrigin::Signed(proposer.clone()).into(), + last_hash.clone(), + p - 1, + true // Vote aye. + )?; + + let index = p - 1; + // Have almost everyone vote nay on last proposal, while keeping it from failing. + // A few abstainers will be the aye votes needed to pass the vote. + for j in 2 .. m - 1 { + let voter = &members[j as usize]; + Alliance::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + false + )?; + } + + // caller is prime, prime already votes aye by creating the proposal + System::::set_block_number(T::BlockNumber::max_value()); + + }: close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::MAX, bytes_in_storage) + verify { + // The last proposal is removed. + assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); + } + + init_members { + // at least 1 founders + let x in 1 .. T::MaxFounders::get(); + let y in 0 .. T::MaxFellows::get(); + let z in 0 .. T::MaxAllies::get(); + + let mut founders = (0 .. x).map(founder::).collect::>(); + let mut fellows = (0 .. y).map(fellow::).collect::>(); + let mut allies = (0 .. z).map(ally::).collect::>(); + + }: _(SystemOrigin::Root, founders.clone(), fellows.clone(), allies.clone()) + verify { + founders.sort(); + fellows.sort(); + allies.sort(); + assert_last_event::(Event::MembersInitialized { + founders: founders.clone(), + fellows: fellows.clone(), + allies: allies.clone(), + }.into()); + assert_eq!(Alliance::::members(MemberRole::Founder), founders); + assert_eq!(Alliance::::members(MemberRole::Fellow), fellows); + assert_eq!(Alliance::::members(MemberRole::Ally), allies); + } + + disband { + // at least 1 founders + let x in 1 .. T::MaxFounders::get() + T::MaxFellows::get(); + let y in 0 .. T::MaxAllies::get(); + let z in 0 .. T::MaxMembersCount::get() / 2; + + let voting_members = (0 .. x).map(founder::).collect::>(); + let allies = (0 .. y).map(ally::).collect::>(); + let witness = DisbandWitness{ + voting_members: x, + ally_members: y, + }; + + // setting the Alliance to disband on the benchmark call + Alliance::::init_members( + SystemOrigin::Root.into(), + voting_members.clone(), + vec![], + allies.clone(), + )?; + + // reserve deposits + let deposit = T::AllyDeposit::get(); + for member in voting_members.iter().chain(allies.iter()).take(z as usize) { + T::Currency::reserve(&member, deposit)?; + >::insert(&member, deposit); + } + + assert_eq!(Alliance::::voting_members_count(), x); + assert_eq!(Alliance::::ally_members_count(), y); + }: _(SystemOrigin::Root, witness) + verify { + assert_last_event::(Event::AllianceDisbanded { + voting_members: x, + ally_members: y, + unreserved: cmp::min(z, x + y), + }.into()); + + assert!(!Alliance::::is_initialized()); + } + + set_rule { + set_members::(); + + let rule = rule(b"hello world"); + + let call = Call::::set_rule { rule: rule.clone() }; + let origin = T::AdminOrigin::successful_origin(); + }: { call.dispatch_bypass_filter(origin)? } + verify { + assert_eq!(Alliance::::rule(), Some(rule.clone())); + assert_last_event::(Event::NewRuleSet { rule }.into()); + } + + announce { + set_members::(); + + let announcement = announcement(b"hello world"); + + let call = Call::::announce { announcement: announcement.clone() }; + let origin = T::AnnouncementOrigin::successful_origin(); + }: { call.dispatch_bypass_filter(origin)? } + verify { + assert!(Alliance::::announcements().contains(&announcement)); + assert_last_event::(Event::Announced { announcement }.into()); + } + + remove_announcement { + set_members::(); + + let announcement = announcement(b"hello world"); + let announcements: BoundedVec<_, T::MaxAnnouncementsCount> = BoundedVec::try_from(vec![announcement.clone()]).unwrap(); + Announcements::::put(announcements); + + let call = Call::::remove_announcement { announcement: announcement.clone() }; + let origin = T::AnnouncementOrigin::successful_origin(); + }: { call.dispatch_bypass_filter(origin)? } + verify { + assert!(Alliance::::announcements().is_empty()); + assert_last_event::(Event::AnnouncementRemoved { announcement }.into()); + } + + join_alliance { + set_members::(); + + let outsider = outsider::(1); + assert!(!Alliance::::is_member(&outsider)); + assert_eq!(DepositOf::::get(&outsider), None); + }: _(SystemOrigin::Signed(outsider.clone())) + verify { + assert!(Alliance::::is_member_of(&outsider, MemberRole::Ally)); // outsider is now an ally + assert_eq!(DepositOf::::get(&outsider), Some(T::AllyDeposit::get())); // with a deposit + assert!(!Alliance::::has_voting_rights(&outsider)); // allies don't have voting rights + assert_last_event::(Event::NewAllyJoined { + ally: outsider, + nominator: None, + reserved: Some(T::AllyDeposit::get()) + }.into()); + } + + nominate_ally { + set_members::(); + + let founder1 = founder::(1); + assert!(Alliance::::is_member_of(&founder1, MemberRole::Founder)); + + let outsider = outsider::(1); + assert!(!Alliance::::is_member(&outsider)); + assert_eq!(DepositOf::::get(&outsider), None); + + let outsider_lookup = T::Lookup::unlookup(outsider.clone()); + }: _(SystemOrigin::Signed(founder1.clone()), outsider_lookup) + verify { + assert!(Alliance::::is_member_of(&outsider, MemberRole::Ally)); // outsider is now an ally + assert_eq!(DepositOf::::get(&outsider), None); // without a deposit + assert!(!Alliance::::has_voting_rights(&outsider)); // allies don't have voting rights + assert_last_event::(Event::NewAllyJoined { + ally: outsider, + nominator: Some(founder1), + reserved: None + }.into()); + } + + elevate_ally { + set_members::(); + + let ally1 = ally::(1); + assert!(Alliance::::is_ally(&ally1)); + + let ally1_lookup = T::Lookup::unlookup(ally1.clone()); + let call = Call::::elevate_ally { ally: ally1_lookup }; + let origin = T::MembershipManager::successful_origin(); + }: { call.dispatch_bypass_filter(origin)? } + verify { + assert!(!Alliance::::is_ally(&ally1)); + assert!(Alliance::::is_fellow(&ally1)); + assert_last_event::(Event::AllyElevated { ally: ally1 }.into()); + } + + give_retirement_notice { + set_members::(); + let fellow2 = fellow::(2); + + assert!(Alliance::::is_fellow(&fellow2)); + }: _(SystemOrigin::Signed(fellow2.clone())) + verify { + assert!(Alliance::::is_member_of(&fellow2, MemberRole::Retiring)); + + assert_eq!( + RetiringMembers::::get(&fellow2), + Some(System::::block_number() + T::RetirementPeriod::get()) + ); + assert_last_event::( + Event::MemberRetirementPeriodStarted {member: fellow2}.into() + ); + } + + retire { + set_members::(); + + let fellow2 = fellow::(2); + assert!(Alliance::::is_fellow(&fellow2)); + + assert_eq!( + Alliance::::give_retirement_notice( + SystemOrigin::Signed(fellow2.clone()).into() + ), + Ok(()) + ); + System::::set_block_number(System::::block_number() + T::RetirementPeriod::get()); + + assert_eq!(DepositOf::::get(&fellow2), Some(T::AllyDeposit::get())); + }: _(SystemOrigin::Signed(fellow2.clone())) + verify { + assert!(!Alliance::::is_member(&fellow2)); + assert_eq!(DepositOf::::get(&fellow2), None); + assert_last_event::(Event::MemberRetired { + member: fellow2, + unreserved: Some(T::AllyDeposit::get()) + }.into()); + } + + kick_member { + set_members::(); + + let fellow2 = fellow::(2); + assert!(Alliance::::is_member_of(&fellow2, MemberRole::Fellow)); + assert_eq!(DepositOf::::get(&fellow2), Some(T::AllyDeposit::get())); + + let fellow2_lookup = T::Lookup::unlookup(fellow2.clone()); + let call = Call::::kick_member { who: fellow2_lookup }; + let origin = T::MembershipManager::successful_origin(); + }: { call.dispatch_bypass_filter(origin)? } + verify { + assert!(!Alliance::::is_member(&fellow2)); + assert_eq!(DepositOf::::get(&fellow2), None); + assert_last_event::(Event::MemberKicked { + member: fellow2, + slashed: Some(T::AllyDeposit::get()) + }.into()); + } + + add_unscrupulous_items { + let n in 0 .. T::MaxUnscrupulousItems::get(); + let l in 0 .. T::MaxWebsiteUrlLength::get(); + + set_members::(); + + let accounts = (0 .. n) + .map(|i| generate_unscrupulous_account::(i)) + .collect::>(); + let websites = (0 .. n).map(|i| -> BoundedVec { + BoundedVec::try_from(vec![i as u8; l as usize]).unwrap() + }).collect::>(); + + let mut unscrupulous_list = Vec::with_capacity(accounts.len() + websites.len()); + unscrupulous_list.extend(accounts.into_iter().map(UnscrupulousItem::AccountId)); + unscrupulous_list.extend(websites.into_iter().map(UnscrupulousItem::Website)); + + let call = Call::::add_unscrupulous_items { items: unscrupulous_list.clone() }; + let origin = T::AnnouncementOrigin::successful_origin(); + }: { call.dispatch_bypass_filter(origin)? } + verify { + assert_last_event::(Event::UnscrupulousItemAdded { items: unscrupulous_list }.into()); + } + + remove_unscrupulous_items { + let n in 0 .. T::MaxUnscrupulousItems::get(); + let l in 0 .. T::MaxWebsiteUrlLength::get(); + + set_members::(); + + let mut accounts = (0 .. n) + .map(|i| generate_unscrupulous_account::(i)) + .collect::>(); + accounts.sort(); + let accounts: BoundedVec<_, T::MaxUnscrupulousItems> = accounts.try_into().unwrap(); + UnscrupulousAccounts::::put(accounts.clone()); + + let mut websites = (0 .. n).map(|i| -> BoundedVec<_, T::MaxWebsiteUrlLength> + { BoundedVec::try_from(vec![i as u8; l as usize]).unwrap() }).collect::>(); + websites.sort(); + let websites: BoundedVec<_, T::MaxUnscrupulousItems> = websites.try_into().unwrap(); + UnscrupulousWebsites::::put(websites.clone()); + + let mut unscrupulous_list = Vec::with_capacity(accounts.len() + websites.len()); + unscrupulous_list.extend(accounts.into_iter().map(UnscrupulousItem::AccountId)); + unscrupulous_list.extend(websites.into_iter().map(UnscrupulousItem::Website)); + + let call = Call::::remove_unscrupulous_items { items: unscrupulous_list.clone() }; + let origin = T::AnnouncementOrigin::successful_origin(); + }: { call.dispatch_bypass_filter(origin)? } + verify { + assert_last_event::(Event::UnscrupulousItemRemoved { items: unscrupulous_list }.into()); + } + + impl_benchmark_test_suite!(Alliance, crate::mock::new_bench_ext(), crate::mock::Test); +} diff --git a/parachains/pallets/bridge-assets-transfer/src/lib.rs b/parachains/pallets/bridge-assets-transfer/src/lib.rs index c4b3ecb48ca..f99f13ad208 100644 --- a/parachains/pallets/bridge-assets-transfer/src/lib.rs +++ b/parachains/pallets/bridge-assets-transfer/src/lib.rs @@ -20,17 +20,39 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] +use codec::{Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; +use sp_runtime::RuntimeDebug; + pub use pallet::*; use xcm::prelude::*; +pub mod weights; + /// The log target of this pallet. pub const LOG_TARGET: &str = "runtime::bridge-assets-transfer"; +#[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug, MaxEncodedLen, TypeInfo)] +pub struct BridgeConfig { + /// Contains location, which is able to bridge XCM messages to bridged network + bridge_location: MultiLocation, + /// Fee which could be needed to pay in `bridge_location` + fee: Option, +} + +impl From for (MultiLocation, Option) { + fn from(bridge_config: BridgeConfig) -> (MultiLocation, Option) { + (bridge_config.bridge_location, bridge_config.fee) + } +} + #[frame_support::pallet] pub mod pallet { use super::*; + use crate::weights::WeightInfo; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; + use xcm_builder::ExporterFor; #[pallet::pallet] #[pallet::generate_store(pub (super) trait Store)] @@ -45,16 +67,17 @@ pub mod pallet { /// XCM sender which sends messages to the BridgeHub type BridgeXcmSender: SendXcm; - // TODO: store as persistent and create add_bridge/remove_bridge - then we can have generic impl and dont need to hardcode NetworkId/ParaId in runtime - /// Configuration for supported bridged networks - type SupportedBridges: Get< - sp_std::prelude::Vec<(NetworkId, MultiLocation, Option)>, - >; - /// Runtime's universal location type UniversalLocation: Get; + + /// Weight information for extrinsics in this pallet. + type WeightInfo: WeightInfo; } + #[pallet::storage] + /// Details of configured bridges which are allowed for transfer. + pub(super) type Bridges = StorageMap<_, Blake2_128Concat, NetworkId, BridgeConfig>; + #[pallet::error] #[cfg_attr(test, derive(PartialEq))] pub enum Error { @@ -69,6 +92,13 @@ pub mod pallet { // TODO: add here xcm_hash? /// Transfer was successfully entered to the system (does not mean already delivered) TransferInitiated(XcmHash), + + /// New bridge configuration was added + BridgeAdded, + /// Bridge configuration was removed + BridgeRemoved, + /// Bridge configuration was updated + BridgeUpdated, } #[pallet::call] @@ -78,10 +108,8 @@ pub mod pallet { /// Parameters: /// /// * `assets`: - /// * `destination`: Different consensus location, where the assets will be deposited, e.g. Polkadot's Statemint: `X2(GlobalConsensus(NetworkId::Polkadot), Parachain(1000))` - /// - // TODO: correct weigth - #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + /// * `destination`: Different consensus location, where the assets will be deposited, e.g. Polkadot's Statemint: `2, X2(GlobalConsensus(NetworkId::Polkadot), Parachain(1000))` + #[pallet::weight(T::WeightInfo::transfer_asset_via_bridge())] pub fn transfer_asset_via_bridge( origin: OriginFor, assets: VersionedMultiAssets, @@ -135,6 +163,67 @@ pub mod pallet { Self::deposit_event(Event::TransferInitiated(xcm_hash)); Ok(()) } + + /// Adds new bridge configuration, which allows transfer to this `bridged_network`. + /// + /// Parameters: + /// + /// * `bridged_network`: Network where we want to allow transfer funds + /// * `bridge_config`: contains location for BridgeHub in our network + fee + #[pallet::weight(T::WeightInfo::add_bridge_config())] + pub fn add_bridge_config( + origin: OriginFor, + bridged_network: NetworkId, + bridge_config: BridgeConfig, + ) -> DispatchResult { + let _ = ensure_root(origin)?; + ensure!(!Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); + + Bridges::::insert(bridged_network, bridge_config); + Self::deposit_event(Event::BridgeAdded); + Ok(()) + } + + /// Remove bridge configuration for specified `bridged_network`. + /// + /// Parameters: + /// + /// * `bridged_network`: Network where we want to remove + #[pallet::weight(T::WeightInfo::remove_bridge_config())] + pub fn remove_bridge_config( + origin: OriginFor, + bridged_network: NetworkId, + ) -> DispatchResult { + let _ = ensure_root(origin)?; + ensure!(Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); + + Bridges::::remove(bridged_network); + Self::deposit_event(Event::BridgeRemoved); + Ok(()) + } + + /// Updates bridge configuration for specified `bridged_network`. + /// + /// Parameters: + /// + /// * `bridged_network`: Network where we want to remove + /// * `fee`: New fee to update + #[pallet::weight(T::WeightInfo::update_bridge_config())] + pub fn update_bridge_config( + origin: OriginFor, + bridged_network: NetworkId, + fee: Option, + ) -> DispatchResult { + let _ = ensure_root(origin)?; + ensure!(Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); + + Bridges::::try_mutate_exists(bridged_network, |bridge_config| { + let deposit = bridge_config.as_mut().ok_or(Error::::InvalidConfiguration)?; + deposit.fee = fee; + Self::deposit_event(Event::BridgeUpdated); + Ok(()) + }) + } } impl Pallet { @@ -156,10 +245,7 @@ pub mod pallet { .map_err(|_| Error::::UnsupportedDestination)?; ensure!(local_network != remote_network, Error::::UnsupportedDestination); ensure!( - T::SupportedBridges::get() - .iter() - .find(|sb| sb.0 == remote_network) - .is_some(), + Bridges::::contains_key(remote_network), Error::::UnsupportedDestination ); Ok(location) @@ -183,6 +269,16 @@ pub mod pallet { } } } + + impl ExporterFor for Pallet { + fn exporter_for( + network: &NetworkId, + _remote_location: &InteriorMultiLocation, + _message: &Xcm<()>, + ) -> Option<(MultiLocation, Option)> { + Bridges::::get(network).map(Into::into) + } + } } #[cfg(test)] @@ -190,13 +286,15 @@ mod tests { use super::*; use crate as bridge_assets_transfer; - use frame_support::{parameter_types, sp_io, sp_tracing}; + use frame_support::{ + assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, + }; use sp_runtime::{ testing::{Header, H256}, traits::{BlakeTwo256, IdentityLookup}, }; use sp_version::RuntimeVersion; - use xcm_builder::{NetworkExportTable, UnpaidRemoteExporter}; + use xcm_builder::{ExporterFor, UnpaidRemoteExporter}; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; @@ -297,17 +395,14 @@ mod tests { } /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus - pub type TestBridgeXcmSender = UnpaidRemoteExporter< - NetworkExportTable, - ThreadLocalXcmRouter, - UniversalLocation, - >; + pub type TestBridgeXcmSender = + UnpaidRemoteExporter; impl Config for TestRuntime { type RuntimeEvent = RuntimeEvent; type BridgeXcmSender = TestBridgeXcmSender; - type SupportedBridges = TestBridgeTable; type UniversalLocation = UniversalLocation; + type WeightInfo = (); } pub(crate) fn new_test_ext() -> sp_io::TestExternalities { @@ -321,6 +416,13 @@ mod tests { #[test] fn test_ensure_remote_destination() { new_test_ext().execute_with(|| { + // insert bridge config + assert_ok!(BridgeAssetsTransfer::add_bridge_config( + RuntimeOrigin::root(), + Wococo, + BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), fee: None }, + )); + // v2 not supported assert_eq!( BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V2( @@ -365,6 +467,13 @@ mod tests { #[test] fn test_transfer_asset_via_bridge_works() { new_test_ext().execute_with(|| { + // insert bridge config + assert_ok!(BridgeAssetsTransfer::add_bridge_config( + RuntimeOrigin::root(), + Wococo, + BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), fee: None }, + )); + assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); let assets = VersionedMultiAssets::V3(MultiAssets::default()); @@ -382,4 +491,94 @@ mod tests { assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_some())); }); } + + #[test] + fn test_bridge_config_management_works() { + let bridged_network = Rococo; + let bridged_config = + BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), fee: None }; + let dummy_xcm = Xcm(vec![]); + let dummy_remote_interior_multilocation = X1(Parachain(1234)); + + new_test_ext().execute_with(|| { + assert_eq!(Bridges::::iter().count(), 0); + + // should fail - just root is allowed + assert_noop!( + BridgeAssetsTransfer::add_bridge_config( + RuntimeOrigin::signed(1), + bridged_network, + bridged_config.clone(), + ), + DispatchError::BadOrigin + ); + assert_eq!(Bridges::::iter().count(), 0); + assert_eq!( + BridgeAssetsTransfer::exporter_for( + &bridged_network, + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + None + ); + + // add with root + assert_ok!(BridgeAssetsTransfer::add_bridge_config( + RuntimeOrigin::root(), + bridged_network, + bridged_config.clone(), + )); + assert_eq!(Bridges::::iter().count(), 1); + assert_eq!(Bridges::::get(bridged_network), Some(bridged_config.clone())); + assert_eq!(Bridges::::get(Wococo), None); + assert_eq!( + BridgeAssetsTransfer::exporter_for( + &bridged_network, + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + Some(bridged_config.clone().into()) + ); + assert_eq!( + BridgeAssetsTransfer::exporter_for( + &Wococo, + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + None + ); + + // update fee + // remove + assert_ok!(BridgeAssetsTransfer::update_bridge_config( + RuntimeOrigin::root(), + bridged_network, + Some((Parent, 200u128).into()), + )); + assert_eq!(Bridges::::iter().count(), 1); + assert_eq!( + Bridges::::get(bridged_network), + Some(BridgeConfig { + bridge_location: bridged_config.bridge_location.clone(), + fee: Some((Parent, 200u128).into()) + }) + ); + assert_eq!( + BridgeAssetsTransfer::exporter_for( + &bridged_network, + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + Some((bridged_config.bridge_location, Some((Parent, 200u128).into()))) + ); + + // remove + assert_ok!(BridgeAssetsTransfer::remove_bridge_config( + RuntimeOrigin::root(), + bridged_network, + )); + assert_eq!(Bridges::::get(bridged_network), None); + assert_eq!(Bridges::::iter().count(), 0); + }) + } } diff --git a/parachains/pallets/bridge-assets-transfer/src/weights.rs b/parachains/pallets/bridge-assets-transfer/src/weights.rs new file mode 100644 index 00000000000..43ea26858ac --- /dev/null +++ b/parachains/pallets/bridge-assets-transfer/src/weights.rs @@ -0,0 +1,91 @@ +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for pallet_bridge_assets_transfer +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2022-09-05, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// /home/benchbot/cargo_target_dir/production/substrate +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --pallet=pallet_alliance +// --chain=dev +// --output=./frame/alliance/src/weights.rs +// --template=./.maintain/frame-weight-template.hbs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_alliance. +pub trait WeightInfo { + fn transfer_asset_via_bridge(/* number of assets */) -> Weight; + fn add_bridge_config() -> Weight; + fn remove_bridge_config() -> Weight; + fn update_bridge_config() -> Weight; +} + +/// Weights for pallet_alliance using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); + +impl WeightInfo for SubstrateWeight { + fn transfer_asset_via_bridge() -> Weight { + Weight::zero() + } + + fn add_bridge_config() -> Weight { + Weight::zero() + } + + fn remove_bridge_config() -> Weight { + Weight::zero() + } + + fn update_bridge_config() -> Weight { + Weight::zero() + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + fn transfer_asset_via_bridge() -> Weight { + Weight::zero() + } + + fn add_bridge_config() -> Weight { + Weight::zero() + } + + fn remove_bridge_config() -> Weight { + Weight::zero() + } + + fn update_bridge_config() -> Weight { + Weight::zero() + } +} diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index 2e3109b1d56..4c074b5675b 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -68,7 +68,7 @@ cumulus-primitives-utility = { path = "../../../../primitives/utility", default- pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } -bridge-assets-transfer = { path = "../../../../parachains/pallets/bridge-assets-transfer", default-features = false } +pallet-bridge-assets-transfer = { path = "../../../../parachains/pallets/bridge-assets-transfer", default-features = false } pallet-xcm-benchmarks = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false, optional = true } @@ -101,6 +101,7 @@ runtime-benchmarks = [ "pallet-collator-selection/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", + "pallet-bridge-assets-transfer/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", @@ -126,6 +127,7 @@ try-runtime = [ "pallet-utility/try-runtime", "pallet-xcm/try-runtime", "parachain-info/try-runtime", + "pallet-bridge-assets-transfer/try-runtime", ] std = [ "codec/std", @@ -178,5 +180,5 @@ std = [ "pallet-collator-selection/std", "parachain-info/std", "parachains-common/std", - "bridge-assets-transfer/std", + "pallet-bridge-assets-transfer/std", ] diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index e64ed09565b..4fbc4de021c 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -74,7 +74,7 @@ use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use xcm::latest::BodyId; use xcm_executor::XcmExecutor; -use crate::xcm_config::{BridgeTable, UniversalLocation}; +use crate::xcm_config::UniversalLocation; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; impl_opaque_keys! { @@ -570,11 +570,11 @@ impl pallet_uniques::Config for Runtime { type Locker = (); } -impl bridge_assets_transfer::Config for Runtime { +impl pallet_bridge_assets_transfer::Config for Runtime { type RuntimeEvent = RuntimeEvent; type BridgeXcmSender = BridgeXcmSender; - type SupportedBridges = BridgeTable; type UniversalLocation = UniversalLocation; + type WeightInfo = pallet_bridge_assets_transfer::weights::SubstrateWeight; } // Create the runtime by composing the FRAME pallets that were previously configured. @@ -619,7 +619,7 @@ construct_runtime!( // The main stage. TrustBackedAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, - BridgeAssetsTransfer: bridge_assets_transfer::{Pallet, Call, Event} = 52, + BridgeAssetsTransfer: pallet_bridge_assets_transfer::{Pallet, Call, Event} = 52, } ); diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index d5c9e41e9ef..fe693597508 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -14,8 +14,8 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, AssetId, Authorship, Balance, Balances, ParachainInfo, - ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + AccountId, AllPalletsWithSystem, AssetId, Authorship, Balance, Balances, BridgeAssetsTransfer, + ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssets, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use frame_support::{ @@ -36,10 +36,10 @@ use xcm_builder::{ AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, AsPrefixedGeneralIndex, ConvertedConcreteId, CurrencyAdapter, EnsureXcmOrigin, FungiblesAdapter, IsConcrete, - NativeAsset, NetworkExportTable, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, - SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UnpaidRemoteExporter, - UsingComponents, WeightInfoBounds, + NativeAsset, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, UnpaidRemoteExporter, UsingComponents, + WeightInfoBounds, }; use xcm_executor::{traits::JustTry, XcmExecutor}; @@ -268,14 +268,5 @@ impl cumulus_pallet_xcm::Config for Runtime { type XcmExecutor = XcmExecutor; } -parameter_types! { - /// BridgedNetworkConsensus + Multilocation-to-LocalGlobalConsensusBridgeHub + LocalGlobalConsensusBridgeHub - pub BridgeTable: sp_std::prelude::Vec<(NetworkId, MultiLocation, Option)> = sp_std::vec![ - (NetworkId::Wococo, (Parent, Parachain(1013)).into(), None), - (NetworkId::Polkadot, (Parent, Parachain(1003)).into(), None), - ]; -} - /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus -pub type BridgeXcmSender = - UnpaidRemoteExporter, XcmRouter, UniversalLocation>; +pub type BridgeXcmSender = UnpaidRemoteExporter; From c6755310622622319ba051a47437376046dba4b3 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 19 Dec 2022 11:27:37 +0100 Subject: [PATCH 020/339] Box wrap inputs --- .../pallets/bridge-assets-transfer/src/lib.rs | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/parachains/pallets/bridge-assets-transfer/src/lib.rs b/parachains/pallets/bridge-assets-transfer/src/lib.rs index f99f13ad208..02e66de85bd 100644 --- a/parachains/pallets/bridge-assets-transfer/src/lib.rs +++ b/parachains/pallets/bridge-assets-transfer/src/lib.rs @@ -23,6 +23,7 @@ use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; +use sp_std::boxed::Box; pub use pallet::*; use xcm::prelude::*; @@ -112,13 +113,13 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::transfer_asset_via_bridge())] pub fn transfer_asset_via_bridge( origin: OriginFor, - assets: VersionedMultiAssets, - destination: VersionedMultiLocation, + assets: Box, + destination: Box, ) -> DispatchResult { let _ = ensure_signed(origin)?; // Check remote destination - let remote_destination = Self::ensure_remote_destination(destination)?; + let remote_destination = Self::ensure_remote_destination(*destination)?; // TODO: do some checks // TODO: check assets? @@ -174,7 +175,7 @@ pub mod pallet { pub fn add_bridge_config( origin: OriginFor, bridged_network: NetworkId, - bridge_config: BridgeConfig, + bridge_config: Box, ) -> DispatchResult { let _ = ensure_root(origin)?; ensure!(!Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); @@ -420,7 +421,10 @@ mod tests { assert_ok!(BridgeAssetsTransfer::add_bridge_config( RuntimeOrigin::root(), Wococo, - BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), fee: None }, + Box::new(BridgeConfig { + bridge_location: (Parent, Parachain(1013)).into(), + fee: None + }), )); // v2 not supported @@ -471,16 +475,19 @@ mod tests { assert_ok!(BridgeAssetsTransfer::add_bridge_config( RuntimeOrigin::root(), Wococo, - BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), fee: None }, + Box::new(BridgeConfig { + bridge_location: (Parent, Parachain(1013)).into(), + fee: None + }), )); assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); - let assets = VersionedMultiAssets::V3(MultiAssets::default()); - let destination = VersionedMultiLocation::V3(MultiLocation::new( + let assets = Box::new(VersionedMultiAssets::V3(MultiAssets::default())); + let destination = Box::new(VersionedMultiLocation::V3(MultiLocation::new( 2, X2(GlobalConsensus(Wococo), Parachain(1000)), - )); + ))); let result = BridgeAssetsTransfer::transfer_asset_via_bridge( RuntimeOrigin::signed(1), @@ -496,7 +503,7 @@ mod tests { fn test_bridge_config_management_works() { let bridged_network = Rococo; let bridged_config = - BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), fee: None }; + Box::new(BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), fee: None }); let dummy_xcm = Xcm(vec![]); let dummy_remote_interior_multilocation = X1(Parachain(1234)); @@ -529,7 +536,10 @@ mod tests { bridged_config.clone(), )); assert_eq!(Bridges::::iter().count(), 1); - assert_eq!(Bridges::::get(bridged_network), Some(bridged_config.clone())); + assert_eq!( + Bridges::::get(bridged_network), + Some((*bridged_config.clone()).into()) + ); assert_eq!(Bridges::::get(Wococo), None); assert_eq!( BridgeAssetsTransfer::exporter_for( @@ -537,7 +547,7 @@ mod tests { &dummy_remote_interior_multilocation, &dummy_xcm ), - Some(bridged_config.clone().into()) + Some((*bridged_config.clone()).into()) ); assert_eq!( BridgeAssetsTransfer::exporter_for( From e127426ce465e72eb545ed31a931ed9e900b0814 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 19 Dec 2022 17:27:27 +0100 Subject: [PATCH 021/339] Added withdraw/deposit to bridge's reserve account --- Cargo.lock | 3 + .../pallets/bridge-assets-transfer/Cargo.toml | 6 +- .../pallets/bridge-assets-transfer/src/lib.rs | 238 ++++++++++++++---- .../runtimes/assets/statemine/src/lib.rs | 9 +- 4 files changed, 206 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 00bd69c68fe..cf9e0f88e76 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5492,13 +5492,16 @@ dependencies = [ "frame-support", "frame-system", "log", + "pallet-balances", "parity-scale-codec", + "polkadot-parachain 0.9.31", "scale-info", "sp-runtime", "sp-std", "sp-version", "xcm", "xcm-builder", + "xcm-executor", ] [[package]] diff --git a/parachains/pallets/bridge-assets-transfer/Cargo.toml b/parachains/pallets/bridge-assets-transfer/Cargo.toml index 03783091815..740ac21fa29 100644 --- a/parachains/pallets/bridge-assets-transfer/Cargo.toml +++ b/parachains/pallets/bridge-assets-transfer/Cargo.toml @@ -23,9 +23,12 @@ frame-system = { git = "https://github.com/paritytech/substrate", default-featur # Polkadot xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } [dev-dependencies] -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-version = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } +polkadot-parachain = { git = "https://github.com/paritytech/polkadot", branch = "master" } [features] default = ["std"] @@ -38,6 +41,7 @@ std = [ "frame-system/std", "xcm/std", "xcm-builder/std", + "xcm-executor/std", ] runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", diff --git a/parachains/pallets/bridge-assets-transfer/src/lib.rs b/parachains/pallets/bridge-assets-transfer/src/lib.rs index 02e66de85bd..62632fef4d0 100644 --- a/parachains/pallets/bridge-assets-transfer/src/lib.rs +++ b/parachains/pallets/bridge-assets-transfer/src/lib.rs @@ -53,7 +53,9 @@ pub mod pallet { use crate::weights::WeightInfo; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; + use xcm::latest::Error as XcmError; use xcm_builder::ExporterFor; + use xcm_executor::traits::TransactAsset; #[pallet::pallet] #[pallet::generate_store(pub (super) trait Store)] @@ -73,6 +75,15 @@ pub mod pallet { /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; + + /// How to withdraw and deposit an asset for reserve. + type AssetTransactor: TransactAsset; + + /// Required origin for asset transfer. If successful, it resolves to `MultiLocation`. + type TransferXcmOrigin: EnsureOrigin< + ::RuntimeOrigin, + Success = MultiLocation, + >; } #[pallet::storage] @@ -83,14 +94,16 @@ pub mod pallet { #[cfg_attr(test, derive(PartialEq))] pub enum Error { InvalidConfiguration, + InvalidAssets, + MaxAssetsLimitReached, UnsupportedDestination, - BridgeCallError(#[codec(skip)] &'static str), + BridgeCallError, + FailedToReserve, } #[pallet::event] #[pallet::generate_deposit(pub (super) fn deposit_event)] pub enum Event { - // TODO: add here xcm_hash? /// Transfer was successfully entered to the system (does not mean already delivered) TransferInitiated(XcmHash), @@ -100,6 +113,12 @@ pub mod pallet { BridgeRemoved, /// Bridge configuration was updated BridgeUpdated, + + /// Make reserve failed + FailedToReserve(XcmError), + + /// Bridge transfer failed + BridgeCallError(SendError), } #[pallet::call] @@ -116,21 +135,52 @@ pub mod pallet { assets: Box, destination: Box, ) -> DispatchResult { - let _ = ensure_signed(origin)?; + let origin_location = T::TransferXcmOrigin::ensure_origin(origin)?; + + // Check remote destination + bridge_config + let (bridge_config, remote_destination) = + Self::ensure_remote_destination(*destination)?; - // Check remote destination - let remote_destination = Self::ensure_remote_destination(*destination)?; + // Check reserve account - sovereign account of bridge + let reserve_account = bridge_config.bridge_location; - // TODO: do some checks + // TODO: do some checks - balances, can_withdraw, ... // TODO: check assets? // TODO: check enought fee? + // TODO: fix this for multiple assets + let assets: MultiAssets = + (*assets).try_into().map_err(|()| Error::::InvalidAssets)?; + ensure!(assets.len() == 1, Error::::MaxAssetsLimitReached); + let asset = assets.get(0).unwrap(); + // Deposit assets into `AccountId` that corresponds to the bridge // hub. In this way, Statemine acts as a reserve location to the // bridge, such that it need not trust any consensus system from // `./Parent/Parent/...`. (It may trust Polkadot, but would // Polkadot trust Kusama with its DOT?) - + // Move asset to reserve account for selected bridge + let asset = T::AssetTransactor::transfer_asset( + asset, + &origin_location, + &reserve_account, + // We aren't able to track the XCM that initiated the fee deposit, so we create a + // fake message hash here + &XcmContext::with_message_hash([0; 32]), + ) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "XcmError occurred for origin_location: {:?}, asset: {:?}, error: {:?}", + origin_location, + asset, + e + ); + Self::deposit_event(Event::FailedToReserve(e)); + Error::::FailedToReserve + })?; + + // TODO: reanchor somehow // TODO: xcm - withdraw and fire ReserveAssetDeposited to the other side // TODO: send message through bridge @@ -139,7 +189,7 @@ pub mod pallet { // TODO: prepare ReserveAssetDeposited msg to bridge to the other side? let xcm: Xcm<()> = - sp_std::vec![Instruction::ReserveAssetDeposited(Default::default())].into(); + sp_std::vec![Instruction::ReserveAssetDeposited(asset.into())].into(); // TODO: how to compensate if this call fails? log::info!( @@ -151,7 +201,15 @@ pub mod pallet { // call bridge let (ticket, fees) = T::BridgeXcmSender::validate(&mut Some(remote_destination), &mut Some(xcm)) - .map_err(Self::convert_to_error)?; + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "[BridgeXcmSender::validate] SendError occurred, error: {:?}", + e + ); + Self::deposit_event(Event::BridgeCallError(e)); + Error::::BridgeCallError + })?; log::info!( target: LOG_TARGET, "[T::BridgeXcmSender::validate] (TODO: process) fees: {:?}", @@ -159,7 +217,15 @@ pub mod pallet { ); // TODO: what to do with fees - we have fees here, pay here or ignore? // TODO: use fn send_msg - let xcm_hash = T::BridgeXcmSender::deliver(ticket).map_err(Self::convert_to_error)?; + let xcm_hash = T::BridgeXcmSender::deliver(ticket).map_err(|e| { + log::error!( + target: LOG_TARGET, + "[BridgeXcmSender::deliver] SendError occurred, error: {:?}", + e + ); + Self::deposit_event(Event::BridgeCallError(e)); + Error::::BridgeCallError + })?; Self::deposit_event(Event::TransferInitiated(xcm_hash)); Ok(()) @@ -233,7 +299,7 @@ pub mod pallet { /// Returns: correct remote location, where we should be able to bridge pub(crate) fn ensure_remote_destination( destination: VersionedMultiLocation, - ) -> Result> { + ) -> Result<(BridgeConfig, MultiLocation), Error> { match destination { VersionedMultiLocation::V3(location) => { ensure!(location.parent_count() == 2, Error::::UnsupportedDestination); @@ -245,29 +311,17 @@ pub mod pallet { .global_consensus() .map_err(|_| Error::::UnsupportedDestination)?; ensure!(local_network != remote_network, Error::::UnsupportedDestination); - ensure!( - Bridges::::contains_key(remote_network), - Error::::UnsupportedDestination - ); - Ok(location) + match Bridges::::get(remote_network) { + Some(bridge_config) => Ok((bridge_config, location)), + None => return Err(Error::::UnsupportedDestination), + } }, _ => Err(Error::::UnsupportedDestination), } } - fn convert_to_error(error: SendError) -> Error { - log::error!(target: LOG_TARGET, "SendError occurred, error: {:?}", error); - match error { - SendError::NotApplicable => Error::::BridgeCallError("NotApplicable"), - SendError::Transport(error) => Error::::BridgeCallError(error), - SendError::Unroutable => Error::::BridgeCallError("Unroutable"), - SendError::DestinationUnsupported => - Error::::BridgeCallError("DestinationUnsupported"), - SendError::ExceedsMaxMessageSize => - Error::::BridgeCallError("ExceedsMaxMessageSize"), - SendError::MissingArgument => Error::::BridgeCallError("MissingArgument"), - SendError::Fees => Error::::BridgeCallError("Fees"), - } + fn get_bridge_for(network: &NetworkId) -> Option { + Bridges::::get(network) } } @@ -277,7 +331,7 @@ pub mod pallet { _remote_location: &InteriorMultiLocation, _message: &Xcm<()>, ) -> Option<(MultiLocation, Option)> { - Bridges::::get(network).map(Into::into) + Pallet::::get_bridge_for(network).map(Into::into) } } } @@ -286,16 +340,23 @@ pub mod pallet { mod tests { use super::*; use crate as bridge_assets_transfer; + use frame_support::traits::Currency; use frame_support::{ assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, }; + use polkadot_parachain::primitives::Sibling; use sp_runtime::{ testing::{Header, H256}, traits::{BlakeTwo256, IdentityLookup}, + AccountId32, }; use sp_version::RuntimeVersion; - use xcm_builder::{ExporterFor, UnpaidRemoteExporter}; + use xcm_builder::{ + AccountId32Aliases, CurrencyAdapter, EnsureXcmOrigin, ExporterFor, IsConcrete, + SiblingParachainConvertsVia, SignedToAccountId32, UnpaidRemoteExporter, + }; + use xcm_executor::traits::Convert; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; @@ -307,6 +368,7 @@ mod tests { UncheckedExtrinsic = UncheckedExtrinsic, { System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, BridgeAssetsTransfer: bridge_assets_transfer::{Pallet, Call, Event} = 52, } ); @@ -325,6 +387,8 @@ mod tests { }; } + pub type AccountId = AccountId32; + impl frame_system::Config for TestRuntime { type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; @@ -332,7 +396,7 @@ mod tests { type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; - type AccountId = u64; + type AccountId = AccountId; type Lookup = IdentityLookup; type Header = Header; type RuntimeEvent = RuntimeEvent; @@ -341,7 +405,7 @@ mod tests { type BlockWeights = (); type Version = Version; type PalletInfo = PalletInfo; - type AccountData = (); + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type DbWeight = (); @@ -352,6 +416,23 @@ mod tests { type MaxConsumers = frame_support::traits::ConstU32<16>; } + parameter_types! { + pub const ExistentialDeposit: u64 = 5; + pub const MaxReserves: u32 = 50; + } + + impl pallet_balances::Config for TestRuntime { + type Balance = u64; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxLocks = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; + } + parameter_types! { // UniversalLocation as statemine pub const RelayNetwork: NetworkId = NetworkId::Kusama; @@ -361,6 +442,8 @@ mod tests { (NetworkId::Wococo, (Parent, Parachain(1013)).into(), None), (NetworkId::Polkadot, (Parent, Parachain(1003)).into(), None), ]; + // Relay chain currency/balance location (e.g. KsmLocation, DotLocation, ..) + pub const RelayLocation: MultiLocation = MultiLocation::parent(); } std::thread_local! { @@ -399,32 +482,59 @@ mod tests { pub type TestBridgeXcmSender = UnpaidRemoteExporter; + /// No local origins on this chain are allowed to dispatch XCM sends/executions. + pub type LocalOriginToLocation = SignedToAccountId32; + + pub type LocationToAccountId = ( + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, + ); + + /// Means for transacting the native currency on this chain. + pub type CurrencyTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports of `Balances`. + (), + >; + impl Config for TestRuntime { type RuntimeEvent = RuntimeEvent; type BridgeXcmSender = TestBridgeXcmSender; type UniversalLocation = UniversalLocation; type WeightInfo = (); + type AssetTransactor = CurrencyTransactor; + type TransferXcmOrigin = EnsureXcmOrigin; } pub(crate) fn new_test_ext() -> sp_io::TestExternalities { sp_tracing::try_init_simple(); - frame_system::GenesisConfig::default() - .build_storage::() - .unwrap() - .into() + let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + t.into() + } + + fn account(account: u8) -> AccountId32 { + AccountId32::new([account; 32]) } #[test] fn test_ensure_remote_destination() { new_test_ext().execute_with(|| { // insert bridge config + let bridge_config = + BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), fee: None }; assert_ok!(BridgeAssetsTransfer::add_bridge_config( RuntimeOrigin::root(), Wococo, - Box::new(BridgeConfig { - bridge_location: (Parent, Parachain(1013)).into(), - fee: None - }), + Box::new(bridge_config.clone()), )); // v2 not supported @@ -463,7 +573,10 @@ mod tests { BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1000))) )), - Ok(MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1000)))) + Ok(( + bridge_config, + MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1000))) + )) ); }) } @@ -471,31 +584,62 @@ mod tests { #[test] fn test_transfer_asset_via_bridge_works() { new_test_ext().execute_with(|| { + // initialize some Balances for user_account + let user_account = account(1); + let user_account_init_balance = 1000_u64; + let _ = Balances::deposit_creating(&user_account, user_account_init_balance); + let user_free_balance = Balances::free_balance(&user_account); + let balance_to_transfer = 15_u64; + assert!((user_free_balance - balance_to_transfer) >= ExistentialDeposit::get()); + // insert bridge config + let bridged_network = Wococo; assert_ok!(BridgeAssetsTransfer::add_bridge_config( RuntimeOrigin::root(), - Wococo, + bridged_network, Box::new(BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), fee: None }), )); + let bridge_location = Bridges::::get(bridged_network) + .expect("stored BridgeConfig for bridged_network") + .bridge_location; + // checks before assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); - - let assets = Box::new(VersionedMultiAssets::V3(MultiAssets::default())); + assert_eq!(Balances::free_balance(&user_account), user_account_init_balance); + let bridge_location_as_account = + SiblingParachainConvertsVia::::convert_ref(bridge_location) + .expect("converted bridge location as accountId"); + assert_eq!(Balances::free_balance(&bridge_location_as_account), 0); + + // trigger transfer_asset_via_bridge - should trigger new ROUTED_MESSAGE + let asset = MultiAsset { + fun: Fungible(balance_to_transfer.into()), + id: Concrete(RelayLocation::get()), + }; + + let assets = Box::new(VersionedMultiAssets::V3(asset.into())); let destination = Box::new(VersionedMultiLocation::V3(MultiLocation::new( 2, X2(GlobalConsensus(Wococo), Parachain(1000)), ))); let result = BridgeAssetsTransfer::transfer_asset_via_bridge( - RuntimeOrigin::signed(1), + RuntimeOrigin::signed(account(1)), assets, destination, ); assert_eq!(result, Ok(())); assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_some())); + // check user account decresed + assert_eq!( + Balances::free_balance(&user_account), + user_account_init_balance - balance_to_transfer + ); + // check reserve account increased + assert_eq!(Balances::free_balance(&bridge_location_as_account), 15); }); } @@ -513,7 +657,7 @@ mod tests { // should fail - just root is allowed assert_noop!( BridgeAssetsTransfer::add_bridge_config( - RuntimeOrigin::signed(1), + RuntimeOrigin::signed(account(1)), bridged_network, bridged_config.clone(), ), diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 4fbc4de021c..70b0a68a6ab 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -63,7 +63,10 @@ use parachains_common::{ opaque, AccountId, AssetId, AuraId, Balance, BlockNumber, Hash, Header, Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; -use xcm_config::{BridgeXcmSender, KsmLocation, XcmConfig}; +use xcm_config::{ + AssetTransactors, BridgeXcmSender, KsmLocation, LocalOriginToLocation, UniversalLocation, + XcmConfig, +}; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; @@ -72,9 +75,9 @@ pub use sp_runtime::BuildStorage; use pallet_xcm::{EnsureXcm, IsMajorityOfBody}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use xcm::latest::BodyId; +use xcm_builder::EnsureXcmOrigin; use xcm_executor::XcmExecutor; -use crate::xcm_config::UniversalLocation; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; impl_opaque_keys! { @@ -575,6 +578,8 @@ impl pallet_bridge_assets_transfer::Config for Runtime { type BridgeXcmSender = BridgeXcmSender; type UniversalLocation = UniversalLocation; type WeightInfo = pallet_bridge_assets_transfer::weights::SubstrateWeight; + type AssetTransactor = AssetTransactors; + type TransferXcmOrigin = EnsureXcmOrigin; } // Create the runtime by composing the FRAME pallets that were previously configured. From a7dd1fcd9df381979f84b05d53a52f9d2e7777eb Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 21 Dec 2022 14:03:20 +0100 Subject: [PATCH 022/339] TODO: temporary hack pipelines because of https://github.com/paritytech/devops/issues/2190 --- scripts/ci/gitlab/pipeline/publish.yml | 2 +- scripts/ci/gitlab/pipeline/test.yml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/ci/gitlab/pipeline/publish.yml b/scripts/ci/gitlab/pipeline/publish.yml index 5773bc2b066..fa5c0477cac 100644 --- a/scripts/ci/gitlab/pipeline/publish.yml +++ b/scripts/ci/gitlab/pipeline/publish.yml @@ -2,7 +2,7 @@ # Here are all jobs that are executed during "publish" stage .build-push-image: - image: quay.io/buildah/stable + image: quay.io/buildah/stable:v1.27 variables: DOCKERFILE: "" # docker/path-to.Dockerfile IMAGE_NAME: "" # docker.io/paritypr/image_name diff --git a/scripts/ci/gitlab/pipeline/test.yml b/scripts/ci/gitlab/pipeline/test.yml index 0db2bb554b0..fa3bc5fbd51 100644 --- a/scripts/ci/gitlab/pipeline/test.yml +++ b/scripts/ci/gitlab/pipeline/test.yml @@ -15,7 +15,7 @@ test-linux-stable: # but still want to have debug assertions. RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" script: - - time cargo nextest run --all --release --locked --run-ignored all + - time # cargo nextest run --all --release --locked --run-ignored all test-doc: stage: test @@ -27,7 +27,7 @@ test-doc: # but still want to have debug assertions. RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" script: - - time cargo test --doc + - time # cargo test --doc check-runtime-benchmarks: stage: test @@ -38,7 +38,7 @@ check-runtime-benchmarks: # Check that the node will compile with `runtime-benchmarks` feature flag. - time cargo check --all --features runtime-benchmarks # Check that parachain-template will compile with `runtime-benchmarks` feature flag. - - time cargo check -p parachain-template-node --features runtime-benchmarks + - time # cargo check -p parachain-template-node --features runtime-benchmarks cargo-check-try-runtime: stage: test @@ -53,7 +53,7 @@ cargo-check-try-runtime: # Check that the node will compile with `try-runtime` feature flag. - time cargo check --all --features try-runtime # Check that parachain-template will compile with `try-runtime` feature flag. - - time cargo check -p parachain-template-node --features try-runtime + - time # cargo check -p parachain-template-node --features try-runtime check-rustdoc: stage: test @@ -64,7 +64,7 @@ check-rustdoc: SKIP_WASM_BUILD: 1 RUSTDOCFLAGS: "-Dwarnings" script: - - time cargo +nightly doc --workspace --all-features --verbose --no-deps + - time # cargo +nightly doc --workspace --all-features --verbose --no-deps cargo-check-benches: stage: test @@ -76,4 +76,4 @@ cargo-check-benches: - job: check-rustdoc artifacts: false script: - - time cargo check --all --benches + - time # cargo check --all --benches From 2ff5c4fb4f0ee474764108d3d7be7e601bababc3 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 4 Jan 2023 12:31:31 +0100 Subject: [PATCH 023/339] Allow receive bridged Xcm::Trap on Westmint --- .../runtimes/assets/test-utils/src/lib.rs | 5 ++ .../assets/westmint/src/weights/xcm/mod.rs | 3 +- .../assets/westmint/src/xcm_config.rs | 47 +++++++++++++++++-- .../runtimes/assets/westmint/tests/tests.rs | 43 +++++++++++++++-- 4 files changed, 90 insertions(+), 8 deletions(-) diff --git a/parachains/runtimes/assets/test-utils/src/lib.rs b/parachains/runtimes/assets/test-utils/src/lib.rs index fb4750bae9e..ee7b71131fb 100644 --- a/parachains/runtimes/assets/test-utils/src/lib.rs +++ b/parachains/runtimes/assets/test-utils/src/lib.rs @@ -56,6 +56,11 @@ impl Self { + frame_support::sp_tracing::try_init_simple(); + self + } + pub fn build(self) -> sp_io::TestExternalities where Runtime: diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs b/parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs index 8429b74f2ec..7aed2094c55 100644 --- a/parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs @@ -211,7 +211,8 @@ impl XcmWeightInfo for WestmintXcmWeight { XcmGeneric::::clear_transact_status().ref_time() } fn universal_origin(_: &Junction) -> XCMWeight { - Weight::MAX.ref_time() + // TODO:check-parameter - temporary fix - replace with correct weight for benchmark (set UniversalAliases) + XcmGeneric::::unpaid_execution().ref_time() } fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> XCMWeight { Weight::MAX.ref_time() diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index fee07a16433..f117230db19 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -20,7 +20,7 @@ use super::{ }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing, PalletInfoAccess}, + traits::{ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, PalletInfoAccess}, }; use pallet_xcm::{EnsureXcm, XcmPassthrough}; use parachains_common::{ @@ -39,9 +39,10 @@ use xcm_builder::{ NativeAsset, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, + WithComputedOrigin, }; use xcm_executor::{ - traits::{Convert, JustTry}, + traits::{Convert, JustTry, ShouldExecute}, XcmExecutor, }; @@ -49,7 +50,7 @@ parameter_types! { pub const WestendLocation: MultiLocation = MultiLocation::parent(); pub RelayNetwork: NetworkId = NetworkId::Westend; pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); + pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())); pub const Local: MultiLocation = Here.into_location(); // todo: accept all instances, perhaps need a type for each instance? pub TrustBackedAssetsPalletLocation: MultiLocation = @@ -152,6 +153,12 @@ match_types! { MultiLocation { parents: 1, interior: Here } | MultiLocation { parents: 1, interior: X1(Plurality { .. }) } }; + + // TODO:check-parameter - add new pallet and persist/manage this via governance? + // Means, that we accept some `GlobalConsensus` from some `MultiLocation` (which is supposed to be our bridge-hub) + pub type TrustedBridgedNetworks: impl Contains<(MultiLocation, Junction)> = { + (MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, GlobalConsensus(NetworkId::Rococo)) + }; } pub type Barrier = DenyThenTry< @@ -165,6 +172,8 @@ pub type Barrier = DenyThenTry< AllowKnownQueryResponses, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, + // Specific barrier for bridged calls from different globalConsensus/network + WithComputedOrigin>, ), >; @@ -225,7 +234,7 @@ impl xcm_executor::Config for XcmConfig { type AssetExchanger = (); type FeeManager = (); type MessageExporter = (); - type UniversalAliases = Nothing; + type UniversalAliases = TrustedBridgedNetworks; type CallDispatcher = RuntimeCall; } @@ -302,3 +311,33 @@ impl EnsureOriginWithArg for ForeignCreators { pallet_xcm::Origin::Xcm(a.clone()).into() } } + +pub type BridgedCallsBarrier = ( + // TODO:check-parameter - verify, if we need for production (usefull at least for testing connection in production) + AllowExecutionForTrapFrom, + // Expected responses are OK. + AllowKnownQueryResponses, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, +); + +pub struct AllowExecutionForTrapFrom(sp_std::marker::PhantomData); +impl> ShouldExecute for AllowExecutionForTrapFrom { + fn should_execute( + origin: &MultiLocation, + instructions: &mut [Instruction], + max_weight: xcm::latest::Weight, + _weight_credit: &mut xcm::latest::Weight, + ) -> Result<(), ()> { + log::warn!( + target: "xcm::barriers", + "(TODO:remove-in-production) AllowExecutionForTrapFrom origin: {:?}, instructions: {:?}, max_weight: {:?}, weight_credit: {:?}", + origin, instructions, max_weight, _weight_credit, + ); + + match instructions.first() { + Some(Trap { .. }) => Ok(()), + _ => Err(()), + } + } +} diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 482a60d3b59..a8461b7f5de 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -1,16 +1,17 @@ use asset_test_utils::{ExtBuilder, RuntimeHelper}; +use codec::Encode; use frame_support::{ - assert_noop, assert_ok, + assert_noop, assert_ok, sp_io, traits::PalletInfo, weights::{Weight, WeightToFee as WeightToFeeT}, }; use parachains_common::{AccountId, AuraId}; pub use westmint_runtime::{ constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, Runtime, - SessionKeys, System, TrustBackedAssets, + RuntimeCall, RuntimeEvent, SessionKeys, System, TrustBackedAssets, }; use xcm::latest::prelude::*; -use xcm_executor::traits::WeightTrader; +use xcm_executor::{traits::WeightTrader, XcmExecutor}; pub const ALICE: [u8; 32] = [1u8; 32]; @@ -303,3 +304,39 @@ fn test_that_buying_ed_refund_does_not_refund() { assert_eq!(Assets::total_supply(1), ExistentialDeposit::get()); }); } + +#[test] +fn test_bridged_xcm_trap_works() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .with_tracing() + .build() + .execute_with(|| { + // simulate received message: + // 2022-12-21 14:38:54.047 DEBUG tokio-runtime-worker xcm::execute_xcm: [Parachain] origin: MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, message: Xcm([UniversalOrigin(GlobalConsensus(Rococo)), DescendOrigin(X1(AccountId32 { network: Some(Rococo), id: [28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11, 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124] })), Transact { origin_kind: SovereignAccount, require_weight_at_most: 1000000000, call: [0, 8, 20, 104, 101, 108, 108, 111] }]), weight_limit: 41666666666 + // origin as BridgeHub + let origin = MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; + let xcm = Xcm(vec![ + UniversalOrigin(GlobalConsensus(Rococo)), + DescendOrigin(X1(AccountId32 { + network: Some(Rococo), + id: [ + 28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11, + 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124, + ], + })), + Trap(1234), + ]); + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let weight_limit = 41666666666; + + let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); + log::trace!(target: "xcm::execute", "outcome: {:?}", outcome); + assert_eq!(outcome.ensure_complete(), Err(xcm::latest::Error::Trap(1234))); + }); +} From 18ad58b87b46add8307c449be04c9120ab6b04a1 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 4 Jan 2023 12:32:43 +0100 Subject: [PATCH 024/339] Allow (temporary) Statemine send xcm messages --- parachains/runtimes/assets/statemine/src/xcm_config.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index fe693597508..ef8f2c0e377 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -236,7 +236,9 @@ pub type XcmRouter = ( impl pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; // We want to disallow users sending (arbitrary) XCMs from this chain. - type SendXcmOrigin = EnsureXcmOrigin; + // TODO:check-parameter - temporary fix - allow send XCM messages from here + // TODO:check-parameter - after xcm-v3 rebase, fix/add/find_out kind of filter to allow sending just to BridgeHub? + type SendXcmOrigin = EnsureXcmOrigin; type XcmRouter = XcmRouter; // We support local origins dispatching XCM executions in principle... type ExecuteXcmOrigin = EnsureXcmOrigin; From fe7817e7cd8e76c83fa370825678284337b969f5 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 4 Jan 2023 13:59:52 +0100 Subject: [PATCH 025/339] refactor TrustedBridgedNetworks --- .../assets/westmint/src/xcm_config.rs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index f117230db19..352d2a31ac9 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -153,12 +153,6 @@ match_types! { MultiLocation { parents: 1, interior: Here } | MultiLocation { parents: 1, interior: X1(Plurality { .. }) } }; - - // TODO:check-parameter - add new pallet and persist/manage this via governance? - // Means, that we accept some `GlobalConsensus` from some `MultiLocation` (which is supposed to be our bridge-hub) - pub type TrustedBridgedNetworks: impl Contains<(MultiLocation, Junction)> = { - (MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, GlobalConsensus(NetworkId::Rococo)) - }; } pub type Barrier = DenyThenTry< @@ -312,6 +306,20 @@ impl EnsureOriginWithArg for ForeignCreators { } } +parameter_types! { + // TODO:check-parameter - add new pallet and persist/manage this via governance? + // Means, that we accept some `GlobalConsensus` from some `MultiLocation` (which is supposed to be our bridge-hub) + pub TrustedBridgedNetworks: sp_std::vec::Vec<(MultiLocation, Junction)> = sp_std::vec![ + (MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, GlobalConsensus(NetworkId::Rococo)) + ]; +} + +impl Contains<(MultiLocation, Junction)> for TrustedBridgedNetworks { + fn contains(t: &(MultiLocation, Junction)) -> bool { + Self::get().contains(t) + } +} + pub type BridgedCallsBarrier = ( // TODO:check-parameter - verify, if we need for production (usefull at least for testing connection in production) AllowExecutionForTrapFrom, From a80781e83dc184115caa3ef85aa4e70f2d30f5a9 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 4 Jan 2023 15:38:06 +0100 Subject: [PATCH 026/339] Allow (hacky) xcm::transact for remark/remark_with_event --- .../assets/westmint/src/xcm_config.rs | 98 ++++++++++++++++++- .../runtimes/assets/westmint/tests/tests.rs | 68 ++++++++++++- 2 files changed, 160 insertions(+), 6 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 352d2a31ac9..adee19cc1af 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -20,7 +20,10 @@ use super::{ }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, PalletInfoAccess}, + traits::{ + ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, OriginTrait, + PalletInfoAccess, + }, }; use pallet_xcm::{EnsureXcm, XcmPassthrough}; use parachains_common::{ @@ -30,6 +33,7 @@ use parachains_common::{ }, }; use polkadot_parachain::primitives::{Id as ParaId, Sibling}; +use sp_core::Get; use sp_runtime::traits::ConvertInto; use xcm::latest::prelude::*; use xcm_builder::{ @@ -42,7 +46,7 @@ use xcm_builder::{ WithComputedOrigin, }; use xcm_executor::{ - traits::{Convert, JustTry, ShouldExecute}, + traits::{Convert, ConvertOrigin, JustTry, ShouldExecute}, XcmExecutor, }; @@ -140,6 +144,10 @@ pub type XcmOriginToTransactDispatchOrigin = ( SignedAccountId32AsNative, // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. XcmPassthrough, + // TODO:check-parameter - find a better solution + // Bridged account origins from different globalConsensus converts as SovereignAccount + BridgedSignedAccountId32AsNative, + // TODO: add here alternative for BridgedRelayChainAs... or BridgedParachainAs... ); parameter_types! { @@ -323,6 +331,8 @@ impl Contains<(MultiLocation, Junction)> for TrustedBridgedNetworks { pub type BridgedCallsBarrier = ( // TODO:check-parameter - verify, if we need for production (usefull at least for testing connection in production) AllowExecutionForTrapFrom, + // TODO:check-parameter - verify, if we need for production + AllowExecutionForTransactFrom, // Expected responses are OK. AllowKnownQueryResponses, // Subscriptions for version tracking are OK. @@ -349,3 +359,87 @@ impl> ShouldExecute for AllowExecutionForTrapFrom } } } + +pub struct AllowExecutionForTransactFrom(sp_std::marker::PhantomData); +impl> ShouldExecute for AllowExecutionForTransactFrom { + fn should_execute( + origin: &MultiLocation, + instructions: &mut [Instruction], + max_weight: xcm::latest::Weight, + _weight_credit: &mut xcm::latest::Weight, + ) -> Result<(), ()> { + log::error!( + target: "xcm::barriers", + "(TODO:change/remove-in-production) AllowExecutionForTransactFrom origin: {:?}, instructions: {:?}, max_weight: {:?}, weight_credit: {:?}", + origin, instructions, max_weight, _weight_credit, + ); + + match instructions.first() { + // TODO:check-parameter - filter just remark/remark_with_event + Some(Transact { .. }) => Ok(()), + _ => Err(()), + } + } +} + +pub struct BridgedSignedAccountId32AsNative( + sp_std::marker::PhantomData<(LocationConverter, RuntimeOrigin, BridgedNetworks)>, +); +impl< + LocationConverter: Convert, + RuntimeOrigin: OriginTrait, + BridgedNetworks: Get>, + > ConvertOrigin + for BridgedSignedAccountId32AsNative +where + RuntimeOrigin::AccountId: Clone, +{ + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + let origin = origin.into(); + if let OriginKind::SovereignAccount = kind { + match origin { + MultiLocation { + parents: 2, + interior: + X2( + GlobalConsensus(remote_network), + AccountId32 { network: Some(account_remote_network), id: _id }, + ), + } => { + // TODO:check-parameter - hack - configured local bridge-hub behaves on behalf of any origin from configured bridged network (just to pass Transact/System::remark_with_event - ensure_signed) + // find configured local bridge_hub for remote network + let bridge_hub_location = BridgedNetworks::get() + .iter() + .find(|(_, configured_bridged_network)| match configured_bridged_network { + GlobalConsensus(bridged_network) => + bridged_network.eq(&account_remote_network) && + bridged_network.eq(&remote_network), + _ => false, + }) + .map(|(bridge_hub_location, _)| bridge_hub_location.clone()); + + // try to convert local bridge-hub location + match bridge_hub_location { + Some(bridge_hub_location) => { + let new_origin = bridge_hub_location; + log::error!( + target: "xcm::origin_conversion", + "BridgedSignedAccountId32AsNative replacing origin: {:?} to new_origin: {:?}, kind: {:?}", + origin, new_origin, kind, + ); + let location = LocationConverter::convert(new_origin)?; + Ok(RuntimeOrigin::signed(location).into()) + }, + _ => Err(origin), + } + }, + _ => Err(origin), + } + } else { + Err(origin) + } + } +} diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index a8461b7f5de..5bad97a034a 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -7,8 +7,10 @@ use frame_support::{ }; use parachains_common::{AccountId, AuraId}; pub use westmint_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, Runtime, - RuntimeCall, RuntimeEvent, SessionKeys, System, TrustBackedAssets, + constants::fee::WeightToFee, + xcm_config::{LocationToAccountId, XcmConfig}, + Balances, ExistentialDeposit, Runtime, RuntimeCall, RuntimeEvent, SessionKeys, System, + TrustBackedAssets, }; use xcm::latest::prelude::*; use xcm_executor::{traits::WeightTrader, XcmExecutor}; @@ -306,7 +308,66 @@ fn test_that_buying_ed_refund_does_not_refund() { } #[test] -fn test_bridged_xcm_trap_works() { +fn test_receive_bridged_xcm_transact_with_remark_with_event_works() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .with_tracing() + .build() + .execute_with(|| { + let remark_with_event: RuntimeCall = + RuntimeCall::System(frame_system::Call::::remark_with_event { + remark: b"Hello".to_vec(), + }); + + // simulate received message: + // 2022-12-21 14:38:54.047 DEBUG tokio-runtime-worker xcm::execute_xcm: [Parachain] origin: MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, message: Xcm([UniversalOrigin(GlobalConsensus(Rococo)), DescendOrigin(X1(AccountId32 { network: Some(Rococo), id: [28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11, 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124] })), Transact { origin_kind: SovereignAccount, require_weight_at_most: 1000000000, call: [0, 8, 20, 104, 101, 108, 108, 111] }]), weight_limit: 41666666666 + // origin as local BridgeHub (Wococo) + let origin = MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; + let xcm = Xcm(vec![ + UniversalOrigin(GlobalConsensus(Rococo)), + DescendOrigin(X1(AccountId32 { + network: Some(Rococo), + id: [ + 28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11, + 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124, + ], + })), + Transact { + origin_kind: OriginKind::SovereignAccount, + require_weight_at_most: 1000000000, + call: remark_with_event.encode().into(), + }, + ]); + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let weight_limit = 41666666666; + + let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); + assert_eq!(outcome.ensure_complete(), Ok(())); + + // check Event::Remarked occured + let events = System::events(); + assert!(!events.is_empty()); + + let expected_event = { + use sp_runtime::traits::Hash; + use xcm_executor::traits::Convert; + RuntimeEvent::System(frame_system::Event::Remarked { + hash: ::Hashing::hash(b"Hello"), + // origin should match here according to [`BridgedSignedAccountId32AsNative`] + sender: LocationToAccountId::convert(origin).unwrap(), + }) + }; + assert!(System::events().iter().any(|r| r.event == expected_event)); + }); +} + +#[test] +fn test_receive_bridged_xcm_trap_works() { ExtBuilder::::default() .with_collators(vec![AccountId::from(ALICE)]) .with_session_keys(vec![( @@ -336,7 +397,6 @@ fn test_bridged_xcm_trap_works() { let weight_limit = 41666666666; let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); - log::trace!(target: "xcm::execute", "outcome: {:?}", outcome); assert_eq!(outcome.ensure_complete(), Err(xcm::latest::Error::Trap(1234))); }); } From 0985898e458bcd15e997856d95960ea2290128ec Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 5 Jan 2023 11:19:22 +0100 Subject: [PATCH 027/339] Unit-test for Statemine - send_xcm_transact_with_remark_with_event_works --- Cargo.lock | 8 ++ .../runtimes/assets/statemine/src/lib.rs | 2 +- .../runtimes/assets/statemine/tests/tests.rs | 68 +++++++++- .../runtimes/assets/test-utils/Cargo.toml | 18 +++ .../runtimes/assets/test-utils/src/lib.rs | 121 +++++++++++++++++- .../runtimes/assets/westmint/src/lib.rs | 2 +- 6 files changed, 207 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf9e0f88e76..d012687599f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -190,19 +190,27 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" name = "asset-test-utils" version = "1.0.0" dependencies = [ + "cumulus-pallet-parachain-system", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-test-relay-sproof-builder", "frame-support", "frame-system", "hex-literal", "pallet-balances", "pallet-collator-selection", "pallet-session", + "pallet-xcm", + "parachain-info", "parachains-common", + "polkadot-parachain 0.9.31", "sp-consensus-aura", "sp-core", "sp-io", "sp-runtime", "sp-std", "substrate-wasm-builder", + "xcm", ] [[package]] diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 70b0a68a6ab..080bb046a39 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -91,7 +91,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 9300, + spec_version: 9301, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 8, diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index ab2d2e80620..811c90d0f85 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -1,4 +1,4 @@ -use asset_test_utils::{ExtBuilder, RuntimeHelper}; +use asset_test_utils::{mock_open_hrmp_channel, ExtBuilder, RuntimeHelper}; use frame_support::{ assert_noop, assert_ok, traits::PalletInfo, @@ -6,10 +6,11 @@ use frame_support::{ }; use parachains_common::{AccountId, AuraId}; pub use statemine_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, Runtime, - SessionKeys, System, TrustBackedAssets, + constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, + ParachainSystem, PolkadotXcm, Runtime, RuntimeEvent, RuntimeOrigin, SessionKeys, System, + TrustBackedAssets, }; -use xcm::latest::prelude::*; +use xcm::{latest::prelude::*, VersionedMultiLocation, VersionedXcm}; use xcm_executor::traits::WeightTrader; pub const ALICE: [u8; 32] = [1u8; 32]; @@ -304,3 +305,62 @@ fn test_that_buying_ed_refund_does_not_refund() { assert_eq!(Assets::total_supply(1), ExistentialDeposit::get()); }); } + +#[test] +fn test_send_xcm_transact_with_remark_with_event_works() { + let runtime_para_id = 1015; + let bridge_hub_para_id = 1013; + + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .with_tracing() + .with_safe_xcm_version(3) + .with_para_id(runtime_para_id.into()) + .build() + .execute_with(|| { + // open hrmp channel + mock_open_hrmp_channel::( + runtime_para_id.into(), + bridge_hub_para_id.into(), + ); + + // prepare xcm message with Transact + let message = Xcm(vec![ExportMessage { + network: Wococo, + destination: X1(Parachain(1000)), + xcm: Xcm(vec![Transact { + origin_kind: OriginKind::SovereignAccount, + require_weight_at_most: 1000000000, + call: vec![0, 8, 20, 104, 101, 108, 108, 111].into(), + }]), + }]); + + // simulate send export_message to bridge-hub + assert_ok!(PolkadotXcm::send( + RuntimeOrigin::signed(AccountId::from(ALICE)), + Box::new(VersionedMultiLocation::V3(MultiLocation { + parents: 1, + interior: X1(Parachain(bridge_hub_para_id)) + })), + Box::new(VersionedXcm::from(message.clone())) + )); + + // check xcm sent-like events occured + let events = System::events(); + assert!(!events.is_empty()); + + assert!(System::events().iter().any(|r| matches!( + r.event, + RuntimeEvent::PolkadotXcm(pallet_xcm::Event::Sent(..)) + ))); + assert!(System::events().iter().any(|r| matches!( + r.event, + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) + ))); + }); +} diff --git a/parachains/runtimes/assets/test-utils/Cargo.toml b/parachains/runtimes/assets/test-utils/Cargo.toml index 52ce1d2d9a8..f7e3a768def 100644 --- a/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/parachains/runtimes/assets/test-utils/Cargo.toml @@ -22,6 +22,16 @@ sp-core = { git = "https://github.com/paritytech/substrate", default-features = # Cumulus pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachains-common = { path = "../../../common", default-features = false } +cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } +cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } +cumulus-primitives-parachain-inherent = { path = "../../../../primitives/parachain-inherent", default-features = false } +cumulus-test-relay-sproof-builder = { path = "../../../../test/relay-sproof-builder", default-features = false } +parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } + +# Polkadot +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } [dev-dependencies] hex-literal = "0.3.4" @@ -32,14 +42,22 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [features] default = [ "std" ] std = [ + "cumulus-pallet-parachain-system/std", + "cumulus-primitives-core/std", + "cumulus-test-relay-sproof-builder/std", + "cumulus-primitives-parachain-inherent/std", "frame-support/std", "frame-system/std", "pallet-balances/std", "pallet-collator-selection/std", "pallet-session/std", + "pallet-xcm/std", "parachains-common/std", + "parachain-info/std", + "polkadot-parachain/std", "sp-consensus-aura/std", "sp-io/std", "sp-runtime/std", "sp-std/std", + "xcm/std", ] diff --git a/parachains/runtimes/assets/test-utils/src/lib.rs b/parachains/runtimes/assets/test-utils/src/lib.rs index ee7b71131fb..eaba572b14b 100644 --- a/parachains/runtimes/assets/test-utils/src/lib.rs +++ b/parachains/runtimes/assets/test-utils/src/lib.rs @@ -1,11 +1,20 @@ -use frame_support::traits::GenesisBuild; +use cumulus_primitives_core::{AbridgedHrmpChannel, ParaId, PersistedValidationData}; +use cumulus_primitives_parachain_inherent::ParachainInherentData; +use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; +use frame_support::{ + dispatch::{RawOrigin, UnfilteredDispatchable}, + inherent::{InherentData, ProvideInherent}, + traits::GenesisBuild, +}; use sp_std::marker::PhantomData; use frame_support::traits::OriginTrait; use parachains_common::AccountId; +use polkadot_parachain::primitives::{HrmpChannelId, RelayChainBlockNumber}; use sp_consensus_aura::AURA_ENGINE_ID; use sp_core::Encode; use sp_runtime::{Digest, DigestItem}; +use xcm::prelude::XcmVersion; pub type BalanceOf = ::Balance; pub type AccountIdOf = ::AccountId; @@ -22,19 +31,39 @@ pub struct ExtBuilder< collators: Vec>, // keys added to pallet session keys: Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)>, + // safe xcm version for pallet_xcm + safe_xcm_version: Option, + // para id + para_id: Option, _runtime: PhantomData, } -impl Default - for ExtBuilder +impl< + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config, + > Default for ExtBuilder { fn default() -> ExtBuilder { - ExtBuilder { balances: vec![], collators: vec![], keys: vec![], _runtime: PhantomData } + ExtBuilder { + balances: vec![], + collators: vec![], + keys: vec![], + safe_xcm_version: None, + para_id: None, + _runtime: PhantomData, + } } } -impl - ExtBuilder +impl< + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config, + > ExtBuilder { pub fn with_balances( mut self, @@ -61,6 +90,16 @@ impl Self { + self.safe_xcm_version = Some(safe_xcm_version); + self + } + + pub fn with_para_id(mut self, para_id: ParaId) -> Self { + self.para_id = Some(para_id); + self + } + pub fn build(self) -> sp_io::TestExternalities where Runtime: @@ -69,6 +108,20 @@ impl().unwrap(); + >::assimilate_storage( + &pallet_xcm::GenesisConfig { safe_xcm_version: self.safe_xcm_version }, + &mut t, + ) + .unwrap(); + + if let Some(para_id) = self.para_id { + >::assimilate_storage( + ¶chain_info::GenesisConfig { parachain_id: para_id }, + &mut t, + ) + .unwrap(); + } + pallet_balances::GenesisConfig:: { balances: self.balances.into() } .assimilate_storage(&mut t) .unwrap(); @@ -137,3 +190,59 @@ where ::RuntimeOrigin::signed(account_id.into()) } } + +/// Helper function which emulates opening HRMP channel which is needed for XcmpQueue xcm router to pass +pub fn mock_open_hrmp_channel< + C: cumulus_pallet_parachain_system::Config, + T: ProvideInherent>, +>( + sender: ParaId, + recipient: ParaId, +) { + let n = 1_u32; + let mut sproof_builder = RelayStateSproofBuilder::default(); + sproof_builder.para_id = sender; + sproof_builder.hrmp_channels.insert( + HrmpChannelId { sender, recipient }, + AbridgedHrmpChannel { + max_capacity: 10, + max_total_size: 10_000_000_u32, + max_message_size: 10_000_000_u32, + msg_count: 10, + total_size: 10_000_000_u32, + mqc_head: None, + }, + ); + sproof_builder.hrmp_egress_channel_index = Some(vec![recipient]); + + let (relay_parent_storage_root, relay_chain_state) = sproof_builder.into_state_root_and_proof(); + let vfp = PersistedValidationData { + relay_parent_number: n as RelayChainBlockNumber, + relay_parent_storage_root, + ..Default::default() + }; + // It is insufficient to push the validation function params + // to storage; they must also be included in the inherent data. + let inherent_data = { + let mut inherent_data = InherentData::default(); + let system_inherent_data = ParachainInherentData { + validation_data: vfp.clone(), + relay_chain_state, + downward_messages: Default::default(), + horizontal_messages: Default::default(), + }; + inherent_data + .put_data( + cumulus_primitives_parachain_inherent::INHERENT_IDENTIFIER, + &system_inherent_data, + ) + .expect("failed to put VFP inherent"); + inherent_data + }; + + // execute the block + T::create_inherent(&inherent_data) + .expect("got an inherent") + .dispatch_bypass_filter(RawOrigin::None.into()) + .expect("dispatch succeeded"); +} diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index d446d4807da..8b1d174f238 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westmint"), impl_name: create_runtime_str!("westmint"), authoring_version: 1, - spec_version: 9300, + spec_version: 9301, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 8, From c3195d205be488cf09b02db2f968f856d857d138 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 5 Jan 2023 23:10:42 +0100 Subject: [PATCH 028/339] Fix for BridgedSignedAccountId32AsNative --- .../runtimes/assets/statemine/src/lib.rs | 2 +- .../runtimes/assets/westmint/src/lib.rs | 2 +- .../assets/westmint/src/xcm_config.rs | 22 +++++++++++++++---- .../runtimes/assets/westmint/tests/tests.rs | 18 +++++++++------ 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 080bb046a39..712ef3a0bae 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -91,7 +91,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 9301, + spec_version: 9302, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 8, diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 8b1d174f238..e4205db8fdb 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westmint"), impl_name: create_runtime_str!("westmint"), authoring_version: 1, - spec_version: 9301, + spec_version: 9302, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 8, diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index adee19cc1af..cf02b4bd722 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -399,24 +399,38 @@ where kind: OriginKind, ) -> Result { let origin = origin.into(); + log::trace!( + target: "xcm::origin_conversion", + "BridgedSignedAccountId32AsNative origin: {:?}, kind: {:?}", + origin, kind, + ); if let OriginKind::SovereignAccount = kind { match origin { + // this represents remote relaychain MultiLocation { parents: 2, interior: X2( GlobalConsensus(remote_network), - AccountId32 { network: Some(account_remote_network), id: _id }, + AccountId32 { network: _network, id: _id }, ), + } | + // this represents remote parachain + MultiLocation { + parents: 2, + interior: + X3( + GlobalConsensus(remote_network), + Parachain(_), + AccountId32 { network: _network, id: _id }, + ), } => { // TODO:check-parameter - hack - configured local bridge-hub behaves on behalf of any origin from configured bridged network (just to pass Transact/System::remark_with_event - ensure_signed) // find configured local bridge_hub for remote network let bridge_hub_location = BridgedNetworks::get() .iter() .find(|(_, configured_bridged_network)| match configured_bridged_network { - GlobalConsensus(bridged_network) => - bridged_network.eq(&account_remote_network) && - bridged_network.eq(&remote_network), + GlobalConsensus(bridged_network) => bridged_network.eq(&remote_network), _ => false, }) .map(|(bridge_hub_location, _)| bridge_hub_location.clone()); diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 5bad97a034a..27a75ac05e9 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -330,13 +330,17 @@ fn test_receive_bridged_xcm_transact_with_remark_with_event_works() { let origin = MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; let xcm = Xcm(vec![ UniversalOrigin(GlobalConsensus(Rococo)), - DescendOrigin(X1(AccountId32 { - network: Some(Rococo), - id: [ - 28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11, - 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124, - ], - })), + DescendOrigin(X2( + Parachain(1000), + AccountId32 { + network: Some(Rococo), + id: [ + 28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, + 11, 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, + 124, + ], + }, + )), Transact { origin_kind: OriginKind::SovereignAccount, require_weight_at_most: 1000000000, From 3353263c923529aa9e40f3f3936ad80740671851 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Wed, 11 Jan 2023 19:41:18 +0100 Subject: [PATCH 029/339] don't rename pallet in runtime --- .../runtimes/assets/statemine/src/lib.rs | 47 ++++++++--------- .../assets/statemine/src/xcm_config.rs | 10 ++-- .../runtimes/assets/statemine/tests/tests.rs | 4 +- .../runtimes/assets/statemint/src/lib.rs | 45 +++++++---------- .../assets/statemint/src/xcm_config.rs | 8 +-- .../runtimes/assets/westmint/src/lib.rs | 50 ++++++++----------- .../assets/westmint/src/xcm_config.rs | 10 ++-- .../runtimes/assets/westmint/tests/tests.rs | 4 +- 8 files changed, 77 insertions(+), 101 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 2a2e1fce7cc..b365fb219ea 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -329,7 +329,7 @@ impl InstanceFilter for ProxyType { ProxyType::NonTransfer => !matches!( c, RuntimeCall::Balances { .. } | - RuntimeCall::TrustBackedAssets { .. } | + RuntimeCall::Assets { .. } | RuntimeCall::Uniques { .. } ), ProxyType::CancelProxy => matches!( @@ -341,7 +341,7 @@ impl InstanceFilter for ProxyType { ProxyType::Assets => { matches!( c, - RuntimeCall::TrustBackedAssets { .. } | + RuntimeCall::Assets { .. } | RuntimeCall::Utility { .. } | RuntimeCall::Multisig { .. } | RuntimeCall::Uniques { .. } @@ -349,13 +349,13 @@ impl InstanceFilter for ProxyType { }, ProxyType::AssetOwner => matches!( c, - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::create { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::destroy { .. }) | - RuntimeCall::TrustBackedAssets( + RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::destroy { .. }) | + RuntimeCall::Assets( TrustBackedAssetsCall::transfer_ownership { .. } - ) | RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_team { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_metadata { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::clear_metadata { .. }) | + ) | RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | @@ -372,12 +372,12 @@ impl InstanceFilter for ProxyType { ), ProxyType::AssetManager => matches!( c, - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::mint { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::burn { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze_asset { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw_asset { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::mint { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::burn { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::freeze { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::thaw { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::freeze_asset { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::thaw_asset { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | @@ -525,7 +525,7 @@ impl pallet_asset_tx_payment::Config for Runtime { // TODO https://github.com/paritytech/substrate/issues/12724 // This should be able to take assets from any pallet instance. For now we only allow // sufficient, trust backed assets to pay for transaction fees. - type Fungibles = TrustBackedAssets; + type Fungibles = Assets; type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< pallet_assets::BalanceToAssetBalance< Balances, @@ -609,7 +609,7 @@ construct_runtime!( Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, // The main stage. - TrustBackedAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, + Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, } ); @@ -638,6 +638,8 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Migrations to apply on runtime upgrade. +pub type Migrations = (); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -645,18 +647,9 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, - MigrateAssetsPallet, + Migrations, >; -pub struct MigrateAssetsPallet; -impl frame_support::traits::OnRuntimeUpgrade for MigrateAssetsPallet { - fn on_runtime_upgrade() -> Weight { - use frame_support::storage::migration; - migration::move_pallet(b"Assets", b"TrustBackedAssets"); - ::DbWeight::get().writes(1) - } -} - #[cfg(feature = "runtime-benchmarks")] #[macro_use] extern crate frame_benchmarking; @@ -665,7 +658,7 @@ extern crate frame_benchmarking; mod benches { define_benchmarks!( [frame_system, SystemBench::] - [pallet_assets, TrustBackedAssets] + [pallet_assets, Assets] [pallet_balances, Balances] [pallet_multisig, Multisig] [pallet_proxy, Proxy] diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index e23808d7170..6b6a4247e67 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -16,7 +16,7 @@ use super::{ AccountId, AllPalletsWithSystem, AssetId, Authorship, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - TrustBackedAssets, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + Assets, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, @@ -49,7 +49,7 @@ parameter_types! { pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); pub const Local: MultiLocation = Here.into_location(); pub TrustBackedAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); + PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } @@ -82,7 +82,7 @@ pub type CurrencyTransactor = CurrencyAdapter< /// Means for transacting assets besides the native currency on this chain. pub type FungiblesTransactor = FungiblesAdapter< // Use this fungibles implementation: - TrustBackedAssets, + Assets, // Use this currency when it is a fungible asset matching the given location or name: ConvertedConcreteId< AssetId, @@ -96,7 +96,7 @@ pub type FungiblesTransactor = FungiblesAdapter< AccountId, // We only want to allow teleports of known assets. We use non-zero issuance as an indication // that this asset is known. - parachains_common::impls::NonZeroIssuance, + parachains_common::impls::NonZeroIssuance, // The account to use for tracking teleports. CheckingAccount, >; @@ -197,7 +197,7 @@ impl xcm_executor::Config for XcmConfig { AsPrefixedGeneralIndex, JustTry, >, - TrustBackedAssets, + Assets, cumulus_primitives_utility::XcmFeesTo32ByteAccount< FungiblesTransactor, AccountId, diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index ab2d2e80620..db4058ec645 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -7,13 +7,13 @@ use frame_support::{ use parachains_common::{AccountId, AuraId}; pub use statemine_runtime::{ constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, Runtime, - SessionKeys, System, TrustBackedAssets, + SessionKeys, System, Assets, }; use xcm::latest::prelude::*; use xcm_executor::traits::WeightTrader; pub const ALICE: [u8; 32] = [1u8; 32]; -type Assets = TrustBackedAssets; +type Assets = Assets; #[test] fn test_asset_xcm_trader() { diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index 4f039309ddf..f0335bc1d84 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -359,7 +359,7 @@ impl InstanceFilter for ProxyType { ProxyType::NonTransfer => !matches!( c, RuntimeCall::Balances { .. } | - RuntimeCall::TrustBackedAssets { .. } | + RuntimeCall::Assets { .. } | RuntimeCall::Uniques { .. } ), ProxyType::CancelProxy => matches!( @@ -371,7 +371,7 @@ impl InstanceFilter for ProxyType { ProxyType::Assets => { matches!( c, - RuntimeCall::TrustBackedAssets { .. } | + RuntimeCall::Assets { .. } | RuntimeCall::Utility { .. } | RuntimeCall::Multisig { .. } | RuntimeCall::Uniques { .. } @@ -379,13 +379,13 @@ impl InstanceFilter for ProxyType { }, ProxyType::AssetOwner => matches!( c, - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::create { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::destroy { .. }) | - RuntimeCall::TrustBackedAssets( + RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::destroy { .. }) | + RuntimeCall::Assets( TrustBackedAssetsCall::transfer_ownership { .. } - ) | RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_team { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_metadata { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::clear_metadata { .. }) | + ) | RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | @@ -402,12 +402,12 @@ impl InstanceFilter for ProxyType { ), ProxyType::AssetManager => matches!( c, - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::mint { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::burn { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze_asset { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw_asset { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::mint { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::burn { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::freeze { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::thaw { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::freeze_asset { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::thaw_asset { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | @@ -552,7 +552,7 @@ impl pallet_collator_selection::Config for Runtime { impl pallet_asset_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type Fungibles = TrustBackedAssets; + type Fungibles = Assets; type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< pallet_assets::BalanceToAssetBalance< Balances, @@ -636,7 +636,7 @@ construct_runtime!( Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, // The main stage. - TrustBackedAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, + Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, } ); @@ -665,6 +665,8 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Migrations to apply on runtime upgrade. +pub type Migrations = (); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -672,18 +674,9 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, - MigrateAssetsPallet, + Migrations, >; -pub struct MigrateAssetsPallet; -impl frame_support::traits::OnRuntimeUpgrade for MigrateAssetsPallet { - fn on_runtime_upgrade() -> Weight { - use frame_support::storage::migration; - migration::move_pallet(b"Assets", b"TrustBackedAssets"); - ::DbWeight::get().writes(1) - } -} - #[cfg(feature = "runtime-benchmarks")] #[macro_use] extern crate frame_benchmarking; diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index 5f8d419c446..4fa599834a3 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -16,7 +16,7 @@ use super::{ AccountId, AllPalletsWithSystem, AssetId, Authorship, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - TrustBackedAssets, WeightToFee, XcmpQueue, + Assets, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, @@ -46,7 +46,7 @@ parameter_types! { pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); pub const Local: MultiLocation = MultiLocation::here(); pub TrustBackedAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); + PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } @@ -79,7 +79,7 @@ pub type CurrencyTransactor = CurrencyAdapter< /// Means for transacting assets besides the native currency on this chain. pub type FungiblesTransactor = FungiblesAdapter< // Use this fungibles implementation: - TrustBackedAssets, + Assets, // Use this currency when it is a fungible asset matching the given location or name: ConvertedConcreteId< AssetId, @@ -93,7 +93,7 @@ pub type FungiblesTransactor = FungiblesAdapter< AccountId, // We only want to allow teleports of known assets. We use non-zero issuance as an indication // that this asset is known. - parachains_common::impls::NonZeroIssuance, + parachains_common::impls::NonZeroIssuance, // The account to use for tracking teleports. CheckingAccount, >; diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index d446d4807da..8a649398b30 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -351,7 +351,7 @@ impl InstanceFilter for ProxyType { ProxyType::NonTransfer => !matches!( c, RuntimeCall::Balances { .. } | - RuntimeCall::TrustBackedAssets { .. } | + RuntimeCall::Assets { .. } | RuntimeCall::Uniques { .. } ), ProxyType::CancelProxy => matches!( @@ -363,7 +363,7 @@ impl InstanceFilter for ProxyType { ProxyType::Assets => { matches!( c, - RuntimeCall::TrustBackedAssets { .. } | + RuntimeCall::Assets { .. } | RuntimeCall::Utility { .. } | RuntimeCall::Multisig { .. } | RuntimeCall::Uniques { .. } @@ -371,13 +371,13 @@ impl InstanceFilter for ProxyType { }, ProxyType::AssetOwner => matches!( c, - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::create { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::destroy { .. }) | - RuntimeCall::TrustBackedAssets( + RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::destroy { .. }) | + RuntimeCall::Assets( TrustBackedAssetsCall::transfer_ownership { .. } - ) | RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_team { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::set_metadata { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::clear_metadata { .. }) | + ) | RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | @@ -394,12 +394,12 @@ impl InstanceFilter for ProxyType { ), ProxyType::AssetManager => matches!( c, - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::mint { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::burn { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::freeze_asset { .. }) | - RuntimeCall::TrustBackedAssets(TrustBackedAssetsCall::thaw_asset { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::mint { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::burn { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::freeze { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::thaw { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::freeze_asset { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::thaw_asset { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | @@ -542,7 +542,7 @@ impl pallet_asset_tx_payment::Config for Runtime { // TODO https://github.com/paritytech/substrate/issues/12724 // This should be able to take assets from any pallet instance. For now we only allow // sufficient, trust backed assets to pay for transaction fees. - type Fungibles = TrustBackedAssets; + type Fungibles = Assets; type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< pallet_assets::BalanceToAssetBalance< Balances, @@ -626,7 +626,7 @@ construct_runtime!( Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, // The main stage. - TrustBackedAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, + Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 52, } @@ -656,6 +656,8 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Migrations to apply on runtime upgrade. +pub type Migrations = (); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -663,21 +665,9 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, - // TODO - // 1. Move this instance https://substrate.stackexchange.com/questions/4343/how-to-migrate-storage-from-a-default-pallet-instance-to-an-actual-one - // 2. Make sure this migration applies to the old instance - MigrateAssetsPallet, //pallet_assets::migration::v1::MigrateToV1, + Migrations, >; -pub struct MigrateAssetsPallet; -impl frame_support::traits::OnRuntimeUpgrade for MigrateAssetsPallet { - fn on_runtime_upgrade() -> Weight { - use frame_support::storage::migration; - migration::move_pallet(b"Assets", b"TrustBackedAssets"); - ::DbWeight::get().writes(1) - } -} - #[cfg(feature = "runtime-benchmarks")] #[macro_use] extern crate frame_benchmarking; @@ -686,7 +676,7 @@ extern crate frame_benchmarking; mod benches { define_benchmarks!( [frame_system, SystemBench::] - [pallet_assets, TrustBackedAssets] + [pallet_assets, Assets] [pallet_assets, ForeignAssets] [pallet_balances, Balances] [pallet_multisig, Multisig] diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index fee07a16433..7ef9122e900 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -16,7 +16,7 @@ use super::{ AccountId, AllPalletsWithSystem, AssetId, Authorship, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - TrustBackedAssets, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + Assets, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, @@ -53,7 +53,7 @@ parameter_types! { pub const Local: MultiLocation = Here.into_location(); // todo: accept all instances, perhaps need a type for each instance? pub TrustBackedAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); + PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } @@ -96,7 +96,7 @@ pub type CurrencyTransactor = CurrencyAdapter< /// Means for transacting assets besides the native currency on this chain. pub type FungiblesTransactor = FungiblesAdapter< // Use this fungibles implementation: - TrustBackedAssets, // todo: accept all instances + Assets, // todo: accept all instances // Use this currency when it is a fungible asset matching the given location or name: ConvertedConcreteId< AssetId, @@ -110,7 +110,7 @@ pub type FungiblesTransactor = FungiblesAdapter< AccountId, // We only want to allow teleports of known assets. We use non-zero issuance as an indication // that this asset is known. - parachains_common::impls::NonZeroIssuance, // todo: accept all instances + parachains_common::impls::NonZeroIssuance, // todo: accept all instances // The account to use for tracking teleports. CheckingAccount, >; @@ -207,7 +207,7 @@ impl xcm_executor::Config for XcmConfig { AsPrefixedGeneralIndex, // todo: accept all instances JustTry, >, - TrustBackedAssets, // todo: accept all instances + Assets, // todo: accept all instances cumulus_primitives_utility::XcmFeesTo32ByteAccount< FungiblesTransactor, AccountId, diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 482a60d3b59..13e7cbf1070 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -7,14 +7,14 @@ use frame_support::{ use parachains_common::{AccountId, AuraId}; pub use westmint_runtime::{ constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, Runtime, - SessionKeys, System, TrustBackedAssets, + SessionKeys, System, Assets, }; use xcm::latest::prelude::*; use xcm_executor::traits::WeightTrader; pub const ALICE: [u8; 32] = [1u8; 32]; -type Assets = TrustBackedAssets; +type Assets = Assets; #[test] fn test_asset_xcm_trader() { From 9e211b8ed2d70c941c8085488f7bad547736e449 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Wed, 11 Jan 2023 20:54:33 +0100 Subject: [PATCH 030/339] don't rename and fix tests --- parachains/runtimes/assets/statemine/src/lib.rs | 5 ++--- parachains/runtimes/assets/statemine/src/xcm_config.rs | 4 ++-- parachains/runtimes/assets/statemine/tests/tests.rs | 6 ++---- parachains/runtimes/assets/statemint/src/lib.rs | 5 ++--- parachains/runtimes/assets/statemint/src/xcm_config.rs | 6 +++--- parachains/runtimes/assets/westmint/src/lib.rs | 7 +++---- parachains/runtimes/assets/westmint/src/xcm_config.rs | 4 ++-- parachains/runtimes/assets/westmint/tests/tests.rs | 6 ++---- 8 files changed, 18 insertions(+), 25 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index b365fb219ea..efd149a6506 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -351,9 +351,8 @@ impl InstanceFilter for ProxyType { c, RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::destroy { .. }) | - RuntimeCall::Assets( - TrustBackedAssetsCall::transfer_ownership { .. } - ) | RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::transfer_ownership { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 6b6a4247e67..e346e8b7f45 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -14,9 +14,9 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, AssetId, Authorship, Balance, Balances, ParachainInfo, + AccountId, AllPalletsWithSystem, AssetId, Assets, Authorship, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - Assets, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index db4058ec645..974f89ec1ee 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -6,15 +6,13 @@ use frame_support::{ }; use parachains_common::{AccountId, AuraId}; pub use statemine_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, Runtime, - SessionKeys, System, Assets, + constants::fee::WeightToFee, xcm_config::XcmConfig, Assets, Balances, ExistentialDeposit, + Runtime, SessionKeys, System, }; use xcm::latest::prelude::*; use xcm_executor::traits::WeightTrader; pub const ALICE: [u8; 32] = [1u8; 32]; -type Assets = Assets; - #[test] fn test_asset_xcm_trader() { ExtBuilder::::default() diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index f0335bc1d84..2deca27b226 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -381,9 +381,8 @@ impl InstanceFilter for ProxyType { c, RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::destroy { .. }) | - RuntimeCall::Assets( - TrustBackedAssetsCall::transfer_ownership { .. } - ) | RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::transfer_ownership { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index 4fa599834a3..0fdfa44d010 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -14,9 +14,9 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, AssetId, Authorship, Balance, Balances, ParachainInfo, - ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - Assets, WeightToFee, XcmpQueue, + AccountId, AllPalletsWithSystem, AssetId, Assets, Authorship, Balance, Balances, ParachainInfo, + ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, + XcmpQueue, }; use frame_support::{ match_types, parameter_types, diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 8a649398b30..5bbcc73f201 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -229,6 +229,7 @@ pub type AssetsForceOrigin = EnsureRoot; // and falsly implies that they are actually backed by some reserve. In reality, the user is // _trusting_ some `CreateOrigin` (AccountId) that the asset is what they claim. pub type TrustBackedAssetsInstance = pallet_assets::Instance1; +type TrustBackedAssetsCall = pallet_assets::Call; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; @@ -343,7 +344,6 @@ impl Default for ProxyType { Self::Any } } -type TrustBackedAssetsCall = pallet_assets::Call; impl InstanceFilter for ProxyType { fn filter(&self, c: &RuntimeCall) -> bool { match self { @@ -373,9 +373,8 @@ impl InstanceFilter for ProxyType { c, RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::destroy { .. }) | - RuntimeCall::Assets( - TrustBackedAssetsCall::transfer_ownership { .. } - ) | RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::transfer_ownership { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 7ef9122e900..8e7cd55eaa5 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -14,9 +14,9 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, AssetId, Authorship, Balance, Balances, ParachainInfo, + AccountId, AllPalletsWithSystem, AssetId, Assets, Authorship, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - Assets, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 13e7cbf1070..1bd8f7c5ec8 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -6,16 +6,14 @@ use frame_support::{ }; use parachains_common::{AccountId, AuraId}; pub use westmint_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, Runtime, - SessionKeys, System, Assets, + constants::fee::WeightToFee, xcm_config::XcmConfig, Assets, Balances, ExistentialDeposit, + Runtime, SessionKeys, System, }; use xcm::latest::prelude::*; use xcm_executor::traits::WeightTrader; pub const ALICE: [u8; 32] = [1u8; 32]; -type Assets = Assets; - #[test] fn test_asset_xcm_trader() { ExtBuilder::::default() From 31bc1c666ad6777e8cdce7e05689c317f3afbf87 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 12 Jan 2023 14:54:16 +0100 Subject: [PATCH 031/339] Added `allowed_target_location` + reanchored assets/destination + tests --- Cargo.lock | 1 + .../pallets/bridge-assets-transfer/Cargo.toml | 1 + .../pallets/bridge-assets-transfer/src/lib.rs | 234 ++++++++++++++---- 3 files changed, 190 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d012687599f..e981a50d061 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5497,6 +5497,7 @@ dependencies = [ name = "pallet-bridge-assets-transfer" version = "0.1.0" dependencies = [ + "cumulus-pallet-xcmp-queue", "frame-support", "frame-system", "log", diff --git a/parachains/pallets/bridge-assets-transfer/Cargo.toml b/parachains/pallets/bridge-assets-transfer/Cargo.toml index 740ac21fa29..e767c891892 100644 --- a/parachains/pallets/bridge-assets-transfer/Cargo.toml +++ b/parachains/pallets/bridge-assets-transfer/Cargo.toml @@ -29,6 +29,7 @@ xcm-executor = { git = "https://github.com/paritytech/polkadot", default-feature sp-version = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-parachain = { git = "https://github.com/paritytech/polkadot", branch = "master" } +cumulus-pallet-xcmp-queue = { path = "../../../pallets/xcmp-queue" } [features] default = ["std"] diff --git a/parachains/pallets/bridge-assets-transfer/src/lib.rs b/parachains/pallets/bridge-assets-transfer/src/lib.rs index 62632fef4d0..3e4695693d2 100644 --- a/parachains/pallets/bridge-assets-transfer/src/lib.rs +++ b/parachains/pallets/bridge-assets-transfer/src/lib.rs @@ -37,6 +37,12 @@ pub const LOG_TARGET: &str = "runtime::bridge-assets-transfer"; pub struct BridgeConfig { /// Contains location, which is able to bridge XCM messages to bridged network bridge_location: MultiLocation, + + /// Contains target destination on bridged network. E.g.: MultiLocation of Statemine/t on different consensus + // TODO:check-parameter - lets start with 1..1, maybe later we could extend this with BoundedVec + // TODO: bridged bridge-hub should have router for this + allowed_target_location: MultiLocation, + /// Fee which could be needed to pay in `bridge_location` fee: Option, } @@ -58,8 +64,7 @@ pub mod pallet { use xcm_executor::traits::TransactAsset; #[pallet::pallet] - #[pallet::generate_store(pub (super) trait Store)] - #[pallet::without_storage_info] + #[pallet::generate_store(pub(super) trait Store)] pub struct Pallet(_); #[pallet::config] @@ -86,8 +91,9 @@ pub mod pallet { >; } - #[pallet::storage] /// Details of configured bridges which are allowed for transfer. + #[pallet::storage] + #[pallet::getter(fn bridges)] pub(super) type Bridges = StorageMap<_, Blake2_128Concat, NetworkId, BridgeConfig>; #[pallet::error] @@ -114,7 +120,9 @@ pub mod pallet { /// Bridge configuration was updated BridgeUpdated, - /// Make reserve failed + /// Reserve asset passed + ReserveAssetsDeposited { from: MultiLocation, to: MultiLocation, assets: MultiAssets }, + /// Reserve asset failed FailedToReserve(XcmError), /// Bridge transfer failed @@ -143,10 +151,14 @@ pub mod pallet { // Check reserve account - sovereign account of bridge let reserve_account = bridge_config.bridge_location; + let allowed_target_location = bridge_config.allowed_target_location; // TODO: do some checks - balances, can_withdraw, ... - // TODO: check assets? - // TODO: check enought fee? + // TODO:check-parameter - check assets: + // TODO:check-parameter - check assets - allow just fungible or non-fungible? allow mix? + // TODO:check-parameter - check assets - allow Abstract assets - reanchor ignores them? + // TODO:check-parameter - check enought fee? + // TODO:check-parameter - reserve_account has enought for existential deposit? // TODO: fix this for multiple assets let assets: MultiAssets = @@ -159,8 +171,9 @@ pub mod pallet { // bridge, such that it need not trust any consensus system from // `./Parent/Parent/...`. (It may trust Polkadot, but would // Polkadot trust Kusama with its DOT?) + // Move asset to reserve account for selected bridge - let asset = T::AssetTransactor::transfer_asset( + let mut asset = T::AssetTransactor::transfer_asset( asset, &origin_location, &reserve_account, @@ -168,11 +181,20 @@ pub mod pallet { // fake message hash here &XcmContext::with_message_hash([0; 32]), ) + .and_then(|assets| { + Self::deposit_event(Event::ReserveAssetsDeposited { + from: origin_location, + to: reserve_account, + assets: assets.clone().into(), + }); + Ok(assets) + }) .map_err(|e| { log::error!( target: LOG_TARGET, - "XcmError occurred for origin_location: {:?}, asset: {:?}, error: {:?}", + "AssetTransactor failed to reserve assets from origin_location: {:?} to reserve_account: {:?} for assets: {:?}, error: {:?}", origin_location, + reserve_account, asset, e ); @@ -180,27 +202,35 @@ pub mod pallet { Error::::FailedToReserve })?; - // TODO: reanchor somehow - // TODO: xcm - withdraw and fire ReserveAssetDeposited to the other side + // TODO: asset.clone for compensation + add test for compensation - // TODO: send message through bridge - // Construct and send `Xcm(vec![Instruction])` to - // `./Parent/BridgeHubParaId`. + // prepare ReserveAssetDeposited msg to bridge to the other side - reanchor stuff + // We need to convert local asset's id/MultiLocation to format, that could be understood by different consensus and from their point-of-view + // assets.prepend_location(&T::UniversalLocation::get().into_location()); + asset.reanchor(&allowed_target_location, T::UniversalLocation::get(), None); + let remote_destination = remote_destination + .reanchored(&allowed_target_location, T::UniversalLocation::get()) + .expect("aaa"); - // TODO: prepare ReserveAssetDeposited msg to bridge to the other side? - let xcm: Xcm<()> = - sp_std::vec![Instruction::ReserveAssetDeposited(asset.into())].into(); + let xcm: Xcm<()> = sp_std::vec![ + ReserveAssetDeposited(asset.into()), + ClearOrigin, + DepositAsset { assets: All.into(), beneficiary: remote_destination } + ] + .into(); // TODO: how to compensate if this call fails? + + // call bridge log::info!( target: LOG_TARGET, - "[T::BridgeXcmSender] send to bridge, remote_destination: {:?}, xcm: {:?}", - remote_destination, + "[T::BridgeXcmSender] send to bridge, allowed_target_location: {:?}, xcm: {:?}", + allowed_target_location, xcm, ); - // call bridge + // TODO: use fn send_msg - which does: validate + deliver - but find out what to do with the fees? let (ticket, fees) = - T::BridgeXcmSender::validate(&mut Some(remote_destination), &mut Some(xcm)) + T::BridgeXcmSender::validate(&mut Some(allowed_target_location), &mut Some(xcm)) .map_err(|e| { log::error!( target: LOG_TARGET, @@ -216,7 +246,6 @@ pub mod pallet { fees ); // TODO: what to do with fees - we have fees here, pay here or ignore? - // TODO: use fn send_msg let xcm_hash = T::BridgeXcmSender::deliver(ticket).map_err(|e| { log::error!( target: LOG_TARGET, @@ -245,6 +274,15 @@ pub mod pallet { ) -> DispatchResult { let _ = ensure_root(origin)?; ensure!(!Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); + let allowed_target_location_network = bridge_config + .allowed_target_location + .interior() + .global_consensus() + .map_err(|_| Error::::InvalidConfiguration)?; + ensure!( + bridged_network == allowed_target_location_network, + Error::::InvalidConfiguration + ); Bridges::::insert(bridged_network, bridge_config); Self::deposit_event(Event::BridgeAdded); @@ -298,21 +336,30 @@ pub mod pallet { /// /// Returns: correct remote location, where we should be able to bridge pub(crate) fn ensure_remote_destination( - destination: VersionedMultiLocation, + remote_destination: VersionedMultiLocation, ) -> Result<(BridgeConfig, MultiLocation), Error> { - match destination { - VersionedMultiLocation::V3(location) => { - ensure!(location.parent_count() == 2, Error::::UnsupportedDestination); + match remote_destination { + VersionedMultiLocation::V3(remote_location) => { + ensure!( + remote_location.parent_count() == 2, + Error::::UnsupportedDestination + ); let local_network = T::UniversalLocation::get() .global_consensus() .map_err(|_| Error::::InvalidConfiguration)?; - let remote_network = location + let remote_network = remote_location .interior() .global_consensus() .map_err(|_| Error::::UnsupportedDestination)?; ensure!(local_network != remote_network, Error::::UnsupportedDestination); match Bridges::::get(remote_network) { - Some(bridge_config) => Ok((bridge_config, location)), + Some(bridge_config) => { + ensure!( + remote_location.starts_with(&bridge_config.allowed_target_location), + Error::::UnsupportedDestination + ); + Ok((bridge_config, remote_location)) + }, None => return Err(Error::::UnsupportedDestination), } }, @@ -349,7 +396,7 @@ mod tests { use sp_runtime::{ testing::{Header, H256}, traits::{BlakeTwo256, IdentityLookup}, - AccountId32, + AccountId32, ModuleError, }; use sp_version::RuntimeVersion; use xcm_builder::{ @@ -440,7 +487,7 @@ mod tests { // Test bridge cfg pub TestBridgeTable: sp_std::prelude::Vec<(NetworkId, MultiLocation, Option)> = sp_std::vec![ (NetworkId::Wococo, (Parent, Parachain(1013)).into(), None), - (NetworkId::Polkadot, (Parent, Parachain(1003)).into(), None), + (NetworkId::Polkadot, (Parent, Parachain(1002)).into(), None), ]; // Relay chain currency/balance location (e.g. KsmLocation, DotLocation, ..) pub const RelayLocation: MultiLocation = MultiLocation::parent(); @@ -518,19 +565,39 @@ mod tests { pub(crate) fn new_test_ext() -> sp_io::TestExternalities { sp_tracing::try_init_simple(); let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); - t.into() + + // with 0 block_number events dont work + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + frame_system::Pallet::::set_block_number(1u32.into()); + }); + + ext } fn account(account: u8) -> AccountId32 { AccountId32::new([account; 32]) } + fn consensus_account(network: NetworkId, account: u8) -> Junction { + xcm::prelude::AccountId32 { + network: Some(network), + id: AccountId32::new([account; 32]).into(), + } + } + #[test] fn test_ensure_remote_destination() { new_test_ext().execute_with(|| { // insert bridge config - let bridge_config = - BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), fee: None }; + let bridge_config = BridgeConfig { + bridge_location: (Parent, Parachain(1013)).into(), + allowed_target_location: MultiLocation::new( + 2, + X2(GlobalConsensus(Wococo), Parachain(1000)), + ), + fee: None, + }; assert_ok!(BridgeAssetsTransfer::add_bridge_config( RuntimeOrigin::root(), Wococo, @@ -568,7 +635,15 @@ mod tests { Err(Error::::UnsupportedDestination) ); - // v3 - ok + // v3 - remote_destination is not allowed + assert_eq!( + BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1234))) + )), + Err(Error::::UnsupportedDestination) + ); + + // v3 - ok (allowed) assert_eq!( BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1000))) @@ -581,8 +656,9 @@ mod tests { }) } + // TODO: add test for pallet_asset not only blances #[test] - fn test_transfer_asset_via_bridge_works() { + fn test_transfer_asset_via_bridge_for_currency_works() { new_test_ext().execute_with(|| { // initialize some Balances for user_account let user_account = account(1); @@ -591,6 +667,8 @@ mod tests { let user_free_balance = Balances::free_balance(&user_account); let balance_to_transfer = 15_u64; assert!((user_free_balance - balance_to_transfer) >= ExistentialDeposit::get()); + // TODO: because, sovereign account needs to have ED otherwise reserve fails + assert!(balance_to_transfer >= ExistentialDeposit::get()); // insert bridge config let bridged_network = Wococo; @@ -599,6 +677,10 @@ mod tests { bridged_network, Box::new(BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), + allowed_target_location: MultiLocation::new( + 2, + X2(GlobalConsensus(Wococo), Parachain(1000)) + ), fee: None }), )); @@ -609,45 +691,83 @@ mod tests { // checks before assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); assert_eq!(Balances::free_balance(&user_account), user_account_init_balance); - let bridge_location_as_account = + let bridge_location_as_sovereign_account = SiblingParachainConvertsVia::::convert_ref(bridge_location) .expect("converted bridge location as accountId"); - assert_eq!(Balances::free_balance(&bridge_location_as_account), 0); + assert_eq!(Balances::free_balance(&bridge_location_as_sovereign_account), 0); // trigger transfer_asset_via_bridge - should trigger new ROUTED_MESSAGE let asset = MultiAsset { fun: Fungible(balance_to_transfer.into()), id: Concrete(RelayLocation::get()), }; - let assets = Box::new(VersionedMultiAssets::V3(asset.into())); + + // destination is account from different consensus let destination = Box::new(VersionedMultiLocation::V3(MultiLocation::new( 2, - X2(GlobalConsensus(Wococo), Parachain(1000)), + X3(GlobalConsensus(Wococo), Parachain(1000), consensus_account(Wococo, 2)), ))); - let result = BridgeAssetsTransfer::transfer_asset_via_bridge( + // trigger asset transfer + assert_ok!(BridgeAssetsTransfer::transfer_asset_via_bridge( RuntimeOrigin::signed(account(1)), assets, destination, - ); - assert_eq!(result, Ok(())); - assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_some())); - // check user account decresed + )); + + // check user account decressed assert_eq!( Balances::free_balance(&user_account), user_account_init_balance - balance_to_transfer ); // check reserve account increased - assert_eq!(Balances::free_balance(&bridge_location_as_account), 15); + assert_eq!(Balances::free_balance(&bridge_location_as_sovereign_account), 15); + + // check events + let events = System::events(); + assert!(!events.is_empty()); + + // check reserve asset deposited event + assert!(System::events().iter().any(|r| matches!( + r.event, + RuntimeEvent::BridgeAssetsTransfer(Event::ReserveAssetsDeposited { .. }) + ))); + assert!(System::events().iter().any(|r| matches!( + r.event, + RuntimeEvent::BridgeAssetsTransfer(Event::TransferInitiated { .. }) + ))); + + // check fired XCM ExportMessage to bridge-hub + let fired_xcm = + ROUTED_MESSAGE.with(|r| r.take().expect("xcm::ExportMessage should be here")); + + if let Some(ExportMessage { xcm, .. }) = fired_xcm.0.iter().find(|instr| { + matches!( + instr, + ExportMessage { network: Wococo, destination: X1(Parachain(1000)), .. } + ) + }) { + assert!(xcm.0.iter().any(|instr| matches!(instr, ReserveAssetDeposited(..)))); + assert!(xcm.0.iter().any(|instr| matches!(instr, ClearOrigin))); + assert!(xcm.0.iter().any(|instr| matches!(instr, DepositAsset { .. }))); + } else { + assert!(false, "Does not contains [`ExportMessage`], fired_xcm: {:?}", fired_xcm); + } }); } #[test] fn test_bridge_config_management_works() { let bridged_network = Rococo; - let bridged_config = - Box::new(BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), fee: None }); + let bridged_config = Box::new(BridgeConfig { + bridge_location: (Parent, Parachain(1013)).into(), + allowed_target_location: MultiLocation::new( + 2, + X2(GlobalConsensus(bridged_network), Parachain(1000)), + ), + fee: None, + }); let dummy_xcm = Xcm(vec![]); let dummy_remote_interior_multilocation = X1(Parachain(1234)); @@ -663,6 +783,27 @@ mod tests { ), DispatchError::BadOrigin ); + + // should fail - cannot bridged_network should match allowed_target_location + assert_noop!( + BridgeAssetsTransfer::add_bridge_config(RuntimeOrigin::root(), bridged_network, { + let remote_network = Westend; + assert_ne!(bridged_network, remote_network); + Box::new(BridgeConfig { + bridge_location: (Parent, Parachain(1013)).into(), + allowed_target_location: MultiLocation::new( + 2, + X2(GlobalConsensus(remote_network), Parachain(1000)), + ), + fee: None, + }) + }), + DispatchError::Module(ModuleError { + index: 52, + error: [0, 0, 0, 0], + message: Some("InvalidConfiguration") + }) + ); assert_eq!(Bridges::::iter().count(), 0); assert_eq!( BridgeAssetsTransfer::exporter_for( @@ -714,6 +855,7 @@ mod tests { Bridges::::get(bridged_network), Some(BridgeConfig { bridge_location: bridged_config.bridge_location.clone(), + allowed_target_location: bridged_config.allowed_target_location.clone(), fee: Some((Parent, 200u128).into()) }) ); From 25c2fc5bbb8a99963928aa20a7029d79604ef453 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Thu, 12 Jan 2023 15:44:16 +0100 Subject: [PATCH 032/339] fix benchmark helper --- .../runtimes/assets/westmint/src/lib.rs | 5 +++-- .../assets/westmint/src/xcm_config.rs | 20 +++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 5bbcc73f201..8f91d9876ea 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -64,7 +64,8 @@ use parachains_common::{ AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_config::{ - ForeignCreators, MultiLocationForAssetId, XcmConfig, XcmOriginToTransactDispatchOrigin, + ForeignCreators, MultiLocationForAssetId, XcmBenchmarkHelper, XcmConfig, + XcmOriginToTransactDispatchOrigin, }; #[cfg(any(feature = "std", test))] @@ -269,7 +270,7 @@ impl pallet_assets::Config for Runtime { type WeightInfo = weights::pallet_assets::WeightInfo; type AssetAccountDeposit = AssetAccountDeposit; #[cfg(feature = "runtime-benchmarks")] - type Helper = (); //XcmBenchmarkHelper; + type Helper = XcmBenchmarkHelper; } parameter_types! { diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 8e7cd55eaa5..fe62bd0c3f7 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -57,16 +57,6 @@ parameter_types! { pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } -// This is frustrating... -// use pallet_assets::BenchmarkHelper; -// pub struct XcmBenchmarkHelper; -// #[cfg(feature = "runtime-benchmarks")] -// impl> BenchmarkHelper for XcmBenchmarkHelper { -// fn create_asset_id(id: u32) -> MultiLocation { -// (Parent, Parachain(id)).into() -// } -// } - /// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. @@ -302,3 +292,13 @@ impl EnsureOriginWithArg for ForeignCreators { pallet_xcm::Origin::Xcm(a.clone()).into() } } + +/// Simple conversion of `u32` into an `AssetId` for use in benchmarking. +pub struct XcmBenchmarkHelper; +use pallet_assets::BenchmarkHelper; +#[cfg(feature = "runtime-benchmarks")] +impl BenchmarkHelper for XcmBenchmarkHelper { + fn create_asset_id(id: u32) -> MultiLocation { + MultiLocation { parents: 1, interior: X1(Parachain(id)) } + } +} From a4a581b0e993c5cfc0be92fbd13fb99dbdac7605 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Thu, 12 Jan 2023 16:14:23 +0100 Subject: [PATCH 033/339] fix benchmark build --- parachains/runtimes/assets/statemine/src/lib.rs | 3 ++- parachains/runtimes/assets/statemint/src/lib.rs | 3 ++- parachains/runtimes/assets/westmint/src/lib.rs | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index efd149a6506..41a18d7c9a6 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -855,6 +855,7 @@ impl_runtime_apis! { impl cumulus_pallet_session_benchmarking::Config for Runtime {} use xcm::latest::prelude::*; + use xcm_builder::MintLocation; use xcm_config::KsmLocation; use pallet_xcm_benchmarks::asset_instance_from; @@ -897,7 +898,7 @@ impl_runtime_apis! { KsmLocation::get(), MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(KsmLocation::get()) }, )); - pub const CheckedAccount: Option = None; + pub const CheckedAccount: Option<(AccountId, MintLocation)> = None; } diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index 2deca27b226..9e5bbe4907c 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -882,6 +882,7 @@ impl_runtime_apis! { impl cumulus_pallet_session_benchmarking::Config for Runtime {} use xcm::latest::prelude::*; + use xcm_builder::MintLocation; use xcm_config::DotLocation; use pallet_xcm_benchmarks::asset_instance_from; @@ -924,7 +925,7 @@ impl_runtime_apis! { DotLocation::get(), MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(DotLocation::get()) }, )); - pub const CheckedAccount: Option = None; + pub const CheckedAccount: Option<(AccountId, MintLocation)> = None; } impl pallet_xcm_benchmarks::fungible::Config for Runtime { diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 8f91d9876ea..009fed14eb9 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -874,6 +874,7 @@ impl_runtime_apis! { impl cumulus_pallet_session_benchmarking::Config for Runtime {} use xcm::latest::prelude::*; + use xcm_builder::MintLocation; use xcm_config::WestendLocation; use pallet_xcm_benchmarks::asset_instance_from; @@ -916,7 +917,7 @@ impl_runtime_apis! { WestendLocation::get(), MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(WestendLocation::get()) }, )); - pub const CheckedAccount: Option = None; + pub const CheckedAccount: Option<(AccountId, MintLocation)> = None; } From 9cd2708d1bac5a4f97e4ac4e7c0008da7ec03b46 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Thu, 12 Jan 2023 16:50:07 +0100 Subject: [PATCH 034/339] more benchmark fixes --- parachains/runtimes/assets/westmint/src/lib.rs | 5 ++--- parachains/runtimes/assets/westmint/src/xcm_config.rs | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 009fed14eb9..a637f92621d 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -64,8 +64,7 @@ use parachains_common::{ AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_config::{ - ForeignCreators, MultiLocationForAssetId, XcmBenchmarkHelper, XcmConfig, - XcmOriginToTransactDispatchOrigin, + ForeignCreators, MultiLocationForAssetId, XcmConfig, XcmOriginToTransactDispatchOrigin, }; #[cfg(any(feature = "std", test))] @@ -270,7 +269,7 @@ impl pallet_assets::Config for Runtime { type WeightInfo = weights::pallet_assets::WeightInfo; type AssetAccountDeposit = AssetAccountDeposit; #[cfg(feature = "runtime-benchmarks")] - type Helper = XcmBenchmarkHelper; + type Helper = xcm_config::XcmBenchmarkHelper; } parameter_types! { diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index fe62bd0c3f7..dcd7f200f1e 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -295,6 +295,7 @@ impl EnsureOriginWithArg for ForeignCreators { /// Simple conversion of `u32` into an `AssetId` for use in benchmarking. pub struct XcmBenchmarkHelper; +#[cfg(feature = "runtime-benchmarks")] use pallet_assets::BenchmarkHelper; #[cfg(feature = "runtime-benchmarks")] impl BenchmarkHelper for XcmBenchmarkHelper { From 81e9703dc96ad49568385007981247a8d286817d Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Thu, 12 Jan 2023 17:13:14 +0100 Subject: [PATCH 035/339] fix penpal and rococo --- parachains/runtimes/testing/penpal/Cargo.toml | 1 + parachains/runtimes/testing/penpal/src/lib.rs | 2 ++ parachains/runtimes/testing/rococo-parachain/src/lib.rs | 2 ++ 3 files changed, 5 insertions(+) diff --git a/parachains/runtimes/testing/penpal/Cargo.toml b/parachains/runtimes/testing/penpal/Cargo.toml index abc74695cb1..741c9fbb4bf 100644 --- a/parachains/runtimes/testing/penpal/Cargo.toml +++ b/parachains/runtimes/testing/penpal/Cargo.toml @@ -132,6 +132,7 @@ runtime-benchmarks = [ "frame-support/runtime-benchmarks", "frame-system-benchmarking/runtime-benchmarks", "frame-system/runtime-benchmarks", + "pallet-assets/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index 067d2713e31..268d75cbf64 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -409,6 +409,8 @@ impl pallet_assets::Config for Runtime { type Extra = (); type WeightInfo = pallet_assets::weights::SubstrateWeight; type AssetAccountDeposit = AssetAccountDeposit; + #[cfg(feature = "runtime-benchmarks")] + type Helper = (); } parameter_types! { diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 3f7642bbd62..6b992c7472b 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -524,6 +524,8 @@ impl pallet_assets::Config for Runtime { type Extra = (); type WeightInfo = pallet_assets::weights::SubstrateWeight; type AssetAccountDeposit = AssetAccountDeposit; + #[cfg(feature = "runtime-benchmarks")] + type Helper = (); } impl pallet_aura::Config for Runtime { From 0c3f3b72c455ecd87d82208b17a4426f94e6c298 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Tue, 17 Jan 2023 11:50:28 +0100 Subject: [PATCH 036/339] update BenchmarkHelper interface --- parachains/runtimes/assets/westmint/src/lib.rs | 2 +- parachains/runtimes/assets/westmint/src/xcm_config.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 8c9590efd50..5bf07096e35 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -266,7 +266,7 @@ impl pallet_assets::Config for Runtime { type AssetAccountDeposit = AssetAccountDeposit; type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); + type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; } parameter_types! { diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 9564c4f2008..db8fac63e30 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -411,7 +411,7 @@ pub struct XcmBenchmarkHelper; use pallet_assets::BenchmarkHelper; #[cfg(feature = "runtime-benchmarks")] impl BenchmarkHelper for XcmBenchmarkHelper { - fn create_asset_id(id: u32) -> MultiLocation { + fn create_asset_id_parameter(id: u32) -> MultiLocation { MultiLocation { parents: 1, interior: X1(Parachain(id)) } } } From c3d210835e9422b1d2118ec6f7253facc6d67410 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Tue, 17 Jan 2023 12:15:22 +0100 Subject: [PATCH 037/339] fmt --- parachains/common/src/impls.rs | 3 ++- parachains/runtimes/assets/statemint/src/xcm_config.rs | 4 ++-- parachains/runtimes/assets/westmint/src/xcm_config.rs | 5 ++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/parachains/common/src/impls.rs b/parachains/common/src/impls.rs index 6f58c6992fa..74974c5367d 100644 --- a/parachains/common/src/impls.rs +++ b/parachains/common/src/impls.rs @@ -73,7 +73,8 @@ impl HandleCredit, pallet_assets::Pallet> for AssetsT where I: 'static, R: pallet_authorship::Config + pallet_assets::Config, - AccountIdOf: From + Into, + AccountIdOf: + From + Into, { fn handle_credit(credit: CreditOf, pallet_assets::Pallet>) { if let Some(author) = pallet_authorship::Pallet::::author() { diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index 3513579083b..d2fabe1b047 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -15,8 +15,8 @@ use super::{ AccountId, AllPalletsWithSystem, AssetId, Assets, Authorship, Balance, Balances, ParachainInfo, - ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, - XcmpQueue, + ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index db8fac63e30..be73e797d56 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -20,7 +20,10 @@ use super::{ }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing, PalletInfoAccess}, + traits::{ + ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing, + PalletInfoAccess, + }, }; use pallet_xcm::{EnsureXcm, XcmPassthrough}; use parachains_common::{ From 8d809e46f7572cd62c8eb2d9fbb729b83beab7db Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Sun, 22 Jan 2023 21:26:26 +0100 Subject: [PATCH 038/339] Added weight `export_message` to statemint because of `pallet_xcm.send` --- parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs index c5ac9b80a94..6adf2e6b906 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs @@ -210,7 +210,8 @@ impl XcmWeightInfo for StatemineXcmWeight { Weight::MAX } fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { - Weight::MAX + // TODO:check-parameter - new pallet_xcm.send requires to set this up - check how to set properly + Weight::from_ref_time(100_000_000 as u64) } fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { Weight::MAX From 81abe456f4bd5824ddccc3743c4f91772a69b963 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Tue, 24 Jan 2023 08:27:01 +0100 Subject: [PATCH 039/339] add foreign assets to westmint --- .../runtimes/assets/westmint/src/lib.rs | 32 +++++++++++- .../assets/westmint/src/xcm_config.rs | 50 +++++++++++++++++-- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 9f065e0ef7c..80a34f65f18 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -65,7 +65,7 @@ use parachains_common::{ Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; -use xcm_config::{XcmConfig, XcmOriginToTransactDispatchOrigin}; +use xcm_config::{ForeignCreators, MultiLocationForAssetId, XcmConfig, XcmOriginToTransactDispatchOrigin}; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; @@ -242,6 +242,34 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +/// Assets managed by some foreign location. Note: we do not declare a `ForeignAssetsCall` type, as +/// this type is used in proxy definitions. We assume that a foreign location would not want to set +/// an individual, local account as a proxy for the issuance of their assets. This issuance should +/// be managed by the foreign location's governance. +type ForeignAssetsInstance = pallet_assets::Instance2; +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = MultiLocationForAssetId; + type AssetIdParameter = MultiLocationForAssetId; + type Currency = Balances; + type CreateOrigin = ForeignCreators; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type WeightInfo = weights::pallet_assets::WeightInfo; + type CallbackHandle = (); + type AssetAccountDeposit = AssetAccountDeposit; + type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; +} + parameter_types! { // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. pub const DepositBase: Balance = deposit(1, 88); @@ -645,6 +673,7 @@ construct_runtime!( Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, + ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, } ); @@ -694,6 +723,7 @@ mod benches { define_benchmarks!( [frame_system, SystemBench::] [pallet_assets, Assets] + [pallet_assets, ForeignAssets] [pallet_balances, Balances] [pallet_multisig, Multisig] [pallet_nfts, Nfts] diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index ca30415bd29..2aa6c277523 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -20,16 +20,16 @@ use super::{ }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, + traits::{ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing, PalletInfoAccess}, }; -use pallet_xcm::XcmPassthrough; +use pallet_xcm::{EnsureXcm, XcmPassthrough}; use parachains_common::{ impls::ToStakingPot, xcm_config::{ AssetFeeAsExistentialDepositMultiplier, DenyReserveTransferToRelayChain, DenyThenTry, }, }; -use polkadot_parachain::primitives::Sibling; +use polkadot_parachain::primitives::{Id as ParaId, Sibling}; use sp_runtime::traits::ConvertInto; use xcm::latest::prelude::*; use xcm_builder::{ @@ -42,7 +42,7 @@ use xcm_builder::{ WithComputedOrigin, }; use xcm_executor::{ - traits::{JustTry, WithOriginFilter}, + traits::{Convert, JustTry, WithOriginFilter}, XcmExecutor, }; @@ -381,3 +381,45 @@ impl cumulus_pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; } + +pub type MultiLocationForAssetId = MultiLocation; + +pub type SovereignAccountOf = ( + SiblingParachainConvertsVia, + AccountId32Aliases, + ParentIsPreset, +); + +// `EnsureOriginWithArg` impl for `CreateOrigin` that allows only XCM origins that are locations +// containing the class location. +pub struct ForeignCreators; +impl EnsureOriginWithArg for ForeignCreators { + type Success = AccountId; + + fn try_origin( + o: RuntimeOrigin, + a: &MultiLocation, + ) -> sp_std::result::Result { + let origin_location = EnsureXcm::::try_origin(o.clone())?; + if !a.starts_with(&origin_location) { + return Err(o) + } + SovereignAccountOf::convert(origin_location).map_err(|_| o) + } + + #[cfg(feature = "runtime-benchmarks")] + fn successful_origin(a: &MultiLocation) -> RuntimeOrigin { + pallet_xcm::Origin::Xcm(a.clone()).into() + } +} + +/// Simple conversion of `u32` into an `AssetId` for use in benchmarking. +pub struct XcmBenchmarkHelper; +#[cfg(feature = "runtime-benchmarks")] +use pallet_assets::BenchmarkHelper; +#[cfg(feature = "runtime-benchmarks")] +impl BenchmarkHelper for XcmBenchmarkHelper { + fn create_asset_id_parameter(id: u32) -> MultiLocation { + MultiLocation { parents: 1, interior: X1(Parachain(id)) } + } +} From 0da76e02a646f9e3e0bfa71945e1cc43c5a04586 Mon Sep 17 00:00:00 2001 From: joepetrowski Date: Tue, 24 Jan 2023 10:24:09 +0100 Subject: [PATCH 040/339] add foreign assets to statemine --- .../runtimes/assets/statemine/src/lib.rs | 33 +++++++++++- .../assets/statemine/src/xcm_config.rs | 53 +++++++++++++++++-- .../runtimes/assets/westmint/src/lib.rs | 4 +- .../assets/westmint/src/xcm_config.rs | 5 +- 4 files changed, 88 insertions(+), 7 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 4272ce71d8a..f91661bbe16 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -64,7 +64,7 @@ use parachains_common::{ Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; -use xcm_config::{KsmLocation, XcmConfig}; +use xcm_config::{ForeignCreators, KsmLocation, MultiLocationForAssetId, XcmConfig}; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; @@ -260,6 +260,34 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +/// Assets managed by some foreign location. Note: we do not declare a `ForeignAssetsCall` type, as +/// this type is used in proxy definitions. We assume that a foreign location would not want to set +/// an individual, local account as a proxy for the issuance of their assets. This issuance should +/// be managed by the foreign location's governance. +type ForeignAssetsInstance = pallet_assets::Instance2; +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = MultiLocationForAssetId; + type AssetIdParameter = MultiLocationForAssetId; + type Currency = Balances; + type CreateOrigin = ForeignCreators; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type WeightInfo = weights::pallet_assets::WeightInfo; + type CallbackHandle = (); + type AssetAccountDeposit = AssetAccountDeposit; + type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; +} + parameter_types! { // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. pub const DepositBase: Balance = deposit(1, 88); @@ -634,6 +662,8 @@ construct_runtime!( // The main stage. Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, + // Reserving 52 for pallet_nfts + ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, #[cfg(feature = "state-trie-version-1")] StateTrieMigration: pallet_state_trie_migration = 70, @@ -686,6 +716,7 @@ mod benches { define_benchmarks!( [frame_system, SystemBench::] [pallet_assets, Assets] + [pallet_assets, ForeignAssets] [pallet_balances, Balances] [pallet_multisig, Multisig] [pallet_proxy, Proxy] diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 43b1c67f0bd..05b6765606f 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -20,16 +20,19 @@ use super::{ }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, + traits::{ + ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing, + PalletInfoAccess, + }, }; -use pallet_xcm::XcmPassthrough; +use pallet_xcm::{EnsureXcm, XcmPassthrough}; use parachains_common::{ impls::ToStakingPot, xcm_config::{ AssetFeeAsExistentialDepositMultiplier, DenyReserveTransferToRelayChain, DenyThenTry, }, }; -use polkadot_parachain::primitives::Sibling; +use polkadot_parachain::primitives::{Id as ParaId, Sibling}; use sp_runtime::traits::ConvertInto; use xcm::latest::prelude::*; use xcm_builder::{ @@ -42,7 +45,7 @@ use xcm_builder::{ WithComputedOrigin, }; use xcm_executor::{ - traits::{JustTry, WithOriginFilter}, + traits::{Convert, JustTry, WithOriginFilter}, XcmExecutor, }; @@ -390,3 +393,45 @@ impl cumulus_pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; } + +pub type MultiLocationForAssetId = MultiLocation; + +pub type SovereignAccountOf = ( + SiblingParachainConvertsVia, + AccountId32Aliases, + ParentIsPreset, +); + +// `EnsureOriginWithArg` impl for `CreateOrigin` that allows only XCM origins that are locations +// containing the class location. +pub struct ForeignCreators; +impl EnsureOriginWithArg for ForeignCreators { + type Success = AccountId; + + fn try_origin( + o: RuntimeOrigin, + a: &MultiLocation, + ) -> sp_std::result::Result { + let origin_location = EnsureXcm::::try_origin(o.clone())?; + if !a.starts_with(&origin_location) { + return Err(o) + } + SovereignAccountOf::convert(origin_location).map_err(|_| o) + } + + #[cfg(feature = "runtime-benchmarks")] + fn successful_origin(a: &MultiLocation) -> RuntimeOrigin { + pallet_xcm::Origin::Xcm(a.clone()).into() + } +} + +/// Simple conversion of `u32` into an `AssetId` for use in benchmarking. +pub struct XcmBenchmarkHelper; +#[cfg(feature = "runtime-benchmarks")] +use pallet_assets::BenchmarkHelper; +#[cfg(feature = "runtime-benchmarks")] +impl BenchmarkHelper for XcmBenchmarkHelper { + fn create_asset_id_parameter(id: u32) -> MultiLocation { + MultiLocation { parents: 1, interior: X1(Parachain(id)) } + } +} diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 80a34f65f18..19dc7002212 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -65,7 +65,9 @@ use parachains_common::{ Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; -use xcm_config::{ForeignCreators, MultiLocationForAssetId, XcmConfig, XcmOriginToTransactDispatchOrigin}; +use xcm_config::{ + ForeignCreators, MultiLocationForAssetId, XcmConfig, XcmOriginToTransactDispatchOrigin, +}; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 2aa6c277523..df9f14cb141 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -20,7 +20,10 @@ use super::{ }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing, PalletInfoAccess}, + traits::{ + ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing, + PalletInfoAccess, + }, }; use pallet_xcm::{EnsureXcm, XcmPassthrough}; use parachains_common::{ From af4fe566c4b1a2aff2284c2c0c0406ca4fa2d7c5 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 30 Jan 2023 13:52:37 +0100 Subject: [PATCH 041/339] Governance can call `xcm:Transact` with bridges configuration management --- Cargo.lock | 1 + .../pallets/bridge-assets-transfer/src/lib.rs | 26 +++---- .../runtimes/assets/statemine/Cargo.toml | 1 + .../runtimes/assets/statemine/src/lib.rs | 3 +- .../assets/statemine/src/xcm_config.rs | 1 + .../runtimes/assets/statemine/tests/tests.rs | 68 ++++++++++++++++++- 6 files changed, 85 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4b5dad44843..3f9b166ee2e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12245,6 +12245,7 @@ dependencies = [ "sp-consensus-aura", "sp-core", "sp-inherents", + "sp-io", "sp-offchain", "sp-runtime", "sp-session", diff --git a/parachains/pallets/bridge-assets-transfer/src/lib.rs b/parachains/pallets/bridge-assets-transfer/src/lib.rs index e38311432a1..3c3e32a0b53 100644 --- a/parachains/pallets/bridge-assets-transfer/src/lib.rs +++ b/parachains/pallets/bridge-assets-transfer/src/lib.rs @@ -36,15 +36,15 @@ pub const LOG_TARGET: &str = "runtime::bridge-assets-transfer"; #[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug, MaxEncodedLen, TypeInfo)] pub struct BridgeConfig { /// Contains location, which is able to bridge XCM messages to bridged network - bridge_location: MultiLocation, + pub bridge_location: MultiLocation, /// Contains target destination on bridged network. E.g.: MultiLocation of Statemine/t on different consensus // TODO:check-parameter - lets start with 1..1, maybe later we could extend this with BoundedVec // TODO: bridged bridge-hub should have router for this - allowed_target_location: MultiLocation, + pub allowed_target_location: MultiLocation, /// Fee which could be needed to pay in `bridge_location` - fee: Option, + pub fee: Option, } impl From for (MultiLocation, Option) { @@ -84,11 +84,11 @@ pub mod pallet { /// How to withdraw and deposit an asset for reserve. type AssetTransactor: TransactAsset; + /// The configurable origin to allow bridges configuration management + type AdminOrigin: EnsureOrigin; + /// Required origin for asset transfer. If successful, it resolves to `MultiLocation`. - type TransferXcmOrigin: EnsureOrigin< - ::RuntimeOrigin, - Success = MultiLocation, - >; + type TransferOrigin: EnsureOrigin; } /// Details of configured bridges which are allowed for transfer. @@ -144,7 +144,7 @@ pub mod pallet { assets: Box, destination: Box, ) -> DispatchResult { - let origin_location = T::TransferXcmOrigin::ensure_origin(origin)?; + let origin_location = T::TransferOrigin::ensure_origin(origin)?; // Check remote destination + bridge_config let (bridge_config, remote_destination) = @@ -274,7 +274,7 @@ pub mod pallet { bridged_network: NetworkId, bridge_config: Box, ) -> DispatchResult { - let _ = ensure_root(origin)?; + let _ = T::AdminOrigin::ensure_origin(origin)?; ensure!(!Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); let allowed_target_location_network = bridge_config .allowed_target_location @@ -302,7 +302,7 @@ pub mod pallet { origin: OriginFor, bridged_network: NetworkId, ) -> DispatchResult { - let _ = ensure_root(origin)?; + let _ = T::AdminOrigin::ensure_origin(origin)?; ensure!(Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); Bridges::::remove(bridged_network); @@ -323,7 +323,7 @@ pub mod pallet { bridged_network: NetworkId, fee: Option, ) -> DispatchResult { - let _ = ensure_root(origin)?; + let _ = T::AdminOrigin::ensure_origin(origin)?; ensure!(Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); Bridges::::try_mutate_exists(bridged_network, |bridge_config| { @@ -396,6 +396,7 @@ mod tests { use frame_support::{ assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, }; + use frame_system::EnsureRoot; use polkadot_parachain::primitives::Sibling; use sp_runtime::{ testing::{Header, H256}, @@ -563,7 +564,8 @@ mod tests { type UniversalLocation = UniversalLocation; type WeightInfo = (); type AssetTransactor = CurrencyTransactor; - type TransferXcmOrigin = EnsureXcmOrigin; + type AdminOrigin = EnsureRoot; + type TransferOrigin = EnsureXcmOrigin; } pub(crate) fn new_test_ext() -> sp_io::TestExternalities { diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index 2fca707b745..5a4a5441fb1 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -75,6 +75,7 @@ pallet-xcm-benchmarks = { git = "https://github.com/paritytech/polkadot", branch [dev-dependencies] asset-test-utils = { path = "../test-utils"} +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } [build-dependencies] substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 9b3bba9f2ab..03c27668593 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -603,7 +603,8 @@ impl pallet_bridge_assets_transfer::Config for Runtime { type UniversalLocation = UniversalLocation; type WeightInfo = pallet_bridge_assets_transfer::weights::SubstrateWeight; type AssetTransactor = AssetTransactors; - type TransferXcmOrigin = EnsureXcmOrigin; + type AdminOrigin = AssetsForceOrigin; + type TransferOrigin = EnsureXcmOrigin; } // Create the runtime by composing the FRAME pallets that were previously configured. diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index e8c16e242b8..6c4cd9a41af 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -190,6 +190,7 @@ impl Contains for SafeCallFilter { RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | + RuntimeCall::BridgeAssetsTransfer(..) | RuntimeCall::Assets( pallet_assets::Call::create { .. } | pallet_assets::Call::force_create { .. } | diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index e1ea89e8c30..13bea6268e3 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -1,18 +1,21 @@ use asset_test_utils::{mock_open_hrmp_channel, ExtBuilder, RuntimeHelper}; +use codec::Encode; use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ assert_noop, assert_ok, traits::PalletInfo, weights::{Weight, WeightToFee as WeightToFeeT}, }; +use pallet_bridge_assets_transfer::BridgeConfig; use parachains_common::{AccountId, AuraId}; use statemine_runtime::xcm_config::AssetFeeAsExistentialDepositMultiplierFeeCharger; pub use statemine_runtime::{ constants::fee::WeightToFee, xcm_config::XcmConfig, Assets, Balances, ExistentialDeposit, - ParachainSystem, PolkadotXcm, Runtime, RuntimeEvent, RuntimeOrigin, SessionKeys, System, + ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, SessionKeys, + System, }; use xcm::{latest::prelude::*, VersionedMultiLocation, VersionedXcm}; -use xcm_executor::traits::WeightTrader; +use xcm_executor::{traits::WeightTrader, XcmExecutor}; pub const ALICE: [u8; 32] = [1u8; 32]; @@ -446,3 +449,64 @@ fn test_send_xcm_transact_with_remark_with_event_works() { ))); }); } + +#[test] +fn can_govornance_call_xcm_transact_with_bridge_assets_transfer_configuration() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .with_tracing() + .with_safe_xcm_version(3) + .build() + .execute_with(|| { + // bridge cfg data + let bridged_network = NetworkId::Polkadot; + let bridge_config = BridgeConfig { + bridge_location: (Parent, Parachain(1013)).into(), + allowed_target_location: MultiLocation::new( + 2, + X2(GlobalConsensus(bridged_network), Parachain(1000)), + ), + fee: None, + }; + + // check cfg before + let cfg = pallet_bridge_assets_transfer::Pallet::::bridges(&bridged_network); + assert!(cfg.is_none()); + + // prepare xcm as governance will do + let add_bridge_config: RuntimeCall = RuntimeCall::BridgeAssetsTransfer( + pallet_bridge_assets_transfer::Call::::add_bridge_config { + bridged_network, + bridge_config: Box::new(bridge_config.clone()), + }, + ); + + // add bridge config call + let xcm = Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + Transact { + origin_kind: OriginKind::Superuser, + require_weight_at_most: Weight::from_ref_time(1000000000), + call: add_bridge_config.encode().into(), + }, + ]); + + // origin as relay chain + let origin = MultiLocation { parents: 1, interior: Here }; + + // initialize bridge through governance-like + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let weight_limit = Weight::from_ref_time(41666666666); + let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); + assert_eq!(outcome.ensure_complete(), Ok(())); + + // check cfg after + let cfg = pallet_bridge_assets_transfer::Pallet::::bridges(&bridged_network); + assert_eq!(cfg, Some(bridge_config)); + }) +} From 78175ba3a36c40ca2718b5d6763c9992b88da64b Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 30 Jan 2023 17:52:29 +0100 Subject: [PATCH 042/339] Revert temporary disabled `scripts/ci/gitlab/pipeline/test.yml` --- scripts/ci/gitlab/pipeline/test.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/ci/gitlab/pipeline/test.yml b/scripts/ci/gitlab/pipeline/test.yml index fa3bc5fbd51..0db2bb554b0 100644 --- a/scripts/ci/gitlab/pipeline/test.yml +++ b/scripts/ci/gitlab/pipeline/test.yml @@ -15,7 +15,7 @@ test-linux-stable: # but still want to have debug assertions. RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" script: - - time # cargo nextest run --all --release --locked --run-ignored all + - time cargo nextest run --all --release --locked --run-ignored all test-doc: stage: test @@ -27,7 +27,7 @@ test-doc: # but still want to have debug assertions. RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" script: - - time # cargo test --doc + - time cargo test --doc check-runtime-benchmarks: stage: test @@ -38,7 +38,7 @@ check-runtime-benchmarks: # Check that the node will compile with `runtime-benchmarks` feature flag. - time cargo check --all --features runtime-benchmarks # Check that parachain-template will compile with `runtime-benchmarks` feature flag. - - time # cargo check -p parachain-template-node --features runtime-benchmarks + - time cargo check -p parachain-template-node --features runtime-benchmarks cargo-check-try-runtime: stage: test @@ -53,7 +53,7 @@ cargo-check-try-runtime: # Check that the node will compile with `try-runtime` feature flag. - time cargo check --all --features try-runtime # Check that parachain-template will compile with `try-runtime` feature flag. - - time # cargo check -p parachain-template-node --features try-runtime + - time cargo check -p parachain-template-node --features try-runtime check-rustdoc: stage: test @@ -64,7 +64,7 @@ check-rustdoc: SKIP_WASM_BUILD: 1 RUSTDOCFLAGS: "-Dwarnings" script: - - time # cargo +nightly doc --workspace --all-features --verbose --no-deps + - time cargo +nightly doc --workspace --all-features --verbose --no-deps cargo-check-benches: stage: test @@ -76,4 +76,4 @@ cargo-check-benches: - job: check-rustdoc artifacts: false script: - - time # cargo check --all --benches + - time cargo check --all --benches From 761a5005d275f1f9096ebac96e7ee0566cc6d101 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 1 Feb 2023 14:07:02 +0100 Subject: [PATCH 043/339] Unit-test for handling `ReserveAssetDeposited` on Westmint for ForeignAssets --- .../pallets/bridge-assets-transfer/src/lib.rs | 2 + .../assets/westmint/src/xcm_config.rs | 94 +++++++++++++++---- .../runtimes/assets/westmint/tests/tests.rs | 85 ++++++++++++++++- 3 files changed, 163 insertions(+), 18 deletions(-) diff --git a/parachains/pallets/bridge-assets-transfer/src/lib.rs b/parachains/pallets/bridge-assets-transfer/src/lib.rs index 3c3e32a0b53..ba87ae0d956 100644 --- a/parachains/pallets/bridge-assets-transfer/src/lib.rs +++ b/parachains/pallets/bridge-assets-transfer/src/lib.rs @@ -214,6 +214,8 @@ pub mod pallet { .expect("aaa"); let xcm: Xcm<()> = sp_std::vec![ + // TODO:check-parameter - setup fees + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, ReserveAssetDeposited(asset.into()), ClearOrigin, DepositAsset { assets: All.into(), beneficiary: remote_destination } diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index e43ec35dd5f..7f09f8f5a24 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -15,14 +15,14 @@ use super::{ AccountId, AllPalletsWithSystem, AssetIdForTrustBackedAssets, Assets, Authorship, Balance, - Balances, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, - RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + Balances, ForeignAssets, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, + RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, traits::{ - ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, OriginTrait, - PalletInfoAccess, + ConstU32, Contains, ContainsPair, EnsureOrigin, EnsureOriginWithArg, Everything, + OriginTrait, PalletInfoAccess, }, }; use pallet_xcm::{EnsureXcm, XcmPassthrough}; @@ -40,13 +40,13 @@ use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, ConvertedConcreteId, CurrencyAdapter, EnsureXcmOrigin, FungiblesAdapter, IsConcrete, LocalMint, - NativeAsset, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, - WithComputedOrigin, + NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, + WeightInfoBounds, WithComputedOrigin, }; use xcm_executor::{ - traits::{Convert, ConvertOrigin, JustTry, ShouldExecute, WithOriginFilter}, + traits::{Convert, ConvertOrigin, Identity, JustTry, ShouldExecute, WithOriginFilter}, XcmExecutor, }; @@ -92,7 +92,7 @@ pub type CurrencyTransactor = CurrencyAdapter< /// Means for transacting assets besides the native currency on this chain. pub type FungiblesTransactor = FungiblesAdapter< // Use this fungibles implementation: - Assets, // todo: accept all instances + Assets, // Use this currency when it is a fungible asset matching the given location or name: ConvertedConcreteId< AssetIdForTrustBackedAssets, @@ -114,8 +114,27 @@ pub type FungiblesTransactor = FungiblesAdapter< // The account to use for tracking teleports. CheckingAccount, >; + +/// Means for transacting foreign assets from different global consensus. +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + ForeignAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ConvertedConcreteId, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // TODO:check-parameter - no teleports + NoChecking, + // The account to use for tracking teleports. + CheckingAccount, +>; + /// Means for transacting assets on this chain. -pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor); +// TODO:check-paramter - FungiblesTransactor cannot be in the middle, because stops tuple execution, check/fix? +// TODO:check-paramter - possible bug for matches_fungibles and return error and tuple processing? +pub type AssetTransactors = (CurrencyTransactor, ForeignFungiblesTransactor, FungiblesTransactor); /// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, /// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can @@ -293,10 +312,10 @@ impl xcm_executor::Config for XcmConfig { type XcmSender = XcmRouter; type AssetTransactor = AssetTransactors; type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Westmint does not recognize a reserve location for any asset. This does not prevent - // Westmint acting _as_ a reserve location for WND and assets created under `pallet-assets`. + // Westmint is acting _as_ a reserve location for WND and assets created under `pallet-assets`. // For WND, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = (); + type IsReserve = + (ConcreteFungibleAssetsFromTrustedBridgedReserves); type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of WND type UniversalLocation = UniversalLocation; type Barrier = Barrier; @@ -317,10 +336,10 @@ impl xcm_executor::Config for XcmConfig { TrustBackedAssetsPalletLocation, AssetIdForTrustBackedAssets, JustTry, - >, // todo: accept all instances + >, JustTry, >, - Assets, // todo: accept all instances + Assets, cumulus_primitives_utility::XcmFeesTo32ByteAccount< FungiblesTransactor, AccountId, @@ -429,6 +448,7 @@ impl EnsureOriginWithArg for ForeignCreators { pub struct XcmBenchmarkHelper; #[cfg(feature = "runtime-benchmarks")] use pallet_assets::BenchmarkHelper; + #[cfg(feature = "runtime-benchmarks")] impl BenchmarkHelper for XcmBenchmarkHelper { fn create_asset_id_parameter(id: u32) -> MultiLocation { @@ -437,11 +457,22 @@ impl BenchmarkHelper for XcmBenchmarkHelper { } parameter_types! { + // TODO:check-parameter - join all together in one on-chain cfg (statemine/t, eth(chain_ids), ...) + // TODO:check-parameter - add new pallet and persist/manage this via governance? // Means, that we accept some `GlobalConsensus` from some `MultiLocation` (which is supposed to be our bridge-hub) pub TrustedBridgedNetworks: sp_std::vec::Vec<(MultiLocation, Junction)> = sp_std::vec![ (MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, GlobalConsensus(NetworkId::Rococo)) ]; + // TODO:check-parameter - add new pallet and persist/manage this via governance? + // TODO:check-parameter - we specify here just trusted location, we can extend this with some AssetFilter patterns to trust only to several assets + pub TrustedBridgedReserveLocations: sp_std::vec::Vec = sp_std::vec![ + // TODO:check-parameter - tmp values that cover local/live Rococo/Wococo run + MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1000)) }, + MultiLocation { parents: 2, interior: X2(GlobalConsensus(Kusama), Parachain(1000)) }, + MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1015)) }, + MultiLocation { parents: 2, interior: X2(GlobalConsensus(Kusama), Parachain(1015)) }, + ]; } impl Contains<(MultiLocation, Junction)> for TrustedBridgedNetworks { @@ -450,17 +481,48 @@ impl Contains<(MultiLocation, Junction)> for TrustedBridgedNetworks { } } +impl Contains for TrustedBridgedReserveLocations { + fn contains(t: &MultiLocation) -> bool { + Self::get().contains(t) + } +} + pub type BridgedCallsBarrier = ( // TODO:check-parameter - verify, if we need for production (usefull at least for testing connection in production) AllowExecutionForTrapFrom, // TODO:check-parameter - verify, if we need for production AllowExecutionForTransactFrom, + // TODO:check-parameter - setup fess + // TODO:check-parameter - change Everything to some Contains with trusted BridgeHub configuration + // Configured trusted BridgeHub gets free execution. + AllowExplicitUnpaidExecutionFrom, // Expected responses are OK. AllowKnownQueryResponses, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, ); +/// Asset filter that allows all assets from trusted bridge location +pub struct ConcreteFungibleAssetsFromTrustedBridgedReserves( + sp_std::marker::PhantomData, +); +impl> ContainsPair + for ConcreteFungibleAssetsFromTrustedBridgedReserves +{ + fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + log::trace!( + target: "xcm::barriers", + "ConcreteFungibleAssetsFromTrustedBridgedReserves origin: {:?}, asset: {:?}", + origin, asset, + ); + if !TrustedReserverLocations::contains(origin) { + return false + } + // TODO:check-parameter - better assets filtering + matches!(asset, MultiAsset { id: AssetId::Concrete(_), fun: Fungible(_) }) + } +} + pub struct AllowExecutionForTrapFrom(sp_std::marker::PhantomData); impl> ShouldExecute for AllowExecutionForTrapFrom { fn should_execute( diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 8d25f2f9494..457025cccf3 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -7,11 +7,14 @@ use frame_support::{ weights::{Weight, WeightToFee as WeightToFeeT}, }; use parachains_common::{AccountId, AuraId}; -use westmint_runtime::xcm_config::AssetFeeAsExistentialDepositMultiplierFeeCharger; +use westmint_runtime::xcm_config::{ + AssetFeeAsExistentialDepositMultiplierFeeCharger, SovereignAccountOf, +}; pub use westmint_runtime::{ constants::fee::WeightToFee, xcm_config::{LocationToAccountId, XcmConfig}, - Assets, Balances, ExistentialDeposit, Runtime, RuntimeCall, RuntimeEvent, SessionKeys, System, + Assets, Balances, ExistentialDeposit, ForeignAssets, Runtime, RuntimeCall, RuntimeEvent, + SessionKeys, System, }; use xcm::latest::prelude::*; use xcm_executor::{traits::WeightTrader, XcmExecutor}; @@ -389,6 +392,84 @@ fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { }); } +#[test] +fn test_receive_bridged_xcm_reserve_asset_deposited_works() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .with_tracing() + .build() + .execute_with(|| { + use xcm_executor::traits::Convert; + let local_bridge_hub: MultiLocation = (Parent, Parachain(1014)).into(); + let local_bridge_hub_sovereign_account = + SovereignAccountOf::convert_ref(local_bridge_hub) + .expect("converted bridge location as accountId"); + + // create foreign asset + let foreign_asset_id = + MultiLocation { parents: 2, interior: X1(GlobalConsensus(Rococo)) }; + let minimum_asset_balance = 1_000_000_u128; + assert_ok!(ForeignAssets::force_create( + // TODO:check-parameter - tests for create and real ForeignCreators check + // RuntimeHelper::::origin_of(local_bridge_hub_sovereign_account.clone()), + RuntimeHelper::::root_origin(), + foreign_asset_id.clone(), + local_bridge_hub_sovereign_account.into(), + false, + minimum_asset_balance + )); + + // check ForeinAssets before + assert_eq!(ForeignAssets::balance(foreign_asset_id, AccountId::from(ALICE)), 0); + + // simulate received message: + // 2023-01-31 22:14:18.393 DEBUG toki -runtime-worker xcm::execute_xcm: [Parachain] origin: MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, message: Xcm([UniversalOrigin(GlobalConsensus(Rococo)), DescendOrigin(X1(Parachain(1000))), ReserveAssetDeposited(MultiAssets([MultiAsset { id: Concrete(MultiLocation { parents: 2, interior: X1(GlobalConsensus(Kusama)) }), fun: Fungible(100000000) }])), ClearOrigin, DepositAsset { assets: Wild(All), beneficiary: MultiLocation { parents: 0, interior: X1(AccountId32 { network: None, id: [28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11, 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124] }) } }]) + // origin as BridgeHub + let origin = MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; + let xcm = Xcm(vec![ + UniversalOrigin(GlobalConsensus(Rococo)), + DescendOrigin(X1(Parachain(1000))), + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + ReserveAssetDeposited(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(Rococo)), + }), + fun: Fungible(100_000_000), + }])), + ClearOrigin, + DepositAsset { + assets: Wild(All), + beneficiary: MultiLocation { + parents: 0, + interior: X1(AccountId32 { + network: None, + id: AccountId::from(ALICE).into(), + }), + }, + }, + ]); + + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let weight_limit = Weight::from_ref_time(41666666666); + + // execute xcm as XcmpQueue would do + let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); + assert_eq!(outcome.ensure_complete(), Ok(())); + + // check ForeinAssets after + assert_eq!( + ForeignAssets::balance(foreign_asset_id, AccountId::from(ALICE)), + 100_000_000 + ); + }) +} + #[test] fn test_receive_bridged_xcm_transact_with_remark_with_event_works() { ExtBuilder::::default() From 05902412e5b3aa2d9f109958e1efda3465da39d4 Mon Sep 17 00:00:00 2001 From: muharem Date: Mon, 13 Feb 2023 04:51:54 +0100 Subject: [PATCH 044/339] use updated api for ensure origin trait --- parachains/runtimes/assets/statemine/src/xcm_config.rs | 4 ++-- parachains/runtimes/assets/westmint/src/xcm_config.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 05b6765606f..a37b66a32bc 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -420,8 +420,8 @@ impl EnsureOriginWithArg for ForeignCreators { } #[cfg(feature = "runtime-benchmarks")] - fn successful_origin(a: &MultiLocation) -> RuntimeOrigin { - pallet_xcm::Origin::Xcm(a.clone()).into() + fn try_successful_origin(a: &MultiLocation) -> Result { + Ok(pallet_xcm::Origin::Xcm(a.clone()).into()) } } diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 377fc1ebbd3..ed06d531822 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -410,8 +410,8 @@ impl EnsureOriginWithArg for ForeignCreators { } #[cfg(feature = "runtime-benchmarks")] - fn successful_origin(a: &MultiLocation) -> RuntimeOrigin { - pallet_xcm::Origin::Xcm(a.clone()).into() + fn try_successful_origin(a: &MultiLocation) -> Result { + Ok(pallet_xcm::Origin::Xcm(a.clone()).into()) } } From d5b71a7d39a70d626019fcaabfce4a7f067c845c Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Wed, 15 Mar 2023 11:15:28 +0300 Subject: [PATCH 045/339] Benchmarks for pallet-bridge-assets-transfer (#2316) * benchmarks for pallet-bridge-asset-transfer * use proper template for pallet weights * fix test * fixing compialtion * fix (?) compilation warn/error in westmint * weight limits in can_governance_call_xcm_transact_with_bridge_assets_transfer_configuration * ".git/.scripts/commands/bench/bench.sh" pallet statemine assets pallet_bridge_assets_transfer * ".git/.scripts/commands/bench/bench.sh" pallet statemine assets pallet_bridge_assets_transfer * add prototype for multiple assets benchmarking --------- Co-authored-by: command-bot <> --- Cargo.lock | 1 + pallets/parachain-system/src/lib.rs | 24 + .../pallets/bridge-assets-transfer/Cargo.toml | 4 +- .../src/benchmarking.rs | 893 +----------------- .../pallets/bridge-assets-transfer/src/lib.rs | 116 ++- .../bridge-assets-transfer/src/weights.rs | 53 +- .../runtimes/assets/statemine/Cargo.toml | 1 + .../runtimes/assets/statemine/src/lib.rs | 5 +- .../src/weights/bridge_assets_transfer.rs | 110 +++ .../assets/statemine/src/weights/mod.rs | 1 + .../weights/pallet_bridge_assets_transfer.rs | 111 +++ .../assets/statemine/src/xcm_config.rs | 66 ++ .../runtimes/assets/statemine/tests/tests.rs | 6 +- .../assets/westmint/src/xcm_config.rs | 2 +- scripts/benchmarks-ci.sh | 5 + 15 files changed, 466 insertions(+), 932 deletions(-) create mode 100644 parachains/runtimes/assets/statemine/src/weights/bridge_assets_transfer.rs create mode 100644 parachains/runtimes/assets/statemine/src/weights/pallet_bridge_assets_transfer.rs diff --git a/Cargo.lock b/Cargo.lock index 3f9b166ee2e..328b420be6b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6049,6 +6049,7 @@ name = "pallet-bridge-assets-transfer" version = "0.1.0" dependencies = [ "cumulus-pallet-xcmp-queue", + "frame-benchmarking", "frame-support", "frame-system", "log", diff --git a/pallets/parachain-system/src/lib.rs b/pallets/parachain-system/src/lib.rs index 456ae5bf578..922a9b2a6f7 100644 --- a/pallets/parachain-system/src/lib.rs +++ b/pallets/parachain-system/src/lib.rs @@ -996,6 +996,30 @@ impl Pallet { pub fn set_custom_validation_head_data(head_data: Vec) { CustomValidationHeadData::::put(head_data); } + + /// Open HRMP channel for using it in benchmarks. + /// + /// The caller assumes that the pallet will accept regular outbound message to the sibling + /// `target_parachain` after this call. No other assumptions are made. + #[cfg(feature = "runtime-benchmarks")] + pub fn open_outbound_hrmp_channel_for_benchmarks(target_parachain: ParaId) { + RelevantMessagingState::::put(MessagingStateSnapshot { + dmq_mqc_head: Default::default(), + relay_dispatch_queue_size: Default::default(), + ingress_channels: Default::default(), + egress_channels: vec![( + target_parachain, + cumulus_primitives_core::AbridgedHrmpChannel { + max_capacity: 10, + max_total_size: 10_000_000_u32, + max_message_size: 10_000_000_u32, + msg_count: 10, + total_size: 10_000_000_u32, + mqc_head: None, + }, + )], + }) + } } pub struct ParachainSetCode(sp_std::marker::PhantomData); diff --git a/parachains/pallets/bridge-assets-transfer/Cargo.toml b/parachains/pallets/bridge-assets-transfer/Cargo.toml index e767c891892..a2eb9b82dce 100644 --- a/parachains/pallets/bridge-assets-transfer/Cargo.toml +++ b/parachains/pallets/bridge-assets-transfer/Cargo.toml @@ -17,6 +17,7 @@ log = { version = "0.4.14", default-features = false } # Substrate sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-benchmarking = { default-features = false, optional = true, git = "https://github.com/paritytech/substrate", branch = "master" } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -45,7 +46,8 @@ std = [ "xcm-executor/std", ] runtime-benchmarks = [ - "sp-runtime/runtime-benchmarks", + "frame-benchmarking", "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/parachains/pallets/bridge-assets-transfer/src/benchmarking.rs b/parachains/pallets/bridge-assets-transfer/src/benchmarking.rs index e2e1579fcc9..0aee9e477c0 100644 --- a/parachains/pallets/bridge-assets-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-assets-transfer/src/benchmarking.rs @@ -15,875 +15,58 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Alliance pallet benchmarking. +//! `BridgeAssetsTransfer` pallet benchmarks. -use sp_runtime::traits::{Bounded, Hash, StaticLookup}; -use sp_std::{ - cmp, - convert::{TryFrom, TryInto}, - mem::size_of, - prelude::*, -}; +use crate::{BenchmarkHelper, Bridges, Call, Config, Event, Pallet}; -use frame_benchmarking::{account, benchmarks_instance_pallet}; -use frame_support::traits::{EnsureOrigin, Get, UnfilteredDispatchable}; -use frame_system::{Pallet as System, RawOrigin as SystemOrigin}; +use frame_benchmarking::{benchmarks, BenchmarkError}; +use frame_support::traits::EnsureOrigin; +use sp_std::prelude::*; -use super::{Call as AllianceCall, Pallet as Alliance, *}; - -const SEED: u32 = 0; - -const MAX_BYTES: u32 = 1_024; - -fn assert_last_event, I: 'static>(generic_event: >::RuntimeEvent) { - frame_system::Pallet::::assert_last_event(generic_event.into()); -} - -fn cid(input: impl AsRef<[u8]>) -> Cid { - use sha2::{Digest, Sha256}; - let mut hasher = Sha256::new(); - hasher.update(input); - let result = hasher.finalize(); - Cid::new_v0(&*result) -} - -fn rule(input: impl AsRef<[u8]>) -> Cid { - cid(input) -} - -fn announcement(input: impl AsRef<[u8]>) -> Cid { - cid(input) -} - -fn funded_account, I: 'static>(name: &'static str, index: u32) -> T::AccountId { - let account: T::AccountId = account(name, index, SEED); - T::Currency::make_free_balance_be(&account, BalanceOf::::max_value() / 100u8.into()); - account -} - -fn founder, I: 'static>(index: u32) -> T::AccountId { - funded_account::("founder", index) -} - -fn fellow, I: 'static>(index: u32) -> T::AccountId { - funded_account::("fellow", index) -} - -fn ally, I: 'static>(index: u32) -> T::AccountId { - funded_account::("ally", index) -} - -fn outsider, I: 'static>(index: u32) -> T::AccountId { - funded_account::("outsider", index) -} - -fn generate_unscrupulous_account, I: 'static>(index: u32) -> T::AccountId { - funded_account::("unscrupulous", index) -} - -fn set_members, I: 'static>() { - let founders: BoundedVec<_, T::MaxMembersCount> = - BoundedVec::try_from(vec![founder::(1), founder::(2)]).unwrap(); - Members::::insert(MemberRole::Founder, founders.clone()); - - let fellows: BoundedVec<_, T::MaxMembersCount> = - BoundedVec::try_from(vec![fellow::(1), fellow::(2)]).unwrap(); - fellows.iter().for_each(|who| { - T::Currency::reserve(&who, T::AllyDeposit::get()).unwrap(); - >::insert(&who, T::AllyDeposit::get()); - }); - Members::::insert(MemberRole::Fellow, fellows.clone()); - - let allies: BoundedVec<_, T::MaxMembersCount> = - BoundedVec::try_from(vec![ally::(1)]).unwrap(); - allies.iter().for_each(|who| { - T::Currency::reserve(&who, T::AllyDeposit::get()).unwrap(); - >::insert(&who, T::AllyDeposit::get()); - }); - Members::::insert(MemberRole::Ally, allies); - - T::InitializeMembers::initialize_members(&[founders.as_slice(), fellows.as_slice()].concat()); -} - -benchmarks_instance_pallet! { - // This tests when proposal is created and queued as "proposed" - propose_proposed { - let b in 1 .. MAX_BYTES; - let x in 2 .. T::MaxFounders::get(); - let y in 0 .. T::MaxFellows::get(); - let p in 1 .. T::MaxProposals::get(); - - let m = x + y; - - let bytes_in_storage = b + size_of::() as u32 + 32; - - // Construct `members`. - let founders = (0 .. x).map(founder::).collect::>(); - let proposer = founders[0].clone(); - let fellows = (0 .. y).map(fellow::).collect::>(); - - Alliance::::init_members( - SystemOrigin::Root.into(), - founders, - fellows, - vec![], - )?; - - let threshold = m; - // Add previous proposals. - for i in 0 .. p - 1 { - // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = AllianceCall::::set_rule { - rule: rule(vec![i as u8; b as usize]) - }.into(); - Alliance::::propose( - SystemOrigin::Signed(proposer.clone()).into(), - threshold, - Box::new(proposal), - bytes_in_storage, - )?; - } - - let proposal: T::Proposal = AllianceCall::::set_rule { rule: rule(vec![p as u8; b as usize]) }.into(); - - }: propose(SystemOrigin::Signed(proposer.clone()), threshold, Box::new(proposal.clone()), bytes_in_storage) - verify { - // New proposal is recorded - let proposal_hash = T::Hashing::hash_of(&proposal); - assert_eq!(T::ProposalProvider::proposal_of(proposal_hash), Some(proposal)); - } - - vote { - // We choose 5 (3 founders + 2 fellows) as a minimum so we always trigger a vote in the voting loop (`for j in ...`) - let x in 3 .. T::MaxFounders::get(); - let y in 2 .. T::MaxFellows::get(); - - let m = x + y; - - let p = T::MaxProposals::get(); - let b = MAX_BYTES; - let bytes_in_storage = b + size_of::() as u32 + 32; - - // Construct `members`. - let founders = (0 .. x).map(founder::).collect::>(); - let proposer = founders[0].clone(); - let fellows = (0 .. y).map(fellow::).collect::>(); - - let mut members = Vec::with_capacity(founders.len() + fellows.len()); - members.extend(founders.clone()); - members.extend(fellows.clone()); - - Alliance::::init_members( - SystemOrigin::Root.into(), - founders, - fellows, - vec![], - )?; - - // Threshold is 1 less than the number of members so that one person can vote nay - let threshold = m - 1; - - // Add previous proposals - let mut last_hash = T::Hash::default(); - for i in 0 .. p { - // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = AllianceCall::::set_rule { - rule: rule(vec![i as u8; b as usize]) - }.into(); - Alliance::::propose( - SystemOrigin::Signed(proposer.clone()).into(), - threshold, - Box::new(proposal.clone()), - b, - )?; - last_hash = T::Hashing::hash_of(&proposal); - } - - let index = p - 1; - // Have almost everyone vote aye on last proposal, while keeping it from passing. - for j in 0 .. m - 3 { - let voter = &members[j as usize]; - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - true, - )?; - } - - let voter = members[m as usize - 3].clone(); - // Voter votes aye without resolving the vote. - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - true, - )?; - - // Voter switches vote to nay, but does not kill the vote, just updates + inserts - let approve = false; - - // Whitelist voter account from further DB operations. - let voter_key = frame_system::Account::::hashed_key_for(&voter); - frame_benchmarking::benchmarking::add_to_whitelist(voter_key.into()); - }: _(SystemOrigin::Signed(voter), last_hash.clone(), index, approve) - verify { - } - - veto { - let p in 1 .. T::MaxProposals::get(); - - let m = 3; - let b = MAX_BYTES; - let bytes_in_storage = b + size_of::() as u32 + 32; - - // Construct `members`. - let founders = (0 .. m).map(founder::).collect::>(); - let vetor = founders[0].clone(); - - Alliance::::init_members( - SystemOrigin::Root.into(), - founders, - vec![], - vec![], - )?; - - // Threshold is one less than total members so that two nays will disapprove the vote - let threshold = m - 1; - - // Add proposals - let mut last_hash = T::Hash::default(); - for i in 0 .. p { - // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = AllianceCall::::set_rule { - rule: rule(vec![i as u8; b as usize]) - }.into(); - Alliance::::propose( - SystemOrigin::Signed(vetor.clone()).into(), - threshold, - Box::new(proposal.clone()), - bytes_in_storage, - )?; - last_hash = T::Hashing::hash_of(&proposal); - } - - }: _(SystemOrigin::Signed(vetor), last_hash.clone()) - verify { - // The proposal is removed - assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); - } - - close_early_disapproved { - // We choose 4 (2 founders + 2 fellows) as a minimum so we always trigger a vote in the voting loop (`for j in ...`) - let x in 2 .. T::MaxFounders::get(); - let y in 2 .. T::MaxFellows::get(); - let p in 1 .. T::MaxProposals::get(); - - let m = x + y; - - let bytes = 100; - let bytes_in_storage = bytes + size_of::() as u32 + 32; - - // Construct `members`. - let founders = (0 .. x).map(founder::).collect::>(); - let fellows = (0 .. y).map(fellow::).collect::>(); - - let mut members = Vec::with_capacity(founders.len() + fellows.len()); - members.extend(founders.clone()); - members.extend(fellows.clone()); - - Alliance::::init_members( - SystemOrigin::Root.into(), - founders, - fellows, - vec![], - )?; - - let proposer = members[0].clone(); - let voter = members[1].clone(); - - // Threshold is total members so that one nay will disapprove the vote - let threshold = m; - - // Add previous proposals - let mut last_hash = T::Hash::default(); - for i in 0 .. p { - // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = AllianceCall::::set_rule { - rule: rule(vec![i as u8; bytes as usize]) - }.into(); - Alliance::::propose( - SystemOrigin::Signed(proposer.clone()).into(), - threshold, - Box::new(proposal.clone()), - bytes_in_storage, - )?; - last_hash = T::Hashing::hash_of(&proposal); - assert_eq!(T::ProposalProvider::proposal_of(last_hash), Some(proposal)); - } - - let index = p - 1; - // Have most everyone vote aye on last proposal, while keeping it from passing. - for j in 2 .. m - 1 { - let voter = &members[j as usize]; - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - true, - )?; - } - - // Voter votes aye without resolving the vote. - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - true, - )?; - - // Voter switches vote to nay, which kills the vote - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - false, - )?; - - // Whitelist voter account from further DB operations. - let voter_key = frame_system::Account::::hashed_key_for(&voter); - frame_benchmarking::benchmarking::add_to_whitelist(voter_key.into()); - }: close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::MAX, bytes_in_storage) - verify { - // The last proposal is removed. - assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); - } - - close_early_approved { - let b in 1 .. MAX_BYTES; - // We choose 4 (2 founders + 2 fellows) as a minimum so we always trigger a vote in the voting loop (`for j in ...`) - let x in 2 .. T::MaxFounders::get(); - let y in 2 .. T::MaxFellows::get(); - let p in 1 .. T::MaxProposals::get(); - - let m = x + y; - let bytes_in_storage = b + size_of::() as u32 + 32; - - // Construct `members`. - let founders = (0 .. x).map(founder::).collect::>(); - let fellows = (0 .. y).map(fellow::).collect::>(); - - let mut members = Vec::with_capacity(founders.len() + fellows.len()); - members.extend(founders.clone()); - members.extend(fellows.clone()); - - Alliance::::init_members( - SystemOrigin::Root.into(), - founders, - fellows, - vec![], - )?; - - let proposer = members[0].clone(); - let voter = members[1].clone(); - - // Threshold is 2 so any two ayes will approve the vote - let threshold = 2; - - // Add previous proposals - let mut last_hash = T::Hash::default(); - for i in 0 .. p { - // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = AllianceCall::::set_rule { - rule: rule(vec![i as u8; b as usize]) - }.into(); - Alliance::::propose( - SystemOrigin::Signed(proposer.clone()).into(), - threshold, - Box::new(proposal.clone()), - bytes_in_storage, - )?; - last_hash = T::Hashing::hash_of(&proposal); - assert_eq!(T::ProposalProvider::proposal_of(last_hash), Some(proposal)); - } - - let index = p - 1; - // Caller switches vote to nay on their own proposal, allowing them to be the deciding approval vote - Alliance::::vote( - SystemOrigin::Signed(proposer.clone()).into(), - last_hash.clone(), - index, - false, - )?; - - // Have almost everyone vote nay on last proposal, while keeping it from failing. - for j in 2 .. m - 1 { - let voter = &members[j as usize]; - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - false, - )?; - } - - // Member zero is the first aye - Alliance::::vote( - SystemOrigin::Signed(members[0].clone()).into(), - last_hash.clone(), - index, - true, - )?; - - let voter = members[1].clone(); - // Caller switches vote to aye, which passes the vote - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - true, - )?; - }: close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::MAX, bytes_in_storage) - verify { - // The last proposal is removed. - assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); - } - - close_disapproved { - // We choose 2 (2 founders / 2 fellows) as a minimum so we always trigger a vote in the voting loop (`for j in ...`) - let x in 2 .. T::MaxFounders::get(); - let y in 2 .. T::MaxFellows::get(); - let p in 1 .. T::MaxProposals::get(); - - let m = x + y; - - let bytes = 100; - let bytes_in_storage = bytes + size_of::() as u32 + 32; - - // Construct `members`. - let founders = (0 .. x).map(founder::).collect::>(); - let fellows = (0 .. y).map(fellow::).collect::>(); - - let mut members = Vec::with_capacity(founders.len() + fellows.len()); - members.extend(founders.clone()); - members.extend(fellows.clone()); - - Alliance::::init_members( - SystemOrigin::Root.into(), - founders, - fellows, - vec![], - )?; - - let proposer = members[0].clone(); - let voter = members[1].clone(); - - // Threshold is one less than total members so that two nays will disapprove the vote - let threshold = m - 1; - - // Add proposals - let mut last_hash = T::Hash::default(); - for i in 0 .. p { - // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = AllianceCall::::set_rule { - rule: rule(vec![i as u8; bytes as usize]) - }.into(); - Alliance::::propose( - SystemOrigin::Signed(proposer.clone()).into(), - threshold, - Box::new(proposal.clone()), - bytes_in_storage, - )?; - last_hash = T::Hashing::hash_of(&proposal); - assert_eq!(T::ProposalProvider::proposal_of(last_hash), Some(proposal)); - } - - let index = p - 1; - // Have almost everyone vote aye on last proposal, while keeping it from passing. - // A few abstainers will be the nay votes needed to fail the vote. - for j in 2 .. m - 1 { - let voter = &members[j as usize]; - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - true, - )?; - } - - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - false, - )?; - - System::::set_block_number(T::BlockNumber::max_value()); - - }: close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::MAX, bytes_in_storage) - verify { - // The last proposal is removed. - assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); - } - - close_approved { - let b in 1 .. MAX_BYTES; - // We choose 4 (2 founders + 2 fellows) as a minimum so we always trigger a vote in the voting loop (`for j in ...`) - let x in 2 .. T::MaxFounders::get(); - let y in 2 .. T::MaxFellows::get(); - let p in 1 .. T::MaxProposals::get(); - - let m = x + y; - let bytes_in_storage = b + size_of::() as u32 + 32; - - // Construct `members`. - let founders = (0 .. x).map(founder::).collect::>(); - let fellows = (0 .. y).map(fellow::).collect::>(); - - let mut members = Vec::with_capacity(founders.len() + fellows.len()); - members.extend(founders.clone()); - members.extend(fellows.clone()); - - Alliance::::init_members( - SystemOrigin::Root.into(), - founders, - fellows, - vec![], - )?; - - let proposer = members[0].clone(); - let voter = members[1].clone(); - - // Threshold is two, so any two ayes will pass the vote - let threshold = 2; - - // Add proposals - let mut last_hash = T::Hash::default(); - for i in 0 .. p { - // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = AllianceCall::::set_rule { - rule: rule(vec![i as u8; b as usize]) - }.into(); - Alliance::::propose( - SystemOrigin::Signed(proposer.clone()).into(), - threshold, - Box::new(proposal.clone()), - bytes_in_storage, - )?; - last_hash = T::Hashing::hash_of(&proposal); - assert_eq!(T::ProposalProvider::proposal_of(last_hash), Some(proposal)); - } - - // The prime member votes aye, so abstentions default to aye. - Alliance::::vote( - SystemOrigin::Signed(proposer.clone()).into(), - last_hash.clone(), - p - 1, - true // Vote aye. - )?; - - let index = p - 1; - // Have almost everyone vote nay on last proposal, while keeping it from failing. - // A few abstainers will be the aye votes needed to pass the vote. - for j in 2 .. m - 1 { - let voter = &members[j as usize]; - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - false - )?; - } - - // caller is prime, prime already votes aye by creating the proposal - System::::set_block_number(T::BlockNumber::max_value()); - - }: close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::MAX, bytes_in_storage) - verify { - // The last proposal is removed. - assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); - } - - init_members { - // at least 1 founders - let x in 1 .. T::MaxFounders::get(); - let y in 0 .. T::MaxFellows::get(); - let z in 0 .. T::MaxAllies::get(); - - let mut founders = (0 .. x).map(founder::).collect::>(); - let mut fellows = (0 .. y).map(fellow::).collect::>(); - let mut allies = (0 .. z).map(ally::).collect::>(); - - }: _(SystemOrigin::Root, founders.clone(), fellows.clone(), allies.clone()) - verify { - founders.sort(); - fellows.sort(); - allies.sort(); - assert_last_event::(Event::MembersInitialized { - founders: founders.clone(), - fellows: fellows.clone(), - allies: allies.clone(), - }.into()); - assert_eq!(Alliance::::members(MemberRole::Founder), founders); - assert_eq!(Alliance::::members(MemberRole::Fellow), fellows); - assert_eq!(Alliance::::members(MemberRole::Ally), allies); - } - - disband { - // at least 1 founders - let x in 1 .. T::MaxFounders::get() + T::MaxFellows::get(); - let y in 0 .. T::MaxAllies::get(); - let z in 0 .. T::MaxMembersCount::get() / 2; - - let voting_members = (0 .. x).map(founder::).collect::>(); - let allies = (0 .. y).map(ally::).collect::>(); - let witness = DisbandWitness{ - voting_members: x, - ally_members: y, - }; - - // setting the Alliance to disband on the benchmark call - Alliance::::init_members( - SystemOrigin::Root.into(), - voting_members.clone(), - vec![], - allies.clone(), - )?; - - // reserve deposits - let deposit = T::AllyDeposit::get(); - for member in voting_members.iter().chain(allies.iter()).take(z as usize) { - T::Currency::reserve(&member, deposit)?; - >::insert(&member, deposit); - } - - assert_eq!(Alliance::::voting_members_count(), x); - assert_eq!(Alliance::::ally_members_count(), y); - }: _(SystemOrigin::Root, witness) - verify { - assert_last_event::(Event::AllianceDisbanded { - voting_members: x, - ally_members: y, - unreserved: cmp::min(z, x + y), - }.into()); - - assert!(!Alliance::::is_initialized()); - } - - set_rule { - set_members::(); - - let rule = rule(b"hello world"); - - let call = Call::::set_rule { rule: rule.clone() }; - let origin = T::AdminOrigin::successful_origin(); - }: { call.dispatch_bypass_filter(origin)? } - verify { - assert_eq!(Alliance::::rule(), Some(rule.clone())); - assert_last_event::(Event::NewRuleSet { rule }.into()); - } - - announce { - set_members::(); - - let announcement = announcement(b"hello world"); - - let call = Call::::announce { announcement: announcement.clone() }; - let origin = T::AnnouncementOrigin::successful_origin(); - }: { call.dispatch_bypass_filter(origin)? } +benchmarks! { + transfer_asset_via_bridge { + // every asset has its own configuration and ledger, so there's a performance dependency + // TODO: add proper range after once pallet works with multiple assets + // (be sure to use "worst" of assets) + // let a in 1 .. 1; + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); + let (origin, assets, destination) = T::BenchmarkHelper::prepare_transfer(1); + Bridges::::insert(bridged_network, bridge_config); + }: _(origin, Box::new(assets), Box::new(destination)) verify { - assert!(Alliance::::announcements().contains(&announcement)); - assert_last_event::(Event::Announced { announcement }.into()); + // we don't care about message hash here, just check that the transfer has been initiated + let actual_event = frame_system::Pallet::::events().pop().map(|r| r.event); + let expected_event: ::RuntimeEvent = Event::TransferInitiated(Default::default()).into(); + assert!(matches!(actual_event, Some(expected_event))); } - remove_announcement { - set_members::(); - - let announcement = announcement(b"hello world"); - let announcements: BoundedVec<_, T::MaxAnnouncementsCount> = BoundedVec::try_from(vec![announcement.clone()]).unwrap(); - Announcements::::put(announcements); - - let call = Call::::remove_announcement { announcement: announcement.clone() }; - let origin = T::AnnouncementOrigin::successful_origin(); - }: { call.dispatch_bypass_filter(origin)? } + add_bridge_config { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); + }: _(origin, bridged_network, Box::new(bridge_config.clone())) verify { - assert!(Alliance::::announcements().is_empty()); - assert_last_event::(Event::AnnouncementRemoved { announcement }.into()); + assert_eq!(Bridges::::get(bridged_network), Some(bridge_config)); } - join_alliance { - set_members::(); - - let outsider = outsider::(1); - assert!(!Alliance::::is_member(&outsider)); - assert_eq!(DepositOf::::get(&outsider), None); - }: _(SystemOrigin::Signed(outsider.clone())) + remove_bridge_config { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); + Bridges::::insert(bridged_network, bridge_config); + }: _(origin, bridged_network) verify { - assert!(Alliance::::is_member_of(&outsider, MemberRole::Ally)); // outsider is now an ally - assert_eq!(DepositOf::::get(&outsider), Some(T::AllyDeposit::get())); // with a deposit - assert!(!Alliance::::has_voting_rights(&outsider)); // allies don't have voting rights - assert_last_event::(Event::NewAllyJoined { - ally: outsider, - nominator: None, - reserved: Some(T::AllyDeposit::get()) - }.into()); - } - - nominate_ally { - set_members::(); - - let founder1 = founder::(1); - assert!(Alliance::::is_member_of(&founder1, MemberRole::Founder)); - - let outsider = outsider::(1); - assert!(!Alliance::::is_member(&outsider)); - assert_eq!(DepositOf::::get(&outsider), None); - - let outsider_lookup = T::Lookup::unlookup(outsider.clone()); - }: _(SystemOrigin::Signed(founder1.clone()), outsider_lookup) - verify { - assert!(Alliance::::is_member_of(&outsider, MemberRole::Ally)); // outsider is now an ally - assert_eq!(DepositOf::::get(&outsider), None); // without a deposit - assert!(!Alliance::::has_voting_rights(&outsider)); // allies don't have voting rights - assert_last_event::(Event::NewAllyJoined { - ally: outsider, - nominator: Some(founder1), - reserved: None - }.into()); - } - - elevate_ally { - set_members::(); - - let ally1 = ally::(1); - assert!(Alliance::::is_ally(&ally1)); - - let ally1_lookup = T::Lookup::unlookup(ally1.clone()); - let call = Call::::elevate_ally { ally: ally1_lookup }; - let origin = T::MembershipManager::successful_origin(); - }: { call.dispatch_bypass_filter(origin)? } - verify { - assert!(!Alliance::::is_ally(&ally1)); - assert!(Alliance::::is_fellow(&ally1)); - assert_last_event::(Event::AllyElevated { ally: ally1 }.into()); - } - - give_retirement_notice { - set_members::(); - let fellow2 = fellow::(2); - - assert!(Alliance::::is_fellow(&fellow2)); - }: _(SystemOrigin::Signed(fellow2.clone())) - verify { - assert!(Alliance::::is_member_of(&fellow2, MemberRole::Retiring)); - - assert_eq!( - RetiringMembers::::get(&fellow2), - Some(System::::block_number() + T::RetirementPeriod::get()) - ); - assert_last_event::( - Event::MemberRetirementPeriodStarted {member: fellow2}.into() - ); + assert_eq!(Bridges::::get(bridged_network), None); } - retire { - set_members::(); - - let fellow2 = fellow::(2); - assert!(Alliance::::is_fellow(&fellow2)); - - assert_eq!( - Alliance::::give_retirement_notice( - SystemOrigin::Signed(fellow2.clone()).into() - ), - Ok(()) - ); - System::::set_block_number(System::::block_number() + T::RetirementPeriod::get()); - - assert_eq!(DepositOf::::get(&fellow2), Some(T::AllyDeposit::get())); - }: _(SystemOrigin::Signed(fellow2.clone())) - verify { - assert!(!Alliance::::is_member(&fellow2)); - assert_eq!(DepositOf::::get(&fellow2), None); - assert_last_event::(Event::MemberRetired { - member: fellow2, - unreserved: Some(T::AllyDeposit::get()) - }.into()); - } - - kick_member { - set_members::(); - - let fellow2 = fellow::(2); - assert!(Alliance::::is_member_of(&fellow2, MemberRole::Fellow)); - assert_eq!(DepositOf::::get(&fellow2), Some(T::AllyDeposit::get())); - - let fellow2_lookup = T::Lookup::unlookup(fellow2.clone()); - let call = Call::::kick_member { who: fellow2_lookup }; - let origin = T::MembershipManager::successful_origin(); - }: { call.dispatch_bypass_filter(origin)? } - verify { - assert!(!Alliance::::is_member(&fellow2)); - assert_eq!(DepositOf::::get(&fellow2), None); - assert_last_event::(Event::MemberKicked { - member: fellow2, - slashed: Some(T::AllyDeposit::get()) - }.into()); - } - - add_unscrupulous_items { - let n in 0 .. T::MaxUnscrupulousItems::get(); - let l in 0 .. T::MaxWebsiteUrlLength::get(); - - set_members::(); - - let accounts = (0 .. n) - .map(|i| generate_unscrupulous_account::(i)) - .collect::>(); - let websites = (0 .. n).map(|i| -> BoundedVec { - BoundedVec::try_from(vec![i as u8; l as usize]).unwrap() - }).collect::>(); - - let mut unscrupulous_list = Vec::with_capacity(accounts.len() + websites.len()); - unscrupulous_list.extend(accounts.into_iter().map(UnscrupulousItem::AccountId)); - unscrupulous_list.extend(websites.into_iter().map(UnscrupulousItem::Website)); - - let call = Call::::add_unscrupulous_items { items: unscrupulous_list.clone() }; - let origin = T::AnnouncementOrigin::successful_origin(); - }: { call.dispatch_bypass_filter(origin)? } - verify { - assert_last_event::(Event::UnscrupulousItemAdded { items: unscrupulous_list }.into()); - } - - remove_unscrupulous_items { - let n in 0 .. T::MaxUnscrupulousItems::get(); - let l in 0 .. T::MaxWebsiteUrlLength::get(); - - set_members::(); - - let mut accounts = (0 .. n) - .map(|i| generate_unscrupulous_account::(i)) - .collect::>(); - accounts.sort(); - let accounts: BoundedVec<_, T::MaxUnscrupulousItems> = accounts.try_into().unwrap(); - UnscrupulousAccounts::::put(accounts.clone()); - - let mut websites = (0 .. n).map(|i| -> BoundedVec<_, T::MaxWebsiteUrlLength> - { BoundedVec::try_from(vec![i as u8; l as usize]).unwrap() }).collect::>(); - websites.sort(); - let websites: BoundedVec<_, T::MaxUnscrupulousItems> = websites.try_into().unwrap(); - UnscrupulousWebsites::::put(websites.clone()); - - let mut unscrupulous_list = Vec::with_capacity(accounts.len() + websites.len()); - unscrupulous_list.extend(accounts.into_iter().map(UnscrupulousItem::AccountId)); - unscrupulous_list.extend(websites.into_iter().map(UnscrupulousItem::Website)); + update_bridge_config { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); + Bridges::::insert(bridged_network, bridge_config); - let call = Call::::remove_unscrupulous_items { items: unscrupulous_list.clone() }; - let origin = T::AnnouncementOrigin::successful_origin(); - }: { call.dispatch_bypass_filter(origin)? } + let fee = None; + }: _(origin, bridged_network, fee) verify { - assert_last_event::(Event::UnscrupulousItemRemoved { items: unscrupulous_list }.into()); + assert_eq!(Bridges::::get(bridged_network).unwrap().fee, None); } - impl_benchmark_test_suite!(Alliance, crate::mock::new_bench_ext(), crate::mock::Test); + impl_benchmark_test_suite!(Pallet, crate::tests::new_test_ext(), crate::tests::TestRuntime); } diff --git a/parachains/pallets/bridge-assets-transfer/src/lib.rs b/parachains/pallets/bridge-assets-transfer/src/lib.rs index ba87ae0d956..23b40529da5 100644 --- a/parachains/pallets/bridge-assets-transfer/src/lib.rs +++ b/parachains/pallets/bridge-assets-transfer/src/lib.rs @@ -28,6 +28,8 @@ use sp_std::boxed::Box; pub use pallet::*; use xcm::prelude::*; +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; pub mod weights; /// The log target of this pallet. @@ -55,8 +57,9 @@ impl From for (MultiLocation, Option) { #[frame_support::pallet] pub mod pallet { + pub use crate::weights::WeightInfo; + use super::*; - use crate::weights::WeightInfo; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; use xcm::latest::Error as XcmError; @@ -67,6 +70,30 @@ pub mod pallet { #[pallet::generate_store(pub(super) trait Store)] pub struct Pallet(_); + /// Everything we need to run benchmarks. + #[cfg(feature = "runtime-benchmarks")] + pub trait BenchmarkHelper { + /// Returns proper bridge configuration, supported by the runtime. + /// + /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled + /// to support transfer to this destination **after** we our `prepare_transfer` call. + fn bridge_config() -> (NetworkId, BridgeConfig); + /// Prepare environment for assets transfer and return transfer origin and assets + /// to transfer. After this function is called, we expect `transfer_asset_via_bridge` + /// to succeed, so in proper environment, it should: + /// + /// - deposit enough funds (fee from `bridge_config()` and transferred assets) to the sender account; + /// + /// - ensure that the `BridgeXcmSender` is properly configured for the transfer; + /// + /// - be close to the worst possible scenario - i.e. if some account may need to be created during + /// the assets transfer, it should be created. If there are multiple bridges, the "worst possible" + /// (in terms of performance) bridge must be selected for the transfer. + fn prepare_transfer( + assets_count: u32, + ) -> (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation); + } + #[pallet::config] pub trait Config: frame_system::Config { /// The overarching event type. @@ -89,6 +116,10 @@ pub mod pallet { /// Required origin for asset transfer. If successful, it resolves to `MultiLocation`. type TransferOrigin: EnsureOrigin; + + /// Benchmarks helper. + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper: BenchmarkHelper; } /// Details of configured bridges which are allowed for transfer. @@ -390,7 +421,7 @@ pub mod pallet { } #[cfg(test)] -mod tests { +pub(crate) mod tests { use super::*; use crate as bridge_assets_transfer; use frame_support::traits::Currency; @@ -560,6 +591,58 @@ mod tests { (), >; + /// Bridge configuration we use in our tests. + fn test_bridge_config() -> (NetworkId, BridgeConfig) { + ( + Wococo, + BridgeConfig { + bridge_location: (Parent, Parachain(1013)).into(), + allowed_target_location: MultiLocation::new( + 2, + X2(GlobalConsensus(Wococo), Parachain(1000)), + ), + fee: None, + }, + ) + } + + /// Benchmarks helper. + #[cfg(feature = "runtime-benchmarks")] + pub struct TestBenchmarkHelper; + + #[cfg(feature = "runtime-benchmarks")] + impl BenchmarkHelper for TestBenchmarkHelper { + fn bridge_config() -> (NetworkId, BridgeConfig) { + test_bridge_config() + } + + fn prepare_transfer( + assets_count: u32, + ) -> (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation) { + // sender account must have enough funds + let sender_account = account(1); + let total_deposit = ExistentialDeposit::get() * (1 + assets_count as u64); + let _ = Balances::deposit_creating(&sender_account, total_deposit); + + // finally - prepare assets and destination + let assets = VersionedMultiAssets::V3( + std::iter::repeat(MultiAsset { + fun: Fungible(ExistentialDeposit::get().into()), + id: Concrete(RelayLocation::get()), + }) + .take(assets_count as usize) + .collect::>() + .into(), + ); + let destination = VersionedMultiLocation::V3(MultiLocation::new( + 2, + X3(GlobalConsensus(Wococo), Parachain(1000), consensus_account(Wococo, 2)), + )); + + (RuntimeOrigin::signed(sender_account), assets, destination) + } + } + impl Config for TestRuntime { type RuntimeEvent = RuntimeEvent; type BridgeXcmSender = TestBridgeXcmSender; @@ -568,6 +651,8 @@ mod tests { type AssetTransactor = CurrencyTransactor; type AdminOrigin = EnsureRoot; type TransferOrigin = EnsureXcmOrigin; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = TestBenchmarkHelper; } pub(crate) fn new_test_ext() -> sp_io::TestExternalities { @@ -598,14 +683,7 @@ mod tests { fn test_ensure_remote_destination() { new_test_ext().execute_with(|| { // insert bridge config - let bridge_config = BridgeConfig { - bridge_location: (Parent, Parachain(1013)).into(), - allowed_target_location: MultiLocation::new( - 2, - X2(GlobalConsensus(Wococo), Parachain(1000)), - ), - fee: None, - }; + let bridge_config = test_bridge_config().1; assert_ok!(BridgeAssetsTransfer::add_bridge_config( RuntimeOrigin::root(), Wococo, @@ -683,14 +761,7 @@ mod tests { assert_ok!(BridgeAssetsTransfer::add_bridge_config( RuntimeOrigin::root(), bridged_network, - Box::new(BridgeConfig { - bridge_location: (Parent, Parachain(1013)).into(), - allowed_target_location: MultiLocation::new( - 2, - X2(GlobalConsensus(Wococo), Parachain(1000)) - ), - fee: None - }), + Box::new(test_bridge_config().1), )); let bridge_location = Bridges::::get(bridged_network) .expect("stored BridgeConfig for bridged_network") @@ -797,14 +868,7 @@ mod tests { BridgeAssetsTransfer::add_bridge_config(RuntimeOrigin::root(), bridged_network, { let remote_network = Westend; assert_ne!(bridged_network, remote_network); - Box::new(BridgeConfig { - bridge_location: (Parent, Parachain(1013)).into(), - allowed_target_location: MultiLocation::new( - 2, - X2(GlobalConsensus(remote_network), Parachain(1000)), - ), - fee: None, - }) + Box::new(test_bridge_config().1) }), DispatchError::Module(ModuleError { index: 52, diff --git a/parachains/pallets/bridge-assets-transfer/src/weights.rs b/parachains/pallets/bridge-assets-transfer/src/weights.rs index 43ea26858ac..7fa0de7fc41 100644 --- a/parachains/pallets/bridge-assets-transfer/src/weights.rs +++ b/parachains/pallets/bridge-assets-transfer/src/weights.rs @@ -13,27 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_bridge_assets_transfer -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-09-05, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 - -// Executed Command: -// /home/benchbot/cargo_target_dir/production/substrate -// benchmark -// pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* -// --execution=wasm -// --wasm-execution=compiled -// --heap-pages=4096 -// --pallet=pallet_alliance -// --chain=dev -// --output=./frame/alliance/src/weights.rs -// --template=./.maintain/frame-weight-template.hbs +//! Weights trait for the `pallet_bridge_assets_transfer` pallet. #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -42,36 +22,19 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use sp_std::marker::PhantomData; -/// Weight functions needed for pallet_alliance. +/// Weight functions needed for pallet_bridge_assets_transfer. pub trait WeightInfo { - fn transfer_asset_via_bridge(/* number of assets */) -> Weight; + /// Weight of the `transfer_asset_via_bridge` call. + fn transfer_asset_via_bridge() -> Weight; + /// Weight of the `add_bridge_config` call. fn add_bridge_config() -> Weight; + /// Weight of the `remove_bridge_config` call. fn remove_bridge_config() -> Weight; + /// Weight of the `update_bridge_config` call. fn update_bridge_config() -> Weight; } -/// Weights for pallet_alliance using the Substrate node and recommended hardware. -pub struct SubstrateWeight(PhantomData); - -impl WeightInfo for SubstrateWeight { - fn transfer_asset_via_bridge() -> Weight { - Weight::zero() - } - - fn add_bridge_config() -> Weight { - Weight::zero() - } - - fn remove_bridge_config() -> Weight { - Weight::zero() - } - - fn update_bridge_config() -> Weight { - Weight::zero() - } -} - -// For backwards compatibility and tests +// Zero weights to use in tests impl WeightInfo for () { fn transfer_asset_via_bridge() -> Weight { Weight::zero() diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index 5a4a5441fb1..7f6845232d3 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -105,6 +105,7 @@ runtime-benchmarks = [ "pallet-xcm/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", + "cumulus-pallet-parachain-system/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 3f31c9bd7f2..277a223b072 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -626,10 +626,12 @@ impl pallet_bridge_assets_transfer::Config for Runtime { type RuntimeEvent = RuntimeEvent; type BridgeXcmSender = BridgeXcmSender; type UniversalLocation = UniversalLocation; - type WeightInfo = pallet_bridge_assets_transfer::weights::SubstrateWeight; + type WeightInfo = weights::bridge_assets_transfer::WeightInfo; type AssetTransactor = AssetTransactors; type AdminOrigin = AssetsForceOrigin; type TransferOrigin = EnsureXcmOrigin; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = xcm_config::BridgeAssetsTransferBenchmarksHelper; } // Create the runtime by composing the FRAME pallets that were previously configured. @@ -745,6 +747,7 @@ mod benches { // NOTE: Make sure you point to the individual modules below. [pallet_xcm_benchmarks::fungible, XcmBalances] [pallet_xcm_benchmarks::generic, XcmGeneric] + [pallet_bridge_assets_transfer, BridgeAssetsTransfer] ); } diff --git a/parachains/runtimes/assets/statemine/src/weights/bridge_assets_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/bridge_assets_transfer.rs new file mode 100644 index 00000000000..28d4bff75bc --- /dev/null +++ b/parachains/runtimes/assets/statemine/src/weights/bridge_assets_transfer.rs @@ -0,0 +1,110 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_assets_transfer` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-03-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 + +// Executed Command: +// target/debug/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --pallet=pallet_bridge_assets_transfer +// --chain=statemine-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/statemine/src/weights/bridge_assets_transfer.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `pallet_bridge_assets_transfer`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_assets_transfer::WeightInfo for WeightInfo { + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeAssetsTransfer Bridges (r:1 w:0) + /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) + fn transfer_asset_via_bridge() -> Weight { + // Proof Size summary in bytes: + // Measured: `542` + // Estimated: `17786` + // Minimum execution time: 2_415_358 nanoseconds. + Weight::from_parts(2_474_758_000, 17786) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) + /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + fn add_bridge_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `4374` + // Minimum execution time: 345_841 nanoseconds. + Weight::from_parts(361_206_000, 4374) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) + /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + fn remove_bridge_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `131` + // Estimated: `4374` + // Minimum execution time: 367_373 nanoseconds. + Weight::from_parts(379_332_000, 4374) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) + /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + fn update_bridge_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `131` + // Estimated: `4374` + // Minimum execution time: 385_827 nanoseconds. + Weight::from_parts(394_729_000, 4374) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/parachains/runtimes/assets/statemine/src/weights/mod.rs b/parachains/runtimes/assets/statemine/src/weights/mod.rs index 5dd6ffd662e..66f73748f3b 100644 --- a/parachains/runtimes/assets/statemine/src/weights/mod.rs +++ b/parachains/runtimes/assets/statemine/src/weights/mod.rs @@ -1,4 +1,5 @@ pub mod block_weights; +pub mod bridge_assets_transfer; pub mod cumulus_pallet_xcmp_queue; pub mod extrinsic_weights; pub mod frame_system; diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_assets_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_assets_transfer.rs new file mode 100644 index 00000000000..d4e921fcbf1 --- /dev/null +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_assets_transfer.rs @@ -0,0 +1,111 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_assets_transfer` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-03-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_assets_transfer +// --chain=statemine-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/statemine/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `pallet_bridge_assets_transfer`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_assets_transfer::WeightInfo for WeightInfo { + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeAssetsTransfer Bridges (r:1 w:0) + /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) + fn transfer_asset_via_bridge() -> Weight { + // Proof Size summary in bytes: + // Measured: `542` + // Estimated: `17786` + // Minimum execution time: 99_958 nanoseconds. + Weight::from_parts(101_321_000, 17786) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) + /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + fn add_bridge_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `4374` + // Minimum execution time: 13_133 nanoseconds. + Weight::from_parts(13_473_000, 4374) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) + /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + fn remove_bridge_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `131` + // Estimated: `4374` + // Minimum execution time: 12_449 nanoseconds. + Weight::from_parts(12_798_000, 4374) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) + /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + fn update_bridge_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `131` + // Estimated: `4374` + // Minimum execution time: 21_405 nanoseconds. + Weight::from_parts(21_653_000, 4374) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 09d3512fe03..0d46b7a0fc6 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -441,3 +441,69 @@ impl BenchmarkHelper for XcmBenchmarkHelper { /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus pub type BridgeXcmSender = UnpaidRemoteExporter; + +/// Benchmarks helper for over-bridge assets transfer pallet. +#[cfg(feature = "runtime-benchmarks")] +pub struct BridgeAssetsTransferBenchmarksHelper; + +#[cfg(feature = "runtime-benchmarks")] +impl BridgeAssetsTransferBenchmarksHelper { + /// Asset that we're transferring and paying fees in. + fn make_asset(fungible: u128) -> MultiAsset { + MultiAsset { fun: Fungible(fungible.into()), id: Concrete(KsmLocation::get()) } + } + + /// Parachain at the other side of the bridge that we're connected to. + fn allowed_target_location() -> MultiLocation { + MultiLocation::new(2, X2(GlobalConsensus(Polkadot), Parachain(1000))) + } + + /// Identifier of the sibling bridge-hub parachain. + fn bridge_hub_para_id() -> u32 { + 1013 + } +} + +#[cfg(feature = "runtime-benchmarks")] +impl pallet_bridge_assets_transfer::BenchmarkHelper + for BridgeAssetsTransferBenchmarksHelper +{ + fn bridge_config() -> (NetworkId, pallet_bridge_assets_transfer::BridgeConfig) { + ( + Polkadot, + pallet_bridge_assets_transfer::BridgeConfig { + bridge_location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), + allowed_target_location: Self::allowed_target_location(), + // TODO: right now `UnpaidRemoteExporter` is used to send XCM messages and it requires + // fee to be `None`. If we're going to change that (are we?), then we should replace + // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` + fee: None, + }, + ) + } + + fn prepare_transfer( + assets_count: u32, + ) -> (RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation) { + use frame_support::traits::Currency; + + assert_eq!(assets_count, 1, "Benchmarks needs to be fixed to support multiple assets"); + + // our `BridgeXcmSender` assumes that the HRMP channel is opened between this + // parachain and the sibling bridge-hub parachain + cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( + Self::bridge_hub_para_id().into(), + ); + + // deposit enough funds to the sender account + let sender_account = AccountId::from([42u8; 32]); + let existential_deposit = crate::ExistentialDeposit::get(); + let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); + + // finaly - prepare assets and destination + let assets = xcm::VersionedMultiAssets::V3(Self::make_asset(existential_deposit).into()); + let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); + + (RuntimeOrigin::signed(sender_account), assets, destination) + } +} diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index 13bea6268e3..c292a2e0fc3 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -451,7 +451,7 @@ fn test_send_xcm_transact_with_remark_with_event_works() { } #[test] -fn can_govornance_call_xcm_transact_with_bridge_assets_transfer_configuration() { +fn can_governance_call_xcm_transact_with_bridge_assets_transfer_configuration() { ExtBuilder::::default() .with_collators(vec![AccountId::from(ALICE)]) .with_session_keys(vec![( @@ -491,7 +491,7 @@ fn can_govornance_call_xcm_transact_with_bridge_assets_transfer_configuration() UnpaidExecution { weight_limit: Unlimited, check_origin: None }, Transact { origin_kind: OriginKind::Superuser, - require_weight_at_most: Weight::from_ref_time(1000000000), + require_weight_at_most: Weight::from_parts(2000000000, 2000000000), call: add_bridge_config.encode().into(), }, ]); @@ -501,7 +501,7 @@ fn can_govornance_call_xcm_transact_with_bridge_assets_transfer_configuration() // initialize bridge through governance-like let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let weight_limit = Weight::from_ref_time(41666666666); + let weight_limit = Weight::from_parts(5000000000, 5000000000); let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); assert_eq!(outcome.ensure_complete(), Ok(())); diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 7f09f8f5a24..be712c674b1 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -315,7 +315,7 @@ impl xcm_executor::Config for XcmConfig { // Westmint is acting _as_ a reserve location for WND and assets created under `pallet-assets`. // For WND, users must use teleport where allowed (e.g. with the Relay Chain). type IsReserve = - (ConcreteFungibleAssetsFromTrustedBridgedReserves); + ConcreteFungibleAssetsFromTrustedBridgedReserves; type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of WND type UniversalLocation = UniversalLocation; type Barrier = Barrier; diff --git a/scripts/benchmarks-ci.sh b/scripts/benchmarks-ci.sh index d4ad99d7bbe..c823f593c7c 100755 --- a/scripts/benchmarks-ci.sh +++ b/scripts/benchmarks-ci.sh @@ -25,6 +25,11 @@ if [[ $runtimeName == "statemint" ]] || [[ $runtimeName == "statemine" ]] || [[ pallet_xcm_benchmarks::generic pallet_xcm_benchmarks::fungible ) + + # bridge-assets-transfer pallet is only deployed at the Statemine + if [[ $runtimeName == "statemine" ]]; then + pallets+=("pallet_bridge_assets_transfer") + fi elif [[ $runtimeName == "collectives-polkadot" ]]; then pallets=( pallet_alliance From 60a60894f633bd97d519c12d444ad3800e2a11bf Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 16 Mar 2023 12:34:46 +0100 Subject: [PATCH 046/339] Assets/ForeignAssets tests and fixes (#2167) * Test for create and transfer `TrustBackedAssets` with AssetTransactor * Test for transfer `local Currency` with AssetTransactor * Test for create foreign assets (covers foreign relaychain currency) * Added `ForeignFungiblesTransactor` and test for transfer `ForeignAssets` with AssetTransactor * Removed unused `pub const Local: MultiLocation` * Changed `ParaId -> Sibling` for `SiblingParachainConvertsVia` * Test for create foreign assets (covers local sibling parachain assets) * Reverted stuff for ForeignCreators from different global consensus (moved to transfer asset branch) * Refactor `weight_limit` for `execute_xcm` * Added test for `set_metadata` by ForeignCreator with `xcm::Transact(set_metadata)` * Renamed `receive_teleported_asset_works` -> `receive_teleported_asset_for_native_asset_works` * Allow `ForeignCreators` only for sibling parachains * Unify ReservedDmpWeight/ReservedXcmpWeight usage * Removed hack - replaced with `MatchedConvertedConcreteId` * Refactor `ForeignCreators` to assets-common * Add `ReceiveTeleportedAsset` test * Change test - `Utility::batch` -> Multiple `xcm::Transact` * Reusing the same deposits as for TrustBackedAssets * missing `try_successful_origin` ? * Finished `ForeignAssets` for westmint (converter, FungiblesApi, tests) * Refactoring tests - receive_teleported_asset_for_native_asset_works * ForeignAssets for statemine + refactored `receive_teleported_asset_from_foreign_creator_works` * Add `ForeignAssets` to statemine `FungiblesApi` * Add `asset_transactor_transfer_with_local_consensus_currency_works` to all runtimes * Added `asset_transactor_transfer_with_trust_backed_assets_works` test * Added `asset_transactor_transfer_with_foreign_assets_works` * Fix `missing `try_successful_origin` in implementation` * Added `create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works` * Added `ExpectTransactStatus` check * Small rename * Extended `test_assets_balances_api_works` with ForeignAssets for `statemine` * PR fixes * Update parachains/runtimes/assets/test-utils/src/test_cases.rs --------- Co-authored-by: parity-processbot <> Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- Cargo.lock | 9 + parachains/runtimes/assets/common/Cargo.toml | 12 + .../assets/common/src/foreign_creators.rs | 56 + .../assets/common/src/fungible_conversion.rs | 60 +- parachains/runtimes/assets/common/src/lib.rs | 201 +++- .../runtimes/assets/common/src/matching.rs | 78 ++ .../runtimes/assets/statemine/Cargo.toml | 1 + .../runtimes/assets/statemine/src/lib.rs | 48 +- .../assets/statemine/src/xcm_config.rs | 116 +- .../runtimes/assets/statemine/tests/tests.rs | 224 +++- .../runtimes/assets/statemint/Cargo.toml | 1 + .../assets/statemint/src/xcm_config.rs | 3 +- .../runtimes/assets/statemint/tests/tests.rs | 110 +- .../runtimes/assets/test-utils/Cargo.toml | 14 +- .../runtimes/assets/test-utils/src/lib.rs | 61 +- .../assets/test-utils/src/test_cases.rs | 1016 +++++++++++++++++ .../runtimes/assets/westmint/Cargo.toml | 1 + .../runtimes/assets/westmint/src/lib.rs | 50 +- .../assets/westmint/src/xcm_config.rs | 119 +- .../runtimes/assets/westmint/tests/tests.rs | 229 +++- .../collectives-polkadot/src/xcm_config.rs | 1 - 21 files changed, 2088 insertions(+), 322 deletions(-) create mode 100644 parachains/runtimes/assets/common/src/foreign_creators.rs create mode 100644 parachains/runtimes/assets/common/src/matching.rs create mode 100644 parachains/runtimes/assets/test-utils/src/test_cases.rs diff --git a/Cargo.lock b/Cargo.lock index 9ce52f3fe3f..6c3eac10beb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -327,26 +327,35 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" name = "asset-test-utils" version = "1.0.0" dependencies = [ + "assets-common", + "cumulus-pallet-parachain-system", "frame-support", "frame-system", "hex-literal", + "pallet-assets", "pallet-balances", "pallet-collator-selection", "pallet-session", "parachains-common", + "parity-scale-codec", "sp-consensus-aura", "sp-core", "sp-io", "sp-runtime", "sp-std", "substrate-wasm-builder", + "xcm", + "xcm-executor", ] [[package]] name = "assets-common" version = "0.1.0" dependencies = [ + "cumulus-primitives-core", "frame-support", + "log", + "pallet-xcm", "parachains-common", "parity-scale-codec", "sp-api", diff --git a/parachains/runtimes/assets/common/Cargo.toml b/parachains/runtimes/assets/common/Cargo.toml index c551a97757b..7a795057cd5 100644 --- a/parachains/runtimes/assets/common/Cargo.toml +++ b/parachains/runtimes/assets/common/Cargo.toml @@ -7,6 +7,7 @@ description = "Assets common utilities" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +log = { version = "0.4.17", default-features = false } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -14,12 +15,14 @@ sp-api = { git = "https://github.com/paritytech/substrate", default-features = f sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } # Polkadot +pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } # Cumulus parachains-common = { path = "../../../common", default-features = false } +cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } [build-dependencies] substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -28,11 +31,20 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran default = [ "std" ] std = [ "codec/std", + "log/std", "frame-support/std", "parachains-common/std", + "cumulus-primitives-core/std", "sp-api/std", "sp-std/std", + "pallet-xcm/std", "xcm/std", "xcm-builder/std", "xcm-executor/std", ] + +runtime-benchmarks = [ + "frame-support/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", +] diff --git a/parachains/runtimes/assets/common/src/foreign_creators.rs b/parachains/runtimes/assets/common/src/foreign_creators.rs new file mode 100644 index 00000000000..3d7567409f6 --- /dev/null +++ b/parachains/runtimes/assets/common/src/foreign_creators.rs @@ -0,0 +1,56 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use frame_support::traits::{ + ContainsPair, EnsureOrigin, EnsureOriginWithArg, Everything, OriginTrait, +}; +use pallet_xcm::{EnsureXcm, Origin as XcmOrigin}; +use xcm::latest::MultiLocation; +use xcm_executor::traits::Convert; + +// `EnsureOriginWithArg` impl for `CreateOrigin` that allows only XCM origins that are locations +// containing the class location. +pub struct ForeignCreators( + sp_std::marker::PhantomData<(IsForeign, AccountOf, AccountId)>, +); +impl< + IsForeign: ContainsPair, + AccountOf: Convert, + AccountId: Clone, + RuntimeOrigin: From + OriginTrait + Clone, + > EnsureOriginWithArg + for ForeignCreators +where + RuntimeOrigin::PalletsOrigin: + From + TryInto, +{ + type Success = AccountId; + + fn try_origin( + origin: RuntimeOrigin, + asset_location: &MultiLocation, + ) -> sp_std::result::Result { + let origin_location = EnsureXcm::::try_origin(origin.clone())?; + if !IsForeign::contains(&asset_location, &origin_location) { + return Err(origin) + } + AccountOf::convert(origin_location).map_err(|_| origin) + } + + #[cfg(feature = "runtime-benchmarks")] + fn try_successful_origin(a: &MultiLocation) -> Result { + Ok(pallet_xcm::Origin::Xcm(a.clone()).into()) + } +} diff --git a/parachains/runtimes/assets/common/src/fungible_conversion.rs b/parachains/runtimes/assets/common/src/fungible_conversion.rs index 2b8413cfe6e..8ffb44b086b 100644 --- a/parachains/runtimes/assets/common/src/fungible_conversion.rs +++ b/parachains/runtimes/assets/common/src/fungible_conversion.rs @@ -1,27 +1,25 @@ -// This file is part of Substrate. - -// Copyright (C) 2018-2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Runtime API definition for assets. use crate::runtime_api::FungiblesAccessError; +use frame_support::traits::Contains; use sp_std::{borrow::Borrow, vec::Vec}; use xcm::latest::{MultiAsset, MultiLocation}; -use xcm_builder::ConvertedConcreteId; +use xcm_builder::{ConvertedConcreteId, MatchedConvertedConcreteId}; use xcm_executor::traits::{Convert, MatchesFungibles}; /// Converting any [`(AssetId, Balance)`] to [`MultiAsset`] @@ -60,6 +58,29 @@ impl< } } +impl< + AssetId: Clone, + Balance: Clone, + MatchAssetId: Contains, + ConvertAssetId: Convert, + ConvertBalance: Convert, + > MultiAssetConverter + for MatchedConvertedConcreteId +{ + fn convert_ref( + value: impl Borrow<(AssetId, Balance)>, + ) -> Result { + let (asset_id, balance) = value.borrow(); + match ConvertAssetId::reverse_ref(asset_id) { + Ok(asset_id_as_multilocation) => match ConvertBalance::reverse_ref(balance) { + Ok(amount) => Ok((asset_id_as_multilocation, amount).into()), + Err(_) => Err(FungiblesAccessError::AmountToBalanceConversionFailed), + }, + Err(_) => Err(FungiblesAccessError::AssetIdConversionFailed), + } + } +} + /// Helper function to convert collections with [`(AssetId, Balance)`] to [`MultiAsset`] pub fn convert<'a, AssetId, Balance, ConvertAssetId, ConvertBalance, Converter>( items: impl Iterator, @@ -90,11 +111,12 @@ pub fn convert_balance< #[cfg(test)] mod tests { use super::*; + use frame_support::traits::Everything; use xcm::latest::prelude::*; use xcm_executor::traits::{Identity, JustTry}; - type Converter = ConvertedConcreteId; + type Converter = MatchedConvertedConcreteId; #[test] fn converted_concrete_id_fungible_multi_asset_conversion_roundtrip_works() { diff --git a/parachains/runtimes/assets/common/src/lib.rs b/parachains/runtimes/assets/common/src/lib.rs index 28d8ca59106..fbf19b89914 100644 --- a/parachains/runtimes/assets/common/src/lib.rs +++ b/parachains/runtimes/assets/common/src/lib.rs @@ -15,39 +15,78 @@ #![cfg_attr(not(feature = "std"), no_std)] +pub mod foreign_creators; pub mod fungible_conversion; +pub mod matching; pub mod runtime_api; +use crate::matching::{Equals, LocalMultiLocationPattern, ParentLocation, StartsWith}; +use frame_support::traits::EverythingBut; use parachains_common::AssetIdForTrustBackedAssets; -use xcm_builder::{AsPrefixedGeneralIndex, ConvertedConcreteId}; -use xcm_executor::traits::JustTry; +use xcm::prelude::MultiLocation; +use xcm_builder::{AsPrefixedGeneralIndex, MatchedConvertedConcreteId}; +use xcm_executor::traits::{Identity, JustTry}; /// `MultiLocation` vs `AssetIdForTrustBackedAssets` converter for `TrustBackedAssets` pub type AssetIdForTrustBackedAssetsConvert = AsPrefixedGeneralIndex; -/// [`ConvertedConcreteId`] converter dedicated for `TrustBackedAssets` +/// [`MatchedConvertedConcreteId`] converter dedicated for `TrustBackedAssets` pub type TrustBackedAssetsConvertedConcreteId = - ConvertedConcreteId< + MatchedConvertedConcreteId< AssetIdForTrustBackedAssets, Balance, + StartsWith, AssetIdForTrustBackedAssetsConvert, JustTry, >; +/// AssetId used for identifying assets by MultiLocation. +pub type MultiLocationForAssetId = MultiLocation; + +/// [`MatchedConvertedConcreteId`] converter dedicated for storing `AssetId` as `MultiLocation`. +pub type MultiLocationConvertedConcreteId = + MatchedConvertedConcreteId< + MultiLocationForAssetId, + Balance, + MultiLocationFilter, + Identity, + JustTry, + >; + +/// [`MatchedConvertedConcreteId`] converter dedicated for storing `ForeignAssets` with `AssetId` as `MultiLocation`. +/// +/// Excludes by default: +/// - parent as relay chain +/// - all local MultiLocations +/// +/// `AdditionalMultiLocationExclusionFilter` can customize additional excluded MultiLocations +pub type ForeignAssetsConvertedConcreteId = + MultiLocationConvertedConcreteId< + EverythingBut<( + // Excludes relay/parent chain currency + Equals, + // Here we rely on fact that something like this works: + // assert!(MultiLocation::new(1, X1(Parachain(100))).starts_with(&MultiLocation::parent())); + // assert!(X1(Parachain(100)).starts_with(&Here)); + StartsWith, + // Here we can exclude more stuff or leave it as `()` + AdditionalMultiLocationExclusionFilter, + )>, + Balance, + >; + #[cfg(test)] mod tests { - use super::*; use xcm::latest::prelude::*; - use xcm_executor::traits::Convert; - - frame_support::parameter_types! { - pub TrustBackedAssetsPalletLocation: MultiLocation = MultiLocation::new(5, X1(PalletInstance(13))); - } + use xcm_executor::traits::{Convert, Error as MatchError, MatchesFungibles}; #[test] fn asset_id_for_trust_backed_assets_convert_works() { + frame_support::parameter_types! { + pub TrustBackedAssetsPalletLocation: MultiLocation = MultiLocation::new(5, X1(PalletInstance(13))); + } let local_asset_id = 123456789 as AssetIdForTrustBackedAssets; let expected_reverse_ref = MultiLocation::new(5, X2(PalletInstance(13), GeneralIndex(local_asset_id.into()))); @@ -67,4 +106,146 @@ mod tests { local_asset_id ); } + + #[test] + fn trust_backed_assets_match_fungibles_works() { + frame_support::parameter_types! { + pub TrustBackedAssetsPalletLocation: MultiLocation = MultiLocation::new(0, X1(PalletInstance(13))); + } + // setup convert + type TrustBackAssetsConvert = + TrustBackedAssetsConvertedConcreteId; + + let test_data = vec![ + // missing GeneralIndex + (ma_1000(0, X1(PalletInstance(13))), Err(MatchError::AssetIdConversionFailed)), + ( + ma_1000(0, X2(PalletInstance(13), GeneralKey { data: [0; 32], length: 32 })), + Err(MatchError::AssetIdConversionFailed), + ), + ( + ma_1000(0, X2(PalletInstance(13), Parachain(1000))), + Err(MatchError::AssetIdConversionFailed), + ), + // OK + (ma_1000(0, X2(PalletInstance(13), GeneralIndex(1234))), Ok((1234, 1000))), + ( + ma_1000(0, X3(PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222))), + Ok((1234, 1000)), + ), + ( + ma_1000( + 0, + X4( + PalletInstance(13), + GeneralIndex(1234), + GeneralIndex(2222), + GeneralKey { data: [0; 32], length: 32 }, + ), + ), + Ok((1234, 1000)), + ), + // wrong pallet instance + ( + ma_1000(0, X2(PalletInstance(77), GeneralIndex(1234))), + Err(MatchError::AssetNotHandled), + ), + ( + ma_1000(0, X3(PalletInstance(77), GeneralIndex(1234), GeneralIndex(2222))), + Err(MatchError::AssetNotHandled), + ), + // wrong parent + ( + ma_1000(1, X2(PalletInstance(13), GeneralIndex(1234))), + Err(MatchError::AssetNotHandled), + ), + ( + ma_1000(1, X3(PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222))), + Err(MatchError::AssetNotHandled), + ), + ( + ma_1000(1, X2(PalletInstance(77), GeneralIndex(1234))), + Err(MatchError::AssetNotHandled), + ), + ( + ma_1000(1, X3(PalletInstance(77), GeneralIndex(1234), GeneralIndex(2222))), + Err(MatchError::AssetNotHandled), + ), + // wrong parent + ( + ma_1000(2, X2(PalletInstance(13), GeneralIndex(1234))), + Err(MatchError::AssetNotHandled), + ), + ( + ma_1000(2, X3(PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222))), + Err(MatchError::AssetNotHandled), + ), + // missing GeneralIndex + (ma_1000(0, X1(PalletInstance(77))), Err(MatchError::AssetNotHandled)), + (ma_1000(1, X1(PalletInstance(13))), Err(MatchError::AssetNotHandled)), + (ma_1000(2, X1(PalletInstance(13))), Err(MatchError::AssetNotHandled)), + ]; + + for (multi_asset, expected_result) in test_data { + assert_eq!( + >::matches_fungibles(&multi_asset), + expected_result, "multi_asset: {:?}", multi_asset); + } + } + + #[test] + fn multi_location_converted_concrete_id_converter_works() { + frame_support::parameter_types! { + pub Parachain100Pattern: MultiLocation = MultiLocation::new(1, X1(Parachain(100))); + } + + // setup convert + type Convert = ForeignAssetsConvertedConcreteId, u128>; + + let test_data = vec![ + // excluded as local + (ma_1000(0, Here), Err(MatchError::AssetNotHandled)), + (ma_1000(0, X1(Parachain(100))), Err(MatchError::AssetNotHandled)), + ( + ma_1000(0, X2(PalletInstance(13), GeneralIndex(1234))), + Err(MatchError::AssetNotHandled), + ), + // excluded as parent + (ma_1000(1, Here), Err(MatchError::AssetNotHandled)), + // excluded as additional filter + (ma_1000(1, X1(Parachain(100))), Err(MatchError::AssetNotHandled)), + (ma_1000(1, X2(Parachain(100), GeneralIndex(1234))), Err(MatchError::AssetNotHandled)), + ( + ma_1000(1, X3(Parachain(100), PalletInstance(13), GeneralIndex(1234))), + Err(MatchError::AssetNotHandled), + ), + // ok + (ma_1000(1, X1(Parachain(200))), Ok((MultiLocation::new(1, X1(Parachain(200))), 1000))), + (ma_1000(2, X1(Parachain(200))), Ok((MultiLocation::new(2, X1(Parachain(200))), 1000))), + ( + ma_1000(1, X2(Parachain(200), GeneralIndex(1234))), + Ok((MultiLocation::new(1, X2(Parachain(200), GeneralIndex(1234))), 1000)), + ), + ( + ma_1000(2, X2(Parachain(200), GeneralIndex(1234))), + Ok((MultiLocation::new(2, X2(Parachain(200), GeneralIndex(1234))), 1000)), + ), + ]; + + for (multi_asset, expected_result) in test_data { + assert_eq!( + >::matches_fungibles( + &multi_asset + ), + expected_result, + "multi_asset: {:?}", + multi_asset + ); + } + } + + // Create MultiAsset + fn ma_1000(parents: u8, interior: Junctions) -> MultiAsset { + (MultiLocation::new(parents, interior), 1000).into() + } } diff --git a/parachains/runtimes/assets/common/src/matching.rs b/parachains/runtimes/assets/common/src/matching.rs new file mode 100644 index 00000000000..05acaff3990 --- /dev/null +++ b/parachains/runtimes/assets/common/src/matching.rs @@ -0,0 +1,78 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use cumulus_primitives_core::ParaId; +use frame_support::{ + pallet_prelude::Get, + traits::{Contains, ContainsPair}, +}; +use xcm::{ + latest::prelude::{MultiAsset, MultiLocation}, + prelude::*, +}; + +pub struct StartsWith(sp_std::marker::PhantomData); +impl> Contains for StartsWith { + fn contains(t: &MultiLocation) -> bool { + t.starts_with(&Location::get()) + } +} + +pub struct Equals(sp_std::marker::PhantomData); +impl> Contains for Equals { + fn contains(t: &MultiLocation) -> bool { + t == &Location::get() + } +} + +frame_support::parameter_types! { + pub LocalMultiLocationPattern: MultiLocation = MultiLocation::new(0, Here); + pub ParentLocation: MultiLocation = MultiLocation::parent(); +} + +/// Accepts an asset if it is from the origin. +pub struct IsForeignConcreteAsset(sp_std::marker::PhantomData); +impl> ContainsPair + for IsForeignConcreteAsset +{ + fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + log::trace!(target: "xcm::contains", "IsForeignConcreteAsset asset: {:?}, origin: {:?}", asset, origin); + matches!(asset.id, Concrete(ref id) if IsForeign::contains(id, &origin)) + } +} + +/// Checks if 'a' is from sibling location `b`, so means that `MultiLocation-a' starts with `MultiLocation-b' +pub struct FromSiblingParachain(sp_std::marker::PhantomData); +impl> ContainsPair + for FromSiblingParachain +{ + fn contains(&a: &MultiLocation, b: &MultiLocation) -> bool { + // `a` needs to be from `b` at least + if !a.starts_with(&b) { + return false + } + + // here we check if sibling + match a { + MultiLocation { parents: 1, interior } => match interior.first() { + Some(Parachain(sibling_para_id)) + if sibling_para_id.ne(&u32::from(SelfParaId::get())) => + true, + _ => false, + }, + _ => false, + } + } +} diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index 0f0921976a8..bdcd3b550e9 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -108,6 +108,7 @@ runtime-benchmarks = [ "cumulus-pallet-xcmp-queue/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", "pallet-state-trie-migration/runtime-benchmarks", + "assets-common/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index de7ec75e88c..4f957ab7e0d 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -65,19 +65,22 @@ use parachains_common::{ NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_config::{ - ForeignCreators, KsmLocation, MultiLocationForAssetId, TrustBackedAssetsConvertedConcreteId, - XcmConfig, + ForeignAssetsConvertedConcreteId, KsmLocation, TrustBackedAssetsConvertedConcreteId, XcmConfig, }; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; // Polkadot imports +use assets_common::{ + foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, +}; use pallet_xcm::{EnsureXcm, IsMajorityOfBody, IsVoiceOfBody}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use xcm::latest::BodyId; use xcm_executor::XcmExecutor; +use crate::xcm_config::ForeignCreatorsSovereignAccountOf; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; impl_opaque_keys! { @@ -261,29 +264,43 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +parameter_types! { + // we just reuse the same deposits + pub const ForeignAssetsAssetDeposit: Balance = AssetDeposit::get(); + pub const ForeignAssetsAssetAccountDeposit: Balance = AssetAccountDeposit::get(); + pub const ForeignAssetsApprovalDeposit: Balance = ApprovalDeposit::get(); + pub const ForeignAssetsAssetsStringLimit: u32 = AssetsStringLimit::get(); + pub const ForeignAssetsMetadataDepositBase: Balance = MetadataDepositBase::get(); + pub const ForeignAssetsMetadataDepositPerByte: Balance = MetadataDepositPerByte::get(); +} + /// Assets managed by some foreign location. Note: we do not declare a `ForeignAssetsCall` type, as /// this type is used in proxy definitions. We assume that a foreign location would not want to set /// an individual, local account as a proxy for the issuance of their assets. This issuance should /// be managed by the foreign location's governance. -type ForeignAssetsInstance = pallet_assets::Instance2; +pub type ForeignAssetsInstance = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type AssetId = MultiLocationForAssetId; type AssetIdParameter = MultiLocationForAssetId; type Currency = Balances; - type CreateOrigin = ForeignCreators; + type CreateOrigin = ForeignCreators< + (FromSiblingParachain>,), + ForeignCreatorsSovereignAccountOf, + AccountId, + >; type ForceOrigin = AssetsForceOrigin; - type AssetDeposit = AssetDeposit; - type MetadataDepositBase = MetadataDepositBase; - type MetadataDepositPerByte = MetadataDepositPerByte; - type ApprovalDeposit = ApprovalDeposit; - type StringLimit = AssetsStringLimit; + type AssetDeposit = ForeignAssetsAssetDeposit; + type MetadataDepositBase = ForeignAssetsMetadataDepositBase; + type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte; + type ApprovalDeposit = ForeignAssetsApprovalDeposit; + type StringLimit = ForeignAssetsAssetsStringLimit; type Freezer = (); type Extra = (); type WeightInfo = weights::pallet_assets::WeightInfo; type CallbackHandle = (); - type AssetAccountDeposit = AssetAccountDeposit; + type AssetAccountDeposit = ForeignAssetsAssetAccountDeposit; type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; @@ -361,6 +378,7 @@ impl Default for ProxyType { Self::Any } } + impl InstanceFilter for ProxyType { fn filter(&self, c: &RuntimeCall) -> bool { match self { @@ -884,11 +902,17 @@ impl_runtime_apis! { }, // collect pallet_assets (TrustBackedAssets) convert::<_, _, _, _, TrustBackedAssetsConvertedConcreteId>( - Assets::account_balances(account) + Assets::account_balances(account.clone()) + .iter() + .filter(|(_, balance)| balance > &0) + )?, + // collect pallet_assets (ForeignAssets) + convert::<_, _, _, _, ForeignAssetsConvertedConcreteId>( + ForeignAssets::account_balances(account) .iter() .filter(|(_, balance)| balance > &0) )?, - // collect ... e.g. pallet_assets ForeignAssets + // collect ... e.g. other tokens ].concat()) } } diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index f3b5405cc40..3476da44a47 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -14,39 +14,34 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ParachainInfo, - ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ForeignAssets, + ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; +use assets_common::matching::{FromSiblingParachain, IsForeignConcreteAsset, StartsWith}; use frame_support::{ match_types, parameter_types, - traits::{ - ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing, - PalletInfoAccess, - }, + traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, }; -use pallet_xcm::{EnsureXcm, XcmPassthrough}; +use pallet_xcm::XcmPassthrough; use parachains_common::{ impls::ToStakingPot, xcm_config::{ AssetFeeAsExistentialDepositMultiplier, DenyReserveTransferToRelayChain, DenyThenTry, }, }; -use polkadot_parachain::primitives::{Id as ParaId, Sibling}; +use polkadot_parachain::primitives::Sibling; use sp_runtime::traits::ConvertInto; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, WithComputedOrigin, }; -use xcm_executor::{ - traits::{Convert, WithOriginFilter}, - XcmExecutor, -}; +use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { pub const KsmLocation: MultiLocation = MultiLocation::parent(); @@ -54,7 +49,6 @@ parameter_types! { pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub const Local: MultiLocation = Here.into_location(); pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); @@ -86,7 +80,7 @@ pub type CurrencyTransactor = CurrencyAdapter< (), >; -/// `AssetId/Balancer` converter for `TrustBackedAssets` +/// `AssetId/Balance` converter for `TrustBackedAssets` pub type TrustBackedAssetsConvertedConcreteId = assets_common::TrustBackedAssetsConvertedConcreteId; @@ -106,8 +100,31 @@ pub type FungiblesTransactor = FungiblesAdapter< // The account to use for tracking teleports. CheckingAccount, >; + +/// `AssetId/Balance` converter for `TrustBackedAssets` +pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId< + StartsWith, + Balance, +>; + +/// Means for transacting foreign assets from different global consensus. +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + ForeignAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ForeignAssetsConvertedConcreteId, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // TODO:check-parameter - no teleports + NoChecking, + // The account to use for tracking teleports. + CheckingAccount, +>; + /// Means for transacting assets on this chain. -pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor); +pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor, ForeignFungiblesTransactor); /// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, /// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can @@ -216,6 +233,34 @@ impl Contains for SafeCallFilter { pallet_assets::Call::touch { .. } | pallet_assets::Call::refund { .. }, ) | + RuntimeCall::ForeignAssets( + /* avoided: mint, burn */ + pallet_assets::Call::create { .. } | + pallet_assets::Call::force_create { .. } | + pallet_assets::Call::start_destroy { .. } | + pallet_assets::Call::destroy_accounts { .. } | + pallet_assets::Call::destroy_approvals { .. } | + pallet_assets::Call::finish_destroy { .. } | + pallet_assets::Call::transfer { .. } | + pallet_assets::Call::transfer_keep_alive { .. } | + pallet_assets::Call::force_transfer { .. } | + pallet_assets::Call::freeze { .. } | + pallet_assets::Call::thaw { .. } | + pallet_assets::Call::freeze_asset { .. } | + pallet_assets::Call::thaw_asset { .. } | + pallet_assets::Call::transfer_ownership { .. } | + pallet_assets::Call::set_team { .. } | + pallet_assets::Call::set_metadata { .. } | + pallet_assets::Call::clear_metadata { .. } | + pallet_assets::Call::force_clear_metadata { .. } | + pallet_assets::Call::force_asset_status { .. } | + pallet_assets::Call::approve_transfer { .. } | + pallet_assets::Call::cancel_approval { .. } | + pallet_assets::Call::force_cancel_approval { .. } | + pallet_assets::Call::transfer_approved { .. } | + pallet_assets::Call::touch { .. } | + pallet_assets::Call::refund { .. }, + ) | RuntimeCall::Uniques( pallet_uniques::Call::create { .. } | pallet_uniques::Call::force_create { .. } | @@ -287,7 +332,13 @@ impl xcm_executor::Config for XcmConfig { // Statemine acting _as_ a reserve location for KSM and assets created under `pallet-assets`. // For KSM, users must use teleport where allowed (e.g. with the Relay Chain). type IsReserve = (); - type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of KSM + // We allow: + // - teleportation of KSM + // - teleportation of sibling parachain's assets (as ForeignCreators) + type IsTeleporter = ( + NativeAsset, + IsForeignConcreteAsset>>, + ); type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< @@ -380,37 +431,12 @@ impl cumulus_pallet_xcm::Config for Runtime { type XcmExecutor = XcmExecutor; } -pub type MultiLocationForAssetId = MultiLocation; - -pub type SovereignAccountOf = ( - SiblingParachainConvertsVia, +pub type ForeignCreatorsSovereignAccountOf = ( + SiblingParachainConvertsVia, AccountId32Aliases, ParentIsPreset, ); -// `EnsureOriginWithArg` impl for `CreateOrigin` that allows only XCM origins that are locations -// containing the class location. -pub struct ForeignCreators; -impl EnsureOriginWithArg for ForeignCreators { - type Success = AccountId; - - fn try_origin( - o: RuntimeOrigin, - a: &MultiLocation, - ) -> sp_std::result::Result { - let origin_location = EnsureXcm::::try_origin(o.clone())?; - if !a.starts_with(&origin_location) { - return Err(o) - } - SovereignAccountOf::convert(origin_location).map_err(|_| o) - } - - #[cfg(feature = "runtime-benchmarks")] - fn try_successful_origin(a: &MultiLocation) -> Result { - Ok(pallet_xcm::Origin::Xcm(a.clone()).into()) - } -} - /// Simple conversion of `u32` into an `AssetId` for use in benchmarking. pub struct XcmBenchmarkHelper; #[cfg(feature = "runtime-benchmarks")] diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index b696e4ef1e3..7d19a88618c 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -1,25 +1,27 @@ use asset_test_utils::{ExtBuilder, RuntimeHelper}; -use codec::Encode; +use codec::{Decode, Encode}; use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ - assert_noop, assert_ok, sp_io, + assert_noop, assert_ok, + traits::fungibles::InspectEnumerable, weights::{Weight, WeightToFee as WeightToFeeT}, }; -use parachains_common::{AccountId, AuraId, Balance}; +use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; use statemine_runtime::xcm_config::{ AssetFeeAsExistentialDepositMultiplierFeeCharger, KsmLocation, TrustBackedAssetsPalletLocation, }; pub use statemine_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, Assets, Balances, ExistentialDeposit, - ReservedDmpWeight, Runtime, SessionKeys, System, + constants::fee::WeightToFee, + xcm_config::{ForeignCreatorsSovereignAccountOf, XcmConfig}, + AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, + MetadataDepositBase, Runtime, RuntimeCall, RuntimeEvent, SessionKeys, System, + TrustBackedAssetsInstance, }; use xcm::latest::prelude::*; -use xcm_executor::{ - traits::{Convert, WeightTrader}, - XcmExecutor, -}; +use xcm_executor::traits::{Convert, Identity, JustTry, WeightTrader}; -pub const ALICE: [u8; 32] = [1u8; 32]; +const ALICE: [u8; 32] = [1u8; 32]; +const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; type AssetIdForTrustBackedAssetsConvert = assets_common::AssetIdForTrustBackedAssetsConvert; @@ -371,9 +373,15 @@ fn test_assets_balances_api_works() { .build() .execute_with(|| { let local_asset_id = 1; + let foreign_asset_id_multilocation = + MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; // check before assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0); + assert_eq!( + ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), + 0 + ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0); assert!(Runtime::query_account_balances(AccountId::from(ALICE)).unwrap().is_empty()); @@ -400,15 +408,37 @@ fn test_assets_balances_api_works() { minimum_asset_balance )); + // create foreign asset + let foreign_asset_minimum_asset_balance = 3333333_u128; + assert_ok!(ForeignAssets::force_create( + RuntimeHelper::::root_origin(), + foreign_asset_id_multilocation.clone().into(), + AccountId::from(SOME_ASSET_ADMIN).into(), + false, + foreign_asset_minimum_asset_balance + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(ForeignAssets::mint( + RuntimeHelper::::origin_of(AccountId::from(SOME_ASSET_ADMIN)), + foreign_asset_id_multilocation.clone().into(), + AccountId::from(ALICE).into(), + 6 * foreign_asset_minimum_asset_balance + )); + // check after assert_eq!( Assets::balance(local_asset_id, AccountId::from(ALICE)), minimum_asset_balance ); + assert_eq!( + ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), + 6 * minimum_asset_balance + ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency); let result = Runtime::query_account_balances(AccountId::from(ALICE)).unwrap(); - assert_eq!(result.len(), 2); + assert_eq!(result.len(), 3); // check currency assert!(result.iter().any(|asset| asset.eq( @@ -423,53 +453,131 @@ fn test_assets_balances_api_works() { minimum_asset_balance ) .into()))); + // check foreign asset + assert!(result.iter().any(|asset| asset.eq(&( + Identity::reverse_ref(foreign_asset_id_multilocation).unwrap(), + 6 * foreign_asset_minimum_asset_balance + ) + .into()))); }); } -#[test] -fn receive_teleported_asset_works() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - let xcm = Xcm(vec![ - ReceiveTeleportedAsset(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(10000000000000), - }])), - ClearOrigin, - BuyExecution { - fees: MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(10000000000000), - }, - weight_limit: Limited(Weight::from_parts(303531000, 65536)), - }, - DepositAsset { - assets: Wild(AllCounted(1)), - beneficiary: MultiLocation { - parents: 0, - interior: X1(AccountId32 { - network: None, - id: [ - 18, 153, 85, 112, 1, 245, 88, 21, 211, 252, 181, 60, 116, 70, 58, - 203, 12, 246, 209, 77, 70, 57, 179, 64, 152, 44, 96, 135, 127, 56, - 70, 9, - ], - }), - }, - }, - ]); - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - - let weight_limit = ReservedDmpWeight::get(); - - let outcome = XcmExecutor::::execute_xcm(Parent, xcm, hash, weight_limit); - assert_eq!(outcome.ensure_complete(), Ok(())); - }) -} +asset_test_utils::include_receive_teleported_asset_for_native_asset_works!( + Runtime, + XcmConfig, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ) +); + +asset_test_utils::include_receive_teleported_asset_from_foreign_creator_works!( + Runtime, + XcmConfig, + WeightToFee, + ForeignCreatorsSovereignAccountOf, + ForeignAssetsInstance, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get() +); + +asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( + Runtime, + XcmConfig, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }) +); + +asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( + asset_transactor_transfer_with_trust_backed_assets_works, + Runtime, + XcmConfig, + TrustBackedAssetsInstance, + AssetIdForTrustBackedAssets, + AssetIdForTrustBackedAssetsConvert, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + 12345, + Box::new(|| { + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }) +); + +asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( + asset_transactor_transfer_with_foreign_assets_works, + Runtime, + XcmConfig, + ForeignAssetsInstance, + MultiLocation, + JustTry, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) }, + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + }) +); + +asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works!( + Runtime, + XcmConfig, + WeightToFee, + ForeignCreatorsSovereignAccountOf, + ForeignAssetsInstance, + MultiLocation, + JustTry, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + AssetDeposit::get(), + MetadataDepositBase::get(), + Box::new(|pallet_asset_call| RuntimeCall::ForeignAssets(pallet_asset_call).encode()), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::ForeignAssets(pallet_asset_event)) => Some(pallet_asset_event), + _ => None, + } + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + assert_eq!(ForeignAssets::asset_ids().collect::>().len(), 1); + }) +); diff --git a/parachains/runtimes/assets/statemint/Cargo.toml b/parachains/runtimes/assets/statemint/Cargo.toml index f6d54cbd85f..02407e23d5c 100644 --- a/parachains/runtimes/assets/statemint/Cargo.toml +++ b/parachains/runtimes/assets/statemint/Cargo.toml @@ -100,6 +100,7 @@ runtime-benchmarks = [ "pallet-collator-selection/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", + "assets-common/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index 0bb2c5ff5a7..11ef984483d 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -48,7 +48,6 @@ parameter_types! { pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub const Local: MultiLocation = MultiLocation::here(); pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); @@ -80,7 +79,7 @@ pub type CurrencyTransactor = CurrencyAdapter< (), >; -/// `AssetId/Balancer` converter for `TrustBackedAssets`` +/// `AssetId/Balance` converter for `TrustBackedAssets`` pub type TrustBackedAssetsConvertedConcreteId = assets_common::TrustBackedAssetsConvertedConcreteId; diff --git a/parachains/runtimes/assets/statemint/tests/tests.rs b/parachains/runtimes/assets/statemint/tests/tests.rs index 81aa458b476..2e070dc1aec 100644 --- a/parachains/runtimes/assets/statemint/tests/tests.rs +++ b/parachains/runtimes/assets/statemint/tests/tests.rs @@ -1,25 +1,24 @@ use asset_test_utils::{ExtBuilder, RuntimeHelper}; -use codec::Encode; use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ - assert_noop, assert_ok, sp_io, + assert_noop, assert_ok, + traits::fungibles::InspectEnumerable, weights::{Weight, WeightToFee as WeightToFeeT}, }; -use parachains_common::{AccountId, Balance, StatemintAuraId as AuraId}; +use parachains_common::{ + AccountId, AssetIdForTrustBackedAssets, Balance, StatemintAuraId as AuraId, +}; use statemint_runtime::xcm_config::{ AssetFeeAsExistentialDepositMultiplierFeeCharger, DotLocation, TrustBackedAssetsPalletLocation, }; pub use statemint_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, Assets, Balances, ExistentialDeposit, - ReservedDmpWeight, Runtime, SessionKeys, System, + constants::fee::WeightToFee, xcm_config::XcmConfig, AssetDeposit, Assets, Balances, + ExistentialDeposit, Runtime, SessionKeys, System, TrustBackedAssetsInstance, }; use xcm::latest::prelude::*; -use xcm_executor::{ - traits::{Convert, WeightTrader}, - XcmExecutor, -}; +use xcm_executor::traits::{Convert, WeightTrader}; -pub const ALICE: [u8; 32] = [1u8; 32]; +const ALICE: [u8; 32] = [1u8; 32]; type AssetIdForTrustBackedAssetsConvert = assets_common::AssetIdForTrustBackedAssetsConvert; @@ -438,50 +437,47 @@ fn test_assets_balances_api_works() { }); } -#[test] -fn receive_teleported_asset_works() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - let xcm = Xcm(vec![ - ReceiveTeleportedAsset(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(10000000000000), - }])), - ClearOrigin, - BuyExecution { - fees: MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(10000000000000), - }, - weight_limit: Limited(Weight::from_parts(303531000, 65536)), - }, - DepositAsset { - assets: Wild(AllCounted(1)), - beneficiary: MultiLocation { - parents: 0, - interior: X1(AccountId32 { - network: None, - id: [ - 18, 153, 85, 112, 1, 245, 88, 21, 211, 252, 181, 60, 116, 70, 58, - 203, 12, 246, 209, 77, 70, 57, 179, 64, 152, 44, 96, 135, 127, 56, - 70, 9, - ], - }), - }, - }, - ]); - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - - let weight_limit = ReservedDmpWeight::get(); - - let outcome = XcmExecutor::::execute_xcm(Parent, xcm, hash, weight_limit); - assert_eq!(outcome.ensure_complete(), Ok(())); - }) -} +asset_test_utils::include_receive_teleported_asset_for_native_asset_works!( + Runtime, + XcmConfig, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } + ) +); + +asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( + Runtime, + XcmConfig, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + }) +); + +asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( + asset_transactor_transfer_with_pallet_assets_instance_works, + Runtime, + XcmConfig, + TrustBackedAssetsInstance, + AssetIdForTrustBackedAssets, + AssetIdForTrustBackedAssetsConvert, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + 12345, + Box::new(|| {}), + Box::new(|| {}) +); diff --git a/parachains/runtimes/assets/test-utils/Cargo.toml b/parachains/runtimes/assets/test-utils/Cargo.toml index 52ce1d2d9a8..c80bb7f67af 100644 --- a/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/parachains/runtimes/assets/test-utils/Cargo.toml @@ -6,11 +6,12 @@ edition = "2021" description = "Statemint parachain runtime" [dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } # Substrate - frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -20,8 +21,14 @@ sp-std = { git = "https://github.com/paritytech/substrate", default-features = f sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } # Cumulus +cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachains-common = { path = "../../../common", default-features = false } +assets-common = { path = "../common", default-features = false } + +# Polkadot +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } [dev-dependencies] hex-literal = "0.3.4" @@ -34,12 +41,17 @@ default = [ "std" ] std = [ "frame-support/std", "frame-system/std", + "pallet-assets/std", "pallet-balances/std", + "cumulus-pallet-parachain-system/std", "pallet-collator-selection/std", "pallet-session/std", + "assets-common/std", "parachains-common/std", "sp-consensus-aura/std", "sp-io/std", "sp-runtime/std", "sp-std/std", + "xcm/std", + "xcm-executor/std", ] diff --git a/parachains/runtimes/assets/test-utils/src/lib.rs b/parachains/runtimes/assets/test-utils/src/lib.rs index fb4750bae9e..94435365bd0 100644 --- a/parachains/runtimes/assets/test-utils/src/lib.rs +++ b/parachains/runtimes/assets/test-utils/src/lib.rs @@ -1,11 +1,19 @@ use frame_support::traits::GenesisBuild; use sp_std::marker::PhantomData; -use frame_support::traits::OriginTrait; +use frame_support::{traits::OriginTrait, weights::Weight}; use parachains_common::AccountId; use sp_consensus_aura::AURA_ENGINE_ID; use sp_core::Encode; use sp_runtime::{Digest, DigestItem}; +use xcm::{ + latest::{MultiAsset, MultiLocation, XcmContext}, + prelude::{Concrete, Fungible, XcmError}, +}; +use xcm_executor::{traits::TransactAsset, Assets}; + +pub mod test_cases; +pub use test_cases::CollatorSessionKeys; pub type BalanceOf = ::Balance; pub type AccountIdOf = ::AccountId; @@ -56,6 +64,11 @@ impl Self { + frame_support::sp_tracing::try_init_simple(); + self + } + pub fn build(self) -> sp_io::TestExternalities where Runtime: @@ -132,3 +145,49 @@ where ::RuntimeOrigin::signed(account_id.into()) } } + +impl RuntimeHelper { + pub fn do_transfer( + from: MultiLocation, + to: MultiLocation, + (asset, amount): (MultiLocation, u128), + ) -> Result { + ::transfer_asset( + &MultiAsset { id: Concrete(asset), fun: Fungible(amount) }, + &from, + &to, + // We aren't able to track the XCM that initiated the fee deposit, so we create a + // fake message hash here + &XcmContext::with_message_hash([0; 32]), + ) + } +} + +pub enum XcmReceivedFrom { + Parent, + Sibling, +} + +impl RuntimeHelper { + pub fn xcm_max_weight(from: XcmReceivedFrom) -> Weight { + use frame_support::traits::Get; + match from { + XcmReceivedFrom::Parent => ParachainSystem::ReservedDmpWeight::get(), + XcmReceivedFrom::Sibling => ParachainSystem::ReservedXcmpWeight::get(), + } + } +} + +pub fn assert_metadata( + asset_id: &Assets::AssetId, + expected_name: &str, + expected_symbol: &str, + expected_decimals: u8, +) where + Assets: frame_support::traits::tokens::fungibles::InspectMetadata + + frame_support::traits::tokens::fungibles::Inspect, +{ + assert_eq!(Assets::name(asset_id), Vec::from(expected_name),); + assert_eq!(Assets::symbol(asset_id), Vec::from(expected_symbol),); + assert_eq!(Assets::decimals(asset_id), expected_decimals); +} diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs new file mode 100644 index 00000000000..c6f2f5f8e91 --- /dev/null +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -0,0 +1,1016 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Module contains predefined test-case scenarios for `Runtime` with various assets. + +use crate::{ + assert_metadata, AccountIdOf, BalanceOf, ExtBuilder, RuntimeHelper, SessionKeysOf, + ValidatorIdOf, XcmReceivedFrom, +}; +use codec::Encode; +use frame_support::{ + assert_noop, assert_ok, + traits::{fungibles::InspectEnumerable, OriginTrait}, + weights::Weight, +}; +use parachains_common::Balance; +use sp_runtime::{ + traits::{StaticLookup, Zero}, + DispatchError, +}; +use xcm::latest::prelude::*; +use xcm_executor::{traits::Convert, XcmExecutor}; + +pub struct CollatorSessionKeys< + Runtime: frame_system::Config + pallet_balances::Config + pallet_session::Config, +> { + collator: AccountIdOf, + validator: ValidatorIdOf, + key: SessionKeysOf, +} + +impl + CollatorSessionKeys +{ + pub fn new( + collator: AccountIdOf, + validator: ValidatorIdOf, + key: SessionKeysOf, + ) -> Self { + Self { collator, validator, key } + } + pub fn collators(&self) -> Vec> { + vec![self.collator.clone()] + } + + pub fn session_keys( + &self, + ) -> Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)> { + vec![(self.collator.clone(), self.validator.clone(), self.key.clone())] + } +} + +/// Test-case makes sure that `Runtime` can receive teleported native assets from relay chain +pub fn receive_teleported_asset_for_native_asset_works( + collator_session_keys: CollatorSessionKeys, + target_account: AccountIdOf, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + XcmConfig: xcm_executor::Config, +{ + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .build() + .execute_with(|| { + // check Balances before + assert_eq!(>::free_balance(&target_account), 0.into()); + + let native_asset_id = MultiLocation::parent(); + + let xcm = Xcm(vec![ + ReceiveTeleportedAsset(MultiAssets::from(vec![MultiAsset { + id: Concrete(native_asset_id), + fun: Fungible(10000000000000), + }])), + ClearOrigin, + BuyExecution { + fees: MultiAsset { + id: Concrete(native_asset_id), + fun: Fungible(10000000000000), + }, + weight_limit: Limited(Weight::from_parts(303531000, 65536)), + }, + DepositAsset { + assets: Wild(AllCounted(1)), + beneficiary: MultiLocation { + parents: 0, + interior: X1(AccountId32 { + network: None, + id: target_account.clone().into(), + }), + }, + }, + ExpectTransactStatus(MaybeErrorCode::Success), + ]); + + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + + let outcome = XcmExecutor::::execute_xcm( + Parent, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Parent), + ); + assert_eq!(outcome.ensure_complete(), Ok(())); + + // check Balances after + assert_ne!(>::free_balance(&target_account), 0.into()); + }) +} + +#[macro_export] +macro_rules! include_receive_teleported_asset_for_native_asset_works( + ( + $runtime:path, + $xcm_config:path, + $collator_session_key:expr + ) => { + #[test] + fn receive_teleported_asset_for_native_asset_works() { + const BOB: [u8; 32] = [2u8; 32]; + let target_account = parachains_common::AccountId::from(BOB); + + asset_test_utils::test_cases::receive_teleported_asset_for_native_asset_works::< + $runtime, + $xcm_config + >($collator_session_key, target_account) + } + } +); + +/// Test-case makes sure that `Runtime` can receive teleported assets from sibling parachain relay chain +pub fn receive_teleported_asset_from_foreign_creator_works< + Runtime, + XcmConfig, + WeightToFee, + SovereignAccountOf, + ForeignAssetsPalletInstance, +>( + collator_session_keys: CollatorSessionKeys, + target_account: AccountIdOf, + existential_deposit: BalanceOf, + asset_owner: AccountIdOf, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + pallet_assets::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + XcmConfig: xcm_executor::Config, + WeightToFee: frame_support::weights::WeightToFee, + ::Balance: From + Into, + SovereignAccountOf: Convert>, + >::AssetId: + From + Into, + >::AssetIdParameter: + From + Into, + >::Balance: + From + Into, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + <::Lookup as StaticLookup>::Source: + From<::AccountId>, + ForeignAssetsPalletInstance: 'static, +{ + // foreign parachain with the same consenus currency as asset + let foreign_asset_id_multilocation = + MultiLocation { parents: 1, interior: X2(Parachain(2222), GeneralIndex(1234567)) }; + + // foreign creator, which can be sibling parachain to match ForeignCreators + let foreign_creator = MultiLocation { parents: 1, interior: X1(Parachain(2222)) }; + let foreign_creator_as_account_id = SovereignAccountOf::convert(foreign_creator).expect(""); + + // we want to buy execution with local relay chain currency + let buy_execution_fee_amount = + WeightToFee::weight_to_fee(&Weight::from_parts(90_000_000_000, 0)); + let buy_execution_fee = MultiAsset { + id: Concrete(MultiLocation::parent()), + fun: Fungible(buy_execution_fee_amount.into()), + }; + + let teleported_foreign_asset_amount = 10000000000000; + + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_balances(vec![ + ( + foreign_creator_as_account_id.clone(), + existential_deposit + (buy_execution_fee_amount * 2).into(), + ), + (target_account.clone(), existential_deposit), + ]) + .with_tracing() + .build() + .execute_with(|| { + // checks before + assert_eq!( + >::free_balance(&target_account), + existential_deposit + ); + assert_eq!( + >::balance( + foreign_asset_id_multilocation.into(), + &target_account + ), + 0.into() + ); + + // create foreign asset + let asset_minimum_asset_balance = 3333333_u128; + assert_ok!( + >::force_create( + RuntimeHelper::::root_origin(), + foreign_asset_id_multilocation.clone().into(), + asset_owner.into(), + false, + asset_minimum_asset_balance.into() + ) + ); + assert!(teleported_foreign_asset_amount > asset_minimum_asset_balance); + + // prepare xcm + let xcm = Xcm(vec![ + // BuyExecution with relaychain native token + WithdrawAsset(buy_execution_fee.clone().into()), + BuyExecution { + fees: MultiAsset { + id: Concrete(MultiLocation::parent()), + fun: Fungible(buy_execution_fee_amount.into()), + }, + weight_limit: Limited(Weight::from_parts(403531000, 1024)), + }, + // Process teleported asset + ReceiveTeleportedAsset(MultiAssets::from(vec![MultiAsset { + id: Concrete(foreign_asset_id_multilocation), + fun: Fungible(teleported_foreign_asset_amount), + }])), + DepositAsset { + assets: Wild(AllOf { + id: Concrete(foreign_asset_id_multilocation), + fun: WildFungibility::Fungible, + }), + beneficiary: MultiLocation { + parents: 0, + interior: X1(AccountId32 { + network: None, + id: target_account.clone().into(), + }), + }, + }, + ExpectTransactStatus(MaybeErrorCode::Success), + ]); + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + + let outcome = XcmExecutor::::execute_xcm( + foreign_creator, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + ); + assert_eq!(outcome.ensure_complete(), Ok(())); + + // checks after + assert_eq!( + >::free_balance(&target_account), + existential_deposit + ); + assert_eq!( + >::balance( + foreign_asset_id_multilocation.into(), + &target_account + ), + teleported_foreign_asset_amount.into() + ); + }) +} + +#[macro_export] +macro_rules! include_receive_teleported_asset_from_foreign_creator_works( + ( + $runtime:path, + $xcm_config:path, + $weight_to_fee:path, + $sovereign_account_of:path, + $assets_pallet_instance:path, + $collator_session_key:expr, + $existential_deposit:expr + ) => { + #[test] + fn receive_teleported_asset_from_foreign_creator_works() { + const BOB: [u8; 32] = [2u8; 32]; + let target_account = parachains_common::AccountId::from(BOB); + const SOME_ASSET_OWNER: [u8; 32] = [5u8; 32]; + let asset_owner = parachains_common::AccountId::from(SOME_ASSET_OWNER); + + asset_test_utils::test_cases::receive_teleported_asset_from_foreign_creator_works::< + $runtime, + $xcm_config, + $weight_to_fee, + $sovereign_account_of, + $assets_pallet_instance + >($collator_session_key, target_account, $existential_deposit, asset_owner) + } + } +); + +/// Test-case makes sure that `Runtime`'s `xcm::AssetTransactor` can handle native relay chain currency +pub fn asset_transactor_transfer_with_local_consensus_currency_works( + collator_session_keys: CollatorSessionKeys, + source_account: AccountIdOf, + target_account: AccountIdOf, + existential_deposit: BalanceOf, + additional_checks_before: Box, + additional_checks_after: Box, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + XcmConfig: xcm_executor::Config, + ::Balance: From + Into, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + <::Lookup as StaticLookup>::Source: + From<::AccountId>, +{ + let unit = existential_deposit; + + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_balances(vec![(source_account.clone(), (BalanceOf::::from(10_u128) * unit))]) + .with_tracing() + .build() + .execute_with(|| { + // check Balances before + assert_eq!( + >::free_balance(source_account.clone()), + (BalanceOf::::from(10_u128) * unit) + ); + assert_eq!( + >::free_balance(target_account.clone()), + (BalanceOf::::zero() * unit) + ); + + // additional check before + additional_checks_before(); + + // transfer_asset (deposit/withdraw) ALICE -> BOB + let _ = RuntimeHelper::::do_transfer( + MultiLocation { + parents: 0, + interior: X1(AccountId32 { network: None, id: source_account.clone().into() }), + }, + MultiLocation { + parents: 0, + interior: X1(AccountId32 { network: None, id: target_account.clone().into() }), + }, + // local_consensus_currency_asset, e.g.: relaychain token (KSM, DOT, ...) + ( + MultiLocation { parents: 1, interior: Here }, + (BalanceOf::::from(1_u128) * unit).into(), + ), + ) + .expect("no error"); + + // check Balances after + assert_eq!( + >::free_balance(source_account), + (BalanceOf::::from(9_u128) * unit) + ); + assert_eq!( + >::free_balance(target_account), + (BalanceOf::::from(1_u128) * unit) + ); + + additional_checks_after(); + }) +} + +#[macro_export] +macro_rules! include_asset_transactor_transfer_with_local_consensus_currency_works( + ( + $runtime:path, + $xcm_config:path, + $collator_session_key:expr, + $existential_deposit:expr, + $additional_checks_before:expr, + $additional_checks_after:expr + ) => { + #[test] + fn asset_transactor_transfer_with_local_consensus_currency_works() { + const ALICE: [u8; 32] = [1u8; 32]; + let source_account = parachains_common::AccountId::from(ALICE); + const BOB: [u8; 32] = [2u8; 32]; + let target_account = parachains_common::AccountId::from(BOB); + + asset_test_utils::test_cases::asset_transactor_transfer_with_local_consensus_currency_works::< + $runtime, + $xcm_config + >( + $collator_session_key, + source_account, + target_account, + $existential_deposit, + $additional_checks_before, + $additional_checks_after + ) + } + } +); + +///Test-case makes sure that `Runtime`'s `xcm::AssetTransactor` can handle native relay chain currency +pub fn asset_transactor_transfer_with_pallet_assets_instance_works< + Runtime, + XcmConfig, + AssetsPalletInstance, + AssetId, + AssetIdConverter, +>( + collator_session_keys: CollatorSessionKeys, + existential_deposit: BalanceOf, + asset_id: AssetId, + asset_owner: AccountIdOf, + alice_account: AccountIdOf, + bob_account: AccountIdOf, + charlie_account: AccountIdOf, + additional_checks_before: Box, + additional_checks_after: Box, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + pallet_assets::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + XcmConfig: xcm_executor::Config, + >::AssetId: + From + Into, + >::AssetIdParameter: + From + Into, + >::Balance: From + Into, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + <::Lookup as StaticLookup>::Source: + From<::AccountId>, + AssetsPalletInstance: 'static, + AssetId: Clone, + AssetIdConverter: Convert, +{ + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_balances(vec![ + (asset_owner.clone(), existential_deposit), + (alice_account.clone(), existential_deposit), + (bob_account.clone(), existential_deposit), + ]) + .with_tracing() + .build() + .execute_with(|| { + // create some asset class + let asset_minimum_asset_balance = 3333333_u128; + let asset_id_as_multilocation = AssetIdConverter::reverse_ref(&asset_id).unwrap(); + assert_ok!(>::force_create( + RuntimeHelper::::root_origin(), + asset_id.clone().into(), + asset_owner.clone().into(), + false, + asset_minimum_asset_balance.into() + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(>::mint( + RuntimeHelper::::origin_of(asset_owner.clone()), + asset_id.clone().into(), + alice_account.clone().into(), + (6 * asset_minimum_asset_balance).into() + )); + + // check Assets before + assert_eq!( + >::balance( + asset_id.clone().into(), + &alice_account + ), + (6 * asset_minimum_asset_balance).into() + ); + assert_eq!( + >::balance( + asset_id.clone().into(), + &bob_account + ), + 0.into() + ); + assert_eq!( + >::balance( + asset_id.clone().into(), + &charlie_account + ), + 0.into() + ); + assert_eq!( + >::balance( + asset_id.clone().into(), + &asset_owner + ), + 0.into() + ); + assert_eq!( + >::free_balance(&alice_account), + existential_deposit + ); + assert_eq!( + >::free_balance(&bob_account), + existential_deposit + ); + assert_eq!( + >::free_balance(&charlie_account), + 0.into() + ); + assert_eq!( + >::free_balance(&asset_owner), + existential_deposit + ); + additional_checks_before(); + + // transfer_asset (deposit/withdraw) ALICE -> CHARLIE (not ok - Charlie does not have ExistentialDeposit) + assert_noop!( + RuntimeHelper::::do_transfer( + MultiLocation { + parents: 0, + interior: X1(AccountId32 { + network: None, + id: alice_account.clone().into() + }), + }, + MultiLocation { + parents: 0, + interior: X1(AccountId32 { + network: None, + id: charlie_account.clone().into() + }), + }, + (asset_id_as_multilocation, 1 * asset_minimum_asset_balance), + ), + XcmError::FailedToTransactAsset(Into::<&str>::into( + sp_runtime::TokenError::CannotCreate + )) + ); + + // transfer_asset (deposit/withdraw) ALICE -> BOB (ok - has ExistentialDeposit) + assert!(matches!( + RuntimeHelper::::do_transfer( + MultiLocation { + parents: 0, + interior: X1(AccountId32 { + network: None, + id: alice_account.clone().into() + }), + }, + MultiLocation { + parents: 0, + interior: X1(AccountId32 { network: None, id: bob_account.clone().into() }), + }, + (asset_id_as_multilocation, 1 * asset_minimum_asset_balance), + ), + Ok(_) + )); + + // check Assets after + assert_eq!( + >::balance( + asset_id.clone().into(), + &alice_account + ), + (5 * asset_minimum_asset_balance).into() + ); + assert_eq!( + >::balance( + asset_id.clone().into(), + &bob_account + ), + (1 * asset_minimum_asset_balance).into() + ); + assert_eq!( + >::balance( + asset_id.clone().into(), + &charlie_account + ), + 0.into() + ); + assert_eq!( + >::balance( + asset_id.into(), + &asset_owner + ), + 0.into() + ); + assert_eq!( + >::free_balance(&alice_account), + existential_deposit + ); + assert_eq!( + >::free_balance(&bob_account), + existential_deposit + ); + assert_eq!( + >::free_balance(&charlie_account), + 0.into() + ); + assert_eq!( + >::free_balance(&asset_owner), + existential_deposit + ); + + additional_checks_after(); + }) +} + +#[macro_export] +macro_rules! include_asset_transactor_transfer_with_pallet_assets_instance_works( + ( + $test_name:tt, + $runtime:path, + $xcm_config:path, + $assets_pallet_instance:path, + $asset_id:path, + $asset_id_converter:path, + $collator_session_key:expr, + $existential_deposit:expr, + $tested_asset_id:expr, + $additional_checks_before:expr, + $additional_checks_after:expr + ) => { + #[test] + fn $test_name() { + const SOME_ASSET_OWNER: [u8; 32] = [5u8; 32]; + let asset_owner = parachains_common::AccountId::from(SOME_ASSET_OWNER); + const ALICE: [u8; 32] = [1u8; 32]; + let alice_account = parachains_common::AccountId::from(ALICE); + const BOB: [u8; 32] = [2u8; 32]; + let bob_account = parachains_common::AccountId::from(BOB); + const CHARLIE: [u8; 32] = [3u8; 32]; + let charlie_account = parachains_common::AccountId::from(CHARLIE); + + asset_test_utils::test_cases::asset_transactor_transfer_with_pallet_assets_instance_works::< + $runtime, + $xcm_config, + $assets_pallet_instance, + $asset_id, + $asset_id_converter + >( + $collator_session_key, + $existential_deposit, + $tested_asset_id, + asset_owner, + alice_account, + bob_account, + charlie_account, + $additional_checks_before, + $additional_checks_after + ) + } + } +); + +pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works< + Runtime, + XcmConfig, + WeightToFee, + SovereignAccountOf, + ForeignAssetsPalletInstance, + AssetId, + AssetIdConverter, +>( + collator_session_keys: CollatorSessionKeys, + existential_deposit: BalanceOf, + asset_deposit: BalanceOf, + metadata_deposit_base: BalanceOf, + alice_account: AccountIdOf, + bob_account: AccountIdOf, + runtime_call_encode: Box< + dyn Fn(pallet_assets::Call) -> Vec, + >, + unwrap_pallet_assets_event: Box< + dyn Fn(Vec) -> Option>, + >, + additional_checks_before: Box, + additional_checks_after: Box, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + pallet_assets::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + XcmConfig: xcm_executor::Config, + WeightToFee: frame_support::weights::WeightToFee, + ::Balance: From + Into, + SovereignAccountOf: Convert>, + >::AssetId: + From + Into, + >::AssetIdParameter: + From + Into, + >::Balance: + From + Into, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + <::Lookup as StaticLookup>::Source: + From<::AccountId>, + ForeignAssetsPalletInstance: 'static, + AssetId: Clone, + AssetIdConverter: Convert, +{ + // foreign parachain with the same consenus currency as asset + let foreign_asset_id_multilocation = + MultiLocation { parents: 1, interior: X2(Parachain(2222), GeneralIndex(1234567)) }; + let asset_id = AssetIdConverter::convert(foreign_asset_id_multilocation).unwrap(); + + // foreign creator, which can be sibling parachain to match ForeignCreators + let foreign_creator = MultiLocation { parents: 1, interior: X1(Parachain(2222)) }; + let foreign_creator_as_account_id = SovereignAccountOf::convert(foreign_creator).expect(""); + + // we want to buy execution with local relay chain currency + let buy_execution_fee_amount = + WeightToFee::weight_to_fee(&Weight::from_parts(90_000_000_000, 0)); + let buy_execution_fee = MultiAsset { + id: Concrete(MultiLocation::parent()), + fun: Fungible(buy_execution_fee_amount), + }; + + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_balances(vec![( + foreign_creator_as_account_id.clone(), + existential_deposit + + asset_deposit + metadata_deposit_base + + buy_execution_fee_amount.into() + + buy_execution_fee_amount.into(), + )]) + .with_tracing() + .build() + .execute_with(|| { + assert!(>::asset_ids() + .collect::>() + .is_empty()); + assert_eq!( + >::free_balance(&foreign_creator_as_account_id), + existential_deposit + + asset_deposit + metadata_deposit_base + + buy_execution_fee_amount.into() + + buy_execution_fee_amount.into() + ); + additional_checks_before(); + + // execute XCM with Transacts to create/manage foreign assets by foreign governance + // prepapre data for xcm::Transact(create) + let foreign_asset_create = runtime_call_encode(pallet_assets::Call::< + Runtime, + ForeignAssetsPalletInstance, + >::create { + id: asset_id.clone().into(), + // admin as sovereign_account + admin: foreign_creator_as_account_id.clone().into(), + min_balance: 1.into(), + }); + // prepapre data for xcm::Transact(set_metadata) + let foreign_asset_set_metadata = runtime_call_encode(pallet_assets::Call::< + Runtime, + ForeignAssetsPalletInstance, + >::set_metadata { + id: asset_id.clone().into(), + name: Vec::from("My super coin"), + symbol: Vec::from("MY_S_COIN"), + decimals: 12, + }); + // prepapre data for xcm::Transact(set_team - change just freezer to Bob) + let foreign_asset_set_team = runtime_call_encode(pallet_assets::Call::< + Runtime, + ForeignAssetsPalletInstance, + >::set_team { + id: asset_id.clone().into(), + issuer: foreign_creator_as_account_id.clone().into(), + admin: foreign_creator_as_account_id.clone().into(), + freezer: bob_account.clone().into(), + }); + + // lets simulate this was triggered by relay chain from local consensus sibling parachain + let xcm = Xcm(vec![ + WithdrawAsset(buy_execution_fee.clone().into()), + BuyExecution { fees: buy_execution_fee.clone().into(), weight_limit: Unlimited }, + Transact { + origin_kind: OriginKind::Xcm, + require_weight_at_most: Weight::from_parts(40_000_000_000, 6000), + call: foreign_asset_create.into(), + }, + Transact { + origin_kind: OriginKind::SovereignAccount, + require_weight_at_most: Weight::from_parts(20_000_000_000, 6000), + call: foreign_asset_set_metadata.into(), + }, + Transact { + origin_kind: OriginKind::SovereignAccount, + require_weight_at_most: Weight::from_parts(20_000_000_000, 6000), + call: foreign_asset_set_team.into(), + }, + ExpectTransactStatus(MaybeErrorCode::Success), + ]); + + // messages with different consensus should go through the local bridge-hub + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + + // execute xcm as XcmpQueue would do + let outcome = XcmExecutor::::execute_xcm( + foreign_creator, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + ); + assert_eq!(outcome.ensure_complete(), Ok(())); + + // check events + let mut events = >::events() + .into_iter() + .filter_map(|e| unwrap_pallet_assets_event(e.event.encode())); + assert!(events.any(|e| matches!(e, pallet_assets::Event::Created { .. }))); + assert!(events.any(|e| matches!(e, pallet_assets::Event::MetadataSet { .. }))); + assert!(events.any(|e| matches!(e, pallet_assets::Event::TeamChanged { .. }))); + + // check assets after + assert!(!>::asset_ids() + .collect::>() + .is_empty()); + + // check update metadata + use frame_support::traits::tokens::fungibles::roles::Inspect as InspectRoles; + assert_eq!( + >::owner( + asset_id.clone().into() + ), + Some(foreign_creator_as_account_id.clone()) + ); + assert_eq!( + >::admin( + asset_id.clone().into() + ), + Some(foreign_creator_as_account_id.clone()) + ); + assert_eq!( + >::issuer( + asset_id.clone().into() + ), + Some(foreign_creator_as_account_id.clone()) + ); + assert_eq!( + >::freezer( + asset_id.clone().into() + ), + Some(bob_account.clone()) + ); + assert!( + >::free_balance(&foreign_creator_as_account_id) < + existential_deposit + + buy_execution_fee_amount.into() + + buy_execution_fee_amount.into() + ); + assert_metadata::< + pallet_assets::Pallet, + AccountIdOf, + >(&asset_id.clone().into(), "My super coin", "MY_S_COIN", 12); + + // check if changed freezer, can freeze + assert_noop!( + >::freeze( + RuntimeHelper::::origin_of(bob_account), + asset_id.clone().into(), + alice_account.clone().into() + ), + pallet_assets::Error::::NoAccount + ); + assert_noop!( + >::freeze( + RuntimeHelper::::origin_of(foreign_creator_as_account_id.clone()), + asset_id.clone().into(), + alice_account.into() + ), + pallet_assets::Error::::NoPermission + ); + + // lets try create asset for different parachain(3333) (foreign_creator(2222) can create just his assets) + let foreign_asset_id_multilocation = + MultiLocation { parents: 1, interior: X2(Parachain(3333), GeneralIndex(1234567)) }; + let asset_id = AssetIdConverter::convert(foreign_asset_id_multilocation).unwrap(); + + // prepare data for xcm::Transact(create) + let foreign_asset_create = runtime_call_encode(pallet_assets::Call::< + Runtime, + ForeignAssetsPalletInstance, + >::create { + id: asset_id.clone().into(), + // admin as sovereign_account + admin: foreign_creator_as_account_id.clone().into(), + min_balance: 1.into(), + }); + let xcm = Xcm(vec![ + WithdrawAsset(buy_execution_fee.clone().into()), + BuyExecution { fees: buy_execution_fee.clone().into(), weight_limit: Unlimited }, + Transact { + origin_kind: OriginKind::Xcm, + require_weight_at_most: Weight::from_parts(20_000_000_000, 6000), + call: foreign_asset_create.into(), + }, + ExpectTransactStatus(MaybeErrorCode::from(DispatchError::BadOrigin.encode())), + ]); + + // messages with different consensus should go through the local bridge-hub + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + + // execute xcm as XcmpQueue would do + let outcome = XcmExecutor::::execute_xcm( + foreign_creator, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + ); + assert_eq!(outcome.ensure_complete(), Ok(())); + + additional_checks_after(); + }) +} + +#[macro_export] +macro_rules! include_create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works( + ( + $runtime:path, + $xcm_config:path, + $weight_to_fee:path, + $sovereign_account_of:path, + $assets_pallet_instance:path, + $asset_id:path, + $asset_id_converter:path, + $collator_session_key:expr, + $existential_deposit:expr, + $asset_deposit:expr, + $metadata_deposit_base:expr, + $runtime_call_encode:expr, + $unwrap_pallet_assets_event:expr, + $additional_checks_before:expr, + $additional_checks_after:expr + ) => { + #[test] + fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works() { + const ALICE: [u8; 32] = [1u8; 32]; + let alice_account = parachains_common::AccountId::from(ALICE); + const BOB: [u8; 32] = [2u8; 32]; + let bob_account = parachains_common::AccountId::from(BOB); + + asset_test_utils::test_cases::create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works::< + $runtime, + $xcm_config, + $weight_to_fee, + $sovereign_account_of, + $assets_pallet_instance, + $asset_id, + $asset_id_converter + >( + $collator_session_key, + $existential_deposit, + $asset_deposit, + $metadata_deposit_base, + alice_account, + bob_account, + $runtime_call_encode, + $unwrap_pallet_assets_event, + $additional_checks_before, + $additional_checks_after + ) + } + } +); diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/westmint/Cargo.toml index 591c7699f8b..1707a17e191 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/westmint/Cargo.toml @@ -103,6 +103,7 @@ runtime-benchmarks = [ "pallet-collator-selection/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", + "assets-common/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index e3d36588b0c..c9e8143beaf 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -69,17 +69,20 @@ use parachains_common::{ NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_config::{ - ForeignCreators, MultiLocationForAssetId, TrustBackedAssetsConvertedConcreteId, - WestendLocation, XcmConfig, XcmOriginToTransactDispatchOrigin, + ForeignAssetsConvertedConcreteId, TrustBackedAssetsConvertedConcreteId, WestendLocation, + XcmConfig, XcmOriginToTransactDispatchOrigin, }; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -// Polkadot imports +use assets_common::{ + foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, +}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use xcm_executor::XcmExecutor; +use crate::xcm_config::ForeignCreatorsSovereignAccountOf; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; impl_opaque_keys! { @@ -246,29 +249,43 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +parameter_types! { + // we just reuse the same deposits + pub const ForeignAssetsAssetDeposit: Balance = AssetDeposit::get(); + pub const ForeignAssetsAssetAccountDeposit: Balance = AssetAccountDeposit::get(); + pub const ForeignAssetsApprovalDeposit: Balance = ApprovalDeposit::get(); + pub const ForeignAssetsAssetsStringLimit: u32 = AssetsStringLimit::get(); + pub const ForeignAssetsMetadataDepositBase: Balance = MetadataDepositBase::get(); + pub const ForeignAssetsMetadataDepositPerByte: Balance = MetadataDepositPerByte::get(); +} + /// Assets managed by some foreign location. Note: we do not declare a `ForeignAssetsCall` type, as /// this type is used in proxy definitions. We assume that a foreign location would not want to set /// an individual, local account as a proxy for the issuance of their assets. This issuance should /// be managed by the foreign location's governance. -type ForeignAssetsInstance = pallet_assets::Instance2; +pub type ForeignAssetsInstance = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type AssetId = MultiLocationForAssetId; type AssetIdParameter = MultiLocationForAssetId; type Currency = Balances; - type CreateOrigin = ForeignCreators; + type CreateOrigin = ForeignCreators< + (FromSiblingParachain>,), + ForeignCreatorsSovereignAccountOf, + AccountId, + >; type ForceOrigin = AssetsForceOrigin; - type AssetDeposit = AssetDeposit; - type MetadataDepositBase = MetadataDepositBase; - type MetadataDepositPerByte = MetadataDepositPerByte; - type ApprovalDeposit = ApprovalDeposit; - type StringLimit = AssetsStringLimit; + type AssetDeposit = ForeignAssetsAssetDeposit; + type MetadataDepositBase = ForeignAssetsMetadataDepositBase; + type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte; + type ApprovalDeposit = ForeignAssetsApprovalDeposit; + type StringLimit = ForeignAssetsAssetsStringLimit; type Freezer = (); type Extra = (); type WeightInfo = weights::pallet_assets::WeightInfo; type CallbackHandle = (); - type AssetAccountDeposit = AssetAccountDeposit; + type AssetAccountDeposit = ForeignAssetsAssetAccountDeposit; type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; @@ -346,6 +363,7 @@ impl Default for ProxyType { Self::Any } } + impl InstanceFilter for ProxyType { fn filter(&self, c: &RuntimeCall) -> bool { match self { @@ -942,11 +960,17 @@ impl_runtime_apis! { }, // collect pallet_assets (TrustBackedAssets) convert::<_, _, _, _, TrustBackedAssetsConvertedConcreteId>( - Assets::account_balances(account) + Assets::account_balances(account.clone()) + .iter() + .filter(|(_, balance)| balance > &0) + )?, + // collect pallet_assets (ForeignAssets) + convert::<_, _, _, _, ForeignAssetsConvertedConcreteId>( + ForeignAssets::account_balances(account) .iter() .filter(|(_, balance)| balance > &0) )?, - // collect ... e.g. pallet_assets ForeignAssets + // collect ... e.g. other tokens ].concat()) } } diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index e604315467b..b6587c7dc97 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -18,35 +18,31 @@ use super::{ ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; +use crate::ForeignAssets; +use assets_common::matching::{FromSiblingParachain, IsForeignConcreteAsset, StartsWith}; use frame_support::{ match_types, parameter_types, - traits::{ - ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing, - PalletInfoAccess, - }, + traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, }; -use pallet_xcm::{EnsureXcm, XcmPassthrough}; +use pallet_xcm::XcmPassthrough; use parachains_common::{ impls::ToStakingPot, xcm_config::{ AssetFeeAsExistentialDepositMultiplier, DenyReserveTransferToRelayChain, DenyThenTry, }, }; -use polkadot_parachain::primitives::{Id as ParaId, Sibling}; +use polkadot_parachain::primitives::Sibling; use sp_runtime::traits::ConvertInto; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, WithComputedOrigin, }; -use xcm_executor::{ - traits::{Convert, WithOriginFilter}, - XcmExecutor, -}; +use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { pub const WestendLocation: MultiLocation = MultiLocation::parent(); @@ -54,7 +50,6 @@ parameter_types! { pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub const Local: MultiLocation = Here.into_location(); pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); @@ -86,7 +81,7 @@ pub type CurrencyTransactor = CurrencyAdapter< (), >; -/// `AssetId/Balancer` converter for `TrustBackedAssets` +/// `AssetId/Balance` converter for `TrustBackedAssets` pub type TrustBackedAssetsConvertedConcreteId = assets_common::TrustBackedAssetsConvertedConcreteId; @@ -106,8 +101,31 @@ pub type FungiblesTransactor = FungiblesAdapter< // The account to use for tracking teleports. CheckingAccount, >; + +/// `AssetId/Balance` converter for `TrustBackedAssets` +pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId< + StartsWith, + Balance, +>; + +/// Means for transacting foreign assets from different global consensus. +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + ForeignAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ForeignAssetsConvertedConcreteId, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // TODO:check-parameter - no teleports + NoChecking, + // The account to use for tracking teleports. + CheckingAccount, +>; + /// Means for transacting assets on this chain. -pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor); +pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor, ForeignFungiblesTransactor); /// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, /// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can @@ -182,7 +200,11 @@ impl Contains for SafeCallFilter { RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | - RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | + RuntimeCall::Utility( + pallet_utility::Call::as_derivative { .. } | + pallet_utility::Call::batch { .. } | + pallet_utility::Call::batch_all { .. }, + ) | RuntimeCall::Assets( pallet_assets::Call::create { .. } | pallet_assets::Call::force_create { .. } | @@ -211,6 +233,34 @@ impl Contains for SafeCallFilter { pallet_assets::Call::touch { .. } | pallet_assets::Call::refund { .. }, ) | + RuntimeCall::ForeignAssets( + /* avoided: mint, burn */ + pallet_assets::Call::create { .. } | + pallet_assets::Call::force_create { .. } | + pallet_assets::Call::start_destroy { .. } | + pallet_assets::Call::destroy_accounts { .. } | + pallet_assets::Call::destroy_approvals { .. } | + pallet_assets::Call::finish_destroy { .. } | + pallet_assets::Call::transfer { .. } | + pallet_assets::Call::transfer_keep_alive { .. } | + pallet_assets::Call::force_transfer { .. } | + pallet_assets::Call::freeze { .. } | + pallet_assets::Call::thaw { .. } | + pallet_assets::Call::freeze_asset { .. } | + pallet_assets::Call::thaw_asset { .. } | + pallet_assets::Call::transfer_ownership { .. } | + pallet_assets::Call::set_team { .. } | + pallet_assets::Call::set_metadata { .. } | + pallet_assets::Call::clear_metadata { .. } | + pallet_assets::Call::force_clear_metadata { .. } | + pallet_assets::Call::force_asset_status { .. } | + pallet_assets::Call::approve_transfer { .. } | + pallet_assets::Call::cancel_approval { .. } | + pallet_assets::Call::force_cancel_approval { .. } | + pallet_assets::Call::transfer_approved { .. } | + pallet_assets::Call::touch { .. } | + pallet_assets::Call::refund { .. }, + ) | RuntimeCall::Uniques( pallet_uniques::Call::create { .. } | pallet_uniques::Call::force_create { .. } | @@ -282,7 +332,13 @@ impl xcm_executor::Config for XcmConfig { // Westmint acting _as_ a reserve location for WND and assets created under `pallet-assets`. // For WND, users must use teleport where allowed (e.g. with the Relay Chain). type IsReserve = (); - type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of WND + // We allow: + // - teleportation of WND + // - teleportation of sibling parachain's assets (as ForeignCreators) + type IsTeleporter = ( + NativeAsset, + IsForeignConcreteAsset>>, + ); type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< @@ -370,37 +426,12 @@ impl cumulus_pallet_xcm::Config for Runtime { type XcmExecutor = XcmExecutor; } -pub type MultiLocationForAssetId = MultiLocation; - -pub type SovereignAccountOf = ( - SiblingParachainConvertsVia, +pub type ForeignCreatorsSovereignAccountOf = ( + SiblingParachainConvertsVia, AccountId32Aliases, ParentIsPreset, ); -// `EnsureOriginWithArg` impl for `CreateOrigin` that allows only XCM origins that are locations -// containing the class location. -pub struct ForeignCreators; -impl EnsureOriginWithArg for ForeignCreators { - type Success = AccountId; - - fn try_origin( - o: RuntimeOrigin, - a: &MultiLocation, - ) -> sp_std::result::Result { - let origin_location = EnsureXcm::::try_origin(o.clone())?; - if !a.starts_with(&origin_location) { - return Err(o) - } - SovereignAccountOf::convert(origin_location).map_err(|_| o) - } - - #[cfg(feature = "runtime-benchmarks")] - fn try_successful_origin(a: &MultiLocation) -> Result { - Ok(pallet_xcm::Origin::Xcm(a.clone()).into()) - } -} - /// Simple conversion of `u32` into an `AssetId` for use in benchmarking. pub struct XcmBenchmarkHelper; #[cfg(feature = "runtime-benchmarks")] diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 5d7a6187869..77125a4884c 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -1,27 +1,34 @@ -use asset_test_utils::{ExtBuilder, RuntimeHelper}; -use codec::{DecodeLimit, Encode}; +use asset_test_utils::{ExtBuilder, RuntimeHelper, XcmReceivedFrom}; +use codec::{Decode, DecodeLimit, Encode}; use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ assert_noop, assert_ok, sp_io, + traits::fungibles::InspectEnumerable, weights::{Weight, WeightToFee as WeightToFeeT}, }; -use parachains_common::{AccountId, AuraId, Balance}; +use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; +use std::convert::Into; pub use westmint_runtime::{ constants::fee::WeightToFee, xcm_config::{TrustBackedAssetsPalletLocation, XcmConfig}, - Assets, Balances, ExistentialDeposit, ReservedDmpWeight, Runtime, SessionKeys, System, + AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, + Runtime, SessionKeys, System, TrustBackedAssetsInstance, }; use westmint_runtime::{ - xcm_config::{AssetFeeAsExistentialDepositMultiplierFeeCharger, WestendLocation}, - RuntimeCall, + xcm_config::{ + AssetFeeAsExistentialDepositMultiplierFeeCharger, ForeignCreatorsSovereignAccountOf, + WestendLocation, + }, + MetadataDepositBase, RuntimeCall, RuntimeEvent, }; use xcm::{latest::prelude::*, VersionedXcm, MAX_XCM_DECODE_DEPTH}; use xcm_executor::{ - traits::{Convert, WeightTrader}, + traits::{Convert, Identity, JustTry, WeightTrader}, XcmExecutor, }; -pub const ALICE: [u8; 32] = [1u8; 32]; +const ALICE: [u8; 32] = [1u8; 32]; +const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; type AssetIdForTrustBackedAssetsConvert = assets_common::AssetIdForTrustBackedAssetsConvert; @@ -371,9 +378,15 @@ fn test_assets_balances_api_works() { .build() .execute_with(|| { let local_asset_id = 1; + let foreign_asset_id_multilocation = + MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; // check before assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0); + assert_eq!( + ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), + 0 + ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0); assert!(Runtime::query_account_balances(AccountId::from(ALICE)).unwrap().is_empty()); @@ -400,15 +413,37 @@ fn test_assets_balances_api_works() { minimum_asset_balance )); + // create foreign asset + let foreign_asset_minimum_asset_balance = 3333333_u128; + assert_ok!(ForeignAssets::force_create( + RuntimeHelper::::root_origin(), + foreign_asset_id_multilocation.clone().into(), + AccountId::from(SOME_ASSET_ADMIN).into(), + false, + foreign_asset_minimum_asset_balance + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(ForeignAssets::mint( + RuntimeHelper::::origin_of(AccountId::from(SOME_ASSET_ADMIN)), + foreign_asset_id_multilocation.clone().into(), + AccountId::from(ALICE).into(), + 6 * foreign_asset_minimum_asset_balance + )); + // check after assert_eq!( Assets::balance(local_asset_id, AccountId::from(ALICE)), minimum_asset_balance ); + assert_eq!( + ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), + 6 * minimum_asset_balance + ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency); let result = Runtime::query_account_balances(AccountId::from(ALICE)).unwrap(); - assert_eq!(result.len(), 2); + assert_eq!(result.len(), 3); // check currency assert!(result.iter().any(|asset| asset.eq( @@ -423,56 +458,134 @@ fn test_assets_balances_api_works() { minimum_asset_balance ) .into()))); + // check foreign asset + assert!(result.iter().any(|asset| asset.eq(&( + Identity::reverse_ref(foreign_asset_id_multilocation).unwrap(), + 6 * foreign_asset_minimum_asset_balance + ) + .into()))); }); } -#[test] -fn receive_teleported_asset_works() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - let xcm = Xcm(vec![ - ReceiveTeleportedAsset(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(10000000000000), - }])), - ClearOrigin, - BuyExecution { - fees: MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(10000000000000), - }, - weight_limit: Limited(Weight::from_parts(303531000, 65536)), - }, - DepositAsset { - assets: Wild(AllCounted(1)), - beneficiary: MultiLocation { - parents: 0, - interior: X1(AccountId32 { - network: None, - id: [ - 18, 153, 85, 112, 1, 245, 88, 21, 211, 252, 181, 60, 116, 70, 58, - 203, 12, 246, 209, 77, 70, 57, 179, 64, 152, 44, 96, 135, 127, 56, - 70, 9, - ], - }), - }, - }, - ]); - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - - let weight_limit = ReservedDmpWeight::get(); - - let outcome = XcmExecutor::::execute_xcm(Parent, xcm, hash, weight_limit); - assert_eq!(outcome.ensure_complete(), Ok(())); - }) -} +asset_test_utils::include_receive_teleported_asset_for_native_asset_works!( + Runtime, + XcmConfig, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ) +); + +asset_test_utils::include_receive_teleported_asset_from_foreign_creator_works!( + Runtime, + XcmConfig, + WeightToFee, + ForeignCreatorsSovereignAccountOf, + ForeignAssetsInstance, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get() +); + +asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( + Runtime, + XcmConfig, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }) +); + +asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( + asset_transactor_transfer_with_trust_backed_assets_works, + Runtime, + XcmConfig, + TrustBackedAssetsInstance, + AssetIdForTrustBackedAssets, + AssetIdForTrustBackedAssetsConvert, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + 12345, + Box::new(|| { + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }) +); + +asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( + asset_transactor_transfer_with_foreign_assets_works, + Runtime, + XcmConfig, + ForeignAssetsInstance, + MultiLocation, + JustTry, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) }, + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + }) +); + +asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works!( + Runtime, + XcmConfig, + WeightToFee, + ForeignCreatorsSovereignAccountOf, + ForeignAssetsInstance, + MultiLocation, + JustTry, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + AssetDeposit::get(), + MetadataDepositBase::get(), + Box::new(|pallet_asset_call| RuntimeCall::ForeignAssets(pallet_asset_call).encode()), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::ForeignAssets(pallet_asset_event)) => Some(pallet_asset_event), + _ => None, + } + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + assert_eq!(ForeignAssets::asset_ids().collect::>().len(), 1); + }) +); #[test] fn plain_receive_teleported_asset_works() { @@ -494,10 +607,8 @@ fn plain_receive_teleported_asset_works() { ) .map(xcm::v3::Xcm::::try_from).expect("failed").expect("failed"); - let weight_limit = ReservedDmpWeight::get(); - let outcome = - XcmExecutor::::execute_xcm(Parent, maybe_msg, message_id, weight_limit); + XcmExecutor::::execute_xcm(Parent, maybe_msg, message_id, RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Parent)); assert_eq!(outcome.ensure_complete(), Ok(())); }) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index 5c6332472aa..661b8403238 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -45,7 +45,6 @@ parameter_types! { pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub const Local: MultiLocation = Here.into_location(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } From 018b800e55ef60e382af907bf07f4bfededf5a11 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 16 Mar 2023 14:59:23 +0100 Subject: [PATCH 047/339] Added `StartsWithExplicitGlobalConsensus` to ignores (#2338) --- parachains/runtimes/assets/common/src/lib.rs | 60 ++++++++++++++++++- .../runtimes/assets/common/src/matching.rs | 12 ++++ .../assets/statemine/src/xcm_config.rs | 14 ++++- .../assets/westmint/src/xcm_config.rs | 14 ++++- 4 files changed, 94 insertions(+), 6 deletions(-) diff --git a/parachains/runtimes/assets/common/src/lib.rs b/parachains/runtimes/assets/common/src/lib.rs index fbf19b89914..999b0ae990a 100644 --- a/parachains/runtimes/assets/common/src/lib.rs +++ b/parachains/runtimes/assets/common/src/lib.rs @@ -79,6 +79,7 @@ pub type ForeignAssetsConvertedConcreteId, u128>; + type Convert = ForeignAssetsConvertedConcreteId< + ( + StartsWith, + StartsWithExplicitGlobalConsensus, + ), + u128, + >; let test_data = vec![ // excluded as local @@ -212,13 +220,33 @@ mod tests { ), // excluded as parent (ma_1000(1, Here), Err(MatchError::AssetNotHandled)), - // excluded as additional filter + // excluded as additional filter - Parachain100Pattern (ma_1000(1, X1(Parachain(100))), Err(MatchError::AssetNotHandled)), (ma_1000(1, X2(Parachain(100), GeneralIndex(1234))), Err(MatchError::AssetNotHandled)), ( ma_1000(1, X3(Parachain(100), PalletInstance(13), GeneralIndex(1234))), Err(MatchError::AssetNotHandled), ), + // excluded as additional filter - StartsWithExplicitGlobalConsensus + ( + ma_1000(1, X1(GlobalConsensus(NetworkId::ByGenesis([9; 32])))), + Err(MatchError::AssetNotHandled), + ), + ( + ma_1000(2, X1(GlobalConsensus(NetworkId::ByGenesis([9; 32])))), + Err(MatchError::AssetNotHandled), + ), + ( + ma_1000( + 2, + X3( + GlobalConsensus(NetworkId::ByGenesis([9; 32])), + Parachain(200), + GeneralIndex(1234), + ), + ), + Err(MatchError::AssetNotHandled), + ), // ok (ma_1000(1, X1(Parachain(200))), Ok((MultiLocation::new(1, X1(Parachain(200))), 1000))), (ma_1000(2, X1(Parachain(200))), Ok((MultiLocation::new(2, X1(Parachain(200))), 1000))), @@ -230,6 +258,34 @@ mod tests { ma_1000(2, X2(Parachain(200), GeneralIndex(1234))), Ok((MultiLocation::new(2, X2(Parachain(200), GeneralIndex(1234))), 1000)), ), + ( + ma_1000(2, X1(GlobalConsensus(NetworkId::ByGenesis([7; 32])))), + Ok(( + MultiLocation::new(2, X1(GlobalConsensus(NetworkId::ByGenesis([7; 32])))), + 1000, + )), + ), + ( + ma_1000( + 2, + X3( + GlobalConsensus(NetworkId::ByGenesis([7; 32])), + Parachain(200), + GeneralIndex(1234), + ), + ), + Ok(( + MultiLocation::new( + 2, + X3( + GlobalConsensus(NetworkId::ByGenesis([7; 32])), + Parachain(200), + GeneralIndex(1234), + ), + ), + 1000, + )), + ), ]; for (multi_asset, expected_result) in test_data { diff --git a/parachains/runtimes/assets/common/src/matching.rs b/parachains/runtimes/assets/common/src/matching.rs index 05acaff3990..5a60b18b8c9 100644 --- a/parachains/runtimes/assets/common/src/matching.rs +++ b/parachains/runtimes/assets/common/src/matching.rs @@ -37,6 +37,18 @@ impl> Contains for Equals } } +pub struct StartsWithExplicitGlobalConsensus(sp_std::marker::PhantomData); +impl> Contains + for StartsWithExplicitGlobalConsensus +{ + fn contains(t: &MultiLocation) -> bool { + match t.interior.global_consensus() { + Ok(requested_network) if requested_network.eq(&Network::get()) => true, + _ => false, + } + } +} + frame_support::parameter_types! { pub LocalMultiLocationPattern: MultiLocation = MultiLocation::new(0, Here); pub ParentLocation: MultiLocation = MultiLocation::parent(); diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 3476da44a47..bb591d5bcab 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -18,7 +18,9 @@ use super::{ ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; -use assets_common::matching::{FromSiblingParachain, IsForeignConcreteAsset, StartsWith}; +use assets_common::matching::{ + FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, +}; use frame_support::{ match_types, parameter_types, traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, @@ -49,6 +51,7 @@ parameter_types! { pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); @@ -103,7 +106,14 @@ pub type FungiblesTransactor = FungiblesAdapter< /// `AssetId/Balance` converter for `TrustBackedAssets` pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId< - StartsWith, + ( + // Ignore `TrustBackedAssets` explicitly + StartsWith, + // Ignore asset which starts explicitly with our `GlobalConsensus(NetworkId)`, means: + // - foreign assets from our consensus should be: `MultiLocation {parent: 1, X*(Parachain(xyz))} + // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` wont be accepted here + StartsWithExplicitGlobalConsensus, + ), Balance, >; diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index b6587c7dc97..b13e88b2b06 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -19,7 +19,9 @@ use super::{ TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use crate::ForeignAssets; -use assets_common::matching::{FromSiblingParachain, IsForeignConcreteAsset, StartsWith}; +use assets_common::matching::{ + FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, +}; use frame_support::{ match_types, parameter_types, traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, @@ -50,6 +52,7 @@ parameter_types! { pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); @@ -104,7 +107,14 @@ pub type FungiblesTransactor = FungiblesAdapter< /// `AssetId/Balance` converter for `TrustBackedAssets` pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId< - StartsWith, + ( + // Ignore `TrustBackedAssets` explicitly + StartsWith, + // Ignore asset which starts explicitly with our `GlobalConsensus(NetworkId)`, means: + // - foreign assets from our consensus should be: `MultiLocation {parent: 1, X*(Parachain(xyz))} + // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` wont be accepted here + StartsWithExplicitGlobalConsensus, + ), Balance, >; From 48b6877e18de723e1e61e1ff7f6c757e106e7ccb Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 17 Mar 2023 14:29:28 +0100 Subject: [PATCH 048/339] Change to correct weight file for pallet_bridge_assets_transfer --- .../runtimes/assets/statemine/src/lib.rs | 3 +- .../src/weights/bridge_assets_transfer.rs | 110 ------------------ .../assets/statemine/src/weights/mod.rs | 2 +- 3 files changed, 2 insertions(+), 113 deletions(-) delete mode 100644 parachains/runtimes/assets/statemine/src/weights/bridge_assets_transfer.rs diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index d92196e413c..a6903c661a1 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -645,7 +645,7 @@ impl pallet_bridge_assets_transfer::Config for Runtime { type RuntimeEvent = RuntimeEvent; type BridgeXcmSender = BridgeXcmSender; type UniversalLocation = UniversalLocation; - type WeightInfo = weights::bridge_assets_transfer::WeightInfo; + type WeightInfo = weights::pallet_bridge_assets_transfer::WeightInfo; type AssetTransactor = AssetTransactors; type AdminOrigin = AssetsForceOrigin; type TransferOrigin = EnsureXcmOrigin; @@ -697,7 +697,6 @@ construct_runtime!( Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, // Reserving 52 for pallet_nfts ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, - // TODO:check-parameter - do we need just one instance? or BridgeAssetsTransfer vs BridgeForeignAssetsTransfer(for transfer back) ? BridgeAssetsTransfer: pallet_bridge_assets_transfer::{Pallet, Call, Storage, Event} = 54, #[cfg(feature = "state-trie-version-1")] diff --git a/parachains/runtimes/assets/statemine/src/weights/bridge_assets_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/bridge_assets_transfer.rs deleted file mode 100644 index 28d4bff75bc..00000000000 --- a/parachains/runtimes/assets/statemine/src/weights/bridge_assets_transfer.rs +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus 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. - -// Cumulus 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 Cumulus. If not, see . - -//! Autogenerated weights for `pallet_bridge_assets_transfer` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 - -// Executed Command: -// target/debug/polkadot-parachain -// benchmark -// pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* -// --execution=wasm -// --wasm-execution=compiled -// --heap-pages=4096 -// --pallet=pallet_bridge_assets_transfer -// --chain=statemine-dev -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/bridge_assets_transfer.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weight functions for `pallet_bridge_assets_transfer`. -pub struct WeightInfo(PhantomData); -impl pallet_bridge_assets_transfer::WeightInfo for WeightInfo { - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeAssetsTransfer Bridges (r:1 w:0) - /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) - /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) - fn transfer_asset_via_bridge() -> Weight { - // Proof Size summary in bytes: - // Measured: `542` - // Estimated: `17786` - // Minimum execution time: 2_415_358 nanoseconds. - Weight::from_parts(2_474_758_000, 17786) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) - /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) - fn add_bridge_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `4374` - // Minimum execution time: 345_841 nanoseconds. - Weight::from_parts(361_206_000, 4374) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) - /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) - fn remove_bridge_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `131` - // Estimated: `4374` - // Minimum execution time: 367_373 nanoseconds. - Weight::from_parts(379_332_000, 4374) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) - /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) - fn update_bridge_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `131` - // Estimated: `4374` - // Minimum execution time: 385_827 nanoseconds. - Weight::from_parts(394_729_000, 4374) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/parachains/runtimes/assets/statemine/src/weights/mod.rs b/parachains/runtimes/assets/statemine/src/weights/mod.rs index 66f73748f3b..46d1115ded1 100644 --- a/parachains/runtimes/assets/statemine/src/weights/mod.rs +++ b/parachains/runtimes/assets/statemine/src/weights/mod.rs @@ -1,10 +1,10 @@ pub mod block_weights; -pub mod bridge_assets_transfer; pub mod cumulus_pallet_xcmp_queue; pub mod extrinsic_weights; pub mod frame_system; pub mod pallet_assets; pub mod pallet_balances; +pub mod pallet_bridge_assets_transfer; pub mod pallet_collator_selection; pub mod pallet_multisig; pub mod pallet_proxy; From c16f96dcabfbc35db5b24c406c75bc462bc5deac Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 17 Mar 2023 15:19:39 +0100 Subject: [PATCH 049/339] Renamed `pallet-bridge-assets-transfer` to `pallet-bridge-transfer` --- Cargo.lock | 4 +- Cargo.toml | 2 +- .../Cargo.toml | 4 +- .../src/benchmarking.rs | 2 +- .../src/lib.rs | 56 +++++++++---------- .../src/weights.rs | 0 .../runtimes/assets/statemine/Cargo.toml | 8 +-- .../runtimes/assets/statemine/src/lib.rs | 12 ++-- .../assets/statemine/src/weights/mod.rs | 2 +- ..._transfer.rs => pallet_bridge_transfer.rs} | 2 +- .../assets/statemine/src/xcm_config.rs | 20 +++---- .../runtimes/assets/statemine/tests/tests.rs | 10 ++-- 12 files changed, 60 insertions(+), 62 deletions(-) rename parachains/pallets/{bridge-assets-transfer => bridge-transfer}/Cargo.toml (95%) rename parachains/pallets/{bridge-assets-transfer => bridge-transfer}/src/benchmarking.rs (98%) rename parachains/pallets/{bridge-assets-transfer => bridge-transfer}/src/lib.rs (94%) rename parachains/pallets/{bridge-assets-transfer => bridge-transfer}/src/weights.rs (100%) rename parachains/runtimes/assets/statemine/src/weights/{pallet_bridge_assets_transfer.rs => pallet_bridge_transfer.rs} (98%) diff --git a/Cargo.lock b/Cargo.lock index 6b870c5e935..f58cd55270d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6148,7 +6148,7 @@ dependencies = [ ] [[package]] -name = "pallet-bridge-assets-transfer" +name = "pallet-bridge-transfer" version = "0.1.0" dependencies = [ "cumulus-pallet-xcmp-queue", @@ -12434,7 +12434,7 @@ dependencies = [ "pallet-aura", "pallet-authorship", "pallet-balances", - "pallet-bridge-assets-transfer", + "pallet-bridge-transfer", "pallet-collator-selection", "pallet-multisig", "pallet-proxy", diff --git a/Cargo.toml b/Cargo.toml index 8b40b0c07b3..909b481058e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ members = [ "primitives/utility", "polkadot-parachain", "parachains/common", - "parachains/pallets/bridge-assets-transfer", + "parachains/pallets/bridge-transfer", "parachains/pallets/parachain-info", "parachains/pallets/ping", "parachains/runtimes/testing/rococo-parachain", diff --git a/parachains/pallets/bridge-assets-transfer/Cargo.toml b/parachains/pallets/bridge-transfer/Cargo.toml similarity index 95% rename from parachains/pallets/bridge-assets-transfer/Cargo.toml rename to parachains/pallets/bridge-transfer/Cargo.toml index a2eb9b82dce..0198d63fa5c 100644 --- a/parachains/pallets/bridge-assets-transfer/Cargo.toml +++ b/parachains/pallets/bridge-transfer/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "pallet-bridge-assets-transfer" +name = "pallet-bridge-transfer" version = "0.1.0" authors = ["Parity Technologies "] edition = "2021" license = "Apache-2.0" homepage = "https://docs.substrate.io/" repository = "https://github.com/paritytech/cumulus/" -description = "Pallet message transfers through bridges" +description = "Pallet for message transfer through bridges" readme = "README.md" [dependencies] diff --git a/parachains/pallets/bridge-assets-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs similarity index 98% rename from parachains/pallets/bridge-assets-transfer/src/benchmarking.rs rename to parachains/pallets/bridge-transfer/src/benchmarking.rs index 0aee9e477c0..d0cd12c8be5 100644 --- a/parachains/pallets/bridge-assets-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! `BridgeAssetsTransfer` pallet benchmarks. +//! `BridgeTransfer` pallet benchmarks. use crate::{BenchmarkHelper, Bridges, Call, Config, Event, Pallet}; diff --git a/parachains/pallets/bridge-assets-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs similarity index 94% rename from parachains/pallets/bridge-assets-transfer/src/lib.rs rename to parachains/pallets/bridge-transfer/src/lib.rs index a7c1508311c..6e774c6b884 100644 --- a/parachains/pallets/bridge-assets-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -13,9 +13,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! # Bridge Asset Transfer Pallet +//! # Bridge Transfer Pallet //! -//! A utility which could help move assets through bridges, e.g. move assets between different global consensus... +//! A utility which could help transfer through bridges, e.g. move assets between different global consensus... // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] @@ -114,7 +114,7 @@ pub mod pallet { type AdminOrigin: EnsureOrigin; /// Required origin for asset transfer. If successful, it resolves to `MultiLocation`. - type TransferOrigin: EnsureOrigin; + type TransferAssetOrigin: EnsureOrigin; /// Benchmarks helper. #[cfg(feature = "runtime-benchmarks")] @@ -174,7 +174,7 @@ pub mod pallet { assets: Box, destination: Box, ) -> DispatchResult { - let origin_location = T::TransferOrigin::ensure_origin(origin)?; + let origin_location = T::TransferAssetOrigin::ensure_origin(origin)?; // Check remote destination + bridge_config let (bridge_config, remote_destination) = @@ -422,7 +422,7 @@ pub mod pallet { #[cfg(test)] pub(crate) mod tests { use super::*; - use crate as bridge_assets_transfer; + use crate as bridge_transfer; use frame_support::traits::Currency; use frame_support::{ @@ -453,7 +453,7 @@ pub(crate) mod tests { { System: frame_system::{Pallet, Call, Config, Storage, Event}, Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - BridgeAssetsTransfer: bridge_assets_transfer::{Pallet, Call, Event} = 52, + BridgeTransfer: bridge_transfer::{Pallet, Call, Event} = 52, } ); @@ -564,7 +564,7 @@ pub(crate) mod tests { /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus pub type TestBridgeXcmSender = - UnpaidRemoteExporter; + UnpaidRemoteExporter; /// No local origins on this chain are allowed to dispatch XCM sends/executions. pub type LocalOriginToLocation = SignedToAccountId32; @@ -649,7 +649,7 @@ pub(crate) mod tests { type WeightInfo = (); type AssetTransactor = CurrencyTransactor; type AdminOrigin = EnsureRoot; - type TransferOrigin = EnsureXcmOrigin; + type TransferAssetOrigin = EnsureXcmOrigin; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = TestBenchmarkHelper; } @@ -683,7 +683,7 @@ pub(crate) mod tests { new_test_ext().execute_with(|| { // insert bridge config let bridge_config = test_bridge_config().1; - assert_ok!(BridgeAssetsTransfer::add_bridge_config( + assert_ok!(BridgeTransfer::add_bridge_config( RuntimeOrigin::root(), Wococo, Box::new(bridge_config.clone()), @@ -691,7 +691,7 @@ pub(crate) mod tests { // v2 not supported assert_eq!( - BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V2( + BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V2( xcm::v2::MultiLocation::default() )), Err(Error::::UnsupportedDestination) @@ -699,14 +699,14 @@ pub(crate) mod tests { // v3 - "parent: 0" wrong assert_eq!( - BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( + BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V3( MultiLocation::new(0, X2(GlobalConsensus(Wococo), Parachain(1000))) )), Err(Error::::UnsupportedDestination) ); // v3 - "parent: 1" wrong assert_eq!( - BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( + BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V3( MultiLocation::new(1, X2(GlobalConsensus(Wococo), Parachain(1000))) )), Err(Error::::UnsupportedDestination) @@ -714,7 +714,7 @@ pub(crate) mod tests { // v3 - Rococo is not supported assert_eq!( - BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( + BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V3( MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))) )), Err(Error::::UnsupportedDestination) @@ -722,7 +722,7 @@ pub(crate) mod tests { // v3 - remote_destination is not allowed assert_eq!( - BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( + BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V3( MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1234))) )), Err(Error::::UnsupportedDestination) @@ -730,7 +730,7 @@ pub(crate) mod tests { // v3 - ok (allowed) assert_eq!( - BridgeAssetsTransfer::ensure_remote_destination(VersionedMultiLocation::V3( + BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V3( MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1000))) )), Ok(( @@ -757,7 +757,7 @@ pub(crate) mod tests { // insert bridge config let bridged_network = Wococo; - assert_ok!(BridgeAssetsTransfer::add_bridge_config( + assert_ok!(BridgeTransfer::add_bridge_config( RuntimeOrigin::root(), bridged_network, Box::new(test_bridge_config().1), @@ -788,7 +788,7 @@ pub(crate) mod tests { ))); // trigger asset transfer - assert_ok!(BridgeAssetsTransfer::transfer_asset_via_bridge( + assert_ok!(BridgeTransfer::transfer_asset_via_bridge( RuntimeOrigin::signed(account(1)), assets, destination, @@ -809,11 +809,11 @@ pub(crate) mod tests { // check reserve asset deposited event assert!(System::events().iter().any(|r| matches!( r.event, - RuntimeEvent::BridgeAssetsTransfer(Event::ReserveAssetsDeposited { .. }) + RuntimeEvent::BridgeTransfer(Event::ReserveAssetsDeposited { .. }) ))); assert!(System::events().iter().any(|r| matches!( r.event, - RuntimeEvent::BridgeAssetsTransfer(Event::TransferInitiated { .. }) + RuntimeEvent::BridgeTransfer(Event::TransferInitiated { .. }) ))); // check fired XCM ExportMessage to bridge-hub @@ -854,7 +854,7 @@ pub(crate) mod tests { // should fail - just root is allowed assert_noop!( - BridgeAssetsTransfer::add_bridge_config( + BridgeTransfer::add_bridge_config( RuntimeOrigin::signed(account(1)), bridged_network, bridged_config.clone(), @@ -864,7 +864,7 @@ pub(crate) mod tests { // should fail - cannot bridged_network should match allowed_target_location assert_noop!( - BridgeAssetsTransfer::add_bridge_config(RuntimeOrigin::root(), bridged_network, { + BridgeTransfer::add_bridge_config(RuntimeOrigin::root(), bridged_network, { let remote_network = Westend; assert_ne!(bridged_network, remote_network); Box::new(test_bridge_config().1) @@ -877,7 +877,7 @@ pub(crate) mod tests { ); assert_eq!(Bridges::::iter().count(), 0); assert_eq!( - BridgeAssetsTransfer::exporter_for( + BridgeTransfer::exporter_for( &bridged_network, &dummy_remote_interior_multilocation, &dummy_xcm @@ -886,7 +886,7 @@ pub(crate) mod tests { ); // add with root - assert_ok!(BridgeAssetsTransfer::add_bridge_config( + assert_ok!(BridgeTransfer::add_bridge_config( RuntimeOrigin::root(), bridged_network, bridged_config.clone(), @@ -898,7 +898,7 @@ pub(crate) mod tests { ); assert_eq!(Bridges::::get(Wococo), None); assert_eq!( - BridgeAssetsTransfer::exporter_for( + BridgeTransfer::exporter_for( &bridged_network, &dummy_remote_interior_multilocation, &dummy_xcm @@ -906,7 +906,7 @@ pub(crate) mod tests { Some((*bridged_config.clone()).into()) ); assert_eq!( - BridgeAssetsTransfer::exporter_for( + BridgeTransfer::exporter_for( &Wococo, &dummy_remote_interior_multilocation, &dummy_xcm @@ -916,7 +916,7 @@ pub(crate) mod tests { // update fee // remove - assert_ok!(BridgeAssetsTransfer::update_bridge_config( + assert_ok!(BridgeTransfer::update_bridge_config( RuntimeOrigin::root(), bridged_network, Some((Parent, 200u128).into()), @@ -931,7 +931,7 @@ pub(crate) mod tests { }) ); assert_eq!( - BridgeAssetsTransfer::exporter_for( + BridgeTransfer::exporter_for( &bridged_network, &dummy_remote_interior_multilocation, &dummy_xcm @@ -940,7 +940,7 @@ pub(crate) mod tests { ); // remove - assert_ok!(BridgeAssetsTransfer::remove_bridge_config( + assert_ok!(BridgeTransfer::remove_bridge_config( RuntimeOrigin::root(), bridged_network, )); diff --git a/parachains/pallets/bridge-assets-transfer/src/weights.rs b/parachains/pallets/bridge-transfer/src/weights.rs similarity index 100% rename from parachains/pallets/bridge-assets-transfer/src/weights.rs rename to parachains/pallets/bridge-transfer/src/weights.rs diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index efeb0b57112..8a63a3a15d4 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -71,7 +71,7 @@ pallet-collator-selection = { path = "../../../../pallets/collator-selection", d parachain-info = { path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } -pallet-bridge-assets-transfer = { path = "../../../../parachains/pallets/bridge-assets-transfer", default-features = false } +pallet-bridge-transfer = { path = "../../../pallets/bridge-transfer", default-features = false } [dev-dependencies] asset-test-utils = { path = "../test-utils"} @@ -112,7 +112,7 @@ runtime-benchmarks = [ "pallet-xcm-benchmarks/runtime-benchmarks", "pallet-state-trie-migration/runtime-benchmarks", "assets-common/runtime-benchmarks", - "pallet-bridge-assets-transfer/runtime-benchmarks", + "pallet-bridge-transfer/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", @@ -139,7 +139,7 @@ try-runtime = [ "pallet-xcm/try-runtime", "parachain-info/try-runtime", "pallet-state-trie-migration/try-runtime", - "pallet-bridge-assets-transfer/try-runtime", + "pallet-bridge-transfer/try-runtime", ] std = [ "codec/std", @@ -194,5 +194,5 @@ std = [ "parachain-info/std", "parachains-common/std", "assets-common/std", - "pallet-bridge-assets-transfer/std", + "pallet-bridge-transfer/std", ] diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index a6903c661a1..9c1ec78506c 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -641,16 +641,16 @@ impl pallet_uniques::Config for Runtime { type Locker = (); } -impl pallet_bridge_assets_transfer::Config for Runtime { +impl pallet_bridge_transfer::Config for Runtime { type RuntimeEvent = RuntimeEvent; type BridgeXcmSender = BridgeXcmSender; type UniversalLocation = UniversalLocation; - type WeightInfo = weights::pallet_bridge_assets_transfer::WeightInfo; + type WeightInfo = weights::pallet_bridge_transfer::WeightInfo; type AssetTransactor = AssetTransactors; type AdminOrigin = AssetsForceOrigin; - type TransferOrigin = EnsureXcmOrigin; + type TransferAssetOrigin = EnsureXcmOrigin; #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = xcm_config::BridgeAssetsTransferBenchmarksHelper; + type BenchmarkHelper = xcm_config::BridgeTransferBenchmarksHelper; } // Create the runtime by composing the FRAME pallets that were previously configured. @@ -697,7 +697,7 @@ construct_runtime!( Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, // Reserving 52 for pallet_nfts ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, - BridgeAssetsTransfer: pallet_bridge_assets_transfer::{Pallet, Call, Storage, Event} = 54, + BridgeTransfer: pallet_bridge_transfer::{Pallet, Call, Storage, Event} = 54, #[cfg(feature = "state-trie-version-1")] StateTrieMigration: pallet_state_trie_migration = 70, @@ -765,7 +765,7 @@ mod benches { // NOTE: Make sure you point to the individual modules below. [pallet_xcm_benchmarks::fungible, XcmBalances] [pallet_xcm_benchmarks::generic, XcmGeneric] - [pallet_bridge_assets_transfer, BridgeAssetsTransfer] + [pallet_bridge_transfer, BridgeTransfer] ); } diff --git a/parachains/runtimes/assets/statemine/src/weights/mod.rs b/parachains/runtimes/assets/statemine/src/weights/mod.rs index 46d1115ded1..2d472b60176 100644 --- a/parachains/runtimes/assets/statemine/src/weights/mod.rs +++ b/parachains/runtimes/assets/statemine/src/weights/mod.rs @@ -4,7 +4,7 @@ pub mod extrinsic_weights; pub mod frame_system; pub mod pallet_assets; pub mod pallet_balances; -pub mod pallet_bridge_assets_transfer; +pub mod pallet_bridge_transfer; pub mod pallet_collator_selection; pub mod pallet_multisig; pub mod pallet_proxy; diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_assets_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs similarity index 98% rename from parachains/runtimes/assets/statemine/src/weights/pallet_bridge_assets_transfer.rs rename to parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs index d4e921fcbf1..2efe28f794b 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_assets_transfer.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -47,7 +47,7 @@ use sp_std::marker::PhantomData; /// Weight functions for `pallet_bridge_assets_transfer`. pub struct WeightInfo(PhantomData); -impl pallet_bridge_assets_transfer::WeightInfo for WeightInfo { +impl pallet_bridge_transfer::WeightInfo for WeightInfo { /// Storage: ParachainInfo ParachainId (r:1 w:0) /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: BridgeAssetsTransfer Bridges (r:1 w:0) diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 7474dcc8b65..cca5bccde0a 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -14,7 +14,7 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, BridgeAssetsTransfer, + AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, BridgeTransfer, ForeignAssets, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; @@ -215,7 +215,7 @@ impl Contains for SafeCallFilter { RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | - RuntimeCall::BridgeAssetsTransfer(..) | + RuntimeCall::BridgeTransfer(..) | RuntimeCall::Assets( pallet_assets::Call::create { .. } | pallet_assets::Call::force_create { .. } | @@ -462,14 +462,14 @@ impl BenchmarkHelper for XcmBenchmarkHelper { } /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus -pub type BridgeXcmSender = UnpaidRemoteExporter; +pub type BridgeXcmSender = UnpaidRemoteExporter; -/// Benchmarks helper for over-bridge assets transfer pallet. +/// Benchmarks helper for over-bridge transfer pallet. #[cfg(feature = "runtime-benchmarks")] -pub struct BridgeAssetsTransferBenchmarksHelper; +pub struct BridgeTransferBenchmarksHelper; #[cfg(feature = "runtime-benchmarks")] -impl BridgeAssetsTransferBenchmarksHelper { +impl BridgeTransferBenchmarksHelper { /// Asset that we're transferring and paying fees in. fn make_asset(fungible: u128) -> MultiAsset { MultiAsset { fun: Fungible(fungible.into()), id: Concrete(KsmLocation::get()) } @@ -487,13 +487,11 @@ impl BridgeAssetsTransferBenchmarksHelper { } #[cfg(feature = "runtime-benchmarks")] -impl pallet_bridge_assets_transfer::BenchmarkHelper - for BridgeAssetsTransferBenchmarksHelper -{ - fn bridge_config() -> (NetworkId, pallet_bridge_assets_transfer::BridgeConfig) { +impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBenchmarksHelper { + fn bridge_config() -> (NetworkId, pallet_bridge_transfer::BridgeConfig) { ( Polkadot, - pallet_bridge_assets_transfer::BridgeConfig { + pallet_bridge_transfer::BridgeConfig { bridge_location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), allowed_target_location: Self::allowed_target_location(), // TODO: right now `UnpaidRemoteExporter` is used to send XCM messages and it requires diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index 5184cf361e6..940d052affd 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -6,7 +6,7 @@ use frame_support::{ traits::fungibles::InspectEnumerable, weights::{Weight, WeightToFee as WeightToFeeT}, }; -use pallet_bridge_assets_transfer::BridgeConfig; +use pallet_bridge_transfer::BridgeConfig; use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; use statemine_runtime::xcm_config::{ AssetFeeAsExistentialDepositMultiplierFeeCharger, KsmLocation, TrustBackedAssetsPalletLocation, @@ -446,12 +446,12 @@ fn can_governance_call_xcm_transact_with_bridge_assets_transfer_configuration() }; // check cfg before - let cfg = pallet_bridge_assets_transfer::Pallet::::bridges(&bridged_network); + let cfg = pallet_bridge_transfer::Pallet::::bridges(&bridged_network); assert!(cfg.is_none()); // prepare xcm as governance will do - let add_bridge_config: RuntimeCall = RuntimeCall::BridgeAssetsTransfer( - pallet_bridge_assets_transfer::Call::::add_bridge_config { + let add_bridge_config: RuntimeCall = RuntimeCall::BridgeTransfer( + pallet_bridge_transfer::Call::::add_bridge_config { bridged_network, bridge_config: Box::new(bridge_config.clone()), }, @@ -477,7 +477,7 @@ fn can_governance_call_xcm_transact_with_bridge_assets_transfer_configuration() assert_eq!(outcome.ensure_complete(), Ok(())); // check cfg after - let cfg = pallet_bridge_assets_transfer::Pallet::::bridges(&bridged_network); + let cfg = pallet_bridge_transfer::Pallet::::bridges(&bridged_network); assert_eq!(cfg, Some(bridge_config)); }) } From 32a09c7050f589e368d8fd708c2ecb8eeafd56cd Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 17 Mar 2023 15:25:23 +0100 Subject: [PATCH 050/339] from_ref_time to from_parts --- .../runtimes/assets/statemine/src/weights/xcm/mod.rs | 2 +- parachains/runtimes/assets/westmint/tests/tests.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs index e5ec1585d55..6e0dcea6458 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs @@ -220,7 +220,7 @@ impl XcmWeightInfo for StatemineXcmWeight { fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { // TODO:check-parameter - remove this from here, we wont use export_message // TODO:check-parameter - new pallet_xcm.send requires to set this up - check how to set properly - Weight::from_ref_time(100_000_000 as u64) + Weight::from_parts(100_000_000 as u64, 0) } fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { Weight::MAX diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 8ce0753fee7..7e74574152a 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -641,7 +641,7 @@ fn test_receive_bridged_xcm_trap_works() { Trap(1234), ]); let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let weight_limit = Weight::from_ref_time(41666666666); + let weight_limit = Weight::from_parts(41666666666, 0); let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); assert_eq!(outcome.ensure_complete(), Err(xcm::latest::Error::Trap(1234))); @@ -684,12 +684,12 @@ fn test_receive_bridged_xcm_transact_with_remark_with_event_works() { )), Transact { origin_kind: OriginKind::SovereignAccount, - require_weight_at_most: Weight::from_ref_time(1000000000), + require_weight_at_most: Weight::from_parts(1000000000, 0), call: remark_with_event.encode().into(), }, ]); let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let weight_limit = Weight::from_ref_time(41666666666); + let weight_limit = Weight::from_parts(41666666666, 0); let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); assert_eq!(outcome.ensure_complete(), Ok(())); @@ -776,7 +776,7 @@ fn test_receive_bridged_xcm_reserve_asset_deposited_works() { ]); let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let weight_limit = Weight::from_ref_time(41666666666); + let weight_limit = Weight::from_parts(41666666666, 0); // execute xcm as XcmpQueue would do let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); From 137ee81984077075d6bcda7bdc92670e6d7f83a2 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Fri, 17 Mar 2023 18:05:35 +0000 Subject: [PATCH 051/339] ".git/.scripts/commands/bench/bench.sh" pallet statemine assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs index 2efe28f794b..df268087df8 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -14,10 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -//! Autogenerated weights for `pallet_bridge_assets_transfer` +//! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -33,7 +33,7 @@ // --wasm-execution=compiled // --heap-pages=4096 // --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json -// --pallet=pallet_bridge_assets_transfer +// --pallet=pallet_bridge_transfer // --chain=statemine-dev // --header=./file_header.txt // --output=./parachains/runtimes/assets/statemine/src/weights/ @@ -45,13 +45,13 @@ use frame_support::{traits::Get, weights::Weight}; use sp_std::marker::PhantomData; -/// Weight functions for `pallet_bridge_assets_transfer`. +/// Weight functions for `pallet_bridge_transfer`. pub struct WeightInfo(PhantomData); impl pallet_bridge_transfer::WeightInfo for WeightInfo { /// Storage: ParachainInfo ParachainId (r:1 w:0) /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeAssetsTransfer Bridges (r:1 w:0) - /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer Bridges (r:1 w:0) + /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) /// Storage: System Account (r:2 w:2) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) @@ -68,43 +68,47 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn transfer_asset_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `542` - // Estimated: `17786` - // Minimum execution time: 99_958 nanoseconds. - Weight::from_parts(101_321_000, 17786) + // Measured: `439` + // Estimated: `25088` + // Minimum execution time: 107_950_000 picoseconds. + Weight::from_parts(108_924_000, 0) + .saturating_add(Weight::from_parts(0, 25088)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(5)) } - /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) - /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer Bridges (r:1 w:1) + /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) fn add_bridge_config() -> Weight { // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `4374` - // Minimum execution time: 13_133 nanoseconds. - Weight::from_parts(13_473_000, 4374) + // Measured: `109` + // Estimated: `5364` + // Minimum execution time: 14_719_000 picoseconds. + Weight::from_parts(15_157_000, 0) + .saturating_add(Weight::from_parts(0, 5364)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) - /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer Bridges (r:1 w:1) + /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) fn remove_bridge_config() -> Weight { // Proof Size summary in bytes: - // Measured: `131` - // Estimated: `4374` - // Minimum execution time: 12_449 nanoseconds. - Weight::from_parts(12_798_000, 4374) + // Measured: `164` + // Estimated: `5364` + // Minimum execution time: 14_425_000 picoseconds. + Weight::from_parts(14_734_000, 0) + .saturating_add(Weight::from_parts(0, 5364)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: BridgeAssetsTransfer Bridges (r:1 w:1) - /// Proof: BridgeAssetsTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer Bridges (r:1 w:1) + /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) fn update_bridge_config() -> Weight { // Proof Size summary in bytes: - // Measured: `131` - // Estimated: `4374` - // Minimum execution time: 21_405 nanoseconds. - Weight::from_parts(21_653_000, 4374) + // Measured: `164` + // Estimated: `5364` + // Minimum execution time: 16_795_000 picoseconds. + Weight::from_parts(17_036_000, 0) + .saturating_add(Weight::from_parts(0, 5364)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } From 36751ae0ab024d882cb524fa15d17adcfacdd6a9 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Sun, 19 Mar 2023 22:53:12 +0100 Subject: [PATCH 052/339] Added `ping_via_bridge` --- Cargo.lock | 1 + parachains/pallets/bridge-transfer/Cargo.toml | 9 +- .../bridge-transfer/src/benchmarking.rs | 31 ++- parachains/pallets/bridge-transfer/src/lib.rs | 237 ++++++++++++++---- .../pallets/bridge-transfer/src/weights.rs | 7 + .../runtimes/assets/statemine/src/lib.rs | 2 + .../src/weights/pallet_bridge_transfer.rs | 40 ++- .../assets/statemine/src/xcm_config.rs | 20 +- 8 files changed, 288 insertions(+), 59 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f58cd55270d..674388b05b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6155,6 +6155,7 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "frame-system-benchmarking", "log", "pallet-balances", "parity-scale-codec", diff --git a/parachains/pallets/bridge-transfer/Cargo.toml b/parachains/pallets/bridge-transfer/Cargo.toml index 0198d63fa5c..505949daa50 100644 --- a/parachains/pallets/bridge-transfer/Cargo.toml +++ b/parachains/pallets/bridge-transfer/Cargo.toml @@ -17,7 +17,8 @@ log = { version = "0.4.14", default-features = false } # Substrate sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-benchmarking = { default-features = false, optional = true, git = "https://github.com/paritytech/substrate", branch = "master" } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } +frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -36,6 +37,7 @@ cumulus-pallet-xcmp-queue = { path = "../../../pallets/xcmp-queue" } default = ["std"] std = [ "codec/std", + "log/std", "scale-info/std", "sp-std/std", "sp-runtime/std", @@ -46,8 +48,11 @@ std = [ "xcm-executor/std", ] runtime-benchmarks = [ - "frame-benchmarking", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", "frame-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index d0cd12c8be5..db971b09f6b 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -17,10 +17,10 @@ //! `BridgeTransfer` pallet benchmarks. -use crate::{BenchmarkHelper, Bridges, Call, Config, Event, Pallet}; +use crate::{BenchmarkHelper, Bridges, Call, Config, Event, Pallet, PingMessageBuilder}; -use frame_benchmarking::{benchmarks, BenchmarkError}; -use frame_support::traits::EnsureOrigin; +use frame_benchmarking::{benchmarks, BenchmarkError, BenchmarkResult}; +use frame_support::{traits::EnsureOrigin, weights::Weight}; use sp_std::prelude::*; benchmarks! { @@ -30,7 +30,7 @@ benchmarks! { // (be sure to use "worst" of assets) // let a in 1 .. 1; let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); - let (origin, assets, destination) = T::BenchmarkHelper::prepare_transfer(1); + let (origin, assets, destination) = T::BenchmarkHelper::prepare_asset_transfer(1); Bridges::::insert(bridged_network, bridge_config); }: _(origin, Box::new(assets), Box::new(destination)) verify { @@ -40,6 +40,29 @@ benchmarks! { assert!(matches!(actual_event, Some(expected_event))); } + ping_via_bridge { + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); + Bridges::::insert(bridged_network, bridge_config); + + let (origin, destination) = T::BenchmarkHelper::prepare_ping(); + + let origin_location = T::TransferPingOrigin::ensure_origin(origin.clone()).map_err(|_| + BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), + )?; + let (_, _, destination_location) = Pallet::::ensure_remote_destination(destination.clone()).map_err(|_| + BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), + )?; + let _ = T::PingMessageBuilder::try_build(&origin_location, &bridged_network, &destination_location).ok_or( + BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), + )?; + }: _(origin, Box::new(destination)) + verify { + // we don't care about message hash here, just check that the transfer has been initiated + let actual_event = frame_system::Pallet::::events().pop().map(|r| r.event); + let expected_event: ::RuntimeEvent = Event::TransferInitiated(Default::default()).into(); + assert!(matches!(actual_event, Some(expected_event))); + } + add_bridge_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 6e774c6b884..c9163318046 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -55,6 +55,31 @@ impl From for (MultiLocation, Option) { } } +/// Trait for constructing ping message. +pub trait PingMessageBuilder { + fn try_build( + local_origin: &MultiLocation, + network: &NetworkId, + remote_destination: &MultiLocation, + ) -> Option>; +} + +impl PingMessageBuilder for () { + fn try_build(_: &MultiLocation, _: &NetworkId, _: &MultiLocation) -> Option> { + None + } +} + +/// Builder creates xcm message just with `Trap` instruction. +pub struct UnpaidTrapMessageBuilder(sp_std::marker::PhantomData); +impl> PingMessageBuilder + for UnpaidTrapMessageBuilder +{ + fn try_build(_: &MultiLocation, _: &NetworkId, _: &MultiLocation) -> Option> { + Some(Xcm(sp_std::vec![Trap(TrapCode::get())])) + } +} + #[frame_support::pallet] pub mod pallet { pub use crate::weights::WeightInfo; @@ -75,8 +100,9 @@ pub mod pallet { /// Returns proper bridge configuration, supported by the runtime. /// /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled - /// to support transfer to this destination **after** we our `prepare_transfer` call. + /// to support transfer to this destination **after** `prepare_asset_transfer` call. fn bridge_config() -> (NetworkId, BridgeConfig); + /// Prepare environment for assets transfer and return transfer origin and assets /// to transfer. After this function is called, we expect `transfer_asset_via_bridge` /// to succeed, so in proper environment, it should: @@ -88,9 +114,22 @@ pub mod pallet { /// - be close to the worst possible scenario - i.e. if some account may need to be created during /// the assets transfer, it should be created. If there are multiple bridges, the "worst possible" /// (in terms of performance) bridge must be selected for the transfer. - fn prepare_transfer( + fn prepare_asset_transfer( assets_count: u32, ) -> (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation); + + /// Prepare environment for ping transfer and return transfer origin and assets + /// to transfer. After this function is called, we expect `ping_via_bridge` + /// to succeed, so in proper environment, it should: + /// + /// - deposit enough funds (fee from `bridge_config()`) to the sender account; + /// + /// - ensure that the `BridgeXcmSender` is properly configured for the transfer; + /// + /// - be close to the worst possible scenario - i.e. if some account may need to be created during + /// it should be created. If there are multiple bridges, the "worst possible" + /// (in terms of performance) bridge must be selected for the transfer. + fn prepare_ping() -> (RuntimeOrigin, VersionedMultiLocation); } #[pallet::config] @@ -116,6 +155,12 @@ pub mod pallet { /// Required origin for asset transfer. If successful, it resolves to `MultiLocation`. type TransferAssetOrigin: EnsureOrigin; + /// Required origin for ping transfer. If successful, it resolves to `MultiLocation`. + type TransferPingOrigin: EnsureOrigin; + + /// Configurable ping message, `None` means no message will be transferred. + type PingMessageBuilder: PingMessageBuilder; + /// Benchmarks helper. #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper: BenchmarkHelper; @@ -135,6 +180,7 @@ pub mod pallet { UnsupportedDestination, BridgeCallError, FailedToReserve, + UnsupportedPing, } #[pallet::event] @@ -177,7 +223,7 @@ pub mod pallet { let origin_location = T::TransferAssetOrigin::ensure_origin(origin)?; // Check remote destination + bridge_config - let (bridge_config, remote_destination) = + let (_, bridge_config, remote_destination) = Self::ensure_remote_destination(*destination)?; // Check reserve account - sovereign account of bridge @@ -241,7 +287,7 @@ pub mod pallet { asset.reanchor(&allowed_target_location, T::UniversalLocation::get(), None); let remote_destination = remote_destination .reanchored(&allowed_target_location, T::UniversalLocation::get()) - .expect("aaa"); + .expect("TODO: handle compenstaion?"); let xcm: Xcm<()> = sp_std::vec![ // TODO:check-parameter - setup fees @@ -253,44 +299,38 @@ pub mod pallet { .into(); // TODO: how to compensate if this call fails? + Self::initiate_bridge_transfer(allowed_target_location, xcm).map_err(Into::into) + } - // call bridge - log::info!( - target: LOG_TARGET, - "[T::BridgeXcmSender] send to bridge, allowed_target_location: {:?}, xcm: {:?}", - allowed_target_location, - xcm, - ); - // TODO: use fn send_msg - which does: validate + deliver - but find out what to do with the fees? - let (ticket, fees) = - T::BridgeXcmSender::validate(&mut Some(allowed_target_location), &mut Some(xcm)) - .map_err(|e| { - log::error!( - target: LOG_TARGET, - "[BridgeXcmSender::validate] SendError occurred, error: {:?}", - e - ); - Self::deposit_event(Event::BridgeCallError(e)); - Error::::BridgeCallError - })?; - log::info!( - target: LOG_TARGET, - "[T::BridgeXcmSender::validate] (TODO: process) fees: {:?}", - fees - ); - // TODO: what to do with fees - we have fees here, pay here or ignore? - let xcm_hash = T::BridgeXcmSender::deliver(ticket).map_err(|e| { - log::error!( - target: LOG_TARGET, - "[BridgeXcmSender::deliver] SendError occurred, error: {:?}", - e - ); - Self::deposit_event(Event::BridgeCallError(e)); - Error::::BridgeCallError - })?; + /// Transfer `ping` via bridge to different global consensus. + /// + /// - can be used for testing purposes that bridge transfer is working and configured for `destination` + /// + /// Parameters: + /// + /// * `destination`: Different consensus location, e.g. Polkadot's Statemint: `2, X2(GlobalConsensus(NetworkId::Polkadot), Parachain(1000))` + #[pallet::call_index(4)] + #[pallet::weight(T::WeightInfo::ping_via_bridge())] + pub fn ping_via_bridge( + origin: OriginFor, + destination: Box, + ) -> DispatchResult { + let origin_location = T::TransferPingOrigin::ensure_origin(origin)?; - Self::deposit_event(Event::TransferInitiated(xcm_hash)); - Ok(()) + // Check remote destination + bridge_config + let (network, bridge_config, remote_destination) = + Self::ensure_remote_destination(*destination)?; + + // Check reserve account - sovereign account of bridge + let allowed_target_location = bridge_config.allowed_target_location; + + // Prepare `ping` message + let xcm: Xcm<()> = + T::PingMessageBuilder::try_build(&origin_location, &network, &remote_destination) + .ok_or(Error::::UnsupportedPing)?; + + // Initiate bridge transfer + Self::initiate_bridge_transfer(allowed_target_location, xcm).map_err(Into::into) } /// Adds new bridge configuration, which allows transfer to this `bridged_network`. @@ -373,7 +413,7 @@ pub mod pallet { /// Returns: correct remote location, where we should be able to bridge pub(crate) fn ensure_remote_destination( remote_destination: VersionedMultiLocation, - ) -> Result<(BridgeConfig, MultiLocation), Error> { + ) -> Result<(NetworkId, BridgeConfig, MultiLocation), Error> { match remote_destination { VersionedMultiLocation::V3(remote_location) => { ensure!( @@ -394,7 +434,7 @@ pub mod pallet { remote_location.starts_with(&bridge_config.allowed_target_location), Error::::UnsupportedDestination ); - Ok((bridge_config, remote_location)) + Ok((remote_network, bridge_config, remote_location)) }, None => return Err(Error::::UnsupportedDestination), } @@ -406,6 +446,49 @@ pub mod pallet { fn get_bridge_for(network: &NetworkId) -> Option { Bridges::::get(network) } + + fn initiate_bridge_transfer( + allowed_target_location: MultiLocation, + xcm: Xcm<()>, + ) -> Result<(), Error> { + // call bridge + log::info!( + target: LOG_TARGET, + "[T::BridgeXcmSender] send to bridge, allowed_target_location: {:?}, xcm: {:?}", + allowed_target_location, + xcm, + ); + // TODO: use fn send_msg - which does: validate + deliver - but find out what to do with the fees? + let (ticket, fees) = + T::BridgeXcmSender::validate(&mut Some(allowed_target_location), &mut Some(xcm)) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "[BridgeXcmSender::validate] SendError occurred, error: {:?}", + e + ); + Self::deposit_event(Event::BridgeCallError(e)); + Error::::BridgeCallError + })?; + log::info!( + target: LOG_TARGET, + "[T::BridgeXcmSender::validate] (TODO: process) fees: {:?}", + fees + ); + // TODO: what to do with fees - we have fees here, pay here or ignore? + let xcm_hash = T::BridgeXcmSender::deliver(ticket).map_err(|e| { + log::error!( + target: LOG_TARGET, + "[BridgeXcmSender::deliver] SendError occurred, error: {:?}", + e + ); + Self::deposit_event(Event::BridgeCallError(e)); + Error::::BridgeCallError + })?; + + Self::deposit_event(Event::TransferInitiated(xcm_hash)); + Ok(()) + } } impl ExporterFor for Pallet { @@ -615,7 +698,7 @@ pub(crate) mod tests { test_bridge_config() } - fn prepare_transfer( + fn prepare_asset_transfer( assets_count: u32, ) -> (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation) { // sender account must have enough funds @@ -640,6 +723,14 @@ pub(crate) mod tests { (RuntimeOrigin::signed(sender_account), assets, destination) } + + fn prepare_ping() { + unimplemented!("Not implemented here - not needed"); + } + } + + parameter_types! { + pub const TrapCode: u64 = 12345; } impl Config for TestRuntime { @@ -650,6 +741,8 @@ pub(crate) mod tests { type AssetTransactor = CurrencyTransactor; type AdminOrigin = EnsureRoot; type TransferAssetOrigin = EnsureXcmOrigin; + type TransferPingOrigin = EnsureXcmOrigin; + type PingMessageBuilder = UnpaidTrapMessageBuilder; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = TestBenchmarkHelper; } @@ -682,10 +775,11 @@ pub(crate) mod tests { fn test_ensure_remote_destination() { new_test_ext().execute_with(|| { // insert bridge config + let bridge_network = Wococo; let bridge_config = test_bridge_config().1; assert_ok!(BridgeTransfer::add_bridge_config( RuntimeOrigin::root(), - Wococo, + bridge_network, Box::new(bridge_config.clone()), )); @@ -734,6 +828,7 @@ pub(crate) mod tests { MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1000))) )), Ok(( + bridge_network, bridge_config, MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1000))) )) @@ -835,6 +930,60 @@ pub(crate) mod tests { }); } + #[test] + fn test_ping_via_bridge_works() { + new_test_ext().execute_with(|| { + // insert bridge config + let bridged_network = Wococo; + assert_ok!(BridgeTransfer::add_bridge_config( + RuntimeOrigin::root(), + bridged_network, + Box::new(test_bridge_config().1), + )); + + // checks before + assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); + + // trigger ping_via_bridge - should trigger new ROUTED_MESSAGE + // destination is account from different consensus + let destination = Box::new(VersionedMultiLocation::V3(MultiLocation::new( + 2, + X3(GlobalConsensus(Wococo), Parachain(1000), consensus_account(Wococo, 2)), + ))); + + // trigger asset transfer + assert_ok!(BridgeTransfer::ping_via_bridge( + RuntimeOrigin::signed(account(1)), + destination, + )); + + // check events + let events = System::events(); + assert!(!events.is_empty()); + + // check TransferInitiated + assert!(System::events().iter().any(|r| matches!( + r.event, + RuntimeEvent::BridgeTransfer(Event::TransferInitiated { .. }) + ))); + + // check fired XCM ExportMessage to bridge-hub + let fired_xcm = + ROUTED_MESSAGE.with(|r| r.take().expect("xcm::ExportMessage should be here")); + + if let Some(ExportMessage { xcm, .. }) = fired_xcm.0.iter().find(|instr| { + matches!( + instr, + ExportMessage { network: Wococo, destination: X1(Parachain(1000)), .. } + ) + }) { + assert!(xcm.0.iter().any(|instr| matches!(instr, Trap(TrapCode::get())))); + } else { + assert!(false, "Does not contains [`ExportMessage`], fired_xcm: {:?}", fired_xcm); + } + }); + } + #[test] fn test_bridge_config_management_works() { let bridged_network = Rococo; diff --git a/parachains/pallets/bridge-transfer/src/weights.rs b/parachains/pallets/bridge-transfer/src/weights.rs index 7fa0de7fc41..34ef6694d40 100644 --- a/parachains/pallets/bridge-transfer/src/weights.rs +++ b/parachains/pallets/bridge-transfer/src/weights.rs @@ -26,6 +26,9 @@ use sp_std::marker::PhantomData; pub trait WeightInfo { /// Weight of the `transfer_asset_via_bridge` call. fn transfer_asset_via_bridge() -> Weight; + /// Weight of the `ping_via_bridge` call. + fn ping_via_bridge() -> Weight; + /// Weight of the `add_bridge_config` call. fn add_bridge_config() -> Weight; /// Weight of the `remove_bridge_config` call. @@ -40,6 +43,10 @@ impl WeightInfo for () { Weight::zero() } + fn ping_via_bridge() -> Weight { + Weight::zero() + } + fn add_bridge_config() -> Weight { Weight::zero() } diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 9c1ec78506c..c1067afd5cd 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -649,6 +649,8 @@ impl pallet_bridge_transfer::Config for Runtime { type AssetTransactor = AssetTransactors; type AdminOrigin = AssetsForceOrigin; type TransferAssetOrigin = EnsureXcmOrigin; + type TransferPingOrigin = EnsureXcmOrigin; + type PingMessageBuilder = pallet_bridge_transfer::UnpaidTrapMessageBuilder>; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = xcm_config::BridgeTransferBenchmarksHelper; } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs index df268087df8..1807342a525 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -19,24 +19,24 @@ //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev //! DATE: 2023-03-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bkontur-ThinkPad-P14s-Gen-2i`, CPU: `11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --steps=50 -// --repeat=20 +// --repeat=2 // --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json -// --pallet=pallet_bridge_transfer -// --chain=statemine-dev +// --json-file=./bench.json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/ +// --chain=statemine-dev +// --pallet=pallet_bridge_transfer +// --output=./parachains/runtimes/assets/statemine/src/weights #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -76,6 +76,32 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(5)) } + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeTransfer Bridges (r:1 w:0) + /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) + fn ping_via_bridge() -> Weight { + // Proof Size summary in bytes: + // Measured: `299` + // Estimated: `18052` + // Minimum execution time: 50_086_000 picoseconds. + Weight::from_parts(66_186_000, 0) + .saturating_add(Weight::from_parts(0, 18052)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } /// Storage: BridgeTransfer Bridges (r:1 w:1) /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) fn add_bridge_config() -> Weight { diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index cca5bccde0a..7f816e0256f 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -502,7 +502,7 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe ) } - fn prepare_transfer( + fn prepare_asset_transfer( assets_count: u32, ) -> (RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation) { use frame_support::traits::Currency; @@ -520,10 +520,26 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe let existential_deposit = crate::ExistentialDeposit::get(); let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); - // finaly - prepare assets and destination + // finally - prepare assets and destination let assets = xcm::VersionedMultiAssets::V3(Self::make_asset(existential_deposit).into()); let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); (RuntimeOrigin::signed(sender_account), assets, destination) } + + fn prepare_ping() -> (RuntimeOrigin, xcm::VersionedMultiLocation) { + // our `BridgeXcmSender` assumes that the HRMP channel is opened between this + // parachain and the sibling bridge-hub parachain + cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( + Self::bridge_hub_para_id().into(), + ); + + // sender account + let sender_account = AccountId::from([42u8; 32]); + + // finally - prepare destination + let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); + + (RuntimeOrigin::signed(sender_account), destination) + } } From b550a8e147093104cbd13f85ab357941a944209a Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Sun, 19 Mar 2023 23:59:51 +0000 Subject: [PATCH 053/339] ".git/.scripts/commands/bench/bench.sh" pallet statemine assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs index 1807342a525..dcc6f0204ed 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -17,26 +17,26 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bkontur-ThinkPad-P14s-Gen-2i`, CPU: `11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet // --steps=50 -// --repeat=2 +// --repeat=20 // --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=./bench.json -// --header=./file_header.txt -// --chain=statemine-dev +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_bridge_transfer -// --output=./parachains/runtimes/assets/statemine/src/weights +// --chain=statemine-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/statemine/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -70,8 +70,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `439` // Estimated: `25088` - // Minimum execution time: 107_950_000 picoseconds. - Weight::from_parts(108_924_000, 0) + // Minimum execution time: 111_964_000 picoseconds. + Weight::from_parts(113_251_000, 0) .saturating_add(Weight::from_parts(0, 25088)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(5)) @@ -96,8 +96,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `299` // Estimated: `18052` - // Minimum execution time: 50_086_000 picoseconds. - Weight::from_parts(66_186_000, 0) + // Minimum execution time: 57_960_000 picoseconds. + Weight::from_parts(58_812_000, 0) .saturating_add(Weight::from_parts(0, 18052)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -108,8 +108,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `109` // Estimated: `5364` - // Minimum execution time: 14_719_000 picoseconds. - Weight::from_parts(15_157_000, 0) + // Minimum execution time: 15_021_000 picoseconds. + Weight::from_parts(15_328_000, 0) .saturating_add(Weight::from_parts(0, 5364)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -120,8 +120,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `164` // Estimated: `5364` - // Minimum execution time: 14_425_000 picoseconds. - Weight::from_parts(14_734_000, 0) + // Minimum execution time: 14_417_000 picoseconds. + Weight::from_parts(14_891_000, 0) .saturating_add(Weight::from_parts(0, 5364)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -132,8 +132,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `164` // Estimated: `5364` - // Minimum execution time: 16_795_000 picoseconds. - Weight::from_parts(17_036_000, 0) + // Minimum execution time: 17_321_000 picoseconds. + Weight::from_parts(17_658_000, 0) .saturating_add(Weight::from_parts(0, 5364)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) From a4e2b93e4ea7946f7b3a5ca7782c415e176541ba Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 20 Mar 2023 10:27:22 +0100 Subject: [PATCH 054/339] Fix test --- parachains/pallets/bridge-transfer/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index c9163318046..599782b243b 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -977,7 +977,7 @@ pub(crate) mod tests { ExportMessage { network: Wococo, destination: X1(Parachain(1000)), .. } ) }) { - assert!(xcm.0.iter().any(|instr| matches!(instr, Trap(TrapCode::get())))); + assert!(xcm.0.iter().any(|instr| instr.eq(&Trap(TrapCode::get())))); } else { assert!(false, "Does not contains [`ExportMessage`], fired_xcm: {:?}", fired_xcm); } From eff26cdca8002c5bf424e63c16b58b2026246965 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 20 Mar 2023 10:29:49 +0100 Subject: [PATCH 055/339] Revert not needed stuff --- .../assets/statemine/src/weights/xcm/mod.rs | 4 +- .../assets/statemine/src/xcm_config.rs | 4 +- .../runtimes/assets/statemine/tests/tests.rs | 62 +----------------- .../assets/westmint/src/xcm_config.rs | 2 - .../runtimes/assets/westmint/tests/tests.rs | 63 ------------------- 5 files changed, 4 insertions(+), 131 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs index 6e0dcea6458..877a54ba848 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs @@ -218,9 +218,7 @@ impl XcmWeightInfo for StatemineXcmWeight { Weight::MAX } fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { - // TODO:check-parameter - remove this from here, we wont use export_message - // TODO:check-parameter - new pallet_xcm.send requires to set this up - check how to set properly - Weight::from_parts(100_000_000 as u64, 0) + Weight::MAX } fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { Weight::MAX diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 7f816e0256f..d62634f909f 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -407,9 +407,7 @@ parameter_types! { impl pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; // We want to disallow users sending (arbitrary) XCMs from this chain. - // TODO:check-parameter - temporary fix - allow send XCM messages from here - // TODO:check-parameter - after xcm-v3 rebase, fix/add/find_out kind of filter to allow sending just to BridgeHub? - type SendXcmOrigin = EnsureXcmOrigin; + type SendXcmOrigin = EnsureXcmOrigin; type XcmRouter = XcmRouter; // We support local origins dispatching XCM executions in principle... type ExecuteXcmOrigin = EnsureXcmOrigin; diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index 940d052affd..3ce47be04f9 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -1,4 +1,4 @@ -use asset_test_utils::{mock_open_hrmp_channel, ExtBuilder, RuntimeHelper}; +use asset_test_utils::{ExtBuilder, RuntimeHelper}; use codec::{Decode, Encode}; use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ @@ -18,7 +18,7 @@ pub use statemine_runtime::{ MetadataDepositBase, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, SessionKeys, System, TrustBackedAssetsInstance, }; -use xcm::{latest::prelude::*, VersionedMultiLocation, VersionedXcm}; +use xcm::latest::prelude::*; use xcm_executor::{ traits::{Convert, Identity, JustTry, WeightTrader}, XcmExecutor, @@ -363,64 +363,6 @@ fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { }); } -#[test] -fn test_send_xcm_transact_with_remark_with_event_works() { - let runtime_para_id = 1015; - let bridge_hub_para_id = 1013; - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .with_tracing() - .with_safe_xcm_version(3) - .with_para_id(runtime_para_id.into()) - .build() - .execute_with(|| { - // open hrmp channel - mock_open_hrmp_channel::( - runtime_para_id.into(), - bridge_hub_para_id.into(), - ); - - // prepare xcm message with Transact - let message = Xcm(vec![ExportMessage { - network: Wococo, - destination: X1(Parachain(1000)), - xcm: Xcm(vec![Transact { - origin_kind: OriginKind::SovereignAccount, - require_weight_at_most: Weight::from_parts(1000000000, 0), - call: vec![0, 8, 20, 104, 101, 108, 108, 111].into(), - }]), - }]); - - // simulate send export_message to bridge-hub - assert_ok!(PolkadotXcm::send( - RuntimeOrigin::signed(AccountId::from(ALICE)), - Box::new(VersionedMultiLocation::V3(MultiLocation { - parents: 1, - interior: X1(Parachain(bridge_hub_para_id)) - })), - Box::new(VersionedXcm::from(message.clone())) - )); - - // check xcm sent-like events occured - let events = System::events(); - assert!(!events.is_empty()); - - assert!(System::events().iter().any(|r| matches!( - r.event, - RuntimeEvent::PolkadotXcm(pallet_xcm::Event::Sent(..)) - ))); - assert!(System::events().iter().any(|r| matches!( - r.event, - RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) - ))); - }); -} - #[test] fn can_governance_call_xcm_transact_with_bridge_assets_transfer_configuration() { ExtBuilder::::default() diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 85885f0e863..6cf71f6ccb2 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -203,8 +203,6 @@ impl Contains for SafeCallFilter { frame_system::Call::set_heap_pages { .. } | frame_system::Call::set_code { .. } | frame_system::Call::set_code_without_checks { .. } | - // TODO:check-parameter - verify, if we need for production (remark_with_event) - frame_system::Call::remark_with_event { .. } | frame_system::Call::kill_prefix { .. }, ) | RuntimeCall::ParachainSystem(..) | diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 7e74574152a..76c80dd5128 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -648,69 +648,6 @@ fn test_receive_bridged_xcm_trap_works() { }); } -#[test] -fn test_receive_bridged_xcm_transact_with_remark_with_event_works() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .with_tracing() - .build() - .execute_with(|| { - let remark_with_event: RuntimeCall = - RuntimeCall::System(frame_system::Call::::remark_with_event { - remark: b"Hello".to_vec(), - }); - - // simulate received message: - // 2022-12-21 14:38:54.047 DEBUG tokio-runtime-worker xcm::execute_xcm: [Parachain] origin: MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, message: Xcm([UniversalOrigin(GlobalConsensus(Rococo)), DescendOrigin(X1(AccountId32 { network: Some(Rococo), id: [28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11, 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124] })), Transact { origin_kind: SovereignAccount, require_weight_at_most: 1000000000, call: [0, 8, 20, 104, 101, 108, 108, 111] }]), weight_limit: 41666666666 - // origin as local BridgeHub (Wococo) - let origin = MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; - let xcm = Xcm(vec![ - UniversalOrigin(GlobalConsensus(Rococo)), - DescendOrigin(X2( - Parachain(1000), - AccountId32 { - network: Some(Rococo), - id: [ - 28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, - 11, 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, - 124, - ], - }, - )), - Transact { - origin_kind: OriginKind::SovereignAccount, - require_weight_at_most: Weight::from_parts(1000000000, 0), - call: remark_with_event.encode().into(), - }, - ]); - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let weight_limit = Weight::from_parts(41666666666, 0); - - let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); - assert_eq!(outcome.ensure_complete(), Ok(())); - - // check Event::Remarked occured - let events = System::events(); - assert!(!events.is_empty()); - - let expected_event = { - use sp_runtime::traits::Hash; - use xcm_executor::traits::Convert; - RuntimeEvent::System(frame_system::Event::Remarked { - hash: ::Hashing::hash(b"Hello"), - // origin should match here according to [`BridgedSignedAccountId32AsNative`] - sender: LocationToAccountId::convert(origin).unwrap(), - }) - }; - assert!(System::events().iter().any(|r| r.event == expected_event)); - }); -} - #[test] fn test_receive_bridged_xcm_reserve_asset_deposited_works() { ExtBuilder::::default() From 65fe38b7e732654ec95763411cfcf18a7923f8d5 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 20 Mar 2023 12:53:16 +0100 Subject: [PATCH 056/339] Added test-case `can_governance_change_bridge_transfer_configuration` --- Cargo.lock | 1 + parachains/pallets/bridge-transfer/src/lib.rs | 20 ++- .../runtimes/assets/statemine/tests/tests.rs | 84 +++------- .../runtimes/assets/test-utils/Cargo.toml | 2 + .../assets/test-utils/src/test_cases.rs | 149 +++++++++++++++++- 5 files changed, 188 insertions(+), 68 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6f012940c96..b4c2308a383 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -337,6 +337,7 @@ dependencies = [ "hex-literal", "pallet-assets", "pallet-balances", + "pallet-bridge-transfer", "pallet-collator-selection", "pallet-session", "pallet-xcm", diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 599782b243b..819021cd623 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -357,6 +357,11 @@ pub mod pallet { bridged_network == allowed_target_location_network, Error::::InvalidConfiguration ); + // bridged consensus must be different + let local_network = T::UniversalLocation::get() + .global_consensus() + .map_err(|_| Error::::InvalidConfiguration)?; + ensure!(bridged_network != local_network, Error::::InvalidConfiguration); Bridges::::insert(bridged_network, bridge_config); Self::deposit_event(Event::BridgeAdded); @@ -1011,7 +1016,7 @@ pub(crate) mod tests { DispatchError::BadOrigin ); - // should fail - cannot bridged_network should match allowed_target_location + // should fail - bridged_network should match allowed_target_location assert_noop!( BridgeTransfer::add_bridge_config(RuntimeOrigin::root(), bridged_network, { let remote_network = Westend; @@ -1024,6 +1029,19 @@ pub(crate) mod tests { message: Some("InvalidConfiguration") }) ); + // should fail - bridged_network must be different global consensus than our `UniversalLocation` + assert_noop!( + BridgeTransfer::add_bridge_config( + RuntimeOrigin::root(), + UniversalLocation::get().global_consensus().expect("any `NetworkId`"), + bridged_config.clone() + ), + DispatchError::Module(ModuleError { + index: 52, + error: [0, 0, 0, 0], + message: Some("InvalidConfiguration") + }) + ); assert_eq!(Bridges::::iter().count(), 0); assert_eq!( BridgeTransfer::exporter_for( diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index 3ce47be04f9..62dbe103f57 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -6,7 +6,6 @@ use frame_support::{ traits::fungibles::InspectEnumerable, weights::{Weight, WeightToFee as WeightToFeeT}, }; -use pallet_bridge_transfer::BridgeConfig; use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; use statemine_runtime::xcm_config::{ AssetFeeAsExistentialDepositMultiplierFeeCharger, KsmLocation, TrustBackedAssetsPalletLocation, @@ -19,10 +18,7 @@ pub use statemine_runtime::{ RuntimeOrigin, SessionKeys, System, TrustBackedAssetsInstance, }; use xcm::latest::prelude::*; -use xcm_executor::{ - traits::{Convert, Identity, JustTry, WeightTrader}, - XcmExecutor, -}; +use xcm_executor::traits::{Convert, Identity, JustTry, WeightTrader}; const ALICE: [u8; 32] = [1u8; 32]; const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; @@ -363,67 +359,6 @@ fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { }); } -#[test] -fn can_governance_call_xcm_transact_with_bridge_assets_transfer_configuration() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .with_tracing() - .with_safe_xcm_version(3) - .build() - .execute_with(|| { - // bridge cfg data - let bridged_network = NetworkId::Polkadot; - let bridge_config = BridgeConfig { - bridge_location: (Parent, Parachain(1013)).into(), - allowed_target_location: MultiLocation::new( - 2, - X2(GlobalConsensus(bridged_network), Parachain(1000)), - ), - fee: None, - }; - - // check cfg before - let cfg = pallet_bridge_transfer::Pallet::::bridges(&bridged_network); - assert!(cfg.is_none()); - - // prepare xcm as governance will do - let add_bridge_config: RuntimeCall = RuntimeCall::BridgeTransfer( - pallet_bridge_transfer::Call::::add_bridge_config { - bridged_network, - bridge_config: Box::new(bridge_config.clone()), - }, - ); - - // add bridge config call - let xcm = Xcm(vec![ - UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - Transact { - origin_kind: OriginKind::Superuser, - require_weight_at_most: Weight::from_parts(2000000000, 2000000000), - call: add_bridge_config.encode().into(), - }, - ]); - - // origin as relay chain - let origin = MultiLocation { parents: 1, interior: Here }; - - // initialize bridge through governance-like - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let weight_limit = Weight::from_parts(5000000000, 5000000000); - let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); - assert_eq!(outcome.ensure_complete(), Ok(())); - - // check cfg after - let cfg = pallet_bridge_transfer::Pallet::::bridges(&bridged_network); - assert_eq!(cfg, Some(bridge_config)); - }) -} - #[test] fn test_assets_balances_api_works() { use assets_common::runtime_api::runtime_decl_for_fungibles_api::FungiblesApi; @@ -646,3 +581,20 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p assert_eq!(ForeignAssets::asset_ids().collect::>().len(), 1); }) ); + +asset_test_utils::include_can_governance_change_bridge_transfer_configuration!( + Runtime, + XcmConfig, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }) +); diff --git a/parachains/runtimes/assets/test-utils/Cargo.toml b/parachains/runtimes/assets/test-utils/Cargo.toml index 3213bc22aa9..ea1ffc868d2 100644 --- a/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/parachains/runtimes/assets/test-utils/Cargo.toml @@ -29,6 +29,7 @@ cumulus-primitives-core = { path = "../../../../primitives/core", default-featur cumulus-primitives-parachain-inherent = { path = "../../../../primitives/parachain-inherent", default-features = false } cumulus-test-relay-sproof-builder = { path = "../../../../test/relay-sproof-builder", default-features = false } parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } +pallet-bridge-transfer = { path = "../../../pallets/bridge-transfer", default-features = false } # Polkadot xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } @@ -67,4 +68,5 @@ std = [ "sp-std/std", "xcm/std", "xcm-executor/std", + "pallet-bridge-transfer/std", ] diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 656d5d2e542..f400a972bc0 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -444,7 +444,7 @@ macro_rules! include_asset_transactor_transfer_with_local_consensus_currency_wor } ); -///Test-case makes sure that `Runtime`'s `xcm::AssetTransactor` can handle native relay chain currency +/// Test-case makes sure that `Runtime`'s `xcm::AssetTransactor` can handle native relay chain currency pub fn asset_transactor_transfer_with_pallet_assets_instance_works< Runtime, XcmConfig, @@ -704,6 +704,7 @@ macro_rules! include_asset_transactor_transfer_with_pallet_assets_instance_works } ); +/// Test-case makes sure that `Runtime`'s can create and manage `ForeignAssets` pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works< Runtime, XcmConfig, @@ -1024,3 +1025,149 @@ macro_rules! include_create_and_manage_foreign_assets_for_local_consensus_parach } } ); + +/// Test-case makes sure that `Runtime` can manage `bridge_transfer` configuration by governance +pub fn can_governance_change_bridge_transfer_configuration( + collator_session_keys: CollatorSessionKeys, + runtime_call_encode: Box) -> Vec>, + unwrap_pallet_bridge_transfer_event: Box< + dyn Fn(Vec) -> Option>, + >, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + pallet_bridge_transfer::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + XcmConfig: xcm_executor::Config, +{ + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_tracing() + .with_safe_xcm_version(3) + .build() + .execute_with(|| { + // bridge cfg data + let bridged_network = NetworkId::ByGenesis([9; 32]); + let bridge_config = pallet_bridge_transfer::BridgeConfig { + bridge_location: (Parent, Parachain(1013)).into(), + allowed_target_location: MultiLocation::new( + 2, + X2(GlobalConsensus(bridged_network), Parachain(1000)), + ), + fee: None, + }; + + // helper to execute BridgeTransfer call + let execute_as_governance = |call| -> Outcome { + // prepare xcm as governance will do + let xcm = Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + Transact { + origin_kind: OriginKind::Superuser, + require_weight_at_most: Weight::from_parts(150_000_000, 6000), + call: runtime_call_encode(call).into(), + }, + ]); + + // origin as relay chain + let origin = MultiLocation { parents: 1, interior: Here }; + + // initialize bridge through governance-like + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + XcmExecutor::::execute_xcm( + origin, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Parent), + ) + }; + + // check no cfg + assert!(pallet_bridge_transfer::Pallet::::bridges(&bridged_network).is_none()); + + // governance can add bridge config + assert_ok!(execute_as_governance( + pallet_bridge_transfer::Call::::add_bridge_config { + bridged_network, + bridge_config: Box::new(bridge_config.clone()), + }, + ) + .ensure_complete()); + assert!(>::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) + .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeAdded))); + { + let cfg = pallet_bridge_transfer::Pallet::::bridges(&bridged_network); + assert!(cfg.is_some()); + let cfg = cfg.unwrap(); + assert_eq!(cfg.bridge_location, bridge_config.bridge_location); + assert_eq!(cfg.allowed_target_location, bridge_config.allowed_target_location); + assert_eq!(cfg.fee, None); + } + + // governance can update bridge config + let new_fee: MultiAsset = (Concrete(MultiLocation::parent()), 1_000).into(); + assert_ok!(execute_as_governance( + pallet_bridge_transfer::Call::::update_bridge_config { + bridged_network, + fee: Some(new_fee.clone()), + }, + ) + .ensure_complete()); + assert!(>::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) + .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeUpdated))); + { + let cfg = pallet_bridge_transfer::Pallet::::bridges(&bridged_network); + assert!(cfg.is_some()); + let cfg = cfg.unwrap(); + assert_eq!(cfg.bridge_location, bridge_config.bridge_location); + assert_eq!(cfg.allowed_target_location, bridge_config.allowed_target_location); + assert_eq!(cfg.fee, Some(new_fee)); + } + + // governance can remove bridge config + assert_ok!(execute_as_governance( + pallet_bridge_transfer::Call::::remove_bridge_config { bridged_network }, + ) + .ensure_complete()); + assert!(pallet_bridge_transfer::Pallet::::bridges(&bridged_network).is_none()); + assert!(>::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) + .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeRemoved))); + }) +} + +#[macro_export] +macro_rules! include_can_governance_change_bridge_transfer_configuration( + ( + $runtime:path, + $xcm_config:path, + $collator_session_key:expr, + $runtime_call_encode:expr, + $unwrap_pallet_assets_event:expr + ) => { + #[test] + fn can_governance_change_bridge_transfer_configuration() { + asset_test_utils::test_cases::can_governance_change_bridge_transfer_configuration::< + $runtime, + $xcm_config, + >( + $collator_session_key, + $runtime_call_encode, + $unwrap_pallet_assets_event, + ) + } + } +); From bc5a3ed5586af3c1f7c6c83d9cda6fe3141ff0eb Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 21 Mar 2023 14:10:18 +0100 Subject: [PATCH 057/339] Added test `initiate_transfer_asset_via_bridge_for_native_asset_works` --- Cargo.lock | 1 + parachains/pallets/bridge-transfer/src/lib.rs | 19 +- .../runtimes/assets/statemine/tests/tests.rs | 30 +- .../runtimes/assets/test-utils/Cargo.toml | 2 + .../runtimes/assets/test-utils/src/lib.rs | 33 +- .../assets/test-utils/src/test_cases.rs | 293 +++++++++++++++++- 6 files changed, 356 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b4c2308a383..2602131c14f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -329,6 +329,7 @@ version = "1.0.0" dependencies = [ "assets-common", "cumulus-pallet-parachain-system", + "cumulus-pallet-xcmp-queue", "cumulus-primitives-core", "cumulus-primitives-parachain-inherent", "cumulus-test-relay-sproof-builder", diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 819021cd623..a16571bb098 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -279,18 +279,17 @@ pub mod pallet { Error::::FailedToReserve })?; - // TODO: asset.clone for compensation + add test for compensation + // TODO:check-parameter - asset.clone for compensation or transactional + add test for compensation? - // prepare ReserveAssetDeposited msg to bridge to the other side - reanchor stuff - // We need to convert local asset's id/MultiLocation to format, that could be understood by different consensus and from their point-of-view - // assets.prepend_location(&T::UniversalLocation::get().into_location()); + // Prepare `ReserveAssetDeposited` msg to bridge to the other side. + // Reanchor stuff: we need to convert local asset id/MultiLocation to format, that could be understood by different consensus and from their point-of-view asset.reanchor(&allowed_target_location, T::UniversalLocation::get(), None); let remote_destination = remote_destination .reanchored(&allowed_target_location, T::UniversalLocation::get()) - .expect("TODO: handle compenstaion?"); + .expect("// TODO:check-parameter - handle compenstaion?"); let xcm: Xcm<()> = sp_std::vec![ - // TODO:check-parameter - setup fees + // TODO:check-parameter - setup fees - check teleporter for ForeignAssets - customizable AccountOf for BuyExecution + converters UnpaidExecution { weight_limit: Unlimited, check_origin: None }, ReserveAssetDeposited(asset.into()), ClearOrigin, @@ -298,7 +297,7 @@ pub mod pallet { ] .into(); - // TODO: how to compensate if this call fails? + // TODO:check-parameter how to compensate if this call fails? return back deposisted assets? Self::initiate_bridge_transfer(allowed_target_location, xcm).map_err(Into::into) } @@ -870,7 +869,7 @@ pub(crate) mod tests { assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); assert_eq!(Balances::free_balance(&user_account), user_account_init_balance); let bridge_location_as_sovereign_account = - SiblingParachainConvertsVia::::convert_ref(bridge_location) + LocationToAccountId::convert_ref(bridge_location) .expect("converted bridge location as accountId"); assert_eq!(Balances::free_balance(&bridge_location_as_sovereign_account), 0); @@ -879,10 +878,10 @@ pub(crate) mod tests { fun: Fungible(balance_to_transfer.into()), id: Concrete(RelayLocation::get()), }; - let assets = Box::new(VersionedMultiAssets::V3(asset.into())); + let assets = Box::new(VersionedMultiAssets::from(MultiAssets::from(asset))); // destination is account from different consensus - let destination = Box::new(VersionedMultiLocation::V3(MultiLocation::new( + let destination = Box::new(VersionedMultiLocation::from(MultiLocation::new( 2, X3(GlobalConsensus(Wococo), Parachain(1000), consensus_account(Wococo, 2)), ))); diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index 62dbe103f57..1b676dbec5b 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -12,10 +12,10 @@ use statemine_runtime::xcm_config::{ }; pub use statemine_runtime::{ constants::fee::WeightToFee, - xcm_config::{ForeignCreatorsSovereignAccountOf, XcmConfig}, + xcm_config::{ForeignCreatorsSovereignAccountOf, LocationToAccountId, XcmConfig}, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, MetadataDepositBase, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, - RuntimeOrigin, SessionKeys, System, TrustBackedAssetsInstance, + RuntimeOrigin, SessionKeys, System, TrustBackedAssetsInstance, XcmpQueue, }; use xcm::latest::prelude::*; use xcm_executor::traits::{Convert, Identity, JustTry, WeightTrader}; @@ -598,3 +598,29 @@ asset_test_utils::include_can_governance_change_bridge_transfer_configuration!( } }) ); + +asset_test_utils::include_initiate_transfer_asset_via_bridge_for_native_asset_works!( + Runtime, + XcmConfig, + ParachainSystem, + XcmpQueue, + LocationToAccountId, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }) +); diff --git a/parachains/runtimes/assets/test-utils/Cargo.toml b/parachains/runtimes/assets/test-utils/Cargo.toml index ea1ffc868d2..a5932577d01 100644 --- a/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/parachains/runtimes/assets/test-utils/Cargo.toml @@ -22,6 +22,7 @@ sp-core = { git = "https://github.com/paritytech/substrate", default-features = # Cumulus cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } @@ -69,4 +70,5 @@ std = [ "xcm/std", "xcm-executor/std", "pallet-bridge-transfer/std", + "cumulus-pallet-xcmp-queue/std", ] diff --git a/parachains/runtimes/assets/test-utils/src/lib.rs b/parachains/runtimes/assets/test-utils/src/lib.rs index c57de4ea75d..8432384ccea 100644 --- a/parachains/runtimes/assets/test-utils/src/lib.rs +++ b/parachains/runtimes/assets/test-utils/src/lib.rs @@ -1,3 +1,4 @@ +use codec::DecodeLimit; use cumulus_primitives_core::{AbridgedHrmpChannel, ParaId, PersistedValidationData}; use cumulus_primitives_parachain_inherent::ParachainInherentData; use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; @@ -10,13 +11,14 @@ use sp_std::marker::PhantomData; use frame_support::{traits::OriginTrait, weights::Weight}; use parachains_common::AccountId; -use polkadot_parachain::primitives::{HrmpChannelId, RelayChainBlockNumber}; +use polkadot_parachain::primitives::{HrmpChannelId, RelayChainBlockNumber, XcmpMessageFormat}; use sp_consensus_aura::AURA_ENGINE_ID; use sp_core::Encode; use sp_runtime::{Digest, DigestItem}; use xcm::{ latest::{MultiAsset, MultiLocation, XcmContext}, prelude::{Concrete, Fungible, XcmError, XcmVersion}, + VersionedXcm, MAX_XCM_DECODE_DEPTH, }; use xcm_executor::{traits::TransactAsset, Assets}; @@ -215,8 +217,8 @@ pub fn mock_open_hrmp_channel< max_capacity: 10, max_total_size: 10_000_000_u32, max_message_size: 10_000_000_u32, - msg_count: 10, - total_size: 10_000_000_u32, + msg_count: 0, + total_size: 0_u32, mqc_head: None, }, ); @@ -286,6 +288,31 @@ impl RuntimeHelper + RuntimeHelper +{ + pub fn take_xcm(sent_to_para_id: ParaId) -> Option> { + match HrmpChannelSource::take_outbound_messages(10)[..] { + [(para_id, ref mut xcm_message_data)] if para_id.eq(&sent_to_para_id.into()) => { + let mut xcm_message_data = &xcm_message_data[..]; + // decode + let _ = XcmpMessageFormat::decode_with_depth_limit( + MAX_XCM_DECODE_DEPTH, + &mut xcm_message_data, + ) + .expect("valid format"); + VersionedXcm::<()>::decode_with_depth_limit( + MAX_XCM_DECODE_DEPTH, + &mut xcm_message_data, + ) + .map(|x| Some(x)) + .expect("result with xcm") + }, + _ => return None, + } + } +} + pub fn assert_metadata( asset_id: &Assets::AssetId, expected_name: &str, diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index f400a972bc0..2539fa9de22 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -16,13 +16,14 @@ //! Module contains predefined test-case scenarios for `Runtime` with various assets. use crate::{ - assert_metadata, AccountIdOf, BalanceOf, ExtBuilder, RuntimeHelper, SessionKeysOf, - ValidatorIdOf, XcmReceivedFrom, + assert_metadata, mock_open_hrmp_channel, AccountIdOf, BalanceOf, ExtBuilder, RuntimeHelper, + SessionKeysOf, ValidatorIdOf, XcmReceivedFrom, }; use codec::Encode; +use cumulus_primitives_core::XcmpMessageSource; use frame_support::{ assert_noop, assert_ok, - traits::{fungibles::InspectEnumerable, OriginTrait}, + traits::{fungibles::InspectEnumerable, Currency, Get, OriginTrait}, weights::Weight, }; use parachains_common::Balance; @@ -30,7 +31,9 @@ use sp_runtime::{ traits::{StaticLookup, Zero}, DispatchError, }; -use xcm::latest::prelude::*; +use xcm::{ + latest::prelude::*, CreateMatcher, MatchXcm, VersionedMultiAssets, VersionedMultiLocation, +}; use xcm_executor::{traits::Convert, XcmExecutor}; pub struct CollatorSessionKeys< @@ -1055,7 +1058,7 @@ pub fn can_governance_change_bridge_transfer_configuration( .build() .execute_with(|| { // bridge cfg data - let bridged_network = NetworkId::ByGenesis([9; 32]); + let bridged_network = ByGenesis([9; 32]); let bridge_config = pallet_bridge_transfer::BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), allowed_target_location: MultiLocation::new( @@ -1156,7 +1159,7 @@ macro_rules! include_can_governance_change_bridge_transfer_configuration( $xcm_config:path, $collator_session_key:expr, $runtime_call_encode:expr, - $unwrap_pallet_assets_event:expr + $unwrap_pallet_bridge_transfer_event:expr ) => { #[test] fn can_governance_change_bridge_transfer_configuration() { @@ -1166,7 +1169,283 @@ macro_rules! include_can_governance_change_bridge_transfer_configuration( >( $collator_session_key, $runtime_call_encode, - $unwrap_pallet_assets_event, + $unwrap_pallet_bridge_transfer_event, + ) + } + } +); + +/// Test-case makes sure that `Runtime` can initiate transfer of assets via bridge +pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< + Runtime, + XcmConfig, + HrmpChannelOpener, + HrmpChannelSource, + LocationToAccountId, +>( + collator_session_keys: CollatorSessionKeys, + existential_deposit: BalanceOf, + alice_account: AccountIdOf, + unwrap_pallet_bridge_transfer_event: Box< + dyn Fn(Vec) -> Option>, + >, + unwrap_xcmp_queue_event: Box< + dyn Fn(Vec) -> Option>, + >, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + pallet_bridge_transfer::Config + + cumulus_pallet_xcmp_queue::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + ::Balance: From + Into, + XcmConfig: xcm_executor::Config, + LocationToAccountId: Convert>, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + <::Lookup as StaticLookup>::Source: + From<::AccountId>, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + HrmpChannelSource: XcmpMessageSource, +{ + let runtime_para_id = 1000; + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_tracing() + .with_safe_xcm_version(3) + .with_para_id(runtime_para_id.into()) + .build() + .execute_with(|| { + // prepare bridge config + let bridged_network = ByGenesis([6; 32]); + let bridge_hub_para_id = 1013; + let bridge_hub_location = (Parent, Parachain(bridge_hub_para_id)).into(); + let bridge_hub_account = LocationToAccountId::convert_ref(&bridge_hub_location) + .expect("BridgeHub's Sovereign account"); + let target_location_from_different_consensus = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + let bridge_config = pallet_bridge_transfer::BridgeConfig { + bridge_location: bridge_hub_location, + allowed_target_location: target_location_from_different_consensus, + fee: None, + }; + let balance_to_transfer = 1000_u128; + let native_asset = MultiLocation::parent(); + + // open HRMP to bridge hub + mock_open_hrmp_channel::( + runtime_para_id.into(), + bridge_hub_para_id.into(), + ); + + // drip ED to account + let alice_account_init_balance = existential_deposit + balance_to_transfer.into(); + let _ = >::deposit_creating( + &alice_account, + alice_account_init_balance.clone(), + ); + // SA needs to have at least ED, anyway making reserve fails + let _ = >::deposit_creating( + &bridge_hub_account, + existential_deposit, + ); + + // we just check here, that user remains enough balances after withdraw + // and also we check if `balance_to_transfer` is more than `existential_deposit`, + assert!( + (>::free_balance(&alice_account) - + balance_to_transfer.into()) >= + existential_deposit + ); + // SA has just ED + assert_eq!( + >::free_balance(&bridge_hub_account), + existential_deposit + ); + + // insert bridge config + assert_ok!(>::add_bridge_config( + RuntimeHelper::::root_origin(), + bridged_network, + Box::new(bridge_config), + )); + + // local native asset (pallet_balances) + let assets = MultiAssets::from(MultiAsset { + fun: Fungible(balance_to_transfer.into()), + id: Concrete(native_asset), + }); + + // destination is (some) account from different consensus + let target_destination_account = target_location_from_different_consensus + .clone() + .appended_with(AccountId32 { + network: Some(bridged_network), + id: sp_runtime::AccountId32::new([3; 32]).into(), + }) + .unwrap(); + + // trigger asset transfer + assert_ok!(>::transfer_asset_via_bridge( + RuntimeHelper::::origin_of(alice_account.clone()), + Box::new(VersionedMultiAssets::from(assets.clone())), + Box::new(VersionedMultiLocation::from(target_destination_account.clone())), + )); + + // check alice account decreased + assert_eq!( + >::free_balance(&alice_account), + alice_account_init_balance - balance_to_transfer.into() + ); + // check reserve account increased + assert_eq!( + >::free_balance(&bridge_hub_account), + existential_deposit + balance_to_transfer.into() + ); + + // check events + let mut bridge_transfer_events = >::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())); + assert!(bridge_transfer_events.any(|r| matches!( + r, + pallet_bridge_transfer::Event::ReserveAssetsDeposited { .. } + ))); + let xcm_hash = bridge_transfer_events.find_map(|e| match e { + pallet_bridge_transfer::Event::TransferInitiated(message_hash) => + Some(message_hash), + _ => None, + }); + assert!(xcm_hash.is_some()); + + let mut xcmp_queue_events = >::events() + .into_iter() + .filter_map(|e| unwrap_xcmp_queue_event(e.event.encode())); + let xcm_hash_sent = xcmp_queue_events.find_map(|e| match e { + cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => message_hash, + _ => None, + }); + assert_eq!(xcm_hash, xcm_hash_sent); + + // read xcm + let xcm_sent = RuntimeHelper::::take_xcm(bridge_hub_para_id.into()); + assert!(xcm_sent.is_some()); + let mut xcm_sent: Xcm<()> = xcm_sent.unwrap().try_into().expect("versioned xcm"); + println!("{:?}", xcm_sent); + + // check sent XCM ExportMessage to bridge-hub + assert!(xcm_sent + .0 + .matcher() + .match_next_inst(|instr| match instr { + // first instruction is ExportMessage (because we have unpaid execution on bridge-hub now) + ExportMessage { network, destination, xcm: inner_xcm } => { + assert_eq!(network, &bridged_network); + let (_, target_location_junctions_without_global_consensus) = + target_location_from_different_consensus + .interior + .clone() + .split_global() + .expect("split works"); + assert_eq!( + destination, + &target_location_junctions_without_global_consensus + ); + + let mut reanchored_assets = assets.clone(); + reanchored_assets + .reanchor( + &target_location_from_different_consensus, + XcmConfig::UniversalLocation::get(), + ) + .expect("reanchored assets"); + let mut reanchored_destination_account = target_destination_account.clone(); + reanchored_destination_account + .reanchor( + &target_location_from_different_consensus, + XcmConfig::UniversalLocation::get(), + ) + .expect("reanchored destination account"); + + // match inner xcm + assert!(inner_xcm + .0 + .matcher() + .match_next_inst(|next_instr| match next_instr { + UnpaidExecution { .. } => Ok(()), + _ => Err(()), + }) + .expect("contains UnpaidExecution") + .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { + ReserveAssetDeposited(ref deposited) + if deposited.eq(&reanchored_assets) => + Ok(()), + _ => Err(()), + }) + .expect("contains ReserveAssetDeposited") + .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { + ClearOrigin => Ok(()), + _ => Err(()), + }) + .expect("contains ClearOrigin") + .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { + DepositAsset { assets: Wild(filter), ref beneficiary } + if filter == &All && + beneficiary.eq(&reanchored_destination_account) => + Ok(()), + _ => Err(()), + }) + .expect("contains DepositAsset") + .assert_remaining_insts(0) + .is_ok()); + Ok(()) + }, + _ => Err(()), + }) + .is_ok()); + }) +} + +#[macro_export] +macro_rules! include_initiate_transfer_asset_via_bridge_for_native_asset_works( + ( + $runtime:path, + $xcm_config:path, + $hrmp_channel_opener:path, + $hrmp_channel_source:path, + $location_to_account_id:path, + $collator_session_key:expr, + $existential_deposit:expr, + $unwrap_pallet_bridge_transfer_event:expr, + $unwrap_xcmp_queue_event:expr + ) => { + #[test] + fn initiate_transfer_asset_via_bridge_for_native_asset_works() { + const ALICE: [u8; 32] = [1u8; 32]; + let alice_account = parachains_common::AccountId::from(ALICE); + + asset_test_utils::test_cases::initiate_transfer_asset_via_bridge_for_native_asset_works::< + $runtime, + $xcm_config, + $hrmp_channel_opener, + $hrmp_channel_source, + $location_to_account_id + >( + $collator_session_key, + $existential_deposit, + alice_account, + $unwrap_pallet_bridge_transfer_event, + $unwrap_xcmp_queue_event ) } } From abe9ad2558b13a83070759354ae269db4a5b4d6c Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 24 Mar 2023 10:39:00 +0100 Subject: [PATCH 058/339] Fix compilation --- parachains/pallets/bridge-transfer/src/lib.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index a16571bb098..8c8f2b4dd7c 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -510,7 +510,7 @@ pub mod pallet { pub(crate) mod tests { use super::*; use crate as bridge_transfer; - use frame_support::traits::Currency; + use frame_support::traits::{ConstU32, Currency}; use frame_support::{ assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, @@ -602,6 +602,10 @@ pub(crate) mod tests { type MaxLocks = (); type MaxReserves = MaxReserves; type ReserveIdentifier = [u8; 8]; + type HoldIdentifier = (); + type FreezeIdentifier = (); + type MaxHolds = ConstU32<0>; + type MaxFreezes = ConstU32<0>; } parameter_types! { From 98c09faddb01b1a5c95b029f274b22e1fd5659bb Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 24 Mar 2023 11:23:24 +0100 Subject: [PATCH 059/339] Small fixes --- parachains/pallets/bridge-transfer/src/lib.rs | 27 +++++++++---------- .../assets/test-utils/src/test_cases.rs | 5 ++-- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 8c8f2b4dd7c..fbbf89ef938 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -49,12 +49,6 @@ pub struct BridgeConfig { pub fee: Option, } -impl From for (MultiLocation, Option) { - fn from(bridge_config: BridgeConfig) -> (MultiLocation, Option) { - (bridge_config.bridge_location, bridge_config.fee) - } -} - /// Trait for constructing ping message. pub trait PingMessageBuilder { fn try_build( @@ -215,6 +209,7 @@ pub mod pallet { /// * `destination`: Different consensus location, where the assets will be deposited, e.g. Polkadot's Statemint: `2, X2(GlobalConsensus(NetworkId::Polkadot), Parachain(1000))` #[pallet::call_index(0)] #[pallet::weight(T::WeightInfo::transfer_asset_via_bridge())] + // TODO:check-parameter - instead of compensations, use #[transactional] + add test pub fn transfer_asset_via_bridge( origin: OriginFor, assets: Box, @@ -286,14 +281,17 @@ pub mod pallet { asset.reanchor(&allowed_target_location, T::UniversalLocation::get(), None); let remote_destination = remote_destination .reanchored(&allowed_target_location, T::UniversalLocation::get()) - .expect("// TODO:check-parameter - handle compenstaion?"); + .expect("// TODO:check-parameter - handle compensation?"); let xcm: Xcm<()> = sp_std::vec![ // TODO:check-parameter - setup fees - check teleporter for ForeignAssets - customizable AccountOf for BuyExecution + converters UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - ReserveAssetDeposited(asset.into()), + ReserveAssetDeposited(asset.clone().into()), ClearOrigin, - DepositAsset { assets: All.into(), beneficiary: remote_destination } + DepositAsset { + assets: MultiAssetFilter::from(MultiAssets::from(asset)), + beneficiary: remote_destination + } ] .into(); @@ -435,6 +433,7 @@ pub mod pallet { match Bridges::::get(remote_network) { Some(bridge_config) => { ensure!( + // TODO:check-parameter - verify and prepare test for ETH scenario - https://github.com/paritytech/cumulus/pull/2013#discussion_r1094909290 remote_location.starts_with(&bridge_config.allowed_target_location), Error::::UnsupportedDestination ); @@ -501,7 +500,8 @@ pub mod pallet { _remote_location: &InteriorMultiLocation, _message: &Xcm<()>, ) -> Option<(MultiLocation, Option)> { - Pallet::::get_bridge_for(network).map(Into::into) + Pallet::::get_bridge_for(network) + .map(|bridge_config| (bridge_config.bridge_location, bridge_config.fee)) } } } @@ -1062,10 +1062,7 @@ pub(crate) mod tests { bridged_config.clone(), )); assert_eq!(Bridges::::iter().count(), 1); - assert_eq!( - Bridges::::get(bridged_network), - Some((*bridged_config.clone()).into()) - ); + assert_eq!(Bridges::::get(bridged_network), Some(*bridged_config.clone())); assert_eq!(Bridges::::get(Wococo), None); assert_eq!( BridgeTransfer::exporter_for( @@ -1073,7 +1070,7 @@ pub(crate) mod tests { &dummy_remote_interior_multilocation, &dummy_xcm ), - Some((*bridged_config.clone()).into()) + Some((bridged_config.bridge_location, bridged_config.fee)) ); assert_eq!( BridgeTransfer::exporter_for( diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 39ae81bcc74..7e1d72f3cd6 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1696,8 +1696,9 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< }) .expect("contains ClearOrigin") .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { - DepositAsset { assets: Wild(filter), ref beneficiary } - if filter == &All && + DepositAsset { assets: filter, ref beneficiary } + if filter == + &MultiAssetFilter::from(reanchored_assets.clone()) && beneficiary.eq(&reanchored_destination_account) => Ok(()), _ => Err(()), From d712d42cf753e4bf7d8efb205f7cda54c0e187fa Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 24 Mar 2023 13:17:55 +0100 Subject: [PATCH 060/339] Added support for paid or unpaid execution by configuration --- parachains/pallets/bridge-transfer/src/lib.rs | 56 +++++++++++++------ .../assets/test-utils/src/test_cases.rs | 35 +++++++++--- 2 files changed, 65 insertions(+), 26 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index fbbf89ef938..0f8c2290d7b 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -39,14 +39,18 @@ pub const LOG_TARGET: &str = "runtime::bridge-assets-transfer"; pub struct BridgeConfig { /// Contains location, which is able to bridge XCM messages to bridged network pub bridge_location: MultiLocation, + /// Fee which could be needed to pay in `bridge_location` + /// `MultiAsset` is here from the point of view of `bridge_location`, e.g.: `MultiLocation::parent()` means relay chain token of `bridge_location` + pub bridge_location_fee: Option, /// Contains target destination on bridged network. E.g.: MultiLocation of Statemine/t on different consensus // TODO:check-parameter - lets start with 1..1, maybe later we could extend this with BoundedVec // TODO: bridged bridge-hub should have router for this pub allowed_target_location: MultiLocation, - - /// Fee which could be needed to pay in `bridge_location` - pub fee: Option, + // TODO:check-parameter - can we store Option and then aviod using `Unlimited`? + /// If `None` then `UnpaidExecution` is used, else `Withdraw(target_location_fee)/BuyExecution(target_location_fee, Unlimited)` + /// `MultiAsset` is here from the point of view of `allowed_target_location`, e.g.: `MultiLocation::parent()` means relay chain token of `allowed_target_location` + pub target_location_fee: Option, } /// Trait for constructing ping message. @@ -283,20 +287,27 @@ pub mod pallet { .reanchored(&allowed_target_location, T::UniversalLocation::get()) .expect("// TODO:check-parameter - handle compensation?"); - let xcm: Xcm<()> = sp_std::vec![ - // TODO:check-parameter - setup fees - check teleporter for ForeignAssets - customizable AccountOf for BuyExecution + converters - UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + // prepare xcm message (maybe_paid + ReserveAssetDeposited stuff) + let mut xcm_instructions = match bridge_config.target_location_fee { + Some(target_location_fee) => sp_std::vec![ + WithdrawAsset(target_location_fee.clone().into()), + BuyExecution { fees: target_location_fee, weight_limit: Unlimited }, + ], + None => + sp_std::vec![UnpaidExecution { check_origin: None, weight_limit: Unlimited }], + }; + xcm_instructions.extend(sp_std::vec![ ReserveAssetDeposited(asset.clone().into()), ClearOrigin, DepositAsset { assets: MultiAssetFilter::from(MultiAssets::from(asset)), beneficiary: remote_destination } - ] - .into(); + ]); // TODO:check-parameter how to compensate if this call fails? return back deposisted assets? - Self::initiate_bridge_transfer(allowed_target_location, xcm).map_err(Into::into) + Self::initiate_bridge_transfer(allowed_target_location, xcm_instructions.into()) + .map_err(Into::into) } /// Transfer `ping` via bridge to different global consensus. @@ -395,14 +406,17 @@ pub mod pallet { pub fn update_bridge_config( origin: OriginFor, bridged_network: NetworkId, - fee: Option, + bridge_location_fee: Option, + target_location_fee: Option, ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; ensure!(Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); Bridges::::try_mutate_exists(bridged_network, |bridge_config| { - let deposit = bridge_config.as_mut().ok_or(Error::::InvalidConfiguration)?; - deposit.fee = fee; + let bridge_config = + bridge_config.as_mut().ok_or(Error::::InvalidConfiguration)?; + bridge_config.bridge_location_fee = bridge_location_fee; + bridge_config.target_location_fee = target_location_fee; Self::deposit_event(Event::BridgeUpdated); Ok(()) }) @@ -500,8 +514,9 @@ pub mod pallet { _remote_location: &InteriorMultiLocation, _message: &Xcm<()>, ) -> Option<(MultiLocation, Option)> { - Pallet::::get_bridge_for(network) - .map(|bridge_config| (bridge_config.bridge_location, bridge_config.fee)) + Pallet::::get_bridge_for(network).map(|bridge_config| { + (bridge_config.bridge_location, bridge_config.bridge_location_fee) + }) } } } @@ -687,11 +702,12 @@ pub(crate) mod tests { Wococo, BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), + bridge_location_fee: None, allowed_target_location: MultiLocation::new( 2, X2(GlobalConsensus(Wococo), Parachain(1000)), ), - fee: None, + target_location_fee: None, }, ) } @@ -929,6 +945,7 @@ pub(crate) mod tests { ExportMessage { network: Wococo, destination: X1(Parachain(1000)), .. } ) }) { + assert!(xcm.0.iter().any(|instr| matches!(instr, UnpaidExecution { .. }))); assert!(xcm.0.iter().any(|instr| matches!(instr, ReserveAssetDeposited(..)))); assert!(xcm.0.iter().any(|instr| matches!(instr, ClearOrigin))); assert!(xcm.0.iter().any(|instr| matches!(instr, DepositAsset { .. }))); @@ -997,11 +1014,12 @@ pub(crate) mod tests { let bridged_network = Rococo; let bridged_config = Box::new(BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), + bridge_location_fee: None, allowed_target_location: MultiLocation::new( 2, X2(GlobalConsensus(bridged_network), Parachain(1000)), ), - fee: None, + target_location_fee: None, }); let dummy_xcm = Xcm(vec![]); let dummy_remote_interior_multilocation = X1(Parachain(1234)); @@ -1070,7 +1088,7 @@ pub(crate) mod tests { &dummy_remote_interior_multilocation, &dummy_xcm ), - Some((bridged_config.bridge_location, bridged_config.fee)) + Some((bridged_config.bridge_location, bridged_config.bridge_location_fee)) ); assert_eq!( BridgeTransfer::exporter_for( @@ -1087,14 +1105,16 @@ pub(crate) mod tests { RuntimeOrigin::root(), bridged_network, Some((Parent, 200u128).into()), + Some((Parent, 300u128).into()), )); assert_eq!(Bridges::::iter().count(), 1); assert_eq!( Bridges::::get(bridged_network), Some(BridgeConfig { bridge_location: bridged_config.bridge_location.clone(), + bridge_location_fee: Some((Parent, 200u128).into()), allowed_target_location: bridged_config.allowed_target_location.clone(), - fee: Some((Parent, 200u128).into()) + target_location_fee: Some((Parent, 300u128).into()), }) ); assert_eq!( diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 7e1d72f3cd6..d64856f181a 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1358,11 +1358,12 @@ pub fn can_governance_change_bridge_transfer_configuration( let bridged_network = ByGenesis([9; 32]); let bridge_config = pallet_bridge_transfer::BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), + bridge_location_fee: None, allowed_target_location: MultiLocation::new( 2, X2(GlobalConsensus(bridged_network), Parachain(1000)), ), - fee: None, + target_location_fee: None, }; // helper to execute BridgeTransfer call @@ -1410,16 +1411,21 @@ pub fn can_governance_change_bridge_transfer_configuration( assert!(cfg.is_some()); let cfg = cfg.unwrap(); assert_eq!(cfg.bridge_location, bridge_config.bridge_location); + assert_eq!(cfg.bridge_location_fee, None); assert_eq!(cfg.allowed_target_location, bridge_config.allowed_target_location); - assert_eq!(cfg.fee, None); + assert_eq!(cfg.target_location_fee, None); } // governance can update bridge config - let new_fee: MultiAsset = (Concrete(MultiLocation::parent()), 1_000).into(); + let new_bridge_location_fee: MultiAsset = + (Concrete(MultiLocation::parent()), 1_000).into(); + let new_target_location_fee: MultiAsset = + (Concrete(MultiLocation::parent()), 1_000_000).into(); assert_ok!(execute_as_governance( pallet_bridge_transfer::Call::::update_bridge_config { bridged_network, - fee: Some(new_fee.clone()), + bridge_location_fee: Some(new_bridge_location_fee.clone()), + target_location_fee: Some(new_target_location_fee.clone()), }, ) .ensure_complete()); @@ -1432,8 +1438,9 @@ pub fn can_governance_change_bridge_transfer_configuration( assert!(cfg.is_some()); let cfg = cfg.unwrap(); assert_eq!(cfg.bridge_location, bridge_config.bridge_location); + assert_eq!(cfg.bridge_location_fee, Some(new_bridge_location_fee)); assert_eq!(cfg.allowed_target_location, bridge_config.allowed_target_location); - assert_eq!(cfg.fee, Some(new_fee)); + assert_eq!(cfg.target_location_fee, Some(new_target_location_fee)); } // governance can remove bridge config @@ -1531,10 +1538,12 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< .expect("BridgeHub's Sovereign account"); let target_location_from_different_consensus = MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); let bridge_config = pallet_bridge_transfer::BridgeConfig { bridge_location: bridge_hub_location, + bridge_location_fee: None, allowed_target_location: target_location_from_different_consensus, - fee: None, + target_location_fee: Some(target_location_fee.clone()), }; let balance_to_transfer = 1000_u128; let native_asset = MultiLocation::parent(); @@ -1679,10 +1688,20 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< .0 .matcher() .match_next_inst(|next_instr| match next_instr { - UnpaidExecution { .. } => Ok(()), + WithdrawAsset(fees) + if fees == &MultiAssets::from(target_location_fee.clone()) => + Ok(()), + _ => Err(()), + }) + .expect("contains WithdrawAsset") + .match_next_inst(|next_instr| match next_instr { + BuyExecution { ref fees, ref weight_limit } + if fees == &target_location_fee && + weight_limit == &Unlimited => + Ok(()), _ => Err(()), }) - .expect("contains UnpaidExecution") + .expect("contains BuyExecution") .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { ReserveAssetDeposited(ref deposited) if deposited.eq(&reanchored_assets) => From a3eb5499bdb0320fbbafaad791b1c8e418fdd7ba Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 27 Mar 2023 13:11:03 +0200 Subject: [PATCH 061/339] Removed stuff --- .../assets/westmint/src/xcm_config.rs | 145 +----------------- .../runtimes/assets/westmint/tests/tests.rs | 35 ----- 2 files changed, 2 insertions(+), 178 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 032471b9fa8..84f2192d434 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -23,7 +23,7 @@ use assets_common::matching::{ }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, ContainsPair, Everything, OriginTrait, PalletInfoAccess}, + traits::{ConstU32, Contains, ContainsPair, Everything, PalletInfoAccess}, }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; @@ -34,7 +34,6 @@ use parachains_common::{ }, }; use polkadot_parachain::primitives::Sibling; -use sp_core::Get; use sp_runtime::traits::ConvertInto; use xcm::latest::prelude::*; use xcm_builder::{ @@ -46,7 +45,7 @@ use xcm_builder::{ UsingComponents, WeightInfoBounds, WithComputedOrigin, }; use xcm_executor::{ - traits::{Convert, ConvertOrigin, ShouldExecute, WithOriginFilter}, + traits::WithOriginFilter, XcmExecutor, }; @@ -163,10 +162,6 @@ pub type XcmOriginToTransactDispatchOrigin = ( SignedAccountId32AsNative, // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. XcmPassthrough, - // TODO:check-parameter - find a better solution - // Bridged account origins from different globalConsensus converts as SovereignAccount - BridgedSignedAccountId32AsNative, - // TODO: add here alternative for BridgedRelayChainAs... or BridgedParachainAs... ); parameter_types! { @@ -365,8 +360,6 @@ pub type Barrier = DenyThenTry< AllowExplicitUnpaidExecutionFrom, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, - // Specific barrier for bridged calls from different globalConsensus/network - BridgedCallsBarrier, ), UniversalLocation, ConstU32<8>, @@ -534,21 +527,6 @@ impl Contains for TrustedBridgedReserveLocations { } } -pub type BridgedCallsBarrier = ( - // TODO:check-parameter - verify, if we need for production (usefull at least for testing connection in production) - AllowExecutionForTrapFrom, - // TODO:check-parameter - verify, if we need for production - AllowExecutionForTransactFrom, - // TODO:check-parameter - setup fess - // TODO:check-parameter - change Everything to some Contains with trusted BridgeHub configuration - // Configured trusted BridgeHub gets free execution. - AllowExplicitUnpaidExecutionFrom, - // Expected responses are OK. - AllowKnownQueryResponses, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, -); - /// Asset filter that allows all assets from trusted bridge location pub struct ConcreteFungibleAssetsFromTrustedBridgedReserves( sp_std::marker::PhantomData, @@ -569,122 +547,3 @@ impl> ContainsPair(sp_std::marker::PhantomData); -impl> ShouldExecute for AllowExecutionForTrapFrom { - fn should_execute( - origin: &MultiLocation, - instructions: &mut [Instruction], - max_weight: xcm::latest::Weight, - _weight_credit: &mut xcm::latest::Weight, - ) -> Result<(), ()> { - log::warn!( - target: "xcm::barriers", - "(TODO:remove-in-production) AllowExecutionForTrapFrom origin: {:?}, instructions: {:?}, max_weight: {:?}, weight_credit: {:?}", - origin, instructions, max_weight, _weight_credit, - ); - - match instructions.first() { - Some(Trap { .. }) => Ok(()), - _ => Err(()), - } - } -} - -pub struct AllowExecutionForTransactFrom(sp_std::marker::PhantomData); -impl> ShouldExecute for AllowExecutionForTransactFrom { - fn should_execute( - origin: &MultiLocation, - instructions: &mut [Instruction], - max_weight: xcm::latest::Weight, - _weight_credit: &mut xcm::latest::Weight, - ) -> Result<(), ()> { - log::error!( - target: "xcm::barriers", - "(TODO:change/remove-in-production) AllowExecutionForTransactFrom origin: {:?}, instructions: {:?}, max_weight: {:?}, weight_credit: {:?}", - origin, instructions, max_weight, _weight_credit, - ); - - match instructions.first() { - // TODO:check-parameter - filter just remark/remark_with_event - Some(Transact { .. }) => Ok(()), - _ => Err(()), - } - } -} - -pub struct BridgedSignedAccountId32AsNative( - sp_std::marker::PhantomData<(LocationConverter, RuntimeOrigin, BridgedNetworks)>, -); -impl< - LocationConverter: Convert, - RuntimeOrigin: OriginTrait, - BridgedNetworks: Get>, - > ConvertOrigin - for BridgedSignedAccountId32AsNative -where - RuntimeOrigin::AccountId: Clone, -{ - fn convert_origin( - origin: impl Into, - kind: OriginKind, - ) -> Result { - let origin = origin.into(); - log::trace!( - target: "xcm::origin_conversion", - "BridgedSignedAccountId32AsNative origin: {:?}, kind: {:?}", - origin, kind, - ); - if let OriginKind::SovereignAccount = kind { - match origin { - // this represents remote relaychain - MultiLocation { - parents: 2, - interior: - X2( - GlobalConsensus(remote_network), - AccountId32 { network: _network, id: _id }, - ), - } | - // this represents remote parachain - MultiLocation { - parents: 2, - interior: - X3( - GlobalConsensus(remote_network), - Parachain(_), - AccountId32 { network: _network, id: _id }, - ), - } => { - // TODO:check-parameter - hack - configured local bridge-hub behaves on behalf of any origin from configured bridged network (just to pass Transact/System::remark_with_event - ensure_signed) - // find configured local bridge_hub for remote network - let bridge_hub_location = BridgedNetworks::get() - .iter() - .find(|(_, configured_bridged_network)| match configured_bridged_network { - GlobalConsensus(bridged_network) => bridged_network.eq(&remote_network), - _ => false, - }) - .map(|(bridge_hub_location, _)| bridge_hub_location.clone()); - - // try to convert local bridge-hub location - match bridge_hub_location { - Some(bridge_hub_location) => { - let new_origin = bridge_hub_location; - log::error!( - target: "xcm::origin_conversion", - "BridgedSignedAccountId32AsNative replacing origin: {:?} to new_origin: {:?}, kind: {:?}", - origin, new_origin, kind, - ); - let location = LocationConverter::convert(new_origin)?; - Ok(RuntimeOrigin::signed(location).into()) - }, - _ => Err(origin), - } - }, - _ => Err(origin), - } - } else { - Err(origin) - } - } -} diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 74544e6579b..f2203bedab0 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -646,41 +646,6 @@ fn plain_receive_teleported_asset_works() { }) } -#[test] -fn test_receive_bridged_xcm_trap_works() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .with_tracing() - .build() - .execute_with(|| { - // simulate received message: - // 2022-12-21 14:38:54.047 DEBUG tokio-runtime-worker xcm::execute_xcm: [Parachain] origin: MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, message: Xcm([UniversalOrigin(GlobalConsensus(Rococo)), DescendOrigin(X1(AccountId32 { network: Some(Rococo), id: [28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11, 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124] })), Transact { origin_kind: SovereignAccount, require_weight_at_most: 1000000000, call: [0, 8, 20, 104, 101, 108, 108, 111] }]), weight_limit: 41666666666 - // origin as BridgeHub - let origin = MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; - let xcm = Xcm(vec![ - UniversalOrigin(GlobalConsensus(Rococo)), - DescendOrigin(X1(AccountId32 { - network: Some(Rococo), - id: [ - 28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11, - 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124, - ], - })), - Trap(1234), - ]); - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let weight_limit = Weight::from_parts(41666666666, 0); - - let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); - assert_eq!(outcome.ensure_complete(), Err(xcm::latest::Error::Trap(1234))); - }); -} - #[test] fn test_receive_bridged_xcm_reserve_asset_deposited_works() { ExtBuilder::::default() From 7d4319dbf1f2d07ee877739e47028b9261afc193 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 16:27:33 +0200 Subject: [PATCH 062/339] Bump futures from 0.3.26 to 0.3.27 (#2359) Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.26 to 0.3.27. - [Release notes](https://github.com/rust-lang/futures-rs/releases) - [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/futures-rs/compare/0.3.26...0.3.27) --- updated-dependencies: - dependency-name: futures dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sebastian Kunert --- Cargo.lock | 36 +++++++++---------- client/consensus/aura/Cargo.toml | 2 +- client/consensus/common/Cargo.toml | 2 +- client/consensus/relay-chain/Cargo.toml | 2 +- client/network/Cargo.toml | 2 +- client/pov-recovery/Cargo.toml | 2 +- .../Cargo.toml | 2 +- client/relay-chain-interface/Cargo.toml | 2 +- client/relay-chain-minimal-node/Cargo.toml | 2 +- client/relay-chain-rpc-interface/Cargo.toml | 2 +- client/service/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- primitives/timestamp/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 14 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4dcd1e85fcc..04cd05245aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3661,9 +3661,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" +checksum = "531ac96c6ff5fd7c62263c5e3c67a603af4fcaee2e1a0ae5565ba3a11e69e549" dependencies = [ "futures-channel", "futures-core", @@ -3676,9 +3676,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" +checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac" dependencies = [ "futures-core", "futures-sink", @@ -3686,15 +3686,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" +checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd" [[package]] name = "futures-executor" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" +checksum = "1997dd9df74cdac935c76252744c1ed5794fac083242ea4fe77ef3ed60ba0f83" dependencies = [ "futures-core", "futures-task", @@ -3704,9 +3704,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" +checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91" [[package]] name = "futures-lite" @@ -3725,9 +3725,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" +checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" dependencies = [ "proc-macro2", "quote", @@ -3747,15 +3747,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" +checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2" [[package]] name = "futures-task" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" +checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879" [[package]] name = "futures-timer" @@ -3765,9 +3765,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" +checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab" dependencies = [ "futures-channel", "futures-core", diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index 4428c94c210..b7a65523cf5 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] async-trait = "0.1.68" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } -futures = "0.3.26" +futures = "0.3.27" tracing = "0.1.37" # Substrate diff --git a/client/consensus/common/Cargo.toml b/client/consensus/common/Cargo.toml index a588d02e741..84f3adaca1e 100644 --- a/client/consensus/common/Cargo.toml +++ b/client/consensus/common/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" async-trait = "0.1.68" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } dyn-clone = "1.0.11" -futures = "0.3.26" +futures = "0.3.27" log = "0.4.17" tracing = "0.1.37" diff --git a/client/consensus/relay-chain/Cargo.toml b/client/consensus/relay-chain/Cargo.toml index 9b7d8dff3ff..b3cd2eea7b0 100644 --- a/client/consensus/relay-chain/Cargo.toml +++ b/client/consensus/relay-chain/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] async-trait = "0.1.68" -futures = "0.3.26" +futures = "0.3.27" parking_lot = "0.12.1" tracing = "0.1.37" diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index 96dc43a5f52..130ab98b754 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] async-trait = "0.1.68" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } -futures = "0.3.26" +futures = "0.3.27" futures-timer = "3.0.2" parking_lot = "0.12.1" tracing = "0.1.37" diff --git a/client/pov-recovery/Cargo.toml b/client/pov-recovery/Cargo.toml index 6b379fd89d6..5ab23ec7791 100644 --- a/client/pov-recovery/Cargo.toml +++ b/client/pov-recovery/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } -futures = "0.3.26" +futures = "0.3.27" futures-timer = "3.0.2" rand = "0.8.5" tracing = "0.1.37" diff --git a/client/relay-chain-inprocess-interface/Cargo.toml b/client/relay-chain-inprocess-interface/Cargo.toml index 059d6f198db..1959a7d163a 100644 --- a/client/relay-chain-inprocess-interface/Cargo.toml +++ b/client/relay-chain-inprocess-interface/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] async-trait = "0.1.68" -futures = "0.3.26" +futures = "0.3.27" futures-timer = "3.0.2" # Substrate diff --git a/client/relay-chain-interface/Cargo.toml b/client/relay-chain-interface/Cargo.toml index c4b413906e2..9583d78b613 100644 --- a/client/relay-chain-interface/Cargo.toml +++ b/client/relay-chain-interface/Cargo.toml @@ -14,7 +14,7 @@ sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "mas sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -futures = "0.3.26" +futures = "0.3.27" async-trait = "0.1.68" thiserror = "1.0.38" jsonrpsee-core = "0.16.2" diff --git a/client/relay-chain-minimal-node/Cargo.toml b/client/relay-chain-minimal-node/Cargo.toml index dc7cad4bd76..7c1c8621d36 100644 --- a/client/relay-chain-minimal-node/Cargo.toml +++ b/client/relay-chain-minimal-node/Cargo.toml @@ -36,5 +36,5 @@ array-bytes = "6.0" lru = "0.9" tracing = "0.1.37" async-trait = "0.1.68" -futures = "0.3.26" +futures = "0.3.27" tokio = { version = "1.26.0", features = ["macros"] } diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index b51997b666b..91afe09910e 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -23,7 +23,7 @@ sc-service = { git = "https://github.com/paritytech/substrate", branch = "master tokio = { version = "1.26.0", features = ["sync"] } -futures = "0.3.26" +futures = "0.3.27" futures-timer = "3.0.2" parity-scale-codec = "3.4.0" jsonrpsee = { version = "0.16.2", features = ["ws-client"] } diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index ade6e7e8067..e17809158a9 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -futures = "0.3.26" +futures = "0.3.27" # Substrate sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 80de13097f2..32b1e1cabec 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -14,7 +14,7 @@ path = "src/main.rs" async-trait = "0.1.68" clap = { version = "4.1.11", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } -futures = "0.3.26" +futures = "0.3.27" hex-literal = "0.3.4" log = "0.4.17" serde = { version = "1.0.156", features = ["derive"] } diff --git a/primitives/timestamp/Cargo.toml b/primitives/timestamp/Cargo.toml index 418b79d30c0..79fcaa535f6 100644 --- a/primitives/timestamp/Cargo.toml +++ b/primitives/timestamp/Cargo.toml @@ -7,7 +7,7 @@ description = "Provides timestamp related functionality for parachains." [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -futures = "0.3.26" +futures = "0.3.27" # Substrate sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 3c0cec570fa..639aa369fef 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -72,7 +72,7 @@ cumulus-relay-chain-minimal-node = { path = "../../client/relay-chain-minimal-no cumulus-client-pov-recovery = { path = "../../client/pov-recovery" } [dev-dependencies] -futures = "0.3.26" +futures = "0.3.27" portpicker = "0.1.1" # Polkadot dependencies From ea6598c3fa5ffe793f73bffd0f369b08f51722f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 22:08:11 +0000 Subject: [PATCH 063/339] Bump clap from 4.1.11 to 4.1.13 (#2388) Bumps [clap](https://github.com/clap-rs/clap) from 4.1.11 to 4.1.13. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v4.1.11...v4.1.13) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 77 ++++++++++++++---------------- client/cli/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 5 files changed, 39 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 04cd05245aa..b1eafbf02b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -550,7 +550,7 @@ version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6" dependencies = [ - "bitflags 1.3.2", + "bitflags", "cexpr", "clang-sys", "lazy_static", @@ -569,12 +569,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "bitflags" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487f1e0fcbe47deb8b0574e646def1c903389d95241dd1bbcc6ce4a715dfc0c1" - [[package]] name = "bitvec" version = "1.0.1" @@ -1196,7 +1190,7 @@ version = "3.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750" dependencies = [ - "bitflags 1.3.2", + "bitflags", "clap_lex 0.2.2", "indexmap", "textwrap", @@ -1204,11 +1198,11 @@ dependencies = [ [[package]] name = "clap" -version = "4.1.11" +version = "4.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42dfd32784433290c51d92c438bb72ea5063797fc3cc9a21a8c4346bebbb2098" +checksum = "3c911b090850d79fc64fe9ea01e28e465f65e821e08813ced95bced72f7a8a9b" dependencies = [ - "bitflags 2.0.2", + "bitflags", "clap_derive", "clap_lex 0.3.0", "is-terminal", @@ -1219,15 +1213,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.1.9" +version = "4.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fddf67631444a3a3e3e5ac51c36a5e01335302de677bd78759eaa90ab1f46644" +checksum = "9a932373bab67b984c790ddf2c9ca295d8e3af3b7ef92de5a5bacdccdee4b09b" dependencies = [ "heck", - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.9", ] [[package]] @@ -1818,7 +1811,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.1.11", + "clap 4.1.13", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -2456,7 +2449,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.1.11", + "clap 4.1.13", "criterion", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -3384,7 +3377,7 @@ dependencies = [ "Inflector", "array-bytes 4.2.0", "chrono", - "clap 4.1.11", + "clap 4.1.13", "comfy-table", "frame-benchmarking", "frame-support", @@ -3501,7 +3494,7 @@ name = "frame-support" version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" dependencies = [ - "bitflags 1.3.2", + "bitflags", "environmental", "frame-metadata", "frame-support-procedural", @@ -5714,7 +5707,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" dependencies = [ "anyhow", - "bitflags 1.3.2", + "bitflags", "byteorder", "libc", "netlink-packet-core", @@ -5767,7 +5760,7 @@ version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" dependencies = [ - "bitflags 1.3.2", + "bitflags", "cfg-if", "libc", "memoffset 0.6.5", @@ -5779,7 +5772,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" dependencies = [ - "bitflags 1.3.2", + "bitflags", "cfg-if", "libc", "memoffset 0.7.1", @@ -6305,7 +6298,7 @@ name = "pallet-contracts" version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" dependencies = [ - "bitflags 1.3.2", + "bitflags", "environmental", "frame-benchmarking", "frame-support", @@ -6335,7 +6328,7 @@ name = "pallet-contracts-primitives" version = "7.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" dependencies = [ - "bitflags 1.3.2", + "bitflags", "parity-scale-codec", "scale-info", "sp-runtime", @@ -7198,7 +7191,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.1.11", + "clap 4.1.13", "cumulus-client-cli", "cumulus-client-consensus-aura", "cumulus-client-consensus-common", @@ -7784,7 +7777,7 @@ name = "polkadot-cli" version = "0.9.39" source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" dependencies = [ - "clap 4.1.11", + "clap 4.1.13", "frame-benchmarking-cli", "futures", "log", @@ -8456,7 +8449,7 @@ dependencies = [ "bridge-hub-kusama-runtime", "bridge-hub-polkadot-runtime", "bridge-hub-rococo-runtime", - "clap 4.1.11", + "clap 4.1.13", "collectives-polkadot-runtime", "contracts-rococo-runtime", "cumulus-client-cli", @@ -8772,7 +8765,7 @@ name = "polkadot-runtime-parachains" version = "0.9.39" source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" dependencies = [ - "bitflags 1.3.2", + "bitflags", "bitvec", "derive_more", "frame-benchmarking", @@ -9574,7 +9567,7 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] @@ -9664,7 +9657,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" dependencies = [ - "bitflags 1.3.2", + "bitflags", "libc", "mach", "winapi", @@ -9975,7 +9968,7 @@ version = "0.35.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "727a1a6d65f786ec22df8a81ca3121107f235970dc1705ed681d3e6e8b9cd5f9" dependencies = [ - "bitflags 1.3.2", + "bitflags", "errno", "io-lifetimes 0.7.5", "libc", @@ -9989,7 +9982,7 @@ version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" dependencies = [ - "bitflags 1.3.2", + "bitflags", "errno", "io-lifetimes 1.0.2", "libc", @@ -10207,7 +10200,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c4 dependencies = [ "array-bytes 4.2.0", "chrono", - "clap 4.1.11", + "clap 4.1.13", "fdlimit", "futures", "libp2p", @@ -10727,7 +10720,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c4 dependencies = [ "array-bytes 4.2.0", "async-trait", - "bitflags 1.3.2", + "bitflags", "bytes", "futures", "futures-timer", @@ -11068,7 +11061,7 @@ name = "sc-storage-monitor" version = "0.1.0" source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" dependencies = [ - "clap 4.1.11", + "clap 4.1.13", "fs4", "futures", "log", @@ -11404,7 +11397,7 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" dependencies = [ - "bitflags 1.3.2", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -12004,7 +11997,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c4 dependencies = [ "array-bytes 4.2.0", "base58", - "bitflags 1.3.2", + "bitflags", "blake2", "bounded-collections", "dyn-clonable", @@ -12704,7 +12697,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6" dependencies = [ - "bitflags 1.3.2", + "bitflags", "cfg_aliases", "libc", "parking_lot 0.11.2", @@ -12989,7 +12982,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" dependencies = [ - "bitflags 1.3.2", + "bitflags", "core-foundation", "system-configuration-sys", ] @@ -13367,7 +13360,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" dependencies = [ - "bitflags 1.3.2", + "bitflags", "bytes", "futures-core", "futures-util", @@ -13582,7 +13575,7 @@ version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" dependencies = [ "async-trait", - "clap 4.1.11", + "clap 4.1.13", "frame-remote-externalities", "frame-try-runtime", "hex", @@ -14481,7 +14474,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87" dependencies = [ "async-trait", - "bitflags 1.3.2", + "bitflags", "bytes", "cc", "ipnet", diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index e8aa942907c..a363cabc02d 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -clap = { version = "4.1.11", features = ["derive"] } +clap = { version = "4.1.13", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.3.1" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index e3c9b1825ad..38fe7b2ba86 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" build = "build.rs" [dependencies] -clap = { version = "4.1.11", features = ["derive"] } +clap = { version = "4.1.13", features = ["derive"] } log = "0.4.17" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.156", features = ["derive"] } diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 32b1e1cabec..83920372198 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -12,7 +12,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.1.11", features = ["derive"] } +clap = { version = "4.1.13", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.27" hex-literal = "0.3.4" diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 639aa369fef..566655e28d2 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -10,7 +10,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.1.11", features = ["derive"] } +clap = { version = "4.1.13", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.4.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } From 35d79f3b218f0b44f89ec0b56cf0f4a9c4f63da8 Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Tue, 28 Mar 2023 09:37:58 +0200 Subject: [PATCH 064/339] Remove HeaderBackend from RelayChainRPCClient (#2385) * Remove HeaderBackend from RelayChainRPCClient * update lockfile for {"substrate", "polkadot"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 520 +++++++++--------- .../src/blockchain_rpc_client.rs | 78 +-- client/relay-chain-minimal-node/src/lib.rs | 22 +- .../relay-chain-minimal-node/src/network.rs | 31 +- 4 files changed, 288 insertions(+), 363 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b1eafbf02b8..fee1e2f3fc4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -529,7 +529,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "hash-db", "log", @@ -3324,7 +3324,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", ] @@ -3347,7 +3347,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-support-procedural", @@ -3372,7 +3372,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3419,7 +3419,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3430,7 +3430,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3447,7 +3447,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -3476,7 +3476,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "futures", "log", @@ -3492,7 +3492,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "bitflags", "environmental", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "Inflector", "cfg-expr", @@ -3540,7 +3540,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3552,7 +3552,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "proc-macro2", "quote", @@ -3562,7 +3562,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "log", @@ -3580,7 +3580,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3595,7 +3595,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "sp-api", @@ -3604,7 +3604,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "parity-scale-codec", @@ -4567,7 +4567,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bitvec", "frame-benchmarking", @@ -4665,7 +4665,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "frame-support", "polkadot-primitives", @@ -5507,7 +5507,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "futures", "log", @@ -5526,7 +5526,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "anyhow", "jsonrpsee", @@ -5945,9 +5945,9 @@ checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "orchestra" -version = "0.0.4" +version = "0.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17e7d5b6bb115db09390bed8842c94180893dd83df3dfce7354f2a2aa090a4ee" +checksum = "227585216d05ba65c7ab0a0450a3cf2cbd81a98862a54c4df8e14d5ac6adb015" dependencies = [ "async-trait", "dyn-clonable", @@ -5962,9 +5962,9 @@ dependencies = [ [[package]] name = "orchestra-proc-macro" -version = "0.0.4" +version = "0.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2af4dabb2286b0be0e9711d2d24e25f6217048b71210cffd3daddc3b5c84e1f" +checksum = "2871aadd82a2c216ee68a69837a526dfe788ecbe74c4c5038a6acdbff6653066" dependencies = [ "expander 0.0.6", "itertools", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6036,7 +6036,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6054,7 +6054,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6069,7 +6069,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -6085,7 +6085,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -6101,7 +6101,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -6115,7 +6115,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6139,7 +6139,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6174,7 +6174,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -6193,7 +6193,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6235,7 +6235,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6279,7 +6279,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6296,7 +6296,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "bitflags", "environmental", @@ -6326,7 +6326,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "bitflags", "parity-scale-codec", @@ -6339,7 +6339,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "proc-macro2", "quote", @@ -6349,7 +6349,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6366,7 +6366,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6384,7 +6384,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6407,7 +6407,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6420,7 +6420,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6438,7 +6438,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6456,7 +6456,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6479,7 +6479,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6495,7 +6495,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6515,7 +6515,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6532,7 +6532,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -6546,7 +6546,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6563,7 +6563,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6580,7 +6580,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6596,7 +6596,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6614,7 +6614,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "pallet-nfts", @@ -6625,7 +6625,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6641,7 +6641,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -6658,7 +6658,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6678,7 +6678,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6689,7 +6689,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -6706,7 +6706,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6730,7 +6730,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6747,7 +6747,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6762,7 +6762,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6780,7 +6780,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6795,7 +6795,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6814,7 +6814,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -6852,7 +6852,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6868,7 +6868,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -6882,7 +6882,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6905,7 +6905,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6916,7 +6916,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "log", "sp-arithmetic", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "sp-api", @@ -6934,7 +6934,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6951,7 +6951,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -6980,7 +6980,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6998,7 +6998,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -7017,7 +7017,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-support", "frame-system", @@ -7033,7 +7033,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7049,7 +7049,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7061,7 +7061,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -7078,7 +7078,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -7093,7 +7093,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -7109,7 +7109,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -7124,7 +7124,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-benchmarking", "frame-support", @@ -7139,7 +7139,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7160,7 +7160,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -7702,7 +7702,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "futures", "polkadot-node-metrics", @@ -7717,7 +7717,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7731,7 +7731,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "derive_more", "fatality", @@ -7754,7 +7754,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "fatality", "futures", @@ -7775,7 +7775,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "clap 4.1.13", "frame-benchmarking-cli", @@ -7803,7 +7803,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "async-trait", "frame-benchmarking", @@ -7846,7 +7846,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "always-assert", "bitvec", @@ -7868,7 +7868,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "parity-scale-codec", "scale-info", @@ -7880,7 +7880,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "derive_more", "fatality", @@ -7905,7 +7905,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -7919,7 +7919,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "futures", "futures-timer", @@ -7939,7 +7939,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "always-assert", "async-trait", @@ -7962,7 +7962,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "futures", "parity-scale-codec", @@ -7980,7 +7980,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bitvec", "derive_more", @@ -8009,7 +8009,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bitvec", "futures", @@ -8030,7 +8030,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bitvec", "fatality", @@ -8049,7 +8049,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8064,7 +8064,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "async-trait", "futures", @@ -8084,7 +8084,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "futures", "polkadot-node-metrics", @@ -8099,7 +8099,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "futures", "futures-timer", @@ -8116,7 +8116,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "fatality", "futures", @@ -8135,7 +8135,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "async-trait", "futures", @@ -8152,7 +8152,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bitvec", "fatality", @@ -8170,7 +8170,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "always-assert", "assert_matches", @@ -8206,7 +8206,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "futures", "polkadot-node-primitives", @@ -8222,7 +8222,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "futures", "lru 0.9.0", @@ -8237,7 +8237,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "lazy_static", "log", @@ -8255,7 +8255,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bs58", "futures", @@ -8274,7 +8274,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "async-trait", "derive_more", @@ -8296,7 +8296,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bounded-vec", "futures", @@ -8319,7 +8319,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8329,7 +8329,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "async-trait", "futures", @@ -8347,7 +8347,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "async-trait", "derive_more", @@ -8370,7 +8370,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "async-trait", "derive_more", @@ -8403,7 +8403,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "async-trait", "futures", @@ -8426,7 +8426,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bounded-collections", "derive_more", @@ -8523,7 +8523,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8539,7 +8539,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bitvec", "hex-literal", @@ -8565,7 +8565,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8597,7 +8597,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bitvec", "frame-benchmarking", @@ -8691,7 +8691,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bitvec", "frame-benchmarking", @@ -8737,7 +8737,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "frame-support", "polkadot-primitives", @@ -8751,7 +8751,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bs58", "parity-scale-codec", @@ -8763,7 +8763,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bitflags", "bitvec", @@ -8807,7 +8807,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -8917,7 +8917,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -8938,7 +8938,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -8948,7 +8948,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -8973,7 +8973,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9034,7 +9034,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "frame-benchmarking", "frame-system", @@ -9770,7 +9770,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -9856,7 +9856,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "frame-support", "polkadot-primitives", @@ -10089,7 +10089,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "log", "sp-core", @@ -10100,7 +10100,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "futures", @@ -10128,7 +10128,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "futures", "futures-timer", @@ -10151,7 +10151,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10166,7 +10166,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10185,7 +10185,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10196,7 +10196,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10236,7 +10236,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "fnv", "futures", @@ -10262,7 +10262,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "hash-db", "kvdb", @@ -10288,7 +10288,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "futures", @@ -10313,7 +10313,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "futures", @@ -10342,7 +10342,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "fork-tree", @@ -10381,7 +10381,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "futures", "jsonrpsee", @@ -10403,7 +10403,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10438,7 +10438,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "futures", "jsonrpsee", @@ -10457,7 +10457,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10470,7 +10470,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10510,7 +10510,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "finality-grandpa", "futures", @@ -10530,7 +10530,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "futures", @@ -10553,7 +10553,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10577,7 +10577,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10590,7 +10590,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "log", "sc-allocator", @@ -10603,7 +10603,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "anyhow", "cfg-if", @@ -10621,7 +10621,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "ansi_term", "futures", @@ -10637,7 +10637,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10652,7 +10652,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10696,7 +10696,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "cid", "futures", @@ -10716,7 +10716,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10744,7 +10744,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "ahash 0.8.2", "futures", @@ -10763,7 +10763,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10785,7 +10785,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10819,7 +10819,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10839,7 +10839,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -10870,7 +10870,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "futures", "libp2p", @@ -10883,7 +10883,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -10892,7 +10892,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "futures", "jsonrpsee", @@ -10922,7 +10922,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -10941,7 +10941,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "http", "jsonrpsee", @@ -10956,7 +10956,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10982,7 +10982,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "directories", @@ -11048,7 +11048,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "log", "parity-scale-codec", @@ -11059,7 +11059,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "clap 4.1.13", "fs4", @@ -11075,7 +11075,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11094,7 +11094,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "futures", "libc", @@ -11113,7 +11113,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "chrono", "futures", @@ -11132,7 +11132,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "ansi_term", "atty", @@ -11163,7 +11163,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11174,7 +11174,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "futures", @@ -11201,7 +11201,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "futures", @@ -11215,7 +11215,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-channel", "futures", @@ -11696,7 +11696,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "enumn", "parity-scale-codec", @@ -11773,7 +11773,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "hash-db", "log", @@ -11791,7 +11791,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "Inflector", "blake2", @@ -11805,7 +11805,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "scale-info", @@ -11818,7 +11818,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "integer-sqrt", "num-traits", @@ -11832,7 +11832,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "scale-info", @@ -11845,7 +11845,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "sp-api", @@ -11857,7 +11857,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "futures", "log", @@ -11875,7 +11875,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "futures", @@ -11890,7 +11890,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "parity-scale-codec", @@ -11908,7 +11908,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "merlin", @@ -11931,7 +11931,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "lazy_static", "parity-scale-codec", @@ -11950,7 +11950,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "finality-grandpa", "log", @@ -11968,7 +11968,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "scale-info", @@ -11980,7 +11980,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "scale-info", @@ -11993,7 +11993,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "base58", @@ -12036,7 +12036,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "blake2b_simd", "byteorder", @@ -12050,7 +12050,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "proc-macro2", "quote", @@ -12061,7 +12061,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12070,7 +12070,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "proc-macro2", "quote", @@ -12080,7 +12080,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "environmental", "parity-scale-codec", @@ -12091,7 +12091,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12106,7 +12106,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "bytes", "ed25519", @@ -12131,7 +12131,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "lazy_static", "sp-core", @@ -12142,7 +12142,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "futures", "merlin", @@ -12158,7 +12158,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "thiserror", "zstd", @@ -12167,7 +12167,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12185,7 +12185,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "scale-info", @@ -12199,7 +12199,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "sp-api", "sp-core", @@ -12209,7 +12209,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "backtrace", "lazy_static", @@ -12219,7 +12219,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "rustc-hash", "serde", @@ -12229,7 +12229,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "either", "hash256-std-hasher", @@ -12251,7 +12251,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12269,7 +12269,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "Inflector", "proc-macro-crate", @@ -12281,7 +12281,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "serde", "serde_json", @@ -12290,7 +12290,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "scale-info", @@ -12304,7 +12304,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "scale-info", @@ -12316,7 +12316,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "hash-db", "log", @@ -12336,12 +12336,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12354,7 +12354,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "futures-timer", @@ -12369,7 +12369,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "sp-std", @@ -12381,7 +12381,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "sp-api", "sp-runtime", @@ -12390,7 +12390,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "log", @@ -12406,7 +12406,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12429,7 +12429,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12446,7 +12446,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12457,7 +12457,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12471,7 +12471,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "parity-scale-codec", "scale-info", @@ -12795,7 +12795,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "platforms", ] @@ -12803,7 +12803,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -12822,7 +12822,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "hyper", "log", @@ -12834,7 +12834,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "jsonrpsee", @@ -12847,7 +12847,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "jsonrpsee", "log", @@ -12866,7 +12866,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12892,7 +12892,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "futures", "substrate-test-utils-derive", @@ -12902,7 +12902,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12913,7 +12913,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "ansi_term", "build-helper", @@ -13040,7 +13040,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "frame-support", "polkadot-primitives", @@ -13431,7 +13431,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13442,7 +13442,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "expander 0.0.6", "proc-macro-crate", @@ -13572,7 +13572,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf395c8308c481a9774373e0b0b14bd7a2e4b8d2" +source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" dependencies = [ "async-trait", "clap 4.1.13", @@ -14500,7 +14500,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bitvec", "frame-benchmarking", @@ -14592,7 +14592,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "frame-support", "polkadot-primitives", @@ -15028,7 +15028,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "bounded-collections", "derivative", @@ -15044,7 +15044,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "frame-support", "frame-system", @@ -15065,7 +15065,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "environmental", "frame-benchmarking", @@ -15085,7 +15085,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#27ddd270c3979fd2a5e2ac6fb3c9d474962c9260" +source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" dependencies = [ "Inflector", "proc-macro2", diff --git a/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs b/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs index 67f402ad432..b8939df5fd5 100644 --- a/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs +++ b/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs @@ -18,13 +18,11 @@ use std::pin::Pin; use cumulus_relay_chain_interface::{RelayChainError, RelayChainResult}; use cumulus_relay_chain_rpc_interface::RelayChainRpcClient; -use futures::{Future, Stream, StreamExt}; +use futures::{Stream, StreamExt}; use polkadot_core_primitives::{Block, BlockNumber, Hash, Header}; use polkadot_overseer::RuntimeApiSubsystemClient; -use sc_authority_discovery::AuthorityDiscovery; +use sc_authority_discovery::{AuthorityDiscovery, Error as AuthorityDiscoveryError}; use sp_api::{ApiError, RuntimeApiInfo}; -use sp_blockchain::{HeaderBackend, Info}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor}; #[derive(Clone)] pub struct BlockChainRpcClient { @@ -312,6 +310,14 @@ impl AuthorityDiscovery for BlockChainRpcClient { let result = self.rpc_client.authority_discovery_authorities(at).await?; Ok(result) } + + async fn best_hash(&self) -> std::result::Result { + self.block_get_hash(None) + .await + .ok() + .flatten() + .ok_or_else(|| AuthorityDiscoveryError::BestBlockFetchingError) + } } impl BlockChainRpcClient { @@ -327,67 +333,3 @@ impl BlockChainRpcClient { Ok(self.rpc_client.get_finalized_heads_stream()?.boxed()) } } - -fn block_local(fut: impl Future) -> T { - let tokio_handle = tokio::runtime::Handle::current(); - tokio::task::block_in_place(|| tokio_handle.block_on(fut)) -} - -impl HeaderBackend for BlockChainRpcClient { - fn header( - &self, - hash: ::Hash, - ) -> sp_blockchain::Result::Header>> { - Ok(block_local(self.rpc_client.chain_get_header(Some(hash)))?) - } - - fn info(&self) -> Info { - let best_header = block_local(self.rpc_client.chain_get_header(None)) - .expect("Unable to get header from relay chain.") - .unwrap(); - let genesis_hash = block_local(self.rpc_client.chain_get_head(Some(0))) - .expect("Unable to get header from relay chain."); - let finalized_head = block_local(self.rpc_client.chain_get_finalized_head()) - .expect("Unable to get finalized head from relay chain."); - let finalized_header = block_local(self.rpc_client.chain_get_header(Some(finalized_head))) - .expect("Unable to get finalized header from relay chain.") - .unwrap(); - Info { - best_hash: best_header.hash(), - best_number: best_header.number, - genesis_hash, - finalized_hash: finalized_head, - finalized_number: finalized_header.number, - finalized_state: None, - number_leaves: 1, - block_gap: None, - } - } - - fn status( - &self, - hash: ::Hash, - ) -> sp_blockchain::Result { - if self.header(hash)?.is_some() { - Ok(sc_client_api::blockchain::BlockStatus::InChain) - } else { - Ok(sc_client_api::blockchain::BlockStatus::Unknown) - } - } - - fn number( - &self, - hash: ::Hash, - ) -> sp_blockchain::Result::Header as HeaderT>::Number>> { - let result = block_local(self.rpc_client.chain_get_header(Some(hash)))? - .map(|maybe_header| maybe_header.number); - Ok(result) - } - - fn hash( - &self, - number: NumberFor, - ) -> sp_blockchain::Result::Hash>> { - Ok(block_local(self.rpc_client.chain_get_block_hash(number.into()))?) - } -} diff --git a/client/relay-chain-minimal-node/src/lib.rs b/client/relay-chain-minimal-node/src/lib.rs index c5c2c2fd6e9..c47f6d08d22 100644 --- a/client/relay-chain-minimal-node/src/lib.rs +++ b/client/relay-chain-minimal-node/src/lib.rs @@ -18,6 +18,7 @@ use collator_overseer::{CollatorOverseerGenArgs, NewMinimalNode}; use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface, RelayChainResult}; use cumulus_relay_chain_rpc_interface::{RelayChainRpcInterface, Url}; +use network::build_collator_network; use polkadot_network_bridge::{peer_sets_info, IsAuthority}; use polkadot_node_network_protocol::{ peer_set::PeerSetProtocolNames, @@ -149,14 +150,12 @@ async fn new_minimal_relay_chain( let (collation_req_receiver, available_data_req_receiver) = build_request_response_protocol_receivers(&request_protocol_names, &mut config); + let best_header = relay_chain_rpc_client.chain_get_header(None).await?.ok_or_else(|| { + RelayChainError::RpcCallError("Unable to fetch best header".to_string().into()) + })?; let (network, network_starter, sync_oracle) = - network::build_collator_network(network::BuildCollatorNetworkParams { - config: &config, - client: relay_chain_rpc_client.clone(), - spawn_handle: task_manager.spawn_handle(), - genesis_hash, - }) - .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; + build_collator_network(&config, task_manager.spawn_handle(), genesis_hash, best_header) + .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; let authority_discovery_service = build_authority_discovery_service( &task_manager, @@ -180,12 +179,9 @@ async fn new_minimal_relay_chain( peer_set_protocol_names, }; - let overseer_handle = collator_overseer::spawn_overseer( - overseer_args, - &task_manager, - relay_chain_rpc_client.clone(), - ) - .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; + let overseer_handle = + collator_overseer::spawn_overseer(overseer_args, &task_manager, relay_chain_rpc_client) + .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; network_starter.start_network(); diff --git a/client/relay-chain-minimal-node/src/network.rs b/client/relay-chain-minimal-node/src/network.rs index 0a4ace78ca5..4dff55a65de 100644 --- a/client/relay-chain-minimal-node/src/network.rs +++ b/client/relay-chain-minimal-node/src/network.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use polkadot_core_primitives::{Block, Hash}; +use polkadot_core_primitives::{Block, Hash, Header}; use sp_runtime::traits::{Block as BlockT, NumberFor}; use sc_network::{ @@ -24,45 +24,32 @@ use sc_network::{ NetworkService, }; -use sc_client_api::HeaderBackend; use sc_network_common::{role::Roles, sync::message::BlockAnnouncesHandshake}; use sc_service::{error::Error, Configuration, NetworkStarter, SpawnTaskHandle}; use std::{iter, sync::Arc}; -use crate::BlockChainRpcClient; - -pub(crate) struct BuildCollatorNetworkParams<'a> { - /// The service configuration. - pub config: &'a Configuration, - /// A shared client returned by `new_full_parts`. - pub client: Arc, - /// A handle for spawning tasks. - pub spawn_handle: SpawnTaskHandle, - /// Genesis hash - pub genesis_hash: Hash, -} - /// Build the network service, the network status sinks and an RPC sender. pub(crate) fn build_collator_network( - params: BuildCollatorNetworkParams, + config: &Configuration, + spawn_handle: SpawnTaskHandle, + genesis_hash: Hash, + best_header: Header, ) -> Result< (Arc>, NetworkStarter, Box), Error, > { - let BuildCollatorNetworkParams { config, client, spawn_handle, genesis_hash } = params; - let protocol_id = config.protocol_id(); let block_announce_config = get_block_announce_proto_config::( protocol_id.clone(), &None, Roles::from(&config.role), - client.info().best_number, - client.info().best_hash, + best_header.number, + best_header.hash(), genesis_hash, ); - let network_params = sc_network::config::Params { + let network_params = sc_network::config::Params:: { role: config.role.clone(), executor: { let spawn_handle = Clone::clone(&spawn_handle); @@ -72,7 +59,7 @@ pub(crate) fn build_collator_network( }, fork_id: None, network_config: config.network.clone(), - chain: client.clone(), + genesis_hash, protocol_id, metrics_registry: config.prometheus_config.as_ref().map(|config| config.registry.clone()), block_announce_config, From e0a27e68ef9a8770c9427a1e7a43aad89063e29d Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 27 Mar 2023 16:51:56 +0200 Subject: [PATCH 065/339] Added `receive_reserve_asset_deposited_from_different_consensus_works` --- parachains/runtimes/assets/common/src/lib.rs | 1 + .../assets/common/src/location_conversion.rs | 152 ++++++++++++++ .../assets/test-utils/src/test_cases.rs | 186 ++++++++++++++++++ .../assets/westmint/src/xcm_config.rs | 17 +- .../runtimes/assets/westmint/tests/tests.rs | 98 ++------- 5 files changed, 368 insertions(+), 86 deletions(-) create mode 100644 parachains/runtimes/assets/common/src/location_conversion.rs diff --git a/parachains/runtimes/assets/common/src/lib.rs b/parachains/runtimes/assets/common/src/lib.rs index 8a321ad97aa..6e29623d7e4 100644 --- a/parachains/runtimes/assets/common/src/lib.rs +++ b/parachains/runtimes/assets/common/src/lib.rs @@ -17,6 +17,7 @@ pub mod foreign_creators; pub mod fungible_conversion; +pub mod location_conversion; pub mod matching; pub mod runtime_api; diff --git a/parachains/runtimes/assets/common/src/location_conversion.rs b/parachains/runtimes/assets/common/src/location_conversion.rs new file mode 100644 index 00000000000..50e06f27b20 --- /dev/null +++ b/parachains/runtimes/assets/common/src/location_conversion.rs @@ -0,0 +1,152 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// TODO:check-parameter - is it worth to move it to the [`xcm-builder -> location_conversion.rs`]? + +use codec::Encode; +use frame_support::sp_io::hashing::blake2_256; +use sp_std::{borrow::Borrow, marker::PhantomData}; +use xcm::prelude::*; +use xcm_executor::traits::Convert; + +/// Tries to convert **foreign** global consensus parachain to accountId. +/// +/// **foreign** means `parents > 1` +/// +/// (E.g.: can be used for sovereign account conversion) +pub struct GlobalConsensusParachainConvert(PhantomData); + +impl + Clone> Convert + for GlobalConsensusParachainConvert +{ + fn convert_ref(location: impl Borrow) -> Result { + match location.borrow() { + MultiLocation { + parents, + interior: X2(GlobalConsensus(network), Parachain(para_id)), + } if parents > &1_u8 => + Ok(AccountId::from(GlobalConsensusParachainConvert::::from_params( + network, para_id, *parents, + ))), + _ => Err(()), + } + } + + fn reverse_ref(_: impl Borrow) -> Result { + // if this will be needed, we could implement some kind of guessing, if we have configuration for supported foreign networkId+paraId + Err(()) + } +} + +impl GlobalConsensusParachainConvert { + fn from_params(network: &NetworkId, para_id: &u32, parents: u8) -> [u8; 32] { + (network, para_id, parents).using_encoded(blake2_256) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn global_consensus_parachain_convert_works() { + let test_data = vec![ + ( + MultiLocation::new(0, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + false, + ), + ( + MultiLocation::new(1, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + false, + ), + ( + MultiLocation::new( + 2, + X3( + GlobalConsensus(ByGenesis([0; 32])), + Parachain(1000), + AccountId32 { network: None, id: [1; 32].into() }, + ), + ), + false, + ), + (MultiLocation::new(2, X1(GlobalConsensus(ByGenesis([0; 32])))), false), + (MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), + (MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), + (MultiLocation::new(4, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), + ( + MultiLocation::new(10, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + true, + ), + ]; + + for (location, expected_result) in test_data { + let result = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref(&location); + match result { + Ok(account) => { + assert_eq!( + true, expected_result, + "expected_result: {}, but conversion passed: {:?}, location: {:?}", + expected_result, account, location + ); + match &location { + MultiLocation { parents, interior: X2(GlobalConsensus(network), Parachain(para_id)) } => + assert_eq!( + account, + GlobalConsensusParachainConvert::<[u8; 32]>::from_params(network, para_id, *parents), + "expected_result: {}, but conversion passed: {:?}, location: {:?}", expected_result, account, location + ), + _ => assert_eq!( + true, + expected_result, + "expected_result: {}, conversion passed: {:?}, but MultiLocation does not match expected pattern, location: {:?}", expected_result, account, location + ) + } + }, + Err(_) => { + assert_eq!( + false, expected_result, + "expected_result: {} - but conversion failed, location: {:?}", + expected_result, location + ); + }, + } + } + + // all success + let res_2_1000 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + ) + .expect("conversion is ok"); + let res_2_1001 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1001))), + ) + .expect("conversion is ok"); + let res_3_1000 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( + MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + ) + .expect("conversion is ok"); + let res_3_1001 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( + MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1001))), + ) + .expect("conversion is ok"); + assert_ne!(res_2_1000, res_2_1001); + assert_ne!(res_2_1000, res_3_1000); + assert_ne!(res_2_1000, res_3_1001); + assert_ne!(res_2_1001, res_3_1000); + assert_ne!(res_2_1001, res_3_1001); + assert_ne!(res_3_1000, res_3_1001); + } +} diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index d64856f181a..2d2aa95ee49 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1767,3 +1767,189 @@ macro_rules! include_initiate_transfer_asset_via_bridge_for_native_asset_works( } } ); + +pub fn receive_reserve_asset_deposited_from_different_consensus_works< + Runtime, + XcmConfig, + LocationToAccountId, + ForeignAssetsPalletInstance, +>( + collator_session_keys: CollatorSessionKeys, + existential_deposit: BalanceOf, + target_account: AccountIdOf, + unwrap_pallet_xcm_event: Box) -> Option>>) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + cumulus_pallet_xcmp_queue::Config + + pallet_assets::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + <::Lookup as StaticLookup>::Source: + From<::AccountId>, + XcmConfig: xcm_executor::Config, + >::AssetId: + From + Into, + >::AssetIdParameter: + From + Into, + >::Balance: + From + Into, + LocationToAccountId: Convert>, + ForeignAssetsPalletInstance: 'static, +{ + let remote_parachain_sovereign_account = LocationToAccountId::convert_ref(MultiLocation { + parents: 2, + interior: X2(GlobalConsensus(Kusama), Parachain(1000)), + }) + .expect("Sovereign account works"); + let foreign_asset_id_multilocation = + MultiLocation { parents: 2, interior: X1(GlobalConsensus(Kusama)) }; + let buy_execution_fee_amount = 50000000000; + let reserve_asset_deposisted = 100_000_000; + + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_balances(vec![ + ( + remote_parachain_sovereign_account.clone(), + existential_deposit + buy_execution_fee_amount.into(), + ), + (target_account.clone(), existential_deposit), + ]) + .with_tracing() + .build() + .execute_with(|| { + // create foreign asset + let asset_minimum_asset_balance = 1_000_000_u128; + assert_ok!(>::force_create( + RuntimeHelper::::root_origin(), + foreign_asset_id_multilocation.clone().into(), + remote_parachain_sovereign_account.clone().into(), + false, + asset_minimum_asset_balance.into() + )); + + // check before + assert_eq!( + >::free_balance(&remote_parachain_sovereign_account), + existential_deposit + buy_execution_fee_amount.into() + ); + assert_eq!(>::free_balance(&target_account), existential_deposit); + assert_eq!(>::balance(foreign_asset_id_multilocation.into(), &target_account), 0.into()); + + // origin as BridgeHub + let origin = MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; + let xcm = Xcm(vec![ + UniversalOrigin(GlobalConsensus(Kusama)), + DescendOrigin(X1(Parachain(1000))), + WithdrawAsset(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(buy_execution_fee_amount), + }])), + BuyExecution { + fees: MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(buy_execution_fee_amount), + }, + weight_limit: Unlimited, + }, + ReserveAssetDeposited(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(Kusama)), + }), + fun: Fungible(reserve_asset_deposisted), + }])), + ClearOrigin, + DepositAsset { + assets: Definite(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(Kusama)), + }), + fun: Fungible(reserve_asset_deposisted), + }])), + beneficiary: MultiLocation { + parents: 0, + interior: X1(AccountId32 { + network: None, + id: target_account.clone().into(), + }), + }, + }, + ]); + + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + + // execute xcm as XcmpQueue would do + let outcome = XcmExecutor::::execute_xcm( + origin, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + ); + assert_eq!(outcome.ensure_complete(), Ok(())); + + // check after + assert!( + >::free_balance(&remote_parachain_sovereign_account) < + existential_deposit + buy_execution_fee_amount.into() + ); + assert_eq!(>::free_balance(&target_account), existential_deposit); + assert_eq!( + >::balance(foreign_asset_id_multilocation.into(), &target_account), + reserve_asset_deposisted.into() + ); + + // check asset trap (because big buy fee) + let mut pallet_xcm_events = >::events() + .into_iter() + .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())); + assert!(pallet_xcm_events.any(|e| match e { + pallet_xcm::Event::AssetsTrapped(_, trapped_for, _) => { + assert_eq!(trapped_for, origin, "We expect trapped assets for origin: {:?}, but it is trapped for: {:?}", origin, trapped_for); + true + }, + _ => false, + })); + }) +} + +#[macro_export] +macro_rules! include_receive_reserve_asset_deposited_from_different_consensus_works( + ( + $runtime:path, + $xcm_config:path, + $location_to_account_id:path, + $assets_pallet_instance:path, + $collator_session_key:expr, + $existential_deposit:expr, + $unwrap_pallet_xcm_event:expr + ) => { + #[test] + fn receive_reserve_asset_deposited_from_different_consensus_works() { + const BOB: [u8; 32] = [2u8; 32]; + let target_account = parachains_common::AccountId::from(BOB); + + asset_test_utils::test_cases::receive_reserve_asset_deposited_from_different_consensus_works::< + $runtime, + $xcm_config, + $location_to_account_id, + $assets_pallet_instance + >( + $collator_session_key, + $existential_deposit, + target_account, + $unwrap_pallet_xcm_event + ) + } + } +); diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 84f2192d434..76db4f0bdef 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -18,8 +18,11 @@ use super::{ ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; -use assets_common::matching::{ - FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, +use assets_common::{ + location_conversion::GlobalConsensusParachainConvert, + matching::{ + FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, + }, }; use frame_support::{ match_types, parameter_types, @@ -44,10 +47,7 @@ use xcm_builder::{ SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, WithComputedOrigin, }; -use xcm_executor::{ - traits::WithOriginFilter, - XcmExecutor, -}; +use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { pub const WestendLocation: MultiLocation = MultiLocation::parent(); @@ -71,6 +71,8 @@ pub type LocationToAccountId = ( SiblingParachainConvertsVia, // Straight up local `AccountId32` origins just alias directly to `AccountId`. AccountId32Aliases, + // Different global consensus parachain sovereign account + GlobalConsensusParachainConvert, ); /// Means for transacting the native currency on this chain. @@ -502,7 +504,8 @@ parameter_types! { // TODO:check-parameter - add new pallet and persist/manage this via governance? // Means, that we accept some `GlobalConsensus` from some `MultiLocation` (which is supposed to be our bridge-hub) pub TrustedBridgedNetworks: sp_std::vec::Vec<(MultiLocation, Junction)> = sp_std::vec![ - (MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, GlobalConsensus(NetworkId::Rococo)) + (MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, GlobalConsensus(NetworkId::Rococo)), + (MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, GlobalConsensus(NetworkId::Kusama)) ]; // TODO:check-parameter - add new pallet and persist/manage this via governance? // TODO:check-parameter - we specify here just trusted location, we can extend this with some AssetFilter patterns to trust only to several assets diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index f2203bedab0..98994ea2bf1 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -620,6 +620,25 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p }) ); +asset_test_utils::include_receive_reserve_asset_deposited_from_different_consensus_works!( + Runtime, + XcmConfig, + LocationToAccountId, + ForeignAssetsInstance, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }) +); + #[test] fn plain_receive_teleported_asset_works() { ExtBuilder::::default() @@ -645,82 +664,3 @@ fn plain_receive_teleported_asset_works() { assert_eq!(outcome.ensure_complete(), Ok(())); }) } - -#[test] -fn test_receive_bridged_xcm_reserve_asset_deposited_works() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .with_tracing() - .build() - .execute_with(|| { - use xcm_executor::traits::Convert; - // TODO:check-parameter - xcm origin of original and not bridge-hub? - let local_bridge_hub: MultiLocation = (Parent, Parachain(1014)).into(); - let local_bridge_hub_sovereign_account = - ForeignCreatorsSovereignAccountOf::convert_ref(local_bridge_hub) - .expect("converted bridge location as accountId"); - - // create foreign asset - let foreign_asset_id = - MultiLocation { parents: 2, interior: X1(GlobalConsensus(Rococo)) }; - let minimum_asset_balance = 1_000_000_u128; - assert_ok!(ForeignAssets::force_create( - // TODO:check-parameter - tests for create and real ForeignCreators check - // RuntimeHelper::::origin_of(local_bridge_hub_sovereign_account.clone()), - RuntimeHelper::::root_origin(), - foreign_asset_id.clone(), - local_bridge_hub_sovereign_account.into(), - false, - minimum_asset_balance - )); - - // check ForeinAssets before - assert_eq!(ForeignAssets::balance(foreign_asset_id, AccountId::from(ALICE)), 0); - - // simulate received message: - // 2023-01-31 22:14:18.393 DEBUG toki -runtime-worker xcm::execute_xcm: [Parachain] origin: MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, message: Xcm([UniversalOrigin(GlobalConsensus(Rococo)), DescendOrigin(X1(Parachain(1000))), ReserveAssetDeposited(MultiAssets([MultiAsset { id: Concrete(MultiLocation { parents: 2, interior: X1(GlobalConsensus(Kusama)) }), fun: Fungible(100000000) }])), ClearOrigin, DepositAsset { assets: Wild(All), beneficiary: MultiLocation { parents: 0, interior: X1(AccountId32 { network: None, id: [28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11, 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124] }) } }]) - // origin as BridgeHub - let origin = MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; - let xcm = Xcm(vec![ - UniversalOrigin(GlobalConsensus(Rococo)), - DescendOrigin(X1(Parachain(1000))), - UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - ReserveAssetDeposited(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(Rococo)), - }), - fun: Fungible(100_000_000), - }])), - ClearOrigin, - DepositAsset { - assets: Wild(All), - beneficiary: MultiLocation { - parents: 0, - interior: X1(AccountId32 { - network: None, - id: AccountId::from(ALICE).into(), - }), - }, - }, - ]); - - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let weight_limit = Weight::from_parts(41666666666, 0); - - // execute xcm as XcmpQueue would do - let outcome = XcmExecutor::::execute_xcm(origin, xcm, hash, weight_limit); - assert_eq!(outcome.ensure_complete(), Ok(())); - - // check ForeinAssets after - assert_eq!( - ForeignAssets::balance(foreign_asset_id, AccountId::from(ALICE)), - 100_000_000 - ); - }) -} From 0ef1444c48b33e175f12c9f6893f47a1f3cee1c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 11:08:38 +0200 Subject: [PATCH 066/339] Bump scale-info from 2.3.1 to 2.4.0 (#2386) Bumps [scale-info](https://github.com/paritytech/scale-info) from 2.3.1 to 2.4.0. - [Release notes](https://github.com/paritytech/scale-info/releases) - [Changelog](https://github.com/paritytech/scale-info/blob/master/CHANGELOG.md) - [Commits](https://github.com/paritytech/scale-info/compare/v2.3.1...v2.4.0) --- updated-dependencies: - dependency-name: scale-info dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- pallets/aura-ext/Cargo.toml | 2 +- pallets/collator-selection/Cargo.toml | 2 +- pallets/dmp-queue/Cargo.toml | 2 +- pallets/parachain-system/Cargo.toml | 2 +- pallets/solo-to-para/Cargo.toml | 2 +- pallets/xcm/Cargo.toml | 2 +- pallets/xcmp-queue/Cargo.toml | 2 +- parachain-template/runtime/Cargo.toml | 2 +- parachains/common/Cargo.toml | 2 +- parachains/pallets/parachain-info/Cargo.toml | 2 +- parachains/pallets/ping/Cargo.toml | 2 +- parachains/runtimes/assets/statemine/Cargo.toml | 2 +- parachains/runtimes/assets/statemint/Cargo.toml | 2 +- parachains/runtimes/assets/westmint/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- .../runtimes/collectives/collectives-polkadot/Cargo.toml | 2 +- parachains/runtimes/contracts/contracts-rococo/Cargo.toml | 2 +- parachains/runtimes/starters/seedling/Cargo.toml | 2 +- parachains/runtimes/starters/shell/Cargo.toml | 2 +- parachains/runtimes/testing/penpal/Cargo.toml | 2 +- parachains/runtimes/testing/rococo-parachain/Cargo.toml | 2 +- primitives/parachain-inherent/Cargo.toml | 2 +- test/runtime/Cargo.toml | 2 +- 26 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fee1e2f3fc4..ba9fbd564c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11229,9 +11229,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "001cf62ece89779fd16105b5f515ad0e5cedcd5440d3dd806bb067978e7c3608" +checksum = "61471dff9096de1d8b2319efed7162081e96793f5ebb147e50db10d50d648a4d" dependencies = [ "bitvec", "cfg-if", @@ -11243,9 +11243,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "303959cf613a6f6efd19ed4b4ad5bf79966a13352716299ad532cfb115f4205c" +checksum = "219580e803a66b3f05761fd06f1f879a872444e49ce23f73694d26e5a954c7e6" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/pallets/aura-ext/Cargo.toml b/pallets/aura-ext/Cargo.toml index 21a558348a7..6eaf27c96ed 100644 --- a/pallets/aura-ext/Cargo.toml +++ b/pallets/aura-ext/Cargo.toml @@ -7,7 +7,7 @@ description = "AURA consensus extension pallet for parachains" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/collator-selection/Cargo.toml b/pallets/collator-selection/Cargo.toml index 5d7f0aae3f6..9629c7de5cf 100644 --- a/pallets/collator-selection/Cargo.toml +++ b/pallets/collator-selection/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] log = { version = "0.4.17", default-features = false } codec = { default-features = false, features = ["derive"], package = "parity-scale-codec", version = "3.0.0" } rand = { version = "0.8.5", features = ["std_rng"], default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/pallets/dmp-queue/Cargo.toml b/pallets/dmp-queue/Cargo.toml index 313c53dd859..bbf19ad62be 100644 --- a/pallets/dmp-queue/Cargo.toml +++ b/pallets/dmp-queue/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/parachain-system/Cargo.toml b/pallets/parachain-system/Cargo.toml index a1018cf65bf..e793ddc4c19 100644 --- a/pallets/parachain-system/Cargo.toml +++ b/pallets/parachain-system/Cargo.toml @@ -11,7 +11,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = environmental = { version = "1.1.4", default-features = false } impl-trait-for-tuples = "0.2.1" log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/solo-to-para/Cargo.toml b/pallets/solo-to-para/Cargo.toml index 4d5f8771c0d..ddc2ca56a3b 100644 --- a/pallets/solo-to-para/Cargo.toml +++ b/pallets/solo-to-para/Cargo.toml @@ -7,7 +7,7 @@ description = "Adds functionality to migrate from a Solo to a Parachain" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/xcm/Cargo.toml b/pallets/xcm/Cargo.toml index f207fc37085..e9404b3500d 100644 --- a/pallets/xcm/Cargo.toml +++ b/pallets/xcm/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/xcmp-queue/Cargo.toml b/pallets/xcmp-queue/Cargo.toml index 48ebde53311..acd440f5818 100644 --- a/pallets/xcmp-queue/Cargo.toml +++ b/pallets/xcmp-queue/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } log = { version = "0.4.17", default-features = false } rand_chacha = { version = "0.3.0", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachain-template/runtime/Cargo.toml b/parachain-template/runtime/Cargo.toml index 704c9ea39c3..3724596ceb7 100644 --- a/parachain-template/runtime/Cargo.toml +++ b/parachain-template/runtime/Cargo.toml @@ -18,7 +18,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Local diff --git a/parachains/common/Cargo.toml b/parachains/common/Cargo.toml index 4b525c4525d..f89544d8241 100644 --- a/parachains/common/Cargo.toml +++ b/parachains/common/Cargo.toml @@ -10,7 +10,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"], default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } diff --git a/parachains/pallets/parachain-info/Cargo.toml b/parachains/pallets/parachain-info/Cargo.toml index ee453bc1846..270cc869a19 100644 --- a/parachains/pallets/parachain-info/Cargo.toml +++ b/parachains/pallets/parachain-info/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/pallets/ping/Cargo.toml b/parachains/pallets/ping/Cargo.toml index 0e9a1af8693..fbfcc703644 100644 --- a/parachains/pallets/ping/Cargo.toml +++ b/parachains/pallets/ping/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index 31f34516a5c..694f19a274b 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -9,7 +9,7 @@ description = "Kusama variant of Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.3.4" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/assets/statemint/Cargo.toml b/parachains/runtimes/assets/statemint/Cargo.toml index a8de1be1994..cee4c46dbb2 100644 --- a/parachains/runtimes/assets/statemint/Cargo.toml +++ b/parachains/runtimes/assets/statemint/Cargo.toml @@ -9,7 +9,7 @@ description = "Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/westmint/Cargo.toml index c08d432ec33..dc2574e8b8a 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/westmint/Cargo.toml @@ -9,7 +9,7 @@ description = "Westend variant of Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index 4dbbd829c88..5428dc08a43 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } serde = { version = "1.0.156", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 692345116b4..51765638c7f 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } serde = { version = "1.0.156", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 4512d45d505..43d9484658d 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } serde = { version = "1.0.156", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml index 77c08d63c6f..04609ca594c 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml +++ b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml @@ -9,7 +9,7 @@ description = "Polkadot Collectives Parachain Runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index a43fce8e1ca..fcca53c1695 100644 --- a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -14,7 +14,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/starters/seedling/Cargo.toml b/parachains/runtimes/starters/seedling/Cargo.toml index 7bf6b85dd3f..f26906da461 100644 --- a/parachains/runtimes/starters/seedling/Cargo.toml +++ b/parachains/runtimes/starters/seedling/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/starters/shell/Cargo.toml b/parachains/runtimes/starters/shell/Cargo.toml index e36d5a30393..22efd8f8bef 100644 --- a/parachains/runtimes/starters/shell/Cargo.toml +++ b/parachains/runtimes/starters/shell/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/testing/penpal/Cargo.toml b/parachains/runtimes/testing/penpal/Cargo.toml index 3e2af43ce63..85d115f06ac 100644 --- a/parachains/runtimes/testing/penpal/Cargo.toml +++ b/parachains/runtimes/testing/penpal/Cargo.toml @@ -18,7 +18,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.16", default-features = false } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/testing/rococo-parachain/Cargo.toml b/parachains/runtimes/testing/rococo-parachain/Cargo.toml index 65cd4bafeaa..14ea9a04292 100644 --- a/parachains/runtimes/testing/rococo-parachain/Cargo.toml +++ b/parachains/runtimes/testing/rococo-parachain/Cargo.toml @@ -7,7 +7,7 @@ description = "Simple runtime used by the rococo parachain(s)" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } # Substrate frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } diff --git a/primitives/parachain-inherent/Cargo.toml b/primitives/parachain-inherent/Cargo.toml index 361d0e328ba..7fec7149975 100644 --- a/primitives/parachain-inherent/Cargo.toml +++ b/primitives/parachain-inherent/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] async-trait = { version = "0.1.68", optional = true } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } tracing = { version = "0.1.37", optional = true } # Substrate diff --git a/test/runtime/Cargo.toml b/test/runtime/Cargo.toml index c4e350b20b3..be7c531f57f 100644 --- a/test/runtime/Cargo.toml +++ b/test/runtime/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } From 72d4010ea9b55e87d9014564106f9275c02c063a Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 28 Mar 2023 13:08:44 +0200 Subject: [PATCH 067/339] Renamed Bridges -> AllowedExporters --- .../bridge-transfer/src/benchmarking.rs | 29 +++-- parachains/pallets/bridge-transfer/src/lib.rs | 109 +++++++++------- .../pallets/bridge-transfer/src/weights.rs | 18 +-- .../runtimes/assets/statemine/src/lib.rs | 2 +- .../src/weights/pallet_bridge_transfer.rs | 6 +- .../assets/statemine/src/xcm_config.rs | 14 ++- .../assets/test-utils/src/test_cases.rs | 116 +++++++++++------- 7 files changed, 181 insertions(+), 113 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index db971b09f6b..2232be996c8 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -17,7 +17,7 @@ //! `BridgeTransfer` pallet benchmarks. -use crate::{BenchmarkHelper, Bridges, Call, Config, Event, Pallet, PingMessageBuilder}; +use crate::{AllowedExporters, BenchmarkHelper, Call, Config, Event, Pallet, PingMessageBuilder}; use frame_benchmarking::{benchmarks, BenchmarkError, BenchmarkResult}; use frame_support::{traits::EnsureOrigin, weights::Weight}; @@ -31,7 +31,7 @@ benchmarks! { // let a in 1 .. 1; let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); let (origin, assets, destination) = T::BenchmarkHelper::prepare_asset_transfer(1); - Bridges::::insert(bridged_network, bridge_config); + AllowedExporters::::insert(bridged_network, bridge_config); }: _(origin, Box::new(assets), Box::new(destination)) verify { // we don't care about message hash here, just check that the transfer has been initiated @@ -42,7 +42,7 @@ benchmarks! { ping_via_bridge { let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); - Bridges::::insert(bridged_network, bridge_config); + AllowedExporters::::insert(bridged_network, bridge_config); let (origin, destination) = T::BenchmarkHelper::prepare_ping(); @@ -63,32 +63,35 @@ benchmarks! { assert!(matches!(actual_event, Some(expected_event))); } - add_bridge_config { + add_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); }: _(origin, bridged_network, Box::new(bridge_config.clone())) verify { - assert_eq!(Bridges::::get(bridged_network), Some(bridge_config)); + assert_eq!(AllowedExporters::::get(bridged_network), Some(bridge_config)); } - remove_bridge_config { + remove_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); - Bridges::::insert(bridged_network, bridge_config); + AllowedExporters::::insert(bridged_network, bridge_config); }: _(origin, bridged_network) verify { - assert_eq!(Bridges::::get(bridged_network), None); + assert_eq!(AllowedExporters::::get(bridged_network), None); } - update_bridge_config { + update_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); - Bridges::::insert(bridged_network, bridge_config); + AllowedExporters::::insert(bridged_network, bridge_config); - let fee = None; - }: _(origin, bridged_network, fee) + let bridge_location_fee = None; + let target_location_fee = T::BenchmarkHelper::target_location_fee_for_update(); + }: _(origin, bridged_network, bridge_location_fee.clone(), target_location_fee.clone()) verify { - assert_eq!(Bridges::::get(bridged_network).unwrap().fee, None); + let exporter = AllowedExporters::::get(bridged_network).unwrap(); + assert_eq!(exporter.bridge_location_fee, bridge_location_fee); + assert_eq!(exporter.allowed_target_location, target_location_fee.map(|fee| MultiAsset::try_from(*fee).unwrap())); } impl_benchmark_test_suite!(Pallet, crate::tests::new_test_ext(), crate::tests::TestRuntime); diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 0f8c2290d7b..17b49994a53 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -101,6 +101,9 @@ pub mod pallet { /// to support transfer to this destination **after** `prepare_asset_transfer` call. fn bridge_config() -> (NetworkId, BridgeConfig); + /// Returns some fee, which will be used for `update_exporter_config`. + fn target_location_fee_for_update() -> Option>; + /// Prepare environment for assets transfer and return transfer origin and assets /// to transfer. After this function is called, we expect `transfer_asset_via_bridge` /// to succeed, so in proper environment, it should: @@ -135,9 +138,6 @@ pub mod pallet { /// The overarching event type. type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// XCM sender which sends messages to the BridgeHub - type BridgeXcmSender: SendXcm; - /// Runtime's universal location type UniversalLocation: Get; @@ -150,12 +150,12 @@ pub mod pallet { /// The configurable origin to allow bridges configuration management type AdminOrigin: EnsureOrigin; + /// XCM sender which sends messages to the BridgeHub + type BridgeXcmSender: SendXcm; /// Required origin for asset transfer. If successful, it resolves to `MultiLocation`. type TransferAssetOrigin: EnsureOrigin; - /// Required origin for ping transfer. If successful, it resolves to `MultiLocation`. type TransferPingOrigin: EnsureOrigin; - /// Configurable ping message, `None` means no message will be transferred. type PingMessageBuilder: PingMessageBuilder; @@ -164,10 +164,11 @@ pub mod pallet { type BenchmarkHelper: BenchmarkHelper; } - /// Details of configured bridges which are allowed for transfer. + /// Details of configured bridges which are allowed for **transfer out**. #[pallet::storage] - #[pallet::getter(fn bridges)] - pub(super) type Bridges = StorageMap<_, Blake2_128Concat, NetworkId, BridgeConfig>; + #[pallet::getter(fn allowed_exporters)] + pub(super) type AllowedExporters = + StorageMap<_, Blake2_128Concat, NetworkId, BridgeConfig>; #[pallet::error] #[cfg_attr(test, derive(PartialEq))] @@ -348,14 +349,17 @@ pub mod pallet { /// * `bridged_network`: Network where we want to allow transfer funds /// * `bridge_config`: contains location for BridgeHub in our network + fee #[pallet::call_index(1)] - #[pallet::weight(T::WeightInfo::add_bridge_config())] - pub fn add_bridge_config( + #[pallet::weight(T::WeightInfo::add_exporter_config())] + pub fn add_exporter_config( origin: OriginFor, bridged_network: NetworkId, bridge_config: Box, ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; - ensure!(!Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); + ensure!( + !AllowedExporters::::contains_key(bridged_network), + Error::::InvalidConfiguration + ); let allowed_target_location_network = bridge_config .allowed_target_location .interior() @@ -371,7 +375,7 @@ pub mod pallet { .map_err(|_| Error::::InvalidConfiguration)?; ensure!(bridged_network != local_network, Error::::InvalidConfiguration); - Bridges::::insert(bridged_network, bridge_config); + AllowedExporters::::insert(bridged_network, bridge_config); Self::deposit_event(Event::BridgeAdded); Ok(()) } @@ -382,15 +386,18 @@ pub mod pallet { /// /// * `bridged_network`: Network where we want to remove #[pallet::call_index(2)] - #[pallet::weight(T::WeightInfo::remove_bridge_config())] - pub fn remove_bridge_config( + #[pallet::weight(T::WeightInfo::remove_exporter_config())] + pub fn remove_exporter_config( origin: OriginFor, bridged_network: NetworkId, ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; - ensure!(Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); + ensure!( + AllowedExporters::::contains_key(bridged_network), + Error::::InvalidConfiguration + ); - Bridges::::remove(bridged_network); + AllowedExporters::::remove(bridged_network); Self::deposit_event(Event::BridgeRemoved); Ok(()) } @@ -402,17 +409,28 @@ pub mod pallet { /// * `bridged_network`: Network where we want to remove /// * `fee`: New fee to update #[pallet::call_index(3)] - #[pallet::weight(T::WeightInfo::update_bridge_config())] - pub fn update_bridge_config( + #[pallet::weight(T::WeightInfo::update_exporter_config())] + pub fn update_exporter_config( origin: OriginFor, bridged_network: NetworkId, - bridge_location_fee: Option, - target_location_fee: Option, + bridge_location_fee: Option>, + target_location_fee: Option>, ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; - ensure!(Bridges::::contains_key(bridged_network), Error::::InvalidConfiguration); + ensure!( + AllowedExporters::::contains_key(bridged_network), + Error::::InvalidConfiguration + ); + let bridge_location_fee = bridge_location_fee + .map(|fee| MultiAsset::try_from(*fee)) + .transpose() + .map_err(|_| Error::::InvalidConfiguration)?; + let target_location_fee = target_location_fee + .map(|fee| MultiAsset::try_from(*fee)) + .transpose() + .map_err(|_| Error::::InvalidConfiguration)?; - Bridges::::try_mutate_exists(bridged_network, |bridge_config| { + AllowedExporters::::try_mutate_exists(bridged_network, |bridge_config| { let bridge_config = bridge_config.as_mut().ok_or(Error::::InvalidConfiguration)?; bridge_config.bridge_location_fee = bridge_location_fee; @@ -444,7 +462,7 @@ pub mod pallet { .global_consensus() .map_err(|_| Error::::UnsupportedDestination)?; ensure!(local_network != remote_network, Error::::UnsupportedDestination); - match Bridges::::get(remote_network) { + match AllowedExporters::::get(remote_network) { Some(bridge_config) => { ensure!( // TODO:check-parameter - verify and prepare test for ETH scenario - https://github.com/paritytech/cumulus/pull/2013#discussion_r1094909290 @@ -461,7 +479,7 @@ pub mod pallet { } fn get_bridge_for(network: &NetworkId) -> Option { - Bridges::::get(network) + AllowedExporters::::get(network) } fn initiate_bridge_transfer( @@ -759,11 +777,11 @@ pub(crate) mod tests { impl Config for TestRuntime { type RuntimeEvent = RuntimeEvent; - type BridgeXcmSender = TestBridgeXcmSender; type UniversalLocation = UniversalLocation; type WeightInfo = (); type AssetTransactor = CurrencyTransactor; type AdminOrigin = EnsureRoot; + type BridgeXcmSender = TestBridgeXcmSender; type TransferAssetOrigin = EnsureXcmOrigin; type TransferPingOrigin = EnsureXcmOrigin; type PingMessageBuilder = UnpaidTrapMessageBuilder; @@ -801,7 +819,7 @@ pub(crate) mod tests { // insert bridge config let bridge_network = Wococo; let bridge_config = test_bridge_config().1; - assert_ok!(BridgeTransfer::add_bridge_config( + assert_ok!(BridgeTransfer::add_exporter_config( RuntimeOrigin::root(), bridge_network, Box::new(bridge_config.clone()), @@ -876,12 +894,12 @@ pub(crate) mod tests { // insert bridge config let bridged_network = Wococo; - assert_ok!(BridgeTransfer::add_bridge_config( + assert_ok!(BridgeTransfer::add_exporter_config( RuntimeOrigin::root(), bridged_network, Box::new(test_bridge_config().1), )); - let bridge_location = Bridges::::get(bridged_network) + let bridge_location = AllowedExporters::::get(bridged_network) .expect("stored BridgeConfig for bridged_network") .bridge_location; @@ -960,7 +978,7 @@ pub(crate) mod tests { new_test_ext().execute_with(|| { // insert bridge config let bridged_network = Wococo; - assert_ok!(BridgeTransfer::add_bridge_config( + assert_ok!(BridgeTransfer::add_exporter_config( RuntimeOrigin::root(), bridged_network, Box::new(test_bridge_config().1), @@ -1025,11 +1043,11 @@ pub(crate) mod tests { let dummy_remote_interior_multilocation = X1(Parachain(1234)); new_test_ext().execute_with(|| { - assert_eq!(Bridges::::iter().count(), 0); + assert_eq!(AllowedExporters::::iter().count(), 0); // should fail - just root is allowed assert_noop!( - BridgeTransfer::add_bridge_config( + BridgeTransfer::add_exporter_config( RuntimeOrigin::signed(account(1)), bridged_network, bridged_config.clone(), @@ -1039,7 +1057,7 @@ pub(crate) mod tests { // should fail - bridged_network should match allowed_target_location assert_noop!( - BridgeTransfer::add_bridge_config(RuntimeOrigin::root(), bridged_network, { + BridgeTransfer::add_exporter_config(RuntimeOrigin::root(), bridged_network, { let remote_network = Westend; assert_ne!(bridged_network, remote_network); Box::new(test_bridge_config().1) @@ -1052,7 +1070,7 @@ pub(crate) mod tests { ); // should fail - bridged_network must be different global consensus than our `UniversalLocation` assert_noop!( - BridgeTransfer::add_bridge_config( + BridgeTransfer::add_exporter_config( RuntimeOrigin::root(), UniversalLocation::get().global_consensus().expect("any `NetworkId`"), bridged_config.clone() @@ -1063,7 +1081,7 @@ pub(crate) mod tests { message: Some("InvalidConfiguration") }) ); - assert_eq!(Bridges::::iter().count(), 0); + assert_eq!(AllowedExporters::::iter().count(), 0); assert_eq!( BridgeTransfer::exporter_for( &bridged_network, @@ -1074,14 +1092,17 @@ pub(crate) mod tests { ); // add with root - assert_ok!(BridgeTransfer::add_bridge_config( + assert_ok!(BridgeTransfer::add_exporter_config( RuntimeOrigin::root(), bridged_network, bridged_config.clone(), )); - assert_eq!(Bridges::::iter().count(), 1); - assert_eq!(Bridges::::get(bridged_network), Some(*bridged_config.clone())); - assert_eq!(Bridges::::get(Wococo), None); + assert_eq!(AllowedExporters::::iter().count(), 1); + assert_eq!( + AllowedExporters::::get(bridged_network), + Some(*bridged_config.clone()) + ); + assert_eq!(AllowedExporters::::get(Wococo), None); assert_eq!( BridgeTransfer::exporter_for( &bridged_network, @@ -1101,15 +1122,15 @@ pub(crate) mod tests { // update fee // remove - assert_ok!(BridgeTransfer::update_bridge_config( + assert_ok!(BridgeTransfer::update_exporter_config( RuntimeOrigin::root(), bridged_network, Some((Parent, 200u128).into()), Some((Parent, 300u128).into()), )); - assert_eq!(Bridges::::iter().count(), 1); + assert_eq!(AllowedExporters::::iter().count(), 1); assert_eq!( - Bridges::::get(bridged_network), + AllowedExporters::::get(bridged_network), Some(BridgeConfig { bridge_location: bridged_config.bridge_location.clone(), bridge_location_fee: Some((Parent, 200u128).into()), @@ -1127,12 +1148,12 @@ pub(crate) mod tests { ); // remove - assert_ok!(BridgeTransfer::remove_bridge_config( + assert_ok!(BridgeTransfer::remove_exporter_config( RuntimeOrigin::root(), bridged_network, )); - assert_eq!(Bridges::::get(bridged_network), None); - assert_eq!(Bridges::::iter().count(), 0); + assert_eq!(AllowedExporters::::get(bridged_network), None); + assert_eq!(AllowedExporters::::iter().count(), 0); }) } } diff --git a/parachains/pallets/bridge-transfer/src/weights.rs b/parachains/pallets/bridge-transfer/src/weights.rs index 34ef6694d40..be95c3934fa 100644 --- a/parachains/pallets/bridge-transfer/src/weights.rs +++ b/parachains/pallets/bridge-transfer/src/weights.rs @@ -29,12 +29,12 @@ pub trait WeightInfo { /// Weight of the `ping_via_bridge` call. fn ping_via_bridge() -> Weight; - /// Weight of the `add_bridge_config` call. - fn add_bridge_config() -> Weight; - /// Weight of the `remove_bridge_config` call. - fn remove_bridge_config() -> Weight; - /// Weight of the `update_bridge_config` call. - fn update_bridge_config() -> Weight; + /// Weight of the `add_exporter_config` call. + fn add_exporter_config() -> Weight; + /// Weight of the `remove_exporter_config` call. + fn remove_exporter_config() -> Weight; + /// Weight of the `update_exporter_config` call. + fn update_exporter_config() -> Weight; } // Zero weights to use in tests @@ -47,15 +47,15 @@ impl WeightInfo for () { Weight::zero() } - fn add_bridge_config() -> Weight { + fn add_exporter_config() -> Weight { Weight::zero() } - fn remove_bridge_config() -> Weight { + fn remove_exporter_config() -> Weight { Weight::zero() } - fn update_bridge_config() -> Weight { + fn update_exporter_config() -> Weight { Weight::zero() } } diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 8af55eaedeb..77d99e58919 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -697,11 +697,11 @@ impl pallet_nfts::Config for Runtime { impl pallet_bridge_transfer::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type BridgeXcmSender = BridgeXcmSender; type UniversalLocation = UniversalLocation; type WeightInfo = weights::pallet_bridge_transfer::WeightInfo; type AssetTransactor = AssetTransactors; type AdminOrigin = AssetsForceOrigin; + type BridgeXcmSender = BridgeXcmSender; type TransferAssetOrigin = EnsureXcmOrigin; type TransferPingOrigin = EnsureXcmOrigin; type PingMessageBuilder = pallet_bridge_transfer::UnpaidTrapMessageBuilder>; diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs index dcc6f0204ed..032b6776aa5 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -104,7 +104,7 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< } /// Storage: BridgeTransfer Bridges (r:1 w:1) /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) - fn add_bridge_config() -> Weight { + fn add_exporter_config() -> Weight { // Proof Size summary in bytes: // Measured: `109` // Estimated: `5364` @@ -116,7 +116,7 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< } /// Storage: BridgeTransfer Bridges (r:1 w:1) /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) - fn remove_bridge_config() -> Weight { + fn remove_exporter_config() -> Weight { // Proof Size summary in bytes: // Measured: `164` // Estimated: `5364` @@ -128,7 +128,7 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< } /// Storage: BridgeTransfer Bridges (r:1 w:1) /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) - fn update_bridge_config() -> Weight { + fn update_exporter_config() -> Weight { // Proof Size summary in bytes: // Measured: `164` // Estimated: `5364` diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index be768a06013..d75411be4fd 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -521,6 +521,8 @@ impl BridgeTransferBenchmarksHelper { MultiLocation::new(2, X2(GlobalConsensus(Polkadot), Parachain(1000))) } + fn target_location_fee() -> MultiAsset {} + /// Identifier of the sibling bridge-hub parachain. fn bridge_hub_para_id() -> u32 { 1013 @@ -534,15 +536,23 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe Polkadot, pallet_bridge_transfer::BridgeConfig { bridge_location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), - allowed_target_location: Self::allowed_target_location(), // TODO: right now `UnpaidRemoteExporter` is used to send XCM messages and it requires // fee to be `None`. If we're going to change that (are we?), then we should replace // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` - fee: None, + bridge_location_fee: None, + allowed_target_location: Self::allowed_target_location(), + target_location_fee: None, }, ) } + fn target_location_fee_for_update() -> Option> { + Some(Box::new(xcm::VersionedMultiAsset::V3(MultiAsset { + id: Concrete(MultiLocation::parent()), + fun: Fungible(50_000_000), + }))) + } + fn prepare_asset_transfer( assets_count: u32, ) -> (RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation) { diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 2d2aa95ee49..7cc9c9cdae6 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -32,7 +32,8 @@ use sp_runtime::{ DispatchError, Saturating, }; use xcm::{ - latest::prelude::*, CreateMatcher, MatchXcm, VersionedMultiAssets, VersionedMultiLocation, + latest::prelude::*, CreateMatcher, MatchXcm, VersionedMultiAsset, VersionedMultiAssets, + VersionedMultiLocation, }; use xcm_executor::{traits::Convert, XcmExecutor}; @@ -1392,11 +1393,12 @@ pub fn can_governance_change_bridge_transfer_configuration( }; // check no cfg - assert!(pallet_bridge_transfer::Pallet::::bridges(&bridged_network).is_none()); + assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) + .is_none()); // governance can add bridge config assert_ok!(execute_as_governance( - pallet_bridge_transfer::Call::::add_bridge_config { + pallet_bridge_transfer::Call::::add_exporter_config { bridged_network, bridge_config: Box::new(bridge_config.clone()), }, @@ -1407,7 +1409,8 @@ pub fn can_governance_change_bridge_transfer_configuration( .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeAdded))); { - let cfg = pallet_bridge_transfer::Pallet::::bridges(&bridged_network); + let cfg = + pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network); assert!(cfg.is_some()); let cfg = cfg.unwrap(); assert_eq!(cfg.bridge_location, bridge_config.bridge_location); @@ -1422,10 +1425,14 @@ pub fn can_governance_change_bridge_transfer_configuration( let new_target_location_fee: MultiAsset = (Concrete(MultiLocation::parent()), 1_000_000).into(); assert_ok!(execute_as_governance( - pallet_bridge_transfer::Call::::update_bridge_config { + pallet_bridge_transfer::Call::::update_exporter_config { bridged_network, - bridge_location_fee: Some(new_bridge_location_fee.clone()), - target_location_fee: Some(new_target_location_fee.clone()), + bridge_location_fee: Some(Box::new(VersionedMultiAsset::V3( + new_bridge_location_fee.clone() + ))), + target_location_fee: Some(Box::new(VersionedMultiAsset::V3( + new_target_location_fee.clone() + ))), }, ) .ensure_complete()); @@ -1434,7 +1441,8 @@ pub fn can_governance_change_bridge_transfer_configuration( .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeUpdated))); { - let cfg = pallet_bridge_transfer::Pallet::::bridges(&bridged_network); + let cfg = + pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network); assert!(cfg.is_some()); let cfg = cfg.unwrap(); assert_eq!(cfg.bridge_location, bridge_config.bridge_location); @@ -1445,10 +1453,11 @@ pub fn can_governance_change_bridge_transfer_configuration( // governance can remove bridge config assert_ok!(execute_as_governance( - pallet_bridge_transfer::Call::::remove_bridge_config { bridged_network }, + pallet_bridge_transfer::Call::::remove_exporter_config { bridged_network }, ) .ensure_complete()); - assert!(pallet_bridge_transfer::Pallet::::bridges(&bridged_network).is_none()); + assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) + .is_none()); assert!(>::events() .into_iter() .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) @@ -1580,7 +1589,7 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< ); // insert bridge config - assert_ok!(>::add_bridge_config( + assert_ok!(>::add_exporter_config( RuntimeHelper::::root_origin(), bridged_network, Box::new(bridge_config), @@ -1777,30 +1786,31 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< collator_session_keys: CollatorSessionKeys, existential_deposit: BalanceOf, target_account: AccountIdOf, - unwrap_pallet_xcm_event: Box) -> Option>>) where + unwrap_pallet_xcm_event: Box) -> Option>>, +) where Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config - + pallet_assets::Config, + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + cumulus_pallet_xcmp_queue::Config + + pallet_assets::Config, AccountIdOf: Into<[u8; 32]>, ValidatorIdOf: From>, BalanceOf: From, ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, <::Lookup as StaticLookup>::Source: - From<::AccountId>, + From<::AccountId>, XcmConfig: xcm_executor::Config, >::AssetId: - From + Into, + From + Into, >::AssetIdParameter: - From + Into, + From + Into, >::Balance: - From + Into, + From + Into, LocationToAccountId: Convert>, ForeignAssetsPalletInstance: 'static, { @@ -1808,7 +1818,7 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< parents: 2, interior: X2(GlobalConsensus(Kusama), Parachain(1000)), }) - .expect("Sovereign account works"); + .expect("Sovereign account works"); let foreign_asset_id_multilocation = MultiLocation { parents: 2, interior: X1(GlobalConsensus(Kusama)) }; let buy_execution_fee_amount = 50000000000; @@ -1829,21 +1839,34 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< .execute_with(|| { // create foreign asset let asset_minimum_asset_balance = 1_000_000_u128; - assert_ok!(>::force_create( - RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation.clone().into(), - remote_parachain_sovereign_account.clone().into(), - false, - asset_minimum_asset_balance.into() - )); + assert_ok!( + >::force_create( + RuntimeHelper::::root_origin(), + foreign_asset_id_multilocation.clone().into(), + remote_parachain_sovereign_account.clone().into(), + false, + asset_minimum_asset_balance.into() + ) + ); // check before assert_eq!( - >::free_balance(&remote_parachain_sovereign_account), + >::free_balance( + &remote_parachain_sovereign_account + ), existential_deposit + buy_execution_fee_amount.into() ); - assert_eq!(>::free_balance(&target_account), existential_deposit); - assert_eq!(>::balance(foreign_asset_id_multilocation.into(), &target_account), 0.into()); + assert_eq!( + >::free_balance(&target_account), + existential_deposit + ); + assert_eq!( + >::balance( + foreign_asset_id_multilocation.into(), + &target_account + ), + 0.into() + ); // origin as BridgeHub let origin = MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; @@ -1900,12 +1923,19 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< // check after assert!( - >::free_balance(&remote_parachain_sovereign_account) < - existential_deposit + buy_execution_fee_amount.into() + >::free_balance( + &remote_parachain_sovereign_account + ) < existential_deposit + buy_execution_fee_amount.into() + ); + assert_eq!( + >::free_balance(&target_account), + existential_deposit ); - assert_eq!(>::free_balance(&target_account), existential_deposit); assert_eq!( - >::balance(foreign_asset_id_multilocation.into(), &target_account), + >::balance( + foreign_asset_id_multilocation.into(), + &target_account + ), reserve_asset_deposisted.into() ); @@ -1915,7 +1945,11 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())); assert!(pallet_xcm_events.any(|e| match e { pallet_xcm::Event::AssetsTrapped(_, trapped_for, _) => { - assert_eq!(trapped_for, origin, "We expect trapped assets for origin: {:?}, but it is trapped for: {:?}", origin, trapped_for); + assert_eq!( + trapped_for, origin, + "We expect trapped assets for origin: {:?}, but it is trapped for: {:?}", + origin, trapped_for + ); true }, _ => false, From 066db6b95f6f83d38893d5151946866bb401b4f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 13:24:31 +0200 Subject: [PATCH 068/339] Bump serde_json from 1.0.94 to 1.0.95 (#2387) Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.94 to 1.0.95. - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.94...v1.0.95) --- updated-dependencies: - dependency-name: serde_json dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- client/relay-chain-rpc-interface/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba9fbd564c0..5d5750dbdda 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11498,9 +11498,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" +checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" dependencies = [ "itoa 1.0.4", "ryu", diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index 91afe09910e..3f2195e300a 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -30,6 +30,6 @@ jsonrpsee = { version = "0.16.2", features = ["ws-client"] } tracing = "0.1.37" async-trait = "0.1.68" url = "2.3.1" -serde_json = "1.0.94" +serde_json = "1.0.95" serde = "1.0.156" lru = "0.9.0" From 1d8208b184eb70bc76cac60628630729c3002f5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 29 Mar 2023 12:37:13 +0200 Subject: [PATCH 069/339] Companion: wasm-builder support stable Rust (#2393) * Companion: wasm-builder support stable Rust * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 517 +++++++++++++++++++++++++++-------------------------- 1 file changed, 259 insertions(+), 258 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5d5750dbdda..99f929afc36 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -529,7 +529,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "hash-db", "log", @@ -3324,7 +3324,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", ] @@ -3347,7 +3347,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-support-procedural", @@ -3372,7 +3372,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3419,7 +3419,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3430,7 +3430,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3447,7 +3447,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -3476,7 +3476,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "futures", "log", @@ -3492,7 +3492,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "bitflags", "environmental", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "Inflector", "cfg-expr", @@ -3540,7 +3540,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3552,7 +3552,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "proc-macro2", "quote", @@ -3562,7 +3562,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "log", @@ -3580,7 +3580,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3595,7 +3595,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "sp-api", @@ -3604,7 +3604,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "parity-scale-codec", @@ -4567,7 +4567,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bitvec", "frame-benchmarking", @@ -4665,7 +4665,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "frame-support", "polkadot-primitives", @@ -5507,7 +5507,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "futures", "log", @@ -5526,7 +5526,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "anyhow", "jsonrpsee", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6036,7 +6036,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6054,7 +6054,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6069,7 +6069,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -6085,7 +6085,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -6101,7 +6101,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -6115,7 +6115,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6139,7 +6139,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6174,7 +6174,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -6193,7 +6193,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6235,7 +6235,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6279,7 +6279,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6296,7 +6296,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "bitflags", "environmental", @@ -6326,7 +6326,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "bitflags", "parity-scale-codec", @@ -6339,7 +6339,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "proc-macro2", "quote", @@ -6349,7 +6349,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6366,7 +6366,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6384,7 +6384,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6407,7 +6407,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6420,7 +6420,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6438,7 +6438,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6456,7 +6456,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6479,7 +6479,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6495,7 +6495,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6515,7 +6515,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6532,7 +6532,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -6546,7 +6546,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6563,7 +6563,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6580,7 +6580,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6596,7 +6596,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6614,7 +6614,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "pallet-nfts", @@ -6625,7 +6625,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6641,7 +6641,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -6658,7 +6658,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6678,7 +6678,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6689,7 +6689,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -6706,7 +6706,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6730,7 +6730,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6747,7 +6747,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6762,7 +6762,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6780,7 +6780,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6795,7 +6795,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6814,7 +6814,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -6852,7 +6852,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6868,7 +6868,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -6882,7 +6882,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6905,7 +6905,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6916,7 +6916,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "log", "sp-arithmetic", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "sp-api", @@ -6934,7 +6934,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6951,7 +6951,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -6980,7 +6980,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6998,7 +6998,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7017,7 +7017,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-support", "frame-system", @@ -7033,7 +7033,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7049,7 +7049,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7061,7 +7061,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7078,7 +7078,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7093,7 +7093,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7109,7 +7109,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7124,7 +7124,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7139,7 +7139,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7160,7 +7160,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "frame-benchmarking", "frame-support", @@ -7702,7 +7702,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "futures", "polkadot-node-metrics", @@ -7717,7 +7717,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7731,7 +7731,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "derive_more", "fatality", @@ -7754,7 +7754,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "fatality", "futures", @@ -7775,7 +7775,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "clap 4.1.13", "frame-benchmarking-cli", @@ -7803,7 +7803,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "async-trait", "frame-benchmarking", @@ -7846,7 +7846,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "always-assert", "bitvec", @@ -7868,7 +7868,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "parity-scale-codec", "scale-info", @@ -7880,7 +7880,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "derive_more", "fatality", @@ -7905,7 +7905,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -7919,7 +7919,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "futures", "futures-timer", @@ -7939,7 +7939,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "always-assert", "async-trait", @@ -7962,7 +7962,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "futures", "parity-scale-codec", @@ -7980,7 +7980,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bitvec", "derive_more", @@ -8009,7 +8009,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bitvec", "futures", @@ -8030,7 +8030,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bitvec", "fatality", @@ -8049,7 +8049,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8064,7 +8064,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "async-trait", "futures", @@ -8084,7 +8084,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "futures", "polkadot-node-metrics", @@ -8099,7 +8099,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "futures", "futures-timer", @@ -8116,7 +8116,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "fatality", "futures", @@ -8135,7 +8135,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "async-trait", "futures", @@ -8152,7 +8152,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bitvec", "fatality", @@ -8170,7 +8170,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "always-assert", "assert_matches", @@ -8206,7 +8206,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "futures", "polkadot-node-primitives", @@ -8222,7 +8222,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "futures", "lru 0.9.0", @@ -8237,7 +8237,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "lazy_static", "log", @@ -8255,7 +8255,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bs58", "futures", @@ -8274,7 +8274,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "async-trait", "derive_more", @@ -8296,7 +8296,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bounded-vec", "futures", @@ -8319,7 +8319,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8329,7 +8329,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "async-trait", "futures", @@ -8347,7 +8347,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "async-trait", "derive_more", @@ -8370,7 +8370,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "async-trait", "derive_more", @@ -8403,7 +8403,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "async-trait", "futures", @@ -8426,7 +8426,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bounded-collections", "derive_more", @@ -8523,7 +8523,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8539,7 +8539,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bitvec", "hex-literal", @@ -8565,7 +8565,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8597,7 +8597,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bitvec", "frame-benchmarking", @@ -8691,7 +8691,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bitvec", "frame-benchmarking", @@ -8737,7 +8737,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "frame-support", "polkadot-primitives", @@ -8751,7 +8751,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bs58", "parity-scale-codec", @@ -8763,7 +8763,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bitflags", "bitvec", @@ -8807,7 +8807,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -8917,7 +8917,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -8938,7 +8938,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -8948,7 +8948,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -8973,7 +8973,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9034,7 +9034,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "frame-benchmarking", "frame-system", @@ -9770,7 +9770,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -9856,7 +9856,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "frame-support", "polkadot-primitives", @@ -10038,9 +10038,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.5" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" [[package]] name = "rw-stream-sink" @@ -10089,7 +10089,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "log", "sp-core", @@ -10100,7 +10100,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "futures", @@ -10128,7 +10128,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "futures", "futures-timer", @@ -10151,7 +10151,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10166,7 +10166,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10185,7 +10185,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10196,7 +10196,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10236,7 +10236,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "fnv", "futures", @@ -10262,7 +10262,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "hash-db", "kvdb", @@ -10288,7 +10288,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "futures", @@ -10313,7 +10313,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "futures", @@ -10342,7 +10342,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "fork-tree", @@ -10381,7 +10381,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "futures", "jsonrpsee", @@ -10403,7 +10403,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10438,7 +10438,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "futures", "jsonrpsee", @@ -10457,7 +10457,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10470,7 +10470,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10510,7 +10510,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "finality-grandpa", "futures", @@ -10530,7 +10530,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "futures", @@ -10553,7 +10553,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10577,7 +10577,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10590,7 +10590,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "log", "sc-allocator", @@ -10603,7 +10603,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "anyhow", "cfg-if", @@ -10621,7 +10621,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "ansi_term", "futures", @@ -10637,7 +10637,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10652,7 +10652,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10696,7 +10696,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "cid", "futures", @@ -10716,7 +10716,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10744,7 +10744,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "ahash 0.8.2", "futures", @@ -10763,7 +10763,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10785,7 +10785,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10819,7 +10819,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10839,7 +10839,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -10870,7 +10870,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "futures", "libp2p", @@ -10883,7 +10883,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -10892,7 +10892,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "futures", "jsonrpsee", @@ -10922,7 +10922,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -10941,7 +10941,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "http", "jsonrpsee", @@ -10956,7 +10956,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10982,7 +10982,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "directories", @@ -11048,7 +11048,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "log", "parity-scale-codec", @@ -11059,7 +11059,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "clap 4.1.13", "fs4", @@ -11075,7 +11075,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11094,7 +11094,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "futures", "libc", @@ -11113,7 +11113,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "chrono", "futures", @@ -11132,7 +11132,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "ansi_term", "atty", @@ -11163,7 +11163,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11174,7 +11174,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "futures", @@ -11201,7 +11201,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "futures", @@ -11215,7 +11215,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-channel", "futures", @@ -11696,7 +11696,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "enumn", "parity-scale-codec", @@ -11773,7 +11773,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "hash-db", "log", @@ -11791,7 +11791,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "Inflector", "blake2", @@ -11805,7 +11805,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "scale-info", @@ -11818,7 +11818,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "integer-sqrt", "num-traits", @@ -11832,7 +11832,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "scale-info", @@ -11845,7 +11845,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "sp-api", @@ -11857,7 +11857,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "futures", "log", @@ -11875,7 +11875,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "futures", @@ -11890,7 +11890,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "parity-scale-codec", @@ -11908,7 +11908,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "merlin", @@ -11931,7 +11931,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "lazy_static", "parity-scale-codec", @@ -11950,7 +11950,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "finality-grandpa", "log", @@ -11968,7 +11968,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "scale-info", @@ -11980,7 +11980,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "scale-info", @@ -11993,7 +11993,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "base58", @@ -12036,7 +12036,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "blake2b_simd", "byteorder", @@ -12050,7 +12050,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "proc-macro2", "quote", @@ -12061,7 +12061,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12070,7 +12070,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "proc-macro2", "quote", @@ -12080,7 +12080,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "environmental", "parity-scale-codec", @@ -12091,7 +12091,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12106,7 +12106,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "bytes", "ed25519", @@ -12115,6 +12115,7 @@ dependencies = [ "libsecp256k1", "log", "parity-scale-codec", + "rustversion", "secp256k1", "sp-core", "sp-externalities", @@ -12131,7 +12132,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "lazy_static", "sp-core", @@ -12142,7 +12143,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "futures", "merlin", @@ -12158,7 +12159,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "thiserror", "zstd", @@ -12167,7 +12168,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12185,7 +12186,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12199,7 +12200,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "sp-api", "sp-core", @@ -12209,7 +12210,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "backtrace", "lazy_static", @@ -12219,7 +12220,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "rustc-hash", "serde", @@ -12229,7 +12230,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "either", "hash256-std-hasher", @@ -12251,7 +12252,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12269,7 +12270,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "Inflector", "proc-macro-crate", @@ -12281,7 +12282,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "serde", "serde_json", @@ -12290,7 +12291,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12304,7 +12305,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12316,7 +12317,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "hash-db", "log", @@ -12336,12 +12337,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12354,7 +12355,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "futures-timer", @@ -12369,7 +12370,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "sp-std", @@ -12381,7 +12382,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "sp-api", "sp-runtime", @@ -12390,7 +12391,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "log", @@ -12406,7 +12407,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12429,7 +12430,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12446,7 +12447,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12457,7 +12458,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12471,7 +12472,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12795,7 +12796,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "platforms", ] @@ -12803,7 +12804,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -12822,7 +12823,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "hyper", "log", @@ -12834,7 +12835,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "jsonrpsee", @@ -12847,7 +12848,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "jsonrpsee", "log", @@ -12866,7 +12867,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12892,7 +12893,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -12902,7 +12903,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12913,7 +12914,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "ansi_term", "build-helper", @@ -13040,7 +13041,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "frame-support", "polkadot-primitives", @@ -13431,7 +13432,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13442,7 +13443,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "expander 0.0.6", "proc-macro-crate", @@ -13572,7 +13573,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#9b43d8f891b1e53be2aa55687632ac6b17800cf8" +source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" dependencies = [ "async-trait", "clap 4.1.13", @@ -14500,7 +14501,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bitvec", "frame-benchmarking", @@ -14592,7 +14593,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "frame-support", "polkadot-primitives", @@ -15028,7 +15029,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "bounded-collections", "derivative", @@ -15044,7 +15045,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "frame-support", "frame-system", @@ -15065,7 +15066,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "environmental", "frame-benchmarking", @@ -15085,7 +15086,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#bebd1a788ecccfa1a6adc61004e4f700988f40d4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" dependencies = [ "Inflector", "proc-macro2", From 99fca2617f14e5aeafe054dfa6e40156b239b4fc Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 29 Mar 2023 15:48:45 +0200 Subject: [PATCH 070/339] Added `IsReserve` handling for `ReserveAssetDeposited` + benchmarks --- Cargo.lock | 1 + .../bridge-transfer/src/benchmarking.rs | 61 ++- .../pallets/bridge-transfer/src/impls.rs | 55 +++ parachains/pallets/bridge-transfer/src/lib.rs | 358 ++++++++++++++++-- .../pallets/bridge-transfer/src/weights.rs | 26 ++ .../runtimes/assets/common/src/matching.rs | 22 ++ .../runtimes/assets/statemine/src/lib.rs | 6 +- .../src/weights/pallet_bridge_transfer.rs | 16 + .../assets/statemine/src/xcm_config.rs | 31 +- .../assets/test-utils/src/test_cases.rs | 47 ++- .../runtimes/assets/westmint/Cargo.toml | 4 + .../runtimes/assets/westmint/src/lib.rs | 27 +- .../assets/westmint/src/weights/mod.rs | 1 + .../src/weights/pallet_bridge_transfer.rs | 157 ++++++++ .../assets/westmint/src/xcm_config.rs | 84 ++-- 15 files changed, 771 insertions(+), 125 deletions(-) create mode 100644 parachains/pallets/bridge-transfer/src/impls.rs create mode 100644 parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs diff --git a/Cargo.lock b/Cargo.lock index 6c0e544fbe3..7841424ac42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14664,6 +14664,7 @@ dependencies = [ "pallet-aura", "pallet-authorship", "pallet-balances", + "pallet-bridge-transfer", "pallet-collator-selection", "pallet-multisig", "pallet-nfts", diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index 2232be996c8..7a263b0ff35 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -17,7 +17,10 @@ //! `BridgeTransfer` pallet benchmarks. -use crate::{AllowedExporters, BenchmarkHelper, Call, Config, Event, Pallet, PingMessageBuilder}; +use crate::{ + AllowedExporters, AllowedReserveLocations, AllowedUniversalAliases, BenchmarkHelper, Call, + Config, Event, Pallet, PingMessageBuilder, +}; use frame_benchmarking::{benchmarks, BenchmarkError, BenchmarkResult}; use frame_support::{traits::EnsureOrigin, weights::Weight}; @@ -29,8 +32,8 @@ benchmarks! { // TODO: add proper range after once pallet works with multiple assets // (be sure to use "worst" of assets) // let a in 1 .. 1; - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); - let (origin, assets, destination) = T::BenchmarkHelper::prepare_asset_transfer(1); + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config()?; + let (origin, assets, destination) = T::BenchmarkHelper::prepare_asset_transfer(1)?; AllowedExporters::::insert(bridged_network, bridge_config); }: _(origin, Box::new(assets), Box::new(destination)) verify { @@ -41,10 +44,10 @@ benchmarks! { } ping_via_bridge { - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config()?; AllowedExporters::::insert(bridged_network, bridge_config); - let (origin, destination) = T::BenchmarkHelper::prepare_ping(); + let (origin, destination) = T::BenchmarkHelper::prepare_ping()?; let origin_location = T::TransferPingOrigin::ensure_origin(origin.clone()).map_err(|_| BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), @@ -65,7 +68,7 @@ benchmarks! { add_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config()?; }: _(origin, bridged_network, Box::new(bridge_config.clone())) verify { assert_eq!(AllowedExporters::::get(bridged_network), Some(bridge_config)); @@ -73,7 +76,7 @@ benchmarks! { remove_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config()?; AllowedExporters::::insert(bridged_network, bridge_config); }: _(origin, bridged_network) verify { @@ -82,16 +85,52 @@ benchmarks! { update_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config(); + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config()?; AllowedExporters::::insert(bridged_network, bridge_config); let bridge_location_fee = None; let target_location_fee = T::BenchmarkHelper::target_location_fee_for_update(); - }: _(origin, bridged_network, bridge_location_fee.clone(), target_location_fee.clone()) + }: _(origin, bridged_network, bridge_location_fee.clone().map(Box::new), target_location_fee.clone().map(Box::new)) verify { let exporter = AllowedExporters::::get(bridged_network).unwrap(); - assert_eq!(exporter.bridge_location_fee, bridge_location_fee); - assert_eq!(exporter.allowed_target_location, target_location_fee.map(|fee| MultiAsset::try_from(*fee).unwrap())); + assert_eq!(exporter.bridge_location_fee, bridge_location_fee.map(|fee| xcm::prelude::MultiAsset::try_from(fee).unwrap())); + assert_eq!(exporter.target_location_fee, target_location_fee.map(|fee| xcm::prelude::MultiAsset::try_from(fee).unwrap())); + } + + add_universal_alias { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let (location, junction) = T::BenchmarkHelper::universal_alias()?; + }: _(origin, Box::new(location.clone()), junction) + verify { + assert!(AllowedUniversalAliases::::get(&location.try_as().unwrap()).contains(&junction)); + } + + remove_universal_alias { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let (location, junction) = T::BenchmarkHelper::universal_alias()?; + let multilocation: xcm::prelude::MultiLocation = location.clone().try_into().unwrap(); + assert!(AllowedUniversalAliases::::try_mutate(multilocation, |junctions| junctions.try_insert(junction)).unwrap()); + }: _(origin, Box::new(location.clone()), vec![junction.clone()]) + verify { + assert!(!AllowedUniversalAliases::::get(&location.try_as().unwrap()).contains(&junction)); + } + + add_reserve_location { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let location = T::BenchmarkHelper::reserve_location()?; + }: _(origin, Box::new(location.clone())) + verify { + assert!(AllowedReserveLocations::::get().contains(&location.try_as().unwrap())); + } + + remove_reserve_location { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let location = T::BenchmarkHelper::reserve_location()?; + let multilocation: xcm::prelude::MultiLocation = location.clone().try_into().unwrap(); + assert!(AllowedReserveLocations::::try_mutate(|locations| locations.try_insert(multilocation)).unwrap()); + }: _(origin, vec![location.clone()]) + verify { + assert!(!AllowedReserveLocations::::get().contains(&location.try_as().unwrap())); } impl_benchmark_test_suite!(Pallet, crate::tests::new_test_ext(), crate::tests::TestRuntime); diff --git a/parachains/pallets/bridge-transfer/src/impls.rs b/parachains/pallets/bridge-transfer/src/impls.rs new file mode 100644 index 00000000000..903eb10af00 --- /dev/null +++ b/parachains/pallets/bridge-transfer/src/impls.rs @@ -0,0 +1,55 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{Config, Pallet}; +use frame_support::traits::{Contains, ContainsPair}; +use xcm::prelude::*; +use xcm_builder::ExporterFor; + +/// `ExporterFor` implementation to check if we can transfer anything to `NetworkId` +impl ExporterFor for Pallet { + fn exporter_for( + network: &NetworkId, + _remote_location: &InteriorMultiLocation, + _message: &Xcm<()>, + ) -> Option<(MultiLocation, Option)> { + Self::allowed_exporters(network) + .map(|bridge_config| (bridge_config.bridge_location, bridge_config.bridge_location_fee)) + } +} + +/// Verifies if we have `(MultiLocation, Junction)` in allowed universal aliases. +pub struct AllowedUniversalAliasesOf(sp_std::marker::PhantomData); +impl Contains<(MultiLocation, Junction)> for AllowedUniversalAliasesOf { + fn contains((location, junction): &(MultiLocation, Junction)) -> bool { + Pallet::::allowed_universal_aliases(location).contains(junction) + } +} + +/// Verifies if we can allow `(MultiAsset, MultiLocation)` as trusted reserve. +pub struct IsAllowedReserveOf(sp_std::marker::PhantomData<(T, F)>); +impl> ContainsPair + for IsAllowedReserveOf +{ + fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + log::trace!(target: "xcm::contains", "IsAllowedReserveOf asset: {:?}, origin: {:?}", asset, origin); + // first check - if we have configured origin as trusted reserve location + if !Pallet::::allowed_reserve_locations().contains(origin) { + return false + } + // second check - we need to pass additional `(asset, origin)` filter + F::contains(asset, origin) + } +} diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 17b49994a53..d19b0f9dd96 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// Copyright (C) 2023 Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::BoundedBTreeSet; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; use sp_std::boxed::Box; @@ -30,6 +31,7 @@ use xcm::prelude::*; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; +pub mod impls; pub mod weights; /// The log target of this pallet. @@ -81,12 +83,12 @@ impl> PingMessageBuilder #[frame_support::pallet] pub mod pallet { pub use crate::weights::WeightInfo; + use frame_benchmarking::BenchmarkError; use super::*; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; use xcm::latest::Error as XcmError; - use xcm_builder::ExporterFor; use xcm_executor::traits::TransactAsset; #[pallet::pallet] @@ -99,10 +101,17 @@ pub mod pallet { /// /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled /// to support transfer to this destination **after** `prepare_asset_transfer` call. - fn bridge_config() -> (NetworkId, BridgeConfig); + fn bridge_config() -> Result<(NetworkId, BridgeConfig), BenchmarkError> { + Err(BenchmarkError::Skip) + } /// Returns some fee, which will be used for `update_exporter_config`. - fn target_location_fee_for_update() -> Option>; + fn target_location_fee_for_update() -> Option { + Some(VersionedMultiAsset::V3(MultiAsset { + id: Concrete(MultiLocation::parent()), + fun: Fungible(1_000_0000), + })) + } /// Prepare environment for assets transfer and return transfer origin and assets /// to transfer. After this function is called, we expect `transfer_asset_via_bridge` @@ -116,8 +125,10 @@ pub mod pallet { /// the assets transfer, it should be created. If there are multiple bridges, the "worst possible" /// (in terms of performance) bridge must be selected for the transfer. fn prepare_asset_transfer( - assets_count: u32, - ) -> (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation); + _assets_count: u32, + ) -> Result<(RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } /// Prepare environment for ping transfer and return transfer origin and assets /// to transfer. After this function is called, we expect `ping_via_bridge` @@ -130,7 +141,17 @@ pub mod pallet { /// - be close to the worst possible scenario - i.e. if some account may need to be created during /// it should be created. If there are multiple bridges, the "worst possible" /// (in terms of performance) bridge must be selected for the transfer. - fn prepare_ping() -> (RuntimeOrigin, VersionedMultiLocation); + fn prepare_ping() -> Result<(RuntimeOrigin, VersionedMultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn universal_alias() -> Result<(VersionedMultiLocation, Junction), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn reserve_location() -> Result { + Err(BenchmarkError::Skip) + } } #[pallet::config] @@ -144,19 +165,30 @@ pub mod pallet { /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; - /// How to withdraw and deposit an asset for reserve. - type AssetTransactor: TransactAsset; - /// The configurable origin to allow bridges configuration management type AdminOrigin: EnsureOrigin; + /// Max allowed universal aliases per one `MultiLocation` + /// (Config for transfer in) + type UniversalAliasesLimit: Get; + /// Max allowed reserve locations + /// (Config for transfer in) + type ReserveLocationsLimit: Get; + + /// How to withdraw and deposit an asset for reserve. + /// (Config for transfer out) + type AssetTransactor: TransactAsset; /// XCM sender which sends messages to the BridgeHub + /// (Config for transfer out) type BridgeXcmSender: SendXcm; /// Required origin for asset transfer. If successful, it resolves to `MultiLocation`. + /// (Config for transfer out) type TransferAssetOrigin: EnsureOrigin; /// Required origin for ping transfer. If successful, it resolves to `MultiLocation`. + /// (Config for transfer out) type TransferPingOrigin: EnsureOrigin; /// Configurable ping message, `None` means no message will be transferred. + /// (Config for transfer out) type PingMessageBuilder: PingMessageBuilder; /// Benchmarks helper. @@ -170,6 +202,28 @@ pub mod pallet { pub(super) type AllowedExporters = StorageMap<_, Blake2_128Concat, NetworkId, BridgeConfig>; + /// Holds allowed mappings `MultiLocation->Junction` for `UniversalAliases` + /// E.g: + /// BridgeHubMultiLocation1 -> NetworkId::Kusama + /// BridgeHubMultiLocation1 -> NetworkId::Polkadot + /// (Config for transfer in) + #[pallet::storage] + #[pallet::getter(fn allowed_universal_aliases)] + pub(super) type AllowedUniversalAliases = StorageMap< + _, + Blake2_128Concat, + MultiLocation, + BoundedBTreeSet, + ValueQuery, + >; + + /// Holds allowed mappings `MultiLocation` as trusted reserve locations + /// (Config for transfer in) + #[pallet::storage] + #[pallet::getter(fn allowed_reserve_locations)] + pub(super) type AllowedReserveLocations = + StorageValue<_, BoundedBTreeSet, ValueQuery>; + #[pallet::error] #[cfg_attr(test, derive(PartialEq))] pub enum Error { @@ -195,6 +249,16 @@ pub mod pallet { /// Bridge configuration was updated BridgeUpdated, + /// New universal alias was added + UniversalAliasAdded, + /// New universal alias was removed + UniversalAliasRemoved, + + /// New reserve location was added + ReserveLocationAdded, + /// New reserve location was removed + ReserveLocationRemoved, + /// Reserve asset passed ReserveAssetsDeposited { from: MultiLocation, to: MultiLocation, assets: MultiAssets }, /// Reserve asset failed @@ -221,7 +285,6 @@ pub mod pallet { destination: Box, ) -> DispatchResult { let origin_location = T::TransferAssetOrigin::ensure_origin(origin)?; - // Check remote destination + bridge_config let (_, bridge_config, remote_destination) = Self::ensure_remote_destination(*destination)?; @@ -439,6 +502,120 @@ pub mod pallet { Ok(()) }) } + + /// Add `(MultiLocation, Junction)` mapping to [`AllowedUniversalAliases`] + /// + /// Parameters: + /// + /// * `location`: key + /// * `junction`: value + #[pallet::call_index(5)] + #[pallet::weight(T::WeightInfo::add_universal_alias())] + pub fn add_universal_alias( + origin: OriginFor, + location: Box, + junction: Junction, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + + let location: MultiLocation = + (*location).try_into().map_err(|_| Error::::UnsupportedDestination)?; + let added = AllowedUniversalAliases::::try_mutate(location, |junctions| { + junctions.try_insert(junction) + }) + .map_err(|_| Error::::InvalidConfiguration)?; + if added { + Self::deposit_event(Event::UniversalAliasAdded); + } + Ok(()) + } + + /// Remove `(MultiLocation, Junction)` mapping from [`AllowedUniversalAliases`] + /// + /// Parameters: + /// + /// * `location`: key + /// * `junction`: value + #[pallet::call_index(6)] + #[pallet::weight(T::WeightInfo::remove_universal_alias())] + pub fn remove_universal_alias( + origin: OriginFor, + location: Box, + junctions_to_remove: sp_std::prelude::Vec, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + + let location: MultiLocation = + (*location).try_into().map_err(|_| Error::::UnsupportedDestination)?; + let removed = AllowedUniversalAliases::::try_mutate( + location, + |junctions| -> Result> { + let mut removed = false; + for jtr in junctions_to_remove { + removed |= junctions.remove(&jtr); + } + Ok(removed) + }, + )?; + if removed { + Self::deposit_event(Event::UniversalAliasRemoved); + } + Ok(()) + } + + /// Add `MultiLocation` mapping to [`AllowedReserveLocations`] + /// + /// Parameters: + /// + /// * `location`: as reserve `MultiLocation` + #[pallet::call_index(7)] + #[pallet::weight(T::WeightInfo::add_reserve_location())] + pub fn add_reserve_location( + origin: OriginFor, + location: Box, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + + let location: MultiLocation = + (*location).try_into().map_err(|_| Error::::UnsupportedDestination)?; + let added = AllowedReserveLocations::::try_mutate(|locations| { + locations.try_insert(location) + }) + .map_err(|_| Error::::InvalidConfiguration)?; + if added { + Self::deposit_event(Event::ReserveLocationAdded); + } + Ok(()) + } + + /// Remove `MultiLocation` mapping from [`AllowedReserveLocations`] + /// + /// Parameters: + /// + /// * `location`: as reserve `MultiLocation` + #[pallet::call_index(8)] + #[pallet::weight(T::WeightInfo::remove_reserve_location())] + pub fn remove_reserve_location( + origin: OriginFor, + locations_to_remove: sp_std::prelude::Vec, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + + let removed = + AllowedReserveLocations::::try_mutate(|locations| -> Result> { + let mut removed = false; + for ltr in locations_to_remove { + let ltr: MultiLocation = + ltr.try_into().map_err(|_| Error::::UnsupportedDestination)?; + removed |= locations.remove(<r); + } + Ok(removed) + })?; + if removed { + Self::deposit_event(Event::ReserveLocationRemoved); + } + Ok(()) + } } impl Pallet { @@ -478,10 +655,6 @@ pub mod pallet { } } - fn get_bridge_for(network: &NetworkId) -> Option { - AllowedExporters::::get(network) - } - fn initiate_bridge_transfer( allowed_target_location: MultiLocation, xcm: Xcm<()>, @@ -525,26 +698,15 @@ pub mod pallet { Ok(()) } } - - impl ExporterFor for Pallet { - fn exporter_for( - network: &NetworkId, - _remote_location: &InteriorMultiLocation, - _message: &Xcm<()>, - ) -> Option<(MultiLocation, Option)> { - Pallet::::get_bridge_for(network).map(|bridge_config| { - (bridge_config.bridge_location, bridge_config.bridge_location_fee) - }) - } - } } #[cfg(test)] pub(crate) mod tests { use super::*; use crate as bridge_transfer; - use frame_support::traits::{ConstU32, Currency}; + use frame_support::traits::{ConstU32, Contains, ContainsPair, Currency, Everything}; + use crate::impls::{AllowedUniversalAliasesOf, IsAllowedReserveOf}; use frame_support::{ assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, }; @@ -643,7 +805,7 @@ pub(crate) mod tests { parameter_types! { // UniversalLocation as statemine - pub const RelayNetwork: NetworkId = NetworkId::Kusama; + pub const RelayNetwork: NetworkId = NetworkId::ByGenesis([9; 32]); pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(1000)); // Test bridge cfg pub TestBridgeTable: sp_std::prelude::Vec<(NetworkId, MultiLocation, Option)> = sp_std::vec![ @@ -779,8 +941,10 @@ pub(crate) mod tests { type RuntimeEvent = RuntimeEvent; type UniversalLocation = UniversalLocation; type WeightInfo = (); - type AssetTransactor = CurrencyTransactor; type AdminOrigin = EnsureRoot; + type UniversalAliasesLimit = ConstU32<2>; + type ReserveLocationsLimit = ConstU32<2>; + type AssetTransactor = CurrencyTransactor; type BridgeXcmSender = TestBridgeXcmSender; type TransferAssetOrigin = EnsureXcmOrigin; type TransferPingOrigin = EnsureXcmOrigin; @@ -1028,7 +1192,7 @@ pub(crate) mod tests { } #[test] - fn test_bridge_config_management_works() { + fn allowed_exporters_management_works() { let bridged_network = Rococo; let bridged_config = Box::new(BridgeConfig { bridge_location: (Parent, Parachain(1013)).into(), @@ -1042,6 +1206,25 @@ pub(crate) mod tests { let dummy_xcm = Xcm(vec![]); let dummy_remote_interior_multilocation = X1(Parachain(1234)); + { + let mut asset = xcm_executor::Assets::from(MultiAsset { + id: Concrete(MultiLocation::parent()), + fun: Fungible(1_000), + }); + println!("before: {:?}", asset); + asset.reanchor(&bridged_config.allowed_target_location, UniversalLocation::get(), None); + println!("after: {:?}", asset); + } + { + let mut asset = xcm_executor::Assets::from(MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: X1(Parachain(3000)) }), + fun: Fungible(1_000), + }); + println!("before: {:?}", asset); + asset.reanchor(&bridged_config.allowed_target_location, UniversalLocation::get(), None); + println!("after: {:?}", asset); + } + new_test_ext().execute_with(|| { assert_eq!(AllowedExporters::::iter().count(), 0); @@ -1125,8 +1308,8 @@ pub(crate) mod tests { assert_ok!(BridgeTransfer::update_exporter_config( RuntimeOrigin::root(), bridged_network, - Some((Parent, 200u128).into()), - Some((Parent, 300u128).into()), + Some(VersionedMultiAsset::V3((Parent, 200u128).into()).into()), + Some(VersionedMultiAsset::V3((Parent, 300u128).into()).into()), )); assert_eq!(AllowedExporters::::iter().count(), 1); assert_eq!( @@ -1156,4 +1339,113 @@ pub(crate) mod tests { assert_eq!(AllowedExporters::::iter().count(), 0); }) } + + #[test] + fn allowed_universal_aliases_management_works() { + new_test_ext().execute_with(|| { + assert_eq!(AllowedUniversalAliases::::iter().count(), 0); + + let location1 = MultiLocation::new(1, X1(Parachain(1014))); + let junction1 = GlobalConsensus(ByGenesis([1; 32])); + let junction2 = GlobalConsensus(ByGenesis([2; 32])); + + // should fail - just root is allowed + assert_noop!( + BridgeTransfer::add_universal_alias( + RuntimeOrigin::signed(account(1)), + Box::new(VersionedMultiLocation::V3(location1.clone())), + junction1.clone(), + ), + DispatchError::BadOrigin + ); + assert_eq!(AllowedUniversalAliases::::iter().count(), 0); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + + // add ok + assert_ok!(BridgeTransfer::add_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + junction1.clone(), + )); + assert_ok!(BridgeTransfer::add_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + junction2.clone(), + )); + assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + + // remove ok + assert_ok!(BridgeTransfer::remove_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + vec![junction1.clone()], + )); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + + assert_ok!(BridgeTransfer::remove_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + vec![junction2.clone()], + )); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + }) + } + + #[test] + fn allowed_reserve_locations_management_works() { + new_test_ext().execute_with(|| { + assert!(AllowedReserveLocations::::get().is_empty()); + + let location1 = MultiLocation::new(1, X1(Parachain(1014))); + let location2 = + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([1; 32])), Parachain(1014))); + let asset: MultiAsset = (Parent, 200u128).into(); + + // should fail - just root is allowed + assert_noop!( + BridgeTransfer::add_reserve_location( + RuntimeOrigin::signed(account(1)), + Box::new(VersionedMultiLocation::V3(location1.clone())) + ), + DispatchError::BadOrigin + ); + assert_eq!(AllowedReserveLocations::::get().len(), 0); + assert!(!IsAllowedReserveOf::::contains(&asset, &location1)); + assert!(!IsAllowedReserveOf::::contains(&asset, &location2)); + + // add ok + assert_ok!(BridgeTransfer::add_reserve_location( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())) + )); + assert_ok!(BridgeTransfer::add_reserve_location( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location2.clone())) + )); + assert_eq!(AllowedReserveLocations::::get().len(), 2); + assert!(IsAllowedReserveOf::::contains(&asset, &location1)); + assert!(IsAllowedReserveOf::::contains(&asset, &location2)); + + // remove ok + assert_ok!(BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + vec![VersionedMultiLocation::V3(location1.clone())], + )); + assert_eq!(AllowedReserveLocations::::get().len(), 1); + assert!(!IsAllowedReserveOf::::contains(&asset, &location1)); + assert!(IsAllowedReserveOf::::contains(&asset, &location2)); + + assert_ok!(BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + vec![VersionedMultiLocation::V3(location2.clone())], + )); + assert!(AllowedReserveLocations::::get().is_empty()); + assert!(!IsAllowedReserveOf::::contains(&asset, &location1)); + assert!(!IsAllowedReserveOf::::contains(&asset, &location2)); + }) + } } diff --git a/parachains/pallets/bridge-transfer/src/weights.rs b/parachains/pallets/bridge-transfer/src/weights.rs index be95c3934fa..be1eb001980 100644 --- a/parachains/pallets/bridge-transfer/src/weights.rs +++ b/parachains/pallets/bridge-transfer/src/weights.rs @@ -35,6 +35,16 @@ pub trait WeightInfo { fn remove_exporter_config() -> Weight; /// Weight of the `update_exporter_config` call. fn update_exporter_config() -> Weight; + + /// Weight of the `add_universal_alias` call. + fn add_universal_alias() -> Weight; + /// Weight of the `remove_universal_alias` call. + fn remove_universal_alias() -> Weight; + + /// Weight of the `add_reserve_location` call. + fn add_reserve_location() -> Weight; + /// Weight of the `remove_reserve_location` call. + fn remove_reserve_location() -> Weight; } // Zero weights to use in tests @@ -58,4 +68,20 @@ impl WeightInfo for () { fn update_exporter_config() -> Weight { Weight::zero() } + + fn add_universal_alias() -> Weight { + Weight::zero() + } + + fn remove_universal_alias() -> Weight { + Weight::zero() + } + + fn add_reserve_location() -> Weight { + Weight::zero() + } + + fn remove_reserve_location() -> Weight { + Weight::zero() + } } diff --git a/parachains/runtimes/assets/common/src/matching.rs b/parachains/runtimes/assets/common/src/matching.rs index a5e030412b9..00793b65e67 100644 --- a/parachains/runtimes/assets/common/src/matching.rs +++ b/parachains/runtimes/assets/common/src/matching.rs @@ -89,3 +89,25 @@ impl> ContainsPair } } } + +/// Accepts an asset if it is from different global consensus than self plus `parents > 1` +pub struct IsDifferentGlobalConsensusConcreteAsset( + sp_std::marker::PhantomData, +); +impl> ContainsPair + for IsDifferentGlobalConsensusConcreteAsset +{ + fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + log::trace!(target: "xcm::contains", "IsDifferentGlobalConsensusConcreteAsset asset: {:?}, origin: {:?}", asset, origin); + match asset { + MultiAsset { id: Concrete(asset_location), .. } if asset_location.parents > 1 => + match asset_location.first_interior() { + Some(GlobalConsensus(asset_consensus)) + if asset_consensus != &SelfGlobalConsensus::get() => + true, + _ => false, + }, + _ => false, + } + } +} diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 77d99e58919..8e1c81ee409 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -699,8 +699,12 @@ impl pallet_bridge_transfer::Config for Runtime { type RuntimeEvent = RuntimeEvent; type UniversalLocation = UniversalLocation; type WeightInfo = weights::pallet_bridge_transfer::WeightInfo; - type AssetTransactor = AssetTransactors; type AdminOrigin = AssetsForceOrigin; + // no transfer allowed in (now) + type UniversalAliasesLimit = ConstU32<0>; + // no transfer allowed in (now) + type ReserveLocationsLimit = ConstU32<0>; + type AssetTransactor = AssetTransactors; type BridgeXcmSender = BridgeXcmSender; type TransferAssetOrigin = EnsureXcmOrigin; type TransferPingOrigin = EnsureXcmOrigin; diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs index 032b6776aa5..e5cd85da51c 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -138,4 +138,20 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + + fn add_universal_alias() -> Weight { + Weight::zero() + } + + fn remove_universal_alias() -> Weight { + Weight::zero() + } + + fn add_reserve_location() -> Weight { + Weight::zero() + } + + fn remove_reserve_location() -> Weight { + Weight::zero() + } } diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index d75411be4fd..e2013532c3d 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -521,7 +521,9 @@ impl BridgeTransferBenchmarksHelper { MultiLocation::new(2, X2(GlobalConsensus(Polkadot), Parachain(1000))) } - fn target_location_fee() -> MultiAsset {} + fn target_location_fee() -> MultiAsset { + MultiAsset { id: Concrete(MultiLocation::parent()), fun: Fungible(50_000_000) } + } /// Identifier of the sibling bridge-hub parachain. fn bridge_hub_para_id() -> u32 { @@ -531,8 +533,10 @@ impl BridgeTransferBenchmarksHelper { #[cfg(feature = "runtime-benchmarks")] impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBenchmarksHelper { - fn bridge_config() -> (NetworkId, pallet_bridge_transfer::BridgeConfig) { - ( + fn bridge_config( + ) -> Result<(NetworkId, pallet_bridge_transfer::BridgeConfig), frame_benchmarking::BenchmarkError> + { + Ok(( Polkadot, pallet_bridge_transfer::BridgeConfig { bridge_location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), @@ -543,19 +547,19 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe allowed_target_location: Self::allowed_target_location(), target_location_fee: None, }, - ) + )) } - fn target_location_fee_for_update() -> Option> { - Some(Box::new(xcm::VersionedMultiAsset::V3(MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(50_000_000), - }))) + fn target_location_fee_for_update() -> Option { + Some(xcm::VersionedMultiAsset::V3(Self::target_location_fee())) } fn prepare_asset_transfer( assets_count: u32, - ) -> (RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation) { + ) -> Result< + (RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation), + frame_benchmarking::BenchmarkError, + > { use frame_support::traits::Currency; assert_eq!(assets_count, 1, "Benchmarks needs to be fixed to support multiple assets"); @@ -575,10 +579,11 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe let assets = xcm::VersionedMultiAssets::V3(Self::make_asset(existential_deposit).into()); let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); - (RuntimeOrigin::signed(sender_account), assets, destination) + Ok((RuntimeOrigin::signed(sender_account), assets, destination)) } - fn prepare_ping() -> (RuntimeOrigin, xcm::VersionedMultiLocation) { + fn prepare_ping( + ) -> Result<(RuntimeOrigin, xcm::VersionedMultiLocation), frame_benchmarking::BenchmarkError> { // our `BridgeXcmSender` assumes that the HRMP channel is opened between this // parachain and the sibling bridge-hub parachain cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( @@ -591,6 +596,6 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe // finally - prepare destination let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); - (RuntimeOrigin::signed(sender_account), destination) + Ok((RuntimeOrigin::signed(sender_account), destination)) } } diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 7cc9c9cdae6..e49930c262a 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1796,7 +1796,8 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config + cumulus_pallet_xcmp_queue::Config - + pallet_assets::Config, + + pallet_assets::Config + + pallet_bridge_transfer::Config, AccountIdOf: Into<[u8; 32]>, ValidatorIdOf: From>, BalanceOf: From, @@ -1814,16 +1815,22 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< LocationToAccountId: Convert>, ForeignAssetsPalletInstance: 'static, { - let remote_parachain_sovereign_account = LocationToAccountId::convert_ref(MultiLocation { + let remote_network_id = ByGenesis([7; 32]); + let remote_parachain_as_origin = MultiLocation { parents: 2, - interior: X2(GlobalConsensus(Kusama), Parachain(1000)), - }) - .expect("Sovereign account works"); + interior: X2(GlobalConsensus(remote_network_id), Parachain(1000)), + }; + let remote_parachain_sovereign_account = + LocationToAccountId::convert_ref(remote_parachain_as_origin) + .expect("Sovereign account works"); let foreign_asset_id_multilocation = - MultiLocation { parents: 2, interior: X1(GlobalConsensus(Kusama)) }; + MultiLocation { parents: 2, interior: X1(GlobalConsensus(remote_network_id)) }; let buy_execution_fee_amount = 50000000000; let reserve_asset_deposisted = 100_000_000; + let local_bridge_hub_multilocation = + MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; + ExtBuilder::::default() .with_collators(collator_session_keys.collators()) .with_session_keys(collator_session_keys.session_keys()) @@ -1837,6 +1844,20 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< .with_tracing() .build() .execute_with(|| { + // setup bridge transfer configuration + + // add allowed univeral alias for remote network + assert_ok!(>::add_universal_alias( + RuntimeHelper::::root_origin(), + Box::new(VersionedMultiLocation::V3(local_bridge_hub_multilocation)), + GlobalConsensus(remote_network_id) + )); + // add allowed reserve location + assert_ok!(>::add_reserve_location( + RuntimeHelper::::root_origin(), + Box::new(VersionedMultiLocation::V3(remote_parachain_as_origin)) + )); + // create foreign asset let asset_minimum_asset_balance = 1_000_000_u128; assert_ok!( @@ -1868,11 +1889,11 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< 0.into() ); - // origin as BridgeHub - let origin = MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; + // xcm let xcm = Xcm(vec![ - UniversalOrigin(GlobalConsensus(Kusama)), + UniversalOrigin(GlobalConsensus(remote_network_id)), DescendOrigin(X1(Parachain(1000))), + // buying execution as sovereign account `remote_parachain_sovereign_account` in *native asset on receiving runtime* WithdrawAsset(MultiAssets::from(vec![MultiAsset { id: Concrete(MultiLocation { parents: 1, interior: Here }), fun: Fungible(buy_execution_fee_amount), @@ -1884,10 +1905,11 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< }, weight_limit: Unlimited, }, + // reserve deposited - assets transferred through bridge - *native asset on sending runtime* ReserveAssetDeposited(MultiAssets::from(vec![MultiAsset { id: Concrete(MultiLocation { parents: 2, - interior: X1(GlobalConsensus(Kusama)), + interior: X1(GlobalConsensus(remote_network_id)), }), fun: Fungible(reserve_asset_deposisted), }])), @@ -1896,7 +1918,7 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< assets: Definite(MultiAssets::from(vec![MultiAsset { id: Concrete(MultiLocation { parents: 2, - interior: X1(GlobalConsensus(Kusama)), + interior: X1(GlobalConsensus(remote_network_id)), }), fun: Fungible(reserve_asset_deposisted), }])), @@ -1910,6 +1932,9 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< }, ]); + // origin as BridgeHub + let origin = local_bridge_hub_multilocation; + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); // execute xcm as XcmpQueue would do diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/westmint/Cargo.toml index c08d432ec33..7ac7eae77e7 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/westmint/Cargo.toml @@ -72,6 +72,7 @@ pallet-collator-selection = { path = "../../../../pallets/collator-selection", d parachain-info = { path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } +pallet-bridge-transfer = { path = "../../../pallets/bridge-transfer", default-features = false } [dev-dependencies] hex-literal = "0.3.4" @@ -104,6 +105,7 @@ runtime-benchmarks = [ "cumulus-pallet-xcmp-queue/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", "assets-common/runtime-benchmarks", + "pallet-bridge-transfer/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", @@ -130,6 +132,7 @@ try-runtime = [ "pallet-utility/try-runtime", "pallet-xcm/try-runtime", "parachain-info/try-runtime", + "pallet-bridge-transfer/try-runtime", ] std = [ "codec/std", @@ -185,5 +188,6 @@ std = [ "parachain-info/std", "parachains-common/std", "assets-common/std", + "pallet-bridge-transfer/std", "substrate-wasm-builder", ] diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 5994fdcabb5..6132fc78fcf 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -80,9 +80,10 @@ use assets_common::{ foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, }; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; +use xcm_builder::EnsureXcmOrigin; use xcm_executor::XcmExecutor; -use crate::xcm_config::ForeignCreatorsSovereignAccountOf; +use crate::xcm_config::{ForeignCreatorsSovereignAccountOf, UniversalLocation}; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; impl_opaque_keys! { @@ -664,6 +665,27 @@ impl pallet_nfts::Config for Runtime { type Helper = (); } +impl pallet_bridge_transfer::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type UniversalLocation = UniversalLocation; + type WeightInfo = weights::pallet_bridge_transfer::WeightInfo; + type AdminOrigin = AssetsForceOrigin; + type UniversalAliasesLimit = ConstU32<24>; + type ReserveLocationsLimit = ConstU32<8>; + // no transfer allowed out (now) + type AssetTransactor = (); + // no transfer allowed out (now) + type BridgeXcmSender = (); + // no transfer allowed out (now) + type TransferAssetOrigin = EnsureXcmOrigin; + // no transfer allowed out (now) + type TransferPingOrigin = EnsureXcmOrigin; + // no transfer allowed out (now) + type PingMessageBuilder = (); + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = xcm_config::BridgeTransferBenchmarksHelper; +} + // Create the runtime by composing the FRAME pallets that were previously configured. construct_runtime!( pub enum Runtime where @@ -708,6 +730,7 @@ construct_runtime!( Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, + BridgeTransfer: pallet_bridge_transfer::{Pallet, Call, Storage, Event} = 54, } ); @@ -1125,7 +1148,7 @@ impl_runtime_apis! { } fn universal_alias() -> Result { - Err(BenchmarkError::Skip) + <::BenchmarkHelper as pallet_bridge_transfer::BenchmarkHelper>::universal_alias().map(|(_, junction)| junction) } fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { diff --git a/parachains/runtimes/assets/westmint/src/weights/mod.rs b/parachains/runtimes/assets/westmint/src/weights/mod.rs index 92af360ced1..518bd88bc2e 100644 --- a/parachains/runtimes/assets/westmint/src/weights/mod.rs +++ b/parachains/runtimes/assets/westmint/src/weights/mod.rs @@ -4,6 +4,7 @@ pub mod extrinsic_weights; pub mod frame_system; pub mod pallet_assets; pub mod pallet_balances; +pub mod pallet_bridge_transfer; pub mod pallet_collator_selection; pub mod pallet_multisig; pub mod pallet_nfts; diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs new file mode 100644 index 00000000000..e5cd85da51c --- /dev/null +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs @@ -0,0 +1,157 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_transfer` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-03-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_transfer +// --chain=statemine-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/statemine/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `pallet_bridge_transfer`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_transfer::WeightInfo for WeightInfo { + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeTransfer Bridges (r:1 w:0) + /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) + fn transfer_asset_via_bridge() -> Weight { + // Proof Size summary in bytes: + // Measured: `439` + // Estimated: `25088` + // Minimum execution time: 111_964_000 picoseconds. + Weight::from_parts(113_251_000, 0) + .saturating_add(Weight::from_parts(0, 25088)) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeTransfer Bridges (r:1 w:0) + /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) + fn ping_via_bridge() -> Weight { + // Proof Size summary in bytes: + // Measured: `299` + // Estimated: `18052` + // Minimum execution time: 57_960_000 picoseconds. + Weight::from_parts(58_812_000, 0) + .saturating_add(Weight::from_parts(0, 18052)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: BridgeTransfer Bridges (r:1 w:1) + /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + fn add_exporter_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `5364` + // Minimum execution time: 15_021_000 picoseconds. + Weight::from_parts(15_328_000, 0) + .saturating_add(Weight::from_parts(0, 5364)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer Bridges (r:1 w:1) + /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + fn remove_exporter_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `164` + // Estimated: `5364` + // Minimum execution time: 14_417_000 picoseconds. + Weight::from_parts(14_891_000, 0) + .saturating_add(Weight::from_parts(0, 5364)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer Bridges (r:1 w:1) + /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + fn update_exporter_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `164` + // Estimated: `5364` + // Minimum execution time: 17_321_000 picoseconds. + Weight::from_parts(17_658_000, 0) + .saturating_add(Weight::from_parts(0, 5364)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + + fn add_universal_alias() -> Weight { + Weight::zero() + } + + fn remove_universal_alias() -> Weight { + Weight::zero() + } + + fn add_reserve_location() -> Weight { + Weight::zero() + } + + fn remove_reserve_location() -> Weight { + Weight::zero() + } +} diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 76db4f0bdef..851b313eb75 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -21,14 +21,16 @@ use super::{ use assets_common::{ location_conversion::GlobalConsensusParachainConvert, matching::{ - FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, + FromSiblingParachain, IsDifferentGlobalConsensusConcreteAsset, IsForeignConcreteAsset, + StartsWith, StartsWithExplicitGlobalConsensus, }, }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, ContainsPair, Everything, PalletInfoAccess}, + traits::{ConstU32, Contains, Everything, PalletInfoAccess}, }; use frame_system::EnsureRoot; +use pallet_bridge_transfer::impls::{AllowedUniversalAliasesOf, IsAllowedReserveOf}; use pallet_xcm::XcmPassthrough; use parachains_common::{ impls::ToStakingPot, @@ -105,7 +107,7 @@ pub type FungiblesTransactor = FungiblesAdapter< AccountId, // We only want to allow teleports of known assets. We use non-zero issuance as an indication // that this asset is known. - LocalMint>, // todo: accept all instances + LocalMint>, // The account to use for tracking teleports. CheckingAccount, >; @@ -384,8 +386,10 @@ impl xcm_executor::Config for XcmConfig { type OriginConverter = XcmOriginToTransactDispatchOrigin; // Westmint is acting _as_ a reserve location for WND and assets created under `pallet-assets`. // For WND, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = - ConcreteFungibleAssetsFromTrustedBridgedReserves; + type IsReserve = IsAllowedReserveOf< + Runtime, + IsDifferentGlobalConsensusConcreteAsset, + >; // We allow: // - teleportation of WND // - teleportation of sibling parachain's assets (as ForeignCreators) @@ -424,7 +428,7 @@ impl xcm_executor::Config for XcmConfig { type AssetExchanger = (); type FeeManager = (); type MessageExporter = (); - type UniversalAliases = TrustedBridgedNetworks; + type UniversalAliases = AllowedUniversalAliasesOf; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; } @@ -498,55 +502,27 @@ impl BenchmarkHelper for XcmBenchmarkHelper { } } -parameter_types! { - // TODO:check-parameter - join all together in one on-chain cfg (statemine/t, eth(chain_ids), ...) - - // TODO:check-parameter - add new pallet and persist/manage this via governance? - // Means, that we accept some `GlobalConsensus` from some `MultiLocation` (which is supposed to be our bridge-hub) - pub TrustedBridgedNetworks: sp_std::vec::Vec<(MultiLocation, Junction)> = sp_std::vec![ - (MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, GlobalConsensus(NetworkId::Rococo)), - (MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, GlobalConsensus(NetworkId::Kusama)) - ]; - // TODO:check-parameter - add new pallet and persist/manage this via governance? - // TODO:check-parameter - we specify here just trusted location, we can extend this with some AssetFilter patterns to trust only to several assets - pub TrustedBridgedReserveLocations: sp_std::vec::Vec = sp_std::vec![ - // TODO:check-parameter - tmp values that cover local/live Rococo/Wococo run - MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1000)) }, - MultiLocation { parents: 2, interior: X2(GlobalConsensus(Kusama), Parachain(1000)) }, - MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1015)) }, - MultiLocation { parents: 2, interior: X2(GlobalConsensus(Kusama), Parachain(1015)) }, - ]; -} - -impl Contains<(MultiLocation, Junction)> for TrustedBridgedNetworks { - fn contains(t: &(MultiLocation, Junction)) -> bool { - Self::get().contains(t) - } -} - -impl Contains for TrustedBridgedReserveLocations { - fn contains(t: &MultiLocation) -> bool { - Self::get().contains(t) +/// Benchmarks helper for over-bridge transfer pallet. +#[cfg(feature = "runtime-benchmarks")] +pub struct BridgeTransferBenchmarksHelper; +#[cfg(feature = "runtime-benchmarks")] +impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBenchmarksHelper { + fn universal_alias( + ) -> Result<(xcm::VersionedMultiLocation, Junction), frame_benchmarking::BenchmarkError> { + Ok(( + xcm::VersionedMultiLocation::V3(MultiLocation { + parents: 1, + interior: X1(Parachain(1014)), + }), + GlobalConsensus(NetworkId::Kusama), + )) } -} -/// Asset filter that allows all assets from trusted bridge location -pub struct ConcreteFungibleAssetsFromTrustedBridgedReserves( - sp_std::marker::PhantomData, -); -impl> ContainsPair - for ConcreteFungibleAssetsFromTrustedBridgedReserves -{ - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { - log::trace!( - target: "xcm::barriers", - "ConcreteFungibleAssetsFromTrustedBridgedReserves origin: {:?}, asset: {:?}", - origin, asset, - ); - if !TrustedReserverLocations::contains(origin) { - return false - } - // TODO:check-parameter - better assets filtering - matches!(asset, MultiAsset { id: AssetId::Concrete(_), fun: Fungible(_) }) + fn reserve_location() -> Result + { + Ok(xcm::VersionedMultiLocation::V3(MultiLocation { + parents: 2, + interior: X2(GlobalConsensus(NetworkId::Kusama), Parachain(1000)), + })) } } From 559f3caa2b621dcba57b4806fe50f1ec095338a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 13:50:40 +0000 Subject: [PATCH 071/339] Bump thiserror from 1.0.38 to 1.0.40 (#2396) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.38 to 1.0.40. - [Release notes](https://github.com/dtolnay/thiserror/releases) - [Commits](https://github.com/dtolnay/thiserror/compare/1.0.38...1.0.40) --- updated-dependencies: - dependency-name: thiserror dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- client/relay-chain-interface/Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 99f929afc36..f22e30f4171 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13060,22 +13060,22 @@ checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16" [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.9", ] [[package]] diff --git a/client/relay-chain-interface/Cargo.toml b/client/relay-chain-interface/Cargo.toml index 9583d78b613..11d0f6d96a6 100644 --- a/client/relay-chain-interface/Cargo.toml +++ b/client/relay-chain-interface/Cargo.toml @@ -16,6 +16,6 @@ sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "mas futures = "0.3.27" async-trait = "0.1.68" -thiserror = "1.0.38" +thiserror = "1.0.40" jsonrpsee-core = "0.16.2" parity-scale-codec = "3.4.0" From bfaa974b2e130aeab5f060d0437b775f092a21cb Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 29 Mar 2023 15:58:19 +0200 Subject: [PATCH 072/339] Fix compile --- parachains/pallets/bridge-transfer/src/lib.rs | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index d19b0f9dd96..53563754814 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -83,7 +83,6 @@ impl> PingMessageBuilder #[frame_support::pallet] pub mod pallet { pub use crate::weights::WeightInfo; - use frame_benchmarking::BenchmarkError; use super::*; use frame_support::pallet_prelude::*; @@ -101,8 +100,9 @@ pub mod pallet { /// /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled /// to support transfer to this destination **after** `prepare_asset_transfer` call. - fn bridge_config() -> Result<(NetworkId, BridgeConfig), BenchmarkError> { - Err(BenchmarkError::Skip) + fn bridge_config() -> Result<(NetworkId, BridgeConfig), frame_benchmarking::BenchmarkError> + { + Err(frame_benchmarking::BenchmarkError::Skip) } /// Returns some fee, which will be used for `update_exporter_config`. @@ -126,8 +126,11 @@ pub mod pallet { /// (in terms of performance) bridge must be selected for the transfer. fn prepare_asset_transfer( _assets_count: u32, - ) -> Result<(RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) + ) -> Result< + (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation), + frame_benchmarking::BenchmarkError, + > { + Err(frame_benchmarking::BenchmarkError::Skip) } /// Prepare environment for ping transfer and return transfer origin and assets @@ -141,16 +144,19 @@ pub mod pallet { /// - be close to the worst possible scenario - i.e. if some account may need to be created during /// it should be created. If there are multiple bridges, the "worst possible" /// (in terms of performance) bridge must be selected for the transfer. - fn prepare_ping() -> Result<(RuntimeOrigin, VersionedMultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) + fn prepare_ping( + ) -> Result<(RuntimeOrigin, VersionedMultiLocation), frame_benchmarking::BenchmarkError> { + Err(frame_benchmarking::BenchmarkError::Skip) } - fn universal_alias() -> Result<(VersionedMultiLocation, Junction), BenchmarkError> { - Err(BenchmarkError::Skip) + fn universal_alias( + ) -> Result<(VersionedMultiLocation, Junction), frame_benchmarking::BenchmarkError> { + Err(frame_benchmarking::BenchmarkError::Skip) } - fn reserve_location() -> Result { - Err(BenchmarkError::Skip) + fn reserve_location() -> Result + { + Err(frame_benchmarking::BenchmarkError::Skip) } } From 3bf39cfb1cc8a8d6e5f475a4fc16e68d78356911 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Wed, 29 Mar 2023 14:55:11 +0000 Subject: [PATCH 073/339] ".git/.scripts/commands/bench/bench.sh" pallet statemine assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 92 ++++++++----------- 1 file changed, 39 insertions(+), 53 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs index e5cd85da51c..ab3739c2c62 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -50,8 +50,8 @@ pub struct WeightInfo(PhantomData); impl pallet_bridge_transfer::WeightInfo for WeightInfo { /// Storage: ParachainInfo ParachainId (r:1 w:0) /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeTransfer Bridges (r:1 w:0) - /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) /// Storage: System Account (r:2 w:2) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) @@ -68,18 +68,18 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn transfer_asset_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `439` - // Estimated: `25088` - // Minimum execution time: 111_964_000 picoseconds. - Weight::from_parts(113_251_000, 0) - .saturating_add(Weight::from_parts(0, 25088)) + // Measured: `477` + // Estimated: `25954` + // Minimum execution time: 130_298_000 picoseconds. + Weight::from_parts(131_689_000, 0) + .saturating_add(Weight::from_parts(0, 25954)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: ParachainInfo ParachainId (r:1 w:0) /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeTransfer Bridges (r:1 w:0) - /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -94,64 +94,50 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn ping_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `299` - // Estimated: `18052` - // Minimum execution time: 57_960_000 picoseconds. - Weight::from_parts(58_812_000, 0) - .saturating_add(Weight::from_parts(0, 18052)) + // Measured: `337` + // Estimated: `18918` + // Minimum execution time: 57_840_000 picoseconds. + Weight::from_parts(58_460_000, 0) + .saturating_add(Weight::from_parts(0, 18918)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: BridgeTransfer Bridges (r:1 w:1) - /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) fn add_exporter_config() -> Weight { // Proof Size summary in bytes: // Measured: `109` - // Estimated: `5364` - // Minimum execution time: 15_021_000 picoseconds. - Weight::from_parts(15_328_000, 0) - .saturating_add(Weight::from_parts(0, 5364)) - .saturating_add(T::DbWeight::get().reads(1)) + // Estimated: `7491` + // Minimum execution time: 15_963_000 picoseconds. + Weight::from_parts(16_450_000, 0) + .saturating_add(Weight::from_parts(0, 7491)) + .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: BridgeTransfer Bridges (r:1 w:1) - /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) fn remove_exporter_config() -> Weight { // Proof Size summary in bytes: - // Measured: `164` - // Estimated: `5364` - // Minimum execution time: 14_417_000 picoseconds. - Weight::from_parts(14_891_000, 0) - .saturating_add(Weight::from_parts(0, 5364)) + // Measured: `165` + // Estimated: `6002` + // Minimum execution time: 13_832_000 picoseconds. + Weight::from_parts(14_281_000, 0) + .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: BridgeTransfer Bridges (r:1 w:1) - /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) fn update_exporter_config() -> Weight { // Proof Size summary in bytes: - // Measured: `164` - // Estimated: `5364` - // Minimum execution time: 17_321_000 picoseconds. - Weight::from_parts(17_658_000, 0) - .saturating_add(Weight::from_parts(0, 5364)) + // Measured: `165` + // Estimated: `6002` + // Minimum execution time: 19_073_000 picoseconds. + Weight::from_parts(19_285_000, 0) + .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - - fn add_universal_alias() -> Weight { - Weight::zero() - } - - fn remove_universal_alias() -> Weight { - Weight::zero() - } - - fn add_reserve_location() -> Weight { - Weight::zero() - } - - fn remove_reserve_location() -> Weight { - Weight::zero() - } } From 69dd6ae5f7c4b36146b684a27810fd8434e76b58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 21:50:17 +0200 Subject: [PATCH 074/339] Bump syn from 1.0.109 to 2.0.9 (#2397) Bumps [syn](https://github.com/dtolnay/syn) from 1.0.109 to 2.0.9. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/1.0.109...2.0.9) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 2 +- pallets/parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f22e30f4171..0acb8c0c188 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2098,7 +2098,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.9", ] [[package]] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index fa975eb0b84..e3f9487d8c1 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -9,7 +9,7 @@ description = "Proc macros provided by the parachain-system pallet" proc-macro = true [dependencies] -syn = "1.0.109" +syn = "2.0.9" proc-macro2 = "1.0.52" quote = "1.0.26" proc-macro-crate = "1.3.1" From 247e843011c03e9837849e811b47e66630625ef0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 21:50:45 +0200 Subject: [PATCH 075/339] Bump serde from 1.0.156 to 1.0.159 (#2395) Bumps [serde](https://github.com/serde-rs/serde) from 1.0.156 to 1.0.159. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.156...v1.0.159) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- client/relay-chain-rpc-interface/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../bridge-hubs/bridge-hub-polkadot/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0acb8c0c188..4084da626bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11478,22 +11478,22 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.156" +version = "1.0.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314b5b092c0ade17c00142951e50ced110ec27cea304b1037c6969246c2469a4" +checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.156" +version = "1.0.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e29c4601e36bcec74a223228dce795f4cd3616341a4af93520ca1a837c087d" +checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.9", ] [[package]] diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index 3f2195e300a..34458a4510e 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -31,5 +31,5 @@ tracing = "0.1.37" async-trait = "0.1.68" url = "2.3.1" serde_json = "1.0.95" -serde = "1.0.156" +serde = "1.0.159" lru = "0.9.0" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index 38fe7b2ba86..ba828fae060 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -13,7 +13,7 @@ build = "build.rs" clap = { version = "4.1.13", features = ["derive"] } log = "0.4.17" codec = { package = "parity-scale-codec", version = "3.0.0" } -serde = { version = "1.0.156", features = ["derive"] } +serde = { version = "1.0.159", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } # Local diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index 5428dc08a43..4b2cf6a5737 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.3.4" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.156", optional = true, features = ["derive"] } +serde = { version = "1.0.159", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 51765638c7f..9526bd8e3b9 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.3.4" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.156", optional = true, features = ["derive"] } +serde = { version = "1.0.159", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 43d9484658d..5599231c678 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.3.4" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.156", optional = true, features = ["derive"] } +serde = { version = "1.0.159", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 83920372198..0f6ebbd9a3a 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -17,7 +17,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.27" hex-literal = "0.3.4" log = "0.4.17" -serde = { version = "1.0.156", features = ["derive"] } +serde = { version = "1.0.159", features = ["derive"] } # Local rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parachain" } diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 566655e28d2..ff88ae5b84f 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -15,7 +15,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.4.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" -serde = { version = "1.0.156", features = ["derive"] } +serde = { version = "1.0.159", features = ["derive"] } tokio = { version = "1.26.0", features = ["macros"] } tracing = "0.1.37" url = "2.3.1" From 2ce882fff03353f1479dc7890631b017732f1224 Mon Sep 17 00:00:00 2001 From: Aaro Altonen <48052676+altonen@users.noreply.github.com> Date: Thu, 30 Mar 2023 15:33:14 +0300 Subject: [PATCH 076/339] Companion for https://github.com/paritytech/substrate/pull/13725 (#2401) * Companion for https://github.com/paritytech/substrate/pull/13725 * Add comment * update lockfile for {"substrate", "polkadot"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 522 +++++++++--------- client/relay-chain-minimal-node/Cargo.toml | 1 + .../relay-chain-minimal-node/src/network.rs | 4 + 3 files changed, 264 insertions(+), 263 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4084da626bd..098e5450813 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -499,12 +499,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base58" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" - [[package]] name = "base64" version = "0.13.0" @@ -529,7 +523,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "hash-db", "log", @@ -2324,6 +2318,7 @@ dependencies = [ "sc-network-common", "sc-service", "sc-tracing", + "sc-utils", "sp-api", "sp-blockchain", "sp-consensus", @@ -3324,7 +3319,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", ] @@ -3347,7 +3342,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-support-procedural", @@ -3372,7 +3367,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3419,7 +3414,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3430,7 +3425,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3447,7 +3442,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -3476,7 +3471,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "futures", "log", @@ -3492,7 +3487,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "bitflags", "environmental", @@ -3525,7 +3520,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "Inflector", "cfg-expr", @@ -3540,7 +3535,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3552,7 +3547,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "proc-macro2", "quote", @@ -3562,7 +3557,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "log", @@ -3580,7 +3575,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3595,7 +3590,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "sp-api", @@ -3604,7 +3599,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "parity-scale-codec", @@ -4567,7 +4562,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bitvec", "frame-benchmarking", @@ -4665,7 +4660,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "frame-support", "polkadot-primitives", @@ -5507,7 +5502,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "futures", "log", @@ -5526,7 +5521,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "anyhow", "jsonrpsee", @@ -6015,7 +6010,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6036,7 +6031,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6054,7 +6049,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6069,7 +6064,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -6085,7 +6080,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -6101,7 +6096,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -6115,7 +6110,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6139,7 +6134,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6159,7 +6154,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6174,7 +6169,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -6193,7 +6188,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6217,7 +6212,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6235,7 +6230,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6279,7 +6274,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6296,7 +6291,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "bitflags", "environmental", @@ -6326,7 +6321,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "bitflags", "parity-scale-codec", @@ -6339,7 +6334,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "proc-macro2", "quote", @@ -6349,7 +6344,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6366,7 +6361,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6384,7 +6379,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6407,7 +6402,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6420,7 +6415,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6438,7 +6433,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6456,7 +6451,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6479,7 +6474,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6495,7 +6490,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6515,7 +6510,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6532,7 +6527,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -6546,7 +6541,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6563,7 +6558,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6580,7 +6575,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6596,7 +6591,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6614,7 +6609,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "pallet-nfts", @@ -6625,7 +6620,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6641,7 +6636,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -6658,7 +6653,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6678,7 +6673,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6689,7 +6684,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -6706,7 +6701,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6730,7 +6725,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6747,7 +6742,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6762,7 +6757,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6780,7 +6775,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6795,7 +6790,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6814,7 +6809,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,7 +6826,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -6852,7 +6847,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6868,7 +6863,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -6882,7 +6877,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6905,7 +6900,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6916,7 +6911,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "log", "sp-arithmetic", @@ -6925,7 +6920,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "sp-api", @@ -6934,7 +6929,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6951,7 +6946,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -6980,7 +6975,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6998,7 +6993,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7017,7 +7012,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-support", "frame-system", @@ -7033,7 +7028,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7049,7 +7044,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7061,7 +7056,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7078,7 +7073,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7093,7 +7088,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7109,7 +7104,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7124,7 +7119,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7139,7 +7134,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7160,7 +7155,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "frame-benchmarking", "frame-support", @@ -7702,7 +7697,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "futures", "polkadot-node-metrics", @@ -7717,7 +7712,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7731,7 +7726,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "derive_more", "fatality", @@ -7754,7 +7749,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "fatality", "futures", @@ -7775,7 +7770,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "clap 4.1.13", "frame-benchmarking-cli", @@ -7803,7 +7798,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "async-trait", "frame-benchmarking", @@ -7846,7 +7841,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "always-assert", "bitvec", @@ -7868,7 +7863,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "parity-scale-codec", "scale-info", @@ -7880,7 +7875,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "derive_more", "fatality", @@ -7905,7 +7900,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -7919,7 +7914,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "futures", "futures-timer", @@ -7939,7 +7934,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "always-assert", "async-trait", @@ -7962,7 +7957,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "futures", "parity-scale-codec", @@ -7980,7 +7975,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bitvec", "derive_more", @@ -8009,7 +8004,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bitvec", "futures", @@ -8030,7 +8025,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bitvec", "fatality", @@ -8049,7 +8044,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8064,7 +8059,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "async-trait", "futures", @@ -8084,7 +8079,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "futures", "polkadot-node-metrics", @@ -8099,7 +8094,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "futures", "futures-timer", @@ -8116,7 +8111,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "fatality", "futures", @@ -8135,7 +8130,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "async-trait", "futures", @@ -8152,7 +8147,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bitvec", "fatality", @@ -8170,7 +8165,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "always-assert", "assert_matches", @@ -8197,6 +8192,7 @@ dependencies = [ "sp-maybe-compressed-blob", "sp-tracing", "sp-wasm-interface", + "substrate-build-script-utils", "tempfile", "tikv-jemalloc-ctl", "tokio", @@ -8206,7 +8202,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "futures", "polkadot-node-primitives", @@ -8222,7 +8218,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "futures", "lru 0.9.0", @@ -8237,7 +8233,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "lazy_static", "log", @@ -8255,7 +8251,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bs58", "futures", @@ -8274,7 +8270,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "async-trait", "derive_more", @@ -8296,7 +8292,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bounded-vec", "futures", @@ -8319,7 +8315,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8329,7 +8325,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "async-trait", "futures", @@ -8347,7 +8343,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "async-trait", "derive_more", @@ -8370,7 +8366,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "async-trait", "derive_more", @@ -8403,7 +8399,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "async-trait", "futures", @@ -8426,7 +8422,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bounded-collections", "derive_more", @@ -8523,7 +8519,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8539,7 +8535,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bitvec", "hex-literal", @@ -8565,7 +8561,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8597,7 +8593,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bitvec", "frame-benchmarking", @@ -8691,7 +8687,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bitvec", "frame-benchmarking", @@ -8737,7 +8733,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "frame-support", "polkadot-primitives", @@ -8751,7 +8747,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bs58", "parity-scale-codec", @@ -8763,7 +8759,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bitflags", "bitvec", @@ -8807,7 +8803,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -8917,7 +8913,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -8938,7 +8934,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -8948,7 +8944,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -8973,7 +8969,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9034,7 +9030,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "frame-benchmarking", "frame-system", @@ -9770,7 +9766,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -9856,7 +9852,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "frame-support", "polkadot-primitives", @@ -10089,7 +10085,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "log", "sp-core", @@ -10100,7 +10096,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "futures", @@ -10128,7 +10124,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "futures", "futures-timer", @@ -10151,7 +10147,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10166,7 +10162,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10185,7 +10181,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10196,7 +10192,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10236,7 +10232,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "fnv", "futures", @@ -10262,7 +10258,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "hash-db", "kvdb", @@ -10288,7 +10284,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "futures", @@ -10313,7 +10309,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "futures", @@ -10342,7 +10338,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "fork-tree", @@ -10381,7 +10377,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "futures", "jsonrpsee", @@ -10403,7 +10399,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10438,7 +10434,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "futures", "jsonrpsee", @@ -10457,7 +10453,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10470,7 +10466,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10510,7 +10506,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "finality-grandpa", "futures", @@ -10530,7 +10526,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "futures", @@ -10553,7 +10549,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10577,7 +10573,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10590,7 +10586,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "log", "sc-allocator", @@ -10603,7 +10599,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "anyhow", "cfg-if", @@ -10621,7 +10617,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "ansi_term", "futures", @@ -10637,7 +10633,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10652,7 +10648,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10696,7 +10692,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "cid", "futures", @@ -10716,7 +10712,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10744,7 +10740,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "ahash 0.8.2", "futures", @@ -10763,7 +10759,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10785,7 +10781,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10819,7 +10815,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10839,7 +10835,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -10870,7 +10866,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "futures", "libp2p", @@ -10883,7 +10879,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -10892,7 +10888,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "futures", "jsonrpsee", @@ -10922,7 +10918,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -10941,7 +10937,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "http", "jsonrpsee", @@ -10956,7 +10952,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10982,7 +10978,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "directories", @@ -11048,7 +11044,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "log", "parity-scale-codec", @@ -11059,7 +11055,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "clap 4.1.13", "fs4", @@ -11075,7 +11071,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11094,7 +11090,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "futures", "libc", @@ -11113,7 +11109,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "chrono", "futures", @@ -11132,7 +11128,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "ansi_term", "atty", @@ -11163,7 +11159,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11174,7 +11170,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "futures", @@ -11201,7 +11197,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "futures", @@ -11215,7 +11211,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-channel", "futures", @@ -11696,7 +11692,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "enumn", "parity-scale-codec", @@ -11773,7 +11769,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "hash-db", "log", @@ -11791,7 +11787,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "Inflector", "blake2", @@ -11805,7 +11801,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -11818,7 +11814,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "integer-sqrt", "num-traits", @@ -11832,7 +11828,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -11845,7 +11841,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "sp-api", @@ -11857,7 +11853,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "futures", "log", @@ -11875,7 +11871,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "futures", @@ -11890,7 +11886,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "parity-scale-codec", @@ -11908,7 +11904,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "merlin", @@ -11931,7 +11927,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "lazy_static", "parity-scale-codec", @@ -11950,7 +11946,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "finality-grandpa", "log", @@ -11968,7 +11964,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -11980,7 +11976,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -11993,13 +11989,13 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", - "base58", "bitflags", "blake2", "bounded-collections", + "bs58", "dyn-clonable", "ed25519-zebra", "futures", @@ -12036,7 +12032,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "blake2b_simd", "byteorder", @@ -12050,7 +12046,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "proc-macro2", "quote", @@ -12061,7 +12057,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12070,7 +12066,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "proc-macro2", "quote", @@ -12080,7 +12076,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "environmental", "parity-scale-codec", @@ -12091,7 +12087,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12106,7 +12102,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "bytes", "ed25519", @@ -12132,7 +12128,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "lazy_static", "sp-core", @@ -12143,7 +12139,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "futures", "merlin", @@ -12159,7 +12155,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "thiserror", "zstd", @@ -12168,7 +12164,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12186,7 +12182,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12200,7 +12196,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "sp-api", "sp-core", @@ -12210,7 +12206,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "backtrace", "lazy_static", @@ -12220,7 +12216,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "rustc-hash", "serde", @@ -12230,7 +12226,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "either", "hash256-std-hasher", @@ -12252,7 +12248,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12270,7 +12266,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "Inflector", "proc-macro-crate", @@ -12282,7 +12278,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "serde", "serde_json", @@ -12291,7 +12287,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12305,7 +12301,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12317,7 +12313,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "hash-db", "log", @@ -12337,12 +12333,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12355,7 +12351,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "futures-timer", @@ -12370,7 +12366,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "sp-std", @@ -12382,7 +12378,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "sp-api", "sp-runtime", @@ -12391,7 +12387,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "log", @@ -12407,7 +12403,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12430,7 +12426,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12447,7 +12443,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12458,7 +12454,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12472,7 +12468,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12796,7 +12792,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "platforms", ] @@ -12804,7 +12800,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -12823,7 +12819,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "hyper", "log", @@ -12835,7 +12831,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "jsonrpsee", @@ -12848,7 +12844,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "jsonrpsee", "log", @@ -12867,7 +12863,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12893,7 +12889,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "futures", "substrate-test-utils-derive", @@ -12903,7 +12899,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12914,7 +12910,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "ansi_term", "build-helper", @@ -13041,7 +13037,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "frame-support", "polkadot-primitives", @@ -13432,7 +13428,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13443,7 +13439,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "expander 0.0.6", "proc-macro-crate", @@ -13573,7 +13569,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f40ba0d09785159a31a43b16b47ddb5ae8e62e1d" +source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" dependencies = [ "async-trait", "clap 4.1.13", @@ -14501,7 +14497,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bitvec", "frame-benchmarking", @@ -14593,7 +14589,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "frame-support", "polkadot-primitives", @@ -15029,7 +15025,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "bounded-collections", "derivative", @@ -15045,7 +15041,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "frame-support", "frame-system", @@ -15066,7 +15062,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "environmental", "frame-benchmarking", @@ -15086,7 +15082,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21298c8a0f3bfdaedc757d2f46d29c3aa242f128" +source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" dependencies = [ "Inflector", "proc-macro2", diff --git a/client/relay-chain-minimal-node/Cargo.toml b/client/relay-chain-minimal-node/Cargo.toml index 7c1c8621d36..11918a4c958 100644 --- a/client/relay-chain-minimal-node/Cargo.toml +++ b/client/relay-chain-minimal-node/Cargo.toml @@ -21,6 +21,7 @@ sc-network = { git = "https://github.com/paritytech/substrate", branch = "master sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/client/relay-chain-minimal-node/src/network.rs b/client/relay-chain-minimal-node/src/network.rs index 4dff55a65de..5225fa053cc 100644 --- a/client/relay-chain-minimal-node/src/network.rs +++ b/client/relay-chain-minimal-node/src/network.rs @@ -26,6 +26,7 @@ use sc_network::{ use sc_network_common::{role::Roles, sync::message::BlockAnnouncesHandshake}; use sc_service::{error::Error, Configuration, NetworkStarter, SpawnTaskHandle}; +use sc_utils::mpsc::tracing_unbounded; use std::{iter, sync::Arc}; @@ -49,6 +50,8 @@ pub(crate) fn build_collator_network( genesis_hash, ); + // RX is not used for anything because syncing is not started for the minimal node + let (tx, _rx) = tracing_unbounded("mpsc_syncing_engine_protocol", 100_000); let network_params = sc_network::config::Params:: { role: config.role.clone(), executor: { @@ -64,6 +67,7 @@ pub(crate) fn build_collator_network( metrics_registry: config.prometheus_config.as_ref().map(|config| config.registry.clone()), block_announce_config, request_response_protocol_configs: Vec::new(), + tx, }; let network_worker = sc_network::NetworkWorker::new(network_params)?; From 3ce4e830880d300731625eccf019ed992495a113 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Mar 2023 13:02:34 +0000 Subject: [PATCH 077/339] Bump syn from 2.0.9 to 2.0.11 (#2405) Bumps [syn](https://github.com/dtolnay/syn) from 2.0.9 to 2.0.11. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.9...2.0.11) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 14 +++++++------- pallets/parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 098e5450813..33e59ef310e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -427,7 +427,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.9", + "syn 2.0.11", ] [[package]] @@ -1214,7 +1214,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.9", + "syn 2.0.11", ] [[package]] @@ -2092,7 +2092,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.9", + "syn 2.0.11", ] [[package]] @@ -11489,7 +11489,7 @@ checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" dependencies = [ "proc-macro2", "quote", - "syn 2.0.9", + "syn 2.0.11", ] [[package]] @@ -12952,9 +12952,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.9" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da4a3c17e109f700685ec577c0f85efd9b19bcf15c913985f14dc1ac01775aa" +checksum = "21e3787bb71465627110e7d87ed4faaa36c1f61042ee67badb9e2ef173accc40" dependencies = [ "proc-macro2", "quote", @@ -13071,7 +13071,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.9", + "syn 2.0.11", ] [[package]] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index e3f9487d8c1..bcb8c800cf1 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -9,7 +9,7 @@ description = "Proc macros provided by the parachain-system pallet" proc-macro = true [dependencies] -syn = "2.0.9" +syn = "2.0.11" proc-macro2 = "1.0.52" quote = "1.0.26" proc-macro-crate = "1.3.1" From 693e97336de278fc1e6e91373e437f17c9698ce9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Mar 2023 16:06:58 +0200 Subject: [PATCH 078/339] Bump scale-info from 2.4.0 to 2.5.0 (#2404) Bumps [scale-info](https://github.com/paritytech/scale-info) from 2.4.0 to 2.5.0. - [Release notes](https://github.com/paritytech/scale-info/releases) - [Changelog](https://github.com/paritytech/scale-info/blob/master/CHANGELOG.md) - [Commits](https://github.com/paritytech/scale-info/compare/v2.4.0...v2.5.0) --- updated-dependencies: - dependency-name: scale-info dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- pallets/aura-ext/Cargo.toml | 2 +- pallets/collator-selection/Cargo.toml | 2 +- pallets/dmp-queue/Cargo.toml | 2 +- pallets/parachain-system/Cargo.toml | 2 +- pallets/solo-to-para/Cargo.toml | 2 +- pallets/xcm/Cargo.toml | 2 +- pallets/xcmp-queue/Cargo.toml | 2 +- parachain-template/runtime/Cargo.toml | 2 +- parachains/common/Cargo.toml | 2 +- parachains/pallets/parachain-info/Cargo.toml | 2 +- parachains/pallets/ping/Cargo.toml | 2 +- parachains/runtimes/assets/statemine/Cargo.toml | 2 +- parachains/runtimes/assets/statemint/Cargo.toml | 2 +- parachains/runtimes/assets/westmint/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- .../runtimes/collectives/collectives-polkadot/Cargo.toml | 2 +- parachains/runtimes/contracts/contracts-rococo/Cargo.toml | 2 +- parachains/runtimes/starters/seedling/Cargo.toml | 2 +- parachains/runtimes/starters/shell/Cargo.toml | 2 +- parachains/runtimes/testing/penpal/Cargo.toml | 2 +- parachains/runtimes/testing/rococo-parachain/Cargo.toml | 2 +- primitives/parachain-inherent/Cargo.toml | 2 +- test/runtime/Cargo.toml | 2 +- 26 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 33e59ef310e..89ce007ab33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11225,9 +11225,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61471dff9096de1d8b2319efed7162081e96793f5ebb147e50db10d50d648a4d" +checksum = "0cfdffd972d76b22f3d7f81c8be34b2296afd3a25e0a547bd9abe340a4dbbe97" dependencies = [ "bitvec", "cfg-if", @@ -11239,9 +11239,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219580e803a66b3f05761fd06f1f879a872444e49ce23f73694d26e5a954c7e6" +checksum = "61fa974aea2d63dd18a4ec3a49d59af9f34178c73a4f56d2f18205628d00681e" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/pallets/aura-ext/Cargo.toml b/pallets/aura-ext/Cargo.toml index 6eaf27c96ed..1db43697511 100644 --- a/pallets/aura-ext/Cargo.toml +++ b/pallets/aura-ext/Cargo.toml @@ -7,7 +7,7 @@ description = "AURA consensus extension pallet for parachains" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/collator-selection/Cargo.toml b/pallets/collator-selection/Cargo.toml index 9629c7de5cf..17bb6fe5579 100644 --- a/pallets/collator-selection/Cargo.toml +++ b/pallets/collator-selection/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] log = { version = "0.4.17", default-features = false } codec = { default-features = false, features = ["derive"], package = "parity-scale-codec", version = "3.0.0" } rand = { version = "0.8.5", features = ["std_rng"], default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/pallets/dmp-queue/Cargo.toml b/pallets/dmp-queue/Cargo.toml index bbf19ad62be..6d072adaede 100644 --- a/pallets/dmp-queue/Cargo.toml +++ b/pallets/dmp-queue/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/parachain-system/Cargo.toml b/pallets/parachain-system/Cargo.toml index e793ddc4c19..b7eef00712e 100644 --- a/pallets/parachain-system/Cargo.toml +++ b/pallets/parachain-system/Cargo.toml @@ -11,7 +11,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = environmental = { version = "1.1.4", default-features = false } impl-trait-for-tuples = "0.2.1" log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/solo-to-para/Cargo.toml b/pallets/solo-to-para/Cargo.toml index ddc2ca56a3b..d092fac6ea7 100644 --- a/pallets/solo-to-para/Cargo.toml +++ b/pallets/solo-to-para/Cargo.toml @@ -7,7 +7,7 @@ description = "Adds functionality to migrate from a Solo to a Parachain" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/xcm/Cargo.toml b/pallets/xcm/Cargo.toml index e9404b3500d..59a751dde09 100644 --- a/pallets/xcm/Cargo.toml +++ b/pallets/xcm/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/xcmp-queue/Cargo.toml b/pallets/xcmp-queue/Cargo.toml index acd440f5818..ed5f199e1fe 100644 --- a/pallets/xcmp-queue/Cargo.toml +++ b/pallets/xcmp-queue/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } log = { version = "0.4.17", default-features = false } rand_chacha = { version = "0.3.0", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachain-template/runtime/Cargo.toml b/parachain-template/runtime/Cargo.toml index 3724596ceb7..fe15f82af0e 100644 --- a/parachain-template/runtime/Cargo.toml +++ b/parachain-template/runtime/Cargo.toml @@ -18,7 +18,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Local diff --git a/parachains/common/Cargo.toml b/parachains/common/Cargo.toml index f89544d8241..5898ae3d9ba 100644 --- a/parachains/common/Cargo.toml +++ b/parachains/common/Cargo.toml @@ -10,7 +10,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"], default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } diff --git a/parachains/pallets/parachain-info/Cargo.toml b/parachains/pallets/parachain-info/Cargo.toml index 270cc869a19..3d706e35e8e 100644 --- a/parachains/pallets/parachain-info/Cargo.toml +++ b/parachains/pallets/parachain-info/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/pallets/ping/Cargo.toml b/parachains/pallets/ping/Cargo.toml index fbfcc703644..1dd218ccc79 100644 --- a/parachains/pallets/ping/Cargo.toml +++ b/parachains/pallets/ping/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index 694f19a274b..704a49a0a55 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -9,7 +9,7 @@ description = "Kusama variant of Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.3.4" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/assets/statemint/Cargo.toml b/parachains/runtimes/assets/statemint/Cargo.toml index cee4c46dbb2..bd482fd2a06 100644 --- a/parachains/runtimes/assets/statemint/Cargo.toml +++ b/parachains/runtimes/assets/statemint/Cargo.toml @@ -9,7 +9,7 @@ description = "Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/westmint/Cargo.toml index dc2574e8b8a..d98db24e185 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/westmint/Cargo.toml @@ -9,7 +9,7 @@ description = "Westend variant of Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index 4b2cf6a5737..f0392c7716b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } serde = { version = "1.0.159", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 9526bd8e3b9..8f29167a24f 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } serde = { version = "1.0.159", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 5599231c678..30e3cad3e21 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } serde = { version = "1.0.159", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml index 04609ca594c..ba3b9ece735 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml +++ b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml @@ -9,7 +9,7 @@ description = "Polkadot Collectives Parachain Runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index fcca53c1695..b667bbf8a98 100644 --- a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -14,7 +14,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/starters/seedling/Cargo.toml b/parachains/runtimes/starters/seedling/Cargo.toml index f26906da461..96ec9544009 100644 --- a/parachains/runtimes/starters/seedling/Cargo.toml +++ b/parachains/runtimes/starters/seedling/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/starters/shell/Cargo.toml b/parachains/runtimes/starters/shell/Cargo.toml index 22efd8f8bef..a176e73906a 100644 --- a/parachains/runtimes/starters/shell/Cargo.toml +++ b/parachains/runtimes/starters/shell/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/testing/penpal/Cargo.toml b/parachains/runtimes/testing/penpal/Cargo.toml index 85d115f06ac..e1ff15b0e02 100644 --- a/parachains/runtimes/testing/penpal/Cargo.toml +++ b/parachains/runtimes/testing/penpal/Cargo.toml @@ -18,7 +18,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.16", default-features = false } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/testing/rococo-parachain/Cargo.toml b/parachains/runtimes/testing/rococo-parachain/Cargo.toml index 14ea9a04292..ecf6acda9e3 100644 --- a/parachains/runtimes/testing/rococo-parachain/Cargo.toml +++ b/parachains/runtimes/testing/rococo-parachain/Cargo.toml @@ -7,7 +7,7 @@ description = "Simple runtime used by the rococo parachain(s)" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } # Substrate frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } diff --git a/primitives/parachain-inherent/Cargo.toml b/primitives/parachain-inherent/Cargo.toml index 7fec7149975..2135802592b 100644 --- a/primitives/parachain-inherent/Cargo.toml +++ b/primitives/parachain-inherent/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] async-trait = { version = "0.1.68", optional = true } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } tracing = { version = "0.1.37", optional = true } # Substrate diff --git a/test/runtime/Cargo.toml b/test/runtime/Cargo.toml index be7c531f57f..619d01fce8d 100644 --- a/test/runtime/Cargo.toml +++ b/test/runtime/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.4.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } From f5340e7faa06d6a34b2afa80e7838281334f1b31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Mar 2023 15:17:47 +0000 Subject: [PATCH 079/339] Bump tempfile from 3.4.0 to 3.5.0 (#2406) Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.4.0 to 3.5.0. - [Release notes](https://github.com/Stebalien/tempfile/releases) - [Changelog](https://github.com/Stebalien/tempfile/blob/master/NEWS) - [Commits](https://github.com/Stebalien/tempfile/commits) --- updated-dependencies: - dependency-name: tempfile dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: parity-processbot <> --- Cargo.lock | 62 ++++++++++++++++++++++++++++------- polkadot-parachain/Cargo.toml | 2 +- 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 89ce007ab33..cb9e1990039 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3094,6 +3094,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "errno" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.45.0", +] + [[package]] name = "errno-dragonfly" version = "0.1.2" @@ -3250,7 +3261,7 @@ checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.2.10", "winapi", ] @@ -5263,6 +5274,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f9f08d8963a6c613f4b1a78f4f4a4dbfadf8e6545b2d72861731e4858b8b47f" +[[package]] +name = "linux-raw-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd550e73688e6d578f0ac2119e32b797a327631a42f9433e59d02e139c8df60d" + [[package]] name = "lock_api" version = "0.4.6" @@ -7412,7 +7429,7 @@ dependencies = [ "cfg-if", "instant", "libc", - "redox_syscall", + "redox_syscall 0.2.10", "smallvec", "winapi", ] @@ -7425,7 +7442,7 @@ checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.2.10", "smallvec", "windows-sys 0.32.0", ] @@ -9566,6 +9583,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_users" version = "0.4.0" @@ -9573,7 +9599,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ "getrandom 0.2.8", - "redox_syscall", + "redox_syscall 0.2.10", ] [[package]] @@ -9965,7 +9991,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "727a1a6d65f786ec22df8a81ca3121107f235970dc1705ed681d3e6e8b9cd5f9" dependencies = [ "bitflags", - "errno", + "errno 0.2.8", "io-lifetimes 0.7.5", "libc", "linux-raw-sys 0.0.46", @@ -9979,13 +10005,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" dependencies = [ "bitflags", - "errno", + "errno 0.2.8", "io-lifetimes 1.0.2", "libc", "linux-raw-sys 0.1.3", "windows-sys 0.42.0", ] +[[package]] +name = "rustix" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" +dependencies = [ + "bitflags", + "errno 0.3.0", + "io-lifetimes 1.0.2", + "libc", + "linux-raw-sys 0.3.0", + "windows-sys 0.45.0", +] + [[package]] name = "rustls" version = "0.19.1" @@ -13008,15 +13048,15 @@ checksum = "9410d0f6853b1d94f0e519fb95df60f29d2c1eff2d921ffdf01a4c8a3b54f12d" [[package]] name = "tempfile" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", - "rustix 0.36.7", - "windows-sys 0.42.0", + "redox_syscall 0.3.5", + "rustix 0.37.3", + "windows-sys 0.45.0", ] [[package]] diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 0f6ebbd9a3a..b285df93d71 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -94,7 +94,7 @@ substrate-build-script-utils = { git = "https://github.com/paritytech/substrate" [dev-dependencies] assert_cmd = "2.0" nix = { version = "0.26.1", features = ["signal"] } -tempfile = "3.4.0" +tempfile = "3.5.0" tokio = { version = "1.26.0", features = ["macros", "time", "parking_lot"] } wait-timeout = "0.2" # purge_chain_works works with rococo-local and needs to allow this From 337bd17c382a73d9e9a53ccbd07714f0d388f0d4 Mon Sep 17 00:00:00 2001 From: Javier Viola Date: Thu, 30 Mar 2023 16:49:51 -0300 Subject: [PATCH 080/339] bump zombienet version (#2411) --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 63e195808fe..449d32a993a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: CI_IMAGE: "paritytech/ci-linux:production" DOCKER_OS: "debian:stretch" ARCH: "x86_64" - ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.40" + ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.43" .common-before-script: before_script: From f76ba2bc8a3c1257cd85ea593caa1125d654b615 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 30 Mar 2023 22:10:50 +0200 Subject: [PATCH 081/339] Fix conditional benchmarking --- .../bridge-transfer/src/benchmarking.rs | 94 +++++++++++---- .../pallets/bridge-transfer/src/impls.rs | 1 + parachains/pallets/bridge-transfer/src/lib.rs | 45 +++----- .../runtimes/assets/statemine/src/lib.rs | 2 +- .../src/weights/pallet_bridge_transfer.rs | 32 ++++++ .../assets/statemine/src/xcm_config.rs | 28 ++--- .../runtimes/assets/westmint/src/lib.rs | 18 ++- .../src/weights/pallet_bridge_transfer.rs | 108 +++++++++--------- .../assets/westmint/src/xcm_config.rs | 45 ++++++-- 9 files changed, 228 insertions(+), 145 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index 7a263b0ff35..8c8aae55a86 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -22,18 +22,34 @@ use crate::{ Config, Event, Pallet, PingMessageBuilder, }; -use frame_benchmarking::{benchmarks, BenchmarkError, BenchmarkResult}; -use frame_support::{traits::EnsureOrigin, weights::Weight}; +use frame_benchmarking::{benchmarks, BenchmarkError}; +use frame_support::traits::{EnsureOrigin, Get}; use sp_std::prelude::*; +use xcm::prelude::*; + +#[cfg(feature = "runtime-benchmarks")] +impl Pallet { + #[cfg(feature = "runtime-benchmarks")] + pub fn insert_universal_alias_for_benchmarks((location, junction): (MultiLocation, Junction)) { + assert!(matches!( + AllowedUniversalAliases::::try_mutate(location, |junctions| junctions + .try_insert(junction)), + Ok(true) + )); + } +} benchmarks! { transfer_asset_via_bridge { + let _ = T::TransferAssetOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; // every asset has its own configuration and ledger, so there's a performance dependency // TODO: add proper range after once pallet works with multiple assets // (be sure to use "worst" of assets) // let a in 1 .. 1; - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config()?; - let (origin, assets, destination) = T::BenchmarkHelper::prepare_asset_transfer(1)?; + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; + let (origin, assets, destination) = T::BenchmarkHelper::prepare_asset_transfer(1) + .ok_or(BenchmarkError::Stop("missing `prepare_asset_transfer` data"))?; AllowedExporters::::insert(bridged_network, bridge_config); }: _(origin, Box::new(assets), Box::new(destination)) verify { @@ -44,19 +60,22 @@ benchmarks! { } ping_via_bridge { - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config()?; + let _ = T::TransferPingOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; AllowedExporters::::insert(bridged_network, bridge_config); - let (origin, destination) = T::BenchmarkHelper::prepare_ping()?; + let (origin, destination) = T::BenchmarkHelper::prepare_ping_transfer() + .ok_or(BenchmarkError::Stop("missing `prepare_ping_transfer` data"))?; - let origin_location = T::TransferPingOrigin::ensure_origin(origin.clone()).map_err(|_| - BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), + let origin_location = T::TransferPingOrigin::ensure_origin(origin.clone()).map_err(|_| BenchmarkError::Stop("invalid `origin`"), )?; let (_, _, destination_location) = Pallet::::ensure_remote_destination(destination.clone()).map_err(|_| - BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), + BenchmarkError::Stop("invalid `destination_location`"), )?; let _ = T::PingMessageBuilder::try_build(&origin_location, &bridged_network, &destination_location).ok_or( - BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), + BenchmarkError::Stop("invalid `PingMessageBuilder`"), )?; }: _(origin, Box::new(destination)) verify { @@ -68,7 +87,8 @@ benchmarks! { add_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config()?; + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; }: _(origin, bridged_network, Box::new(bridge_config.clone())) verify { assert_eq!(AllowedExporters::::get(bridged_network), Some(bridge_config)); @@ -76,7 +96,8 @@ benchmarks! { remove_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config()?; + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; AllowedExporters::::insert(bridged_network, bridge_config); }: _(origin, bridged_network) verify { @@ -85,21 +106,31 @@ benchmarks! { update_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config()?; + let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; AllowedExporters::::insert(bridged_network, bridge_config); let bridge_location_fee = None; - let target_location_fee = T::BenchmarkHelper::target_location_fee_for_update(); + let target_location_fee = Some(xcm::VersionedMultiAsset::V3(MultiAsset { + id: Concrete(MultiLocation::parent()), + fun: Fungible(1_000_0000), + })); }: _(origin, bridged_network, bridge_location_fee.clone().map(Box::new), target_location_fee.clone().map(Box::new)) verify { let exporter = AllowedExporters::::get(bridged_network).unwrap(); - assert_eq!(exporter.bridge_location_fee, bridge_location_fee.map(|fee| xcm::prelude::MultiAsset::try_from(fee).unwrap())); - assert_eq!(exporter.target_location_fee, target_location_fee.map(|fee| xcm::prelude::MultiAsset::try_from(fee).unwrap())); + assert_eq!(exporter.bridge_location_fee, bridge_location_fee.map(|fee| MultiAsset::try_from(fee).unwrap())); + assert_eq!(exporter.target_location_fee, target_location_fee.map(|fee| MultiAsset::try_from(fee).unwrap())); } add_universal_alias { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (location, junction) = T::BenchmarkHelper::universal_alias()?; + let (location, junction) = match T::BenchmarkHelper::universal_alias() { + Some(alias) => alias, + None => match T::UniversalAliasesLimit::get() > 0_u32 { + true => return Err(BenchmarkError::Stop("missing `universal_alias` data")), + false => return Err(BenchmarkError::Weightless), + } + }; }: _(origin, Box::new(location.clone()), junction) verify { assert!(AllowedUniversalAliases::::get(&location.try_as().unwrap()).contains(&junction)); @@ -107,9 +138,14 @@ benchmarks! { remove_universal_alias { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (location, junction) = T::BenchmarkHelper::universal_alias()?; - let multilocation: xcm::prelude::MultiLocation = location.clone().try_into().unwrap(); - assert!(AllowedUniversalAliases::::try_mutate(multilocation, |junctions| junctions.try_insert(junction)).unwrap()); + let (location, junction) = match T::BenchmarkHelper::universal_alias() { + Some(alias) => alias, + None => match T::UniversalAliasesLimit::get() > 0_u32 { + true => return Err(BenchmarkError::Stop("missing `universal_alias` data")), + false => return Err(BenchmarkError::Weightless), + } + }; + Pallet::::insert_universal_alias_for_benchmarks((location.clone().try_into().unwrap(), junction)); }: _(origin, Box::new(location.clone()), vec![junction.clone()]) verify { assert!(!AllowedUniversalAliases::::get(&location.try_as().unwrap()).contains(&junction)); @@ -117,7 +153,13 @@ benchmarks! { add_reserve_location { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let location = T::BenchmarkHelper::reserve_location()?; + let location = match T::BenchmarkHelper::reserve_location() { + Some(location) => location, + None => match T::ReserveLocationsLimit::get() > 0_u32 { + true => return Err(BenchmarkError::Stop("missing `reserve_location` data")), + false => return Err(BenchmarkError::Weightless), + } + }; }: _(origin, Box::new(location.clone())) verify { assert!(AllowedReserveLocations::::get().contains(&location.try_as().unwrap())); @@ -125,8 +167,14 @@ benchmarks! { remove_reserve_location { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let location = T::BenchmarkHelper::reserve_location()?; - let multilocation: xcm::prelude::MultiLocation = location.clone().try_into().unwrap(); + let location = match T::BenchmarkHelper::reserve_location() { + Some(location) => location, + None => match T::ReserveLocationsLimit::get() > 0_u32 { + true => return Err(BenchmarkError::Stop("missing `reserve_location` data")), + false => return Err(BenchmarkError::Weightless), + } + }; + let multilocation: MultiLocation = location.clone().try_into().unwrap(); assert!(AllowedReserveLocations::::try_mutate(|locations| locations.try_insert(multilocation)).unwrap()); }: _(origin, vec![location.clone()]) verify { diff --git a/parachains/pallets/bridge-transfer/src/impls.rs b/parachains/pallets/bridge-transfer/src/impls.rs index 903eb10af00..65b6adb1d79 100644 --- a/parachains/pallets/bridge-transfer/src/impls.rs +++ b/parachains/pallets/bridge-transfer/src/impls.rs @@ -34,6 +34,7 @@ impl ExporterFor for Pallet { pub struct AllowedUniversalAliasesOf(sp_std::marker::PhantomData); impl Contains<(MultiLocation, Junction)> for AllowedUniversalAliasesOf { fn contains((location, junction): &(MultiLocation, Junction)) -> bool { + log::trace!(target: "xcm::contains", "AllowedUniversalAliasesOf location: {:?}, junction: {:?}", location, junction); Pallet::::allowed_universal_aliases(location).contains(junction) } } diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 53563754814..441a2fde18e 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -100,17 +100,8 @@ pub mod pallet { /// /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled /// to support transfer to this destination **after** `prepare_asset_transfer` call. - fn bridge_config() -> Result<(NetworkId, BridgeConfig), frame_benchmarking::BenchmarkError> - { - Err(frame_benchmarking::BenchmarkError::Skip) - } - - /// Returns some fee, which will be used for `update_exporter_config`. - fn target_location_fee_for_update() -> Option { - Some(VersionedMultiAsset::V3(MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(1_000_0000), - })) + fn bridge_config() -> Option<(NetworkId, BridgeConfig)> { + None } /// Prepare environment for assets transfer and return transfer origin and assets @@ -126,11 +117,8 @@ pub mod pallet { /// (in terms of performance) bridge must be selected for the transfer. fn prepare_asset_transfer( _assets_count: u32, - ) -> Result< - (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation), - frame_benchmarking::BenchmarkError, - > { - Err(frame_benchmarking::BenchmarkError::Skip) + ) -> Option<(RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation)> { + None } /// Prepare environment for ping transfer and return transfer origin and assets @@ -144,19 +132,16 @@ pub mod pallet { /// - be close to the worst possible scenario - i.e. if some account may need to be created during /// it should be created. If there are multiple bridges, the "worst possible" /// (in terms of performance) bridge must be selected for the transfer. - fn prepare_ping( - ) -> Result<(RuntimeOrigin, VersionedMultiLocation), frame_benchmarking::BenchmarkError> { - Err(frame_benchmarking::BenchmarkError::Skip) + fn prepare_ping_transfer() -> Option<(RuntimeOrigin, VersionedMultiLocation)> { + None } - fn universal_alias( - ) -> Result<(VersionedMultiLocation, Junction), frame_benchmarking::BenchmarkError> { - Err(frame_benchmarking::BenchmarkError::Skip) + fn universal_alias() -> Option<(VersionedMultiLocation, Junction)> { + None } - fn reserve_location() -> Result - { - Err(frame_benchmarking::BenchmarkError::Skip) + fn reserve_location() -> Option { + None } } @@ -509,7 +494,7 @@ pub mod pallet { }) } - /// Add `(MultiLocation, Junction)` mapping to [`AllowedUniversalAliases`] + /// Add `(MultiLocation, Junction)` mapping to `AllowedUniversalAliases` /// /// Parameters: /// @@ -536,7 +521,7 @@ pub mod pallet { Ok(()) } - /// Remove `(MultiLocation, Junction)` mapping from [`AllowedUniversalAliases`] + /// Remove `(MultiLocation, Junction)` mapping from `AllowedUniversalAliases` /// /// Parameters: /// @@ -569,7 +554,7 @@ pub mod pallet { Ok(()) } - /// Add `MultiLocation` mapping to [`AllowedReserveLocations`] + /// Add `MultiLocation` mapping to `AllowedReserveLocations` /// /// Parameters: /// @@ -594,7 +579,7 @@ pub mod pallet { Ok(()) } - /// Remove `MultiLocation` mapping from [`AllowedReserveLocations`] + /// Remove `MultiLocation` mapping from `AllowedReserveLocations` /// /// Parameters: /// @@ -934,7 +919,7 @@ pub(crate) mod tests { (RuntimeOrigin::signed(sender_account), assets, destination) } - fn prepare_ping() { + fn prepare_ping_transfer() { unimplemented!("Not implemented here - not needed"); } } diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 8e1c81ee409..95f9fc3241d 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -821,12 +821,12 @@ mod benches { [pallet_timestamp, Timestamp] [pallet_collator_selection, CollatorSelection] [cumulus_pallet_xcmp_queue, XcmpQueue] + [pallet_bridge_transfer, BridgeTransfer] // XCM [pallet_xcm, PolkadotXcm] // NOTE: Make sure you point to the individual modules below. [pallet_xcm_benchmarks::fungible, XcmBalances] [pallet_xcm_benchmarks::generic, XcmGeneric] - [pallet_bridge_transfer, BridgeTransfer] ); } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs index ab3739c2c62..d39bc795577 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -140,4 +140,36 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + fn add_universal_alias() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn remove_universal_alias() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn add_reserve_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn remove_reserve_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) + .saturating_add(Weight::from_parts(0, 0)) + } } diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index e2013532c3d..1ef2c9d60c5 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -521,22 +521,16 @@ impl BridgeTransferBenchmarksHelper { MultiLocation::new(2, X2(GlobalConsensus(Polkadot), Parachain(1000))) } - fn target_location_fee() -> MultiAsset { - MultiAsset { id: Concrete(MultiLocation::parent()), fun: Fungible(50_000_000) } - } - /// Identifier of the sibling bridge-hub parachain. fn bridge_hub_para_id() -> u32 { - 1013 + 1002 } } #[cfg(feature = "runtime-benchmarks")] impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBenchmarksHelper { - fn bridge_config( - ) -> Result<(NetworkId, pallet_bridge_transfer::BridgeConfig), frame_benchmarking::BenchmarkError> - { - Ok(( + fn bridge_config() -> Option<(NetworkId, pallet_bridge_transfer::BridgeConfig)> { + Some(( Polkadot, pallet_bridge_transfer::BridgeConfig { bridge_location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), @@ -550,16 +544,9 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe )) } - fn target_location_fee_for_update() -> Option { - Some(xcm::VersionedMultiAsset::V3(Self::target_location_fee())) - } - fn prepare_asset_transfer( assets_count: u32, - ) -> Result< - (RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation), - frame_benchmarking::BenchmarkError, - > { + ) -> Option<(RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation)> { use frame_support::traits::Currency; assert_eq!(assets_count, 1, "Benchmarks needs to be fixed to support multiple assets"); @@ -579,11 +566,10 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe let assets = xcm::VersionedMultiAssets::V3(Self::make_asset(existential_deposit).into()); let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); - Ok((RuntimeOrigin::signed(sender_account), assets, destination)) + Some((RuntimeOrigin::signed(sender_account), assets, destination)) } - fn prepare_ping( - ) -> Result<(RuntimeOrigin, xcm::VersionedMultiLocation), frame_benchmarking::BenchmarkError> { + fn prepare_ping_transfer() -> Option<(RuntimeOrigin, xcm::VersionedMultiLocation)> { // our `BridgeXcmSender` assumes that the HRMP channel is opened between this // parachain and the sibling bridge-hub parachain cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( @@ -596,6 +582,6 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe // finally - prepare destination let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); - Ok((RuntimeOrigin::signed(sender_account), destination)) + Some((RuntimeOrigin::signed(sender_account), destination)) } } diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 6132fc78fcf..f1b174e3d78 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -80,7 +80,6 @@ use assets_common::{ foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, }; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm_builder::EnsureXcmOrigin; use xcm_executor::XcmExecutor; use crate::xcm_config::{ForeignCreatorsSovereignAccountOf, UniversalLocation}; @@ -677,9 +676,11 @@ impl pallet_bridge_transfer::Config for Runtime { // no transfer allowed out (now) type BridgeXcmSender = (); // no transfer allowed out (now) - type TransferAssetOrigin = EnsureXcmOrigin; + type TransferAssetOrigin = + frame_support::traits::NeverEnsureOrigin; // no transfer allowed out (now) - type TransferPingOrigin = EnsureXcmOrigin; + type TransferPingOrigin = + frame_support::traits::NeverEnsureOrigin; // no transfer allowed out (now) type PingMessageBuilder = (); #[cfg(feature = "runtime-benchmarks")] @@ -791,6 +792,7 @@ mod benches { [pallet_timestamp, Timestamp] [pallet_collator_selection, CollatorSelection] [cumulus_pallet_xcmp_queue, XcmpQueue] + [pallet_bridge_transfer, BridgeTransfer] // XCM [pallet_xcm, PolkadotXcm] // NOTE: Make sure you point to the individual modules below. @@ -1148,7 +1150,15 @@ impl_runtime_apis! { } fn universal_alias() -> Result { - <::BenchmarkHelper as pallet_bridge_transfer::BenchmarkHelper>::universal_alias().map(|(_, junction)| junction) + match <::BenchmarkHelper as pallet_bridge_transfer::BenchmarkHelper>::universal_alias() { + Some((location, junction)) => { + >::insert_universal_alias_for_benchmarks( + (location.clone().try_into().unwrap(), junction) + ); + Ok(junction) + }, + None => Err(BenchmarkError::Skip) + } } fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs index e5cd85da51c..714ea69695f 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -48,59 +48,21 @@ use sp_std::marker::PhantomData; /// Weight functions for `pallet_bridge_transfer`. pub struct WeightInfo(PhantomData); impl pallet_bridge_transfer::WeightInfo for WeightInfo { - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeTransfer Bridges (r:1 w:0) - /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) - /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn transfer_asset_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `439` - // Estimated: `25088` - // Minimum execution time: 111_964_000 picoseconds. - Weight::from_parts(113_251_000, 0) - .saturating_add(Weight::from_parts(0, 25088)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(5)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) + .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeTransfer Bridges (r:1 w:0) - /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) - /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn ping_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `299` - // Estimated: `18052` - // Minimum execution time: 57_960_000 picoseconds. - Weight::from_parts(58_812_000, 0) - .saturating_add(Weight::from_parts(0, 18052)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) + .saturating_add(Weight::from_parts(0, 0)) } /// Storage: BridgeTransfer Bridges (r:1 w:1) /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) @@ -138,20 +100,52 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - + /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) + /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) fn add_universal_alias() -> Weight { - Weight::zero() + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `5884` + // Minimum execution time: 17_805_000 picoseconds. + Weight::from_parts(17_805_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } - + /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) + /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) fn remove_universal_alias() -> Weight { - Weight::zero() + // Proof Size summary in bytes: + // Measured: `158` + // Estimated: `5884` + // Minimum execution time: 20_749_000 picoseconds. + Weight::from_parts(20_749_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } - + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: Some(1), max_size: Some(4817), added: 5312, mode: MaxEncodedLen) fn add_reserve_location() -> Weight { - Weight::zero() + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `6302` + // Minimum execution time: 17_832_000 picoseconds. + Weight::from_parts(17_832_000, 0) + .saturating_add(Weight::from_parts(0, 6302)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } - + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: Some(1), max_size: Some(4817), added: 5312, mode: MaxEncodedLen) fn remove_reserve_location() -> Weight { - Weight::zero() + // Proof Size summary in bytes: + // Measured: `141` + // Estimated: `6302` + // Minimum execution time: 20_772_000 picoseconds. + Weight::from_parts(20_772_000, 0) + .saturating_add(Weight::from_parts(0, 6302)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } } diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 851b313eb75..586ea47b6c2 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -505,24 +505,51 @@ impl BenchmarkHelper for XcmBenchmarkHelper { /// Benchmarks helper for over-bridge transfer pallet. #[cfg(feature = "runtime-benchmarks")] pub struct BridgeTransferBenchmarksHelper; + +#[cfg(feature = "runtime-benchmarks")] +impl BridgeTransferBenchmarksHelper { + /// Parachain at the other side of the bridge that we're connected to. + fn allowed_target_location() -> MultiLocation { + MultiLocation::new(2, X2(GlobalConsensus(Kusama), Parachain(1000))) + } + + /// Identifier of the sibling bridge-hub parachain. + fn bridge_hub_para_id() -> u32 { + 1002 + } +} + #[cfg(feature = "runtime-benchmarks")] impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBenchmarksHelper { - fn universal_alias( - ) -> Result<(xcm::VersionedMultiLocation, Junction), frame_benchmarking::BenchmarkError> { - Ok(( + fn bridge_config() -> Option<(NetworkId, pallet_bridge_transfer::BridgeConfig)> { + Some(( + Kusama, + pallet_bridge_transfer::BridgeConfig { + bridge_location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), + // TODO: right now `UnpaidRemoteExporter` is used to send XCM messages and it requires + // fee to be `None`. If we're going to change that (are we?), then we should replace + // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` + bridge_location_fee: None, + allowed_target_location: Self::allowed_target_location(), + target_location_fee: None, + }, + )) + } + + fn universal_alias() -> Option<(xcm::VersionedMultiLocation, Junction)> { + Some(( xcm::VersionedMultiLocation::V3(MultiLocation { parents: 1, - interior: X1(Parachain(1014)), + interior: X1(Parachain(Self::bridge_hub_para_id())), }), - GlobalConsensus(NetworkId::Kusama), + GlobalConsensus(Kusama), )) } - fn reserve_location() -> Result - { - Ok(xcm::VersionedMultiLocation::V3(MultiLocation { + fn reserve_location() -> Option { + Some(xcm::VersionedMultiLocation::V3(MultiLocation { parents: 2, - interior: X2(GlobalConsensus(NetworkId::Kusama), Parachain(1000)), + interior: X2(GlobalConsensus(Kusama), Parachain(1000)), })) } } From 45ca89bd4703615d087b126a4a4650bfe80d9070 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Thu, 30 Mar 2023 21:11:10 +0000 Subject: [PATCH 082/339] ".git/.scripts/commands/bench/bench.sh" pallet statemine assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs index d39bc795577..47a63b0eb36 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -70,8 +70,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `477` // Estimated: `25954` - // Minimum execution time: 130_298_000 picoseconds. - Weight::from_parts(131_689_000, 0) + // Minimum execution time: 126_493_000 picoseconds. + Weight::from_parts(127_684_000, 0) .saturating_add(Weight::from_parts(0, 25954)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(5)) @@ -96,8 +96,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `337` // Estimated: `18918` - // Minimum execution time: 57_840_000 picoseconds. - Weight::from_parts(58_460_000, 0) + // Minimum execution time: 57_858_000 picoseconds. + Weight::from_parts(59_418_000, 0) .saturating_add(Weight::from_parts(0, 18918)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -110,8 +110,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `109` // Estimated: `7491` - // Minimum execution time: 15_963_000 picoseconds. - Weight::from_parts(16_450_000, 0) + // Minimum execution time: 16_403_000 picoseconds. + Weight::from_parts(16_675_000, 0) .saturating_add(Weight::from_parts(0, 7491)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -122,8 +122,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `165` // Estimated: `6002` - // Minimum execution time: 13_832_000 picoseconds. - Weight::from_parts(14_281_000, 0) + // Minimum execution time: 13_993_000 picoseconds. + Weight::from_parts(14_352_000, 0) .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -134,8 +134,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `165` // Estimated: `6002` - // Minimum execution time: 19_073_000 picoseconds. - Weight::from_parts(19_285_000, 0) + // Minimum execution time: 18_944_000 picoseconds. + Weight::from_parts(19_371_000, 0) .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) From 727b3484896c300fb553869bfe47d514a0297d1b Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Thu, 30 Mar 2023 22:06:03 +0000 Subject: [PATCH 083/339] ".git/.scripts/commands/bench/bench.sh" pallet westmint assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 68 ++++++++++--------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs index 714ea69695f..23de590f2d1 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs @@ -17,10 +17,10 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 // Executed Command: // target/production/polkadot-parachain @@ -34,9 +34,9 @@ // --heap-pages=4096 // --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_bridge_transfer -// --chain=statemine-dev +// --chain=westmint-dev // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/ +// --output=./parachains/runtimes/assets/westmint/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -64,39 +64,41 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< Weight::from_parts(0, 0) .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: BridgeTransfer Bridges (r:1 w:1) - /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) fn add_exporter_config() -> Weight { // Proof Size summary in bytes: // Measured: `109` - // Estimated: `5364` - // Minimum execution time: 15_021_000 picoseconds. - Weight::from_parts(15_328_000, 0) - .saturating_add(Weight::from_parts(0, 5364)) - .saturating_add(T::DbWeight::get().reads(1)) + // Estimated: `7491` + // Minimum execution time: 15_704_000 picoseconds. + Weight::from_parts(16_139_000, 0) + .saturating_add(Weight::from_parts(0, 7491)) + .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: BridgeTransfer Bridges (r:1 w:1) - /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) fn remove_exporter_config() -> Weight { // Proof Size summary in bytes: - // Measured: `164` - // Estimated: `5364` - // Minimum execution time: 14_417_000 picoseconds. - Weight::from_parts(14_891_000, 0) - .saturating_add(Weight::from_parts(0, 5364)) + // Measured: `165` + // Estimated: `6002` + // Minimum execution time: 13_749_000 picoseconds. + Weight::from_parts(14_178_000, 0) + .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: BridgeTransfer Bridges (r:1 w:1) - /// Proof: BridgeTransfer Bridges (max_values: None, max_size: Some(1899), added: 4374, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) fn update_exporter_config() -> Weight { // Proof Size summary in bytes: - // Measured: `164` - // Estimated: `5364` - // Minimum execution time: 17_321_000 picoseconds. - Weight::from_parts(17_658_000, 0) - .saturating_add(Weight::from_parts(0, 5364)) + // Measured: `165` + // Estimated: `6002` + // Minimum execution time: 18_664_000 picoseconds. + Weight::from_parts(18_982_000, 0) + .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -106,8 +108,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `109` // Estimated: `5884` - // Minimum execution time: 17_805_000 picoseconds. - Weight::from_parts(17_805_000, 0) + // Minimum execution time: 12_859_000 picoseconds. + Weight::from_parts(19_737_000, 0) .saturating_add(Weight::from_parts(0, 5884)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -118,8 +120,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `158` // Estimated: `5884` - // Minimum execution time: 20_749_000 picoseconds. - Weight::from_parts(20_749_000, 0) + // Minimum execution time: 15_939_000 picoseconds. + Weight::from_parts(16_245_000, 0) .saturating_add(Weight::from_parts(0, 5884)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -130,8 +132,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `109` // Estimated: `6302` - // Minimum execution time: 17_832_000 picoseconds. - Weight::from_parts(17_832_000, 0) + // Minimum execution time: 12_764_000 picoseconds. + Weight::from_parts(13_060_000, 0) .saturating_add(Weight::from_parts(0, 6302)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -142,8 +144,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `141` // Estimated: `6302` - // Minimum execution time: 20_772_000 picoseconds. - Weight::from_parts(20_772_000, 0) + // Minimum execution time: 14_613_000 picoseconds. + Weight::from_parts(14_927_000, 0) .saturating_add(Weight::from_parts(0, 6302)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) From 826e1aab2a5e07af0c761588fdbd76712d84ce59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 09:29:41 +0200 Subject: [PATCH 084/339] Bump tokio from 1.26.0 to 1.27.0 (#2413) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.26.0 to 1.27.0. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.26.0...tokio-1.27.0) --- updated-dependencies: - dependency-name: tokio dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 15 +++++++-------- client/network/Cargo.toml | 2 +- client/pov-recovery/Cargo.toml | 2 +- client/relay-chain-minimal-node/Cargo.toml | 2 +- client/relay-chain-rpc-interface/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 7 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb9e1990039..d44670fa562 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11781,9 +11781,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.4" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", @@ -13257,14 +13257,13 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.26.0" +version = "1.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" +checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" dependencies = [ "autocfg", "bytes", "libc", - "memchr", "mio", "num_cpus", "parking_lot 0.12.1", @@ -13277,13 +13276,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.7.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.11", ] [[package]] diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index 130ab98b754..c6578d546f3 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -31,7 +31,7 @@ cumulus-relay-chain-interface = { path = "../relay-chain-interface" } [dev-dependencies] portpicker = "0.1.1" -tokio = { version = "1.26.0", features = ["macros"] } +tokio = { version = "1.27.0", features = ["macros"] } url = "2.3.1" # Substrate diff --git a/client/pov-recovery/Cargo.toml b/client/pov-recovery/Cargo.toml index 5ab23ec7791..68990975936 100644 --- a/client/pov-recovery/Cargo.toml +++ b/client/pov-recovery/Cargo.toml @@ -31,7 +31,7 @@ cumulus-relay-chain-interface = {path = "../relay-chain-interface"} async-trait = "0.1.68" [dev-dependencies] -tokio = { version = "1.26.0", features = ["macros"] } +tokio = { version = "1.27.0", features = ["macros"] } portpicker = "0.1.1" # Cumulus diff --git a/client/relay-chain-minimal-node/Cargo.toml b/client/relay-chain-minimal-node/Cargo.toml index 11918a4c958..f5d462ba826 100644 --- a/client/relay-chain-minimal-node/Cargo.toml +++ b/client/relay-chain-minimal-node/Cargo.toml @@ -38,4 +38,4 @@ lru = "0.9" tracing = "0.1.37" async-trait = "0.1.68" futures = "0.3.27" -tokio = { version = "1.26.0", features = ["macros"] } +tokio = { version = "1.27.0", features = ["macros"] } diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index 34458a4510e..904426da4aa 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -21,7 +21,7 @@ sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "mas sc-rpc-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } -tokio = { version = "1.26.0", features = ["sync"] } +tokio = { version = "1.27.0", features = ["sync"] } futures = "0.3.27" futures-timer = "3.0.2" diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index b285df93d71..c273c2e9acb 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -95,7 +95,7 @@ substrate-build-script-utils = { git = "https://github.com/paritytech/substrate" assert_cmd = "2.0" nix = { version = "0.26.1", features = ["signal"] } tempfile = "3.5.0" -tokio = { version = "1.26.0", features = ["macros", "time", "parking_lot"] } +tokio = { version = "1.27.0", features = ["macros", "time", "parking_lot"] } wait-timeout = "0.2" # purge_chain_works works with rococo-local and needs to allow this polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master", features = ["rococo-native"] } diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index ff88ae5b84f..f7efd1d0d49 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -16,7 +16,7 @@ criterion = { version = "0.4.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" serde = { version = "1.0.159", features = ["derive"] } -tokio = { version = "1.26.0", features = ["macros"] } +tokio = { version = "1.27.0", features = ["macros"] } tracing = "0.1.37" url = "2.3.1" From a92aeb3d00f4f8e1830b2b9607f5e6480b773da7 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 31 Mar 2023 10:00:33 +0200 Subject: [PATCH 085/339] Change test weights --- parachains/runtimes/assets/test-utils/src/test_cases.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index e49930c262a..e240447e5e4 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1374,7 +1374,7 @@ pub fn can_governance_change_bridge_transfer_configuration( UnpaidExecution { weight_limit: Unlimited, check_origin: None }, Transact { origin_kind: OriginKind::Superuser, - require_weight_at_most: Weight::from_parts(150_000_000, 6000), + require_weight_at_most: Weight::from_parts(200_000_000, 12000), call: runtime_call_encode(call).into(), }, ]); From 93d9b6afa21085bd2e54505b6bb961524dc59c2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 10:17:38 +0000 Subject: [PATCH 086/339] Bump syn from 2.0.11 to 2.0.12 (#2414) Bumps [syn](https://github.com/dtolnay/syn) from 2.0.11 to 2.0.12. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.11...2.0.12) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 16 ++++++++-------- pallets/parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d44670fa562..53b14f659bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -427,7 +427,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.12", ] [[package]] @@ -1214,7 +1214,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.12", ] [[package]] @@ -2092,7 +2092,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.12", ] [[package]] @@ -11529,7 +11529,7 @@ checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" dependencies = [ "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.12", ] [[package]] @@ -12992,9 +12992,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e3787bb71465627110e7d87ed4faaa36c1f61042ee67badb9e2ef173accc40" +checksum = "79d9531f94112cfc3e4c8f5f02cb2b58f72c97b7efd85f70203cc6d8efda5927" dependencies = [ "proc-macro2", "quote", @@ -13111,7 +13111,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.12", ] [[package]] @@ -13282,7 +13282,7 @@ checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.12", ] [[package]] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index bcb8c800cf1..d9938c3b1e0 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -9,7 +9,7 @@ description = "Proc macros provided by the parachain-system pallet" proc-macro = true [dependencies] -syn = "2.0.11" +syn = "2.0.12" proc-macro2 = "1.0.52" quote = "1.0.26" proc-macro-crate = "1.3.1" From b1cd3d5df949e8df07d594885acc685e8bdf3b41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 11:09:14 +0000 Subject: [PATCH 087/339] Bump proc-macro2 from 1.0.52 to 1.0.54 (#2415) Bumps [proc-macro2](https://github.com/dtolnay/proc-macro2) from 1.0.52 to 1.0.54. - [Release notes](https://github.com/dtolnay/proc-macro2/releases) - [Commits](https://github.com/dtolnay/proc-macro2/compare/1.0.52...1.0.54) --- updated-dependencies: - dependency-name: proc-macro2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- pallets/parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 53b14f659bc..1e6123727cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9266,9 +9266,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.52" +version = "1.0.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224" +checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534" dependencies = [ "unicode-ident", ] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index d9938c3b1e0..e42d076c77e 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -10,7 +10,7 @@ proc-macro = true [dependencies] syn = "2.0.12" -proc-macro2 = "1.0.52" +proc-macro2 = "1.0.54" quote = "1.0.26" proc-macro-crate = "1.3.1" From 9106fa8621db4b67a690efc998a692602bc35fdc Mon Sep 17 00:00:00 2001 From: PG Herveou Date: Fri, 31 Mar 2023 13:29:44 +0200 Subject: [PATCH 088/339] Companion PR for contract deletion updates (#2409) * Companion PR for contract deletion updates see https://github.com/paritytech/substrate/pull/13702 * Revert "Companion PR for contract deletion updates" This reverts commit 4fb2ca53a1bdfbd7dc0d35be52525da99547c76c. * fix lint * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 512 +++++++++--------- .../contracts-rococo/src/contracts.rs | 17 +- 2 files changed, 258 insertions(+), 271 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1e6123727cc..0753cbdf387 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -523,7 +523,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "hash-db", "log", @@ -3330,7 +3330,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", ] @@ -3353,7 +3353,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-support-procedural", @@ -3378,7 +3378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3425,7 +3425,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3436,7 +3436,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3453,7 +3453,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -3482,7 +3482,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "futures", "log", @@ -3498,7 +3498,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "bitflags", "environmental", @@ -3531,7 +3531,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "Inflector", "cfg-expr", @@ -3546,7 +3546,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "proc-macro2", "quote", @@ -3568,7 +3568,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "log", @@ -3586,7 +3586,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -3601,7 +3601,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "sp-api", @@ -3610,7 +3610,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "parity-scale-codec", @@ -4573,7 +4573,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bitvec", "frame-benchmarking", @@ -4671,7 +4671,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "frame-support", "polkadot-primitives", @@ -5519,7 +5519,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "futures", "log", @@ -5538,7 +5538,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "anyhow", "jsonrpsee", @@ -6027,7 +6027,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6048,7 +6048,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6066,7 +6066,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6081,7 +6081,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -6113,7 +6113,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -6127,7 +6127,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6151,7 +6151,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6171,7 +6171,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6186,7 +6186,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -6205,7 +6205,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6229,7 +6229,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6247,7 +6247,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6291,7 +6291,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6308,7 +6308,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "bitflags", "environmental", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "bitflags", "parity-scale-codec", @@ -6351,7 +6351,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "proc-macro2", "quote", @@ -6361,7 +6361,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6378,7 +6378,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6396,7 +6396,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6432,7 +6432,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6468,7 +6468,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6491,7 +6491,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6507,7 +6507,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6527,7 +6527,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6544,7 +6544,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -6558,7 +6558,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6575,7 +6575,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6592,7 +6592,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6608,7 +6608,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6626,7 +6626,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "pallet-nfts", @@ -6637,7 +6637,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6653,7 +6653,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -6670,7 +6670,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6701,7 +6701,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6742,7 +6742,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6759,7 +6759,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6774,7 +6774,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6792,7 +6792,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6807,7 +6807,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6826,7 +6826,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6843,7 +6843,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -6864,7 +6864,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6880,7 +6880,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -6894,7 +6894,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6917,7 +6917,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6928,7 +6928,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "log", "sp-arithmetic", @@ -6937,7 +6937,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "sp-api", @@ -6946,7 +6946,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -6963,7 +6963,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -6992,7 +6992,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -7010,7 +7010,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -7029,7 +7029,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-support", "frame-system", @@ -7045,7 +7045,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7061,7 +7061,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -7090,7 +7090,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -7105,7 +7105,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -7121,7 +7121,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -7136,7 +7136,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-benchmarking", "frame-support", @@ -7151,7 +7151,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7172,7 +7172,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "frame-benchmarking", "frame-support", @@ -7714,7 +7714,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "futures", "polkadot-node-metrics", @@ -7729,7 +7729,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7743,7 +7743,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "derive_more", "fatality", @@ -7766,7 +7766,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "fatality", "futures", @@ -7787,7 +7787,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "clap 4.1.13", "frame-benchmarking-cli", @@ -7815,7 +7815,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "async-trait", "frame-benchmarking", @@ -7858,7 +7858,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "always-assert", "bitvec", @@ -7880,7 +7880,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "parity-scale-codec", "scale-info", @@ -7892,7 +7892,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "derive_more", "fatality", @@ -7917,7 +7917,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -7931,7 +7931,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "futures", "futures-timer", @@ -7951,7 +7951,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "always-assert", "async-trait", @@ -7974,7 +7974,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "futures", "parity-scale-codec", @@ -7992,7 +7992,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bitvec", "derive_more", @@ -8021,7 +8021,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bitvec", "futures", @@ -8042,7 +8042,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bitvec", "fatality", @@ -8061,7 +8061,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8076,7 +8076,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "async-trait", "futures", @@ -8096,7 +8096,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "futures", "polkadot-node-metrics", @@ -8111,7 +8111,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "futures", "futures-timer", @@ -8128,7 +8128,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "fatality", "futures", @@ -8147,7 +8147,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "async-trait", "futures", @@ -8164,7 +8164,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bitvec", "fatality", @@ -8182,7 +8182,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "always-assert", "assert_matches", @@ -8219,7 +8219,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "futures", "polkadot-node-primitives", @@ -8235,7 +8235,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "futures", "lru 0.9.0", @@ -8250,7 +8250,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "lazy_static", "log", @@ -8268,7 +8268,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bs58", "futures", @@ -8287,7 +8287,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "async-trait", "derive_more", @@ -8309,7 +8309,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bounded-vec", "futures", @@ -8332,7 +8332,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8342,7 +8342,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "async-trait", "futures", @@ -8360,7 +8360,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "async-trait", "derive_more", @@ -8383,7 +8383,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "async-trait", "derive_more", @@ -8416,7 +8416,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "async-trait", "futures", @@ -8439,7 +8439,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bounded-collections", "derive_more", @@ -8536,7 +8536,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8552,7 +8552,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bitvec", "hex-literal", @@ -8578,7 +8578,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8610,7 +8610,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bitvec", "frame-benchmarking", @@ -8704,7 +8704,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bitvec", "frame-benchmarking", @@ -8750,7 +8750,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "frame-support", "polkadot-primitives", @@ -8764,7 +8764,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bs58", "parity-scale-codec", @@ -8776,7 +8776,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bitflags", "bitvec", @@ -8820,7 +8820,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -8930,7 +8930,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -8951,7 +8951,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -8961,7 +8961,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -8986,7 +8986,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9047,7 +9047,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "frame-benchmarking", "frame-system", @@ -9792,7 +9792,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -9878,7 +9878,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "frame-support", "polkadot-primitives", @@ -10125,7 +10125,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "log", "sp-core", @@ -10136,7 +10136,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "futures", @@ -10164,7 +10164,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "futures", "futures-timer", @@ -10187,7 +10187,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10202,7 +10202,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10221,7 +10221,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10232,7 +10232,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10272,7 +10272,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "fnv", "futures", @@ -10298,7 +10298,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "hash-db", "kvdb", @@ -10324,7 +10324,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "futures", @@ -10349,7 +10349,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "futures", @@ -10378,7 +10378,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "fork-tree", @@ -10417,7 +10417,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "futures", "jsonrpsee", @@ -10439,7 +10439,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10474,7 +10474,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "futures", "jsonrpsee", @@ -10493,7 +10493,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10506,7 +10506,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10546,7 +10546,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "finality-grandpa", "futures", @@ -10566,7 +10566,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "futures", @@ -10589,7 +10589,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10613,7 +10613,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10626,7 +10626,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "log", "sc-allocator", @@ -10639,7 +10639,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "anyhow", "cfg-if", @@ -10657,7 +10657,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "ansi_term", "futures", @@ -10673,7 +10673,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10688,7 +10688,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10732,7 +10732,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "cid", "futures", @@ -10752,7 +10752,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10780,7 +10780,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "ahash 0.8.2", "futures", @@ -10799,7 +10799,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10821,7 +10821,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10855,7 +10855,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10875,7 +10875,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -10906,7 +10906,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "futures", "libp2p", @@ -10919,7 +10919,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -10928,7 +10928,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "futures", "jsonrpsee", @@ -10958,7 +10958,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -10977,7 +10977,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "http", "jsonrpsee", @@ -10992,7 +10992,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11018,7 +11018,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "directories", @@ -11084,7 +11084,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "log", "parity-scale-codec", @@ -11095,7 +11095,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "clap 4.1.13", "fs4", @@ -11111,7 +11111,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11130,7 +11130,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "futures", "libc", @@ -11149,7 +11149,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "chrono", "futures", @@ -11168,7 +11168,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "ansi_term", "atty", @@ -11199,7 +11199,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11210,7 +11210,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "futures", @@ -11237,7 +11237,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "futures", @@ -11251,7 +11251,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-channel", "futures", @@ -11732,7 +11732,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "enumn", "parity-scale-codec", @@ -11809,7 +11809,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "hash-db", "log", @@ -11827,7 +11827,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "Inflector", "blake2", @@ -11841,7 +11841,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "scale-info", @@ -11854,7 +11854,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "integer-sqrt", "num-traits", @@ -11868,7 +11868,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "scale-info", @@ -11881,7 +11881,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "sp-api", @@ -11893,7 +11893,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "futures", "log", @@ -11911,7 +11911,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "futures", @@ -11926,7 +11926,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "parity-scale-codec", @@ -11944,7 +11944,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "merlin", @@ -11967,7 +11967,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "lazy_static", "parity-scale-codec", @@ -11986,7 +11986,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "finality-grandpa", "log", @@ -12004,7 +12004,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "scale-info", @@ -12016,7 +12016,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "scale-info", @@ -12029,7 +12029,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12072,7 +12072,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "blake2b_simd", "byteorder", @@ -12086,7 +12086,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "proc-macro2", "quote", @@ -12097,7 +12097,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12106,7 +12106,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "proc-macro2", "quote", @@ -12116,7 +12116,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "environmental", "parity-scale-codec", @@ -12127,7 +12127,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12142,7 +12142,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "bytes", "ed25519", @@ -12168,7 +12168,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "lazy_static", "sp-core", @@ -12179,7 +12179,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "futures", "merlin", @@ -12195,7 +12195,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "thiserror", "zstd", @@ -12204,7 +12204,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12222,7 +12222,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "scale-info", @@ -12236,7 +12236,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "sp-api", "sp-core", @@ -12246,7 +12246,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "backtrace", "lazy_static", @@ -12256,7 +12256,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "rustc-hash", "serde", @@ -12266,7 +12266,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "either", "hash256-std-hasher", @@ -12288,7 +12288,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12306,7 +12306,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "Inflector", "proc-macro-crate", @@ -12318,7 +12318,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "serde", "serde_json", @@ -12327,7 +12327,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "scale-info", @@ -12341,7 +12341,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "scale-info", @@ -12353,7 +12353,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "hash-db", "log", @@ -12373,12 +12373,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12391,7 +12391,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "futures-timer", @@ -12406,7 +12406,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "sp-std", @@ -12418,7 +12418,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "sp-api", "sp-runtime", @@ -12427,7 +12427,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "log", @@ -12443,7 +12443,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12466,7 +12466,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12483,7 +12483,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12494,7 +12494,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12508,7 +12508,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "parity-scale-codec", "scale-info", @@ -12832,7 +12832,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "platforms", ] @@ -12840,7 +12840,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -12859,7 +12859,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "hyper", "log", @@ -12871,7 +12871,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "jsonrpsee", @@ -12884,7 +12884,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "jsonrpsee", "log", @@ -12903,7 +12903,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12929,7 +12929,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "futures", "substrate-test-utils-derive", @@ -12939,7 +12939,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12950,7 +12950,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "ansi_term", "build-helper", @@ -13077,7 +13077,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "frame-support", "polkadot-primitives", @@ -13467,7 +13467,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13478,7 +13478,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "expander 0.0.6", "proc-macro-crate", @@ -13608,7 +13608,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44998291834b3a36a11c8dede63ce60362f1a3a5" +source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", "clap 4.1.13", @@ -14536,7 +14536,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bitvec", "frame-benchmarking", @@ -14628,7 +14628,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "frame-support", "polkadot-primitives", @@ -15064,7 +15064,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "bounded-collections", "derivative", @@ -15080,7 +15080,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "frame-support", "frame-system", @@ -15101,7 +15101,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "environmental", "frame-benchmarking", @@ -15121,7 +15121,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#1fe1702508f24b96b136f696fc180d6b27145c8b" +source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs b/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs index 7c19677603c..27a16a6357e 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs @@ -1,15 +1,13 @@ use crate::{ constants::currency::deposit, Balance, Balances, RandomnessCollectiveFlip, Runtime, - RuntimeBlockWeights, RuntimeCall, RuntimeEvent, Timestamp, + RuntimeCall, RuntimeEvent, Timestamp, }; use frame_support::{ parameter_types, traits::{ConstBool, ConstU32, Nothing}, - weights::Weight, }; use pallet_contracts::{ - weights::{SubstrateWeight, WeightInfo}, - Config, DefaultAddressGenerator, Frame, Schedule, + weights::SubstrateWeight, Config, DefaultAddressGenerator, Frame, Schedule, }; pub use parachains_common::AVERAGE_ON_INITIALIZE_RATIO; @@ -20,15 +18,6 @@ pub const CONTRACTS_DEBUG_OUTPUT: bool = true; parameter_types! { pub const DepositPerItem: Balance = deposit(1, 0); pub const DepositPerByte: Balance = deposit(0, 1); - // The lazy deletion runs inside on_initialize. - pub DeletionWeightLimit: Weight = AVERAGE_ON_INITIALIZE_RATIO * - RuntimeBlockWeights::get().max_block; - // The weight needed for decoding the queue should be less or equal than a fifth - // of the overall weight dedicated to the lazy deletion. - pub DeletionQueueDepth: u32 = ((DeletionWeightLimit::get().ref_time() / ( - ::WeightInfo::on_initialize_per_queue_item(1).ref_time() - - ::WeightInfo::on_initialize_per_queue_item(0).ref_time() - )) / 5) as u32; pub MySchedule: Schedule = Default::default(); } @@ -50,8 +39,6 @@ impl Config for Runtime { type WeightPrice = pallet_transaction_payment::Pallet; type WeightInfo = SubstrateWeight; type ChainExtension = (); - type DeletionQueueDepth = DeletionQueueDepth; - type DeletionWeightLimit = DeletionWeightLimit; type Schedule = MySchedule; type CallStack = [Frame; 5]; type AddressGenerator = DefaultAddressGenerator; From b82d6b1b9cc9805b6906aae6b32be01c615437f7 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 31 Mar 2023 14:44:59 +0200 Subject: [PATCH 089/339] Fix SafeCallFilter for westmint --- parachains/runtimes/assets/westmint/src/xcm_config.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 586ea47b6c2..104e41bd1b1 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -222,6 +222,7 @@ impl Contains for SafeCallFilter { pallet_utility::Call::batch { .. } | pallet_utility::Call::batch_all { .. }, ) | + RuntimeCall::BridgeTransfer(..) | RuntimeCall::Assets( pallet_assets::Call::create { .. } | pallet_assets::Call::force_create { .. } | From e5035c8279c4d7552039cc539a3d344d551260fc Mon Sep 17 00:00:00 2001 From: tmpolaczyk <44604217+tmpolaczyk@users.noreply.github.com> Date: Fri, 31 Mar 2023 17:08:07 +0200 Subject: [PATCH 090/339] Allow arbitrary key-values in RelayStateSproofBuilder (#2407) --- test/relay-sproof-builder/src/lib.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/relay-sproof-builder/src/lib.rs b/test/relay-sproof-builder/src/lib.rs index 93da853c8d1..decc6ee3aa0 100644 --- a/test/relay-sproof-builder/src/lib.rs +++ b/test/relay-sproof-builder/src/lib.rs @@ -45,6 +45,7 @@ pub struct RelayStateSproofBuilder { pub current_slot: relay_chain::Slot, pub current_epoch: u64, pub randomness: relay_chain::Hash, + pub additional_key_values: Vec<(Vec, Vec)>, } impl Default for RelayStateSproofBuilder { @@ -71,6 +72,7 @@ impl Default for RelayStateSproofBuilder { current_slot: 0.into(), current_epoch: 0u64, randomness: relay_chain::Hash::default(), + additional_key_values: vec![], } } } @@ -163,6 +165,10 @@ impl RelayStateSproofBuilder { self.randomness.encode(), ); insert(relay_chain::well_known_keys::CURRENT_SLOT.to_vec(), self.current_slot.encode()); + + for (key, value) in self.additional_key_values { + insert(key, value); + } } let root = backend.root().clone(); From e5d994b0c3471bd556235eaed07e27cedd28a0c8 Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Sat, 1 Apr 2023 16:44:32 +0200 Subject: [PATCH 091/339] help text examples + clean up (#2418) --- Cargo.lock | 23 +++++++++++++++++++ .../src/collator_overseer.rs | 8 +++---- client/relay-chain-minimal-node/src/lib.rs | 9 ++++---- .../src/reconnecting_ws_client.rs | 2 +- parachain-template/node/Cargo.toml | 3 ++- parachain-template/node/src/cli.rs | 13 +++++++++++ polkadot-parachain/Cargo.toml | 1 + polkadot-parachain/src/cli.rs | 10 ++++++++ 8 files changed, 59 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0753cbdf387..31021e2b8b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1324,6 +1324,27 @@ dependencies = [ "xcm-executor", ] +[[package]] +name = "color-print" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2a5e6504ed8648554968650feecea00557a3476bc040d0ffc33080e66b646d0" +dependencies = [ + "color-print-proc-macro", +] + +[[package]] +name = "color-print-proc-macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51beaa537d73d2d1ff34ee70bc095f170420ab2ec5d687ecd3ec2b0d092514b" +dependencies = [ + "nom", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "comfy-table" version = "6.0.0" @@ -7204,6 +7225,7 @@ name = "parachain-template-node" version = "0.1.0" dependencies = [ "clap 4.1.13", + "color-print", "cumulus-client-cli", "cumulus-client-consensus-aura", "cumulus-client-consensus-common", @@ -8464,6 +8486,7 @@ dependencies = [ "bridge-hub-rococo-runtime", "clap 4.1.13", "collectives-polkadot-runtime", + "color-print", "contracts-rococo-runtime", "cumulus-client-cli", "cumulus-client-consensus-aura", diff --git a/client/relay-chain-minimal-node/src/collator_overseer.rs b/client/relay-chain-minimal-node/src/collator_overseer.rs index dce68e3b1f6..9bcbc2a67a8 100644 --- a/client/relay-chain-minimal-node/src/collator_overseer.rs +++ b/client/relay-chain-minimal-node/src/collator_overseer.rs @@ -114,7 +114,7 @@ fn build_overseer<'a>( .collation_generation(CollationGenerationSubsystem::new(Metrics::register(registry)?)) .collator_protocol({ let side = ProtocolSide::Collator( - network_service.local_peer_id().clone(), + network_service.local_peer_id(), collator_pair, collation_req_receiver, Metrics::register(registry)?, @@ -129,8 +129,8 @@ fn build_overseer<'a>( peer_set_protocol_names.clone(), )) .network_bridge_tx(NetworkBridgeTxSubsystem::new( - network_service.clone(), - authority_discovery_service.clone(), + network_service, + authority_discovery_service, network_bridge_metrics, req_protocol_names, peer_set_protocol_names, @@ -170,7 +170,7 @@ pub(crate) fn spawn_overseer( e })?; - let overseer_handle = Handle::new(overseer_handle.clone()); + let overseer_handle = Handle::new(overseer_handle); { let handle = overseer_handle.clone(); task_manager.spawn_essential_handle().spawn_blocking( diff --git a/client/relay-chain-minimal-node/src/lib.rs b/client/relay-chain-minimal-node/src/lib.rs index c47f6d08d22..90afd31b8b6 100644 --- a/client/relay-chain-minimal-node/src/lib.rs +++ b/client/relay-chain-minimal-node/src/lib.rs @@ -69,7 +69,7 @@ fn build_authority_discovery_service( network.clone(), Box::pin(dht_event_stream), authority_discovery_role, - prometheus_registry.clone(), + prometheus_registry, ); task_manager.spawn_handle().spawn( @@ -150,9 +150,10 @@ async fn new_minimal_relay_chain( let (collation_req_receiver, available_data_req_receiver) = build_request_response_protocol_receivers(&request_protocol_names, &mut config); - let best_header = relay_chain_rpc_client.chain_get_header(None).await?.ok_or_else(|| { - RelayChainError::RpcCallError("Unable to fetch best header".to_string().into()) - })?; + let best_header = relay_chain_rpc_client + .chain_get_header(None) + .await? + .ok_or_else(|| RelayChainError::RpcCallError("Unable to fetch best header".to_string()))?; let (network, network_starter, sync_oracle) = build_collator_network(&config, task_manager.spawn_handle(), genesis_hash, best_header) .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; diff --git a/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs b/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs index 05d1c23bb7a..e03525226bc 100644 --- a/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs +++ b/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs @@ -381,7 +381,7 @@ impl ReconnectingWebsocketWorker { } if client_manager.connect_to_new_rpc_server().await.is_err() { - return Err(format!("Unable to find valid external RPC server, shutting down.")) + return Err("Unable to find valid external RPC server, shutting down.".to_string()) }; for item in requests_to_retry.into_iter() { diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index ba828fae060..29dfabe7e5f 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -52,7 +52,7 @@ substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate try-runtime-cli = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } # Polkadot -polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master", features = ["rococo-native"] } polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } @@ -64,6 +64,7 @@ cumulus-client-service = { path = "../../client/service" } cumulus-primitives-core = { path = "../../primitives/core" } cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } cumulus-relay-chain-interface = { path = "../../client/relay-chain-interface" } +color-print = "0.3.4" [build-dependencies] substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/parachain-template/node/src/cli.rs b/parachain-template/node/src/cli.rs index 1da49b3b168..2e64a53e96a 100644 --- a/parachain-template/node/src/cli.rs +++ b/parachain-template/node/src/cli.rs @@ -44,12 +44,25 @@ pub enum Subcommand { TryRuntime, } +const AFTER_HELP_EXAMPLE: &str = color_print::cstr!( + r#"Examples: + parachain-template-node build-spec --disable-default-bootnode > plain-parachain-chainspec.json + Export a chainspec for a local testnet in json format. + parachain-template-node --chain plain-parachain-chainspec.json --tmp -- --chain rococo-local + Launch a full node with chain specification loaded from plain-parachain-chainspec.json. + parachain-template-node + Launch a full node with default parachain local-testnet and relay chain rococo-local. + parachain-template-node --collator + Launch a collator with default parachain local-testnet and relay chain rococo-local. + "# +); #[derive(Debug, clap::Parser)] #[command( propagate_version = true, args_conflicts_with_subcommands = true, subcommand_negates_reqs = true )] +#[clap(after_help = AFTER_HELP_EXAMPLE)] pub struct Cli { #[command(subcommand)] pub subcommand: Option, diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index c273c2e9acb..f4bee0a272e 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -87,6 +87,7 @@ cumulus-client-service = { path = "../client/service" } cumulus-primitives-core = { path = "../primitives/core" } cumulus-primitives-parachain-inherent = { path = "../primitives/parachain-inherent" } cumulus-relay-chain-interface = { path = "../client/relay-chain-interface" } +color-print = "0.3.4" [build-dependencies] substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/polkadot-parachain/src/cli.rs b/polkadot-parachain/src/cli.rs index 90460095a6c..682911abf75 100644 --- a/polkadot-parachain/src/cli.rs +++ b/polkadot-parachain/src/cli.rs @@ -64,12 +64,22 @@ pub enum Subcommand { TryRuntime, } +const AFTER_HELP_EXAMPLE: &str = color_print::cstr!( + r#"Examples: + polkadot-parachain --chain statemint --sync warp -- --chain polkadot --sync warp + Launch a warp-syncing full node of the statemint parachain on the polkadot relay chain. + polkadot-parachain --chain statemint --sync warp --relay-chain-rpc-url ws://rpc.example.com -- --chain polkadot + Launch a warp-syncing full node of the statemint parachain on the polkadot relay chain. + Uses ws://rpc.example.com as remote relay chain node. + "# +); #[derive(Debug, clap::Parser)] #[command( propagate_version = true, args_conflicts_with_subcommands = true, subcommand_negates_reqs = true )] +#[clap(after_help = AFTER_HELP_EXAMPLE)] pub struct Cli { #[command(subcommand)] pub subcommand: Option, From e67094e551adf03379ad0886c1a0a66a451448cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Apr 2023 22:27:24 +0200 Subject: [PATCH 092/339] Bump futures from 0.3.27 to 0.3.28 (#2420) Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.27 to 0.3.28. - [Release notes](https://github.com/rust-lang/futures-rs/releases) - [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/futures-rs/compare/0.3.27...0.3.28) --- updated-dependencies: - dependency-name: futures dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 38 +++++++++---------- client/consensus/aura/Cargo.toml | 2 +- client/consensus/common/Cargo.toml | 2 +- client/consensus/relay-chain/Cargo.toml | 2 +- client/network/Cargo.toml | 2 +- client/pov-recovery/Cargo.toml | 2 +- .../Cargo.toml | 2 +- client/relay-chain-interface/Cargo.toml | 2 +- client/relay-chain-minimal-node/Cargo.toml | 2 +- client/relay-chain-rpc-interface/Cargo.toml | 2 +- client/service/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- primitives/timestamp/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 14 files changed, 32 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 31021e2b8b4..a00e83ce6dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3681,9 +3681,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531ac96c6ff5fd7c62263c5e3c67a603af4fcaee2e1a0ae5565ba3a11e69e549" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -3696,9 +3696,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -3706,15 +3706,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-executor" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1997dd9df74cdac935c76252744c1ed5794fac083242ea4fe77ef3ed60ba0f83" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" dependencies = [ "futures-core", "futures-task", @@ -3724,9 +3724,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-lite" @@ -3745,13 +3745,13 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.12", ] [[package]] @@ -3767,15 +3767,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-timer" @@ -3785,9 +3785,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-channel", "futures-core", diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index b7a65523cf5..f284391494f 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] async-trait = "0.1.68" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } -futures = "0.3.27" +futures = "0.3.28" tracing = "0.1.37" # Substrate diff --git a/client/consensus/common/Cargo.toml b/client/consensus/common/Cargo.toml index 84f3adaca1e..d0bc28171fb 100644 --- a/client/consensus/common/Cargo.toml +++ b/client/consensus/common/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" async-trait = "0.1.68" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } dyn-clone = "1.0.11" -futures = "0.3.27" +futures = "0.3.28" log = "0.4.17" tracing = "0.1.37" diff --git a/client/consensus/relay-chain/Cargo.toml b/client/consensus/relay-chain/Cargo.toml index b3cd2eea7b0..98331588ac1 100644 --- a/client/consensus/relay-chain/Cargo.toml +++ b/client/consensus/relay-chain/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] async-trait = "0.1.68" -futures = "0.3.27" +futures = "0.3.28" parking_lot = "0.12.1" tracing = "0.1.37" diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index c6578d546f3..4b7793d0cc4 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] async-trait = "0.1.68" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } -futures = "0.3.27" +futures = "0.3.28" futures-timer = "3.0.2" parking_lot = "0.12.1" tracing = "0.1.37" diff --git a/client/pov-recovery/Cargo.toml b/client/pov-recovery/Cargo.toml index 68990975936..542c79d3d78 100644 --- a/client/pov-recovery/Cargo.toml +++ b/client/pov-recovery/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } -futures = "0.3.27" +futures = "0.3.28" futures-timer = "3.0.2" rand = "0.8.5" tracing = "0.1.37" diff --git a/client/relay-chain-inprocess-interface/Cargo.toml b/client/relay-chain-inprocess-interface/Cargo.toml index 1959a7d163a..a3bc7de0eb1 100644 --- a/client/relay-chain-inprocess-interface/Cargo.toml +++ b/client/relay-chain-inprocess-interface/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] async-trait = "0.1.68" -futures = "0.3.27" +futures = "0.3.28" futures-timer = "3.0.2" # Substrate diff --git a/client/relay-chain-interface/Cargo.toml b/client/relay-chain-interface/Cargo.toml index 11d0f6d96a6..421c9c9aa9c 100644 --- a/client/relay-chain-interface/Cargo.toml +++ b/client/relay-chain-interface/Cargo.toml @@ -14,7 +14,7 @@ sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "mas sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -futures = "0.3.27" +futures = "0.3.28" async-trait = "0.1.68" thiserror = "1.0.40" jsonrpsee-core = "0.16.2" diff --git a/client/relay-chain-minimal-node/Cargo.toml b/client/relay-chain-minimal-node/Cargo.toml index f5d462ba826..737445c30c1 100644 --- a/client/relay-chain-minimal-node/Cargo.toml +++ b/client/relay-chain-minimal-node/Cargo.toml @@ -37,5 +37,5 @@ array-bytes = "6.0" lru = "0.9" tracing = "0.1.37" async-trait = "0.1.68" -futures = "0.3.27" +futures = "0.3.28" tokio = { version = "1.27.0", features = ["macros"] } diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index 904426da4aa..85f78b199e9 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -23,7 +23,7 @@ sc-service = { git = "https://github.com/paritytech/substrate", branch = "master tokio = { version = "1.27.0", features = ["sync"] } -futures = "0.3.27" +futures = "0.3.28" futures-timer = "3.0.2" parity-scale-codec = "3.4.0" jsonrpsee = { version = "0.16.2", features = ["ws-client"] } diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index e17809158a9..52ab82a1127 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -futures = "0.3.27" +futures = "0.3.28" # Substrate sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index f4bee0a272e..8f42c1ee1f1 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -14,7 +14,7 @@ path = "src/main.rs" async-trait = "0.1.68" clap = { version = "4.1.13", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } -futures = "0.3.27" +futures = "0.3.28" hex-literal = "0.3.4" log = "0.4.17" serde = { version = "1.0.159", features = ["derive"] } diff --git a/primitives/timestamp/Cargo.toml b/primitives/timestamp/Cargo.toml index 79fcaa535f6..254ab578b95 100644 --- a/primitives/timestamp/Cargo.toml +++ b/primitives/timestamp/Cargo.toml @@ -7,7 +7,7 @@ description = "Provides timestamp related functionality for parachains." [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -futures = "0.3.27" +futures = "0.3.28" # Substrate sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index f7efd1d0d49..ea2c5c3fc13 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -72,7 +72,7 @@ cumulus-relay-chain-minimal-node = { path = "../../client/relay-chain-minimal-no cumulus-client-pov-recovery = { path = "../../client/pov-recovery" } [dev-dependencies] -futures = "0.3.27" +futures = "0.3.28" portpicker = "0.1.1" # Polkadot dependencies From 6bdcf1f792a1e136657287c1d4dbc6782b866996 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Apr 2023 20:58:34 +0000 Subject: [PATCH 093/339] Bump clap from 4.1.13 to 4.1.14 (#2421) Bumps [clap](https://github.com/clap-rs/clap) from 4.1.13 to 4.1.14. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v4.1.13...v4.1.14) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 48 +++++++++++++++++------------- client/cli/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 5 files changed, 31 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a00e83ce6dc..06a1ea811aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1192,24 +1192,33 @@ dependencies = [ [[package]] name = "clap" -version = "4.1.13" +version = "4.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c911b090850d79fc64fe9ea01e28e465f65e821e08813ced95bced72f7a8a9b" +checksum = "906f7fe1da4185b7a282b2bc90172a496f9def1aca4545fe7526810741591e14" dependencies = [ - "bitflags", + "clap_builder", "clap_derive", - "clap_lex 0.3.0", - "is-terminal", "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351f9ad9688141ed83dfd8f5fb998a06225ef444b48ff4dc43de6d409b7fd10b" +dependencies = [ + "bitflags", + "clap_lex 0.4.1", + "is-terminal", "strsim", "termcolor", ] [[package]] name = "clap_derive" -version = "4.1.12" +version = "4.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a932373bab67b984c790ddf2c9ca295d8e3af3b7ef92de5a5bacdccdee4b09b" +checksum = "81d7dc0031c3a59a04fc2ba395c8e2dd463cba1859275f065d225f6122221b45" dependencies = [ "heck", "proc-macro2", @@ -1228,12 +1237,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8" -dependencies = [ - "os_str_bytes", -] +checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" [[package]] name = "coarsetime" @@ -1826,7 +1832,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.1.13", + "clap 4.1.14", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -2465,7 +2471,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.1.13", + "clap 4.1.14", "criterion", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -3404,7 +3410,7 @@ dependencies = [ "Inflector", "array-bytes 4.2.0", "chrono", - "clap 4.1.13", + "clap 4.1.14", "comfy-table", "frame-benchmarking", "frame-support", @@ -7224,7 +7230,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.1.13", + "clap 4.1.14", "color-print", "cumulus-client-cli", "cumulus-client-consensus-aura", @@ -7811,7 +7817,7 @@ name = "polkadot-cli" version = "0.9.39" source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" dependencies = [ - "clap 4.1.13", + "clap 4.1.14", "frame-benchmarking-cli", "futures", "log", @@ -8484,7 +8490,7 @@ dependencies = [ "bridge-hub-kusama-runtime", "bridge-hub-polkadot-runtime", "bridge-hub-rococo-runtime", - "clap 4.1.13", + "clap 4.1.14", "collectives-polkadot-runtime", "color-print", "contracts-rococo-runtime", @@ -10259,7 +10265,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da dependencies = [ "array-bytes 4.2.0", "chrono", - "clap 4.1.13", + "clap 4.1.14", "fdlimit", "futures", "libp2p", @@ -11120,7 +11126,7 @@ name = "sc-storage-monitor" version = "0.1.0" source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ - "clap 4.1.13", + "clap 4.1.14", "fs4", "futures", "log", @@ -13634,7 +13640,7 @@ version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" dependencies = [ "async-trait", - "clap 4.1.13", + "clap 4.1.14", "frame-remote-externalities", "frame-try-runtime", "hex", diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index a363cabc02d..68f8b472cf2 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -clap = { version = "4.1.13", features = ["derive"] } +clap = { version = "4.1.14", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.3.1" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index 29dfabe7e5f..5bdeffa1541 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" build = "build.rs" [dependencies] -clap = { version = "4.1.13", features = ["derive"] } +clap = { version = "4.1.14", features = ["derive"] } log = "0.4.17" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.159", features = ["derive"] } diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 8f42c1ee1f1..dca3d1edf66 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -12,7 +12,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.1.13", features = ["derive"] } +clap = { version = "4.1.14", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.3.4" diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index ea2c5c3fc13..5388b83e23e 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -10,7 +10,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.1.13", features = ["derive"] } +clap = { version = "4.1.14", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.4.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } From 66bfb2c7b4740c1624171faef19b3f382d02da47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 3 Apr 2023 12:55:29 +0200 Subject: [PATCH 094/339] Update Substrate & Polkadot (#2422) --- Cargo.lock | 565 ++++++++++++++++++++++++++++------------------------- 1 file changed, 298 insertions(+), 267 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 06a1ea811aa..85a361e944b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -523,7 +523,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "hash-db", "log", @@ -2558,13 +2558,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.0.0-pre.1" +version = "4.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4033478fbf70d6acf2655ac70da91ee65852d69daf7a67bf7a2f518fb47aafcf" +checksum = "8d4ba9852b42210c7538b75484f9daa0655e9a3ac04f693747bb0f02cf3cfe16" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.6.4", + "cfg-if", + "fiat-crypto", + "packed_simd_2", + "platforms 3.0.2", "subtle", "zeroize", ] @@ -3270,6 +3271,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "fiat-crypto" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" + [[package]] name = "file-per-thread-logger" version = "0.1.4" @@ -3357,7 +3364,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", ] @@ -3380,7 +3387,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-support-procedural", @@ -3405,7 +3412,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3452,7 +3459,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3463,7 +3470,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3480,7 +3487,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -3509,7 +3516,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "futures", "log", @@ -3525,7 +3532,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "bitflags", "environmental", @@ -3558,7 +3565,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "Inflector", "cfg-expr", @@ -3573,7 +3580,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3585,7 +3592,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "proc-macro2", "quote", @@ -3595,7 +3602,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "log", @@ -3613,7 +3620,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3635,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "sp-api", @@ -3637,7 +3644,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "parity-scale-codec", @@ -4600,7 +4607,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitvec", "frame-benchmarking", @@ -4698,7 +4705,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "frame-support", "polkadot-primitives", @@ -4770,6 +4777,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "libm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" + [[package]] name = "libm" version = "0.2.1" @@ -5546,7 +5559,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "futures", "log", @@ -5565,7 +5578,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "anyhow", "jsonrpsee", @@ -6051,10 +6064,20 @@ dependencies = [ "sha2 0.10.2", ] +[[package]] +name = "packed_simd_2" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" +dependencies = [ + "cfg-if", + "libm 0.1.4", +] + [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6075,7 +6098,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6093,7 +6116,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6108,7 +6131,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -6124,7 +6147,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -6140,7 +6163,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -6154,7 +6177,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6178,7 +6201,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6198,7 +6221,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6213,7 +6236,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -6232,7 +6255,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6256,7 +6279,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6274,7 +6297,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6318,7 +6341,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6335,7 +6358,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "bitflags", "environmental", @@ -6365,7 +6388,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "bitflags", "parity-scale-codec", @@ -6378,7 +6401,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "proc-macro2", "quote", @@ -6388,7 +6411,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6405,7 +6428,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6423,7 +6446,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6446,7 +6469,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6459,7 +6482,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6477,7 +6500,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6495,7 +6518,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6518,7 +6541,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6534,7 +6557,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6554,7 +6577,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6571,7 +6594,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -6585,7 +6608,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6602,7 +6625,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6619,7 +6642,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6635,7 +6658,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6653,7 +6676,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "pallet-nfts", @@ -6664,7 +6687,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6680,7 +6703,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -6697,7 +6720,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6717,7 +6740,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6728,7 +6751,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -6745,7 +6768,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6769,7 +6792,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6786,7 +6809,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6801,7 +6824,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6819,7 +6842,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6834,7 +6857,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6853,7 +6876,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6870,7 +6893,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -6891,7 +6914,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6907,7 +6930,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -6921,7 +6944,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6944,7 +6967,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6955,7 +6978,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "log", "sp-arithmetic", @@ -6964,7 +6987,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "sp-api", @@ -6973,7 +6996,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6990,7 +7013,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -7019,7 +7042,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7037,7 +7060,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7056,7 +7079,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-support", "frame-system", @@ -7072,7 +7095,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7088,7 +7111,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7100,7 +7123,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7117,7 +7140,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7132,7 +7155,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7148,7 +7171,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7163,7 +7186,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7178,7 +7201,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7199,7 +7222,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "frame-benchmarking", "frame-support", @@ -7711,6 +7734,12 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" +[[package]] +name = "platforms" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" + [[package]] name = "plotters" version = "0.3.1" @@ -7742,9 +7771,10 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "futures", + "polkadot-node-jaeger", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-primitives", @@ -7757,7 +7787,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7771,7 +7801,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "derive_more", "fatality", @@ -7794,7 +7824,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "fatality", "futures", @@ -7815,7 +7845,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "clap 4.1.14", "frame-benchmarking-cli", @@ -7843,7 +7873,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "async-trait", "frame-benchmarking", @@ -7886,7 +7916,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "always-assert", "bitvec", @@ -7908,7 +7938,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "parity-scale-codec", "scale-info", @@ -7920,7 +7950,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "derive_more", "fatality", @@ -7945,7 +7975,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -7959,7 +7989,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "futures", "futures-timer", @@ -7979,7 +8009,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "always-assert", "async-trait", @@ -8002,7 +8032,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "futures", "parity-scale-codec", @@ -8020,7 +8050,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitvec", "derive_more", @@ -8049,7 +8079,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitvec", "futures", @@ -8070,7 +8100,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitvec", "fatality", @@ -8089,7 +8119,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8104,7 +8134,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "async-trait", "futures", @@ -8124,7 +8154,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "futures", "polkadot-node-metrics", @@ -8139,7 +8169,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "futures", "futures-timer", @@ -8156,7 +8186,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "fatality", "futures", @@ -8175,7 +8205,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "async-trait", "futures", @@ -8192,7 +8222,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitvec", "fatality", @@ -8210,7 +8240,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "always-assert", "assert_matches", @@ -8247,7 +8277,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "futures", "polkadot-node-primitives", @@ -8263,7 +8293,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "futures", "lru 0.9.0", @@ -8278,7 +8308,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "lazy_static", "log", @@ -8296,7 +8326,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bs58", "futures", @@ -8315,7 +8345,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "async-trait", "derive_more", @@ -8337,7 +8367,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bounded-vec", "futures", @@ -8360,7 +8390,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8370,7 +8400,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "async-trait", "futures", @@ -8388,7 +8418,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "async-trait", "derive_more", @@ -8411,7 +8441,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "async-trait", "derive_more", @@ -8444,7 +8474,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "async-trait", "futures", @@ -8467,7 +8497,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bounded-collections", "derive_more", @@ -8565,7 +8595,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8581,7 +8611,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitvec", "hex-literal", @@ -8607,7 +8637,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8639,7 +8669,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitvec", "frame-benchmarking", @@ -8733,7 +8763,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitvec", "frame-benchmarking", @@ -8779,7 +8809,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "frame-support", "polkadot-primitives", @@ -8793,7 +8823,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bs58", "parity-scale-codec", @@ -8805,7 +8835,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitflags", "bitvec", @@ -8849,7 +8879,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -8959,7 +8989,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -8980,7 +9010,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -8990,7 +9020,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9015,7 +9045,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9076,7 +9106,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "frame-benchmarking", "frame-system", @@ -9821,7 +9851,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -9907,7 +9937,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "frame-support", "polkadot-primitives", @@ -10154,7 +10184,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "log", "sp-core", @@ -10165,7 +10195,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "futures", @@ -10193,7 +10223,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "futures", "futures-timer", @@ -10216,7 +10246,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10231,7 +10261,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10250,7 +10280,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10261,7 +10291,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10301,7 +10331,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "fnv", "futures", @@ -10327,7 +10357,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "hash-db", "kvdb", @@ -10353,7 +10383,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "futures", @@ -10378,7 +10408,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "futures", @@ -10407,7 +10437,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "fork-tree", @@ -10446,7 +10476,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "futures", "jsonrpsee", @@ -10468,7 +10498,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10503,7 +10533,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "futures", "jsonrpsee", @@ -10522,7 +10552,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10535,7 +10565,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10575,7 +10605,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "finality-grandpa", "futures", @@ -10595,7 +10625,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "futures", @@ -10618,7 +10648,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10642,7 +10672,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10655,7 +10685,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "log", "sc-allocator", @@ -10668,7 +10698,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "anyhow", "cfg-if", @@ -10686,7 +10716,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "ansi_term", "futures", @@ -10702,7 +10732,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10717,7 +10747,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10747,6 +10777,7 @@ dependencies = [ "serde", "serde_json", "smallvec", + "snow", "sp-arithmetic", "sp-blockchain", "sp-consensus", @@ -10761,7 +10792,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "cid", "futures", @@ -10781,7 +10812,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10809,7 +10840,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "ahash 0.8.2", "futures", @@ -10828,7 +10859,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10850,7 +10881,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10884,7 +10915,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10904,7 +10935,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -10935,7 +10966,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "futures", "libp2p", @@ -10948,7 +10979,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -10957,7 +10988,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "futures", "jsonrpsee", @@ -10987,7 +11018,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11006,7 +11037,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "http", "jsonrpsee", @@ -11021,7 +11052,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11047,7 +11078,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "directories", @@ -11113,7 +11144,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "log", "parity-scale-codec", @@ -11124,7 +11155,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "clap 4.1.14", "fs4", @@ -11140,7 +11171,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11159,7 +11190,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "futures", "libc", @@ -11178,7 +11209,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "chrono", "futures", @@ -11197,7 +11228,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "ansi_term", "atty", @@ -11228,7 +11259,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11239,7 +11270,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "futures", @@ -11266,7 +11297,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "futures", @@ -11280,7 +11311,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-channel", "futures", @@ -11761,7 +11792,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "enumn", "parity-scale-codec", @@ -11793,14 +11824,14 @@ checksum = "45456094d1983e2ee2a18fdfebce3189fa451699d0502cb8e3b49dba5ba41451" [[package]] name = "snow" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774d05a3edae07ce6d68ea6984f3c05e9bba8927e3dd591e3b479e5b03213d0d" +checksum = "5ccba027ba85743e09d15c03296797cad56395089b832b48b5a5217880f57733" dependencies = [ "aes-gcm 0.9.4", "blake2", "chacha20poly1305", - "curve25519-dalek 4.0.0-pre.1", + "curve25519-dalek 4.0.0-rc.1", "rand_core 0.6.4", "ring", "rustc_version 0.4.0", @@ -11838,7 +11869,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "hash-db", "log", @@ -11856,7 +11887,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "Inflector", "blake2", @@ -11870,7 +11901,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "scale-info", @@ -11883,7 +11914,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "integer-sqrt", "num-traits", @@ -11897,7 +11928,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "scale-info", @@ -11910,7 +11941,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "sp-api", @@ -11922,7 +11953,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "futures", "log", @@ -11940,7 +11971,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "futures", @@ -11955,7 +11986,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "parity-scale-codec", @@ -11973,7 +12004,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "merlin", @@ -11996,7 +12027,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12015,7 +12046,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "finality-grandpa", "log", @@ -12033,7 +12064,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "scale-info", @@ -12045,7 +12076,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "scale-info", @@ -12058,7 +12089,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12101,7 +12132,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "blake2b_simd", "byteorder", @@ -12115,7 +12146,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "proc-macro2", "quote", @@ -12126,7 +12157,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12135,7 +12166,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "proc-macro2", "quote", @@ -12145,7 +12176,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "environmental", "parity-scale-codec", @@ -12156,7 +12187,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12171,7 +12202,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "bytes", "ed25519", @@ -12197,7 +12228,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "lazy_static", "sp-core", @@ -12208,7 +12239,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "futures", "merlin", @@ -12224,7 +12255,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "thiserror", "zstd", @@ -12233,7 +12264,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12251,7 +12282,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "scale-info", @@ -12265,7 +12296,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "sp-api", "sp-core", @@ -12275,7 +12306,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "backtrace", "lazy_static", @@ -12285,7 +12316,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "rustc-hash", "serde", @@ -12295,7 +12326,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "either", "hash256-std-hasher", @@ -12317,7 +12348,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12335,7 +12366,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "Inflector", "proc-macro-crate", @@ -12347,7 +12378,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "serde", "serde_json", @@ -12356,7 +12387,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "scale-info", @@ -12370,7 +12401,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "scale-info", @@ -12382,7 +12413,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "hash-db", "log", @@ -12402,12 +12433,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12420,7 +12451,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "futures-timer", @@ -12435,7 +12466,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "sp-std", @@ -12447,7 +12478,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "sp-api", "sp-runtime", @@ -12456,7 +12487,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "log", @@ -12472,7 +12503,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12495,7 +12526,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12512,7 +12543,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12523,7 +12554,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12537,7 +12568,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "parity-scale-codec", "scale-info", @@ -12861,15 +12892,15 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ - "platforms", + "platforms 2.0.0", ] [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -12888,7 +12919,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "hyper", "log", @@ -12900,7 +12931,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "jsonrpsee", @@ -12913,7 +12944,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "jsonrpsee", "log", @@ -12932,7 +12963,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12958,7 +12989,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "futures", "substrate-test-utils-derive", @@ -12968,7 +12999,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12979,7 +13010,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "ansi_term", "build-helper", @@ -13106,7 +13137,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "frame-support", "polkadot-primitives", @@ -13496,7 +13527,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13507,7 +13538,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "expander 0.0.6", "proc-macro-crate", @@ -13637,7 +13668,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#de4cca40b5da41e76c111c66229521f1052ea298" +source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" dependencies = [ "async-trait", "clap 4.1.14", @@ -14085,7 +14116,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57d20cb3c59b788653d99541c646c561c9dd26506f25c0cebfe810659c54c6d7" dependencies = [ "downcast-rs", - "libm", + "libm 0.2.1", "memory_units", "num-rational", "num-traits", @@ -14099,7 +14130,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624e6333e861ef49095d2d678b76ebf30b06bf37effca845be7e5b87c90071b7" dependencies = [ "downcast-rs", - "libm", + "libm 0.2.1", "num-traits", "paste", ] @@ -14565,7 +14596,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitvec", "frame-benchmarking", @@ -14657,7 +14688,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "frame-support", "polkadot-primitives", @@ -15093,7 +15124,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bounded-collections", "derivative", @@ -15109,7 +15140,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "frame-support", "frame-system", @@ -15130,7 +15161,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "environmental", "frame-benchmarking", @@ -15150,7 +15181,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#2708cf111392e3d9a02471c1b50b6079c278d2f4" +source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "Inflector", "proc-macro2", From d12c6d03c94bb93b071595d1a93e8e4dfdd65e10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Apr 2023 21:51:47 +0000 Subject: [PATCH 095/339] Bump syn from 2.0.12 to 2.0.13 (#2428) Bumps [syn](https://github.com/dtolnay/syn) from 2.0.12 to 2.0.13. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.12...2.0.13) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 22 +++++++++---------- .../parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 85a361e944b..83cf774daea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -427,7 +427,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.12", + "syn 2.0.13", ] [[package]] @@ -1223,7 +1223,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.12", + "syn 2.0.13", ] [[package]] @@ -2119,7 +2119,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.12", + "syn 2.0.13", ] [[package]] @@ -3764,7 +3764,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.12", + "syn 2.0.13", ] [[package]] @@ -9325,9 +9325,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.54" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ "unicode-ident", ] @@ -11589,7 +11589,7 @@ checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" dependencies = [ "proc-macro2", "quote", - "syn 2.0.12", + "syn 2.0.13", ] [[package]] @@ -13052,9 +13052,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.12" +version = "2.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79d9531f94112cfc3e4c8f5f02cb2b58f72c97b7efd85f70203cc6d8efda5927" +checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" dependencies = [ "proc-macro2", "quote", @@ -13171,7 +13171,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.12", + "syn 2.0.13", ] [[package]] @@ -13342,7 +13342,7 @@ checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.12", + "syn 2.0.13", ] [[package]] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index e42d076c77e..170372eb2b1 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -9,7 +9,7 @@ description = "Proc macros provided by the parachain-system pallet" proc-macro = true [dependencies] -syn = "2.0.12" +syn = "2.0.13" proc-macro2 = "1.0.54" quote = "1.0.26" proc-macro-crate = "1.3.1" From 697f0cd1d8900153e4bd4f7bc91c547d6f476362 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Apr 2023 21:53:58 +0000 Subject: [PATCH 096/339] Bump hex-literal from 0.3.4 to 0.4.0 (#2426) Bumps [hex-literal](https://github.com/RustCrypto/utils) from 0.3.4 to 0.4.0. - [Release notes](https://github.com/RustCrypto/utils/releases) - [Commits](https://github.com/RustCrypto/utils/compare/hex-literal-v0.3.4...hex-literal-v0.4.0) --- updated-dependencies: - dependency-name: hex-literal dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 44 +++++++++++-------- pallets/parachain-system/Cargo.toml | 2 +- parachain-template/runtime/Cargo.toml | 2 +- .../runtimes/assets/statemine/Cargo.toml | 2 +- .../runtimes/assets/statemint/Cargo.toml | 4 +- .../runtimes/assets/westmint/Cargo.toml | 4 +- .../bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../bridge-hub-polkadot/Cargo.toml | 2 +- .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- .../collectives-polkadot/Cargo.toml | 4 +- .../contracts/contracts-rococo/Cargo.toml | 2 +- parachains/runtimes/testing/penpal/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- 13 files changed, 40 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 83cf774daea..a9cf1112cb9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -342,7 +342,7 @@ dependencies = [ "cumulus-test-relay-sproof-builder", "frame-support", "frame-system", - "hex-literal", + "hex-literal 0.3.4", "pallet-assets", "pallet-balances", "pallet-collator-selection", @@ -716,7 +716,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.4.0", "kusama-runtime-constants", "log", "pallet-aura", @@ -779,7 +779,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.4.0", "log", "pallet-aura", "pallet-authorship", @@ -842,7 +842,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.4.0", "log", "pallet-aura", "pallet-authorship", @@ -1283,7 +1283,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.4.0", "log", "pallet-alliance", "pallet-aura", @@ -1418,7 +1418,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.4.0", "kusama-runtime-constants", "log", "pallet-aura", @@ -2090,7 +2090,7 @@ dependencies = [ "environmental", "frame-support", "frame-system", - "hex-literal", + "hex-literal 0.4.0", "impl-trait-for-tuples", "lazy_static", "log", @@ -4061,6 +4061,12 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" +[[package]] +name = "hex-literal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcb5b3e439c92a7191df2f9bbe733de8de55c3f86368cdb1c63f8be7e9e328e" + [[package]] name = "hkdf" version = "0.12.3" @@ -4618,7 +4624,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.3.4", "kusama-runtime-constants", "log", "pallet-authority-discovery", @@ -7323,7 +7329,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.4.0", "log", "pallet-aura", "pallet-authorship", @@ -7566,7 +7572,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.4.0", "log", "pallet-asset-tx-payment", "pallet-assets", @@ -8535,7 +8541,7 @@ dependencies = [ "frame-benchmarking", "frame-benchmarking-cli", "futures", - "hex-literal", + "hex-literal 0.4.0", "jsonrpsee", "log", "nix 0.26.2", @@ -8614,7 +8620,7 @@ version = "0.9.39" source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" dependencies = [ "bitvec", - "hex-literal", + "hex-literal 0.3.4", "parity-scale-codec", "polkadot-core-primitives", "polkadot-parachain", @@ -8680,7 +8686,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.3.4", "log", "pallet-authority-discovery", "pallet-authorship", @@ -8886,7 +8892,7 @@ dependencies = [ "frame-support", "frame-system-rpc-runtime-api", "futures", - "hex-literal", + "hex-literal 0.3.4", "kusama-runtime", "kvdb", "kvdb-rocksdb", @@ -9861,7 +9867,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.3.4", "log", "pallet-authority-discovery", "pallet-authorship", @@ -12655,7 +12661,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.4.0", "kusama-runtime-constants", "log", "pallet-asset-tx-payment", @@ -12725,7 +12731,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.4.0", "log", "pallet-asset-tx-payment", "pallet-assets", @@ -14607,7 +14613,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.3.4", "log", "pallet-authority-discovery", "pallet-authorship", @@ -14721,7 +14727,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal", + "hex-literal 0.4.0", "log", "pallet-asset-tx-payment", "pallet-assets", diff --git a/pallets/parachain-system/Cargo.toml b/pallets/parachain-system/Cargo.toml index b7eef00712e..c4aa4ffa1e3 100644 --- a/pallets/parachain-system/Cargo.toml +++ b/pallets/parachain-system/Cargo.toml @@ -36,7 +36,7 @@ cumulus-primitives-core = { path = "../../primitives/core", default-features = f cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent", default-features = false } [dev-dependencies] -hex-literal = "0.3.4" +hex-literal = "0.4.0" lazy_static = "1.4" # Substrate diff --git a/parachain-template/runtime/Cargo.toml b/parachain-template/runtime/Cargo.toml index fe15f82af0e..0fa6948d58b 100644 --- a/parachain-template/runtime/Cargo.toml +++ b/parachain-template/runtime/Cargo.toml @@ -16,7 +16,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.3.4", optional = true } +hex-literal = { version = "0.4.0", optional = true } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index 704a49a0a55..3fdac10c637 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -7,7 +7,7 @@ description = "Kusama variant of Statemint parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.3.4" } +hex-literal = { version = "0.4.0" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/assets/statemint/Cargo.toml b/parachains/runtimes/assets/statemint/Cargo.toml index bd482fd2a06..273c3ff5c2c 100644 --- a/parachains/runtimes/assets/statemint/Cargo.toml +++ b/parachains/runtimes/assets/statemint/Cargo.toml @@ -7,7 +7,7 @@ description = "Statemint parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.3.4", optional = true } +hex-literal = { version = "0.4.0", optional = true } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" @@ -73,7 +73,7 @@ parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } [dev-dependencies] -hex-literal = "0.3.4" +hex-literal = "0.4.0" asset-test-utils = { path = "../test-utils"} [build-dependencies] diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/westmint/Cargo.toml index d98db24e185..89b59b7def4 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/westmint/Cargo.toml @@ -7,7 +7,7 @@ description = "Westend variant of Statemint parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.3.4", optional = true } +hex-literal = { version = "0.4.0", optional = true } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" @@ -74,7 +74,7 @@ parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } [dev-dependencies] -hex-literal = "0.3.4" +hex-literal = "0.4.0" asset-test-utils = { path = "../test-utils"} [build-dependencies] diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index f0392c7716b..9d8703a6ab8 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -10,7 +10,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.3.4" } +hex-literal = { version = "0.4.0" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } serde = { version = "1.0.159", optional = true, features = ["derive"] } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 8f29167a24f..2d00cd9fce3 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -10,7 +10,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.3.4" } +hex-literal = { version = "0.4.0" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } serde = { version = "1.0.159", optional = true, features = ["derive"] } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 30e3cad3e21..8cc54ac2672 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -10,7 +10,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.3.4" } +hex-literal = { version = "0.4.0" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } serde = { version = "1.0.159", optional = true, features = ["derive"] } diff --git a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml index ba3b9ece735..c0659ffb825 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml +++ b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml @@ -7,7 +7,7 @@ description = "Polkadot Collectives Parachain Runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.3.4", optional = true } +hex-literal = { version = "0.4.0", optional = true } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" @@ -74,7 +74,7 @@ parachain-info = { path = "../../../pallets/parachain-info", default-features = parachains-common = { path = "../../../common", default-features = false } [dev-dependencies] -hex-literal = "0.3.4" +hex-literal = "0.4.0" [build-dependencies] substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } diff --git a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index b667bbf8a98..9b5809b3d38 100644 --- a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.3.4", optional = true } +hex-literal = { version = "0.4.0", optional = true } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/testing/penpal/Cargo.toml b/parachains/runtimes/testing/penpal/Cargo.toml index e1ff15b0e02..105f5f8072a 100644 --- a/parachains/runtimes/testing/penpal/Cargo.toml +++ b/parachains/runtimes/testing/penpal/Cargo.toml @@ -16,7 +16,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.3.4", optional = true } +hex-literal = { version = "0.4.0", optional = true } log = { version = "0.4.16", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index dca3d1edf66..9b1e0e10484 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -15,7 +15,7 @@ async-trait = "0.1.68" clap = { version = "4.1.14", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" -hex-literal = "0.3.4" +hex-literal = "0.4.0" log = "0.4.17" serde = { version = "1.0.159", features = ["derive"] } From 53c6b8d71a3261f27d67cc8bd05d3646f6d332ac Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 4 Apr 2023 11:32:03 +0200 Subject: [PATCH 097/339] Companion for #6986 (#2416) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: apply substrate/pull/13610 * Added `origin` to config for `universal_origin` benchmark * update lockfile for {"polkadot", "substrate"} * Update --------- Co-authored-by: William Freudenberger Co-authored-by: parity-processbot <> Co-authored-by: Bastian Köcher --- Cargo.lock | 512 +++++++++--------- parachains/common/src/xcm_config.rs | 4 +- .../runtimes/assets/statemine/src/lib.rs | 2 +- .../runtimes/assets/statemint/src/lib.rs | 2 +- .../runtimes/assets/westmint/src/lib.rs | 2 +- .../bridge-hubs/bridge-hub-kusama/src/lib.rs | 2 +- .../bridge-hub-polkadot/src/lib.rs | 2 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 2 +- 8 files changed, 264 insertions(+), 264 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a9cf1112cb9..163917a1be1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -523,7 +523,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "hash-db", "log", @@ -3364,7 +3364,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", ] @@ -3387,7 +3387,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-support-procedural", @@ -3412,7 +3412,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3459,7 +3459,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3470,7 +3470,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3487,7 +3487,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -3516,7 +3516,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "futures", "log", @@ -3532,7 +3532,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "bitflags", "environmental", @@ -3565,7 +3565,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "Inflector", "cfg-expr", @@ -3580,7 +3580,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3592,7 +3592,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "proc-macro2", "quote", @@ -3602,7 +3602,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "log", @@ -3620,7 +3620,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3635,7 +3635,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "sp-api", @@ -3644,7 +3644,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "parity-scale-codec", @@ -4613,7 +4613,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bitvec", "frame-benchmarking", @@ -4711,7 +4711,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "frame-support", "polkadot-primitives", @@ -5565,7 +5565,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "futures", "log", @@ -5584,7 +5584,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "anyhow", "jsonrpsee", @@ -6083,7 +6083,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6104,7 +6104,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6122,7 +6122,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6137,7 +6137,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -6153,7 +6153,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -6169,7 +6169,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -6183,7 +6183,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6207,7 +6207,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6227,7 +6227,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6242,7 +6242,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -6261,7 +6261,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6285,7 +6285,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6303,7 +6303,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6347,7 +6347,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6364,7 +6364,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "bitflags", "environmental", @@ -6394,7 +6394,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "bitflags", "parity-scale-codec", @@ -6407,7 +6407,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "proc-macro2", "quote", @@ -6417,7 +6417,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6434,7 +6434,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6452,7 +6452,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6475,7 +6475,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6488,7 +6488,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6506,7 +6506,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6524,7 +6524,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6547,7 +6547,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6563,7 +6563,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6583,7 +6583,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6600,7 +6600,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -6614,7 +6614,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6631,7 +6631,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6648,7 +6648,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6664,7 +6664,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6682,7 +6682,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "pallet-nfts", @@ -6693,7 +6693,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6709,7 +6709,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -6726,7 +6726,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6757,7 +6757,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -6774,7 +6774,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6830,7 +6830,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6848,7 +6848,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6863,7 +6863,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6882,7 +6882,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6899,7 +6899,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -6920,7 +6920,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6936,7 +6936,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -6950,7 +6950,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6973,7 +6973,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6984,7 +6984,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "log", "sp-arithmetic", @@ -6993,7 +6993,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "sp-api", @@ -7002,7 +7002,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7019,7 +7019,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7066,7 +7066,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7085,7 +7085,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-support", "frame-system", @@ -7101,7 +7101,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7117,7 +7117,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7129,7 +7129,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7146,7 +7146,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7161,7 +7161,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7177,7 +7177,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7192,7 +7192,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7207,7 +7207,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7228,7 +7228,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7777,7 +7777,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "futures", "polkadot-node-jaeger", @@ -7793,7 +7793,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7807,7 +7807,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "derive_more", "fatality", @@ -7830,7 +7830,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "fatality", "futures", @@ -7851,7 +7851,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "clap 4.1.14", "frame-benchmarking-cli", @@ -7879,7 +7879,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "async-trait", "frame-benchmarking", @@ -7922,7 +7922,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "always-assert", "bitvec", @@ -7944,7 +7944,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "parity-scale-codec", "scale-info", @@ -7956,7 +7956,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "derive_more", "fatality", @@ -7981,7 +7981,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -7995,7 +7995,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "futures", "futures-timer", @@ -8015,7 +8015,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "always-assert", "async-trait", @@ -8038,7 +8038,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "futures", "parity-scale-codec", @@ -8056,7 +8056,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bitvec", "derive_more", @@ -8085,7 +8085,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bitvec", "futures", @@ -8106,7 +8106,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bitvec", "fatality", @@ -8125,7 +8125,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8140,7 +8140,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "async-trait", "futures", @@ -8160,7 +8160,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "futures", "polkadot-node-metrics", @@ -8175,7 +8175,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "futures", "futures-timer", @@ -8192,7 +8192,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "fatality", "futures", @@ -8211,7 +8211,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "async-trait", "futures", @@ -8228,7 +8228,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bitvec", "fatality", @@ -8246,7 +8246,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "always-assert", "assert_matches", @@ -8283,7 +8283,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "futures", "polkadot-node-primitives", @@ -8299,7 +8299,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "futures", "lru 0.9.0", @@ -8314,7 +8314,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "lazy_static", "log", @@ -8332,7 +8332,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bs58", "futures", @@ -8351,7 +8351,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "async-trait", "derive_more", @@ -8373,7 +8373,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bounded-vec", "futures", @@ -8396,7 +8396,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8406,7 +8406,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "async-trait", "futures", @@ -8424,7 +8424,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "async-trait", "derive_more", @@ -8447,7 +8447,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "async-trait", "derive_more", @@ -8480,7 +8480,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "async-trait", "futures", @@ -8503,7 +8503,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bounded-collections", "derive_more", @@ -8601,7 +8601,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8617,7 +8617,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bitvec", "hex-literal 0.3.4", @@ -8643,7 +8643,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8675,7 +8675,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bitvec", "frame-benchmarking", @@ -8769,7 +8769,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bitvec", "frame-benchmarking", @@ -8815,7 +8815,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "frame-support", "polkadot-primitives", @@ -8829,7 +8829,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bs58", "parity-scale-codec", @@ -8841,7 +8841,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bitflags", "bitvec", @@ -8885,7 +8885,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -8995,7 +8995,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9016,7 +9016,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9026,7 +9026,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9051,7 +9051,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9112,7 +9112,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "frame-benchmarking", "frame-system", @@ -9857,7 +9857,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -9943,7 +9943,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "frame-support", "polkadot-primitives", @@ -10190,7 +10190,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "log", "sp-core", @@ -10201,7 +10201,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "futures", @@ -10229,7 +10229,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "futures", "futures-timer", @@ -10252,7 +10252,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10267,7 +10267,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10286,7 +10286,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10297,7 +10297,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10337,7 +10337,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "fnv", "futures", @@ -10363,7 +10363,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "hash-db", "kvdb", @@ -10389,7 +10389,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "futures", @@ -10414,7 +10414,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "futures", @@ -10443,7 +10443,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "fork-tree", @@ -10482,7 +10482,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "futures", "jsonrpsee", @@ -10504,7 +10504,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10539,7 +10539,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "futures", "jsonrpsee", @@ -10558,7 +10558,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10571,7 +10571,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10611,7 +10611,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "finality-grandpa", "futures", @@ -10631,7 +10631,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "futures", @@ -10654,7 +10654,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10678,7 +10678,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10691,7 +10691,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "log", "sc-allocator", @@ -10704,7 +10704,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "anyhow", "cfg-if", @@ -10722,7 +10722,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "ansi_term", "futures", @@ -10738,7 +10738,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10753,7 +10753,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10798,7 +10798,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "cid", "futures", @@ -10818,7 +10818,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10846,7 +10846,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "ahash 0.8.2", "futures", @@ -10865,7 +10865,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10887,7 +10887,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10921,7 +10921,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10941,7 +10941,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -10972,7 +10972,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "futures", "libp2p", @@ -10985,7 +10985,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -10994,7 +10994,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "futures", "jsonrpsee", @@ -11024,7 +11024,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11043,7 +11043,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "http", "jsonrpsee", @@ -11058,7 +11058,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11084,7 +11084,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "directories", @@ -11150,7 +11150,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "log", "parity-scale-codec", @@ -11161,7 +11161,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "clap 4.1.14", "fs4", @@ -11177,7 +11177,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11196,7 +11196,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "futures", "libc", @@ -11215,7 +11215,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "chrono", "futures", @@ -11234,7 +11234,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "ansi_term", "atty", @@ -11265,7 +11265,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11276,7 +11276,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "futures", @@ -11303,7 +11303,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "futures", @@ -11317,7 +11317,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-channel", "futures", @@ -11798,7 +11798,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "enumn", "parity-scale-codec", @@ -11875,7 +11875,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "hash-db", "log", @@ -11893,7 +11893,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "Inflector", "blake2", @@ -11907,7 +11907,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "scale-info", @@ -11920,7 +11920,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "integer-sqrt", "num-traits", @@ -11934,7 +11934,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "scale-info", @@ -11947,7 +11947,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "sp-api", @@ -11959,7 +11959,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "futures", "log", @@ -11977,7 +11977,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "futures", @@ -11992,7 +11992,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "parity-scale-codec", @@ -12010,7 +12010,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "merlin", @@ -12033,7 +12033,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12052,7 +12052,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "finality-grandpa", "log", @@ -12070,7 +12070,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12082,7 +12082,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12095,7 +12095,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12138,7 +12138,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "blake2b_simd", "byteorder", @@ -12152,7 +12152,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "proc-macro2", "quote", @@ -12163,7 +12163,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12172,7 +12172,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "proc-macro2", "quote", @@ -12182,7 +12182,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "environmental", "parity-scale-codec", @@ -12193,7 +12193,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12208,7 +12208,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "bytes", "ed25519", @@ -12234,7 +12234,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "lazy_static", "sp-core", @@ -12245,7 +12245,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "futures", "merlin", @@ -12261,7 +12261,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "thiserror", "zstd", @@ -12270,7 +12270,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12288,7 +12288,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12302,7 +12302,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "sp-api", "sp-core", @@ -12312,7 +12312,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "backtrace", "lazy_static", @@ -12322,7 +12322,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "rustc-hash", "serde", @@ -12332,7 +12332,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "either", "hash256-std-hasher", @@ -12354,7 +12354,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12372,7 +12372,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "Inflector", "proc-macro-crate", @@ -12384,7 +12384,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "serde", "serde_json", @@ -12393,7 +12393,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12407,7 +12407,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12419,7 +12419,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "hash-db", "log", @@ -12439,12 +12439,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12457,7 +12457,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "futures-timer", @@ -12472,7 +12472,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "sp-std", @@ -12484,7 +12484,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "sp-api", "sp-runtime", @@ -12493,7 +12493,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "log", @@ -12509,7 +12509,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12532,7 +12532,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12549,7 +12549,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12560,7 +12560,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12574,7 +12574,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12898,7 +12898,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "platforms 2.0.0", ] @@ -12906,7 +12906,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -12925,7 +12925,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "hyper", "log", @@ -12937,7 +12937,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "jsonrpsee", @@ -12950,7 +12950,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "jsonrpsee", "log", @@ -12969,7 +12969,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12995,7 +12995,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13005,7 +13005,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13016,7 +13016,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "ansi_term", "build-helper", @@ -13143,7 +13143,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "frame-support", "polkadot-primitives", @@ -13533,7 +13533,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13544,7 +13544,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "expander 0.0.6", "proc-macro-crate", @@ -13674,7 +13674,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#be9fa62238fcfd7eb49218809a6b981f71c34eb3" +source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" dependencies = [ "async-trait", "clap 4.1.14", @@ -14602,7 +14602,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bitvec", "frame-benchmarking", @@ -14694,7 +14694,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "frame-support", "polkadot-primitives", @@ -15130,7 +15130,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "bounded-collections", "derivative", @@ -15146,7 +15146,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "frame-support", "frame-system", @@ -15167,7 +15167,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "environmental", "frame-benchmarking", @@ -15187,7 +15187,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#21c8734670b5392bfcddca4eb65c6585e6974640" +source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachains/common/src/xcm_config.rs b/parachains/common/src/xcm_config.rs index 04f73c6b7e7..d367fd4d1a1 100644 --- a/parachains/common/src/xcm_config.rs +++ b/parachains/common/src/xcm_config.rs @@ -2,7 +2,7 @@ use crate::impls::AccountIdOf; use core::{marker::PhantomData, ops::ControlFlow}; use frame_support::{ log, - traits::{fungibles::Inspect, tokens::BalanceConversion, ContainsPair}, + traits::{fungibles::Inspect, tokens::ConversionToAssetBalance, ContainsPair}, weights::Weight, }; use sp_runtime::traits::Get; @@ -96,7 +96,7 @@ impl where Runtime: pallet_assets::Config, WeightToFee: frame_support::weights::WeightToFee, - BalanceConverter: BalanceConversion< + BalanceConverter: ConversionToAssetBalance< CurrencyBalance, >::AssetId, >::Balance, diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 597f478eec8..6c332a11520 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -1113,7 +1113,7 @@ impl_runtime_apis! { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result { + fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index 02e43e27ac4..d62b19be844 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -1010,7 +1010,7 @@ impl_runtime_apis! { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result { + fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 5994fdcabb5..45c0e9f27b2 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -1124,7 +1124,7 @@ impl_runtime_apis! { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result { + fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs index 0e9b1eeb45f..3c77d40086c 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -687,7 +687,7 @@ impl_runtime_apis! { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result { + fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs index 9ee28a5d77f..9c9c8ba1c58 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -687,7 +687,7 @@ impl_runtime_apis! { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result { + fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index e577dd364d5..9c52457d164 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -737,7 +737,7 @@ impl_runtime_apis! { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result { + fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } From 5ed3677723374ee3ba6133890b3175586d489393 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Tue, 4 Apr 2023 16:00:05 +0200 Subject: [PATCH 098/339] [backport] weights 9400 (#2425) * [benchmarks] pr with weights (#2373) Co-authored-by: paritytech-ci * [benchmarks] pr with weights (#2374) Co-authored-by: paritytech-ci * [benchmarks] pr with weights (#2375) Co-authored-by: paritytech-ci * Proof size in test wasn't sufficient (due to updated weights.) --------- Co-authored-by: Paritytech CI <52199148+paritytech-ci@users.noreply.github.com> Co-authored-by: paritytech-ci Co-authored-by: Giles Cope --- .../src/weights/cumulus_pallet_xcmp_queue.rs | 20 +- .../statemine/src/weights/frame_system.rs | 53 +- .../statemine/src/weights/pallet_assets.rs | 290 ++++----- .../statemine/src/weights/pallet_balances.rs | 74 +-- .../src/weights/pallet_collator_selection.rs | 78 +-- .../statemine/src/weights/pallet_multisig.rs | 104 +-- .../statemine/src/weights/pallet_nfts.rs | 615 +++++++++--------- .../statemine/src/weights/pallet_proxy.rs | 158 ++--- .../statemine/src/weights/pallet_session.rs | 20 +- .../statemine/src/weights/pallet_timestamp.rs | 16 +- .../statemine/src/weights/pallet_uniques.rs | 288 ++++---- .../statemine/src/weights/pallet_utility.rs | 36 +- .../statemine/src/weights/pallet_xcm.rs | 130 ++-- .../xcm/pallet_xcm_benchmarks_fungible.rs | 61 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 169 +++-- .../src/weights/cumulus_pallet_xcmp_queue.rs | 20 +- .../statemint/src/weights/frame_system.rs | 49 +- .../statemint/src/weights/pallet_assets.rs | 294 ++++----- .../statemint/src/weights/pallet_balances.rs | 74 +-- .../src/weights/pallet_collator_selection.rs | 78 +-- .../statemint/src/weights/pallet_multisig.rs | 104 +-- .../statemint/src/weights/pallet_proxy.rs | 158 ++--- .../statemint/src/weights/pallet_session.rs | 20 +- .../statemint/src/weights/pallet_timestamp.rs | 16 +- .../statemint/src/weights/pallet_uniques.rs | 288 ++++---- .../statemint/src/weights/pallet_utility.rs | 36 +- .../statemint/src/weights/pallet_xcm.rs | 110 ++-- .../xcm/pallet_xcm_benchmarks_fungible.rs | 49 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 137 ++-- .../assets/test-utils/src/test_cases.rs | 8 +- .../src/weights/cumulus_pallet_xcmp_queue.rs | 20 +- .../westmint/src/weights/frame_system.rs | 47 +- .../westmint/src/weights/pallet_assets.rs | 286 ++++---- .../westmint/src/weights/pallet_balances.rs | 74 +-- .../src/weights/pallet_collator_selection.rs | 78 +-- .../westmint/src/weights/pallet_multisig.rs | 106 +-- .../westmint/src/weights/pallet_nfts.rs | 607 +++++++++-------- .../westmint/src/weights/pallet_proxy.rs | 158 ++--- .../westmint/src/weights/pallet_session.rs | 20 +- .../westmint/src/weights/pallet_timestamp.rs | 16 +- .../westmint/src/weights/pallet_uniques.rs | 288 ++++---- .../westmint/src/weights/pallet_utility.rs | 36 +- .../assets/westmint/src/weights/pallet_xcm.rs | 112 ++-- .../xcm/pallet_xcm_benchmarks_fungible.rs | 49 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 137 ++-- .../src/weights/cumulus_pallet_xcmp_queue.rs | 22 +- .../src/weights/frame_system.rs | 51 +- .../src/weights/pallet_balances.rs | 76 +-- .../src/weights/pallet_collator_selection.rs | 80 +-- .../src/weights/pallet_multisig.rs | 106 +-- .../src/weights/pallet_session.rs | 22 +- .../src/weights/pallet_timestamp.rs | 18 +- .../src/weights/pallet_utility.rs | 38 +- .../src/weights/pallet_xcm.rs | 106 +-- .../xcm/pallet_xcm_benchmarks_fungible.rs | 46 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 137 ++-- .../src/weights/cumulus_pallet_xcmp_queue.rs | 22 +- .../src/weights/frame_system.rs | 51 +- .../src/weights/pallet_balances.rs | 76 +-- .../src/weights/pallet_collator_selection.rs | 80 +-- .../src/weights/pallet_multisig.rs | 106 +-- .../src/weights/pallet_session.rs | 22 +- .../src/weights/pallet_timestamp.rs | 18 +- .../src/weights/pallet_utility.rs | 38 +- .../src/weights/pallet_xcm.rs | 106 +-- .../xcm/pallet_xcm_benchmarks_fungible.rs | 46 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 137 ++-- .../src/weights/cumulus_pallet_xcmp_queue.rs | 22 +- .../src/weights/frame_system.rs | 51 +- .../src/weights/pallet_balances.rs | 76 +-- .../src/weights/pallet_collator_selection.rs | 80 +-- .../src/weights/pallet_multisig.rs | 110 ++-- .../src/weights/pallet_session.rs | 22 +- .../src/weights/pallet_timestamp.rs | 18 +- .../src/weights/pallet_utility.rs | 38 +- .../src/weights/pallet_xcm.rs | 106 +-- .../xcm/pallet_xcm_benchmarks_fungible.rs | 46 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 134 ++-- .../src/weights/cumulus_pallet_xcmp_queue.rs | 22 +- .../src/weights/frame_system.rs | 51 +- .../src/weights/pallet_alliance.rs | 282 ++++---- .../src/weights/pallet_balances.rs | 76 +-- .../src/weights/pallet_collator_selection.rs | 80 +-- .../src/weights/pallet_collective.rs | 188 +++--- .../src/weights/pallet_multisig.rs | 108 +-- .../src/weights/pallet_proxy.rs | 160 +++-- .../src/weights/pallet_session.rs | 22 +- .../src/weights/pallet_timestamp.rs | 18 +- .../src/weights/pallet_utility.rs | 38 +- .../src/weights/pallet_xcm.rs | 106 +-- 90 files changed, 4418 insertions(+), 4427 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs index 9730e2df7b6..5cad45cc0b0 100644 --- a/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -52,10 +52,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_u32() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_956 nanoseconds. - Weight::from_parts(5_108_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_483_000 picoseconds. + Weight::from_parts(5_808_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -64,10 +64,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_weight() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_945 nanoseconds. - Weight::from_parts(5_080_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_773_000 picoseconds. + Weight::from_parts(5_913_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/frame_system.rs b/parachains/runtimes/assets/statemine/src/weights/frame_system.rs index 11188b93267..4f0967e636d 100644 --- a/parachains/runtimes/assets/statemine/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/statemine/src/weights/frame_system.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -52,22 +52,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_524 nanoseconds. - Weight::from_parts(1_612_000, 0) + // Minimum execution time: 2_146_000 picoseconds. + Weight::from_parts(2_194_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(413, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(368, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_865 nanoseconds. - Weight::from_parts(6_939_000, 0) + // Minimum execution time: 7_732_000 picoseconds. + Weight::from_parts(8_001_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_762, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_403, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -76,10 +76,10 @@ impl frame_system::WeightInfo for WeightInfo { fn set_heap_pages() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `495` - // Minimum execution time: 3_490 nanoseconds. - Weight::from_parts(3_688_000, 0) - .saturating_add(Weight::from_parts(0, 495)) + // Estimated: `1485` + // Minimum execution time: 4_287_000 picoseconds. + Weight::from_parts(4_602_000, 0) + .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -90,11 +90,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_683 nanoseconds. - Weight::from_parts(1_726_000, 0) + // Minimum execution time: 2_319_000 picoseconds. + Weight::from_parts(2_401_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_736 - .saturating_add(Weight::from_parts(582_823, 0).saturating_mul(i.into())) + // Standard Error: 1_933 + .saturating_add(Weight::from_parts(669_111, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +104,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_711 nanoseconds. - Weight::from_parts(1_787_000, 0) + // Minimum execution time: 2_381_000 picoseconds. + Weight::from_parts(2_405_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 779 - .saturating_add(Weight::from_parts(445_878, 0).saturating_mul(i.into())) + .saturating_add(Weight::from_parts(492_780, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -116,13 +116,14 @@ impl frame_system::WeightInfo for WeightInfo { /// The range of component `p` is `[0, 1000]`. fn kill_prefix(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `81 + p * (69 ±0)` - // Estimated: `72 + p * (70 ±0)` - // Minimum execution time: 3_428 nanoseconds. - Weight::from_parts(3_492_000, 0) - .saturating_add(Weight::from_parts(0, 72)) - // Standard Error: 991 - .saturating_add(Weight::from_parts(953_258, 0).saturating_mul(p.into())) + // Measured: `84 + p * (69 ±0)` + // Estimated: `75 + p * (70 ±0)` + // Minimum execution time: 4_204_000 picoseconds. + Weight::from_parts(4_269_000, 0) + .saturating_add(Weight::from_parts(0, 75)) + // Standard Error: 1_101 + .saturating_add(Weight::from_parts(1_014_807, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs index 1ecec9b5e09..94957ff84fa 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_assets` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn create() -> Weight { // Proof Size summary in bytes: - // Measured: `141` - // Estimated: `5288` - // Minimum execution time: 21_487 nanoseconds. - Weight::from_parts(21_977_000, 0) - .saturating_add(Weight::from_parts(0, 5288)) + // Measured: `109` + // Estimated: `7268` + // Minimum execution time: 24_493_000 picoseconds. + Weight::from_parts(24_993_000, 0) + .saturating_add(Weight::from_parts(0, 7268)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -66,10 +66,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `6` - // Estimated: `2685` - // Minimum execution time: 10_630 nanoseconds. - Weight::from_parts(10_963_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Estimated: `3675` + // Minimum execution time: 12_605_000 picoseconds. + Weight::from_parts(12_888_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -77,11 +77,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn start_destroy() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `2685` - // Minimum execution time: 13_627 nanoseconds. - Weight::from_parts(13_906_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `277` + // Estimated: `3675` + // Minimum execution time: 14_917_000 picoseconds. + Weight::from_parts(15_146_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -94,13 +94,13 @@ impl pallet_assets::WeightInfo for WeightInfo { /// The range of component `c` is `[0, 1000]`. fn destroy_accounts(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + c * (240 ±0)` - // Estimated: `5262 + c * (5180 ±0)` - // Minimum execution time: 15_861 nanoseconds. - Weight::from_parts(16_079_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) - // Standard Error: 10_732 - .saturating_add(Weight::from_parts(14_192_928, 0).saturating_mul(c.into())) + // Measured: `0 + c * (208 ±0)` + // Estimated: `8232 + c * (5180 ±0)` + // Minimum execution time: 17_844_000 picoseconds. + Weight::from_parts(18_064_000, 0) + .saturating_add(Weight::from_parts(0, 8232)) + // Standard Error: 6_979 + .saturating_add(Weight::from_parts(12_064_749, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -114,13 +114,13 @@ impl pallet_assets::WeightInfo for WeightInfo { /// The range of component `a` is `[0, 1000]`. fn destroy_approvals(a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `446 + a * (86 ±0)` - // Estimated: `5308 + a * (2623 ±0)` - // Minimum execution time: 16_455 nanoseconds. - Weight::from_parts(16_720_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) - // Standard Error: 7_111 - .saturating_add(Weight::from_parts(13_717_750, 0).saturating_mul(a.into())) + // Measured: `414 + a * (86 ±0)` + // Estimated: `7288 + a * (2623 ±0)` + // Minimum execution time: 18_402_000 picoseconds. + Weight::from_parts(18_742_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) + // Standard Error: 5_332 + .saturating_add(Weight::from_parts(12_085_212, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -133,11 +133,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn finish_destroy() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5300` - // Minimum execution time: 12_819 nanoseconds. - Weight::from_parts(13_111_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `243` + // Estimated: `7280` + // Minimum execution time: 14_390_000 picoseconds. + Weight::from_parts(14_903_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -147,11 +147,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn mint() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5262` - // Minimum execution time: 22_897 nanoseconds. - Weight::from_parts(23_386_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `243` + // Estimated: `7242` + // Minimum execution time: 26_171_000 picoseconds. + Weight::from_parts(26_478_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -161,11 +161,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn burn() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `5262` - // Minimum execution time: 28_432 nanoseconds. - Weight::from_parts(28_903_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `351` + // Estimated: `7242` + // Minimum execution time: 31_291_000 picoseconds. + Weight::from_parts(31_810_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -177,11 +177,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `10442` - // Minimum execution time: 39_823 nanoseconds. - Weight::from_parts(40_380_000, 0) - .saturating_add(Weight::from_parts(0, 10442)) + // Measured: `351` + // Estimated: `13412` + // Minimum execution time: 42_608_000 picoseconds. + Weight::from_parts(43_553_000, 0) + .saturating_add(Weight::from_parts(0, 13412)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -193,11 +193,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `10442` - // Minimum execution time: 34_924 nanoseconds. - Weight::from_parts(35_584_000, 0) - .saturating_add(Weight::from_parts(0, 10442)) + // Measured: `351` + // Estimated: `13412` + // Minimum execution time: 37_541_000 picoseconds. + Weight::from_parts(38_166_000, 0) + .saturating_add(Weight::from_parts(0, 13412)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -209,11 +209,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `10442` - // Minimum execution time: 39_647 nanoseconds. - Weight::from_parts(40_611_000, 0) - .saturating_add(Weight::from_parts(0, 10442)) + // Measured: `351` + // Estimated: `13412` + // Minimum execution time: 42_931_000 picoseconds. + Weight::from_parts(43_458_000, 0) + .saturating_add(Weight::from_parts(0, 13412)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -223,11 +223,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn freeze() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `5262` - // Minimum execution time: 16_462 nanoseconds. - Weight::from_parts(16_821_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `351` + // Estimated: `7242` + // Minimum execution time: 17_652_000 picoseconds. + Weight::from_parts(18_018_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -237,11 +237,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn thaw() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `5262` - // Minimum execution time: 16_416 nanoseconds. - Weight::from_parts(16_758_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `351` + // Estimated: `7242` + // Minimum execution time: 17_510_000 picoseconds. + Weight::from_parts(17_911_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -249,11 +249,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn freeze_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `2685` - // Minimum execution time: 12_853 nanoseconds. - Weight::from_parts(13_257_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `277` + // Estimated: `3675` + // Minimum execution time: 13_954_000 picoseconds. + Weight::from_parts(14_284_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -261,11 +261,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn thaw_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `2685` - // Minimum execution time: 12_422 nanoseconds. - Weight::from_parts(12_763_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `277` + // Estimated: `3675` + // Minimum execution time: 14_216_000 picoseconds. + Weight::from_parts(14_459_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -275,11 +275,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5300` - // Minimum execution time: 13_950 nanoseconds. - Weight::from_parts(14_242_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `243` + // Estimated: `7280` + // Minimum execution time: 15_550_000 picoseconds. + Weight::from_parts(16_001_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -287,11 +287,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn set_team() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `2685` - // Minimum execution time: 12_726 nanoseconds. - Weight::from_parts(13_072_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `243` + // Estimated: `3675` + // Minimum execution time: 14_389_000 picoseconds. + Weight::from_parts(14_677_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -301,15 +301,13 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) /// The range of component `n` is `[0, 50]`. /// The range of component `s` is `[0, 50]`. - fn set_metadata(_n: u32, s: u32, ) -> Weight { + fn set_metadata(_n: u32, _s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5300` - // Minimum execution time: 22_772 nanoseconds. - Weight::from_parts(24_026_274, 0) - .saturating_add(Weight::from_parts(0, 5300)) - // Standard Error: 1_231 - .saturating_add(Weight::from_parts(203, 0).saturating_mul(s.into())) + // Measured: `243` + // Estimated: `7280` + // Minimum execution time: 25_401_000 picoseconds. + Weight::from_parts(27_056_833, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -319,11 +317,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `471` - // Estimated: `5300` - // Minimum execution time: 23_310 nanoseconds. - Weight::from_parts(23_724_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `407` + // Estimated: `7280` + // Minimum execution time: 26_001_000 picoseconds. + Weight::from_parts(26_493_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -333,17 +331,15 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) /// The range of component `n` is `[0, 50]`. /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(n: u32, s: u32, ) -> Weight { + fn force_set_metadata(_n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `82` - // Estimated: `5300` - // Minimum execution time: 12_379 nanoseconds. - Weight::from_parts(12_903_065, 0) - .saturating_add(Weight::from_parts(0, 5300)) - // Standard Error: 330 - .saturating_add(Weight::from_parts(667, 0).saturating_mul(n.into())) - // Standard Error: 330 - .saturating_add(Weight::from_parts(2_891, 0).saturating_mul(s.into())) + // Estimated: `7280` + // Minimum execution time: 13_988_000 picoseconds. + Weight::from_parts(14_751_106, 0) + .saturating_add(Weight::from_parts(0, 7280)) + // Standard Error: 381 + .saturating_add(Weight::from_parts(2_884, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -353,11 +349,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn force_clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `471` - // Estimated: `5300` - // Minimum execution time: 23_531 nanoseconds. - Weight::from_parts(23_845_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `407` + // Estimated: `7280` + // Minimum execution time: 25_837_000 picoseconds. + Weight::from_parts(26_110_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -365,11 +361,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn force_asset_status() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `2685` - // Minimum execution time: 12_426 nanoseconds. - Weight::from_parts(12_888_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `243` + // Estimated: `3675` + // Minimum execution time: 13_423_000 picoseconds. + Weight::from_parts(13_565_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -379,11 +375,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) fn approve_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `5308` - // Minimum execution time: 26_365 nanoseconds. - Weight::from_parts(26_700_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) + // Measured: `277` + // Estimated: `7288` + // Minimum execution time: 29_285_000 picoseconds. + Weight::from_parts(29_727_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -397,11 +393,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_approved() -> Weight { // Proof Size summary in bytes: - // Measured: `553` - // Estimated: `13065` - // Minimum execution time: 53_167 nanoseconds. - Weight::from_parts(53_564_000, 0) - .saturating_add(Weight::from_parts(0, 13065)) + // Measured: `521` + // Estimated: `17025` + // Minimum execution time: 58_369_000 picoseconds. + Weight::from_parts(58_844_000, 0) + .saturating_add(Weight::from_parts(0, 17025)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -411,11 +407,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) fn cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `479` - // Estimated: `5308` - // Minimum execution time: 28_120 nanoseconds. - Weight::from_parts(28_540_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) + // Measured: `447` + // Estimated: `7288` + // Minimum execution time: 31_073_000 picoseconds. + Weight::from_parts(31_536_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -425,11 +421,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) fn force_cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `479` - // Estimated: `5308` - // Minimum execution time: 28_503 nanoseconds. - Weight::from_parts(28_988_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) + // Measured: `447` + // Estimated: `7288` + // Minimum execution time: 32_182_000 picoseconds. + Weight::from_parts(32_625_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -437,12 +433,12 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn set_min_balance() -> Weight { // Proof Size summary in bytes: - // Measured: `383` + // Measured: `243` // Estimated: `3675` - // Minimum execution time: 16_213 nanoseconds. - Weight::from_parts(16_575_000, 0) + // Minimum execution time: 14_610_000 picoseconds. + Weight::from_parts(14_895_000, 0) .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs index de0bba5f9fb..2d3be9da403 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -51,11 +51,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_allow_death() -> Weight { // Proof Size summary in bytes: - // Measured: `1178` - // Estimated: `2603` - // Minimum execution time: 46_493 nanoseconds. - Weight::from_parts(47_804_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 34_132_000 picoseconds. + Weight::from_parts(34_669_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -63,11 +63,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: - // Measured: `1062` - // Estimated: `2603` - // Minimum execution time: 35_020 nanoseconds. - Weight::from_parts(35_462_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 25_052_000 picoseconds. + Weight::from_parts(25_681_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -75,11 +75,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_creating() -> Weight { // Proof Size summary in bytes: - // Measured: `1174` - // Estimated: `2603` - // Minimum execution time: 26_282 nanoseconds. - Weight::from_parts(26_915_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 15_072_000 picoseconds. + Weight::from_parts(15_451_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -87,11 +87,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_killing() -> Weight { // Proof Size summary in bytes: - // Measured: `1174` - // Estimated: `2603` - // Minimum execution time: 29_529 nanoseconds. - Weight::from_parts(30_135_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 18_416_000 picoseconds. + Weight::from_parts(18_742_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -99,11 +99,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `1174` - // Estimated: `5206` - // Minimum execution time: 46_969 nanoseconds. - Weight::from_parts(47_657_000, 0) - .saturating_add(Weight::from_parts(0, 5206)) + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 36_626_000 picoseconds. + Weight::from_parts(37_176_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -111,11 +111,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_all() -> Weight { // Proof Size summary in bytes: - // Measured: `1062` - // Estimated: `2603` - // Minimum execution time: 41_398 nanoseconds. - Weight::from_parts(42_012_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 31_008_000 picoseconds. + Weight::from_parts(31_562_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -126,11 +126,11 @@ impl pallet_balances::WeightInfo for WeightInfo { } fn force_unreserve() -> Weight { // Proof Size summary in bytes: - // Measured: `1058` - // Estimated: `2603` - // Minimum execution time: 22_969 nanoseconds. - Weight::from_parts(23_548_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 14_214_000 picoseconds. + Weight::from_parts(14_535_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs index 4ad4a2ffce2..6165f030031 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -55,12 +55,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn set_invulnerables(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` - // Estimated: `178 + b * (2554 ±0)` - // Minimum execution time: 14_234 nanoseconds. - Weight::from_parts(15_794_150, 0) - .saturating_add(Weight::from_parts(0, 178)) - // Standard Error: 4_000 - .saturating_add(Weight::from_parts(2_477_800, 0).saturating_mul(b.into())) + // Estimated: `1168 + b * (2554 ±0)` + // Minimum execution time: 15_415_000 picoseconds. + Weight::from_parts(15_521_960, 0) + .saturating_add(Weight::from_parts(0, 1168)) + // Standard Error: 3_294 + .saturating_add(Weight::from_parts(2_582_035, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +71,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_190 nanoseconds. - Weight::from_parts(7_441_000, 0) + // Minimum execution time: 7_363_000 picoseconds. + Weight::from_parts(7_715_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +82,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_495 nanoseconds. - Weight::from_parts(7_666_000, 0) + // Minimum execution time: 7_516_000 picoseconds. + Weight::from_parts(7_860_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,13 +102,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 999]`. fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1171 + c * (48 ±0)` - // Estimated: `56784 + c * (49 ±0)` - // Minimum execution time: 35_713 nanoseconds. - Weight::from_parts(27_978_009, 0) - .saturating_add(Weight::from_parts(0, 56784)) - // Standard Error: 1_293 - .saturating_add(Weight::from_parts(111_881, 0).saturating_mul(c.into())) + // Measured: `1108 + c * (48 ±0)` + // Estimated: `61671 + c * (49 ±0)` + // Minimum execution time: 38_063_000 picoseconds. + Weight::from_parts(30_924_306, 0) + .saturating_add(Weight::from_parts(0, 61671)) + // Standard Error: 1_232 + .saturating_add(Weight::from_parts(106_039, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -120,13 +120,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[6, 1000]`. fn leave_intent(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `536 + c * (48 ±0)` - // Estimated: `48497` - // Minimum execution time: 27_164 nanoseconds. - Weight::from_parts(16_901_858, 0) - .saturating_add(Weight::from_parts(0, 48497)) - // Standard Error: 1_312 - .saturating_add(Weight::from_parts(108_799, 0).saturating_mul(c.into())) + // Measured: `452 + c * (48 ±0)` + // Estimated: `49487` + // Minimum execution time: 29_598_000 picoseconds. + Weight::from_parts(19_372_924, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_253 + .saturating_add(Weight::from_parts(106_394, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -138,11 +138,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) fn note_author() -> Weight { // Proof Size summary in bytes: - // Measured: `135` - // Estimated: `5749` - // Minimum execution time: 26_007 nanoseconds. - Weight::from_parts(26_416_000, 0) - .saturating_add(Weight::from_parts(0, 5749)) + // Measured: `103` + // Estimated: `7729` + // Minimum execution time: 28_647_000 picoseconds. + Weight::from_parts(28_951_000, 0) + .saturating_add(Weight::from_parts(0, 7729)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +160,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22784 + r * (148 ±0) + c * (97 ±0)` - // Estimated: `52737 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 16_056 nanoseconds. - Weight::from_parts(16_335_000, 0) - .saturating_add(Weight::from_parts(0, 52737)) - // Standard Error: 806_799 - .saturating_add(Weight::from_parts(29_195_677, 0).saturating_mul(c.into())) + // Measured: `22721 + r * (116 ±0) + c * (97 ±0)` + // Estimated: `56697 + c * (2520 ±0) + r * (2602 ±0)` + // Minimum execution time: 17_043_000 picoseconds. + Weight::from_parts(17_352_000, 0) + .saturating_add(Weight::from_parts(0, 56697)) + // Standard Error: 798_735 + .saturating_add(Weight::from_parts(28_961_284, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) } } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs index 37355802376..2e5f4b322f0 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -52,11 +52,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_185 nanoseconds. - Weight::from_parts(12_423_059, 0) + // Minimum execution time: 11_992_000 picoseconds. + Weight::from_parts(12_412_280, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1 - .saturating_add(Weight::from_parts(596, 0).saturating_mul(z.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(503, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -64,15 +64,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `311 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 35_394 nanoseconds. - Weight::from_parts(28_339_222, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 525 - .saturating_add(Weight::from_parts(76_810, 0).saturating_mul(s.into())) + // Measured: `262 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 37_343_000 picoseconds. + Weight::from_parts(31_041_082, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 579 + .saturating_add(Weight::from_parts(68_564, 0).saturating_mul(s.into())) // Standard Error: 5 - .saturating_add(Weight::from_parts(1_641, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_253, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,15 +82,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_approve(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 26_605 nanoseconds. - Weight::from_parts(19_882_694, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 486 - .saturating_add(Weight::from_parts(73_686, 0).saturating_mul(s.into())) - // Standard Error: 4 - .saturating_add(Weight::from_parts(1_615, 0).saturating_mul(z.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 27_702_000 picoseconds. + Weight::from_parts(22_324_758, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 382 + .saturating_add(Weight::from_parts(59_647, 0).saturating_mul(s.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_199, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,15 +102,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `448 + s * (33 ±0)` - // Estimated: `8424` - // Minimum execution time: 40_558 nanoseconds. - Weight::from_parts(31_782_538, 0) - .saturating_add(Weight::from_parts(0, 8424)) - // Standard Error: 587 - .saturating_add(Weight::from_parts(94_913, 0).saturating_mul(s.into())) + // Measured: `385 + s * (33 ±0)` + // Estimated: `10404` + // Minimum execution time: 42_944_000 picoseconds. + Weight::from_parts(35_467_441, 0) + .saturating_add(Weight::from_parts(0, 10404)) + // Standard Error: 600 + .saturating_add(Weight::from_parts(80_406, 0).saturating_mul(s.into())) // Standard Error: 5 - .saturating_add(Weight::from_parts(1_647, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_220, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -119,13 +119,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `318 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 24_889 nanoseconds. - Weight::from_parts(27_183_432, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 835 - .saturating_add(Weight::from_parts(79_518, 0).saturating_mul(s.into())) + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 27_997_000 picoseconds. + Weight::from_parts(30_250_714, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 709 + .saturating_add(Weight::from_parts(67_226, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -134,13 +134,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 17_143 nanoseconds. - Weight::from_parts(18_532_968, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 632 - .saturating_add(Weight::from_parts(75_565, 0).saturating_mul(s.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 19_821_000 picoseconds. + Weight::from_parts(20_670_152, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 470 + .saturating_add(Weight::from_parts(65_289, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -149,13 +149,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `517 + s * (1 ±0)` - // Estimated: `5821` - // Minimum execution time: 26_917 nanoseconds. - Weight::from_parts(28_425_612, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 685 - .saturating_add(Weight::from_parts(81_581, 0).saturating_mul(s.into())) + // Measured: `454 + s * (1 ±0)` + // Estimated: `6811` + // Minimum execution time: 28_820_000 picoseconds. + Weight::from_parts(31_182_331, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 874 + .saturating_add(Weight::from_parts(68_617, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs index d4d05c7ce25..8c4425114b1 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,16 +17,16 @@ //! Autogenerated weights for `pallet_nfts` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=statemine-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_nfts @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs +// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +50,7 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Storage: Nfts NextCollectionId (r:1 w:1) /// Proof: Nfts NextCollectionId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionRoleOf (r:0 w:1) /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:0 w:1) @@ -59,18 +59,18 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn create() -> Weight { // Proof Size summary in bytes: - // Measured: `177` - // Estimated: `3054` - // Minimum execution time: 30_978 nanoseconds. - Weight::from_parts(31_489_000, 0) - .saturating_add(Weight::from_parts(0, 3054)) + // Measured: `145` + // Estimated: `5038` + // Minimum execution time: 34_100_000 picoseconds. + Weight::from_parts(34_649_000, 0) + .saturating_add(Weight::from_parts(0, 5038)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: Nfts NextCollectionId (r:1 w:1) /// Proof: Nfts NextCollectionId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionRoleOf (r:0 w:1) /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:0 w:1) @@ -80,62 +80,55 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `3054` - // Minimum execution time: 20_101 nanoseconds. - Weight::from_parts(20_488_000, 0) - .saturating_add(Weight::from_parts(0, 3054)) + // Estimated: `5038` + // Minimum execution time: 22_415_000 picoseconds. + Weight::from_parts(22_808_000, 0) + .saturating_add(Weight::from_parts(0, 5038)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1001 w:1000) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1001 w:1000) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(219), added: 2694, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1001 w:1000) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:0 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts ItemMetadataOf (r:1 w:0) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:1) /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1001 w:1000) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1000 w:1000) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: Nfts CollectionMetadataOf (r:0 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(166), added: 2641, mode: MaxEncodedLen) + /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(294), added: 2769, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:0 w:1) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:0 w:1000) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1000) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Nfts CollectionAccount (r:0 w:1) /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) - /// The range of component `n` is `[0, 1000]`. /// The range of component `m` is `[0, 1000]`. + /// The range of component `c` is `[0, 1000]`. /// The range of component `a` is `[0, 1000]`. - fn destroy(_n: u32, m: u32, a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `172673 + m * (206 ±0) + a * (210 ±0)` - // Estimated: `3347314 + m * (2694 ±0) + a * (2729 ±0)` - // Minimum execution time: 23_505_821 nanoseconds. - Weight::from_parts(16_948_157_713, 0) - .saturating_add(Weight::from_parts(0, 3347314)) - // Standard Error: 20_494 - .saturating_add(Weight::from_parts(7_059_571, 0).saturating_mul(m.into())) - // Standard Error: 20_494 - .saturating_add(Weight::from_parts(8_471_367, 0).saturating_mul(a.into())) + fn destroy(m: u32, _c: u32, a: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `32170 + a * (366 ±0)` + // Estimated: `2538829 + a * (2954 ±0)` + // Minimum execution time: 978_514_000 picoseconds. + Weight::from_parts(915_478_956, 0) + .saturating_add(Weight::from_parts(0, 2538829)) + // Standard Error: 4_368 + .saturating_add(Weight::from_parts(3_621, 0).saturating_mul(m.into())) + // Standard Error: 4_368 + .saturating_add(Weight::from_parts(5_742_436, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(1004)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(3005)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) + .saturating_add(T::DbWeight::get().writes(1005)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2694).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 2729).saturating_mul(a.into())) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(a.into())) } /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionRoleOf (r:1 w:0) /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:1) @@ -144,11 +137,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn mint() -> Weight { // Proof Size summary in bytes: - // Measured: `448` - // Estimated: `13506` - // Minimum execution time: 39_850 nanoseconds. - Weight::from_parts(40_227_000, 0) - .saturating_add(Weight::from_parts(0, 13506)) + // Measured: `421` + // Estimated: `18460` + // Minimum execution time: 44_509_000 picoseconds. + Weight::from_parts(45_090_000, 0) + .saturating_add(Weight::from_parts(0, 18460)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -157,7 +150,7 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:1) @@ -166,24 +159,22 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn force_mint() -> Weight { // Proof Size summary in bytes: - // Measured: `448` - // Estimated: `13506` - // Minimum execution time: 40_379 nanoseconds. - Weight::from_parts(41_110_000, 0) - .saturating_add(Weight::from_parts(0, 13506)) + // Measured: `421` + // Estimated: `18460` + // Minimum execution time: 43_761_000 picoseconds. + Weight::from_parts(44_304_000, 0) + .saturating_add(Weight::from_parts(0, 18460)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: Nfts ItemConfigOf (r:1 w:1) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts ItemMetadataOf (r:1 w:0) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(219), added: 2694, mode: MaxEncodedLen) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) /// Storage: Nfts Account (r:0 w:1) /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Nfts ItemPriceOf (r:0 w:1) @@ -194,26 +185,22 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn burn() -> Weight { // Proof Size summary in bytes: - // Measured: `647` - // Estimated: `13652` - // Minimum execution time: 43_534 nanoseconds. - Weight::from_parts(43_846_000, 0) - .saturating_add(Weight::from_parts(0, 13652)) - .saturating_add(T::DbWeight::get().reads(5)) + // Measured: `530` + // Estimated: `15200` + // Minimum execution time: 45_215_000 picoseconds. + Weight::from_parts(46_367_000, 0) + .saturating_add(Weight::from_parts(0, 15200)) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: Nfts Account (r:0 w:2) /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Nfts ItemPriceOf (r:0 w:1) @@ -222,16 +209,16 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `811` - // Estimated: `16109` - // Minimum execution time: 49_184 nanoseconds. - Weight::from_parts(49_935_000, 0) - .saturating_add(Weight::from_parts(0, 16109)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(6)) + // Measured: `559` + // Estimated: `14926` + // Minimum execution time: 35_381_000 picoseconds. + Weight::from_parts(35_896_000, 0) + .saturating_add(Weight::from_parts(0, 14926)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts Item (r:5000 w:5000) @@ -239,13 +226,13 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// The range of component `i` is `[0, 5000]`. fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `756 + i * (140 ±0)` - // Estimated: `5103 + i * (3336 ±0)` - // Minimum execution time: 15_668 nanoseconds. - Weight::from_parts(15_762_000, 0) - .saturating_add(Weight::from_parts(0, 5103)) - // Standard Error: 12_791 - .saturating_add(Weight::from_parts(12_224_567, 0).saturating_mul(i.into())) + // Measured: `729 + i * (108 ±0)` + // Estimated: `8077 + i * (3336 ±0)` + // Minimum execution time: 16_621_000 picoseconds. + Weight::from_parts(16_839_000, 0) + .saturating_add(Weight::from_parts(0, 8077)) + // Standard Error: 13_184 + .saturating_add(Weight::from_parts(13_274_447, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) @@ -258,10 +245,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn lock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `401` - // Estimated: `5067` - // Minimum execution time: 18_861 nanoseconds. - Weight::from_parts(19_195_000, 0) - .saturating_add(Weight::from_parts(0, 5067)) + // Estimated: `7047` + // Minimum execution time: 20_314_000 picoseconds. + Weight::from_parts(20_726_000, 0) + .saturating_add(Weight::from_parts(0, 7047)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -272,145 +259,149 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn unlock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `401` - // Estimated: `5067` - // Minimum execution time: 18_710 nanoseconds. - Weight::from_parts(18_971_000, 0) - .saturating_add(Weight::from_parts(0, 5067)) + // Estimated: `7047` + // Minimum execution time: 20_178_000 picoseconds. + Weight::from_parts(20_565_000, 0) + .saturating_add(Weight::from_parts(0, 7047)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:0) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:1) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn lock_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `289` - // Estimated: `5092` - // Minimum execution time: 17_067 nanoseconds. - Weight::from_parts(17_233_000, 0) - .saturating_add(Weight::from_parts(0, 5092)) + // Measured: `306` + // Estimated: `7087` + // Minimum execution time: 17_142_000 picoseconds. + Weight::from_parts(18_191_000, 0) + .saturating_add(Weight::from_parts(0, 7087)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts OwnershipAcceptance (r:1 w:1) /// Proof: Nfts OwnershipAcceptance (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionAccount (r:0 w:2) /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `381` - // Estimated: `5082` - // Minimum execution time: 21_203 nanoseconds. - Weight::from_parts(21_468_000, 0) - .saturating_add(Weight::from_parts(0, 5082)) + // Measured: `354` + // Estimated: `7066` + // Minimum execution time: 22_902_000 picoseconds. + Weight::from_parts(23_495_000, 0) + .saturating_add(Weight::from_parts(0, 7066)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:0 w:4) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:2 w:4) /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn set_team() -> Weight { // Proof Size summary in bytes: - // Measured: `362` - // Estimated: `2555` - // Minimum execution time: 24_304 nanoseconds. - Weight::from_parts(24_823_000, 0) - .saturating_add(Weight::from_parts(0, 2555)) - .saturating_add(T::DbWeight::get().reads(1)) + // Measured: `335` + // Estimated: `9627` + // Minimum execution time: 41_436_000 picoseconds. + Weight::from_parts(41_922_000, 0) + .saturating_add(Weight::from_parts(0, 9627)) + .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionAccount (r:0 w:2) /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn force_collection_owner() -> Weight { // Proof Size summary in bytes: - // Measured: `304` - // Estimated: `2555` - // Minimum execution time: 17_173 nanoseconds. - Weight::from_parts(17_448_000, 0) - .saturating_add(Weight::from_parts(0, 2555)) + // Measured: `277` + // Estimated: `3549` + // Minimum execution time: 19_015_000 picoseconds. + Weight::from_parts(19_490_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) } /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:0 w:1) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn force_collection_config() -> Weight { // Proof Size summary in bytes: // Measured: `242` - // Estimated: `2555` - // Minimum execution time: 13_697 nanoseconds. - Weight::from_parts(13_924_000, 0) - .saturating_add(Weight::from_parts(0, 2555)) + // Estimated: `3549` + // Minimum execution time: 15_532_000 picoseconds. + Weight::from_parts(15_827_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:1) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) fn lock_item_properties() -> Weight { // Proof Size summary in bytes: - // Measured: `445` - // Estimated: `5078` - // Minimum execution time: 18_063 nanoseconds. - Weight::from_parts(18_438_000, 0) - .saturating_add(Weight::from_parts(0, 5078)) + // Measured: `401` + // Estimated: `7047` + // Minimum execution time: 21_022_000 picoseconds. + Weight::from_parts(21_289_000, 0) + .saturating_add(Weight::from_parts(0, 7047)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) fn set_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `474` - // Estimated: `10355` - // Minimum execution time: 37_582 nanoseconds. - Weight::from_parts(38_155_000, 0) - .saturating_add(Weight::from_parts(0, 10355)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `505` + // Estimated: `18078` + // Minimum execution time: 47_283_000 picoseconds. + Weight::from_parts(47_793_000, 0) + .saturating_add(Weight::from_parts(0, 18078)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) fn force_set_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `337` - // Estimated: `5284` - // Minimum execution time: 24_392 nanoseconds. - Weight::from_parts(24_787_000, 0) - .saturating_add(Weight::from_parts(0, 5284)) + // Measured: `310` + // Estimated: `7493` + // Minimum execution time: 27_462_000 picoseconds. + Weight::from_parts(27_798_000, 0) + .saturating_add(Weight::from_parts(0, 7493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) fn clear_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `724` - // Estimated: `7807` - // Minimum execution time: 34_564 nanoseconds. - Weight::from_parts(34_956_000, 0) - .saturating_add(Weight::from_parts(0, 7807)) - .saturating_add(T::DbWeight::get().reads(3)) + // Measured: `949` + // Estimated: `14540` + // Minimum execution time: 44_392_000 picoseconds. + Weight::from_parts(44_956_000, 0) + .saturating_add(Weight::from_parts(0, 14540)) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: Nfts Item (r:1 w:0) @@ -419,11 +410,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(1001), added: 3476, mode: MaxEncodedLen) fn approve_item_attributes() -> Weight { // Proof Size summary in bytes: - // Measured: `379` - // Estimated: `6812` - // Minimum execution time: 17_194 nanoseconds. - Weight::from_parts(17_467_000, 0) - .saturating_add(Weight::from_parts(0, 6812)) + // Measured: `347` + // Estimated: `8792` + // Minimum execution time: 18_619_000 picoseconds. + Weight::from_parts(18_970_000, 0) + .saturating_add(Weight::from_parts(0, 8792)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -432,133 +423,135 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(1001), added: 3476, mode: MaxEncodedLen) /// Storage: Nfts Attribute (r:1001 w:1000) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// The range of component `n` is `[0, 1000]`. fn cancel_item_attributes_approval(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `828 + n * (204 ±0)` - // Estimated: `12144 + n * (2729 ±0)` - // Minimum execution time: 25_617 nanoseconds. - Weight::from_parts(25_917_000, 0) - .saturating_add(Weight::from_parts(0, 12144)) - // Standard Error: 5_524 - .saturating_add(Weight::from_parts(7_538_893, 0).saturating_mul(n.into())) + // Measured: `726 + n * (398 ±0)` + // Estimated: `16329 + n * (2954 ±0)` + // Minimum execution time: 28_293_000 picoseconds. + Weight::from_parts(28_502_000, 0) + .saturating_add(Weight::from_parts(0, 16329)) + // Standard Error: 4_215 + .saturating_add(Weight::from_parts(5_601_603, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2729).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(219), added: 2694, mode: MaxEncodedLen) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) fn set_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `474` - // Estimated: `10320` - // Minimum execution time: 32_053 nanoseconds. - Weight::from_parts(32_510_000, 0) - .saturating_add(Weight::from_parts(0, 10320)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `505` + // Estimated: `17946` + // Minimum execution time: 39_371_000 picoseconds. + Weight::from_parts(39_852_000, 0) + .saturating_add(Weight::from_parts(0, 17946)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(219), added: 2694, mode: MaxEncodedLen) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `688` - // Estimated: `7772` - // Minimum execution time: 30_654 nanoseconds. - Weight::from_parts(31_113_000, 0) - .saturating_add(Weight::from_parts(0, 7772)) - .saturating_add(T::DbWeight::get().reads(3)) + // Measured: `815` + // Estimated: `14408` + // Minimum execution time: 37_535_000 picoseconds. + Weight::from_parts(38_894_000, 0) + .saturating_add(Weight::from_parts(0, 14408)) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionMetadataOf (r:1 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(166), added: 2641, mode: MaxEncodedLen) + /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(294), added: 2769, mode: MaxEncodedLen) fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `333` - // Estimated: `7744` - // Minimum execution time: 27_700 nanoseconds. - Weight::from_parts(28_291_000, 0) - .saturating_add(Weight::from_parts(0, 7744)) - .saturating_add(T::DbWeight::get().reads(3)) + // Measured: `364` + // Estimated: `14380` + // Minimum execution time: 35_608_000 picoseconds. + Weight::from_parts(35_741_000, 0) + .saturating_add(Weight::from_parts(0, 14380)) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts CollectionMetadataOf (r:1 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(166), added: 2641, mode: MaxEncodedLen) + /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(294), added: 2769, mode: MaxEncodedLen) fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `555` - // Estimated: `7744` - // Minimum execution time: 27_483 nanoseconds. - Weight::from_parts(27_830_000, 0) - .saturating_add(Weight::from_parts(0, 7744)) - .saturating_add(T::DbWeight::get().reads(3)) + // Measured: `682` + // Estimated: `14380` + // Minimum execution time: 33_234_000 picoseconds. + Weight::from_parts(33_617_000, 0) + .saturating_add(Weight::from_parts(0, 14380)) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn approve_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `466` - // Estimated: `8428` - // Minimum execution time: 23_623 nanoseconds. - Weight::from_parts(24_282_000, 0) - .saturating_add(Weight::from_parts(0, 8428)) - .saturating_add(T::DbWeight::get().reads(3)) + // Measured: `376` + // Estimated: `7864` + // Minimum execution time: 22_900_000 picoseconds. + Weight::from_parts(23_351_000, 0) + .saturating_add(Weight::from_parts(0, 7864)) + .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `474` - // Estimated: `5880` - // Minimum execution time: 21_115 nanoseconds. - Weight::from_parts(22_036_000, 0) - .saturating_add(Weight::from_parts(0, 5880)) - .saturating_add(T::DbWeight::get().reads(2)) + // Measured: `384` + // Estimated: `4326` + // Minimum execution time: 20_413_000 picoseconds. + Weight::from_parts(20_622_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn clear_all_transfer_approvals() -> Weight { // Proof Size summary in bytes: - // Measured: `474` - // Estimated: `5880` - // Minimum execution time: 20_352 nanoseconds. - Weight::from_parts(20_627_000, 0) - .saturating_add(Weight::from_parts(0, 5880)) - .saturating_add(T::DbWeight::get().reads(2)) + // Measured: `384` + // Estimated: `4326` + // Minimum execution time: 19_132_000 picoseconds. + Weight::from_parts(19_443_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts OwnershipAcceptance (r:1 w:1) @@ -566,38 +559,38 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_accept_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `2527` - // Minimum execution time: 14_427 nanoseconds. - Weight::from_parts(15_169_000, 0) - .saturating_add(Weight::from_parts(0, 2527)) + // Estimated: `3517` + // Minimum execution time: 16_661_000 picoseconds. + Weight::from_parts(16_925_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts CollectionConfigOf (r:1 w:1) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: - // Measured: `333` - // Estimated: `5103` - // Minimum execution time: 18_049 nanoseconds. - Weight::from_parts(18_431_000, 0) - .saturating_add(Weight::from_parts(0, 5103)) + // Measured: `306` + // Estimated: `7087` + // Minimum execution time: 19_575_000 picoseconds. + Weight::from_parts(19_826_000, 0) + .saturating_add(Weight::from_parts(0, 7087)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:1) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn update_mint_settings() -> Weight { // Proof Size summary in bytes: - // Measured: `333` - // Estimated: `5103` - // Minimum execution time: 17_166 nanoseconds. - Weight::from_parts(17_511_000, 0) - .saturating_add(Weight::from_parts(0, 5103)) + // Measured: `289` + // Estimated: `7072` + // Minimum execution time: 19_749_000 picoseconds. + Weight::from_parts(19_902_000, 0) + .saturating_add(Weight::from_parts(0, 7072)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -611,11 +604,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn set_price() -> Weight { // Proof Size summary in bytes: - // Measured: `516` - // Estimated: `8407` - // Minimum execution time: 22_556 nanoseconds. - Weight::from_parts(22_839_000, 0) - .saturating_add(Weight::from_parts(0, 8407)) + // Measured: `484` + // Estimated: `11377` + // Minimum execution time: 23_970_000 picoseconds. + Weight::from_parts(24_589_000, 0) + .saturating_add(Weight::from_parts(0, 11377)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -624,37 +617,35 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Storage: Nfts ItemPriceOf (r:1 w:1) /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: Nfts Account (r:0 w:2) /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Nfts PendingSwapOf (r:0 w:1) /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn buy_item() -> Weight { // Proof Size summary in bytes: - // Measured: `897` - // Estimated: `16129` - // Minimum execution time: 53_554 nanoseconds. - Weight::from_parts(54_285_000, 0) - .saturating_add(Weight::from_parts(0, 16129)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(6)) + // Measured: `671` + // Estimated: `18480` + // Minimum execution time: 43_929_000 picoseconds. + Weight::from_parts(44_364_000, 0) + .saturating_add(Weight::from_parts(0, 18480)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(5)) } /// The range of component `n` is `[0, 10]`. fn pay_tips(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_031 nanoseconds. - Weight::from_parts(3_579_973, 0) + // Minimum execution time: 2_611_000 picoseconds. + Weight::from_parts(4_292_527, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 8_727 - .saturating_add(Weight::from_parts(3_165_511, 0).saturating_mul(n.into())) + // Standard Error: 9_304 + .saturating_add(Weight::from_parts(3_636_886, 0).saturating_mul(n.into())) } /// Storage: Nfts Item (r:2 w:0) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) @@ -662,11 +653,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn create_swap() -> Weight { // Proof Size summary in bytes: - // Measured: `524` - // Estimated: `6672` - // Minimum execution time: 20_161 nanoseconds. - Weight::from_parts(20_487_000, 0) - .saturating_add(Weight::from_parts(0, 6672)) + // Measured: `460` + // Estimated: `7662` + // Minimum execution time: 22_643_000 picoseconds. + Weight::from_parts(22_957_000, 0) + .saturating_add(Weight::from_parts(0, 7662)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -676,11 +667,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) fn cancel_swap() -> Weight { // Proof Size summary in bytes: - // Measured: `511` - // Estimated: `5882` - // Minimum execution time: 19_470 nanoseconds. - Weight::from_parts(19_832_000, 0) - .saturating_add(Weight::from_parts(0, 5882)) + // Measured: `479` + // Estimated: `7862` + // Minimum execution time: 21_037_000 picoseconds. + Weight::from_parts(21_359_000, 0) + .saturating_add(Weight::from_parts(0, 7862)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -689,85 +680,85 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Storage: Nfts PendingSwapOf (r:1 w:2) /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:2 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: Nfts Account (r:0 w:4) /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Nfts ItemPriceOf (r:0 w:2) /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn claim_swap() -> Weight { // Proof Size summary in bytes: - // Measured: `1026` - // Estimated: `21970` - // Minimum execution time: 78_114 nanoseconds. - Weight::from_parts(79_459_000, 0) - .saturating_add(Weight::from_parts(0, 21970)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(11)) + // Measured: `800` + // Estimated: `24321` + // Minimum execution time: 72_434_000 picoseconds. + Weight::from_parts(73_184_000, 0) + .saturating_add(Weight::from_parts(0, 24321)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(10)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:2 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:1) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: Nfts Attribute (r:10 w:10) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(219), added: 2694, mode: MaxEncodedLen) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) /// Storage: Nfts Account (r:0 w:1) /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// The range of component `n` is `[0, 10]`. fn mint_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `525` - // Estimated: `16259 + n * (2729 ±0)` - // Minimum execution time: 108_373 nanoseconds. - Weight::from_parts(112_094_892, 0) - .saturating_add(Weight::from_parts(0, 16259)) - // Standard Error: 27_186 - .saturating_add(Weight::from_parts(20_710_983, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(6)) + // Measured: `524` + // Estimated: `29399 + n * (2954 ±0)` + // Minimum execution time: 125_554_000 picoseconds. + Weight::from_parts(129_631_978, 0) + .saturating_add(Weight::from_parts(0, 29399)) + // Standard Error: 20_858 + .saturating_add(Weight::from_parts(26_871_088, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2729).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) } /// Storage: Nfts Item (r:1 w:0) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) - /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(681), added: 3156, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(1001), added: 3476, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts Attribute (r:10 w:10) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// The range of component `n` is `[0, 10]`. fn set_attributes_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `716` - // Estimated: `14198 + n * (2921 ±0)` - // Minimum execution time: 84_153 nanoseconds. - Weight::from_parts(96_401_623, 0) - .saturating_add(Weight::from_parts(0, 14198)) - // Standard Error: 70_244 - .saturating_add(Weight::from_parts(26_866_222, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(4_u64)) + // Measured: `554` + // Estimated: `20462 + n * (2954 ±0)` + // Minimum execution time: 76_170_000 picoseconds. + Weight::from_parts(85_697_599, 0) + .saturating_add(Weight::from_parts(0, 20462)) + // Standard Error: 51_480 + .saturating_add(Weight::from_parts(26_398_485, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(2_u64)) + .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2921).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) } } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs index c4c259678fc..9e97e9e982d 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -52,13 +52,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 15_168 nanoseconds. - Weight::from_parts(15_986_761, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 2_885 - .saturating_add(Weight::from_parts(12_185, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 16_846_000 picoseconds. + Weight::from_parts(17_545_125, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_168 + .saturating_add(Weight::from_parts(38_590, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -71,15 +71,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn proxy_announced(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `550 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `11027` - // Minimum execution time: 32_310 nanoseconds. - Weight::from_parts(32_466_194, 0) - .saturating_add(Weight::from_parts(0, 11027)) - // Standard Error: 1_813 - .saturating_add(Weight::from_parts(120_725, 0).saturating_mul(a.into())) - // Standard Error: 1_873 - .saturating_add(Weight::from_parts(32_578, 0).saturating_mul(p.into())) + // Measured: `454 + a * (68 ±0) + p * (37 ±0)` + // Estimated: `13997` + // Minimum execution time: 35_646_000 picoseconds. + Weight::from_parts(35_944_816, 0) + .saturating_add(Weight::from_parts(0, 13997)) + // Standard Error: 1_868 + .saturating_add(Weight::from_parts(137_815, 0).saturating_mul(a.into())) + // Standard Error: 1_930 + .saturating_add(Weight::from_parts(38_331, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -91,15 +91,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `433 + a * (68 ±0)` - // Estimated: `7311` - // Minimum execution time: 20_363 nanoseconds. - Weight::from_parts(21_135_277, 0) - .saturating_add(Weight::from_parts(0, 7311)) - // Standard Error: 1_404 - .saturating_add(Weight::from_parts(120_045, 0).saturating_mul(a.into())) - // Standard Error: 1_450 - .saturating_add(Weight::from_parts(8_992, 0).saturating_mul(p.into())) + // Measured: `369 + a * (68 ±0)` + // Estimated: `9291` + // Minimum execution time: 22_142_000 picoseconds. + Weight::from_parts(23_269_000, 0) + .saturating_add(Weight::from_parts(0, 9291)) + // Standard Error: 1_365 + .saturating_add(Weight::from_parts(140_747, 0).saturating_mul(a.into())) + // Standard Error: 1_411 + .saturating_add(Weight::from_parts(14_983, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -111,15 +111,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn reject_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `433 + a * (68 ±0)` - // Estimated: `7311` - // Minimum execution time: 20_086 nanoseconds. - Weight::from_parts(21_145_287, 0) - .saturating_add(Weight::from_parts(0, 7311)) - // Standard Error: 1_612 - .saturating_add(Weight::from_parts(113_598, 0).saturating_mul(a.into())) - // Standard Error: 1_666 - .saturating_add(Weight::from_parts(11_520, 0).saturating_mul(p.into())) + // Measured: `369 + a * (68 ±0)` + // Estimated: `9291` + // Minimum execution time: 22_465_000 picoseconds. + Weight::from_parts(23_366_335, 0) + .saturating_add(Weight::from_parts(0, 9291)) + // Standard Error: 4_348 + .saturating_add(Weight::from_parts(149_266, 0).saturating_mul(a.into())) + // Standard Error: 4_492 + .saturating_add(Weight::from_parts(10_411, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -133,15 +133,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn announce(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `482 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `11027` - // Minimum execution time: 27_819 nanoseconds. - Weight::from_parts(28_662_588, 0) - .saturating_add(Weight::from_parts(0, 11027)) - // Standard Error: 2_297 - .saturating_add(Weight::from_parts(128_485, 0).saturating_mul(a.into())) - // Standard Error: 2_373 - .saturating_add(Weight::from_parts(47_044, 0).saturating_mul(p.into())) + // Measured: `386 + a * (68 ±0) + p * (37 ±0)` + // Estimated: `13997` + // Minimum execution time: 31_086_000 picoseconds. + Weight::from_parts(32_252_234, 0) + .saturating_add(Weight::from_parts(0, 13997)) + // Standard Error: 2_039 + .saturating_add(Weight::from_parts(131_541, 0).saturating_mul(a.into())) + // Standard Error: 2_107 + .saturating_add(Weight::from_parts(41_085, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -150,13 +150,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn add_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 21_187 nanoseconds. - Weight::from_parts(22_430_290, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 6_530 - .saturating_add(Weight::from_parts(43_133, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 24_040_000 picoseconds. + Weight::from_parts(24_914_869, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 2_025 + .saturating_add(Weight::from_parts(47_844, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -165,13 +165,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 20_985 nanoseconds. - Weight::from_parts(21_852_273, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_662 - .saturating_add(Weight::from_parts(66_644, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 23_495_000 picoseconds. + Weight::from_parts(24_788_899, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_911 + .saturating_add(Weight::from_parts(68_917, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -180,41 +180,41 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_proxies(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 16_958 nanoseconds. - Weight::from_parts(17_752_361, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_173 - .saturating_add(Weight::from_parts(25_691, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 19_269_000 picoseconds. + Weight::from_parts(20_040_655, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_327 + .saturating_add(Weight::from_parts(24_180, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Proxy Proxies (r:1 w:1) /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) /// The range of component `p` is `[1, 31]`. - fn create_pure(p: u32, ) -> Weight { + fn create_pure(_p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `139` - // Estimated: `3716` - // Minimum execution time: 23_055 nanoseconds. - Weight::from_parts(23_892_965, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_390 - .saturating_add(Weight::from_parts(16_195, 0).saturating_mul(p.into())) + // Estimated: `4706` + // Minimum execution time: 25_926_000 picoseconds. + Weight::from_parts(26_963_808, 0) + .saturating_add(Weight::from_parts(0, 4706)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Proxy Proxies (r:1 w:1) /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) /// The range of component `p` is `[0, 30]`. - fn kill_pure(_p: u32, ) -> Weight { + fn kill_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `196 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 18_344 nanoseconds. - Weight::from_parts(20_533_110, 0) - .saturating_add(Weight::from_parts(0, 3716)) + // Measured: `164 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 19_961_000 picoseconds. + Weight::from_parts(20_928_300, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_576 + .saturating_add(Weight::from_parts(28_604, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_session.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_session.rs index 773068d7e10..06d41c6383a 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_session.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -54,10 +54,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `270` - // Estimated: `5490` - // Minimum execution time: 15_187 nanoseconds. - Weight::from_parts(15_459_000, 0) - .saturating_add(Weight::from_parts(0, 5490)) + // Estimated: `7470` + // Minimum execution time: 17_273_000 picoseconds. + Weight::from_parts(17_562_000, 0) + .saturating_add(Weight::from_parts(0, 7470)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +68,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `242` - // Estimated: `2959` - // Minimum execution time: 11_795 nanoseconds. - Weight::from_parts(11_994_000, 0) - .saturating_add(Weight::from_parts(0, 2959)) + // Estimated: `3949` + // Minimum execution time: 13_268_000 picoseconds. + Weight::from_parts(13_646_000, 0) + .saturating_add(Weight::from_parts(0, 3949)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs index 0802c0eb098..af27f018b00 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -54,10 +54,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `86` - // Estimated: `1006` - // Minimum execution time: 8_408 nanoseconds. - Weight::from_parts(8_706_000, 0) - .saturating_add(Weight::from_parts(0, 1006)) + // Estimated: `2986` + // Minimum execution time: 9_234_000 picoseconds. + Weight::from_parts(9_578_000, 0) + .saturating_add(Weight::from_parts(0, 2986)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_185 nanoseconds. - Weight::from_parts(3_282_000, 0) + // Minimum execution time: 3_193_000 picoseconds. + Weight::from_parts(3_306_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs index 5bd62a1fc8d..44846163ff0 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_uniques` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn create() -> Weight { // Proof Size summary in bytes: - // Measured: `177` - // Estimated: `2653` - // Minimum execution time: 24_517 nanoseconds. - Weight::from_parts(24_884_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `145` + // Estimated: `3643` + // Minimum execution time: 25_977_000 picoseconds. + Weight::from_parts(27_109_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +68,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `2653` - // Minimum execution time: 13_312 nanoseconds. - Weight::from_parts(13_652_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Estimated: `3643` + // Minimum execution time: 14_712_000 picoseconds. + Weight::from_parts(15_150_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -79,14 +79,14 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) /// Storage: Uniques Asset (r:1001 w:1000) /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) + /// Storage: Uniques InstanceMetadataOf (r:1000 w:1000) + /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) + /// Storage: Uniques Attribute (r:1000 w:1000) + /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) /// Storage: Uniques ClassAccount (r:0 w:1) /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) - /// Storage: Uniques Attribute (r:0 w:1000) - /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) /// Storage: Uniques ClassMetadataOf (r:0 w:1) /// Proof: Uniques ClassMetadataOf (max_values: None, max_size: Some(167), added: 2642, mode: MaxEncodedLen) - /// Storage: Uniques InstanceMetadataOf (r:0 w:1000) - /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) /// Storage: Uniques Account (r:0 w:1000) /// Proof: Uniques Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Uniques CollectionMaxSupply (r:0 w:1) @@ -96,24 +96,28 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// The range of component `a` is `[0, 1000]`. fn destroy(n: u32, m: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `289 + n * (108 ±0) + m * (56 ±0) + a * (107 ±0)` - // Estimated: `5250 + n * (2597 ±0)` - // Minimum execution time: 2_287_290 nanoseconds. - Weight::from_parts(2_319_526_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) - // Standard Error: 25_275 - .saturating_add(Weight::from_parts(8_587_226, 0).saturating_mul(n.into())) - // Standard Error: 25_275 - .saturating_add(Weight::from_parts(193_381, 0).saturating_mul(m.into())) - // Standard Error: 25_275 - .saturating_add(Weight::from_parts(296_151, 0).saturating_mul(a.into())) + // Measured: `257 + n * (76 ±0) + m * (56 ±0) + a * (107 ±0)` + // Estimated: `9210 + n * (2597 ±0) + a * (2647 ±0) + m * (2662 ±0)` + // Minimum execution time: 2_367_187_000 picoseconds. + Weight::from_parts(2_382_789_000, 0) + .saturating_add(Weight::from_parts(0, 9210)) + // Standard Error: 24_652 + .saturating_add(Weight::from_parts(6_204_090, 0).saturating_mul(n.into())) + // Standard Error: 24_652 + .saturating_add(Weight::from_parts(246_468, 0).saturating_mul(m.into())) + // Standard Error: 24_652 + .saturating_add(Weight::from_parts(346_915, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(4)) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(0, 2647).saturating_mul(a.into())) + .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) } /// Storage: Uniques Asset (r:1 w:1) /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) @@ -125,11 +129,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn mint() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `7749` - // Minimum execution time: 29_225 nanoseconds. - Weight::from_parts(29_894_000, 0) - .saturating_add(Weight::from_parts(0, 7749)) + // Measured: `282` + // Estimated: `10719` + // Minimum execution time: 31_948_000 picoseconds. + Weight::from_parts(32_314_000, 0) + .saturating_add(Weight::from_parts(0, 10719)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -143,11 +147,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn burn() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 30_673 nanoseconds. - Weight::from_parts(31_553_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 33_711_000 picoseconds. + Weight::from_parts(34_742_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -161,11 +165,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 24_944 nanoseconds. - Weight::from_parts(25_233_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 26_609_000 picoseconds. + Weight::from_parts(27_130_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -176,13 +180,13 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// The range of component `i` is `[0, 5000]`. fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `770 + i * (108 ±0)` - // Estimated: `2653 + i * (2597 ±0)` - // Minimum execution time: 14_364 nanoseconds. - Weight::from_parts(14_520_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) - // Standard Error: 12_908 - .saturating_add(Weight::from_parts(12_176_880, 0).saturating_mul(i.into())) + // Measured: `738 + i * (76 ±0)` + // Estimated: `4633 + i * (2597 ±0)` + // Minimum execution time: 15_463_000 picoseconds. + Weight::from_parts(15_625_000, 0) + .saturating_add(Weight::from_parts(0, 4633)) + // Standard Error: 12_996 + .saturating_add(Weight::from_parts(13_104_503, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -195,11 +199,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn freeze() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 17_798 nanoseconds. - Weight::from_parts(18_009_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 18_897_000 picoseconds. + Weight::from_parts(19_276_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -209,11 +213,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn thaw() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 17_924 nanoseconds. - Weight::from_parts(18_168_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 18_883_000 picoseconds. + Weight::from_parts(19_526_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -221,11 +225,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn freeze_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 13_425 nanoseconds. - Weight::from_parts(13_846_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 14_519_000 picoseconds. + Weight::from_parts(14_887_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -233,11 +237,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn thaw_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 13_484 nanoseconds. - Weight::from_parts(13_715_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 14_172_000 picoseconds. + Weight::from_parts(14_395_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -249,11 +253,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `5180` - // Minimum execution time: 21_132 nanoseconds. - Weight::from_parts(21_421_000, 0) - .saturating_add(Weight::from_parts(0, 5180)) + // Measured: `356` + // Estimated: `7160` + // Minimum execution time: 22_131_000 picoseconds. + Weight::from_parts(22_540_000, 0) + .saturating_add(Weight::from_parts(0, 7160)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -261,11 +265,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn set_team() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 13_763 nanoseconds. - Weight::from_parts(14_136_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 15_582_000 picoseconds. + Weight::from_parts(15_907_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -275,11 +279,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn force_item_status() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 16_125 nanoseconds. - Weight::from_parts(16_516_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 17_915_000 picoseconds. + Weight::from_parts(18_190_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -291,11 +295,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) fn set_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `623` - // Estimated: `7962` - // Minimum execution time: 34_408 nanoseconds. - Weight::from_parts(34_820_000, 0) - .saturating_add(Weight::from_parts(0, 7962)) + // Measured: `559` + // Estimated: `10932` + // Minimum execution time: 37_851_000 picoseconds. + Weight::from_parts(38_554_000, 0) + .saturating_add(Weight::from_parts(0, 10932)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -307,11 +311,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) fn clear_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `851` - // Estimated: `7962` - // Minimum execution time: 33_385 nanoseconds. - Weight::from_parts(34_088_000, 0) - .saturating_add(Weight::from_parts(0, 7962)) + // Measured: `756` + // Estimated: `10932` + // Minimum execution time: 37_289_000 picoseconds. + Weight::from_parts(37_807_000, 0) + .saturating_add(Weight::from_parts(0, 10932)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -321,11 +325,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) fn set_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `380` - // Estimated: `5315` - // Minimum execution time: 27_303 nanoseconds. - Weight::from_parts(27_692_000, 0) - .saturating_add(Weight::from_parts(0, 5315)) + // Measured: `348` + // Estimated: `7295` + // Minimum execution time: 28_825_000 picoseconds. + Weight::from_parts(29_277_000, 0) + .saturating_add(Weight::from_parts(0, 7295)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -335,11 +339,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `623` - // Estimated: `5315` - // Minimum execution time: 27_530 nanoseconds. - Weight::from_parts(28_122_000, 0) - .saturating_add(Weight::from_parts(0, 5315)) + // Measured: `559` + // Estimated: `7295` + // Minimum execution time: 29_274_000 picoseconds. + Weight::from_parts(29_941_000, 0) + .saturating_add(Weight::from_parts(0, 7295)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -349,11 +353,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassMetadataOf (max_values: None, max_size: Some(167), added: 2642, mode: MaxEncodedLen) fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `5295` - // Minimum execution time: 26_384 nanoseconds. - Weight::from_parts(27_285_000, 0) - .saturating_add(Weight::from_parts(0, 5295)) + // Measured: `282` + // Estimated: `7275` + // Minimum execution time: 28_196_000 picoseconds. + Weight::from_parts(28_563_000, 0) + .saturating_add(Weight::from_parts(0, 7275)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -363,11 +367,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassMetadataOf (max_values: None, max_size: Some(167), added: 2642, mode: MaxEncodedLen) fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `537` - // Estimated: `5295` - // Minimum execution time: 24_599 nanoseconds. - Weight::from_parts(24_992_000, 0) - .saturating_add(Weight::from_parts(0, 5295)) + // Measured: `473` + // Estimated: `7275` + // Minimum execution time: 26_657_000 picoseconds. + Weight::from_parts(27_189_000, 0) + .saturating_add(Weight::from_parts(0, 7275)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -377,11 +381,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) fn approve_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 19_754 nanoseconds. - Weight::from_parts(20_071_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 21_135_000 picoseconds. + Weight::from_parts(21_445_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -391,11 +395,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) fn cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `525` - // Estimated: `5250` - // Minimum execution time: 19_376 nanoseconds. - Weight::from_parts(19_716_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `461` + // Estimated: `7230` + // Minimum execution time: 20_803_000 picoseconds. + Weight::from_parts(21_249_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -404,10 +408,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_accept_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `2527` - // Minimum execution time: 15_069 nanoseconds. - Weight::from_parts(15_273_000, 0) - .saturating_add(Weight::from_parts(0, 2527)) + // Estimated: `3517` + // Minimum execution time: 16_421_000 picoseconds. + Weight::from_parts(16_940_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -417,11 +421,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `5152` - // Minimum execution time: 15_900 nanoseconds. - Weight::from_parts(16_182_000, 0) - .saturating_add(Weight::from_parts(0, 5152)) + // Measured: `282` + // Estimated: `7132` + // Minimum execution time: 17_792_000 picoseconds. + Weight::from_parts(18_087_000, 0) + .saturating_add(Weight::from_parts(0, 7132)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -431,11 +435,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn set_price() -> Weight { // Proof Size summary in bytes: - // Measured: `291` - // Estimated: `2597` - // Minimum execution time: 15_789 nanoseconds. - Weight::from_parts(16_115_000, 0) - .saturating_add(Weight::from_parts(0, 2597)) + // Measured: `259` + // Estimated: `3587` + // Minimum execution time: 17_036_000 picoseconds. + Weight::from_parts(17_365_000, 0) + .saturating_add(Weight::from_parts(0, 3587)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -449,11 +453,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn buy_item() -> Weight { // Proof Size summary in bytes: - // Measured: `636` - // Estimated: `7814` - // Minimum execution time: 34_557 nanoseconds. - Weight::from_parts(34_927_000, 0) - .saturating_add(Weight::from_parts(0, 7814)) + // Measured: `540` + // Estimated: `10784` + // Minimum execution time: 37_920_000 picoseconds. + Weight::from_parts(38_587_000, 0) + .saturating_add(Weight::from_parts(0, 10784)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs index f0823eb6f87..25a8f1375d0 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -52,18 +52,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_416 nanoseconds. - Weight::from_parts(18_983_305, 0) + // Minimum execution time: 7_113_000 picoseconds. + Weight::from_parts(38_041_346, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_082 - .saturating_add(Weight::from_parts(4_175_368, 0).saturating_mul(c.into())) + // Standard Error: 4_785 + .saturating_add(Weight::from_parts(4_680_352, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_581 nanoseconds. - Weight::from_parts(4_767_000, 0) + // Minimum execution time: 5_441_000 picoseconds. + Weight::from_parts(5_594_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +71,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_279 nanoseconds. - Weight::from_parts(21_320_216, 0) + // Minimum execution time: 7_203_000 picoseconds. + Weight::from_parts(18_311_542, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_995 - .saturating_add(Weight::from_parts(4_376_040, 0).saturating_mul(c.into())) + // Standard Error: 2_281 + .saturating_add(Weight::from_parts(4_950_166, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_298 nanoseconds. - Weight::from_parts(8_522_000, 0) + // Minimum execution time: 9_631_000 picoseconds. + Weight::from_parts(9_881_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +90,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_311 nanoseconds. - Weight::from_parts(16_307_926, 0) + // Minimum execution time: 7_146_000 picoseconds. + Weight::from_parts(22_172_240, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_381 - .saturating_add(Weight::from_parts(4_172_851, 0).saturating_mul(c.into())) + // Standard Error: 3_023 + .saturating_add(Weight::from_parts(4_688_391, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs index 8863a425c01..832a9af5f5e 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -59,11 +59,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn send() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `4645` - // Minimum execution time: 25_244 nanoseconds. - Weight::from_parts(25_671_000, 0) - .saturating_add(Weight::from_parts(0, 4645)) + // Measured: `75` + // Estimated: `9780` + // Minimum execution time: 28_004_000 picoseconds. + Weight::from_parts(28_341_000, 0) + .saturating_add(Weight::from_parts(0, 9780)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -72,10 +72,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn teleport_assets() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `499` - // Minimum execution time: 25_183 nanoseconds. - Weight::from_parts(25_684_000, 0) - .saturating_add(Weight::from_parts(0, 499)) + // Estimated: `1489` + // Minimum execution time: 23_734_000 picoseconds. + Weight::from_parts(24_091_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: ParachainInfo ParachainId (r:1 w:0) @@ -83,10 +83,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn reserve_transfer_assets() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `499` - // Minimum execution time: 18_819 nanoseconds. - Weight::from_parts(19_048_000, 0) - .saturating_add(Weight::from_parts(0, 499)) + // Estimated: `1489` + // Minimum execution time: 19_172_000 picoseconds. + Weight::from_parts(19_439_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Benchmark Override (r:0 w:0) @@ -95,7 +95,7 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551 nanoseconds. + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } @@ -105,8 +105,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_636 nanoseconds. - Weight::from_parts(8_906_000, 0) + // Minimum execution time: 10_181_000 picoseconds. + Weight::from_parts(10_441_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -116,8 +116,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_486 nanoseconds. - Weight::from_parts(2_652_000, 0) + // Minimum execution time: 3_092_000 picoseconds. + Weight::from_parts(3_217_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -139,11 +139,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `7729` - // Minimum execution time: 29_811 nanoseconds. - Weight::from_parts(30_291_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Measured: `75` + // Estimated: `14955` + // Minimum execution time: 36_167_000 picoseconds. + Weight::from_parts(37_036_000, 0) + .saturating_add(Weight::from_parts(0, 14955)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -163,11 +163,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `220` - // Estimated: `8470` - // Minimum execution time: 31_884 nanoseconds. - Weight::from_parts(32_567_000, 0) - .saturating_add(Weight::from_parts(0, 8470)) + // Measured: `257` + // Estimated: `14669` + // Minimum execution time: 39_341_000 picoseconds. + Weight::from_parts(40_254_000, 0) + .saturating_add(Weight::from_parts(0, 14669)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -175,11 +175,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `9995` - // Minimum execution time: 14_098 nanoseconds. - Weight::from_parts(14_349_000, 0) - .saturating_add(Weight::from_parts(0, 9995)) + // Measured: `129` + // Estimated: `11019` + // Minimum execution time: 20_159_000 picoseconds. + Weight::from_parts(20_621_000, 0) + .saturating_add(Weight::from_parts(0, 11019)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -187,11 +187,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `9999` - // Minimum execution time: 14_117 nanoseconds. - Weight::from_parts(14_383_000, 0) - .saturating_add(Weight::from_parts(0, 9999)) + // Measured: `133` + // Estimated: `11023` + // Minimum execution time: 20_095_000 picoseconds. + Weight::from_parts(20_335_000, 0) + .saturating_add(Weight::from_parts(0, 11023)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -199,11 +199,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn already_notified_target() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `12481` - // Minimum execution time: 15_353 nanoseconds. - Weight::from_parts(15_558_000, 0) - .saturating_add(Weight::from_parts(0, 12481)) + // Measured: `140` + // Estimated: `13505` + // Minimum execution time: 20_826_000 picoseconds. + Weight::from_parts(21_160_000, 0) + .saturating_add(Weight::from_parts(0, 13505)) .saturating_add(T::DbWeight::get().reads(5)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) @@ -220,11 +220,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn notify_current_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10041` - // Minimum execution time: 28_752 nanoseconds. - Weight::from_parts(29_435_000, 0) - .saturating_add(Weight::from_parts(0, 10041)) + // Measured: `142` + // Estimated: `16197` + // Minimum execution time: 38_595_000 picoseconds. + Weight::from_parts(39_178_000, 0) + .saturating_add(Weight::from_parts(0, 16197)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -232,22 +232,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: - // Measured: `136` - // Estimated: `7561` - // Minimum execution time: 7_143 nanoseconds. - Weight::from_parts(7_368_000, 0) - .saturating_add(Weight::from_parts(0, 7561)) + // Measured: `172` + // Estimated: `8587` + // Minimum execution time: 11_391_000 picoseconds. + Weight::from_parts(11_704_000, 0) + .saturating_add(Weight::from_parts(0, 8587)) .saturating_add(T::DbWeight::get().reads(3)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10006` - // Minimum execution time: 14_381 nanoseconds. - Weight::from_parts(14_582_000, 0) - .saturating_add(Weight::from_parts(0, 10006)) + // Measured: `140` + // Estimated: `11030` + // Minimum execution time: 22_506_000 picoseconds. + Weight::from_parts(23_076_000, 0) + .saturating_add(Weight::from_parts(0, 11030)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -265,11 +265,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `112` - // Estimated: `15027` - // Minimum execution time: 34_190 nanoseconds. - Weight::from_parts(34_889_000, 0) - .saturating_add(Weight::from_parts(0, 15027)) + // Measured: `146` + // Estimated: `21171` + // Minimum execution time: 47_662_000 picoseconds. + Weight::from_parts(48_167_000, 0) + .saturating_add(Weight::from_parts(0, 21171)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 8999d55df5b..d93dd65746b 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,27 +17,26 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./templates/xcm-bench-template.hbs +// --chain=statemine-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::fungible -// --chain=statemine-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/assets/statemine/src/weights/xcm/ +// --output=./parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -55,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 22_457_000 picoseconds. - Weight::from_parts(22_952_000, 3593) + // Minimum execution time: 23_021_000 picoseconds. + Weight::from_parts(23_385_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -66,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 32_247_000 picoseconds. - Weight::from_parts(32_534_000, 6196) + // Minimum execution time: 33_451_000 picoseconds. + Weight::from_parts(33_779_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -87,10 +86,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `139` - // Estimated: `17785` - // Minimum execution time: 53_956_000 picoseconds. - Weight::from_parts(55_144_000, 17785) + // Measured: `176` + // Estimated: `17970` + // Minimum execution time: 56_145_000 picoseconds. + Weight::from_parts(56_830_000, 17970) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -98,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_424_000 picoseconds. - Weight::from_parts(4_494_000, 0) + // Minimum execution time: 4_315_000 picoseconds. + Weight::from_parts(4_448_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -107,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 25_243_000 picoseconds. - Weight::from_parts(25_666_000, 3593) + // Minimum execution time: 25_505_000 picoseconds. + Weight::from_parts(25_697_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -128,10 +127,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `14677` - // Minimum execution time: 47_487_000 picoseconds. - Weight::from_parts(80_083_000, 14677) + // Measured: `75` + // Estimated: `14862` + // Minimum execution time: 50_620_000 picoseconds. + Weight::from_parts(50_926_000, 14862) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -149,10 +148,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 31_674_000 picoseconds. - Weight::from_parts(45_575_000, 11084) + // Measured: `75` + // Estimated: `11269` + // Minimum execution time: 31_700_000 picoseconds. + Weight::from_parts(32_178_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 8424d5d64a9..058f23631dd 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,27 +17,26 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./templates/xcm-bench-template.hbs +// --chain=statemine-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --chain=statemine-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/assets/statemine/src/weights/xcm/ +// --output=./parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -63,10 +62,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_holding() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 364_890_000 picoseconds. - Weight::from_parts(367_248_000, 11084) + // Measured: `75` + // Estimated: `11269` + // Minimum execution time: 367_337_000 picoseconds. + Weight::from_parts(368_530_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -74,67 +73,67 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_032_000 picoseconds. - Weight::from_parts(4_167_000, 0) + // Minimum execution time: 4_121_000 picoseconds. + Weight::from_parts(4_318_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) pub fn query_response() -> Weight { // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `3497` - // Minimum execution time: 11_093_000 picoseconds. - Weight::from_parts(11_300_000, 3497) + // Measured: `69` + // Estimated: `3534` + // Minimum execution time: 11_951_000 picoseconds. + Weight::from_parts(12_171_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_672_000 picoseconds. - Weight::from_parts(13_829_000, 0) + // Minimum execution time: 13_626_000 picoseconds. + Weight::from_parts(13_891_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_451_000 picoseconds. - Weight::from_parts(4_581_000, 0) + // Minimum execution time: 4_276_000 picoseconds. + Weight::from_parts(4_444_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_053_000 picoseconds. - Weight::from_parts(3_148_000, 0) + // Minimum execution time: 2_969_000 picoseconds. + Weight::from_parts(3_090_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_733_000 picoseconds. - Weight::from_parts(4_784_000, 0) + // Minimum execution time: 3_148_000 picoseconds. + Weight::from_parts(3_252_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_002_000 picoseconds. - Weight::from_parts(3_072_000, 0) + // Minimum execution time: 3_027_000 picoseconds. + Weight::from_parts(3_081_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_959_000 picoseconds. - Weight::from_parts(4_036_000, 0) + // Minimum execution time: 3_863_000 picoseconds. + Weight::from_parts(3_934_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_974_000 picoseconds. - Weight::from_parts(3_052_000, 0) + // Minimum execution time: 3_013_000 picoseconds. + Weight::from_parts(3_115_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -150,10 +149,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_error() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 24_065_000 picoseconds. - Weight::from_parts(24_646_000, 11084) + // Measured: `75` + // Estimated: `11269` + // Minimum execution time: 25_963_000 picoseconds. + Weight::from_parts(26_428_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -161,10 +160,10 @@ impl WeightInfo { // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) pub fn claim_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `90` - // Estimated: `3555` - // Minimum execution time: 15_036_000 picoseconds. - Weight::from_parts(15_419_000, 3555) + // Measured: `126` + // Estimated: `3591` + // Minimum execution time: 16_492_000 picoseconds. + Weight::from_parts(16_930_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -172,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_008_000 picoseconds. - Weight::from_parts(3_083_000, 0) + // Minimum execution time: 3_004_000 picoseconds. + Weight::from_parts(3_070_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -189,10 +188,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `13098` - // Minimum execution time: 44_824_000 picoseconds. - Weight::from_parts(45_183_000, 13098) + // Measured: `75` + // Estimated: `13320` + // Minimum execution time: 28_804_000 picoseconds. + Weight::from_parts(29_543_000, 13320) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -202,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_969_000 picoseconds. - Weight::from_parts(5_198_000, 0) + // Minimum execution time: 5_140_000 picoseconds. + Weight::from_parts(5_343_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -220,10 +219,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 422_661_000 picoseconds. - Weight::from_parts(425_164_000, 11084) + // Measured: `75` + // Estimated: `11269` + // Minimum execution time: 410_533_000 picoseconds. + Weight::from_parts(412_507_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -231,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 135_692_000 picoseconds. - Weight::from_parts(136_167_000, 0) + // Minimum execution time: 126_970_000 picoseconds. + Weight::from_parts(129_854_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_880_000 picoseconds. - Weight::from_parts(13_103_000, 0) + // Minimum execution time: 13_585_000 picoseconds. + Weight::from_parts(13_852_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_842_000 picoseconds. - Weight::from_parts(4_898_000, 0) + // Minimum execution time: 3_091_000 picoseconds. + Weight::from_parts(3_180_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_026_000 picoseconds. - Weight::from_parts(3_109_000, 0) + // Minimum execution time: 2_982_000 picoseconds. + Weight::from_parts(3_060_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_241_000 picoseconds. - Weight::from_parts(3_281_000, 0) + // Minimum execution time: 3_246_000 picoseconds. + Weight::from_parts(3_332_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -276,10 +275,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn query_pallet() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 27_818_000 picoseconds. - Weight::from_parts(28_080_000, 11084) + // Measured: `75` + // Estimated: `11269` + // Minimum execution time: 29_939_000 picoseconds. + Weight::from_parts(30_426_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -287,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_410_000 picoseconds. - Weight::from_parts(5_514_000, 0) + // Minimum execution time: 5_477_000 picoseconds. + Weight::from_parts(5_585_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -304,10 +303,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 24_798_000 picoseconds. - Weight::from_parts(26_833_000, 11084) + // Measured: `75` + // Estimated: `11269` + // Minimum execution time: 26_349_000 picoseconds. + Weight::from_parts(26_957_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -315,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_083_000 picoseconds. - Weight::from_parts(3_148_000, 0) + // Minimum execution time: 3_087_000 picoseconds. + Weight::from_parts(3_137_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_995_000 picoseconds. - Weight::from_parts(3_045_000, 0) + // Minimum execution time: 3_047_000 picoseconds. + Weight::from_parts(3_111_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_080_000 picoseconds. - Weight::from_parts(3_128_000, 0) + // Minimum execution time: 3_018_000 picoseconds. + Weight::from_parts(3_082_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_009_000 picoseconds. - Weight::from_parts(3_102_000, 0) + // Minimum execution time: 3_051_000 picoseconds. + Weight::from_parts(3_090_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_202_000 picoseconds. - Weight::from_parts(3_290_000, 0) + // Minimum execution time: 3_140_000 picoseconds. + Weight::from_parts(3_274_000, 0) } } diff --git a/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs index 746387e0796..02bedfa2d6a 100644 --- a/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -52,10 +52,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_u32() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_717 nanoseconds. - Weight::from_parts(4_964_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_634_000 picoseconds. + Weight::from_parts(5_845_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -64,10 +64,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_weight() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_840 nanoseconds. - Weight::from_parts(5_074_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_684_000 picoseconds. + Weight::from_parts(5_823_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/frame_system.rs b/parachains/runtimes/assets/statemint/src/weights/frame_system.rs index 3475b7980cb..23a5e25cddb 100644 --- a/parachains/runtimes/assets/statemint/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/statemint/src/weights/frame_system.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -52,22 +52,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_455 nanoseconds. - Weight::from_parts(1_553_000, 0) + // Minimum execution time: 2_346_000 picoseconds. + Weight::from_parts(2_416_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(368, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(412, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_602 nanoseconds. - Weight::from_parts(6_725_000, 0) + // Minimum execution time: 8_010_000 picoseconds. + Weight::from_parts(8_171_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_715, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_448, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -76,10 +76,10 @@ impl frame_system::WeightInfo for WeightInfo { fn set_heap_pages() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `495` - // Minimum execution time: 3_555 nanoseconds. - Weight::from_parts(3_745_000, 0) - .saturating_add(Weight::from_parts(0, 495)) + // Estimated: `1485` + // Minimum execution time: 4_684_000 picoseconds. + Weight::from_parts(4_872_000, 0) + .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -90,11 +90,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_690 nanoseconds. - Weight::from_parts(1_735_000, 0) + // Minimum execution time: 2_361_000 picoseconds. + Weight::from_parts(2_402_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_138 - .saturating_add(Weight::from_parts(588_449, 0).saturating_mul(i.into())) + // Standard Error: 1_747 + .saturating_add(Weight::from_parts(682_536, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +104,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_695 nanoseconds. - Weight::from_parts(1_771_000, 0) + // Minimum execution time: 2_515_000 picoseconds. + Weight::from_parts(2_565_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 816 - .saturating_add(Weight::from_parts(449_345, 0).saturating_mul(i.into())) + // Standard Error: 859 + .saturating_add(Weight::from_parts(501_791, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -118,11 +118,12 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `81 + p * (69 ±0)` // Estimated: `72 + p * (70 ±0)` - // Minimum execution time: 3_289 nanoseconds. - Weight::from_parts(3_377_000, 0) + // Minimum execution time: 4_524_000 picoseconds. + Weight::from_parts(4_626_000, 0) .saturating_add(Weight::from_parts(0, 72)) - // Standard Error: 922 - .saturating_add(Weight::from_parts(969_103, 0).saturating_mul(p.into())) + // Standard Error: 1_004 + .saturating_add(Weight::from_parts(1_011_603, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs index 0fc7e6fb0af..933dcb4d3af 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_assets` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn create() -> Weight { // Proof Size summary in bytes: - // Measured: `141` - // Estimated: `5288` - // Minimum execution time: 21_786 nanoseconds. - Weight::from_parts(22_084_000, 0) - .saturating_add(Weight::from_parts(0, 5288)) + // Measured: `109` + // Estimated: `7268` + // Minimum execution time: 24_714_000 picoseconds. + Weight::from_parts(25_310_000, 0) + .saturating_add(Weight::from_parts(0, 7268)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -66,10 +66,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `6` - // Estimated: `2685` - // Minimum execution time: 10_638 nanoseconds. - Weight::from_parts(10_889_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Estimated: `3675` + // Minimum execution time: 12_820_000 picoseconds. + Weight::from_parts(13_118_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -77,11 +77,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn start_destroy() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `2685` - // Minimum execution time: 13_146 nanoseconds. - Weight::from_parts(13_421_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `277` + // Estimated: `3675` + // Minimum execution time: 15_292_000 picoseconds. + Weight::from_parts(15_715_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -94,13 +94,13 @@ impl pallet_assets::WeightInfo for WeightInfo { /// The range of component `c` is `[0, 1000]`. fn destroy_accounts(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + c * (240 ±0)` - // Estimated: `5262 + c * (5180 ±0)` - // Minimum execution time: 15_962 nanoseconds. - Weight::from_parts(16_041_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) - // Standard Error: 9_326 - .saturating_add(Weight::from_parts(13_983_529, 0).saturating_mul(c.into())) + // Measured: `0 + c * (208 ±0)` + // Estimated: `8232 + c * (5180 ±0)` + // Minimum execution time: 17_955_000 picoseconds. + Weight::from_parts(18_157_000, 0) + .saturating_add(Weight::from_parts(0, 8232)) + // Standard Error: 7_214 + .saturating_add(Weight::from_parts(12_316_605, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -114,13 +114,13 @@ impl pallet_assets::WeightInfo for WeightInfo { /// The range of component `a` is `[0, 1000]`. fn destroy_approvals(a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `446 + a * (86 ±0)` - // Estimated: `5308 + a * (2623 ±0)` - // Minimum execution time: 16_343 nanoseconds. - Weight::from_parts(16_490_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) - // Standard Error: 7_664 - .saturating_add(Weight::from_parts(13_585_881, 0).saturating_mul(a.into())) + // Measured: `414 + a * (86 ±0)` + // Estimated: `7288 + a * (2623 ±0)` + // Minimum execution time: 18_626_000 picoseconds. + Weight::from_parts(18_760_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) + // Standard Error: 4_382 + .saturating_add(Weight::from_parts(12_278_198, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -133,11 +133,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn finish_destroy() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5300` - // Minimum execution time: 12_531 nanoseconds. - Weight::from_parts(13_108_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `243` + // Estimated: `7280` + // Minimum execution time: 14_576_000 picoseconds. + Weight::from_parts(14_816_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -147,11 +147,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn mint() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5262` - // Minimum execution time: 22_604 nanoseconds. - Weight::from_parts(22_970_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `243` + // Estimated: `7242` + // Minimum execution time: 26_215_000 picoseconds. + Weight::from_parts(26_571_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -161,11 +161,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn burn() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `5262` - // Minimum execution time: 28_407 nanoseconds. - Weight::from_parts(29_012_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `351` + // Estimated: `7242` + // Minimum execution time: 31_944_000 picoseconds. + Weight::from_parts(32_675_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -177,11 +177,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `10442` - // Minimum execution time: 38_044 nanoseconds. - Weight::from_parts(38_562_000, 0) - .saturating_add(Weight::from_parts(0, 10442)) + // Measured: `351` + // Estimated: `13412` + // Minimum execution time: 44_126_000 picoseconds. + Weight::from_parts(44_567_000, 0) + .saturating_add(Weight::from_parts(0, 13412)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -193,11 +193,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `10442` - // Minimum execution time: 33_946 nanoseconds. - Weight::from_parts(34_532_000, 0) - .saturating_add(Weight::from_parts(0, 10442)) + // Measured: `351` + // Estimated: `13412` + // Minimum execution time: 39_414_000 picoseconds. + Weight::from_parts(39_891_000, 0) + .saturating_add(Weight::from_parts(0, 13412)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -209,11 +209,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `10442` - // Minimum execution time: 38_013 nanoseconds. - Weight::from_parts(38_818_000, 0) - .saturating_add(Weight::from_parts(0, 10442)) + // Measured: `351` + // Estimated: `13412` + // Minimum execution time: 44_875_000 picoseconds. + Weight::from_parts(45_961_000, 0) + .saturating_add(Weight::from_parts(0, 13412)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -223,11 +223,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn freeze() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `5262` - // Minimum execution time: 15_798 nanoseconds. - Weight::from_parts(16_178_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `351` + // Estimated: `7242` + // Minimum execution time: 18_388_000 picoseconds. + Weight::from_parts(18_718_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -237,11 +237,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn thaw() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `5262` - // Minimum execution time: 16_196 nanoseconds. - Weight::from_parts(16_525_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `351` + // Estimated: `7242` + // Minimum execution time: 18_292_000 picoseconds. + Weight::from_parts(18_633_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -249,11 +249,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn freeze_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `2685` - // Minimum execution time: 12_600 nanoseconds. - Weight::from_parts(13_038_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `277` + // Estimated: `3675` + // Minimum execution time: 14_604_000 picoseconds. + Weight::from_parts(14_980_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -261,11 +261,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn thaw_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `2685` - // Minimum execution time: 12_433 nanoseconds. - Weight::from_parts(12_924_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `277` + // Estimated: `3675` + // Minimum execution time: 14_008_000 picoseconds. + Weight::from_parts(14_428_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -275,11 +275,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5300` - // Minimum execution time: 13_754 nanoseconds. - Weight::from_parts(14_069_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `243` + // Estimated: `7280` + // Minimum execution time: 15_453_000 picoseconds. + Weight::from_parts(15_963_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -287,11 +287,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn set_team() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `2685` - // Minimum execution time: 12_640 nanoseconds. - Weight::from_parts(12_846_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `243` + // Estimated: `3675` + // Minimum execution time: 14_515_000 picoseconds. + Weight::from_parts(14_835_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -301,15 +301,17 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) /// The range of component `n` is `[0, 50]`. /// The range of component `s` is `[0, 50]`. - fn set_metadata(_n: u32, s: u32, ) -> Weight { + fn set_metadata(n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5300` - // Minimum execution time: 22_428 nanoseconds. - Weight::from_parts(23_549_955, 0) - .saturating_add(Weight::from_parts(0, 5300)) - // Standard Error: 731 - .saturating_add(Weight::from_parts(893, 0).saturating_mul(s.into())) + // Measured: `243` + // Estimated: `7280` + // Minimum execution time: 25_865_000 picoseconds. + Weight::from_parts(26_845_899, 0) + .saturating_add(Weight::from_parts(0, 7280)) + // Standard Error: 1_061 + .saturating_add(Weight::from_parts(4_438, 0).saturating_mul(n.into())) + // Standard Error: 1_061 + .saturating_add(Weight::from_parts(5_130, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -319,11 +321,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `471` - // Estimated: `5300` - // Minimum execution time: 22_730 nanoseconds. - Weight::from_parts(23_336_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `407` + // Estimated: `7280` + // Minimum execution time: 25_970_000 picoseconds. + Weight::from_parts(26_439_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -333,15 +335,17 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) /// The range of component `n` is `[0, 50]`. /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(_n: u32, s: u32, ) -> Weight { + fn force_set_metadata(n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `82` - // Estimated: `5300` - // Minimum execution time: 12_289 nanoseconds. - Weight::from_parts(12_841_728, 0) - .saturating_add(Weight::from_parts(0, 5300)) - // Standard Error: 304 - .saturating_add(Weight::from_parts(1_964, 0).saturating_mul(s.into())) + // Estimated: `7280` + // Minimum execution time: 14_101_000 picoseconds. + Weight::from_parts(14_786_155, 0) + .saturating_add(Weight::from_parts(0, 7280)) + // Standard Error: 383 + .saturating_add(Weight::from_parts(581, 0).saturating_mul(n.into())) + // Standard Error: 383 + .saturating_add(Weight::from_parts(4_514, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -351,11 +355,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn force_clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `471` - // Estimated: `5300` - // Minimum execution time: 23_203 nanoseconds. - Weight::from_parts(23_490_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `407` + // Estimated: `7280` + // Minimum execution time: 26_563_000 picoseconds. + Weight::from_parts(26_733_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -363,11 +367,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn force_asset_status() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `2685` - // Minimum execution time: 12_042 nanoseconds. - Weight::from_parts(12_246_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `243` + // Estimated: `3675` + // Minimum execution time: 13_948_000 picoseconds. + Weight::from_parts(14_330_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -377,11 +381,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) fn approve_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `5308` - // Minimum execution time: 25_898 nanoseconds. - Weight::from_parts(26_128_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) + // Measured: `277` + // Estimated: `7288` + // Minimum execution time: 30_307_000 picoseconds. + Weight::from_parts(30_677_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -395,11 +399,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_approved() -> Weight { // Proof Size summary in bytes: - // Measured: `553` - // Estimated: `13065` - // Minimum execution time: 52_087 nanoseconds. - Weight::from_parts(52_630_000, 0) - .saturating_add(Weight::from_parts(0, 13065)) + // Measured: `521` + // Estimated: `17025` + // Minimum execution time: 59_228_000 picoseconds. + Weight::from_parts(59_702_000, 0) + .saturating_add(Weight::from_parts(0, 17025)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -409,11 +413,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) fn cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `479` - // Estimated: `5308` - // Minimum execution time: 27_731 nanoseconds. - Weight::from_parts(28_129_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) + // Measured: `447` + // Estimated: `7288` + // Minimum execution time: 31_228_000 picoseconds. + Weight::from_parts(31_564_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -423,11 +427,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) fn force_cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `479` - // Estimated: `5308` - // Minimum execution time: 27_921 nanoseconds. - Weight::from_parts(28_386_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) + // Measured: `447` + // Estimated: `7288` + // Minimum execution time: 32_931_000 picoseconds. + Weight::from_parts(33_406_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -435,12 +439,12 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn set_min_balance() -> Weight { // Proof Size summary in bytes: - // Measured: `383` + // Measured: `243` // Estimated: `3675` - // Minimum execution time: 16_213 nanoseconds. - Weight::from_parts(16_575_000, 0) + // Minimum execution time: 15_084_000 picoseconds. + Weight::from_parts(15_358_000, 0) .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs index a80ebe75bc5..e81c1925649 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -51,11 +51,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_allow_death() -> Weight { // Proof Size summary in bytes: - // Measured: `1178` - // Estimated: `2603` - // Minimum execution time: 45_943 nanoseconds. - Weight::from_parts(46_894_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 35_757_000 picoseconds. + Weight::from_parts(36_417_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -63,11 +63,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: - // Measured: `1062` - // Estimated: `2603` - // Minimum execution time: 35_842 nanoseconds. - Weight::from_parts(36_089_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 27_074_000 picoseconds. + Weight::from_parts(27_335_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -75,11 +75,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_creating() -> Weight { // Proof Size summary in bytes: - // Measured: `1174` - // Estimated: `2603` - // Minimum execution time: 26_219 nanoseconds. - Weight::from_parts(26_783_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 16_753_000 picoseconds. + Weight::from_parts(17_141_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -87,11 +87,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_killing() -> Weight { // Proof Size summary in bytes: - // Measured: `1174` - // Estimated: `2603` - // Minimum execution time: 29_939 nanoseconds. - Weight::from_parts(30_394_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 20_459_000 picoseconds. + Weight::from_parts(20_848_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -99,11 +99,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `1174` - // Estimated: `5206` - // Minimum execution time: 46_341 nanoseconds. - Weight::from_parts(47_111_000, 0) - .saturating_add(Weight::from_parts(0, 5206)) + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 41_036_000 picoseconds. + Weight::from_parts(41_265_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -111,11 +111,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_all() -> Weight { // Proof Size summary in bytes: - // Measured: `1062` - // Estimated: `2603` - // Minimum execution time: 41_093 nanoseconds. - Weight::from_parts(41_472_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 35_925_000 picoseconds. + Weight::from_parts(36_511_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -126,11 +126,11 @@ impl pallet_balances::WeightInfo for WeightInfo { } fn force_unreserve() -> Weight { // Proof Size summary in bytes: - // Measured: `1058` - // Estimated: `2603` - // Minimum execution time: 22_961 nanoseconds. - Weight::from_parts(23_413_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 16_377_000 picoseconds. + Weight::from_parts(16_722_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs index c7b4bcfa771..e86fa5544d0 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -55,12 +55,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn set_invulnerables(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` - // Estimated: `178 + b * (2554 ±0)` - // Minimum execution time: 14_182 nanoseconds. - Weight::from_parts(16_174_028, 0) - .saturating_add(Weight::from_parts(0, 178)) - // Standard Error: 3_951 - .saturating_add(Weight::from_parts(2_446_152, 0).saturating_mul(b.into())) + // Estimated: `1168 + b * (2554 ±0)` + // Minimum execution time: 15_372_000 picoseconds. + Weight::from_parts(16_916_596, 0) + .saturating_add(Weight::from_parts(0, 1168)) + // Standard Error: 3_537 + .saturating_add(Weight::from_parts(2_583_561, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +71,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_843 nanoseconds. - Weight::from_parts(7_086_000, 0) + // Minimum execution time: 7_637_000 picoseconds. + Weight::from_parts(7_821_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +82,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_075 nanoseconds. - Weight::from_parts(7_294_000, 0) + // Minimum execution time: 7_838_000 picoseconds. + Weight::from_parts(8_092_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,13 +102,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 999]`. fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1171 + c * (48 ±0)` - // Estimated: `56784 + c * (49 ±0)` - // Minimum execution time: 34_101 nanoseconds. - Weight::from_parts(27_254_778, 0) - .saturating_add(Weight::from_parts(0, 56784)) - // Standard Error: 1_210 - .saturating_add(Weight::from_parts(105_038, 0).saturating_mul(c.into())) + // Measured: `1108 + c * (48 ±0)` + // Estimated: `61671 + c * (49 ±0)` + // Minimum execution time: 37_630_000 picoseconds. + Weight::from_parts(30_551_625, 0) + .saturating_add(Weight::from_parts(0, 61671)) + // Standard Error: 1_282 + .saturating_add(Weight::from_parts(112_510, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -120,13 +120,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[6, 1000]`. fn leave_intent(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `536 + c * (48 ±0)` - // Estimated: `48497` - // Minimum execution time: 26_156 nanoseconds. - Weight::from_parts(16_543_802, 0) - .saturating_add(Weight::from_parts(0, 48497)) - // Standard Error: 1_209 - .saturating_add(Weight::from_parts(102_889, 0).saturating_mul(c.into())) + // Measured: `452 + c * (48 ±0)` + // Estimated: `49487` + // Minimum execution time: 29_525_000 picoseconds. + Weight::from_parts(19_433_082, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_290 + .saturating_add(Weight::from_parts(108_444, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -138,11 +138,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) fn note_author() -> Weight { // Proof Size summary in bytes: - // Measured: `135` - // Estimated: `5749` - // Minimum execution time: 24_859 nanoseconds. - Weight::from_parts(25_423_000, 0) - .saturating_add(Weight::from_parts(0, 5749)) + // Measured: `103` + // Estimated: `7729` + // Minimum execution time: 29_428_000 picoseconds. + Weight::from_parts(29_752_000, 0) + .saturating_add(Weight::from_parts(0, 7729)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +160,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22784 + r * (148 ±0) + c * (97 ±0)` - // Estimated: `52737 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 16_296 nanoseconds. - Weight::from_parts(16_532_000, 0) - .saturating_add(Weight::from_parts(0, 52737)) - // Standard Error: 758_486 - .saturating_add(Weight::from_parts(27_694_526, 0).saturating_mul(c.into())) + // Measured: `22721 + r * (116 ±0) + c * (97 ±0)` + // Estimated: `56697 + r * (2602 ±0) + c * (2520 ±0)` + // Minimum execution time: 17_105_000 picoseconds. + Weight::from_parts(17_304_000, 0) + .saturating_add(Weight::from_parts(0, 56697)) + // Standard Error: 839_957 + .saturating_add(Weight::from_parts(30_183_103, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs index a5a5fb3b121..2a93d9e41c2 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -52,11 +52,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_557 nanoseconds. - Weight::from_parts(12_087_731, 0) + // Minimum execution time: 12_445_000 picoseconds. + Weight::from_parts(12_887_726, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 1 - .saturating_add(Weight::from_parts(493, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(608, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -64,15 +64,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `311 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 35_027 nanoseconds. - Weight::from_parts(28_254_579, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 541 - .saturating_add(Weight::from_parts(73_609, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_530, 0).saturating_mul(z.into())) + // Measured: `262 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 38_178_000 picoseconds. + Weight::from_parts(31_903_342, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 743 + .saturating_add(Weight::from_parts(67_484, 0).saturating_mul(s.into())) + // Standard Error: 7 + .saturating_add(Weight::from_parts(1_353, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,15 +82,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_approve(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 25_892 nanoseconds. - Weight::from_parts(19_974_491, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 382 - .saturating_add(Weight::from_parts(67_041, 0).saturating_mul(s.into())) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_516, 0).saturating_mul(z.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 28_095_000 picoseconds. + Weight::from_parts(22_610_540, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 571 + .saturating_add(Weight::from_parts(59_325, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_310, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,15 +102,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `448 + s * (33 ±0)` - // Estimated: `8424` - // Minimum execution time: 39_799 nanoseconds. - Weight::from_parts(31_172_141, 0) - .saturating_add(Weight::from_parts(0, 8424)) - // Standard Error: 523 - .saturating_add(Weight::from_parts(91_287, 0).saturating_mul(s.into())) + // Measured: `385 + s * (33 ±0)` + // Estimated: `10404` + // Minimum execution time: 43_571_000 picoseconds. + Weight::from_parts(35_747_616, 0) + .saturating_add(Weight::from_parts(0, 10404)) + // Standard Error: 555 + .saturating_add(Weight::from_parts(86_297, 0).saturating_mul(s.into())) // Standard Error: 5 - .saturating_add(Weight::from_parts(1_557, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_333, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -119,13 +119,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `318 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 24_614 nanoseconds. - Weight::from_parts(26_554_159, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 754 - .saturating_add(Weight::from_parts(81_278, 0).saturating_mul(s.into())) + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 29_122_000 picoseconds. + Weight::from_parts(30_681_183, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 787 + .saturating_add(Weight::from_parts(69_464, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -134,13 +134,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 17_141 nanoseconds. - Weight::from_parts(18_191_699, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 546 - .saturating_add(Weight::from_parts(74_486, 0).saturating_mul(s.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 19_219_000 picoseconds. + Weight::from_parts(20_598_069, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 572 + .saturating_add(Weight::from_parts(66_940, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -149,13 +149,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `517 + s * (1 ±0)` - // Estimated: `5821` - // Minimum execution time: 25_869 nanoseconds. - Weight::from_parts(28_059_249, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 677 - .saturating_add(Weight::from_parts(80_187, 0).saturating_mul(s.into())) + // Measured: `454 + s * (1 ±0)` + // Estimated: `6811` + // Minimum execution time: 29_859_000 picoseconds. + Weight::from_parts(31_610_947, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 739 + .saturating_add(Weight::from_parts(70_349, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs index b160090e259..1471920ba2f 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -52,13 +52,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 14_405 nanoseconds. - Weight::from_parts(15_511_983, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 2_104 - .saturating_add(Weight::from_parts(19_450, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 17_484_000 picoseconds. + Weight::from_parts(17_998_669, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_091 + .saturating_add(Weight::from_parts(33_441, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -71,15 +71,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn proxy_announced(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `550 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `11027` - // Minimum execution time: 31_545 nanoseconds. - Weight::from_parts(31_928_375, 0) - .saturating_add(Weight::from_parts(0, 11027)) - // Standard Error: 2_022 - .saturating_add(Weight::from_parts(114_479, 0).saturating_mul(a.into())) - // Standard Error: 2_089 - .saturating_add(Weight::from_parts(34_696, 0).saturating_mul(p.into())) + // Measured: `454 + a * (68 ±0) + p * (37 ±0)` + // Estimated: `13997` + // Minimum execution time: 35_828_000 picoseconds. + Weight::from_parts(36_241_110, 0) + .saturating_add(Weight::from_parts(0, 13997)) + // Standard Error: 2_219 + .saturating_add(Weight::from_parts(156_309, 0).saturating_mul(a.into())) + // Standard Error: 2_292 + .saturating_add(Weight::from_parts(32_167, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -91,15 +91,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `433 + a * (68 ±0)` - // Estimated: `7311` - // Minimum execution time: 20_215 nanoseconds. - Weight::from_parts(20_970_496, 0) - .saturating_add(Weight::from_parts(0, 7311)) - // Standard Error: 1_277 - .saturating_add(Weight::from_parts(111_015, 0).saturating_mul(a.into())) - // Standard Error: 1_320 - .saturating_add(Weight::from_parts(9_988, 0).saturating_mul(p.into())) + // Measured: `369 + a * (68 ±0)` + // Estimated: `9291` + // Minimum execution time: 22_512_000 picoseconds. + Weight::from_parts(23_254_777, 0) + .saturating_add(Weight::from_parts(0, 9291)) + // Standard Error: 1_318 + .saturating_add(Weight::from_parts(148_302, 0).saturating_mul(a.into())) + // Standard Error: 1_362 + .saturating_add(Weight::from_parts(13_945, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -111,15 +111,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn reject_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `433 + a * (68 ±0)` - // Estimated: `7311` - // Minimum execution time: 20_153 nanoseconds. - Weight::from_parts(21_046_064, 0) - .saturating_add(Weight::from_parts(0, 7311)) - // Standard Error: 1_342 - .saturating_add(Weight::from_parts(108_638, 0).saturating_mul(a.into())) - // Standard Error: 1_386 - .saturating_add(Weight::from_parts(10_617, 0).saturating_mul(p.into())) + // Measured: `369 + a * (68 ±0)` + // Estimated: `9291` + // Minimum execution time: 22_528_000 picoseconds. + Weight::from_parts(23_510_728, 0) + .saturating_add(Weight::from_parts(0, 9291)) + // Standard Error: 1_393 + .saturating_add(Weight::from_parts(143_817, 0).saturating_mul(a.into())) + // Standard Error: 1_439 + .saturating_add(Weight::from_parts(9_334, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -133,15 +133,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn announce(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `482 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `11027` - // Minimum execution time: 27_692 nanoseconds. - Weight::from_parts(28_900_223, 0) - .saturating_add(Weight::from_parts(0, 11027)) - // Standard Error: 1_751 - .saturating_add(Weight::from_parts(100_648, 0).saturating_mul(a.into())) - // Standard Error: 1_809 - .saturating_add(Weight::from_parts(35_769, 0).saturating_mul(p.into())) + // Measured: `386 + a * (68 ±0) + p * (37 ±0)` + // Estimated: `13997` + // Minimum execution time: 31_233_000 picoseconds. + Weight::from_parts(32_142_917, 0) + .saturating_add(Weight::from_parts(0, 13997)) + // Standard Error: 1_888 + .saturating_add(Weight::from_parts(142_949, 0).saturating_mul(a.into())) + // Standard Error: 1_951 + .saturating_add(Weight::from_parts(46_737, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -150,13 +150,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn add_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 20_726 nanoseconds. - Weight::from_parts(21_849_126, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_307 - .saturating_add(Weight::from_parts(43_349, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 24_085_000 picoseconds. + Weight::from_parts(25_032_056, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_758 + .saturating_add(Weight::from_parts(52_203, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -165,13 +165,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 20_681 nanoseconds. - Weight::from_parts(21_733_251, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_555 - .saturating_add(Weight::from_parts(59_461, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 23_678_000 picoseconds. + Weight::from_parts(24_981_101, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_874 + .saturating_add(Weight::from_parts(73_774, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -180,13 +180,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_proxies(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 16_966 nanoseconds. - Weight::from_parts(17_682_078, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_110 - .saturating_add(Weight::from_parts(28_786, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 19_119_000 picoseconds. + Weight::from_parts(19_982_142, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_174 + .saturating_add(Weight::from_parts(26_182, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -196,12 +196,12 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn create_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `139` - // Estimated: `3716` - // Minimum execution time: 22_237 nanoseconds. - Weight::from_parts(23_324_695, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_481 - .saturating_add(Weight::from_parts(9_284, 0).saturating_mul(p.into())) + // Estimated: `4706` + // Minimum execution time: 26_077_000 picoseconds. + Weight::from_parts(27_130_205, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_539 + .saturating_add(Weight::from_parts(1_625, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -210,13 +210,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[0, 30]`. fn kill_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `196 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 18_041 nanoseconds. - Weight::from_parts(18_668_925, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_209 - .saturating_add(Weight::from_parts(29_794, 0).saturating_mul(p.into())) + // Measured: `164 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 20_178_000 picoseconds. + Weight::from_parts(21_090_914, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_488 + .saturating_add(Weight::from_parts(36_285, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_session.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_session.rs index 9ed257e1e80..87458dcd84b 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_session.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -54,10 +54,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `270` - // Estimated: `5490` - // Minimum execution time: 15_561 nanoseconds. - Weight::from_parts(15_843_000, 0) - .saturating_add(Weight::from_parts(0, 5490)) + // Estimated: `7470` + // Minimum execution time: 17_008_000 picoseconds. + Weight::from_parts(17_288_000, 0) + .saturating_add(Weight::from_parts(0, 7470)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +68,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `242` - // Estimated: `2959` - // Minimum execution time: 11_757 nanoseconds. - Weight::from_parts(12_093_000, 0) - .saturating_add(Weight::from_parts(0, 2959)) + // Estimated: `3949` + // Minimum execution time: 13_427_000 picoseconds. + Weight::from_parts(13_609_000, 0) + .saturating_add(Weight::from_parts(0, 3949)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs index b076a1b4d1e..75d47ae1fd6 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -54,10 +54,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `86` - // Estimated: `1006` - // Minimum execution time: 8_399 nanoseconds. - Weight::from_parts(8_649_000, 0) - .saturating_add(Weight::from_parts(0, 1006)) + // Estimated: `2986` + // Minimum execution time: 9_174_000 picoseconds. + Weight::from_parts(9_644_000, 0) + .saturating_add(Weight::from_parts(0, 2986)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_277 nanoseconds. - Weight::from_parts(3_349_000, 0) + // Minimum execution time: 3_121_000 picoseconds. + Weight::from_parts(3_205_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs index d69f456dc24..1c33a12ab3d 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_uniques` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn create() -> Weight { // Proof Size summary in bytes: - // Measured: `177` - // Estimated: `2653` - // Minimum execution time: 23_738 nanoseconds. - Weight::from_parts(24_550_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `145` + // Estimated: `3643` + // Minimum execution time: 26_653_000 picoseconds. + Weight::from_parts(27_024_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +68,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `2653` - // Minimum execution time: 13_165 nanoseconds. - Weight::from_parts(13_515_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Estimated: `3643` + // Minimum execution time: 15_168_000 picoseconds. + Weight::from_parts(15_535_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -79,14 +79,14 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) /// Storage: Uniques Asset (r:1001 w:1000) /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) + /// Storage: Uniques InstanceMetadataOf (r:1000 w:1000) + /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) + /// Storage: Uniques Attribute (r:1000 w:1000) + /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) /// Storage: Uniques ClassAccount (r:0 w:1) /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) - /// Storage: Uniques Attribute (r:0 w:1000) - /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) /// Storage: Uniques ClassMetadataOf (r:0 w:1) /// Proof: Uniques ClassMetadataOf (max_values: None, max_size: Some(167), added: 2642, mode: MaxEncodedLen) - /// Storage: Uniques InstanceMetadataOf (r:0 w:1000) - /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) /// Storage: Uniques Account (r:0 w:1000) /// Proof: Uniques Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Uniques CollectionMaxSupply (r:0 w:1) @@ -96,24 +96,28 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// The range of component `a` is `[0, 1000]`. fn destroy(n: u32, m: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `289 + n * (108 ±0) + m * (56 ±0) + a * (107 ±0)` - // Estimated: `5250 + n * (2597 ±0)` - // Minimum execution time: 2_258_129 nanoseconds. - Weight::from_parts(2_289_592_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) - // Standard Error: 26_214 - .saturating_add(Weight::from_parts(8_416_144, 0).saturating_mul(n.into())) - // Standard Error: 26_214 - .saturating_add(Weight::from_parts(256_638, 0).saturating_mul(m.into())) - // Standard Error: 26_214 - .saturating_add(Weight::from_parts(274_803, 0).saturating_mul(a.into())) + // Measured: `257 + n * (76 ±0) + m * (56 ±0) + a * (107 ±0)` + // Estimated: `9210 + n * (2597 ±0) + m * (2662 ±0) + a * (2647 ±0)` + // Minimum execution time: 2_365_108_000 picoseconds. + Weight::from_parts(2_380_000_000, 0) + .saturating_add(Weight::from_parts(0, 9210)) + // Standard Error: 24_588 + .saturating_add(Weight::from_parts(6_339_196, 0).saturating_mul(n.into())) + // Standard Error: 24_588 + .saturating_add(Weight::from_parts(265_876, 0).saturating_mul(m.into())) + // Standard Error: 24_588 + .saturating_add(Weight::from_parts(316_327, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(4)) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 2647).saturating_mul(a.into())) } /// Storage: Uniques Asset (r:1 w:1) /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) @@ -125,11 +129,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn mint() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `7749` - // Minimum execution time: 28_974 nanoseconds. - Weight::from_parts(29_398_000, 0) - .saturating_add(Weight::from_parts(0, 7749)) + // Measured: `282` + // Estimated: `10719` + // Minimum execution time: 32_891_000 picoseconds. + Weight::from_parts(33_169_000, 0) + .saturating_add(Weight::from_parts(0, 10719)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -143,11 +147,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn burn() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 30_070 nanoseconds. - Weight::from_parts(30_454_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 33_895_000 picoseconds. + Weight::from_parts(34_205_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -161,11 +165,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 24_287 nanoseconds. - Weight::from_parts(24_509_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 27_841_000 picoseconds. + Weight::from_parts(28_213_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -176,13 +180,13 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// The range of component `i` is `[0, 5000]`. fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `770 + i * (108 ±0)` - // Estimated: `2653 + i * (2597 ±0)` - // Minimum execution time: 14_231 nanoseconds. - Weight::from_parts(14_454_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) - // Standard Error: 13_135 - .saturating_add(Weight::from_parts(12_152_067, 0).saturating_mul(i.into())) + // Measured: `738 + i * (76 ±0)` + // Estimated: `4633 + i * (2597 ±0)` + // Minimum execution time: 16_054_000 picoseconds. + Weight::from_parts(16_331_000, 0) + .saturating_add(Weight::from_parts(0, 4633)) + // Standard Error: 12_166 + .saturating_add(Weight::from_parts(13_413_428, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -195,11 +199,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn freeze() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 17_977 nanoseconds. - Weight::from_parts(18_415_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 19_419_000 picoseconds. + Weight::from_parts(19_724_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -209,11 +213,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn thaw() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 17_421 nanoseconds. - Weight::from_parts(17_830_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 20_053_000 picoseconds. + Weight::from_parts(23_080_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -221,11 +225,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn freeze_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 13_199 nanoseconds. - Weight::from_parts(13_615_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 15_569_000 picoseconds. + Weight::from_parts(16_658_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -233,11 +237,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn thaw_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 13_263 nanoseconds. - Weight::from_parts(13_575_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 15_350_000 picoseconds. + Weight::from_parts(15_771_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -249,11 +253,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `5180` - // Minimum execution time: 20_850 nanoseconds. - Weight::from_parts(21_223_000, 0) - .saturating_add(Weight::from_parts(0, 5180)) + // Measured: `356` + // Estimated: `7160` + // Minimum execution time: 23_564_000 picoseconds. + Weight::from_parts(24_005_000, 0) + .saturating_add(Weight::from_parts(0, 7160)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -261,11 +265,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn set_team() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 14_218 nanoseconds. - Weight::from_parts(14_680_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 16_165_000 picoseconds. + Weight::from_parts(16_482_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -275,11 +279,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn force_item_status() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 16_581 nanoseconds. - Weight::from_parts(16_856_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 18_377_000 picoseconds. + Weight::from_parts(19_060_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -291,11 +295,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) fn set_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `623` - // Estimated: `7962` - // Minimum execution time: 34_610 nanoseconds. - Weight::from_parts(34_994_000, 0) - .saturating_add(Weight::from_parts(0, 7962)) + // Measured: `559` + // Estimated: `10932` + // Minimum execution time: 39_403_000 picoseconds. + Weight::from_parts(39_925_000, 0) + .saturating_add(Weight::from_parts(0, 10932)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -307,11 +311,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) fn clear_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `851` - // Estimated: `7962` - // Minimum execution time: 34_244 nanoseconds. - Weight::from_parts(34_542_000, 0) - .saturating_add(Weight::from_parts(0, 7962)) + // Measured: `756` + // Estimated: `10932` + // Minimum execution time: 36_786_000 picoseconds. + Weight::from_parts(37_558_000, 0) + .saturating_add(Weight::from_parts(0, 10932)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -321,11 +325,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) fn set_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `380` - // Estimated: `5315` - // Minimum execution time: 26_652 nanoseconds. - Weight::from_parts(27_013_000, 0) - .saturating_add(Weight::from_parts(0, 5315)) + // Measured: `348` + // Estimated: `7295` + // Minimum execution time: 30_327_000 picoseconds. + Weight::from_parts(30_769_000, 0) + .saturating_add(Weight::from_parts(0, 7295)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -335,11 +339,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `623` - // Estimated: `5315` - // Minimum execution time: 27_427 nanoseconds. - Weight::from_parts(27_985_000, 0) - .saturating_add(Weight::from_parts(0, 5315)) + // Measured: `559` + // Estimated: `7295` + // Minimum execution time: 29_756_000 picoseconds. + Weight::from_parts(31_077_000, 0) + .saturating_add(Weight::from_parts(0, 7295)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -349,11 +353,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassMetadataOf (max_values: None, max_size: Some(167), added: 2642, mode: MaxEncodedLen) fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `5295` - // Minimum execution time: 26_557 nanoseconds. - Weight::from_parts(26_973_000, 0) - .saturating_add(Weight::from_parts(0, 5295)) + // Measured: `282` + // Estimated: `7275` + // Minimum execution time: 29_811_000 picoseconds. + Weight::from_parts(30_220_000, 0) + .saturating_add(Weight::from_parts(0, 7275)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -363,11 +367,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassMetadataOf (max_values: None, max_size: Some(167), added: 2642, mode: MaxEncodedLen) fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `537` - // Estimated: `5295` - // Minimum execution time: 25_091 nanoseconds. - Weight::from_parts(25_510_000, 0) - .saturating_add(Weight::from_parts(0, 5295)) + // Measured: `473` + // Estimated: `7275` + // Minimum execution time: 27_708_000 picoseconds. + Weight::from_parts(28_309_000, 0) + .saturating_add(Weight::from_parts(0, 7275)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -377,11 +381,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) fn approve_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 19_129 nanoseconds. - Weight::from_parts(19_831_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 21_525_000 picoseconds. + Weight::from_parts(21_784_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -391,11 +395,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) fn cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `525` - // Estimated: `5250` - // Minimum execution time: 19_393 nanoseconds. - Weight::from_parts(19_569_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `461` + // Estimated: `7230` + // Minimum execution time: 21_605_000 picoseconds. + Weight::from_parts(21_805_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -404,10 +408,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_accept_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `2527` - // Minimum execution time: 14_863 nanoseconds. - Weight::from_parts(15_066_000, 0) - .saturating_add(Weight::from_parts(0, 2527)) + // Estimated: `3517` + // Minimum execution time: 17_046_000 picoseconds. + Weight::from_parts(17_387_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -417,11 +421,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `5152` - // Minimum execution time: 16_144 nanoseconds. - Weight::from_parts(16_510_000, 0) - .saturating_add(Weight::from_parts(0, 5152)) + // Measured: `282` + // Estimated: `7132` + // Minimum execution time: 18_453_000 picoseconds. + Weight::from_parts(18_716_000, 0) + .saturating_add(Weight::from_parts(0, 7132)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -431,11 +435,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn set_price() -> Weight { // Proof Size summary in bytes: - // Measured: `291` - // Estimated: `2597` - // Minimum execution time: 15_884 nanoseconds. - Weight::from_parts(16_215_000, 0) - .saturating_add(Weight::from_parts(0, 2597)) + // Measured: `259` + // Estimated: `3587` + // Minimum execution time: 17_965_000 picoseconds. + Weight::from_parts(18_347_000, 0) + .saturating_add(Weight::from_parts(0, 3587)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -449,11 +453,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn buy_item() -> Weight { // Proof Size summary in bytes: - // Measured: `636` - // Estimated: `7814` - // Minimum execution time: 34_190 nanoseconds. - Weight::from_parts(34_497_000, 0) - .saturating_add(Weight::from_parts(0, 7814)) + // Measured: `540` + // Estimated: `10784` + // Minimum execution time: 38_974_000 picoseconds. + Weight::from_parts(39_420_000, 0) + .saturating_add(Weight::from_parts(0, 10784)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs index af28e0cec58..d14fdba6fad 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -52,18 +52,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_005 nanoseconds. - Weight::from_parts(18_139_015, 0) + // Minimum execution time: 7_357_000 picoseconds. + Weight::from_parts(16_071_177, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_178 - .saturating_add(Weight::from_parts(3_979_226, 0).saturating_mul(c.into())) + // Standard Error: 3_492 + .saturating_add(Weight::from_parts(5_041_311, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_441 nanoseconds. - Weight::from_parts(4_622_000, 0) + // Minimum execution time: 5_903_000 picoseconds. + Weight::from_parts(6_075_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +71,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_910 nanoseconds. - Weight::from_parts(18_908_357, 0) + // Minimum execution time: 7_616_000 picoseconds. + Weight::from_parts(17_676_240, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_920 - .saturating_add(Weight::from_parts(4_169_103, 0).saturating_mul(c.into())) + // Standard Error: 2_274 + .saturating_add(Weight::from_parts(5_358_895, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_957 nanoseconds. - Weight::from_parts(8_145_000, 0) + // Minimum execution time: 10_072_000 picoseconds. + Weight::from_parts(10_405_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +90,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_925 nanoseconds. - Weight::from_parts(15_056_349, 0) + // Minimum execution time: 7_207_000 picoseconds. + Weight::from_parts(18_974_639, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_987 - .saturating_add(Weight::from_parts(3_981_287, 0).saturating_mul(c.into())) + // Standard Error: 2_301 + .saturating_add(Weight::from_parts(5_025_161, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs index 70782f0e2c7..26e19764b8a 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -60,10 +60,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `4645` - // Minimum execution time: 24_132 nanoseconds. - Weight::from_parts(24_554_000, 0) - .saturating_add(Weight::from_parts(0, 4645)) + // Estimated: `9595` + // Minimum execution time: 27_505_000 picoseconds. + Weight::from_parts(27_841_000, 0) + .saturating_add(Weight::from_parts(0, 9595)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -72,10 +72,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn teleport_assets() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `499` - // Minimum execution time: 22_350 nanoseconds. - Weight::from_parts(22_760_000, 0) - .saturating_add(Weight::from_parts(0, 499)) + // Estimated: `1489` + // Minimum execution time: 27_156_000 picoseconds. + Weight::from_parts(27_641_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: ParachainInfo ParachainId (r:1 w:0) @@ -83,10 +83,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn reserve_transfer_assets() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `499` - // Minimum execution time: 17_723 nanoseconds. - Weight::from_parts(17_951_000, 0) - .saturating_add(Weight::from_parts(0, 499)) + // Estimated: `1489` + // Minimum execution time: 20_954_000 picoseconds. + Weight::from_parts(21_381_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Benchmark Override (r:0 w:0) @@ -95,7 +95,7 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551 nanoseconds. + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } @@ -105,8 +105,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_641 nanoseconds. - Weight::from_parts(8_925_000, 0) + // Minimum execution time: 10_560_000 picoseconds. + Weight::from_parts(10_752_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -116,8 +116,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_427 nanoseconds. - Weight::from_parts(2_598_000, 0) + // Minimum execution time: 3_451_000 picoseconds. + Weight::from_parts(3_580_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -140,10 +140,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `7729` - // Minimum execution time: 28_650 nanoseconds. - Weight::from_parts(29_035_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `14659` + // Minimum execution time: 33_607_000 picoseconds. + Weight::from_parts(33_917_000, 0) + .saturating_add(Weight::from_parts(0, 14659)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -164,10 +164,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `220` - // Estimated: `8470` - // Minimum execution time: 30_797 nanoseconds. - Weight::from_parts(31_491_000, 0) - .saturating_add(Weight::from_parts(0, 8470)) + // Estimated: `14410` + // Minimum execution time: 35_300_000 picoseconds. + Weight::from_parts(35_783_000, 0) + .saturating_add(Weight::from_parts(0, 14410)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -176,10 +176,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: // Measured: `95` - // Estimated: `9995` - // Minimum execution time: 13_639 nanoseconds. - Weight::from_parts(13_980_000, 0) - .saturating_add(Weight::from_parts(0, 9995)) + // Estimated: `10985` + // Minimum execution time: 15_664_000 picoseconds. + Weight::from_parts(15_908_000, 0) + .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -188,10 +188,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: // Measured: `99` - // Estimated: `9999` - // Minimum execution time: 13_954 nanoseconds. - Weight::from_parts(14_276_000, 0) - .saturating_add(Weight::from_parts(0, 9999)) + // Estimated: `10989` + // Minimum execution time: 15_376_000 picoseconds. + Weight::from_parts(15_780_000, 0) + .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -200,10 +200,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `12481` - // Minimum execution time: 15_217 nanoseconds. - Weight::from_parts(15_422_000, 0) - .saturating_add(Weight::from_parts(0, 12481)) + // Estimated: `13471` + // Minimum execution time: 15_898_000 picoseconds. + Weight::from_parts(16_159_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) @@ -221,10 +221,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `10041` - // Minimum execution time: 27_362 nanoseconds. - Weight::from_parts(28_034_000, 0) - .saturating_add(Weight::from_parts(0, 10041)) + // Estimated: `15981` + // Minimum execution time: 31_267_000 picoseconds. + Weight::from_parts(31_635_000, 0) + .saturating_add(Weight::from_parts(0, 15981)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -233,10 +233,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `136` - // Estimated: `7561` - // Minimum execution time: 7_768 nanoseconds. - Weight::from_parts(7_890_000, 0) - .saturating_add(Weight::from_parts(0, 7561)) + // Estimated: `8551` + // Minimum execution time: 8_659_000 picoseconds. + Weight::from_parts(8_983_000, 0) + .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) @@ -244,10 +244,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `10006` - // Minimum execution time: 15_165 nanoseconds. - Weight::from_parts(15_430_000, 0) - .saturating_add(Weight::from_parts(0, 10006)) + // Estimated: `10996` + // Minimum execution time: 16_025_000 picoseconds. + Weight::from_parts(16_296_000, 0) + .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -266,10 +266,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `112` - // Estimated: `15027` - // Minimum execution time: 35_310 nanoseconds. - Weight::from_parts(35_698_000, 0) - .saturating_add(Weight::from_parts(0, 15027)) + // Estimated: `20967` + // Minimum execution time: 37_654_000 picoseconds. + Weight::from_parts(38_144_000, 0) + .saturating_add(Weight::from_parts(0, 20967)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 43de2f7f064..147a348b19d 100644 --- a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,27 +17,26 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./templates/xcm-bench-template.hbs +// --chain=statemint-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::fungible -// --chain=statemint-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/assets/statemint/src/weights/xcm/ +// --output=./parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -55,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 22_450_000 picoseconds. - Weight::from_parts(22_821_000, 3593) + // Minimum execution time: 23_489_000 picoseconds. + Weight::from_parts(23_993_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -66,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 32_079_000 picoseconds. - Weight::from_parts(32_591_000, 6196) + // Minimum execution time: 32_933_000 picoseconds. + Weight::from_parts(33_445_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -89,8 +88,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `139` // Estimated: `17785` - // Minimum execution time: 53_770_000 picoseconds. - Weight::from_parts(54_393_000, 17785) + // Minimum execution time: 56_285_000 picoseconds. + Weight::from_parts(56_858_000, 17785) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -98,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_485_000 picoseconds. - Weight::from_parts(4_650_000, 0) + // Minimum execution time: 4_900_000 picoseconds. + Weight::from_parts(4_996_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -107,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 24_725_000 picoseconds. - Weight::from_parts(25_120_000, 3593) + // Minimum execution time: 26_047_000 picoseconds. + Weight::from_parts(26_408_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -130,8 +129,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `14677` - // Minimum execution time: 47_989_000 picoseconds. - Weight::from_parts(48_573_000, 14677) + // Minimum execution time: 48_997_000 picoseconds. + Weight::from_parts(49_605_000, 14677) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -151,8 +150,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `11084` - // Minimum execution time: 34_367_000 picoseconds. - Weight::from_parts(34_995_000, 11084) + // Minimum execution time: 31_114_000 picoseconds. + Weight::from_parts(31_825_000, 11084) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index dbae6ffe404..ca264e8fa17 100644 --- a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,27 +17,26 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./templates/xcm-bench-template.hbs +// --chain=statemint-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --chain=statemint-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/assets/statemint/src/weights/xcm/ +// --output=./parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -65,8 +64,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `11084` - // Minimum execution time: 365_653_000 picoseconds. - Weight::from_parts(368_340_000, 11084) + // Minimum execution time: 452_120_000 picoseconds. + Weight::from_parts(453_246_000, 11084) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -74,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_920_000 picoseconds. - Weight::from_parts(4_150_000, 0) + // Minimum execution time: 4_323_000 picoseconds. + Weight::from_parts(4_409_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -83,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 10_988_000 picoseconds. - Weight::from_parts(11_207_000, 3497) + // Minimum execution time: 12_046_000 picoseconds. + Weight::from_parts(12_316_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_509_000 picoseconds. - Weight::from_parts(13_775_000, 0) + // Minimum execution time: 14_603_000 picoseconds. + Weight::from_parts(14_929_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_497_000 picoseconds. - Weight::from_parts(7_580_000, 0) + // Minimum execution time: 4_461_000 picoseconds. + Weight::from_parts(4_655_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_971_000 picoseconds. - Weight::from_parts(3_086_000, 0) + // Minimum execution time: 3_400_000 picoseconds. + Weight::from_parts(3_487_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_937_000 picoseconds. - Weight::from_parts(3_081_000, 0) + // Minimum execution time: 3_337_000 picoseconds. + Weight::from_parts(3_403_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_960_000 picoseconds. - Weight::from_parts(3_073_000, 0) + // Minimum execution time: 3_259_000 picoseconds. + Weight::from_parts(3_350_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_879_000 picoseconds. - Weight::from_parts(4_040_000, 0) + // Minimum execution time: 4_292_000 picoseconds. + Weight::from_parts(4_471_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_965_000 picoseconds. - Weight::from_parts(3_062_000, 0) + // Minimum execution time: 3_281_000 picoseconds. + Weight::from_parts(3_329_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -152,8 +151,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `11084` - // Minimum execution time: 24_225_000 picoseconds. - Weight::from_parts(24_520_000, 11084) + // Minimum execution time: 26_054_000 picoseconds. + Weight::from_parts(26_386_000, 11084) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -163,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 14_899_000 picoseconds. - Weight::from_parts(15_205_000, 3555) + // Minimum execution time: 16_413_000 picoseconds. + Weight::from_parts(16_590_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -172,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_942_000 picoseconds. - Weight::from_parts(3_026_000, 0) + // Minimum execution time: 3_314_000 picoseconds. + Weight::from_parts(3_410_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -191,8 +190,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `13098` - // Minimum execution time: 26_636_000 picoseconds. - Weight::from_parts(27_027_000, 13098) + // Minimum execution time: 28_232_000 picoseconds. + Weight::from_parts(28_661_000, 13098) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -202,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_074_000 picoseconds. - Weight::from_parts(5_223_000, 0) + // Minimum execution time: 5_517_000 picoseconds. + Weight::from_parts(5_596_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -222,8 +221,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `11084` - // Minimum execution time: 414_125_000 picoseconds. - Weight::from_parts(456_357_000, 11084) + // Minimum execution time: 502_759_000 picoseconds. + Weight::from_parts(504_262_000, 11084) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -231,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 134_528_000 picoseconds. - Weight::from_parts(135_936_000, 0) + // Minimum execution time: 157_990_000 picoseconds. + Weight::from_parts(158_216_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_812_000 picoseconds. - Weight::from_parts(12_945_000, 0) + // Minimum execution time: 15_005_000 picoseconds. + Weight::from_parts(15_203_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_011_000 picoseconds. - Weight::from_parts(3_129_000, 0) + // Minimum execution time: 3_475_000 picoseconds. + Weight::from_parts(3_522_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_769_000 picoseconds. - Weight::from_parts(4_847_000, 0) + // Minimum execution time: 3_343_000 picoseconds. + Weight::from_parts(3_417_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_169_000 picoseconds. - Weight::from_parts(3_350_000, 0) + // Minimum execution time: 3_519_000 picoseconds. + Weight::from_parts(3_625_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -278,8 +277,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `11084` - // Minimum execution time: 27_621_000 picoseconds. - Weight::from_parts(28_085_000, 11084) + // Minimum execution time: 29_760_000 picoseconds. + Weight::from_parts(30_340_000, 11084) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -287,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_296_000 picoseconds. - Weight::from_parts(5_413_000, 0) + // Minimum execution time: 5_732_000 picoseconds. + Weight::from_parts(5_858_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -306,8 +305,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `11084` - // Minimum execution time: 24_309_000 picoseconds. - Weight::from_parts(24_673_000, 11084) + // Minimum execution time: 26_440_000 picoseconds. + Weight::from_parts(26_870_000, 11084) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -315,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_928_000 picoseconds. - Weight::from_parts(3_066_000, 0) + // Minimum execution time: 3_334_000 picoseconds. + Weight::from_parts(3_408_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_904_000 picoseconds. - Weight::from_parts(2_988_000, 0) + // Minimum execution time: 3_263_000 picoseconds. + Weight::from_parts(3_380_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_906_000 picoseconds. - Weight::from_parts(2_989_000, 0) + // Minimum execution time: 3_338_000 picoseconds. + Weight::from_parts(3_388_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_950_000 picoseconds. - Weight::from_parts(3_047_000, 0) + // Minimum execution time: 3_286_000 picoseconds. + Weight::from_parts(3_384_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_150_000 picoseconds. - Weight::from_parts(3_243_000, 0) + // Minimum execution time: 3_494_000 picoseconds. + Weight::from_parts(3_563_000, 0) } } diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 3614f03e7d9..079e6bd60ae 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1131,17 +1131,17 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor BuyExecution { fees: buy_execution_fee.clone().into(), weight_limit: Unlimited }, Transact { origin_kind: OriginKind::Xcm, - require_weight_at_most: Weight::from_parts(40_000_000_000, 6000), + require_weight_at_most: Weight::from_parts(40_000_000_000, 8000), call: foreign_asset_create.into(), }, Transact { origin_kind: OriginKind::SovereignAccount, - require_weight_at_most: Weight::from_parts(20_000_000_000, 6000), + require_weight_at_most: Weight::from_parts(20_000_000_000, 8000), call: foreign_asset_set_metadata.into(), }, Transact { origin_kind: OriginKind::SovereignAccount, - require_weight_at_most: Weight::from_parts(20_000_000_000, 6000), + require_weight_at_most: Weight::from_parts(20_000_000_000, 8000), call: foreign_asset_set_team.into(), }, ExpectTransactStatus(MaybeErrorCode::Success), @@ -1248,7 +1248,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor BuyExecution { fees: buy_execution_fee.clone().into(), weight_limit: Unlimited }, Transact { origin_kind: OriginKind::Xcm, - require_weight_at_most: Weight::from_parts(20_000_000_000, 6000), + require_weight_at_most: Weight::from_parts(20_000_000_000, 8000), call: foreign_asset_create.into(), }, ExpectTransactStatus(MaybeErrorCode::from(DispatchError::BadOrigin.encode())), diff --git a/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs index 9de1fa11fa8..b796e65485d 100644 --- a/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -52,10 +52,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_u32() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_844 nanoseconds. - Weight::from_parts(5_119_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_380_000 picoseconds. + Weight::from_parts(5_626_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -64,10 +64,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_weight() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 5_017 nanoseconds. - Weight::from_parts(5_231_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_537_000 picoseconds. + Weight::from_parts(5_744_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/frame_system.rs b/parachains/runtimes/assets/westmint/src/weights/frame_system.rs index 1dfc223ce3a..9f0e1e43f56 100644 --- a/parachains/runtimes/assets/westmint/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/westmint/src/weights/frame_system.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -52,8 +52,8 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_737 nanoseconds. - Weight::from_parts(1_780_000, 0) + // Minimum execution time: 2_150_000 picoseconds. + Weight::from_parts(2_242_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 .saturating_add(Weight::from_parts(368, 0).saturating_mul(b.into())) @@ -63,11 +63,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_941 nanoseconds. - Weight::from_parts(6_990_000, 0) + // Minimum execution time: 7_810_000 picoseconds. + Weight::from_parts(7_949_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_716, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_408, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -76,10 +76,10 @@ impl frame_system::WeightInfo for WeightInfo { fn set_heap_pages() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `495` - // Minimum execution time: 3_697 nanoseconds. - Weight::from_parts(3_855_000, 0) - .saturating_add(Weight::from_parts(0, 495)) + // Estimated: `1485` + // Minimum execution time: 4_446_000 picoseconds. + Weight::from_parts(4_769_000, 0) + .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -90,11 +90,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_957 nanoseconds. - Weight::from_parts(2_009_000, 0) + // Minimum execution time: 2_378_000 picoseconds. + Weight::from_parts(2_458_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_909 - .saturating_add(Weight::from_parts(577_980, 0).saturating_mul(i.into())) + // Standard Error: 1_873 + .saturating_add(Weight::from_parts(680_971, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +104,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_921 nanoseconds. - Weight::from_parts(1_983_000, 0) + // Minimum execution time: 2_389_000 picoseconds. + Weight::from_parts(2_433_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 841 - .saturating_add(Weight::from_parts(443_784, 0).saturating_mul(i.into())) + // Standard Error: 765 + .saturating_add(Weight::from_parts(502_307, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -118,11 +118,12 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `84 + p * (69 ±0)` // Estimated: `75 + p * (70 ±0)` - // Minimum execution time: 3_576 nanoseconds. - Weight::from_parts(3_661_000, 0) + // Minimum execution time: 4_077_000 picoseconds. + Weight::from_parts(4_196_000, 0) .saturating_add(Weight::from_parts(0, 75)) - // Standard Error: 919 - .saturating_add(Weight::from_parts(955_752, 0).saturating_mul(p.into())) + // Standard Error: 920 + .saturating_add(Weight::from_parts(1_004_901, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs index 999dfe456b1..f08633cd2ba 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_assets` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn create() -> Weight { // Proof Size summary in bytes: - // Measured: `141` - // Estimated: `5288` - // Minimum execution time: 22_825 nanoseconds. - Weight::from_parts(26_008_000, 0) - .saturating_add(Weight::from_parts(0, 5288)) + // Measured: `109` + // Estimated: `7268` + // Minimum execution time: 24_079_000 picoseconds. + Weight::from_parts(24_532_000, 0) + .saturating_add(Weight::from_parts(0, 7268)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -66,10 +66,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `6` - // Estimated: `2685` - // Minimum execution time: 10_898 nanoseconds. - Weight::from_parts(12_626_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Estimated: `3675` + // Minimum execution time: 11_873_000 picoseconds. + Weight::from_parts(12_062_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -77,11 +77,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn start_destroy() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `2685` - // Minimum execution time: 13_057 nanoseconds. - Weight::from_parts(13_932_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `277` + // Estimated: `3675` + // Minimum execution time: 14_393_000 picoseconds. + Weight::from_parts(14_598_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -94,13 +94,13 @@ impl pallet_assets::WeightInfo for WeightInfo { /// The range of component `c` is `[0, 1000]`. fn destroy_accounts(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + c * (240 ±0)` - // Estimated: `5262 + c * (5180 ±0)` - // Minimum execution time: 16_823 nanoseconds. - Weight::from_parts(31_002_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) - // Standard Error: 10_169 - .saturating_add(Weight::from_parts(13_922_578, 0).saturating_mul(c.into())) + // Measured: `0 + c * (208 ±0)` + // Estimated: `8232 + c * (5180 ±0)` + // Minimum execution time: 17_774_000 picoseconds. + Weight::from_parts(17_985_000, 0) + .saturating_add(Weight::from_parts(0, 8232)) + // Standard Error: 7_528 + .saturating_add(Weight::from_parts(12_132_350, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -114,13 +114,13 @@ impl pallet_assets::WeightInfo for WeightInfo { /// The range of component `a` is `[0, 1000]`. fn destroy_approvals(a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `446 + a * (86 ±0)` - // Estimated: `5308 + a * (2623 ±0)` - // Minimum execution time: 16_683 nanoseconds. - Weight::from_parts(16_754_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) - // Standard Error: 7_193 - .saturating_add(Weight::from_parts(13_722_963, 0).saturating_mul(a.into())) + // Measured: `414 + a * (86 ±0)` + // Estimated: `7288 + a * (2623 ±0)` + // Minimum execution time: 18_455_000 picoseconds. + Weight::from_parts(18_657_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) + // Standard Error: 4_725 + .saturating_add(Weight::from_parts(12_115_840, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -133,11 +133,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn finish_destroy() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5300` - // Minimum execution time: 12_892 nanoseconds. - Weight::from_parts(13_218_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `243` + // Estimated: `7280` + // Minimum execution time: 14_340_000 picoseconds. + Weight::from_parts(14_614_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -147,11 +147,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn mint() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5262` - // Minimum execution time: 23_073 nanoseconds. - Weight::from_parts(23_435_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `243` + // Estimated: `7242` + // Minimum execution time: 25_631_000 picoseconds. + Weight::from_parts(26_337_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -161,11 +161,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn burn() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `5262` - // Minimum execution time: 29_411 nanoseconds. - Weight::from_parts(30_019_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `351` + // Estimated: `7242` + // Minimum execution time: 32_363_000 picoseconds. + Weight::from_parts(32_781_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -177,11 +177,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `10442` - // Minimum execution time: 38_929 nanoseconds. - Weight::from_parts(39_602_000, 0) - .saturating_add(Weight::from_parts(0, 10442)) + // Measured: `351` + // Estimated: `13412` + // Minimum execution time: 43_852_000 picoseconds. + Weight::from_parts(44_369_000, 0) + .saturating_add(Weight::from_parts(0, 13412)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -193,11 +193,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `10442` - // Minimum execution time: 34_910 nanoseconds. - Weight::from_parts(35_686_000, 0) - .saturating_add(Weight::from_parts(0, 10442)) + // Measured: `351` + // Estimated: `13412` + // Minimum execution time: 38_675_000 picoseconds. + Weight::from_parts(39_020_000, 0) + .saturating_add(Weight::from_parts(0, 13412)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -209,11 +209,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `10442` - // Minimum execution time: 38_959 nanoseconds. - Weight::from_parts(39_627_000, 0) - .saturating_add(Weight::from_parts(0, 10442)) + // Measured: `351` + // Estimated: `13412` + // Minimum execution time: 43_792_000 picoseconds. + Weight::from_parts(44_412_000, 0) + .saturating_add(Weight::from_parts(0, 13412)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -223,11 +223,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn freeze() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `5262` - // Minimum execution time: 16_367 nanoseconds. - Weight::from_parts(16_761_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `351` + // Estimated: `7242` + // Minimum execution time: 17_802_000 picoseconds. + Weight::from_parts(18_129_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -237,11 +237,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Account (max_values: None, max_size: Some(102), added: 2577, mode: MaxEncodedLen) fn thaw() -> Weight { // Proof Size summary in bytes: - // Measured: `383` - // Estimated: `5262` - // Minimum execution time: 16_361 nanoseconds. - Weight::from_parts(18_506_000, 0) - .saturating_add(Weight::from_parts(0, 5262)) + // Measured: `351` + // Estimated: `7242` + // Minimum execution time: 17_711_000 picoseconds. + Weight::from_parts(18_136_000, 0) + .saturating_add(Weight::from_parts(0, 7242)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -249,11 +249,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn freeze_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `2685` - // Minimum execution time: 12_980 nanoseconds. - Weight::from_parts(14_272_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `277` + // Estimated: `3675` + // Minimum execution time: 13_776_000 picoseconds. + Weight::from_parts(14_134_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -261,11 +261,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn thaw_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `2685` - // Minimum execution time: 12_510 nanoseconds. - Weight::from_parts(12_996_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `277` + // Estimated: `3675` + // Minimum execution time: 14_376_000 picoseconds. + Weight::from_parts(15_425_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -275,11 +275,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5300` - // Minimum execution time: 13_958 nanoseconds. - Weight::from_parts(14_458_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `243` + // Estimated: `7280` + // Minimum execution time: 15_799_000 picoseconds. + Weight::from_parts(16_064_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -287,11 +287,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn set_team() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `2685` - // Minimum execution time: 12_820 nanoseconds. - Weight::from_parts(13_136_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `243` + // Estimated: `3675` + // Minimum execution time: 14_359_000 picoseconds. + Weight::from_parts(14_561_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -303,13 +303,13 @@ impl pallet_assets::WeightInfo for WeightInfo { /// The range of component `s` is `[0, 50]`. fn set_metadata(_n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `5300` - // Minimum execution time: 22_433 nanoseconds. - Weight::from_parts(23_664_666, 0) - .saturating_add(Weight::from_parts(0, 5300)) - // Standard Error: 648 - .saturating_add(Weight::from_parts(2_428, 0).saturating_mul(s.into())) + // Measured: `243` + // Estimated: `7280` + // Minimum execution time: 25_337_000 picoseconds. + Weight::from_parts(26_452_841, 0) + .saturating_add(Weight::from_parts(0, 7280)) + // Standard Error: 845 + .saturating_add(Weight::from_parts(2_931, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -319,11 +319,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `471` - // Estimated: `5300` - // Minimum execution time: 22_969 nanoseconds. - Weight::from_parts(23_330_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `407` + // Estimated: `7280` + // Minimum execution time: 25_521_000 picoseconds. + Weight::from_parts(26_621_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -336,12 +336,12 @@ impl pallet_assets::WeightInfo for WeightInfo { fn force_set_metadata(_n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `82` - // Estimated: `5300` - // Minimum execution time: 11_969 nanoseconds. - Weight::from_parts(12_659_111, 0) - .saturating_add(Weight::from_parts(0, 5300)) - // Standard Error: 345 - .saturating_add(Weight::from_parts(1_879, 0).saturating_mul(s.into())) + // Estimated: `7280` + // Minimum execution time: 13_557_000 picoseconds. + Weight::from_parts(14_292_610, 0) + .saturating_add(Weight::from_parts(0, 7280)) + // Standard Error: 393 + .saturating_add(Weight::from_parts(3_655, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -351,11 +351,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) fn force_clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `471` - // Estimated: `5300` - // Minimum execution time: 23_002 nanoseconds. - Weight::from_parts(23_320_000, 0) - .saturating_add(Weight::from_parts(0, 5300)) + // Measured: `407` + // Estimated: `7280` + // Minimum execution time: 25_686_000 picoseconds. + Weight::from_parts(25_982_000, 0) + .saturating_add(Weight::from_parts(0, 7280)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -363,11 +363,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn force_asset_status() -> Weight { // Proof Size summary in bytes: - // Measured: `275` - // Estimated: `2685` - // Minimum execution time: 11_994 nanoseconds. - Weight::from_parts(12_256_000, 0) - .saturating_add(Weight::from_parts(0, 2685)) + // Measured: `243` + // Estimated: `3675` + // Minimum execution time: 13_440_000 picoseconds. + Weight::from_parts(13_684_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -377,11 +377,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) fn approve_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `309` - // Estimated: `5308` - // Minimum execution time: 26_321 nanoseconds. - Weight::from_parts(26_867_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) + // Measured: `277` + // Estimated: `7288` + // Minimum execution time: 29_166_000 picoseconds. + Weight::from_parts(29_574_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -395,11 +395,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_approved() -> Weight { // Proof Size summary in bytes: - // Measured: `553` - // Estimated: `13065` - // Minimum execution time: 52_855 nanoseconds. - Weight::from_parts(54_006_000, 0) - .saturating_add(Weight::from_parts(0, 13065)) + // Measured: `521` + // Estimated: `17025` + // Minimum execution time: 58_808_000 picoseconds. + Weight::from_parts(59_441_000, 0) + .saturating_add(Weight::from_parts(0, 17025)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -409,11 +409,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) fn cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `479` - // Estimated: `5308` - // Minimum execution time: 28_148 nanoseconds. - Weight::from_parts(28_416_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) + // Measured: `447` + // Estimated: `7288` + // Minimum execution time: 31_081_000 picoseconds. + Weight::from_parts(31_475_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -423,11 +423,11 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) fn force_cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `479` - // Estimated: `5308` - // Minimum execution time: 28_456 nanoseconds. - Weight::from_parts(28_913_000, 0) - .saturating_add(Weight::from_parts(0, 5308)) + // Measured: `447` + // Estimated: `7288` + // Minimum execution time: 30_798_000 picoseconds. + Weight::from_parts(31_934_000, 0) + .saturating_add(Weight::from_parts(0, 7288)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -435,12 +435,12 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) fn set_min_balance() -> Weight { // Proof Size summary in bytes: - // Measured: `383` + // Measured: `243` // Estimated: `3675` - // Minimum execution time: 16_213 nanoseconds. - Weight::from_parts(16_575_000, 0) + // Minimum execution time: 14_755_000 picoseconds. + Weight::from_parts(14_938_000, 0) .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs index fc6ab30e195..acae356b1cb 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -51,11 +51,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_allow_death() -> Weight { // Proof Size summary in bytes: - // Measured: `1177` - // Estimated: `2603` - // Minimum execution time: 45_988 nanoseconds. - Weight::from_parts(46_507_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 35_470_000 picoseconds. + Weight::from_parts(36_170_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -63,11 +63,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: - // Measured: `1061` - // Estimated: `2603` - // Minimum execution time: 34_574 nanoseconds. - Weight::from_parts(35_575_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 26_173_000 picoseconds. + Weight::from_parts(26_636_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -75,11 +75,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_creating() -> Weight { // Proof Size summary in bytes: - // Measured: `1173` - // Estimated: `2603` - // Minimum execution time: 25_859 nanoseconds. - Weight::from_parts(26_467_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 15_875_000 picoseconds. + Weight::from_parts(16_109_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -87,11 +87,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_killing() -> Weight { // Proof Size summary in bytes: - // Measured: `1173` - // Estimated: `2603` - // Minimum execution time: 28_563 nanoseconds. - Weight::from_parts(29_082_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 18_726_000 picoseconds. + Weight::from_parts(19_101_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -99,11 +99,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `1173` - // Estimated: `5206` - // Minimum execution time: 45_594 nanoseconds. - Weight::from_parts(46_296_000, 0) - .saturating_add(Weight::from_parts(0, 5206)) + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 37_080_000 picoseconds. + Weight::from_parts(37_562_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -111,11 +111,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_all() -> Weight { // Proof Size summary in bytes: - // Measured: `1061` - // Estimated: `2603` - // Minimum execution time: 40_085 nanoseconds. - Weight::from_parts(40_675_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 32_468_000 picoseconds. + Weight::from_parts(32_858_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -126,11 +126,11 @@ impl pallet_balances::WeightInfo for WeightInfo { } fn force_unreserve() -> Weight { // Proof Size summary in bytes: - // Measured: `1057` - // Estimated: `2603` - // Minimum execution time: 22_208 nanoseconds. - Weight::from_parts(22_815_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 14_725_000 picoseconds. + Weight::from_parts(14_926_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs index 3537559d4ab..eaabe14f8b1 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -55,12 +55,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn set_invulnerables(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` - // Estimated: `178 + b * (2554 ±0)` - // Minimum execution time: 13_864 nanoseconds. - Weight::from_parts(14_046_919, 0) - .saturating_add(Weight::from_parts(0, 178)) - // Standard Error: 4_684 - .saturating_add(Weight::from_parts(2_474_689, 0).saturating_mul(b.into())) + // Estimated: `1168 + b * (2554 ±0)` + // Minimum execution time: 15_458_000 picoseconds. + Weight::from_parts(16_243_295, 0) + .saturating_add(Weight::from_parts(0, 1168)) + // Standard Error: 3_682 + .saturating_add(Weight::from_parts(2_601_545, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +71,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_556 nanoseconds. - Weight::from_parts(6_751_000, 0) + // Minimum execution time: 7_542_000 picoseconds. + Weight::from_parts(7_735_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +82,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_816 nanoseconds. - Weight::from_parts(7_009_000, 0) + // Minimum execution time: 7_344_000 picoseconds. + Weight::from_parts(7_660_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,13 +102,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 999]`. fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1171 + c * (48 ±0)` - // Estimated: `56784 + c * (49 ±0)` - // Minimum execution time: 35_423 nanoseconds. - Weight::from_parts(27_578_125, 0) - .saturating_add(Weight::from_parts(0, 56784)) - // Standard Error: 1_255 - .saturating_add(Weight::from_parts(105_521, 0).saturating_mul(c.into())) + // Measured: `1108 + c * (48 ±0)` + // Estimated: `61671 + c * (49 ±0)` + // Minimum execution time: 38_651_000 picoseconds. + Weight::from_parts(31_016_267, 0) + .saturating_add(Weight::from_parts(0, 61671)) + // Standard Error: 1_279 + .saturating_add(Weight::from_parts(106_148, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -120,13 +120,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[2, 1000]`. fn leave_intent(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `541 + c * (48 ±0)` - // Estimated: `48497` - // Minimum execution time: 24_550 nanoseconds. - Weight::from_parts(15_908_548, 0) - .saturating_add(Weight::from_parts(0, 48497)) - // Standard Error: 1_238 - .saturating_add(Weight::from_parts(105_175, 0).saturating_mul(c.into())) + // Measured: `469 + c * (48 ±0)` + // Estimated: `49487` + // Minimum execution time: 27_474_000 picoseconds. + Weight::from_parts(18_915_300, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_242 + .saturating_add(Weight::from_parts(107_733, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -138,11 +138,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) fn note_author() -> Weight { // Proof Size summary in bytes: - // Measured: `135` - // Estimated: `5749` - // Minimum execution time: 25_675 nanoseconds. - Weight::from_parts(26_392_000, 0) - .saturating_add(Weight::from_parts(0, 5749)) + // Measured: `103` + // Estimated: `7729` + // Minimum execution time: 29_327_000 picoseconds. + Weight::from_parts(29_858_000, 0) + .saturating_add(Weight::from_parts(0, 7729)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +160,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22756 + r * (148 ±0) + c * (97 ±0)` - // Estimated: `52737 + c * (2519 ±0) + r * (2603 ±0)` - // Minimum execution time: 16_612 nanoseconds. - Weight::from_parts(16_892_000, 0) - .saturating_add(Weight::from_parts(0, 52737)) - // Standard Error: 755_441 - .saturating_add(Weight::from_parts(27_658_379, 0).saturating_mul(c.into())) + // Measured: `22693 + r * (116 ±0) + c * (97 ±0)` + // Estimated: `56697 + r * (2603 ±0) + c * (2520 ±0)` + // Minimum execution time: 17_185_000 picoseconds. + Weight::from_parts(17_436_000, 0) + .saturating_add(Weight::from_parts(0, 56697)) + // Standard Error: 795_522 + .saturating_add(Weight::from_parts(28_877_010, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs index 375ccc70b85..b01f73c3007 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -52,11 +52,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_762 nanoseconds. - Weight::from_parts(12_267_870, 0) + // Minimum execution time: 12_071_000 picoseconds. + Weight::from_parts(12_418_308, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 1 - .saturating_add(Weight::from_parts(493, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(495, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -64,15 +64,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `311 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 35_352 nanoseconds. - Weight::from_parts(28_499_037, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 1_231 - .saturating_add(Weight::from_parts(73_158, 0).saturating_mul(s.into())) - // Standard Error: 12 - .saturating_add(Weight::from_parts(1_528, 0).saturating_mul(z.into())) + // Measured: `262 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 37_454_000 picoseconds. + Weight::from_parts(31_908_123, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 637 + .saturating_add(Weight::from_parts(62_530, 0).saturating_mul(s.into())) + // Standard Error: 6 + .saturating_add(Weight::from_parts(1_217, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,15 +82,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_approve(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 26_412 nanoseconds. - Weight::from_parts(20_296_722, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 402 - .saturating_add(Weight::from_parts(67_954, 0).saturating_mul(s.into())) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_495, 0).saturating_mul(z.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 27_665_000 picoseconds. + Weight::from_parts(21_985_439, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 509 + .saturating_add(Weight::from_parts(63_318, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_187, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,15 +102,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `448 + s * (33 ±0)` - // Estimated: `8424` - // Minimum execution time: 39_936 nanoseconds. - Weight::from_parts(31_699_007, 0) - .saturating_add(Weight::from_parts(0, 8424)) - // Standard Error: 632 - .saturating_add(Weight::from_parts(90_100, 0).saturating_mul(s.into())) - // Standard Error: 6 - .saturating_add(Weight::from_parts(1_544, 0).saturating_mul(z.into())) + // Measured: `385 + s * (33 ±0)` + // Estimated: `10404` + // Minimum execution time: 42_985_000 picoseconds. + Weight::from_parts(35_504_175, 0) + .saturating_add(Weight::from_parts(0, 10404)) + // Standard Error: 530 + .saturating_add(Weight::from_parts(80_153, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_215, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -119,13 +119,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `318 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 25_146 nanoseconds. - Weight::from_parts(26_857_601, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 669 - .saturating_add(Weight::from_parts(76_520, 0).saturating_mul(s.into())) + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 28_498_000 picoseconds. + Weight::from_parts(30_376_601, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 785 + .saturating_add(Weight::from_parts(65_913, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -134,13 +134,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 17_187 nanoseconds. - Weight::from_parts(18_410_072, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 491 - .saturating_add(Weight::from_parts(72_318, 0).saturating_mul(s.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 19_047_000 picoseconds. + Weight::from_parts(20_338_502, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 544 + .saturating_add(Weight::from_parts(66_876, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -149,13 +149,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `517 + s * (1 ±0)` - // Estimated: `5821` - // Minimum execution time: 25_956 nanoseconds. - Weight::from_parts(28_043_929, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 830 - .saturating_add(Weight::from_parts(80_119, 0).saturating_mul(s.into())) + // Measured: `454 + s * (1 ±0)` + // Estimated: `6811` + // Minimum execution time: 29_085_000 picoseconds. + Weight::from_parts(31_283_618, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 985 + .saturating_add(Weight::from_parts(67_469, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs index d4d05c7ce25..904f7823041 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_nfts` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -50,7 +50,7 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Storage: Nfts NextCollectionId (r:1 w:1) /// Proof: Nfts NextCollectionId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionRoleOf (r:0 w:1) /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:0 w:1) @@ -59,18 +59,18 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn create() -> Weight { // Proof Size summary in bytes: - // Measured: `177` - // Estimated: `3054` - // Minimum execution time: 30_978 nanoseconds. - Weight::from_parts(31_489_000, 0) - .saturating_add(Weight::from_parts(0, 3054)) + // Measured: `145` + // Estimated: `5038` + // Minimum execution time: 34_344_000 picoseconds. + Weight::from_parts(35_251_000, 0) + .saturating_add(Weight::from_parts(0, 5038)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: Nfts NextCollectionId (r:1 w:1) /// Proof: Nfts NextCollectionId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionRoleOf (r:0 w:1) /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:0 w:1) @@ -80,62 +80,53 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `3054` - // Minimum execution time: 20_101 nanoseconds. - Weight::from_parts(20_488_000, 0) - .saturating_add(Weight::from_parts(0, 3054)) + // Estimated: `5038` + // Minimum execution time: 22_704_000 picoseconds. + Weight::from_parts(23_146_000, 0) + .saturating_add(Weight::from_parts(0, 5038)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1001 w:1000) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1001 w:1000) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(219), added: 2694, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1001 w:1000) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:0 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts ItemMetadataOf (r:1 w:0) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:1) /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1001 w:1000) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1000 w:1000) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: Nfts CollectionMetadataOf (r:0 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(166), added: 2641, mode: MaxEncodedLen) + /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(294), added: 2769, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:0 w:1) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:0 w:1000) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1000) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Nfts CollectionAccount (r:0 w:1) /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) - /// The range of component `n` is `[0, 1000]`. /// The range of component `m` is `[0, 1000]`. + /// The range of component `c` is `[0, 1000]`. /// The range of component `a` is `[0, 1000]`. - fn destroy(_n: u32, m: u32, a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `172673 + m * (206 ±0) + a * (210 ±0)` - // Estimated: `3347314 + m * (2694 ±0) + a * (2729 ±0)` - // Minimum execution time: 23_505_821 nanoseconds. - Weight::from_parts(16_948_157_713, 0) - .saturating_add(Weight::from_parts(0, 3347314)) - // Standard Error: 20_494 - .saturating_add(Weight::from_parts(7_059_571, 0).saturating_mul(m.into())) - // Standard Error: 20_494 - .saturating_add(Weight::from_parts(8_471_367, 0).saturating_mul(a.into())) + fn destroy(_m: u32, _c: u32, a: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `32170 + a * (366 ±0)` + // Estimated: `2538829 + a * (2954 ±0)` + // Minimum execution time: 976_206_000 picoseconds. + Weight::from_parts(924_770_064, 0) + .saturating_add(Weight::from_parts(0, 2538829)) + // Standard Error: 3_946 + .saturating_add(Weight::from_parts(5_708_229, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(1004)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(3005)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) + .saturating_add(T::DbWeight::get().writes(1005)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2694).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 2729).saturating_mul(a.into())) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(a.into())) } /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionRoleOf (r:1 w:0) /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:1) @@ -144,11 +135,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn mint() -> Weight { // Proof Size summary in bytes: - // Measured: `448` - // Estimated: `13506` - // Minimum execution time: 39_850 nanoseconds. - Weight::from_parts(40_227_000, 0) - .saturating_add(Weight::from_parts(0, 13506)) + // Measured: `421` + // Estimated: `18460` + // Minimum execution time: 44_592_000 picoseconds. + Weight::from_parts(45_181_000, 0) + .saturating_add(Weight::from_parts(0, 18460)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -157,7 +148,7 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:1) @@ -166,24 +157,22 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn force_mint() -> Weight { // Proof Size summary in bytes: - // Measured: `448` - // Estimated: `13506` - // Minimum execution time: 40_379 nanoseconds. - Weight::from_parts(41_110_000, 0) - .saturating_add(Weight::from_parts(0, 13506)) + // Measured: `421` + // Estimated: `18460` + // Minimum execution time: 43_304_000 picoseconds. + Weight::from_parts(43_977_000, 0) + .saturating_add(Weight::from_parts(0, 18460)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: Nfts ItemConfigOf (r:1 w:1) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts ItemMetadataOf (r:1 w:0) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(219), added: 2694, mode: MaxEncodedLen) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) /// Storage: Nfts Account (r:0 w:1) /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Nfts ItemPriceOf (r:0 w:1) @@ -194,26 +183,22 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn burn() -> Weight { // Proof Size summary in bytes: - // Measured: `647` - // Estimated: `13652` - // Minimum execution time: 43_534 nanoseconds. - Weight::from_parts(43_846_000, 0) - .saturating_add(Weight::from_parts(0, 13652)) - .saturating_add(T::DbWeight::get().reads(5)) + // Measured: `530` + // Estimated: `15200` + // Minimum execution time: 45_744_000 picoseconds. + Weight::from_parts(46_056_000, 0) + .saturating_add(Weight::from_parts(0, 15200)) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: Nfts Account (r:0 w:2) /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Nfts ItemPriceOf (r:0 w:1) @@ -222,16 +207,16 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `811` - // Estimated: `16109` - // Minimum execution time: 49_184 nanoseconds. - Weight::from_parts(49_935_000, 0) - .saturating_add(Weight::from_parts(0, 16109)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(6)) + // Measured: `559` + // Estimated: `14926` + // Minimum execution time: 35_663_000 picoseconds. + Weight::from_parts(36_865_000, 0) + .saturating_add(Weight::from_parts(0, 14926)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts Item (r:5000 w:5000) @@ -239,13 +224,13 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// The range of component `i` is `[0, 5000]`. fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `756 + i * (140 ±0)` - // Estimated: `5103 + i * (3336 ±0)` - // Minimum execution time: 15_668 nanoseconds. - Weight::from_parts(15_762_000, 0) - .saturating_add(Weight::from_parts(0, 5103)) - // Standard Error: 12_791 - .saturating_add(Weight::from_parts(12_224_567, 0).saturating_mul(i.into())) + // Measured: `729 + i * (108 ±0)` + // Estimated: `8077 + i * (3336 ±0)` + // Minimum execution time: 16_987_000 picoseconds. + Weight::from_parts(17_194_000, 0) + .saturating_add(Weight::from_parts(0, 8077)) + // Standard Error: 13_044 + .saturating_add(Weight::from_parts(13_324_147, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) @@ -258,10 +243,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn lock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `401` - // Estimated: `5067` - // Minimum execution time: 18_861 nanoseconds. - Weight::from_parts(19_195_000, 0) - .saturating_add(Weight::from_parts(0, 5067)) + // Estimated: `7047` + // Minimum execution time: 20_345_000 picoseconds. + Weight::from_parts(20_739_000, 0) + .saturating_add(Weight::from_parts(0, 7047)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -272,145 +257,149 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn unlock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `401` - // Estimated: `5067` - // Minimum execution time: 18_710 nanoseconds. - Weight::from_parts(18_971_000, 0) - .saturating_add(Weight::from_parts(0, 5067)) + // Estimated: `7047` + // Minimum execution time: 20_167_000 picoseconds. + Weight::from_parts(20_580_000, 0) + .saturating_add(Weight::from_parts(0, 7047)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:0) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:1) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn lock_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `289` - // Estimated: `5092` - // Minimum execution time: 17_067 nanoseconds. - Weight::from_parts(17_233_000, 0) - .saturating_add(Weight::from_parts(0, 5092)) + // Measured: `306` + // Estimated: `7087` + // Minimum execution time: 17_831_000 picoseconds. + Weight::from_parts(18_174_000, 0) + .saturating_add(Weight::from_parts(0, 7087)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts OwnershipAcceptance (r:1 w:1) /// Proof: Nfts OwnershipAcceptance (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionAccount (r:0 w:2) /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `381` - // Estimated: `5082` - // Minimum execution time: 21_203 nanoseconds. - Weight::from_parts(21_468_000, 0) - .saturating_add(Weight::from_parts(0, 5082)) + // Measured: `354` + // Estimated: `7066` + // Minimum execution time: 23_763_000 picoseconds. + Weight::from_parts(24_226_000, 0) + .saturating_add(Weight::from_parts(0, 7066)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:0 w:4) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:2 w:4) /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn set_team() -> Weight { // Proof Size summary in bytes: - // Measured: `362` - // Estimated: `2555` - // Minimum execution time: 24_304 nanoseconds. - Weight::from_parts(24_823_000, 0) - .saturating_add(Weight::from_parts(0, 2555)) - .saturating_add(T::DbWeight::get().reads(1)) + // Measured: `335` + // Estimated: `9627` + // Minimum execution time: 40_034_000 picoseconds. + Weight::from_parts(40_402_000, 0) + .saturating_add(Weight::from_parts(0, 9627)) + .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionAccount (r:0 w:2) /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn force_collection_owner() -> Weight { // Proof Size summary in bytes: - // Measured: `304` - // Estimated: `2555` - // Minimum execution time: 17_173 nanoseconds. - Weight::from_parts(17_448_000, 0) - .saturating_add(Weight::from_parts(0, 2555)) + // Measured: `277` + // Estimated: `3549` + // Minimum execution time: 18_648_000 picoseconds. + Weight::from_parts(18_968_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) } /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:0 w:1) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn force_collection_config() -> Weight { // Proof Size summary in bytes: // Measured: `242` - // Estimated: `2555` - // Minimum execution time: 13_697 nanoseconds. - Weight::from_parts(13_924_000, 0) - .saturating_add(Weight::from_parts(0, 2555)) + // Estimated: `3549` + // Minimum execution time: 15_282_000 picoseconds. + Weight::from_parts(15_923_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:1) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) fn lock_item_properties() -> Weight { // Proof Size summary in bytes: - // Measured: `445` - // Estimated: `5078` - // Minimum execution time: 18_063 nanoseconds. - Weight::from_parts(18_438_000, 0) - .saturating_add(Weight::from_parts(0, 5078)) + // Measured: `401` + // Estimated: `7047` + // Minimum execution time: 20_060_000 picoseconds. + Weight::from_parts(20_326_000, 0) + .saturating_add(Weight::from_parts(0, 7047)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) fn set_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `474` - // Estimated: `10355` - // Minimum execution time: 37_582 nanoseconds. - Weight::from_parts(38_155_000, 0) - .saturating_add(Weight::from_parts(0, 10355)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `505` + // Estimated: `18078` + // Minimum execution time: 48_324_000 picoseconds. + Weight::from_parts(48_745_000, 0) + .saturating_add(Weight::from_parts(0, 18078)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) fn force_set_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `337` - // Estimated: `5284` - // Minimum execution time: 24_392 nanoseconds. - Weight::from_parts(24_787_000, 0) - .saturating_add(Weight::from_parts(0, 5284)) + // Measured: `310` + // Estimated: `7493` + // Minimum execution time: 27_935_000 picoseconds. + Weight::from_parts(28_241_000, 0) + .saturating_add(Weight::from_parts(0, 7493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) fn clear_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `724` - // Estimated: `7807` - // Minimum execution time: 34_564 nanoseconds. - Weight::from_parts(34_956_000, 0) - .saturating_add(Weight::from_parts(0, 7807)) - .saturating_add(T::DbWeight::get().reads(3)) + // Measured: `949` + // Estimated: `14540` + // Minimum execution time: 44_972_000 picoseconds. + Weight::from_parts(45_618_000, 0) + .saturating_add(Weight::from_parts(0, 14540)) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: Nfts Item (r:1 w:0) @@ -419,11 +408,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(1001), added: 3476, mode: MaxEncodedLen) fn approve_item_attributes() -> Weight { // Proof Size summary in bytes: - // Measured: `379` - // Estimated: `6812` - // Minimum execution time: 17_194 nanoseconds. - Weight::from_parts(17_467_000, 0) - .saturating_add(Weight::from_parts(0, 6812)) + // Measured: `347` + // Estimated: `8792` + // Minimum execution time: 19_246_000 picoseconds. + Weight::from_parts(19_715_000, 0) + .saturating_add(Weight::from_parts(0, 8792)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -432,133 +421,135 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(1001), added: 3476, mode: MaxEncodedLen) /// Storage: Nfts Attribute (r:1001 w:1000) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// The range of component `n` is `[0, 1000]`. fn cancel_item_attributes_approval(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `828 + n * (204 ±0)` - // Estimated: `12144 + n * (2729 ±0)` - // Minimum execution time: 25_617 nanoseconds. - Weight::from_parts(25_917_000, 0) - .saturating_add(Weight::from_parts(0, 12144)) - // Standard Error: 5_524 - .saturating_add(Weight::from_parts(7_538_893, 0).saturating_mul(n.into())) + // Measured: `726 + n * (398 ±0)` + // Estimated: `16329 + n * (2954 ±0)` + // Minimum execution time: 28_372_000 picoseconds. + Weight::from_parts(28_671_000, 0) + .saturating_add(Weight::from_parts(0, 16329)) + // Standard Error: 3_479 + .saturating_add(Weight::from_parts(5_527_336, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2729).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(219), added: 2694, mode: MaxEncodedLen) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) fn set_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `474` - // Estimated: `10320` - // Minimum execution time: 32_053 nanoseconds. - Weight::from_parts(32_510_000, 0) - .saturating_add(Weight::from_parts(0, 10320)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `505` + // Estimated: `17946` + // Minimum execution time: 39_852_000 picoseconds. + Weight::from_parts(40_280_000, 0) + .saturating_add(Weight::from_parts(0, 17946)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(219), added: 2694, mode: MaxEncodedLen) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `688` - // Estimated: `7772` - // Minimum execution time: 30_654 nanoseconds. - Weight::from_parts(31_113_000, 0) - .saturating_add(Weight::from_parts(0, 7772)) - .saturating_add(T::DbWeight::get().reads(3)) + // Measured: `815` + // Estimated: `14408` + // Minimum execution time: 36_829_000 picoseconds. + Weight::from_parts(37_513_000, 0) + .saturating_add(Weight::from_parts(0, 14408)) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionMetadataOf (r:1 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(166), added: 2641, mode: MaxEncodedLen) + /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(294), added: 2769, mode: MaxEncodedLen) fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `333` - // Estimated: `7744` - // Minimum execution time: 27_700 nanoseconds. - Weight::from_parts(28_291_000, 0) - .saturating_add(Weight::from_parts(0, 7744)) - .saturating_add(T::DbWeight::get().reads(3)) + // Measured: `364` + // Estimated: `14380` + // Minimum execution time: 35_398_000 picoseconds. + Weight::from_parts(35_809_000, 0) + .saturating_add(Weight::from_parts(0, 14380)) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts CollectionMetadataOf (r:1 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(166), added: 2641, mode: MaxEncodedLen) + /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(294), added: 2769, mode: MaxEncodedLen) fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `555` - // Estimated: `7744` - // Minimum execution time: 27_483 nanoseconds. - Weight::from_parts(27_830_000, 0) - .saturating_add(Weight::from_parts(0, 7744)) - .saturating_add(T::DbWeight::get().reads(3)) + // Measured: `682` + // Estimated: `14380` + // Minimum execution time: 33_699_000 picoseconds. + Weight::from_parts(34_170_000, 0) + .saturating_add(Weight::from_parts(0, 14380)) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn approve_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `466` - // Estimated: `8428` - // Minimum execution time: 23_623 nanoseconds. - Weight::from_parts(24_282_000, 0) - .saturating_add(Weight::from_parts(0, 8428)) - .saturating_add(T::DbWeight::get().reads(3)) + // Measured: `376` + // Estimated: `7864` + // Minimum execution time: 21_789_000 picoseconds. + Weight::from_parts(22_454_000, 0) + .saturating_add(Weight::from_parts(0, 7864)) + .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `474` - // Estimated: `5880` - // Minimum execution time: 21_115 nanoseconds. - Weight::from_parts(22_036_000, 0) - .saturating_add(Weight::from_parts(0, 5880)) - .saturating_add(T::DbWeight::get().reads(2)) + // Measured: `384` + // Estimated: `4326` + // Minimum execution time: 19_532_000 picoseconds. + Weight::from_parts(19_761_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn clear_all_transfer_approvals() -> Weight { // Proof Size summary in bytes: - // Measured: `474` - // Estimated: `5880` - // Minimum execution time: 20_352 nanoseconds. - Weight::from_parts(20_627_000, 0) - .saturating_add(Weight::from_parts(0, 5880)) - .saturating_add(T::DbWeight::get().reads(2)) + // Measured: `384` + // Estimated: `4326` + // Minimum execution time: 18_620_000 picoseconds. + Weight::from_parts(19_014_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts OwnershipAcceptance (r:1 w:1) @@ -566,38 +557,38 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_accept_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `2527` - // Minimum execution time: 14_427 nanoseconds. - Weight::from_parts(15_169_000, 0) - .saturating_add(Weight::from_parts(0, 2527)) + // Estimated: `3517` + // Minimum execution time: 16_491_000 picoseconds. + Weight::from_parts(16_888_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Nfts CollectionConfigOf (r:1 w:1) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: - // Measured: `333` - // Estimated: `5103` - // Minimum execution time: 18_049 nanoseconds. - Weight::from_parts(18_431_000, 0) - .saturating_add(Weight::from_parts(0, 5103)) + // Measured: `306` + // Estimated: `7087` + // Minimum execution time: 19_929_000 picoseconds. + Weight::from_parts(20_170_000, 0) + .saturating_add(Weight::from_parts(0, 7087)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:1) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn update_mint_settings() -> Weight { // Proof Size summary in bytes: - // Measured: `333` - // Estimated: `5103` - // Minimum execution time: 17_166 nanoseconds. - Weight::from_parts(17_511_000, 0) - .saturating_add(Weight::from_parts(0, 5103)) + // Measured: `289` + // Estimated: `7072` + // Minimum execution time: 19_500_000 picoseconds. + Weight::from_parts(19_839_000, 0) + .saturating_add(Weight::from_parts(0, 7072)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -611,11 +602,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn set_price() -> Weight { // Proof Size summary in bytes: - // Measured: `516` - // Estimated: `8407` - // Minimum execution time: 22_556 nanoseconds. - Weight::from_parts(22_839_000, 0) - .saturating_add(Weight::from_parts(0, 8407)) + // Measured: `484` + // Estimated: `11377` + // Minimum execution time: 24_542_000 picoseconds. + Weight::from_parts(24_916_000, 0) + .saturating_add(Weight::from_parts(0, 11377)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -624,37 +615,35 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Storage: Nfts ItemPriceOf (r:1 w:1) /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: Nfts Account (r:0 w:2) /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Nfts PendingSwapOf (r:0 w:1) /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn buy_item() -> Weight { // Proof Size summary in bytes: - // Measured: `897` - // Estimated: `16129` - // Minimum execution time: 53_554 nanoseconds. - Weight::from_parts(54_285_000, 0) - .saturating_add(Weight::from_parts(0, 16129)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(6)) + // Measured: `671` + // Estimated: `18480` + // Minimum execution time: 44_311_000 picoseconds. + Weight::from_parts(45_789_000, 0) + .saturating_add(Weight::from_parts(0, 18480)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(5)) } /// The range of component `n` is `[0, 10]`. fn pay_tips(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_031 nanoseconds. - Weight::from_parts(3_579_973, 0) + // Minimum execution time: 2_523_000 picoseconds. + Weight::from_parts(4_349_031, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 8_727 - .saturating_add(Weight::from_parts(3_165_511, 0).saturating_mul(n.into())) + // Standard Error: 10_427 + .saturating_add(Weight::from_parts(3_718_129, 0).saturating_mul(n.into())) } /// Storage: Nfts Item (r:2 w:0) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) @@ -662,11 +651,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn create_swap() -> Weight { // Proof Size summary in bytes: - // Measured: `524` - // Estimated: `6672` - // Minimum execution time: 20_161 nanoseconds. - Weight::from_parts(20_487_000, 0) - .saturating_add(Weight::from_parts(0, 6672)) + // Measured: `460` + // Estimated: `7662` + // Minimum execution time: 23_007_000 picoseconds. + Weight::from_parts(23_305_000, 0) + .saturating_add(Weight::from_parts(0, 7662)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -676,11 +665,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) fn cancel_swap() -> Weight { // Proof Size summary in bytes: - // Measured: `511` - // Estimated: `5882` - // Minimum execution time: 19_470 nanoseconds. - Weight::from_parts(19_832_000, 0) - .saturating_add(Weight::from_parts(0, 5882)) + // Measured: `479` + // Estimated: `7862` + // Minimum execution time: 21_173_000 picoseconds. + Weight::from_parts(21_451_000, 0) + .saturating_add(Weight::from_parts(0, 7862)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -689,85 +678,85 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Storage: Nfts PendingSwapOf (r:1 w:2) /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:2 w:0) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: Nfts Account (r:0 w:4) /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Nfts ItemPriceOf (r:0 w:2) /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn claim_swap() -> Weight { // Proof Size summary in bytes: - // Measured: `1026` - // Estimated: `21970` - // Minimum execution time: 78_114 nanoseconds. - Weight::from_parts(79_459_000, 0) - .saturating_add(Weight::from_parts(0, 21970)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(11)) + // Measured: `800` + // Estimated: `24321` + // Minimum execution time: 72_213_000 picoseconds. + Weight::from_parts(73_029_000, 0) + .saturating_add(Weight::from_parts(0, 24321)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(10)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:2 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts Item (r:1 w:1) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:1) /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: Nfts Attribute (r:10 w:10) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(254), added: 2729, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(219), added: 2694, mode: MaxEncodedLen) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) /// Storage: Nfts Account (r:0 w:1) /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// The range of component `n` is `[0, 10]`. fn mint_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `525` - // Estimated: `16259 + n * (2729 ±0)` - // Minimum execution time: 108_373 nanoseconds. - Weight::from_parts(112_094_892, 0) - .saturating_add(Weight::from_parts(0, 16259)) - // Standard Error: 27_186 - .saturating_add(Weight::from_parts(20_710_983, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(6)) + // Measured: `524` + // Estimated: `29399 + n * (2954 ±0)` + // Minimum execution time: 125_518_000 picoseconds. + Weight::from_parts(129_781_908, 0) + .saturating_add(Weight::from_parts(0, 29399)) + // Standard Error: 21_840 + .saturating_add(Weight::from_parts(26_756_136, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2729).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) } /// Storage: Nfts Item (r:1 w:0) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) - /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(681), added: 3156, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(1001), added: 3476, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) /// Storage: Nfts Attribute (r:10 w:10) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// The range of component `n` is `[0, 10]`. fn set_attributes_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `716` - // Estimated: `14198 + n * (2921 ±0)` - // Minimum execution time: 84_153 nanoseconds. - Weight::from_parts(96_401_623, 0) - .saturating_add(Weight::from_parts(0, 14198)) - // Standard Error: 70_244 - .saturating_add(Weight::from_parts(26_866_222, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(4_u64)) + // Measured: `554` + // Estimated: `20462 + n * (2954 ±0)` + // Minimum execution time: 76_133_000 picoseconds. + Weight::from_parts(85_559_988, 0) + .saturating_add(Weight::from_parts(0, 20462)) + // Standard Error: 49_851 + .saturating_add(Weight::from_parts(26_551_215, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(2_u64)) + .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2921).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) } } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs index 68b69720caf..fa22bf7bf68 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -52,13 +52,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 14_854 nanoseconds. - Weight::from_parts(15_600_203, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_181 - .saturating_add(Weight::from_parts(28_891, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 16_562_000 picoseconds. + Weight::from_parts(17_305_360, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_081 + .saturating_add(Weight::from_parts(37_267, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -71,15 +71,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn proxy_announced(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `550 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `11027` - // Minimum execution time: 32_063 nanoseconds. - Weight::from_parts(32_624_200, 0) - .saturating_add(Weight::from_parts(0, 11027)) - // Standard Error: 1_727 - .saturating_add(Weight::from_parts(113_689, 0).saturating_mul(a.into())) - // Standard Error: 1_785 - .saturating_add(Weight::from_parts(29_618, 0).saturating_mul(p.into())) + // Measured: `454 + a * (68 ±0) + p * (37 ±0)` + // Estimated: `13997` + // Minimum execution time: 35_181_000 picoseconds. + Weight::from_parts(34_864_956, 0) + .saturating_add(Weight::from_parts(0, 13997)) + // Standard Error: 5_023 + .saturating_add(Weight::from_parts(158_916, 0).saturating_mul(a.into())) + // Standard Error: 5_189 + .saturating_add(Weight::from_parts(60_136, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -91,15 +91,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `433 + a * (68 ±0)` - // Estimated: `7311` - // Minimum execution time: 20_449 nanoseconds. - Weight::from_parts(21_345_957, 0) - .saturating_add(Weight::from_parts(0, 7311)) - // Standard Error: 1_390 - .saturating_add(Weight::from_parts(105_313, 0).saturating_mul(a.into())) - // Standard Error: 1_436 - .saturating_add(Weight::from_parts(9_437, 0).saturating_mul(p.into())) + // Measured: `369 + a * (68 ±0)` + // Estimated: `9291` + // Minimum execution time: 21_758_000 picoseconds. + Weight::from_parts(23_149_882, 0) + .saturating_add(Weight::from_parts(0, 9291)) + // Standard Error: 1_877 + .saturating_add(Weight::from_parts(145_269, 0).saturating_mul(a.into())) + // Standard Error: 1_940 + .saturating_add(Weight::from_parts(5_129, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -111,15 +111,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn reject_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `433 + a * (68 ±0)` - // Estimated: `7311` - // Minimum execution time: 20_423 nanoseconds. - Weight::from_parts(21_290_701, 0) - .saturating_add(Weight::from_parts(0, 7311)) - // Standard Error: 1_398 - .saturating_add(Weight::from_parts(110_034, 0).saturating_mul(a.into())) - // Standard Error: 1_444 - .saturating_add(Weight::from_parts(9_968, 0).saturating_mul(p.into())) + // Measured: `369 + a * (68 ±0)` + // Estimated: `9291` + // Minimum execution time: 22_076_000 picoseconds. + Weight::from_parts(22_959_374, 0) + .saturating_add(Weight::from_parts(0, 9291)) + // Standard Error: 1_377 + .saturating_add(Weight::from_parts(146_462, 0).saturating_mul(a.into())) + // Standard Error: 1_423 + .saturating_add(Weight::from_parts(11_551, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -133,15 +133,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn announce(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `482 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `11027` - // Minimum execution time: 28_014 nanoseconds. - Weight::from_parts(28_864_371, 0) - .saturating_add(Weight::from_parts(0, 11027)) - // Standard Error: 1_933 - .saturating_add(Weight::from_parts(109_536, 0).saturating_mul(a.into())) - // Standard Error: 1_998 - .saturating_add(Weight::from_parts(43_779, 0).saturating_mul(p.into())) + // Measured: `386 + a * (68 ±0) + p * (37 ±0)` + // Estimated: `13997` + // Minimum execution time: 30_751_000 picoseconds. + Weight::from_parts(31_929_484, 0) + .saturating_add(Weight::from_parts(0, 13997)) + // Standard Error: 2_087 + .saturating_add(Weight::from_parts(147_703, 0).saturating_mul(a.into())) + // Standard Error: 2_156 + .saturating_add(Weight::from_parts(27_798, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -150,13 +150,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn add_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 21_285 nanoseconds. - Weight::from_parts(22_065_300, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_703 - .saturating_add(Weight::from_parts(42_186, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 23_700_000 picoseconds. + Weight::from_parts(24_509_575, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_699 + .saturating_add(Weight::from_parts(51_275, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -165,13 +165,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 20_992 nanoseconds. - Weight::from_parts(22_026_633, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_663 - .saturating_add(Weight::from_parts(60_910, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 23_289_000 picoseconds. + Weight::from_parts(24_453_360, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_690 + .saturating_add(Weight::from_parts(62_718, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -180,26 +180,28 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_proxies(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 16_755 nanoseconds. - Weight::from_parts(17_775_492, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_281 - .saturating_add(Weight::from_parts(28_738, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 18_877_000 picoseconds. + Weight::from_parts(19_780_042, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_171 + .saturating_add(Weight::from_parts(20_282, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Proxy Proxies (r:1 w:1) /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) /// The range of component `p` is `[1, 31]`. - fn create_pure(_p: u32, ) -> Weight { + fn create_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `139` - // Estimated: `3716` - // Minimum execution time: 22_598 nanoseconds. - Weight::from_parts(23_639_320, 0) - .saturating_add(Weight::from_parts(0, 3716)) + // Estimated: `4706` + // Minimum execution time: 25_354_000 picoseconds. + Weight::from_parts(26_362_285, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_459 + .saturating_add(Weight::from_parts(1_330, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -208,13 +210,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[0, 30]`. fn kill_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `196 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 17_907 nanoseconds. - Weight::from_parts(18_737_185, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_069 - .saturating_add(Weight::from_parts(26_491, 0).saturating_mul(p.into())) + // Measured: `164 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 20_057_000 picoseconds. + Weight::from_parts(20_844_608, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_336 + .saturating_add(Weight::from_parts(27_855, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_session.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_session.rs index 5bba2a38022..bb4705ace09 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_session.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -54,10 +54,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `270` - // Estimated: `5490` - // Minimum execution time: 15_416 nanoseconds. - Weight::from_parts(15_764_000, 0) - .saturating_add(Weight::from_parts(0, 5490)) + // Estimated: `7470` + // Minimum execution time: 17_394_000 picoseconds. + Weight::from_parts(17_828_000, 0) + .saturating_add(Weight::from_parts(0, 7470)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +68,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `242` - // Estimated: `2959` - // Minimum execution time: 11_720 nanoseconds. - Weight::from_parts(12_152_000, 0) - .saturating_add(Weight::from_parts(0, 2959)) + // Estimated: `3949` + // Minimum execution time: 13_334_000 picoseconds. + Weight::from_parts(13_634_000, 0) + .saturating_add(Weight::from_parts(0, 3949)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs index 7cb95d8f8e1..7475e81c9ad 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -54,10 +54,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `86` - // Estimated: `1006` - // Minimum execution time: 8_384 nanoseconds. - Weight::from_parts(8_706_000, 0) - .saturating_add(Weight::from_parts(0, 1006)) + // Estimated: `2986` + // Minimum execution time: 9_273_000 picoseconds. + Weight::from_parts(9_653_000, 0) + .saturating_add(Weight::from_parts(0, 2986)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_110 nanoseconds. - Weight::from_parts(3_206_000, 0) + // Minimum execution time: 3_289_000 picoseconds. + Weight::from_parts(3_379_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs index 624879d8e0b..c32eebdc908 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_uniques` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn create() -> Weight { // Proof Size summary in bytes: - // Measured: `177` - // Estimated: `2653` - // Minimum execution time: 23_302 nanoseconds. - Weight::from_parts(23_817_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `145` + // Estimated: `3643` + // Minimum execution time: 26_855_000 picoseconds. + Weight::from_parts(27_393_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +68,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `2653` - // Minimum execution time: 12_529 nanoseconds. - Weight::from_parts(13_079_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Estimated: `3643` + // Minimum execution time: 15_006_000 picoseconds. + Weight::from_parts(15_389_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -79,14 +79,14 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) /// Storage: Uniques Asset (r:1001 w:1000) /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) + /// Storage: Uniques InstanceMetadataOf (r:1000 w:1000) + /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) + /// Storage: Uniques Attribute (r:1000 w:1000) + /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) /// Storage: Uniques ClassAccount (r:0 w:1) /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) - /// Storage: Uniques Attribute (r:0 w:1000) - /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) /// Storage: Uniques ClassMetadataOf (r:0 w:1) /// Proof: Uniques ClassMetadataOf (max_values: None, max_size: Some(167), added: 2642, mode: MaxEncodedLen) - /// Storage: Uniques InstanceMetadataOf (r:0 w:1000) - /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) /// Storage: Uniques Account (r:0 w:1000) /// Proof: Uniques Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) /// Storage: Uniques CollectionMaxSupply (r:0 w:1) @@ -96,24 +96,28 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// The range of component `a` is `[0, 1000]`. fn destroy(n: u32, m: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `289 + n * (108 ±0) + m * (56 ±0) + a * (107 ±0)` - // Estimated: `5250 + n * (2597 ±0)` - // Minimum execution time: 2_305_045 nanoseconds. - Weight::from_parts(2_312_341_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) - // Standard Error: 26_047 - .saturating_add(Weight::from_parts(8_440_544, 0).saturating_mul(n.into())) - // Standard Error: 26_047 - .saturating_add(Weight::from_parts(223_194, 0).saturating_mul(m.into())) - // Standard Error: 26_047 - .saturating_add(Weight::from_parts(313_891, 0).saturating_mul(a.into())) + // Measured: `257 + n * (76 ±0) + m * (56 ±0) + a * (107 ±0)` + // Estimated: `9210 + a * (2647 ±0) + n * (2597 ±0) + m * (2662 ±0)` + // Minimum execution time: 2_360_211_000 picoseconds. + Weight::from_parts(2_383_759_000, 0) + .saturating_add(Weight::from_parts(0, 9210)) + // Standard Error: 24_849 + .saturating_add(Weight::from_parts(6_304_424, 0).saturating_mul(n.into())) + // Standard Error: 24_849 + .saturating_add(Weight::from_parts(253_862, 0).saturating_mul(m.into())) + // Standard Error: 24_849 + .saturating_add(Weight::from_parts(324_295, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(4)) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) + .saturating_add(Weight::from_parts(0, 2647).saturating_mul(a.into())) .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) } /// Storage: Uniques Asset (r:1 w:1) /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) @@ -125,11 +129,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn mint() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `7749` - // Minimum execution time: 28_581 nanoseconds. - Weight::from_parts(29_011_000, 0) - .saturating_add(Weight::from_parts(0, 7749)) + // Measured: `282` + // Estimated: `10719` + // Minimum execution time: 33_245_000 picoseconds. + Weight::from_parts(33_516_000, 0) + .saturating_add(Weight::from_parts(0, 10719)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -143,11 +147,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn burn() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 29_869 nanoseconds. - Weight::from_parts(30_206_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 34_237_000 picoseconds. + Weight::from_parts(34_725_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -161,11 +165,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 23_945 nanoseconds. - Weight::from_parts(24_259_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 27_588_000 picoseconds. + Weight::from_parts(27_994_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -176,13 +180,13 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// The range of component `i` is `[0, 5000]`. fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `770 + i * (108 ±0)` - // Estimated: `2653 + i * (2597 ±0)` - // Minimum execution time: 13_847 nanoseconds. - Weight::from_parts(14_105_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) - // Standard Error: 12_887 - .saturating_add(Weight::from_parts(12_017_604, 0).saturating_mul(i.into())) + // Measured: `738 + i * (76 ±0)` + // Estimated: `4633 + i * (2597 ±0)` + // Minimum execution time: 15_958_000 picoseconds. + Weight::from_parts(16_175_000, 0) + .saturating_add(Weight::from_parts(0, 4633)) + // Standard Error: 12_904 + .saturating_add(Weight::from_parts(13_261_405, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -195,11 +199,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn freeze() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 17_259 nanoseconds. - Weight::from_parts(17_731_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 19_124_000 picoseconds. + Weight::from_parts(19_432_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -209,11 +213,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn thaw() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 16_951 nanoseconds. - Weight::from_parts(17_177_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 19_725_000 picoseconds. + Weight::from_parts(19_903_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -221,11 +225,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn freeze_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 12_733 nanoseconds. - Weight::from_parts(13_154_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 15_091_000 picoseconds. + Weight::from_parts(15_405_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -233,11 +237,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn thaw_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 12_624 nanoseconds. - Weight::from_parts(12_887_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 14_440_000 picoseconds. + Weight::from_parts(14_836_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -249,11 +253,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `5180` - // Minimum execution time: 20_089 nanoseconds. - Weight::from_parts(20_583_000, 0) - .saturating_add(Weight::from_parts(0, 5180)) + // Measured: `356` + // Estimated: `7160` + // Minimum execution time: 22_729_000 picoseconds. + Weight::from_parts(23_039_000, 0) + .saturating_add(Weight::from_parts(0, 7160)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -261,11 +265,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn set_team() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 13_647 nanoseconds. - Weight::from_parts(13_894_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 15_506_000 picoseconds. + Weight::from_parts(15_864_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -275,11 +279,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn force_item_status() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `2653` - // Minimum execution time: 16_035 nanoseconds. - Weight::from_parts(16_232_000, 0) - .saturating_add(Weight::from_parts(0, 2653)) + // Measured: `282` + // Estimated: `3643` + // Minimum execution time: 18_244_000 picoseconds. + Weight::from_parts(18_591_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -291,11 +295,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) fn set_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `623` - // Estimated: `7962` - // Minimum execution time: 33_357 nanoseconds. - Weight::from_parts(34_794_000, 0) - .saturating_add(Weight::from_parts(0, 7962)) + // Measured: `559` + // Estimated: `10932` + // Minimum execution time: 37_528_000 picoseconds. + Weight::from_parts(38_282_000, 0) + .saturating_add(Weight::from_parts(0, 10932)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -307,11 +311,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Attribute (max_values: None, max_size: Some(172), added: 2647, mode: MaxEncodedLen) fn clear_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `851` - // Estimated: `7962` - // Minimum execution time: 32_496 nanoseconds. - Weight::from_parts(33_068_000, 0) - .saturating_add(Weight::from_parts(0, 7962)) + // Measured: `756` + // Estimated: `10932` + // Minimum execution time: 36_654_000 picoseconds. + Weight::from_parts(36_947_000, 0) + .saturating_add(Weight::from_parts(0, 10932)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -321,11 +325,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) fn set_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `380` - // Estimated: `5315` - // Minimum execution time: 25_557 nanoseconds. - Weight::from_parts(25_923_000, 0) - .saturating_add(Weight::from_parts(0, 5315)) + // Measured: `348` + // Estimated: `7295` + // Minimum execution time: 29_703_000 picoseconds. + Weight::from_parts(30_032_000, 0) + .saturating_add(Weight::from_parts(0, 7295)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -335,11 +339,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques InstanceMetadataOf (max_values: None, max_size: Some(187), added: 2662, mode: MaxEncodedLen) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `623` - // Estimated: `5315` - // Minimum execution time: 26_147 nanoseconds. - Weight::from_parts(26_386_000, 0) - .saturating_add(Weight::from_parts(0, 5315)) + // Measured: `559` + // Estimated: `7295` + // Minimum execution time: 29_941_000 picoseconds. + Weight::from_parts(30_222_000, 0) + .saturating_add(Weight::from_parts(0, 7295)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -349,11 +353,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassMetadataOf (max_values: None, max_size: Some(167), added: 2642, mode: MaxEncodedLen) fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `5295` - // Minimum execution time: 25_233 nanoseconds. - Weight::from_parts(25_665_000, 0) - .saturating_add(Weight::from_parts(0, 5295)) + // Measured: `282` + // Estimated: `7275` + // Minimum execution time: 28_466_000 picoseconds. + Weight::from_parts(29_037_000, 0) + .saturating_add(Weight::from_parts(0, 7275)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -363,11 +367,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ClassMetadataOf (max_values: None, max_size: Some(167), added: 2642, mode: MaxEncodedLen) fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `537` - // Estimated: `5295` - // Minimum execution time: 24_311 nanoseconds. - Weight::from_parts(24_544_000, 0) - .saturating_add(Weight::from_parts(0, 5295)) + // Measured: `473` + // Estimated: `7275` + // Minimum execution time: 27_072_000 picoseconds. + Weight::from_parts(27_514_000, 0) + .saturating_add(Weight::from_parts(0, 7275)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -377,11 +381,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) fn approve_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `492` - // Estimated: `5250` - // Minimum execution time: 18_197 nanoseconds. - Weight::from_parts(18_442_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `428` + // Estimated: `7230` + // Minimum execution time: 20_791_000 picoseconds. + Weight::from_parts(21_072_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -391,11 +395,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) fn cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `525` - // Estimated: `5250` - // Minimum execution time: 18_606 nanoseconds. - Weight::from_parts(19_032_000, 0) - .saturating_add(Weight::from_parts(0, 5250)) + // Measured: `461` + // Estimated: `7230` + // Minimum execution time: 20_467_000 picoseconds. + Weight::from_parts(20_842_000, 0) + .saturating_add(Weight::from_parts(0, 7230)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -404,10 +408,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_accept_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `2527` - // Minimum execution time: 14_902 nanoseconds. - Weight::from_parts(15_216_000, 0) - .saturating_add(Weight::from_parts(0, 2527)) + // Estimated: `3517` + // Minimum execution time: 16_836_000 picoseconds. + Weight::from_parts(17_418_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -417,11 +421,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Class (max_values: None, max_size: Some(178), added: 2653, mode: MaxEncodedLen) fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `5152` - // Minimum execution time: 15_771 nanoseconds. - Weight::from_parts(16_013_000, 0) - .saturating_add(Weight::from_parts(0, 5152)) + // Measured: `282` + // Estimated: `7132` + // Minimum execution time: 17_721_000 picoseconds. + Weight::from_parts(18_109_000, 0) + .saturating_add(Weight::from_parts(0, 7132)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -431,11 +435,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn set_price() -> Weight { // Proof Size summary in bytes: - // Measured: `291` - // Estimated: `2597` - // Minimum execution time: 15_703 nanoseconds. - Weight::from_parts(15_905_000, 0) - .saturating_add(Weight::from_parts(0, 2597)) + // Measured: `259` + // Estimated: `3587` + // Minimum execution time: 17_599_000 picoseconds. + Weight::from_parts(17_802_000, 0) + .saturating_add(Weight::from_parts(0, 3587)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -449,11 +453,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// Proof: Uniques Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn buy_item() -> Weight { // Proof Size summary in bytes: - // Measured: `636` - // Estimated: `7814` - // Minimum execution time: 33_712 nanoseconds. - Weight::from_parts(34_365_000, 0) - .saturating_add(Weight::from_parts(0, 7814)) + // Measured: `540` + // Estimated: `10784` + // Minimum execution time: 38_642_000 picoseconds. + Weight::from_parts(39_168_000, 0) + .saturating_add(Weight::from_parts(0, 10784)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs index a7fbd58a87d..76db89d9078 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -52,18 +52,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_171 nanoseconds. - Weight::from_parts(14_264_475, 0) + // Minimum execution time: 6_995_000 picoseconds. + Weight::from_parts(19_761_796, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_826 - .saturating_add(Weight::from_parts(4_102_412, 0).saturating_mul(c.into())) + // Standard Error: 3_672 + .saturating_add(Weight::from_parts(4_682_116, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_750 nanoseconds. - Weight::from_parts(4_872_000, 0) + // Minimum execution time: 5_549_000 picoseconds. + Weight::from_parts(5_723_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +71,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_448 nanoseconds. - Weight::from_parts(20_274_161, 0) + // Minimum execution time: 7_210_000 picoseconds. + Weight::from_parts(15_002_117, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 4_587 - .saturating_add(Weight::from_parts(4_321_327, 0).saturating_mul(c.into())) + // Standard Error: 2_199 + .saturating_add(Weight::from_parts(4_917_852, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_092 nanoseconds. - Weight::from_parts(8_417_000, 0) + // Minimum execution time: 9_596_000 picoseconds. + Weight::from_parts(9_875_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +90,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_410 nanoseconds. - Weight::from_parts(19_538_670, 0) + // Minimum execution time: 7_024_000 picoseconds. + Weight::from_parts(15_781_473, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 4_387 - .saturating_add(Weight::from_parts(4_098_456, 0).saturating_mul(c.into())) + // Standard Error: 2_344 + .saturating_add(Weight::from_parts(4_665_530, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs index 65a8649c5b5..12b4dd66653 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -60,10 +60,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `4830` - // Minimum execution time: 26_692 nanoseconds. - Weight::from_parts(27_382_000, 0) - .saturating_add(Weight::from_parts(0, 4830)) + // Estimated: `9780` + // Minimum execution time: 28_019_000 picoseconds. + Weight::from_parts(29_053_000, 0) + .saturating_add(Weight::from_parts(0, 9780)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -72,10 +72,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn teleport_assets() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `499` - // Minimum execution time: 22_056 nanoseconds. - Weight::from_parts(22_401_000, 0) - .saturating_add(Weight::from_parts(0, 499)) + // Estimated: `1489` + // Minimum execution time: 24_127_000 picoseconds. + Weight::from_parts(24_609_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: ParachainInfo ParachainId (r:1 w:0) @@ -83,18 +83,18 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn reserve_transfer_assets() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `499` - // Minimum execution time: 16_901 nanoseconds. - Weight::from_parts(17_262_000, 0) - .saturating_add(Weight::from_parts(0, 499)) + // Estimated: `1489` + // Minimum execution time: 18_826_000 picoseconds. + Weight::from_parts(19_183_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } fn execute() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_467 nanoseconds. - Weight::from_parts(8_708_000, 0) + // Minimum execution time: 9_865_000 picoseconds. + Weight::from_parts(10_129_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: PolkadotXcm SupportedVersion (r:0 w:1) @@ -103,8 +103,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_532 nanoseconds. - Weight::from_parts(8_766_000, 0) + // Minimum execution time: 9_995_000 picoseconds. + Weight::from_parts(10_290_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -114,8 +114,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_399 nanoseconds. - Weight::from_parts(2_586_000, 0) + // Minimum execution time: 3_144_000 picoseconds. + Weight::from_parts(3_225_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -138,10 +138,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `8025` - // Minimum execution time: 30_956 nanoseconds. - Weight::from_parts(31_602_000, 0) - .saturating_add(Weight::from_parts(0, 8025)) + // Estimated: `14955` + // Minimum execution time: 33_946_000 picoseconds. + Weight::from_parts(34_595_000, 0) + .saturating_add(Weight::from_parts(0, 14955)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -162,10 +162,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `257` - // Estimated: `8729` - // Minimum execution time: 33_283 nanoseconds. - Weight::from_parts(34_433_000, 0) - .saturating_add(Weight::from_parts(0, 8729)) + // Estimated: `14669` + // Minimum execution time: 34_408_000 picoseconds. + Weight::from_parts(34_845_000, 0) + .saturating_add(Weight::from_parts(0, 14669)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -174,10 +174,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: // Measured: `129` - // Estimated: `10029` - // Minimum execution time: 17_349 nanoseconds. - Weight::from_parts(18_701_000, 0) - .saturating_add(Weight::from_parts(0, 10029)) + // Estimated: `11019` + // Minimum execution time: 17_219_000 picoseconds. + Weight::from_parts(17_552_000, 0) + .saturating_add(Weight::from_parts(0, 11019)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -186,10 +186,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: // Measured: `133` - // Estimated: `10033` - // Minimum execution time: 18_574 nanoseconds. - Weight::from_parts(19_071_000, 0) - .saturating_add(Weight::from_parts(0, 10033)) + // Estimated: `11023` + // Minimum execution time: 17_382_000 picoseconds. + Weight::from_parts(17_791_000, 0) + .saturating_add(Weight::from_parts(0, 11023)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -198,10 +198,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `140` - // Estimated: `12515` - // Minimum execution time: 22_520 nanoseconds. - Weight::from_parts(23_083_000, 0) - .saturating_add(Weight::from_parts(0, 12515)) + // Estimated: `13505` + // Minimum execution time: 18_051_000 picoseconds. + Weight::from_parts(18_643_000, 0) + .saturating_add(Weight::from_parts(0, 13505)) .saturating_add(T::DbWeight::get().reads(5)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) @@ -219,10 +219,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `142` - // Estimated: `10257` - // Minimum execution time: 39_510 nanoseconds. - Weight::from_parts(40_272_000, 0) - .saturating_add(Weight::from_parts(0, 10257)) + // Estimated: `16197` + // Minimum execution time: 33_113_000 picoseconds. + Weight::from_parts(34_048_000, 0) + .saturating_add(Weight::from_parts(0, 16197)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -231,10 +231,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `172` - // Estimated: `7597` - // Minimum execution time: 11_057 nanoseconds. - Weight::from_parts(11_408_000, 0) - .saturating_add(Weight::from_parts(0, 7597)) + // Estimated: `8587` + // Minimum execution time: 9_569_000 picoseconds. + Weight::from_parts(9_933_000, 0) + .saturating_add(Weight::from_parts(0, 8587)) .saturating_add(T::DbWeight::get().reads(3)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) @@ -242,10 +242,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: // Measured: `140` - // Estimated: `10040` - // Minimum execution time: 22_914 nanoseconds. - Weight::from_parts(23_231_000, 0) - .saturating_add(Weight::from_parts(0, 10040)) + // Estimated: `11030` + // Minimum execution time: 19_098_000 picoseconds. + Weight::from_parts(19_550_000, 0) + .saturating_add(Weight::from_parts(0, 11030)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -264,10 +264,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `146` - // Estimated: `15231` - // Minimum execution time: 47_637 nanoseconds. - Weight::from_parts(48_179_000, 0) - .saturating_add(Weight::from_parts(0, 15231)) + // Estimated: `21171` + // Minimum execution time: 40_365_000 picoseconds. + Weight::from_parts(41_092_000, 0) + .saturating_add(Weight::from_parts(0, 21171)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index bbaef6c16ec..66f6bd713d5 100644 --- a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,27 +17,26 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./templates/xcm-bench-template.hbs +// --chain=westmint-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::fungible -// --chain=westmint-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/assets/westmint/src/weights/xcm/ +// --output=./parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -55,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 37_770_000 picoseconds. - Weight::from_parts(38_616_000, 3593) + // Minimum execution time: 22_591_000 picoseconds. + Weight::from_parts(23_052_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -66,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 33_080_000 picoseconds. - Weight::from_parts(33_350_000, 6196) + // Minimum execution time: 32_036_000 picoseconds. + Weight::from_parts(32_396_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -89,8 +88,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `176` // Estimated: `17970` - // Minimum execution time: 94_868_000 picoseconds. - Weight::from_parts(95_349_000, 17970) + // Minimum execution time: 58_331_000 picoseconds. + Weight::from_parts(59_048_000, 17970) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -98,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_378_000 picoseconds. - Weight::from_parts(4_471_000, 0) + // Minimum execution time: 4_474_000 picoseconds. + Weight::from_parts(4_577_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -107,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 25_401_000 picoseconds. - Weight::from_parts(25_744_000, 3593) + // Minimum execution time: 28_611_000 picoseconds. + Weight::from_parts(28_992_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -130,8 +129,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `14862` - // Minimum execution time: 54_166_000 picoseconds. - Weight::from_parts(54_680_000, 14862) + // Minimum execution time: 57_179_000 picoseconds. + Weight::from_parts(58_149_000, 14862) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -151,8 +150,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `11269` - // Minimum execution time: 34_063_000 picoseconds. - Weight::from_parts(34_404_000, 11269) + // Minimum execution time: 30_477_000 picoseconds. + Weight::from_parts(30_841_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 1da9e6ecca4..67c2b083f89 100644 --- a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,27 +17,26 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./templates/xcm-bench-template.hbs +// --chain=westmint-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --chain=westmint-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/assets/westmint/src/weights/xcm/ +// --output=./parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -65,8 +64,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `11269` - // Minimum execution time: 366_645_000 picoseconds. - Weight::from_parts(368_433_000, 11269) + // Minimum execution time: 355_263_000 picoseconds. + Weight::from_parts(357_327_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -74,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_034_000 picoseconds. - Weight::from_parts(4_167_000, 0) + // Minimum execution time: 4_068_000 picoseconds. + Weight::from_parts(4_273_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -83,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `69` // Estimated: `3534` - // Minimum execution time: 11_582_000 picoseconds. - Weight::from_parts(11_769_000, 3534) + // Minimum execution time: 11_279_000 picoseconds. + Weight::from_parts(11_626_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_412_000 picoseconds. - Weight::from_parts(13_744_000, 0) + // Minimum execution time: 13_246_000 picoseconds. + Weight::from_parts(13_425_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_363_000 picoseconds. - Weight::from_parts(7_435_000, 0) + // Minimum execution time: 4_426_000 picoseconds. + Weight::from_parts(4_600_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_950_000 picoseconds. - Weight::from_parts(3_067_000, 0) + // Minimum execution time: 2_838_000 picoseconds. + Weight::from_parts(2_921_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_024_000 picoseconds. - Weight::from_parts(3_077_000, 0) + // Minimum execution time: 2_858_000 picoseconds. + Weight::from_parts(2_981_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_962_000 picoseconds. - Weight::from_parts(3_034_000, 0) + // Minimum execution time: 2_848_000 picoseconds. + Weight::from_parts(2_922_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_660_000 picoseconds. - Weight::from_parts(5_745_000, 0) + // Minimum execution time: 3_732_000 picoseconds. + Weight::from_parts(3_801_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_934_000 picoseconds. - Weight::from_parts(3_053_000, 0) + // Minimum execution time: 2_882_000 picoseconds. + Weight::from_parts(2_971_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -152,8 +151,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `11269` - // Minimum execution time: 25_725_000 picoseconds. - Weight::from_parts(26_363_000, 11269) + // Minimum execution time: 25_538_000 picoseconds. + Weight::from_parts(25_964_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -163,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `126` // Estimated: `3591` - // Minimum execution time: 16_532_000 picoseconds. - Weight::from_parts(16_751_000, 3591) + // Minimum execution time: 16_187_000 picoseconds. + Weight::from_parts(16_478_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -172,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_902_000 picoseconds. - Weight::from_parts(3_028_000, 0) + // Minimum execution time: 2_804_000 picoseconds. + Weight::from_parts(2_874_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -191,8 +190,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `13320` - // Minimum execution time: 47_079_000 picoseconds. - Weight::from_parts(47_483_000, 13320) + // Minimum execution time: 28_208_000 picoseconds. + Weight::from_parts(28_512_000, 13320) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -202,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_275_000 picoseconds. - Weight::from_parts(5_381_000, 0) + // Minimum execution time: 5_021_000 picoseconds. + Weight::from_parts(5_128_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -222,8 +221,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `11269` - // Minimum execution time: 411_960_000 picoseconds. - Weight::from_parts(422_231_000, 11269) + // Minimum execution time: 403_561_000 picoseconds. + Weight::from_parts(404_798_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -231,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 128_264_000 picoseconds. - Weight::from_parts(129_704_000, 0) + // Minimum execution time: 122_646_000 picoseconds. + Weight::from_parts(123_057_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_474_000 picoseconds. - Weight::from_parts(12_684_000, 0) + // Minimum execution time: 13_916_000 picoseconds. + Weight::from_parts(14_178_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_005_000 picoseconds. - Weight::from_parts(3_157_000, 0) + // Minimum execution time: 3_025_000 picoseconds. + Weight::from_parts(3_083_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_737_000 picoseconds. - Weight::from_parts(4_777_000, 0) + // Minimum execution time: 2_879_000 picoseconds. + Weight::from_parts(2_947_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_126_000 picoseconds. - Weight::from_parts(3_195_000, 0) + // Minimum execution time: 3_067_000 picoseconds. + Weight::from_parts(3_129_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -278,8 +277,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `11269` - // Minimum execution time: 30_134_000 picoseconds. - Weight::from_parts(30_412_000, 11269) + // Minimum execution time: 29_511_000 picoseconds. + Weight::from_parts(29_922_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -287,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_087_000 picoseconds. - Weight::from_parts(10_289_000, 0) + // Minimum execution time: 5_410_000 picoseconds. + Weight::from_parts(5_531_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -306,8 +305,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `11269` - // Minimum execution time: 26_158_000 picoseconds. - Weight::from_parts(26_668_000, 11269) + // Minimum execution time: 26_044_000 picoseconds. + Weight::from_parts(26_397_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -315,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_035_000 picoseconds. - Weight::from_parts(3_172_000, 0) + // Minimum execution time: 2_950_000 picoseconds. + Weight::from_parts(2_989_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_687_000 picoseconds. - Weight::from_parts(4_738_000, 0) + // Minimum execution time: 2_877_000 picoseconds. + Weight::from_parts(2_928_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_976_000 picoseconds. - Weight::from_parts(3_113_000, 0) + // Minimum execution time: 2_884_000 picoseconds. + Weight::from_parts(2_959_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_918_000 picoseconds. - Weight::from_parts(3_033_000, 0) + // Minimum execution time: 2_733_000 picoseconds. + Weight::from_parts(2_862_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_191_000 picoseconds. - Weight::from_parts(3_257_000, 0) + // Minimum execution time: 2_917_000 picoseconds. + Weight::from_parts(2_990_000, 0) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs index 8f8db4b53c5..4fa7848e6ff 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -52,10 +52,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_u32() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_956 nanoseconds. - Weight::from_parts(5_247_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_373_000 picoseconds. + Weight::from_parts(5_599_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -64,10 +64,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_weight() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_875 nanoseconds. - Weight::from_parts(5_123_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_534_000 picoseconds. + Weight::from_parts(5_769_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs index 0d8b7fd939e..65925307177 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -52,22 +52,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_541 nanoseconds. - Weight::from_parts(1_600_000, 0) + // Minimum execution time: 2_314_000 picoseconds. + Weight::from_parts(2_371_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(368, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(369, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_433 nanoseconds. - Weight::from_parts(6_528_000, 0) + // Minimum execution time: 7_667_000 picoseconds. + Weight::from_parts(7_755_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_718, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_414, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -76,10 +76,10 @@ impl frame_system::WeightInfo for WeightInfo { fn set_heap_pages() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `495` - // Minimum execution time: 3_378 nanoseconds. - Weight::from_parts(3_546_000, 0) - .saturating_add(Weight::from_parts(0, 495)) + // Estimated: `1485` + // Minimum execution time: 4_135_000 picoseconds. + Weight::from_parts(4_368_000, 0) + .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -90,11 +90,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_595 nanoseconds. - Weight::from_parts(1_637_000, 0) + // Minimum execution time: 2_351_000 picoseconds. + Weight::from_parts(2_396_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_677 - .saturating_add(Weight::from_parts(581_830, 0).saturating_mul(i.into())) + // Standard Error: 1_912 + .saturating_add(Weight::from_parts(729_478, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +104,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_602 nanoseconds. - Weight::from_parts(1_645_000, 0) + // Minimum execution time: 2_417_000 picoseconds. + Weight::from_parts(2_546_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 808 - .saturating_add(Weight::from_parts(448_210, 0).saturating_mul(i.into())) + // Standard Error: 842 + .saturating_add(Weight::from_parts(542_458, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -118,11 +118,12 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `68 + p * (69 ±0)` // Estimated: `66 + p * (70 ±0)` - // Minimum execution time: 3_400 nanoseconds. - Weight::from_parts(3_518_000, 0) + // Minimum execution time: 4_324_000 picoseconds. + Weight::from_parts(4_432_000, 0) .saturating_add(Weight::from_parts(0, 66)) - // Standard Error: 949 - .saturating_add(Weight::from_parts(952_748, 0).saturating_mul(p.into())) + // Standard Error: 1_165 + .saturating_add(Weight::from_parts(1_070_662, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs index ad28ef7692c..7ea0437075a 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -51,11 +51,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_allow_death() -> Weight { // Proof Size summary in bytes: - // Measured: `1314` - // Estimated: `2603` - // Minimum execution time: 45_555 nanoseconds. - Weight::from_parts(46_097_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 34_147_000 picoseconds. + Weight::from_parts(34_681_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -63,11 +63,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: - // Measured: `1198` - // Estimated: `2603` - // Minimum execution time: 34_465 nanoseconds. - Weight::from_parts(35_054_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 25_961_000 picoseconds. + Weight::from_parts(26_543_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -75,11 +75,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_creating() -> Weight { // Proof Size summary in bytes: - // Measured: `1348` - // Estimated: `2603` - // Minimum execution time: 25_670 nanoseconds. - Weight::from_parts(26_254_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 15_954_000 picoseconds. + Weight::from_parts(16_276_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -87,11 +87,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_killing() -> Weight { // Proof Size summary in bytes: - // Measured: `1348` - // Estimated: `2603` - // Minimum execution time: 28_919 nanoseconds. - Weight::from_parts(29_611_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 19_074_000 picoseconds. + Weight::from_parts(19_635_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -99,11 +99,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `1310` - // Estimated: `5206` - // Minimum execution time: 44_604 nanoseconds. - Weight::from_parts(45_498_000, 0) - .saturating_add(Weight::from_parts(0, 5206)) + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 36_772_000 picoseconds. + Weight::from_parts(37_193_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -111,11 +111,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_all() -> Weight { // Proof Size summary in bytes: - // Measured: `1198` - // Estimated: `2603` - // Minimum execution time: 39_412 nanoseconds. - Weight::from_parts(40_181_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 32_430_000 picoseconds. + Weight::from_parts(32_766_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -126,11 +126,11 @@ impl pallet_balances::WeightInfo for WeightInfo { } fn force_unreserve() -> Weight { // Proof Size summary in bytes: - // Measured: `1232` - // Estimated: `2603` - // Minimum execution time: 22_520 nanoseconds. - Weight::from_parts(23_045_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 15_239_000 picoseconds. + Weight::from_parts(15_620_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs index 7dc16ab0f0e..37d874e0b75 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -55,12 +55,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn set_invulnerables(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `214 + b * (78 ±0)` - // Estimated: `213 + b * (2554 ±0)` - // Minimum execution time: 13_768 nanoseconds. - Weight::from_parts(15_128_018, 0) - .saturating_add(Weight::from_parts(0, 213)) - // Standard Error: 3_110 - .saturating_add(Weight::from_parts(2_490_861, 0).saturating_mul(b.into())) + // Estimated: `1203 + b * (2554 ±0)` + // Minimum execution time: 14_680_000 picoseconds. + Weight::from_parts(15_646_800, 0) + .saturating_add(Weight::from_parts(0, 1203)) + // Standard Error: 4_021 + .saturating_add(Weight::from_parts(2_556_895, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +71,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_359 nanoseconds. - Weight::from_parts(6_591_000, 0) + // Minimum execution time: 6_979_000 picoseconds. + Weight::from_parts(7_322_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +82,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_722 nanoseconds. - Weight::from_parts(6_963_000, 0) + // Minimum execution time: 7_328_000 picoseconds. + Weight::from_parts(7_524_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,13 +102,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 999]`. fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1167 + c * (48 ±0)` - // Estimated: `56785 + c * (49 ±0)` - // Minimum execution time: 35_190 nanoseconds. - Weight::from_parts(27_223_783, 0) - .saturating_add(Weight::from_parts(0, 56785)) - // Standard Error: 1_270 - .saturating_add(Weight::from_parts(103_824, 0).saturating_mul(c.into())) + // Measured: `1104 + c * (48 ±0)` + // Estimated: `61672 + c * (49 ±0)` + // Minimum execution time: 37_388_000 picoseconds. + Weight::from_parts(30_491_072, 0) + .saturating_add(Weight::from_parts(0, 61672)) + // Standard Error: 1_155 + .saturating_add(Weight::from_parts(100_794, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -120,13 +120,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[6, 1000]`. fn leave_intent(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `503 + c * (48 ±0)` - // Estimated: `48497` - // Minimum execution time: 26_271 nanoseconds. - Weight::from_parts(16_336_190, 0) - .saturating_add(Weight::from_parts(0, 48497)) - // Standard Error: 1_250 - .saturating_add(Weight::from_parts(105_123, 0).saturating_mul(c.into())) + // Measured: `428 + c * (48 ±0)` + // Estimated: `49487` + // Minimum execution time: 29_110_000 picoseconds. + Weight::from_parts(19_158_409, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_269 + .saturating_add(Weight::from_parts(104_083, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -138,11 +138,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) fn note_author() -> Weight { // Proof Size summary in bytes: - // Measured: `187` - // Estimated: `5749` - // Minimum execution time: 26_583 nanoseconds. - Weight::from_parts(26_888_000, 0) - .saturating_add(Weight::from_parts(0, 5749)) + // Measured: `155` + // Estimated: `7729` + // Minimum execution time: 29_086_000 picoseconds. + Weight::from_parts(29_931_000, 0) + .saturating_add(Weight::from_parts(0, 7729)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +160,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22878 + r * (148 ±0) + c * (97 ±0)` - // Estimated: `52737 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 16_250 nanoseconds. - Weight::from_parts(16_601_000, 0) - .saturating_add(Weight::from_parts(0, 52737)) - // Standard Error: 763_853 - .saturating_add(Weight::from_parts(27_869_355, 0).saturating_mul(c.into())) + // Measured: `22815 + r * (116 ±0) + c * (97 ±0)` + // Estimated: `56697 + r * (2602 ±0) + c * (2520 ±0)` + // Minimum execution time: 16_710_000 picoseconds. + Weight::from_parts(16_907_000, 0) + .saturating_add(Weight::from_parts(0, 56697)) + // Standard Error: 800_677 + .saturating_add(Weight::from_parts(29_001_374, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs index 0a0445094a1..56d954f12a0 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -52,11 +52,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_039 nanoseconds. - Weight::from_parts(12_378_049, 0) + // Minimum execution time: 12_068_000 picoseconds. + Weight::from_parts(12_319_883, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 1 - .saturating_add(Weight::from_parts(485, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(493, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -64,15 +64,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `314 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 35_309 nanoseconds. - Weight::from_parts(28_767_595, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 572 - .saturating_add(Weight::from_parts(73_429, 0).saturating_mul(s.into())) + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 36_523_000 picoseconds. + Weight::from_parts(31_295_135, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 542 + .saturating_add(Weight::from_parts(60_423, 0).saturating_mul(s.into())) // Standard Error: 5 - .saturating_add(Weight::from_parts(1_487, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_200, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,15 +82,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_approve(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 26_191 nanoseconds. - Weight::from_parts(19_850_530, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 440 - .saturating_add(Weight::from_parts(68_426, 0).saturating_mul(s.into())) - // Standard Error: 4 - .saturating_add(Weight::from_parts(1_505, 0).saturating_mul(z.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 27_342_000 picoseconds. + Weight::from_parts(21_614_247, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 546 + .saturating_add(Weight::from_parts(57_563, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_202, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,15 +102,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `451 + s * (33 ±0)` - // Estimated: `8424` - // Minimum execution time: 39_875 nanoseconds. - Weight::from_parts(32_057_678, 0) - .saturating_add(Weight::from_parts(0, 8424)) - // Standard Error: 715 - .saturating_add(Weight::from_parts(84_736, 0).saturating_mul(s.into())) - // Standard Error: 7 - .saturating_add(Weight::from_parts(1_511, 0).saturating_mul(z.into())) + // Measured: `388 + s * (33 ±0)` + // Estimated: `10404` + // Minimum execution time: 41_465_000 picoseconds. + Weight::from_parts(34_511_085, 0) + .saturating_add(Weight::from_parts(0, 10404)) + // Standard Error: 467 + .saturating_add(Weight::from_parts(78_918, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_201, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -119,13 +119,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `321 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 25_536 nanoseconds. - Weight::from_parts(27_146_180, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 991 - .saturating_add(Weight::from_parts(77_408, 0).saturating_mul(s.into())) + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 27_868_000 picoseconds. + Weight::from_parts(29_407_652, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 632 + .saturating_add(Weight::from_parts(69_333, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -134,13 +134,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 17_409 nanoseconds. - Weight::from_parts(18_559_189, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 518 - .saturating_add(Weight::from_parts(72_083, 0).saturating_mul(s.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 18_599_000 picoseconds. + Weight::from_parts(19_776_275, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 522 + .saturating_add(Weight::from_parts(64_680, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -149,13 +149,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `517 + s * (1 ±0)` - // Estimated: `5821` - // Minimum execution time: 26_502 nanoseconds. - Weight::from_parts(28_258_573, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 819 - .saturating_add(Weight::from_parts(78_480, 0).saturating_mul(s.into())) + // Measured: `454 + s * (1 ±0)` + // Estimated: `6811` + // Minimum execution time: 28_857_000 picoseconds. + Weight::from_parts(30_337_509, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 652 + .saturating_add(Weight::from_parts(67_443, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs index 2ec610d8eb1..bef2a83bc7c 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -54,10 +54,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `297` - // Estimated: `5544` - // Minimum execution time: 15_673 nanoseconds. - Weight::from_parts(16_101_000, 0) - .saturating_add(Weight::from_parts(0, 5544)) + // Estimated: `7524` + // Minimum execution time: 17_925_000 picoseconds. + Weight::from_parts(18_292_000, 0) + .saturating_add(Weight::from_parts(0, 7524)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +68,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `279` - // Estimated: `3033` - // Minimum execution time: 12_241 nanoseconds. - Weight::from_parts(12_552_000, 0) - .saturating_add(Weight::from_parts(0, 3033)) + // Estimated: `4023` + // Minimum execution time: 13_384_000 picoseconds. + Weight::from_parts(13_788_000, 0) + .saturating_add(Weight::from_parts(0, 4023)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs index 47ec5a76e3f..c6b5b01504f 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -54,10 +54,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `49` - // Estimated: `1006` - // Minimum execution time: 7_105 nanoseconds. - Weight::from_parts(7_296_000, 0) - .saturating_add(Weight::from_parts(0, 1006)) + // Estimated: `2986` + // Minimum execution time: 7_946_000 picoseconds. + Weight::from_parts(8_181_000, 0) + .saturating_add(Weight::from_parts(0, 2986)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_270 nanoseconds. - Weight::from_parts(3_398_000, 0) + // Minimum execution time: 3_219_000 picoseconds. + Weight::from_parts(3_298_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs index 2e3d628c32d..93eaff447ae 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -52,18 +52,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_752 nanoseconds. - Weight::from_parts(15_025_089, 0) + // Minimum execution time: 6_837_000 picoseconds. + Weight::from_parts(16_686_299, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_912 - .saturating_add(Weight::from_parts(3_735_986, 0).saturating_mul(c.into())) + // Standard Error: 3_233 + .saturating_add(Weight::from_parts(4_587_331, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_237 nanoseconds. - Weight::from_parts(4_392_000, 0) + // Minimum execution time: 5_582_000 picoseconds. + Weight::from_parts(5_700_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +71,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_645 nanoseconds. - Weight::from_parts(16_082_395, 0) + // Minimum execution time: 6_907_000 picoseconds. + Weight::from_parts(4_826_975, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_061 - .saturating_add(Weight::from_parts(3_918_503, 0).saturating_mul(c.into())) + // Standard Error: 3_801 + .saturating_add(Weight::from_parts(4_836_457, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_613 nanoseconds. - Weight::from_parts(7_868_000, 0) + // Minimum execution time: 8_998_000 picoseconds. + Weight::from_parts(9_220_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +90,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_909 nanoseconds. - Weight::from_parts(11_406_668, 0) + // Minimum execution time: 6_961_000 picoseconds. + Weight::from_parts(7_518_503, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_399 - .saturating_add(Weight::from_parts(3_759_278, 0).saturating_mul(c.into())) + // Standard Error: 3_307 + .saturating_add(Weight::from_parts(4_649_665, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs index f625acb21f0..6210755b2bd 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -60,10 +60,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `4645` - // Minimum execution time: 23_601 nanoseconds. - Weight::from_parts(24_078_000, 0) - .saturating_add(Weight::from_parts(0, 4645)) + // Estimated: `9595` + // Minimum execution time: 26_368_000 picoseconds. + Weight::from_parts(27_314_000, 0) + .saturating_add(Weight::from_parts(0, 9595)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -72,10 +72,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn teleport_assets() -> Weight { // Proof Size summary in bytes: // Measured: `32` - // Estimated: `499` - // Minimum execution time: 23_225 nanoseconds. - Weight::from_parts(23_887_000, 0) - .saturating_add(Weight::from_parts(0, 499)) + // Estimated: `1489` + // Minimum execution time: 24_998_000 picoseconds. + Weight::from_parts(25_321_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Benchmark Override (r:0 w:0) @@ -84,7 +84,7 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551 nanoseconds. + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } @@ -94,7 +94,7 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551 nanoseconds. + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } @@ -104,8 +104,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_434 nanoseconds. - Weight::from_parts(8_839_000, 0) + // Minimum execution time: 9_733_000 picoseconds. + Weight::from_parts(10_002_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -115,8 +115,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_484 nanoseconds. - Weight::from_parts(2_611_000, 0) + // Minimum execution time: 3_073_000 picoseconds. + Weight::from_parts(3_178_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -139,10 +139,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `7729` - // Minimum execution time: 28_465 nanoseconds. - Weight::from_parts(29_023_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `14659` + // Minimum execution time: 31_313_000 picoseconds. + Weight::from_parts(31_916_000, 0) + .saturating_add(Weight::from_parts(0, 14659)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -163,10 +163,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `220` - // Estimated: `8470` - // Minimum execution time: 31_086 nanoseconds. - Weight::from_parts(31_385_000, 0) - .saturating_add(Weight::from_parts(0, 8470)) + // Estimated: `14410` + // Minimum execution time: 32_721_000 picoseconds. + Weight::from_parts(33_013_000, 0) + .saturating_add(Weight::from_parts(0, 14410)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -175,10 +175,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: // Measured: `95` - // Estimated: `9995` - // Minimum execution time: 13_701 nanoseconds. - Weight::from_parts(13_987_000, 0) - .saturating_add(Weight::from_parts(0, 9995)) + // Estimated: `10985` + // Minimum execution time: 15_020_000 picoseconds. + Weight::from_parts(15_358_000, 0) + .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -187,10 +187,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: // Measured: `99` - // Estimated: `9999` - // Minimum execution time: 13_723 nanoseconds. - Weight::from_parts(14_166_000, 0) - .saturating_add(Weight::from_parts(0, 9999)) + // Estimated: `10989` + // Minimum execution time: 15_095_000 picoseconds. + Weight::from_parts(15_309_000, 0) + .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -199,10 +199,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `12481` - // Minimum execution time: 15_381 nanoseconds. - Weight::from_parts(16_770_000, 0) - .saturating_add(Weight::from_parts(0, 12481)) + // Estimated: `13471` + // Minimum execution time: 15_809_000 picoseconds. + Weight::from_parts(16_139_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) @@ -220,10 +220,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `10041` - // Minimum execution time: 27_952 nanoseconds. - Weight::from_parts(28_321_000, 0) - .saturating_add(Weight::from_parts(0, 10041)) + // Estimated: `15981` + // Minimum execution time: 28_167_000 picoseconds. + Weight::from_parts(28_747_000, 0) + .saturating_add(Weight::from_parts(0, 15981)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -232,10 +232,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `136` - // Estimated: `7561` - // Minimum execution time: 8_516 nanoseconds. - Weight::from_parts(8_922_000, 0) - .saturating_add(Weight::from_parts(0, 7561)) + // Estimated: `8551` + // Minimum execution time: 8_484_000 picoseconds. + Weight::from_parts(8_776_000, 0) + .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) @@ -243,10 +243,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `10006` - // Minimum execution time: 16_615 nanoseconds. - Weight::from_parts(17_074_000, 0) - .saturating_add(Weight::from_parts(0, 10006)) + // Estimated: `10996` + // Minimum execution time: 15_814_000 picoseconds. + Weight::from_parts(16_131_000, 0) + .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -265,10 +265,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `112` - // Estimated: `15027` - // Minimum execution time: 36_726 nanoseconds. - Weight::from_parts(37_319_000, 0) - .saturating_add(Weight::from_parts(0, 15027)) + // Estimated: `20967` + // Minimum execution time: 34_500_000 picoseconds. + Weight::from_parts(34_978_000, 0) + .saturating_add(Weight::from_parts(0, 20967)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index f2bda0d0fdf..648e0c7368a 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -19,24 +19,24 @@ //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev //! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm2`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic= +// --template=./templates/xcm-bench-template.hbs +// --chain=bridge-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 // --pallet=pallet_xcm_benchmarks::fungible -// --chain=bridge-hub-kusama-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/ +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 22_950_000 picoseconds. - Weight::from_parts(23_170_000, 3593) + // Minimum execution time: 19_924_000 picoseconds. + Weight::from_parts(20_322_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `153` // Estimated: `6196` - // Minimum execution time: 48_472_000 picoseconds. - Weight::from_parts(49_063_000, 6196) + // Minimum execution time: 32_669_000 picoseconds. + Weight::from_parts(33_313_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -88,8 +88,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `223` // Estimated: `18205` - // Minimum execution time: 71_887_000 picoseconds. - Weight::from_parts(73_047_000, 18205) + // Minimum execution time: 55_574_000 picoseconds. + Weight::from_parts(56_148_000, 18205) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_215_000 picoseconds. - Weight::from_parts(4_324_000, 0) + // Minimum execution time: 4_271_000 picoseconds. + Weight::from_parts(4_338_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `52` // Estimated: `3593` - // Minimum execution time: 26_047_000 picoseconds. - Weight::from_parts(26_386_000, 3593) + // Minimum execution time: 23_972_000 picoseconds. + Weight::from_parts(24_305_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -129,8 +129,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `122` // Estimated: `15097` - // Minimum execution time: 51_076_000 picoseconds. - Weight::from_parts(51_638_000, 15097) + // Minimum execution time: 53_095_000 picoseconds. + Weight::from_parts(53_586_000, 15097) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -150,8 +150,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 28_242_000 picoseconds. - Weight::from_parts(28_778_000, 11244) + // Minimum execution time: 30_394_000 picoseconds. + Weight::from_parts(31_238_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 06d99ecdc55..738940ca868 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,27 +17,26 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./templates/xcm-bench-template.hbs +// --chain=bridge-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --chain=bridge-hub-kusama-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/ +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -65,8 +64,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 32_352_000 picoseconds. - Weight::from_parts(32_888_000, 11244) + // Minimum execution time: 30_841_000 picoseconds. + Weight::from_parts(31_223_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -74,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_953_000 picoseconds. - Weight::from_parts(3_074_000, 0) + // Minimum execution time: 2_749_000 picoseconds. + Weight::from_parts(2_894_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -83,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 10_911_000 picoseconds. - Weight::from_parts(11_165_000, 3497) + // Minimum execution time: 10_637_000 picoseconds. + Weight::from_parts(10_904_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_130_000 picoseconds. - Weight::from_parts(13_550_000, 0) + // Minimum execution time: 12_587_000 picoseconds. + Weight::from_parts(12_882_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_254_000 picoseconds. - Weight::from_parts(3_371_000, 0) + // Minimum execution time: 3_088_000 picoseconds. + Weight::from_parts(3_165_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_729_000 picoseconds. - Weight::from_parts(4_785_000, 0) + // Minimum execution time: 2_748_000 picoseconds. + Weight::from_parts(2_868_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_686_000 picoseconds. - Weight::from_parts(4_740_000, 0) + // Minimum execution time: 2_897_000 picoseconds. + Weight::from_parts(2_970_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_921_000 picoseconds. - Weight::from_parts(3_038_000, 0) + // Minimum execution time: 2_793_000 picoseconds. + Weight::from_parts(2_883_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_927_000 picoseconds. - Weight::from_parts(4_046_000, 0) + // Minimum execution time: 3_690_000 picoseconds. + Weight::from_parts(3_745_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_990_000 picoseconds. - Weight::from_parts(3_109_000, 0) + // Minimum execution time: 2_760_000 picoseconds. + Weight::from_parts(2_807_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -152,8 +151,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 25_335_000 picoseconds. - Weight::from_parts(25_862_000, 11244) + // Minimum execution time: 24_591_000 picoseconds. + Weight::from_parts(25_237_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -163,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 15_097_000 picoseconds. - Weight::from_parts(15_401_000, 3555) + // Minimum execution time: 14_596_000 picoseconds. + Weight::from_parts(15_010_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -172,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_693_000 picoseconds. - Weight::from_parts(4_750_000, 0) + // Minimum execution time: 2_770_000 picoseconds. + Weight::from_parts(2_860_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -191,8 +190,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `13098` - // Minimum execution time: 26_630_000 picoseconds. - Weight::from_parts(27_169_000, 13098) + // Minimum execution time: 25_644_000 picoseconds. + Weight::from_parts(26_269_000, 13098) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -202,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_050_000 picoseconds. - Weight::from_parts(5_304_000, 0) + // Minimum execution time: 4_969_000 picoseconds. + Weight::from_parts(5_167_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -222,8 +221,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 28_942_000 picoseconds. - Weight::from_parts(29_475_000, 11244) + // Minimum execution time: 27_894_000 picoseconds. + Weight::from_parts(28_294_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -231,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_736_000 picoseconds. - Weight::from_parts(4_871_000, 0) + // Minimum execution time: 4_595_000 picoseconds. + Weight::from_parts(4_709_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_127_000 picoseconds. - Weight::from_parts(3_217_000, 0) + // Minimum execution time: 2_957_000 picoseconds. + Weight::from_parts(3_035_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_972_000 picoseconds. - Weight::from_parts(3_073_000, 0) + // Minimum execution time: 3_091_000 picoseconds. + Weight::from_parts(3_197_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_737_000 picoseconds. - Weight::from_parts(4_810_000, 0) + // Minimum execution time: 2_953_000 picoseconds. + Weight::from_parts(3_036_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_166_000 picoseconds. - Weight::from_parts(3_240_000, 0) + // Minimum execution time: 3_275_000 picoseconds. + Weight::from_parts(3_382_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -278,8 +277,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 44_516_000 picoseconds. - Weight::from_parts(45_018_000, 11244) + // Minimum execution time: 30_240_000 picoseconds. + Weight::from_parts(30_533_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -287,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_137_000 picoseconds. - Weight::from_parts(5_289_000, 0) + // Minimum execution time: 5_276_000 picoseconds. + Weight::from_parts(5_363_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -306,8 +305,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 25_978_000 picoseconds. - Weight::from_parts(26_490_000, 11244) + // Minimum execution time: 27_019_000 picoseconds. + Weight::from_parts(27_675_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -315,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_018_000 picoseconds. - Weight::from_parts(3_148_000, 0) + // Minimum execution time: 3_136_000 picoseconds. + Weight::from_parts(3_210_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_667_000 picoseconds. - Weight::from_parts(4_737_000, 0) + // Minimum execution time: 2_989_000 picoseconds. + Weight::from_parts(3_067_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_955_000 picoseconds. - Weight::from_parts(3_018_000, 0) + // Minimum execution time: 3_004_000 picoseconds. + Weight::from_parts(3_101_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_008_000 picoseconds. - Weight::from_parts(3_113_000, 0) + // Minimum execution time: 2_996_000 picoseconds. + Weight::from_parts(3_068_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_137_000 picoseconds. - Weight::from_parts(3_230_000, 0) + // Minimum execution time: 3_102_000 picoseconds. + Weight::from_parts(3_210_000, 0) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs index 9ef3bbf0e06..77de70742ca 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -52,10 +52,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_u32() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_798 nanoseconds. - Weight::from_parts(5_139_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_593_000 picoseconds. + Weight::from_parts(5_728_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -64,10 +64,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_weight() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_942 nanoseconds. - Weight::from_parts(5_056_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_432_000 picoseconds. + Weight::from_parts(5_592_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs index 996fbc01dc8..6560a1546a5 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -52,22 +52,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_628 nanoseconds. - Weight::from_parts(1_691_000, 0) + // Minimum execution time: 2_129_000 picoseconds. + Weight::from_parts(2_213_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(369, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(370, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_332 nanoseconds. - Weight::from_parts(6_564_000, 0) + // Minimum execution time: 7_415_000 picoseconds. + Weight::from_parts(7_510_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_714, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_412, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -76,10 +76,10 @@ impl frame_system::WeightInfo for WeightInfo { fn set_heap_pages() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `495` - // Minimum execution time: 3_441 nanoseconds. - Weight::from_parts(3_684_000, 0) - .saturating_add(Weight::from_parts(0, 495)) + // Estimated: `1485` + // Minimum execution time: 4_227_000 picoseconds. + Weight::from_parts(4_495_000, 0) + .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -90,11 +90,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_698 nanoseconds. - Weight::from_parts(1_802_000, 0) + // Minimum execution time: 2_349_000 picoseconds. + Weight::from_parts(2_381_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_738 - .saturating_add(Weight::from_parts(576_825, 0).saturating_mul(i.into())) + // Standard Error: 1_813 + .saturating_add(Weight::from_parts(685_377, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +104,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_782 nanoseconds. - Weight::from_parts(1_826_000, 0) + // Minimum execution time: 2_250_000 picoseconds. + Weight::from_parts(2_317_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 808 - .saturating_add(Weight::from_parts(446_795, 0).saturating_mul(i.into())) + // Standard Error: 911 + .saturating_add(Weight::from_parts(494_503, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -118,11 +118,12 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `68 + p * (69 ±0)` // Estimated: `66 + p * (70 ±0)` - // Minimum execution time: 3_444 nanoseconds. - Weight::from_parts(3_538_000, 0) + // Minimum execution time: 4_239_000 picoseconds. + Weight::from_parts(4_380_000, 0) .saturating_add(Weight::from_parts(0, 66)) - // Standard Error: 920 - .saturating_add(Weight::from_parts(950_898, 0).saturating_mul(p.into())) + // Standard Error: 1_255 + .saturating_add(Weight::from_parts(1_012_115, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs index 12aceb95985..a6547ab46fb 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -51,11 +51,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_allow_death() -> Weight { // Proof Size summary in bytes: - // Measured: `1316` - // Estimated: `2603` - // Minimum execution time: 44_427 nanoseconds. - Weight::from_parts(45_164_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 35_006_000 picoseconds. + Weight::from_parts(35_375_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -63,11 +63,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: - // Measured: `1200` - // Estimated: `2603` - // Minimum execution time: 34_287 nanoseconds. - Weight::from_parts(34_918_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 25_755_000 picoseconds. + Weight::from_parts(26_176_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -75,11 +75,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_creating() -> Weight { // Proof Size summary in bytes: - // Measured: `1350` - // Estimated: `2603` - // Minimum execution time: 25_850 nanoseconds. - Weight::from_parts(26_521_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 15_651_000 picoseconds. + Weight::from_parts(16_056_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -87,11 +87,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_killing() -> Weight { // Proof Size summary in bytes: - // Measured: `1350` - // Estimated: `2603` - // Minimum execution time: 29_118 nanoseconds. - Weight::from_parts(29_706_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 18_932_000 picoseconds. + Weight::from_parts(19_186_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -99,11 +99,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `1312` - // Estimated: `5206` - // Minimum execution time: 45_010 nanoseconds. - Weight::from_parts(45_568_000, 0) - .saturating_add(Weight::from_parts(0, 5206)) + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 36_593_000 picoseconds. + Weight::from_parts(36_971_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -111,11 +111,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_all() -> Weight { // Proof Size summary in bytes: - // Measured: `1200` - // Estimated: `2603` - // Minimum execution time: 39_332 nanoseconds. - Weight::from_parts(40_015_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 31_795_000 picoseconds. + Weight::from_parts(32_237_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -126,11 +126,11 @@ impl pallet_balances::WeightInfo for WeightInfo { } fn force_unreserve() -> Weight { // Proof Size summary in bytes: - // Measured: `1234` - // Estimated: `2603` - // Minimum execution time: 22_710 nanoseconds. - Weight::from_parts(23_111_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 15_120_000 picoseconds. + Weight::from_parts(15_360_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs index 6140c4de67d..5c35eff5f53 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -55,12 +55,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn set_invulnerables(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `214 + b * (78 ±0)` - // Estimated: `213 + b * (2554 ±0)` - // Minimum execution time: 13_937 nanoseconds. - Weight::from_parts(14_498_919, 0) - .saturating_add(Weight::from_parts(0, 213)) - // Standard Error: 2_987 - .saturating_add(Weight::from_parts(2_491_437, 0).saturating_mul(b.into())) + // Estimated: `1203 + b * (2554 ±0)` + // Minimum execution time: 14_444_000 picoseconds. + Weight::from_parts(15_006_377, 0) + .saturating_add(Weight::from_parts(0, 1203)) + // Standard Error: 2_965 + .saturating_add(Weight::from_parts(2_598_095, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +71,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_465 nanoseconds. - Weight::from_parts(6_739_000, 0) + // Minimum execution time: 6_886_000 picoseconds. + Weight::from_parts(7_053_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +82,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_624 nanoseconds. - Weight::from_parts(6_822_000, 0) + // Minimum execution time: 7_233_000 picoseconds. + Weight::from_parts(7_420_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,13 +102,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 999]`. fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1167 + c * (48 ±0)` - // Estimated: `56785 + c * (49 ±0)` - // Minimum execution time: 34_794 nanoseconds. - Weight::from_parts(27_197_409, 0) - .saturating_add(Weight::from_parts(0, 56785)) - // Standard Error: 1_259 - .saturating_add(Weight::from_parts(101_424, 0).saturating_mul(c.into())) + // Measured: `1104 + c * (48 ±0)` + // Estimated: `61672 + c * (49 ±0)` + // Minimum execution time: 37_455_000 picoseconds. + Weight::from_parts(29_651_534, 0) + .saturating_add(Weight::from_parts(0, 61672)) + // Standard Error: 1_287 + .saturating_add(Weight::from_parts(103_531, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -120,13 +120,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[6, 1000]`. fn leave_intent(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `503 + c * (48 ±0)` - // Estimated: `48497` - // Minimum execution time: 26_471 nanoseconds. - Weight::from_parts(16_092_836, 0) - .saturating_add(Weight::from_parts(0, 48497)) - // Standard Error: 1_283 - .saturating_add(Weight::from_parts(103_788, 0).saturating_mul(c.into())) + // Measured: `428 + c * (48 ±0)` + // Estimated: `49487` + // Minimum execution time: 29_548_000 picoseconds. + Weight::from_parts(18_882_873, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_273 + .saturating_add(Weight::from_parts(105_000, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -138,11 +138,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) fn note_author() -> Weight { // Proof Size summary in bytes: - // Measured: `187` - // Estimated: `5749` - // Minimum execution time: 25_597 nanoseconds. - Weight::from_parts(25_981_000, 0) - .saturating_add(Weight::from_parts(0, 5749)) + // Measured: `155` + // Estimated: `7729` + // Minimum execution time: 28_960_000 picoseconds. + Weight::from_parts(29_435_000, 0) + .saturating_add(Weight::from_parts(0, 7729)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +160,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22878 + r * (148 ±0) + c * (97 ±0)` - // Estimated: `52737 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 15_961 nanoseconds. - Weight::from_parts(16_207_000, 0) - .saturating_add(Weight::from_parts(0, 52737)) - // Standard Error: 748_921 - .saturating_add(Weight::from_parts(27_460_211, 0).saturating_mul(c.into())) + // Measured: `22815 + r * (116 ±0) + c * (97 ±0)` + // Estimated: `56697 + c * (2520 ±0) + r * (2602 ±0)` + // Minimum execution time: 16_727_000 picoseconds. + Weight::from_parts(16_932_000, 0) + .saturating_add(Weight::from_parts(0, 56697)) + // Standard Error: 798_306 + .saturating_add(Weight::from_parts(28_951_019, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs index aec763c0d53..9ab2d5a58a6 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -52,11 +52,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_693 nanoseconds. - Weight::from_parts(12_218_501, 0) + // Minimum execution time: 11_761_000 picoseconds. + Weight::from_parts(12_373_119, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1 - .saturating_add(Weight::from_parts(479, 0).saturating_mul(z.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(482, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -64,15 +64,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `314 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 35_181 nanoseconds. - Weight::from_parts(28_585_764, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 609 - .saturating_add(Weight::from_parts(72_658, 0).saturating_mul(s.into())) + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 36_964_000 picoseconds. + Weight::from_parts(31_553_347, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 571 + .saturating_add(Weight::from_parts(62_042, 0).saturating_mul(s.into())) // Standard Error: 5 - .saturating_add(Weight::from_parts(1_476, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_178, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,15 +82,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_approve(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 26_110 nanoseconds. - Weight::from_parts(19_809_417, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 448 - .saturating_add(Weight::from_parts(69_542, 0).saturating_mul(s.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 27_113_000 picoseconds. + Weight::from_parts(21_794_796, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 423 + .saturating_add(Weight::from_parts(59_156, 0).saturating_mul(s.into())) // Standard Error: 4 - .saturating_add(Weight::from_parts(1_514, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_193, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,15 +102,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `451 + s * (33 ±0)` - // Estimated: `8424` - // Minimum execution time: 39_991 nanoseconds. - Weight::from_parts(31_329_529, 0) - .saturating_add(Weight::from_parts(0, 8424)) - // Standard Error: 567 - .saturating_add(Weight::from_parts(90_826, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_527, 0).saturating_mul(z.into())) + // Measured: `388 + s * (33 ±0)` + // Estimated: `10404` + // Minimum execution time: 41_979_000 picoseconds. + Weight::from_parts(34_970_639, 0) + .saturating_add(Weight::from_parts(0, 10404)) + // Standard Error: 481 + .saturating_add(Weight::from_parts(76_814, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_191, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -119,13 +119,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `321 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 25_124 nanoseconds. - Weight::from_parts(26_655_548, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 743 - .saturating_add(Weight::from_parts(78_904, 0).saturating_mul(s.into())) + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 28_113_000 picoseconds. + Weight::from_parts(29_657_007, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 746 + .saturating_add(Weight::from_parts(67_176, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -134,13 +134,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 16_950 nanoseconds. - Weight::from_parts(18_308_894, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 676 - .saturating_add(Weight::from_parts(71_574, 0).saturating_mul(s.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 19_227_000 picoseconds. + Weight::from_parts(20_043_765, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 1_458 + .saturating_add(Weight::from_parts(70_065, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -149,13 +149,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `517 + s * (1 ±0)` - // Estimated: `5821` - // Minimum execution time: 26_127 nanoseconds. - Weight::from_parts(27_889_146, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 729 - .saturating_add(Weight::from_parts(78_618, 0).saturating_mul(s.into())) + // Measured: `454 + s * (1 ±0)` + // Estimated: `6811` + // Minimum execution time: 29_358_000 picoseconds. + Weight::from_parts(30_953_779, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 662 + .saturating_add(Weight::from_parts(62_100, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs index 9008424b30b..cd7f40253b5 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -54,10 +54,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `297` - // Estimated: `5544` - // Minimum execution time: 15_314 nanoseconds. - Weight::from_parts(15_944_000, 0) - .saturating_add(Weight::from_parts(0, 5544)) + // Estimated: `7524` + // Minimum execution time: 17_305_000 picoseconds. + Weight::from_parts(17_673_000, 0) + .saturating_add(Weight::from_parts(0, 7524)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +68,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `279` - // Estimated: `3033` - // Minimum execution time: 11_831 nanoseconds. - Weight::from_parts(12_113_000, 0) - .saturating_add(Weight::from_parts(0, 3033)) + // Estimated: `4023` + // Minimum execution time: 13_593_000 picoseconds. + Weight::from_parts(13_826_000, 0) + .saturating_add(Weight::from_parts(0, 4023)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs index 0d1f0325958..b22fe963f12 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -54,10 +54,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `49` - // Estimated: `1006` - // Minimum execution time: 6_885 nanoseconds. - Weight::from_parts(7_281_000, 0) - .saturating_add(Weight::from_parts(0, 1006)) + // Estimated: `2986` + // Minimum execution time: 7_665_000 picoseconds. + Weight::from_parts(7_892_000, 0) + .saturating_add(Weight::from_parts(0, 2986)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_222 nanoseconds. - Weight::from_parts(3_321_000, 0) + // Minimum execution time: 3_226_000 picoseconds. + Weight::from_parts(3_339_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs index a88680f69c5..34c36b874a1 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -52,18 +52,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_910 nanoseconds. - Weight::from_parts(5_269_110, 0) + // Minimum execution time: 7_083_000 picoseconds. + Weight::from_parts(13_037_767, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_509 - .saturating_add(Weight::from_parts(3_869_188, 0).saturating_mul(c.into())) + // Standard Error: 3_155 + .saturating_add(Weight::from_parts(4_503_244, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_304 nanoseconds. - Weight::from_parts(4_463_000, 0) + // Minimum execution time: 5_705_000 picoseconds. + Weight::from_parts(5_799_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +71,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_985 nanoseconds. - Weight::from_parts(10_119_502, 0) + // Minimum execution time: 7_248_000 picoseconds. + Weight::from_parts(14_495_670, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_585 - .saturating_add(Weight::from_parts(4_063_211, 0).saturating_mul(c.into())) + // Standard Error: 3_240 + .saturating_add(Weight::from_parts(4_790_508, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_746 nanoseconds. - Weight::from_parts(8_027_000, 0) + // Minimum execution time: 9_355_000 picoseconds. + Weight::from_parts(9_596_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +90,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_082 nanoseconds. - Weight::from_parts(10_385_233, 0) + // Minimum execution time: 6_985_000 picoseconds. + Weight::from_parts(17_435_570, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_217 - .saturating_add(Weight::from_parts(3_855_940, 0).saturating_mul(c.into())) + // Standard Error: 3_165 + .saturating_add(Weight::from_parts(4_492_577, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs index c1d015a2442..db01f989e76 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -60,10 +60,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `4645` - // Minimum execution time: 24_136 nanoseconds. - Weight::from_parts(24_562_000, 0) - .saturating_add(Weight::from_parts(0, 4645)) + // Estimated: `9595` + // Minimum execution time: 25_890_000 picoseconds. + Weight::from_parts(26_601_000, 0) + .saturating_add(Weight::from_parts(0, 9595)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -72,10 +72,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn teleport_assets() -> Weight { // Proof Size summary in bytes: // Measured: `32` - // Estimated: `499` - // Minimum execution time: 23_272 nanoseconds. - Weight::from_parts(23_644_000, 0) - .saturating_add(Weight::from_parts(0, 499)) + // Estimated: `1489` + // Minimum execution time: 24_961_000 picoseconds. + Weight::from_parts(25_332_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Benchmark Override (r:0 w:0) @@ -84,7 +84,7 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551 nanoseconds. + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } @@ -94,7 +94,7 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551 nanoseconds. + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } @@ -104,8 +104,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_377 nanoseconds. - Weight::from_parts(8_642_000, 0) + // Minimum execution time: 9_662_000 picoseconds. + Weight::from_parts(9_844_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -115,8 +115,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_435 nanoseconds. - Weight::from_parts(2_556_000, 0) + // Minimum execution time: 2_994_000 picoseconds. + Weight::from_parts(3_160_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -139,10 +139,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `7729` - // Minimum execution time: 28_539 nanoseconds. - Weight::from_parts(29_177_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `14659` + // Minimum execution time: 31_632_000 picoseconds. + Weight::from_parts(31_919_000, 0) + .saturating_add(Weight::from_parts(0, 14659)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -163,10 +163,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `220` - // Estimated: `8470` - // Minimum execution time: 30_607 nanoseconds. - Weight::from_parts(31_019_000, 0) - .saturating_add(Weight::from_parts(0, 8470)) + // Estimated: `14410` + // Minimum execution time: 32_570_000 picoseconds. + Weight::from_parts(33_292_000, 0) + .saturating_add(Weight::from_parts(0, 14410)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -175,10 +175,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: // Measured: `95` - // Estimated: `9995` - // Minimum execution time: 13_842 nanoseconds. - Weight::from_parts(14_281_000, 0) - .saturating_add(Weight::from_parts(0, 9995)) + // Estimated: `10985` + // Minimum execution time: 14_829_000 picoseconds. + Weight::from_parts(15_171_000, 0) + .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -187,10 +187,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: // Measured: `99` - // Estimated: `9999` - // Minimum execution time: 13_505 nanoseconds. - Weight::from_parts(13_981_000, 0) - .saturating_add(Weight::from_parts(0, 9999)) + // Estimated: `10989` + // Minimum execution time: 14_774_000 picoseconds. + Weight::from_parts(15_232_000, 0) + .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -199,10 +199,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `12481` - // Minimum execution time: 16_415 nanoseconds. - Weight::from_parts(16_752_000, 0) - .saturating_add(Weight::from_parts(0, 12481)) + // Estimated: `13471` + // Minimum execution time: 15_289_000 picoseconds. + Weight::from_parts(15_543_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) @@ -220,10 +220,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `10041` - // Minimum execution time: 29_952 nanoseconds. - Weight::from_parts(30_592_000, 0) - .saturating_add(Weight::from_parts(0, 10041)) + // Estimated: `15981` + // Minimum execution time: 27_849_000 picoseconds. + Weight::from_parts(28_243_000, 0) + .saturating_add(Weight::from_parts(0, 15981)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -232,10 +232,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `136` - // Estimated: `7561` - // Minimum execution time: 8_259 nanoseconds. - Weight::from_parts(8_608_000, 0) - .saturating_add(Weight::from_parts(0, 7561)) + // Estimated: `8551` + // Minimum execution time: 8_260_000 picoseconds. + Weight::from_parts(8_477_000, 0) + .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) @@ -243,10 +243,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `10006` - // Minimum execution time: 16_259 nanoseconds. - Weight::from_parts(16_574_000, 0) - .saturating_add(Weight::from_parts(0, 10006)) + // Estimated: `10996` + // Minimum execution time: 15_132_000 picoseconds. + Weight::from_parts(15_581_000, 0) + .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -265,10 +265,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `112` - // Estimated: `15027` - // Minimum execution time: 35_748 nanoseconds. - Weight::from_parts(36_667_000, 0) - .saturating_add(Weight::from_parts(0, 15027)) + // Estimated: `20967` + // Minimum execution time: 34_016_000 picoseconds. + Weight::from_parts(34_627_000, 0) + .saturating_add(Weight::from_parts(0, 20967)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index a7527f00baf..16110f554b2 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -19,24 +19,24 @@ //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev //! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm2`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic= +// --template=./templates/xcm-bench-template.hbs +// --chain=bridge-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 // --pallet=pallet_xcm_benchmarks::fungible -// --chain=bridge-hub-polkadot-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/ +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 22_155_000 picoseconds. - Weight::from_parts(22_991_000, 3593) + // Minimum execution time: 20_647_000 picoseconds. + Weight::from_parts(20_978_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `153` // Estimated: `6196` - // Minimum execution time: 48_986_000 picoseconds. - Weight::from_parts(49_467_000, 6196) + // Minimum execution time: 32_995_000 picoseconds. + Weight::from_parts(33_365_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -88,8 +88,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `223` // Estimated: `18205` - // Minimum execution time: 72_291_000 picoseconds. - Weight::from_parts(72_898_000, 18205) + // Minimum execution time: 56_568_000 picoseconds. + Weight::from_parts(57_462_000, 18205) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_225_000 picoseconds. - Weight::from_parts(4_328_000, 0) + // Minimum execution time: 4_070_000 picoseconds. + Weight::from_parts(4_200_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `52` // Estimated: `3593` - // Minimum execution time: 26_357_000 picoseconds. - Weight::from_parts(26_841_000, 3593) + // Minimum execution time: 24_036_000 picoseconds. + Weight::from_parts(24_587_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -129,8 +129,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `122` // Estimated: `15097` - // Minimum execution time: 50_981_000 picoseconds. - Weight::from_parts(51_488_000, 15097) + // Minimum execution time: 49_836_000 picoseconds. + Weight::from_parts(50_507_000, 15097) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -150,8 +150,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 28_333_000 picoseconds. - Weight::from_parts(28_863_000, 11244) + // Minimum execution time: 28_353_000 picoseconds. + Weight::from_parts(29_151_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 44bd54ab174..f8320dad59b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,27 +17,26 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./templates/xcm-bench-template.hbs +// --chain=bridge-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --chain=bridge-hub-polkadot-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/ +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -65,8 +64,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 47_079_000 picoseconds. - Weight::from_parts(47_477_000, 11244) + // Minimum execution time: 30_983_000 picoseconds. + Weight::from_parts(31_396_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -74,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_810_000 picoseconds. - Weight::from_parts(4_856_000, 0) + // Minimum execution time: 2_966_000 picoseconds. + Weight::from_parts(3_066_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -83,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 11_148_000 picoseconds. - Weight::from_parts(17_709_000, 3497) + // Minimum execution time: 11_159_000 picoseconds. + Weight::from_parts(11_390_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_942_000 picoseconds. - Weight::from_parts(13_226_000, 0) + // Minimum execution time: 12_987_000 picoseconds. + Weight::from_parts(13_337_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_413_000 picoseconds. - Weight::from_parts(3_490_000, 0) + // Minimum execution time: 3_107_000 picoseconds. + Weight::from_parts(3_182_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_110_000 picoseconds. - Weight::from_parts(3_144_000, 0) + // Minimum execution time: 2_957_000 picoseconds. + Weight::from_parts(3_022_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_038_000 picoseconds. - Weight::from_parts(3_118_000, 0) + // Minimum execution time: 2_979_000 picoseconds. + Weight::from_parts(3_088_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_044_000 picoseconds. - Weight::from_parts(4_700_000, 0) + // Minimum execution time: 2_934_000 picoseconds. + Weight::from_parts(2_989_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_936_000 picoseconds. - Weight::from_parts(4_039_000, 0) + // Minimum execution time: 3_817_000 picoseconds. + Weight::from_parts(3_898_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_070_000 picoseconds. - Weight::from_parts(3_286_000, 0) + // Minimum execution time: 3_021_000 picoseconds. + Weight::from_parts(3_083_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -152,8 +151,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 25_430_000 picoseconds. - Weight::from_parts(25_714_000, 11244) + // Minimum execution time: 25_036_000 picoseconds. + Weight::from_parts(25_379_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -163,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 15_180_000 picoseconds. - Weight::from_parts(24_431_000, 3555) + // Minimum execution time: 15_074_000 picoseconds. + Weight::from_parts(15_310_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -172,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_682_000 picoseconds. - Weight::from_parts(4_753_000, 0) + // Minimum execution time: 2_996_000 picoseconds. + Weight::from_parts(3_040_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -191,8 +190,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `13098` - // Minimum execution time: 26_337_000 picoseconds. - Weight::from_parts(26_730_000, 13098) + // Minimum execution time: 26_142_000 picoseconds. + Weight::from_parts(26_578_000, 13098) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -202,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_260_000 picoseconds. - Weight::from_parts(5_417_000, 0) + // Minimum execution time: 5_216_000 picoseconds. + Weight::from_parts(5_304_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -222,8 +221,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 28_590_000 picoseconds. - Weight::from_parts(28_931_000, 11244) + // Minimum execution time: 28_236_000 picoseconds. + Weight::from_parts(28_614_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -231,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_745_000 picoseconds. - Weight::from_parts(4_853_000, 0) + // Minimum execution time: 4_701_000 picoseconds. + Weight::from_parts(4_783_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_214_000 picoseconds. - Weight::from_parts(3_276_000, 0) + // Minimum execution time: 3_121_000 picoseconds. + Weight::from_parts(3_177_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_779_000 picoseconds. - Weight::from_parts(4_824_000, 0) + // Minimum execution time: 3_106_000 picoseconds. + Weight::from_parts(3_343_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_986_000 picoseconds. - Weight::from_parts(3_098_000, 0) + // Minimum execution time: 3_151_000 picoseconds. + Weight::from_parts(3_226_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_272_000 picoseconds. - Weight::from_parts(3_351_000, 0) + // Minimum execution time: 3_362_000 picoseconds. + Weight::from_parts(3_453_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -278,8 +277,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 28_219_000 picoseconds. - Weight::from_parts(28_796_000, 11244) + // Minimum execution time: 30_472_000 picoseconds. + Weight::from_parts(30_906_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -287,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_023_000 picoseconds. - Weight::from_parts(5_108_000, 0) + // Minimum execution time: 5_383_000 picoseconds. + Weight::from_parts(5_496_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -306,8 +305,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 25_253_000 picoseconds. - Weight::from_parts(25_685_000, 11244) + // Minimum execution time: 26_946_000 picoseconds. + Weight::from_parts(27_774_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -315,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_085_000 picoseconds. - Weight::from_parts(3_135_000, 0) + // Minimum execution time: 3_192_000 picoseconds. + Weight::from_parts(3_262_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_099_000 picoseconds. - Weight::from_parts(3_147_000, 0) + // Minimum execution time: 3_129_000 picoseconds. + Weight::from_parts(3_199_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_101_000 picoseconds. - Weight::from_parts(3_174_000, 0) + // Minimum execution time: 3_156_000 picoseconds. + Weight::from_parts(3_202_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_034_000 picoseconds. - Weight::from_parts(3_118_000, 0) + // Minimum execution time: 3_114_000 picoseconds. + Weight::from_parts(3_208_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_156_000 picoseconds. - Weight::from_parts(3_254_000, 0) + // Minimum execution time: 3_315_000 picoseconds. + Weight::from_parts(3_374_000, 0) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs index 5b1d95701e3..638e1354d91 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -52,10 +52,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_u32() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_865 nanoseconds. - Weight::from_parts(5_007_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_434_000 picoseconds. + Weight::from_parts(5_663_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -64,10 +64,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_weight() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_893 nanoseconds. - Weight::from_parts(5_198_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_301_000 picoseconds. + Weight::from_parts(5_415_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs index 612ff1690fb..ed5e6270415 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -52,22 +52,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_592 nanoseconds. - Weight::from_parts(679_524, 0) + // Minimum execution time: 2_311_000 picoseconds. + Weight::from_parts(2_347_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(367, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(370, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_673 nanoseconds. - Weight::from_parts(6_751_000, 0) + // Minimum execution time: 7_875_000 picoseconds. + Weight::from_parts(7_972_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_715, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_410, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -76,10 +76,10 @@ impl frame_system::WeightInfo for WeightInfo { fn set_heap_pages() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `495` - // Minimum execution time: 3_408 nanoseconds. - Weight::from_parts(3_633_000, 0) - .saturating_add(Weight::from_parts(0, 495)) + // Estimated: `1485` + // Minimum execution time: 4_309_000 picoseconds. + Weight::from_parts(4_457_000, 0) + .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -90,11 +90,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_727 nanoseconds. - Weight::from_parts(1_753_000, 0) + // Minimum execution time: 2_526_000 picoseconds. + Weight::from_parts(2_564_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_876 - .saturating_add(Weight::from_parts(581_935, 0).saturating_mul(i.into())) + // Standard Error: 1_869 + .saturating_add(Weight::from_parts(678_765, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +104,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_743 nanoseconds. - Weight::from_parts(1_769_000, 0) + // Minimum execution time: 2_526_000 picoseconds. + Weight::from_parts(2_603_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 803 - .saturating_add(Weight::from_parts(446_779, 0).saturating_mul(i.into())) + // Standard Error: 899 + .saturating_add(Weight::from_parts(497_948, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -118,11 +118,12 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `68 + p * (69 ±0)` // Estimated: `66 + p * (70 ±0)` - // Minimum execution time: 3_536 nanoseconds. - Weight::from_parts(3_649_000, 0) + // Minimum execution time: 4_280_000 picoseconds. + Weight::from_parts(4_398_000, 0) .saturating_add(Weight::from_parts(0, 66)) - // Standard Error: 949 - .saturating_add(Weight::from_parts(986_632, 0).saturating_mul(p.into())) + // Standard Error: 1_108 + .saturating_add(Weight::from_parts(1_011_188, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs index 4d364d79ba3..5b57a5b7b4d 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -51,11 +51,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_allow_death() -> Weight { // Proof Size summary in bytes: - // Measured: `1314` - // Estimated: `2603` - // Minimum execution time: 47_893 nanoseconds. - Weight::from_parts(48_384_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 35_746_000 picoseconds. + Weight::from_parts(36_167_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -63,11 +63,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: - // Measured: `1198` - // Estimated: `2603` - // Minimum execution time: 35_027 nanoseconds. - Weight::from_parts(35_675_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 26_301_000 picoseconds. + Weight::from_parts(26_847_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -75,11 +75,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_creating() -> Weight { // Proof Size summary in bytes: - // Measured: `1348` - // Estimated: `2603` - // Minimum execution time: 26_009 nanoseconds. - Weight::from_parts(26_448_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 16_073_000 picoseconds. + Weight::from_parts(16_292_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -87,11 +87,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_killing() -> Weight { // Proof Size summary in bytes: - // Measured: `1348` - // Estimated: `2603` - // Minimum execution time: 30_006 nanoseconds. - Weight::from_parts(30_501_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 19_589_000 picoseconds. + Weight::from_parts(20_034_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -99,11 +99,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `1310` - // Estimated: `5206` - // Minimum execution time: 46_787 nanoseconds. - Weight::from_parts(47_700_000, 0) - .saturating_add(Weight::from_parts(0, 5206)) + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 37_416_000 picoseconds. + Weight::from_parts(37_894_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -111,11 +111,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_all() -> Weight { // Proof Size summary in bytes: - // Measured: `1198` - // Estimated: `2603` - // Minimum execution time: 43_890 nanoseconds. - Weight::from_parts(44_914_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 32_565_000 picoseconds. + Weight::from_parts(33_087_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -126,11 +126,11 @@ impl pallet_balances::WeightInfo for WeightInfo { } fn force_unreserve() -> Weight { // Proof Size summary in bytes: - // Measured: `1232` - // Estimated: `2603` - // Minimum execution time: 26_785 nanoseconds. - Weight::from_parts(27_404_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 15_291_000 picoseconds. + Weight::from_parts(15_614_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs index dcf8f3170b5..cf4ee2028f7 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -55,12 +55,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn set_invulnerables(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `214 + b * (78 ±0)` - // Estimated: `213 + b * (2554 ±0)` - // Minimum execution time: 14_254 nanoseconds. - Weight::from_parts(15_028_628, 0) - .saturating_add(Weight::from_parts(0, 213)) - // Standard Error: 3_094 - .saturating_add(Weight::from_parts(2_490_219, 0).saturating_mul(b.into())) + // Estimated: `1203 + b * (2554 ±0)` + // Minimum execution time: 14_833_000 picoseconds. + Weight::from_parts(15_349_415, 0) + .saturating_add(Weight::from_parts(0, 1203)) + // Standard Error: 3_477 + .saturating_add(Weight::from_parts(2_639_530, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +71,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_548 nanoseconds. - Weight::from_parts(6_775_000, 0) + // Minimum execution time: 7_190_000 picoseconds. + Weight::from_parts(7_558_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +82,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_922 nanoseconds. - Weight::from_parts(7_184_000, 0) + // Minimum execution time: 7_435_000 picoseconds. + Weight::from_parts(7_790_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,13 +102,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 999]`. fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1167 + c * (48 ±0)` - // Estimated: `56785 + c * (49 ±0)` - // Minimum execution time: 35_329 nanoseconds. - Weight::from_parts(27_879_325, 0) - .saturating_add(Weight::from_parts(0, 56785)) - // Standard Error: 1_269 - .saturating_add(Weight::from_parts(108_458, 0).saturating_mul(c.into())) + // Measured: `1104 + c * (48 ±0)` + // Estimated: `61672 + c * (49 ±0)` + // Minimum execution time: 38_999_000 picoseconds. + Weight::from_parts(31_254_595, 0) + .saturating_add(Weight::from_parts(0, 61672)) + // Standard Error: 1_266 + .saturating_add(Weight::from_parts(108_612, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -120,13 +120,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[6, 1000]`. fn leave_intent(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `503 + c * (48 ±0)` - // Estimated: `48497` - // Minimum execution time: 27_322 nanoseconds. - Weight::from_parts(16_354_913, 0) - .saturating_add(Weight::from_parts(0, 48497)) - // Standard Error: 1_399 - .saturating_add(Weight::from_parts(108_840, 0).saturating_mul(c.into())) + // Measured: `428 + c * (48 ±0)` + // Estimated: `49487` + // Minimum execution time: 29_894_000 picoseconds. + Weight::from_parts(19_491_329, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_328 + .saturating_add(Weight::from_parts(109_217, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -138,11 +138,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) fn note_author() -> Weight { // Proof Size summary in bytes: - // Measured: `187` - // Estimated: `5749` - // Minimum execution time: 26_074 nanoseconds. - Weight::from_parts(26_574_000, 0) - .saturating_add(Weight::from_parts(0, 5749)) + // Measured: `155` + // Estimated: `7729` + // Minimum execution time: 29_666_000 picoseconds. + Weight::from_parts(30_017_000, 0) + .saturating_add(Weight::from_parts(0, 7729)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +160,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22878 + r * (148 ±0) + c * (97 ±0)` - // Estimated: `52737 + r * (2602 ±0) + c * (2519 ±0)` - // Minimum execution time: 15_727 nanoseconds. - Weight::from_parts(16_001_000, 0) - .saturating_add(Weight::from_parts(0, 52737)) - // Standard Error: 792_964 - .saturating_add(Weight::from_parts(28_827_951, 0).saturating_mul(c.into())) + // Measured: `22815 + r * (116 ±0) + c * (97 ±0)` + // Estimated: `56697 + r * (2602 ±0) + c * (2520 ±0)` + // Minimum execution time: 17_009_000 picoseconds. + Weight::from_parts(17_119_000, 0) + .saturating_add(Weight::from_parts(0, 56697)) + // Standard Error: 839_085 + .saturating_add(Weight::from_parts(30_312_617, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs index c39e4a6bd31..df58cf7952a 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -52,11 +52,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_903 nanoseconds. - Weight::from_parts(12_398_025, 0) + // Minimum execution time: 12_203_000 picoseconds. + Weight::from_parts(12_687_394, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1 - .saturating_add(Weight::from_parts(550, 0).saturating_mul(z.into())) + // Standard Error: 2 + .saturating_add(Weight::from_parts(556, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -64,15 +64,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `314 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 35_780 nanoseconds. - Weight::from_parts(29_310_705, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 602 - .saturating_add(Weight::from_parts(70_837, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_545, 0).saturating_mul(z.into())) + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 37_793_000 picoseconds. + Weight::from_parts(32_841_866, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 973 + .saturating_add(Weight::from_parts(64_271, 0).saturating_mul(s.into())) + // Standard Error: 9 + .saturating_add(Weight::from_parts(1_189, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,15 +82,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_approve(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 26_552 nanoseconds. - Weight::from_parts(19_998_713, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 711 - .saturating_add(Weight::from_parts(72_463, 0).saturating_mul(s.into())) - // Standard Error: 6 - .saturating_add(Weight::from_parts(1_573, 0).saturating_mul(z.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 27_835_000 picoseconds. + Weight::from_parts(22_419_199, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 535 + .saturating_add(Weight::from_parts(59_729, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_259, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,15 +102,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `451 + s * (33 ±0)` - // Estimated: `8424` - // Minimum execution time: 40_836 nanoseconds. - Weight::from_parts(32_275_692, 0) - .saturating_add(Weight::from_parts(0, 8424)) - // Standard Error: 673 - .saturating_add(Weight::from_parts(92_895, 0).saturating_mul(s.into())) - // Standard Error: 6 - .saturating_add(Weight::from_parts(1_569, 0).saturating_mul(z.into())) + // Measured: `388 + s * (33 ±0)` + // Estimated: `10404` + // Minimum execution time: 43_060_000 picoseconds. + Weight::from_parts(36_326_276, 0) + .saturating_add(Weight::from_parts(0, 10404)) + // Standard Error: 497 + .saturating_add(Weight::from_parts(76_443, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_257, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -119,13 +119,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `321 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 26_440 nanoseconds. - Weight::from_parts(27_434_937, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 725 - .saturating_add(Weight::from_parts(80_283, 0).saturating_mul(s.into())) + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 29_242_000 picoseconds. + Weight::from_parts(30_673_516, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 651 + .saturating_add(Weight::from_parts(67_820, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -134,13 +134,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 17_335 nanoseconds. - Weight::from_parts(18_873_349, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 490 - .saturating_add(Weight::from_parts(74_017, 0).saturating_mul(s.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 19_344_000 picoseconds. + Weight::from_parts(20_956_909, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 781 + .saturating_add(Weight::from_parts(65_374, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -149,13 +149,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `517 + s * (1 ±0)` - // Estimated: `5821` - // Minimum execution time: 26_731 nanoseconds. - Weight::from_parts(28_534_422, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 740 - .saturating_add(Weight::from_parts(78_223, 0).saturating_mul(s.into())) + // Measured: `454 + s * (1 ±0)` + // Estimated: `6811` + // Minimum execution time: 30_222_000 picoseconds. + Weight::from_parts(31_457_558, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 648 + .saturating_add(Weight::from_parts(67_068, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs index 136f7ec532e..67883fab331 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -54,10 +54,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `297` - // Estimated: `5544` - // Minimum execution time: 15_721 nanoseconds. - Weight::from_parts(16_081_000, 0) - .saturating_add(Weight::from_parts(0, 5544)) + // Estimated: `7524` + // Minimum execution time: 17_590_000 picoseconds. + Weight::from_parts(18_134_000, 0) + .saturating_add(Weight::from_parts(0, 7524)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +68,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `279` - // Estimated: `3033` - // Minimum execution time: 12_031 nanoseconds. - Weight::from_parts(12_339_000, 0) - .saturating_add(Weight::from_parts(0, 3033)) + // Estimated: `4023` + // Minimum execution time: 13_479_000 picoseconds. + Weight::from_parts(13_956_000, 0) + .saturating_add(Weight::from_parts(0, 4023)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs index d3db098c7f7..7be7f6691f0 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -54,10 +54,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `49` - // Estimated: `1006` - // Minimum execution time: 7_216 nanoseconds. - Weight::from_parts(7_445_000, 0) - .saturating_add(Weight::from_parts(0, 1006)) + // Estimated: `2986` + // Minimum execution time: 7_610_000 picoseconds. + Weight::from_parts(7_887_000, 0) + .saturating_add(Weight::from_parts(0, 2986)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_181 nanoseconds. - Weight::from_parts(3_322_000, 0) + // Minimum execution time: 3_100_000 picoseconds. + Weight::from_parts(3_180_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs index ad7c0b79161..2420a70d1fb 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -52,18 +52,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_179 nanoseconds. - Weight::from_parts(19_315_482, 0) + // Minimum execution time: 7_051_000 picoseconds. + Weight::from_parts(10_722_806, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_383 - .saturating_add(Weight::from_parts(4_126_811, 0).saturating_mul(c.into())) + // Standard Error: 4_213 + .saturating_add(Weight::from_parts(4_992_366, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_474 nanoseconds. - Weight::from_parts(4_666_000, 0) + // Minimum execution time: 5_831_000 picoseconds. + Weight::from_parts(6_014_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +71,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_210 nanoseconds. - Weight::from_parts(12_190_913, 0) + // Minimum execution time: 7_394_000 picoseconds. + Weight::from_parts(15_396_332, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_328 - .saturating_add(Weight::from_parts(4_370_533, 0).saturating_mul(c.into())) + // Standard Error: 3_533 + .saturating_add(Weight::from_parts(5_302_383, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_194 nanoseconds. - Weight::from_parts(8_300_000, 0) + // Minimum execution time: 9_730_000 picoseconds. + Weight::from_parts(9_988_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +90,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_207 nanoseconds. - Weight::from_parts(9_704_236, 0) + // Minimum execution time: 7_395_000 picoseconds. + Weight::from_parts(14_933_943, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 4_155 - .saturating_add(Weight::from_parts(4_130_222, 0).saturating_mul(c.into())) + // Standard Error: 3_208 + .saturating_add(Weight::from_parts(4_963_051, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs index d640aa27a07..6472867bfbc 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -60,10 +60,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `4645` - // Minimum execution time: 25_656 nanoseconds. - Weight::from_parts(25_942_000, 0) - .saturating_add(Weight::from_parts(0, 4645)) + // Estimated: `9595` + // Minimum execution time: 27_429_000 picoseconds. + Weight::from_parts(28_626_000, 0) + .saturating_add(Weight::from_parts(0, 9595)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -72,10 +72,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn teleport_assets() -> Weight { // Proof Size summary in bytes: // Measured: `32` - // Estimated: `499` - // Minimum execution time: 26_559 nanoseconds. - Weight::from_parts(27_040_000, 0) - .saturating_add(Weight::from_parts(0, 499)) + // Estimated: `1489` + // Minimum execution time: 27_626_000 picoseconds. + Weight::from_parts(28_561_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Benchmark Override (r:0 w:0) @@ -84,7 +84,7 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551 nanoseconds. + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } @@ -94,7 +94,7 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551 nanoseconds. + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } @@ -104,8 +104,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_204 nanoseconds. - Weight::from_parts(9_400_000, 0) + // Minimum execution time: 10_264_000 picoseconds. + Weight::from_parts(10_601_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -115,8 +115,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_652 nanoseconds. - Weight::from_parts(2_790_000, 0) + // Minimum execution time: 3_218_000 picoseconds. + Weight::from_parts(3_311_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -139,10 +139,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `7729` - // Minimum execution time: 29_636 nanoseconds. - Weight::from_parts(30_041_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `14659` + // Minimum execution time: 33_037_000 picoseconds. + Weight::from_parts(33_559_000, 0) + .saturating_add(Weight::from_parts(0, 14659)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -163,10 +163,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `220` - // Estimated: `8470` - // Minimum execution time: 31_854 nanoseconds. - Weight::from_parts(32_416_000, 0) - .saturating_add(Weight::from_parts(0, 8470)) + // Estimated: `14410` + // Minimum execution time: 34_280_000 picoseconds. + Weight::from_parts(34_943_000, 0) + .saturating_add(Weight::from_parts(0, 14410)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -175,10 +175,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: // Measured: `95` - // Estimated: `9995` - // Minimum execution time: 13_994 nanoseconds. - Weight::from_parts(14_361_000, 0) - .saturating_add(Weight::from_parts(0, 9995)) + // Estimated: `10985` + // Minimum execution time: 15_106_000 picoseconds. + Weight::from_parts(15_383_000, 0) + .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -187,10 +187,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: // Measured: `99` - // Estimated: `9999` - // Minimum execution time: 14_337 nanoseconds. - Weight::from_parts(14_651_000, 0) - .saturating_add(Weight::from_parts(0, 9999)) + // Estimated: `10989` + // Minimum execution time: 15_129_000 picoseconds. + Weight::from_parts(15_489_000, 0) + .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -199,10 +199,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `12481` - // Minimum execution time: 15_624 nanoseconds. - Weight::from_parts(15_936_000, 0) - .saturating_add(Weight::from_parts(0, 12481)) + // Estimated: `13471` + // Minimum execution time: 15_526_000 picoseconds. + Weight::from_parts(15_778_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) @@ -220,10 +220,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `10041` - // Minimum execution time: 26_774 nanoseconds. - Weight::from_parts(27_140_000, 0) - .saturating_add(Weight::from_parts(0, 10041)) + // Estimated: `15981` + // Minimum execution time: 29_457_000 picoseconds. + Weight::from_parts(29_970_000, 0) + .saturating_add(Weight::from_parts(0, 15981)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -232,10 +232,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `136` - // Estimated: `7561` - // Minimum execution time: 7_233 nanoseconds. - Weight::from_parts(7_487_000, 0) - .saturating_add(Weight::from_parts(0, 7561)) + // Estimated: `8551` + // Minimum execution time: 8_264_000 picoseconds. + Weight::from_parts(8_518_000, 0) + .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) @@ -243,10 +243,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `10006` - // Minimum execution time: 14_801 nanoseconds. - Weight::from_parts(15_090_000, 0) - .saturating_add(Weight::from_parts(0, 10006)) + // Estimated: `10996` + // Minimum execution time: 15_633_000 picoseconds. + Weight::from_parts(16_006_000, 0) + .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -265,10 +265,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `112` - // Estimated: `15027` - // Minimum execution time: 32_613 nanoseconds. - Weight::from_parts(32_978_000, 0) - .saturating_add(Weight::from_parts(0, 15027)) + // Estimated: `20967` + // Minimum execution time: 35_849_000 picoseconds. + Weight::from_parts(36_545_000, 0) + .saturating_add(Weight::from_parts(0, 20967)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 36bcef1cc4a..731111e358e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -19,24 +19,24 @@ //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev //! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm2`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic= +// --template=./templates/xcm-bench-template.hbs +// --chain=bridge-hub-rococo-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 // --pallet=pallet_xcm_benchmarks::fungible -// --chain=bridge-hub-rococo-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/ +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 22_222_000 picoseconds. - Weight::from_parts(22_591_000, 3593) + // Minimum execution time: 21_045_000 picoseconds. + Weight::from_parts(21_781_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `153` // Estimated: `6196` - // Minimum execution time: 47_612_000 picoseconds. - Weight::from_parts(48_901_000, 6196) + // Minimum execution time: 33_123_000 picoseconds. + Weight::from_parts(33_378_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -88,8 +88,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `223` // Estimated: `18205` - // Minimum execution time: 72_062_000 picoseconds. - Weight::from_parts(73_077_000, 18205) + // Minimum execution time: 57_689_000 picoseconds. + Weight::from_parts(58_320_000, 18205) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_363_000 picoseconds. - Weight::from_parts(4_430_000, 0) + // Minimum execution time: 4_838_000 picoseconds. + Weight::from_parts(4_906_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `52` // Estimated: `3593` - // Minimum execution time: 26_314_000 picoseconds. - Weight::from_parts(26_624_000, 3593) + // Minimum execution time: 25_197_000 picoseconds. + Weight::from_parts(25_562_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -129,8 +129,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `122` // Estimated: `15097` - // Minimum execution time: 51_846_000 picoseconds. - Weight::from_parts(52_430_000, 15097) + // Minimum execution time: 52_159_000 picoseconds. + Weight::from_parts(52_637_000, 15097) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -150,8 +150,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 28_548_000 picoseconds. - Weight::from_parts(28_880_000, 11244) + // Minimum execution time: 30_471_000 picoseconds. + Weight::from_parts(31_112_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index d3df54c32e5..8572163a52b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -19,24 +19,24 @@ //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev //! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm2`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic= +// --template=./templates/xcm-bench-template.hbs +// --chain=bridge-hub-rococo-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 // --pallet=pallet_xcm_benchmarks::generic -// --chain=bridge-hub-rococo-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --template=./templates/xcm-bench-template.hbs -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/ +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -64,8 +64,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 32_220_000 picoseconds. - Weight::from_parts(32_574_000, 11244) + // Minimum execution time: 34_238_000 picoseconds. + Weight::from_parts(34_851_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_996_000 picoseconds. - Weight::from_parts(3_070_000, 0) + // Minimum execution time: 3_358_000 picoseconds. + Weight::from_parts(3_437_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 11_181_000 picoseconds. - Weight::from_parts(11_426_000, 3497) + // Minimum execution time: 11_623_000 picoseconds. + Weight::from_parts(11_814_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_273_000 picoseconds. - Weight::from_parts(13_574_000, 0) + // Minimum execution time: 13_934_000 picoseconds. + Weight::from_parts(14_111_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_283_000 picoseconds. - Weight::from_parts(3_387_000, 0) + // Minimum execution time: 3_562_000 picoseconds. + Weight::from_parts(3_689_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_008_000 picoseconds. - Weight::from_parts(3_062_000, 0) + // Minimum execution time: 3_280_000 picoseconds. + Weight::from_parts(3_345_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_901_000 picoseconds. - Weight::from_parts(2_989_000, 0) + // Minimum execution time: 3_243_000 picoseconds. + Weight::from_parts(3_335_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_924_000 picoseconds. - Weight::from_parts(3_008_000, 0) + // Minimum execution time: 3_280_000 picoseconds. + Weight::from_parts(3_347_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_820_000 picoseconds. - Weight::from_parts(3_887_000, 0) + // Minimum execution time: 4_270_000 picoseconds. + Weight::from_parts(4_358_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_939_000 picoseconds. - Weight::from_parts(3_004_000, 0) + // Minimum execution time: 3_245_000 picoseconds. + Weight::from_parts(3_320_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -151,8 +151,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 25_166_000 picoseconds. - Weight::from_parts(25_591_000, 11244) + // Minimum execution time: 26_653_000 picoseconds. + Weight::from_parts(27_139_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 15_169_000 picoseconds. - Weight::from_parts(15_391_000, 3555) + // Minimum execution time: 15_478_000 picoseconds. + Weight::from_parts(15_763_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_909_000 picoseconds. - Weight::from_parts(3_048_000, 0) + // Minimum execution time: 3_237_000 picoseconds. + Weight::from_parts(3_314_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -190,8 +190,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `13098` - // Minimum execution time: 26_031_000 picoseconds. - Weight::from_parts(26_630_000, 13098) + // Minimum execution time: 29_098_000 picoseconds. + Weight::from_parts(29_368_000, 13098) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_011_000 picoseconds. - Weight::from_parts(5_237_000, 0) + // Minimum execution time: 6_253_000 picoseconds. + Weight::from_parts(6_467_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -221,8 +221,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 28_361_000 picoseconds. - Weight::from_parts(28_811_000, 11244) + // Minimum execution time: 35_061_000 picoseconds. + Weight::from_parts(35_510_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_542_000 picoseconds. - Weight::from_parts(4_636_000, 0) + // Minimum execution time: 6_154_000 picoseconds. + Weight::from_parts(6_266_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_041_000 picoseconds. - Weight::from_parts(3_123_000, 0) + // Minimum execution time: 4_009_000 picoseconds. + Weight::from_parts(4_088_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_004_000 picoseconds. - Weight::from_parts(3_103_000, 0) + // Minimum execution time: 3_873_000 picoseconds. + Weight::from_parts(3_996_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_976_000 picoseconds. - Weight::from_parts(3_033_000, 0) + // Minimum execution time: 3_759_000 picoseconds. + Weight::from_parts(3_820_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_116_000 picoseconds. - Weight::from_parts(3_196_000, 0) + // Minimum execution time: 3_985_000 picoseconds. + Weight::from_parts(4_132_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -277,8 +277,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 28_513_000 picoseconds. - Weight::from_parts(28_839_000, 11244) + // Minimum execution time: 34_686_000 picoseconds. + Weight::from_parts(35_233_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_977_000 picoseconds. - Weight::from_parts(5_091_000, 0) + // Minimum execution time: 6_129_000 picoseconds. + Weight::from_parts(6_244_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -305,8 +305,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `11244` - // Minimum execution time: 25_256_000 picoseconds. - Weight::from_parts(25_827_000, 11244) + // Minimum execution time: 31_502_000 picoseconds. + Weight::from_parts(32_131_000, 11244) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_979_000 picoseconds. - Weight::from_parts(3_078_000, 0) + // Minimum execution time: 3_747_000 picoseconds. + Weight::from_parts(3_832_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_939_000 picoseconds. - Weight::from_parts(3_000_000, 0) + // Minimum execution time: 3_825_000 picoseconds. + Weight::from_parts(3_857_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_832_000 picoseconds. - Weight::from_parts(2_910_000, 0) + // Minimum execution time: 3_777_000 picoseconds. + Weight::from_parts(3_868_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_901_000 picoseconds. - Weight::from_parts(2_977_000, 0) + // Minimum execution time: 3_710_000 picoseconds. + Weight::from_parts(3_820_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_031_000 picoseconds. - Weight::from_parts(3_128_000, 0) + // Minimum execution time: 3_876_000 picoseconds. + Weight::from_parts(4_012_000, 0) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs index 1d777ad3d11..0e7cf604304 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -52,10 +52,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_u32() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_808 nanoseconds. - Weight::from_parts(4_966_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_477_000 picoseconds. + Weight::from_parts(5_623_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -64,10 +64,10 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn fn set_config_with_weight() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `571` - // Minimum execution time: 5_014 nanoseconds. - Weight::from_parts(5_135_000, 0) - .saturating_add(Weight::from_parts(0, 571)) + // Estimated: `1561` + // Minimum execution time: 5_510_000 picoseconds. + Weight::from_parts(5_676_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs index 763568d1811..7bd018bd341 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -52,22 +52,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_643 nanoseconds. - Weight::from_parts(1_672_000, 0) + // Minimum execution time: 2_300_000 picoseconds. + Weight::from_parts(2_345_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(368, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(370, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_679 nanoseconds. - Weight::from_parts(6_737_000, 0) + // Minimum execution time: 8_053_000 picoseconds. + Weight::from_parts(8_155_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_714, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_414, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -76,10 +76,10 @@ impl frame_system::WeightInfo for WeightInfo { fn set_heap_pages() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `495` - // Minimum execution time: 3_675 nanoseconds. - Weight::from_parts(3_915_000, 0) - .saturating_add(Weight::from_parts(0, 495)) + // Estimated: `1485` + // Minimum execution time: 4_456_000 picoseconds. + Weight::from_parts(4_609_000, 0) + .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -90,11 +90,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_789 nanoseconds. - Weight::from_parts(1_840_000, 0) + // Minimum execution time: 2_370_000 picoseconds. + Weight::from_parts(2_403_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_081 - .saturating_add(Weight::from_parts(587_667, 0).saturating_mul(i.into())) + // Standard Error: 1_643 + .saturating_add(Weight::from_parts(676_881, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +104,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_849 nanoseconds. - Weight::from_parts(1_915_000, 0) + // Minimum execution time: 2_342_000 picoseconds. + Weight::from_parts(2_394_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 798 - .saturating_add(Weight::from_parts(446_723, 0).saturating_mul(i.into())) + // Standard Error: 917 + .saturating_add(Weight::from_parts(502_661, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -118,11 +118,12 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `68 + p * (69 ±0)` // Estimated: `69 + p * (70 ±0)` - // Minimum execution time: 3_503 nanoseconds. - Weight::from_parts(3_574_000, 0) + // Minimum execution time: 4_461_000 picoseconds. + Weight::from_parts(4_561_000, 0) .saturating_add(Weight::from_parts(0, 69)) - // Standard Error: 948 - .saturating_add(Weight::from_parts(949_091, 0).saturating_mul(p.into())) + // Standard Error: 1_428 + .saturating_add(Weight::from_parts(1_016_381, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs index 7016937d11c..f8bf9ca73dd 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_alliance` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -62,17 +62,17 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 100]`. fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `502 + m * (32 ±0) + p * (36 ±0)` - // Estimated: `10983 + m * (128 ±0) + p * (144 ±0)` - // Minimum execution time: 26_997 nanoseconds. - Weight::from_parts(28_875_691, 0) - .saturating_add(Weight::from_parts(0, 10983)) - // Standard Error: 65 - .saturating_add(Weight::from_parts(235, 0).saturating_mul(b.into())) - // Standard Error: 683 - .saturating_add(Weight::from_parts(17_740, 0).saturating_mul(m.into())) - // Standard Error: 675 - .saturating_add(Weight::from_parts(88_731, 0).saturating_mul(p.into())) + // Measured: `439 + m * (32 ±0) + p * (36 ±0)` + // Estimated: `14703 + m * (128 ±0) + p * (144 ±0)` + // Minimum execution time: 29_793_000 picoseconds. + Weight::from_parts(31_622_009, 0) + .saturating_add(Weight::from_parts(0, 14703)) + // Standard Error: 59 + .saturating_add(Weight::from_parts(194, 0).saturating_mul(b.into())) + // Standard Error: 626 + .saturating_add(Weight::from_parts(16_277, 0).saturating_mul(m.into())) + // Standard Error: 618 + .saturating_add(Weight::from_parts(115_342, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) .saturating_add(Weight::from_parts(0, 128).saturating_mul(m.into())) @@ -85,13 +85,13 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// The range of component `m` is `[5, 100]`. fn vote(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `932 + m * (64 ±0)` - // Estimated: `9092 + m * (64 ±0)` - // Minimum execution time: 23_241 nanoseconds. - Weight::from_parts(23_786_275, 0) - .saturating_add(Weight::from_parts(0, 9092)) - // Standard Error: 563 - .saturating_add(Weight::from_parts(44_164, 0).saturating_mul(m.into())) + // Measured: `868 + m * (64 ±0)` + // Estimated: `11008 + m * (64 ±0)` + // Minimum execution time: 24_860_000 picoseconds. + Weight::from_parts(25_540_583, 0) + .saturating_add(Weight::from_parts(0, 11008)) + // Standard Error: 1_049 + .saturating_add(Weight::from_parts(44_450, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) @@ -110,15 +110,15 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 100]`. fn close_early_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `438 + m * (96 ±0) + p * (36 ±0)` - // Estimated: `11067 + m * (388 ±0) + p * (144 ±0)` - // Minimum execution time: 32_551 nanoseconds. - Weight::from_parts(30_322_236, 0) - .saturating_add(Weight::from_parts(0, 11067)) - // Standard Error: 695 - .saturating_add(Weight::from_parts(44_336, 0).saturating_mul(m.into())) - // Standard Error: 678 - .saturating_add(Weight::from_parts(83_273, 0).saturating_mul(p.into())) + // Measured: `312 + m * (96 ±0) + p * (36 ±0)` + // Estimated: `14519 + m * (388 ±0) + p * (144 ±0)` + // Minimum execution time: 35_120_000 picoseconds. + Weight::from_parts(33_274_472, 0) + .saturating_add(Weight::from_parts(0, 14519)) + // Standard Error: 1_030 + .saturating_add(Weight::from_parts(41_853, 0).saturating_mul(m.into())) + // Standard Error: 1_004 + .saturating_add(Weight::from_parts(111_626, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 388).saturating_mul(m.into())) @@ -139,15 +139,15 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 100]`. fn close_early_approved(_b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `923 + m * (96 ±0) + p * (41 ±0)` - // Estimated: `15422 + m * (388 ±0) + p * (160 ±0)` - // Minimum execution time: 42_592 nanoseconds. - Weight::from_parts(42_349_696, 0) - .saturating_add(Weight::from_parts(0, 15422)) - // Standard Error: 1_776 - .saturating_add(Weight::from_parts(53_830, 0).saturating_mul(m.into())) - // Standard Error: 1_731 - .saturating_add(Weight::from_parts(94_827, 0).saturating_mul(p.into())) + // Measured: `762 + m * (96 ±0) + p * (41 ±0)` + // Estimated: `19732 + m * (388 ±0) + p * (160 ±0)` + // Minimum execution time: 47_135_000 picoseconds. + Weight::from_parts(42_191_348, 0) + .saturating_add(Weight::from_parts(0, 19732)) + // Standard Error: 4_449 + .saturating_add(Weight::from_parts(76_548, 0).saturating_mul(m.into())) + // Standard Error: 4_337 + .saturating_add(Weight::from_parts(143_406, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 388).saturating_mul(m.into())) @@ -171,19 +171,19 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 100]`. fn close_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `677 + m * (96 ±0) + p * (41 ±0)` - // Estimated: `14232 + m * (507 ±0) + p * (202 ±0)` - // Minimum execution time: 39_735 nanoseconds. - Weight::from_parts(42_276_266, 0) - .saturating_add(Weight::from_parts(0, 14232)) - // Standard Error: 3_451 - .saturating_add(Weight::from_parts(94_755, 0).saturating_mul(m.into())) - // Standard Error: 3_409 - .saturating_add(Weight::from_parts(108_485, 0).saturating_mul(p.into())) + // Measured: `518 + m * (96 ±0) + p * (41 ±0)` + // Estimated: `19135 + m * (509 ±0) + p * (203 ±0)` + // Minimum execution time: 45_329_000 picoseconds. + Weight::from_parts(46_859_108, 0) + .saturating_add(Weight::from_parts(0, 19135)) + // Standard Error: 3_831 + .saturating_add(Weight::from_parts(100_587, 0).saturating_mul(m.into())) + // Standard Error: 3_785 + .saturating_add(Weight::from_parts(134_469, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(Weight::from_parts(0, 507).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 202).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 509).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 203).saturating_mul(p.into())) } /// Storage: Alliance Members (r:1 w:0) /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) @@ -202,15 +202,15 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 100]`. fn close_approved(_b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `545 + m * (96 ±0) + p * (36 ±0)` - // Estimated: `12436 + m * (480 ±0) + p * (180 ±0)` - // Minimum execution time: 33_604 nanoseconds. - Weight::from_parts(32_382_610, 0) - .saturating_add(Weight::from_parts(0, 12436)) - // Standard Error: 564 - .saturating_add(Weight::from_parts(41_625, 0).saturating_mul(m.into())) - // Standard Error: 544 - .saturating_add(Weight::from_parts(80_954, 0).saturating_mul(p.into())) + // Measured: `417 + m * (96 ±0) + p * (36 ±0)` + // Estimated: `16746 + m * (480 ±0) + p * (180 ±0)` + // Minimum execution time: 36_795_000 picoseconds. + Weight::from_parts(35_568_715, 0) + .saturating_add(Weight::from_parts(0, 16746)) + // Standard Error: 630 + .saturating_add(Weight::from_parts(42_253, 0).saturating_mul(m.into())) + // Standard Error: 607 + .saturating_add(Weight::from_parts(107_080, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 480).saturating_mul(m.into())) @@ -225,14 +225,14 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn init_members(m: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `12` - // Estimated: `11879` - // Minimum execution time: 27_970 nanoseconds. - Weight::from_parts(16_763_631, 0) - .saturating_add(Weight::from_parts(0, 11879)) - // Standard Error: 496 - .saturating_add(Weight::from_parts(130_747, 0).saturating_mul(m.into())) - // Standard Error: 490 - .saturating_add(Weight::from_parts(112_074, 0).saturating_mul(z.into())) + // Estimated: `13859` + // Minimum execution time: 30_057_000 picoseconds. + Weight::from_parts(19_584_887, 0) + .saturating_add(Weight::from_parts(0, 13859)) + // Standard Error: 657 + .saturating_add(Weight::from_parts(127_220, 0).saturating_mul(m.into())) + // Standard Error: 649 + .saturating_add(Weight::from_parts(111_719, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -253,17 +253,17 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 50]`. fn disband(x: u32, y: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + x * (52 ±0) + y * (53 ±0) + z * (282 ±0)` - // Estimated: `31580 + x * (2590 ±0) + y * (2590 ±0) + z * (3200 ±1)` - // Minimum execution time: 221_464 nanoseconds. - Weight::from_parts(223_114_000, 0) - .saturating_add(Weight::from_parts(0, 31580)) - // Standard Error: 19_600 - .saturating_add(Weight::from_parts(471_527, 0).saturating_mul(x.into())) - // Standard Error: 19_506 - .saturating_add(Weight::from_parts(424_033, 0).saturating_mul(y.into())) - // Standard Error: 38_976 - .saturating_add(Weight::from_parts(9_666_599, 0).saturating_mul(z.into())) + // Measured: `0 + x * (52 ±0) + y * (53 ±0) + z * (250 ±0)` + // Estimated: `35354 + x * (2590 ±0) + y * (2590 ±0) + z * (3104 ±1)` + // Minimum execution time: 257_465_000 picoseconds. + Weight::from_parts(258_993_000, 0) + .saturating_add(Weight::from_parts(0, 35354)) + // Standard Error: 22_094 + .saturating_add(Weight::from_parts(469_539, 0).saturating_mul(x.into())) + // Standard Error: 21_987 + .saturating_add(Weight::from_parts(478_507, 0).saturating_mul(y.into())) + // Standard Error: 43_935 + .saturating_add(Weight::from_parts(10_541_803, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(x.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(y.into()))) @@ -272,7 +272,7 @@ impl pallet_alliance::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(z.into()))) .saturating_add(Weight::from_parts(0, 2590).saturating_mul(x.into())) .saturating_add(Weight::from_parts(0, 2590).saturating_mul(y.into())) - .saturating_add(Weight::from_parts(0, 3200).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(0, 3104).saturating_mul(z.into())) } /// Storage: Alliance Rule (r:0 w:1) /// Proof: Alliance Rule (max_values: Some(1), max_size: Some(87), added: 582, mode: MaxEncodedLen) @@ -280,8 +280,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_585 nanoseconds. - Weight::from_parts(8_746_000, 0) + // Minimum execution time: 9_973_000 picoseconds. + Weight::from_parts(10_247_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -290,10 +290,10 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn announce() -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `9197` - // Minimum execution time: 10_728 nanoseconds. - Weight::from_parts(10_974_000, 0) - .saturating_add(Weight::from_parts(0, 9197)) + // Estimated: `10187` + // Minimum execution time: 12_510_000 picoseconds. + Weight::from_parts(12_659_000, 0) + .saturating_add(Weight::from_parts(0, 10187)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -301,11 +301,11 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// Proof: Alliance Announcements (max_values: Some(1), max_size: Some(8702), added: 9197, mode: MaxEncodedLen) fn remove_announcement() -> Weight { // Proof Size summary in bytes: - // Measured: `181` - // Estimated: `9197` - // Minimum execution time: 11_751 nanoseconds. - Weight::from_parts(12_205_000, 0) - .saturating_add(Weight::from_parts(0, 9197)) + // Measured: `149` + // Estimated: `10187` + // Minimum execution time: 13_365_000 picoseconds. + Weight::from_parts(13_575_000, 0) + .saturating_add(Weight::from_parts(0, 10187)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -319,11 +319,11 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// Proof: Alliance DepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) fn join_alliance() -> Weight { // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `23358` - // Minimum execution time: 38_798 nanoseconds. - Weight::from_parts(39_255_000, 0) - .saturating_add(Weight::from_parts(0, 23358)) + // Measured: `294` + // Estimated: `26328` + // Minimum execution time: 40_044_000 picoseconds. + Weight::from_parts(41_623_000, 0) + .saturating_add(Weight::from_parts(0, 26328)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -333,11 +333,11 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// Proof: Alliance UnscrupulousAccounts (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) fn nominate_ally() -> Weight { // Proof Size summary in bytes: - // Measured: `255` - // Estimated: `20755` - // Minimum execution time: 27_702 nanoseconds. - Weight::from_parts(28_189_000, 0) - .saturating_add(Weight::from_parts(0, 20755)) + // Measured: `193` + // Estimated: `22735` + // Minimum execution time: 28_166_000 picoseconds. + Weight::from_parts(28_756_000, 0) + .saturating_add(Weight::from_parts(0, 22735)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -351,11 +351,11 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) fn elevate_ally() -> Weight { // Proof Size summary in bytes: - // Measured: `298` - // Estimated: `12761` - // Minimum execution time: 23_033 nanoseconds. - Weight::from_parts(23_589_000, 0) - .saturating_add(Weight::from_parts(0, 12761)) + // Measured: `236` + // Estimated: `14555` + // Minimum execution time: 25_759_000 picoseconds. + Weight::from_parts(26_083_000, 0) + .saturating_add(Weight::from_parts(0, 14555)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -371,11 +371,11 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// Proof: Alliance RetiringMembers (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) fn give_retirement_notice() -> Weight { // Proof Size summary in bytes: - // Measured: `298` - // Estimated: `24133` - // Minimum execution time: 31_352 nanoseconds. - Weight::from_parts(31_848_000, 0) - .saturating_add(Weight::from_parts(0, 24133)) + // Measured: `236` + // Estimated: `25927` + // Minimum execution time: 32_603_000 picoseconds. + Weight::from_parts(33_091_000, 0) + .saturating_add(Weight::from_parts(0, 25927)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -389,11 +389,11 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn retire() -> Weight { // Proof Size summary in bytes: - // Measured: `580` - // Estimated: `13355` - // Minimum execution time: 31_872 nanoseconds. - Weight::from_parts(32_156_000, 0) - .saturating_add(Weight::from_parts(0, 13355)) + // Measured: `517` + // Estimated: `17315` + // Minimum execution time: 36_169_000 picoseconds. + Weight::from_parts(36_746_000, 0) + .saturating_add(Weight::from_parts(0, 17315)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -423,11 +423,11 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) fn kick_member() -> Weight { // Proof Size summary in bytes: - // Measured: `716` - // Estimated: `35980` - // Minimum execution time: 115_869 nanoseconds. - Weight::from_parts(116_954_000, 0) - .saturating_add(Weight::from_parts(0, 35980)) + // Measured: `622` + // Estimated: `45128` + // Minimum execution time: 127_845_000 picoseconds. + Weight::from_parts(129_248_000, 0) + .saturating_add(Weight::from_parts(0, 45128)) .saturating_add(T::DbWeight::get().reads(13)) .saturating_add(T::DbWeight::get().writes(8)) } @@ -440,14 +440,14 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn add_unscrupulous_items(n: u32, l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `29894` - // Minimum execution time: 6_956 nanoseconds. - Weight::from_parts(7_074_000, 0) - .saturating_add(Weight::from_parts(0, 29894)) - // Standard Error: 2_782 - .saturating_add(Weight::from_parts(1_178_647, 0).saturating_mul(n.into())) - // Standard Error: 1_089 - .saturating_add(Weight::from_parts(65_684, 0).saturating_mul(l.into())) + // Estimated: `31874` + // Minimum execution time: 8_183_000 picoseconds. + Weight::from_parts(8_256_000, 0) + .saturating_add(Weight::from_parts(0, 31874)) + // Standard Error: 2_929 + .saturating_add(Weight::from_parts(1_444_558, 0).saturating_mul(n.into())) + // Standard Error: 1_147 + .saturating_add(Weight::from_parts(68_146, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -460,14 +460,14 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn remove_unscrupulous_items(n: u32, l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + n * (289 ±0) + l * (100 ±0)` - // Estimated: `29894` - // Minimum execution time: 6_939 nanoseconds. - Weight::from_parts(7_100_000, 0) - .saturating_add(Weight::from_parts(0, 29894)) - // Standard Error: 170_977 - .saturating_add(Weight::from_parts(13_668_797, 0).saturating_mul(n.into())) - // Standard Error: 66_962 - .saturating_add(Weight::from_parts(451_782, 0).saturating_mul(l.into())) + // Estimated: `31874` + // Minimum execution time: 7_982_000 picoseconds. + Weight::from_parts(8_084_000, 0) + .saturating_add(Weight::from_parts(0, 31874)) + // Standard Error: 185_716 + .saturating_add(Weight::from_parts(16_937_748, 0).saturating_mul(n.into())) + // Standard Error: 72_734 + .saturating_add(Weight::from_parts(291_993, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -481,11 +481,11 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) fn abdicate_fellow_status() -> Weight { // Proof Size summary in bytes: - // Measured: `298` - // Estimated: `18447` - // Minimum execution time: 29_564 nanoseconds. - Weight::from_parts(30_313_000, 0) - .saturating_add(Weight::from_parts(0, 18447)) + // Measured: `236` + // Estimated: `20241` + // Minimum execution time: 31_916_000 picoseconds. + Weight::from_parts(32_301_000, 0) + .saturating_add(Weight::from_parts(0, 20241)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs index 0b8b6ef7078..d36ba31bdb7 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -51,11 +51,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_allow_death() -> Weight { // Proof Size summary in bytes: - // Measured: `1176` - // Estimated: `2603` - // Minimum execution time: 45_207 nanoseconds. - Weight::from_parts(45_620_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 35_300_000 picoseconds. + Weight::from_parts(35_618_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -63,11 +63,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: - // Measured: `1060` - // Estimated: `2603` - // Minimum execution time: 35_103 nanoseconds. - Weight::from_parts(35_730_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 26_091_000 picoseconds. + Weight::from_parts(26_666_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -75,11 +75,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_creating() -> Weight { // Proof Size summary in bytes: - // Measured: `1172` - // Estimated: `2603` - // Minimum execution time: 26_007 nanoseconds. - Weight::from_parts(26_347_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 15_271_000 picoseconds. + Weight::from_parts(15_835_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -87,11 +87,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_set_balance_killing() -> Weight { // Proof Size summary in bytes: - // Measured: `1172` - // Estimated: `2603` - // Minimum execution time: 28_971 nanoseconds. - Weight::from_parts(29_435_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 18_684_000 picoseconds. + Weight::from_parts(19_146_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -99,11 +99,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `1172` - // Estimated: `5206` - // Minimum execution time: 45_554 nanoseconds. - Weight::from_parts(46_156_000, 0) - .saturating_add(Weight::from_parts(0, 5206)) + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 36_588_000 picoseconds. + Weight::from_parts(37_315_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -111,11 +111,11 @@ impl pallet_balances::WeightInfo for WeightInfo { /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer_all() -> Weight { // Proof Size summary in bytes: - // Measured: `1060` - // Estimated: `2603` - // Minimum execution time: 40_290 nanoseconds. - Weight::from_parts(40_805_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 32_278_000 picoseconds. + Weight::from_parts(32_546_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -126,11 +126,11 @@ impl pallet_balances::WeightInfo for WeightInfo { } fn force_unreserve() -> Weight { // Proof Size summary in bytes: - // Measured: `1056` - // Estimated: `2603` - // Minimum execution time: 22_459 nanoseconds. - Weight::from_parts(23_037_000, 0) - .saturating_add(Weight::from_parts(0, 2603)) + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 14_817_000 picoseconds. + Weight::from_parts(15_115_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs index 2eb232574ce..fb14fb9f956 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -55,12 +55,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn set_invulnerables(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` - // Estimated: `178 + b * (2554 ±0)` - // Minimum execution time: 13_471 nanoseconds. - Weight::from_parts(13_949_440, 0) - .saturating_add(Weight::from_parts(0, 178)) - // Standard Error: 3_549 - .saturating_add(Weight::from_parts(2_497_077, 0).saturating_mul(b.into())) + // Estimated: `1168 + b * (2554 ±0)` + // Minimum execution time: 14_884_000 picoseconds. + Weight::from_parts(14_947_157, 0) + .saturating_add(Weight::from_parts(0, 1168)) + // Standard Error: 4_169 + .saturating_add(Weight::from_parts(2_615_559, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +71,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_444 nanoseconds. - Weight::from_parts(6_763_000, 0) + // Minimum execution time: 7_057_000 picoseconds. + Weight::from_parts(7_226_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +82,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_610 nanoseconds. - Weight::from_parts(6_807_000, 0) + // Minimum execution time: 7_216_000 picoseconds. + Weight::from_parts(7_502_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,13 +102,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 999]`. fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1171 + c * (48 ±0)` - // Estimated: `56784 + c * (49 ±0)` - // Minimum execution time: 35_411 nanoseconds. - Weight::from_parts(26_990_808, 0) - .saturating_add(Weight::from_parts(0, 56784)) - // Standard Error: 1_294 - .saturating_add(Weight::from_parts(107_975, 0).saturating_mul(c.into())) + // Measured: `1108 + c * (48 ±0)` + // Estimated: `61671 + c * (49 ±0)` + // Minimum execution time: 38_806_000 picoseconds. + Weight::from_parts(31_477_823, 0) + .saturating_add(Weight::from_parts(0, 61671)) + // Standard Error: 1_220 + .saturating_add(Weight::from_parts(108_369, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -120,13 +120,13 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[6, 1000]`. fn leave_intent(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `536 + c * (48 ±0)` - // Estimated: `48497` - // Minimum execution time: 25_912 nanoseconds. - Weight::from_parts(15_664_296, 0) - .saturating_add(Weight::from_parts(0, 48497)) - // Standard Error: 1_292 - .saturating_add(Weight::from_parts(105_672, 0).saturating_mul(c.into())) + // Measured: `452 + c * (48 ±0)` + // Estimated: `49487` + // Minimum execution time: 29_463_000 picoseconds. + Weight::from_parts(19_105_316, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_307 + .saturating_add(Weight::from_parts(106_299, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -138,11 +138,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) fn note_author() -> Weight { // Proof Size summary in bytes: - // Measured: `135` - // Estimated: `5749` - // Minimum execution time: 24_773 nanoseconds. - Weight::from_parts(25_088_000, 0) - .saturating_add(Weight::from_parts(0, 5749)) + // Measured: `103` + // Estimated: `7729` + // Minimum execution time: 28_319_000 picoseconds. + Weight::from_parts(28_880_000, 0) + .saturating_add(Weight::from_parts(0, 7729)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +160,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22784 + r * (148 ±0) + c * (97 ±0)` - // Estimated: `52737 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 16_174 nanoseconds. - Weight::from_parts(16_337_000, 0) - .saturating_add(Weight::from_parts(0, 52737)) - // Standard Error: 759_621 - .saturating_add(Weight::from_parts(27_780_906, 0).saturating_mul(c.into())) + // Measured: `22721 + r * (116 ±0) + c * (97 ±0)` + // Estimated: `56697 + r * (2602 ±0) + c * (2520 ±0)` + // Minimum execution time: 17_111_000 picoseconds. + Weight::from_parts(17_332_000, 0) + .saturating_add(Weight::from_parts(0, 56697)) + // Standard Error: 800_597 + .saturating_add(Weight::from_parts(29_089_719, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs index 38369b02f26..5e7f67bea35 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_collective` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -60,21 +60,21 @@ impl pallet_collective::WeightInfo for WeightInfo { /// The range of component `p` is `[0, 100]`. fn set_members(m: u32, _n: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + m * (3233 ±0) + p * (3223 ±0)` - // Estimated: `15906 + m * (7809 ±23) + p * (10238 ±23)` - // Minimum execution time: 15_797 nanoseconds. - Weight::from_parts(16_028_000, 0) - .saturating_add(Weight::from_parts(0, 15906)) - // Standard Error: 70_308 - .saturating_add(Weight::from_parts(5_642_347, 0).saturating_mul(m.into())) - // Standard Error: 70_308 - .saturating_add(Weight::from_parts(8_133_950, 0).saturating_mul(p.into())) + // Measured: `0 + m * (3232 ±0) + p * (3190 ±0)` + // Estimated: `18748 + m * (7799 ±23) + p * (10110 ±23)` + // Minimum execution time: 16_280_000 picoseconds. + Weight::from_parts(16_431_000, 0) + .saturating_add(Weight::from_parts(0, 18748)) + // Standard Error: 67_432 + .saturating_add(Weight::from_parts(5_382_109, 0).saturating_mul(m.into())) + // Standard Error: 67_432 + .saturating_add(Weight::from_parts(8_022_628, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) - .saturating_add(Weight::from_parts(0, 7809).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 10238).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 7799).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 10110).saturating_mul(p.into())) } /// Storage: AllianceMotion Members (r:1 w:0) /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) @@ -82,15 +82,15 @@ impl pallet_collective::WeightInfo for WeightInfo { /// The range of component `m` is `[1, 100]`. fn execute(b: u32, m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `64 + m * (32 ±0)` - // Estimated: `560 + m * (32 ±0)` - // Minimum execution time: 14_039 nanoseconds. - Weight::from_parts(13_145_821, 0) - .saturating_add(Weight::from_parts(0, 560)) + // Measured: `32 + m * (32 ±0)` + // Estimated: `1518 + m * (32 ±0)` + // Minimum execution time: 15_340_000 picoseconds. + Weight::from_parts(14_971_140, 0) + .saturating_add(Weight::from_parts(0, 1518)) // Standard Error: 24 - .saturating_add(Weight::from_parts(1_434, 0).saturating_mul(b.into())) - // Standard Error: 248 - .saturating_add(Weight::from_parts(14_559, 0).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(1_237, 0).saturating_mul(b.into())) + // Standard Error: 252 + .saturating_add(Weight::from_parts(13_257, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) } @@ -102,15 +102,15 @@ impl pallet_collective::WeightInfo for WeightInfo { /// The range of component `m` is `[1, 100]`. fn propose_execute(b: u32, m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `64 + m * (32 ±0)` - // Estimated: `3100 + m * (64 ±0)` - // Minimum execution time: 16_235 nanoseconds. - Weight::from_parts(14_913_854, 0) - .saturating_add(Weight::from_parts(0, 3100)) + // Measured: `32 + m * (32 ±0)` + // Estimated: `5016 + m * (64 ±0)` + // Minimum execution time: 18_083_000 picoseconds. + Weight::from_parts(17_322_823, 0) + .saturating_add(Weight::from_parts(0, 5016)) // Standard Error: 26 - .saturating_add(Weight::from_parts(1_744, 0).saturating_mul(b.into())) - // Standard Error: 273 - .saturating_add(Weight::from_parts(23_908, 0).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(1_248, 0).saturating_mul(b.into())) + // Standard Error: 272 + .saturating_add(Weight::from_parts(22_423, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } @@ -129,17 +129,17 @@ impl pallet_collective::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 100]`. fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `386 + m * (32 ±0) + p * (36 ±0)` - // Estimated: `5505 + m * (165 ±0) + p * (180 ±0)` - // Minimum execution time: 21_595 nanoseconds. - Weight::from_parts(23_162_876, 0) - .saturating_add(Weight::from_parts(0, 5505)) - // Standard Error: 76 - .saturating_add(Weight::from_parts(2_647, 0).saturating_mul(b.into())) - // Standard Error: 797 - .saturating_add(Weight::from_parts(19_673, 0).saturating_mul(m.into())) - // Standard Error: 787 - .saturating_add(Weight::from_parts(95_242, 0).saturating_mul(p.into())) + // Measured: `322 + m * (32 ±0) + p * (36 ±0)` + // Estimated: `9165 + m * (165 ±0) + p * (180 ±0)` + // Minimum execution time: 24_019_000 picoseconds. + Weight::from_parts(26_316_662, 0) + .saturating_add(Weight::from_parts(0, 9165)) + // Standard Error: 77 + .saturating_add(Weight::from_parts(2_166, 0).saturating_mul(b.into())) + // Standard Error: 810 + .saturating_add(Weight::from_parts(20_438, 0).saturating_mul(m.into())) + // Standard Error: 799 + .saturating_add(Weight::from_parts(122_504, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) .saturating_add(Weight::from_parts(0, 165).saturating_mul(m.into())) @@ -152,13 +152,13 @@ impl pallet_collective::WeightInfo for WeightInfo { /// The range of component `m` is `[5, 100]`. fn vote(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `836 + m * (64 ±0)` - // Estimated: `4640 + m * (128 ±0)` - // Minimum execution time: 20_793 nanoseconds. - Weight::from_parts(21_342_865, 0) - .saturating_add(Weight::from_parts(0, 4640)) - // Standard Error: 394 - .saturating_add(Weight::from_parts(43_236, 0).saturating_mul(m.into())) + // Measured: `771 + m * (64 ±0)` + // Estimated: `6490 + m * (128 ±0)` + // Minimum execution time: 22_516_000 picoseconds. + Weight::from_parts(23_803_657, 0) + .saturating_add(Weight::from_parts(0, 6490)) + // Standard Error: 1_968 + .saturating_add(Weight::from_parts(38_988, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 128).saturating_mul(m.into())) @@ -175,15 +175,15 @@ impl pallet_collective::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 100]`. fn close_early_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `456 + m * (64 ±0) + p * (36 ±0)` - // Estimated: `5213 + m * (260 ±0) + p * (144 ±0)` - // Minimum execution time: 24_859 nanoseconds. - Weight::from_parts(26_156_065, 0) - .saturating_add(Weight::from_parts(0, 5213)) - // Standard Error: 737 - .saturating_add(Weight::from_parts(20_578, 0).saturating_mul(m.into())) - // Standard Error: 718 - .saturating_add(Weight::from_parts(86_327, 0).saturating_mul(p.into())) + // Measured: `360 + m * (64 ±0) + p * (36 ±0)` + // Estimated: `7795 + m * (260 ±0) + p * (144 ±0)` + // Minimum execution time: 26_841_000 picoseconds. + Weight::from_parts(28_166_692, 0) + .saturating_add(Weight::from_parts(0, 7795)) + // Standard Error: 657 + .saturating_add(Weight::from_parts(20_102, 0).saturating_mul(m.into())) + // Standard Error: 641 + .saturating_add(Weight::from_parts(113_841, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 260).saturating_mul(m.into())) @@ -202,17 +202,17 @@ impl pallet_collective::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 100]`. fn close_early_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `792 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` - // Estimated: `8484 + b * (4 ±0) + m * (264 ±0) + p * (160 ±0)` - // Minimum execution time: 34_729 nanoseconds. - Weight::from_parts(36_499_058, 0) - .saturating_add(Weight::from_parts(0, 8484)) + // Measured: `662 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` + // Estimated: `11956 + b * (4 ±0) + m * (264 ±0) + p * (160 ±0)` + // Minimum execution time: 38_310_000 picoseconds. + Weight::from_parts(40_050_347, 0) + .saturating_add(Weight::from_parts(0, 11956)) // Standard Error: 84 - .saturating_add(Weight::from_parts(1_409, 0).saturating_mul(b.into())) - // Standard Error: 893 - .saturating_add(Weight::from_parts(14_167, 0).saturating_mul(m.into())) - // Standard Error: 871 - .saturating_add(Weight::from_parts(101_999, 0).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(1_379, 0).saturating_mul(b.into())) + // Standard Error: 892 + .saturating_add(Weight::from_parts(13_153, 0).saturating_mul(m.into())) + // Standard Error: 870 + .saturating_add(Weight::from_parts(132_394, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 4).saturating_mul(b.into())) @@ -233,15 +233,15 @@ impl pallet_collective::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 100]`. fn close_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `553 + m * (48 ±0) + p * (36 ±0)` - // Estimated: `6605 + m * (245 ±0) + p * (180 ±0)` - // Minimum execution time: 27_113 nanoseconds. - Weight::from_parts(28_105_174, 0) - .saturating_add(Weight::from_parts(0, 6605)) - // Standard Error: 686 - .saturating_add(Weight::from_parts(20_379, 0).saturating_mul(m.into())) - // Standard Error: 669 - .saturating_add(Weight::from_parts(89_284, 0).saturating_mul(p.into())) + // Measured: `458 + m * (48 ±0) + p * (36 ±0)` + // Estimated: `10085 + m * (245 ±0) + p * (180 ±0)` + // Minimum execution time: 29_071_000 picoseconds. + Weight::from_parts(30_524_865, 0) + .saturating_add(Weight::from_parts(0, 10085)) + // Standard Error: 658 + .saturating_add(Weight::from_parts(18_125, 0).saturating_mul(m.into())) + // Standard Error: 641 + .saturating_add(Weight::from_parts(115_123, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 245).saturating_mul(m.into())) @@ -262,17 +262,17 @@ impl pallet_collective::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 100]`. fn close_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `812 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` - // Estimated: `9715 + b * (5 ±0) + m * (330 ±0) + p * (200 ±0)` - // Minimum execution time: 37_242 nanoseconds. - Weight::from_parts(38_722_168, 0) - .saturating_add(Weight::from_parts(0, 9715)) - // Standard Error: 89 - .saturating_add(Weight::from_parts(1_419, 0).saturating_mul(b.into())) - // Standard Error: 947 - .saturating_add(Weight::from_parts(15_417, 0).saturating_mul(m.into())) - // Standard Error: 923 - .saturating_add(Weight::from_parts(103_094, 0).saturating_mul(p.into())) + // Measured: `682 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` + // Estimated: `14055 + b * (5 ±0) + m * (330 ±0) + p * (200 ±0)` + // Minimum execution time: 40_932_000 picoseconds. + Weight::from_parts(42_564_375, 0) + .saturating_add(Weight::from_parts(0, 14055)) + // Standard Error: 91 + .saturating_add(Weight::from_parts(1_354, 0).saturating_mul(b.into())) + // Standard Error: 962 + .saturating_add(Weight::from_parts(14_498, 0).saturating_mul(m.into())) + // Standard Error: 937 + .saturating_add(Weight::from_parts(133_672, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 5).saturating_mul(b.into())) @@ -288,13 +288,13 @@ impl pallet_collective::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 100]`. fn disapprove_proposal(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `221 + p * (32 ±0)` - // Estimated: `1158 + p * (96 ±0)` - // Minimum execution time: 13_173 nanoseconds. - Weight::from_parts(14_787_145, 0) - .saturating_add(Weight::from_parts(0, 1158)) - // Standard Error: 614 - .saturating_add(Weight::from_parts(81_286, 0).saturating_mul(p.into())) + // Measured: `189 + p * (32 ±0)` + // Estimated: `2052 + p * (96 ±0)` + // Minimum execution time: 14_577_000 picoseconds. + Weight::from_parts(17_078_204, 0) + .saturating_add(Weight::from_parts(0, 2052)) + // Standard Error: 1_851 + .saturating_add(Weight::from_parts(96_610, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 96).saturating_mul(p.into())) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs index e5fa9b0aaea..46e8b35ad17 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -52,11 +52,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_628 nanoseconds. - Weight::from_parts(12_058_313, 0) + // Minimum execution time: 11_874_000 picoseconds. + Weight::from_parts(12_338_482, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3 - .saturating_add(Weight::from_parts(500, 0).saturating_mul(z.into())) + // Standard Error: 1 + .saturating_add(Weight::from_parts(501, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -64,15 +64,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `311 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 34_764 nanoseconds. - Weight::from_parts(27_813_109, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 630 - .saturating_add(Weight::from_parts(73_821, 0).saturating_mul(s.into())) + // Measured: `262 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 37_113_000 picoseconds. + Weight::from_parts(31_650_752, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 685 + .saturating_add(Weight::from_parts(60_611, 0).saturating_mul(s.into())) // Standard Error: 6 - .saturating_add(Weight::from_parts(1_542, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_223, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,15 +82,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_approve(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 25_932 nanoseconds. - Weight::from_parts(19_364_026, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 490 - .saturating_add(Weight::from_parts(69_834, 0).saturating_mul(s.into())) - // Standard Error: 4 - .saturating_add(Weight::from_parts(1_520, 0).saturating_mul(z.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 27_063_000 picoseconds. + Weight::from_parts(21_745_286, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 540 + .saturating_add(Weight::from_parts(59_750, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_199, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,15 +102,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `448 + s * (33 ±0)` - // Estimated: `8424` - // Minimum execution time: 39_495 nanoseconds. - Weight::from_parts(31_235_649, 0) - .saturating_add(Weight::from_parts(0, 8424)) - // Standard Error: 570 - .saturating_add(Weight::from_parts(88_719, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_523, 0).saturating_mul(z.into())) + // Measured: `385 + s * (33 ±0)` + // Estimated: `10404` + // Minimum execution time: 41_635_000 picoseconds. + Weight::from_parts(35_205_750, 0) + .saturating_add(Weight::from_parts(0, 10404)) + // Standard Error: 614 + .saturating_add(Weight::from_parts(77_394, 0).saturating_mul(s.into())) + // Standard Error: 6 + .saturating_add(Weight::from_parts(1_194, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -119,13 +119,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `318 + s * (2 ±0)` - // Estimated: `5821` - // Minimum execution time: 24_708 nanoseconds. - Weight::from_parts(26_673_173, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 863 - .saturating_add(Weight::from_parts(81_459, 0).saturating_mul(s.into())) + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 28_179_000 picoseconds. + Weight::from_parts(29_964_208, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 692 + .saturating_add(Weight::from_parts(67_380, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -134,13 +134,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `313` - // Estimated: `5821` - // Minimum execution time: 16_520 nanoseconds. - Weight::from_parts(18_123_705, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 661 - .saturating_add(Weight::from_parts(74_405, 0).saturating_mul(s.into())) + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 18_604_000 picoseconds. + Weight::from_parts(20_059_859, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 1_469 + .saturating_add(Weight::from_parts(65_134, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -149,13 +149,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `517 + s * (1 ±0)` - // Estimated: `5821` - // Minimum execution time: 25_476 nanoseconds. - Weight::from_parts(27_845_581, 0) - .saturating_add(Weight::from_parts(0, 5821)) - // Standard Error: 868 - .saturating_add(Weight::from_parts(77_797, 0).saturating_mul(s.into())) + // Measured: `454 + s * (1 ±0)` + // Estimated: `6811` + // Minimum execution time: 28_438_000 picoseconds. + Weight::from_parts(30_815_747, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 774 + .saturating_add(Weight::from_parts(67_365, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs index 4eb83d8067f..5c168e89d47 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -52,13 +52,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 14_443 nanoseconds. - Weight::from_parts(15_158_969, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_249 - .saturating_add(Weight::from_parts(33_941, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 16_370_000 picoseconds. + Weight::from_parts(17_099_234, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_021 + .saturating_add(Weight::from_parts(27_747, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -71,15 +71,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn proxy_announced(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `550 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `11027` - // Minimum execution time: 32_060 nanoseconds. - Weight::from_parts(32_192_294, 0) - .saturating_add(Weight::from_parts(0, 11027)) - // Standard Error: 1_900 - .saturating_add(Weight::from_parts(109_332, 0).saturating_mul(a.into())) - // Standard Error: 1_963 - .saturating_add(Weight::from_parts(39_154, 0).saturating_mul(p.into())) + // Measured: `454 + a * (68 ±0) + p * (37 ±0)` + // Estimated: `13997` + // Minimum execution time: 34_655_000 picoseconds. + Weight::from_parts(35_088_843, 0) + .saturating_add(Weight::from_parts(0, 13997)) + // Standard Error: 1_939 + .saturating_add(Weight::from_parts(146_356, 0).saturating_mul(a.into())) + // Standard Error: 2_004 + .saturating_add(Weight::from_parts(38_363, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -91,15 +91,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `433 + a * (68 ±0)` - // Estimated: `7311` - // Minimum execution time: 20_084 nanoseconds. - Weight::from_parts(21_187_531, 0) - .saturating_add(Weight::from_parts(0, 7311)) - // Standard Error: 1_412 - .saturating_add(Weight::from_parts(112_601, 0).saturating_mul(a.into())) - // Standard Error: 1_458 - .saturating_add(Weight::from_parts(6_862, 0).saturating_mul(p.into())) + // Measured: `369 + a * (68 ±0)` + // Estimated: `9291` + // Minimum execution time: 21_893_000 picoseconds. + Weight::from_parts(22_495_271, 0) + .saturating_add(Weight::from_parts(0, 9291)) + // Standard Error: 1_612 + .saturating_add(Weight::from_parts(149_480, 0).saturating_mul(a.into())) + // Standard Error: 1_665 + .saturating_add(Weight::from_parts(20_216, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -111,15 +111,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn reject_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `433 + a * (68 ±0)` - // Estimated: `7311` - // Minimum execution time: 20_658 nanoseconds. - Weight::from_parts(21_184_810, 0) - .saturating_add(Weight::from_parts(0, 7311)) - // Standard Error: 1_259 - .saturating_add(Weight::from_parts(112_012, 0).saturating_mul(a.into())) - // Standard Error: 1_301 - .saturating_add(Weight::from_parts(10_767, 0).saturating_mul(p.into())) + // Measured: `369 + a * (68 ±0)` + // Estimated: `9291` + // Minimum execution time: 22_129_000 picoseconds. + Weight::from_parts(22_971_862, 0) + .saturating_add(Weight::from_parts(0, 9291)) + // Standard Error: 1_324 + .saturating_add(Weight::from_parts(139_140, 0).saturating_mul(a.into())) + // Standard Error: 1_368 + .saturating_add(Weight::from_parts(9_720, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -133,15 +133,15 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn announce(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `482 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `11027` - // Minimum execution time: 28_670 nanoseconds. - Weight::from_parts(29_411_875, 0) - .saturating_add(Weight::from_parts(0, 11027)) - // Standard Error: 1_864 - .saturating_add(Weight::from_parts(94_146, 0).saturating_mul(a.into())) - // Standard Error: 1_926 - .saturating_add(Weight::from_parts(36_523, 0).saturating_mul(p.into())) + // Measured: `386 + a * (68 ±0) + p * (37 ±0)` + // Estimated: `13997` + // Minimum execution time: 30_496_000 picoseconds. + Weight::from_parts(31_777_493, 0) + .saturating_add(Weight::from_parts(0, 13997)) + // Standard Error: 2_153 + .saturating_add(Weight::from_parts(139_635, 0).saturating_mul(a.into())) + // Standard Error: 2_224 + .saturating_add(Weight::from_parts(36_392, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -150,13 +150,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn add_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 21_273 nanoseconds. - Weight::from_parts(22_137_672, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_345 - .saturating_add(Weight::from_parts(44_075, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 23_465_000 picoseconds. + Weight::from_parts(24_342_756, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_559 + .saturating_add(Weight::from_parts(50_636, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -165,13 +165,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 20_888 nanoseconds. - Weight::from_parts(22_120_940, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_516 - .saturating_add(Weight::from_parts(55_407, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 23_620_000 picoseconds. + Weight::from_parts(24_514_511, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_749 + .saturating_add(Weight::from_parts(47_870, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -180,28 +180,26 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[1, 31]`. fn remove_proxies(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `159 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 17_007 nanoseconds. - Weight::from_parts(17_746_585, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_201 - .saturating_add(Weight::from_parts(22_307, 0).saturating_mul(p.into())) + // Measured: `127 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 18_506_000 picoseconds. + Weight::from_parts(19_463_396, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_241 + .saturating_add(Weight::from_parts(25_525, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Proxy Proxies (r:1 w:1) /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) /// The range of component `p` is `[1, 31]`. - fn create_pure(p: u32, ) -> Weight { + fn create_pure(_p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `139` - // Estimated: `3716` - // Minimum execution time: 22_625 nanoseconds. - Weight::from_parts(23_598_172, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_668 - .saturating_add(Weight::from_parts(113, 0).saturating_mul(p.into())) + // Estimated: `4706` + // Minimum execution time: 25_291_000 picoseconds. + Weight::from_parts(26_456_465, 0) + .saturating_add(Weight::from_parts(0, 4706)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -210,13 +208,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { /// The range of component `p` is `[0, 30]`. fn kill_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `196 + p * (37 ±0)` - // Estimated: `3716` - // Minimum execution time: 17_969 nanoseconds. - Weight::from_parts(18_830_934, 0) - .saturating_add(Weight::from_parts(0, 3716)) - // Standard Error: 1_340 - .saturating_add(Weight::from_parts(23_749, 0).saturating_mul(p.into())) + // Measured: `164 + p * (37 ±0)` + // Estimated: `4706` + // Minimum execution time: 19_931_000 picoseconds. + Weight::from_parts(20_842_319, 0) + .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 1_467 + .saturating_add(Weight::from_parts(26_062, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs index f5e7b9f2dde..5c5f61d40b2 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -54,10 +54,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `270` - // Estimated: `5490` - // Minimum execution time: 15_653 nanoseconds. - Weight::from_parts(16_004_000, 0) - .saturating_add(Weight::from_parts(0, 5490)) + // Estimated: `7470` + // Minimum execution time: 17_635_000 picoseconds. + Weight::from_parts(17_997_000, 0) + .saturating_add(Weight::from_parts(0, 7470)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +68,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `242` - // Estimated: `2959` - // Minimum execution time: 11_729 nanoseconds. - Weight::from_parts(12_081_000, 0) - .saturating_add(Weight::from_parts(0, 2959)) + // Estimated: `3949` + // Minimum execution time: 12_878_000 picoseconds. + Weight::from_parts(13_245_000, 0) + .saturating_add(Weight::from_parts(0, 3949)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs index 9bebfff45ef..5d0636e87d1 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -54,10 +54,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `49` - // Estimated: `1006` - // Minimum execution time: 6_995 nanoseconds. - Weight::from_parts(7_169_000, 0) - .saturating_add(Weight::from_parts(0, 1006)) + // Estimated: `2986` + // Minimum execution time: 7_660_000 picoseconds. + Weight::from_parts(7_967_000, 0) + .saturating_add(Weight::from_parts(0, 2986)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_166 nanoseconds. - Weight::from_parts(3_331_000, 0) + // Minimum execution time: 3_258_000 picoseconds. + Weight::from_parts(3_348_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs index bf25e13c752..5ff7d46c142 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -52,18 +52,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_987 nanoseconds. - Weight::from_parts(19_221_047, 0) + // Minimum execution time: 7_002_000 picoseconds. + Weight::from_parts(17_384_645, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_233 - .saturating_add(Weight::from_parts(3_808_598, 0).saturating_mul(c.into())) + // Standard Error: 3_488 + .saturating_add(Weight::from_parts(4_736_077, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_203 nanoseconds. - Weight::from_parts(4_337_000, 0) + // Minimum execution time: 5_352_000 picoseconds. + Weight::from_parts(5_532_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +71,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_986 nanoseconds. - Weight::from_parts(14_991_349, 0) + // Minimum execution time: 7_030_000 picoseconds. + Weight::from_parts(18_968_785, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_440 - .saturating_add(Weight::from_parts(4_032_363, 0).saturating_mul(c.into())) + // Standard Error: 3_112 + .saturating_add(Weight::from_parts(4_960_336, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_768 nanoseconds. - Weight::from_parts(7_998_000, 0) + // Minimum execution time: 9_703_000 picoseconds. + Weight::from_parts(10_012_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +90,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_906 nanoseconds. - Weight::from_parts(16_782_253, 0) + // Minimum execution time: 7_029_000 picoseconds. + Weight::from_parts(13_505_714, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_131 - .saturating_add(Weight::from_parts(3_780_339, 0).saturating_mul(c.into())) + // Standard Error: 3_032 + .saturating_add(Weight::from_parts(4_709_262, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs index b257834df07..43fee0b52e6 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -60,10 +60,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `4645` - // Minimum execution time: 23_618 nanoseconds. - Weight::from_parts(24_118_000, 0) - .saturating_add(Weight::from_parts(0, 4645)) + // Estimated: `9595` + // Minimum execution time: 25_963_000 picoseconds. + Weight::from_parts(26_569_000, 0) + .saturating_add(Weight::from_parts(0, 9595)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -72,10 +72,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn teleport_assets() -> Weight { // Proof Size summary in bytes: // Measured: `32` - // Estimated: `499` - // Minimum execution time: 23_764 nanoseconds. - Weight::from_parts(24_114_000, 0) - .saturating_add(Weight::from_parts(0, 499)) + // Estimated: `1489` + // Minimum execution time: 26_187_000 picoseconds. + Weight::from_parts(26_643_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Benchmark Override (r:0 w:0) @@ -84,7 +84,7 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551 nanoseconds. + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } @@ -94,7 +94,7 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551 nanoseconds. + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } @@ -104,8 +104,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_266 nanoseconds. - Weight::from_parts(8_578_000, 0) + // Minimum execution time: 9_755_000 picoseconds. + Weight::from_parts(10_010_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -115,8 +115,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_289 nanoseconds. - Weight::from_parts(2_382_000, 0) + // Minimum execution time: 2_994_000 picoseconds. + Weight::from_parts(3_125_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -139,10 +139,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `7729` - // Minimum execution time: 28_592 nanoseconds. - Weight::from_parts(29_116_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `14659` + // Minimum execution time: 31_393_000 picoseconds. + Weight::from_parts(31_976_000, 0) + .saturating_add(Weight::from_parts(0, 14659)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -163,10 +163,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `220` - // Estimated: `8470` - // Minimum execution time: 30_604 nanoseconds. - Weight::from_parts(31_361_000, 0) - .saturating_add(Weight::from_parts(0, 8470)) + // Estimated: `14410` + // Minimum execution time: 34_048_000 picoseconds. + Weight::from_parts(35_696_000, 0) + .saturating_add(Weight::from_parts(0, 14410)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -175,10 +175,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: // Measured: `95` - // Estimated: `9995` - // Minimum execution time: 13_750 nanoseconds. - Weight::from_parts(14_051_000, 0) - .saturating_add(Weight::from_parts(0, 9995)) + // Estimated: `10985` + // Minimum execution time: 16_432_000 picoseconds. + Weight::from_parts(16_898_000, 0) + .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -187,10 +187,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: // Measured: `99` - // Estimated: `9999` - // Minimum execution time: 13_897 nanoseconds. - Weight::from_parts(14_080_000, 0) - .saturating_add(Weight::from_parts(0, 9999)) + // Estimated: `10989` + // Minimum execution time: 15_950_000 picoseconds. + Weight::from_parts(16_441_000, 0) + .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -199,10 +199,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `12481` - // Minimum execution time: 16_364 nanoseconds. - Weight::from_parts(16_867_000, 0) - .saturating_add(Weight::from_parts(0, 12481)) + // Estimated: `13471` + // Minimum execution time: 16_585_000 picoseconds. + Weight::from_parts(16_939_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) @@ -220,10 +220,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `10041` - // Minimum execution time: 27_372 nanoseconds. - Weight::from_parts(28_128_000, 0) - .saturating_add(Weight::from_parts(0, 10041)) + // Estimated: `15981` + // Minimum execution time: 30_278_000 picoseconds. + Weight::from_parts(30_676_000, 0) + .saturating_add(Weight::from_parts(0, 15981)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -232,10 +232,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `136` - // Estimated: `7561` - // Minimum execution time: 7_804 nanoseconds. - Weight::from_parts(8_096_000, 0) - .saturating_add(Weight::from_parts(0, 7561)) + // Estimated: `8551` + // Minimum execution time: 8_923_000 picoseconds. + Weight::from_parts(9_257_000, 0) + .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) @@ -243,10 +243,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `10006` - // Minimum execution time: 14_948 nanoseconds. - Weight::from_parts(15_422_000, 0) - .saturating_add(Weight::from_parts(0, 10006)) + // Estimated: `10996` + // Minimum execution time: 16_897_000 picoseconds. + Weight::from_parts(17_998_000, 0) + .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -265,10 +265,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `112` - // Estimated: `15027` - // Minimum execution time: 33_791 nanoseconds. - Weight::from_parts(34_282_000, 0) - .saturating_add(Weight::from_parts(0, 15027)) + // Estimated: `20967` + // Minimum execution time: 40_145_000 picoseconds. + Weight::from_parts(41_423_000, 0) + .saturating_add(Weight::from_parts(0, 20967)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } From e25e1ef6c0ab7eacccfc42b1fec6737b995400d2 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 4 Apr 2023 16:16:55 +0200 Subject: [PATCH 099/339] Use send_xcm and add cost to event --- parachains/pallets/bridge-transfer/src/lib.rs | 53 ++++++------------- .../assets/test-utils/src/test_cases.rs | 17 ++++-- 2 files changed, 30 insertions(+), 40 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 441a2fde18e..fa31c70a8d6 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -231,7 +231,7 @@ pub mod pallet { #[pallet::generate_deposit(pub (super) fn deposit_event)] pub enum Event { /// Transfer was successfully entered to the system (does not mean already delivered) - TransferInitiated(XcmHash), + TransferInitiated { message_hash: XcmHash, sender_cost: MultiAssets }, /// New bridge configuration was added BridgeAdded, @@ -646,46 +646,27 @@ pub mod pallet { } } - fn initiate_bridge_transfer( - allowed_target_location: MultiLocation, - xcm: Xcm<()>, - ) -> Result<(), Error> { - // call bridge + fn initiate_bridge_transfer(dest: MultiLocation, xcm: Xcm<()>) -> Result<(), Error> { log::info!( target: LOG_TARGET, - "[T::BridgeXcmSender] send to bridge, allowed_target_location: {:?}, xcm: {:?}", - allowed_target_location, + "[T::BridgeXcmSender] send to bridge, dest: {:?}, xcm: {:?}", + dest, xcm, ); - // TODO: use fn send_msg - which does: validate + deliver - but find out what to do with the fees? - let (ticket, fees) = - T::BridgeXcmSender::validate(&mut Some(allowed_target_location), &mut Some(xcm)) - .map_err(|e| { - log::error!( - target: LOG_TARGET, - "[BridgeXcmSender::validate] SendError occurred, error: {:?}", - e - ); - Self::deposit_event(Event::BridgeCallError(e)); - Error::::BridgeCallError - })?; - log::info!( - target: LOG_TARGET, - "[T::BridgeXcmSender::validate] (TODO: process) fees: {:?}", - fees - ); - // TODO: what to do with fees - we have fees here, pay here or ignore? - let xcm_hash = T::BridgeXcmSender::deliver(ticket).map_err(|e| { - log::error!( - target: LOG_TARGET, - "[BridgeXcmSender::deliver] SendError occurred, error: {:?}", - e - ); - Self::deposit_event(Event::BridgeCallError(e)); - Error::::BridgeCallError - })?; + // call bridge + let (message_hash, sender_cost) = + send_xcm::(dest, xcm).map_err(|e| { + log::error!( + target: LOG_TARGET, + "[T::BridgeXcmSender] SendError occurred, error: {:?}", + e + ); + Self::deposit_event(Event::BridgeCallError(e)); + Error::::BridgeCallError + })?; - Self::deposit_event(Event::TransferInitiated(xcm_hash)); + // just fire event + Self::deposit_event(Event::TransferInitiated { message_hash, sender_cost }); Ok(()) } } diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index e240447e5e4..208cb4c1be0 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1636,12 +1636,21 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< r, pallet_bridge_transfer::Event::ReserveAssetsDeposited { .. } ))); - let xcm_hash = bridge_transfer_events.find_map(|e| match e { - pallet_bridge_transfer::Event::TransferInitiated(message_hash) => - Some(message_hash), + let transfer_initiated_event = bridge_transfer_events.find_map(|e| match e { + pallet_bridge_transfer::Event::TransferInitiated { message_hash, sender_cost } => + Some((message_hash, sender_cost)), _ => None, }); - assert!(xcm_hash.is_some()); + let xcm_hash = match transfer_initiated_event { + Some((message_hash, sender_cost)) => { + assert!(sender_cost.is_none()); + Some(message_hash) + }, + _ => { + assert!(false, "No `TransferInitiated` was fired"); + None + }, + }; let mut xcmp_queue_events = >::events() .into_iter() From 88ead41f9d3629f0d278338b124bb3ae4db3c0c1 Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Tue, 4 Apr 2023 17:05:38 +0200 Subject: [PATCH 100/339] Cleanup: Remove polkadot-service dependency from minimal node (#2430) * Remove polkadot-service dependency from minimal-node * Clean up error handline * Remove unwanted changes * Unused deps --- Cargo.lock | 5 ++- client/relay-chain-interface/src/lib.rs | 10 +++++- client/relay-chain-minimal-node/Cargo.toml | 6 +++- .../src/collator_overseer.rs | 31 ++++++++++--------- client/relay-chain-minimal-node/src/lib.rs | 3 +- 5 files changed, 35 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 163917a1be1..81c49a2eae0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2332,13 +2332,16 @@ dependencies = [ "cumulus-relay-chain-rpc-interface", "futures", "lru 0.9.0", + "polkadot-availability-recovery", + "polkadot-collator-protocol", "polkadot-core-primitives", "polkadot-network-bridge", + "polkadot-node-collation-generation", + "polkadot-node-core-runtime-api", "polkadot-node-network-protocol", "polkadot-node-subsystem-util", "polkadot-overseer", "polkadot-primitives", - "polkadot-service", "sc-authority-discovery", "sc-client-api", "sc-network", diff --git a/client/relay-chain-interface/src/lib.rs b/client/relay-chain-interface/src/lib.rs index db4fd24c64f..3629aea84cd 100644 --- a/client/relay-chain-interface/src/lib.rs +++ b/client/relay-chain-interface/src/lib.rs @@ -46,7 +46,9 @@ pub enum RelayChainError { WaitTimeout(PHash), #[error("Import listener closed while waiting for relay-chain block `{0}` to be imported.")] ImportListenerClosed(PHash), - #[error("Blockchain returned an error while waiting for relay-chain block `{0}` to be imported: {1}")] + #[error( + "Blockchain returned an error while waiting for relay-chain block `{0}` to be imported: {1}" + )] WaitBlockchainError(PHash, sp_blockchain::Error), #[error("Blockchain returned an error: {0}")] BlockchainError(#[from] sp_blockchain::Error), @@ -86,6 +88,12 @@ impl From for sp_blockchain::Error { } } +impl From> for RelayChainError { + fn from(r: Box) -> Self { + RelayChainError::Application(r) + } +} + /// Trait that provides all necessary methods for interaction between collator and relay chain. #[async_trait] pub trait RelayChainInterface: Send + Sync { diff --git a/client/relay-chain-minimal-node/Cargo.toml b/client/relay-chain-minimal-node/Cargo.toml index 737445c30c1..ff8d8bc11d3 100644 --- a/client/relay-chain-minimal-node/Cargo.toml +++ b/client/relay-chain-minimal-node/Cargo.toml @@ -9,10 +9,14 @@ edition = "2021" polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } polkadot-overseer = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-service = { git = "https://github.com/paritytech/polkadot", branch = "master" } polkadot-node-subsystem-util = { git = "https://github.com/paritytech/polkadot", branch = "master" } polkadot-node-network-protocol = { git = "https://github.com/paritytech/polkadot", branch = "master" } + +polkadot-availability-recovery = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-collator-protocol = { git = "https://github.com/paritytech/polkadot", branch = "master" } polkadot-network-bridge = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-node-collation-generation = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-node-core-runtime-api = { git = "https://github.com/paritytech/polkadot", branch = "master" } # substrate deps sc-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/client/relay-chain-minimal-node/src/collator_overseer.rs b/client/relay-chain-minimal-node/src/collator_overseer.rs index 9bcbc2a67a8..bd3dfa8e0f8 100644 --- a/client/relay-chain-minimal-node/src/collator_overseer.rs +++ b/client/relay-chain-minimal-node/src/collator_overseer.rs @@ -18,6 +18,14 @@ use futures::{select, StreamExt}; use lru::LruCache; use std::sync::Arc; +use polkadot_availability_recovery::AvailabilityRecoverySubsystem; +use polkadot_collator_protocol::{CollatorProtocolSubsystem, ProtocolSide}; +use polkadot_network_bridge::{ + Metrics as NetworkBridgeMetrics, NetworkBridgeRx as NetworkBridgeRxSubsystem, + NetworkBridgeTx as NetworkBridgeTxSubsystem, +}; +use polkadot_node_collation_generation::CollationGenerationSubsystem; +use polkadot_node_core_runtime_api::RuntimeApiSubsystem; use polkadot_node_network_protocol::{ peer_set::PeerSetProtocolNames, request_response::{ @@ -27,18 +35,10 @@ use polkadot_node_network_protocol::{ }; use polkadot_node_subsystem_util::metrics::{prometheus::Registry, Metrics}; use polkadot_overseer::{ - BlockInfo, DummySubsystem, Handle, MetricsTrait, Overseer, OverseerHandle, OverseerMetrics, - SpawnGlue, KNOWN_LEAVES_CACHE_SIZE, + BlockInfo, DummySubsystem, Handle, Overseer, OverseerConnector, OverseerHandle, SpawnGlue, + KNOWN_LEAVES_CACHE_SIZE, }; use polkadot_primitives::CollatorPair; -use polkadot_service::{ - overseer::{ - AvailabilityRecoverySubsystem, CollationGenerationSubsystem, CollatorProtocolSubsystem, - NetworkBridgeMetrics, NetworkBridgeRxSubsystem, NetworkBridgeTxSubsystem, ProtocolSide, - RuntimeApiSubsystem, - }, - Error, OverseerConnector, -}; use sc_authority_discovery::Service as AuthorityDiscoveryService; use sc_network::NetworkStateInfo; @@ -93,9 +93,8 @@ fn build_overseer<'a>( }: CollatorOverseerGenArgs<'a>, ) -> Result< (Overseer, Arc>, OverseerHandle), - Error, + RelayChainError, > { - let metrics = ::register(registry)?; let spawner = SpawnGlue(spawner); let network_bridge_metrics: NetworkBridgeMetrics = Metrics::register(registry)?; let builder = Overseer::builder() @@ -153,17 +152,19 @@ fn build_overseer<'a>( .active_leaves(Default::default()) .supports_parachains(runtime_client) .known_leaves(LruCache::new(KNOWN_LEAVES_CACHE_SIZE)) - .metrics(metrics) + .metrics(Metrics::register(registry)?) .spawner(spawner); - builder.build_with_connector(connector).map_err(|e| e.into()) + builder + .build_with_connector(connector) + .map_err(|e| RelayChainError::Application(e.into())) } pub(crate) fn spawn_overseer( overseer_args: CollatorOverseerGenArgs, task_manager: &TaskManager, relay_chain_rpc_client: Arc, -) -> Result { +) -> Result { let (overseer, overseer_handle) = build_overseer(OverseerConnector::default(), overseer_args) .map_err(|e| { tracing::error!("Failed to initialize overseer: {}", e); diff --git a/client/relay-chain-minimal-node/src/lib.rs b/client/relay-chain-minimal-node/src/lib.rs index 90afd31b8b6..102a8582745 100644 --- a/client/relay-chain-minimal-node/src/lib.rs +++ b/client/relay-chain-minimal-node/src/lib.rs @@ -181,8 +181,7 @@ async fn new_minimal_relay_chain( }; let overseer_handle = - collator_overseer::spawn_overseer(overseer_args, &task_manager, relay_chain_rpc_client) - .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; + collator_overseer::spawn_overseer(overseer_args, &task_manager, relay_chain_rpc_client)?; network_starter.start_network(); From 2cbaa3910d52c9ec58951a9499ec572729f9ecfc Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 4 Apr 2023 22:31:39 +0200 Subject: [PATCH 101/339] Co #13699: Remove old calls (#2431) * Remove old calls Signed-off-by: Oliver Tale-Yazdi * update lockfile for {"substrate", "polkadot"} * Ignore warning in pallet ping Signed-off-by: Oliver Tale-Yazdi * Ignore more warnings... Signed-off-by: Oliver Tale-Yazdi * ... Signed-off-by: Oliver Tale-Yazdi --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: parity-processbot <> --- Cargo.lock | 524 +++++++++--------- pallets/parachain-system/src/lib.rs | 2 +- pallets/solo-to-para/src/lib.rs | 2 +- parachains/pallets/ping/src/lib.rs | 12 +- .../collectives-polkadot/src/xcm_config.rs | 2 - 5 files changed, 276 insertions(+), 266 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 81c49a2eae0..8a9810b8a0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -523,7 +523,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "hash-db", "log", @@ -3367,7 +3367,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", ] @@ -3390,7 +3390,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-support-procedural", @@ -3415,7 +3415,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3462,7 +3462,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3473,7 +3473,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3490,7 +3490,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -3519,7 +3519,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "futures", "log", @@ -3535,7 +3535,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "bitflags", "environmental", @@ -3568,13 +3568,14 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "Inflector", "cfg-expr", "derive-syn-parse", "frame-support-procedural-tools", "itertools", + "proc-macro-warning", "proc-macro2", "quote", "syn 1.0.109", @@ -3583,7 +3584,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3595,7 +3596,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "proc-macro2", "quote", @@ -3605,7 +3606,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "log", @@ -3623,7 +3624,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -3638,7 +3639,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "sp-api", @@ -3647,7 +3648,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "parity-scale-codec", @@ -4616,7 +4617,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bitvec", "frame-benchmarking", @@ -4714,7 +4715,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "frame-support", "polkadot-primitives", @@ -5568,7 +5569,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "futures", "log", @@ -5587,7 +5588,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "anyhow", "jsonrpsee", @@ -6086,7 +6087,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6107,7 +6108,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6125,7 +6126,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6140,7 +6141,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -6156,7 +6157,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -6172,7 +6173,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -6186,7 +6187,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6210,7 +6211,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6230,7 +6231,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6245,7 +6246,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -6264,7 +6265,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6288,7 +6289,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6306,7 +6307,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6350,7 +6351,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6367,7 +6368,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "bitflags", "environmental", @@ -6397,7 +6398,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "bitflags", "parity-scale-codec", @@ -6410,7 +6411,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "proc-macro2", "quote", @@ -6420,7 +6421,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6437,7 +6438,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6455,7 +6456,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6478,7 +6479,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6491,7 +6492,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6509,7 +6510,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6527,7 +6528,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6550,7 +6551,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6566,7 +6567,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6586,7 +6587,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6603,7 +6604,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -6617,7 +6618,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6634,7 +6635,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6651,7 +6652,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6667,7 +6668,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6685,7 +6686,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "pallet-nfts", @@ -6696,7 +6697,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6712,7 +6713,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -6729,7 +6730,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6749,7 +6750,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6760,7 +6761,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -6777,7 +6778,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6801,7 +6802,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6818,7 +6819,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6833,7 +6834,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6851,7 +6852,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6866,7 +6867,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6885,7 +6886,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6902,7 +6903,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -6923,7 +6924,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6939,7 +6940,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -6953,7 +6954,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6976,7 +6977,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6987,7 +6988,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "log", "sp-arithmetic", @@ -6996,7 +6997,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "sp-api", @@ -7005,7 +7006,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -7022,7 +7023,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -7051,7 +7052,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -7069,7 +7070,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -7088,7 +7089,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-support", "frame-system", @@ -7104,7 +7105,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7120,7 +7121,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7132,7 +7133,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -7149,7 +7150,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -7164,7 +7165,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -7180,7 +7181,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -7195,7 +7196,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-benchmarking", "frame-support", @@ -7210,7 +7211,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7231,7 +7232,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7780,7 +7781,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "futures", "polkadot-node-jaeger", @@ -7796,7 +7797,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7810,7 +7811,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "derive_more", "fatality", @@ -7833,7 +7834,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "fatality", "futures", @@ -7854,7 +7855,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "clap 4.1.14", "frame-benchmarking-cli", @@ -7882,7 +7883,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "async-trait", "frame-benchmarking", @@ -7925,7 +7926,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "always-assert", "bitvec", @@ -7947,7 +7948,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "parity-scale-codec", "scale-info", @@ -7959,7 +7960,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "derive_more", "fatality", @@ -7984,7 +7985,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -7998,7 +7999,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "futures", "futures-timer", @@ -8018,7 +8019,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "always-assert", "async-trait", @@ -8041,7 +8042,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "futures", "parity-scale-codec", @@ -8059,7 +8060,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bitvec", "derive_more", @@ -8088,7 +8089,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bitvec", "futures", @@ -8109,7 +8110,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bitvec", "fatality", @@ -8128,7 +8129,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8143,7 +8144,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "async-trait", "futures", @@ -8163,7 +8164,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "futures", "polkadot-node-metrics", @@ -8178,7 +8179,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "futures", "futures-timer", @@ -8195,7 +8196,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "fatality", "futures", @@ -8214,7 +8215,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "async-trait", "futures", @@ -8231,7 +8232,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bitvec", "fatality", @@ -8249,7 +8250,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "always-assert", "assert_matches", @@ -8286,7 +8287,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "futures", "polkadot-node-primitives", @@ -8302,7 +8303,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "futures", "lru 0.9.0", @@ -8317,7 +8318,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "lazy_static", "log", @@ -8335,7 +8336,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bs58", "futures", @@ -8354,7 +8355,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "async-trait", "derive_more", @@ -8376,7 +8377,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bounded-vec", "futures", @@ -8399,7 +8400,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8409,7 +8410,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "async-trait", "futures", @@ -8427,7 +8428,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "async-trait", "derive_more", @@ -8450,7 +8451,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "async-trait", "derive_more", @@ -8483,7 +8484,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "async-trait", "futures", @@ -8506,7 +8507,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bounded-collections", "derive_more", @@ -8604,7 +8605,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8620,7 +8621,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bitvec", "hex-literal 0.3.4", @@ -8646,7 +8647,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8678,7 +8679,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bitvec", "frame-benchmarking", @@ -8772,7 +8773,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bitvec", "frame-benchmarking", @@ -8818,7 +8819,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "frame-support", "polkadot-primitives", @@ -8832,7 +8833,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bs58", "parity-scale-codec", @@ -8844,7 +8845,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bitflags", "bitvec", @@ -8888,7 +8889,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -8998,7 +8999,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9019,7 +9020,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9029,7 +9030,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9054,7 +9055,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9115,7 +9116,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "frame-benchmarking", "frame-system", @@ -9332,6 +9333,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-warning" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d4f284d87b9cedc2ff57223cbc4e3937cd6063c01e92c8e2a8c080df0013933" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "proc-macro2" version = "1.0.56" @@ -9860,7 +9872,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -9946,7 +9958,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "frame-support", "polkadot-primitives", @@ -10193,7 +10205,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "log", "sp-core", @@ -10204,7 +10216,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "futures", @@ -10232,7 +10244,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "futures", "futures-timer", @@ -10255,7 +10267,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10270,7 +10282,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10289,7 +10301,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10300,7 +10312,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10340,7 +10352,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "fnv", "futures", @@ -10366,7 +10378,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "hash-db", "kvdb", @@ -10392,7 +10404,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "futures", @@ -10417,7 +10429,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "futures", @@ -10446,7 +10458,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "fork-tree", @@ -10485,7 +10497,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "futures", "jsonrpsee", @@ -10507,7 +10519,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10542,7 +10554,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "futures", "jsonrpsee", @@ -10561,7 +10573,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10574,7 +10586,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10614,7 +10626,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "finality-grandpa", "futures", @@ -10634,7 +10646,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "futures", @@ -10657,7 +10669,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10681,7 +10693,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10694,7 +10706,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "log", "sc-allocator", @@ -10707,7 +10719,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "anyhow", "cfg-if", @@ -10725,7 +10737,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "ansi_term", "futures", @@ -10741,7 +10753,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10756,7 +10768,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10801,7 +10813,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "cid", "futures", @@ -10821,7 +10833,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10849,7 +10861,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "ahash 0.8.2", "futures", @@ -10868,7 +10880,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10890,7 +10902,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10924,7 +10936,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10944,7 +10956,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -10975,7 +10987,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "futures", "libp2p", @@ -10988,7 +11000,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -10997,7 +11009,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "futures", "jsonrpsee", @@ -11027,7 +11039,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11046,7 +11058,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "http", "jsonrpsee", @@ -11061,7 +11073,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11087,7 +11099,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "directories", @@ -11153,7 +11165,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "log", "parity-scale-codec", @@ -11164,7 +11176,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "clap 4.1.14", "fs4", @@ -11180,7 +11192,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11199,7 +11211,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "futures", "libc", @@ -11218,7 +11230,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "chrono", "futures", @@ -11237,7 +11249,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "ansi_term", "atty", @@ -11268,7 +11280,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11279,7 +11291,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "futures", @@ -11306,7 +11318,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "futures", @@ -11320,7 +11332,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-channel", "futures", @@ -11801,7 +11813,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "enumn", "parity-scale-codec", @@ -11878,7 +11890,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "hash-db", "log", @@ -11896,7 +11908,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "Inflector", "blake2", @@ -11910,7 +11922,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "scale-info", @@ -11923,7 +11935,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "integer-sqrt", "num-traits", @@ -11937,7 +11949,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "scale-info", @@ -11950,7 +11962,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "sp-api", @@ -11962,7 +11974,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "futures", "log", @@ -11980,7 +11992,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "futures", @@ -11995,7 +12007,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "parity-scale-codec", @@ -12013,7 +12025,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "merlin", @@ -12036,7 +12048,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12055,7 +12067,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "finality-grandpa", "log", @@ -12073,7 +12085,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "scale-info", @@ -12085,7 +12097,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "scale-info", @@ -12098,7 +12110,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12141,7 +12153,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "blake2b_simd", "byteorder", @@ -12155,7 +12167,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "proc-macro2", "quote", @@ -12166,7 +12178,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12175,7 +12187,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "proc-macro2", "quote", @@ -12185,7 +12197,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "environmental", "parity-scale-codec", @@ -12196,7 +12208,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12211,7 +12223,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "bytes", "ed25519", @@ -12237,7 +12249,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "lazy_static", "sp-core", @@ -12248,7 +12260,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "futures", "merlin", @@ -12264,7 +12276,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "thiserror", "zstd", @@ -12273,7 +12285,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12291,7 +12303,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "scale-info", @@ -12305,7 +12317,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "sp-api", "sp-core", @@ -12315,7 +12327,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "backtrace", "lazy_static", @@ -12325,7 +12337,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "rustc-hash", "serde", @@ -12335,7 +12347,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "either", "hash256-std-hasher", @@ -12357,7 +12369,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12375,7 +12387,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "Inflector", "proc-macro-crate", @@ -12387,7 +12399,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "serde", "serde_json", @@ -12396,7 +12408,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "scale-info", @@ -12410,7 +12422,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "scale-info", @@ -12422,7 +12434,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "hash-db", "log", @@ -12442,12 +12454,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12460,7 +12472,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "futures-timer", @@ -12475,7 +12487,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "sp-std", @@ -12487,7 +12499,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "sp-api", "sp-runtime", @@ -12496,7 +12508,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "log", @@ -12512,7 +12524,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12535,7 +12547,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12552,7 +12564,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12563,7 +12575,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12577,7 +12589,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "parity-scale-codec", "scale-info", @@ -12901,7 +12913,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "platforms 2.0.0", ] @@ -12909,7 +12921,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -12928,7 +12940,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "hyper", "log", @@ -12940,7 +12952,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "jsonrpsee", @@ -12953,7 +12965,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "jsonrpsee", "log", @@ -12972,7 +12984,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12998,7 +13010,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13008,7 +13020,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13019,7 +13031,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "ansi_term", "build-helper", @@ -13146,7 +13158,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "frame-support", "polkadot-primitives", @@ -13536,7 +13548,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13547,7 +13559,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "expander 0.0.6", "proc-macro-crate", @@ -13677,7 +13689,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bbcc63a96c8b77b9d07968cc2612a5c15b8cc0e5" +source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" dependencies = [ "async-trait", "clap 4.1.14", @@ -14605,7 +14617,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bitvec", "frame-benchmarking", @@ -14697,7 +14709,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "frame-support", "polkadot-primitives", @@ -15133,7 +15145,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "bounded-collections", "derivative", @@ -15149,7 +15161,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "frame-support", "frame-system", @@ -15170,7 +15182,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "environmental", "frame-benchmarking", @@ -15190,7 +15202,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#00b80ecadbef54ddcc652718385b54b0d05ef5d9" +source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" dependencies = [ "Inflector", "proc-macro2", diff --git a/pallets/parachain-system/src/lib.rs b/pallets/parachain-system/src/lib.rs index 97c6cfe368d..ac3b8648c65 100644 --- a/pallets/parachain-system/src/lib.rs +++ b/pallets/parachain-system/src/lib.rs @@ -492,7 +492,7 @@ pub mod pallet { /// /// All origins are allowed. #[pallet::call_index(3)] - #[pallet::weight(1_000_000)] + #[pallet::weight({1_000_000})] pub fn enact_authorized_upgrade( _: OriginFor, code: Vec, diff --git a/pallets/solo-to-para/src/lib.rs b/pallets/solo-to-para/src/lib.rs index 515dd385e7b..a05a5121de1 100644 --- a/pallets/solo-to-para/src/lib.rs +++ b/pallets/solo-to-para/src/lib.rs @@ -61,7 +61,7 @@ pub mod pallet { #[pallet::call] impl Pallet { #[pallet::call_index(0)] - #[pallet::weight(0)] + #[pallet::weight({0})] pub fn schedule_migration( origin: OriginFor, code: Vec, diff --git a/parachains/pallets/ping/src/lib.rs b/parachains/pallets/ping/src/lib.rs index 956457f5916..0260f05dad2 100644 --- a/parachains/pallets/ping/src/lib.rs +++ b/parachains/pallets/ping/src/lib.rs @@ -141,7 +141,7 @@ pub mod pallet { #[pallet::call] impl Pallet { #[pallet::call_index(0)] - #[pallet::weight(0)] + #[pallet::weight({0})] pub fn start(origin: OriginFor, para: ParaId, payload: Vec) -> DispatchResult { ensure_root(origin)?; let payload = BoundedVec::::try_from(payload) @@ -153,7 +153,7 @@ pub mod pallet { } #[pallet::call_index(1)] - #[pallet::weight(0)] + #[pallet::weight({0})] pub fn start_many( origin: OriginFor, para: ParaId, @@ -173,7 +173,7 @@ pub mod pallet { } #[pallet::call_index(2)] - #[pallet::weight(0)] + #[pallet::weight({0})] pub fn stop(origin: OriginFor, para: ParaId) -> DispatchResult { ensure_root(origin)?; Targets::::mutate(|t| { @@ -185,7 +185,7 @@ pub mod pallet { } #[pallet::call_index(3)] - #[pallet::weight(0)] + #[pallet::weight({0})] pub fn stop_all(origin: OriginFor, maybe_para: Option) -> DispatchResult { ensure_root(origin)?; if let Some(para) = maybe_para { @@ -197,7 +197,7 @@ pub mod pallet { } #[pallet::call_index(4)] - #[pallet::weight(0)] + #[pallet::weight({0})] pub fn ping(origin: OriginFor, seq: u32, payload: Vec) -> DispatchResult { // Only accept pings from other chains. let para = ensure_sibling_para(::RuntimeOrigin::from(origin))?; @@ -224,7 +224,7 @@ pub mod pallet { } #[pallet::call_index(5)] - #[pallet::weight(0)] + #[pallet::weight({0})] pub fn pong(origin: OriginFor, seq: u32, payload: Vec) -> DispatchResult { // Only accept pings from other chains. let para = ensure_sibling_para(::RuntimeOrigin::from(origin))?; diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index 3e726b5b4b7..9c1fda61bd8 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -163,7 +163,6 @@ impl Contains for SafeCallFilter { // but the call can be initiated only by root origin. pallet_alliance::Call::init_members { .. } | pallet_alliance::Call::vote { .. } | - pallet_alliance::Call::close_old_weight { .. } | pallet_alliance::Call::disband { .. } | pallet_alliance::Call::set_rule { .. } | pallet_alliance::Call::announce { .. } | @@ -179,7 +178,6 @@ impl Contains for SafeCallFilter { ) | RuntimeCall::AllianceMotion( pallet_collective::Call::vote { .. } | - pallet_collective::Call::close_old_weight { .. } | pallet_collective::Call::disapprove_proposal { .. } | pallet_collective::Call::close { .. }, ) | From b49628f316c1086fd2f5cc8ef2a52cceca8b8818 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Wed, 5 Apr 2023 13:08:13 +0200 Subject: [PATCH 102/339] [Backport] version bumps 9400 (#2424) * Bump crate versions * Bump spec_version to 9400 * bump transaction versions (#2364) --- Cargo.lock | 2 +- parachains/runtimes/assets/statemine/src/lib.rs | 8 ++++---- parachains/runtimes/assets/statemint/src/lib.rs | 4 ++-- parachains/runtimes/assets/westmint/src/lib.rs | 4 ++-- .../runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs | 4 ++-- .../runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs | 4 ++-- .../runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs | 4 ++-- .../runtimes/collectives/collectives-polkadot/src/lib.rs | 4 ++-- parachains/runtimes/contracts/contracts-rococo/src/lib.rs | 4 ++-- parachains/runtimes/starters/seedling/src/lib.rs | 2 +- parachains/runtimes/testing/penpal/src/lib.rs | 2 +- parachains/runtimes/testing/rococo-parachain/src/lib.rs | 4 ++-- polkadot-parachain/Cargo.toml | 2 +- 13 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8a9810b8a0f..9a6be69e4e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8523,7 +8523,7 @@ dependencies = [ [[package]] name = "polkadot-parachain-bin" -version = "0.9.380" +version = "0.9.400" dependencies = [ "assert_cmd", "async-trait", diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 6c332a11520..62425aa7496 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -97,10 +97,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 12, + transaction_version: 13, state_version: 1, }; @@ -110,10 +110,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 12, + transaction_version: 13, state_version: 0, }; diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index d62b19be844..a72df7314e6 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -120,10 +120,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemint"), impl_name: create_runtime_str!("statemint"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 12, + transaction_version: 13, state_version: 0, }; diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 45c0e9f27b2..97d2596a4bd 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -96,10 +96,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westmint"), impl_name: create_runtime_str!("westmint"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 12, + transaction_version: 13, state_version: 0, }; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs index 3c77d40086c..4ebf760e849 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -128,10 +128,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-kusama"), impl_name: create_runtime_str!("bridge-hub-kusama"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 2, + transaction_version: 3, state_version: 1, }; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs index 9c9c8ba1c58..109cd2434b3 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -128,10 +128,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-polkadot"), impl_name: create_runtime_str!("bridge-hub-polkadot"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 1, + transaction_version: 2, state_version: 1, }; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 9c52457d164..04eddf59e3a 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -187,10 +187,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-rococo"), impl_name: create_runtime_str!("bridge-hub-rococo"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 2, + transaction_version: 3, state_version: 1, }; diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs index 4d89bfd8718..c928eda49d1 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs @@ -105,10 +105,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("collectives"), impl_name: create_runtime_str!("collectives"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 3, + transaction_version: 4, state_version: 0, }; diff --git a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 57396a3a0e7..819bb7ba537 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -120,10 +120,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("contracts-rococo"), impl_name: create_runtime_str!("contracts-rococo"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 5, + transaction_version: 6, state_version: 1, }; diff --git a/parachains/runtimes/starters/seedling/src/lib.rs b/parachains/runtimes/starters/seedling/src/lib.rs index a1754002cd9..2861cac1fe4 100644 --- a/parachains/runtimes/starters/seedling/src/lib.rs +++ b/parachains/runtimes/starters/seedling/src/lib.rs @@ -67,7 +67,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("seedling"), impl_name: create_runtime_str!("seedling"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 2, diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index 62a048bdbe2..7ade3bd2f63 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -224,7 +224,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("penpal-parachain"), impl_name: create_runtime_str!("penpal-parachain"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 532f39f368b..1a26290f2a3 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -101,10 +101,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("test-parachain"), impl_name: create_runtime_str!("test-parachain"), authoring_version: 1, - spec_version: 9381, + spec_version: 9400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 5, + transaction_version: 6, state_version: 0, }; diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 9b1e0e10484..7c45491e1ea 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain-bin" -version = "0.9.380" +version = "0.9.400" authors = ["Parity Technologies "] build = "build.rs" edition = "2021" From 77ad7767d10bea084ad09a7ba4feb8ea412541bb Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 5 Apr 2023 15:47:16 +0200 Subject: [PATCH 103/339] Refactor to support multiple MultiAsset + cleaning --- .../bridge-transfer/src/benchmarking.rs | 30 +- parachains/pallets/bridge-transfer/src/lib.rs | 339 +++++++++++++----- .../runtimes/assets/statemine/src/lib.rs | 1 + .../assets/statemine/src/xcm_config.rs | 44 ++- .../runtimes/assets/statemine/tests/tests.rs | 2 +- .../assets/test-utils/src/test_cases.rs | 120 ++++++- .../runtimes/assets/westmint/src/lib.rs | 2 + .../runtimes/assets/westmint/tests/tests.rs | 17 + 8 files changed, 429 insertions(+), 126 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index 8c8aae55a86..4b33724aabb 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -23,7 +23,10 @@ use crate::{ }; use frame_benchmarking::{benchmarks, BenchmarkError}; -use frame_support::traits::{EnsureOrigin, Get}; +use frame_support::{ + ensure, + traits::{EnsureOrigin, Get}, +}; use sp_std::prelude::*; use xcm::prelude::*; @@ -43,19 +46,27 @@ benchmarks! { transfer_asset_via_bridge { let _ = T::TransferAssetOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; // every asset has its own configuration and ledger, so there's a performance dependency - // TODO: add proper range after once pallet works with multiple assets // (be sure to use "worst" of assets) - // let a in 1 .. 1; + let max_assets_limit = T::MaxAssetsLimit::get(); + ensure!(max_assets_limit > 0, "MaxAssetsLimit not set up correctly."); let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config() .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - let (origin, assets, destination) = T::BenchmarkHelper::prepare_asset_transfer(1) + let (origin, assets, destination) = T::BenchmarkHelper::prepare_asset_transfer() .ok_or(BenchmarkError::Stop("missing `prepare_asset_transfer` data"))?; + let assets_count = match &assets { + VersionedMultiAssets::V2(assets) => assets.len(), + VersionedMultiAssets::V3(assets) => assets.len(), + }; + ensure!(assets_count == max_assets_limit as usize, "`assets` not set up correctly for worst case."); AllowedExporters::::insert(bridged_network, bridge_config); }: _(origin, Box::new(assets), Box::new(destination)) verify { - // we don't care about message hash here, just check that the transfer has been initiated + // we don't care about message hash or sender cost here, just check that the transfer has been initiated let actual_event = frame_system::Pallet::::events().pop().map(|r| r.event); - let expected_event: ::RuntimeEvent = Event::TransferInitiated(Default::default()).into(); + let expected_event: ::RuntimeEvent = Event::TransferInitiated { + message_hash: Default::default(), + sender_cost: Default::default(), + }.into(); assert!(matches!(actual_event, Some(expected_event))); } @@ -79,9 +90,12 @@ benchmarks! { )?; }: _(origin, Box::new(destination)) verify { - // we don't care about message hash here, just check that the transfer has been initiated + // we don't care about message hash or sender cost here, just check that the transfer has been initiated let actual_event = frame_system::Pallet::::events().pop().map(|r| r.event); - let expected_event: ::RuntimeEvent = Event::TransferInitiated(Default::default()).into(); + let expected_event: ::RuntimeEvent = Event::TransferInitiated { + message_hash: Default::default(), + sender_cost: Default::default(), + }.into(); assert!(matches!(actual_event, Some(expected_event))); } diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index fa31c70a8d6..d772543e399 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -21,7 +21,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::BoundedBTreeSet; +use frame_support::{transactional, BoundedBTreeSet}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; use sp_std::boxed::Box; @@ -87,7 +87,6 @@ pub mod pallet { use super::*; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - use xcm::latest::Error as XcmError; use xcm_executor::traits::TransactAsset; #[pallet::pallet] @@ -116,7 +115,6 @@ pub mod pallet { /// the assets transfer, it should be created. If there are multiple bridges, the "worst possible" /// (in terms of performance) bridge must be selected for the transfer. fn prepare_asset_transfer( - _assets_count: u32, ) -> Option<(RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation)> { None } @@ -175,6 +173,9 @@ pub mod pallet { /// Required origin for asset transfer. If successful, it resolves to `MultiLocation`. /// (Config for transfer out) type TransferAssetOrigin: EnsureOrigin; + /// Max count of assets in one call + /// (Config for transfer out) + type MaxAssetsLimit: Get; /// Required origin for ping transfer. If successful, it resolves to `MultiLocation`. /// (Config for transfer out) type TransferPingOrigin: EnsureOrigin; @@ -222,6 +223,7 @@ pub mod pallet { InvalidAssets, MaxAssetsLimitReached, UnsupportedDestination, + InvalidRemoteDestination, BridgeCallError, FailedToReserve, UnsupportedPing, @@ -233,6 +235,9 @@ pub mod pallet { /// Transfer was successfully entered to the system (does not mean already delivered) TransferInitiated { message_hash: XcmHash, sender_cost: MultiAssets }, + /// Reserve asset passed + ReserveAssetsDeposited { from: MultiLocation, to: MultiLocation, assets: MultiAssets }, + /// New bridge configuration was added BridgeAdded, /// Bridge configuration was removed @@ -249,14 +254,6 @@ pub mod pallet { ReserveLocationAdded, /// New reserve location was removed ReserveLocationRemoved, - - /// Reserve asset passed - ReserveAssetsDeposited { from: MultiLocation, to: MultiLocation, assets: MultiAssets }, - /// Reserve asset failed - FailedToReserve(XcmError), - - /// Bridge transfer failed - BridgeCallError(SendError), } #[pallet::call] @@ -269,100 +266,33 @@ pub mod pallet { /// * `destination`: Different consensus location, where the assets will be deposited, e.g. Polkadot's Statemint: `2, X2(GlobalConsensus(NetworkId::Polkadot), Parachain(1000))` #[pallet::call_index(0)] #[pallet::weight(T::WeightInfo::transfer_asset_via_bridge())] - // TODO:check-parameter - instead of compensations, use #[transactional] + add test pub fn transfer_asset_via_bridge( origin: OriginFor, assets: Box, destination: Box, ) -> DispatchResult { + // Check origin let origin_location = T::TransferAssetOrigin::ensure_origin(origin)?; + // Check remote destination + bridge_config let (_, bridge_config, remote_destination) = Self::ensure_remote_destination(*destination)?; - // Check reserve account - sovereign account of bridge - let reserve_account = bridge_config.bridge_location; - let allowed_target_location = bridge_config.allowed_target_location; - - // TODO: do some checks - balances, can_withdraw, ... - // TODO:check-parameter - check assets: - // TODO:check-parameter - check assets - allow just fungible or non-fungible? allow mix? - // TODO:check-parameter - check assets - allow Abstract assets - reanchor ignores them? - // TODO:check-parameter - check enought fee? - // TODO:check-parameter - reserve_account has enought for existential deposit? - - // TODO: fix this for multiple assets + // Check assets (lets leave others checks on `AssetTransactor`) let assets: MultiAssets = (*assets).try_into().map_err(|()| Error::::InvalidAssets)?; - ensure!(assets.len() == 1, Error::::MaxAssetsLimitReached); - let asset = assets.get(0).unwrap(); - - // Deposit assets into `AccountId` that corresponds to the bridge - // hub. In this way, Statemine acts as a reserve location to the - // bridge, such that it need not trust any consensus system from - // `./Parent/Parent/...`. (It may trust Polkadot, but would - // Polkadot trust Kusama with its DOT?) - - // Move asset to reserve account for selected bridge - let mut asset = T::AssetTransactor::transfer_asset( - asset, - &origin_location, - &reserve_account, - // We aren't able to track the XCM that initiated the fee deposit, so we create a - // fake message hash here - &XcmContext::with_message_hash([0; 32]), - ) - .and_then(|assets| { - Self::deposit_event(Event::ReserveAssetsDeposited { - from: origin_location, - to: reserve_account, - assets: assets.clone().into(), - }); - Ok(assets) - }) - .map_err(|e| { - log::error!( - target: LOG_TARGET, - "AssetTransactor failed to reserve assets from origin_location: {:?} to reserve_account: {:?} for assets: {:?}, error: {:?}", - origin_location, - reserve_account, - asset, - e - ); - Self::deposit_event(Event::FailedToReserve(e)); - Error::::FailedToReserve - })?; - - // TODO:check-parameter - asset.clone for compensation or transactional + add test for compensation? - - // Prepare `ReserveAssetDeposited` msg to bridge to the other side. - // Reanchor stuff: we need to convert local asset id/MultiLocation to format, that could be understood by different consensus and from their point-of-view - asset.reanchor(&allowed_target_location, T::UniversalLocation::get(), None); - let remote_destination = remote_destination - .reanchored(&allowed_target_location, T::UniversalLocation::get()) - .expect("// TODO:check-parameter - handle compensation?"); - - // prepare xcm message (maybe_paid + ReserveAssetDeposited stuff) - let mut xcm_instructions = match bridge_config.target_location_fee { - Some(target_location_fee) => sp_std::vec![ - WithdrawAsset(target_location_fee.clone().into()), - BuyExecution { fees: target_location_fee, weight_limit: Unlimited }, - ], - None => - sp_std::vec![UnpaidExecution { check_origin: None, weight_limit: Unlimited }], - }; - xcm_instructions.extend(sp_std::vec![ - ReserveAssetDeposited(asset.clone().into()), - ClearOrigin, - DepositAsset { - assets: MultiAssetFilter::from(MultiAssets::from(asset)), - beneficiary: remote_destination - } - ]); + ensure!( + assets.len() <= T::MaxAssetsLimit::get() as usize, + Error::::MaxAssetsLimitReached + ); - // TODO:check-parameter how to compensate if this call fails? return back deposisted assets? - Self::initiate_bridge_transfer(allowed_target_location, xcm_instructions.into()) - .map_err(Into::into) + // Do this in transaction (explicitly), the rollback should occur in case of any error and no assets will be trapped or lost + Self::do_reserve_and_send_in_transaction( + origin_location, + remote_destination, + assets, + bridge_config, + ) } /// Transfer `ping` via bridge to different global consensus. @@ -646,6 +576,97 @@ pub mod pallet { } } + #[transactional] + fn do_reserve_and_send_in_transaction( + origin_location: MultiLocation, + remote_destination: MultiLocation, + assets: MultiAssets, + bridge_config: BridgeConfig, + ) -> Result<(), DispatchError> { + // Resolve reserve account as sovereign account of bridge + let reserve_account = bridge_config.bridge_location; + + let allowed_target_location = bridge_config.allowed_target_location; + + // lets try to do a reserve for all assets + let mut reserved_assets = xcm_executor::Assets::new(); + for asset in assets.into_inner() { + // TODO:check-parameter - verify this Joe's text + // Deposit assets into `AccountId` that corresponds to the bridge + // hub. In this way, Statemine acts as a reserve location to the + // bridge, such that it need not trust any consensus system from + // `./Parent/Parent/...`. (It may trust Polkadot, but would + // Polkadot trust Kusama with its DOT?) + + // Move asset to reserve account + T::AssetTransactor::transfer_asset( + &asset, + &origin_location, + &reserve_account, + // We aren't able to track the XCM that initiated the fee deposit, so we create a + // fake message hash here + &XcmContext::with_message_hash([0; 32]), + ) + .and_then(|reserved_asset| { + Self::deposit_event(Event::ReserveAssetsDeposited { + from: origin_location, + to: reserve_account, + assets: reserved_asset.clone().into(), + }); + reserved_assets.subsume_assets(reserved_asset); + Ok(()) + }) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "AssetTransactor failed to reserve assets from origin_location: {:?} to reserve_account: {:?} for assets: {:?}, error: {:?}", + origin_location, + reserve_account, + asset, + e + ); + Error::::FailedToReserve + })?; + } + + // Prepare `ReserveAssetDeposited` msg to bridge to the other side. + // Reanchor stuff - we need to convert local asset id/MultiLocation to format that could be understood by different consensus and from their point-of-view + reserved_assets.reanchor(&allowed_target_location, T::UniversalLocation::get(), None); + let remote_destination = remote_destination + .reanchored(&allowed_target_location, T::UniversalLocation::get()) + .map_err(|errored_dest| { + log::error!( + target: LOG_TARGET, + "Failed to reanchor remote_destination: {:?} for allowed_target_location: {:?} and universal_location: {:?}", + errored_dest, + allowed_target_location, + T::UniversalLocation::get() + ); + Error::::InvalidRemoteDestination + })?; + + // prepare xcm message (maybe_paid + ReserveAssetDeposited stuff) + let mut xcm_instructions = match bridge_config.target_location_fee { + Some(target_location_fee) => sp_std::vec![ + WithdrawAsset(target_location_fee.clone().into()), + BuyExecution { fees: target_location_fee, weight_limit: Unlimited }, + ], + None => + sp_std::vec![UnpaidExecution { check_origin: None, weight_limit: Unlimited }], + }; + xcm_instructions.extend(sp_std::vec![ + ReserveAssetDeposited(reserved_assets.clone().into()), + ClearOrigin, + DepositAsset { + assets: MultiAssetFilter::from(MultiAssets::from(reserved_assets)), + beneficiary: remote_destination + } + ]); + + Self::initiate_bridge_transfer(allowed_target_location, xcm_instructions.into()) + .map_err(Into::into) + } + fn initiate_bridge_transfer(dest: MultiLocation, xcm: Xcm<()>) -> Result<(), Error> { log::info!( target: LOG_TARGET, @@ -661,7 +682,6 @@ pub mod pallet { "[T::BridgeXcmSender] SendError occurred, error: {:?}", e ); - Self::deposit_event(Event::BridgeCallError(e)); Error::::BridgeCallError })?; @@ -820,9 +840,40 @@ pub(crate) mod tests { } } + pub struct NotApplicableOrFailOnParachain2222XcmRouter; + impl SendXcm for NotApplicableOrFailOnParachain2222XcmRouter { + type Ticket = Option>; + + fn validate( + destination: &mut Option, + message: &mut Option>, + ) -> SendResult { + log::info!( + target: super::LOG_TARGET, + "[NotApplicableOrFailOnParachain2222XcmRouter]: destination: {:?}, message: {:?}", + destination, + message + ); + if matches!( + destination, + Some(MultiLocation { interior: X1(Parachain(2222)), parents: 1 }) + ) { + Err(SendError::Transport("Simulate what ever error")) + } else { + Err(SendError::NotApplicable) + } + } + + fn deliver(ticket: Self::Ticket) -> Result { + unimplemented!("We should not come here, ticket: {:?}", ticket) + } + } + + pub type XcmRouter = (NotApplicableOrFailOnParachain2222XcmRouter, ThreadLocalXcmRouter); + /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus pub type TestBridgeXcmSender = - UnpaidRemoteExporter; + UnpaidRemoteExporter; /// No local origins on this chain are allowed to dispatch XCM sends/executions. pub type LocalOriginToLocation = SignedToAccountId32; @@ -874,9 +925,10 @@ pub(crate) mod tests { test_bridge_config() } - fn prepare_asset_transfer( - assets_count: u32, - ) -> (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation) { + fn prepare_asset_transfer() -> (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation) + { + let assets_count = MaxAssetsLimit::get(); + // sender account must have enough funds let sender_account = account(1); let total_deposit = ExistentialDeposit::get() * (1 + assets_count as u64); @@ -907,6 +959,7 @@ pub(crate) mod tests { parameter_types! { pub const TrapCode: u64 = 12345; + pub const MaxAssetsLimit: u8 = 1; } impl Config for TestRuntime { @@ -919,6 +972,7 @@ pub(crate) mod tests { type AssetTransactor = CurrencyTransactor; type BridgeXcmSender = TestBridgeXcmSender; type TransferAssetOrigin = EnsureXcmOrigin; + type MaxAssetsLimit = MaxAssetsLimit; type TransferPingOrigin = EnsureXcmOrigin; type PingMessageBuilder = UnpaidTrapMessageBuilder; #[cfg(feature = "runtime-benchmarks")] @@ -1014,7 +1068,6 @@ pub(crate) mod tests { }) } - // TODO: add test for pallet_asset not only blances #[test] fn test_transfer_asset_via_bridge_for_currency_works() { new_test_ext().execute_with(|| { @@ -1025,7 +1078,7 @@ pub(crate) mod tests { let user_free_balance = Balances::free_balance(&user_account); let balance_to_transfer = 15_u64; assert!((user_free_balance - balance_to_transfer) >= ExistentialDeposit::get()); - // TODO: because, sovereign account needs to have ED otherwise reserve fails + // because, sovereign account needs to have ED otherwise reserve fails assert!(balance_to_transfer >= ExistentialDeposit::get()); // insert bridge config @@ -1109,6 +1162,94 @@ pub(crate) mod tests { }); } + #[test] + fn test_transfer_asset_via_bridge_in_case_of_error_transactional_works() { + new_test_ext().execute_with(|| { + // initialize some Balances for user_account + let user_account = account(1); + let user_account_init_balance = 1000_u64; + let _ = Balances::deposit_creating(&user_account, user_account_init_balance); + let user_free_balance = Balances::free_balance(&user_account); + let balance_to_transfer = 15_u64; + assert!((user_free_balance - balance_to_transfer) >= ExistentialDeposit::get()); + // because, sovereign account needs to have ED otherwise reserve fails + assert!(balance_to_transfer >= ExistentialDeposit::get()); + + // insert bridge config (with unroutable bridge_location - 2222) + let bridged_network = Wococo; + assert_ok!(BridgeTransfer::add_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Box::new(BridgeConfig { + bridge_location: MultiLocation::new(1, Parachain(2222)).into(), + bridge_location_fee: None, + allowed_target_location: MultiLocation::new( + 2, + X2(GlobalConsensus(Wococo), Parachain(1000)), + ), + target_location_fee: None, + }), + )); + + let bridge_location = AllowedExporters::::get(bridged_network) + .expect("stored BridgeConfig for bridged_network") + .bridge_location; + + // checks before + assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); + let user_balance_before = Balances::free_balance(&user_account); + assert_eq!(user_balance_before, user_account_init_balance); + let bridge_location_as_sovereign_account = + LocationToAccountId::convert_ref(bridge_location) + .expect("converted bridge location as accountId"); + let reserve_account_before = + Balances::free_balance(&bridge_location_as_sovereign_account); + assert_eq!(reserve_account_before, 0); + + // trigger transfer_asset_via_bridge - should trigger new ROUTED_MESSAGE + let asset = MultiAsset { + fun: Fungible(balance_to_transfer.into()), + id: Concrete(RelayLocation::get()), + }; + let assets = Box::new(VersionedMultiAssets::from(MultiAssets::from(asset))); + + // destination is account from different consensus + let destination = Box::new(VersionedMultiLocation::from(MultiLocation::new( + 2, + X3(GlobalConsensus(Wococo), Parachain(1000), consensus_account(Wococo, 2)), + ))); + + // reset events + System::reset_events(); + + // trigger asset transfer + assert_noop!( + BridgeTransfer::transfer_asset_via_bridge( + RuntimeOrigin::signed(account(1)), + assets, + destination + ), + DispatchError::Module(ModuleError { + index: 52, + error: [5, 0, 0, 0], + message: Some("BridgeCallError") + }) + ); + + // checks after + // balances are untouched + assert_eq!(Balances::free_balance(&user_account), user_balance_before); + assert_eq!( + Balances::free_balance(&bridge_location_as_sovereign_account), + reserve_account_before + ); + // no xcm messages fired + assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); + // check events (no events because of rollback) + assert!(System::events().is_empty()); + }); + } + #[test] fn test_ping_via_bridge_works() { new_test_ext().execute_with(|| { diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index f6b63421c9b..201a7baaa7b 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -707,6 +707,7 @@ impl pallet_bridge_transfer::Config for Runtime { type AssetTransactor = AssetTransactors; type BridgeXcmSender = BridgeXcmSender; type TransferAssetOrigin = EnsureXcmOrigin; + type MaxAssetsLimit = ConstU8<1>; type TransferPingOrigin = EnsureXcmOrigin; type PingMessageBuilder = pallet_bridge_transfer::UnpaidTrapMessageBuilder>; #[cfg(feature = "runtime-benchmarks")] diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 1ef2c9d60c5..a022a4d321c 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -511,11 +511,6 @@ pub struct BridgeTransferBenchmarksHelper; #[cfg(feature = "runtime-benchmarks")] impl BridgeTransferBenchmarksHelper { - /// Asset that we're transferring and paying fees in. - fn make_asset(fungible: u128) -> MultiAsset { - MultiAsset { fun: Fungible(fungible.into()), id: Concrete(KsmLocation::get()) } - } - /// Parachain at the other side of the bridge that we're connected to. fn allowed_target_location() -> MultiLocation { MultiLocation::new(2, X2(GlobalConsensus(Polkadot), Parachain(1000))) @@ -534,7 +529,7 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe Polkadot, pallet_bridge_transfer::BridgeConfig { bridge_location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), - // TODO: right now `UnpaidRemoteExporter` is used to send XCM messages and it requires + // Right now `UnpaidRemoteExporter` is used to send XCM messages and it requires // fee to be `None`. If we're going to change that (are we?), then we should replace // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` bridge_location_fee: None, @@ -545,25 +540,50 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe } fn prepare_asset_transfer( - assets_count: u32, ) -> Option<(RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation)> { use frame_support::traits::Currency; - assert_eq!(assets_count, 1, "Benchmarks needs to be fixed to support multiple assets"); - // our `BridgeXcmSender` assumes that the HRMP channel is opened between this // parachain and the sibling bridge-hub parachain cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( Self::bridge_hub_para_id().into(), ); - // deposit enough funds to the sender account + // sender account let sender_account = AccountId::from([42u8; 32]); + + // We need root origin to create asset + let minimum_asset_balance = 3333333_u128; + let local_asset_id = 1; + frame_support::assert_ok!(Assets::force_create( + RuntimeOrigin::root(), + local_asset_id.into(), + sender_account.clone().into(), + true, + minimum_asset_balance + )); + + // We mint enough asset for the account to exist for assets + frame_support::assert_ok!(Assets::mint( + RuntimeOrigin::signed(sender_account.clone()), + local_asset_id.into(), + sender_account.clone().into(), + minimum_asset_balance * 4 + )); + + // deposit enough funds to the sender account let existential_deposit = crate::ExistentialDeposit::get(); let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); - // finally - prepare assets and destination - let assets = xcm::VersionedMultiAssets::V3(Self::make_asset(existential_deposit).into()); + // finally - prepare assets and destination (pallet_assets is worse than pallet_balances) + use xcm_executor::traits::Convert; + let asset_id_location = assets_common::AssetIdForTrustBackedAssetsConvert::< + TrustBackedAssetsPalletLocation, + >::reverse_ref(local_asset_id) + .unwrap(); + let asset: MultiAsset = (Concrete(asset_id_location), minimum_asset_balance * 2).into(); + + let assets = xcm::VersionedMultiAssets::V3(asset.into()); let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); Some((RuntimeOrigin::signed(sender_account), assets, destination)) diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index 09910910590..db2acc78ce4 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -616,7 +616,7 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p }) ); -asset_test_utils::include_can_governance_change_bridge_transfer_configuration!( +asset_test_utils::include_can_governance_change_bridge_transfer_out_configuration!( Runtime, XcmConfig, asset_test_utils::CollatorSessionKeys::new( diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 208cb4c1be0..656446336c0 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -23,7 +23,7 @@ use codec::Encode; use cumulus_primitives_core::XcmpMessageSource; use frame_support::{ assert_noop, assert_ok, - traits::{fungibles::InspectEnumerable, Currency, Get, OriginTrait}, + traits::{fungibles::InspectEnumerable, Contains, Currency, Get, OriginTrait}, weights::Weight, }; use parachains_common::Balance; @@ -1327,8 +1327,8 @@ macro_rules! include_create_and_manage_foreign_assets_for_local_consensus_parach } ); -/// Test-case makes sure that `Runtime` can manage `bridge_transfer` configuration by governance -pub fn can_governance_change_bridge_transfer_configuration( +/// Test-case makes sure that `Runtime` can manage `bridge_transfer out` configuration by governance +pub fn can_governance_change_bridge_transfer_out_configuration( collator_session_keys: CollatorSessionKeys, runtime_call_encode: Box) -> Vec>, unwrap_pallet_bridge_transfer_event: Box< @@ -1466,7 +1466,7 @@ pub fn can_governance_change_bridge_transfer_configuration( } #[macro_export] -macro_rules! include_can_governance_change_bridge_transfer_configuration( +macro_rules! include_can_governance_change_bridge_transfer_out_configuration( ( $runtime:path, $xcm_config:path, @@ -1475,8 +1475,116 @@ macro_rules! include_can_governance_change_bridge_transfer_configuration( $unwrap_pallet_bridge_transfer_event:expr ) => { #[test] - fn can_governance_change_bridge_transfer_configuration() { - asset_test_utils::test_cases::can_governance_change_bridge_transfer_configuration::< + fn can_governance_change_bridge_transfer_out_configuration() { + asset_test_utils::test_cases::can_governance_change_bridge_transfer_out_configuration::< + $runtime, + $xcm_config, + >( + $collator_session_key, + $runtime_call_encode, + $unwrap_pallet_bridge_transfer_event, + ) + } + } +); + +/// Test-case makes sure that `Runtime` can manage `bridge_transfer in` configuration by governance +pub fn can_governance_change_bridge_transfer_in_configuration( + collator_session_keys: CollatorSessionKeys, + runtime_call_encode: Box) -> Vec>, + unwrap_pallet_bridge_transfer_event: Box< + dyn Fn(Vec) -> Option>, + >, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + pallet_bridge_transfer::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + XcmConfig: xcm_executor::Config, +{ + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_tracing() + .with_safe_xcm_version(3) + .build() + .execute_with(|| { + // bridge cfg data + let bridge_location = (Parent, Parachain(1013)).into(); + let alias_junction = GlobalConsensus(ByGenesis([9; 32])); + + // helper to execute BridgeTransfer call + let execute_as_governance = |call| -> Outcome { + // prepare xcm as governance will do + let xcm = Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + Transact { + origin_kind: OriginKind::Superuser, + require_weight_at_most: Weight::from_parts(200_000_000, 12000), + call: runtime_call_encode(call).into(), + }, + ]); + + // origin as relay chain + let origin = MultiLocation { parents: 1, interior: Here }; + + // initialize bridge through governance-like + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + XcmExecutor::::execute_xcm( + origin, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Parent), + ) + }; + + // check before + assert!( + !pallet_bridge_transfer::impls::AllowedUniversalAliasesOf::::contains(&( + bridge_location, + alias_junction + )) + ); + + // governance can add bridge config + assert_ok!(execute_as_governance( + pallet_bridge_transfer::Call::::add_universal_alias { + location: Box::new(VersionedMultiLocation::V3(bridge_location.clone())), + junction: alias_junction, + }, + ) + .ensure_complete()); + assert!(>::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) + .any(|e| matches!(e, pallet_bridge_transfer::Event::UniversalAliasAdded))); + + // check after + assert!(pallet_bridge_transfer::impls::AllowedUniversalAliasesOf::::contains( + &(bridge_location, alias_junction) + )); + }) +} + +#[macro_export] +macro_rules! include_can_governance_change_bridge_transfer_in_configuration( + ( + $runtime:path, + $xcm_config:path, + $collator_session_key:expr, + $runtime_call_encode:expr, + $unwrap_pallet_bridge_transfer_event:expr + ) => { + #[test] + fn can_governance_change_bridge_transfer_in_configuration() { + asset_test_utils::test_cases::can_governance_change_bridge_transfer_in_configuration::< $runtime, $xcm_config, >( diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 3e6a54b3a1d..f33f2a6317a 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -679,6 +679,8 @@ impl pallet_bridge_transfer::Config for Runtime { type TransferAssetOrigin = frame_support::traits::NeverEnsureOrigin; // no transfer allowed out (now) + type MaxAssetsLimit = ConstU8<0>; + // no transfer allowed out (now) type TransferPingOrigin = frame_support::traits::NeverEnsureOrigin; // no transfer allowed out (now) diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 98994ea2bf1..5230d89a0f1 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -620,6 +620,23 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p }) ); +asset_test_utils::include_can_governance_change_bridge_transfer_in_configuration!( + Runtime, + XcmConfig, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }) +); + asset_test_utils::include_receive_reserve_asset_deposited_from_different_consensus_works!( Runtime, XcmConfig, From e6bd54a4fdf8c468d74e71e03b8de77802be63df Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Wed, 5 Apr 2023 14:51:19 +0000 Subject: [PATCH 104/339] ".git/.scripts/commands/bench/bench.sh" xcm westmint assets pallet_xcm_benchmarks::generic --- .../xcm/pallet_xcm_benchmarks_generic.rs | 141 +++++++++--------- 1 file changed, 71 insertions(+), 70 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 5581512445e..90cc5c8b5d0 100644 --- a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,26 +17,27 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-04-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 // Executed Command: -// ./artifacts/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=westmint-dev +// --steps=50 +// --repeat=20 +// --extrinsic=* // --execution=wasm // --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json +// --chain=westmint-dev // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +// --template=./templates/xcm-bench-template.hbs +// --output=./parachains/runtimes/assets/westmint/src/weights/xcm/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -64,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `11269` - // Minimum execution time: 355_263_000 picoseconds. - Weight::from_parts(357_327_000, 11269) + // Minimum execution time: 368_187_000 picoseconds. + Weight::from_parts(369_271_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +74,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_068_000 picoseconds. - Weight::from_parts(4_273_000, 0) + // Minimum execution time: 4_064_000 picoseconds. + Weight::from_parts(4_163_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,58 +83,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `69` // Estimated: `3534` - // Minimum execution time: 11_279_000 picoseconds. - Weight::from_parts(11_626_000, 3534) + // Minimum execution time: 11_590_000 picoseconds. + Weight::from_parts(11_834_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_246_000 picoseconds. - Weight::from_parts(13_425_000, 0) + // Minimum execution time: 14_425_000 picoseconds. + Weight::from_parts(14_713_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_426_000 picoseconds. - Weight::from_parts(4_600_000, 0) + // Minimum execution time: 4_539_000 picoseconds. + Weight::from_parts(4_709_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_838_000 picoseconds. - Weight::from_parts(2_921_000, 0) + // Minimum execution time: 2_933_000 picoseconds. + Weight::from_parts(2_983_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_858_000 picoseconds. - Weight::from_parts(2_981_000, 0) + // Minimum execution time: 2_867_000 picoseconds. + Weight::from_parts(2_957_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_848_000 picoseconds. - Weight::from_parts(2_922_000, 0) + // Minimum execution time: 2_891_000 picoseconds. + Weight::from_parts(2_945_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_732_000 picoseconds. - Weight::from_parts(3_801_000, 0) + // Minimum execution time: 3_783_000 picoseconds. + Weight::from_parts(3_882_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_882_000 picoseconds. - Weight::from_parts(2_971_000, 0) + // Minimum execution time: 2_843_000 picoseconds. + Weight::from_parts(2_959_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -151,8 +152,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `11269` - // Minimum execution time: 25_538_000 picoseconds. - Weight::from_parts(25_964_000, 11269) + // Minimum execution time: 25_284_000 picoseconds. + Weight::from_parts(25_778_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,8 +163,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `126` // Estimated: `3591` - // Minimum execution time: 16_187_000 picoseconds. - Weight::from_parts(16_478_000, 3591) + // Minimum execution time: 16_533_000 picoseconds. + Weight::from_parts(16_974_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +172,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_804_000 picoseconds. - Weight::from_parts(2_874_000, 0) + // Minimum execution time: 2_867_000 picoseconds. + Weight::from_parts(3_018_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -190,8 +191,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `13320` - // Minimum execution time: 28_208_000 picoseconds. - Weight::from_parts(28_512_000, 13320) + // Minimum execution time: 28_098_000 picoseconds. + Weight::from_parts(28_424_000, 13320) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +202,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_021_000 picoseconds. - Weight::from_parts(5_128_000, 0) + // Minimum execution time: 5_062_000 picoseconds. + Weight::from_parts(5_184_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -221,8 +222,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `11269` - // Minimum execution time: 403_561_000 picoseconds. - Weight::from_parts(404_798_000, 11269) + // Minimum execution time: 413_217_000 picoseconds. + Weight::from_parts(415_362_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +231,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 122_646_000 picoseconds. - Weight::from_parts(123_057_000, 0) + // Minimum execution time: 130_094_000 picoseconds. + Weight::from_parts(132_683_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_916_000 picoseconds. - Weight::from_parts(14_178_000, 0) + // Minimum execution time: 12_633_000 picoseconds. + Weight::from_parts(12_833_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_025_000 picoseconds. - Weight::from_parts(3_083_000, 0) + // Minimum execution time: 3_012_000 picoseconds. + Weight::from_parts(3_105_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_879_000 picoseconds. - Weight::from_parts(2_947_000, 0) + // Minimum execution time: 2_926_000 picoseconds. + Weight::from_parts(3_030_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_067_000 picoseconds. - Weight::from_parts(3_129_000, 0) + // Minimum execution time: 3_172_000 picoseconds. + Weight::from_parts(3_250_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -277,8 +278,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `11269` - // Minimum execution time: 29_511_000 picoseconds. - Weight::from_parts(29_922_000, 11269) + // Minimum execution time: 29_409_000 picoseconds. + Weight::from_parts(29_799_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +287,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_410_000 picoseconds. - Weight::from_parts(5_531_000, 0) + // Minimum execution time: 5_448_000 picoseconds. + Weight::from_parts(5_613_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -305,8 +306,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `11269` - // Minimum execution time: 26_044_000 picoseconds. - Weight::from_parts(26_397_000, 11269) + // Minimum execution time: 25_875_000 picoseconds. + Weight::from_parts(26_241_000, 11269) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,22 +315,22 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_950_000 picoseconds. - Weight::from_parts(2_989_000, 0) + // Minimum execution time: 2_880_000 picoseconds. + Weight::from_parts(2_959_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_877_000 picoseconds. - Weight::from_parts(2_928_000, 0) + // Minimum execution time: 2_900_000 picoseconds. + Weight::from_parts(2_972_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_884_000 picoseconds. - Weight::from_parts(2_959_000, 0) + // Minimum execution time: 2_875_000 picoseconds. + Weight::from_parts(2_940_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -339,22 +340,22 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `158` // Estimated: `7373` - // Minimum execution time: 9_471_000 picoseconds. - Weight::from_parts(15_798_000, 7373) + // Minimum execution time: 10_161_000 picoseconds. + Weight::from_parts(10_414_000, 7373) .saturating_add(T::DbWeight::get().reads(2)) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_733_000 picoseconds. - Weight::from_parts(2_862_000, 0) + // Minimum execution time: 2_877_000 picoseconds. + Weight::from_parts(2_974_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_917_000 picoseconds. - Weight::from_parts(2_990_000, 0) + // Minimum execution time: 3_055_000 picoseconds. + Weight::from_parts(3_135_000, 0) } } From 98f6ca732b17e36bb6b2968614241c4c4b5cc44a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 21:57:14 +0000 Subject: [PATCH 105/339] Bump hex-literal from 0.4.0 to 0.4.1 (#2434) Bumps [hex-literal](https://github.com/RustCrypto/utils) from 0.4.0 to 0.4.1. - [Release notes](https://github.com/RustCrypto/utils/releases) - [Commits](https://github.com/RustCrypto/utils/compare/hex-literal-v0.4.0...hex-literal-v0.4.1) --- updated-dependencies: - dependency-name: hex-literal dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 28 +++++++++---------- pallets/parachain-system/Cargo.toml | 2 +- parachain-template/runtime/Cargo.toml | 2 +- .../runtimes/assets/statemine/Cargo.toml | 2 +- .../runtimes/assets/statemint/Cargo.toml | 4 +-- .../runtimes/assets/westmint/Cargo.toml | 4 +-- .../bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../bridge-hub-polkadot/Cargo.toml | 2 +- .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- .../collectives-polkadot/Cargo.toml | 4 +-- .../contracts/contracts-rococo/Cargo.toml | 2 +- parachains/runtimes/testing/penpal/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- 13 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a6be69e4e5..99d36d95246 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -716,7 +716,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "kusama-runtime-constants", "log", "pallet-aura", @@ -779,7 +779,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "log", "pallet-aura", "pallet-authorship", @@ -842,7 +842,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "log", "pallet-aura", "pallet-authorship", @@ -1283,7 +1283,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "log", "pallet-alliance", "pallet-aura", @@ -1418,7 +1418,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "kusama-runtime-constants", "log", "pallet-aura", @@ -2090,7 +2090,7 @@ dependencies = [ "environmental", "frame-support", "frame-system", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "impl-trait-for-tuples", "lazy_static", "log", @@ -4067,9 +4067,9 @@ checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" [[package]] name = "hex-literal" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcb5b3e439c92a7191df2f9bbe733de8de55c3f86368cdb1c63f8be7e9e328e" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "hkdf" @@ -7333,7 +7333,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "log", "pallet-aura", "pallet-authorship", @@ -7576,7 +7576,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "log", "pallet-asset-tx-payment", "pallet-assets", @@ -8545,7 +8545,7 @@ dependencies = [ "frame-benchmarking", "frame-benchmarking-cli", "futures", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "jsonrpsee", "log", "nix 0.26.2", @@ -12676,7 +12676,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "kusama-runtime-constants", "log", "pallet-asset-tx-payment", @@ -12746,7 +12746,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "log", "pallet-asset-tx-payment", "pallet-assets", @@ -14742,7 +14742,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.4.0", + "hex-literal 0.4.1", "log", "pallet-asset-tx-payment", "pallet-assets", diff --git a/pallets/parachain-system/Cargo.toml b/pallets/parachain-system/Cargo.toml index c4aa4ffa1e3..107705901b9 100644 --- a/pallets/parachain-system/Cargo.toml +++ b/pallets/parachain-system/Cargo.toml @@ -36,7 +36,7 @@ cumulus-primitives-core = { path = "../../primitives/core", default-features = f cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent", default-features = false } [dev-dependencies] -hex-literal = "0.4.0" +hex-literal = "0.4.1" lazy_static = "1.4" # Substrate diff --git a/parachain-template/runtime/Cargo.toml b/parachain-template/runtime/Cargo.toml index 0fa6948d58b..ed56ee83e52 100644 --- a/parachain-template/runtime/Cargo.toml +++ b/parachain-template/runtime/Cargo.toml @@ -16,7 +16,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.0", optional = true } +hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index 3fdac10c637..8328106fade 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -7,7 +7,7 @@ description = "Kusama variant of Statemint parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.0" } +hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/assets/statemint/Cargo.toml b/parachains/runtimes/assets/statemint/Cargo.toml index 273c3ff5c2c..a5d2841418a 100644 --- a/parachains/runtimes/assets/statemint/Cargo.toml +++ b/parachains/runtimes/assets/statemint/Cargo.toml @@ -7,7 +7,7 @@ description = "Statemint parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.0", optional = true } +hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" @@ -73,7 +73,7 @@ parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } [dev-dependencies] -hex-literal = "0.4.0" +hex-literal = "0.4.1" asset-test-utils = { path = "../test-utils"} [build-dependencies] diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/westmint/Cargo.toml index 89b59b7def4..a63353adb4e 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/westmint/Cargo.toml @@ -7,7 +7,7 @@ description = "Westend variant of Statemint parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.0", optional = true } +hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" @@ -74,7 +74,7 @@ parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } [dev-dependencies] -hex-literal = "0.4.0" +hex-literal = "0.4.1" asset-test-utils = { path = "../test-utils"} [build-dependencies] diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index 9d8703a6ab8..7a08937cca9 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -10,7 +10,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.0" } +hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } serde = { version = "1.0.159", optional = true, features = ["derive"] } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 2d00cd9fce3..adda06b0b3e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -10,7 +10,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.0" } +hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } serde = { version = "1.0.159", optional = true, features = ["derive"] } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 8cc54ac2672..04aefe39ea3 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -10,7 +10,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.0" } +hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } serde = { version = "1.0.159", optional = true, features = ["derive"] } diff --git a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml index c0659ffb825..eca2c8caa98 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml +++ b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml @@ -7,7 +7,7 @@ description = "Polkadot Collectives Parachain Runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.0", optional = true } +hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" @@ -74,7 +74,7 @@ parachain-info = { path = "../../../pallets/parachain-info", default-features = parachains-common = { path = "../../../common", default-features = false } [dev-dependencies] -hex-literal = "0.4.0" +hex-literal = "0.4.1" [build-dependencies] substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } diff --git a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index 9b5809b3d38..10f222713f9 100644 --- a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.0", optional = true } +hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/testing/penpal/Cargo.toml b/parachains/runtimes/testing/penpal/Cargo.toml index 105f5f8072a..460e3b1d4b4 100644 --- a/parachains/runtimes/testing/penpal/Cargo.toml +++ b/parachains/runtimes/testing/penpal/Cargo.toml @@ -16,7 +16,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.0", optional = true } +hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.16", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 7c45491e1ea..b4ced899f25 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -15,7 +15,7 @@ async-trait = "0.1.68" clap = { version = "4.1.14", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" -hex-literal = "0.4.0" +hex-literal = "0.4.1" log = "0.4.17" serde = { version = "1.0.159", features = ["derive"] } From a5a79db4f81725d10e0f1dd339fe7d9b9e837d9f Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 6 Apr 2023 10:55:42 +0200 Subject: [PATCH 106/339] Updated bridge-hub-polkadot.json (#2435) --- parachains/chain-specs/bridge-hub-polkadot.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parachains/chain-specs/bridge-hub-polkadot.json b/parachains/chain-specs/bridge-hub-polkadot.json index b317aab8df5..4c28b9d419d 100644 --- a/parachains/chain-specs/bridge-hub-polkadot.json +++ b/parachains/chain-specs/bridge-hub-polkadot.json @@ -31,7 +31,7 @@ "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x105ae18c05a78be70e49f4495fdfca8389f99173d7f1b4019e077e24e15abd6e2eccc1177642b30456ecd401c75684a9c1cc1c529879d65cc65c32766fcd6b8a3d28d22cb1ad64189d654e3a0270dfcfac27fdbacb78fd65a11584bcce1f01e656d2a621a4e8851a00566daeb02c845da19f19f208f52ec456d4e77600fc41c314", "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x00a0acb9030000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x0000000042db356800", + "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000008253c5660a700600", "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", @@ -41,9 +41,9 @@ "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96bec8fda58278126c5774c03718a23c75ae18c05a78be70e49f4495fdfca8389f99173d7f1b4019e077e24e15abd6e2e": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a445791c00e77ce0bb8202f63e548da4ccc1177642b30456ecd401c75684a9c1cc1c529879d65cc65c32766fcd6b8a3d": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ed0583dc7b08b990b14d4f0d7acf521928d22cb1ad64189d654e3a0270dfcfac27fdbacb78fd65a11584bcce1f01e656": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x69924c6272696467652d6875622d706f6c6b61646f74", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x99924c6272696467652d6875622d706f6c6b61646f74", "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058a4ff04ee24062c13521068789374086c8a09b146729cc19a3a00f0b70c566b8fd8314d221ba56002f06409b933ae037c2e03f3526190dee8ccce245707d3bb3735cce81f7778285a9bbf7ef6d0faff1b698d1042c8267bef2db70c761401123213308b39e7a42ce79c52e0484bf106560e34410eea7067a8a35d9e429d0c4a4e165a773ec9671df3496217cdb1528a8d7f1c949c1b582c010b1a2507a855b4a11538c6baa3c4efbd6b6333d9dd98c1c7cc5104c5c6cab7653db3ba4badceeaa0667599e4d7308a987df4b5895d4349a9f5cbf1f5d8460be6d16888b4b39ad807fcf4c17b6d63e37b3382c314634cc1467ed184296e54d9c0103664e3a50cb8786c081ba202fb418e951503a33901038381c186380a6040810ddda88282691d522b392b99e5e8d764a5e837c74a39adf5f9ccea689bb870965573d3a85e538ea8de1c7b39205bbd40b86bf552d2339ad255ef91409d9a4a532a912a18ae5e4ae9f5cb597ae6ebb764290f59c9a7ebf4aaf7b15e2636dec6ef40dadddbcb60ec9456c776ced1993367e6b4b10245d5d6128d07ff608d575e95ed17888ddaaf0d369e6cec6ca4d70d973888f59d1d5ca07125a8c3bc037584802746319bee0c567eab77062d63ac5e0a4f9786b1f09487da5a150afb80cfa0c0bd5f0e13638c58a01ab70349c84b153bd857c5320daaecc52c8c0903d5ca848183bf241bcf1c647291c1d4628795750e4d610e4d79f6cea1c9050b182d938b56a6d3882c46083b1fbb6bb2f13e3646ce5228261be1a3b3e3b897ac5f4e077b3469c13a206d822f411deebe4a4d4b6d952c3cdc7864dda14df05a10b8f70b84da0b647ea767bdcf46d3cd1853c081c9c636318ba12f5e4172367df9d7c927df7b37f66bd9958b5ca97471a5cb599bd2d54979fa276ffdc9d3cacfa4253fa5ecad88ac5a6ff40adcfbec984df22c2bff58f9f7de8a442b399bd2eb9e2d55c043b2de22ac7cec6ec946cd725176504a564aebd7c646faabd9181f3bd60ba564e323165c8cf2f04ceba59c95b766354d817bbfa629d15e5389004bc06209b1c443f04c3c4722f17dd9b54da9bb7b2ba58cddf589b6df26d95dee8827bb58b93b829b1b352fe569eb5897f5ca2b3829676775257882b769133c4502f77e39de789a469f68e5df66440167ce9ce191f27d599388d11e9621aea8f6ea0512b2ef520aeebe2bf799b1319e379eb6cc3ee2794bd22986a7cb646cacfdbaee68ac1ce5b85b8a2f02ea588ff56179666c3ce55ac0c55f6a35ee0959f95b6232f6b6d0c39204a6acda65e0095e9ec1bddf16ba5cc6de16a21af7ccc42a5f083d33b6876bd37b5c59a601e8a962c7151d718f8b71b130b60976a08cedc7ee6632055c3c6f447858661f3772b1f13bbd03bb8322abd886bf240b7fa30d6c7ce4c241e463bd710b17a30e1d62708c869dbf242ef64a2c652c7c6f43006065bdc0b00f78da857bbf12cbec6eb481bd124bcb28e7ac5064151bff36232f085470c2c68e5ade62c529d2b14691556c6cd3c3b858a641151f14231bf163eb0071abd5aa89d4963e9fe57bfaeff0b193f13a7484c1f5d9c6c37e6f0e506dfd22fd57639ba00abec703f82c7e76d18a1a5faac3f044ff9e71c65a7c1b4fd7abb27d3b0fb3df12f6cb313c5dbfd45a67d6e1e009deaa37d66c7617166e12999572f3253b9fd55be2ec3c56219f2eb5f357bdd4f2acdc2679f9d8a8cbc4cecbefc04c6afc34b915b99d35b649be379e3e6f46689bdeadef74a3e2e13cb4ea7d96be67bdf144eb6fe381ad557da49d7f9b9119ce9c396367c529d29fefcf9a84b4b14db23e7b3dc846501533232eb8fea516c2437808e1170b2184b007d4801357bc51fdbea95137daeef768d4b3ed04151d98ea1adade1db6cf7d2939232f381efa001596879a60c35e93ede36079a88921cb1b0fb7d31ca7358adff2969fc98e2dec9ecd1807eed90935d9cdbf8d07cef3e600959dd9db8ac8cf7ae5e5b3de8a70569eb7d8a6f82c6ab07b3683daece4dfc66dba36f63dcb789bf5aaec3cec2e9587b0bbd1ceef7406bbcb000b9ff166d5bb84b50ebbcb43165e7697dbb4849422980861e12fb7e922b1f057f260e177a0ecd85add11f0cc993366ac3cecee0e363e7b1aece265c796b7239685b33bc2b2b2de67613de29d3973e68cbd2a0b1f3b6ed3abb14def39966950cd179dc8f834e282e3a126b858da281e6a428be56badf352fc52a3786865c6f277583ef7e09d8c75b8b28c1bc5cfbef3b311378a63a3fafcec6551e346b1bdd4329388a471a54d6c613c7c1f6e3c5df99188a481a54d6cdf61c7b1be8d87b6099e371ed8be8da7bfd38f0819dbeebfeebad3aaf71c90bdbf6e44036e6825c6de68fbf49d52863adca7cbd9f7cbd9f81e11f0c17ef03bfd208410be43f8ba4f6d571c23fdf87e45debbde3eecf7c064dce3def633ce81cb18078e0fcf1b0fff6d439658ad564d58aedca64b6d3f6b8d1bf5de286e537fa76117dbd4bf81bb9ced7e566a145bae517d9b46c1f74b8d7a3c307649cc60915051fb4eedab3846dee3df63f5791656de785ebdcfbeeff44e738fae3db74c830abe67848c2df7b89ced67b45157870e31b8f7abd9fe85e736fde0dee1f9bc1d79efe136dd68f93b9dbd0eda4d8c4d4213654f7b5db41a0799f2cad8232c9b048d7def6f1c64ca5bd923146093d0ec7b5fc441a6bc953d4201368969dffb230e32e5adec110ab0ef7dde8ac4d5cabeef74d61a7390f70bcf6de2d346dd67e1f919ec689bf806e0e0f9bc11896de2c34adbc4dfe9acb5d7b5d538c89437649398f6bdbf7190296f658f50807defbfed08b7b2ef5aa3d8f6792bf256f67da7777aa7779a3b6e139f7b74ede12cd3a0ead76964dcd93b37eaf25fe536f1f9aaf76e643cb4c262d9cab88608dc3b9f311d573c2b380803d311021d3bd0a145c7133aa8e810d211850e11dc6471e38452144a612861b901a3a482521ba533375a94ccdcac4a6428ada0e4829b266e667073a5948392144a502801a154849214a51f94be28bda034460906a516947050d2a264831215251d94845062418908375f94aab80142690ca52194a628597163831b2ea52ba52b6eb028f9a0d483120f6ecab889c1cd1525316ea070d3821b1adcfca08446e909374fb831e386073756dcf4a0a4e5468a9ba11b2f4a61dcf8e0668a9b1594bedceca014849b2e72f0200717395e90438a1c2cc831458e2b39aae410410e2a38b080a308388880430c1c2ac0e1021c2cc071021c2dc0f1011c2b1c2fc091054709709000c7087050c1e1c48d3338a2c0d1040e28703c81030438826ab2d408e188010e18d4c8a02606385280c30438aaa859a3e60a354ba821a3268c1a2f3553a8095353460d18355fd400a166a8e607355ed4f8a0a68b9a1ed4f0a06607355d6a7450c3454d0e6ad4a8195323859a346aa25023a6068d1a28d43ca1e68c1a27d4985103a6e6083546a82942cd18354aa849420d126ab2a8c1a2664b0d0d6a6650a3a5a6053554d4bca0c6053557d4ac68ca40a306cd1668d2a0294353041a23d0784193058d0868a8d040411203e909a433484e209981438834041218d2114844202d8124041219a42e483f20ed80c4039217241d907c40828214054988440212159208482020a18064853bc3b5c19581e6061c19b82b382b381b7020e062c04d814b83430227032e099c161c1a1c182e07dc16dc0e381c705c7059381870419c135c16345f8cbc30eac2e80aa3354644180d612484d1975110463f186531d232526384c5a88cd10c465d8c7230c2c1e806a32c23334653185931aa620483511646564658462f18b960d482110b46538cae8ca418a96084021c6be0b8028e2388c488a6205243faa0b34824c823cc362e3266182498c702915096846703894624c2d382de001bc24684cd0bdb17747429d5601b336fa045a1594112e1468c1b186851c8b1821c56908c404202290ca90cb9031c34104931aac2768211998d04a2283c33b431af8ccb890c0c99992c0c1a1a120c9a14ac2ab62c58566c5bc8dad0d4905f906c685390429062889a10adb23188d0905ec8c830323302030d970c0a121a5a17b632db1a518dcd0aa31088ba200a83c8cc48484486519551094624184531a2321ac14804223188ce88be300a12c560f401111b23274620108d61f484a80d9116910c4459445788c0202a83c80ba3d5080a9113a220d1073032d24bdc8206085c19394e8099c9c47058b817702ee05ac051c1b1805b0137057785938253019702ce0a8702ee049c09b82a5c0938127023e0a87022e0a29043d886b2236854c801830d0bdb1568ae9855e09041cd0a465b6a6a70055d57240f2418db131e0a6410de0ba80e2e31640fe417b4049b162c32ac2c2c24585c2c30d60c2c2dac1a583bb0b6585bbc135c41d884f04c603d61396159d9bab071a1c48524038d151a991a2b6f0a1c584420c0d8b8c2d0702075a0dd807e80367179913920ad484dd095b6856e42c6408342010830aa8196469c822606a3c2c646acc284415c63e4031c56d0048186058f8a672516e181e195e0128204c255048d0b1c1bd78a860ca51d5c5f6e6430cd94b028758181a1e485080a9aa00d0824205c4428a5006b83060c4c0c2f05375594cca0f9520a53ca525a83d4031c5794bc4c2fd4b0a04403cd079711ae21605f209940f3e22608372fa019832c82c6c636846b0c2c0c3754e4c0721d4176b939a34d7093e54608328cd2961218ae264a5626186ed0e8291a8a0eea271a04ad8216ea1474085a049c191d45c7401a01f3021302f683f805a98d08463626b342a6c66bc19342669158482d4f05cf056f05740bc90ab406d109110af18c7705ab01a6034c0b8a03cc0cec0cac8c0d05db0a362bcf0913cb134373e661e1adb189b185f1ce7865de169e161e175e161e1baf0b9b0eb62e5b0e361e6c38d8bad87af09e406386a4851a10d08081460ca40fc82ea4175b15a8094a43f4049a164843f20be60539147330bf20c7a82981fc41cd14920b9a30d0b4413a018d0d5e959115727cd850c3680b4984ec597e99145743274834b9c012294d9c14b16449f62011519c2c59828d4e209a5318628911188852040a142316e033841328508c584001a61a45f864208a132863d889130c2c31c267894f111978e24489d394022301e549131f27442c71e20403039869b0111888f2640907a638d9c0114b9e48b13e519c6880034d907c46819d0c11c588284b9a2c7922c53a19228a1110f089b201238618c2f29862883062082744cc30d1602438e0a46709124870c0899128463c410209273e74130aacc41329768a939e29460471a49b4f60273e4d887802a549124b9c6cc0c906922821c2490632d0444901e6198c44cf104e8a18c2098c844f1427539c1411e5c9a719519e60006796c1433c4122ca93293e4b3859c2012852a4345932c50911509e6c20d533841150523b6618d6c092263e4d8868e2e3e401a4d9840e3c81d2e489cf93284f6e4c2670cf104640b9c012273e1b18c2c9124e68e612788a110bd026198c8493273e4fa6185184cf069ad44c257014239ef83499b2012296f818010589254fa4d8265336606ff07302e5024d7ca26c00034b7c867032e50911519e2c5972539253b082908618cbaa8c87562bfb54f066ca31e4184fcab3a249eed8b143ee30bd2230c2ee8670c21cb31bce39678430079c0d59ce9edd3d99e7e4399b19ce397bce9e3c67cf286aeec931c2b8bd37e57bf4bdc7a2191bd2c873cad19c9452d81d23e46608638434526eeec9909be59c7cd16ed9d08a6d61104e8b36e489031fc3ee19bb63532cd2502adaa22582f01271431e6ee684b41bc248244e9e1a6c8673c2d8dd52ce9edd947273c38e0d3b32e59e3c39c638a4616466e6c8b121336d9e9125b38c94f2e408657c30c2399f7c70ce08e3a458d3607177eb98cd0db91b3277a47113d188d150cbb220a4dd13462cf2e428e3e4813032f7a4dcb02303e69c81be271790b233ccb02347734e39e700149000284751d2393738e70dd9168c316211c608796618737c8f6933a5a2b8e98031d28e5076531869209c7342c698638fb01e80860052001ac21d6e6e649437982184338790daac71cb8d528ad118196a91d42d636cc8734e66ca0c21c60cadd96c4186f0eac9dd3d7b4e9e934711366d6c72cf09a1462977649e54eb86021080c6ddefbdf728a5cc936adcaf39088c1c0f0044d381ccb0a1c5dc1cb9c8dc28e6c71a37b786a3e11580c910728c3de89c73c2c93cdf7bdd1d63b7d6ddcd5c4fe6ae1ba71f0eecf728edd910f2eb86b02373472999658c18c64c29a514d218b72d6e5b8c8d61dd10521a23a510520823a558d34067f786619b8e39fb3ad06e0921e41b489b3684dd8d8d646719ed39e77cf375430dc2d1ec863ce3d6cd5b0eb0453c98b979e210218492524a23c422061bc238bb617733ed9eadddd0b099fbbdc7dddccc1036cfee39999961f394cd10764308e19bb0bb658434cad8a552a9444303bb21cf391936d7ced1b0b9236c1c8c43638deb20e50821c44636e47073c70821843146d8af1bc2d7ddb161c3eeb63aca097bf27bade30a1d328034dc1c986284069c68603a49c20994254b34d1c00c3832600494251988f22403193002cacd0f229c4c7142c4142396a074b8c1c993293e0418c0cd0d1d3d4334b90014284610c0003a00000000dcd4583e433441224a93293e4b7c9e68400346986c2a0e298a1329529a3cb641030060274ea66060c914237c9a0c610414284d00c03668e0894f940d4ca91c067c36c0c349114b7ca23c992265c910483cd1c08e1c503c963042091f00a074b8e1356c03901b6c587283939e26502eb02403519e14814493224e3ab7841322a23c5912e549932286c000068ca8384081f2a427c7071203a8816ff031c2085301d886264ea6d838e959e2b384932835d8f838c9c000ce3620e183c493259c1080007cc3124f30e0648a941cd294264ea00cb1c449069a4c31c207892544407952c4104b7ca06ca009069c1071b27ca634f141620037d070621b9cf83499e2248a930c4c41220019df40841324907032458a068c1862c914274918318493294b9a2041c4104e96d8d083d2e1062943384142e72a62089f2617585204124fa23cc1802989284e200fb6614914239e2031c549124b38808127539c24b1e40036e8a0c30d44385962848f140e4c196289cf124e6848228a134880ed8b563d2056010101c18d89eaa99e6a040414a104a2aa0904c41148a59a2a20958a32513d0c0848a5b298a86033017a2a2020a0080499a81e1010902a32513d954a0504a49240404f95316120205601351315d00352412020555f4c18085349c804e8a91e13a00704d44c540fe8a9281306026a260cf498a89eeaa92c260c04a452452640ac9a4c548f5592093313d553a9221356a9549009ab54cd44f5548f09ab1e930644331e333f0d20d184034d48a3d3e038cb43283843060ab00006b7591e4281989c130055610b24e802cc1364d046cd91183421042a98410cc4a841c363065244e184952d508982f4c51621a0528ac1ca962c0f457106d7046ad9947634eaf6b0d7aa507a58939712c4150c4d259c004e2146aa014573259bd21466225fe13debafd21584810cdfa766ad92b5a60083b51ea9a4acdb9c83700fcb6de2aae0d85e2ec582153cb1951ced6c6ef56585479826a8b145680b4f400277802a60f1654b09ae10c39651507b9145155010a65a1e2a410b4e40c6dee758e15432c7956050ea0462381b1d9687a260c34acb4326c082bd5c63414b3940d8cbb3fcf8da0cae47a3e4df4d3534ea42e961699b5e1c81089460dfbb0bb7c3f29008d8a082cb5165065c8e2c4d7037bc4802575282139c8de5212a578045e06e581ea272c642311c8de5a11158b1f731f56ed2d9b1c20c3cb1a5f63d3acb4324e062a3e5212bb4d8fb9c1845895bad564d685f7c1163a5d01a20b0b15caab13cb445c86e9687b210434721e391161c0341e88b25590602089c609f7cd66f0d96cf6c4d8deac3cfaedb7854565431d3c5184d08d2a28c94c8ca7340088112acfc8ed6e1a1d56a05454abe8709ea702a567a65c1b1a5a9f778c8ca0eec35d9329cc00b2284e0036840a1456ab34326e08285b7d9e93ebdd34881bbe5212b5358ccf2909512d877eef16a0f07a1d0ec35e5ac562b2790b0420d2b76d0440fb458e5e4dc202ba2055bacd448838cd5180c480959004212ce18d30426d85b0a12edfb6ab5fa40ca085120610b131c61044268428a5a212508d2810c6a2085316c21f57ecbdb7b5364dc3a6fb55aad56a99b63397581f097206d190c62084317a6c0620a62c090e2738db22cdfb4d33a31c5e71e32863ab0cfe79e10d829601505a15402ceb4404c2a6bad3b1c25f507014143295839787a57a5326e08f9125d95e51f4df86295ea8e5340fd9680562ccb32124f4f249e569585b493f05365a14f5b596f783f5a25df2ba3bbfeebdefb4eb7469ff136e4595a7178604b4f842dad3a88c0517b1f154b0fafb256f7acf58e9770a72d95959d0fb4b1bf0355f2bd3063a2181385485e544522a128c688a2182314c59828b6df6827094681cd39cdccc9c69c65e65c634e3273d63746f4fbc64c51e5be6134bfd947dce47a3b6df546dbf56a76abf3db693ae6d33661c77c8ae74e87181c5635fec8075a2cd68fb0da7355ec2c3a7f24faa8de4765ab3da26398b55d547be836e7d3ce1b4f463f2fbb292f29fda4dab5b173c2ebb48b62637be6af6750c3baeb96c56559e53a9a6f9df52cdc773a6e3dd49c44693aad4ff33b70eb2c9a8ebb3e491df7899eb3b0633616d32c761dc3b873a4da8e36bd7350e77d7a367d1a33664c0e07c6ecd8cecf3a5275e162924ee5398e548f90e9428654afca924e3b3a27fd9c64462775a3c705a5afcba35b4c2e5e9746cd47c6d229252ac7d29bc3e362be299f651df6ab63cb356a5a5dcde1a71c237e815e7a887661e716b4be2e6d9a5decdd6e9ddeee42f3576f76d2f9d8b9431d9ac3775a2f109d9abf7a732c1d9d7217777aeed37558afeb65158a6649b1de1c6b5d74ec6ed5a7b1f76849b527234dadfe76c5ea8d8f8b278474ebbd1921d5c7c5fb618dea5565b5e7bdfab8b0ba587a2a376c3efa289596acb13b8287cc63cfa046d3d57c76a267d967979da6ab79169aeff4a473ce476f3d6b5a59849ea2f94ec38d08bde870e3b92aade9689fe6b3ee7256373baea63b3c61a28ea6e33e7da733da65bfbad8a6ecb3bb9ca536fbdb8660cfb2bf8e7697e3e1b40cbbba529bde0f7576f4e9d9b4e99d9ed62e5c8c9a864ba692124ba4025e692bcfc65a45a83e2a6d92f331fe768df59dd27ae9af9b233ae4631775dc27ac6a1df335cd6235fe521d6270b442d12c7d76598ff53ecba7bfa495bd19a113a3efda6359343ecee2a4d53d8e9a35245e46d16c4fac54fb79aaf7e47bf3d625ea72e009ce7a2407eacc6a7542d68be251699475fad9d17a55f659d6ab6c9d9f10b38d7f5464c7d1c6ac754497f139504754ffba67657d16020efea7eec019c5fb111f2f77e01150ca98b5a809dc4fac616f7928088bcd386b8db79a9a77535353f39d7e1b4f0de9394fc88d93ce8d22fdc6e56f78426ed42337ea55d91b2775949e44a294747ab8f1d09bdfe86eea55d91a12e96fe32165dca89a7a9f259dcf94cadf7068a551f492d4d19aee3e5bf31bde0f4b63a6f4ee7073b0b45e199f0347a986471eeaece4c05192ddbc173b00cb4320a0a28cbdb13c0402326c0635a9255e01b13415cfca7ac5ce9c2784adacd04a9be673fc5dde68715cfe6297721bf2787cc72fc5f9e574d44b7acdb951377eb96fdf813a3c2a137882df51712ac353a6a3323cf56f894b7ce6ebcc3a67225faaef7a4b5cb3abde1dacac94fe46c76dba372e7f4a730d52ed34b7a9b77475dae96b3a1d6270a4ea236d0d4dbd396c9d0e3138aefab4adf9cd4189f4d0475b537b48b5e6d749bf70549fbe58dda4d56a0fe935af7937b4936a0fbdb4703b222dad37bc1f9abce1fd90d2ca46e78d47f49d7e7f1b11ebef5af72c5f5836b76b44b64f1d263590c4a3318117cc6e0f3bcf04eac43ecd6bd4c6ce1dbd0dd93e3538ea445ddc3aad4def5ac7753650a7d4a7f71cfb4cb7efc7cecbae5a37bc1ff2f2b3bbaad9a6585739ba4605345a171a9588e5be15e53e3aff5979571a85fdda61af6ebbd54df825a04eafe0099ee6192465d925655f939ac559f775599a6665ef3a7d22ad8a2e8d8ab5a49495f6af9455caae3dd7e9e52f148d33a861aa1f4b93b7b42b58d7d30d2debef61d7849e90774cab62c9d6a868513c21d8e7b35b56bd1a153b4fadc746896eddba9665bd5745134d6b094b62960e28cfadb3043c416afd55d95d1684ef15d4814236a7e99585525e4aeb9a90d5ad51b91a158b711b119afe880683b0e63650deb0115995e69b052dabde8057ac43cba6a6421a6de3c1b42e6c76d1ebba5a6a42d6da81a26e74ade39e75d8b7ee8a5f02ea402133a54651d12849a4ed281e0a411d78e555211bff4eea1eedaeafdbaf66b3d6b428decac2cbeb6359f692c7fe6abf0bfbf5ec3decda36f9cdaa9afcd6d1639fb7abd87878054678c5b2ec76d1ef13b218767acb8cbdd46ebf508b8de73a6ed3f65117dbb4d5eb6359eba2ca9af5ac6a5160d8e7c6836954ec655996a545f17ecc88c5320d2a9a972388f4daca7b63b21d6fd4756eeadce8edafdb324829855d8f85510ae1a41846b94bba7552bd6de11ba393d3f03e6b5d280d6fbd698f4689ba5eefee2e73753df440b6e19c37dabeaefac834a47fdcef1b03c7748cf073c2dad31746cd4ed9a7af9b3007ea7076acffb60758dd5d1ff851f7bbe977201d33c65edf3ad14684f4ae3d7dfa8da4750d8d467a166b68fa246ce3b9acd80c766cbb21ec3a5ad875d3b95d76cd75d76dba1b5b37b796368f95833a36f5db5fd728ea1b2d7dd4aa3dfded34eb1e11be6bbd50b4ae37da404b6b4f7ffe3a7df666531d9bd3bfadc8f6dea7ddf581b65fa4db3568dfaf0fb4dbb3b9c9ed71d3e26ff8404b9fc531dddddd6dd3319f9a87b8ae09f320f492412b76d5d7e6eeb83d22ad21a751d6b57e5d1f76fdecbaaeeb3deb7a46f4bab20ce7efa2f4f03b7d937d242f6fdbd1b17adb66df69d95d6885c94757be5fb527fbe8f2f77a16b51c1a75e32c2b67e154fdc83f78ceb1108bbdf33edd731dc84aa892d27ace13026fc12bf25d87bff91dfdbd7aa1153bdff455a883569fb6d9fb1d559fb6b034c6652f7707fbce7c73b04ffeb23ad8bdee76650275b8742dc7311ca7e746e978c03bacf7d9ecb2bb38f5aa37da577146b73e2f3ae93545e0e5e5df76045ebee73c21f2afeec09d9617e7f3175ab1d65bb4117997b547fefaf6ba1bde0fcb86e60c3909df79c05f9cba43db88c0f73c9c67db11cdc233795ac5eae578d0ba03cae3605e6c96c969471ddb4ccaac939d1c5df586f743e6d8f7b91181ef77f33abaed379df51d085f770c750e4ff1a57a29e939eae56a8ea31eeaec8c7eddb0a9b754536f89a6926eb92a8a17cdb067574647cf30faacb51b9e90fb7268947c0e3b58c979b13c8695753ed3a123084f878e20d4ecd97b80f56b667f5b9151bde1fdb82e9f75d7a7adbc2a0ebdf5f91da8c3049ee24b258e8bbfe109b93ea5b4a38b7e73b0d67564a36b9f1b91ec3da37a9fbd8e5d6e47349b9dc9e8948e7e393bba2eaa37073b7f4b76ebae6bf5862724bb8edd8256ecbb3a392dedd84a29e5d5454bad7ac3fb31e55b59a641a5e3e5c08117ab59d1bb000115ab83e52128c8b0198f74c0f11014575893e5a127c66087a0d8c266f6fd51b13b1ab59daf75ee39e794efaea7b539a59cda6ddbd15e1ddb47455e97b3de47c5cafbb48d74d239cf9b91f8bebafb66b4b264a14da3acf329cfcefaebacb308da1b2b55fd00bdbe4cd8f8aeefbe2b769e763dda816cec2e2c026df6e83bad0c63775f15fa7904b4f7d9acf6d06b47467fdfe917c513d29fe746653eedd3d7a72df751bd6db573f5f6a362a7a85e6aa1d5e8b5c71bd1e65fdde9382b8e9603753e3af680f7586f91f778e43d7efe093d21f1b3bf036d773ac4e07cdac6ebd3f751b1d7ad6edb88881e6b4f7c5f1375f7d977611fc5513645c7661dd51be345571736a3725aad634ba33d226dd4ba677b2b92d98e1dbf1ff709d9695d76f1b393cfbaeb3bf0cd67518b3bae6725dbb745780eea90ea766e94f6d8a77ecc74e808020745b33df1f4d6af66ad78846e8f76ab38d6afcb6bf5f4f242d1acf6ec37daeb7423f2dea31dbbb51dd1ec7b8ea6d167f545f184bc7a9150597aecd7afcf8de7a26267c7b1634b3b39add5b18ddde5808dcff8758bae07ce5b116963b45691cccefaa2783f641535d7858c7ffbf502de7bcf5e87c3678b33e4597ebfedb31cbfbf21b07256059f125007eacca766c77c52825ac829d9bd146f47e8036a15ec1745c6a32744f86c04994d17befb1eb0f0f1d91e5839213620847cfeab971f21e4cb4386104208639bf8350cb7d9086706f6c15759b6bc0180c70e1c1d37a51c386ed8d4d090b89168d332eca2d69411f6631f7cde8e78676c16f89da6946f490756e6d33bdf3ea0a7eaee3119332a46a8d2a1d482273ed07b44326621fdcbb7dcd154c1b5e5bff366e4d91eaef4fde0abde23c29144448c9936b18d1c638c31c6c7c7183f1da08a36d61e8e4cf755361bf11f07e98ed9c7ed1b81ef27eb90eed8aae24b82ebe55ebdf35766f25dbe65a56dea5906ae7f350baf35ea556694fc7da7345570d1be43dbd3f075b44dfd777e50c8a0bcc20be69cb3a5946fb29c7342f9031347fabac560cd796959b846cd2b4f4f3723d6e7ad78f98cdeda78e8a4dd232715e80ada38030c4d464a8a9a59289ba66627ed984f932e41a1685c97f94235ced44506667cc1e6edb0cf14a78ded78245ac9334bf7f0046db438d4c999f5529bb536bb529b72da042f04a79daff0648c7f1eb0dec663b1659bf57b328b2df2bd2927a453c2a90449352e8e996678640d669536784a389f10e918d97cece67cf34fbef7e69373723cd675d14ff9792bce5bcf2ced48bcfc4e67b28b6d9ab71e371e0bc6ad48ac5a6cd3ac3cab10379ebee46c4a5d784146d806fc9c8f1f718d9a7fbff17133023f0fb722f1b3de9652f644188407468585c5d878290517cf626c374f165303f94b9a554a97a00c97e148590cb6042c96c0621e182178f125fe9c8dfc7becdebb5034fb2ea566e593dd1d01dfe34a2549b9528c345ad3d2216394314ecea6d4f11d35d9518d24401b403ae11326d5381c4829a794528a216f20e52307993ed04a39034e6e467a4eab6336cd09ed3c63cd24a07cbd8559866af5422eb63f21151b61156b159996d9c78542436e34181bd9ce0e0ae462e3dfa31c776d9a0c1bdf601a05b9dc40e3ceb06930f6c2211c56d659a54df022326093612fa41a075b8b2d4e00b9d8196990f1e809f1f723343816c30a2a56deba64473fbbcbc44ecbcaa4263729ad5f1d63d9b47ae5b1679cb51989a7f5dec8122bdfdf81587751ebb22c4a2f6abd6fd524a49db547d61a21173800667229c3e4b2058bbb2e4f39c8bcfcc541a866ad2c4150e4a428e3201f741d8aa7300c08eb26e320a995406d6995ec434e2b553ccfce1ad98794aaab63d621fe44cdca25448d9b0dbdd04619327e46d94d190f3f3b1d6170f16ce533a8bded08bceca29572e3816dac7233f28cc0ead3b67f04ecc7f7ce78116e3c196796c61b91f7dee7c613df7b2fce586d2818b8f1f433f980f77690bdb5d84528e59c734e28bf8009a1075819eb576ab151c2c04639858dd204365e8680753829548170b1c1552acd3083bd9c9542f6ca210b7f81587656ec0b1b72081302172f80e00517acccca9292ce6bce296f3d931d6d1316eca2d39a9694334c6bd69c3c5992ab523e74384a7cf8043e81fae3c355a9ac0b0febc3025087029fc0182f728d1e70924ac12df99564b003e0d7b7255dc625360a47bbca6a3bce56fb8e8eb66606b5f101b5c2dd8c8b853a1638bc2403757e5eca0215473ba72c70cd02180ab81112b66bdff10cdb7876d46c0e50d9edbc3da0dbd13d4b3723d7b78a63e4faf6adf674350bba118b0ab6479be09374384a92dc02b740fd497255ea32833b3ce9c2d9b48ccbd5d9b40967ab43da6ed733315027085691820a0f4941e5d99b301999357438ccd06ab56a22059f7969140f4dd18585cfbe409d9782dfb42be3d2a82bc9d82d1a7563e15b92813ad9157882a75492d98410e213386f4004710afc6d4038e013f8db8078c02950332cf0043f812ed3f2e07b8fa5e852c06657da04ffbc704cf87021ce44920701af589809e1fc6d43da66424ac8842cbcd6d1fbd0712a090e103ffc704e09d1e100010410e754766541d7c5c35dbfd9cac2ebfadbae3a45b3f18f7fc49f1dcf9e765defc73e1ac85edff10c6abd1981577d6c8acf56d703702b12ed8ec3ed08d4ae2e89b61a43d1f69ddeea11d06a7547acd9aa4dd9a5652bf82c28c3b4deae679ae6c3f5241da7b2d7f1418dba2a7cb66a148fc377c1a3c3b9feecf508743857956452728d3ec15f62e0b2a19a756913bc150507808afd665d22fbb8aaf64cd3ac4ed39208d1ff397220ea4f104ff21f3a1fce1b10ef3f48ee43fdf1e1ab0a9c091ffe9274ab0a9c8920de975b124e55c0cade96a41fc47fe8de81e8eec38f40e2d9eb231ef546bb63479b7890b84ddc261ef56a76c7699b769c371ee746f1a83bbea36266ae9a44a6249930b89b752153c5ce709c675da04e922791a92415c9d5b1ddcce0ba0b07c92c26aa506c6cf6ade6b4091e8915c84e1fb92a0fdb11ccca4dc991e300d14adee794dc9420390e10ef499ea432d1c3df39b5037de8381544c7a9193a9ceed27797b315e87e5e0a02cf72da34b51e3a4e29e938f5361eda046f9debac7a9fe52c29f2d649a7bf488fdb1079ee5b179ac35b34cfc604714592313d5cf1c31942683e9cd1a84b45a32e196184c8c40471c58724611a75b32811d3a89ba5875f69d4cd02c469ddc06c581a75b3fc70ab6e61ba10397cd6c590c367433c0c387cd61d3efbe1b3190e9f01e0f0199946dd015cc8e1b3351a7505f020651a750ff08d0c1b8dba40bead919959c0e1b331a45636684708a37255a1562c2d8dbaa8eb64d1a89bc375e082c31637745140170938bc368480c36b5e7638bcf6653bbc368676780d8c46069946dd9cdb70786d8d465d03fcc7e1b5323e0eafb151c3e135338dba3587d7c6d0a86b73f86dd5a87be3f05b50a32e8ec36f428dba3acee3f01b9546dd9bef38fc56a551b7749cc36f561a75735c4ba32e015e80c36f5934ea9a7e3afcc6a551b7c70370f86d8b46dd7a1a7e624a0287dfbad0746c33de68ea55599acfd0754d4e3b6cc9b36eabc0713a1e9d12d604feee41fc40821012c40c448218522f0d627bbd433e4310428e5395e0820082b331c98238009a5c881ab4e5f27890aa04bddb0f70009e7a67f8190080035425b8076d99a1de20d6907a19f0035425a8907a0f40831012e4330431c30cf5760740103300e0415b18506f96202e448803047120421c00c883b604a97786f374f502e00cf89908b151217032ec9d10f4af4a684274cf22c471986c423c632224c883b660f5762742ebfd87fceaae24375c9ceb54256892ed415b16902455ef759a04a33c922ce05b921b52db310b5cf562a7496e2db97cd0b90e3ef0380e38d81dcbd2e1385425381f1eb485d6ab73ab2a6151cb1e87aa045d40bd38d0243b3aa74928ad37bb95845a0fda62ebcd92e43b3ee090e4375425381c6ea0b7d6777e5920d3a15e9da77ce0417dd061f301ab37fbe503763d688b4ebd597cb80e16e0e1c3712ca0a3c383b62c20abf77aea5aa7f55083b65c1e6e0db7a12a417be0f1a02d0a4840bdda96d9d0430df516398f1e6a48008f6f14d0eadd9ef5f058014d490dda7215707f501b10506f766d87186da8d786fbf8f1a02d59bd3b583cdc47558216a9d707ed01013b3ceb21cb620f597cd0161eeacdd2c311a0c4470faf41898f1a1eb465877ab323207e876b1450c013a0c406aa24014ab67a71ae29d9b4076d5140bd59943c0114b041c97f50c0861f0fdac2a3deed0aa8577b02be23023fd05095a0948702ecc0f981074e030a5095e07e30c2038faa8465ebe5719c1f2eea94b06c9609ec00a2066db945eee901a84ad0020460070e91a800a77a0bf000542538204e38f5deb01a701c3fd070235509fa038e1bc7f9010747f4038ee8415b1a506f961f1e002068f8e1388008000d0fda72a35e9cdf101dc77754252c9b25023645a8cd02440128103cd4dc06081ef5da7c475542b3f589a02d3c763c684b917ab300711e2250807ab3083d05c44f5509ce3e11b4a500a7076da9a997c76b6ceadd719bef4022437818b08094dd51400210b083906e000fd209e007e87a1c4857afd3a174e8727829091c87aec76fe8ea6de8727e7406e89404eea3ebf11abafa0274043875a61f9892400dda3280ba8969133c144f6d1140ddc6b4093e005d8f9a2502a7a1ab11a81b197882ef3a1d7f77f319bad201d0e5388f4ec7777437c7e94a177539be753aae7537cfbad26397e358a7a36e437d53372f5daadb972e47ddc6e87c78105d9203d1f9f01fba2457d2f9503730f004df4397a46e61308ba39b6534310436ec8dce2282901937b0361d9ca2892f59b035dd140110caa861792bc24396a66e5d20a9db6993e561d41d118f45ac23d2367bb5bafb179b42cda2bf36d6a2bf96a5bf3bac657d07d22396b0ec55d1232c9b7547c48de7d779f3695ba457abd58a07b6b4fab49567b62e8dda861a651d7ef3b27d69d475f86d8c466187dfc0342a3bfc4646a3b4c36f611ab51d7e3ba351a2c36f62a00ea7e046c6ae2cdb9b75e9b21db0099e76990f3803029be0b12e0b834df0599709814df05a9715814df05b9721814df0a22e5b029b601711776cb18eedc5677260af3453c395642cbcdc78ac6a7a01774d599936c123e9b22ef0047fa4cb86e0091e025df6059ee01fd06561e009de0199180b7f95e16ed6e5220317bb8b0dee665d2c1459f6b2b2c2deec8b8559171d622cd300844355a479b690710f0abb1bc4eb90439b1e576ee6e6e608238c3042781b0be1fbd9c74cbab1fc9fd64ba9352b6f3c4d77de7bf55a3c44eb11ae0cdca5b1099cac40daf472ae2d7037e7ba48a41b7b6f1eeb5c7c7a67f67189e13e2d7b69828b1dea3203dbcfb29231d461eeed201111c385ae80dba1513846faf0b0e2c447d8f59aec2b5114701c95ac7bbc2a70a536f55fe5dad4a72be0f8943b0a4ffd0c075e6561bd6c235f6670b73dd4850d7b4f51c05d4aa10ebf3fe405aadfb3ee92e82271b59ae2c3d98c7dc05ffc031e01cf8ca148af629d12ef43edc53e60c753c476bdd8049fc9b7c967538b1d0fdbee9268abb70740d90f8afabc0d813656ca3ee0e3799ee461c64844c488b1d25e6a35cb3d6027411ec3300c83d8b93b02fe75fcec6591524acf2c648a761f6ab5f33513076921f17f4262455239c8ab3db00f791c22e08e04ea882e2f04d451a5624abe08288dda2e2fc567090ef2ac7c1146d19c1c1a755d1ec80e8dc250d9e519d02878791e388875f94b54c626f96c76cf8a3a1e93da1eb7326814ace42ad897844ff2ef73e37972e3d934db1b12f6217f31811363df23c7f8a2e8aa980cfbd86e5d14759cea8d08b5cc3e26ec7cda241fbb22da249f7552da248f7550da247f7544b4499e764cda84049e780c569e036c925f827d886ac0c53318fb443678abab29978cdfeb87060761941242880677354bdf8f86536b835e5cf6e0a50c38782184527236ddbdb74d2e1c8402f7a0c05dcd7276418d07d618e346e4d92c4a39bb5b0391b626f6412d4aafee52229db114cd6969310b77a985efb667a0faf08f0ccbbf3bec0b63f93cb489790c08a94f8c94fbc20cc662e1ee0e54a354bb22fb60cba21a84107684b093d0e6d2e6160ed6ab61589669daa66da267517af5c0b48705774b96b94ccb726c3f28ba2a4bd907b375cd4b4678f5c3708a64f0d0c27a3960bb32fbe0e7dcf822e31e9762b1f1d97ba71c979873b0bc2aca82bb3c745f98db5d9a0cd4113dbecb401deef64e02c03c2c582857dae1209b8def2e50470a3cc553ca71a5d2ffc2409da7059ee2395a7a61ecc3024fb1abe06e7709d3527097872c7390f752191c1284d03d4b5750e762ec7d616cbc14a8f3d0e0533c15a816b832b14170c5c6534ed6cbd967ad3d2cb8ec098167ccf2a53c21b076974fe120b4360fd8477c7cf68424412dfdbd2cf32907a1e7c36dc8b5040e6e44a845c23ede455da768956470308bda43831f159e166c7c60b0f19db1b1414057f0144fbb0c3cc58fda8c4e7781a7f8d1b57a4d59bd27fdaa97a3b4d2701ca954e25e6654afc95e2e93a453a2da64e0295e44038ec1acb074b1f10f0ba51c774bf7b49ae2e9caa2ab49577465b77a787a148b651a80a6eaea11171cb3a73dfb9ee114998f9f8fa79736b8c2f2900dacd802581ee242c652cd06666c10c66631839bd4a4cc2c08b0cd2404d84efa66fac841a636b5b711998f46e63b7677f2f4c91e16a748db7e1219b82adbd691f9d6e6e3ec02d0f5b024c86c3064832d6cc659d46410fa1b3f393ef6717dc64e6b13bf87951d7f76d86317006b615707e9b3d8c95825fb788fdb90fe11f938f9b19bb7ba2b8df4b0dce3f4fcb4703ddc5c59f80c09932488795ebc764103d9093204b98091306211250fe47c0110208d8ad3ea52fac5c1f26db0fcc78e7b42ba92f807ac5cf385ac0c2153229b65f6c10577594c46354ae7a109ea98984008219cb5539915eeb21833720c8dba625b1e1e09d499871702ea30e424536bca08fbadba495b8c11032a62c0058c2c6bd81d96c1c81202c8c5ceb6384834558abfa37b983858c2897ff69fedf43d70aa34bf5d957a0e3cddced373ef8153149ee6b97a5a2f37facd91294e893e5f87138f049ee6941e38c543fdd981a7794d957a06c6ceade228d14eafd5d576edb46e8992c2e98a2301faec4a2eaefe6ce9aa843eab3f2f452f0ff1c88a23ff2c4e9178f98864ab3848ace328d16e5dbbf597824938a53d8b5df6981f14919ac0f5d06a655b0d305aacacd6bd2bf0349f9009b8cb66e2777ad43181a77951372f05ea609f5f02ea689fbf0007498263f28474cdc27d7e08d60982c294da2e544a719f6f9500a1d215ec3cf30e424052db2f6bc1ce6758f7525af7aac027d4a6799d9e64dfbf4f0849509076d183b28fce7538f1dc55a9addbb6c76f5cfd19d537f41f51fd62e7b5ab5259d6691d179cf8edaa54179c58719268cf1e6355927dab585e15789affd162e7b577c54eed09c1d3c45ee5d8473c897d44788ab7aa7c8f597b2017cb340061aad71714d99423de19cbf7a17704a6ebbf2e096a8fb0ce946165fb031c12a8236fe2203a2ca6737d523156c2cc64e52f7fb1f29db15de31038ed38b0e24038eb6532f0a2fac3049e9abbb659d6e1f0456070f8a2ab5261ace4ec4ab067e767f5670b5725d945f527079ee47fbec8cc044ff29d08db2925f6d127b18f63cf0e372deb189ee0e9651d8e12edd9eb631d8e928cc2d33b567b78a9ee02b1fcd95d1ee2f8c42fd15b96b7642fda71d756cd812796b5674455dd724bc63daeac62a98ce7670c75b628813adbf9def24d5027c37e732c77154befebf2b8a1e88877c66e1dc3d379c8d26b1dc3538733af4a611dceac48829a0c3cd1abe06a8e004b8a535bdee96ba0e038b595d9c2041ef4a0ca6a95c27e78a2dfa2a47f29b98ed51faeeb6d320c4f54c710c7a99c2d4aaefe55b7dc2cd7817859c8c11056292680ae5f15284a018b29524c00d5153ce30a5656a97e571c25d7fbd7fbd815eeeada0c3cd1f709b8db642ca5b54756896564d6b3db9de2f313d22b5bb27c93e573d72f0f597e0ed4a1e7f381401decfc8c762f8575176d93752c0b8e2d0e92a0fe3bc93e8b23ffa31d3b3dad3fd9afab521b0f92a020ec5a1db241d7b3ba034fd6af0eeb7270e4b3ab52407064c54982fdba12ecaa3f5b6455723dabe7e0c9fa8f75ac323ca952aa54f634ace3d4d5718a371e24149e2c4e3d2b388e7dc893d8878427f979ee610149d56b48052ed653fcccea7e180d2d8256a91fa02d7debd0bec36863198c32f8c0c27a73ecaba14d396d7a6fd37bedd3a6772957191c938135e4409db85aad565852ef401a55b2ef3b7010b633c6d81d5be6facb59793ebd43cc32186324c1765b1d8361056aac526d6f8b78425a32195944a39ee5a12b5616b3efefcabba275342c3e8de2a1147cb12f759fd0d01551d8fbaa6058aea881bd8f8a97ba6ce6be201e22699cb1f5d0a9c3d3fb4e6354707ff60878e68ccdbc5066289571936cda84d367314800c6429cae43dacab3182518b2115a1e0ac11816877d474281d6b9b8ac56ab26523c44822a96c9d8f7bb034cdddbfba058e5f297a06b680b0f910009f63219a527a489a411a62382c6181d1134c0b4896d118dba544aa32e8e251a754b501a95c3bee37842e0d9c0612f8fe14a83bbbdbf6179c8042eb05d218988187b6fdb1249e38c36b1dde92e4cb81e976c060cc6b6fca5ef97839cc3a73e95f552eed5cbd986f5966ccf60736ce31899c1bedfb2657b5fc529720b7f0b7f73dea63eec4cf03ddad4a646c17aa33531a3a6144290842ee8c4545b06039bd06206638880860a5e50842f3776bee0e2021f60414119d6b0e19eb0a202e885154164b891e5a12abcd003eeb23c54c51a6d050eb33c54451a65e0a2e5a12aa0d03ce02ccb43550455e86eda60b0200b0b1f4f447458373270f3d9ebb3e3ae8a0d7916fbec4667accefac6a01a839127754e904e032f127ba13018d29986f43949a4c3ceaaa48eaf0756365aa4932c49e5a49432a04dd46241175284c0beed88f558e9796813a55a70daad297034dbe977c68bdda2f9b80d8176fe69e12059340aabef8cec91e1b4bf54b2acdb569e8530f73624da595f18f6416f5981c33e4f4fdb846597dd94c73d2d5aa63c3beaee1bc3d28be0b3ad7b54b4895eeb6e8ea57f62e06e0b597a581f9636d167f55d6913fd0c0247ffc2401aad9c46454bef8046bdd32b69549f5e080ef22cfdcfaa51d7a320ebe5aa70790b96522d86ec653096be204b5f152b3b589a83a561e089d25f26e028f6c2404a9b363d6fb1ab5c3d8a42c63d6e63b1f091f9c5c85d3feefa75b2259411d6af4e960f70190896ff564f0c990344c186324e2cdfea55d9c1bbf280c042b8efbd823a4c20f715310f067c1263030bdf15cec0c2bf6a55e6d37d3bb0f0ada67df561d146c0757cac3950e7a5805858e53201d75866968cf9c44bcc78f927ace360c355d9cbac03eb707fe2df7bc69b11ce76bd526c9f9fa08f7fc2927f225639697d82f909e6d395622fbf6f5592accc36f07b23f252d2c8b3b67fe443504a3d113f6b0868ea09200ea3850c4f9031660965d8927a42d62dfd58f9dc1548aaba651a5d6aa0c516c0f2d01616747763163b8d0ad5a8b429ee40cbc203595d949aacfc7ec8c34ec8c2b8f13c2d76308af7035e5e9e08912e7e8348106158db7ab007553878860c2f90459e21bbc99a8c1e63dfa19826230c1992490e2fca69d14829ec47dfb4e835b5f7e885655ad434d84fa3da7b58a66d5e44512482fd444398f69ef6b637ca41e66822d116f67dc4c5be67a32bec3bc769afbbadc5be93fa0a9a484303fbd1349636bd9b61a3837ac5861936ca7cf14206182f5fbc0cbd2b1e9667e55d79559a0dfb0ecbc031720c931cfab217fb0e79c8e60024e7754318a39c714ed86fbe86304629a7152d0bf6b3a29cd3b228bdb08861b01f66d1ebc2b02cd3b60df6dbb04cd3b64d241a7191e3603f6ed35aa4f568a435c7694d22694d53136b6a60bf9af7ba4bdf8d1bdac381437b394ab15482fd4aa48ca6a646ebce6623f22c67a375776323f26c77383622cfc61c31470ed82f0715e114b96cffd9aef7c7c27a838a708a5c246c8369d37bfd4125e3ce72c87ab200e5a4b6c05b9d13d6a9143b7b9280364b07acb3953faa94ca3612ab5a9fdd646265653c6f3d70ca82b73a2754ab212c5584823ed0c42af5842ac5f0547bd8fa9e22e3f3c8091c8791032cf6ad74ba91185c0f3cdbfb5696c3c80117fbecfbdb8ebc262cd7fb56f1dc25118d8c2c1f765715e4c6e314c16cac478c2c9f9b6073ece533f6c23777dc8da8c0b50efcb71d71cec2ca648a90c54776c272e5c83efa196f90bb11181c7f91053036721049d29ee53072f0015b6ad37bc7f57d1163fb1997b1cf8e80eb3ec741ba29cf4e79f67252ba04dc7d606cff8169d4a58f0c4d8c1832f05ca1091578ae20a40a4dd37c269c10ae0adca1681ca4350ec2f0b09e7b935321e7f513d262812a5491069657455ad6a59452525a92d37a5520ad3a94e34a26139b6e8ea5409ffa63e00cc250a04d2dc403b8c8547855a00e05c6d87e15215e60823a4c844ca6bf54e2848882f5e60d2216ee321807b40eb783cee10e03786814fd5b27079efa3b6e0f2e7b55f27b4f5ed775ee8ee02803da15d111b15d41709149731f09d421a24ffde6356cf3308930e07ab0893ea75fcae83302ad752670abb7a475d63d2ca58095cc267ade8adc5a4510d1a6e6e1b45f16a33dab8c8c368a992b71ac130f2b37b23d3076777777f7bb1ba855dd3d052d36f2553bb841155cca30d3852e6491a2c1be7348b0ef363d741acc6ab54a41eabdb423530202ecedc14ab0b7869bc30e237bd90b672f8f41c31937ece531bc8685365c1e033c3cdf67c5c230f63e2a44f6be2b627086858ff0540637b0f05c49063eb0f0cf52c5c29bb214c1c2e768c162e181ec682963e179d072c6c2232981851782c90d2c7c11330882859722020bbf441716fead84b018aa62c5c2bf2b8de2211a5cc1c23f2c8de2a12cc0b0f0adc5f68b61e02e05cde322908417b49183277c81c61a1506a557650c2a7c30832cc0f083125851a673a20d52ebc414b57dca0c9590718f8705f75e11f084d3b7ae4a59f527fbfc0f764b96ad0ec9d5e1f4b1ab52383dafe49ac760e959c1c94a4a718a569abaa573108e7dc0f3b9221a065cacf75db1eff0b02118734e089fd499d48227ee112f3b42a859d137ca8bb8e0def9992c739a15dc3b5b229c2296857f16d62b047522a3cf6a6e46192f84104a8d368a3b682f8410cea68d62aef49666172884b2a3f0c4e760532e71c6986916a56b586b689bc8a2740d6b0dd1c8a2740d6b8d113747228e24451b8986372dd2d4d8dcb028fd82d5319faefcd43623f0f1d9664489cbc66f5b116a7b6e68d9c62387c8b662302d2b0b330bd3b2b230b3302d2b0b330b734e4b3e36c9b3847f715a1618f8f494b0f0ef491f64fdac2f243cf0172642449a6332ed00893c3b8e3e4b099eb0c0bd6772ce69498b6ab151cca6773e3fcbaf51d036aa35f97933b393024f5d846686e3135de2da8a509b65d855b9ca313cce9ee658265caa2964d046195480851f78e1837b5959218210c278d1c613194c1520b0fd8d0aa5ce704119585ab0650d16cc8084512a5edb7862a33a7b35336c9f4e0106546c3fdb789ab3104208218410428875ff328266841d2fa00210b068c1f2050b4fcf71ec05325ce14a0d8270041550010065c8681823c0927aef0d61088d2aabd43b12f82e44a3de5bad52d7f4822a6c8761fbd6c6d354086d982cfcb4a6700111ec0f0b2fc5ac562b28babbdb7e800a6a5c61861457b4a49a87eda6b1dddddd71e36932ecd56c98e0c5de1e167e616f0d1666a1092c08838a292ca4420b3cd482302c1c7241082c3cb4a4e0deef392d168a61216d148440a0ce2153a863841a52d872a5042c600307a91d163ea751f039348a642184f0adc0091b80f8381870b1f3db07b8b703d619f1b0f0f3ef0ad4117dfe61813adbe79f96c705ea649f7f5d38083df6fb90207f9f1074e2ef03829d37419d518d945eae522edb3a7951873db3ba5773da94d23a4e61a5ac629d56ad6ec78b9d1775f35b67b2b4f44c16eb72467c9aa75d0ef631ff3a93959dd605bd1414341504c5534150702911db30af3d1ce669eb30ff84a04e099ee64d6d9a5b1438f9f8f922a0ceab97d27a39324250a075300e9259d4fbec323ecd6f5d0d9fe6b50ea7a3c15a1d012ceca63c8bb18f79fa7ecc675d10144f31db700760e769601db0ae863ecdbf59439ba665bd5b1d146c28a74da63615c13ee6777abe807b572e94c905bbf504609fd6adcf17c141d8ce430b9ee0651de7bae89f50a3a29d7f551a7563e75f172fadc34658cd3f2b8de2a12b57d869b2f3f75d61e7f951e18b5aa646cdd7d0289c0740ea05077f29c7253636940dbdf99aeb4a3632e0eec8f6f91943d89538d86782e78c5c84b534e2203dba7190c9c7eedd803bcd779a74ec57875dd764af67d745c23e228daeeedad811363a09c37830925837eab8cea60c5ca94d32b3b1eff2401cf6eb97d7b82ce6ea6e6a93bc1505273a76268dd22e4f44a6c55ea779f63412a95e1f6847cf46dd35036e746ed348b3a4ef344d77a325d55bf32317cd77fa6d4726181c5b8cb3366fedd9bcb722d6af6a736b0a9eec5895370abb1e43d175559cebda692df3a15d1da59674d263a338085b52bd506c2ce91ca92b69c191a43ca996fa7ae420dbafeba48fba9eeba467571747cf9e46ea684615c7c8e8d8898c2ab7c9a6de9a0ac5c6d2d47b3d896747e78e5d65777ad471a35a6a93cca8f6b6ecd9c5ef41d156997d5cbfcf5e35eb902869d3cb70171938e61e55c212b6b0345806830c2fcdd3831c29aa02d7232febed817f7fb5c7bae8974a9ff9ec892a146dc8f52cab97d5bdf783df8f1ba730fbb8979567f671e9ccf8ba1e06ee32996b5e66d7f69108675487b41dd93e0f3d1ad537ed401d4ef59128e953a0759e50997e0d41b69fb3437fa4898ac427e45d7e3e21f3f294e9a9d5ae594dbba69ddb745dc169d72ab7896a177da7b72e0bf7d9e16c9f67fb3a9cad0e798f3c8b88e6ac6f93a86ebdd5b78929155c7c9b1111f7ed588723fab3224c54b9944d9ffa971838537d9bda82827bcfe2f680f789dda64d7dad2b317c50c4614ce032acbbd887fcebe2fb213fbbf97e48796d483cb7895e76d76116b5ab63fbc2c0413acf9b9c36bee3e38395622baeccc646c63daee462615b86961b95c5bad636ad4353fc1d9dbcd2492b6d82afca2a5b705762a962e125962b5a871ec63ef56387f32eed630d4c6c1ddb904ce214a1369eda588f7867ecedb1516b1d4b0a75e120b109f6461bd8776aafb057b34378442e1c8447e4c23ede2597d83006586c9f63a3ba67398c2ea061398c2e946171e42f3bedd52cb37dfc7b6d1fe0de13acc3f1a906db7f411ce45dbf3c96e0203c6c9f60bd8ff59a5a60fbccf5be11d87e0e6dea0d0c614332c08680d88ef1ef5d96817b5026971cdad43bd8cee1c1016d12a24d146813ed81994763d9cb076e6061c7847ea77f38c0bd555da24d7d28cc14d141913a7edf8b68533f7b9d94cb0b4efebd226953bfe71d4a9b9a8736f5a548b952dad42fc272bf08a8f3527d298d62db9f4f48263b22eca31fbbb75926805f22083f5fdeaa5197c9b0fd3612df8ff758e7fbf186a458c3de6079488a2e568836359346bdcae409e158af7c66755716cefae5304428d0a6bed55d1f7bb5fb863cd9090145b35665d2a63eb6e22e8731f28ec42ab9356fe4f5bcdf47e49d91e78a53049e9e083c85b28395f5be27f15456febd20ab7b54dad49fddabd2a6beec9e9536f55bb5a9c1f4a917eee6d8ee13e1206c73a04ed32fb83e3787456b83cbcc391b524ad9e0342770f73a281b8fb231297d421e6543ca97023097981a78884b0acab097bf5449c118ec65327276a02ee02e93d9b80ce5416c66cae7c028830fac8de503610012666614db1863012cb4c2030be110387ebb2063297bfaf152878b6f1f69fbda015f9649af088fe142a46d82ccf11cdfc391d25ff948e9af756a04da7825e3bff817df7bbf9aedda31c618e107ae805cecee662e7244f52194afb364d132a3e0bbcf6deaacfbbd26b49496fc8c9b11231eb0f2dd5d196d8f3c7c776ddb169187f7d948a4ad6abe9746267a028c30c218638cf1c6f3cd8931be11a59472890feb2dfceb8187f0dc5dfa2cfcab94fb311465c151d2a97ea7bafe30916278e2067a1d8b90f1880b8ec5f0024ca3580c2fb2b0f0734ccf328d62317c408585930dab4a12ebd771e2e931ecf4184eac4058bf6efd3a3f53c563ef59fdf9512df1458822340ec3c388c97c21c36122e9d86355f2337a7615d6e1c4abc3891527c975ec40bc679589eceff59d893bcdd814e94034ec3f5b946c27d59f123c4125dab7fa63d28094e8c8444d165ea5778e4060cf2a135b948c9e9d09d2b1039131317a764e5d2012d0bee1445287132b73c73ad169ae4af5eb522364537f9e962b5db408bd2b349ca8fbf75db9a105c74b57a5729c53a2dfd7c5c2d74041f367069ee0ffb3454976d27fb660ff62a192d169eacf5342faa8fe3c5265787af5a7febc2f2f0cf6050b93bd67c6c28bbaabc391b7709258efe3c80a84f5c60182fe9d5e8c13b260e30b5856ab94e834dfa284fbf5ebbae84aae8b2e2d16d2d49f168227f8abb6962bd76f0b5d7d450b14226346884c9b297539ba89a3bb81916933d93995fd42219bf77fb6fc6c5152f3eb3ff0420a48d15c547fb62811dda6fed85ca484bba8fed8d4e6c2fc744d85e2a568fa0be99c22fd761752c59157a5a699d13935aa38b2220962788af5523bc5c013bc2a35cb74180b718078a9eb2f759d74ee5b94883efaa8fe6cc149323ae94a4627d59f2d7114ab92d1b9fa0347157681b383643a329cc27ee115ac32b18553176a6122ab384abe1dab384068dfaed59f2d3848b0f7c029ac0231cda8e00a2d68c197d52a057f843aa51d28fb861d76b1f03a84c0710a86815f2c845d8820074630c298d52ac529ad320194d5d5f5eb1786b1f034617008081ab24c047b21190b8f75934b0ab80b078c85e72c83b1370a591885a0998e460c8e5358ead90bcd58788b4615dba60b0fb3fc76b0f18b8d349e6bd466e3731a159f43a3a68d07d228f8780634aa1f8f8483b08df542e13036461c7031426863a36e6c9fc9b0bdd39d45c63dae0e3116f6a0e4fcccc48036412896763d506c6c4679c0f564d78e912c8341862b39b4095e28506c76ebd8b3a7f146ebb58e7da7a1d8f036443b3dd655ed56776db4de78ac9db6d852ad02f16226c8b2172c7b4103cb752a85d4782b92f9d0fdf0203a209e591d0f3cecb489071a701703d6e8ad873e10efad87f71fde5b0f9c0af2e149f881c13d8bb18feb3d743f3d3cc995743f4aee4376201c0f5d39c3b2e5315aa38dd27e69f5aaec8eefa8dca6abdec8a35df58abed59c1c1e1138dbab665db2d6aeeed90b888bbfae74c986da74ec728debdbaf8cc15edfc280a28bbdb11c0614606c17363e7bc6a31d703c74258b8c6ab48bcf568dd282e876e4b2da6347afd12da57ba8444ad6e98381a0848e3135232341081a03150030381c160b47e4114994851f14000f97b45660220ab428c9510c21648821c600110010000118cc060d0ff62933bf68d2ff401b160a2dcf5435a72c62ef8375a5b29701ebf2affae0792edcd89e22d6eac7b3a7a46daec8097005c14f543031ce44c1c0c1c719de22355b8fb8c9906fd452fc935a40472dc90045a5f7777220147c562739d0cad23215c1b49ab1044b61cb92106d0c550132db4a8bacaf187e80ed926dc6ccfab123abb408011235777f43054632d45e2a1aff69a624a105d76e923bce0963417ad494e03d6e8b7691bf90964058ea2c30d15e86e888333a89223fa912615f6bc4e53790195c7e036e564e8df2f589f91f4ac8a941434b1945da3da7f8bad53230ac41cce1dac146a67f498213e6dbe3b945295a29600e2ebe4e6957b82513c744e5aaf2108b07e0acb797d346a49c64bc317b742030083fac5331563d57c3e0f35cc846b369d5482834510786e729d9e8757d7d612e1d7909b574700b020605b196e176b4a774d6bfafbb0a26b453bf5bb0fad18ea02ceb31944dd88777d861d54098b99a99540bfd4488089a5917f4b63732dd3405a3ce6390c4711c389670515ca230eaf79b655257745c0662bbe43c631b91443e74518dd10efdb1ec8befb13474e65a2432b553d0f2eb9dd9d61ee18fffa6978f63f54e90024012c0101fe8d322df69d0d79a8dff9cf8d25981adf94255146d9953952740fdc32e731349db81e8d390282f7718f8897eaf3fe208904e9c84c816fd4c6686af603d7dd740ec4a522c7e8d848b68e9f9fbf85214dcd1ad1e4b7f382153f880bca63c01b0f1aa31dc51b6175765d6c1b8ab84313582fc6cb66376498bdb7cabf6eb2d97cb866181199814387282caf343dd7fbd6cd51bf8e4b5093e1654c1e2fd78c423db7159ede5911fab01a196c8b30760518c917c41f3af0b5635d967ab4d5e124b048b8aeba7849c261366331489248bdd2b959557cd9d89808305c95838e99259315c22c16230b6e0ba6f80ed6235a0ea729f9bb7b3c9e3642e2c02fdbbed404a411aa56243e9402f08e6223bd1b0958e5db4535d0ff52f6e8bb4f0de71cf8230d1e968e642b452b542d6c24f20139c267f1f426cacd2cc462304357329219188aca881c9665695a223dc8690181ee0cab0b8bc9cd60fb9353424be6b5cb2d4ffc20d1d4722e81e06f965270cb8434b89ada1806545cc6c174db2a9122d25b38d668b47344e98edf21a13f011770d46bcc57bbf78c86ec7cf0707eb41b4fdd0b6cf1dbc6cc7500da720cae072f6ba6f735c85124bb98b85a96c48ba9fe46fae874de82dd1707c0b33b7b57b5b54d0106105c2964e71cb0516e7afb9cb204bbedde04034a02f39138f59f4e8590f9356a2c05dbf650485724994ce31e2c49e5e8f94c311277a1054956b05950e10a287dc8e20b93f16e8d6044b90d2accd070ff26ae3695d9b7c4c6221ef61b9ba0cd46650c4427246824b98c76dc2b49b7570ec34cd12438bbe2349675962fa1280c5b8531dd192b09ca0ae23baff9860002a799734598e2299c44063c12c1669556e0aa5391c856b0a5b2d4ea64ac4a5b84d52424b7937ccfd6026b8a6666550022a17060cb8a6876fef1784ab7c62743e702f57f56e9ecb2e51250bb6bd9f38d4779f3bd9fe3be27bf302c9e7e961c857a49d3a44188026f82f3cc50f6f3208999798e8f7d3a5b3a9407d3c9341d499ea322f137b2da6bda537325609383c675eae6386d8ece255192ae8ce88eaafa30a8eb5f2a175f2345cb96bfd6608cba3e107828ca3c7f53b332023274b1e4df23c096176b6a52ee1d11e45eba7680a53076f950386629f741f56e3b803b948270bba726d79147e8206f1afea586af813224860c69719d09712488a6aa2835a874ea31f1026bf2f3d385bef09cfe61d879a5a398c7a1a5e351f8e5a46739a18e886061d7ba90cdd3161a40d5a348d7bd8f774da756a4e8e76f4f5a59bda0fd6b57b849f7fd997859c0b41a12c3384d17c31e022daaf118080132a6f48e2cb6edf0f232ef0cc00fe66593c18acd22a0b47d286977a54779156465c5f672faed85f0239274cb59f0d7766cf73c27838d9162505c6defaec1c9df12050c934071ea283de36db6a0a1ec1149f1b3b3c1902f2017dd41a941fce49a6d88e19f4115d32759708af5bf8e83c2f3ac10743aec3d0ca2bd31ff969e0ce4490e73004e80ba5a621bf8b0545a566ddd23ede09c3d28858b12dfad7c73564fe95cae43ccbedf74068b29d29f0cd7b5c89b36358cadb45c10fe41697a457828bb095bed2a47ab3177ccecfa336639c7f5ee193aea4d8672492e095fbcf4708e25dd5f521268436767684b0b4066a089964b0a560856846e6d1d34dd1c9fa12ae8123f9bd0da92d11511e8f3c44089d2076ba8c5cd6a4f8a8650691e3ea70cc4511ed66c115c0c575a95e69a20473e168d5eba86e372b6b460abb2d46a56beef0c3104d661ada0b347d8d106f03093e3343ca2acacea7c0a4d2d717b5ce30adc7c92154f0bfd2b530e5663808ab5bbab18309a983b2ef95de8018dafe54aa6f4fb9a480cc07e79c2e0fdb48f9bcf61b6d7bb61be1ab22f4065ae2e6f1d4cd3219c32a0114a86abf2eec390c532ccf35c6d365741e1046a49045badf1dc95d0bb9c0a981f49d39fbed4390bd4aabdcdc3c9f6b3930e27c8f4869b084cbf4296140f5bab383d77f5218b6729e28721ea43600f8c8994b465b710502a7c91deef74555e9730e10e26c046a7659360b140b7b445adcfa37478f02b158480f18dd0081308757ea5455e80eabb3d30b24e1c8b179159b87bef84e8d5c32bc42321699f8b3d08ac5854eed7c823ffb54cac22b267db846d4b5e9744433a3d4d22c4f6431ba9f59da5ae6dd931735f76e60b202972507ec77dac41255a9f247eeb9638a66b65fe035d600e2939ff405167657b3b6b814dbf5563a0db1ce51935712a20bf4c70eed1252dacddc6c94a08c45912e0e07d2ea62f85d86794f431068eb85ee98be21200a08579fb642aeac89f9bc4e70f378e81e04a204522489f0b55eeeaef83cc9591a98993d75e4a37d11be382d10659965cdfa1742622417356d984e6bb619604319ceef293a0f30c957ee44d3fd3e06014be51722472b1315caa77c419c917374daa92aa18b995d04a1cad1b66f2ee0d4c78d9fad1132fad20f2a5b173ddc4cfaa4bb23719e5a58c3cbf00a5dcbe94915aac97d0f40a154b1a3f4f0db35195bb49c9bf1b446106c0db3403171eaf86e103799730e18529d4d92bea45cd0bd173a379998dfef059e5b828e4aed3131cd281c447f88620032b016a06380df4ac41498367ba20aa6429588840e9d080e6d1fb4c020d7cbcdf2ee791bde31d82cbec4d3da612e1447d5e3621ec99b2d7ff48642f906574e95ab6e90dfc550c924bac085e356740abea8e7721dd6540de2d24228bb52cda031ed0019afc47af0d901e84ec1f458a11d1634e5e208562bcb580b9c2e9cf32ea2ef6457d4e52709f9f4eaa802639b9e921cebaabb69bf2c206fcb53e3672d3c4dd34d46a27c798cb88bd00fa94f31f7b9f8f4c997e3abae7e155e658d2b5231c2a541d4e68c08ada35e0b09b4b5f44504ad343aabe417bb91e51d7e8977f1e427d6d5b2720bcb6b48b30cf4ace423844a2a3c07a72a8147c13f892c0e44f5b8de97d9d0ba11b2dd32e9c9460aaae74e82e13bef999cab1596a34eb4471131c7f13b3230f1f26257109d58c8690708c04f8c4e1b77ccef3186521f788a90a5650e53e6c4291b0aff75c7c05c2039fa66fc33204c4692e1930bd2444df76a8e11b1e66b698c64cb712e11e860522aa5ef99d1830aaf2f43888796209f8c8d09806e429effa9ae00ca66251c28c7b024b869730bc019f93b97497d1009c054ec10612d5de1e682572663ed98b0503bfae9998b1bf6e1c0bf46c0b0b514e33f089ace9952fe1ec0baf74f33e4d538a49a0e5d24c5c96e7411d361bbe2d1c4188a2b95dc7db3d2fffdf66d0d1f440c2e75880dc48f4d4aa86166d68a5804fc759be57857ce3d705f403cf3f2698647bbf1a0b69004f4bcb51371f06fdf47c4b7dffcf4091c0a081a0c5a31b8063574456d87a65ecbad5529a8d46569b897494e39296d42182d6af58d0cf604c4a4c2513d2fe0ef6294c84cb486c7fc60a58f3c24141cdf3782a645d6e737270712924f287ffac049d56b76acc02462aeb1476f4d91b1b97b464a708efa5630e2b0c2aef950899032a5ea544d5c29cf204bd528785159c784c6ddc43f41ee38078426469deab44d3336d23611f1151e1d942d98748d7d1e3756615ac9a5b0c2cdaa690d57162d21ec5d2f96c09c1e39598ee4c35b085d06ac62c9a96bc6454e6e77ca9f70f32d542c1963f2d5836dc3d76d6c7769802c2ff1f87661799814e974b11c39b672da52e1d369c811114460a74158342b507e26a4c60c3ee720922b0d0afc9685c43957906957586655dd73e19addbd2b2370edabfc4f729e7275ff79104500ef4ef4270735907ead21a58735fde16353a55b0a6f916a2bc4be889bbb80c16b74c7c053e9cf38f10508b28c64e7b96a896ccd302a19218c394fdae8f30c4b06b9fc71d906c209521f98de4ac7e2d5a9914b56d5148016b8e4c163c33784c2f90fb74dcadf642c87ac823ac4817c294628d0ea41a2be2ebd60fcb1edac4e8eb987f77b30bc4b55aae1f3fe5f2849269b912ad7c9b5b1576ef788e3f9ab7d1227fb3a263d8303dedcc72cdf788715e5741094856345421209178ffb3f711bb6965cb9fd27640b4fa0f6d0b650f09ebca7565a4ca9e489190bf76c1dc9a2e5280fdaf35da0603f80a4620b6ccb57499ec930f187959808368deee4d8b4bb826d10e545128479e6262d43fd7858bff5098f0d0e48545a8a97c94b14d555d8d24e97665a361faafbd3db6e9b35093acfaea4ece393d2ff41c245f31a609dff54017517f4685bd86a18bfc09140423ec49c62f48efa6184664252fae7509dfcd871e426d9084d84770013be82861f7db051da6a363f9c0538ec7c8d8d286113f5773203a27b8244e8550e049ab006ecbae22b3046638a568fc226e5446df05d4fbcc88364697033b04d65bed5f717cab4b93a4fa751f20e7ec870f36bbe2bfc3b826890afc8d7ef2b4f235bfd35a4d0d2e0a3d54308f94a09bb51a19494beef3494857afabed5cb6e444d65f532eede37fb660f51bb21e4e4e82d901f22f68c12b19812b4082388de39851a0436c83823a059c5b85418f1334794cd8feab6909bd62a0093794219ef05bcd3fea0cfe6dd3df46a5a7d4f6ea9c236ff526c47b8e6f19dcce1eeffb5098926c5dd68e2097e2b06269840d92ff92fd93b0901236582fb9a0c559d788733fcee7401be8c0188a31e41528b84b589a841be2b2de27b7a58cba11c6a03af912241e036bfc77384fc610631cbd9b08b1bf334bc11db8d10ba55513dad177f1bbabef78188bb229580eedea500ee510a538de2f6684f4d50ca7afd425c56161b94ee1078964c656a11db8cbfbd65a978ba873ca6cb5aefde5d3b71e3d07be9426edd1d41036e37cce56365187e9a8fa7e511d3d6d6899bf0eb90418a923e3712f39c73ddb5581b95790202cf1c7429f7dc6c388be7e4dd40d45d2a23eba2dda1f91bdfc875cb7ccde3c2c65700974bce2d34b796c531d5515942a91e7fa8fc32506fc37b283e9b03964308d7d6866e95212c05386cd89f6f280a83d800804ff99f000f44a1bc814691854d3912b1442198ffeca8240d6052e74f745e512767d6c31254313721820fd113cb5830b30211c4743213da813ae7813a29bc452b811e62e303adc121e866a6cfd06c5e854c1c53834933af84a19ea2036a346b4a7765575e647c02c0fd20c40e5438846e78bb305a0e4f573700468e06f6ddd5a3d665a351f64aba1852bffed9170708250577c4923e4f986b2c6d936f9d7eb85b5efce107d30e210ed2c99dbe657fe93b74b8ac4d197953659f526b782b4db60e2259afc0dd95ad52f17e0193e88559b0af0686c2bc80cac953b2f937f695fcd9ddf8dc3ff92f11b0af69fdc25eea926ccdf1c5706b80974fc497173fdc1683f04a1d1b84e0d667ad3a725ea86d1aa1f54c192652998ed41a2cb1c2618107ca2a255fbafe6a4d6638e64197430ccf458539c046955028c28a48b3633f59c314fc22cefd9f0676d6cd90eeec1c5aa369f09c87f74243578047b0e04f8a376682d97a1a19878da20878bc53ec9530550c34643a21feee1bc8c60713a84b8de2c893cae65aa2851af2a105eb7183f91ddb8296247eafb5103c78306f05f213bf35f54a800cca558f492b37275572a4a40678c2fdaeae39e9cbcbf2618a6974e7232a380f8a689a549809ca109cf18dcb7dcab787f023cd9e27aa6d417529188f8c5fa2c500cbd285763729fe1f0677b12dce0d5e3f28fc1defb75a827d343100ecdbca7de5c05725444932fe4185ea039cb6035e6dbfbe75b8e9b6fe1914056dfd157ab36321543c410168e8a5b9dced53be4db3af4b7206dd07816675c1440ea5995a587c84cf03e5d06efd20d994c582c38def2e20a74f46492fad22c78eb2461c3566052d534d9409bb037f4274d0b474998c218e233661e267712c4ba94f5c58e33c794dc28c648834d7002cb490a29e4018f5767d9bb7585ac9eca7f8381721f0727a83101d7d508ee39ad49acc256957598115416a8330908657a13b6d68839f6261df9870bc21d442f8eca09eb106da7cbd350301b175859159656a4b5e4a743daec640478020f1793b9458aabd801efd43bd6ba728f4547f9391d97f4a81aa1d1762949d930d0ec106262741d1b786b081cb4b0aab3be402d16883468eb0e4773263accb1697789f01c4e8eaa06a35bcbc636a0532317838192653f74eb718fbe99cb77d17d065a96136736a116989b3c6ef4a22b79c8e5329eadd6c96162631ab79fc5b8a96ebffd3aa7b6ec7a55dc6bca07da4f09692ace4b3a52d4be211f4c0b10766d4dbf9b13f2e53f3403a9c053e1bb31911763120ff137ac5eb8fd13dd95e80d7aead681ff3f472ede3b77f5c5a37089ba16e2dd2c6f55cb6c18f4cc486b7ba693e02740d57eac130c4f15eb6c2b97b68ae6a14c5f38829a82ef8d2cd8a4ac1bb85c0986bd1b5f92e29d4d028939a8dfab71d92ec2db5890861318a13de0dfac5d20497dc52a6442dc01380158fd9b027b3992132cc2ce004fb2c82b2ba63c64dcf7c76226a0baf5d28739c25af1b8e378e1a46c504b08df7ba0e7862895a7c5fc0356aea5181745cde5e638723e2befe9fed7b1d8e725302cfb30c1c2f505eaabbe84996d33b779a1366ff2a2b2294e99803ab7d13691ce38af7067dba96b07a5b46f06d1af427b0bd01db04d1c3e3fcbd2309b26f79bb1aac9b875de2d205009d5797c70f1cff89852c0c46c1e0f68c1ccaac2ecfe42360269058cb470eaeab14d3d3b5249c425e2cca8bf6d307759ba578a5cb757f8077cb1b37a0d2264980899cbc70ca2fed2685ab2e4626d0608a9a7dac0cfdbb7e6ac96abe913278c1bc3258e5468d65eb3bf40f6afe00004a98fd4c509a472bda83fe932a1686bdec4f984fa903e253c59dfdd71b37a5165728aecc8c44ccff0370e23b554242c3961f2708b51454d4b61686355787812a7b1df9d15c3c3b435c0fec1158e94118e880635dd826f17f870323e867810cd95c3e30d48156df0a86062e2c942c3cd0f63a6fe52443d0450b4054112cca2318037a5102e92307ef600e6f284155a56b063a190b8333fe3eb7c7761b8a064715d5895d360dd6be3d18826e65048d652741822e3ed33b8082d638688c55df625cb5068af745d8ab5d9f65eea728acd310188dcc3e476aca75dbb0e44b69f14d04a382cc32a69caa1dd332b0f03c64210f23426c30a8824f00a44e4c41da16d3724014c0f6f805ee01a57cae2c030cd67b0eb95ccff706a9bb0e4043d4e5312a7108684964b35305af1c2630b2dcf82166d2f676cf6587651facc2e943bccc4a12d13236bd446e746229396172a067bcf59915085d99a11a7fb24018efeefd157a0908dad0d2468ffb95a98d45bbbff3a4f681d405738756dd2f707e67e07c7fa6d4a8a6362deae6419e37e6d0828b5d5343343779f8d63b44a34c1007830116a3e20d1683868b3556a1addb1856c74c360fdf973d353dc62fc1a3286bbeb2fe3b3ca380fa14b0a7e6e614060c30965aa2a69386a34bb032695b5a338cf7971057eaacba7705ba7fb17cf24b83396ebc5ba4cc5a96441250c1deb6907744b7b4f54d7cab583dec91fd090e45de1e34825403d0cb00b4fa2ca2b9f68c744776f1211558d5ded46a44029e4065d3adb9a249f65b013d7721fc9618fe25f26f753df26b8307c4a49c5565019fc45603dab771fd89ae1b50bd182a247ddcb4c2c6c0b3e1afaf36d75c4ecf5e244ddb06fa4903bc5c39a374dc6cd56012e2d42a83797eb4b50938aecfe800eba7c120b8b3e373b147553c18962344a122149adb0019ad9bff7f563b26e02a5c817c86ae40604c62eb6177b8820d731e8d80ae5fdc52797e9bddf60282d9d404f4f3a4417a85dc46135127620d2f1ec1b0d036a4576f1f0ea660ab93b14fe9c9387cb9d67694f2f693df43e61c643cc8260abf5cb0ec49652d95e3b520c76d903940f14a6fc513e1aa08f3247d9c6b7d40c49fc83b661e41ada9b6aeabcd53afb60743fe0d869be1b1eb1b5d6a5b3c66ae4c6c94ff65e6c648133527b38e4ea511f0116488318c9eb3cdcc3abb9873d96adbd83f5b2a9a3f52dd3e56d12902f4c71e9c51c0227f347e5f7c840311157382d9ea09153023d4e1b35f5c90839b285cb347b40c464ec595f1287f097dc660c9a10a6a41d2a868d1574b65d4c12da501c07b016786a390040addc6a27b3e1ae51861fbc6a5b0b3b44f23a63f11d68e2aa629c2c93bab219c73a2f0d15256196c7ba26cd7631f352c8507b6e8b8e89bd67df70166dae38358e344a3d83c7de9c0acefb2e93fbda3442815493fed210fd056dd219456a3adc1eb3f3fa75a564737e1ed4a9801cc22f6cf7683bbd6547538011b7cc3420a7722e236b85ed4ab208e106b370c961cdfde8437c6643245cba5b1a783df288f48e3b29da7c6b1cb6c3f703baf77c714db39c76d2e60ac525dd0490a7264d8b90224e56e2aff89c8ab1f59bd62e371301a87a3d3174a200775fb4ddca919fd30be14cee9d29cc142e4ebba9804a91f6a8e9c34ef9d9ca4233c0f632e3a2d031ba656fd4e3e38eeed5c97d1fbd7658f0e05014d88799d401b2e7bb33e7e3bb7eb2d24556b9954a758fa7e70ebe20d52490ee4b94cf2bc34d801d9691a7202691720f5141cf060a423e5d0aa0113f5eb7e4907057d2e2afb8fbd16abc6c308a7b3c15e6ad44552cf87f2d74f2a4c2b3339f752220d6bbfed397247ddd4d53a96f600dbfe905dcb17648b122513162cf6e6c6f032a571c455f41a158910cf462954d9ada18adea34fbbd2620f80a77a1efcc4b1cba45d0cd50bc4026155e841754c3c0ca6e0b7ba6e0d553d98364ac9491cebf34d4e642895beacbe167c4de2ea3c2c85f8658b4b78a2c1c792ff8bb5c122c6d653ab71468ba5eb6389436c1484023af502d16541eeed9bb86db5b1858dd71bf56705389040694e6209fe9343912021ddfda4af51460f940ed43884bf211fe544bc6e7f8f4a324c9c7124b65b0050d77e635c32d4ecee1e8018811d419a160aa0f3523bf69b705894a9d4a1bab282c10163db68a0a416fd7c6479a0e1b16e06cfadda3e139f316d9a5131f5a2899c76c4e97457eed15f4060fcbd220d87f03c2e51fe6b767b06cb3c27e442ae939fd0c229bea63cbae39b260dd3a3a916967adf503d0238dd3bf36a7ce6159beed78352aee79ead57464ba9b35305da5d343fe8878782377ece598800a5aceb0c337bd173df8ac33d57022e7d417da90d0da634a7740327931e462cc4f53b575098094c8801611110cb17d19df75da24a5d2cd691612703709560da4b832f81d092c1d655d519734354be921b2a6506e1dfa3f6cc5939419b32657e19891e2c877bc99b12a3aea444fe49485132afd436b10f70ed579dd798ee2ada2630f5b464689b99f361648cfeb0adccdf05f2716071dcb092a44e0cac23d4e2d2f3422252273817d13a769e06698884f6ac5a60550a13ac2c804b80cdc597de574c0d68b42ae9780d47eefbefe2aea74e2cd44b794e196aa65e208965fea4a69a598de29877b94a5c007beb5000e9bfa7105c650dbc81cd1dd53aa18a0e532765827ac10f2d1b81877daed56376b24bf3b1de2a08563f101facbfd61708130797240104eb03f60270bff4d65ba8815753e9c4aab81271285dcd53175a9293160ee89f84959704675a844945de8786b25e69238d1b9696d055f6272256a2f1e11cf05aaaac437fb3ec7d8be591b246eb7be8f11803dc3ab1170398d0d6e062a0998c111987b1a86379964f3e88ed67ec6eb9f5bca7cf43e08860a50126d99bd98b4c5ee9ee3633919202573854c4f10411b3e8fc8c45031b26927e76940bf8b178014a56b8b27ff0f2cb4002c5e50ca1f12eaaad0dccffa2a6767abe723dc774d4a6d7f038962d080e1bc91d4b896ba179414321156281084cd8f337010d983142f7f92b804935f14aeec222b38eb6e714a2948d13dc0fc0a96200df19cd1dee45a4bc5bc33026d4295989f2f9d54327f87efb7d0b3669b179943889af3307c8c36a3c37e30de182fc1b45220e5bad4a33d24e66dc4b22d2a4d8289d85b65d26c6da007d66cc098a93a6b8e5d68914d6ccc8b46c6651ec4486a1e82e9014b5070aca9305dddb14e508e2a6f62b57f450596591044e1169c45a80907337e28e9b0f2d74f38e09ca33ffdf90235241e36ebade30b08808c6ef56984e0cd6d95cb24198dd00e67b0c20bc1c208755422df2e33ffaf7ea12185fd9bf51e96443e9a6a51eddfeb0b97b5fe10eabf03bd227ba30dcefba18c312a803c63d3214ca53265022b00fc95b232ebd04338f970a90c36cdc0c034d0253cfdc1b49e4b2b545ac8c0cffb82d15f0a136ec279659c2d3b63cf30c4a9a6400a7aa8658e1d4dbcc6a536c6c349a3ec50a7f844b5bb090b446d60c459cb929fa22da5ce2deb52d48bfa3b25303fa7a2cdf0af2ce41cd3c450a98661e6b1feecf240bcc941830a1cb6fe3d1344bc568019e3830e1e1ffa66ddbc25eab1834b76cb4ccbbf054c26d3b66510c8e7a3b447e6c5a12b6a5ccc4a4e7a765acc1966e94dbd59e8d3359ae243daba204802806daf4369e437c197e6765e69cf734f7e3770c90734ed9268c627fcf6d4b405d2de7dfdbff045e38695598eb1bc7b6ec7ea992c87495a5846d38e96077bfe8d79c28a2287184a7cec4d5baf4c0b0bdc0b494f2cce8a76ef236c12bd190c6b3a06e9fdfc67cf3edbed386ddd8309fe66e87fc843b2c9bac5cd4a80915738acc9eb66d9a210e138429a1155f0672b9acf651d4dc668b4ff63e5b0e0941a57570971c7e225335c9944a380eb62d6bbbaa525063c146077741a294f4a271fb8d47138b2008e81c043b285e390c75e8876839e8999c853b816fd5c16e58c28bd29502081145d22cc1d30a07d1b044eb5f85874b6748b689320821cbf4cd55b9ed6621bcc34dab18f906d3fbfedfa37e0eb7da1fbbd88177a53bdb936ce8f7656eaf78545ae3042bc051a93a288fcfed0130ac723e497b2cafb49a4e988a0b8e35126d9b861da81aead555b5aff47abf95e0730c7c82e3893a46391151e29f02e27c8f25d2be6fa2482a409f51224316722ffa295cf69c4da9a28c5e8087b044896bd9bdde971f363f1cc2071d3df6e52c4bc2d8386e9434f476bd0e809ac13290b517c4929187c2f2b9d6a091a5caaaf130d3e96288b007ba9f631d6447f007957e9d9b25e538c14e954843da225692563af976b17ae896c7297df5f0212a3857a4e01d9f5c972c4df5516e75e50eb8781393f2648d78fd85d713e6741e16749722baf70f8e7209370909345f30e5b466bdff50cebe96d7566c50b858f704bae09286544d353b59ef7fbd0d5341ef70357c6f629906cc23dbda86ede01c7a6b5fa709bb1084034b6ce530b4936d6f81877ed5cd88f26158f4933c380ed0d13e57b49917cd3f97ca5b1b977a7139d00d939c21b029ace4ec23c28390c14442612cc7bab90176a52ce752d9d2ff3946f888bf3c17301da54c84cb081f7b02a6c7ca84ee516bf5d3620091bc90b442b03595314878d917bbc06dc61e9a2dcf3a1abb0dc98785d1688d7f79c17a5ec4422b7d0d4c378e0f4b3488aed767f32502ac7a2033e4331e37eeeb56aa313a6fc92bd27b9d8909365a7c2a6b8525cdbbd047cabdd46088b9cdbadedf5ec04f564147186d048a8d0f0490b92e10c2f620e43b1233fbe0c8a414f0d2890f9c5e1ac0058bbb5e2271750af42d5d3a8af839a6b7a942284040f151a6081e31ad5b926028e716f8c0b30411a13ddaea50361a7ec6e585c56f3b9410a103ef894df4637f1763528a2dd5eb1299b7bcfb533ced6d6046afb7402668ccfb9348bf8b4426b4e3e2f9f04189cf9a4e51816147ab18a29c0e736fb2c77614e08fc966f45d291a7125946b5939828f97eb0740371f6ae586b4d4567196cc600c5b6160f616424f826f6122b0e4f862ac014c0bd2e9c37dd1527aba708875185f310e689c495017674a5d7365a03971fc7012d7df7385dd16c6e34ba4110457d75cc22c9d5104494fbc0a2672b302089a4777868b2fdc521dfd464128edc21aad7ec40a4a82bdec552d2f470f86d1d3125a02a0d1a411b760f414c94a0c95ae6dac8ab0a28669d86f6666ff7a2b8b4cfdfe0739ff79a82f2f0948388d17de83c31b0b3888d3d6e5ede45a91dfdc1662d4ef4f5f5a0f11a2aa9a68edc6b68535936afd9e5ce0d03720ae7f18b340833a5338dc5b0120859ad751619a0f5b7bb3acc09025edafc76b1ea9d7030f9bd0541941b69b47ec2a498641339ce883b81a24508ea58a0535cb3aee8f7a13af7ea9be7fb4e15f476ecb110eac50329f3ad4bd811bba1d10ab6a50c6ce072d5f64e3f0d656894e374f56dd9309c131a63b8107bd84b99da6d0c3890a44b76f95237c0abb15a42dfb98d04de9afe4717e4b55c329d0802b57ff6ff6063a41a4364bc4fdb54b32fd99f8f8492c5a494e7741dc4573d79bf6ac5ef7912f9a2ae4a63ff30fe872e8723f084927b79706e109216193fd87d01da002d2e45529736b3d4e103fc63f74061fefe41ab54b8cd532063d700a1d360a72c6d99431bc31322e78130fd8b3202d99e988bf1eeb8bcca50cbfac1c0063c97c91174403e33b07dc85030966e181d2fbb6f679525a2c334af93b2aaae12755464331b801422ef8d330d42cffdad6fd4a8fa67c2f838a9188a7f9e7494246c4c6e63cf23ccea27e831b8f544bdcdb294ce3a2b27b56ded89883b482d3bd134507642f6ddb29ba1a1bdb2f4a21427ac271019c36525c590b012d547e00c8bd479865644352eae340eb44f5036ff92ce3cee87fb19bccaa74d1c9a9366beac031966c95d5cfc2b02a33c83a47ef5c2146167c16ca4b52fc6fdac158af8006275bd007aa2ba74ee6d31b2c3ba0c3dbc90b6fdb8b8b54921e520694fb3169455ee25c3cc54eb75530a9bef86c2554aaa6690e46a70e8698cc8ea72e0d54908770eda862bc4d133da4869d2cc7a121aa522d8c9616a057edcadf089ae5b152c82f2956dc9c98ec616e23a11e0c95df30d0afd809c9d1b6746ba8774382022b35d3dc8805956db461c2e4f34bd79a184f3d063d7e5e48cdcb72cb8e07752e4a25d2705860501bf6f63a00dfd1aee078d49aa02715287617481c65e567f87bc1ba956c553dbe31173f4c105704dd1316f804c9352161645b48d70ad591e4af78f7718ed31fac5d0df47dc2c6bf5f2c1ac8ab79298e33ea608985d8c1c244314bc4717537820e52702d6748541d1ca97ace47adeeeab312b058df14182e067827710b9af16405b43ba1378ca6d02d26e4d134011f3b088330e63fa69f77f75e0f17022a49deef0663d2ea717e7300f7a5c70dc6acc0f681b86c231d468df190c697b85ffb01898a9a11ea4c6399be277b182ea541df9ba241f4d7fa409d3367544a2bf5ba302c1b5c784805d18b3dd9f26e5302ff5e9691873e5cbb0a0456e66920f0e93f510b1142738dc52a66cd9c12ddaca77bb077e99ec7b618d3526b7e73baabf5e90fd5e0f6a57ed00b9cf49645d086d79635f955c84ab32b2caf84cec53960b6785b025235c83be745ec87b8c8f72bee22285fb2a07d939daa1bfdd5787a0ac48fe2d55a2b04e3d17a67e65f30f524eb64883101ae386f5dfe539d39bb44f681fc4447aec1617d3e8afb1915745d55316351158af038421e92904fb0fd7c28a4122529030bce623c4fbf4044e7b3edda1e50b9c8c08a9b1df0856b043b9d3cedf7157d0c534339f0b6fd246e0e1a53d30b05de9dae08672b032aa49f58552e82fa05c2eaeba41a291c72fb013afa6a82552c24519c092195a505de2bc7f3d49709227701a6ef5ab3df172b7be5d76b8a61d1748692bdd514b1fc3f4dea0f57c1a9081a27fd874742a094631929d4ff5f98d62c7f136426031197255f8cfa8106efb00fa1e39391c3845c5096c33f07d9fd0069f0c6fd5897f359e48ea00672e395193cec916f357c5f5dde720ab4d0c9c857afd4c0b74e66e980e0d1fb276890ae81a6b04309fe049d171b1060f195a35d50f02eca43bd6a85619c05db91d07f771045f634029d3800975b7373b0d79efbca7123290461152b09f7007c45dc900d5c5746f9683591363ed5f84cd0cb72fb07047addb83fec23c1f5b26a72c9a9f47dda9b099487b0d7925b26b2e154cce9e84b8f5d063cb98de30281026d170f6415a69bd4799a41d27153c5b7b431867a9c204b065858ac90b8dd330e480e87ad86cb83019b51f5aba4f166436764e51f09e7e78eb5570f7391af042e87124366bcc456155ce16092c8ce52f7d250c378bc490090f8d35838e7e5fd3fd8b2cc5c063c7f0b8fac1fb3378065ffddc2b0db9d081c245896f0d042b0d638eb63e286e51c0c8810f45453502eec507e38fb58c9063565bdc1d9cfbd33619f34b7d84b64d50e544bbe6ea0429709a919f366e4a386a6961862a499d011c37a1f64fb9a615f9c0a928f75c0aa78251761829db48c9ca676811e4582f6cd334bafb2664e51d37ddcded9b21a80c0e10b5e8b2799551fd76a4ed2e1b430bccbfad19d02981b0fb34608ab1a5db792e38971bf145b5d4f7f80143eaecd7b706ef95c39e74042ec947771a36197541e6c6a838415444ba0c0a9f2845280bc25ad44e9a883979ae5d0e8730a6a20156be83f1736f625b3d7d3a26644f7cc14c764c43465112553ba7245df30c59bc4eef75652205c6a8c19d3efc8f3e5fbd5ece265ae62851c31ef189f5bac0efcf0453edd7c828993292013ac7aef611e559764258b6d6493af9f4906aff54040d12ff505e0807a9aac087f4b840bfc631fa543c286c2ffc13ad5bbe373dadf4821a9468cecd465db2c961f7d0ea5daade21f1224cba6df8db328ed48c93fac0a69282083ce9da89fccd182326471b90a41828547d212d60b7d44275e1f1a8465ce4f4f9314eca7c464fd2d98eb75e1a292ad9e6d393dd17df3b4fa570c806fa0ce5e9097232008bc525b594a8d05b4e3523ae7d02155189ca3b3f3e7fc92008c7e9345a3e4963e638055b7b29a13db78ab51ec165561ceabc1ab9e46dc2a90776078e15716aadc9ed66be96d98832c676e5542ba8a52c17987dbbb7dc659a8f2ef2aaf493c1371150ea5fe192bd87c219912fcdc86d2e1029017652a40ddffb0e700ba7a6d6d818681bde29c2b938edc00f848efcdc323e1c843bde809e2cd374d841ec3dc8c5bad01084e49caa6537d4fb40ae9e38c73c64db230fb53145e82b781dce7d2cd8b12441d8fc4badfc10ba76efbf9e5f9bfc098081c8e023c18daa2113073f8ba38495bbc829f0154ef8f40e9abf53cbe7d3a312922501675cd6385330d0dedc991ffa7161e7ab2d587ab881975ff99e5ea54fd143138fa209542317e86a3881069cde4e64a066f03c90bf29b78984b05e1b62201555ea84e0609b92c55f0229713b303115d65361b01e696e7ab3f017bd37a97d21061f362f590f6d6c4d70d35d89b30e84f9747edcc2dac6d4c531351eebe0efb69a371807c72faedca94ee47e45b20ef43f53bd4334e1d59e03f599baf72841338afd163046700228946317f6de0d529060e7d4b8f05ad0081eba88e57b3d35b15a9481694f53c9786d1ddcdabb35224a066f9c989b4cc78f7f9afa9f4f130952302e5f53888ba384f00755602880cd122fad93154ead9c5df4d0bae2164a90c825b595c439dc9df3e8c2860153268777ffe76c5e3cd6272dd32c8902e1a66ce25a211664935f49a90ae310b02cca1de46b66ffbba093d1ee5557f1cd54513d8b55fa05640ed666e03e608aa8881146eb35c259b3f5b066525569f36652698d155183bfb9d0c2a3ce3a4a96cb5db7c9de591cb0336990b6805b082dbc5e3d0daf9081b2e9e10d001f5596ac7cb96a8808aa49f5b9848876fa18aa13b67f1adce483994da9cb8168c771743c6b8974f78475755aa34507fd15b7a050ac62ecbbd514dcd741267e82447f51b7ad3f2c37bfb56927ce5608fc482ef9a70ba03e95ae2342d92a617afaab7e82176cd2e8169fa68453bf607612309af367c4c99ba83269afe7c26f04c7e7c0d25bfa921d265bf01add3be155d4f1c5e6268b9e56e70636ca95c217b115d252d034567c74f0507e002aeccbd8498b624955f93406c6c131c0cfc6c40531a6e81e336d12fd0b16c5f33989ef72db57a0c8b41923f5a0558c18c1b7ce34311109b248cca0b05814ec48cbed15c83e36cba424494ac11a6172d321782a4f34b23e43676742d8a3c95a591bf6c99490ef676dc6402e7cd4d877664869d99bcd51762154fa83aae7a39651f7e49a1331b050cbbe0a1b9e04112c08eaa0476360fe83ff735e495dc4730935258d58ed5c5a78f6be885310640016d557fd86aa875d88b46711490fa72788ab906939065633246cd893fbe8c4c13f670c36c2c83d984eacb2e67b9c958401ca5020806a100cf208e93ec336ae97cea6bfd27048977041a7f7cd2fa71991d4d1c78e267072b8ddd0021585d54e694326012063e688edc8bbd88e641ba3b8cc594678673a2f3e25bc4f51adf521eb2f3e9abd7611f403ff151e18d9d64ba613aac02c7d1042aa09ddb53a453da39f481f530ced1156538711b8cafc224f8b16d5da81e881595dd73458e28fd1dd433618a4d2d8314cb9f535266bf1101f34bfd19d95546211d334801eb7d11d4f24f22f62bd6228a5d3c1b72317d5a74b87b6564b8990b510b40894f0ca243a80564615872cad7ef3a336e0aa27c5060254dc014c3d1e2372a4b7ea759aca058b0fae479bc30c2beb004e6203453797de253123a6c4960b6e19f861ff5a247e6edb98e11d492f85f33b006cfc3bb31f27c77e607b4839fed44d266641b5d5b4ed51fe4b765787e24a7df592de530f182ef6c672fc821114c775fe020b4c411b817d149209142c9dd4e662a9180a333335db48e9739b8d8764e9207b1908c8443654591ab417d65d2404bed2af31160c24d2faf07308dc49d496032ad6f360d27803c024570df5673f0fdc8480655793cc2f0e268d380ee0a1ab44cf45c3f69bfc202ff46f8e8cbfadcbc71215464b6fdff745ed5deb894e6f97e286ec4eafa491df454d7d0083ae74740e670ca91ae3b0c5a195c8ae7abb95b14a65c18dc6ae84521cc1e86ad24ad9ee1e095e042f3447c38f0e5a8f28436332907b48552a4be42961f6a91c233a45acc1d53e0261bdc41038f15456da862e286a83a791c3a9c993266f95595abc934d7650a903553d825f362f806615b13e97d54059641064601bc9f7f73152886c852d28bdcaa80f9f09fd8715aa2919ef8c55580214b34e8619e5e3c5f7b90388376f2ad4f590cf5428dc189f299538ec9a8ea89130fa12fef1ed57a74872bd4a4882504038352c2e126b22609563326c5cfc41573b51afbfa53619bed4cec5f4dd220a8f2c4b1f3cf734053d19a74ca89685ec0797d40ac126ea2ce3a546f9e259afb5c2c748ec09cc3c9452922f7ba099cf90e0edbc64959777cb9289af8ed8138a9f540e52f3589b5bd55165fea93748397c905e0b1b61f07cdf6e2f27290ca8960044002ad33232e35920466f39504c4633228d3d0b73276280f695654c730736f7b74e3bd8409daad4230ef96b82b4c4eb70913e1560e1fa2c2548176df3c0473766416e2beda052d47473415cc9754e957cdb8209a7f6c8f9e1f2670b5241c66da1d835baf8b30cbe888e05201589c41475c8f78e3471933dfc07a45996fde0e78bc10ae8958c9faf53103ba3e3a1106cc4b58a9948d51934d0df9629aa4ad5a67fb38b531867835930f778075a07a1d59dc0105bdb1a3e8890c62ae755816326036967732a6a595e913c036ba70a18c03dfe9d8a7acdaed6a22a858e0d8dae45e6d949b0c0de984ab5fd371b96bf762fd64752cfc6b50381ae3e6a54a14075de16c57a2929a692b5d23085f592d59e47ff5881cb50ed6d856d09a3b9f418d5548855f7402c724ba012a1c66c33e17617afd8dcac570a04381149adc62ad993cb7cd436579913284f676c465a867e4cfa98174c99ce0e0349b5ee9f24fc9c60e9ccc35cf6c36037fefc84f6ea50a30568ef70c7875b954a3049ac66fb403221c42c96066c91b3271f7d7dc0b521b78268f3bc55042e104c6e143cc69328e6671777af8d0759d097c1ea8cc559a554cb379f462b081c5b238ca7d654f9f2b0ef02d570c1d9c71611f2a1a7c02aa63f78d5732bc329689c546f120530123ad6cb8cc7d29e44bc9f8ddd6c8a949a1ac305caeed9ef39dc6a486715d99080ab4e208cba173143628f197972da1e66a296e1e064555b0e283253f1db37c196e5f7c3a4b91edd77cf2fee3735e156ab651f66913dd8f21001240067feac4b90bc25f16d45a6105d45c94b13e936a4db821fde040a01596e9ec212260719b2ce5d9c3b3a0c5eafcaf5bcfa4b87c564340f52a4ed65e89cbc535fd20b4ee0bed1e9ce2bff0cc2b7404df3239c45048330ce27710f28c149be9262186d3d973ac44a7bcdf9a56042532ce1ce60f9170f97a7ce5fa2e2f23a67ad4b26cc9ea7af9045590d2c4d634c60d8db029cc05e36fafe62ee8ab32182141ebb12187497c40a752c19fd101384ae726a5f6531084f8a4266086b1702158e3ee9ad300dc0bb76fb59a907b5ea06b2e09cbda1d72207cae05c51738ca40b2946eed4cb487464ebf22cb96affa8957b4b31705a65f0c4bfa8aedb1c43ff9e26ddffb608327b75c8f1c3123d676de2880f12719a81fc0c5b1074a0665d5acf1d2b128992b137643fe960a58955d8d8281b838170961b043f68beab9cdbb64f6fd771ae1ada62806ed917b78a81a07607cc1d42c784aad82ba0338a90b9a646c61f6f505bb219d96e9fe3e6ab7c3133c0ef77cae804ca7e7707a04df4bc5c4a725e8c6f69e2bda63061588edb50b54f05b055f7e0caeec69b919577a6e957b18176848974b440c9182873ac8a5803553646530ad1b402bcc975d86bd5b9e92e09069548f584d08cbc5ab1bea6ab692bb70b3457ad681771fbc284f5fd8e0fca61845623ea10c6b7950184e8109de2bfdc3416a6377e2b054e7c2fbcbcf5b5aeb849168a6af361870c6540fa0d860b3c3bb3e725fbb6df2ab576ca83093b859b01bd7ab492a472828d80f18a1be5186344e7fca5f6667942dc5fadfcad548c651a69dfc933286f931930f372792f00fc0357104829999cffce1867cdd3e2ee3a524dcd95444a5c338128b00427594388ea041cb513b7d08da34ca79d36f95fb2982e6c8d0dcfe72f428d3f493ac9338fca7e590025a0683dc9d1e0a83f47a55161e9966a654ed9073bee1d56a2a72afb6503f61142e203acea4f06bd17ff28222c2205e1af0b28c04d6f7ad60778848f917786ddc01628c7f2ca0f67896f0f05faceac42a28293fb031046cc7f27626c02341eb7056ad9d08a1012448987aa8422cbd94a4ba5fc6406cb5c3cc1060336e74b0388d70db1e375a0587ce42c062e6a21345b90b228dd41c038ae3254ba2c7175d33eb51a906afa7bc55029ae5907d627fff35c9ef529a137b4bbb5216726d076bb5451c65d41a0309d7be4b8ee4c16ca5e6064b9850e2d44217f8e288e92d8e65af6a20db9afea5e7a4f2759593fdb0b2dbba52854dc7a411e02aed504481c7170322823d9adf8a88e9f137d71988e6600ad9ea7054d613ae3f970ce1bfeacd98f4a8763a8345acf9dd2bad273ada3e7c046eed852b2514cce313ae94afc95bb107b1c42836c38a4725de8cad2bf96e44e0b43628827aad1ee59a7bac01b6f351918ca28ddcbf94b15d05b471a29a156e16bd671a6395860469ac94a0259e51c7500fd529fd15aa01fc18cb7c05bddc8aee091683b50219ada20ec6099893f3e41048d7f2284d49f494f92b02088722dafd397ff67e2a3b65d3c95a9583ec86470dde66a288437d9236572a080a5088e177e3cb1d03e69601488da06c62ef61655796cabd9fd1dea9ad27834c4b38f187a7026c190ee3f4c244bc3e51d0939b52bf1e0795d4a447488db34a924f0d4cb02ef12de3c323ced9e117dda29eee7fbfd5b33fdd4b017846ce3ff64ecdf8649273801d110d89e2d4fb4e3025789d9b8f6ef20604151556650b59228e928440b05d01950493bd42d62224139d8e0b3ca18ae837871374936fff0f7ea41773408ba1f194cefa79ab293d95e5d8707ab4f5d4b975eb387615e04baf0a01fa15f854a4d09b190b9dd2a88f0f0860c19b51fcc9ddd249c9bf6de6a3a215998b603633ad13bdce04cefeb165c8b8b9efc7a0248b4942704be8f739f3af5c6e11a4c3592a73dc9c025246b91faf2788930042b1b0abb92fde66721f2d773d2b3e8961afb393053e8009f60c69cbb519d1afc7a34c3839ef581dcffaa0467f17b8a959ad6d48374bf65c7b597206007ed156b2e0869577924f1c73ba738d1deb0cb89f899b2d901a1bf01974e840a176bc5e8c3a161d024b06822ad2300278e7539b3c588aba1e7bb8493d1d3af567d49990171f87c9e6920ba321304bb58c096ce7441de4c8ae80063fc8a874867eba75e85482d8debcd00491e408c94de53948a03973f5bd32601438b0504f4b844f337a567b563fa5952bf532fa9ed5911ab3ff033a2eacb6b1ef55597fa5a3d1cc570c9bfe8a4a795c87d87767db86258cd547b6c8272bc1c7a65b656e046d670b3787d6eee2729404141f64a07f394c9e0e20a92d1307510608209df1c90a1634d53fc8635f2f2f88876c6f9663509b3706e00041c249c5d1e74dbc89283d3cd7a1adb6b7ff09b082000e18e44d7d372bbda81fffa7a3e2f682f79fae5947a6aab4a23ca840e9cb5c69f74caeaa309fa8042c5d78ba433d482c449b539e22d7e525a1e070869adfcbe9871599fdb23a5e30073f8ff8ea1149568ad774dd699aebf11948d6a3f1be867c3d05ea22e53d453936109ebd99daf20dfd6cc7a54a1c228929dfc9a250c3077a7ff843af41e87f4c51a93ac8b4e165d3b100cbb71beefa55c7eb2bbe3048a6191f00da362251181ad188b4ed1d55e81aa97318546618eacf32b0c860abb296eb13606d21249d9023667d98cd5888ac17a20dda107935be2caa5c5dfcc718e67d3ea8a71f18ca4761089edf75e7d8d028ba5bb9a77cc2c7b8d36c4a8837837a60668210bd14162d17ba78a4bbbce32b7c7057e45ec1bc20461cf4bbfa7d60b74aa03b46bbd2c9db5f350683194228c9360baff5629a4243167f392b2a3d857ce77183f2cbb3ff8cfa5eeb7ef603c2f7530f413697ea20515c04abdeca0802a326e2e3b74f6271a1506dd6499aa05ca31df8eea79a84b2d618e0b3ce10561f355384ffa0d844453ce772659b77a1c6848ac4220160c453d12d9560644f4dedbe2140a39a8a2f684e698403d12d7011d5320523544593e5402c002baabdb6e9f7c9728131557b1bc19ea1fc561c4fb80b4364de96a2f6d7ed0f0e2aeed7b66473aa74881aba9996d01a16559bbb273ff2f7ce1f2e27b5cefa489e3e262b880f8fc476cccc9d63287c900a691f385abca5595e41ff4cfa8d1ea6ccb64a676dc9aac5f1a1c3d3a4201e92c79466ec45c50b4ebf1958fe35e5e6196a748db3506503d10ba133c177445059ec8303ca45bc621739c3822360a354a102017dc54a1d2c3fb59f493f6270925d48ee0226cb9de91bf0ac76d33632c41e0b956e990016384c33f8679f6240e606795e8e10f28f0303ef482b64929d92a8e749698e034209f45643230a211cdf4f8146dacd3271b5ddca438988e9d880d606e13aeada1de9cef47918fc01fd935a1c8a451af670962d4f26a8287de4d025b910a46a97d93b2a6e4c77fd56aeea06e6a5b2aef9768544042a89afb6b307bc5982b92fe10f17ca1591cac21754cd7e9829843807491d21bd4d8e1f3300d14c66b9462407f3e605a6d00d11e51d0f868a664e92587a88fea5587f2d80a86919a7de7ed1ed54df8005868a2475e61bd4d5ad4ecac46955476bb42af50a1c3cd20a0e42e9adade2702a2df14443200c051a4f1c7c22d18755a7411487217270c8851da839d96b86df925279a1d429a15f25be2055a8cb6904fd7fc36450c327bcae02f71ae08d9ddba4d7b357c76c411558534462031758d7f9c963bdc28aaae22a28a1834895c20ce38b0cc10c654f398b9cc13908d110b3c3c54ac33137c619446ae35f7c50fdf4d81820947b750f01828088c65cc50fbdcba217dc5667d6ca8a87fab85e19b04a58ca0b6fdc498dce7eb3e69b80266e099ca319f6f476e33763344d1776d3290efd2e40094e9e49232aadd917ba749c5c1c65bb7748c9175b5829fe8420aa4dcc2e716178007a9f7aec6dbdb8e4872ee5f340975fe3b69194cbf8f87a80eba858e1b343dd37d57c7d94b30005e0ee6747a93b84b11af60dd39f4878b85e2d391437f63fe57d207e21c2c5f352622b614ad8f9d39b4a3860c077f748a715f98666f406f13f4142248604b71bb4123f79dce39f38220b41541da036ecafa39df7006f077e100f82f48f0aaa26422de2fd0923164f1cfceedaff7321b0068b76d63f467d74b4dd3b58dcd5cae777e0fc274ff0bf256218f72947010ff3356851df66b2fdacfd6cc4eb095c9fc143fbdab05d77a23f847aa98fc37eeb9bcf815d8b67b56d742143c4ab8656d20e493d92ee49a7773368b9e7f6eed6717c40caa40d17133839f4ee719b91d76fceea69cfdbdfa9015bcbad0bf5e426e4f7339d26419cc75132be9954cbad310bdeca01641e57d56a153b3ed6801b10926c09e58263e04500b6d757c59af136eb9887258211ffe0b4954738746d0a1e960361dd4ada4a27e4407b90d44620a17a0442c0ef0f528b4cd68a169e172bd1ed5ff03f74715f17d53a72eb9d1e62ef4e86cd9aa7de94a785fd34d8ec3c1678f2e4c00d8ce649c9dbc45f8fe711c97f517dc0433e4a57e239f0ed7f614a525b6cc0855d2c09313817c23c29d983c579ee551bd59ace3c0865d44329a8a1aa85bd743e523eeb12c993a6992a6dd7658c1822dbd23aa5bd2e3c9419466264f7728c71830442db7a8f10e3fd4dfdc74b8f8de1a61ec6726f46f83448cb4ae9cccd0235ef5d0545e9123c7391c1d9f95ab19097bbc69314cceccec4d89e59fdf80cb58ab7586a8d6ce85960ab3497d1f32fa7b43c89d96c16bdb77f8af5c665f72dcdb0a0aeebc59d98d98da9807583cd83efd8c348473ba4e51e348e94e0ce86ff6aeca28a1284c3a3c4da9dc1d532e0111a6debe399dd834ca87ef669d02ae843d3675c380a74f4fc72ae7d590444a159a76469ac807e63f58713bfad6142d583579f92975762039b3c8391ffb1d7f56980baaabe7d626e42b0249d233a9d1e03b9a1f2a89f7874898f1c7d47a6e453e37444c5f9e5b8a15c36627a3c2121b5f2e3c0d9786a44bfab89f08264f4a0829c9e6da3181f075593afc67e857b89d78730a6617017d0db0e038bc96bd092bd56a57aceb568074a71259c5903217968970dc0da8019fccadf10151f8359be10402db1986a00c77693ca9b4c236ea08dabb9099def80b8bf6ab604e9c9ad77bfd46981d4ee1beb36b19c6bc607ec1ee31aa5327bb372a27e91dd399671f0c0bae331790179649229759a004a6576cf20ec8b1e3663dd01fbf59a8b475e5862fe18b224ce140365bdde62791981f73834c31d7e9c6885d02dfec358a5a577440192e66730955479460cd2b19b32df8b759ee646c5bc09954b5f5a4343127cc4f90772f670777cd47b4aa913b480455aac869559cd399da1b184258d2256f458c46aa34e64636ad24881d4305a270e2e162bfca76cd479999be9e1ad62de640d6788ed28c77b9b4d2bba6503cae9f7d1206d247eddda13df250f982d6559c8a1d6ecebfdadc848229754d2531b416ea61b6ef87cb035837f2e96cc00223d8a3528b184d7354b8a9df944248f2f821c5a6c99986063adcdd2f5aa577a86397cf8eaafcc8d841be53e2fee56eb73cec0fc2038243a42fa1cb922fb50d2eb00d519f41e1fcc964d4e56073dd528749e069c40a562007d9b6f8e3db04f2beaa90ac60794456ea4f5ac9b1f36c8521a9b186337bda594b160655a542f2edadd150053b6eaa75db4f60965752ccdd2e900122d71bc7802e9bee1e4701a88d970ba08e12819fe29fd036720e6d6c9703d7db715b28b6f6e84537e8887ca3c6cb19e7959794ee6b647180b5889b5cc2e499e670c15674402a72c4df2ed10742466d4c29116df236dfbbd6e2d1135342858f8bb767e35e7da85303b5363209564b2b9f1ad2561cd50a094c926892c69fa471fb2316767591f32dd454103e891001a8f61661432e5b93aad5a2eadf296e1402ee18bba004644979f5c97acf2612db24230013612f6151ab6d0ffa8d0a5e044b30cb531d3d44594a04c4504567e2dd8c871da4a12967d3cf0e6d070d49793a414ed3759f531a34c80bf646d4c126e4057a7cdbef53830e6772a5948d0874388d11786d20f3ea1bf4e12a949087fb0d7d5bec27939b9143a0d35ce179f5992d0dfbc01cf96a6354f869e3254fe5f0867fc71c6ccdd4af6f1e9ab83453283f6dfa19559650d998f56a173b99b455624a58da5b6fca8be9ec98041e702a7e4959a5a9917a4e7013975894ce3d048f475d101d3ec1015a5d44755b5fd53674c3890aafe93bc64e93902c7d055c182f37b10153c6ff8f08ade22df21657052c5623856cfc7ace43494fcd88654d11abbc1d885f40d0aa1e7720f1b94062e4a6fecbd4ab477e4e8c09265fbd2e0762039ba3970f9afe27a458b1b09a61c0f322b078a622d96580184c0e3e5f971c4e81c099475ae5d945794494c006f002659bddbcc276308c8a40bc9934abaec69880427cb8a89eed09cc04929aa428684f1cf725ee2d99a796e8fc8450899ce43cc274d8e579f9ce238b6fe10bf26428142685442e109f1a0de4c84f57c9072d3f42dd9844c62002173ba1662995892b702bc38ddf190432c9c0f8c3d980a2403105d93fd102e66784d0b5492be2d6ae95c857ad69b54bf7fc5594f206452fd645c8ac3eb5406872235416ed256a4f17aa1a3324c6dc2ef3f19a7f60f6f8d7388003a40d9768da606c1356ce0ff1aa09930a2b4fccc952104de97f15ed3ffe00b92f94168e5d10846d6ce1ac10cf94feee3072b04332328929d87286c4edda3a55c7fb4a5ac145c782108f0806299668a022de82a9478688533ba4d109a5ce7508606e523d5b0d54043315c762dc8a3111d9a185405a42ff7bd2e88133d06089c497922caf759fe092247efbb867a377daa6fa3a3e168d19d65d428c5aa5e0aed56ac19ab4433aad2d59474b8d9c06b150b492335e34fb4131d93f40a0ba14c2ce3927c4dd9de16ad89d0f8a41b22fd604e32e6d804251889153c5269935c50bcdb23a6a0917306eeafd28ac40b909b0b40c391cd3905d46e65a64d5c7b0723c0384600f23cef147eb0d9d7d78afc5e2cdfbfcdce7c20c26f7329c05dac68bff3bf019ef54b2b3c425360bb0ce20590a7b33af1d7e00bb6917462cdf27536bef60b7c7d69cdb1ad96336b18523b5c365be44f75fe12be42555e54ce533b00e7ab6c71c476a7534ec6b952f311221cc3b14bcb0720c7bae14b88a8bfc2a1e03bc8940f3d04b8ac3587c32b8dd7262f5a01cf59eaa856565a897f97ec56a8e2ae216c95bfd73383b08cb07faeb778168575eb495208526c711205c027e74ab6bbc68090c1cd709843585d64e34867e2e7e0d9383da2db2b457eebdfdb669bd040393513ccaa3028b7bce678737597e4d37c41bed65c71fe3b848dbf566e11d8508a68eb9302ee56f7ea7d8e0063e6119f59212115b675e6e58ec38d32682d6694b932d2ea20af41956e3552545ab167836dac6c4417ac28561bb045a7ecfa6e6f90c185c9ec38af7e98ce0f7bc4d90b696491ff8371a70d5d0c1718740c87f420b9ba294b1f637c0fefb2ead455e2bc83b3246ee201725d7d13bb0ead5726e049e6c6cb9d327df294b001f360792d14538098ffb9bf11c778e4f369a7fb81cd58fffaa417ea59af7c265298fff532d765eae530d5fd22720566085ac7a19429656ff16415c3b8295f5e0d1e82079fd9615504ce117e13fb192c655f9ef9499ece9b1908e085cc0b2819ad0ad2b401040c07eea633bd46e6bac0e1cc8d3b6d01d1888e9430a56ace6387e32a1a34dd273120a1e50bd51911819b620b8304f4659f46a6151d555c55f6a8698e9a8c13e0eb0cf8e3905e5fa858b72944bc76c73c7b19418220b8bc3ac0c187892347a9be4ba7e1d8ab10e6aeef9e4575805be98e0fc5976796a914599286de881490973554e2356e861d948eff01d37dbdda82e41b4cbf78d5fce2c4b1b07d9711350a7d818557e0103e72ca7bd915d6ec4538c46f0b0871f665045b09827070c45532c73ce7792f6e3bcd87c23cc3032934e3150c8072ab6838f0e6322cc8768ef4fe7afe7b90a1a9c6cfb2be7806b9611bfa080f9bf9251b364708e91f69db7ff04868b24e70f5a84cfcd268f9b40349534ad5ea65ebc0b19f264314ef6a421a00d63847a2b4351522db2864c3b17ab4f121985f4ef885c6b09666b4ce4db9e488454d9f258cabf22457669ab8e9342b6e8a7d3446ad8e34c970a3ab090397ba21a3c53f5d6f39ab75cf421c28f104556a4215b4a295ae290ad1446bcf88d04fbade997cb08835cf4cf74182ac77b99f0d2465046287a4a4f558731b3897237e569c5614203e4ab6250eb9112829466c96822ef9f6df87e1dbf7d8be60f693898864b0933902e024e961e83a257692733db0a318564e3e6a886f0a7503f4f0db4cbb84f782f758e1b12821e31823b5e0e940b2e60070387d39226034060ada04226afd80e8bf447f3c20e45ca2dfe7e38720b87885bef84ce41e3c81e12f4119949683ced26f953bf01dda6c31b98634ee64767b070e82a0ac7773fb8fdf151de38c0e1680116d0015a8c7cec602e0d4222802805c0990aa1fed451bfdf2c09e0855345449f92ff55a5371299e2bd5462d760c963909ef21af4055f53782c17534697ee24f53599e1aade97ddf5711bc7f9cdea8ebea421910421750a0d204d2ec42679ac4b080421fc981ce34687a47525bc8d3c7b66e009463c74e4505e6d3dfa0d5257259e03612a70192d35a00338c2b0a49e5d220c0e97dbafe85e48a84a392eb74ba1cd2cdf4493997fd2b4783465e71191aff802c5a08192db268d55e0d48478ebd7385868a66f580928298739144d83572309b47728d462f267d89e85a2be7eb83aabd2de858a1eb23c46d41b70dbb8a8503bd092c821cea39cbea7a1260542fe2f517aa3bee87a3e2275ac86cc47dd0f69210bf3c6017fcacc9ccff99149229189f7c0331f64d73d8bf7e9040be194632717b7acb08272ff7163e9a819040600ec0d9569b99ec9ee18b97dda38ebacd4b7a8aec51f018bd282a6d9912cbe9bd90e26782fcc3c4b382e45334f9dfad10ffdfa2904a427d4ea63e6d5c4dda978f0ae23c3df94f3d198a7e391084ea58c698e82f1cb47553a00baf9c528e370c2e8d905fe97c6f0b42454f4c0ff0a6685017b8329a5357406615bc13db2ad42652ed0827c118bda89cfec1205f817ce086bdf741282a01e3b96f140bac98107338e4431bc847c8cadee0f4d72afa4da560dfc2bc3526a703bd21ae1f8821465968998cdc3581aca639f1e3629313bdf5ce4c78ee337cbeb6e9563989c0e921b5457130fee2c3a98d8a099befecc5b1c6298468214a2ac25e3070a12a61a478a5c198b29d5ffeaa90cd58578b715351fb6eb24e95730e0aa710eca74b2dab7773f67b03a82d2ff9d9791cc40bf77f6c577f938c754397445d26ef55c44429195606ef4084840876a0ab1be41472f01e4db8358ebe9a2b40e77fa55b27aeece0d4ebaad7317fb8a6a82b8a17cd3551a7c336f488139a44148fbe46cf02ad7126b9c5d8987d2e05105a500ad7b5607150a097303fb68fcf499f27b34200865e98d7abc8074aefc1d3e7c3d9734cdb941345a89b4e44b9cb832cfc38e9d4b640d0ca214f272323380aa12fd4ed22bee466f40ddef50fdab3456b54faea9cd7f87b7435e0c9988c37aa29446e5e6b22c48bcc1398ff3bec52b73143fae89762b5e352285ca5680424441ce0d87d069ac20a46b29477fdfde209ba9a906f5afd35c74816a644fc7402c038008e8a8b4afb4752c57e9f51e65d60f54f597f4ece78296544706e23002d2077a1b3712719a0511b6bbbc83898b3f006cbb2fd4909cd4f99301dca9b12ef4c6a17a4163e6b44d494f35c7bd25a87a2b350820b3f053b30abe63d6a0514aafc58828c37c788fc64c8f98e3e0683a1a96665f74cff21db7b44fcfd77e8a02122cf2bf305215fbf68714ad636109b17cd866d6a00185287a013955dcc94e9696bfbd49939b31c769d70f8f3e31ceacbb0ae1366da69585bb0ebba2d1b2c705a5c570c314a69de95de95f2181fdaaf58fd0980a6be71a5f79b563557a52e2afb5b728a8b43de07d7b97e9f349deaff5676eb9f079508ad4b94f9041267c854820a557f23ec30eb85a116246847e5d9c3e951ba80bb9be316d94720180433b0bf3809d160b2c748a6d0a2483e33084b135dd736d7faf62096944b92a0dbaa5199f83836eba34cecd0f57af2044fffadbbcf6111f4ec84cc098fe552e9679cb36cba9199383a1b46092b33da341cf39bf86cde768419cbf3ef4134140488f5f2c2381bcafaeb3f841295fdc8f159a075fd37c3137947fb23cd841af80addd07dc9e5a73a903947c59a64bb06e8f2b7ac20f91f2544bd117febd24bf99dedc8d13fc9f63d5e9a2cfbdfbf8a9ae789dc5f121c0cc52451f7acbac569d8df1bcc72d85393641abf90abc190924ce1d4be7e68e43a847763c3eb958b86999139fdead0edc2c05a6d53763b0ab521e17b95b1ba34b959161db630cba5935cc324e38331f955d59c98d76f9add1d0c4589adabbe86670419f4a118d532cccc0a81341c7d9627525250e9fc54ff8f3ef02a678592b220e28fe071074718e1b35e003291612a127a7c78060e0964cee5bff5ba2360b6da59b4bfd64e588f05d3fbdb467db64159d7eb27a621a124ae179a47856417110f1821d9c5cc3395866f91342033483915fc0b2379ae12756ed64a782c01fd0c46e2eee292901ab48d628773586a8a2666aefa0d2ecf22674d54454a55f9780a5b2c15adf2d8e22e097e2ba332e2eb337fd27e5f60e6e4550cd8b21ecef1690f9996605737136bb07340b3b136e309d1547cec1d01076888593ca458717dd42404193322e0dc10d575718305b6fe3a94e537d32b98edc2261c9aec15040303aac8ca915c3010c29236fa23c22b7950ffee24cb3d44a586cbf5fe30359b80b7cd2fb71cc765160bff0ca7c470d1dd48af96e9005d05a2f8e09856209630802a40fae738d4802a318803f406a6c58825adc9ab3fb6d69a484288484288447677ef26084d086a09a3d5fab3b50f7616b7a068ff1bbbf8f2e7b4afdfdacf47d70b2f053af0edd88148d0a2f8f6b3387e0f7ee2088adf43c32de9ab8baf8930c36af3db1747205668f3beb1ac3014c50f57e0f7820b4590f3f2fc7c3aeebd3872af1a3b10576d5ff8f643d0bb07ddd15e1a4208de51f57accaf2b8febebd5f38bf1bd94f7729cf6f9701d10eb8a2f3f71fcf1befbae7bf143f0b56a94f4a5f55fd7af76075fbeea5d63f8128803b1be7105937b5fc5ef3af1bb11888b23184a314b8f7e3ee2ab5e7edfeb31fc3bae7607e2f7c5518e30c2d73e9e37760fc3dbe07722e57713ff83a1fffe2b0cc1dd69f0eee55f2016cf5cde1c374e0900dd2494f8f881259350e2030b9f2dca32f2acb1cbe02c9555856198ff47bf2a1c59da5afd2ad62839e8d9d8acf06ec477b56cee87f986e1df78f9ed17feddfd049aaf0087a720887f7f5f8f5d73adbf8dc3fa1fd57fcfdadfabb44a7cd6d7f0d37af5e1abc62e83ab7e7e24e8b71b87f538acffbe6f5c95370e6b8b20f3b3f2b33e6fd6f7df8f5d86ed2ab1df5f5df1bffd233e6bffdca8c22bea9bf06685f7f74357cbc6b3b1096d42556813aa42d5ab7ea33c2cee08e2abf48aaec417370b2bfac307c16731de0904711cf07fecab1edcf6556fb7ddf759f786e178c72e03e72feb7146497558bb6f3c0c9f45f83d5565f377ec2d116ebabfa3ea459b5f85aabfaffafbddfefe66fc616d10fc705cbdcd288a23e5abb1b754ff651cd683cffa6f5cfd1dc357b1c6f0ef6acb07c79f70eb57bda812c74e83679cf07feeeb0f370b2b1ac7e7befef0f50e37f83774f54292f739ebb7e2dbfe8228507ba1ddfd5ef1ea7bb7e781deb75add7c2cd5dbb456faefebf73e6bd6f756bcaf63809eb87dc09dedebb7ef7d4fd5a3fe50f5e057bd3d2ffc4b82f776e3806f5fff1d71c0cf7f5fc401b74ffe7c5fdb17bfa78a5af53d34dc7affa81edc3f2cadf258ac9bcfa6b5fa562b6fe56530bfb7f232e8c5e8b8f777ecae8cba50fdfd4b445dacfeeef07318863fbf10f4fd7064514583aad00867e9f1eba1ac31dc7a355e22fa526ddd2171bd3bd035f2eebddebd7aec20f87a045f6b6fffdcebbd07be06ba46def5bc117c3df61744811ed035f2367865fc7bf9ed3c76af0227153cbd20caa7aef0838ccf97760593cf157e18baada98bf2f779ec32780eadbd7a7719dcee7e5ffca72ffd77cc3fdf4fabf58756bfd62fbf18a0a62fbdc56fec41f47e4085db6f2de1f6599f5f74dcfe5665f01995ffb0de92d07abbfa9bb7bbdb7c31ec66fd80ff191c7111aedf5372c4edb75ef5367cfbf78ba11f8c91ff7bf0aff8e2c609b74fdedf966fff7eaf1a7b1e61f5e2573db2a8a2c1bf7f47fbaad7f323e1bedd38e25b1cf1f3eb0fbf6f38e2f691f4953fef0fecf93511265f7d0fd563d7afda967f6f63acfedb3fab17f78ff7da8e1ddc332c5fedeb6de9da332a6ffd7dbdfbcdb6367b46e5acbfacefa1acb1d3e0167cfd598fe0383f9fea6910f05c2d09fdb3f4d56754ceda3d06dcbef7bde8de8e94cb2f46e59604705bfad2ffedbcfbfd1995ebeb43bfb7d6d2a0ad1593bf7b2536b84fc7bfd763277efd5e749fbbc7556f298fea559f5563d7dc866fb706c1efa94f5ff6c151fc3b7adfaff8aa5ad95f315aaaa36758defde4dffee93e7f97fb0c2b49e0f8f73d54bffcf42cc92c8914cfafef088e5d06075f521e16af7a4979563c087ef82c464975c2dd37f0efaf187baa38ae6072d58363ef5efbf68fa6c07ccd7a705c3d6bf4590571fdf2c10fc5b1cbe07a7f7f47f15563188e948b63eff637eab1e74f4110bf2fc407c7eff5d86570fde2e8f36d495ffac1bf639ffc7ed8f519361c3b0d1f705bfeed4e83e79fbccbbb87766305ba095d0697303ccacfde395f9e40069f315b7cda500d443ec1e42b903f8370b9b770f24c3f18b4d3e0dba5f5d6296bad967ee5747717f051f2203a672cc3907c441286bbe66763dc455ff6e7092c275bd8f1b356ca167223e1a2a4508a96b32432cb4910249720c8b2cc796db494db385cbdfbd2f2fa5d0a6c8f378d046dcd9a356a38a65f0c6dcd9a35546c2f5ddc3ee783f9fdbc79da0b3cced06d1aae2f04fa1bddb8b16ffcd2a7f8723b267c3977e4cb55de9174fe1cedf782fb9c97cec8755dc76d35ba9c83b62f7fa7eed03a7639e78e939472d1621b0b8e8796d182ca2363abf555250bbacb59fd9e7af774b9f80b0770b92d7dbdd5fefea66ddba66d1bcb929f5eefc341c37f7b7e2f3ff75ef63c2f6f6ed3f09d6876248b83ff9c974e67bb9d28e8d371f23cabfc96e8fe28b0bcbe66ddaff6eb0b2937f7dd66514573f4f3e19e7eee3a4a27e7f6b6f4654e4d820723a51a5aca63a98efd6f89ee9a5b14589edf3e8bbaf8151284fb76deefc5646145ffdcf47b28f7daf7eef3de7cbaaff525cf2304f1c9bbcded0d8f777c4a44fd2c433141dcda9ae98701edf1a681938109c33f6178cb3c98f6320bb381ffc666316061dabe2114c2f053580fd5f8a3c017c2d829aff4c30ae02d25027abd6ffba431208104993233de7deebaeefb0a3e650fa5f6b1b5f4f37cba6d3a827baaa1af4e8f42fa456bf54b51ebaddf8e77f70dbffef9baebeaae007d7533e8abb358d217deddb780be3a13e8ab03017d752325a2af8ebefde92441a0dffd04435d709b124dfbdbe38b2fbef8d679eb4fbaa94cb6e85e5342734f7fdb1b7dd91febf782e6704481bd63dfbaaf230aa61adebd36f619ff8df3cad8e513ef7ea6e9deeed9445fdde73d99e8ab7bbc8366e2dd535987657f13a80bcbbb3f81bae8befb6983bae826ef7e1ee97e2a5117db77f4bb6d870fdef5f902efa414ef3a25a36e2ee19d13decd19efa82cc1bb97f408debd943c54868377cfedd07d8777769c544665544665f8ebb669ad79d775ddcb9c6effd09976820412643e9abddece4be747b0069c3e9d8177ff7a5d1b2e7ed78a8fdb2e227c56c1affcfdbdefae4fbad85efe2679389e6fcfa43c1be9115487fe4ca2ef72d1a706680ee813a73f3f178d55978bc6fac8b107b87d7e41295b602ea90b7cf796edd326696c098d715be5e19ee3f2b9afa3312967429cca169d98ecd2224763f2e990e499495587fe4657a03d38e56652127d05d1f3fb4cea3297372de39b6dae7416804669544c215315a80a54055a6ba5447bbb9a12695a7433244b29a594926ea14e5ba4a6a4a2e8b5176b58db38b9715d965df63ee97d6028a79453ca29e99492ca39a594524a29a5a4524a2a5f6a4a2a8a0a13952d4d5498a8cce691fc3b8de494724a39259dd20439a59c524e49a7dca12ff994652f95b4566befc517634ddb366ee3b8aecbd9cb9ef77d2018ce30f4a616456faac66e592d1b1b4fde5039e594724a39259d524e2af994f20f3095a59c73778fb7204b3ae79c93e6c8f4b3941e0a6054be4d0fe6c3985864d1d736e79c617269373e67bccae653fa7acaea2841114611466493ad40954d2f5858d19f34f22ea75a50792c2075ea7b8915517fe45d364d5540b628a2eff0f95d365dc93395935650ca1693c6f8dd1b7d05a1ab7c3089ae4f6bf06cb0fa722644c7830ed30b6a4cd2410f014062638b68695e7743c77badb54a49b7ee697e4364c76d5ad6c2c46cb5b68ed6460e425db4a6a6f6a03729ba84ce62ec0fcd71a9525aa372458b5cce96945816f40a4c98a009c344096a46632e674c8eb8385cce6e8881672e674d94d8b9026695152d8b87a13701f0a7acaa2bae08dfeece02bdb103b1c0cdd39bfef4a6c3af25b272063fbf38764f0c33d087238ef8de872a95b8f37bef79de6b7995f3fed12fee9fcf1b8158fa0bbf300cbd9cbd70d3dadbb4d76d5c521e57d56185acdb5daa07c7cf557956882f2b4b73bd5a6d2f877a354afa02552aad0af9eac151f440d5287a2c2f0cdf0b41a0fb61f85ed881581e0b2b7ae31d88d5815812d0009716a69241093c7f969483d57796d6368783dba64b0045a0affba0bdf6da6befeae600e500e5782d4fc5aab67eafff1bb1ea867fbf18e2e7ffde8e3d875bd08216b4a005c59df7dfb7e0afc6feb13e7f05df3e5e9560ff6e9cf0efe7d7230ef87d7771f0fbfe1cfc247d892fee5e02d79f3f90b562e5fda302cae1a0de40399ca502552ef0c6a6d56ae9073f832d0d82593fd8d260064be0a0757356df73b87d6b800538805b17768b228863f8a0b6f4da166be7ac764e0e504e093ce739f8fc72c02f071c5c3dcbb51a5dfcb656cf1ac3115cad565cd56bbf6a3d38b2be35fab05625ac541b28a704a01ca09ca0a3a0a5123e70c208a69c0f9c3082073edf86b6b6b7e964d771dfb9bebbf9aef51dab5bc1ad68b558fb67abefb2e93aeea6c571375fffa6d5da3dc866ec9752d70dfe5e6c370070b19e039c9bd58b7935decf3467ebe5115cc158b138584170e3843b84d5e707b5d65da7573c0cee5b9e57bd15db87fbd673ad5ced082c11c40a7eadaefb9100b65e1c71ea772faa541ba7ee105aafda1d88ab3ccfd3568f5ec509c0c360f12b562bdb7d6dfd2a00db87c5af7816ad5fd1a5c08a5f4fe0f561b47607e2f9bbdd81b8f841fc136172ac17c76e9fdb2caae8fa3906ebebfe617db87f6cbebe6a6401b12a005c6fbf72b02dce9e51f9cde437df436ff2e77c13e69a6bde37dff762fb5ac1bc755c8c8e774f5ddf57bcf5a26c80373da0df6abda52e6ebef51b75b1e25bef511736df7a2d41607dcbdbadf1fbbeef9aef0ec4bfcf34e78d931fc747fcf061881f06e50f1f46fe301c65b7f563f1375f4790c5d79d378ecf09e61acefabab56c91bf7abff27caa371b609fb6bebe56aedd29ef1ea7adef9aafde8ea2f460f5756cedcee2ab5f7dbe192d7dadde66f4462d5bacde5afbf961d82d658b2d658b20fe7d0f03dcdf0ee275ec5baf2fbe1d7bfd1bd5cb2feca137e3eac571f5a16afbd87c7d9bd5d795dd383eacaf9f829ac357cfda5a7f7d18ba6e167dade6f6f9f4d4bc7933887b8e77b91b338ceef5d7aff5f21345b1b57dbad7dfe9ef0bb7ed81df5339eeb72c7e0fdaf03be8e0c10e7aaaf6b976fb677b8edb9e0b218f1d08e77b1c9fd58b0f63256e295be80ffa5e7c18df8be2a757f4ebfe1be71a2e3f954a7cabeab64f16bfef53f06d2d5b88dbcbfcd90fe2dbf63e1cf3b746f1ed086616e75e841b277c18aa2d650bd5af3e88871bc727fcef6184ff7d10b7631ebf311c57a36aecd6ab9ffefc1f8ede3edfdbbd53106e2d5be4b75bcb16df0771f9851b06f8795be6dde507f16d94db364e200dd8aa0140472eabb1cfe02b517fade283bb7b1c0c779fc1ebeee0abbaeec3f0c577d157f8e0b8fac2d761f73fe0833b0cb7b71a25578d1dc8f32ea5f66bfd5cbfc555dafafa96e6afd4e6abfe9bafbbb35e7e31ea6e859fed7841f06dea672f06f8d67bfbe1d83d1e8aa1e86d9cd5ff88effd6a7b2f7a35f4be1bbba87ff5d5dbe1df70ac33c2af1b67f538abf71e7cb1db38ab2d82e438dfff74bffaaffbd5777b7bcf1bfb8c2a3ef6ecab368b2adaf3f68ffed5feb1f93a76bb813cae776803dad4fcf6c1dd6fb665d9fab9d5aaadb08662f51efcb055df725fabb8bbada1a5767334e8fab68ee1c83d58576fa98bd6af569f5763f7f86af5a24befeeb144fbe2768de0abc6fcabd76fbf35aafea7bef8aa5d5ffc2a7a9cebbea782e14b1a862fbff07b68088edde333b8dd7d5b8160ebedd8598f9f869d0da75baf02c5b72fbe7d6e7b6f33fe88abf0e57f0f8eaa6f8d5a8f94abc6ceda5a178ebd13df1357fffdeabd51f576045f1cfb0c1efe6a04df3ee8fd37fe842188e1d8813c3d761abc0bc3b72090577b0923e833b8dcaa9d3508510397ba81bc5983103508c1e7d31bba52f2c60ec4bdefc00e9459fc6a201e03a4fa8e5e07560f88d53d2759daf7826365f1c32c8ef8b31eaff8f58b11bef83a5bb66266d36c52329bb44d52f09b4d7a06215b744468b36936cd2e92478618edfb24c3699496415f40740886520ca12d97b326494ce94e890a04a9c9d316de7fe74917a3f2755fc0eb4fac6d7c659353f97649366d139685770e090d01007c6e4e49b6a0ff91d1b2c5ad31a0754a0a5aa4d1e8ca6eccde7b639bdf9f1de0f527b67bca1694df9fb38b612cd77e2104717abf7ade3671a0baeadc23524bdd5f5acb1653f4fceda340fdfb5a52cd144ff9aaf3eb4f10578fbebc33d0937295566ce7aca0b66db6955e6be7788dbae4c944cfaf5fbd1be8f9f65fca16b2d65a3f2a3818a830fa93cf40f70934aa8c5ed15c065a53f3a4372922dd2901a6077dc24390a51e49b0507f784c4fb963d2b1b6073d9f4a296598cb8c37fc55a2e777307d0800a5944a6ac7b4e60f1987ae2b62861f929e4f69f63c8dd3dd49b035a9b56a5cce9a44995176bca7263e93d0a1c5873330f9220c5a8ae1413670e971068b902f5d78c0ba554ae24a950746105676f8a194a4a808ea4286e1f3ed150982e52578f19ffaf4bb6b465dd467e17fd5c763bf1be8c5efdba5baad127d2d51d235a916a946a80b914f8bc3b3383c1dde3d6be4756f8b4df266bc7b4c9cbe17ab3c4148a0bc3885e1c282922f44f0ee1d0173844b8fd81a23c2c0ba0786776fa462290c0d4267cae000ebde10bc7b469496784b9e1327d038a1a6e72538cd512fdef3d4540633958fe0f47352e5916b5228620d12971b4da4e9d975c41217b4d05045890db09ebdf09e7f2c9181861b6a8e489581f53ce334671e0dd6735522572572ce23efd92a75d96659e541010b434ed434a991821318ed98c6781962e3470a402c01eb5d13a79d5302c63c5143d40e33454c60bd7b1282f70eaa8beaa4b4743968e99c7447ba25cf7bb7e44475e6f72e08a7bd2b02053544ea499a28aad4b801d6b9284eb9a90f481143ac86a2288ca2c07a17e3b49329c17b67d4c17a779403e725070e0c7785dbc229e7c4e98c3ae1b47254387d2e5679645394a93242d8e84187140c08de39d90c4c489952458a2b5770c03aa78577ee06590a32cc40f6c4992658e79238e58c704a3c19d6b925d5079aea43cd12529c6e53356973aa49db534ddaa038fd2da9f204e15003151b425e9e50819285f7cd8893d49a28747c110305ac6f4a9c6e4b456288a2030a2b599a9882f50d0bef1bd3d6b46d41b3f940b305d988b62317ef1b528d4dc56a4cc6e404c5e9772d4a93f2a2e5e04573a21dd196dcf0ae2d3d69484f5a9266046a4a9359e15d33e2543ba239602f34070c065fc15b6c78c74eb3aa33a33856794200020a8a1d580822cd10ec0aef5836011dba3451d3c419239ac03a36b2c23b460a7af2c44c9021457670820bace3241f78c746a8f08e9534def112ea030df5a16609294eef54d2754a7a4a4aaa3c412818515162c214058a1a580fbc5f234143cac43065c6c4cad20cd6af1213ef77090d90188c922461831b3258bf331e78bf4c9c7ebf4d22ef770b9aeb03cd0d7289ee118bf78b446353b11beb57c6e404c569b7519c5aa91e6c0e3d38e1b4dba5267ba4c92e79b2484f36e9c948852a00d392a531b3a72f3c60bd4655a1dd1aa978b7473eaa171f6038759a49f54adda2549766538989d3afb1ca23a768d1e10488a42d368002465ff62a0b810d889862831614b45881f56ac469456241d298269204a106470bb05e9338e5bd1a5981f7aac4695dc25140c35150439790e294caaace13949125cad4b465a906e59d82b100f521b504e15403449c1e71d908a63802e46b7e9f39700438e1f4e7acf2883558618a0a4e50e18309189d4c4ef4fb8ce2744a710aebf308a74b389d4bfc8369e483aa33e96f40ba98f2359f563a8fa65114dea74c024f6e20d224c817251eb03e63bccb2933513fd820f38411300cc1ba8ce211e026549e201852484283111c8ac880048c3e75b9342041903c02429a8a78848912a4051804387d5d79829424f1218b0ad342163230fa2eeae20121ecd00413125daa009103e6004e7f87d2ef66ba5ba3ea549d6c129faf21e95e9df8fc5ea7f8fc3a455da89922050f03e0f56f7daa4e9d1135acf8fd9c57bd2fefbb38b846c47801aa742185a881db9c849e3be85e93f8fccb84ee35c6e75f27dde9139fbfd540773ae3f32d11bad3243e7f2ad19dc6f8fc8945f77945f7f9c4e7774874a7a4fb54e2d32ad9ed6efc0af17bff837b257d59abd4ad123f82d7aab4dd307f5ba2bb21f4e7c2c7e389dba69c218cba6c96090a3b6410f2b699c3a7012a94301bfdbed311404d980db05b941e8ce1f569e65cc032eaa2cbca791c127aceed4da1a3f856b935a273d3319f5a6b3ffa41dc3ef84363de9fc6a0bb8492b56f765f23d982debb4fa001a394bea0f4440a381808c2331574e5c1b15231606182cd1a36865852a2fbc6358f9ba2a7152986cca87c808d59e5d1a0605a8230a59d5fb598ef78824c628a223d6034c0a8136896a629188d9d214272c06cc0991fc4e7eeb346ed2083d1f0400a1776386142e11083d1d8412166c47555baddf10429650821180dfb032629033a8bcf4d6e600fe24d10018104b3a384d57172a5abc3921291c911980bb794854b345cd65a6bad94d65aa7984ec89c1e2671fa793ead2f274cd20bc35febd36c3f1262e08f04495f3326cfda94b4829d06f7e8ab722b5bacb8942d5c6674ef90387d7b65219204814982d0ba8084e1b7a38cd3bfb2ca83ff02132614ae59b3660d4c7bf96580c2b47d020d18deb2ea84494e4c4a299d4bf89c72f22b9c521c327d40a661e55248109e650eaf51ad73d659674c6c70faf47b41e735aa734291654ec7336a4456d1b185cb2a396c3c7159258714b746128409255bcc9f1449c4a2bb35c24b958752e1040598feabb45479c02a40f86034ab3c741663ba4d95a76ad9020495186cfe75aa3cb2291633c13ad9a7cad3495121c515a8ca33a36231d8fc8dcb6f2fa6dd1a3971bdfb7d82e2f34da83c362adc517c7ed3db79ee7e93fa34aad7089faf31f16e8df87cab64979ee65f28a3caa36aea71440c36df2245559e29c34b36e946d959e591b00660493283e1ddaf6c7eb74617a9ee7e6374773b856777cbc4520e6139e8d6be4ec22db752b0e0c02d1298b576f7ba8176b84bbb341e59372065c932c7ce406b6004225017944f1146a840976078f53c249a03c973f78b85e8827600bd41c6e56c898c2780cb99922d5c040942e5f57d2aa71f1d0103d4457f69a0f2ec2c21d180072037002105ab6f003ab9fc38f03d74867bc201a260340e1005931203771f200a464748413f973b1ce184d3ef9289474d5ac36499d3e9ec22360d35753bccaaa7079607e9923c39e4afff0f76388cbfdaaf52b6089f354d9b4991c435ad088a5a852ca97be2180bf5307223bc217df0b881a3c6aa8edc643ebace4847e4c3b843bb344beb21fd550811c92ac562b11828129751d05041ea6ec80a60450cce7105aa05ed469a1c9786180d321a8c6840a221e946a103cd10c715719c1185dab94db158cc8649a1b894126ba250bc876e5e84ba27d27965be3411830c3159114c4bb2a1426843c80bda17d1cc8e6c2305ae3d3942a88997f452858726bb1bc61a6b44d5c7d2072406a2973c9834cbd32ecdd2faaea080bb7517c618632947a88e5cb239d1545c577ecb0b0cd5d1b894233e9033de43392f44bc6ddbb6cd49cd96a31e116d1ad6344dd3a6d4501d6983a807cd91eb651072248a1c373063260a2230c8d20cd5b852a464aa82f88189920b35740c99462d1c8f694085eac82b5b603400c3e11b35051d2f4f474d5618b23485901e2c3c804c90180c8065426ef0410521596cecf063069942c8bdf75ea725a799139353939393d3d33dba12dba172c6a5488c0bf9c8402c1420b869078b51f364e3736c3832f4e385293b866c0132064a35668a1b18638c73fceb73fe8d8851a22846d4b0d8cba5418ad3a0c606d111af2188b6836f64207666e90a952764c6fcb04eaa20a2dffe8031c6b119c4a4804298353c7cf098b31f846a9031c6b88a91aa23372624deb281470733a0841962070f6498242161199274613b18b1c0246563f26147d721a5c937f45ba18e638c31862a4275e411ae076a896ba8cccb2d59d4c0e001161678e8f07a78e29a2654c4715f86d04c188491c2a1091a6411d363f6d8a1e18b31c698c8a8eac80d1f11111262c7f6ac998ac562b298d1fd0d638c311e4242959888783a4448f9f2e5cc6bce7befbd44982c91264bc4c91279b244a0ac95a24651a108d3124318636c0311d59147418ac06c3882ab100b1abe18638c9f3c511d0915c5f53c99e27a7488715c006cac31d244123d986670e107d1490c0b2d6c6194be22edd22cad8d0280796c18632c8423c0248d0d514786c8f0c2e431857de107c7693ee8b0e19a10c7417161052451d8f0030e2560da1151b6d223c78ea6699a56464675a4514f1924570b43488eba202645d840032849a84892030b378cb051e45e28472e9425178a13d711919d5a84d2e71cd9fef5396fc4e620aa4c648eae7d62aa3a72d341867310a1b09142218eab4116b2c2240fcd8638ee89982bf43b5a131d4566128ea18429a281005766d872745119693a76e8d488e25eb97173dc0d6b2840511d19c551988ac9b66ddbb6cd4b8d3443bf7367211541a82842c5112a960ced18dac18587ed304587a7324568396274c58a0a1d4820a438ed88c2400c998121c814c618afb03385ae086d1102b3090d755d91a66945bf7365b063918c3e07cd0d1ede4032238547d30a5d87e4d449411a8303862c63ca0d3041a6301242c85cc187323c868888d608cd4ef85434241b578ed061a5983fa2aa8edc4410e5c91a2a5ba20c8144851c1f901edaa5595a9ba981c98b12189c68f9318b80dc00460132a5e8354dd38e9c501d093bda340b4f608142c599a3a921269194a3a1aed3344d46c50170d1c8a5698891568d29a19890cce62856c83467cafc582303152090a68e22421d482d59c6fca837302162c66465568316660e2d53a868dce5388ee39ee3388ee3a01c4175e41250a4341435ae998d9f11511d897730c618480c5a0f5bbc231abb563796501de964e337a86897a6693a8a8a5e5fa478616289a9432be28cd0608c316e018a6b210aab91598c95ace11813d520803158641882c5860d25609838ac20b183831d9e0d66efbd37872254471e59e2848a85e570c5da1b2e2a451ca7611d986b9aa669464d54473a3d7123a8fbdd9126a4b1157ca445c886ace18b31c61863294c698e5ed091609a862072a5824815913a22b544cac90d796f6c35fef539ff02f052a3eb866e3031c72c8c593a528589264f6a7a4c99152e385e984cd528168bf9984c5c4609426932618d8f6efce3fb55e174ab78ba5540dd2aa2eefd2220dc19293e661c9410c7fd98c2421c77a609271485ec6a58a346b1586c87a6699ac6714dd3344dce8270e29a3665fc7374c82fa0108e918f232a49789802c39019ec848f1c190a90aec352e6c70d219a406a326f5828409cd8344de49aa6691a991926c384c93461324e98cc13d5c12f1c644853f4236aca86312914f1b8f7deeedea20ed20c153d859a0f6396b022f3c1e889ca282d2c79c24740868660328ac56238a494a2c314130b19f410260b133c6451326de0d0c14a8132e3a1abe0e26406863245baa4994243b38613ad88e3246084d310484e5c9c003151309ad2f0c51b8731c64d94aa8edc306eb2c489b8e81d4dd33427472eccc9125da512c590ba410b0a6654402365c69c38e996e0200a527fe722b1b122254b111e493b9448e973a20803431235a4b0658624d61459c15a5430410f323e1001a5498f1caa50539444366523fad7e7fc2bf145c99a27bee0a0426889932214c547d77d528a6cc0fda882e8773433bf5d7cefbdf7de7bef354275a4d2d28ca92788266d477312929d8ce4e8ba24b208d142181e57609052e3c4639b3939c102964dd3342937bb01317237bd8d2c2d8a13a91b2310a1820cd0645961062d6984387952841cb1428dace18b01b0652acd0f489a2832c6c8142fbc52d08c501da9b434e36033607a75d12226880e597a10e2070ca3e158490dc7332f45378ec2bb711ae5c2447564d3e6a49f5c50cfb944511dc9fb8b6b1a2722b95e6ce4d8b6ad87fef69b3dfad7e77c07c2951670c4f082111596988ae26506519ca08e7ee79ed1f0c518638c71d8c231e698be4419b204859920523c11729fc040044cc618632ca97002d2c3860f6788a81105c74335741491514fb1584c0558774919c56514190491515c93a105ae5dae0d759a025ac6d4702293210b19987603ae45918168e8868b26b32252a640622222258198d203491468b4241183820bc658c318e3b71b8bbae01e5f8e31c6786f3c3c0754d5919ce336fb3222a6cc1127453323a6c0f0131cbfce81e36745397ac231c6f86efa2b4d5f164b0dba5c692224430d489c28e229e9d02ecdd25207e11033732465cb99242451556c0f39b4d65fbbd8d776df2eadaf3d8f8581daf8630e7d4961e4e9280c932322524df430a54619aa61288b8f1b3678e28c102758986862a3dcb8522455439a5ef8b18388cc923355745042ff787ce1efcf73e8cb3efe1efa95877bcbedffe2e48a952a52506a4204d396e05a17335c7b167581b926c5071fb8a67d8eb63bd0ced3977d987db983936448594b29a55b7e0f9d5332e86b4e6d2a29a592ca6bb1c516dbce9276db13d41968d78bbad8a4a7a90bf9fde9ce0da26cdb5685ebbaf1f54cfc073b7d87762b90f327c76d4adbc603d7654fdbbcdc719bf6c28cb5d4524b35bb4917f6376dbc956f23953af7b98eab4ac03f1fcd31fd7c2cd760db486d501dfaf77b61378d8da059f7d36670bd74cacb93e86d935f988df6d8b4fe84602a2a995dc4a62e4ddd94aab59e1e582ad54a16489ee914f22ea3866653d5c964765e3a3f826bb62daba62f925ff1353199a6e4912175e8f7788db215732a0592676ea13a13480b4be8984708a5a13a6a5eb389be36252d9c13a814ab996b7bda29c5484400008000f3160020280c08888482711ec891f40114800f6a945a6048970da38120465114033114c32008628c210410438051ca599404003e0000e9406d6bd40a645a472e82956c9b68dcacd53c5e7f353ae06eb738b4ff2b555292ecdd3af108553343c8d010ae71a30c4dbc61d6d5146bf67fb202308c78fa04b7ec0da90ab4859ca8cd58d7887ba5ce1ed05a4383181260833d895c8a44d04e3fe8971a8f89d63aa9724ea3b33451321bc53da7f559616e812964dccd4554deea46ffba6b50c0b1d5e75186e8b25ddc01d8a45920a2653d859b32337d2bfb594886a0b3412636029df84f2376037c9126e04705682b1fb4bf09e7c89091d75acaba05223e8511d15803daf90dbaaca190a65e7367440f908971ad9fe1b885485a7bb84e8f00df5e8e28d77046376fa59c5cae44fdb9794bfec55b031fda8ef7f41efc949e1b829b37c55b3d07751fb893f8c6e7f6bc2e5ab12d6e2972898191b7bf6bc4a1a50e32c3d8d0e726695421d8c4749ed135a00b2d9ea94a118d9c80897f664d6399b612a7ac41babd3ea4b5cca816dd9b243d68558f9a117acfeb1220ba506345ff2ce2340613dd820c9b868823cf411dd411205906b0a3a134b5ea1483f6e168b62f2142508a6b9e95c802696c8ed81a841d2cc4c05e09f3f696400536137e39b6f6796e207c6d028bf6cc35705c844daed05e2be65e05b4d8df2bc9c930de45f18f7270593137cdcfe5fcb8d12926c76762dff57a3218f34c7643d02637ba41cbc5faf1b4ab242ac3f50930bad312fc6700d19ff27cc25d9d78c29348116bb72141c766b61de835146f2648b7193b02de2761e50c9c819b3fb3100f977a00bb404d93fee4df11a882fcd48b27dc602c47fc6b00dab01aa754c83165cc9bd3746d445d80851bffcbb39984ffe60ae15e26a1d16ae45ebfe77f8296dc7a9900510ff1b729a0b8c332fed7e759e86c75bfd548aaae2440586547c8afc8dbac69bbca0dc55b4693f683ebfc15355b962a737c59305dce43b741ffeb8e465ac5a174ab5e80d218ce3a100560c13a43f13e88bd6b393627bb0dc98a97931876211cb016997f1dfbc8eaa68a9406a2c85d27f0f2dbcc9a92bd9af4115d02d7eaed42213c8112fb2ddd8fb15b238cf1bbf0609819104b0289691c0b1e01cbb60d1109fb749404b4bfefa6c28864f774eb13e418298ac8dfcc034ccd6815f65bc26f2b5428d5576dcd53a11a34364036354d0b2b94400afc08dfccd31b9643037ea54ba91d6e5c88c4c9d03c56b7c30752dcc80fdd0db6952e854e505ca9eb0612ced928880861a481cf22e9c0f6013d14e19ffd10648920a1fe56535260da0516552b77e23f1e0eb7903945a6373e9f1bb3c9883e1b75ffc228a007d542912c2bbd5369851586c4e2f4fefc426c8b557f221788fbe085ec5b5cd5c9e5f8d17798c31cecfe83fff2092b06f24fc4d04e28290b4a8890dbdb0385e570858541bd05b0a9bf9b2f189c0b5c2dcaa2e42da9d21c261a6d1922353d46fec41ba54087a9b3e2a30b639509a920bb70e8b07ee4b8922a3a2c53d991593910b75673fa92177ee293e45846b7d6083f49bfe41591b06388c668990ca2e281c526f5d5cba2c285e217231cf7247ce6f2671a0dd504f2bb06b0fe0cbeb815a6c9e581a650574cbf8118b8a628d120bf4d7b152a5a4a54aebdc94fcc38a87d71b868d696a10780fc93e62adc140725fbd0347b913c361b96ec6cd3e3b17aad5792932168c6388607d78f78b2caaebd36352cfdfcd0e319de5e4750762cbb15beff5c60072b1151738939c8a63c0c5264974db405901c74dee756d18e58c3d0b914bc7a051c5d396473ff1433f6a8983b39103476a7b81ac1cd4fc53c496849a423f3b2464513ec3ca8d3040a345a1b3139e68f6c80f507e5bd1b3b03de3ea0f3676958ab1ceeed91fb4caf2b062219a385851e414bcfc73e7ded1198431ae7f04e2dc6d7f576304d03b60dbe617ced44e4b711b7fbda20026b253922636986365e2b5a89bc568079758dfa8e836e41502c7ab1f08f5a607669ac0485c6848f4c43eee2770f0dd0822b2f0377e21a1dd3cbb4f3140935210c84a1e13abdf0a0f904cc37d00d42f857cccd10cb805e11fb61cf04ba30bba3c789e887d84a0fe015c43c6540ff93db24aed08c89350086d8a4977a52daa926e835473bbdfe64a37d27a1f3ef76d11814b165a7b028ec43110e3b4752b6624a735c58a79bb1c36279a36a9ceeb2fe90f77ceaf8ba01719d386cfea17c6228f1dde8fe613d89ce2a0314ee957e400b67f5678f9082c212be92c62aac676da1cca189aefbc3edfa099b00fc2815e67db5894fbea58c9e999031e294aac4e6662565f3dea0578ceb8c02765b2a13f1a943c9490491ca3bee7cee187d476f5a23e3c4cb6bcb44b0ec094526ab1dce474c4f57859e84a351fdba75738ec2d9d28c12862cb1edde65b59821e5a7f9916932dc62592c0ee2e3297509e0acedd8eeeb994ee5311909617ae80a78b43a434afc59d76dd11168846789ac99a0407fc0bdc063f8d0ee1c849693899138d97cf3d1d68320cdd142f47f1330546e3042c43161d3427cc5653548632dd23dbf1fe5db4f1ba016480892c18264855bffe6c03708767961cd7019d1cda69e6220d2aa7250c57b74ac47fe40f339505d028aba050f8b02279a97cbde1f0b97e242424b3a2eb6f1695762c4f416bc19382e4523d6d63f44136d1db1131aa3ffed1faf13b12e24d60fdd73311c5116b98d3496b07be8e6c70e153f34f8f02a303af31c8d139b6024c07a017daa1c8a5faf028fc9942dc7e5c885a56012fb0f31ecdca9246d66f834392e4feb125d95bbac3bab621c0af859a9008161642981ab8b16c021c632a052e84edf09c955e07f6251fb74c92a47eb432070c7d85f4e0438365f9739d70ff68d07396cbe1ac615b36de440dcc70911516c1a090d24f45d2b39f46386ca01794ad2724341caa8c0f966933809dbc6768641ebef2902de76dc356dcd849f0386eba449d3b01a0bd972fa9a6cfa1d2d78eaee4b6a1107f4ea849b88e9847fd4cc67e640b664412ad7e55e3195b22728ea8d3b6462009d208a0e25325d048f93f968cfd40fca4d03ba3d9690066da02d944b3408306683a60f0dbd7207d0b7f1819e46d0684bdaaa3bc4cc50a40496eec496a1e4162a3a9c749b322fe922943864880e5128435eb26f70f5229b9465be7acfd44548fb520ff8f7567daa0fe151aa5700dcffc4e8f79f1bae8fa5dc425f8068cf1f2e5cc3c622217b1765e827bff6898b19252f5a9ee499b32eb469e48241992572621ab42c49fb70897f91d0d1dfec9761d66122070b4a14638939f82ae114e94dd826e692b629bd714c74a2d226f38fa91f9a0f2c1b1e5846e057a508f6a7da8a16f32bb0e9276e7a1ba33dc114082b9b99b3d4709aeed88f2cee9a60502d5ac20df0deade74c27f6168b6dd57bafe3d9ca3039d95ce92aee2bad666cee8f90dab17a8dc90c183981992614a5812c241d0fba8166f630adf9dbb5a35d603f10b389ae13582bc42785c25b5a917656d839fc2ba4fa5be01a8eedaf2c7e0362e071e3a3c21728544bfb4eb5416f919fb545861ff2eeb9ecff0a6342cf04ff84a6a25858410fe63eeb8fcd22afdb1874373da0df52e596c7142280f4ed513f6c7e144c1af9feef730dc3a4a9966b0fc35aaf10c1ef30543ce17ce57c468d09a5a7d088d7d56106b2dd62c1592133e7b9b46180d7a01051d2b23abc08ef798cc6d5be2b6ad45b9d256fa258f3a0f7628fb1f8651130505f0d8365237c275aea25254ab10811831b8e792180765e46b00d2a88114db6c42530d1dc96714710ba6a78642dd03c96da4594e94b0f241c396d5d961fd86b17df023bfae476ac70ed8a28d58e673585bee4c181403d09af14797859e735044baec4426293ab1ea7a749fa9688c7662227a97d3129956993061aa126c7e8fa11154867a38c1ea7b8f9ba7231c7502df898f95d5bcc0a645839b832324cc0de68c206e48b9433031ac84f3b58fd8fc2468f02c1a8dec6a186f79faa11609f314ae4ccb9c33c61b3a3851c50a1c3498b4434db510d05d79a5c356037a5d869c9105798cc89468c211b3a7ea3703c8af9efb8089865adbe6080e6cf8d14a083544ae472aa7409fe9eb8545261b8c8905f547d5e9406459ad9e9dd3abd20681e33c840495395cc3026515e597cadccc7e6d375c6e779a878d155ec23d482a91d3317a37d58515eb626ca811fdc2224ef7136035815ec64825331d04dfbff563667d1208896036a456777ee82a54eaa1287492e59c42a1c68330ca93e9421a187c34a74cfa652f01ad1474c1094d840042b4313cbadaa4328f23bc9c6c5a48636baea3a661253cb41621d14562e0cdb8d4736eb5e12e8bd0ce86cdc6676d8c65b88a8ef4f5164d38f3a4c1b60076e89405752980c37d0149377853b314814c35213a8dac74f8e9376d73be2d261c338ceb72c684d9e43ff63429e8839c7759c76003cc7a1a4c277a52edb51d3a84206523bf83b672fd533853beec631264432d5ffe5989e071240d8aedf887f7a8125665aacafe4c11b3d68e3f416e7305ff10e68b7ce6921af63420ab378efeb3c68824ee0d71c89ecc64537d6f0ec21f317ed2833958da5ee400478e966d68453eaa114f182482fb9414cc7c3a0d10fb7e2619b1cec5bfb74250a0a06aefda85e3e1eb4325593ef277e946e916a8435e17fc9840a6bdce2456b13ee43985e927a3f029b11296b3628fcfefd030a00ba8037c4063da86fc88df2fda14b507103c9e506ba6b3c35d2b7988f04688aaaa83b826d0f403fffc3c8018e4985a534bb67350399ca61b24d539e4205e2b1186dd5b7c2c809b4fd8123ad660efb40a5c69f183c66c8f158894250459e42c4a0a10b97a71d93621a6f91669237238445e8abf76728d78b0f580ed03b3de7724b5fa2eb9788b0456561787f96ea45bcc67c03417e4b8731bcc120048cdb7350f61f9da620c7cc8f882161c14343e93f36e3258d938fd1a8da6d30cc03438bdca712ed1caf25f824af5a3fd2dfa8297191b7e4d75a3ccecbb58aa218a065a4e32aff40b89f448abf2a7d6bb4e1d201390f17ff070565ee7d5edf6657bad0be0aaf989cdc10eb74f230c215250676e74c81ba2875cfe165a3340c996dc23c3b38dc092f98bb0f84a3c66e1435d2a873b5ce9b4d241873510f1a7587a699029791c38310c91011ffe0d00c0206ea6c80cec871a3970f4107d6c95856df2835aeed2c1c3233ce34063d99c65fb7bd03adcef0304634dfcd72127101de4e10f84a8ad893b84a979913e299b67dfeaafe892ef5636d675f179aedca4ebfc9a1251744fa63781f22f366b6b803144bc5d8abe2fea3f8ec31586010b32250b3011ca15921f89e990a9a043d2674fcbfc7080f7b0badf91cb1a006136493234ea0c9c1cd00525d3149d9c9292f49e93079bdc5dcea208cbded72441bca1ff94f195f9989d2f2b487b0eccb2cb14da161451d1f7bdaf790b781c2ec02b8ea887e0962fe8312cd7c07b1befdd02f6242c8ac80c32c616815ca98156ed3d5d84e8d482631ade825a16c9e049046adf6ba12075957dced854190a353334ef8bc5fdf52cede80652d640a6d059e19145a9bf84b880a3b7c7050005731c43c08fce79d68dccf47d0b9cb8d30352468320d7d00d7a2e99998141f33d19ab1b2efa874148144fca63286a50b618d434388406794034c38bcede814bb54c7304aefb77cab1fe7cb59e4f922303ea119e83b7f7e713d518d702c74dc19385eaaff00e2190c033c94a2e400a1c7de92d5f831438a1cc868ad7cdc5de032c04a5f0ca1e34c229609f17a2cad4b2263c884a747bff9243832700ba1be52aea4d7b0d3fef5c725ab772e487d751c7011411dee14de3286b99bdd227916eb1a54e71ed2a58d86d88464a151831b653369c83e565892eb1983b203b72092f4224829174560d90c29378e8ea50f0edd7aa5deb68766a3262a299a7b9bd2a49dd8bea76829b358835aaaac2d02cece6ddbc1fc8b39f05ebea2f0aeef54abaece03f2827ca5a00b4e27b7153162ade1acf818217790c4821432efd3c728d0b6eac9098d97602e0bf678c5e5781f5473829d0c9f1d07d1c7b27c447dbcb5d2caeba8e2df580d362efea6de1a048aca08a7620ad44d7c40b7c050a272c41d0ac1936b941088b2f0b39107cbfe2c9a790b88e236390e9b09a78e63166b01007159b17bd57cdecd47bc10b4e8ab7a6f3929f8b9258823d518e637b361aee047739af5ce44c8a28c222520c91d0f8aec06e6b46134ad99b9fa0b5e1ceefe64c8241c7b113aba5795123108a7512afb6b16d205b7d2bcc02d987f0b5e2a322d523b8ec138640bab107b010c3b76f92c1cebd67ac156c3bc60ff5e8bdb5941bbdeee925640df2d2e58ff2f0c2032c4aa9144d7c0ed92aaa812e69d9908b4a9a27c15c6147c8667a277d2f2f66faac8f7a19770d40f9e6c3144d8a10fbecf3e93f1ce11b1aa80b301ac9b139e533768667c1dc1f468e98b2e5e3135ea79c414114301c6b3d9852a5d5a917077d246d407976a776bd64a70062a9949a5ec82a3c30b7f8f6669be45f7a6487a67e702d7251bac149a29b0ce4c09e26fc5d9a3cb44ad69bf42afa7b640b4defc69dc0c952f1aa629ba7c45f2880915a67d3570b6e52066034e9b9d3530e1acea86c00b227d7831be08fd73ea3215583cbf70f8f01dfd1377110664bd5adc5e490a82d9ee5619e9171b3c46a7759a609d88bad96097701c03a6f159bedcce3e69005c838c42e8b75045486045e3a25826829e91bf07d8bb2a67eed98cad3b3ddad8ae09d1a4f74b22a6dba046f6009c2ab56d19ed5ad8034c817d5e50be7933c2dc8f3ab624553bae9a2e27e3cbd4506e902c520431f17efe3b154bd3bcf984f03f6f8cf36777e30b56e0f69e444a7c496f6b5a73ef7401818a02c02bc1774b84a3a0bb3a9e860f170c326a7e48d4acff9da05f9635f504d7818ee23fa2d52a58c513940ef8dcb42152cb5807f02725152cbcea2bdf439fa02ae5d8989fd018a2214a28adfe892801d2513f145f000a52683fbb2808e4517cb84b3d34ee207959860b482d160c82ca7e46c1391f148cb7c3064bed8834cc75505e12dca0ef9abdca0d8427dcb0c91bb7eff68d92f9d318c3a82ae4fddf1c789495abc6075b79657d8d67e5db2a6b5c7f58729455951f98560d6fbbb4b99230b24295738fd513fa33eafeda1a4228e6137be0b95d30c04697403c56ed7d48c38683f613e859213a4723e11c1eae8f479c6e594c08d3623289301a7adf458e28fb72337aedc6632fa10b78e1f223c1a9bc14192c253425144b2163f79e40c389c9c6e5862b42b4651b6aca6ec305c147675dbdd92ede01b026332211543af79e5c88781e41f02c68341cfa91c8ccbd7e0c6c938a5c0dca8a19f1a4249a74ce499c8ee7d45f6a0fd98c86c82528bc15dab23ef290016339842ca88a2c134144d3aab6201db890443befa35ac03f01685e80f5b1e8430d2b4240abce412cfd4a5bf46e11b50a60be5dcf26d3bf8948d678dc42e8d33794cbb1d363f6aba5d146c1264f1561ffe943487d2a79d312aa9aa6d3254ed9a580e22b0c4db37628c09f258d0a6557cf39e4c35db4f9f0667c271f0b7e1ddc12a0027cd771e1be09a2bbb2d298427241355aca2b8bd04a72ac15f0b8ac23937f1b4fac15b18564ec0ddf56b16b3ae468a81e00bc601c6cea56d2969edca94d5eb9e86501c98b72992006a0db9d04568ed183b85383564c92c1edb6857713668db8ae4899fd8c43071182e20061962d16f28e57e5cb1c61d7184459856545e020bd4046ca1673da63a92c3a7648fa6b881d8885a18b4e293391d276dc9990c3f6b42651e4d351c4a46c20649c685df9244aa26738adfafd9d49398ebb06635ab1c06bec80caf996224625fb7b99d3d0d3402897349f88e7c30488276daa762d56409fc86bca7970e05c2ee3ea888ad4a4bbcee25f86452f4a59ae48731dda77e319e3ef8846b4e62e463c89e758fc4f7ca2253e9d07769fa197f8c8d9f70773bceef6d6668cfb021937360b83cf59c56744b0f13fe4719ac1b2d360baf780e8e2bd18cc61b88db3b622de2cd6b3e6619dde1752ee1d1d348e894bb4b305b6aa3c4ae61349d0a5762dd32aa3cf22cd445b0b394fe46b46c8cdb0aac35f41275ec21dee6a316c64d178c05950294ca6249f56411fa55d654a7047d80163f7b4905ceafc8daebb097b013eb348d0e1656b9c70c532dd8c381d4e22aa9b78020a34e37469fdf29345b0272c505af0f762af9e24e3d90c177ed16ab2e3cc505b8cdf6dd0ac648cc55a67837c810ebf7e8f4cdf7ebe7c1e103fc37dc84deb595b8220971ff89b997bcb788c548eab25cc2af7de946af9bbc8da3385badf88a82faf36598fdad7312c466744ab44920a531babc2496ed2764dd1df6765359226fb8d75ef78213048c6599dc7b8c034e258ec57b4aff64853c56cc69473f83356ecfd7e60a7e4b332647a8039a2ca914075ee326f50f960c327f7da618a70ae1deea410bcce8a77eba5c466aeb42ee33a35fedbf09d6271fb6cb2ddaab653fdace0f097911235d353f0fab0397f30e71d9fbf13371df695897745884295a861973f590218f26e21011a04fd41cf1fb10191c83e1c01badf0fb133fde90cbf7cefb476362ff199fd95d5baffe086156481def56344a89b46c11a5d4695020d49589782c70ca6afc6867292f409ec43aab372ee4a06d31b6a329993ed98eeba52c905cf43c61c0bc9e2ae9ee061f7c82c866b8d1b5f66215e4ce4368b78a5e146e2b78ed22e76141c182d323d4604f7bed180339e2b81ac97eada3d3c22846e9992cef8b31ad366d11ac1eb081b65cf6c10fce00d5b3f8db3a72a719cb3efa3a003c720223a7264813ca9c68dd134a6ca561920f204547570ca594b652bec00604e192a24b5fa69d0d94e7dd9d0c8b8049137e8f30234703af652f2ce33c651646d4f20b9020d1b43d2e2ea79172ccf8f12639e19eb435af80763aeb2999356c949f328b5319414525572bf1c550761a92988714a72bcc416daa9ee1062ed9aba0ff12965d92e17822f117d30c3800a241a46f41e52645142253d2c069aea48f135873c5387e25063a23233ef83e0164d59c509482d7922082fb5373b376f536868535993f4d8edf0f20d27135c66aca67a15b038aab95d536e5fada11aded62c4e93acd3a3fc3a7ee9547034709732fc4a35dc43cc2ddea884ea6c2df3321454fb2397f6fa4aac9dc1e0708a7035310cd75e324f4fd42503b418400fb6be384963dda37d1dccf9162a2377dc78128b83a3104426361df54be51e560912a008c6dc7fbdf05a0a8c9069fd1c4c9ac1525d51a087c1eaad78d59a9b7018a8b406b1bd7830759a7cb915908cd7c70463030228794fe7c3b2b2c5acdcecfd27968061f7d0027452d33d40112f6703aa5287c90e19ae42540218f90ff2e870993884d4aac9431b5d9b96b54ba1d5351648f4d5fdb14f25220c630199e9c0493e45b3b6f607cf39038a6579935ef09a87754ab979b31147dec5b47bbfc2d9d8df46875c6f26cd4929dd492cee2b249dee888d9907abc5ccc46a941c0a85a0f4c6d6d7a24fb7b3867e2d4a06d316d48c6361a648f8b2f53c50eff1d89f800b56c30a079dcd76607a33d70934b120ae82a19ef829f2e033108f114187c2c8d78be8ef480a114b963abf2340fbf58bd25da774860022a7ace2c1c521b20fb7b0da58c7d777565fcae4d5dddc865b53101882d80288ee00689fc5a82101f825e79bbc62d0ef5a30ca87c6831e9d63e0a729ff6fca27ef770fcb458023374504c56347999e0da354a4d30bebcaa844703be95d42241fd2faafffbc312b8ad25c548074608a3e5a357e6299492826b28c55135207296cf630dd7cc99d701df663da2e2c6a1f45d16b4b6179b01c6c11c23606889ec13bda89038569502f8030027bcc8b1df9d844e111d3a5e869aa49f1bf70326ebb8bdd4f1bfb7867fc103a25caf2c53feed5844875357a5ec273bd4a96c4266f2b1508fa99721ff6e5587ffee2ca882c2ebe95059cab987c3f05006080fe75209aa9e584dab655deb8aaa83ba79d04939f01f0efe7704cf178279705e570c6ba7a0aec554ddad811b2c400c78e0b74e946553def4ec342578856ca270c054f91aa4a49f8f8806e2a8f3ef73dde5bf62195aef17217496640f065b18836004a4fe067e2c6fbbc96b155522c881a24ad78004f04b2ef49ee64959dfb0d28ddb4a7966452fd3929acff3e054b013bfce8a2adffbf392ff6c39f8c7c0f5712e0f9443c2d4cf2cf71854a5d2bece6a9a050f63c2f193d500454c7bdd2060a93a0620baa65afb90a11c1d72d3909b3316659446f3c1fa0f7cc7fbc6a12235f82144c719d941a2a33fb50a5d42a3b3253cd0df9b01e026fd6b3530bdaaea758c7b5bc220f1083ca7ea5bbc455e08aaf5bfe8593d9afd129ab722c8ca793276ed7b199685a66cf322c84d3886120145e0ae964aa821760a4d1c4cf261a1d0a81d2d4db7dbe94d5a99b0a2c462004815745a0b8cff13b328e19d4983857e379c09e29bd12556794adc4e460f632858ef33c5abe6df5f924d44928699f4a8b3dcf963a232d1092523b482e58465f3424a3e5a51b4372717c04b53f5291899c47157638b8b153f353c2e83107aa8e6320a00233bdea056c5d541cdc58568c50cfee325f382457b4a027b7ea52ca544260f29e1ee8efff0d0affdb015b418f58345fb5f0e5e8be4dba5773f5b068c4a0ab589f050aab04837c37d42faf3d193ce26e54f29539e9007f3c37979317e89b42a8d002b4fe9032c81f7f85134a793d7b2a720f4cd94eb5000e3b6c732989dac2bf1c9c457de212a429f100cb5f172e139b5c1db3f5b1008bd3b27e01cf06c5e09c18b3c188d5747087290d702b905ce689cfc56728cb4bb9e33739f05e29be472cc37a9e908d3299f7a2e16054186fd471ad19576378e44611a0c9843c03617f1f05a6f1245a5efe383071ac13c6958426f463bae93972344541441c487f1615deb5d28fa768873ab6747bd21c90a233cc1327a176a8b1230e86ccf4e8a7ba04348ecc593f72dd36a89fb464c7830b480190212587394e7325affa8b4a940239780fc759983236917860eb7920c4096abbec224ac0de074e991bb65c5074898b4cd467231f681ed2c66cb011fbbc8c373c7a69d384164b3bc57bd9c6da32d249252ce443bd2a456b07ce7ad05c67c73d62958b55294671774d49679504dfe66c1a7976330cb6e0e6b46d27c71238e948ec33c5d6167b227a369e883e9ae5d13512518fff3ef8284d124497e4f5638ec6976b5f254ca5ba5a4730ff01834fd0b8a64b959bbd14ba6bc4d4bdda8ae89b7e7c8aad2349f3dd7f9a37d8939f1d85bcec5c679c450e259a7d78c1391e154cff019b4dc0e38d89071012ffd7050af6f1abe9f0f58c44846ab9c8d5c4b994532486a321b83b8991b85f7b698ce8b61d84f686fdb60beb4367f8025064d2bccac9069a7cb01b61225d4bf852b6e30226bb807591735ccfb7aa5e1b7321bd615513a1914035211c061ca03bd8dc27951d373b88fa0fe5a830681730e64be715714f8a8676ddd28e722b004d1dca55f81099a46095e8750b3943a98ceaa47360cc7e71574e01e09557532896f45901431976d3d5d183f2e0ffa3c12a09ae712867017880bc69cde6a1e14c0b6d5e3be5012c58c48a2838aabde05936227e1d6f77fd53af8bba540eaa9d01b6952acf4ca5a437a00a00c9218a22eaee388089fecd2e799107021d584a158eb3f40b463b651e09ef64cb0ce4f30be706f51f4d9de4c583862d5f1de24ed691ff2cfee893eb115e3d8fe6ece0c4e2da67e52c5816f03affae788c89cbfd5d29a80e4b03e47204b09c2609cc41df91e3c4ce0d3ea6a5d3bbe9a5bb6e67581c70f677f28e0d61d894b742023ecda0ecf890a3939e63da27b04cab9bd4daddbdf7c721a074bc2a0b2e4bbe58658945039b3011d85e1a4f2b7d6b8f2f4b2c885100ab710a66f86ff68fc751115f405d46025c196722a7f10f543a0b8219158239e5c52ac62a3ac6ca31cc5021b05e96c0b918000e44c7ed11d70abf45d9d3376ed9d8f7a6171428626b2eaf3200f6b78a62e46273df89e30009e04221bbf81a06b5f76ec9c7576f6c077ad6e09c343aa39176b47cad696a9a9d5cb7898bda1a01a1f9bc10481de52f94476b08deacbafc70b93c1ed275f0b57bffe5eb977c6e688cccb8ab1a71f322d925ac196aa84079a0728f69c92aa1e2270e194f4447657ddc259feed9db269422edb1447a252d613ad3daa20e29959baf0bc4676d8d802ef25c053c08810c105fd4ba845110e797492ece6cf19100a6bd950b3a99342231b0dc4158c12c8914f80d5088bce46330e7f873801764f7393aafe08d799f392247b458a170488559ffaa5824173302d94173f94e3301ef0f7ce5a7b9ba5664cd7a606fc0d2e94402318c2675b05266a97032499330cb41c0d5e8f47908a191a891f470a456a2f2f17cb9b1828743273fdc3798add1d3b096b3f53e608b45d9a0adaa673a78fdf32f3e2ac20c376f8b7b21d5637ba37e33884ec4b46097ec353bcce4b8255f96d7489351d23d6ff966ab843d404bbe196b405890fb2b1b03f970a502646c0f8b49b2265005b14766a1ce376c464b7b7e4bcba2528878db36091a4f3a9eb2e48b3f7b718a6f0c563906b2e566900411fb696dda2d4fa6d9037440ac6bb16a0f57337c6d88287d7567d39d97059b7a0b3110643943853ac9ec2acc97f225e2a50c4985e13fa09c22891e139ae58279d689347a697fd8d02dbffbf8e9a978210e15ecee50903bba4693bbbb1bfd68c527a003351a970dcf83f6288be20a958f2ea25801c9c24a9b7ab4922b3b75b09228211be5f42a5203c0ced9503fcc8733e34c4148dbb2a9962f669eb7da240c0c211d085014f50a191b68524ab1eb516228fa32d10d2aa9a05a9688276d36f0e81432bc496b37b0a401051d4f56ff21df7ce1dbd6736698359437091de0b5d586574c8fb94483ca464f624ddc005eca4ddc55d20395edf0ca1030da729c270fae8dafa172b96f3c17ec3348680a59dcdb33de606c60100a1aa1573ed2fd138f06c1c75faca38124a1904d3f4d608ecba0159b3c7eb4d2b195f65a52f80fe27b543a6b447b54786ef339c95721c07aaa98d022340f944d4e631cd19cab90e6899006d77dd599df94ca493f2a7de7c5ae00c72c15e157c9275d8c61ccbb8058f04f99b1b1711e32275dde54b008dd38fbd28d79d6c215d8c80e695951947d2d4040e9039eb370491cf6e17b2b9217c387a8fe3497f04b8158a9f7d1dd00b31a0f8856fa0b076ae3a30e04044eb9e35e1505bf36fce31a5457d51f69582f73496162402727c5b81296bce37fe06fcea2e8e55313da48eb41edbf62517fbbf9aeac11b7afb14a4f004ef91fc0b0af4a6f4aa09b589bc27a56def15804ba4f32718e595a348c4578a28dd161e7928549e6312b26018b0e7b4e914f4cb200253373e4fead0c35d2ab4944822c9930aa73e2d282252ace741862c120ce896cd87765e339bd0dd10c88f3a592c360caa63e70cec7db2170ea6007320118f9ee880eb1ccb77a62b5d6240832331e4c4270dd4026f6caaad061e016275e010070c8841d317d1b748a3bb2cc4dd42b42d3f1dc48181c37139aaa9d18e1f46ff97d6cea70c3a2411c6df812c42831b0c5f24c820e31aeb86c2b75233db0a7a953c0333e6f8550a6a2c09825365ddf6437b81b2383c7b46d9a01baaecafac97f87328cad0f061d4a778b14d69352e26f9d1c506164247904ea12451dd35a156a2368910468078bbe4c6e831c8ab549ca0bff0e464b9981123e2870c0b0de86d68ac8183b95765eb23645542a29ffc2a69e859b5ebe87221e149fcb321d87e55d8a68021ff271ee5e15113601da41a8a498a84d439aeaf322047b7d6ca7854276c6dc476565dc86dbf1fab14030397a9c7d4db1a22d2bdfb6cfabe079f69a1e3472a7d40e1e08f63eeb834606368e2d7c931342a70323d8c679a30ff073cb5c05ac70961e6a7142e1d7b64ebf7827e7dcc05c00e30a318770ff2809464d4b47eb370336ba3b9f9f77bf77a6fc02be5ab02d6645c9b962ef0eb4fca785dc5deef905903ee75858ac3f9097d2a0c59257794795b27fcc5e58a67f01aa728dd33f4b96df97fec766ded69b0b2e732b38f73f268288cde78ba514188005bd31c4ec05885f212a1aadb4ff1cf01298b3a1d69dd36abbdfae4ae059e266793871f9ff9922b0903bbdfd7cc330d78cff726897474aa8a75cf06bf86923190ba3e67511a322126d095846a6a491bba5af430909d6c3a85e43fd7f7672b3e9c8cd43bd3f6550a7fc376205712cac8d31a74640e75ce22cf6c5e2fb85634e64f07535f7a0be759d06949dfd48400aff407346099659a9c1f83662be8d0daaddde961f5b3702adc035b42a17140a3a4b712da0a0c82869493452b27e2c2e35dd798ff4a05bce65fd017dab9e49015992b03dd19c5b0613632fe8edc4619656dc078bda1d129a8d8d6da6fbf191e0c775ca1a4e8bf2b9549a8d230ad37777593d92d401346ac44741d9c05ebf1676efc65cbbbccf5115adb5fc2c6561d6d62ef6fa30b3787c119a1540d68d25c39025f138467def5b72ec5753fefcf32c54ecc135e43e111e812c606000dfcf4937f46ef06671705902266386300ae8f76ead168dc7880f625a64a8406cacc7104e9696fd8c97caa068fd04d03fb669377ca6dee3f50031c8e86ef489185214230ee1708d28702d29a4803c5a6836ecd651ccae62275ead75ef02503d728116cf0970f7580d4686f3985fa23de5eac3f56dea9486f341276a0cb404f3dbc86cc44ee7e3d6043d8cf6ebcffc04b9515f46120618319f9a5e522112629e4d0dcbc29a992a681964dd7e57a8ca81795f9d07d591c8c5b55e90c824e095fd921fc7417d10d37534d81664c90c144359c450d125dac4398eaf9e44334f103e5b5d20889c614dc7877edbf194c098ceaae183610649e079043463389089acb74ba4d80de2f660c263f68105cb443b4c69ae26ee5d03673134a8e3a8d527bd168eb88eb67c627201e941d23252f628e0408654b1ab25486f46439a70b9d277a1b892f3378b1bf7853b79fa495e9efa578c9a82101ef667e9ffc70c39da0b99a49151893bf27c39bfbd441f85d7aaa0236ed2a82fca72b3084f7e6b3b4729d9d5bda2824175106e48121ef328e23a50d1d28de1c1116dca679ee05952a2a7a4dcebc4fa309874d7fde8db1db81d459e677dddf2d2dbe14342433b4c14b15667a8fdc8551cf4f37b0250687f715ecb3757ce13f43432c4f8b1958e45d50cdf4746be7bc9d8281d457aade8958776104e8b41c9b6d022b1e7d13dd3bee71dd68a60515c4501c4780f083d3d3b61241c6f2a408c441607b00c5ad1bee5bda184cf843e18b9394acbe5d048fe494961284b875a78291d010c6722c090ed1a7cdb84c85ef3e3d8cd49c925912d3a8db721a1eeda164edd129a1aea123ad4cb730a658a71056e5bdfd553a4f33baa977313725184c701ca54828a83a45042b9882e53ba73c0ec8281c2e5ae8c2f5a0fe04d466285088937167d6de5770137918043564c44bd24884081ba4dd2bd99883e0fc0c8005d94f6f9ce01b70f912b6c2fba3b77144633b39905576d9fcf04612b599af422adbf1e9e639d8057f37522beb59c1b5d87d293bf42e42eab17f28c5f2296bdfeabeee8a027b6dd8599bf7190689bd2bff14d9b0770d4af2d630104c5753c686243b94182b151a1dd3dd5ad693777505f30650a95db348f2d07ddf3faf2f6f50e01a79cf4c1cec5b08d16718a19d3548ed9e7429939b08fc4cb57ad4ae004dbe480ce74a8e193ef39a097046d471f4312a801d34393aba238cdb9740916906d90712163f9017941d81c9ae867fc28e3bc069fca6206eb5e4a9573c6c6a72e9f2963c44ca531f1f982a682c7540c5b0a7d9fa655e54cc5e530ee325da6f196bcda9cfcf77b9695f2c2357bcf743c41b65eda87cec5281baaf97b08754b8bbcb3d85559952d8855f1ecc9b15bda9ecc12650440871434a540c078ce407bbac0125344fde5b60ce5fd6bede8f2796ac5855a13c507ca045dc0b61dc2beac0a7cc06ff9cbb4cf401617d8d4cab5e8cda63921879c5fdceb9bf585465ca2275a7831e29324e236b9fa922fd5a3276e290e79a04fadfa3fe71925b0d12048b2da59137c56324cd841d58f9d207e27f3a22737d6a9b40e654c360846581d2f55c782ea69e07de92f0e8d54210c9441a2cb03ba238b8dabb2bd20a078dcece9b705d56722d0003295370ae24546b10dd11b0579619807737093c2ff20c92076bfbeb93810ceaf3c6c407bc1963fd7ed6c317da2d64981d62ebf326bd4abb7f04dee8f2c4546a1249edb4422e02260af24967861b13287563e977055d70a45c43e18c506b8382ffaadf441e85722cc9fc6edd9ad9fcb6d28097ca06c46bc12314f66aa3f8bf6eca11618d780d87757e730ee34f3bc60e206c47b9d37271dde5733e85c0871c2e10df5c105b79e8efe9a65d64d6c278c8750d182eaace3fe42d9f0334c04d8a988d99b37a0b05ca006a7abb8d336e9f5e995349ee264f399220e0480a58b00cb61d416132a36be04e5de4212ae64faa342a50241774830abfb2310158a75a611e1296a1a443fb55ac4174fa2bcdbd61c8677aa2c96888fbdd103591b1ee1cdf44eb126a999db5db966ba43d71d39864b19910032961078df5b6a71980153bd1bc4b73d5e15895b7645d37b5beb3c11869809f08b940edb214367becd4824b912c48541e0ab5bd15305a927d43285c921d5fe778cf60dfb1439029a6d1d0a6a3bb3495f430630780d2114c0cd0030c85fa826e29376907d7af5087512a04e7d67101ed347752f15cd7d111b49a752751a9a09db5c404ef75b54c4655f3a9404d3cd36293000f50ae8bd8773462eb403ce10ec42952ad3565235266140d3542936ce8983a57db9ec38ca0cb625ba8b7aa90d8b330aed29568e7f116c476de6ad781c4e0acf570f032410763f0ade2497d3ee4303b7372b0265500e5626c7e67fd5357c6e3529114ee0dda0cc1ac5bc02555350dd84f0d72fb7dd0e730d47be8c1ee9031ea0c9affa195b7a5730113fe8ad91f71428591b9b8d56bd710f287231ab4266da7527b8bb882ac5ea47750d0ef99181f32cc0534204245f7d99c0a40f69706a5169193982eda949b1719a366a3dee73748fe946c2b5c6d901bf972b38a8f9c5092a9d1b14a31bf579e52618b92822ac1cd267d1eeb4993e3cb1ddf6ac86874b323398a70380e5c003aa8cab7a9713aeb65a98ec1b6f9c71338fd8d31ebb2437fb90a2ac40bd331bb7e748facd4816c59592e6642925d4783c70d5e5c7a6e3d857b6f295bdbf3774643499a4ac863d37baafd3ffbd71cf92f269acc97e655482b0748c27a3a14af66f50db28fe44d6603e0e82d9b7481a0335d8a83ccb409b8a9da841cdc392fc8ceb461eeb6e5c3e862ddbd89e6a8ba67532b5cebd6be30f302c97af1480fd81d8e4eab06870078fff6ab7332e1c64e3895929ec2e539a2b0634312802f9a2bf83c140d70584c738534c7f87fb2a28b9b6910f15e3e02304b5fc675fc4f744029850b800c4286b2a8d0b0ea4505df68118e556f5d21569f29263b4a0e9932630b463d291d8a2b2ae61c072796b3d8ddcd815c415e2582397bda72f21b666a306b575c1cf67d8b92b49164f1771aab36547782b17c49dedd0e12b9447f08fa235068fa0b04807bcdaba1105dd04c3924c9d395cf0318ee0e0787513beb23d6ab379c40c8f00cb015a670b290da87a1259fe6f4780678c9058f61e9860991793582870fa67458416a5678855fee77c5548ced5f1954c501ee2914e6dc815b21cc8333b28a37ce3f8e081ba12d7de9130a32b637b4d3008831030b2a14da46d4de9619eca20b62e0d5ba9fe7eac7d6ded1a9398ed54b86ce0037a6e5ffc51211c611f1fe1189b2d852d2baee9330be1fc710b110eb6f86d49289cecf68ce1633944d7dae8197c89c0b4111cfb6a63e23d402d257a9c6660bc170df0650c299266a09e08507631787f8f19f10b6d0658cc9ad18b401f37a1d9e0e8c533020420651902fd3dbec4527e5e8687fa81315e5274034c0de62531a89fe4a350eccda28c807d36c28296452251ed89ecbe38ef8f043cd84801e1158cb6b1c88c06d2cc5d053d1f32cb055be0365621ba032401962e7d1a0c48b8e8827608043b9d68f0d1c463ae77ada45e8ba8b50ee244103fd574e0826e73f01d1950fad8e1063f236293223736e060d8b785ae6f2d9c5757b341a76816c75b7d83b803e8130839c69f35db7267e5036c075403f2df8378e213c6a9ecfcb685bce2418cfd421188f621db29a9d99ac4b96398386008009100ce9904220217e925fd2674114fbb0f847deeeeade8d65f692333d93342e02ab05d2fa6c27136d33bea5822c90ad4ae4c8b68c412fdadbb05dbbffd15462d48000591342482b725072dd0800ccf539ff21e46851b430eb5fff16278bf05ba30540b6088256ccc6fe1f13226e8b14c0a9e964a7d95bb69409c878507ae409415a2e855f8c9353c1f4797c63b533321d4779ec3b782c1cbde36c7da7fa29477be5ab7bd7472f59a654cc970215529021c9ed12e6c0db2584528a2a378bca7540a618fd84b6e239764d7e75907783aea4f3ee38aefe584c2a940cd4125f2f51f824452c5179147dd93d3ae7739a8b620d61ae62768059199a12672b7e75f15df3c99f70f44982a91abe15be42a0299ef4be6ea90ca76fc77640801cbc19d52905791480b91f187906a168a589156baec000599443236e29310d8a084ba14157f92a37e6460594720f18b862328792f7551b134dfe7cd9b89ee243bc75e2698d9c549b16e0a18a6cef9211fcb55945415816af78f39235929725c1372ecc5c5a8e8249838d3f078d8a0c2c5f178aeb11c73ac20ace35e5f1ec6707a1fac2393bbe24f3f602de8be01dd5186aa465546ab54e2b80d64c4cb45dafe03cdfa872f603723d98c778be0a2d493988a5a70a4073c91eccbc4fad0cb6a6d51470628113fbe12b48fa7aa5106e8239c18548df926ebb36e040a33403343ae000437eb8d35c4bf2149efda542543525138c54905fb94fb5734ee1f3835700b9997c6bc1ad28d6c0f7364fcf1c24d2feebc9fd81d464c233ad1886c43a3953457dc689b40193179eb338108e017bfd266c7bf4303b2af7120c576eb3de281a42ca43a0cf62fabb1fdeb145e20634fefe05bda18443feff5c0cf20bbefec3d3accf0a4e10caad901db6e4ca7bbe67feae9c7157e71f7bf26a35fc1ef3cd21fc11c8eb325cf87d5183130cbe472a03f779ed53503ed4e04da0d8c82d7b2d2f113918ddd310b8ade7c857942394a53859fb373065b020a1e70107d7fb5338af9276c84d0832a0a3af9da8320e4119cc4b4081cc193d343cc8ba743a4feb73dde0aa2926a34654941610259c969080c3e2953e34ca8e416e02fb31ef55e8684886e048435760e24ed1aca734d86868890bea2f736012ca30109a19460c65aa6d858d873d35d034d6b09254582b2027224f01dd2cae2341126050c07ca739853d950ea4427824bb804f465a9f4ff7c326f7d2553dd00af4574230a9536f19a83124343c867d22c8171cb0a8e5480941f990f84c17a5d2c331f88c235c33627331fc8d0abaef0787e27901e42e4579d7f344292d8fc662daad486b54e8a83f53ee8c861a49ad6c80f7f74408c0059ac65afe92e643cc197b8c0a49e702dca7304553f690efbe903d8e906bbd24dbefe850408a443213597f69edc9c664941065698a9f0401c535e27e2419da156c30302aad884d1529ba33cc8413a38231de1e92208345867bc067a281ed5a2558c169b083f4c063b70dade86a75a171ec5f4b72585c4ae5b784465f32f2146eb46627e485e35f14859404c511f63a75bd6dc1651efed8c7a210fad7d6455c223c993f3089ecbcb38f7e095cf72e19f25caeb72094bd7f69a7f25aa708e17b40b0840c22440e98b07cb609388d965e937166ce82e9c1c6d7f8da94efbed7833400da33e4b8b2c9999f82b250f3ffcfa77aed6d7ce92a766a38cfb80ce40c123675feed69b728fc85456071c964593dd37464b771dcc8a90e96be86102fab31db9f2e74a33b0777ded467b6a37d055871299bf9815239abd9bc419d1b9bf08e67d863b200cf5fa9d07d377038c802d009996709a75e9c7e4d813a8e71c6125fc62bd01088878e046f43c71f4dad2224803e78f9abe346e28261648ea27f7a88151fad700d1f086ac27d5374812250cbaf37fd6b4651ecb7b9c9d09b1f4db360035136e63851601de6ce9d8511402b4a2c6f9cdcfc03817ae75bb573974cb13b41a80858d9bc58739eb1026820ba61f70ed406c6758de7c0e4601d3476a23011c1256bf14d9e186328b1558331b4363579289f50b1dd01d498afd0852aa9739ccd42109f6afb419943550a241fd6d86ce06673e04d1b9a84ef595171c80b1d9cb0f672a2a90d87856eaec19881e4608ff1844be581afc98e0d8fcc7da48955b3354daa0d9d00c1434636eb3efd4f4416252b04daf80da462cf3054d2a02ae47a9a0610bf00a7679664cc63f723dc40500396ba7554606553a74f4bad9dac3ce629b114066ea4a29f3895f0f2d1a29088e633bd768de0f4a65480048cf39fa9dfe579e8212e086ae96dfbbd26de288fc693abd0792d6539fe6b02fbb9d5e0719ef768c8ed9236d1a8c400862477bd862ff9f3e917f40566d062062dfb9eae41915e80568fa61f062cf7fb0eef07f58f59052ec2a3a6bc137c89623d94283a18c164420bf0cc6e55a086123fe493e9d0208b26162981ad907041e5e8883559fef6d10fdf4f55ffc3601bd945a10a80e5e4290c03656eeab4ee237d762ad26d1303f2cd4bb80f17e1cc0f22e45bbba06d837a54b00e9f75c5cc1e62eaa03d09f1118880e1cd38adf7400072c0300f8c1763163072c9f475e20e1fa35e34fef0013cb9d4a12bf55bff006b13eee8ad665910eb0200692d0013b44ec60c2bf155e4f3dff20c95bb49598cbb948497a6b32fde8f40d1cda22cc5ce54d03e62f84ad0aeb0b026d6d718a1076cf293fa4980c08dbf4e47ed8ce20f03d021b3caf05dc963f1837b1d822143484e25ac0a9137163dde9479ed595bf9e6d14e5e5d0f65b9e808df3e0c590948ad8534cfbec30ab5cbb1888f87a885567033c895f83f0ae954d1fe6dd05f0ae1cc98afeb5956a0f23bb945923ff016e18c3f3f50b94523c796c1686655f9146163136ef7fcab1f77fe721a9b30f12a0c1635a14c6fb2333295f760550ef5f8e41076c384cdcb5c2da71076ca6d8091efc67cba805d133d0fbf07ef5e61103dec64652c24c2e3255d5204ff67ce7cf883d0ade3c54dc9574f8ea17595adf0527b969783418810e2f63c0f950df17619554f1caa57eb70182241693486e76abe397f737bf1fa1370b34a015ecce02fa2d4e6e5c40d0324a07150171283a1ac1750a5728dd21d47048627d0612e2f246e1cc8865c54774db76136b044ca2c7a173d0fdc1e780d833f48cc5e21f61f8b97deb232ac5bfd44c301538265bf6ead2137bcd12b2bbedbdc996524a99524a016807c106a8061e1425c334828a681f9a5e8007e560fbf64b5fe921ba9a93324a8924633bd7f219a976509cb2634b8934a79c72ce2991a69c718628a3f4c848edb98cddf2086908183f1b1a80c8cc80d43d2958a2aa01950827845b218c114628617c28258c90053621e028b99ae3eaed31e3e9ccfd6acc678c1173775e8781f1679c99cf542a27559dbea494e9ce6ded8cdfb9e8d1dd5dda54ef3e20d815331eef6ea612679cb119eb29a7300e7f395d72587b55267b0b45984a7b3e6374ee20e46811ca54880a6418653ba1dae84019f8ad95dadadee8670e049a9f61fb40e08fdf8f2342a7188429ac23663c1e39193336d436c526824d08385bb2f880c4a11adda7fbd421d4ed9f8ea0ca0f7500e9c88139c8c5a22e582a02ea16ad86ead518bc611d42cee91082deeb30dbde7ea71e2eb181175e55fe520edbb7493e3c060a7c0062879f8154d89c6624f679f6e91427b577b4c3f6b1cf51fb18d9529b290f9b0a3cc4b6d58777e61f91a1014f7f777c786766bb9909b8962d37e46067fe04e4d38e48113ee6cb6e665ffeee4c603e7dda75a0033d0471e9d999ddcc7627d09f9f4d65209363c99542b0752ab4c74f81b6cfc6c66f5458f64e05bf619fad619f6dbb0fb5cffeb0fbe1decdf0f8baff75ff639f13dae3a73320819111507c80055aa876befd13da4361df070a9ddaee831585255a7c51f7f97df052caabba0470c18bc4a64438d1fc63a5ffc51823a5d4a2947e2ed49d1f25cb6e1907a5dc469e01b6c03f3bebbe4ecbc975250ebc2196d457044208218450c228e3c308ab8047ce45055b96fb8ad4e5dd0a2151929f8a80ba443e3df59b93bf1cf3ccf4f34fe52a55a7afed2ce35929bba57c9d9e922b9c81716c116ea1f63327f79983ccda957f392e32390e916a9debc9a6e3371bd56450cc6d6511b8103a65d35e92ed1381883f9e20824d7be468d2d8e0f353b17d4b94fa349d1176748a7fdb97c8e2088c4da4c861552d6c4208b14e6d8ef5702f0bf30e85f6668cceef17cd7824d7cbe282ac909970653c22e45290a2890f553e204aee82706581ab777cc4ff9a7da53d1b476c489dfae897bebf933ad5df479b737d7f73b139920ba2c92f3de52e13e45b52e8d053ad97f27d2c8e7f5c722c70a5dd29c93bfb57f48e33b0caaeb330b16d7b28744a7ebf0536c70f7080ed151285c4faad516def60698c129798b410bca2a0820542402954581811c00a5ed003181d4c011424002a940842ee48e123a5944ae69c3306475eb354ceb0a136996df39f973ba8bc66e91871554f7a7a7a66f07562882cabe201c6092e5860e061890d3feccc229870c26202053820292d1459b27c018952f0c4979e3398d0218888283188881ade97e0b2849725d030c111089378b58425cba0810e6519d2328434c465c8cbd6f0c4a754fab13e0aa9e8b52979cec2a86671b4c9b93d043212e42acb08242f301aeae9e9a1c19728055e8caa0c3390a245942561fc90866a8879c35012c8d3c5861e21bea868504508249f271ec319385825194240b1f0017ad2d3d3c38402d5255255015a2d92642003366b60d2c4c84f121b268af469a40cef3dcdbf0daa4fa934e79c4a6093273f3275ce39e7ca49d7ac0f3a2b225625a5943f4690ecca0b0f1b6a93d9b6256f33031908a521c404110e41b02088264f50524a19c64fd76c904e184e640d82b6740004216d19082184d189275f2a84441d60b1a2045c5a9ec0054886781b49c651d76cd24a878c2f57194365502983e8089d72ce39271a4474cd4a41a3ca868615141a58deab41882473cea924871f8c40e28b1827c8328319653c714310ab15202de10303013465944b03105db34354882a0d5790dce03d72f16359a59fa6010a7422a4640a412191b8a064850a24781823490fd697538c110b080c88a50624503a3092c402e3678b7e5061322809b2ba41932641404ad8204a5003aa10c3cb0d0c80e4bda7792530c0e10c2aaa48638723a024f1028b4005304c152449326594524a59b4048d2a2513349c490eb248428c6c49110f9d98e2cbdb7004062171242a9be84f7a7a7a9acc39e754d575624b529d5355759afa943c60195901eb4024a594495a0a0ed70fc3c0444a29ad38d235fb13a4638513eb3fe050ac40c102250b142d509076478a0a66891574ca69c539e7a4e2354b7f9873ce241e96256698a839e7a4486c60b2c3ea4a9313eccc1fea9c464ae0003f0003548c3146f9e99a8d1244a338d9504653b8c08932bc6444013a383172440b7c60f0c18729c6f04192a4eae9e9a98193ea3a51e527898768847bc10b5fec971e25fca52e911441fba5c6152ace0802ca7b1023836521e96122043402c986da64b64dfec04063a831d48003920562c8078b53972c5db47441eac285062c35ece0d9442ab11b54e99ab582258bce0db44c1a28a594d2196a28baa68c524a292502aa94524a9982a22335a63803084a746204020f5025a51dd098203002346511086e90e10a0dac691952c2080ebc68d103f760f4f3c43f70a4e4dd8ba8e3c5bf20879e24678451444608b0f0d9509bccb6b1500ff5f4f4dcb02c54d7092952586887a49432496f510b6800467619012a40059c243983891624698203142aa825a5945390ba66b9583b53bc589609aab891313e4e392707df82dfb090d7c4bfba6fcbba0f153fcbb2c1ff9a688deafcf84d64e54aa7b68fdf2aeda3e9e3f7d1c6c9c732ae6bc62df65897fd74bffebadcb1cf858afd725b7d62d95f977fd6ad95a5cec7b08f198f4fcb0ac6313f7b9dc6baaf858acd391fc330ac5e19372113d5f8d6e4e0b7e72be0c4b5620697f8d692cd4d0c93430d8ed0c04bd5ea16cde04bdd53d1eaa75a6ff973111729758bb8f8a0aa5bb4a58a8a82df60f3b3a0e0371dd8a4266524edb8b02830220a27768af8315f7e7f0aee6373ba36eccbe2704a9c8d129bbf3524d619a40139c8410eea7ce6a2600fb928194ec6f9fc0ef67fa33dfc8fc2741f7fe9356e77338e9fbecc782eeb7948ac56e9fb6189731edfd3d353adf7cead2d896076516787d35e3fc6d9784dbf04c1f6ad910a403ac5efcfefa353303e3394cafcb746db0e9d11b86c8cf10ca3d029affd29748aabfdecd3809e0b746a8b66d0fd714f6a8bb608fa888af8f82742b7e9d40702ce0caa7e10c250fd44a8cd1dcd370fdbf7b51b844e3d29b5550221dd53d2e127a3fc46fe97feead292ed8845ff883f11ff39bfc84ea99b59fa3eacce87773310904f7f663b1ff2e98c8ff8f3e3cf223ba5bf28b73b93db9dcbb1d2922d8b00d78bbdd96166f687709dc1de87bff5d973a5dccc3e9122ae2762bd3f9122b2ce077cfa44fcad9fdccc7633580701ebfd7d58efddccfeced5f9a00f9f08ec66b643b557fadfa15f12629bb966aef913b07e3e7d22f0ad9f00fdf9b323e2a528f375baf4b4b4b914174c12def7cf224c12e8bdbb3049babbbbb73d86696c0dc3b6ee0e9b6153201c7a7fedcd38962f896db6db306cfcbb2f85e82fe4170e6394d9249cb07b043153e862427757e2edd44aa10bcb12c3dda19c130c0986b711304a0c6c913e9d1a21331e97434c8a812dd4ad3642c58b035a250c6c29d12de016b8056e815e402fa017d00b084504aa1342b1c197dca33e948d17a5558a321beb58d6012bc5fa4b190f04aab38b2aaf692130c75847eb80d91e55ced883a8ea225475717cf165c9ca7a10f1de9be59a2f5a51fbf926aab86663157cb3c36b52f18a1d1b9cd2ca78948e2c134c97524a5914032f5546547b4df4346a0632454842596494320649d153aa80376c57dd222cb29061b3ea16619184822dab5b84451725b658b7080b1cec2001ad0c9ca8eeb383ba455aa65458b748064cd4ef6da8b860af75b4aa46f509265a9eb001885ac4454f2540dda22d4820f3c4cf939aa3ee133f43950b2c2a228c3af53150e5ff5a95a553cc4595de61471a017fd1d1517555a7b6e8e8a7f27b163fead41665a1a53252e587516c9f7fad5271cfb7f10c89751ffed7af874c58181bb626a253db4591cfaaf6384b7b0c4311fbf2dda81465fb5cb5353ce84a1aa6f0828bbaeb7ddc7ba36592f8999f7bb8faf1139f2980582054190695ffc9de10da84c0279bb3358afcc845f1f91bf9dc59ba8619c86f78a755d697ed7395eaaa6be5852ff5f3a3a7bdc3d6e3374ee43790c86bf85d55f74bfd5a8546ddff5c55f92994264cc4d635f84d127ca2535f3caafef1088771204ec4c1f1c7e9deb94cb07d382ac78911bbc18575f74f0335506da2060aa37f5032a82dfbc980321b32a00ca86644195006f46591802c92f641a7dacab296916585656419d5928f656419757179807db4b11f0cfba95895eef686de32e982188e0d944285ca142a54beb8a28fdfd0efee3c8862f3b18e2a7c7a633404c2a1cd11408e9f1c3e39806a0ea21c3e3980a41817ed1bfa6d0b6b3e885d9a73f29b83edd2b3867e49e9483246e62adcee1e21ec869c7f376ce736e3811036f4eef686605c4bf3c555f5bf5000a0332afe819fb90755a316003a7486c8e9de7892e477226c1da0ca53d9a83c153d62fb56059f71f0ab54aa136855792a9b139caa3c15ed2e72d49effa564fb964867845ec938f857a71ea2cfe648e8d2ff6392bdf18f3e9d07526cf17f2037a18e20a803880419936c8dff92ea1ea8ee503e027180e8b337bcfb80c42118e79c7042ca33c2e9ce5598d91dc6e87e75e460d42154755ca93a0d391d401e23a743a8bd0825f4ca0fbdfbf6f8e90c324ac952ce266c40023b66e62db2943209addc03c695998171026b9329da22a866758bc040027ab1791a658cb2c80b3664612286166049410976a21135c608e96b418bb4a08272a48dd62dd262a87e1b11d7fa4d7f0ba61cc9b0c34475451a3ba92b868c763a9063055a78b1e34206c40ba06095e14698af482a0a2692765c6016c252980aac1f10ac81fa67db86066a202657e4309fc566c07ea6f4776354bf21b0ca07127daa7c08298431c2d83980a2c36f2ec74fed8f397c72d8c0385a72a49c03c8a3333f0958881fb96566eeb3a954a84c9132858a0ca20755b7b21f65c6d31da10741b8000f8a012578d96256757362389a4dd964fe14bd742a66734cef7f9938aed18ccd09c2ab98aff1fe26986a703538afdb1a5759c623e64d7fd5307120b4e7a61a9c3471510bc702575357427b276e6b34da98182e76d91babbd31c656e485a86e8df90bc30060aa31ff5935266627e639e389798dfbba6a1f8da2964eb507bf378db3f130e6753a1a55e994ccfb47a278c5fa56e52ba9c376fab8da9cae3e8001a050dbb6d0cea389d4a9d3bb8d13b7b50607ab8de7ac868d0e8857b77a9930d8a998a71be3d598d55fcedcee11668607ac351ecafc89e38ababe03ae398b892bbf69a1dda1a6ee4371f7fda9fbbc59653a4762623bbdccfbaa53357e1efdb607d963489d9ad5bf85fc661e798dc75aa38bab79e437dba67954fd6197edd4fd888979d39fde015c776f98624edd8755df0ac30981595c7d32f5f3161202ebe7ab2f62a9feb485847095ff3425f8a3e6cac614ecf0dba109fcb2ebf14129a2505ef75c0de116d7cb2f2ae34994f36188ea6733dffa0da3247c8dff1fa4b19b894fbdf63aca4210adf26322ecf0910290168e003901420a1116a34e21750a86eb1297bebbafabf2b3ce4ca0694fa6f3362fb6efabc71742c256fa2470855d77717cf2b947f72052af1ea5bfbaafabfc1ea58ee66381ebc755960154fbe7fc9f3c16a780bde1b30bc25e7bfeeded1c61e04b2e84f68854d8d9ec0dff21b6ef9fa653bdbcb2a45c11834adda230866adda2309ec05982d71901d5984d855e851f54f85789838994962ccbb29e862bb2edcd19d96d55f5c4059fab071287ad6fb2efc752a58f923d642cceeb7a12b65edd0cf63fe45fdd3ef6fe452a731f568754ab961ee32efa9b5945aac56d563deb2a28a533222121f5c71ebcc77a2eb6b5328551b5fe2dab542a21b5d7bca86da44e3a3263fb7ad5ab4ec18fec43bfb7b7b74b19095f2debe9c3bf2e3691108327a58c02457630cba3606f619b2aed5e0f3be3a15fb22cebb2fe82b134cbb22ccba252aebc7c597531f29ac6d2352b2f5f565d4ede53ea4c86029c506d2a3333046253f95b0540d59919ce40c8afc20a9e03e4455c8eaa03e994b343ee142ed0292681097c82dfd0f72fa153f3fd7b6c0ebf3f8fd521df7fc7e6f4fb151cbfa1dd0a5ec33a649781c5e13ff6c6b7563218b6207bb3abc2e6cc54ff15360756777ea1fa9a51fdbb53616f6cd9f8db8134b7029719d9fd9899bfb50478c576c28e4d52c13f54854de95542a13e0a147b2eb9b4ba51108551511fd8a078db288858d5fe0f3ac55114e1c39cfab0ca617ce45a9a49976e7ee3d9d8e0e834110fdc2d931ba1bd1136ac63f45f2f6eb4000af5feac7ae15a9a8f4768af5f84f6fa7d0bc7960b3b89220442f5dbd5c74e6ab3cf0efee928a00cd5fe21cd4792b841c9c7d910aea09c66fde70eafd9eae65d125b37d1f6767c162c331efef2877f9c5978eff01b147623d61e4e3fc5d170e01ff0233be914ecb6774ea6bdd3936d1a7d6566eed89dbd8d31c6c810eedef881bb5c77f7e9dec418e3945ca59d8a0d2ba4cc198faf3f1d12dd5d4ed1be2bf806634799d3858c7dc6b534123a776ed1ac87064c5be982df8303115e1726811a504c463a935a1002f76283a95b0446900bc03872c42653b7e88bd515db56b7e88ba32f8cb8246df59330f5349151b9a912b00586222fb2d4fe886262727777282380fecd06b561509b4ab1f1cb50a95c2d62644a0c4da098c0491058201144a9a88b24b597088a30a4f082892b513c21c30e1f1143f6415da64125406dab09a4d8522b3958abab0657e84093302ad5a0cb0df38827d691200944857e62123ed3072024545266400288269020910405d0114445492e58b29304105b8f8c52c6566d58dd222d9680405b8dba455a447182ed54b7480b2ca468f1050b3653dda22d8cd82c71d14eedbeb7a1e8def4c3ee8390bd8bb00bdd4dc3b57b03bdbbbb1787bb62dbff2877aa77f9059595d8f61bc2666666761bb900861ec4ccccccfe1b218cd03ba36b69beada30b29fd767f6f302f6f113d850ae3167777ffc3aabb94db098115764362ed34e4c36e8bcdff83d5b22c0b8808d57a6841082d68b97b07e1bb654dab931dce3e84b18948b1ed255309a17e43a25b56a988b56bd538bb651cd64b9b2a7f3999f12c20462b46696d8d3f392a2544619b03a1a9b08b37c485dbbbddb7bb1b61b75eddef5ed9f943d8452443257c08a2f9fc498d4054a8d84fee9a405015fba3df6c051f1054958fd444fd946e1baa899cc48c877693f3cf3898c7b8aed029c94db9550c139aafc2b48448220148b7427b4da73299ff5035fedb30acfb62baa1f6e2c698bfba8f5eb3859719cf6c2a9d1af21bde89cf42f1a3c470b07d2c6423866dfed74f6afc9a88a9ec8d189aa6699aa66951b01070e25f1b87b597bd89dbdacb607b198c46ad9a755bc6261ccc67fe52ecbed26f7bb307918b6984c887efdc10aefe90f3bffabb6dfa759c5208d3303030df913e080ef04a3bba37e24f20b6f95c359be654c8c0e6ccfe6851cb7a9b107030ac3dec4fdcd61e8665cf2dbfdf39ae5ab7b5672d9110ae19f75915eb240957c73ee7ffe8f91f733f73f7938391d761e433b394ad546a6eee17b81dbacee678f5694d482d3a7f508b5a94bef593fb41bf1f524b8775708d3f029d14ce5e96dd49098410420821a49fe781804343318f12b920a594324608a394524a29a5944be47c29e54b29a594524a29a59c52165d10429bbabb0c3b6c6536a77d7d1dc2860db9c398c86c4e8dbd91c0d6c011ba063e1441040630e0c68d0214a0c20004a0c2d8f9d81b50c7868d1f36712dcd175555fe05fbe64811becf49bbab2f72bd2a17fbb5a9920c2b96bb474333fff395af3687abfcf9de25a8534bdd0cf84295bf0b935409c204a1f2370d4d67d3e8081ef1a3ee3e2a61cfcad7bf9b990fdff3b1bc748d7ce96854f925acf39510aeb0cb46df7a6b6fda47f6932affe3aaecbe16929dc4fc8bd5037daaaf7c62106b4fbefcf6f11b5f798d7c146adb563e15e55547558714cb7828cbb7fef3950d7c69f9cac5d81c7ff93ec6a64a2fdf6d20351b03a8f4bf01c8d7b8b9be1ec5411fc646a59f6995be73957295be659550a4bae5cd653c1eb3121cf0d5f22eaa666740171952506dc2daa3ffed00000ad654b8445691192ab9adbd0580a932f366d084b58772b94e8551920936842d7e31c61f719d39c638e38cf19b4747c8ddf1ff07656ec66c6ff0c7e6667af4c78fdd0ff9fd5be7f7c79399f7467ff267bf64391b2362db9cae504619fb174e22ae3d994c9a767a4dd3344d7bd3a986a69d4c9aa6699a4933993493b671328f327135994c26ed61d5344dd334eda4994ca793763a994ca6d3c9643a99349366d238faa6983769da6f9bf6db763a6ddbe9b49d62b49366d234edaf0ceb8c4783980cf775ddfca351a77cb597e16ac4d838d530c998b6ca74f09cc97460facb74d234eda469264d93795865ba8f08571b35b816aa51c3a499344d339db493c9a4699aa6fdcc7834ed64ea18d3c7c89c64bab86acfff64ea7e689ff6a78c87f6a6bf34ce015c2fc634d3673c272e9ab8ed546bbff1c8b40d34fca15cb95242e9368ed8babf9fd7a709ee1f21e458e00a3b8ad9286263a32bf276c708b3ffc3b5216c59c07c24aaf13355fd2a7f737afe765ff6db03e663f691fbba667f4d8e055a83380ad5fae684f410ae73fe257f3df0208a530836f9032e91e4aa7cd74cebf1a59494d24e3efd205e69b75c35ae8178daf530ef01f61f0c4c13dbf530bfff03e682e1240eae86e9e6fcf9db9e942dcbb26e9b39ca87de2f6cdb5c6d0434758bbcacea51ddbab58c2114d6c802bb37588b0d2036b7c1a6d3a999ded1a9affef127fdc8f5b5d785d19ffff57713abd3f34b9903609e3ecc5ea73122b6fdef5907d7d2c2642514a92c702dfd3597360cc6f55fdc578d2bfd1086f9f992fb01f3f42f8b0ba2d5f9309462305ca40bb3b0c0b5d4d1f6c8586dee456424557f9abee11d9f52fd75b254ff115aa67e4ba43367d71fb91ff287f0673dfd617d7cff07e1c6e6ccf7bfa6351f725c3d33617e8c3f2d1ef3e34fda1e8dcc13aff5a6bc116686478d9dc3b00c0ada87bad588514c6affe7379ce435fdbc3a1a8871f477ac05b647bd8158072f8e7eda7da86d6f74bbb314b5dd7de3bd6122e727f606768a534042f7cb34b68f8988d8ca15aeb273366a8fe16355c20ef56d5fd7ab033a188971f85fddb7811aff6ba146af719e181941753e84cf447ee3cf48ac631747e9b5ee436d9e7544d54b8f3152ed546c1dbcaff1667722d0d6f80dfbf507aa5f1d27ed8d34b606924017c76d98af4815c216274d7ec90fc4eba155d8b111ff0579dd613e17fc61f5ee23c2df1a5b2758af9e3e863b39961ae3aa1af3f9518d79d65263624ecf5a62b88f57311c775b903dfd663ca70ee5452ced4555f5cfe288e9745222c8f431ef45552946e317ec93913ed53f1a88c570d10b1c633321b577e5f48e02c0665a6a79f5f4114bf680982e66e9e2151b23d87e0ce1ea5edab33182edc7e987708d791b46f817f7d29e1b81c98c841803658b89e950ed91b17dbf6a7687310f6b4cf711a9b14a7b4e3307ccca58da8be93e20bcaa31bfb517d3a1a66c318927d24cda9cd389e33abb30c1643a9de651a74cef0f73994e27d3e9d4059a7ba8b4acd844390d15a219012000a000c315000028100a06440291683c9083bc1f14000c759e4a5c46960ca38120476110c3301003300003200c6080420428a514464a4100cbc37fba7ca2ca6f84e4c63c99037932843c70fe9087c0ab3808e1272d3e65ebdc459305d20078086e6e041f44d09ff21b3df62c7a31038e2263cfd8050e855c828a66b62c926de820b512154467b33ebc2307ea59eb509032c5bd3789ed3b5c22067a5d21c4bb065cad1f16b29a487a0be1585a3671ac99b311a505935f1c8dd2a10224aaa8418399f6c532c264755368815062d2e780adbd8161336a5930063a03eeb4abd052ca52233be04319c44f20012e515f29ca11fa8a6c0fa1cf243e19c7b969ae206c7f213e6fd7d454012fb6c2035b39406fe536f7134fb50ef11a9da9cd7c2b86b2534771550c1afa40ba47afe28d59d45cb496eb033cdeb0282cbbd55da617d610e40d0d15525e9578194b422ea2c41ea7b2cf404b69a5a49c0eb204490e3ffeebd75808b3b1a7b56d7fa1477b9ef7289a78b9e20aa773f6b88709a861b257c1d0f5c11c9fb2f293eaab05506dc5a6e4d64f21e1051774b96666dea7742c0641957eba83e97f844c7495313964f2a86cae71e728bc59c60bb5f3d6105008c2b5d80dc3314a1c336ff036909e8d089af518bd20d31a60ac44931c51bc7ea920a1db90d772b6ac6fddfc5414f647a6c43778d0be5b7761cbb48679c061ec467767e2b3cad5aa4608768ca6cc60cc19328634daf09dad47daf93b94a4e268e3c9cc7f7579baa2cd91626cccdf872e924838c73060e33a1aa10d5cccc15abf6a03be0b3a93352a069641498f74ea1ca611c6fe2b318d03e99117b600114f07c53e9716ba310d3f2fa88c939b827b4fcbf05de9651c1e2c3b81a00e44fa6b90e19ef46fe85a45f2479abd378cd29b93725294d9e7b99ba46c5360a294bdb22876d74377ea0474383efdad0ee3e28fa0488ea41dca8ba8ed1667708da7db734cc265851b4c757a5287ca9a1ed10543f26aa9e4b53a5598091569d3d802977d56a80dee4b1626f427f1e8471effcf38be970cc9b2c13329251fb7b3c23df7045c195398c28c1b0e44ba6505ab6e2198fffbfcef931576947510610d34c86a904db670e05e22db6ff9a8dcb8f4634c33c131890c15035be6e3ce09212b7b5158e0a6ec212e440eeea6178cfc77297eb47006e1927efc47b0a4df64711fc8cfc35676a9d34cb95082108ff854452842859864c0c53a0d7fabb4ddaec011c1b0943aafd6a23398c825b6184d119607696255f05bc08fcfa9ef7cc1bc21e8ea5af8c6134bcde9ac6e76435765b6f9726bc0adfc28505c36b5387c6de134e704ad17c7bf99511505506a99af811c31a3aeb711a7ec362187c0690b688ff18ca7ea47a93a00bc267d86bb44e6d9a07d0d33bcfca321d7a48863b17825710d2dc774fe289cc5dd105d5632f1c9c4621b0a028e4ee134dd2f9f385f8a381203f10a29d9b6a41a1738ee37001846aef544bac0cdbe1b33ae2a50d641dfcd55c5c1ffe2016b88cb30c1aa76dec68a089b7e17909fcde5674b5fd21114805fcb49c26dcfa00e960e94f1be4dbfb4d03efaa43377f23a80e825356d85091416c012d5d38d4bf5a544e75504c07d376b9a983e13f21e585ab86650d24d01f1dd667cdfd6f94ab1a891914321dc86bf3f3feaae2214c868531597e254d3d3f31faac3f3372995c07cf1177edb53a029e5a79238fa7fafad2d42099563f529e535c232475adfac70abfe862d450989836d699670dd415e18761d38b92cfd5c25b6582928812d3a5fdc3c165481bc449db362782ecbc7ac9a2b14b6dfebc01772243eb1909ffb2b52ec92f47c0c9d7dcca239a4ea42d5841a52995c7612568e5e5f2c70b394c757026b566b2f180dccdf5ae9f44972d63e2ce71f0b46c352171e652b9569909ae4574be2e9be33111f47747df2ae0fdaa7a8cb8fa3763d429cf35eedafb7bf5aa167cbaa3e0e1214b225cff29951efd831f6ae62116dfb31b7315428500a0a201d250d5471010539278201f3b769276197efab18d2e6225c413199a5354a9403c92da594a31485da6e9cba170abdc22ba2c74541700a53dc0c63875d5f643eb5080fc1fda1963acaf731e839d79fae02577f7555e47d853b8d0230744ad955aa044b592b9d37e933516a4dc0fc7083022190e1180a630e80e26b237a7eba254da0fd34aa648185ba06a55058b4f060f8162bb48e1e38007b99e84bffac302726c3f95e1389d5d638be820500df6b8899dac675badf1a8f5e4c0f2a03f6e45230f63ae28816c53d20601731ec50639d8d9ac49a3e0b8dc3a689f11c4fafa636bb7a8319dfd16ddfd9c8247e5ec703373f39caf031275b6d82c5ac2a556e1d4e7c50766052eefa51fb303497c9265e26473bd7facbc2404874836c7a37d974cb26f0f612c7a2923e0250e2ac149f3c685f36809d7f64d0c30c54c23780068780fedb2e8a1bdec694f1f61931179489fa272a64bfd875d14a28b7064b0b676bf9c8ff26f9dd7157e20a6da50d14200436b30a2e8b6eeb44a3c35ddd06c7a7ce66f0eff2f26fb8fa4e4c54a008ff3faee4713a310958af7a7420d01fd532886862ea24d5bf17043a13d05a417586117dec5659f61b6655f610622a6a477ae0f1bc7fcffa990fb75c08a77deff51b4e51146f283e02ee19f3896e45a8c5274968bb50ba2d85ae78bd11c5c79d42aaa5556cffbe6182aed2ab2838001303e257dd4ed8ffb85948ff96ef6a75396fff0e9b924c4aa4b733f0bd70848ba5e8f789b6108d5744fe7d10cded4fe862ba24a53cacffe1fb501c593d948395c000480b8d8cb69a96076c56d328eab521c04ce07f0433a76884adc801cac13abbd78d673ab51e9382a272c56751daa3db0daa74a11244eb7544cfe75a28742300f73e8f9e9ed0de022991f91a450e32f7ae12a698ef1f1fabac44dcca59cbdf102541b66c9ff81ea760e00d0c2b80d2f98f60d8a35db714ef69eafdeee541841b6ab7bf834ab9008d631084c0d93f6a628ae8348d9dc5983d2bd53f6638d30b4fa7969030949da0c02abc6fac7aa0ab73ead45c2f055ec741840b0435a10ee299e3681b9e476d8bb08b7f85e16100ab7848218e29c0d0681ecb7d9802d531cb4e5cde241751153007f1bb6bb38ae1cd363ebfbc524dad1b8100dca74f1ae332f7f5f48807cb26d05c2609de9fc52c5b3bb6497a39865ced493fd2d75db6108d8fd427598cf85e1c7767f652bea04040bdb10aab687e10058d33cf3e3edd0a4bb28fb7f00c0b4b3b63881c0fe360513868de976d22ddd18ed9f48ff1ef995e3e023ad201d0e7e8b6bbff1a75b874f36c6cb5fe228ae37d0dcecb2ce181e0cd297734c09ae80f0b681cdf0f01c1fc91a6a34d2877e883390ba7f5cdcc966dac7bf13ce9e781e668ce40d03e4154029339720b1da130cb061db2535e0330d49d2467c11715337471a7a44c75b415e9b98407c1255037fba51958c8c7ade5fb5a71166360f5f74cbb5c5a4369349445812d724c90046d7dd9e5db089288301bb306588938a9685682b1d191c91a2128854841139dfe04bd42942d24324dd998fa8685f0956f5d4b5bc50c83b57555838c8331e3fad17c39778a41dd034afc366c8664871e8671abf23a7602dbc7ba2ae178399f41cbad6079e271f2cef60ad81d4913319b002190c744836628d3f4f6b8aa9439a31c9fc52b020003244f91b2b283a50608f7232f6aef498c26f094cf9ce503f2dfbd23d48fd43534e9b964e315e32f3e09730c680079bd5f0b07a1fb58556f7b0fb817f41236570df48498509e1eb5b371dbc58665427ae9b1c17fa0a266cada38df2f334d541b646d588e003e5797302a79428d9beed8b4cb331861f9c5937f01a1cfccd264993fbf5b8c4511827ef2570a389a7c0a713f5e7b4ff1d65a9e6ee9f7717a248fe9fad98251e4d78ea380998b3f60457dcb251771ac41b62cdb6d8179dcc603768541dd5c60679fce3e4ae58739ceee1d0d0ff82ddde747b57afdf2dccebbea9a16327be450a0d23b03909511d7b9ff8a7a152e588236aef6fbe989d1a0a37dcdc071e166a8fc505a604627ea94155bf2bf80bcf0f33c6ddf08ef73b1fc60e7f47ca2a00add07815b0dda8c11a90db3242cf8fac4b4e4191b087321a91bf98bb3cf1bfac299e3c7aa42841c2f5cc6697711b67e4022936e182846d127d09c808f47f879619f14c052fac4a207b05cff61d226e37e0b4b3fb46a4e7812476c03748e0a575929ffd6e807326efce450b097b7bc9370dd8adc4e31028bbdcc651647de8d80047cbc441a01a93a808e65a8d31028c2e9de4087b89335dc55aeb7f73249ee61eb400f77ef7e29b1f2692e61cdff7fb566268be88afe891fea828fbc487d31298dc069fd61c688cf8b3350b90ad009bd397435ae809d48cd607a340169a6386178073e75e353315b818e3f572f0408f3b462d2d9fa6794982d3fb374330868afe69180836f8171097589921cdf3271b3db48f96ae409ea7dc97fa2fe556f0d4ec47a8789faad2b1eb3aa8b79453f95c9aade23581e41a7ec75f3d5e5af041a11a8ef41370aac765e137a3b0ae61a4108a3d518afbb8038b76848edb09de6f4a80e37b772800703e4ff7fc623addf7d972d07f6f78167663695593922f5b8172694ad23486d59a8b207b792b1c7a5ad84bc2b7cd8f6a5a1afb40de5989de72b4b5fa39702830283823fde8dd5710d947398677f73035da2d91f5a98b2e4f17fc6c411a6abd2909e9e75f465b4c059a20b4396505f68452102adf554acd04b7501224ed0c2ff53de1c5834cd50b038118f4004fb8ba37da45c99b305aedeac586f18e6b101d3a8175f5b71999494e679696fd13189cb85520f5d05d859faa3557155165c014c032a4dd3a2dc0548ab0aff0cebb6b93f12de164167d932f3f0c20fed67c5a6f9324f45ba3ea0874dfc53f748c61993e4f0a429c6f6a4bc346120913d68d8ef899652bc0aaabea1a319d2d2a2753a893bd7f5d555594a3d8d979b279a3d0090bcbe507d9b1a413f1b3d6619d166ee3ae17f7f4dd5e5df62e6907d7540feaf3cae22b030e908e898bf4f3dfc39801503a49e89171c1d38c13519e55111abde6278f4d51c1410adf281bf6e2c121e7f31d0ca0bab1e6c9085dfb7c0a06b075a71aff227d06350ec7090bf8265f0bf119ce2d95bb1bd0e543a79abb22d2bb2ab9b01680d5930f5c62e81b5663fc55bdd73acece910683d732796c210873c9c14a9079c517cec5f808166df1b0d769e49ffa21426d8604b125591eed2af2c2ef79324dc0523e33c813af0ae1ff8dbc4f272dddd1d1f3fc9dfa13d17c4e2f855ba6ff8ca0ca7324ac6b4d800b856826d84a3b9bfb0e56da89a7d616a3a8f9317119c3c750d2280f0d2f0831771b26ad8458ed3b0b2c2b279bebcdc356f9e282f34fcd4a2955c41882e2592a7831b0ccbdcea9339883dcda760221fe6d228e2826535e2bd70f947fa32063eae507b8ee60cc11deecd0eed64ee140886ebd23ce0f2b6b38ee3fa64d766cbe9ced249ae5302c2a6020b7be0b79f87eaadb313341bfcb17451490fe7d04a76a00e964dd03a1d165eded0258bce082326466e92e9e82dd974a98f1b863977726affa0103146cf06b8c054e22ae31397ea87e1db669fdbbc0d5ca6c78eb83102dd4aa5b6e32bf68004207b881eece5ce562907e68d61df7f169658df84c85b77ccb3ed41c4f3616549e14d9f112d251762bdb89a2e9822b7e34cd3aa4b86d4a51b37a25cbb24b8f2d2e3531a17794f7aed290e7a56359fd3e7dc2134ed3087436070b32913291420d7809ae0aac1ad2c01d75ab75bd3ad681abcdb04227bda0364db164e2d940d86a560b05916fc166ff512ae0d11eb00c9ce341e2c1e59c3894acc71b24ddb6be813aab7be882910d96c0316ec66700bb21aa4dccc903edc988945e992c2b2618923792a90718023671448666831e46ed6d8304677ddc75459fdbba43d191416a9ce2870e2c2bf11ec58c9a87c8ba6063ed378beba80073591f0a7f24f48374f1e3d6b29208a451960b1344cd55cf521556ad73fdd63be1b264cc51491c028cfb48a3a002738a030e1c52dd14537262dceada0b9bc2c3a0bf4316597e722c1f5cbe79ed012c34449d02b026f7ab091b4c36df468b7bedd9ffd05563b55e47b51bd50583b8b495d9633fbe58cf297ce76a1b4a83f2ab27f318364c68b5569e2eb0309c48b3f6c30a7a6cbc9caf5dcb5e628cf0cfc32e1fa55c4c674181331e16796c3b1fb100a8697c49c81e1797d60c6d139a6bf0e8897ce261dc936f8ca2d1828f299aade4d7ed714600ad4a040a5ad744f36add73ee3735ac07f5e18d2a361cf4082b8153146798daec82ab487367ace6f4bd01bb0fd126b56615ddc5ba30ee68e66f191ad71e310cbb8dd03ae3878f9bd8c5a0dfcb9c542b9359024c3d714c9524b3674f0323794c0ffe255568731d6538a5758870b85343b8b165acec49913d6e70414ae7a5fc735d33541d9e1458c9c64e74128ddacc2b39dce349dec64bece0266e5f02fa841c753218b83197e347939a588d5bf2e28ccd63d6607f5b0c160b5ccc29f0b68e949ba82b1a6e2eae6420e7cdd0f01c77a305ce32a9d48341e667b5ba38177b89eb68020fe4b562a3fac28032a43bc08eb15a759d6598c308e6a8a024e90663a792324c25e9e07fe44c8e37ba495227c694f2f6be8980f197f75f926b3e031efccaf7979ada67e391abc91c8f9584adb9fcd7c65ff1105a5c32a66f831fc459ea5cc3bc312b08afc88f4e30ac171a5e935e01c558d5d7f7d62b2a46af0789074f095a3a3794623420828c519c39470324bb54d5d56a630a9e5c030e85c343cd79460808a9a6b45a3d9ad3343e8fdd77c95e58088b36250b391fb7e4215cabb1b8924cc35776d378aeb7f26ee98ce5676513e50fb1bb0054622fe61a80c05b0e2b95f69de2270e40f870d6e2fc131150458ad704a6f37ba0924d34e5058cbe9a80a1057929dd88800a3cc4936c00444d97f442f68a0357f941d8450b61ef8fb318593a302948d3c2769a32de54d9fec30d6ecb595b610473e541e819787da1a77cee793c2d721c7769881b8c3c450a29b6819d64ef201b990014fda0f52dc9dc58311902ce8b6b437f3acf40161f3344290198a73125b8c1228f9ebe8f2406165e10ba6440c7724fd86c519466dc789ba938e81a1139685361c5dcca8dba219b19868687bc10ef33a3ccab0568523d76ffb1b5de0aee0741f87baede2a07d0badadba92ab1289528c8f3dd3be1fb97beb6c58f7dcc506e79b9dce99595a26a2874b45f3017bd007671443098ed3006dc1921bb91e412f5a89e33ae88c530ee2bfbf134a73ca5b9a3ef01bd0bc2ba267d833e96716e1ee7384955e57ccaf55751d1e67d56fc6ac1d1d9eb40c61d5a9cb4f3c8228b783e3b1d3e688eecba4c97bc674f703867df35134aba15b102556aed087d13583c287280287c1075f41a5d5c837a9c30c4d1b8d035ec5446a4f1c462b35ac96ecd7a5e8aecc4747946d5142b4bac99b3a77fd1e0c5aaf54bb13cf4688d670ab11ea105e2c9f57b5510599ff816c21f9184eb062749bbcd64503083ad851de0a2752dc996dd50e38ae8a110e1917d9c5df7eaac6c8f604bc88a7645a72ce716d8edb5375afbb857b81007c928af67e90c193d77464112e1cf702b54f839d6275a8cbf70c6c6b9da761b4dd26b7b12b4866707f676c7ce41c19ee6613dbe89ae06262c4f7ec4460bc2895882a839b47c3863b3f46e501e8f46b5b465dc613522692ffb552263863a6db789a40f64c40bc5777c09e34fe04a184ed9edacc088dc123de2490a1a1496c77e8f7884f106cfd6660a65c21a7237059e4e757439948d864224a3821d89bcd00eb40d3cfad6c66b7a949f85f0afb6d9f2ef4a75741768f3a969e534ef60af242d97a6d0fe809c88733b10883181095881e7c6a248a0ab7b1c99e664b56ac31ad8788d4068ccd2b1c2b87d3d50b8aecf968b253811c2b5c6c4c0c601fa04e26f2c286921bfd0e8b3d21ad51c212458ed961f4c5feaa7f2baa31a96e4bd573360a440ee4d902ee7e83edeaff67d81b95ffd3fef1d3290e0a51651353222cc93f3e2da42b7cff8d35cee0f7bac3d7ccca015ccc50a7222b6dae3f12066f4fb28c76bcfe53fa3e9830c524679e6a346db1d30a58b4666a6f36c5fd8df792f42212e7632edcccea0e19a32d040295f2a43e244f404bf1d46bd3b7bd2bc7ec5c7500dad1eed408febb20950f9cffb048879ed7c1d9fde0a5cdfa172f8f1216788432b29e0a1fc2ae3ffb3f57e24eaf1a6baffc7e17e5824b6c3352ac949d03f2422cfbf99de109124807aee8f4390c760d107d802be880966c91d34284eb811de80d2ec087cf732cfaafe9c8c1cf32532368055f980e7ce83769e667407351f4a7910615cd030d9f42f77f1294c3a6729ad143b91b7f364ccb1db55081ed572132364450e04e263151f54122b212803d70cc41600934de21a8e23800e5f29919b50aee5641a6883d07182eb891428e3af5146f7b555b5789212e1ec061eb5b42addb1de1b57bb8438631f33db60d3f218d19880b37c1ab859599151f972dab7dbd1cfda754582b0ab6c71c470a7bc62625bb50d369046c842acc8bc84cb1c50e6e1fe45d1e445c7728674dae29ea8da686cf54cc0ec4ea717b8fcfff6716e951f9ee31f276adc312375b8a223230f0835715abea884bc8f8be9104ba0b9752c8724304e18f9fab0668e252c5b44fa933854e95e86b22bb3c52d4dbecf2f3775ab4e5c3c733debf9babba3cc85dc6f61aba44d01729dc9a40f2ae8689acda3f024ad6b97bd7691d61c724dc012e7234f17e23c3a07bd03ac690e1168de1d64634ebec018c332d5aa513df7f5b63110b7383e16044ef258d04ce8f4f7750c834126bd170d0d141b55fec5b9b2c176606d3f50f6b123aec6bc17b9c5e504584f28dfe41d8748d839a5c3279daa15843ebf52ce3c8f3f07a5888f4f06ffea6bf69aef83cc74b2dc152c2d869845301d44f1bfc46f7705cf161a52a97e03106ad503e49d945171669c5ee655f6a344fc9e2cb0c87473e59e5c22964ff718777d53b134e7a0d2a13c37e6a1f00dc3385f81ea9dd2c3cd16f24edb4e3c5647e7f3e2a3077bcf92d79b70078e9a404aa0ee583f632353819c8503789d1850ab51ce01ba76b4842497a5ce5ee4f56bec81f1ebd3cfe3db70719f205cafc32eb3a215fccda04c38fb65b7d81e8545782abb94b61d65ad96026ebec47371f3ecc0ec62905f9d28d80eaf587beb23682cd245d7bac432d39e3baf7975ced5b1ee689515bc066377331cc1030077f349331829ee9017b5af39e2ea9503409b15cccd8dcaab5c2b3f3216d3a40bf32cf1e304b42b693b06d6743954ba65e6afa8a35451b3f3c47bf50f839427d049f1d2d314985e796a8e539bb7ea12f5dd47c6d6db1f44d124b1856bbb72ee928d71cdddb163aceff2d1b9332bf6b8ed5a9de20574a5515a83ac839865260e5b5c578ec3cb8658c3076d9bdcdc424064c8b2aa807b8b6d4bcbb2d0813e79e1c562e9ba4d5344c525ae2ecb8de84676dd61e80e9f5c9675fee277d96e52a68592d3beab520b0cc426065b5ec19922dbc1c6a43870a091560c6b580354764e2335d4ba6775051d7d96521eada5615c48f91f485b59570ab8bcbc8d64a2f54ac1eff48d7bf2b2496bdc6a30e4b4e389633ab8928254efc38c9fc08d7e8971156eada43c1218b66fba80258566e0ac873a3f4fe0022ff85e9299ef8074456e6638aef45975b8b2b49d212c7654f2c5c3158a1d00cb514e42f93d984912c00f5c65243605e57220064fa785342c6cbe7a2eaee59b870dc2cc0fb0c019621f940e3d3844af5b06d14b531c27be062a36fa46d703734f951dd8b1905af21eb8a42442825d29e6e2356b621000f46e76984fce8dbd7853121061068f1f3b524faa3300fd358b8a874af0170af3d592eb6f65ab710e3c3a45d888edfb36e6ee4cd5a4c85275662678ba55b1874446787eee977e0a8ade4887bd73193c15e8a2527cc04554c92afa922cf45925463f82c17c232ffc50a9f61b4bd01d6c34694693b7408d9cd48a2d202b60827f541f9fffd88b9d742977a0ecaed91bfc690262fb895591769658c919d2c4cbb3799bb99d5f658a9aa13b4d8d85921355084e0d2c78ec554c85117ff73bdf471a7a040d5e92362214005e4445df805901020a45f2806b15e9621de1a09af57cda51d83537a9a9988a2fe923e3e9d0c8e6fe402025a0158cdb67118e2b2ac921c862c33d83f4d7d6c3a64541fd6ffaffa5ae4d4eeee7ea1201c42ed552b51aa7fe7ddf42c8ee9cbac4fce0c449f0a330c5230501006c4ad4a209fea5b569637af0f5c522e094c546dbc436d104457c640beaf63e03f8d0dcb81a60d2a9c367103b8a5a9925ca67b1f98738aa69663c0457f1548c598f20e1c689385737c2c6179b2f8db7896c34ae5283817eb09e2b541fba55b1e6f291718c93188c50c90ac9279b9f0dd2ca6b47de5c4c29cb2f9f12bff598eb604ca45056e2a6b2e17b7cdf7a9a5f3d5c37a83d61b8d1cf5f27a0c65d3481c74507110926778e087041d1b93f294ede901658bf1c29abe11f73491299b50346bb667178e1d3affbdaa5a278f8f02b1d3f06c982a0bb007e92b865b6c68aa27ddb9b3703f13e1e8d0f718b345cb70a084365c4019df4f81ab04ed9a483ad411c4945131da08bb25e33a2a495d915bda9c8c059a28404c25cf0fa5c41ce43f62da4c22a36285c4f7d48592f7506de7387890d678c4c2dd81472ba967b39a3e564ecfd245b08d759ca23f83054e4377bdb60fc332c014ee1470a5b74514361d34e44aa6137d9e800f2d721ee060d6a45cd96fddc4456a727e4e8e1f95b6c761040fdbe3e5e306ffb4aafa68845105381a412f1784875781b9b9919f03fb7ab4d24133bac64f8f562cc28166f97ea3a998126f4a31c0da36feaa00d9df8c730c9b1015dd0835a318dcb33e5e4216c9925c19c68117c1ba46fecf7ab1b426b465318653c0ba4a17ea692281f190d40d376c3bc9fd6b03710d99961e7f81bba53e031c7ca06189e51ef22283424919a84b3e45b3e2333e96b4cea06d2e6e1b0fc932a45be200860275bf9ceceb4e96f56f57eccf99dd56875237a210c449846300d583d99f7cc446485be9c3c50490d9d832525849e80b53c9deb0c0a74c7774bfb06486d8f1f9628ae707c2e10e6d7324dfd2392c718d2e5a24354e481152c14ebb5e560d0fa4ca3e10c6811e9f9f48dc2de70effbfc934b56afabab80909be525a52760326231faa48da80fbcd02729a7147d14d59eb2a14b24f52e34af27d81e60b164f88eb091f3f05bb584e0a8a8e654b7c2c78ab1af9a7c6ea225fec2a63283405a488eeac5863983c70f90624b836eba9fe59b109440a293602a5d51148378e4fc4b0a580002b8b16ddad8f1109e8f6242b696023beb28e6647ea32c1c65d23875ee0518a7ad3bfa0b2d14a29897f45c6557f0fd53d8047a4c87935a94c5521b4336208ba10b8df17955cc3070d614f25f6ced2587040203818eb245246f16908f098c1580abd5e0b31408f3bfc5f0c626ea589f414891a0d33273816f19a5834604011c06fd27a90e0a74beb362a182ca3bd38065e2b50100e400e191d88b4539e7c6f9ddb9d9db55c5466a4bacc3028354c34a1ba40b8d1fddd53b100e84e0b0a3286d8b95018961dbf3497c7a773050a929f93f8dbd03c0a48dc3cb3ebcbae33f61acf66b3532518080e6c254f417cb2f1eaeb81ef483417301ed0d3df47df3fc00823c0f40af973a414f5eaa16f7902c08f9e29a08b42d399114ce0f7cc5806a6b744f395d77c80a884977de7f23e514eda0e971c1ff54e9f9ae80f660135e2f5b93bd1f9b68d6a1979d97ec9f39fae5916e0ae163345031b5824ced552b22ab2cbe2969a22a51c224d0d5e74a8e2bbdd0b30d62782d249270acae5db66e250cae0758f72ee6e4a656aac3c8e7e95236e6f21cd1e2a632c6e750c6b5b90cb5a61e4002668875810e64009dcaacd543cbc85bad554ecc3fb6e3ad65fe1ff664fdd30ab0aec0863b5fd98785423d830edc19406d099090645f02682ec88491e843c189c571f1bcde9f9bf05f0fc67284f14c1aced138033726f490605e6dd88bf4ba47fa51dac0b7152d7c401df8b6588837810ff0058ef79508fe6d363eca568aa1f672b1832ac9239c8b44c42d738af11409852e2752f7e8966b91a9fc840b19df8e90f1ad3023f46de47b8c85ca2f7a676720d543b6882216c2a7e31402f26aa3c3b813cf5183dc9d522e32c704bbcd45199dc24f81a2420263d79ca32987d3f9c98515ff205f4ee48e6eadf09bb11750f7695acac45d8b5e839b2ae193f3e69186d6fb8fa4fa28693c6a7e4578684872ec21711193a27cac3201853dc193323b59e8e688eb7b47d5938bdaac0e653dc6cd2d0becf54031d003be1448ce113a2a017d5734f224d07e6862be509c16e524fe3f7043c5caedd8a41a5460de4ef760813d2c31621fcb76968bce28915adfc676de69a1c1cbaf6a701744353dfd63415bb7c0ecb7262f38be848f80259d12c5754f36d8217f275eaa60afa733871b4ecdc2b4c2d51f6974961b027c477a5aa04a902f94e0b013a9fa314ba67859014c1738d0ee8caa719bc94b13469624b17b43dc2da6c9e9e644b053efd8c210aeb6a4f2f85687db37cca096743070d229e015ff94557fba2db8716556f970ea3d6d8311385d255e2abf2fe18fc067ee2ea213c48bfcbe83b452b7ca257a6e8ceea4d9e5531d2d7300653047eb2197c1418268f79fd33b6cc1bf9bdd37c47b810cc5bdf952ae8a95e7cd517a337b2d0c20b1455d27f505761907bfd6d74d4c57730616eac030c5747b52ef8f7319b86d2b262ae1c1f48310f30093cfc3b5681af616fec93493948005d8ac483931bd61a459f4a05b6f6574a10a490c9968890621a0c36bed6b0be129ffde375c0b7f28b06ab6f73041048b924d965542040607dbe60814db60718bb3b531d3d5079ca68f3f4254ad890f05e30677b702d8962787da2031827f6b80c84433f7c305c30c51439129c2d8777d52e41ca8703ca567e348b7bb3507e43cd96a2c686820e457ab2ba9a6ebec88a4bc3661b5322549764334bfbb91cdf1b200105d1d394063fea6f967a215dd65289cdc8a683dcec9e1e112295c4105c7b94c66eb1c8fcefd49e581b08a2768d94b789920761a3034fd7c831e6c928b72a535410e922679d7f9870103a10475c082c688492a2351c93dcdd7237fba930ce55737b9048aa9bb9a8384cab83359e1e77f77ca8423ea248ca89d687fc88646c1870274b5bd2b1f9ba8265280e04c36a92643a2b7da9584a5918a6149d4b677051b2df4152e8a22cbe7228aa65bed62d359a730ba57d4d04c76370e09c03db78ee07e60b1901ba2b2c30e7f0ebe2ec9bc3f10fbd54f97e0c06909e0aec379cc4314a0ef70fd571d7cb554b55663a24a4c16ea98b55adb95d17f6bf802858f050c94fcc3d88030e9b3a70e11ee6c6076d242ebd4056fc9c15346e22e55fe41f97f4642f517a6402509f802e76ae1f7b8a9c80bdbc451da42c5e008b4fd013bcbf9302225908e0c34790de81379ae0e6b1e61f3fd68a829ed24b8493e8ef09d400f5414cf47d831d529536c7bf7528effded70c2b9a919225104d110cea09e184d20c2c28dfbab816989a53461a6a6473fde4d20abfe93ca7c3f212d4b3dca3fdb11676254d53e218c1cbe08c10e07d9af5f63fde2ee0ef7cba05e6389a4251be895e2bdc99371e20f1cb8d4bb382352cfe615dd2b477e041d52b416ef1492230e8e5d3ccefa45db1fea9f7d7e80a8c5dd2e73f7b87931850cc73e39e6fc4b0f15ba66026ef397dbca5346c87fb0c8412ff8631229d6022e7aded37e38a73d23b5dea417dca08bd7c7f660bcd88c66f72b045a476d1169288bc81ecea31e9394b2ba4d87353bb9b264d93689981091839e5fc4262e6e6f783f59a1c7925aa35ea0e157fa8c00086ce9a89e2adc749c01236449a5dc643892f8f3b495df89b094990ac45c84c83dc519ccdc9cd7e61a70b811bb91e622eff6a944d841998998f7fa5f8f99d9fe5607346d8caa4a9ddba3b38458636e1f0bb1f4f1fe7d6cbc0f8df57765bb03a34a07b82f1a75193d15b9b87787fc65a8fea0db185268674532735d47d7f8a57485b8b962219295757f907a22738b588d599aed117c980ad1cd8403ad422746b3c8e6fcfabec8a73bd590b9b37de0b465d5b427f4bb993050109520e158adbc292ca7a9c24b42314ac5d689bcefd3be7ab4f613d38c11a847fe152805316d8ac8c9c362ab972d0b22218bcbbcc106b37f1af8dd370b72017fac4718fa00f4eea5cea67e27db247028f79553e886a1874694e87161750660048ff0c2abb5183a09cc20313b4b678479b8a79d9d0682e81f8094b7bd22b4c84ba4fa1144a5ac2e95e02967c140ad6be9a344dc16e3adda52a5f95c0a2253655c02705a1e10f666ead9d3d4949e2b13764808e4d0431a0b8a7a81221a8a85350869c23991ebe7d517bc6b23d777789e1b20d733aa79cdd2ab0a901c0053bd2c7c4b771568ee8bd7e235e9944ce3bb2cd7ba18d5cf39800886828e41158e824475f9a6d050106329081eea615c97ff9c5f0bd7cf748a8072bef8e3781ba2ca3bc34e1f56ec0b4405bfcfdbb84f8db44c6abda9d3e98ae19eaf02114330d9d8873298e2af115a73ab3874fab2065d44242afbbee65a0cafab1d2249b7c8f21191ea6c9e7a0a0254e703e4822d848a8197ad58e242c450c4c92694a59fb16615b5d06b5182ce679206b295554dac6851a6edfb98df895cd779c21a87f4e6088d3c984af46f0f846dd6b0f3b3249599b5c1b3f56fd31cec3f31d8893fb62c6fc3bdb6a914e4917f4cf925c67290fd4e74f747450f4c73fc1154db0d758a11728b8bae35c1a760ef6fdc030190247fbdc5087048ad7b17fa17059214175e821955b2a7698c1162f7cb421057c1aaef636689d9ab45c48a8e9dc430138473365da929104ad42487ff0171b86b7f37fa072c623fdc376167ae6e80896132e4072d995e895ca155ac36e4f19011fdbcaa685e4510f721f7884643e71a7b072dede0005b1b953219d49e5c85c2dbecf6e5295768ef5690b6cc95edcf83db81a08d0ac4b7c7b40359e7cae426b8f5c84d640975821ff44729100007db1289d66f9bcc022435f75650c1024694fee664d66fa2949d32edc3cc8c981ed3277824820b7246d4837c2c8e08244fef2d707d31ece4d69b05f8ce60568069ed67e1668a11b09b2f15549418be3450eadac83405190af4a5d150503cadf9cfed4db1496dcf129c36c1c4eca87fb9a7d76a82d45fcd8f8bbe3e0feaa1483f1c9300677f9d81e6a915833840c1fdb6c6f110540d7fae437729c1dbd0eb544c190d864623381c03c5865505d2febcbeef54f7634df0e7ea9205434d72f4968690466ca3e5a292032b2c7af4f5f6ff2817562c53e428837b0848d6c06bd228648e1d9a42e420561f4762ffd2026695c87e4e62b6be77989624c262907cd6afd9a6091f809afaa4c630833c38627b97fa9a67d79cce0114ac053a6ee67aa10559cf63e7c7d281e2ffdcfb3f650a358bf5a614c4d80609255b08e23083a1ef4e1fa44288692213ba33ce2d5de0669b6dc32382b1431ad4973dfde8d0892648fcacd4e4aed08e85e79981007dd84f2b443eff4a29ccd633a5c342d016d901996c9f3485a05c08bd3bcc7f7f4458b9a00fb1515725423d21ccb0530eb5138cbfa95e08c25c81887517089e9cd7be5200dcc5a781c1d8481cd519c1e60a32e1fd78f3c2ea629c19ad08581d680c4c249eb7f4af23f9c94f42f2bfd990f1d76b98b19c7c6c0c6fc34266091c9960fe0831ec6daf6c229547d15561b23b262ceaf613d9b415fadde6feb07336e677a0d74e720250630146fe63f7ecaaefe01728ce941ccd0440f814f0d1d7ee8d4cfe5f00640093005001254038a099aac545270009ffc8b948be584736008ba09b7ef7641e80522d02c9786be47f0e9b86b5881f3e512535378222e024f4d9b227102c41433ce8ed8093341f5a4cd4d5ee982781adda9259a6c440cbd0d536c311d161dcf39881c8e433b4683ecd552630edf7110189de66abd17cc6e0bc5a2c4d6c6752fb8108b3ca629cf3af0e251dc413fff5d130a4c5a97b6f4403286d63ac4b16b0711019e22cde54ffef068b7d8268549ea89ddf4abd4f1581a7d2c8f9d007bc3fed7d03a00a2d4e5819ca1b5408a3f8245dc8d532ce5794ce40bad84462658fa3e60a041c0643899c1a9a8e5565b88c8f5e788307682e0f763846f8fb4563f6980f3026e5bdbd28543fe3b6dcfc34ce002d410c5f3eb02956bc0e06e4e7ee144fb1e7260b6836257a32a1a78d4002153567208aef59ed3c8ca172e809e447e22a510aab8a5bde5d2101c03c27952a2530e8b18addee1e3e99130a38d4bc8662f02a0001e1ac70fdc5fae32696b14b27d8830c9a70ca3bde17eaf50465a3208a3ba1c80852eaef1a275a7e31c393223511dab3b18f7542613e320d23658ad2f251c4c04543d513fc947606289993424176598c13f64b4a52e56960f278f0fe82b7bd50ed1d419a374316f03cbe3a18d069e5ae9102f7e23ad7d3d1fd2d5750f5ef8f9638e82d28a3924a33f4a163e1498a1e28889ddfd0e88238990657181459d3d0213a76c0501bfcd03064285f0681e3b4939a60a8adf17112a7b24368d00cbe245a1bb8153e98b42a4c9e95c304e7b7c6d5ea1d2636c36584cc21334b2074cc58df317d0e245d3eefc49104056493f4af0ec2cf462dd080a2b934c1619246703125161f94b0f9b3070c45df6ea6af7bc33a3481016c434cb6acc7f32402a10bd6d914a67496ae3a29ec960dbf193efa4e892c93cf284d408d2f9e48c8d52561c9bca27d86e6c1aea2d632da34010852e508f18a2bf639e01054255f3f492aa2322339566abe1fb7378447047a243d002958c7dca4d400dbc4542af2244d9a6dc60dafd34659bf441a93e8fe3ad152106854b41fd4ea1af84f02bdc2be68d6c8f48cb4a688a6ae4ecf57f85629b1479be84d176197a3f91896d89b5d51492af581694da3bd4a5edf5e1b760b8cbf9103cabbaec38060efec29d9b6b71854ab10b02db2088b05ffc37e60bafcd3d5a3aeba272fc83f49cfbdd3d5d2b2e2fb7556864f3c54ab4c6b01ad6fc630dc375cb04061c44d1d38cac3558235a5fdc575cc87aedc7ff38276a71f2f9dabe21adb0f33e6117ecb8dba4339c25a29118d1aacb9c36afef15df53678fcca8a6d8f2d2cfd039c4faa727830a0690b121dece67905a7e67380ecf1aedbe914cce388760033780f40ee880a143b1830a0e2593ed4b439f48003a5dfef9ddd2f02dc1f1bc79233fc71e5a9ceaf89ca1bc58127ea1b2a835f4dd9f30d76eb075cb0b54490f7e964cebb77920a9372694a7f7187def5e7d10fe60d83f2b1b69912a0287baeb53b621932da68fa4b70b08b5b0ddf828af861bbb84141c14ed8d37297241ad5ff52d2d2d1ee7700c5fc4b65865fea76bb0b95c972443101e3410e1044c5eb0f8a9ec2adfc0ac98a631e166e7a954f277ec0a9b133cd82c4c13a3030fefe0d1fc31119d781fb64a70026c921c411097fcb1bf94a571bd784e3996c7f0d95ae76ce78d56965f2eea89721e281564b335d88ce3cdb1ba786a3b6e647f1866937c3e68d5dcbf706362ea83aaf951a6c5ab2ec7611ac637577d7a09ca40a4c29db00a170b1aa511d49ce922af2c54b21ab5a5e4059638533f1ceaa4093e11e4438d537a771fdbcb52de6b4202be0de7b2c86a03e64908209f4dfb7ca1062c27d473134310f801b265604be0db876e4de65a3733cd5ea2d80b60f6cdb604d0383cacabd5d0a9a70b98c9c98428f3e809fd83816557b5670862f0785ae1d4d88803782e102619dc82aed453a81facbee289e0b62115c526903505621da3f0fdfae4581d7ac689667bab2c22028e36035b8398b2a66728e8592aee291766e1511044a864f019f01573be8188b3a9f4b7576cbd67f3e10e7cc251d041bf4eb66349a520c3a1309e5c5e7c90efda7083a8c684333b39bc5f6b669ca84914dfc146093af77c89ed8d9bd52f0ac527041f411fcb9ea29eaee1955d477ceb16c541081c468095d5db9cb4609f301a26a4477a35d8672a2eb865406c3a89500843d3af1d469fac0b918ed5fae6c94e043d0e74651f5ea0818b34e7aeb175037cfd10fe96cee937cf40a6830ab1ec947cb3ffead05f67bedbd2b0018e40693f87741b87a6bee3c73374aa732431bfcc3f12b8f48b6c40d84ea0472577c5154f74ffc3890065cc0c44cb66deb10de7bc8728f91a1c3fd77ae968127a19b007169003ccd599e3009deadf143ccd6a3de6fb2062811333c61da5437e914c5d36deb998225f348b53d5efd11d2fe2a374fceb23d7196d4a6c70bdba41954f1876b1be8c4cfd5bb3e7f05acfa1b32f3936e5a577d68c2ebfef8b1ec8dcf7bfcfa65d43d0a4646b442b3dc7ca76fd14428e599f8c838cc6abdc706b63baf4c4301489c3ab09627aeedb78f7852556838f3fc52e49742573e944974bc1bd044029dde8d23acb0c1f4e0b963821725efb501b59353eaf850f70ab3745b2296b87d03341f278f029fbe3cbc8f3d91a5fff2f4f96efdcf3c29e51bb7278bc0f6f78b9b27362ad421336ee88cd5f2e8221c2d2420c7fc2c50a64fc7abc77068b3ed81eb5ce64313e2656cc097163692107717bea07e2b1d2b41a7a191e2c3b360a0ce304f9a4e179bcbf892eed986caef5c14ab8fc85a2d2626c6314c578b21d74793f963aaf3bbc75792e05bb783b2e44ff1ceccaef8e75d1876ace4530aa79fb2ead3af6ec7f1fdb92cbc05f3311898eb6cd65c20725b016466f9b5b128e9daea251399273dcaa346ffe87140db7dad381b32c8d2cc1105d8b8adb8ca78c4798935a75efcd67ac6cfcb347b956998503a5a711e06f721264be62f5e03aea91838a933b2567e409d4bbc7d2dd1de4ffa982a6acefc70dd76c189571070cf76fab5d4628269fd51f389b4249d64c8c74a633e80a3be44620e348d569a733003f288760307e5b0f199d7adf3a11e82ebe4b0311c14c5d504522c7f5b69420d8958d6d738010aec6c2ab3a2d261075255e13395993156308c941ab184468d6ccb2d89d5403e59451d5050d4b382cc8480da0d3dd8080a20509082142325263685e806bc8f4cdef71f7f7eec3c11bb940a314ecd16c810a15ec28d666d4cbc1e05398224ebd40a94ddc82b50e305054d4c5921b1b546cd0c5b46fb913970fb4fb730f05b717e01407e3d57877d8af4a3d7ad6a591a4f503000c23652c559a314a24b619cb32a75ac7c06c2e9a8ee250e07974899e27d9679621066cf77e0f834a8194f888ce16627a3ff5c3dc2adec24a3027bf6b30995797e6e8aa02d2465376b3a51b00f6b936943f8549caba77412375381f60fe50b48ec1b5f025e8b184eb01a945f5c835c1064fc812fc865b47f956fe684468a97c1f942037f03a5a7de74318d48c4aa640c4e5290e377d0f3df719b142398b43bc3b49501776f2c9435c955c9e49a38e2ee216f0726f5a8790e2e3b44b573e1fbb3f413c0b00b0f6f24f30f4bf04da1252c20f8bc2e2c11871508d7cee96842ffd933e1efbd5d21959691591134345144c23d99a76570d1a0569021693d4a4e9eb8bebf72920bd7129913b68b399d3170ed96fe7e0fc66e4a9f0a3a0c1c37f1415d9b492cc080e89794cfdae5d5e1e2fa0828e0e03062fa2c4396cc0d3aa80f33e6427d91299f38c44718e264480ce7e5e517d7283de3d2be6adbb31985595cd34088a62a79675b66874530620e4c65b45c2fb4cd0119b2f627baa0924b09073a1e4280079bdf3eef06690a0ae6ed7e3a2bf4e8dc4ade24ab82ad89be1e66d470ad60d0757133d54d30872e0d1beaab797efff8185f318ef08db6aa3ac09e16a7da7286550bdef631a5e05467c48d1440647a829370c4eceffa074ebbe215ef709ec9a71c4e83947a7038264aeaeb3149a48c736f699d9664e0123261c6b660b57fc16fe46b5e92f5c1f0fa5a45f75ad7d2e6e0ddd82bca53a1241038712130c04fd90496345324f5a317170c427aac046fba57c3add2f0c455f79820db709734f31ef7520a9652e01b62db251d6a1a1b4c568452d182cedfc56015c5150149904593954373456fa91c42689a559f2604eeebdd775fa88d8af296a435db397fab44195268fbcae9b706e1ed6347a1e82cb3982b6c5fa9e42abc745f767ccb23044bf3268cb8937f6d52b1345dd554a568808a1a533ffe3ebd4568b750efe2c747d2d9062334daa1cf93ae2a90be5aa9a589608b20b930935f0f9bc0f7b7efa0b63e7521aaf63a4e7affd0057b3e7db0fd0bb5570327c931e4ac7fe18e24776ca1599613c4b8ffcb67a7141f508a4cd4ddaccddc8b79bfb338e4b14842c7e565d7898c6ee3c705fd911ec2ca254548b6442ec46959fe649e4e7a826b20e2f68c82462dfc1403b21a1717a5c170800c003a8bbb2b31301d25e86d6240ca1d80491685025b71b4d1848f47caa83ab0e288d31adcf836c522c436fbd39e9c3b1c007b6d0950234ee5b75ec3e513824925c7115a0cad607e569b30c1f3b5e7bd8e818b9ccefa105d82af18571405e8279e07b9e2e6268ab02d2d6bfa633b1f9d008002c208206b9c0fd4bbc4b979e8e7dccfe8da9018e90f7e7996737e8df2bbf84de034dab3c4da88cbf5e3a5daf888f419d022ffc48ac53de0b88b0d5e12df0896c3b138502607d7c15ebc8d5edd673c7bd494ecc63270fd08bf73bac988978d367985d574984c455d8c7ae709d8c1c4334edd890754976b009c0111379665e600fedf7d04fb3cb53ad4befb99f16343a9393f76473e3e9a482ceeb396794f8fa9632ebec6b19e8a1ff2b23862272ee14c8001c44cfaef5be0e663dacda75074853ee8b1206909100d8599a67363f9538806d70f2d8c40ff2124e51a8d540f97b6a3fbed45d775fabbc3a65e352d1349d12e3418858ac2ea1ff1023cee56d7c0d054d702fb3e165b22c2aafc410127736b429eae68f32085ab58ec3ab7ee0d0c8072a15e0178f0708b05455458f0ce450addeab60cfb262134d60abcfa86adf06df120283f72041d9c6e8cb2b2df1cad1c327e7ad1cb6592fc628528a00598de058ded34e9c01706d65a5826c8fdb9b8a0ad020260fa6c549a50cd3a5cd0cf2d761383db82cade6d4aa30c170dad4694ae18196847230827164da38880eeb21ee124a200c803f2ba9b9658d9c1c65bb02ee0769ba8c46a6cf93fcebb93223fdf326d4b643a29aac45c5349326285dfdf55475c2396a6ac5a60437a45bef9497ce3e94d391824ec50cbb10f75069278002802e679088492f3fe3986e112a760c197a156be025ffa9909797091960174cb575879480f42a95e45a6f4e01c775585bc6829db597cecc9e6a44dc387bdacae6bc1a93f4e2f9e0787eedb05ef173ecb05afe972446c84b1810320a076935a3b5455f963cf83188bbdbc01e82866dcdf341f734f06dd22bfa85f8535ae4eee5680d4735a35f50f00f09c0eedddae4cba43a77c4223d0c97a92b71737d93d1d7d310da354f6ca8c54d443aa7110c8d893d3300386c34e391041eb3cc601621951b9f7c0be2c15547d9f143cd7e0eb72d18b21fe41806ba2878936436c8adc724ad855022334d348031a749c758bd07a1a189fb51ab34002f0e9a7833af2e9eeec13f67ae59de7d3ef9a6b4820811279ff183e6654fe95f674b6f28ec95f86794868f512d45980e1c767560ed76902de86d647c8c982325f0e9b9cc648a7a38a8fb96126de1a862c33fbe78675c541188a5fbe7f0c939e5a3190244c908cf756ae9b18e7d0cd949bc2fd910d739f073a1222cb2516b3151d047ffad38cdb8a2e0d1aab5b277db2840bc2c93b32fd1dc8764d035276e2f2fa345cf6b5d2b6791335259a285472c486258b4a29c2a86bbf0375dacfe62aee06648c7399a053565de8a9f4f472f7d119cb425b8e3df9955d7b4fd41fb2eacc499ae161383595a5c0a2b536f2ba33819f47df59c04e68139e01e5e35a62595af10fdea3c520515bd28d72c626c03718d6c491d3ee63edaa5b2db64b8c91f99b25d94101b5a8ce077e9c5eea25bf55d0a3c92056980df2c94da3765ec8a0b93ae93dcc94a0b1996ad87ed0b4d2891d7a616cff4a65c0232a475fd8aff88618b941c5a21c379d06c567145aaee68e64444cf1c2d476bfa829281c777be02a3d69518930ff2b32637f3e78fa58c2b715e712043e3db3480e5f3fd2f535c430e151d8939e5c4b4cf00603e3c86e24c60487d209c2e49c5911f75cc370d9ff98c7f8f407497f05f3371edf567d847603b8021cee03ba55bbab5620562a5207a9c758778fde96d3281d9707870e7e4f64ed67cf90fb456f5c72effeba7157c06028cde519968e9ff1d8211faca8c81e2cddef4a82e8dca5dc0f8192f1046d099ef8073fc08f104bf6de4de4de52a62465780af10af40a5f5972a725c595afd2ca9dd1cfb72dabecb5e012be9edade03bfd111971b1d71b72c5d2df804e429ee4b413a9c669ee27e04c51d4fad96132a64943c3b33f29cdf5991b91f534af28f299f3cc71c66803fe608caf3739991670c4c849979eae5856c92672cc6893cbf462677c05c33cbf3c71a28799e82f2fc594c6cf2c4c8f28c61e519d352f931c695678b923cbf93c99d2ecf6f59c91d963c7f6cf1c9f34484ccbd144f3399e2e69f8420459ada898cccd9d43cb067c2b0ca3033174fb353ac5534b593175245e3c6169e662e965e34b55695624de3865495bc90288e25845962536bd57cee4f509efb154c13e429aef4729146c853b156d1144196bc28bd724d02668461663440495c9a9adc2965ee6b565f33933b5ee6be068acd4beebc64ee534072e73ef7aaa584f2890a26ad541132f7632a2873636de5134dadd54a4e54d4e7ea8f35abccd557b93594b92ff3c4a13e69844552ee87898cbe88cd9fc895395a268530408de260a0c81cee3f4ca4c8cd30449039dcc38c2163e0dec19e19c2cc6060949c665cd76a15890aa922b540a2b8eface8d6c8e3e7cadc7b1efe1ec4de93fcb927b9fb1c1d713b5054bbd9852ff2f7beb24432b9e384547dae8e2577bee75e4ad5d7829aa4b2463f62597247f463098ccc5556e6de13e1ae1e915f0b6492dccff591dc3fd2d4c612181daa8dccfd48aa652e071032f7234d2d732fc2396632e75402e3349339dcb717a24c56b86f64d113993033b9339ff3428a7d2573fa45a2cc7136c4519339dcf3e08ea759e67e849965eec7d36c86ae697e3a59260de5ed25cd0766cf3f0e8fb26c15f73d872f75da934aca8d6ca3b627656f7e6017786c76e27b838bedbffd0f2ed2df1e0810c9bd41eeace4ed13a0838b3a502326dc9147de78d8b0bde4feeac8dcebb8e8cf3d0f1787e40e8ecc75b2cc616efb4d05086d16ded0a86d9433d29037019525b7baf37d879f96cf531dd15b0bcb637db9582413d5e8c1b72816a9028044f5175617aa95e4f9fd006092e7aba5a7405cbdb0fac81c4b7f13fd047f5011f6b7b83efd59c47390c903307a30a9cbf69a4ee1b5ccb94959b78abf46d1129dd985ca1f6d785dd77dae4eef9128b4ad7bef0cab944cb9210e8bd228caa351365827dcc9639c630d7d348a3e0f1e3c5c9c3cf4e97b3307923ecc0d6efd910716dd77210f1e2633ae0d1b0472b394394468ae4e6e7f0dbd158d6c881fdb14cdb2ffe546dbb3474378ae22a0c9456872e5b0cc9e6b0444b1e4b8bbba46a8c068e7eabfab6b44cef68d43a8e9d6347505f6740966a2c91c98194c4c7e071393e10848e6b8fc49e5d3c468742055a417490612e53fd27c917108c91dee676272c7be8ae82da64f7ab513241934a160b813221ca42db2cfe860351393390e138365e7421c4232c7df64850bcbce85b2ecacdab9b2f7a8ce4c67ae14e68b46398c0c26d628bb82188d4cc405cf23b1b2fc29cbd26619cbde4fe92c42829921a8d34cfe995a6725cd344a52fa3ee79c73ce70a4df3ec46133a746cde4693dd5a33aa90b3c6ffe4044297f435079ceef5e97f33bcf70744056436e488edc0dc976644372b723950677fcecb7ad6e9dc1bdf88be2fa7b28027b821862aa52ac70e1d1196b5dfc3a35bf51d21480ecd3fd6776af6bcdc9f2b727eef8651d5f8b762cc190e5572777fcb26d558a7ad729370fe92b0056f01a48f7007177b928905a4120dbc6626d20102efb7ba42d8b4b61345a96ce7256cb5a363494c59d2f83585b37ce67fe310ac91ec264ce0e58be5ea5e97c535cd17bd2e56c3aea66a9bd249bd249bda6737650ca9850aa8f1e3ba06cbf8cbc7ddd416994ddb6b9d5914c902dd3ef4cc3d101b99b35cafac592b3a2d6a5df5866beca6f7fb1cc0cb1786f5bc1a7a013cd538d25cfc592c7abad5befdbbf71b9a8f2f66f5e2ed6b77f0373717b9aeddf28913bdf12b923fa8a4f414d83fd155ab627211e9aa78627202bee78e3339e80b21d6b62a5a14ec11d6f7c6a62a00fdbabbc047da87fc31b1f4fd91b5615772c0d592c6ed3867a68be2e2ecd8b062677beb74fb385dc11bd7d9a988b9dac9b654bf3bab30cd4dedbbf9954e6297be3f3bd714124b7e5624dcc53f63ddbbf61b9d86feac2f106168e37af6cbf26369a2a0aaef7b5c99d3f69aaa0b982f424ec2434248a2485e40488468749349963439026736c1477ec682c9963df4bc20c6664fb3304c5f052c191fbfa10589bdcba9239fefea52948d509a8242477bab72fa5ea448644d91f4b6964fb34415364fba596dca15f1a5a9942b6bf222477488f4727a0d6c1898cee8b6cdfbe680a5607a32e96d241b63fd2046594926c7f2c0da17c644e93fe6d2cdb9883d9fe0d93568d9ed6c4be26d6aa893925d7f378e3530380235b2b6eff8dcfecd147c61b56b63f41921037c2e0b2606d72e78f302e20342e9963291ad9fe88a308d93e0e20b9437a4b833cfa165564fb332eb9e30f02a1c922a16cdffb60c8f64500183b5ab6dfc9acbdb7937d3880e40e7dfb342e4bb7c8238c2bdb77f0078e4cc3544ce6d83759e1d6c480e0c8a490e6b06c9fe251c736ca3e98caf63dd10722b930b45cec6f228f35b16c9fc8cc373e72a7b3ade941f712fcc2217eccdc85289963ff878eec8558dc777aafcdf68649e7ba37ac46d9efc21b9f46a1b27dbb82db3fdef864fbf26443213b60b671b8e1c9d3d8529398b3695f1d62526bdd515ab555da8f358d4c690d6292471e6d48b1fa409a214593a782e48e976b1999d2713b92e91a99d629648ac64c8ad6cb63f541a6a3bde28e35883e35652f8a924f0b777ea5b56a0b2b2da851b406d595cca9341eada20fb3c4521ae3c51d6b50a61d85d6f6e9d7345ac53dfd3ad42afb744aabb61593566d6191997b58ad123dfdadc9e6a455321d5e1126b285b66575044f9ec6cd95fdbd1b8008026dea6076c36c183831f9c66ab58a3eca6795db9ff01fcea04acca73ec2a851dca01fbcba794fee2869536a76a3d168400041a3d180a0d168564ca137e8e0a9c959195851155b9256b58afafce1863366ddeb8e9256739126bbd1e66a818167bdef05d7df7b8e5386b651eede2d4f9e4639144312c2584dd69323b6c85ecb34aa559ee7eb9092e7ebfc90811655683b5a25c3a83d79826a57ad0bd3a3b5c1248f324a9e95fac4c9f3e7e3cc1e33cfff4eb387bb4c148f3c51797a5398b8378b43c2a4d6eeb66d4335f8d4e053038bc9f4d9b68fc9c764259bcadfa4941d8e434c503612b46f5572ee9b0ff95ca601c47bd00d6e437629dba1d3797bd48ca9513f66de3cefd9f21636933c16e1b66da399ab20cbaba237dc83d5a3559b6baed65aabacdd75dbb6ee29b72e3c79aa49f4f43bcefcf44eb4bd7c153c4d555cda8970e5da60a20926aa4082568e8b1900598eb3631ce18b15508108b5c3325d48040190c084c5230a8df074159736ea45dec4e378b7f007fdf93e9cebc289293c44745f443731042ff068e16f84c7136109f6705f44deb04c0fa20e77a18c1712f146788cf0f8f0ed0b79f274434c793e8787987986e304394993b3abb81bf57088e9eb6ca6d8e63904eb244ad6c9527644167972e18beef340dbaa21df5c327bd4efc01cbc0c769d8fee46596549902f1c67fe46fbf7693752f991e82df8742eb1200e5d06c3b90404023ef7de68c4813da35168924f9a0ffe683467373388bbf7e1acf1cbcdc47273725836ca69923b99f84fb0d2f9db199e4cbfbc5f7fac2bbae0053234309cf942e9a971fa78a1f41410909989f88072f940833cd51f93a12f4ff58f42daf254fb207dd0610462eb29e9a24c0fe07f6028657a203d6884e77bf0c19008f049a1057b20fd1712f13d29949ea2b191be72b7b2f712dc61f28c4294a724f6e129f920a69fe779d89378dc5aae2aab330fd391ce3cd572d1adbdd764fa1f5179a4addc51dcd185727f3f415d2648fdf9359431924567dc47c2441eefcc8fb46e9c11aec12d785324bd4c729b06ee91781ed934d8ef943d7d3fc1d10894d862a7b4525aa928fc48d8768afb8925be8db2dcfb68eeadb5a18ce86576b04714f2006917777ecb46a11a352dc77de638111e871022776f45ef494e148e42703f6c184a1ad256715447d6399d1a6cfb041d9fbebf10e9f2bae3cda5567da6d9a65695dac31de8a0e56b050e2b7b525c4a61c8f2c7091ce451963f4a2899487882d241461e798c918d904709f40412f22883b2cbda136264ff92c95fc745024cc1074fb8c0064aa002143cfe37b858a489377c9ab821e58c1f1e4765f9f3c40af24a963f4f30b9433a745e7ae47a963f4a20d184db59fe289164891f258c702ce896e5cf122f78f70f483b8c7c20c60f8ef084da12a05084096cc1441557004d99820b201e3880021d2ca103d816d09801114a3b9861031750018c26d0f081154320e28916ba5083284628e309637c3b4cc1460aba60e267052880412181138ec0cac2a7096450210435ca50421a3518c38d266c0481013cbc087251f1022b204101107858d9810152980c7581c4166e2034e3e1892fb2f045cb096fb4b1051bfc6087151396c0411b515e5848430c232f68420b2a6a57f00212301f6406cc275dcbe6fb5a5b4f1a0e26fc2c093289965c99209eeb7baea2ecb7df1163e451277b97023cd3287fafd9fff4ca37598a330c971bae3cdae05e5fad1a67b2f099564d5a42714a3ecff7ad07edd2b3c5bb449dc5722bad2b9f15773ead52b6c6cee5ae62379feb6ea1808311e89900c8cb4285bd75daa8d6f7893a8f65f9f3da0e8f3c4e59cabbd95651af03459f159644b9bba9a0e81d3fcbbad23267ca1cfb79e1d6535efaa4143d8b2bcb53b4bac88f0cf92d1bed5a79acad2ce574f9464b9052ba4b4b896545e59246e08ba86168893e28eece6d9febce77f9b2519486d4a935c3dd694b955377c29dff4d7b8685c29d4f1be55264b9ad76ddd1c093a7d1a394ba3bc9051cdd982e0137cc2e0cc92457248b2c4396d103f5fa438bb5566b52a8d66a4038800f215a6462642c47e7533967ac0d3c1af539c1f1d956d5aae2bfb9cb2bdc49f3551adc9a34b83484e83aeba1a323c8cc602fdd8b03d37c7506f7b66a36f5893fd0ae6a6acc3ef4da506dd6bd9e40290d699db9cdccc53a05c8c35a0b1a9addda506dd6bd648e7d422df77b4f6f25f303abb5d65ab95aab0e6f745544dd377ae96ca9ce2aacc22aacd2ca458bf7495e7d91fb7dae8430579b8e2a7279b12f5f37744d30d4043031b5862b9d95a7d3ff89685dc417a3237385fb261dbaeac01ef792f0628aa1f198afcee0e2a8b461dd1a77d6cec331e95ccd9ab972b17201cb3e3024c0baa12b612b54b8f7f4d9c6ed50f6acb57bdbbabb3b1ceb7b9db391684a299dc1f556583a0f7ce94097af653c9d729f5a24d6599df5ebecd03c75160489dab66dc534eb045f4c96cb0ef638cc1793e5d3ca4d9f319fcc67fda5d3d1485d11a17a32132482a826a5ccbeb4d274fdab833d5e2d25c39a60683c8646e6ab33b8337db797dbdc4239ebac70278e4fb6aafae406e9ac93e6ab995bff272748676bacb3aeb3327048028585fe24b0c77d729dc966b3f58326d350549339fd56caac933207e87d306785c29ddce65fbfd639e7276714eefc9eedb3576d58d98525ac262cf199724d4341d7e58c309488f1e48eb2fc5112b3819216f415942c71ddd216fa07f7a50960dc9620ac71c11d2ce10343c3678a273e4ad4e002162e4b963f49486921dc9be54f12657812d766f9930414efe28259fe24d183a1bb92e54f125af4142ecdf227091870e18ab2fc49c295440b89576581274f6369829b94db53b0a752f74aa95359bd9f39a15cfcf0fc707539f823860f8ceae3a97e2ea42d0f2b4b09a3eecf6787899ca7fb24b5c61110ea93d69822f77f69b4a8e272b04555664d644c626012d894dc2aaf8f0d1520af7d354b23f6529935a438b28acbc52ea3a3a8b414954e43a5d950e9292a346ca0963d4412e593fb19c5ad4f412038b2bf376732a73e888313296273cb9ced457e828ca7ccd9b62244b37b64432973b66d76ad1f3559f4d5d51ab9d6a730b9e35f558072addf65b448f295dca1a4d914191bb1346052481d25d7aee58974b0466eab04c8fae0191bb19787a2188723935c2e72513ad52fe595068c8d586e6e8a2c779259eeead3b55af216724145a074c769cf69a4e46271c35e6bab0bd8d34a8e605902ab85891529b4520a96a8a01163b9028afb8495afd82339604252824be5c8cf92111382ee91319880660891cc70e2f3f104a0111598f07c2c6106fe1ca929d13561d604a0ef1ab144040598b7c412364aac4bc1129c8f282c11164c6c42f60647541f67b0b82e5ad48794d6668427dc071356558a4ffb50024d8316c5074dcafd41a284abfa70c20b0997fd39020b1c4f7853a36afbe0081635e2d6acd167dc2f829371696ce0ab0b9382f6e2aa64f99344094de27259fe24418282fb92e58f1155985d52963f4644c9f387708332358011403f4620b19269963f4620c9e3fd30a634516b6bdd368eb35634f158b3e881d15c5f9de77d967e2038b2f493f9ca9c510f090442b3255d7b55e69cd25359017b56c0eeeeee9b251e82ca3d33f1b7b8b84c97d2ec796979797929b1acbcbca8dc979717d2cb087c79f9bc4e64b9971cde141e8c18f7f3e469ac5965fadb4bd797650dee480a2205b56a46a1b9e83d7d9210290dd210890d10c9ed9648147d2abb2532a5b49f648614492d990a923b2d99925840851449b316e4a0288d727247d22c88048504d42a92ac51148787492e4fd1ef30290b4c8291b820c5485f348a3ee9d528fa2d4c72d228fab34651288da24f0222cdc02dee489a9166a459a6db7c992d94623411448a3225d327d1aecf6dd2e2a4c1107d929456c99f551a99925a99fe4862a396e974638c3cde55a69749a624a14c7fab93d46ad5486a92a9ab552369366b5593568d754572d2aaf913461e495728c0c7ce894cbfe9a4a4a04cdffbc11dd2c9beb83123a909b5c99561b811d41847a6ab5cb312c1a073cdd90e02f1bcee1389baaf9bd96b6fa7b7cd721cd843a4fbd111d7b3b41da6224ecaea238ac99cf9262bdc194aeeab4fe6befa74aead8939e79c4e1ad5d5d5a8aead46f593b2d75ff7cfb006ade0fa8f35a84b51682ed62f6a6c56835ab3564d28724726cf7ee7b2122d2b87c293a71186965b466b168daab046f5d3e42f83d9ab5da7acb472a3fa6a543f295b719920d279ec62b3c7ac33c8fdb4f653dcc53a1988e47631b9c392fbbb2f5a45bf42e954ffac515d5bb96bab554e5abcd2637cb48fb6f5e5a28c0edb6f211193a786326f84c7a1b8df593e39028c4cc3b19be5e672f745a3c22e76e48e77ec6230b428229075b2dc5fbb70877432e9004f9ec6198632f7de17c5c5913d0781e0c8f6dff3306d9494bfc9f7e4d7b2ca30acb257bfd111b713edb4a86774c4b53e9e4dad5136531ac5fde8884bf369760282146166a71a6a8dcc4d21737f4223732af95484cc3d0c116c126e134c5278353217c27021730f3ae1aafccaabfccac75a32c5bdf5c2d1de091373f1e4738a650e55933bf649b52f7665a3e6c907c5fd8a0a9e3e3ead62d21c8b966bad36dd936e367640b9aa541b11d8534ba552a9b4b24232a3bea4587a798afb59f2a2499e5f9d902cdff2a59fdf751d2928cf3a2edf2e3fda5ccb2d1f539b79cdc06a663333335f43bf6d4e14192c0002917ca42cc228d0a289d58e9a970e8fd51d5b5a3a99e6c3f049abbcefa71fd3923be0770b242ac615f38299c91dffd19b5a72c7fecccb2bfd1853ab41332d312d90312ed237cb8f315665e5c7985aeeb7f8e62573da756a4c64dcf1b240ccc20a4b3299d3dfd13aa16ea8abe1ae06753ea421d2908b246bef250191d2903b6fdcee47125027e67e173cd6cc727f0b2ee1d159481f263257544678f4235b1cc1a3ed3cf39ac9026ce3ce70d128116021e41a6f50c1e5a34124770c45b52cc6bc3ad531afdc1f66d12acf430801820f78608890b103417060031ac800062e6001202a4081094820021078c00f0ef0a1013d3080871d74c861010a48000e08087203901f3d0730008f4df65100020cc0861e3b35f0105534ec98410032e8c410809cf0b10e00c0d072bd60b11c3217897c7f8e59ab48df1fbee48e938672bf943d484332867efb1e0e3efd0dae7914c6f91cf8e661c0a84fe11caf03c3f000c0a9c71800ff58c73b1e652238c98fde7b4cc3e3cdeff1c7e3f5f718e4b9ad11be4df088e7b21e9378bc268b1a5858f3aa7909819384e08d1062b55aad7844f043e0220f023cc47b0083e03f80857821d8033f047fe03b8085fc88873c0770073e083cbe0630077e033888c700d6c067006fe02d8031f017c019f80a600b3c10f8023f015c81a70006e2238027f012c014f807e0083c04b004de01f801ff0386c037003be07dc03f3c037003be07ecc3ef8019f034f8f43ce01e3e07bcc3eb80797805e01c7e015887c7012be0138017f041300e8f009c80078283fc0d1801df8381fc0f7cc31b00f73c115cf307c03fde061be079f001de07b6f98c799e00d8c71700e7b70113e007800bf03bd886ef8107f03cf0ced7807bbc0af37811d7f03bb0ea69c0e20b00eff819300daf8305f032e0193e0058e763c0327c8803f0393886c738fcc739eff8cb31531ad56318be5a35d6bc72cbac626aac3b86af31a6e622cdf7d7c05cc4df5f13ab9115c117e6a9fe10e01b6b1a2eace655f3aac9227cb938c4f787301785f8fe30e62208be3f94b9f881ef0f672e7ae0fb432017877c7f18e4a290ef0f692e8edf1f0ab9d881ef0f875c0ce2fbc39a8b1cf87e9b958b1bf87e1b1f1735f0fd362c1733f0fd362d1731f0fd362e172ff0fd362f172df0fd36301781f87e9b988b15f87e1b998b14f87e9b998b13f87e1b201725f0fd36412e46e0fb6d683642364336b5d3eae473629d5a27d7e975829d6227d96976023a059d6827a1d3d0a976b372f1c70deba675e3b209931831dfe0d1027c242c8fcdf7dfc06e6237b29bd90dd0cd0ded46e866e8a686b3c2f1c161e1e0b8705e38309c188e0c6786038413e4621826d1823e129627fc7e1c9a8b3abe1f47c845007c3fce908b307c3f4ecdc5d4f7e758b988fafe1c3e2ee6f8fe1c2c1771be3f47cbc59befcfe172f1f4fd395e2ed67c3bcdbb3b7eff772ce34ff346785a5a8e7b88799a9008f9830615433c319efd3d106341e487c0e12b8485b15016ce42a03028a48542e15058b359d9f8d8b06c5a362e9b970dcc266623b399d90045c0866623643364535bf9b05aae172c269b0105d184866a37ab1b9f1bd64debc6e5a91bd84dec467633bb01ba09baa1dd08dd0cddd47056383e382c9c168e0be78503c389e1c87066384038341c219c219c5a8e550e9f1cac1cad1cae50f452ced03d8e199286fe1a9c24026f44112b9e9ab7c13e96874878f3aa4142e47c7f15723100df5f875c8ce15be75b86efdf7c5c14c0f76f2c1767f8feade5e28eefdf5c2ed2f0fddbcb45d5f76f3017c56f1edfbfc95cace1fbb7998b3bdfbf01b9d8e3fbb720176df8fe8de6e200be7f13729100dfbf0db95880efdf6a2efaf87e6ee562fe7ecec7459eefe7582e1ae0fbb9968b07f87ecee562cff7732f177f7c3f077311c8f77331176ff87e4ee66290efe7662e22e0fb39201771f87e2ec8c5047c3f47735101dfcf09b9b880ef1cbe9fabb9a8c3f7db958b3b7cbff5719187efb72c1719f0fdb6e5620fdf80efb72f177df87e0b73d101df6f632efef0fd56e6e203bedfce5c84c0f75b20176f6e5a37ac1b9f9bd5a9761a3a099d68a7a013d06976929d6227d8e975729d5a27d6c9e7b4b2a9d90cd908d9d06c823c65036433b391d9d8c06c5e362e9b960dcbc6c766158643a150480b8342a07016cac210169ac8880036b5a40c43e01621700b0870cb07708b0770cb10dc2204b78cb8a503b82508dcc201dcb201dca201dc9201ec8201ec7201ec6201ec020476a90076a10076990076910076890076810076790076f901bb3800bbf8805d1a805d7ac02f0cc02f3ce0971df08b0ef82507fcf25a007e812900bfc412805f6438e0971902f00b5010fc1274037ea101c12f423ff0cb500f7ea91d009b5606c0261f1e6c6281d8d49239fd199b5c3eb0e955006c8211009b6203c026990dd834eb814d3bd8540336f1c026119b54d8440386d9816166c03002c0303260181d0c1303868179aa3f00182607c3e8c03000c0303060189aa7fa5318068561863cd59f03c3d43cd58f83636e70cc09c7b03cd55f83636cbc977286ef4d53481afa439c0339c3486f906180206968181a5c31ae324ff53fae334ff53bae2d2d930a46130b32bd411ec317cd810d5f630e28630ed112ee38f39ae16226e6228eeff7b86854c7b637aee771e625792658f19c9ea8e515f3fda6537e8c451c920d89480a359ea831b934343807cc539522b992f615af4639fed13a0d7e56be77e62bc29656a35a9c4040e66342991e629ee6694222260a9018e3c513f346783cae89eb99664ac2f53cd6f0950316d343c7338313247344516e4bcbc5ff9a1f2d4d4baba595fb2fcbc50fc31a6b69c2f01526b9328fe16bd4e1c03158f2cc6019bcea78c298a73a7ce5ce1e83250f0c963c222cdc966102465eda013ff0e469b42e347bd0b0c6660cfefe4e05b933c3da8537ed2acfd54cc7daeb0304cbe206824693349ac974af1b71c739f4ea2117edbb10cb7fec9abffd186e68ab0db9c83d37b4d5d82c13a179e4865ed9a5b835367b706bc818ba903b5c16648e3f37a4c51db91ab7d5b6ad56c3f151190b7227bb21c54fa686b2202717a48afe50c988ec5238cff63e3a8c3c9e5eb8792c4d149bb53a523a29fdc2954fe7386582d0d5aa669a251864ae5679be07f95a356b70fb474adcf922326eff4c923d8859e3e95a7627b39ddb449c83405c54ab10da28696d1322bb71de7522327cabf89b02d79bcb727bb541d0e40be1e295ce23f744c16c3263e8e7beeed03cdd7b5c95e26e2f830315724321b9697247f4fd44e69c597b6feb366df6984f660cfdfd24f737c1cde3755f102e3a8fcc357b01c13a68c6cac8cde10934a1346af664f698409031f4b710644eff38c5c8fd1e6dda232cbc97a00f93c70b892882a70b1be62923cc1060248bc0948b98721d42bee132ce4747e706d6eaf8e30f9cb210ffaf3f26468c71c8c9b3d87671b997b96d0e2398798634fcc0296fa110fa35fc41436f25bc6f756576ee7b1cd2c9f21797e3b6504815d2e164324d42a0d3070155a8428b35c8a8a2e585231cb182d7f646092e72ff0d6a2266f2d1842c0561ac960042ad8c2335efa70915c8e4168344bf622cb6a748b498bffdc4e2fa9473fa7079722778feb3c796e5a3668f6f9565269e49411f401f52b3bed37f130eb5d29709b27d7f8732a61f4db7d2d932b7c2eb2c4f5ed7e4ce1db8df5e823c88ded6b72e9e807b1196e9c1bee8ed8b420ecbf4b0bde8b717d9506ea1f5d49c3d95a83569030a916f95b7efc97a30ca1de90cc9933c6574ca7e3a73f1ad7593e97fbe87e3cd74962d0baea8bb74f643a77ab4e38bdedb70d4f13d178ea73cca32be86e34c1e65194d5b52286fe49997c1f10e73d1659e6a180e3cf33178cb303162dc9967799af744600fcdccdb199a99b0c2d030717fe5184c330edc92f13c83a5cc81a10965a364b0cc9d6930132562185d090c963906cf8c2394c14314b1ca33211661e871dc08e66530ccc76099b91c62e9298c5b39c3f8bce0d2bbe096d2b3bcc954faad642ab1b47d92456fc22ef3278dea2f619fb9e08d75c565f9ee5d70296f575cef5d304bdeaeb8dfbbe015599e0fbe0b56c9db1577f42ef8ca77c1a4bc5d71ef6f575c173ccadb1577be158d6482d85c7a9b4be118825c7a170ce6162c654e29940db4813d2b2bd85faaa12369ac71cac639d4ae06caa3cb3e3bc467d3800b28dcdf37594dab5451bf19f9253aeb8886251197bb336d557f4377b42d45f2bdfe7cceea93ca9c52294f6aafa5db675d34cde44d3453e2e69cd3abe7813dded50dfc31337dda54349209926b381261abb0adb2fb7b52e67410b4d62a2a873c445129ba49b3644e77ad279803cd3d6b79a4ac1d9ca78674c853bd843bf66ad5aa24ab154faf867eae4003e2d55805e143d2460e3e246de460ca32d02a8e522b32d19929ada220648e14ee38595288cc1d196815e771dbb66ddb36753a2053fd47641b720d9d20a47059d6de6b32fdb33c8fdb82274fa30e58177a5e380ee964a22feeccddf74b15ff7a72726649452a4754bc37ee073658ed02c99d0d0644863ced8f2a47ea06d3c9339491c91c2eee882323cb38abdc1d4c46165a1db09a85d590c984d2b1632679cead8bdcf3cf411f79912dd737e9c8eeccb5513cc011e585e38bc2d1d497d36995cfc809779c404976cc24adda50a69924dded3a54ee7478acf29c4a64aa1f0c1e3afd5c771553e49e4eccb63f474eb8720299803e2c48efa349a1ecd490e80730321cb4dcefd1f9dbf785de772f777067f6be5f7a78e6ede54aeeef3a18591e57f29ca21f37307277b2f01b92396edc91c53594595c7267cef01b6271e57e2efc70d0b2b431e2cd8a04cfe6ed5bdd0f74b22ca43ef56a0d472e468cdbc9f21777ec443f746a68df87bf4886e7155cbd0335e724226fef6df8bdb833d36e1b8ab8f73a9cac46f98bda863ad9f1389b1c4047a7ffd4e2e5c2d1f41bdd5cf9061783f054bfb5174f2636882c725f915b683ae9993e8ddac29d69d4947156909c070f1d1d14ca526bc1701c32245730873bb72984be3f7d2756ac5a6f94470d3a328ca911e7c9711c37b912e48d0479a3a395f50b9e3cd971b6bc8bf8329a5ab009bf60172cdb1be9cf935479dfb1cc8ec5c3a709f67024189a4d574d028d28dfb622f21c8dd8cd6e5c178e4548a05ce54c8251830cb9fe98423dcb931e7c8f0526d71f55727d299abe7e291c6b32f72ce158d3e2f22be1785f4ce14b2865ea86a470b42ea194a91118b68452a6be901ba2886c8798795a4e470f416591171268a5bb24a40049f1eb9bd7e93ea7140eff8cf5143d7d48dc6ed956f66422c5db29f9d4f137a7e47e16692679a352466b9db4d639e7cff0709f37347da72477e4c1c3c33997cc1eb3b1a951f225103d83be675f67f610bdb5a337a1792c62826243aee1b823d7702c5205307b88dc4301705f757c0ac02de6b1c36d68d4115787d952eec8f4ad84b24300b3c7ccd4b7f87ea6b8220320cb9f562bfbcbd3d8b45cb9af459a49961f85be1c699e1f176e200e5da6db734dffa3df928f49abe873d3c97439d8d3248f367f3faf48e28e73169bb319f3397fbe60924adafed3a745c9e3d999dc46999ae6a4bf491685ca9c8f33d9c753768ffbfa203e8df08ce71f16d1af9be08f4a61a044818bee22a691af3d0a1e021d329d55f4351ca58e94b213bdb5960b6bfd2d1c6fd6691b48b9494b374c379f42ed736edbb66d45ac9c59f08298a1376adbbebe8ff6e7c22d1c6d0d8798a617e656df5bce3995d45adefc5dce979609777b3bebf424744e296b9d620c194bd75f9632f5add6ad96320da960a594544a2929a5524a2946e528ad42a8bb57afefd57ee13a75f72234d3300b548eb5d61a3e27b7975fdd9da343be5c4321784e6fc9ffcb2829cbd388cfd9831f2b28a5403efbd3972fae3f9d2f232e499342d2e49c73ced944f0a47cd9547afb6814d22b6fcea651d48d524a69534a292545713f4a29a5df97aa58da2c5978b23d29d9c84050b278511f9a440a4df6853bf1568d8d328060593493f61192f244365dd3c9945a96413b74e6cf903ec952d628f9739276e8c81cd00b9776873a8d0a72037ae1caaf20901952ead4bdb9496f8ee6198e45643ad4281521cfa32eea644a2da80c2e60ce72266908cd9e5cd1ae5e4d891214e36236c99335344442b9a14eb9232a9fbc29974e397d347f861c0c481e49bea01b45ebe6de0577b75d10893acf3fd0dddd49a311a936c574dddd9dc432e79c73ce9eb3594aa59696d9c25222b5b8b4b8b8b89458565c5c54ae8b8b0bc96504bab8b87c47f0ee9cddd3c69de1489b64f9ee2e3f284bfbc61dbd1545ad1bdd2cfd5c97ab6f5c6bed675f266f65f9f58d3bda2ac59dff813dde0541b067db866cb0bcfddcbe46714933a49f2410c84cbe574565e55bd9b6af1cb73da593658545e5b2b0b0b0b0c08cc60d9665d83f6483852c32f0e877d8d475fbcbfe3dc19eece15797b87bcb0068a6060b468c4bea6443d30854ce76295c235e8c18b7fe00a170a7fb943468997586f23dfa838232b2fc91228b2c43963f51fce4eb9239fea0d0ed231dd0dc7eec8e9080648eff588f905632a73349b9f64b3edc5e57a65b908ae03bdb8fbf0abb86744aa016eaa273ce39e7ac5bf56aad75fa4b91945fe79c7386f5b99778c8ac514a8528428256d9974fc45cb5d8bdbc1d2ed2a91682c89008172141a37a00f7122104098a34aa7fc4b25dab80f22613f238936dc8e3098ad70d1463e49f2630c83f51249151507852ee4c2907c0bd10ba23cf6f2aa544356a4a29a5fc5c70e58b985cf9dfbbe45e7252ca71c837c5208d96b872ca9f949256ac9074e69d56d551ee50ca9ca986675b2559e64aabf8a5a43ada40eeb39ea8eb449efd38701b5512bdaed22b7386a5d16824d72e5cbabb7344a0dee7c5b451ae7fa5945e77774aa54bf72abced67ad3450b094d6215b4bf5fbeab3d279044f929620123dc7555a5b25fa592b88c3f6a2b7a3dbb7608fa596dbb8af6010fa5c387a11e656eb9c9392a063e094fa4b7feb9c735c7507837848e97beda994564ac38f56a1b340daea7cf9763eb5cfcdf932cfc9cd193e27a43e8d11e3d6e7c01c68adb48653f01c48afe2067b2cc77150b47ea0f0c9f2078a95a9c11e10c8cc52fee0a7052b1e11156e7f97c415bd0421207a1117ee7b1d963cdff635acb6566bdfb3d556a74e9d7a89fa5b91cd5c68a5b43fea73361c2b57caf4d7b89c0c40b93d0952faee2e3a7245df236f82384829790b857c2fb317e3df178e337f3f5055dc317ce578c940a2fa49352f7b59384172076c69dde878987bc7ded7bcfa489641fb2a7b571f04df47afb283a187237dd1fb70cf361ceb91da9960280fa92c21fe336301f3343dc6a8816c76c1615ef41e0caeb606754cee93239ce4318cd16af81269befdab94dcafd3291d3cbefb0e63cf53ee6aa851cd86fb659564de5f68f104568de9af578393d4bcbc57535363c235b0175c93454dcdab069378746802a24ba874ccf4c6494b32a566000000000000031500202814108ac58291501468c2dc0714000c7fa24c70501acab22487611cc418638c3186106008220411a099a1198100752098bf643ba9124520dc75e9cac6fe2622fcaf8e802a75d8fb8cc30149612b175614ab84742da7af034bee5ebfee10f6b6c32d8cb5314b0e761357c4188fdda93721b79b6507110e695a6ee194d670030153bcb3d4b5d48a25c85c792dca82535a4df304621d7dc64a8bbe00322a54f3cb67e4b9dd37b6dfffbdba4cb60c92ecf0031b5ad82bcce40e6eec2ef43e4bb5742918584a4ae1be50bb3f072b0ccc0e09905ab38cc8c57d27e01d2226d6120e4710a1fa7a8ac72c8f8703158f01e66fe426a8635563eab8e9882392cf7a42b9ce2a7608dff22f6be16518c5ce0767820b0a3d628c7d6599bc01174a441966160038f65c0bbd006113b95b834f30d234a11e4d30349d9fde716521034fdb3e5a85f4c63c342047ce8ab7fd306ecc6f343aa84cfc2f0fc9d4668e2513def3dddc82ccd97fa72dc8f97516b52e8dc7d2a2fd284af3bb2c5a4a4f53ea9c148fa60af93727eb16de43d5eb9d96800ae645c9e99930c7526ee7639bf1b20225b1cfe6a942980211e6150f15646b418830aa16e977fc5fb9883b5e82ab810630570bdac2664a95f875b4c7866f7d26746dbc480a5422a74b149ca662b1d1d8ab7ad7f74025902d27bb2b97be044b71cb064934096c49b34dc4d2c0b7408489d1745e0eba8d9e25a290adea43e32b6446f78c0cb5ea616e0cdfc3d77222c8302d48a7071f59c0cdbf11e6e7629c085273cbaeb0daf60188861cbfe5a3fef056878a7a08b0018a1a1b904ff29ff242279a6f89bfe070c41f791cf3d885ed5d71b3527f07d72e4d04ae25cfa0b88814666d20d2f7c8a5ecb7722ebdda4abf370551319ff6c2a59a9450ff69d8b196e55d240dee5d6bda248167408cd208e49cd1eba254a0c6afb3d53d94eb3b276dde501f5f697626994a5aad59979d757b4e77e0d8cb36d71cfd983484d82b767742a7356da2717eac7e3462036e83836410317706e358add4265553b744360256cbe524406b08f43d9ec23334de74175f0173a65c1a61a8a204d2c76df8e37d92cf178c3b407b25d11741d2fe6754d126830ddb15200b3070723f453fb3895769df7f910d688ba1db821e2731ade5aa9a2daceebe7dcf2e9f99ec0376379a551956533ae8b8152937f0c9f43d57e61e5e49a12bb938625d795880b8edc540e4a7abfef76791a29bc5d3dc3dfbad575d8df487952c0483379d2b47611eef00f9afb3b964f6030074faf4af454f39fefd56f21319e98f990e072bba381e2a1aa18da8bea9c5761a5922dc403b2f457bb5b27a52f8bca6018f8f8931922e7e75aa83446075275fe4e8eaacdc44c6802e3e7db8da837d148abe5c02196fa4f1572667eea061ab1d652a2dffcf0d3ec6bde467aba9b6be8eafc281337627c1e09f7bf9d100efdd0b7cf919db0dd0e249e29396a55dd8524560ff6b9dc51cecd3e11bb7f2c8361100dd39e0cb38070a2f4890c35db2f7a879847c69bed47a6109f3112e38d5e65066520777fbdf403d3d3fa0ab130ba9d4ac2f108f940017db467c0bd95b6dfbad7dc92c1d27962c48285ca23bafe0a97a293a732267ab10fe0c7bf4e4a2433f99ff7f391edca79de005bbdb33ac187189c72766bbdc2721ead217bfb262cff5a4034909d4f371a89250087f7194a97df2518246bc0b146678ba8a16859b1f77b36414ff809f2782254ff9339cf1ade469788adc7b94b256900740be88184e04a48b1b70c46a42ddd63a6a143773c3795eeb2c349b9c772e00059c05ed5f98cb2c34c1b4fcf84de07ac0d8f695712a5a7cb358ae80d938fca413031fccda43847a57c4458146f66c5e6920bcb0895c2f1a8842cf928131d0511c2ecac61ce1da80ff936744bfa3749165a46a3fe9b70c47ca9c455600892fa7cbdcb875644ff4e1e9c2e3b485b3ef0af68834c7f4aeed8632b2b8629994d4c4bdc3d2a6c0a1e69116eca65a64872ce91f85390a1f35216314b5951624c85e44e5ad826a2e6f52f241cd7d709b8391e4086f831ba4d9cc986a10f2724225d721ab9374620812e7647283f9f71218f23babc19aadaa06981009bb0ce2be31846c728a88a7feaca6e2283090345c0bd4f60cc7b344b8d8705cca9436715f2d5be24751a409d9d8d9b8d32f0042dcf2b3cde5822c8ccb422dc2014404255b77092d57dd177a2033f9643f29840994e26036591d826ecbe4ffbf38495f6b9fe0d1343504fcf2aa1c26d03450fadb9b72c91edbbffaeaf73a4d45d023dda721d6697559b2434b1b587f93c13ee4862975d89c8d81b17ba63fdcd0aaba2a4b7996f9f6fb844749a21cff94d40d680501eaf5b4ac1569e06dc00d6304c546fecd2eea1595cb0e7468656a52d68ecc8617f2835ebc551a80cacbd29eff8e81a947c8a0533763c407fa87889fecf415bd17f45f39d01e372f8e07ca1a8905f56c9b6a3cbc13936462270fc00f751944c1ed3d34e9c4ad744e3d0f575e985e2898b2eb286192e339f120cdf62428a8f4e5ab73f50372c2ac80ef1b32111e0f7020c552e5cb44ed28f1b428063d99a37228c4519edf353cf6f7146ae6226453a67a7b1a26e7e0043dc49770a5c88b0b97c689e43b94c443c2cb7533cedc0163c053ff1f3b596ae35bc22f89556169c4a252e6aacbdbd9f64d34fbc91917e92017aa72fa31f372596c0ade893623fd102149269379ec5b9cde0b825ae9bb48e850f3089aba3cf07865900526e705c688e7815f568fa35ad7b93ac2dbe31d7888c5eaebb23c00c93dcc830d678cbba8a75b95f27d547a2c86452a5540aa84027bb689a1ae01efdb17b31f5295c9cadc7e6b13bb39d01db09847d890355c36fdda701e10a2f779aa068d783afbaf632f4846d8916af6bbca5582e25c694f5549ba76a10c7baa50e4459db7a2da05982fa4993c998c00afaacd43a925adf0094f9370e36df7b828643dc83d10bca44beace96ca478a6a4e883a2b9f0544b4a9175831b6079da93ce2dd5ad8f08d32c62501686250d2cd154c7ba84cf464423f741c822e2715ba1c17201db4be57e86e184be88cd51011230a364cada20eda1075031c93286e223100ccfa8c66fc80fc2461a8a58bae553568e46f28b808d8a00ab344bbed5a098154af8c9c575ae82eb836768691fcf962cafd8b3e68d230d69a405f7623f39dd53e1825925bbf7fa3b92b60be05b1fcc1f462039d6b73552ff5d3fa636fa5d333d5aa829eb49f350e26618e34b454d52b0dde18e7c01b51b5647f9bfd464e61f215af5cdd26c5db6bce2a11a06118f01a5657992a5d40a153b8ba5130563c9ec8a4172722f5f43ff244b28248f674b9b5d2ad2241dbd20286bbb66cae1469c8cbe9b78835fb68983a1fb6200a51f38de56d26bb9260b8e57b10c80f22ce51fcf43c523233986eeadb8a960330522e2416f9a2e8f12f4be8865fba79be392194d76ee47841e35c33af0e65468f64f9ce4e7e61bd2f22138cbef9222686010943c8c0f5188f5199d2eae66ab323333878cc6203487ae2e88f11bc6272d1cb2a30b2e4be6ee425d694d35cc6fedd2a438431da43254064775a3a513e734a7f0756692a75f94249d8d3632965c6c52add464ff0ac139626d5696de608c59352c2691511b4a8362566d65b3df6856fc2a972af71a4045d1dd565707faa0c730f363286418041c6390fb8421a93d5f6796d5a11b9b0420054cc66e9226189a2d261e2aeed0887949d5d49da75fe1ca56243d3e396af5710dd4ba6b54f2e7f5f1dc3c46adfec1b5b90909a94017a7014a389265766ccef24172bca8cd54eb4b156f0f90d091f6e81d92fa195cc845b687f1f4375382b7ca8a9f43149aa77e5e37c631aa3affa6328c1f66b678dbdb947a4ca2edb97f6d09977dc86806a5559da8305e5452c3889c4d912eee5258df8665c7070bfab60a8350d74a9d1044a8bd559a4da28a1f391734bc2d88ed420a2ca97b5875304d57098bd05ba9494321662607a7817b8acf48c7dcbbd293167a7344a62d19da3c5edbe92c0f2055c3868d9bb34723a663ce8abda3aacc91842218651ab20b9dc7c31bc6dda796ce9647d04cda1de1dd731b48f96517c5f07975042ca7c524587e784a2f7b0bd5e63ebfd30c87b8168ca7bbb98086408f99caaf9b975cce052ddd6472026907ca56c068a4c8d2c26d6078ae2bde2993edac6978b2b663c82d7f6f6320608729bac12c4149962fa7279417b85fc2b0120d88bda32e1812b531b30bbda47ef06f78e662d3cc101fc88f1b406da8d05b0df0ea125d88125e96069092a53b6503869a1b9f34421862c669e3c217b15d6907c2a2fa8c2c3ef4100701cd913c29e105715c8ad23b6923928750e6645577d7c9a964a82048f64da2ad15fa7a766e6827a59af58d3ef00f1aee4aa480c3f3a0b3c4a30943235e9b5a17d3bbdddbd4c7edb85b923b1dbc4d6d81a3005d82a85e47809a3b4faf4f2f488ac1f0c9049209fafd70bca7d896ece3d59bc6e926d8ef17cc8b55daee3d9a4a407187f4147954adfe00dc1307ddf8d3061f7e673e7fd0904b2bfc7aff004c600f246b1db1f47a86d26ac25fd4f5452a3be3525aa9165aef7ddb4f8fe67266cbae00aba70e580c34f4c01d9cf4e95d1cdc32a1bd2517225bade8a019b2aba4dcf26a1f5a725d6d77b3d4022071450cd266b6bdee272effeaba32b78a204c172a380eb941c4c63d043c769bb84c5bbcc8221bc895afd99b74624148a4546027d3f683db5e96195ed59eb3ca053f27d9bc7026edd52c48390e916aa55f7742485f5927ab9ed0786d305419c5c983c7690b31417411c48113cf01a5804f414aee54f674fb806b5285a67a1ef2ee2c3b5ee51f6483cdeee22a31578847a028cc0950a99eed45e85267d31f531814dc25e880244b2c988d05357c921ff238b33b43a959f461cdbf3c88af8fd90ad933315878d77f44a183fd16681e2aa49dc807c1621372c09fe400643ac8ad8c456174b9ae085644db510cc84bf487a2676d115855877d1ca0389cb8d586728f782b213020fd7a546e33b3b67b6ecc0c2a938de511d1cc70b170b1ae343b41398c051788eba905954f335edd39c1bf53417a5417834bd30caa2d6a1882457e83fbce1f980dcd4c31107f798773cb1cdd63af91b8cff9469409868edc6431320a487c79fbc4e43e78a4b0a18f3db4c25953027155396d6745640fe8ac7314548e0a12b0366805f924b834a6c01097a3001b041d4067c0f27d280ab502802d425212fcd55bb2460dd43d18dc6b581ccb26bc403b448282d1eae3f9660ae0572d5262c6cfc02fa7aa7e8aaf788929a91676db1b743fb75c09351184b06276204e29ed350c253de22d23e2ea18203e29cea710c2c770004c8aa99d3a4cdd38304d78c2e9386177d7e489e469ca1e037acbd63f49e7f0817fe47c28ee45a7c9033ac411df91ebd39276c0d037843a2ba64c98c791b4f1b77a705075f9eb28f7cf001429c829b8f2128c1f222c42da6a95720078d30cd4397f29681098b67b14d0755182cdfd73a8057e69454b03bb6b7c85a378671cc5f1f37569b6544308186f38ba0567884e3c4ef6f88f60cc0233d1202e82469779b33a5ceffc51d96c876d6cec9087db1da108956255c74271c47a38e2fb35a2e611704532b9a8b88c765bfce1764d481a5232264a33456cc91cc3a031e479d642207880b8c21fb351bf65381d7e24590046216a0afe5143f1f8b8e88d17077ce7741355ed04660bf5398a54dfabc7be0acfdf95847fb350c0aaf5d7c891145047f36414839f6f37181ff6cb9c2d5e9d2aeda32e69a10e604d131c6d26cf2cd31ccab5c993c9e01d56f725d16e27bce4a4538a182da6a0028628c275d78e7f7a7cbf0f93691fa67396a95d86ac7aa814c3eccc21c07f39be5ab9bbc66180f0ce77c94c1426789913fe9c589f2ad152bd21bf968869d65e6ba067eb076313762b2043e73d69a788337c46ca571846561a995702ece6937cef9d0fae442edc52d95d746edc6b8dee0e46ce5dc34468a63e9291dd4ad0506b97f212b4329dea58e45aef15dcacdad82b241bedb98ea5fff1a250c9a8fa103ab91d2fdffe47891c0207fac2bcb47a95e7d5293d5347fac1bed9026c011cf4e01457c029528f972839868c38208f40987922420da52867525365e34295cd18536d037822fe416f7cf1ba2ec458853cbae9b89c4a9c44655555b4c1c49a66a31a21b60c5dae09354603a9f13d84d1c758042c049afb4deca7275f43cf4ed06fd991098c1d64fe2a0383f8335761bc6138fac2816a0523c8395a610fbf45470895e598b0f236932d0726c8c5b21a779def839d9aa40457d530432c4780cf1745c00de77bd475c48eeb01a45413a66e4dd8d090c4f7628fc7f33b0647a418c77fc9d99fe0f7a64462403d333480b5361284a3d0aaf85158d429a8a8215348a358d471a8b8a353488350d6195c69416a288158d6195c69336a268ac0ad4081ee718f9a83439f2b256e4e5845180d6d9031e4e01f5190c09c3fba5230b80e9174cc920b8870cfefd04d00a5063b4c05ac43be8f2799a2a8fd2e652eb03ade93f3df93aef30a019a3674fec9319e24a47fe2cebd904928a9d5b39b807a92885e91a0bdf9dd00c9fd55d60d64d60eb2a00b12e1fac9340d65120d521ffcadcefd655e0d59d09947fd6959db57569be7a9983cc45259c17f95338ad80b94f290fbd0936abcf6e9bc1ee1d31738b93a05f260cbe8471fc4e9757cb063751c2ff14f8c72e3db68be88aef8d2fd543e2ad4fed2b97d9b7dfb79edeae4676d51f719760c8684bff966b50653c9b8179cd885ea6039e6a13e2a8eefbe44159dbf1f2b3ec11082e05e263e41da128405b2612e37325414b35877daa98ad27a5daf09e875c67a8ac93baccb2dc59e0afbb20ef179183908a9693645d78172ad77ec2527cb28d87b083917bc343656956fcfc1095387d6c4a4adc1bef584a40538eb60848950ebf058c884880d70317f74e60fc9e71a17c7de03205b79c3374064d23e25f372d37b64110cd8acf688484f2eb391e7196b6fdbec723a5cc38dc23f695ccc6003cc51302b33a4435e0d1997f460faba33a521561011b097a62db9838cd0b679c10f7932b4cca7e2a3f404b1969b27ed6812e7ef0240c82a408cd61a58dcbf98b7d253370e742560ebebb4670c8f1e3b55122946f6d19abf053cb8deaa11b49e7088ab62a709e1ccf24694e93a3b9a83ded86bfb86b570e33641cc4e5e1c4f5a04e1cb87b10582923bd5e6dd53155d5854161c419488cfb044a2c29efa31c300e28f346477eed45eb8eca886d1a68e0959d22c896c27694cd75748cb926bc7a3e892ecfc7add2b48bb4adee70d63c830679c068d6d5c8dc2b2f8ce331036a20c1704d0f15a53f677dcd76d5e2b8b55212b9f7a5f65d056b3c7835fd14c6ffa4ff2ac5aec035f8531a172a5ed2a25649955561d8b24b39f894b7c5f99e6d4cf89a5b1974db7b4ef413b1cb7c71be6e7c17f20b1b10fee77faf9b0afbf9b2f87884f2aedb72a864c25702b8f982528ff6a30c05a4904560581f53cf20a16ab84b487da4dca58ae41c774e4f3df8cc9dd66a278e6f1577856819c938f6955d689cafbcea4783bc9bd6bc08da16af31073f78a9a9306e87d5ed1fc25bf1cb1f5d20d93f4a051cfab7560cfa7750ae08ad9094cfa38429a7e77e3d7a378c845454e12bd9de93889e8e96c3a5f7e5ba72e3d0dc6678d7e35ee6616c8fe03275c985af895143308184375ebc4a0c47559327b4c5ff02a543efaad653a8d53cec9e8d7b85871bb71cf77d6c5de87e9bcd9d12bc29c052b6d2c2341a0c899d1e78287b420e4a6674a073626b9270cd30c7e969b338283f196111f4a22b98b36c184b8403219b696136bf31958466acb6b2087c2e76467ac5e2b696e6eb1a6048c533b445c151aad75cedab938fcf7fd995983ebbbcf488ce0ca08cc914fdeac875a2133b9ed608b84193907551dd6365de0f0ca49cf5686f93ae155c7004cbbd34eaaf11acd64283e1ff2a0763d733a289497d49f3dcada885be41414a62534027c2b4371fbee95ac1b34510661ea82118417d0dcf328dbb4007c7bdd93683328d2620d0430142a7a820e14a91e98bec8494556aeb9964d7dab481c046625d9242ae8850265d885d6c039933d04b9a0994649e2e209a7088d78cafe311e50a93451a999583ab52e86a8ffda89334198a8410ad8d7003902c62c576344b1bdff312ae4ff9a060ce38ffcf11ff2df0b457faa7482f8cc5d3c26bda6e76dc776d4189c96574900f22c5a2e281b9abbe8aa430a8804c5b8a63801e9ed62cca6256295085921841a132120b448d8f8741b7c0bec4ef0b3899e837f09b456a0bf046215306d143b2706f81f77106a9784c6c1bec7b09cef410d943642161149d9b76dd59469cd3268b2d46debb4c6a365b6c049b04aeef0ed4d1ae49048e882ce005ac4823f0067900a60e2f1283cc55d82b5bb987740e7eb334be780cdf51b0dd866ae1a8582b58022838ef0d169ca08d5ac423b251a97d3d703f9c806b89a8ccc06546ec9f9305f5f9fe50bb9647247f55f108a2bf6a7884f607359e20f9538927a8fe54e12184bf14f184e0ef0a9e40f557058f50f47fb83ec6d0f903292413e1602de8345be0d82456406b48e620fbb5db38fa9b8541bf5fc5f0f823fe74549b578d4bf8e8cec896604e6b8a68a2cdd78960fef044a1a445091cf185198c94a3d051f3ef114aa86b7ea134060ecebb301feabbc36e9af09ccdd302b0c17cddc0eb8166a7462792cca62f7ec79c7ca3256f85518bb126c593bdda055ae36d91c6336eba8ca4f931628de781e8aa3b412684148f9a07931d867e6f608600954dad473c2a993a0947ed3e11d9137abe96fad3099cfc3419be1eac3fe23e850e162cfe5cbe738d0fd33ced39aa86428a30877eada8662f527652541fdbc44fb5226b5e9fafb4c638fd41ebd8c7fe4ae777f281abfce4bb3a4f8ed5f9425a365a4b37083000d214f8a5015c7eb7a73f09474cc107ad6e0daad5832332f50b109f7e763c725907d09f30e8571c3c2bc309f312835056fe29f9ab6e9820d7cae4b45a0cf265dc2adf01efd69e74c3dc56ac151e86e88543001b38ad0a4d51a24bedc87cd9060b1e465f6f349413088cc9aea2cafe6129c1b7e7084cf5aca04a56c300ba033e4f9754f15200962d137d2acf16cea61a33e8bc7d3418f86ec60eaa695b1eaa40d9c026ceeb859a4875717e051ef7305b9d93878bd30c51ee8210c06c70d7bb270dc328deee3cdb3ab04db66620ad2956a166be79889e7ac4acbe060e784a09ed66f1a66ab03440c6644e50d8ea2b23a4a0d508696b664f9e08e17f157f0c5f6e21f2de167c555112d4d5c565dc78d3dcb422a145569fd1dda398e32595c1c692f9e7a306ff6d9fb2db4f208ad2b5c7fb72b05b4163e181f68a74ab22505de9f779b2235c9ef1d434fce289cc7d9c0262aa7200570cfd00108702024859d480c49b9f49a10592bc466e535f7408e2dfc727ec08e9d5c1bfe898f39534d1b08c8a8dab83f65cd99e3a638ab294178d6c340bf06b3a51f060935820b93aba4c372d6e49196d250009132417c9aa99925de905c632bf69191eb0f749f6923365f76b72bf6fb8d6c1e22a7daf91418c2acec4faf995d9d388f896df4041a6c8389fbdf61b049b0c769965e84d7188404c597f7cf51768bb8fb9e34482542160ebd51f98c951e2c68900ece4fe536fbb3c4465d8da1f02ff75c6be0187b393ca804202a09f31e50ef48ba2841f696aeb760ab5638ab0c0117e4ffa4262a3c2bfa95616e68c74b3dea9ed21449a7683ce512fcf9f88b0076ab5977f05f388f56393d6f683bcf53e12568a47bc664b0c30b4305028a5325fbf321da66e4fed30d8b26edc0aa19783ba6412b32809dc5cd058ffafd1a3e5088a5e06b4bc6db158bab896a008d76ad5a78570a33acc437f62772f529a45ba2654270cf704af7ba8053ecafc2240720b8bfbc4b9cc6dd4e9fd6a034237eec06f9ef4565bdd2d8a51fa50f5ffaaaef50dd3598e1fcc3800d1d6be466048f060a7043dd13a21690754e488553540346f074c51d798a83adddf868def6c08f0c065c0daf1deb4de6863a60fe4fd2724176cfc6cbd9236b34bcb11bf73fa559a33256c5b8215060d4e93af375bb764c1bddeb0b437f1ba855e9f691a4854212ccbc1f9a79dfe8324ec906f12359a6992c46b7df2ce2b3708a99c3553cac6261f6e797d0989123792ab1943407e1636975749fc8a858d52b4faa52e7e673426230c082e1912016a4caa47408ddb7d783f2a7f09a72e74671587ec08e8b720123c2308df435c88c10f9b3516ea595787a102ac0df1693a231a75b37826725b57380cf2e0ceb49b5398aa5474a274410ae02f2cd68380a6506f672fdb2a363263432f42575153827fb7c481bc77a87a65661d305f6f0e4fc75e8861ec7e65f1032ddcd2213716d24a84643c44907e2e14d1bdde5c69b9ea580662b72f722a47876b992a585f55b03e0ffe66f90ab08c45742780afc27817d109ef8ab8c26bc195b089b191d7bf85b29772e60345ea06eef1b4604de2c219bc46e85b9549bc3a7e2969b811bce71fd5fb28a0d3c789882bc30b20422d7331a23ba5a52e411f22006fa04aa7e61a87ae45411d2f5876fe4b972dc5a9b1f9292fe54ffe5884c448cf9641e8835028bbd759a16f09ee532848eba1530117f42142efea5da34502c81858d51834e3756dae7516d35b26222d5f1db9c93c11943a1d72482f69e52c1d07349f2cc3317db3421d3cfebdeca637dcb9c7d11b41aff1edcdcf1d052afb453666e6213765bce3f443a352ecc03b23d79d3247bd866c712919cbb36488f6d116bd2418ea7e25a641f44230e441f0eee9f31f9e21da32ad522606729b4e3e06c56d6e86320355ef73357ca0f7dd7c940b6fcdfbd4cafd83aa59d57fdc4ab7bad347fc3f484fae7dc357b4fd2abd333de14abcf8cff05a5baced2259707d302aaae2175ae06c87bc81b38fb7c06a5afd1986170760ee5e23b5a6539c8b6f79298a64b2f1609c3fbd8fcb04585747ba4482cd17480b173633d944f0276f0c24869e434b9b0db173021d8c790cbc95227ba62c5ef819e48c3582dc878d451f35287c8cc5028f1d86f8d54985de8afcd61299217df182394afc1c29923098631085bdcba34ee2078a5a7b55aa904ae95c686ad5c9a44cb054397d910faa51b7124d51a1f002e95a5f2a97c7a43ab014377d6d0f2a4db7ca4c5161e24e0a42cb4a71553c2b0aa8a665292b839f423408a0c7c0a33538e6a091393034872539a03007092000990cc79b83a10f85090121100cb40221591030000090e067079e8f0684ce0cb7acff764cbc2614683c021825f10a8e4e0beb8a8b60f6a7795589c89bf390471b021907ff3d56d1934c9b2a86438fc423c473896338f4483c42e3afeb4d57216317c725bc44f54785f7b67b5e6a6e9fe56b2a7b74949c1a4fbefb76977aead57dc572b772a5a35ddcd3ac77ea16fadbc53dcd7a9ebe4be75664cee323b9adf93df915e945cb0b1c4e86aa63369d71a4f6c6c853a626959d3fe38ea4155f3e55d28f0b3af89f7a3db6b6dc546c976b36fb4abb45fd76b966b3afb45bd44f7b1345d6c037afeaa8a13496d1c7652d86d21effd858aa58daf8ab21a674e39b1a8e5e0ce6296f24d38e653267857b9a66833bbe1c047bc6b18c7dce598e6dee5cb62ddf748e76a09a31254d9cab4a6b4befcf193fd15e9fce495024f9038ae4a02633e0c4bee2cf66d9f04ee5c0ee2733396283d545d38157fabc163da6b683e8f523c5fa9755a7b018bd3a73a23bf400d4b135cf55ea4a2da1c2a115dda3c5bd35f78755586edb80393a15fe506b0ce3f031b7627b9b4c876ab123119147d762d36a2a7ae65666936ae04f5d7f814969761410be3babeeac9f919fb5c305e57530ae5cde948dbad944292d1445f3c4926cca2de16d924375c2d95e0846d5ff03899a47267a5c0ec65d77917a0ff28b9a7bba4822598c0a11984a73acbcebcd5cd49bcb446a264229ec3d648539e48eb40f2c2c1dd29ddcf586979942e44ce2446e7b88c6ddca9d00b090aa09173f2cc5f6e1264b282c23256fd4e1b90bd2f702dc546a894e9112f616e2e9610c1e6d9a204f1a5a167a4b90f7bfb3e92e1bb5c0cb2e15547de1deb71bc863df6a70388d003c0cc0534522b0bf7851ae94d20bdd2174e5242b1a68d72d28da836cdbef2ad404dfd9e69770d268e6fff5ec00a9636bdaa399aaad66bcf82f6e69a3e2a45df853ef97179f8a4f8e2c87543c9e58096a90066fe7c2fa06fb4d419976d625f884c90d4eb57b472b884f8f89345ef306e91d599515910d83ce726fa8edb493d03c13895b89a983f999e9dc74379b0b64022a4c5b60426b0543b381327be11a2697c4d100a84618d936a2106c091b08e8f72deb98d22bd810bbba610777084ef0da7ca29b93977ae68e495fe76fe50ce3b873cb116740f5a433e4c77d3db90e2ecffead743cdee44691bf5873a3887b0a2cdeec8d78db74a303ab8b508bf9cca56fad27a367d695c7d3874e66d04901c0de40cf729500071d2978018b5f1871d613c02d063b275dbe948f2acd0a6dde5293fa45186d54558f133b0e8f5413367f91d3a3eca67231d1126e48938595b07a3fcb470955e26c527408e81d09111c38afcd99d8c59738ee550031a86f332abd0965ca841fdd2f796afc7c8ad2514da5a2bc11d0eaa6dd5e18aca4167dd50182fccccc4ea6f91d03bdadf6925cd7ba481c800be37c9e4b218001ea267eb0e152132ddfd5f9e9ec8db2aa90eb6ca0fd615b0f7af81f95795ba4008c8ceb901e8403087edfa9dc9be27d9ecb0cf03de90d9c38b2961ebcbcea9b9ddcfb3209a2f486d9b3842c75412e74af50361cf0a7dcb7b62daaf514970fcfce51fe3d5e21e789324f141a5ce14f6a75dfbe98d0204d51253f8a484991abc19c670ee2ac0518ab0380e24d5132377afb9ba57190b5e887f18cbd0a28d76798a4aa4461f76ff3f6eedffaab5277d6d16eb2a4763be229ee2737307beaf18d3b6e6dd8e890805078710b60666ffc7ef06af131db86945a03dd82b06e4039f967d8a59fced39a987a210f9f0d4bbfdbfdcb0b3f99062129bd67be44b121699a03adf7cd6f3c152cd0933cf76a5d11ccc7a2798c747d6fb8122f815b1bb33f577e0e012cbd9e68108038ef2e059b0640eebc554e7b8235b23aad4a86f88ae832b7965bc6be3cfca1905f78c46fb6194d77d592553aab1d654bb2ab44ce2791b48234f43b1691bf5bd5435e2878f68591032588e2c6ec0d1ea12f7d13342d0bd61ebe378f8c40e768d72b05ea148f1a329d0d6ca909d4e90845d08272f45ecf1432abd58dd8aba8757ba2e9aaa0c02a538bd87e927c23d602789eb7cf3d213feb2fbfc6aa080a0b765ab2ce27cfc441cf06d1555600f1dd1feeb61fb41574c92879f6ee0a25b3ca5243d0e3799af9cd50791e31aed4a0eea8316adf4b63f296576fd1315bb4e6654db2f176c535b4556dc669eb9db0fed291c086b5f980d077f338ac6f62db71a79afc7f0892315f87c119414f0f550b12a036d10fb7e2ecfd7c55bea35552f827e81a51138f6aba94b501a46c77a1c5dd7829c44c8bd462ea21b5f737d43b5528739ed04437fbeeb4f1d8947d29105accbec8363234cb6a642b19f0d548e8d55488be77507fa701c4c21316cfb3de1ab88ba3af9172ecb6463cbbc9d1b422697445ec27efffb315e106536b4513af613a5ba9c307e61d5f06d2879c5945f8051e1bb3ed227880b7a8a815a25cb9242e9ce231ab3723c6ac27734560fc32061e248495529adc4adeb1808e0157aeb7f1adc9e6d00ad8734e282ed91274d17b7afaa57b2479917aa57d14dfac17d0cbd64d760b85fa7373291a41c18c717d30f15c0914748184b7f97dd72ea060e42f3135033b28f8eec6327c9bc418f20fa2e48391e6c227427fa6eb9695c95e3984af0df15e2795b25d6647183e3826deaec816059e85f03409468f8ada9caf9c765488926e2b08410db20019fd6ac6835f77d77673237b45726791daf682d77839d652373c42dbd137e5ed370097aef8217a5e558294be1337cbc190df0db5539c3ba7fee1f360a458c40a30eee38fcec2701ea573e3c2147cee59e7b7296ec459fb4aec456ea773b87ff6c55bcf2a5cfade6d286e9b115f152833005f93823acbbd9fa26d1ec47736f7981d0620256975217f928d42619494983eb4736fddb6d8360a7d8e24e8d858a8b78995efcebeabf72dd3bc292455170d7ba73a8535d63ca0216d45370980b993af1343b1c419879cce2e8c5ed28c187e40758993b28c2995af8fbb80126448d080c520e6abacc9efd2a6c383bffa45b5316bcec3c6b72b52a5c030cf29784949ad02b69dbd170674bcd7cf7bdcd8efbd1e8191e33a19569050073c13f8c5128fbd5be0a2e5437be0dfb277927ce6925cd9c6b22c306f58753dbb60be5ea3ca4231ba87a180c048700808636c5c6e198389fd09a3449aaa14d93e61e013a089d879f28d673ed2c94907a68b5d074680d02cba55733398b5156368a579b7921e34cb1cd1b7be359e7389bb418768e1dfcc96357293294a50a8cd0d2dfc826b408b91f9e04e9bde17d038b5e1bff50975e8882b56fbe993aefc82c6afaf896b8641d180117d7d51200446e6768139aacad947c63ae86e2822b3321127895ad1e3a86354522e31604604570303832a536706cc1a1765c3c6b05f77d379c630766e5f7d1569e8e7aa18428919adecb6f893daa8aa16a51161a034aa2095733e58c7b6431ec79982e947b8527cffa7cb9ab439be9e449716303e105f84073ac7560cc2d3b6bcbe17976ed339571474180a5e8800bf8f3d19be711a364ef585ffe34267b93e5a393d7538c4eaf2b6aed39590aa265f72a2b4b58d65c26a5a907ed202cca1bab098fedc4a2eae24582fa5b42b2751194af329c4854f6839b5ce518a8400819b201e44fc162bfe43c83eac5bc0fda3099b0d17c6d2a81511e9eea452c5c6b64a791ecc127b2f8d7955b62e386732eb18c855360eb2c41a1a70be2b4586c70d94fe9b3385a5f67dc31b49ab0c479a273abdcb5f753240075c241fb106e70f0ac410d30166d57fa8fef63e63dcbdcef175e6d985c94da88c25ed4272cd9f9e0cb08bfdd53b5c3497d1511f7d33fc3b356fe90be227c43cb451555c773468279e460884f75482e7c78880fd5817daea93a7caf99b63f1d41d2967a9f244f8b27ab5c62f7500454cb00f0c86f0606f0986f4bd1c4d789e17fba75937f7b1760bfc6b22c2361305eac7c0f54d46d7439376e12c971b9834199462415601b59724c340d25e827a629b38aeb1592601d58524b90c88f019e4bc2ea82a2489b54ec36e42e11bef9422eb7da648fd8c1efccbc799089727855dfb32f8892c60e13594d86e53661c1f014d4c777e0bfd2fee83ec0a9238c21d1281a6b799c029daf93a71912bdc9e602f22d1c5232002ba632537d243388137ae0695b69ee3f47c64b9309290ab4e782cf12616bdf75f070390bbb5e8ba5cfd8e2286e60a846aa39a06b3eecf961b319c68582651d622a2bd6bf0c8f35a65dec558cc3da6166c677631745f63a92a65739f85946ab957c838466ceea90e0f6e4661d0d8cacfcf7690178ba6de9a003f011e377a3ada1e6874593690b7afcbc23ec18f0d7daaaa8f3b20f11c9638b1b42878ef49aa6485c62742ae7c72b212516f1aa7a60ed616d899b7e829e5c14d5bb992cae82119ca09adcfa7031ca2fd5b4b56ae8a760e2116e0d73aade8c9c5120aef7385d51785a6824a8143fc09c1b20c086d307ca71ceccff7e9c8fef0d33dd1eb1e6e8a1ce78c901a4f18ec1ef2110e162cff2751b7a45adb39c0bd66b0b9716d60a9e4384b4e27d09e5221951525e281c8092723c532ce8679c3afc224e8991913d49575d6092d0f56ac7efb6a0bafbb9dc1cd2592b6ca8da4c7b591962fc45c91e9d51f511dc8a0bc9220d7d6a1c6f864ae3dd82b5e1c453d3854ab9a534f0b4331ab3f3e0cb50bdcbfb702f69010e7108352b7632d0d527a2d6033654ca29f7b2d15947f80b3fd18a319dd505b220d7789116bc65a6a97a576b884a1655a45222f04284f6011e9472b56c0b0c97997007a60a1745241bdda63dc7618aa94234e3f1812da97d560eae370e563579919773e3695d983cb769fa1f88a4e0fc49088935d98b7855ea7b65fc584acf21189cccdee2f1a37c63475904dc2a560b84169b6e8d95a9fb346f4fd4083a00cad4499c8aa36184f5bf5d0826cdfda58881a7235a5194f9f1030cb01d2c7ed86e6fd5435edd1e0027f1200219d2826040df02f42a585fd597841bfcf5a93f15560349f319c468825428f6d9aba9542619af97ffe19d1c0c2d927d7617bcd6c5bea71022153d0a7db478ef8869418b6ccb3f8588e67e290b4f64da2a3649a6fcae7c17c1547a335a5a4b9bb7845754dc5404c4690d6002b528e241e61fb042b146c3dccfbee80a2b2b52d8d3f4b728723ef68737591b087afe51b697c9686bfeddc84ba6f9e1cd1b06b3e246b3b2de5bb8c1c03601db0c983fe37a7d30cdddad71a93591bc6995dceb85e4d2b146586bb2811713649d30aec94c987dc0ab13e2bc67e75e2fa9e28c3901045f2341da7ab29413bf2e63e62b260dc2f6abaa8f3a9c4549b0d5399e049289ca0dd80ce4100771964d1b51a51ecf2e0d4bb379cdb2320b23e51aac00000012efc34e3bf2eac34d6e1d11fee8b0c491c46942628c806766fcd16b9a8aaca206fd61f0a93523caa85987cd8bfa82bfc0fae55d3d3957bbf7159a363f048926ffb6697f0ecdf49de984a4f39f2cb0ebd5885293074f89f6f0f307855489d5831aae731b244dcf8df9cb9cb2441333e388f19fb971e4f80add5db9c18f4624a4709013532312b6f138cf4de2d48d437ef4425cbd58fea54e428cf9391a4e9103fb969574713db618ecec0859fce31fa312e8e94464dcbcd61a1a470dfa0446babf93384c616688db3b2a70389b9c193fdd6117aa5a76bf709a133773f84386ddcc31b229f22c632ef3606d1946f9315136104e206668a2254414988ce90c044a68a4d4db57a52b530270a65743744e9fc9cb97e0c6a112382a8186a6678104b146443e16d90a5aa29b82ce730d5a12156964c4f944a21639e2901e7cd9d033a21b68edd838d79a5965bf32d4838bcbbc1328b8c8f84db09553a9dc664e821894692c3cf741ce172d7ca70d2466e8d859ec5c75dbefa8d074bff7750fc6ddf7c5936116bac44de46d96dfd62eb2fabdeb1619a84e77fbeee4b41964e91b8f3a22a2885efcd1511556c7347b535725c50069df269d79299ab1c24bb2cf479d8b7bce4e90982742f498f75a6224f149df400a6d505afa9d141abff488db2a6b0bfee16ed59a884c6711fb617d63b3d268980a5940d712ba85fb3a05e34eaf7da5e138904c953e4e1ddb7b824ec231aeb5f78c69e505925c8a8cd20fb3f27e9d3e0f701449cc210321d1bde8844e9d408be9f40399dc20ebb35e88cd28c0a000c168fd7dd79aa934209708e5bfc3cb3da9d716dbade55a6fc212aa6da952ca91f744e1ee8162283652a43c213aa96dadfada270a26126258299dacc0cdbb19fa0855633811c7eb865a9833604b6e3a61e05945068b274faf2b76818bae713f7c112101d9242136a9895caa666ff78768b2864ffd490318c9a544be127530f7a344612e56543601c683699dc26b918fd788123926713427f47b5ee22d6c2b8f4f0e94654a2ce535807e373a087b71f7727aa5e8f02591a5596d1aff2a0e074abfe05a80a0c9a2e9d52ea92b7a42352d917d210671ada41531cbee281da7bf0ec6860d47736a4cfe3a24f6412cfd6f9f6d2530040b8e815d281ab203a41ec59fc2ac9b73c77e73bef9436d773a83b6997bf2a14fff80840ee720ad88af4be1e6d33e7f2417a8a3de6f453f9f0df735ef0f366598103cf01406759d334e6c53690164457a7dae3e9447433719e0b1b2f7b76a6a6e1761d15d2ad8d2417c8eaf924a6372aca0de401fa6a8d7854da5a02cbca67f3a6508adee43546854ad6fa598facb20f6c4a93ac1298d34b0296bac12f1cdb848c818d249635f09a9ff6b247c8a71b001b04802622f40034d83ab0dae1525653a1e7f46227b7a201722cb98e37d1528b593985915674369153f0d56b4eae78fa1963dee53c4a0c05c3b23e6507ec4320aca7a76d3e53993db2333ae624d777c2538483542e3f153d923b862c174d790ae1d1fb233316e2e90c75b92540499301ddfc85bc7f38057194a349289833ac8500d6a021715b5a9f5f07391a143ec7e235dab00a503c0ce09f1617da85d85b6bbd45e4ce11f6494fe89ee472355697b258a22a6944d2fffcf6d4b28ddb0eac6f50c0c6b5df748f5c175cd42aa247fed2e432373c8e2e26c61f8efd24927428e5b6aa4af6995ab37c4d541c46cdcc443967f7f91475b74e3857b78524a03d19bc12fbad9b1c8305b0b7b2d1e650428be46b698b71ba0e05701608c359814ecfeba50ec63966569ea7c3da46a27fbcc11cfdeeaf3adee4104103482256dd2ddc0876742690a1ec45fe986689666e865fc987f95d3c3a21b7579ec8f68c979e8c3a7235e545a591cf1e86ca5bfb158562019ee47630359e62f55b48ac54984836fc045625b6f38be0ffd27b9b9a3384ebc5e199d26ca630b7dde6c4a21a443b52fe089f54679cf01f584b65b084c60d389064a31b9f38c7bf6f12c8a988983c4a71a24c04c2c96782633cd384b0562fb68df474b96949b4e97e21138f04131b4275d2f12bc6850529a1834c74bbf33fce1a8abcdeefaafd88c4eb4d48c4e73175308dec1349cbe7359b0bd8b0ecacb70d14ab5a8847c918162a8e94787ff36c0346759476a79e93902e165b243472687dbd61096e1516a59ec6c18bdd127dd9d91e9bb292419b3200c8142826bbd6dba56a5ef766663e71b613e37d19f1569ee6035b2042510aff57706741be43891b982dfd9e0114ba37bff094f45a3b5d6ba88959f5f07231f69ddba82139dc64e57cccef2403f580e2af8d1700e58bbbca6cd3f7ac0c7c9be42848e0144363f33aabf278c7acb0524cd893bf63cdcca88081114d6fca16773d188dd07bf771f3ef8c704ee52876eefa00cca3470eb596e75839b674904ff64dabcbfc2e7b3cf4475e794899d12945066c764950f4177efee031de156b706e059930ffdc4a5f72f7063004f733bc9c1e5537fd81cb164037fd0edf74aebbd37382f9be554e21c1c2d064cb2b216850bb7a2bbd519a6f1bad53d2b96eca8e565b6efcc58ae10ae93348ba12091121b87caf7bd979c73c023b7d6af756f9941b3e2b5cedf80a2ffa126974a90acf23ae56488b70cccab458c41afaa253f1c65693a2f894ba1c7fcb3f5533ed1cb12a59412599a05f36df6fc1b097c542cde0be312d5433750cee410d43e552af518bbf7975d40fdc1e4a55c911543f25ab17f5095966f476d4792dc6ab375f632cbd489d867b74f24374e633a42780467afec769f10fbb0352a9724a5966db5265894e4a55e8d05c7de4af2c0d1efc239de2d0826a02bd91d0681dfebfbdaca925dc2003600bb30d7ed040dec08d18f4a68a379f15cb8d4e68a30ab61c4badd1b0dc6b8122667fea8c9b0840fd655fae195796e5104dee4d803b83b48b7d3ded0aca60ff791105cb61a2bfd3ced82a55a471051d8fdf9d42abc6334706f30d2cc1da05afcc83f3ab448f24a86a29cc674f6154ef6d1bb9945d1f3cef1a5f66afbf07c9ebda294afc6350ae6ac459586d4ef614e6d6c869c5f87ac80ed2de211298ae15544e83e964a53ba9146f3debc6cfa444e8b497e4468f1a50d4ad8fbc4ab6a2b373aa6657f390140cd7df6d6708f1f60700903b92af6091e93d3db9d677f7b53fe83786f001923710df74a150e7533a498edaa56ff145269a04d70fa1ff4e477e27f03e7ecdfc1871039e36e9fb85474f64291afac07e5afe344767b3cf37c9c91e150060392695a9d12675e5fc85c92c40ca73b6ae74b11755c074c5308702406aac327faf724afa11c81d26060611bd25c171094e29d3950bf6252038c89fdd7306e411f876c22afec2d4b954c005acb19d155bffb81f40d92733598e3507a1ec23f9465859703a9beff5bd823098fde476d3e3f09a7abf14e436f3a6c7e750fc95357761ba818fe0e755f75e91c66404b840ab4b297d7a816e27a6dafc7141a7b637bbb59e7c1adf55efa20b9812adc97862a23dc5bdbf28917c3688d6cba1a9643b163be024016a8a9907dc8a93c57eb5762e15cc24827d039c34eae502b928a37b292554dbc116940e0065aeb53da592fc934294a9c81c5caf02c1730b5e45dc999d084957aa44542d87d842e7ff03aa25f01060f4ba3fb84e0dc806a34c7066fe481afae0b3e06be46c4e82ca83d0cf724cffc582f135bc4d78f20e948c6e9dda81531218095a06385923152f9552208a53488eaac189870aa9274b78a7a1eac7aaa91b255de68193b2b0085676704fbfab1d22ed2058cde878d3c6fb050b1776bc528d2646b41a5273938bac0ec73950173972cd2b383aec57f204d76c2dc24c94527e76c5bed3cd139421296296f326c69d63c8859bab416c1f8e6c35264e2db1ba084fd87f2708f5254c6f7fcaac3a76dd615f775277a9fc20a7edecbebc7783e1138fcd0b89c86768700074b075c3afdc0303eeeff13e93c580abe1ecc384934fae620305edd1903378acc3443ae82344632a409b47682a2c1789b21d7df6c557638a951cc9a98af09ffa8475dd2d7440a9e6adec4d39a614ac259b5c23d88985795d49ba1599793d4652580868e366012076a71a5e824aecbb9704d80fefba15f030a8e878f9c0d7cde6545869c2b5dc40ea5cc3c57bf860ad0a965b6234b9f899811fc2c1590168a285272bb6b170a4eee01046216b54a9c4657c4578406833864e91f1963f2786a6b71ada7358ac1059a6083241214de5cc6bb6423b0134bb30721a5906ab0009f431e26f1202057bf88738adad092aae2e12542c81ddededeecfe7a386f1a33c038f62efcff4391dae934ac1461c16f159d6f7439ab2fd251b66a040dd9269ce600769810a1363142c70917a0aee1152b413ff0741b03cd64fe94bfeaa0b2ab7fc6c465bc391f3599472ac7b9309ae5c28822cd908297517cc5fd5f4a13b0ed6db1a8e9c996f0d860b54beb1507de974065da4e1bc0fbd329558b7e6c5dbf85f275393067f0f32a35b9a2a57ed48288e102519d0c98efc259d93573454a2cc8a5a9b7548d5980b1824a79fc2cb88a21ffb7b906ca77265cf182ac7926f91023980265b7aea05ef46139a638734692b9334f12c06fbb664931c5d31508d94a7fdade00705df1c260e7e05cf510d60ff034a9e82ef35de9e7f246ed083fb703d7000a55255d5eed0110f83ea6fef3cdc64e73872fb9fab8eb78dc77a590ac443370f59f3fa819964780bd4d9e000413f304ca8aeee5b05d73c9f89ac2b459c128865e9159674dd68823545f1e7736988f2940b4509c9bf07fdd3ce3b4f29e359d4ba81b4c6ba1ca9e1b16edbb7d0ccc77f422d73abf05c6c3f407cfb2c23405d1ef781b19078005ff85a56cf156e9810303371aea0893f5ac9864dcc694fb9e004249e10bb38af544959d74140510ca91c878d154b030097f576b698e81a6860a47df267f29d4981a714d953624704a8061a868a22e8a7830f1b1304250b6565c5772f275f82a4679911084b5dad8a85a009f562caae58ed4104c299db9e5853dc442df7219ecb7f96849d01dd24ccd4b82519837308eb74ee3b3b5405de9b7d5074ef6727700ef1da39716f9e6faa305375cd49879859bb2d421d7aa7254aa4b333e18041a3afecb79cff360cf2731f949d2895704d0b1b47ec19e69f59347b4ca7ef44521ae905b501589c9ac1a96d41e01a427431ac346e733aee3ae40dd4df1980ca246e1b07ddb0ec5da0c22894cf98a25809fbffdb31f8454c1c6bc46e21fa6c4f38254c070ceb86697cf77ef578fea2fbf35ad9a9b0c50e8748600612619d943b1303b7de8c9c8166cfea24e822718b0eba5c0e16ce76ff5d7fefa20244cd4b747ba41b7fb2b081c4cc541d71b3166a96d1a02ade1ff84fb25153e8c08cae18bb0fc952eddc99e13978c0eff5fa2869387de1201f2bb4ad05200648d044ee07594f98ca1a414e7e912a44739cfcc164336e2d63e4e258b8f28235712dac793e9ed58b663d986ff406746a704312641f677109ddd5c31b2498a51611875ec76dfe7a4dd94f527c582e8f14328da6d864bbf75af5c468bc1f54857ec312226f72e0bd7c8091df3489f47ebfdea5e8e3ff473205510019054035dd8094e4e6a8a9b9bbe956d39a9e274fdc0bde732c126d85f9e3635e5dbe4c7e8b795d222176ce6372bbd2c6ae5adf9be2cc8798e8857ee061744a2863eed1d3d141c0bb0c6fd00cf3187d41de7ba0ece78ff29d8607755b131882a1f05d4dba3b853278ae15cf4f82d6f33d5ad1990d801f848b2af3f34b2836410b33548ff97bb49444e291b629041df947fe304c80f81c7e1ce491cc57b312f3a553d36c3300c9d82a13fdcada6a2145668d83c4b046ac62376a3d5a2facea1a1adfdae99140246bb837fcf399ea9f032dfce7b8104241702607b9a14684c7621addd03bda53250aa94e930cd4c7e05739fa7d973631ff142c9c4ff290553fb81d1b1714574878456ae22b5be1f12c5cb64e350d1350e2d4066834350c3166d1456c47dff7018c5928074f605190bf3cbdc6dd0740b03c2e95fde41422da9e3887b42e752f5c72f8299244ea7a23ade16fc3c1452514ca07213f577cc0551f9dc6ef4e6e7c5f1458046a795d9a824f5e1fe4083eea8a5d4877f9f42fb81de5ca9f9d11cd56091c945d4635834b1deaaca245bcc70569ae793ea876122c8c9b8fea15048ce210b28fc4773aa0134d676b2a242186e06a1242f97e53a3e8fc9bcb7fc42f2f1cf3cbbced552447e87b52a4bda88af38e13ea2b4fc3537e02dee95eefcc6c54543c7b17376ecdf772222b7b3d7da358edc4378425545eb0a036a7f75b967714b78dafed67b0fe1085624e1874f33724432ca20bb82b27bc2d14b82c77ee0b39f406f326be02c0f75c23762c015480e8e045b92d14131ff2d213979c34e8a408590c756f90db9e8f9a80f19d4fcc30e24b71333458febbf055966f784525e059a19665a2887c14fe03c306fa8831c9785683ca64e4f6cb54e0203bee472672a190f8acf4cccf9d905c79f498d5ac7587b2a7ad48aa0d4907e1cf87a6a50f1fe35e5a742f509cd88a48fc46f3c7726f9487cb898a9250725a47b78294e9d71bbfa8fa5e7ca2edd81193cb5109a2f90166ad7dd2bda9f161c746958d8538abdc3bbb155d2e21cde1b4f57f3b3154e5d0a7375b7804c512d8fc10d9f6c9027f9d7a9f000e11e82e331c50ac4db1bad91c915324ebf5d1a84125270fa9f49d740b2c2b50a72fffaf425c1d70850bc88919796a671882abb224c812e3857e0de577ef73fad7efb1a29fa0f27127ddd5d11193cfa7e4c309a26e225614dbc83ed2d6c53a2d7f03794c2de9807a8bfaf1cfded1538445a14af87126f4b0e93e6eba74faf23e06cdc3fa615d3fd368653a3611e81a601af1bb51e950922056631542f254481bf28f7a5c781fddf6e86e02abbf6a001276c6143ac060b0fbce97b322b968ab06d16835d988ef318c8b802a0cc28a8229d72d06612b691476da5eb5f8a5b016a77a7d4758164886fcb14d1962c71b7bc4f1df60cc0fc361f83d6d011fa644dd50b044c2a27d6817c62c6a4a1c9c0549203120809f387772e4b816cd5f2d956066a13762e90cc35d5b517d23975031804df5768e6eb54cd4e0ac9228132d2fd38dd2595ddfc2e57ce258c731a425d19145988201eb6cc0db6f96320a12859dff292294a0d9fb54125e1bae44165886f7ae1da6a25eb35f432cee6cc94bc5cf48a5f3daa69ddb4539281a08fa935eeda1d574052c35d166b742789288442ba884a6aac56b427315ac024b9e78057862c675f25e04cd4e8ec3902b3ee12542c107be03076d58dea0f5908842b087564738a6e9f02406b6c05f81260efeadcb0037ddf80b8b57063b261a5a04f3d009b9a96ab2fb911423efb19d538974aa2247103a0a748db3c437bc8fb3498c74707ba7f6cd99c370db7122190414dd44ea570a5ac1f5cd140cbabc53016d06b9974830b96be651e12a5035c3094a4056146d0d46bebf6f68bfeb9c3e3ea5a56fe209eab8c0464de015021badd069030399960c982634e33f4005bcd66617e7b79b363201c6de67063bd0ed070c15fc2dd12170ce7e57ae0b94725edcd8c6d3e4864a1c3ae40e345576915f47b8451fac010adc001d29c1c4ac2a26b17073410b9f5bc557cb85c8525582128e9338c65184e88f8d17491da8cc01764ec1f7c905c0ca42a3085e113a1ba5c9045f960f0acf9704d07321bc7ae3c733ce9f843d55fb9430cd70f4c5b2c8a9e9985f941c2fa2336e70e687788a871d1dac23950b3c6d538fd5c7b2966ebac866d6d586f2c2b2964ced672ff04f64f35f6f51ef97b1c23950d33564c84604dd553747a9e9f2d90037af987143ccdfa20822eefc72bed314e942948a1cc3042941dd599c92ceb743dc40fa1fa5621b6cda6f4f82f9033a94f3b3ce5fdd3633695d78eb1357cf89816a06608081581e620f7eed8e1b08297c47b224a037d5c2e5c63c60d8f59e423b3af33e7558718b1f06064e4544c68a06fe56a309cf1741844b63901275067aaeb246d1a30fae96fb2c5f101c9b91c265d695a5d03e2bc52b3e1634f58d337c905e38b89c39750e3c92a15365a7b00b0cf3f1e48fefef5d9da03ffcbb3cf10e480d5b7b72fdde285d2698c5a0d27dd2a080e6eb48fe70ce31d6b97a935bc0d3e509b0b61657b163d572e86bd21c0556070577403208215cac7cd6e10a5f24f1194d1e9f6de22cecf09ba8e5a1c35720ac6ce3d083464a2b8ec00a2fa409130c0f7a48c7b0cce9a1d237d1068356ac1d343c0afb17a779d289b036afd1fcfe427ff71110e0bab36a6a7c422a6b47a222e780ea8238d08b5180ce77274de1e69c9d1ba7affdb9db898022faf42e272aaef21ee7731a01ed8a2fa0b103ae17008bfa43f5558485273c97c11351f960b98a74025c50fd551579ba3381b0651cbe9c20c79d923d6482caa76a8126227eba03a189b840d3fa540631a8535af62baa5a0d4de468c81c178597272ce8ed4155d2834ca82d73e83f2845126df61cf127e8fbc991849b7ea9c5a7bb959ceefbb77942fee544aa1b1c461146c178559e9cf75bd5fdacf71d8e27c596225b0c649a7601f2be1016e5dc4b8d244d9e2bd358d21729f828b95e7028e98429182dc09509a9e3f02e376a61fb109683d1d0c84c125f3b803335c337eb136dfe4cb8f77c491ecaeb4f1ac4694e69c5154841832b04fa3fcb2c88acc0b8894a44da2083328ca24f4f3fd18e6886e5832a4ec4f1386bf9123d5a8895b49e3fdddd859b7937e49e9c3f63373cef913c1e622b6bb8938a153de04deeb8fc3a96e3f9e062cef1102ff3256cbdb213a7c8c03b272e9c45ff3e4d45183f123ea026c12844e86c2c5a5bb4780da3009fde1a05404de9c2b615da476e0019cdce14b3713eb5c6cfbb0c2791ede221971601f60632008256d4fdd45b676c7f85317e29a4cc48d769378530407889e97ab9b91ce9b915cd583cec5b5eb70a0136b1d56f4718df0f7effd80f7d752a70aab947a5f86ad50738653962d228eaad2625b266124c41ea338838181faaf04add9969a4ed54b519c833a171fc4a5562c828fb88b30c621c95fba06fce950c38131df6349921516bfef48661a5970ede7913cbaeb45a1e64e6778e9c9e69c5ea32511e783abd4bb71e074b90a893ccdeacf21ff5d52e79d1e8feb6360eb45647c37baa7b442f16cc5b91d91a80e247364d1fe80bb44eee96a955ae6c02e86cd350ca2c41d83464c008d0ec82ef3017a986e9752ece0b282665508c1f62c51a0af723b878064f44f340aed822fbaf5ce62996c54093a1560c2014459af40df6372eb041cffbbb6004da8272074e5cdd2215f935da9d26211e2fcf1a3ba228f861f1b740127564eb7cd6fb59d7ed067c4576221f99a0b7f68a7297f092ba964b8346bbecde046971925704faa46360a03370a2bbc505398485f0e01d82784de4a69c0b909e25c15b9c4f57940cc741a6a8f3fc87e98e30c20be8464a33822f615b63fd18bfb20e888b01477cf9b1b5f75d938011e3ba2f5e94baeddb43038e6e79c85b8df1e574af54fa8c5da0348e98829bd8580e0b3625c6581640fa88400f696acb542b603989a35b4a4dcccab0a38a5be83b1ba52d4b8f907e8deac1bd403783601c97590519cb2003230647d5fa0ca49b37e9648a81249fda16613feec9c07afa6dfa1e45336286beb4494834317faf8dea8ed32d467b277401fdba7e2f24836762e398a502dd755bfdf3034f8b5db8246943ed4218f6303fabc2b99f3203612468a44d85adc300f41f0fad6c210f78e4211f66662968ab6825a52b911f5d9ddb20a098f5d2d37864066203e76ac5082f64c4ec1e21765390deb7d045c252b1174871ae4f9281d4ed710300d270c2e2724c478222ee1560cfeef7abf823102b27913a7436bfe33978ed6794c74150341194cb1bb1b4bb06b02bf2fa888f9f249254cb321e982c5395e2b77fb6914f6f762d23d1afef9cd0e37a611400efa813ee9589313c00a9c5d1dd7eba2ee8b4a84fb7312399f37c48ca83b9cb47da332cdcb1f37ad82e6eeb3dec960dd65b6b17d4ab8103bb83156b6ce1964b3fd775cee91b45a145c3ca6645ce69c2120a2f38ebd5b44811905354cc3771adc67f208e8e38b20954a0ec76d3d81007f19eb34a1bdaf3c444b74eae2e9c7b9dab83aabf213bfb157e8b095c2cd583fd62fe9e8bfca5eb17433bd52072ab0f09c71f4f81149e14e5e07d116a89beedb36121cebbb42139e0d876551aa78b3b2a251a15036667df500eb8db4ac9330f0bdd1977074d8508206e4d28434550f0f0f60b383b556d5cbcf56f5ad20fe485b9b8839987f20aefce0914bd13ef2372c1dd82a0b404f50c987818495da5c950ed692228a1147582080c5030760bb19c14f701c63234b62373b46a4d8cde2bf4c900a49ffd161eda956d80da8204d1853e5c2dd41645af969e5486e300378a083593689ba701667c070755b926de7c245d868d2840ddd2348c6d69c581f6d4a54110d50a95a1e67b5f44534b9f19723a916c66b8f9dfd976206f3c5c1bb34057e5fc3dfb64ec0c2638d2f584ca28b0b9adc1b599b50149817fbc480ab071198a41c90c0b3df9bc988320733c8b01831e783402fba45b44aec41eef6af71596a25084c7c9100e0347f4edb38d02a12f39bfe30dfcdb20cf14d0aa346ad47fb71b6f3a13174c297ea0a781133c6be8e4bd93de6982879491660a5618af77b12cf3f7f0cded4129a1d402034ae6c2cc7c1a28018596c25ae4395fa2c5920fbc83225c67501a8dd8c57545572c3baba0c3dd54c876517de2dafeac88f31784ed14ca155ca79010528598889c914920748d3fd5d90fd5b2c3c8feed4bda44f3b7f5da26e269b044c0e543581cbef1bd86cea11bc5ee0c6272b1a7faa004893127e78e8ab3d87a5d430df5097d4e9e03e58d0b844889253c596e9df5ac031d9a62d31e146a3335a39bd17eb76f30bf85c2548964a46af01ac45779b9dee3aa1a749fe465e46e10cd174ad330a62e7cc79a55450f8c625a4b3822adfc94584d11cbb27b4eb3441118d72f51b7a973faed90ec24795967f25d94ed82a40a21af3c170be76ac2eea573c4fc530ef49946eeb5a9553c2b5766236b6a8278bf0f0f96f61b5c18e1dbf67ba43c965bfa58c49a3703aa85a4586fbb6295d4d43f2868772ab2dacbe7a6c11715191aa7cd3ca8ed2486a048d5e5ec302471b9e51aba28465053c864482211c98da82b9da1a8fd6ddb02f58e66d5adeb4a4fb344183a28dd83036eddd83229898b1071310f3cf6a6c33fd042acf4afe0bcf081860907b7fb67a28bc651c11e51a42ac01f3a01b676545f3771545608ae7153ca05b9545f0e5612e1c0ae1f85cc2229b510e1f0f7c45652ecc48c1602a57100a73996eafa82981e0a310f7a3ca0b9607c45230245aa94138b2e004142e226a8165f5891f5185e388408dcf6919094ce684a170d641479a29022637d50da92eb71ee1798980ba54c49206050a2db4017143cf857e438613c2935809e8c1bc53e41400f96a9f55dc938c95609d96025a1037308c32b39cd73f6299cfdecceb452586ce21b9888dd436ae7a3bd072a6de0513c161a0dc6d3290ce840ef04af0ed84f430db5342ea0403066991ff087bf6129af0ccda6dfcb668e0627a2172b30ceb5e98b1c2040ac5429718b91830af7d40d99745cb072ebc20982342ec622a6893bc1ad07e84ae0642e364304c1f4ce439a224af16e95418e2370429f955c8a7dea613e91780a0488a92188e78a3a86d4313ee1474e3582d58e90c2587f13f044650e99b74238cd4015cf8cbc4124125de5bb92581eef2272047a2ce588abe99096cd76f429563274205025cc42a93a9a406f9ef98e8b2196d373839fcfc222cecc337500e71aababd5c5462ee05f1019ba60a6458ccc11aeb2f24399b32897be0b2afb3e8aa948edc815279e750150d187f8b10202d80ec76c54b452cca49cee209226503ad7c27c9af8c01bc69f6134a0a013060ca0fb000103584c486e53bb632ab7ee0a98c42913780981c6ef23c9aa0e44a5f2a25b239901dc51b0baae262dedfb48529c58ce1792b288135283897029285e742616cc493c02ed6b934e50064be45362c6a2951a71529642e4a76d29247c46a96dc583f52a4ea6011f84b8f81d4ffb499216028c149671193c9f031ca7ca1b8178b3aa0df275456959de2c02a4863006a399eb65ca44c04c1dccab5b0f037e6f753fb1720a46f6e80cf40cfd46ef9be74a5814a9c152065a5d7b9044863319741767d2c5d7fa7e7b1bb0ff242ab3d6fd786fa9ee1f2aedc56fb92ffea7f336d5f45b07cb667d6f228aa177572661fa1c3414e914d7064d0b770a63fd0f74d7a510681e3ced74c8a57c04862f2ebdc0b7bbb8c792823e74319c11ca38a367f6f10496251740b98f6d7bd2270be3b74d1aede6004513c895768f0bdebe6b0315ae35029cf10e12d8f17a3aebd46de913b019c30aa72d4b26c9389e93a3ea1e91fdf02189a0a39fa4f61027dfa0f40c54b436688198cc4030ae58505b403c175d8e68fb704a526553b2fc810b6a9f8ad74a836449299283a48d17a2d53c15d0c32657fa4e2781cd06f2644c3ad72416cbe2da9a4e52d29a08f4ea9c9bdb746299de22530b9cac07ca78d1f15dfd380928f98efad228fb358c5a094c2cf7941f88bc49387f7a1a76d6ac4a01445406d69e1d6e4d2ba9b3d788b792d240f6626449c121f853a6e658cbce46ed00a20c06925fa0e649e2481d7aea5692a476c2ae5f97c3c9665c91d747d50f25a96147023f56d3398c4234c0d14967a74c9eb9ceba8cec9cb80cf6101ebdd9a712a48e5c79934c1c7102a713d74a83a939f37951656185125da0114a2d66e851f914d94e1f6b074b714c882d4e804d8bf13409152621896d049c4ef82e356315be915d0b0aab4b8fa70062a94681a967bd5085453b6c897dde629cdb34a32c8178166043b4771b923c39874f273c5559d3836bb360f2ff2fc5decf02f82df392ed8c18047a0c9b9657401c59a5034d6aa86b838ae808eb46c3cbcb4a8a1baf2660e6781f5041d792e00cf247d4e12027b1c02ff18fc5e3442976d4347a20f2f7ed00b6b0724b28287080bf02627b89be18ab35852e3fd95bee2df79632a59402570956095e0941a8f6f83d477bccc2384158a73d7e16de619ef6bc1b4daabbd1fc8a9b1b38243becd81d8b8dda1d4b3f90daa92595fbbf3d4e55961716992160d501a484a3bbd7ddbd1f63c7ed74c4e662c70fbb1722942b9c01a23d5662b584559a16160695413637d5c7f7e37a6c08d4471348b0aa1ba56e1350abeac3f307518acc16d752798570b89494966c7cb8c15ec31efb89410c4ac833dadbf678fbe00751aad646c3dcb5a4e8ff3ff38582b930684c8c0ae8b740324340388c7f0c7c2015761fd71cedc5c06020864a758166c4c090895d84eea9807eb2cef84207a91fa38c403fd92d5bb6e439838c0c1b26c4c0c93221064d6a3f47e99c362d138a50d2aee34522684c6b39bc1f8ae3f35ce4c82e0c3af41c7ef2e1306d6ddaa5f9cc2e1f4556a962dcb74f3e9995f964aafc2a9f371a1f40158eb042e5ef0154e1882ac06faf89a01b1729a11fe7e0c4203a3b6d8aecd3a6223fe558156d3e1b1769afebd5310fc742786708517bddd31e12daddad9395607f621ca961fc2bd6516c0df409847f3d6f97acc21155e841b5de2fefe7b782e4340c0994453e902a6770a4aaa89b04064475b62639961af2b7dfba6f7b2904fcf819801fa3e4263b33cbdf7efa46e3fedbd649c9d1d8ba3ddc6aba6e9d748bfb686cd511047c9901f8d1371a67f9d66b1c8f1e307e50e5ca4a9cf0c31d4b0d18a3b63edac14f68dcf5b34ddd75fa0764665c57ad4d9f0846d0a859b19fdcfc6c07d7f0d71aaf2ef7053fc6619c6695e80952dbc64708b900688baa0f6f8baa8f367dde0f2ffef05b72858684a6106d0c68414e769f7741644035769d6aafbbc86894d2d604ffcb94644b2a674c2a7fa4d59eb2df328e9652a846371a122dc5d49742e4a978845252eca9fc11076bfac8b331e0c329547ea8da18fe8e838de1382d710831b530fdfd31087b5a150de380cca0d0228a8d261e69af632afeb4c712d482a099ac4b299ac1382033a316d014275cf44f214a8172a4f6a714b569d67ecad3a6227dc252a2b4699910a448ed20a924d48feed4d6789810840af5a33db529aaf6432f52fbd90ab5bd489b6878a1c991fe986a137fb758274f5aa23273a6a43269958286da29440bd382ca249dca5bb4c4caaa72fb9461776e34bcd590368d995d9b19d73b2b2043ceccbc41cbb856820c2750cd4c00681957803210613533536818c772237becb1ee07087666b24e5a6f61d0fa941dc1bf361afe8c033233e7460387ca10fef3f7b7e06f8fffdb2248c2c18a13452b44fba286279542e4a898624e214a11798e4c959470d4be60981a6d3490b94925110f218528a52842879c96714066b4cdeadac7a789f639a510a510b56907147eb47840e1c714a26da361390d39826a450a068e3b8c56692dca97f3e0c11f32c228e3c26e310c0bbe8d52a84a2965b42a74d3780556200c509b8e428b9b0d7febb30c7bd8c1d8d1309048985c87d1da6d2995b699444dbea797761a8e2070cc1d3a94353c6e8cc516328682196756c402f6545a1b164c6a7c8e362c7b927198f82d6afc99056ae32799e1d009b5f824140b78f65b27137b6ca38144529cc5dd7a9b36758defc3508d7fd3a6adc6f781d3271c786eb46993102154e36f8c43352621c20c35a5061a54b74a6dfa6464da6411c163e21a3d2fad371b8c6dfd52ab2182a7f633a0df6bbcfb780514e857eb593e734b8348cecfa4742cfc3bd3d230f1fb594a4574856aac0bf403853ae1e89993c1d598465df69ffc4afd32ed45ceb0fd8d0fb936f79539584bde7d250ae5c79711b3ee9312eb829a46d6e0975922060b3572fc65ae70a3d9bfaeab8755fbd9d2593961862218e1e51bad5883406d22824a5ab54488c9aa49756ca8b67758909fa4a4b4e4a224a57ff4aea6e37f95019326d0c049857ffdb4b41a395428d49e7358940b2bc2822e28f4c3824a5851ec1a2b1a029439c929a29a507690682b1c9f251b8368246463745c03fd4ab5e58f24c52945214031a70605050505711dfdf8e867f433fa19fd348150e013089dd0f82ae427f94d1da6234b8c5d4dd7756e2b50fd4a1fc6d8928d01050bbad840b1a2367da31f27436dfab0a0daa64f6bd226abfb78095c059564e4c0f159c244427eba09aa27c89fe8c0231ba36bccc6f0df8701ab9494964aff5894f65ab5867dd1327dca5005581eb034ac0e5dd3d6cf0585609388d3a6ad2b92a090a87e50280af9097b9f120fddd1a95891105624841509614542589150ed9f2d7dda8529c1f84ad6f72990d0d8b996c208651902d6eb77a4d4abeb86e0ea2c365887afecc115624551b29e362d2472385a0120b5b5459dbdca522565e9ab37a442214180a2547e08a54ffe0389dae44f8654fff1d3a6a461fa6194fa49d50f8e0705a99f54b9aa4621f5932a177a5279c0fa49d50acaeadd06245544a0ec2b77d2275eb9af34d2ca4f9249af9834a9ed9d54b5e70495aadacc2c35dad3d23e4575afd7c235f97acbce31ff4624bfc084142a10862098801c21d114826a1b86044c1a5b7797f9889f60a359de76c0ca2af605ef33c993c84049fd34920a5ada189ed09cfc9d6a2fe5087377bb7569d2f3164208bd97f6766be1be967fa1d134d63238e784737a4f9e0b002a9bbb178ebe1f55bb2a771f067a343684c9bc0be1ee2e1f3119a7ee4fd6da856f8d1c6abb0c8cdc2318fb62c28d868cca355d93ca3d72997dc1cf705413ebfe072b3b43134ce6dfdddd7d1e730231b9951a98fd33a586bb8606fc80689d5703636220f38ccc9ec3f07b0ed35b03fc1d766e3d8dac7a036464a275913e996d5e1a6f0da0c15a6f0df07577f79855f8341ba091d5d8d1c82aec640ddfe098c004328566b71aae15db6abc9fd9728fe0be803f533ecc01eb30b00134b6ddb66ddbb8e508bedc17fcb093fb627966a3f8355617596a645c61f771a07a072432b6056b81662c908c4c4ccc27298cf1e1439aef61b15583a2502867abdd070b04b94f4685058041f1a9a8cc1b6b9592ea93ba47d1a974322ad7a74f9f761f7cb9b5b4ed4d8ee1a72208192a394a8c800e81521a3ac14a79002bc24a318f8a076ea5d8dd1948b30e6cdbf82355dfb2ff38fbcfe573f76d5eb71f8db0d1c68df148d1b29fd9b6a56853725cb36dc4f1d07e87085075b4fd7cec33f9d9dc362ee35a25c7dde70fbfca8de6f28beb7712b30164b0240cb51f921ac888ad1f6440fe1613343efbf72e910405ec406d6821a5b4ff7ffe9fe7540f52bb47f18be23f5f416595ff1ca706b15eb7fcd7515cfe6b282cfff5131cfe6b272cfeeb26b499d41bbef40c2b7fd2530ee3df7d52b2e83e4971e83ecad25597aea553c1f1d8c14f549757f11d876384c70e0e39b8488d2f69e9bd158a9129452fa646201c590e28ff481dcaf1f725462bc09297a000ea26e98952b5ba497a9ef044293681536364d9b3862b87ba497aac50b3ba497a80ea47df7188648bb258c4e8945a3c174ca4ea57eae1a99f2cb5782e586eacdf7aa35133d8533f5d7f713972c67ac9e19c4066c6fa1c3983619d7c8bbb84304018ea764458e0ff58a0190f58ef810b9aa0f73f7cc8b2ddcdf5b073c0ce5c1dec8884113c3b9b3da19ba4278911d5882223786adf68d4ccf5cb3972e672225767fd0cb77c54b83a7a7485dd105ef751d4dd6c08a06e47c403d004bdfd89279a87dd7de28919eb67f42e11eb77834002662cd8643eacccbcdb3cbaf200fff3e6aefb6d639f78a2eeb7ff7202eaba9018b8691ba669cd3cfc4b0e1a6764885e800bccc5bfe4b0c11d366e67608aa67170ebac59832e40a62c4052c8b13460f4dbe3186d1ac5d97e1d66ce8c36ba332a2a9a06d999b93789f1c298ac2f171861ee8b1149b9d6d68cecd4b0aaa2011a356e67247703f2ee1025c7d280edb5c7b17538f6572481eed8a21daa406680cc348cdd45391cedd761b2154be88e2daa3bb35b00eb5fe376e62bd58e9f082ab461807a5dfe71832fdd728fee0e37292f2b4277ac2390ce5c3f19b96ec01d206cc73a5e1808fb19e38c400819422831ffeec3c10ad0c18d0690daf01301b481a25a0cf02a35df8c0cd197bbcb3892dd101de10be6be1881f306dc010437188542cdeee17780e3562055ca3935de6cf8134fc036c1eb391c394676c8541d3dbc62ef55203333fb1dfc44bdba8fe54f0e67fe098cec90a93d0af04519a7a6fdac19f7411b28ea650463e62c8eb06e888634aa925004505bb2afb6e00f1879ab1102589b5044aafa03a9bed10072bd37b7555e3fe525ff5a40e415cc6d1364ee8757d70e7958df43561d623fd4e010adf95f7f753bbc5a9c77ac04d609eb3eb709c61afeb0fbfafd757847b7e60a37c6d67dd13098b10b40ea8c0be02758877ed81af3302f8dbf72a759431472edb831e47335200a8542799f05ad8f97f53e44f34787eca3f8d1b2de2b854198d7cb68af5d78edb53cb3ec01a1a4bb25217c3ca11fcdbe40799c6842e061ff8650a88b66f8d4fe1e96348a397272ae81b2dce872388c8d9f586e581fdfea56467bd06ae293b9212303d5ed635005e5e0097273c3c92aa877c002e523282f510579ca080a85b0b02f1aaa82b8fb7c055705d45ecac687950e4cb54fefd00faf40a140f9637c62627c66dc2006861207f88ceb388c11f4f33c1730c5861c42386ed0a4f6ff20b516270bc4a8ea9c0d0de8b74238a4ecbeb2b7c0728173bdf594f41332fce5766c0ce54ef0332516d08f961c87d2dea1df29a9e3116b0fe8797ea2eeb487ae9494963cef064a6abf0b4a7a2162bd153b87abe4a5cadcc0c77321c348fcbeae9494eec7ceeb625c7c5efddaa797997ef85297d755e27f5e75a6b104cf8a15ee34eb5a0a285c72839c35800c24b2b1818c8c5dd2d2f242499cd338d356b550efd03f474470102ae4b58a4914e8078988fcd4290a89a01316a67f0ab51f422cd4feed145ca2d4aaa07de13fa331d02fa63f0686ce11cce3a9940d98d47e12f370cf9196f6f9096a1ff6f1e998a791d49e1dc64099e3d8c8bee06ebb4eb54f917dd1df3e9e6a1f504f31ed213d3ab47d8aa0804a2d42993846a0e5befbf19d0b828bd68be91dfaad15d0fe98527bdd92a25fa9768b57656c80c4732103f680cad8786df2aa8b986f81482e607847d08fb65092ea0ca8920f9edaff83717e46febe7cbcde39bbb3b35bd6655dd6657d24f6c12324f493130af493ac533471e2177110d53bf44726e8d7a81944295cf9093eef34aa73604e9b36890d70bcc8a3c0203b38392838e427f8b917a16007fb29498b443089a5a4170d3e2cf50efdce5123e8b741362a3ef4a3dd433fda4ff0b1ee70e3c68dcbdbf5f8d104fa2d51853e7e445ed5554dd1b2113a840e1dc2e8cf6cb1c51633e4d8fd10c2478fd16ae5a44faf1d3179665fbe4e82f28eacbd931354fb3988d45a361ed25e0eed6f54fd78679f0a1b2423538354ed97d1dcd606baa46196896c429d949e3c9486d91948446998ad5f4cb743e19391b2063cb55f2bb5b82019f13fc1cfc4df1722f067f4f70efdd00a9448cecfc08ec57f67b486e9e7aed44fd400a7f6574a3224480a1a3ca9fd90af50bf171c46f96f6135d3a44d49789ed41e5d370031151a5e48b5377b89aa6ea5d105559b3609d5111a5e106a138b3f57ef687841a836f790f95242886dcfdd273ffb091bfea6bdbf3f16358c06cbb0cbb25efa46935dd7635987310d6661dad5ad18e20a64df4829e5753dbc2e79b3cb06f99765f9d8eeb386905d6d4198d9c81e7ec3ccba2c0b01ebf166c3b20182bda017205ce5d06f819c33c618082d26470c0cd7bae681339343d2bd2a391eb0e70839b164458bd4e2dff2e38493961f27be90433f599ba7bdee69987e24a5235da4f68f8ea09faf8278783ece09ea39420e5cc92f9464dafb78957886c3b48cf6188657bade2fae93d19e8c1a28a93d1995f74ca84dedca9440d900b486d41e775df282f2fb699dd9f7936086bdf512ebf6a7647975b03dcbea2474c2dc976f1255fef8cd3c290e82d7d87d18a82d44ed15df0756b5bbcf6d92403f1ed29e0f961fed71cc981ffb2c20e9eccc13b11fede1c081a33dfe6faa3255946f3a61ae2aff0a1b1f78f88d48c19a98a7bd9ca8e327ed3bee7447f8dbdb1c4b8dee1aff0a6790aaf24714d0fe9616d0cf547142959f8d984b2a3f3f0e3fcdd5e439e4dd0cb2805ebe97ca1e84bad48c8808b4e3ef4994994025e9d7a3420c426d463f18e85729ff7aa95d97aa665cc961fac140ad8ec22ca0dc3b3648742c35e25bb1639cce870fbcc347daf4d3a6edfb19499b2eedfb398897fcc0ba1f8cfafe8de31f8d6325ed45ac931de3b4d747da4302d41ea94eee6321b57985a494524aa1fac5f82765b2ce3af3ccd999a5863fac3a60072386bb9413da16002208217ab87011e339bcfbc10240e040c20ab5f7799facaacc06d843771fd5b2acee83944919bc4a15a324d8a6d39cdc4bc3f43563bd0c1af672ba7bf7612f7f4ae87ef9c5995f9957a16c21493a3babfba15acfde668345e5eda011d7c377cee6c2ded280b819f05b21dac3be078d1edabb64b46a7c643d6edae41627e5075192553e94d19256b43ab837edf5c3969a71df42a994aaa88a52d5f660a32dbcae5d19961add978152d5016580d4de6820c3a7cef9063b18ed451384511b467b0dfde35bceb9bba444e6cf8e52da149515816f1c867f7f084fcf4e8e657110c6f97685a34ddd317498f8374878db199873d92f3059eb5de6e932bbbbbbbbbbccbbbbde04235c128b3c29168afb44e0d1a9d8c318a42af62cfeb0461e87699aeb2d2350ef49f9913e451d4fb509fb8e3ca4d813797a624f2c827591c77ffe8b3c7e84f238d6c1c8e35fe4b1fef3940f0f2a03b0879127f6f86c8cb5813d7c0e72436c7b92db0b0bf3f201c5dcfdadd2336c314c5aba360500a9f0e16e0aae1ed0fed9ed0d617770fd07b30774e38fbafb823b12a45075975037890f90d479f5807e9e1292300a8c828313a43b3f827e2cd4264f499ef688403fa94a653c7eb25e731f87e925b5f31ea912aafd92499fb294c3749ba05465293ff9114f65a9da427ef2230dd3df8e04769e4a654032a80215aa4085f93dbfe75b9ed5dd1eb7c756c75f2568f6d3b266c67167cdd794d8c3f7cfde45ccc6e00254ebb97f4ede6af4e43987e03a3b179c0f9d020834be15bb90bd67ef9915e8e55dcd9bc2075409fa7958f7494969a996dc57aabcb4273f3e7cec5dc46c8cecaf9ff3bf02d4ebe3b680d86959b7f57ab8d5d0b82fd6979a759bb9f02105105eae888407456af65f336c7e96d16418f69f4ac59e3196f1edd7d7b39f32321ba32bf63f007100ec310cc3300c7b52310cc366e7b587c5ffbc8abd0cb675d8cbf9d8cc3a8c3b1a5fb3f94fc3bef900a466d9cfe89f19d6e958a228cc12104a485cd718bca442623011c03a90cdcdd63031b96b95e1dadddd5db8bb574b7982efeed8ba5f6df076771863f4eb7a6786cdee1ea165c1be76973f9afd700d6b8262959b884dd02b3641adca4dd058b9090a2b37415d7e807a13ecb109da954b40f96313942b3741b7326c79b9bbe56e41a11c77df21899250c8c018a14fdfddddddf59581b07b165f4c953c94d9bb9a55fed13ceca6ed42871ca829ac908ad913f625d2d6314aeb5028253413abdaeb8cf3b11111620c2a2a60b80140a07a2f4c7cdf6c08592d4c894b6561e2771378081b420861c76d590ea1c584c58457783171310125134c780c1331ce44ef0e1fb82ccbb2220520562a119578e4ee032237b8b808521024795930c65446310ab58c823db12aebd807b5c77059307acafdc42a0ee21f943babfa252dfda35435b3b67603caff352a25e586f8a9ba2d4410815c7d830a26b7c328377ac7cfb2b9d9421d703b8cee7366358856cca05bb05a9c0572ac820062c8abc5ddb8f901475b5c0f33381f6c64c8c86442ec0e57dc1928b1e5772ccbe6e43c2703bd813706f3d43c28068653410a8284c9cb8adae6598499bcac08b7914308633c8941c6e465655e8399552c45f3941b9ec46097dcec5aefec7238843e2d7d07304933151b14e03e8b2f985917566e40e1638b8ab6688b48751fc872f73191da3728c5801651fb774f9251e079bcba68c028f6e19e30ff01470eafcef96073e386ed66555d9d932123d30300b61930b698180b03fba21fc5b6832b10fba2dfc7d0094a33467a6c4260376c2b4328acdf16f900c0763682dd8a0a8a1b52682a546c5080abd04f18c639c11b03c5ca0aa0189820198c85b4d9d04122a1585981bd5451396ca9bcba558a4295ac6e5b0d90ae61d92bd456712515352615e3d3cd06053ae5279692d252292580fab1002af4c0c2f48f6028054445cc93f55f34a06c653565345b70d0e6c6b8a1eecf6c62d968d34a425041149e2c894218d260e4085e4802a97b200425962401832814e92c0164053a8042113de069030988e0151298eff2004d50bb3b06f56663f0c2efa14fcbd44f408a58a20b481ca1851f8001670676a1c27fad4288a24208215401cf2c0f19096ac5418a7f0688c4dfe14f44a941ac934a647f0839b25f6bde7048a05133dba1e0ef43809f98891d0a76f07906864004eb6406b54e661802bc4e2a9f0109213b60b203a28a044edd2442c0a9498ef4549b366d1224a054f83eb449257ee488a0fc45500222febed1b0dcacc36cbd413b09fb1db033ddadc340c0bb92c3582f3b961beb591cb03356f7c3c80deba57c1608f08c7c9e91dd0f230ed8199c1018b921bf3f0421909de730f0fbad7720ab5b114477664686a501fefc10e81b1cf7264c084105014806fbfeb8e3a7ecfb234fb79dd75efc11bb73d19edc885863a09fe7c5a19f2588c16a01116a7c0fd2a70be86763f4d091951711f21e950f01722144324e2c4109560b80369df6e20f15110a022222fa622a500c0c203f6d42b621415b8f6a2b2274648564088868d3f9622a500c8c181919364be2bb00f2be56be37babb717fff1b387657b5efbdbbdbe1b8b9c112facd0d1c3134c76fdc7b658961d27ecacdcd3a739fdf03f4e23a2deecbdeb2ba122565bfff61df6f751f166b765f5858d6edbed83a79e77c4aead3ec5e1ac6df03ed2ee0beb2ecbaa66565d3b22636e7fc6d53f6329b989c33c3e465b9bb630cc9009578f117ded69003c74d0efd7695c39d096bdcef7f1141bf5275254cb893cc517e8d77779f7fa5dcc8b31a754c3247a108d49eea2bc50854fd8b4b98b4c9bfb8242e69d3469ec8b3fae9c9b3930ee354f670e3faebb9cbb9be5f473fe374cecc396de28ef9732c8763547b38ed39e69864549bb8b65f1d0e9b1937edf9b70554380d440ea296ca28c6e120abd5e7f06f6953bf8e0505254a94f4d0261446502556d64b84012184b0839e7906177e0633b85f77326cc5d09cee06c2f1038410420c098b8977660495edf9e7f8539792d215ac5e6048b932dec7b4a7ba49826793a8611efafd5590f8ea314137627e68d397b341364910429b7a3db873840b4ae8d4f89308fa4917ff893971891434e9d3a59373fd384eeaf2b9782e9d91125c50630b96d874f6457ce67ea2f8ec58dd08685fc4dfc270e1502f1d3f694e1a26fe931d2835c62835c60d2755e316e4a7c6ef02aab1d356a329d0f85fa6a3b22f78a5f2c70cd4fe68d17dc1af814aeb54e1c226812354b936a93196e0c8a6e8584468d9027f777741e5829999b999a5942c999999633c25d07e777718140d52d5440fdf7f3dc6ad65611deccfba95d23febbe8cdbfecd9a6babb39199d19edf40a247e774386eda5b2901fd341524a8102b1f3d7eb4e9f31b771a87b849dd6fd9185b2164e8d7f7755d3652ca85e9bf66e46c66f48004fa75b71a392a779b187a4878321f8c1e200f0c1d7ca17ea5d5dc36c13abbbbbbbd5130e18a2428acf9ca3fadd66aef3ab38d5f491db26402d434e6c1423d56b1df3565fff56318d658cfc7a494137bc6b0cfb80f888c1b0d267f46c38a71d76b7fb5d65ddcd685d8b55b0df91660b9b969cffaad590e2810ed596fbdd4a1fddfae96480693078b8dfdebbb7a9dbca3212c0fe9938cf179a74d1fe3f05349d2d2afd0c547da8bcf3c7ee29e2ef9293228c8498d3f3316b91da9f1487b3e4a2edaf928a9f127b602c6cda7bdd855e6f47c8ecc913957d753e31c4d1d151dbb6f1b720d491ce6210b621de2974a1476d7509517b70da1dc3cf2e35910f3307fb03ac48f5355e3e7ccd40c42c72f6d355d53baeb0814fa69d37198f843b52b26d4a618bd499b38aab309e9d3013efe3664e3d97adae4699ee330f1dd7ddc73726abace999a47e64f8e9fe6921a67ce545263ceec7a1d816ad95036943dc9f827fe64bfe934025cc268eea3e3a7997298f85447c7c77ddcc753385faf7fc45dcb83ab0efd33e5a7b930fd711e0145ed99a2f175d34142e5f7c74da74ddb013e7e8a23f4237280c71e7bee78c0dd766a248016ad4d07b66f3a0480de4c8038d23a961ab06a0fabd64dae63701da561b2eee7001c236998f817c74a388897f0b6e9f8897f7e6489379dce71fcfbe3cf237d721f8749693355e3bbcf86c33f40355adda6534744309a739470f9891149229fd2134916a296169c085ab4e08cb4fc762b3ee91b0db7fc8c668e2b3677621a9cb38b442222213bed2365fb7491f6912fdba78b4427f62484b77042f8a9531b61fca1db1ec441bd2525dd185b4fbc302ddbf25f8cd2f21fa95bfeb38244abfbe8c47f6c9e36f5cb98063a821a3f2b05b5c7daa92dff5943ac8da6fb16aee59739f81847839fa566b9f2731fd716d9bdb4d7f2337a5ecb57cb6b2d5c51248a50da8b7f1581666fc5554bb7b1977dd47dd737341b8d4612cb885a7070f91be6c1faf80e78c09aae16a417922491feb2e44b8b960ca3b444d43e50da745522f92ddcd70271349803511065e5583ad64e8c6205b18458280bc7c66663715957d7365c9fa45015ae054789a48444443aacee6d6891f6e2a76a6c1f9fab87b27815bfe235b8c3d3a6151f1ffac0206dda86d4087b462f4405b290f2671049293b9b1eac2e3a89abdad326ee638b8f4f04a5e8dffa17ce670a8b05b2e9a18bb48f9f7a67194229aaf159740f6bd77d21a8d7739c0fb5f7a46152fcb744487e24d7477ac74fedf3bd73750ea57d64ccac0cc5af7cc4220ecfc222bb4884c3b3f8482464a74d380c29954abf5b7ac8b5b417bb92cbaa887050f12bd2b041291a8d88dab441291a69dfd2c26d95edc557c195381edc3eda0d9188c78582a8c65fc96e62ca0cc82d176786494fe5d25e14eb2754f994873eb7717e28ffd067ae37f7aec69f3eeda033775d17125e624fd4612c16033bc169a8d6ef053f855b0eb6171373d57971b03d2150bc46fae99ffd0dfea4bd3846b22b2a3ea55f992a3b0ec473652a3159d683987abd3b10734ed6f1a73faf2b8bd049d012c80436719212a4046834624a59c77aeb81a0cf6fb99c535be118497bd6c7f889811cc6fa2f95a8e49f1faafdd7395da44db4b350bcf52da487b4a9a74dfe29bfceab36d1b79e2d9d6abd7fbd53ade6d13ad89ef528b89b1fdae3d5ec3eb9753b299d4af795ea5c6fe5a7ddeb7186aefff87aea4e9ffeca45af1415f71c2bddc74f3b17ed5daf833b20daeb2cd09ef5dbf523cd499be45bd6e87a958f57ab8d81d3a66bdbb6dfdddebdfba13deb67744a6fd21ac1e79f26488094e804b5e96321d57a4b0849d74d29241e6c55eb85f0b7dc7358d052756a6b9726cc9f3b59a374cacdfedb209b8dd1757e103edae43fbfc6fcf9bb53a873ce39a3d429e75ce68e5852f749dd243c58d5c99bdcf6a0d4ebf9618c059badb5e4c32abb4f04f5ea20d1d4a40a29090f96d44fa6ceff3648a64d1f95d1a6f933dee6bfe427b830fc9aa4b29b6c98df6cd3de7c5afaefacee6dae9f3f7f5fa68564ee468303af58979fbef42b86d60a5ed3ca7fcdf29f55775477a52e0056f0f4e5223f05e0bff4eba71c9ef4eb283e001c2f0c7f0e1c6f6ca09f85aa316e34a41516978fdcc7220b65e1cce69f298c403f2eba2e2ee228ed45c890e322e6ae862103a94c223d17719436959ea10a6d8fc5cb467ae15e7e96b8959fcbe2b2aa7619190bb44a366897acca61c4603de021e8b597653c3454af5ff9a96931b2b8708f62059d5c7209544126500836812be844062901da36785d2b2bdd10ded5bdf0d0507bf1e3d51511aa2bcff2d6e534178b0bf728e04b1452214724877fe1727e26879f1b1be80ce60b82614d2ceff25f1403f75f6ca2c6ffa2196a24954ca42f7dfc1516178ecba9fccfa1e076bd1cb85d98aba3a4277d892baaa40e4a651a4834ea205e2acb0eae2e3f04ac2bbf23a5aeac3c4b37045797ee837f752edaf356ba97f6a2a6a53882f20b816e92224175931401aa73d31842d8d1b816ac909fe33eae1cbcf67ff76147a54acb6f92224516e5225ff1d04d9b5cbaaa67f88ce6b8ad2d1ca93d16ff1c0fae436ddaca53e397ba4f92ba2214dd43545df17ad7b370703d7e174eaec7cf71da7afccfd1f5f85170a4f5f85fb8d2c2f04fe6b5aeaf2cdebf37aad0f684d4f8445e1e151ba2282d95fe59304396874ffb14572e3f276bcf1b0d0effcc83cbc76fb126eea3ac37d01837fcee0dcf71bebb3ac0bfb81cb8170eba702b9260e1200de8ae749fa4a52257d2a6ab4216ee63799767ee1f49edfeeb1cc515179572a02a551154419d1cf85fa3e0bbc312ac17210a200adea075600c3a0716d12848825e624f10e530f173c4a05323dc4943b584d468e57c5690ff20ea2ab5e973f9527b51470fae10c705a220ca85e3fa6405854ae5e2a2727171717151712a2ab870dcbbfca368064084505c3847d25e7c8e73a0f6207c174e07f73cb8b2f85292239a54145c0effa978098009a2fc1480ce575d29870ef5d2ad78f026ac43fcafabafd7e25a98162d3e16a5204aa92d6a0b6f52bf76ce6b582ffe13db8479e022d6217e8c41511144350ed5a8867d11ff732ed4087bdab46d1ac1a25290d3821a5b47063576ffc122ddb7f88f8b5cbeab0be9068882288803736ad4ba5e0c61ebb8ba527bf149ed71ddb6c73d8bae075767d2a5d80115d2a6fff8f229ae87ae62f15cf7c9f82f9c236998f82d380fea385fb202b71aeb53ec807e74a5a3d41ec99df8ca4f3cf4d14974c83dac5cf785a0babcffb04f2dfdb7401da473b8c6692f72118baee6aa2e9d2b692f42549baef795c3c45f71213d8af795bb74ab1a5b7e05f7715d71c5ff969fffc5555c6d8cd8f251d2ffa88adf5501713898d35e7c6b5bf9e91d267e5cc515ec5a3a886a2ffee83f881203ffaa4d19bff32a3a89431b8387e067f919be5505c7834bdc578a9f82fb3400702b1e57fd9e072471ab4a5a81a812d32ed28d92da83dd272bbc58340d2466d3eccb8bb72f98617bd3990a735390589fa0da0f6d66a659a8740dd665410d15cd00000020087314002028100c874443d1683ca02aabfc14000d849e4a74589b89d328c7510a19648c414040040040000064244d40008d48744b785f85b502eb30fd78f304c9a55dbf852c07fc45c0d222c615aca0e1b66ce25620148e67f42a5c112f837fe075a087df79e319a1237e3de14f71f00b6c4f750b69a054ced477aff88e3e5fa03654279f64f5c815194c2066cb53ad7bfff369d258de32284b4e3a2103aff3345993ad293c76d09934de6e31ff67302ab39bffc450f796f0ee6609779da859932023894aaa621806b61262789d008f826691eda0b3ed0f23b2e24f8b00498d7d078954068c0e41a1f0ec5aac7e3d64a89bc2d6e8963ae14d0b89cb7620ee0b231c62d05464375a62e5661c9ee2a6fb15df2f6186b1094f31aa425978ded5380140296239b6c29d2339aca7c274a415bd48a968065600e99560102296a23d9b35d938e6191a7cd0ea30daf7b54e4f37b303d259e2e8bd70b6010f7b3bc32512652156e179eff2b8587ce00d1edc10970a616595193c188cdd1d337d874edddab6e4943c7262f3880815386f7c8a9cedbccebad0c5f666cf1363fd6801c4b1be07659b281492ef955491878cf8a38f174e8f190d765d53c0311b734bb3eb7d999dc9bf7cfd25058e3337e35fb20bf85673a657f13937fc3f99a0eb0015dc67e55a183564bceb049b7d0773d77e131d37c712dc2af255e628c2e19a38d8256704cd0f0600985431dbbaba2483fae48ff1292a8a5643be0ffb9ead944ba22a4e370e87cab210bcc2c0bb0a854f6f301de64ffb53bd2f7360bf5f0191af41268a9b0337860b4f80cb6dd385b2a1bbcf7b9fa8af56534de476a758bca93aa5c9f9a3dbe82c88f1ab537707690ea9452d73a605fb3277514564a7aab8b1fe3fc28d6a401551d7f5a9caf675fd96b2d8110549562e0f31e750d441aaadd84f45e8f5eebddda89279e939b46dae45704459d8a73a85595000a7d70d6e1964e5236676012544fec14f6d70e829a194cfedfc472581d313b1d94631dbf596a2ccd12e14905fff41e6475b31400c252b953c364a6201b3e465604eb5ecea4836595157ca23799526091a986279f09ab115230f9106533986e6f2cde969d490928e8db02840dfd2c9e85a63552451c3230dea2a9c80d343c374d6fe6a1a9d161c46e31d1c9be21a21c051c140cf0f4329459cdd8a1e15cac125baf3c65c28c570649b5a100a79e2d775336390334daf468b776086e88c9be59138ef97e2e2258702c4b847c0ef984b329d589c72c610a7fb6cb4cb25a5aec37977b238bd478ccba0b9689b6630400d44f643e73a0028a3115291c890198ba8ac25a3298fb031a68b36c40b906f4afb706925b6fed18659d3ea448dc2b451170dbaca543a6c2bf4be73655e94dc7cf3a842f2adab8d289f4825a2db7d81d9e2bede558e5f3cb6186e3606e4d769193b9d5ff0fee2095aa3ce8c44b16952e092e756e3551caf483d1be57c392122a76f1824e86e93c1d0fe02c0b7d4f7a1f04cc1118d17257d8ed28335536db7e0e76d68bf32b4a969d09372294414e10f386cb006bd054a31a4bf6b2cc735d59f63ded01a8d6c2fbdcc1ceee837c66ab069702e8238f265568e0031292e505603b2a19da06021cc4eb797992d0eac9ab0f1fca1288202b4a026e224597e9ca6cc60d181d69f4636bafa3b19e1d8e56486080b4ad6fd6ce9f018a186c8d3522e6125494e3ce67a9b1352624cd417128e4ff3f883d8bee72431935821a970dc07c3df1c1fbc2d5a28dc89206ba6696be1b5de104e2fd07a3d7786b0060831a65b1e36c02734e84072d3a69882cd0b980154e598e88b612cd3337c7e18890de24163d880b9655d7186724fc190a021eeee02aa3b18ee763eaeced968e5fa1709bacc846befd4d735f2c978b7455718c34c4dec8ca770e7c0c8a3354f0547a9f447b54d9b89048f48993835ea24be9a0b5e008928ba085db0d1528198f6165cb8b5234e639411e943b58af76ce2a6820c4db95b2783ed516c887ef0923101d85e7354191fdce4b4e42f3be0b5c9dfd886bd429fb977b67c973423cbf81bacc25f30fc4672e7363857d3e6c1f049e326fe2c544593bcdec1b2546fff6a4df36cc2cb1a0c5311cf7e29fb501c9adf172a62a4d6e04f1ac968123d5a4941a64ec1f1c7464368278de21c7d6700dcf7281700736ffabe6f11da2fc280e5b298601e215769f560e4db0d01b9b3c1fe05f05b53db28c14c4708563f87b07698a1f48a609ec1d2358fe666c1fc18383b0ad1d61238d1608135487cf357849b819d3427a870075eb78e05aa6f61223c5d348c9b29748df99edddd1d43e51fc14e297996c692f8a7c2d44b280907e0d38bb3c2317df43275e205e2bc302a40f942acf8f290336e1fd025c5cab1771818134feb6573289f1abd9a5cf5f0d82a88ed72cacbd183b8fe995c0d6a09961f90145240f40c31ce3f9216ba04d42c11602c6bc759464081d5b5d6edf217cc29dfd0769f7a3fb9e2fa664889de5d7b28d271f6bddc4dc57bd20429ce88d7810f72eaca906a0a5519055592dfcb07497ed4eafe33d4487eba3b09e1b38c4289719e9e05080b91a580ab9d98eb740fc38ea802ff4e66bec00598a8ec3506ec667ac92022e645d595f2a8b5de7cf82be4e408351590c3ff5a0f28554ec103f89207b215c22d0fba9fcd38920938d4b914423fb0564c7ad4ff2c9cf1bb5879eb828dd608f36f449a1e4f63b71b1b6e5da5c8b3ede513a47f796937794a1ec7dc07812bee414ccdef248e19cda643000fa345b9de9cc620828f963f4f96ea617ca0811dfdab5f1520dd7b2d2980bd7a238484f785c0810e80f4de9eb6b59a6f0e332bfb9d1f7a456b5fa75b8cc1f9878b655fb0b7d09c8545af52a8afe57de25bb0b6c58d0510863d20cabf36f5c4cd9590d1a1c074b2ae3fb7403ba6df3c3d173871797c8dd60afd874049c5ba96379f926381b41756558c347b1b233445fa98552c9a1e55a72be68883c20cd7264f798ea0d12ae03d6e6b989443c0b8684fc8fae55ccfff490e6cc2375b70580e8a92c013310d6a6ad9c3688244b5585a111e6d100fa620122e11042b0482a6817ebd27d9aecda07399047855b0ea8fedb5c020c773e1c21a6cd6de1bf8e81e6c4f3cb17a0cc8902acc0561b371e0ae7cc89bd9e9ca0e38ffde9140c284159d38c1ace624b07c212b799298b146ae56482092ee1630749501aa3be409727576c494fb0e508a9c2185fd0dc796dc33488f47a1ad9295212138d358bdacf3461ea7062af3306a56dfbf963e014d6a6b40c158198eb3da7134aab6b3ae1319b0d2e59452bc6af47dad0c424524a3eb1b310a2387e72a8fa2494600175d11b73366f5823eb6b841545d66f20df0658e312b6de1961169505dd5cba9f572986fb21729e894e37534a03b162c2ce31ec7efc7b5dcfe11e4e5671228ca40def8d11f387911281f2a0929b18a2172152404502a24ccdc4a0078902e1a19d4b4a77a3c4f3042655a58d87a1128435264b8a304d818600bab175072b825f407127b15b1c9d08c8c2622a59c1491ff51817fd7b8b91488d450a2ff1ebdeee1618098f31c8c8f4efb9106dd016772fd7dac0d4b55a5c8c93ed2c72c24b4d948e94848c8051074dcf658bb45458924618a54ad9cfac6fa53bbe16de15d4be173d48390cd8f34ae32801cb3cfd1a021c5e81776a7cffc1b58c240798455a62fdb0c2ad3a3bed82758cf48207e74d87567b14fd8555dd27094dec235de80bec0275929ea1bdff721ba03e81ff58297500a764f3602050ac62461163e115fe4197af4f7b6851571653f83d9dc02b4e7548ca2928076eb788982da1607c9891e7c8514454814b5445c585975b38b38801d1b3dc4a0fa12770c15ce08f21766e6eba91eced832811f15824829d3262be04e4524047dbe9d752779835333538dc00d46f8abb77d30f1c787b59d4bf4be5dd635856d12a7ac4fe36aa0b69852ae470348dd1dfe98266f9b7a763e6579c10d3e9f3cc217090d2757455dd9845e7a95d8c00abcb1dad899196c0bae7a81430b7aba315811c99e7a5470bc71152832afc24a6712fdeb28c21f1110f2158d9a713c99b370bc442fd4842b310b48e5b456168a9d4630fd7c4a853a3f12989c43f6ed501f22d9bf819cca14d1b0718a16c3c57e3475e4f7b2d791a9b2cb1f9f248fa95c5a6f7fef18e761529db479e43b52ab32cec291cea1f6cf5815d82bfc54cc6d20818782423a843ff077a646057a235221e789a3b7daaada08ee21a0d94dc202db7bb06586e44fc42075e55cacb68348252b3868c11ff51ffdf4ff5b9c69d5e6f733b2ab68b4b6f9c3682c1787a762abcc68e2ed435b85150811e4cd95d6558307980c9f84ba44cf740dd1466f96d1ea51a6331faa2f42821701409844cf7867e3ca84348e55197fd499b1f74f3ef529c3437447d5a2bf05915216618f5fe0391188f13af7d5057db550e68fdeaa97fc0750a8a601ae4a3136a6a793c0495e9d1c95324ae382cc240c841feda58b1c10f23c632246aea2e6f80562b7d10ccf94bdf9a05c76eb1971dc3bb1df6bd9e756fa0296d12e9bc50d36926daeada8086d22913301226f1c0b6bbf85f251df7c3a790a7e21f571543cbb6d56b23b3ce5e066312537ddf448070e9b736d005c641ae44fec51daa6d20d6b54b480faf7cd21f89efdd75587ed6b2b1c5b4b8906dc2fea5a8509dbd3bd4713559fea3f08ac495d21ff048c5ea652c620ce0e9402d30ebca5f7f9e255311dd03e5ec2878fb89afd0699c6109e1c09923a649b09b90c43436fdfda08b40b59f6c87a93ec9c97cb0400e6c9f681aec8bb0c16493d7e49083015d8706d8807c05070492824995efa3ee1c1e224b6227a171b8641862df053892d2260b9b52ff615995838a21c815c8e32c1b2e7488df1685c8e7ea94c1c641406dea40bafbaf8b281dacd2df56ba868c765a07fa97a0f507f853f1dbf670f2dbad0e109c71b0bda40c1f0bf8458b2550bce56e212151075a8a8f26ab0960fc5f072ceecabc43c3c042bd253652428e54e00424573236a4a92068a1b0e6b014305f2238b603a32b318264cbdee561ea7cac3ec86867b9539a8c981d795c5f3c8946bcce42e7a82d8062644cf8157b6a621ca9c00e855ea0039edc9dcafa4525a0ff21feec667276ffb66e4a2cb70acbcde443c5c1c3450e045372a8bf984fc6940ac23b8398684ff60995876c8496991f6c24d2045dd35f73566ba8f30de47fe1906081db523fd5933c02294872611d71eb39c4a7912d185601d327c3bd429ef14e065bcaa4f0d5205980a88d13b096902ecfc6378496514dd027a8011d0144b5a822e29eb95401f275faf321da38262fa834bde78ba0b9d8a3024a58e834073660f1974bb1df03dd32c05da40eda434c92eb0a0223043e099da2d4fa64a35f452dd615b5dea601425aa5b98db891c773c48dd0181a0ce6100587a7ee820405f1042c50d4d0bc99229fae5db742c507473a717d244a28761188de9b90408cc8f0c189ea7a7149e5d993a03fa896ef8d07fb4cecf26f8bd90c099e981247678ac9cb6ca5e4b5ebd443b811b9922c12b28898334e8d5d29f208565640cee10a1cfb99714b6631cbe993d83c51735dbd2ed42261b0e8c23497f313da3de4bec63a68e023ab9d5114fef52b18d2bc98e09347013747b85db46abc7294b1af56e12d0e1c0c1affd240faac04847bbd85a4e86f2606387848b148188d023ee6ca08cd526804ef671a0446aa14a84adb87ca8ca44dad20efd2e4188c6dcf505eb9c3f9739f7c2f91804be633a7627be737797a7e1fed0504504dd75d4a00ae03fedf5f588d00ba7dcf88d59dac8b06cf9e520686184f4c1fd64456b066cdf7218adbd5795030f2ac1690f25f8e728b8150158caa51dd37ad073738c9d9bcf117a17e7aa7daf2557e62a9a1d934d9096245b45c4294470637b865bca8a3064e079fe1c96098bf8c4e219574e2b8bd4ee62bb8f96a18275b0e1b154140b0105836f44f048c4bba449d4f2b3294b098770317b43886bf0a30963dd7d1ef98f7d820c9ca3654dc9b3a58dd782c698dd7b38911fb64b759c8c4cddd25f6b289fb0bfe521bab3d17bf3be37d860023233835ebc5f45c1c6abdccad4e067eef718500b5f59e43a12626fa09da58329422e7676a4b682c8d62a0fa53a116ff35c8928171b4aa1272fc2d6b9f8b23fc5a0d650e82639805ed15b086d346aa8e32f12178ccdec7aa5a8da61087f0bb674f2b41c11187081bcc35d102c8f17fc27fa9b4e984d3949b8506440a0db0e94382f27d67c280e20f111d766e144c8ee930d1c3d75e50f665531e758b1f893e0eb54535b36023a0835ac41fa4f3954804bc7b01aec54118e45d3dea920180b2a324167076323d356a730059670d965bc34f2bf8691aab7500e477287df6a699a99df17fa4bbfe109c812c7c572ef6874698b98dd9a66d78bafb006a84a78cb438d015bc729cdeb09903a4b9a62e5bde9075adee350256bd3035e106bc48d95fba8df97fa010afd69e463a0146420d73c0383ad23d18fef4e7bb9c67e9a887d7f02d4fc326762e184d4e6f847cfa685beeebd8e7b2895504f6c3f574bd198cbfcd38f1c8941f4fc31d100068105477657de2e8a1d647fa55f28e52c0ab3186b5b871b0aa9d89ef4c2f645f3ba14e4f11351cd76b5800b923d5c3fb7a8b28dab9ca17960bc02cc473af18f6a5611071494f6cbaf56852081a0a1cdba324bc2f24ae45e86f8c4247e87492ac40a2723194972d98e32f210c4a65594902dc298f38e0006d0123121bbdbf6068af5f76edb0e369cd5d4519b69c50d20c5e4f39cc898d95d05692453cb0080c95d016a5a7b5981892bcc5c4cd18abd977eadaf4a5a64d9a7a2bc2d13c6080260785ae79b58f00c80a1fe51f3e12de818006cb02360557e08811b366ea021b9847aae9a5c56530002d3856fecd73f7cbce0a66b3073b93cb6fc446d79bfc3d4e75597348605ee4ba4540a566e943be4c0e617fc06aeb41ff5463da11750e5a986a8ec75c8a35b7b8813151c8253daa027333d513537adce1d5891fa24f70b8878903d3add88028001ad22e062740c8e944f5235cdcc1d7990d481834c74f5357684d86be080d75981f0723fdea989e74a4347eb533c39532e298c0fcaa123fcc750cf156f899cccb043d9a3d346d07d09fd66f0463c823c5b0acc058a1259d0732c4c6fb5270232f21fa631caa75019f942daf8ec010631903cdf4f87ca6779e0dd76ab8cad4640e716887fc84a736e59d4d41e8e48e72cb43e640f04278dc7404d78f5cb0b6d35710e8f076470005b3cf435b11600d156cdbc9746e6d5a0afe98940f0ae084cd22702057b1b22d2f01c47f63992e2974f3fb13d27fd524faa58de879d393312df9052080a2eb5867c4e189f1446aaab994c815f8da054fad00df2116a575055d27ceda333fcdf50ae554ed80f331a130d8dfe222f4e56c536fc5dd7819a71c69fcdea3bb9ce61534bf0b0216f1e3450a5ba11b4143b53d4e64741104a17058886518b8b7c0d6f26ecc347303daa64d8181ba62446db6869ee0a8f82df1deb2d226db7a89a87de33a7cac86c2a14d8901c52beb44e3e26e19251dab3a6d017edcec466bb2c6bd0d307c4757005f214667e426ed6605ccb23b6f4a3875db55216ec60afc33ea602b8c4693fa40c51b9185c427aed788fd8116c1bf68db8e1468aa6d7287a9c81368271218b409fdd322141f47a3ec69167f0e50e36cde5ae3f644997efd0334c4c1c99147a7ddaa83bf444bef9e74a67abbdbc5c9ae8f598603c227a9ce3f2be3568891ac43579aa24914a8ca1743315bd801e44f51537caea95f1d7d766e41c1c8ba65e629b55ee03e714ea2bae9d412980db1c0760bf44f126464667f91ab26346a81d00346319ab9dfe8b8ac1b6a9700065bd8828d1c1a96cf6c2a958c526b83dfca1f38f013b4d02f7f03b7723dc05f81cb644774d0519544fb38ac67acd9ab13f9d2fe5d4adecd3fcf37dd268aabd2396814e99c39b61e3a68994d8c1e119385a1b1d1f685a4e2a0e83e30e6bbbea1eb4dc9584b392982e498777b00f6617868f3359de6fa9b10a08b704d1a7851f41a67ac102d259dc1e1094f5a61ed8db86782b783b3ddc02d65c96985de9ce194d48d9982c9c5c927564c3fa848890053b14a6ac017ac0574cd9193e0074a0ecd24e617e07c370a8983855f0ce3c81333968a8da2de3e7c92b50a80263da83a44a8562b9c2aad4c52fda6593318215699e8b2f47588b4812813582483facd501d74296d5a8e580d9a1c2ee78bdcae3fb6f38a9c8f9a53fdf4c09f187d490cc6ad7bdfa5e637a54b981e633f6b3021ad013fb36986a97b138d85599fea84199acfff80ee8f57b183a4f364bc8158e8b8102f46a55d7cf861f5e4509b5766ed9b905aff69538d52c82d6074413be2270deae4562524376b473314a670f47e8e7c0a48fe80279e8515f71adeef7b6ec9e284bb7ec621e317eb9650b8677e3e79f85dd2b0cd5ad5fb570928aa344b7187f608c7de609042908025dc8af706a375f3db8b9074d3dc8efc59e65cd0f10ee9c512a79d179a36a113d55b3e7b65db0c6547522735aebf488b64e1df1fc45874d59680684cf3fbd92753a87605d672f75067052e8c0ad806ce7bb43aad39aa987052dcd333ede7e6544906f0800f598a25f70cd5ca26c68607676aec725a74d04ce40a98dff328fb1e3a2a7c3396d6c73d141dfa0bd9507f60e1481030e7228c2f65a396703adfc124a473c4f50cf9e8fd3597b5c587169e85d47c654f55cc127341e84b8f0f2c167156d80cfd4b0f4119e47ca6f1c1d308df9ebd4a8f61911c62dd0b2fc5850d233476ef6a4c746e6ce22f6d2c4cbeb5d18c09c76e7969b7f1663bf8bb588edf595c92df0664ab8cf866ddc28943433dbfb5c52349cd7a0bf512fe6e88281cbd1b1486279c89feb4fc93406dac18959ca94947d137d97da764411d9e3b3bec8d9b9f88fdc44d6a5e1f10dc0d45fb773d6ebc00482af686473bd55c011d3d9f9797d66b89f13674306b3903f8b35bccceafceb623594fc15362fca91f6849d1966c56aeb9480b907484c43e10dc2eb0c004bacf85f6d9e2290b3c51afedf8f3a87584be5d652347be1e62757fbc7887db97e4082abc350e8b7ad52fb59e1360586f6a5900f2714edf33b06263a51b37c1b6506bfacbf15f08d0d8f83ab1997af16a26dbc6fa690c67aca94478c53e759c551b978c613c71ae0c090d2d17f40f01a2a25043e765ae15ec9695dc27247ffe25f28a01f15595ef008cc3ecdebbcf404b32775185b1552c131ea7aaac4c5f19aa43c45711d019f0467780d75fb63103c926ebc23c1143b806107bf4b91ba8f7f668f22a34b02a28506d18e690ba9601010ed9721c3683f1c0a2b40551207608cd9e5d016bdc3f6f280858c230040897c62187f9d17f8e8163ad6c00a07481db9fcdd679ee4f915c478dbfdda535c99cd39c87c8f5dcdfdaeb140578fb79f366baf949cb5ab05c0de5c3855c5b29e59a6ec5dd39e71fa49052678eaea4afa2c46e732113db80b34179bfa09a038b13a22760d3207509ed4b9adfbfce71f353140a4e11beb9cf570abdeaadbcf42fdbf187423a52a9bbfc5e8810663f87432c6358ae822d1bbd32747dce04770c640b88f2d522610bbac2cf17a4f4e49bc52060694dacf0691b8e0c73f4e94e17d49e1d0840be5161166cbcd58af685eb0c3fe748804d6d659bd769509c371ba562e8faf74df2984ba0fc25f767a6d45ef3de764362e07be37e05d1baae905e239940341d5b94ba3923d50ca5653dec0e24be6d6dd56fc464a718d070fa0a1ed15a1f9327d80f30d7474995b477a61bea6178b948916fd3be5a37269d11407d995665c1dbc4a89a0ed552fa11bd1af27aa4a88116fa0a4388bd3fca4bb9f6cb8a45dd645b8cead14c96f3fcdb649009000d4fd58c293f2806310ff539ec62a972c2e9921ad97981c4a30c139e8b12a0ba946b988c92792c081ca48e02d912d017ef1da074e2c46c27a1fe51446aa165b29511d216f25c57e33e10d71502a5f5dcb35a0c3139d66a5783fd20bbf062b74e1d737858cc40f86408ec2507518b9b570d57811c73f942477977c2128084e53c5584c1844a6d7b8300139782ea573ab30b58999b17ec256ca44aaab4f4681db8a4f5ab3e2caaef123774603d6fb674895a1c782905545bcc96c52167c682ec5ec4afcb6347791fc1bc5028d5eb812c4e79f381c385a33a57868ee299c4cac38512b78a2c4ee6324e1a439de44d86912303cd2e9302aa109603f87a8aba68220c310704570aeb9624745422299c78b4a4d050a0503d0d3778e6c5fb148dc4d4f1b91800c0ee7475ae105a3d46cf4d5c61738023ef145be521a31c827607951621821342a51bb4188eec8512920c12ae0b302a8defa6eca44e601636c27836502f870627584d162d6fd55b3b689f8bb95868ac49215a9a9bf2387a29c13216a8e0a0cc11e20baeec31d3e1dffd12343a68983ffcf1ab3782e25e089812c7c465e056ce39dc14732fe00c39b6ef060f7a3993592c7348146cd69d1e657b1f76e1e7c3687722056c251f39551fffce184016c6146fa5f3bb6ac88108d3551539b547657d98acbb8140b279d9ebdf845ab6266c3152ad8e71eced3bd758c90da09de7770a9e6159f4da7b47fe6db772e480db483e137aeba7395b0fb93dc979c733224ba701141ed12b0e6f0beca64c8476af84b5fa5760239c4390ecba733c37908f8c50883c4b5891ce38f207a5115c803b55b3bf2b198415b4cb78c35ff83ef7a58d56ea7a95d60b86329c17670b14374fbfbeac5dff64b01c4fc864541247338f39947ab9164958b8e5af7d6d81806f241984398ef1a2c8e433e3ceb1f9f106b90b8154162a071fa501a352df0c14566ac3b012b6b62a0b4ede1eedd59e0113653d4d791f8ffccb5d2c4d6e6c4c008b445e6212b425533dd88555c01ccaaca475c8b3188104e23a58fd9f246d6db0c475506eca499d7f9ebbe382a9b69ab4d242bf3e2f9c55a002e845487aec5461939f7ed4376b94e093b648fd72eed0f14864e08cbc59a378faaf67d772fa28f63d1a710ed1d24aa945d8db5c69f5c047e56a966e11d573da165ae37b31b811fed94853f3ec2670e1608bdf2260b0aae40b2245ec4487ef8181e149ad128a6bac82cced0b1b1a67a185fe8d88655308af6317129422dd9477435bdbc8c5d68a4b2fca33595c47c1403686bcb411f6234934b06dd42d93cb510d2c7ded7e0d44f283b485076372e32a6cbe1566331c68e41ac4e93fbd2bdb4a6ed2db89682e7b917d2fa0f15cb2b03e9f4f21cc899bf6b3382b9770649d08885f7bdddd3cbce664f938c9339107477f423f8400e0f161b0d4a0f556c0c841ebf7bad8d671032b8689ba6efcfa300a5b8b763c092961a67b7373f068069b00ecd19b6650d4f62333df1de606c4012eb43e53046d8a07e713957cbf030c69a1a98d3eb8a80842366d53b62def2d670092d03fd3872aa1ca1ec0cd37669df79b8ff54462a5ea88979b75b6e6c5f31aa9bc82eb103b1dec6abdfe7cf20338a17ca080e609a984a6af3e9d3a929e7bc34626c9db3e05ada9201457b270786b8cbfc6d300472a5c386d1a0f65a3aeead37ee1e9681326226c28fa4fcf2ee7a90f785d8e97ad35e22a34472a016df8f010e8d8195a4efb8041c00be67e826aa5c36b3010659b6b4d48f320f6b8460b1338ee404ec973d2f084d2fea2b9cf2b09e62fbb2abb88507fd62b7faf92fec069ea2f289268f2eef85ba680e2107fa11cd4cdfd02f4821de2d30a9fdaec9ec44f5df3e63cbc61c900632369aec92a24ca0fa6db3b11e15e04da034cd0d099e2ac99e9f270a6c73da7d2449245147eea1e025273d4466a31dff2a64192417b8710698c2932a1c9c7878b20747b3963d3b2a852ad65af5f5594c386683ecd7bc87494964b8e72d50dec03c4e82d3502ea234a554f5a4ba3e3719ac9c57f3eba2e85d06dc40da5de55225d175a2d8056724b4426896aa3fc1dc28778f2ec1602e4cc70ea7f560c75a6c17ad28611dd144b8fd86028721ba5f4d83dd62a4f1cffa29f878d638c8f0695658a1bafe6f695ea5b70e6565f79b7d677901eddbb3389259ac710b95524199b914509d02ad6fa3d4da6f5c572a4b1e7f4a77ab56e010ee9a845fb9f2c88a99db7d9b0e103cf9f5062019c391af0450a4157bab505203b5ad7d1ca82f7db1192408e657c8988ffb77efd47eb80855d04f71c38d9b29724f668e4740c0d170fce67adc83e7f8fc0c8ab69ee837715f618cbf06fe832c8b422aa0246e2904c20fd58c19b1dc6b26e4e95e3a05387468813c901bfa4a0efeb6da4dee90bcf1e3fcf86508fc54625475edafa4da1d8b927f6c3436bfd1455b95ff03e60e82a12acf9f67853a7a281e65f9caf9e6ac22c73580d7a2d3dbedac65981a30eeaa78b3736533b8f16ade00cf8a91a90f21ab44c6f626fe97b22b6d7ea5e2d4ae96dc32c3f56cbd07368027492c31e620668efc091e606122efe1b887210de013e5f022ca1281b9329b25373299296c3ac2783cfdbccb5cce4cb8fd46010e2a1e7668daad2cd403a3883a2bbf2afc02c0e0b164a17119a28f2c79082ba1738eba9967909a2e9c145b249efd001a72fe23adcf21b70b6dbfab42589d26ea346ad13f2855b2287b48716dbc8675657494a2a1194f5d1dc6ca95e4faa29a08487ab00d2e968f49edbecd1ec1dc1f3ba5ebfc39a8343470be30cee4d92bbecdc05ce0666662c3d2fd22fb3a8ee7c378e78bcd97a17a40bcc938eb4d7ea023b8f759e570fc57f87e69c0855e7189c23735256b2bacfab514e0f8475cc65731cf315c80ed6eddab0dfdca53286b7ce59f570446e9fdbbc0a221e34319f0d616a9671be3eb3ab0ecc80641ca88676f499244dd6f9dbe318c43f54f12d8e47765327e15fd4f3228f20af5e679143ff7ed1bdf5d649a6e2d37bbac311fb9600abb43c97823df0af918db34d7b22c841a7291233c1039935be4e683b3d2f57b5a353e23c3a5eb20e47e74e14f13b82b9f39e8da0775f33bb8bff26c0e1f09806d67d8e1892ec089024ad03f64ea2467e9bf1921f73ce9482a8c6b0b631a186853df74dd6e3b781950d4fdf05593726cd89a596b297c883a1d797e0622195730067e1551d78c3d18e50f311ffa9feabda8eb9d0123772a9bba4d2441f1bb12b4666a8c13ad38fa020dbcf9351b91d8bb08ab79fc3757976f6a6b743a6db9e6e004a1bfa165672923d87687ff6d3ed25feb71247ae08ecc527500699d5ff64ace1ab8f98b250ee049ba2dc158da5e26fd6687ebfc01c80b63afeddd157a4b08e4b6e2355f38cb68de5d3f00d334d0c098b5a32dc6f59ac575ab1192d6c3550a49807ea7d0b92cfdd8abc3882619f62ac36a75f8628b1cbb573aecd54901590f6213981c6557ed6dd2a3892b631bf8a87d3de76fd9c199a4b455e6ec41b7f5dcde21e8ae213eed7d0c8bb2a0010817c4c0021936e5e09e4bf35e93ef97a58c0deefa1b7b73f9c6d503f4672a551bc79108476e83b066cf60f4b761d9ab3763df6130da3d1903f73fbff2ce922400c3212126babd22bcfb32a468e0ba5ab83050d35666fbccc1fa7a1999fa897081ebd45c2c6f1d06f3b7104f8f708081bb139034392a5bc0dbe70631dca8a1ff0962a2db6d51405a35e7238f03a829ce6a96729cc6f28400726cfe058608fd0cf1459bdc9da7dd366c5e1d313d6fb7e10b17f0f0b9d28e11cc818b6b70dc8423ba4bbe7a5807926f7e899a8e48e275ee6e63b77a18e89b7961940c4e16551af82e4dc4d168e182e7003cede80455801f6cefda45cf73b9342e2aec50faa07856503eb9d51975ac85a694a2a3980672c437a070a67dc06fdf24cb01d3425715d7dbdfaf8af03b3910f75743093c8d5d26822a1bc8f74fc2063234824d65e2e89e4b42820337fe9d782714abfc20c6ecdfd6337cbbec16a23cde2b0e174a581ad62c054fbc1010d521ab70a594696f7804dcc53974eefebca820d279281f19f73b041088e7d00d057f0caded88a6c708735c2ba1a74468da19470f085e3e424be9930bc22b3bb688fb736275461800ec7aaeac6498434797fb2fa74cb03bb853738ad0449929732a664b9dd15754335b1d6febbb7c8e329e9409eb1b91acdd111747d7a035320b4c259ad78679a37a6c5ca55cff07733663456a5f2c427071786236926c93d8bccace9fad77e733d80d6455e2a52630d579dfd513833c2c7fc9630d410f9a81e161c42f2b34fd5329b74bccbdb6494d493a92e160c6f309e26ad778911798427360609dc0c15d33ab39ca9dff15196efd3fd6c6ada8ca6e798d281c4a6f0b15131091d58d7d02c852005d5db21f3bd8dc2b2b032673b96f9bb69d94f6e16be8f0f3d185fb47c0c9a79e110f56d554650f612c155f776913efcecdf51e87dbfaa5ea4ca2b4e6ba410ae7c0ffa2a316e694481e4680c0c58625d9c8b9d19cfcd198bab412013ab54a0b7243de6e2fb10d738d83342c735060d9f08d37785ede584573f0096693d615abe163b7370e177c2544660a570ceee2012e5bf6154895caa0de70902b25809d8b2fb4580af2032779ebeba07c96180f23d8a48c3fc80d08d60c8de9297d11450a7857c58a3ec3c08336d60e9c454158b8fa306be4ad6e69e7cb498b24b9f52319b07fc619cd7247966ad9a333a61caaf357101b755adf9fc9bd4e48741aaee2394c844d0095fb696d056476fbf48f1afc1481b272a75e1013ddc485dbcc3431eedf21bd42e034e193b0d3a485cd107ace94d86a370c40c9a6bc46a734c19d6c7ebe97af264db65073879332277d8b6f761633991cd8975f10e8cce512e4d69d080cb893e28bbb2648176466116d5b9db424945bbf7b02cd8d6a56056460902e3fa915ad99c3d6d05806612eaeb255dd312ea82d15206177058639063e40a9139d0ced9432f6689aa0ce7dae404da1b0e43705929f362f07743a048b0a3be837788c57ced0d8146856c1991e7ab77e64338f26f95b1a1fcce6deef4fe91301db957fbd83439d3d226b3f4e5cef82af6e1c9d8fe4e003f15d7164e203c18f4f5a249eca9009449e22afcc19119c726b5c23ef001ddc1319be9715c6bccbff4e92077a2e397efdf5ca42aa651931aa6faa861c0b8315c33405f73a5156dba512e1f738c9d6024d7366b47c9c10c4dab62daf85bd14c282c8e9d1ccc3b7d881be3144b9436ca103c712e8b00b35410dd75b2c2fa79560a40b5064e4e50e4dc5349d02b38a1bc17c6883c27617630edf8f4984c2d5b8504e48e65277778dc5b76942da55b18c85583ed8b40b60341e75266d312b42076bba8b2e44b2ef08412ce26ca5269f81e3b2738632c96257d216e76a8c0c6b46199b694e8a0c0a98f0209573ef6a1bf38439871e325313da8be4c36bf3bfa7537db1326a132228901eb473484c71b4349ea5d240a067b261a4fb95390e0f8b5e180638d678df489dfd1f011b8b7ed5139d5eb7c57a58e46ca95e949fbe7fed1c2358054b6a6502944bc2cde0ac8d08e7ef9521f302ff4774051d4300f303eed3a5750901812c62a8cdc30de4fd4d1a445577e402fa0eb9f041f57f81dfce80b59c77c8b6b4bc754ae489243a3bded49e39849939a31b2d1a23ed2adc89ebd8b8ef74c27bb954896f09f3d51db2db7bb976c626130e10e495dea5d9aca18d8b6908aae9d5eb41f3f51e2302e6c6396d9ed7c4acdf4a02502921ccbeff256349b9e31ab17d54f63aa24157ed3ba76e4af88a80f185840b600f494ef5ffb358836db1a3869e8ddd74f4b7c157f79e71208e4b9632b21f2114ceaa36364ebaf1bbcde5c073f32d6d42cf1b8d571800ef921d649193ceb6fd99128bbfa2489dd554f989de98557835eb6ec484f9327827af28728fa0f9e8205be0726650af968806cf9af325f1eb3ba13ff90f940bccac26beb11e4f44958c84075a8cb826bfec807edc1d3867f579e50ffe808c21dc2b35dcf0f0fbc66ac05caa47b8f4fdf604fd8e44dd5768f9f45802c3c9426416fab2dbbd0de9db9d79e021f2e0ddbd45ceae4fb0fef6cc63c934a22e27a216aa806feb5b267ea5de7c0a49331fcdec25a6dfb76a43fdd97d5e98ff60fe98c3b3e60b78164139bfbe1e0e62bc81f1b774ab668107138264d3a6e12ea3cddd4ad0036e17ea9d4889d28debd618ce4b2ffc0e667c5ff601da1a23741a6641b5583e6b015bffba258c4334406b88d5873ddb920e2f981ed1f800dbdd405c0bb81be8680f274e3ec2d0ccb02d7193d9eda4122e713aa93d04f6e6f77bf3c23646fb7d953d636ee06e482f3aec6f35a5a988dded12e2b1ddca35e47a04c4ca74de0466ca3a5b80ab619844d187bef82bfe7894da200fb218995a566dee3b86ce8eea0612db79098fe9280c0a33954fd74c6e5f60cd2f9eb06b1fa772bcc6ebd2c7a1c526ecb2c63903c35a13c08d59740e7851f658496bca1185a160c4e93639c1126068adf3a8e851a92dc1d0c26634d308139b12d1e3399a5ed27bd15597708f9fab7b2894b548bea26679a8ac087613ca2db09ea76ded8bb910ce279af1cb016fcca8cdb8fa1c50dfa4753c0ee314209da956c4554b5e74fb1734e115b9a8c714f0e9a0b1d6c65edeb98e23ce9e656046233fda70d04332d654182d0a8b14561620b6e60077aef3b76beba0b263224f151731df98d4cb643a444d8d981b184db237d1b0fc547ffb53c7055b2b93a0f9c51cf4beed16855d5dcb89b143e2120841e5e6cb55693c2f4f96d0b4c1c3ec86d35953c84232d18d0e51244fa25ae2cc6995204ff07be428b4593b49137315ae6500cef1fdcfca777e2a9e12263501f352af1c408788b3371e3681803a0761855da89f21cdc1e66a6d7ff982dad8db887dcf7f6ba36f227e4fbbe89d2e72269b7910b0fe4d2f02f7afb778f9e4d590cb5d8b848b7b50874362d3e66f0328ae05ceacb3c706eccd667ea1913abdad3c5a1f7e3dfb4f39f024af614b171e472a5d036a1f4aea50e629c0b925f0d5393c74891d356e087cd10c0009ae7139027f53aab0469076a6ecbbea71f66b9a905dc02be52fee6cf98fbbfc6689b26b04eb73aacef09b5552aa848e13c546759b272124c3d5dc6957877f855e4c75349409ebc5ebae2f6c2fd17bffbb9040f349d118c7d8b26ed116c70c3ea0f272378b1f2a6dbe49bd8bdda5bf7066d368cdaaae1d5eb6c8c1fcadec16345b24338c253002e494855bf7dc4e42449f795b11bb134d59e99a1c0251b0c81ea2389c43d8fa6983e152465f208ad3c7e840f0ca25f2f1bd8fab6969c1307c603906185ce7d3699fa65b1e5cee30b41801b9de8e501fe895b4986a7b0f98c9494aa32743e26419e53c76f82ea900f050f3de4d48ddb87ed26a433a9259a46cd4934ad293cd7069b09123be3fef425c063ea32b763f6eac9c448e9c08066ba2806d7a5b0ca967014590e7eb4c4210f10ee92c023ea1840b8e21f624695fd7c002d4b9d2bdcad214841a674bc7e9bc9d9758b8d942a318c8b72296a53fc439eb2b79f857b6a22e4979caa87b092a4f5d77c8f88de639aca7d8dc9618dc7dc81f6e0f7732c5cf7f62d8f6aae814f30362758cb6e2a640e317d5d2fc09293a01229c070c784ca68b406b59ff52a0ad5a79b3c3430868d6eb2f6a3d4c137ab605d1d09ef4fb3afa5494eb054a80274bb6802ee65785466b505ef774df3c800a9b5e6b00dabfccb3a7c65a2622cbeae3b02ee11c394461e45df21903a1399b9e509f6ad682711400629f575b4ac6dc44413859cb21dcec7b59c8b1a8cddbb2d5d4ec4b66b50081dadc645b687a161a17134e6a38bc3ccd3903a0bf588c723777bc95fd2af6a43aa694e4e61729a7100b3065545eec918249eee36ac7abc9b525d3174cb7ed359298ef80b9d203b4af19823006f2ab4430aef2bfcd38f69b59a0d236824d3b82f5c285f9fa15b785bd313a3fd65ebbecab58f0b74b77033c669b9b66f77ad953b1cbd5daba3255cc4458549613b320e58a4ecd291ece19e216f3e128b9befb5d18fc6839e6ad17d1fd69eac87e90dcb753b8392cbfc1cda697442af7a23b1959423d8a19e3d0eef191e9b19fb61a4f353758c0190466a4c11f6aa7f2b36f3e1dfab1131792adbbac5c12d9fb5a9ed42ac59a2ec0c05ae440dbf8bb4331d1ac666dbf43e354ff2d58a2844e146994228b320a9b790e27a1edd8980cd88b8b8be606e51a4f9d413209317da1e824b321856c9cb0c8f07e9e3eac1d62d25797120e00e2e2f47055aec5c0833b19c73bee24551bff7524a44b870e8b55aec72c0686fccb160c6b300ac9789c65e2d37f6fc4460b3d6c763d7134352e024c8d2b69390147835c75ef9786d11d0f297d52b429f2f14792e40ff610d9d8fa7713d0a94f48e7330c43696c80a2a30dc2b0035b6ea1d6d408acb322c0bbefe5a8e53a54b8bcdb9ef19734b02b5b82b90733e0893074d488024320a4ddfe7ee2d31348d62fb3865666c7c6bd73c4596f5ac8c8d706f590d0aa3c75683a6046ae9026bb87b85a75759eadd5d44275a74aad31d79db69983edc5c6b43b04ca44bfe500aa008917cb8942ff33df078e820a94088d907c210f5ba6d3281905f4210c783df49aa382d62e7ad1d344ffc1226c07e6193534a7e3957ad545264ccceb1e496a45a70571d841978805a35471ce6a6019c5ee1e5668e2af1322ef615a1e80d7c3f3b09d9ccd32609549418de458052e170053516effb9a006e80a7a80e2c4732d9a65a879352e52a94f5995b327fd657e85fc51fbe27c8d055748966b519953e13446ae3b7bcc96263d793a7a68ff991a22f7358a67aaf90c3e07601a5bb305d5f7e55073e213dd3fdf36fddc63754251d1a8f911159756aade194a97dc022639c145b66e4ddc43655bba6a7015bd6a5650d1c8f52c5df6f1f1bfb28015a3868156be70a7c1832be1786167ebc3ddc5277d860859e917d62e08eae2bc616be78e20bc4db17ee5fb3b36a97507cdc31866d7c1f97dbee58225deb3f454b2703495e57c77c4bc3900e126ed2b8e00cd4b3843bf61edb4309ff3c91a451be3a8296914e0287e215b1792ad9fdcf85b12028ca4749a46de5073c64d243f780fe150dae249dd90d6cb1a24e1817bc449b966d0e65a1449b0183374e92d093493752e31e1d13da29962bf498f74810207642300ca20c351713c1be538d0b51d2acd17a0b5f372e818ae540299fac35eef9361237d2603be1f87a11037322848868aac079d9d6e3e6fdccacf10c1d8ab5a4237ec712c7e8dde9b14a38cbc2007536e4654476a4c2f1e34729b56273247474aca6109b441b858b6583ef4e51358b95b6ff8852f6b2a5d3728c3e1601cfb860bcf05fe16abd952fc21a9971f0bb751783cafc2498cbf3cbdff266d5672f64f56215ca583d398f4cdd3a3c1916906e37f865eac1d0976b9ab2997fce39b87926da871ebf8cb8c24824959693c64b87717c8e2d41d7b0914d62051087b968379a2b8dd685f333d9ffe7affef8b414e7944c21cf84c775fe9b9117655db369604914db3661e9318e0147217ea84e64d2aecf81163069c1aa47ec7cc59273528aef9749d8790792cca986b34045a63019480b2c778e1a03a48812e243ec3fd8944b086b37cdbac8c2f54d8f1b7439c0a8477789805c40e4536cc4aebdc17355601cebf12f4c758fcb6fa7843be55f7a19e3edc436c77648c66c631a028287296ad2d6867a062b79502ea8eabfeb89d260d74cefe349c2a67168cff4b2ba07a015f2c3efd048d6eff8cba7335ef2fa2ef2785fa872c37ba00e3a79e5618277e2ebb66dca48ee03eadcaa8227aa582c9b9ff9fd350a8e7b85a6959e434b9c26cb3511e6990191cf187cd9b57519c06e6e3ba5b80b2693da81aa4d7be12dce6784d2d8a99363f9cbbcfb54fb26a089181255a8ea08128211c69908ce62e4bad7c63dbd828ced13ede6e5fe9e4651fdcc2527c6120bc9db1d1276ef78787d18874e331b05dca58498dd7621e1f2c372c0570c67952dd46a1148480010b4bda990ec722474efb19a15015f523919ee65c5141b80e93ae68c4c8d716b3052d7681b7ac3dd21008c3de452407676e294f7830148f7a554135032b7129ad73c349a6dced4ac3114a6c354e19b96d285e59911eb33c373fa6f92631d10a49262d71a7636d2611336fc3b02f6e2378bb2042544dded21413a092031e33fc59a453c6280a580fbb3b062ca682525323b001670e98804ea19f83b1f951cfe4c0c48cd9a80d3f4e6afcc2afbc04cde1b340ea38dd78b68f58c5bbc61639a04907a553f77bd84aba9088311c53c4e9a06c9ec2d5a0eacb0756d26657861832abe96a0017b915342095586151de233c87cd898955cd9b6c64d3eccbb9e535c4475d8c0559c53b6933104a700fcae7fc8569a6eed37dc8237be3040193598461303f5d0e95c3428682bd3dbcf1823e111853955a6c0281fab6553af09cf0268862ad99ab7ddf9d99fe2383d3766826a534175a73aa82b611b22b970949c41fe56221e3b5f6820a56ad85d5ed76edba024930c176ca30bd0f9d15a4f27009f37fe9ac95431108e35d4434f34d540dd2ef03e83f92a38133092ef7cc3d88ea3e6fbd07fe6a54099188c202914666bc32501fa4ee9644de62450d45a148e8f9778aa13432c88238f4fc8b785d598cd6c381d3c80f8a413d18cffb53b86f667fb5c5d05343f5b6c324712b27740a8e844e7f4ed97e29ed6c206009145d452e1dd5fdb29ca1779c93e0dc23cf16059d4239a7c2857698f5f9cecbb55e9431a92ad9b89d39fb0b4cff7f6dd07bb6aa1da605fd346cf45d2d466ffc76526675f6add32001052a68f6b44f1342a3e04efd932102dc57ccb2d5d066cfbd2281a4a4b01e0c41b4b9022dc6949cac48ec52b496a74276715a916829feb902e981e140296dc592cfd8c60873d97dfcfc86b13c4310fca6400945334bfdc19d331e7c11aa23ce4b23cbcffc30dd073a12a7a14bc505cc4cd7361097326a66c5b0f7b6f8b77d23f34272caa33b9b3f09ba78b77681be0f1483ada50b0027d09121a49ee4497ad96c1790204ec09e4be158d8bfff28f3bc9e15d62d22db26ba14a7bdb9129fa435ea179ca95950bf9f5b26086d92e5d5d3a42eae1c6d4c1bf4d8865b13e25344b802b13f399e2b1c3a6ee53975c745f434ac2b81af9ceb0b26b935daf44edf3b444bb6bf27368463910d17828efcf12e309b9e179c9e106078597e86f0756383e7c2f85bcf22fdec933bfa42745e0c32b542a0d67c81410b0faf10a2524e10f282310ed6416465787d38297b06d491ee11e4d4a4f39158e1a38ef8e71a83f08d23e542a02d21f95f16ed4695315bc0a35d338acba60ff98c6c00388cd03f7483808c29c0aa488476333b4918a7750734bbe7491f9edc5b8a5410de59d2970bf6727b6ff5bcbaa3519b0fd03746e29662b53d153285445cf72200a2b09e14b5799620544506aaafe825b42c59726c99d24950ceb301974c9c037ce03b66ac53113c8e91bdb1d5971994ef31dca7188c34a6bdacb59298bfd62e7e28aed07b13434a66b26221c1a5abbcae637c630a49f1c0949816ecb065b0f4db3620fed460e9b23294038d6531bc7abf39f2fddd0799b48068de2a58cbcc07d0b6266bd3e4f0ea4c65e19d1e6f649d950dbf1147070db61d58111cf66fedd2abd90966812fd62995db945e5f9ad2cd1e328e1d7aad0f7ff3286ae9c5c4995d81bf14b429be432e6ef11b20d43d747e78c67b695526c8211f5c64aac6a1814fc0276abc13bd891f9c662510c29c7e3bc2da42dedc23481cbaa5334890661586810972f5bf413f475ac1d32450ca988052db64941e21a19063365d7801640998502232c90ba9d8435d03a501a9f490eeef08c8ecb019b4ff5c1dd34674328ea5ef169b4b3bb2c6b4bf71b5cea27a5ec98aafa2effebd4da690b5ba2c378d08068eb5b355b680bd0d51e9d6ca2a027902ca89ade68d2e39198bf0a2fc160327ce48a37b06cf72af3b7ec5088eec65e5b123d04f140c181a4a6f056f5471504ba01055990452d6bc05d87c067d7a4f9cda6591eddf2ae7c271ad3ab5de349f221db7321a88cf44d9266dc9e9e31eb9d988d87e0c16f8b1bf52faf9155698112533f2ddca325e2a3489af94f9584e8783890cc37e6fdcdde17247defc0baf88469c0efe6bbd7df0970b49aa5f74091546a7d07a21812e49631387142741bfc263a3f5c7910aafef48f50b03234bf51943fc3d2d6e11cbdb0742b090af3e1f7c939d6d6ad68106fe1829e6454036ce8e2b83bc39c3e425e87ea791ea7e231f80b0fe0c0339d2840c968f7b39a0567955321eb6db73b4fb59a9d1bbbaab1a15ca4afd774800504d159c14f7c4a3d4656a345fd813c33fe5e81e1ff1dbf1fb5862a948782151ab40e2987ac5f39b18ca9218dd056f7ae8a2538dd28db62dde23faad65f49687d9d771e3099978d4434879675d921c01bfd87140722338627c74f297e7d974c3085eefc2c743b932b701d03c513533c0c94a801b733c73e8cfcae7e583633fca220b24758b371344ca303f91584ea970da1e088974b0cc37c7ebad779d08ef08bc476d30c5ae8d7e9f736766a02034fb5b7ccc4bfedbb679c2946d25cd02ee60f9bd5c62b71827e9fc265d1b59c0fdf7a6a092a1f34cc9113aea630ceca7c9442f446a41a5f42df23704cec0cb26511a7fca3a6b0a120825508b8ce6e207b616d3c184a7bdccc0d91613b7507a8f0b79c9a3a19e841db014971721133a8d2d292d912d682790d7a2ba22bc3cbe9742870d8fad3951a39205124c1086cd5d7f390237dcf83904700c47ec67878325e3233dc56cbc75147eae99fe837386257d8b5a5d3e5143cfc5bfcbb121246980f0bd1ed2be26adcb347792613b1ec275ad1f9b17e9621d407645fcdd59f906138bd91cd8238bd6d4d8901d4e6bf511c878473d148447b4115336a9c0e397bb464d2ba310ddc6719a2dfa8004ca96a450ca35478e053eb50c7ab45a556995b31c514f857771f4cd0d107b44abcf4413025346d2398ff457fbfb50c1bda7c0823f61523e7564a97cc2d6f531381edbf83f96b5c529a22ae1a1632a348010677b47b879c62dd131b565b3fe1e29afb01c414b22a18849193dab948ca98ec4f1978b6dd536aa2c3fa769b3772d57ad6249ac227edf90251c56da5e139c29424555dca0b9054de89512c013a45bf432d5724545c310286d3c73ea0c10f46d663bd3929cc531d3708e4e862f59c04d26f677339994b101b0d573a1fde510d50879152e3ebde2a873ccc34fc889edfed54b50ff25b7b0d636f43dbfafec22eb5e40b6f98ad59a37c6cdb99809c791e616fbd278bf8b632c824e15f53a1f81a52158b019922108adb55e0718451b99407e8ff37c65471cf61357fe88ad58c98405177324c1c3922dd99b2e88e225986f358fd5fdd29311d5d0a6cfb71a543cdf9fe9307b295f565f40d8441717da5c450d6ec4e49b7f3eca7330fa882d0aae583a43a418e67f6fd81ae20cddb9e5a8b97b4a8418ca229e8a28a47ff2e7e306bce55c73e25342bcae69ca27088a2ba449932a1eaab97eaa45a1eac586faf6a991ebf33b9a3654e3d5445de531261706cef1c671097cb88231bcc778abe4b5549a718b726db7b092e99f9bc4e731fab2ade99ca6a61cb76fedeaccb6fd467808303f53b29b4aa8310052d2eaa8a2e73bc69665643535df186658f7cc570c7a5542bcd16f10c4394dfdd47953bd351620f016e9a1de28789eb2496bf8be0b197f2b205a6fc4e90df25f4394253c79965fe0514301d8b6b3551ebc45b39990bfd4af3eb3e335aa02703dbd727f253400eb0978a86afa4a1b05fc9f75e95c9bfd831c7eb30105032e9014bf84fec58baf043973aa3a607feda51dd09d51e37a1b7f16b2d94c0dea2697214da640d94eba2301fed428b6cf83aa461e7707af53a83fa9f7bb7ffec024ba8cc6cd17b11a1ecd811a40cbbc8752bab269492e72c123be347d2fc9f69f6b08e6bad548a140d828ac4ec92376e3d6410e2f9691c7be386908debd9ce1541e3a6b0f4a1a7182711a355af38bcc9671144f8858b29afda12c919a80eb5c02a233f46bd3d2c99b5680f51fdeaaac06632d5eb721264d70eea711b50474aa17afdbbfe6304b6282bc1de837715034fa1f47f63107a0b6db149542a2cd9569dc3bbf15c452b0706532f86d0439e8de11fedd7497d9767f81f0134a9543c20307d0fb6cfda890f8196e91a26cd717459bc0b27c339ff513504b118f86b4468729458a13ade00413d9546ee50428489c074e01576813ce66f082f20586cf41b5c1b40045252faeaae7931fead07e2feede07edd6ba58c87261cdcfaaf1fb03c9d309a4b66366c61497178ed5c5d1abc17355c9a4760485623842842693841dc4f313f6ac3455fcc3e5125882488a7076fe2003de7169626ab5938e04ccc56fa3e4ed1fb4427ebfbe1219ea3c2b7a5835cd8d5960915d040b233c86bca835eb7818531fe017861628fd2a1d76bf966d8e2da05faa4f1faf10bb3d27b7a652d59bbf79bf8e8a2b0fa11a109096c1d5d783c6fc9fee02107d0ba64cc67c5f87de9b4fe465204fb36ccd299affefba8429e98da83ec5e9e7447a41778d8e8fd31e4e384e61661f22a0fa7a522f52df79e5f77edf7bcf6d6627071fad63b438ca3190bbe8824c8894c3a0dc926c43e7b041cdb4d93e9ea4ec7115b3a33ba1ef1f1819960012b0b2b176313137126cd9cf5457384085d2d1a22cb85852d1fcc74f1192ba21ed85d5df1a5c48155113781086afca346f34cbd4e7b671e73047a605bfe05f1eccbd510daf4f2055594699c9c2c15db4bb6674b40dd303e62baebd2c60a9d544399c938c2aa27ea9444996262ae410178d74e939d22119340b13854582fc58075c99e0345e47f2aa6920537cf2e635944b1776a9ebf4cac480c78ff5df20087342fdbbd156fa20367ac5deb8dfafb8869f66befc1c99b1506466e99f1b54d8cfe5c785dd9868521c536b28eea7f1848b0dfa7ba514c31c970a392cea89cbd5bdafe5e4f2fdb59a5be96de89631608675d95202287c50639b9bf5aa506d7b246c0d9d60b5472e2e2d8222e50e1a59abde00392ed1ebbd17bc32d040fa2700274a92571664a5240a800895b82d2774024a15d01ef462c1fe72abc54dce63baafe92688de9cfab118843b2c961c2946dfea0a1f58252ec660c72547808f45c807c8010eed012269cc437402ea173077270454969f610adad8159fd9cfaf9f9e8d68a75707bd89a2668261a06145f3a6a19fe5cabc4b3b3f5a8c8ceca7ba8de2f19cb053220a00381cadc247756075d36e97c5bb3494a40b81443428aed3ec6ff231960cf2cc2b6425f6b5b7cd1c8df5df8b4186157b56d267c2ad599aaec93713f041f8d7b81892b538d7e763e43519aac9eb754ba0bceb249282e9aa677a2284db0f35b04f4efa50962506792281e0523f6974bfff66207afe07f5b428f433e72cf9446fcf3384b17ec0f49c8b3765cdb277e8290e5302496a1a3675e1922cde489a0f16297efba49b10d89b521ec8dc2408ab6a1804f4510ded08003c6054a2ef1bc429548a5389863c4da2f528369e1ba7edd50eaba1f5649b0788d92fdde4a416989096b01535089e24d342e800668f6f9006469c569bc5c944007f6e972bb58b22c307a160ae72da06398f7dec564adcceeef281e9c285a19befe9db110103e66b95413a596a2031cf6dce6b6f55c11289b8c97a350145acbe3cc72a065d1611b74a3392a0bee12d4c9c95900d3c4767065a41d4828bd0a0299e8cbfc9ec70214a09e1ce58b320bae3f13801740d8f4a376289df0789dd0fa6eced05a67934f7627f16701165dc0bd67c775be155082f532485307bc8f5c3edee5e8cd44c2b21bb9185dce06bfdd1638409d6881f0768b2a806af781f3bc4b4c6b74849c38240732758bdd29809eaaa65a6ca939624d5e43b4f5ab4e1fd6041d27e3dfa76c652814d4338b62f8d1961d647df9f26889284a0d2581c2928b79fa475432b8bf30368798f7d06d48a6e587d5ede3a2c90cc126f8ebe7820159ab9451fa72339d65a0323d8d7efb3e42581dd854ee9a8e141fa39157799c4214a434f73599c03dea3d56208a4619c174b55e13625543abe59d2dc463b1fe0cb2275c5972425747500298e885948fa5f80888268b63680a69f44145e55d937fbc85404a6eb7f22379c63680011b7be1597442d10f32823cc73f94713f16211a1978b62161c9fd401ef765b85fc0f5c8505e7ae4261b8d02f389df13fed05844f3d65a9837e1fc2c99c33e3851df50a9f5ccf965d71dbf65b554215fa55eab3d5e8594c756f0a98e9d4d0e13843100aa4477da334ea16a5def73736740d88d6d10eb16db6efaeaa151f325119224b0b80be0574bfc8a3a5f6f4bf65c8ff907bc767004ca28959adcef24da05a91a18f1260e4d89d6838bbac06a794fa53009812b10093285878c30ad8f307799620e814ea120eef4ba4c68364153892622d1a28788f0bacfb5140c08a39df72e6c87722ac7f757c87b52eee7709f8f9a1b3c6e5f0296f3a04ac5044804e42321d69ac8432b9a8d8534d52ea99075a59d23ca4134c38f725b5bc33cfa43116af552174c081f6ff658d84cab174ab60292de629de8bd833207ccc2bae4df1223b6cab8f56a32f2635f3523fd39045c1b377466b490599ce384678be8803c5642a74a6523be41d02887512f8a41a7945a87627abdc3f876393a71fa6d16d73c874663f6093223096be7ee20b4f6946c25e1080592224af0d88fade9d1130e320008e3a0a638abe03aa45d57d2d0e09283489f200684ab4a71b34b5a29dfa83a79b592e9db7360c5b3e84ffe99524dc398e2977683045d32dd219b1218136bfb43ef5a913c169eb32e7cdaf75136554f94517e2bffe94c3986b82d113580240751cc3fe377a16f1b5864f612fc3eccd1b23a0f5e3086a4225026920e3e9396273ca26459cb6d7ffd155a89f4b5a3ff11fbe4de331bf164a0c315be86c6bd5837d121e7212f0b850cebba179b1ce7f44b4694b5a7192bc55f77ed565e4b86657d7f9b78ec9aa8a95ddda3b26a23f6e982781364c05dc0eb2e79f321cf06115f0cc85ff51b921db8dd168940b20bf34921eda611cc5d7741d671a0062bb1cb385ae2d152967a3e3578aa451f1d369e71965f9ecde2e3363b755bc294226df9a3f5dd94d81aab60cfcabdd1d73de6c6d07782bb51f61df8c1a7658b78158277875803077999894a980432269d0119496c7cbfa233abc2b783b362db66b1189eff146ac3f35537802bafa34ab58c7395d830991d8d5e6d8a6abc1f82152fc384c7d825a04a13a8f55dd6f6ddb58cdf732b8f846dd21e64bc64528d417f81a56364b3de00bfd7772bd66323a0811515c509ba4aeb8942d8a774aa3cfd22bb7fd7904a4604ac046895ebf52b1047cea436e63296c4cb43939048219119e1a75bff8c548c77dba80348e7708339c5eb32b1d28eb8eef6b67594411bee0b795e4ae3f6951f22060a449ed86006fefb42f4af187af1905a9956d17d8380437edb18f0071588c929a11d87a8ad304ccf62c02e02bb05467dc799b41e7833f3276ed9f12bdd803204ed5ccd6f9c982e2dc142831b6c15ee63e582118e2111f24548482d98a9f90a026ccfe341bee9d2115519749d05209986dde8ee896a1b432f18cf56b112b9465f352b60f23a730d491a376c3de496ca068784a33297d6324fdd7ad3c1123537f63cea3c963be8abfb07ad3bcdfd54abe7011702d51dbfcf0fd7650e2793dc4f4de36d29a939eafeb9d87b91714f265aaf25ec8fe5b877fecefefa717f3920db2aa0457377d57f897c5d03b2e0f86c5101c74988ebfd4d6fe785da7f825aa8faaeff6d8941827d0fc632bea6df864d3a2f47060e6e05e2c35932aaa9caac9fec3365166a2f8cfe4fe3f473edcd44829c9f9c1047e94d7294f428447652d1c402cee44ba72b2a5e552e71589c851e2370877f5d555db9e4b247bd8cb96cea57ee918d8e1db0a57486ae5d08db5f37db6dab3e89b19ac6cf53d5930852940a96adb276c648c95ffeae056b029750f9fad9cdf5eb6a057f68386b5501f10335b6f06aec7ff40bd50e94b65e3756ce695d43fc51eed4c0f8db77192361e1776c734cad7fd3da56cb3c1541252defba23346aa62c57b6a8f5c0a7a19aa0fc9976a9b7056b81193de2bfb6a7e800545a584092ed886b3e9763fb850cc614e72200c36a61172692756aae157a6fc767c8616c9317957e01d46d428358fe470249bd83b54cec561c416fac769d477229f93869c8e1a302636c26467390c8f491aee5003469e7d1081d25a1b2c8907bd64d596260990ddb01920112a92c5f38e878d62bb74e9e5ef40027a4dbd04e00f2cfe1341fdc786c44aaa76416aaba484b0d9ebe4ea170f0887f7b1c0c6206c90b7f886b7d926e5d6fe2138924dc8dfc7492f63dc6494a316b60706a6d73e3a5c9492c9619aedd0e550c27cd5300a0a89ff10d134976810a16f039ba2717da7dced63ef1c9cd3740dac5a59c8622f0e074d4a3291f2ec45b9567c5ec1058824f15a04202de5ca30f5024c43a7336b8ce2854a3dbd5a198dcb85a10aee6d5d428267c3b9ea74b713a6e1fabd952638fd5ef85518c6a518d0adf64c9478ff5e8e6db397e1dc1906218afd4601073ec83591f3e572f594611340f07ae70dd47181dbcdd4b7e65b316248e07d3fdb0ae65e12d130d4e7b2bed80103e7e6b4e004a0b643528a085a7f8b3155b67bd23fad4bb5ed3f7cb793dcac21fe126f2e3babbf2b27ce062ffd6bec278a7199400a1f4c11c901ea496198fca62ce95f2d940134f85d25dc24474b229db30da7be57b4f079ce30d40bccfa6f4dbab1e17b389bc29c812baf99636c2182702c9e3edf127baa641ced3d27763ecc984f8acb75c67a870bcb6684af2da38515260816e2aecd404b49d67e07714d3f30466f9c68d7a6741da52b7839161a9f9f25ef4095b31e739292f3e062d120c1fc6fa66827634365be7533ac58020b2b9c8c6cadc74a760d2817571be5bcebef3fc12350426b82c75f88170799adb151feea83b569e340d96fc5c93bdb8c8b573433bf80ae3e10d31ff1ee79ec59ceb9ef9ee5035e25771ebf39842c33a46ea85cd20cad73c06afa73cc113b1b0ad37dc2226b0e7e788698cd1dd97e7ecf5754851cb9dd17d26c809b2600c51f50097037e14d310c6ccb9b34eb762da62395a638373b2e1327a81e6f97adff0cfc663a1da68a59627020d6f60d6d0c43f4b6d3f31773c17d60f68d6a9530a821c3df7ba2130ccb9a90d682b490f9cca72bc1f0e9bed698f739c87501a84c9e59c2987c08c97417bfd45155f4050452061c83ddfb251b909247b6fba5935e74f697b23ea8a39b167432dd419ed8ee7e61a6ea0444b53d0aa512bcee97607fc0e4895d9d155b9036f70be7632581ca8af4d63f2d0647a42ac72ffe7949af254083850eba30035194aa19cc951362212bdebd59557cfa615d8b88f46dffdd22af9ee9e6dcb89ac90ad03661e8843b1a2b0176552dd94567c63b9764b2024f420657b22597a43f3e061449eebf1f8822616df65076728c1d2f235fbb24ea99a17507829323f850d3d20c20c0f4381bdc889b669c1bc8ba8c2f72fa80872695ffe93d0420eed916f59ab37a2d03c0ffda55de979b76400a8aa79cfea2751a71b05f18f9b7c3511204daaf3fb56dc486229dad02abfa33adf75e6db9b71d3ff3da7334aa0064a7ae64e4a08795db0e4aed52d7b77ae8ca62346854d6412abd927fce240b014a7a8ff4592b28ab6c4be3f89d9674a5f339edb6a16531ed8c925eb05089a21f8e439f86ae7ed4811c424b4bc052ed87ef8220b19a2b9cbf4226a2e66a1ae9ff8e3edad6ff92999f6b685ed011bdc7652e012637d02747cd262962602bcfb917e26c018e25e651d02eaba29c7d485cd9b918faaa5757ff5741bbe697d721033146fffc3a4b3f5909a4cdea07a5fd2205d2d270d03f67f7139d925145df61e0fff1dbb7201518f3e95f83e424c32651f0e387b13a582af96a5e5a80d5db4c0b8e5ec15dcd26b4c267792dd2fcbcfd40bf55ce23493ef3d0fd971d4bea09d45361a57bc37a99d7eeed639ff1df1175e24ba339f0a5d47d77c1e86287f82d050af175b032f771b0ab3a85ccb411048858451c48ccbdb82a02f2216aaf5127ff447cb200a8004043bc0739081fa9e9c40c033267b132a2c79665dbb22c366420d82f9962eaace186a941acc66a909ad358039bf2829f3fafa3196666d96f76bebd952965aaebc786d028745e97d452b8188a66707fa3890d13282dc51732357e4ed0f23b0b14ff115120d3faa779a2a284e90351f27b80b7d83a851dd785ac701c1524dcb0a3f1cfb6e5601493c88d071523c311f8453a6d2c70f311ce785234f9e4c46d06da73b334cd27d10bbf69997bd7c87ad07514144cc832a8973e6e0b8ebc757e1edaf66b20d99e72fd4af806ba2637ac713b8a508a38483ba248b11b8f21acb22595783f26a46247c7cc3c7d31dace98622632c69526850ed120cc543d8343df8f8e199068420d2ff808a6d48b2277a063e89c74967ed9f379c8cf758d38ff6140a214bdbbe0b7727f38ae2ea3a22c56e5e64080f170b110fdbdf5fc3cf01947df4c882a1b69985929d081c4f0ffd426e8f43922056c0719ef84b3c6eadcf14c761204ce6db0fca2d2bfede07a1df6386df39386bc64ad4bd8f65df4118d67e244a9114a3c7f712c757e359ccc75ee05e9692834f0578c0ebde80ea00e91aa89335a44926d43e868a9066c37254227da515b0ffec4da79d8146ba1eebed5ec96a4c69641f129d34979ea4a21a02677fe0471faae36760b040696dcd5a357e1cca24ebd9a766bafe8d5f4b22948793c7696828f9ef285bbed335b62de545accdba331504ff2799fed426160ca26ba90c020753af37236943e0288e316aa8c4609919f715a020d6b3e89a7add7e23380dd5c854b6d1ba69d41b76beaac6b17f114a76a54626c043d3a1e943ec71665d67351c3f3c7fa865e7492c1e0218e20ad4e7473989424c10842625628dcc608723f10c9f95fe65cd7d1b9ada9cc78a287e6d0a47a456781fadcc8c8bbbc4d57b88a1a2d00c0c63f10d8ff81973386f3f440a643417c4e469cedf76e75b32d7acc15e5e3ca8c02acec016c3e084fc29d5112cfa140c0fd75fb41de6fd0f8807057bdc503cb331beac2423ec0348e6379b0df1e231a2caca509583e7ed3921c5c405e7ea45cba78cc1db32a930fcd4bf2892a68e2e478da3e52301ac2aadcd728c78563a9f0498401238d9ae8ba202ca1bea17dd6b12f0d2af0707d5951df35b7cfa9974463173754d6add4b919b9749346093ded6296600536c66f5f4a5335c7ce7b7117a2d729a5a389bad8b98634e64cb1bc6732e7a3a576146a3fbc4802543928acda3a20ee9d25ede146e61d9e8fcae20de995dd690440503ed5d2464ab9b63bf1c762b978309647a0bdf0ce9d372e4d596356b4cf36f566678a57ab43ffa4ce42e8c14bd47cc018aa964748ff041a11d8f9f3b8a5660f656153550820ace6eb91bfd016547cd4ce204bcf173cc6d4af522dac018aa91842e6532945574ad0574fd0018206e04e5ad954ab6446a0b6cc0db34e28c8ea157c67afa5f5ff038261ae8b733e79316bce1c2b345f9bdc07d2e615606dfc2ee972bdce447eb01997785ee3a4e20045da03d67d3a8b993454d88d7de2320f70d7fafb83397404e9d8e769c20e612138ee1d6b040a1b01a48d57831401203657f4e6709cbe11c0006808f0784a85417294340ad42448225d6919d1323b7bb340e8ec7b588ebd2b3aef43e1fb9ce1abb41ab03585b47570ddbcc4033531211ec0c39f7416f7d9c00b020a5d8262dd2e0108465a752f1d98a63283e35b2073fec4f476d65dc8e8485872cc441d47906bc0ac23591378726f00004e33259ef66c2767286320c214ccfe9140362119fced515b8ff7ae9370f5d95427a7654946e803d5aab24cc8833d210d60075b24b07d9bd2bda9df3b72f4eea9eb6a43ae9a782cb4e238b14a1d979b7cba8b7f122b336f2c5de5054a9dd6f3ae01856a8631bd7b227b12cee94f5cc2e4cb6c544806552635fbab0f6cb8cab9fbf30643e39e4fc68e634ed39e506b7f1301bb56edee56a3968a049b9b4e6237525edb1ad17b55fa20b037d17db785c905c3de223dcf73077bfbfeb471bbc538c4da821092590f831e1d45c418360ef712514bf25273ee06a4ef9ed2089c7862cc3a830868dc8e17c4f00839bb1e68d588a0a8c88bd20551d5b3ccc45396c44005d53a508802acc86a51a10d22d798897de82c2cd7bcfea07a88c00d0e029e47cc4c876685fb63a06e5608796b9bd6a44804027e8b12827a50982070694c950f16928cb06e8a291744e9016e1cec47a4c6b31b6bcc263151af9228396a8a3c68f5045a5e6c47f58551009601f4d24bed82a7ce2f487a93ec095f12cc4ebcb5174499f945da15af168b37e85dc8c7181edfeadb9cb315950b5cfc9d92892d4cc82a1ddc1f18bc4741cf20b9405b7a178b8b1110024dcd12f30694151d8226e2370ed9b8e0d5f7ec09111d4c59655b8f9ce099f73da6015fe5ccc281462cc05f5ab9bc8ace1869e43a786244083ba2f53faa823e92fd00a1d3417255242fe81351416ac8e18102ccc188e58120b75e3185618b8974256694f169a1cc595558a5714a7a1eaef5e919b224943f17c78d0ea666de2ae59d187dd5e6ecbc76d50fea02cfbac8d1e4dd09918aa121564f292d08c89f3deae43ecd0d027084b22d8103807411e78b2908896c8c915b69df0be2d6ef265742ddd1d22cb9f751396a7394005ac061168d92921a00c79067274773ab229e9cc35cd748183a4a2c1cb27163b5dd638c07b331b1b183294aaf2a5dcc81a5f6292b2f2622ca023a90023bbe8caa8a1f791bbe30aa6419cd74b1bc6cbefe7214b823fb93c3db7d0aa51d64fd6912df5c144b9c75faf13ed9fdc5ae46097ef4186bfef969d58444494dffd042f50d59bd60f7822496f5704968eab142d59a59aa6d8f0a18d349996ac3a97ca78c67e0905e1936e2ac02e30b44444d7a76778537c204714e17064f9c2a50c07930d1a4879215448c7336d3beba12fc7858549018230f287ea891193c94da7f36819790cc38c3d768b8d62715b2b4bc9b8bb8e0cc074b4df303200b2efdc7086df5f8c224bac84448332a7a14de513cc3a586ac42a3ec586366c45be7e809e180e639942a90a6a6d5522e908a47dbb963c60db15fa0efff5d03c6ec6b59f5ef8b927ca70ca738a823a3de37122897ef23c38eb41245cec58562469b0fc2910ab3443a2215d66b6995fe0c70372f1b7780c2df045341f819010541f5a941eee665c9982735b53fb6c2cbfb63d0138f51b257eea9deb3d7c62fcfee571a04cc6efe9b34851312164d107ca33623499b6b8b19d8f36a50ca25fc4ce4346cfdbd1bc4dc38c96b3ce1098f856f1730567304da9e047985cc319570294003b1a005d9153afe226d731ea3cdc421048bc9e6f2f2910b6189f496a7c40ca74fd2edf735f9431386d196b34f3e30afa5d9e647fad98ebc0a4a5846b1da0472c1b3d267b623d6e4ccf207a4c202aa5b9a755d605655493af9e7fab8b5e70a448c7432f5dfeed11705a2ed7fa691d2785f148901e2dcda9fa9e72e8d80b20fb40d7f6970e80ebaf9b5fd4b9685b968f4ba3f44a06d416494f713e6429a2ca7f2aa9e8fbf95c4b609216493bdf7967b07870736071e07970d8e87c1e595588570e072bd81cb9b0d5c2e09e1780470792556d501b85c0dc0e50d73f135707925d69b0270b91280cbdb0066ea0d8e7fc1e5156b4886cb3586cb1b0da9211c0fc3e595f8f68927cbe7c4e56ae2f23643fbf8e078175c5e89efa178b2523270b90a80cb5b0c3df4d243383edec49335d382cb35005cde5c6eac191ccf82cb2bf151154ff427b608c51300b85c61e0f2d6c2e5d20f8eef54f5052ed7cd052e6f2b58b8bc82292ab6ecc478155c5e29715c2e6d97cb5b4cc1e50d85dc51e1f20a963ad72a9e664d6c894fe1f24ae904974b9b092e6f255951b85cb7125cde4eb85cca482fbcb4491e9247c9b5a3841f9f4b353454721b93b6cbe6b2c19573a5ae1b22449e0b14ba4470a1ae99a19c9cd16dbca99c00f4e31375441dcf05d69b1de8e4a456abe70245b771a60d5513d49a8aaa333c3ccfc5470a2ba09fbee99be702b5db38c3523d3b3a39478e3c1768cd582cb06cac1a0bf5f3731b633f56105a01f9f0f15c7280a0dad18135cfa531a5283a04bda136b426091ccf05026d614868f554309e0b6c4c7588e0a3dac92c98e5b9c06bf55ce2135e4b3c868a01a681d415709c028eb78e682c6f9fae556c89cf2f2acf2382774e55db4c58c85c3bb0457c9e01bfbb78315996dd5daf55cb905c6f3c5b7f05efb582c1f0f1d74e8e01c3676c06c786f1ed08e1280386cf579017141b6c5373f162fa7800f8bd23f07b48e419b246b1c1069f25b600486309407684081122448810214284081102040810204082040912244890204182040912040810204080f0284207de703f8b879758c2d183d835efbdaa690f06fc0eb690f159af9b9773ce0e4b1f3418be36572b5785d8e0230b0ca1115bca0d13bf8c4306e47264007777156716589ecac94194f5030a4921196ddf133cb0a1dbde701c6f63d7ec78d2054c9b4864fe5ea34ddb6b5475db4aa577a758f3a24da2c78e7252ab5e58a65911c936923b382b31392981523271224505458a95dffae34c856679c45881ed8eee66c6a241162da66add36ca812d431df8a3331734990b7f62cbfc762110fc017774747238b0e50c856a938e3ec9e86439590ea594ba704a61a02da79452da9d5218fa534a295d39a527ca9d524ae93da526aa724a29a529a774069ae294524a519c5217b4744a29a528a754067ae294524a4d9c52015093534a292d39a531d012a794527a724a5f28e994524a0f296d41e129a53b024029a594ba502a4f47a7db29a594b2a09452aa439bb2d3d37700a09452164a45a7d49e527a136b0355b1e2059893690617320820869716017061010017585c6081e1a4a57bc185152c2a4abe721277575fadac462a5a8a2a48a5a24a516d2950f0a8a49094502e3a6162555aa1acac492d5105a9542aad847592e23129c9483bc0b8ebc2e00eb6b9ba85c99d1da90a5251955461dce8dab64dd2ac364ea5dc761b67d51259b22d6d2c12f188e6a9e561591b991b51b165e6bc982871fa14a3ec11a58f1fd8b2dc5eaae0c9489a9667c9026c2f79bc98eef672a64f1285922894ac41499b236d7ae10a4f46e2989e2316865ecc4a913ec9542a289544cac84f9b520ce1c9489e199e231188bc98abd327a952eda854aae883eda38f36fdf6d1882723835c3cc71960fb98f362526e1f77f449ae78e0d8c79a369db87d0cc1939934323c471160fba8e3c5a010ead344a186507106155149b449e5094f66e208e0b9a1b07a312843fa34532922a922a920559b4a1cf164264f0ccfddc3f3624ca4fa3455aa1c958e2dddbe5bf06466d0cb73bb00dbf7cd8b29b97dd3f469da55efe081ad95852743695a3cc32d1c793127407da228d40a25841a2ad22693223c198a13806778046ce9ede18f3ed1540af2a486a488601b6f0f69f064280f6c315d9ea10db03df4f16248b787367da22a15bc51a5ec218b6748026c0f47f06468d00f7da2f5080d06c0f39302b69fc093b168a07d05da84dd1ec78ba928207b1efa64a162cb84e1f9fd00dbc77832160e6c31ff78b617d8feb50b6ccfa24f564a87365db787f162e4edbb3689eec2f30bd89e7b8ed87ec593b178585e4cdfbef6c952c596796b0f9f8c15747b17ac0d76074b543c418952815a81c28132590f134e2a9e32944ca5523c50264bcdc0a38a276cb552ad542b159e97415026a3712183f0bc5cc513a652c9954aae5472450365b020196850f184a552a8142a85c28132188f0070f0c450a8542ac50365309c1878f0bc562bd54ab55241198ce66506e1f9b99a2bd55cd140992ba8050d2a9eae540a9542a5503850e6e209000e9e170a954aa578a0cc85e3c283675dad542bd54a85e7691094b968e0c58206e159552aba52d1958aae68a04c0d02000d9e359542a55029140e94a93c30e0e05a2b2a65f140998a035de0c1f3962a9eacd54a65ad54962af31104652a0d6c21392e37ce56107e5c3daee2aa85cb3d1f3b9217a04e0f17b8151c8b0a8ed3c97ae0f9152ba214a8d4b3149e67b9f6ab8c66659562b5ca68f0bc8a14ed842a28457542a50ac2f31c8a4c054bf1a460a913580a4b5d14ac0486c270503054090c6531148683e76fe22aad301a945589d50aa3c1f32b25d5520595a8acca5205e1f9142796c995e229b952f64a595c8a07cfa3a0345e17ce85ba50170a07cfab90e6a8ae2e9acc67b5aaab8b06cfa7e8609338c79faa0ab254397d8d83359613d918d9ebb3ec429b0b775835b06ef5cc8b691a94f6a24f35628bc52334842d38832d93f51d18141c3be390e7623ddea8fad9e81ba897f04ef0d66fc244cc3858b0ee9a65649c96fb9b8d81bd9bbb9171d0a6727047c31a580377409bac76ad90488d7882e996fe4ef501fa7940405735e206db18f6cd01016fa817bd6dbf5ed1fd0162cbf5606fb4ebe2b9f4b37bf30cb85fd81b7b332402e766981b98a3a2c3b2d33328176c0ef57d6a73401c7356eb56fad5403d5c1b17d3ae55832d0e6993bcf5a8b25e2d0e3736edd5e2d0dc8d8cb3d19df51f20c6b81ebab35e3994176c35da84dd7a0f36da047d32ecd60c8b802d4804dec4938b6ee9bfa83cdb90129117b9c1d6a14f5fabad5262390bdcb79e99346c3e5e79d22d42be2f10f5259e3aa85bac5b9665fd08b64e832dcbea5bf741769065613646e4b6eeac5bd59239340359ffa03344033ef0c10b7cc092650d96a787f4b00f0fdfdf81a365c49619b9de112c69b0c4d12df2cfde3071bdeadf6c9cee300b89ad1f7ff409da142911d986449d36d9e0c5ac20d2e0c9340fd842561f3d544bf80217b0de87d8730fc5cb67d6ee60455ccc69530c784a278e94832cba8b907bef14735e8bbcceb5836554c113278ed86ef4fb86ebd46b6ece6c39dee8c49b36e1f449d4a62c77303dfdc3bdd33a3fda845d6647bc182d0789e534ceee000f8fd918f07d28d449f4500f5911480836ec080494852df71006fa49f428ba31a85b624e0eb8053c8428279e44dceb968edb164bf1ef9ed4c276a381ba9345bab386c8fd2369da94fb074b897a316f2709959123581e25b5e5fee9d54f9bba489b1e50bf7ead53ebb6b54e6948e4893f7e74b702471fddc118d49dcc9206cbb7a4e94e46a0e7226f85ed46fc0f3dd43af1146fe24c9b6e740ff59136d1bc18ebf2b1032f067b760c3bbd39c338abdf2b1ba33b8916fac1963b074bf91b2cdf2ba11f7127c71b60d95cf41183e821100482401af6d132e658e42c2595ad71e4fbc686b65ea17ce7f86893bc3c958f17eee84e761775624ef4f15c64fcd1cd03ca441abc16f232163991d2908d074b6983e7229f7b05583e433162cb1108b729c703bd9825bc98be11577d6a77e843f8eede016fbe604d4b58d39d7c9136b18839515e762f6df2112806bd98d70d5b66a2ee6e0c2d9c91384c5cbb9306681adc2f3bb429077d0dddc17764b36ee488b4fb9735df42c6c9ee3eb0cdcfadfea5bf783b38a01c8cab038cee68cae46eb82103f3ca08a34def265ebd98b6bc18fa3dfbb827a5944fca4b29a5949252213935f8f430e83c7d29d6ba6df4dd146b43f9b1c95b3e5ac0c10da2d05db79149a96aefbd2775a4906281363e7b355e1c1a5bdacbf09332466b12070c8e1480c137b06bcf220c93e7f7f37e7dc68ba127c18fe0377812d16b81b737a952d31e2f76d2cd2f3c974437576c7f34aea402831ff797ee45617b3141bc185833a10f3cf34b7c97f871190318fab85288a64d0ee86e762f95e0105b7e8787872ffb8556a0c82718c61618eabc16f3d96586c5f04f56edc5340c862fddbb40e510eac40b7f3ca8131f39f9a44e84b56e9b8cf576d78759b9aebb898aa713d46c143d7dc12f7d04d347fa86607a696da09abda131a5cf206cad698c3152fa3829d41d7d57ebb675d7c9e7220d304d84c46007ce1d7edd8c9f7753fa0fc399ee3a6e3d1a328494524a39a7b49173ce29a79497524a293fa5bcf5824d4a29a594734a1b216090839f1018a4f0ecf7da74fc6240839f10181cc16d21862109c31318be740c862ff174bd96f9399b7baaf9375db0c0bc38e0358c223a230a78d0d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c383acc61384af050a51217bf2b00823f8092922099cb5562a4264c81544a66aab550d0df8dd05cc8bc1c2165e3739f05a4e2608308c5607234342dd0dc126265c96292c69f01089a47202d08fcf0fbc6d5c8e36d888f591c20ae847244af5ece8e4f4c09ac6e546e11f2b08ad808230067730e4812da02d0c09ad6ad521828f6a873e2278dabce0176c6663c1f0bb8994a9b045bcf2070f08af835208af254aa02ae078042a65c4cfca1d15bc134c039ea5100c7896452ce059d2808726bd1faff04e35643c4b0d28e05906b1c3b31c810e5d32847782a81c9e231212f01c9b10e3394601466f46bc13ccc1e139dee086e708c486e7d803047cf47e0cc13bc19f033cc71218e039aa003f47216a68d113dea9670af0dc5320c0735f6100cf51032f4e72c43b754ae6b9918879ee21d0f0dc488069edfd6ec13bb5cfe9b989303db711333cf70d5cb4cdc23bf5900ccfdd01013c77086278ee12bc34f63e2cc23bc59bd812dfe2192e2100cff0092e2c3aeb9e2191966788040ccff008003cc31ce03ea4c13b45556c892ccf30071281610b5e381cc13b45a1fabe54c00edce797855705dc9fc08b2acf6f85e21561a51fe39de40e8e94e7c7330013cf33e076c19d6f6274e1fe8a7792abd812e5fbf04d6b43c3c4da002e5706700be060ae1d195cae0ae0f2b603a70397572e9b1cb85c13c0e52d062a35ab3123dec67c3a4c4e39232631f913b16843c49edd2e9e76543e939b51650d1a113b42cdb2cbd65a8d50af5a6b663392760c236958166fecae5aaf63955eb5ebbaaeebaeab3696323b42adb5beac56aecaacfed80b672c80dd19346a40e00159b7c5530f3eaa9daefbd97e36d455a3a3676254c59868a3ea34605e0c7d3c0d2fa69d1796519b7140c09376c56337e28ea55a3b214a8913931238e7acd126c8e334605e0c76f81725d0049ec0121005960e217c09a5c48949099c179c734ed17cf6ac3db34f13659f9307b401f2c00d50847c41655c9d9cc478d4ca012171f61c24387bb4f4c22886611806836118866198bd306a310cbb628c31c618638c31c6186386c238a843ab99f1f3f3f3f343330c855118adebbaae83379a489465a28c3483e4e7e7e747478d28e3c073d1c06b81ba892da9eeacee5bcd3e27075124dab367da853550c7cf8ce762f5cc8bc1b0f5d6c08b79388d7a337e56331575040cc332ecaf5e1727b1ac56a971b006eac074d4601836e3e7e7e7a7629a8661d8ada17134347b5d540dab1a7655ecca5fd4e6703cabc42e8e06f73383468d9a6135c3aabc51255fd2333d83f57a7f803887e3793b9f6e07a683564a8c8be7b5b64091ecb1647803b7f3105bb2b0354b77f049ca3df9ecf9f08032f132de0a5bf0f0542598ed850707bc985763e9b934ee9c013c27944632eb596d5355f95b79ad2bf5585db1d12728149f106a06c3c3949fb80953e9282f71f8b7e9e4d0a4e4a4c3bfb469b41d1ec61e1e013074e0c1018fb0ad0c586bad42f1a402c20ac4930a0ed670f5722fb658299e92e229f23d0323b8849f901914c199d450dc95c75bff7b2fef10bf2ed56e767bb58baeddb693eee8259774935bf2936bf212f7e428b7c44b17e5266ee927ae89f73df194db57b90fafbc868635f10473503c97f0bdd048b7582b8739f1b7e25170b9a402735252eeca213e719160ab47f11c71523c4721b08af51eca505c8853a45ce5d2ca48f194c7144f79d61a8a1c523ce535348a0301318a77915e1949790dbd924dad2f3492d23fd0279e6ca8dc1417c5addda1b813ab5c1bea532e3462fd847513b767bab35eb28e721b65fde4f6ed92db36cde3f6769be476aa7bdcce691fadd33f6eef344f77aadf1ed24d040a3deac8aa49d997d73394f755ece26ebcc0f0f2aa734e9b854dc217d39b4911eb306ba02560eb5d64462b63befba78b3410148ad18a3b26faa426b39ec1b0de038d3e91fedab28028007e5103029e69be0ce0c974f788b1227bf668e760ec16bb865d84849a1c7b92ad1fa1bd88de40be65bd0f7cdd5e17e1e0faf878edf4063735f5fd9e120061173a991b2837506ea0991887c8d47f7254c51a8b054b0301691cc7558e65450365353496175aa4cc44cfd76c479f782a712b0ec52edf246f25b88bcbdd09f7bac5721a579f2b9659fb161ddb300c136127c1441856c230ec30188661980ac3306c8595816918869160d734ab711c76162b03b35caebfcfcae8572d5ef9eccef8721d7610762d7849a09e4105716f737061a1d11b793aa6628e0ebd5105af85f579234ebce98ec773b17edd68d341bd6201b692d8a1c308508c3e2f26e22b5e5115f1f5ebf0c944156c61fdba44cf418245ef67da655fe09769c0d692d86f9684e4fdf83c95fd8b3665b732d89e86670ff362b4772fef4ab7b7f6d6929cb3322c89b576bb406db2489eb79390dc151b63c3241ab63509d7dddddddddddd2844b746779611351806fc84e404e1cce5ba0f6771f6847996b8ad8cd8ddf301d59ee9a017ed458336c4f9cad558b131200704c493b3f156cd8425645a298b4193a6a0eeac062282a4e9ec5689c7b643eac0d663169ef578e4c5683f419f2db4a92da124ac223912a915c5c79645afd621918dcbb5468abebde1860cf7414222d0080e10bf3f23dd59ef71d047060dde88b1fba08fcf7565bfb02b43f18b4866d2e08d75db4a5775f82b2b568c29ac0cf98e286c0e92934011fa401fe8d333db067da0cf73b166b80c46fb31015259411643d87a76815ff589f2eaebba6ac57e61f5dd4be6422b82adbbb031566048a43bcb9ac196b9d0e885a40b676e8de7625d4e1f7ed8b0049e8bf508bc16962cc5138e6eb1fe931ba881544a871cac41b13122076de08eee070365de4b7790625086469be41ba8d42ba06eb11e2b561b28e35e07ad4ad8183487079f348c9e749f01e28d58564dbb6070a621c6e81355bdc1bc9867928fa4e79712931394c7d3f06464703cca8daa6eb15ee2be6e39b9af4deeeb92fb9a745fb76c97092be37ad11d54915c8fcfa2e7a8b2aed9c712368688030262122e8baefd7ac9cab86e3920206ea0eeacdc403e284254eeba1eb55f9c3d1012d7e720c1f5548bd82f21b68843d08b9488bcb01ebb9777a55b33d64e8cda4fac8cc86518fca24d395e5c1618386a7cfcc023373cbdd291438407c9da406f626554cedadcc01b78139fe9e30c4db43eb231a808468bb1fb4ba56d535945d8680653da33240293ac8cfabe813830351245bb6d9d8d16552a55bdf61c4548e0e472c86f324a294b18fa18b1f53358457f4a007a114a417840687827981811670cf090dafb7bb37bf07c7e99c10fdc023f213248a2561d9286e4d9df5f94fc99fc9df84bf963f953f933a5e81b1904b4e1fa2652abd23b923aa8c5a34d97c49129d9a34dd8678feeac246c10e7d26c13898f36272c72623ec320ccf20c57d0e69ab857137774eee6266264d10a835e4c89cfc326bc9893cb19a01f1f6b926cfc6fd52b1c1b3953391b94975e7a863657c569c5e7db47cfeba2ad87b4097b98f41b2d6592a3a2c382c45d4a15f9925479426fe8ddcbabb8bc499bb8cb97da64e2f22a679167d1a6edf22f2e605ed4808036955c1e469b4c2eaf439b4e5c9e0707b489e5f233da84e2f234fab4e2f23db4e997596249faebaef4696590a49457f98adb37b185e5aa3ce5b2fcc44db9c93df1926b72ed963cbbda49486e2ff66dfb7545b7ee65e2d273d7c4555ceea3aba2debbe2364eb7d8882df3a48951a468d3cae76b68ee0eb1e226ee1036ea2aa3370e5957714d5c742f7bb763d79ee462cf2e49bda4975cedc435f9bdf529f7c4596eca57dc28145b72695bb9ffe89a788abb721437c5ef1d5de5a238cb55b98a1b57dc68a45b2609269e6c748b54c1c9735cdee42f974bf2a47b7be84e7ee5d6681addc9a3b833ba9357b90ee84e3ee5f27075e84edee4c240400df74577f22417e6ba7861d1b1bc55a489ab09c5d3d62d528e543c234992925429894425a9e294504ac49c7c1ea200b200a6e09946d0063006f370244952922a2591a82455ab745348a7271de5a6902e5f631c428a3bf591e7c5903e1f8f78a7de6953ed1d04e92021270ea15348e079d149a29348af383c7c3db3913392467640e24815c81284a0662737470570fdb43bf8306d0ca8511b837411c48156467ddd55d1c5e580b802c1d3ddbce8c56c31a41c2458f4eb6ef524d26b3de935f4761f0602e28b6ba19bfb0a24ae8da014b10121710e28842f1423b62c671ea612f5ac0c58b9932e673064063d46a7a34b19cc6016fc84c8a00667552b41fab1031ae81481e78578313ee420c1d733e9dbb3ad925e6d209138adbb49b2dfaa7ddd2cc782e1101be9f4252ec43f487c3df2902e49249214aaff01e616c2f3928b33462c2b49a31b6ffaa4033cdf42738637df11a491b4e48c9cb9c1d026725b2471d0e6f606cd4ac2f6706e21a189c43bc10787bc98d1a14d1278c2264024e079f90c8780a70df4d138a3bfd17dcf457219c7e50cc419dabc980b878849b4be897dd337d77545d7b5d7d5ae9b5d17bbee75dd7a5debbaf4baf3ba705c24d1df7b43c0ef0f094a2dcb9a61646fc84ab49292ec0169262a2c338dd3dd7f764e71c7c51b9df499916e0f3c49b989905ce3dce86c39e69682145eccf609b1dcd1a752a9c7943353eaa891413c1917b0c53cc9a7fdd44c20682121a1ad54fa8564500477f80991810f9cbd7e0f4a110936394422d13bf12467666ee6cf8e9c215d5ebe17f3e2091ee996f9a6b9691d3b2e1cb2037974425f9532b4c9d006a7f6d87c947ee079211e3c4b94b8908deee608f2b83b4484e691cec89328056d4576545df79784261e71d04609dbc8f6e8b611246cb96f84f07cdfb409a7532f46f4f926e2c56c407ee09de20d079e6906cac41fb0c5bc0e0b724c80e7532218bd74b703fd888eacd1c8ba4a2cab64645d29a35ba467d9e8cefb3049a2d104dee985cfdbc0f162469f6741814f707e2b8bf35b411ecf659e745fe0a00a5ecbbc0b2735367259dae0c9822397250b9e49173dabc2667298dae0f461bb26175d88036d26ced0c6848336dd4d165c72730cb18d6cde8b79d86534ba0f471ca3d1e87234ba944fe61b24ff01e2941c58b0bd3d56e30ff95992ff81e7e9f6fa13d161e86bddb65289e617b2cb3b3ae966f91a84475c66c1f23858b0c4db25c150f2782ef52478bba22111deae2562f176b51c0d6f378b3a32bc5d6c752f9e0b6fb7f64dc5dbb58e5878bbf487e2ed4e1f136f57c21a89b71b71c08878e3589e4bbd8438839c6c98e7d2b7190db85f72912deecf52b791e07681a7cc4c3c2a7dde1100f283a7fb2e64c04ea2db48cb92901140f80949e9c019a2840c71045bf3756523d6ba6d3d47f582413c2c339032278e0a48c8832dbfe02050b0071c0196f00458c216c8181f1f3c0ada902395eea63c44497a75b87454ea8e06c399ebc7084640c2b66db6c447b5d37515ebae98454d66d9b5ecf6a218a376121226b559b3793be735ecd1625996657093588d59d7755dd719a1d65a6bd5ec95619abd32ecc2306e8695588d59d7759dedb4ce0828152b31392981a1d412279a892dc17e699acdb22ccbb22ccbb2ac66d95f961d26cbb22ccbb22cb399cdb2cc5a4dbbe56664194743ab81412ca18451e5633debbaaeebba4b4209ed8c533ece789b837c7cbd91fd070864d1a811a7b457e3ece62884adc71ec4246cc906b11ab3cea7ebbace08b5d65a6bb5af98bdaa56b5aa55edd2322dd3344dd3344dd3b493b41fedafb5d7d0da5fb4e9ba2683b5d3f0347b4dd3344dd3344d23699aa691368d3483b46935ab359a45a8844b592a93a0544423000000146316000030100c064422a1440bd354540f140011748e4a6a549aca83611244290c23c8304208000000000000808088d50034b8510572719f8be8b5db50a7552784556f27ea84e95867887d69683ccf8046168b068104f73fdccc581cf635fda6581211a8e16de0e23a52c7e7f60e1b325b3c809c23f67ad9a5f8fddcc5b122b003841980ae794a711fde668a4ed34fa32c909417319b2bed1f5ed9a57859409437722fd7dfbb92d094bb31e33154a8d8c231bafd3729569a993d9607f872c5136793968d1954c4cc05a0709374094f431163392a40165b517e3d8c3e3aecd9993c94cdeee3e359a926a69ecd40c4dda3f000db2bc5affb8097b060426136edd9dd5f00c162f2e975c1e606806fb8dbed7eeb2096e432e132118f821ae28847a48656e221adc15d01af7701de2c869279439a14b33458ae1fb89f502578fb3ea2327871bbb9b823645446361f03cf8d1bfeb713c40478d71cf4ef2b2d2f80c8f772ea3a05cbffc272e6da00f61becbf4ca2aa3f39964cf8f88790e2bab73884b2f315f4bc8f57d03daf38ef9ad6f7b342ad0b66695828e796be2e0484a572da08887abc3eb4ae08f12c11e88e206be909559a7d2f6fa2e26b20123fc0937d21e1cd00ea68a29cb7af010e3deff9a436059481e316c3c37d12aacd13fd78bef2667aad60e5353b0e62a250c90964931086056a6d9181567cbbf6364c177560944b512baf5eb293d3b9750ca0d664dbf52d6accf645b7b77067f5268e030e1fb2da81cfcdf162d2ab0bf1943b992a8632252ec74d9323560caeb0206748d2ceed1a768af24d982f802da8f699b7a96c3e1ba85e4f44e8f633fbcabaeb2fac2dc5e849860ce4d34fdcefdb3ebd699429b380cea731d6c90250cda68c134af3a7b9e119731e248357b598b286a2aee2c98ed5bd384b98233e898174a95a281b2f87e258a2fd774b52a5097ac49a3c02681e04899d5888818d72a96c1581f273830f00674f3db5d89e0f1f922c6323e5ea8d1a0d8a80b0f411ad9a4281bb464637d0e959d5d0e1b85562419ea547d64f860d25776c9a22d90ca68cf5bf8c0385222dd380bda685ffdb18dcf313d30032909db5ec424ca6fbf9166d7ec0aa21f0348dd19a6611c37d9fe9e2e9cfed8d7196b8949eca340a6105bb43806edd868ca043663aca8f710668d1878edac3adc34c50f2909b7e7b5bce7adff27444a3ec724f0ec07e010c53e266800f8a94e7cbe99d13fcd49e4787bf2ab1c8c7eefff1acacdb6dbab52502543013401c5248b8d054cf7015983e28419521a0aaebfc404735dd076bdf06afb00f12c7d65d8c96ef963f9909e62b46979e29ad7d9778b49a21fb675c524ba2ad7a7d1305ffcf9fe2ed61e2a4d5a3934927af5b01be6c45199e771a83bdee2cad5f29dd7fb47a1ff96229e9e30e670d7703a00b05df9f33236ac1d0bf1b1871971fc0344fe3cc06c809064647d433b9eea3c73bcf9b707dfd186bd750de724043d69465980a607d2e67806ce11914dcf4353030352969597437e1227e2a0b23bc291a61d648c54e4d75b8b56c1e13840dc6d600f19f99e4e1c83bc80f4e71901417b7e723f217cc4b01d06408c41973b1d8cbef89cded19a1cc8c8bdbd46f2fc0811ce9dd1264493437881ad00c81650b14ef93ab3c0e7cceb7f6b241e28b58612ba75b890354df975f8590c3bc578f04dfa8972269ca1170dc6a04cb0f3b68d9900ba0d50a8cbf29da8a9e91c1bbf19a83d642007daee233d10607f1ff745241b019dddda275defeb85e2c7f730965040c16f514fa0b7c74cdefc1e9ac9d363aeb7da8181445866b4152cef436c54b70348b22bd49f89c70240890053a7a29a643b006bd217caef8dee2166d3267b9b97d9328cebacbedcd2044ac009d671297c6e6d7252ca5375a667263540127d1265712cd602e181116a441a89b0bb6a6d8943f5b4142aba1533d2a14a7ae37072cd78a0bc89c77a476c7f94806d515e1e8808183bed319ea7bc76a0d141156d90dc55bc3cdf6cc2d60b0b315b946496a3dc5e8f76e8d8249da5ed3e5e749a81dfbbae715c313122992d8864388f3d758c4ce1d5ff117b14b885eb8bc5fc89f9e47a8387932b54a917fdd831119a2fcb121fa34d2538aa50c5eb666092927b9a96174e410e0c832d9eac297782d1f311dff72c34f1aba07b190098faf15328e65a2e2d033649b06b6a16e03df900243822018eb1532d4e14916ca62e0e4f0c950b00d40a471d051368ed4d790432d82ac339ccb5559bb61bf511311c7e19a298890aa66803deb6d843b0316ee0caae87794df2b83d7e8665f84a337f584d3ad92f17beddb6bebb83c043547f55a31b3d57b59e0241f4f3ca3b6321a4f617ead7eb7eb778ede30536d59913cb82225438ecec06cbaa515b3e9ae1f9c94fe07d24a09dbfe6cad696c50291c03e7c372d256f2d3ccbad8a08ee76eda7619d13b75d86765db1bd96c135cf67f160972b023e73e52919c0ee48cf66da83428c38ad38a831750afd86a8630e0d9032407a1f7096c4056d77e5d481185182f2d2a4a15b772bea284dcbfee636cdd0a77de18a88723b229b15ed44cb368320ef4d5d194154a38fc86c0fb17e43cb25ae3ef2a5ef3628890f0dbd65a25b626b584c04cdcd8681458058c77d587c7be96daaabf580db0ff696ac166f317e5eb2383a343b85e5380a714157a5566f0acab62a4951d5beab6a406f99610a3b703c101386051530f62910d6229fa63a899b088a52108d0da20e08b1121be715c2166fc9b2190bddb214e3e1c226e3f5222ae3c9c22983f90455c3b3246acb38e783462240347c01704f8d5070209bf45c289ec4dbd16eaab942fd3f8b66ea54d74a5dd9cf7f48cc1f2c5e3a41d369c821b41a3f9d99e1ac64d11c101552be4fac7fff02ee057720998eb7e4dd6c530d861806933303fb12eeb422efa436c58b25c2c900d75cfd204ac29602f865b192e2d85666fffeb6d7ebb8ddf4011850d1b8b6e1beb7b487f6f09486b345e50589beb08e2eb62c0b6c2bdbb26a698125bd7815e46578f738dd2ff6c7dc77a863bbb69de6b8e3a26449eebd704180ccf7e5111871342eccaf06bee8a7cd43c357cb7db88348bf5009299206e3955f406ea0325ee688fe8c1f03e9f8fdf33a45c22bc75fad42a77a3c44262d0ed2a45496479b6d64842402faa8f992d2187aada1316bb740f7b91959502cc31a908a877c5d4636a1b3fee7897bfa96865aba12ec9f361083a7c929ca1afdf027cdfadc7be16b5d75bb2ee17cbe8dfbc41c1a67d347797dbb2fab9826db75442d98473c3e2d00eb788d1b0317d5089bf88a9be44f0ab7ad1822581b26c3eba292b3205942969c2ed2508963220676cc443c74f44779bc7690690416d8f5dc5c59328259479b0cbee100186d14e90d7d8dd27e8bc8dc7bfd23a9a25ff431015f76aab1b1a828b19b2c399b03aeaab8f9f45301567dfe6368f7875d90492dc756b735bb240d7fececae4376b295f90d84a6389944d3822e725ac96f33e2ee35f31107eabad83075bae0015ab20d6e707c8d3dbc2d810bf553e735a75976fd6722464d8e3c56e63ac593ca21e384fdc80f313eab2898b5b9e3797e8b707521d9d9a7a9b68cfc6c8d5c62523315b6a6015a82a2531c5bd906978e68fb8ce248d77c20090ae7a57179259f81bdeb3b48c68d76a81fc8d2aa89197dca0c58bfd4c0b9c2bde0ec74314e3d600af10c4c8c79f4d747fe11081ccbce9bdf4e54f44d18ecca1ce0d68f3d669e706680ec267e6180f955b231eb080d69d1a455352500b28c0a952a277fcf03b44bff42955e56b48583b77be81b4c919341a11cb8d1d96546974b5e8554c7a43c968dc3fe44161a6aac46d6543ca3169a74d7b2e3b2adcb243850e89f10bd7d8a800321aced25930473cf9c4f273025aea15aea04887533a8d24ca7894a86489e680a0c4395e3987e4ee10f719d97b3c1dc1d7d72f9d4d79573b10ad6e6e686f851e9022674035e48957020699f66a98adce4803d4776c293bd5d4fa7a47d4375c65efb77e7f87d35fbae3197ade6fa1c7348408cb945d6cf64acf8a14626a7c9d381cb07fc913cbb494c82c481de911ce298296a5b2877c160d4e107aecb7f234a718a0e94cbe266fbf7632cba958590dd70c7bd98b0efc6d515bdf216b276ebdcecc321f4e6f6390724f2ba84c8cbc86c2064689ae6c294e6b371c8f13ea763a18c4ae2547840dc2c52745da7358a506acef6d7232c04403797cedade60af77c665488d3a8f5649bf856780bc8685a9d4ec469ad211eaa7d467d10273b1adc06ad9b39dd82d882a754fe3c397a8415414d0e552257c69538d00b8926d90bc624c9e4660c2c0e5efc82934cc3387474368d40dc5e33d1ed6b03f2a1458f6b81e876b2fae9e09cafeb84c5fb74a3742ffb8d1b3ffd7aebd9deb0baf1561309bf47c0210a47d63fdab89ce3964dd1b84291f738552f1b51bb60bee9332c9b6a66d33dd0d4736ca1e77e6b65a328ff25a93e2d62cdb93ddf49a949a66b09a17da569fe32e08a004f63aafcc584fb19a6c4d491cab19a2e6366e45f2e85e3147a3686e8a916da49248609d719084391546bda1a836cb16627782d86e9689ed197690b9ba5d70131c0f7fb1a7fab24e98f8b78a90a6c3b62741712c91c9247570f32b443262a4064c5d9d0accf8428c54f9b2f2f880116e85a90f6bcc3130f2277f97e28fe41551ce1391b8fae395ed9611855083c17fdaa1dd3f24dbc459da6e5b2733cb4b9afba285f7aa9b71f28f6d91c08f7596ac559976bc6a5cc3fd4bce713c388e20d94451e90cd3c6bb240eb96d8a2414023f783aae0d118e3cfc890979ae9957977c6e3702ee139b2b7186c98e8900285813afd6c4710d290af9eb744967cd1ed7c86e09b48ce834a40baaaa250c11756ef1b7a7dd4f76acd5824da924610448c0fa8b022206d5a12e18778fd919248639592d63ff25eb316e012ee6009e27c17286b651170054a24d35b3ced1d8c6d7f314f0c70c9a354c8527f9634aa20e81c5c32f1f1bd023a172ef90400f9b0659b8eacb29e02ea0a97f04756bc0dcc3cf13ea32abcb66942b49f1107f4755927534d8be92f3bd568eada52a382890d69e4974635aa71e62c35e022fa37497b600e1d17265298ffb150663e9c61deca22436d64765f00c30708cab0d821124f441b380a913a51fcf17ac225fc42c0bdfd8183545df783154784d1cb732772eb282a45e7e2f91ddb734d29209e4be26e0c3bb12b6928af1a27edb0d5b70ee6913f7075390ed1284801e87d1a879cb15736eb896e5f81b24fc49635c8c4bb0d2aef6beaa468298c9f4bfedbba865e7becc53624ca03d85f4b82499a9e8d2c65754029fc6b1721e0ef9ffff8a3de231fa6f76adc1669c4b7126ed0198ac7054ff0ca51422c715dc80dd7255c7212052f564c1b819184da1cf03c0120b1330b20d217dcf5bf046bdc2494b1f7a977234dc044245efd2febea044df06f15bc1c232497720f8d4530aa5345200f441a82cad029554738e08004f88842cd550bf83479967060840ae11593aca074128bb8544c284cd40e9589427cc03b3c8392832828fb37b51615820a15c211f7a05ce6ede6d0e3bff7810ea87099a4332e40b7b49236aad7796146a58073743a4202f47a8dc02582a1a08527379ea927b50aa627b1708292135130d88e22c1a6d23115124fc2ae165321b9a062b974f739fa19767fa084a28861af422c273620066ebe1da1b50cfd4c8aa78c19289a3702ab90a09506afc9025096132e51a109a2dee17bc1644af39a2553471df9c75335b0429cae66ef352776a19ec8e288baf26859213f5d0d1b556c8f778780580422c9f26793478a2c80b2897a0d58216b11033ad16078219a5edfac156221981ced9e2fd990a6eb103331a4231ddbc2c7ce440340194848f3247f297f1c10cedfebb294890a60090490d2cba805dfe2fe619538067f0e1406daf28e100bfd81970b13883793bbc2a0b24cd403e871a56b45ef2b34beb54e0440d3746b3edc02116d7cc4055bb73b005e1e809a1b4ca78c2183c6733798831b1c39c6f1c178e413a6764f901bf7b4bba61a26fdf0783e6c59bba4f32d503d8e3d111da738e70296fad8f183c85b8d80ce5185b75fa29384eff1159cb3c8531e3c9649ea411dcb43f1d8f12b985629c5922a4b9e3b124420f4909e55aadc1d28a33b0a7d1a59bf0a21d0a0df2e25ed28766653171e2d1df27eaa82405dbe80223881eb8805127683853e106ee02cc3f1b503086cd81132fa5910547273c456ef5035e91155a8d0193bee8b72e5a5920a140473b2746597e3fc001f24685f494620c54f2eb0ecaaea8f30c8d4033713d3270d1cc8622cca32bb5b48580eae6657aa924fa2fa49a8b2491fc1314f48339c103586de829f4f1c821c5ae01eacaa2996df939b0fd508ff98ac4bc36c4a5618c338dc1a1ef0185fe02fb26138000dfdd58915568ba1f51fd39cc6b4f6c61a2be917773791c368283b8b285856548e0ee6fc016a460b4d2d8ae6f844c5f40934a4f143329b186093272050ead9671ffbd9e735b6e65439b1377e2cd46dfb633d1620ab6f448a1003e82131389fd6847e509268f8bd76d064ceca4ff58901de9d8d3b6ef009d70cae67217863c01d88cb97c6b852573c2b2e28e6f6cca09430156bcd56d57e2ec3fe799a19d82db280f1a15d64831f2ca2db0c01ad68df2c72b04050dd37142a2c51d222e6891b91e9edd09d374ccce294507a90c76460b5ddf7932ca81ac81a348e4fc3c0ea7cbfbfa238d778b83e501743b43550ee4a23aec898ad348aaf14f28d7fb23c21c6a7e2ed0e0cad31669a39d243f3ccd7929af5ebba98c60ff2965b2be772da34104246606016413ae57af733bd0af97caf4d83eb3a1087770be58a62701d3353d25a3b6a5c3cc04103fb765ec03a89ec82cd845a74b1e56b7f958bc2525002b1bbb91d912504b82c33be62416d7aedd332e4037cc1dfc8aa8a0f851d271b67624252930aaca952dc594774e5ecbece476a31d360a0c823983282b928a1c30de5f44be6c33dd6d2664c28b296cb504587cb18302a9606c433fd100a0f56b14918afa9ed64739f7fab5f8c9089c610be92224f4499786534abb9614df64191d675f31eb0984cbfc1e53606d20108e696006c159ac4df63bcabee24c53a01be5000e47cb6237d1b80a703ce14caf7c5d1ec266db83e4206a9a83517aa43fc4a146677b80f7ecff4edc451b920c4e8242749c4a4ab0a661cf69a2b2067f96339f7bbabb0db122b0804e6dc35637d78300e86b3b2ad3af85642824320c12e8c3e20e910e38600cd78811410a6176fcfa529651348cdd3ae7ebb0ae03870808e0de85e9cc0e4f3ea91708fd92a599732d3d27290e8231d929b6dec53827abc54ec5bb0429df4d2a97e51749c6f1102a28c731b35e3c6772074bf87111616d98fcb3ca5c4f24e2f4cd755a4045eb159a88e9cbc398cb9a428917f438985097ed23d295b1c9b065659126b84e96d23f8a7f96c3aa99a47574c97b4c037379623a75ad5b49ab9f1bf284138cd7cadef650d81e9b60c00250c7723d01302b20c7fbed239f4a37dd6550cb39e84830ad6d395b4a442b6f042455a4663e96e4234d66d4646ba7425903a6a3d243839232d754db6a5afa79a46143b8ec80fd5c571fc6338a3632975dedc12f953ebb48d4bab5dd3eef59b2e216580fdb36f8d300f13ce8f90c89a9462894dd72f324e64998cd48dfd314d681f1b432f4396c2d540ffe7d41f56966915f95f398257d0a2dd3a29f19f73deaaa2a5b8293398862f422733fed01d63a1a1e4bbc3b224e6fa7874e539392839c935daeac3c5e3e8905e8acda475205d12d31124af24b3b872d8647f2640a812d117907080f3617d50e023c53b446305bdbf55531ae23acbf8a272cf003ced6a8a4a462cfedb8be1eb17297a28230149b719627410cb358730814a5d61f242e465a0781364e687cb6979fe0dff4c01232d65aa5944683d6bcdb42ce2ae48ccc5c5f74d452653c204da877fa1c7e486af4b1156af84c084b2006e811e012387ed17564174086721e5b18f9bc67235343faf4f1f27e43374b4f168af75bf605628ecd327d3d6f7b99ce3582cbe69f98b07f6e318b68d384e673f6f33c4a5e3be784c8528b229021f771f809d19c97c82c346149cbc3f5b5431aa70d1e919f29dfd838cc2ed42c59e4ba07c1b436488800a668aaf4b006cb554c49b5e1e42b814882e786a5e6edff64b5300972c376b39852f266d454936e574e54bb614f28ddeeec84d851eeda176ee7093dbe965d3cce06899419997bc7f61bc631888c70bbd0b8bb4eccb5c7d336e85577f03819be899b54357c5ea864e04ec12d3759ae8e91978febfa8717039dab144312875d34576c60f28b8d7a293a13dec6ea0ec58f5b8e3e4b97e48e4898888f011b4c10c604b8e5eb837f1e14df8f84d3e68ea808789136e2445dcfc2bf8228dbf618e0d0362285bc4427e6e09dc628d5e59c8237bf9322cab7fe28d520a2b468ab1ec6afb96ab719850dcd8fc3a4857493682cead722758dfca45b98fb33578bed6556d00ae4f09d9f6cec16b548a37da46e4c7860eed5867030c9561d70ecc96d4b9b69f7522d2c1570347cd647ce1644c5b98efc6c3dee89a6feddd82ee29699f06752e0ff0ee68b8104bf20a4204790aeea0e72c2bdd11eb71cc78c1ea1b0fcdfd3e6e3acf6ad4c2fc1cf35cc3ecdec0a1e7a37bab508e40ec66f53b529ff0194c519bccc3aa58a738c6a60d55b57a3da7afaa87f26c7b86613e763c76a9c0217b76b04a428a1c982e312347afc049c403523ac0cb9e74386c2152f5b1faad8e181b1d9631c831c18ca686aa9d1a16038d79424999f4cba57c03d2c3121f0b6e163f804c3631e81198b14b7d75975a69bd67f0b4e503771eb59fa096518ab5b6d21ba97d1d8c34ff2a7908561fdfd542e43d5416d7407e082797ad2ab1c100467d286b4c7172c70a8198077bab2aa8ec6c5c8a2e25e5953e5708eac8e965170239a617942dff628b137a1f13325b91853342da830dc2bc08b00d08d69044a7bfda0fea088e806e5cce9351521607419bf8ed0e186940c737ef73b054839f3a4d1bf64933749c984ca67e6f65d25118a07f78d7c5166b55c471c3954daa9c3a0c01f97228670f2456a24a9ad51838e9e5c18159fff4d85bb9e09f2c2b21b6ced8bb57c93d5f783ef6df2402bb8d80b228ebd7198161c67ede11182eedd71a5850af832644654282c3293f62a7253a7f708ec03170b3cdb0520a5cc37938056294c0741aec322340706a248922992f7920a5e12bd01fa2b2706a281b4051033d2393648a86e35d488dc18ac110514f8db2c4e385109be41891dc5fad247ef85cb8537271393485ad77a0ed3c13b2dc114c31e3556565816291cae49478db077ee294b86455f249199964e02f4290f94ba8e272f18df8bc7f85e51d6d754aba7d803cb89d427a8e478cff83140d724b925c90766b0f9d1a79ba77ece8124529e0a68f13dab2968c4040a532c9a10c088af91d0ec1c052bfe8fb774ae978c91c6e1f13eeb1e43b889190133e8844af31a0bbeb4a5b68e23552f7573ae27515724ea1cd688ddab63ee86f683045b7223e330e8bc4a1fcd2019957ea7ae09ee90d66b7b5661b7dc0129275c54009e6469a99480e689fad4e5a9bb86d18e17966d78322754521d7860f90643dbe6acb465a3a006494f05c696970b7fa434f3c8164237c1889c2a16b72b965365857183a2eb750bca56e5dabeabcd2e1fe30e105754bde9dbcb1c74bb426c077d91b50abbe480f46a1531d826368f9a355c06857836bdea2bec28b1c81d6d40476c7ed7da5b5a1b831a0372b04d836de00178d58154157112c2d3b706d822f70312cd3a1a9d1728203d5163fad201f7dae47fc7a1c0cfc40953fb1e02ccbe486f5f8d565d92adfaaf727c8a15b279fd007256924bcfd3affaa0987824f83668cdc79341567be0c5a329b72475d06c38569dfd488e9ab868e7299d08247cf44e52dc66bcd8d196eb4f8d9c85984b49de6a1744016b6e25d595102d1bfb5bab5b68280a4a4965b6285c30dfdf4bcefe927771aacafbf98281dfc9176195d42790f86d7371661ad33f5b30e110c401d35203476e23d504e2237316d4a4c61fa45ce5d59008674a6f2dcdada671ad1c48590c93ecd7743a9b122d9544ea58ca64f06edb0cdd5dac7083a758577260c5624514e2dfe6aaaa0c406baa8186e688b953acb9887b9e9aa85e67113c21ba34ee946403926ff038ec5e1c7ad8103a0e160b9c97de5a2c93c7d0fcd55820330a728ba4a10ed5eb9a44d08cd44d17cfd235f67e8353db829a346f7400ea5747adb0463d10b4203af40fee4821113fe18d829bace241a75d0d7226641218bf59c1524ca950dab871819d8c54212b629b8151d18219f8da3c7f1aa92f56437fa95d4136c15091b2c7d480f5ab1876eec26a130f339e84480bdde1b94d6636b804d131b00f93ff44271641b46caa82fd48b8e9dd4ebe1653e1240b45ded8ae84929787c94c187ec7f50cc90554f2f405d65240aeac19de5036c1fe1eb333ca9f557ca138a6dd5245fe6d10eb894710057ee020aac88a08fe121abe58dbd85ab897cbe99fe1d3aad48d0548cfb4ec4490725c5aeb0061bff29067140edca95325923d4d3ca6706d5a03a07414322b0146a330a0b0c080a787a66c5f10837cd285171382e28d6150e5fce9f643c94585787d64bd40074428379e97721f51b18b103395c6ffd489b1243d5cfe4f418fcbfa2a2ef15ed6880112c8921656de2509a7cddd010c0c86f931eccb3504a5bb8f03f08a5d30d9a30042c6a2ddf3f7eeee64266801b5ec3ebbdb090905a0ef83981af0186ce41718d37a36f2225800d9abf46649fe4b45670d2c95f65b87732f8aeb75389ec602dd1fa8ce35eff08cdfe7fd0adceaff57bb66d8c9572848000540220a45450161b5068deedbc707373a3333237ceb71eb91feaad25782e31f87e0dda7a36d5c503d17e4043bb58a9777dcbf22ad7078ec13864b3cd127d469038733cfee8d8e8fc07ce7d70c94db3893b41a0e5121f9b751ee64c17f80a2cc239fbe6e19e7f231e5025c23eb44c8251ab485ec7c2a1e79501cbe48f2bb9b3332d3ff32cb21b5eec26c0ea733b514a434703a2cd6aedc33cbabb24891135f617fed60a6e840715c2dc405bae488c6b0496fc45e92016c73942d124e230f40fada22c202deaa126b7812b1e49b8cde2829ad45c4291fe7703e320c67d66048070de67bb282faa3ba7ec608950fac24d70b23e2690108cb7cd4d4038b6f397bbee518b2353a973476cf9b8edaf5d62d88d28df0f704c9100e376039750ff65029c7668d5201a3c4753ebd4da1d44594e32dff625a376f21c016d99bb5d935f7d817cc790890360e4fc9d34979097a261a461f5bf3ccca934932de01c6c4718d62892817dd2316cfdda66bb18a8aec3528a4de4bee9289faa27075960b07d5cc7f3776467ab2e64825a99225c82f18a3903a5b0a109a114bede3ed2e7869e7ef7d1d7d12688e023d647d76a7a75544a8dd776aa765eedb9e435f528166ab1bc292152109cbaa65448291c4a0d4e616a0b43efb4749f6b41ed68e1bcd8ed3e78c2bdafa558a09d993d48de27b4a2726a263830cd82042b41d24cf25b31209a87fc211b10108b1790fea28cc22f910cf0e3f72ada7f4703eff563ef5e4173af481177e362de8196de5b7008957d61975e52ee09fcd9d179a56a09610eddd91e5ef04754e4fc60e1253f7d36ece4fc9653e19451780bbc6cfd4d83cd958c0e124706fa367c43dab83ba4b284cc5815feaf0878cdb59f276f8c50eb5c85b288110cfe46ce1d71987b46d6353fcd0a4d85f7a7d015256f137d96ae098adede59cdd1a5bcd63fe1913c99e93b0b2d7ada902cab04920a7af8812bb96c0b5ee0a829d783ff2477645c223ea709362945808755f0903aa7bc220ce06440d3022a14a32b43e322a7cb7138d376c21159889bd1938f956324609a7cd4176ed587c6c8e0c720dc5fdb8048bf288644123621f66185cccb80a8e7a0339e5d88c32b06efe8409c96de2e1209777f59a12bcca91eddc7cdc724e81b58c2159bcd6b3019556ee5460db2f76bd5c1b5e897b18a5df9da7d2c10a6a7cd97511214c606c33075274a7f854681a650e9fa490343bfd09160c00cb8ac1ba1e220a42571a747af46150e2149fbc714f4387390a0d246696a521f49c43866956203ba22d03849080f354467423104611de2f85f68683f6e0f57d11bd99daa78ba3692799b70cda72e9d9fa0107d2d42a734e0ab701acd72c1b9305c884c252099878877e4e1fbc494f006ec4e5473a310ad841d3b439694928d8cbe8baf26d406781ab04bfcdfa94add75707620ecae2332315f1692b09a052784fe3194467215ebc9b37994afd0d6ff889b853446bf7372a43edc638a4ce318b6e8f53ecae9af588f63787a2657cd56db70101868741a42462f3d8b07412f217d42e8f586f1ad931142c8802359a3989ba5a8e430575e5598f084464e6b092f5bd285aa967f6709ac166f9991437a2428e1d6b17150146878e9d20fb9b44748ddb1959fe358608f34428c5ee33d8242edea5a4caca2d614fb676c9becca3b4fc7cd11444bb54e305186a88172e9d127ee408e4a19aea96bd366823f5115730d28080f5805a71954b52fc16b4779c4d3c388edc64484997a19fcafa981833291e3f0101f680ddb0467a7ef702deaeb6d2b316260d0b8f1153f8db4c8e1b396cfa7b492340cc56d0a64dee24386a720110cd73916271e916630d0912c1fa7748f890f4aab3e80a0518907f67bd26ec4f2419c34b37f1193666c2febca427fa5421e8ea2790a3e91e494280054c91973bfa9424344429911c5f31131c949e8ac5c056424d403dd4e1bfe19c5415241d85d721ec3275763548f228ce23228c841f08a31f8c9ed457e88f3dd0879c485691d3e8ae3fc2d09855a6831c31a0b3c230c333380d2156e613168049444513ac4a7dc709a8da250e87f3d5d5a758f910ec3ba35e3fd16c6415dca4392c67e7a801f60c6165ab2990e42b024da591a084de035875b35b5976011e31ab2cacdb425b8f7c3cdb5a6c5e8e80db3dc02ca9cb09a0f5d41d2a3055b497eda870cd410213da6450045cd0538a0c31d6e813c4b574335a7f8f67cc3d8a45caa217667995a74f38a2cf6f093c2931cde8d9a66cc1001221928951812835dafc22293a01339075e0df44901705c4910096130f03c89f89a549be77fdd771f660c42da9037bde8ca9aef0a3a4fe3543cf6c0661af738670af8d842621713ae19030b0a24f858ea5c280b62d3116a66bbe341c10871fac6ce2314145724a08d0454ddaded04cd5d2fbbdd16699c8f20b4494f890021896cbe0f36a5ced3efcb3099cb43209e0ae34d889c83745a7f6fe4366f6e71406720d9418c93d0f5e323bc09874ea25c7e585344abd5c1287294ee9ccc00302d5135cc3632c91048388f0c78b534f04f5b145e0fe1e076da56bc514dc616b6931434d748721f91057aeff9059f70af07e2985b803ba630a9e683b78aa4639c72a758285e3315d448a35f04fe7691acc585e10f4c45bf569fb8b012c285033fad62bd21328022eaa969e0280240068949e01a39a3f265896b4f5c8e41ee951843cda64dd2ac4ce8d7bda285394e2e46725ae3d702a2e9e325748ca8086047bc6fee3879c2f204749d445c7f538c5064dbb69772fa57beb01024b8a2a9fe140929ce6575a92a7f1cf2533b521cf2bab80a7ccb72da8834222fee985cd7bbb248376696c5a2aa327542812667e11571f53e66c62d10b50d129ce97515db509f89529959b169390051e55b8246c8cc9c536760d008daf16bdf32f8ab51bdb73252e28a44998f89953c999eb0bc06dba3cca6f2fde1e53badd88061880538686871661b637f076c5f36680b9c5a3e55cdfc646491e58b5c03dd112955a144f205baf75385574bebaa738931bb8eb1913aaa14578d13401ffd575e4e468e0f85782e5528498255130241f8dc788f23adc6f5e539454f3c3a637586414df09a36973e24c4a1efdbb57834f56e9a937ad9223d4c98602011c88af2c085e510dc04fddf40c65c7646f316e05e5289905dd0f7d40b8a4b65285d1ec16d03f8652160d654230b76c25b9e45a216ad4f2d226d273e7cb19377cb53c86221901082cca3ceb0d5090fc158c185c168a768aed7b0506c5032808e4ca906fa613173a713c5415282f5f219f3644673a657bae23c57d824f5b73e7cb360fe599fc4c25d582c989ea8e388bc40cace6c80b98f0a9f1338b4bae29d893a86727b685c8f82c26031962bf5b5119796690228d332462a1d8bf888c1e5948f02695f789584ce80d9db1aea7dc2039d7b67c3f29191f4974e3fdf78e1722b8c48ba2efeee2cd47d348e81cc9c72050325ed0e404d63b72b1ef64e839b1519b0bd94ec3d7a1f2f966a899831aafe4b6a0a5d4fefde5dc3e2e7754939d5bd28f736f987b670568d0dacbdd1a9bd336d3db019c0703af3ade47c66fcaf09b85734264e0da80699da411e9f9e80875477a8bb566d8b556010d2b58b0ff230993d3fdd668a3c61c468cdf21c434f77bd790ce2f0ae67459df184045158432a116f8805f5eb1bc212e601c16fb4e6843a2fa2008b009a67ef0399a4aab1114689b88a1cbcba509ba001417074131ef5659a612842f66f28ca937c285a18072056690468cec80ee6326f3b741c5cc259784df4b2d928e9d7ea949218258104a55bac88aa8a140ead77eec9c1a50ab2400c0baf9da5c86d1b82449f4ede05af31885c63b25841d0c5d7503b4e5f4e4118ec0b6329b2f3fc7043826f2b802dc2a0862e67fbe091636aa120b9c9711c807445a88a2c35770a2f01a760a2af480871923e6ba049a014774bfebed6afcf3266b8f4523a032ff2df3f803dc12440fbd288b025615b26cc55b0006a515931a4356b42820b84b625c5fa007374d9442de409f45c4954570b2c0933d52e3793678a486bf0fbe89df3d1a11a137fcaf685477d4ebc68025091642faec961622b04ce662efb466d7d4af1b38d3f455e7f47212354789d97168acfee4356eb639e1bd95f3b97750d18c8d2f085461056134114405b97e7e4bbef99743bbec8906e661f928076733f1fc06352c0f9c4a00cc0102b92b6e1b4e067f3d13f4a3a719c12261067c7145d4b1186328d6cd49c50077b3b85d64dff76e5c10d846182e100eaba334eeda5087c8660fbfa6e1c6edc65e4f29356dacd0a46f554b8c8e119caa856c4038c290ea5efa0398f00da2d55508047b0bb62a0aa013767c956ac5589c318c063783328594b7fa85a075cadcf4b2af85d5abbb2251535c2862b43d3a06f81acbdbd9f0c2f6ade67c3b1da0fc06a70a29f203c6061816b11c717f342f5c58d2c46d8beb800c2ba1d82b29ea51173a37106bd1bcb3863f0a3788b33ff4b993e90afcd5dd251757ab5ce18e2d70767da2b46e3b5fa7db62582f88cb1066976bbdb743066be06645f5a3f12943164ea3b53c78527afaaa7c232a1ae2a5b844f05255f2de0121f64b205116f40cbf963a53412333804c0c12c04f7d0cfe8cd5d190b9220c65f60ef52504bad4f1c43195d50c84a0970a8161221549a02c4621f3202068ce09f34955505216d3dcc18bca6645dabab4086b4dbbd85f056a98f86b20d8886fde35140916496a665917fe4e471298b9b71cd2b3b8765b15b61667d10a61fd1d4ade44d099bc5469b5b2ba9c7d56499faa6a6eea2aba9718610b85dd5b9719742f94892a2ca2d392b8cdf2aa0817bcdf5b7d80a007aec13c00d23064007fb0470878901d0633e00dc31310074b10f59ebfdb2ea2bbdbe1f3157e9f7b988fd4aafcf47cc55fa7d2de2bd92eae33bef1551fbd5dee255c6f74f5bd65a1da5f89a51f35899959ea32633157d05a91182ee68be3c0de5e3dfdc328207ad551f414650e6a5e1fd53835761f1fb2aaf7501f1b50fb1fcf61f9e9ea3ffee04331ffd9074d7b54ca0f82a754f3b4f2f224e14dc7dd053dc0585185f5550abe8dc9dca53dc3289a80550869bb4fa95568304a99a9c4b218dd5a5dc9242e155b5c12571c55511ce0914c8ada202025921e2f15a012a67979cea143f23cc9b2ef59cc2c0434bd236181358a70c3111d92d8b4ec8075542255328d5a9b5d9adab78101547e24b81eff1df7fd7a572804f030b345aca95b27f4f9c2c55d644ce81b312dcb8af14844d62de6d7cdafffb6f552a05f832b040464ab952fe1ea28e3255fe8aa907264f55e87352524e4e60542e9ffcf3bf35a999e2c380012ea94bfe233815cfa77ef86f490a45d82165003f9cc218296a65fc75a1c3b140499d7fc5eac36b8a4c7d1f35c3e900b67aa45f15aefe4db604b42c396ac6aee662f358320a4b4247a21405a6ab6fd3a29609d42a2bdd6daa534cff37f04938d3d48c3c9bcaddf8b9884dc6f5a5b432439be48b30266f0069838d73ee98e81ffc79974ef64fc643631f6c91df0a6d69f5327c24c8d27f0b8585da92b3d51410f09405550cae152499dc0705341702835a4bd71401fbf79b8df88e0e5af11896573c5cd1c1acfedce92bc63916197575909d26e1818e2cd88b16a0e32f6d72dfdf4773f00723d76d715cea45f5ed6957b7c85d2ee2ef32305ac722cf3514782ff0220078d534b3f89fbbe3c54053fae2b8a98f7ab4470f7ef19360ccff656168edc5a72583914bda6174d07f9b720e100a3f06b3528821948c61541fd89beef1409d8ba8fd3a17383e24af2d2a2ce79476e85fe33ab565df24c633a331d2c6559df1fe4de54a4204c63e72257aa01c6c505390fcd822272b761c2daf8409e903279005316de23920b8e2de62cb4ada0510a64834aa2f20938d0dcfd446a037bc1961aa2c806f9e58f7f59ff81a23e823bb0db5d132e93b48356e7ebd6441be177f027c697319e678ef37eebdf0ea60bfe86c90de4a680b27771d3bed00e41406deb712f6966dd7c1ba217e5cb34394948ac5caf9cb8f9b0054c0db9e4b18bd41c8603e9f53f48383bed35deccbad9ef6da07afbb7d65284f8aa29019fb844f72ddafb77aea4d848fc2c17bd2f0f54e02f889c341289866640e661b7bd341f900376c09cf51e7515c5ba9a537d69e321ffbcb91f5864a1925408c3502b981b960e95bdfecd6c60acf37af9b2e43a341ed5d1ac3eea6d62ac8ae7bab490e406763ee515a6118c0201b5b53bbd5f7539f8b43892b6b1fb7c8b8901122f781be9ac4cc5e20397d29c41b7f605b2c766d9d3170e5745e0e4e8bdb0260e292477b2533732f377cf625464cfdfc59160e069a121c9bdae8df30533a063700d4dcdcb293b0e650f2b763501844d34dded7e6826a0e3d5e116e0089a7a6b839c8f117086741d208f7e659c5922fb36477f3af2077776a1d23a57ee2eeaa9a6f8c3d762001c04e1f28cc2c22539718d562c12e30e745957f3080ba95d5e6e9b85e4166fdddae6e9085558ab279cf0b1ddf81f0951cbe861ff6381336827436083869fb18f2e1486598b87ba27cc53bcf3c44427c5ad760f70d82da143a78fe95d57969e0de7eabaf41979977cfd87abb3a3f0c5cab1f136adb16bcf734bc39e9f0271c4ea62024e66dc657c3aff0134fd9a17462a20e6991e1882f2eabc97c6b12b49ffbf73905f53e0fc5c3851f408260766352f47194c1c3cd313ddfae33071ad4bed461818aebf44088fafd40a13cb469ab6ec7ac3ab8c0cc83a760939b8d1fa4c270edd549ef3562c2ad2ecf1c3167a942e75e281690365941eb67479574010c2162776e4d36ee00e1fd5db3ae9165132c948685c80b1a2570d0c3cb9a62b1f3d1947336fe1053094eb5cf455f56f4e3da3a0e51401e51d381be89fe905fab01ac829b302a8b44fc9fc3f55865afd3421644a7d09690af42242051715f681956a4fc83c4a0631a7fc5be12db6b2f8094f6a447d5003b487c21e82bee297c390a5487494cdcf57016d3fc4d48d7d2b7c8dc11a065ddf4d20ea6697932feef858df7b37b0ab28ae40ea9a64498de845a923e06d0d16a3dd1804aa8ba8d1eca1157a8c53d9f382f5b891030e76307420aae2614b1cc18b2aa6b061b62eab4d0299b0148a49ed785378ef682ebf8002c77973185b1916314c446c6148a19115b101b21d644ec017af5d06391de407a18d1ebf1bd77c47c565cd07f9f17ee3fb10bfacfc78bfb2776819e9c9b45bdf0e8dd522f1f40fcac142aa1c6e6c7e9f60a0b44803b4667f88e6b7867ae22c65b3ab7628575ecf39ae1f5326af2afc6b0f8c6fdb3d0407478cd1faaffe10ec332dd52d2ba24c50f3350684d09cf0a77c67f920494bf44c2d5ded51e55466c6df8b972f06ed734162530c324e0ed57a5abe37fc8c352d59b53f7a0aa831c769ce29f25ea096f632536efa0ea405fe5da42c2379838394422940b927f6e8d157aa127744e271af8620733e5b65d4fc1d6e78d4d9d3795c9d34c328b533663452510f1272dbb669b949a1509dd245b0543724aed593f9fabe3a85ab01ebf5935949b9b738111bbf427b04339ec82907f9807a1d29e81a3b4160cdd7921b62c90a707a1f97f0407d782ff3d12999df1e0491adec1896cce1824b7db171395d9f91a777d8187c3998f76e71f8811362c508d364311d1ac22ef2116da305667c075f94dc7887443a08170b44c16250e35b881cf1947faa8678444a7a4ab64f6284b444088b3dcfaf0d651712cdc4c89027db4639bc1e3eb4877e7b4e682afab438d780775f472eb0dc280bd0403640b51f7de96d15775547840594e14e273ef4e8d4bb6e244c4ebb64e2f9aa153b72a377d3e9c84cd0460907415e06d5eedeb981db0bcc12c818d362c96fc1368898f552ee464bdeb31900e37f4c8109d0e565ffa5940e646442cb722db9123eb828ac5679e46fba9c5b6fb4858f500612a6a1e2276403692c9dec36d0eeadfbe9f19eb09c98bf9683634eb8ceacb4c56292fc43bcea4b512529f4af92af549a9afd27d94fba5847d6a5149f62580bc40cc2725fe4afb52ea5b691f257dbd123fbeb25292355ecbed5928e85e7a30e905201446de46ff4d0379a2af40e2c355d081ab42ab3c708bc2192ccbf0c8a602a0020077e1247c672fe4d021c5e5d6ab78d8277ae2a576899f74e01f4d1456a7cbbf4127b723c7b438e7523c1b16e87e3919290fc2bab59e7fb9d301cecc796740797a8dee709fbbe8c15a68d25d69bdcd1d404e57a55e49a286a62e700c8731983061a2214c4860760512c699932840c2072a0188b144268ed8b1fd614e53469820fe0a12c633d32982c20e2c015063d40c8c70b0fcc344539390a27c2a528c31115302941d4402501c0f547ec230c601cf76acfecf14958d27a329e02edb8f67c39568b02ee7fc2b586f4a43eb6c1649546acb8486964350938c738240e5b5c942541eddbc732c0eb6cd397a920ef3e4a287a8d266ecabc224eead555689e56b89b74a2c5f4bac5562f95862ad12cbc712cbe2e66c5059341b589840389ba58e0f65c7414e770d65972d22f62d339ee1acb11da72ceb0d3a61583c34885376e93f9813888b0ac4a184eaecf111a24f0dd9141c0f38e1a16cda0829c1f5a8812f31853d1d04697c887580715fe98a604f13ca307ff06cea1aa75cee8e92ba7eb9dee594595a88c305a512c27e436e6323e43f9e0f115eca42a2769199c650366d1489e0e2d8a01a31827e0d8a4985c43b1fa0090ca0fc1e2eccf11679863e8af63231847b4ca33c64141ee4294b7a37f1314f4107e87d3241153eccee8e50869f1eccebead06d72cfa06c478360274dee1ddd77e464f703216a4005620fbf033d0106872837e518ca1ddd8a16b73eb6c3180d41cec45d38c0d2d0b1353273232d94c03f37b739ad6c740b498f8d2d5aae830444a3f008311e08f289514cda80a70be4cc641841626996edfdbd0e35604b3264111f65fe8a3514214ea67b139b8829840f90fe1b058d84b9e967ac802e3ec6b8b17e4389283bbf06b7102536fed8ed177bd857f9156243377a265d4e9696a29b2f8340287494bd5d64a01316d403bf76be64217320c6ba4ed0eb0543aeee1789377afff74ad35c27d1c6561a30b8691daba62033b7c8e7b84f5fae9f8e43a29f71f89ed80d7171df2385f4f633bf018d3d0ef991fb1d15b05e7bf03b7728e30192cf7cb1218e9160e778e1edc67b10d88ad31df2b3f46e7345ce4be1255c75b315f12fec4288c566affc22462d1613d16eaa6e5b7e730fe41620a4e059c75b7e941f20fbf8652526640138b3780b9250ff580881506e5a5ff8054b802685fbc449b776a77a37db438d7f7e4981ca85b04a0fa8894553f9c17c033fa7ce742851302e4db8939602d1d0181f4051329afd6ee5bba774d18db9a2db7607f3d2d0bd84b7646df894cdcd05679d39428d66b2db4fb4175ade400257c0386c92fb5b38e2faff13ba5f5bdd4a0400a4c047738afb5de7e22d6858d51aea15b61c5be03b7934e1117c1f9e18a4c828a8e5d95d71ee1193cb63fe3760d6303e2781c7817d7c17bc84208580bb3b7471ad5ff33888a65229586a8001b1c014d28b817a0b6598f68d1a93c301b02f3c00d5ab08950fa881bd60b75d38670711ee4e3fdd4f1fdce840c8b8f60433f70dbbbb6ae3ace1f02d8bd3cd1f0f71824bc2c619b8170ff095508442a2069ba43fa767d6214661bed3703102fb5119032375862c7368857dcb715901e78ab326a6b03e77052f177027ca02fc6c120bd3f3d300bc6ec20ee90fbec8ca25744a712d99eadcb74630f7d00406bc0c158aef0bf1bc0f6d433fada520423f45cdf83b16b96a02b123399507e2d65f5d7fbc156881465e3bc2569f132b6019b06a86aa21a9144c4fd53e6e49f076e4e9da40d80120c47ed0378e4185eb7d47db04f54ff9267efe48e2409f65ae872a403af3f7be6180fa205dd284cbb80ea7730f52b4b95d98061147d552869d411a86dc5880b27a964d2b68790d8b80d20808061a2a27c9c01206efcae9c482d1b62b63e8651988113b6e3d4cbd37b8a2343c364b42dc60001e0d02177014e087180c30f254f071a165b445c565662b80538845d9a68c857b42225b5ff1921c673f5d20d14094f571e23e75306336b54a4db01cce4eec212be41dd20e900fbea21981064c186112709c9e79b3d76cad9ec949813f8fdfa908a776604c016cda022af75d635b401852a503cae436943b928f0c909b0ad4cd4bf71265547610b92d2a12f309ce01b2d32bb3f8791899b5a369b7abc2ead6b357f038d038d84747ffb89eab1ad55703283224c1576ded256e18e2737bf2252144eebde59652a6245307062f062406ecc575e6e2ba0d3c03afe6d4a6baa8041ad1936568c42fd63a09a452dc7dd69e3af85a2781f6b4975dbbba0e6acf63188248bff08d61089eceb58d3147923dd81e796a198c28fe6c4778a622e19992e94ba6ee8371a7f28d3b7c8a2c1eeeefc9c36018a8bdd621694836f59e23dd9723b92af6f460496c4fcbb45ca5d24198034fec893b484946475d74e1afecd8b8137922ab888a9256a974efe243ce040a2969cf47849ed45e1c82c430f0157b5ae69483f6de321c8b78667bf8b10b9ea9bc951ea0bd7fda7b8fc6ed00ff629c0f284f1c96d41ef41f9fbf3efa7e8e14864301aae2cb5f20510f5f0ce2c267a8e258820b6d9ce017f850bc927cd1e8c22ab652ec7981f5e70b5fdeb4cce73d17c6a12112076a5a8ffb4c1772577bd0abb8d0952435f61a928684f45557d27ef42ea916e8421de45fafdc08f4814220fcf15eef4ac187dfab26c247d84f4df339e74bd7b48757eb72f0d73a0d1ac1a31ed2327c31978e39741c9bf6a2b3c6aeb1c698945a6703c3f0b3c8406f7f0feceee0f7df8585afc98dfedb090bedd5f787462da33d7c780491e00d17600df8f037eda471d857ae0607b4c703b8d85f0ce5695d4138e3e133c31b2729ddf72b8fd27da9d46bdd67b5195c00f845fb14a7fdca02aef632382457fb135e72b52ff5aa42fbedc997a1d52083936fea5c1846f341e5790042a3f292a3da97ba8f42adfb80b0549eafd7a0d2a9bcc6cd4e85737f1cae7153e53f48030f3ec6f99057859b3ef8b9fe917b963929cd020ab42882165a14410b2db428c2d090107eaefc8d8baee408dbc4cd83612a1c12b94dfc389a3b8f0cdbf479e032cba09eff0656a1fce0caff5c80617605945815432bcf9cf8f36f250ef2ddbc520ede13ae4b9cdf18a3bb9fde4fefa7930f39131814ffe43f58c5d54a349c3eb65ae6e483788667387dcc618bdf486823f00deb37ad4279d92c59e2da86b6174d251a3614ca8472d242e2198e392d63fae6f89676a0d7f44fc438049ed9c15e7ff92e04bee196674cf6f4db9f6c278f31614d958b98fbf52b0c2f4c150340ae690957155fb3be667dcd52f197bbfcd9531b0797705591040a27822ef6fe5b8a72f036eb36cbaf9b4ca7120da6f7194c2693dfca411e270e8738ddd4da4af64fba19f351138579abe527272ddb7d1009577ebb4f77a781d5934339de645477f696b73ce6f43c2bb5b37135dbfb472805c324e11a4d9cfef45bac281c24fab9277f8a174a91846b28e9a1548bcf95dff21b4603fb41c69036a413926dd64a12f6f3d60bba5cad568b61e4d3a8958317c5f98f7bf421fd229f088f1137826bc83771aec330de434429b85cfc00882b1d0461b4a91483bca5ae5f7c3fd87af185add832f18c5f97ae78238b1acb82489efe6b2eeea943956838bdbfe210cf70eae29fa8cbe5dd07755845a99b8d83b7e2d05e3ca131f2610e0442be7c09751846faddb0a66dfa3e70b7ae8718e6b545cbf72cf83bc9eee72e9e31fd8cfbb9ebc3de6907f9e5f4a8eef4a50e69eb90ba882b5f9a4e6f3a994e272ede58a2e1a48bfe54869394a7ce4fbe9dfc746a23ad15ddb1ac54cfb74e2c96f625aeef896b96118691ad6ea2d56a3593c662490ac995ff440c39f80f789d49e7ae96d97c9cbc9fb676e2d4b511d8822dd882ad666d5d07d91857b910f885658d40bbb0605ce95188373f7039138629fd0a1256e628751b072f4c8248a7ce5dedb1bf6cef9c8f53a9e45b74cea4bd13f7c3ded3374b3e8b45440aae7c3782615cf22b3d7225f10b49c8952aed9055a469477bf26b5f788467b42e86acfb01a577f1c7d432b03676f9fcbae7380f37bb8875ccb9528514bc8585c68cd48a0c951414d4893d994a75d332dadd3d55e05678ca75c615f9d7b4168ee59d6bf91438af10c771da3bc755fff25ba75423755afd37f7e8ee35056e851d09c1802d9802a7c305b6120d297c7c2d858f33858ff3218fcf5da123112d4369709c026d136c37613f650a1ce471ae858346600f077de0cf8a0c150e06b5273f8583421c74b5c76488a8487ee5e0114482496df35cdff48b10b84304eb4f3ba791fac86b1cfadbebae7eb929462936330ccb2836218e10b8c3924bdc9d96d96919863c90c5333c03ed22ed1c499b62946233c3b08c62d36d585a069217939707ae15911d99c5a73c736d2aa8a042b5f672dc9c1209cb8fc3b987f673bbeadcc9dd6a920dafd5bb5fe6ca324a94b932177dd19df67858467ae48b6e417de44bbe24923492afceba15225f93fd9772c4f95ca541ec275f395235c88dc4565653a35d0fd9eeeb21535774eabaaa7575874a9c9bfb49237247f22411836fe508f6171a01a8cea1cce0948800d3d0a0990fec65369de9e8e8acac70dca911da437de8cf4b95716947593aaea247321d1bbb4c67e248a469238938f9ca88b2178eab64515323576546fe62d3325916990f2c9331e1236a6439784b0230bd10a01280c5420b957275458487abacf6da6d52f78d8882542e963281cc5ca997ccb1176af39e38c83050a8b716aa732c77ab519da37135ae08ca4bae080d1a1d0d6a06d819577245503e76b400d5b995bb61d8d46a0d6a487bbd81a06f8e61e7e370d44a66ae1420b54ca65517aa7329f73574aa337a50ca416fd6653394d80fa5a3e3aa9313246a637152a81c94cef59bfb65ae1b1952d80fa583d261ddd97d54f6a0a850502a321250e98dfd64905469762b2bf9998b67ea8ca395d54a2906953bbb1946f525875a8532331d7fe95f31d9196215f51cfdb4e85016448b64d1eddf321d232b1f7b84a5e4f6eb08fddc66d2aa4359503694b9daa351772896316129d5605de6c2289555cbb603541307e98d6d29cd0ea5536fb0cc95316915ca4ee569d5ca6a6565c4faa4bcfbea91aaa475fbb7eeab42b757822a9315571dca8656ae4a29ea97fe94a39d94247bd323e4f6ca8a889596ca90a0ab42e4f67f2baedb282228154a31acdcd9a510cdc04209335bb9281c6a48bff4af50aac93a94cecb663f7fbebc5b67658625a03a67ba922bc2f291e5a550ab647c3f0bb7b2a22f7f59fd1cd9f862e44bbe52467856f7fb199c44e124925717575ffed2f2255f44358861fa295775ea905ae22a11315886b96b15ecf51f7d51ca26e53b990a97a570d9976248ddaaa17c0d5289ae568faa125050b9e01b990eacd1bf42a45528dfbfb242e13200946a6497b92a1795a865e8f7d7a26ad432b26522cf186955e5e9977e264c86868a8abecc75933ef9ea5fa11483ca8dab4ec39e727155df7255d369940b5fa77aa51afa5e2947bcd90ba09443e56e5ddd69af3f6502db52c72bc9d037fbc961997ccde6a2746e7f26396c65d5db852b37aa739902aa73745b40750ebbb732cfb4d8930945a3851a2f78c393980218e0002e20a0c5c40c037f7519001fc8809c340662a0c266208c5f01fbd1105d621110b6103f6c1b84b1695489a7219824bafc34889534089692f2b29456bad3d24294da3888edfa4d83d8987a1ac4d64c9685dda994a3c59e34fc16192dd5cdec9490cf5158296527a57448041cfec3466552b26cc6281fab4f535f7eecb6adc6fa292d33df63e90131377ba61185cdb4520d56abe4a0ac5d9a21e6c6c7b2a7512363ec56b800f1374e061720fee452608d98ca5eeb6a7bdcd9e811099e1bf43401fb02fb623ec5b626ccad9443fef69173b9f3292dfdd73732df7081353670e73cf90dfbc2727b281f0cb9b661bb09f510d569e0624fdf73813760f04c47fa7e2ed5734fb9736cd3f781ab83dfd8e9b8816d8feb8d3ee09db53dfe1e2e2c33d88bbdbd5857ca21bb68e124c11446461352613f76c91871b846ff07736100be142e7c359d13c39efbe3dbf0977e8fdc9c3c19326428a594524a291db26c394d2c324c8e65a58cfb03de22389426fb8fd6a03d8e76a1656cf0fe53a91bb822db6f1cd971de07d88426eb342162cb2cc15257dd28e103f237631d330cf6cc51cce6ca9fc15e7feefb80cdfdc17d3d5cae7f7c1ceedf8eeb4c04f39c723e1665d8d190869f32909224bc367661f83a5cc5c21d0b04e4cf9f807fec3c10df7f761e504202f17dbe07fc65c7c24cc385fdbe74f9c88d117fe147ce39d8dd4214a1bb6358dae6e12f11420af9253edc81174cae8f78230bddf85202edc58803c3c41d5bd82fe6023d72886f01bed1026b74f42e8667fcc67f178f5ba21b45156e7c99338708c2f411535cb8f3a16598e93d4f1c1866ee70d9cfded9395cc055f37b58806fdc006b4cfaf36d6acedf280771bc6e8037b2b87006ce205cf81f6b712766c3941fdff28cdff970058225b1c94e6b67e7c65ff3d75e7bc7308f91d89f30e938342dba3e7dbaecb0df4a34388639e6ef983f1331449ad086075cb590ca7f01188832f3cfb846fd21e5cc326d8799651dcd32c05e0cf4c6ab030f37ae3676d96a6cfc8f3ec09b3491ec65198832c46863835d7fc935fc69951793f47fd02b19c67f7e1cb8d8efd097b29bb22c328ccbda811bbd1443bc31ca4e0a7299d37fce87184387113af4181d0e707777ec32d09211dccfbe6073c7a68c1ea3cdc19cc2e832d092a3dbbfc265a0254297bdbb9bb9d6f638c605caf9403ffb18bbaf470c7dbe1c0f406828ede847ceb9e63e0fd8dc7eca4d976f6fc6e6645c3b9007b284a878dd0feeecb854906602d940e74e9f18ecb43779da9b7f64febcc18ca8b061b5cc0b773e9c0f5d2dc3aa9bd20f034d7173552a2f6864c89d34ded3329fafdca7652013eef495ab1c67ae3c27f6cc9751cbc4a1a396e99fdf9325762d74dbd5deb4b1e19d4054d8dc17ae776c269d63e763b3834a2c1676a79fa0e412e0f20e8c583c1dabbcb1f25d682fd674e497f82d37b2900d596766667777af91b919eef84b73f716a3bb74767608af73db27604ecafde939750e11edb9af88340bc642b5caf22cf29966eb95abaad6b1c4ce59eda52e1ff14105cd45b759a20996563ae3f2111b2637ba11ce594996d50315376662d83f6223c58d1e7fecd72b938ffd604e522a2553ed4199225326171be6c09c5ec5eb3fdb099000717319c90f49487ee0e207470748abeb52c6da32402a8ee58fd6f66c0cec4ca1915b06487c2e69adf6fa9570d45c5a90bff8c7f711c2a3a273fd831148fc21a116046387ed6441b2205990a64168102a444c6a08420873f0f5871d5966883776fdb263a9e6475f6f6f6ec89019f6d39a7299871bbf25906e76663ea10cb5f8d9f9d1f1110285cbb39dd8c51988f4aee4e2002e971ea05dd931c34420d73f966a7d81a5f8fde84a035f28945c0612327253978184865c5892016bd2644b716e0289a91a0a844f9806ac4993264d6492f6820cbbbd4629e7c4307728b87b96659ba6b9bb7bad25777737994cdba952212c33b4d6dddd4f4e5028282929100e8069102517d81feda73de8b9a4bc5c07c2320f88d073bf7f5524f087062c65c2b44113e0ddd03ce8f3036d24807a5fcbae3dcfdb6b229532d4b20842386d9e883c444c2392f4c05f0a5d62c5921b2c2982c49dd0458b61e3720bc618894ac0e250b8c225842b844460b5cb4057f4e0f24f102bf78868c4154de8c09e9090dd15460c91c2c4154314e10a10b411acf5a2b1b02b4068a0252c2b6ee035b0f532901532f020ec7619c80a1798c08a13c468851037aa228d66535daabd282c2a8c248b7284cec2ce58126d2c45b253c5125a1091a28a22b8b0322e0355018227828aba89a021c42d0807d865a0a02577bb0c14249431c1320116283f9aa01b12117537ec6e47c1c62e2c13e001268145335ffe0f9046090a602f1fd270c7d282110d0f2d18d16826b0ef978ff81084fbbd0dc2b89fbdfcc2a71938f1e304eb3290132b98cb403d46d79ef00c18146219a887e8c6677f81fd821e9f18d62931e79c514639a594724a8feece10c2ee10d81823f69bb432c56e73524ab34cd3b46d83b0a6fe562bfc0abf9e7e2b956a4abf994cf319d6d8df4e359e6cd54af4b7934a7fb0ec9151726234d350ccccbcc192e9644f66983278b7ad72f06e92ef26eb8983d756fa8385bf9d9474d874f06a727ff0c3cba5197e26118e21e285a4e68d4d9247975f16b58ad2787e49c4443bae6aa21e57cd787eff7115ca73ea79e55b0cf6fa49c0328d24c46f926cf8bba8556ee3cedfae66d2af1e6a22dfe1f8b5a87ccacb207fe993ad268e65a864b5542baaa6540e75255784a564e5108f7ca1625a9a8dbf645946e462ad3ac733eacc9c83190767adce356a084a27a351310e5ee75c1342ad7067ac885c65fd057eca08a912a5703152ce7aaacec58b615996b9ba9d9337c5d52097bfd0f8564e7b44e8d421350991f695ebf0e0589597bf0cb5d6c91746378d9eba6e6fd7d65116b5ab0b9f66285b9ddbae894b294a313a424acaa1a81f948ebff4b05644503c947229af94a194a214a394a37ee927c275502cd40e4a073504a5532fa710a1a4b2ada56a1cbcf0a254e74a9415e379ffa99494dd478dc44c9b89235f92c828f562985a6bddc287c96d8f0692d16ba828488ed4a518952b47dcce36adbd7626ed4da59afaa68d0681351bfdc96da8c91a63b2b46f2982f25bab946a309e6971ee7403ab127bad51c9e7ee6e4db3e4ee1e774c3b29539d3a974d4a2c7ce97eaaf36713a0bbadbe3133a3b2f9454af5f90556e37feeee9c9473650393024d192977776698e8ee6e9ae2996d8cee9e62c2ccd2db68cc68161a2d3c04999638ebf2b3b87b0b0b8d19a9951613005ac0d009763875601bfe1cc376bf77145b7743ef5396b68dee768163da4bda68cbf0ec98518609923fa88f8dcf3dea8531c6ea83197b8ec0c6199699ffc118e34b2c62736233e5f66ba32dc32c71c090d0348585cfdf360cc31e7b88c5332a4008fba88b2e84f05ba855588e7cf81dd4558e6bad12a7c74180c333323ed69384b18eba0fdb29c25643dd87e974776f51cae949dad131fd308c8cdedddddddddd1d1bf6074e391815ecc295a32e4c1f6ba3bdfe98e799167fc833f2b71fe0a6a30607c4a0f5c2101ba3bde0020c2ff04c0ebed8f76fdc0e1b6ec8c6b0367c5462bf66bf4108ab03f6395ac3b17fb34e6b1b68e3420a326a11fdbc6c7e705a3aae9f6f790e19320ed7381d5668d2a4c9cd7ec8796797b250b09f3db236b48cbcfd37207110101446ad1d2d637780737b82e89ff2abb0090f882c1c1b082e9d0e5ec08463a375a9064f798513946a8a97a48beb575cefc18f14455c976209b705239aee21a80dc2c8de068c0c3a4c929fdbdf71051f82e031d2387549322406c1fa6520279070d04412fe8bcf9739726d276c467262f563e1e2c0ba1db6528e314e198d9040ea45688f6018383242115c704194051334fec5f5ff520f4ea67ee681086e7f89ba4dbd8301a424894aaea51a197f1b401448a8e9ee564012382e60828916467c68da0ba02808757777c794eb2dd7efe78224e73a12d675244dae473185f73894d4a007c80b253c8187c68dc6786136ee578f0041c511d7ed9fef831625ffeaed29805e404025b8fdd136a93531b68c0a3b38bafd4da909a8890e34c76285db96052700e222f162c10f3f2f1802870645dc2246403b48727772fc85afb4a9a0d64e464404c30648467a7a68406b05c403a11bc8e0c6cb403c08badf8f415d60610d3ada6b46f2fa6fbff7c22a1ded4ac0ed21dcfe6a5a818d3d36c030fd3a5cc501f8d2df90044308e2f6c31e3619bb0bf0688f26613f7afb3356414ea5f8e4c473b0b1cbd741a5aea6155879f9bdde60ea022279ab955c7f0cb26c4e5776dbdc3ed2ad560201a699dd0e1ba02a7b7e17a8ca3a98d42f2e033b21d79fa18a766e5a81f58b746d60187f6620a48dc892f325a50d6d6c6c6e7f773ee0b581614a94b29a5c48a43d67318cff12fce29f24058575c23f7b59b80357ed5118d80fb258ddd9abfd6912d6df863b3b3bfb90c1def9b186e81089eb23fefed11dbe3f6415ec20d91b9218838585df83fbd9181f6812762486194228828eb475f0066cf41a76d6ba4afe74c1acf77d7bfd5e04e769e84bae08fda6d633316cec28773cc432fc23360cc0cf3aa4813d3229ae66967ab03cc3337ebbbb3ff6e2b6f4c12d0efaf4c0d6651efed25d0e1136c8426f77fcc4c62e6ceac2f6f37fd0e7c2873e3b782ee578070ef079b4cce9c287395087d5c3e7e642222e64e63c05798e5cbe5f8a69b4236c77963bca39f0c77d00bb6dbb942e3dbc0b5dae57c3028c5e7b2de59c2e5dda6bb9d05f5a232289acb6d3692bb0dc3a2c3198e1534aa503daeb4f3e773b24c743f2688f5f9ac78e1d38f068dec1a3061d2d2401f63c4aad4da5d8288aade95323ec676f373c4232a147ab6d082c6018850e2374c8312b1b404a5cf0d3c3c4fda8110823f37f0c0b2ce0c4987c84b64b0389e5a0c669d8419bc9cd39e7843836ddb354339da61fe2340f9b96f1225e94ca29e30ddd7e849f3ff187cf3f97bdc62d94bee4049ec4c6e2cf299ceaac11ffff0391d8f800d623c6d8a454c69f54d2965376de7fc7b80a7eb7d00bde28c11b3cb3c233f17a92eb9ec5750845edc2c68734fe38f068191fe2630bbb54e3433ef6db9c33fe609434234b9f9661201f21d74fd71f12c1a356c12072809ef0b9eeba813f29b81f7c5d0ff229723f58d4bafeec1fa12cd578c336cd239776df5f1c9a478ff63cfb94675cca5ffcb5236cecac7dfd20db2208061d2e3a70e8f8d1012594ac03070c3f3860d0814387f75f0c0cab18d8c4df9905c8ded5c02fa5ec209450be0d104aff7615a4f9cb5e0d6c0d2d03df054612509ab1570a9aa7a8448ed535412911cd000000009314000028100a07c482c16824cc1359f40314000d83964270529b0bc32cca5114850c31c618000000c00018909199c170008d97b0441567ef1c7b43755b95a29de6a172e6a2f831c643b74721c1986b11353e2be00f0c69528083a85713b6904cc0d7ed5171f7f0b48672f0ce37d68a0c25d8ed6ddf3fff2c0d0a2150107cb711c1da04c86fcfb253b65f8acfc80341026921112113423ce02e9c1510054837c02894495413dcc0fe02b1a2cfe0dbf995e523ea0544b9f1935e0b9aa031ff7903f9808e1f666f5a1784899b9e9cb74f96a7194d2985714cd85668ed21c2c5e2278a2f60cbdd428d4a52029f5641181df81f231fd75985e891202548e70b6a73b1447049bcc9ee2efb635e6eae891bf0a31b8647be9d4c053bc50b1026730f3df8b01e4d7c772c2b2e40ca87aa6d6c75cd21bedccc4b2aa3d6491a2535ac84dac961b23bee31033063a5230e0674260eb1cfb98649e15a9e10606bcb12076108985081cb7934cc38220985130be5b8449e59359155ceaf257342550b860707cc25630888727f0ac8a8f7de907bf03a67658fcc98c1e12519b669de7b530284ad2ef3314d0409a23af84866877e8bbfc783a5abb643e329868ac49d36126235365d10837e91dd19bd359b1c9d6e36da98f4cf7719aacc41eb5f0c4a01c906d4b7e72b4be2e66c04acd21f1afb5217152c35fbbd1e08e8053fb1cc9ccfc2bd876ff25a60395ee7df332414325a793552d44e626b8cd607b625dc3241fc0ace7ed8c353d8d1abf508bf952821d5c035f79f3276bcb5708feaab32b28db196300825941b7ae122937dd3f236bee696d2a6b90d2b01bb05a7ce5cfe87881c230e4157517833fb4bab7592ae9c08405eee2adc468f7cfda227fd159840f35ed37147636c8863ed6047bd16faea5d9ff37f7918875d9fe69c918442f7e89fe7f06db9ffe6ec8681d0b24c94ab56dfdd98f77acb0fc8616ccdb292e237fec6ccb4384c69773cfadf5085fc7cc919b4c7da4e651d6467cca4e3f84bb5ee2af393b1a3b7a53ccd2dd9b1866840cb51a976e5e7d997ec1e455715b78502538d30f1d6a95df1decc67880261d18f941a60ff73cb80a536d7bb066610e82fb88fc4ea3e499a59f40d5040cfd90c58aaf8460a2f33a49c2bdd192c04730caae4bcbcfdc0b22278c58ffeaea745d96fac4ebac160f15d6c9f0120727a0ba745278c18dd696efd6c5e74f91b112774523ff42769132bc9734625f1371c4d3e55e262663effe6f77667cadc469b49fe69c867ff394594a8cc4108296e6bf4eb58b68c44045c9747b36c3aa42e7f6169a09c67e5c8d285d5f399eaf341c18c1592342e90052a71e29b3c7cf197316958d8cea83634846f2889d02c05df2827f125c2c69229cdab22e21b4e4df4e2086de672fbfd2393330a72b1f3d6850dd97745b1eeef88d47942009a776f50d23bec637264a1bc3988aa3b340e083cf71b79c8c3a55ce7860fecea02c2f2100361fd7602660d7073d18e14420f38367012cd7f3b2088de8220ece91df0ee4dc72727ba6a0fc2f214650f014880d24f06c33816045a4a79a926389b162b7865a85805169a6b0e5ee682a42246d9ad2a88c0c36bae3dae294b46c98ea251a21c22991a247854544568e9a9646bd0381a44282a990e183173d9d8428dd381d56441d1c4a813ce54bf81c3c4286fcd6314936d8bed154e107746f43ca55ef4211131cc78dc8e744f4c30f47182fc84c505717c41c64d3abc033d14e5eb33a35d4a07189233a602a311b0f388626acc0c1765f93483ffe8c5db10aea0f7f408d4f8a3b95be5c8349ec6845e9814ab8441d7bf585cbd904ffd93ea3168055ac75b73c59e027b26ec7795b1b40faaa1622a7e96d0d8f54e0205858e0c79d364ebb9315edd2d49438c950a16f1f981568c7767e3ee229cb6b7a8087b0f42849e0af5d3e8e193fb03557a1d5666f47ac80c8a423d8dd3ac1f0fe5c6ee88f006906879b732110b5ec6b96ff13087528d7a79cfcf010ee353088b048887fb0506926f9642b8f115a96a8efd87ab81206daca777bd94e860702c5669d1409f301ac89ee2ac05b48c595d82dbc5b69ab8b08bf2409d930dbcea26c1ee3047679f15342e53bf27682dfc9e38a09b8dfb9ef096e246889410030bb605149ec0d7abff07dcc5f13a8d6182e2be4a00538047e9c31332c7abb5b4c62f2a8616005b8c494f56e22a9f2362ac68c2140e2fc71c8e16779ed0b1d93e1095cfb11e2ec6800134bb275b2003ad447cb846466efe0fc606127344bea6b9738e27ac9d0f205c485c78be8a5f3f7272af7dab0ac2b6ee2173e708ddab43672eeb034afdff9da8fa5a8daad3b653ebbdfc66d61e274d099b20914fdb22fb9d611f632a0ab8f20e03ebf5e5b58ba5e4b8060a0855e45fc67b99fef285b14aa79374fce07abf352c7d937dd63a29520364f8c591a3f216b454094796757268ea079351729097a0e883008b54da05aca8e083f458d23ec2e344cb4dac32c06c2d2808fd063d252c37ee012f64d3b13ad43f6aff054544f78f251ebcbf54b4d40d65ae0f85c5bcca97cec57cbfbf85c98b1a6ca50d51287428ac7e34b1995f36577adc4ba2cd96b0885ec33992d0931d021869c46d45aeaf961e0fbd7229c68aa80e1f21b9cbd99d2524b08f7581fbfa5cfd0b786dd7939e09e18a0a006eee177692a64a8f4f8c49209096deab1818ddd784959feff62e0d83353bc6a026b8600979a43b6d569dd4e84109e8f04ca053cbceb794f84085e003222d95a2ad7005752c23039eac82897a030eb10d62a8a6d328e8f5433780d6df949d81a7cb317bfd88d7fc49d86102e41efb43fe2e90169a48f486c52a7bd43b3d407dbff576eef76b6d88fc62f30cbb01ba27c5003bec04f736fefc4857f96cd0fb4ec411ff41449c100b2c966bac1ccd3f3a319da397b2a2136c830718ee0f1a487c850cc151a95221c502426e22fe8db8f9cd15d71096934ae6cd9cd3c89ea7cbac520e88a2d78bc3be9ab750708d3ca2d081b8d28fa234e46f0c57b63cd521769402c895429ed4378605b50b2f696e51c080e8f900731955f1487b60e07935aaa7dc724bd65184843d709e680dac428da26a13e524fa22fd8d2018b551283a3756c3d5c2de11cb3563cd1668868742f6d22c25fdf9d99798bbda63e14d068b44a9fb41ca89bd2aecb5eaa0abf0d280112544a1f5f8f4f09f086bdc5a91024d5b8d254e55cbce75a0e71a347d5a8a826248ab47341c6b24e631722fd4f0885e3da0aab2004c4ae5ce38661a9977c56ad3e4880534c4eaa48c09f90839bf7615831e4a3182d761fe68df2701ead18527f7b1bd6a537aabd074eeff715a6ea7c4170ee55516ccc44d95f442a3fc938599b887125f90e483a92d5d23669ed50c2c26b9848f9f806c2890b0d0582b016bd6c0ec0651acdf8bc7db3d238326a26ca12ac17baf895646dffa0643258f07c8fc3b81fe4056681ad41d58bc1e521facb8344fb8af879d7ca97ad2912c02d147eb14753e35ca5744678c20db0031a8c1386cbb1467e03de039d2f1fb6f9f0be050141956d64fe92353595f7432742e516aa0dcd7638eb75ce6b6e5a7391045dc14ebfc9b965bcb03605d3c3076e41c90b2be71f377cc08b714ab18d1f13d7b917069132e0e9673a719c189426765fc0163cf08ab90bf968d567d136c4e6502808a4e29ae3c08ac4ebea393ffdd0c28fba656e7cee464be8781e72c7acdb169aeca621decbfb8c5450e1cebffc488718897c4909da3a2806b7b9e03cbb23b6a5468c2e2fe569de91f2ee948a2a5ae7b2155d796c6268c8f262a5839f7e2fe2dd96b5d1871b575f704bb00ae293a3a223507780ae241c09e09fd50d2daf0f4910578ef11c0ce7b3db92e4e1b70012c20c4ad1fbfb7b326e07e8c1a4a93e8872344d92b4455e8c2badb0fac5dbe63fdcf8cb3a5ce48359f6b8714c3668c94c43ccfef4931c0b60603272d085538be4e26c174a030b6b545eb3eb19b6dab520d0fc6ab653a7160ed1cbd32d4e63cc4714d6a825c20fcbc12274b87b0f3d4a40af9db2abf70b626ca0f28cbe072f3087c374d98b71d5d8cee91a870871f0c34bb8ad022e809aeb320a4e7aadf80a0ca0d3afd21740b2c3b5640ed01404917f029cf7c636c84500aaf4adb8084fc938fcd6d195a2515a6f5723ce742096314db8e3a0196e91b19ae4ade9cb0a859ce3786f8fad030c374b4c58286194c1f64a4bacd4709eb822d8fa5fb8dfeb6839eb6c50b71928d4c4494fc69b8d36b7085d2586d6d681597862ca34ad540ce94a4e436ba7f9d735bbf185b04f8d075fc04995222b0f560c186a4228a7da97117aa47199919765fa2c402f5fd177e486811b2530d46a838da6990e0e97e42b195aab10209690939239374126f8b93c7c23040e2d9c02bdd8c0c46d82a1a188271191ffbaaf89c3a097f4d801571c9732ff59218c40fbc1438cb10e94423760c42eab778037593e5f9d71380f4b9638a6e3bb4f59c797ea148ddef3c9233e3bb213969bbb38676d651f553e77bf586688b5ad6a35aedcda17d34e5d3dfdb64d692a0150476f5ae859a8447cfb44940e6d805396610815043ae41b1ad124f5a53028f4cfccc538d04a9e2a7a1ac2b075c708c42b7f948ef059cebf20b883383a6883284be513fc9d60083a3ffeec9ff4bcea1bc3e2ef1c892aa660c1d14211187c7f0409c3cf0a0c8da771003d83ef74da4f05886a497e4813000e99031a6ad294046622a327d6a11813621c995aca5f4c1be1f10bc9784e153a83e716869a01efa885ba0e38fa90f4e9538487d4c02d0c835c1cc714defa17b389a08bc14b23ee8a7bdc8ccb6dd5fcc800de203a22bfb2327e3cb91b8f68cac9f876784bfa0fa51966bac46e57c58a35af08bff7c5064738a05de65b3126fb2b571e5cd37df149cd30be1a06f8e977fd4dacab56aaa34e45a4b91442fb98a45544c4bd004d00027ca810d8f2cc553e384a3b5a04435809aec2505ded89cf4260ff1987cb6fb6bc7a74041ca9a8b483a3f19a1dcfc728c3ba2a402715db5c82f999120b27190da4fb8ff0e9289aadc729c47074aa3776613405c3a77f35a8c4def20ad04b99d1d8a0043b5cae2048ab70325ac1d089d201a7bc17a6587acd0cb379381a8f436d516be11df71b636e59f1b9cb3bf740353bd74e8b674f99bcae6cce28d8ecbc4fd22f102bda363ca42e6cecaac66336cce6cc93ad97f30f84634f42c02b0c382b7b27e311a4d867c7b2ad893c4373a64584c506ab3b66739252ac9e2461499e628da210c5d1418e8cdb83330346ee339695b420c058028e869094cb88bf881e132b07fc651d79b652ea0bd93f85c594689f8abeabdfb26c96da33a0d3c3fca6b4f84cc9a07bdfacc6a79fd5e738d63128aa766351c7192a4e6753b65c4e72169f0a26715bf4cb31e6c39103ab5d31888dcd3840e4f43c2cdc8b7dae09eb8ebdc2b65fd33e595a681e032c6de90b484aca33ca2a4f26b0bac576506e3b4440636ad2c18feb6da73d87634bf3172d206043b288fa1c8abdfdf720d70e65b06a76beb46385cca3575010a028e531ef66b7a212d2f2837940735bde685ad6d881aa1d4666e0dd9bc2f01a7a64755e9d11d0212831ea00b25bd5d03ebafbb1fa8a79e353e3396ecaab6810414c6a384abe1bb01607e4686b33217c46c19fcc84980e2b0d248ecc23be550302b575a4446362b2d6d94ead252ec686efa3618c29a3cd6b953ad032facca1c239ca44b7e89555135be39761b449292b887d72f59246ab5ad5813f43e9fa3aa0fe48a1c7703ba12a1a57710d9ae6c106199e215f0a291bd2c768f585a983b3ff4c9900187a19c5d854cc0d29edce21874629250080a4c63b817142d8e7e7f550c44c5eedf476513a381891511fb5702008044a8399b1733637091374fbdd14653061a7274c96178c4705c521acc90d1e8f49d4468d7bd0e95f6b92a81225ab84fa942dd733c0189a5d14fefd4c7a8d2004bd8d7b5662b6d57b7379425156bd10c38d9aef741ee5cf9971ab444bb86acde7660dd4accc4c2640a5ce26cf288c248ad4280f9c28444c46bf1790264c8f0cc24f35ed56d2e0c0506e90d1d33329625fc9c2d6178d8f4a48944384e1b3b2a347e65cc0f4b85d4f8e43283c4fa5f40420c99cf22a7057c982dfa80606710e0757152c53df13f423b54d72af59b84ed75da8d0c55631475d30d38b1d5031cb089fba2636bda96f2bba85aa2635fd11566b6084e14014545d2279473645b7c7c4e015a7990ce44f43d8e358648849b2fae09d1e61c8dd4f7863f68f03f7794f9117b7ca37e455a5d5d8a23d643c9af47505e46e0494194d811285f4be94daf555166474d85507a8ab4eca05ac2e8ea3671116c9f06862f84f93067f9fbf68dc3b97b368232021e9fc4725959b4dbdf930b9d0fcfc5fa8aa32bcf3ce49ae2df16f467c0600d2555624687c25e05ca4d28c3f70f6d939b8080307c2625963983c221933b53b1cd6467f09ba943e3256f3a29f33eba49945b830be279e5a9b5af35575cf36b8d936cdfd741a96bca195446b6d7ca68caf6addbfdf09236d6e05a64f5d776337c2754f3c4d8ab090d45f326cd78334cbb1dea4bec01f16d61baf61e46aba470b7ce39fac8cf43f70c1288df1b8c8f144ec417ef7cb53d65db74e401d886d503decc37001bcd26667217ac1ce2abf7096550a83f524b8f30213f29f2fd19f96ac8aeec7729bbcdf9aa5b88a1ac5c6037c35364a1e8451a2701b17bd7fde7b0cb055abae3689133d660230b158b80bc52d1506bc07e144c0072701d3015ba2b07711a48b3a1d0371e0086cc24a52a121c10b7ef4c31d4fcf936300e2bf6fe4c87209ea7f843025978f4cf91b9b0071c24b3153ab66851238564c44e00147a5c6244926af4f8d40aa82019be6d3b81f02f1f894ad395499882a9d8776edb939f31674c34eb4d09879cfb173f797b6b7c7bacd656034cd1ba36f88754416a7000200cf002d123991c9d740430c5de91d923b58bd2cb98db89ddad14a72f1fa79bf7b762860d6da4c0c4172b41c685c90ac04b386700168a347472c4ceca3dbce0c9fdf94d3a6f753da4a857cb20de2aa85db82ccec11623a840aa97fcc3d275b2dcc164f044b9e49b7665fba63e9ceaba70f8201c1ba7635f6c8c32727e0d3b40e686da6eecf854b8cb880a4ce664a1f46f165ae817e87b43a976ed60afb204a8feef303d36740bb15f676d7559d5ceb95d74920eb6734407a9aa34d095155c47acdc75bfdf0b2c3186fa88318fb50d0c506d005aba4e72e4dbcb7a57231df80e8da71825e5896b70cb77c9d3f63b7f0a3462775a0e22032893e2145520067e1e84b1c4af5f0a20cc10f0b13a22c0b5ea314559dd19e9509f2502107a9910fc77d09b62b8c0bf80d63e732a62d55211b20518fa1ec1aa529470ce6863c8424867828bd7846b388481749204cca9650815beefcc49c2e13040c6fa583597f5a65d4f7280989557a665ffc6905ddd7693603a35f96e8a458113dcfdb3c71718ad7f3b4d1c0f266683730abbe07992aa15d685ac58278a908704e2c52111b58d496961cca83ef42f00ec9a92b25d0c69dac9eee0454efd293008b0743899bfe39df63de36f74bc1f16bca3cf43941220bc7113b8519fc5e8597c54f0f69d1c54bdde103c4108687877c570575e1dab9b4650d44fba5b199698c2a572bd29630671a1624f9f0fc70b84411eba3a309949c85ed37d0dc653eeeb4232c9b913f34024afb16098cf8afd9717e142d023279059f00fe8698540bbf430bcc48a6f20d3d7fe8d6d9d5acc86b716b16381704ebba24915f896eb653f50622c065b8c3fb28c6c1775e55034ed64a88dbb596119d81bbf3bbc65c3042289e7b3d2be950a32e836c9a16b3d5dcf484c60b23ebd5d24748bb7d3fc6238688e877b3be5e0b72bcb8de85b3ef1346d915d22d82f4da72818b68a7941e5ccdbe1e34646eb665cfd4eb7e8083eceb4de6914edeb7447b4fd313ff2e1274e492bb7b6e188e02fb4e81ee5289a26965459cc6217562e11c134922adbc39b82bfde652aa8c079080e653a31b9ac3a578810cb5616bf6c9fc9f5b41e36ed5da08a88283a5013327df99dd66eb72c14176daf40e3201587548e9fdde21fdcd4abd61454665db8ade3113e852044dc5ac9b2e79cf2abb551a6142ac24a34ca54e17d64a13ff71cfcb854508e6c4322594aa9575106e1b8a1ef13d2941eab6d3204671849d6442e81a6bc26d917cb4440ead4bf3b3ce682e9f98f63f8ecfdac1bb48ff8b4e26e77fb48b5d31b78e8e91e3e19bfa97030eefe89a6776696c5c769799352d207b38760e2520a9397a33d24b43eaee3ba0398b73274ca5c7036139e1865df29c9e7b227521fd70f5e90556e62028771780bcad5305efe8ac9bbb29027a0390db89db58bdbb08b7baf17a4bd3381ddfe6ce8daf5bd772980662dfced47a4918bb373b2b082b740074b93aa1d5f44d0eeab235db1c86f35d537a12c82a70a29d65036a38bd011d2332cd4d10550dfc643347680cfcca52c0633ca92e565cad16644abbbe3f6572da62145751796846b64633838c83bf9c8a659de67aa202c04e54a39e5ffb47c72962aac91c8b432af7420d9fd57ad2dfbe328afb25ead1e4d4dfbdf56d1722cc7b226c3694cfda7ad4320c3a28b64d28a933f5d31b1448d007e1b047a7bf85321f542471e47b152c09ae3687846267d9d5b0e3d9a573491f0e2d6923618635dffcf7563a7ae7fe90a3e88e5acbc9c450400c3c84548752d4073104886091556101ff633c4ec6313906e2aaa8fc11600ef156b12e064133422d415d942e964cf4c0525e496d7dd65b02e32f9e1663cd316c0900bbc943898c0beaff75bd6cc8d3abf338b0597d8ca8429c4d79aec463077c65d996f508f2008bfe613a4faeb84ea0381091298d051fa516901e01ba1c4c1761b8214ab95e445905726cf4d8c15ff1eca11845bc1903b1674a7762000008e15f773c7c34e8427aef9f53a33d29e46820e92a835fd09b0f66b83c5ac0c890b2178f1900bceeb883a10f0da7194483be15903ef90d7a82d6ab93ee8156d12d458e3096056378ec70b03a75af4addc7d1c10c611280ded7a690016d10f073343a73d0d12e82e0c8a98312a1f5edac705db749b8b1150ce2b39e2d4811942eb753df390db9c49039e62381a36a71817a57d400c28a7d07a9d2993ef9935ba0eb0152801a69f1b4ccc32714c610720fccac4a2ac25c9dcd9cb4264a087ddd33ab992b9f9321f12e9baa7c00c29328ddf531ec928e3dc2e4a37fb5e21d23ebcc19a3aad2353a523dc1832534c38ff674013350dc6ff7f8bd03b31caea671437837ecd4004303dbe56e4efddc605770188333281683d4c4f56936cfcd2cb80c58a759dacb3510d5960fa837a0e0d11dc0939a1c5da005e5c1c8c4ef0f72ab1898d20d25d7d0b60711ccc8e8c348cc8fbd5b9706feccf1223603637a85f8ed9f20201c1e738b551c7f55c225a4de6a2825a34c88003d0c2c70294f6cce8e18e14da9b7ec466a0e193f8d09314e94500fbd401fb599d5c90844aa6b6250331dc9b0c8524d0dbabaab865e504c8562e206df315e2b7a38887bd814036230833723e337955574f11eaddddde2419442793175ec2564cd3ae92243f97837cc7ad2cc938480f4eef0646816151eb3b61cd65222b503b268c20c1d00f1eeb3fc5079c9361dcb8f2a7173d51732db971aaeea6fd84a4f7356d002fe016fa78c7f079af838bce590335165152a44f6c0e88f885b9cbbdd2c244c22c3a4676c6f913405dfd5b9b9d958741f5b3791ffb1987ab414317a1109114d46e52b6575046742ce660620d3808dc21e2c5f97c99afa4a485e9b23c918ad93f079299651ac9a08753b0793748d548f8bdf50e51d1986fe30c6993fc7c70cbb3f5419cea5a2799285351993de9879574ea92f616764219405487e8c374fc3bb2481254e27ac7aca9de08adb6a665b2b81ebad14b8fa5e926894b547a43ad6774f777d4a473f259902b4d7559808ee37e51a032db6c8b555e19b8cd204267a44e308de1b9fac8aeb9215e8fa7e2b4d2b4754bfe39cfa52168c8bc75a0776cef948edcd62d1cc1dd27102e4f9685cda74126fa4d599914f2a7968fa497a277dd63f0a606ad742f6709c0237bf3e2c20750aa6c7639e8c8163250e2db9a3d3e63dc491f6f5dbfd5f2efdcccbef62a1e409125c8e5a96e8b7fdd583dad833c35aa80a4831e64cbd383055230fe9090e6e7087d1206c5e24ca6f5b3006abf962cfafadc467a5e59f868397acda42025ac69bb7d65f8dbbd76a6c58cd9c77ae0ca75e720650fafb93fb78f949ef3648bceb233d1bf46925d28e808706f276302a78731157dceed6ebd7275c6495f28ae10238149f17217f60ba90e3bc25c993f83236296b02be867bb117a93c7180c7c69dfbcc9be28ef020e4f5ece0121ab3dca1fa170c89e428546aa1dbe82b97f820fa4c14fe0b28140e6d1bd97b9e4d9d04020b1df269c846417c0817c9294740d5e65a4a5830c7fae7ad65791d40d02c89084882409892ed8f698d0243e6fd0294aa001b37e0d33d0905d293055f2aadf8b61d4e1645678b309d4197e0f7ef950b2e3df400f73b12056f8f9a67ae28532111849e6f9d6c50277c53bc861186f833e9504072a56cd0d519858cc5ae862217f0c288c353a91e75c60ccf9a0e9ab3675a885f8709cdf16dd003e65cba030b7d1b110e82ca7e716a3472f1917c62e4e020fbb6eb72303bd7027c4accbef5e8773dfc4a51b2f314b7278e0a8ec71b473777554eef78c10645899fdd6ac6eee948a6704729210a5d6a3b48c3c80996f43facf9f65892ac75c7fb8b7e05e3993be44b0dca227cf5877c8ad1af02edad0fe129e1340e045b6c54eed8849e58f7bbbaa380e659aac951b0fbd023b735dc3ac9e039d9ce40d1ce9648820269cd1944afba41fd18c05613dc1ab15f06e19c50b1e40dd5ad06b7fb8a3f8eb9cc41ccda03fef452a01cf599534275e811fba48cb99156b2d31bf03f15d6eb4a5117a6f9d653d9f6bfab641716f3c678f307f2cb0cf780536d93d27693bb68d1fa0ad4f69798f3ab130e6c195a1772486379493ececae6c0f5acfdb25232e0e9e890c5b140eea5f10c96e46d15d57d222f5d338b7b009cdcdb71eacc2e55a7218022d60b1a41729c649c6f26c229e27cb1797b0d47b14fb99d75a9886cc707151480fcaaf3e7c600bc4b6ab45b05eb958c9e501ebcd06d7d95b87a0545f617e3dacbdcf6dbdf11481b38046f4ea378411d8f29e420103cc65ed35e3b5082e2055f10eaad188e8eb4cde1e5e20f3fa58244d1355ee0ea3632ca714e4a6c5989685120543dd9a1e02e8440ac1a667f940c6a9753b2ac11b7b21a85fe1c2137c21b1a539b54462bbc846411c27dc840b6a2b6ab7c34289786cfcd443565fca4f4bdf3ec27a0639c92d7ef12463ea2884049d14203a04e84237bcf458d96e1709859d6338c8a00c1d25ce083a44a59ee82049d09ea9c541d81a13b9ecf3627b5a701199dc2b627c26de19eacb6c0837fc8b5b392991eff97ea23858670dcf64546bae66c74cbbadad9a5b1b4038f8a01f8143ee689933fb7d2cbc0faa634bf8cb84707b28d1b205f2da39abad5321c53511643b8e299473a0ba7c91bcd5646a0d40f7855860481b72a4ca7af487ade4da5c2767f652b7e2b0b3ca6c4b86937d582e12d1ec3a9e87c3a571813559297360f356b26599c01ff7a3d66890377ad8db401807422d751dd3e76c070259ce91e458731c2fdd9ebbf29d024bc18edd730abbf6a4cdda01b49290d62bcebae5edbfad8df708690277ba138fb722d57f4ac862c91a66c0caa27586102c36e66a3bfb03793605b932c9eeec24f9d4e3a196f388a30cc6d9819e34ce778f3c204112d6bac1aad1d9b56f99d861abac60abc8b46cacd4e47b63ba3edb5ac1c82608624db01852dc5a92a843bdb6c44bcb586bad3d778a3607d18ed7384d2ef18e17f8aa0d4e55949bb7b3ba0ca8bacba51a085191b3fa6e534dc5a7c1662f05a56899db19833f2ed892315fa256dc312116ffd162c8031ca9d2e9641c6f8298f37ae429dd0606e84d3831dc6637a1154cb059337abd40e804ae6844a5ca77730f1864e71c0720adf0e752cb8a076ed187889b7359db43ebac8d94396eff9a084f15b086cf08f5ff9d4a0544b81d07660a6ffde7bad410ca84487b9b201d54ac86343d510f2a80bfa51183699b11f3e824c75e9f7a402bd49a5f635ccf71106578acec351b41108464cf299f618728e50c485e19568fe3c578fed4057151985ed058e7c44e5c9017065294fbe47528bee0a0cc2ce4a93a278d93bc4fb29a77f08d1e7a8550ff4509758dd25eb9d69348bf7f1e4a62afa31d114d91771e8a9fc56cc87805c3b6aadf0f543b21075162da02a047d622e19e5f4b45df251ce4a9cce4dacd3ae80a3f8e505706e833c35d59cd3a0c4af9a45e8e8c591961945332931fac003c8b8653a712c82c034478d65cc114169041b42f8783b815e019dc6c4439c11390805481af2d150deda84a52882ce2711d7fca5079930e07a6dad3b6a692c549712d8ae304c3484c97cfe97fe40038d63ae7883fe433afa421170302d3e3f05d43231981049d17d22d4128829392b482a4d066ec78072c07448e443237c8e180cc30d93f30c22079ec748264422a2d33d1ae5147b054ac1004d645970a111c09bb596bd01ce04c4bd35a185e15aba52afc96f10a713b65b29238b86e3f9e8277756b64c8c4838fc02c368e8e392fe7debb184a067fe992fff5aef487a64be32da0ddf334bfcdfd4049da03272fb35585b077a750c1976e1df1f90bafb29acd7a40de40a91cc71654628086b3a05ae22b4c2cd2d35733ff08b8c3bcadf589fa3fcce38caaec2dd1ec910877e9b894d452bb8054d3d246ba99829ff5b0099c2757c23ed5564c72df02f2824c9d3e60b551c5dccb07bd9b4f94d3ae451a33292e3bba8bd4852de107cd6ba01daaf8f45c928a777445b92a5dd5aaaa8d721192fc53645685060ada14282a9a236224c27c8036cd4491fe4a641a62593ba91b4001ed8d705726049edcb2c50c0ec6664bd67deffb98549f27636811c17fa65951345da13ab46bf37608d4cada603edad23373a28e89b1406c051057918e9816d9b42f88817eb7504797dab8b42b910b48f2225438f48acf2b21c6c415cad861d4b9ce6c9ccb579101ee14b5568245326ec43226808ed9d6c05ed13ac87c774770e7d59d44c2dcc2392db1c1920050d084638230fc948a8f33cc927766921b4cab1b98518e079929996a72b582887e19c06a669beb26b5374c8841d10ff40d0b947504c17b406f112241cd68d7e3053bf8a4ae4b1fe2fdc1ba293daf012a96f8d40c7deaa8f356390f076fa774dccac6354d1e7e5ab0a3c770899f486dd0133ce08f511d9a1bbabc5b6d1a8b41dd31bb8f1360d2842336496baa93e894470ca98371640ca4683252e09bdeb5bd74a979dd59b0d2857923a6693522d86560d13d345cd80f9de7c09ae239371766b9651c5047c9507b4ba86476c574ca5ccc6d9d187bd17942ec3c4530450c3bef3143beafec57af245d5822d483ecd1cb0b45f33598dcb8e990f47098e98a676e704cf0c0fbfd7f231b5a3ce032322f8463cee52de0830e373b1aec2c8f11282df1355ae9979278ae7b08b0744a9a61f32af9cf07e9f5a6b84af49330f625f656a545e1dff30934165ef890eb3d5bf8ea092db0519880378d7231d20534b9052f76d14abb22cda6f0960f79d659cccd7fc666730f1c512cea0366a1d41bdd15b3e77257c6ace1526e78098aed1b1f3c85049585af14640e452b26911b897fec80b457dcb54f1d0157299674de10b8cd6feea2dbc91c61c18e1edffb3047fd876d7b6af6f07bee46b4ae837758ff08eae1f01f1842c68e2ef82f44887e0897c0604bb58adf1f40491ee275b552f7ef0a831ed07dd10a3fd3f1e55549606f934744432762a8ff1405e9547e425723d3c954187180ec9b4006be837556ee891a8ea02bf2ad582e5bab5455c0507631e7af44e9873c4c83be72d4b6bfcd0f029bb11b348a6965360c83a585115c17d1bfe23918352fa24da6a6543af93dd0bc38a18466e62ba252e468528d30cc69234c064722146507eb8d6491d387469adeac059275bb650c319a8a21ef0b2a1a4b7bb3c794a599d1f2e54d0f2abd71737f94a28388a1c9d742af432542a3f9cfa09ed7e2137896020f76beef476f49e65ea9ca8cf5d454d2e5c6019218219ca5c44d9094599584078781f684c8b4073b1ce14550952878f536d481502904c9331417446c3eed355d6a851b5465180ecf0d1d27b4221816238612bbac818d788aa2d03ed9a5b5c27835fa74695e0ec19cbc538a1590d9ee370d33894cea07a4ff2641a7449b71960c8fb3b0431e322483dddfb616ee1c6312cd91da9249c012b63ee90265d23864abaf2bd477103807c7f7a76d790204f6a7b7fa11af0078a79d4649d212f7d5dbac95f39e5ba2711bcfdbb800f9a8f81a099d5090402fbe430ce8f88506dab03a8c44271b907e2894df53e9ad97c7a93ebfc50191f8844389a1147098bf880aac377c3864a2340e446a4159d6536f1a9815fcc8601ba2accde23e12577f72c9648f3a330d90c672ae0eb91863f5730340b60d7b7baee53c5d4c99c4e91a14b3e707756e5228ff51bd7f0d250fe29bc6c05deab535c5bd59cc774c7f933f377a1d620b64f2903a0750c11bca9de244701b81e84a51ab8e277a87fec4ca964772347f18c21425b4282d81bb9bc94cace95b5f3595ce213e3a63c32b600e028d05225e36f0d7906c43083092eef31643125d04e7326c0a57b31f907d8fb85f0f673e447536ab56b2ac47649e0376d661081d9f6407ca3548625ba899d25c90e46a818206be7b17203d0c07bcbbe3d64f6f8c6ec1b2198a0403abe78fcd83c9719675a702d8922d85736d74a73361369227352d90dd08049c7e6be5c3e4be57c46e2fe2078e8038f507493a35b6d129a3f9d915bda35487554302b101df412863b2f1baadc4a6609dcc7c90a0cb4c2afa6ece0a5191f3c748d0bbb93841a2b2e545f0a87cb815c631929a87865d1745fcfb23ca0e699ada445fc8d641687c6823e1dcfec7fd0a1c15c001896a2e19a740955f2c39810e414776d11583d03cf9511fd4ba07450a0b2ad91492a08ab8aa59666b1f63c4459ea8da6e335302d64c7618b696607fafb0ccd8f45498d9ff73f10ab2827e61171ca8759ef8875c6e794dcc2692a113de3e4fb9f000a41e4698d4c0d3a6011198388bd8a393268b201864f96a2a8bfddfea81d6db602300b1c72dcc031bd8ce9bf099346ccc2c2cd9856fd2b6b46a6f02d85773ea624f01334dfbf41b5d95444af4b5b7cd3f60a286e86632fa1c634dd11c8762d5e4360d0a7ffcfa160abfd02a114711fab3fb59aed52958cbb91c461662006ce0e81f449ea9c6e40a891e6f962427877b7879856a7a989589deb14babf8a1549d74f1f681aa8f9a795736b856ed2bf8993a54dda8be26621a4714630e1a7230288a84d24054cea497fa40762be6a81267d55618ea4de72788fed6055559d77dae71e76a34e7f857c8296207eb2f61a5bf13e54843a7356a5f62d668b26f0f47edfb286fa6b906703422cafc3064f436d32abc09da3da58a904f0465420f9df7a5aadc8aad9b967c9e9d7429bb9c308bad4ede25121159865dc88961878d4174f2a22044e95c1c6a7546f3b246b29eb349a5c4940c7ea4c5ecf8ecf337e0dc4fc2393902e58ef33748a2648bc002e039f848091427a428b7c7dd5ae1d85d4f30afe8cbd6a6a295103cbf4e5007fbd4a2434f5710fa8e7cea747a9da946027010ca1fed4a3dc9744225370ba0550516d43fbf655599022a22143067887469160113aa8782ddb7a6357cbf0fe4494a940e64f67dc38444cdb088b9dcfff9a705ddb164db7760ad873fbd4484889113c88d90095e6220030594a0fc29434c820366981b4737bc284b6a6becedd622e42ae9426d4a934a6ae7bc135df162f48d8c1603ab4bb28a44c875eb2db057c505dc4089047c4d83a4f0a80cc6425edd8b78765b9e1096a3f81dbb9e143d2c5fafc2e23710c4f514b3fc06e1de21e3e71b8c7b8152725c280d17948acb4ae126a5e0a2d271a334dca144dc560a9794822b958e0ba5e182127177280dc21d878ef43bbf0a7102b55f62f9401c1f22aecf88f301f17c94583e11c367c4f529e27c0289f93e25968f9f7eddfd546e3888bf2bb050de7189813406935ff09cb0698457ad492c8cff8942035ff6e80363db0a39c0e83d72be32d0e3c506eff3c1b276bab928f87412ef069df634d39eab2da654170cebfc4dda0090c7e1b7303c499787a19ab3db6173a24f68ff3f974d19140d1c43134c766e32ba02b7142249f20f3555f03a3485c60a6f5698aa21b515f45629d4edd178c2b5b3f29d9dd1009df6a0a077fb38594a17fec3c094beadfe80886bf4aa9ec7eb359e8e1b91e7f0aa84485b9015f714552035e4c829657928deced3b2ef740665a41927a0643f03d1806d2574a00903f250829a34059d87724746878395d00e9d2ab1544e71e47f462fb0b119913eee2c36d00a898ef937b9d006cfa60e7da0f756ecd144a3251fa37316061690a5619dd8c387301b5c07f2669ca2629fd92742d2a44e6c96d0a7cdb6718df23a9d4d51383f5e2a7c6cd9e56295dfcaaf9d0e916b312b7623a89d165def80ac03726d6016baa6a76313775a848ea0aca60ed870a7f7618388a3fe1eedcd8ac405b8d32158a4339c7cd00b201e8aa562bac307ff5e36a050cf9744c7bfc9ccfd0150cb3bfded30f1ad7fdf2edd69a41072718e9ce55917119d4235cbd0460a2ab43fd9131e5ce9d7346c85bd0acd0a4b1302451bb8139def840c1236c8b6bca2b77f10bf0266949a6ca70b77db791f03b68dc8e13bc086501c0c7a2d2429ca8f89969553ddbb0150f79f7ef0cbb68cd3d8ac92b8de7fd22e1c2aa61b8501a0f3f1297a30ddd1de9f945f9361521207cf214d34c5d1b88a6f18b06adc7735df2c10f6c97e9b9158139e165c1da23cfbea9577361d2c677b7c3aee9ac53e418733aa3a4e54f540c6a49236aad34009eda6507051691ad8ea4dd15ec495435af0497d2e5619e818c91300af06cd3c335e4afa06d7ea99f82b6854a0534d2ab4b29f36bfac81823089d27b3bf71b4e14b82737629a267e5ce63cb26f2437994f74fa997037355ded6fab490870d35e4325142dd84680b712c01a6fe48f17ec1df5c819c59cf606388bf49b207b2624af00d7aaee87bf957b6530722264f46e90fa4e38378fa90e28cdaf224260b0fe2ff2d308a6a840434d151ca8338c121c05f81e5f05b85bb66ec83a0a701d02fcb9d26ca54ff85b88a1a76456cad8ac9bbbbab0218603e89c9469c880f9d2992c80f293876cd189d60bfcbdbfa33a124f2d14dccdc12e0b982650a764b3cde95c2fbbab123af054298384ebe22a0f67bc77833c38b72909a90993e83b0df2d7111067d37b47623a9ab98fed93ebe3b2d08c687c135ac6bdab90f2ef954efe784f9047810908d1b7f9cfdf50675fb55ebcdf38f2fda76070860a78f427c734ea6cd3bb86f798ffa23403dd14088af08d63183f7f16907783fc0150d9f62b4817f62f4eedf113752affe48023b7b898b89145c4e67b947dcc469b88984d8da3fc13e221f36391152190dd78b54c228305e31c7276b60cbf96155482d6f5f4c33c151bb331111435d23cb38060fa75a6e893f616ac7ed94c0f528f8f2a5f0f7739fd77667492537153133c74964d81f6dee544317b9c65dd9e271879542047817c343987cfa2cb54a12df051e45c59fe3cd83943d2eb9a153a018c00dd9fd1baa01a7c2f6e865efc3a9312778c7cc7261d4c042219eabe129ab238a3ce07c1e17359ccc47f088dcc1095ef62b4deef52c7337c460bf0777de58f5b3d670736201847e6021709ce4e1f938e12f70857c384c5ca6504d252be10577d41f87bf05a8783ea6f6015bcc485dc0583cc6429087ce227a6a848eea48d9735578f936bf672bb5362d642a9bc982b85b00a1cbde93a1c50005f7c7a908859b179e345d510819654f753d6700a18529e2a5515c7f9ec8a8439d6ceef90787ff35a89ec1e86908a29ce2511a8a0dedc276ade7e22858b41476efd41058f1a18746b624257fd85589f3c7ad1d363e98d7ea3fed4f8306cbc4b1b458a20dcf982ce02ce169dcb97e0f175dd6cf5688b50f7a827ce3227a59e532c69916925483969e944f9caad7e2da923bf3c0f01c9188b2194d0df0f2fc26667b5335c4392ffe3c39003f25497366de1ce15b3b37eed44906046b00ec26ed6061c580fdd47d830ee5099e0f3b2ade0a3f9a15a039b2aa5d79ffd9960639328f24986c933574efce2655e65af9cbf36c15b46f99bd58ccf9b4cfd5966588311712275059aaff82ad96a2bae147d1e119e1708a531a6b76c0cf4a3d3208eb672c38b1260a57e78a49427607f16b7893dcf9ab01596aa9d662c171cfaf5c9a20f1665bdd6e83a08c8fc987acbb3e019e1a341ba8e41f4a439ea1633e899447a58d19fe36871c121debde6168f29aebf7e61774d4b07b7480647cf5ce10e07530b4e177be12f9ada0a7f18e732779044fd3f02a5b7ea5b42124897feb7e8d2bcf083507705b7495479406ad33ae39920b4f6dd5b48842b49e6af03bdeb24b7b3c583d611bf815491064be61cc0df52703b56aeda8ebc22080a500fa83d8c6d18649b0a639b8f9153cf9068377731e7a3c76a46a78e0605c38d89dd8301a53e02377350a6ae20b7794252c1f956692b8b02c0a2026eb9afd1830312501870e903fee2f077fbe00b7f4745120e8df395815c07adc36c32a9a1943f8b1e5ae4c3093afbf76315e5decb1bf5e608478d62825f4cca1e96f8e9cdd1978b58f9314ba92de28474debc5b6f2a5b00e2a6c5160ee3f68496f492a1bc9f0dda09d0d6508a6578ed386ef45cf02b03cb78735e78bea21cabd509da2ea7f429a90249d1b92cf31053f982bae9ea908c693d2b03c670932ff156d6685965309d0e2ef979f3ceb2dc75eb6cccfe5e0cf3f99a3f24ba0633b2e4393c28203b7f290a6588abef13cf5f5a78b4fc0408c2f5aee40594ec5bf30731db8e71b5b572c0137075638481e1db0119e8aca6f083660ae0ba36c93f7aa0a23d1a3605fcf3ca2222823039d23f0f6f804e7b371daa756a62658def2c202d2629637fa4d292c66e42f9626d5481c5e0c39320bfb2ebcc01797014170c8086c753ed75696fab7871cfd3888fd8dd8b62ed5edad0c82a83275499276b0205c4ab10dd98add5970b31f8f6afc5ad2edb070ca0d03a88a2420e91b306786878cfa9dc6d7c0a756078b18066a49aaa991534f734727c99f4941a4a2e793ad516653358078134eb15ae26c72c2ca6cb229381c9bd9bf78bb7065a7572471d9fdb3a3cb8292911305b7a3760d6f26734f75109129d6af8433d149e7888dd2ada2c5a739616c6dd83db2d5ae3459e259a2d456697ef9b56e5924da31d281ce676c22edfe75cc06bdd7e3631fc3c6380adb27586cacd719a7698f7a52c1434d10e9ed6495a5aa3647a469175ecb4a12198112df7c4100dfd79d4ac74c93525fcfa1bc210d7180e6caa25411bad98f7fb1129608cea2ff801605a630b9001c4cf892601626f2c3301b9de73a448b694d6888bf59f17869e13105ac80157a78b7fba98d5e2ff8b8ce80d10f3df615b33489323b912f47df35d324619c0bf1a8af4461d813ffcf98b38b64708c12bc95f997ff1dfae94ebcf7f9702dc5070d2e394d2f2f50b2865c7fa968c3f5b90cf49f4708acb6eae0afcc5e632bdd2f92c2e5e2c240784ef457de550c30fe16b76450ae92615f9db519289e760b6820cd35aefc71047ab0208ca12aa3d7500c14de2726c43c946449bd87ae17f89361a1bf7c7b7ccddf95f3f4526293cca6b09c2894797c2ce7c2271498c54da1f63c4c4f5e60fff914d8350b7efb56f886b16a7470aa455dcaebb8ae14a3336b93b73b61224409b86379597514c6b81baa1adf19210dec8fd64f2419af7177be5e84ffdbc82600804e95cbcc010432bceb43747612c5d84dcf6caf87998d4a00050b91a32bc575aafd05fd6ee2dfbffae58e4fae18e6a882e4ba375a47f3063bea38e8a8ca88535231f8117cddf374c2a91626b95b2a01d11291faf2dc405977a73950768ed1bcdf88c050619fe9c9ff84acee5eca766521508dfb294413937c9cbf31353c621ab8002d475032269c2ef6f54c9aaa645aa89c34fc8741403de3bff8e9004f15aee9a209f60346ab4c451546c95f75a1e01b6504c40c7a27afcca14263b856c46faad587a7ce89512f5abb19ed2f5aeacfe70453f58d4d7d0fa7efc7938f4646b7a31f99f95580bd767c89a4c1da2954a83fbd406cc47fd9f984c6260ce5b6deb08006b6cacc0baa51325783051a649ff65cae08b0c363cd80c74cdf4f2f47842633e46572e80a442162ee65619b0fbb5755ccbe71c7069dc85dff97e93bb1ff65ea0c4adc9ac0b3327369e32a918bd10272ab61fb041c5c4e588bb43653c409e84ef630a45b697ecbe036bed8634c4743721cf899b3b2a2647d0c4a130a87e8fbc4fd04d54afd557ade36856798cc62cab68d48ce40faa0a767c66ba4c444dba595ac3abaf93299eca776a8761ec70ce1e2ec44d72291a1fdd8c8e8b913387220b418ef78782e7f1e4b7e939713723023740b9b07b9f34ca9866db20f89ff1898d94a574a2b08d323203060e66f35b993fa68b6813100e5c3feed29b1542b3e579634ad2f986947ef4883f08fb26ea74918aa66edf999a776feb62b597a36ea2577fc2ebfdddfa8078417e546eeda6297fa4d27bd18c40e23ef8da0d209131f92dd9f50244ff241439203c9f8ef1e63502af1608a4583840723e58c262802409a95b52d2a5716e75f2a9c370762807b0417f0c963a862384e37814d8b2d144c3348feb03121e55486a6ec82ce305948e8a20bc2086d028c9f21b6210c67314423b76acdd44b7c0d85ac6c95a442652cda2457623b71707c2be00d84bf8a4dda1c555d0b4cf074ead9676d301308f5dd3e4a40f7315be8ad558dec59277e7c7786758b19524175d1e9420207dbf84a8b677ea326334138fc16f0ffdd47d15085b40c40b101957e096c39ca8510484e526b42435cf1f1de70b4529f0cbff5f0865da56592b17a702167a31ee8c734061a6ef76ad858de4954c7b705ca4efe2044434c4dd65a6427f550375e662db8ed00ad0530dadf4b0d154cb49d5a693467f427aad7db670831c4ad3f685586a13915e6b7fe79bd6b9e8b765188fcedd45caaf5995b533204fcbb135b83a5abb474e7118520f968cd905027e7ab70b9b96923e3230d674ff2c030d8b380d7f1707fdd83dfcf0c41d1e588c3d469ac25e8690d3d9b87ee8f222489101914bc278d6deb31d6c6037110e2454e23e3a906de937fc1f546f4f1416b2e8d9dd7125120b9e20123cb6aca0988a7d948c58b82fae9caa91f6a5d25d01a389516f1d3c68f678898aa9e50be4529fa62fa7dd476f0ca7e20186d282e2daae1229cc6442569aeb3d2c75c1ab02be42901d43c5b01198f1f6c8b5c907efc9095ee4d922e19da90d3da2690aee4c6bf8c80d385a26520f5254f0515be5d0288ac6d1281d905b44834eb64dd0200fc12f8b8cef7831e84a6e2ad0d920d568519ba3ef9dbc0b0fe2e5121078c76f0c5ac351c17b989deed7f88299f8ae2538ef526e401cdbeb67666b84bb17f6174354dc5c3443f0d663ce74a04ca84b4ffaaf88e1d3764b4e809028bf2d3e46878f4076091c99f4e76cc568ed35a26d1f45ef41c4ab267864b12766ff0929538c0b7d31e0a7c9435132be1298ae780c3104b708c84d16e32b0ab836482981e8367a5a3dcf605f92899d43facfd793ab2f201dd6541c52e747ae925c5c4d6a03f4bbb11bd88d387cf9e47e1aca39371dc4e27b0c6efa1df1c8cd86e10c7717137d23b8a8f753ba928431a3ff2b8e66dbef99f82d13b75ba5c14801090590a7145f7897c96610689fb542d1bd4f7a3367ae2022cee7c25b1c3dc28736499f0fb0a4fbf808099abe9c4d401886f32f41a9f664a5ec064078a32f764ff9cbf7c912905f2447781dd208874330d25dbeea0c949217e99e5a3ff82c1e6d2b158e6bcf15b837814f4988425355eecb77f9f1b927d858e16639a73b60ebd50d680b220d039eb37f78d4b9720ddeff13d50892f43d03c39f4b07f8ab0bfc894be3e54f8067febf4f96bc8f8eac692d9468120309b6202910c5074dd6d1e0207497bfdedb7d75e409b7b46148ccdf32598d37de8e34efb688fb43253016b3e9886660a484a87e4f1839b61045a5fd4fa126cda8f1373143e67865fd54a980e168d281c719d9a3dbd4b3c1cf54f9e4352182e9a11ccbb64d16b74433bdee8bdaa0039751ce722ce12789f37f7c73d002935a8526060b2eec5bc7da63269cb4a29bf8487da203723dfe1b644b9e06e6a84141dc0f111e29e8f8af4404937ed4ac24c3fc7349e847d1378c413ca717e6fe09f675048734ddeb4cbd6249e7fb76bf1b29e1306fa20cc0c5c4d10529377c08038005f97f08e816265091f6233ac172b2196c7eab58042cae08285fec08325a1be05bf543b27c524b56c2e5abfb69533d982c857c326aeee73a72035220a6609fa2c7326ba2870c92542c6cc07bd2b7ed2089c2f2b5507ee752f4e8982c322b614ece88836181ad945b65f75102635513682abb23398917cfad45eae65009d5f429b896f973dcfeac151fa20a776a902cadaaec1023a74963d358afa2f4d77cfd21ce396427093ea3d224d71eaef65e10ff9a835081998458cee39f403421380ea5e871277a2ccc3d7e5876d2176152202cb362986408d3bdc303475ccb5c4a320e0c1329a4cf3ca364a2df047dda312969b68d2e66b792e5620af916fab1338480ccee0e0221833524b902921489d7ede3f140aa46581ddada5ba94e099d3dafc97429e9c81879af46866776c8d418b5f26dd93b01536426cff101e13e82fedb24702cb6b239725c90f94e8128ffc3c5d20bdd327bdb352c7575a864bf507a07bff2cf31bdd4e396cc5639763d3b2c9d6ba5c991c76ac502143963a2281d6b2f2c50fbcf0aa6bec309567c8d06efddb2997c008dc30538aad62bb7f4c562099fec83d6c583ab345a8162d38c1c19511bc8598d7c3a461ce81a9b3ab0fb7160b83690bc087c099c5bf58493c18e4229548cb3358ffdf2792b218a7b4b0363a30e35db32b0ba3e353c65dd6d42bc403c75b3c085fe9b61f3164855a4d904a0171c083cda170d709034f2e08ff8925ee538b8714f0162549796928cae60f61d92add157bfdb65295a3b6afac87a37df34c0cddaa34cd6aa7565e6c66fa679d756a13f4f99b615dd00c2c764443d1cf19eca22bd55085bde740b3f0e9ba3b887a3e9305778fae0ee6c946e3409d9de7867ebad0e341f8b033fa3d64f87e6903a7380959823eda7929ea71200a0e91ae3a2276c0b9f86f228fc04e1ba1ee3810fcd043f640bfc907a47e2cf7e3ba6da9ee1e00fd841056fb41c3db219a92db43eea7498cffdfe0b7890f6a2c261f407f1f92a7ee60d1a85d67df5eb3ff7044b6bd873d8f6869060d2a27bbc10998e81815767b9bde04c3f8aae67a1821b934dff00fee82f4c5a4f83c94f1e9848c87bfcb90410e500c64a60acb04a364bd30a9f1e1650288273fa8b6a78cf1459a112421be48d65e3645dba2d1c725bac8a6fd8ae74fae056c96b9c8304d4c93c1193d93f5251ad016ed6294c04b06c4019bb0e07db39b37bc2c561eca114b6c6801afb30b8856f4022e477d2d864dbf204bf9eff7a5cfb0fe42bd78a88e4d4cb357dd176fecb3cbfaece679c131cf2021a0f8a6a5920d8594d0772159363ad32123d3344f9c0a813478668c67e064ab53f8b20c5777eb4d5d1a120fa3d11c2e499d77d658fc7faf8e5ab76b3c30b550095af2084be0b3a3cc25eedda4b4724d8050e33b525bbdb965b4a99529201000761068906ae347b2091249244924812492221d1b9d527481cbc5ae96870c771fc3f07e4fca64139276b31a7c736aeadc518e5ec628c917a8c55e8da49b9c54871b05d2a1989eb689785669d6e4042132335299591656691513367969a1a9b1ba7e254b0b9999165068d2c346afca4744e81e689948c6f529a250a0d953993a5c6a605f72c5466a2dcccc071cf4265264a0b38ee54988952e33d0078162aae3413c5fb00e0545c69268a0d004c4ab3cc5099325900003601aaa4db50923694dc86d20b37dc956e485729499592ab947274a6f314286ad0d47825410d521ebcf7514da35ca49ca8b1c1a19a86a5285585c6c07233c305662d556214d1a86183594b9518452ed8605e8a51e47d2da8a4962a122946510b382a594522c528025554d3b0c4a84269b0a85e98bd70c32588e42092049172749891745cde40f21b48f20652006090b48a27852041b8c6a605181c4b3f4e2bb0da69b194a3936464e45270ab93c98ca450e96456863fda03fb9a01d52816cbed7235f370b11396b788b3077c202561668e00923b71339392514335cd060bc562734329969b9b19346415b93483460d2d355ecb7b1fd534ca45ca891a1b1caa69588a5255680c2c37335c60d6522546118d1a3698b5548951e4820de6a51845ded7824a6aa922916214b580a3925524528c225045350d4b8c2a94068bea85d90b375c82480e2249102947c7470fd24cc7f986df903752dea2334486219c44b7834c416c04b3e98633a843e204b5c15223b708000c31c8a0a5cad26a15830cb28a5c8a4106aab9d4b0b8bca902b5c12283009604806309c70096065083461042269d746661239c4d0f79e3897932a0c446b8bb6b4009a841240df6047ad5d9eb3569121f1d6de1a5a5c946339ed5d4d8dca466d0cca0315397ea4cf6839858d1fc583605d9cbec89d76bd2179190502a8a9358965894a012bc265010952841af0a459dd52762ab5f758ad72b4ad02be855674a80fa45e5a5244829e86516e5f50aa2129404a6040b7a694951825ef3e5030f7169e695e51554673068e2b5d990366c541f0df6dc909a8a474986830d4a453328e88915989282e53a0b2ac1abce941889ad09047482d7eb95e535bbfd32eb009c76d4290d769d95e06524b6eaec04415a12953af31a4485d7a4b2d619245f412f212c963f9c41325631740c32b000260c665054f53c22b6bad76b06dd8b0a2f54ec6301171d28c69e35d801f9d3c57167135deda252b0b1fb25bae20f3108101cd7dd5c9ec2c596b5cb0d36a9b699b8eef482b2303736295bd34432760cb59093584d573ba86135353637a9460204641363064dfff46b068d9969c565990b6f8951b0e10673272efb414c8c975cd5f4e3a4aa9414a399d2a5bafaf3c198f169888b8a609d2c85049aa3d3101b718d4d0b30371d0cb5845a322282a285aefe589ccd051b2caa7a5b416cf5ec88db3d33aa428d9e25b9e13472225851852293a1605e7782c29d3881a590c0d9e8ea110b804e7bcb421c34c3b1d310133100c012dc701a71af2a5ed1091bffbc5e48806c9c18c6b0176e74b20e69d087f852871f472a21aa130f395d5c8271a7114391434fea74835fff52395d3d62753a24379c460d45c7df60566e7f3f115b2d6bd914b76549963fec642858cb1a0a6a0bd45207a5939d0270da31449fc660e8ba2474b2a8eaee49ec9670fb89a0b0dca25f4fe9d906db605b12a7810786ae22d9b093c58f0f763257f5831fbeb7a691512733b2b7e654438d3b8f76649c8656ab550c7d934ac52003cb582b8300bab82569556fb04e266b16946e4d2bd3c801d328c61c37336e64b7c0055504f78a59f8cbddddddb909cb47903ae829ddddddfdcdac46652ce6a06103f6c8cc9c002466e608207de1eeae002577770d28b513cc482cb0d282ed770bc7ca012b2d9a09dd850c5aa5a814a28809b66f7c3263e282383327b325fd44646657c2f2c7f696e9d8a6c7f52fbc802b81c68ddc5e6bb0b9b6c116d81a373746194fd870d5ea5af539c04a9b1bbfc6f466c95c3cf10408eeeededfeeb69bd8e0c3c7c5438b205a7c8162660012330f48ee9d830d6480f902b6bb2523c47a873f48231cb7cbfa17bcf1c3d5ce8d9db77295ab7ac01eb00beb52f0d350aa46b063704e1fae47f7d9be83f92ea9a4140047702510e642f2fc387b2021e78a175d1cb1050fac68d24517b3daa155ac3c33e80113445784187a8115701e0a3b574590128513ffabe0095bc76ae7e792b181604db589115c0cf1a3a465092eac4c10d84bbfb0ddcf5609b1c695ff4d70c2946a908a4c10b82ef1628294c38077dc77c0e204533451c20ab440c225b790d2a40e619b712059feb0959f7af960b34c526600c392496408ec949123478e1c39728c31728c314a8c31c618636cc1932729183cf16405e3031bfeed07fdf9e3627e3fe7e819ceab2c21b0929f06365686cbd40ddddd638c917ea4d122a5ee2e73c318636497b9131943b54c4d0b0ccd0b2d25aa9c09a6e33a39653ef2438d8646bef6309ebe369fd2cc87313f9ffa0dd1d0781107a61ff511c60b83f87fa0c84585a6d73efae2f5f093174a1fcf67c8f5377940fc8bdcedab498295afd1d07cb17e3de453d7b4e7e91fb8088cd6a2e07ef650a70c05eb1ff6dc9e72cad9fdd1ed977255fcd8b97d0a2e0a8046caaa4182adcf5d6ea8fdd643f3d142fa0d7d3f3091cfa46d7a5c79e79cb3870c84452e07b42bc4e389877c1ff61870f2656d1610fbf216060c183060c030996c970bf31c5b09f39cbc9b7b7e6bed2b4f5fc83de705e9d9bc9edba71ab8cbdd38d3fb4cc9499ff91f00b2bd7d209b699ae6d7376d2f63b6376d9f0fd7759fea7e26f5138667dff49d673f5e7e5dfbc937991ee5853d9d8949f7a63f9d764c7965bc906b905556596ba57ffa40912b7f7b1fee431faefc7a907179939f0ff761ddb8f7785cf2372444cdd77c4c4ccd47f33132e4c7f823a93f32433fde974f3d47ff445331bc2334332f5ed8734f5f9fb88fdf79d5eb64bc94abda8bf34d9cece8576f0df9895f7471c5bc1120cd55bfb0be69fbefd38eedeb415f9e14407b68574ab97df5aeaa36e917f2fdbe1681695b834e75cf8d39d7df677ee8c3e5af0719977e185fbad4344dd3b4cf87fefca4b7c0bab30f47c9f1f391f3bdb086b1f2e743bfa1faf3df5bb1bb56c5ef88e31309b702e203a47ebc61911b0efdc084c9f6f5fd994041931b5a29ec1a2276bb081b6797b17043f6d30ef66a903fff034edf47f3af071997fb909f52ed433f3dd5de9fba9ffcf3e1be21214e7f7aed2902620cfca78fa71e54ca558dfa628c218c52180a36ecb92fa7eff42f27fb2f8f3abdf83c7dbf4d790bf5bd7cd655de3ad9106f8c39456eabfbb8795626e5c9d0efa64117589b1be8f3d37ae34c7e7fbdc26dbfd5d40f8bc46e1824ce6ece8ddafb6c1ffa703f9fd8e50ecd3c08bebcbcbcbcbc7c355b121b3f7cd0477eaed270c809f993925fde98eff331fdf69aef905ed8757ffa9679991b70aefd981f52c415239f8b3a13e65f1ef5f1c403c6c33cf7e2c1f05ee67df1402f07c6b35fa4ffe2857fe5c7d905e2b37d78fa988fb77e3cf5c47c317fa4882be63b42f332a7cf677bf92e3dd3775daedc3c9a990f48862be61322e6636257fb5cf08c70171713f9313d3f29973fe68bae8a4cb8fc0c05dbef9f4c4ccccb44fe2331317544e68fc4c87c2998ee8eb8e82dbec1c9b13231861bad4cea46193dab0bc4c7f461fd1efc0ec98f7733e23fa488cb5f7a22f090fbeafb69470f09d8a5bde64686fcd0a508554ca18b2c78d1c5e57fa488cbbf23f4b5eff3317dfded79dce4e10ccda7de0fec3212bbb88064b8e62784bf747f79c4bf212618c4a00745b0a0084b1072c93fe27fe44bcd1f664f24aefc2353ce775505ad1442fb2354fb28937ef9853837320cc3742de594feb8a4e4f647e661c59406e39545bce515ee8dd0d762a41f2ffd6e4a3f7af28b9152d95fc76c05ee62b76dd8d6a4e4a45182ce481977e22d7722bb0ef3201722326a222e9d22c8a8594e4404a7882c4f12c1a64436f424971f368b28220631b84a2871fb6511453811d28920e2b20779ab85a8f6b29984e8c76d69d6cceda744d6a95326a244aee2af4272d2192d92398911512321a29813192da2336a747d52a794cee9f47320130c910d821d5921148c0641b0a36a8966ca9bf2cfaa792e3435396590d4a6fc38b511c13aa29883fd999f5ed12d6a4483620eede56b4049b417922df467894b123da246dee2b8fcd0a30e094d4a429794d02d4968af25400ea344967eb811715b1aec0d0573e6469a4b6960698c5b3b0f72159b2a0c8c980625373843539e3aed983178323579298fa6b3ddda882655c286f68562380cb611a1c086d665cc04ba8a7f237255fbf6d41be2dee419e1e1f5da88bce5302298374e0d8d4b3d4b031bde105dceb9a3cfef3bbff002577e269bbb795546d7b0ec96c3822ea5817558177b410b6e1bc2863d938981016351ab971b7f1bc2f6ac59a74d4e09410f56878b3892fea95f3677238143bf00b4b6aabbae4167cb9e468f704fdd342be660af6b294db21a986493e9173416bbdf2715114c4ecb8c3c64e6b1a75f442070e0a72cd5f23bd371789e1b91923d7fc9510789d4cde3bcc691a75083c68c1b9b1a19a9183433323130602ceae5d471a6ad6a2de09af3d8c603bb048ade98042448893a0c34c302ae88220b2e7ea0e8e20a46520f5802952a30418425495170cd2d4a480112358acfe99d94b19d0492bd658c51566719639c32059c2bb9922bb9922bb992073d5c93ac6af5f52ac11552eb17a38e875a426dd160e55ab57a74059699aaf1cc0c8b51b342d4d2d14c52b342149799293333f551589ac5c30a2bac2d9a6532714159411d352b7ee1d3475dd1acf901e19ff30895d4acfe706890c7dbf1560dd2e9e1a8f5f217f22ce60012bfde391f051475682ac98633a928c4d38e9412b7cb49b56e7ae134bad4041475e85f9351cc2173e99b8e620ea29883bbf4b92528a09823c6a53fbded0a6b028a39682e9589451dfa73c9cecc2ee7c26d9b1e370c629281f4a480c9452fa7c19edd7106c625a9e3cc59ed4429392b1c3b3cde92a76984b5a961c65dbab57ebcd555f57778b8c9a8416ab2d2e02784246b22a7ef88989efbd33763e42afadd77f2617a6e1a79333357d1df5e97becdb6d5b72ffb23bbf42d50cc2ed1adb96491342b3e994228bcb9a17d095ddab3299870434b7469279bc28a1bda2697861676e96f55f378543163853b26a31fcd0a6766973e9d463e9ac54f8edc305af9b961bce2522337bcb9f24d9eff8ec9c86465663663348d407ffa94be9569567fcdcc9371feb2a90da5b3bbbbbbbbbbe9dce98e1fceefe0af3ce0a885ddd98922c6a2b9dc82813d8128356567e9c9138a6e188f9e5861e286110b8b67908ee372c8ba1ce3f2e3e019fc716ece66857d19112fb8bd73d9360b7504a574d219ed90a661c144144aae8c1b9988e275395434bd9a9b9bfbab75f1c753e5edc8eeac1afc70652b0bac7f43363e505dba74e9e29a1e9120e6d31fa23dfd6c1c40bf7efd88689f7526d1c5a79e195db549613fe555e84cd6435926a3b22e8216a17d6e51849883a30e1fc179106b81ade2254950253d92ce1ad830ce90c0bc355fe31d701667741261c3380ba92ca95bc20192796bbe3f2df2e9cd648e40615566259604455674b4b40517293327cd0a2950acc9124437ac4ea20e8e6cd5550beee8a04126258322d355994c8aacb35da5b08a026e294ea170c26651129368cae6ac5953a695b9643305352b9c49b79334ab95c0684c2150c6fa2b1c3abacd34bda3adee9b424b344d5659a3c645562b63ffeb16b5ab5bfce3fce7fc0d382ea7417f305e4eb3d1341e1a9a159f64f173fd7918d22d976181e5fa47776b43b3ecf523f94ae2a758164dae46e56a0747b33a88eb1f431dd7b9bd1841c669d07fa8fedfccf865e2b637719ca9ad209484f37858b1793caa903263bd1a88fb848aa3cb69dd69c7b41526f5f581989efbd0f4dd733798bec8357d365cbcb19bc2ccb7d93e329102d9353d0e36db5743dfeda771244173fb7b7ee8d0ad9feeca96db1fa45b718bd8ebf502c2d5afa359f1491557dc7e9ecd345b767eba893afc3a9ee3bea1eeb4c3d4a6eeabaed2fa8780ded5fd6cd377385ad5dfa637d595cce54d085c5c8a5330c01890c2edcf406cc925dc307a0182a88a3a7d25e946266e7c7245e8f2d0840db9a888a5348b8706fb4ad0959c844ca33f281061f077edeb8182e9fac73d5167053664a0da44c65353bfe2d8084d665bac80d32acee9816790da5386e1f1d66a47c6e37d0c033ff55a498c3aa142cda249749325dafbe7e02dfafe3e78cb6e79afbd9b5aada5da03456bdd418e0ad125cd92ef94284a2a7bb901a7dd50be40b1f5b6606eb4a1fa6fb1056e3da28e83de3a00abe8171a408a6ba313e1aa4b1237b471e99ae051dd174686d7a71dcda72a36766f31830f9c209262064d381105774162e40a23a86e7c724590143ba8f59389514a29d9dd9d39c6984ad55aa710cccc412ebff32767bbcfa0f4328a04322333db7dab1440e239a9698b338a192790ebb3dd617ab5e22ab93969cc2195ac48a0c40d7f077613ea2ca440e286bf849d373e9122e886d6b1b07de313295a70c1a11bbe1426b8f58914405cf74fada2508ae20a13b89414950a194968205246bda45ef92272298210164b9a0c01450b177ff11264e3478d8b93111c141abcae10bfd146752abad955412d9dce4e7077777e776e777777e73e727777776e2a70dcdd9ddf9de71429777777e7ae42c6ddd99bddddddb9fbddb98968c439210841d1c8273f153356678c5a1a858c94b1128f4cf1888a09e32420fd4c1815d557dd9d4a0971217e059ca0958e4a7785c62653f1a31d7181fdc8344b888c3279650746124a58c10e0ece9294322062890a21937bfcebf51232a358cdd880ca0d563aa40e2bbc45c28e20046fa16233a2274fe14e5e845907eebfa686098fcfa7af36e856a01edd1ef5268f72dc695e18c6bc946f250d510fe3397f9897f1097db8a8a7afa15ea37ea95fadaf3633f3cdf9f2659edae7f197973bbc0b8cf791b4bef6305ec60b63be20fe30e47f00084761d02f3e8614f131a4082ba1566b53a97f10ac111492f47afdc49640a2e4052444d4645604f47abd5e1f035fa723581f8634abbf200d7a4bfb7248d261e523ca56332c702758906a6d6a158f24117ff9d538bfe8fae6e696e294d24967d5fe06b6f1bfb1735285306b9c33bc300cfca1e9c6f8cd21eb2f3c83fdd91f1ba435c4209de965f99bfb0a5cc48995db0b6d8d3a3c9586c8ca7c34abe3f6d12c0f7cd5566b1423339b5060c3da813939150736bcd9b6f04d1cc75c57db64922693b7894d91e685ff8f781c1111c1c6d8831ba26637a264377e354c5894ec46a1c3ca2d121694c46a07273a605980a63df1628a4c0af7394798d0ddee1b7051001cca43fecbe07d1cf9c48b2c6e6857b4e7a494524dd368fc3c20effc640fa1c6679ec09413acab9d2f8c73ce8fbf7e321442e9953e84c7f9cbf48b1ef89aa669524a7f49a7d49ab8fcb1b3904bf0ffcb1fcff97d83208ec77f0f6cf0793a7668b9284a21cbbfc2b1b39a810d573b2b1c1d6347284020c902375960e3c718c8ff9745b07427ecc6af40b0139673df5bece20739f69206eca07350f472c5fe7ab4df5ebe5eaea8c3ebf5135b02899217901051131e643e1409e1ca43964ac18631698720cdea4f020d7aab7e36f868909f861adc70f5334904c6418302e4bb6b4f8f04dcdddddddddddddddddd1bf4df61bb1dff86b4f7d7d1acfe721cc7ca085d816b88d5a86a1cfac4a35e1f1fae7ff45ec974403142851ae06810890472e81f5650fbe80a58f9e14ef7ce0e7f39600a4746e80a1cfdfee872293d46da1f0d1c81c8229780456ce2e0971e51fa4307989220b3c86507667e3a7320f261a53982fe5c8465f4971ed29e67b59239e77c91035e41ff48aab456ad6af487b77890ddb65d915ab8f811c7eb38253333333333f34f1979887ef12b4c073b4009e205a828704f3a67cfa6be8365bfdc1c9a154ac0e3cbc9979ef21bd25c3b71551c217bd8ae41a6d2a4566b53a97f10e4f87ab942f00e21e4faf8abd8a33dff34c8408cc409144e4214a3535623d9d99ab29f025a315075c2863cbb3cd39e9fa70cf97670956f11a2033ff1e28b1b6553c4568d7523001078d201b4e3aa1fa26e015aba4bafb3ae92dfd0f69c9ffc296defee5a6bbf0c692b0d6c8fc755f2d9c3b101c8e2e0cc1868a9548ae2a0dfeac8f4f5e9a65e466c5120aafa3b95baf141ffc70bd00d5f80aee7d0b36a198f8ee477145361eada5aad4da5fe79899df3060de9cea7f4fb1175a6607d5eae7ae18a7a61cfa59ef6d50eb2baf3b35e8588f473ef1e11263efab98f887f7415c73903712f4a2c37699d0ca39e8de0dc9ea7679d73d65a67736ec4fefcd4d7fec7d4c3c91c5c25dfe4fdd83c1e6a927c930cec7fa906a5abbd6713b5ca671e842c19c23e30075dd6e8fce144079642fa00f6062de9caaf63fe86eaf34b80bf7ef62f5bede37982fdab4387ecbd50e286f1a855bf94abba8231c7e9f6e74c1a6cf8781aecd996c5d6df9eb5fe9a9a24d8f9e14a6bf074c12796f6dc15fb873d37c8eaca546a26d1de0eaa850d772ef798b77fdefe3afe5594bdab7ad1b579d1c5aecdab9e6b37ef4f488f2e8ebb172520882d99a8e2ffe11359f3e5cba7406c6d2f6fbcb8326498679f3b056129f023e688577e0e31878c2bdfe4c598929bf7ae92fd32b43d4f6fdf9022ae94abe4ca5552ca77cf065749793a6243ce41460232fe38d28bb8d85fdf01fcda47647b261253ef2aff4efd0fff1dfaf97df0378449fc7cf0d76fc8f65c7f087f7f36b188ab6e4a567e36f185f8a87f795a3e91fefa4498d0cf87f6fc44aa4dfc6ce6b780fefa3efaebe7835f7b22dab7da926cff4ab6a4828bdef296ce64074fa0a8c3ae22fc833707c1459c501392f1708c8d78bcc54e3cd6ddb1c811b6bdc9412cc446b0502361438e15358b47d61375fc5968013c4fc8e0fae73c4d6cc8315ad4cd62b1548cc562312636e49896a45b8c4403e2244aae03512edd12d22ae7f2e3ddcc6fe8110e4dca59c2b14513ea8cc08d4383919b3673ea10a3078931ee1063fcd9cc443ee20ef9d13044bf95abe249c747b0599fd3acbf310823956354e0b48f3861cdacb32930c6c87cb99eddd18a580c5db2022665563c7911b202a9e3b4723493fa5443cdf529c08d5107b5341f85a56777742106852d1de7cccccc8c2708988eaaab60b8f1432d35c8c363b4af577b451d7e1496195838f102e8cee72357d1675795da0902a6a3a25beb4f8e23bf50bdf08597ac21ab21f39957d4d1c299d7d5d8f412069cf5a8f46c5a4952ead48c040040001316000018100a864342a15816c6a11cfc14000d708e4468583815c6023992e4300aa2208a210619030c018618834c110d9500a4f521d19d574a986d0054dbacdfca10dad604ffb644cecb907f04c87a0df533898974be16030523efe95f439eb1a000413829fc4ac4036c9b86151cc8d60edc4e5a9b9d8ded5b73f147237e7583d3082a608434b2a5cf49fa315f69cd16304c5c6d74bdce2a799c9ec68c913667d91e3ab21d097c3b85976d5fd5865de98f42249ff4046cc36339ad90fdc18ce59dd16230e59fd91444f501c347307bf3dc410d34c001d537d828cef9c402373c0c0dca981285fbee996b5f52e6a9e1a12980c52e2a4266c143efffd278a89dd096a1e1541af47d88cfc47a1f30e378d9ee99bf69c4cfef4ead4299d1237e62886e1b6d99acad2b80cf614614855c98441bae482462485ba51cc161d5442be1efa015908894e4982358c689fe26488cda1ca72e0473c41b7cb04cdad332cce53c7030e432c54419dacf7d64ae22e3a68dca98a5f264c73ccf9ac6fa5452321751b5915963924d2914901e85189cdba91878d8006dc7a89267cace6f84aa183ef9f3fa982b149e13cfcd2e60c6078584ad9c938e6d8ea95126af7c521ea89f58d238e36af1bc05af37c90d32a4cf35080dd381eb9aabb5c7de02f0bda03474389e30b6c020cc3c2ce3ca259667c29425969543dd62c887a7fb8d87dd4f44f60a8dfc740e919c1102a8e753240e48d647f55be15072e9edce82126fb04d778b0857079faad92ed9ac27b68742efaaaa0d3d0244c469efb2160409106f51136a3e7a783cb7918c6485a2781be6b1bed8e4ae020c0f213d554728a7b050a12d5f241b160c657c8a98963012a0f8328c4c5d7fffd53a1dd0b22251bf90bc6f30277b162ecc3b2684edbb952dba5b0d72aeef4ee956a2ddb089910e3f6b660dc3bb9ca2263fc50479f5a2dd91be20e25fc779ae25100f22c05df75f387c22de7617a157269fd386e2c9b2608bb7092c0c5efa79a38369e833c48ad72d0e650f06267483dff590c2d37193a84694a2396f99ce3e3a9f5bf1558a8c3616784ce298e507c9e441636d5d2a19941bbae497601a382fabf82074ca0c190261c963775ac54f07242ea27f2b442d6006417415035625025dc8a4f10e940138ae1dbda3e9bb51c325e6066bd1133902d48f84aac634e4ba8f1f582b3bd8f495c76dfbf3df95aff9c1c7397f7d68b9def28bfd5a90afc986bc0844a50de2433ec3bf0d36da2e5525ebd43bf7381acf1ecfd6561625efc0460ee846ada578c3192e3d22ca0715ea9e8e4091211349a8b69a203ee72e45136c2ab813657326dcf44c24934905c235c41270a603aca9c25a735852907c13296f479f1a9f84a34c33b697a6bf253b71f7c39ea8c3a8ad95499dd9cb97d9c183e51fc80d89b70fb358eaddd9366c55a6f03e0f3bb2a4f0f8e0c49e8c51e59661cd24aaa92421b3ff36873640e5180ff5c78c10599036a6060ff9fd1691c0aac8f9c6036e2416e22f0e86529300c435c0fb9a9336278d833b94d0cf032c2de1fb597278d52e0d838edb0d701e38066c8775cc44f91c2e1357369dbaf648ae117567565040fd22a5585b48a2a717b6dc4531ab654b11b27d1d76d0e28f96f6c28ecbcd850bed31cda584673b45840ae8a3e9575b9aab45d3eca960380dd857349ca7ef75400dfadf742477222d39e67a97bc631600eb1efc26821fe519d5fbdf3137e419213d45d573bf5bb51709605627d38b32df13ac01d2aa91d4b6c83285e25892d277fa058b3415fb1fabea47183c70773f68b9e1f4dce1b42d5a6db264dc03e4b61327d71a95df354f2742eec6cd48fa04aa2b94c4a92c18aa88ca81956a103f4e71430dae5d049d407e4704b4e72973d1a2f3c7d892ed46e8bea35dee3983e2da8ce5d15c2bdc50bc108d3b3a5e5c328343f42fbcb0918962cf9d5de702accb6f1756ab30ccc29bc800825a75469ff14a163815aa4e999f5f9eeddc6dd7b6b05b8265e0e4e662f76c63eddc26f66a7e0295ee14bd90b04357210078212c4ad21a69b7891b5ac25a0905077112607a91471fc5cc3506b6feb7e6c9bcf202804d5b99c8d30f27e1934de7f3ad9922cc91cd4b59614c53f1232ea23308816b8a2d2dd38f177a1a675d43131d70d86df04b14cec2abc2e673f683402e7a56a21deda09257813458cb35169798355ac5365e9ac03a8c7e167730da80b646b728cba9d2bc57a1b1b18146a28eac5a1ffcbca3a06dd26f429b7b4f841ae056269ce8264b476d30a5ff6a48349747b990a1a5178588d8195031240ded2e89e22915c67f49fdf0a95161f3819c92cae2bd0b59c4a246c715439cb9e9080b4f3cc354356977ac8abaa79e0ae99ebc0bc038d91cc8e4c2bd1556527a8b1367fa6d9e7759a9c92cb8827d54caf427092aa267c5664a12f8958400ca72852ec5a876f37b32855f27340fbd593bc984555ae9cddc9d75363b37f4592eef9728079ad8452f73b048ccc1acfcbeae59984b0a27636c2ed4568cf30e3401df40e232e1c59d859029e67cbdf3d73d03c59cb1c1a8f4e8a1084d815a899e57b621047490abc2dc989d14e34154f6c94f84b5e63dd1e314045ff94928985b04c6164a0179800923d4a8a2db3368d80d3f41ba49fa102c473752950f4cfb5279588e17c0c4ff5e813f976496bd9ff5eb5cf81c7179fb7e3a9f8ff98acecc888817d0abb28514c2f741271b275e1d307e6f47068371121b189b8334f06d52dde010e08ea37c67a7429b27559e836c1c6bd2731f302870f50b52c8368b4c4b3917fc69c4a72decb32b670582e6e73fb75efd0175953fbb0c4d9ee6ee50d862e3aab7ba8f5a92bfa2a44fe5ab5ea9d8e1b477e54a8b9771ff740e1458d581da6b8a09d731a24f100074a58ba91e7d2c38eb9695bab70ca7340c4687124d5bae8e4a82e8eb6a0423bedb4890be1da210755f0094b000cc85dd4e7e1ae0aa336cb4839ff95f176f4c67549641f481f8d8a40701d524d3da168ec2cf429d8514d33662932b8c59b7811ca4d9073724a6b5af68d77b78996d8e5a5018dfc1b9fa35f726b8ed62e361384bef83f8a3255b7ebfa2b10e13b9718432f00380129646b0a94beac416fb979de0c65eb4776befc3b57c533f9611ed26014fa8c7bc1708c3b71f41b8c3e2c2d3e687c2b25ccffb8b50f3a54efbb0334091764cff6f881dabf8c4415a00ccd76e37ae878cc75b66f55f27da5f1bd04561ed8d02e16104f3a723803e43a27a76b8580b6782f92da96b051682a16eb0c9884639963682fea262bf77ddfda64e6e4c87c5e9269e9c504f25e0975e4ac86b44f35f0cf6157182a079be104a1db6a2a3b8816099970439578fa5824fbf9646829264221bac1cd40c4493628a1b0f2dc863c7456f0534b1ca54675e83b16660035fadf8f9507e4b14575bb1e345b857a70f13addfa253ac1b4d47117969ba4052b245a4d9d1535b344766dac1d33b6c432b49ed26db88834e6865ce62e2c29610daebe45c9466c9158851a271033760255c7ffa9c6c2258feb40c7bdd243611fde03a78eb73d1a24f03d1bb8eb44503398f7dfbf741e9e5192268e76ca1071da5cb9052d3c372d2a75cac02bfbbc23d342db082cdc3b927157e7b1e2fe05210a0a66b92fa235f9af3bbdd554446bd379a2179650421398536cd0cc8de5d9bc2c2b63ada485e9a64802f1f35a7112686b46267a7a616eb1e1354add93f5cd4e311033da665c43d452471e9d70e975c16be330529f7c0c60e99176ce2d3f55ac3138932a0971fe84b8eb82348a40ca40a62d25b560234da595d66dbaad08e05eb23d3d9dbc8d03d8833c12a55ef8c29ecb6f85ef7c7f83be49ff5d922658790c05bd12ff8c62adfabbb281833d8e5f0b0fd5c0fcb7b3b26c8a09768fafb20200b1a0df1159c9740746762484873fd0554019b9185e42a237bdd27d6a3e44343ffb79a03026ccf04b38d631c4590b686824fbb321f1c6c92446c5a52aacd597b19d8d42155a7aaba08383eba01fd7eb3431fd1759f65f1e8fdd96bc96d02fd61d9d1c8c6a094c5ea9f527228712673b65c0585c590c7049534bba132c1cab91754f86b5ad0b5ac0cbe73b2922828ad279762418a94029897fb68ed05b202b968097a954a9cb06291625849de81b7f9a070d81ec31174c697f41dd878538c0c8267340a6457bca39e0a8e48ff2bcdba2f8f209499c3b5e82bbcd3ccd5d2b02ef27f8228eac0eab3386a12ffb0b80a276b9201a061e78874d941d1c8d62ff1a02a2df616a861f59da12b4c58af0480c2cb35b8cf7c1a2e53a6788a758bd4213092301941d9308f5f623cfc6033cb3b17a8bb6f7460f762d23f72c5c5f7bcba7a35101ba106024dd64aebc91e2c32c512bd2f0aaeb67d9546e31e93477c429ae44d48c9a44e90f59c7f25ad8cf0ad2eda71104f1e0276f7c1b4cbdb5c84ae6fdd4e734958b45632dbb388581ad2df35472b3ae0eb3ea89d50fb7e77e117370980fc3990902b49cc6e814eae9f47262d23ea920f95a66f38f59b69744db3b4682ef6ba1630fe03dcfc9121f053cbdebe74d6ac428d786549c5c8e4ea6732b9a977fa959a336d480bbe956c637112790bb0c3e3aac3f0ab97862c7c51c04e5f80a5e61fa78c8cdf68985fade4dc28acb879caf84e75c3db19decc5a1cf9e799cbe4f33862381d40253d68e7fb6230eddd4df6feb49ffb9633c5c1281967d65305d78e8b7547eb41f05d9f36a635ed2b1dd69d98d70b10e8196cc62e276bbf5203c742a38c15161670bd65482f45990d915db5bc9d02473283487fce236c07efa931035e5f079b3938b06386982d708f2b85a0d94f8255323c12f76c1a53ca85589833043fb77e00c87648ef5f15a8e0193d4ab9b1425bfc3fecbd591648542107623f3aaf7706797ca203d1f2ce020066bed84672f3d9a65825f20062759709909edba28b911b28c5f7b12987ac0e77718d4dd059fa75daedb8fedec68359799be4237524238569fdaca697d11250a8e07752770b16deef88bff35a5c1d346df3917c696485fa2085f4391395aa18f251957a3881114f5dd960d45cf11959074dc2ba96ab3ae0acac12488b7d36c110ced67a9cbb6391c4d218ffa5b62c400032a37138818dfd4236b6bafdfafde4a3e867a66ba673015163037a1bfd3140c05e7a508017d34f916b81e100d320402161f71f02e1b9639560d26dbbb9395a6d64e0c076f051c22f20ab98e5011bb65a6fb08ca7e1c4d6e9749e831f35bb43c486a78eb9050046998747498e32710f432eb0bb2c338a2082334000dca9a548cd86c4b5260b3f665363fd6487d097234b02ac0796728f35f3d21216f9deb62ae2b5b46cceaa2f88d04ea55cbc09d0fe93b7f3d488eee501bff791e9977ecc17b3ce9eb037c9b2c30b272623b4624886b77b0db334cd39d2a3d01f3c06380813fbe916ec9bb91647a6293e902c94254f01d439ad3b50ebdbdc1b025ecff3583d963b9cc54b5a2747e73e37df3fbc2121b75cbb022bce7bfc6976bfeb5a2f77d8604e76100e1e02b4debf052f13e2e775c2f213c1a4a9189a53ce71c3f823e87bf602db727201439e421df2c18ee98875a4632810dadaaaae8dd1a26d0c2178e84c98017d6d0b1c3a583a98a8cf9ed275cdc345371235fade8bd641072dbb019e022406241416f1baaef18b5c8e8ac4118a1ce928e861fc9a605a203e3235981a4bb41195d880272ef5a45b6d13cf05de5a26cb714c274d647648248a604b9fad521b376f8e10a78b47dabde3e3d94d886e193f42579de4324f4083f810e32dc37f0fe2deb0cb0ae103192e02e0e421b886396cd3b187867d57c4f1b34983ece8029a5012226df3422a3796dc8898ff442cfd6eb6e0a4433fe534b986c3bef8489e1f5eee49c128b275b09fd9c540ad1ce6af58a700e681a2a0d6f3d493d994d23fca234cbee14cbd5465f2dac15194da084e17e880f4f4ca084fc5d3730db733649ec6968df0b32e203dcad5a310fe33b5d2bd9dbee02350f9457c8d9ba6e5bf03246ae193c691c74a3bb6bfbf3ab759c7fe762c6a9c9484e70fb8f769f19ccf7d22c48cabb379b03a3558e8ac1dc560e6007435e0e18ec7c830c233906a592118b718172acc82bfcfb8617cbad21ba717701653b03a73f84898afb12e4f5ba8e1b7e85edf0029fab1726e21a734bbe9d34f9c86b7f40fb6375b08c63f8be6891e94574d88c5cb0cb02087908dfbcd0858cf1b8ccb013ae92cdbf979a55cbc014bfd2e59d63a4a2129fd45e6de78f987cb2510fb9ee69a32b0323dc7c361a3e9714ffda74f1e47ccc71db018ce1a40e3c9878e32da8159ee7576a2cc34e3823d70ec8421ba7585636887c966049a7a0964e8951f4dd540e692e8723c7498e376838c86c17f63e47f4bdf6961cc36cb0b232a22c8d3ba0a148a374b7e5987c38522437a73c58214a3d842c749c3e8d5bdf7fdf9ac8349114cd4177ce058a9857b356e361a9a91d1b256adf59da3bfa1168ef4ea2b0267cffcbcb4dd3f122218211812ba546f2a7b69bb9d163861884fb799258e3d6259b04795c73a33e6b780849ff0722beea81cc2b25ca3e8da558a1033b19bd65483fd8c0acb7fb2d38527258f09167b8dae9e841fa1f0ebd0d0e2338b9a31ca74a01f2791a8e61508f3b24d7e5d192e7ecc4253d41a3a994a0344efbab53aea3fbfeb2473985d86d5664b01d52116c9b6a36d4caf796974deb65e321e1b8e4527737858ddd277af69ac5222e9c51b4a03add055b012822bcf866232b71196329b3b69370ed9b043199b7f2742967a3541389ce50a177b274169fcc98d746370e031da9557fa7ac6e122d4d7ff04b95a92988ab820e270d99ac89256766dadc3b7000fb7d5a47f43ba8a2a34c44bb9916bd914c80e8856407c4a73c07356d0afa732b150f6c52dfad00c70751fb5951fd69a4cd53711c5727e64e7f6b8feefd504b56a5495f489dd5ee61aecc48a39da72bc26732cecd794079344e9f4bc7f79f95a51dbaee144f03d90786dbc905328059d0df092fa0ef2d4dcec57397aa3bc491406ea42962c81cb01b8780b29b0d2bacc0002b0bd5aad0c0333caf2230e0dc7c75bed38e46f46446606dd0f76ada5388415dc99b9e55db565b01d40585ffcb979e26a91012dcbb2d8438663d7d3e056923b41293e20e658bcab87a316c466852b263fabcb46376b715a47c6357596481e6ad89d748007c257a24437a8574561ba5b8b59b1ff75bdc2430f8660254dbf2b290a7706859dc2d18599b1023139bf067f45609db464eb98670ad4233c1fb3572c38f14b3e47415b3d3bcf22a6f4a48ae4ce6334b71eeb27f65bccfd23d15ddae75af5619a79963bda545fe5632dc4fd412eaab9a8375ddc1f393af65e74aa7bab0345e003ba69c304c62e578d7f3561c360a3a95950b07df4eddb5da817bf1db1eacf2e288d1fdebec2f4d9f3c05a4fa72b690f02cf57293a60d0fe3972c586ff96c018ab585aecf14e9419599a8f4c589f7bee747629863639f4578c070e7277e00b6e4e0dbda6bafa8cb5cc0d942ebbdaf9484d76cd53932ebe7bcbdd17b5b2f116a134fa9a2b9ff3817f0c6462e5512a987bc0ecca46a915bb1184af2b9852acc9567971862fa6d2344a49a8854c65cfb70f8907aa58353638f7d249720e999cc0239cb729d0c0e52c8a9cdbc5b3489ac690441d5f82dbfc15f43585a57a464cf074a059192b11dcb13ee6082eeb6f8e52ac7ced71916f016fa50f28a2dd594e0cb681c0d70ab54f2e4cb387d26ac3d5c99062febdb17c9c7e6a94603d7af49f9c8ed3e118ecb03af68590c0004e1e461ca09ea2ffc4411a2f9bc56c60b00afa4f1adb9bba35b84032f3596f5639a3468709041835ca03702ed5e7f64f9ca6c22cb34c28f23340616c6964693a8b84da451838c12a3175805800ceb679389c1fe718acbc7c562b848eab0bca3e5d05eaf6dcf047f4248ccc9a13f70c13f70249002ea3b5736945bf105f64752172af0d70cb58a67fc848c4ca7cce4de321d1d4d4f228d8fca476d44b4d4ac265a86f8c53791c03e5f34c6a8d23a6c31b88493cdb654dbdcee6601baf36538e661597ad921c611a01f5d6edfe8539cac277e4086d21338acc2b096045cd1dafb437ad6e01d14c4b6f0875253d5afe78fdc94b62bf4af35c99080c25641a48a93c63f0e30b96ee4078eed5b2eb7627b2a38129a9288d4318bfd55700269ebea10d19c272a2377c6aa25271d8abe5159a1abe4bd6c4718c30626706a917271af345c478aae64c4c98c518f14e6e212cd94f9d4db96d462e40ceaf5a7c1a8fc4a9d542c07d62407988e2eff4ea986e78857b22cd41cfca7ea50980ba063ffe916ffe324b6662040bb59b0614710419c070815563a11931688c8763b0714b41fea3dadbe2d88979fb43209803b70937fce72af0333380cb831a66b713c5f26cbf7ac6c7a76237af32bed3e3d9172737bfa13894f24c13e3f0b9e95b26509fe0fbd36dd4a303b2d24b100c12c4860e40cc24d09e0901a6e915a66d3cdd464bbb4a689b8805cd70a33cfc222945f4a659a19ac58553bb8ae9449800195fcff87881a367ba16288384dcdb2228cc2872ffed253522f6acec2118071ae01e10edaf5581eb34c9fbc65973dfc4529842c11eb97dc4ef121bd78b0f0894d5e39bae0780812c02fabc4e864c5c07f051cce74862423555f56ad3e1d8f4489860630aa2a63a89f238ec4528ef97cf12142877e593c453a768a99ba0c69c9413d356dc24e13051c70103134c30ecb877f81bfb963094c54de9026047915f7a9787a02dc7e62a83b20d002c2350214790856464b16c28a88eeca7d0c25083e5e7896c28e820b0c09f32733edeb7dfda9337c83c7ccacd91568015b400203818bc9185d73b46b3f786431e3826ead34e45c83ca0a1ff57e5c9701f60e47c574b0f0b235114a8cde9d449d93caf20af972c904f3edb0254ddd484d082ef9f9bdc545aa45c651825689c7dd2e87834cd755cbd664bfc1a48d76ecbd3c041a004cd19202b0dbb2bde13504d1c3d5f89cddb5e0770c51d9ce0e81ff48e943d324f33a2a60916e348b4ed3b14507313d45c74613175fc78aec7eb67b869b9612ab713393afbe2022bf9f1988dbbb952230b7aa08539642a9968462310925d911ac9a7282b13690c264e0a953be040b0eec310d93d45b1733836b689830df54e9d3687e1cd903d66897750efad33853c691f0e1d2e226c49c999051d4c47cd2e7245494e03f0e6e883f689f070d126dab198d40bccd8bfc1888c92e5ca024db083e7c2524d7904f8657db3ea2019c4dc08c8a1b94359427dd867caa5cc33e1d650fe62359cc8c19dd1002c522e0f452db4a0592b1fa57670cb88b1ecd6c4924e4fb349b093d1fdc0d25616363094a4b2b38eb87bb4289db9ac24686f71e8dc76519888a6648a69cc548479dac66b2e9c565a51d3e78259fcb0c0204c1738012b30122f4f38f59948a8340a538b4b436dc7435e868f3b3338d3f52d87fe39064738e0a29520da84d181ec5f2876d251b57c3e69373425aea784f1e6c9d8eeff3678048b2b9f138dcdca23ae7de550d83242f58b9aeb5fc43c8d7417d9bb58462d2ca832103e1e5fca51d3e908802773e6460db9b84d15f126caa06a1246920fbc326731efe0d828c07d54832592a1daa5ce1d3d84f8ee010dd131141a6aefba87374d79a7870d2e7579daf93910e1479c58c26bb0e226ba3a17994209c2023230a1e791ecb29fe64b5c616c71102e819a9510cd7789cc14708352b3157eb307dea7d72ad86354991e8f825340f9c9ac051a20b80cad231bfb6801feb3b846b7ca08e0208a69b4f041dd985e511447d56d617a26893fea74040872ef7d19405b01f357b752fe56c37c11a820886f2f2131db939894035084c710f7a82665752f867d39bebf50e57f63eecfef00101a025a7bab5e64026b5d6a4f0c81240197074ecc126597752ddc7987efe0a19b07840612a109f8c36c02d1a9368f098cddf0dd0e35208636606fe360ded006c41c1c364f6ecd85f5d85be361c51a297c64d4cccef84833e8c8f0222916f0643e2206cd02d20140c4b3b50899caf9581d73b900977bd66879a31c711bd2c6ce6e3c3abf541bf6a701ad6dfd00b23a6374e57b5f9e9f2cb16a1002b69827842ecb502909e1cb10fdb44e6c7d29f9e97b3ff319318e78a87980c4528c5d2a0852906f8357a8fdc378394d13832dce7167be032043791cfb86c446edc2f9382dc08ca68f59c5d304da6ddafca8bc2cae5d4b10fea13c640877a9f8a06b98543432c416b0f3888fc84e172e52f0db6c5404810016d341576809700021aff4944857ca947160dd986bb7f6972a2a12dc1b7055a8049e1671cf23a68107dbe9b70043d25b3dfef00e4a24f7fa736b33c86550d87269094948c32a78f12c32655feaff8508a0e0035712d348a838bd9fa42949c5b78c7ed5d19e78178df9a2a473c3a1fa9eb8344354321751393a1328c6f4a7c5763a4cf24aadf305009ba2d833f9ce21ae5cad2469afdf8679ae2b93e0ab01db1164048903db5b424bd69ce0ffef175d93e32c70fe132d74cafc31687d72ccc74c31d5f7373a3c1bb68ef340c540b092539d99fbf98d1b607199e8f71006f6e628293d39c9d9dd11dabb63e160bb6696ab83225aa587c05268aa9a4c3ee8d3cca0dde02bb8417c99c5af078b9829d0e9877c3b79de44698f9de689f204942a877d14c12f5b017be7ca96a1e1e654bcbd4e7dfbf817967b370a17906f73085302c4b3380093a052a75f5d3ed93d91509189e56239cf3b674071b276a2f6ea4c25c8fb1116e5b190e0251d998071a5c50efb464af3fea3b40f0d58790dd1a7ffa2b6692f75991629e2a40b8f0419073c97b7e1af38974e7f13685df5675b21a91b87ccc236fd91a23556430f1f197864af5a3ef04d90fd5a0dc1a3243073b0c310c8d9d53e883dcdfcc0b4d8afdbb6b10b314a76422bfa7d6013ddfba9d3cb3f3e5016d822abec6b33bd7bb0072ae85fcd575b1a5f203a04f30af0cdd495af0937dfc0eb8f9340a8bd41e61691bb733eec2d1e1b034bc666496cf2f3cc24023bdfd713f4bb36fde33767b93705ad94f52e76fde731d18495ec2b04f8cbd0f5ffea3e52f78dbd4c3befcbf1ffd6bf5b0e703b7a2cdf330d2cd9f08460431bcfc3a0bcd790f9c825882c64dafc1cb7ecf4a2f9ab90d46c24a1eee48e72be7da9e7d47e0f81e1fe493057dee7fc51d8e608b28bc3babaa3e735659ad3827257488d4fd6a977904b3fa1e5413ccc58b5429e2ed784985f5152ea45c0bdc398fd69b399ad65a95ffeb3cbbaab66a4e1204701e103fa5675f21f17958d9d772bfa2a38723ec3d01e865d12561800072e8cada6e8f0adc1ad348827af90ef445c58cb9408e85a0850775f793ed625495c70a0d745031267e0b4eb9723be7b173eda2ff51eaeffa8f58ab958adeb3336dcb0b988492559a7f79d79c3985308463beb672d25fc37d58659029816a4b5eab279c7eadeba3c9a091ed39efb2b0cd26982384aced52107af84bab6045985004b9ff85ac664d3e1413e39f778c3fe5d5c53b43c350ecbcab36ecc9dbf9ce7c2f03ccd0b84c38af91d22dc2cd70761738126d6644bcd10e132f92011f6d636e5764c7544736ec7a9d5b72d53b52f9f24ebd21765a2bb4b1745a5c11bf786bee120c4ac68f085bee68453b9c45fd184e9ebe6d8d37fbd466c05bad3b552c5e7c00532dc5ab7fa0fb577059a58bf41d1dc44cfce6ab9ed6cd00b0c98f639d194ad68b384c3cc19b108ea6a45c56b7941a7c2d919b60551bfde6b2d873645d75aa8ba058bef1a61b0b340aff5021e7b16b378d0203af52a99045eb1a69a76e99a78862cedd3a37e9a40bb01f223b46ed987062a3a514b9b6ef29b94dce86d985977da4ca779dfb2d109b41b88da635ad84b88b870f8b9625a99b5a99549bdc7473a548f384cbc1e65ef204d3bef58059c4bba7176de9139d8e092d4dcf27c0105f811bf8d1794c3aef31660d70f43a95e44cf62b13412e5728eb89453148032c90561c3ece7ee907f4c4fcf2d552aef238c5da713d47e0c371ca8221d98b1cb05deeda50dbf57d578fa680e48d30585d32aa9f2c08b10e2ba98b1e8279597a5e4ec67a4e24b7adf9f6e68591799da8e3862d294f61622b8ccf0905e67bf8d8ad1acb92dd75ffdefae9bb82a1d37adaad050dca7981447f3062917a1eba9d0360a6917820a54bc9c317749b82e927ee66ce3162c0ba1a5e3926501426eb80d0fa6fd49867dd42f7126526b86b0f4719b13aec83a9e7674238be899c5195a16bf70e8567ad764f93c1dc64031be4a827c5aca97b5134a66fa91afa1bf733610feeca9ba6bcc5fcae45f849651ce90a4e70a65704c13141d618eb26bf23ad5b463821104817d92218876f4ccac06c4ac50c736d1be08e48e4210bd2c171f2a99862a023f177a4d732eb8872288b99b23af94be90d8ce61eae56609f51bd972b0ff3002d6a021a6622a2e1ef42c1360738cb91fdb9820f228dc0a6223f94da3b89dc50ab6046012647d26daa7d88913dccbdcfddb6c8904f065dbe89af4d484b93dfbf9c383acdc856074993b815edb29c6045cf81282291d3e78af92818c76aa0a9597ed5beb72501bc0c57af34f89bff3a48fe8e0c02453a389d590a0c4c70c6226919a130c9011359d86002b7e9854a82227cbe8395bc35156097ec8b8b2d019d74c38290258331449c00399f63a29c0bb4f4b7194f9296004a5558afe14988097ac7a8e8364f1fde80355b6029abf3d0e72d9e8510ccf961a058d0c36238e03708ba408816f802dc30ed08660b390f7fcc72d622f2b0c3e9053ed5b55b2f3a5e2d0999e659c329b3db81f24a1ef5a1b629a5d098002bee5b1fc142cd7abb516ca9418cedebbd7e670a2d3941da27afc29912bdf42964581263bb9a6e92ed1d525f4c5630c6e407760c0504e521ec50d1c7ab6311e931a0dbf50b6480a3fc0e973e019f75f37d283b9298a63d7814853724572136d760e941e0f69f84c76e287e9a99b2a05a29e85b6e05598691c84b2d62b29bffcd57b729eaf8fad8544154d110170469b115a31119098b497e5f068ce86ec99b6d0899b607c4142dd010e441e7081330ff978b0e06fb3ea99f7d882b5d4454dd037ce04c7a1f74718745325364bb7877f91355cd2211dba0996361a2b13c732fef5d3c57b22614f2547c533b9c94d1a7db80b78ec1290cc885bc4aa32f91c2984636600a932c75e267a492a0ba5cf18d4c91a4c1adfd998a2a11a89931097b03d1679bc88d30a7a4d7a1397b9ddd04260ddbe0eeeb980e588b9062f332f3296bea235d89237e69152a7ae4ef8ecd3b10d1d365d01f0fa92db3919b5878eda41fc118efd5032b9555c81d21cfc823af40b58b49cbbbb789051321136a3434f2ca464ba86b844f781016f5d58e51d803a2aa3828ad10cd037dba81a28c8164b68ae273776f62de6893e74a9ac25487c269fc800e9a6f542b30596e30a6e1d9bf5224394a4a444e12780954c4d7188cbeb311980abbb0ad169a715d9eac580f1575ac535c9c2a8fd81a1fa529f558e7b4e11c4c3a8f1720a3e3b73aae9bc7700aa4dcbfa4e242e99c50468d779135112211d014ca63c63cae9d1fc1021bd9840f2d6fa6ee9b80d85d7a40c115015dd22dbd4c794afe036b9955ad62c6c138d4fead1662886bedb1dcc8c4104866f5ab0413e3f89fb27b8b18e11764ae40fcc7e6822ef38907bf1c2124cc00b380a17b086e8692e83eb8c310ac27ab7435646a686e8dcd66889353c550f4726dc77e4c5a68e8fd9da05f6c84d6fffc03d52059b6bff29d0f8ed3db9b36b2f2f105d8ca4e99cfb504401ba9b66b1852cf69216565f60c3847e856b80a5f17fef489d2205b3401089b731891f132051188e98a68854806fc424892b319f811f4fc8f0b9e7c7e77944546d8632fbbd55a55040d5c9ecfd147bef2c8b40349a48e3b26f8d1a3dde06688830bc9ef94a94a45649099a326665d14e7fb773f01e06bb31d7c26880354a9b4564d54b0cd2ce5797979d26fbe1641bc8bd03a67415827424253db35bf87d637514e43eb085a4ed6fe63d1d61c3346b3174e083b9500ac4270fc0111e7b40498dae43f78056769e25b05b5447c3c524ed82534a8d125341c8a2d4588b94ec3dd3f8b063b8c2c0678181c5138a03a0a32c3ad7d7c8fc8b19c46adefcc4d711bfcd2497ffc2ecab8ca3798dbc485f58859fe1acb172990f4a0d7b17b2c779a546068248d08344d0d7c42d7eea687a320edd7f8f348faadca5d85436e174f60e13573857c0c83f73893c543357c78b00aa67c86d0896db39b81961188b7e0395c38d29fcab1b106e897af257e7c620c281a7023991e4f4e628ce5877b07d290499e3aa8281ed2de51b97b4b1b5a9c458b7658686d9983b1c25c40fa74c429f464bbb9d8f9ce25579703064848e390f8ec0f3b6d612ee6e1a33b3cd7f4ab16e033d022d290c3104944dc09257c7fa27e5514de9a8bc2fb2a9238039b3d8f5643ba24ec22b915a73f4d51a33d938c850782b601712ebec49a177e8925e5eb421e6c58938cdf11ec56c894c97e7421bee8bce2858c77a12bd485d5e70672efdede28f771016070eecf5bc196c570268409e2952ba15720cf66e1cbac737047bc294ebfa2dea2e103283989212f66e802310203bb4377c5b0643258fa52a6a10a9ce4ca55d2ba01b28f1f70d7a2fc4e18fa0dd35604b95e3d40a28e4885f3ff8063ba38ec6af1099a0375ee232930784d399a4c0d97002e99ce43674ec6c68b5e7905bbe70abf7fb18ed313200dc044402ec8bfbc94e126005a83ee5e044090e3c27b7a48111b379aa2fb3810929fce0a60691f09cacd79f0603fec989e1178492b9b5c87f4ac8e60b2794b2e1c5ff93d3f21ed1e317c7750257c6d0e8e1526620757bf6b81664a6fc3a577cf9bfc66dcb405d2757cd9adf218eb87350f6a32872d31c271128afcb6362c22f7b11d4a6871a34d9f0306b36043a82347cc9fbe4e1cd91dbe6dfe74a2f82cd25e858e1fdbc042a42dd745f01e3354d51dd22d0cd3ab985a1fe01ca3bbac87ca106d0eba7694c761a1121df0539fff0616d7397adc0509809c7a3166a82a58960f3a189cf19bbe39cac02671bd420b3b8145a6583a1a30d1a381caae9721fb1a67404e0d6365673fce6cacb330ae2ed07065afbf5c3fd6275d9ba1076ccb2aefd72ddcdf033bca519d77e4535652bdc02446f5287a32b3f98a83d1c158ef10ac4437585a608e6cd62d2830f007085130709812dce4ced012502b5999e2fab74a1114adb88218a298b5f8f0bc25372d6e6f414f6649e91916b107027270b3f95d1053652a8c60d97bcba881b26e7361c5009a181f507a7f14a28cb71a6197ffd616fa56157ba1c3e6ffe925f438d3ee95b6bf78198e6317b906bb30db46828fe5c7e3fba4b8f322fb6ea3855ee6838c0a12f691942595afaae6a1f1c8d19742468c5eb31177751ccbd2cb23afaf4ecaea7f0cf6837315b45e28413e506b1d690666aeca03aa6a286dd433c134d193921782fb801a043000028bc1714a5fa191dcddd7d141af3ee4e640727e147a1c7f719e7e47e18e89e68fde36dd0038ea895e9893ed5bf410f9264145a565a2aa7a0eb3470e8bfed234040e4f8320cfed135da76840808e2bbcbf0b13c2a2f2ff9b92d589174b987ad37e56f1cca0a32100204c3a11f3bb70e29cdc8249417774353a26d2c5f54158ce82b81b55a698a7be814f008c3faaac2f285dfb5d0fa3c970fca9e25b3b7edc3a01002d304306df0628340411cdb3a84b941e6193f3ad95367eae3790c6e18dbb4a41afd2fbc2182cda94a024639791820580756457c121fca544a931bd1635d604bac579e0876e25f0a269ffd2c723910855166f2deaeb94d745344266e6c93776f48075e925831ccde7f5db7335a8ead86cb01b3da1800b0719e0bfe4160939b8d67632c3a44de3ec1e7ad6da881a558331f3238c7d14ee8d8992f75045b4484c712efecba721655be4d98aaebe0c00d4474a10e0e66790f9dc9eed9770435178e53eb4ac8cda196e07079ae1420ad9114c2c3658fadcb851358f89da0b95fccf5279ba68f15272a2b52df5e7f50292d04f3748e35040065120cc7c1b9776bdd996c9774e290ea27eb08ed676e2b14cc02c71693e10bd20dcd4604697a843d5b08fb8ece89888c50cd7eb847064cee49252399228f62a12d1128a51f2ee95243e19ed16319d60f9a76f108882c44515d888c93ed6ed94a4b2aa56c99071a18929011652e6c856fc03910b389982eea56ef20499be99a3df783a3d5c8a4254a37b0a51a9ad68750cc861a0d5b5d694d3980f5988a0091aae9ae8738ea2698c72227dbc6b068878d8bf2b65787d60b41ead2f18de714180521ca22b38888d8756f76730818e67f7d45545e34f92dc8e30ef49f6cab0105dd5b42cb67d2f39a1c93471637770ab7892993636f0ac8148026fd279d83cc553bd822b28d4bec70555d8c1e8d244f92e5a103f50b716095f4acc934e4386b5fd38cc13487d36c0176b68b3f1d0cd71f7b2c952c4003bd37b9ac541a61a8bf7e6f812c4bf05d383e178c42967b2c7ec15462aa6ab066a7c3ff8f10041f7b479ada6d54dd380e88febc13524e01f7b3006979c991d042bd91c40842bb21e6d7c3fc4a348496ab15679f83f78f5533d05bac8f2c5d0fe9295370ad46b1b778a987c89c1b9035918b9832bff3f6028d5f7a7125ba7511624b12805f18c6c82ff361825f05f32594e5b2f3c4f0ae8ddc8ec8292c652cd83d8ec41935ed00d860ca9dbafd03bf5b029b0fbe8d313a83facaacb3a0ee4e8fa7010c428fcd0d15b410d0e2a295108bf34ea8732a0744110fbf7fc9f74d6746b43e13d86cd25538c0da29d2e89c4d9b25e184206e99b5e8af8013ccad5a2839edcd8c445d9c3e5b0e76ee417b681dd3f0c0637596bbe3ab13d06d7967dfe7a0830cae82063929b08add295cefca2448bab0a38702297fc7e5fd387108f948c0501550760e52e5f5272d0faa4b089ac441544468025db3fb366350ed2cc69d478a63ea2b02d320201c89766f474364be456ba8af6e4862f1c152bd7c5853f3d75d77b19b1a608a39538fd85187bbbffb321e721bb3783113f33562f39da5017d05b8428ffe2e7ab5dc02186782af209df9f2c6bb7941201047353fdee1c4c54822ef463f8567df112a224cd175d8d26f0b5aa72325c8a254d393cb6a868c70352180935e07eecb0cc7ca210530a12619cac45a892bc620e951fa1434c797b2c5a4fbf3e6172b173a25cf825e20a3b04b1d5eb81c47ef82031f7cb8c1850317dc70c1850f3ef8f0c1096f3353bef8d5aaa73e6aae37c44b3b5cbd63dc6c9d14b750002a1b528db82f56322e4cd5e93f70631b40b744ec1439c41aa3115a413d86d5bcae9108af99560a0e51aa40db12d1e53d074525db5924db1108f2b9bebebcceb83e3c70cde7ca16bafe84023ecbfe11c5a02a869b6da183e46222f042f74728214ca5373844d80637a126198a2445cff34d714249b01a7ac5e3d9f4d2d4b0607db7173c5ff557e1ba62776420d7a0b77f7540254a06c69ad4bd21bfaa4581bdecf8be434887933b653480fc15f0fc80882a88564e0a6d01194d00a61f7a8e4b291ce6c4dc5472139e711d02d0fca186c79431726acdb52751e4416da30619b03b5cffc73f7195c12794620288f828c2327a2452add02da80ab5869133f693e7dad5296e5414adc6f8603481bea5015880fcf43001a070beef3ab107fce1232d1716c571c6eea059b1d613f640b707697821d56015c026dd84a1d70e67a69c69690a4f2c3431ee99dada45578e6facd8501d745b200ca4f548bb56d3141d6617037a6c19f15a33e0e86e106aedd4399dbd1314e1b85d689a544c02546eae2a9ee6492a3a15d1615283f474cc478fbf3adb912755e19d45de1fac2001605ed8a12af1aba026111248e0caa12f0490ed3b25f34fbfc96922805ae4afbe1efc1004f14ffe7957b7b76dd4c37982c262d43c1b6cd5076c42588cf74d5cda25e9d7654d33f483638350e145de08acbd6a53da11c1f103558d8c988d34e22e4485e739076b66b9d7f202ebbed8555d30107c4c7ea9146f23841921458c4f908d47bfab99733ff9353051fd1bf379dd6dca4e33a0e5106a6228e5a1557c98123babb461bb47d9e46e2332f118b5b1c2de7f5f68fff44359f835f27a3457cf21cd6e7c934b3f9a3a8931284562c9125d62929971ad4f0cab57afaf063493f1aa570cac29b79493b8cd28b6e53cd92b478e9bb9fb58a94d21ad3599f47e0d46d92de7d10e60365d140648549ef7e6b67ad2e0116f17e534658b581964bb8f5728c6e7e235da715caf809a9522af4e56e206d289440c8cf1678bc3d0c853b241cfe385c73dd02155cc13588cc1f4ab8b20083ee8c6e59ce091666c150af76a88c4ce7852277b98e2aa1bdc15a7103327eb9072a7a3b8d4e648656d43346e239abd04257a9503e71e772796ea194a354d4ea5bfc188cc255ca4c398a710c2302ac1f2be597b472230c41db51c1a2d19570a71e7e20d0b325474da1b12ebdbd4caca46801bc7d418c11aca831af5d0b73fa162a392f59b21bf86f13f180dee82da010a28fc58f6400a1254d05d673737150742fe1e0d5117c4d8aefd0290bdabff3c25f872b218e05d4cfaae9fe092307554aff705cc6900d723154796ca7674347c0490a7998c1217bc40a3b7e7272376a166a8e78206e584399d9aa2e047a7fdbe05c2d76a428d85b2b70dd4d6964e421947a9611cf719eb55046a56a9f4282acab0bb794915e935c8a16f0ab287dd35f78bdd2597cf31f8abb7806d9eee572db040c3ad2aadf2a5edc39cf11e56f7702a8865048b76a70f969bc87d8282b02814a4a56809c014ad1c5aaa3fd9c2305a7032ef341ab94b44fc9fe8af545a16908ce40b9a586e82e8340dea627430cd1cb9dfd15895cbe26e4df78ae961ffeec108383dae0369726395a98eddfb9fd0deff0b6db86be8e76ba6364594bd78264feb68eb89c3309ac01a17b58869066355af185c57b5be8d54e6c6539f18a8be7c9425e21b212dcb7199571d19f7f1f7615d4dc23aeb64a8fa0e0a6d2dc7a539cc6c3a3106a4685cef8d5dba48c362ce56e7f2b40e4c7d9a3d291ab0f1c1d82007b8161287374a6534b6d4221a748c4ecb89d2bf85140d8ac81a73556516342aeb1617f9837446c56c8d900a80a6a820b50231c27c6c01218f2c76c37651fb51892cf18ed1e66a5e0d2e0f417fac140a9fa0a1873d50261f4735968f76751e21411034563f8d3430af96f79ed0bdf70bed1ffb861f65e5e00036d4d159a668ee8d7aad4579f7e63e132fa284b136052e1a7d0d6082d510be4704c415fdc5b351538a646f0ab9568feecd604b3f153e92c6947565e9feb86cdcb9d9d915a4d4856b3f6e214cdaf7d6ce534081d9e14da2147fec61b45a2659b3156998e7c63bd8ca3a680bd49c754d800169be889ceda1befed2e63a467c37a5cb813a178badc9eeb2a30568133ad339353db7068626d45dddb503fb1219a74fa77e7c803536d4b1dec2041c93c3a232a6415508a8c05d13dfdca19a46041c374e693886ecc1f1711d24d2da6602ec4c3b0d37cbe26a2bcf8f21616d2557be163725d792a6ea7958654849582806c2bac258aa5a8b51c6c39ab845811501ae0b4a2ce3df7b8a1b21a94cc2c22c5b9af1c4fb7123a5e45afc610aea8d1b2b2f1a912947c976bc36d1173da46a8ec041d90c79e38d9b09db98cd3be326247e06d31ac9f3e4ab836f7b0e10be3aca8899cc7fb7f3b184cae26fc02cf7215a91c42ab3933834d826190a61f2784aad17d6aa9eb1a9713371c736d69abd89d05618c654c6f6bae09522a275f9b6b4295747ec251ed99f253e5a488873e328c98fa28689ed8161ec24cb1ebdcc9bdef2ce586acb2168a994b8406a91209d7f5a42b6f5d92302f7ca399b4140b0a0bbe288dec8e6d9db8b3d339d8a389e80c7e3a4da21b9af49aac101b640e5553052f9bb2bc881b5e9a84fbe610748229553b35a3d8eb425f49757fa7dc831f28c6e65a38f44e6d4d5ce3f3d5bf04cbf2518f76e4a7100e4c94e4cd017b4cf9dc08abaf629f53d1b131f58eb4cd7e23fb55a176646b10c0bc64d9cd8cfeda64bee22e95764a3e73f0d3163e4b4798cdff358407f74ea807f1d5abce915aa556508e38012e6aaaa265ff4a210f8d906947d6be8bfbaf0f19cc063a2da5ff1be71faa2d60d59e0f4ff77a9aec848555c9ab017f1dfec15ae457e5dd0ca47d7409da72b09cfe9153d5f715dd14d988486b191e4f415a44ee056c9ba2ffe4c5b07c5b9585e327361a8f44964b371604709b98a27a47a8a8c014dbf803a1afbbd2d11b5e505960678baff8fd0caf66eeec03a08bcf759bcc5aa9464821ef9a355225747fcde4b499bdb803635515706b747e7f53ab6a3eaff908688b0e6510df7131af25e5c961fe2bcb6b8856b285d8cc3a06a86f50f5dc57678f93950e96c389d98e9738cb33c84bcc2dc3394d7502a1eaabd9d42578918b6fd3a21f33d174ab8d55453417afd95d5195b0aee703eb7789a7e4e3313d518e7b7306b3df3b1f593a6ed916aaec918fff023d233cc01ff175568afdf410f13768a0cc7abeb10bf1024e0fb7223fc47a0e9a9826e6c674412a76c3599d207e9661db0243e174b774bf4ee687315c88c976286a0dee8da8c1b82da8225061b7c8f9b82b412992b3177bbd79c887c256805e4164b9277c107fc03a20b8a13983decefd1ef9c835fb0ac67223752691e6a2e7807bf7fdcf79e2655274783e6a4137103244e2f2874d41cd8f4839c8850530fa4ea8ab382f97c488bcbacb7fa6e1b1a90cd50fa8848793dbd3dfbbab76cca6e5825bb42c92fd452fb42244427698fcede54f34284954f62e6e0882df130416d317699ea881ae95b2301b997f0e254cbd4e9c8c6587fa14ceb680066346888d0fd7eb551c1a6b06c13912ad26d41adee9d04d30287b6c94745a649239fbe6d01f5e281943e6dd04dc5f462113e120916a3c0d4ca03b046b840f000df47efc1fdb688239051e16aba174db9874016c7027067ce7b052d0716598b5298b71f061be3e6822805e42d9be55a54c44c7f3b134e2911656e2a3150960f62da67776ed8ac534b5a6453dcc6c77080be6dbab6e2988a1393824f721c6dbd8d382083cb7a3020ea803a317634f36f913bec87bb47355b4ff1b29d0171a13389d335aa460a86dbbd584307283589bd1c3c7a7378aa106e39086ff4080af9aaaa897189021a7ae5f7193c20a57259f543c8d8d9283f6fc80497e53e8baa1db59cf5e27e8b99668a0ac13556fea89042605897720082765488479532d338a785cc2163c083cf83a775a2c668fbde5eb93b1d06e3b4fd77aab7dfe6e5a2354d9f7b1769ffff3f47b65adc3130778bdbe111138a439973fe1a3e64f312b1f55fdec7c3954fe51e9d03b7acec1f281d7af823ae740b989004c325f73284d9af021ea04b0ae2fde47dfc13fe2817af09c4e52cbee7e48a693966f437c826106dd806558fb008eedaf00e9cf5409972150f0158560161183e0212007953c72326724f8c0ddb8c71abdd74f64533d1f64a0dc962e357faad000da61b98b825d99b700b7b42380e466da4c91583875ccec5b6da74991626c12abcfd2a54650881b40165767391876f27c726d877ad0ddc249c336e3e7713dd6b34c5067b134fbb94ed2a842cb89a42dae4ab5304a191f1110bdffbaf5fae90498736592a36f98557def28bddf1d8e5f99e5fde98835cf4abc0918b638332075d139b26fb3414d58d2a67db35355e1e021a0428287fd0e0d86ce21335e01d83006b38349b2cd75ffcc0529139aa97dd599635f527e49a61214c1d839a8678d35d41f706c48b637dbb1dcb9e7d2e9bd06a15bea28a496015ef2b299f5706ebad58ce72e53f951e564fd05342906d2682686eacbcde5642dbaa7dbf0e619b2acc20756869a9bc3d3cc20b2b7d85008f90f5c8d5818e5ae1c1041d46d53912e4b30f29646050d99c9e95ae35a8c7620741336afe1a5801fb1e82a4e0b87520ad72fffa2977bc7bf50c3904deb2c7e6b6b064663341c37e0291c4a044fb4b12e2dd1befd863645b58725733e10b10d5383c2765211e993c1f67be2f78fcbf80ff7ffd4f13e87e0ed81d74c1211f7b41b5edee82f5e6e10deccd4c8da3135ce0b576de4fc10358d29be241479885d4f4ab98faf492331c028572622081c2e98b44e2f433ae8335b4373b9a001445aedc8a2ae03851ee4b090b31cd8181f06dcbd7427143e64a7f0be8dd1e3c25c24a191f88b09b231e5e6d06ccde262fb870f93c2b24c01ecc3a558e6978718eb105d21484546fb6f77c963836c28bb01904a112a2c5cc0084149ff0715271f21756fc52da05c1448f52d34be459b5f2258b9dc7453a3e685abf59b27e154b0e307444412970708c88bfbc3560de13b668a734ba3cef2e694f728038cceff86a280b6761c1e0fe06aa452435afa14037bf480bec31c153beb3ab6f0b91a7d8ca2113d342b3d2d2ba51d28d36dfcb88977e22278902ba9fd5ee9b3fe4e2fc1a93532298861ee4803a49cede178d02937da8a465ec395bdee13f376bbfa529c2daefa3919200cdf4a49151256e20faa024994de4c981a805bb5267c3ccb48b096dbf4bb884a6ba04b11e26329039cabc370ecfa0eefcb1a5a6dc98f25dd40e806f3ddf36050c6d6c552989107cf812b3c09fd0cd013ff87d8901d978b1ae9d172ba4a24f15ffbccdc15c1c625e189f1039965849ea0fd01c2f84e5fe13bd8ec9f0e3c0622e271dfd2eaf48e977f6af0185c418f1a7db5dfd0d70ec2035c04081bf0590b9300af0b9192a11647f0f062c6dd799b5adc02414a396ba0dc66ad92579a794e240083752e5a2867dbe3fc8c206fdb06cb26c187354304068df01a71dc40d8149cb29433804847f054cf9e971fe844d6891c1c1cf0ffc21a411e69490d232572a495543ae351194450c368d5c7b853628a9666fe3e21c93ebf466fa1de984880545d99a484fb207e5d9073403e195665e1be31fc5ce7b09c53854fbe020011f02f5859375a8eaaa81ec4a59f78f2ac2af0c78762c9fc7ed7d32a9073f988b5a3d32e1fc005b3f027351c3e5ab8703288991ef3876e4799c9216b713f29db360c02e688d10255e68e44db0b84b052b1801e051d0eb7d87caceff2a12299827dbf0ea7875220981189af23ccb0ed5e4498d16f33a48290fe0ccbd5e6adcd00e82fdd6409aacfad077a646f064c5993bfe98be18738d1785e885ce0b410b8f32eddf0c5fdcba1dc6fb89e047af806ebcec67583db6fa2bd65cde3c7818f36fc3932a08f7269d6ef1df68b8fe56bc8e8b80efa7b47d27b573ad0e39b815aaf0b2d148dc681edf78cf60a4bdfb3ddbc05173f20cfccacba0f8a2527ab0aa27c16f83a8ca2166ea744dee323fb39c0a582ca04982221c0d188751f5f0b14120bead013871401c0368a8cb0e6818498fff586db2130898e668bafc848ba0af0119ced190de52574906f36d0def19d98286324e48a66ee97556681c6151c96f997554562f0a0de638d9ab238c802426a034b75ebe69de182b34cae2445b9cb6dd74f16b732dfa417ae9c3d8686fcc19d1121c520352e31e959833273c7c664dab2c3bf8718890f65efc8155c9ffa5a5e4326738bf35ae26bc2e0e1639fca7cdecbcac15b09665821bb27623506141178872cd71d11031235bfbc598f2628da1c5e2cab13e55c2fa0c1df26135d78a2feb9f95628dd0278a909e2e0a7112101e546e75cbcc19e4b9d1e9dda0a2a120391cbbd446e909d7dcd92014b69d66b0f839ced2a7a8c2982478924a3bf32dd39ff6732442f441b0d8ce2250bdf787b741900a3456d7aabb9230f8513fe49542d24f50c3297f820964c36a67fcb6045316b56b20e86499bbf54a47004c7240df396de9d1db23adf8f88125475a09085ab06010b72115336b78a45e71e27b3859d1e31669a4da737a04d91ff3f8927c8c237b9a63c49b64072dc0449583a232fb17b0a07143fbc29314e0cfea5bd1b608fc8e5ded9213d9d206e35919fca0f032b6808225e7a4f6e1a5408ea8d34b6b9ca5d3123b01b0820f824a43291c311f90d6c20c09c1710d4e1ffd459c23595540abd3171e8707f94971fb1783e7f9bb9031e60d85f971873cec50aa21b1deaf04b9da938fafe66b89cebe843797cd3f47389211d514352ab481d41377b261998f015711f30c0c8bbb6e869cf1ec728a6e63f37e0f8067f63d04211a54cbcfdd821f95c3a66d921b470c344162e6d4769d8fefedaba7b4837884fa03ea096f9a5b3054b24a078e941c1ca59f546b3b09c4afe6b21ba0716dca46f2657a0464ec29a9da957033de88507a9c8f9eb13e9805cc9145060c20b2f9821e8cd491bd05d7e0a424d45cda696faf8c9521aecfa32f09d97bef2db794522699027109e10996099a179a13cd895665ce2e082d42776a7faa1ffced3b30b849e8d72fa4de01253fbd6f47bdde522f08efe0b314eff0773e7ae3d9e9342fe91c611dd6914a9004124364465290805b42289515f0134f039b8af0760ee1ad7f911a015f1f38079e5edafaecd2acf835490e8179f0932696cb5b32debaf6c4bd27cdd278341f0d170d4f3524c5a34aa15dd5699c86a73e9ed87314650c170f0cb7896d8b2c5c543257e2daa68b87ada082831d5c3c309c825c544c0e835d01142e2a9953213b97a4cf49694bb360b8c743fa4a05dd702259c79cf44fc768b2ab5c6ce33ef4e72a37eca4ee43f7d8353b1d212ae9d5693e692457d6314f259dc6278fe4caba44922b3b91e88fb4d4e829100d7a4b270fb885f9f7d62796665db7306e7d6ae19c76ea636b7e7ef116fb26d2cc17dad3a3bef0f4a1f46412eb90597865dd2ef9e0ad176f9d4a22affb36e28613c97aff7043492405b76e2411e744992f4c6d91c5dbef8ab79e947d71fba70a0f98cf24b9b2ce9d0ad567d849b1ca95f1b0856417d4e90b6f0ad3aadc70223de0e4618ce768d07a7b2ab041ebfc404e1f1289446a4edc1e7aeb2d040a35687b89b745dc13ccb773bf0ef2b6df26e79cd3ce6ea7d2db2dbcac931ff6f150198279f5faf1604f80c1c4cb22452a825e2e76cd20bf7c7151b1274ffbd87183f3e8e7ad5283d6e7ab41eba74f7669d05ac77a6eacdf538cd742fc234930f69e6c2751cf94def6d25bce3947739b5fd22beb610ee9a557b60cde6189c03aac8700301571e9873e3f745311377edbd0bc89c43a6417b9b29e4a5d6bade973a141eb471a6c196ec84b6f5d389284d46943b79ddb3af7492f0d5adfbc2e3b9d75ad891bca2e6f7d22496bef8d486fbd93ec0358cb67b6c17e2412f532f58d281bdbd81ba3b738569f3e69d6c42ce246e713ece7ef61cf9d03e2d7e70e0525ef4ea9d72454ca26a1c4d39c0ef6633ebd233853a97b31f70641cc6db07ac69df767c02b7eac32600837e015d3e89b1b2d56be5c5b24a35cec09e9c38d31c1f4a1881e03880fbdcbd574f8f0fa088650c3877e03972f53062e5db82c717955d9b6acbb2df6aca3d2c9dd12e323d9dd2da594922953f6426fced9eddcdd92d5ddddadd15c112f75d6c1524a295b82b2f9684e1a411c2ed90c38073bbbe5acd362956a61a79dd36a61a79d58a5604c8b55aa45a5989d956260d05a29a6c5b4956a61a79d608031ad1676da89550ac6b458a55ac8cc20953c8661961914f2ec8b5d03826820bc40ee17a9330b9b4d6d9b9546c73c0e82b98db4ce2ca46b73e326955a66b1aa6561486ab13ab3d0aa6b76eb4c934a2dc3aad5b2302a86559b85a4589d5970934a2de3366eeb4c3ad24d330c2d0b43d29945a723bd9ba6d3a452cb2c56b52c0c492d56671658a39e6c6c63bbe5ac996b1e67473e03723f7b499a43636459178a2919bee303fae33727a5b46213e875840847bb9dfeea5208522b0201f58032801c372be611a1c41dedd55f3f2bf4d2a440508080da637dfdd0ef353bbe7eb0de248e771ec879964971cf078e0ea7b9750fb167bf9479c457dce15dbb7463248a45bdeac8233661c509d6d13ebfb05f7e71283b1aa235c9760c9779a7bd61e71b6f708e6c34b2c28292108458f231f67c18488f51616beb43ee69029e8601c4532c945580032c4979e9ddea8bc5c94524fa7b4fd61a9db1fa89c58d1eaff89003a30602fc0463053f6fc846dd29f9015a42841de8408907545c4c62a0c363dfdddd5b0d2ebb2c91918ca89f363922930f4be8f1b3c88a0b3ee42b587e7ac85a2673c931e784f23346f919a7fc8c4b1ccd17fcf4e9f6a61cfc01163f1dc7c70f2140c0f2d35760a1c94f277244043fdd851f1cf1da52440f0d7c8080f4530323a02d5004f1f0d3a350b3988a2fbef8190416fcf449140316775e2fe26b0910ddb457004a5d7cb3902dd2300cf341920e1896a1cc0760e050b740b23e30831a61acb403173d4a41f07003a5293d6049528ac2072c2fa52b4eb8e89212833e5321c6ebc3eb5d1465204921b7b8dcd10f57060b0b90c02802a908465bf43040085d8450821c1817443f9fa91002125b3653e721c79e61ae79d4b60ddb26c7cd6e7257ae24f7f12871f9fc31bdd21a58586102537aa9dc86d9acb2808459d36badb5d6596be5bcd615b4aa69b57af45038f2875cd52e86ead5ab4fa07a8d21526bad2e13c33933f69cb2b14d08e3f3d5b7299d4dbef50edc8a3e2727f1b58bf8da407c8c65349195abca79e72e57d53baf5e2bd799a0dc935fef64a081636016f57a7dd60a64721f5d8fa4aed7ead78b272f857699be282457d58b434264dd96b44f49495acb5109fb849864b86170ce4f9551a9baac27efa97efa7894b8e24bae6afc91abead4e369b07ae74520b9aadd921b46a5afded5e39666d51047e4d2ac90a312cf74e91607e750189fcc49940ae8cd997b6b37cf326db398ac4cbae70d1bdb98806e77aa14aa4b5781bacadb53a5207d93bea95468dfbc3d4e75427c1592d8cfaf72498f5d9ca7726dd2623e6ee40af3e8099198c5308c9750d07daa1430c7dcf4bd406548f7a95c98bfa08a9f4a88c921c02e93776efa5ee0a1a242f7bd80b9c94d9f2a7ae64a5c2f0c3179e7d1bb8f874afc86749e7d3c9b77cec3b9c995b8d8c52eebecda62a7d3029220f1a743805d99b7a0535d48e6aae8276797f554d13167d710550a26c75c059363df0b548660def90baae89a5b37b90a9d9fbe1730ebaaf8a9a0b955a99039e69963de399d5bb765de8d5c4976718659b99244e6c7829d3d9d88208828b0164f4ea71d6becae0274a280921032a1bbbbbbbbbbbbbbb16ea31f28f4c0014b00592e24cd486118865d94e69cd9704b886742af240a383fbe5d62de83c8fce6b536554f90baa00f6916c7607b3baf64cb07af7a52cb603b777884fbf9d399e7e3e47c7e6027e5aa37ad0b737e760a1b0773ac70811234a3a21ba91935eba859a186a45991da95973f7c0bf1419ac40d358d482baa4959899a5a52d29cd279f668973d7f90534aaf724e593f3aa79453c6a51898885f800f3e71430bdea4da9bbca29e793528e67845a9c70e48eac3242794807d4796401e49c6f4e67ce04c1470e6270573eadbfc6c70a409369e8b6670e28b686bdd821a9ca2093518bd560cd38234a166319671f4871aa13e9f51b9ed6d45952e0f3e5be18497df24a7396157f2fc8531a43df46784cf8c8064d700dec1cff06ed4277525763aa91a5c1fd6111df3b9d1cceedcf8ec9b44ac233ae6ed49d15cf3a84de955f42d5eab0535d8e4865a50a43f27a127e49cbe79a1929f61922fc26e847bcc31e7b8239cd48d70cc3960a7977e8b6630e3637e70a2c415fd0775e9435c4a9f1fcf741ee94a6ee8f1063318c0873948f0c18b086cf043097c80c1cdd2ebf5aa41f2f082970c637021030aa2b8641145e8412a7237632415961ca90f4bc0410f36f490a5a8072f4f907c5041110f53bedde2fcbddddd5f70a8c156f0e0a5d7eeeea6f2d2a7952ca48348a0650545a8a0c90d505c0df4dddddddd7d05065d115fc24bb73478b903d0a7a290170c60626a434a8db0c587351b3b69b7447c77910e4f7c17f988e0ef8ddc1533f6c6949054cdd28728207c58631303962d6a32e5bb280728dfee454e6af8ee6b49c87235228c0aa0ccca0e55c9e280624537783182e9221aaa4c8290ae298228109396e2c82505525f249e14bd8a7068410f454729315242483ad82246d21231927c902289ca83424865313aea31faf6d964fe4c28df6e54f35cc4248aa21ab63c53310499e7a21a90de053f4bb8e0678a0b6e88f2feec021b9e644911e8238d9119f5d4a59c72ca2965888a5064fb1c9ad371c86fcacf25821aec2635355d3c51a9b0d8b0b1a5468da254ca0a0d8d171a34aacccc7041a1b4c8c864b9121353040393b42549a959f76659723a613199a6745d158ee3b26d4b689a952cbb62ad972ebf93a4e57792929e39871b5a244622222a32b21225a8c1a636371f8da49ebaa4f2c3a2208998969a446da84915a9a75ea9568e72a8460d56a25ab4c5fafaf6c219e1a8976fcca859f1b1a14897be1d1bc2aa6044cd8a4e95302bdfbd05dbf2ed23f80dc7e1cd80c33d461c8ec36bc581c3a3273f1c1e531c371cc78d1b5a7e840f436ab06f7c18162737b456e8e0ca5ba2a3a2667590d151b3428b7405a959210dea496a56880dbd96c883bf1dc3d2ac1fce61a12122a32321ce6128df40dfd890956fc7aa748b5ded58946e4d175634a51685744b1dfaaef2ed3b5df434ab8978fe1a6fa78b9e264dbaf069560ff1fc2a6fa70b9f2e9e74f104a9593d82e7b7e1ed6441c28245a9590de5f96b783b5994b66c216a560bf1fc296f270b51519151b33a88e7a7f176b21859b1d2a5590dc4f3d3f076b274f1e265a859fdf3fc33de4e96a12a55969ad53f3c3fcadbc9b2c4854b52b35a04cf2fe3ed6449d2a225cb51b3da87e78ff176b21c65b992e50a51b3fac9f3c3783b49444545494acdea1e9eff7a3b494a495b92b6647935ab7978fe93b793e5956549962548cdea1d9edfe4ed242161c112d4acf679fecedb490a9a3265a859adc3f373de4ed250952a4bcd6a27cfbf793b494b5cb80835ab73f824a12596306a5637f924232b568e9ad5383cbff576928eae5ce9d2acbee193ba78f1b29394d4acb6e1f9a7b793a48573e22769611dfc3e5ac92ecd2edf419ea494d2ca18463dac1b4aff34d856b4dcf985d1e8da70c3d9337bacedf9f9900671518fcfd3a12a5f7483d0eb782ebae1f59476e94e881f6d84c08f08f4f287b6931bc69feea15f0779f7c8160e6fe7afe55f8dd2b38b6ce1f8ea8f5cf592e77b69fc31f96043d479c27083dc109d4f9af450306e3869cf4fe4ec462fc004f294c4ec8a2dcbabc8a399d42f4c71f1ed389c93fada39f20b7c248c751c10db490a6261d42998e3a6db461597ca181a60e5714e497487a99af38790166319f2f32d97a8143101f23231399b5504736bb901b341ccc3f8d8e7757a45a4679d3fd54ef4f9f578fb85d23b1095fc74cfa6c1ab1dddd04e15582e15e3771b6c7bafe579e996bb96bbdf9798df4e61bf87d22777b4893b6a3e4e5ed1cfdeef6e6e236227a70de76cce4ee4880bb2c5dd53c84601c8a17d2dc4eb9d3c8e26e73e18542a4417e7d1c57d3d9ccbe43dd3b5847326d6159904577743a6cbf43199e1e4e2bc5ddcacaae964dcc74c02e69a14aff914503c0684a5884098e887c4c1b9b90141f754eadeea5148bb555b23e858175b8c91120189c49e296c18f5458f5f0bf1e5b383b21583301b0f92ad483414bf380404164c3724f568b071e41830f088410a885c54a4d31cb25143744a4c39811006172f979c5582f879b9b83ba1332eb7e5e4a26b6cb68861d813222b50a6f8fc080d6195da1b51d1277ab41263fcd172c3d8336d9206a3d378a6e20b18cf4449d48c6abb1adeb26dd3362dbb284e31285df36a18949e79ce9c6719944e4323dd1f121e2926538e2f39f8306585e80d5d87807b2aa2a1c99fbc8b9678f9f072f178d2b19ad3ee6edaf9a4becdfbf40b8f4c4b74fd2b821a82b657efbceebaebba7aaaa8ae8647be487b3d7d1e1ef9da9dc72f6c9f1d765f92f9279f9e9adf45497155405ad5397f77de33154550c153304eef6ad7755ebd1584d070fdb1d06f02ad2554ea49ca9d5d77dd3d3ba75c373d1b55dcce4323dcb79b7c7af54e4e976cb6d3e97ef0771f769a45da4fd79be1fa8651af73eebab36d69ad355cff214236d9053979272952bdf3f6c2f8f563cebd30fec9a96784fb934faff35441e8e6d4f9394f0564769f2a48f5cebbaf08e73aa7fba93a67d7905e453779aacee777978f6210a2c6463bbad5732f627163d041df32bebf53c3fc385727662421a4a4430a64d033c30aaa12352d9d8fac100f3350a20652c040010e5cb28697727b29a59472d28ab96d0bdee03c13f9e0524abf2b90524a894d4b6db5d8fc586e41819726aa24a18317209a7871b24929773aeec15d23bbbbe51529a56cd93dbba5941125a56cb73695ea696d2a3557cfd93392f8e55540667f7f610b6f616010638cd1c33cac4ebf196b7579d3580e9b9b4f4a59c5a88972a35bc963b60c373a0bfe3295b2d6717c91ea35099d52ce6ecb494a2975b8ec41ec73a595ce39e70da7553a3517322dd378b059934a65daacd46e5d172cd32686f9bc959bb3335d394fa64aedc69d4c5db42a6efc4ed37c725aa665da172ab15eeca135673ac340ab573a27d63a549ae385290a2a5262da45d1ccd098367b98e8937d5aec89afce48f6a06a505d2a150323532355c3c68de9ec3e7e700db60173dc9480f38a8172fdc3e8e2bed06e1ff6a164625031ddbda6ee6403c35435234cccd4c9ac5a5337865674a3f5e2929711167b4c9d4e955d043a1fbcf014486f355ccd8d29332a32be26cfd3121b7be4384616d8434e8a343467352c6b1cb8c26430f36d9b9ce59827cf56934a7d91876c9d9cfd876c999c616cba73ccd94bc03999fc0b5372f3b869d967dc866d1d86c2ba7b2ba755b9b563139f4ca8d4c93309892f32b4296ef44da30c66ce9907be3a83196721b0dac7ac23cb94607509e56ce41d6fea74a89f224bde4e27c6579fe0b5c48b3d2f14e2a99570dd5591ba3766e8b07152f49b1711863a2f2f13115cc083b550d4539fd42df56b06186604c1dc9a6ee595362f73bcacc14bb75da678e95776d9c1cb328e78590618646cb9c19e008309ba833b042e397436009d62d081a301c9e4d3c3c604a83bc289d6b3c48da1040ed9cf3646951ecba48b364651cfcf18567a70f5fc8ca1031f5c358cc18507970d486430d9c185c311193fece0bac1888c201d5c4b96c860818f8b869f94183350a4a40d6c20454eb1011348d8a00a59860d64804a6d510512f33e17dd20898fde9107cd0bcd8b53c8d643c6e78c31c668313b8534383df6dce8d3e0b4445c19173265361b63b4d6312c625eb18d63bced070e0f2df5f98549e6cff80feaf98872677666be1f0dcec81ded64f078a26b046c04a0a0aeeb3a8f544688387cf6708effacaee9f9fc7cba4f8f339532994ceea3593434c099f219a7de0c9da194a6525e63662635e3353c249c72ee7452df8f191d1a1a6ebb200bf8f2e5cbd370ee1a1043e3cda7e1a9826445623cf31680604aafc30d4e1b0e005741e5eeaa2137dcc66d6ecc53ec892fb99aee9e0b7275c3e3b9e12bf0d4380b723585c4e77c7bdd1997f1ef53a9206b5c3abbbc4fa542bbbb7f2fdcf07619c73a1d29387cc78d6c8de0a3c1ec91c42fcff95c1433c3e87067707cb657d465fcca7c13731f32268c535a98276f0efdbc0dd61dac63fa08decde6a34df831c3785b711a9cdee386676bbcdb81f9f62b827daf7db9e18e9f1edefc5479291b9e7fb965dcf0e6a7efe01c7ea14d098d8e09224211a4251595a0e70545265454821cb0228ff8435cecd2b7fbb6f1c791992373a594d658a9df970462f4a92f1daac8213449441c028ab9444a1be20f51f40bb808189d945eb9f3b928091c2aada1155fd4515f68c4e68d983224c1a4288917516d287ed8413a79293d25514a70e182f10d6a0e6f90025110d1608b123ba8a106ad850db01cd0cfc8cdd75a6b85a2a7b28b526b3f97abe8b16504082cd081972f39107185ab6601850f0dc5154e1c93452920e2f45ca4c4971428f1838d73e4d112d1d26f1997a3599c639d7d88fddb730aa5aeb82cc583ee429f1009dc9a4927e7669dbe307e4c9a72660680754cd96a1fd03de52374f2ead5dba759bc552fe59da69d945229a56a3abf7c9ed67d349bbadbdddb5d538df1faad17c620a69f404e3f51fde10bfd2a20f243181ef5f1373965f4847c68e4e6e7a771ad300029b7b65bedd3ab76fb765a22ae756a23a685f2e9a8b9f45a966541491f47f05c2405e837d9edcc9f0dced83ca749054482e04f6e7d262d2dc1f8a9f3d3d29ffc36f1c4fac441e7f6e8ad9f8e2842e2c9dfbfbec9c0a066604e26934d8e19eee4d9a7a172f931df3ad3f4909c3a3f79262ffea96bc09cfc276f3a9f4e9f5bafb3ce75404e56368d1237ecf07a8cb7f74fb38a5c87f1f6f6e91d38e7e421395d192f7ed735e0e4303fbc1ec64f2718f7d13237c60baf9b1cc62b72fde45b17a4f3936b1d90fb9dbe2dc595f19b9fbc86e2758cd73e66dcf8e14c02faf6eb53cb54e21ceb3dbd38797b03527ef26a7c49cd3a01999eaaf9dcdaaf4783313ccda0661539b9f5ceba20d18a2392beebdc76404e6e9dbb793d21d9b23e63ad07e0adcb16bbec6d8e86cabd8e39cd092e960a8d707f3d4cd227cf3eed829cfea5f83c03e1b9088928bfa9381a14dc307e0d4773828b797893c42f828d404dd89bc2171ee6433538fd7a15a3a8113af208d3341bb45edfe475e18d0fdb27bc1fb64f18913e4485423e9cf918d36ee586562979d80a112710810b063b8420b8befaa8560441c6112e18b0339eb8a8d78f87919a8c81c505434684858b7edc0750e2da9a73b952813ae6b4aa54b08eb9fd2a75ecabdc9d29d6d15ebd3b845ac9c34551683002170c74898bba12d701ba881b89a083537f6c9f429cc5c7c6da766bbdc53efa5e867ec916f692abe836b43785bd3e3af685e087fd8a4ac8f0b18b218beee5056df9e989261f5489bd648bbbd2abe8587ab4f87c8c1128c6283fce94c5659f2ce7e9b564e32b999965161eb4d7c796f1633b0b7d485ffd651d0f2e7b487b4eede5c4a744f52a7afc6ed2650f6f0ab870d1a2e5e4445814a5e869dbc6c0f63ca9b3db8c73e9715227cb5c9a32e73a1d53175075f2e9349c4e2a37e42b342e4459e257cf45517a7eabe1f10b7b7c0467561f9d86848fd105bacdd0a4666852311d2b0c4c94335e68534b0885467a7c7b547956aea8dbf0ee1457255d7e425c902beaf12557f47ea111d49b3cf34c8b42f381296ff07aca332fe5303e370441188661188671181d6ee6343c158dd3f0193f792a1a3f79fc8df3a4579fdc10044b78948cf31726a15f4283d46f1aa42045c998c01c6e06f618b9c0b384abde930f9570de8c4baf88f45adddace3bdf7ca7fb3657f29c17cee75c7a210b2f3b8f1be46a38773b463e942e95bcf48cd4f80a107754e7a251ca0b519f398dd782cec983d0f099cf874479a195f1c2d49f3cfe180fc608eaa56745477479bef25c744494df9a3bb1a7ac08c525bac52eaaf9b7b90ac33a07a9e7a0bec2054aa0ce94524a2975acd3c1116d561891ac501a8d642b8791f68173caa5dc27c586538f45cd925f5cc2c61725a5531aa421778950c2ebe57a83d46b1528b0407da31ce71bd76dddf6a9826caef9ced6715efbe66972a6e086e0d32cc74d0f1f3f9a653f15f64d1b3ad33472d8f8e4c4e5a2239e7c688ba25c79d9e2188d006dd4a747279d7346ead5996bf5e82161ca833b9d7647648b7e91eb3497fe01bac3cb185e3a5ba6b4b23de3aaa86fce47af974b453f219c6b2eb3b8a245d1ebc5831d6916b52edd8566d1cf7ad3ae4044aea4742d8aac5f27c3e59c99624d97533adf2b6575b9a9b2cc4a20a4d8c40529a56716bb3f139047240a0d4ad1fc876c691f8ebca15f20ee4ae69b0d786ff5f9d555d5d9a595d0ba91ab9b664953951b7dcb6060c053da74e64566625c3ae577337f36b6092f9b8aae74fa5b732c10e19c0f5ce9d37b3b955cefbe4083cf9d0e0b212f7df3db6a2d66b10ade6edae9c413e2bf4e67ee43b6b2ef26c7fc24fbe28eb8d1253373741c52ca9b1094524a39e59c734a29e59472cacacc98c932e173cec9cc129b75d239e79c739ee046cf70b8d1e71137fa0e6e743927ddb2f188dc2c250f2fb248c1a6c352ea00010b23b6383966ac72cd4c8a5bd1c8a711f70d3e9cf98e48d1c8281a590ce8cbc428867d3c454004275d087153cf4546bca0e7c23461c41042b8dac1d06d40171849e9736b3c1719418317f1c58f1bf9d8dcd41c52f6de6b5333e53738e0bc61c10f58b1bbbbbbbbbbbbab00c2c1cb22a4bc742fd51d05869d00402878e9386c0c4cd418a106446cf1d26f5c2e6306276c704e4d2480744b840986b8f2d25557059e8dd963881144f1d26b743af2760c42cc88918a2c0419b0e8ae4d646b1a0d802615535074e182c90c5dca60d285ab9118a2bbdb5671f9270f2844ac6828d1cd804290f1d2519d8e4cbdb0e84c1e1fa20af0520a51e5a5b31037bcf4984e47a68418600a1c9c88220a2c7aac9060861ceea472915aec0a62480b184fc5547686c9affd1cabf4a62487aa01e286ef2220ac0802a85d46a08ba5247a98d2022c708892831bfc10bdc034030f7cd0c413483488e28a23be804183bb9847d5d80c608b9f137cfb4d3978f3030dbe9dc3e12f3d8461430f7ad083124c8c88a1c98906d55a4be448fc89519218893ddd6e59ebb6d65a5b535383c176bee248fb7c6c8048e4418128c21a60d6a45188c0f2d9b68be086ac64bd340b5322927967d4078b5080aad497edc176c676c676c6d664f3a1616bc4dcacb65d9ab5a45bd9eb8a5db24ad68b45aad11ac568edbda00c2292b1ac80190fad16948716cbb7cb206bef4da568b8a33e9faf7d64623a6e3e37ba0f596b0638e98b444fd20e02ed9a711a28477d3c281a281a349c86060da77194a71a927294a75034348c9832485a7b6f2ae50e823726226af51faa27db72d817b20cd68873bc6fb7569a2539d5101994cbb812578ca71a12e3333ef3f1cc6c282f76f1fa25579e6a080d47398d2f76515947390d9ff15443687cc669be7e7d2aeb34be060a92ab56d92f8576cdf8ccd73e5fffc8551f71436b64b9ec3473bd3deb7460be93c73fe34dd7f5b819949fbc0ed8cf360f6590c7353813141414d44292eb19ef886e83364fdd1b947d3333a846c04ff4424e9298e78af1d865f2bafa4365bcd008277d1784695002930f17cb346f8b691986695a86999edcd01a3d92446a21897dcc5b06a33e0d4e97f5ac4c8c635e07ec5b19af5d3248b6acb5d71a055923d960cac81e7ddbcfca787c29321f0f0cae98cfc81acd48731b4711aa5a53fe63880d8e15b0724ca56274cea9bcfaf0866bacb5d6da3518d4bab853c62fc53a6eb8f593627da6deeba73495a23ef4c90f140a2457181236a886d4ac7ea269e9edf5ed1a16adcbd64453d2b8303316df1eb72811d860f7c7015022d9d278d5365ea86944aa6fd79234a5505b7aff5043a24632bc1f9d4ec1839fe7213c4f91050bd03d6184efc2cdd951eda8414ad43f77a343cda2557cf02480377c050240b96a0de97b0b6e316b489c53b9352f422dcbb73704a82b46d7b48f070657e61a9286d4acec23563d1baf6700703988714a1d1432811c3644dd544ae96d5b134a29a59147f63b5db7323f11c956f659fbd9b86d4daef4b6345cd509d847cfbeb327a2226ee8b40866d1a18e4e9d688fe2db6757275d5dabd2a013ccd2a260b0bda98862e3c1c9b7144f3ce6d58bae5569d7a2682a78c0b60fed6741c5871b0f128875849c14cf3a8e4e445fbe7a0bb1fd4434853c8e261fe874f7668595c69f18a28dc9c636210dc0b7af9095d039180bcef78cdc724ee6cf32bb471ed973946d629bc455f13ba13f3acb1693e8a2b2d31f3f3601716995d860539fe844666012ebce060c2e75bb43fda252ddd2bed92be937b5c54e3a866a304ac99c7a527adc957db357f48476ea43fae81a9ddb41dbb4d35571aa22e643aa631e1dc33e55b4ce535dd53157e29a3c534a211bfde01c0c00e1561843d2162c84e93738a00f2522468efc44e9564a280914a3253d3eb463c84528b062245ab21c95467d8cedc97c54c5f654b1bdfb91e6e3c76e8fcd7d6c2fe663f45454451df5b53ded63f4a89f6c28712b905c4d67b1d0b295f9ac3f3fa787d4cb246201661561706e993d42a46d283267661ba702fd74af40b2a58a6e9d5d53153f550a996fae82e6f67be1d33e55bfa079f6a9dad99539bb7a665edcb8e442fcb613973d27611dd3318f03ac637a7bdd47ea1d6970ba36c57ae68373903cb75a88abe9d3869f73b219571c611db3c71268670fe6912433dfb2e1c3d32c2e6241d1cf39e79c4e3bce1e264c9c2ab4116d3584487a4aed7d9317876ac030ad6ab54621ee166a16e7ed45d1287a88cae212ad552c7e3d97bae4bc300aa13e8c42420dd670a9b7839ee3c64345f92d7243bf35173d1917fc26b9f654d5b98a2c9c3c577184f4d153d56fc7b37e9b5cf42e145ed04051c623918fa5a2f0f98d7211a82806441fbf24fd48b0dfc07c2c06e9378c8b1ef783df2c17bd986f8fab98c118bf655c7b2ae95cc5959e978e7aeb690fe5b78d6b4f5ece6d2871c32874245bd147ae9a18e21c22d93239ad484f8f60907a58ab3c0d6af0086645133048dd04d4bbfaf5fb4cb81cd8aceca91531d8e2c31c4f6f4cdd99909cbe3ae6492f2e31d460155790f8d89dd07dfda290d7bd66821bbf7393877c04c9d2d2120a4ab00eead453e0564c415c51a742a9fa851126aee217c6163cf530eba20cf747839dd7835b3db442cda24f8b98307a3af3d463528d4fd1d092252b472a789e72442356adf40c281534ba093f6ad2e98be78fde714e741b550437d43cb3cfdcb29a77ed6b370b6f8c3ffda66adc06dca8092ed8fd5fe3cdd27c736fb12bd39239dd68a7b36ddbb67998d23c2fd49c7a187fe62979eb25918ff9903525a7d3f6ae631d9189c2b8e11cb60e66cc4e63e08f5f4863f8c83e198b496cc44424749dc943d9999c314de34212429c8f270fefc3609e218075b4b3635e02188491e2dbdb4b883cb22f27eee8fb31afbe2bba07eb680f59df1e81ee04b6d7b82f9523571d99074edce1d6ad6cc7892db36cc339faea45a5203c4ee46102133ef00e7e1398f88175f08739dfde53cbdc7e66bf7893d5df4e31341fbf90841ceacc198e9fbe135f4a0efcfcf88675c498653580ecc6ee3552d7f62ab6d8c5833f14c008ae90c6b787fd99c0c41306f9e36702133fbc83bfdb8996be584715afce12e4568d2b493d1400eba641e9710ecb020c4aafc12cbb5980592a06a5a71afc893b4a78e932002faf742b7b45d1721446a29755d0b0e5e590e95505931d3e8c5682c2b8c44bb75805d25f31186ef046c5ac200cca1fedb225c4149a5e1e297d8c21be5887f42dca483ffbd3cb3e4ae1a4b85d3db6228928c88d6c4519e2ea030c1251c04b299914ce7d340bb2d52ee99bd72e229a2bc9a40cd75f5a97f418247482bbb9e609893f72f5ba5f04922ba945280d4a8f1a11377e3741dcedc5392e8c20a8598cc1c49f66c5339e7e304357e6b98a255cde47531ffaa4c14854bbbb018d1e7b809cba0bb29539b54e876818312ff3e859df38324b939476458f5d99778363f3370dd2fec06e07b71d89084ba594c47ce6e815051ba4396ec00629751f5d894882196905604e9dc81149998fc8960c9d08e7784c3533eeac2e3d231a51090dd21c393a9d9b326e0bf34310ccd12d231c9106e90c6ec848d4a94fa05b725e9fac061bdb847c04e39bdd1ac66357d53a9b65fe999d9917decdede64e3b1d2931d967ca5ccb92ccf7f9cd6d5113afdf744cf8e103e77b34ab88f52dc8e64c6e166a4edd84cd4fbe39f785479e73188f07c6afc773fdca158d19bf38950a7dbddd655ce67b01c6a3b38b7e617c934feb27cd4f9e2a88f699675f11d3a77de785dc9764fee6daa6ca7c7e66428ca7ca3e764d12dc1f9f8f0689b8955df701d8c7d1adeb0f847edea871b64e23662d8a9a866ea3caa8f48cf7843d0b19a2110c000000d314002028100a06c54281402822d2644d3f14000c7ea44478509a4ab32c876114a40c328618620c20004044606686660402877307ed8b8334560ccea41610ce8160d270b2b2cbd330485183a400072eba1382b1e4760861205b0baa36aa81fd256c69620dc6e364bd52f1eeb92050d0efbd5204d6be66306bb36a36c86e16a7d0c937240bbcc9a703efedfed5f08899dedafc41f3330ada51af9210b5587f5d4e00481ba81954daf3910d40b604ad11a2bba808179845f821afc464b3de626a25705be2b8030949c67172f1959d035303dfa0e1636f3b3176f6ebe2061f64ae05eb59f5f8bc0824a049acb41fc35f1e68d5d275a0f8a3cf4077eecf412861b62fe7a0c460b1038ccae309f398aa8dee0e771adfcfd16e3a9d051ee4020a16bc3f3017a67989c97f30b035e672298acacf9ae9c7de042e61420de782ece6633f162bcfca9ab88c96bec6b966a4a56b2cbd7f4361c4f496406249d9389bb5fc95ceaf171014b9b90974dc808938ee5523fa18f842b8d271af78f240eb4370092a92e025b0dfa4960c0e11994ab53bcd8ae4d211970f72953540df4f904391f057fe9f3ed13a3e945d3f0ed85082ede7346f316230fe54f607c5edbf19c32215dc697397c130e3fd82b5030a7b50c3473d19b84ae5b6553048b281b7cfe980e8f9510f85e7de36e60233d9fe386797aecd0510fede4654be41e948d1e3e15049171fcee857733fb29500b5548d61bb132bb841c09186db0f3e5c416aa33811b13398615e4488b50a4710971d84c5903d30c08f9f55edb1b082f629ff7405fab1ad9a75049844c59eb36ae6c2d55a11ca8be5611bf56c5641a44a807ed5b148c36c9aa871e907ad0b3a4f8ab4e868b069857ca01b178e59cfcde6c5373cd13453d0f0fc8a9aea05b361fbc0e790f4906fd6857550c21bf1b6a060da0f24657577d13e3c8ca25251a515dc54d07cabde3b60408efda2f50dcdb704e55ac8d722d34460c41849cb3f763f333f49e4e6f1d7c0884e4e45e77663ec270f3c7b6904c2698e49d120ea277cfbb5aa8872cb81dc9048f55dfa0d3ae59ba86390ecf546a2da1f8c397f79867cb672f7ffa8cd9c234909854638c825a6a201a028d62049058fb3c8cbfbc3b52350d0bf388b5256013eb6067cfdc7416bcc503cf0bf0ef23d9d86a331f0c5c93e8f45e26cc272cf550f738bce274506e37a257905cb89513844074c543dcdef91431a48402155a8410370960305e9c943370eca6c9384789f0ed80ae5496a12a4e91a3bf98ff451f118c5be947530d4da0348af8e4b7c5e11a8f59ee738d0fa1f61180e86735deb84facc77a1b69c83f8f9900ea80b97af83860ad1dfb186c09d42fa10abaf1723d6c44e11186488c5a4b783a4776b8805aad91745686782be1e2344b7690b0c772156ba07a57de3de86a486f2c4dddd46160e28d24027c0ea99e01c85f047bc0c8cb5cfc8bacaf9494daf1fc4363ce33c3d437f2239d76767a0f072bcaa5468134b5ea6594208856cabe09367b62b290eb7f58943357028d400e806ba3b3a1a879f5b52f940a8dee0e23f1f7ae68305e18c10f0263f6dbeae6fa2a9be78151dfafaaf32967560715aee362cdcb7c56eb1386a4df4a06f0af2419abea55b71277008c5c937f40b591061b254569fd2f635b4eecc865e184804084fa51ad36e1f0bcbae722f849d08060031ba8d57b1fe7f0b93dc38e066e8ca166a92939a21f1733be8554f9430c77ee82a42c90d94b0ec11ff7501341e589f279c66d9c00d709900c62e1a1617cb1960ee43b7bc6a2cac59afa94800548ede08f7bf1422a258c9d569fe5f8ac47d8dbf0ef527625d1304d5f42f8269f4204dd002286ce30c162d298a69f0ec024334b54130d1373c2e790febce4b28a2cc2c4c5d2dcc5973c5596c6c0394de3576e9f91ee8fc8db331b2e8a26e5e5447b766dac7b1083f89d773039e4fdfb6d778715523f04c574dc86e75abfb967b8c21356af50e92db74e11fdf01ccfe718feaad885fdf47bf6056a65924e5c6d52c446de0240242ff358bfabfed0e00fa71153fbc7ed497001ead78ea33145ae4c19e35fe288582238b33215c94a16627cb96c11e6a09b598e8091df2f39096cfd400ddf4dfb17d42403184437b69de20edceecdc9ad421bfe870200888141a4639b85d4092961c1dc694e530db8ca9e24077ff26c51a1a6901b7d7d848737fae61c3d4283a5891fe5e60689ac1a70ef0001ac6d130bc423ce62ab59b43c301e7742edb3cebcabb86909296a444b7d94c7dc0a52ac56f674dcb79fe581e97c22fffc27f787ab24d7e33fe2d31b8218b83aaf7ff5d190158fb3d8c54c69c08062a0cce0390383a72fc69e0bdb20891d6a183492d530bec184a91ca5ce31cedc3ef60f2def1318d6c03a20d04614eb006bca7e5217cc19e144ab964278b52f89e514670f45342095e3ed3c78c93e9602c10b71187d08cc7c6f14c24bce2f52054bfa3ceafcfe302054598ed84e4f8d29c30840120ae161a2209c80e056d0dc562314c8666550b468976f6c87a613363b6cb23d049cea435614afa9d815b5009d6bd47898a308549c08591680158197f5ddedc391d0bde11a8fc317a5bc8e6fbfd0646d0d5f25afb5d115a4d409eb5549179fbaf8d5bf7b87b6e2a8616f004abec32b0aa7537710a71e1f97866b375fac7e2f58cfc18e8d58f139140e9207a9306a0c0befa1a82e4ae2b458e74feabbad289323fee22822418652e2a3eeb0aca3aa18c2226b44154ac780050c4faaaea5e94926a6eba412e718ddc1297ac4230b676f749f545b2bc2a6bf0488ab5d2c8328b16f5dbc5c812712eafa08057653d31d72023b169f850e6dd1d0efa29cb0c404d2e3ea1ffada35b288216d4237a8a965233334aa19989cde89df6d61d80d0b64877273534aed08b286f2579879ed3631bc2759da65f402b1517fbe9a413511830f67645d406bf34a7b348b0a681043550e3e4f8c38925faabe62773630df374780ce3c3316942463b688e5f6898f18f52e02c0bb455bf1f6bbcf063811adb896c7e45f26f7cea92e8a767397450c773c4380048b889d223dbc278a09602b16826b9bff52dbd7a26116e8c66daa56b608c99fefa6cc79218ff14de8abfd244973702444f7597e8804b7324ca624d4a656c629d837a37b3bacf8108def439e3153a10ae03d18124781451bf554d87b86d7e100762d368409a7e770ed03eb44f74aa9a945b2f0b05ce8e9bdedad79d5ac1dd3576657b4ff3834d2861c60930ccb75d29dfa7b8061cf6d06b3a3e5c617ecec2a999fcdcf8f9d516393e19073267d224e214d06610735e63d6eeb4a49fe0e333a0b771c1bd87fe9ab98fb29d0b4a8e9487e04616693608e5e292afc8d46044459e4e993c8fb45d4e950714bcdc9054fdf4c4567e1771628aff91d9e2c8a17384c64c6be29e4a3c2c4dfc0590f03b9365d03fb900b39f847f782251c50b56f028c941f121539f26eb85eb60f47c203b9c8d05a3e86a2c35ec02ebc3d72a7e5c2e941a7bacdd5813d12e43752c711a8b13d33ca5d6167e548008a43148698146e8465ec19731db9d218b967293d78e13a4a0cba475e6d143464f48ed9c1888ba968b0bcf14d7a1bed7e360b65d055fc095b3aa68e81da4974e54f42905d113e69e33d3ed2c35c3f121628a9043b47ac036c5933a517ab294b195fae568818c18933c8cf50c3175acc08c7b0d587e6adca90e2f094901d8ab0095b008213b816df0b99c38a8a758930c4bd15ab18d1b9517f1fdab6da0db5c690e26f76bcc0814197c822909f80917d9fa23d5b1e10c64e34dd4ac21359efc2f13df89e6004a54705a0538f8311ae0ef0aca1c9ff51d934053c1651916cc38db41dd46f6ff2ffde8570654560ce9041c0c97406c126e30b3b8ccdaa715d400e0656a44932b348fa97257878287e600b1aa1633c210a52ef91ef44f769e7d16577cbdb5117be782b45de7586d99cf4118a72fb92b9703849c1a8203b7607906ea1900e597dc7dd08f069073c1217da952f1785089aeb826d7239e31ca0cf33cafc36922149709710df6f159c59b67c7399b3242e3926ce2ba023093f50b90a8038af07aec7f8c6fb777df804e6a6f4f1d89024dd27c4e30c2392f230068190739ae3d1b97db90ba1ec178aa8c70044afaec518e531dfd0ee21456b24ebfb047e24fed10a1dcfb40ab1aa54f8060655a3cd41f030da2f6c28b0640b881692bf9f5a9970f0a14f2a4d5e40ac75fcf93f30681f49b508ae0aa3d94aefac90725144cd7ea5edeade5f4cdb7ae0506335bc79a8f53ecf569e17aac0b108539cae5d79e772f8b8d485af1c4d993b1b8e94a167cd7188f2a0ea54678159a89e4d3c9f86ae27bbacc89899eeef309554a214ff37e2d663fe79a5ea98745401ff3c5a1e8563fb6158c2eb008da8a7bc7668346e8e4fdf4911e9c82153ab972078faf7d70dd93494c8003747b88b4ed4db4cd5b66aa5c07ef475a9722297d8580955fdb101465dbee5ea93e6ef801fa5034cb548756f3ece33621cf79c8b681e3dd18691a0102de7fef6e75c516fdfd2f7825cd093cb45066c995c1c9a47b832f0d8141ff2c3849c3455a3aebd6d0e828d9b8100d942c67d07e6ca6765cddbc63bf404f81b2e2fa7da39586aa2315e864664e6ee2a1abda62a99128b6c18ea5f4a9ad007e6a2cca632f62beac96596c99c72abdf2e4b1a340580fda6459848b0bc3849e77fab9c03a2a872b5d8a72a364d0dfdc4dadb1697add77994444fb7ae4b1cb40bd16622d141d5e089112001d1389177c1f96ef8afd2e047f8fae29e44c8a6d012628546c71eccd004729d4250b51b032c81176df1f94099c645e711fea77d0af9b62222bcd1c7b3c4b0c8ea9d35156ce2e369e542b2b8e0c74fac0f891a7804f1dd01ac0f1f1d2e98a8580cf01c6d0cc72d67230c3c7f2a80bf5f3583eedfacd06dc28606bb16842aa2ff90b183dee4c76d69fdc98f48b550b35f65f3d3da1936d6d3392a7b0e515845d9ef065104ab468adfae0e83c8f38a0ae257fac6fac93b87f46e243038d1966fac3df052af4f738c427982976f73105b6225c079d3d25e667ffa29fa90e5e2928472f11f7490133f531da345f9312c07754b143b0a43b721770f8a2b3033cb90ee67477414260116df7df8b4fe150710b463a91887d1faa2ef5a5277ba035181823e3a32caec45abc2b89cf70246517ada31e24cb4204b0a6f7344eb655845f8fcd4608f735fe1b29d36a7c15eca5f05976e14af5840825c93fb888d3f7d48f5d19ec02a92bb47ba7505f9ee4cbee65970ad406768928de229104115cfcffa3e43a0b1163a357a6286f06e5efa88b7266c8724651845ff0c13571a28554f79a88f6c45caaca74b8ddb13570387f4c8e73a46c66bf8a9881ed1cc9cda2fd98ca0a1e2a268e14a4fce4d2df87d2204962ed23f9e820cf8344ad6a9c1d9c4054ba537b02e6c369693870472fdec3548ada467b7a01983a4bd76a28379c0db54301a4316c6fdfbb9f645af1e97d3d6faca4507341c874bae13affb7581b20850ef9981172c5b268ad2fdf017069e947805cd43a44eebb15c172ab66ede934f280a3bc389cf1bcc2d3195f7e1e01e9e4a345a8f5089cf4e44d76e0bfb82011e8504c881be19d87ee4b23771eaaa8ce35c9b5a10d90be1dab7a93b1f06612681af984e172b70e4f133a2e5bf0bef1bfe6847acd2d864258de21a0d2140752aad4ac120738f31f8d75182b319131f87b2edcfe305c95c9e39540db8f26f24cada85a21029054c777d19e62c4703dc2e70f30a341a6a19a5eb22ef2827e2344d542146bfe3c2782b66d056fd7e5d1311318bbd99881d86afca32bfe49c59e30b255b9f53cafae7e67299f1f8f0c7253080e694462868a46be3c4690bad11ede78f840210249ec29e604519c2a0710d98a0d3c96eccc1adde30a5f2e668227b0b30e72136735c71db9da18918d885b4160eada49869c510dd6968b5621e06ade3eda12724e4fbcc3ce1f5c72f9ee051b1be545cef1355696cef9c44ad0b0e3438834c9ec2ebb568a479cc9bb2ae0ed80837d054c6ac04be3c9985bbf366a366421a53c907a3744cc9a9b2ff6476b7146d1990498dd14b8dc4449619022f3623a349ca356224b156cfeec06dbe59a08620f44200a57943a971c740b68464c4856c58aed27ff6ffcb93f24455e7fb27016290aab036c547ec09022aa0cc1057a60b1872fc912af5d1e3459f78b1a04f6c202084a0fdbe13c67cb32ccfaae11db8e16d57c78a3ab3438004e4367efc9edb20358a2360339be5f43f14410846c6857cad9377d51d0bbc35870c878ef7b333d1a859543466634015feb31080a7e3f45049c2c2674462bf675fdd21c20df12a022d5346d75936f32feb06936a566a0ebc6c8aacb81d6a202ba78fa9d136c3a7434ad7485624ce4541973c5e8f232ba7d783a2e5482ff9bdb98ecafd930e8df0a0fd608492b8775646cf9c94c1ec5b80844f9798bf2bd629410fa67a88f200f82cc448a9264e0fe33a3bd7e60d9c4e1e47c5498c0102bd14056d055011021a4b606ec36b124ec9c4481bcd4166cb1ecca3b3e06a610ebf44c2c9c6708b0130864eff8d5ba0f83ec36a502318438624ff3982ca5f6185608e5fb811a66def4bd532ccbe0f92c370d8d876225c4379e3669cfade531d01dcb95d25be59b26f72a7de710b25cbaaebdb6c13b51b000bf480fa58bfb83cdfdbcca06e61bdace5d9f08022fa83e03dc26fcf6dd2f701e3ec10edbb22e4dc9e5501a6af5dfbc8d620531467f40f766c0ea9034971f95ffcef391a1e3a997ddccaafda1da96f440ec1511fc3802e565bab8959c9127367e16261904491837595ecc6f0d8d5f98ca8c2d2d350652f3fb193bcc7816240bb2b2b21123e6b5400c062df3cbe4bd2ebdbbf82cf40115986ff5caa0bed3c42e2a6a04ba96ffe9808554afa1c1989a154ef464f39b99a3f9611a4db0b8ec07f6b50f8a127ec4887d82402931cdc4f41be946dd277b960adf73b8f6b3b27d7e265069709f5ce8607e73d7f64f8b2e8733ebd6d56ca36bd649cca96b6ae1a5c247602da871a6509e0e201edb7e4050d36cb77969e695801129f28ab0cd3dcd5803e8d4469d46d1d298ccc41cffba4b1430817403107fe13bf7f690e575f75bf39a062f87af7d146ad8d8198d58b6c0f461ea30bfd23c018ddd4226f82bb4b2aa43c025f3a4afd157baf7f0297314dfa641a94fb3f289fb47b555d7f78168199d9528e7b9046e4e42dd4128c4aa3c81b3c16d4f2f033e12a2c15b0522369a992a84e1397b6aab12ab1cad4e039a748d739ce2a884d6eb65673370f030832753d7f69df5cc568bf940f01e3fd6a9aad0a9de5bc641d55249ec624fcd01dcbcc1fc81fcdc81749fd2e8f11aef22ac25e87d0cfeba10e977f8ba3b2d52fccb19262c3487573b79bdd92d90d12e08be2f38938eff2e7840d763f279dcd8fb1bae8ba442473476c86f8e843af5b8fb1ddf550ae32900028ddfc4dec54d14c28193f0f21e150cd50a2949c1fd406f1af8ee3967e4ecd5f71be094126b06d7ff785ceb7f757b74157dca0d6d69d8e91b30032a5d02cfb2d806f4bddc53b0c5dba8ec8427662d6c452eebf40fc3326c703a37120b8c4a36c9a8d0ad2e5e89fda06006658ca3b4d59c4e079f0014cbb09fdef1f5c253345be9e91a98813697045a83206acca9bb92a2549dbfca3d413819113299243abf92c0bb8193c84aa5850463bcdd262639a252e1a84e8f539a205be1a2f84143d70efd98888940b032b4b913cd27bdc90847b7f8221481df5a8c6742ebf660dae7a713a4216bc6af3e6f907a473de904826a029fd042ccaacd672dadde13633b71fe262517852b53906796862adf8c79d4ad82ceb095d206ad9cce7b68363d447fd669ec596f2aba543b60287d4f4b9e8570c039d04cc597b407021e982614be9a4a34903c9faa51e08b44218f8137a66ea6a79fccc47598c2b29946dc58c6b7f4bdf308483306c2c69f85a8769a1ab72d4e531df6564331fe33e2a167c93e81836a9474a4a426c484a82e7383638b791d9da9e834e79b670b68ed8b51bbfd19443976666aad89bf089244a53feec7a4f3979734f99c464a0f573e1c46c16e064b8aa52b116202407c699cc789032d076938d5f6d0d683a0eee68b916247757e971f4f7bda393d9ea28384a18421ea1570b567a505751d67511de1d37847ccd09fe4b7f7933a490888b7f128c9b22caf5766e9b4f241c243c53da0bb2f01c42b4e75b69f796f5f3ede6ce63fdf3b4b0482983db52c880e62f14f4af58a4c25f5cd028d5a9dc79a099f81fa0c4c6c24102c38e3462fb328b6a2d9449840abe64073d9cd813c23e760b1366f56c455ab8967f81948a0d49f688664f100a78b1fc680302b6d2d95e7011cc869c27ab88d7236a4e13e8cc6f2274122555ab5f193338bcd7f3a35c36662d9d93b906acbda0de3e0ece800a4bbe003c0a83d16b2a9a5228717aa3e875c9e295311c512f19635b7d6ba4c5ab5b43142001571f2cbb5e86d6ee030dccceda2d236738e22d5b8c340f78fe3993cfde37f7c36f0629580b077b3ec6fdae0cc05259471c82c2e5d9f0d02c98811232cb411f534f82b6a0184206098e7cf876c25e10cf6832be1d3af86dee7f065e81b45448734d81236d0ebd48b2c3c2fd206aaa547a1e2c0b9c9fb815ee173e5c1d038024de3343294797dde67793a8a12a915f2d103a866f9c268fc26fbb57e5414e99482bea1049737455e8c48d7b9faca52e47026e35dcdb44fd7002daede1fbcd324a4c15f9303d7d719d61bfc69c5c7b6c510d76d875e81cf9d4cd5c1d6a743fccb12b9f8c3d9d007e7b6b3bd1c519ec429b9384b630eaf20e9e05ef0b8e8a4b46e3cbbe948c19ccebcb8bb2124c993787c4aeb6c88254ef17301a9343a54ea7dd0369863032ae7380c307b58ad7cdd509b3a58d326c1bf625de1023cc701c1e5787d7a9de617d39157ff4f9b4ac2ce9588b1ddf4e559eac5110b873ab175b4cd2b01ab1667ba4345421a3efc53670ac262ca4f8fec96a70761efbee9b5dff95cd6737dbb1bf5c48af19f43d1f99ac6a44608b273a727455b51d3e112273bf921239f1a160bccf47e770d43bc81cf1ce20229a0dbe633b78406d48426b4995c0b89cda1a29aba7bcc01eeefea8508ac76894804ce493197dcc02ef4c5b35ca864b840461f004b015c845c0f5fd9c724590c16c8cf786602f6249c63887aee6b2615541959abbb1791889003f19d6105768578a9aa1d3c2dd09921ae9b16582c863b6500fc0e33f6775d9782c5490a1792d91a7286d07300c62c0f0b9f974d63b3c42d092ed29e064e51423e62c0d69ec113dc4092adf8afb0323ae56bc4fdeb4747f6fbc2c0664e92211d0d3e4dadd9fed80340a08dd94bd821fb881e91d213b8bb56413230548899e0b96bab993e4c4f095b9fe894c89dbf12fa43894634e6f74e0aa7967de992bcb6c35bfddf76866835324ba0edd9e3e9c8750d9355dbcd8583f34448e0be337e2bf0714a5d494e80952824266c23efec1c50a91c6993056c133c775badae7bc5d5d7d5b516b72254b53c9f7981faf164009fdd5d57f67ac13bc4611eec86f5fc8572879c21d0419d0a3d1d048d45fcdcd0eb9177ee0b1ba0eb977991c29e0811b1f5851826b9505eab6216b5c3c7eac4af4757e52b616cf58d3bf1cab1b1a89acd9449d8dbfc10cc6f409a32790e26beb293011e6440589751d0e2398d91ab4c5eda3102cf5d078748d6587f674aabbafa45e4ab6ebf79c92d21f89065d8796378e34e4c1267bd24f4235961c6849abde56b9f66eb4be931638f4982f1817eaa021a10a17adffa6baeb639fc562f0b0da967c155c63f7e66fd2f4cc2bf6f319b38e9d25ee8f21a8867246089786b028b04f57b195bb059331c11c56195c1c18bb181f4ff0c093f22c5aa0d422ddd79c0453058e78d61219fb18313b36daa277faf02d74b092b18bc381edf380fcc21dd0eb9526bd1f3232aeb6cd33187a88dc3ea1eaac4ad5e271877a5e257dce727427edfa6637abce8c064123a04ca7e6a59c2b9b0c5625bc27c6671da20e6ec7975b8bfc2e1e01f88489d2f40fdfdfbba688945ba380c147e89eedbad0b88d8310b005e1b9058a17e11e7f67bfc8f1980115e11c44c082aa535597509612f7927dc7319b91a20dac92a06d01f5a31bdda9c2150c5c2ed01fd1779985a76e2002933d829ae0abb541b06b431e13689d4adc6c4bd8c93e020d41cce78ccc43267c6d07dd1f499bdca8bcfbb50d0f1a53c62f794fcdf7d22ce6ec5935a7e0438bab54e82635d524c256ab22e909ad8d6c152a1fd076099d0c68c7de5488f9043ae341d3844eaa88edcf7d3c9829b7ca060364b1acb12649c41a0cd7cee4c04bf271baaab1d049f9e0c87de92393722382370340e2c038c634fbbf6c07304be9db30e632c6be3830490ccb41c97dbedea17dbffe03a555827bdb17eb57da6226bad6e390b52b6216d69ea68821cbde4230437dcdfc5ff94dbd172cded0bc5340fccb68fea6c9f8ddb1b935b86dca712d299cfb7007811531a0fa7bb3db377ba5e138d25502c26f0d968a3a0ceaf3c1e02927e0a2075a670b9cfed13a05378c6cc051cb045a33bbb3b9af437534b984f96db550da3eb8d66375a3451faa80ca1dd0590346d12b2ee924847a9511600bbcb81dd01556171c7ae4d3d7641a3aabd56b5f80ea8c5f31c6027e49efa00ee29183d55a25413df243c18e3563e8e27e05e8f8ab1dd7fbddc81b784a777c18b362d8d4ad8a7f555c1652e8216f6ad00a33b9f0b8380ce50d964da43b6468ddad9534617fbcb7790f3b0b47a744200324f472ff222e65ea77419bd5a4261f22a625bac2a283e57e50c6a8c38fdf4312ed64d7145ebae0ce059d87b0d95bb216cb6356c0eb9441f5d4eadfeccc29acf2c1b773307e2df84d3da6b2ef0f34b8b265adf6326b30a9ace8943252b5ccbc44d81bee23d65c28c5901e1d9f290b9c0cd30b49d2a6706016d17a101189eff6288ddf18270f3bd0cec28d3934bbd0308b5769bd0ad044bd5685d523ef521f0655b1e057945758df0cd36edc0a665a543976d0619e71ca8c91fb80d1f3beee0808840b9c67de075dc6deb414a560b89e93815e6eb79b358b45dc8ed473bc5d4dcb6acb07db926afb34bcc9c50b9a986c488584f39ee7937e51414401746e03d2753003882f2a6d703fe6070cdf2d8e5389dee68be769b95202bd15336513a772b7bb84038d79c163e6d4963b6ad22bbce3637871a5b770cb3c3d0e14401fa9c69d15303cc122c3456a48f17aa365728ac08e9358066947df6ee621f9a460b797774aa2e360ef8b0ae237a00fdc6d9bac140ede54ae7d9e2ef1440a1567d86c8bd5cc5fe88d9b93bd600f8fff669e76dab4a4982e5830fb92c5d2c0a844ead3bb2e14173da9f798e8ddb06309289fca1ebb4b367864343518efd960b1ab0303c4890c8fff5315ebedb4e3242b96c44b5d995afc1bd0c50efa4c35f4ffb9c2a1e382af112540462324aa0dbff24ed3b6f2a12eeb4f34af54031bb78e8499a86c861dd05ceec07e022a20461e53d8d0b36a9d3b52940243dd0dfa74a8d1416f08e72806e88db59bfed915d9219a2ca19b9c7386aeb61120b8e5da0ea022b91d8d39b303fcb1c9a13a4fc5ef02b5cc0e0a93fdbe293540b5dc08ae53e8878572cc62787fd227aa12b7d54cd0177a4cbb344a594e0c75e4bf95c22e1616e0f68b39a48fecc3aeba3b7f6fceb48cc996d8ac67d7777e4ace38356f42248f3d0b4c1b241f590d1823c1e103db0c0db628b6f632a010c2bd3a7b9490e3078ace3819d9eff61f261318e82e5cd4ae6af691fd1e3b69f630f6c2c672db83848900352c5985075da0fa14f28ef462834ec59eb12a4aec8d3c745dcaca07efd88a93f6fdd035b91c9bc6b55f6101eca0b852bedfb8ad0d755296014c3d5655575a01590a37a05c6040534d5dc4c1b1553bf882b349497cffa9b7313831f725b1347f1057f1875a1833ee04196586829a582a58d68fd264eb81e34e468fbcfa68743b65019c721a47a41d62d778fb7f5b32fd11bf70d3f545371fb487ee1628503d11798ffbe11a35994a3ec9f0d2317241d24e9e721da66a9d48980f164e8e5eed3e82fc2db2654f5ef866a1f2045c3130a3082d38a1d15ce7b8eb6012206940f480eb6a6104ed7c011dea6e2f9a791b951517a232f4db2b773784b292bb85835e32361eca92ffa710965b55dc00b509a164263228ce5c49eba4bb4887a7966aa8f4adb2aac25dc207ca0ac5deabd67094fdd19c9555fdaeb32d7a51747335b6e1d4dd80b37706b541fc0c0dc6e55afc26b4ecaa22f3b3524ab8d1be211b387ff74a05769dde1b588c1bd51a791dc0a678f8c055c983c2f26380bb0b59bfd32258fcd43d0150d92c74edbf26852947ef4347984b5a8e608b3fb908beb1a680c690de02a8d37c4a7018410ff4f77eadc793c53a7f6e3d8b54a64b4357a3441d92bb045c72ea24d8183123177b178a36778f5c04d07ed74ea087cffbda23fd97325ad316ac8ef1f4a3eabaf78166e0ef4d54a10c51a8da0f17c43f01b60cc22ac0dd8233b0b4c0c3902d389e42045370d16a8f5ac6c76417aa40465f4a0f60d7d7ff9361fd42a2c6c6785625942ba7286ca0c2b8a9654c971d34712f9aa08e81750b63c611b9efc8961de53308a153559a834247c41fc782791cf2a859352a92338e920f836fc0a5eefe64734513277c5f19cf92ae53a15f7cb78ac79912afc56418828be9c33b36956057dec091b759f1aad77d873452f5886afbea7a2030818e04f81802a4aac1d41ada6e40e619c2a69bf8ced869099d185970bf99a2136b7a3716342488f96237d4f07825b0bc291576a810ef408cc90845ca1662af045c5a65f9f4ec001b869d5fffdd8a4a1889729b276fee7fe546208b9f45db8dc654b4097b5ed5100ade55efdd9ee3a2de24f33810202aae033ffea58cb54471154c83f703777491d6562ea9b8e983964bee8afcd3f6c023f494246a9f02b84f78b960c23215a5228cd28d5c5488998e4f1ed214fe9f371ecae6ddc8e019d1644d55c16a5c4005876f3e172660158f6af327b34a2c1f4a8852d7cb9e0a1850e5d732048ce83c1965d8fe4d5d4edcdcaccadf5a4eb1c64b621f6564fa37d90fda4447f7d149b3fae1e463b37a34b70f3ed9af4e14f7717a4790ff73be8a601221b2cb1e9821fa08dad81512a0a6c13fbe64c917025aed98fa978774785ccced4efd24edd58108b23b74b064c18c9a554e02494b1f4805bf00a1a55dbc028db1b376ae20b49acaf2bef9c0de17194211a2f5a538709011a0d77dac2aeef1ecb20e6e5060423675fc9765b596218b1a198ea1c5fb7064439344cab816172e18e35d9a96879b911b31e8823dea53858c79f094aca942f4d0c2f859e9dc966722f12d436d3c2c15fe4172d9b8c9288f70802ce92064163dc4e450e31ecd7871360e5c4248a8e22392f2b465ea2a1ddcea53cbccceb3ce2610450c3b4b9b0a8f890d50ded49d2613a334409a0752deed6bfbd70a70e335d783615b4c81f5f06a57082829513ccc12b86d2998361fe2bb17815571cb80f0eebe8828ac859c59d62fb4709cfc40bf4c4eaa99389513126f33a302bc1c73d758bb24543b33cdb301ace674c4439bd048136c1c46238918b90978e07326392145780cbf988e0df81d7d433583ffe89720dd3da5da344ea7f97149b383017c67b3e703c929e2c6c8b8a05c13a9360e097fe5df2dba29bceee1c1e1b5c84e8281013787f283c906f7eabbeef010b9e3d12f8019239d371bc4eeb8f4dcade6c14bc8cf89da048dd6dd9adb4d101ff4d5acd04683ef5a2c55ba65bb8e35f7eb0d097d48cdb6106d8c4a249de52ef6a210a6224cc546cf92aa32fa5f142bd18a885703e0d5ff6266d917a7c3856ef9e7f08e99960e9277c7ea395cfb1ee8699d0329b29850a362672c16000010beb926f186261c85f2bb718a1f262be2784cec9bae2e4fdc3c8e21a5933bd778271f21856d969d015b0e2667db3e3b309fa13a5b6cbaa5b93b7351db8d3d98a36d79a4dd87f7d84091544257e7cb129cd49c46e71eb54ba5db02e72f2b7c7a7748ca96cfc849e12b6ad8f6d0755b7fd107a9e7319036adc303e32372ae139a8dd930363b46a40c49a7dc0d08a0afafde5a597ba120ce99b11395e492717c26db9a7419dfdb69be36372706e0b6da0f4e87a50212872fc115a1991881fd2c6063a47ffc934c0373fefdf193ee8a4fa2179998278c9607c23ccd3bcec4ef3f4a179accb05e2cd0d39ccb001f11201494898e60cc1fc54dd8ddceca5133e0c97a2961b091a9d6b4cd405854e66e0d1bfc9d721a65040d30ec96aeaf7aca4e69db87ee1f10d49bb1259c6c801f87aec86881afc7af89c375f4ae791cb13405138953c35677e5e6bb7350373ccf22ed135ef7007c90a9928a3fa8b0f8d3612911da2d7bdea030c9ee1872f0481ec5bf23114f2b51c8992bfa9d99772b8f630494c51cb6bf330fb1aee54c3a9c14942c4667c531306d2efbe81ca5403dec224095dc4fc32ad437bf884852866eb946770e36576cc1979ddcb344dfa2e3ecd4308de486ddc5492140afdea6fcc9f2b2a58c64c3c78a68d03c5eaf57b4c1f2326f94f97f383451ce757a92a129ec0f18af3f476015da437a3a3b1950890cc4632da73ff5ca4742f19a4b004851dadae5d589cad902e29040809fcbf4686779397d09863bee98c50ec38229699c96232a9e780959c2ce8333f7ca0d03a8741afb755d402ac36ec345752edf38a228a793e0a46ef35be3d8c22fe2f284eb6d330a53bd1d36979586f46110f0710619f68d1f175a0d4ac16476e0b8f209df13ac9a347528d2e99ed247d78f72b5e6d52287a5c3923ac757f47dc3a855e5460c013e0d7ef8dbea19a77c16f4a6f8b1b60b2ebd71bae51494b973795d98a3656baf31bf75f3bc54706dc77f911cc611f738f79ae6989aefb35de57ff4b6ce750c004eb5e98555015a06b984447520099b8b0e9b7515af7466a5d171e578d278c8667cf2b319aa8658259c5935e40057569ddd9a47126423666bb906afaf09cfd3368b83661597b1e556c189f2e70ccaaec8cd20201999a93a5409dbbda78e9f2d8016a9b8d8e9d7c0509720257a920e93473a845aa419f7c7db2b29c5029afa5daf859604d06ab5ef891afdb94f46929d444542e00303ae18e31aa7add91292d35c4b0ff5227aa968d0080a028d738eee14e6fa1420bf6caa50788d0abaeef7ae06fb126703bcdf4d0b00ef49b7264a6db50ead75f296a6b254c1efecf9c89ded3727204593255e58706c7e34bb45deb3dd8a958886eba189e8288b53e6d19cd61251eb18cb7500ba1562a3778f2ddfe44afa9e029582a5d5ca5154b89a8d07358c0902366d0b5cd8990a019b9e41c70a62dee4ad91f8f20188b51277879a2188694e2e79fc1fc2ec84a6ceb1ad8f1116c272a3de85da59ee5385200f399239dfc3f82bd48d48c62ec6029e42d4e0cbecff58f431fee94555e2320ed15cdd10863499b7eef98627d96788c24449c7785e4b0455ad98dc74299ecd1e60d052a8c5a32cbf206e7f47cbff5625afc7f818c15e8615bf3c5815ccf729eefab2b2df456f6483eaee77dcc47f952f478ec8952f857133c22ca1bd8621e4ae76db3595d516ae1c20b3e9f5f9a78d5f860e391289ce9f66ce12b5d3194995d0ca5c1ea415b61fee5aeb1f2a0978061ede139317f4faecbcb04c5e03d790b2b53505d9f13d95fee470211bf3196723e5d36eef62a6cca4ca5ef125f601d6f948c24da7c3b59e5093a75b639969119c5dc422cf77f0731571d1970898d7f1727287da8ab15400ad304b48afb568ef9752c79e210827e8d09a49f0b9a842676edd641b42e4704c310a557d96f9a2a6f9e662ac19f7e03945c5b012624fc8de6d77cc0bf99c80c694b34a2ee34a73d95a7d24ff6a4530270caa0ec591cf19d0831d519ee64c59f1d20435a375f6e90d0669802a9fa23b2aea443e07410b8c17f42f7d86473534560136126cbf9f0a28cdb0d1ab8476f75202c5f4506e4d610fb91e575de9dd2d08c518d5568d191ed69deb9bd626bbae48dd17d13f893aa1199b604744760bbd7d6b0c8340361fbbde4779ee6c137242c85a3876988fbbd59a6e4551e54c3275e7b5bcbd48e05d349a897efdeafe64869cdc00c03cd62f84f1d105b50c5aa6ab46973295a84b63eed7191db210586db42c152c507d76f77a11ff6428e0fbfa6df8b176b29a375aa8a77e444250c8d5991610f5708348a7128690b05b3930e4afcac1a24d8fda38e288fb62a014ccec760be7c70de6693302c79bda1de11cecbbf164dd3f9e942b75700c8187fa19530611366a91b8ce5d8c59bb29c39f86a9a81fbd7506e2b0cce5a92ade1b6091614471564d8c64ac26089aca6655dca6d46a31498cb8718ba39950c98c274833445078762c674e93063a6363500a1b53fd6d684ddb32013daed806cdece488401bb3d4739eb016ab01957df00177a8fbb56fb0326dcb97cc06f50e8e87855e3bef91d70610098f365279a622e1488beaa933074f0265711de0e07b1d1098486ff54eeb002883f5a90e041c66f9aa05f203444d5bc2e5b71b440ae09aa27a116335c2abe08f3279e7dda2069624c4e8f9eb06d0c83ccc88a2dcf824a311ee39853359d28213072f8851c05e37ca054e04095e8846e33c53ebdcd8e427aee44a6a00c9bf6c040d63986ab508096034e40d49d1bc5168b5a65be1751739fa821024ea2f85abf65993274f2a99e09a5e67b90f6b2b3b971c062751195e276ba7a103d82e3020a8b3253ff76218b9b44f5ce632875ab4e53c29aad59fa367fc57e9f17b066b30c1a11dc80b8f98f31d03b2fe0b5d7e3ee4935968a95609768bef3efe8168066968a9d8747a8862f4570250123029a99aea0ba70452c4f3058cb584d06adfe4581a23afe4b7aee285779aaff00b8cf57e83c95d90bfcbeddd15b782631bf7f2f00e169797f93f3ef9847e7b6dde3db8a97417fcadd8c0fbd014cfb129b1761f3a360b2e4effbd71b36e9b5562ff2f7e0f8e1ad2e07fd832d5b72a80fc3a12cfc87a7531fb2bc7cb876da43f97b0fa52075085dfb0d4e05d9a1f3d15d3075ea44305f2c875af41c5e437108131a3fd444629aa161e133ba96d134542f9d28605457961ee14128091729b3ff451636c15617e0bad229d183d16cf02714163a35ce4ab67026c08324957a55b2d059a3d3f1e45288423d9c28c37a60ba7b9640928f13d4bbc7fee141ffdb155360485b1a0c8123d6ea7615584e965f72d094e5926e4dd55680b2e8bcb1057be0a0ade75fb8349a15400f0631320f4097891299ca2d240fc738af4c4a94ca08db5576ba6e7a847c0fdae254ef5b1db7db1c576e70dce333264e1a33591797ac60825c6df09c7df6e6a1b84c25d095836fd65f57fa7eb6b3876c22bcee26f80f782d781480409714649b753c3f7294007ce42e4b23de74f416eb93ae8a8eebb30d83d2e994ca3f1b911db7f10b55a51054017f6715ff7d5609fddb23a4c4cd88836174d26e0c5b60e4f2d30d78bc2e299a3276aaa203cae32c5fbe66c77ac7d91e68e6f8c8ed81361e2aa82efc36cf4fbd7f8e2eb818456ea08859430b2e0e6032daab7b5c02581e1051572f51665483491aa804d2602e97ee5b67e069702f788574227050be8425245833eb4b606520698309b8b527dc83f118f42289d48358b8e2060829fd856d0071a2f626ef0562719bdb3e7f2ccc59e41a558c4688d686ace305814ac02102ad3de562c59a316e1fb4d07137d5feb4f16a57a0f1137680e9a9961904e32b75c02bf88dc98f1de5e38d96a8ef13ad0e258ebe702e4eb897f28ea16d44c95711bd35d6f4018e7bf015b90e46f7e56f7d39490b9f7805523542724a8d6023091384aea8584659dd95e739a7e5aef15e1332be204a48dfc84977a73a805c757afdab29e3116157b98a76fa95cf1072cfe2bf31a4bb4cc7d05f19bf6afbc675612b6a66023c99f84a4c7508537d7c7752a4c87af6734e09bd05c7d96ec068b9b0b171cd89a2ab4cc474341725773c80156bc2c65171f4c4e7e502242411bfb9c98402ecd179bebd41f43182909e392ae09e36973fa74e3fd5e2df46d85eb550f2f35b6a80dc165f326b04b9dd99d33b1fecc0c09cc2db70445b3dd8b069bcc3c80370a1eda2b801211d6cf35626d56fc0c1faa6b1a665c02d2e2d1ec1ac6ce70cd8737c0d96b0ca8b0da27b4d861dfbc259c7486cb6c3afae3560a924f7a4a3d53c63cc32c6a0e94727b37af39cb51e2a13f864921415c350572f1c16da9a27580401375b0937f13138d7a8ce945d0b241d70cf9746af755ad69d0ce5bf84ec7a8383d207a86ace5cf235d9acbd79cf66dcc147228dedb1aa9eaa8b11aea98b495520742220276cd3e295cd7f3fe5ef9d0d98f3b614dfa5d2c0246574f8f32126f28ab78357bba5986ee8d1c721774f7abd5d718db24de7064c176893a10eaf31220a5e3046e02907839e4cf8949e237029271d8dcb6d0707738549a8b18bc31247c17c3297329cbdcaa6a99b953ba9c613cd15906f6c8d45ac02ef90844e0943b00231ef0fd6e4659fbc4180201aae3abcd5035843b4bf20115f424803be1bc5bdab439d2db101db8ed8fbf16aafc4041286e80b4f4c321c933f6c2d1fdb9de87173c1bc04caf789148ed31d1265681aea07175fb5fde75b6d87bbf4a543d2962418c75891b928f8ad67e10100c3cdc2d8aea014c5baea9a0242988173873376eb8fe2f4213f82f7c3f0a48329d69f7ff34cbc2944846bff15d8e7b64360b21f26c8be3b7c980faac29a63d4d68f1aa02bf570a547d6cfb61ea7d4c94242e3c97c1139785571175f9f85a6bd5ae654b4b9253fc9f6c61bfb21ae29800dd4771ae7456f785b1e29c422d3c0a9846ccbd7cfc69dcc0cbe946c276bd16cedad93e6b03a96e84a16a13f7b0a47ae2b445c81aa851f9f344e36e48d29cf86e282b288d78d94b8cbed22b834162ca7dda9700aab5f68641b967517b5b85dc3fe29d59254e57d01919268816b46273eb6cda14adccbcffd19ee3f8092ea4d54a868bd994bf06efa1dc9de762f1413cbbac2266865c67efe65cba1db0420fbf2104ceb3d5b18c474e038556a7bf1a5a6785fec6bc834a809e969aabb6273d0da7c1bc32faed286c4f20f026299ca66db9e0b0fc451434c8d7ad275a078a9643e6e9792efd2631d9249985fd42c3a675052dc97aa3392a3b074992df364951ed5319369155725c4dd23b0a8edf566cc0c104902d52d99b8afef08ce5188163327029b9dafcc3a3711d66e179b8198f57233594e775c582875ee14938d54697ccaf659619509f0684965e23b6d885ec42ec8cf2cbd6721a70d93d9115ad2a296b312be7b1157db6d1460a2de1a4516e0aecab8493a8d305a3d39a6beba53bf5e97e583d6106ef9a3fbc1f58710bd7f9284b31042479ff0328350b46501a9d3285bbe35d7f941634e897f2e20aac8e48def82fe7d786687a03e7e6334640b4bceba84301896410a0a3a91b593102848c479e4afea1143d3b424bda408d231b1b52afa90a37ccf7d55eba0afe121cc8b4b12dba8849a5bd86c1459cdf4a037400007928c7072c72cc55342d45da5c34a045da723d969caddfbd334f0e1fc78caab011b3eab6a4726f24ed53368881d18e824f9f775434c43a5f47f3388a621e3a3cad68413d0f41617245895c6e3c897835d9e83406b20cd6b88c6ad3a07399dae2dcd106c574d47663d299798de6d0466fa835792d2912619ff548040b477493229498382c438525821537502e24e39c59f188c0dc360199ba79c836f8312564d5f11b2d0b55437505ee21d05e94490cbcc744be596ccd036b64e540eadf9bd93ac610fc6f96be2a76bf648a193826b54ed8e1759031d2fdee871f2aef07800ceb9064b2bac5ba51cf77cb6d6adff3570d8968d7c2c9a8b2a997388ce15fa46ec24af38a222c46dccc3bef6ab1ce82d8bb94059c2db178c8209618411e0bf741934ff62b4a085b017e0a53d2ff608c2d282988a8f6f121b4be0b5ca8df4f48162d3872c09624ef87bca7857745aa11e3d8536e33011c35601420ab6364dccc728f821cee296ad02c273548f75c166ade2dd67b9b05f45afae306df65f511948e3b9632cc0239b0596267831c5345937f87480dd64a8fca2db58f7d1bcea9cf8d0cdf2093d93e60a73b9e930072024fd2222fb752e86665540bfcdfdaeaffc9ed1aec840bab64272e39da84f1a68d56793665506835b271a25704054dc039d0c062f95d7d594c76eeb514d2a03cf83aff106a7436fd9c8767f099d9463e7be2802832740df55eaffa0fddc504659ecf653706f6d44560551e2ff8b0ed0b695a914166d7bb62884ac36dfd1859ee417838227a5de0c421b65f7aa1619103f8ef2ead8f5a43563430abca9e485472394b2a6c020cda5324b110cc7e8b2c9e7400c55640225fdee676b9f3d4afc104260cd6a224f1dda87b5300900063e526effbfbd5f0410f2531ee8e370d124a3fd26d446c94cee7fe68e991484337c24b693d6dc53dad31ebbbf31449e1c8a2b200fa91620265feccf346b45afa849882fc0660eb36336b1503a160a23fe998e97de31b38473e33cdb86adf32e96fe064123d43fc71e79fedc4744345f17b3ace6be4e2c02f75eecf902fc00e6bb3ad496f6ed4e4a1bd15f30b2a6619f60a03e412a2ad2a12843a007263b54e636134eb6bd0a3fce6c63dbfb098a9923cd26002ad038c68a409cecd83c4675b7fe56e541eb13c78cd732036b150973b3ed3f5537deed16ae80400956973623ff6cf55d86f2dcb7623e3d8d5cf0aed9389bbbf23ba40c0b73573e7b9dc86b6ef9b3ba9057fab509024fce5038bc58a39d1fb31d3358a3dc1d10ef3de703e340ac944c951c0ad1f9164e4ef16220c819d00773491ccd0d15d9c06b8a548bf1c791c7dcb993be3714e2b5501feddc2d1187283ef15c6354a261430993efec00f8773c0c218d056529a0e4ded97d1fde67bba3989c173f222a1c36eb3c498c4e2e9a793d1f2f2d00cb9cac0b80e41bafa5e2674776fe69727f743c4adb51bceb5f38a90f6436057011f414c450133b8dc3b3ae394366baa64401234f095ba140f405e5ee60e82eba53803bf7d6a3d67831f78f8a484db448f4e2cf26c069162449fd2501618d5bc31839472ef2df7e20a50e2a9ff938cccd689b27a4d20174adf46b50782f1464693361e5d3064b7f86218cb893119f16e193df3393f603111194f192ac076eac93b0716f3d6b105773516ff185addef254e3b253b5895e8a237fc902bc0fa17c33d08a7120697f9a0a06110cc10cd9bd507b295086b9c2b7a64ae7eb38c9a017e585b8867d4ceb39692ad4e2597066e3bcf5e38519957bd40f0455de9b0fb62e17d331a3a84e953cff8c460199eea3120767e158b591e724059d87253c34367d14db62c23e3c9d36cc04f523c380d23bc0abed6b7d988408ca1f3b05785ae64a4e647b4300a4fa07cbe841d5ca2cf85d8a7ffe83ec8b9b3dc0d2fe91592a61ac6023f04354ec448a46f015e759b43c9b0b175a83a712311177a5c2c89f456c276e801e561302a0ea8728b06453474ef866454d61f86420635c39acdae6407b008682aef8f5790b6d215cef668ffbd57f6ddb6cd90d3b3e95fe3b87bdf625c33fcb083cb05e22345c041acb8a22ee4b0b348c612358f1bbeeba27396cfdf46b91216d50f2d3a2237114afb2b7b64f1009fc80ac024212d51bca19f13a904e21d825051b58b531dc8d7a4dd6320ed4264468bf0ef07ca4a661be1eed608602855f7fc310dae38eac520a8ed48a264f0bd07c3bccab556018406286cfe96f063a7eb807419a32eae40b14ecbdd3adc1145ea8c5ed42dee62ae19ee614dc6249ae599666b2b5b3facdfd9fd731ce1a553ba0ae5e875a1462e0be0819254fb8537b2e92a744b9c5393c99364ec37460ebf1655a2e362034e8c6d77f37d308c70357714c4ecd33b10c623c3f08394da2e5ea9f72a90eb72da45ce7914c187aabf521d84acb25a0cfe34e9e892350a83f716e0cb2c92d8ce76950cbcc191b38b2eff7134ff8269d7d63033c704b60eb20caba34f5b4436a198d0962a59bad2e1f3f2e196a075f9c4f725b050bff41932651509831f4f4a27af99220ffce536d871e1ce21a976f06d10d6010dbe7ecec831f5f1bd084f68176a16e47de12b52f98b7e7471681c6ca326fed8875f4aa451061594790a0f3cee6cccf9c00891940ea0f6cca93796df0b8c42a8c171b060938ba08ae74b6d1c119a3a300257beab164c7095ccac717a01265f4ede61918afe3a341121b8c5caa8fee6fb8921d21dab1148c4779b4990b108aa50638987cc28cfce69d8d700a0ecc34ffb85214ee156fb789b496d1f985c364c794f98dcd80db862cdca0ce8623ce3ca139b557f3c63bf244da6147688b1162926de50a0a49cb9459afc4399e62d88762d7751219d43e6f25b2b271cee857315d84e438d0bb8dd0d657f0c9b8888e016cefcfc87f12d3027c663d05fc9210e0d501c5e3517483438e64daa391c35937cd6fc139b32f74a72cc5028d563b4a8b668e517fcf9fb75a1a056dfdb93139f4451f9dcf0bc8d10c31943366c2c5c2d334b9f9adfffbff429dccef919467f8888d8a8cb6b4a28181ec24ade1b333fc701c0f7c38c74f095568f278bd999fbe17cc1e55117eacc35e689c9095b69e81118bc3c63cf7f43645de90afcb050cefcfd82ac0f3f61b11c1734a7f9cfdbeceb9d2cdf5116e02de0e85d282a9eab7692788672eb5b1364d8b2c5d67bf25599fc5b6fad95818bd7b96cc297926b3ebbbdcb1247288d704433032fa70bc78e33d0b50f66176555a0cc1c24220382bcea624e8b92bb79da9d772ee331723bd516ec1b3b5eaa5f058d863d2dc9cecb8b245cb2dc0266004f42d97c9a54d7f5b27f1f29deb36545a0996c43aff0fa4b5b103e1380883980a9bcfba56400757b6f1412b74a22275868e1a61316e9426848b1b350543e441a344f6270dbfafc34c97adb0b21832c61cf253eb4376d8408289d34669337f57acceac69134609dffa809bcd4f3c42aaa8e8994809e692722ac64e0752eef91781b5d8f1a2067f70b40c4bf5a13876b799d100b799ae842a9f66341532c5007b8de602a77199215bf6b8f1ade9898710883571e3b3e1c053feb75ad707e5205c81e1b7559ce36476fa0f49ba5ee22657b9d1e9c58a09c0c4b1bac4f5a0d6cc7c5a7277b5466e43441a01a1c8d670df60605b5798b8bd2233a8b743135b291488a1b9ee122c576fb5ea4d36a4e26db974ad14f0882c5aee7e23dd658e09038937e7b20f9d8a1b4ee8dc5400fda7747ce807350eff801e24827346fa5d08c19d109d6a2f51f48b01fa2e64fba65e4aaaebc52af60bf224d4d591ec3755c1ee301358e68d8c0bb086ae18445f916ad31c209e9f94710e94730bdcdbf3b8197b6f1f7153f4d8aec30dc1bfdd19f784ce767f6e8f5ddb41b9b920d8d058a6f20efc5a461d1f74529c57e29a7b4efe55206eefef230ba3cfe4b49dbcef72f4075496893ac97fa09a3570869f017ec653637d1fdeecf41e80a66cbcde8543c8d0e3a9ceb17ae01aafaa74f5e964f16028e178a98533d5e5c5ce0335fcfb21097a719fa38b6f3cfa8cd2ef7513007a3edd5bdb0c79d3e2166a1f0c43cf0ff7488064248cfe937d1b6e48507c1330ab04d2fdc88c55ed50788270abe3628d61d7f5e82d2b80bcf1387e337e88afd85f690410c13cfba9a3c2e11aa3a31d9f17a19d3e8623f76c49a77e41cafac1378c7ee02396659a9bb42e2348454865523bcc056b947cafc7bec6f303d7889411db8da175705fc489e25a928ede435515bbade1471c7a61c4cdef14e38655828a3f999011dbbcfd90140654f2de8df682769e140840b996dd8a4298ef2d6a098a6c08a406347a4643a04259f03d48e562fe95b8fa529d0cea7a8694675c9d132a5c0f93899f33026808b52119cd48437f818f04858c015f971dea93b0d2923a2f77c7cffe3803daab77fcec9da39d920f1b4e78214509a4a904247ea72afaa2c8374be975679bd1e094b895054db1f8f44bc306636c9edcc4a276ca009220920f675a434ac61dc157e100494570a86c240653fbabf8e1f06b59f56078cc36b8bb8994a1e35e9dd3f42a2eb70e302ff058f289810305497f7286d632e96710a9d2c0cbcbfdb3394885d6f64391bb817c0fcbdac085cb6f0d866712e89e20c57d909a4478760f6ddedca11180593ea096f76de9e7b1dae709eb857395a5b1b07c7f82a248095f03f96c9cb1397c41711b24f253f2408b965449f29fffdb311a419ac42500523b32771d1556b008cb4fe9af2052a2fcee2f16c4588c815dfc6e744af754bfcf21baa1425f18695fbeb59b10a6506e90c7ddd9719b3de0e1d179ff1cf036a26bbe4d24568c122a2d0983e4ecd2f0c65595ef2296a41905923a36d27f9a51409fd9a9f76117c0d33c0180da7c8c030a1c3b2da3570ff2aebe8c90c9d68318b6c141205f39393d4e42f3e07b1674750c833e1cb1e7a4a4ca53b5abb6e7eef1ba83a96a0c1b9ae97331eeda10c4db8b60086e0238fdf26aca3142f748ed3a55b04f2497a3f7a7e09a1f393ac15e746eefa917222dee820a99af6a66e29f8a5940a98ce5d7fbac856d8cd1f39685b241b3a35541422ffe1ac784794e595cb1440ac4e25a33d118dd7cdff4494e91b9e32b6acd83ae63067587d69632ef01d0a0c3df52a1947b8d222fec0ae514a81d79bec893b91f0a86e91faf9427b01399906815591eada5cc320efd7b085bf00420973d8469037a7139affa77ab5ee5921d03d0d23d8c93e83f385a81bb75e9f3829713e05b486f4e61bf8ae0341ddb259dc0dfe2057db65795857d9350f26d60ff6573317372bb9c9768cc14f6d3051b64394c63625d1b316499694a87576aa14c913e5337c3e63ac6f1de0cba459d0291b897555b5a0818f532239dcc8a2a572c85a814e89fdad71b484a517cefe06e1d3a5c591af3a0af96111b8923674ccb4fa1edfdcb95d89c0000d8d728da01f6a6b9efc4152926001b621221cd484ced33a56194b69343941a6d046a65d14029a5b68f69b32bd440d55193c66c1561392f67944c34841c640476d24afa12cab25ca781b184b8077e2ee17155ea1aa06c117d171051dc5b217a1677d90f09055cbbbb306d860f8a830c796f5a10cc7e65ce0f76f509d193e700eee1d96ff1856192394f9aad584fd90087b42bc14c2a63ba318b2d6cf48011f17ad844f2d66e17b307820f445f956c5067860b1a984de23a26664464aec6797640537cf1e67e36f9e9be845fb11f209a40428897971f73e93d2876935ea8054f2c27f530383c2fecbf96533f26a444b03d94cfca2c469be928ace6cc7446494c008e5392a7bece2722ee70c24fa79ffc3e129f5c07536e0cf50a8ea08cafeea52f1177f934417824d06d1a521284bab53beb8b2e5b38897e71f79beedddf461c931c28fcdce4065ddb80179d8629cbebc6af1fd8f11884a008eb3e9924366059f32030c620b882332fd690dcb5b9b8cdd36d53a5cfac8cea2f8e15475975cb43ccfdd53cbb0341b331421dd441d66654088ce4fbb97ee40bb0f5dd58880001fb70be859a25922acc43e7ef1466f3810cb49d92e34c92268a26d65fa388a7db545a909c449ae1bdc608c965f0284260cb556582c9f74f3fd8031df784333348fb5da25bcf0ed34ad76eae4cf5975aaf14339e081cc16d7f7b43243749b51b6041947bac6e86a892c8a80b589f7f23f4fdefcdcf46312d75236a012a562146566f6a499d0bb64bad2ce2194a8ab7406fe98fe71e13c43ad46a5ba7dd7bdce8b8a010eb4721c3b20b84100683f5c466da5f09e57613ea09a2704c22fde50d400be4640a2f7d95e0ca6e5661f1de8f1e800b0f8a39a13e56215d1900bfdf64ab6fb1e8d63c997422c33042c413a07fd0dbb1636e8f842a29c50aa9a611715a7b29ce3c0e29f0b08a172b815bfa6ed3211e8223bb89255d1c31dfbaf4d3456810353d5a31f1990820f937ac4b48ed1632f5e3b42c4070af000cb7aea152d260d8fd000ccbf809de59bfb563470cd8c8ee2257c6e4eb3cc3dd75ced314ab7c9d594792119f73df134d2ef1e420e4327ebf6f1b88699b274390303da7b2e5dfaad9600856fb7c0e9dae0ee79a5a337b8e81627518f570e3afe1cb3af1b125bc5383cc311b690c4a1aedbe9b47015575e664a70afa4e69cf8ca0fbb6671505c2a64bcef7457b8792295d51bd11ce66c1fb64527123c3ed48ef244605746831b748e4ba9d79844da38e33b092db35d191de6d4fde0890490739e6a6e9850dae2dedd7514e8a8e664780e2b80ce820f03f4e3a78339a406b6c818386f5d9b957fb084b600df719b199de4f0455da8f1a8bdd79739ba007a4714b12aef8fdfbe256d3c00e0d45d7a4b3d224d39170040fa7ba16f9e7197c8ff8067248fe33edc9c660e22c7d24ebe727b21031f4fad21cbd3e104051bae85013f8b9a77b70a906b0e9c6a230cdb9e23b34c3a430dff747d37c3d659f93c07fc5777eec49b44c66c5ad87cabf28ade173dd5ef3ee879a0505f04b85609be5bd1d59cf6e0a702234709d74e3b235300b6f0564160718c7cf4abf8536fad3b25d41004d60a22a644797bb0d22af8b0384746735b6196901071fddba3faa0188b6dd46742d94f850d6cdef2201b928f3979991e24e8e4bef5eae323b830c1d37ee5a69c6936a32e45df7af86432deefceb137928ff3d70b2fe2a495e46a4ca61603b533e14286a088bfbc23ecf73069badd2cebfc15bf026bc8b2882713d008d2590e7bf335c0a245fdd5d97f0255ddae8be431714ae3519a5d05161a546eda83b68f29afeda455eee73a5bd00bd581327e797a05f57ee1282d490a38a08410c28fa5cc0d9098ba8ce6099c414359c755c49196e9ff4407ced3cf1fd0b6c44958303ccf39f38992c44e57dee388f184ae121a8ede1842c2f0d0a29c94f29e898d7fecea205419bbd9d5f8802a2dbeef2a12a9c2888f405a71fd59d29f6ef66b9ea26055dcd953ddd59dc9d3624745d56a6ea3b5e22dce9514a1f9941458550612dd073c8e4e9f341cfac168ad2c81ba4c33e4764714ff23930700c024b15cb9e85253d457e373d4b7b7d200aedca37c6e90e9c05f4e2c541d167fb63fb72459b36809bd6f3a74bce6ee66a80773171aeed2649e0725ef790df568934c4ab6c344680374f92bc31a0494d532a397baa1ac6ef41b98f4ebc1e629a2cc9715126fcd19982faf2d035be287cc33ef250ce9f4cf4ab9928137a9f2ec745271984b5cad7a45c228840877fead42d96dfe8d0ea92bba713adf44ffae7389004c65a870d569d9c7b95a86a35e31db87c775ba4599f331782a10423a34f60838830bc7f595c224398faff2fc09d418679d841e6ff0354dadad70b5628f16aed15fd089cc5c060d3db13d907488e556dfa91c798525ce3f54b005979d2d501ca8506bcc7715de36dc37300963b6450efc0f6d059c49fdfcac181c47da7fea1a7f2c5132ae25f37987212d21bff164c1cafec6652159e1cd1bee1a43e0781f66b4b2cac0afe2e43f9993e23b85f3336e44af7764139c140849ead0ab678dc2047ea1a4e4836c0426a18a857a7197f38848651a76fd008be4acd303e242a8aafa7769d964dbc35abe57dfa88f6ded05505afd605c74d2dd76c5aa04a6bd8866b4294ac55dd2faca9f38e5f937ac699b995e42e0a1ffa05181fe41702e8b1127782f446561ab409bfa8ce8ce438380b0dd012088a063bbf453207c9fbedb1049a434b0f7feb642602d0dd641f4fbadd1ed81de6256f6479825b77a89fae95248ac6bca31c4d31a2f78561f19e7dc092d1743e8da4b859f0436e0b04103521e5cf572a3054d13ced24b7a4d257b510caae6ea240325ce8b2994c5f9150c2486fd26264edfdc146412285fdd48bdac975181a1bbb654a0d7381b734e0765e83f80ed1676855f8c4621b3c9ffb0f8a8516633ab1dc28565ab2596acf9930c39429c05cfe1263bd1e1c1603ceb54e626935e9daac6af4c555e700beab2e77a2d5966a730da88b534cc30dd4f35aec26d89ef2991a75f323133f3519f8d445dff80f04a8992dc4d6e075071cd2358d3f7ed5c4f7cf77cf567411ec0e025ff7d38c7e75ae747b9e3ceb7f7543d697340f49cfa3f1a49311637b9e267b16b9b3ab25df9346b3bc9f957f68e1c72d668ae17caea023eb39eaee279b261d87429e5b6cb15f94243c9b9e50965bee054653478446ceb1742418e56b6926a6241417976fec132d69c18409b13f10358c765b3e0e2c27a9e0dc3e2d4d24d24e689fdaca72601a09038ee9a2cd84e660d2cddc9a0f370096f28d9439e7487622067baf86a2583ee6c42e5889bc3e2c3b6d3758bae0bcbd9dcb85d2a6c499d6cdc06ec9f803e0c016bf8fcdccb20c8f0796b838d72122fef7c6777c2e59ac420df43ab2103f1da8e054d032b89416848cf14a7f9d978327dec49d99e003ea7a8955a317d06f53c59b99ba349963d93fdbe83c33ff5030b6d2df3def438ef1a5593cc5fe8b83c2d8b80f1a605c10ac801a87f363d5796be7536c0938c07d6f34b1d9983d5fac116306daef94c3bde83d9d027a04d60cb490d8efcd27f5652b95860af5a58f07b830ae970dedf0f674a493def4db9aa44597a71489148b4f2b5d63b75c3d2ff448b60b84902fb041d1cda03c91e2556e01338d8c32d8562ff926ec2d3a710c330386da68b50f7a1e7511f8c1b285492459f446168d734390524808ed149ec488495d84e537888ae657b771f43c1309c18724591bd6440ad4207cdd970b8e0e7d172de626593ec42b6d583c329c43e018d4388ec3fcf346c67e3c1b6cdc1888f209b2d5f778d9b89b242fda9f4abad24590b10f0fd20d1bfbf67996da8e899a900410a73efe08cf64b1c27b19a17b114a87a93c4fc56c084cd33e218469e319b0960415cd006fc4cd1c9acaabae10578fda6026aa29d699c469809fd65426eb578da4ab6597fb32114b7bf291b61bf80b094763b7707ea6c5864f55a9bbfd4846a239d3cae84aa1f6b2b14cadf8262b15e83920e28b7e77dd122a8f71bc71dabcbe83004a713174b48a3e242513acf47b140909d81a7f14c00f67b000a0602a7f1ef7aa6b82e9d71d15c4dc29cf0efaa6e4b79b2e9aea96f6f4471dbf9b1cb1d0933c691704e49816f5d1cf942ca37a5ca2bbf475ffb704e34aa8d3fec9e3de2a6fe289b2d9209cd0796d97063f44959e4b6c249493f63e30c8c8bafe69037e0f936b9873a900d08539d8ae21394363f1c99211350303c59329ff0667bda80b82ac43bddf7fb48c2e233d9fedd56d4cbb53c8c4a40115767ea5c3a873997cbc998a6f38b366aaa4c4d43d335dddec2435d4ac8974c65ecd1eccea1d78d27320c22b5592df1f616c26da48c6d5480bb827a157a667092e3cbfd2ae268b7576e5adcd54b812294555b17170138e555ffe2ffc1ba436015fa3dd9c83a620244da5275229fac5816d14ce1fa9e0ebb3b76fa517767c18422a7e602618968f0acc6bc25bf5d79fb314b79cf793e82106bbc04c6b9c6a9038700c968f1ae0d3504095ccd7e400a1419d84acaecbdbd26ef50c54b5b6e70f2c9c298184e6c7a8f4ff8a0ee8d1cc16e94cba37104b663ca544aebf132243b1937951242b6a55e3a022a4a635d2cb08b084da7d02b2975aab8da39148b94a90b3e12ed2cdf4989714c1aa3ae7f4c004b683133054be7d89d27316ad9f0112efb72d54a94024107242a5e85c90a2c0a8092427d76cee6bcfe86abadc14db5bbe2e83b5cfc0f3b602deb1750964eafacb7975463912eeb705212221b14dc427f2cb2c0118e6eba24088b62e39db1f65b12ef37fb76d08b2503c0048b2280885e493be4450fc4c799205c685e2c8a25c19912584eda520c8b073800f1662346c4736ac05c76536ffeb590fe14cc0ed0ae51c861f50b784d746dd2f9289892702cbd9505333d3b2542360d51a0b38be0d767af3406b5df8f7c8b9b0192472d915ca7bff78764010fa417ec1e6cdd9836eabfc443524ec927675983ff754416b3117832b945c5fb47dbc58457d4432314c352aff0e4d09d86de57f31dcdca1f1942a60aa836307cb32e39952d1663d80970d2556cdccb4ca0c2018862a9ca7faec2d172458ebe56f3bb8911a642c81cffbb793399273a39ffdcf2f07af69967a4d85340171b6f9fcf9d449716ac140c54d85d4baaf5d8c04760011360bee69391bb8d3823edf6c117e287327a017a36c98bb0ba8de9db40b863a980733e3695fb80d480444a0adf9a6aff7b96490fcb143fb24b585b2130c53ea207d7b1d7d4de6897afca6522a1993c6ceb25f7ec2edf4b32b28555d009f7d338b043e1d834de95de0ac37ae56b1aa58e3cf0973e88eb90014a7de78774f7ea1eaefef926a929f970af466addc84c5f2df96d8c3726084da17346a964d37311f90c7eee647fa895451c168b184119289023ddd7d77d4588310470a50f89ed5aecbe3b78a6f87483cfe9474b4fc116e4083bcd2c622cc6b9810fbe0768e5c42e037fd780c977efffec952270e26956d10d7e1189a1e6e938fa6b2d4e45a7181ce79c43a73de5d7b285c3a225b8adb2ea5d4a564f248670d6e995d4f7ea59a47fdb433b35d066107311f25fdb73c2cc5f45acd571ba5e5c68c2c8b13a06abcc9193f55f6b84c05bf218443a6d76c2f20e5a7e321d34f457ae26306a269f5386f0d96d97afbaf1e459ae88f69a2a957fa316c625599676f9e000d262fe8073699c6121812ec87a412c0e82eb71a5e0ee4e0a3c488b65ff0de8522a79e2239b998f90a76e4aace5fa2d81528517a46fc513f5691c86b806f2796f5ca49487559bf278384fc907c55e6614229f25095a02a48f0da36c8c064ca73eda97623ee897297a79282e2b0fab6d03195a704c5217e8e6b3496824948d42b3ad694930458b6fcfeef15917b3d9d9fdeb94ae6c4b44213ff139c723c0e55b780d2bc7a72d77362d817fa1f242a9c981a825cf8025bd8c721996f1891d7ae375d85b79850c7adc7e880038e9e6dfb825179bbe6c64f93ce6c8d69e20047e0b6b8404465af6c11b2517a5a53b0b0300dfa9cbafd84587f00a2fc9b5c6fc38cadf1aad30015b52acbb1106c8e25a2055eb99893a34916871fc1a38781490ea89894ce2c467f9b98ebda2ed6119e85b94ecc67d647e3a669862c01a38431b151e206a1cb7cb3e9becf2dc4c8f536e534a9e6231b0cbe842760cbcdfda7a36dcc14a312cf467326e459aec3771f2dac4e7ae33b3d08b3a2581d1e68148173339b457bc9ad554b88690bd531ff301e568750d23c75b26588f80540ff472cb14d5d0552aaf1e90f06d72ad90413a49f5e0140a0298aca81071d08e12d94619ecc4d66bc93f2cb0b5fa1d36644413ecedf147c0d9b048f2034cb195584afaf005f83731d367f9326ab2a1b3184ff64283d655255eb76a60341773e669af4e541540e36bb102a72b84256257f47261480c31bb9425a4f0edecea83d4c5c1c4ba8559436f1874aaa9f72a432cb11b4faae1413e8a9f3fa54f7e11cdf9ebccc70ee6237823a8a426003d2c61a2394130b30074a6840316c6b524025250a90ece2daabeb59f23d0357409c0351d4c1d14053470d8c4373504f26831d9828ec05aa78557be07e4fdcf65dceb66e4785426f26971fab9b47d274e6aa7cf934e8f1ae70dc5b2a45c1c0f56ef5fb02004bbbf2790962c04f8c0ad84ea2e7d5c06ce9283ebd5b8c2071f2cc276586d21831b2dd81662a033ac2c52662d8fc1ba15b3682c2260e6e7fc7bbc823349abd919c587044f728a99b5e72f2670143dd8829a949417fc127581bb3e3719913bf2fa64c416dc01147e8fde8919e0d2cc7032aa02e8459301816a703f929a183a86840d81ba4f20f093ab742084337dd62345be923fe86f505a1aec06b35ebc23c989a139b7c28e7071550c0073704e9cb2d4cf9bd3f9862eb7ccf9986d94b582cb07c2bfe97ddf6de7bcb2da59429a5580848082908d305e7fabbe0b8e060a4d6ca16d169a89f842ccb32d7f638dcc43de7d0917d08806dfb120998148404a1010cd09520ce441388e52ed75b3be4f081ec730fc43ef7fd1cf720b04608d07bcfa57c8d105408c17df7d6be9053d72fa359966599f720ce7b503f10eebb07027a691007eebb9f00f71d3801d07be00e41bc17727215150fac1122e5ed772b5f2304154278dfbd0af8923d9f545ec869e424ff15954675a3b0f9b4ebe1b70c2b041540eca7bc10dd7bef42d84ff997ec8178df3d9094b7dfdd4b06e2e07df713f0c009a4806dc11c568da2c286ecba3eec104da71c74f8f8c47d3a4493f7fe394453f772430d1540b8077d8d0702a9e9408e6666016c62d6c1255a9a1918b56aac7504610f42222b5594365346541cb364c7e6686ec39873f2e45e21d952363ec7b8fbaa552a6ed5942a958a529af3537b6a85014586db387979111794eb5fb9a707073f753dddd33dddd33d291be7365bce18fdf6bc4c351de5fa10871141a34182ce021a5ea47bda279ab8f7edfdfba75f4c933d7522a2f631d7f118d8178493bca7fbfcd43ed1d4fdcf89fbb6efc09a1a061448a082be905307eee03e1f377c3940e149d8cba6dfc1343d530406027fd1e3c449fe3e25e8e1be436abea7a77bba87fa889247417a5c5e7ae225aca787fe809a8838a11038841be1032d449d2b2343fa30eec41ca794621cc5300ad62c0a4a2d058140206f0e615a6f5d0dda6f9e57abb5a31189d4d5a0b17c2f40585ef4229617720a7d2f40422f7a115823fa90a8e547d8b7fce845df0b109717bd8b087cc17e84895ed40205a6224a5911a9580a02814054d4f22aa04ff938177df29442a948d4427744968f4fa150037da10dedf0dad309d86288e56acd22290ba52c214a290ba594524a290b4b88364bb350ca12a294b2504a29a594b2b084683755f13f43db89a91867ca4b0ec364326fa68e91993379e62ace546aa6383553a994e6b1d9e7d4628c71e620c176f84c45139fc299f30da162b6a6c4615c5332a7fc99e324af82637ca67242ad0a395fab826958ce2cac0ec76461c399d2565e9a2f53a9d476849bb972edff6e592b73fd59419ef329ed5aa713369c3ad7bfe9fba96259b63a823d615951f7120c54091d425754459350143542bb9b7e4ebb12584a049beafb4753d71d9c2f0cf43c14c734111545c10eb4bb1e850de7cb97b03d5f45bc34e7eb355f18c6b26252ad1d4d3094c198b076b4a3013642323c39accde6cf7c327f7ce708253ba9296e774dd8271307c7fe93268e9d993858f663a35d1db1d61a514911638c5d096ccae8bac3dcefdbbdbb8e48504a7f4077301486a574788ce4344e2f6915c6dd8d611886f5b6a5acfc8dd445c04fd9d78a035b234ca372563427acf78897e623d13a061da209840186f1ef9e5039d01f0d1d503e2a2f61374e438642a16a9d471ca61fcbe84c92b383b99604ff300f8939be6c992f07c7c4308cff0c32d48631c04c0449a397a48c08364e2a0329a56c661e31d75aa3a9566b47a3ff1d39e8c0345ea3c94f32359c051748a189d3109b144f9ce83fc1a62011c65faecbd115768a2b83ff36e704e9c0fae476e4f03834212fe1ba123c465786554dd54dafdceb0b6cd82a19e734b2b520455f9406b1c15132a44695044583d4eadeddcd0218451819e7d75134e15084f711400dcc31945f230802835b0409847029be649c1a8e658ea120925046865f459c86ec9df22b485f9a71cc112775bd8137e7e4c9580a96d2c367c7495ca30bdbdfdcc347c749ddddd4d54c639472b97e32d5112859ea4986ca6e5ed91097abd56ab55adef25634f9a905ac6979d110de04147e10ba0f49f4a1bbbca7ba5c4fba9f52fa3b6237fded9b7acb5bdef216a5f249f5bb1ae4b3cf4dd9b02307d8e7561b4d428cbec604424e2edff22eef2f337aa6f9d8e456f08c578debaec7f6aefaa3af46883190b0e234723d69a9f135c01a976f89809f6afc0e17d9781b608d8d17bd90d3e6f2b9cdf7bd007979977f01dde6457b977f791b36fe06e8281be08bf62fa0e3e468200e7eaaf1355c408fa27b795f7f6a506fd560b140accaaa2c1787c286d585b92ce6e325edbd47e583a877c59d7829c4c2c2b7c6274f21951a2ebff281a05e15ee55befa714eaaf1f9a9baa209738556523017c7612e0e7371984ba5460d97cc86b7e815d368bc85060a59893e3eb57c7c4af9c2ed032ed0a20a27bbf29debab8b3df7a4ace5e393e8e3d31762208390b050a4c8e572fd88442daeeee5add78f2b9a44505a246a117d7ef25634d5da72b55c2d97cbf52312b5b85ca3541512f2979d960ccb78c961b83dcc80006e31193b4c6464b288a2032d8ae8208b21779b732a59a244c90a5437945941aabb5d046c18093ea7fad915ec0e6fafdf20272b909a02fc9cb08f35687243191e1a3ce1914192ebefa308e3d605f671d07f9b2adc1ca41b1b9264ee8e97e64b1919194a672bdbc2362f0c9701a11946b3bbaba5c0baf777570308091bd69b5a2b9d324e176d15a52b56932337eeee4f9b996364766d3e53dd677c66ceecf00ef4424ed80c9d0141ef376e01ae7bdfbdec9b76ad0596bb1aaa111b4d2b7943ee619e1d0fd26d158fad1106082cfbfa61b3c98708e31f0226f96bbf7d21e092bf0fd13419c67fe6062e6cbc21f75caf9462c1bd87dc80dda86e1a8e645f33c1314a700c2a8eb959694fd89a84e508233f87991bdca74aa5c230bb034a599f1d1794e659d2e35c5f7874b799ce56819eb02aa6f11aaab78a69bad6a92a5fc9b45a8769c0ebdf3c4c93124ddabf462e1d1758f9a18c839eb0f5aa2aa004ebc0a199601a09708cbff7f084c53e6c5557430d3018ca8ddbbd8169b07e1d8ee92657b0ce0c332000013972e0d0699d160a62add6b28ee58ec1c11b38c6afb061ebb44eac55c7b15eb99cefdd0fbfdc313468a3090786f12fc2688c275cbf8163fc99380dda7bd5c9b269c4616e564e3a8293c4fa805e1c1461a9152836c6b1adba08ccd35ce9acaa8e012ccce772fdc60da54ed5b942d380705dfb628bebcfd86fdd5d2b5833c40903b3ebb5e44d684735552b5693233b5367329938fe4cddfb55a815d374373746ae4f234ec4de504be2a539e7c430d54d6827051a19d24b9a0b87bb957566e6dab5ce0fc627c583858b070b174f16446eb869a136bbfbe1dd390073819a60956ac56a7264e74687098e12956ad336191912e97f34da69d08755dc3ed4a7d5c44b18ddbcf7dae5e47860c630feaf1a529e3facd70375b656cf5a10b873773ca361d3b46c3b824333e75690c3cc95eb280a765463a4c40bbfc02549bb4b0970fd73292b76b302839927cf1c387af8e46c42e80ff14a0ab2ff10a58c327ad2936a9d5326078e5187644f5929a564585177a594b246d3065cbd4312cb3b333bcc497356da4b7bd9e02819b2bafe5a946ddb36f6f1f1f1f1f1993eae5aad1d8dfe79ba7872e7cf9ec149323224d26864ede65d095e6c98668897e4cfec3b82404b29ed7874f6cdefa64ef229771461378d46ed15a7cff4c13a6e9bfdf5ed9785376e3f75e91a8eae8dd0858b813ea1943420b00a601d140481ff9c18136e834840bfc337aaa9304a29d651fae3f39a3ecc7ad189838f1bf8093c46117cbc3434587b6d475cdf885cdf88c03c4a29a5d67ada4b7b65952388739529c4f84b38c1deec3939483333b30fda4cddfde4836998668edc258559f1e38f3f7a66cd1ef92c1f5814de0f37b36c7903876cd75c1c8f94524a19b13a310cc32686615bfdadbbb30cac19e2541ffbc2ec36e5af724cca88f7a319616629e526ada8c6af2c8ad16f04fbeb6e9581ddc1e50ae78debcab8c39c4630227228a5340c1bce555d1dc1a1f467ad15c372747eb66de3edb7cd7ddbb66ddb389b456018ff39c67475770367cfeb8004782c6ebf3f0058005c92cffa1825cbbe13073ae00c0ca712b7b5e012b6e96c2b379c3a7d3d82b2dfe1395eda947849fb7f8edbb4ec6609c7ecf0f838e927fbd9da08ff7eed320f154b6eecefaebda3743661e3cdcbd9b66ddbb66ddbb66de3ed3b17a641fb1b3227edc317e86f2a87f1d586e4634a29a514443f6ac3574b636ae1fa4f345806ff8d092e313bc1264a8960923f4d21b9dea7fe90805efb50f5047acd4fdcf702647beeb9ed859cb6ed9bacc97ae9df9e7bd007eac0977e0ef4d76ded3570fa6ce0746da5f935fbf8e1646118866116c749db916df56d2aaa52824d13a799aa70a88a36b1e1b6a9bcc45c28818cebbf2d691d376eea3ee4b6249b928e4176e01c8361fca70f6afa8073a2a68fc5f112a5aa6de52520fafd3755341df112f6d973cb53d534f7135545d3a6a22a55acd56eaa0a6edf17c9ff3084cdad1918da4db5a9b20c9b42aa5b2cead7afccfcbd8d51c872554e154f09c648c1b0563007534a2965d98217a27b2f3bc46be2fd782e2f8ad7e39171fd675c799ecf3ab039c0651e2e98dc269e9394bdf1eb27280e5582435f0dcb8f7ee5ab697911b73ae2a40ea74b82ad7c45ac7c28b4f252aeac7c7f7325aeac7cf3e362890c9779b81872e9bdb9fedec9ee08053b9593fc9db0402d5093d1c7a2af36c172499cc4b9e2cf0fd41a59323caec77b98b90a0fe5f1a04da05584f1dfdedffb8269b40f1f0a23255823dc205c7fcf89d77292d76408f65df871e1e7fa7b2a9e67bdeeb3f7c2d00d41ac1b7a31b029cf812b1f881561401e2a82e1ccd56660312f85dc0ac40253402cd003b13cd63f0904862419198f35734310cbb344b0a0553479a89a8156d7573c269fd7038ef141c3f8bb2785268c9270fd319447848e5fb39c04850d412c10cb4bed34a0feb4e2b5aebf37e831f1584ebab944ac478463b680025ee6d9a2c5a32709f7d222cae55edc6b8b9d2d7490acbcd744febccc134591bbad7c5e118759013d540d12f45a5ecf8e93cb3c3b372f5ce6d959723d5634792894f48e20f9def1881e118ee1ae87b261d8d063794f3cd40b154d1ec8425d1e2d9ef0689162e2263e396972438ff5bafe1e1337f589777004239e93eb5fbda1af4fb1721289f57a5c1e8b1aa145e8108aa2367367f2c418e3e7316971463c271ea7baeedd2d3b72a8950db728d79fe524df985c9f436c7c1ab95734714ab8d78b0ccbbdae7fffcb7bac975c12277146fca6279a3854e47ab6284ef221dc2a9ab656edb13e23e756db0febfa4b7a2c8f65c4861eebfed01c8fe5b162fcb9fd422ac503f083941c29a5a3bce43a3c6ec4df8b38ce1257398bc562917cf8a8d5dad1e85fe5cd041c2534d9a676c35ef988263fd9308b6431b0a6690085132d9c86e062e073c29e695e9826fa144f28214377d6753bcf06f4911c1ba2f8d14f4cd087146ce828d7f152d828ec23188e48f62bf8d2df6075140eecbf018ef2b137f87054f7b098a67bbaa75e2fe224f914e4d13fe3e7282779ca1df0129faffc1c24520b6ee82a044c1999991992a0ecddf18361fc7d380a5379e9c64bd1518e9ad3484a8e8a1251c8cccc4451a7ca61fa5715a7e628d159529720b5a20b8e4b8e4b8f0b192e4a5c5ad7df25890bcbc5898b8e0bcff58fb205a705a705a7c5650bce6c2945c728e356642b626fdcad05072794c449dedd38a11c2799c0bef4f77de1416f832d49ae4a6dc101c01600d801000f78c6f5077fbe2daeffb7e3c216758769e6b6e4fa8d275cff1b2ea6e977b9e2fabbe84cc1a6996218ffbe9ec475174c265a7038e6880d432f2a850d43382e4cc125efc65dc0f19c7021c9f5a2b8d1c334d9146c4cc134daa73c71fd99663671fd7798a65f8bc2f5104e2809d34c23212ab834916092cf542a0a2e382e385868e539c1a55014211c2f8ad0cb9b420bce13f5432bf9fea128244ee815b6c8ec862d38d7bf7aa30838d7c6142f1b381ce32e2d382e381978c3733846fefc6a5fa9d244c86344414b718c1bd18ed8e2fa872a555c207aa638c6b39d4e0b1bbae0b8a0e32e2cf1520760924d02e8878dda014387a57dd4888d26a1134d5387e5258a02834b54053a3a53279a342798a1c39e67add6022df097a232150ed85b51d1e40c33df3510d44b515e7226cd773a02792b35824d1a4de2fa6bd84fc5c006e356e98d3f722620e7bb71292a8e46d67e17b85112413d1b4db6ea0ec41082629a0635166b422872f9e72a9ab49d49844b9a190ce35fb52b683d11466b7949733949130297b432b49e9d9e689a3fa009c3c39e355bad5957344d9d0893559797a68e93a6ced47133d884bd7685eb8f6d677052461e18d75d0d370ca960fde83dc3d666d7c95c1cb39d61fb371bea8499594e6ecbcccc7212b9ecb5629108935846a7507aa6383694c8cccccd5521664688cdcc52cae6aa60fba394cce38b2ca564301c41ebf24605db2f274bd6747a6423336334fa6067cad85fff77c83ac1e6907ee818ff5875725c67e84cd93948396dd296e83c40c709dece1194523abfdb79a69465b419b28c18a319136c8e9943c8eeee0c94d183e66e2ec6e84ba089a36df69ced10f0dbdddf35403d51b0de1c254882d2646364d292388c3f0e04e6136a5a8a2920b139d5f7f06b4e172918488bbafd3b1ae0266cc5c36373fb8e7afaa8361e9e2e5aba8d307e85259860730ab9e7e6d03afaf663d249dd54eea0082bdca653c64c099fa88c316c4ed5092ac022e52eabb2851ceb99d1b2568c4884253dd0b1dd659e253b4b7472c0f2819c36c6d823acca97527e1d4929254b29658cfc02849eb0f78b04036b8438693eb0b5628c858f1889ad327af7c96b6d2cae68e272c18857e8e0c6972d82132471848929a460822d10e1469e22ceb831bb31c6184158d4e0faad3646267e5660051244e82209629ce210864871e32320c6183d2b340cab2a5836a77ed215abebd77b9e217f88bc2047070d149c5ee063473998977970c01a028555b9cc3385110cc0c10e4f0cb2e0b9220a2fa39473ce09f66c4c5219a594ddddb1bbbbdba5c71f6c5162386e884dd69da9f3cffa9344ebc4bed10459c713e20ca82786f61856da3e23e5781c2c3b1b48c05ac43e6b128580f6f36767c3052ef61a86fdc84948c0e6d3ce06123805ad63c00932722563c3ed84e12a8236c1250d22e69c7352248aac7081841344e830238d2b72b004183bb04113216c5c1849024ad331a305529009e38a2ef3e8ec6411e728babbd338a38c2c973fc68e3164399f3da5d8424ce3ec258a558dfb1b2cecec32d870e373608859eee4e17e9649a11eb28f93d687fa55264dee4e8c878f5468f1b9c14fd604fbddf83394586efc1d8270d34a8b013937926e8c314aeef83984f05674e3781ba390e5dcdda383ee2ec47bb6733333f7199188ed2e43fe774b4967ed22360ea4f48fbfc530bbdd83ad7aa95b66e64918c65e746abb85c821dc9d0c19bb9959d29f5fec98f913ccdd1d3b7273fcc9cccc1c475903944729a59c517616e41326f63660464a19fbc2bfc034cc3fdd839fdb839b5c156186b0694784995f8b58233f1a59cbad38798614c4a90e3477cdfdf9663cdc986c89c99f2ff2e90fecb66467e3baa7fbf92d2cbb7d7fbda47738282f8e03c33eb2649bafb506662d5ed890bb12f3a28826ec45114ce63b8e97d80b1b9f3b93dc29c1e66929c19077fcc64d7cda1143f6d909d96727649f1d1d22ccfc5aad1d8dfe49241f57b5221aad33587146574557bd54493024cd1b0cb93a2ef32861725d4e9a59cafa7727bf7d624f4fabc5ba33333a231d1de4a703c7e068591c387e4047b619f218b5fb75609a8ed8735f11dc77dddc73c73d8671dcf747b96da3dcf665cfd59bc5dfa18212942d3be73f6747dbcfb7f1242fb99ef4cffc8ee236add2befe0ddbe1973b4fcd29b250a2cd273d8ea7596c73ce3993541cc902144871c3bfd8115bf512b3e79f94636c9275cc9dd631c1f6e9185a09293b7fd3a16273590636ae38464e30641f2bb3975ddd26c2c8475d399360fd534e32e224896118c52a56b18a61d8c4c048a3aa2362c398ba3e577e4c45933cc98faa17195357be94f3c3989a619d291c9671cec920c7fa847d100b2812cbbf7d615ff8ca2b70d7196189907147dc85eaf6c9868d71746258fecd0cffc8345e234c12eccb04a210f365022e84fc9f014711cc41ca441820272127076fd09068f72266048370db23ab634801d334d83ce018ff78d9daf88b068763e61433a2e05a71fdfb762bb0a1bf5ed1247f228ccb9f97fcf154ebe08269fa5b080cb3d33a22d8ad8ec1df354d468600040000005e5e6e38512b2b146cd6143f39371cbde44fcf68e32fec89f56f5484a1ef2312a959ce62b1a20d27ab59af566a630458272f28d23d7a8c9e69da6f9aa66952823299cfe040ba13b6df5dda0b6ce8ae1d13d73df7424ede06be00d91ef420b006f4db0be97797fd7cec8830bd63bbcec776446c28c37da38f934244c521a02bac4d377fb1c48e0db258b9fdfeb107df1a60d895fb127fc706595cee7aacdc2f96b8fec47f1c8abb9cd455b09d0aec363373bd59c77c770b863d8466d0b0fea10c02c01927f557ede97cea58df38a34c9cd13c83b2318e30a6b8508d93dae6b6bbbbbbbb8c35d658638c353fc42155f854d193739363a4b915d629c68f18af2ec0587227f8ca6992c30475437ed9dcfe9ade78e3411010146c16d0e018faa1609967063e37f41714bf54bc62915ac5ea86fe629e2a5411158b307bb7b53d98497e6357030c2bbf878cf2e34b903966b6c4c04630f49a87c2713f5eaadd1136e41767293dc6487d61b1ef8cb0b4c6283e3782e17caf1ce8d70d87407d3804ea461ea0eb2f8ee9df583673e1104f19287f47fcb9213be68393f8e917448e93d88a26d75f95c70a26b7bfc64d7dead710a80fe320357dfb621ffd84dc19f6cd8da0dbcb1ec5491d4d22e8ee0e126d407f39a92b123614f2622f6c0cdc3e375be4294c1b3925a54bb6196b10bf4523163f973bbaa21f759bd8472510d7eb9d31c618638c3162d9ad178b31c618c1c931f24770bd59064982ebdf355e6412309573d26d900d483030317e140c7bb995939fcb1d5dd1cdbe91ec90d896cb72b3af76489808dbef5fe8ae5c952fe56e19273f7b378d939f77370e74378e935f77b76e0371f2dbeee671f2d3f824bfec6e299cfceadd5438f961775be1e447ef16da5838f9c9bbb570f28b77138db89791a8460d10fdfa147bf985f4ca8f1836658d9797cb4e6cd2147298ee80e5ea0e9bbf3363580f3297df4b1e923227acff0d17fb9e73ce884d6787c1dca347ac1b944ee2a9b3f9cfcb1c65f6cd09b0d8c7df26f68f7df5dd3dfbc21b2e7733cf7cf06d9007d983ccc55ecaeb01211793f57beeda07df08f62063038b578fa007845c7fac73007d211e445f1e62f813047ef635e30103af6ce752f6e5a736c61152dfb89bdd134d8eaa292a33447fa39ef72cdeb3b43c4b88498b28fe8c3fe774e1052c22d1bbb4b4bc28cbbe79e0e432102ef37ce1ba9b00bee301fa20481c9370b480dfb7f22e2c2cefbdd0d9d09ee742f783e53d76d2fc160270cd34b7453f127d4b8dd18b6a7c7d5f68697996df0ac0f10efffe5db871a3869df3b539e7fc5c461d8f01703e1a594be98fe8534a772e7dd1873255849e510781f893f68856565c7ee5298f97428fb276bcd4d9d048f8f92c1fdf50f7c3fbf9dcb5b088ba27acab68e253b5f46dbc94d2f1f0db12dab8610fdc1d7dcbe8c3f9359e87f922a67979faf208a66179fa1b0bcbd7f8c9f22f5fdf94ce012c2f123d0b0bcb8b7e87bfcc098efe07ef8e2ecb8fbe6fa6e9165161bdabbdc80a1bca9408890da5cd65f94d4624850d0f96dcf8a3f7ee47fcd177c7c33e773d7898a259030c5d44200f2e2f7afa9ee841dd0f17110bcb7bf783e55bbec6c737763ff4153dcb0782be221018ba3ce8b2fcec7af020fa20fab6bc0bfdb05f978a4030140df1520bc883e85b9e3ea8e5bbee87a8e5005c330d0f1e401f447f22296cd82f1e9d8628890dfb2555d2889778e8cf9e7ed7d9503f7baefbd1a0c7e66d82d8492d607d99cfb70bc170eb8d5b59ba5b3fe4eeecaa8d9f2b1f5f50ca17d6ee0bb9207ab6b4797594eea13f6d38a2e07c71cc448361e41f71e583c07044c45222aefc8c0353f26d7cd288c3c80d943732e524e9a81efa8e928ebab23aa9a7ca6729e5366ddcb61a18da1baecc9d5996f52073a9cfc8c1265e6ca01f63fdacbfb0c34ee3d63476788500fdfa7917ac3dbc2bc11fbcdb42b06e1cd8dccdf367cb6f4333441cd171b8f4959bb4ec492e736778e732abfd25f8838137383aca5df96b9e819ec4573b2f777c27478997e6bbcf687377f80e97adb9c4f49edd0e3ecccccc24e077f8f752030cfbd76b94d3fb047029fe54f9b09a9806fbe1e882be573f57de2b87e995b482fb108497a27f5c8f1e9c343f823bccefb6893636da639356d00c10fd0531bd2e0d1b76ab67f7dcf9edb2b29b48ca852184c9753393f1d2d436508be4a4b9b2b4478e6ec50a7e8df3b7759c84cdccab634ebadd8a30f3bb55c1d8ad791b27678a6e7cee7e886e2739e22420e48dab2858f961af2e47848d31c6188bb0a2cb3c5facb60f67b852862b63ae84e1ca1b57f62ab4512e019761b214fe3ac90486993fbbc90c5ec810d33a305430ec56834d468b05369cb9b332e099e78b22777e0e31e423234d2b3fbf3a0d2a1fe248f93034134d2b55e54729a3d972d2fc29d8f99e627941777337e7b8ce9ec5c638a6cc820739df5dbe4b904689011144957ee5b3ec0fa281e87f6127c91df1e56f61b97e3ffd1c4c537f18e2fad3ed297d18a6d19e7e0cd3644f7fc64b3fb4101b2d58512e7dcb2a72e9e390a16fc34b7d834bbde8b9f425a5200bbafea0ebffc2dd22b77d2fd9f3e5a1be64a00d345c7f2076dc0abefca0e1fad370fd855ceeb09de9842250c46ed3fcb04a241387c3e8b0a1ad4fb0a16d191ac95c216a997b333333a86dcdceccced84bd9b2654b2931f98e613e78496b3965b79ad04f871d34d03e6478c9f5e3416adaa68768520636e49fabf96bdf292f6d7c7df092bb7f7c83f052f7da07f112d7691833f7d77d0dc549f1f30cfb9e357b777777f74c6a52939a942eb31f27c59731b021fbfcd438297ef6f9e0a4e84346bb82705214ab811ddc4633829bb36bc5187c911f7f56ee296c8c23dc562d2f8d62119938c4a33ce1f726ee3ca7934a867d328212e5fa87243aa4c8f5224e1ad20dce167501d31cc13a9a63e8293f324d635f1ce230fe6e13f6305346bc24bd3429b8ad86b0b1641947e09202eb33e7721773ee05bab9f803c52ae188e8ae86f8855552ac6e9adcba4e72f1b3d64be1e2a722e594c2c6d7e40a97d2ad7473b29348386cc48f85858b5ff835b08b442d9aa0971f94022cdc4a0b1712712cdd8865341a85565446a3143b1a8dbc11a81b8db84dcb2a361280b6a3ed68606cb1db9d76c718a3945b115ba32aaeb022764e2a69955c95a1901df9d85a2b47716cd818bd6bb415e9dfb622b6fee65cd5b62236ac97eb8e31c6de8a74778c31c61863c7de8a74778c31c61863c7ee8e31c61863ecd8dd1d638c31c6d8b1bb638c31c6183b76778c31c618677cd9b11be4905fb0c2e6124df2c11a2a422452be0487a02fc410f3e5632053908af87c9aa08d0439c26048583ec1a012a399e8228a0cb6eec13c5edca860e4241218838e99435ef0a4b6cb5ef00cb1c2e6d244fd98c5186bd68a9ed68a5187d8ddd607540de25d2b6646f5acca9e188661e105aefc389b40279d603603afe598b6c910a39ca8a44db74531956a06020008001315000020100a06042281483822d664c57714000e7c8a48784e194ce45110c3280c19648821c8100306c888c080cc600400334e42b9370e3489faad6892c27c50a267266458c2ba0afb09585d427711d1d1b5585e52ea97cbb1090590862b0f18ca016ebbc27a05a54ea2a9febad55c5c8885259415bd56381658dbf82d0321f639892e4e056a214007b9780830ff504e09d5100e1795a01cd510f822088e78c2ebdfe344ff5dca0b636ce1cef81b06c0dbafb052acdd5a4899232384148a1631a1c73e47f66e2565a5633ee239f09603116bcabe50937d155a5aee641b9c65075a5a561952d85cb825f32ce4ea05e1f077b80162553a96fbdfd8fab936053b87e6a1a5dd92ccdb0a7a3e47642c8efffb89616293ebd5975d0120070e3573317d0d118b8d0b82afd8dd25510bdb08e80d0bbf4691232bb5b47514568c03f9b9e852a679b9e534cd9d956acb975e4422a59cc271ab1f8e5b119a0ad67253fc6f9fab8af979d5878ed51b5bd559404bcd8978b5fc6b7a392896df6d079c041d5128e1e4b9708d5d41309617be48cf8894f14010a1b03905339a631795c11bb92264b32ff09038b82eb2917ee827da91944839b57850ae91aa0c995f3dbd003850e8df72e648fb145b2052e5922fb0482c06b67ca2a81d9b84d4ebbcbd23e5f268dfaff9ded4238d9a4cf1ee2cc19afa326a762c68d6c3db8c836964d772854624a89d9de61ae38e07772acb11aaf0e09b59f78dc3254b5318da63849cf0fd120e92f88e2cb2a7a6f0e015154e835d9c8d15d69a2a0348199b76a69fca0a4adaf0efbf96a373e6a32e5f23b6303ff390c3148332c21dcf3ed65b4fda47d28240aca16a476e60954c5df66c22a39671f0e920bb08e5bfaa9dc9af2cb1f3621a061d7a7b4d7824aa671affa4d45f6b5ca8332e4810bef93e2940bcd6a2be77545c123d08078fd19e3c77e8fda7af1f6e6186316dad35212f56f404fcd6cd794970e36464956fb8a5f046c293de3ce17abcf79e6e2fb89d4d9c7ebe02f84f6507adeebb7835c04e0e806da1cdd96c2f1e05469ed171cb7a6a5554363c6330a8bcf96febf942584be7121a6d6cc49db893da11bfcc6974ece53fd5492b4178105d5bdaca706fbf17cf847fb95134bf68a2b50d665c9d3e70d7f52af1cfab3ada57a9d4910a44ce0f58cef082258eb00bb69737156439b8a3349bdf8e0ee88d51b888ed5684e01ede37a006b5e5560af6fbb50555c3e5d23638646e605407d481bcf3ab94d3d0d0051c028758a610561fd4f662cfdd287a8a9a37589fab7883c8c491da9e64a1cc215ec0d0b2a6786ae8661f8a9a19939ece284a3a629712a79d7c5f79c0f59abb82d05d801df6cbf71414646b2ac0dcf31ad2a80bf2c0472b318fdd2b3d4e0df35303c41914df1d4ca3cbf8dd720687c9549e8c97249349246a27b89c08e8c100d6c8513beb287fc4b20bb66080142b609b5b7c24c4fa15f30ccf56a37ccc1fdcbf711f1dcebdc96181bbbd684be7cb0da2c8c81c8cba924b53a8c79db1132234cfa8b362f84766dedc50d31f66efabc36884660dba8a1d9c75c2ba3fcd1b008d66a7dd5b34e32f905ddc654141162890aa717b64be15e3ce7207fe5cd01c1a9a7d16afb723ded582c6f46da705ffcd7316f1b292c83a82c54a7f85174fbfa7415effad6f02d356e53c2067a8af0ac95b1d2fc48f52cedc461ff9961c8e983c37b0b9f49fe50f581c0a6db64a219f908f348bec1d86a7d268f6c9920968a3517cc391b3797f92cda4c91945254f52386ca007fdab45453ebd1bfdd1c0997f748002a7b3128f1f02473fe5c33549b6a21263cd39056a84d8b4406c53b999b6552cc70767648b4202ee21011f130a490dc982ce9ffc4efddb7423fb7fb677f5cf863af33a84ff70df7f28de787097a93a7c81f06259295fdf6db5ac1a27e8b34ccc53c6bb67002dad2554a0897f5ea2f371a4ab653b0da9174ca6fc0340131a436255a267590559fa0de1d2aa12a0ca1f5c3f46c5ae25432d80d76a7b5b3e5d0678785b79ec29bb2bec8f1ddbbc52fbc55edb744aef0de8c79e7e9c4a742663cea51bf41f733b60cc04c1cf69f790720bfafd5c26d0ec646603daf9b00fc72acc0cc7981086edb07acb34cd97f24b803e67270a66ae1cb96a6323d6e7f1b625bd79b4fc764884264c7a9d500adb5bfe61fb13e7b01727d32d0968953c4e56b09b980f62787a10184591dfe008983ab849c1a45155f26841afb498877400a0d7e22e07529f7d5132247d8390251ba661be8e5ffb0a2e4036f660abaa56883d7548124f523a957fc08c96c7348f82b0d910bcaf56d70d6435202df4ed4bed13c1c598d9d8d0d353fdcd672d007da06250097a46baac851214588340cf17df027d9cf3094054b4326d285e1005f2686f12648028e30fe20f8108414d31499b69425714fac27c7d9b0c7962683d2eda915c68fbc2835963d268a61f1fedf2c858436303146a1eb912e3e8ff7ababd3975c8d294df80163dee7789c2dcc6e7770797f44e6c0a64b72ce9be6ea67a78e006980fb028e3a0784b32df48b107c4cd6f8f66deb7aaf17004f63f31b711ccd14344b4303019b34004ea246646bc4048d33fe80e74119854b60c79b04e2513a6b4916c008c15011b773e3fae08ed452e06c8d2616afb41596d2ac2c4f15c9432ceac436e2eaf85daf43e605c2263f09d3630158a714aebec24ae5fd09f7336a0c1d569d51f6dfc3443395a8747d8ff1e4349efd86d943c155f342a74f7d8d5a6e8a0b9be07655a206f8d00f61eb928b077775d2b10cd0bf13be14af6772d6ee0ea91daef4e89affc45cc00e40d06ad127e2ea992509e73476bc1183ec0ef2eb0eb2b5bdfd2bfa00f30f20f092316b9e2b32bec4c635ec91a881fd46683dd092b8946081e2ba061154d41901c0d6b1bb7f4a9cd09c632b74f9261eb1368b7b937a304275f8967b085ac1e6d1926243602ab8651968f2ab07a6894999875094797d5da6c7b0706b2f98fbf5376c2fcc54f2552a4fd298625658df5724472278cde14872733e0a13e03c01c1a0600200d50e6fae6f6665a38265da2edfe7b7203aa94babc9fcb00216702a1e8609943b04075f4a55127a832e7e2b87ba857bb42b62e2ca491d41c7b0f6ee01b9f4b416dc7c0452804d45aa65b3650b84f81877bed08e839f22da9bead5bfef0a0f2981c2c654d255b11e50c235f430cc663ef63bc6039b8fb3d694db7efac2336aaf49398d9c086a0c9406b48bbf5670deeb6a2b9a34dad8dfbd3f9889dc1cee7e16a5790443f693e0e31e5f2281294f480cd8736eca5379e27822638a26d8c427cf10f88f847c2c77e106a6ac8077b635f8a87f885220fecd26f8338e0234794dfb8dcce15dbf4485906eeeedf78ce87ba4f9603e5c1a2bca8ebd985c2824af461810402d7bd52ee7862e8e927b668acdc262aff9afdd6f43ede4dfe6398968e05b36ea02b6ea29eeb827200c8fa0065f1e8a0140aa2a09eef88d1042e720d04539a0899c7f501eba36f0de5d8b23be4227707d4740269de6a057c7bd402f72ca0859e163cb88016f6ef646480c60286dd0aba8a093644ac87ad582894f1c3701728df66dee380ccffbf27799cdc062f80c0ab8ad5376829ad5142c236a5957e4961b7b2d6318d37f58f69e23e767f094d645a63dfc3aa4ed197b4860381a0a97e5e0fb71aaa8c40cacc232712e22d49141b3f45744ff1c7daeadcfd30bbfaa495ff50fd04808684c93ab3412c9e135d8b41d0d54d47db677f759c50648be385da2f780361331280952a70a338aae03b8710f039c928500dbf6b0c8b711a5189d303e8105b70dfba6981d42095aae15ee1f46c7c8db901e437e9f44dfdd2ef5ffefc20cd625d689eddfd75248fb3922135b654101fe3c8cfcd0c09633140e94482a4a725ad39cd26311a1e696d06cccd24520f8225eefc77b543de83820b697c5597f4d608114eb3cb88cb08e88684c610fafbb24798f1b1104e261a311773c5c7058660c80fbeb68c14b2d81eb65be812e0121fb7294839290d247d26d6afa03cc8db060118cf22af05f13c47a179fc85881f92d70ce6144e476411f2cf06994665e727ac285e737c98b8c1ebd6613493f4d329f71f90d4d41f1acae47c63cb0d3784037c065d4caf6f901ca7576ce0922643b21c1f8dd61a29ff65abd5b46e56875f9675b17e4d7c05fce848b71af1e2857518f168a6d5436d2fad0b0e9ee7488fcb52ebc3492572d254494359b842fdcae9873629429fb7392d7c0448c087bff758a7b258396ed02800d9352e390b496825f1eb7e493217738a5cae61bcb58c6b171f487aef811639be1011cf28ee4a1a94d47382cf2e3a41a75f30094bdb3506c38e52a8349c86b9e7b1a085a0fae79e6cfde37e52ec2a7d655c844d5788c8cb8c3bb98cef21809caf84e8fb70c1492321b4fd8f82436067b19813ea7b63c8fbd0d7ce5b18cd06dced160713f189dfc2bca58dca6c3647149dac93d93199ffd70c9b9e7767096ad5f5c8ef15240a6ba2059508529e31e8448e35341856c1dd31f042c6c8f0ff8aacf95b2f7df302f591f9a81f64153c6c824a002e9b2b0de59fb810213e33195b5ad97e92af3cbd2548d9eab4ee5a68a6056bc9a945c8e23c3306fc2863bc0afdb6529c2f7d46681f7947c953c5d6f0e7da5b548d5a96a27a66cb164516edf387dc81ead7773c9c4389a04f3870dbd081b66983e4fa570fdb4c8a62501925473ce358f0195b2ef6c8a120b62bab87cc286537018fb1d116c776a58cdb37a1d33ef011ec30a25a22ca47d09d588da706ea311db7a208bfab06e89e398abb7200eff78a428293080da05bdc7fafd7a42b0bcaad56b6b90ba48ed2477d7aa2d3393c0d684dcb63c8f72be70cb748c125cefa89cd33ba6f57b89357d755d4185ce41aa575e3525d0cfea471f80778be4fd2483be18d36b55c5f6d045d18504889b916a15e826a4fac843529290ae0c16c996424e2c36fe4cbb47a80c3b47a320df4b06721f2fa2d67bf82d1134ff99fd0c369cff0613afbd697bf7f181acde01e048cedec2711fa72bf067cbd54be2a91330c130917db0f2845fd4df96dec0899c03ced84fd46665ac3810f905ab0bd5e2e8398fd268c8a7ab1106d55728e1b892545f21bfa37cdb054b5d36fdcfda696cc626a5de72736d73c0becf3d62d19391c72f53305838623e8a00eae9258e3460254f24311e1768ee1807ff6cc47d22ad644a088e152a0e30c9823cecb7c0d26f2314943391d2372a11661498f17299d92cab5dba427b1abfba9208200fbe4b4fa8dad9f2eb217aea37ce8c54df0699fd40a9c189cdf86ed65bb537b2ec73769f3cf00c18369fb32dd552118a1aa74e8367e43d6a878c0a2021d84b6a5378ea7e3a07794b037ad48dfe1fce574c418547e272376ebae2253fd22b7309ed99f074d00fe1f511830463282d3ae5608fd2a348ed57c9c0c726798dbe2a6c1b23b1a52aca1b73541edc9395725962c6ba5aa06496fff8cc3d06134acd87102630d9b571a58d6ab4bc5952848ad224cd6ee2dd883a425e5960a241a504613b91a7fe3f1baa8eaa01f5642cecee9563fccbee49a6635289f35f0f302670b1de6217e0bf7a187570b7e2b5e671eab6337f3bbfd53ab16c1fc5f5053de6b351367dde41b2fef4064db2c46b21e04cb042d62087e4dbd392df4555c11d5f6b61bb6793c20a76f4b548c217d24ed910acb6dd7ae8032224b9e4f7152a2f7d481844ea3e3bab0a4dac925b7028df7b1b21199ca4b728efc7905b8c795148dbc4c8a9ccb36af67e0af7daa089ec7202385e9fb84e76cb75691e3198d216409cd2fd47aa197d7730b6de358f7e680345aadf43f3cde28ef7733ca2193d590683691b29bfdc1bbfe916de498b9adb4d28d8347c36fb7dea4be37bda074e3fc6237d0ec442094e303bf6ed4e36af02f0f10523ac945a1421468625ceed6717a0e0cc2930b0c53f77fcae8e45cd120449507500dd375cc6d962f2b4441ab0ad2eb1fc603089998f9e14eb7f3fa512d946db86a80e488052d99c4b837774e836d3d47c14c5c83bb793aaea7448234e97033b2b8fa34067fa293bb3e4a6f76b5573207458e373118dcc26e6304b4eb300e6c6ee9d1ae50df022609e79d0ea450e2fed220ba9d1da9c18c0b83cfaf8fcb743a355222a2fe3413db2ff00b643a9c414b1e545019094eb4a72fc67e595fc2125c481fdeaaf207060de28534574fbe14ffb8435729f69fca53b9c7fef4509c17ca4c0c7117659268c2bc2d745f3d58c52e282441dc7ec5fef433e866e1947756245870566376b825b427ff7aacdc8b4a7346292d486aadebec401b9d263b10213c1ef6fc15495b79e173260036a73b3a448aeac205b869312ec16c85057d813138329cf4582b45c5203408a1210aa3e638556bcd581efd17924d30098cd2e6f179f72f3c5791b40f085e6495c121bae5d2e7758b14f7626d42c087a102c0e8b2bd1698c92b0570c976ccf86bdefe4368c2ebcb11db03b50fc546d16e070750b002844d74110a1a6b640a83c7919a5581e953f9906869c008f001f8021576db42090a2537a82bdcf25b43139fd43f632e881e276ead35a6159955cf98417998db3bc0e59add9098481cdb1f651b5869814fb5f8263db8663e950f5c6e969da000b5e9c05e90a051acdc6d8b5699adaddbd753eaa9eb26aabc95ffcb6d8a0cd4e744e196cc0e18144184751356b8973fcb1a20936b886f7db26e304aaaca724671e305d5388f89cc7190782bf212be57f6fc60eb44c9760f64c77a49c00ba6a99e1526fc5ac99521ee463ddd65c7e0037b80beff63221f0db03eca80675c0e0f7bf36710497284c5dd39fda0f9b799a894c951a49cfcf27afd0051806a1835cd15ddbca5f497d730aeb368d8607cda577203cb70366f803ca2ef663ccd0b82992558ab2f707ea23633228d15cd509e5ec0aec12159c7f2149ac925d6b32343e251ffe1606d04f2ac2812c33a44c6bc22865e71bed39e6deaa5dfb0ab39dc80e3f40cb590128ed3b48df2056adffc093fb96627da46bfc70a9fa3fe74b2e721da2f2f62a614f217bb0c918be957eb3a22ca7bc6776668df1c3040f522224c78c19bed681737bb9b95e40e5fd4a3077dfd54017c744a23c79e44894c2a1f49dbf0113df40e02e0901bea2c6334e6d05819f2f4ec167fa3e3537773310311dca746ddcda237c3cd6acdf129e2e96e4e1466de31ea2a96b0a6d63ac706d7f29fa0aabbe426c27bf6baeb80e09b8d4f4a58ecedd1ed59a09b2f60341c2afe639fbda1d7941c6ed030d9a711cf17b0b8e67b25a59128af2433c4ad4c1261f520997276f9c9c9120269141616887299268a4e64619f2f7bf8a929c769ee7c3458cf2d3b4829c7b05afda19a65c1e80eea3311b56d2acafea70d8809774270c2ca23ec42a181de2571cd2146ce64c014b6f7f946f48f9e54c721c1ef83a10890474f68cdb85227bacc86a8da06dcfe84a1e6bba9a6b030036055b7332b51b3f39ba212edfe101ca1f882d87f9caa2ee20379ea3af50d5b976880293159f2ac0362194fb5898d32766d264edc570d6b78b9615d3ff621148ae8ce2b1d36562962e808b411f583243a388393a63cdd5a6ad211199610e4213dbc79a492904e9772c566123ff112f21563cf288c1b369d9d90b15f0ef0c3ba1c1b6a09e1158dda215a4a1c8a435ce6de15a050551355791ec98bee66825b8de05694b9810013fd433ebbe6671a0187c1aca6a73cb892224818a217c08c1b85809c618ae529ebeb6021e37a7f4880e32de22bc07d2d87f70e6aeee3673b4788dd1559caf51f125d7b5c797e8f166cccb9aa0a4af2c5d0a335ccf64077d103423068c3a5510f8fd139eed0de945ccec948167df64af6aec6382a239bca11f77a2b091f2e298ca8a854b8c10152ee071c55bdb4fbc1729bbbfbfb64fe0d6862902760d5acf1cb3caa1e6c286c51e43d043d9c6da2104d8bf198fff2d3fe4a3f44a62fdd5deb0f29514fcf1ac87a023a74d8cf3595c2d1a4a0c4c46ed12411c032c2be5ee3a71b4959e0ea18a3c31bd56b73ca5326e0fcd6376c86b1ae5c4af540ba5e3db23cab445fc0f09ab054646a216cc868fd8e79f5a33b7e24722865ce20b544bd0fae8c8cc278811186cd35312474df72d85e96d9fe58b7ae009e997357303df02606100863ab953d820bce8ad6b5a6e8c1380dbd0146aea4c46d70677ffe704da98a39e94fc6dc8cf3a4df009ac65ba6a20ec78106bba4b4b0dca71244a2411989e006dd7520738615b2ff516bf934cf3e67e2268874db376a48fbe811e9e9d9ea9042224d619583c42c958f98c78a20841206f6edc6d4cc466920624d65a9a4a8d69a0914738064aeca2404990a5b352b8d9fa89102dadc981bd35624ae15ce5185edd06927cd8398b73104df610aeaa3e39d0e846c217072534f1af304527a273b1e4ec3480e21f9720b0c96b793b363a935c0b21461d3bb44ecbae5c92ed537105d184813632792232501b335f48120681d15545ac288668fc8194b8018f5b6c5422036f1cd8d203c58f5c67d62233e86f5069377e516dd07c951373e192d6068fbc3ea56072859c1862862f0b8a32b8ef0d35bf01ee30e6ca4899d4bfa4fe3d9abe4005179c856901020b83fd98ac7b2f071049a24fb63799536e6cb5170401ad5d2a820b1a17176a31468823c012771461dd908861346faa13dddd351cfa238db52a15a5a1be775aec5d4a9a5640671ff6d97e907122b9031db7cea861b77faa021d73110474a292999a51f63e7646b8b0736256bdd2652403cb480397ddb3ea59d46a3c90fd3df39ee01c0241a22931db2281ecde0d8d5c2545b35c7f9e5e447174273bda0abba7e4897f1c23fd789aaf18bf249e45818244f8e076ddd6ef3eea73dde507c3083fc949fe7be1b2b384d44ef670ec5d2cf943d25ec9d71375408d81b502b2e490ed934d0a1d2e199bb462151d1443293a634aad1764bf5cdc606a267f8017325733e247c48cae46a0f6b6a36e8ee16dd0f5b9e7a58dabfccb1ccc756514c2be36b36326810fa0d6c57a5b22c8808f4208520225e6226bbeaa8a8b30ebecd747616c41422557f056f72f037ca9f3b9e614cd8e07853e257df1f0736045b7416d4a5619c999ee908dd21a54bc9bab0be5500592ca430d532204e2fbc8d40147f6462273c602f86b262ead5ee89786c5cd6d24f8b870f8dea72580c6362a9f29893ed8c5999582a569369895537fedd0e12aaa80e4ea853916a8206727b82ea63843f2d63f6af0038a2670e02a4caefdc374a43c3419a1406fb8d6ed78641842eea63533b11c4e343ccf3560ee91ebf2ea270d9442b36f710949f22409c2a3d680d909de54b98235a67cda026a498ff1269f0399d13fb8ca4e70b685e1d0db1df0203a1045ea5bf8557baeb5b1bc92aabb93b54f72b4c71a032ad8e0916888bd50baca49d08ca8b3cb234e1f9d0668773c73e8d3be3f058257ab2ff0ee73ec4e6d19f58b183d7dbbdabc8478af5ad8060a7f6d72720266b51a5b3b51575d33e97e5812d536ad99096e11a28c1ab2e828ae55307373623ad2631ba8d1b116e9288940a568b48498b3a3f93977d1f45ed5ebcbfe180f4b87870c9b9de29ac8e8a1f40ebfd115f5f73a4aff71301e70dca527b47d5c6eb48e737db106cd7f533ec82ebc9dad7e67ea93c1b7dfee2e28c4769ce9bf11643fdd3e68895909309b2f529d14a353bd63253200d1e7bfe0dabc02b192ccea09aa0edf76a17232711cda4286cea744d0b4dfc6dee8aac5614dc5778df0e839e92d10e14ef475afc3b6df9a2cfad33d00d2b163859cbf6e0b6d1211bf7bf9495d12dae444ba8111c5e6d2f03162ef6adcac1019a17212a60b6e4bf62ecaf06fb2ebe9443b172ffe014f9ede7b65915c653a0a65930975eace145f02281a680fb1deb225c33f68bcfa263117ad63a85b22aca799e3543c56cac32a43377d9d7802ee60c914404db7b0ccdb08354c70c303e569322f5d84e982363f9a6f3f83e2d6d9e2ef68442fde08022e5a25f2bc80786063559a0bc547b1681474a12fd7e413b214ae628d6ec8fe3e89a8137656357b8fe1052763e973c961a9cb80805c59616314019162049ff6132c079588bc50a3d75e9358c32c819625d1338198d1eb4e0f78e311d54f000318793c6037d89ac324d66d931789130ccff50f29536157e79701f655517c1270354a179192c2666e6cc8871d7c4902896fcc58fa614b57160f0a10d8c17b0cb7a36ecee894742ad99b3684c3181a3b4d23a6ee0a01ec8a9998143de5d62379e9489a713a4544233ef1c978cc54f1ffaaa44fe70eae8dd710b23bc93639a8253ebd9ca48b1c958be458f905827ef61708c45878a55a55f146e3f6af3e82e2125e2c6bf6620b9ee3a6c6109f90c6082badce461006e81601c97b02946718dd4df74725f0cd3956dcd4ffa339dd6db74b367404148c5eaf57e52d796ad2f6319bd6f85aecb36ddb5306cf373c62ce9d40b499e3fd2c59ab01b7d6362970a797c6621caa2493802fe8a5ec2cfad9e14e21d3bccb193ec7b3de7c64a34f4265a831210e4cdd068759c6184ae4820d5a3d39206dfbc861b68cdc5c40fee4cd0d7d7448c7510c48fbc45f4f14d1febdaea1ef6112159ab5cc8cb48c10846f4f48851e0082a43d85a09b1a33b86c9f90891cd0cbb27a983d3aaf917e391dd62b5aaf2a34e8ca18e538752e57de7ac6dc04b63905cf49d83dadaf9e5e7691549d5d71d3e0cc27989b78b90c82366c3e41edc2d4a8acfe551308fd03c745e4fed82c717772cbf4ad814af0128c6c5c7475728d7b49614e430ca032862304cc796d8853964944249bca7735f2db271036d2ec51305a87f2c50142fb0ff2f4606214f090e99d3e1296d9c1f215656466945a63e3541587089a0c884c66b8386556bc3f6f6aed5145d4e372f4d21278b163ad9c268a9c8f6018b948d996687cd47d1b77e288c828cc6dbf57430ad02fd20149ef33b237b24fe6af83f7d23c0b0dd571f9a84c70f006b76b963b6097def00b91830bb9c6f1970b0b73cde30970cbe55ec3ee5b7b2638562084d8107a08c7b160c3c206b236a8847fc9e18ea174cb6c943c637f615f3dada236bcda052e019e23f4c872fc521c544699212b42226a27e401dae4130e967c7be13d00c2abbc099b25d78b12a0d0a068a0ae52ed2b6f87dc1d30709cf9b76e1a14a4a1452d51be31748339057a18da44a25eaf08439eea34c7c585de7191ce3ea1b005f559769e85d25c56121c8544d956968d9eda18b9fc6c042fe3560412f14fa63ea5949372fffc94124cc10e0f1652b2f36ccba7cb94c64c563d4192a31c70d11bfc19365274f92bb085613ff48d8418628af7a7e91a441928a6cf4c790614ded5466ba52cfab680da542847f156f14e94ff1d5c764f693e22b965afb6a0b175d4619c2d73453d7164012b4d7debb8617353ecd057cd7baa0a9cd4d3123cd6a0d6bfa9b67e5accfb02a6e062d69b8f04656e5e2a2ba81889d7a7f1592c3e33e8c9a8679544262c7836ca6c05af9c6ea1107925ca71e616192249e052fc4df0cec7e36f07ad0204ed525a177cf3e7cd73f8f8820318e61e7015fe9ba68fa0e7f0f508cb0cbf40662ff684a4c1eb80ea65fc27447240429508f89695bbcc80859ee7ca027276ca92f9cba82f927d4392ed922875b58a09e75046d1c1fd3c53000d1f974785506f5ddf6e30c302ddf67e26035140b3782dbb21be946764310379814a110e10b7845bcd75abc4b15d3363c2024d14dcf7b964fcca63515c95e4ba9b78642bc632ee5f771a597bb580807b496be348ddd617d6750b78886ba9e4d0617f64903802e0bea11f6c2786e05c06d6ddc4f07cc9d4bbf808331a505f08a05d94efe05514a4b325b4cf0a0d9462831553e31a6077af0f730a9157cb026cf1bd0fe002a00431c92f470712f1fe789cc961905a9eb33187d6eaa4f31ad3e19e976142a700318d36d6771324ac04e70944c2d02ad4a117728b4d73bbc26fa0bb4da9a751821585b70568c4e0f6c977fdfbce98b8f11dc343e1a0c42090638279c98851b0e6fbdf3684c9cc0b86a0a58e1a55633511023d8d35c0b2b2377944e38fae15a8e3546d63f5900a2ca4db6b8976b1fc5a0cb1e8a3a247bfa4a27725e9f24f6db637590c18819693f624492c4df0fcadee005a78ad05b80fe8150fcb4c8abd60b1759ddaae7da2463ee1b79cd88d7cc6877da54d46c8e2215f8cc34c471098d575dfe8218b03aa790ea1253ef45d18fdba3897b6dad30124601617b4994bf583af7f19f7a058816661f8756c0866f8e6e9b92de8d99a214cbbc486d3dc78f20ab34f085f4964e429015a7a4ca3cf01e30c5b150bd8d425a80e5384915f58cb7b2e0a286cc759a3e6649ddfd7630237f22aefb1f8978bb567f2408238caafcc64166f1f7f5e2c384655969c0916046c221d5ec1d204285baa341cf1dc29c461494df880a902810ad03aab7824062487146ccdfdd9647dc5b42b1f6797bf61f14eb2b77ffc33a1a5cb3860ac432ab20f544a4fb90ba33af525b73746bc9ceab992b0b7519489652bbd43d1cc5637b2a82db750769e50421f7559a8fa38d8e72924b80ba5aafd60eee296d96890080358ab64f8f85fa51c210228acaab930f76071f1be5dabf7f902ce8a2a94c8ce5734b698a4822af3069dbd4ab9b2ab8423b432f5a933a4bb318822e4d89016d1e116bf8a62b00660b972ca6906cdebd6f475764eb4f7f624b3f0a6a26284624f2f7231b49693101836fccf476f894450cfda4e8e6b243e77676d5e3abe504ecb0e9ce940d88591f35d2f9d866a4e476e3440500130968931c22dd2ecbe499133db4a00ac3e315a87df285b1c8b9a64b3369a62a0078e5b8bace02fd00384005b306821cbffa59262901b40ee97d75fb24772ad690f68cbe0f0b69e471fb1a9a016f41354fcfa5ed3d782260c5b242b37ee96aa9f6cc7f38986ada8513a10030d3475a2a84cfe16a6042c5f898d5cac33d89f438006fa738955156bb7ff99de19d2699bc489865d32d59221022028bd766b8ded9d1a60d4fbec5e3a06bb036794c296eef0d659f52e8c3eecb093295a6472b1b2a49f56b61602c39e9083fd5ab02c0deff58eb3377b2f4a9eb893654a72e2b72bb23bfa768e8e882c380a32aa2ce906b617403c7c8c35287d3581f6f68e81ed432116f4c63281b786a4ce567e012d87dfd6a85926f6f15e86a98e012a9d0b7d56b1d4fcae3a7b1905480140a100287496493611203c6ec1e2e74700256e86b9cf79ece0127318f5afa398e4d4495b0c90afd325233cf22382f1e7eb6673fe1a578a5bc468401c7aeab9313b0344ac890453dfdbfd2b14e76c2b6136d58d63e60bd78a1ad579fc350c893d79c1a0e293946021cc0a0d0ae7346dde2afb7c05dbc12cf8befcef9c3510a41b6a7d125cdafa5214a1d9983b9aa19c890c31366b8889e89da73bcb5f1a0d977107166c5c39b470321c88a0bebac488ef95e9ca1c3f3191d59fbb022670ad9df061f4ec887e3d46fab851a0c104fc6431da9f1c23bde06839b7738b09e6d30ad8e5b4bf54cce45bf9cdc0852846e42a4bb94d57b85706803712542d1fdd8881041128908a31829887de25d9f180b71a171fb9e982e08c32d4f6e5c68e01e34cd8e21b7057552efc3f333118ea080cad7e0879c2b31f1480fb23ba2e44f75e853bed2d3d0170d2acd237d3e92c613f8c723fd8ffa22fc78672b47fcb509c983b92b0f35d9d452cf8b74c402830c30eaaa89b51dd7b4b2c79c2f7ce5901d03579fb59113998c3e39aa5b2df33b9aca4d472f60110d0d1bb89e503a544e3b19152fe642eec7047e8a57b860cfbd0ed633b07cc261c95d5bf8a8e54eecfe408ef00a83cf874d0c706a9ea620992cdcb334f1a16b8ae8f8426fe363b2354db5b996f4d8d99fea5ab7fd734568c329ee6443afc5ada014b0ae86af1a5718b2e3f33291e7d1cfda557df8ac870abdb021b874f82cc67ba36f85c6b305ddbc06fb1992580d2b77729f4952fddcd7d73bc4c9707a0e2275da22f42da8037516d4902be45a6be20020e20f4b9d586daccf1b5aa2d4e9dbf1c5208b608b34ba5bb0416d2ed11fa5457bcde55f57663e280e41ae31c0a4f8e63cbd2c5602b6bf0edc04c386515703b0fd74be28d8b0bd0f67431201cf888142a392cb2c460b44b8610455cf645fc0cfe36be9ba7681edd9737d86a601331b20d869466134634c0745b9ede38d3473b52c19762a41f932ca2d1f6496112e2637fe716056193803fd88f7a8928fcca57b2e5f6ed7478fafe76e2bf4b171374ad2bd17c24d20a290620d2c73254ac08798275f8a2991af88bbc6cb2a8c87bff47fc67d75f0b560c798064302d4ba310d440775ce5e962c2478f19698a71b3bcfe2ecd99b894e539832362260ed46c089bcd2056093bd35c42e4c84c10ce04555778adbacdf5ba5f9d67d967c4d8a8e3b2cd31eb18e94cbe082e6da240b971711d3f336dacfa300ff6ce48a1d436a4e0d5547c9d323bbd625a085f9183838944e6b505eb847100e622d12e89f7895f1a090a5f152e3c3eaf64d3ada56300a10daca55aef708f07285f6222a6a1a42887fd17a205311994e78015751de112b337472c269b051bb4879a7cc74a755d23e7614a1529d969225ca2ff92901bc034d75907f28706f61431970d04cd3a9bd964d85c33ab6cb1b7e6c7f36ef6c9ae23ec415c1a8d9d3f74494c4e0a9ece70cc8b36f5d90a505013a6d6145c61148072b44b57c13311f37279ab00d92861fe3da4635744d3c88631a11fc595bb3fc319723bc7026f800d28d4b36adf73ef09858e60b33ec32da635b3cf9e0c6ff86ce0e8d605aa64c628c139fa6846e97fc16a47026cdab023f70a8cd08f6a35ae32f38376873f3d3c157e7fee99c62d136b9b8ae044025eab2edadd23b03a89617db3616402ae6d4b5c1d28cfe85cf44b1ab2de31240aeb7b2c68160b902d80aafb51b6af42e4d866f7c64f25418defc4420d3400954d511b4686457e09f6fa263d619cf500884c5ae167ae542260ba4dff3a11b810c56c0c5eff795675ad620a447e4f91bcaec90ed70d8f4f84c04fabd942d1ee5afd3d80cd073980bd2becc45e21a8faa847a6341d99fe13204ed2765b8a3d03a61574f530d069ea3607270c101799b701634d5ec098c052de838326c74af43602c02aa63353a18b0a9ebffa8dc48c94615400466f242ef11f62165f0b6f8ee7ec9e7434846017c60c2f17de42e0220a2d4f85458e340722f240cc82d53166c5000e384e5a6b25700b75a5ee5e56a30eb47f114f8efd373af78f2b2403f2acf8087b33477adb32b9062c38b2435fd84865300e5650fef1f06b404920c9bc91c434ecf0c408fb65272ddd323b91b9ceefa60c1461827e3ff87b1d0551dadb6a5255b7396ea2a5a458b6a50135962a4eb5136f5ce473fb4027e028062bcb7ce36e52a6cfca2e0abc20decb4f82f2fc9446f5136fa80cd6fdfca828234ef347500da04f6ff2b19f315e01e9e8bd55ee1f44d31a01a24da9b64ff8f05dd833f687a5238851a438cd34c1d34a330d0deb204236c6b0f708d8a1c47ff3270918bc8bde559e3ba26202445c02410f1cac67d0248cd2d370230c13292ba46d2f1f6856ccb24f40a08d7951e9b5e0a45dd6f0dff07bce57d6070e6d37ce19b1e452b3a2661afbfe2fcd8140b72b669511c69abf2db3a9c8cf2d22cd0657e7618391323bc0f0028743dba7f67b38b6aca1c610c7d3fa1f3c7b02be48b65fb836ddf99f00657b69b1bde18122f073fe83d19bd4f9c5dd8b282507094270019145934254dc4e05f7c886463a231a075c4158b9fe248c5d4ac755800e5771f29a8227c471eeb1c2b94d690726e1d86dd9d3c2d4503ada23beb5f80eeb9411c953ad8c400d510e7beeace974698a4680a12b64d193ab0a689f4bca39fd4f8ca196a7289ea09ef05a090b5afcda1fa41b2a9ae1a5730d8e00563429eaed2fc94d8ae03f414ae52a229889457097f35659bd16c8c6403153680418205c68b688e6540afd1673eab01de47980b3bf879d6469142a30501a5a2761af19009964d9e46e3522d0447f22e4bcf9b875137d46883ac7b4ea1034146be2f4309be31db2926ec008f00c148f5466c230c692b10c8f84270ce1d48ffdb982b92ad7f47a9c261282e079bb665c1a5352715318cd3eae27e77b1cfe7e50f25145917e0c337901c40809b27a61adbc60bb4781d5417affdbd524458f1ae624360930e2d150b5f634b5b9e70aa7eeea84fb608c023cb6f7e584637e013118a324a11e060df4115763f6d1c49e123ead84209fa5144cbbac9dba17043fb45b4d8529a23ec6e5e6c8e3ed65557ae8779a623a449fefc3f5552441283879d88a3799814ba2a071d485293fd65411d74ef067874e81de6ea75c1f5dcdf1a8a25453dac63a011e77dc1fdc4c8aed5f0b33a5a51b25b65330d6fd9db6bb4a0520b40d862987e77fb5354b7fbe21f42d705431ebcf995ce318ed4452cc339a3bba5a12224f988b180dc0be7a43b148a11a71094e2de09797b693122cf0d1c83ddb953bca0a9a0c75b975268c4c6ff949a86aebb525e2e3adc0a03456ad79d9fe0d9be53d1b8be9ff69b2703b1e538e08dccdd96171950180cfb8a21b75419583e3c804733c4ecbbcb237c87db542f93559df1a7e5bb8a842193948887db25a846590f4659854b464f641712e26e214fd0e313fb813610376fc885e3d7c0f86bebe1bc80f101b9f2189496df7eab553db576a1bcf865d4890c6294e1bccbc7602652b25b9aa8da9ec398b9203601c7e18be86586042792d919ae3a7744231b6efedc23e396a27dcb48cffd4b877120967f4ed82e30a5a9dea5b545bd7d03bed8ff306ee7b9daccfbd04862275504d18cef5768f1829c679331282399e4326e93449ee6835678dd0349ad2491c7667136d85da5df68f381e4b0c2ac5366cc549ed461c68c453a85e680c6ede34ff85a3a1a9bc49d3c63f365b6908dc25dfba63dad591a7c013536d30e12e8b106d93119e8b3a9b29b56b963eec533a2a859de26c438608eb8c58d00f509a6b3f2aef1f18fdf7d4298ab3682837179e1e6d58a0262977264faf249beaff0ec1ea6d0de6f1cceee46c556ef367b370abb58a86697be1ae883c6d7512900b749401479150bef2123ed1602bc53176b32843aad9d76ccbd304580541318e33b20d615eb6234358e9f63c5e195c3d5decc1c4378d51a470dd6e458b4b9c8e9a458202c628015342205c78c55b7474f9eda5a3d5c7a0bf276c7a15937f515932a9b6fa0473de2b1a164b21ddc8d3a456c494c6ec1674151449eba583a5529ca81a90cc8d1660584e6680bb3b2c1226c4233510c790cc0127d40dd2c20f6360aa03ff52552694b3417e2d92a277a0e2281d74e945deab890c07fd98f3b7ce24bcc996a6ac0d9e8febe4d3879f4bf53fb1130b9f024400384a39725622acfe84f7b49c4580d8af75ff48fa4dddbc060e3bfe6691c311c1513cf9738153fdf1a3d977252c0806547130f96e79ebe8cde90943058b78bf3cf18927d33f8f992508e78e81d3a632c08e86899a152ae47d8d1b7a3a5452b2aa41fb7eeff1b152bf5a19b1f209983c5afbe398eff60f3a7c9670bc14624309a4f905703120fc4c53d49741127764bcd901d5ed57c86e676e474a88b8898408d9f580dd1049a7fb4fca257ebd5f8862d080754ab0906930e11723636f32e00718f65ce14fba49dec0cbf65c397d857bb34ead442c1b6e2e58b9a6136c6bccc44358843b5f539fca17faced355e67a367db4962631abec902c220788e3fc0880eb25825c79f2fd807f8474e536687519d9104d7ed74e387e35805bcead4275d888e1fe19f737bd024d8dcfec888faed762cfd19083d053dfc75b3164a9a7d344c4de586ebf4a2b2bac2a42a9ebe8a5aa441c6e7eeeae3bb3de1ae81a271e79dc36440a1fe5f1fcc2f284107959d0a058e68a28c68f5e51b14543288bb4154aa6019498d101acdae40a0535ce85dfe0ef2607f6524423673135cd00b34582ea8b1b0ea81c56f3bfb71f6c375c6d5bfcae1fff7ce989efa375b91d0cd80a75d01b0648ef5935d770ba0f6cf18b7922261e67c814df6a56015b7cc4acf52618f0debe1860a5c91c0d56310093f51334d4084c71115865e6fcd4fa6cf39840369123033ee7e53390478ba324f06f9dcb43d540d6c45b0a7981d84a418a2705dfe7523d9b4f93c72a12d0c30c02748962d381c7d07c8920e58f1774c53cdcccad61b663305ede2292e298197107243bc2c992ae656dd73d89c4457a5c644bc311f0fc58417cd84e2e60c98512d716805ad800424cc35bd000e6978b1ed018141b7e24d423ee24bba9aa9e0516c8722a0e22f111bed1d1bf5d37d16fe9bdb4c9ae3b7f2a8029a600bbc0e043fcda811e2d0454d28fdb4c84cb3911c6f60925a1a16296896a1f10818ac07d4341ade5718dd43838e275e92c44c584f17a4a934389eb348139e1dab026aa16f1b339ac1de50561bde2bc66972e2ace3e568d3f90ad2f65a74217750aa93ddf6b891b1ee7fd71a9211a2c2900dad7fda4712a935809baa7058455fc8177fab5d169c91e02618ce323cad815e450e122ab1de5e62c7872cf4d31c0b810a632108a14614049d06ff89c6bf1bcff6ffb6d980c05d53a16eb1d6e5d3afe8e82d395396a3c2a1cf27afb1fdf2deab93d3ac18ca6267ee204bc395911cd015cf4ca9bbbbceee04995b02177f4373838e9e0f3f497103a9d0cf5a5f9c9dd7e6661584ed8e9fed0c7bf560d736bf77dced50046d8f0a0d35e1d8dba91b350fbbf8d19ab824fe3f74cceea123d4bb7d077d0140192ff47ae6ed46484fb3e9577c681bf7320f6aae294ea8a5ecc45fd63c0bc940f00e37f5d2a2d8779e902c6791ba0a64ab17521f27f18fa3770bb93ce2aa494de471439b1b6b708cc952e469b06dea064a97de074956bfa172b5d58f1eb63c1477adea3cd4ef0a690939db5c2d5e0fd89339f8d06e904c6fe7a7e7cb35f37d1266584a18b221e8242a531d0aeea53c624690fd0da49828a016ab08883e7bd36b45874b6fde211423453aaedeaed60d5c3da49014e63d8332827199632b80caddf22ea9a082b1455218fe9dc1dedfd85d8e5d16de287aac9891e3bff78164d325e8aebcb4abdd10199d3b5ea0770982663278fce9de8b33f0fede9344779ff9ea5e3284242b77b1078abf77d8276dd6108ee887e521e152aebe936554588fe18e7b8bf24fab8495ac8a9f9d756a16dd27f7c30ef5f1bc6353aa1159819b9c80fa2f74d97590032ec70f8558696a06ed269562d54b220de86ac74c371c45cf991c5f1bf4b2cf5d3f7a10b1d8087c373da087edd2b4ff470a9000a04c9d5845fb598ecc7c7225e13cef031326bc2b00f488cd07677a48d31e5d7a23c2892d0f3f97c264cb1b839f712ade772292b25609bd5aa9ceb069265f31024c2707c16a503eed498ef77958686a10f4303372df9ddf6b6ce11d623c868ed744c52aeb70f74cd94a369e782826bf3660b3915ed2e7fa857f88594ac32f8e065007cc10d8897167a8a48baefe22dbd4980cfbe537165d20c2a9f73ae00b6b681e85354db51665933b45a0541b370dd8abf05f55b8113b53c5b3488c74e968f051cdeea551d145c4b58165a6fbb70ccaa1dad10f49e1354e7063055b30af650449527385bd665373082c26a9508c606f0ccbc8c7ca58af886815cf45546a1941f42131dc5b1af416a1670d517a79eb7e0d5c69dad960b11dab8e192b3b8bd17be988b4a680886a885c681157f5a509904feb95d6df9b053e40c879eb155f914ea8786a030bf613c3412e0d2b00e1e5f0ac68c948289c18a1181f93f8744237b5112a394b0ee8c536072880ba43808a87232b1f872af3016c6f3e5805336423bb9dc37cfdd00fb2a2e32895a00fa34d19846e57629e93d0c7622a029075be95d6839e1243cb9fcb40eb054a59d052ef092eaf40791638e24a4fd032612f921591f0dd22b8c9146a7185010ced658307006e0da5563980572dc7ab9b1ab5dc41d7bf47863a28efaea0122a34bf74a41ca068b4cb01d31635a03b061a12a6ad68c9e6758bd87bbfc00954308f287ae0f2eb251ed92dbda4ec493c5f50a5d1ab8fcad98542d0f7e9f50a8dae3b4d2d900af4405cd93ae3ba83329a4e4ae5f6bfbd8b5ec54bcccd2c7c2bf62511fc3c6aed7489b5d6d8d843406ce133c5c88cad20a3c65aeb450f6562410031f1af57db08504d81953649cc90ae859401d0a0b44443c79c2a3236ae01648ead052323afbf39102efbf0056d42a01c3054795e13ec4cb6ddaf09b19392353251b50cbc6f9fca6696541ba1fcec9ea8c68a8221328e8f2d8b282b7fbcbdc50a8cbfaf517e4785921d17005eb2b84e4c887734133894af3266773930bc7f9154f3b1e6967f273bd7511edb82e572c06834d9967b71808b0cd88657c57c392a3b6e03be4e3a37d65cd8591fac40d0a31f6aeb4079f643744f6d692678d6a4d64bb62292e284490fac07c3fa919806961b8a34f5cae03cc6e0a6e836d65176c3eba1f86f1c94f4eb5fc1e17c39302f8cf7e07f40a47947c03692e621617d7a93b61031f44234a020d378707b94b2cebec36dee621ab71b0bb74500c65ea63cb2c6f106995204d0b552ff8bcea1fbe8ffe1464b39822ebcdd74623e748e098f94069dfe67cd987ab8ed805d5cbd0cc9ca43596ccdefb8e4e970db4f434bc8a6e0653d6303cdc26c808748b4199101044b7de846c447648b8461bd6c1e154a7d139b5bff3b255190d8f4e2befb72cb39230e3bf29262a6c14ac1569a76ccdef0dcedef3c27a93ffba0132dd40afde38078494ba885b8db468d57125956115d597ec1da6005511a2fd9a368aa1046f21df190e5ee13699bb44e5418fc50c0d3083feae7b961676d73aa01e5a1509d40013106a8402b5920a00ea8e6ba23890fafea8d988c2c6b1a82003f926f674f75060091b37400dd24f051c43c59648f401a798d6608cf255da7874f6c6bd5630f80f04421752f2d450993e4b91b0cf94aead6234ad0dbd6d7894682913da9b5326721ec941c7f7a5bde1e5b9eea0b14ce2ec7c812a4b54588a13480b86fc19d540b1e020c2bdbe9421fcefda92c616e2e39fb2d2e3cd32f5f7da248e078e7dd198d549365585ab69f547877c4afd3c0a658bc158428cc73b412677033244600033b566041c9c87ffabc75934de84e03e8a1d77e01e937c29be4bfe4dde19e91ba418d40314a78bb2b02352a2727c6b7c103fddf65e6ef34e5dfd1ba086751cf107c99f445703e8ea253e7f33c44ad63827a85c13222b268cd2b80607d11ba5372cd99f58ebec862abde6b6c67747cc7c278a69c098b08d77e26fcd0992c07dd684031d0dcf45358f5b6599f86a6bd2d3efd59cc20831239467b1bebc8ff6337e27a2b64f70827bfe41e57c1732dca8601cac0ba609d8faede5ff6de5f45d459261084137b6c0a28f3210e6742fc7d2966af1a0d770d4d5b96b0f68ae5839770039873d0e1799780d82d29ab82fbfa3c34d0dfd3c5203960bf919256d65c54317e880d204b4085d04a14cac71e2a8c3f357a56d3f4c542985101f84134abfaf0a55ff83aff3bf5921afca1c4e9f8a93d9509d0a3da1fa1a03fd666036ac21efe825684667f6998a2ff606c322711fba13cb94259c1fb364dab5e9cd6c3221ccced68935f44749f7c9508e0d200478691d52531c3aaf1e793506715a875caa006407e3e5f7b0e2ae3830a04edae021ac8ca15bfd02f869c945ee04ea66bf5402953ceebd6d7b0243473487aa2890217fc8745fd24f3cfb0c292ec575b120748479b73c6bd410c7b734533432611fb186de95c772e18b3d0a5dcc75d8cbd991be10e8af633e9b6b7cff73902ca3e981f584f57ab58e0a7ae5df544c7999c61e665d601b87469518d24881e5f9b0ff237a6f536c2543004c49ca8ac8554730a2d679d2479f5cdce0f23a321623179ff0810d42278f935b2f7367423f07ffe18dd9477cac2d923d8d86ac1c5149b703c4da92a19b5acd8368d6e2957f5d47e07fd53fdc109eaea1ae2f59b9e47a39ddb187049adc6dc0888c65653db48ea7351ca6d08d92f2e3438816cfd711254277540c5b95dc763c25083a9daaa84bb989c3e1686deafacac05c90d811cb223edefb993d33b5e0ae5ce1c7b27570a7ef5f45fd65b80808cfa40f8f77f6b1512bcbf1344e7534c0cd84325e234d52ca9c523071e15440bdcda62b5f5da2044122df6c404f923a7cb7cadfc1549d6ddc0f75465f5816f4cf6651515ec833c65045921b42074412101997476ba69171a7a34c6241ca5d8a485ced9b6d55c0883112e1890598e5e8e03fa7bb5b8f4405b8d016ca227ba2da507b5ee14ff3885249d1c8e834133087602b86f0eb889b27dfdc400a9d8264ee7064b08379017b9576fe70a47ce7bae61d62f5c64bb1a6ef8f5a7c1ed0ea695e951237fcafe75c8521600d73d31637f0c8a930c9922ff0ce05e9d6b07078f48c8f3c855564572b0b42b467dae31263b5dd5e9bf3cd481b9f6e54a692ed4051440f1f3a8dc84a53e7978a2c0e09679bc62500a56f39b9e4fe98c9f21a225af6b1d32d12c97b6606a1c98bb5096499604ca60ff8d32f4d471ead35f2c3bc402b6a8fb8e35c2499ac086f48007d2b9b40b11b3611e0e82ce1b88eea3c7bb2232cb54251bf36e54ef5393abd4e101deafaf578e1ed971eaa126cd865dd0d368666c66d2dc1d550d95d280b203d27ccb3ced5489d3de36864d6314ee6e9ea06a8a585ade24f6d12cd1bbb2c359051e9cfaa9a06e6a6328484299647ddc1ba27c7fc4dce0739bbd217f043a725736641f49d25a1732be45d56feb3358792f012a4d17afe28ab6df2369bbf124fa5150f3d0907953b9854c633c067acf1034af73bceb9f3c3e014174e28ecf106cc3164d4a256f1eff0ee24a42cb5202d84d725a79f2259e152250498ce0ec5f348625ba2d7053f10eb95f2a4f516ff9a36d90be73f907cebf554d8e09ba1a35e7610fb6949e8cb3fd94156718cbe9fa6376183f1a478a78237814a2d8c1cf14024565b8efbe4fc632765a9de1fc792f3f223ae46005c731e098893bcc90897fa010a902d411fbf252f9ead93903964de82569f5764a6953b95cf2e0c1ac306e94ea26bcd2e4701b05a68dd6018952b71294ff8cf9e964aad1feacca58bcb343f20aa9837055d58bb8bbebf3f375bf0db57f53b0ea4e4b4804777ccfa4c00bc601a54b3e474c6d036c91274955e6db407ce8addd01a30283c7d2e04502b5dfee0daf9146270985bca3e7534606de2855b93319a4c26003a1fb2abaa1a3394a37033d52d815618831474f4260c62ce6930b699e8d0b76968093a4943810418cd962516ccef3c4cb3d9cb5d7752ccacdf1a42a6dc33a64a5d6b86534e6be627e93f7a3a689713913bea03acdef32e1d86b0c136df973a5e08ebb181817b64958c942e9e43eb17dd305944bb22d47d547b56f475b6ae5dde310b75ce19c4c8b9946dca5182ba9e3ddf4c4b894be4228a4a9db68726eee9d1b09e4fb4db57089768235f831af6ad3fd140d688a0338ff9644f5df29f7660238d828400d9cf7bafbf56afdab8a103d2d9122d22f417838d12dc80501c6ce5bd15b4ae3e5f7ddf0edbd752e95fda6bc70e831348df9644f9a2cc3575fb68e81180d6424c93ae8aeb5549b9e6ec9fa9c07fb8789c70b49be157fa8a0242d7f5ba1c37ff9b6bb46f1eb6f31771dd1e37813f03b75d245b55c9456ecbc18e4e4212187ffe692ca23248bf4616f5f2e5af49a7f601cbd8e12626232fa6858661e507085eb817d159d26a1e8e1a05d68e2873501ba081c7d666956d7debf6952ccd9525f5d4dac4d163f0297b346c311c4e63f9ba88dd4d232ba5c888b8c4e6513557b7c068b43697f3310f2509b9f85f70c3d7ab5889f9b5358c1083f9d604742435d6ceec2b927701cfa8103bf7975e813e32f8480e18e732f6eba260642c02a1e9ef206b77d8455582f7b8235001527e9fbf0d65f27a60339bf01bdb3fe9e165586106af9a289e84681c9b103e88003f0e682a5769d590401e7b014408dea9c4259029d84183e85d485f3a4dacf939e0e9e7f4b21f5c19175fe0fec846b4961a75f781a83611bfe5c051212bae167ecc81e939ca2946dc76346415be0b56aaaac6348f0e636b3445c031e6e4dd04c09c7881691d3bd53dc0eb02441f04af9f0a1570df5a1da81db31df9cc91274c055f192d6e2a789d52ed32a73143bb84a8da4c87e567cecf5a9cf921457526cae48dc28b96fc88790b77ddb85b5044d21a6df8b3ae33529245c33a2b8cfc508241fb448ea2f8c5bdb59c45067c42873559990d4ebfedf13f639f3db38bf37f853410862339c3e4b38f5e5458020e5598637e55b2e78a01dc97d26d9b70d0e140dfd4598a7ddb5dcda1325c674f228621b6e2ca9f8602f0720038f829dfea6e237d0cd8f23e0bf4b43b8109899887262cb4d2b6eeaf8982ca1558da2801d7fc402fde3581b9e593300fe64b8fae3472741ed2ecb405a059590ec6961fbfe6a48ad547ce8da6b8955d29999b49878918076291b49a1fb26f1523ddf61aa6d411a956c07bf168c09f23f1b38a737485ca8f120dbc3fb7f4162cb6795d0d9d82bf7f271ccfcfb3239cbb882513432c3e4eb3354e1685a030e7023e62a936afa704e1fe553a4b637a2c064e3a1204235f821bc6178cd1c6aa4ffe733cb59e69f737e4708eb983ed81c7a9cc150767a2605c92fedbce7661b55c55df7d5fd9e7d4b206922916b5456d61bbf1d93ae1179d485c1d6467e2ec20ed141e631a0fe8038702d08865814838314ca24adc8198fc6892a45b8a54021865e9cc0b718a51188b58332c76654f98add7358ca432678d8ad42b48df0c62997090915f1c6474e5e02c90828068fa43cce96cb4fac08a81ee12ca9593f1aac27c75279fc68c14c81f5683911ee33c7c7d48fec6b49a34a2b4098135954afa27cbf28d2f9dccf837c8314fdedb1d823763288752b5c59fe1669fdd6782b9eb1038541dd17932c1519c91fa4be9c94a2135a9c40234ca5fe1875e4707d814c6f3b0e0cb3c8539c1adbe390785aec115959275b8e5f2ef18007a844cb1feb075922427e95648475dc22f2a2a1bff8cb79096cfb5ae81602ebf8a1fe4a3709e284050a727db602eb875adbc41d6be3a9ea0791e29fa460bc7a96761b9030b6a95bb8af998e4859d6895b7e246ff440cf1b86ec9cd79267a5471f88231bf1f10a8c4e9050b402cc67e2bd612800d5a18b01614571a732b11094c14f8babfbfbc92ca4e9af3cc1311166daeb3064018e60029991dc6fadd7acc0f25ac5e5c4d710b03ce6066f8857afa21255c8924613baeab123c12a4348c968bfcbfae7391b145f57f2a519cfce05379a4e025484514336d359b721423ff6317347db9a30940490da816c1412b2be8151e324922518329954a9956503c2541c221d649a368ba11e1342ad54abd966a2425a7b0bf65427858e816b293b795e08ed92fae84067d09e115007d6ab7a20d5e33edeeb455f60df9ca8df1c5478030eec31e8448567fd9c440102bff19f9ffe8e73c576e22947fc68ad95748ffc8668b10169f091d24dd3d24b24f1bda08ffcdb81519ee7fdadb666e08fb97d96d9bb1057471a75904ab21cc4daa17ffce191c3a8e667f7c6415d409f75567bdd93f077db8c55e8f37cef1b3df95746a0b1fed3daf547758b6e2879eac0db094f8a9479de4e5ca768e0905e1710b84d348054ef9efe45187a862d84f68cdb1d1eb77c7331bbbdbd0c20b0e4f9d65341b9c9c36db28f6f823e0f7addf07087fc8657551b74c2073bc5e34c826e06731c98c901792ca280fbe4380463c7a3c73ee4af03daafa9a022d7c35526dba3615016b85e636e9d16cb929b58e574d74d016c172f089a3e7cdc6dd366d45c747549b5fa6c7bd92bb56f0890479c77f696dc2eb8e945938b3de5e9fbe76c6314e35b27ae91d689ad6058654bef204930bcdbae60c3f0d65d977d17dea8763b37e25ca9c7560cf47c34aedb6de24ed4ea56cb29ea62acede6b00e83d4f74c65cd29474f7ed30180993ccfca15aefdc66b43eaab114c5a1f7725a0e3eff778e556f36ff7cd4af2a0edfba1fb7db6b9031879daa3f0fbf01ea75c3bd2dffa35c262526beb95613cbc0a3489ca60bc79f3461341b7633978023b6f7b177e11dde1ecb5b62c0f626d00aa02bf76eca5685f337878193f0ff89e35c490189b9c677a311510090dcdf4ab78b2e9a770f17cf4dccbc4a41d795b1b146c66f6610e2437fb5cc642320020fc2d7ed7231b18007df730f70534687c0c804b5d75f87d82c1f00b8b26d7544376e2008820ff23466dbfa1fbef31e2efa8ed079d1caabf89fadc677954e3632f3505e6523b32c4b3b610d3cc5c8190550e43e302e4ad556736dd97cf7a55d015fe2822f2a90e57524da6d75925e75f0e654c54304862b268322cec588426bf6801ab878907043790d0a5435c620e255860c3a8b88130f87c5a3b5724eb83d50af902350466da5fac8f1a5e334d44f12481423bd281b36055f588786bc2af8bfdbf1293e84d16f1cddec897e7847c1d65bdf537b6c8516fcfe876ad1eea534e5c897e2a744054f4f975b63077efc9ac52fbf9a4c432f501a444c15e70b3d60d33308dc5e1407f3809138042175ea0dec764af7bc02899874b0dbc41aae268d769a46cf356098ca0c8a562421bd74a24bfd32fa890a068c58a8144572f5ade85290311ec96d7a4da1a088039102cfa8eab5ab603288461c1050176b1bf46f62f5148ab6f305ba8ed9f6775208a717d7702f91f7421c0f0ec08f9626891882f45b78e95e4356720d9aa5018e324a0148a4d09a28c033514af8941da9905e6d0ce07bca2839593a2069de70f1a1f0324d3e75653f3ae426801a5a003a7e3384b6ac6018028a1f5a3e6b78ebcbb1c0c82542b87b25d3bb61d84e6522e5779cc8c5b9dbbf5201507c5447c7dc1023c0c1aa0a43acc30ded5382f2e0d6366bdbe666b22990926c7c2385e85c0c76c65d0c81c73eb58fa51743eee878972f01a79b688dcbc2bb7a8953f3d37d35f41d76ff0cd310e055b9adf2e13f3d9f1dc2dc5c50f44299aca3d4a55385476b449e260902aea2486da9ea9be33e9296873e86b80de512d92baa31d31c852059a24632c6ab9323c4dde9a98a950e533ada75259a693ba76f8b5674d7fe9c036cc8a011f4ba958b453ba3060c374721a1c0c43791346005c21c5a1558792eae23cb49ddf40da5dcd7bcdfa641099ddabddd6da7e8eda5f778805258fd291eb55ef1bd1f890d1026e4160e1462e7b24b9e22a57527b6b0d677095348c9117592cb0fa76a8cc6b9a5835937755e36f3a5e49b728f65890aa1c02bc1c2255890195cb58022ed251f16fe05b26647e0faba85d2402969f66351ead90d00e7ca3cbde6ce843dc1c5256dd1287c505128ed6f76401ce47156317ebde108476e3887e5dab835997fe547e251825625188d1605549ed81311610aef2fbef5b40061b031508fb7da702fdfaff3263e5dfb2e98df7b0b5f02d98d7572134800573a0cfcea0f9d009242abd99f077fc1aac60801f60dfe59c564c8bb214b89f2abe0a196bb63c1461c15c1608a9cd8250997537e1b35f5e3b899ac5bd2b360195f57d136571a89cc2cc64f61c7434fc780cdeb2dc72f94857b0892300e2a42bd67f4119f5c8c5b8f2d5e8fcac5b64015b3ea71d32f20c28d824541410077d8585c43a414bffeadceb19c749c0f8bcfbe2ad9fe48fb634fe7ac3c021a32d3d6d664421863db0103a36a02dbeb98bf7f6f940bb9429ff45acecb853d4cfb9a3992052e72f81fa6fbfcf56d14ca1df7c4ce9ba6e4207fba3bf58f261623c109ed949146c1cfad4418d1ea2420a624ee59301c75b4a6bca78dddf3a65480e7e7a396305da80a7a615c0551c499cfebb07b81385a48f0b6599f801772f03154577e4c3e76b755bd75fd65abc83392d275b7c6c0e9aee2ddfd1326123d9c20116f359cca47e87a744aff545f00bed676b688e4f9d5f5f9e5e3b0b56dd2d68c324536104271d7626f3b798a450c9d24f5fbf67ca16ebe966199ee5db3f2a95c1d2d9542890b99d42be21097f205a1514dd4cd0a04e3e421367c40075fe2566d28c977da0b83d2bb94f9cd7ac3a8b416fc0b0a807ff17776a389d12ab3f3edf3e0600779712dabf5d028542f3d66445279c03e3295114446acd1188a89688501393155f9e6219f0af35cf30a713ab52a6cd1b425030a41143dd8378e318045bb58cd5348cc0014a930000dcc38c7e64d34f52d3945cb72abb68114be9d3c7f2f2e233b7eb7f61fea4fd13c86192ba242c58e4128b8cd15b0975fc11b63f483a6af3d7685d9120d835631784ba4c3f625936339dc45ee3358e97c6c3c4d0a389d44313fa18f88eef7cf9d218ec944b9d856c34bc68d5d3dc2b54fe59c7ff7bcb440fb91f70276ae38c26703cb3ddad5dd53ec7a0a6fbeeac3728d44368a6dae0cd753e38870d3db137a4967c4a36e3c795ba57bed15e7dae40c5273af9d0fabb4971a76b62f349fcb23f74c38431b6bce511087dae87b0dd11da8156f525d3abce9e507982f6c217daf7da0ef8965881ab410f95e2e549ff873cdfba77a090db6cd267182c32e634266bfef02c35c46b6f58858d0c76ddc5521b12390d55c2367006445488a151793f02fd7205a3cc21b69ef071c92e72bf7083ad9a48edd05a281e4a8c658d066bc0e7d5b053c31db99a58ccb700b66a14a650a986a321106ec1bab4eaa2e35db10618fb385d6b3aa24f60ae21dfc96a2a13c4ae9063accce95e4b47e47f040923de0504b06af9b9050eda3293273a9b88428052cd26cdb1c9a2b9202238bd9547c76a53fdb66c1b3948568f14a2b9c4b928f46c66ea0d3d8c1c2b6f028b90fc0293489e52181bc15123f5bdf8161c40b022b2423b53b874f8112c9d4003ea4c77bb643a2c9b4d818106e2f07715611109178d74fd1719aef39a23953b78b497b1a3c4658add6b95a93b600d38959f81a3ce9416a1b14a97bf1d19cdbc04db0e5141debead6419a8eb019c9145c77c842a3ef8cde5c532e0c495a277e85e2506edc684da23dc2ad2eb4a366057963066b2a0bd9a1a0e1b8793d7cc740a090662fb39e586b06fb768eaa334f1cbe932c6f822b741d8edd29abe47d8837642d8ef93a78a0cac6891cf4dc8ad9b52fda5b669c95df6b9b9313773176a8b16147e30527dcc0ee13e9435abb6a7ecbb2aabc71c26e66ee59037f3162a7ea16791e04ccf773eeefdfc389af59313d14b2cf49ee771ef6507ebfd7c9cef4d4e339b332994ac7d1f6d352d4cdf812b025f2f856b9b0060c6cb41c5c3f0b87c29fdcfd0e76464eb0607a892fd4d5bb86eef14baab47ef568bc300410ccd288ff172e6129942b9923dfd121249fc69d91e593b6816b891e0c7ff7aee6601d824c69d9f202d90e8e3eaa814cf6501b05dd8bf0497a7dc9510ffce0d5bc46a511b384fa1dc8289cd600082f2104e3d0e1f84c10625bc74c33e2f2a82aac1caf905bd82ee59696be897c9a63234b40c313cc2b988bcb78de36f010a0e96936598f9c58e7efe6d3f0558b8c0acf7de1a7e78447c14967d00d30bf64371be404e5ff58259afb79cc3284655a763e878936a2687df3dec4cdcc9e30efc2db5e9f96ba3b74dbf5bc7b91efbfeb0c21e3c3fd633420fec1b9f6274bef5749e6cf7d4ccea042f4f078a94e5e8db394c96ca313bfc7f1e505178e1dbcd8e51ec23faf6793b1830b355f7f3ff181e284f240bfa0e3a7bdb7bcbef12cd7153ab8166a198a7a0ce17005fa61805c531d5e7c1866dc68a0681275cf8c08be173c50167f8a3b80c027f5b8d4d3abcc1dd2972bbf9cc7b613cd935f4f1c30c45926e1fe0540eafa6ca28ca201838e58a221a0a074f36cf417a62f7491bd7ca49c4895ad0b538732b57170bd8faa00505c05ce615597801a2bc74e66633549678a7126610921cb3c5a4823ba3ee7e3b180d6a58a7812567fdf248f084a3fc342d43146c978fb8efc38960a7889b3711572474d5db5ff1ec4b9e0aad083aa2025d787094de973cd5207bc36f5f1c7550074d36e49d48e9aa1aa8bf6d43c8a238ba08855a61ed09699809eb2e28a4379c62a43d3e041be4e4f1740e4dc00c554a6b0dd82ee26505b3818406d9ab55f9eb482e43c7258871213185215aef6a7c2cead5f2c8a060521a344690c46a08ec5a529c5b07473f262c32fba9478f636982db75639d764d43654b47b9dc2de7814ccc711fdc2652cef018d160f3c09e27534c009137b01c068317347467ceac6e5c3b0b57acdb15649a358626425cea6eb7b0b05b37156acaa79c90794fc6fe86b40c961e911216a02bd2f593ed633487a839e1def2b10cf39a35d224aa4a5538224701dc968a88b85fb22c1e18c805631aef090e148ebee13ce8c1995dcd8773e9f371703d2538c1da05bcb19a861a95f5c70bb8768fc713bab630660f5601ca7102714a8e1f26cf8b734ab53b201a891127268d3895835c7aa2605dbf389385f0808188a918db6d16a6717a7ae70db9b1b85c8364f508c5b6315506a1239f45378bbcb8abf75a3dc449da5ec485d39cbc7a66ec2b50cbf2645c9f132dc8dfd2303001f118252899aee39ec46bc578f38696fc53b3c607aa2c23cd0abfb806cd70031a5292105bffd53d6fb8a6524ee89fae3cc2e13111cdea86975d8b5792909445d86f880c1367b15f1ac666036c2eccfcc99567d8eff5e2104c1e828a695ab55a5d29f6fffacc0d9ee04814831952d9eff5279d4e35272a4c10d571dee79f94a3254bcb2f75439898ed870b4adaae98f0eeda50b8072884600cb08b9f24c5aeacc16ff36c887315c8f2f6b5528def1bf7d78fbfa76cd08545bcb3939a6452f471d9b306b69d6ecbffa23c688b10bf820ff4f316e8733e0c69938ef4faacd115934f8c53848016a515e4ea0c00baaa7beb801ef54c4e62bedf3261044f7828e9869dda208bacdbccd3241c238d081d2384502afdc9057ce91dcfb3788281a583064b21e00e57a0464139d0b815cb5e38a1f55bad97484e45c50f5bf2e1492c1ed8c1346c27c12df9a9255163a2a742bc3a867f9a9ed3f6576062ead37035e53f77a7b1c92f1b7744c55458693fb6e3f1aabb3777842dae7849380d5618c57653a77a9fd192b695e23ca2182bf86585bef840556ab2e701676b9e212cebec0de2845f66dd42052f3ced3b23ede8a21bbcaebbe4c7a79c1a2ec7f03e8ba6fbd16eaf4850736a7e39e2a93a000202090df44cd47d541da6f85caeec4c8e648d0a46be6ca25a63377e3b1fa8867f95216914b53f5994fd965f405f3fea39835302bc6dad11f86f09d1adc8b9f5430a699fb20e32e8641d81ddaeee7610f03163639c7c7b665574c567948d565539150626f9e945adbad77e57f117d95c9736b49db005e029b0d141742d52878af51c74605685d0144b8f77b13d5e55301763016dbd965dee2bc3dc749870420b9159a2b488e93f0d6d99f79be02ecaaa4e1f92e2b932dc00428112ca2d2d41200fce0108ed339cfbaeeaf85cfcd4d62c7d90a03f7be859549a4efaf015f54114e1482cd8267f94ea6fd0080bb41702ea7ed15260409099750395728621ac9e8e130f628e127dd81178943e02bdb581358c3b1c0d77325657cb51083138d93c006944f8ff1f896c7a1f8c67d05d61df416bdfb0ec7514b4c6e1a7e407560b8f0cfb28804d717122a81a690ba1647bf2774a29a5140505f904000537a5cfa53188e1675a7ae3c6521938949403edefc6649ff274ad05c4951101fc42579669ad203796620afa4dabbf93f2864879c194f74373a82ec772ac5a2c2c0e6bb12c33ce1d73379e25c9c6f031d9eef8d8a7c072bcf0b14fc176541df8d9bb54ddd332ec5dd4b2a646a562454d0d0b16a64d7b8c6f66315cfe096bb13da8672921d916b5b3972635d4b294ceb4716baa1a264ed7543ca9610776e06a984aa5523c52ba1a16349aee258d66da7a504fdbb312a6d20973ba66e24cf4976929a4dc8b5c5a4a7863435deb432dd3e91ac96a99aac6ad7523539769aa5c366bb834158e1bcb29b01d14ada27cd5f0e71d72759e29dd8a9ae6d45487bb31d9a3a8ad261502123853c214868f9469a90b37d687bad6727265294f2f2295f1f3f0673f426d015b6c8b6475adf5c39519fd7ef6ad205786a3e5fbaa5ca6b580b448a3e0d902826dfa3b288be2406fdc99ec47158d4145752d15e5b1a8680f5db52c7b1a0ccdd5385d33b277dd68c0a067d078a2672cd949794968fcdcb293f27ef6292fd38032ad97691c55d39a691b6129cf26b5316d29508ea53f292ffdd9a7bd7df6e98fb8fa234cc5c46533a7557285ba738c2c69fd7683a155f17715df18ecd1ddc3e361ac7852ed5981dd2cf3fec54ffb3c71518565c2983b18d366ee78316d29cfdca5bc94178b994081e2848c8c6953e5c8b1ec634c9bb9cbe1dc4173ba9f3dbacbb41d73f7732e065487e6c8b41d06685ef6e6eede5caeaa2e258af42aecc503996b1da1424a964008340d8450da7beb168ab000040e86861d88b9718efffa8690d6b394818ed3fc0dcf113d1019e2f177fcb9347483463244830e431f102ae20598a15345c8e4ec463710293955565d43071d08d9d04368044227f9af4f08045c68850fa4ba054cbe9f10444ed4bfbe9f0dce1874609583fc7e32fc80f87e407bef9d7138fb6e881f0e9f5f0b793d574b929ce691ee21ca3b38fbbf3e222c0b67f9af8f480af211119e8f48097cccc3c47c445ef011b91d9de01c8db40c4e15212ea880852138084ff45fdf101cb9e85cf9d737440379890f4e62dbe7c30d7c3ed4e097fffa7c5042c995256eda4148fef5f980fbb07f7d41497fa63def7a00dcfb1ba37d39e31c790aebcf3e52e8a5c0f31990dbbf612ab905e3e0350b515e989dcc2375bce76a59114be386ed90329cf75fa1a59ffd49f481271e730812200cc0d165a13113c06cc53294597b157ee8947b08e87ced55f829bfff04ad5ddef5b377e5ecfbfa9c739e7fd62a2e42c6cfb79f6df9ea11dc5f147011f784ebf55dff85ed227eb97bce7914412afa2d629c2c03d52fc6c1ddec3576c6ed51f97cc578fd1186c2eb8f08e1fc28e06108fea380db3f7a53e7112247e900e01ee5b54a7a944aa2fc686e3faa397f277f1d23e78f301472fe8877d67b4404f29f80f84718ac84539c4179b198b3de9b8f248903140a5596a2288aa2b9478c220aca79363d1145511455a2e8b5d65a6bad354fe95c85afaca0284661d96707a0d67f42866115446cb6a0e44a4e16d60ab5005772aea8a4a85227ca08b39728723c897ceb8cb992f3b28cd83ee7d6df77dc380a705f508ed841bdf7073fe618c65889d639cb505effc791c5d2f9e67b6fa681efe873be31f9d2a0bc17e79c8ff87b59bb86f2d79fb824d551f7dc9c3ab19c64aa88124771dc27f2ca448f22151b59c47de2b0fcc514701671f97553b937101682c25ac6ee896e492e09976f3f1cfe2863bca9a75d528e276f18c9bb7d978fe4e78c3b2df9f909879d7e421a03aed70b755bc1283e1cb06b6f8673076557608f0dfa11f5baab547b5a2def5fde85f6501ed656654385eb485db8b63f2e4d0aee8aec5daad9e3b2c89e45355793fd9937b327747b351298940449d04f48908b93e2b1f7a6b3280f411fed655a1ae4c6521cd6b5c79ae2d25bab6ba90b57664346cb49173e49776d4a439bb6ab5bd3b0f5cb3122a096a12dca36f5d85e070e81c0140a7ef62d698d8a6d59205edbb66ddbfa68db244849da368911db028dd8a01f915107f6de94b66c075e1a154ecb52ab96f5dc9aeae7ca744db54359a5cc35c553cd903ab2ae688f6d59205edbb66ddbfa68db244849da368911db028dd8a01f91510776986a655756d74c9daecd34154f0d2e4dd5820aa76be62db5ea1a0954fddc5a8a876aa76b291e2fd354bd1c2e4dc583a9c2a970abf35cffdad3b58e84f6d8f4b7a63b550b2910f3a66ba90d3db3060ee62de5691a02752de5408a477a4bf174ade5848725bd4c6b0d91ea84486f005317804dab901b13e4ce0c91b42ce8a7652850cbd0966d59205edbb66ddbfa68db244849da368911db028dd8a01f91916ed7cbdecb31dffe56ef47d55b9e005535e9da6aa76579c5bba1eccf9e5c7d2dbb025b36e847d4f67a3e5ab6076cd9a01f51bbaebe1ebb027b6cd08fa8b7fa7aec0aecb1413fa2deeaebb12bb0c706fd887ac37f5f52e82aa4e40a18751d5cab89336130713f7b9c4916d5f3bd1e95a262f8d7a36e5c1a2bc774a8dcbd49f9ab0a9d4006fdebc92097b600f27a92bd372a7feff0babc8bbfde6f6ec3aded9d83dd9463b906bf3919e2d6f86dc55ffff2d7f3ddbd49f1d7739e3dbc3728fefe209d40fc20746b3c57e33faeecfa0de4d6784f888f7ffdee71699cddbfbdde1bd3f3a69544891bf5d77b5d5bf9eb63b3d3095de93a9ca338eefd49b5274d73300ce672ac2c6d3da9a9d2ade82ecd8e8cef08d5c4992f7460373275660d48c221199465be2c7b57716a98d2a96aa878b44a54215597cfd223aacef0c15e031e069a23b3c83936f3310cd5e55809543a5dd39fc7a2c656260a8a69eb71b57acbb4f5b8784acaefacceb49759643fc6f628f268d9ad853443462b7865ba1e2fc8dae3ca803e0e37d6feec533ffcec4f9850efe79c6ec71b91f2ccdd4b3d5daa2ac7895bca959595d1a5b37a5cae1a3cf7e352e96e69e9ea5d070d81526525b400764573a80edda13c1b501b7b97af4aa92ede8dd169994afb634fd84e2be8931d161461ba4461186aeece5eeed55fa60d25fa542c61a488d2e60bdd08a52104924d7924ebe25d9a1535cd993568581faa603b2d9fb981149a23bb2e4766e1c2b9a3d2adf0326d7bdd88eae7ce7bdfd255d5b461af6a35a5aa9e95a6742a9e1ccbaa1652c31411f757a403fbd0b461e24c9d59c38d656feed41296f2728cdc00caeb54909fbdaa051ebdf6d01caa23e2446980f5bec3f9527d52ed7979d48b645125ffa52935e5b931b99446ca8154e782bfd302f2b33f556aab7763b23fc1c7cfad1e3796fdea55d44545792ef4c695c1fc14189ac3a53c9408c3aff394aea8e34b4aa2bbba0ea76a963073f7d2cb52abe92f73475b23ac6705c6f249b56705368a22df2814696ed54ea5eba20c22dea715bdc430144ebff4e54cf7299f547b5a5afc8a3a63c5c3bceabd173b30ef1c5c5a8fc18df15bcad3b25ceb445c594e0d738c0bb9b41413bfdd56399e83a9e6cfa5c95e554d9fbb227baf9a365c16d9a7aaf952cd14d55c85b8a609e4cab23fc1588199bb4b933dcb0aa80f1408ddf14f14c7bdc91ebd7171543c78e606331834edef0c151cb1c533d9979f0331108eb7a3c538d8863ba303b623d2e0e35d39fc307aba4ed789607cd037f06f3f37d306b80f40206b8e74b68e6d16428a1c8b85d03ff820fb0f6288d059bad6cb8eeb1fc0b8e38054ccd3b25993991062f4127a8bd8fe9c73b88efb75dcb90ed161e8b98e1b6104d3a667246c9a76e143f066bb1b4620a1df7b3333a1347d8e15c33b0ccc61deae49c7e91adeed70e78cb78299b20413b20900c00008c0cfcfbb2bcb58c7ad75dcc5e5f033ee8600f419cd6c858ad4ea8112254a82c881b978d2fb7495c4abc4afd2dd472ae89c6740f1f848a3fd984ff98c7912085e6e799a489122d7b3881a102c8008470a08c64041b83957da4a3e735154c295f81ec493988445eeb1d2d1d111028e107074140c06718238c1a078cadac3ec5385d59269289faf691b51bbc6a6e5b26a6c608431cd4209b3745b585b5c3a71d6818023041c697d127d7681cf01473b058a3cedd3d661cdb14f8e01384291a2076c429b50eb10f480f101843bc51645208c314e8090af50e2dc479df369dbf75f8d6346467f9d15671d73ffa972de14ffc674b4cc842ccb22e470ded83ff16fcd6c06429609e0148363a6cdb43c072b87df0a98408002263f49336041670518e410c492140ce9c83210424308f4bf3e1fda19ef65786230c629eecde52744d92976796489db6c66638322f183e92fba96ef55f00853759ec5d2372e1e554a5759e928cb8ac5c35ab16411a082326d87012bca9769236e6ddf6fe7e845d47a6fc671a3d61387c1d27eef8dcaba6a7c792abedbb952aff3f4b852e5c1c138eea5eb4a9888dd2b0acb197079827b7e96dee6af332d23754c9659b9a90cb3d6da8ff76a16d65a6b7d3b0b62ff7abcafd6baf79cd867be4ddbf55705df510479e461ac8923ce9dbc31f81c47181af57d4a129cddc98967bcd6f7ca681df353fc1dadb5d6284e88b253bff75edd638af5c6d1c488224fba137b5e62cf40a284b9b7bf882d5b0566638c613b2637fbdc5b73557461dc39e6ff8ed65af79e9776a5a8b4d65a456b6dbbfeee68adb54a4f37d75a6bbed1ce846f166b756f0fb4472bbdf7f6eee4c4d7bb30a57051e4e1bb972be55fe75e4281a9ba111cd6392af7af2f974eec37cffdabcbe5adb5d67d6b0dd33b937b2f893e66da0ebeb70469a28b4b63ec744f7c634414bdc889ce84a3e89d09df7cef14bd93c0a6f370622f7a91e9a4f72d6562b4d67a466b2da3b5d6e5accf98b6ebafd65acf66646252a038218b99284102e605a6fa97cba5256dcd708ac6db7b9cb69c451847ad3d0c753974c0de81bdb75a52178b4bb913fb2bb29f4ea5aff4f54ab587858573dec4e6586769eab16b6fbd343e4a5fe92b7d2f5367d6a0daa974a03df4478a478a4722c9b2b2932a56e152abea47b52b8958f6b7b2ebfa5bf596de82da599d48b13d06ad5ad6d3325e0e08871b57866a21b52d27493e1037a64aa1482dcb36b56ccf453d7b2daacab7b2b2d2b4b2ab4ba9f6b4f05a70587bb4906cd3caae2c6dd9554a602a23bd39691a22fd80ed0f4d3db6edb537e6a7652a4dc227bf04ae6ebaa3d81ecbf6dadedbde3b8c1451ad21d01fa81009645bd5d55e1ad6bc9936d892fc11651628cbaeec6fed6da9f6bc5e3b1d2bcac36e6bd091cc9bd963ea7839dc58f637b397e2a549d216a5fbaac3b7cbb4148893213a446ad99fca068b0ab52ea5dae3e24202354a4cd71eebe337c4102929880e915a2d03b241d8bb73416aeab13d9676ed30b357963d1f2ddb03b66cd08fa85d57608f0dfa11f502bf6c31a21b714a11282828282eae51e87ab95e4519806189f02a468023cb57967f7923488c246d564a4a4a8a57755b655d595959516145bc5287d56ab582bd2019bb0d2c2c2c2c2f30699aa63024481060a1154a982861a208693c994cf4d7ebf53211038e5b88982c26133fb06d20eb18f55939f6f2f2f2720245f92361da4890208122c505366d1420d8048a91899129b21601ea11f172a3cc8ccc0cafc885d1c431339b99ed1d228d19cd8ce6c4a371aefef5115942a382460551eec88fcdc3e671aa58a162c5dea13b8956d4ac58712406568ecdccccccd4d418e18d29a0a1a1a161c182e849096a36b51ad97621d50b362d6c6cc87f7d47dadfe2a6458beea49fc1d1080b0396a31b9c1b13055c0456afbf26bfeabe313ff0ec1d584f803a200ec8c2c77f34c2f10007c708ce088dbdc3ab08f1c085071e24fd9d7e7d475ab08afffa8ed0d82c0c84039cff6501500e3ecb850bd3c66fcc8d2982e4f4af0fa874d7a227a82433201130a88502e4bcbe22e01ffff515fd2ebf3797f5a2e3e0e0e0bc7881e270e1c2858b9c9c1cd3969393a3a353b46ef28ee5150091b203618293d4b9552447c64d30c64c4d989a3035616aa2f5501032c450c4b7b8c5605004da403cb8372fda1c68b571c3c7a7498992bd39d3e63e4488bca0495211df434c9b27f13dc4b4799228f22dfa6c9ec4f710d3e6497cf32d326d2e261505b1833b18d43ab8833b182cb2f910d3e63e7b73a6cd7d6e34fd50e2e3e3e3c4071f748e8e16f95ee2e2d64a393a4674fed187c1f50b217f21d42f841f80200481eb2fe45fa8bfd016823e8263848b5ce4221739c7c1852c89bdc418b6c46489c912932526180f39a261044644bef9160a370fce4314722e1ae1228f1e4680e3e787082525cec5252efe0c192284899211910f59e2a292c8872c7151696f91ef1f2e2a897cc8121795442ef2bdc4c5ad64e4880bb95088b1900bb95068840832035c1cb2c4c51fcec5252efee0200288d2cfcf8f0c7a6fbdf5d65bb7e87d636bd50b5a5c5c4cae570ad3dfae76758602638c5518d3aa09ec8569d5e4058669d5048604d3aa0989125a0fad82406528612206133159914ceff1740a064f407b64316d1a88153c71c2b46d147a176d9669d3402852ac29626cc4c8dc9099f19999f9cc685434b994a858a164c50ad3b66bf466dadaa786056d88561baad9b478c14b931637492f452a5678e062eb21a6ad936a58b878b1f510d3d649349a693bd55ee49cc89dc791b7638b34d049362d7274b61e62da3ae9c50bd3b6fd0b9da3a337d3d649393a453a3f880f63eb17c1fd22a85f043f0041eb20085bffe0fe41fd83b61034914c538c5602c126c2087a0f316d5cf78961dab6087a336ded134304126ee8262df32346c90824f89050824f0926f89800444868c4aa8f77453848c6d40a3c773a0e67bdf7e69c8ba2a8fdc98c3192a8b29b2350ce942a65366bb9b8581dd76ddc9ad8f69e9ffb0c7a47800c2388ebe56bc8f078956bbcc33cdcc3eb0b8afb02730286848c44895809133c4cf078584cc44ac0d05eb1f5acd8b5f97887fb388a2ddeb53b2cb6a87fc21193dd23bf95930864302750f4bce88850a0f8d622c9801c1bbd4d0239f6007297633b9cd20b50a029458a1855d7127788e17192bee372cc27c362d991f8e7d63aae84b15e7f07efce1f3c7a2ec7403033abe1e2e171e566342e37d0a868b941c58a9a5edeebcd1e035ce0a86be5004460c182c6e2aa69db2b1bf467d362e5d7e20687470a8fed382deb4178a79fca2dc1f1a047a5ebb88ebb31431d891a162f7252b45a8ece696363da46df4267f651304d1c4fbee3441aa4882dc61938b11f4f3ac4f606a7e3300768dc1ace6118c4966b9eeb5317076be0c4bb1dde610df00c75747e9684a824ab1fca94b1190100500023180000180c0603491485391cc6a96614800f4c72505e583c180984a14820845118054110c4600c8420c420c30c530a39740500d234156b099006d7abfbeb0cea6225089375b11e35795157227e0d638dc45f271cd606d07dc9d00bc1b02bb527a560afa2a22dc1d2b8074aaa0a5a303ade617599dd52b0550ec05d27791ff21e7c0ed41f714df5cc8cc4e959ed8ad85247b544f53da6e64416aa746aa367a56a446af2a2af8a54ed0452fcf600357b90d712a3a3ff1b17aca2bdafcb4c1e44bfd2d77b09e590666e867785013525b06de7697dc0f380366a90b0b06ebc66ca02be6dac7bf8221933f7c0eacb845cf84945be8cd2090c0d21a62664b6eaa20f3e2b06e0c2786fbc5b38275b1889d47d7c3c02107525df8964959f8db37dbefa73603737fca86bcab8ee43800f7c1a5c779933566211c215ca24e8ef49cedc09c7208a4e2a209f7087df747b305575c09dde44f5422fa429dcdf35fa24728672581d80fd7dcf8cc2549606b636c60013b03137d475c204bab11e3ef6c228340b18a7e98f19b06365e0bd70384270a904e49bfa3830c69e8ea113a121a9da6051382afcca72ee2824530849ffc818610d16bc31e81e27c1f78b418ec9e3cf91b803dfc119bd3c91ef0e34489a616da431fb6c1dd1e25573f64c410c83cfbd4d846c6490c4556ae6a61f4df2556f2ce9ad11abfe8542484d89e41946c20bde4e039209ae4ce3cae3711eecdd3854eb49801d176b5707de0a9bc84f760b54f3863ae6046fdc3fb2f12e27050f3180e62cec3b66cc0e5a19f8540bb2db0b60264dbc5bc0578c738fdea69e5d7542af65179b9d65c2b2a114570e28fa12a03e9c3ccdfd2a1c4778609a7fc65475a05835cf2f67dc6677533c577130b24fc2cd77386926632086f5c48f40a0ff09492790441606838f3aba989255417d22345a26ed39c69fa1a4cc3d3fdf76ece88a54b4858da4a24d7d4ad66acd4b6c94302c127a3dea91da27a481bc6ddfeb67c45140fcbee66879a3c00d8e71f1f56be2a61f4dda3bb364f74a7844593161acceef37d1012f445009a25da636dc1f655dfa39b31aea0c3d858cdbebfde4ec7a4147ff1a6a360aeece1d10920dd4d83e95541c9df815a9a52185b4e13ff0b48a2845c3660f8e26617f423e2a6590a7ba132e8afe5ba7a321ee02b745a3c69e7fdb337722b43138e4216402533c307dc66146d8dd3311eab320e00e1128d901aeaa88263ce943546cb9032baadb391297a31e353d2e8394442b1b74676e6b65b71d7969520f8c1dca43ecfa117564ba3fb7b1d96d475b1e620ff42f80621533fec291f11216b4b80ccafdfc2c6882dcba0ab2ffabc3ccedf62b8b3ee9864235bbcfd032cecf8226c8adab78725b155f792d4e03cbc032107b050a5f6d0a8adb02a8bf8a99710b7dbb6f6d3c1a1e1d80c3bfc4525d5b17efc0caef3b32f428a262af3fce401b7419e96f54ea1d23ba955e0fe71fb7d4016bf75e40e6710cc6577e83c3f87d51b36d51f3657143247907efe6850db99ba9218cdd0590ae87aa0936d69b9ad1a0fc49fafb0bae2a6c4760e324d9f87379fbbca925b45ac437a1ab8cd7f930d402df89f1a7cf5ca33ba552882d952ffab300e80a012ccd09ac5ec0131ef4202eb6bc03abaa5b3932d7a31c313d3e834aa6160dbab7b735f2fbceac24b90fc40ee53156f9806a65beb3b6b4b3db8ea63cc41eea5d00c42b66bc0523e3121ebcb80cc2ddfc2e6886d83a8aba770bc30bc81f08046cf0e03094bbf95dd000b1f5350fd7d5f195c7e038a01c2883b1af40e0ab4f4371da00f457b1b2267b4f492ff49c9268133c2effdedcd2caef3a32f42c2262ac7fee883e50698a1c94d913cecf4e048abf8e416f19b99b111565d26e6f1afc5ba15574aabbcdef2493537229fb7632e7c860cf34c674a4b4f5f6bf36583d1ca6f8154d7ba33a214954c239babb9fcea7af17c8a9c97bf929bbbd5e54245702cb43f1054239d5a3ea73412e9a5c08c1fdb0664fbe99af8983fc6a17f4d4d3cfd711f06db6cbd25cad2453ef715b31b7a140c7dbd95efd5e2c05b59ce44bed136a8274534f90a273c5f0026a6d0f3bb3c7f46f1357211ede8ac48e4ad2f4336ff553d7b553d7f5634935793ba9b653405c5c9b950cdb98d452458b0366343d9ccdcc9d49ad30823ef9f4d93a067fc59699ca8a70285bb111de7c65fc5235367890b9d818ef8e8ed0d35351734f0dfdaa699751d5157a8c7b0b06345b44f38f39494cc3a5c0e0556b52b3ec3972a8d36ace6f98dbad0e587d875c92fe4b3a585339055d78205ba1315f3c3d26075da97db3d201b1fcb9bbdad4ddfdd0c19617f85eac326177acef9cd0f6c74a61421c395390a105779f3dd703c3ecc9df081a372b96cea3428b3c25476c29b01251a346c92c1331af43073aab77f3c677d756137bd80e3218232babe9dd1c4a9d86c7bc22a8219d9f6f0fba0649e1f37ad338ff9052ab46da0b7fe28f3b09fe8353b643c80c20c9d232aef8c5f337179be2ef2294546ed278e8bb84187f742193234767426c3994846b9402b3a282db2aa0b46ae1491a9f69799753e231c1fa48a36270e5e037b639b41f5d693567115759123d07ad014d4eb31a5e5c2fd3c1edb4f098f3ecee78dcec47b048134eb181c85c31ae98d833c1890cdac17615db8a9706d808e73ff25a0dbb9ac3b2c033916d03c427705c9bcd4491e2dc862a2735124d509592702f6922e5a50df604d832a1cf08b15ffa5e4e77d2cbe0c0dc134fcb4ee24dc5e47e4ee7eb1e82264a6d90c66570597adf4759bdfb10b23e332512f5fdc9ea87c713e9278e117ba909e9edab0941d4bebf9ca48dc9a0328d39e14a413943988a3be9b623c3f11bd1c48e41f4614f0cc62dce5978a29c5ddd067955d1656386c1f6d21bb35de5040229aa011bebccae3cd8d35ab24d88b15a40e0c0ac185979dc7095d1b823c414915db12b4fecdf5178febb355c0ca2e5c768a772833762346c457a28d1cb8b8d01038b06acabfdf8932657beaa5c51297e8429fd11bf05d085f1fcb246de9549973802bfd222a9391b1ce4cde55f41a68b0da97214ad34c940eaf9f47b4df51c1eb0fa7c5c38b985a24414ea9a30abccb20019467d01ba2a7c8aa55f9216953e9ded9c9c2db4c614c4cbce485403afaabd51f75f52f458f31b2b369b37fc1663005e86b3c4add2f2a412522f5c14b1c3a833b9b2b031c8bf34f04381b05aa687afe369e878a319cba2c970b13a34d0ee920769fcc9d15a7395182815ea49e8deb7e4348ebb974d6dcde0227c5a0f2d6d9869444e35db1e10fafea225aaa1cda0a427adf781f75d844564652aa7a7aaf640d236b82e522a6604fc976068b52d4a10fc4975b5e5001568f1f3d66e1fd64489268bea0964eeddc2dd75c467698c005bea1049091d898f8f8908c8b2c9e5449e96a5a51ad152e4d2cb67712dac678f9db1b284883d347a84363c758b970ec33bbf4a58080e6031891f4d4a28bac1bd178203409b72c78a754f65e2c9686e4449833eb745095bf838ddc1ce3f90aeb4e7e91c4621ff611aaadcdfb32f57829c964f79da67c7e12b88696e6be903da314226264b586802182f20e659c5503f4c97dade1ca8cc3b78167abb63fd8c9b841d7662a9f4b92d4184d2e94ae9246b8a0a91a9c850569319e03836f2cc1d1ce5d570097b63d474bfb4902f492af6367bbe626b11aa7c87be97aa145993132e690ffa31bdbfb30b54e5fd7d903bae82a4216d6bab6fcfa8f9badf274ded5e5ded5eb7b17992e005f5d67e45e32cef6e634f9ca92605993617a4767826fddec8fa07fa25f62e662052af1a9009f3f780797a75fb115ebfedde072c23f873a70d249fd5d9aab36bb002c2bc0ea1cabd78c546358ef585400f05c1297827699d8174d00e6d62014f6739591e38daf53a0c8bed1a97ab822045400ece77d65c8322eabf14edea4222034e9e8b50bbd8788dd6dd3e67ef88ffbb0596edb8d65a6b54ce901f7b15036465ccf254afa031f68ae1352cd46772107297a4048cbda2b0d1f91cec39a049391511414310e1b9e9f5ea62a9bfe3f805ecd03b77d38165076cc2c8a962861acf4db0e8fc7918d2b65cc339143f518c0996d24876148a51ca0ba3a7aa0673a9e98e4f20f70862917537420a138384de410b5762d6629376b08d323bded5c31f170da7548ebb61f642c2cb6225a280e610202a120703f29f6e1519801c9cd2f1e770548681b8a493c9544a41c802294c5ea26fc389ff987b91733e0dcb5530cfc5cbbccf7c12241efa1ff19c6d966e778c6882578e951a309c192c67ae2679861dbdc660a540394d2c95d99920a1cd200476ca760350e7efd41cf44e0e34a3100898eacb9dce3d2bf7683b0c689084b0e36906fa2cf67d05bcde54bd185e80ea2233f832ac1c4d619eda8804ca49b3370c4664fa2d9bbf164422c8822ef8574497a23ceb33ac7311ed42d7cd90c09f52ee7e7e30831448576557eb524a1f8cea461a006ac07306fd374cbb1bb699a4b32a15261722f92c81a045c1317ad3c30f3120065ad4058d1eeea808ce53dbc10da90a73340732981620ddff1d01a0fd987a3e3de01613c0efbd6efb667a41b17c67c654339d15ac3b3fb20b95a16723ff0d1e7a6159ebfda10c46d5398c0fb17ad1881b82f9e47de15629cf1c250a82bc1066a921c121fa9b7594c2fd89b52ec55c1554dc86e9ed2050382c7471240ff36e4949ff8d424484be3b9d2bb260608ee5281b69a49ee409dfa1393264df35c7dfd2635e6aaab55eb4d1b2b44a6d341d3aeb068b3c3accc97f55dd589c752b112dc7181d43da616592db510adc8e5e5a673b757d881da9d3f6da22fbe96b42ee68d5158fa1234e351610a82c4c87d896fa01f93dfa25aaa621b1d5c9d7015a0d3c436b1129dbb5b34236928babe0307c44ce762d1659bba117f95fc33ddaf205339a08073017b8a9ba53bb85049e9cf2ccea8843c50990b0f86d7ed3b9ac4bb9029242ad7061c5def746f784e4637f4f240f4a85b5fbf16ab0e183537df2a7906934b94693aaa16df513751afdf4a9059d9a6526158fcf6d4a2fd52f9cb2698004cebdf090e7826311d29104612ce83353a0d329f8c0a112afb8d7c090ab9b94cd6b0e0ab31f08ac3ba20f6cf9eae9f07b6947403d4110c37a122cbcdf7dc356c174af23f175c123877b7e4df7df3de5064a6ab3681e8561c62dfe13580d9fd902fd4d09742fe4b98ffbfe01b1acd80507a0a4e8068e724b271d0e2bd8f5d0735107c5e1e370d319f7d06933cc6f7c4eb1e720fde796a3e182ef1b5ecf96dd8646e7018a711608696ace03446420c2a220258e0826351b27945b82292b62d70ad284e5e0fada4ff4db02591b34216868a3e3323701d004824fd80c8372187d016d8bc8ccc334aaff0a848ad67bf7367ae647c379fd43a1b7bfe0543fe2956664d7741f90ba3cd9b7f17f128d630d2401e277388b13fb72f1a07ee6a519800aed8ba92983ad72d036013492fbea9be83d0a417dae04655dbce0f06a9d2032c3782314dd1d6611110c6fc4b9a36b74ec4f0fc372b979f6aebcb748001b4c5b1375d17a520fe78dc169f0d626bf5fa9426f401427140225b28f2ab846533cc78bc73985bbf9b87b034a724b2ab99167b3d9735ea232a4f9f794cde4f6737a4ffb961474e3c234fa1fa454d46cc552c9a0c89f54940388e39d50627a0902706f5a1450c5a13494a9e26f407da6ed91b85a3b8c2847b93b9b8b41fc75c9ea80b480042f9ce21800fa431ef1deea7d8156f5b612c923ad85e7ba3c695f982b43fc02a9a821f044deeaf16ce4962dc577e6c46c6a71876a68b0544a8c9063369d9adebb054e16eeea5efa50213a036526d84db6d465a16ea0609fdae392fcdc5db85a3c9bb051bc2be36e25bd0c411f59339120ee7905266a60a44df6a38514d5a605b52c91574f0e31f91d726a8c1ba35c0238218d01e5f0f09be930fb6725ad805840a5c438051f0fd095baaa30b759a5d22925a32432456b8df85b5b5b6547a8ba83a833746db40392597df068970da6791c54c20b865097279e976b4b036c0c96c83f58fba54c24b53eb3e64970cb52314afa216af7440ae0c4296b48fa4855da42a955563b45cd89348df99d653b5287bcd4ea90fa838b027bd15797b40e794acebc59cf047a99c0a9ac46eba58372afa4b0ae9a200b91ccd1e21265ae2a3302453c5610037f675e6b544ef8e872b7d8e46182edceeefe9bad1df40d8eddfbdd385c0a9c20e8cfd701d9d973da333c20d3dd0e4ac7cdb1116fd49f35a297f2a5301eb49d2778b180ec03cd400e1b27ab3c473715b83f1f5ad34c5457c8de3d1fe0f20f8c3e8e135c6ea1324185ecb437e7a83e4ffbdc12bc618ecc0fb1c9af00851ed36c09faa942b690ee77e75010db2a4383e7e242bc2728acd8f4cd437140755b9da3f43e9f360ee3b3b9acf6ac2251bfa4a83a2ace3ca8f7a3b54eace62249a2ccea550e3160a6cf5b8068f4f466187e85b7de122314ca84df8fff06042d925e94eeefff1c05ae1434a7794659ffd8c582edcb15e160d41a861f06ac09c6e22be19aeeb28f4b85a874a162809ea763cac00733b3ed5d7d8eb3c410ed1f4d48a7ba4a7cc6ad90641be222ad6143004ed2a50250621e1016443b224a2dbed04734402c1188503d1a980284a02ec61c4833b46f899dfaec8710cc7b8b81d3491b7de7333a024736de7015517867497324589d8021f4bbf418e51d76ba3ac6192752e4dad02ed7e5753d331a0d651971d4390ec29b9d999f38b1f62e2ab7aefb031be4b09d541fa0cabe6ff5ff145611aaddc2b8fe7d357225cf7f522abc8365a13d4785b0c26064a76b5e3a7efa65847111072217a8703f911e2031288d335b22a226b3a70f46f3ece023d6445c11e2951015eb8811c95f4a866fae248f9608d20b27fe736110a97957ba8ae114c28f6d1081db01dee85c6ce86a306875e5fc26bd2b08eb72c86ca321e291ac1da2b6290f6d50306bcec57b3d63e95f4ca84cd471df3758554321c49830622e0aa3ce96cd099b28975521e489e83de4f295dd3c74afb022e056e9e69a5a75e9d1f3339660c0604aa60083fa3164e901803370d3451534b7276492c9cbf28faf04062eb490f69deee5e6ea42f8e379e4646612f99e60c99fb4a59596a70f8465a57b531312a08cf51a192f617a997a7d02b1ebc9dae3385512951ff76221321bde3a18ffcc279984bf338ff5ce715a847ad5ff9dd5cc350884550115fcff37b3bf26810e726694a94fe8426dcb4ffe2fbc01870f9ead950234d6e1c812b39d1868cba351b6384879f604961b05377395e47e712d15e6d2aec8f5441097818e925051290ea7c13572c585aee3d2d2611c7e1dafcd614609cd56eb061ef260710433c13ea3df08a11cf0b57f957e6e0d61ca0d8259cd56f52154fa7f68600bcbecb521e1c51b06db88adce00f89d969975477e9bb96c6eeb4ca6ca32f3bd8c04c3350f987950b82058e0a7fb41d0f62a727f32f19f567e3a894a63370b67ffec550078bd868bd612b543fe87442dd76062f46c8b85bfc5f90c081dbbd9f13d782414b79d32495b08cc82a06e388bb45d54754d6172a13397a8c5b8681ab7f0ebfea654b0f2082dc13226c2085c714a01cece2a1d0ab6629b39a28043b9099c6efe4c5de7261e5d7ace527536fb942dd5729f1d11da6b20c6c5085157dc55804987f874b95912a056639ae563d36adfba69917aa4c7e42599513c885917f8a7400f4269b248297db3b58f9f2c3d5347d6da1d86a7e7701cf9ceb329afed40252332b37f697378da99c65f379b6a896c8fe006be59c5e6a3b598e21d67f6a711b69e92f7460ba9083ddc0140430ea38f1e99f397f31fe7dbb58add80d96c5d644b641d7e5812cd227adaf0489acd6bd86f15e6a800ca001963c75a236bb466999cb5bdde0e58063b602a23cec21307c26b27faf7015b28acdc73e779dd0d9674d52d7a6a4432cd117c88bae984f3a49772ee66d55c7b58d6ac7cda6e1f70a53f4c2220f142dd365404c08dc9c4916dd04d1053ade005e2f8167c81e2de9281a9a4aa0a14cce6fc88489ed0a647ec358a2978e3019a446389da8a8dacaafa512a19db1354fe04360388959b424a1c6ad345a853ba9e0e1d9d332523946da1e967472b18e5a6e656a7b71cb333a1f00ad6f79b7dfd1dc778e3ebf3025d9ddaaf9f20a7c85bd0ffac4fa037101a75be95e9d45f1ca03ad38edac4bf66aa4ba7f3c5f09e5f48ef9970ebb4bbd7529391daaaaa51d6b4bfb2edc1a04a3a91ab1c5b557bd76e6e940194aa83a8da079f71f2ff3f19e94b32c38746206e47da53f2070a3c76980a5bfff1bd0d5351ef70b9cafd5e15e39b290d80d2e305e9d908e53bad192967c4ffe01808c354a3ff3e14ceb5ac900375aa13f27c8bf6ff5101f83cfc099893fe40634eaa96fea85a7d55bf5392255e2c1c2639fa6f556b387b07f8a0c5292d6da63c20a34282664423e95bbadf1ba4ba8a99660097158b40c7b9a670391cd1c8bf399ec03873b620d7f92144ae4c7451d4fe9c032e897953dbacc9517add29e190e4211366c03e8243999ea19ab000c8a03997cd5f41a332a5b190141a89f6c9d91b282c8c1362652a953f0e5af4159d87a05a51a68091b9d4a3bb23dd22938f1b4da5dd4ad9ae2b2222b039de76bfdc33a16f10f2d2d6ea5e7f570da605f141a7603a7718b295398d5f0fd2e082e7a53d161c866a84211255e7aece5f3fa932b35c87678c9bcf1597dea0a6bee92658966c26c55adac2de01c361abb9f50b9675e74fe5732fa94d68ee067f9688f4fc864baa7875e125c4f3789805f8bb5904f7394e043e355a3a0c5fa35e9d9036063f48fa0720001a52c1651695f5932bd1155d7a18d75964ba0c67fe7c971a77147cbe70185eb4d6b5d63a6a86b27738834506fe39392edac4b765545a7aa7768be13a2bf9ac67f38551e1ab2d856be8d34451d159f568f288a3c273a8142f68aec531a37a515407342eba489c1a9c0632b142654a8ea2648589910f9c7e89a2980037cc0d36307d3a549f7dc9eee979304651cc757c1bb002d8df621d57b2a7db281bc919d4aa05c3b0c7337aa11f8812bd7f3bd85b75b8acf017d557d654106e515c8d751222478467b27280a8c9039ac64e556c1b084455c17a35b0009650b7e263e5269dcd6a42d9c695dd6fa7b10488ca5a2463a54ff774f617105537575de377d78f71e62bf06120aa3f0c58b2c9b2e1ec1ad2d3efd877a4e65979b1ff1c248d204fbe288b9527a6fccf42e1f9dd88f2b7f96e48c11f817af8916a912b5365900e39dbe271e57c027a67642d2928d540bcbb1a2e8b06123cf922a5c6eb41e3d9d734fcbe3244b1a09555c5fa56fd099a2a6f20bf6730fb470d7d50c528f9b723ef2f157a6782bfef83e4d31b33005762ac02d89abb98e45322bbc11ba9b54a4093b375cd2b20f9a40fcf92e298dc72cc4a0d28179ce904475130544725b41ce7829d5c6c7d473e99fe54876e89ae1ac343c77c3665ba17774d3e99f5eed8f4096e3729f6e48284da77e323145e0a018253448e27e39d56418ad0e439762b37f61d70e0e3a9a3e20eba32e90066026ec6543bd1c49ac29b28137bd2771a610dd3059dbda61779c67236938a2beca8bf830174fd0ad8f4bf24bbb0a92a6d481c861719da5cef18972d29649dec932bdee7ff22c9ff99afb40a48565c95e549915d6f27ff401e30f6953b3cc5aba58535a37dabc48b23520f50b628c175b4f33f65d1b6d24e49127dc7e9520f0177dfaa131c5d4d3548318927f97ae6e999f80003b453da43dc9e090ae36ddb33622c9dc60e6f616e037012f0e38d539795ccd9acaca73553a2693d6af5441a27c02462c898bbc621ed3709b6b02891453ed838b1dbe1f66e66d052488f2d52f7a07dc98e4cbc71329ef180227692ac69dd940deafd8c1101e6b335b58aa05d003e93a5a5971858b2161c155b61abacd795417ad0acd94a28cf9b6a9585fb00ae837a2b8e0a928a26c24b808f58a870c06d9ee511df64a9614b69dfeab5221ab1b0a0104da6ee2a2e4df877ba9f909d9b9f1cd30628e811411e6c101cf4e16f387dc843eb637e775e4304d8119c9c6c149e912470a627c0353441ca351337471c4663aae9e734433482a9828cfbb7370c76579ccf4f9aba8e3b922bba348c87b49bfebc009966d4abb9ad9c3b780d5064c3ddf448938b20c6478097489878a22daec523bec8568396d39e95b32632b72912cef93e4cb9e6023d7d3889127417adab682913d0e9b569d6e8ef0f933f0e67e2a5217ff19c5911646db1e75b2f497e8f9a171c8ede0dc7fe4e1aaedb558612150341eb323c3e1cdbd974a91ea2b67005f86b0668737cdc0af06e3ad9dace3051ca6390b6d641f676268f50b9a54b636faf45ae33bdcf78c909ae6c29572e7ddf64aaa72f843136ad7c9b294904317e223c84c2851b6f712d5df941b61e949cf6ad3c8e96a72f39db3c4b6ce971b5c4c8f68114cd028a40c21b06ca567f0f19c7e170e617fa74a83e2d2342dcf99424591f4ec29db961a7ed8511afc3c6d1bf5fa512745a460e0fb56a324cf597605a75b4fb3a37e01cf2e8b6f9d13ad32391d5b5c0b7c3a5d762359e8c929bdf862f9dceab57b6237e75efa8ad66d7308088453cb0c7d2442c579f4721787fb92a487dc2bf2a0f3d661a04c2251b70c11332e773f7fc7032e02bf806c7950bd35b6a9b011295dd571d2830ab5dd6681122499d1cf82f9424c1c453081b6e72905b6a0f9af9b4245dcdd21e4fcea6df1a8c079a2fdddf3642d39620466bac7841388659facef6fd999dbda70ea699e3dc6589cd140d4e337b13ae0f7f107a2e6aae92b779b6a0393f0a1f817c03dc9ac3c5ed958b6e97191660c9e8d75f3b4f98c5404b332211904745da4ba6d37b3b179f6f249d28a926d109c1288f0231ed8a3865746e08df682dc7f88dffe5e1917f0fa28dec46c320b709b1b5c650f83dfd456a023e8eca61ea7b84a481f700b87a46a9210dc6fc956f2928f7c24ea672a08e163ce984aea82939034f3a8cc71df29bded9f0a616331c2c692fcd22e605be0e0642b58547118025009567ace6a64be7193d2deb5d785cd6e49720065ccd69d31db32764cf8ec6b1fb8d6dc48bcdad3ea76593b0c4ee289c8b24d716d9fa3ffceb1bdc5295622a7ab32a655f311f00dba29d425ff2f7f7c9e88d32e3130ac0b63fa55b702cd1bf5f3a3dbb34f9a2fea39430cabcecbf23b3ddea8e636df9edbb39fabc4c1282d585fca9e7e5c59df38a7ad31dc8064633c5fcac603f32e90455c21586dfd509acb920c205051196c460456c94218c435fb3ed7a9832e223373ccedef1457d4c755292248cf428c820fa4ac2408b1d6f765722ec90fb2dbf4bc52d8055a541b1c88c6c9edac3e216c8b151894860ab2ca21e3dfec44facce276c5d4059fabdc26d2c712ec01965992a6fdccea82a7e7cf23f2ba5cafd9240dd55ae887711acaaf2568a27e409884551ff6c54be1f9b0a35b08b97ec726f34541759a9faf22ef0c411c498c213965cba835f6d5d80bbaf7a93802acffbff9549e841745963e325ee2b2d41f6335e1a7fef1bfa4e9a2bc19a975dde0d6df16afce0fb0a802d922f0648de255318ca365356882842bba622df6ff99ffd34add6de38ebfefa6f7c65abca3d01656464059b4812415c9c817ca26081c3426f50041e0bcc5b9416625d091a48331b89fb742b911f203f1f494c6374e48685654686604e82777010a0581843087992a823599a387aaf53c9309192de82661c4f3db4412f8ed8ce5c49d23a43a09a41a9cd54b645b1304b54fd1782430655af802a240bc7ac32ea73b7a1e6b7b27feb2face356ec45806bd7e6a9148254bfce5951c407867a7151fa20c8c1414e1c2e1f43df7543ecfdaf5d3139f573c436b7f50569ad065b43a470bcb2258f465bcebc3033075766c0e89a89e1b26f42f18daadc1f4cf26ba26a50e2650c70925cee23651c0ca010d77eb64bc0daae778688c426b7e1b530e204b8b37d987b2565dd5b2b26e53e4cbda28cf80acfdd096f3796e562044db5446c72a165494c1248b82efd9cf1fd8739bff0cb1ca95a7dfbf7868f46047fe0ce70198e878fbbdaca6f6ce07da5487bdfe0ad8786ebaef7ee270f072348bc79395ba634fcf80f495a89493b2c7ad3f45735705470ad1b9cfbc962dd65801d7fad1218993824d6459dcf201050342bd465fbcb993f259a4122aa694adb619aa33c41b0330b0f118ecd21b2790359699b231f25fdb6078ceda373247bbe1c4b7a3c765776e0bb279db436661604a8b6024876bc5c3c6f107913b716feb4cbab53e1ee0c4d92383c9efaa9d86bdf148706d56793c4e96e5bfbae80133a8a40ba6ece6d6886b809158a78a4e0373aa59026a5478a8069b4e5266a3fbd6621352345874266901bcc0a0ad9cbd11d76434f015bd8f370fea1ccd030466a839bc478c02cf8963ef7d5cddf92464aa4280ef8a7c34ec7e25846526a93184db47c33211a340f06d23e18b223761e9be4f17569f06c01e37a538074a9a29bed001e186988dec3e6f009458010cd02d3742c613cc123d51f33d470fca446922d193ca2697a1a27df579d39cc5271ced1f25f1845d45be3e805bea4507ea43bb3740231e5a9209684e6f62a939c6937cc605cce27147052fe51cd26d4fb0106809fa71db960ef758e578ad02a14b7f8f3833329c917f62eece478428e85405d4740c3373ddd761439de1c6bbba61b1e5cf73a2ff60acb06d8a515246e2af7548e044494fbfba4c94aa34094588b54e9c9051ad428ff38bc179dae521e94217ee99dd81952a30c75975a4fce7e637c5fe5e1961303a128deb4310f20848a603437ae3191775b838d4310dfc36717657abdb6760ec62d3a6e7ca70109b0aa46a8958d5efc1a27949a22491a895cc69f895b4954b7b46d2b4671bebbae4b5aa7ef20dd6dd9510b40c2b907264fb0fec1c9895c4af0f4b5ba124efde38e9bb983df88d370af3d9492034b9e199c9906123b59162744d5aca859c0a245bef4a79d06a67c086fca97431ab2292b08257e81381cdfa6f8e66ba8b4e4d9c0939b934d5c0a0688f0ac0c012a0abd235948b52023c6da21b45c245066e040e50c8a55b94a2cc40bd06783eb58a8d26101f6332b631e1fcb190ac3274694eea01399ab4a458fdc14e25fc05f2b9079d280de0e98c569a3168cdc6e46b85533d5f41ead8bf4ff7a93ba815f9ac3176510bc86426a4ad91d23b76348b64986776adf1d30674968271f76446b4aedae7258928b696a06c76622a38064bb26afe6d85131133044412444779763599a227d12fd12f960d169db73f38acfda615cfcb299dc06fcb605f20214d3fd335579f9b8b55c4a21120b889f6024e5a6e698128657ed7952765ee953ee587edabeb7e34c9f5ab51acb5fca9a9bfbd34b2c7a4978c42945fe42637a7b50d7acf27abb2088a5d05e97e80100f424c53d49fcea1d4b722b7bfc1460148706a305004a664fd4d789c3d02c8b5372dd72a19dbe9517d82fa8b69f907aac0c8df3f4fcf07fa012b68ddf95489f2487aede96c6f2cfc93624531528e08c62d879ab98fa0d5bc9f49be222ba8ec22d9ea222f21bc74bb71964e2ca064105f520b31fae9b2506adbb81fdbbf3d0da8e293a4d3b702d4ae8257b71d561cad70c470ad293e36f0ffe7e7d0dc221464629c66b14c3a4dce8709a3f5c9fd3b353c704c3a00cfd487095465b7db059c76fd7dadc80fe4c56fdb7d47bec23969e6d2a949e092ed65e4d63628de2be66f4039aa349fbd567e96f02c670777117ad6be9bfed67a050b81bf30d884e64e1d6a87b997283c4fc557caa5c718a8696f2d5f725d650f64b4b0afcf1f39a6abadd25908c64dc39cd2e0a13d8a8f3714666290a6ada789f6b9daf3b12426cc23a1bfd89c66c3e7e0833730e7d2837e9fbd8a1e4d76e971418b4906aca22532959a76e5fb988150a5f8d5a941266ba01950328fbe49285b8d1dc2212382343b7ed584fa6a61ea9072674e87183f33c57fec38c1bef52ad1129ecab04be10e836276092b5c63ee05a58bf7ce7408ffdafc59de43842050483f5a36840708edc07ba441152202ed37e936c74ae30cad15742a377e5860d2242527158af9e23e068fd8cf891e7e9a895e662a3d89354c6b3c4b0a99a9e508bcd765c5f878bedb815a73e7659a65789eb72cc3bf06c97a6b9b611792133033fc8fdb9e53d447496dbf873156ab837f3d0c84d1711bcfbe12611d415bf7a50d03d7dc40395c5d7ee540aaefbf273efbc29ab7c6fbe7f3fbaf24f00ff50e59996ad49b552e3be87673844eff1e763cc6ee9e163a357f16cf1ae13669bc43c3e3793eac4e7c67f83cfa569425bbecf87573adfe8caee55e86f90dd37ace99ab08348e08cac4842c24b6435483d57597e941d0d5ca1be510d73ba0c0d41779bca82b834dbce29bf8bf30af467aa07f9703a73b66ec2974d082a2a26e3d1d9500b421c3fcbc615198c6cfc5a25305f0707c578a4fdbdb0b6d599417c566cfe5f43d9cce35e6938f9c28a800a3b44632c83bbdd4ec638800ebc9ad0cc1c3dfb778398bb1efc461ce28717dcd0795e38e52645e0a330f29685ac7f6eb298cfa8bba264a309dbee4270ae332d50ba2040313fbd5fb3afc65d843ef0c6e575baba6a5cb627e0d8c9897f56a9b06d022430afba52b3c849db3a457a2ff40c1260a4d8a9d50ec03facce6621200d374f875b7f2eb8146056be8234c0720e1bdbcec0252bbde4e614aa2bac076e67944518f7c0da8286d5a0b8aa1e31d4ff0e8b80d4548a27d6f462ac19bd421e4cfd2855f9569df2ade0ac2905b545c9a7c336576e452c0540c65657d849ebfb4c4e3211701361c034e365d00d67558b5b2a9e4632a646dafd8f185a5fc394be01bceb9f1f95bfb111ca93982a13231bb627d8996e3475566239eefc7ec8a5bb7d938882f2cad046fc02c5289756c41221c1dd38d3db50ef54dd6257fbdbdabce1389a8ff2c25cbb2e2524d7b07f44229bc936920960661db0ff946bbba76aab0405133ca7362657aa87a244368ea6d7858d126cb0509a15206927a7a19ea10217c296df8c755e1f7694a4fdde16911b046c53f798fce332527acd130c712809a154dbc4cc839dd3720acd96b3c395f62caaecce93835780ab163aedf8bdbd0b4633abaeb6962d60230a3798b27c60925cc4637671afff70a572af2e5522cec0331eb2df079b9ed13ccaebae20a767da8a4268bd46b1eb6803bf745308660ced5b98bb10bd4891ffd410ef11d587f85069866a960e9c041611eb5feb72c2cadd85ac0938d8379826614d54360ca196c755f673dfab92308f590a320feb1b1c373c3afef4de5c92085e234a3535d8d5a3fc1e4698a32718b3aee58c0bed4e6bdd4e8b9f99edcbf063596cc46a1ddf08a2abdaada80419c26137e661adb167ad0fe1a332fe8cf480746fbd1d42aba4c6111a19f7694556131047b228ad7c87ecb342a2fa905a62aa0b2ddfde4066cdc196e970d8533b15ac06d4c762849583efb4d254601dd7bfffcf84c04af631097fa0ab3969d5462e52c868ac30c00edbb3835f0e7ae494f4a6f3d185ad0e856b30a034a880cf46e8d34a7fc06f27c652f58cf5dc49dcfadd29be369068a5f608b45418acf8ceb0f3aaa887922292c3ae08048907d4ea4063dac9bf4e4ab9ce8686e5c8f568ce5629d90d25ad635fa3405167bfee850c24f6680e8067f927024e021da08a1a47fbfe0927816ccb312dce635a20e7a22bbd944545e9c81d49773e6ad8cf51a123c85b55e4e9863640fb5c1002d1361bba187317f302288edd3860bffc2d9bd69b20824928a6494169efdac15b52682e69ac84a7bb35b473b4598f6f82a2e8db1ec171879148119078956e69b01b47981a2a6007dcb0493a06485ce3fa9a6a23f8e53c89e98147c3c5412aaa039d24f3de8432a333d010653d35bc0fbd13e39fafc62b5a061b36f69cb9262632b8079a995212135caaefb7ae4ac974d19b57ca6f82bee0618c4fcbc470f08cef1077ebaff7719e0fdc9c7cd76f3817a7a1ca8c4fe8d414cd0200481772f4771844aa35922f1a0e666b19f5930ed69d2db3019745d9321cd04e4742f8b8f830338b271a016bd2bf001b80b27a80ff1298c62c44864886d4d3d5ee02b233e5f841bf930692837d370de24651ff436408f1836eb74ac32a727c51a5e346b51ba5a27858bcbc41a825b95191d0e129ad1f837513febcbb3039e29b7ed2f0f924fdc2c5838b6e60962e8e59e227b06858ebc86eeb6f532ca5850725face13471294aaccde7350d39d4828b8c18795195e843ebea72daa64f55155de772a51262a4a330e1286a232633b3e7077de6626a41a5198300ec1420b3f003a4958389fc923e199f570cf8c3e475a7c23820d8fa13e3dbcd98035181a5fd34190dcf99521cdb7a830d62e5003f5f7ff1ec84db9ec8c332fdddd48e0a7585624df790609a529a6d87edad1df73e46b43b53de8533949b86769ae44ca507b29f9065903e08d0d1fe121904c19573c31aea2ba531e04b367a26db354ecc5fcb8b2b742d463f54f72a003b977bc1b2a32a2e89fda75f2ccf7544448df63ced020893b8e5bcd117c00047af436995a20562a520772a5eb1d80de334c97fdeaf45d187bc6d704b07de69149b7a20a6bfad3207988e4de34e6a4180ee9100f4d7fc0c4c2f03617c8e1de4fb84023370e5dea7848699caff76982f6e09756f442c8de726fb9a594324919a40982095d09189c3a3b62adeaa22db28419358d66423181369e4174c5f2b434ce98b766edd63914ce98cb88710b0ae49e05ecfe049650b1d807ae242b68d3590a674f87ae264f8de59ab1099b3f33a600ce13fde89520bf902afba32731419463d3c3a1ab94f4c21f9ef75d98923fb2a4ced170d4b1d3dbb8153336633308d38a199b31c9e508f88a86c650f9a8991dde83ae46df79a46b3a853939dc7f9fd37de9fd86faf74da064d1501a68680a8738394c552f4c551e5c7d1f5fd8f928853dc21d3486ce1f9a55c0c9b2a0962b25e9365838dcdbb81652d6d466189bbe94ab2e266b40299b6c3a5db3e7f5b5f438e712578d1368c698b8aa3e75d68efc943e9533fd1a9cac1d74255941b259cdf58f5ef49ff739a77bee233083e68ce6ad299b43353a63383b5ca434a669d74b5bd4ede7146243d62ab6d0789f024fef92b22d60caaa8029cb026a2e4f175da580c6d477d52d14c3274d9efc2b2f83f7a4f007f7deaf843f8ef0e0e40f9207ea306c386a95ad0052a61a60c6d4024899baa9904c1273bf42b2a7d27b9644dac290443a793e4a367ec43f7b60ea663075c3bf4058b9be0e237bdb757582b9e01304287b944057f050eb76818c10d9f5e78eab58762a06d2e7e741fa1cfa3872bf0b7d989e14a62cf75ee863e539077154fe04fe38f2c314a6fc49efbdf725f0c74a988a81f4dea73ce4414ad995cf9fe2b1f2f93d65775cac343b7ad0e0d5d90c8da9a1cb04c4faa7458f102d5da05d86ecf9290c71958f96b838ff1332818290b1653882b92af502f53d276b8e80f60cda73f4dad2731043418f78cfd168684f590a3df488251cd800673275ce14b2e96b21a8a76fa347148b94adcc74b9052c3d0af49e0534bd0a78fa151298aa5d965fcada780b2859289595ce46c66c6233d43abaa55bd3f668ba6fa863e8fa791b438f8fa231f46ddc67a8534a6f48d98efbfaf3b3c1ff06ff8a72950d1590ac9c1cd3973ee7f4de7b98b2214ef772f3a09b0b534e71549efe4ce9f3f328e507c21ac54df5a694e60ba239407f0659a34329a6b401b2c69ffe8d5c5d40c6d0f1db432f7cdb3b2574e9bdef9ef4f8f42bef837bd3af843e56fe9433cb5717ddc7911bf2f0bcf007e957de87a914fe38721f83384cd51bf22085a14a9893e37d9793b9cae56fd47922cd61a955805c17fd204b988ca2ab2377da7091dadf3159369ef66caa5d3ef552d6f2f405cc6f03fc3e0596de05343dcbe85bf4a3549e04aefc0b2b054a160b0a94ac3c4357b3e7b5e98f343374255994daf051a8df33a2972cfa34a2f087e8bff7c2ef937d99ca70506f7fe4b65c71e95656189831f2025286dab0071e42cf47d1d5910a48164a9f7e7e37a45cf429ff0a48162accc9297dfe1cd37f49e8f9f367ca431c2fb4e1111cd2e7e9498d42cd165c6753d1458ab23fa2be148ef715902c2fccd59b39973ebf87a6ffecae9f0d1098fb7efd70bcd7d183c61079b94863c399992d65b86fcf4819faa21eed7b9c8921bff7327c7f7af9e1889cf698adae061a6747f7a38ce1e4dc144ecadf7b202cb97978988a41f4def310bd17fa38e2ef4352d17bc88345d3186cc1ba315d89581eff07fe38fdf719fc7164fb1fdee7ef40eca56240a1bc478536e42112853594347bbf853c4ea1a4313794617e1ba7db04a6ea4bd6f7253055c39c9c95cfd19f237aef73543e67f439dfe7972cd1671d1f380255c0e912d1150a4ad60894ac1e2420d84743c8331ec8752165075a5b47769fee2ec2305c7d174e083d4e1a6d4af1d5e8e9cf29aefa9efe84514a3b4957303aa2df4d7d6ff4df733ff34b5f8d4ab0bb1fc104e4eec2e9e282d0e384cdd08523e6e81c8130ee813988de071096e82b38035d49c7d9a217897e8258e4fe2211ae9fe7c3e40042d3d05b1c0e2d847133865391436b3bb9241541685b479020361539f0b047b9a4526c0424b6b36c078037b4e131fe368e427991254ceec1e471f739a7ad4e1305a57121db50076b40d1b8487d50bd16b12f58c2ce629b47279d52dc415798be8cc91668d942838c002630a1094d90ac3a591dc8d5de0d7398eba1398cba66d5a7dabbe10df7d01c465db36aef76b71e9ac3a8abda6b6f0fcd61d556db43abb4f6f866849eefee524a3cc563eaa57d81aee3190941d7f952a52773bfbdf53a1e3ef0df07c202c202c2929ad6a40a1a1749682207dce2419e4de164c914acd3d023ee6981141ce4c30bc440fd0f7a44893347e851b494e64312aec7872db298a226b4d1a638a3a5e333c519328880ab76c8c090006d3d9ccf144e78ea145eec30a1528392e0b9603da0a14407e303eb0168065f0fec872862b0d2c4a7a5d5e445eb02462b42ec07ec349f3901947d9ce8e227c8c7336a01c109176d01e1891d782d20f480c70c6ecf2f74f6d9c35575cfd7c090d3962bd4ac03ae92405dec6c297b3a6c893dce56501755ec710aa1ceb24368cf9eea29223890c55840581404c2cade3304182bd33a832056b64ba8b1f28505a1b13c88942056c61e052713319f162b735c7cc1c3ca5d0d76e061e5cc458d953d257a00fbd610c24ce451b0004b28e287359370832e5aacac3d0a4e1acc5e2c3985114562ac79844f0f6b22d1c4c59a44d2e0614d1b04b958b30650d05873073b3be0616594f4220739d28b1ce4cc244028e169118204175ac0582c984c2841c2c7658a248ae0a187c582599305e16563cfd40b291e4f4316c82a8e48d2c392cec258a2e05ce206422ed6d4e2498c956f78149c4620f961e5143c0ada1fd462acfcde839d347c401dcec022488fd144c6ca383c0ab260ce8830c402592081623f0862491c383a0e6f17070e1c2a8092c5029f360cd79d1d881dc646be04d022488b0fc25c17002fe61357b0f6e75afbe375335bd2b8b670ec7ab63f0d471106c7d3d5d3184fdf6b41972af47dd277636fbda32f0240f6dc1b58e9eade154d69c5f846134db0bca06cb4b8a46ca05e6e9c5230d507b9cea783c1ce9614bb6030df7db8aec77b695f56096bc4fa582356893ded8ff5a99dabdbb1466a685f1e88430546ab30ebb601c0e3d12a2554f54da5f4a892caa3700987a3ed59e1d3b67351df97727b6e7f63bcce0a8e56f45caedc0a800072c80c4000df8d0d03f04500c89e28edabae73a17e65b5cfd40274ae285bd2b6c434dbbabc8fe2c2b40dce6417f6016c974f7d43b521b36f1039f605b58b01d87688b62e0bec1ac66c0ec406f003cc5af724000b5dec90a1c6f591c18ef48c32a2c483a32cb4548264480912275b2a41b2648f580912a02d952049b2c7ba1d89125b654b254878f674599d50052e191415c524c320f7745aeddd30d765ef13a9aca8ac3809c2281757be39e70a698a7c0609e562e9abb5964c53f090e9643a3111928f706239b15cd817c4826241d92a4453a05a502df70adce2d2e2c2440b1ffbc2a8944bca45854c6142633263d244a33ccff35233282b56d069e9e14207282b36a52be84819aa04ed3fbe046dfa6328dbf45f825e64377a6e10095bb2868513d224d8a6ffb2579839fd9616e811ef251acf171b10818a5d7a7870eb1683dae508df43682ac4e52abbc36389b8ea657dde5a2158d69436cdaafa946553981a74b374524a69bd34b4d65af954524b8305032569add4d2ea78534aadb5d4ab556618dc8c4169fd49c34a6fc6d0c0180c18e3668c9b3166bd19e39691bd05ab7578b51d08c35e088471b716c2d8700b61606e86723ee5ba16c2e8b61648980b34aeebe39796de1d2efafc24707ffb6e03bd01a18e99195aef0d3a8728566b17a061feedad365060a036ca015779594a2e66c301cc79dc76b197710ff8de4b45195fa45106138a84eeb6042a2308dbbd6544b1af0fac7befbd579495e18346193d2f96c103436342962a5226acb56a2983a19052cad0dda953a79452ea94d2eaee1eba53e92ea594a21ef47c3a47141152baa5c9b6943f3e72b6666548edbdf46c02f696cc3f4ea1a1598b32b4476f6d7721beb37d269930ba72a11111f34922092023d6d8e38cd170d8e30c72d7d9a3a489dc5d021942c4ce931d8e30997da1c61e270f19b23d4e2241302140a2e707426082060f8ab0d2d8234d135e7b94b0fcfb04562461051a6bb4c808c2d24ed8ee42904b6cd07476a52d11a51565c9ae8f318aae7c36db39fffd6eb20bb3ce9a190129b3630717f6a419ca3fd6f7d94c0d7de6e2c45ec3a10f0915a147981d3d8a1f8c141787f2833ee4b33dfacc6b4e73719e7650281faae29e93664f543881c8186273dcdbef867b578df5515fdfc6bbeaf3136830d6f872378189bd6d5fbfb5ef85a9b103a052043dfa8cb6125bad561058abc59a5f414c574e731a137eb0e95757e9f86240b36744a7cdf6a4abc942f56c4ac202eb298368ea9da18928424eec200a480882460e44d22564c290eddf827b4031a1055098b8715c6b7d35c430cdd31663ccb6bf49a68c18c21550624328418455cfd8b5aeec5a6bad59e7267a0c1fb6fb971aa0837000922240818c1614914614ccc8c94efa6e5c856a438b3dc220608f3974b8b0455d42132bc0a801184a8664300465d79fa14962d7306a1b488c2b767d95ef262808199d1ec01270b0fd4758ccdf6349c71e6dec5a732c608f3a9ea8b16b7dac6db0eba38498b0ebbf11a0d8f5c523940065d7177d3795a6d65a3130c41665a4b1e3f3e384d788704faeefbba9f5c9142e6c7fef8a2736b0817318e34e5557a7e0301640491062d7af157f41060076fd2dc80bf495415f18b1fd6db74497661aaa70d72ec707919c65b1fd7d56eb0cb5d6cf033028630856541104cf0c58350abbd6d7516bad4fec9910aa9a3a6dfc80d21a858d08b144b8b69f1f2a4fd05502032a048fed62063ee4319216839ac7c83d6a141012a250c410b219901740fcb085a8ed215aa82127c4f6a8bf536306b5f9bd170cadb22550131e2128e14b682f49054267589026574cd1240954a7891850f4dd12a849cd0951a0d0c512519cb0c79f81c2944a82a06dcaf2cf81b2e1f96b28ecb1b4832061c896404810323fc796404798655fe197dcfe255f57c22496e999bf68cc5c61198e5c59988cae76b888da1b87b6b11317f12cc4321737b0c6de82ecedfda58cae72eb734b0643125a53687f7943ec8d78888b02a6b6972fbac24d64ccfc2f76187b7e943d7f7418cb67cf09c3b21fb5f530756f6eb92a678ef6fcece32a287c355fae2cc4492de6b1c6cfaf3d75b0463dff6e6e04c7a74792199aa0c189f9c48c4265b2e7cfd1feb0e7cf7183b2e7cf111729226bfcbd0c267b4e293128528a8e3dca588e909d27ec2e08cb700cbff6fc0d8aab681b6dcfb73fdc210bb33d9589ab64350ab2661b42a7a48bf8e7ab26c41c6727841e27ec0959e3bea5eecbbdbdd0be200ae584acb1a008e4932d024a04160e6bb5b687a9ede5dec087f92664cd1541a5b2f9d8c9a480b7360d45704570c3d4dc379442fbfef637148114dadb6f4f43a16d4129b42b984374514ccde8f014cda451a56c1ae0e2c4322cdb93e6a0d2944cc399459692fefe1c1f7c4e234c2c444e0cd1e0aa19a6b08b3e021a640d8bf6d9f3b57d469aa1718871b1e90c0c0790cfc596596c6f610301a4b60628a3ed3f275090119c6c9f19270cc80868d84afd5d0a7919db9d2043b9927201db95dc973530c87d034acad457a1abd446e7f6dc7374facff671ceb68f338899e281533c4a4037fd94a43158bbb00f329deeb4dad117053d62cf45eebb99f3dddddd7dba534a479d09dce7bc41249e5a4f207b6e2c72e60cbd0a51119ace39a5acf9be9beeafa8083d3f08482b8ad8de7b6afe256dfbdcfbef2d672afa5ecce1638b9e6e5198e39380ef2fcbaf024064e083431943547184085eb044a00e47e058b7e83f702cc1fede7e379f8f9deabe0b75ccccc0408b39b8a75d0a244077fe1c3e36f7f445d1c31c2e52710b676ec4999992286efa2e521ba168de2274825ad6fa8f6badb55ea11e88f05ae484fe5d434a6d0f154563705ee9381d4360363b502e940e4c3683d164ad85559e0524bde9a44bcea1e86aeab81ef536138642718f3117fee0388c611d86c170f486c158dba6eac72b9d674e85f45dce96cb59a523ad642a533160bc323f1cceb9159006878d3339dcaf7c07fe58f9eeb17fa918f2ab3c8ffc2a3eb8cf7f431e2a4f0a7dacbc8acacbef06732b2ad9c68e1e34a4206846b3a930eb9e11e8a5f4e529a537688adaa02dd485b2dc00f1bf80dcdb004f9f024ddf02a6aa0b8b68e43740c9a294527a29a594522a03fe2efc919ffbee478735a5b452ca72293500bd94e53149c6dea6cb9625ccc9c17ffa1cee4d5d97c39477efe3c8f63e4e780b7970a6b01ec1d15fc22b60aaaa803acca914a4d9d18306fa1f38a29852ca02c47a3e9225cca87dd3e1dbbd8f431fa2bf3ef46f9bdfcd631c7e19567e7b1c6edbdfebf8ba8a578f4665b4226a7161419d482517f07e0b38c27feabe047e4f02bdb771d27407b8ab803939dcdfcfc13ffa540d71b66d5b0953cefd1dfdf65be803ff4805942cd1b6e9982d6c7f9fc7f657873cee8f421fa250e2e47cefe5e71e6f7fffe2cedbb8fc5dea9f10768ea48ca66cfaa3292e3cae51ce4c3f8ab19c02f1bb80dbb780dd7b6f02f39340d19fc0cfc64d2717cf0e1a4347b5116d44db74621774780cfd5df70d758f33dc03d99e07deb6e7421f231fa5c740a6dc7018ebf0732fc3f65df843e5b7e7c26dfb1ffa319eb129657580940f90a135dc2165283d615d5ad954462498bb768fb5be6198f250eb4ebf0e7d7015c4217dc6e0e937d0f425507f41740cf47164cdb6e9a780ae549ebe1c65c57f7a1ef84ffaf17bc8637b53e843e537c9ca223c595f0a47bfcacb2fa77b9cc3fdb63202256b037102b7feb8420e9e7d7f05d70a3c2bcc56101200ec62900bd047d6e0bfadeaf3b225cc0d4150809eef899c2d0f7a84b142b4943159c28c2ac036e5f0f779eede0307af1cd7c31cfe1e4fdb0307af4ddcf0e773a94cfb7c62fe4c5b3fb9bde6135a36b5acde25f7755ff7755fd5a576976cfad3de1f57d50b85ab60377697b80a073171951357e13bbb42a9595d2e5eeef3b19fec6770d5f6ce41a1ebbb0d6be8603d34205b5af02ecf628b73f7d9ce7ed6765a965d7a72ce420ecad21eb5ec087f9f777d92ff7928ba4f3bd14e4c43b2c67d6b195d85585faefa7cdf4fd0eea0bbb73ee81e7e4333d2ec1c9b3fa3dec2177c6f76cae66c4299527c65ea99405bd53f3ac7b44ee22adf22c7b2ec0a1de3e122c5d27350cb8ea0e7d7cdda7baf126d7548a0a4a10e8f8a36fd1e74a55f9ff771da887e65999bc6d8f4eb6784ceb5dafcc9408f6dc66df56a6bbdd7d3f184b8483fc76be5da07c3b6ab4b467bae10b2634e93d0d8439c1ce86ff4f6986b7a8a57af6111532d52ba7edd735ccc53e6877b441726f40b222474e9493f762f529892e1f4c364f2a1ab140f52294cc950fac122e5f9f5207de9e5278329cca730f3d09809f6f8d8fb03f35ccb52b2943ce50776cfb82f00947e7e0ea22b92699673bcd69e5ecbc5a9639a619e6c32994ae0f3bc8bc600a185b6756b6b92ccd18c44d143859021d8aa65ae9a45a8e37dd50d9bb6ec7898eeeef7873c117beb1c4d522af82e9edfe971d1f4855cdd97dcf6c50113ddbbbe9bdfb6cb6927d1e3bb9ee7e4b9ccaa93008697eda1e7cd2f06d24b1a33eddf9c635fba5801fa5580f4d2d269adb56e4334a280145e5c73715a12c0206e18c45d3f93908372aab8c8ffe4f99cfeb95ca1ebc33002d945485f434f88694657a4909a8644a22ca3f4e75dd4f5e3227d95ef2643e1a2a85f281dc54f6cb4e9ebd8123ae3a246a149184ad4ef4f2333cd1f18295c3584817d3d7ae62a994d3f0bf9ca24648202c54ba4f736e9e6e81ca331babaaffb8a91bef4b214ce1f0f7f8c58f0be5cc4efba44f858036ad777710b95e80f1e8db896896a297d37b883c0ca8f6010bd8afeeeefcf0f069ddfcb5fddd393002ba79b8f6544edef05198efeb506d476d3ccc5cf477ba58771dfc084fd48302419b9d672d500367d2fc757a619f6846cfad9a9e79a51156f88ac994ff2381da834b1678b147b4ea9c4349d58be1cb8b8502da8961697ec42292d616c03bb0c1da1eb8f0f1a72c8a6a30a44a8d0b355786534fce9cf1f2a450f7f6c986bec113b4fca4b81a36d7f6ef13bef7255aa9381916bfef367d5e3797ef642303059c3c209699e3da2be1e38bc2d6de3c543a25d06bdf80d3b033ddfdd1d4cd51b96067a3ea9be3ca2aba631a8a03d6d0a7fffbbd113078eef465b6fe24fca8e080984acdf0b5b38d20c8e298ca87d710f7b34816396d5607d6e3cbc3ef7055e232eca40dfebf39e6bc763a887ffd5409b6674650a4d421e437f34cd42d34ce6fe3bbe3285a621ff216eaa11d9d434ab811eefabf4a7a72c2ce0bb68cc29fcd045da8196f7e5e5705f3e1e03c1d0888bf4c350e7c06be59aee81e762a925a1bb00ec2c1ba54ccb96e86aab4df929c7559b8e10d5c6731a7222e2aa54adf8a78707a06baf0572f01ea1472dd343baa665b5d65c2527142ec25c74e981ac27fc8c681cdf4dae4919998bd4c9a646b40adecb45fa2a7c37da88f7130480287e37dec77c6fe3390001f86ebecf0318c07723fa5caba7e408b42d953889ed036ca9e4084f6c1f1dafe3bb11bddd4c3513cd34943bade23cd86bed66376bf3d6e59cb79cbbcd5e693deec39cf5b80f8fdee33e3c66d95883f5d9be1b1f895860e1bba92cf959a5fa6eeaaf36fb7d1679f383a17b0f471726f45320cfa038d153051e59e33d4dc1ce9fef7b61db5e68757ea8fb73fed87ff3b7f739f0e7470522f2b87de73f7f541c4f7115e541ecd43ae9eca8d078f083fdbe5c7593d85d73d5a8655b14851eb5acd68dfbfbde77c37df7d50b56173f1c681a0b033dbff4a64fbdf0b2eb26bdfd77d195c4ef0a51dbc525655255c266ee8bae50f885694ce9ff4563e8f73c0f8d51f1fcfafd9ef7f99e77bdeb779ee789fceb777ec8f33c917fcdef5ddd6f600da3efa6befe5c776026d5cc28a6922c3615b5ecbb81ce356a9be8d134dbd904a57befe96b008c4dbbed3fe5ca349331f4fd4d4fe4689a39f7b5bce0256b4a279f531297ac61e184745e41d0dedef270b2eed7ef0dedd4721536d15ca4a6d9679a9984864c524cb50f340999a0b8484d432629a69a69a683ae5f83f5d12fede322ad1a4c55fdf21aef53428f9987ae52329c7ea4fcf492450a33cf4cc940fa91f2b008ea496f7ad24b562904c2f270cc3da08986024d3367c173793c7bbefd77a5eacfd6aea103260edbc3e7d9738b7ad0ffaed7186b8d427d154d2cdef7d22bd7552fb30d4f88aba46b4f6f670b41817ae62cd06701258d3181b44ddfca8a68171729aeb22bfda2a6195d99be4e314999959e149aea2703e94fa16976841ea58cb6470dc58506bae8175d6999762d7b69590c96650a4d331b68fbe3bb5e353d83abeafb3f118fa1ab77790c7d273e4c5e4b7a8078a048b2e97fcf7e1e13940a9a865ca47f01a9327da101a9320999665286fe94e931d7eecb3fe5b9364b2dbc6c71cbb7343dc1540d7776c19372657ab9865c99423da331f44b9a874d43ef072d9332f4bf24f47dc99aaea7abd198f92dacb3277525c0fb8878130a8fb1a1cbd0bbd0e8aa54a331340352d5e3ba76097419ca361f91075dc00cd47ad4a79e6b9bba0cf1406f3f9a6653b4cc5554881eb54ccb5ca42eae26f4a8659b8ed67547d36cd4535cc21853ad4d5fcb5c659dcc5c350445d36aafa7b80ab7725484b80aabb854765486b82a55c3ef79222e823fe47778def5c1b06d1578a40c7d971de8b947d3ccb5299ee9dcd7a69f1530b70072c80c8000330530c00174b0a05ad1c0e0404058d3820b09005f010bb0d9d55ecc75d9fbfc4db34d3f75af69661262b2e99b865c85daf44f2e570df1558d098aab241014966cea9a726a89b1c7938e0724050a7b3ced98689bfeb5d5b5e32adadab4aa00d33e95886509c3835bebee61516e4cb5ab6cb8b82ca1472cdbf37109e6ce341b86d845287b3a199bd5b13eb2a6745b37879bc91a96bd9216084b843d624bfbd281c30e2665a814af158e20c2fa0df6a7850aeda59e526d44b39f612d4a84b14bb5dcf29232f4514ad0a5daa63fa28d6a1aa6814a3db286851b9232f47d5c5a48b2841957b8b1795bd8b9fc86d86efad58736d1b9443e68628fa31dd7a6af03910f58684648b09d4ddf82a4162ab4dbd8396c01d201580728490081041f4481049ac3163bc81e4c2de68c684b2a82e4ec51ff1231b034b75e9daf3da25c12c0b92d036d7f6e796d85915cb0276ec05e68b2e61434254b98f1ba84e86c29c5a63fb3a130e4ca2a913143b2667a7171e0c28c4d29ad6e82f9f2861b5ab7e10d938767484faca545648d9ea1243fb025af211a14293b3238c1d4803284ac2e568ad236bc54ab0b91eb4b9871d264add65677d771800a7bb65c4c01cecc9e52d63053021f2ed29981ec13cd9e9ca0c7390be27eceb68cbf9bed6ef94486f69fbf657cb14b15dada5313f4b7d5fb28b0f37191067a94b4a9835ccd50d18f5eca2f7325c89975ea2063e897c063e88fc2711ad9f445e128b9f8c27126b1e97b610ec739834d635c384e21367d1c4e17d870e654700453b474f12b1a7ad650fb4b2023409172c9c25f12e537731a524a29a5cc5f11b40452038ac78171d5f6dbd36cbfd5df5ed2ed6e39f6a6636f33c86dfb6d9bfba5ccf6df123d5fd2276084f1b2e666dac728972bf4cb6a341c31a59452ea23898bb6a6031963bf899614dbbe15ae2131b47d394ed97dafd56a356c37fb7714e7cb553a77ead4b6dd6ca8f5904e84ee1de1a0c13df788b91fb284c9e1a22dc0b608b0d28a6d63442963bffe0c34d4d081d9b252360e8f2011639448571c08438c226ee10c3397912c61f267eb909e977e60ce11fa3b3c4b3a0bf7737d61eed9a2c1fc1daeda41dfc6c5fb16dc9144d37b7738b8c345ee071ac8967b9477fbfb0dd8be9bed8b0090716e8f853d3b15f67cd9d324573634a6c6e74f1bba9a42e478e128c160619433192953810bb71d29737fb65cbcbab5922cd4cc85d9f77e86624ff07ebd2f3ffa132664dafc6131a73b8c8bb616e9eefbe76b3f0b006175df0d61de45fb38aee2c164db1f8115dab6b6ad8dabe685b9bc1f838cb1df64db2f5e75431c29639768ffd94263f6184bafc1451fbafa808ca91fe567c694b0045de5385d3e186b8d42bdcf16679031f3a74bd65c1dd0b1eb7340e8fad6ced96684a49b56155d2bae344ddf7f9c19ebcfa8f1daf571aa4cce7c8a0f8bd1175a02a9c1e358789452bab2a961119d67511d33355ddfa601ae92301fd8a62cc9c4be8b944507ed3f3ead2eb139548dd257df27434f9ae083115c2aa101850a0439a3820c2562f82056051076d0c11323dc931d2071efbdf73e91713a65f4609f7cb1f190c69320ea93218618ffc9f689b147e9040d599e41c38a8db70442430a3cc47f24472cc5f183c02442963031d0a37d4917de0e9332d4c1517dd56a8d58d946b3495c16c8c66c907562a7d3911d62898c7c5224e4a440f8aa7aeeaf93a7bbbbbb4bea945277973244f06f5199b64a2ada42ea7403b9d385907465518f9ba0b5f84f3333b383c6b84d0f9c59c3f3da6aad194aac2db9b8861952ecf9da0c1f686e8f2533929881831ba0b8e07098657b83ae1432284268044f4acd4099b1b3f5964066e43421bbb06b6a9a60916d5a6b6dd699dd160df3b6b6c3c07d91bb31e6425bc3f86a3d038daeb699d5a13294d9b5cdc02231c3d102b155160929da1e990568da2f9a55f086176e3859a8e777448f9ccc45b2edbf8b745f84e39af807c3dcfec1c0c9421be61ab30bb920ea31d01566738ed8dfe1599ded0142aa44432ad11852f49762fb7341fe5c105d91485c10890b227141433e4616f3475194ed1cedb4adb5d6feb0c7118c1445c6f8ffc328290a254529b5e408b6b970853d92a26c2fb9b6eb6c771629884a5290fc6cb829929f0765e51f1d16660db920b0d4f315c19a2fc31ff2a7fc19a6eaaca2fde7c0d0f3112063fca518b282e6d347cf66a0ab943f0d7495aa189420cd764ab3e7cb3f4202d5806495f4e7dc214b982c3921f4dc367455b7fba3e8f76ddcdef76f0273cb1be270f56dea566fbd3fe3a2947f2b1d234b98af095d1f63b0d6d6b575c2a8f45705c24b5c9031f36513bfc345659fae2cd6f6f3cd8c8b4fb36bad6f6159c258cba23ebdfa7c80dcb986997d4310d8307ff43f01dd453a0ecc817b1f4058dc77e00ab8cf1e8e987adc73af03101617ea90df0b431be6fb0471f61672610fdc771cf7ddd4817b1db8d741863a70218ac6d44bdd85fdf7274b982cebcbaae59744d777156409936507b34107b3b6be95528698031dcf28b4e731f3dd55be7766b22968779e9e173bfba4d2aba8c54a2aca18da14e4f6fc6e505ce895f47ac57c3d6d20a5bfa49bed5eaafc71c62e8654f460da3fd34df77ddf1c88b10d3ad8fc2c0fc697da21d6e522b53d1448571ebab22fdbe362123d5a1feb93dfdf4eabf33fb2a6be5d6522dbbeec0c568f995fc16d0a140a358a7962092d4e7982c80894829f10325ff462746704c19affa5e045a6a990036bb5e67b378ac0719151596c4ec0e6772c57542776309f3b016d4e14c12626549c78c19eaf8960cddf4a4a746900c19a7f730c569eccb7dd0f98c9fc4abf2ae6533783e3c17c9f628c6260046bfeac0125fec8bb67133eac246cce5545f5e0889e2f5b5286c2f0b26908844e1e1f920fc987e443f221f9907c483e241f920fc987e4ab7db5aff645e18bc267c4524a29a5d405172da59132167b0fd381363cc63e076a31c7bdf75e4bef0d5116c8454b690d1dccc25cb4166661d6daa00a849c3f235aca992ca594f281cc4902af010cb47f6bc78dd8741524482a70686dbb471c33578d37623fae1a31ad2589ab68105749a03596ec95b3461c525aa08040113886367d1c339ab137deb8e1a55793518f2be9788ce09ae17823e893697f51cea8abe36962e390d19897282f342903bbdfc41e6fc4268803eff146ec8237623486e298e1f842aeb8a78f63266b260e337044d91447189b72210e8c425d1c33d7ab675311888e07c7acf4125d5226073ddec031db747e8b8f9489dd88dd58e22a097446cfa67f23c855a74dff462d851c5fd99e1b4c709082637643e8c6d0ec0c1eecf1062de80c267bbc31e5866ce298b96a6c81e11872d5d8e28343c85534c8a638ec110794161f59e34f455a869225cc58809e2d67aeb5d65aabac95564a2ba514d7acba1c763c34e6bee670adb5e6e8d9f7472fc790c9712a2a5be62042c6dc1c3cdf127a7c69bdb45e72fe4587aebabfffe27ad9f155fefb2f435cf532047ce9c0179d971e1789b878bf2ddad2552f3a2ecafa363ef2f0c5e5e2fdd64b8e8b379cb9180ab97829a5600d1d2c1c0a679f0e74380b855670d56a5369dfbe55530fb43a34c655af14fb5ad7be37f6b66206278528b62f0f5d91823ce6fed5929282f6fd11dfcfdbb862c6be2826a420fc234b1afbfe06823e52e6beb498ecfb1cf8d272f17e0b15ba0a002665eeb700e997d60a2eee6762b2c69f0bc7aa831ef61dc3d9be33312913a3d0a8548d956645ed18d1000080009314000028140c080462e168389485c13c7714800a7f9e467c5a9b8ac3208761945206194308210411010000189999510a00f47ed792c26d6b419839715df8d19f6215a843eade5c69a02fe400785cd66005a78c4dcdbe0e85af23168717e19726d560d983e7bc56f800118805e06ceb807072d06035c3879e0f7857412461c3af0ff29693ef15bc59fa4a47e4f0124ae788a0df9181bcb516e4c4c82586ef54ee243380e982ce641eeada0760f45fdab1464ff3d8b7cace78f01604850d57b8aff1366b1669670d09166c126b87ca72b86da1a928527c9e37c7c042ea5dd276c7d7604bfd0275225653e927ad0f8606f413b5c99d4630ad453910d7761aa384cda40e3b0f83aec6273d59796f98e12dcebff03be00e806a1642873c86ebfa5fff5e7bada0de0a3ee190e7f48f35197f85569ab4f17248042be705b53969231610119bd2c11bd04fe578a03d8b2ad9bc51c920846bda1e779d4bcb3fb7534a2ee5e131b5ed06e83459ab3a010b3cf6c815962452915bbb31b72883c0948f53626597ba715596295f19f49a27fb99e5b410b194d354fb9e42865e86be9e7f5363ab1a4a1280342eef72a573892ba6e892d08d2cf5bd10661945160d016554df462f922b0a7b795616976058d34cf01e6316c60981ef787e49c7227010bb77cee4f2866ae5d913a541da88021685271dfe593cff3d85b31feb7bef258c2c1f96495480d2542d5efb22ff847f0012f55f2541292baf73562e079c249c9dc48f6edd320e007d7ba902ed7ed38fdc763caf1377d05734a5e3c3efbb1afe72c31b15a9cf68dabbc987bc12856dadd393e5690fa9bed1c5ddfc11ffb5b527bad4c15a48b54fb74b066a439c971686ca200e88aeb8530238f06ba360fe2e41d32c61d8ecce0e410038c638d2459c224b510e4e53b36588518c0accaeb60c8633660c4c327ba7aa367860a88601824abf74138c7b9420d4dc7aee61d37b4b994a959c1c3b2215b8739030c8f9e94a70d8b852df89223ea21f0e73d2111e53fa4f06d9936c9c2bba223f86e1eebfd08ad5824b294592e000f913e1b40f096e6a60b6446229d5f6f39accd67f5e40e155615c85b9ebea63466cf6fe0c55fff789be9054e9bae9fcf8661f36a519d26f44ac29aaebc0b512f9c87a06d048b6be70c0921d19f183c1085978e0bc8e8d36630d6e4905ecd88f4463afca1a13c96aee584d4dce37eb3dbac5fe93d7a1ea3ee15b902c2c51a0263051d16602ecd591e126f38752c48314ee6df7a988ddff73e847f98db7d2193516e12b771ea435f8e8c14b6d1bbe133ee39803504c906eaf601022242047c0ae5ea75e250bc75ab5cf342d3332cdd347002eb13c02ce2a9918d42d72bcb3140d1c4fcef60a10bad132a137b64b341e005fded82ff3c68b02902f85c70fff9b3e5b9d02ff310d88c22cd00a4ea481844499d0bbe6345d19431e9e6386af5bd4ed3570f5e6a6a4f54ddebf9ca9eba17c8014470914237302d702f6ed33644bc5fad0b0b37aa644d890bef748b9adb1baa3ffa274958d23053d5b37d30fdd3f66fc718166472534fdd6efdff33d8b7e9059c1295313026f0d46e3378cd7320289eabdf57dc0c58c5182db6b5e9bf7c268516f08836cc6424e2c05f71a81ba2e68d12f645ffb11b27b7a601ba1b447e306a55ddd1d5d39df49602de884f927953e76c423ba0756d8ee811017b2d181f7c07eb7e9769b9a02d07b778efabf71eccc3b8dec17875d0b0d87cc72004ed496230a61f23613a7b130914f01a40b6e64cab4efb4d4d6e042916ed29cbd44e6bd62b7f7b7fd52799de1fffd24d210eee65820687cb68285e1b92358b57366e81da3bac507586ae3d4746b17c94a5d4adfe952849249e8b42254910d0af5abab668e28133c2b6a37448b5d95f9d4a1090a7885b84a9bad6a53fcd08dae468b9c8ec54dd2b70ec34a1080082607350b1b5ee30eacf212fd2182951887b9136fd7999a59743e059714768eb63c15650adcbfd10130c3cf73513610d48606e8510ef3539684676e24d129e41d1ca42447a95c2be8deceaa59e2f38c8308c472fa20b383774ab83853dab8864bb3a676a5684fa14d2c80e52c26a5585df11b4d32b0b1fac955c1d01de6d45dfcc41b045b8b716182484d809944f3c040ae2c4d4da87e8075127483a77df6076dd1cb15d8fba25c0e9b471bf77fab627c1373b9352bf0750884731bc9795e2b09a4288c092111dc6a382a176ffc8378da373d58e76a09eb3fd9cba73deb98dece83b06cbde8aa1c09e66cafcacfb1e48ef47ab30019a593f651f8bc29067876638c03b65643b92fb18e5224e2a77c568e03c774b09782d40f4bb6c6ebdf2525bd76f8c0905301ca9dfa50d1936da6a326782a903d2abdc76161a9771789130472cc758cedf58ca7024e6d5cd8d8146b802c33ce63436e57115c499e0a64adfa698a120546059e3df861147a2013e51804e73587159b604f35daf4cb6e5e971b799efdcde3a742ae5ea0c458fc2c9ba7a036e6f6005689fc743547cc2b2e2bcced6b7ea7e35498986068d610df39612b228f7b7e901023006fe2e3f9fe7d75cd1d75c3b4d22316f57e2a7bdf77ba5f9486903a3aef515b33b2db10805f2e1436a1ac407a8b85c3b3756992b449a13e170e007dc93ad8e9212c9ad986f6765a0e1b9ef32b80ff208b98a31cd09fe403903f0010d2d06cb57680fa814c8b456667256e220113299dc203466b4b0230505a855edeee87040e8b22258aa3780ac3e010786a512adee0d990c6f06bf59a05110327be3054fb89013deec55cd1e90157e97ece3e2a2e88d5d7a8457ed3cccea16000c1c36454e5b2392c8d301db9444b3ea043d8c05b91d35aaab064491f335311dc0b06177ecf22c2a38b3961154709144de3430174cae51b0d713e3d8822fc5453d3533a586d2fdff6da03bcb35ca7a4257bf16b892f80084b7f5d3fda0d675f0190ea55a199b12e0e3d5bf19c94790aa7a3c19624b20a820897163524d639746e472ec7d99ab76b0b5938fa22e67104094e3ff30af3347dd87902fc1b3a6d6fc70e90969bea651c0e7dd1308edb3de6ce51e7e61673608a4359531b69255e66ebd66dd7ed37683e6a586dc98f9ad8079e57e4f3ac7dfcd20c9963a10dd02342c84e46f71389971a2fb596385a7cd15dbb081b02c7e96e1c9677fac128f7c3787f75fda7f13ce5dc21f7cc228f0c9f0e455b79fa0aa79843066417dcf89c05377bf9c043259157019c7066971a6d4c78193b8d32a012450b284d0307087b16b0471c1eb0c6ed900dbe2a35e43e8bc455a59e89f068ca9632ba8fb9911c5fb5ce9a787b0a5045332095abb1134277bf2064276bf3bfbfe2314ee4eb92b5896256bd28d460e0786bf64d5ed76bc0df12bd91ac994c217c3e0fabc098e4369eac636b3a80af439e4c419b7a7cd4691913c2036c4d416a2a6d5daa9b41fd373a18cb10e272ea594a43d070042faa4caca9b75f39171a64aa39a59cdb11e09a8f8785929ac0158492160ac9293d51195cea68cfce548e52b9c64334c4280bfac59d984d74468ac736a152ca66257881f327a50e114d8846dccadfaa82b49e6ab83bae2ad063e88ff9271237d9ac82337abfd24ef661b2c25581ae2b010f246b72400df2508ed338a49ce4e941582bce9d80bb1e7ede6f5e959be2cc1a60c58e603d60018be230c608c1e0bb9364bf972b7a39a3f512c345f786db2b03011533a0e588866c9af3e9d2c93c26bfef9f3ec9bc6f387f4434906205214801dc4e11e3ef6842efb850963a63c968036b617d9bee9e00d3254f1ba0c2211e4e63e2b01d4d9852cd24a468c6af90ccf08cbc063d2abcaf5534dca1d6b8de93d04d5666df889ad50c4a033ab0ba1a4b90f72b21e729061ca668131af754eb2803b27c6f9a1b7a1cf4661592e89307113228c5fc818fef9c53e61dd39b45dc8814c8a5b8242e62452c12df8e07dfc632688f57a6cb5f61172ffcfc3220cce5013167f508a75b86355f683a26ccb377c654adeb66a5d378d0c648c947239e22876f7321d2f436d24d6e56bc6faf31eeab49a355f1cd4c4bded12d480dfc1277d43c80fd2db4e102c6a946c74b31c6f37c1590044ce9b48424681e2d054811c165a55776610ff2f0fccf4b339f8378571350741d494fa5102ce524870b13a2482ebb2d10b03963f42fec4f84eab1b66f07a59ef0421760e4e1a0e9b34b58f0eee72411afbc5c993945bbcc0163ab4c96e9e24798b4c4f1e4e5e81d78c3ffc3c9ba125ed76573bbd74051587eefaa770c9d14aff5fe5883ef160d252605f80d1a94a43f5c0c4ad8b8e61a9b3b3e9340cfb33e79d38c281165ade6914efe46f9879a082f58e67549585c9513baaa1d8668674c6fe858186a3fe9fe3cf9c64eab1c889c505080026622d6ea1e4b26c1d43036bb3ea4d85ff81e4e72937fd65288833335aee8a6380d4dea2a10ee091fabde5052711a79de94012339362f26ff901afd491d7abdd542e178ab2e0b660d570bf90829207790eea213760964639bdb6e8764d8892b72a789497de139a7a4287d5a8e399cc20b1e16cb533218b7e5552e1bad59a963d8ff5dc00618db8963070d72d45174b0ab6b4372bb061bf6aa5b6ad7e1820059e512fee12545636464ad864dcd2e66ed9101e8f97304c81f16a8999025652158987064a00f21c21571d13c374fc9db52163c159f56c7f81df3a8a797400bfff7c647cfa2a77df75abf4d49a4018b69abeee1fe2831478002465b6daf03fa908794ecce55f92ba20603c44364df8c9242d6d11f0c99504bdfdf369dc01d884c1242d209607d5e0812d422914ef8fbaded303981e751a4bfdd41a3ad313a81194621ac5c8c391049647768c028e74269509fc518dc7ddb232b4780627a4e7bf323e4a8d8a6d2d4bba24e12f000dc3dfc9417da0e3477063c132f3427d921670268d0386d022e434329430a664d921c65e178606f29e59a5da0451c1afafe4cb0089e70cd223529a19cadbf6747a14c23cd79177e9d5d4a216ec96427ca89450c6bb11a9f97d0c39767793a87da13cc14e10f6a86313a43e71b16a644f02f3e907ca7d2516d32dac7ec13d03f87daa2051daa92b6d48d3e06f2575d9291b104ef5e8d799e9885a3f4e38b4d2bdafbf665709a9ae9c0bb68556e2a3241da2ae7cde0dcc382233c3b93a7f911eba262fcf87cbbcbfc8ce6be02da16ba5190527a2df4be24687aa4bbf91f7ef26df60b8f4c3f32eb14d54e3c082e277ea9a38dde6a9a6ca3a7b52e20873d4a11b77870a0337cb8d5c0ed74a2b05f5bcb9dbaa53bb8a2d1951e9440235bf65f67b576cf4a4ddda11883a327cd3d6a228b523780b17ad9b1e82d5c92b1d3854f945c5ec3e5513d8fc4eb031990eb7dd57c50256083fa160a64e5a8ae30ce3906b5c9d60be72ee7cc9dd453cd21052b268d74d62607467c1be1b1e4abf7bba60345ee3614efc059673e0ebc69e9d00b2c6937faeb87bdb21df12b37f89aeccfcaf491eb5b64d4e2847572082ace96fbda061242e2134bc4890ecfc23a80a7358bb2c80d4df4ab466e0e84a7f00d26efec59409b719842f25e71602f31ab14e62c413eaffd9d5afb5d17c5d5fd39425a9e787bd65a870d1af49af51b4c16f06130f876269afe973af75c8990433980710c6d61cb0d7879131e24a9f0c824ab02fef23b254f9c5e55518fcb9f53b74cc2d8ea76488a563a96c1e036ebfc3ecd3dff2bdf60efe564e1c12118e862e04a933bb4843962ff18f1caaa68ecb350b1f399f8316e0181f68b894d85b6f1a5c259104a64fe5fbe8e0cb9c212d3d20e1b9e0d57892cdae0218b88c393af83b66e2db3a689d59d3cc7bdd6eeb689272a63300ca56e19c63b75bef995961d0c6c6db0479cb25e06e02093a59329cb24180682c84a930ea8f4a6e37af91809c630b2ac72f4a033a58d7b6fb0a87eae1e2e722a5c36087c828ca5eb510cda820f35e3e409610738d773c5de338b059036549fbf25e7747814cd4ff7cd5d004c1c0854f5f2a11875b7c3d6acc8e288509dff5cbc8dfc61b886a742b6c8354c1217bda4075a9a299f5f764d3fc873d83795348d93f9ae3b28f92de725ecbcca8a2bb17af5ecb9bbc5c031edf0cbadca59e787f1af12a5f6e3a063ce305eaabeea43457a44131128b85174951003e14d981a8aa551e357ff305fe6c6a8e2e41813ed1b51763513a2048c5dbde0c0a9577c857edf9fe4cd0d8b360ef63db7391fad6913281c6d31d430a3dd9a17c26b03d0af0e83a114f3cc5aee28d9901269fdcf46444d1dfeb62d7a64a9b9c21b3bfdb8caf993a603f30ab18fbd155b1cda3265bd95b5785ae6d0d895305777551667713f2540c6aac9140c45e5892122ebfbfe0a37d4aa0132f659fa559032b09a20138ffa41bba44bc76a27744f6aa1098be13d01816afa37a7183392e1985fddb12b5045669b03b1540405aa6a053133f8da6b4a22b5be814b06d753124b902095876fc0a1f62a1ad599c8b132577e4214b536215bf2862ceb27bbb8a95806abaa4768d664db6737db386d5adeb53d5d2fdf18aedb6e990bb92bd38d7b566a7b3ebf217470e55f31777c4066687ff0f61bcffe5acf10afaae2e6d702306d96b5b8cb94cd76283d1acb889fb35d5e9707eae03591524148b6f3e26c204bb88bb88cad0dc581b495764168d838046fb586f97168885dd74b98561f303eda227ce3fccc60623ff6684d569b02901bce6063f9a3ac850bbe71d80331ba440b93b47eaa8b4543d43a3ecccfe6ba2d806093b7d8efbf56e1adc15e2ed39af65f356051badd27036531998864538ab9144df47752efedf99cb63f377a11ae76a2df79e41154e597f08fd990c38984c7c0417c8be3c8d641c5343e4658de7bf25dc35b5a0028185b094e5d2aea3e0e244c2edbf3cfc1185d0678c61a1d396a080594eb3d17d5e05b3ec3c5f4a2b6c2e3cdcce86944ce6a1ad225bdcbfee61c19bd3b353f825ec1c849e6c8badae93e2fe9e12f83948483707f90c1b9a7336f78f445a3bbe314779c483620b0579a45e28ba279b73553ae33f63f66272e0c4639326375eba00921559f9ba783854814fc2e93be2324341c056245295a83d78966d5e89efc14f823f1d5bbd57cea81cc6f95b0c85621ce7eba6249ada2a9fe8e216c2a6bb0b0b03010ccb53aaf8467befe48e2b12043841d224abc5b9885b61ed03fe9bbb5c2e99006e2abb2f308291a29ecb023b44e462868c90c2a381e40f85dd53c7213f3dc3c8c74a0c13eb03d7a200c037d60f1d03e75ee1a97dd487510eb1d38bd47fcb97ea80ba919191b3b34938de7cb38b440ef47b74f735c3c50153b97fdc872e2db9fad097c9fde49e60c6c006c43fbd7fe355d658ac84ea08ee4f09efda28ef470de9f704441d98d5407d12b82d96f53ed1d591c3ed6c64bb16a174e6ca3439a3cba57ac37058eda8d6efde15851cf0b4cd42fb14f4389dd09028280f0b1bb0f61eceb6c123769ea7d0fd4d26bc27e843331ca3a410c061c3f8ee315f129187fe68da947bd538f94342dcc8cacf84ca1bf161a816872d5a4daf5347553f8b6cb4f224178f922094c4262a9a3614b42ab164ad0525b72b219d8ba961bf5c0136e4739b1373d800185a475745eb0548864a4a2d0451255c25919040ae15855b875445f4e745e05bc8f436dc8369dae440ef0d5a161b3d6ee8983d532c822628522ef75bb7813dccca77714ab6fe500aae7a38dba6d55c359c027fb8841f4bef66d07204b13ddd38e76786440935e00d5a794fe6be1ead48e9727686f556cabc57d572f379885a63c5d820f605dcc308f049c4cd8d176c82c96c0509e60870a8b308ebeeb2f7d46607af017a58051c0b3cc2dbb4602a7031d399cc6ac84800b8576679a15281fcc259852adc73c25424eb5ecfeb05f014033258c4a3326b34971cd6f686ad0d917191439e2c2c7b479b01b8af12eb79ad33922d2b33990b524e689d84eb8a026255aab93b6a933731041e79cce89a93b7836335a4e213d2faec38a6bfc326f87f44b8f96e1555121842502977805f1ca92a142a64b43d9fef74f5c97aad88082313a433351255a90b5838486bde6cf029e5c5128613da4e0c5cc018d5e8c8d9e5893fa85bc364fb0149dd72ffc97abd8c35212a83e5442c8679596991e185aa536ad3a643b45b0079ed53e7b3599c2e7370e5de361623087e7de2a7734810b1d56b14d6a89a157e62ed82e373f62e340a2961754f9bea113c08ff8df14557443df340ae8c85e2c44c01c4cac31fc31cbc9a2608f01334148c0900d8ba59ebb8c065be09d56041e010e846b5507eb15446b7b4087baefdf79b493cb8dd3bdccd69de5690b49f949945b3b96a615682d582290c6581483667999c4b3bcccb1c9cfbfd95547130250b6a155a2f159b5b91784c611122898d503eff28595a8be7b6f4c7fb2fa528cf35652b2d0d7f4510295a0dafd069608804c286b67cb9a60422b9d03f112b5082a71b96c9e30d7f2b8de58dd8ad172efbd37ae2905520ebaa57e296dbbcd6815ab9d4c4e3eaf629e6bf8d8cec1b50769546285aa33cd8c3dadf0cf22ad07d9af156b9d84db277b2febcdbc150e57c5b5386f87dd69233e12d9eb0bb30c9bd761b0241de940272eaf90566dff2e064f3ed15852e76d150044bbcc0e1e302705004fbd200e91041f8fe7fa4aaebe868c7da6183a55645e291294573009c999cf29a9a5692fe7b84e43747ab364cbb269828f88618f3c3d9e6c9b588e9d9cf4391398ab10e40ddd8ed473a008c5c94145af8eec5b6b83b0821d8d43ce8bea532649878956e0b4b68bedf9cccf2f4f40f0e5e1e0aefff93779c2859d131cdbfca7b327dc5e56e0f713bc1e095b1820c734bc7ac2699f705e6eb4a524fba0dcd3c0a4b89c433cd28eb4a1187fab4c6faac151f6fcea569d777c516d34c3386e7a0d45f9179ca1690f0d568c359cbaa46337fbe06914d73944689b8286fca939f9b7a3e5e644a39cd9e9d4a19e8b3083bdb5b36844c3c7e10ea5f4364288ba99f57c41d4d6af9c7c265c078ea44c784f60a98116ad82b0c35e323ecce006c0f180912a8ed3243bc9a1dc48c9c823526e5134a17f1626a6593ef44ed198e3471eb6f1fee9127ced18bc4962f075432620a520aec25128bb2da98717e99a6bddf1debe66b91b9b9ac7785a14962ba04a897763a33a3ea10ad08e3be623de41f5c86d945232314f91a2d65f2ffd8c890f5396175b74b68f2bf9d7f191f93d33544c9f2f6309c962784b27d410dd47590b0299d5fb7e1fda5ce3847336e9d963678a54e7b52ed16ae4fd30fbf1008b1d52020cefa6594da76921680bbbb9768362681968225339ee78dc310d78cc9188750b7ca279597433bf7c7f0af19743b99d3133ab52214880f85fa589d5de7bb8a143c8ed800fc1aed37bd4d424bc2178eeb43e1bf10a119b5810d974b8bf43a45e1ec887445e6110b87d237a69a0e7f9e80668ec20e5a2edcdbecace30748a9cac4eb9ad433f571d8250fe6ade299748ac458929e3dacd686e56b8a5322ab7b672348623c092636201372f52409d7838d9c2560d038e136696b3336f5e869334cd612b4b5cb3b421a5f7cac52f651e298630b1d631b0e4a392d564c430474abdd4d36bb8f89122b162825a8800c93269d902edd69ac8de7fea31f047cac082617cf6c6a95adc15b5a8f9d398df215712591a6806990e3732752695e0ae23bdf3d620309e544b09c0023da378244a8fe056e3a951b29955d8e81c995791209a2bed8a386c9ab8593ed195d2d2bcba65a39f8d0a954f8198cd73e8fd7ddec2cdcfb5a779ae54cf8146067e1377bcc7ffd2ac1c0ede4839a4b262b0e981170ed63ed426341a5370b8a6552be07d8ebc2bd1cc2b26b1fb315cc246ebcf468f71e8a60d39306e8c4632677271a3c2b2b8475e0d8bf4a9ea832f4e54a09056f8b75a8e947f15210d456840fbd2f843fce42a2e8bcdbff362e2d04edc307e27ec156643a1a00e78f6b036430185343b12d939299ed2cb45ff92fb4672d97bbe5cf528a5ea189cee495288ec9368584907a6762a74333806a502b8dc621a7dd7ecc53b7a1da20b837b15212b5e234a0271853cfcbbb79a4948ab80bbe753612622aed5d81060b32e530cc3f106bc01b9a219eac10c868060cea48696b7575ee18a948f04f35fa3ca54fccbb1b057fb70dcf3ae078f662359ee0473ac3a645699807709f1eabba0b0da2e8a25987a28a2da1f561c0977ea5755a3ab28bd2e6a010bb929dc9602e74cca5cf3767fdcfaba2432b0ac5f0376169acc47b7d6ce0afce87967dc874b080ee24f9a1cf6760562a0616d901040460bdeebc9603c4dac15d6baec8ff1d63344e2a24d3501aa6007c6cbc9b368908c9ac7a234c27f2786eea6e8c72e1e52aa19b9297fc2002ca6b6699ff9e89f36edd2a84250d74da14600ed0af648268304429516a4d0e33b20493996867349218ab94c1afb1cecee162750e3b41cc0e6469de6a4213b6d602c5b7963449278825ad0cbd2e28569d13938badf8f692e817c9668519c3afb62da63ec7e2651a83a8a09aa48b4a4074ad2f0a58167a515f4b21d01e6e2b8f5263f980196a11d579140a12bb4230b3c531eb16322fd7fdee3ad9980fd924338308ff64c245a2c597ec6db2cdda0c515378455dc9bc8edcca87440f2df0894bed5a5fd78db29c3c360f8982caf96ef93c32841cd1823a412cb3a7f7a4c6f26940c7745894c5c486f6014ec3822200d8d8d80ff5ded4f0bb57494dcfcc2247e75100f5bee55cac2995dde0bfd88a4607fb8095b9f80579f7b9820811a4efcb6bf679066150aae7c572186b5e8d2166523b2b171432b55ca7eb3e7dcd4ffd521c3929739cadb0bce0046a13da42997b62337139d140f7c29f6011275c1ad47163bcd05b39627e4bb18333c523ebec9fec67969fc1c444582664bad624d8ea0b1027298aff253e4d7c4b659492060c255cef42d2fe36169f0d8b0594d051c5c82da367f4dc0280c2132779a676f8e1063d7e02c4152b96e69002f51d72d2944ee4d8c9d31d27c7d3fc69c13bfe617d3335e5f06a72ab2a0ac7876feebc7b494bbec6b9b55f205a0ae674165e638e410112335d7ed8c112f7d446ee6c1f6437a27adc6d810d66f4b236bfed994ff6f19a0a0ba1e01ef33ef8db224d095f436b1092deaf9d08b9abec18332acdc0fda4fc6071124ddf2f8b72809e7635b200454ddfc4829494eeb381974141fcd163e2f1f2de233ad39e30b6a059d7b438f0fe1e966304c555ccda85dd16de7f077e464f2b5b9c9538d6ae146ec44f6c8cff97fd677404d87d073c82b23803dbc994ff4f80cdd987f47abbbae64a1bc2ca30a0d927257fa9b28349833e1de664845507973a3206815453af799c02a418cefe88d0c1d857cd50ed010d4a3f7c4f1c1b7f69adf01f83e3fca196e8ed2c4cc376b3b3238b4c043a7059026865e64ca27cc9a9c5551f0c68b31b1aa8be7ed0ed6d1cefe999d72200706a1191c21d7a119a63ce15871c223d6b7eda09ac30e7b6f5594a7b1f02f7ea5940c2baa2101c10dfcd254529ac1f0dc15584348820df150545ec0e67bf94df4d8277d546cd7e536e0cec889bc5b2eec4c8d03d8d9659adcdea1b85db3c988fc015e570ba0a2615c8230a8c0e41bc51a67cad71fe085edb33e3e39f8b0405cab8f5143406128b7f58ce349a414fa0e4bb3ed9f7481759ca64c4eb1da9f1db98a20a1e3908d5e1474892dbd3a16ce2f099038e610063f8e2bc068b94429b3c7ef5da1a3cbbcb157bba3de0d31ebc12ece8950590108bb7775a9f1b3fc8607b29e43004c62574df235a577878683bdaaadea2d7c24e7bcb1a271394a218ef4f3901e34f9bfde3e91434d7e461966f1aa250698e108a724b9ec6ffa96bc616f5db373b6aaa68344ebe3d780507684f4733ad2e57dffdeadb5f9430348e6109b85b14988a1016f0e63d63fc6a4f92483237a6f2c4e068124ab3f9aba22021f4e44c06f8b39565de17188ef943e7a5c129588c853f2144fc5b6cc8b1d922e9b730b4762504e6bdbc546c9ea50591b83fe7911771eba0c7a46486fc378558d7e6ef0b9cbf3840405014b9efd4a172722bcc4c00edc816a7bf4ce083b398b8f7243acdc54a5144193aa70ea9eeccdd2171cad4b33c1e9e0593721236debd4cc2a82d8858a2954d20b46811d70a6343bfa534cdc9e600af83da14c74e93dd06d34d8e58bf2f79ac784d286ecc01d2971c52e43daa26a413efd46ed186158320022fc10a1d9353ff404360e9d94c263e21ca272ca280f918d8e0b4b30bf5dd8fcfbf3b64bd4903b0fe4caeda4f742ff758af5b0bb59149f12c285a48529705b16c8cd3aefde8b9bd8d6d60d49ce64c000ce5c2ed066d90227a58533130b6f582b1f287cf6a75d07221c8054e50078ddef891c9418e0b4257febaf6156ceb1f1192cb4189aa1204e1014c53f5ef1e1d570bb40623b3689298ec723d0d6d72e4600a81f7a90e9e0ce15e1c4a26565b34d3c466037a6d0d7a3c872e531e457f0798db422f3bde5361cf449300f0d60e1af4f5030eee1d462d241c7081397b42943e93347477756e076a9b2924e2040641906241c8ac43e0a383610c597adb90aa76e1ea7b31ad493a00189982623d562f6494c30c189be20b43f3c699968868f94f290453d84c02a48b787946ee3a030bb95f8e899a3aa6e0f4d52480abebc899da458e63c89f606a2deb10e7a5981460c14e712aa9c94adf79f15a262ceb6f3c5979aa623e921345984604dbdf92509bd06bb224d09ddcadeeb75c40aabbb8f9f94f3eeac09b9e75ea86df10ca66990bf1c41c63d215b54433126bfda5a1259a117c1481368d560ed15a9c219b115ab79cc48c9f5d059684c5c87a0eca53c04d7b550388ff6f03fdb06602ddda9969e770269217ee68fabaffbcad5437a591a3dd916595b9870f6985576c31368c2894e16b75392369c70fc227963cd5e44ed2ce67ee3bc0d01b27dd2afc53e89b18c5be05e224f4729091a4237662d5a6e902a409e7e9fdbe38bfdb6df688e27f58e5ffeed63495971d0f7f9b27e4dedcc49c0e90660563da0f63e44bdafe936c83e95e1d21ff9947b59630409529711bd374cfeb537ff32d92e42bba856d3b31881007f1b0b4438200420e4303c2391d698d9de7cdd3acfe9a5499914a5044d392617932069c52d6894eacf984011862529e39e5433bb53aba8b31925543c729f3be62538fc2d1a28c6d011db098d683ba10306486cf811805159749c88836c4d1ca25c3e040e21421435c248ef04cd6a7bfed55691e660b9d29efccceaca718cd435ac5cf7f4d9d3f6e7598ebb42768ae19a7a3fec4d8a4d216a39a4d1dc25478954e8fd1c0765dc33d9660f076919ebbdc1584b0e7cf40313733a46057c5261e6a221accfcb6ce4396741193b5bb9a634f996b6a2fca84c96d666176c84fa36bf4149b06735410e645d7e7d38e7d47add5ac11e1db7ed30bf98a18ea0ec59582636f9aceede0569abd71b7264bcb7bd4ff12d3130e323d4aa5b5cc25d9779f68596087a4e05da542017be9e1a5d48d6db447a2399166f2094f875d8072f24ee266889ba3a4d9721cc875c58638a2402cf6cf5902ecb71a79928d133f03d63964a42b921504a871c2474e140c5455602347038cd9265180cbcc59dd6d104cd23dd430c8d5d92cb10482e8d858a5aff0ea932f8090c166264f5fe04c604766cbc383e367eb6e6f5776162c6787c25cca3dd287636161ba4c4bc616e9a238c4385a54b0f95b726a383581289458a4737aa04b05643cd35066c13ed7e5804020ff6e4af3d4bf015b95216a0d401eb7bbbb95affd8b181f1e08dc71ca1e3e78713e7258d06884c03358036e3599dcd28b13e8470fef4485967155abbfaf99c00d1ad5b22237fe01fcfcddd5442300d026e541744d592fe92df7ce2c86418c64d5816f188ca623c785ce2b22787154b4ed76c2cf67860a8279291250deadbba5a70c027ca4a8912ea20db38035150950cff6bb631166170f9f02ff40d14a06996a193ce2ee068e9e23da7c29eb3e0523d10ed4e5b79e10e7b1d0e62a018117a1c495e8e7a918cb2ca4d3a4b05d60dbadc247001555292811c487e2d9df8930ce510d88de88f9622875ada9dacc66f758fda64bae9c43ab1ab85963e7e49559c97af6494becfb3a27d922043cd6745711d7b1ef335f23d6670e482149156fa6b51ac67c909c100b08c48b8b706bef606c68413b04353fb28ad2bc84d72dc49975a2b01ebdb41b998d5d0e270e86139a1580f872e4119a93653428c5150312992cf8edc1e1e4ba697a2dd60135c4bcaa7fd15aa6c90023f01242cba19e0f024d5bb20182befbaca88f1d989d8134209d9dc81151a5e0c177f553d49354992289cc4333740af97079008fcb0abe1501759566dfa63786c985c89373c65246481dbf0598b31fff062ec50e2b25e182c49de298192e35efe54fe37f1a7090d6f070d2f84c1294b8862c52cffc7f6a6cb1bd8d46af587e000527d3b487ab405d022badc463fbfdba09f1f078492fc72475bb6cfb51df6d8da523b7692403bb32cf14e65e18d7c51d3cebb652e531fdc267d4ee2ae6edc291fdd6aab852da538d2da652565c6d102287f591d08d59331057f813f6d03fc6f7856fd5025571b0f1b295623e399cffc1153adca4a6086d1e930058bcff59a9af8b1df333a75b342a8b5712caa0e052c568a6af94ff4a936cec067b515c0ea7dd0f6c170fb584cb34eb40a7d9abd9d81a58669d3d65914a5c54ff7bb37b7278f6a8cd989efe5a84416cfa4f96e7002ceec89321e1194d2b244a2e2c0c193305b4051e0e6bd903d8aeff83c8226edd2a86d952fee23e3397bf627bed009774a13236d95896a0d399e2814c10887bc54fbc1a55e46dd570743b1f9548681def11c2cf1ab1a0a66e9b03304f055c8bebea84c47758b0ddd1a4e9164f63ad9438a1bb409d270076a21e4353834836c2d35ff15a703b4ad06a13a65c863b5307aec05c128e51cec44c73e4da678ebe8f74259c3d1eb0bb6ec8511b0439a9d309bbc5f336061b9a4b110f713c595d9caf98fedb9456c3afee8aac66efbbabb8333035633f1070593c2ace8093b24dda84f53b46fd7b8b5a5e2a841a26f7aca85f8147ca6a7a9dcf6b74033dc18e7975ab15759edf483d74e85acb853eb49ffb0cdc020514c486b71ec2799feef989a7c32ea0ef85ad9d202b591bf381a4565e74be4ca732710660041db66621df01ed7e84558edea7bfc8eab695fa308d82bf66b95d7bafef17b6136658fa410798c6777084be8b716e1fb603f6b1772a07d803673cc86a8c44d902d09cd5fbf1fe04530286fa56e63f80ecff1152ee169d098fdae30e6c9bc39b69342323cace03c0c2836038d8cee379f26a3e69b8a29e8402807115c004650c4acec330d482231611c8a512a9f200138d32207da77f07fe3e71bbdaeb70fbdceb2f3d80cf16b8557b439e14b983d505601dd0d47d5013827d4aac4905e7ac1bccfb914fcae7037ce91f5f2dc13210490b430eff72061f75d92a9b77a2d3016b66c527b1379895e3c3b4bccbb8201569352e57f7858447fdd0d162fb4b0d3ac781ec81a3ced7b7be41d56d7bc1e4aba60c77762c6f3b286be40471d7df88174165dde2a166adbed22e13e8b515eab67e6b20594bc9e0a75c2d44567df13b312cde5c8a1b26626d3aac3dba8273460adf5a5952532a72145659196b0276969840e52d84d46f0dc64bce608fd76ba5fe2949c6c5a52220078a6e8b464e43c89181e342ba67fc918c4ded418084ab7ac225b008cd39ef21f09a9cba9766e528ccb067af8f99d2fcaeeba918204ddfa4258ab158ce38f56e131d305ba527faf949f3c7e691a36ae8f7f1f96156c301038c3f3bd37829f7c7cbe616a8e668ed5724a8b0e776dde33e59133af548adaceaed7c6fe4d6490d620ca764344242449694181ace8dc5eacbd03aa7d4a1942e9da4abd6857d6807b282a03f3b109bb7d28953f73b491a30b10ec4795d204f8a3d3e2c2ce34af3bea100a7e2962cb571a23aee1580d6a0d8d62e3579c0e365e1fd386487eef9e4eb8a83777060efd59c727745f62115607526ae924f12226458b06e4a6363cacf3a9886d7d4e23630a4cdf29e0d5ce533a1289d3200e2bbc07a4cf0f2d9ffb76beb399e3b0d460c38816d7f1f2cabf5f8c273535d227e3eebf7cab79ad173c8ba04b311a66cfc9e75b4a6df28a6bb1e7878fc2774f58ef42f0fbd1bc146bf49fade74f3db039e6380978ba2cd5c49b642e5d031c9b73f96355c758eac4ef92e00c487f2753c4365cbb2587450870111b9c4716dbc3436fa18b6be22810a58fbe7b13ff1d34d6f9488834ba46b9ca4d48a5e5a76dc15865cbe2dd2d22bacfb1dc9cb9be49e4db10bececb2cbc344a339b6e93997551dbc5d22d72c5c843333cd7038bba8a08815e028c9e7accc8f10547296d508b2cb7a7619d549358df06e50bc3c056176225ad6bf920ef3b41f1a2734b5636fd953db7ff5692bde1660e2eea18216ce2ecdd616b07cce0a133b5898a04e7a04ce69aa863d7f881919348177447d2782cc6376747648477df0c4bd60f5329ea76e8464a7817a5c292b2ae0f3e9ab0165896c41aabb1c46a88f28468074e4171dde6e289a9f28b57c6ae6074735196b42c121ff7e052e11e21cf264abf897d73025df7e431b70a33d4d4529b7b6a9ba71ff05567bec15a680a9b9864a1c6662d19104f7da84e0d677eb83d66260a64502b62ae8773264c196c97ac7aad32e48a0a8e5379887cf6ba42a0593b60d84889fc70eae010eaad42ea72603e26ae852e0b10ebb1d67f870345637a5486b871b28adc501899756907943384d8bba119c7fc78ddf88f4b6fc59af33d871e6fa76bd24403426bf85a94e6b4f8d8794581d6b6b80dfdae930acaa019b94b4c021b42ec26ab4dda6591553d96f4c2c4a66aac77f0f55b9eec0065391ba4e94c8214394658729a8ea138f5fbeee3f4dd8fbe682bdb40ecbf47d2f99af6073e0fabf882cfdc1355c345cd9e618462fe02ffdc986f2b6de66177ff5b4f17bc771c3eb53b8fa33172dd07a51af2f64a067d24030c5695db2bb77937639a94ee9b10dcbf22bf549e13127034f726e20d0dbb9cb710c4cf04ea40bfc8ce382cd88c02c3248a7179794c33c5c8913f41a0e56335ff62dfb9360cc63e01c6a4926704526db7191801be77b21ca49511678c2585af673c3400bc5e297060d20cd341d810df224da3d0d218c725c13688346fe6649fb6ff73986f8a94880e32dfed65d73b16a1b24ba4a55a104158be81cc14ed4662f3fe4956415a2b42c1fbf212e78b75141cf6356321f35aaf732434174cfc3ba3c6dd032036f3c3a6a09c367cc43621dedf581c34d5c302512c819417b7e6e141c493e9e00e0e95afc288309ee4ca16c01715cfc11537fa04cb32a7a183d0fb2843d017a259c5bfabb2b4dc40962d0dd6218cd009b7c327248824f54cfda4f42740209934d7c7261a0a5b3c9c0bc30fd0e894b209462daede4970be7f577d427a7d915d04b262d6583bbd6aed3c6cda20301d2d3d565742b725006f70d60283173b6284a657badc857d0c2bf4e3acd38758231f2cab7d194f3153e6a188272598e67fe6f35ec6e5c3cf4114da9219d7782ceb59ff7f7784ce7ca7d24dd1f129a2510ed702880a8bca251d21bcedda7906c539504f522ed3ba113032fdad8ba61607e466b4188c218031793c33285e73621f5d047902bf1e8438d15f1b0230d1ffae117fc42d16839f51c1ab600b2494b9375f77391a1d6e9335366f72423feada2f94ac41887eefbf9c4580411771c1b940dae86757fc7b4a81270306b7a8ba37e46d196ce1d1f8fd2290493c62771eb177e726863fd97ac003bc0c8a335c33d1f0730049d441efdaa4a66528ed00f856747f431bd0c79701e20a572149f989ec056c746040222aad3ff6032370f271ea40b71a5ca2a9a30175651342cbb1f2985ccf0f550a90fa99197f5412f1943e53aefd93277db9015d1ea95eeacd801b01ea219dff0653705cd50eea8da2bcf192a4e24620db3bc4e736e0215e0ca430da30dc51e03a7cac42d551b06c8666c00b5ac2efe5beb97095ad43fa711bf30d2b60e9ddfa9fccfec0d9150801006a3ff0bbc22b901f2e4a7b8386170f7877dc33ede61a70512d3a7791a1a7efb177353a469ece17b5b4563334d97710c749b7cf4a36537e2f91442766fa07ac38c8806aa1f4642427ee121a0c64240723ac126c11438a84f2f1986e175c8e16589a1d7c0ba28122eb19508d5c23e541bd54fcae83e7494ee057def8179cd37af131f02ce405fbf4aef4e660ef3b02b1e8a333e3b850466d4bc9c8e30b942c91119d9c0c6df0840f8c66cdb5d585f44fbeab9306d13bb9998d9ba13d6b5b0ea748c9ffcc0c4f0a928063f3fa854bbf52747d0e060c4c862628cd3b61a575462d7581f44111e6b811f25ca9609a7cd4095b14a923ea06ca81a212e7527558e30ac982ae600c49fbc3227a339e15a43644f4e12f071aee698997c1938c497fc2a29d10fe75356d44eff3d983b7dbeb2bf101ae4dc5d5b66a485376fce72e4beec7392b424feb96c2e2f15929f6d3b8591f3bb1536da32cb2764e231b512f417706adea62ae7300db29e5406a728bee78b93ab8bea287c906f3d0d2bae79dc46b79df4e79ef12818ed1c08cd895b43182f1972a0bd31b53991eb75dff5dc7d2dc687695eb7ca3a0e9e0956d440e6df7923d99a6c8573917d19756eefae132d910e04b416279e1e30bdd8e90a1c8d3ef7690677b3b35b07c730c1515a17a6f1a3f0f55a8e927460f5890ce277b2f5b0dee4c186fc7962e9f26ea3d5c3ea0e4e935aa642f52587cb562110e22b4933389a09d62ddd4ac812dbb02438b940f7c1e53edd961f856da30eeac72706dc9e9a6983c4daf50db5442761c2a30a46d65d27f19ccb4b87c034b3d4d772b868e5f0365a3563295696bff3fa31bab3b61f1cf25da95e5f4aa1eb5cc7509bccf1d0935c9eea86e33968fd50d7c278ba737668a7af6992c55b5fe109fac5ff4e0af876320a90481ab66f05d04ae4bd960b846cde9db1df088b1388468e12a505c1c94493f7dd147e8cd6a46bf7c8b928556be3b7e9dc00662ff4aa804ccee89bba6ff3621abc03b7f625a4e889d6e4307de4f69cbb5cb6a2d025a8e0b416001b3a64ddca23d9440b104e5635f25b8e486440f1c078d643b80dc92a786bb86e892e128f6ba25a3700b76e896ac8aa38c12dd8f4975e7b0d9bc1160f29d19091a3d67d535056537ca0adb0543a9b8462ab2c500a3f4e70456621ab1deb98b07db5c60634afb1014c7c3345d49c04a87d5ee5a491cd89b94a256294cdf05d44168ff285ac3601f6266930f912634688e2e7f4544ac8574caebfa71425b4869c1596ac61c97a2a5303124c62e3a90015458d8b836be2577ae5ef9f43a5336afee842c75c0528ad1ff3c7ffbda3ed0761f5244fd83d8b246165daab3e8ac884ab68daaae48a4e7f36ccd50796ef0226380792ea8e76f0ecd31bea46a19150a7cb1f057bfc0d0f28bb1c1da5adfd3d2e92e3b8ae90ce06ff80d8d8df75fd69af62974ec98feb6aeb685ee14105fd70abc8fa77d063b0aab6e3cf8110314a9033a31206daefa4a8b722d23fd464abc2bc8e2a04ea4ac5f1310fe4af1c27139eba37ca50d821dbd945f55494c9be90b45fd818262c221100a676b31a4de9844ebd316234021fa09b1000e434225e39808ecb91e62891f1049d59d95fa746cbf8ca38a4f38647eb08accca0d92aa40a7a56f6104cbec355bc8fe748bdccc623282cd69c1ac4a211e39f2bd91ec9fdc3f752f46d492e8df14fb291bb8cc791b2e8bde2cbf5eea3313d7b7e5d0d4de1d62096fbff817ee68cb18d18f7dae6fe70cfc5c8dca6d73505051b576534e244951e5e1f27f49d1b5d3808fbf24542b2e9ba138921595a8afdf01827824097f35a1c0352c8ed710f07b1cd12c89359e34de47a350d6de4d9117b719b9279a747a5bcec0a9596e07b1e5f414c5696c12b1432933aa0c1400ba021c74efa9aceda89043fc0346959d8dd4e7c2a91c0f351a15bf5cbe4671591e70cbf63d058af0f26efb5a7ca5d0d73aa85a9db4d52bba4ec5de997f7bd6a5450e6f211073a7e8a69e66b02fc614786a13f46e8940b058e961293ffcc124c419693ca0a24465bb943ced427f2b4a894ab36ce6993dced64de0c3034c2dd6c61162d7c4b0c86dc633d5d66069c3684a8f7cb04ac61dd2f3061700b044f6fbc90f82f1f920c7f392ee72835521ca2bc8c615bbb7e4e08f251f9cb65f0091eb975743affaf9c2544b1aebebef547e46b6587d79c254a2991fcdfab9edc8dbb590e1d2fcb59b45821aef73c12d7d6e5ec634c4592dde9c44f1682fa9d2adac8a04f63682c10287d2a5cddb6685e040acad6ebdf99e84e22f76f71bd1263772bf72b57e0a8c23df36029277be26c6ebc9379ca257f0f870f87c058a5affbfe8dada52633f2b2f6fb19cbbbfa223cb02963fa7abd57208597483129b5890c9604181e8f7f6280bfd6cc6d18a88564d8b503441e980247ce4d3e890d89a1e820087cc340f6b1f96a837f09cc9ccbe0fe5c08dfa442de04ce3c6ba6ba54c8b15a94007d0946626d59db1ce92b88e92e76ea20d5ce76b4efad1382c2476563c7b4e3a3bf17433c41dba0c8e73da8e88be47b4e02b75132b6f2973948fe8b4e046ed0d71defc0f517d82d3750befb9b4ab2ac6c70d8d78230f2d6126af9fdedbebc0a0718c24e04d6b3dc8ea0796c17300d16bd5839dfe7d4bd15c2d867e69b8a4dc3da7cea866cc91b19dfe7aecc6da340a9ef8043995590b1f93c45a08333bd9659562651087873502756dbe3d9ff588c4548ee42cbca5743ea5ea14f767a7817358786d87fc00398658ca4a40995f262ffdd4d9745a64d84722ef381e9d086e07717616fc38f83ba3e18d390a7518358c4b3abaafaa66b538fe356b53258b7968c34c9ce6bff14f3f7cd67584535255b355c5780d73b69d523863099b0bbb0088d302aeb33e897b7f2fb397d0902d6a089643bc2cf2569cbf377ed22c4110dbf41eadf2a2b0c03f2d74b9d8aed0c4aef1f265bac547d1f0f50d09e75f9229d295591cca69d17c178e30e907fa84575125ac7bd34a1887478936f64f8579422496bb0ebe633bd9db46f16a1bada8e54c6bdd3bdb23e539d21e6ff70e774065c6598e5555c9cb2ac53c41e5d2d5042a35a475c50cf2938808c8d6757d5e6ae74478ec512bb3516fe0d2cfc3be64b13a3bff5433c3535af9dc8daeba6e45666076eb116c4e86f7221026e9999fb00e7a97ec1ca616ccda37fb01d33262f2b9b4bc946a97ff34e36c78170356467e336c109f12b6bbd850e79e1ac5e0eb1fe5108216b970379a88cafe3d056cde8e0a58bbef87a78065f48e815599b052c0a6ff8beb627aec2ee9610837cc01b05f25a2dd25063153331bddfed05089075b3e6c7e962006f4331e620d8ee69a9433d725c8961742cc0c5276d8b04f9324875e9cc5d35aa81462a15ac44ad50d64009e79f5ea3a1acb63a87c737d3b1b2a8cdf5475ea43dc13c3e6087c2f34e43ef3156c38098646de5a4c7a15eb2c9667f74f8c0daef966c2d73ed8182ba27d2fb39d162002e243621e28aa337bdfc99ef2668670251b19b09f4c61901105f2c1c94db448f05ef299beba40712a97a7653a07da6336a31fd61d0146fe97cd24f99ede5af7092c239df5d3e08a599825090750ae5c55ef26648511b1cd75e73d20bdbd6b83eafa66061d33056e3ff034de0e4d626d48537f9033657b09d2458939eda834b1b775247de9f6c39f5cf80b59fed4809039a21cab2cb8b881a4be856cb809c75499ea42505bea3d9ffab46abae16180a288f5762f39b22d009fa041474698c512e9cd18d8397f32e01f7d2a31a128f30378d7c656603a27ca084b1655d5fb14770e3f19669c5aff0565e0009e5c01a2ccb643c19abc05a736a896db86835b5bef4b009106fa31073ebb197b23f042d4a6e705b00a750703cbad7a6f29c825a8fba69254341fe92746b5b62da95df6bb431aa7462608c0626d0b95821c2088ca2c8d007dfb8b67bef7f924a15f53e731648e1d32d612e815a900e1485ca219d4ed9b44e8acea00609f22333c4bbeac268c61eb54d0fdc5162a0ff35c931f005ea1e8d1a0560567cf71267338ac600c4819874e3bbc0747c552ada4f819adf7df2c25feb48dc4fedea3ed477037df9b92e056fc843eabb84f358c6bfadaefddc0e98e79f80c5d7c38994719d274554fd38507599d188d5a773d69334002fa2d29f874474c21c8b91c1435a9ae566b760359a84a5740de51a6add2a55de96736859024e593f8313da9eef1a79859da67aaae2ed041b5e7c2d53b8c532c0e71e003be470440da7854c852b47c064db53706398f65b9ca245e4d03b450f1b0a1af9a4d4d60010c80c883e8ad873366fb3302ed4a6e221dd1c5cbf4c1048536cbafb127bd1f6d6db55b3584266cdc605aecf7a20b4dba3fd15d43e257842c5b4de8f74cb2575fe239afd48c5ed6bc687c4f73913fc1bac2bc90654fbb527c2a59d628ae82ae31ccc4694709b3e90427a571be20c023fc3b8ff4bcd3d7f4f516fd75eddd0eafbdd673699376df203bd5ee10f25cc7747c59f9f0b401bf431a496933670466ace863f16f733f051eb79ea2fcc24d8348cef549a49e36344918be041d690bc61ea54eb4e532bb2dd85b0720ac05f9bb2f2d472610cfe57bc90a7c59a49482111a7d7dd3f600bb1630059b06aab385b5309d3f7753340bb84f0e0a8110ff7cea2e1054edf05913970acec97c25bc844bb88e7b3fca675adf429d4718b7385b1ecc1944ca3106251376727a8a9a1b831988cebf7639037006f2c784e5b9443e4b1ce46f04602aa0d497bf1315b01ad53011c147c91fa1fe8c9809082d5a13beab1621c7a82549b42fc43a7b857d3335610c6dcca5ef4ebb58a4c128e1925aa3763128be3b6846b09216762e589cca6bfe68c7b000d1dddcd8746ede309af5402b0ee39e1e39c099f3f31cbb5a4cc52d6764a0ae0cf02ab56f5af65d96b623ab5b444ceb7ba4d299e481a69ea2d8ce842c11c61e1fa122f5f5e0068266759a07a680190ad4615ba3f85466e02a3f76cd5d46b3418571c74ed6c5c950eb4f4f20330d802bc30185d9ef838a2cc94dbb3b655ff1864390cc36b9e951e0c4ee6877234f866500613061551c6faf725f46547a9c9e331e790a197638cc8599ab0d2751e9fa65b12f43e4cac843e4696bd12ec8adf06c76261624af5d0fcf6b2ee6ac44b2e8440ebe7530fd022a5e1458cbf29d90abefd3f2116435e2ff492592ba76d8fd19b9db010bf4e65a3c6fb0dfc8b556253305893ffbd74b388b1819a1a683a72ec8b76e1b7f95bfc6928a4fdb79731de5bdda06a1ad66fb1d6a574249ebd6135983fae348b05d434c0e136107fa28ee35772f65b9f90e7c5f224ba2db631a457f62b38aefe43a4b848d300def8a60d901a8db48eb0966e1386fbc56debd417fc0d61e8547dcc53a1b061f5e6379ac831e1299e56b77f855901247a3372f84644c61b132470771a42956fee1dda48391d77d1714c86aa8ea094c5dc15446891b349504e23c8c4a4cffabc2b261c57bb64813b2f3ee9520548de688af93e0b483b9199fad36bb112b7f55d4101ac33b9a633194258370b833866067a7bafde8f6001ced90e2a50e13cdd0a49eea3652e36133d37d294a5fda81a4df4172698bbc3204769c10677eff9635eec72b30c4e6e61a738e357a082d62ec8a21e39faa07d0c6e0566f8cf2019fd086bf787cdc3a03624475651ac5b8dd4753270bf8e213a1572ac4e3dc1bff3271f13f49499d3e0ec0a2d6c507b7aae5918127084c7db8df32e13d4a27f4528beee359975cd54e6a2efa36c8096eaef03de2d3833ed995943f27e00fb7ea1f1aa6ee23f3a4f338bf5540c2b1ef50edb875f171d2bb8289d78fb2911356e91df91c39b472e3530bb27be975d0c1f46eb01f02b3af7878ce8bff37cc76a3dd25a7bb0794f59a3db3872f17b2784494cfb510a668ce9664af02606da4d4b114f289c509642fd8ec2e66b74d74299b7529852f51bdf149371f9798f1618084cf0c38105dcf937b5b7600659a3fdc53564ea2789881a20fe8c300a94a734af58932ee506b0d119f128bfad93eb4a0c59d51989a575ca11a41885be50bd492e2a379aee73e0bd6fe959e618e8586f412cc0c413653f1cfbb6e5856173ba0251c865224fca1c2babb1f6ae03e63e25e2b7b8ee5a1872310c07cc827ba60ebff50032ea09cedeffdbcb0c0c3154d3c2db05b004e13bfb91e1638604c911dbc070bb0cf19a31cd4a871c319ef586eb8bf3d01882f3a0f7e7cc3642a058c6bcb9b07fa7ca957273960c7c577a4b450bc041c970c44e0b27c402057844304b9fc72451ac04359f0949c21b262af813ebe2a06e16e0db8547ce30ce5fcb7f79e374656fa6dfe38da2c209dbffc9ffe70f6573caacdb859dc35d335c2d2b62b9ab712c59d283142fa8cd3872d686a9001d8b0df46bc057e5f63a1d8167c73f813cbb17c924711587dc49116d808c91442f17097b43baba6e7b041a3a692329051c3707c1a09585117eedfee508a6a7cc213c5682dd7abf1d045d26d0094bfc655dd954360ee64fc5b4b64076b212ccc8d50179117d0bbc8e4f30a4269b52fa32f59c8069491a82e880527121ab5dcab08bfc303ec8751827246b67d5c0d548538d3f9d316d65f8a07286169abbd12e256569d37f9a1259d29108379577b18dd0563a02106c66689d2a93e21e8f4f5099ed771a24797a4f605a1e8b4e943029a5a2b67e829669e47f4a3a9c3da2f7b5ddfdddd87c3f6245d38a194aa67cb42695c0ee91c069993f273556d5afbc9ab4f1777fa8ca1c3be37fcf0103f758e12ede5b56f78ab399501413a81b4c3874aaad53c4f47f1c6f8f83613c7e8e517a409fef70a19bf77ddaded3c023631c7312ba1a22834eff2b0b1380b094eab6d0106fab3860c39ea2b692cd61652e41fc4cfb271fbe1bd192ceb4729650af6be84000b3580d00e990185eb6b160a1589d62d808bc9e812d240c0d1068e7e14b29416049dfa027d787907220e12892d06139dd70bdb9ee0131ef0636a04e0139ee9b3ff5540cd41c7aacd5e9a02240a814a10de991291f73b2b3cdb38d0dc068330beedf2c5794e0dce440ec1820228a1650e200f5c0ef2e46c11c1b28c143d068d85899bea10fb438cfafc91a668c3b3b1678b163244c67a36c4cbb343168c2b45ad603fb60b1494d9ec1a9f7471ed1d521e2bdafcf890dc29902cdf256e911d50caa60fceff4aed65031a1981d2ab3e5e05663d16e3820bcaab4439c2e58d0f48e5942e78b1ef8ad4d90eb9e15f9fd51b2d8c8d08f2382a0caf0e36c342785126534e23282fdc5dcb96c2e2863a67463ecc3d14b24926e0f048a524a960ff5e6281f75db5a75951638678e2a269f48753fef552e83106a95160b12be06f2600d16e486ab335aa4056157ae99cc04d1108515b8b4ba6a77d199b8f6f41859721c7d8348881ba322c2ad01c2e8127715914b97067272149c789d5f0bb2929f4a8ddd85160f73aa055e56bcd215840a7b49a0f3dd5d1fb83c0ef61c4c97a5b4492bfd61175becd58b4667da3a55e19a127d640f1ed3e07b3329249b64f9f18a4b1a5f3a7c2417503640131d7373687ad1f8360f6145fb8312c01415874c1f573d709316dc017f2f783b45ae5c84dbee75d5929d0476bede9de9ccef5d1aea9a69c8ac9d378d55ba8bc720f18bce0e642bdfcb144f2c0e3e6f8ebe0bbf45605b4ddb60cb7922c66060f679f8ca6e9eb75b7c2d9c1aae39ede45042080efd60d67953b8dc3f840a5430caab8dc2ed3730e0f11d0e44730cabb2e03c21e687a14e8b0a3f65c2d46651d9873d365957c95f4ea2d9d2ea3a757f171d0a06d043ef94e2711c426fdfa40c4dc8f410622ac20a59709e89454f43a62002f1de9962ad16b390a76e046db7b46342bdbabe5b5c6b602a9f313edc5cdbb597b9e7e626ebd085363db4958ef04bd6b0bc3d08bb5b2d6582cfa62ecb0477e44dead3d3b668e408702460469c983969c50333658c02036d9a9dd15d778068e2c52c401352f9216766b222df04b2c0a61b028d7404c0821f9f0eadf19d433f670a5f9ad8618c80092c3cb6a33c211f5ce3d1392907aa7af34a08506aaf1184f3836a90ba3e15410780ee192ad95a48d80e4392a023ab4015bc3198aa828469badf40368e8f95079c0e01a786ef5f097985c686925a9d20da8f4268e9a38affb9ad4366681d9aa28c6665f244708f4f8dcff2b4417c4fa17fb297f82436f0608c044661c488746dc4333ea3091db3f563d90557225c4240890293316ee78879e6c77ac075ac7ff88a3107803608c66070312e2a6df11ad6bc6c2155a99edbd55f0f1bb27ac73b942aba5c290b7f2ca27dd418e8f92805ed72d611ad6489fcf19855cf4f5cf168e7a23a8eb8e40739691a7b4d74c858a0db91caa5e4314df07e8e484162c14f5687e6c90f85cd6795f2598a327db1ad5d32424ca604cdcdb89e11a3884dc172d1253cf699604306ca57d8ed6adefe5683aa8d7bc8b464d283ff21bae40d2add910079386fe3e60b561e7f02f29bc5b410077cdc31ffd22325a5d6f1e005c8add5cf5ae2b8e630759df9a02104b2722b3364e16b2812a6a1c63beb2558b86247d568a2d7d538b389336cdf5b45a53ddbdcd270cdd6a0260d5be2737a2dcaa24702da929550a47cf68624c0609d34f70ce41bcde1b159f3c7eea29d3072fb4f151dc326aa7066720f17e6e954fadeb7802b9de34fd028a96021b64f86d657a5436485f3f2a3dadcaf6064efd70c91dfee66b8af15b10e8368fd281baba979510ade8f93f84ec866a538b26d84c8f5b649cd05fa7d09eeeddbf5414a83f20870a0e3ea41e46d6aaf9e6cfa3cf9e7cc03b199708e169b91f5021facd219233b3fa68caa0f047220bc3a26bc0c2542db2a3c16c76aa378d4ac8832311bc3f79c1f80a0fe64160c7b08acef0adbf3631288a39eeed611063b8fa64cb0da8cfed65ebf13d700e70d1f9df03dd26f50ad201538867c84557d7fde1326c2aeccd8f42c5f2fa01ffc066f4be6f13c377ae8c894bd1f9bf248cefd2d8076f25ea0322f7dc13a2589fb21beaa3a897ca2cf2b5d2edaa6ffecad1e6d424ed5f336478f6bd053b0dcbdd1f8fae8df6da48f407d99cd119cdf0a0ace0c42d12736e21cf0b1941ed834a98d86d9614bf6dee1ccd1f039f3c825dde5acfeba1a12d4a97d297335fa2187203ab79ed0f0ebde2d6a1cf27c0a45c5e67675c0d97f53000135229fd2a6428c2787879c8cf832a39a1eb7465f8e718322b3eccc5099d2d4667505d04cb754291a9a8310d9828ef4d0d9efac2de61433746220859ac8f2bc9346b694634004ec807a40be2454927d06e97e84ed70b8569ca3c6b2fc44e95354e5f739661cf39ce9b8a983c512233e1e54bf4c7724b0d2c38491a7f23e7452d6d7aed81b0de5ab974a2ae74806f859ddbef6d24cb5106c43accc03b4db037d2aed5908fd7c6bea50a1d8c60d263284714f258c635d2e19347a85a1b85fcc7e4b3f07e54d000cf7246b885c3b9f0068db82a9cf81b60578474cf066463a7de1ba8b19b8f604a200fac6608bb3e951e5668e219d67f833deb40467e18ef77e7ec71d285a43298739021ad318dceaafd38592826a25e9a0844d2d3b6f35e40f115875b28811ef819c0d457ef1c47ff249f05afc34ab3f519e82ecf17d8ca5007041e0fe87bf133149ec4e2a19a3850021edb257cdc3b95534a6d0f3466d517dffbc8c59a72b21baeba2e9041b1ac9fe9bb05d186fcb26f03d834f1c422cc13ac7aa7327de024646643d4e556640ca8df5406a15400f8aaf28926d8e3e152974d165b5dbade5fa25dd52cb5149f848bd95b4d28ef5d865691d5b177b4c5f911daeec8c359b3cff42c282d5bc14ec96a0d98cf7ae30e2d766b0977e4455e78987a135cafa50ed3fcee501f8d0bd20d02e9768d269a7966ff2a95c30bd738140885983a27b0d0e26d1cdda9b95c13a6a69e84a9699d28f85a6208fa5c74ea5ff635b62fd90afe4a8bba1361a54e641a3134188af0be73b65669758762922a8ad6a5f7a651dccb7de4b09d1920db2240d3a312f0517346aa700dbcfabb10b59bed9297c8ae6fc036f41d9079a0e8db4f73d910c8eb71a25488d755b6e069cb82a260bed7f0fb634a76ed647544c69d9bd85c143ca0a5cfebebde02e4d33d1a35b01159b895ee134b3f019053d9a8b89b4f24c7ce61204c778df83aad946886ac9b16fcc37eb4616b6a37c92c8a70a978b721bab81621e20a08e6772b1fdb5f76ecf3912e67c5d01a866f6201d4b700c4e89fd7aad63d56dfad0655024915d22288c7f55fcf6d11afbcfc74d50b5d35ac648db886d935185ac3f552c5a222db2d5b8c44fc549a3bdf16bd58a643f4ea6590f53a1744260056b5c7d3cce8dffbaa1f6c69f5eb6c3fd817b5356d9d2b24a6974d93c92811510297adb483f6950f8c7b208aa98143b5a94f8c903f27e7261126e8fcaba469c0bc341dfb7f4535272a02714f4215d56be2d2515acfaa705ca99318cdfc0cb7af3c5081a4d478dbc0467b4b6c4b89eda4662f643f90e9a30f185681b5cab363081918d2f85b303868cd0035fe2391c36f0fed615643c6ff1973c0a131f9a6a78b0787d0cb76fb2a1573d7cc8ab5a14e8ff2dc74fd61ed7f8510d363942368172ca551d62580b773daabaddac91362c840e6e84aaa239846a7abfebe46e2a10945c438df979c636f9a5b0ed6cf9a4284cbdd94a7dd558f730fa07082cc40c40987142898197c3d45187d5cdd463e346f7e7c70c833c4692dd0e9a16d1ed7277c8dd5d32524889c9db5aeb2b8494b7f070b06a1c30d0b238953673691f7a41602c3c49da52f3f941e74c063d9869908d068e6059a544a7080806132014b897a4290df9a7fd20bb8b352c6397ac18b161729cbda41cca2bfd66cbfa897edf3b3b15357bcc156e85614d702bd8d1bcd7787ccdad2ca5453cc0e8cc0b4c485211422ab754c5129e83f1ce8c54ed9da10518ff1237a039ac26215bfaad6a39b7824b8869f3544d3fc9134a76595b39b16e27a391ea0263e26caf34991fd1d1a19c7aea91f9f4d3b22b8b3b8df5843469f0d271453b0e0fabba5e65d0074876152b9c563a61ffa5d247c4089a9d573e58d407aff3301048f29b02a5638805403b94832d3cee2754c6315a38ffe8e9a282b0882453b84d274cb62ba182afbe3423640007369d36e5d45fc7648ed9f9ec935cbafbc813a7757eebef3b32c40f9012f308af88bf5ae6cff9952e3b2efd683b861cc9741233aecfe659e51adb73377742f80ff002be7152c2af49238480eadc92ffeeb505c50aae9c49b93f56aa808d808e2eaf10b812b8ec9e15c5b319ecb1e5904a760eda388402fbc9220a42b19969d685fc70cbc1118cda5ff8fdfe7267e71035affbe8fccd5c0782ee151c85851f2f58f07944c0a64c3205380eb4447e51d4da7d4bf2303b64d0f9d0e2e967053ca6d07a7a59f72d215ab0d92019d78e846f7ff34ccc73d8537058d83ddf7b0c4dbbd4a75b93739bc258016918dbc756fb2551212f12d33799760e7c6a2f02240c543415f68cd475bc11e957f28984a82ab07d2e2fcc6ce9b7007e2a8b8046d80d24517671fe9e144a64a5d18cac510378cdbfdba4997fec53aab0c6a79365f4d03ca7a18d23c7bca00d570a66298c6d2914a8a4a2c5dc031a55bbb48071084c57720dd478c36f491abf6eda297cac045dd8510e457ca922e8644fbdad929cb2b7b3d93c353af59df562658b628eda00ab42851bbcb5fac2a80dd1bc4633cafeb7517e4af96c7b4db9a09de190fe06999b981608ba20fd8826dbf16d22e97897fe1b5b88c5e0b1200c8cfebc0f45f588469e8f3ecc39e18968be355abea531c8dc2ddef56906cb22c872515c3f80e9bd307ce178ebf3826929bd501046e0138ef100e00173c6073d257c21e709ce041d0fef50ca31d3981ef971dfb25feb9ecd36a6cf85506d4ef45fb62825c8708b1498b49b5660bfb5f060be8711817b7eac58242f04844f7db9888297f4cfda23983441c2c57c38f7a5a4457f311fa0f7f240fc872159060711ca6326ebf8a64beec48a74d92447da9838570689959c212a184c7ef84139b10e00fd2bedf7010a6c797e14001d54f0a0c2d05ec9e5b7012004ad0c7a0443dc2b08387b6abda41a2c9565f616f961e74d81fa7c231596f7169c4601d5a53160401c775a24062732b34f8cc1fbc92a4540836daec76ec4e34e01fdac05c51337e27a01e86419f65e246d0a41686e870965417f3dd69f3183456cf2f74354b2a9d0fc1979bc83e0ce7d11b29c3a5e55b56082aaececbaf7270bc874d890278d96e57c009c918cc33280008fe1c1cdda9690f1b810b607036d304ca10c746c5bedf2731d0018e8c3a81aa057af747d73e12a8853b2a7a8d6067bac0c2127419edcca4d142b0540c89332bbdbd61af3f1ea198a373aa64224ae4a5c22ece7f4d37a54e470fe8d7ab168245504b3dd909a35a0b456b47ea7f1cfe3b99bf00bb1f34511c997abe9bd3286244fe69a9bd01ad734d07acfe82353e09b6ed5ac6c208bdafc003966f93168664225b06ea0e9c4c4d76eb4ba395210209455420fe40c5d631329b25ec8d11a3d7d237a32aa3e3b16afab6c6960ddf847ca0bac85e418d431002544afa422441ce08ba64b3efc4a5222746c5b40f8ef0ac41bf92f3465aa20df9f11c598247c8f1bde6e1430a2e5e28dc49dbeaad275a106d59855f5d4d56474e962046c418697f79c41a856eb63181714905b4bc38aaee78aa25776a8f598a54201f66aea02a02fa594b0df1359bea859dca4ec3c6e32cd9f0654894c6028baad9b4ca8a0d8a58920f7bec8ac267d9f10a6c8c59a2a33eaa9d349415e6152981c40e665064606adaa88c999d8f228dcab0c29d247304b8b88e5acd70edb07e2baaa25687424fd67b68270ff59eb75eddc68c9a15d242675cd8eafa7408bc9800934a00f24018a9e100f2fea844bd9601a81086aa8397b4b0db596891fae8cfc5a5904285acdcf0a3e7f32cf4d20a145f010fb4971e043e1e2021c7e29cce431bc9f35707390b49d41c8ceb06c7c10b2e61d552f26d4959bef7af0296cfa88f22a3106a0d05e4a531fc7fbb76531bfaecdfdefa035eac77704f575e505cda35e7b3bfbb9526a63ce01a01c21b9d090b27a9e0aea6aca0c07f334a152c82708dab98a6729e1a236fd24412bbfa2a227ca8a36be6e7a21443aa513426ba864508550de4c556ecb96512d5a8cecdd53fd64c1df0a7267699fa18bfa33442873652739cce98a0e0152cc10c0ead94fa10818832c0f8eca480b21be0a1b760b96f6c852a35e5173298540d7ccde21f27db0a5601b8d4b922eeb97f16d384affb184a7141c3e330f1ac2743eab1f15d7412e2161a154a88197aaee30e9c00388ba0b439f3dffa3a55b68665ecc1d24dcec3a9ee76fe5cfcb50dbf494afdab5cf7e304e013b37f470711704bae154ed4c254028be2abcfd832810ed9bd016f1ffacb0f63087f0872a8bce2d49b78fa1b16ced77c6721c8d2d64f9c07f80addc5daf7bf867471e9079161caae38ec0037a4151137a2ada173944aa77ef046124e2931c5acc28e3ab875e682d2f55bf30267c2e316bfb53d8af5f110a7052550c2a93dd781ee633dd15d92bf83fcd8e3b640d7b04e0e05c13fefb2b3024df06fa99e30e3a4de0750b7183bae00a033a4921f1bf08bfc68006b127364dfd9599103f5d487e42b336b53d71531c41e130e233a37a859c4a2b24f13c806ef031d098048052371c7cc4d2543f5df9831fdcf43f55ff2e6ae3fc31ab1e3d21caa159bd7418147f03e9f4acf34bdf2ec80e1171e7fff8d0c967d603ead937cd0d957810b10eaf395bf4465edb023f58db8403990d8811c8c38813c3cb1c03a40892908ed7d2e9c697b55c27ddd33c49d7d44ec66a7f65a1fd512d5b1a1b22dbfa92b19e6ab70b83f9bd7cdf59893d513066c9d4710f54b3abc7fe63adb8eca6d92fbd04c90b2fcdc7067e0919230241b42c81c2ec3de3521bf134725efce8b548841236e2798bf6b25cc6d40d1227949de0cfc20ec887e24c255865888b9c9daab4752b0642a26629b53bb7a9ea474eeac2581cb6e19c0036e826a9a81e1b39a7066848aed46ff1140f455d0ba27b6e92224fb196850edeea7edcdfd1101a55e4ef213f654e52238f95e722b28beed7808ad5e97035e313497124e328a31c902dcf6026a24ea6c59309c15a70369f22a9d43ea934e0ddc5ca31562d4393d89aca447c8e5dce3d7ef2861d3c9c047415a82205181d65701008034051b015a96534a1440d36ee3f187c341527623bd17bda2cf7e023de9256defbdb7dc52ca94640af306b306a5067f92d2bd689d70fdbdee0392bc173519708cfe117802e2e018f245a0b4e118f243a08c710cf91fd823c7900ffa800ee31852942253214a195c0906b1a1a812458b9d480e0a3535353535353535353535353535353535353535353535353535353535353535353535358e22d33e69cdacb6719df7017d21d1c9088594526aa1625a71c132b154582d5825560a8bc44261b96079c122b1505823d6094bc40ab15e3c2bc4fa5820d687e5b11e6479ac8ec5b1361618b23696c6b2ac1006cbb232168c1656c66aa98155830d1a4a10d93e69cdacb6719df7017d21d1c9088594526aa1626279d1c16c54b3e562c5a4d2a2445f3cb862435db0520a0965740286261b5f9d88421f2884a1225735d623e8e375305a5aacb231d665e3eddf5a6a28a984abdbdfdbaa061b522eec6a2d980d94abb590f8e48b9a0da4ab82848ff90694ab6d5ae7edd0284538d0145f5fc601c273e5f387ce774a2965de6ca8a494564a29a594524a29a5953e2d427fa394fe1c9906caa574738d81e3165186ebdae79885e72ab92c49faf4da79c15c2c4be813926b4d70a44ff69fb8e3b528172a762d8b913e315f1412d48ba5854a72ad6529e252744386265c372d06320c6921ba6917ae3e5917af6b3f467b8e82a61c7482a61cf3a3467ca2e8f537d77ecacc143efb7cf9c8185e975ef1c54a14bd6c50ae7ee920d73eeaa6756166eac56ae68aa81d944b64695d2074ac08b1f29c9aa04987c9458fa3ec9b9e53de10be0c34f5d307f223553f0381fc48cd7fb17218533fcb0b1a8731756872c07c17dfef8225f441bf86a6ee064be08316e5b259ceb54f5d8c2a3cf844144beb5a11e5eaa187bc2c3946ae6539726d0b0dc7b0ff99c1e7a275edb3a86668d2515319cb8c0f17ef221422a5230b59548eb25f431731475947895eec28d1abb3b9629df9a186cbafe262227a4d51c4232387c6c6042570993af33ff4b0cf856ea84d16866cfe478a82a11c47d9098646910a0c35e99315c97883a219d190559f4e4eb86fd04532a12622954866342a5dd0eb65edfd1a14b96c469bd08d28c751f66718bab1c16d9acacad8e4894d6b22aeb5c127b2f45c2b72f50bf7f645379ef79cecae018a8727eac5d1eeb543bd1814925ab3cc5a4ddb36337003681243001537809eaef3bccf078404e4c5a05e48765049503c0ce31876a74ff63f2f06f50a755e135fe8435e0c8a0700397d02c012fa64455e0c2a499fac07445a834fe3b18d28589fec16a278f864d489b6ed354dd33494121ea7abfd89878aa53c37ea485e0c8a09487a92178352d2279b922253b4efab8522042e8aa74f1685444ae95048bc18948b63d817e538cc0c4539a2718a4647d9ff91a2a10ffa59382347f633f4313f0b5d1c65bf53f289285749a5c58b989454544a3c120036b0162519e3cd917e6971ed8b60221e47e1107d54f08932501444712ea573e82386e06ea909724ac64dbffcb8f6779071e33032568eb2bfc9b891b1927163e37465ac867c3256d7be0b1a1736fd22cab8b9f62dca25e3a65f4419a30c2bbae953f72817d3d8debe98e9170fed16be506de3d5c2f617323d2c4dfa657bfb2f4437fd72baf639ee1027454c387084454ed773a21a52030c8b9b6b5fc4e33033655ffa6a33c2312c0a49bf389057bfa0ecc0fae59304c5d32fa3b78f52d22f2dc3801ffa64eda780224ac9b54f024554ecda4701c590cdb53f02c5d078ed9f8062c875ed772010d203453740cc1b42b940a01892d1422ed18c8b9418434d1ac6a6ec732da6c1d77ec8c66138f55ae55c2b92695db1ce7c4231d4bad6e68aa1996b53600e5323d4d32f22229fe5f962d7f67cb18f47f4ea24b16b45eef579c167fa95efef6af40f411c61e25239d284e5a2579d59c5607588b595d579af6966d0ba574c2d3ff44bf7f67bf48bf7f683e8977efb3e60a086b5a30efaa6674fc7fc9550c6890d442141bdfa64356d7b6d09d3db807281755589d05c0ba25c200a499fec9b40d4ab0d609f3d1c75c65175e6da17bdec736d37d1ebda376d9bf6a2977dd18e7d11ccfec98cfd1322f64549ec8b15936b453dd79ea8ae3d1972ad88e7dadfb417ab7e11a5ea0511aba15cd7a25c1a88725994cb75d2348ab0c2c7294ed19f2f6e36fc5b8b796b6d3675b3b995c63aaada5b9fb262b7d670ac3832af5bb7d6ad95d2dcfaddea35a6aadc0a074811f56d26b7d6d82ff5eb6ff53797b9e2f6c476e456a72ba63156de5c738823cc4095d2421fd95399051123a9ff916afb3334e598f527adc2277bfcd0a77ecee926804fad50b23e50e2fb4135a3c34645b71b9162889442e64af9039a2be5068461a44cc99f11be0b1f2141ebf2c6c4e7ff1cba7c289a4ffc2e4b0e35269fdca6f8d8d5938ad39463cbc15947cd2e64b2c1383239261dce75a110dbf773aa47dbae4f5f7a36bc2132dd085dfaa14b77684fed573034dda06f9fbe0d3fd077477dc691c909dd0a328e8ccca5e00fa1af8fe0f201b38a92c8a55a0525c8a9faa5af4aa65fb497afbd4ac5439fe85b9af3816289aaf8e013a58aa7ae68abaaea0cd3a897864ee4d8fcb76eef6f0cd076944a2533d32f5ceb89865181310e91560e4b16b9d4561ee8e36091915c6a1da6658988bd9858a16e7256a0ba99b9b9d918c706aedb017b3900baf2db6f8c58c951e954adc0e4f24bcf6b7d59ab3fed7047d7f9d25f863bfaa594f2bb0c2ab0813121a928eccec9931d65e40281b6a8b891e2ca67ee1729a2ae7c8d61982528c5d09595999929111a7eb0d5e246a43614168176e188806417172070db738bc82eed0a1f7d6e33719cedea7f3314d030d666f4c4add545c5155d6eb529e20b5744c0ad9cb6c5f0c018b3c9dfb6b777b3dbe83c994e2969b7996e5cce75b7adbb8f2882afd13253d539a680c9f7f5cb9cadbb44cef540e98a41a854aadba3742567fed29bcf9f65e10effbe7cb34b7f7e0d290d77f8fbdd317d5a223c35449672a203aa51a5521199192285036e213b9e9d94b552afa28716786107054988010eb270180461021135c81568109e2cac988234427293192448769085235849a49c958223640a84d417542288308d2084fee95bbe16c1cd3431439f06e981160489194a29a54192a0419600d244a440c56d595cff51a9bb8c8382252848b223256b2139ddfd441d405335cb42cb3156eece040e881c18881cfaeae854bf940ea029596bed97ca32641f81773f512d584ff669bb7ffdb2c39f933080935c9f724ea79c16fb78bafcdaafc039a7be2de4ecb7b053f2d9dfc02c07f736f47172949763fb2cf4f1ed3d8053d3d6a7df2c53dc94cd2eb37b0a8efbec6b60a67d16fa286912d8de863e366bc4d7cf631b65bfec9029f67aa0532e99b2aba655400b930174070b5c1ffde95b6b5df3f6ae39dcec496589e783f1e3e0d1658675e11e8d921df87074bbb8b8b87c3e2785e27fc5e3d2773b6acbc4e7a32b5f301e1c6dbb7bdad145d6307cfde2c7f4f35a06cef64b77b777ad5d6e766e2f47bbc931f869bd5cd6557a39db655a67b74ee3ba8deb3aceb3d13fb98fe418fc97ebee17c72df36467d3d962eb8b592667f55932c2503014178adb3bf038dd5d26407a378fd7daef2b95a4749931634c00f785e2ca1f4430024321b3ca23bf88aade0ebec38f2230147752397bb84e72ccbd314f8dda2b76774fe95977adcc19b59379f3f8c4ffddbdb58bf63277dca6791f6d88c98e83822b9426012ee3a0a0c8155dc619a2ba69b0a0ae5f3e30ef8e9fa91f1c25bfc7071e1caf1aa0c8e374c08f248c5042e7260936602549cdd0c5512e7079c1154b485cf1e4822bce68c115f975c41599e74a165c0f9c404706415ed0c40f50e044ae0660af300ce11192849c145391841494f4408a2df4a088078ae0d242121ffca0092c52f26b388c054c40c4084e112b2862488a033438830e9870c40a603085940356108418188ae042196e52f27f701804e4e08a3118a1043a70214949d5add1730c31404248ec328e10d555c2659c1314b9df729a43ae7c9c1aec5c19f6e80bb29ecb3b4351fe7cff70877cbf7ce97d0fbfd20ef9f3ee903f92322cf5a9b9f04581e362488df3d2f0498ef38a7cfdfd72013eae587770805f94dab30587b0efe34708ac9885a2bd99b5f681fc48d910c8f65cc82f9f2f3f8e5bc3cd8641ec03d1346b5f632096ed03d1c2cf51fc406c5872943b027c2e71e20d20dfdd5d06c798de11f1c9175beeaf78589addfdbaee17e795d3c3d23799a9131c779bd906ce0ccd0dc0651c1370e17ebf88fdfddea36f9defe18efafe1d863be6f7f790b7e7d339c39e487ce2776fb44aa5525dff6ed950e8b7ce9c4def41ddc15aebd750a49ff90b4b69e85e43cbcccc7d7ad1e79c4aba39ad9d5daa4667d1dcd2a5a400e70ec3eca138dfc10fcc3b4366678ec105a8e20a551456f45c8ec20a9e2bdadb56ec5c8ec28a255c71466105cef52e4761859113082ee3fca009688a8f5ec631a2baf20403c34c6b7d9e39be54a574864bd4af5c7b163810143ef91ce24a5688620533b8a51518181012be1df327c8ef5e0f9204f7c7e518537d96d1b267501c418e56a5ec6b2011335299e986b4b9347caee28ee0d61047f67c737c29fb627dd38dedd69003a04bc325ec7315d7e57a31fc355c942aa9ba16cc40389f7c791d358920c76fd9fd044e23428b5dffbcfccb4c03e58469885ebe8c318dd0cbef9169782fdf574ce37b097a496bcdedcfa4176ebfd584dcfecdaf5061e276d8d3d128b809f5085953b19015e9278610c29d80a3178127cf712150f41ce75d0814bd07869ea328e088d6cc6a1bd765dd079cd25fd65cff7ee2fabb90ebef575cffc9c47594ea0faedc28aebfc9be588fb8fea1ff802ada8b150bd7ff03b610b322d75feb3e60897bd10e713da78ee2137d4561b2d2f88a742d0f123ed2ed5cc2d4140534aa5b3ca1574ea4612a8b66561ad66caa60b16c00bb814abec0880d5436b8416122860412267298d8617141cf1123b1cbcf36b49b5df088cf92cf92cf92cf92cf92cf92cf92cf92cf92cf92cf12f92dbe1c3f776e6f1c17ac6eabdc6e908b16a1e969efa63bd3599c4cc3c534506e7fd7a3db2bb779506d286acfa0a6696cab740af6a00c32d235700635711974d3276902ae8b6232b3656666666666666666ee3a72dc141ff3305d01dd35fa248bf87a4e9ffef4fd7750f78f840489c8c75f6d6767b8293e7f1e7450408d3e3115dc0dd20666b62d306858c1eced0b8d6573c1ad74264fe5d30254fa529843244addfd64343a41119142295f09d4e2a3e299ba15cec5c6a2bdb09f8135a430668bd7d036c81b3a66bee1f4419982ffb8b466563bfd2c91a1b4719df7017d21d1c9088594523af196b02aa615172c2f1e0c61b4d460c30d277a391400022080930d314e1f9bbd7cb7f1c3ab08e674c966ac36b709b6dccd6a588c2c38c40f9451f4d20ea0f8e56ce8cbdd7083b7e4d3e933c3c931e8f3f4f762aa0e6064b2e72fb5bc16e414e79dbde1726ec3e5660db7e56a608571b92cbc9c052fa7fde5b61797e3582ed7b9b89cb772b90f88fb5a5c2e54ba9c28e57227231b32a36c102828a3cb91524a2dbecba9802e67fa5c6ec5bb9c0b8e85bbdc8b0743182df47235dcd0599053a8d3e9e321738cf9cc31b4ba98c8bfcc38cc9640f49877099549874cd197291ace7429fa267f794d3740d71f749708010dada3d8dd5d0c1cb78853b6910e42cb1c8943871e93044802d390a18781762c45ff7df7f679d2700c1ad4b7f6fb4a25233c4632cf390945e127f4422f147ea1e7780e17f31ccfb9f53da351f8e8cf9ee9999ee9999ef19169743ffafa0e05bf4c17f0a97efd36e230a3d063ffa20d450178214d8ab5a4ef4329956a174e9a26cd63bfd237cfadaf6bd281327a94e71487020a51029427bd0f12e949a110241f284f0a3d1c2828e00f274cb6eb537d8fc5dc69e4cdcd8dbc09a2a7a7a7a7a74707ce61b4ac64bfd29faee834b73e49c8273a8dc77aa66acecc95d3e0303a09f189cd436353df6fea7babbe1bf171da7cfaa406f7743950adb5566bad65c178821d7b84901670577eb5f2bf25941829cd153b9856fe278d502209dd95ef4804f95cf9cdd67e9f0541368295ff95842471adb5d666a10dd9089fbc34e4198a9f871d8a2fb2567ea4e0567e45ca2f79775e03ee9bbee99bd6cb7ffbf96e05bfcc207c9a71982d7498a332ab09400057f496676df77d5ca93473670ebeacfa8cc4210bdd4fc0346ae81ece99287cfe6eedf7954aff3daf3b7b72727272727272248da491349246d260c06a9f2d655fe90cab7db694d519f6b3a1f895be86e29384c078623d533567bcf52335df478799a9f99ee3309c9aef2e8779310d793b3048799238787823dc010052209162045c19bdd2d28537786aa1a5c2274ff3e4c2235f9163aa690407440fcbe9e0305d6b48a1f0dd1a9dbd0fdb738ad62d14627bad6ab55a6d0b1fcdecd7681b33944a30143e79efe64b386ee170f880bd19372fbb7ca8832440fdfa2a4c43860be018f55d3a6e038140cfdaeefbb85269fbaf550b837054122794fc49917c34ac59943c07704aabff750cac10f575e89796ab141c110371fc326c7f96efd24190922b198604c71176216086005c5a984169e5d75d9fbac51fb77f82d26563c16665450c5c51ab1fd1b307c4f79a06b21644aac207fab741bf475f5008fa1a6d43d05390057dfd62bf0bc5d0732150f8d586b34f64f8e4d7358ce8ed7f16f43c4af77bfb20b00536979b5cc62112bbd2038140ed2d486f08fcac7deaf550af7d4e04ca889e884f894227ecab7cff79cef3623edde7f3f93edff328d5e45cc68101ebba5cc66175e1725af7817ca9f785de8d0a7a0b7e40937d69b26197b25e151ff7e9bb0e04cafb7d1ff801ad36977ca2bde2e779749c8cf91ee47de6071cd16bc3ae4f5c57f089b6b375545ae917d073ddf7dc179a74e0fb7d0e7cbfd014fa1da18a123ed38defed7f21f7e97bfba1dffec70585c0cf7bf63e20f0c7fd803cbaeb71af819cfd4c5a6bc3da750785f7b49d651ce5b8063b8f52afd3b86ccb349b754b274861f8fe9b1e3884f79faef33e9ee77dd7bdd7759e3765e68c99fd8323c5e6047da0549b53d326b8cdb965df6d0268b9167467c8519ca00b97bd1ba0eb5bf8d0e013bfebef0e81d6a8aa6a0f63aa5ffd75d8f750082772f4fb0ba1854ee4a03a5c08fb9a7d0f3f213a34e5706b439b92a62cab73ceb9b29a4478ee9c73ce99553a9a33a0a6699afe39faddbf7df46fe1c7720b6dc743a3b8906e9c63e70cdd7f178a3cc4fe4ddbde7e0ddf6ef49596bb50ec3a50ecef7e82e2d603ff73a0f9ef6e2fd77dada0c8a3c7651edd6ddb281b8afc3df473b8a345fb79198a3f2ed74defe77b60f732ecd177beb6837bbe1c7b3970bf75dded40cffd323f20f7c9e3f740fbf3d6f00ddc713550b4218f1eb7ff07079c87b7c75dd30c6ff4f3b317c336dc11eec3f3e1f9f07ca2f868a17bc77c3ae712aebcf2e228b1732b03184789272e5fbe9c6ceecf8a3d430b54dc223633334f99190e658f92584f121892176c09394f8c459a9f43b9aad1a36e763c4a5c675dd148950fb9bdaa54fc01bc170b806a11badac7699871f8fe9a0d899f9499e99333f1b9b7bb74da730738ac9dd2c8b263f0e3184f5c710587d5c4154b2b25a621e54522631e8261b49047c844c8953206a33d7f38a3677ccbdbef766106b80c5f556160079f38838786b1ee34467b62da962ce80305fae45cc8c316ce709433126d860e34e636b5888f0f9af9e3033ae7a4a53967578186cf0ccc9e71f539e9e73e7de43eab18d2d0d6d9b9c4cc6990df9cccd6dfc7d55220bb33a759504a29a594725de89a789356299bd42c96310df9767377db7d231ea31148cb365abb963d8298ac7377e60884bc1ae268e292dece755276a1a391ed73d26cfa0b87e5b80cd4eecd6ebddcec32905e8e7619382f57bb0c74b0eff4b2fa016d9fec33a735b3aee1c0710697d5b46d034fdabf269f378e52db7d231e238eebb43a3d2b7db6f38088f1a71ea5d4edcb5a7344e00c2eaf86dedcc2c7c5b54fda2f6f87a28f2b434ea27ebaeb30b609e5c1c676a72d03a85f3811bfcbe85243e4305dc7794c83472d23db7da4136f871da3912884e2011133df5aa73ef92a00d421c64fbcee43227940c46c9fa59cfeb35badf541de0e16109fa3a0dff64f01a00e7db2618d2c3e495bf29c1f7a3fdeec17afe3d82be23f7c4e9903474169c2275f253335abd91f6459966535cb6aad21c8ac8d71d750b3318a842138ba699b5684412037e246dc7944b76ee0bb59336afbc06d3ed5efe71bf3669ab68486d22905b3bb695209d94cbf747195cf300d19bad41caf4f70b771983a7a107ea9ae258cc5edafa3bbfaa5f2f4e909fc52fb352ee1225c46098161b2ec08d9ca075fbf1cc69bc05ec5edd775d0fc9cebae16eb57791cc6ab3b4fbf78e64ebbba8461b28a85b744a9a465555ad07a4b3018a64b3752a5f8e467363acccccccccc3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a0cc08299999999b905ad76eb3e1f184e7ff97cf97cf97cf97cf97cf97cf97c99bccf271a9142182f9f2f9f2f9f2f9f2f9f2f9faf9311a9a412c298fef2f9f2f9f2f9f2f9f2f92ab530b90861bc7cbe7cbe7cbe7cbe565cbc08614c7ff97cf97cf97cbdf8f0e5f3e5737b81e1f497cfed15c278c1d0bc1d1ab08494a31f4172fba78b1ec9669679cb6c74a75389db5fa74d3627116d6a9ab7d4e6aa56984da2c59274b3ebbc6507dbb65657e4c8edf7c60fa8489fba050a35911c64bb2a073973fb47328c325150bc258a87ae6a396c355af18933464af1596ddbf44db7da488f9d131b735c2f98b754ed52a9542a55bf603cb156abd56a49573d739f68348af5b4aa6756638eeb051bc7711cc7d56ab55aad1cd66a9b56abd56add74ab8d541a8bc562b1711cc771b55aad56ad56abd56a8546a4d2c92873a44bbe603ce3388ee36ab55aad560e8bc160b09e56f54cafe8388ee338ae56abd56ae530879152447765696c6e64cb87711cc7715c8dabd56ab592392ef9824d1fc7711cc7d56ab55aad541e0cf9c03c9a54b9c44647ad4ea7ff52e9fb248db49137b2d5721cc77174f1b9d819df58caa1a7d37fa9f47dd65a9e2f567ad5170b67acce189db139633e632fba8f159f8d8b78eae668536af394da9cbc4b5d577cf23fcedee70a8d014db8cfce67c7e5324caec658dbb86c26ba880c93ab31d636b4663583ade418fbec7c765c182657e3a4936172c5ddedd2a2cb67a7bbf907734ec94ee4b20fa972ce2927656b3fd00c72d92d8c076194cddc83f0897f7a572673ce29fa8afd6bb45b251ce833d4a97fa698734e677a7df887099e43caa561bba6a44970386cc1dddddd65134873dea024dddddddd9dfa0a369540bad4b3ccdd33b085fa55b88016a62baba44a29f5f93ba7242e4a66783652ae8734c644891cd6a9c9bb8d2b91d9c4421ca3bf20fa698f145f7590f4a36dd0cc663970d8b86c946898dac4cd04beee466b3941727d964472aaea9d9d2449be66c2a44993af61245fb980e3165193334c0349c37c3ba524afe43423e5ce90c2fad4492a911975884b9367525a39910e9d41a8144d190541c9d08c00000000005316002020140c884402711c46324dcdd50e14000a6f9042644a4e9586225914a5380ec218830c4086100000010a3043435305026c01195919559961e84709ae71f207404989004de3f761cfe64843cec11aad3e2add46b09e13cc1b6177fae3c7d5fa8cea620fed500ffff8d7c974be2b6ad83c6746809aa7d70a3c6264ff140154ba663a44a6c7b5d5dfa3b870400a548f8533aa90260a5faab8639208f12754242f3eadc6fcf6547e7c11fb390e33617ecb6cb6999ec97745aeb920b890f85736623b4ae7a9181b8b59c6e879a7431d5057132076906d4b3036182cdd8ec505ab885f389f744d4b43f62f2147cff92ed5c05c053268f1196c4fc37fc48d765b31b0a2da2308b79270d369247c0d68cf97ff37ad36203ddb74a7791dec1a8eae15c4cccbd86f6a1b77f22da643936806e1f18febbbecafb1797a8da5fed9f8d8968b3ab5f25141ff22b9223c0a6106444931120e1ed7a3d5f3dc12bbf19592de97d1a1ff93facc217d16f0ef8dbad1f54a202b93c5273bc8df5cdf29013f64a737901fc3ab31475ba73ec09dd0151426b74a05e0e8551cc03cffbf2570ada71fee9f012c1259fd8385f5ff57221f4b3d4bfe724a28be0b3b248d04ae23c453221154490edf4581f46afecb8b35b05a5d522e2860b1857938f37a11e28fb36f07adb548a0998da104b4865dce8c719dc1b0cc241a2a1d41596202c9a65a3c191810dd979f9a0bd34f215500c9ee763a419735d62a010aafa96ea1ce49b54f976aa11b4f125eaa946bb60fc676181b9b0ebe4168605d60d4b4194b53fed1948802e14d50002514f7295e14331a3b36a552e01ccb128a90507f99aac4468500cecbaca1855dd9fa365391620ac22e221260d958227279969162cdd7f828cfb58f667a5e5141e76e6e44bd6b92affc224f38f4a36d3b5bd3d6c3745300e02e46d16aded3fb1ff08133b85676088d0f9844e46e5f409ab3c92dfa05df49684f6b5989c6c894c2a0814f07311db2489c6ea13507d3d9471fee964e512cb3c7e9bc827f62e3d2b86d16a12fe2786220d905016c306aa4940d328ade316cc05fc37e370a3d7c102b8232afb6d200bfbcc8478125b170f02484354f9af875097272abf2679d604bc161f6afa537a154d806b6e4821a111451132a8b9933b1ba0d29c1da8086618ff201d71479a7e30fb55cd15b00dea0baaf878f2ea98dd1a8a6f3d40cffb0704a50fa078b9105909f426b6e0a9a382a1799c22de112de3fb442c7320fa2ffc166b59632f3e813cda97d649d1c7750935bada07ab9d8cbdcf598529631b555af6029753cb353d80ba288c70be4166f93f2f9aa906603accd263b702c3e0873ad07f7d7a56a85486475ea11ebf24fcf7e904c9d3aa5e5c7045bc0fe99d0f2a8790c2e47a524212af8f00e7e73a8d3bd8c10f865537d521ac3be5bcc1183d2b1561e0b18ba7b84ba7725be669893d5196d0d108bac3e18ba2b0e5028e50d22c017c9e3087ac2186265a6f981efc2425fb41862275f71eaae00f258507ea9bf8827f86812fc74d9592816c2144e9d422cfc5942619127803c67523374c894a6216d048edab0cfe56e00bcafc2b91bcfe1f2a5cb6742c640951e2184e92ca03c6d2dd88ced9c7526a1d9a32a1cf437e585ac9f39e81231d3e31a2958db157eaadcd3477f7ad0ac24a32912bb689c1a10392ca5bef34d85811bb86f75e88e3a41814014b14953fa5f3986c0ef6a8ea4968e67f6bd861d9d8c1b729f0b3663c0e04daa2ba153800cb569da86424bb057c7a76739a153b868aac1989346ecf63aa0abacea75b6ecda71d63c4427b0e1413ed81538a2df69fb6e92cf96d399ba87240ea14fa34358ef66dbe2103c383ca26595a7f7e11d4a7458d2b416cbd6d06a2a2ac1a05f924ad1c8cbf88ce1034d939386c6e4707a8d94d465bc5b33394a0f34504e8c0c7439b6310371c31bf452032b23608f60840e89b84eebd49c82c1589de69f72ced1883f1337370da771826dca3111e39583d56b940e424470fa54cea4d32924c9a10b0aeb52976e27bc59f6c40b2952665eb225ce0c107b2d99fac2184e2da28c9662692e717b390ed08194350357af18ad6d78dfb6246ed8ae977b87c7ab6ebebe5a6f5bb7b72fa3ec6c8d9e0a7f68f361c4e8c9134896fd88bd5a1555ca4d9b11babaf85d3ca6c1134cd02ecb37ec21901e21af03a8734e84051228128b0e91acf25f11c98efe536b062a46cd80243ce18cc209ff6cfe0e2cf0cafb0e15a09153b78358783872b92d0db6d5d20da692a36d4fec52dca4339fda28c6913a3548a8d49fb0d4d4feff1092057109d821d72731116be3719261c6346ea7d86c80e720455f38a5e0acc2a37a5e3394a61b8bc8892bb5a4e09d83c828f8fe1970780064e5d228d2153d456013c17d889d106514427968fb18385761de9b4848baeee496691118d9e2306f820751955bc9587caab796b90d1f4e6721dbca446b845c916fb0bb8a28f90252a679e87bc0e08d06eba0784f38195667c2db8aeaf48e2a370f813a292248194e30d0dcfd018d2cc7ce0c5d179c5706c95cdda04d40dc5ba5391d7e0547cf8511c0165ce2498e1dd8941bd93d2588bfac322765d513a901c9873f8cc5007a12f915faacf20f399fc4d880163a748d9038e362abc338e9e88e2be2ab06606110dc5b0920ad719330eedfc4ae9420b77d4a00e8ba318d3731e104f2d99f6858f870852889a69a22336294554ce447873d98edf374e3fc3029912b690670c1ac006626dc03bb97d7a8955a3bda8792435eb603a067454bcd27e1ef306a6c9ef57a8c19299060fe556c919da83441005026d5abb8f4383846bb31b6eca406fa8c6d56260d3e7dd47c52bffbfeb389258426582b4050034186561a0164f09e26812d999a1d2b958b32bdd7e7e8ea522cee4985c48f16d9c94dca0129800a9df5166a46c19f09c89d64c6e01449a56bd99828ec866356af519fd09d1929685cb4968a13b0b11d02a0c742339c2583d221ca27a691a2d27a0602da4a090559835060f0b44e1cae2057d214a14e0d044193ad175f62aa63e1105ad03c52718a7109f75d600c6586b3d40a0824c91a51fe19484dcb069a8c1d9b37837041e19e127fed40112f543fa7355e6e7e184c28e1645593823aa916a08e014c4e893464d668d00fe2a0b92040e3917d325ed3bbabd7c2e9c81b1db47a2826cbc90b8375b6a6939a70cb822cfd519d541c2a236760ac721479071459085b4d5229ea5a5a0008947bc37182a30f85e5c746d72583057683d3b7d0f0c5bc2870b771005bfa56102284ca08198aa5bc407661c3d58926fc36103f2b26aff3153aa0d66bc387f95d8e39348335af97cd7c91e3134f846dcc6ed3ca3b494aed220351601da5538b195cc0dca379cddcc22ce8e8d66302bb48ea06e623190f8739d0ec82d056707cc5531d766210a80c3ffe797eb92314a62725ac5ffd8a2d8ae4572d80c5a409c8ddb71c886109e0514e3224e49560f0fd2cc7e4788ef6870a6f9942051c241823c784c4311ccaceb269627262bee08c4dfecbec329412009d609fa40ef046c2136d9da0cf6bd9138a32fcff0b9788f5a9d922b0402edc3fcd07373caefe86dfa1e40755e88d2f3664c346237e6bf0f1430e66ba020b8ee49f2ad9a42e1deec5d5964c23d85e297063ed96eb475a54a714a31b715d96e32be97af52fe524fb5b631ef4ebbcf64d090deba3712837184f1c29378ebb0ff18fee91a080b7a0c85842d1aeabfd370a75ec78ef617276c468e6556b980e489855fea488cb64fe9a1486ee9dc1aa69ba3593dca1f6fa28b885d08a8ec9fa5765ccc1b844a0d07d94df4e616c0c1adc3f9e93cac7c6e44887cd7f6216e76d988ec47e3b2af03cc4f62d49be9d68bd138de02c5c7bbe06fe6088f883474b744dc6b03fcf32f1639e882632eef553fc39f390dd7b2dd82355cd344be197c9185ec91f72266f7c851b5c424798a0689046ca3efc0c08924ab232c5280a1f04e52e03b0b4dd66a6981155422109eed0bfed05016d69f03d04b07e19c1a8cf75cee1e2905cc52f839e896bd1203889a81654809ba990e10bbba15c6288f9153297f9b7c90b1d97c7a697cad120b03466e4acdb3836487a5bc18e034a37be4226a0182837fa5e933b1fe3e8c6102dad59c54c0be2d992d1b015786505c4f3d75972951b195808a71780623b230a222723d48ef3d42c00a136108fa7309d0f08789205ec12dc6290cac28c8028635b69b347302b9758a0571c66b89903cb37f710f4461ef886f7aa7ad3d8a0fa730c48fd732cac5eb0c53fa383ea4d6383eacf312ef5fe2dbeaade3436a8fe1cc352efa5e2cf6820f5cfb1aa7a7d9b5f557f8e41a977cdf9371a48fdd7f4aa3d03df5fe2c8eb3653c9fa6ee44072ee8ef86b4d03c0c1c41a739343026ef690e1e638b4bc99c3206e140e88e5c4bc3634a1c2f7808da6fa49f9004ddfc237c51e28de4188dd5fb8f6af5f72a6bb021db7b3e26d65ba2bd0713b2bde56a6bb02487dd34e51956bbd6a231afffaf597dce85660c7d74c7c5b8d6e05767ccdc4b7d5e85690ab8fda37dd564fe0526588ef0062f72f9cfdeb2f99e9aec08eedacf8b698ee0a62f9547bb3db4ab4c46ffffa2567ba2bd0713b2bde56a6bb02a995964ab7956ea960e63b80d8fd0b67fffa4b66ba2bc8b4ab9525b8f9ed5f3f97992b2d04fd9eeab22fd56d2844aaf9ad9ab85af71f88a326be29490bee531bda707d2874fdb43c903b5d25ce04d8aff7190c3861c6e4d64f10ac284cd8bd7840438d873f8ef9a71bd292eb6cc25118a932df2f531e21dd0bf3cbd8e6a42623528d9db16782082ea248c264f338429a25aa4d83f9d951d935b2f3d4b284ca1a6f2ec874cecf149ad1e44cd4092976f841292650206985130e962b8a9e8dde628be801855a3f0ec535490c692db3ae536eafc5fa9a05ce8b3ea255e729c5e67e5cc806b65292857f1d3caf014a5da0f9b86cd97180f77957a313f12d89b69ea6012b41939665d163dc971338ccb747ec9535dd27205364b723c6973d7f347792bb33f18effce7236a8376cc88ad3f99ecabb341f89ea77326336806ef4864ff48769425063a0262b05d9f6c90666f0351517a0803d9b5578913d0b4c81493963891202b38480a347fc3fd77efe9f01a087a4d5f12ef5655bcfe6dd3420fb73fa5085500c7752ce20ee00d841f01b386876bb8e60186fd07ad453b17cd785a9387900cc298c6b6f915168a5ae3c1349404da70c402eeac71e59ce1236edd5f7c2775c29dd01be3a4bc925229afd8729ff3ad09d72f131c804b61e96e176fdc5202154badd846d5ac28a529eed6478c43cf1eacfa217560fb3e261ee73dbbdae769ad28254d9dbbe971ee8d0741f06b8a7404c635fb6b9bbf4e8772d33bdd7cd69fc5fbc4052f0082eb07516b3777570cbe520fe2e2690c24001d97ef2ac8ac8916bd80e8d39ba131129be6d3f773990ff8b09bc3811c02e8a43fe55c952e4496ac301fc2d07cbb749c8f3c350d56175c63009ead850c12befda9b221497d4078df3225ff991c1cb555fe84b7ecc54d784ace619490237aa95ca36e9583362f44585bb3299aaa5f548ca076521b5dbd3147ce67fb340a5f16097edcf450428ba40cbcdbfabc35f7e02daffe844f558ddf19b83579023eac50ab2abef8e42a090a96fd7ba42b2b0a0c385b306433d960d577844a73faac0710f2966261d67a6871b37017d28a80e75e2e8e506756f6a08f182153bdaae5e720f9b259177aa4b7b2293449fdcba43a7ce1dfc811613eadd0a6c47d3e7c0af9c08a951a70bcc842fe224f36feac0eced5a9c7276a03f8b16b0c80be65e71b0b7097b308659972161e4af00575668b62ae9be5aa8f2a6f0cad2611e14497596e4a3c5f1f7ca4542a12e170daeeed9ab31cf3aad7aaf36435079efac384f9bcfe1a102a8f657fd078ed7d868ad17aa32d4228f007aa4509e199045314e3d882da4da7f568a82d4b17754152b5a7df48e7d99d8238f4e9d76a9ba3f8b10588a90a516537b4bd56490fe01006617b4e8f173be1604b5d7cb9e8847b9731daa91dfba1dc77af36679a9a2862e40b859be95103a9b10259c2ad14a45f1bf1feb5ba77192abbdf1d99ce21f6bb1b24d5287e9fea8f1b155caf0f7e2d2dba505fb3cc4273c183f2360a619938775349847b8fc165919495263398fb07935e2838c26af087512d3334c69530ce2c824998aba9f7099718d3e6750035f8514ea9c06092a0c3b59a64c66d69adfadbd32b6fc5ebfaebb71b93a4cf133c000b9fecb366d5d8e7b7fca4d191df483e6d90124d9818ab6d1162db745bed96e8ee8cfe6ee3387b147b6708a394b4500ac970904ec6df7954cdbb9e465db56874685358aab3ae36875d66ff2dd408e665c56379c51a14242aa770de6850ed09ad638c2dc24ea28d83917702339d2b83999e5cdeeded40f994235806c4415406af19752d424b0bfe3d426a3e4fb166ab81b37daa4ad78bc0dac0c77a40743a1370970513906bbb5092a82169c9df57c8b10fd3c91e5a2a15d1efc0d98f2c3fe16c98143eb864567924451ed511e0109cc85c10907e50101f48e05bc8c5b7099ba01c774dd5fdad8242c7c6a1ba476fafc096d9033bd33530a403811d72d982e90e4d7a0679e63b84b0bd491969aaa099c1ee0cd0feda7d3c63589370b9157bc7188dd215b7f382a09d2e49c2f2ab8606d726a9381fe0beebcb80e5bf00081b9e0e3b68d93d0b67beefff6d0d435e15c352e31690b53e1175e381a0553e73f2f28a70a3af50ea85df0bca49dc6b5dd22ad1558590435841a8a305ef12b0e68b1636eebbca677d243cd2bc09682a5007773086b2b72fbd24b314c3b7aa92ef7f00f3ad1980fee3c0c1c02f037f59f4d8e80117d97fc4cc9b8311d1b672f00e59be83fcd89238d0a1d0911d51a49d5aa650564e3c7302749288751724ca7c6109c27fd8f24663682938dd9121791b9303eafd015f955c60da402ed5b6dff9bde19e5f5a715e67aa23781d0a8e8ad0637b856bedcd6d0624e60bc750d87666ab61256298db201fca98bfbabf1887c29814b53d89dc6b74c08dae1f5734fc9167d3e6cecf9b6c1182ed0b176b8ed10f2cd2b5fd8788de4fcb5e8bac6ad60976e99b4629f972a18045c07002e8cb17a16d80152b781c0921f304ab842a2c64c50678052db7ca679d22f4e6690b3068db08fea16a1218895f817a6227c2a65dbf5f8e512e450208b101181ec1979c6e3d9a687f411815347885e4c48c8daf95b1368eb9b254d44b1059c9f1f11a80ee4b8cc65377aa0509350921adc1f35600486a02bc5489a184054f56841db09724bea215ffca7b3f3905b51f923f296c31d7840f077e3fa5a6eb9cb34eb57f3f051f14fe272e003a82d340419a88e0a6d905249c08b42ebe7d5a004eb325f9fa137c315e73b6ec7e4ea16710dd802fc11692d9df93d5e255fd827ec2705f86a5e729a9764b80eefb579f07304c05f8cc89f07e92d8161e67300ec106ace2b7454c905c901b94fdde9c49a248a811df89ccbb9dc6b6f5c0e41c875b184a25dc1e6ac5fac3b5d29c54904b66b379f355dfcd4a7ab0256800110c02534a0f1292f63e9ddfe8ba3190332c06117281034b606dc903f319ecb2144663b0e586a7b0004dad335adc797f9723c0db899d71ffeb57f0824fe1200eec1d91ce269784c89215dc8e2661cc0a329ef78d7700be3366302549fca2dee876e8c522d3192ca0103446668912cf99b2f8dd6aeff394cd3e4349b7c423d6dc6fe879736dec84e86dfc6ed0f3d27b6b0d5684fcfd866c09af81d4324c9b9bc4850095765ba8bc06b3b5170558185ad910281fd16a305f4ff8ef2a9f374b146e3cf8159aee2eb225640294fe126ae56928c00393132254193eb99a0a5a2c3ea714c285a4d9c062d1bb79047d28741d8fb9a59843675c5331377ce0aa656c97e433f54585d4797d42c219c2ce8dba03a91ad3a578f0f2494a7d5e37664b2e160bb562f1a014badfe37308dbd17068a4d28b720921fed3302c3b5b026462fcc1b1c2cb030bacf0a52710453d71f3745ed8f851eec765c2ec0f922242227b27c65390528f8cea3e9752b40cbf81a11f1ea7aadd77a60cd107de8e79d29b1f339ce347557508be52500d9096d0bd9741f8d960a3342ad29d4691f312c92a3cdcbcb74968def623c990001dc292e48bc88ed07624704ba524bd0ccb6281414d20782f205c259e020c2db317b53408a869b1b9070f993baa7173915f43d1152ed3cf1f2920e32f47ce809d3881dc3c0a9f2ca413d99898d8dbb44d47651c4580fa6b13e41b05e209363e09e9c63797850ca0f70ff04e1d4384a47f50bb7186750c9d99d1b475b8a2502067615ed2b31c1ba5431d9044352e15c4afc59cdb0a4e335e044889970425196aa142b76c4b5bed45be3881cbbe5ba2476dc362089ca4dfed172489724e69c4f13ca197f3b155c02158f15b02d828c30287f81d350fff730b0ab27e037395764645262b32864f4d3c9b39a402dad0ac432ddfb5c81776c4f9feac2be1d3026863f9aaf67ae1cd0ff829f18c304dab54c004226fb4bb67ce5870592271fef597def67ea353242eda886ba8a81feef5d27f2b53c739b24024b2e35711940c451f886aa44daa870d3c2d985d831cf22e34af8cc389f568492c960b11d9cc7c27cfe8d3168c83d36edb9e052e43867036cd71195b44eb604d169d1ab088c5e0bb76eef7343fe259817c7b6819df5404f6146af4c29e081cb0a47e2e56cd9e84cdc2195643764a97329028ddac4445670929ddb6790f66b62ea74778b5a6a288a6fcc53203c862efe733020eb35a0d1cfd2041a951aeb61640b9ca93605c9d470f9e754fd31e064ea818ccadf5e7bcf9d613966b0912af048ab3c59be5cc586ad04dcec168e18a1673b793edf06379e31fe405f26c0458ffed5a6b23301aa9250760ef18a1c169c51f495769569338abb50400a770cd3e23f05d6e3ae5078c405ffda59ca079d3a82683244aaaee0c043e7ea3971919640b50b3be3aee0ec1845d9492d05382c03c8be21a86a5b1fb8b1f0290c87c1188217ed920e70a531453df9a87bdbc1995fafb6d1b37ab6f6835116871dc1c0a397b419b53ca5d9f358211e529e0fbc99a5939b6a09ca0a0b364d0794cdc6039e9deb4d2f303d27b9b86cd33a02c1603b5bb678cb7a8f48bccb6547a47dcab25b543c65bd4724dee5b223d23e65d90dd17be6842d2444c5d1c1adedb8702d6ed1fc1ab8f1776906e16bee3a4ef0fa4a6dce067e656d4e037e6d2d27037fb5266703bfb236a701bfb6969381bf5a93b3815f599bd3805f5bcbc9c05fadf99c24083ebc9f3f787d3262fcc0e62113c0aed1dafe4f1d8c5bbab35d5dfa6586792e42c07f225e6dfcadfa0156e9a5aec8532be36d27837c60a9327e5ab38384b997bc49bdb2da4c24706afb73ea69abfa0ed4e6acb3d2992189f9493e6ba1baf2511257b914ed345637773b739808d4ea27f1be1752e85999b8158f2009fd61ef5a5b8fa803f30dd0c9dd050f23ec5481c58c126103d846cf86f254ea55365a92ccea1dae37e22ba10bb501d023eb119b0ff68319c47d1c1a5e0f40d3bd39b0db3b07f30118bd6a14c23d969bce7fd7b5a7d66bf4ebdf246fc0a25ff00216259220cdef5a9f594abe06d4b3a09cb28f8b7431a5e596fb4e76b34e398b02c651247d72599ba593c5b73da0371148a399bdaa45bb732fa81225747290136ac0bdf16ebbbea92f801d10d81f8a75a02494df4954dd044cf98cf8643509857fd4036931d60df9db0362009eeaaeffc340cf9010982286ef68624fe7af2810d3834561462ed3abfaae561fd2e941f0a0d23aeefc8ab91037890ebd31b1f9232fa3c9abf8774e14b2024f25cc42ff11c9821dd69142c0044172e8ddd2219a9411b1e44f11bbded6961f1d27fae4ee41b8128299a3415176a22872360502aaba97e84f98b6d079fb93772b688abee248ea5d008fd85dd7160428113d0d70600fb7e04b1b220a784f921862f90c53bdf632376b1d97afdf21701ab8c7874d5a037aeff774a347c186d90ffe04109ff855ead33fd16446e2a81dc0841563ad6e38dd7feb970a2ed8668162104dc531246df1a231b30d2033dbb44b15b6d2f080b3d06b44e86bfe0ec7ecb6fcb412578ad023cc7935e7cc3997eef1ba675de64aef9c1f7cd663a3626eaa40ed91ec925e3664fae5c81451fc16d46553c2401ef597d3df8de82525bfadd8a701b852433dd6e739ff50767d08c93d842c0fa13bf499fb9f9ea86787083b2cbcc280061b45e90987e1423b50a7cd425fde23fb46ac3dc3d455400877fe9ead3c442ec85dd453147f6f9a61d3c0e280cd30178f05ea118b2504babf0a9d5e0ef9a8ae35bbe20d4244d01935a0cd4af4adf4e5f33bfb5a54a5c27335eb2a764d67c8262b05c2a0feacec78fd058374f8405723aaae37418f602060a2e3c96b5e694bd6c5694c6478b18221bfd40fc6d6f3747b5c074ea370966bbf82e0faf23e44dfb0f67f72a38e1cf1df4fd4808f5d7815a823f8e794eeb89713f90655f0ee0391f89d85ae20d235ecafccaf37ee14dc41a5d88433d8264cfa79c0c379844e78a690919490314db61c61bf602d64d8d6dcd5593d9bdbf950f338dc425b4a370617e682c5e65c69c8a62a64b6e0a71e950b418f79371f1d3e6e9f08811db52036757f6ded44909c2b18d91676595127fc4a2504b00b30981fe52690127301c67e6180697b5dbb018c74ff320a62038d50de8f019c1fb0b80c2229e0538c6df69211341cf2f68ea2d1b50a2a696500ee6967161382c6015db75e92f64c4c1d1bb0a6eeba6937dd7a0b962ea78f282fa19bc2125e024d5320a9bc52c23fcef74a4fba2262438925275c7a0fc894071c136d0670d6fffbb58e39ec688c89ea784b12382272c4f686451c2faf70e09a689285b253c78117279c7b3d2186afe77c4b70deaa51b3b67860bf1a4fabcd2b040fcdd84580030b056a365f5656f6099f8f7b141db2e8584f28d034b33f7a8b8a90a1010c46f89d764f8bcd07fe6916fbddf424a7206e617d9e2f1d8434040e0810f6543de2d62c861be8143999aad396b98bdda82249943bc44f6ef2fb17d1d070035168b2167cd273aa93659e4fee66e5eb456f12d4727333347523c3c2030aed53993e90a5f01be837cd66bdccf145b4caeecb9d43f06c14cbdbbb6666cfc78c2edb81f745619e1141d79fd75d4e9d6f5d3b463815f9d537a3411fe0bd2a55b75ea64b68075d1687772889a129ba6e7317435eabaf515dce035037920a40beec0b0096b0833f70a319285f4a7db4735920d6f6bbff97510eea0d3f19582ac163484d6434ee8e750f9430f04ab4b728ab9f9b13b4f8df3658219409141f0401d130045d6c4d35528f0068d6cb592f81a3302683ab709e6e7954e35a59990b7cb66f07162d1cd08a3d9e58e0f00f2a0f88ae0ff7e137a4549535da60d293aaef99173e3e4aab16c5c60cf2d38494a48aa3e50250e7792ee13218e8649f92c61cb37047460ce42c8511e1a5601f3136f725546bee6795fa0a792aebe24aad0b508ea5307285e646e6d6b7a3c19cb73dfd0857195108fc0a920685b78af9c81e7b0a14c4d360740afa578274c956aeec89bb758d9fdfe8c0e1f98caa664dca689cf9de60a055b1ae36e8334f73203a36fcfe5104f7598da2c7de99e9f1716877886eb8bdafcc40f9fc0b411ae15693c0b5cf8f1f2639f43868e1946385622edf73db7016275c90feeb4a6e4dc1440cf5addfcde6411b3a6e3a0119533962837e6548bebb9aa1c74efee1b5182b6972d990dd6331c1fc2ba9da97a5607209919c4acde36b1a28e993e01555ee58eb8dc0de8666d1473c7cf6cdf2efad194bfc78bc762208164ff625563cca94653ab65fa839116059565618a0627a3ad2751c44f44973296543b4f8cc2418bfbcc7017ad67c02e5e657e6c3d3900a73841432cacf0a19ad29e40b166c1bf8ab733eb6940cda6605a40880be3d84000e4336d886162474f365a2df21418f6aea1c9fbb4f162a19b9fdf3edf2e0d9d3b56e55a68379a5dd2dd3fcfee993d1f78b571c80135c906f320cb1ab198a410d69611423f64efcf86aa01149d05c1e60e91543d2278a852e2345cfb60d0b66b3f91dc0ea8a21ab6a1ac631230db9bad26800e52254234326b03df695d9149380c5311364d1e57b3faa70c0698e240e2c3252725578774fa13aa58ae54a3bbef83e68a58e20977a022eb112c17a5fe7286059708effe21368cd82e324901487cc393f3d008509dcdabf22a41ac171867c06b603bb03fd190919d993845f6991af73e3a8b3106aaec29a055d0c4505d2c27eb91d25b51be82534da7ddc47e88f06fc8933a562a505ca318c72d55e4149f48c8f848280a9d4385518d69fb3c5d9fdccde64dea1ee350cd2f95499448e09adc490698fa839218b669783942f2684201a141e9839ff2c1711b24a1a5b2de6599981005cc8a98372ab12b588b19d8e8e8cfe0abf0bc65f56a19127b104dd64c76050bd37a43ed11cc82d2547af15c0c9c9036155f760e56992c741e64ffd70dc3c17c7784261d49091e8a85dcaf7df1d9008997edbb1093db845bf3f99b7d16afe3a76f09933b21d80c89db4c6938d18f923d4d40bef892e7680f5d1de31cd0be42f1887283646d9b469527513f56a02010ec3ba6a66149367819e73cb31448829cc8d074a2812083c249d9674a09e68ed337e8e8b5c6ea413c7a4b0286b20205f7548aa6324dc1ece92a7eeb1142a28ed491b505e567c94b537e1412f5a8f599eb2100d0f071cd13360269bf523099ef7cbfd66c03ee91c3149126b23b9ef35a5cb263175b0f59ab57ac7d822d543d3195d7ded9028eec0a0898a70f21086c7ff840945470a222f0d34719b96a43e2f90ce58c10f853048bb55e45756ab42223bdf0f8c04ee999bf37cc842bb841f57875a409e141efe9199f0e3780063c920812b8645ecb9c2a747de5e27e5efcb50ad4b08f5d636dac62d812989800ea2dc5591ba3ea5474e51f224b995435dc5c72f0942ee8690bee289c52835f1f37b96afe75e91b631e256e3147eb55a63c9b481dce04d0b65f55264f7e4356e94ce9444c3c6852211b43e2e87431490ca8c93fb6621357cd3f2536305268a98b0fc72a218f578e800d780316e09c72dca6f9ff5b0b8ffcff82b27abccdd671bd78afacc1d084dd3d22e10ebd24475dee47c4e5f0662ebf0a05846a380568db85c71956724a6fb6b32bd451215aaa99e6c3b85b5f191a759074e80eaad35a0f44de0056fde685008427bcd7bbf1aecc82d96445cd3dfc9e9880cf49f2bb3d74d6143c6bd0ad20f16e6b6cca0cbc586de7a0f515bff76e0b1801f1322db63bef45623b14fbe7989d785163e0204dda990803273b91bb79d71dfe7d28a4624888aef89d92b4e66ba74c1264b978cfedea91470704306389eedea42993cc17a33e15828bc1398b36a3017b8dcd5dc41c0721c6f018e68736ffe7cc231768879abf0af0422819fd131f407e229eabfc40d746a8c1f8e807cbf51ed112ae9d91be6387e2dcaace980c859eb034b503eadd15593f75061d96e4067d05a23e7a771c3b6421f4df3c23c40dd0b4f44ca2c83fae0f7a6c4f0946115e495f6496a2f100f5a80efc340ee745652ae21cb8e6a3698eff33dfc1e50585c646de4bfaf1dbc9f0f72116bac2fbc54c817fa972755d151d72dbb4ca3e09c999799504c22754a582b990c2a215382992313c58532de3a05df30c95c8d790e3bb40f4681dee7d4da11dfb9a1b2c15de08ec3bec41633ccbdfca4e96366af7b86c52f14d2f35e4312670b65ccf43a0ab965c777ce179fe882fab944750826067d3ac0301a3edcf24963e2b1a9b201a8d658529c91bdf851c0279dc6be62ebba9d490d1f7a332bfb24466cadf315471b9bcf5f2c25afa784da911ca8dc166382c4d691caaac67df401b1bf40e81b1cda03868a01578db045346da264bd75580a5f80a6541fd1958b6ed0e6938ca5a4d92c01ddb1b8b0df18a709b5a6a45eca3c348f228f880e16e63cac90d6c94002fc62d509093fdca8523e543240bbf0e5e9ba39f3ece72db8ca16f9329bd49886c518c485efb11689007100bbe040832ab16844953c0f860146ebc015fa50e2de4c35a2c52fd27229cf617cde79c563c96361ba966ab0d956de16c05763e6199fc9f0bf587ba690695a1a178c8108aca146267010263033b427e499ff3e9717d7f2c347f140fc74eaad9c4d975cedf6bd89f977ca06d86dffbf5de2ad9cef4d83b7e568eba76794cc2b7007b12fca3b7ee30c6b11122ff910c225f77262a1a4e20d90c265fe0a3dc5566846dae60cd931d419928f384b5848add7d039e174c6b3ee2b2f85f19718e121a7d556702fae9b0557aabfc4337c2a0a78e428cea813669213f4e771338225f1d0aa920f757ce5d073644ea331545e0034e80a8ac6053ba0f8121f393126131b3be189c7132d4b58f4f585dead605c866b54e47f051f5ab5263f4d1c4a9a3e9cfaa9062900329ed432d39c3f4b7ffe289918a4bfd27e5a42cdf270d2d0e5ec8e5509e38a076fd25eda8395e3dbfb4d633908ef003493c444535861c04931f4dc0cda9b93a39428a167cc7426c813e608d41f7ac21b0f09d2682a486ec639e7d2a37f2d0148b7da8f96567602406ad239f0c0c58bc4832b5a53438903940f1e80ee69acc9c98fcfc4119cfc981f2a08d2c7f511875c60bcddd11e8348050b49e0fa73dbced64dc4d069853af0b04b53eb93a2540d33509d6b37f3da800a756602ad7278d8c2eafd059c8fdeb5d8bae4b3e2c4590a05c5d766cc1bba5ac4d4293f50a2105ea344ae0dfefcc606fbbd64b57c4585376680009a637ecdc13d902889041cf6c6c58c0707c4eb6ba886eb23d58068ed8266622b0ba43e0fdff969582b0668ce4af471ff1bcaf5528470a73bdb1a50d892ded893faeca780b08654927a31e3f745170bda17f941e4846e9449c25144a4fbfdde460ca9f3065941e728b75cc695c7dfdafe01045e8d4868f0d63f0abf44d74d706e4f6308089ae4b321d2422212a18dd7818e907193b1aa31442a1f2c3b9b73ab8a84c79b94d1d3b7244d173b8c72aa31d6d50c3726ecc5310b12a42a7063600f3282d1838c9e3b2f89fee8b92d7528ff81fb70528f84e738d21480eaf8ff2f752e04dde2176df22512e5ef8d8d5efa1cf846f7eb6b7d2e016a0cd84e17782614eae4db1fc331681e6207854f65991f590473cdfe7bbc20046141af07ed438c7dfb5c506c89a4cd4bdb0d05c6bcdb16c353a8127f05e705dd530353d2ca776d781352b01a2e66693ee41e02c70b3f6545af86bc8b4a5f3218ca65e2ae1d6d1c4d37d12d0c791ac957a4a346aeca72429d39ac238582a41c520c79b78011854e5d4c681d2cef3c52fb7a29fa222553f9ffa96166ce0ab100881541791540210493a55f410b9b894ea2b500d6a384e046a8ba76843db48a1aff2e4b2b395a3d5c97526b433de4ffe6304b8104d84ada531a92d29411b1d83d8f7d07f22a32a4089acb9704045ae8723664a2f649acf26dfe52d0ecb9912b00615b7d7f83b313a6e5e0389759b57f63a88a66ea7e0dbdccb93c2ebef93062f5475c710ddd520d1ec375534696a266d425b2a483580f472461a1360c37e49a04e3b22bc7b8623eebff0412951b81103d236a62c6e8a57dfe1924c9eab934c5c7255a582f4baa293b92d2b14238a2cbf8ae7a42cf9ef8dc8b857a9d8a41a14d72eaf2ca5fd073824fc73136d6c79633bda08d957b2e1a73b196c41882ff1bd32c3c80a5b922571eb0555c680f898b729d79df1506178099daff04a0e21afb81eb3f62a912c33b83998da82dc6cfbf318a935db4325e1267e41f420e6f6fb2d7c37a6f6cdc62248f4549304d9a4de9da40dc0866225f95cc2b2e2188f9c559ab1c8e1307a12ea52f0fb3f202de141564c0e4384134c91510bf995ad0e7d6ed5d735de66c689c944d70c2caa5fc71832822529e2c6cf5c509f31093b7b68bdc0f0eb7483f786bddaf93a6e12331f3a782d4bf9b43ab9ed5063e62783063b59a02064d6446bb16db7866a8ff82e2fa8c142843bab3ce37f30aa5105cdf635ff551961d3d98370b487f3379a824be791d2354fb9a324d46a316d27102cceb966a4d30579e9bab91600e0a1709a13b2b93c3c0663d030820d0ee420d01d204ed221066a794ae82b6005162424ceff24483704a0e31146cca5c86340f10e4d7b2ed6219b8832b964ba4e61f2f20d90f068f0a3c8bb5c0eb390a0d46b2fe52439da116dd806e4228a7a23cc6204f263a3dc9931dc95b0af506250e70f44b4f970232c101af2c3a8a5a96575480dc9e2af49558e057a2904af23d281285f95a7c096b1341ca0edeb10ded2bae1c7e91716d44cbd1da31adce1983f71f9274b02990d93744487fb7753618f700b0a6227ba51d9b89632045caaae71ceb5c0f2b5d9979bfe9f9c70d0ceee6860cf14064bc60b05989e51a1ca9ac498d6dd7f614dc94805dd1dc0b09859271f9e1d14deb93e2f85fa05d1ff0789af7a8fdb669051437fd040a60f74183b0283735422d2813341112fc1e341758366a55cb821d62c63aaeaeab0fcc6af69ec72f9c49497941b4c754456d3545c70b071671d8efe80a05e74e583e7240206c2765349f1e3fbefd05fc78ee841b6fe96c99d763bd1d8be8bec6b79732e825fb4314bceff94a2368135fad6cafe7ecc5eb449a638bcd1959472ba2d3ac7a2134d59fbf41df8c390c0c5809188acf1e9a69ee6869e64fc34965d9aae215bb73ee806c616a64615567cd3448125d1a49869995d37e89d2b30aa83db42d22aac58e40125531ceefe2f0570cfc261d6794f7eaeabd4937ddce7610f1b87f10ffebda3a42e4144e2ccc0205926e23f17b0c9c1ce6ba00cc77e16d12762f62231d6f6977d788133c10c7d94261f5ee6a441600c1e9a9c2f8294b9e09f6c4ff938aef0bd4089eb780ebde6dac6b5ab1ea052d3774caa41244b17a8db5c4c112e6c81e5bfa237a427e7559cafa87f67b3dfb2029fc94f2ddeb6e0bb3fd4d3989f01c790771593b2df2b2bc51e780a1f91b4f4f1d335ec588eddecc0cfcf5fdecc600c13c8f9054f10f8b0e2e4de8aadb6c8154f076d0f0a3b73b8739e0d3e090539e5eba14e6e9afc6161d20f11b1b8f4202aac3d2a3bc69fbfeff99b0a649795e37064984e246fc333fd6a80dd84c0504d6a1a9770a25167c78a7c278f3c8845180bd2f8bb3e2ade6d72dbc30b4d7aabc580bfd0cf450404932c1ba26d535b16eed5a429885f9a758f6638cc7554394685e1aff538a6445d3ac17f9f9cc205d6bc3cf6029a56ee16d470253d9d17481ccaf3f9f4e55a11aaf5d62c15a07a72cfaef5be53592c8a05602334e6cf081b89a8318ead25076c3fc8a52b0cd9ad3abd579e73391570d6a5e93590ba9abf897b57e6e8023357ab24031b7cecaee9cc96656df2f7ae6999bf6a687417cf7844b0bdde1b301d71bb32ce6b942c04fc023db7cc7c826988979ecf25eab2f14640f218d0f96fa29dc7c71c8bcd4395b8283f1255270051a1968e4458ae04d0acd2789aa8d2002fdbde57f609f7aaa7087c401df80c58cde09a7ae8a615ca87c3bec10c96e1b950e0b44e4b56bac859146f00dfac3f4c81e12fae41014579e82a83feddc267f8d773accf00a8e09019d29de1f3cf0cd8a59ddadfb7fca97c37ddd7190ff27468d06e860aba1e11e6bde4131ae98f8304be9c4325119af9ffa69d8ff4e9bc2b476694a41eb2d4c98281025b6af59f8c2bf325a4b5c8f2080edccfcd1e6a2ad740ec7dc38816a2bc7d9978ea43462803f3092461f08eed08618f9fa051196e490b7ed20ec6d7b32dd4e92831368e22c54d988e6cd220c01a478f4714888e4590e1d43243ea3bc870c985331baabd189cbf1009b8cbebc371a64cc71d90cd323f6b6e342051a9eebb63ab49b589a6cae91217122efd128ad7dfbdc911c34ef583378190ca4c5e80e22f8e07e58d49bfacde71e1322069ef7b8b92f1740fa9c244f3721ea5063f81576484726ac0e69c5a17c80c3c0beb631727252b0ffa1d52d8836a2fc8be88146d3c277aab21a66664c5c0ca70a34df488746bf22d1dd27a27895f6bd41f4afd87d3a10e5989d5e8f79cda8b28a132a6cf68b47a1a34186856707327b3272decca0efe8e8cbf3489ed77389a37f568612d3349ca4c4b2b9bda480474a6ff9262fd499fe29785d5b94781a736cfcdbf4320ebb0ff16ca8adc9bee49450d0e9ab88f50da6ed5580bfbd5ae53e657fa510a69766090216372a6ebaa296860e9731b60da52416c27d4167e1e3504aa9879bb340fae2a55ea558e32a2e5cc8ece2ab320bb22a7e2d8587db50ccdf3e018da476c1dfe2a198a77f79e9c6bb2b15c48b6b97f220638e35952644a41cb1a9f07b41e61ee9ead523569a2c8e20a93149e3a7b9053fa362bbcaac07dccb39e77c0466f189c1ba9e327aa4d9e45101f8f2d21df8af90becdd36d84ea2656aaecec3e092018ff1637ca766ba93040f9ee1392cf3ecc3b9137215b5f4722bd03812434c4abb560ab49417f6e97d31ee022d2bf8810690322adc3a9b6e2cf936255fb38312ac09f577e7a5d9418413668132a9c1a5a403c8a1393282181da44f3f322230a65cefe8a6eea532c97e04f7f85fe3ce4509a604c6cc29378d0690630df6c8c9f3252f917a7f2897fe2da0f93cbbba92486c5d07d8bf904814cb6f69337c8f87654898caa396d71921e52e8762ee8155c26783bbfc5551f48f5f00e477ea30ea4b5833c1c1a3102e56c5a1e7732f5a8ca006e5a5917ab64899240dd884fb5c3f2b40f96c1f7ac0904dc8dc622622d18fc3c97f3f18920be150d55364976a52288b15431a20af10d57dc10181d1350920abd66d736a263c2d18b47cb363eb49de13203d3eea550ed0c34b307d43c1836e44c9cfb871c3aec673671e67c1c7c70ad54bf5042530f0fed6f9edde5bd31bce86cdc6b6b3a2556b5bca6726732ed7ef77d448ca8b1632ae5209d88c46c32174fd368b3ba991eca18a245486c0d7980ab590f80aebce76f1972746a4aa01f457059aceae19d50a8259b61f51ed0cac10709e3c45873941200aabb2020637cccf0722bc5242c8aa5e8ee7992b2e3be26a3e2fea60b34222855c76626a2eb00ce65a9f14dd62283fd462b405b2cdc4761c4c8c6581f6de9716208f5b05328505917ca06ec8e6dc8303bd9bea6d7867655c19f9a209e2b36fe9634f3466e26688cf5e891541f14d246b8e202e1237ddf411aeb7158fe436a1ad648b4d28d071debd9221d301560966d0cb245e8c02897c2b6723f96bda4e61a66cd0b200fac10718b15e8091c3d3cd4892c168c64c729ee8c01565f0734b70a1cc3cf876f46c7c2ba58c63324e72f3105fc86b35e625a1cb0b6ce5a36339684ace25a60ab6c754a81715c97fee6ee17e0971afa8c45eb816bbfc1d2f5fc9ae9e16353970bd1ef0f1c3dc90a5528066338a0f6965bf1cfc17bbf19c8310326f9b9d4365d283bb791f7d760dbeeae2a0fb5df461f30e4b5830383d489e54aacdeca13e7d40bafb82e280706a50af7a1b9a207ce911f6a39a0dd00dd96d943c2403d2e93e66c76077c416459766343d2bf413175afc9278d113bfecac86c2c2b2c5d43067dacd05e4b8a6527e0c356a09ed254c9e00b6564cd8951b7ff7e2960216b504d43f0c4503fc50459d85db13463fffd52997e13694c2e7d05e25098c390d870f7ce216d587bf2338da03f7f955541650ce08e2f420287926f19231a789182f53e3e8b15407fa2a40b1e54652baf3ef199a6b09203e5aa5041bc78a263f980c35c6815155617d7256e9ee68f69de02c7f3d4d896d0cb9ffa7f134a63430cfe2d6d57f79f4999f0885589a8271cb495208ca2f6844af4c68881b57a42b13007591e1f2b94b6f32c7afd2f50b2b32b444e8e64bf5f7652fa1e0ed3d6201fa99d36a488f38c40af301f8363144001b11a1f548a3ed02d47282a5e538c0c3bdad8f6c05eb464a8bcbcb789a033b01394f7147e03911ad0f3d66d00b449de9d92c060bc8305a3a19f3d48bc25a9f45e0e44cee4af912c79d9469139428bbd14b78f35c62a1905992631b9a20e0dc0a2b32f53b341d79252cab7e9b412a33bc8280f1420cfa2a28fe6fc3f98e5cf8f1e6569b188cbf74327f059649719d55c67d52739bd09a9df853c80828e001b12f40b4ced67d53029d25f1ab7d6be59b1b0f945b9e86b30bc5277d34b71a30d59003617da7e84199c005e2b5a550a66b4a9d141dbc3f5a351ce2377ef14fbf7f57bb071180be902c567cd1fc7472bfe5038e32c0f02db6547989992e1c9790210b29d9659ece97cf542c80cabfa437abd595255a8d22fa5628b37e93b028d80b1a61068e36478728b4b1903304a36828522ed850909694ebda21a79797acffb6f7acbdb6f7befa17ffad2937efad293fe493fd9a49fbef4a433d24f36e9a72f3d13fbfbdef36ea2ef3defa3f8d2866a94a81665a1089db990891596669e789bb4947d7594f16884649e97edd73f77afbff95efbf3ddfae7ee35fc41992fabd2f7e6fe8ebb9bfbefeeefbabfbbf7eeff62754efadedddf757f77efddfd5df777df1f31f1b6f1cf77dddfdd7b777fd7ff115bddc73f7b777fd7fdddf7471cdd1bff7cd7fdddf747084b7b777fd7ff119ed6e3bf5ff358998baa9a62c0b12d6fbed3736fc420cbd5abdfc2856194f885aabd8795f96fbed7fe7cb7feb97bfdcd77586df60dfe603496076e8ec4326fc093f11003c0beea8d40bdd05f4dfb00bdf5fe37c9fbf1f55bbaa43d62ac31e3e68174baf9bfb58a96bb2d6440bc9eeb22f88fdb7b99d2a27439a77d063d5d1c346153251a28850000736545b9fa676f747b9749d2049bd6e0677c534832737dd3bf565fe8b301b447a25fe0ff96c4f71d1f97138172c4d9be28001ff257104aed1dfa5cb4966f382d980323fc57ba62122d75a64500334a51e5ccae2faabd6ade7fbb73c08415285ad2262d705638a9ccd096cbe655e2c2501e37c5361fb79eb30008877c08d4f825d71ac74fafce8269c3b48f16a7df4e4e803bb946ff66ed8f41f6a56374dc1505db52a0cf86632e3ba119081001ac8ab8ce3cbcf911ad60919dcbf8239b821f6016feac7471a7996469cc497cda050784167e53e30f4041fb2f3459f02a6863a9bbea1fb25b4f43924931f9a9c3c9b3f08b20d4dfcba3a8b98e4ed0afee2ebcb71a9dc49f7152db81ae96367fe3b7e0de180382d3052faacdcb1763641e4950b0ae1c2a8282a4cab936f69e6a2c483c8e810d256cfb545fc205eb225ca23f4ba1f88aad5008a4d74c218612630ccd0c3be004b94b37e2d33028abce10b932deaec78a5b352c98b1d70839210285b546204b328a746090c7519418b8cbda8f545228e55e69f708de328101876af1e58b01fc2d37a3d42228478f6b901eb714d9b8745730dd40d6bcb7ec1b149e134f30b2c4f63d0c6b98dcfa24ad9bc9581f000ad697b2e57f197db83c5992078c8604a3faa4f47068e4731db68855f06e1dd6c857412b029c2a4e61d63dfd38865ff60a593290c634b78e0351f8204b6cad7fc93219f928c38b820679654a4c700982a4b254f8965090e2412e0f760181ff8791acb8e910b10c3aa593aae850d69e6af63eaecf39505d6322b06edc4efcc90ac87b153a1c9532ea209d3bd5c7d872c8bd1a1a877231bb3471dfbfe72ab7d0b7a51edfd73ecdfb82b5cfe8d7b39e77602f578da89af62a85475c10efe691505b35aeb20bc7f39909f1860cd455ecacf33cd534bc1569281c548fae827da2e4364b68d925e26dbb5bede38fe67ace68704849087ca6cd2e1d9fc7fbfaec6fceb210ecd0913052d6edb8998109e5528fda846e586b759eb1b2b0316fc18510b7ec3206f58420c035f4933362e4b490d3fb3070fa787f606418c9f72fb3d86c967f40423216ae17c93b6183318b22edfd4100512b4ef5a19e403bb6956e129122af8405cb2aa07236593280f001a203602e150e013374dd6060da4216ff6916de2319037c111545401c7431fb6dfe0536c561c2119643d881263b9053a76965b976d9237f7e54f37b43b12ebdd516404e48aafef4abf4c4498e5aad43488b315c3674e069466f5a3b42c5ea528de3610159b1d909b21288fdff01cc178601f10f4e76d6db48d75b489b25d6db24ae36c57ec509cb3dcbe2efa9517b4d2120521619ee78436cb3a370a281cb0fb5700cc940d3590adc175f742845d9381a63aba8fa7de60a284bf6a48ea238d98e3c69a34a8629aa6d1c61e1d80476ceb5df4ffa397cd1d9a9229babe1a10232fe42cf20c4805076de05098e3ccd62a5b252a36a91fd1b8c5e8a1854a6dbcf21cc8fac4951424731becb46e0bba7b3d99dd92c97bbe44bd1d86d5c0b63519c847926d1bbe4c9b13eabb3cbd40d662b19e88ea042c2d26dfabfa7b32acdead37f03c5d20793852af0f001932f12a46d65e3197cf4cabb441163f0294dea4cdc00e40889967cf125f857659f2db4c65a9c62ae72f334dd2fb40ce9211b9b25a104ab08322fc206812f90ff3dd00dd7bb1e86268be153fd508e0f6cd2e6948f91ed85ef1cfc6f37b1ebe4a0910dc7961430ff15f1aea03c2c01c1d1af2b3036127ddcbf3b156828938d98866b2f2ab0e49a4ae1424f757a052fe7e110391e98592df2639dde9a65191fc204d72a2968a600ce6f17c07732d8da3e220b737cb331fa928e9bfd7f0b44c6683895e3f8d9c99f8c64b9169ac64feceb13e89d91d6a13b2fff7eed03ba8ea43fa77b906d6d1f53dfecd46a16992cef560b4fe53c899adacfec4158df1488f6c0f4e32aff95c7682e5bbd79dc0468d6bc14d3575f4c6665ae5331d1388d4a9d4872f09251b32c1f204f543b176f262074767c2d7b0ccc18794d90b566b5bc0c4a87e30f6baf921c7b32cb299b61711e279fce0c99d4f95bf616c924b52c19a9cba183fdb061872d1a34bc03a0a49e0b6f6850ad6133ec53fcd39f93c086a4fc5389bab232c605993e6326c4a404988eb3dcf1d708a107c3ea5e619a2ade30d1c565a8c13cdd3f941dbb8d0f3c6b14826b82801d0fbe5222fc1151a473c306ac79d340508583f4511ff591f42c7eb3d79f04889b890978f23ea06cde90ce4960824e4a15290764cc8683d82cbc599015249402089b12de0623ad78816c5d512a08cb4d3130e6c016453e590258ce58a182b15764e5538ee7d2570785a2db2abaf7061ae44c656087f64d7634a93006b81865836bfb5e5d34027e878ed4ebaf5b893208c8a078084b0f24d5ee901896bd66114698871035928904547418074d5c1d9ab8559445f336bb361a12058592baf1841a2f3010ff80b528e46b6fe4c9207739e4a35255f962c39a5a035f9935f0d4a44cee1d880c17b1aa36648a23db2321820f38a985e069140165b4d22b527d7b729c9dfbb7b5b97cddfbc8163178abbbf5539229ffdbf21c820af1d96f1442240998fe6d4f384df7b0e825047d3a2dfcdb66ec87a684e258432309bfd18f50423545966d924449bac371d386cfe76037202082f6153a0cb67ac2bd4f04fabf99bb9955176a1e6bade866d24b4a66f23e65ced0620e9ccf5aae20a8e20d44197b33f143b68b00603807cf57eba867ac755c8f90bf30e2eb972de76f46fd2651434a8cf844ae7d176aaaa5216c9352280d7868d5389abf2870d64e2597633fc2d7dbb10096af88230ffcd8edb1deae88eeaf83d13d5d50ec92c8965bc012b835db054fc044b5ba50ad0309386d6a00f7ea37819ba2ef9d9b3eeece0e4f0e422f83514086cd6e4a9495a4686b7563c7a054b9026d86fb79d32525b7691647993b43f115c93209865819adc82872231cf642b40c10e35944f86917904ac087be508d4fb9a2ddffc49ac9d680d4519ba85c1ce1ede9951a6b30736026582d81ab3d4ca202c0357c6c06714bfc26990a5956c15f2f7cb43dda006e8d2256c9944dd812f40d86381b5e88c97c428c4f7b136e82bf0e4203c7291a0c43280668d0a3511a775d17d9975e5a17416d5e86e3b6c19304791a5f8569640be301d0052bef00985d11631a4cb61d1a0c82aceb81bd29f098e2769d24b2c292f4c41ef6395fce36ca6c1062efcea620ab35d244300de413d8b9f440a196eb67213672daa615bc5dc4e3417f26cfb27ac93ce95eb76de59a7103ab38bf84179362680cdaccad809afad0a5e4b70da395b63dce92902a37f5e1e36109410807cccf4519eedc9cadb619ec0a6f09925da12f31e7b4ba66fa55a7f897108c2d9bc3a56e6cbb7d6f04c34ae0528d64639dc53abb84c040aceab9e4c8038adaea92592090c24a0779fababe6e74357a341e0581fe5c410d7a74acf0faf575f43009f8c2b2cc5b726c0a0e7403319a43a41e96ee6614b3bd02b1a81c8fdb16bcdbf82e8c2124c903ddf85efb101bc7d61249c8de726fb9b79432c914a308b808d9084fbedd0697f8c4e4a3623c34799f1e239d608fe8b2a311311e969e3ec776787ab66112275843706564af01493f6711941441034c9464b71183472c3c7bd81ea3951d983cc7a29c79023cc7a24cbdcc38ab4da597f164a08ef899bbcf8cc1b69adc16470fa5771231f20e39c2a459bb749f469c0d75ebc9b5ad1d9e3c3b7fab05472ca060b9a59c724a39257f3616c5c93f89e2239f5c5943c6e99a5de4189425ed5a3cca38998001ec39d6048b009e634fc6bc6d650ea44c77459ab35e201c63e4ee0e3b3ea15f914b881186a41110dd86871b46a928d5e5861106f6a4e23efdfc82448e45a9223f8e415912a9322636fb12dde54bef725690228de53c2594b779819a8faef90bc67ce75eec4913bb75ecede0a86fb9657d2eef966ec83e24854e80e1528f1fb2df38673699779e8fe82eb75e8f1b778121cb6f9cbda21bcd0437e4281cb72e7dc8b2bef822648cc5bf7efef559f7592d16cbab57c4aa376058775e1bd2bc22ad3b1609d4b70edcd1b9b7e3fe8d6b5fa879ab75e3990b0c81bcebc673cd23c1c6f321d90a59ceeefa8c58e0f5115df39b8fe543f27e407078345047e79ef37395b32f6cb78ef319b57b2e3d1f9d7b6ebd4e47c9cddca8fdc6c3761b97ce2ccfdce6e31eed37aecfbf95652d975e518bf5f9bbcb33e7b72c17ab7610cbf9ab25b82c677ded383efa797a78ee72ef3aeb0be3b33c7a4537eefac21b5007f34fcb997f58eef221c9faacdb7cd75d1f3f8ba747cb3b6779c702b50efc389ce8592b762db0628a0d555048acd9f2047846e206506f4399f66e68e05209a41e4993e7248e387d18a13e3a8ee7248c90f9e815e55871f927508e981b738eb899f7acf095b3dc91f61567a74696ac0bb4711ee3c68191a95f4e72c45cd6e8f7246a7ab181ea39664314c79e6335a4f91ac4d4d0e53956c3d487f104cf311aa0deb25794e3c56d7fca4973bbce39efb66dd76faedbdc6d7af3ba9c5e29f95ef9d980371fb3cdcd4d585d3ed4d66e3d3bdd0543f6ca407c38e9db27b74dca9d6d86403c2b3de70fc84e0aaecf6d007d37fa15ddfb4ef8500002820f698521fd8ad147cb8defc9cf5e8220c74eb269ce88d8cd39a71036c78bdb3146aed6cdf9354ab7cdeb9781dba7659ba47146d9b1763fd91c34395d5ce65a49c94135fd529ae272c368bc6279367167bfa6963bfbc53e6157791d3bb9dcfbba4a47f58b3af7b5d4d750fda2b5ab3413cb3d90e51ccb762e4d0612d3e545e7b80a3614ff50f73c6fe940a426b5aa4d0fe4a99c57ce379f369df74def3e5795f7720b35d49406d6296e8b765b9c6aa6ebdbbd0db541a9e0bd919b55ddd62f7e14d3af3145114abf86daaa83f8ad3c1f92ddfd9684114bfcf0b55911ecabe3ab5fd4d34035376c2811fa45a78d8db33357596d863af38a36cfb60d6c42e2443620778deaec391846a5a7d6a75f9406a6dad3af2127ec580f77fe04fbea17d5409fe2c618a15e9387a4fc82cc29ea220cb1d1d437d06a5ffcb8843ad4922ab4a79ec625d1c3868a4fe5ecb8a45f39455c2690f9bd2f3259129768c9bca1987490e61106ea1cf52de2f0d46b5cc23fd43370f6abab70a6b0395fd8d08064ce26aef439a547692d96b7baeb759ab7b4abb9e6699ad6f234d734d734d734d7787450cb357ff9388ee63d1d34bf1c2e6e7b6babb55ae7ba16102056d7b53e0f0cebb7fc7e2c960fc9d6e75dceafc775d5566eabda13cb3e5d78dde5ececccfa7cfab5b9ebf37e6d5ea5900df8923536dfbc276e88e337afaef9f41d10b6a0f0254207f1e820976ffef2f9cd713aa87df39dcd5b5fce993b5d365f111bbf71b96c6e6c6c6cdce5721b97cbc686ca894aa9f5bc2aa5b5cb280f70a8fb44e897f4160cb73dbe06e200ea57b6c41dd24128a400a491b4293509bea6df7ec9ec3b6a7d363d9c22647e26351964bdba741e3fb6ba7120cf06ced7ab5f2f1da4fbbcaca6b58fb8664d360252fce9d4f32139a5dc204d0391e2176922741075cda96bcea3d57ecd2b17b641f102d89c7372b9534a297bdac04e31d957c47ac70c5ae7b74ea9b5ce5f471bade68c50948ad248cbdc304e353f13131313659a62629a8aaa02658138473f8d608c8a50316af3793730464141554d465923464149a10c0472628af3292c549a576d3e9dfbe667bdae5994518bb5cea28e53f65e303ae9d76cd2afd982ddda5b06ce90bb7c0884ada6c7a97e4dcf29e25267ea57b78e91ac4ceb893494cad973ce9694524a299d94524a29a55e13773a9df4c555f305cb530677f66bda245aa87a56f3429d0c24eee6d135af488b9d18cedaea156dda666df48a380752c479e52427ad6f1f0a2900f1b45c8f73e9db2637c9f278f073208ff4e8d54de8d7ac7cbd2209f28f0ee21f5bf52159ebbd38343431850f3507b253a4699aa67520bf5e361a8c5de616bd08c6296e78ab4581738cb8218ee82f7d0e811f0853cb950e860cc2b82c3607cbbd9db55e3b8885c350e798b99c4bebd537bb45bb5990b999556bb95aedb78161e5b68efb32ef329f9fd307a86f073f7bbc59ee8e2839e9771493668c4d5c27dab5f43caa3b3dce18bbe834478b3b3dae99917b4eaadb3e7b4e333b7f02ff4c49c5d46a29a5ac31da2031013c250efe99ee65b9d2a78d7ee5647165f8fa99a4e2b43e7e6eb9cb79fb5e9f0d29e40281c05ab76ddbb64dfe05c321bf79c87e420a1dd49eb90d3540b09efa5afaca67be561fdabc6e5b4df35b75201baf9e0ef2e9209a73c5edbcafe798b917e46a398ef3bc63b9eb2be2721bb720280243204097f5b940976f5f0b747df7b69c3d083091eb7e9dbbbed617d6ef40cefbc575a0cf73ad6f1931b8b2a5c7251a0b2ccf2c97c7090938d1812b9ca88015ec13d6a7976e23d31cea998214da7c7a4cc339be60a1269204869f0d6e51d449d668277447cbe4b4e28654aa5f72ea9d640d12fce753bf629ad79c7cb9e17c02e7d39cd241501d14eb5313220cddeed255255e51c7810f12ca721a284a4e9e633a60f946daf9d8d193620ce2d152128074527a3dd81b34626f8fbe7d61e61be52309c4b39d479f1cfa27718174df39871d08c4889d3f761ebd8bce6dd9048d62373b1c071a510fe7d6b951e6d349981dd881d917cecfbcf5c93ec26c8048a4d4f223cc06c83c120dc9a3213fa5b73e26aa9f8f0d34f27cbae7b9cc3cb7208f75cda98fe91ec863411fd533af9e71ae19d5aaf9a85addc03073db39cf967d3c1ba883ba75cb4330fd34e2dc8261fc30f3aef3ece3ef9ceab06e41e69fd0baf40d3c8a6bc090f3cc6d163f3eeda0f6f006080a6822cfce02c2c175a702219e645515142964104b5e32576c65b9cccccccccc2cc4e69999f9ea6829b6fde3a1ce913a671f0ff5f89a67aee91ebc74cdfba31e3bebac33f6ce2ae8e5b9c5e5b647ce628b76d96e69bbe54c7bb11ae8a3072fb5586e51d1b2bacdc373ec8a09be69788e1131e65fcf31229af4402a52e6390c010c48b45a56571af11c8b41f151ea39268582b7f11c3b4288e7e8ede098a8faa313b83233fc110bac0f91a6906287860f919c68b0537c88648229e8872a44418504020841f5a10a5054cf1506f378cdf3b3b70aec51fc4929978f0e60fe0939b684979f1ebd797c502e3f9d72f95085a49f7ec46bd6ac69b75e3e524df9efbfb7ddf547e3e947b97cf476b890183e5d7eb62905797a4497be23ba0491ec2bd1e591fa85c4979ef4bdfcbe6f24fb7d03a607e3dbd81e5d1631a3d6e5720c0ac9d71d99731e726eb47975ea5ae796f5f1b09c5ffbc26ef0a8f542bad6c7c3f2f8d7c37eebf3e5db1eb1dbdbc15230d875ed63797fb26b7d93bbf8d627d906dffafaedecc8549b19ab73ede330bec534f664792edfebdccb775ffbfd5af46d2b3e1b695e3d1c21a988eaecd17bd8661db147744deba179e5e921bf73f91d1826556971b9d6599f7522d6adcce2eddc82cfbc0ada0be9e74090f8d6a757d482e25ab7d3d3c15ee8ec182b0058d6590ad6c2b33ea0b7dcd7d6f320472158cfbb96bf79b73952f65d07e9bcf66ef3a3b886bd11d8c6c6ce31734d107c09eef48b1535319ed7759ed7b975cff33cf6f1c2b096e3ace57c736badf562db6addb66ddbb6cdd967d382bbbbb5eece34cd08ce5154398718cb2d216e2b9332932c65a679f675fca3b9fcbed695cb3120c63cf519562d736d32fb680d03cbcccc3fad8e7f5ade5febca75ebad2b97f3d6959b79abe52df738077fcbbb05c6b67a6872cbbcab4bcfa4acd92624befc84c4af554a97a07f058daa036accc0708894b2fa903c1ae2b58f64abc51f8ff4e8d2e5c763e8996d849a779ae6436d6b10a40e047fc257afda17563792120c72c46560b047b279cea544ea9e7310fc16e428846ffe918e947d07a98e94f9c8c06f4ee328848ffc3302db90609854a3c7a961b14c5d966a7188c6cccedad1908f47f2a3d71af993b2b5356bd6a8f97a2433af880ab90f64c2887c78a4a921a2a921b2e685d4706330bc5dd80d1e0511a2bd0a491fc1a246eae73ce3c0a3a8e667d44bf621a9c94f48670e8647433e6a43babb8f86b04715343692f3a54bf068c8162b0afa85c20d6cab88db2c8e01e1a4815b44f7512f24f358dffcaecc1f692fc4c6eb5842b28f1e24c2fe28848fdeb00bfb18618fc646b72d7606facd88fbcff9a747fd2a67391d9bc722ce5cb75f9c6f6eb76f724262dca6ec28252b8247f27974c88f1e41e71ff6f8f5db40a3ead6a777543f73eb1ebd1613573ab881f1bfb0462e7ee1941dd946f4b00149453cb38de89b0fc9a321ed1b09f28f640bcb95defe139f86942782475230d813e075b0d25b1e7c489736c03982007d137b1257e1d199c10c543af2439439921ba2e813e7a7cb9011bb2190070af343296b49dd302e85f9e943d8afacd14513206800e2a90a0623ca3c12c50f367538c10b5ab0c10a91d2911fa2e8486e88d8958e3491e6481840143dfb90308068489412a20ff931244a09da742d8243d88b1228d144660639806982888938490558accc30c3952e3d7041c444ec2150090e8311c5a50ef260490d96394708e4dc1f493aa78754fc0469a64dd7c00f646098391029a5cc5330f3707a94dfcca2e433b0a95aea210b1f4697d4812435f9ec030b508afa006759f2d4c311fcccc00fb0d55390ca89880fb81831412098bee739f603184d43d85968ad59b3a609d106cb91424a912b6030a2d8049bf1c20d4c9c040980131ea660482060ab6f827dc0c5089890052845ad00e32c4b88d8c3113c75668e51e9e191e237b5c056441b08632b220687b0b3f081196a8882881a985238e42918d68f7d7ed2db93c0075caeac2162674f022e3052c0e00645d6ac21621f6ad9445839a9c7a8554a9dd2ac635488fc4ebf6846bfbf58f629a503f94b662e7dcbbc66d2e58e0eed303873651e33e7991ebf9f67aed132fee12663d9d98773d01bfda2ce850c6bab885b5d0a714efd2585ac53efa94e1d07e770fea94edd7eb76b54e7beda35aadf0eea1ddef2e18da7ae535d96e1ccd5b9f4a8efe957e5d15c7e3f8f06726c0a9ae7d8942e7e9bfcc351d207cb53bab5d31b6aaafa3c5a41a90522b03f0a45608330d67ce62a247d06aa409d7e40aa520b4466b8c24b1fd9c7d343fa74e93394df4758cd3d67cea123e9c3ce2bcba83a3fc7a68c79da5e9dbf762fbeb5dbe6dcc7d13730dcdabbee8b1f3bdbf9d7af15753bd068db7cb46fee1dc53543cd71fda68c6102e1a0d46f50df91fa26a2203cbd9412b1cc91596ec072e6eafa35fbc538ee839a90b7fc74d7324dc3a1b9091dc4b1294e5e730b68dc85a55e0be2b9a783b42971881d2baf6965a4586e0d71390684970f6b1853a27902b1dcfa614a973e95ea9ba8c703d1594241e961b9f5c30de22b6f94b85d938f21300bcce9d04aefc14aca9750dfd5db277a409cb1c1872e5e5049010c57441cc305b674b8e1eb1b870f4b20743f04498e60ac07353fc19d7e4598e516d46def0460b9f574db3b9692580f4a2aeca0b4850640a4a9f244c49d9ccd996bf60b493ee73b56db3630dc9cf34d938e63a3b7435279ce3524f99be368fcdc77fb95c489b86b84f37b3e8261e632c6106a671e672eef8fa2bc77e7254cfa8b73c8f7794a836ce550a957296abebddb9102e5db7b682b871bbd55b0dcd672972465b08d4fa64861aa326576f24e7d7b8f537dbbcfb75be9c3770dfe042fcf4f67284cca52c673d2d80060b1e7e0d9d2e1faef38c59e02f76659d534d7b4aad57ac3cd1c90f914baf36a324c194672bf283395f30b8df38a33606ca866cd68985654cbb21f994d1a2719b943e9fce929a5a472467945ab96d19b654ca346a5674b4a595171ce29ebcead3b3b33f60c628c2ac4971d5ddd2da38c605a4a2ab36c47c6c5c9b44cfb684627edf9374ea1492912536e1d1c448cf1898bfbc592999963472e926a1a8e0cd7f449e9a4b3769563e6c426f46be3acdd6aa711c978ba2cd09a776e35afa8a33146dac9c85db6d5a95196dc366a2ecc3967ad382e7eda75909769952bf7cc769052525a5dda9cde73d2d8b5944f6494535a3da159d694528e59167bc61969118ee6349bb522f567d94e53704e2a664ef1348593d60e7eeaa1fcb6e94aa15f9c6fde5d4748e23e292588d44fbb593ba9f629cf312aaca8d842c593e798d5d2873746c51929e794d3e5ccbef0f44ca7e92485fa69424921139eba74994e5da6938c7e9ae1ee6eafd30dfbc9bf2833fa69c68c1933fa2968c6eca79e73ce2d6886536f29f323e833be09450acda9a7ae39dd7939cd907e515fa15f54ba0942916bcca832c3439c9e119fb28e86b7940e9c760de25e79da8187adc453eabcd1b0bdd098316346073366cc807aead714212ee7486650d7edd7d2531a4534c05eea20b902a7e1349c86d344e7224f8f9b4001ce319d7a05388873ea1e56a1cfc39bc3c6998534ae11ddc6b94f72fdbecfbf38e39381446dd960cb74b8ad5df476548f1b14eec9c9a99fbabb7495c6d25ba8d4fff861751841c99ca69353fc271eab45c369b03a769528a97eeaa0f68bf3ec33a2e141e2cff01f1d34420d987c6d35e91775767be964a6dbc3f5e917e5c0a53b097d4e7d464d7510074e7d52759075ea497938b1b06895ac359da6d384329f24c77314a7eb78d84f24549fa090e93ffa4547e817a50172bf389fb184445a75100da72ec54821f71b9f1389146a271c48fdfb26ccf3c9f931c26c3299a4503b713299583da5a17c72389fcf8121093e734d2a56e9d793ac413b98013a91f185f16578e6e9d03e03a51a1c6e741eeffa15c3c37eeaa7dec2e3d4db0b0e8eb770bce71b423d7b925576e9a709f2802bf48bfa8e87fdc481879ca68380eaa79ed2502fe3e3e7e0bb3a5f937bce17e3c3f982c49b2fec3eec279b2f886642972ece430a393875efbdf7de59e5c1953be5c6c03cb99ec717881babc1142bb11a28c5a4608a49a1749db22a60983c83597a96c1f39725cf4c824fecc231ba7c9251523e51f09565970ce3702b873b9c554530b14b97c9397c6c3e65557683bd547c4e10a8af887d3913c3c22a4eadb9809223a8b8c00a2b2e6421e22c0f811b2562b1723bc874bbb15c8220a414a593eec3df7ab5cefae27360d823bd1d697d4c2bd9d5a696735f1312276af9d43cea2b7539b5c39ff339399087730a76de81728a036b1572d4faea9ea4f222469e812d313d79aa32b5a56acc4cd3af14a59bd3f391f90443f02deb8bdf3450face37cf87940a71c0cdbb39b4d7a383ece0e79cf5f56f5e9107327f105a1fed83046f5d4e7550e7a37d64a094b2f58b3338f3edd17340eba39c925af8478247514ef54b72a49435a7679fdcd22ff9543bdc50464549a90e9aea20a64b2a0f48bc000a9076836cc72fea135a20ebf113ba6fa7078597383b29dc4ee3156c9454e412350250845162862430a62d3acbc571f7abc40d5b3f9d73006999d6d7881bfa6bdaad3eaf8c664060e840024b53ca45dc8bb333e79c5f92d89994d22262bfb2a21b75c39dcf767adce7553be60854b53a39d732d73c730d34d2bc3dd4409e1eb4d65aabd75aabcfda419f0c24ba817e684ae925e286fe94d2d8dd548cf90144c5208aa728949e63475c1a93b148a00a062cfbcc256e789f52dfb938940477ea86ad6f2900d81dfc31820690520613b0ecc3debd7267470217a9f7798e413125eb312968442938af95db1eaf0eb55f57cce55897291fd670feec02c58acb312e69249732f78acbb12e67fe635dc6fc8462ca4fefe92006a3772c65074527312ca462574065f3a393ea0083db1cc23d728f5cab180d98f817dfce8eb94a46bd6dae9a1d84cddcba8d5c8c9163711c0b0850e73bcef9c68363f7853fdeb638c76ccdeb36765dd7ba1cd73f63e4b8e99ced78e33a8eeb3cb6baaeeb3897cbe56a79e7ae96f37b2d707ad7b9f7853fbeeb3cacdc69757eb3522f739c4f298a91e438304cfa28d2b74f46ec721ed77cb8b9edc1814d372ebd26244e7403b2004414657a7777833c3eaa4faf5382362db0b51a55e79f6ea479cd6a5625adb5c64cc66de14ae77aa45550032b7844a987f56b8d19d8149d82b3851922752b0c7e655af411d7ac59b346e3e9d11414d23fc1d957be006182f005524f8ad45fbef0225188f5f4e84d06e15d48a46cf8e84527a09d4b25a5a0fbd08872ad28d1a476439dda9cd4eb5df2b48916980008904bd07dbce7d8132e7ce8403406cb3e19b39631ef7a8e69813d7b5bcc39e58c6951c38a35e1c211d92a93ed3cc7b66cf1dc736c8b980faf969813679c506a9db91cdbd225b605496c0b55cc89a5e9258c5195f95a69072c371050cb4cad404f411d20b7095a5a0049d1d2020849025159c518638c31b6f34f536da1caf2ad2bb77d3ec7a896f81895d4ef7c615b39c4aaee14d8dbca5779a015d0e7981254b2c69c1e7c48936838c190859fce94bfeaf49b1f9552ca10557088879b076f635729e0c1b38f648e32e460c31ec56f2296be73eafda91079f06fa051f4ad8344fea18e54adb7a7a3738e73f678f05b30043b2073e1c75fa6776abef3cdada5dbe663fae69d0ff50ecdfaf6752e3d1fd563d860e49fe89bdbda1e3d298b9dc57402bce556172b529fb9f6c38421ca4822c993b9fbbc4e48c10a8c120d2104b5f16266ae2e7998704207853b4323005581f2d46fd009f414870410bce6cd8e94f974100dd28e94f9c8407b0d48b2c1a0a763f346482a22e332cdfbab499f1985590f0de4f1d1ae79fcf6fe64777bbbeff4d821a63efb280e910fabb3c5c9bc7a4882353d9ac857b7dcb0d73227f2b1653d635bee71b63a273df7795ebfa4b7d65a9eeadb17313fddab41e65688343f3d1b02c94fb7d3ad4d8add7634e448bef59675231e1f9a53d7ac0fb5c6d27c682c8d73fe8d037554df7c8372fa69447debbc7ef1372e3655a41636c81b946437f36289e6050b4c005ecbc5d254a1a5c992c68cd49c68c424b9386974f8f07a12ae24543e2c61810d6640f382551668a0dca0290207aaa38b2b2670c109acc8a204920c1a181a185c30e7a4367831039717572a18e3c594961747b020cd11346690984b64cf5a6bad977d3ebaacb5bbbb6383d34acf704ee97a61ce2a8cc8e274458b5598581765cee4103b8343ec0c0a625cd820049625b822880a0d2eb400b3e265cc55ac0ba6d8191d803457129ad19bbdb003122d6048a93982c553bf3b2ea52bc0e0e20b0aa0c1028d1a22b278624c8c0b33128acb48520d534401f3430e5e802142cc016678a2e90452569a9cb0c255c455e4081947e80e318e4ca65b30dd2d9c8e6c81a40807060b4d11ae0a971934455ab1cd052f5c114a29a5368b8da2889bb1e299594269ce39a707926869e2294c0ab84c518599a717cc346d5cf000c6063aa4a0881998b4004393a930646e1839504a29a52e485264054988c4c089145895f142cb8059aa65a8b232501cb968623cc7b868c10c5cbc40b94c94164ea899724e502949fcea9473ce18172dfc9cf37ac1c1736c8bd8165f62542439a951c2862a4e68601aa2055fdc344c032c5c8874d122aa6909114ff111f0e90208a80b1ab54092450c5b4c39a7bc5cdcfb1cd3e208eadd3513f173fafc9dee23e339a6c593cf9e635accf0a103a5b159d735de3237f358b32ca605d3d5c2898fcf3533a7cfcdc2c7e7660164b384aa4b959832555452c89dcaa99ccaa97c1c841b36dcef8d91415255c529f5eb6271a50437aa2b853b072b4365c5928175032b0a8b0aabcab7b39a785fb088b092b06060794f785fbc301e19efccb77b5b3c295e10de154f098feadbbd27ef054f059e0cde0dde52774567a6fbc223e221f9f64e4c17eb98e89ee8be74525d0d1d0e9d942e88ce49182ce45252ea8c28752f28752ae89aa88982855c4d4d609aae683293a60b1516722db1849525624b3061b758186c0cb6068b835dc291e1bae0c2b046ecd21825382d5c141c18315337b047712a569c93fa76ee094704c639dac94e0c1786e7925c2c6ee85551515151511b155515551555155515555594149a55555155515551555156556ace8ca9aadad989fad0a9a8b6a8a1ea57d3e0861b150cd641212b6a4cb8859d15968fde3ec5741077105b6121d618d698186b0c13ac314fb0c678a9326360a1961225b30625382891a284a90b166af510c634325fe8613239a385855a4f4401e68a27ca504561a1561a2a5662ad3458a0c8242c745d20619031d4e002246158e81241041922ba20220c22acaeb0d00573c12871c168b960a2b860aaa25a0616722929dda01445898ad277135753531369ea244d0d43539a2758c8b5c4125f9608b3049925ce6c91c2422e322e3241b8c85c719151c24526bec042ac28565454012b2acac08aba811505e5dbe352075868a332f34524b2a550c4425c65a2fd8b081f0bcd2aaed1fde1acda49c035c0778daaaaaaaaaa2a4e892b828423c2c1ee180e565565b554e555528883f9933bb91367e260551cac8a835571b02a0e56e5e320b80dd7a97229c8c13818a70445b26c9614c08936792654c96aca2869357764a5aa541da9c8dc3056c9a85b6267d42ba3f17075757575757575757575757575757575757575757575757575757575757575757575afee156b383c79c2e48ac995121667b6b4386699cf59bfb894652c849a6b367e90f9fc2892e891105d881f4c2d36d493981826cf312b98c4ac68e10e11a9e411f322b9f11229a3b19874def17a3b12e768b98e7bd57f48a11cb041ae3a5f7d82a14e07c5932798de52ea15755db5f2e307c49732048197814080dee8687a28739ccb14d1f12149443a9ef38d40c75d366ee33a3a3a6e248948073472e336e074e9faf8e7e75f938eb7743c507e4d387e830326c97123363639396e6324c7c68de4388e1bb9d1712338370e0229a403ded46a736f5bad6379eede272306b773ea3a32b0f37e71977561ee268522d10ad9d29cb55feda14f8823086d2abdbdc73b4826d17123393a3936aee34970dcc80dcecd8deb7892186e0427060e8eeb24d971233176743c468eeb804976888ce4b84e8cd8154f7c0514d7f972be1a03e7b3f92875319d312b9e50d8cf09ee98624bbff8a5131793e5b63ced928b683e248948f3fa8d400b29d89ca6691a6864738ebda964cd370d4ca279d534af5ad5aa66e34f6079caa631fbd85e8317cc9d8e85635aba5faed3f572bd5ca7eb74bf5c2fb12bee98e83db3ca75ac2b458a18bf5613b70b13a6e9a3df1863cb9c2d73ce49b358182c344dab5b0e11db711cc7d98e6301abf33ccf63b5b21a5cddbdf7ba6c6c9a70ba9b9b9b1b9c18ac2072727272747666121c70c0010732785c3198d1f57845b1c77b7abc1d7186d701c7c2707077625578e9c2586eeb58373618e3e46aca7dcac285960d1abd2103952aba14e1441120b874b9626c98734a28c850e1804c1617d450149061eac83c81410d029e63565b7cce73ccca4b16a3d90efe2ce210a08726b02754c8a0d982b1c0e28a0c2f60c1114c68a03467f7944747bfa49f8e7e49234fa4ec957035b077480ae244302abc218e1b433c6edcb87159483e11032e4ec0a250c1845012132a29a650f0830f423441d4ee2c94e48219beb8c196232de0300351fb8b8522e0820ca02c49410321c030624804d675c51ee71c55019ab303c0877350eff9fb8300100270e33c78b87a867888c0c3d53da0b33afe4ed6688171f95bdeb97c931d37bda2db38ac682d5beea8a7c30586f35d6ee33870f48b030f7118e0658d97df4be7908397ce51013d1e662f3decbe030fef4fce81e3120c8180f0d281fa85e30657eeb88143cee8f946103f68e7f9222c2a758de91c80218d0775c01c3006189756e09ff6bb05c7a5e37cf1c9ca0d01081ba8780043ca951f1600e3c20928515a00c585c8e5ddcdf7c2b7db0075902cda5cd3e3363dd2ed790aff740975fabcad6d3be2cc52145e5c517131e3552638c11296175ca022c1f8e4c40d634fa2f9a35f404055925431e58930b01660c16aa4546902a6c309a8a0d8cc0aa0fca0c4c92a0b19780a8a16981a1d64003352c2e61ff3e40d0ca263fed190df1c6459a3a3fa65c28f344396604f7109473d0d1dd9024d0c655ca0e64a17492940410c885801a372f25482922ec6cc60430d5e0006039470e1c229061a707185a85dc629ed3af7a36294e434312a883f4ee997e5a1961d78d5bec81f48cf3ecac59b2aa183f6daa6ca8d1640a1833a567d0775140b252dc942c90e3848f990051544ed718a853a3243a0d122862f9e7041d41ea95828498629b0b8b2d464e5064c10b5c72e2cb481195ef044124b74d0520451bbece91e2e6ca4dd92d2fe18d4ba21c01acfcc273a893dc1823f818558821cbf0343b9aaa9a042d8f0060dc07338e35906691b171530e79cce7d975f33f2073306d7987e83c6cfcfe089f3eaa8a594c653b75c3ff39714fa213bd04e5a2b05c3182f1dc4e19fbb552dd381f373a84bc86eb01c67d788d9a7545de31c92a537653ed4d400d4b5ef4825ba79ea7aea1e2380fa85ddd92f5ac45787cb0024de60d72f23b1bb0bcb6dcd5481e677aa08833b60b96fa1f4a8940d9675392a19a21101000400041315002020140a074402a158341aa7bada7d14800b8b9c44704a950883510ee3300c32c618a40000041803882133425413071d3a0c97c4dcd7fb7e18a0db6be5de7aa9f947e4840a603a9a692c0c9b368d90a2dace210b6e6fdfdc555e2ff097daef8147a85407c2950458e7d9d1e1ef41b525e74ae535f3c21b0bc333d44acb64c4a14c02858674b87d02792b4fcfa4be89f832b8f72f6d2f040ed8aa4a0074572eb4175b802d7265c47bc1ab04197efefce85540a83841383b461d62c3fe12e21fd622f840d1c407be59c4ee5ba2c7c3fcfa9db6ab029ca4d35be4939b716149592c16318998fa87cf9bcc580cf915e656af559ce036d75958b0a92b74e82bd80568dfc56d247356efe0a031d244cbd45937b6ea08b5474b69a5d5adff66f7f9a70d8c2fe1c4a2b87c9729eabe177f8bb14f74f7f0241d42e44cad2e0876f3105172bb4a90d6695f784761fd9fc7303ab1dcdd42e476d20145efcd1a3b7ffd1662feda0bfa26e6317ae237c7545f34560619848f1d8892ef725da7422f59ce952e7f9068f144ed13cb9b384b890230ec0ec7a0e3454053b8e50cd5f17c2f333331b336506a99564473a34768ecd6ec2a5eefc4d99e8ec6e0632694f6dcec783f59b1b5ae81d24391bca203011454fdea6e0779d0f69294d625c9229b21d995fd540a4ead0b87b3b13b63303f15988e116e0d0545cd11ae1e5eea5f23452761d3fb8801c5ffc29f84f5cb7e03fed45e9614f026a5b12b9731915e441aaef692c5436dfe3876cb9d4f65bfa94189709ba8a08ea77edc5c8decba9dae1876c7bc836eada23684efea4a0646cd62af0217835d9369a1fc802edf0a3b091f6650920c0359e2374b6fbb75883530c0614e6ab99fbcfe435b429f00aac5ae7bca8837518fa09f81b6a5d3f3dd564df8ebdde42632e1d1212e51b09744a5f107deba6c27bcfb86aa889bed33fe0a2e05fd99c7ab5281f8233bf40528738f2ef4443afcc2354a237890fb61be0a1d6d1f986ae0bf6836418b1c6f6b91ab8ee0a2cc73032811226080193d552392c3f2e79184f1c93ae37eaef3a830c3ba2a10f52af1dbf8b5e77721715debb9b4960c316093e07f9d88c267559d24e8ebb4006bd4e9382a0852eeee2f88ba0894528d0f3366bc5971ffb3fd07091154394b975ee245b2ab5ea33470593698e04a05758836e2e5e916e68d77bfdceda47dda119e4606085454da3b453d86626354b61b4829b53f1a67ebf9f8dfb545a95faaf7dfaa01a3a8d6b36672324c1373ee0e8db65e01a67df43b3b48dcf17652b790df2c57e38c082d0ceb7d340eb6e2613f42acc1334e13c725111782c3a314033f82064d286f7f3f3115b2740a3df86b1f3b68062a7d66608d99b1bbc0ec864bd11774ded2a47ee95d763b30f0555240502ff3135d6e7b6351c470dc7dcd07fa8c7f62c403a9fc6ed80407b812622a367f90439ce90a09255607689032ddad2ad577b4d2c4eb52b6691c5feb040439413821c876304e7f129bd83eaea23482a3dfcd0b93b86d49da511ea52108e9ee3d92f7759cd5a6dd58fa553219cac59a770af244f1b8975474bd2f7c9165ce0fc191e1b81804ad447034e758b51b562003f5090613e11cb403b847eceaf9dceecb8cc1f4dbf2f518921313eb9dc560cb2812bf0d9712859739d4077d7fb00d694a550d686c4cdff15af174e22c3df3e5c93ddb6dd8cc5a318ff955835119447470f524daaa79a30a40ef75c17b1c7df0ee43eea8bd65e29254edfabef6fcc18a1375ce6a6cfccbeeced1433e60f11c8bc35e2fb902f77ea0a8fdb4c6ddf121fadd9d73ffd03a3de6dfd8319bc83293e3d2f27f1b1d1e448b27e21b8fd4f7f8d6dd3957650e9dbb9487c239cd30a3899b41e2f5a5218dded4a4bff949690430270dba19d2b93dcd6bf28620b3fc6848233725c99f111bf90977bbf052a1acdd17da89b70e79b2bfd46d4d8e2636a4c8e1f1bfa1b84ab944e6b5db9ebf4e7502574236caf0bab133eb3d81d10dcbba530adfce83bae2279aee46360819500a0f5278f8018f9b1745a34870f28c125de95587080f9c98335c91980ef25242c11326ba4a13e9af3a1fe0aa75b1502b8b8bebd9cbb91adfe9c97c78dce0c85a06efc312390c8a10d172aef87068da018b7c94704038b47e75f1cbd15d0af07a2848222ffca1c78e07ffe3e7d1c7359637e41c77ed9c6f5ca354c8d69a553ed7c48f5afc72f4748dedbc80aa92752f8fa2163f78a7a04744fc723e251740ff1718232c81213e59b16126c78292855474778caa109a0531454ad9c168e304bc01a32fbd3eb8a51b1276e64d4eac02507aa5a1b48415c13e6a9ca7e6d549e3df92a18660da37cdf4acfcda3a6ee2940883a1563cd7bf7e0d995bdc761283dc64bc9c2990a0f08851d5084f6da83fdca84caab76ba002203e4a34fc316b80ab8c4a49790acf76e11d6342ad15c952076616e7939df9b67ff4b61df35bd3ce532755130bd392803712f5bf48e118f27a3770b8eef66a6c7052ed4e4dde1a3553a2c00e0398f3015845da15eff85280042873ac41027a28c59000e71aa714bdb21ac42e5d10702452f321709e19cb89db5784dfc3c793305f516f2ce4a97d7b9899d2893948306560d2d9c51c785a6241edcfcba2aa325f5992941ed778e83721e1519302f4da90a338b66af70aca604e57914f3decc18d83d12d0c4efa818ef4cb993c674c11282769754b5ad9c5ffed933d2c3d692ba89e9f418f9cb359938b7dbfdc506b46a7f20861b2d67e6c35dbfae8ac3c729c008dfeee08421bf297b7dc48a08cfe7edb3b4cb5cd5000e1fbf31c0c1921093a7256fc1c4e31e47c201a274a48e008f5f58b2d207ca7d2eb6de86f88a8ba924326b92cf8acd8959c0e918a12d52ab181598abbd8e3ee1f454ef9dca5fc428e5e1749bf66d56a5e9ce297c6b18368869dad9a0b9466b877e6fff2c8b94907909c1c6ea55aa6366e160fe49091e8b068bb915e462e1ef5d78d5acce9af6d87dbc1981ebf949c7b1b0f71dd9db82d67cb1c680be64f5f373b25972bab039234541f6a22b592136a6b9d505b8b09c55a4d2856e54469552668ab7a82e2edafe4343ee8afc141bb0d2e34d7f0a1ff8d0fcd6f30d05863838610eb3321378cb9e5005c9156e3d269304d0da4ade1f41a4e8b06696990468da6d370fa351ce9bec6d3ace118eb29dfa1c9dfa879809a14c003aa6167fd92e4b8753eaf0d5a4fe4a1e8049b3a889b44aa21506f80e1eaca6bc6805c096105bc17e902d2ae0df113727bb27cb223db14394cd0950bb1fdc9905162082c9cf6ecac7f7cb5115ac3d0b9cda320bc4a81df1997cbf5fa7a943b7c81f0467fa744d8167f281d7a0c13bae56ea79b388956bfb81c246a2a9503c3202c4e1e9a1b1cfd3a55fc1b381b9cd058bb6faa28964418c84290ff52490d627cff8f9b5321a588f0975ef9b2ff97610fb3fb7b4795e361f6b762b2e66e1e138eb28adc3593a5b8c009d299811333f010edb49c78b2178b708f9abc3c586eb6d040a40a21692e2a7a414222a174b768760e9a448f31082878cfe67a40fa481f89420fca36513a4bb2ec4d06079486de066194ec05bb14f2ddb386055429b624f241319246f9cf5b6e204de873fafdf2b3416c5460a699d686ca079d974f2c7f34e757f72a39b9b9131b48e43abf585f668310d6c4e15e2b32561cfeaf08b125e77c82da615b1231a2dbd6cc5fd79c4b6015b697c6763c1ccf5bceca8a96cb56a74aa5d3d2e4b08736d12b8acd65ec9b009fa19668ac408c0207ab17a28a82aef6bbbb04dd14ed0b4d40b7e0b56b09846dcb7be8b9512fc590056006ee065a0d499e4e46b22ceda3fc551cc57ed681b22b635e461f6278bd7d0e23a1c4f24980613d9710284322f8706e0e23fff7bbe97bca568fc311b73ce36a8dbd012f80ac8d3337df039d9f7f5b639a334e8d1f54f782a736dfb851b992d0a5e98507efbc8e0714960a46d209af8fa20ac172458b28e5ce6fbb00ad2ac3293b839555aedb590040949d7954cb0b8d8357522f868f45d35dad1f24c9edb03fdd5b75412f591f7093b28b34175f63253d55026554b247492e705f415906cf2139e7f7a5dc7624cb7ad0549cf592621417d0752a94abec2593c1d7f0117b79884718bada07258234bd18eb834641317c99a5f48b70316808cf19f478ec64c272c826d5f5aa122964b472c870081a0504dbb4a0a78df4cc52167a0d8f06892e5eca75cae8fde5b691d2421c32b39482076e6e3520d52c38232a12d9a07fb8918bae869bedebc2c48acefd510c1ba249d8f4adf525b5fae71d808f1e43088058727f8fdf6373cf5851c49d478f554ac66a30d8dc7f24fdfa151968755e8b501fda7fe171c822468f047ce77f123daac0fda1c63b005aeb1eeda061f66356e1cb30a13820f34f91419f20a1b7e3bb6aab361065cef6d243404fb2e2a694825fb3bfc5237114f7069a815e6fbf0daeff4b2d98f429fae1496aac4fc3b19ee1987a05eccad4ba32e04ae5a659425ca4605d94295e7bfd458078fb050b64d5c915a797785fd55bf7eb96925a02431d37beaaead5db345253af9659aed7d8db2ba4670fb05ac61d5aff72d4b54cf596b3becba97bb9eb2eeb3a9651d732d4bb9c759677ddcbad7f19485de0b20671a40a3cdc3ae0f77e184b696a347d0dd3af81741a4b4383696a94b686a7d5701a1a484f239de66b7cda1a8ff19ec21d3abee64256016583cb124c8e1d43fd3f2816ecd5a28cd614ba76bb449ffb109ff9541ff5291f7f8fa3f98f2c79018bec3ec7891b52707cb46f79960f74b79dd30aadf4e9db1d2498ea6bd8890bfffd7bb1ee8e44b18e9e4f8af43948a21b2e17e03f95c222c8ec08afe81af4eb4ec74af0426d7ad4f307ec65d7fecdb0f96de880b1d6d53d33f8bf9d9fc114b9b84786f477e3c3f87517cec390fa65f410abecd2ff198f9db7cb4b5ad924e39b9e3f108f395e127c7682b974e13f88410aff8188f8ce37ec0e4997a854bedfd7a89ab7eeca0548d59843e872fed82b558fced4557f1cb0415ce3d7200e30f23ae420beb99f87b7515d2f17ac41efc9024ccc8c4b4fd9107cbfb1d4834359f933cf3817490c1a021d049360011666a021b0982ad6a9aeb6e647730d6b66750d818157eae097a0681c2034f8cb14fea74d1846fa5942c45901d9cecbf0a550ac749944c21c24f8ddafedee5f841ebe52a83a8af7130b8e0ed02abeb40aecf8cddda14e21ed1627cd00e71c5bff52050256b3f84965ae63c358e47a3b661faaf1bc49392471287009eb2ff2958a92d484b162b46986c6000943b266fa290868453e455b50a4970e5456b4c6be3d432e00bf76b60c9f9205ff09a6f5bceae198a24021968f72dcc1da4902ca259ceec266c92ba268dff110b7f820ca6aff363d79e4214ad7eeb62b886c693f59a4aebbb917bb7c49aa82395f2e1c1cb4d4144590659cf5b99d87bde4a208d3eed19e8a0bfea0b6df2be5b32d26cfe770bedaef83f5acba6328d1bd4256c4c46887213b92e33677426ece3e850d804fd98fb0efdf0a13284314e499f1cf66e90a0afd1b0802453558121dc0a2965ba518a4d23faa229d90273b46e2f0cf087d3a86512c37dca9f2638859667c777a9e2efdbce2ba631584d33e9273091ec6f32369713e6287ab170ade06548fe16bec94d356ae37a9a35d0e4105abd478ebbe4521ae424e315a6d2f42840f7b3ab2d615b80180bbf7364c21afcaa91719fc57c8f064f0a5e80f7d796c58ed31f4f247672a841c30d237d2881d4467084004db798a2f11e6ae8486a2a6882b41a3218e6a180dd1b8ddb690e30d7fc9080ba14a0b1fb3216fe5c6b34bae4870fa8cde6e01b425d90726f204df73286b5eab4c694ecf278fc86631b1e32e459baf0c57640d3a88214eb72de0b15cfa401a1a8fcd286242a1921437690d369baf2cc19acce34c3b5cef49aecce173bebd3c1e3548b20d82bf72dac415c7ac8808f1cdeff99fe3e04adae305af0bf50cd282d2ae0629141e225d3504c5cea9abc73e16e51d0c8953637c2ea4da5c5b928d2c9305de02f96986f65ded1950cc15ff1340f4cea9fe22bb50573b6fed49845591e5cee5b26545a15f42a50e664f0cdc39b1b2a0398de7bfaa25f3c50e6296d79219e0d1b56b03e9eeeea86136786590721c46491e90a30e70b6f71a02cd198a20b7eecc88c3437cdb7b377cc6ef5872fee12d197cd37d1265256e8a3785866e082bf7830c672723cc0403e17302d920c371513bd3f8828aa11911acc76c8e8725630b38984121050befd28017ba9e4d64a85da23003e08ddc7014b8bbfe1847898938f1c7286089ba2b1e62c886af9f740e7cebe52fee384db83a05114ea18efe218f91bcbb6d8270d30471e5264867b9a0a08847d6f956f078ab030833e753ff4c8cb70dba643c2bdc0bdc212a0f005461a686b4ce3314069607e2cb8cb0166ba80f34a103fa70a1a41ca9f43a0ca11f6c31eafa0345d48490c3dacb67ffec89097f0af7ce6dd4ea36446e53b928696bae165558540d453206832c45fe9523cd8d3e5c73582bdf31ea68f15c4553f058dc86c2078f593f1edf9ff93606748d36c7af31ad62ccd001dad3684168b75a35221c087192e43573832467b9156258a91467a9807a5c907c4bc75c6a50c6e90a42cd19e1c5f26c2de9fb9f905c96127f92be85ea95344670b71bb5825710120e1dc66fd69769268be36adc1ff3f6eeded9797446d36ed987c39922585cd4e8d0e3854864e5982b6ecca30d49f76c0e23c59484e22a25b5e525715ed0e44119a04a51d149bc1664f2961380a88894e7ef5d3c86fe7c1c2298748d2e8918622c0d49ee66c68d03d527088b215e800fb7be3adc000aacd3ebb81c328b347c641eeb2a2f68f05595ed8e090b82c6ea12a1c90ee14e50b25bc147429063c256595d048877c9a2e87550809f0c4dfcf1c8c968bb44ae87b0c9c24fa0d8eac02b69848157b60433188c584c526a38032cb2732ef3a6c37a359f364da8e1500962d2ff3e040a2eaf637af4fdf9bfbf3cd0ba4ade0a33c101716eb8c6add0a0a80168a733373229bba2ddfbae1fb2d917378c25a1490829d9bbe403b890c56b2786f6546de40c3567b7f436d1fdc395725ce157e0406a314445202c0bfe3b828a71e882241b949829792ee6b54ce841441b458f3308c516aeb1f4e09c61b3f49f043975b2f2ddfae226aa6af1609233623751c5e3bdfcaa23c8d1dccc6800bf025e13d413539c3330f371aefe0d708544b2f542b6bd46ffb7d9a7d5a01e89ac42f956815e8bd8dae58af00a4f4cc3de9f08f9ba0440dbb110658c4cad5a4efc5165df678187bb811444e073ec87a27508151e1bd3edd42e440112e5a240073117451851f8bd7fd13c4b1cb15f7606bb5f60eed8e1e233a4de1deb56fbf74c93ba4d058eda403fe8f73a4ab8dd102354a2bb8d3e1afecca40869176bbc58bd473526161e16de6bbf8b2972bfcd5c52a255445b17efe0450fe5354f1022d69361b4f96114389f44bd2d1672da8399e553baf03533256e120c60d19b0b034e3cf81d5af1a14ee66951260104471d1bf13cc08bd81a68644621b54663e48a7bdc4daa9dc30650eded56da4e80e188da2e98ed438b562f16dda2b2b2a220d20bd9823988247e437d470483b83eec2b57190c6cd71f7d8d05e44ab5a793550cf283b97ebd45dabf1a4d003ba7a599f87e6de3ce608ef057a6c161bcec3352ca0a21d41d67e1ee1771a16d95d06f62ec4e421ea78ce82ce7898b64b37907262e2306df81dc82d9a386ebaeee6d56c742fb88ee697a971ca6524083e8c380add80f2c4da07a07352ce21493df81bc0674bdb4bd4ed93a1f5bf014aaf5cf044105278a99820e791ec4e0e152d59e41e83790cf509aa240bfbe89964f787d45d25a62bfbd6ffa237f7a4a7c1a6fc523591e863bb45f013df3fc29c8fb1144ee3c54125fe4dc9a32b280c2d9c1530fbd7c113786ac0939263612a8c955ff5a18bab10f2d5c787f6487f6d5d91212b256f9e83371ac2f26b1e6084840e6edc173c24d63d1f9064278c1dd070317606317cf4d886eb291ce7795273827044f4512440e2c09d47772d4bfeb0533f3f23d3c7662417cee382ace8dc10965293599da6071492f4d7ab4f46ea8293251f0508ae687ef76f76898cf167b9f0fb8e43aa3f2bfed850ddad28e667b745d6626be16faa04fdef6334b6a55a20bfb511ac38044e17bf73197d5e1178bd8d44b794821c6a94daa6494e351600555005cac5071f6638f77f6f2b90a495eb8863592a112daa0760019cdd55feb59892d9309d6a78725b3af783a50b1120af38e7f22f74a144087522cae9d6885598674d669e16bcda4c2d4a582cc34d71aa752fe792d7c79d4da0c9d454ff636d373643edbdfa7806072a8d01718e46745fc7381f16cbd772bfa5d2c77799058f89950af1c6f8aafa2df8e8ac65dbb7fbe326198d2c9a461ea8cbeb0947d7f95fe6a3581e76834042613f90f5b744495045a8db2a32c088122dd16abf6c914066aafb4caaba86bc2611081942be52201baa9c305eb8228110ce92f9937806d4b70c23303d7f0a012fbb63ea0009170c10eb75d2d4fdde37a8d66144eaccf3c2831bfceec342d3248c100abf048738d5a3fa54270edc98e77d03b38e4c155fc7724c24cc3679161c182d6d64b39bca4704238351bb6a9878bf6a8782b3dd701705e91c42a5e643475c97b9f4b4ea3b626307e3421cba5b110d89ac63a499ca598b6dd835ac5748e92f09242ab531f510251ea8ee50d01be691837f86c727fc026855b53c7a70b6e17112016bb1a41d26ae7cc4bd5d4cffdeb1845f2297648c706c64b6163c7656065f8424ef8819300c3b18234a6aa4a1ddbc9ef82f95aeaf12d7691cabe2b60ddd53b180ff4c6b803e838ae09972c30d1691982a250293f3aac919b36621d849ea82ec61b9011fda2d68a1c4352115789437312235dd44d30f5facd70c4cee88817f303a01e1a82475868c1bb8f30c661c68c720753b43d8a85012618818010cd600df8927eb7e50c0c52220e4610fd497d0a1d83118f61362eb85d3781150144ce26ee6c714cbc651c1fc4666877ef7fe55e01c039d043daf3ecb1d38e57f812feb962168d7e5fd5f9461f9174d378d26e5a4960d5f556cb9757d3956f16561f95fa9406427237c35430b5d316412c8068bfe8eea312713b98b1af11ea282e31f09b8ead49bcf9c4d6bea314cd2ed1cd2775ce3fda85f877ffa1c747a613f368376941b81e41ac7c517f32fd69db0ec22b7a3f4e31a74a0848eb83ccedabc524d168ec13070b12920169d13c7decfdc9e5baf26702dd4efd7cfe05ef6bc932afe894709e651840305a958bf973ba774605759aab421c9afdbdde10faccc9df94b728beec96d13cc4b9e9da6b4246db74b3011e475fb5cfa27ed5cd36c7e54e33e888d6f8b390b01e584d076546b3f95287444d24e6e7cc3970dc669ec90eadbec7162258491d0e65b51e3a95fa96244a2313fd42206246855583366428bf608646618243dc2d900aa05f4983085990449b1b652c4149a8b265609ea456eee0e8d47710813bc199f42ac5b1c71215cef7082d99bc7db15c82ffcbb84ffefdc462671c27223eedff49e96c1e056a922c4d88f077809a88183aec6ead7b55648c8037ab122c6daac31a6b6be1a53e1795de6332f701ec60447ac20feab567a7f6ccd01a12f4a9d555c90fe5dfb8fcd6052efb5d4ac48775b2cb166d970144f0f58e83543ead16744a121f46b7ad06ba0aa250ad1db93334dd973156c8b38f6541b5dd935802885f175217b32abda6159d9570e9949ac2196a3746a8db941d42b7259537fbca2d53d3bc303552d6b7e4487b77338a689d8090f09b3ea7d03c7b362edc11bec61a2fa88888565eca8f85fd8104809331bccaf36e2265e3c046caaab775f296f6d24eb7f3c8d029254993b78338a894fc1da4aa11f4a6df6012b17c523aeb8dd77b296a7e38fa732c4c5c09c7b3832dd8e07c447e7644135ff96f33086d26023f651edcff3a43ab443d3c4068b54b6c5c1196ba1f312f4bf766af294106ccfaa2b8dfe43dfe72e9cf7afb03ed819d510058ac047eec2392512ddf2818b6416840d0833985a755c20df39230a8be864b853d09caaba51facaf88748d9e98f8ad4821f52d54323aad12d4f928ff03c655aa52f92c176bd43d570d7bbda23865c60282869d285c3661a7a283982ef5c50dc2a1dc83d370b7a2f1039e1c389807df65fc1c22c002615d2517f5d7b48088e7589e47ff99e131ad122af301a7faa92f1fb96e17cd7a0e2418cfc3e742ac1113b73dbb7569dfd32a41135229697076796d7ac623f5708b5bf39d2c7c30a1f55d8f376ba6217f4c5c8584f1b2328e835354b61194de687ce313411a8d1e54ddc0fab44a28ce7cb04383afa286dc6275c6cb934712a65888d6aa1b5c8df53a6412553eeec26620bd989b4e90c7413815e14eab44f8b71b55a18f76a4f8e4932e8139f216710c608ad90bc28fd371a1436f96231574dd89e8bf503c57b192103b31d95b90fa46dde432f240a159751a7322bb839fdb6648297ed99853eef43e9ff0525e1e3081a152051b9a01c45fcd3e2d3e397f6715f5fc561d8c7802c8145295bbb2087655dfa8959b296dbb4dd8b2fea9ff6cc8fcca1257188c91619231aaf99577798a20ca82eaec2d00b577012ee05c38ad1e2822a8763289231b25763c7dd081d55dcaa1339bdd6f3389be565af829855cad47b92f9dc8a566b12b350929ab9b14868cca09c29bc40e6a3f54a140673eb5216b49b43bcf7f330ecfdb085b748fa5018d81d2d938c8b33f7c0d20b47b04e0d6a745c9157e7a44e9602f47ad67cb858980bb2c197a4e2bb7763dd0e1069750a896233a0afca0626edb7143ff8ff087e2b17a2401f835ce8e41fc58285651c6283163b81e314e0451befdfc2fc8cb6cda71a3d54abf2f338db098da8f5d3309b85bf9d128234157108bb8c251e8f9c577119582d14dfe8ec48a07015db2432213761e990d95127c54ee98eaeaf78f3bbb4adc855ae83e4b675dd66bf296386db0b7c3718d3bca0eb6792a7d699bd4059e77826e7a41cde06068bb5d0f31cd775c0eda3748f0af14999485d8080088d495bcc36b253c067c0d8c86044df0124275d026112aa96b643aac6f435de57f067c5dcac1ddf7fbf76b8f574c2fa5cf66329352b57108eadf344fab386ec4ea008b9feba2510690275b757434605b89a38d8431479a41061bdcd5b355c3cc9e86269aa342ff1c4393525df809aedbde208982f4d8b812dde685362770ef2f445aa9261c5aafdef5e886594f2ba9f48fcbeb2143fe2a36524b9f97b8b1d6e24a9c7e38be77bad1872089a0bfffcd367b993d959b56885bd0047dac72252efab2f56445ad70b0086b2c7584948d109e6e8e5e1b1c0b2b98070426382fc33d9cff57644bf35937cc551173acb9c93a6d852319d42462465612c81755292406af6f237397bceb7f3de077157e03fd3194f5892327b67886845c2bb09312e163ce8d77e7a5c79b3e7af90564c36d110f2fa20755bd34652809bed254a1958501d67a046c132d87b491350156053934c45dc4b9e7641af6c5b2d026336148afc13411d2e2689a8482c3f446cc48127243605520906a445e5657c2bcb02abc4d8820de5e6155e8a5f0d12cb39de70c4462119982a053de2b5b19d643fca98dc3aae81c5164842595338a16d0fe7f40cc1d9814d873d690c997ab042683a2bc3e59f652f99c254a16e8bf291a3ba8af2b23fdb222d20b949b5af3a0820b304bef6b0cd64dc070b40a04e2ee6e8e9bd60e0fe7636303ef8d7826a575fa727b0eef660c8f49a45766170b82f63c72d69789dec4c00621f8402a193baec852699039a81d59ed609d69b48a6a24ef4be3703e1917478726a7f0be352f51af7892a11320ef5b875034b9feff6b460aec2d4291386720e522f1c0f40a9cf18f42156e7c8ca27a0263cb4d97f2dca0a82ddb828292b88d1b40288a004ba51c5ddf3313cb3f9c2d1236d0d98645d23ad610683b4f6923c214ef3da80c9e33546724eae6c0252358c756509c548e680608384a4beca7e50ecfeb05fc0590c3af1c048794c14bac173c8d4118f3a57a6d855c63edd53179c5efcd5b3491a0c6c2939a0883cbe3ddaa9cbca63733d2d6018f51ba565c692832fafac08f7b86ecb04d5cab43ac3fdf849d4be8e148744a83539e1e0f15333b2213d97b76fbd54ebd8e310937082df239dc3dd2944dc0488abd61f2c60f56595e79934b1410d5be0d070461a9dc6784144eeaf63ee7b38703b1f49db2dc6e29eb6864037150988f6fee0145e9c08d728fe0532deb478a6157be59a52e527a61f460e504ca0d7d56537631a94ee54342dfadc8354ce9dd9c4544a360c510bf4403ee9e47cc5bc927f1b802a08890a471fe007ecd9fe166c96b120390d46b48c42e5afff0853d0cafc3db7bbe890606db4f1f37dd379949bf1fd0e359864f5e74cc4fe0b17e052c23930edb45c61e5539f1c5d8d7bb6bb315a5586ebf4d1851953cb12d7bf98d9343f3d88ba778971579abacbdf04c040d81d1ce6cc290ff11980ebc6efa9d859bc4bc3e2a8c77114b95e11d158c250b4db4dc7b57f1cad7c0b9637c758dd697bbc6d66cdecf62d42c64a508f9c3173bd71ca57038dfc0ba12753a9d7615b16ae69134dadf5569f7b290e96c99913bcaeb4ec630303c1cc9e58fab77ee160fd6638ef8ad0e2b077bf4849511bb68bdd5f742b76a2ba3ec69260618a324e989efb561fcb9fcbf0ef14320f835699440825256a2dd09e1515d4322cf2ed071a39b0b13fc446dc7062c5fa4118e0d466a6687464619679754682589f18de60dbbf4b96a95a8cdca15a375213fe0906afbd06d049cd836c66e3f27f0bf3c540d13aae7599defc5962135487c5c0d8bf61d59a59d3eff8ec82bc7901da1b66e162041040a84dfb9c85adc47df9b8dfa27486ec88f60566f56a905eef4d4faab6def2d4ff6b4e3a3315114bb76edb8a0f9c9e040c8bb1e56412e3034c5b0922b74caec503dc26aa7fa262c087c6e4cbee672f4a086c931aac3f84e443947c8ca6a43db38a6c274c41dbc7b98197095493e79cb50b7f36f1d14af1d854aa6ad5ee5cb98b8d832514ac67857eeac2c7476a98cf29f1fd023536ee886758040b4272264d690607b513d999a7d7d206412b4c265f65c0c01eaa5967a553a3ad01b70cd349815258aafcd5c50797c8aa816d1cb4d40727d18bdbe83f4988f23d1f9ac08ef64bbb99500cc390018ba74c9db4f3c473aefb458e21c34e17d348822d0c1f39af10fcd1f49e35558ca7df0100a670e9fdacac6cafcf624111ce4abb9c80f2c48e350e474753dccd5521639b421b34c69b00d01a02d0d5dadf2b120db447b38750bf8ec1a50c6549c6500c04f79c2686ea100e8fb5adc2687912b4781c80eed3a177b7a8c55e11784a6e0a2c359fccd7060533a9f0d7ec705c07cb57a9c446c9ed42865435a7eeab32801ac79b903ae9187f3263441707fea2f113ddcf67a3be0a8ed0519348e7856a6bbe2a5b3dfc2b1d3419d006d1ed0ab6e00ab2106f7fd3e9a536150a9d77d41c08c86318a0345d8ef02d94d7894714830b595328ccd440a8f0de0626ff3d7bcceed9f49385e29460f1bcf44787f9d0c4849b5627878eb60f4f42859eb5e078248f62f636fab538b6410d6dfb40188acad1c82df1288cf389c532f5e0cbbcdfbbb1ecbf93a55859723b81c20f37523f63df24d808f45b09550d6f549c9ad3df1bc2fc949fea980844fb61d7e36da04de91a2c96282e28162fad6e0cfc5e3e9b84a3a810c9dc070a8f5d4e76dfd88811c2b0e540391af67697a9d27c78fe413d72475a0d80fa083a50a53694d5ac3fd16e2013455e6825dc7010f543b39e81835a40f72b48b93143d900515cce91504d8c7b1b5dca84ec07200525e3bfd712ad3b597a30c14fb78e8a1d6bfebeb29830279475ed6108a54b388479e261c6c6388981345a1e172de5cee069c0adeba74cc8c4bb6b33ab2b9147745bedf2e687bcc7db771851a0283b86bfdbdd1f5d99f6fb8e3e3e60bdcb214772721c529543a62b7073749e43f458daca3f8b2147798f0e292d794f07c86040ed0338abbd22a4007b3621e755c34c4cda1267cfa33d834a02b96e2aeb66f71779c0f2b401a88716d807b77a53112d21ab2b09d81cec5bf92a27c5602f6ee3247ed879635f1caf5c85f59d2931e306f7a3d4769dc743b88b7230ae276172b6f74d961c66d543bbba48a6dcfbfa4537e4753631712d40a57643749ba3f25d3ed73c9ec14cb8966eda707beee5a5711d06c688747da2af1b3297cdd611e3bfabcb115c16067aa460996d571161be73208b00cb75e83e05764e330a6b0db1569383e76b30813ff75c746c74a9dccb03b3ca100f60935b5af589b0af4c014e680debb102e538476c81f8c94a6ca0b8450f0a1c23da76abb327c18461f4a5abf0503d69d9d873b23eb49b4fb1b860c2a44de389760d53eb633de2c43772579cf82410f64491cadaddad7f38b114bcb2e5066c31bb6b72ab955a5c794854b314c1001ab34ea1c254adf2c7562250479e559ba9605dc8d8d5e2b22e1e6d926144347e8360e6ea252ea08630670c74a70674f919748287b08ca972f76f3b198397a68f6899f7372a95860ad391ff89b6c95dd1d008c83f1432acbe04d3cedea3ca0e8842e5192d5e8ba4a50b0490ed4df41d1e96a2e30bb4fb65f213f059a539a1245568a085be283f04cf0fc98038b4c1db74320b4f8326871b361b080e6399792b44a9791d4c2ae761ee88ac21ad954a46efb3fa11e39ac9a6d7f7fea674c0b8feb44233d216e49b58029ca595fba52846daaa79426499652dc5d210753d5f31ba8f5802c43f9f57f2705599ee58ccb81a9a3de3339da0fe8349d1418251643fe6732ca91f58044251e084b884e05e178520621e5eadaa0c2987f6f108ab65c35e5d84daf8234eeadb642cf06ff08316c396f2b5c8318689c9321c82a836ccb077d55537057ab96fd6db67c5d1f1a893bfc5a93c2fead97aec2e3cff77be1affd83b5063e8ab764e1536ef9a611b0098064e3499c93167981131ef931a63585485d0d1c6e70c888ff45aea1711dad3c918bb4b5ac5478a1b94cdb4ab09e70d55d2685c11e06f620c7747a34eb87bd71414c4fe49ed9602b19dc381d3a3d7863949fc36e27e1bfb5a263237721daa3d9504e36dc144d56d4a1f1dfe6e3002ee2cafd69333572475638ad2b0b4e1eb7f2e02bdf7536ae252bdc66aa2359ae6e4a19e261184ef9a58ebcb4a5874bc7808ed8f2fa7582cabe2174ef91a7f83ec9effbf2d0b59ff211392e2cb66f5ff54aa68c9ebe57b544a02f41ea82234a0d8c201d9b5af4d92afbbcb7ff40cc842ffe354647edf3d630c4e8f016d3f640a5b59c176d7e863e6f09c6cea09f3200cbf702089ac1994bb3753a08b748d22e5fe7104f01e114c42be6145687c44281d6ab2e7a4538a9e1d97e89135f92af191875000ad85e84a4ebc08655a753fae32700b3ec62602fe912eb0d542219d09a288d3d5d9019e3af174d7c3a0ee3fbed84905b53cc6150f212b965ea20f4d2ab44e6534505095b23ecf71ef42110e703e46c4fab0de4118db2f6546200a0517438258aef7db5dd834f39a8aec6085ac533143be2a0efe9359387642bffaaa45fc4add1f59889bcd123d646a3148e232ac22ff4aeeb4a2925bad2811d425c003a6f6d9a36d83a26a8fa603019f24ba97120a53734f13dd817c7db470f119ce006866143aab6c42c47df0ff6be354aad13823c2bd96f64a19eb88a12466e08a6aca2b1a51745cc92b6de0e700f153f85d62da49d3b1f6d98ec245bed3102e58927304d1613a6673f6dfb8cdda78f18868d9dc7f2cd11b5d4824320dc44e5177f4f2509554ae1ddf794091d3265d9810817803a20d1179133945341b75fcf2d6488f5bd565bc2379449c6c02f54a1db329b2111c931df48075428d0a23f30201b8b6d039604af8d60f2b96a6584663a289f85a59f8587da38f2cbd42ef82bfbf2020f54fd19c5511e16183a93164fc26c12316902119317c924523651def5635bfc4361ea3e8b24393c3040cabde22ad21fb748dc4566058de967acea23b0e80a99e5694bd7821b9cc5d1fcf778fc35a1cdbb4ba062b11c1c7f8b3955d61692e09d9a90f3979f44a39331b9a44e5db79a0ba8681135bcd1f73bc804c7a6c1ca51f2c9b97be4ca192333a65be5a3014617cd69a279a902c209fc97c4b9d6c303c592fc4136fd8821c4591ecac9f5722bccb89de9d13ab12ba013d892e2c07ed7d6dc7c47e508f55f59a279c11f6c664c2a2f7f3faf24929a10fe5c8a57139ade35818a6ced9a9fa3c517be7de6cdff877a581bae46b3a913ffe61171cd22eed4fca68a034b6e9a13f80f4861066c4c737ef6493a361047088ab77a5e613c0cc1ebb8fb0d1480cf7d9cf2dfeaffbe7f7045c4b811ea51a9795300f4b4fc6c9411832d00ae7bd997cf71eb093d76c85decee676d1a758bdcfab32c4c38baf78b67c13e5cbf97753add66c1abe0b06957e13fcf73e58663fcf09e38d471d773afac7deb601dde815ea29a678809884b9a876a4069aa9c9ba2a4ff6da286c192d72534fc293feb124a218e9eddf0e21b95ac78c5d43803b47121e099d3de5b7480aea7dba70d7a4f300771d64d9876eded81471a02ead03c5a42dfff664b5b8639f579c1d39bf4fa1eef0ade480ca00ef02f1942fab69830d18a5ea45ede1f3b299c34a214dbdbc08f9c1730663269813187e1081ecb42a09ea2930464f5d67cf21f4d7af2455ddfca1ea824341fc25ccfc1a82458d189e10d7f21f01b5307f6ecd2ddc16f707e1109bc9d11506b6b4b8a4d95eead75534fa53918177c5438e638062b05129233c43e2da55d817bdbe4db4d46860ef5abaf43f00b193c76e45c66912c69abed7a963838cad88118c86fbd32a8cbc7cbad2af24e9d45b3b1d70570e0e98a0e08f0ff43de291d4ff2889def1935b0d3acb864d22293e3d0a2cea2dd902335ec2ecb2675a026f521cf2402d53e3941d8bc37c4c08386ad6dd095daf2b69f41ec982b8e1fd971c27db65f3a163387a9df3f701c26d5494604a9739b9c6ee7d134ba1153106744d4bc15a85863d2272f3ff81b3ea8dfecdd42804f0a52d5553d7a2eef42202ee22b3e9b385339ef0321cce925c344b4c12918cf14ae432c12bddaddc438af5c5fcefd44cedf1a41c01fd066235c057bfe1650c1a156fd1d1ae957cad874abd562a7b5bbd50d347ad3b401a4b94e2a7348058f10caa2f152a456c5c9a71762c680a62a08a1b63108a2703bf4962d40a441b2e1d211226bea371c484214b7881e851b85fcf6061390c9013835ca55c6473cb4e99a6328e67e955d92f4884011a14d7b908b78b84668eb0e19064b1de225b4f62632557152c512cf4bd89afbfa211c3f10a4002a294b5a962c722f0112c51d4474d5a8bad7b51ffcb88889d86b252a53d31773c8a4f71c1b4ff4efff54a154dacced351b6b97a5e1db9758df5b85858f48563011b70148292cb58e4b15f05bb5e38e7db212dc69b5854961d28b102b3156a10aeec3aecd728ca209af83a1478b5c55684966ac8c42482c3d49507a1ad81f87dd159c4d2dbc9f453ac60037cabfbbf8b1c703d40944048a6ebe6aa6d249632b64703ffe9886828ada33a6886206d053fe2f70fde533d0d08a151226662247bcc8fb8fbb67ff6dadbcb29098b98414544f69d16f5036dac8a5dc2709490dd8052935bb385f8f7c0e0f0531c4d610925acae483d7d700eab39dedc308f8ab0e3b7675285293c990d9d9c3c32974158abce7d72be051fab7030cb67eb40c037cd2a950d089b1c8383ba2b6e2acff6d4bb620be993492f8ffb683131fa25071470b64101b39a3f33725e91924a59515ae69ad5c2812bd9b3df5342a1201e5fa31e1edb430b1526be9c0a7a8f1d494859941ed0c4f21f1fcdf2d3b163a8858075844120c805bf52efd231a8ad34e5166a3bd2f25519ac5b4380aa2697da77eaca7aadc7913f125c8406796535342d65733011c4718241c79069691d651d503c96ba9fe2eaebd547ec4017213add76e2074bf1de5d808881269a1a5259011ff431f610ec7de7ff9ee1e74b5b112bffafc3620804a5cae30dd9e76cbb621a2bf4a7959a00bd36763289586be04cfd96496101eac33949cbcbb1dbb5b25a74e72b669e2b181f477f0a7e8692984ab04f3a8b96d49896c8af8301ca68614045d14c120c0f18bd0a9ceade2f35bf9e2df6eee242f01eed14a7d1104013ffe1ad3e2a0a4ed46f118f85ab90fe883b02cfbbefc1a500c93014fd934ca5784e975ca98845c8cbaa5c4f1476700c53ca014b8a289fcb398d3082825e8594811dbce8a4d701c6f7b795fb8c46b62d17fea0585dec32910ce33800a00cb7c41dae301d039cf3d132a0470b9b4a3ee3f41822921aeb876c5df369bfbc49d21ea8a0963eb934812ffdcbdc387f9ccfc679d1d5ec950f784a7b2c739237d6f42ed3157992ed644a1718a5e434433a49b51d900038d96f8cb2074659b6fc9bd3d04ed499b4f78c53da693e18002c386a3f18316d8343204a399d7de22153d4c1daa30ea38e8440bdfcc2650982f2f13813505480af79c2ea876ddcf1bf7edb0362282ecb675acf80a31c968a938f0013e90a8b803eacdb79d37b35c584877058090b83e17eee7a1aee211e0e21bbc60d8a6e7c48012be4408a4a58688ec0f17f29d828aed5b3b6709850b4c25323c8daa03d819683ba2ce351f1619f70f40841a3025996f99fc6b1134e7b81a3853d8d270109a8eccf1158a3a045c5baa4313233827320acb8838c98eee84d7b7c32ac814f5981b6179032c2c06fc1f97e2ff2da69b596e10c95188eaae932e64483717e81fa123b4276d75e42a1595e51d143fff2fa7ef8b088585820feeb27ed49ba9d220de332c5cbfcacbe9524b04fd7480594f97a8973a973595a8feb599504e572a4f868c0e9d695709663bd55a75fdeeb35fe8f8a4580010dc284af8d6f5110eb6e62ebf1143fd3b4a172d97ced098408300bba24c7c5bce27798817bdc4a54bbc57c52b3f2d9fd6b501ff64ad9f198633d140ce886109c3d709bfa268b2a7805a6edf0250b8f5c3bcb4ea4d9706f26a71dd1359be3b843f11c8584b09b01915ddfe16f666c21d334309592d40180a86f8fb5b356e42a7332c27573ef7fe9dc61f16de2574c8ef8571677d838fe130c6ae8306f2546b4b7803fa7b6439a26bb2a391726681574781227b2f7ca86c3384eac253242e964bdd2eed3df8624798385a5f4896172df8ceecaa6c335fd01b3371e2f2051be9094d93083219edc76fd7747f84da30c4e5ef4e744db094acbfe86347d00fd3784601ff181c6d508c68925bfa3951c34fce3f25dc9dc6eccd2350a509f13b80309d8b7a5ee447e919dc53c7d016ee65c3059742b70cb9c9440cec401af1464984498a17644e21bd755f08682ed713888299b6a2d7be448e92a3fe531b35d7bc48e4e23e1fd0c480260090e4ac6d8dd16b42c7bdd21c40972cd80a1c402170700e6fb27cfec3b9836e725ac1d56054a83896e3f3a3c0ebdf9305191ffc5b09b3f5cdf5ec0bc7118e3147d0d28d72ca3cdd28431308c32c97e6f5d395f4f16b559a04f80c0e19d77ff168b78d78b0d24aa001f3ac57560e15e539e5707966494eef91bf7cbb93b2b7154fed9c83c4730d487f96cee3463caa768300e5a40357dc5e83a9e5b00771192befffc601eac6eaa2d3327e01a4e57fa302d2294b9cb20402a0c0b2e84b85f71112c476a4357adef5a7cea0c7bccee7588e6442435d39fdbf8548b92b65f17abd7f807f9d6686d2aa9a2e7ea8655d8b02d482fa83b7ced2fef5107785ffc60683eafc56c67707d6bfccca744b925e621c5cf00ae0e9adbbaba0304cf3349d17ea77a84de20cdd10c1d0ea78fddffb628e88e10ffce9285a551e16ed0d94b5ce9443cc199e5e0588302382775719d134ed034aad019a2de161422c8de77d2b11ab881072c861e0a41aad1e9c624b46cbad5ced595b99e793c9161e42cb235d9e7520927b4da461362a5e9562d76dc2dac7e4d4423ab9c7fe93b26870e31fd7b891dd16d38a7632e0ed19509f067f933c6e8481467c8d9e0dff3ff682d6deda492a1c7c6354386637abebcfa80e1d259d2bd2f89ea5712ee20b756396266b4d7c3496005b5856d82c755b5c563d562a34911d954f4b330d468b13412e0a2eff40896b5ba8062cfeb6d91eb82c5e38d60afa4cefd8cf6057780f80835753168ac145b23b2ddd54f4bff224877410bfff4ad6e04262039db438a5edfc840708977b29017b89dc427e1daa591b1b4474c293953e639138132cab450e36f8e59e48820cdb3fb5960b2ba001e983a60705e9278cab10519438de41437aea08f315ac67e57a247637cd094fde1dc3f585f5967820acbacf7760919817e3b5b175a26f828aef9fb08d6efd7ec19d007a2bc545aed647cb9f280719bad4263f19f7fe961f7da8c564ac7252edba80550b93a3416e81bf5cc23e89d380a430dceef2cc1aa851538c2a0cde2f8a825a529594c3f844bc41b4e284d110bd022d78a913cf2bd55cb3eab92f997c49f55be1716dffb9fc39843eae632eb138935e47d9c4c67b43d7f0254ed51a6089539d7c20c47d79a5e7ea968a28f8301e635ae3a5da51939bda3cab6ea08a23ba9d3f69b7fbd981b483e784052d335c5d8071e1c06e944685d31cc5c5a081388707cd4dead15916a4c01d88b75751457582fff39493af14b95ec02a185294ddebc0edb5223f12173d3e04f50a9b801c9afd9bef3e90b15401b45b403b18c27f4c491ac8fd5e84a3cca2d41610d986b4ce46bc8654d15c6464b3df3565eb641ce5c7afe3743f322b3cd7b016ed152b57965f3dc2aaef475d90e3a6cb9103a823f593a7b88a1c30464f3fc77fcb3a19a59362bb5a6fc250172a433d20f4c8bc615304629b7cc7b8eb230ae60b37cbf8998e59bb30e0c729f3682bff8a625b183d54daffbcacf421ce5689441b87103eb054714a39aea0d5ce5a7a1f01f9d23032fd9768e9b6929852819401ff87d847b6ff270a89dcb63b16b4d86caac42750905f706d5f5c997569ee908aabb10e616f7c21ab93bb9ed39e10dc6b531f06a9714057c4a9df76c9b9ba818d276b3f7f234120449e59486a8d0a040b07cc6d56a10304b0b24d0f1ad4fb410c711386000dad726330c6dd8ed4c2334ad4e7b25633a2df4a903aec6a2644c1c2960d96c6dd4b1fc5fa5f5bb81912631b5a585b4bed091ed7711f1b6a01cfdbd04a0cde55c8d11a16235840fa9f16e98a68f2ce4c7b91dfae67a8ddf9e8430546567f8d3a216a4d3919cd64401dc0e27b139cbff9b4fe4e666124767a3b854ffceead061903975af805869b629b924abf5e157b3b30ea13fc16c7338b83b822492865f6875f4096a59850604daf7905e017af0eb16f319c4f567be73088a73f4c279477264a8bd6011b9192538c9959730f722af85a2d7ac2f55e526ce01290067b9cce4e2c285c557d61721318df1d1e5f85e233f85aa36d68a84e9989ee2cd284a99923416b53303cc27534c61698f3c64adaf7ab0306ae35d57d952f4cf74774302e7c521a4d2e6f1fa0a6f1fda2a163af4b457a37f4012e89bc383db5e680c03c422c4dc391c3d6c1b783f886324a656caa0638f48f614865154e61eabb558d30842d9e23ee85e8e6f81aee61c0842c4a39c732e75afdb8b1ad34ff0d0c0db77dab249bf5323b5bd80370e76fd6da75e7d5963b534cd5ffa1c5ad7b1f7b3be911620f3ef7bca04c29cd019dc0dd003b4e774deb38f5bdb0f1d3911e8ba654a487ca8002827d38a09b1cf874ad49e76439dfac78f99aa66b4e6bec13f1c62c3e8b7db2ea81820d7942b67ec5f87dfec837c9b6b0af382dcfde25cb10ac4672482e93636040741e8797bfb39c0a62e8c3effc4bc665a81894813e850c28b7e2fc5a6bd2f79067aeb0d564409761124a3eeb34f3cf825462ef38753923294361f11084774d49f358027951ee6d7f792d7a6b671c369b17cb0c12961ec52028a80861ffd5f03f711f36004fe5ce3a17c4fd5580070222e7c7fa60f977edc30a12e3ebf8e1c2d8dfbed98b5ace424f0e3b30641dd8aa6a4528e744c9bba4e15a43d627c05334b8134d54ac6eacda4137100e912d3357ca24389c3faa85f52889ef435d2860aa38e5e1fde4a57566996c70b1869f6e3de1533420a32aebab24d4f133e102136300649a6624f2e879f8e5a7844c3c43721c68146cccda8b4b94056565652033fba58ac900ccfce1617d0024e5cd9189a31c551a88a641966e96867d42a12f8a9ef8461ee33d337cc287e0232985e29a22c4055f606a9d4eaa59b53b58d4dfbc4a3a568d36aa0cccec1a90a23d4dd09cfad22bad7f324d09eddf1216760834179e755ce839d56697d0deb5563aa29482611645f4de03aaff5e90b2a94c2030613225c240003b1ff421b1938b7c69821cdd8c3464ecb765a4bd38cd95a3fee800f73223607a8e2833ffa96071a1e384880a9d6f01502d62e1155cfd71538a02e90a8674c3b1320a9240c43a488fc02d26c580514b9dc4f000898f2c195a3412e92ccb8c826f7947edbb97bfdfd7bb11f665c88c4761fb6be281a14c6ca79df38261a1083feeae5be1d06658bdd7a172bb12d24d594ccab9387a8f2507933984d2380b09bd20fa925b03132c2b501fe04d1f4956d7fc0acd60243003b12ce91bab347570941b6057c564f0d33a7fa4ba3ce8e943103c7631c3258d2907bed0dad3e12b87a3065618afffed853a492ed4abd333c76e4935bd0d0fa86d5e9198ad45fb48ed3183ba62608ca39a9c0217439e9c1d091a17f489c3d8253b51bfb7ab8ed1e6531bcb68e046d48f6518db07c2093400bfe8defcede8c9de31a194e596efb9505373a147c8d5d7e373424ab3ccab5f203b4a8243e531026f6bdb9a40c1e8c52f1efd680462b312955b0334ad32ef8ef53e66927df2764d71950a7db89030469b6552e7ab637ca50ed0b3784060845b410eb0e76074c5c67bc39ee7d0648b7e8130719315a71af62c878aee908f3988b3026c8125a6a3dc9c4dfc3d2633ac9a30ca35152d40bc94e4aeb1853081dc79bf363292604785c517a9fd5b0739426ed7012b612771fe620fcae243a32008598ae6894ce8c8d346915386c0e98d5432be64aa97b56d983267f28449e8151e4bce602b47f0f3ec8b42446487f7ee4fc80e805ee1be05110ac2bc3ec2fe049d0e33417c0024e6b4dfd0d803c740fe42c1b787565f7ef6e83e3e780fb1322cec89fe39d354e8da83c47043c300fec7e6e163f74cdabe4147d6f48cd25682a955d622a9003ec0c40c484a2c4b8616331c5de56494568a4681e0c645d9de23a136d8fb095c2775112210bfc3ebd89f972d6dccadbfbe4441af85026ca1f738f4d57b58a082d92aa972d0a4b888d2be5fa4f35315ce298f9d2153f1b6274dfbc9182316e286a0fb47724fff60bdfcbe18655eb4e436f9329755b42d4cc7839304c030ef9b483661ac9b063855ff5645a1ca47d15b017a0face48340fcff4eeeb457384d903b9e60fb343b77d4034a1fc4ebcf7dc0538a67ec39e12261fe3e45784f669bc051c25d8b1fe03870beacc22ad2d619fea9a7be7f097103f95fa0160655c16229afda386d75862a6e577838435b64162387324f53d7841d8f8dea791795d57f104c5fb445a701ba66e65a636f2400a008c924b21f92ca974f92f06f1278ac3e1db1bf7338c8eae96efc7f07b551983386d1262bc90f92f9897465554eacbc16d21cf229e8fd5baa2a4afc85068905edb6fc96ba3036c7b65dce1b8cf959a0beecfdae0d28bab69493455f8f3f0b2e836de21100078ae0f4e744bd2323d992bef4e9fa2a1690df72ef70456fe1cf1d8c0eb53463a2e8edde2dcec818423c71ce7a02f34a4c289bdf5272352a097d2afd1e1ee1d8722a6ced3287380ea20edd9ea8f54376e79397c2a542de4acea4300ef8e4c6e6c0804fd7f268ee2923467494c5ac0143e9856a76d7c9141eb20435b4c1b2b7495223624343c34f831a3aae13b007133b1fd76a68d7a5f6c897dd0276744db74697eab1c571bb018e41e2174779412a8afb84b1234f9e09f432d8fec489c0d1e8992f3d7e044ca0072cf1d096c443297e0958d8f99698795b81801b204fbdf5681d0c3bb4aa73324758e40e5c6f75f5cecfdf19b5e73c5e6c8a1759f0922fcb8db16bde2d315abfc45cf3021edea75d60ae6d02b01c99eb52a8f610816f73d7b69d9472de3270a3727219c674ebf4562b6f9694269051b38caa2e59785c0c748bcafd37bf6f885a00684b0d88f2a146bfd3735d926b09af81255d340efceeb7a5273194715cd8dab27dc2415365c5287517a53ae2cd3dea9c234cc8a23db37724ea430b760bd78966b31d506ba99954c38504606f58185a88c36031500ba8eec66ba1ee0624a6888f4c8bc0a4761996aaa96093b38b46e71ffe6e687851baeb8ffcc54b542ceba51655db7d013112c1fd5c315298d399325dd936214eea9f80388b3e3fe0d4d3b0a1e767d8b5739eb4ffdfeca0fb05295a12a99b914f9c2e876dfa600e2f248e09536e9a5b366d892e02330fd243785276431c17b04d9d716cc25accaa909916e55d1fb3b0376c7cc69448148a644950fa860724e910a0379b2be9c3eed9ca5c3729195043e67c7d40fdf7e2d643260d86bcaba3bd1154c6ac2012fb7c145452a7dac9886a3a5aff4ae00634e6bda15663223d974c1259c90fe268d60eb8d9f7aa528807e7c83a898473a8856f0772ce32982809b8b44cca81af352405f7d93005818770eb762b67666a358ca2e2a0202aa15896f7b2faaf60408c17937e541b47239c22b9c4ef59868d765d7cba7a7458ee82a1dbabd029c361ae9e6541c1af7fc614a5585e5a04f0dc8a98c297821d0067ab928b3c80bf0890cc826c4f6add9ac897089ec6f5bdc24a4e6402d03daa46cafeefd1ed28f98c104ef264a07c6ff8ca58fcf8e18458de79f7ca9b95d07c3ae39a0c8712ce88a77c99f15d34219c71fda8edb5ab6d610401307a4ff04cf187eae7027108578031ad70a6357c4bb1841ccb8c30b929b288e7a908cd3fbb11524f43e31642470f4910ff15ed2064284a67dc5acdc1f13230c771960a817ca0ba9fe3ca309fe86bc1e3451d5e73067d3204b062da2cbebb34047e773ab0f9ef432b30da746a3fb2d48605506bb8a2e514e8d8a07c0e7efd6c09d04465c9a633ca314a719621dd250a298599638b7fb8fc8eb4c030be9ef2709b06783a66708a4a8ecfc6d9bab4ef3612cc6e2f0ccb2433d5072f6b15a23ba7f2b644065750128545a50265b9c8cd38b66fb950cd618e5aa49b8368b54f4e0d5eb60e1986615a3d4d4ce91205f2481fdee4a50edf94421abb6ef31a0405def6790c699014d0e7484bcd593d1acfcc852e0fb92536caed07c97603405514ad975704b57cbd205b1e4af0f7ca7b3c9d4772426b75fc96f5a53e52579c76d5f249264e702401e86a9a4860d0fa1b2825a64869d73548a39126a5a09493f0e10e7db2f116e8c2db17ea367ae817c83d83009dc990c097358198bde237d4a8ae0f26e75185456f2003492bc50f8314422737f231ee53909b56a74ba6b5969817bd32645f04f0287edf3f14e1728cc98455544327d93859b0afd6446704a86bd74c5aaa080d68d028498f07e596077ec6947db8bccd2cb7e5e9bfa18e6941c1934c35d61d649e458195a0c5bb1a3ed40607a73230e380de1df2882b75a18165396ee4c155f6da4935580f9d45fbfaf7ef00a7ac618dda0e45bf688fee12134d0581a7c081659d0301b6839ef34365e0825c16088d1ff88f3fd7e122a35c662a6451a7b34da58bc98a57915cc05516bdf2c47d1c7c9f9fdc9454a5bf6c59ce44ba6d673c111c621e8c89deb000cd18a306a31593a9105c83f6c17962c7b6197a87240e3d5e5bf279fd8afcba5a1b17dca8269283d80729ecaaaddff4e7b30cc4c06d1a5f89aecf2954bcd638fa1a624b4f802c28857af62b4bcb248114cc1ba8a324db7e7a28795d0b9244e9e149a254243eed9e57928257620b55d20b0f637ba1d18e80ba2829b8db9df4c3dca047b773a5be5f27871552c0121954fd436dd10ebb14f4e0c7d218bca1c3664db2187838c25172a8ac4f636c910dfc1f86faf900ceb6513e0e8321ef023ae4c0cb2dedec591393a25338b72c098b753a762f80eaab14f365ddf35663dd0126da6a062ec403c147c35dca77f8b7e00c01b08895d613d0bfa9fc032a2bcce3f6528820eab2cb9036939395408101c7896a839cd00e3d096571d84f6a6cfb05c3ea9647c1e3eed23995b29281ea89f477dfbf7324387586af53089f0fbaed7a9a6147ddebe7137b173aa88da2a6e38d5b044a0bf1a37c720ad3d6e977a750b46f49a14077aee2aa9126fbc0d41783bb2a7726baaf88b3d99a26c1077dee0bacfe0366df97c4ffe4c7856ad3627a7b4a55c0299026799dcd518d5d1431a712d4818633185f3611df2b8ba51b2b320184bc113ed2bc89b5bb47b347517d92663cd426326d6573102f515e2ad86ea1b05fcadfc972b3ae836e115fde2bf0a469d2dbe1a9f7c0b43365ca9072f23e290b819fc0b650e68a5003ddd38b583fa27729d9597ccd058ed7bc06d5c75e2be420cc0aa89a3e547479925d702b39b18532541412c70beb5ade2265b92f429afa072df44a289268083c8f236efc10a259768ad38b56c1329d0422f11b2b05aedff8b088df01c47a21d7dae21aadc84a2e9f665d10a22887ddedd505fad5b385a8aa3b02872f1be9f1d16c2a737ce0d75d864725829904d8d74c01f9e0129014ee007e56251ac02be0655ae6531782cf47171e9a3b427c19548a59fe3dfa8cd2733449e766c038e1dd734c1bc0c4d8167a6ad59e3d0dfefd53c47313a09efd85c981e7033be03ade99650fbf8c76390383988ffedc3b020ff9e5ce802fe1f56d069c7a75138dfaf1103380a3f96e851815729b71dc576e7729d59dca4ec7ad195e4f3bb170ede43a527e6e68268ce566bee0c9ae4b02a4aca0068b82f51f8b0bcfb931068d5bc40620d5b0f577f57a1a0065f4d0d5a61bcc66eeca7a8f3baad2803c09dbe029d476fa0237fd42f454ce199fc61d8825e89d3649b8f7b46adab64bb2881e0198fac42bd554ea24902972e1b97e9ddcf12984571b1f55635e4c3e8ac195111afc1641179784c0698a8b547244868a163a87f473a6ebaf5460847065948fd00348085d88981c1cf0424fbf90d65f686577ce6c9f8c827d678179b03e9bf41a7cbaef27c9eefe967721b5e1a93fc6b273b46e2c5e2409224f58edd86796a00616a2cef9248be53a49c9d6f0c6e23aaa21accd14fc7df70ef399f79b92842605899c56035c9a1a3639549e9154c664ebaf244d5cb938b2e8a3e9592b1184510e337a713dc1caa1e1508c84f357b88cf19d9cd9a709ac9ddc168eaab30d3f057ea4e5dd765b6c02f23177bb1b3031dbcb66084a57ad2d4a2579615d24a88ecfef4cdbb2944ba82ca1d31a661eabf19264194b3098c8dd9a8620b74af417adb3bbeb3e794240d24b41aa6a9c389b8f5d5bca0ab1397e5bf523661695473f2e4371888ec92846457a8e825b26ca64768e19ae11a45b297de4075c2b1df8119251cabfcbd3a0541d5e4ab0a0d94aad2fd5c0b887de48e5f70624c8e8731c2f55df906254d2f90eaf7a334934876f4011f25a80f818551a1142b25d061801cff634eccf01c873d92d3f314b125dfa3e36fa0588f9a3af985b86a8545b7a4a063130b2238eab9f333060b30640b94107c0026927a1b5ebf26b808349347d1ba4e43b23da78095098a18c30b3baad119c83054db6bc71d3fc0569ca05b80b9b0ed66d939c8e9b74f9ececbe7e611ae7a4b2d83267411856f1421cd86cde75adc59ca2745abd6c6532075191376a7ad75ca564a45e19e6ea8badc4ad8fc0ada105ae4edd83a88fcf67098dbdf1ea58abc0575d1f9dadc82881da42945934e5349331071f5e21e74d12105ed4666a99978874c8c61dde1dcb98d8147a3927cd06e0e2394c097a115e0fd8f0d509a388f13e4f44f56c034a98d37821caf8d6c494295ca7a38db04ee6c03a7a32604c9f651db0c08cd982ad15d890108b48e45ae161d9f28409d2fced8fa534fd9d88168c89ab62ec669b15d45eabb85a893a9e60cca7d910c22bc36d9cc7b1f52d7c4c673d2f853c652808ce2b42acb4e9887ed5c21a13e82ed5d30a57aefb5903231a64e4fd9850691511a405bb6fc19088c12f80b589771387b6f2cb1cbf64d3820a8050f52047402a9b77e4c7a6eb3978c6c268a7595f35259b721801855c917dd9d37a7d7ec1324ec00fb0861594f8500fbefd834a69992f3d52895a1286f5794a54eb8f1f1df7242e7f430fea2f54964d89a9ca253c3a80774ba4ba485af2c9f77afe7895e292c67767bf9bc30dc470b89c3346ae28da69c48d0940896f6e4112dca2d58bc2e76281ea3037d592cd65500c22397fddc3d88c54f588b8d7d6618c9bcbb52eb7b970300861b327ee649d44874db3dab730271e4efd13afb76367a6c307b641e2da45587032a4da920de7fa49798299eaa722596ef6accbb83e3651fe90747c44646b4d6b468ebe543ea33378357eceef276f51f8709c1ead32f4192c2a6997c726c57ddcc5d9fdd15398fba13125464e252cf5398c6e14f0744ce609b27782563465719451bd628ab5d01aa3ba5269e351dade1b82cebb8ff1eb51347742934d433b10d734a56ba3117a692225ddf506b4b29b456b8004e8a82dd9abf6e2327188bac390e1200cca51e5c63a2db966ee0092d0c342e2c90e44d8bb41a742192b4e1d352ffaa815d4d7d3f01befceb0eaa8367da774700329ce5a41d0351020d3ba7921c97d34b4f83a28f5f472dc522b6492c4e616ae3fc3be3f6d29a50487ea7822f7f8cba5370aafad09a9821fa6019cdc88d85c16abbe72427f21ef80cc713151129cef9efec722d15558da60a83ebb5412829c95a04dd49219b605086454cc16f2ce8db210b9c1082bd1851bf107b4377e4abec65aa5bdb9fa7938688b60e9bd1b02397e90956884f4638348cb4327b10a8695084a547a941c65584638a011da57bae95b93f520a11922071555789af5776e2112da400a698c1b43870728b4afc2a0af7e26db1da26e34048c072831637ca63cb09d3e880486210531756661a8649d0db4c4359bf3a64ebb1c23f22e0c9ac86d7424e2097e681bf989acb1de38f37c8a229d2b367fcd5bb92a6fb9ac485350c940762b558cf312e0f25851e65086985a78ace08bca9fc9a40fc4945860d1f07ae9e0b22f02baf1520bb98b59c4f0440c002ed16926e71e7b821c2e8e4ca5d01a80a1e64f8f613c247d78c7f37ac093ef131e668f21ca4bf9ae86276026540c3414851e0ffcdd4f9bf1967cec466842a5111dfc50875d3ef1cfedc05e323c6c082ebd258244f35584df4be011e7ce79e88d5e6f5451f749e045207ca5b06ce4cf37d028ff21737f3ef2e8b7f36cba3386a99c89228aefe7431d8c34775ffaf717460e0b3c71f6a2c4da84557b3ae02226cd821ffd189e268479d92586dd24c0ec44d76c4d8f128159484677c6f59312e512b4228150077075dec9715c7c1bb25d06d5fb085a5f0a5cb725b3f436b374f10e8854af2e652e5efd27b7ad8372abf52ea756bc8c7718ecde0b74ec06590f1688a393e9c89d7d59407aff4577f114d1f0ad56c82c97f6ce72ad8ed000b229ebb1f8a47e6dbd5387ec1e0b5d85fb590f62b27a830762e8d96916212dfe415be0884be5cb77a849895b7ab3c6f206f2d244c4edd6f1dad9655ce4ad1a1375ef5ff37a1badf530a497031fea30d0fe8fbc2bd59dca9fbed26c4b00da5b25145fff370ba18e074c96ed3d01c88273d480f4b680a0ad27792f5308b835d1d567156a351be5ceb86f9ca4dc472346853431f65aae8df0862f902a3f928fe8f967f9d1f0f81b2a6830ac32d3b3c352b669bf11047c21f8b627580696007e088eba1c909b3ef109001968393e9eb9260e48d7996b665393820f3bdb52bffa3798c00ea0e0ae0f5bb88cc1a4e51fbfea49d49352a343df74619639e452b4380d6b6225ce09bb98b10c34ba42fa17c8f484bd8d01bdc14e9687a2097e58c6857ad841cf7d218aed4195eef1c116d5915ed909121d9c48bfe71e22961ecc4a7bbeb64f1029b78f89eccd4ab83c5c28d96302cfe8f9b94fc8c00d40748ba609f6ae0e8166cb01d67227ee8d5a0ef005866b2e6dc0f69b7a12d6d239722afc0cc75f8dc150dc37bafc35baba23e9113666c94c0e5cef02da00fe665c3050c24a07b686eff9fe7be36964856de2adf5fc33efcdbbed69642a142597d22674705fea3ccdcdfefd15080883c1bfede2b8cef33e067fbd9737697091dfa3f4816e0ed28a4135c172e5468d4283904d24217befbda5945226296584068e06f005cf9aefeeaee292513b864758b0eb8ee11126a4d8402814293e528f8f4ffca93db0e5e3d8f0c499534a29a594f29347e06afd4ad197254f4cb264a162c7cfc05a2a2588b220425b905aeb916d891809f2323ce2253c6282f008520c5cae254a5da1121ba8a1490cae90020597276c506485acc80b36d45a6bbd419665052cb4233628410576614b75414629b51264062ec0e8a0040abe9821c2a523e2c5852d44804011c9b2c296d48ee111222e46c2a8940812220a91972486e8a20591d760060f89d4c044b52534c2c5de760c8d6041bb64701eed2327af61c5c8272b9bfc068815fa62cd38119945281c1181798dfbf3c11c3026c91dfabddfd8a71f0940f0d39db86301b973bfd2bf3a05fbb402219120c9543942e8e903a560ff3ebef5e7b73a70213347e094b2e51fd5905043c28f20773eda34e7a5614bc99011e679b4a5a71ef53f78b4cf7e7ab1e301c29f47e87efb4d03f17cdb51bdeb1bd4c3bffaad924f9db6fcfbe42f9ed23c555def3bfc5bf75bb7e99af999166af21bf9de979a291fa5674c7efd51bfdbf07bef6920aac71f773aefbef77167fba96f4cd6af54cffad8f1dc5f45bf99f2bba21afb413bacdfeaf7633e4feab3f7ffc1a33deafd7d9000b43df7a92701a8fbdcf1a878ee7bcf6308bfc73d7e4fd7d0a73942c16fe4ab3e21fa424f617df2575f8db522bfe6afe537f204b97df8f831c208efe3074f0d09daa73ea5816cafcdffc15343420a48e7fdd437ead357fdfd4df5b1e3e93cd557333f6807ff4653246c3cdda79ef270af7dec78b28ebac61fd5f47eb3695f8d6b1e717690e92ff88b3e83e4a79083eac44b6c71862c3c852c04512da1620a8b74b18512d5c215162993642d9155296961912943545b48a0458b169716d890284486e43034801dc3214384d0c043215f422162b0d8e25cea42c85d2a403660055b745589c0102e8ea458614c15499439022b31546bad35e8890d5a98e188172260a0816361a59a00c9142a2514f2836a0ab7631884043658cf2d8fa1c8ccadcccad483b86024089115ba1d43a12db284429c844178505171424828f4c410550fa150984d770c859c5e494b5d1c352d75f1e44f3e8f4c2e9e6ef0e40652364c29a594524a29a5d4c7dd55f7d0f7138236b537dab836dab035daa81e6df88c36a68c36acd43458adcda2ea87ac7ddca14d4d8b4fe3cea4773af04b0d62d963bfd22f020603026398ca07180f2e1e7870c518e92ba33a0f8afc1d467daf799fbb2fef6ff7359eafabc18ca70e5b74a968c8d96a30aa6ec8f8c1d89a11cccbcb776945a55d6bd09837f52fc639b75aff1ab6644f969e37498e64efbdf7031aafcff540fcb27beee37b519c8ded5d9be6e3471a5fb03e7eebf57f505efc8a95697ececfadf9deeaa3f97ebee6cbfbe256fd7b8d17aafff0cc1f8cc67cdd477d1398affbdd97e3138147e42067dedc9fda5ccd9a83ad1a84edeeb9d760f7f27d60db03b0ddc3bd46414e83b0cdfd8d5feb571f7c34e6cd747572769fbd86f7f35b9ee6fe82bfbb2eeff8813c76cfcd38b0e6f2a4334839a73ba5f553cd90a3ca498e1ac4164441f524c7afa888bbc9f946b59ac518638ea07ff408a2b0a96b59c0aeb4312a107d4a5dd564dadc125c315889553264f936f315ddbd1539884f73f8a19bb2387cefa53fdb122ece16543664f91163016718651bfa0a2242554354da94aaa064f9aa26395ab6cf585327dae8500fbe7266f873b74efc58870ce6ccc2bb05f3e90a21044c446122b67d605e44982f54d6e23eb9bb9c1c9dd487592c55940cbeb42dee2124fc2bfc4e2a7b4e83369b067f6bee9313029011444fa66c9ff825d3a9a824736293150227edfacae13735c76fbc32997a59643056914159248be635ba1aca949aa9b3e7270f8a5c3f078f4a4ad600073a2064c2049a38e0c41a8c5ebcbb61f50fa51239a83f3b28f2a0c8d55b5bb54306e393093f471307ccfef5e5938903fa7c90a383b54f54da120725c4386d9fe8b425ddb683b883776ade33925e88ee7e23ecb5a99a3c58abbba551b3d83855933c416ba7473a9b3cc6f8443a9183f8414e09ae11f8b868bc5c4d24f8369b0a07e9d15a214568929f94f2b545f0814da5f865cb1ca69ce81444a50f91b3e7d7eac260a49113593fd55a1de94727a53256d4ccc1b236b1c1a2d29e5f82cbb563a491f3f2c9d971c6199582ac74241ea9475735512165d78462db6a8cb17e4f047f7cd7a7512543cdb5d6aa2a3af22eba70779f71c6a8e37c2dd14269ff8e4b366081ca921642966e20b4b445191593133859da22ccd2165296b438b3a48597a52d8ee4b9fa9285199ac599253ba997d182a169b48efa4ec7480ffca5cedc41196f1fa44ffb3ecda7ba1ddcae5f6ffe183aa53b1de361b474cce5b764e8547d540782fc9e4c77dfc95a730ceddf82a15352831dd7ddb8d5686fdc1735cbb9bbd380744c75d5b3befb15f552fbfc81306c4e4c3e086353ea8a36f0fe1c2e2727268f621284ed2c9359d63df5b9cf1ea4948cf4c0d3200ccf0973a2b1c990c145c61fae02f7338ed3944cf6813f53ea1afcf7ed9b40613ce5ec34f3a1b1b9077d68ecfca907615cfeee41baefabbe56e4403eee40e0be276b50de6e07b7b918b4899bfc6d1f1a3bfb94fe9974dba764a4075cf69ba664eebdf4696b599665948c5480ad2df952e6cbe82f8084113023603c5841ead2a5051e98881c21c50c12d3d4a0a421d25191d912134a094355a09452fab13a057c28af56c84e29ad7f42955748f1b2c1bc0398edcf9a615c514b3921688340003bb652a07ef1c6ff04f9f3572b64306f8f3b483df44fa01a0402d8f2e5fb64618b1307e3d734fc1ef16b52eb4c0d8c7f42d08eda6775f79f1e71f6f2a376adad9552f7196dc8adfd0531a53eeeeea1f5cba4dd52bd12387577f71dae6cf72ade8ee10e471bccbfe56bd0050c9ee032c51151762a912849e0282b38726b142e5a9422b2283ce42846a8284bb8d58ee10e4c3215bc2b675a466aadb5aaa046072b8ce84045eb1073d90006a534cc0b8a029a773d7d4a8437e4a887ee48ca102f882830d831760ca39ce1c4107941f8b7c35f7a6bf3af8766fab5d3515fea9ef9ae757cd00edab2bbe13fbd46c77ce9df0ef7efa13fdf236b7271e4044a0f5e09bc24283b4081e2557128394031f288c8e06f075bef7a98e3e0cce5edd873900225a6a3b4e74f60f2e8b2a7174f2983d189beeb804f3d21b2c592c1fff9fed1a5dcaef99a1e963c7fd21f5cae212875c16056308651712a302a5460545c1e0f4f6e60e1c9912650c21bca147950e80d2fa03d0c99512c8538844fa27848948510872316bc1c02b06378c3961b4ab0c1fc61a5315f8e5361517274d720b765a47f657de9ed90e353d7645c2e1d2875c160de11c6b018231055784064eaf27080b93c1c60154a788313cf86549c3ea77c7963ca1778347834601df61d040722e2d41871688cd38319e38c714e2d260c5b4c3d91278e7dfb3a3268c3e574e9eeeebe02954e44448964a42f78312fe6c5bc9817f3625ecc8bd16a2fce7013adf6e29bf4348d68b5d7263dd16a6b12ad54c6a8c3c0e8347f4e4f05f91337c18cbe6cb0b5cb782ce4181a99098dc4d420c21184a9a18c4724c7d088291c8119a3a41ace784a92c418e97456a6590ac9d9964232f684e4eb09c9d61392ebf68464baa590ec5b127942f2dcde0bd91392a52724473add5b52ada7c44b8293c848dd3d2207c14ec9608b53024f6e208584354c41c2850db408af498c71460f06397f98425e933cab9063229e84344c2f06afc863e22df19478327832784406f83800046c097eb0630d463450d9b10b429d52f79064bc63484311cf051a567857e884ccb63b8634086df061f387cd2b922318273063c480710273c64c97a62e60be7469eac224e774a7b4ca39dd29ad1d704a2bf8c1c514639f1253ae5a7b2fc6d9c538cb346dc35ca669dbc6711d93c66d1cd77528548ae3502822b2943de79933f3c82472660a9d31d3d405cc972e4d5d98a49423e944164d3733664c07c00f66171a73e49cee945639dd29add5d26aedbd18671ad5349f52bb38cb346ddbb88e769d4fd9691bc7751d0a95ea50a954ce2a95e7ad58ac172f686860b468abe553b67cf356a04dcbe9a4dbbfccd77caf850ce26d25ee9802b8d81ed0c5993367cec0602d1a64a7a24c9e5380ef44cc065fdb9d4801b34ea2681283e1c9a536c822733b864e9850d5c00912f98b40e2b99559ada7ff9c43d1fcd7bb5e3118cdf71a5fab93a25dabb4428c999c770c9d1079391172bf330491e18cc5028bbff7de2222f326e2288ae17cefbd48ecbd45fbde221af67d79a4b47e8c261519d5221c9010e16a71c8e0946576880c62ac0c645cb8a2092b24942b963c3dc19e5c302c6102850a263808a98289932255844c846cbc63b8448b31ae316488a624516ac92c668aaced182e79c2b1448cdfd850490c9444b1c1874dc9d6c2205b6b65dec48d4349d2bc895b09d3b6a112268ea86210468a3061c2b8c0c9c995844a8ce905b1a52151c4b20c45112b62481461ac877d770c634761ac684726760c5f489a35f3d61af8ebcf88d826bb766d31e579336d9324b3c5391f47fa81a4333b6811c315474f5c28913911836b1f5866e57c0320382c4af4964cb36388c4850de677337509a7ee1489900bb9e565b67b91837a43870c624d3c846e9c4629fda1318946609373297fea769be6ad6de31abc5f3ff59efafcb14b659aa2344531e7999c74cea094f4160c11434d56a53f35aa519f8c30a39e035d14455139e2466954d59103f91ca6bb7637b2ebefe3da2eed67fd43b0b162c50b50d2a5c018638c2ffe8b31fe8c3ade3efbfb6537bb599665f8add578be6217b5deedbb1a7dfcf5f3806bf7dcb7cf59ed448ef355756ea1d55201c6ad1c5629da200d85400a8570220495dd9a31218c6c0f8338b3dd6bfd49abc6f3e591c9606b0849fa9230882e3b8655c06c06ec185689b2a50b4faf05593eae1afcf1ba44a63f26f3e8518f36fd2934f5787bfcd9e3b7d90f02e0f7f6da336034766b8379d78b51349572f7d7b671dfb53babbb8bb1ddbe8cbb7decf0663fc319ddf88b74dfcf86fbfc7bee9b9bfba4980cda7099d59a228336dbfd3d1964fa9acd7e7cc769b9dcec3b30e77cccd9f797ee16cf9765cd97a6f37cd50c7f3ead6de7bdfa87da5983da1a5dbecd794492f7440623530eaf91fddaa72f8b8c9ec8a389b375a82df5f1552a954aa5ca397339e7acf17ca99e53a93ed4a73ed0c7b555afda72563d4aa2502815eaa5ac299cf7f7aa2f6bd0e6633da7c1fc9c2a7f208d9d7f9b1cf7c5f9ea3e306877efdd8dee39b97fe6467171be366ecbf16690e383b22887ccb9a599a4539e40f366fe90097e332307dc1539fa8dcc7233b2d5b0cad07dbbc5a94f90db07fd2b41d03f74683c76fd1f3e2414bbbecfed0f4a2c3a64048d60d7c711a1d855e30bca3f2108877ceccffd06e3ab4ff3f9b7b2b2efd784e07f3fc6df1badaf5f7c56fd1839a0f403fdb31df8cbbe21104c7b7bbfd17aff5e7cfd50317290fdc4dbbb0683b60e84fbabc7dfea555fcff6aa4f7de0f6a9f7be9ad6c74df3343ffd6a5a0fe3e3d65e67c678edab0961fb18bf7d0c5dd3d23882b6f73521c0f8fc303e7ffed8f118227788c4b800b0be7d198f617cded37cdebff8c0eef1b3be1ed5c72dbb1d417ba5c1edf1ebb80cef73f5e0cf1ac46f3ffb72be9e4e737a7638ee635d43ebfb7782674f19fe1fbbb3ff91fd8fdd9ad376ed23023beacccbc98e02415866e0bf5d05e8dfaff321370efaf7bb4803e6822a3f236883aea983401b47fcad33678caf48754f7cffd6d4b8d41f239d52aa4116d5a0d4f2fa471a377dc29f08397ccf881cd48f47fc720a720730ceb9d5fa7fc1268fd7a0202c7ed9f3a93b7164ff8e210f4d3d9cd9b01dc31e90d854ca0021664b5c1f83114c0d41db1ebf7620dcaf92276e8fb1883fd7576a335ff3c56acaf261600e18c19440e5a6feb1e2165b74dd07374fa966fe5cdfe3b4c7820cc69c5d7fea663dcdd7e7e9e1c1f8cabdf7f575724c1ced6b7d1399fbb87770ffe275666be2d0686c33715e686ebe268e12396e4e73ffde17e70bc6176707aa8ffbfc719fe21ef59bc31fe634b8bdd59c9337a90a526ada6f52dbde3f1f71d3dae701d80679ec1e4dd3206c6b7fa5ac916ba85eaa2f7ff1f3a0c8333f17b739b58e77dba63509a33ce4bceffc4c93510ae152babbbbbb7428e84f6d1d8089282a682591e33d3142490ef627bc245cfa4fb5326943d9ece8dc77b74d6a8bc11478e463ed53d8f2037ddbdfe8bb7d97196fba6773fab6677bad03e7d6e497357d8c374b5f7b6bad75b2c1fa3f734ba7d75a9e895397f8eea1dd0e70ca987c307b6b35286376d33f735ffd33c14c5b0b5ab7f4ad0625d5353c9288f480bed54e41d5a37a2ca62a8d2de52cd6ba1b19a5db4729752d5b900ab0f7abf75dfdd46779b6973f134bace99ecb02237d6f5abeac73a335f7bbaf2f5b901ee0af5aa76584f9c7b77cf0c7f7f6f5b3f73ebb61c913a394524ab10c42cd7c254c35f241caee60c7704a991d4e510aa73809a778d9dbe69ea42bda50cdfb1decf87e4351da377f3e4f8d8c56f66de3b22ccb7ab488b38ce362f470af61e9e0b603eb4d837373af335dbabb7ba7411f1a19e8aefdc1cc37e83aef6a838052a8160452edffcc1e9a4f61fb07faf69d8dd1b48c67bac77f47f6f7ed6fe0cfff4c7f9a4df3b4ad6cc229af20463032496d37cdf57ae567f934af33e595495ee3f396fae8355615d0b47f600c9d69edef5b1eaf2163351a8411486020923eb8fce21403d12771820895448a988454820149a252912588a6107549b420a24940922824134411062fccd8175ac897b263181e6d1a3b864b56ecd8e9b0fa95a3ce66801c3239d93326a5545eeb33840c6cfafe815ac7b77be8cf2a7fbed5597b92959895182ae704b9eaad5601326ef94a05998a8d0039d2cd955b53caa90790a503369d23b5d4ae9ac85fae223c8d3f640198d970c81d0000e4486d6ab62124f9c11667c874644e6a335f1c954cadb555fe9463b6e8aa311467072e65adb5bafb277f3585bdb2c568e5f8d1babbbb7f6bbe7c0584cdbb5e30324c6eb1d1bcc83eb05cabd96a793d3655a6b1c5d5114152727ac77029053b02608b11ab4070c1d17cc525a62df78a2983bfe58a4b069f834d1cf91f4c1c7ac39692c6966f649b8e9341bc299d383e6b9276dc74cf12b294f76b9571fa8c61cba98caaf66bf5eaf2fd5d439958a3f210d2fdec71765f461cfa370f21c979adaef19965ebf21012adafb7382140bf86a49acb9e829412d870c45c1379cbf78790aa7d106bd1e5b299afba0262beacf2fb2137a5ee7466193655d870c88d6be4bef4e334ee21e35d7d7e3fe4aeb56a28daeb4c4a77f59b8790b28f4d11c77e96b56f08c9ebfe9982cde621a4398414636bab39521a23c69e8790aa5ee1775ab30367f990e7632d5b7445a98090cb991d432e6312b05f67ce982fffd77cf9af64906bacdf0f3935949029b6e717432e44ecd8593d730e1b0eb9658e77c32177ccfe2fdcf76a4a5e498192353f098a36089b11c19420028c06103b5add7231c95edf3ff7cc98385467a32ce39ceeb6a2404e91a37c116c69eb965f98e7e31ea531bb355ff24b2591978e6c90db53898b2d3feb39a7d370c949b824e567a80466535a45c85213f1632ba8090caa7419420485891430d9b2056a4b125194ae442488a8b04105235ec8e1c912a5214a36e41d43a5244a4628a5746514634402062bc218e67235a1d4452f90c527065cda90e5bbdf309b5221b39080090d4bb820c508872856949461418b135bc06899c18a04445bc6ac60d0d2454b16264c5cd4c524d412665929118096a321ab245a7ad0b2c312512cf630725c455c63939ab0bc60e5020f4c3cb1058a31589008932439bdb03a1266194ae2220a180c09c63023465cae214a5d30d84a05d8aa052c472e6009820896228aac86743b86585480854b09c45c39b32a22854a60666825a4082a3bdb312cc2e93edde46f31f5f30342eac16ddbfced33dd03f5ae81e4e72c8389bea67d9b309ee6c5c3f8170f84d48325e5d3ef219fd2979fe91ead96e6a181907ad0bcd44030bfb94ff330348d06d2912f60f7595afbb6eee3341052f640dc6b9fe91ea947692019f39bfba9972f35a7814cf09b07429a1a480af9cdfd4dc7e64b0d14fd666a2021a98134e037f7b907fa0c537ddc894eab8f3bd7fbb823efebb8b6fa80907a6cef6920b9b37dea551f10eeb5cf1f10a41e9c96460fc4484652b6d16fb49ce237f7be0c264e0301421a21eed4b71f77340da47edc01e594cd11f1b463ec189a40686f71c6898252c3c33e0972a7eec85490cf1b05b60ab20a92aa22bc02668334bce205ef185ee9125e1943916c716e7827ea40711ab62a7c503dd8a8cbafbbbbc6f2eb477dd24929f5f992fa88c09c32cac053656ccba4ad33371e1476b5b15a2b8d511aabb14a69174cf46957238f06993e25f9e18b0f44d00dfe803e34c6ece9944c7885887008fa449fe495b4cab358f325e506b9ecf3bce4ec416ecbf0c0646e4260be6b5f7fab9cdc5cf723ccef74d0ceb4df3e50665fb3c7415bfbe2979d7d91f57306314e393dba2f712f8e0431d5df9276ae805e0d72dbc68440f6af5b79ab59f661bff1a4c8e0ef97d76f928e7f8e093ccdde7fc66c3591e547d7d8a5eea0e90addb7f56bececb572f7508d3916a62471338726a59492be0e1399fb9ccdc5a6d66c6a4d2007c639d3604b83ffaf176ca3e037f36bcdf19e184124974491595864b0d56ab56c1354ce8982bf095fb2dc3fdcb61feb856ae449e9c4ba355f1e1519fca62f43186dfaa9795f47b421b7b47fe50474a20d196d48f0f65c1caa43e5d7b7bfad3edc793613c72ed9f56b42c06f9ff5d57bfb81f841fba88b3ffae241fcd60a955dff5a79b2b7c7dee32fbfcdc4b15a3aae3b8238970a77deaf30eb5f7ca07d67e91aef6b425875dfbdeabd0f47d056e9fcf5a474dcd997335f5273dadae7a28d13e4de24f7dbc5f86fc5f8621336be58031be3eb8f83befd2deb72e870019b81a8442e166539e910cd0800000120004315000020100a8744e2905828ca6379903d14800a8190427252960b43510ea33008622086410c0104116388310618a310347625008071888b7a3cb869337ff8160ff440143d21f2e4ee39749ac58f07d2733efd7824fd66e1eb998eeb330f7b1f63d820d7838a7a3cbb6d328780b71017f67a70ac533197c7a0358b9c1e08bd8b02d703dab6b81e2cd6e3e17264c603bcf90b625e0e8d3243ab23e1c90c0a522bcb94624341ef6ee9755195442c8a2fe502db7da8c6cf031b88c606c5d42e7d2af271076d0f47bf244e34f6736512452350727498b6cd37461f5c2a7badc36b5f58d55d0b11c7e44406772d33e60149c4aaf7691f844b3ebb0f0ad7efa03c7aef7a350aaa4d9a55ba4ffe35b21a006ad0b4009f16ddef75307a801362f958364c3678565b9b87fd2b100e10254a16bcad490dda887501efb26f13b26324c3c4a57a2b74dadf908a4234600f7bfe4296c113cdd509ed7a73bec3272bfcbd0bc3f7fe9ca8721bad77e624fcba213676c741a8003d2fd5c8082b808f21987bc50aa8b0d69ab7c6005523b97a5958c413b52ac39fc615c1eb1ad25e8b209d5553dc305eca36044144c56eeea53075bdadd231369c9079522228a4f4fbc929ef199fdbc1f8edeac121b3240e4f2cd0076aa59bea6d78211f884cda2ee776b8ddf2785d1f3a3c79f273f797bed99094aece437f2c87feb11a83230e67d7208d302f31e7cf74fe3c5bd6d111e48511aaee0c2b21724400726394a955623593a722d4776b80c8d207da89237bed1a73df29a244c36ec251f56d5b16fb213d88c19f8ac25a79c36e896a5d56dc7b168db1cda35b03e8c594632d2f7f0215b7ba4ee413d125596d2db6cf5a449a5664ba8a7ad0bd72069b0023e5f49d1aa53482e2bac0b36521561d17ee39647a2a5fb050631db5ba9e3aef5a65b022b66a61e52bb6edf37ba7c927efe2e2c37d5711fda754635a12377972ac1064a4ff55e4bc01a74704340251639122e12f3a1135873b055db2ef008a9478b8d3a373a757166ecb626c752932fbb7c32e0ffb91a08e86e367901c8656958a7c69406bdf18c0f56b096a887ecb8d5e5c5bcd17ab8fe78a0dac50b65822a8e322d7c3a9e48ceb3bdad780d37893af67540f1faa05f236c176dd02a34ecbcb191686a89069bf9ffd8f00045bf695b134b3fec1fa78fb966912a05877f59e627903cb0835990cea53fe981f29fb36567f176003c26210839e18038e4ca514c868fec8bbde3eb033f870a5c5f37a124af303857fb29aaa25569e38e5f718aee33b0edd112fedcb599d7ded75ca71db82323b0cd3085e30e82d149326ba6119abeb6c18d3e0a9f467d3fa6feb403d3f6596743bfdc93f9aa51f92b1e27d1afbe1073517401c9a70a60fe3895e4243fc305de0d822dcc645e9e54318f9e2d4cec6df9849709c6f07b996c886774150afefde0979b90a9af9cccfdb6c1e865c5288ab0b50576b62b0d8c709567e36508c79284949b1097bc91b637480c4176431b5ad0d9c9b115298e465132de052cee26b394e0299fbe6a57fe78350660d6a4a797b86eac183991eebdc258cf733c7df202da0b70adbfa94d72b745b18b8b7bd8f4082ea6d6a88d644b07b1fdbd6b63b6a9d382616386d1cb203fdc69ee6ec337bdd00bed0087e780c1a503088a48feae7768b316462aa167c466afc4300b6c590ef02912e9f9889e427442a9ad479118440a37316a222d160a65e7f4e7ece044f08d0974d2f9939726c86889923a2d683bada9b23c522493d475af2149f4ac4eb89c4b4a3fc74b0a840062476784e1a825538dbfe32d6beea3813ead81b17afaaa45695b6d989e2785625bb1365c533ac4f2edd5bb43d6d3059bf90861e221cdaee85370bf322bda8bc387d01138912229542736ff4cc64ea05340922ac2c907e8f836caf24d405b27c2b703a456b991a78bd89c4310085cd6532fb734ea2b6a59e5ac5ff4e4418d339433f0bfa292692160b57340a18fdde2ebf703731471cf96898ce444e63de90b900c757628e6a03c467de70c132e151bf780d61d40705fc83b777d238e53adc4f0725bc6102e5a4e5d9eecfeb49e45ca5267578e0636841625caf0ad6b11e0128fc3a883b4ab8e7ea8badfa25da2cfcdf7b491b106aa70fdd0fb940635914f02f72cb24894ab4f1031705c784e4e666283a011a2362a398a8af71ab982d4c9dac72bdabd216f8177207481f9a9f4d4863d07f5a80cfa2dbe12dbf6abc35981c7b2c9ebfe005a3e52f4a3d86208a579efff05fcf9f710fec66587c515962e278476074cc551ab3d3f4370e51e0b49a552a4d8e7b326d92339c1ad8b1a82c0c502c369a8026baa08299b4dc99255e0918e8a8cca2d7a3d64793956d9533d3664f837f0d16b9feb1097bda8cebfc902dfec3d873826a015d3fd911f5b936e17a57be347c32eef82341ce0c4ad6656baccea0a8c2c4dfbfdba9711e8c646b93387d0dc4cd3f3a59d5e9f869f7991354e61e199f3ad0c89ec364c034e47af6b312725eefeb457ed0161468886dc5e81d480b28c9bcd3aa4da59b430a3400633a1644990b75bf711cfc0c75d099b15c4eb71d06b03dbeb4bf4c2991e8eb0f017965b5cfa591b3700bc1b7f525b49bc4f9f9631a8ee0ee092cf622d5f911db05e1c4dbf8551d14fee7eaf1027edfc2f261aa47f79a248bed07208f245b41de34e6d18aae6c1184639a9bb6465b6f46c6849bcddc26e0285632ca2599714d2385ff8428952b13b9634c7f80c287c9c079e9693d445431598b27facd25e8cc22baf91549336f2226feb7856d83e94b2e6d9452883a5cc1285860cfd63ff6ddcc3e003c39c5a170046bb2f0bd4be0239c2acd947b4f4dd3e5d341d6e182d6436862cc9bcf065c0fafadaf15c6c4d07bb53f1351b7aea962f0b14fda0279d28cca80abb304e0f38c1dbec01a4ef110c28379153fb8fbb27d9c5ced700d9903e06def6e43c41493c19f3b4d82bb7a59e9a51c6de90d3a6f4df88362c4651f4af0595d8a05a1b10a4970bb0d493e951713e3e634a64b9cf8758bbb214fecc086dc9833fc008fed620bfa86af4694184ced271180995adab2cff947721073ec4f09778a1598d26b39fc6dd05b5b069548b58b784f7be83cc66d1172d0e04ca7bba00947f2811bf7de80a00227f44f8da0530ae6498e0fd07adb5a1e30ec85d8062f8683ad37dedcb76fa14069fcec072237bd4d5b02333a8ae1027788e9467a07c63a032cfe1a6769c08d117a7d4cc2be05057eecac9aa28fd5679f416c8a300784692804e8d2e3bd0416b9088fa8753e17cc0f301600ed2bd521a8adc25fbd6313c5277d8ad5143fb24d610a1b4efd0a4e02234d33d48982f928108bed63e9d909a714509eb91d8fa0e70c06080b543c5a0af216a5c868c4595eec90730ade496552d721e5c9428d45d607f48691b375d6f231e1d11940b99efe05b4071641b6d52459d2e8f47563a1024855592bee32117a09d3a21006cc98adcec3f248c2bdf80927a0f957e4b877b6d881258f7c24d784fc59d8052b6b4a17f2933c1f448af2e39f11e79bc0968c6be7c9e8239612f51ef1882fc81e47b761cf47092814139b3d5be336d9db5e0d2661a3eccc9b2db4cbeea3ba94c605d4de50f4b488376593e0d7db53fb66bde341f15eedbe6e2dda77a106347a7c19c224d02f72115ebc333cf0bd84257377acacd70d094871eaf771595be545707dd826b3127b8234cb39f3edd6d8e0be7497c4da217f1041f43d3b3c93d1a2f3c38463fd0283c8c1e8323c1bdc24b5dc40d16ba22eca98bbde0128321f89fe3dd9750a3eff38fee30ba18ca20afa0a6a373a4afac35ad65b3f97b998eda2a24c2ec44695947df0f0d1a431907df86bb15914df3673e62033d858e36cf8c059643f9daf12783f6a15c4568555241630633035885dd98546d789c92cd52f54cb3bf3bc61f99fdbc0bf97f7c06177a677a1f203b2d43e3ed9e919d3f0d15964a8601071bfa5e6046e56e68ae5204357ba92f729cd4bf0840ebb6cc80616878b8e7ead6d2b524ead0bd5acf9645d3da1308f89bc59fb712caa3b37bf8b76e1236f68f2f89d0e039bc69272cb037cb90074af9e351878a31836d2c618b6d0d2cb9ec58ab1598040ee601b2a457681c22be69144a9a8a54479b0ddb26d17ac82960f11f8efcc7d5b8381e159072eee3e8c2a42f652e854080c8b21a70219e4a9840ec1cae965868f8f7e16ca7688ff11ec0c043923aa81aee78cfc17a8e8701eaf225019afc362082680d9942ca8a0fdffb74314062a2e88911169af8c05473e0b9e32c3f08d9335d7c6ac6e47e2d7043b1349c43a9349e27fd874a31024ba3be833ae7762b4ff9845740234236750d058e85932e36de3c8a64fefe73cb02366c9289985bd127bf338adc8a26d3bccc45c3a2b13052c177348fb290cad84f3bdcd303a312c94b90618b498712c60cdf280e7530dfbc52c4addba8a2d6e7a43571f0c60ea977bdd27de8f7faf169a60851b4207dbc79fdd3fdb8db29849d2bf64326068fcdfca05687914960b7a13a54bc90bd79ad43adc5d578c9a77ebdda4f11c5c0d6d8a60a9ca52ac97fb3d49c043353e57c122fc841476364b40ceaf85b892136c5a7a63fd1654932d2669b1f26433d11f28f9998b9e6a9c67490b00ed6f470b5e0de93cec22365a8dee6f6a26b5f0bb055ac0ce26384180af958153961363bedaa0dc642363a44b2ac8c116f61d8a74cb99294a592dbc69f2686df9f4ac8e8f536f713d04774a62b3db65403b976de6c76f919d3e5c1eb9bbd529b08fbf9ff956697644c54531c65baf720bdcb69bb505e38d723753406b9404a45db8a5ae5f5346dccdbee17f9b9843d3a82e6d2214a7f7e1558b9fffbdfe8389452b83686ce76057e0494c5cddc7031360d82d47ba966633fd181d46b936e9e1bc2f9880f7b55356974c82ac8cbec4c322c2c0b9c7d28912d0a8b5165e625f5ba30ec994c2d4c748033d6fee648b2cacb1bf425cb4e471ff463c849dedd39c7d571aea727e0a21baf38d818bb2d059c4d87e71cfba85b4491fdd90798894ff0d599fa18f4bee0081e0d9b09302459084a164f022b00a7e42d0886b5b8a8904ac220ee7de0157a7dfd14e6d6d35c80dc48b2393c3b16d87ba5d46ee1fc72c7c39282f22d6aa051d1929008f74d421180adfbd628c4d489825f2739ceb1355920f3de91b88df8794211901ea2a37daede2cea657c4c9a786556d10220aecfcf87d42e4a827393f1d0ab781406bfd8da14528195a1ec43011e56b4d1a5859c1efc1751f344365be4ad23af985f9941173d1a3c1fce849260e082fe9231382137f9b6c190d497b928e8f50405f14eef6682f71ac920637cc7f0f9e36426179eb62d0682785f355a045541d19b33a14f4b54b02eb50c2273b6b726ec0b0991c06c58ab0c1292f6dbc5d514ae0571c692eea5d82816c801719fc2e6bdc2d649daa70078c4620eac57c13e8b4245d55b17092c61897d9b8db851b82a18a2084976c3e14fb82c23eb13db5e81492bbb9a4a2d9a4465a0f524762c899d6343973fcf512241a43904988f3f04d7f1240991076b5b4f49acd88433a155a15692841f4b015e28bcee35d6fdd7c94cdfc302a6165c6f758d9d7685100e31c68e5f27765840d5bf5ec6b18d2bf0deb8f2cf509d21ca12418140a18f4912279eb33d3443e46b868d332de4f6ff7b05c00b15bc0d9370637760177fb4781f4554fa0f580a8625faa7303b766426f0286e63cb75f8996ba54ac655436825b516e651ef9d0a497a02deefcad71aecdc08232f1bc3c0b961ff30713520a1216e55798acef2a2ad67015e056e68406316db9a2c44ae59d2a45bedb72d68a64486eae7c2d4ca9836cba3288fb09e9902ecbc809a817e994d5855c31908d3b612da68cd8923621c2c4775555f79bedc0e66aeacfd9f47409576e51cbadff20842014f32cbbb4b2789c6de229b8ea41eddb8fbb266aa9f3b1b6a8507aacd6bbedd916ea711a9bbcbce8f21d83c2b180953c1c067e7360157f0a77d6fa7ba953d7e5db012eff5d0c7b28d5c03274ec5c72e8534a10005b8ee7d726851fa3eba2d8ab7c2d3998eefd8213602904d05ea31aaa6f97960e0192d54214a90b95339fb667cff71d5a922131b989cff4f85f4c2f2f450517f7e51eb016790df158be793f225163750c426e1cf756f2797be2b39ed662406546114a9691510503ad79edb13c83169694badb464a55538a2baa2c80c211673ecd411cb3cbbbd1df8bbf7e44157490e7f1fb9cb23e66d8410f6800e1d94482988a86811d1f65bc9bafe84a9428f2920753412e2b5783db3cd7330f74103715fe0aa9aaf3a1ba882afb846039ec769b94590a6e0c43481fb0c8ce0fc87a9932c7eb2eee3147c0f4431be17d7ee1d907bcd7249ef522d09642462a91728926afca33888d87333ceac1f76d6a3535d1a61e56df3c241043c0beb6c9eb0376b89aeec5fb0f4f157e3517547e976b92f032cb9c9f26e028581e97adc473b3a8a89bc340bfad0c3317983e84130ccc849e6d4be0c12e9581bfd858aba7fa96c9ba757c35674c9cc5cb899b7ad094f0c7eaf55a4769f1d086f2dddfb9748b6baa040f3713636e278ead41aa5cc309e3206053cc631a883d85afdfb567777e059982f44a9fb907193a9fb3ca0b1e2a0443c774789295e22dcdd94d819c8ca07ef90d41845336f16aa7841eb68839fda2dc58ae8e6dba77ac4d915054db31c27128003e435241aa18ea5968541e1e20326ed13b3686d5f7e549da56d1c5aa37aa50fb4eb1c022033229ddaa65165cb3394accf5735e3597c66de2eb260628cb21ad0d43a8712605ab4ddb02333e82c182ff6d47f4ca607710ccc91bfb0f2d6325cec252978a7a9d0c1ce326c61b253c1da998f7cd9b124266059d1b369e17486014c90df3ac625008e5cf7c3b229009f7e6179fc0f097f53374514f43a912b5a5673bf00c89c192c6d4c53ce5eb717ccd9b75783a19eaa240c68c7db7fcd787a6055e4d7e57d723ad14e63d6942348a40b375c09345142c1e3e3f7934584fcaf2bdc43e16817d3cc970d414b547f8798d3c0738e9813109dc885975330dae244272403b79f3fb4d55de02334a6c05c851d77b36e47b78d48a1412178f5b69947d9f98fd58041378629b7b4b99391184ff926c10dc25415b0d5c227a201035448aaac0a428927ec5e8a15e884cde16127e784a9d14a022e8ebf8376062955c2b508f44f9c0c8874c37b60a3d2d319ffcaadd0cbfe61154228e397dbbf8452f69bb0e7383c0fdeae62e30ddc485e8f54f1378ad3b9d2d175808ac3ad1f367ffa69f2a88cd822702eb2cf78001a54d7ecc1417590b33ec288839fb5f6eeb9b1a9d4e48dd5efeb2a5102cf1cde6716692c685c852e09378e13af62af9f29dfcf52a1fb62c607b31520aa83070c7ef4ab93c76b7358e92eb592c1e56990c3e1785a568dd92cb3b7e7fc8d047007d138d99324ccf8fec9713e1b2ca063fd5142567d6c6d0ee602eadd8a59da2c51d3747f351ee1b9162330769b96d513a5474296f6120e40bf302f392e8ac84f8ac65020b14475cb44e08ef863ca47ea091a7aa728c6b293004253affbbe18498f76764beba41baa5a1f85da5d6fbb0c4d10121eb0865e5a8f524c08a623f7db2a67efe5b962f788fe840a5bf04997d5aa55ae4b7d080cd10db76e7f7949bb34a8896f4e59382db796f03e062f496dcabc63a527c50eed4dc3b05b4867cb353e891cba38971be20efd9e7aca86058eabce65c19461074b9aff2c96420310994dc5c211151822992c813b4d1485c4b6495287893982bc42263031417bfac20dc71dc42c9a40526770e54fee1819a41c30661947a484111c9fd5c6f3b9e3a15147fdb60750128380baa047832a47e3c56a04111ecdc3e3494645a24a9df77cd5d1ca52c4923d1a759baf27b2a0b7bb58b94374bd210407593fa05c252a0d71846030c1fa56abbb854c4eed16f81ad0a4ac09827fb15ee0b5d30f1f1ef4807900af40f8aec2859ab8840aa2455bd3ba92a29537613151aaf35b4141ca54357c1a13948921e50d3d0ec89f6cc51bf2932b9f7e7aff68fabbf547fb3ca82b47ba84be8a8b197bff2434fb78fd4affa217d21a541aa66b276f9d833121b10228226ac5fc1f4d3c29f08cfe3a7d50e42877d3862410d5f81da41dfd47e2457d9e14d2ac6c8444b252019a55a5008274f34ee0f867032cb4cc7072a8b599a65350a7c37c59245658556ad28842635d7de5fb5a2620527233c12a797119e2dc68d11bd779c0e0d8d7acc51fca8c6df350192b2599d15ec802054702175b6ba1fc2f76a4343063b76202f2d0f91794ebac40330914c49de4b12e1aa076b3a502b54ddd6bdce0d7b4d63134d7610a9531d23b5f48458f4cea92a1c5f15b66e05ac7ce163842c5c7916c1e73f7d2d13e250ef2e217689450c8fb492813c922d148249cf4da1120d825852756ec8c4714bdcfd3c00f0c5dc6a5721dc275f1277383127e0631fe077539d242301f7195272f9088c009426b71452c819adbb006d76a8db2ff3a8a8b24c42add5c2ebc425d7d5f0bdc44f94a4c33ffe3c5401351c212fca0c1a89646770b8ecb108def7201cf0a4a0994cf2069485866c4a3ce38411d3a65caf8bd260fc80da00afc9b9bb9f0dbf43848036c04a002838a2ebc5c5fae1addfd8bba2403ce6006d96e7b6a808a401442b8929b557f2e1482165fe3003bc30b6a5ac9396fd0c3bdf14cdc49dc97ce4c7f2513b436d18073f60ff890c1e1fb77509c1dc7e49e76955207c1734354d54d20cf0a1b9cf74936a36b0cebc089f3571fa3831d9167ff0306ecdd840621caf616329363b73b751ca639a409576e8ab6c9d7e2364fe20722f8f3b524902c9c96e64b6ee668da141a65caad510b81334b36d9843026cac95a67347ab3c5885e62ad780aa6a11a965705fec878ea5b5b849048040af18e61cb52f59415d544f545505dd2fb2a0a24009965c819787108fc43c05bb99514c4cdea95180e3f98ee0df5b18b41f22f1788741749defef33d3d31d856c5354b20730e13df69dfe92a747842a3d7824ab1fa83af442559df6ae3b49ded48886c87dfecd89d1dcdba7309f1623b51f0fbbd1e70d39a1844e1e4943523452a24f0b7e6f923403c729f9dbf0b52dbe608122850fba268875481244d6b0dd22bcad3db63962eb2070012761c641565c93322ae78e5d853eb2b680de6773425e7f1ccc2eede1229deba41ad57733c3a5a7182af86526813e64ccb47723bded866c31b8ebcf783ae42551409e8d61e9c4a1b3587abb61c8cd6fd463931c618d6d49e5b2f09c9a8899c4c549530f8c9e9330f406ec78b7c0ee150d9845c350e314f0020f39f05846a8133e0364b12f00c5c7e4956acc9c958735edfbbd6df71e30f4e18bd427dd9a6a061ff7049db46691a61708e269618b1077a4b3842dc60eb6981ac08859c61282c0d605036c7efd83e82ee39da13988704908e5096405351e0eaeb0c69fdabd3e804c0526ba750e91f4a33bdf0697cccb247abb035c30a39edd1303efa119bdd059bcccdf23535833e1ec8f4a0c41754089866c752fe1a196a3d005cc602187133e7b439e17067a7b8f0e29af526fa817e78f0d891575afa5add24a7429532b41a1bb269e988aa1fef70c588eca16e934f74e79ed46aad59fdacee75f3c66849814de40644e7180573eb0c66a40bfb28cd3619c28760ee8d6b550d75e13d3d0a414af25b6061334a6d20f1f6d7bf0510b1038e8820daa9753a3814e953401887831924b739cb353f1fd5b33bffc22456f8eedbe2811aacca02add967bf18466560ff1385ce35eae6681f9f20ffc285ec073721cb3835ef3a2986af68a1c2b972d1217e923756da129f0e31190b816de4861b8282db9f0db98518064288d078e22c7c872bcf57893ae70f4c872c40e856553162d3f12b406bade7b661d7d5652821753b116b1f542f476f24c60f190dbed229c61612e3da3331b86de640e377125d71eaf53f02b433444572a82763f1b24a9986f4ec5755a541a6a554214c08ac08b0a16d159716f57a7b0c7464f5aa8448be990418ba42d3bbf50731a8fcbd8c4f416b380a833c814feec684a231a058d914eb1ab7f355e3a626d8a3445f4afb1e5871a8e31ec5e051fc7710f927f19f816f9c50480bcad97d9b12e5cf12904b7ed201cec186beda8046712629de986e09daf339963304beb5d67694bbdbaa579113f75fdc12ddf00d75e4a68bf951b29c9d4f6c8d708626b625c9f97ac91de05796ccbaad02aea03a58d3fa5ec4ea31be72334377e7b0e735c261380f2ce041dd25873e3fc5470a2a6f1981dfaeaa84fad9de2ebe7b296dbe7b681ebdab6d8b334554c128ae6138a5f36caae7f16e6156677a363ab84cf5a912959939e2493cb91c56bba1283be82032d36130929c51a1d721ae097cbe531ee97c7901f56fa5d38cb32cd6fab8012393e72adc66b9e6c432cda72ab9e677220dfce129f1a6e86201ddbdf0446e95c9db154b92b07b99397dc83fef7bf34851bdb730a0b365281a8a2984fa1a14bd49fe2b583dcc0778779c09a5bd352d084f721ad263610621ae40d84daf9bc53d8c5126faa775c3fa2ad49f5baf462aa14dce2bd6d83b98bea030aecd49a163f288ae0f48260d5147569b6a2044370efd1f6b3936f84d2dde4733d510b5bc9dd8a9a4b04ece9835648b62a5a29225216d5e445e9a2854c23f1ef4eef7c102a1ad8c3374a5dd3c2bf7aaf93e60078cc6737eaf7ef25653ca5ee22e4b942853205336da3a8b424cbfcccf3ceed691a0f298243dab5a803d3190aa140c45e1afd502d60ce99c26ace5db60ef0affc1a277a30df4f7f1c5e86bb1f47380f3e6efe8f7b4fa44f4658c08e05a444b5d6d7f711e6bfd6c5612309bd8a2fb8ebe6ca8a49192677474731103cbef3bb2ec87ec309992687005c8f4ed69306a0ef9108027930ad0b05cf731e4cf0213a92b7932027912fb616ba32432ddc5ed7a904468e96fc24f599e56c1e407fd174ff7c70c1a50481b429199e4af367f6a51ee60a38bf447629016fc47eed49494e4c90132bb32d3f2672d43a8eaf60ec536884e2dcd8c687c3c933763246ebaf5cbabee1ed1414d405fc44407abf7f05335fd05736b39a56763161182eb09a7d980f296219d8edfaac02c40561a62e6cf99dd1c5febce19378977b8fe633b8892ddba938ccac4d628fc84ce3e8a94d224d71e7291bf7013979d1ffd7b089f3bc21a55524d0cb2141a567323c18a210d89af78ca456bc84a58ec81d9b685e3847a7675beed43ddd5d09fb4bc01c94d79cd1112de4a591f1fd4bbbf3091c13aa63163135c0801235cf8045e2840d58f219c7c0a697e1024a2a12d179c8a49355e4a1b31860fcb145613f7de596a139f8fa7491a7836bc93840b4c59cac213dd7121779568221ff26bc6685c112a20e0b705b537d146b723ca54a0b86918c9ade80faeda96e025e4fb3542cde072b1283525428b7bacdaf468857428f1e88886c95f40ad10c4e414b20e48c948d1eb6f8302cb0f94f7e10754f1893586bc187854762443ba3c1efe2b146cc7b82da3ddbe41042b6165a431e4f55e03b8fa7b4c04dc9e32dde1e4ec1efd7dd63b7caffc80360757e27704e4f40bad3e3ff79f8991f5e83b5498cd67d2cfccea451c937e1ec09c6c4730204212d8028b41133695f31052017391c8183aeecc80f3b383cd02f41989c6f8c8421a3821378b93901c8162318c35e70ecef6171535d6e47f92254257ee11638f0da5c88c3bff7d5276445d67276d15b195c33fed8b77df0ecc891c738578f1dea1d7320cb0e01fecb3eb3244bbe0b2a21eabe9be829b3e0d40a7ac007c41f50c85d2bbdd5adf8e60a3c24ba24ad305fcb1b7f7d4c1c2b245a2daf854b98a8b6ba5a1c54fcbeffa73cb5713aee380335665c25daa07253ef9fa0385b5672ae6d4073ef27bedee99727f093201abf7de2ddb721c07b93500828ed280114622810413744a0c719d0a3019c126700caf418af22025a3c8eff7791e93f3c0c2f92e99542c3914daeec8db88f9c7e82bc6de61ef78c6db29e70c660aa88855182b7afa0612ab22fb9fbe91fce65a95b861cd747fa30f7bea508bf66b059de124c82a64f5c7b17eb33639b0f54147224445877349f91ee3df31c479fc6eee21efb71c09046465e8cfae162668d9bfbdee543e5e877fa3059e2ac600eaa13034d41586c5280c86bc79ecd7643eef8b2385b78f4046dbd0153cff4cdc7742597d1c8904881313a0387799499a32c54e48e5502576decfa7547b3dfa9523def77a4a54fd01147e468cfc4fac857c5eac4c28e5267ba71c561a6aaa151dcbe169e5a0a402c4b961247c41243fc77bd3abc3a6ba9b6fcc522e22b1c9f00c309d943283735c5e6db2bc548ca53dbea76f6ee843146ba6d1585e5df3ff0974ebac69af32b1500a797de015dc3fd01e2381eea79f5ed755c8eed012dcbe7e8a34cb4af46c310e757cdf3782929f7b70838ca555d4d805d4736bc495bc25620ff705ee49978a4773afe723297446a98784c0960731f3e21dbf6e9efa8cb672a55150a7e2571f96078ac2fa02ad2976dcc116cd59c1102daa43185dbd312a27495143441611550ede11b2ff2c4d514f5b9523161e8b09808ebdc324e1b910b69a369ee566757b63b1eed285e0eb3f423963cc36e473986773d5ce72038c48663dd01289453c32cf4f6b73ef0885333fb82cc962fa043d1f799f81e78e9db0e838befc38372f4182c59d68a89d78e535f865e6fc936bf68e6894925a6c2ccdc80daaeb654c8f34a81a51295ca8ba10236462ccac4bd99582e03f2b286e54c3dde8486c81392b519f58e046d4a0aa8ec4fa19645cfc0b8763ff0238772dd4312760201e61d0c5664f3d6a38315e5e3031ef15146d61b1a579ae06d411bd485ba346c06cf236d60f74541cb5d98f99bbeb01f36b6504a56301a2098e41f6987c2c231c86aa8e4e223a16ef77c54071a07c74ac076d1aa640828fa06caf3ac568ff9fc55f8a961d4d1ebd14099ed43eeef9b60048c378a75a9630864398662d686b6b7ac90a4ca9cf47a193c03e7adfaef97456e546096bfd497cd980d8ad61953e24d5f4c78b0c120abf3836361a45ea61b36ff5852841386461df9c18a081644ac7ece371e1d77f11688076d823495c5309c60df220470a60017be39e1004a898b1121af28913d2b0c3304fc327e86ab3764149df4d8a35b0aacf7318438d39f08ee077fc1f9addafebae6333a10c4821e87113eb308e01cca079b217f226310dec66ee25f48b7749b404f197e09c3bd572728950dc0754cff0b78140c998739293a0f90187b0d6ff305ed74ce51b9211495c17056729e8d7030bca6749aa7f168f81c0c8d08245822e2d55f3605c8ba3b55a58254bafc8a17dbc9b0763c0ae86131d6ca8a05047316b3c014b9614e333f5d9322ddeeadc1a729b64d26891349d9ad0bd72d5728dd9446683fe6b83c8a0c2890b2395fcdda94c9e8c235698a14228374b3ac01cb8984844b356cbca195e665bf7217317ece205068e4069f1ec9ccd934d240ea0f5183b9ac472367853a83762ce275134c833a2a52408b39c8767356786337403fa553f1a8a3be9020cd5ef6750127b109c08b882c517f87281a0ac57f52687d07984ef40b7b89b47cace0c625159852035af4e229f5b090e9e750af851299f453aa64955b2895d77b54faa0e2d48815f24096e5c1ec24d812043fab5690f2e27c4c1957cd3da403c5345f2751d150e1934eb4c2bdc32c525c8cbc4b970e7e48964458b09bf8aa34375d1e762bb4facc29972746dc648e5f6c2e8313abd8fc9e101b86634af44dbc7469603aceb20ebd7e08a3c0cd3aa56c504604780c925b4a2e25304dce03b69ca960a3236743aaa511ef4666138538213fd86e24d4fbf6309a9959ad7b5a505982e068ccac6897cbcefb0754a8a3c2ab1b63fcd84b7342a09a648354ea4292a01ae8bc7c5a10ab11144b10a9172390ece4d9445f2961a725da4fa7cc3c9efb912be1bede0d4222199c9995ba2b8df5a14c847cba1ca0c3752e3eefe82ca9e170fae23bdf05f1d6fff884779e6b0499afb9c581ef1356e15d46bae212eb52a8cb4d55727c835b76bb9b94156333ab25000d62e6a57a7e7350f9a940f0b0c5b6a85b9264c0ea219191f8b6e857704f5134c6ac95605249163e90ecc6c5e1cb12c2429fed5cdce34407af62cdea030496ccd4ecd24f0b69084cc2ccc3ffa556d04aee961fc047eaf03e3848d878d25b6019476b00e11c42da4ed902372acad084bba84bf90898d171ec3d3f0673f4493051c8fc3652da828ecbe301aecba3ffa5e24e2023e35b53e901e16ec7b1c40c7e39259887e25ae30f558fe164e2a648068dd1faa102ecf6c4fa800dfdd530ba223e20f658c71f79db9dd44575e7c5b832bc1f255c2e6307db04639a945c659ef77f9f767737f8e492c1f6a75e7ac832059e523fb03087605202fb6da60063215c9b125b274b638f9c3dc20ec5488c5ec8c5f1bee2672c8387017b19a7dcd9e7903a2ba41faf801d27366dd30afc6b3d9d37d22e588c07e4ee2f2c7f4bce4ca42ef757a9075bf96ee0c1b6b025ec038f2eef2647fb566e50fe39897a8a8713d4814a9879c55339a7195ef84d4ee47066d588def4545c5b6a52cd8d5dcd208b752166305bf8b3f5109b4cb3ed1b8108c600b3e7dac8ba6516821b568268ec0763c6b4cea97d4dff9aaa5165d7007ef0c200276a02f88df1d9dffad5ab70fcf7531e884a0541c3fc35e2e3b5b78da2509b9335782972ee9b72f987bb523855b116b5eed68680a3f3e157d392e9e7b11d28e274a36ccd8100a0bd9267a496d585798d134635587416406fcf087d51e1ba51d158471d924e828a6a988c9b5e7d0f88d58cf61e0aa9333ac4bc1a5d3c00f46f081406274b3c9e342598da6d2269d84bf1201c90b02832d7aa779c7c4fcd97780b216529aa1bff0021d39dd31a2be15a8d38a9ae38ef635ccd56fbb2bd7cc55514fa2405fa1aaeac0e99065c0802396a105f788eb7af8f92f0e2a8b5f40e817ff3c60cc939934259ff5e0c2478122cdd2e0ee4d6b16dcae892cd62507efea0ca3a2f65529f95418846bb3adf1da06e5e5d6a734b224299b9435d771942e82db2ebfcf24e718709c2a17c83dc90122cd69bfe23ba2964cf0cdf1067a3b064fb8397b0e846fb01ba6d2196b55384e52033e6fbee0ea340e745aa2436428129fc5119bb02a4d2b06cfef3e88751b9c75d44347ab469c50e28cbcbec8dbd4fc674c9ca1ef00d8b2e035f6a011d7859b60628e891270ba32ff85fac4b3344fcc3ee878c1f746b337e59a160adec68a6bcfa9c1d4223b893ae601c320468ebbf3de21d86508e73f496507fbd389f07b76e6604a7818940c37865582faf81a72277b2729432c6cd6db10adc99665e44bb6e29ee26cf1c0df001c157fd7da0d5eb7c8f0b355309ef162e4b87433ee0aa030dc9ca9e3a4815e43458496b4d39e74dbd70b469d5852f828d8ac2ab7396c490e476976f261b6dbf46016a4ebf77b341e17ae7ecb3da7bdfd398a8a6cd3be0a6e7ec2977ef4bb5fcde4409379f33b2ef06a1cf292c59ecbe6756fbb20722ea0d5e51619518e88cf538308fa7c00b740a48c61afd2dd7718d1b3a4b9cfdfa590c15a8a4792aaf330ac4361a909e978734a490ae9b96d91502b3b07990938a02848e6bdebea7756aa1ab7d22f165ec95bce641ba8b60e6eb1ff66252cbd6065014804b150fb3abc06386d47e5f6421b793fecc7b24f4d8e9b2468df7dac1871df539a9ee0e15009c00e3ce84779e76d4e415d21af12c04acb9e1d92fdd900fd4c18c8ac2a4508d16bffd1512a64d4af3f37c2cd1d389283d44d9d00f6571c9d6ebf896a6728e53a8844ba9aff39264fa08b40ac4aa70ba781c01e68d83711a06f7c396721aa983f0c46e156646074e9f762349e9bfe366cf5622bfa946bfdec1877c926cef1025ea388e787cd3a07458921048e230acff880a07474c7bdf31168aa08a33db465d5bf8e5d5def483f104048ebd899255130dbd4cae60e527f4f7fd01f2757f20832a34ed3c6ac534e416962ae1fe2a9a108ba1900afb00caa9835103074b97495d758754abaea27b7b96eb5823c02407d842ce18640ae9dc5ece2b4cf6b05e9d7f23dfee2b0973613b08bd902c8566e70ea9f34b9f8f22fa9201a66cad73bf8377ae55f05fe2daa57ab5a129d3322611bcb9e89e54b95cce7fcc6d46bc68f6a91183212d8f72f369a672b8fa2dddd7ed3c88f7cd0104ac24566045d1d4b505fec980aaafb9302c1252587250dcb49988b2ef30837ef6adf5f0f210848855b803a840d549ff2e5e5087229ec4579108d514656122c9a4d6b2f3876ed4c670bd4bc7f0ceb6f62892f4f73897fd4371bbdc4e3128b7a4ed8b247b2d811488f40684bac2c04cd8f02d34c0862241407e2dcae51d0cc133f3f73beaf7bee028763da5175e66b82ddc7851e62da48a0f8e38ecab0e5ae314c95120bc44fe8fb7f63f88d5c094d2be4c5fc0b1ff8cba83c140570370d2371e826103824ff32e2bd820e0f543c1310401fa059dfc7aa22420871ce351dcd48c79d957adcb19d007df7208ca5555cfa71c01844fa4b1e55686c23109a0458df14b09d42bec872b6138c4f9a6567d3a38f893e0abf746f71dbdd1754949d9f902ee2ba57dd9be5d77d8180e3b77feceea883b4ed9194d9814faf325c37f8bb53409fd2cb50fe620025d96d12a2ff815bcda80f7d7615b118ae0f408bc39964dbc961a42f72d57168654b18fb2bf6ea25c264cb622bb40e796d6fbec65e7be3629b6d48e22f8acc9a60b92f38efd319bd0574d5040e4ce7bf6470d2caa790307333415392436b365ca3f92c51704aca20c2a054075773d012888a11d3cd686413ebd8db04e42e2648ffafcd500008b32a5908605f75c1763718e14ee244f36750bcf3d7c71dc299daf0ce5990423f14081408470279a8b57ef503fe9355fdb73497f984b280a1a394614a7bbb2d904ee2e77fa793d139b687b0710d56f133ba78e40722bee6ec023d9310305c43b72ef063ac86a332828df103bb7e081f61ebc73aa85073bf2c60e341f1a70a350802b24ddccfa3bc068d6c34c454f9c8183c54077f0bff51121a9920265a71002239cce3ab05c55d07dc9f988825354a555aa4564856f3173beaab456680d621cf19edbf27c1fdfc9538c99bf92489594fd9e999b399055a136ef763b7aced22e52aa7f6b276ac1d8d08435cc973654fbc670153009cde5090ecffbde51f4f1fcb89696b8ea689d1f044694ec819c7834d6e6925df9ef0707249cfe13de3aa0f4aa0090fb600e8019418db6d40df49f1d4e5bacad38fdfe0af0db4238c90b8d6021f09e3eb8cc0d1949d2dde24f10761e21da4015af1670436cf1d1462f968ed7e879bcbe43b6f4be3ebe29c34c06e2dcb4ce5fafb1895a2828d66395df877284c1439d5e7a542da38c9b99505004ea124616c54150d93ec3c9c0b02f0b40f9426604e0e4eee6c556489a6c20b3b02cae095c110750c51eeff5d54d95c6794e419c434ffcae390327490d917f61acc43dc0bfc3fb84e212b2395957a515ce860350b946102b006bd9100c141fa6b233b027147fa7383ecb9d795b688368f1558efef3a58987dd32b7ba78194a5cbec914c883a6f4bbd307080c2808afee1230303ba8a4f90093af02301918e776e1041c012e724752375d4a819aa52587c7b93a45c2aab0190e78115489daa11474ba028606f19768bcd59870794747ff7f72acdc7a167966e789d4b74c536a6efa2e74caf8daced4bd06dad79aeb9516bb3a6c0a684efa3aae3860df0d2a41c75d7ec9c4301f09e316ceb7ee9ef216aff7baef760b631edd01d3909886859dc9c8fda15cde9bd2c02474c3043a87da6b142a61370d2b210040f67b021579001c66a1c32b2c3623ea4df7030875aca89093e7647fc67aa2d02d4b3eef93bc827fad5ce261c0f62944168b52f1cdfb99fd02b113d883d3f2bf1cbe17b87187f2d8874a0d6f5c80baf9ef63413f0626ef80691f59d740eeb76c4eb24f866a0f06b81d2964f48fdca225740ad0b83f0c344e0f13315c75ccf1bb5c87265e8721d16b78901b7cdb079e04e8db707a78f670842f0013bc75f7bed896eaa688f67b88e2487778a73df4da38dcf47b8546ed91c39d2898c17f048591be7010589a9c9a8b63408422115e88631478f18be226a18bd416b112e77d1581aec7ac617d8b7c3f76c595b4d63bd144ddaf20f37031918d61a91bac9536a969e250d95033d343ac5ca7dd573edf31b4c6c600a966f0f32546a60c32c99c0fb803e0c6bc54efb170066ce78f9bc9dcca03ead270645134a64ec4ea2a8c1aaccab2857d868f57217ac47b764ebb1dfc34759d32dae48ac7500af58c9dff6c554137f4c26ff6b2e717401454354979df19d06d3c54f086588fa7e79c26b89996a8b3b1350d6862c5759cd7eb67d3bb7b910fec391ae63d1bb3607b9de359df22985c599629b5b846a37b4588184d9465f22522cff025d9dab83bb40e850df76711152d41deb652f782970d79ac02bb13f5e6dae11b95ecebe67223dbbcb914e9560df102fd52df5ceffe6d3fe99e43b2147d9ab43b8bf4375a832074b0775dd7f9e78227824519bd93fc4e394432752c4e85c98601d1323e010679ea52d367355723236efab3d24b145b6478884aa15452e130794c218c94cd57f8af149b2ea9bb45a0d652b097e7f3488bbdf7e3d51ac2598b5b1cb0ec8d38035e84575a0fd18c81744e5fa90f346a555d922be985c3d065b4e417a067360bc0bcdc3da8c289b907ce606a313dce924f7537a4040925d3c22a6413330099dc012451c62b4ff1e810ef7e716b278ae33be4d74a11ff975e4040814311d886dd0e7f53384c2b9251d45cd562576620f2268a58403a41145a64742ddf72944a19d404fc02691641876c6f3d6f33b30e193a6bfb17a10719b0acaa9d571894cf9262c1368f91c869312a2307529badc2a606f96bcf5319482c8e3e37c2cbd1993f059bd48598f6e6437931eced6a40f1369e643647cfc71e718e92d12dd4d61b1e49e1c153d62a511fc0d08265d65d564c0cf5cd5d4226dbf3673c3e722638e4ded9e296e43a984fd8811668f4ca83d324b37420d7aa204bfc1c37ced5ebc2d7525c69cceb092a0d1f51286462572f0b6bf10bf6088cc3421494e361695147bf0ad18104ac2166d473bdd03ffaf0ec1bae29ad8836903b753269d9d393702c825f7121a276838f0593551b2fdcefce9d121ff2a03e7973060c9c64d5bfdc680266bed913951bc5b6de8612d3484f735ef8110bd350c289b489913f09880838b0056ed2ffcd8bed7c1741234ce616b941f3acd122e03157733e81c779f90529573bb49ba571aa175656bea6af5f0ea442148683aa4b9a41c62311573e7d70bc47b9d35b5a229c4d43ec7f0da7cee827e3b1addba4cef12b411e1587d45c9800d9224ae63f297cd1f394a8d9533c08a10d22beb496f07533b2c81840be3fdb2800507da4f33e41022e24fa7f2266ef6fc637fc4d86151c3a9563e6992c7c30af88804188730eed074ed6de15047527e1c333622a2ea0c50fa26bf38416d2a7bcc5cd17bac60e1d1de0a254bc6621e8d92ab98358733fae58e5d146e72cdb730b0583eec231030b03a200d765bc4040524ac39b14f01b9ea881229e9e4f5ca6001c5f8199ad26ecf42bb38db50e83b12ac65847de4c0b47034eec9a64be454f808c1ce5580e465b52c0c4e5c591956f38544eb934c942e13e1dc91a1a2b333f94d0bb9f0aff3b38d932596c3c644327d77fe70e6a2bb0a103afe3f7f21862a3230441e69ee78b0bfc4e6c9ce3a3bc58c3dc5e13776c12e3bd54e985622e0eb108ccc72e65738dc7458d4fd2c7a89b8e730b97aedce1abdcf53c761985b5625c49ca894d917658416e5e6e6b5370436662d555a79e1da1270eef8501c14bbe9dd3e9c90c57bfb352e7fe59c5b72b37b0727e12a03907c4f5f82f776b884c684edb60dc43712d8a194ea42b9b21d6757748e411fb02109f55cf7acf7de0975c454b39e8b810e8b5635a56b7a8b089518dd44275eda8a491a9a5526e10e87419013a0a8c2c7d789381e8964cacd7d3a72a98a88f8d0f436b52a9b349a51f6301d1235049323387c4e7c5aa79b2d9cd1b6148ec556690186943eb8ea28987522e875af4c1daf027f759c07633e0cd95a2152019e9a5e04c13a04540a3432881acd08afbbeb4f6531a59f338e07188a7d72da4963b6ec42ab553ca3a5d7cf935bad77a1cde44615e0580691323ba0b8eda63900d71dab83aa110c851718beca68e19d3140719854ff654f5cb6eba00c92321c9691261169213dd32576fa8ed823eeddec778082235623234d5ef8645b4b6782fdbe900ef80d7fe26964d628bb7648484a4a37ef5ea2c4c3190a67ac90d4ad82c4ca7a897b83f45bc04fc0d5a2e47edb0b47a26876aa7bc1f0bbb5f5ddb52b543ae2db59457eb3d7c8313193ec0e09ea79be362af4a90cb3dcc2d865ab19283e5a6fbcc9681283d78ba4690ec409f3564eacfc8fff79cbedf8da72276da862f106d5936621ab81a0eb61e82c9974bef6059e1f363e02bf12e9b028f70a9ecad43899f882856d748022d66610d2ec943222d118041e71fc8037c72aca02a22b9352317ea053a03fea2f82a1e863222f773648f4667103ec55faeca601c41f547f7966e5e9c876d18b1f5acb5d0a1b1dc6581d01ba0f965c09d4140170d2ef73cf8623e89e8b6b3bcd11e1db046f3c80a3eb595534ad8052c68b78ff2a8f23462e5a2fdb3adf7b52b54479e79188befad9d60b093a5e8e57c260a2afa06995d806c9630315e963a954c3781197b1263f7abfe49d5196b5157d99f49dc1ea7033b97475a025742e1bd0322db4ddc740c8d9b48fa2d4c31f5b24667f40ffa43c393cfbe386598f7be7f794814ff21dc4ebbf9c38b7d92a196f1f3d33a75272f6e6983a608a163ec710f7b2a5bb62c2ddeb32016a1f01e2e1e6f02c1d32af5c16dd1ce04fc7438354e68ae65a2b627a0914591b155f95b69c6bb62df38fcc5b61146c069b2a2484c946975664188664617481149fed58937e42a78143909b2331ce62a0c2fa71e5e9aaa4ad7b530613fc83a79c22c8bfccdf46925783d508ed1b53da44dc50318c1e976e3dff330042244622e12c4c66d62901e10c25cea5118456efd3e211743f71e368401a31f6cf63c5f3232e445be55cf116b693b516f5035733bb591a365a9196cd7e54d8097c928e10ef43082e155c48a84206e5ba5942f355395fa8d7bdab0efc16a0943d13def00bd7da0c79859c3ae6537fb76db7c5ff22852ca6c08f2ba95cf538c2046d92d0814e1394bef1ca26edecda1d14d16cc28a14edf78eb1abe385b08693b8a5dd80b620ec3c303d60aaccd8bb909827dadc0620bef3ba5375f37c66b2e1cbcd75753a88fa77b5838951a7cc7f385b1100cc8cb819646524f6745d76fa51f6703e50182ef8cdece842e18abe1bc3a7d805f31e7b396dc04b20985b021b1c776eafac23b7680257b0607276f1158b527152fc92d18659820c91104d21cd7937b22e745c1999eea08a826dae65dadce6aa99724604052c08784bab199871b3055a3b662bba573273c3ac70551fbacd6ed39512050f29758a52a4125ed85351cc80081ab5de8374f0824e5be668d5de7b77ff7a304a975f76996c5d0b68929b004180767c235183729423f4201fe111461f9f8383518b62a2e552d3d7206c8832575e7a45c4ab15f0f3509acd8790905cc68b1ea7a3cfb50d4c07dc5d2d878b7dcd1737eef52b5423a5904b857c0d54fe2ffc3dc5ce32472a6549133fb3133387c384e1df89a41a51675d25c79a25fd07edf14ddff07fae8b7c5924c7f266a2082241a014c3fadc43cee07ef07f971bd14e3ff64cc2ad10aabb0632ecd5b675a803d12ba7dd0c8ccb01e6e5dd62a30e5a146669bfa43d87551c634b69a0a8b890ab8fc851e8d66b239c749dcc5487a8e045d097e242a9173da7614b4c97e008232b144ae2fcbf212a0feb713ca38a1703f26a0ec4beb8ca45a73c6d9ff0ba493b3455f56b1c18af90278478aa513de530fa5b79605062c91eed499ab1915fa515f49b27374910a8f5fef415b244edceaae104d7a31a83a33a1c3a660137989514a74aaaebe9e6067421e8136d8f0166a82823b08ebc2a7bdfdf27b02bac425694f02350f9e80104c32ce96ddc3c01911354a44fcd8204fb5903b559b768e7383b11ff3c69627224ef45116ad351963b5497954a1fbc0567b9bbcd0b158c34c92fefaa5c12834780f95c4b3779e6df76fa8631c6697d73e10f1b3bade0c0ca452df82740e2931f0e5ed375e9a2d91a361bbec431c969b86e623d90cc56c7532d19bcc162bfc5a8d78bf71d03f12ec9a976c6bb136be1b373de1ee013d3f3ac5bca8184e85ec3bbc5d71979cab53375a8e352c666b3c6f8bc92f869dff71bf5cac658e4388f58b3d3153448363088d4f15e074fb61b2fccee9323b48e5c1668654536a4c76fec77f92613e9c3ab42d5e156e81a16396067228f33b069160cdbb7ec0e237e468a870344451fca5e2f55167bbc11fe540a94f2fd40fd302d07b02d3ec4e04e4a906e6f2bc2d386edf8cbafbc4ffaf98d56793527c8f08081d4e257f8858229d47c4f5445c18ae894434da3c557037aea240ba9e1d2abe868b84a6d07ab3cceb13421c9051832f8d87e2288072863bc85c2050a63a51015010b4e7ab88845a0d6804f0b8294a8116987568e90bddbd5b4ece4374de97293fa667318a3906ea453d887587b744deacd7d236b879f237c6cc5a672006ff4a5982394ee918e8485fa22993addd9b81c227111714e1903a05e57b442ed9b76768d504a83351655b1a58c0e820ffeb82e5d8617c6cd0f35cff268cd39c03923ab0f47c8141afeaa7832039dccc4a0ace6a411f704d2e93b4ea626d9a192ea004548193410303d0a0813e06687ee18dad9938b22341c063d25ff7a3a7c2b7911758d85af37fdd560350e070c3c7a33c08326f1b0bb5c918605e0c6b85dad7978b750f881f4141e1b31438707671e0427defbb81c478b6a88200bd73f737923cddf683438fdc9f253da573578b379fb0909e35c4afa4fe6c0049c87888187ec0a341852a4a7a3aa7d38bcb10bdbea33cbbcf9a01667bf97eb36166feaa5d0d9e98d9e5d0021a94342d1cfff24a3f2273e9fbf3205b95300daad59fee913467f91395f6185ee79b2573f01558dd7737ed980535999f10a60de0ead31099d5a500057a54187b7f371b9f4718bee7a836150d1057a0380e0ed6b6fa45d6f0dad3db5b36c220ec2b631fe32ac58ee89f02c421672bc6c7de6091e3c3b234bf9eee2b1ee0265d17fe288315edb1cc17bb31d8eeda3ce47708c9814db4b5683c803547902fa00bfe649a7d6fed74213569c5488ffda5d5471509fb9399ae01b21e0f0b42912ff0f01a4ddc8fe91c94c4e01451bbe511342033dfba4f0b7de7d107c4738aa011ad6abbf6284908a7691ea1a8572f41fa5306d297106e428da9798a05dec434f8cf11781ac8f75d721f5783e5d36d3a3532dc58d05a722a6f49aa2007f100e46e2fed9bf630023f6d8c807e594cda60811ad31d35563892c68266f8b00e938be1713f5a41b4f207cac2cb663ee263b330c5ca161dc81d52f8d10e25837cd5386de2406c3fb3fc5e6a0ec36a38512fad6f4c207ba5632b4898d513d2aaee7ccc76b4707fff45328851a0660ade0d00ad4c3ebc531f3476e96dc4925a7f6eb0c1da34d237dbf956fbe0f1107be7b864c02f8cc5f30fae77beac12e5afa7ce0926f3a831c7d39f6863e03ab5df7fdb32642b8cebe96c037ee51e9c92f9caf78fdcbf478b210fa3d3c1a4f8fcffa77c361821c70817d6e89fe43d815cc8b3de8e879e3cfb2cd9e87d8ccc4d1aa288324b613e83fed7dd09c333de878b80a461e7b261afd31eb673b376be0c2f5884dcc5a53b8013570cd0ab4104582fb7f585ca909152f997143910b8b4579ea6c31ee8bce4facb94abe3af0ad0f50c66391ffb9df7c74fed0298b9f033bb147e115c804fceeb4f59cf2147b2f3caf48d97f0b4e9f49760be0d2b86fcfafc4dc74eefc86e4973e78b53877cf2ea556d459bdabb9cfd7640e9a38ffd68bda63b36043503c81e61a7ca56f313a8b1e0eecd77395188e8c553d8b5fd752183e593266b1970d6686bb24f09e84e2972c8ad57b56b11dd03d21aa6a5a2d5b49b071b3a27ac083428922adb1433e965abbcce161323c035f358b351d22220f1862f6b8412337a3448646175a604b11314eceb8d376ec58d1680540b1ae17ab8d1b833b000bd6b69ee3e22ede09e8ee18dbec987d8250557f4a25a6b32f772b2850b98154583f3367c7a76e7140319474bf5c1a0433357ed39b1ee2b1feea2f7edd1ca6db767a84c8ba65a5330c492e96e07a04347bdb215f1174785e907ac5f02b6810543ace142122d22af90ddd2d5a9c01bad59adf283261a451e818e4d080633eced017a5139475f60cad14a07f166929b900500408204b67524cf19b6a07868a08ce4e8ed3dc54133312a72cb361cc5c0eeeea9ec34b2043dd5980c7f91363a9d99f80a61d09617f230e043c3f061b5d269ad6c729d6f7b92bd49902444cabda5947b6f29a50cfe046504fb033580017fb21045099da240284640204961911bc22345200a36c4b4301543051f24522e9848a9882106344215fa4c21b304dc697261e199483803cf462f7a28e15842238550b8038cd80bf00c13176498ac705591016f74919a0a8d9ea090248c9110871218c40834a14718c3e11a4303744188058c3087172a96b800c72c5911ba20134ee9529ba27a522309c8831118945c608cc02f3dc21b3858a0712454c2005dbc4841898b1e94ac0842263cea129a30054a799224090c23a00fa5908751f8410f57181ce0121aa091500b305c542f4229512e422a512bc014c88021746132c5f32454214958c30838a4043619852bf4089fe0008368b8cc08854a30c0192f9292b8c892640578039970459710680a9cf2c44c12d71623534a2f1881567ad070842d68844242200e18ae322f5c5d90b878816405d8c33119b009c75d421b57c22f51c0a225e00a4f21084b58905404096be8d1c11e477274f2e6a6da2335bafdad5a7b73534712f703543dd1ba272510b8a71d62db939298ad12f3b253d5c2ebb306c502ff686ae242375de1f99abe84e0813c3c5ce2a1087c49d68d4e522e38a7a9d9c6c530043eb9279f109e62c49e5ef8a063c2b1d361afa9491729ace94ad3176badddb858ade94cd775170f79409ece3967ef73a2391571a7252729a729168bc5e29c85531930fb50588c2e561b709b001f04c36d7c227a7ae18b7a3c6d938f164d46b1305b930e2f1338242b5cd210210ee90987444545380617117323420069e8c8c7eb84d00b9702fe6002eec004c53115e9ab3e6b4c74abb5a61a33faac35f9741237c5faac3195a9317d619aca1d37f96832fa689dd20e5a49eda9ca9397a72a27df0be825abd5d4546d5b8d288665c4d04c79a32a09ea060d54144c25ad148c946a20f9800c01d151036283062a7fc0a6a657b1b6b444f14375201fbdbf470ebed7fb7fd6f40f1567769b29419d12d05de3dd0f3535357fb7cfb0d9c52a82d4e4091d92d9c69c6edcec0edfacdf0b054e5f3e03f8660d25b17d3062a3a02585534bdef47e815a5299d9678d0a1abe595fe9c7a7a634f4ac263ec7d78b9b1a310473032ee0042253c0104c0dae497e001962d2e3051b1e2ced90c980c0ec0519ca2265acaafcb0cd86ca2ce5910725026649a504b31ee8ce48ab80994740cc66134a837a31615ed9b2628b97f206cea7dca19c4cf0066c2822b392e32788141d92588c104441e052ce224cca086632c29413cc521cf9525e29271489193d53b666744812520ba1a01f31caca80991033627cd0b2294839a1e4c844c81440cb1290fee05086b8a16c51f2d90ca9a43a0c10012b6500662266f3c945c9533e600665a352ce27139851aa16ca29a6dc515e9d183d847a7634c120825091313c327828954a9bd994ea8187313ad49652e0910392161732b09434dc6c01b3f9c06ce64075904d250098d127f4832822538b530ed388862717680c4cf3480886726654862e1b6e94a2036653660f419c783da6ca04cc58002a47cc6a98414352da286b6638ca5965d63280c3860a3346b3a424222f846a5471a12f547022801965316934ca44a2525a296f664c10cce8ec92426943f6a566a48528a615945890d180d96c868171c7d029da538685843a7d59a11ce1efe56e77efbdf7de7befdd9290905ae47c912652d12cc890d24c8943544980d95209a49c640650eb6816d86c62995129f30c2d9a543409cc34a2a48226d1b3590605252509e537932a97941298650a6ca4d0c1828f274382b6a3242b65d00166530a8fa50f19d81194b6d9258e4a55a22a1211d1e7308a497aa5d771637db5ce4e5ce69efbfb147bba739fb1be6376aa44a2b8b46550a5c03ba174fafb57fb52b0ef272b15af36fb33c0134abfbf1aab5495eadb67a7ece4795e86eaf9de7bb39385204a6b6f59ff5841f76d5270d6061eb75fb643f37d5ece39e32fe7fd61bd7baa57b7ac538ee33c4c72dcc8715c1e73bcc7cf7123b9751cb7b90d54f377d0b96a39ae6e1fceeeddb365bd7b8ce2d2ead3d10d72ad61383b6e0e96476bbfeed811f6c735b676bae5ea733b4649704f77f7e4966d9cd673acd6b5360c1fb45ca5ff0257addff8658936fbbba569fdf3b8ae638ee3388ec379dc3ddc8ed5df25ec8aff07bbd493fd6c354335c8fe6ccf49fe93eb48f7def9b9eede5a6badd4db9bb3208fbb8786a0334c27ed5110e7b9c6fa15c59b8f6aac77fb49dcf5eea124e8eed9b2ddb3b968008468d9e9bab3be569a96252d3f3d0b952cb42c61fad7bdafb2ae7fffc494529a8329e52a856dbd83cd2ee3bae7485c657d1b7330a614d313e2d6b99a6e1f4ffd15a67fb2ded3e1a0831adb2a593d58cefd0efa5657ff7dd5fb1aa324ea7bd5c77bba1a73bcbf34b58792c04fb7d6d3b446b256191fb7b17af78478c1a59d566047dc5810f6cb16d4df30a8318a71ed5ec3f6c661fd366a5647c3b74a9f7f1ba77e0e1d49ea6d0c74af5f0117b7ca32d1555affbceb791eaeaf298cfb15acfb12b6d61e4a82b3a1e409f1824d87e38d05617fffb423c071137bcef6dedfedf1fe6deb7b84e0ded811968bdd7bf284d879d9fb0aac16fbd643497823994d7455d6e9edc6da434370522d25b2173c4256f8324254d4160569a96f484c234c1dcd8d524a29a594523a371a1c2654d566f691a41adc6e9fea6bf1ad19e371daccab2dccf63e6b5339fae76d1379e3d86efff326ad765bd9b1ebf21ae21bc594d4501f1de9c495b3dbd349d2911b3205e3046badb561aa04a6a99284a910c018f8990ed6ac40b18204856fd66cf4f5c3c99b7ee300064040bc6140cd4a906efbac5901d26fd0d1c99b1d31803acc0073c088a17471b112820e2b2990c034c9824394302a2a8c6204a42581456e782a0a673668b400ca8811eef884555c803aaaa8102226744285c394284bc0184d43888425188155353899c1a56508144185904809210c5444905161f10219d087cb5395b026e5c113d843911970c8e203dc82c3e505069718193cfc80204c1921f4600a085baac0f410ca300596e0043ce1888ca5d0ca102036804234842ed4088b84c02b283c91320b9ba4ec409d015bf80256c112fa8012d290448a072448600b1a086347d82343100b5e8042a2174c5178402a513c5811c6d5831627292117252017a625252541c02c3c88aeb8d025855046821228b1235056805ac68036b6844954c21f4c40224e36e410f61012d503e471039cbde03a13140e99102679d203b278f2c108658c74c9c14a8e2658a0c2143ac8500369f8017e90838a4678c20a3f27b8be38914171d2229c6126d4c10b58e60ad213282420093b84558ec2214040201d346208b5cc2861802c943b9a84108ed02445dd67a12c948d2ae21c143f7c8dcd6b86cc6d5911e7a0f8e16b6c70700a8a1fbec666f76c1f1a5fe2e0d38470daeee1b49f4e561aa7d12aedfb68a227f2dd23d523467d3a1d331d41ce6fe8ffa8bea37ed180b1d85f39784e7eeea3453e288d0aa9223a2274a98af8eedbb747f6c812b95fa2d2105bcff44bd88ed6a836431f1daa226a50a2d78dccd1ee5f3b38fed9493107a79d14fb07ae93b4939a47cb7af758ca749216d1a32a82a443bd876eff83cd52b7afa3db59c3e2a3e8270d41ea1d0e038ec66a91a643b61671d7f34612c525391db223ec883b985dd22604b93690cbb57d38972be6da402ed78eb95cae2dabb177d5d88b2d1a3e922dd787cebff5b845b3f1ddb37b76cf8663e4e874d6678d4bd0f67b6cf1fd9cefe73f3964f7bbe37cdf9d7fdf47513be65df63aeeeafd9bb75abcd5e25fc2f2fdb09c15a769b59e73167fd66eb5be44a5593d6fb1589bc5baad1f494a43c3da1b979fffac3423c96f6b243ba04343c37fe3fb599bf7f7577bdca6bee0ebde48769f21a88fefd871618238df3d9cf3df31cef98e71ceb7acc6f88bacd5e61f306b358222efbb67f7ec9edd13748f74a1ea07e8b3d64548ff58355b6b6d0e797ffb0e3ae5f6c871acd7ac8dc9add3cee3d9cd626d16ab84ddded3cd1af7d6fbb5c71a35b09d4576d0732806dfef2f51598fa276edb17ed4ab518ff7572bd648f26e47ec71c47ad4f63f98e6a121bc71ab367824ef28da51767304e91dbda37ff48e96e998d6f57710ddd95bbb7eb7b6766d5de98ee611394dc554f6b33657fb75dbaf3647030e743afe6fa39fe9e74c3fe7703f3baddede464bb7dc6d39ea0ae8b3b6c5878b2c7349b1052a67149f9f3c21b2727dcd9f45f3dbc6c9a923493dbd1a69f4d65aefd7b5d64a434353697e454333927c64adead6df88e276af8a3cff08d231bda3633a1644e21c24c3746715249361ae619aaf56596bbaa3b5e6d13c9a47f304f1da8d21daa6fd8e6e55e31dcbd18003ee31b9bb9fe4d6515492daa7f2e90be8b3a6456a0b0baaa8fed98da9887403f459a39aa141d6e3fdabffd1b756fef5b6feba3e3f08f6fcf8438d9fe641d8ac205cb059471034e309b1f39144713bf64614b7dfefb3b7c71362bf1f0ea9b3bde7593c76dd78c1d7396b8978bd433cadbd3b747fc5a3793ccfd3b19eefbd57f304b5280058ac28f571c393bd1b4d7972ce34d63bcad3c5dbc95076030eaa08ef5fccfb770622b739e76c75ced6deacc71cbbca4e9444fe8b1ffcd548d6ca5d8ee32e776dce5068bdf729f53e335112f4bd1c756b7defbb7b01ee73cd50bdbbf7e7f53cf27a97de4b4fe8a5efcbc082a8742473ade14862d7d8aa99e966a89ba1bad7ca4e34844714d2488d24e65ef7c94ac5a5ee2b1ca7a6d9c9f33c6fa77fd65a9b9d3253bfd4fb6f2e91baef491534d649593b6db5b06abbae5a6b3b6cabacdad8aed6f9d7832ae20a112c4053586257a268af241d12da0f75e1fb0eb6f3147cffc379deb8655c0445b54605613fcfa83640f4a7072723d035026c0337d262441dd6672d4becdb1b567bdd7bd4b16ab34d09ec530af4c1686cc7072759226b4ef0f773ce7befc7997defe7f673bfc7d57728fab7dafad3e91face271ab41db8b075e6778ada06875d7759ee73dcef739dc7b283af6aed5e9187642f76b3b4e6fdb564154a7075e66388963b05f6b156b6c10b091b97bf4378c1469673d857118ceecfcebaec0dae7a37dbeea7ed53def4ad4eff54aecdf587b6888fc1456c27a79bc1d076f2c12fec0ab8a93367d83c2812294f17bd8ea3f132eac9e05ebea3681b5d68f33bb1e21d89fa3ffbe1e757a859128ba47ebe79dd0d5859da760b55510f5ad0c91575995497db5c662b158a73e36a0b1251642f48e8ee9c84c196ac747e79c73ce39a7884ae7a4242a9dacd9e99c744e4aabbeaaa02a59ad2a45bfef95a1ba8f3f4e9bf838fff49d93f41ee3dc3167ccc116787fefa81f775c17033045e4b717b675b18a17cc2ee2d7f7fe47bb91ccf11eb39af0593333d4f17b667e3eeb3d89e9c6c1ef795cc77382b9755c4570a0ceef784e30abcd9cb3f3beb50206dbac935212b976bb2f981c0416d05cfb67c184d1eec16aff300568f7fec3e0f330dd16d014293c0beae371f37e7cb3d2b7d65a6be7dce61c611ad833df2b89e379d36fec8857115e9f1b2b0c84b5d6d26cd537eb98a13e6b6272f43e6b62807eab9f53e96b89d79f2b445114c5a8283ba71d5f4a28c6fceb8949eb946fd65a98a23e6b61866a60cad4c4c46a61ae68adb57662b7096cb558c2e20c3391f3785fe7d75ef7288975cfb0ab84db3840ac61c21cf5af6a917e1d9262c96a8f02af249d4ef798022c62703fff7761dd636f7e86755df7dd08e2c0e9a8abcdc4506a607c6a5f9e767a66ca4e46dfacf938383d8a67cf39bf681c8fd0f5bd8d76fc2f1ac7db575c39ae6fe0f6ef6fdd6f18e6e9178dffe3dfa84859a002dbb6c0ecdce3efe8ac2bced6babaef05a87bf1e9db6b11ff772bad2b7b7f8e1bbe71f2596bdf72db04255174dc7d095ba25e92cbe1468be59bf5a6a060cb9f33f377a446912fd5e91d6cc31a669b325476f256ffad6038b3af5effdc1818b76fb55aadbe5b7df7abf175fae7e9f40c3b21763cee0a83e97cb48aa9304c73ce8f337b1e21d8f26f9f379dcec148ddb97e75fa859dd0bdd3e92815431493f9c42ca7639c25b2bf6df6c2b426f1a77734cfd08c6a637f5e3c38d65cf3681e1e445d8cef876edb0677cbaacdbddbc65dce8218c96dfbb923098a24fd49c1ed4943d40a2377ac6fdf6d76f7d0105bcdd1b9afe368491dcbc1b87b6c0735f0fa1384375ac743ea0768d431034dc811912526a8970e4e69344ee3348ec3fbfb34937ea8548cd9535247b5011403170000280c0806c462490cc520986ee60314800b73a63e6442105045711c05510c03310883300cc2200c0300020030042144b8f6020b8abc50151a2d81e117782c33678ce177ac405fa1dd4f44863046ba4a4214223cb60dbea442dddcc68e56e3426e7459ad0e3a7c56d7125705f2089c53b7aceb185518a9100e40a9179efebd876754969999f36abea163949c46e1a70ce5dca9d92afa38efb0ca63cb42656dd9a6837c0a9bdb1997a44f209df2dea5d155d8e67b9b31b6e6b26e9242bfe90af69c3a9ebd3ea2b7e85a95c102669b6d46169c031a960f1b6bd10dae2f7c3e0ca5a66d2ad8e2b01c92b074eba4dc49f9fcc524d5bbd60a03bb903dbbd4eb17dd73596bfb055c9b472301fa4ae28fdc47e1935ab749376236fcc2a083907cde65a51104ca2a92102a153860193a74cc91005bd412463d1f5a9c21d9170de72ffd6c484be55dc1c2030c509746bbd30563084aea13c3be47842f62fe22932fd06fab41928f22e162da6f454e4c43528411c70a7ed136d7c3a55a4c1fe781539cd807e1497121051811e9027ea13c9c034911afba77d9d8613626519d6055096fcb8904b9ab695c24b485d589604673bd5f95365155e435ef573b65d82b2bcc3f9bc103e6fc3394258669fa24187192d50543b1f750a4f967f4a6514dbcc797f4fc424c63517664b3fa28f0aea90a022e74125630cbe4f876ddedd393c024f043bf49012d0694112db30e0c15dd963ec54e7292f95205171597517003966d935de30bc6e0b6220f7971e7b48a2b8850834fe99768a6b1e9eb8facea425e734143d92d158d35aa0f3e69ff409ec348be365b59166b1f70a2aa30d23f144978278a7f5719feb19f5d9ecddd7dc72f5ff1d8beb4a413e3f31f7269cd5069b154fb281bfa5796da62aa8c50b0786347433caa22ae8371ef1dc228a4a4cb328ab56914a26122db514180397be68f6e5c8d7e0c1168cf31321fca56c9ca72b22326ac91b75e1eac1dbb43a9b03bc7ef880004372fc224ae813700678d5ba9d9b37815bc2c23dd314d90cb8140c4530bf2b2326db5e5cc68e3bbd979e260bd6d4db943d7d615b32a58cade5dd5d9d0e8db014bc10cd57c87f1cc31a300203573558d84231b2a09a339a8a530a460e7c0cfd64e096945f5299fccdc9a8349eaf49ded73d8b20a75967539b967a802ae189e119aef1e7a5eda655d778df0921044bafe999a2c1c2b5368a4ee775eab123130d0d384f6d8835c12da512b4b3fe356a9f12b4e91069e177ba51fd8269a4129344379b77d26f3282006374da336f903dac1ba7809a79f1264206df0783b48a335595af0e320eba4ecbeb74d70dbd27bdaa4bebb05138f25b3b07203b7f631e0fef884d3810858bfafe1b825ef2175cb12e51c107cb1c8c58a98a902adfe73bb2559b262158c344b1ab7daf59821d6b1f3ff083202f5445d2240de2fadb257fe3be80132abbce6d670ab76a31d521b6720e70ff9dff198812f463db60e5a32d7b47d73fc41a31694aef044c58a66f120d12408e2a3daaff79bac4bda907fafc74c7c437970511b98ad9bfd955ff5b9fe20cbae45726addc2f200ade52bca05967ae6c433c8ebe61f5f5d4bb8763bec85dee3a22461c0b39538b466b357e7750e7458a611a5f775091584ae2ab1af04ac4925631dbe7c60b88588c0cf88e573da8e52b8bc3ad7efd58d7d34cdfde87d00c301a81922508c8935c734edad8e71d5f16a0d944f9a5729c909bb6c33433d557832eb125b9b6da52e593c8918242ddef2c5659826596a658dbc0458b95e26803dc55bda6490cb099fea80b7103d18b90b95518749e4fc8e4cd727aa5e1e80363a0bd5aec2a8c45b88cc611510ba063a119262425afa4bd361c50289519fba39f10d187096a6299cc348cf986ba3af0118dd88b74255213e781184243869d082b6b0f5604016989370a7cbb0c1c9802b82c983c0c524de61da98edf503dd4b38e3a8e9d6c9305171f956668a56949dbc0c9269ef8ab96d27c3da93bb6a91aa1de74e7266d3a4969edf07dd03b771ba71426633fe7710204761eb5a9070b9a9dabe2640e6a280836179b94952b6ae94d1daa28ba534d4b98db33fbaaab222341c4a312c88aca6d024786ec6f616e3a51b510e269b47371e2fe86f2c55db221d3d5af5ece8e47ae1128bfa0166059c641f5b842d58bfb99238d9ec2a22eb44ad07965e97dc56f9e39d0a87d52cdb010b2d370c57825fc792d99fc980b6710a25503d23f35dbca12f9f252b348af9c1617e9d522958c9c1e748ce5906749595a4011b2c04c9754913d3ae70a0be9f9e6f95fbcbb1a3587eee0015b4db8d5047c04f69027fede9babe8843f3c452cd547a0a37a2fb3510f66082f2ccf152c52200ce1e2df031121a050455f4dd9def67f1dcedd7b0b607c881672ff095d1c3e5875cfacc605ecbebbea419e0d5d6244798a304c14ca037c17f363fdb704f589dc1fff9ebc62c886b7a69ffb8f997a63142933fc47f3fb3d456ba5793c8809751a912e51fd3225b482bfe758b6ccb8ff100996666b7863aa5a7299226fedb2e38833872dab86a482e46e025bbab61892b754c4cc732ce7d6af42beb0240f7685d17d816b763247f792273ff506e7fd8a44825821b22f234aca2060e17330e39ba9b2f16fce1bec66867e5dc6981c7795b28445001dc4e951620b8d18ae2c7431725ec41f50e0112e2ba1edcf7fd6d2bd80abea1a6f67ba2296f134e293eb52a476d20bc4e95300606244126e118bea9349fb23aee8aede54e00eb454640f8c7e413cfb35dd5c8e35e461aa2727cee5b195353c49722c0a503021dce68b983e56558af9db0852843d16c770936ab5b63e9d8c87d75f30475f7a1d8a3643cb8061dfac5df6f88cf6c814bddfd770201a001bf98292a6961b04fdbd5b49a13026235b4d48325ea5796129b7161899e06e6c5645ae1009a586d5c525af3c7154bbb7cb9e566a5f4d4241c47affbf1c6dd66d9d7f35cfe6cb3b8c82f600d8e33d9ff4a90f521b6ad99d3c35c2641e9841ad2107f23154219cbcb6fed2219bf30ed7c972d0699aa7b5ae8f867bc0f589831f938465b6c207375ba626ec56ea7a39e121bdb4d10a1692d8eb545833ca6341a135c2783e2352c1175bdcc0547a1cd3674d489fa4ab21251870620cd0526ff1468462cc4f8f870160bff3af519618c09a30226413a7df0c8c57d5891a2f86dfe658fc9194fccfb43c6838414bab546b7f677051da6b5a64d6894cf7f32093f165721a4f0a0f77b6b322b9936fbd97166ac9d2ff7550d2215dc1dc4bb4ccf14ff9bee7e14fa49321c62925d160c89e4b45aaf8d934ba163b641ffa29c8f1b8ddcbeb429304f714760290203195f619818a9807a0ffc4afa225a665054f0d0861a1f3745103f0b1f7d4a9b52d962f01127076209caff14540396a27ceb1ebf701da75657f03026fcfe30829f3a088f9ec2de9a173822fe4e64511a285b22e4f47eb9d8c2dde9382b77656f498e98b32fa9e570b416ead398eea26686040f989a09c9f7a5a03b70e0038ec153ffc632fefa17c6ca79208b8efcc2b01e8295c6c4eca842b88ca7dc2e91ba8c9a4ae6711a7d0e166927775653e3d671a7492f2b6c3d80819e99322bca8385de6f029b227b6a6ca9b007205d30c22cff501bb8d8437e475de03a1a0804a22e1c68649c742cfa6110c93d2c020951b03e15d3e5059eb1c4dac19034c4847f88601cb86efa46fb2d2c65aba9b70dde067329994063ec49efe5f3b72739c6ba720005b8fe825b3f4a2ed96d1a18b48d1fbd176823f57c931b2fc681432dd304bb3279698ab6a3b21c6540594632bfd5d1293217e3374d61596cc4d9066fc38861852d308254a8101dfa786c5444fb028dedd13fe88fe8bf84b7f349aae33caa36c6f6e4575e33768e93598edc8202ae5808b8a53e495a339b503fdb155edbec2e04e2d05cbe1e3869a338d7dda3cb11bffcabd5cf3332eca338683f3b1544143747023b6a2150d8e91cf8650b7401539b6fed1b4b3a71f7a910da1a8f7f42b774d34ee107df0b5d2a9e59ebe0b6f0cdb5f5e58e8bedafd353a5098de5607051ee2e88b7752ec1587f9095d7ee17067f2f8d6d6f75bfc75be3d9d18652253b32f04d5b2ff0829dcaacb82a1d486a295af17416da35ff5f9c6351cb3880359605175cf97085f2ef94944c86ec99dadc036a1432bfd164975218dfae5620448a42fbffd39d7c23f8db4aa4102764f8a55d291a42e77df276050e22c163a7681c8305d1c91436f3e17426bce07d99d03168e92e35afa7b748b1680d22697331900becf28b264f4f9392cb970073d9e4622f7560eb70e1860aa76032a240b2d642de466bbd1f36b4391db0475787888d93d5a690005215e56543c9bb2ed74d0d97748a4c299e2ad3515b00aefb5a74190a9b0c2cc1644fc6fe1305d06f40aeb6f2edb89183e7f13bfef67121294d8bff4690a97cf5140141ea0284480a745a672aae86f3bbaffa8f9f821d2979738417e08961785bccda7641a845a82252f7ed4972ea84c2865cc30c97582a8a58f0d6fc99eb56598760950f6eba95979e110799a31305426c96b3159845f9727c88744ac49793509336a2e459f6ecc92edc705bf0c59a2d52f2ebc8699f1c60cc1ab8c25969355c450a9f59417b65428fb415f15468b2e2f64f41fb842cb5aa506ccda17051a11c5a536062d28bae8e1ebdea4cc9ae6beebc76ee27f503350910834b354b2be3ad8e990152389b25e5a321db28199257869f5aee0309a9709b61c719e25430b72402f97507981f4c271c26a074066eb9306e1239e7b01c470115b559f7568a8cdc250621b0ae7321eb600d35a8e01840a64636219f3f353d907f5d65b544e2d725139bc300354fcc3f4bf229fa0b748c01a9e0a51889bd8b630ee3c0777dd726b1f2f2a908261d5250ae2d60a779c802a54dd986ebc356a7843b6d237ff54e4772ea449859864ee7cdbb70aa508292084a595cd5f48e6d09cd21c7d93379675d3ec9c13b1b02cb1eeea75f9b64d790a2b6e1036ce5d1cb6a763ca709b05be0b4444b494b6fdb47a2e0b08abfa757ee90726499b63415bef3430a2ef62778d20c1a13ed7194219f7d9cc6f0170bbb64d20d3fe3b1c82da3f031d4583690f1a4fcc8277caeab3feb64e530674e545fd2602b9d71b1b286e9c763faaeca0604f3f23845ee8981b8183beb9dff44efdd35e20cedd48e4246a60979e99628386062214a7e16ce2168ed3e38e340cf4ae784aeb50dcf0c738dd6800fcbf86463c1d995ec812785688ecfe589b087815ea733038e2077f0e820aff279bb470e636d76a44e4e9e195f6a0def0855023b56b6e5b50b7cbd8586665cb6d166dd23128ea2e0693433b8a9d00bd590829fa219ae1bb188ca30c36b6d9ceb91243a91da5508d80e6d42527c40e1c1ac0958761256100182c233fa50332601b4780619bf8e05bdbddc257404f40881788e297b1dc1781ae3842128eb12c84bd9f4e665c7b1fcaf29d297ac8ede65def6abeb5c01c0cb41190b9476824cb8871757215c44b99372e8d7a89ff45bf8062626d1b2cc650aca745f1c13e405415c5d23553c289eec4e188cc98a97a7fb901db592945a5a04d80a0239e0a015e8a60d807341bcf26698e73a6c1d602f82e998c50055802f9fb10beeb11465e9a54feed52e0984fa2e526db9076194cf3f96b1743ffe526069d5de25cca9be24f2fc519262a9111cc8864f7eafd06c5179abee7decc32c54fded320e042728ed5814aca5013f7ce93ec80db8634fb678378059bd01cbaf5e397e320017b8937f524fe6a7629bdd2d8047bedfc06d6a25febda842bb8bf8abef866cd902164399f4e97f2b9d12532bf66e6d4428e3ac44d5cd10203118347d7c745f8c2d34dd86573bff823d2f5530c4951e57abf80c007af367b27b5885f3542faafd45047b1a46d433f63f60c72b6f7c414537141879fcf4590bc3ac98470cf79be41da1a6dd6bd12686e8e611ccdd2bb1ffa07b64102377584e467174c7801eb84f816a11a5cc443d968ee9581e8c5cf398d0ef94183a8bdb30cb0b1f50827de3832005a347ba29c1833d92d4aa8ca8c3ce840a3887a6ad737a5dadad5eb91f7e1d9e39aa24d5a389a39c2e0c7e92331109bfde0b80c9ed7e1bcef27a36e304636bc04ef8196946f1afc3cfa810268558625ecfa08dc754fbfe9166a05f7f522399d362e6288bc38752990d729b512547a6cac1d79bcfb6b8a067756acdb20468ce037f7d62dd7f4583bcb4cab629e7cc1239d4b44945d9cabc10e3befb07b4f4f589abd66c6d23b8c043365cfae3f41ef8deafe01520e4def7b4fdefd94f389db0238be84da70de1928e133a9a5a313b8e63f8fcaaedae4c740536c330e5c3ff7b3f396e244923f258eacb05d9d96aef92840d40bd91415c24bc57485c58a1b06a05e465c06db1125de2158fc161f45d221ce2377835179fef4a67c89b14795a20135e6eb480a992856c4bfbea4d628a23f882f44e0e7b9f00cbdd75ee76013c26de6e76deb786fc0ce0e41d3563c3774c5b467ee28ad177900dad5b51c28eee6b95b4e59c82c4e277e9d583d95ada014acb457d583b9774ad14467bfc815507dce8d9f962c70bc886b8dc19ad37e65595dc41d2163438561a23dafea11defed0eb5a175bb6a802d9c3594378a27b31d12432caa935e6b63a3860ad5d3233aaf358c315875b2f1a91a69986cc0e9fca4d70e6004b9414e125eecf17c0dac62ae11177a6a7241a8729303d8fe5c82a237a4b0896161f556d71ab3cb47bc80c256c7541a00446eb5dfc47ffecb8a3165025c48b45c7e90d47c3ba45f72a1ac1cb3d3766bcc04ac664804358a3985da7b31a94013c8bcefa1ea9e84162bc97e255474f590d53b6e124a636bcf9ce1dd854838cfe814bb85ba274076f5e689f7dc3a0c28d00c5790daf38f8bb7f573d3975badffc96fb337aee1226a2e647d6146989cddfd38c5497a6194c7e08d47c47a4afac09df21d360cae826a51fff7f9603dcee8b9c4c762d472894559213c17f9ae9562b4944cf4bbd63e389b6a4db812fd19ea99faa242c09cab5cc9ca8e53c4eec08a08bb417994041a61945f8adf7f898e4dd660b49946197db34286900bfa5afdfb420f92980193e02f0f0556d17e74cd8ac7273f8d4381870b9eacd5d78f555601492e382604b6d69d3293ad3342866f6ba5ce9d08265a0c5aa4d1431e1d5e35dc4617a99ebee098b246694a45e578cd92b057a579d3f4a7eda8914e6ed06473c42bd2125a3ca12374790fb8cf85778e2a8ced986f10e8eb2e2329ef5cfee0b272e45d12a385d6e0522e0036906d229d47980fdcacf5574374394b53e8d0d9aac3369fd1b5016aa1faad965cd215fb0a21dd22ecdd4bb792e37b8fb66aa4534497d0d7860f0b507cfbbb0e8d03698047b828ef8c2b9aa20234563e1fb964ebcdea17617a207e662566dd10eeef3bc3f85dd9a57be14f7d7304317fa77f16fb5fce7f65da309c014e69352ea8e8411a73a2357bd38c2e0ec0ea0861055292a1a7c029eb691411c2f308413cbd952bc0813c51fb539a88951b758cf3cb35b4ce5097989a9e449c2713f0b7de2ea4378964b71fa12dd4411f2a7080382ab79918268a6440adc62080a596d7580364445fc07a23208241418e27e938298d05e1fa52a14bc095bc000da92400066461ba28e8bc35149c5502f82ac78851f2128752f51571631796a3c52ce22080e47795e8f0621c84bd2b1ef9de9bcd8a5a72c75cc9ab57ce2bb97cac98863f5f827c310b5bad3a6cf73673f474aa2290f19ebfe047b49ad4e6e41857a68536a28ac0bad45c40465bf9cb636df2454f5c7bae31111c7db524db07716e6091289476e5251be3a96de35390e56866c59f84f28085c157301e51797d61bf3dc9ec6d213b8e4819ff6446917c1791db3d6de500d4f49f2ba16dd18159ed0a18a544352cdb71c9571375ad72cba8a97e6e7e7002dbfb786cde9ce53da08e0a257ec3c8576845c1bbbce280ce1e82c426ae93799b7a5e9fdf396c5b03a748dff8ae18be182470f196cd7a0d76c3fa325a068ad34a0effdbb3a96757487c8c0cbd2d1904e20f34d0bc124abbca5e849441ebb55ae5acf4f4e0333270ddc890f5c7aba475d01fa18fdaf1ec40c80525af1227045f5496466257d655578dbffd40f0a1e26a70a6b122df5183d5d4fb44ca00d2ba46b1deb8708e155a3de982b5537e7753c3eeb5d60426ae0e8667452c8322448fbf8b22eba443f40e10b93bce0d47107f728eb8f11084d75fd80f4252bafdabda6fe8f8014493b2bc430d0e235d42feb5c3bfd29895a3a09717ecb635be4be5350601f6a23a56ca12a0b6393c0ef2dc7002ac91abce37908678dfba715c8e66cf015bc7e403f6077d33b0c02b239a21d08511722a3fceb4e7116e3b0dbef5df3d06ad3762c3ca356f48e1fa08c7555f3fc97ff7edc9ee9258a61681a8aeb5a1ccbd53ef56aec255d5babdafc3419ad0af96eceef5d12230f55504b142d516d80b0b2b9d44774e600aa79d57592ed31bce05f84e501d655ef58bfcedaa84f43595ecd3104c0b4fba7c1caa9b5cb6086aaeb4c6608d8b5a94f48bad80421972552da4a363594a25ebaa318babab2d615951f9d3a124eb147dfbc122226bce7e1f0d2232f016d70970998a974b505663100b8a4666ffc95e3f27d96853d447e2c36088be6b8e3eb24af5e606cc5203e02df03a4175c9c5a727e0536f291cb08deb81d3a5339a53b89f10357b4450ea9a958a8e263c4d3a55a6745b678981c7f8e94153b43973c788daea292b343df51e624a376e461a5b2ff1cba684ce3ccd05e843f0afd7d65a8cd00c04b5dae43e0666f7641496ae7ba4ea7ce4762cfcb53363a358c46fdff1730f98a5062c29769002aa90f6a6c18a2113fb526b059c6f0948485606ef9c55f10ba843113ace5f738fbea188d62a40b694a357353117559b2d93b5ca62c26bae59e9a939c83bcfe9cd82a391f285312ea8aa696705a9f5688e8809effc833c033098e90153a81220583fab7d98349dccc109306111edc14fa71535a03c5116a0a646453772c6014afa1d6ddc1ca7de7b57295689c05370096c2b0359b7483d02bbc5b3657f63e8f1190a469102028309ac1ca1d4f1390ad3881bd418daf620071b4f4a21193c1fa938cf095566960f42e8031b27c061f1023332a1d2a10545212598db06c36a26ed454b627ce97e4818ab70631cc8ac58aa63d43b999938e6216d6527440e7d1b8f8e04ee71f4a8f4dab94e5986df67955c0980dfcca38d749a3afd91c156fd3ad03cabeb58dfb7f81c63472048a98f6ffb99ccddc9d5c4171c89d19543546966a71ddd85265a19754a909a823d3b07cf12b0bc43738fce8706bdbc106d91510a30e6177182d8888bd94e003c43ff9a7e15cdc106c9dc6e867378b1acdae8187a576a64870c62b73086abedd86f960319adc33703d90729425e837e6cdaff7eb72c7605200f30275676882083bba677f71d90037045db2c00aad29d137addccdc09c9c8509c11a7dcb9498f73f822a9aa4de489e1dfd7977d1b4da43cf13db32e8099f7216afba4bf273d5cde6d4933fd140360aa71c0842b2442b82dc5e14227acd294275e21d7294f2c472265e55d515b50ae6954692c379e6850948010a81f5f834e0e2c425984d595e677a296207ebad7f345ce1826aab2a914c16fee4f1a981cef8dc66a44e5ba75d4015eb948161e829032f1b64421c653d859526535e34f4870a86495d5f43e5657a7734ebc2a001268354750c64f7e896e81e3875ba374633ca15d0cbe2c7a1215970531705e713e4f5a446e812b085d460974d2113b2a175bc6e328cc3e0c3cd4b520e382ea55202dbbcc55060239ba7d8d4a251e084289982510ee6a61e82ce3892722487155ae1c12d29a8858edd9d32696700098430c03da2b19bb0218eda2401a5e8b1e902cc5925776c5fb130e7c9452646353b785a17500b8d466aa10ad05c0d35acb9868dff702142d19d1c63113c7246422a088d3bea7c110cb373a34442bbe2f5795380b4ae1fe010736226506f0bdf3d55b86c5343dea9e109a40eb8642d8de0ad7d06161344ad3572dc04e69f8beb2b2ff3e54e79894d430cdc1ff1be6742a658bbe89946aa079379a3e6b6bd54e3fcaa0f99a13a7a3e611cbc557a78f0deefc17ee347d297e5ea26334ec19ce66acafd4b9b006af91f2c305a82e1a678ba18c8074f0a4a88090d4487ce787f133f748413e4653031588ef1c11470426024c62565078161bfb9cee5bde5f788ad060894ca7deb5146ad19a37870a3ad96bc61951659dc65dccc68265d6783a21fef14c5f4886afaecbd77767983d27a3ea2902e34ee2a682daa95420273172568612f454d42715822fd750e99828a6906d229a78a63088100dba9168253903ca417beb2362a4adeaaf3b22be8bf70eeb3085100e37f28c80a4068fd0b4d55b7e643edc059e287d9d70c2301c089ebc1a419fd8b83f6d5766eed709fb67ae2ef9e371c4f98ce7edc37b2a0b73c22a9c3a04c8be849a4745d63e4b5d57789b167274b136e3829137a87a5bf0dcedcf5db38557ed7382823aa9469807d9bdc901151d5df93a7c4ae81dc40723bf8f4f2715642ae986a29fd8efcb1f5caeb34cec4652a3909ea323299457a754743054d1a0d372b3d053795cb771e9130e48b084248086fcb9e3071c8869b40e8ce4c1b18f1f58aba0104f4d5b63eaa941631172f317ad47bd073f205af975bd07c55140d4e007070a5757d422370240536b46ffe1cf5d747939a95b1f6c2e54f19321a37321e7dfaba12ef31a3d1f4ca5d2c398068aeb58b2857498f0056ccd05882ba92318698c43443953d405ad2536683c2a226e07a440bfae4c829bc165a4a9eb708b4ab8086a461082da97bea694e690e771ae27597aa34efb92ec5371be862f985829c4863be069f5f276b9c5ffbb70582c5eb751561620b51c712e89f000a0838cce228f8980c7b33827b477c782e5fd54a7f19f85311122ccf0a5d9f5cc69f841fe914d16cb260244bd89d0d0c183783d378ca515a73ec0e98f396dcda49ae6e146286050ec50b10679234cf5f7394976d66488a8dc11297660a28e1d98dce2a147679220af0c40043c5495d6035475c7cd6f0e5a756c05155e4295c08856343acd3ad3e5904414e94f5da957c813a8d3ea603ec8e161c4a64537dab78cbd638a2905647ecb196809467a645048db0893c09bf6bd362e30ec6a2f86076f7475ca484154e6bb5c7778434a7b6b5158d05ac2b2aa2e2d001b95781089f336754f410fbcba881626faec771003371c3404cfe83e03854107190bdecf95190283aef0b20db31d851aef224b9443ed743c5dbc7b47bc1d92f64242aa4bde2412639898399e2e7e97236b07f90e720e4326a1375bea80065eda8021c706bd2ac8f9251556a2c99dbc6612b72f48fbeee5af8ba8c74905d0c5131ae78ef5b1ece3476384487b122ea311316b1a5a913dfe1bbad4962afbe0faa214b264f916c9b3d93fe3cb9915a40809ebde7308c419ebaa6c6324d60df919eebeba2781c20f6238393dc325acab59fdc0acf548977dc12f0dee889238405704cc6e60ecce513a4b1c62ce545b1e3d6a74ece6d1718be03018dff0af16a45e9e74abd7949210ca4e9f97c8b1544f67084d0ce121b2397a83e7d8fd89d14c57cad810c3265fca894a4dc1d067fad1b3bbfc7b9cff2dbf2234674642735671e7e81d6d61f9a281c297e18d8d8862f20d9c4cc36017d74257768f1a8c03499b50b0bce7ce60059decb182655d122140e84c36a41fe4062ca0cc663188c278aa48488596fb8e9c4368ee5180414216e95b25b8497d0c0e756b28ea30b9c5069325cc53977839aaf0506d1076ff93dbe6df3461763a38c196c31b350f061bb1832e6ee17a2c0e405b850b4559157ce0d3251a12d0badd1f292a3df5d3a567cd211311dbc3fe76e1d1255006374f2c16431ba3a5da208eee8b60db36a67b5da2136721d2b550b394d60094d6a6147d5bf03d942f6a79d739338a90179aa08e347e13bc30106c0cf70efd6f81a3ca85ed52135fcf2c0c9a34c8c54b7d5de2578d0bd9b5127fd669e07003a393ca0736c323416542dd66fc4fc812d64bf6299a5e24a8a3269ba0e7227f4f9b74edd313d555fecd7d25685667c36bf9f57a8b93abf8f7bdba70945d1b0b91eb706c3670481391589c22dd135e47709a083d189f1c681dd0b3b879537d95e41c756c50b52c717291d3c9d7ccc9182f6d7a4c986b5cfee10fdbb17797dab1b0307a9269e07006e39bc40d0953cc874d406798e7c37294e38ae6b8031f5f94060c1bdbc416b8dbf906c825fcb90b9fad51729bc8ea6f4f3b1ffd36199c79fd1ca8bbe45f7b01396c43cabedd7886f88ae999d3cb59f395d2ca78afade628aacc5077e56701ee176b5be390749f21df4a7a00a45aa1eef1a8964cd06a05ab3646d3db2480c3629c9fdc9862b5fc6d820b8fd66f1b79da92248a75f28393cde152e5e1e461da5bf1cc60ca5873c6b988391a2b2e6d5b1a73eee641c5ca2c5394bf265047551ba22fa76c5511f86026b696e21ce1af1f5658b023bbf5564e0e0ab62e6cc63dd7c928a92e3cf11f847aaf1519b7f37d429d49e6601b7f7491786be267c02fa19d62fe955cb7a6f57065a04defe4e773665c603096a9bbdb682db2a1422cfac9b190aca896db90e8b9cdcac64a5701c92c3ba6dc43e08dc9b6265c6b8308e21bd587848e054d40704ca20bf4a60b68fd45687d45f92140b4995823cd9f840c63bbaa4afd543206b4380d3719b17e6bff0248077f1bdc68e6ccc7237400682ced8d2d6ed5e51d14b0d2a78578140da9545ffca1bc2d208301b56bb6f78680314305f982a1d0e81d872cd43ffb94b6b80fef11d0530588ebaaaf7feb44dc8ff202e9b951c72b9fb621a19d1bcb1f18907dba2638ee510d2410b64907ac7d2021ededfffb29442d6c568b1705f65399d0430e363e8d0bbfcbb76fba947e3c558dea0a8490eb8592046c2f9ef6bd0f4bad515581a9318620e41a1f9d5a503d09b909c35b10395d5cbf20e9a4732189246be7e49fd25afa147ff31663acf4a6ecca2f822fc5130a09e8e9f0a72f95ae5692ef89244f286ddbebd4e992418f949ed5490df1ea94e9c35a190f8192cca1a0b43e3194edc10c71310d3948c53cdd956a3c1f2052e3d44494ecf34c05c94d22335bb22d4c1e29a24b1e34290ed074bea474067fdb75d680bfe73400ade1a960310d31ff6111fdac3970d2288817d95f70561558ca5fe97da14cbebb775aa9c45aa97b70187cb9c98d5b483c079a80a538852f508dc181a4e86e7611ecfbd819014b2d55a0f45ad46fd5fa48f9e4355a59acd2df58d079d9dbfc4acac0181af38a2636af34e562bfaa74ecda484504594b5f8341149858b851a5ada1a7475113d0370cf66d3a948acb0dbe63762c972e215fcef4a86b69dc91a2f436663d9b7620aefa8ed98d76f8a208f28bc2d5e6057991cb3067526cd99ed318c4f17600e4566948405d4b3dfd8ef769527fa434d3c5cd0b43ae0a2c6955b056a6139ca8881313454da3125203c72ae2dbe11947fa10e0dad655c0b287707d4cec96cb764c330b0fe6b8010bdb25e8a2629565010a03c40a4294d65eabe86a2e761669336f2fd7ac1556fbcafb9e80f249a4ae479e558b3c4799c5ec83917a9e52f033d2eff1ace00e762785e96a616e27cc21214acfe48ab985006454443435a2544b726849a0a8f8509d8b4fd8990b047df05c1adb29d43657caf0884e041e828f5fabfbee1e390115868f516f8c2d54a8eb042ab62e8de89087f21a8776ce955cd547fd5f4603378585adb443a8ede1b01db5182131fcb9400c8f1baa35912e1765e8cb2fcde639e1f1b507962256cb3cbdfd528af11bfbd1d222bb4267cee4a3dbb346a391bd7582e9984778de907a1cadd63e6e1db22e7ca81873b4eb68eb2f30bba864478297737578ad38be32d52d523ac7d016c2b01af16d083afcff04adeaf4963d8ba6d2a41e7e28b3c9571cdfa28b7aad722bd1371472f4bc8de9f09c30936fcb6127c074d40d9a208bbebf5e5553e4411b5e7f253919a2c6c92576c359fcffd053f3743a94ca79ea103e4a8582503e7aeb404434d2f0a16300b71f8f2255f677351e8cbf128292651946da504aee5fdfa637e10ae2a01ec71159126dc39e4765eb6fdb5b96d30a27debb53b3a4f6d73249f0e9b57bc083ac5069d76201558771625e21578cb55c56432b11654234409dd669682ff98fe67046495edd51304e1a892ef38f039f555b938e7782e72b6284a53b9688311158c018942b325e22c9d5fd637a00e84a5a7d2b3e06eeccf33803b9608d6f7d928f3081b1dfe09aebdc02f6eb8b30b36a919be69535738d1ed698d678f8dc98b5afe5dde2d79e68f5e87cb3387a8672a587b8507a46902babe9b13b0c0611c5df836c38f56011ed99adfb59cbb34f2745da43c92d17a2acb687cf9ac5ab67b6ae715a9e7a360b690f25d7e5a1f5a0e4010591f003a23c48e1f6b4d5827bf8f5d08250f4300511e29f9f3d070b9174880b893c792ee3e15250ad84127561703d4927a50c31e900721abc1e72bc49917437671878231cda6fb883b8587a0edeca08e1b3e361a566f1ddb371578390a2be4779cd02e319ec3420b40371a1ef1901e793e1b1df30e8830a9f0759c3e9d1693940c9da536f8fe6866b26946c484fcb179c5698ceadb84530622d8fec4e1f224a88c6a73da0dbeb1e2c961ec14e03a20ba10f81e2a10081d01017dd3c765b10c4ef811d420921f5400c110df17ae0fe30ba103e539ed026fb109fb8f46cc0f5dce0117bb3d041fe94c8246b776e5a5be3b1477791f250de741f5a1ea084e829e541d0cd42ef195353e1daa3ad611de2a2ce333dae07309e116c164c9e9b0b7e187e50fb70b3ddc5c5338e56c607155d0f522d5f102bbe7b6cb5078fd78f0938e330f5f6d4b41a93990f42181f0618a83c77e1e011a8d37cdf43cdcde2d593b4dd97246b94201ac70bb2bdeb193f0cc9dce2be79360d6b0f16753cd46b2ab29ec12d9a103ebb9e72ed9b872f9f9b03f2e17c0f3ed93da7cdc58717085d885d0f28882208e81edc103910fa10691e0a10d03f7c41840b62c5ce43d0a509220a8e27b97dfb6c5b0d026a20de09e5a96d46ff6041e7e9bb6c0f53218a10500fef10d68580e7ce53839b85a6c7e61e1cc22cbfa7259ac5744fdf6520d0215211e222ca93da4e05ad271ecd22dd43950e74ee0cbc47ca68bfed7c38c5072a07624161619aa667497767f83e2b27903b2f08f7cfdd01ffe087c80281e58359284fd0dbee87c50fa91fa008e24294471a17452d0f75348b94a782bbce834fb6c7bcb906916e888b5c0f4a5d8ef77dfb2d5b5e8beca4bfdb72636f4e549966f1e549ad2baba6e7414341e41fc4dac72c874bf120cfc30542e603fa3f8e44b8090f5121d40db132d783dc798d34d6110f14bd6a67b142f1cf531edf48b9167066b03ec62d5c84bc9108745362911b53096aa05a0541b9a48d50c80be5da0d932e38d2bab3636f0ff48749d9a990102b14c5bdbb78f5a4d64951dbf3709e82f089e389b866d1f0d08d5b11e419952bebc003b2e93c2c20a21f083d1cca838a6ecfad86411f65f59acb33d0a307c466ffc3f207540f451ea020dc3fe484d041a43e2136d87950b1f40cd69a10830be262ef4901a782c113b76611e4a175371ca3a742dc17fa9e3a370b73adc3c02ec2cecd1a58de4a80779d9ec5e322fd96cdc9f9d2378e30307b53a1ef39d35c205e103ac03203400484bc02aac0e15c5f400cca9a0eb6ff0385712166015e7cbe76c3514c399ec51f2d60caed36f76ccc27f333d6fe7e1f64a626be7ee7b8bbd9830f0c2ccd8d3d2073cc007ba6c318ca0b109a3f61a60d7137d5b026622fb950d1112c32696defbdb794524a29a50c5705730503063a8fa1065ea7f3bb287a3b2fdd171bf24c2b82409960f4e7044e52a65ac13badf84a62ee560938f9686cad73d679011c4f3a1d4c16f4a7b8801aa30f6b3d7192425130f69b748ee0b438215a3690cee88cbf2ace088fa72e803e4ba22add3ed68fe74fd1fdc95960cf2349c574fae4bd79def028a4515aebe4d6b13de1943ecd4229b5ff7756562dcaa9b1f9f607caf5d3674964eb330cc73f3bf9f859b856db8ccd2e8348ca8c89321ad14f9fe52cd759e8b39c35d5298a85dacc4c1774f2d71dc10ea60bdac16461c11ab3f6da6bad9d13a952a43e2dedab6fa40538f90bfbd7de46e0f4adead3ff68d8fa41a9cf6fe9c0e9109a6a06e76a8c4ed518d534094cc9f7b772e0342f5c0c59cdd43135d712c3294d8ac9ba580773ab0bc7c13f7b4b0ca756c9bc140bb5426d1be45a8fac9bed6bf1fe1671c760ce7971e1b1163a320c5ee4495fcf6b03fcdedea8693fe37e04165b22e0f9f5b616638cb1fdbc6eef6e83467cb605c4ce39b372bc0f3fac39e75f596b43ad3b2ff6b35db76da559e72b23e29bb0960f1c7ffee75676b5d842c359af2929ecf1075739170cc3508b5da7b5ea67d8815d05be0643f1c3e08bd7529bb799b08b69a8b5561d9df69cf3c5b7da7bafbdb5aac0799f2551addb6ae9accc9454cb07fe2d327c56fc2dfa94cdf11f571f18638c6b056b05813fc871c09fbd8215ace053b0822058418c5500df7b3c5f54954aa5d2af52bdfed56ff03d71a50ac150d4d1c12fd673d2d43c4bd453140c483cf509c3992cfd9eb1d2330641ffb42b28e53546298c3df188637f7ad0b19de15481bfa0bccb372bc7a1dcb125d3d092e29fce60830568adf5fe4fec70fe9b730bdb7518771883dc02fbac172c96efeccbcf591bd49848765f630234ec64cceefdd75150ff77439eee6dad5db777b7c7dda281e36e24bfe3170d7c83ba437e6fa123ab3875fed48771905940af8dd7061938596962e2466a48b49aa0190818d87f8109d4e8c0011b64f0220120e0a4ccaa966cfe45bdd65e950abf0a84ae02af4af5200882aa7a9bb89aca1475b340b5c2aa7bed1d490ffa5db2b1816deeb577f5c262fc82d715167ca95423b93b781f5b7cedfdc2edbfb8c1639f07ff8bfa59bcbb0e534ae988b3fa1efaf7571a47c73f1d5c853f431c7624b864f3577c1bf274b2baa32fb019135057d4fd22ea66d3c2877fc27660e9b4863e4b20a99fda02c3c96daded5e363ad1831a8baab1faa5c6eadb2d59402c3727dba7c464244917d558a5d120fb5ead9f6dd8784d20041ce3fde110b4f1d251f74882f6b1b5f8de4b29a6147723a9575b07355637e001b7f7ad1ef8eea1a307a0b814761b2f1cb5ef1f1bdacfdaaf865d51f7ded66e5b63e47505056d7874d3a0d6be0d795a36705ac35e90010f7d9ebd298943771b3556df831a3556a70d5fa51aeb1e497ee3f61b57d7a88193dbe2d89164cd90c602be2bbec40e6c4d9a9614bfffdf163fa0bdf585eb8957bff5d5fa5b4870fcdfdc13e460ddc1fff2bcffea6ab57a19b3af461cfe3dabd7bf1af5f3ef5e47c7a17a2eae4295a8a387e2febc1330ecbd6520bd655694cea774cef978d2aea3dd66ed4de7dc1dfd99431e4ac78ba7deb37b4a77f09dfb6dbcfaac75efb1d6ad77ad7b76f4a7d8b28193bb93f337d5dfe473b6ce700c6aec458d610bc08ac958f7e4dfb8bdb502ef360ebbee3dfdda6b21b3603fed3e3040b4d56cedc0f32471bc8d57cf758ab3eeb0eacee476858dd7065b5a38edb36611771d72907bcef969a6393f157334a4f93f0df2313fceb4160e47c5f5d5c2e1d07de9de2c4bb54a4e52a46ebf9503cf63cedd972274f2d05ae79c3c57633d5f6f0d167510cb9cb3ce3a6b06f666812c96f3aab118b4d7b7b5d62ee4a11b2cd29ae60cea39a7ced3feec7ab0798e367f6fa72dedf6ed48e6c74fb148767de26dc76b492b830ed4153b4b29d5fba92883f57c3359d4dff485017b418d6c278bfaa44b8afd16bd6220c3b21aab319d59ff02d385fde962767cf1a5ad90e9dde591599fa5915a5964aaefba5396501e1983419cc57b15303b06f793d84506f1cdf877ddb8e3cca8bd7e8e0a903afa8bca41ce3fa37e4ffefb2a607dc2ec3dda4fdecff35addc13a16e715351863ba206fbd9f5fdf9d7ff6a460a321f9e9f731925a9f7dd2a857bc81c347f73d59d0b79fc3477770b2c038a4813f8768a9a53be4e07e9d717fb2a06f5dd09f57f4afeb09b7df83df8502effe7e59f4becbef8d249d9b467e6ac77da999a4a86edf3e3929f5d97580e929fa2c8f60e93828cd9452aa45f0f7d6dddf0f1fc7ed60ce5fc89373fec9227c2d7a19d6f5f759dc3bfc1dc6a06f451277f7474ce97e32d3c89f33693feb1e4ae28fe66c9f87d230868eeb09f759753a59fc2632d5bf2775f44eaacffe15092212f5d46727e2d4bdef8a20f54fa7ee90aaff38c8fa3c11fcf00bc109eb2a91fcdefb44b2ebc89d55cf713bf8386ec72f30e785f14a470747b2fbf03bd587e2de210defbfb1af4412e71b3e17e83e7fafa234bf2a531ae1f7e137ceef55df57bf395980ff79a27e95b85f158637a4d17de3ec321ea74e8dcdf78aa63afd5a0e915ae5faad3e9d3b43459d3df5e9ebdb437ea0a3d789c71e1af4eba83382cf7e541ffb2c87d87a8edb7d56fdfad08e629af777dfed71c2ba4eddc917a4d60a0da975177d964952479a8e24751d1d1737e84ffd3acfe902c7edf449d7144efbb49f2f38e7d5992ce6572e24e03afe09d5eb5319fa2f15699a9e6b9d319fbe8c397a4f47aba3df90039cdf8e392cce1e67e89e8c835611721602d5efcfaed61be2a83c4f556da8417e5086ce18525be6b36fc5183868d7ef5ac26b5254d7effdaddfbf9d061ebd3170c2cf71bddfef43737dbecfaacff1f3a134bc3107ad2107f7e79883767024a91d63d0bd3d91c41ac03aaa5363744efb437dbba2b45bda67dd60385d6029f72d093ffdbe0b4cf363d167d57ba561bf5e3107a614ca67713dbfbe02d5f1d31b6addfea57dabfd1f497528a3f31ec787f6f9396ea7efb3ea74fc3e871ce4d7768e93c47f6306ef1fd4ef5e775fe9643159d0aef1e3a0dddbb1e7f6741ae85324bb9f64f7f5bf2b923bf459f50fe66461430eec783b7c7350da7166e8b7afc79e3cde9eea43fbf6e875f2ddd742722b1ceeef117efafe7c416bad4c86b1acabe874b4e0846b05ee437da8057507f6c5e26e310ba401bafdabd32ded96ee9c8021bfc5f372d09dc0b78e9752159d8e3df9f75791cc3f7138438f64cd41f30cdfac3b3ed4e5c4c9bd23a00573fcc2459aa1affa2c91be9429a144aa9541a2b84ce080078439268364db25921520d711137d96418e7aeeb30c3293b5e87332c08891117248141061043410991951c40f39201fb07d9640b62451fe682a6937d7084ac228226020404adc7b93ca78c00707b2a4a18109061e02c8d005d263088921c01b6ac6d06084a52b7fbc60e442fa8795405ae8aa3e4b204e9d7cd937c3a6420c81c0077ce49c943b0cd10118330821ae2032571097118d24a47e50716a82a4c39826af3ca2f2a3341ad2c13e4b2323a8f2c8486904e5e532ba23b8ae99fd5d1a15f557691494e62373ceb9a7bec5443ff8fcfbd375c4e95f1f0df4babbe962fffd70bad0af731e7166a4e8f553f4fa08e838fa67efc95ff34c53c44554f6c852f6c04d95455232998bc7de322084b8c85c42f4c7fa813b1fd3fb6305b37b982b6627575d068fa8b962f6ec0ae2ae3e2dd0e9cfbb5d9d3a7101b942e0247fbdea4e8e09fa073aba0db91586eb7f5c3baeb5de1d6d4161c5ea0d41adb5e8de2cac7e713dc2b816dd5a8f2aadee5c2dc2ea08a314166be2e4bcd17f415f7567528ac32478b3da45d9692315a91ac9d59deea95e4069b42db4281a189a146d3ebdd11b3542959a6e4e372c7dfe04eaef317c0acdcc15d5a83bf9c17cd46b0b9f4f18f4a9535f39b5d69aec820a8569b5b48bad383dddac3869bdbb9bf7cd90e70341100443d58ad7dc9a1a5b69cdfc90946ae44d42e2bcc6a644d245c25fd7752279b33cbd809428c18a826ab936ddf5e28bb1ad147f26be1689837a7dd7cf0bace435d3ebdfdca913f7c4095be98956cb05ba2a54fd527195beaa53af7f63ab311ccaa01d2be5e09c1c5b69ce56e1cce873d529a594d25ac6ddd6f95a9c5a2ec77b2e97bf5c6e2a97cbe5722f207befbdf7be6dfef272b773b9a95c2e97cbdd6e4fb7dbed76dbdd17daf4aeebbaae03b3a57aa5e910b4b9a95c2ee7e572ddedf674bbdd6e180c5735254411b46289ee799ee77935c00ddadc540eccd95c2e777bba81377bbbddc40f8793c2e170385c0df80262c36abd4e5020c350ac8ea6dbb95c2e97bb3ddd6eb75ba65d1a8d7669389c140e87c3e16c36279bcd66b3b9c01790d7899c143faa006532994c866b352a2e87a3d16834da8d76bbdd6eb71ccdd1f1c6edb95aab814fc63a596bb1d8ad5050bdd695b6d786956a708de3da0ad754b8167ab86e2a97cbe572bd3eee2ced769f56f7a6bab7f0deecbde9e8ec7abbb48b746939b0277534cde1ea4e960a7116e7e13a9c4ecfa08dd66c75e773f29e043b9bcdf691f6c706556f244190959303fbd1d119f10c9ccc503905ce3a45a70a3b14058a8468e107d544ecd041080111e11ef9630ffb3f01269484fea00d2d498383807eb8849068265e7a0e0272b263f440c20b112a416c00893603c10b096a70026408121e7c083591f2a1449110b1238904848890a0048917a61ff0d19451164aaad1214c694d981c7de52cfee22cce672eec7986c98b162d4d8e840061a3a515ee520bb3b94310518ebc50c20d3b84c0454b5684f0cc8699ddb0956821530313241a10dc03a9b66f98e930012a85211d822042041e475308231c54cbb8a14f8616b8c4e001a5334d303253078e68fed8c3fe5fb699c2cc1e1f615f4c861c21a978861b1a024a32abfcc5599ccf58b8459c6942848f243903351152420aa2458a609a2a72d40509164aaad5ca183133918190dc0ad4001ec62859b17139e20546de4163184a82801194a67c381282192438c8070638042102040823647001030df19039fa696206ca072c5884a521bbc4e3c79ecd8c0833ebe10725344079267b189319a0a9c44708432fbb66689e31d9e2f1176771ae99dcc0a520a0a8d952095828bb081942822e38043d86c80b9e7dec61af6915ff2cc5307466f6b187fdaf6099fc6020fee22cced19400e8aae0a5ccb243181c1051699a1849024484da4e119a939a114172584a62caa8868209093c8090c814f128c11252d0069a74f99124ca0c1233a03084120f4c679c7ad48b66090f40b58a04931d484c410825b91dc43014c495304ca08c70cf2c7d99d54860822104a91b6c40227404d3cc3229f171c469044d3b8a84a890c54c08439cf3b736e8f9b1873dff1fca7009a1f64402d08f6bc4cbba1764f66135363ff6b0e7ff00234448a8d085888810189a26e99a29ccecff65f74b47972c19439484de3245d42546cc2e28b295b9201e18a304862ea25c1246974c72f8616bb8534b5c866aafdc2c533239f57891b9362534a84e7f2ad1600e1fdd73268b29ce1a9b74baae70f2fbd71d92d52b9db46b7c49ae1fa4a17ff239b2f44fd1e2b88fbb7e1f7f39a431de69431e9172fcf4e6bcc29003fbacba33df3e79de779ef75d2e479f42d1a83eff0409ee4e24bb19b87bef75a8819dd18d17a77b3046edb9d75083195b6f1df66bfad4b5ee5a3fc557ffd6e31e71348fae1d0a0a8783c2bf7138d8d73f5dffd641ffde4089dce58e55a22b61435e4eb7d41ddb672b8c416f5def9dcea666f7ecc75f136a30638f178fdb1b63d4aeffabfd85d524075f301906197450c3060682684698a8930b8720d8ed1738ebf7ecd70fd22da106b454a2799b83ac579f91c73bda7ae9b458755b256d31267ce9b34c82260954bf3e20e83469d24cf55aa7cc5aebf5491dfd9b61d5603e7d1fddebe3f0d19d067db2ebfa2da69fbf6a1d753ea5676a7df69aed7e3b835efd1ef31a9bb06e45efb1d89136b9da15f00e4e4bc1484c0a24e83ecb1490347d39df3bceaac54575fbf74bb78fa3faad4c4eb6aaa4b5d65a6badb5d6f6bb38670d5e71e7bc43191bbc5de779e0edbc241960685fb5baab95ad74057ee18af32cdd7ecdeae335a18c9aa06edfc666aa047859364cddfec70a65d83771ab52b7ffb9c21855e9a6dedc5c4b6fcc4c4dd5a09fa9a95c96a728a8a7a71b4da24a358a4491286d8a99eaf66fee4a49e51631b215712883e6a73d8f738b9de77dde17aa542b15c8bd558d8d4d091b90e59530d16ab95ae0ebc6bbb9b195dedc80ae9b1327704e8039283c14286ca5285080382852a4982005f8a2278ab65271c354a8a8a002f08a0088dd58cc561a1bc10f635c91825006ed7f45d84701a82294413b492bf82aa8c0565ac1be4ffb7d155b8533a3e791fca0e7cf6385ea7724e9cfa736ac8d004fbe59a74a27a9d967e9d4432532e79420215398acb5f74e7902a74485537e504d999286773d6a3c249b5c4209951295282515155a25fa2ca9707151917a51c9dd5049c204c862b158264c20e1804a392a1b0abe0215abcc3041153054ac2206050a142852a4a84282b1554481091360365554685101c2603058284354a122e4b127aaa0b1f20500af1aa3a295332b3aa200980022007049e7460a0b90befa2caf6cb9225543c2f7ba4d09fa01802942825430856948c5ab680a943ea38250f0c3d138a5081ee2943445df836802241e294a1042a1749413a5078e0a4827b804b9912a7a51c91db9a824715bfdde7baf14bf7d96558e948a58b6122bd06c6638aa0153c4ab88e1b1aa42022255d108a10942c02a403e2d3ebc2f423a2b41185939e3e3de7baf1daf1011e52b4084e02b4b45f78a9421f6ca96a47a45ca885e2133bb9244c77d96578e00404944f6c2dc5aeb7281bf863897d244a48fe0de9432fc033c07fee2c15be03770ec7443931e3817ce03275f045c861dffb04d43275f669daebd37c8ac2b72b4990c69db2c5be9815d20ba16852df7de7baf2b068ee35182827237f7594699f160afb5178a981e1d14227aecd78cd7f212dc34c45fdc6229429697b62bb3eab28187e1357d962888d08f10fab69d596ee0d8fdbe957ddd5e7109fc4e5c9abd60801f8aac1a03c5390bb0ffc3422f184ff67fb786316e17e9bc56857f86ee64063a86f17560b704fe1e3d10afba27dec92254f5c953e7a4f5aab6d73f915557d0de853c61ce33bc2afd2fea1eb9386174a2d7ed064371c298b6567b55f941915bf1eb57ccb13b1eaf5ee9a75ddb74ded5bce59b35ca982821d89d14235292ba945927771434db2ba534596beff5a6d09cb3d65b3ad0759de7d952ca18292a27255b2ba5a05939b5a0726ac16d29658793d38c65c2a994edd56ac5b9130d352a7c2f2ad4e688d630d569eddc40af6f6bfb8ab52c6489c2427f459141fbf0bd9caa180b85884bb7109424706d89ad498aed8a1da909160bb62ea58d662b59266c2cecbad3755de77d369c2da763f85e5128dd41b0aa48d64cf4b6edcf4ae742b745ef6dc1e01a3ccffbc089c2140a63a204f5578dbd6c25942f50a0fa2ca1dc7a9f2514a73e4b284a9dbcbd4239022508138e2c3c0dd1ebebb384323b41cc09663e5a9e9086890915218c31c6434b9b09948b9b543122b391bc7eb80b8a7fb61c7769e11ee0271405ed3ecb1368593efa75ee27b5273490525a2b96cf76efc5b829496fd15aebbda5565d3ccff3be0f4df9640aa462794251e7c301a400b1030f434284b0829b18f9e0ac21f82b04de046628779b7a284afa02d007d0a91635fe2fe3fff2acb5b6547405d589751aca38015e7a69bd7567459f4f816e6db54bdfac2a2d94d25acb26a6b2c90630fd55e99cf70814cf9ddc4ec4d0df95c4e0f54fb1b9650330e7c57c1653277372604d499db46047099b1a32d788ee30410a143938276e5eae960956099b1abe5285e0e775fa48a9a57cf253369129337fbacc807013202026490011f1ddbf98c9104318634ca66c6aa17b7d964d566e9eb87050e27a61e965c4a493cf6b70d249fe649e74f2391a289de49f06854ebeeb0baf7d964ea4944ea604fdc3ba3e4b27573af941e5922da512dccd09780853d4660243c42443c7f845663bf1e144840c152535660a4d9f4abba93a6179926de9f36bad069a1a548b029ba2a8642e18252954430400043316000020100c070462d15894864924ab0714000b718244664c301c4623812889711004511485180308410620428c310a419436b6ad51d025b063513221cee4b40336a8609362dcc6c5722a0cead13f1ac816290f7c939aac778e0389bca87ce8595b7ff813940a91ce052a78227c1955084b0d04ba2c46f020d010c6aa2c18a2c6bd6e58a15bc40f0448a7ea6e758cb77bac20a9aca1f571067189fb83ff8200bd183a95f83fb027f40f6eff2e1d20371d893b5206bc414ac0379112e046a272a5b6c349c3d9d72984de1b9320fbb3719eee36021c29c85591141ff83b2ee4593798ce444cd3485233ac6b6dc4dd59e71a420542435129b763bc442ddaf1d409ad3d60a90ca642c2d95ea62c000437c24ded06fa0046b71b02ee82e9612056f452778380e1d1b633daa06062bef8d062e64421ac34372b2ebbfa005cc7f69bb1a73643b066b6e5890a00e6d06b6b652dbbfbb9ea521828ea39ea78da44c75eb71fc0318f2d1e6ce0057b5ce0e821cd2ea6a141328b9953604e76f5e7e064b76036a58e036f01f6a180306e0fb81ba3a4e8e375abb034ba13814a4d599357fbcf7cfe161dca9f0e74e013a8fe6825009a022bb7ab184f2b819b9bc7ce3bfd4823c53576df97352ffcf5d951d87f581e3128be4c4918d418e915174bf1924ec2041ee7d2a3a818508de4e9d557b9879b89a61e3694694c1a1fe7d1acd36b6db39a3f5d6b3ad813227ebe15d9fde45d301ef4d1c60a866567c1310094eb6a8ebc4bd1dd7c1c81b62325fb911e7dfd71f8f36a4ea98db651223f5f1bcd10262fa8bff9a503eea7f090812c38dedc9f063f7ff4024f2800257eac934059941ffff448da621df7d8da45090a784af7a821322412cf87bfaf0f80e2d3838f14899f3dad45d537688c38d2149ea75281068e9185621a79e0620b7483fa4e6e841b9da1342c34a41925f235389f945040ef4db057e4ce35e7048f45d407b4cb5b0180054683d9724db279de648f42f3bc2faf5e9c8518fbb318040201f77bb3acd62f43bfb55f1c355383d740611c44bd6208056e1a001b8f44e22ce5a7bff589460df747bba8fc373998b4e1a235752827d81a718ef09b95a6b0a63dffe0fa9bee9aabb5dfa4fd09f537a6ff63a98dde448f2a65c384403cb10ca23e6fdc51e42025c27a16633948928e98a582043007df9768529a5d5df92f850802bf4c4ca285c3ab2055c57c8d5abb8cbb1a0de1400481a0863a96732c2f0f15324daf40ab5e2b6705bda4410061b38989b7390543d7e416ff5eb7bae5a0e39be0a860372fcb4cd33cd54b8714469349b4d8cf09f5545d31aa88920656b5a5fed8eb3f65232a8351a38188cca07554cc289a2e9bb4908217d3bd3ca9be4ac389ab2483886873e8d6e01d08d6131034747c3479774414694e108b92141388819676a6af305fa711814057317df1d51c451aed23ea28ae91bdd5f60934ddb01d4809752cd27efaaba64a2ce150761803ad1f4ddeaa46b35b6ca4cda5a9838197903ee19054a10590c0610d410d9a01c0a0f0c6a941234006c134a4469a80190cde20356804cc20b8c6d44c1ba00d8b0fc922c0001968ba29e3222237c025864b61a05fbf3739418d8d64dd712b3e4b4db6fc647b18e09a060006da9399877ac6a1f08ce6481b203614cec8724a0380c3c31898232d401c0ecb688e3401725838325e80c04d397a2abc808f964a0b0ee8260b2b25940b94ee7892b73ef2cda28e4ad25b17e55e5947454900858f6a6968124a2ed3dca570318566d9c3eb72f9b2e46c3739651ce1f01e7b7a0a5ad208abbc5b98fe8f6a325cdf76875fe298344c2e9ca6cf8f938442e824ab2a43940e9707c2c34417db30f97135efed9254339a461302f7dc1bd69bb0e4c45e153356879f4a47b39bf5954d8a0b0fff52473f7a65725198de87a37e152a8ccf0ecc673ccf4378bbf48f5ce3482260cf51f2dc91a53d2ddb2d619f67bd4d258753c60661db92f3bfe313798e7cd101f785e515c07e0eb0445a65418051460954fd011dacaba137d0b07a24ecb579b0662800135727294bdbf783eefcc81eab7f1729e7078d3177955c16bf0ad930d37b0fc6707a49507699a94565d2ebdab4042a9392181ff410d42ae5b53a20938deb785b84483466a46c6abfad73ef34cd27040c2ddd6a7489340ab94461f45a377609a4a6d83ae41f867f20475f649d2b3dd987e51b837403ec272afa664aac8fd6d5476addb2c903d352cb8308ca461f8ccb0090b86370fc1ad439c229c8c59a9fefc718beb4a57592ae9b251fde19eef753385948c669e91da9f65021198eb0c45afdc16c3a4e5dfd9189adba8b22ec82892af4b27a02c8d51fc4779c1c9b0d104ddd4000c1c5dc3c7f0f82f23d73314385c76ce57083988c4ab9e11c7f4535b4ecb7420c25c2f4d9425d1fe539526323d6cb98f951aec8f222e50b437875fdfac4bb308860681a8cfdeb4202c2b3ed5cb49482a2030b9f5477e14a4b48088a5c6d96678667df8b7f7394caa398814ab09781ca27bb2d33f1a653c6de127fb4fd494403552022d3fc047bbd4a98ac8744c6065693d6c4c424a88d90fd73091a6d9d67661f680f35dc3ffc9421be3cbd7b2032488c02e75884073ccca9186f2fec7a9e69356c081beb74a487df85112d635e78067a1acbc37a0ef2526433a976e91896899db1fa2fe407f7451a11c8c0be012c05e9d8777f143e1eea20f384fa25d8fc135acf467a043fb9cb55a6b566a08de1eb863aa09d30cff121797f24e674b61ab4889e5e83ed7a2366a945e0312e150e151c612798adf9cc3f214df8ca1a1378608b26e45345a6628661bdc9d8d26e3a0fe90801f4a12d2cd711e9677bc13039f24af4a80d86b62ed5486339f3160a505b7cf9ba54628129cd61c734639d9e23600207f30784b5089039e737d6dedefdb5eb7c7151841e35b73b22469b174bc393308ba85272df3bdeafbfd3b7420387c881be1f4f7896bcbb52509204c4512a184323f555e58d4cbde924027e46b8839f062ad2f7c8dcd3e2c53e7b080081aeb708a9aec033be89a9ce8fd9ada26581e3290fe00cb85045294ccf7c1f639cc5bba60b4beaef2dca15ee20ea2aa03e2e9db85534c980f63dc5da87d5c1fd5708f8743659bd1b4ab86f8f6cd82abcc518093fa9a87972d84fe2f851f4ea76202331de4bcadcfdf2c07d4f2c2d5eb081929482113f621fc213efa8e629118f98ee779c3c7c25463edd59ebc637db7f895c8a29b121f6956216873bd90d5056a1b230e758c88d1ed3423445063f8d559df4e31c0ae6e75c6e4491dc201f37eba84a74d84d968f8acb0cee5b1070f8786cf6ea8a2e4b082ba276fb1e0a8e89b2f6273d6a8d3ce8fd09640258aaa3e253c96712bc23a5619a00044fac221558d61441bd5c7e02497c40be28026b733c9dda332b8eb8fef4dd8c8f180f93e7e449c3423e30c71e04b9bc528d1e9001556b270249a65a7e103739d3833cf833fc6521e58256423d9eb43b7bc18ce7d020da91212f544da2eb8099df431c45b76b98d23d4d0e9f32196cd54bba83f808ed866b01f8c748cd02b554968e13a672f21847aaee8a5b0a95f2075ee2b4e186d0f892181faf939b35904fc8349b9e164bec270de8d22d715f52f133629dc5e604c72c0ecdd957d76675f75f0a2256f52f3fa8f335970204c0baaac5ef0c44ce9e4a7668b9f328a75baa5ae76db9ffc1a722bd602057a7ab524bab21d1326b034c1ce5ee84e4b4ac93cb2bd0546106b313502d00d09fc16e92d405757ece6d02ea8502fd3dddea4b134a76ac5b71020f3648206ddbaeb5d4baab449ccc3156ca86c96626ae16fa58c6e1d5b6c4e762add90d1c397c104d161267bb9606ce892fcaac85f1b57e10f33044444cfc8d14b537575a355dcd36934ba17465bf533336ac9d8b2f2f2932f126afa3cef6e2d28ae735a5b6bb3c7f794a82a98e75a17d611d88eeda87daa83bc292f9f2a8f09303bde8bcebcc27a3afa4205203f6dcada1f31955537fa26e427241672dbab8381e6cb12eedddc47578922fce6abe27ab83e64d9e04fbe2a0282afcd5dba04b1f3e4166bb90df07db0f65528ae23dd57cf3057af1df386f6126d115be1c4548c478bb278e359f16d0d9c3c22167ebfedd784bf6b3146dbe42a9aff17d863ebec19cdca6b7f3d989a8993f5098c2d30a156e7488bdf8427fd71f4a6820fde8c162276086cc7519f83de5f88ce4568962b138d841244154c2807f21911c113dc3695f34c5688e84f3cbfc6cf7f5a1d8bb3cf2949dd8d86fb031fec039c25df94131dafb0ab88f286264d455c5f53fb3f94da64c272a55da56ee32b8b4a47a26e24dcc4c3d858700b31daacd0e667d451697c4ed45c0b231b86520598d177969c8188c6ceaa175acab4ee680452eac51654c8a51ba385c29eca3790c3bfda5e7721ebc513b835464000d7286240d5ab0bb6909b4b752e0f1922e76bdf6e8cfc5ecaf19a84d8baea2196ba251a38c3266a4514618359231e3463362bc716a32e5204d9470420950225f9824295cd52a0e572828d5af74ad1d9872886af03523801bc51c1a75ec87f7a00df22645104932633aa838b8b582729f873a92e402e3e74ac84b72d55a01af8f063387580cc7228ccd5b2a62563a258d8bb458cf87d0c61709cb04d8bb06a0b415323fd8a0a7b5d78dd4719416111fd908210f40b90919cbf0164be0cdc715dfea002e4ab718c20119216a4f1008212ba75cc0e4cc384035de5e94df4a473c95cfe353291234f52e304fe18efdc76463878de238c50578124e99c1afdd840057f10847037095ceaf5a269e20b8c7a0289d16c6edd68d483e4b9fca8adc485564810869ab23a01ec91be56438d8fe22895ea68a9634631571ff1cc5a9990f7150dbd357e28d324754b6ddcab0683a5d3a057fcca3f811492f2c37fb567657c244399cda27de28145ba919fc2408630d0183bc1f294dcb1b256ca801df580becf1a56d89e092ea636d7137ad41aea8abfa7396be3c06272133a899338969f77300dafdb62422da2dae95efaf0582e3f313d94cc81cc9d43944985bd5273e9ee4e858307aeffee53d5a9cbf83fb61de33fe9ffc68872f901c70a80e0c48b2ae1773f1c39ef23e9b0a083fa9d2b25924bf09a2a2ff75feab39a35f128aac1bc8f214454b5910494ff39008a6e218405825176c6542a71e58f92c8a2d15a3ee980427197d9add7ed06422e534ec83e34adb93dc388d7468ba953711987a832611dbf18afe6fc03f9d0e4c605e3b1a18d9b2212aa700b01ba24153a75901686605cbab809df4968d9e5d060982362dd98ad27c49feceff87bbcccdd26ef4bfb4d5d4c22c37b9d7e4305fae8a361fb3113762e01ed59a275a0a74838951fff64ebcf9cc94aac516658afee005d73cfdf3801f9141ff3d816e63ef5d69f49fed7de4fca971cfcb4372c45e84e41b6d15d5640b72befed58c688230d5b31e88dabf23931c9b8cd1dbbf2a901ba70377150c02a011be6abc277e28639ffa6a378eb0e9585f85a919dd79598ab2a169afc140a69dd1f888f26f3e463009734685fe53fabe7641e3f067493dc0887a2172fc02cba3014369763c314238c500b82050f38d873a150f8acdf568ac5e533a770b280413dddfac66367be2903530082e71ec14bb99b912fa513b97be058cd648a1dad676f4f3440e0952442a3277450e5e1b0e2c87bbecdf7d1ed5b01498eb66ec356343c61c8a16aa5256bf1c5bdbe6ea3fb2804d83cfed3b113e975fe86ad4a2e64a2dd797f08fb82173d39bd97aed4fd171f3471cbeca9898db377c3b0306ae54eefda383998c001722376c33a22a449046aaf4248550464eae6508520690ece0681b341fa3d444a94516a647e5f414e7ae3b33f522026e79a61beeb239aa6ce7f4cc13c62ed4738bc863e5a49110c25d41dea4bd3b045966932a2569947ef122cb866138a0525fb37fdfeafb465f3cf580f5caf2f24f65256ce4022226c8d3479fdc73721e783142da1753304c0635a42be50b4b9d21ddeaa7071ed3a0eb8d7d836317db5e9893a45ea2aa5f8c4c1ef86584115ad12094cc66489796344a203b527049269263d337f6d12c4cf616b646d5f83734319de5082d0e0253476d3a8dcb1d702252c8dddf24a455d137bdb79a15df345fab8925f1a36f563b07273af77b2224818aa8235639b45945e242da16cb849666f06081afb205fb27712899002e238a426aaa44b4f973c6103412ea36bc330b2924547214eb4512cf75c6d8916b9a124acbbb2889137ece04cdbdd9dfccb83479ecf4a33d91f63aceff279fcc283f777e36f7b697fccf70eabce9246ffee970a877e458f1afe89825bb54815e5fa8ed322061bc4253ed9ab73b274817692a092a01d3a4cccfd27e8815c98121bed9249591313c63d9eacb9a01af7c56787334e947a8bdd17548b267295d3a692199ff450ed48fb272fa39becccb5dfc0cea4af8cf093ecd86dc7f8610abffe39ee54056a243d62428e3e0c370b9089449e18a88a444d2c0102753cd46031137495cf7b0c23fa94b6408125c678a42e4a91626dd8d6172830ddfbf7a46edcbd87dfce8c70f0044c1fd252471881291dd3a70cd14ecfedbb409612ff116f63c67e45d4693097c196994f6680c25a319524b258d520dd1c8e0439efee73ec0e5f7f3f1d3626ff7abf6e4648d196ecbefad7670f0e2294db25741ea7c248db46aa9c7c33690b996ec1b163f9c2d5361a4a3f96177f06919603ff5f869c799676ca78e37454e5e0fda8e44007d9ce452eb98c341937d2bec8f9a63a5bbda3b411894bb60e25096936ac24ea57fc919e387504d8e58f632e523f12526194bf1912f9ac15aa7e0abd6fe2510ad4d3bad180593aeeeb4e40056d5fcd6c67f8c54bc13ac375b162bc81107b0321e13e41946803b9b01d3231cab3393caefb23ad3bcbc2edc1d361ded0118424e1910e2fffee183774ebd5097fee8a6475d25e8104c1ecd3d7e5b37228186f518cfc6ad0ac971a0d562cef64fe887de7d30d814c876224505d73d693a3d34459b3f09c6ede904037ce49e3dc32b0a9b39c5fb189f1b656d24251339b0f79276119794ebe1ff6edcb8cf8b5c4b7518669977c5a3c3d4c7e936b24372b74b546b990c8c064b72a9ff4a07a14c3d9eaa68b71dd7c72078265ee92e4869e031a62a6e45e4df125a2cd4d7649c456ddc8d4e55220f7603f57c82b3d9282d6ee97edb22241932fb4eca3400a7cf0140e6114d69fdf6df23c1b6485fc427e96435ffa59eb3e1327ddca1d22f3c1e09377d7197dce12167c6ad79b27fbfb797780bc9b44d31753f0dda6bb41902adcc05dac296180c35f00da5c9f2639b6bcf61aa6b9d77ec60080c78b1b29ec30fadfa38646dc238aae2fbaa06846e1dcd9d9382af0dca0c83f3b511ab0ac3f88b9cb1d2bb3ffb9da1f89b3608154c4b5941f6ef20e056212ac52dc5bedf361c07d640a06fab9f086c2f5bb73df1874205e201df4ca99ef4c80676dda285907d241148df79a3e0b49cc196b91e19aac11126b6ca153055ec3f7731e3293ef435f6f1619327b54212f51adc359abcaf0229d160643d0ddb4178645b092e28409f632a3e64e523af30c3420d07fc99d63d5528915872d5ef5bc7b2e135faf57a1638ef983c7782be016e7fa370c68992bed6a7655a9569abf849d8d82184617654e9edfad59a2bd256e7571b29e8c39ca0ad76f8bab9d51b2b40aa4f30c70cb3dcc73d098431dd413b07ad7f7880e8d1622afd05eb78a4c5ba514db155f7bd72ebdf6cc329469d6ac927b2352b3951edb1a559dc606ca41798088a5e2fdeeadeb351b2237dba227a7f3bfa7439498d1ec451e97924488d6209dc954423fce58e4107683f32634cef5908140ff85bfa74e8faa6166719bf393497aba21a7c060731f1b7fcf6f9a9f950a5ab0bec02fcc6addfc230ab67e09ea61f5c278bbff318aba6fbd94f8ce06bce7a3133bef40b10b577c5269734f3c7d7218706a8a434bd81487a80145e3adb0ed8d7502c11331525adc3394a33712d7a9a5886bc567a3c7b5834901d0ab499f198080e76c55e45b7339769e2063c3127aede0d8d4238d7997c739bab0755eeb7cd7d8378746f3c50248908c7d0f8cfab1bc6728a166832e38bb44096e667c2de4ad1c5d2f4bdf50f8da5077ceb1f704f6f1ef22d7e68788d762628c3d2ccc318e466d008ae8a722b278d00f343497e671824a9b2bad7b0446b5195aef59f53f568e0e0e4a731dc1efac245095fa31fc10ab61e9a121f25ee16050fa9b4feee70a7f5f287994c6c86fbd218f11a3ee6a7e653fe7f80c700410c96e64b8d69eb375a5ab713fb925a8fb44dea3804ef1332f4d2634805ccd17fb93214c35b18bbdc16273e880679a3001d33adcd757f2a8ab4b771d5b00f57eec1a4822cebda8faecf85a490603814b3099fef73704996d088fbd550e3bbc671530687f7a8a7b830ff34ccf1d2b575756336fcba5050b20e16f27f8d97507e627a5a30a9379c57b0f619e11ed0dc761f776487955a2d13d7043c0a23d3c22dfb11f5d98a23bf4f3de8ab018902cbddcaf0b6e1e1e98139a01c5f9132b9cf5b792a101cfefea113197ade841482828654838babf6f318f27f82a786fd0aa350cb48e270b67e04df771c93087623eb13ec6c3afe85cad6db39305b3c92bfbf92d4a4ff20f160de56bdbb8ed537b2be77cf6485b7d25e30881c33997a3bcc7aa38c462d755384333a846ea8c9afcc0923054612c3a037e8b1d809b47076f4deaf6997b15531b19d2a306594f314372f36b9f762f59b359f02cce4806889a099c6dfbc3a06e989377d5e8cf654f5286f5ffa9a3e8e886542bfd7a16244c1ca5bb467fb1a50c301b687284cea20c0be205ceaf66de6b358e43e7a8dec0cf89f23ba096bc401ab37c648736bc0393a257cd6495a8931a25014135c940b9098887824faf77451984b626b2f8179f993c23c04aecfaea14d0e8a0eb58f6d7d0010485ea704850b4e3be0aec9150737d4d01af39c5a2790b473b87cb0c1cb38a2cd9413dae2e15b71b9e2077d1e49dfd38d6c2b87773481a8bb2c78419b38d73849f91f228859ffc636ae9100234df982a2500055146c46d31f5726992807ce6f1f654f06ffa63049bab58281349bc6f0821ca2ef0f8a309a2d2a5aee07315234b22e07ac4a7915cc130aac012bd301d226596e271e2be88afb928bd2b5e692ff3be6872d1d5e7b314f6b96fabea8a74f03e170aa2357a24282606ae8e3fd68d3fe1c8be1379c58e27771f8468c4e9be94532ea80383d3128a5ad2124ca42ada76be390911f5092072761bbe1be8497113e920eb03be697fb9021bc7b3b713e963433eecd4da8c52070ddacba99f885ce1ce92c53ea485937b460f17318bbe09f77c1241c715c5cc72747f3de426c0041fe19afc12734d0afc728d1c6ecb1fae4e7c9580f563f86a9c07dd6de8e08794d72a8a7a64446935a7cff093526eeebdd13242fdb9751509715d81cd981524143c27592deeb0bbab226d24dcf6b9d1a5215a89139c7e70e916ae6954cc338cdfd835a1e3a1da02e7415e30184d32dcc5710355f3a153e56d04e915440aacfc9e3193f27f689782f4c19c8b860dc5c8b37bb1e6715dfd51ada4a693217dee6d1d39aa72618c115df8fba303ba99c6682405c0cad63d3098ba72e4e6e12dc12a04c8f3c695500051b5909cbc088271e39310131e330a635da59b0e40162c572dbf216d3534e391ea930c954a1b6fe8225a36f07e73617c1c19b3e2da1762ba5504378d13e7711fba69e3461bb1b2a13dc728bae99d91d854cfd3d51848710d2ec62d8539f15142a72a9164e76ee42eb6c1a65db080734de3a906e3246418431d36d05125e593283f1464f2e59d0f9525a035dd3105dd73329cef5fe046545d828625499a2d5c3eb134348264585dcbdb39e1c11975c6ec501b2be4d26f7589db53e60cbebf4210aebe7e6c0f38f7ba246d141d4630e77eac052b0f7436df966beee80489038d60a0660342479cbaf3fa410eb92245aec80bf3d986cef97dbbdc4149a9d2840262fe4baf20379dfcacca254ffa997a47895e615ea38efb3e94cbebba3284a512a7141d2068844639402991c43a54cbb0991b7a1aaadf3521c5bd4cface1b6f2830cf10159676c185ddf3a878861adce148665369b833565ddd8b3943a9c164bbebd54b3d554ba760a0ba2a1612f64e7beef751df7538ffcf263854999cf394475860d208a9f8df90f35eac9d1834abe2d4ac19db8736f3a1099d0d3692dbddfdb0e7fef1be0116a03177cbc910d2d9cc3a9b5957f4937ff6f50c1bbdc90bdc3b4418c3070baa5e165f6f9d0d1e3ab1ea8e933100423cdcf5f4b5cdb1c30cb476039d6bfce8c6cdbce67665f21a756f2b79179ea751d6b80cd17300d004e0d8a8fca33578b079ecc46a2d11f71f3a2378e0a453267f00226fb1b3c9dcc378eaa5e9a7ea85bb4dd7483b8da4cd820e6a8f7b28e2302b9f16743e2be54fbc1a7e506a2f02755bc449db582141e61a726548f93cb0ad8543fe1c9581c0f9d9ddaa519284803afc610a59a4f6fe008e2712e659119d650e72d0768296da245e6a5cb7e85853e0ac8020733923a02db95fdb159c825e950d625a8255a20c20ec6d4d8cd033d3e7b2e81b08146dbc47e9253ff7063db43d0c11a08e01a68addfd0a81d0aa6ef48cce6408a9ef6df612144dda7e120a1054a43bd70f2f9502556aa73754f1455d64ee9ce985d119142db0466dc2b5f76e6e86b96c90e042c967b109abbaca83cdf2cd5cc4d6969d38726079c0a01dc765cb6692defb609f98a3b5c669af7d12d2c0fde363e6e914149fe15724b58f02822f674669ef4e84d06100dca8aac8e0ef54f2f2f4fb67953c76d4434ec0c8d16eb0b8d0e29740d09d4fcded02161bf9c1c89d41a9001c9d09c79150209a523443756de4b7f276ee61f510639600622509724edc2c50ee49443df901c43dc73cc636277b2a3584112e4090a0e386803ffaaf1ec6d632089c710a76320844448f5caee18809b94fe4540e3041e681db88959a8ba503196a61dd75031d6034766c56115d8ced6329aac6a4f416de4b1d3156e771c0a809da9d2da602e0455cf5e820b3118169cf3606f27611d955dbbf8368c5f8e8f922995f136094b7e050a63146c7c35d7f1122d490e3d30e9eb10a42f73b4aa1ba13610bde6338ad2b65833f526347474fb42d64d0ec24dd0204faaebf6361957bfe98eacd2e0b4670460f7241d30701d5a521d8d3245deb2c48c549cafe3b1e33fab0e593f4830b169c8b6af2a5a2c7a30bd151b629c100900520483325ca889185df5654be33cb0a69744a00e93e7e0c6f4ff3f6bc2c276d65ea4d2b769bd147e79950dfe34fe7604e4bcdf503a37d8312702aebba5cc5b9dd2f394e85b6bc6858236d3dd42f473383e5f11e614dc298d4a4cd5153398a669a3572e061d4fd6fcadb8ae059c5509b6de00b5d3da7838be10783835d7700b9e598dc3b8728dabb9fa78839916c37da849d4677a80884489a638409a112f92bfafe451665ecf8ba21595d06974bd7eb6df88cd512dda30805925ec749c3525d04bba403df8c7b99143a1992cfb432b9813412aa54183ab2ed2f7d54e3ca9b5806d947b30c58e52bf163505371e023b961d82e8e146c18aeed25057eb8c88abf309ec2b6d7b2cc00e0626a7c4b9cd51f871a35d51c492faa006793461b69a13f322e964fa575528638245340fc828073fd820af2db37ac27feb36cfecfe9f7879d2a0bf03eb9863dc35cbe9288b7e782f2d3f0dc556203489b6fb543c6f4122680f52119a981dfdde60b8c6285f37e12c97ab7a4c5ba34ab0402aa3c783b07504e286424dcba9836ced3e31ad907be1df4b08b9183694d2e0a5bb2153c0e6ce60a521a561690d1af9f0aea7709fe1beebe7594e790cddb5637a1d8998cb4a4101cb44165593bcd31d24b1e218ffc9456a19f8b8937994873421af33499e25b59a9e1fe0c1b195e3c2c3ae58b97b969b8856e7df164ab3cc03bbbe10709ebe5cdce875dc04795975f474d39a282ba2a720028c61cab2f40381150abcc17f91bda7112640e66045611d02bb357946f9d0d1ba421c987c1fd3549e37180a184da41572e470aa65f1a2b5b5fcfb2af33e0aa753559dca6df5e1ac63fe7a63d1a6314d4d16650d5701e552aed064a21a979fdd003987f2105ea6793ceedb2c390b841f4e275d421f37b14385eda0d324e80a45552b703fb04fec19f01a6d5475f89dc56aa2959b9cf12ca0b8bcd7505275e36ab8d3bd4f8fdcf5b8e9b6080d00226697c0ba9ebc5ccd239992bf114a725d98319d65605fa93c527b56a97b4f078c8709157d3944490819060cce34b9a676e19bd8d58143c06df807328a89b14088e21cc85bb1bb4e6f7db32d4902ab259e225c2200c577e2f42ad7492c3c8db5b312dc4670991ee7238b8ce6649d63892cde94b15b91cc831e40a3ab924c5122654504e9069b85ed03eac3a11c7e810202acaabf584831b5ae481027264de469ea36eeec4062f747080d6dec9ed170d06f343cf94ed59dc17fdc76b91978b6f87eb4a512a339f2fb8dfd5a8df587707802237412d2126b497ff31f242f7fa9a4bb187b7db5ab5e724c298fd869404f317f87786759286012eac6a0e6d2640f29d8e4a8494148a5907ee56b60b63fee1f5470e20ed2c635a67f8875dea72fd4e38804c3a087048b87582f3c43f711d5223c2d9a5817eafc25b6e96500a6b6eddf3fb904494f44eb0c9c50e299b76979af52cd0e75511e760c8014332b7685f783cbe0be9b8e0e16084e222b969c27e621e2d770a8da56902499a18a0e9562937f94a6637da9d8f8d492136dc0378bf61040e67b034659f33281e3191fa96068f358e540fa83383e8bee84c48d8866eac904996aa7cacd5d1540806c8a0fb84bd61ace1fb3af58527752dd8f9374808a4548264d02fe624521e49122f96ab8b6396dd45364948d3e13c46c6b8bca6538accb5afc1da306c801724a3973925d6d3ed56c9311793f40f90c80963411a59ebf0e230736e7aa8632b8b41326dc952a6dc667d95d160ecf18fe9d704a2aa3c62a90c2de353c29588b5f7e6cc69bdf0029875c79764e74c7f112864d59d713828c2ba14203e3215069d052ff3bd204ca44d59799e6403a5944ecc4ea6831248c3aff6f4fabf00f4755cba078bbacb745e913d9b19a8863b60669db0e2aca198b04a7652277bfa7fd2b64e2e8fa800786ba5bd2b78af6e18d397f8d34c75737e7b91a169ea5cbc156f78808890b4f1774b1729e3071fea4f58a4788bb983ea81605dab84998764ba5c3c1e12f618a77fc66fd8fff4ce93738f0a54bd8348e5f431888546f7c9d32dd01f1af325450ee8cf8f3a52c7f72e47188ae92048a5835377848fc05e71f8651790d4d894dc24aac7d4a0946d36d76683a96f3731eea2654f4c38210dd2fa6ff86054ff6befee895e630f0e393d06088170a1f0fce036158330f8223e021e33ec7a40de8e6b92c5d8cfe42c68f546ef1fbcd966433f6b9d78b003995e3157ed196814cb1a7c16995bc458f5e513fd430b5ffcc295ff704388cadaf0fee2dd0ef69f8879ff024c7a5f9d8ae294cc0bc63d1068081ed99fdf253eab414545ba10d096564b86b05a518ac44e2f37e1fecb3a80e359e93d1b8115386254ed0e0e3cb802251a650913f7620dba781f492a0fb69e2050c5351a7495616dd1b9fdd4ddf3ca1468905f28b1b6e6c26fc0ad62f4c6b676662fba5ea240f9067bc704a44035549dc2d5756f91249d9769df444031ddf1511982884b4bf93cbd2e478e7423128dc76885341266bdadb3aea865af00669cd18d526d744562e286ddd9674d5b3ee3d1fb0e9c892dedf0b9e73b3e5555943231bf8bcc2525fd8846761f01babc63e62ee6f5024a27762328be4407386b09ad643f7c86cdb72c832ce3403139e012e2533ced5184c6a69721f638fe8609eb21e5a967204e99a74604e98c857c48b022d70ea6b3dc8750beda1eeccf99b1e236c53a168f670567e19b4d355eced5a6691723ec8d05798d2d0a5e804ce546dcbd1981dad1a0b0d59584f1c44020cc9ddcad9ac2d64ea4556dd8b5872fe31279c8700883458de1dc55b2ed70bf067a93f6be8c5f6200c49d94192fb86d8716742205f1c8252da02f34eead8922f969f94fd4fad8f11a5747fc00056b902f5b3461ea31fd58726550b11de9141248d55b544427a2911348e48e946791cda31258374ec101f6f20521d4f8ff75ba2283c8663c930deae0758e6411435f35d52a734fd25ed17e307699183c8f4f1c7a2497e288a024335399630b623b89477696f651c210cbc24149106008486fe123047fb4149d0f622027d295ce0802e1d91b1cdae9345bc26d487d77918f90a87d1bab9a472abface7936c5ca2f78ae1a52dec163213a2ace2e8fe6c38667df069c180875a068ad1c0241fe2c5c580065272e59a69ffff1ddad746a17c40c004d75ad5f01a6fff86ec692c04f62be0f9330c7dd5184cb7a16195c42a60af38796b5bac47900ebf5850e776504b8d9b512993c70e1bc8f2e1355e05041f8c29134e0fca31203c73eba854cd562fbbd9092267c7410a5a0d7e96b5a7a128b38182faf24adc9426472d76ef42dd1a85336d90c1015a5745bb5bde524e6750e75a964bc15856cc2bb93feceaa004ad3b52bd81de54fae0a0ce3a773812575532ac3389a4bf6e4626341154acc01f7f06a94d753d0627418c313e656d2c03842fe11bec3ff88787862b96f8dd6f46549841ee120a9e32bdf5d12b45e47780a0ff8021a3e48593d1415ade4c126e839a09e1639da9b7236dec7fe0249df78f5273676add6d9b7b8bc2fb8f8a19c3703c57837dda4e4c7bd711155e744c283516b5f71a3ea1927a1e296572b5d632136757528a19ea5eeb015728f94f322117ca6e308511f69693d3d8fe05710c401d51680f89e092cf49a551978b71917e274d60e35e26fab0abacc93e629bc0d59ed281a99771de9df23a5fc9184abb33987fbbb9f1b82d469cad82786e30f2d590519986e3440c72e21680c7889fc6487cdd0ea2a352087ef1cfa9e29ca81ef536f81713a77d41cdabd8c0875d401bd3dee87f472d7fe200acf31d75e646bd8b14a02481f308f4080508bb4f6616073df1ae7c294375499225b5e1df024082b7fe4fcdd367a1cede83cb613fd5f1d6bf420076bfd1e2684ffcb0fa350692df0e2076edc0c095e637a30a92a4f26cfca29504cd29469809ce3573826a22137cfe392bed12d0df48eebddd5458edd18153395e1105158714a01826077f4d1b5cdaa642ad1cadea32faa66af3b47a36f6d98cd911c8476baf3ed289fc2001b5afd78a5c3f7262d4aab831398c4897d2e547ebb9064b712d1d02412b332db413b9a31ff63a8f887bde8a2f51bdf60509d39b3880a0c27474cdafba7e718ed7dfe7ebd15537b3291f13be5f6aa8fd002d178ef5f42310c693442fc180216e4aed09d2c312547e296d0e204eada88a6016862cd0f23ce8c604fdd9ea8b68e57ce2aac772058fd4c44a7fd283c1703aa6a82351afc58567e9ebb36e0e3fd7a2e658332e4b33f12caf25db11ec7cde9626696502fefd86d01d335b0dc46ddd5541c0807735d576f7e1cf462d00bf4f2cb1fd72fca2d6e276e5e2aeb05d262a47537c4997b1ca21ef4ce03b02c6c878a4f2bf3a9bc6d3a0c6fa833660256f555c73525c4f93f3399252f5e713b5407b4a3db80bc31030c58936a63fd9071d0b5b1229d23925f2a8c3fcef63688cc509d1dab7dda206644504fa60e4eafa87fb3d39237af408093bdc083153eccf71f1bf50d81e3f09dfee6380689cf37c330207670dae35f2ce3eaaf84a9a1473650a48ffea36e930fbf4eed38b2ea7399e213dc9e702fa00ab151c5a418759311416620b5c8e2043c035b0c7164983cb1a00a23bf3454259ca2fedd0847898d6172fd1c319d010f90475b70c4ed062c9ff05b979fa22a0307fb508e9112e4668c6b825721c0320b457103cb9e3256a7e44d5d3934ec514c2181ab8ce1a2cc729d620937544337bc1825ea4c2fe180dd16336542373fb33a939efa84e53982aa9a842944371b60c2bb5f7e4cd8bdebb44d48f1ceca8f8b4cea39f9ac436822d149463bc3b3263b89ade3c36fe0b54be593be154427447dedea77dc74bcedf877ca72fbe6cb16d90771cebbf1c711eaa5488713b21465e8bda53123f34ea1b633064168f08c73f9a5ca7ec12c413a6fd75181bfc2e217726c02aad7913b39b87cbd80bdedc97ab94065aeb1d2ae6df41359a70a8a259570eff7bbef305b86dd5e57fc0ab2643c07be5d84efb4e6e3fd8dc2e9517d60f21a98a99be38286347c9ac8ab6c018aab993acb4e00932311657279532e091dc5d3ffd97e63614321af9697e965f749b5862e3d9b29eae84736cc756ca523b927700b92ff6cd8271658ecd17d7802ff8bef3cd493b04c8f05978b25651f5156e5b86dab823c3d790d24beded347b7bbb0aede3edb76d7d841ca0e7b22b11e8baaeb7733b42c579e5ed3d37dcdd2554bd4d90b9280fc9458c380bf7a799036c6277cb5577d85ecafb86158a4d373cbe1c32b51485cd218079c49d7a919a0ba8e178ae9c589db221c92da12630825c9eab6d497d934d4e037367a432f1003d4ba9a6271718a8fc117d574da6b904b6e8418aabd9ad360df736e084ca546f2b97f31308500a07a76647a623e77104410481862820f8634ecf2a25fd6747b5544abb7c961d88e504acdd61a636d988f4d07ae5274d4f0babfa3ec2b178f30b163d6db928faae715de612218e62b3819b7b6ac06e0155edac76165267a51a07c1d9fc21670e2e69ea8686b671c1837544c12b99dff6dbc8146512a067219ec57b091fc5d8a53c5235c1dbb19f2f636f6c3e31118171c0fa4bda172a7884962d54fb9737bd7b7cfafd7d20ec14b7942c4439aec67b5de5fc85c729a8d26bfb33c3eda85e128ee74eab1313adf5331a518a87e7861e1749372ec41a89139f319c5a29f1f3f9fb83e2908054bb0fbd327d3aa18b54aa00f05eded7cf43b47c1aab63f072eb56b1cb50bacae09cb62c4766b07374681863ab02609df5c235eee0b18259ce22a16ef1f1831cbfa449af10285526c535556b6a765145302ba6f68af2c72bb1867f732283f168eb065aa405b1310156db1834aa67b602e815ef330cd902f6a3d2490c8c85ce8b98834f80331d81a4c1d64ec215b83b31338973ed074ff23536ac5b73d83279e9114e0acce538224ed0c3a1b280172d201a4911debc2a160a5aa3082c361290f3f599507dd2fb951e649d5f925aa52550e51e335dc0f91ccdc99cd3c5eff6176ed61d914968362667f872cff22884552c267b4c8f0ec85ff9b0f23516803d36d20f4e4fc7fa8a0c349a00f4583a8e4b721fe5ae85a3958690f09965a4205d7aaa65efc64c066403be8ee4a59ae493f73abac5a47851259f1e6e3246c0e6372c2a5944cb646da78a3e14a07a0513e05885192522bbfb5834aa9ffe1190152579ca5c3ba470610bf069934c905d84db413fb2b1b594a4997d2bb35818cacca6d24a0e91e6dc4ccef7b5117e30ac956beb897a58122f8ce076a34286749cb8ee64fddff09a27a2071937f9e78a21dd59fcd9d20ea39de6c3791b5281bab7062469c4c35888261bd0ee22d0d97afece00c4e5b484f1a225a369adf6e7587621204dfa75c871c7687003029c12b5472de8076b89f03a316ec52805b5642bc2c592bc0818ea10ab7f0a549428976d89eac7228d7b69fafb911f951bbaa22330665bca470eace85b910a1ae2095949bd16e05dc1cd27049a55c87f1965f62b2809de7cc458d4cee60ebc285756585b647cb8bdd3dd0309b824c4969a15082ee50f5c632a3ca57427feab0d87ccf0951e8cd57bcd88f4e266eb4e71e41236dfa2062f14019761aa4eb6287c14d406a08df039e6b6a036af968f075e67ca2e233b1be29d68349bef5c8e3c63e9a1e5e36127d9c6488481524956ece963ce24181b44303eea928a0e2d5da5bd4a3e2f3cfaa6f3cc506b74c1c57266340c5df20a3584d54ed6025b97bf460fb5c939362fab9c8688b7b44e4f66714c77f8254a026d876c7f4637e091aa087ebee456848848bc8141b6e293a491c3ecd0c8f396175071923fbea4eed654def3b7af314b82758fed87b085ede1b4e48809c8f18486877905df415a3238f049803c21c2bcada082cca26eae7d0a0bcbc944e31880e0a345103c627c1edcf314c9d78aa43cf33fad238eb88e2fadab33850f1b353e4c2a194c13d116539d14d2636924f5cde81e37bcf723bd24ae7e6d3ba33352af8e5496ee2c3d6cb3abd4788c813261661090f3c85a3fcdceaf0f816938422d3b40d93e7151e94d78aac18e4057717dc1b447dedd3d42eb89b19407282793d625bdb1aaad4862dd31d0602883c183aa2f02cfe4da3b2ce088a1279bbf3edbe758c498a6c5393646cabca3a02ee96e74fdea630159e60be3ffe114429c21ce6a311b8e1f2614e1deef074880012080b40130b41138da0d1ba1fb23e6efb839a9d6b3731aa62a414ae3f867770df88b772b772980d07176c2912436a64f996582041b52766431da518afee859ad03bc6ef5c4a748d4f893ddcd380d6a561110bcb21f8ecd68d86b8e714618a24fb289b57ba4fef114e75db2e789350a482d609fbd1948df74fcee2e44f8b79d1c10f99c3c74491ccbc54427410e897bc2014f63e9e16f5fb26aaa4188ad91a372663edc02a8d3b6cf3ad2072c853873a6f51a8e4dbc4a07ed6d111be1746876e9eb041fd1ec9f314aae299247cee8b46a9e2c0f18f2e5de8c24b29fc4527dc8c86d5aa828b19928753452a64267cffd2d804c2e60234abba66b0caa6ce427022696b17c34b4d9b450946ab861aadd5b2ba1100e76008af97a175460fe1186b3aa8db52a9ae5ca8cab82c60db8ecbd35cd9a3ecf6ca0f25d8a7fbea16965ac23db5b33d793b1632959832fc31fc436c7cb8bb110f5dc1dd5569b87973923fc63977ef1f6b1b692026d7b8c913df4a434a6f4caad83cc06fb45067ac53d0d17e1f0b0866ee700eff35950b4fb562665ff4424fa5bf6da5754d378cc91de8d7f0ba338b2df9ba4e1ab8e5f70fba80850f96d91caf291a574f21f1693a3b35b7323e99a13fd8103a14c44aa4ff2c71ba4aabffb41ed3d096619d50673a132f2488573f73f5529424f6b368007572eb0bcf218cfeb9371266bf15d3047623a878ca4e30f62532e015831bdb88e1f92fda20480378709649c9c1c5a3386614b95749ea09318a0165b0d465a09e93b8ebc143615a5671832a64ed36a57be0c910b88744f43c94f9a75652bb0364dfbf20dfd32dad19da345f905a3a7bd123476523b34cf409fcae9c08daf822395fd1d8e8081a73a2b7c9a0c228b96125552aa1c158e23f704504da96ca65ae09ff16902c57e360136d53f74dd4b24233c72769a152e1a0dcad87b09aaa16ecf8cc8515bf741da9c2d50a016c13dad15ae86d44b5144cca34608eed800a9543c8fb0e8709d95a3cfdb6a9b0237fa3355e2aba010e8a4988cac89c51bef9aa5fe5c86f56180b785531d7c9bc976026588380cd5a812d9eeaeb643782a8b0d2393e76c063106304d1e758292291a2d0f8af002a6787390450e70a4094bfa7198a3d4b8d586fea8604bbac4f12849d8096e43ec9a7551cfea64eba19e415cd2c02ed63e27d6876819b73f98024cacb25ba98ce8559edcbd7388a6623859e07e3c2d1bfab8555ba6295dd66a4149b0d1c6888a9252b02b72681efa39c2404f9982d6eb4908676775848a3f262e70098f275a50987cd6c65587628e9b195e078f3a7c9dd5b8ae88c45fc07747f8e1acac6dfb5a16346c63e71a14e7d16180e3dc890c51dcc34baa9525e9496616dbc8815a59110ed274e4f269367e46673d486b35a8416664850c4332483dbd39f77d5f8849fb1b9628f34d02c7b92eb872de6ee9787340456785c036a7f7d2430698900714a2749a8766600aa217d7e10fd8802dedc39aeb910f4e779da9553f29b96521b466e7809129422f7aec9888bc8545657dd5e93e64a5c107de45017ee6b32d38459ec5d56e09b9459132af03484ff615abf175e0b4a50ef4ea737f005e9315b86c844276817cc7612d1d1de40ca8965ce4ac43ecfd794f46377a8526b5b84250f16aeeee99ad9487bf5b1b39e6d7ebe361099b0f4a4131fe46a92763486bbf2ecdc6d2b608e9148b70ead89ca27377dd0300bec56729857e78bbed9286b6d5af596dd9b38adc40cc053c46a66e3b60c9dee092d76b28b9edab3416d5e2e82ff535005aeca7a87db3dac90906901f079338a8a5c3ec83499121fd5b37d8893304a8adf1a580b9a6d5e99e9a414ccbfaf53a10fe9d14e2a425cbeec27e83505c7c3ba1223064d103e59e7171b9e12ea862f4878ded48f7e03081627195ba41c023661aca5005b8f041e61b3eb9c159a0d84803871fddc77a8b94bf3adae8f6c4e21f6e04b78f831a294600af897ce24bac77c0c8aabaa8aa414703cc3fd95ba097aac1677bec95e22a5e3cd5d1448172dbc1d013942091f06b96477873cb4cf4a0ca92817ca5904d90b6655ac6a0598fb7ad1f61ed610d746b4eccd16e7153d0fdd3b63c666a008986345c65fbe80fa3882b3537d17d65c71c0eaea90c79d153ae915ad8e0ad94e9d5fd70707d1050d0cec205ccd92bf1d50faecbbbd69e4ee74751c0fe59fcd4c947ff9f6c9088d544b9d1ddcf224c0551db3c9a52c3349cf5097a200fb7da373141cceefa25eff940d9867b3d1186cb516dd4e2d47c9a4674b69fd28f032c436ee97c03520bd8ab777d785af8ef3898b3d89fe0dba29470d021dc554d9517849ce2ed16d9182c6fd037ebff14b708c9697d762ba1c4232ee0b60ac092e0888ea9ea63778b57f86688fd14c29486707147ae6cfae2bff8e68614eb2e940a54b5b67dd7a7609d9c9072eb2ae8264033e6d868cb79e7f4300b7d41b9430d438f2bcac567a9edeab08968388aa77ab97f253df6fabaf40ebda1b101c5c0af10cb537937ce9e2ca8b60bc656d18c52791dcb2898e85169cfa7520b63c9fdf7b6e61b30493bd48b90eb350d4b0b2e9ff70a32e1abcb9aa86a03129fe236cda4caba66901429ecda21dbac4a7fb64d2c88a31d60db4c92f06ab97dc05a6e08c0c69a9596afe41ceabbe2e7cf4f948db5b707013f524241841f78b132f9c90e3a8cf76c7772b107210009c2ae65a455320342e5620de42dad83e8180403f957b34c6e0c64fd0d8154e09f0c10cf4426fa5e3c1f48f0addb6065b74dc6a69394ed0a20e8178657cb7fb63936d4c2e9a6854f4b4dd97b3eb4eacf9dc8d557a25a3f8a36e4c83f76091350b9012e0859275269e745b568bfaa6211b653db511cf0cb676826714a0a50fbfea8725c827593ce0d81c892dc959bf1ee905d8e1cf81088295c9b3036946317654e1020a132c4f51cbc65b02f3e4071cb7329ed53cd6403e8c1e29d70c2222c9325fcaa8f498722963e8f3be3707b94b97457c2ebb091418f2bb7919b960f2ad639535018bfb3fa638ebf2118a14c3e941b8d207150280cb382f97a57ea69f29b9420c91b494d8d13634a458f010991810de5bc021f0ca0d9cb055360b24c22934309cc92b0e5a2a7ac2f9a82d6d18532eb4753673dcddbcc974bee701cade844020732f8342ced812a81fe4500a13e9672704404346b81598d771e766389eb9b7a5fa08db993d746f118b4fab48240bf29ce13b0ae9cfedee7a4dbc55fb099f15b42e652cb5fb61a349d159281e0b16f0fc3cff260e7fc7e2f5de1a2d1556f757be69963d3356c780bcca9eaa1ba99afda4df2b1f447592949aa12712d84905aba54b44f122af713f4c88085ee4a062f370d6f3f25f14325dceb8a9600d4d00442158e1670fa5f27dac5d65d469a79dda85a79f5686526a7999373335f6dd909f02c68a253e6aec71298ac7cefd1a9343e52bd1ba3111cbcbb5e7bdc54c87a09b793227ef9c26a82dd89af3880f57e5805dfd6b8dff79f8682dc892fc4c8701c32d7710535528bb3c12d31a7139da8fe7351bc33b17602234400bff23d1722327c315a21cf652a7d9995d27d13717b4d5fdac50f416fcbfd5d9af190094f1e608dc2674bb7807ff89bfeb72cfd3814c7c9aa0aec6a481a1745f131e12be2e1a755150c4ed605781329ec4a8440ff0089efeb20c24464365af4979d28a6736aea7713482db60bf4f86e8c7d71113026ef0f47320e3db61ccb89e327ef5aabe5d08e1cf1c712263ecda5bc7b2284ee55110c4716b216e293531ba9b06e2a445fed0b28713f3f29933751c568bf9e8482f4d1f5f5472681a6164bdbc92d9a697f0009297b49770cc84946dc56c28bf9dbe5c209314faf9917c0035cecd239af5c73a5280c4014ff21efe7f8de987b2852be199a7796faa61ce3c8f6c4e6c2680b5207dc9064738a7086c00d5f8ec506189efd7254f5195287bd8169b3faaca5c8f74a2a8c0572fea3dc33bb0029952a2b7fb0a6fb4ad7310940e80701ee1953fe435475d7240be7df8c150ce5c4dc021add3c6d0546caa7bfceff53782e8ea5faedbe48f6f8e9bd6f15b89082c51b3ac5e088ec8211182e738e46a4c4fa83b0c21c5a27f4ab7825d09ba552d73b1d5658b011add15264c3c13e6a43fe8378a2d3c370c9a17dc9b90f63887dab51e5cc9d61af752685b65752f5734e07f5a3238062c7cc9a99f542713b76a45dd7141dfe4b3e4e559971b2cb40bfb57e4978c8e2107779a950050090cd1e32e6013ec60c4615667e9fd1a7c743997e6bc0c8f92dfa0a7fac4c9fc531b0b1865ce534eca83d8fc8a85b95758d64f38b8fb7f404bd6406d3885a5b2bc84fca0ad63ce69b6e7ed567ff3ccaa183fea6408b98ccec5e84f0cd2cc70414e8178310a3e9df6b8e42b12042030faf4e59baaefe798161da4187219e89a0f43d9ef81b88cef554bfcd1bf3356f340a3b749bd40a3828baa4d5616d19a400e4c0517704b8b591194c0800833d6528b9d26223ddbc59a24c3415575a8a1d1fd8eecd84d9cc2ae940719025b41a9d1bbb896aadd321f23fe82e4e0699defc7cbda9884f2aadcd1024bdd55d6a143211848542a0827c7a7d159866bc1f0652eb6b4569960a2124458d67f5085faad6616acd6020ae7b5605e50d219a70daa5e9ba8674cb820920a034c378afafe363266563b9fb13b5ac273c98c57b836521f06818a9cbf7d8bad2db0b4bc260608400042084035807e97432bdad6d835d5d3ff1c63b931924c059cf6b715ff134288a4d0caeecd953b3006d105f305f1a270b52854bc95d696c770ae3d8e64b5478a97eac6187ddad56ab55a59986dbbd841682d8e315ebbb22bbbb22bbb6ab9f5e9d567c52ed5de9662af3753af74e66bbdd2cc62b1582c11965330072c1ef017a3b85472a7f5634b5f62cb55dcd95fb0d8c59d3b98bbb8e3d6373b89b6cf39a7d378ac185b612ba781ee115b456cb5f2248ade7b6fe6d8d578c3dfb4f26a196635be6abd58fd5bb5cd6e6b4b5ab1ab3d88daf263f6aa6fae5953fd42dc1e76b3da97c66e88705ec65231e6544ee5544e99b6454d8b9a16352d6a5ad4caa25a4e23513aad548b484bd5ea69c529f786c3217dff394decb9ab24eac7aa5f13f5db327e3187a5c34ab188b022e031f19bb8b0c5c129a4546abff098f830ae8aeb21adfe6634ba34d1bed9c0cd14dc112740028af481141441c80e2785db0197a487243448921a82d7a7309ce0ae9a348413dc549386c0399cf0085ca1624baa3ecf592f33447ba6bc9962a101132a9dae7932b4c8f8ba53f336f054f366e8482e2351a8a56a1e07b4d5bc1b00d0d9457c1c31ce1e98f82257786992bcd0cdf65a5af102c3c284fb9187edcf45b18265da767930a1739609dd7c165d888b0266b3e8e6c374a2959d97ddcd7fe9462c3f566c9625b6ff4b37df85658992f6a45fd102c4dedb9732cae5daabad469be43212853aff5cb4f2b3c32b28e32cef457c0365484d705e46b5d88c6a61a12bfc64fb73dda63db16512cfe19294ae326a5bc11837a3322a0413b3137ac38210c56a8d3685156a91ff60c7971dccfeddadd8a54dda2bfa596a7973b568ddc0182f3336cd9ebefe6c052cc7a62bfa39b41494c137ab93686f372426382f145ac118d9fbe7aca32b5a2c7b456b050acaf88b501b88f356b450db5ba0600cfaa2d08d68631ddc79c32b5a2b7678216e2fb4c237de0442b46136758bd6273fc3787c61b95ce15ef24972ea234f8b369ca9baca50b6608412d0e1058c13526080037c7ea2cc5488c3ee8c314a7902d30b1827a4c0801d9f1f5688c3e6a4c0a4540213e8812a182f6620657b2f010a446002a8fb02c60929b8184001de67fb17e2b07bfd904229902a185208234112d28221e5236078882898edc927b94167c7ff08c8c839264feda23325b961bb88795312174440cec0243d5cb0c5f2239396c020a414c258128288cbd1694d5f290f5178c0f8469800809120bcd892c788ca48101c8f0ceb35220423537460ce49ea7124c7911f3f8ef070c40547861cd939f2736489234e1c99822407121120e901c911244e902c81e40848aa50758004aa1d725005a12a420504554b45856a4a2906f4070d04218220253a9ed041084620df86861b478c28108147e80434b64794315e3a424a086b85109682e020d49e949307ea53248aed71a41c8a4c5144097bb4218f111c96cf5edb3dc79991354093bfe739e08cbc91267f2a3a412829517edb258ec7f84acf8ec5a63fe847592c9614edfaf407fd24655116c5910e6728fd284bd60067ac0f68f2776b3f8ff1bf97e37070b6ab328e9ca1d447fce839a0295ab79f673fcfda24dbb31c56563b8ce503ce40882367b21ca0fd9c063305bd14121087ed875d6b2423702b2bdbb66d9b9ea94b594eb312e5027152486fda1e65799b556d7fb9c2fac179dbb71d082034158c61df1d07677b38073803a10948d240997d30067d7fcce77b1990ed543e8824850392b7a3375026bed5b58332f2c7f31c9b640417bf9ab061748de5e36c2041214121412141214121412141a9df77b224289c3753330585f3cf3f28726a2762c61afd4a3506f6c5833c9f7051c6f751954a06e909e949aba552919edc1b4d90492bd26afec493cd3d491db2fc2c3b9bbcd577163c148281e138699a73eed864ccec443a82f342d9b59931b3817b4e782f8dbecd94428a728be0343a783c0a3ed8f7e1fe0b2ec42a90841f62bf6df34676f85a8135ca0edb58a723e6ce0769b54400ce4521ffbdd92374d7a0d52ec4ac67cd1693ddb5b1ee7acced5890f5ddb58b57c515c2a8abddb683214db7f39daf7cc17b69de8d7da14cdd5807c36364e73b678849cdbb21bb79c2fe429a0a004376737bd5135e0d037beabc6f4c1c56561d329449b880c80b7a5c903d84433401841cc20718b87b15434cd94572906a28624311204550241a8ac000872243e0a0484f11248a00158912040a57b9fc600792920f241f3c4300417da0d387e861938086e021bae401aebecc9f71f6d79f32ecefc6f25f38f60cecaf3f611a4299eb05fbec5faec7b1330d03a66d58ec4bdbb0d8daa3a97925162f25a5205c7c2f0529057147a1beaf14a414a414447a7c1b38b50d8b2db5fd2143179e28b565bc52d3cf695c3ed21e70e651a61863cc32ac36fe94c748953449baa487a62034d54abd168ec0cd9f9de8eb72c4a84acefcd3253da0c9249f86a8078c91bfe900c6d4dfea6f990c06e8d831fa1da2ef338dd22714fd0952f4d0a57bf1273d0e1446dd8beb171646eff23546eff2fe2e7a061f5cd77079929ea1f42e3f03a9d489be2e66324a3e38fa22ed42ac22c289df129f65a5cbe6cbdf584ee3f212030034c9e71ec299c7d114c7435d4be7b5d8f5593a8fb4ebaf74a21ebe37ed6d3ad8f2b5cedb3cbcda5a22d4968f3b4f86d56e81a6686adb77147cfbf20160ffd238dbbe4b473f18637fd441686d4987f3b71a4a93fbc316686afb912447648852219997b0d89f9fe1952da9ce864f5190467bf8f406483fda03d6c4d72fc4c0511f1bfef6398da629cb63e4f6bde042ac42739ed8858ecaf9210ad77d0cdb503b0ef679ce8e04f0bc878f1dbd952d593146c7c18131ec86b663b1298c917f2ffee6ff9e396ca9a9b66f0548d2c81fb9c2a2126504da64c476dcbe0fc8962367e6eb89e392b7086acfd46672a9a0ccfcd20e17fd274babc1cce98132d3c3397b7e1b2afa20be903ea7c9e4b4c675dd4ffe2ef1767ceda96536afcbfdc50b9fd9c9ee4921a594d228af365fcea03ab44b40380f4b61e3d83093215fcea053bed4534f28d322e569e5fa4bb38bf5a5d989d351472853b3d3762f99a580730d5b351ad7dfbf598d4bc37018573661263f660b807b5ef9c58b2d331a5ddc0fb834f4939d73ce79b3d3fc15260c27bce79f70ac221fde0b65b2eda42f6c2bbe106bf4259da1abec1f329c97839af6e891a9e6e1f86cc6a40151d0b1237bec77642f2c648f7d8d4c631a7a4c8dfc6df8a7bae79f649551ca7ddd7ddf3927a594d27dbfd65aabcd4e75d3ce5a6badb5fb7e89078bd56ae9128f2b5321b4ed677c6bd5f6afce5bdc77c6a5e90db46101830d8b6ddf86c5a69a45d533253b7f5a654f8a5377a6426fa48e5bcad9b1d80c701a7a0363e4dfcb912213ce86bf7f747d4dc037d46f7086437e2e925cfac535f1051b69b69cd390aeeb6de7c28d1b8b3fd75aade682dd8ebb0a09102fd791619602dcfe27b85dbb369962768adb4b8dfbf669e070e8eeee515eed34317ea15fffc55f9ff03e612a32943046172c212288540ff2acfe5344122949807424a1a283122018e39c95f49029d9a9d71132a98a6f478711446c6c439e1dd48ecf95e0cecece0ff42af06126825d28eef4b03dccbb3b3dd80102b521939600dd330c2e09dade5cd2da4b96f08004abe41384b014e31425462845299508b104a76a67d149e9ac3a0cd18316a08068304283c0711f3ee88c9452da81276ecb863c4a76b004097fe1eeeef1dda364919c7031250f5e488f51484ef4c0c50d8e0e20df0d8e0e484408ba43553445895021684ae6fce5001182fa72807c3d3b55555bfe94d24a2daa838e39ccc10f36c43c6cff608cfb516c095faae44e7c02c6a8fe63870d3fa296781223bf9cd5d21665c126289034511b204250f5cba9403e38736da17484089142e90841611886611886612bacaaee4efdd9f2afbaaa3d75479a645559abc3ded4569d52836aeb6689a17484089142e908416139e79c33cdf96780fb5e141622c4969f53281d21d284ba321b0c0863612b2c09ec075b65386706e79c79667d5110db159659966693b03fd264614409b942dc144a47080a833a6ee0d417cbb795e9d8f2b59bed4eb941b77512edeb33bc2e795d7e5d2a78f55c3bd2242f0c9bbe441ce56a4358845f98dbc31ff4700e068243f88b98855998855998855998853ffcd14bc571a48d3ffc79dc4ffc45ec5d49ee906aab15e9a5ba5497ea525daa4b85d5bc8a5f4e0bd5d269a55a445aabd56ab5f26e0506bb92bda8afb7755b4e63572b8e23915aba52ecd2ec6e638cf1a22eeaa2e0f6eea51545fb5a7badc5d35ed445390db65a71a4795101344af73929ad93d66aedbd97bdd78571ce18ce1896659ab665dab671dcca0a0b4b4b2824128d462eb1258644ef516a386424000d628cf1ce11f0d4c0a734a434a434a434a434a434a434a434a434648390db9ee3b6d792c0c5bdbd7737b6b96c5ddc5e6d6157fc4bf39d8972999d5ca2ecfbb585dab1f484f3306ad381104208e963fa174645dd82b4afad05d78e75b9d9f2fd29690957014f9588701e558954bbfefde4cc68cb2cb5ede22e7ce5ebbab4cf3e67415cdc1a6d656ec3fad2717b0ad211d07834879b89549bc3f495b3e56df9dfcb71de62c7f75a68a82bc7d32d3a251cce6b59a1b6fc96d5fda4497a6ad36f69c1966f31ed72034594623262725306356cda4d281323159a7af1228a7b5fb8704182624e17f0882522002209523c61e2060a1a1e54d0008a8e1b20a1841aa131e4a6084094fc180105040ab0d500d596ff39bbb7427b33dbc0db9cef533f8e9f218cd6f667616d7fedb30a71fbdf0bec187cdbd05ef450012cef33a377ec43efda6bf96b03ff7cdc511ec4c7bfdaf8473daaedcff233b877edb5e04f4fb14a96b567f81380fdf68e75f659e72aacfc7caef3645829207bd72fdbfbe39fddcbf6f9e7cba66df0e7cf8f9ffb8c3d7f4d21ae68ac6d60bf691ba3f7ce9b5a8f1efe4843918ec137cb87f46cd131f8d656889d77637bfedcc56c866309eced6b36632ac0cb3ebf17836f4d7b1cd8337c679de9f931f8c6536e8fc1b73b1238f7546a7bb602be7efa8acc71369cf670ec6edb7ed3db9fe0dcca6fddfcacc34e902bdc6759f65c763ddc59dbb81ecfb834be76f6f8b807b5f13b363b2ff3b82efbf93303dad7ac6df8e3c7f86558ed955fd1ddd679f96797c99d759ea62dc60f43e7e5f7ce936155dad16517fe1b597b37367ef8d877715f97055a1840a1e053524143153b7a06e29654d040c58ea28d4314371c38c133044f121e1b541e102c8167042a1e1d18e808a209124d82d024094daae0d9c16343131a9ad8d024a7090a9ab0a049104d8a34d9695283264e980081873319028e6482c91349a8818914dbe31e0a93540dce24069209115f64e2c323c424cac61bf2303922c98e38e743082184dc7608bda32119188cd6bae6dd6831e3bd552ca1ca8e617edc9c8c11d5ea756af46b6623806daf09f56f6623803d576cd39e7ebd7aad4ef57dd922a041dc0c4282e336e461828a7167ca4e508c514a261f131c086594a83ae06cc035e176805043dd6102654412447670e2478a1c31d00952a73002172508eb63041f4b70705a33b46dc8b3a4044ce80d38271c5df2e550c1b9f07016280957a9fc7042e0a6929df9ef428993383779efcb494e7ff9e5f9798373e62d4629e529ce885a5fa9e54b2152ced3cb8c39fd469e73d2971a954ef927975149b5933a76f9432bcbca18a5749f93d208b89d975e15e799b3cb98e955b1cd17b3f9625786b52bc35ade302e6f1897ad682cd84a7c96083b2fcaa0294153825a3b3d3b3fab9d9e1d55041273a20c6a4120af00d20b708a3046d72f60942e7d523a69bd98bd974dce38639896699bcd0acb0a0b8bcbc832ca4e2d2ea4ec24c24a23166c25b3815d4b0e612d994ddca2f93e128d462ee38892fcbd79298dae7936b66bb9eae69c9ef5c59ec9f0399d7a66e3b2e52a9371b1fdcb5a6bb1b5d35a6bed75edbc927a2df80ad3bf191c6c094d724b9804476da4971434c76a7ac762e31ea7d1a6788cdc70b496d6d25adeb2c32585d6f218d9826a6df9a31d3952c9993a922247407214458e7eb6fcd9f1bd914f0b95969ca14172664e91335e69f51bc7b93aec2363a4c63d3dd2847db456cf96bfddc89956d0148dca0ac68072356a1919a9e81cb23db883fde56fc68ec5c69f7f9a76dfd354b5bea7a9ea1349b6d4542cad16950664f4c9196f51b5a85a542daa16558b6acb6f69d969e99133d567e7a7d1f691aa479eef32c487d15debc9815bffe85f4aabc1861b4ae290e9e76d9e328d98c1802135b9fdb55a5f8fe168765a298580f3b0fa83f3660b08b8100d9cbca2bce0c59a7caa4f38f6947306396f527b34b5a94ddd44b64771aaec1d59661fb39732ebdc3d9b73ceec33c5b08e524a69566badb566250f70f8edf5b1aecabf9645b55611e5558b0521d48600b8217168524425fbf9344585a0f32911137e0f1bdbf56b4fd036c0863c4f887872c3366dc8b3027aa2c3ce3b7f4dcecef8d64a6164ad354064fe48afdc305fa90e69073a825a2b0cccd50a980ff327c858f3d9b75f3b9a1a85583899d9d094d4ded5a2f6487bd214b771cc20a5c7811a2179c27c0d9058133fd7e82061606a82c41af9f505e6457b72e79a9c5db9c9324373349ff678f9a91d571570d52f19d39e54aaf96a8054296b726a7232cce3eb226a29fd4a95a7fa2b60bb3ef7951e3a49c3e655d3b373c639c3d400d9f5e94b97fd8a2e7fb4ddfd5247eab4aee693268a591ee3efa2bd3bd2de15e990f6b8ed24d28a6eb11da3385455138456fadbcbec543766390de791302be36c99a6b68da9e70a71d32ff6f3d3cf694c1ee3cf7ddb392238f96dd415b09ddfe434b407843c1c91ed5f1324d6e4faf8afafb96a72f6adb5d69a209100548b56441728a6383182c449122735f081131638e9c1c90f3e41f06939c98145e8684539420e24d8816489130fe8e072109cb4f2941c3750820f0e680f6a143e346c1f1e3e1ef001e243021f94cf0afe5df8c0204a8c3146771a0c84a5e0204c25ebc83700d9127f9ea3438f3f42fd90dd270dacf5f518190a711c75b7a7a9e7ac71dfe2ebdaeb25be0d9ff49338d51aabec53a5ee4a70de9cae71d43affe45a77207799d6bfd6e66cadb5567bb5de92119c77f7c809a77dd6329426edb3d66dd1a5dcdc7dfb39e7dc9e524ae9566badb56e9f2da675a51f0efb8ba25a2d956acf8f65df6abaf4c3ddb7d9679c7ffbfca74dbfccb85bfbbb35edc1b0b3cfda8361e3c7b167689fffa4e9547e9869fa45fbed5ff2e3d89b8641d336a29d556d23da72959a7f82576f86d56ec1fdcb4134842ebcac8a7345136eaa009aa6e7489afa79cc4449d394f5070861cc87923355a7aa00ced41740d39c9f298ae605707ed5997f80aae3348ee331f375e48ce3fc5075f6a4ef036acf71f47cc701def7362a57348a8c991f250a109014294173cea95dd3244a45705ed5c1d9b2eae4120efc8bf1575eb2c1fba494aa54f4fb6aad55a5b2d65aef64dc7beff5aeb482de2dada07777ab155551e5c5cf7bb1571c9c71cdf793dfe06430d88864127266fe2a4af4eebdf7ded19e5aae30952c6964c9713514f2591dca4099bbebef7861213ffe1a195fbb7ede484a7078d7520e9438659fd8ae1f23c7494d52e2ce78a1b59a1ee1eeeeeeeeeefee21e1f4677776badb536eacbb752bacf3929a5b4d65aabb5d65abb5a499444b55a2a15eb0698db88a0b56eb11c3274ee5fdee36648317c051823bf763052c830606c9a824c41ceac006902006324eca971b3b5da80ac26b8e503d8f2efcf4e343319d586ffefecda9331df69eb092440111445129430458a299640858a2a68959b1c34d4a063078f0ee0f4b0c1c70d1e80325246d4f5035046be8c58718032f229853b3246becffd2101499103684953909ca2a9ea87a4add85202025484c8a1870f40e083204ae88cf489eb53c4490df7868534825e3a299d1758c2238a0e537c504c8043115236a9090edfc018f96736b39ad130790cb4198d2ca3d909fb0ccbfe043933184e7867303c667eaed6de4a5714c18532ecc68c86d41e7bad6afa42194c5f2863b353b4d763ae6c6218e753489ae063d9c914259e9834cdc734969de65368820f319c9de68432f9ca301af3f1b3003d067ece4e1662188661515e0dfb0b65e6631846acfda6219499afbdccc07163dac3c0ceb4260d81b3815fd84a3d1cdbf52a2743173c45a436e4b1c10d3c36d061e3d5f6048599e0728850f2435c96b6db5650c629cd22545c516547b955906f5fc3bdddd96d1888f3387cc1eb76de04c2df6a8fe6d812ca9bedd57f51c1fefdab6ddcb72adced59b8a916b56a15194ae80e8b28e2676f4964114e8a506d12bdd9f186460bcc027767e8218c51cb1fe873525aaba5b55a7bef65efbd2e8c338c1046082394114a08238411c208658450c278619c338665127ec6b06c93f03d29448311fec6c9087f054af810c2168450056104123f18218c104628238412c2086184304219e10b18a5749f339c98a8f4aef416316434230008405000f315000028181089c442711c07233d51cb0714000b74843c665e38160a645912e4288c72c618030831040018002033525204024a0fb26ff31005c52a52c7c6129641a4167a760829f59b097c1aa303e9c32e4eb8b70d0c1f652190fad9bc65158f793218028d3524abd44b89aa71851961c7f72a48fc32793b24e27f71aa49c6a7412eeb6b67b195cbd9aa95d7131096ee4c58f690b46a6555470f2f7b574d22147e606f9a49b682848b01ac5651112fdab225e2dcd080b04a74cbf14b23341acac8238489de505abf07dc8594a0c4100c28c988a302205fd66a6bc4a2080ca341e77e2e381021bdb26a299d5eb5aac7ce33a665649969c091aa18f31072f18b28e475aff9f8ee6df002fb41ad13d470d26b8b4ad01a01589b717736e79ecc16a3155fc361aea986e4fa607677a9fa290aa4e4108c0a5f33c793b9a9a670bde4dd3dac93ee7e0af4b9efdbe47b7ce7fd91bc844659c449940925e1ad02014f8ce1615551955ef6f5bc996043a3435a8fcd9dc318732c8dc72036bf24990c2a262857169759a097f1388923cfb0412b14f868d83b98b24f0b2bc4c31cee0af6d33f5501b62cec77b10983496ed92b2b04794f9dd7df3a9f5b10ccd425874335b34a3d44a4c6ba28598584923572e07bd9382800547c905b6d26f82659cd5aa30c19a0d934f1557975affad16e048e926295fd3d708bf95794c4d0180f899faa1ab7453d9de2050ff8ad9af0b2ab8b3300f9f63a563e8bb7414397ef1ecefde805bb7f12a182828d5a791a5e7ba8282aaa1dab74e4e53b92bb98d4a324491a9618b53fcbf455e871baf103e213081beb4739bfa328f3be2be3625effce213ba3ae9ec8a5a9b46e46ca3a390a6d243952f9567e418dd3f8c2970ee9c429a73f09885c865a2d07709308d311ad1c9156c1dc5343298709b3eca2055014ab8dd3e6a802c5c5a8629b945da2656a8ff73fc066b942494b640de573eded4c3e8db031600fc290782461242e5ed64221f596c229e4572d5e07fa6a6398568cc9d1ccfda61993281f40890aa90a04b873874b120dc647200255154aaaf43912b31e9465542655a2c5292f60201e30482625f90d4ec6cd3bcdb5e138ae242db698e57f4533a3d1d01b9b0d089e82692d57844caa82fe6d4cfbac0182471fa8e2d0acdf26a539896721e9c647004c7b9f437b287bd6e797a8e70e7ebd9ee527c3682859ff3be401c46f7892c317061048b25ff5b30dad1271176cded37669453544792017a755ac63105fcf2bc7e01b5a53ef930e31dee34797a3c424e0deb6d172bdaad6720dcdd4406d90468f3d1b0c40abe5a40ea418436af7344d28a3c12316063c7c35b04ab93a5da4a4e4c849d6529a9bd9588f77461c4a4bfc3a59afdbe8217d319311873c32ac2901e9080f37a8c58b226b0c25e1dee63f3736ef53fafc0ec2aea89e020b86c69066f4478386fe234860a604abe9fafb28c9eb5e9692fcb2cfd2e4cc32be58c62db8d10185978240ad81b4916a3b46e78e9ff247a7c66aaae074a705c6432379847b096a8aedbf84b2ee8291ca6567c8551c2ce223ed2f39838e5a05a9bb9fb330e46dcbfe6b2ec0598cad15f44f1c2f310f75c6f4d3080744b1d7d890beba1bc8aaf30631e45a9c589cda01b6400a44efc939461287020000d0ff8d6b242fb49a95be45dcea14f292bac3fe9e32186a3461e4f44e1a6ec53c4fdeba0c9114b743cd9a73c5a533aee61f2aacfd25fc53c428f77734ea63964f0da375fdd005fa6dafe674d085fbf861081d15a1502acf857a15a2579b0cedc7664b2b36e704e6b627f41fcd8f4b81a6a711d153ca0864c9dfb656bf801f64d2377b3924c49aab7609e528ce86e6351ad0ecf9e09b1ffec40d3d2442dddf53aa70dccf534694d043b86510d3eba07f050ca51aa1aad225df9fb226ab68f7d8fc8cdc71928bf2cb70e0f0328e1998889cf5e08d503a0abb78d882de15235dd0a9d8689a8855f376c772aa08eb7b76590f3433757586f2ff45338c49aa9958a7afe85ec5ddfaee6e08ebc9017eca7b7dc1b0a095c7a26b59a352f5293401122349168dda1595c6103ab60c4484dcb368bd7ba8b0552a3a47cb9ff049438bc611bcdcea1335e6b4e4caff5ccd17b568aefb0869e59e8b494711e52cdfff0a58e23a3440dae17fc682e6902f04720c8771c0367e2324706153d2ff039b4a19991abf8f660d3725402694ef35897e3dd150a5f3d4b14cdd5105f93870ad6aecdcfb302ad8818bb8d88fd68febab65c4655ff44d1db9d1768773164a8af32e10291e21a037a7742eda5391d57c529dc501696a05d0254a26565854bb10a1b12027a77cbf2cae87254c06b1e234ef2a53e18a07e59a2c44bc36a8bbb60d687a332ce1768ae2b3c798e143c4742fb44343c4cbb69aee6f110d567e25188a01b2b3989d5d757f809a1711f768344ebd76931abaa0282def5ce4978ea42283c88d72e49e82e0d390264cb337cd7cf50de7c49696adb3d1dcb941bde2bba1fa6a34b51bef4a6fc8636f68b0106baeaefa731845da77792da53bfa8b0939247290c97172a11dc78952780f8a0e6115d69fb6b76de0a72faa2681e66bba4c322930cdc4224d8e441fa729d18b9f639b5c1a2d0faa86911cf3787aa6c8ed935f1e332e720be1b11df6d06704726055a220a8c78b81bf0bc13a6f2db9c4050c4623e57fffce2a1c4a6d2c6fa80a911d5345eb80e45b740e4085977b44da459e759d82a8bcd0cc89d097ba951bbf772cd7e55f150643462c1af4a00145820b9cd1b526e091aebab53dd5c5e3c9bc3f7c5baf8d02c0b53ab09caa9049324f95dd69d1533a1b569deaca32dd5f6ad07b3e15135f0dcece52460ac0eb6c9dd791b2ab1d762efbb14346d0d26aa35e98646ca860bcd1bd226df5c72536b9bb05b2309926b37938d7ea7cb21f08a45841e772d83219e2c917444ba8b1b56bb72c521def17a0c03ac88a2c8739a0139db7e041ebcb843470b66f522824c5c81d3b4f80aede637a6e566fd1dcc73d21f49ada3db18e557452cf587f306c54ea9366de59d6e68802d771892eb626eb2d3086216d06ddfa32e254cb6db736deddda60f0d636facc4bd103c96d83ab9c6ac6b93c1583b533b654ee6cab3a4d1a0b4807da3252479ab4089ee41b26e1822a0ed20d34000688a8e0b46f7491096ba9f5349ee3c37dda3fac366e27ab78e349df32b96a4b2d6cf086694fffb90708dd138695f6a62de21be8f63540a8451b7adb0ff91fcba93e677838a4ddedb961a4d28a2d35b13d7561903249a80199d5d57626627da3da0636934eee2d7d26f9a6c24e256fae51b4a6c232e4c420a1acf3c13d84c86155f478aed8053608fb8efd1c8b3b5a10dd5e3f571ef4bc51b5f3e898447ae7d1f44a0a1e082b9accac17481a7834f4337881173dfa264070e726dc87ee3e1a5c907b91e0f4fb7985cc817d6488280b9f32a4553a3bed7e4263338975c0279e18c31f7d8c636e833bd980b7aa8c7e8a048b4ec6ada42c42f13a8a2048f2ffdb98e176f83aa98e60be9556e998e22c40e13429ea6a189e0594a3011ff03902ff80f0225729caf662a2100ddf1295513b5e9a5b97a4062ebb5b674a8280f6ea08724bb25575adbf898aa8afcc9263070c760317665b3c67071eacb2781c2782fff2bf74c4cd2d0896846705d37ed84ed44897584941fa86091e16acf12c2b369333a376b8659e19f8132a354ec10fdb4dd62dfc7d3d0a30b3c769fe2cd7552bf4dcd0832a989e534268438520a9e7bd167896f9e8e204658c78d3d8e464fef470025e04f96ccbc6c657e5fd521e5c7112fafed3247722ecbd17703654044e68e0d55f9cd0e544ab7b2a71757bc28214a110042704a0bfa0cc47f837a17c2b87a4d2b88d6dbffaae1dad17e5760173477807c0b752da75ed02f580cf10edd9f943e7c767dc627803b658ab4cc2cad0bf32fe22da5355d8e1f687fd96392a025ca95861c406c36d5bc5a9e79b61a2b2e0e582248c9f515b04e508f072b91604c9d51526dcb9781db9ce1520467a02f7adec128fcf71a519eb4f76c368c63a26dc333eb3de89a3726714f3fa09de19c1b47ef2b78d7026aef644c908944100cd7fd63337406f932ae0b2f4d6c0b5094d60ac77747a229a9ec5b5e4af31bf5bb2cf829aa7d7c2eac1161635b6ec1a5baaffd3ed5fb974085b6ce511b63ae8af4fad000069bffafd2080516ca2354f77442ba5609b080a418a8fdfd607bbe2d19f374437718f2403dbd963eb73545e80cb6f64ded27e98dd312fe7687064f2ae03843a9a9d6c7bf32944b565702eedbf56bce24bc3a6aaacbcf4fd48a1a94a8a75a8583c938f6bd5489d50ba89559b6867a308d09eb8334046e6692030718c9a38365857eacc31e934b6674c28950013b172a538e746e891e757189e2b100c4082ed4ac6e23fa71d7bd5d6e70f3a668081bd5163fb3054bda7cb4835205271f6ed74fe68d81156a4973e47612be9549c00be4f77df5da1e5799fd3a0d2a100a8a54d75e37332241000b2382c0f57a169af457212c0126810c6aa38fd5ff49b117b320d9eac9e7f50ae5adfef2d59109a7a06a2aad504388a9b89a6dcca95a2e29751ed70920fd699c197f6990a2dd9e69bb9f5fb10b3d487f1adeb32c09e3112f08d044c6dc295620d244a0891f9cb6ffa73da4d2304663d1da6de73f44c8695572f5bdbdeafc9f65a81813aafb12b2bb0ba059fe64c9302b2a73b62df1b66ac8590a24b7c780eac59e6fb8a3be0a0821090b7f894d137cf9444cf683ec9d0d936be9b36466fb7d3e075aaa5505206ff27de0cb7e93399b1ad73d00b959eb84a0fe6d4d784002c2a021d5e00dfab6a16d227b54984fb31358e85f82db0ba04c9bb1566e1581891f649387aaf729f2444a092aa266f4eb7744523cc188490ac2f60cd77a60a701d8ad69e48d02a8c3f2dd85190140260953161361d9261e8b278e2205fa1822ccbd604767473846dede918ba1c8581e3e6180a66a8e762c4dd39b9e551f4abbb1191830d99a14661bf96ded06fcbec815a2ea44b8c69749a69833ad38e0e60e78a5d2058183616dc7b38b037396d307206639a913d4c02a63182fe4d30cf8d61c5d8c388431ae958e81ee286b25376d92c16f3efab7ea615620bc86f912c857945bfa79552c1c7a85ef051f8237ab9d62c840da0a0955b5383a187d5fc649077e58a7db0c2f809e1a50e5d4644482714e35720a35742d4932421aa48c459e96fd07550ac462e88fa2fbdf967d0ec06cc6c8001d2000333d00c9854a1fee98d74f4745eee8f8a1b9a76b9da1211a391111f357f6cc83b0b23cce55d8a10dff585da7700e864a2250f782de28fa1a9a06b2a3c7ff846e50b2b55e133c797f85748a63220572d59a937b2d11febc82d83be41bf7df4eed36362d028f3c0396099693af663c9a9631836f8385118c107e117d89979dc7bf2586eec4d9b5d9a8e62c84140cf6102e6c1f2983b792cce044d45011ce723b30b2c03941e2480392ab83779e154bd051d0e6cc76c4d762b58eeab5ed2abd3f4dafcebf5f7c336a16da800d018f98b7a77fd11b3b278940ac77d31fafef9abd0091243e452b493a90f3b3ebff57379fc3ab90c639601c82de6ecaedd0018f280e472eaee2184055f91862b60288a83f01b9d5c62de5a5a39df7becf65ef22d8c7eae8283207cf2ea44daf48ef9d4280c25b6826037b5d8eb372f4310a327842e56a4a528038427a866cb40cfd8d8379f23f2b82c58721c84f727d0e60665d005604078ba2d2959fcb5a52e088f51681b99d448dc76f19793905620861745efdec4c6921f4b937620845572f71c4982f01b74cd4da5b9f7f4cdb886c2b06e64e6182c9957152487df34051700d5dc6b4a66b682db38ec104ccca4a43c6b3b15d806e1274170e8efd37759c50068c900e1b26a8cb560f234a1d9b02426201a919432b433530fa1ebee691e90968729ba0672660d8ddb20206d8f69ccdaa3dddabab3292e5e1922fc8a05bb357637035cbc3b05782b17b9b5ece66648781f4e116be06db3103e1a774deac45458ae2d3afc14cc8ef36d7b0d4b73dcd6b2c12489a462d60aecafb3739bf7b4e74891ce12d1615804eb173c23675ba1dcb7052729569b911210854db4c18ef98bee94006df19910cd827db853129de3d9011984a3e48d118ab53f8d9210cc2cc8448c12aaca6cb724d482ebca52a66af850f52abbd8ea9935587d4c6040972647c0458114f9c1266b9eeb454be9aa45a4efd904f1bf3c7fa5787b60a811b77d00d7d12f38f1532495dd4ae492d0852530cb3dff9391110309e41d634fb704653da024d943890143d5bf38745d0a0f2c17740affc7ddd6685e7609230c94dec449df0314eb946c3b25ced9bbbc13613725a1d15892c72430d9429c072c2d41e1d9752ff51e6b52d14e6c92ced94534ef2a6afce340f895a756bb26fe0e7fdb975488a5de45800acc5df04cb638e22f83ad5a8266533d8f23ad3d4483f78d0702f5c8aa822ab36d60bf3d5c263b8c28c4487c12f08f12a05ea002f74410b566965f78b2d2eb656167508eac36973ff4376f3443141f6af5e2af036857dcc777c237178ae6b4bd79fa6b8164c1fab30863a86706e2863be0441b97defc1fa0332ad65cdc73714e053d6b517cbea1b67a010d84cd5c826f96da4b4e0ab7b9f544dbf15f0148bbb23e1ee5cc579bf565b6501896a7555048d4be4c631ad9cd4b08998c111d8ae06a5465c93a02686d47ec12410befa1a606b2a7ca7b5d02cc53c070f1270c4df9e0b8630c000087275013ff921f25da43e548dbba9f18b6598eac959ce8f09b0ecfdf5aa2bedcfaabc8a57f82b3789be9a13b3406dd3dbc6784f4723ee79ee90730d40c0fca0251b1dd1c940138bf40864bfc80c88ef9853dbed7c1f782fdd47b5dea362f357b48f4e9419e1145a2fece1dd1c46bd4f6e0eecd0d1598e4c834f6e75cc9188ef73350b4514267573987f826624b6620587fd01d4cd464b76e7851a955c39ba04d66657678b032cc163f376ae032c067c09b0224d9b75913dd25387770b27d02b01dc050a817cf0260a5ae1b56d03beb878eee27d543c3ca0b11033fb93cdb0081faf47a10108e9fd81fd695184c8da8c74f44a54083f8b44a4347f76e5366c46cf99b88df242ac3eafebc28963fc0c7215a3d56978f72289094fbcf08ad5522ecd24f1fd4ad10bb9c61f929284bdde2aeee2b3611c4b94ebbaa1e1109dcc828050c063bb703465f60d21bca09dd602eb2bc949cce91597e08954146af5a7493d28fd609a182c44105a241723e6e294d0ffd9e21de85de6e2f69d98133689226993fbe95f092caf7260791c9c9c5abdb7d8cb27f272e8b2ff979404d2074b933717a5dbdaf92a5d3004defd1764e185a4751716163a2d28f97540326736bfe75f42996baf022d2f97f2821c74ed606f7e1e8f7490dac3c97b4af0005531dc2d6962b101107edd002f569b18b1f5ffd6d5231604aac5537c6b2ea95c8ed225bac9856ed4b322532865eda24cbc54c8da3d5fbfb22ef55f4f0b91972a36a254f35824afa71bde8fcaa31204d5ca1c042145ea80f94f672ef0cd03a0d2519120d478eec0bece3e0be70fb9827165434df52d30caff62c09270f20c5cab62014400fcd452ba4a25e1cd4a70a906896829363fe94180f4a85db6db5fe8ab70eecb293211ba4a2f71481f3bbd1b1c29b3e8c1ebe8cf234a7a5abb9ec50abe5959ea61c26858c7660fffd3c44b20160e9618f7b2d223d0210ba00cc1597cfb5d30ba7a9ae306eba9c49568b804b94c51b5b122eebe096df12a40b804caf6fddc0854e491a9a55922848217f64ab69bd17344194efdc28e721a0e489538ffe10bfdf56b6f225bcdc232aad28ec8cecc6c65bcea4a3cb65a7bdb032e308e68acb7e843eefb5e4c8317d57fefc74d9cb14fcabd28f87755c437b5307f2a90040253cdcbfb0624b0c32d4dead087e6fa1f3f435166921c27d009791567453d1523915eb00e848b6aff2f95f0b792e86e13f25557809f95ee967b4509d05a32c3b05eb8c6b93edee1d31c225cb61d20200944693700affd2488c8c0236d93753bf065f554f6653580ce98f14f7ccd2c1290718fcaeb7b437c92dab3732ab8efdc3ea1cb36a1bc0f9b80d30ad8f195e21ce392d64bd6d6d6b283d66dea53fac9ebd7cae1df4de4e66b0c5aa7a9a23b873de2a9ef454a877811bc9dc233f864ae5f803aa1ef3aa7820b558d61f9624b9020ddca42cb64e4a78fc86d5d2b5e29c591770bfd5e666e5dedffddadd7ff76ab798175e458b7fc65a6a97cedcfbeb2b372f6fdc0fa78b7593623a69b928443a7d192879fa4249ca2716af3821506ccc7f0d30f1f04e8d750758782eb8fe089f9c755a76bb4163ac004efd1f7931c266fcd955cc69b803c94704f2a5718993c30b8c256ac0d888aed4ad1ff65b20393021868d29893eebdb64c0fcc5fcad103cfae82cc67201d87ded7bb22f342cf46a32ad3240722a22998b7cf554d82d0bc46028f24d50c8c07455ab83cefe6323e72191c8189f071e49dff1384f9c1711b9eaf100f855640fd20d89cb7a749f5800c6d9d054bde08949bea986fcecb0718dcb5137c26c4afd9f53f931b4ee926df6d07b8c1285a528298065985542ab58fc61d7d6090fbd85aa4bd4f91b0a22f4301e7198f2519b93eebeb1e5f78fec487500f1a119e8bd528ff4fae43b74312053d08ca89393421bdc69e128ea3489de02e925eec72ba99ae1c2a8152c9d0b6473020d0433aed9858b3c9744b3a4673b588ce581e60420bbe01506ccc0bab957e9972efcc971a7770c097c3d94315dd1620d1f4fc90664a825fbafbea5a41ae01039b19f7caf8c209e361062b065c616e712c1784871ab89ad0573604b9904022f5407e2b7d95bba7cc618b16ec7c88c1923371f7a79aae5a97549e450d294e2cf884a8a64ad66f7ec14ea1a26bc5d80fcc956aee7da79fd98410271676ec73e286e807d38ed751a85775620b91005ae24e1c2f972e518f6b06a9335d34e609888ce5110512b3c947d998587fbbe26a09d790f5a14c8346cd18ca84214d9e9d344ccece551c2715b32a74a9913736af301546e4bcc3623e335e1a7ff4700784eb4ebb8116c3bafc0aae7d8d2ef65653e3458d7c28363505c83750d4854942938b4b975506561dfa14a22ec78eeae7ed29f29d3e090758e72654193ba3134eb8efe28e8362880a8a5b19a9f2fa940c6e12bc60d1599f1920f68e3ba593cae35f8af04ae8bd6144eb96e379f77f28f3c9944bd14f5a1dc455d7233b078acd08834b7bb43fe9d04d996aaa9990f8f1abfe02ff8c084682d4e9be9b98862ae012f5fb57f1be18e2b3642dd209210c982fd766392433d2261dd97efa322b16c87488799635a588b68ea8d18d628d1bae7330d036dd752a4dc2a32c3ad952f7347493a86b6adb2fa50f8604dcaf3bc1170c9834797434646a4490a2bfd45cb0d2e07e01e27e7121b1a2c34a8368f3f0b4b1107c2b1f7daf47da6bbe1cece8700f41998202c44d0d7d6b2c4b1812a6f6cd668858a0a0388f312b36c3ba3389e956cf6b11bcea56102d66bacf005eaf1d38ef70d07c4410fe02b465f1770359ad87180e35c1336f2583156cb4d6e57eab6b6b7eaf2c4dffb686a894138c6bee98f13afc01f91678e585a9e6c66e367ab0cfc7d0f9604a806fd398e3dc82734589e39204214e1100c6bd086b3f76b0cd29faafb9a470b411ba3fc9adbd7dc739279fb8cefba04eb21dc21ad4d077ed82f4ad15f7086790804e8b5f12d0124f2fb2a8a899c94ffd93c70b23390ded32cd4af671a640ed4c7d4471ea05d3a7d29904b3b3f02d0ec1a3e368fcd9035bd680b0bd4af07129031127e2c98f07102fe079c36f01a22b8448ad14a6832dbbac712626b9e87c94051cfe1b40babf86dda69e1511be9c9f77eec9a8655cc8056d795bbac52cab2b69911d617da5d349125eac5caf47b6cb9b7005c2a48d354b8cff822d9432fdd265f47988f6b3c6fa02af7d60785fff4485677d197bc20e0f0d82c09c054581cb05a46f25221fc72d2737eb9ffb46340ab57ed34496cba1292debbae033fe4d7cb8627ce9bbd1b03cf9b960d18c653357914aa0d39c18203016e6854b5e693ddbad2e8c737804702bf2d1f8c98f172285bdf0fa89833381933849b2263c89cf176adf0ec71d4938cb405bb0ceddd957f7d6f6270467557f85770710fa6897240ac57a6547212dabc428b98d5c5a2b0d51ffbe73bd85ef21d0b2aa08be794a6e5fea92f2fc1a65d1439fe6ba9df9cfb7b940c321ebce5f133e0e49ebfea38642ddf7ffffa158477ab77b9b559a00b8ddc95335f029905fbfd46496c328d8b4167ea7a342e56d59292d920fa59d2b3bbf23003fdb3772a5ec876e18f50750608337bf76ba6ca4b3343acbef9d9f5c5142778e238d313f10a3226590bad79117e87362c2e3a2148e759a0a7e7bf69bd8b94ca6ba99a4c1cabf71d4e0c5f746e28985a73684e8841b88e63127f2526cde6aa48833698c32d93caa81b8a0b48c984e661bc0fad49e0dbe8259cbaefe9d21088b68e3dec4d0e7504248ad4fb644e982d28536dbc893251f9df51269538ab823364ce94d926541b8c7f4f37f9322d32ffb48bb85c736d3dbde61552bef78ae184dc58d93c3ca05a60dbfabc867a52edc5536a0973f0236fa4615cc1aae4e99f21bc290b7753e41a8e9b5bad2082a8bca5a0030b39b884489826bc86dd1f0fcda645144fef8e34f96074304ab79fc3e5e30cca633b1364ab228caa9eccc939101a5dae09825e46ee7cdeb2bf4132d51ee7b0a6c1a92a49098e0ec0003fd1b2cbaf0415304a5b71b68998dfa6ca71606269c57069e712e3b83a303e74d258d68aca3e5f412cad7a77125a1abeec67ac8ddcf1fcc3274bf348535cd071c0e26069be7269e1588f0302b72f4686d1ffc6bbcc397f96811a66d501f8cccb9d2d997ae77da1c3647fe6380422446a5c6d6003860e77df59e5de2a2a7a5fe4ee8c9ee13781d2a72971ca401ec7c57868376734f79933aec69da879669255d1f1920a0861a953c189c694cc1dc0a73a272d5e011524353469464343623433bb5c983af3baaf903ddfa3614cf6e425e5875de7eb0a364ff2319bed24671cec426435599067eaeb988672d42f643110204aa5a560d9214a382c31774ebbcd5b29efe4b4d9c2042495b030262f9f102cfb7ecef5604309af2c8c0daac9e964b1a0c54aded50b45e8633a58140607d7e4160e608cda8121583042405d341c0a24d74f9880ab568007c86e8bdc051c894cd9246a2e53623eb24020472148f7c5459c958ed31fbd2f2cd606a9151f8d939f6ba7d44c97e493b5ba11ab376c28d76d8c9f2c5c4cb4c95627558f7cb1c28c201ee85bf8f3817f92eadb31e88b0c0adba73cea3bb297e88bd08e06c4620a519c9380faa36fe0165289c6f91750fbd1d7898c31de732f7325d5a8c67d2989be04017bb1412ec0b383246de0a4ccdc7a08056a7005a6c54ef81a1a7e0bb81223a95e286ebe800e8baafb7db238041b242bae7cb224627c2a7dffadecb1687c8a3d23caffcab9955bba215ba885edafe6e52711da7dbf277dd3e9e1df17c8dc6bd6a3c8bb53a73413841778418e46a2483dad34fb82431ef82fae5e53f3e24be16462f1d6951f11d748f956aa314be919804ca901fc7488b81c5bcf824fbaef8b800af471d18e8843118880eedfcba05d802522ce963cb014b028823757445c4b78c96190fd6b8577892adf26b04df765299f88b8189b1c654b775b415af957943770a51d45d8e7f86880768d88c38e3fd62aad231e3668c01c9a9fd385d9105e5bb0873167367e5eba83d38818b2782c019646b01de663c6e6a30d7500389cfa24c799e03bc41adcbda9e23e49392021bb0da1527a81842af6c13e7c5e66a8fc197cf6f163b3359ee9b3b57bc6ac3cd62a11d47e9e29fd4e8a382313de6ce919ed219471347fbfdadb1a00fed5645bc06db12dc00b8c5b33d8127be55810b534944fdb8dd0f3fa41bedd0c6dabc28ff264e2322be798c9095901fbd56357c91359538d60bb1d6066f3dca8d4b99e1d9abb46b26e4e701a15c9c102ffe6702731a1c97999b42d90ba21c4dc62db8e8629acfe92acae31688cba2401057fb5204a5b63b0ec5d95f0297a00bbd46443bbc7349f53418d67422c93b38e0682e8488a1d138ff3cb8486a1d033b9e5fa91f256658801cd3b50e041291bbf86c9742f1d4b0d2edb5b3d09ec8bfe7dc9b0e498a753c61e59810bb46447d8c6fb93ffbbddef30e6a78a6b619fa4233eda2327653346d774f20034f393c48b5e4061b5398b38e9aeb68913e9028773300708fef6be0d99085aca88114cff058b95e832ae692aa866747e364a2aaf4a1249159a92c43c6a89332b078e127e91caab39036f9a1ea1d0aafa4d2b948509fdd4c730a7828f2e5e08e32cc939bd9ac701299b63986cfb9709edd8ae8705cfa86b56b323180b4716d8776abb466fc335c4fa68d3cde51c6ac4d362383d3322f460e27a1d1d69ccb9834a818ba0c6c100157f0cfb7e5755974020140439fde125b24faf32806672e62c6b62e0ad27b7548e8f665f3808748aac43d7a0dfa61ce038a9c251b8b05baa91605e7341a7226d439943d064dc126b19624d6ce9a1656ea105d977da578b7bb044a0c42067034eca3b15beead9b3e46ea5bd764ac1274be17cd37f49b321c9482026f56d0f317aa372fe2f4c13d4530a6dfe20bcca2ace8280d014a9a00a336eb5380985274bb670ff9b26a166cac38b8a5db56cf4ffe40b04ed1e606b7fbb12a2f8dc295e1880de7ed194448a47bbadca81ba6f89651cb1dd0c18f579cde89d409f058ebe13921b54ec01964361832aa05892726ab6e222c393741ad44ea277f5a16c835f4ff9fd81b3cd663034c140d21641cd4477fd7670094a33b213673525f3e5e1b2a396d6d7025955d9d7cf7a1c46cf932f95650d9ddab61a753404374184f509fd3d21d76af4796a843e08fea7efe338627bb7589f54489f073d809a04c11b96f3c3bd0a2539523181e441d5c5bcdb5e9be880d619027b348181a7f2ea136aceace3f42d1d5262066fcd84ec7102af33b154dd8ea0552a544919d06548800614303722e0ed6908404d988f918581f8a9f5aacdd5a7db420be0a07e76aa4d04e3b29be1bd4abad30a24fb6711c5c58a125863371a1bda9b10420ed438c6ae2b10679d390835da6d1f5ccc26cc65517957a826a9a412e149e8a6d82a59b0eb2b58b9331cb53717188d82f4f0b6136004a8dde0674a681596369a166b7071b1833cdd5630e1f10071f1b0ab553d2a9ca1072dfa78b78a53fccbf8723d27c40a8b9c12de5cf61235cf1402aad6d593789919808aa976135438bc5ee20ea969a5e2fb00402259c4ab4e4291281330e12742d3eccbecd8d173e93cfed6065e18748bf6518c3b62710518fe337d2e0d5dba32650b4283ccbad3d2126f0f771f9c80dbd196c4cc7d34e418d9f4ad843c7839a7f244a16851ec141f57beb9941b3d49270cb9a0a796b53c3597ce14e67fb8b484b7cc8e4f11241ce89f343ec72184a22a061007ae7f0f8011872d294d7ec4c387d189b478852b75e5497338bc70683d368f8aceabfcd960189ae423b3ca499f4e8f17a295d2ea60c24b41c5c56c2eb360881b9798bb0a6c0a8c874ee23b67b04a0b0bcc8243dfb00661d1deddf77b630f9804d142ff28f0865629409f8b7961efd53bd951cf8b49281532897eedfb7bf1579b6dea3d88c273039bbf68427bd9140da1939c592ceced814c5606e7869e3d058616728932d133ccffafdc35dc178a7ee7d8659068450747375a97ee6f24d113ad29592dfeddf86b39ca8bc067b23cb9f170072ccbfdc215472700b229da5b971f97561ebdd34b70f5205d837c213cf81594a3e830eb4ddb44258a9efb08630b42cd70076456638df1aef13e2b3b9576b5d23ea9ed577f4403940f6ed78489d460d494bff7d805351302fec5b2c93feb71b5385105c620a8a877106a1a34a401cab23eec0f73c6b9c9674982d831475d75fb7185137ca56db570e91a23fe63021f752c8ea91ea05af5865be634e48bdba621b0ded3e95d0171f4a4156fc44ab7a8da9b6a74d538c0a42cd3f8b4be5e71b5abe71bc763772af68f0d89e3fb06917b3d381b56ffe6b8b59725ec13db750736446a673dd7b5b816add283e683d2d5aaf72b529752af5d180005af528460fbe5996886b429b96a1706c37c23f8e7e4e4cfc8ca6863cd8f90d599ec3a842b2d788ecae09105d51d8eb19e35644e5333dd0febe6b7798c4c8e83a4bede8985b82ae506e074ae2a99364e255b32a8b76f69bdbe8be45870f4609cbf44b01a3309ca5a0ed806df80919997fec8cc7e10ec24b8573a799a5f8e11e64709ebea588f168286e775d180da985a90b80adcf96314508ce2baaa3fadb0a3b4380be4903840b34f86c34074b9ee93ea6481e21b48baf4bae9f06cd880c5a4ea19b894fad881ccc9c77360d7d7f41495e258f5bdb8b47b4ca7be49f1108f9495451a6f6e4333c74824303546029aad0cac06259ceb515ff4c337e4735b23dc49495cd72b07a720bc9ee1ed9a30e72b863b31fde5b3f07802014f77420d57e0c94f35cec598bd50840a4fdb3ae9d6dcf7f20b734ebebcbe8cf4a178b852a4ba13cf2317b2e78314c5df5228adfb58d1f8c77d611fea88f435d2053d3890257ca2c7d2fbba8208ff357a3f7e9af7bbec0404dff2aea525c4353f274b8ea6c9aab55ad38e520dd9f211691d75a3d4ed4199af95dcdad71b5237ccb193648989059f18914e33f0a0be8eba90c4f2757fa312de0e23ba4c4d763f170379399a56c91826cb8ede09a0d8b8432ff4c729d02054cdf7fe43ba1491f0e69c14721139fba1748b9306441cb0a460e19124a7c5b0facb4f51997e07ead4f910528a48f0f12a6126300aa399aa55acc0e3809406e07d49bbe1bd843723b832d858e2c4bd1c1ac8fdb019175beb2f3258ea4ab2c81dfb3772b2a2fe900b598d2b7155d990d0c75799aad07955e99498fa1d418583fc96ff835d0fc6929fa26a34dd7cfeb8cd1ab5b335d11eef2b3769f71910d192e5f68a98795499113e8f7889086ca7cbcb11c1a3265f17c398ceb875329578cbf9945f1dc097add07ddb5b4911a440ff964644eb121c0e3cd52ba61fd0d3ecb4b0a932c0b409ed763f8a059ba84a2864bf0b4147e0d129dfa43c020b39a75a284b91b9964ec29671f2c52ee362e022ca72d5c59bef1c061030ee9467da8bc502df12a8693347991eb858a30c4af8b81e0165bcd3c68b6f1148b1a0d3236cbdd6b94d006eb374cbf6e79c5153e26b7439b9cdcb745f2612134bf071773ea5dff1e924d001bdcda529b0c2c1acf3029c5458e99f9c3ec8749352356096116b9ffd40f849932da85db9e2fd7658094cc5e6243ddb8b23870c33a3a5fcb0cc1a38d87f4bedfd589138e75386d0c606d24b31719c24efca71f8706561d25ee2a9816fa9e3bf5f840089f28d0f4b9d5ffec21ffb2398b05096752bc668008c1bee773ed7802a728cd005b079975bc6c880779b2d9e5b07866c230fa5456479e759e7824dd3b3a800ae7660dd22bc8e1f382586084def18b1793525b25e1d5a1c135bba8d261fdc2b7dd64b889dbd98535027f2ce3b38e0f63a0da5d648e942f307cee69c6e47097ffc55a0f5c881b882dbb30bccf5fb4ecc23a2abc6357363058dea57daf5a2fa55c8136272eebf65dbb01230149b93f464aff75ec87782a8111d9bee29968241cbe372b8659e1869e7daa138da5febdfedbc1d671a2d453b33bb6741dca61efedce4ec03a8084afb8f173b44cd9ae039d3d63e50f425b57f638b5fb9d97250aa27e191f7df72120487ff03b2077101af818df6cb7b31854e1b202d27092d9d6eb20e887e7e7a7eb48836108e24e3e63a3908b079cccb5ff740ef7277a7eb987522c34f664f1c4e11ff3bc4d81533d818374ab1b44c57dd6ad8c275f91b11444bdb3c132fae189d9c330f578635f0cb495e4998e027c087cde784b1274523b96e399e93f88c171036c256602ee8c6006f4c7d15e30dad2411e5445331cec35e7cba5b407a250402b33712832971e68e858b2f6e034fd556b265ae91393676aa29d907774789f99d12bb4d2bdc2011ab94d37d2512c995663f33f5efd35b6dc0a2a0cedc5d18e1da84d2a40e97785b441b1731ea0c46708c135452384ef971f10670c8c4168cebc1614a7e298f62148de8d0783c10830dcffddb648885d827ba78a8e4efc7cee28beb417675f5041a49ec4904813e413b1589ae109e37faff011eee6bc62fbad10364d540284266a2d93ea0078c9f239e25db03d6e0049a933ab2e4078aacf7398613aa1c94318a5ec703b8f46aeae379def72680587401e27835074f19bb98448456ad1ab06475ac6ed8001ca050179b8af243880b7b1fb3b3ebe3bc7854a64106b6fe12856f3c51694c62d876636cefa4468bf7404cbca7fe7a85cf4d84e789572874f0e76fba17e67847ed34872c08a5a80043f50800f101e0f245777a17844f149a0fbed9b9cc23c3db748271874e914641c56d638b581d0940b263dc7ed0b437a72957f18672f068defceffd7b6242ebcd88da519f6ef95f92478617ab8f8ce9bacfd7676bd162635081363bbeb77c3f1ce9960286d3646e0deffe6e25bb8bfd1a9284aedbfa50a46f685609e6e764941cc392fbeb211486ed7799f710c7f24a6861c4ecc81569ef333157754592552fc046d058639043c79ee8f0f16296255cb44b4a1f70af4cd807486cba7ab0840c9fc49cee22a6c8ef131b2a94f10394217ed47f7db7111c9c3747d036833489396843e3e63cd339310c68648e9831426cce349b36441e4bfb6a7073c37f34db2185c6bba62ef080114f440c53ea0cc281b61f004e88814ac9a17ec49fc55ab6d3d4cbdad2f9966b64c8ee161a8544b1b33c8449416201dc198982e0e5be95c8929c2ce99c58d6ebcd3c799721c448d3151d6f27a6f95ee3079deda31d4ebd9c4e1585ec0f83e8af7bc79a9d97ae768b002fae086961c9163f6f30ff5c2142b39c8b5ae32d5acea8880382cb64912fa018bb0ebf4c0096a58238fa6476c43bc2c31f9c4a770e2dd200f6bc024d1a073913d1f9bf8c236faa7443da4a612cda98818b03a35d17b8a01a6d7d11068e1a50dd3421867a74b8d64326d1e2bdbf11b8d6db0ceeea09d29051eff29d58a9d429d2f45415326faf2bb6e02fe8c2e19c1c3e9b478b0e2d7f2e2ba1d81012aea977604dd6036934e82f811219feb18d6ae27c25c2fc34cd1c7e71baca0d24f46a874255ecbb3db50cbef4cdb7b7fc530843bc57d1345ac90251bdaac2ea77568fcc47e68303b874252ec1c990900cde3bc720850379ad5535cb9285cec92b9207645c845138937fe7a358d1f3e8a8696b4d28a07cbafbc0089cdd7045142826d9dc188f986e15ae5bd7c5ca07d59a6772ee2ea26e2c682e0e071c32cd9ef3bd3dc0bf9a9f1e1fb161d7550f71ec215db333686074a4e44aabd1171ae2c3d64eb378a64a0480166f1c80134e0b2569887bac2f987b3e6d35e3db24c956c897a16948faa0804b3aefcebeecbea28264d628349d7e64c2ac5d52573140503288b33922385168595b6aa75ddccbbfd87444094b0df58b01f4bf19daaeac031333f029e6a117bf2d1938eafe830e412c25c3089f66be537d75d59caf940d48f3e37be478b7ee216f5041d3df7fe24be49944200e844b80a4d51e56eba536a085490d03ddff4d11c89a150d31c996b88207d7c92bceeccaaa4a33036c219655a5856fc00febb7fd0e248381397e8fa5d0b987608f9b4d85b5304402454eaa9f6764ec92d5ea60bef23249fdfbc5c547ef27d4d938947133f72841c78e446679489b85d8cbc1e8adf3ca97f81c13db337381d28b19f7b0dce3d4ba82c6d38aba5966436516157fa062ff4262e9b289901c107cfc6a24a9720bf273b1e066ecfacd141687233e7129de74f791776642ca35d5a8ea0cd5f5ab12dab65ae274266d8a12bbd306f58f41a6fd051af647c5b948306cd91b16938e455bf213f192843131e918cb24c8db842b282d4c5049082558102909be88850421c11c4161e8c5d84f9328323c7e760709bed8cdc2c0398509fb2f7459e8e1eeab349b803fbcf4f1c0717c9bbc72217aec4cd9bd76e0ccfe191813360d608f0e881423e9a31e55992b8b698853ebc9393e15f0294df3201cb679bdc4e53e7ac3aa7f08567c3ac91f3ac4afc2f92f8b05f2473813487505286556570566be918c8b3e510f302af8768a7ade3a90416533bec1b6ef0aea7e4e793faca480cd2b1c2d48df1e9950b40b541a906a76e6e8c650af9f6442a8357efaddf250987bfd79369f9bbe4bddac2872d1ba890d35b491788c6e6387807db1340969a2a63e6dc9761f899ea7c6a4895807cc0cf776818218fd1699372823795c2c62cffa00bf7cb9bd3e960ee3c8a506db9168c61be5fbbc5734d723aa370b87a4cd9aa70dea64c1224e21411352dc2da6311b241f4e2126eb09f0fb08831c95c7344fdbea0d92e2b10ffb4ca224859c23fab2cae73f8d06e51c719a256d41f7cbc5f54eae1743a4162328201f165441542a8167b50413bb5524ed7369651bf1632a14e42c43d820c4ce60d6af4766e79182334e137793d884f631cc9b7bd7464772380a64b2bfb2229f0327112f7069d4b2efa367e46ce918415bfb6499392e16470705997e6d3c78018cb202e7e553fb3655f27c4c88f108b73a7ca5712f91e9a7512d9c355a63280275bcdb23b612e75f23f3c108df1cc550b90af17de7e0a11931bee7a1259ecb0feec63f363886059fa125036818d3d87330afce1bc130ec037688943f6ef1d7fe8bbd775286093c363f1e7b883c3431487032a47087c9a24189c05305e2bd82ed2822d4b3aaed0749ddacee72f6543cde5d6eb114719bc7ad34bf1e660ee049df67823c0e727813798e945fe72634ec125d05d488006a581076f29e7054dfc2c9e3e7ee7ef417df6a2c44c028ba2dd86e043f6b351ea6a7fe1d9be9bdddf3653df4c1061a6ccaf0fa9117bdf90df13dea2a7dec10faac5557260e79bada4b4f4ce8d97eecefd4e17cb3ed93f1f5dfb73ac05c3aba8e1e7958e94b626d1857cc30f97d9df3b08e92317fd9b677499ee71fa260d8a75da37a3b2e6f97f28022b8183de8157e70a87dde49566a87e5730451b79807c0929f7ec4be26b67a0661cafff442b0736e61598027d903cebec94c35673c4cca6a7fb3cadfd8301be19ff6b3f58f64401c861e5c39b85992d5b2f73f60acfdabc4a9d9ea0c6e35150eb07705bb2c1fd45c2214ad9026e3a545585b2dcf05b36c18ff854f1c71398f1cdde247516a46692c9aaeaec44511caf4288508a5a7bf5013e57a34a1d6270dbd93966c110eea344dd4983e46bc366fadc566596cd8a0688c1213ed083da3ac4a9a25e11622e3600ecb4034441905722a3ba844fbed92c742258d1a25ae381b6c739e9f0e88c2692763bd48b359e705a81c20d395a5ba93efe23dac0dc89c5dedc215acb7c0102a0bfcad2624c08c97543d81706f0107fae1cdae3d275af27efce9f0517bc45ef23205d844db8ae2ae47ac2e4c5ccfd316ef7b54351e5810e3079ff30f71fc69aecfc4e2806c3f4d13853c75f63f34d4cb85120e168061c302d1733ba4e0adf4d391939d237f3b96cd5e3922c60495c23b55ddf76cf0d81ca6d3de49fe00a51299aeae1e3d159fdda0b2e429fd08ed6cbc97cc0a3748905e1c0a5ff0d729c490c92fe5f455579331a62a7bfcc229036d94e36234d4471079089be21eba48fbe4a929cb9647467c7b160d059a9d482d8a0bea7cf3dca9500e1222a480824f0a13cf1e545dd32b3112d1446a9095b614d125c83ffae8dcca04014ec76050c359410fac8645b6dc1851f6758d35e117dd331bcd79d360900d90e655142b7cfd985c3222cb141284e01a09f86d73342683a409bda0ba9269e144540a610d0596f16c0dc6095230c4d9a1061e72c5a780ad66cb4872a3d16eb3225bf3d5b0e6945f0ba387db650b4c1005f525fdbd70b75e412333392caf0462e4c3282bc669602139e5382765d3bd1a5ebad33db640d5f909b80189304ab5cbf5669e5debe6a4e8c8361dcb3dd03da5d0045a718de9db8aae2b3f1582125cb16cbbdc460bac4b86f2478d501532b46b7819cddd21e28d7bb4f7479173cb64776aa9c3c95e089bab0fe91e0504f16dda0510d5a611b24f708858db36209c5184d645330435ef0c46e857431c7426517ec7bb26f92bf5bd3f4366161a94066a10988642722943be8b64badcaa8a5b0de3989dcdf95ddcbf5af31079e21fbaa55b4bdae18bfdc87b952970dc78566acd5a9ab2f31e9a9ad2dfc02eb963aa9a504efbf15c692bd8ecb57d445ed82621afe4a9847f81e97a7307a9fc7449b11535225f9fb52174c762a3f988dab50c21abe161603cdca77e210afcc18840c58e6af57560afe56fa5ff82239ee6f5ad8ff917165b9f6767c316da8aee2de7289083191e27a5637c9ae634f89009c00974c2a9337b234932b850b4ddeaddc2596845db459f2b1d2e97e1e6ba67fb5136a1dc5dbcd100b5c88423c39183413a82a33e28e67ced040c67353206176c69a2391eaf548f742d486470ee641c5965917a90c7ffdd623940a2984f7f28617f01392b3495e96dfe86b0405a6e7fb7708e5901d2e80b9346250568e0aeeab8b798b2b3712d7f4247581c5b1ecc3c9da5e6ba81115d64e59073fb0617005136f891cf102a0fca13030834054c72da860785678671bb73f8606efd075276d3f11326178d91f452a28eb4174a149a535357882741efa7d505909616e33f4f321a377d5036907a002786e7ced04517e9f197705741089c49c94af0f563660365d4f9c13984a918374369f8da3152acba4c34b5ef212b6c9dc5b12f41182984f1dbd3d476fd892e22f2804e409a3ce2a85d221970fb6fef568836fae7d94d8b9cfecc6291630e86236e73b59091e0c60c8524f648e84d47cb71709aea3a3e7eb6f864bc1a4dc66263b967a0f19d2a7f4b611c09a4f27e0e11749c6f015118957e97751fcc02670da51685e77a4b6dd323bdf1936c74ac00498e75b4dbc1000dc1fe307b36c6b15ba78ae3e82b44119810ef7319107ab4b1b349bbb77c3aef97609d2281c8b9523fce8977f0b5a58185987211d7c194db899f90f06906b5b9e48e61c9ede82b42f8f275b8d82c13ff952fbdff1427dd42b4eae443e8f46999d7c2d7760d819af6942527305989c0d73697c237e1a448d0073f9953a8c9cbaa93e5cfd40452cee147b30bceb5ef32a04e916d853293cbd9803f95abc5378e88a82261912760d0ec1827b33c24604bc641c1e78184215fd421e0b37fbc5f63d89f4e86cac5c19f3eae10ca7c7c247c52b9fde76ee5cee746ddddbf7b55b73e772ab7fdddabddfabb53bbede35ee54c601ef55592de8f9e8a8ec07adb62a7ca9c790fa0b79c62cd7e255b3e8cbf7a44b1a53afa0015b26ae18a72078fe92aa2a662e4f114f12f72bd83e636605ee838ef1995596f2511e9b2c1209f3ca9b1575bd229f9d122fb30e771c8d2962edd312a824f3e675acb36fd61bc5148cc6520d951567964f56a411d9975cd047646caddeea013c331217b03603c7de462df48db56474a5aa7780ae4d87aec86c4acb6a6ad569de1407ef6d53d0830e9e2dca9e7e07064f64a221c7826470afcadaed0ab7f9338277099e4ac0f0c3b5e33996b149cf7084a3548cae07989fa2a88eb42967b40e855626394fc44a9d8108cc9092aede8f1d3050e29f08ba948d78d2d30374c8cc2d14d93b3df864211cf6956732869f0ac90eae07ffbde507668507e90f0cd5fc11d99f4049595d5baf08ebde40721460ec0f3504d54a78ca1b9be34c87de15615dd672cd98c331a29b96212bf40ace35475153ab4c0f30a387eaa3dbfeca90905b11e1ed2ce378ea064f66d2e07b388e50a89663937357d8e7102dbfffed4d4288a5aa3b8f30faa5959aadade8f9a6346cfa1739149191e16734fe8c218feae9bd2b0661d8f26cb61cfd4ed2fc2c7502e1e8c132b82cca63d4a1c1ab53f004b63926423a07ae0a53d1ac93cf084ea7224339787e40c0d4fc6a28ac57e62f2228927258d7a1c04af2421ed6cf6c2f5ad080efb7d1f4e638a9d80b55d6e67803bf09381417951c2a828769456c2cb1a75412203861f2ef6dbd8dfa7a8943b1f388083465e7fd4a64188ac3ba09b226ad1462502f4697631eaa57731075a4e4b52b2782aba85bb20886499380717a138f1fa05b88a889af1c405cc1bc747ad6dbddfadd49a5abed4a9451607c4862f80b3648568c198a09f756bf511949d5248c1fae18933029e10bc931836282b1b705a5b8c162b463b591e57cd8261ee6407db05f367d3b481e8dee7001abf4b2017c9c1c9ac4fd8c75afc9ccff1ae7f8da0fc9f9ab034e37a801df561906f5e55578e49c277b96d1707744c0f7a4086c8047d8e5025fb24d716d913a7a59159dbb6e8be2f7f23aa03890047a6fe99642c4a608e63164711c53ef28b3a25c5a39d265c3a773a01a4a007cc042632dc0508efc35d983d18b792d145f08acf6efc77170360e75346ef89ba078a1fc8374e296d7f7e85b142e6dff48e61b88ef64a6a3bf738b51242e4c3e020ea58c8d1c83f9aa8f1fb25d06b136f8f686dc44838273807ebe0e578a3bf17f4eed460babb1770504ba0aa641dc55c7bbeb216138b942c309aa3c99a6e32bb866a3e3620d8e098ac1f0973942ee32cd1cbbd25ad43ff15d497ae8cfaeb7452edd0ee950a85819774d438ad946fccce8f5a1d45a61328a86d4ac581b5ad7bc75636c2b3d51edced7c85ccabbd92ce3c554752787d501aa79282007569dec6e28392522883137f783088ab26bad1d7232633a1bfefb9907ac848d6aa548dcf7ea3e9243d6853a3f605ad37a770eed6829e5212e29380d8f42226d938a3b13f0d91863ce9194ca0a1783388b4b102502c01834fe8dd20d85e85420ef650d42db3e5ec20b50ebad3556388435a749f87866b00f8b12641e12448a4cb8693401ad73db433bd79a8aebbec67c46836ebc95e8ca45449a68508cff2d6341230302fd5c50e58ca614a82b2045b4089ea87434f27e4bd8f49a89498ab521af26eab698e02f55b36cf4c89608e0208747837ab67db7d24f6722da811988604f3531192a0a3ce7c0c99a684cd8aff3dbd18bd53d2f9c445fb0d53bc6686e9d6049cdb21cb63caaf6fac0760617ea1bd4f4c9194f53dce55b57d761ef480f20576f860f1353be015789497eea029ff216d138c80c008687b4bf8ed111625b82e0beaf94f3c35c92092c8134a27d56380d210c7435875104d812b89239a10c39bda5189f4df9b9a618ec46c8641921bb9aefa6c6a644679d4070c155714766b83a833609c0d0a1a509c25ff7c32ff2c204154ed608ad9152c31a2fc818217d071a21ed07e4040100d0ffcdd52e59124296ebbd049183e41a1eb9ecc516ca1e7fba3e2b44553c0cab712cf9f8648e81e367cc9ff85a19eb8aa63c16a93c77bbaeb2a421b7797d84e9566c6e550bc623fd9d4ccd4eaa25706d9b5dd13eba96ea19416ec10e91bd9711c902aa237824b3af34e9a5166d1be81611cb573e7b2b7371103c3f44606f10559bcefb3dc66258dea7ebfbbe9cc2e404f648252df6df1f2ae5a94a3a0a2269afce148aa4587eb9adc148328c7abaa38c73114b8aa64aa93a62f658486c3f2114801106b9a9a607f3f7976b5ffa801890b5de93d704a9f3665b257f6b9bb8efe04e819c3ee8f7a95e5cd00e9ef7ad34f077cdcf136041f770a7cccfbffcead9b4ef15e60b69d784b0cb87dd321c6ee474210b7f4f04e00594710648b2e28622b33e03df568841bb7aac18382db08328ebfec07cf25c63590de7bfa8384cf090b235243b7acdc17738291ccf315fc62de34dd1362b13851ec482d2aec1e32c20c20dce2047e3b44350e56105867c53963627ea4bdd0f70f9f3b58af1131738180df7774ce40e2f5e1edc031e1c1c98be54fc7162d6ba1128d1d2fbb2b774b5af354fc224f11c59bd3a3fd735ee2d6cdae621da965d1ef42acfadd6f3f2d2dd929e20e530e460de6f77d31a2b8eb5319995ff73d71d7f761d0d7644564763f8eab150550a6f72723559393d1c9e86474322a7930e0bb4ce95e4868686855e4ad44d18264820b5113972998607632c82666e742e4aeee24438ad9d94e46a62377b5be15118882a35506866230822a0c1dad3220044f248561188634432ea6e049c941522a6734bb8ed5a572c0f0a35932961e755a29a259924aa5c2265a7830a1130cbc8df41ef4de444add94baae7b100324cd10aa0b9d60ba819422d306d3b7c0c1112f98904695aa540abb9c50c5f21ecc01c579f0c612ca5338299be9575025f24f2a55cbb6d512595285291faa27fd18a66eba9028a4c283f93e64e21e0cc812b26c39a02821a56e4c2c12552a752dd405c89750971269a0f2218652bc4533d479efe114485b0d9457c361ee4285503493b0921aaff0711a47d0c85ddfab48e6f7a4efbcaea6c9c7847bcd6ab582d3911392539037f3446762e230ef6d0e059c027e111e0991d4f897c3f34ea7962d0794516499fec41adf4bb56c260f9898b82b2432512d5b181422f160c227b17c14c129e338be0d9c623b792f9ebc13cb88e981534e4226efe3c238b2803c61e139fc3b3a21e114e5f4849391f779a71998debb9f5c007e4854349258272b9ca4742cd1b4c2e90bd3934205d216169da47c394e58b843a991031a3370c114d3fb90a848031daa6b028d10cd1250095d17d339810461bc4e7ccf0753e9bda71182afa01b5329f48430fa0c4fba3059a66ff1a4c81c3bd42b486c892a262e5248e1284368e486e4520512650b834e2523a6d83a3df1ae0003146a1865d1448ba12d9059844fbe232acd10cd9049e38446a8c9180679add08b0ffcbc2fe53d580297303f51143df10ba5f8c2ef0341b07b6fe67b90f5bde781dec77a058d20e8b15e42ac8f08c9f4de033bff56be07bd99a7c2175978b61c504cdb06cdd713af202f08560041a8fbee5140e6f7125a090d79460e0bbb4f0612e9f35649485b382483c989bb3c19bea1219216434a485b4844fa628ab05841b1826205c5ca83c2c587228a28a610bbee43a19ab1438dde81de8af8a56c61d1cee88160387a61c9c7f799e327922492582a954c602b5c25214f46eeea80c90b0990b6d0c8ecdee4d574242f4cc248a38937ba54c0cb6107e1d10c0c1ecc13488f647a1f3ef1e2260459a016c8efbb550a48dbbff7ef7d788484ce5c35d1ad9af0be8f880804c1300c4351144571d50469d5c4aa092952564ddc9420f0419030816202f5a1d01733a67ab8c37ca920dc634854b8926a79a9151212d57ae921be7fdff7858f5a79140a85428def2ba80f59625864a24cd448431c5b28d6f8e1c9bf12292cfac6f7c63f8d6f721f9ff4b630d5433453236aec01fed80a8d3c98eec716912e0c72188915865998dd7f2c910b425ca852a54a952a55aa54a952a54a952a55aa54a952a54a952a55aa54a952a54a952a55aa54a952a54a95f151a81eb6952d892826d8b285bfe283fcb06724c3307cb0d5b28d28969b2b43e309fc18e0ab66540fbead649bf1a51f31fec1075b9e1c3ffc91258ee3bf007e0c9607c9d147d785157065fcd493ff8dbff22208e3c36761d99288f263e5c1d60bf9e08f1fb25ec8477df842b67a8c8f7ad48fcff228962d091e3e16960df5a431f5305a39a91f5b3da9275b3d2f7ceb575a2fbcbfd7a5705e68f98cd6fecc181ffed8b2b5b44019adfd99aa0f3f468b655bc20451a8111c4970e5513faac00ff7ef6f0c490f06d400f97de39f500fb24e1f9e7e5cd9c2219385e5bb540ff05948f2c91649a328fc15560a068be5577eb5f22c2d5b3864aeb44ea856cfe9c753cbd6a14ee018b26c3442d6ca10c9f2e94c9627a15a3de08fe098441413c6c36881246b25447dc85a79161649b23c73856553b54ae3f8da4812515cbe204170e534da9630bf2051e390994a9d7046a6b74f9288427e1f0392a004b31bfa1890842484453ff87ec0e407433f0882324535ea6e6cb96441e592859506a24089a2528160aa954ab1540f92372e5920415005058a4b166eb2e0928523ab235d58256085801e2f8ffa9df14fcf44077a5ee923c1ae0b451f602b0c125b6150d779543e2a1f15900a4805a4125209a98454422a2215918a4845a42252215121512151215121512151295129512951295129512951295109592e5448ef3f2a27f07d945a464c2f15b65e704a1fbe8f92912e15b65e4a6ffa97f08d98a6962eb57ac4607e3f769f077e533e1304c129a009866138253441511445b144229148a4293e4826e83285f4fe3b3a9222650af9825332c32fb56c3da6f860cb470ca6188309dac022520857f0c113cc0198be450f9e98a3ca698668845030822a172c7c20188661288aa24822914824172c1c1d4991d21175442e5820bbf70ff43e7cd0fb3e6c89adf0c8077a5f0b2c2249194754aa6844b1587ee599205f8260f995df6139fdcaef90a757fdd881a017963e91f4e1260ab5227ef8289c54ab0ae4a96533bdf7dfe979f83c23dfe784f9fd12a09193f719414a51077a20cd50515151118d121a219a25488872e4c184522892425151098ca238150d75a0079e3e7c09915e4224f04d204822812ddb06c15618f47abd825e272a989827a293d069c80c5da21006bd5eafd7ebf57abd5eaf571482c2a0f0096f262c158553188b8a4a605464847109a42d7432964a4ec62027491867844625de8c28c548e4cd8c239391c968058d10cd121aa12fa68c47a67c311e89e2648a132e9e7401c58ba3f1883763eb5c8c600a6986a23899e2848b275d40f1e228094e9c70f1a40b285e1cd12ca191620c9ae2641c9ae2840b285f8c41e3134ec6209a254e8a8a8a9cd02c198bc626a11466d7ad7c97ea5a247984d3e9742ab9288134fa62be2f954e21910b12c81ed387e31b9db23835114f5c7833e27f2314285e9c5e41af24ad93151e0c130fe654c4e454e4cd90ba5391cb11ba37bd5e2e4c2049ef27264820bb12f83346af242f255b3c213a31f1666c21d1c98937633b3131bff72d9e0c51e1e5e86abe3f9db6c0c117e6f7a790e864f40affd4b275ab964ddbba5792d311aa0124120ae5a5502814ea5fa495b04496be0f552af1c8f7a107cc95d69744e85b61a550241209f50afa5e4221e90351a823d3e508644f572a85a552382485297ed87a05bd58582aa32fa62bfdca91bb6e5648c8ee6da7221f78c0ec8aba4f3503b36b2d413583ce533e422a5a21d1ca91c34aab2d485f82d9bd892c2aeac13a89456f23894a2f52e1c1885f6a85443e6a98a517bf24aa9abce954f4156989a2e8328e521e2a0be28f2e46207b481f9a6268925e6cd10ca16478088e451e8c1896c0143b93918ec8472344faff5a3946c270c950f8b14c1d8944ea4a4f23142ea11922b142d63876a014137cdb498a297660d82a9d9cb84b01a4f84dcceebf2fd2021ffc300c411651890ba4f8126261e9bef44af212229fc4225b3623af24afa0d7132fa157922f470c186249f5a5d66a0b122c025f49460fbc82669072845593d5939593159497d04a8b1517ab2e564d5e49a62051bf9a027c5791226009ea6ca307cc19424766385ae9ded682c50c414226f831583560b0fc8b498d6f23452083147781ab264126f8ab079033d86a3cb18d484cf0c72635a0cce004922794484145164d9abc845e498688981419cd2005d5051c3431dff42d6c6005d3eb8c74375e89f4259a2115c90283d4ca81c142aac0ae5b32e4cd94569ec45a2995be4bdd9468846894b8293ecd5089e5df4842953cd2ca8b94aef522e5cb3196c6a31729b61a37a2f89d009e98dfc474317d8b1e50618e1dcac508644fe943138623deccbf4c310243903723b63cf05face0cd885fc080c4c88b146f4544a27e4544dac621137c6711ea4a1e89c508c68f475f8e194d68d4306de3910d156482305a0260e22ef04da66769d96a902d1b0d72654613db8c283fc55de0b3083d383ea965abe1b56c345a36d2bb969009beb01899e0af1c408e593c1513fcd38b14137c13cb26000f98e08f5978252d462e4c10f4c204bb00bd1af0c7b148cb49344b3a3702c3262608821df802208140aa52af52a954a957a952af22552a12f952a2ea421824f90a22fff5040983d5b3a26251a960a81e064992301e46cbf612ca0183e54b5f0e19cfd222912a19303e060c9614090c2283564141af24af24af24af24a0ca2331610b1e40d9a20b2d4830954aa548a0984a81a64fa94254ea532caf0241d5d30881aae7e153a59e85d5b3f2ae82a152a59e45f52c443e182a9045c5925ad948e08aea554faac0a75942b3846609cd12900bdff77d2b61f81ecd9215cf3b792b2acf3bfd0aea573c6f8566a8e82bf28a52aca222ef6996d02ca15942b3242c12b1d8a2074ab6e04194f0fbbe4f159250a80fc354f829d409954aa152ff4af1f0a14e8f5a41a150af4aa55ed5b2bd846caa15965f51a95a2b2dd4a350af24af24af24af2442a40d8ce2472344a384860a1a211a253452d00cb14ae2a9683cb55a36232412cd121ae49116509f48123ff1133f929122a457d08bf47a05bd5e241269074f307198bec50e8cba2801e9bba0e28b144a8607e3a42d48efc715d3468de338a25a6a18944aa146d5a9b541d3d422bd92d0204b4242e6f8122a7da597d0e925c4f2de7b2d1be94d632b68547de949967f31a5962dc7114b0b1564aeac902ad3064d12ca34b6d430c8249dc037993ef0bfee95e495e4954428e5894a8e4c12e8d10c752c1b892a79adcf0b3d8f66c84433647e6f64de60fa163a40b2c50e986cb18323de163a9062d260fa163a70e27d9742c9d8420d8b4e2712e93f53eba35942b3840b30ba579397902983c80c7f144f4f1452e1cd8c2f8a3284c413cbf4a7128b143af195baae7b05bd9ee84ab6971429560fea9730bb92aa334ba0f8a9d2a794a454af24aad4a33a54ea5f42a6f85dd7427562d7f5a41ef5a2281a295222955e52983692f74b98a2972a9544960d34497ffad7132f2526a9947a099d6ca596ed2564927e7bdf97be542abd8d047ee92b954a25ef7dc0824a7dc7b2bdd87af9d0891fa2f8af206fe6f4a57f3dd1d1885f12c597d04bc83cbdc924b67ac4f74e62e9619c4a3158fec128a5a22895445413734ca152e283668a258a5ee9c5948f4e7cd477a437b14e204bc6fb2bc883219da030c3a390893743be0caa284e5084df75a6b7e5c811c5f45ab69429f5b6d7f7a498e3c8145b24db064fdf75a7ef3cf1bb8ef4a22a0a330cff45024133f5aab7e58062a25a2b1990eacbd8600e28262985024560a656524136951433fc57928e06d57a8dff0a1ac7979079124da2288ae29ba65792ce06a9141b77c38f67bf6958efe9ee31b87f48987172fce125cf9ae27099453fa7ee15aba9fef2d7f431cfd51adf1e27916a980f20384084984468b6446130d4ddaf9327ec8ec3e7f37e8c5e9607d7f2ac29dba28f71b9fd3c296dcd36b8c56d108f55bdded84c6331ee575cfb7914ef13e380f0dae2ee0dc528de57c52c8bf7da661b9d13fbc060b1d989874031bab6b90665efcffa937b40f1cd10285e85e881a6eaf55971dcbde6a4e9e6eeb999c9643aa178eff486df88c7b51d93c974da2bf6b971f79b93a52a984ca653a9d3da7e5a36994ca7181bdaa5f78a7db00d544ddb990d7d66d4b5a6f76623a765a9cf8cdab001d3b8bd6b3048e8dab92f4ea7a8117fcb5bb7362693e9b4c36696bd297bceacce68f9cd077257b9773cee0e8493a4201c168b01c9c1d111723344ecc6872924674727168395b2d83e5b76eb359fb2cffb518ca2f7370dabbe3ffbd6f6ebf5e2dbe754f5b6ba7d9dd6769eb5a6ffb8b6d1b5cdb4c7b7bb7e06e2c2c576cc85c32d6e89c4702494bbcbe0a4180577379d14af707792932207dc5d26fb35a79ac53e8f792e9bb7febd62966dcfd73e2f93fd9adedae95a73be8cc15fc3aef1a4b71abe76a6b51f98d7ea5d59bcd7f43566af7a62f4ff01465220a2801158ec9363f84c7d58dc9e1808c76e2710ba629c6e352eb3e8add59845d55cd398adeddc3d311adb67ca6e8dd9d84f4cbd2d9afaa4e89ac680ee2d86bb9d4031bc2f8a6b6f27900d6d0387eb7602c562ba55db5b7bee15df7237c8d5eb6577300f7b6b369a2d67a96ac3860d396cb06106bdc1c60d1cd7861c379c38a037dc80830e1b700e17de97dd7ad66a1b7ab7b9e7c4b5d3c64e796c641ef69ea58ddc4ed98b9bd9c0b75cb30183e1d29a66736db737b6b1aa5edc66330ed76a17be5d960683e15bbad79605ad70f767338de5496f9fd767420a2378270f08778f39090ec0f7e5497d2e6ed5ebf332bc6620b2bfbfe697c5c0e02efbb3b630d89ad38dcb913d8a55f59eddcc8647e27b6df3f93af0f815abb14dc36a0c55f367c512078710bbd81a7d1d74f8189815abe5c9ea062ce0c6bb682ad6af830ebf6b3c29ae959807c549b8bb114e7a3cb8664b8ce6d506c6ec9ed9d06b4ef78955359f366ee01c709c37e480e365c38d1c3768385e280e3a501c39dcb8e1ea98dda063a6e3060ef4bc01e77003878d73eb96b551801d1c1b338869f33b1e084d1f866235bd347d4b3a5a9cec8e7ca72a4ebf6c5fd90c273b197787e164570277f5fae41b66dd3de51e6ea0b321bb1a777fc1c94ebbbb0c27bb98bb0e40185d5316eb35d56c89e69b8d13fbc4bc4e617ec5eaef783c7b546d734d7f8cbb9bdc3dd4dd6938d9819a2df78d26ba7be79eb39965f1aff751bcb2edc6ecaf39dd77aff88655dc2dfd9d5e763fcf9aee7d6f6ca6fdf5447787c14907727716275d89bbff6495c6629ffcb99d9e17774fcd9627f689fd5cd6c6c96a1b6756d56b23c75e7696aaee1e7ea0bb7b3b20e181094ce0c3f442132b62503083224184c0821d1a0e7060024abd81612941c793183fa5520b434f00a23a418549472b0603379ec4706140f9e1740f33ec600b624203a51d9088c0c5e84d8e1c31fd2319e18bb16ba26b024950f74dacb4287d39461aa514aba6ab4929b184f7a5d611ef3b96d7a0506f229dc03fa5589ef73c78200b09f8a8ef584a98bef34ca9e7c1ab41b18c1c31b19ad8a1e6fb130b495057f37d133bd480e0a77ee743fdc8f29a91954afd69fca0aee684048504f5a9ef584a9cbe3b7df74a8c4fbef4f026660fa9d5819cf762ab03b9ef7728057dcde94b2c24a92ed53ad242a2c412df9f5a473e24415f93fa2f550479e4c8912335dfa7584a2cf1fdd83af2bd17446ae77bcf3bb182ba9ad39b58415d8de94716922676a8397d505733fee8b1529fba790902fcd417f13dea4b2c2426228cd4a45a4abc12a75762fcce6bc4ef6a565c9044bc0ba6d8eae940cefb0ee4c007ff7b09027cef77be20de975841c0f75490ef3f4fc4820609b25634d831ae5ee082150c48af277cb065e4eb7e18dd6311f93cef3df041100441f0bbaeeb7a3a5be94944c622b6ee0960447cb0888ff7e1fe3e7cf179f8c22f2c4200236689d402593d618b4811d3d4ea11c3075b9fcdfb8ec4ea2981e0f77de0078220f87d2cd577a91f545ff7a10746efbaeef358443e93f4e3687ac7f9d80dbed8f2f15efc106411a161f678adfd992291223e7466c9d4b281dfb588143149ad1e5164b5887c668fbf1b2975de0ac6d297a3489125bcff7e89eec12f72451124415f13ee983efc254a7f7a6f1569e26bc2569125c43fb582bee67b536b89522be86b9610bb0f5bdffb2f2176ebd80579414882c0d615447668e20a223b983ddfbb37214235d208d1280969846896d00c855ab0c2269f90bbba77e2c174ef7244761f3ef97284459d11946e2503f2f3586116fe42df158890c5108accf05f412f93c9739228969ef47a427417df4dacd00a0fa6f348620bf46040d02864852e45f0202fc6bd9403ca97a37bf7bc15864a9e80818ca396a32948a48f0ab2333ff14889a8a4c89d845f510b9471645231bda2a3294e4e94b454471d206da41371c889e9a98a607a27274a7c6879c26a03a622e3932fa62341d71185a2e7815e4b0dc1ef523d3e13740f6686d1c9136f060f669c81771a18b930bbefa2985d93195653ac949c86543974e870c2831892c252680a81c250a563b5011d3b80483e45f4292e5a21161589454e565a367f42a9443a71273a768462492cfa62bc8ea8138bbe12f8a158641e117964140e903386c4771f73f800c50754ebd47227a5968d8613b115b66c3584a074ded79a315412323d9952a9542aa118d00d8168080fa8c2108ea83a4fe84b26195d0c962030dee64f48b26423639460b4b4842d614bd86a61a13c52a82864b9a9b6500fe67b1b4985f93131bfda141e519137e3dea130407a61249252372d2d945051d017e3fdcb417a30442b902c6f2b4909bf08c3965618b674acd10a1ecc374ef1603eff564629422d4f5a5d80043d1816171a2cff4e2409a395bae96ca5182c9265236d347e9472d3f263eac60b432ff4428f145339a4b7a9157061f91713e2e0c17c1020a57833de7f8f3a125a610a0a092a0825048a3f486ff3bea525bed7b9e7e04af8238d7799d1d170791abfe3f23468bc8bcbbbb48ab89042e690c3bc2f878b2aa5fa140d97a7d14245cb9037d322450b9137f3c27fe214329a38cc7b710a29e4cdb0fcf7a4126fa6e5bf27874829a298c2fc462953cc2f7c97b0f512048d77f91d1aefe2f23476564fe369b48ad0f855d8e23571d737be6d94627ecfc2228558a41272480a0fe6eb5c582fded360bd04e1b5765c7ef53b2f4fe35f9ec6935c58346440626199c10adf532c2d2d2d2d2c9bf7a487211a313d1843bed611e114777defc2128fb814728814f260be77a1026973293652c87bb2e4f236d224fd7b61390d1696b7b914182d0fe363b048a99b183f7ead20972a90e1b39048dfd2d2c29211b2607c8b0c184f82f13c7c3160b0b0b44ab630c809a2cf09a251860bd4d210d03d0f5c0941282d5e8d20ef7c250513a8573d13a95f7925ae28bd12a857bd98fa951751affa1dd4ab5a3ba95f69f91723961ef46458800c997ca5960d348de3e85205f2f4de974a25f04d2c23668904be08a658ac27e0cb11d15671ab299acc7802ce2802ddcbb1caf1f2fee40b0be5c5ac64b8d702a52544cd603122d97c0a8b118b118b118b118bd10865460b9416282d5eb41cb5446979428b9496291eeb73272fb697263d264076a91bd6878f504c5ba9ebdce589ac5a91e77d4b36438b194e4c10156fc8b1651b57ff42a35bbdfcea775e7eb5fa17185e1e86d09321e385b77d66cbfb8c6f5981355e86172dbc19f05f8c5e5e9a78332e307e75c4623403fc1925986134230b6fe6f420942298e014f15fde488d27b65e8258fdcbefacfea5c6af5a3bab7ff9975611197ed5325223c2785b0b94186ff329338a66946086910703fe8935230b0f06fc3a301504498d97e1c7951443561fc30f79791894b862478687e195a8d17a113f865f7d0caf840cad97af15440cbffa17b1b513436bf5b2f32f0f43cbf4a61144d16089ef29d4f77de29b3e7572f39432c93eb41b8bdc05fe0b6bfc2c40b2fc58e430a32fc7cb8326219ff1c2278ee3f8e0474adda4825caa408a9e675a79d47f2c23a6b762428d504ceeadd89230bd154bf52fb06c9f39a325320989cc16d68ca2194545ab2298e0b394c4200f86a56289478e78302092202c3c067c28a088228a29a6f05a5e02f0bb23dedbc420d48a88b4f994b09b51f462e430d1e43946285f0cf8e108e5cbb1d2b2954628291a35a06021b65e8c2440da7c0a5091206fe603bf7bc29b11df45168a25633585cd69ac2a40aefee56dfb85f562f4c580bf62f917f3d2c4047f75e42e25e0db6640f1663c2f8ebc9928de8cf7046f46ca38c59b29bdcd6b955a1e8c7b5e6281ee5d07ae88620b65a29e4b7999e1bd10848486dc16167d2b0f0583150a8d7e934af938bd08ba9fc618bfc312eec06885425fcc8a98ba49b588745d70a902e97df81dcb96c414b0035946cc4e85fa15962d871313353e8a65025b45a19107e33d2915165181f45e2cd9c8928cd5166418d4b54adfd18a679a4216ad800cf2669e20854825aaa223de4cc9484df7e3f8282335a4962d07948f25767f6ad954225015b9cb33b56ca3d078644432068d4f78301e05c8f104e514250c9af279a552e93f5668c4fcc6d183c8a2908b714534a4e603103e0441c9306dee84b4b993aefb5651ac86c88e54e48d2552eb250893a974fa53ab88a965a466150212fccf5b4580b4b913182240da7e48cd07207c08e2851f7de00c8883e991bc100ba3870a8956a8b8ca63f2c48bb75a45aef02f527a53cb96c3f4a76e0564e94d2b53be1c5ee3bd0ac90ad1498ac90aa629a62fa874442ddbca14a6f73690ca0a91bb3c9314931493154c534ca1108b345d450466600cbfeb3cd5f77d200882611886a17874b4b26265c50f32bef7217e46cc2efcef7d841f2907ab2a5655acaa5855b1aa6255c5aa8a5515ab2a5655acaab8e28a0fac3c00822bdc93b1aa0029ae3a9278e4ae4f1583090138a6af0f30d84e4ddf5aa6ad383dc0603b2c4657ac7f0c71f2078cbbbbf9a384bb3f2610478e71b85b5b73806802930131e4eee7ebfb630231640684f3b02d6ec5ae35af354efea001f2879abb9743b099cd36b2e7595355bd677ab3cfcb6e20fc4309eb8bd913a33f5955716d870048200051897f369e9d18a76f77ddc14902ecdcf2a96f0d4dcfb4d5c9e11f78e4700f0fdcaa77881cfe61c78987c061a6c5683e719ac0b90147003ef0c007277cc0e558ec13837d52bdbe4e1f063b757a83c1721ac369d96b55bd27cccb62746072640f53d57bc636d6b1f59eb2a701c974643a3f80c73a3eaaf828f2a1ba7b79d9f63c598caeedeb1cee99b5badd390b611f13f135d450430d25504ac32c4e6ff66e9dc33d7f55f5fa60e991458f11f4c800d90301ee0e00277b18a0070d556d697f53cc6e22be4457fc5b639e14fd1bef2a634e8ce613e6f14ed99fbff1aedae659b1fa321bd9cfcb626c4a1946f329cbe8ef36a3f9fcc13c9cbc79e25ee22eaebda661aff8b66636f559f1e7d4d90d6b6dce30113c17373a7923c58d921b06e0dcc68e07802ce6064c8eec5d3c763c004af2c607554d7fb879ac43f6c004f79dde7ad87bc32ceeb93f6eb0beb52058df1a8ec7ce8e130fa1cf1497f7ddb787bb2faa597c6bf59a4fcde273cdab0d0d0bd17bc5e999d268adbeec0d0cb683048e1b501e3ada1d271e02091b703c8d8ed608208caeee2eb079826bb6bc51de50e27065da9abab07a4f7d7fdf20b773088f1c186c26071c3ee8686b90a0d115d73ca0066622c19138c2ec802924737f4cf3089374248ee059d3dcc5bd11479431b2db39045db18eac5df1a66598f5b2f8e735c63d7878010f2a0f34bc94c508791914074686d976fbdcdaaf2dad456964aa7a6d647fd776871bec0054ea5bdb01b6c3894716f7d97ca6fbdef26eef8a67280f04f0d861dbfc79f350e990021d502f779b1f65f3cba8b816fd9beef465569e35bde5d521067247127648b1d53606af6c9ec1fc4ef5ce6a2251c3c91d3c68a22071844c0f38461c91f3ebfb731fbd3593c60777a771f752052d276151b8bb104ec27aa8edf4f670f2c503f225c50b081d5670248e78191919208c6eb5d529aab6d987933a18a00307bdd31baeed74cde99a9ae54e1fc56c5e73ed47b7fad6727c91830a248ef8adf369c411a5d6adc6e58de2ad714b04b3980832c71239761c89231edff2b9dbfb43cb3733334f985932639343157220ca0108248ef8ccf33975766799c5bd4e57ecc3e2bdde95c53e99e77f7c89e29c3a4bb5cebacd2ce6592f1ab3db8c6fe9cefbd18b599812a33955b739f5c12ceecfabe23e871770c8020e44ee8ec411798de19ebb655fdb69cfdd39f4a2eb25715071d8e18ec41132357d6b6fc411b8cbaef7965ef5d4c16145de10c51d89231e4ddf88234a145f21372cf1e2e40de70d2a1c468ec411e7fd979141d39731e28872cdb816cff2967919f6b2f8861fd7f6ed775e35ce288b53b6b651ec93e213b3587f8ec52d911b1247ad44f1c62c4e9de9e0248e77bffba29f711ab36c3e1f9beebec3c91b507cb3d8674d65b21b41babd39f46256bdbfd31b36b09996d2d2bd6234fdf58a4ede78c1dd8970d28626ee4ecb9fbb3f9f57998bd9b57d7d7f6c50ddcb8df18dcdfba63b45d38b43591b6cb001c59dc5345a3b3b2f4e3f2d7fcf79d5bf1a776b2c0eb2a61fc3b3a6bbcd6c89cb14e671ab759a318b6b3b368a64650c8a6b5b63160784d392a7c430419cb4512ad7fca84e7f3e17a3aa17e6f38a6b3be59335bdb1786354d34096435ee273c52ca6953cb8b358b7afaae9d68fd98b678fe29dd7f59e3d6756d7f6716da7a4e1e88a75fa3afd1cd205c57dc578f6d8e7d65eefb89878c9e2ada634d2852b75cf7a6f9ff37e7d6bcfe2f527ff0f275d34d25bd379d7cef5baa4947bc55a0606250f1e30180f9dd3797d7f67c70ea05cc363070f1e31303b6ee790db39848789e38696071028de01946bb6c6e84e6f291044d400821a64a5dee9e7fde87af3eed166cc49c6b8c8181960b8f052ffd6785f55f6ae12a3cfb3a678f63aa565165ddbdb2dab6ade4138490313569ca42108342441d2c0d2008300b41000060400847b89f5ad9d6c8bfb61334426b7dea7a52fe3c23bdf30ebd218d5698f4ed9df17cf3e776f6a7a69f9716da7b298ecd94cabf1b479c59ff7e3da9741d9fbc3661a2dfffd9527c52cf6c9fa716db39846068005013803006486293358608608ccc0033903caddcbf469f96bc0b7ac6ba05973bab19a53517d7f7235ecbcd6a0d39adad2f49b0fbbd9c9015262f4ded69cd79ebbd736dfeedfda5b0a746fb8b6b5c66aba66fc7aa7b357d5f4e76540f726fb35df3e032973aa7a73ea9a9fcd9f53f1c62a7abe8c47df643fcfb3a63bd51987d1d7e9ff6a962f836219f5de078003dc5dc74900c04800acc856085a4bc8160eac2190ac03b06eb0c0b7c2dd779cfc213d38f932cacf5d5cde6b0a7395b9fbe34b8c6917b73f77d6f60def74c5ae12c70d28ce69ca7ebdcfe215f3d0f29b0f93e5d89b9e290daf78267b57097363882c26a62c615e66af98bd4160700c913d9e9d292eb75f555322bed41b08ef35f7f030d9d61895bdabfc6133045defcf65515ac6ddb3b6f5fd15f7dcadaa5706c56bdbd6f6a368ea93599c4e5f634cdbe92d556f78a7b118c634d9d3f2b3799fd8e7655a86d18ba6fa31ee51e6adde33ab7ae35bd6bfd98cc32ade216b60e1ee394ed6b091358a7077214ed6287989d9546354a77896b2a79eb5fa732afec9fbcfaccade556accb3dedab95ef6f260f675fb395a8a79d6ac7e5ecf74b317f7974d5b225888bb037152062848198048198048197e70f7219c8ce10a5e627576758aae2fc3b3a66a7b691885c962b3dcbdc9de55ee9c85fc78982ccbde55c6ac3f79ed595b1c3ecfbba65b63f4ef5ef189d9df3adffe87cd1018dad53aaa7a6dd0340fc16255bd36427852dd02e1d865db7b59ad63e72cd3d63486d3317cbb2c8d27d5b99daae916a287db39c4e6760e09027473d9d6bc6c6b621d36efabaad9c6d4f85caf7a6b326dc5c1ddeed6f896ee04b9e1ad733a3dee6e4bdd79643477c7a8bb9f3377ef4e4eaebaf01928e0ee5d0c27572c98a53ae4291c21024d70f78f49063c1024860a9ce470f76e0708189123e48405b270f7ae014ea811c3863b3ee0ee1e10373b24a1013434200beefeb53ce04914263094850edc5da48004a6745dc0aaf0e0ee1d12ae0045912f2670841cee0e5640468aa256031b11dcbdeb628623064738808810dc3d366b6b319dc33fac39d51aebb8fbbb7b5dac68b8fbcee8ed5133ce356b6b2ecc83a6eccc86b6a12f7b65eeb49cd99d55fdb9ab62f662f6775e6d401bb006dce1a00e076d802c772780932e3067aa6a77a70161af0f098fc7dd33f683d72e07ef7ab8fb10275ff0c1dd75b0ec8decd7adb61a0bc9e1ee3339b83b0e44ee7e83bbe370f71bee6e83bbdb78e10bf205292e7797410dc0dd6b7018f2052bc8178804e0ee0128b9fb0c369436dc286fb84eeca3aaf7a66ddc8043c7895f33f4f5c231739ef886eb96cf72d6d676ca9363b74e7930eb382c77f761860c1cc760b0db098462349feb4d0f687a8360dca3d41a97eef3e26e698e96aab8dbc53fbfdbd9cbc864f951acefec71b776f6f737e6c11995c93a5fbe0c97eebc3f6bf5bec6a98ac3dd67718a6bba7dfcf3f85c53bd339097c9644f133380a76171fa03e31e5fc30fe031a6c5d69c6a98d7e171e98e6dacd2c4e0d20d73aaf78ce9f0bfb1cae61e6fc3c66336af3ca9ccd62d2b93c9be7c5cdb3c6b8ab6eab9a69f9bbd4c0c2edd9fd7afedf407e69348b52ba7b2574d6f6bcbbaf69a59dacbd47b63db53bde7555b1eccae78cdb874ff555fa7bf6fedee59febc5f86312da6de35a5c91ed7b68a4bb7dade5ea72f933d9bea9c679ff7b770e97ef5b69b4d7d5a8f778bbbe5f3f37e2d532fc6e5c85215b753b5bd3dc6b4371f8ae7668f3fefdfb81bdefb3a0dee9e0fdcdde624a905eeee8ee3248b15ee5e9ea95e537603e5668f67bfde73af3765af8f5ed3bbd76ca3aad706d5596ff68a757ee06ee7905b736bd4f4f6d01a9f67ab53ea1f3643d6f479d6f49659daa3f875fa417ed80c7916d736ae11f125c62cedb13abb6a7a7dee6f20bcded7589db519fdac55f34b990c65f389d967b10f7e3dbbb5ab4cf637f57914aff796c3b5fd6abad7f671f7a6d3dcddfa35e641dbd9ff03dddba318c5f804c2677abb6b0ed56a66f79acff6d4abf9e58a7d529ebfbfa67bc5faf1ec737a7feeebf4319b3e6ed9fd3a7d35e7d9ca93eacfed94cd298b73d578d2dadf4757acf18af53d7f4d1fc53e2cd6987d9d7e6671124f83d7fcfbfe9af2e0d96bf5ded8bc3e9b69a5bee19d7e0e37e490c3ccafb7b69fc5fb6296e7f3fa3f99e5798d6fadd6f731115fca72642febc9915dddde1eb3b98dbb69bcef99fe8a6bfb65d4db12c18fd9fb1a9f29baa69f7f36ce97bbcdbff555b766531abade97c9279e6194cdbfa6ef5af3fab8b6f336509ccbde20cf62dce3353f9e7d4e5df3aff7fc8df7e5c12c0fcfc5f952ab785d6fedfc35d5edbe5be7d115ebe49d35e549d99cdb3904bd3540185d7172d05bb3d35b0a048b7d728870f7d249d413ee9f9b3d8a757bcf97c17ddedfc3dd63dcbd1090ee9f0f0efee156ee5f0f17f7ef068572f787fdb019e20af2c366c8f3aca9d6f8cc6c10770f80bb57048962224f83e29a6e71bf756b7b7d7f1eff0f5eff3e4d2e77fd0c640b2ff3ca8373d9f6ca80063260e2beb6ec7e991c6490ca7656756c64379dfaa4288bd1aeb482173f314ea7e7c4403b3d27aed9b0ec4d4fce0deeb23f31880177d99fcfdb46df201ae31eab1042eed609424d6f8f1f3b3a36ecce8a7bee0ed62c467328069243af107bc53a260c5c2fb0c2d73617c31b5db176c10284c06caba6b707ba621d14637576572170760692dbb8db0d1662a3d15ba39381e8fc642074cf9981d0d91bffc03dd0b5cd3d7606d2736620b01662c5b99d403174c5ba89019a0c79d8d6186d89e19dd715f8b83fecb25934c15d36e4308303bda1c3860e8ce3621c700e680e1c341d37d880832b8b9a2c6650c11154e0857732505181cc5db325eede3ab01b7950ba7b1244dc2de005164029e8c2cb156f20fc19489193ee4757048bfbcfcdbe9b80f7753e70770338890511dc5db3e589d1bc46410aee42f0c2dd8b70d24808aed97286e294dd38e0286d70cd50174ed9ed2e014f8191114d1c8082262dc002c53f9965f3ccdd59b0822c54e09e022c3cd3561c143581fce01f0ce40427e8c1bf8b81110ad4bbd313fbac8fbbb758d973de994cf67aedf1e53e31cb668d840ce8fe9019816739b5dcfa02f1a54c6ea76b7bbbe5134646ffe01e39efec0c449b288e9981a07867201e85ee34c5ab109280a4d9125d71cf79676b5a3befcd85f7ddda86c63ee94e6f298b73f7d0c91114610446ee00f87dff07af3c6b7a61408311c4e0227881fb8eaa5e9b52dbe4d6fb23e79d3b6b750ea7a2f9e623008117eeeebea4a88a22a187699ceef419e04f38058a64b86f20ecba6c7b4340c59dc5522fd67f85b4e6a7b4d8c61a5df32c963b37d637b657bcd73436c40fb8fb036376a7c605822a1eb6e28781e08be9abaa37a66f2c56dbe9cfed1cc2e36576b0b987aa5e1bf5dac0602734cd43c06030582cb662144d6bb1147763380d83d154ac79c0603cce549db541703833efc06033bcbe7fd9d6dc71d9f6f28879191c37b430280e901e36ff6cbcaef707a3d906cf72f7877a6f77dd9887bd9bcdb6cb6236afe92d86f765cfd89aded035ed8965da8ac3e29e33abb7730801766ac3b7bbc6b0daa2f9c68387aa5e1b744d7fc0b8dc8ef9a43c1ae8ded89ca2696ce39e33dd5be75b6cdf18d0bdc580ee4d634cbb9d406b4e71769c78081c3e3b6ee71018ec061f94c80d5dd35bb3b9b56b2c16d30014540342a50686b897ad066c3033f0e4de0c0cb179765db9ab66604889e20c94dc1dc7b3a66a5afb79730a26ae773a4b6b99c54d81db99c206f712cda96906427444e402229caf2dfb79a73f3a7d1ef6aa3fcbea4c13f1e049a41908069ce0eebeb6acceb556b3f70727049acfbb6f0f18200203aa0b04e102585c20bd004e896ff9d432a8b971e9be408b055a50ca72ed47f6b9990cc634199909746fe89a671678c27df6a7056690a20b2f379e7dcc0ce6d1f53e8a7d6e2de6c2ec48d123858c0ae4a00245dc4b2d937dde326db3a63f649fa26baec99d36b272cd8f7d2e564bdc0349812d50800243dccbdcfdc92b8b7950fcfb9a25665b1e9eb4c6b3a6ebdab23ad53baf308fd19402efa5fe18984fd518bae6591a8b4551e41e8590eb28703baf510c717721a2b0c1a3a081d31b8b830c4d71d7e990938d733de0fc1013df174dd1f59e3b4346dc57b5f559717ebd5a881fbc0e9d8e707202209800ea5eca767aa62a0e083f9abbb7cc33bb3f4a7c6bf5bde5d609884b4ae0b8bcf52fc9599203298127ee3216d736dbd2709945253023955051c2c4dd4b594e557beeed6f3c2d9b5fae9927b3b867f1d697c6e29facbe59d6ce8bd34a6c9494c8085021dbe9b378d3f0ed964fcc7eeede309b69678b62b68d800e774d838c0e04ae8000072080422006145940610228582874802225f4849c87c9ca7b93bdeb73eaed1c52e2eeed6132d9bb601af7dcfdc36688ec5d5ac8092155680877a739f900292e2befbe3dc85a36fdc1abec5d42f27e54cd1ba5e5075ce001390f607929b391bdd617b7db6c43973f6c866821b9ab6221fbc6f68a51ac5b1e357d7da8e95b4b7224892cc9bbbb03a294b354bf101f7e351de064df1b9b690e282a1d10d493ff87cd1007c8dc013e78e900bc833c11e5d63c5183f21fbd35280e0c76621f180cdd3a86d33c6b8a62ddc662280e9ac69ea05136c0897ba96f036aba013a18400477d7290388dc81e024521df3c9b818d0bdf9b0736663b1bb6f0fe8c53ea017d7623806c43831c59d30f2d689a0f287cd90bde25bfe0183edfce435688b201404c582620c61013758c0120bc069c20a4d10a12c651beb188b5574bdb5c7b135cb1ef7dc0d830981a6307f63cd698c2ce6c64cb6b1ce9a2383f9bd6216d7561c199a531607b9b5b7744d7fc872b39fcd6a58df1a2e89f4cf74bd389c67310ec53dd9674df12ddd3c6b5ad3d70755bd363c6bda04907bcbd3840e5f33be65dd44c99980623241e43f98c644900c8489f752c76036df603eb75e24475eeebc2261a25375070950b9359277dfb4147df389fbec370deb4e9f46e3d4c649051ca169b30260dc539d9380a3fbc36274e3dccb2480e827ab3f3b0900f292cd8f6327013c78a0383c60b09d2331188982911d186980911f233c2ce1842524b044ce122525bc70d7ae72c5aa0b681751c49aa3aaf707f03a303932994c86cda9ac2707ebf487c5b59df3a5ec860ca77f5fcbc4b06c1502b317a7889222b4227f001b1ce0010728e200a924a0248124893209564e07b905e47080ace05fc3eb5b43cb9896aaaf77faf7718bf7ddeded6fc4e8f06415264706f39bc5b593bd587f8ebd6b2acbbbcd397ccb3a3ac57955c5e7cae6d7e79a71be94b1799fb787d6ad8a7b19ac6f8dec61a5ecc6bb9e962f2ddd3abd40172808d08d1f27fcace0a7023f46fca07c8c5c55afcdeb560df22ebc6620368faeb7881fc0170193536eb555af4fda1229f7c5a52c567956ddbaeea3f876c3693bd0a62d122d4d5b6357d954d830d8ec068014522f4197402fd13be819d82e58232c102254dcd1b5a561212f83c41bf13230f4fec36a7a7897cbe52a6f78a7309d7795371e966303e75d255e736859008fd59b7199c5c9c87480ee0f190e77cff2653ab59d672f23a3f5c5b1ae350bf1ae5216a353d3b756d3b71683f99d6b3f1fc36298c7299b632caeed97bdab5cb36bcd2fc3b3a62a3ed76bc3661e26d0fdf1323bb47a7d78f49c59add9b1d734e3f02ddd5971ed07639676cb2c2d6f1d231293774b046754c6b039f5b9353cd3e90d279433d6262e88e3503168de309f619071b8dcc6ea5dd31e25bae613bfbe3f3a59877bb946f13246df1f14ac5a6795ddeddac3cd6e673f3ad77e7ee5c1bd74f70138b99634d0fda1517cbb2b909b13576f6ea7e4ed48be0571cf43dc48c76a8be2daa99fc7e74df5e8c7867a0217667135b11fbce6da8f9af30c06dbc198a5c57ef0ca6367072d07d7f6e40c845aea01424f0f5089e6dac63700a8b75d2bcb7db6ecd60fdbebfdc1b77407e0f5ba4818f1b8d603c3035b0d6c405ee6aeca629f7c75de559e6c9bf505ba496d294e0a430535b4768367093c4a7812c0b37960783eda0768341a0c63019b001f712f6f353d7c5e736cbee1dbafe9bb7afe3f45d15bbb9fbb3f3d6cfef9980c5d5bf56eddf6c0621e9e94dd42623f788dad1906fbc140d69c67330dcf1e4d51fdaeff32b753a0bfed2c777fd41b5bef1993bdeb1f26a46c1f68cda928be38ef2ab1ceef16b7a62cc66519f59ee94ed9f3775ef55ef1ade5616f0fef2ad92c93c9d0c0cad0b42592aa24da04540ad486ca385d70f69c36678cf39b8d6066c4ecbb575cd501f05f6ecda69a0616eb16bd98fdad5b02fc9731b86537cce330ee79bcd7cbde56e662f5f7dd3916fbe08fc15abd34187d6b1a5d5bdaabea8dc92e56737695b414979e65796efc325a46b338b7dedcece2308b6b734e26edf9bb599918196ed92dc33ea97a63388c7b6430af710cabb31bfbdfabac0bb226ee7ee3a4ec00321bb128312dbc94ed9c59d9eb344686cf3503817919f5a67bc55ba740f827abec0f4e99b2b8cce270f7636438eadd794786d5bbb3aaa6258a31db43766350c470b9939323c4a6c4e7ecef2a8410bd667d31db7366204e9dde569c446669318c6918b33416e3084153032cc17de646cb430781c1767600e59a98be271e0228d7a8ea3d918082440590288204cc114f8e3072441023b6401aa1859731d9acd531145f191c376a0822bb11d33746bbd65cdeafd79cfe5eefcfa3dfe6dcd69fe680328b93fd3edb9c73e5d656afb8cdb9a7e1a8ea3dcb5b6ecd688b35ee516c444716c1c5a661cd32dc93aaab10457c016c5000a002c80cf1c1102397d9bcaaa2f796d5fb32329cdab96f8d0cd736ae65ef7a5f26ef7cb9f5ad3dd9f45c531e9c1c5222c206441051c3103b18a20343c48698a1b489b181c9e9a16f0d0c0683c92e2e377badd3da0ecc973c6bdae635b3af531a4e1973f745efc6b75f5398188a650fdbeb7dfc3bafae1208e7d61fe79da96a66d55cfbb9e54dcb33219e10a215020921861062062f6360f48dc16099b6e2c0603b3f00f59eb2c73ee9be3e298b5122de55c6d4f4f078cd7957a9d18bd9779531376072de556afc821d25eefe83933b383b34bc8ced9c85c4749ac3b5bdf59a5e9d29e5e3d29ad6718202d111d26906a253cbe11e213a34dc4b9dc33d8ff74dcfacf52d7d4dc34e3feb97c13ea98af5e7f00f427242821032830c424a1056040114c48d2053dc659e96f5fec9aa6a96329dc33d1beb0419820c52e654218706396cce0f2054806400c80f2031fc7082cb58bcfee4e4f00fb287a1e9e7700f4ce39db244cc7a78974c46a673f8870d8481c85e4646cb41718680c176640fd3e8c542663dbcab4431504a83d1681acbe11e184ce7f00f30d8ce9a711835bfd418975bd397c5dcb0795759d377ebcfa9fbc46c1ac36255cdecdd30cfa2e87d4dc39ade5a0f3837cd279e619d7d621a0d6f1a580d93c33daf85a837c7e67dd1f5de76d8ccb201a7c0a8242f6eb791a0744aa199010000000063130020381c120a062442a158d3b34ee30314000782ba5c784a1cc9e22cc831658c51849001000000000088246102abe7858f13aa6409680e43c6fc32f8d01fcaeaa3a43d4be725f344a0be30474a9631c026c9b5a6b7066497366380cb36085405abd9526d90d5728547a3b3a6dd2d0da04456fe7b155cf8789720ab1c94f29bcbb3f30f31112e551a7d23fa5d0cb843a56545e725f422161a6782c7af504ffdabb0f9a7dd217a758fe95dbc9b25bb310992a26145a4127e0ce9fd7e28ca60c6640a262c4965d8bcaab35c17de6040103d93e61029831b2ab37b25ff76331a2e723ea5f30b532835b8039a3c4935d1f7fb1c571f938f2bdce0650a28d3ff20e13a7963a3e6cea99aa3438c545a22c4dd7b7609fc632fd02d3e96720dc556a66d6ae770eef4544998ba9fff622010b14c2525768f01e11a48c10c40d6c12e61198b91a3a2d3bb4eaa89370aaa430de24b26dda401023f8922331eaae55083c3872317f94bf670c57d82112b9b78cf20718ec8d13ddc8fe406caa9b3451384bb89d3c2ac07d9a42f82aff4b5ca3681c74421012ecb50fd4e2098e102b3be8c2cd268a2d8ed07689cc87ad782062e13470fc2259ab626f56338bc22841e13fde02692cfa98b0879abdd24eb36f8aab0e8e8bdb673362b60cff81053c6afbc8d6a8ee09e1c4dcf8a9fab690dd1fad3deeb86a8eade83c60d30a56ab51e6e808044d6079ac60f08b8e9079bb7ec6f6ace4f9de24729fa2829c525a736ce0384c041647d548c2dd430927b9d304676f88e48a34b18c954db87386c8f2c5f1795e083e5e736fe7eb54301e792726c9ac57e1c95c91ce9f9d7a17b2ee8e3d2bb4ba1abab03851881705ac1c9cac9d55a12423087613ca2da49d1d7a10ca0053f76a95629c40ca7150b3f74f2589e499d5169f89f37343b9b018f838efc97a1f611ccd0d097ddca0b9ff007d5d2a7aaa956271298216adf73ad3c0918fa51f6c89b9e4279ff1be525a67893178250629cf4f3468193d509550be2748b0ed37d51d03192a5e057e7d048e600d2da465b7f37d0b2dd448bbbfa5ad493ce9181eb62354e747c70dcbaa322a152500daf9a048a13ccb76a95510dcf71a0d5916cf188b1819b9560276a7ef98fed67cc2b4fe32f8afa9168394f95d07a028390c2d2695484dd33a1bf9ff20c17ae0c96e4d3a09a64d389bf0b4446af063fd513f204f460320a8b034ed4ce124967b0eab79b181c7dadc1e5559ebf0018a60db4658dbc1945fdb83c92d23d67910e0c454b6e483a68a4abf7c72277d659a8f17b43df6a4ec239ee4ce4369894f20151b0fc9baa7fe57e4e55c88d66901cbe4ae3ce1abdd6ab325b1f5cba92c79be060142e2082ac4f2ff6ad35c01c5fb701623183935929ef26ddea91d705cca1f3edaa969404b702df0ec0f23203c4f4bfa6adfb5efdd0f3b01d36722104febf7c2d448ddb1acf93a84aaf5062226d514d7f814d788c1d60445a51a1abe337624e23568dd11d5630e5a775c8547eb5c4d6031686c7ac11b973f9720967a746c02954fd65cb0147bf33936f9714de4ae11aa8a0059b173351725fa20d9b1d9e39a22c8a06c46cabedd7f2f007ba719d483344b9a2a854dce99872b77915830fd27f554bd2fb0606ee2eab62ec6ec847a188e6b1aa0169ba510969c9ec2a35f7b552428988fcc21e3e2e998c1f4c7b25a76ff14226988f8df24cf13e051aa2e608b86e0d02cb40ccfbc7d265445cb7fa80e2c4bb3aea61e78a3cefec8e92a6809f8e3a542e51be3a10bb01ba454348360c5d1e7cb2cc728d7f6ac310a15a04c1d6438a635abd2c90f88486087d471ab0168e80caa2c8cb0a3dffb344ed3b5456c5274213a50a01b780a9544ccdcad833f6ab3d85649538c87cb952a4399543df9fba3919e5700a50f86923358d3885e183cc762e4046986216e5e837c5ef52a65c2f41fab92445dc263c120ee79f62d456d43663146bef55df7b9eeb639cd7526bb4def65533649faa9408d1d3368188010f9e02876afd3ff39b9510ebb8f174b7bdb413faf3230f49116cdb44f4622a92c21babc443b72be8a78c089738bf9f332110a1e618f725f469a9c0a59f2b012e0dec87d2db99e8334b75949408d5975bfde666c83a0ca7780046bb13862b7c22f4c27d3ba3fcdb65b3e0a3c0490917389094f3cae0bdab9b89499706a956dceb18efc934c894172d85e4c313829ba3d03d05d97015b7807070ac85e26e16282da2c0e2dffaac82cc01bc46e549a0d439427d6f9900beae3ad0c8091812bf66f8e22e8ef7d55b68066b62bacf452409e022dfc1e11942cc0879781e116322674c2a908937c0ea5763ea0a71fa151db219c2a649ac03eff4071c315618d1217be71c6ece53418683a9fa9db5365f7ba03cc3b8f5d8f95717298ac76e8392f9bb7262ad7e03381e263977f39b45db7a885317bf8f3fe7e7259d9ab88ebf6751a2459418314d7301a7e66c82356bde28e86a9d28c93c325c2af810972d835c19856b54615a045555db90b9451b9d998dbb9ca87f6a3a13aeca98e4e279a660b49ccb87dd8a8d2e1fc892154034b40bf817b3f14b24f101ffb241a261913148b55e276a2f727daa40f96d281c40ae1fc4876fea6f1fbece2a7e26e97366e1effacc0fcc4e8ed4976e373f6444ef45c84c43be1cb9bb498d42caa3e40d6028413b940fe2b300371ff3f6376252627913e18908821fe8f3d5844a6cee8ca66cefee62da719304ceafab6412d08f5a73afa8312f8d996cdb103da2fd3f6f316ac63c6640575759034d6d5c084d326bafe4bb780a728c5f466bef3ac302b7c12388be625828d69be8b1a5377deeec904d52894f9f97f3dc4e290719ab2e8daa3e1af645a9044289652642784ac9be6bc5aaaf84f171727bc80f97721b48f9cdfadc1cbfc981d0fead31335b45f44d4b5688d43615e4e22ad7e3a565ce40137b9b184ed32246eafd53a5d7b342dbb48414976c4e65b5917e375442d9035714a9e3f06b86cc23fa633b64f5674f1e74ed28d9fd0d8f084de41f3280ec4baaba2e5bb3a94a0bfd274b1e269efb0235494966bb2646616386325f5e292cede87e9e75b3254d07602782652bc0c2af5d194f3d4dea64882ce873f1db2d3294c9118de813c6a68849539de92750291508b216eade8886f9461dce96fef9b92eda2640f74ec932a372da18e310ef0be0d103bdbe749e443c1fa925be21bfa821887fd0b0cd396afabc7076bd86e99935be42fe69e6ad8d13c76ce17f70470023592a857e62031de75483c9004d5ed8c948a48dbbc02baa520133450f5c961a4f650433154d149d97b309f60afe1f4e38f892a8d87356e10e3c00950bbf02f4e9db8b282782d36d06940cc3cffd0a223f8fc5c31390c174d35e34157e6d9e4d2b774f43caed608a32ec3422e0847e4e5444ecc75d762644f4bda35d7c4a65e0449d73a3798750705d8f6f0e449029dcd14a42a4ee000a7483e3f781f6d24e955f571caf11a551f2cf36b657be1abee727b1a917583eac5256e4c09794a24610c7262bcf5cacec652919f98c8c5dd449262434c086e9fa17480d058f68d41fe3d675463024be2f18bb5d083d18b0bfd5d9feeefc3b0e2922c751626f461383a2e5b1b03ee8f0cc442eac0da3faeb634d8842fe7b85718d14b7a04b1e8c587c3b98bb80f354f13f2ed1cd660c2b432274dc6c836dbc8c60d3a33a7f758d1c2bad328c7116faa07b1f9ab7adea24c92c9372e0a129ee212a90ae2330139196deab4d63d864ff002c8c7cc18069d15d3d635a80cf7c3ae3f237693b9a8b2d5a67402c241df6d4680e2ff37a029a53e5b4a51615759ad84a1e107f273cee3282ae6e48a0c30917d99f604cc1058e0890b98d389b73506c9a3a6cc65ede272fb7800345ce599832eaca37188072ff49b9c3c7edddd2fddef4781da0355dc75e0a3d3c1812c7c0a863ae6020de0e61ef4f127de6888cb7cb0e02f3bbebdac145b101da386e3fc14db6a285ad825123345245890cfb2a8b3f63a44b2b1cf3513eba9784f1e2c8adccef8f05069d12178cac73c22e4fc09b549a088128524b6ac69e9a4d64f17dd02cc0f960edb618db23085b4ad706c2abf5b4e1962fc43ca2887110d6d7b278052b5312ff64af1f06d8b1daa6d89cf960f87f7304ef3895ac66270ee3eb1d46fbd9230416169b8b9a03e6b28b8935670122ecb2d94f9e38841b00f10baaf62cd8ea1ed193ba9e2da2a8c01a033641356dc85be950e315ed076ebd11f00a1d1a517e7d285860897ebe54193c23a62c6cba1ee07f9940bbfab7e13c0f3cfdf4c8a5d52d28c4078fbf34feb3acd2f869fb0f1c5ecf509311709261d7057d10bdc0044d741ceb32db7351ed3e9563643ca83b448c523028bd2d2bea87aabb78f30926b611fef12fa83d99b927ff10ac812a1bbcd101a26cf16a038d79908d96ee0cd3b679df39fb42b63806dd8089b29dcd544dad6df165c68f6c9c4268e160e5a865dcb998970eb90ed0c640f994e7f233896cd34cf7cd71c16352b5b307720d02842747a9078060735886847a5da2a0db06beb5b8e61341232b195e41b8a352da659db0fb322f2d1c7e9ac255bda073958746fcd7254ea2bf4a1c6eadcc03cc783583a421fc73a3abeef6ea4de1b3777b7aac1700af570b0fc8dc0f2381cf7eea01a6dfd362100445b3a9cb7bb92f03de15d0ab4c35f8f3983ccab5804f8dc82caf5d47f83e385073748b6ad754abf02073ca5a12540473cffe883d97a1975d1da2ff2d630585641f8aa286db129461fa6c1a8d36c66b6e14f7224fc168c6740f1ce3ba884cb04677e1211ab29479e89cfbaaf964114db0c8c350c4677dfeb8f05933b661d7ef8b9ad33e800a95bb769b3d9cf20afef638dc8f4bc2c637c02b0f6228779ad442b89933a3bc67fee8c773345752e56b19ed02c5149392accfbd267e63363f46bc7af2208e44fe1b62a60b41d2c35131f2b90f6596925e5c1f6ac6c4b21e3ee91808a880b01519291812a0136f83cb2a37970b1454b54e42cacf283b0b1f9b2d4fce3d7494af0199636bc364409a8eb9047e2ccd6d3d5cd5d962432830665239d49152affde9516c12db454c21620472d835d574815cba4f02b7f169951dd44361759a1219a80e4294af8d8c8918fcfa869ce96b372b461932adf19735831a360c14ab91d5ed4c15e23dece1440d5c91259191a22b3000951a6cf0ed56014d5c9ae099a8411158f4eaf61f1396be5971342ad53e642c909c7c1cd47e3c83b52058b2dc240ec24b550e5fd35e44e9fb1989034f20a022191bfe3c1869b64360d79da17b07476b438817cb989d1d399ac99bf499079fd229304896546cfc1604c6467fdc3410ecf8cd778119c25ff3181a0f95b31633f816ccbd8e6c6aaee473a17121b18f0ee1d8dd79fa384e0e8640fee7ff0edfcf39ff6e4cc30db68bfefcb36e5a85dc63fc81a936e3aa5d25c9bdb84b13b48e60a3a5f846ebd567b96533d01ae3e02a3de70496b3854ff16b3552d78cdfdb0d2db72642007e543ba92cb8b8d458028cd81145f2a81a4ddcf2ea657f7330b8af1e4f0723e29c065c5ab2e6db0a3dc0f229e0106d5954ce0caa899dd3838b9568323c6ea6b96d027346c946f84bcf0f9832f1ffd4b36faf5011bb4debd8f8b5dd898cf3c9e6c7317224944f8e62e9ff66e0bf58eb26ca463bff707d0f367d38047689e4f8ecd47f85b387b843f5c4bc3785c0db277d8b225f2ce1d6fa05786b65012e34a9b3b547ecb173455b96bf14e41321bcdf7ec91653c65d4242d3ca84d19c48ddfff2688e35a4e60307666399a9b401a50aeabe4cd3e71b6edb3ea0ea744bde46a8238e0d859bd8567c2624d20761f94fd136fa8b3e086e9fbd8e4126cc696b81b2372b6a972edd39945a5d1dfcce270a6b08ed2e2e119a556dc2d7147473898fc211a9883f69a67174935d241c39dcbb61f66bc95f1d05d5b9cf312f7f9177a008c4c48461fdaa53722ad72db4ae2341b52056e6c5551f599d31aa0bb3eb8cde4e697b8089980418f8c4f2a82d91d54bcfa537687a2cd73f301e9bf50d3ef4add7792b1f7ffeee8c3dffdb593eddfa8d691cda7b47dc330a47c3a116ed4994f3651006cb13e9af36fcd095a732ca4a82b81ffa391730bee0923ffec71beafb37a1844c19205e0635002bea3a81c189d3664ec24affb017d08fa6fdd304ada5d61d28c8a34afdff13b4e5f3d8df873f4a6c7ab990592a883399f8d0464c30b1939098a391ddb45b4c2d8d9060204c7e42f04b21e6e2ff1b576fc914f352baf7fde9b91d5fd0331bcdb07a6a8d8f8f797906e50194d0f3cd0423d07e253f78cba045a5db31f6021ae4a5fa2ba85067cbf5a7242f3f59c031f18a6a14214e11f9ea7bb0294342aa805b3605427a50e01fbd3aa4282cba8d48a22983832dd8926408582d0c65a02bc289d1664dd420c4f8e81b4b1a5b207459ffe5ad5f65302c8e751b8a8b938adc1d5ad44bd2339a71d8a2d5d5c1ee578f277e65861b917324053924f8d15dc17c9e1bf6646fd2afc0a2f7d727e72f2a2634f5c4d81ff743755e8f0d0192269b2524eb1c8f9b28145cbc48382f9523d04a170826658b7c4ca3297649724d3d4245de58c40c31cc0fa655df2bf1b45446794569b653beec086e6dda0043fa47713ef217044054056f45a1bcfb374611a435db665314b7decf8d7c369799c3cff76ecea2db56e838f5042f14750441a3f86729f5665435472e7bd1d168534618e4128a2e2fcea0f41c947511706590c88815ac9071043dc114da82d14532615101146bfdfe089c9e556eae0824e8aab1eed01c6b6577c1d0e4da957f19dc91b52c31ce9d52523d7dcde563d08f21e5787c619552cde1039f89601a7fcbfe90085365a4b0a25d483cc4c5de8205ecd717772c3c4300e0c7c638c731770eb826052afe79fadbfbfe795bc9374d0912a422bf4814de187011bd30f0f009b63e153d989c3337cf0b292e78d7508808621bc25bfd869aa6bdfc979528d8e6201fc61d1456e587b1f08c1540a206740a1f8a9d00de2c6c9a8f9812df909c81b02efb161fd8a350e564163088beaca05b04a963e198a55676cccb965889e617aca20ec2e93c16001ea881f0a77e0ce7542eee0c3d50c1432be0353eeda531a720776edbb4a8ab1a5bf79f8b882995844c26df44b5bd2019487c00ff579fe145c70288540c0415a945cbda3c2ae89515e4182477f450dd73ad6c118e8ed42685c4cd8f6dd244ff54021d5ee0fc8e971348ed0cf0008550c2a24a5f0c86b5920f4587b8bf8158d34da3d0c92f92cd80643f0ac42d5fe3f0187abbc1eab7922d27bdcd554bb3ca82db1b1559ed05fb44de66a27b1d8d4787a1d27ecc2c8dc8a3bd0ff805e4803899190e3e378689a672d9e49a6b3b86c3f528fab31bfbc41d6b0fcce4d6f5d20c66f0db2c35727f05fc39ea5900f718ed4c25ae758aa762649d0f2fa10027e27b6f58972979b832cc5ddc9fd69714b7ccc4be1cd00fe0c02e8509247eba1c2f4deb3c82e3b6f7a738f8f30c66f76611566be523c75eca12ace8d4ae22f3efd025bc3ad7d0476dbb793646ebeb15e39af5a8d59ccec3ae5e2c02c9600e64b3005d82d6f36da4c24d2d479db891595db33b640233c0e34541ea663d4149ccba08793f0b01ddf0f51a3e586600baba5c6765d90fa32d6d5c191302d254f5d7ed74c5a3a679221df71aa497014e41a73280a8117a07cd647c2e9b1110567a7652a51062a54ec95c23b8a3c55957b09a157a1366e7a3cd53faf2f948ac7edc2fa8c9ccf480f5a7fe15026a092da5658c70e4675cc56d430ba93ca0502e4fb164adbbf36bba0f9536b96f43b7c8f4859d8a3f12188241168a16380e57442e0942e080246aa381e2170434b7e4da677197c7d6747ceac14bfa35da94b310eafe144adea5669508aeb5e6497c9efebe11935cd60d3c52b51abc79e36d3e6dc98b55f24e36e96c9785b75092d94540d364f423dceb60582351894b682c888802ad7aa46680668a5afc2b891d5d94636a1dfe054789059acb797b80ecaf5e155f71e0ff97cb196063dce45c8550a12ebfe059390154e564a3e06a2d8f4771e9cde560523129aaa04032d9c0e402b4ae177ce042ccb561c059670bc02a1abb676cba185117216a138636c084ad906d6c1bd603e6654962d7e9a206020f430a9b2ace0f4cea933e4e3727fe00da58932f3d03f551d13233ab82e114423cb9fd526528e9944fea0c4c0a6d2dfa278483ab27e0ae607df34f4ad83d38bfcf09c2979334b28decc6bb28b3bfe67453152bb39cb6377d4fd2d45339576e262941363b6c89ad8104970ed6662ef5c6bfb1e9a5ee99c9e2afa39f980f44b31166bcc21b6381a85c78ef81414cccd582f89ea2bdf8eb56a954d25600a807a7b8bb5dac730579f8e53528e617495807617ac80ebd90b8ba03e6190c3a84fbc2cd8b7124e1002b348558ebcb1ea7f02d516e7b3da2f59f951dd7c2bfbf0e32bfbaf9190cd2090c8a0bba3cf7d8936b9ed5658918d403d30c43778124692e9b0d38e46e72be771485c223a1462357b04cf97f4db11bf8f96c32776598ab49efeeaf97ebdaec5930f05a84187f7ece6504503f5f86b34346b8d7eaee93925d89c23fa214c10555790c04a088673fe282a4fd8a08a4d5acd3bb055cb6fb08fe7fc66141e6c225cec2182b5fa8521df412891afe5ebb4c45f2fc62d37c3be3c4ee6fb39c4784237cc37d8b26f63dd9a80d186adfb123526fa3333e6e2d28bcc2b88882b2c94a8b6b31a59dd49140c49af812d1c392c8a128e2f691c9b1f2beceb2668821d9ff887f6688a880bf877cd33c35111fd9b98aa7de125caf605d867662e831f25e2a4e0f28bbf78c13854bce3e71a3d883650340afb2cafedcfd33c336b166c93814ff80e0c69f58e739f36ce710df7b91b3c72658cd0c86bce44827f348a3a27e15da354809bb8d48da87a2b9df07e19ec95f5baae2f6fa5ad9d0bca7283f719fd54d4b89563f14e91ad963cf4e2166d88cc2ac9307fcf55ea87113c2ad0a86695689bb4d918e304712d2914b4d5e95fb550a9c3fbeddb51fd3ab35b20f8be1cdf5d1928eb3a80f284515d02a419b481a30e2259389212d6c7454811ab4bba22554599b2e9917ec5a049e60339e00a3a78ae24a062180049061999de12200b4aca8403ae3e20abe7e35020d76b0ce11f04d4dad1fe49f85063a530e230b810a0fc32cec11da83ff9b50e36b22b0d28231ccea19389965be09bcc848e993f160211c59768e7df3defe60d88037d292812ed043b5619f339574d2ef5a081df530cd4cbc31cea663c24bf3323769881073ef7dd8ab56b2569616d7beca8977e725a791e5fdf35641f2b97a9136cc0b7aaf0db1880d6b12a7a7206a34348840fec0c9758bfa9d890f91539d9baf752a6256cf5824d8742b0dc1a89ff0c7993baedffe81246b63f121c8c3e102c424a031b023bc986c46fdbfc4a8499033fc665407cbfc7c958bf4c144c38273808e1879e6624f8cc12487fdf39b47c8a6daf16ba9ca20f4492904e92dd769fe5e69d5575cc61ddbdb0f0d4229d8009747356039bba86b49bd8afcf2f3db2f58993d86d7077d3dd9277e2ffb0026cb4c9c9e485d4eb49bc3c9a104b34474716c389f2a131f6f386ccf80454c5f69138abe879c71da65a037b07a1e44fef5d3105624e6dededb0cf9b6ca2030e116d3705d1d093cf7a583117590a1cd33b23bcb5f6d7e613b75f7a4c3b7eedd0ef9c95658096f915e31f6a8672934ac5b81632cdcdd9b3f29b1c9d61a465d74159856d959d6e7694a824e50106bcd1bb0bfac0d4b5225e4abaaa619ff3cad37187f482f287aef95d50a42bb2bf1ce98c3643f841d2b3b696a1a1b84c872a20548386998ec55195eb7196eab6cf14df04c367948be4e35e018842859cef552564b400f43d1ea51ebca7e47f0227658cf3fd37b9d05c97d1f6d0b627aef0a9ad122f7c4ccf0e190bd33135a16d3677ebe37450cf21b307d0ce7b5f982a1b831346288584604376f5a2966e164f70f0df355efde9d1b435b98534b6d4d6e366d48bdfc3d36e3051c01307f217b6637d2c02dd0ea2fdfde5cd041c10c4d97c520834fd386b07b0c1540bf91e64a109e9e22491259779bff8d015e14c13af36b45d475e357fa39f0bdd764827549858fcd0a53df68ae65797d9bc43b2cbef1367d71fdaa87690a39f0fae00a9c19d9fe920e886608fff632c78c4f901467eeb56d3de74934894598c298c05df29055aedda9e3e90fa645ca875ec48ae74ea56fbd7a1bbe99680709b98a30a1553c267d7a317cc401d1879428d9e1ff090dc43c4c2633551401da7b2b630171cb84eb11d8afcde0ca5ee828a14302ea44b0f60a333b09cb9ad8bb6a1ee2d3e01fe26a92ce14915a9bc21e5c3de910572383153dc53e52129ed10edd024ade57d4a820c4b02f4cb13bd49151ddc5246f59ab54db9e21b00bb934ecf9c08e772b761f3953d4e8a19e432e7d970022f243ef9c77b98b2059d71e1175436aba6873ff4f67bb819333b8bd94785509176f3595db5fb78ae30a60353f9f801c112336a1f9b3fab183b92ea0b211acf3a17f7f2202c7c1588ae183eb5b81d14d8d0aa1e1490ae031eef5758e915b3b7dd64e07a57078e9a66bb515ea19e402082c92f6599a5378a3bc7c163241dcbc1b99a10db3de3844705e2a6b8434ff43a98af229119d75f518cdaf6ff54efa5d8d244cdcfd46fc547cdacddb764d1e9635d8000322b9144e5cb74f6eace54aa1bc73898501a31e3378dd280525bc0c7d28edb7a3e02fbf54557984edc128a2caafebef0a8f8ee337d47b2c64e5c50f0ebb8886ca3c5a4f99acaf13ad717faaec7b172092bfa56e8838317076e3ddd56fb6b8622ef0f084e4b65571d8cff73e532ece9e15f4b359f4b6e46fcdad89d455b333b3cfd0a01a568efb374793a8e2330fee652dc525ff78f9202533ed723812dd25188760da8afcd3323f3bb9b8d901b077b045c26a9568deca1c7d00daafc76f68e56791f62fd5043fcc4848ada77283e2769b0c24eaf8e37f46f61f6115eab798ffbe5b7ea721b901fb6e66f18119e749d4f3261ed0c6128346584536ea57895256dd16e4a3a78a6a53e6fa2cc919287e624461a343bd0341bfd6e5d1d5fe643def4e3d69de4f93eeae74844cbd8907a233bac6b1ada8cb307dd1c056e109ef27343c83b22bace246ecf2cb768e40501bdf4838acb08ca8577cb5a42c38b7599ed7a111dcdfa47062d1a1f5a18ca2ab52146d6113361e5ffc077e4bd8e4d52ff57067f1ba5ddb7dd448ed9a10a801ae39df64839f525fa4b1afa23b1a228fade01564196aea7323e59c00ef69e99c990d5920a4e273e4b63dfe01ea2cc9e37cb4167e24ab04244a52103d1171fd7c844d696d2362465babb93b5baeaf0af4035384e79a6390729cf8d6578734fa8a008d6351363410915edac29e39edaedaca8ebd920213fb14540e5f5011ad5522d141bdc4c60c1bf12f90e8432dfc1771d58083f82e8c72887d37205439f61863f4b07fdbca900e6e4fabe4347ea6647e2230acd0dc994a004c85d2fb345a26c4b112380e1cc70336e02225af40e5a9cf969c0435286fe3083456563051b40b3c3bbb17d076997c6262c91fb74ae9fa9264122285b020c602c0d4f174fbfdea441e26b58db487435c0ded13496b2abb5265e78a62863b68c1a8eb759a8ec0cd5c08d73c23f2fdf2dffbd8c409d7f5b52f5c63ecd69300201488bce7ba1973e54265ef03383973c36b6f885ee016b8fac4845217c23b7de0ef42ed46041fa634f786628fafaeacd333bef28c43415965cd861a364743b136885f9477c6fc068dbb7b9f07f833bf7d3efa09e2b5803e1d91eac9fe69047c257d56cb3c362b452ae61e6552a444489eb4cef9667071601eb8396474f83e6bc96fe92c28f9d2dfbd825e78f141b8c0ba2f6a34444024282e68132cc80a273d3ce0305609db89f465467532be6fce12e42103167c09c3df14faa5e909a9c21b82c9fc00c0cd609184640e7198ba14b9d00c106e760fc0adb19a0803798b93e20a7d3a4bddba898394e6fd007a39d5e8cecc18f3ddd5abdff2a823b10479dfa130e95974be331c252d28fc2db3756e4402dc6d1447e173decf04abbab6836b8478e6337e78e97d86d4d406b103391a25d4472baa035ae7cc7dafd96148d5e2a7205340e51985fae535f381d21e414349f26a388fd5f95104cf4002a0422ce97059f825255d2f4d3d434c08bf6f5e991e91735484c84e5499d355531e54026c969046e3c34dc4a31aa176830c8b70e95d3a9c8077bbbf8b5376f54969a27fa20189c52ce47ddf84b4be2a79bb2b0c64b096e6bf859a3f00813330d9cab35aa63dc909d82c84c1430592d852cc092de3f9c0f77f91bc21b9f507c2c53781eda25448babab8ec7bdad5c57c2f59e016386e23c57594d49b907657aa9744a2db9e4eba2760889f5b5b86047720f255c62346b72eddcc88c22387af1f89d3b5bff8cf2476a3ca47acde2e1cc53a0a00d883138b755e8eb3c92d78ff4ca8d3ed0baf33522756d6b7ca9d4fcbc61e4202aac2b1b7bc22ed4f1b4d1a1fc8b155c682aa185ace1da062c163176939dbd0bae9510feedc6015ad185a5758de8d93355bc11e0f5f449a839ebbefb29e527bfb6174fcc62af15170b8f0f57e652840ba9ba1e4b06fb82d3a5750b2b70a8aa4d233b3f183b9177a05bc605a7d418e483d1ae6e6b3a43d1af3bef4f9de11bc528a2383ef013ddfc59865cc92ea562c73217d3dfbbc9310dfdc55005fd85ecfc20a7480d442bddcf5968c4bbd8db3ca5a9faeffe2146f1c3b538ada4a5848f02928ac00d9c6f40864e7e074488abbffeb71a65f37bfd8d6b97057e55d3df280ad1ac1963f8b01b43db0b3f4f5682c41b38269000cd79eebdc223633f7ea60fef8b89d4f3afdebf2e83932f98f29790ba717df83281fe756d9a7e364345843b28060b5659e6552c11b580fdf5d43bf8dc3800dec38fe0150200b8edd66c5f7cada7106fb8d63b3618a9cef52e377cf8477b9b8bf02520da107308b2e760fbcbe3bc00649f0b8a804460b0ec925601128fae38318558ed12d49b5de402f31556301678a903823e8f7dac9d6be5042c4c800ecaefb5c84da813311329d670c93fc630ca82d7716e2f30579432353b6ed6b728248fd290c657826840101f7e8c4db318d23c60b76316c4c5a50864c795b1779ecc69b6abe0068416579addfb8a12442693e100af295ad945ca5f4d2eecb612a4c57094c245dfed1cf7c5c12e69a0be25ff42d5442d8ae31e832edebf14d8b6d6f778a7595c58af84a38b77677ead37f59e0ca5a8bc53dc42030d4e0765813e903166601fabfa2938335b42dc6bceae69a9d9471439c6323b4e230b8020b359ef6878204ded86e25500895a3ee794067593b0137ef307d8450ddf366086a0d896b3ca34a6e65bd5cbdb142d211ba9a4415f0183dce9e144dbca8a924bf5b2375bbcbd393f1abbda239cc1afd9e0088dd9293b92616483a46f628134d029dbfabf46c41c28233a002454347aa715f44d2779a065ec8b0b60ba9d188b6874a18347d173de8b043dec680d0e6a01dfdab5c44d20986a90333801bb9cf1f2b3bf24aaa75bee29e89ec71c0a6930acbb69d1f9df7bb46e0f51f438afc832993ccc20b4fdb80027b9ec5dc00803285f7a8d77c2c8c8c0e4ca8c7585d9f38fca050d395a23df1db545610cc9e80e415270a46e5246e87c638999234a6e5d3e1e957602c0e5c48f7a628a0a313860cc3bf15639903bbeb528aa6393719eb0321b5a7e12f18de25f2754716aad2dfdedbf4c061505b0337ae5173cc7f2ce3fee4e219b73fb7e54b1229cc6e8f803d336bd832b5b882616cdc2e302a1a03ece752c789c38de46c5cba74c8853a31b8b962c3b221531886166c7e10dc7ec8c02813b09f65384841cc01a94683adff6fa8a04250514086df3dcc56b28f2af23ec8fdb1088ad119f343be5813dfdd3205ca9133b75ff69884e2818c49e59fd24ae1309fd64150f53e52e78870a125a6642125b38379a5e1ab0acc03ae31a29512c7c449ae9daf52e56e4e62e8c670cdec576cc26f1bb5940053beeeffdb5dc47ad432acf647fee95db2fb5fe24d525e318ff26f9c3f8adc572a8ed1644c84e5475dfec2af04d80e7409f8c77f0f0e0142c1d9c7e5eeb43e60036871a00519b02a6106f3860b54b4c84850941f5cf11bde8e41cc057893784d3958e9b7d669d9a50314e1cd472b7910f38d069bcd6f77c0f8a054b8014eceb11dc1c4d8b9d1ec55d8a24cd6668d26d80f967c9efcbead2bdde58b012cfc87b83c477c8d143789d88dba7805b9ffc6d1c9413cbdef76a5b360bc0d4f84f75f3be809f95148ab84a7986091b6de4cfa6ac62a04c9b958e4039a3a4a190d48d875dcd6309367234e1cc24107a55644f3c48678fdce39aa81a0a4c809d8e13bcf38274809b33b96b449993ff859c51fd17d17e899b53cfd2be056e0a1a9cdbabb140aec150faa09766c8787ff77ecb2f1acb31a8a71f7d06d40240016dc20f1683c40e5ee46fe0139f03d5ef8e6e3067ce8e77ba267a170e4d91ea9424c31324c92a0152b9e23c8f445cd829cc5baec388ab28232ecb818ce5a6acde415c8fe3f61694149964df8866dcc2fcd35ba543b70f16faf59630f540f0ab1acd5be54c31b06fe2043072b7c671c075f9cb782f930ca64f94ca3155b6fb1b84e3cdcca7f303f5d43b830b9f956854be893155d43907cd4c4a8f6ecfc77b0d77d65a8fffb028780d0757054220f3dcfd3cdb6660418e5d52cbd655c953f7f06560c9ee88b845e449a13a11eb7fda7951eb0087cd2642171013e3b88f765c850f996863f3399f474fe73233db81e0e9e633b07cabd770f4c86f664e409898ebc35a9445381618cfd3dff1fabb2b17fdd0b3c45591d19f7656ae80cc571779640a614abc307e571d67303c308aa9a97570937d1f11d650089d1f10bed02cf26cfcb4dc446080712c8a9e848df870afe3bd25530f90cf52eb6ac7977ebd1efd5d436976e531cba1174cb04ffc211a20d2750671643175fe7e05e639f3e3e8c3da9cc9569fffc32c2b93daac12fd8fcc0cbfdbcc23f120eada70271159dc08a0d59d8dd236b1341267bcd9fb60b0953ec948abc31f5ae3957acf5bff412e8c067a09f459f87cabe63ac0d3ed15c44198c120ce18f4b130396daf0efcf9f41ffdf0af2f90910f5470786eefbbef75ca3077e04efaf6c3c7ff61461598d3595f0c8fa06fcf18c9f5ae0eed88b8d196cc44045fc573b6c4684b101c88d79ec2fbeb5f2988afed366ff2000f351c78e82a013625f5ae02560176c236ab1031d06a8b117c5feb2802ae975f0311c5caf10ebedfdf5fd2edb75a0385894ea14847fe47c9e4176b82963bcbbf4634efbb36ca67720b6d69e5aca3ad8955f41ea4cdc9f55ac735bdebfc194113340835a47815b7086cda55b81950fdc7cd2807f433012ddf1b2affc80556c026f72a2b163a8f75be2954777c306b3fbbe01e39088a2d42c7cd95f97005bf9e9f06f55fc7eaa780ab905bf0ad641a9941447f25f6790b11f937260fceb1bcb3b73bffbd1ff88f73f486fceb0266580cba34325bf5df823bcfd343bc8f8ba72263877f66aa01d913eefdbdd4a699ea668969a3db4494e91ab9e345d42ced134575827a42701cdee1d64396d34322dafb5e6af94ec2e69335052aac4c43db2ec810dbf4d1c3fe2a83a0910f347ab767a7022a27ec127985572e71feb87141d6ed72ced6ad7454704c9423ae04034f16d7e2eeb44f006c63a85a0a03f5216b83407e5b349d995505b67787de5a95e51ac2732b0e220a469dc4e73490189d1ac76e660b648046c52207cbc47978926632108ef9affcaffe885a7f8e91b924a4aca1c1a5c2e2c8cff36b384fe914fbd6c1475baa7ac2a73a8f89998b98aeae421eadc4b97fe13c8a64c2e07cde18a408dc9d8c833637bbbef5b56693e5c2c7bd00e996946b12461f76197f77f85bc14f342281dfc2d4119ae8456ec156f34a76ae887fd5fa45983b67764737cd95eabdf425d384c02426eb4946e1ddd9bef2b5d2941b10ae0af14b05b06c2ea7759e44b4a4f6f924fbfc1834d11c1970950ab6877116cbeb025bc2bbfa1b6be9f3e47a09a3f777a2323bece2742c60986729668b86a4e4086366c1bbc0b3dd4492e4b06d6c39e0a0f269667bd3adaf74a9f92c43cd20d6b42fb17493adb8726bd19d126cb4b8a4a724e579da8fd189155b80df2582211977e55047b7ededdd7a3c7c0cf8dc091d696258cf18d717cb85c707c323ad76d1a31706d3301033f5e9fed13125503f0a3a40cb41b398290e1e51aa1d3d05ab20a6d824af65553daa15049e2ae85e8ceff864e4a4f47fc1e810d815ac21e55c15bb98be33d45f17a63f605145ce1bc63df199dc43b1f5a4d1f192650c43a0cfbd8568a0132cdfa6cfbd92edbb1d04c343b316f4b4e75ca3ce1ab5f257cd5016ac8df8f421ab12d82a4bce3cb62ca7f56b63a97ae11b99a8b3ef6fd3a4b59b72dbe10394eaec90732390c171e84cd4eb9931aeb8c3a4b28298c6c5fdfb1ea2f9a4c1b37769964ac9c2e80f9b539f6d4803875fec0d3cf27a353194458a924102ed2585fb8bf26a16e2792b3712c5e084d30b20e4b1f39495d15697d4c3073ebb18dbfa0038693a9522809dc5e7ed989d6b56822b355fcf81a01bc170128dc26e8cb0df69012e9363e77b4b86e0d347334219b5d615b4c408276051deed65f8f5f462cf4ae912b84c903908afe50f27284222b2e85576796e90979868a7d9238b003e1e4be5c5ba799e379b6caa820c2527631d61950158f6a32f83216d32fe1d8afb0c11890582f72f3bf6c25a8ecbf6ee3c519d461b961718f927558e28dbd7b34be1739afbfced3436410ccbf25bd385775d0d3bce07816614783b3bcc295a81c74892bb9f07bbd81a02f35725fdfc96c48b0daabfa28634f8ee86d9260a372021363ede15f116a7131f5de9599e76ee294e5b117a4494d556f910de7e27ce062206ccd18db5d096c113d9b26e6c2c570a7971c262a5db77c0dfe28b33aae86fb4edf16ad171f469df9987f771e10e95d72564c9c30964089d838c85232d501f42fe7bc5860dc0bebab898c1b76b618cb86ebb2d3502d08003090daeb719d3644f208ef4c6de169a98a40e4ab51b2f95d60ca56bd244c8ccb4be9e6566bb8717ab7331edd910499dd44e9be6a363bc6d1b5fdb30b967f1f78ae21ff10237d54234ed559fd4607c6cb3465e1ca9a6219968e5e63aa94ac85ce6244316a5fa1101481458fbb4abed89e2d64601537755b25ce9b29f9621a41a23bae9f7e179375e4fa2c559b2458b36d9c156b1f972a255fd1da952e26c0cd57ad249689ad4a93da5355c6514d9fef73d1b13e1929e57f26e01850d392b70ad5eedf0c2b20a2193bfeb88af184a11f1f76772cb0ad0c62d069f67f625572bb73e09da5fd882e6ee3a7981d1693511d283d4a6f6358b9938e40f43f80d82dfda5e48e3953b246b34359f0a2f75393c1e71d13b87d9368818b0271369b909592159b2ca02a255f279a852b00446b58e38ae0f3fed5012ba54b4aee689f76f14385962662842c2a75d6895b2e91841a79a7180f8b8501e9c82a2b6b71850c6dba13657e659fed6d61bc1d6d0d2ea58ca0e14c3ef5674d07daa0b2f97ae7663a34e9f3295dde23c843a6d3e01cb6191303a2e2cbf5bfc088917bf1bbde3c4f22ae63c2d5ae17ac2d13bf902e1c009a22ea9b25c149e5f08a54706316709705587280bb6661b915f5f2abf6b3d5c906d44390ad0dd55cc44f5d9b472467a320773aea28484efd1d3290f36e63d64582998c7fe6cb45d268fc688fb6470af7c04cc6ac9edd10f4f4d525f23c503f1de3eee5b2b8a1df5fe9ce82b4cf31e6da245a04d723b644c2a94d9ae121f310ae1724378740afb1644246001c1ba6f969d6aee9a116e73afee5c9c89bdc26c7c58a1c4707dd3b1d49082a6d38c76039d8a8e7f0287b835b4a0ea0d9b5ee1ce2a089203b998c3b944729285884b3dd2a3710840dd063e712cdf3d9c0cf873aaeff979d8aa5705cfcb8ae83a7cb31461af220a3c16056614d8e2b37650747bc37047e7a5b48f343752580dbca49a9d65244b5ecfe85565dd38f1cf7714925a42224e43d3138eb9155bf6b8f796e5c67f784e3c532a448a6bb46700d75cb4d043a4ca937719745d14f164d7a328259371319f7abda5388c3c0db27a9390ce265f97ae955d0974bbf9fc1e6f77afa86c9b70202f4df7968da023283c257c172b577a9cb8c1e4940aec90ae52700134ba850f80977044c8cb21afa8392b4df2efad0fd8ca3652871a660e45118e1e3b2dc1b1f38f98d524c95b4ce9f1ceda47c4d1c6f4d1289ae5874d0434d80496e126982b6f823f2d10eff64860e062ce80e9dd968f7d42298dca89667d70f1c593089aa5a025cc68a9dfa2a1c708c755651b65534b4c9215cedc9b61a674bf1a25b558982604077e1d1ffb168e33a1091b540360672ec390076577aa6d32c6633e9c622b5f911293b4397857c85d09863dfc84e66219c2c69231a971ae816ce4ba62a2897bee86e79072f0f278deea293233adc48fab3973dc13d5d5d5429a77edafde72e9f8b4112e40c6306f425090b390f68bc6af8732e0794a60b7dde618609471012bd4ac547276f59d250acfe5f6b9dc18eb3f9aea07874c785843ee4239aafb0c1848e11260818d21f573304f4283b3ec0eb0c6f1bbbc7c36748fb0454fe45ece976cb28e3fbeb86f5a048da1dcdf4c34fdd7089b099d388565cdaecd01551426ecc6a79946561def3bbd54dc926f5a94255c1c2967f52bff439ff151690ab2dc77b3c2ba048aee5be17cf36bfa15815ff1f92c3f53434668a4ca11ad32062d233f5d472dc901d076f5a8dd75f3e4f172e086e919589f088e350396adeb2004e636cd50ce40876a08338ad82a1b5f46bd88d47d404bea7900d070e37667503d5b64cfcc5ebc156008a1f4a7a1b7f2baa7977c4652ea2e6fefb17b55929e10835fbbfef829d6ad8dd3799528e02f2f2bcb73b13987a016e4aaac1de935d0e41a48ae7932cf9f640e5a1785f09f87e3de4c3c711457b773751e016c4ed761989017fe08c25bfcdb4e20b52e33127f4465c4568fea6fce0c3cd2623422b993cf4f88c62df10663262bf50e4eb123884b20eb674e77797484268e900f532b5584655da2a5d58b6104a36d14cda8614b4a1aa2ca6ab454ecae8e9face953eb68d4e39b199072da78706440757b5a11020f2a93138bbd4cc74b661ae7e86c723d902a6ae58214e8d0a26f2808a498dc8f0079b414e9fc6c56a1052c3a3573118d20d2158a639ba43684184c16ea233915ee28714fe79c583cfa5267ab3a519ff204958671ca4882c962993b94cb161eb4ab590a101340443df82c38904c001a03d7a9b41eb9afe7cd12aca65f1cfeea9e4c977a2f25912cddf9628c17e85531265b104138bda2ecec3475bb3dff5eeeca7a950789d8e1a16a5a863a539813b83ae4e45a9b029b5043a33552e6821132e5ddaff01abcd8b54ca6acb5c6ca30e0468e1c97f7e4b6df56ea88ec78197b67c514784375697d4fc8de89ff47effdba2258749660f4a9022eaeed1de4efb6722a207d9b0998df413f21425d4d9c0c81a2a3307b0b2e250765389a4c54e1dac938dd5f91ebc2581a6e8a28d5ea9f450a703980874eea1f3288fc800de8053caac9ebff468a1af3d7d301b18c91d60c4a3689e434df4f0bca4c968f79c3df5945d06b1da3f9701dfaea5f6c2271a2939bca61186d68714b1705f1c120ba8da6ee2320bebd5db600cabeb5a34cf0b55d397c6a8e05b1d8008529df6509c2a204f6f0b8da7609fe92028b545109b83ec12939ea173b7f100f465ccee59c0915a984b979f92ff8516688112a37aeca1c5d19465d8e4879855c6756a05ed5a3febe6b0e5bd3b819ee153033beb2ead23a561e0b919e468e6fd7e67c1ebdadde6cf93b13e4cf5cc8e84b9416cb8466e32a5d502fd83cd26bccb58eb56fbc021cbb56d450fe8ef542108a577070a341689d62de45e8bca2cc0fab7f0136addc6f5aefa78c481909409779e403d2d8d996a66a8006ccdf07d359c4957697884b3f190a6b290feb9a76cb540d48d276fde6f650f87b16d73053423e2f2647efe168f4e420cf61e18583ba9c0a720f2591c6fb821447296a93c2a779594b74b112dbaf82e322edf193f0b27f998cf868faec45d72254bc7fcfa0c6598ff766502caf79b418e3bdb843d1f3fbddf3492fb8d7f274b6ed83ab34ac71b74c0f1af702de787f0bca40a5e71e8cf38041246a608090136ca68cdfbb8706b8f40f9a7df596767cebc7edafefeffaecc0bb71d6bde6370b8cafd54ef81da9735b548e9ceba7175c007be55ea539909f16f03150d78c585de274613aaeabc5c9e172f341e4e3814265c5f249a68fe2d6ace216da519d1260b8f67b529260e0562240f498c5c4e59644934626468df22b46752b2b7ff8f59b05cdd83cac400c5c82814263ce68bc41e7809762b9da1ad87a1c188a150ddb475c1614c528556d2f93ff71b96f25095dd6293b0c7a13e5c4e5bfd790832b8cbe3d5c9efcbc651d2f5d14b781355634d8a1fc6b71b21f4ed00f92076c3846d13d4f52472dabdf3c48dfcd7b852ad53f428d8cb228da82e2fb3b82c555544e29c56441d153b97928d08acb71064f080997d0d3de0f6b157b1d22141194d905ab678d1e545c05919546d2ed28e047c50782c69999708f434e23eed2a66a814d15a0639a3415290c3e8b2a0c3cffb53da78d089192c10596f0dbe7bbd8ecad8809b4245f31903c1b68a310659cfc0c6f6f45047de7968b3a5b185d1aa3e082be32d547f44389456481fcbe316a411f3e1e8a4366bd6124558a0bf4869f450112c90dabe3865d5cb77fc6464a3a3d6f6873b32a297adbdc1f86888c3043b2948a140408706ed600a332a701367064640e10732f92eda85b23551e857401ca98a41dae472a3fbe8e51ce74e0b0a03f94a045f140923a410d9aefab41ed11f3cb6b9be848b4182b4abe8b1eb7ba380e6da12a0873c4da38f8cb32544259707b3d5c4b57ce94a52ece354e8d81065723819019fb01be178e634a892e781207cd7ba5f87f58861b1901c8a574c775dbad481d89424a38ac5bba189a0cf23ba6ad4f72b016bc2d0027580a9f351c93af51b8dab105813aa2e9f98fd552733fcf09bb23ec93cd63ca2d2b0b43c67e56c1ee24b81af6b7d10d291788170af0f28cadcc5f3659d9d970f334cb4df4e469ff6937f571b5525abf47687828f04ed8e21479c64d971cc9d08ea8d149f141fbc7b5de7a2563b71980173312037e229a4271091b4e38e1a78ba413c7a290abbbd1a9d0d3e8a592978de7b5ca15a78c2095859f30b3b8669be7ba461b588996eb594937f5d86e74be94e0079382bf11e51a48887b23a3b21a3f304a9f7010359b46ed3c75943ceb93ff448ab5451d65a27f2fdef1489eec23e9904a6167ae634568de3bfc66c315669f8fd04b42ff5c56b877cca2efa42d205e10c053f02d8d56bf3eedfe8aa53ccb5689c5f85b848e9727f3d73ddbe38938296f9f97fb3771017453e8b1bdb0223ac8bdb254fa6ac742fcdfb856dde86c6bdf2c7671fd154ea46db27a3cef2db91cb806c2589e82310719c07cef888e6af1af86f27cdc52b2e57ffc804062c82be2e93037adbc957b5ba7e5e649cdbd38c2cf54e7c6306b0748f9b6d0c04aef09380d19434ab726cd5748b6cfa07f4c358b28b33a5449796cd32f8255b5792fbce078eb202d931c1270ec7500c02fa7c91ea88987d0f76c781e371d451e934962c893ba23c7cc8d4ee9eb1ffb69a37b13d176b84bbd345038cc8a8c448f9de895d4b5255e2dd1df1feb1669a724353ba391dc3561dbac2a05ee62575e657e21b0ac57b7c396edf90d360d4e452004d53c72413912a6be18415e358227e0f2b05ba8dd2a727972a141869178f98cb8aabc8da819a044760684100bb703053e5b18ff5c5e5ac7d777ba5c3187a73000e0b77bc66de86a3b74df8f2bae5329c7e02dfbe7e16f4ef788a8f4a168c9d74d67ac76529233cff2ffe2050b093490ca268ef2133a4ebf4bed8eb4dfc814a295873d11cd72e3cb61cf124a9c41afe536b3be53581ee11c37bec1f1ce5f145f758e1a6f01e731593fb9841d7774cb2a6452246dc7e005a17fc54639d3d9eb02a1119ab38bf4a0f7209446430d3d370e4fb9ba176d5bf34feca9e4e50a5197fd2da467c2d7d60231e0984a1fe6e4f57dec80c1a505482abd8d2c40e77d52c056668414c721ff3916630927314a3e33125831f20e268f1038b5515732da82150a5d6c9b1aaa90893bb1e46004f67f599472e3bcf9ac2aa06b085314d52703db3e8c3c4c9aa2421df6864ed31b9ad902b3b4e79da872dc2c9b0baa55c3cca5c0f6c27fd306563e2f2e290f8d3c13e734341224e75b02cf0459738c4c9d4b3114c1ade2db167cbde48a70f7a7d6c734d7054826dcf20e876e5234d30bd78651363a7371644eca555771bbcd8bcbaf0ee8da00e5b7636665d3572a6947b63c5fe745ca32b65217673dca0efd1873e8c4384e4439dd9587851fe512b658c0e2d22100dc0ab82d26af10e3177a9c90808763f1e44301c57acd6a31d483c5686bf52346b598f6d41e5a06238a413cb84a84cb1744755926d06580a4078c3200de357a014d06e3d24d06ec5a11a27498b899a18a4250e446e37d0173b580f09b45a08884c5babd8f8e40650f8ef4c27f12d96ec33e7e11fac70e2129c407b7eb857c22d622d4210ad31157c0939e1a382af3aaf0ac27cb6bda79d908085a2ccb8da5e07782769b1add545e6a26075b8750a7f6e27692b344b4edca853e44340d6414581220e02303e398912ef1d06402d032731458d06e2c05bdf7cf70a0c5c4dbe063d54ec56f50e1fac7fb4d81f77f2f6f27038adfcdc8c101dde9d6d775de4386b4bb95b508e6de9196e70829369ee4ea095e14d297ab7ee98dd2f4affbf7967bc2257110608e2345ab8455513286421d7c357a18b6eb5611a9f89ac6d64842c676b7ec0e872a6748f6b4826dca52b6ea4093abbcd0b2cd6ca26f8cbe188d7bd829b4f7408202008ae58304b0f0fbdfe6e0b7bd6a14f62595ea0549a8f7125646afe178129f024d81079346689d12085b50c92dbdcf514556de89741cbc8cd42a68c8049e4c68668c2e8c340caf411cfbcc570335c649b0a6b0f3b789f3af1c878716561eecae0b62f6fa02ac8ae06bf463fc04dbe848dd7c41350b0111c6b734bcf804158d0c48fec64c99334f161bf68372a1b60508c739a8c7e2ffe884fb3e2150308b02a5d3ff2c042bedce85d9309a7a789ad8e9eb3ef48874842c9f0b1db991e2599607a52c75607ae60af20eb059c1f06f90b57a4a65357bd093fd52b34bd0712eca3c0b8d6af1713d4fd47644d5a43396bca37245aaee77cae158a8ce61c3d5f0f42130a584b802634b7e3a3262bbcc95cc98ddc8f123b35a1590f80fb8b5c17c79da2bbb5e7ea80c7bed4ee120d91bb8769679039e545b17931ba1a1ac6fcd85d6af728caa952147e9e0863bf92a8c889493cbaa9e18986e7867a70f22b86030038d7db25ef0c7b664f338845dcf1ea4325c526e62e97b2ee94ad32e87c056ae78bf05c83704ac43804ea3602653b19ae943564baffb620a83b65d532bfd62e539a54bae626df27d91e4c54465a3d45290213336b039e022764b60002c597bcb8acce049084ef7d340e2ca17583556a8c9bf6eb55e2ee516e73d3a7d3fb9f46db10206f4e92ab0f947a34d4b1749e50600552667ed1e88634450be8fb49851d401fa1254a245675195f239e58d0aadcb6dda106c8c97af6a4061d61d85af980e52c5994deb62208af22ac7e6cd9a2340b6a47abdb1b6ca1e788e1ebe03faf577614a224f420e1b3a212968fcd10fbba989ee7ac8d2edc39551ce5ae5253d08604599932bd662e39c4f9c23147794292ac4809f11a2b6c09c7ec43ed8aa868bccbc9049f0cd0d4b0aa55afa84a7def5ae4ad28d907492b337ce797a5bed40849ed85dccbd90af0ea7c181b0fc36d242caaad5c3eb8701e1dc33045b10961cb92f2a490d984f788283eff5d34f1e05f42b656a2a799c9a3804c7e5d849c43a1906296c50403044b4742bc9ec666847ec5bd759bc1ede9bd97b33a11973da03c2710deae80139ed84e1e9310ac13c7f143145eba24b138b38af419e873a2232bd0d6f2c9db35953f51fd3ba4622c82fa13367fb8c9ac0ee7f0ab78aa0e57e70b6104f2883a59d71c6356be6f80418bbbf83bcec5a1c45b89b065b7426fbcc27a616ee3c6004c448286fe4d0c689d8e0bb8df91a3c551db2e959ce3709a2ee55e684c4f999a79434907924218384fdbbffb780c339f948982bcdb863e47c74e39028eff45a5821afc829120daabf2d8c5d168545d5fc6d8dfc0ad4288d85180caf1f650a4e4cb2c1d20dc32c2f58ca2e51eb6371e82c0768a2455206c9dc26271d1ce3c2cc4335392490f4b6bf55c91c89e86b3d3a534e2515e76f1e1a41460de737398feae0177d040f69bef02729d2cd1fa7dc05bac588a84b6028093b9131cb446a84ca43014c357c270ca703082c97f4a06d1f5beac6b92f7d4c3d2a44258ed6a4cacf7aaa429d14511b3cbd120dceb5b6f8bc87f655f4ef5eadf8ab7b7038a3c18b1f4c316d83f6a080510b52310239a9712aa70d49595d142827c48b50013c7d7e876ab397d3e0ff548d1a27b79bf22d2f4b56ea900494566d3aa97e93547ff3c48393f058438b82a06c0729f1c89da9aa6b5768d0c052ac1bb424764b6358a6daa04d7b151fcc496c978a5b0a53c88a1d5caca0321a87004a658ad85cf79c014dc0bf4403a6e7da6950826098019101f95d1163dd6df427b07c3201e8544e0ec497ae6ee7836ea7f0c58f4e0e85640d1273508aecb3b8a75a2d3c63fc1712dfe54a2582669b0c28fd1d1511df10fb706fe7b9008ab58161969cd28ce697e83ef958bc7c780b5e2628b6e2545c075ffff62efd9847f85d22ac9d9f8f9012feb4fc25723c06a187ae6af47b135d099e0a7f97ba164a30b3fc914ed020f0f4f3eb6f6ce4a74ba332492234ef125dc8c175eda800044b56b67672debb8f6b72b148f99163007e44c96b2988fd9967c3e2c55426d79570e370e777a3589c65320004e1ecdc7c7702aee5a738177c9bbf0dcfcd0845955af15fde6dece6e68ae058d2afd383d99e16c319c266e31e152c48481a343ccfdd919237b8c0e018388712558ff7d53089b22dd73b69170d7c59c0538282c261f0877b84fe42b9d72466ae59ad6878d0c138affd462d196fec0372ab3bd1825287fed87ad1c55b8e8dbfcbebb18ccac8e633b1b0cb64de7d1b328911dbad40118974c051ea1d05b21deb611c1297b1c7a4c3488cb9d28d9ffb35fd83a64a4cb783a4aecdf836f1d057b67d5041f0f547e2a14eb063c7d38d9d96255713a3e49d46c85a42ccec7c273cb017555f21e410b8fd1bb602710fec26d66528eae7f900bb0de63f79518c22ceb0aedf817e12dff178217e4121526a3c432b3d1d24dbd5741269fe6eadc5893f71b3ce9134e413cc6f39d7da0994199ec67994b99bac72838a030faa2e8276fb283cfd8a058a0e57a4ac863456259b72c1a514081722639360d29c9747bfdd18454082255ef2b79f68bef124b3ece86ab2feb934b7777192e571b74451fbc34422983215fbde56752c2cc04597dd10fc4cfda86031185a661576148acc59e6cd33d3c7c3fa435c1360392d26798649504e993fa6dce627940274919645e05a26bb02c99662f8084ba8295561ec2bc3ab4cae550499b0a0cb80a13cb66fb4b470778af132ea2d21578ed610af7fd3863d1a21734b7736f32e2c7aa63d13217cf7b354269b7950b6375938b69e4dfeaa0de6d576fa9fd3bac8d601187ea76ef7ef20889260e9205118e87572db9fd6d4d92bbc454266492f073fcc1b9422f9ccb7059f8035c2003355de9b0909fce50e52959725510e76eed76844dc9d2d2fc36e1ee5ad9fe26e617cb32494e2f6c70fc331316040c9a1acb2d5dcb4f3a50bc2df08bb9abda09fa539bc98a8578940d91aa9abeb90488151a20b556c04b4da540c89dd45203f7dc5a92c0c857e25660a855c884c9528dd845130e2eb6774b8a85dc3e189ac3bd97c1bd3523d71a83ad3ee399cc04120634d8c09a1872a3008036d84016af791340208d2e401c7aed864b23ea10c0029a2c203d34d43bd674449d144242db141450c400518300777d70f2566270f0acc44487e25150fa7a18b65db73c7c0bdfc619dc9e76b514771590983fed24a955211835fdc3feff049d805e4e461730b63cf03f95e08dc1594bcc61561dc22bef1b8ec1ba9369e32ce64d78d141d6e029cbc5a5b2b24b4363bb357526d123aecadcc95307ab40e648b5aa60cabae0618e07b30371130789521aa17bf146077c5c589d09520e4e0f9879d62d86411de30a5e331696e2125e77af5e9333307e299523cc57e57d687062535dcd0b1822726f0cd93c41151daa22b9933471d1f75fcc0c2d99a1448d49a93f3f2a88bad539f928f2a79f04842d7f76407863c27543d80c09ffd83e19bb20629cec0aaf0a5ce1800276c3b0f76ec927094d49f0d32b567dde055698b7fcbd2f53542296bf7564181947182f1e8b84c49c48a8166325e8f4ff29b7b5e9e58f932b0545ca2a5de37a4bc0e8172ac79d74fa22037eb60b0b52eb6d98f27454ecbc22752060c1c4284e0dba6312d36569251d740a017f287c5600873c23425da6a575685a7c010d29fcb1bdc6e61f92a9f0c166172c759d2114839ba2a6e0176440341f30020fdf9fa1fa0c18cf953314268bf12a3db4f0451bc646bb3a96a187bd91980c7522f60281e01e921a43f13bea6c4d3194fa206a75a3e70fe7911c188aff91e2eb7ea1b7871143313afa003fec8124175aff87ebd67d0b856e712b03ed73d1fc8f6cd601d9fc8d28c6427530581d2c94c85c9fa0b06657e8eceb23f77917918bd00a7a4c7c9cff775cc9d623b18f051b004ba15a773f51fbbd9901242885c625bcf4581b30ddd92944a13af068ff240c0a8d48c5bbada410a1179ea25357a1de8f6a61d8e828bafc22d1a922903a9986bf71f4b6dad4c9c9900ac8eb892a285201b038a5fb04e6ee792119db1e133ff9b620264ac764eb563c3a8d632c0bbfa9c9a113d43b8444a0fc00ddddee9f6cef2929670af2410d3f1b8eec1b2a53ae6b553a3a49a2c4cb8ec7efb25a9b604fc2bdeb6654ff64ff482d7589d90c39cde43d8771932ac9cc746635b79066781a4133716e18137134311a1124e8ee604c1eb3b2785d93e2dd3a95ce84b0334422959266d0479b95cfe2dc972e06b2a88fe8bcba9603689ae18a0412526c2d365ed3c2291b8d9ca0dd86db2892ea001a075933319e7a03dee3438a2955333175cdc16ce67f210eac95e00f46e8373f756d12af248f993ac93935c9689fe42499e1445b53ee54c6cf5a30dba23c934d9d2305f47e123ab801377ae17fe1522ff9d0b50b976ab11b554e4ef8311b37bec1f16506aa801fbb4f71ac58d286684630133b994910005aa1000d28145d2b58c71ad66a9d2534a6611bd3900668aa00263181893b81c94ce289b1d9cbebcf49fafe2b6080b189e00deab301ceba87bec0544bce2248575f9e7bd738a6e8cd82eda003a81f7d4e54661ffaf2643a1ed1e9600ad890ec975921c6d11d63f353fc7007d38701a8c684c8c3e997a1abb695165a9b48bf0ca07e894984719bf40dd8e0e1346a1b8023fb6d265447ceb14d54f2e0acaf7e99111165c80f285f451ee1f6cb2c9d6838e02f08b231f96be856807ffdf5b0c3fdb3ac19f4e6042048d92f339eb0137ae19e9223acf7cbd0dcc009d965f04fdf7ab88512151b0b5ca9fedacbe85dbc02f73cd05ff073d21f14c424ff9454c5e6c0ba70e44c906392613792d9c35b668428959cf7bd9b45f724c223f2facb86678d2874585147a8f834483d4a6fdb2f83e4fc94913912a1e1324469bf2d89a2585953b7c38451f6cb5c9a0abc461884b64488913b4028570361dc95b92142d9ed1017b5acedacac4a2ccf3b4e18164cd94f6c719d0701f56522949075b023ee052d97738b8471b96888e783dd84b397d8a77297becc5e89f6bfdf92d94f03a7af08a35bf9fbfebc9194e5040dcc3bbd2601b1290ad4455f668985c69da4301aac3ddfed499e9d571df1fa32cbf605e975d2f0c339cfe5be8cbfce6656aad218a6588ee12d11ea8fcb0afaf357a60aeff2408e50b4c52534d292425f267a50cbe629ac06f12492f958422ba89a8a704ac488e3c5790504fc23a2f865051a60bf654e0fd3858af03538950b173f075da62a82207522fa27d3ba8f2edc12e628b2d7802ca0b35e3a70ca50508d7d2d0745d054e1d097d9671a134ebebb4258ffaf94ebef7488ece5e1e56568445c29e6fe53d6931d20183236c921c0f94730a3f059009115b478fc64555959f07afa9895bb9fc4478db8def46b006e2807eea26ea1a7382bc4e7acdca13a9f8155776885f966a5dc8290b00c4a4f44fed20a911a3c11d83cb5726c8fadffb290ca7af2b73b7dd55a31801d30aec9968faf7d130acf49796fd88ad6e3495b41e75420e156c84d44bc95f7ea1002895278118188ea5e428cfd4f48ec0f4c3addeb6ea48f08a20e02a65f49ab8c8b07d5a54169fb2d864f57c7cda35a37844998bb49756c318bd27bf45dc321a3693dfa68c1f7aaa4f084525c9db0cd4d620b14ce2a63d0731e26c5e81dfc0babb6ebf2b53501984de6d03c204375ee00b19702304076a900e051a98940604acd2854b82f860d155c5c0a4c88aa70019b513a083cfa1ad028f13585811aa76f108a094d63f1622f058cd0b8222df46dbc7aac093207b5c191564a15ea71e68b9aae2c30f82a137e8a94f3da1099aa1b4f1a70ee97a2f816f0610039c69c6190f6efc6529b092b3c0f44ae083f052c8e976d2b233acfa508e08a68e197a08f651a4b947494417779bffb05448c053d23e2b76caffde2e3671ff172dd19e5a4cda3f28f4de6840566be1b04f9c6a940cfff7e53b640a03b5e3398084ea589f06c7e859417508cad19a66740f168a80cfb25d322fb94fb114107266327c8e350d27466f272a1812e323588592b9049425180b4568bf61bad4875f91bfb12102f6b2c5fc5c73e0afe0640611ce5602b2a8ee391bf16f9ea5dc49e57f544ccf285657be3e39f836dcfe11fa1845b9ef4d3b77577396ce585d9a762533b10f228865c8db6609a1c7abcfe68163089cbeae5251b9989454eca5be2ec73aae743f8dca7556f5881f9051256af5f708017c5b298d51bc2f85cd15a8f3646ba71d8ef17a9d5adc0b2ccd51b36f8a96258a93558c5b0e4d51ba263eae3a9cce4e459c9fa80aa8ab9bd188325b1c3ea15d844c27a0ba28a905d020fc4a46818ce2928820fc368396160a0436189fe19e3d1a4da2b8ebf3da8df928063c42d8ac3f841cb073d61a7254628e6cf55a7d8c1f4748e662af0332e76028350c9fd67961a90c8aedb7bd6c3f2c8684de310f9c199441a4908d5d40fd024f9cc4aa4ed2cfba264a7b27977b25aea404741e61832b69ed40453dd19e1ded2acd3ac4be9582b19ad85e15bf1ed04726dd5ea8bdee05c5a95eeca4084b6571212949dc9017f271ed56d24af2ceac500d51982e3a22aebdd6038d91e2851d1904abbdbbea86c48b8075b015f7323e6f61bf058a5fd07d30c33272acc426720f54443675f0432ee646c6fb06a82e3ef63b1ce18124f62e112603d1c4160de7059e5824132ade1588811e35df58c206fb9c9f0a0b4c924ccacf53fd04242f71ce3e33b922af40cbd50037f2567e907cfbd004dc8dbb9dce22027e186689948eb92ba8e4a1df0fbae1f75f1b1114df14b7de44c27dd8af9d7511fe3a93b44e683ca61f454d8026369a90e3e1159ceaf47ad79e9d1d2b79b496cfd3ac46692c35a13bb3355d34fad3742642d4bf91b95eee6851735139901a06e058da2d1870c48f042d58d4c42e06681270967f1c49903a1e81b5160948d4cf20185f4a49f89ec82c0648aa4b82be9b1f781c8603433902c84a9817c631b25689011762bf8bfeff07920933fe68ad1b11615b784582a11bbf671a42cef153bf010fc94088aaa23445d80700722974de478a20aa280c0eafddf21f82340b11488091bd58dcc0da188c62aa7270398a500ce8cddee6f24afb7bf2f4e87d2d0a7eff2b501b761f49f81401587f10537a520a334a3032cada6996091ec4ad01230bb20cc5bb4f63090fc0ecbc7fc6ab2f34de07c7550c6d5e969a9005cd594584d180767e5313417e3940a63e6068039c14af7e0ccf8c4cdc6db017d1384b61a6e00e3240a46383d184475e0e42f267c6ca21228197438c9b2000018181823040c38c43f6e87f10505445c091db775d9dd35b8b917227e0d4ed22f4970921038faf06af7f76fa212e93212d82419bd8ab11ecd25475c248edb0b3debf4e43914946922a5c3fdf86c1f5409a565d12ec37bfa26814b828a6206997c9328867b3fb9ab1efb671a136561c58954131792cec1d2b12fa14d8a9e6fa691459a15813c3c019d81d5de479511e05b69e4fccb1517956c058cb72db3ac641222582711d3ba1ce33578d26ce19043b904f77f5828bb7d6e4dd24ac755e2b4e96434d1c4dda16d03d348facaf6926ae46a12a2cdfa6dd148e5ddae72da6c0b0e0ad77d6445239323a7930a398081ad743527197276dd5135e196cfec9387efd067a946d8b0db9caa719e8184e92ced38e6545e345d46aa87782464d8e938c9488c7592d9f03007128502ce17299fede9c8b63c40a4cffe2c1027518ef3106502f3df86c97528287991c8e38f189c67fc00286862c59d259ff4e545e8e6ee4c38b73f7257080f3709b7aaba290de944332e249cd75e17a35fd238b461497dce44e82b5547693a30cbc051e17c5a566133fe6b4d015f85d99c1bb2bfe78456302ac083180fda86224569cf3047f50f46461363dba6eee7b16f5f2a4775ab780f21cf1bec9bd1178ff0129d008b098eba8daad507b99467f5127275c68e4ff60e3398fdacadff15f11d04c4e04cb3cf3b28e6ff2350f250a10ebe89126fed1751305190e061865c48fa5a630c513860b463afba6828c7375c49751833c5bfaffedee78bb66d98945c2c3970601252bd4227e33968367e245557b14628c6254a3ae87adfc37ae17c3c9c3f2baa3f64e36a885f7272925b79c0f655ddae4b0bed8febe710a6fd0622a474df1c7bc830f2b4a5ff58bb5f6927ef85427682e7d7d559e3b7bc44cbc57c3a166b3e7be2320098e8f63511ba54a303c7f02cc9fcbb08f60154ea222cfb9bf16e88b95ee1748a435bcbc365a916b9b3168901c76a627c30a3967d9a94d4c79993186d97a7d71fd2aca8845ac91232cac00c6e92ba6b280a06ebde4d401d2d9da35df32a7d2e50a8d5973a2b57df2290e8d6db770c8e7fb3e03da965c2cac951b55cfd58c879e6e625481b2abcedccb01f2f6dabd76329e1ba17908749542c69a7f7450a43baca1159aa03405c11318c1e0c71cc99bc54858cb945362058de66e5fb7e00895f912c08a8c72020efc34fa7aac41986393632da2713ae35a8ab83588cd4dd1c2ec078b341b0df28ebdae7cc49651ec4a74a3e030de94ff89c2e1b20d64aa0160c9ddf6537b1ccc88894a00789dc3ff6c7d76f805711ab3b3891e0c77fa15ca58a7c498b26aac110b17ad515ba45511e1220db535bead87ada96f330f670d9c801712e1ea87fbbb73592b0747ee8f050e08cbfb012310ac3c39f060ac26ba89b5546d8020ac1bad4e3c25ccceb28c42941b4ac695b7fb93a4e7563d70ae786a7dd32ecc3d22cdfd8dd0c4b71caac75200d43eaea04a819cf0c26145fe35a79cc94dbc8fb75e94244466f2b588d5d69c5467a84f8e6590f3c3715d90b61ce83ce802f8c062c5e430c9648d39dc6177b504231424e01c7cccb8326f84d6890e1eb57b5a70265a7feae6fc20fc11f7b3db31591031238ff3b0c3213a85eaea863d800e3fd0f7e92db1bb5f2032e9b9ed897d295013058ca368cff1649eb395d0d070e547da3ab2ffc058a57e31fcd9fe7dac1b4c5737abb176b35c2ac681d470e714153d0511218144ed2a60765c0bfc726676eb803354aa0dce01affebf9dc19dca2b0a81c470b9a42d1b08d4409072f106dac5d3e92aa7d609b99b22a380779a231804a079acb1986f8566d201f9f7f7c598550a1ceea09dcab76fa505f42533a1a6cc9122159610ebbfbe96a9dee848957b473e6641ba65027657370036a695ed8ea5a710412dae00ddd365c1fefcfa0068c044afd6f3edc0fe28ba76215e0db4ed7f6dc50868e96827f1ad669c8a8836a7c0cefc7cc29644a512c03c2d4772d35e485eca8649fc5f734b16c95c994e4b65ed7aac5d7cbb46fb776780901cb79ce3f9cf60986ada99db2ea044f52ce6cecea31d40324b7901a6cf060693029ea01b00408ff331beaa2af9f47adeb578afce2c6fc025387a6dacca88cbca017055d61f7f0822ad1bcccdb652e8a6f6c4bc93596894cdfaf2328452b056b9a9f9defbbf0a12aae08b97fa84f767babd0f9de7a37b7a849001ad36c2073891a30816bd663119fb8cb0d60ad68a01963058a0ecc33af16fee97fcfe53ae94ac802ac0c2854935da759dba5ab68c0110a566d31e58a2a333a9b54e45213330190bf81d8b88b46e58c57761caeb82746b8c8b713c007c3f098a90febb00a8940bf2ca7c38b78a3375f1641b03da1d3412a2f503839a82544459c5d2a0fb9387b7975a4aba4a57c12445227b9b12496339e156adadd086e8b9999c951186a1caac625ced781bd43141a7e38104975e89f7ee9f9d87e2474be208393c3d593a11720d0312c6b17288ec2cff4b65616dd1750d25d5bae0c302ccfa02169ff9c40f3b716548d6758e9d4fbca9d5529480ca92141d5f6761883521ea696f2a525fe57687676b4f96e2cb16f9c3ff1173ff3218fa1d4bff540d65441fb5bdff22fee1b5b4a5d80ea3c10abcc774b7fc2085d75605c3c5af23a33f83f7be0fbf8c250226898defb907fa1da95e28447f9272c53c713b30acb08aee68c1e87a2c25842683b6d2df79d1213aafb2e1ff0321dc782e980599f50479c0d48caaf3ddd4ba6dec74e8920a01dd14212b0c82ddf3d7c59e3000c8864ec33c796d4157ffaedb94afbe1933f591981d14d45f3335cbd93b8c3f07b0115e8ec5e8b1bc2b5a93b32f5bf576f244dd00371b81a8d043d88476dbdc68a1dda50d48c7c64d5fa2f6d75d9b1b0d046face55811e801081e749ae0ea5e3041111ae32110d9b4e1bc174b44ea08740b365958a5cd20b610186310eb3b45f5753194adb48980ff995bc292a811ff385cba9ab2e5d6754e45bff2e93882c085bf3a00b76f269308f51fbcfc3fd09d4269415faa8b45e25d76e82c5833422f6800e1d1b19b205647d85827644d091ceaad82adaf1961e52e92684a71cfdda004ab9fd1a286207b167e865ef7c7ed3d5db44a2bac0542185822f1d9f141bc2744127c2021c631c46c97e5c45ad6c11bb1a6ea6d2430b204285c98c4ba0483a557995c44a9fa404ae52ede822c651b21cad155b35664fd53768ff629c3f30cd262a9c2bfddb402a3e8696afa7376dc3a4a241b2c754db237847f7874011b3893d535716648f221b2e6b0370365bbee82398639b82990074ffb1c7fd39b422a5a5fdcfcd617538e2e0e417681ddbb918fdc2b02d6de2fc2d08a6a2b9342fd4a5f43c4e9d3724a209d3f93c12320851f54800b53040f7070768ecd11d3d211e5656607f1957e576c0c167ac2dc68bf20746c8106647531161b3481ba4f866000238470938136cc7b7d7f248a3b6cd456b73af46454c5ea10acbc977a54394d3cf8993d51df3a648d8486ab4337b5c594018cad758b307b5cfe9254970e0532d669da204a72aa7a2c3a0730705606b4d23da2e6798330ce68b27315eb5b2618315b0e6e97170ecdae65df31cfed6b5983ee8ee8bf8ac899266446b164397cc30e734b890538d75ce49d988b4b437014767ea2375a8a62058a4cc07ca51895700410a1f78000f42485f3c1d143eb4270423ea60544652c1b23179e72186b277cc38ba7a67045345fe6590103e8ce09da7cc327a81f0a1fe9f2a26056a95252899c59a2eb40ae8588141e3c67cf0b13bc9de63b51eae809a5c05c2b898cb0e43d4720527904f20f047e22b2418259d6194398970569e6e724c338e35905adaaebe5384e5134b5cedb7c10760f9253e2d906db51cb015128d70d0f4074cd6531e8478d3dee4f29b7c6c067d61994c8e5ef517fb25f31f3bb0bd105fe081c550097b0ffbc659a87186917e94dee996d9a72e45c2b7ba0f4679dc118bb2bb13f9db8c666627bb2926d30e42c2c7057fe032c8121ac2fd59900f76502989ff898ee3d4620d6cca0a80d209a8b0d8e861405a3c95d61190daa0ab11908b5111335cf18e3bb991a25dc63a956771d18cc90717830411d27367cd853a0ffe0879c10d2b16363f6bdd5cc3a9f84f689c711041e0edf4f126a5c499afccee7cafd3479ac8d961ab807c5d4401637b11765d13834bbd2f9ce3ac8378d06e1eca67d3bd9b7261d7e883748285be8efb3e9b00fedd55777d4d744015b99b94c823ffd8b2e2d8ac54c832930cd462d3907577aae53828edd752add0458f5f98704703cd0f65fda62d11336371659def9cca431d847e60c241eec3fd9ee1e72d0dc1222ff28b9cfec789645b1ca1baf6352a2987b717f98ec8d93b4011925bdfb1269c5b15acffb1d4935e97ad24d23fd4eec44cf4f0b66e8f583d4b9126a60d56b7040dfc2f367db46220ac5488bc2a185dc439a6f4a60ad1df52785c898c7d2e4f064960d611111219cb9c54619cd6d0c400ae956874da2e9c123863dbd7f0775d219df08583b1c7e2c61656ebcfb07b73c4db756546ad126d890759dfaa9a0b1ef0c378f73554a3c81c083582f4652f01ccdcd1665691d6db78cd074cb26988d616111acaeec67cfbbebfe367b81170ccf8e8bbf4d92f89f71112eadebddd05dffee79744e9ce862abf162e1f3fab8ceb17be08b28c82321f5bc23fc698f365411259561b28edb150deaac299fdf4cc6a9ce994d0e8830359c29f11612149921d4495cca2a3c85a4bc63ce55f0896c812ba82d6132c615e25811897a742bf5f7e46aea609d1f2f2592262f79935e63f98ac445e0d42a37b8503ce4bbeae58da715849d01425624831808818d26ea031763b55dbc2ec68bec735c5b6951c1dcf5ac14ef200c43d09ee4d27412ed62e9bee17e1a1c4376d991d6e255a473d951153942564f0046746fa5149a1a91986e73019130c9def37f48deaceee539a2ebe6a25eb7145bdb1786c401a94c8d93a5ae5758ab2fb28d6a14ae0a7537ff482146589da62c7cb0fcbe34f726ea7610ca77128361faf0623832ed8a955244007d0459377811a2efdc499d8154d6c2be1c21954ecd7ede75c91811f4d8d1f002fbff7eeffb1f114a52a4251cae195c192fc94a639b1855aa25d9b44f4a17aca493b4b2c43e11aa623631db001820723207a8e2117686a611be4891160128ab917b724badae84a55955a1186c96b5239b30a1c570ff7e4321e1274f6fb00b5dc29cb5dc68090a341051507867cd60b83be3bb383c6c39b1bee8d0f817da52b60e30e8d8734b1c044561c52d90c4e942a895b32e32dcf8c52a1a0df29d48b9f132f930bbca599123161b77bc1031e8fab64fbc46b705085a372c9bfcbbb5e790e14fdd8448601745e049e40c503114f10705a9303688c37ac37cc106e14a8082820c739bc8c5d11b1ea41ce11cad091ec77209b1072449d99992926d148efd5877388f4c55640fa371111111149713a3185f1d849bd4374ae6f6666ed6e198412e713140f4c844221259e3899c941c60810324230e124f3dba65145b28d0807624266893b842c81832558e0ae4d6ffad2404b707179f1dd2f518025b25c19f6339f93ce464b04d1b25036e226df038a1e0770ce6b25fd7d2adb9cab54e082224aace1aa183857c1c00555121c8657922bcb527c088c2fb6b8628a27963862881fc6f75e7beba5775e79e385f75d6cafb5b65a6aa795365a689fc5f5565b6ba57556596385f5554c2fb5b4524a27953452481fc5f34e3beba4734e39e384f34d2cafb4b24a2aa794324a289fc4f1461b6ba47146196384f1450c2fb4b0420a27943042081fc4ef3efbeaa36f3ef9e283ef3d2fcf6b9122752ab2993e134af81812c44790045c09b80e705d437c0cf17180ebbaaecbb9ea05ce556c3857ade1022d465c385a76e8c142124de881730e07074a428d9e9e0bc7c7909e9e0b67fbbe745d3e7a845cdbf7a5203d489020f9a152c3054950e1806b8810426c49a2c7399c249024c183bb34924f4559a205e742a12164e181194ec875e4c805835c6038e7809880732707389721c0b90de5dc5ba2c6e938e765892c37599e736e892c37ce01b13d80650658b8d872226523edc2b60c0b75ce552470ae1a8173d519305780b1a31241082a10385799e15cf501e72a0f385795e15c4546c505e8ca7565872bdaf5b16b1369590812b9901cb99cabc670ae12c3b9aa034ac698c281c610c381c6b0c3396783f36100ce06dc011a3850078ce0406208e140626c0712e3090712e3030e24c60d1c488c3b1c680c1a071a23e44063f8009941c608079281e240324c38900cc981641ae040326038908c180e2493460d0100e2c3399b12c4c0d994e007cea60453703668c4381b346e703668dc381b34a6b3412389b341233b1b34ac0000089018381b203970364092e06c8038c1d900c982730e861f352019b86005678347e56cf0b071367808c0d9e0019d0d1e479c0d1e3ace060f28ce060f91b3c16373367834c0d9e0610167830719ce060f14cc38e79c93c10600d0508522389b2a48c1d954810bcec60a206763851c9c8d1586381b2b14e16cacc0336383116a703646f0c1d9182108676384e86c8cf0c43907240039808a0c71a022d7818a3471a0225a1ca84817072a9285734e060890187cc02003801f54389b35ac70366b60c0d9acc10167b3060a9ccd1a3070366bc0e16cd6f081b359a309ce660d2d381b36609c0d1b30381b367270366c08e16cd8a0ce860d1c67c3061567c34677366c949c0d1b5dac3aa868d1c3900c544d66c0c20426e14004c0c2396761e811d9302c6b81d58215906003658c5169002bf1cbcb96f2b92e148695b0f4f011f299d6fc756d9a490f1f278f42994c18d7ff2a692e4d0ca072512a1c43005c131c0f403b6678f161e424dda350a46cd3704c9aee72048c2aca17516600038ad26570501c284a0d03a0784004850482228232c46f3ee327cc004858c139f743bfaa00207146483b791446d299ce085670820d808e7882db7c0f1f27ac9f4ed8cf7552728411ee889b239cbb7086a4360e8e66c5b9008b6a09a02797735d9ce19c258413239c1399b8171c9c136632615c046a2285738eca55d3c486dc338c7b2ad83ff1643ef34e884ed8290b3101c085a3653ef35aaa08642c9cab9c174e9034efdc153a689834dd85eb4fe4845d711ca413a40609a09c2a9c73f11aa2973094e6ce39d09226382d0b492e4b9c5c38ce5511908073d5155a6481c51556541170aeaac23997851e112220254b28b9ce85349f5d1e8571ed3a91aa70cf45b445fb2e5bb4c722000732620e289a7405640417ae8a73ce0de7dcc9818c9001548414404504c11539632b02012eca22a6ec684aaa075410d80194848b93d7342f4af24149744217ce0f276c499279e124f181248f2c74c2489a0809cd1128b80ba79f485bb454e651a92a9a9203547fc276360ca3d2bb682a9a2ee5f82954808e3cd0919bea012f8ad5c4838ce8c05d3854a450a192af1f7ef8e10607327285112b8c6c464a2ef3a222174ef759114d34440432e2e4428204897395028cf4c0b182bb709cab4e385c403805c099b291ba1799b817ee0567080e0e209c18409809ce3921a292be2e9c2117cee83a91aeeea92061c5772c07a71c0847a972b330e5d22a55b00ddbfaea829db65c21ee51da95e9d20604934b350d08ae4b289f5d5aa5cac9e70a09d1e4da3a21cd35bde9feb191a69d6c5a464af95ec28298ae2850b49086a30de0ba4223d475c248a31e9f61ffb409097279ada4995ca19e28533d3ddea44f3da14dc34a98178f714e429d3ea947c890203d23cd7fcc7f8d74d223be85eb6cf35c7c8954e244b6910fa974699c84527244fb2cc875e928574f129e233d26edb38f11d952d885f95c1b76f2822db942444ea44b5fc1a6fc13e9dafa297585323fc4c915eae9a9728584684268286d0a725d214d47f1c1b66b4ba14a5ac88914e4ba423a4f52df9bf40ef7a82a4f301ead7bbfc373744ed80e96792d276ca77b272305880893078c343dc2763650a8090248091d01858a848280423e847c804235211ae750d825248820174e914b4810d73524880b07855d4382b8825c17ce10ed62420910911d8088b04048102dc229021af205114ad3b614e63551a944da22da926993017680c24a25cdab53496f27ddc57321f99834efbf06e35c35a593aad29602385791bc499f9caba278f17de4f382ea3b5779e7aa2a5bd59d733a3818f06a575ae45cd523d2a492124e4261be8aef5814cd7b269bafe24b5bfb0ddbb1b2856350b60c2b692df35c48272b99f6a59c0ccbb29ca59648072aa307072ac33a5019a732ae7020325ae04064d4e140647cc13987c30f34385761d9f4bf3c4f1441404123998a708d64d2c2057590b411ecdaa654c62f2d851261db8924ea5ca238d7c4e1887a8934e238ce554bd4545ab8dccca065219127651b480045f0a46ce326edb34dbb3c29db400230c3b92a892a0b0cb0800470d16086730e732020bc70ce69592872c1c101fd8045b54545012c4e18290157c929c19a68d84ee5e5c27caa9312201fb600f9c0840e91240ed483064e24eda32f6d4ba64d237ef2fb3aa5b2cb08cf95e4f2a24d7ed3527ae42583788003c44314d00e5370cef994737538e7749070201a9ad87112b9e0e08076d8c13937e3403ae051051d74806dd7900b67c8856386734e87098074f8e22e1c6cd4e51a02d281892d8581742802d2210777e16c7ad4e51a223a696ec9e09c3b8003e53085e67dbaefe9e957171c8070a8c339ada449498efcec3970d840381cf9296de1d8a675b27003d00d5b38e7f475556f806ee876dc306409900d77843a699f309216900d67f038e78470201b504e070ac806e7b9904035c820d43594f6231c2d0b657e43e9ae455e1c880633b42223eeb76bd3d9e535ed4ba8cb48f7df77100d34a01998009a810cd00c61781356c59fb01d9eca021c48e30c2326d2a5e92ea38dd431932665dbc72e14b65d9bf6e22b2b9ce6b79fd229d397e782ed27be633b4b743c29e3c9f8898483b34da92cc7554f800090022d0b65d8a633bf916a54e0c3193d8440af9f9fc539e7405ec001c60d64a4c039e77c0c80869e295276aa289510545c48905c598ac31c2124c8164ca4914242b40b014244d7102dc80010700d11fd6c9128a49d4845b693afd233cd35928e1226a1aefd0807a747899e9eeb63fc527285fc09d3d9483ad330ec77096d7a94eab2f91f2b99d6257469fcd2bae7a2b5ab9fb4c64a1bbb34dd456797cf89846d230da54fdab5b5462ae94d1b3224db1ae9da36af9146d726c48934e2a4cc9bfc08e54324d3b531d1d3a38446d27a869d9e5ca19286c2ae93922b7465a46cdb98e8d1485ae6a7f428f14923aefdf531bf89a40c40ba707050da8573615cf39c89ac2325678ba854f25d946042892ed79052d77ea489603e9ae742f239619876694aae90d64b9ef4f5132b527e96743fc587b404c378f4a675946cd84edfb01d6ca79fac00a1a7a782e25c858473d511ce554f9cab9c385735a9b273958e73558e73d592ca08e7aa229cab9238572171ae3ae25c65c4b90ac7b90a3b575de72aeb5c55abe95c259daba2731574ae7ace55459cab42ce55449cab86385711e15c3584739510e7aa20ceb9984a08e750a098202ef4733608a60b6ea46926baf649806094707ad3fd025940f8a1881ed1e67dfcd75532ff93792e18d7483a5960036449f7c34f46da9b17bfe37df494debb603b3a3c8ba6752c67f3553a490765ca9c9c3c14ad5452d29f28d19bd6f1a727be9332944947ebda3be10688620093cea6692853baf89d2d9936657ed358fca6b72a3e27d276d25c7cc953c9d934cc89ef58ce9529234d3b51b2691a4a9456309efee391e81893cc9f30922fa148190fc6d34b56349dcc4fe1a714763a29d1da80c211be7084df521b094b4e17bf138af2f239917acf3c2a14e58fdfb2fdecab4788902141827c8c886bf65c1ac96b58c98f2e8d9465d8bf7eb8a6f7c9a3b0ee77b09dccf74cca97b2a5a49c9e54c9fca98b940ddbf1396119962e18140ce3f1a2a3749f619b73555509e14a55faa6519ecae6ab6c1a0665d3523add77c1fa297341660b0cd802114f4a259de34547319136cd5ffddab09d13767914866d3b57a89f86e82a9aa6afd04fe984693d3d5aaa27d33ddaff98ef3af3a42557a8a72785259180eb4a92446f5ae71ad2b36b48952326d2a80a4a474172f90cdbaa78d4cf01aeebc24e3d3d3df912c0856d1acaa4bd78cd85b471edbbdeb42d855d1f0b691be994e2a102e5f4c473219594a0bc47a28acf89a4bd4e15beb8704e5db01312234d8f4e291c1c2af4a0e7da349643852a50272b990a4b9c739da4a7943c170f0585f1f098a6e0830b8789a665a12298868393615e0ace399c3bc4b8c3017734b9c308bde92e126d5e1389fac96b22aca73451f74e90b83e7929a4e1ae4d5f5efc09074724852ca4807217ceb569213f7e4b100713822868c1b90b448189730538913493ce34ca4a0949da8f46c4c4bd645e64e25eb4cc93b24c6f285801852f504041018bbb70b868c885a365432e1c52f799dfa279f49661515e8cb28ba6d29f78f1fda49f8085734e2b958ae4e19c734bf8411362f0c3094df0f1c29632a9e1aea04c245dcaf18252b2f92a4e7c152d554265a92a3fa9253e27522f614efcf6c44ba672f25cf33ada97727c4e240d2be574bfa13ce74a50a6ccc9c9a3a4e474f13b2853e6c4778f2572c1c19157e21513f762e2599610003bee703d57e64960871a3938381a70ce959c8d1d315a162a22f219c64599130da5331e1ebd699d91a69d68de474f2975af692821ed3a614374965272651893abb449dac96b97d6485b32ac4b172da59dbcd7b011bfb21496c415d2b4d4a6af54c732d435c410ba8b5f7285345411249d2b54823ab238ac0e22ce21810ee7423f7e0b11574f7fe2513f3c3f1e891ebf456b3d27ac27d3bec42f6df33e5d304dbb3694dfc23d97d2d642687eb45d43342c57d7f4e8228dfcbe7c4e244e3261278cfbcbe744fa29f1685748f31fc3b2293f1e89aea3fd7824b09d9d2204c139a7372c0be204e0dc0f4570e29c969534c79c4b7d400c2dac2002173304439048496fc08b21c4c0b92148a17d17021c2e3b91ae2e58e973920f06854810f0d8bca604d705206ce19ceb8273aec2c339f7507ad34ca46df35a912728540f4d133f988013651ec5499b374581a49136ad6d1acbb8365d467abc68d3cd75e412e2459b6e8a18204889e4f955e432408f75b2344c0b429adf7cc9f7273362084164064bc8e784655dbc09ab7285b49dd22eec749d74b664060b122ac53976fdeeb5d48c123dc00040a6cb6420660b2b5441481091460afdf82da21f60f27031565c4cb65070ce3da18606cacf4977cc39e704e75c1398e09c5b0212cce08111ce39dfb193eee277bee041cc8954ba92c60ecc082d5129717638e794e09c8b41c219d50e9a60430702dccf496bad7b7fc24add6ba42ba44f9a37e1ac28dc966dd3bd63a7cba77a7caafb531729be633b3d3ed34970ced581841618a18329aea4831d9c43c21239e88096855026ee459b4e4bc8018d9685461b29d3453414a6659ea4699a0f8f46d2fcc9377940144ddc20054ec332ef44d7be7461dbf549230dcb1c55dca0c7b9279b88a64cefe01c13ce668e296c29d3ee1897214984fb8e712230ce55cec5cc01c539d19b6306e7fd17619b480e2d38e7b412496fbe8bbcff72d4e11cf64f72d8c03977861c5838e7b41fbf45e4c5657e4b867511fd8fc9b1849743c76922398238cd460e9b38b4e07e4a28948e630971cc11470a9c737190e1e29880abd488630638bae09ceba20d2b693670d801870d2e6ceb7a89005c0cceb90b0e1d4de4732265457cca00be8bb8e72223870deac8fc462a9261dcb929dcf082730e083fe84195b2418ed3b2d04fb69d7c119436d580053e70ced5f4e0c8d549a66a8b0d0daca065a122924b119e695576a43ce1c9d9b17284288b9228a2d0156c4ae6b978522f615e2375d12edf65db4859a6491769c435e792f92a1717bd5172ee44aa3245679b975c4589288583c349993f791f112a777fb2c23d4af3b26d3838da136de46006569c739a96857abc13a492e884f568a45a1395b49685341a9ce19cf506146c1006148c5833b0dc68432483369ccbb02700b90139e1004b88b1630e3b66c8d1fa93386f851b2b2d71ce6203948428ceb935d4b0c670411d5f1c080974683f2725d1c4b36060239d489f05251296524949f71370ce5a41f7524a2525ce596968ce592a38a5be73560a3a29037ef31957e29c85025fc276ba3f91beef6268609ec05d1354f8a3b32fd0702eca1f9d654a34e7ac119c11513ae3a9c2a32519c24dbc62e25ee4952f3610022b032070ce9d9e64dbc94aa99462724a614c4a5b6fd84e2f614ebc13242f3a8a8e7396195b86a1b0ec64c544d2a51c8ff168de33c17632c6054a673cdea477bce492f63ad8ce168e41c176ba3f59f1a5adb19dde85f3d8ce16aeb72a5a76cefa80b326e00117657f429ab58c1fbfc5398b8c177f3c12d61862e8cc23516ad24ba4518ed5812dd328e72c0e7452962a4d71ceda40496facd4c4731276653ba5b6c947c9986c9af6503625534e7ac4e3332c4a7f42d240e6b7904e5814e7ac09e492e6a4d3887b9e9246f2f1504a9ac4493d7584d74e9e443a914c5dc94f96d2b4cf780af0b3c439eb0bb725c398fc2cd126ada590e827bf691e0b158c631cc3e29cc54518ce9952d967d848d3392712c637d212e72c309c73d6175ee4987896ee4f56ba77ceeac2e2c2ca00f64f4f4aa5d48e7316069cb32e606d81fdd313cd02ce5915c8ddf3480a581390401180b0033a6a40871b203a5ee09cd37ce69dc02c318bcc32b3d02c358bcd72b3e0e0685172c1c1895cb8bf9204fba72747b8bf92612792c99bf429094934d2f448d49fe0e0641e95d24cd8c9771376d234ad974858921ce1fe0ac9e79462724afdfe843fa9f06e999ef2d3b1255ba651fdc94fc796244912e59128ad6cda09cbb986dcd4911b61eaa67efc965953a4285349788e707f05075318c01205380006b7001c5c1514aa28543fa85850b5e0065e627e40c50d80f0d38f568940f3a18829e630a246478e355c656d617a418e1d6010c7cb62f8c20b2eb8a8c2b929dc145448c100066449361848518ad027d265245e415c275fbade85e487ebe44b1454833bb828a99454202b20c18208400084174b2e80c5942b45ec00a2818ff3a5bd49a7ae7d366bea0d18442e221c114a7b037b43bf3145c88533e4127d9f05e1e982e56837c5fd158d8452a29150dae754429948332040750237e6704d92b8d1c42539a2f98e9d64b08613693c9bafd2c6169c73a0369c88c1111c062a506dc0015218c0675c60702b0d90507ed3b690b4cd5f9dc7a3a4603b950f653ac3b2213d7af4e8e1e3a4975ca1cdff6c1929a5840d30bc5823082035ea0803a406772e8803987143b370418ce88b43c0015a90c5e94d5363e4060b6250f938a7ad8003ceb9fb6fd2d082735ed230c3392c0d970613aea74adc4b3f6959a8a68b3fc95849c0698921439024417209f1d24941b6efa1e050c9a46cdf43b9aeeb3a2d7180cb4b2789bc4ff7a22ac0e0054ea60451203942c475f22551141c9ca0082730c30477b892f6557c3645675e6799524a29a573ce39e79c734a29a594524a19638c31c618238410420821842fbef8e28b2fbef8e28b2fbe8831c618638cf1bdf7de7befbdd65a6badb5d6d65a6badb5d64a29a594524ae99c73ce39e79c524a29a59452c618638c31c60821841042f8de7befbdf71ec418638c31c6f8de7befbdf75e6badb5d65a6b6badb5d65a6ba594524a29a574ce39e79c734e29a594524a29638c31c618638410420821840fe26b2b9d32c228a6272e09901931e8cc1729c2330ddbf1249d5e4a6158ba6025bf24c73b81654c9cb3ac647eb46dd8e9d4f512e7ac4e05dbd1b873cedace59fa8491ac50f9d1507a2c51134e6b9de77ce568d98eb6a1529e8a3ea52e9f694fea5b6ba97d31e9fed445a3b44d23f9ccffe8d255d2644c71ce5ac2394b091019419238a5ae9316b2f5e989cf525bea67a96d5fa32d23ed2b74d2fadaba14ea467c48da869d2c2c57fc09db71ceb2e24d5815ab8a731615023091b53ca922d2c93a527276b2888a142a54b22843b1a223258a288b9228383827bf05e329a53a16e59afcf6c4072bf527fe44f239e51c0e441112c4555529abc8d8c0fdd9224dd32823b6933e914ca48c6ba47e9952276fd274970b73e273226d19b6955c217f651a58c339cd394b07e7ac1c70d0e9bea437cdc439eb061b9cd35ae7ddfb8c8949eb0ce34b276157b00df593f128bbb661256dc34a55664d81c102110aa5717044280d434a63a67d6105a7c40a96792d3f4b4e4ab214e7d84909890b49e74668a5a60b2fb8700e074784d2bef02105d445171c69df08455ae651253fba11a6ba8880941ce72c9b5296658e954a4ab80002880b9d0cc0c055f13991348d14450a500696c0c016ce63e009ce398d2af2b3c56001d132bf69292a978fd7aed1a65157a9a40407c7390b0620ce09208bd9010301f841660b992a9c73521ce802a32decb000aa0242a8343a81b92ad02bd09df3f21a40813a4e240c25a2001bce4d895c7070928c34ede4888ff6a34bbe77c17a09c3b8281b894ca993176dea58942909ace12470440b1b68410217654a0b235536565ad2b3df343f6139fd090e4e8e0640590471561058ace11c166560e100e7dc85e4c875e1f4f45c9ba6515cbabef803a2c0c25d81802b9058d1863563c95831ce3913cfc2a329e9dee4b72726bf3dd13612960858001401274a40556801540519be746925a02a50ceb9905645ec51a6207005e79c15078200182e946159e64b25df45d3d7902757e8e7d2fc1208d007a4c0c52b2725f08aa7d2c5ef50d1054785155418e17d7c52da35c46b7ab443870392289594708d14c57b26dacc054d5172cef97ff568a79488cb96932765447efc160b4333f488f86025cb72ceaa4053e8e4a1a5013a705d74264311861e9153172cdb234d8f400d38e372a0067000fba7273f25144a89d7f4680a8f8683830603662019e9116598a867a4914ea47f2dd1b290b6914c7838e72a2e389f1329dbaae4e0e070df311e652a89a6e99228f3282fda74c48b36794def2451a68e78d1269e928e420ba765a19286620a170a8584d87c492b792e3825cfc5974438ceb9299ec8c213758c343d1a697af4041ace6d1936d22e0cdb70bc96792e3eeb3e63a29dfc166cabb07005e7b41f3dc5fb2fd27e344ad374897f51c361fff424ca8f9ea2f924b09d0588b1000e2c000bd773e1545498825dc00e5a16ea46146086735a163a8932bf9144268fd28a70cf05a4002c400af0010163f891a69d244972a4a4b713e60429c346494438389e946d229426f2d14c7ad37d27ca9413474aa514136cc787b464b449d19bd6d1d92225ca942e894a18b6455a2989906b88564797219c733e891025d790fee408f757844499e20630890c60ea5c5eaa0d2314810843a88410840d09a06d6a297040a880e09c8e128d1465c3b0ae3d959f6c3be592eeda53d9b05215ef04a9cae909ca9439c9c92853e6c4b9ea07950f7ae09cc8578142070210043a8ad0001392f006193e38a2040d330ba831810f9009e4c8e25a8113d6a90a27d8810148484110323000ca057ec0028648812ed0408308156ea8c00d71d051868e0270c0f30024439871ce79418d8a0e90018c40c50084cda0d28173550eaa392a1c3857dd600ed0698b5377e26422c339f783f653aae070aeb2410d40a52e38232a235876f98ded64a1a45385520d15b6e8c039d7b51f624b96cd6b19540018e84deb800a60032255e19c0391a078cd474f018db270ae7a6306ae72c39d7c4825ed9d20695b0afbd1508ae85b3877c7971e4763a271312e0649e568c0a8ba0ca8a271325432355431543531c63a9809c4f44063d5d4c8c4c05495b3c10a39cb55048829a2723446649c0c3395abaa4a46665a3f2c5755158ce5a4aa682aabaa60669cb02aaba2b16aa0525533158db32a184230d6cc4c101f57156359315854315565f9a8ae60553d9c4c1563c1f8aa2a805555568d154b07abb26662acca095655cd5815012a1baa0ac6aa81810c0c4d0c550d55555516b668a881a9baa8ac6ac6aa2a0b465459313e7a4c0b4895a4a692b9814152d158560c84f161599510196a758018f88309cc14cbc538ab03550c4c901819ab82713214a88e5039cbd9d8d8b8ca5531955545a1aab186a82a4bc6b260aa4a5645aa9a0a886559d64c4e258465c558d58309fdc0a16600150c00c8c1b2402563e150c5543095b3a658978f2ac659a41977f5541180713fc0a07246c8c082a966aa189a0a860a660bcbaac181a92e4c6559319705a447904aa6aa685e0cf4e155968f991aabaaaa8aa6aa702acb0202cc4cd5c38a81e1520161a5aa0a8648d5e38755d5d0549611560f560f160f300ec6553254339655c11063031363e16059563553c5fcaac74df543c6aa64aa18ac0ed6139a1f3dac6ad700a1b12a025435550563553195938a070b5b3b583f2c1a4ba682a9accaaa702a1eac1f164d4c0523035355b682a982543d2a20555519a97ab07cc0d054353195555538553553833543156355323115b67e5430560f150c8c65c5583115b6ac2a07cb47d5a3aa89b1aaaac2a978b07cd0c0543135315555d9abba61889a233044c85430558f2ae686aa470f9c1f4ae8d043258098cab2662c1a5fd9d0f07e38a92aabb2aaaa22e2681cca69594075471251705712612c618e247ea8e30958f4114260c50845703c3ffcc05509e306be8a96c3510983055d50f901934280300a70c7143d8d8012460f5570a27778388c1b8a601dc307ac1160b8b13ff8a8aa112a2fd49e3cbca8d7175ca8078f1e88f490610d298218d890eb0d41041843a4e043cf05c487cb0600383002c084eb91c9c25d3151b84a065a169a91c2471035f842d383a6474c0c3595a6070c0f40789ed801a226c88c8f9a1b0344862a06c88c28a60b0c0c30a0981e4481812f333158343d6286c0c0c30dc1171f5780f49821313c614d1d64acc45433475ef00509141d5014568c8f182842b2f04509500c31c713950c0ec807239eb06272802182aa7e482243041d5f66667c9822050d322c61004c9327a6f882430f2c4066003283134c6840d5683eb0f0e5c8d6a3498f1636343d606090d9124345154fd4c4c430c34325837cc20e0df418620752d468c10231583f648c00d1e01824bc126740110099203e98f818c0cc123143d0602854104613283c70450d364f0a18389407c4e0cb8fd4cf4014304419aa2b3bc018a1c1a13ee18306cff8a88901c63e6902c3830f2658f8e283e6090c556a9ce89099f8e8e10448957e44055f6c8819527dcce0040086191f3f32104d88f1c5478d931e3604bec8c0d8c854330498f12163646688244b7ea47a0851e364c6070d0e30e8f4b889d9e961c30c3b0c20871a86a82102092a0378c2474d8846c220ed9329344062687290c181a93d80c408711941d383c6474c11192462ae11958c0e303fc8d4f07ad470189c8ddc50e3a3861ef6899c9d1fb32648cc4dcccd8c07be0c11438c8e0c11323df4b889d9410608c303145f42452a980f43240646e600403421011760271184608e35ce10810738f0800524c08bb6e57bded3c4125ab25cb152650a94239ce05c1964004108e08a91411b7948e10976149124082072c081060c386c30861804c845e0f04003901f333160411a2020630c0e6c200c30bab012448822a10c6080a74a1e5db0c2d6228528a821c2405a5c41fa498cf8a021230b2c6c0f1ff4a00c327070b561861f3e6a6876d001052758c277293b473c6192bdb0828a29005004da021184c0030bc072c5d61b6688b9c11c55b8920449ed4133338206a441020d5440021038c0175e787185949d2446840052e101c3054b0b31775c51b09610638765049922543fb07860eda0071d407460ddc092c3628135021811585b620a50dd543ed4f020b3030c3858365834543380022003000b54d9c4c460fd90f161f5a8a9b1686864ac980aa6aa661c0c32c0e800e3822f3111f81203656688aba2b9c21336627c9191014233801f3c1113068cb10108073e30f3802f31507ad4e063871ba2f8d22389182d303dfcd86680d430a9b9333e608cdce043a6065f6a52f06586259ee86161baa00210227c91c9e38b0c901c76f005c806840bbef4b821068bc6884c1199093880861f3858008a982abec8f0830c3fc0100115a9b9019407143244d45c9a233032c01ca9e1c0179828b0c88c8f1933bec0fc98c92166c80f0853c5008919e283890c113449cce430e363a60040660032438f1b7ad44093048c17a098c901e60c286466f0258802c4982e51103cc4e0009161061453c11081c9899902c486198b060b8d0e343b3234c450cdfc8091890102030363c1d0c0d4c0f4f0b1430c0c8d151a00c830c507886686a682a18999314562aa1a1c607478a2870f321ff81283194f80666274a8d181228608500021ba5c1e5fb0c3073db8c11c6fcc20e553250b2cf292229058ec2485281411c246861a1a25b448d9c9230e1de0c0872bde161630020344e0811c6ea88102118c512434800aa4b62bb4ec0a53b8230874e8a00d132c40014d2ca1258b949d264c7ce8c1861a58b082058820040a488088871db0930f3110610806307dc9e30b59c0c2124ad8500388076ec8800d35507082115c610515a22692c02265e7891c71c8008e166ce104083f90c38d36d47081181c800003a298c21d3ca0430d17b08004527cf1fd4906c1704712ea20c21b6dac200d34cac82202be8b9a5842092c4fb2111c212018e488e38d2e32908514be3771c41326d9084e0c30c4b824d421471c3490c10ad240630465686185144c1cf10489111c3ba1100080625c1e49a86308347843066dac208d1194a145165644408a23889858a28822a12ee0010509196210c20e585401812c589e062200811f2f20e89107cc172c2fc8e06171a1e603311eb0cab0c6a8a205615e15fa4104860898ab061fac1d2a1d687280c1a1ba21c686aa861e01000000606c62640012830d0c3900c1e1c70e3e403d686a6668ac99191919181f4de8603b91325411df314e3aa5689a20a309279ac8404d40e9b9825c27d2a5917e329de911bf741339345103a8891ae72e2447ae20488e5c4cf48009389cdb7e769ac8fb64def4202d526d21c3bff5e7536a082986d38642a6afab84a016f2ee5146c8e7b77ec23a0f506521f3ff2ba5b1fe7bfd7e1c6221776be9b3d4df8afb8fb66f52a9a4ff89f4865457c8924e69a3bfdcdfdded96328966f54465853ce9fdf8de2d39fc983e3bb250a4e9073525b70a99735823f7f1f7f8ded39b0a79f629ffa35dfa1bb9867364a1c9db2ed514729c75e378ed8651d7fbe71d59c387adedb1c31ef7a47f64b95452c8fd714a71b57efe6e6795a92851c872dfb775d55e43e9a58c230b2f1472f57f5f5ee7f70f73eae9c8c2cdfb489e9b9c1b274b74469a7632d2f4c8c94dcecd129dfa843c39a5155ebcbfa671f2a8b31c0ae9ccdf1d2d22ad72429ef6f6c82fd7ff372147b86da4ef411d31e67332217fef35e697f757398d162e21db0b63f45bd359678df4c1582b3bf2b53dcab7a99f5a4a0abf12b2966fdf3f39f4706e1fe1c842bd957ca7af4a42c6555748ffc5b3ca5ee31d5928c2b6083f8665532294d0ee68111d51d591abfffa62d877d72f5eacf568def034b91969da494542f613d6fa7195fc3dbaa11d59f8e20d4f139f93a6f2b58742e5ddaa23644cf78df1c2de35a5b0feca08d97fa929a49a43ed3bb437140a8542219da534c409a88a903dad1afb8be394555a3947b65e22e4bbdff51ed33f2be77bfe91853c506ebc604b42a1eebd605bda2dd510e87d57eb7d2d95efdddabbe71a55e5c72311b2700aa11282d5baefdd71bffc5b6b4716fa11d7399e94f19434c7a08442a950887b2e3f1e8991a69de4dc541ab12e3c7e8b2e2d59a2132514da5d74c303e5262ff1a48c27140a512ab30d05f34515843c69d5b0f71939adf6deeb04494b5153ea2437d30742ee2f62ebebd54fd76835ff418e5cff8eed977dd2afe3963ea9ed759850b9f141aebe6edfed8c70dffddf1d59d8618c04a87a9075853bf6fbb1fd9fcffb7990fdbb7cea1a7587bfefa9779071dcef695f6bd471ce77e9c85a4a7f6b7dd1721e2bb43ac8f7fe5eabeddd4b78a5a439c8f44d6be1afbe7edadf8c1007d9cb07ff7b7ac779bfc4f706d9d38931bf3f6abee7bf768e7cbbaed1566db7ec94de190a45288256caa09223cfbd6bed1e4a6c3feffd41b8822a8e1cffefbeef48affc1a6f6d3be94d3bd1f82b3872a7774359f57bf0c1fe2213950db2eef77e5efdc4f2dd89fdc8c2071b50d520bf27a986f0de5f779d734ba8828a069962bdfff60f73fd7abd3d05d51b99cfbbf7eff3e31969bf7f0659c33d2d7c72e3f8f993de8d7ceff47c7f88f7e4135768824a06d9fe3a3dec94fb593dbd7089aa8d4cef7e763f383b9454f237b23006197bfaf18e97421df7f5736421849501150cf27b31de37eff7b7525df9c8c217332d1482328eea0599f3fe3fffdce3febe9e7664618ca1908c33a8d8c83c5efe2bd49553f835c663546be45dbf8c924b8db58e5f532ea492eff686a789e4421f542377bee3e3b8430f61eccf8f2c14619bc85b68c233ee6811ed542ec8965ae9ab95d2d7fa31c6334a28140a8542307aa16a41de966ffaa1adf24eb9b715fd64db83323651b120cf7a63e49dbeaabdfef0572bc857ca68ffd53dcebf399d326f1a79fffe7de5d7475a75ac5f05b9c70f69ac35e2fe1f8df551b9c9b97904b89902e5c696502692c89750a94d545390adef525f4e7bbd94d6ce2f0af296b37219a79f3bdef81ffea23a41e6ef460b2dd65f6bb8e7ac0f7ea03241c6d5fea9a9afbf460cf91c59b8719b73130a8542596e726ea254b9c9316d5aaa005d89f74cba7f53a8d0c87abe176d9f93e3b9b5fe230b2ba490a72a41be93f2ed29ed78763a2f2441f61beb8829a4937fc92bb53607d508b2d7765fff64fcbdf38ae3c8c27ac3d3a45a78469e7d63b965e7dccafae51e59e84b9d243a61f6091441d6f2deb7a7c7d5ffbf3f1ed910e48e75f7db7afdead35bea91d5bce8283739372729373937fd4442e226e7e626e7e6c72371937393f991a69ddce4dcdcf040b9b917a54da2ee21a495062a10648d31edd7fedd3bbc0fd307ab6068a55466645c7dec5df7feb4c7fa7710541fa0b1def7bfdf2fe23dfdc8c2920e8560f55279206bacef7cb5c678e9ac8f8f2ca4373937393739a15028c449a1d0f5405546a6d6463d399c1d8e2cfcc936082dbc3b5a44465464641e5fdc74723dfb7bf2ea9185d5e4b727a1d00d4f931b25373c506e42a152499baa8442528a518d9177e5fb5d1a3db778da4d47168a443196b63e590985660c4125469ebd5609e9dcbfea0e751d5978b7a83a90e184daefe9f9a5bfce7d47166a184a7a5171404e2abb8770f30b67b4230bbbe8ac72a0da40b610c26929aeffc768b51f59e83354cc5d541ac8726eeea1bdded3276fd4230b4fd895120a695b306c140a59b8812a8c8c6595df47c93db79bcb8861cd5281d16fe5ffd789a7a597dafe8587f6690e3ff61b7b88b117d152cc37d4557aa8fbad5df0d9679f97bea9dfb3f173c1ebacdf5788e3de53f307a108d6a0cac08c385a0d2ba651defbe27bb08d0a031edfbd6197926e4fefc317d0964f8afbd5925a3e65df4e9e0b7cd08d6a0bfcfd7db3620867dd90ee0ccbb22c2f3c4165014aed85f4536af187b1622c829546185415e071d77fffc6b4ee59a30c85422113f78245704213f722cfa828f0b97dda52f960dcf3c75a25147a5004b9e7022186a39ac0c51ff3082bee37fabf75ce4dced5a29200c4fc4a2be3d6b146dbbf169f5ab9adbed04b2bb5e759d42925977ecb89f5d7f74fa172b3e426e746c9cd1428d38a0a0b6ce57b164e5bef8414532b67c8c4a5540ae53befee70fa1831efdf4a8ffad93acdb08ffd532854b512ca44a2a22aaa2bf2d4f2463b2fc4fc7e8de9c842d1e67d2cf64f4f36df24140a85789a844221fc20062a2bb2b415c7ef25c45052787b04f2c5afdaabbb8ebefffde7c842efb34d04a147fdf0c409e9a8aac89e477ea997183f88ad8740de7def8a7def74575ef17e40fedd6b3d298f126ebe29a52253dd219c57cbbb5fc4156e29a536bee16952d2a74c0aca44b2b05658a81c90f18f1f77e9e1b6f64edaa7c8f3c687e7dc164b0ee5e30dc83d3eefffc3f5735aefc70cc8d5f229eda4f2f2f9fd96230b7d4e242d4b719f89a0f7e9f986a7c9cdd71e4acecd959b9c1b246e726eb654945028f35b326dfa9e8aefd84e28140a61a5929307a3efd86952082d2e2a2972bcde6a4ca1af18cbeeeb4da7a99b9d9b2d53373c379ba66eaaddd122c2aa28f2d71b5f6c79c5f6d17a6709c3f6d5524191ffd4b5637ce5ef74cedf677d22471b6bc70ffed731d75e8f2cac51a66cf525474be58fd6c627f1bdf12f20dfdfdffeb7deb8e196bc2a2053de6184f5ca5f699532140a85b250baa345244a40aed0dfc821df4ff73da34540aedf6fbfa7a53ed26ee13c40d65273f92a7c7a8f2cc4b6254e642ee3adf6faaa3784bfcb918512d6263f79c60f9fad7cfadf2f9fdbcfc65b0a757a429578c95defc7adc472c2d969e45df2f777cf383d8d77e32b3597ecf185d87fffbdedf4578c9d44a96cbfb6f37e7aed7d18fa2d5b8c39b74f471db9a558cb7e5aaeafe418c319b1cdf2f77ddfda35fef8634dbf0132e5f7cf4ebf8775c3e85159ef8ebbe6b34a1c2f8e58def43e0ef5ad1cd21aa13f65f97eb4b85e08779cd69b72dcd553be3f8e104e6f4b795e0ce5bd50bf39b7ac5bb28db4dffa3094ef464a7b0172acde7a4ce3fcfcbfda4979deaeef9efa7ddaf5e5a31cdfa677daebb5b456fbe44fb77e9b425f77854fffdcad7efffacea5c75556ee73b7b762eba5de16ff6a7bbe5a5f3baf8fd4bf1f2bcf95bf0faded7d427e2bddf97f792fdebbf359238c3af74935fd32feedf19e70f764fee1c618e33febc6de8bf2a5d5477fab7edd53dc9bc86f77a8abdebd461c2f6622ef771faff0de0be17e72898cebf456cb7be7bb574625f2e6dec6d8a7d4314afab4962ca5f41357692d95d0fe24f2adb4e2adeba416477971964cfdd4f4e33731b5315e2cb9ee4fbdafb24eab7db5f74abe7f420b5fc4d04faebd952cadad5d733ee3b513579e3cab8d71472eafdc9c57c9d3d3c879ffb4ca8d23b55432ac735bfcefb71eeebd0990b7adafde48b795f4c659a7645f31a6f0db8be5fbf85129f9dbc8ebbe7cfafff9e63b59ced775dd3be2cddfdd51f2a4fa52abb5d55bcb88a1e4efe3fc7a7a89b79c342291ebc414bee93dc79d477844867f4a6f398cdbdaab9f64bc27b692bf0fb796f74d2719d27fbde7d77eac6ddf4df28f7ec37effedbb4aaa2593dc6ff5ff555f61e57fee9ce7f552ef2ee19e17439d4ce1eb58426de9bbf2c19893edacd1c7ad61947757be2453d8f99b774eed77dd1b2ac97e47b9f5d43be239633722e34df5c652fe693db6ba88bcb99c5656fc2ed5b3de24f9eebdb9ef9aebe7ada74832a6d247783584dbc63f8fe42bbd86fb4a59a1a7de48f6dddaf8f4ecbf4bcce11b5978f22511f75c44185291e8c21d2d222638596acbedfed16e0b5f95fb7f0c43c1597bdd3586386aaaa9e4fe66f95fd454c2abf7fdb8cb918522096b85dc737962b396bef3696ff7d23ef8ffc8c2cc9f4e24518475337d596bf6f3c25a39c578d7d97b1f59b865d7089a67d77847b825b40f57fb47168aec9db9da5ebd7ef755ad3de57d64e18556e6e8efbe73d22bb9fe56cf91855db0cc07c698f7fcdbe249e18c133f084716669b06b3fc5ef6cb9fe7fc79effdc8c2cdf4b195976de5fc7db925d4230bfb498bb00ea34da248b6faedfd69a7b3425eb51d5938d252285186fdaae426e786e78607ca0df757ba682a185abaa34504259465c7df575a61a75d632b4716667ac445cf6fa40c4b28b4997e28e4338c63d95226d1a33b5a44588864bc2fec577b8ab9bc51fe91bda91b26546e6e78a0dc884e241bb30d257d86f1b9a345846448e6503f49b5aef65bef2d1c5998f91311996a0eb7e412cadfbdbc7b64a1d6bdd7449bf7a1f086a789a66f5e4cdd789ea5b02a5442219109eb279d85f40d0f941bd1c43b5a449503861069a94c24ca4188176df2210814612591cf89e4e3839570104254691c620099de840802879b1c0430041039fcd0c385830f3bf41084072076d041871d7230f58043866d7a871b80b0e16f291e6af0e247a21d6898958719bc605db61e025069bc0070231445bf4597b6c8e7441a697a74812e1b111032c8178326040c71c330205dfb2cc88f213e36ef23440fa80d51131f8d48c88c10325100315014044c34615ce43391086ea934a2b8d7ac15a482a21f9148b479f1027039c0610309bea8bc499f626c20011d407e38378ea003253168c224ebe42c519204c9112338f8da4aa78cf01509111942c4104282083180206e80f8e1f2c1eac1e261075783034d31c581a65803c6013f9c1b44b081122705256af08673ae824014b238e773da023c506e503a0a4a9b62c0c8737fcfb1be3fd6fea894a1d0e63507c47c9177b40fbf0bf9e6c587a0dcf040b9f9f1482cd1d97df718e34586914b2ea5a69d72bdffef22cf1de1dbd6474a9ff6fd7391e783f06d692fbd13e2fd33909fbcdcc2db2ffe18c8fb43fff79ed577fbe7fd17c8745a89377c147ff961fd5be4f9b6fe72d3c9378e5c7e0be41d1f7e5d7abe79d518fe0ae40e35ef14432e71e4137e0ae4debd959ec23deb8d13fe09e40be1b5757228bfe4107e09642faddf1eca7ae585107e2d7287d24bacbbe4f5f6f9b3c815caff39c4f17588a5f758e47be97eb2c24bfbeccffb2bb2ad5bffc8efdd1afad9bd1559c2f7a7b79d5acda1c63e02d94afaa7b4907b5bb5bfbe8a7c2deed1f7372f04f2bbf6622bf1a41df2671f903d953a52befddff16b2ab29f95c6bafdd314d75a1d90b7af14f22f377d784a3a45decfc738b58ef55d5d6503b2a7fff9baa5bdfafdfe3c03f2fff259bf1f851dd3dea5c875cfaf7fb555472c7714b9c32dadfedd4faf3d85225b796d84d07b89e597fc89dc2f861bceaf37dd1def982ff9515939955e5269edd479646d5f8cf0ce6fb7effb0bf9ce47f77f9b5f4dabc55ec853c678b99f57426b7b17f2d7f2d3b929a47b467af1c811d2efe3f3156b79a7e542deb03f0b23f7b76f217f8d5fd75e53dab5902d86b46bb9b9877ccbd9b390658516dfde25dcd7bfd8b19021a6bb5b4ce7ffdd5fd8af9063e77d526e5ff4f7f9d7ad9027ac1447b9e9a752d6d7ab90b1ae5adbbbafc6bc564f857c25b6913e7f35d492fa2964acafde7a7e29397e91df91f58fb5c3dd279642ae76571aa5dd78cf2d6f14b29ef05ffefcedd13e6da190fdf4baee88ededf1e2fa844cbfd411da18afdcb352276408f59f76e3a75fe7b709394aeeffdbd85b2de9954cc80f476ca3877a570daf5c42eef5fa57b9bc73c23aa51df9fe5bebc4534aae842c2bffb776ad29e45e479e840c29bd9e4bdf2dc4b4425e87bffed75be98e8f2321eb39ffe735d677840cb784efeb28f9dfbc7623e4f7bbb438f2893f9f9f17214729af7d706ff9eaec9c0899da29f79c175edfe9c57b0859c2f9ebeeb643ebe3c35b0879f7a96de7dcbeff2cbc3b0879efc8bfa4bd72bc3baf1b08b9cb6ef1d51ffafeb1adfb07d96a2bfd86b6f728618ddb07b94bfaa7ef75ea08bb8cbb0799d3d725e773ef78dffb3cc8ff7dfdbf94d8c2f8a8df41fefc410ef596d2ea0d371d394e59bd9f3d768efdb73ac852623ef1c5f3c2baa7cd419ebec63b6bf59d3f1e2d0e728d58fbceed9cb2c368f50db2c44f563befbe1ffe58f51c593fb8a7f618e2befb955a8e5c2f87b64e2f67a594471d47fe576229f5afb362baa18623bf2af9d69b4a8965ad50db20c7a925c414cb5ffb9e4fd720e31afdc490565bafdf9f0619c3f930b6d8f27827fc6f64acfbdb55423d23d4d4cf20bf2eb7b51ddf4fe384de8dbc25d69fdabee7b49e622c833ca3c59ce21e6d1bf9420b2d8cf3f9edf99f31c8b04f2afdbeb3d2cbf5c430c81572bbfb965dfa0bafc42fc81bc7ef27ac5cdfca79c46ce489fffcaff6bde7fe37e23532add7773e79c79353fdd5c8bcdbd8ebc7db5f17e4cdf787174a8e31d7d4df16e4493df56fef1b7bf5765f1664f97caff4433e71ddd0de15e06d6bff53bf5d6f1ad95ffdfd7fefcf2aa7ad5705f945fff1db71be7aa79e3705d96e4d63b574cb67e5971705b9727d6384f176fcb796f70459d26eb5de5fdbd9fb95d70479c75965b7f163fde385178dbcfd7e70faeaa39e54be5b827cbd84f5eaf760c55e7f4b82fc398717e2b8e993107f3b822c2ff6b26fffedbfdd7e7b469e74ff2fed85f2625ebf1541861aeb677d7d95d3adbd0d41c63cce0a2397d66f8dbd0541e6f7cbbd2ded347a3dbd3523cfaa238d1f5e4bbbaedb7e206f7fb587ba6f7fdfbdda7a20db59397ddf3f5c46a65feebdfdbedf761f2d195973a9f59354f6baef1c23f36bb7dfb4befa6f84558cdcf5f6f26389b5c6b67720535f6f947b4b8faf87930339e2ba5fe75dc769f906f28b97de4b79941dbf2d359021adb45aca2585f05a1846e6dc577931bdf2bd3d9f0523f70a6197b862ed75d4fd8b8c3ded127a3aade5d06e2ff2add6530cfb957e52dd45def2d93aa1b414ca3b3517d9deaef5f7d35befabae19c85c525c637dfe3f6c3f0632f653fe289ff736427e814ce3a3f163fef6fbdbce2d32fef5733cf18394f2192d90e5e77ce36ebbe5935720db5a7bacdc72ae3dbe14c854df7e299cf2ea5d2dac13c8b25eebbb8e91fbb8f19740eef4eb4afdc5956ffabd16f9cbf7f59ed6f33d7dec59e458f9acf5bfeb61a4178b6c6ffcd1dae935debf5e91317e1d7f89a1bdf64b6d458e7053cc27b791cf276f04b2d75e46f8e3865d435e05aeb672b8ef8f96c240204b39f5d6963e2af7dd95c23c20c3ffbe84d6ff0ab5dd95c25091efe6f5e22aab849ddb49611c90ad8df6cf59e18c5bcf4961a6c89c3eddb18d71d20d69a4300dc80f6abfa9be716a293da4300cc8f14bff26feff6dafeda3305264dbad7e51dacbebf6de4f9828b27db8ef2761df3d56ed270c14f95df93485bf5a49e5f513e6894cb9c7b6d30aa7e5fef909f3257befe59b8fef89fbd37de691a7bdfbf6b865f7b2e33ebf90b77d5dcf2de9b312d63dbd90b586bbcea8f7b7f1db3bbb9035c6f35b6ae3be7cbe3bf1c8f7ebfe9e9cdc6a78b79d5cc812deffe9ddff5eeb7b9d5bc8f85aaadf83d2e229ab9c5ac813c2cd9f8d58468a7b9c59c86fd7b8ef96fbf367e99758c8fb7a0b6b8ffed22e5f9757c8fc631f2b9e74eb0f2b9756c854d24d21c71e4e7ab79655c89277bcff8d7ffb2dad9654c81d774fe5b495564df79553c8977eeb1fec5b623cf59577e408e1b7bc6379f9ddd14a2964bca7c410461ddff6baca28e4bdb586f7763975a55c4a28e4eb799dafc6d8299f3fca27e4f92f8df7f9a7e78f3b4a27e43bed8f13d2b92185f0c926e487a7c7ff4dfb9990217d77424a218fd67fbf840ca1a5d3da7ddfed9f773b32e7b5d6fba1fe3df2ca959029be377ae95ff51cd39d844ca9c6b57af8eaa47eee3a72e7b56efbf0c316f3b8919071f7de62f8b8d6f3627d841c3b871c47be5f9fb16a23e419fda79b6e3c35971f1721ef1b3bd7ddbf872f7d980819d2b761a5afc27d5fb443c8117f2abbaf7c5f6a7f1542de7c3f5a67b4bc468a6b10f2a6b1ee17e77bf86b5b81902da411dbf9e7f75a621a7f90a1bdd4c2e8ff877dca197d909fc6f2cfbb2fee1656197b90a397d6daef2996b3fa187990ed87efd6f77ce456db1877902fd69262aafdb4fac718e9c84fdebebfb510be79ebd741bef4f5682fb6754acd7d0ef2efd7dbe9e3a394f7ed71901fbef2cab7f97d97f27e838c7dbc18566f6594f7f539f2c43f6eaae79b7e63ade5c87273a8abc69ed37eb58e233f7f27effd7f5fbd9d1a8e0c35dcf85209b1ecf6621be4dfe7de353e0db9df15d7204bcf5fbc514ad92de79706f9d77b3f7e7cc73879bd6f64f9f99bbc43a9a7c7f5ce20770ba77ede53b869f716ba91219df8575cb1f47c6e0b6590dfc534f2fea6965d7f0adbc8934afee9ddf7db6a2b8531c83cd2f9fed3fbef3be38430c8b2576ea58d9a5fef3f842fc897736df58b15d3cefb67236f8eb58ef3592caded7f8dfc27acf3ceaba3deb37b35b2ff744e3bf1877ae2e95d90f9a3f1e17eadeffccbde821cbd971a468da59cf37316e4cb2daf9e3fffbaf67daf204f08ef94f8df9d46b6dd42aab7c7554fecaf0a32e71d7e5dbff7d27b7e5390a1ecfb615e65e7af4f8b820ce9b75bd68bff8634d613e48ff987f555da65fd939a20776ba99e585734f2fbaf3f0b6bddf5dd384b9029d41c57ffaaf4953f49825ce3fd78c37821865dc61164deb1e7f5ddfda6e59b0b932b16ea5867643f697f90c3fbede6bed37a658928c3bea8c47d0f856e5cc31241a64feb7f39df7b765aa90f41eeb86e0ee18418ee8f650441a670763e3197b3637ae73623fb7fa19c30d27fffabf57f20f7beafc4efe90925bdd27b204b79ffee0f771edf875496619591efb67cebce27fdcf737dc9c87dc65b63c47a62192fc6d80b6b8c6cb9bf50533ee7ab51f36f862546fe93ebff37e57eda7b01ab03d95a1badecbf5fdd3bc67d64e1b5d9e240b613d388e38cd1578b63b73690a7d71ec71867adb1e20747165ebca345b4004b0359df192bf756d60fb5b0c2c8f456cd5fa730427efdd760e4e9fb7d1263ed6b9c91e32f32c7bb7aba6585df4279ad1779ebdb3197dc3e6edfdb5d647c23ac9bd3b8b59e5cd29185dea44ff386a749032c2ef2af9a47eca18c7ebed77bcc809581bcfde6356e0c21a43dce58a1042c0c58d83da45e7fa9bdf5be974a3eb02e903df4bc4fdb3d875cdbf7936db402d616d9c6bfb7af7343a9f1f46f64a109cbfe346119935028c61d2d220b0acb02f8eeff5ebc7d76de21ed15e8bd4efdfbfd77d2b9f1c842d18d33b028906fe45346d82385fa45eb27906dacf6f617377fb4f24f47163e98852581cc2feed5db492df613d3f744e49bc807196069917fbf5a3f5f7585b0cfdeb3880f56d8f9eb9bcb91851af53cb4e58442393739373fd99528a1909550c8492894f9aefd48c370c21d2da21f28b0b0c87e42db71b415ff2fbdb4645857c090139615560472b417c62a617f3bfa7a2715ab8a0ea5b41acb2fe3e3f88f2cf4594ac34a3c142a95b4a877bd9174c6130a61282d3c2c08fc89a5f717773e65f73514ca175a0fc0fe72abfb9fd1d718fba7c257a965af554feefba4d70157da6fef8b3fce78ed9b537459e9c5b0bef83cbfe9367563228db410979b6d53379e9fb0373d3f493931a99ad58079f5fd7fd228fbadaf54d2fc6ea92827269400160368844fce882996f0d98a61acfccfe9f59bbfcbcd771f59582a693e4f4ce2d550d8119614d97afd3ad7b03fff317dd28a224f6eb195b7fa187be59a3ff8010b8a8ca79f77fafbf8f77f478845d076613d91bfdeafcb2a61f476c7eead2fb9623f39f5f851fca0c53b8f2c9f8dd67ebddfbf166efc852cfbe5be7a5babc6923eeb851ceb8737ea07eb7eef79d8857ca5eef1d63e29ec965f3cb27df7cfcf6b87f0613db99063fdd6d6f8dff4f4fff7b09c12a8d48f0ad6a918c43008194200e05ccd000000c312003048241a8c0583f1a068bef71100148002528c76b83a968984d1508ea22006421004a118040180010419628881558d8d0090d0b1e62d6d9dbcbd64125b50a83997a25205923db23f9412bf5ceb4926a6dc1dbbb90c924c81ecd7cecc8e9331466b870a3f06b2ecf4527cc62c4e57c5e379fc88469874ca88f72716524caae21e1559b2082d89441faa6aa44faace28ff95ad86cb2916e9e0d0d4e8a2095d4dcd4c857624dc707dc6ec0ee44daf1dd9ba863d8178fbbc62b74bba866ceff91df605f3ec6f00ab29235b4551b80461e1389079e8fa93de683b899b51f997a05e695f22d009525c227b4027a5d76b4e6657202d7a33a81f6a5c24b00f26599f49174922152d0be3e23f5092034c439a403fb5be397eacb7de42b2420587a24641935019957ebdebadf6ddc15bfbbbb37ba5fd42345b3a2034897474e86af434ebc6efcadfceee5ada38b4e839a69738e8d4a9d50fb98d7a27c55925e0f741a2d841d349ac42bf8786932e867941ab4fe937899491f753b95160522823a04f55a3a7497746579ff646d793f68cbe9fe636aa0aa303092b8ee3b5ae6776182e98b18f1df83bf53b1a7605f5e4ef667625737fefbadb3ef00be6d7df99d506be9e3a8e48bdd23b997b335b49bcbfb9ee771f360b2a7bb2b8b6854e3e679b0df74fb98d604e299bd09f541ba4397536577ff646d793f68cbe9fbe8dce9306199d3e8d1abd269d327a7f5a35ba4f5a6774fff436fa9d346774f0696a746822867a7bd70dee99fc71d99de50dde3bf51b8d7b8177f2f766b792777f6fddef3eee05edf7d3dce860d294d1d1a7abd593be1bbf2b7f3bbb6b79fb7bdf7edf7167f006fe4eec46f25eaf9d2cbd09ad44ba1f5a37bacf7af1fbf537b33b9037bd77d46f6abc5686bcecb4fbc4e64aec44f25aefa5d4dd075afe8b9e24b1039217f59ab21445c9960506a262adafad20392e0149109f7132f862248cb629e11b827d098bfc420cdf283ba3121b4a48963624c902f15c8e4416af72917b9ccb2b7ab94b03a6cb79feb5cb2057560e8cd46b30b0d6cbaa4db3f51359b1c015d86f8ddb5aa58c2504be8a96f31da304d762beff6361df9963b6d6b2d9b40c150043e530ded92c0a506e69ac342e778814408bcccd6657eae0dd07ee323f017951b51284e82da0fa35171641d9645310e4c6830eb33606ca057925905b61b5251bb82e76d7a15f80b8aba3121e09e192683da90cf3279bcd160e4ba37c843386c850efd4acb80a575c236622dbd8745a727379502e447e76f7805566aaa8a601a79cf24464aa69223935eb8203641e6f9b17e157ba1721ed8a49a8c71b3b10c0e902b531b08249a6bd0d9dc8de538fc5741bba9b8c562d8861126c07bea70e0607a7b49ea1980d58bd6801e5e90412dafe07a70b8aeecbdc4927cf2e345c5fcbc408a36b9296bce29e857fe286726afd0d939ee7f6aa82eb15b7ad5642db57dc01186897c98fe48a6133be51a40e1b8e4a487baa8fc39f016c1fc675070c755978bb960ebc84bc300030a51f8ac7833ed62ae3031eee665893c1278daa023d35359461c7a4518b3ddf5859158195525d961021599dfade8247cc3578c25dce16af4f5cf1dd4b3518dd893e3efb916d59dad435c9cc3e4e337aea2aa13cf75386ed83e3f8c88a23c732dcf5b7a024ff8acb6de8fbe321bbc98cd6f3634649fe200e5861de1a079439e5a9c204e3a5d8f395f6bafe78798f9836fe2797e6c8d5339637ca9f2aaa073f77c8cd2146941d3bc5d118eb2c2707ebea3c94bce65ddcb200029612cc219d4ef1f68e498d3cbe30d48a49e0e2de94d82e4fb96be300414885f088d6f3b1939906b8e7204c3c802e6691ce7de1d0f5442af91652dc7c6ec9af6fc622cc36873be94cbd3a259252f2dd8e7d5ad969997e58d46f6cd9568171b522c8a525620c860dfc0d2f233c6d1eec126bd9699b9babcf76cc42554e7b43105cb56313d4731b09abfe91dc5e835f88b8ca620b3bc54a3ffe24b5f4b9e80cd32b60bdb9b9287d365da43faa1d8923ff4644eb3bcd3134f43436512033fc073033fcc73353bc8ffc2f571f97b2d055ddc09911c8e021cacf5015777d5de626057aff70dd0aa1af38e8c531ee161c681c02f577e94cbe5c98ba4519fc5ed617bdf797f80148576901a272a32a8e5c410fa01ec6fe981dcb8be703d3e1d69fd35b34ef03efb6de75d31f57d7cf800977e1303cb1c79286b5068485379b01716b4ee2900eeb9b0df06133a3152075ec7202300bf02aa1c41105169db6938df3d74851e2585fd1225100228338d22fc7553b927ec5ebf06b6072b724c9121cfbde8a2a06b45619977ecf462db054f25818dbc51bbdad464f30c84a7d87d781fc1508731b71cb0b8836ba4b798d00c87f7403e21e4853b0dc71ba26f0ee5166e5d5ed762174de7fb9676896032ef91c81fbe9d31043e4bafd2556c19e482456ba746b34ef49d0af3e0a8a25906482ed73b47d115ef6ef8cb9b0f0295b5bb5ed434ea8e31457845edef03be76bc19bca915486ededcd28505b02c65a0c0a45037b39cf2a420589c28e6336e1068927405fffd007027a726cd3f0df62576e124ef0a349fd32bf4c2c10d07eb20f6161dfcd6a49d0cdafee33e21195a85ff1698a2afd11d1db2106f46f36b29ffc115709b45fba70576f38f4c118f909ce639091e45bb86edadbc62849af689836ecd87dd921198e2876dc3efcfc2fe03bfefecf88c64fdcc356201fc92e6dab9b36329c8c1f0cbbecdd4f55054dbd1a517e399872fa9955ed92c3e478a6289148c823351bfda3d86197055db1e6ff30f65d4a397d209479e4a07a59c0cc2ada7ce7485a61368326c6e4a2bbcb288c762beaddbb65d4201221ebef5e9dad759d887bb908bda2487b8f88f5369154ee093004489e2a7222bf8a74f915536c9ba44678ee1f443c86ab859ea8d60c7abe2ff08d2ad0bc4225a9c6da37c5428d9bcbec04327e9e52a085b4804b2cf90ae0afa368890638d18e0a7adb28f513dbc4adb684b200c7e743d197dff80cf5f43f17bbbb0f955f48ccea8b22df409b103164a8c8dbef88ab6b059010c040546d8580819ed56347c6cb3e9b10943aa4d1cb9178d6d506e7b4b311190744a759384f9814b71604bcfe36828da1215cfc3fbbf01e9307e70ecdcecc0dc6a4ae3ae5bc34df177ccb315f6ddb0a99f8907765c382033efee015cf597dc53a29670dd6414f50ee3c9c4f47dba04a30b6f0870011f8816ad4c1ae9df4f004241e2b08d964955a6b70154f3114fc88fc53b82c542632d041b42e74354000dfd0fa3b52a52648a5edb4f4ed6f071d75654fc3f34e7f574df278e468e1b83d1317b5736e8556d8d24df639349e5a8d5a7f65bada9e72e3f4de71a4b0fe0593f337fab0aac880c80e42e494f584e959d7a552017a25eea5ce99ba4f4474b3b06569dc98dec406a98d523fc1fb42348dd2eedd0f1ca9e8d70dd7bfabfc7ca1e0e1c75e770022422b588e69d754417e4dd52bb2fc9477bd17ffc0883c16c863b24d1f30769221753916b2776b8786c1188809000102b3758cfe50e6093405dafc67dd6c179d65a07a72c782fd742566c62b09822aeac343c5d14b95cdeba044d27cda08700e4bb4bd0aa5a09a2ac023a0ec63fb0f94f322eeab43264cb816fc7cf8714d74ad4d190e2028b5c4fb61646f333331615eab4234c15c0eb8605b76c953246a28785a3cd99e89942287478b4b15a0aec11f23869c6b7b854cac2c5ff6aed3553d768f17fbb02bfa2b0682348a5ad4db8f22f7e1b4501158c13757b56bcbb5275d92b9ac5e2d0d22a5ad505f6d809a46b658896f3363660469755b417a57782e27569238a235fafb3e4ff35f0b8e5b5888fb5e3ddecfed233ede638bc930da9c5cdfcc77be959182653dfb100949a40bdff561be8c218982a562f879c6029ffb7583ddf5a052622262dd2230c61f74c72e93468f56071695c5ce5f2873c7f797974995890ddcf3dd842a27fa7d58ea836c40c572411d320b361e0688267bbba896e376e4116c079d2620b0611a8542755301d4bf51c62a576c23645cdb67938c53bd8c147d3881797a005881b975f003ca72cbc0d8b73f69d1e087328a408e43b33bd283f93c30098df503320e10e749e508b088bed2b0a56bf5177c33a663e062e97824451e06bc0c3843cd3acebc3d54fd2b87cd8969bd6550a8d3016a5366b104c4aed26dcec9c046ebfea97c83c282accdc449eb73da8dffaff0a549e99b5e032fef8f47a14c2ca32b0ba96908be818d901780893cc133e9fb3899c5e34657a637ee7166feb39b9cfea984ee9b7f9d30d22d96d0880d7a4079bc8963dc05080f5418c3d2ae7001b65719c6a1c1bf337275b141c3138b82acda3074468223eae8557a581ace4c84d5636118e5228573eda4220cbf8ac5feda658e84cf7813e48586ebcad31b0026a85486609e02a0ac3b8814bbdf677b103f0c76861948149a0411a780ba27c292b4cd44b25200cd13788106508619641542d3860618bed95e171dee5218e39e5847446aea0d7c1b0a4909d90bcdd428ea2a4b487023ca488c21aad1a492a52981223b21b78ef7b8c1a90d702e288a540227c79d41f988c85ef96206f86d43faa99f0c143d2c00a054922f4ab948b184f755791a8c1bd8dfd4720342058bfebb72b9844f7693c835951370eb8e5f7c830de2eb691b70f5e7fc1fe6e83565a03795fb57a6bf215a49cec9e3bae822d31842c725116bc284c245a02b114890bed6b12e0be40f5930fcadbc3002eeccf9a50e00b9bb4e6f267b1390c5bcdf89da81bdcde949edebb95049959d5343cbbb0b902dc72d1b754d89a2187c9e8cfd78d6a87c5c83a7b18ac4a45121e2af9e0762b5be4d719592c2ed9397ec37c727f64f96c9fb0153e8b1655842e52dafd62dc9d1d9ea09408344771338f061ba103c28114fc33255eefb16c256f82af1bc07e5f0288d3c4ff0e1e7fe4ee3882fdd89c87f13129cf44d7736abdaef9cc13cf038953b9279bdf864ef1e7905e6eef1badc2ef3fbe2b7ef79e020b893cf11cb97ccd38b6f7bab917730d73eef2c5f89bfd0cd1d0fc84d291e9dbb6a3e6dbc41bdfab757bce6b68bf735f96579963978f3d47134f415dcc9e3bbdc4ae2fdd5b5bdfbc037b85f9f33cb0399d39b471da7c6ebb2f4f327cd8627b5fa9d64952c42e5e3b2a3f2f6d2e777fba9291715d46b075de618c058c8b3fe6fa93a1d4077d934f6d80555132a57f0a8bc16b76b6ee9846e2d54f4638eed70e1a48dcebbe6fb3f0902f9db8e0f6a7d29890c7ba1d62bc1da0e2cf07f9fa7d6155fd14c34d602814e128eea92db34d5e51eb5f8366d532f94d9b90a342a78defab2b0b9a1eb79ed0265a9488cfde3fcc8b800a058681cb09e2b16e7b0a8bc852d17e148ad0bb9a4f7dcaa8ea876fcf90e92c246663632b269babfdf4db5dca2b5215f40e29ae36225bcfd04c234ef5d39c616dae1ca0286aa2dae08830c4361b792fc13408bfcba3881ee0c87c689647edd3d81465361ddc558b00163fe58ef9a6d68e2c2976a757a0403f9a500853ec8e1a4c24c581fc23eaeff90b0ef7114873504a341c864c4ed3036548b31323dc11a0de8256f2a246ecf3e80ed2b59d0cab4d4d24950e3612d6281df3faf40393b9652f074ede67eb7e7e632c38b20ee340789d6dcd02b361de7ab368ccbb36b74e6c91e04716b38de27114f399020d22b76ab52f279e625e4c6e59a2cd1c9989db018033f274de698d3d6cd60b43203209672f54e3072992fef85c21c7ccdce333323d9cc3e2ce17c96de0623cbb021b26a8be4439b1c96138102e8908658d6601f037ad04049a3f7ed369beee98e875b75befcd1f8cedfcbd4a58383fb1f97138b9e47ee7d5ecd2e383cdef8b938b5fc64ec6ec605056e9fc3eec8ab8a3276bfa72cf0a96aff8f908eae38653d155a9410acd83cd884ebacf3083a889ea0e687e42ced8df9c19ec90a0e974b4d4d6df94c8ebc81c2fdc802d01339c91aeca6bcf5f6cc1fa6ddfb394865fc57c4ed166d940bd5f3f135bfdd3eaf54dc5c0973ce9bcfe627d1ea04ec7d42e1fd8fffffaef1c33c974e5049f271d8160e36f4478f11a88fd8d47973b09baf2f91d39064b00c20b0b1b5e89194b42599c93e65490f34a2b410540d106010f90d06c55e52cadf588eedc0d3654eb8212b5bace72432f698bb18320db929d214d16381c4ff8787ec9d09320420a8573204f188ebe8c73ede72a5fe1407e1ade41822068ec16bb2444e9fec5b9915bd9289cce93e18ab8946dae74bc3303bb834aa1fcb18b8a12b39d9f6497cfd2058882e65a8f95e4b43c1c5e447afca1258e578026641b145e492a5dcfb261192c96f3b5a4c409a909114d82427101b54bf5e0dcc67d55758a54fcf96844a484434ef21860c2ebd2585589dcf3cffc6893f49c94f615031fa0278b2ead645efde4c505d5c998bc9ea4a11fd6c4fa9f1dfcc7b8563b27bc1f2c264ef16821faa6e89d6f25a52b52eccb2e7ad365a7d19f1a97831984445c8d5cbcc19be3bd602faa0ff831b264f0fd496c37265d6b7e061fbd2b73ee1fadafdab45c428822b4ac3535f50f244d501ded7534aacd10b01a2aa2af64b6cc7c1756c2da42f333389985c6476fe65f98d59198de3958b1de1ca11495d30791f9069b88f96f3b25a62a1eb20fc30b4126bf9f869b5d91d47af4dfec6fe1eff35d06600e030cd9f11139385d6522e6c270d3394c4db70fd31b59d77f54c6672324ba7d8cdc25c41329ad3a8201f3e9e156b2382ccc387b746429abd3c3353bc6b44168d2ba0b58c56b56a199c0d6b93175b654aa1bfb52053e5fb66be8baf3d2453363dbf8e8cb6f279c1e52bf66200180c7ce52c82a0a4b06ff06f4d4707a535d963202a636bc075545a4500a5e83222b753b8376a51b6dc1ba9a77fcccc2621c74bc5e5543f83519f064d01a3b6429bf8f1e50c825293a91eb07ca14ff1e9c576aad63fe6ab2c9e710a40382a50ab6f2bc6828dbc64c6161b1a8b33144a2112326f299426b8d2dc79afbc3c850e30a4a9f07a02a2fdc43b7b96f712aa432bb94923a05c35ebd7e2a115136508f57daf416237c443675ea529ec6480694949902302b6720b536edbc6c8964c2ae8a809b2ececc72f66685acf60f02e641954622975a5c169e697479d02cbb0cb7a9c89814d9fb4105a714fa8282d779d60f162d2ccfb6d4bad123005cfb31a1e91b701b63b73a2c5eeda02d8e848ec80ffed55217cc36f7059addf47edab2cbacfbc5f2161875e5e962cc86793538a088e9ffcdfbb6d47b6f826ac196ad485cfd0fe98e168b867c15862b7b263c5a0876ecbd9c859e21fc08785367f8efdc363691c8bfd5c23d3b1d03686bdbbfc4e5169664bf3df926f2439734532ae14d445ed9f7611058a475cbe9f7f848e0f628e49b8cb1c7724f385b5f392e491d96541575045f872118bf80fb372a2ec74b066a9e49bf3cb7b856ba574cfa8f034a47acb82f1ca9e8bf641d193c44817771d13386bd95b1201386ddead503f36211d82385b267b004ccc27f081aee812e8bb7be4c28e687f991d2df22f255495f25844cbaefc1d4d0a69ce126121c94edd57b3303cd4ed81fdfc529c37003c3e7b8f715450071bb45efc984f5275fa122f8072a37133b8274873ec0be779b28a62ad30282e99069d38cf6d6058e99bf8f0e3c2c8b91df3fedb2b6f46474d1bc4cb3ab1cb881f0a07c45d0e1a44f41b0cd0ce81c33cd20e4b92f64b1638e43d4199e3835ec6c07bf467d071738f5e6aaeb840c8de988a29c085ed5ef14ac93d1762356f5b046cffceeac19494fc510cf3866c4947ee470a50c8ec7883cd474acb1831fb0a4e0d8edf1b519f287a385e06ea2c63badbb3ed383c8e0a77e9ae3cdad783d7583a0968affe893447cdd2463d6a3b8cfdeba47604f78031fd7cf4f8e27b0c9c903860e00a9f48c2da4ed32c2f9c6cdcf54d70667d679751f5e10a8dba69ebcc4ebc5bcbf844a9e4ac2df5daac593796d69d1f5538b998a5f1ff4182f9125951ef85c313ebb204d86159858387514d37276e801f74fa0bb98d1ba546d6aa724c5b726a3a14259d27821cb69d193efef6963b5ef8538b9737dea407e0c36061c9c37d643911cdd38ac1573bfaa0c76c8a577ccf8044410384d203257d5adf3464ff4c91b7dafa01d6965e2c1be487a818ffa74a71db5599101b3e44b50fb87b126d0f259d378e02ef00e1d9a53b06d4f69be7cccdc64efc68063869268f17f5264f90f29a873b6edc092f929da871548ee77ccc22fe1c4b827f31ad743aafa11e7186cda1877801b22484580ce85087068de0b2cd3dbaec97f82b99f81015ece7166a183af66e41d27b6ca420ad064345b4ba2f289482c8ea5b4e9e036cf7e0b7f4696d85146e9f0415e75865836d389cd2df259506adc3e5a3d42a590067665166e749243ee1c9395e390415367b009401b1488ecbcf621160c719c0b92aca2c094ea5f0dde18439da7f3bed186b1aa57dd514258c3701256506f9cac1d766434bc9ffd02c03e872a02dde52b0faf83dfb52f5e1ad1e52b0b150410501dbe4f1e8728aa81b29444fc55e5c1489e6dc63c9c226ae0d6b6cb1f981e05968bec693fb804ddea6ebf0d1bfc35654defe7cad380ec05b1e1294e779b3c496819dd3485f38b8cd0d23fe4f15e70eb3d5cf274d69b5731e3a2062d39311a60166380c00367cee689f0da34af4753d0ce1e6c63477f50d71fc694fca2d636d236dcb95505c0afff9d55d8ec6afbfc28b21d2b9f772659486ff5c37db88f069f61ac4239557ae9da711bdc3397ff3f6263f4ed8cbd183ff3c92ff14f6f1a6f48772842fd226304d3747e639b56f6b313cef47b010a8fafe20ce2c623f2cc223d70bd19ecdd18ba7c582026f9324f727fb98780a234bf7ec0f690dbdaaab02b24619c83476042f9f88aa20d093e9ffb68d6abf18bddff18a6d3fae823cf43697a5f187472ebb488c69639078be26eddb9513c0c985c0b007d9e4f37df94f816a17b1b7db64df6c802da0e70a5b0ce66579be298ab3f1f2ffaa5ba4bdbb4dd196b98c6bd6b50e4e7a6852cc6cd77e797291e066f218bbc03ea2f5bb38ab5dbca1d98853d19ac1cff29737ed68d92565fbbec2cbc0ceb41145c0bc25c4771dd87250b3b3b3523a8d5c9a415fecc7e5c29b2900f8eb36ed7bb538c56b7da954f81053c32ba56694d513798bb853082b4ed8fbf25e050bd8b1dbd7ffffd57e64f6f3fa5bfc9c2f2c0757ff97bfc9d7ede2f27d7138b81a9ffc7dbe6e1f87eb8be17b06eefa787be3fc290f3e5fd78797abcbd7c5f1f86a70f0f9f8baff9c2daea617cfefc7c9e3d5fee6f6327a5a1c9c7f3c3f56ff936bcbd1ede3f13ff1b9b8babfdc1d8e6e0387ff8fcfc5d779e56e78f57d789e3f5e16afee37b387d5d1a01b9fcb5c2d7bc42d6d5b07b42565eb07b67cd7fab396ba5a7fa9c511d3eda29650d2101413afe274f1a3c18dcf8ba9cb27c736bf6e27163e0fdc7cbc9a5f7276b0f5777172f9c1e0c6d7fbcc658743bb1f97e70b1e066efddfcc5d383adaf8793fb1f060e8fee7dde4a2d381cdfbd32b2426111040153d093bed34fa31af2c4c19304eaaaa4342ba0e0e9e10fe7494f374207f2c5eb8e84e753ad39dd3481ad15821aea2b05718700d072773b8721ec9c015ced6b5267e9559de333beb507af0134fcdcfaa66dc98d1a39d62cd77aee1d125d78a91b1dfaf0de0b74c10a4852f4ed586b6dfcd359b4ec820ff5aed598ad10d12d752c454739072c4f022efac79dec8dd5e5e2222acd3408639edf9ab57401d43c112bb5255a191897d784c3a7cf97e9405d2539cf441d5b1da33f0e4079985187a59b2ebbfdc0786188b97321a36fd4daf9d21b1e58507a2c00e572e43bb2124557279b04743276a3be0c363b48bf10fcec9f1941c8b068240aadf95b223d5d30cbec58754f2b8d66f14923321edac1eb9373b9c24f0f8bd0814f8ad2c828c3844212112e29ee2b6365e64d0010805bc1ab872010f3634ec2762e2db5b5b64bbc9a9e0f899acd51724313fac0c24a62b35bff1d0d9ff677ecd457d4717f2308429ab86cf3fa65c4540c4b0c0b00a3d5564471417a12cd3fc921d7ac51bc826641cc72c49c6babea2c46de4aecb125c1b8314209e603573fdaa9eced18d6d93478f87864912dd234337920cda3cadc9701c3fc2aabf3d4b69919cc0c60b3183db912e21d12a7553e15b31da829ccd0b00a893863a46c7a4bfe1ebc8c42058f64c1c653e2d4ec7f66f1e3cdf1a4bf5f0d95768bd414faff7c671b28459ba0cb2631d68ba87973633d7112fc8eb8d269ac7b2f7e1c21420a6f1d8acca6c1adc99a1f28d443bce3a8dcb36503e40a45ea8feea9726390e8c246b8d4f1925272411136880635bcc8804cdbb9d1245f4393bfac9034ecc869a7a3ecea7f549245cc80430c2ce3ec2f91e273f29ea639844871edce7933df1270c3ccca2c1733d12d2f4bb59d9234a333f4eb31194dacc61ac5038718e36a1ae9ab1d6f4a5663226950e1158f2183be6a0d25115f1f121904e6f9e5332e230377e82a436c40f24655e381221463dd5b49548a8a3fd1d34ab3d9171d134034c4b8a72a95d08d432c4020bd16fb4f62223ec8e2398c666e5c5fc91b311ea94d418a774d4e2f92b1375b71145b40b75dc090b42b3e10ba3e3f1cd326e0a2559e4a09ece94b6e21f234e20815810b0ac06b008645a935f6a3847db85963a7bdc11c64a274bba0f43387840966e6fa002ab30cd7accdb7701adb12e7b3a25a090893ade906779755fdaf9af3f7d407cf343726a7a3f060bff11c8958083c2e572f2c25f32a2bd7412177efa2367f1a8afa7da21dbf460d57cc6f8508b1d19db2477a2db181ea06d8312c03f1af90357a7e5c1b97d9bded01a31edf749c0bbda9fb96b0f28c345727ac14be5f74b52ff6e787abf0f553ee3d05241d0293e70f12feb935ef1663b20bca338715441902c736e780d1b447823703133e92c2b175e98d57aa334fe2c957d7fc4452490b3f2961732cdc24f7be3fbbec4395f260f9f1f01f1f3a777d73c7d1e511017e8b824f0239eda4d68c582147e70d14989bc27f14a27794312ab9a50948f7a9d5c540f482f53f4286329632f2d8f9719d7b9db941c9866de8abce3e30efd05037cf048594cfa8ff5c2dff35ec9a5a9ea2932d1ed9ce51d130918c5f0eb160dc248c380cec8a0ca8a91ae491bd271554277833ec575f81cd41b777882e40f89bdfab7b9905789c608f95bd1dfaa7c81b72ddcbc8cd5e5a5136fe15531ec98eb941862cf2247a92c6c4c52d7b648f1aa1a0171d2f24640a9ec8dd1d9368c2938b38326fe7a25429f677ec740e3a107da578dea02de55301dcadbd843e2442d1074c953b3247ba2e119a8f95eb59c04f6d48226df94b0e6cb2fe94b35c269c3a92dd7e4e73c6a99914ce1529a975b6ab1ad904235a32389a5bc931b2d3d931a087fa1d994a4e466345481e67824696ad82caaf1dae93ba9670d08d4c0efa138de5fa72b3cd2976309fa1ebbb0515ba7d8a4ad1bb46b87e7f5e474456c06384990c59b0735a401016e6ab78df6161e93aca7025f73b5d05aca0ef4c31292765c1b1b6ce5505de6e3b984b33d7c6b2217ac0229347604dce7d260d52d8569b794ca74dd32fb9c3d226bf8f9783547f66ba404b85be7f44fc9fc060f46359af1a41bef58f9a74ab75be8b7d152384812b0b15d161fc7705ddf0e465ef05341a1dbf5aaaf1fbe434239c1954852d9760aa5ee25c7e0811bcc60a0523eb904d0bdc5eea0bf4bbe29c76ed663902dfd80c2314035256546036162a17df2782e6975a7c02eae238aafea3398de189eb4ea43431bc1261b1c0a7a816f48aae539749ccdae3f89e8a616b8ada59cecd941b3b79472f863ba0c9b148eea9c812a0c9f7124968f48e182d2e3e363a87091929b2c4de144fa43523ae275fe03eccba02e7f9729bf69aa7d14fa50e6f9dbba307d87b4127facb3e3e6e2bd38da8f717584283553ab9b201421130edf424abfbc019d47b36c0a2d2f7cfb013a87c70c1beb83e901bcbfd3d66c85a39e75f00ef6250ec0d75fd4559e87a20d8bcf68c13d1e285e388ab0090daaaa3ebde4be18c241b39c5874d0e3dc2f337a0621189371704c7fac505b2b9d47bc6c858f7b757313630e5c83bf2c6bec86db1c94894275ac4262e0e3a02d944ab7318b25f52a12f34361a5bf618ce37c5e483592132852f08e8dbb55296eda602569f472434986a4f02e5ac4257cb3f4fef40f735c67d79fb6a895873112d5e06adcb97688ae2ef4d41ae8fc1206967be228988132daf665b16e03bea201ee04bb690a04dbc2163be3c96703d6e965865a95a18d159e62991800a9d90db035f7030a5eb19c1edcc16c96257f192664c33f03d445c67b5325e3ac14c4038974b6cbe0eb87a2fe082e3f3f0a547cc170e6bba70295375b9255476cf8ed07e59e396ec4fcefab6e1b60c7fc3bd6e7fc277dc502492564f000841b1f8b32e32dbdfebf3625d6bc031c9b576b3ee01a353daf428495cdf76e29d62f2b52fc48621d572a66480b37912b1da5e1086c335fb1bf2ec30a1aee85429892d37abc54481500ed0d5434028f58287dbcff6fbebaf8dddb4100885dc7630034844f5cb7a125e9bc41002305e3f486507f5fb0bf23536ea1b4121eca6c47978154040f34040efc806b638d505b7aebdb91c4681bb38ea19958c96868fbc689d07c1fcaba7b337b114f4d1119bb0f281f1c325ff9ce6c142ff54de09f678830128e8e914240d5ec2468e07092e39ba038f2372cd2a0470314f033d60415d019fc77e43a9ba90dbcbd5899b16101b64097b02f98d6c4c421530df014a97d8b32e730b1b41e7c732489610753548f37959b1218807854237fa708111d457ddaff13a7fb55faffc0f1df76b874839d0a152a294916e8b9428a9b5fc3dfd0ad25700cba4b8abf4d215122f5bf425198dd14b495f7e1606538363c469cd92e5c5fa0dc47b45278e0feae30a9809e4b4caaffca67ddc6c85e75bd9fcbedad4b82470ad1ed611677096aee6631f1953b40ec535d36cc0f34dd9e9865e9791218466571af2a51ac1f11d10abcd8a19832b80c4e3e5e5c5cb50ba607a1a936122e3592304a329cf1484ab1896dc866c2fa4225a537eaf5e9f0e3bde95a4e9ac4ed1068728e2d475b7700f732e68ebc660f42e782f02180c916b4f62183897e05ff700b910b27f5c9f0ff5e18f27d6860d2b95706a67ad2bc97fc91f9f02783f89ff181c9266e0c6b4723ea59f2896e4b1a11b91e8ce8f6b08bcdced8a65de5bf3325df01f5321bb96e15b30ffceab08ad39112b5ef3edd743092b6ce00a15befc4d97f76c5e5a32f7e73743cc19ae94c26b3094eadc319eb7524dd945f46df8615cd6512f7d366ebb4de99f335f0d1705b12dd1f799db37f050697bdc3b907e2b0854a4a111be070e9a17f5b247e2619f2143a1afbcbee220633efabde87f2b63fcb2aa4e626c24b33957767c201d0e42569bc2bfa4849c69fea3582479b63022821e85a6c5b32ccfcdc34439abdbad73996b8bf9495f7784d3352499ca8e23755381e4d7d5025e353cb34cea8068d2dccc5822bcc69349001fb6909b0957dbf989f44396105ca110b55ccfd34e43e92a7dd25577f6105fbc2069031b6e99484c296504944cc1f8dbdbfe3e3e33256234079fd823037c24a3a7fad574f48b762dd80c0ef3282cddf4d81bdea6549e95351bad995d5c38d08ebd3958f769ca3b934b99003fb8520e1d8d70432c6c19f15ad19e4d7869caf02ecfcc2141b40fcf1ed9d2135e1bf0e538f457e0c0e859e7778a95e8178f2e3af26370122477c0253a6e580d8b7e639e5c0d764393ed7977b996732e02080790203e7c909673a43cbcdb37195dd71b59a3d81fdc9348bb1890be7491d7712d5fcb12209416be67d0e946781656a67a93a82b698c2d5890851e7e4b38debd756810a542d06ba4f20c17b5d727bb0e1aeb034dc0b737d6b1b4e0c18c75fba779698f0f246eb3df3e866376206a130ba35ff3dd7a40395b011b607059ced13a78c036ed5c2b60abf50af191be351f4f2b33a3e33faa9a0bf55fa89d1c19243f9ebe5cda270c99e88a22a7d3f78cba62be620808537d738aaf0022b0baf49516f7f6233dfa3a7d0a96eb0f7619ddd2fe31f16151f067e06c4aa027631881034b668bb5549b3abf63436097af62435db02dbf96a87b18ddf182f96c71cfe65727f58d12bd19053d02e002630b8a903817ffe2bb4817f593d76a714d17a82655ea9eecf17b0b90a9661fc13d2339f1f88be53db87872d0bddc60e27358a8fa696b9e8a5eea23d2ce93178c5bbe14481c946c665e2d7108f714d56844a7a9739749d0eb96cca6250a816693aef21faa39dbf77c459965bc0cc633e53856615f18fcca9e19b703d2da2695d3e8f111531b51c1d05a3a4a2988c2b16f658d9ebd8242a0491fb36051ef340f9ec462e2da0c18e6fe1db4bfaf9e5155d68a8486e01c3b05ba7d416ff09a746534785495ae2b19f8acfe504103dfaedec4c459d7f5879733ed5d8d45c373284c812f56eecc1927c6189bc6370d9aa5bccff7711b41dd991eb0a3bf9817b670abb08adfe98ca4423f16b53ac39c1ca0f0cf92c1f3d321c035fd81ccdf4183aabefc937e5496e0fc8a8665d72e4fd299b437d38c979516e9a396dc1ffdd83878b45bb8a0dfb23d2806774bed369053c5c2c51af9d0ff2e7c962d63dbd8f467d46e319938e5b6dfbd5a7a3df9a4e43eb315c6c161259d77ae4d88b03c6dafb410bd4cdd70d92cb2d9e4faf1c6ebea5f2c865170ebc1632b835c96733bfbea8568f28c2efbc3f2d011137c47eac12964fc6b31849f19e89ea220c5430f27c445fe9896b7cda096b2873c13b114401e0ec97e1797a1a899d8b2372ceacf32e868330b57c0facec6f42fca9fc30ab863cdfb8ef96a48c8368f45e62974e7bf2c1afb77cffc0af5e4e7c3ea802b7cf374c90a7badbb5dc39af86d3e13c6faa0ff491abfb47dca7e6594f32be877a21c01be7d5c0c597cd34953bcfda0414380fcb3f04eb4fd43f59ddd1103f3601c4b8d7398bff1d48e842c55278b9dde4433ea6d2f52c234081d276b78eb317ca9cd78338c4d4c0d3bd1b7e39a7fea9e876ab208d2daa9e49b61a557b8839fba19a07463d0f574309f1063f31c6411bba902bd2f9c4ba760e237d262c2483cc3de200c2fbc4f225cfc4fdf151a9560ee8f583c3e91367112ea9ae30a47b09808b0db9b96ac469f00f0fcabc0b14e26494ddca120d7a0afdb21c67c72e822322065f1a4aafa3b50aaed1d8920e9ca8929103f2e334335ca3ad5c2d9e607a4bf1123bf060111bd2d0e66f43dd6f8700c3b8d09ca2cdf5caeb9f5ba2d9a4f683b29ec1388fd19792161fe009ae8defd329deffa9bef7350d3e826f84d9d1330dc9decc6d31968fcf92e81c3690ecd74ff467e390d8b4da7b7a5b0482fcb40ebc81748f1b2e1e68e078d0c72c1c953f693652932f49515ee83b26478b9bdaaad46974f9614f5f909bcc3adbddde2a62f281338465c71e630bd13f29fc4a1231a258f1f4394ce35b919025c910b7f2d16e8fa78f0c14d8fa8b66c6057737448e6978cef145e2c036250789123f616796eed5f9238d1b7abb7de3020d15d6d679dd307e34623d317ab8cdcd35ea5c88c9abb0ad4b620e95c610b707b2508c58140f8c32e8855a9f1ce18d3d74aa98b873aa527ff291fc7fe32c7392db09808cac485a1e285a26c8d4896ba6a3108925fbc1081430cf8b7a9da3e8e0de9a8fbf7c94f33769f337920e86582ed3f1bc094588d5fe82b01ebd1d1d8ce0b97d1318fc709eb60b2e88a03d68c208943f7ceddefffb54eacee51043b39c003c7fc1a50fa77031bc267427f7b0e5d87bca8750ebc225bf9224724151850b24be2dbe3660305a91e6a7fc36256df564635e5632a131f30db9c1dc4b009d113998d0502df262f4d34e3265e07d4f7256b80eb543bb69ded6c8993d60770ab7f9851a46c4a2906ba2902c9216c7a4839d0591ce8e57dc8b0a5e5c697679345dbebe5ff47f20c83e9287d39e137faf338ed74dc23c0d0cdf0fb4abd39244e7e241a95b2c0691d02c799fd88a63e15b6c3be6e226042f8ab86f2fcc85336299b25d6ec32e719f8fc8c76bf13fd4f888dc1d3fff41cd487b7f63a1ac0853574bd052093ac4554eedb0026d2bf8e004770d67b882a06b7092c486b97949df0e61cf318e965fb1fc4a0777587a988d2e79ebe78c754c4c8359ceb00518e619b782541f1cbb8f65675d171d392429c7a9de48e6c1f9361a0afb5b6f1859e3feb789aae50ef3dbfead7f2769cebd870ce61e081c4e55074ccc41fe09dd8b7a8147671287e9d24de41bd7f3927ae080dbf76f703de02fe12b9ead4372409d631f551c2992d82bd8fcb16ef04fc4bb0e29911c934bc659e46b953cb1099504c2254a5d3094c920079e1e349b2bb49f8d0b7f208e3723ef53f9ca0a62549c84a8950725ca69406b619d5a67c05451c4b469ae5192d190bc3ab06212746656a1f46a049e1be142a98af1d523ea28f418b2858111e0428a46aa440ff071b6a41a7f52924b4ca5182c33648e7ee6a44b1035c7097194e564255f2afc52c984e21250698ce099960ea24de5c8d208dabed3191e354c2bdca7e23d62318c07df2e18100f78b1b32109d3012f9440485c3814b5a80b1bab71f5b45b06b606c34c892d1248b6fdf09e87307e1cf8dcb63375e7313bc4fad355e9259862c7240505081925b4b11bccacbd070b9d4cc49c04fe8059f8098e27efb9d8ea79d148cd67418eaadab5cb925eb082027eb5521d7a27fdc47f9355865815d657c1494b774b7b0c66b6b2c164694a4a51ba71bdf3bb287e213962168a13e65051bdac2a516a14457f8e0e3856cef41db449c059eb849278480dc0d5587093458197c9a200ce12ed87685758e0d6f3913b8f853e7683c46e5db14cb7bec08062d6e7ad208fd98b12a8ec8f92ac4b2f640adc146389323f92859d7c8b4b6730faeebd6cd57390670eb87d0a2fcfc440608dc07ba04ca3599ccadd4e505ad49529ed1eb2b20e1f92830ddaa409b6763e6c1b754bfda2ddd840a9d3774a94d8703bf4959f7f45c9fa5bb3abe3e54509f5055c204edcffac8f7b8635f61e2e476d9bfc225e6281d1975d972761666f39a2a0a8db085366fed94c4c7419404579f3cb6f0edec849876d84c4e70db90d073da51f09869b2c950c0981c5898008443deddde26604282385c1cb95d7af5e5b9f6482a313cb66d7896755ec96dac69ca1deeaded1923a8644fb3e4565b4851738836f5a411325a82aa8848aace8f45868db490d8e5887ce278319cc86a9d3583183d7a3c4ad1d2f2b5d2f680c3ca8e2dd643619e22260f4c029c683359a575a2f1aaf6957400fd4e9bea4c4acae0f0d03d5dd6796d535deeb95497fb5d422404fdd3496935d1c75176143e19ba9b2eda8aa96326973a00fd32d43596a8b20947b233f2b48741a733322bbccc9493a2e1e8423ca415c48787cd7c293c9905f35573de427b418c9db6c61429d4ed3d76cd505673e98a866221c68f26a9012e465f9a1d15c43756a39bcac875ea14712885852a54a48066324f4b13970795d295b8ff09969a73bc96d2a52fa50a96709fb008afdaec301af925b295daa82ae28838269e98f8bffb01fce9a1798732af07517b6349c05c37efc197e8c0ac73a0b2666bf6fc744b71033f95eb44bdc7bd0dd538971155292fdb25dcdad09b202e4bb43ad7be0df87347140ce56cc4c8d594cac0ff420c19116eb02641a538918b1301a33682666cc3d428cdbf0f563980fa767a7f68554b7a0fe2b776be813ed734a7f108171986c367ef2c6db60f88b725002e8103cf2510d50aa4c03617effcc43d8f44344fd7faee7234f9421fdd9a57cc2d4a241156d8e46360b3eaa6190c793fe130a54db09649709718f53e076ffd99d6be5c5bbcdb1df67909c1d3c6258f7510871b6e745ad3de05a08a828a8b0352cad41801457ddf9cf85529b086d68938b8be99f1c6239baede51e7693ea3ab4d40000bda183779b56559518e96246b9f09fa6ce465a425182c1f67ae289b00080d2287cebe33651473c0dc6033609179c58185d17e56483451f52b1e7d95e4c7bcd74f822f1163dfd6cdf3f11179dfe8cc394fce5a3c7cddb27d36b82fab3a33622fe7f0f17df7368319f64610990d21ef9dd2deac2fec294974fc473dc97b386a5d411c1620aa1cb49526bd3d83d5a28895bf2c204b43ba642f1dc73fe21f8d1e4ee78a1ed41f2fb981b1502e725ac3e50c3ebc4290fd19f5cd57b71223cd526607f8079124eff1549515407eca39c02d8310299ab721847e6ca48caa73a7ac82817be006334e85d7550a8a4f194187f1e13f09cbea3e781a016d49ae54534b6f7bc7b3decd80937eb703dbbfe8f82b0544304f98770c548446c1caf256369ee02c2de262ca8615c557d6d8367cf85c919c032e172310e739d76c1f03a2c566406bb17b6ea5dda3e0274d13387fc6786cf0126bad1044a7fffb678fa89b76e97c0e6b83d076605a913bad60798cc48b315abc04ec7fe2d1f5d1c4d4afe10389fbb5c3f7b8a1e1f62c7101968aee4d09dc3d95005401582b327dcf8861700d644aae30171809c98e80a14ad0b01539c02a30b2e859585bc02c6dc62529a2ed7d882bbb75f17e7d278e8ab2ef0ce2fc2d43bfa1964c8bf8ca7551e848c51503d705b1e64b94dd5332bdc36d242bf7a81c5e0a29654a11b98f1668cdf05d459118f1dfc84c90fa4a3b2f5347d1f2e9b3a9b0fbabf4f7db8b05997cf93f31b643cecc147b50ba8dab699529e1efc9e0f746984f01f66f072edd97154305971f4e1b9b002b7c8f1e9b77a399407fd8f99d8b74cd93c1feef5874d0cd91d8e70c34e01169b4c930f3bd2b8b03433eddd0bc42cbdc6ab80794fd7ca7372747de977f0e412813a1fc53d5dcba7f60590cf8f115c22db492b4b6c82ca917797ac13ec664faa31970205ed8d6a26f7b31ae99aaccb6ee7aaf5adab6ca3a44f59d9bcd3f0bc2eaad869b3f53955e427d26754cb494f8e7eee2a0f57d9204579eefc49eb91332af61f649f1dde4aba457c0f6ea24469732de826ffa456bd21560e8957f6aa2f490635b2283a1698da31bb091f8dc9199b8ce94d94b893bef5c3f2f159b2b7e161eceeeaabcb1379e03da8b8e0ba9db145a23591c4733fbb4d3b4819458e3b1ae79842e5074626455665b3e861cfc373982df15a3c96ec9cd7736c34684e0bf43d9f2cc536a0f858d67128186727cd2f2cb1606c466a64cd69c83d70904163764ae643b846e5e4a51f263e8608c3c67bf5ab6697f1725a3827030abee03d9149fa4ed1529c7d56a6a0080f70ed480bb210e9d71784e38918bdc926888e11a60819b92b9006c1b3bc0d6ba08d360f0ff370cb3c46fbcc4aabd08620a8fbb215379bf90c55fed190820314ca75885704a1c1e839e6ba972b098644317b53097036d7c438c9b2bce759fd97560dc864887853f7e2cc2ea9c5661312de8aae5263660cbb2bfbc6c596c4ea57e454c8c704ddb0e6fb033b90a0e15f53277168009b7edeb20606244e2c56b4eefd588f3c8523efeb87abe22bdd381c58bc5d3569d4730fddafdc7528d91ec2c9e375ec0c5bed976e5c9ace44b65ee0744684de02ebba6241070ee187203bc6eee7a1f642679b7e608459d64bfd02050a0be234d4d0edaa9840ec4950d6697a85a45292743f53219979facfd39e275c829b8bee5fcd2fa77267b76c07aed70430161364faaab2cc4cc783caba208c620a2a6adea32a80e00cdd71e224062670dd38551023b482da2bbd100de0e0209804ae9c35f8c80569007e5e91f3143449c33fe2df6af42b0d324f651108fdfce5f1f80f1e22409c43c423095dc6ca4b7bebc55c5350186aeac7d7667f2149dc6447039c73ef26385e6d21933b53307fadb53880439bee794a252acacb1d870050b58056a10afa54096487e530de312d883c9d9c110f0d3f129f3b5487cf895101285232f05e2219c42847aa3e40b05bab8539e74dbafa2c617bf83fc130f9c539e23f5fad571909194c13a252bfa5ede7504da5a940eaddf5a049cca511bf5a4302f9ded97cf0881d9f72e6326a42d3b5c36a6e83dbf0d9a98f1bd1d120fd3ad19a9c74e2c18e3d44cc411c312068b2dbbb48198b76ebaad9c681c00163acbb3ba88145d822a716cf915bcc2f0e8e0e74620884dd5142d67f2c08c9883120f31f2bcda9e490b99f56e015791582d700b107169f80f0136be878acc6fcfad0d00a146b15b3521a63c37da868a71682650255b7b59f3004f0e295fb791cee2b682bb6c0f6582a6233ba5fcb6908869c75ea420a39842a50bd4d5769caeb346210862d240b1e6f45709005b5f427e9cdef201d4d0202cfdc640528beb1def837bf9bf01edc14af35d3f32954b7cc1aa330cf50ec7aa87d5a4b801fbd58ca4b646209ed0fc39956ba7c7969885098bad321632690dfbe454c0b825fac3358d5c8e513ce02726f81d372b952d5cc8dba384000482b7d6c29c6552076a230be14c526384a0443e18ca1c04ed82c7e8fc039aa3102de2b844a7453eafeed3ae4781bbe364460276f6309a90e3f73f422a42309fa94dc57a6da7e0463cb59f63c44de48e385709805bda32e19285b18409711d900f23a75172d00034da9f55a3e3bf620bd5af0b7c399f94218d4247a0db6a1796744003887b10882437ee922cf1d5f08d2e27cee8c7d1a439dc2f8df725ae8b1b398dd21175c227098cb36b489ab8e411524f13adc37659ab8917edd4f43b7a42c7db98f38ef56615e6b8274f3eed8d95ab18d6cd4c8525e0baada36f8393e70b84e135cdaa9c2a3b77ecdf476d8acfffa71d67e1bf0aabedf0fb718def51b5cdcd282f33a5c7a5193269a9a6ee7fd44f44f345555af0e013e49c64e058ee9d941e32d166c2de69cc075318cfa295481b4f3cbdd05bbb12abc25b3b79c1c4914e5424c3e7f915d92b2b134373285d55aa8cd6c9c7189bf39169b8bb6dd5537ddcecc0c9f4a5f8e21386ec63ebae489d7bf4de675e9808a181276f3bf09923e47c2fd86ca8c08eb1f0f419be0cb714982f05bf67df1fd7b20595809981068276ea95bead39a8a273ac1075b1212746223770e957247f50afddd46357d60de8b2996c4f5c4608e80eed6cc914e55d5ceb99ca66bbf71367d902281074a3c2a6cae2e771088c71f6e3d06ffab51491f46f1848b71b7a9ef1bb010848792c9459a406c529d64071e7b9eed333a4c2479e32949ee5b1d568e0fbc00f60eb3231f49cc657eb70b4aa7d3b7322adb32e2e4b5c15324c47f876e0924fcbac6b5f8b88eea76eed285cdd439a9804209eae89bf272b9f26f2ba28a0fb63d385f81030057de520622bc615c02f40e9fa501147f01fb5b605d50bb6ad17fb0d0ad8683a7c8d8213138e1d5d4ec8b9a9645e61e09afc520b88430341a46b518460b48f2377e7f071e8bf5409a75f34165bab2f25cc83c0f5a96181175f3c8c3ad51139bea0ffa805c6b45a9b2b4fe23375b0d8089c5cf9204c2f45421a4c51c59466ce1b1f159f28bd93e0ce17901357a05b042b217083a49dee456949c21c0c7538c63fdab73141ae43a3380d363b9a0cd07bb240d8dc5e147b602f76255bc761c75bd1ba78211d1d443801dd5c3736b9b2029078bb40ea5dd5ba5a2b6f8ce89ba138fe8f8ed4fe297137127186ce0b47703b256232b3a508a00f978bb61767d46d66eca434bcf2c68462e7140749957582919611f69a0971bc59fcd2423352ca31919e691bb40dbe6a06f225c3b26ce56897594edb060af80f50baf973399e00a2ce75fc92ff18c650133385446b2460a347a1842c16c73db9046c8dd7085cc5c154168804d1587a7de787154486ce6070fef498b731f730b66f58c3cd54f043e616776eaa43d0de488fc008cf339c8a96420dd01d5a971357f7900c246890c091d8392c16fa2ca55e06ce4f8be927d12a73ccc7a243a0fcc7b94c2e8023a73ace0656e10a3e2c9a25789344c2a7e5014ab6b04aee714755e755ee9e6d62b9cd18601fcc31998ddc2919a7ac8fbdcd623a974004be77b07e75552b66874daca2612b7ae0cb61523d8f05ad4e555a80dce337e987d513c4ac0372f0caa7805b34d65b5dff5094623c8a2d81c45a8400844f08996cbbcb0f80ce03abcaf2dd3fe920027767fbf8118970eadda849803b09bfda67d404bcb8a54264d0b53a138da0b1a0ac07a4a0c56e754f874d946143c8a17feabebaa65e760779c4d825053bbfe01f23f158594223cb5d5b0500e0f033655f11a974539c369dd2cade86ba0625ea13cac1468ada1ca2af09cdd0bdb5e254bcf6181a2bf1030edd2838a154faeadf8403f60c2600849b8e7e213c28b1e84f483d95608fb1b5afde3679779ad82bc3610fe53bc52b3696ebb77f1be1741d016468d31849583a0385c4c82029018b406f0552724f6caddf5b0cd2a6867ca52677389fbff22608ed8e42027b59ce20fe184fcaab1c9ead71dee79cfedfdf6dca08d124b727f70f127ba59fbb6940b22bd27c61c95334aee52be58a463462435564daf99a1c4b03efcffbcfbcc16b38ced9392dc3d45de699d392ec59c01b4ab41c4df0fbbea455ba7d4c682f7e32cb1893cafb7c1a9151638391a83975adc5fc686f86588b849cdbdce80d456db25a61e86bd46a2ac3bd27cedce9838c3ad0f69fea49768d15de11d520dab17c88401680973f6acf8efb44f32209d40d654656a1843bb2ef322933ec2b2d388e51a977123bd666de43525adcc07521b91fdd8a27a247cee7b96b61415f92c5a51670f89108c8589f0a42caeb46f87f442db79bc3e4765e58b264e4d44b867f3770af39ce6e8d4a71d9f8c40b5ffe5d94383a9c4e964ce2719b15bf9ced949a6e600f1d2b8b65d69ad49565b13289991dde27350d6aec2e82dd4a203591e3e599d5463f2e392a794c51bdf1996ed4f0c8ddcbbc6ae81957655e8f872b149a3be0e3903179206b4d32cb93f0999f1adfe5df24fb6c16b89f250bfc1e1f791233489f021847bd5bb431e1ccc560f4403f4bcf0230b699bd203d4524399129502aa7cc4384778bcd866f13cb7e91fe548a7eb1890c24495b1eb984d4e83da1f2f81bba5b14c0e426c9a432303e9f45e582be452389c77c8a59cb41a099be213ece84f7d8c53384ec4c36d51d77f1ecad44819be49c6df2900e870685f5b99971a4523b80a3c6b31a3513511cda8154b4000d0aa174a181068651f463d87bbb845059d25a16654e8e4c1fbe3a11af3154d3cbd33d57d27c39562e71265726e723dd4e35866317e28d31d4efefaa0b3fc607189f20040fd0da13f20f840c11b6fa97bacae0baa833dd1fcaeac2f9d30792e30e050f7831c039494a1e405e825f460dc9410ace01a654fad17d96fe19394edccf27cabbb4d5e0474e4b7208f18fe7da700ef8238ee7bd9b9168ac49de307b5d0d5f0bd2ad8ce84f3a9940c4270e1842340c478d97a9ce93ce9c2f6067e4e686136a512878904cf4ee848054370fec213bd9834a743c75d69f985261908aad7cffdcacbbd20b22d8078a66b5cf7e60ef867fa4140853f13bb79d66d3e1f60af1352d6b651e29201c58c507aca72d88a9b00d3e278b082f61d2ac28bbd9e2dbd8d87ec7667a5637fcf4df2f0c7cd3e002a83d3b958ea307fc3c07aa29d15c8e9c17a65ed178953a9d0271799f811990d611b748b00a8e9b07f9ae3e669c5d71838542a7ead9a239c884cead8a711098ada29eef3eca719d3df012d9dea59055215ed964f8a4993174efcc3234f2a5d69cf860283d0718418c906f060a006bf3b01c288216bd05dd3570de67aef0f01a5056d4c321a08e9e895c1ffc170dc65eda06949c94f4d6fb59d5e463673a73eb1b2f550f53b1e730ed9dcc1a2b217f20362ad463e982046beb336cd9be409fe747a0ddad3d0cf4c213fa1b3b218e86133633f09019f079ae34ebb7806ea13bdc487772033378c58f2a5e0d71557e67b888053d6e7ded0ef85f30b1a68f1ee378c9ddf08c909dfeabc91ce0a8d67927a0b3d5774ab9907b33b9dec372eb00cd4d004c24159158eac61f48946dedb1e0a56c56a20d4a07e47e056333a46aaa4dfdfd44d4ecf1333c12fcb8d95596ddf7d2b29c0d37091eeae41f88c1f011926601f43c0f30112b4163e6383785a244367315cd7623a3553f40f05db764e0466b7c8ba461d058c9bda079d42ff5f611a5c169975206a0f1feec336dc7f08d0629c9929c12b063bb76590583bbf2dad227cdc5341488d739290c7329c55ccce2877472fffb4a000efc82e9133a60b7c987d50b8b8d2aa2506fb1c7931082ef06e14f9684d3e3d08b28b19b0ebad5507c4ee72a54069c4fbbfa64bf7ddb7b657ca7fc831693576a2210c477e482b2bfe6ee246d6080fb09ea89cd4eaa24cb78326e43b59f7f72373d0d498194fdf1785f8188eba8f5fcb7e5a2f30f88a6cf578137630fdeb7f33841f759ec1515fe4cce6875e609c8cf939195cc9507ad9e5a166704141bd3a09a7886fc6ccfde7c6ec35f5c0302e5e2c67f7da3ae3043a5b1cfbe8cdbde5a56cf29af356b190508080e3dc77bef9591bb604062da1a7189894c11b748d7e74aff26ceffa988df480c3143dfa34cd51a94baa1e703552f3fae5437ef8a7b4f922a259b4e54318d04e77f40bc4cbe16a0f264069ae63f3adf88ffe8c5c2ba7604f8f0581d511b7b3163027711cfad9fdfa596418ad4b46978b6f71cc870dcc6c234b9a0c2a3b7e58e82ef5a686d7ae7a4ddab50a789aec9cfd510149db96e636dcd3766a66a0a9f5f939381ef86c9b3fc1b9a036bfd9167f3a745ef5539e6ce930dfde2ce3f8d8c2191427ecf6a23b834051b92b5fb3aec4cfe317871c837ee43d7b0bed101b85a10e60e4ef13d35cd316acf2f93631c0dfd368fb52ec9d8507d80989da0465264e10de57d402bac3a41fa5100f931774968c8a8542e92f75fc523bb43c2971a3d09f3aa012990b302cd1611b092392035ca0699c9e8bf7448f0cddaf17fba233b020a5ce81e30f486f581c98a98d7ad79b37a1bd2acac478c50d4f5be2aab895cfba6189f70c5419ce567dc396bd761ff5293dedafdff4ea7e9a54696897d64aedb5c90693f77ce1f7d4b6c3fc880d00d287b24f0da246556e176abf3b0c5d7b5c843abc8f1e2fdeaa0cec35ed3a69aa8bde22df50980c48f39329ad4f3c3dd24bdc1ca37845955a1f9ed7f05b248ea7c5deb3c1061471b7068abeef76cc6e75ea3c8a6bb93fdba7e2cfe5c1bfc900bc00fae2f21403ee62269ad1fc9f592322d0f348479dd234f0de7c73d0e47bbcf31eec5a9282706643719b9ebc21506d665ce7e476ebdf7faa3dce63fdf179687bc1f09df1eb9b177b18f9fd7776bb37d4cd73325795f821cb353885887c7d4c7d54cfffd3e9932226720cb09193c73d321bc615379425d3fb8bf2d2a7af841391320909be7ccd7ce6ee16d2d7dc1c03dac3f146755d82aaa4ff03f96f403f07e85546cc81b13202c27d4c78550f3635102c367142539ed1aca89154155f6bb3154a1a6a0aecd18fdd65b3f4f248fac7ca17e306d1f0a160f6070f87148a60c8477428ae09f66c1ad3204886d9f9b071fbbbb18ac3f02f7ccd7bfa2fb62bf2d1941fbf054c8f7e479d083a6f3a802af87459918ec76460d8007676f6573ab60acd769926115f0bbf21ca29175c06b871f772fdf6428aad0301458e44cda086ff5d13493a217eab582e8fcc15b3d6c99a23a45a1ab7372593d52d26f87e93b6fa1bcb17005f4c954de047cf1c6a8cdb02aee584bd0c3840b0a6d0013c0c3c0c3c0c3c0cbcc6f0f7e66e6d664990292529b44281f6da4521524a322599228ffebfbb3fa971a066df7b333333f3e702110db60c610c8c6d84c40b72b393c5e5cc0f2a4252c7a4d3b89592da1d9600899098548e7f75b921246634f5652a2815748685905c72475debaa78bc340849d9c12c6ad54048aa1883ec69c8d9d44a8022357e901c634ea2845b955669b40c206070e0042224a8e183a4536e3a9498a9749fd383c789c047901e18f0408d1e24c9ee1c97f50e425dea34063578606aec2079474ce8dad7bb7cf2cd1a3a48f235293a16e3a5b09c31188104f9412317e9892b19b562be1515c345a6b47a8dac89970dfea0718b04bd9bda72e76dcdcb3068d822e1720aca34ffd98bb64f5d20246407185f8484f4f0c1234831550b63c457af9fd24dae3a81062d924a578de80539774d398d592485f220d40979958430454e89a058101e3d78f42043e451192c8695182f8679203e7a0434649198bbbff3d9d5fbf5c62231fee9d0d36add60515824899249369ce9e8d1c157249b6d3275ea72ecaf8a2b12e483e9963c19ed845a911466e173901e7249cc8a2499a478182d9e55247a65d84d23f2e28436925565ca9489816180862a925ffc63b2d8d629e98f83300544ea81f86835d04845d2e714bdb45166b919631c3881c80968a022392b9636d3cc7649a53708193f8290d181532446512a7ec2447dcf6d8a2411ea9455e753a7325c8a840b9684d2ee9ddd635402344891a4e4081d74e8a692293e8aa450d7a63ba623df3aa248506d8f29c6b8263d9eb040231489772e57797fe993ea419198f4638356550e67fa44828ef77a3966345d5af64482e5714be2dbcc84b07ca00a343a91b0d9aebe9537292b8d1134389164c9e23b5b2c63bc3592654a17416313891b732ae754264e4975246b07185fd0d044d2df26cfa1838e398bf6f881462612b49fd2333196a3f234927530916c22aefbf1a7b53f7a89440f69295dbcd992a6444b24c6949392fb508d197e2512458fccb731e98fee77d2a044b29eca95ad317fb8abc0e8ff11829010379348ce9ce2d668cfab568c0334249194dbca64b6aa4c3a68bc078f54de83470542421848a5814624bc7c5131d282ce8af8f0aa010d48249daa2577d758b32fba028d4774a934cd67ffbc9e63590e68382279dff2c65cc8341779b143043bbcd88181201c460542427a7c90201c460a0919834623926ef4936fd6eeff51a1c18804e5229bc75b93df86454a11416311094ad306a5da4593b52a5276071a8a48eae8a75da971563d5d2552a7c62865341291f479465e90329a80b936d04044a2c8304f51ae4be9d349c2206308340e917ce1ac94a68aa16cf48648ac72bdb94ff7324a2f4452da86a8f831fdbdc6099198b3ede75197457b458348ceeb1fade152506124880421744dc9f220c4ce8148105175e122d633368048dcbcb15673edd9c6fc21a963c8f5cbf352625b3f246dce5ebbe2fa41a56c1f12f7375e56533153b1f22141be4ceb8c0eedd0f79094824c279ac553faf9e82129f9b75f58c6f5aa9c3c24a5dc6d53a71e5f32e221396db0cbec1bbc4382f79d50f146a998f1ec9030d63fb369a63a24694bcf59ffd321395e2c0fe32f4a33ab3924b9b77fb424f3efd7450e491eab5bf4764ca15e8e43725e2dcd5f1be11664a9031a70484cc2b2bdb98e90fdf39041e30dc99bb3a8ac9a4e9e3c6824cbea070321414888fe80861b92c34ac618c65c4b6c8a5281461b12af3c6887ccb4997ba740830d89154b9a485111abb15f43628ac65f6d4fdd1cd46a48ae8f55dfb18b0934d29094ec3353ca6257f2a08186c4eaf26c7a6e53c5ec120a34ce90244d77d7d58350d3263324fb5ed686688a6936bd49a05186640db6974b99c560da4486c4d31afb520a61337f1531d0184382e5b90dfa723a15f3c672041a62488c6feeb25abab25235028d301cf38a88ce099dcb100c89265b2f6ebb649c8f687c21f1830a224d85d1af89d133d0a6e18504f9543add8795d7549f18d0e8427250ab24a47c69266122e382d0e042c28bdfc82d8b3176f4912c332034b690602554f6b424bd6353c4e8120009f2838616927f75cf449ba69c0fd7da018605b0078d2c2457b0a0b12d9befd83d928560a0818544f7ec2988cb4e418e19648c03625fa07185c44a79a6dc5489537993c70ac92bde7ba1f92b9b088d6459488879814615922ef362feb499938cb1053d78e8186850212964f4f0b15cde532e85c01ca63185e4d4317aba9cb665515573011a52a01185e4ca78f94eb2b9f2fa23799003271021010d28a431780c2a5e99c9a299f8cee99abbd9cf0909b14318d07842923821e7da93ac9d60f03048c2601e417e881112921c388108a2e1840439ef738b41df63f447b27af8684262fcca5bd919b35aef48d61863fcf001a44a8c9e41a1c184a4d3416672fb94e5d943630989a7a76aeb79e7e94b34949018b2dc6b2ea98f8fcb09349290b457364a955cfd950e0989a3c37bad74d29bcf1d2159a39510772a1f2e968c907055a9d325d1e2f276119244e6b2cb413667ae8608891def3c67b52b75318790ecba5ff196a1ec542a84a418a383900de61e2c280849417adc2c1697b2e1b2031a40488a1a4b97ccbebb341545028d1f20fbb2738f8c9f22630c9136853d7c84e14548c8f7f011462f0d1fa4dab35596d579f0790001a39840a30709fb2146aa974653aaf22041e9594de979ecae723b483e71d1ef6389522ac568e82041263dfaf35fcfe63f0c8478f410d95c24899bd58a41294d95c9ebc10c5c24bc06bd495cb26e131aba4562559c8edea5204d9423592ff81f43a4c78f0411315b248832915b3a562711d54896bf0cbe87d5310fcca84572cdc6eb7caaa26946235922407c88c880816460062d9293ed5ef27e3f25adc23ab3481af9399710759d4e889f071030ae01336491984929abb3b11323d7c41fc6de60462c92e4cde67c497d4aed2e2c923ce4c56a10a2b3638e64f90822323206193f8e04335e91185f4a37d77b3ece3b92f5eea347b9222965de247b513be8b776806101201438ad4852e1af665ad1a38e3a9215a4cf4a252b92eab4e79b4eb9f87b70183f44aa76806181a28319ab48eed839a34b7ea427c8b74077806181e701040c4c552469e55c9017837e115b59901fc38060462a1247a82474ca7b49a8309e60062acca12f8f107dd22f788ae4d0f1fd141aab64368da4b96086296c46292a448c19a4486fa538fa337310fb08668cc2e0674afc739e0d7b24ab46f0c52935cc10457228df14f463a7146421214398118ad2799d4abbb5152e88053340912044d65b294f69c49f333e91b0e2397c885598994d48c8954815ab50ccf044a2ffe54cda72f7ec74c6108381b00768c0430c1e417e742024e44ae4aa8c2766742249598d0919d34ce569e73083134931955fad89f3b1d0e5306313c925ffbcf37efaaa086922399c4a17c3b78687fa0d3332916015f36513b71b757d4c248579d17984a65367a54b24ea7eec20cebdf3aa6489c4de7b791d214ec69c21c38c4a24c870573232f5097d7e0530702891fc566184b492953f9826911475eb7a2d9aca202349249d989d9ecf5477f64622412c5ce4ac5c235947023320912076475fa9d9bc68db239233c9ef68fa5579fd32c3118959543ce9b9a4728e79b1a3746087173b0a077678b1a36c6087173bca173bbcd85134b0c3035fecb8c38c46249dbcb95c8a9bd56e23591fa4071b18331891ec1deec1dc73cc1f7480987d60c62292428e0c329a1e4b396432527e31431149398afe0e7516f457d048d6d1c08c442405cddb41680e8f6495ca4c662022d19256b0307e29d486cc9414cc3844828eac4ea9271e5364f03daa5ac03d78038a986188c4d3b82975760d19269f5382985188e4191d43d559dee0d92711efc122c6768061811e1d104107c0f862c704cae89010c342cc2044e2978b259934d3bd5e3b85198348301372740a97e5c20c4124f9ad7ebc509be7821f88c4534963a6cf35204466fc21295890e139a69449cbc20c3f2486ee3d7dc1c432a9d43e61461f927c33a613b10dbd4ce93961061f923fc766a62443c8ee3b92b51e10c307900a1c33ccd84372a96c62f4ad752ea6c0f8624748488fc1430c0cecf0c2c230430f09d2e3b6da561ecd23a261461e9232e8b85ad9d126e6e3213153648e7c669b85ee907861e6470925541a8fdb21e94c8d16cf9369dbd37548f2a4d34795da36cd3974484ef2f6daea744c59710e49f97276977e5ccfd1cc9043b2297115c3f68dcca6d285197148d2e9bd945c8f61647d3824e8a9d95a5f5e91691e03c48c3724688b5262f2532b3ec4c20c3724ea8a52a24ae44bc7ce5261461b924d8bccfc96de6a4fcc8604fb4c7f317cca554f19a38cd7c01a92e46ec3ade63f8cf6d590a43e321f4e0999941ab50833d290246f94ccbba62c557ed09020aa846ca95ac538f5191254a75073f7309a959b21c9a39628153a7db2d2962129068fa34f5efea0a26448926ec9ccf28cb4b0d931246aae5b8eb6e3e2171543620a6366b96b66ea1d1f417a60200cc997541e6d6f3a5e3697469801860425744fada55d0a23fe201808c28c2f24c8e7f26c2776ac3e29f2417cf4a8dae1c58e1d607ce1c58e927c183fc800638707bed8714998e185c2347a4a1633654fe229357a9d0c6acecf4a54bc30a30b49a53ca559d059b2cbe642626797986b0afb6ada2d245e58ca09a546c3fcc30710ffe1030805424242c6f8e123997ed02c2362d7d9c21f77bb1aac2d26dcd082167aa427a12ca432fd6aca167c335e58b062ddfdef46cd43bf8295f2a60aa67209af5821b9345bd060d2b2679e55d074a6bb2ca28249367b8ec8a6155d9a4292ca9e2a2f3b4d85fa9270430a869c1e71d95042158504d3e2193a23e57f6346b244ca001224b170030ae52d1fcd495e07dd982724c8f6b839bb79a8cb8f1392a2784cf993aea45b2e56a53f580c33851b4dd8de746352abb2ce23262c1664b76d5b6e198c1b4b505458ccc9734309099f938e672acfcc2e58060301c2782309c929b6b7e7c6bd2ca123213945e5b4eaf44e3a898e90a44a99e8d3a2ba59352354dd284292989271be2c5fba341221f1b5d346f9af67edcc48d648101e32b8acbdc08d212427394f9b726ce7cc538ad125404b3784806e04215170030807e4c60f2a6405377c90a442e78da1163cf885aa0b377a90f0e21ec4d98d6c0c7f07185fec08093923c30d1e248b9e0a594a933e21961d246b0a23be6ac2ebcc3320dcd041b2574e9fca53b3e64c23f941f88134e622f1c3c5ebd229a924636724eb4242709124a6f363ba3fc5d3e916c99ac37fcef311a35db74582bc5342dcc7e5ec8a59f3828d5a2409bdb2b32236d4a9102dda2453867b5a39999ac516e5b6738e3ca52a2a8ba4cf236a47e6a5d4a4138ba4f5bbb8199934330a8be4d738a377ca4366cabc22f153aea07e65336ac55c5121ada8105624a633e5aaa3728a6929ab48ec394da7573daa48da18f453d9e7aaf23f15c926e4cc6e4cfd6ea5b4818a64dbcf59fbf23692e561f848364e7166d6ec1463b6ccb162d4549bf6b27a389595fac16298326c9822d95c4fe752bc8a491868c1732024440c1e21213eb0518a4411d6c9a4bc26d5199322d133c7d369ee6c5ab3a348107552b5be738c11b72812dbc2e6895c768baa791e40c0b820364291ecea15b694963cbd3f289264e8bc58ed299d8e15e5c009447ad8f844527e92bddab9bc735a3d91dc595f39ae2921efd323599d48be135f72bdb7b7c189449f758d7675a24aae9b48d257b9dea14a98b25f1349b262094fb5318f2cf90012648cf7b44c24c6f89abc847c88f36b063cd26222513e8f78939996224697484a2163503adef59fd0129a1c254d764c53de984a24b8abe790f9bd6ebd532229c7051375da0bc387487ac0c6240a7da6b541f9eb41586459604312097a93e524cc2c83e5a3078f0ed88804c2644f9f862071069dd45df08eb9472407cf27efafd20613cf880d47a45b7e426816cbf946687e6af52c632fc56a1b8c48744ddbdc31ac83d6f0221234bfe457f87253a96d810d45249a5ef6b99dd2aef14424c5e5d4186a54cda22ab08188240bfaed771daa73c987484effbeb9779f35a7aa9421126b3e9aece8a3f39b2f44c25cc7678fd992a14684484c41ad3c07b9141dbb4124e9d16ceb7d62533e6575824858f39456752ac693398148906e3f66b9f7413f0444c2a50aafb441cfc7de621cb0f1878437d5418f148d97f63292857e480c99e715b4c97d13571f92bcb2b60971a24c490b1f123c6f349ddf8e65eada437270ff9843ae336fe7f490743a66c694b7bc42ab79484cb9dc8bd925b78187a48eb766d1620fc487c8f7e011460f1e77011b77484c4a3c4713222e2e2c56a60236ec901823d46ea64e7d4df948961736ea90e4419bda2615379ad4a81836e8907c3ac8f3ae2f21c45ce69064b23ffa73fc536a1b671f619c0dd89043c269efb76db1ade29098cfdd2dc8e67f66a50536e090a03d2d7c5c4ff134657018646cb5a0078f172c046cbc217d276b9fbecd42f541c6d8510110ec3012d870437298cea11be3ece7ee0c36dae06c182d93da67293624e69a29a1634a3b89b56c59437278a79d917e3a7a5b3524badf07edda4e222f2af223fd830c9117f8f01146da077678b1756260230d899ad9631f9f71b3271a9262d09dd736c5b7b23a43f297fe1c357b6d38df0c495a9bb9c7cc55551b6548fc718b51e5b12ea53692cf030818e7de60830c09ee29f6ae9669eb2c27b03106ed6bcf6212d798e71443213228cb7b9e431b86f38534532ada49c5c68a0736c050d06a167383a84ab13a5a5b031b5f48acd774212f4fbd64a66c7821793d099d726f5dd4cc2e24cbc98df9d216a72ac50617126fb36ce9f898ce63b585e4707dbaf94e8ea5ac4bb0a1852499773ac656947a6a4b0936b29014a27baf93ecca361316125563b4858b61a48cf80ac9c13ecc5efe55c918b242e2f748b10d5aedc4860c0936aa9034f695d2de3559b7a554486ccdeb96264ee956d21412444757ecf629f19f9142c2c94badeb5ab275298a041b5148f24e329b4c6fbe117b901edf5048ce2ab2f296e68f31eb4896a930c2e08180bc07b214066c3cc1cd20e4a4c6cfdef17442e2061de7e1d6df373d4d480addd92d0715322151f4497bab10bb5f731032c4580223f3f1f2c7a76b94909c2b69acadd5fea426213959afe82c21c1c6119257d645f9ce8c894a396eb061844411762ac7074d1fa217709063838d229864c98f8e3511ec149e997a74aa6908c8067167e722c47e4808091a841035ed1eb59eafc146103cb3112ad6af97e81f08a760c95a54f783c48fa35b4b8ece9b231f54bbb1fba33decdc10d8e841629a30a19fc94f3e4c3d783010b732ab32be541d6cf0e0d3a1f46fd66c0cbfeea094e39b12fd985db191ac32fe05226aa78e60430786758ce9a9a38785598c32d71eacc7c54f842c601ad8e1c58ed2c087817eb018a580f808c26b125123178927b6e6274486e6f32a10357091d431064d229ef6e7fd328080d1011078183cc810a35855a1c62d92bf72366d6b909634b6456225abac8c9ddac3362ad4a845629f8fdcec37edb92ea3871ab4482a11dfd2f7f0adf144aae850631649396df8a6bd4a267b9545d265dd670e5bb2fa3cb1481c113a07a91753e868609160b1572b86bbeb06957d428d5724083d7a4c2be9fd950c8f50c31509eea32ea64b3a660e6a2b12573e998c1b73dedbb567841aac48329d327474925ee2d25524c636737991e13eb6a78a641d4d623a3e5bd1636a958ae4743988a76c2a2d5d8d8aa4f6d9f8cfdd394582b06066da264bf7c53ba648cc7c6acae2522428598b974c2919e4c64991ec9f719573681b359e51246f4ef5516df3a9e9fc406e07181608091145d2fdc93ccf9f33c9bc090909d2fc438caa110a1f3cbcf0c2013540f1891a9e60408d4e88f0f8a1801a9ce0f16302df3d7c20a0c626125043136394f12f58408d4cf0f8310112a4d48105d4c0c4075ad00206c301352e61091105d4a884016a5042e400352621801a9228408d480ca00624baa8f10802d47084088f1f05a8d1882465327458dd70fea5c48804b9eaf9974d49d8fe8b48fafa4ea64faedeceaf880419366d5242572ca1f64424af6f858b6af9f62b474472521eecd3957588a48cd1f1eb748c714e6488c4b3db18bfbb35c8720b919c332b659f0f7d1a5542242529e23bdb06d3b07410499a72a953d2730cff5310893e427ad2ea9999e21388a460b7ba6939f6ad090191a4d5921a9959fc437287cc5b2921b3aaab7e48529f7f337fb13e249f5035b649d387aad4fea0061f12e4b52dc868f239a56f8350630f09424e6ba7cf5b41c60e0022d4d043b26db610f641de96def390a0f953d4c99c6478100f093ac713d3767d6f31171272831a774816b1ab29c4e791f61e911e3eae7250c30e09a7d2655346abc8d3d721497356b5fbac3e8b4e87e4b2d5b0fad3a0b635f5ee8303a735e6907c95f3fdb5c2e9adcff790810f111f41b04a4da0861c12a3e8bf185ec167f33824b968b27d0def2e4b8243c2a7758cf64e23c4d86f48daee8fa36df2964dc80d89e795bf3b6b69a65393032710e951a30dc93baa9f9d7a3e1edfaec186843db1a44fca26bd9e5f43827ebe4511edf23b223524e7a8a9d5c5453d2f4e43926fac4b39859051fda221d1e2523ce59be2bfa7c61912c4f266ee11232b5c585950c30c89172e9d980eba630ef2322429d51c7ef92da97c3619124fb7c58a53a3ec3d3c86e4e01de484cb2853ba1892c4c72cd6f5a9d3a9270cc97d49cbdd7b5526250443720effc9557f4b66eebe909439b9c6aa52cf156baee185c4381d6bab43e9a0e43d92251246189c2223417ebc772129c37ed28a9b82bd8fb890389fd6828e1653b84eb79018f3e49df0505f691f1e2d24b5bd5e65cda6e216cf4252dc593ed7a04ba3cc5848d85c5994d6b9d026ef1592532773fb7c29364fb542e2a54c5e69f73b1ac42a24a5b2117753faa2a9478524e5da7e49e50a32a7ca4896196a4c21a9c7b4fcc9cf1eb21e3c38c803390fa82185e491ad1f6bae1ec42b5535a290e4167b3a754e8242628a711d845bb691233fe14f3a6a3de49af804e9c1cd23d019d4704282f0d4c92da8bbd3d28f6401f151caac0c20417a3cfe60315650a30989a794a5b0a6a534cba50613923f2fe8d8ee0c5bc1b484e4a0639fd0e5d92b76af84e4534a5427f1d3a1a5242429532d174ff5b7e71a098975955d2da71b3f797b821a47482eedd895c3cf5401a65b851c69485a953591172673988aa1420e34245cf2ca321f1dec3b6924ebcea0e7303243522a7da1ebbe9350ea3492a5aec851866453aff15492cd564d1ac92ae3410e32248765caa743852ef5f748d6ea20c71892add35c1406e2d164f803c920fd3fea1639c490585deabff28c6b528721c13bc5d7056fc1909cd2e3474f7f423c8511c8f185c4d81a7428e16365e9e485e4d5243bf532bb44ec5d48fa6cb2f141831e2d522e24993a39d11f64c55ce116925664785afb550c931612740e9d34e69425646410c89185e4ad4d7963346c542d61215964a837d9312d3d9d574890e99d452ea5c58f9e1512af4cb6897a93bea385b138c851853ac5cefac898448564554d714df83f85a4d4b9ce8d5a5135a5482131635abbcc791f5ce528249c566c514a68583f2d14925327992ec9518e2724e88c2db2f36cab7be8044d555f6ec6bfa99b9064e1ce56d332ce2bc78444cfa49b52f7a9d07c09c951b48b363f8fb9ac282159f3a5973e71a31da349a81c4848d01a36773d7f466a90e3087cca99ae43cf4479398c9068313b96839a8c2dab8c1c4548fc557f93e96b537cf7c72042f2e83ab1915d239ed12124665b5d14f1362fed84909c253a97f694993fc32024e9d8e9ad1c2c5fa86d811c404892d9adac4285479bef0709d6b349ec272bedcd7c901442964e53f7239bef41d29676e8ff14de415c3c4832e1d1334fe6b71b15327ee4d8c13198e64a29cea183c4cffd499be6cd9ad29d8ba435719b93fd95562eb8481c9d3dec3a6a5cd2b985a1f94da839d1202f6a8be40e93c9ca446f30b76b9118d4339f4a576b1783688105b9da9e527eec92b3e852c7f646bfc232461689235a438f559a6c6b6391344aa4ee5f500b264b5824e5cb41fdc447e9e8e7155f94dbeaeaca4fe27445b29fec9e6ee65077c156248e1aed2f0dd3e1634562d2cb703a9ff0df4cada2f7b3fd8abd295f061caa48705fad1c44a94cfde04856008680231549298ed262a5c542444445927e6a1afbed9c37bc91ac0f03b105a008384e911c638cd5b4105a429fa6483ebffddc202b695b8ac4dd139671ba9dbf4b3bc0b0001a1de020c599d4e9caa817d91c11e01845a2b9585a988da7768061819090adc2218a24ab14ccdeb468244be46310860fd5314e097084224967d19a94b8f6ff1a47b2d2a90d8484888c8181901011830314095f41d72e36598c1b707c2249997766b8ce9cf2d7894bc0e189c4b0d3ec29be0a4188157622496ba73815bd79a9d42241be05579c480a0f6afd73fefcd7bcb131e0d84482d29445959a36d70e6a2259cf4aa9bccfb4a8489a8501472692f7fb5754f8ac559b13030e4c2475d06e6e6b616774fa1249371742451b0b31d2b544e27ece5164f49af6ce542241ef970621a636f2513510c04189842d4f97a6cea468b3708f0eecf06207184fc0318964eff1b471bd9d4c69b4804312c941ccac5aceaf1770442249c55d0bcb3dad7191dc020e4824fc99ac242e466cccb308fe3c2231c6c5b5cb7372f46f228580c0e1084da4ab65ed2f95a3091c8de04f258dab1daa741861ca5ac963766bd658d929658eb182342164e72f816311096e419cf4cdcde11d3bd3071c8a485217436a4a95cfe0bd87954859cd0147229283f8ce1ceae4767b4744920e3fdf5e3aa63caf0f917433227e44dd07cfaf2192d4968cdd15cf72985988e49163f2ae725217db1022e9ccd5528c6aa675b1412479f4cc9fd3e3650b2a82480e5effad9ef3942a53209232091994beb69caf392092a3e910f1cb128dd7250f70fc2131d86f8e95b6533d7a38fc90e09b95fbd4898c37a71370f421b1cd634a3327f35c92f3214907d51d73a4bf0891ef213973e62a5d2a45871ae921498fbcbfd3aee62129e572f02d8d1d62291e92827bacdbdc1eedf4bc43e2e5283d567a31d566ec90789622d46b4c9795ea90f077a7646ed0d16b373a24a9cc3d7b3a3c87e4b4529b46c620347d72484a6a646c7736dd2f8b4362c85bca3a76b716c321e93be47f8acad19c534c80e30d49bdb3494be791da96bb2131d3f589d4caacec741b12c4a57ebcbfcb912d6243821217717ff1b68fa23524c9fceda8fa9fb18dd59078bd9593a7ae4a3aad6948ee202d4c749b6fb58986e49453bc42d564742ecf902457eb6bfee6314dc70cc9b9c472eedba08459a70cc99ee72e95672ccd3f922179ddc2a728ef8f3908c790b8ddedf9a1528379288624213fe87f9d66ccf88521497785d9aeffef6c1f1892929f9b8efc5d30e97d2141becf540caa76d93b2f24f89608d5ecae0bc9653122646898ccce85e40edf13da3a6f52425b480ad95d69cbf54d5e460b891f744af9c22e8b3a2d0bc9a183c6b3770b21f4c242b2df5cba4f1b5f9fbc42e2c8d2df393765662c5648baf89de6633cbcae2a64e599528ca5ae61965cd3c63e447e10151247873fcfcef9b92482534894cf4bad49452e63de0538a490f477af1f84d614435846b244ae7af4c080990c18c80670442171a3faa9e7fc6a992a2824a6e6a48210175b5e33333f580c0ee07842e2cc9bfc35dfb6933d90ab321930902f703821290539f5ed30b52e65004713122ecbd85b18d59eaafd6031cc72e0042218c0c18444916eb276ee7e2b630846c6e00be40c702c214908d3ef3c559629be60c8804110122203061212b24a48120fe1d729e7cc593309497a2bed4cdec8694b0d07122ae4348e23249e25910bb3f3da9a1b21a9da625bf747660c6d111275357483bedc39f211a40706bc308703271049388890549be4e6d1a4773a734e80630809261a572b78a78efae01042f2a5ca25eb67722a8f2308c9d9a2be77ad95ca19120307100ec70f326959533ccd183fc628e7387c90a43676fb77344b62318e1e2466fb86af0a4f4ae62063031c3c4816e936a67a2d85dd7f0709cab552f220da422815870e12439ad75bea9c93396838b8918b0459b94586678bd14208843d50b8485ebdac163bdf22b1f37bae4c7a6fb46b6c91545feab285a7d422715486d02a37d5e0062d92548a1d2bb5091d4ee833b8318b244f4906a5cc837ed1bc2c92c4aebb63e6c510a58e458252d394b3fce6742d8245529272efa16df9db41af480a42fff3679cd331c4ae48de3eaf1c365ffa7e694552c7642b772363cc9a614592d5c7adebbc8f99de5524495325337605b5d7ab2a1294f09751d26408f5742a127b3d64579b9789911a1bdc4045627746cb70ba9256cb9d2271337c0ae26e4d6ad2291adc304592b8e554579e5224b55fc86cdb5abfa646128104f9718314895945688ee3adf13d78831ba348d269a2e2e9d8bfd9362b841ba2482c1d6b83f829156e7bbb118aa42094f2ace7b51973b5841ba0487eb994ba66f56410cb07373e91686154b35f8bd6cd494f24be5ac7bc6935e8796a07373a9134426bfa132a887c19970737389114bdc5feb5fad247b489e47fcd931b8fb21a339a48181d63c572455131a5360737329170e2de3a68b470fa4e984832153d54325131f14c07372ed1ca480da525e6668ec20d4b241bbe2ad975da1db51249626a49f7749212892ba7c9c47a0ca6e721e1c62492338c08adfe2979b52b8964939151b643091de44824fdf95dfcab3c159b8444a25854ad542a5bdef02392f7d3a607ed1947247f8ab1838d2869166345b8d18884d3a7b9bd2763bf75c47083118929866e2ff91b5b42691149b1f2aa660a1d26543a2424cd0e37149164af59b444462bdd26222966a60b42e3967a8c22223998ded22ceb26d37d8844ed8d1b77a1628c350d91a0396bd975aea7b1538804954a5eb0d5ba18442444b2a93416d2c2b506e1209274bb626e4d29d4524e10096b6da5357237e35d54dc784788aede1c5d032259bdfb62ca39fa43b227d910133a6d90a623811b7e48f0a454ca8eaa4da3ae3e24bcec27213a671b933d1f922b8bdab6975e92a9ef21412e7c3c956af3cbb31e92537b8ee7a26298ea5ca42c0f09e65935366d655dab7848309946665d2fef907c19fabc63d4a0b7736cb86187c45169779a2b78a30ec9da79d7ea549a8fabb9418744311fe9a7eefe72e86ecc21c964ab6ca78a9ebabe1b72a890382476c73ca767a9de429a75030e4971352693f5a314dc7843d2958bc7ec940cc10d37249dd685af986a2b4237da9014ac64e74f53ef9a3f41dc6043d269c7d497ad1fbb38176eac2139e754a173a8fe4f4bc9c20d352408a1c7936ef8ac9df50fdc484382507531bb8ae1944eba8186a45c6a67df9489794cb97186e43a9de21eb3a955c4871b18dc304352f6f69957dc2b51c48717fab85186c4ed963ded702bb120911b64b8bdcbc462a50b426763483af1b92a050f1fb2733124988d0a3fd74ae2540b43b2ca8d75fcd370f1e260480eaddf41674fa3d4d35f48caa093c7fce29ebda7171294a6cbe6a3b52e24061513a54c531ea1642e248602ef3ebac78b18a18b392466c8ce9c746632d556177248aa2bd92093fecf59e538581770480e8fedae4a1f673c3992d5c51b123da5d57091ad144ac4eac20d8915af9545894b1b1244ca9c9297a52eb46e62605db02171d73e448acc03a18b35248ba6924f976c66453e923546d60c9290902ed4902035fe5caaae4c79f63424dd8fa5df9831a672070dc9d94544ff3d9fa6e9ce19122fc62e170f955dd1396574618624ada0974e79cea263da451912f3c79c7e4c945ccd9a13a40b3224e6a83d9992f4944797c6902453c586ec3da12dba1892b3df8efcae9cea2f1c8624b3a453c5285a42e9160c899db3f937c27f64ca7e21d9935e65788cd153a45e48901ab65be3c5133a48bb901437a7e62f5d722139e6b0b999eddf7f3a5b48582f551d7e8b41175a484aba63acd6bdc5bb594852af1bd2567e538c495848cc9e2a5f57adc5defd0a8917a22d798e253ae4b642b296e9f805dddd64e12a2499eecdb030af64314b8524b1943d6fbb4b6c904e2131e8f06aabff73394429248fca9e5d95ddd1c28b42a26a7918b541e6ec2f14927a7466cab895e9e209493aee9e9e1e5d75f1d285139264fefef611ca4dec32f0e14548880c7c0001d284a424c23749bb774db93d5f74c184e40ad65e2a4e8349bf4e2de1f6cee1d692cadabfe07f8caa30ba5042e205539ade738b2cbb81bcf38f88bcfbe851db451292577469cedfa973ac34922583ef61d214035d2021e9664bdbfe8593c19246b20a025d1c2139e592f13e68cdfeac19c922a30b2324a620d73d6f0cb97a3a2359223d78b4e09118fc4082848003271081411745484c7983a9e818beb49d225d102139558e0fa1d7f4ecff212459eac9de2a993fd1114252dce86bd7753ab8c8ba0842a27e58cd68e1233eec12e009ba0042f2493b5d9742f5538ef941d2e5524a65a88a1871e9c207c96ff2e3972a4bcb64e9a2074553177b4a97c59772b3d0050facf2055deca018b27c37fe6b8b6ca60b1de4efb1635c3173a0231747072e74dc22b14ffbe4bd270f2174d822314bd99dd023ffb3e6bf02212128021db5484adee92ca5b6ffb5132d122c08afa87b9d366c388be424e3efc76db9a0548c2cf45c96949ae8582c12e574ecefd16d27a30816497ea68476a5b47e697d45c25b0aaa728a0e5724a77ce930dd9e417a8a8e5624c968f5fa25211674b02231fe6696e57ec655d12a12b5448dca583ac6eb549194526f4595e6a5bf4a2a12454344aabfa78e9747457250baa3c49b1a7d192f41c72992540eea74f66831398d2965aaa0c31409a2554ac7f056237b1f818e5224c79266974506bd2494a44850aa938ddc380e3a46915c39a5a0c173ad9254e1a043148939dc0713ea3e67145d1b748422b96490695d84921f13e90045e26a06d5395e6d979ef713c9757ef962962c0f9d7b22e1525f060f9e36c98ceba0a313896f7145cf534ca6999c48143d636a363fa2e2b38924b36ca5c407937136c4811d5eec40830e4d246517bddc6d79f3b54d061d994852e3b1e476b68d9e375b3a30911c2f26a56475b2921df95850e8b844b28f8a12adf5133a2c916cd2acf3ff275522e14ec5919b57af61e49448f6921a4c7b3d89a4329584d4d049c3bc2c89e4ccb5a7564b756e869148f87f53e79a1b84764e0724925477a82875bf5569d3f18864bbf5ae4db955645e743822f9f565838c7d1a91dc75f74997c5fc9cbad4c188a4682d1a64c8edb0aa8d64d9eb5844b28bc785b3ab342a6a56639cf29195021d8a482e5d97645f1adf4e8b13742422313d9cccfcd47c622f22127fafc2c75b4be76263d07188a4f9f8ceb93337274324b6c82525174d866bae0b3a0a91684a9576b1fd60169474102225dd2beb2ff0e163240ce761f6071d8348d2497c9f89e96f0cbda0431009df715ad697b9eff9828e40248605b7904b963b66bc1809c283043bbcd8b1c38b1d3bbcd8b1038c2f762457ea1110897bfac443e72f468390d1811d607cb103043bbcd8f1c518403e063c28903a905ce9f84362d2e1c24b7d63fa3ef921495f86b49f73dd4d531f92332bb42c47caf6890fc9da1f5ac3d58706d3ef2129df5b8948d3985e7a3d24bbf65c983eaf53dae721b1bde72b4611a7eff2784850b974c7e6deef9014de66764237c8b4bb1d92b3752c611736bc8dbc0e49da4d9b52b94336874e87a434df2c1a2e2f88cae79018d57c3409195aafd37248fc34e5379741e53c761c9282d82466367bff770d87e4243fb705b30cb55cbf21f14f7328d177f3a76937247ab97dce416a2971e936247fe6d3ffda795264101b12d6c27693e5dc993faf21398e30d172d99aa266352499d015ef97db73b9a2230d497964bed4a4378f8c711d6848b8914d279ebd225a3e43b256a89463a8c7ce8dcd90a0eddd54bbd2d4c5b80cc91be3c443856aef7cc9909ce665b9948753f1760c099ed4b5e7e7d24b9b15435267d131e7db14c33d0d4362b07cf174727f353fc1903c226364cfaae80aca2f24e668bf06af1a8d37bd90e81fc33c76a60b49e7f13736af3d1e4b2e24e6888866921dd3a6e41612d4a66c9ea7a76cb716125e635ec50b1e2fe69385a4b978317b2ba686f06021e9f6a39afcb3fa92af90e495216683b8184fad9058256edcd3d48f995885c43a5df5bbbf263b8954489afb51a3edadb192a690dc6fa9613e9d77c82785a4bc3b5f8df9fb1abd2824c6d039bb27afcea986427207a53bde89e74e217b42f2a8d41eb53e1f5b3427249a4a96b564503a67a909093a3a7b8c65b9b22613123feac5d4d432f79b2594a14309092363baf98bd7d9639290a44b5edfc854b12e564848b6981e47d95fda0e1d41871112ed6bd365a5da19152179c49b908d6e191c4685c13d7cf030f5011d4448cadb253b8e8943f0830c7f0afc20c3dfc5a06308c9a2554bd7e6dfcbc723694aa14308093a433b7d6e111d3b5e4888ff0e2f7604e9206d0a1d4148be14c7af567f4c3ea4030889d629b89fde68e9990af2638c7128d0f18304fb8be7a7a376b637c9f8b1a6c3074915e7215b2366935075f4c053f2b9be2f854bd348567a20b5071d3c488a335727358355ac5fc70e12735232fec5fda669a80c204176053a7490f8c92d58501a4af9a78c647df38801905c24750a9652bbbe6ad011052a072e1273c624baaf76fc53900b396eb156aed04ad96ab135a62067236f2a3c4614c1e6918cc8618be44d53e59a7abcf246b548cc9eee3a8e184f39645a247ab8a56717afce599d457296d3aefb9aaef594458234d728eb71e94d68b148cc263c6fc358923b162d3fc8018be4ca3aa23da2629a4ffa5724e9e7fde5e84929bbfa05ede30b27e47045e2c7f808df981a73b472b422a9e39bce9fe3cd54122521072b9272dc7426b743bcbf5524c846cfb51c35a717ab22314fa5c5fe98de9f371589eb1d2da51c3cb57614154942e36c2cf7341f913945e2c8cd940d2a8a74399922314be994a6cafa75c3a5485a1d65c16c346d8a85149863147f50a1b27dc68a29410e512478f231a931d77a0eda1ca148ac8e2956e5a00145f266d656e578d9f737ccf189e4a4bf4e84fe30d58e19c912e121624c18727822a9ac2be5ec885131f6912cb3428e4e2427f5725ed1cc324e249a7696d6b096caa2bd7fc8b1896435ebdfea64f2430e4d249cdc0715bd4cddb5948964ef1825b2a29dd8bf9848f8bd103d2d4297a8cc1e725c2231f33254b0d05a2231dedf99bc980b9332ca5189e45359349a7db64f6f8f1c725022497eca99d16247240e39269138a7a2e51221662d77237923392491e4714527b932554a5b53c81189e4d36a1715acad526c235941de02212187c80189c4d1e761635f6a4ba38f484cc1edad4328139b9b23924d7fe8b56cc2354cd68824f1981bdb1c5294ef012de4604462c53a25fa832655fd2828722ce25eb35c4a7ec5d19f912c1191b31c8a282695da96b54b3d2241c6f031a29588e4954d91399cf9694d8f645529277220223188d065ba5b75fdf64324268be3733a7ed84e6a43249c5aef2e152fadec4c4622472192626bdc8ced1ed359ea0c2207219293a7f40d3ae59852e78348b8919a333befc77b67049120c582d062ed9b37465ec811880425335b959d8048ca24be3d67f21f12f3a8f198d3942955213f24966daddc27ddee9fed438258d6a41632c6d1951c7c48debc929951a6a5c5b22de4d843526c5ecaa173df8553a320871e124b6f44a58cb6af1b8e428e3c24b56eccd1e94345baab50c88187e4ccb41511115dabf348d6f6c87107cb6187e4d4b145834ced00c302e6811c754812573d961674e7d11920ffc3478691830e4966a7764d5775368704df1c9fb2222a7de72172b0053cc688410e3924d8a7cce88a2f1d2a71484ed9fa37e6a2c8972bc790030e89b35bbbed3bbb154b31e478437259ea8d798672d3dc0d49f7c97452a9b35a14711b92aee269da644aa75ff7851c6c4890d7bb1bb339c631a5488e3524de5cf855cfe88e20871a122c95cc7fa553de2e8e78a86470052351200e07028140000c088347f6b30133130000000c1a92c6c2b1704c2e90f3001400054b3e2a4c3c30202820140b45e2d048140a8602e190200c08844101503010868238ce94bc0753133af96b65cdbe75685d26d89c53490a10150b5d581f0b31b1fc9823149b65357f8358ea401517f01cc0502415df7e8bfe9592c60838d69b2eb969d8363a3a7c76010441d4ad1548c4eeffdae40e84da30e97196b4e27b59398779cb17b5e42c09361a1e812687c13b88aff449fc29c8805ed61bb16d8442c3a50db33d757064ce4d325443029e17b04a4120857c8416071478b8048ef13446c5ba2744d852383e8e39e7ab2692ccafdca85f0c9d9ddb6098c12a7203a44af32ac444bcdcad1c5498bdd8a93421a020c81035085008b78839917a65c64508429eb9085f76387b39c18a15713b203e09f3093485bbc22801b1b05e189e01efb6c8c5989d8096cafd8d8a937a61b4c1c3034307b824a82e02310b4971954286a16bd0089afd1610146563e7b72a2fffb47a58bf67c6018aaee8b6fd5c84f84eff10f958abb84867b1ede487fbadfa7fc399fe3ae6aa71d87ace4718d0bbaaaf6941852fb62eb34ff86f107ccdedfb6eb919b9c26feeba26c94ebd2c54d435f963dc8d799d011bc08b159a235afb90faf698b70f6be7e14fd118fac2f8352da363b1940e7d8113db2bd084185275304abba52d7072c20b967037959f7f76cc86e0e31699007467135b0ace682de438281b4ea1f0796a096dde64844daa828ac60154cc37315b245d9ab1d3bff43059c5b9f7f1fb3e78ba3a5a76edb72526d20d9f7ed746cf155f887ced0279cfeec6f3cec94bb34ce24202dffb54f74a38410933fff45898ae544634619a4f88fc1a3139709e27bc68a06c54aba60a49b7a9c2ede235af05f3c9062f9ac1e63f93820e594da0e0d943fdaf662b56f61ed99398d491b21ff082a816f48a6eaba9690b489256181c5bf2c8025eb2200ac0ba53dc90ae2ebbd96c043ec43c54d228128c9cc8b91cdb31fc3a667b5f88dc0365e7ceecdaa6a4cf91524f692a6250c773dcdd19f7a167bc8c0e03f28ad6f9251ab844803e1fa47ba40d67662930bfb2271299b369ba1d50f90081e20d012c7be0214f6237d45c606ce2f7a4d2b2f1c02473dbe0322810f2d7996d1553fcb8cf3a77ac2fc2604a153adc8a9fa85a53ad287ad13b27ce71fd8abe4895a6d991e478db46246e234ebf5fd6158416c6ebe9a2fd2839b80ac626ae8ed9a25f53484203d205488f1e749108b3119915ab2c2e6193c4bd3503d1f4eede9c6bd50e0a7e9604e746407d691dec8d0e69a1271320a370cfc14cc889b5e56425a1fe4fd06e643b7b4ea66c677d554b7bc31859801838150a64099c95fc13ddab81a6a9111da1222d2152080ae012fb44629f85aebcaf83fd00050007a3e0ed1eed050c28a7697bc435d11893c91b36d8d33430538b34411ead1d46de29151d6d17f607eb46956d2c82ba9c3f0f736e3e91fb15d3162ce4a28726144313417fce3a0f2b31ef1b51e5ee1903dcecc42333c017e5565f59163ae39571f99d1e98f2e2701bedfd30f0ac4125fe3923ff780bcef96ac6240de61794ed60d6c6a44524c56769f5ab8f0b063688184a1606f0ac63563d5e3f584acaa74c882bfdc47185c239c17858a02451e499900b3a1272dce60d37e821cb96ed8998f2dda2dae5d4fd763e2da3c282804434e6634bfed79a353a65d708fb45c9fd811060f6f30d035f32644c5e3ba1326578dbcbef56a40fdc83904241c72ea0da0d161e974f6130890fe56be6b8984f318821594639bf7adc8e857d295f3c3ea788f3c9e7f5099cef3ebf4fdcf193df1fbe04a2aa9821896475c63cd7cebc37de77e54ff8621c57feb3f5cb1cb7f9795820931fe7cf0180d1e7e5276080184ce3cbe2b10603f171f10883497c503c361f565e325c109c2c49ae4ad1a7e7d89309244084f4d71607663d83b2e1b6cdf1701857b133cf6aba2a19f41d4bc7aea48236ce0b97e5db37f9398dcdfa5cddb6206e63a52e552e5775e77ded6e4ac68bd00c95a8998f213ea7d297b4f0651db38e73a63dcb5795bbc314cf91734a85dc7a7434779d004153527d188b3d1f8264c64bea4d9f912479320263531493c2250bb46aa02858786095f99630a7d125e1c99cd327b413f84692616a4e5b9851c9d6a077c48e94e14925c9e1d577b81911c6a1ae7a1cc93c57ef353ee37cd215eadfbed4a4caa3808cfcc81b7001e213be0c84b7454d579bf496ea0a1aa87fd81c46d3096dacc14c2ceb6456e590e6fe6c2d048e31949033ffa9ca08f125a866125c663ecfc6c025d158888965c10bf7d7736fbd01d79b31c67c471aadf31b754a1eb48fd2a87cb1e83a0e097e5c4b1c0bc2097e909c0661cfaac87dc9e4142e78110773254d1466146ec4fb3478dae043594d4f58baf7212ba061e2f96c029f55e97dc1a3bb105b3d0becda941fa2d378b990bafbca67e447923672d872b06cffe390772731d03550e9a4ca54d0a38c457ccde6218519bee5de2c80b7eb1050d00e7bd706a1896828aa6a68dd180e4658787bc12a47c8e855ba9216e0dc7e5e83db421dd4424382c6448034c4cf7e2f8be54b950326e00857ac92518e38d1278e32bcd2dc62f55a5f3449917cf8537dd97cf116f919de4d6af6d7c61447ce63fbebeadca609bb947254194375a8ae8c0ee34d3eefce92aa00f5b74096208b23fcc6c84b26d7f177a8de1a22b91346c8418677c11d3abac0bdee5e99ed5125d8893833eb61cd6db62a66737da6f79275640061dda8d464fdd26eb46fa756defc7a228e6bb4879eb829fdc3896957f0dd73f03d48c2bf98d09e2e10b3cef2099c395595dc10e3502b0e6efd2515483fe75c30440786343f9a5b3c2a21e6735aacf08980819fa848f9511df23f2548e28a76856d4506e5e463a456c0da959f76be9fbf83ad8cc01fa44bdd0c798ba47c864ad029b32072625c7d9aa01a2ad050697166819f243defc8c1dbd67d2a194a87a36e9595d6d5c7948b3969ba33e8df9cf2ffd8e90cd4a9bf7462c600306ed8c9691215e4b45115554df3d4c789e85e2a994f2c9225ca39b519112250526869bdac0894f40b78a76901f2472ef4c916511801c7f6b881659b8bb1c80e47b5c3c1e914fa9a1675a114c66b41f25c86ef363c9c2e1ee37fc53e9cb287ca89f48c60cd6e911a7ce36dba7bada43291ebd15276b4d824aefb4d6b802f4209a9e1cef81919bdbc5f3540adf69d20cdf5fe4a7b22592c37abc036e0a46355cc4985304a19d98934974b9f454a1189f2081f146f82a189eeb07f489227b40929e240905262800823af401c4626b702af3cd1538e228b5d6a0d6d2909382096f402407ea24311550015308d16008044a970f310815805e947552039909851c30aa7051ec08d374da139a3017f730acb561db57824b187fc97e5ef6378af13dfe82b35cf518f192f560f765cac71b8d69f296503965b91aa6c6030d063309bef07b40857b999433b495c282c5b02ad268c0f74616553dd1210cd26d0b8d89b102e437d5b6828f8d2c23d2afd1fbc036ee05e3d00f0d62d1cc8d47eb229f8611e8da1314f8daa30410c521e696e809936e98462b109b6df5560f46b74d70b6723b02cc0473e94c1b568d169bb12a2880a85f5393385b8da0112b29bd60ca8b986ec2e67119c996f717e5cfe400dbe455142c03c4eb24f426b251a2a3b0475a161f0d4d174fd00b367c1d30d15806c1d510807395d7d1f286770f2930478678b846f7ba11d6756d8d3e81a08974675a25054b09f4a9b8ffa66115bf33add57219541290bd9d87dbdf86fc217abdf61ca7be82b0a2b1bcb06845bab07e2764a7bd482d53f6830d3263e06670981663bd29e77a37fda2ffd8c7526ffb670a1acfd7e4967f6460218d6013506d0009652762dfb8993c805a1b8b0e50c310394c1891da31f25d5b08ab08861045fa6f39263bebcccff4eb463cc2ae23f49c88076e98ff4d80128114908cf494dce855eb83e012b29bf5aa7a0dabd53057c1685123953d4a84039241d4d2010921356c121e51688c8fa760bf85c6ff1409069a9b4c5125c75a0a8e4589a00d19c6920440243293252ab48c7981c23236a4480d204dc11ff0cab6b66393f30feb58f467d0bcf5367d526889c698675ee4f1d2bd3d60a506fb30e8513c29a6918910beb2ecf009825c8798017ae0d3610f390cc48197fb5c61a92f04e49bbff327ea554bbea0c36815874a66da62600ce43ff4c529677c7a190f955bba7ac1eff86345b2a7a56feadb8554546d8c9c88687c3dcbd6529d021028a2a6d627da754bee5ca6f00f8b26c5101115dca14e2503c55cb47cb46de332cb4785da140c156a0b2d7614f82dde3169132df25a7d5da2651f04444135fc2db4ba5420282491b748b8df155946b04a3c0daca52b67f102f0da280c060e0b1b88e4502da5d6da5c53c6f3c2784b3ca39318147703ba1479623084625418a3eb7e0acb2b33974cbd900b74522b96b5fafea4d373a0cc8254cdce2e9f2d3af3edac88bf05a376dd5874c753da98b690c5a78e80c9837c605a3a3bf645da3cf9a57253a087d9829cd1abdae7cbcd619941e7cd19d22be608c5d265b37020708386c9f5f70f136aa1e02d8aaa32a9f99cc24eb24a86a471abb925bb3ecd84e55a846c31c552cc1a68787aa2a0d90db9d641c51beca4ee504a0fbed3a927affb23f3ffd4bedd315bca94ba819a8c6f6cddf77a2a8230af1b1b54c5f354654883ce5ff331204f488d3b8a9fe337200a8510304bb47e0543f82d642a8b7bbd99952154d7d7f8f68fe80980dce85340856593cc426d9df41007cc1bbf75e6587747d5d3e011091264d695ae23d367cb2f321b21fddfcab4622301bd641a9ca2379c9c287b186838663e2d50581b6c549353507841b07dfd7412208dafd2151da28637eebb827d2ae5d245a862adee8180253d9be7903c99b291bdbedeb72305eb2d6adc89cdfd0fa28589aaca3a4f7e17ac771cd79f5495856b669fa649afda0c834b203f1a6935d76be5d88224985b269f2a558bf8cbcdf8f02c13131e5b0f2c5ea35fdf1626bf312065466406e7952bafb96bfe76ef72088fcf3e35f464ae6104ac13d6dc2420208ddd27fd1fee54cabdff8667dfb46e420d62fde12ef894b14134928e6bd6eec823602f2058abb4c340a9678b773df899645b95d08f86638d4b311704086ffa2857284ce93313ae4d6ddd7c925dc0ae6a204deda41e4a05cbbf77e810fe8cd49a203e6c28f26875278d60d3f7c7ca481fe224fb415da141147bba34d8958da2d6d8288a25dd0668828da2d6d42c4d377af5864339bf0472c05be7d37794821c2370b384c5a916e81ae687e1e38b92e04f4db3b4e3aca1a075720b6a4ae05a428e3cf0b91225282f280d1861458cc007c7307310fbc99252a7e00215460aedd4c0260215796f332cfe062fe58352f01497e93ba81e1c9e39b0bc9c4a8d618e308ebcd172d75741b410e4c063492031470434504ba65190f179e91967433f5d95d40043e936d0359de7d7b1f902b3702b8263624100154597e961fa6a4d3fc68889edc2443f4780a33212a7cc4315928cf8908d9dfc1fc6d984d79796f3f2a2a3c4cd6c76f17ad68bb8ea33841af0080e225f6636c208be7b1e1a8d569236b10eea9edfcf4dd95e140a20a669573a028a169542bc8ca967396984bda8cce828fd672ac73e11c2d0d103640f394790a42197322cc0a412903777c1de1961990407ce8fb8ee2c87a9fc0e0e39b9ef1d9732838630c683655bfb8f92169cb1a4197686313ce8c90180144e1310650e4f6acf5f90bbf5d0264c76b9544b61a80aab2f50a353ef49560eaf6a843d75493e604040041325121c3ac18f40615f655e23333311655c22b2d7ac16715bbccdbd4d40128ca628030d85aa507802300e6d102802a61e59dcae462836a23004b5bba8e39b7f2195c1e800f8b162ff016f05c3dccb716bcc4f7ed7107fd84c98b0920c9ac33a6fad5b8320f58e01c1f7973b7f8a757098d18367e83779c4c6aa48a1ca1f7cd7eb87840fe80393daa37be6ef0d552c2360b37315fd7c4ffee1a44ee23463a955b4377b2b7d46610111c61d77241e00eae7489adc684315ca7848be2b082550db8a7cda4156e3bd9d76134051a5d4153c428fcba77d03d92a6d573abdad79666e47423e1682d4cb9d2757d0b35c179493720c87fd233c17128da9812104033dd4ce990a36423e48f1ddce8ea1589ceaf8664881b88d424bb8e6b33a82ee5dd1208a00997859698ee5f7adb23c5274d21b43cdb18da0ee99c5c54e26ad8a618be18f11e262cc15a714082d3b3d9b31aa2ea9364a9251833c4e07603ac2e44bd142787140aab9fa26430f2a72ac9b96adee9e7ae5fbc1674215e977f772de305f1dcadef874e081404b35ce34c2214eb20d4535bc8592f7466d22b407be62c9f5565afd280db34b24645cb69a449522ade193f8a5d35dd200f0e4de6b521222d5b61e4762de42b3fc78dcbde3cabb1c7908e4a719425639be54db0c4531d101cad51d3532a3389b9c90ccdc5a1e07766e77d3e090ff0ca6ce734ea6ec85ed78c55522e639449d8669281b3f47fa8243621b3e166405c86029fe2693b9526d89dce055dc25e78f6d44b4dbb192116dda68a42dd660fe00ee1e41ce8c95a27ddbd4c43033c46cd8d17f790b01377257049569141da6d39234e93026df8d975ac862382d1034495541a609999363719258cdd3d041a0c81102fb5392591f9857a5540493bd134e21cf6a3041c440f6e6e46ca42dd70039b4cfcbc77da179041c4538468b54d9359e1896c3a3ba116214ee3618a2826ad6cd2b9a6b1c34a9f893d15b4ea22a1bf412e2b20fbab37f55817173c732f780ba3084f092ea2c03e022a99d7192eb6c6b04bf3440916e1a20ad06720038de820506c3bc8550da5214a492fb6743063b8fb57ba54af56208914b7e9971faa57e4b1e0c85ec63070e3108954ffa8b6096b893a8d8545d5b4b31eb9b78b7748060fc4cb3db4dd892d473bd27df49927850095b62092f5d4aa570e0fa9020b20c6eba2d1fd8505a60e6608347ad3c49825b1a0c8f26edf7ce475cd2c7f4a9989437db87aa7e7a445c4c3b81c476700e7a2d22b8b0ee3b5c90e25b6ccc73686591540fe11533d5d38d9b5f3301af8923693d6c7ccdae74240d2360451f27e0b715375ff4674d64444ed9cb46f91610ef36ef3f62d5985ad894a880675166af266bad3bd36bff9e6a4a3833359579ceeb7dc912e2ffccce7d9430d59a913ebc1293ae168e9e5a2323ba909686e6366849dd42fd0488681ebf8b8a0396c2612d5a884d037dae3f9572b0715f732b64c63736073ee077f6ae3b5cfc6ae09b23d4c00f4f6098455183d2d2b1ab5c9e752dd6370c1ef0b10de44d1a40ac07980d7fc3215510be792a78cd7e0d5128dfd00a92d0ca9af5418e20518872bb63d7ae8cbf94fcd8b59bd76ac185d73e7cdc4be8e3f8211c4f5d2c8c16ac6fa76a071fc82db1b97b91e8d2e315967ec199193cc88d95fd92aac8ed1d09325cb83240be60f6a5575e2750aedad66c419e436c290d014bf1939e3c56873e198e433cdf728fb5afa96d1a03f332064d7fef90bce5a7ec9c134031ae2081c733423aabee3b68cf8e942cd58ffe36aff9e4f68e6c47fe073f31fd00d89ba25e11e197848957bd8b77ed20d2a88c43f60d56fb031b95ab9dc7c6d6239b8537f6c298451bf668176d7d355b28c8f554740215d97d06b65c849d10689de6f1a00951702c4b4b7689fdce6c2fc0b20a66e5881d87f98f6a9297b6544fd8df7a7b03caa786b5c715ec2c1662022f0551375c1bd3cb59269456c024c73291130937df7c4828abc4c4314164803ce005babe649b29796a6c4d4b6fcefae511d96adb7b35d88ac68488dcb704c563e0a567ba8273867c64763643af63ec2db794f78c0f15b64a8146d7298631e5a8836ec23a296058928dbb0402941a48f975ae4a7419af5b8b472fedab1969192a53a22ba8cf10d3fd4e0a816cdc0e74de1417844327dac233a8eb948e34e7c32c2d61f4ac361bb8354a478be34418e4a5b4f71531b4902f452c16d724954480049df18c1eda0a7286a9832392f7f58b320a22a1a951ba6750819925a92dbbc93b1ec0f5f548162f00ef811fd75b1e493336fb73c55b704e911c1102916060bcff42e61ef405a751904bbb93e2e956400c9bcfafda572c8b8488d48fd29b851ec4aebe0a09137ecd73bd7a4f773315dd50e1d3f6660dbb57b5c4f3632311b9f86c483963f1d84f7afca41f2046bc0405dace3ae01d0a0342f400d3b5291e837196d7e8aa9ac50ff398303f009ca603610d5fb5df59b48712a16062f24716dc23466beb2592c2ee1aeff909dcef0831173e3b8b76188d99c00cb6a1e5314a3fa6fd9d0e6c96500489ab0f21280871fa4bdd604cbf9373d39e43488c6e1c2243382425016a6340879b69b04706ecf909cf2ec1559370609139f21e84928d412417e5b7c4e456ac0e24e2d199182a2f282b2485e93382125d881c6e4fe7dd69501c6f38a58126f97957d3040530278ff544714400052424bed371c2440d9b87400fecdcc2e1ec9bbb4b9015c001d58b092839ba64a23036df69ab64f60d0e5b6c9ce1d7ffb721b75e38a06063cc8f3a6494a3d3c38813897b138bc3a34b84935d39c332fd16ff1d31418d78f54e65b71d496b74380fb7025b693e583d03af4865ec05d07fd77d7af186d92a3bf485268aaf12410da780e7522f2fe3f1a3d31a387569ae39eddc292e190b0e305cefc84416e9b6c3c3981115b4aaed692f9ec92af68a9c1a670e2a31dd7a96e51c44f3c9d9a9d96179b746c0d13f56a00ef00cfcd86b4d3fa6c288f7994622bbf09e606e33d655829bf6310019eab1a9508edc0789dafd9e91c50480f3a0b9e6db86a64945cc0808cd14f46a06fd88c4a34aa0786715f6b4087b29cb18fa74f7d304e43f11a43ac981546bca57afb1207d4a6cd21612deac65ad0d935bc21b56ccdb20006f3dd44dc711381eb3691fb6aabca4441679148d2fbd174c0ade3878561b2945696f4001c4d60e04f4ff9e7c28bca14abf89381a1f71b492746c6b775e9255c01a3c864d173ff361a93f6b999f16806726d43c31e7cfc9e1c0ae3d392f4c531f92885a76b4c99323437661594a057cf9f94687e84128385fd42714fd7696ca87b45c9ec4fdbc255373a596fa43db89dd60e1d19001b7f09876a864b5d27da6ce6b20a9454f9d73d0dba7befcffb7887254d3c40d0b87c3da8f09ec67c0c251cf717111ae5de3a714d13a46750e654ce499079feae2c91f0e3e71a3960d0c3e7e70301c806e8014ef083bac1c83f9705d02a15e9d83f0240b822286105c928821951a008ea43803f04ce8ac2c16977a10ee4ec5a75b8bc9fe46e242f167763afbfc89ea48e502860f1317fb04780fa0e9746c02710995142fca6fc09a1563c5c844830d66ef72b4259cbb28ec2891834a4987490f7831ff480d70b2b2b23c2e7465690cd6c39cb0b5b10959239cb37b511dca9166ede484c6a6c594dfb3d02db4c5ee910478d2341391209f471a5849bac0ba2ebf2d966a670434fb4881c419f0c6e1a8e1de0c988a45415e21869469a66c2de813038848294444ffdec93a384d410c927f4c64246691160c6a6c80259c480b4eead3571f4d845bb0e9e3e817eeaa114eddc63a3a03d8c356e38afe01f66283176dd9b2941284135cbc541e340abed771f5c7609821cee592f3c0561e4d13f19de1afc6fd49067044a8b5c84611240094bc19177d978f4d3fec9ae828d89f5140b23eca08888c896ae72ba459bf427b9e4dbeea71e25838d18950afd82d285de43bf99e812a65ea4ef6824d41d0a218a828a44718b8263694599d19683d1b481326c2e6f502694615ff6dd78e843f65b23266654a8e99552b530a1fd8802da2a0980c5c03e24cf63faed9e069d1ef83819a9a18fdceac458d4c06721981c8a64422a3d8cdfcc2e696103d070dc00b79182975011b1d037a5916630449768c189584a1a55d4acdf3e236aae465c4ea772f819ffebc3af40a415170069fa4a1dc0d783bc0178ab26d2ad421c890a53866436b380ce5c9f1f333fde5c98563e90015bf2743aa2f13660bd20e4fe0289dcc18767767f453ac817fa874e926611e6913a8fa2f68c026c9a815e2e82caae7359611e6d00703e787ee19962f301ce07a89805b4a259ee43c6d04e5416c46515911d83386ffb111dd1468b9aed3d4cc282f88e1ece5f26d5ad506b1ce3d9e70f2c046ae710973126c986fd7156fb5ff9b20a47cd9baa4d349b66b6e9de867e9b12e566069e5ecf37883e62ea50c1727aade2d25e68964ef99dc2c144a2ddfdd893e7678213f10029c856ce89fb82ed0d65871a4cfeb243a783c0a7142eb25732de2abaf6baac90fc8ddf16baa4a404bc455204a48fbfbf5cbee83db2715ed5dc2cd263dd90a23ffb0e39e71f7f698191e6df806b0875bb58904409047d7acf907a12a19b5a1cd58964a9a2d1be1a6026b44722312c218fafa2c3805de62c278ff7b997dd2c00230c5bdb27b76009bb19111524bf6605692dec7f549ebec0e8aa6a4c11fcb9275e44f96382260a11ce1f9c6938e5df4a6676f9e2d2c6ea8c6f8b563cf31c2653ce419355eeb0528314b81e63d9e2515dad96e5772a7938dff13afa51cf2e44cc9afecd2dd534b67afb14984dd3c6b578686c94460189ad1e36c487cbeded3745866f8a27d359ea904965de5cbf9985a4786bccc58d12cefedfdbfc4d7188976a8087a0c3130ed9703f98a4c00ee50b89ca230d10c10b84631470f59a344ae314a743e3d8930c368400b805af325a265fdcd25d405b99882cf3d1a15d4dd058a81a43a9aefbae8db06ab717b275389d779418549f08a45904a1e60345ebc4fc3c11a89326e320c61e7aa02e8a98b91f6c9c08b52441143b684cadbf4c87f7ee07f8ad09e398a87e4fdd26aea18e2f15355be14df2e23bb4d0b471405962b9db2ee9857270dd36415fbe1ffae8f1d157a14a054f9af1b2c5501bd652a768b7a377e821affb7178f315775890480a113c64a00b8ea7ba06563d0880a5f00a8083f3ce851d919dfdeffc32f85936839a581b1fdac6d1783320e223489f20242a5bc929bf32a0e7308e218bd9b960a1fb8fde029e018d53eb3e1cc2edefddb1e6cc918d3143dc331f595c4afcc2a4bfb5bbb9c1300616f1dd3daa43462ef8472b62c8b97e24a9962d95d78c4383a2e6a9e437a639331740308d47b1dad27207168a9793962bb7d9dda2bd0359b3cdd11784eae306858f8d0bdb0ea02cb15e2b00a296131cb3e0cd9dfb5fda9c1c20b6b88cb22c28008f86541d5819f4f722d565979af75bf576768f17a8b386c83112d985923ed0138d6092e4dc7fe1a992e157dfe4bac849d55d79ed0a458f733ddcd2fa3fee265ea1edd188e59fe31d757ab9164cf0784f928bd9d21eb037962c961acde62d33fefe00c6617119213956aa308839ba2b3e773faefcf0844935a3ece98ceb2a0bf660228305b128189546b92fdfcf4222aab3ffe5c11fbd6f659846ddae7ff1e4b6e1909b08bb7d4e845ec6c474811a678efbc8aae75b7df5f9619dc3c04477e24241d75ad12568332ed365f70d9bfba8d0cfcc2830658227e0ba3d7951636f16e38d42ffd9ddb9e1a03710950f4bda77dda6a341fe95086f604bea004904be88a69de977d5a9456045d52f2018d1716579bb78ba3c7b7ce81f422d54e6101a10a4e7dd831b1f1ed0a687de03326fa1e26874c0e5695ddfe18a10586fbd030e67aa4c0d1e98e60d6ee94d68fcaf84b06fe97eafba0120d4343b5cae0b7c7c5ea0dc526f3a5b9d415a6c7e0255bcf06100b14ebbae4b6c6c8434db69d01446407be4e04667e59a707bffe050920bc556e884cf163e6d3ac663cf38705c1de4c44f8e660b23cc9ff6219a8c614af200cfc019870169bb1183092de94303773a0bdd099985b7d47042b9e1f11f83535d5e8480d59393601443f98b7fe740356409e74d853283f00e996060496a412639a768f804fbfa91ac85c2261b700fa72369eb0d7b6078dda892fce533379948cb7c5f9871139d4d5f5b12040f83999280a323a395e1c3c25e19c2281e9e1f3e67c15df0d3e6c13373660794a7fb9024832438835ca73f7a9f11a8be096f4919898b4bf4e00c8c70be46cdf4fd5c00b826373156982f8e30a59442c4a9231659085ee291ce8ac256d35e6b74b7acca88220bdb6b895534eb4e2cbe581a6c30c95966df3e2238f6b71d9803d9b56a41608673ec2114336cb69074b34bc9b5d3472567a9d3589b16960ddf21ef0c38ae381cb0e2bca16c6f7bf52a0083624ab6547ea0085a0718d7ab0f65a80a09314e5c3c586d7051ca6222113bb5a33b7402dd1285c6d8bfe3a21aee5c666f14176d75f63e500e85bd24dec7da19d00cea8319cae5170188a38f896699a0de23fe8bcac0de91636f24fde643814568dfa56abcfb4e69438ae38bdbe8d43dd08a78dfe5d74d3d58c46651989a81870db02dae8d8052c34745ea4a87d65725c4c5be7036c5767a85ab8618ef00128f7a48f952a658d93f1abb1e2c9e7f088de10004891f73b91bf081997511e250a155105ed3c05de23f92dbce85585086f08db94022b6c314d93f2230d57d0d4b0507b23acae81db99812069ead8bf9ed62172f1f01ee787aa648afa9515045814f6ea277cd029925444109e1099d28b2bcbb97838ee0c54648d09fe55a7a44be2236c9e0d4e61ef7cad666b7d3452ffb982edc6771075fca3ae390a0824c091124841f38d92fcdda838e0e070b648e49164ed5a2f66d26dedbee2e8a60a9461af275459e8877dab759253ea070a760264541c2a432ce69a2b1d0e253e73c46221ca5f027365f490c1f9b68986e2b8898fc8f287e34c1f4c19255d45a38512e03a60703342f09ec423f642f94a9d03c17b38b0621a8b05475ff2c42b0eefa228305d097ea287aef86862807dc7656a8711714add1dab7f72d4c8362735689812cba4d02b154893f3509c3f497d2afe86a383915ebfd8cd3adb99a922ab056981a8e7e2e9e053cc9683708c71495e5de97ad6e26c5feb30f47294e86c009fb77540cb32a99a31034fb0de30d5f14fc6f8650e772bf331fa09afe5783739d6bce40933740662aaeeaddf9683435450af8ae9136ecc1e3649f0190a813b12b61a3ee582cf3a71481d2055d934a6576421086bcd551d81342e7b71a4adaa3a364f7857daf8167bb83840e434efc4f21574ab4f0d63193126882508238a8683d4877314b13db6c1281dcddc263efc52ff79378009cec626857ec69b3fb308798f6c95c4e99410cf746f8339612e6dce8fb8d452975804dc93e3160abf506ae482fbd948c1086f4b822a9cd2968094900304f08bcac64bae8299278247ebe4fd40f9d4d98ef88e93c81960829661644e5ddac4b7409a459490d0699d9eecc4353bdda1d77289763c6515a57ac8bf8746c94163c0c9e18a196a258ce3bdb2a02e7c4110ff275d23ba3ffa93e922f60164e485d456131ee2b49f075b2d2d88ac775239fe87572531e116aec0ae5207705a5fd381e33511b8390e635805b35c66d6154003c7c6578e1ac563ad48b42edf36baaf4006cef9a3ca68774b565232209d13eee3a698b1df02386078675f477d7549ed697d69a7195d17618143aaa3c9673548c324a2708f02dec2aa4ed8357e998ae264549e1dbda9f330a19338a5fda164322e3c3d6448f58fcb58038277295e602c3afbc3dbd2becc085c53a673e9346f614cc21454ce4938a65793a31171bc843c4e5223f677d39525d913540c32292b040cfcd9a9cc6d36dce45ff27bddce668fcebd9c33a80928b321b01652a6571b2b99d69fc42f82d41190683b4cc523107228789a7a7b340bd0321ee70e04a0725ae72e2816a6501a9f28a9a0f14b336deff20846af3910b4db9b2e6404f43dfa036f96846a98e984d187fc853e00050ce3254f068a52556d52c75f32d29eb2f1eaffa874fcb1fc7a36a38ad60ec0a12181b35b8a8038b964bc1a3b506b85581fa3398ad9a5410567db88aae411367a70eb848230f250d30453bb4f3acedc62bc134a721823483acc18d68bb8476543d9bed589702bb0d1443802f02ca084c1c81a69e04d1d08cb7c95b4f792e1a9fd0664786573a90fb0a0ea5c86eb274134149d0f5d366851577344e94863b578dc08d98688b548fe82258a97b3de92a662b324bc66e22fff9e61d671190b3f568dd383486da8195e40bf83e4be8802ad3f15130f28f931e38ed6c4238cf019b9c1336ef7f77aa2b7265f8b37f22adf27ec63e4b51a4253d629821a125af3661188dc77b31f82f89cd624a2c86f82e0036645f8d13eb410c95edbc06c7b87d57ec8987dc9e74dcc6d8e5235b48cfecbcd87fe3d8bc38cbe21fc88c979f68056fbb9ec2cf0e2737f32dd54835fd96a654bb304129dce6d1053a081a6c6e61d662a9ad03f1de8c95051d37b01b818e87dac9929b7882f8dc0768e952b8360313ee28968a360c35a367ea4c69cdc67f06ec21035e9145460e3750b2a4d001c33f3f3f3f3f3f3f3f8b326f5bb0cd82501264929b5c9e3196621029a594524a4991c385e615000000c2d61a218406086c806f0e6f0e280e279d34290945394e3c39ef327ae6f6a028eea75297fdf393313ef089c28679b5beb7eed6ebc3136579974ff75ea544883a51ce7533fdb2313dc79513c512cb04cf92476fced8c7260a7bf5e993567c0ea2c4c68726ca3997248ece9b667ed41f99b853939cf25c9e846f860f4c9444d37f2dbe2f539697286865069d5fe2c478a325ec70d2b869fda31245fb205256f7465ed3bb0f4a14369bfece30f6c9f49328968c4ddbd364396a97443106d1d17a6289b143c64814d583d64d361a270912c5586a2367dac50425e81125f549465a283d39d805850f4794bb4383ce56265fd5a61165fd32c15485c888a2894d26c5fd8be9b0b10a1f8b287b28f5d366aa1d73e8b0f0a18862e7b75da56ab452d2771f89288b569351e9e5bf79a4850f44143ba6883897b9f8d21da294f51ab39327cd8f4186287c98cc31dd5c88626fc80f25e676c95e4208b3f13188abb3091e273d7ef721886249a76ed4556c67ac578128c7ccd09f32ac79875237e20310e5d4b53e2686e80f0575193af726f1aa72c7407cf8a1a4a67eb496e6bc1d94fef0d1071d38f8e04341835a8d92379fdc31cf71c380c06af1b18762fcb4b249b40b99b3a387b249534a4b6e69c931f3918782eedd73ed6061deee071e4ad97a52dc09e699e98bc0c71d0a5bfda693c80c372dd9a1ec99aafe3e37c7aeac43d1cc6a2c446e08d91c1dcae76232c933f949966a0e65f710a7956262e43a45f8904349bdfb880855f52ea638942cae94be7d1d99230487d26c34b1f1e98f373862dcf4264d5d1e3edc508ca146d78cda508e96b14b4eda6d639e8cb035273ed8508c267569ebf9688f9f11b68f359475e5de5f63c6240335945a4e281966cf5c436f8a8f34944c4535c6a41bae43a2f8404369f374cc49b346dfa31f67286aeda70b13b775758463c71837aa047830f8304349764c27091aea11b632d20d84430c2bf33214b344880932a3e81df8204339bba8d3f76da7ada3bc818f31146397a94ef6b104bd0eae18ca625aeb37893ff80843d1cf64cb4d92a01136b382f60186f2a69c8c0d7a4ae61233c2868bf8f842e104af4fe2464feb952193038c2fd0176020e2c30b052d535debfa27cab6d7868f2e144f63bc0ca5c3c4b4fec6e1830bd98b72d1499fce16caf5a934bec9d2ade1430b65cb986b74290d621afac842b17673d07c53da93e07d60a1e45697ed73f19df1a6018e32c6f80ae418c1183f328232c6f80a7c5ca15c625badcab66c6afd0c1f5628dc499dd362842e498c3970889c033eaa503851726687a8934f528e80035f20e1830ae5933e7ea5495257f898425945b47de7787af336981f52280972842ca95e64ba308942296c4f491335a8ccf21838c630bb0f2894c43cbbf9f0ea91b283715bf8784271732a6c13c1ebc18713d2b0d574cb2dd5d5cdf2d8ffb5e51b4eb6e3861837c2e8c0176098e08b1170e00bc4356b42b9cb4e30d968ea32899950fe0d266ccf83e7fda0c8cae16309056542c6fd135b379cf9a184c2fbe935cbd1246e64cad871c30f1f49289874994f95fe9da9890d1b65ecb85167870f2414644c4e5d79b1497d3ec2c7118a1bde2ddb94a4fbfe21c287118a2797f6f675d5a04ede081f452898ba385dcdb973d57492f82042b9c4ac12c406f1025f8051be00e38b0a80d149f818424196de32514ccc87104a222ad7666fa2759ed8183e82505c0d3a4952ec7dfcb481501437492c41aebe964a4590e1173e7e50f2ea357db5ae4badca38222f42860e0a50e1c307e5d13ae9233e9eb251dee0a3070531b5c14aa6da67f0c183529ba68efbbec9693f1ebb28bc6a34c1345b9d8c1f91319288183a0c0d444470ec400a78e8a2789de47b9d4d7284ef61e8f01c13384bc62843477ae422fd9ade5fcd24513f63f01548be04767ec30317e552f245cca7fdecd1bc45c14e7c4cd273f0d8b0d9a29cc413e5243984ba894f692dd88316e7310b0f5978c4a2ec9e2f4da6a85935496051de7cbbe1e464f2497af38ac286ac12ebbe0f196e57944d32e1a53f3cf4b6dd8a927c26778e6cc8308d595150df3e62f6649ed1c155944bd0784ae76e4eeba22a8a9ea34b5abd978a72a8add5c69c4275ce5051926e4cace9bec7f74f519073dbb9e939d74b4c51dc18f6329bf0f1284539e81379921c0d2a8a8ce8900119653a9c142519997c3c3cc3f53d8a82cba60a5dedee131351944b5cc3da29e9e49335ee118a92778a0899cc0345696c35733f7f282d493e517e531d26e47c4ce93c513e59e2654cf2373fa866622427f8828047278a3958e82a21632ef2dc297870a224680d4a75a6313361e7133c3651ccf0ae0f6bf25a237868a29cb5835ed3a2353f7864a2bcfae14d94ee7df5b407268a3d7b275ca78c268ddc9ef0b8445946498d3ba2f322c496288c2c519d6bac4cb6fa62041cf8e2121e95280926493f2b2a6358e7609461c278364a7850a224a6f0eaa0664ffc26a1769ef5f72e89926776e60fad62a3088e1d5e8647244aa553dfccefe718330e897250fa7d63b269306b1f51ce244b45c9a653ff84da114793294b28c15c3efc30d8ab824723ca5e17b3e14dfb9572471819510e32ea63c33c47dd7a1125497e14919de1354295c343113ef04844da3e4296589a933c9729d6ad7920a22427e7aedcf42f1bac5c41781ca2d83996a4b1448da345f73044a9e24e12cc733cd1340c860b6ee838bc8347210ae2f4493a28933ad90977c183100559bf5bfef9d49c8d6cb816c26310850d42e37c060d1bb5ece0218882d63d2d1d760343cd2310c5925c9375db26b5c1a40d1e8028d89a2955919f4ad4555483c71f0a9a476e4e3b39a3cd08803478f8a1d849f7959da90e0c1e7d289efc90ff27fe050f3e144fd07df7501e19377fde73bb9f877622f0d043a9744eb11332345b4f234c82313e70e69887b27ec9f626fc26dfe081878216f7547dfd41a5db6bf0b843b12d949b5af318111a3378d8818dbf1bb4097d76d7a1ecdf2b1f4f5072f256cbe0418772dad693257a92a40e9a391484126ad288891db5cb430e25dda524419cf0563de25046adfa1333e6620f3814433d977f2e79ee64bc285a183cde501eb54189a6abf2d4adc3c30dc595d13d6382521b4afa3cda504cb139bbf597ec8ee24863dc501d9f2413583333b3326f5e450fa44044003ff06043a9e40c2f79e44bc94fe2b106b3d11e6a301b1e694043c3799ca1bcb175da334b8ed3791d593ccc50f8a86f1bb23da68e65048f3294bbd2762f460f32147c64926492c6bd74d08d701861186381911d374c209270f01843f964ffa9fe2cd24a2849d344c68487180aa2eefaa3cef3973918031e6128c68ff51e6a7326f1cc11fe04041cf8020c1d608061c346e900aae0018652586b7a9813c4ff37236c4e028f2f144ebe19939e412f860c741c19e848107878a130ae72571a3f65ce9811b6f38047178ab9a79a5463b6b69b3770ece0423929cf50536ba7fd1c651cf0d84271664793ca97b2e0a185d2a8e791d3962abafb2c14ef3487d7f324160a3aabc9878e5bc1e30ae5f7bc97399d18aaffb6029bc4b0a1e3c9f13c6678f0a84259355d7ac8cc34d9ea2d7850a1702749191feffa94d6d8e03185829027cbb5dd4e9dcd27f09042497f3e935f4b4b63d47cc0230ae53d49deb90e1a37c1030ae574ca63ec3ffcc99bd34cf07842513368b78ea91fd4c61e4e28aaa739afd1f0d4b91a616b177834a1187e7307bbfc701b4e1e4c28ad758df853a5edd459038f259c8712ca1dcd42c3e63749eea411b6bb197824a1dcfde39e333e6bdc3ac276db020f24943f7f3c891f214598f4089b8e239444ddf82b2a7dcbe4c2f03042515d83f24ed73ce1b2177814a19cd4373506a5438482e734c24c700b4f7e0fa1b8a5e306ad5bdb314908e518c6fb44bfc4f4ff06a178e6fe39a737fd4d2b100a2689d8dc72cda44af007e6c6ae589bee7a96b787fb66d41a8db0a11fe367f0aa040f1f94da649a0bddf9194d0f0a7e6fa6215d93dcb14319402f9217003678f0a0781945bf83decf8e3278b18b6236d3c1a45a074f4a70e8b061c3021bf8028c2f30a08b5249b993b9b33d6db7b9288f72cfb02649ca5364b828690d93637ef1fef85755c18b5b144b4acdbc99dea348cb0b5b1443fb8530d98454f0a216458d5f2d3f3189fd7a68512a333b8df16544ffb3289912f95227285582d53703111ab88e2878218b926c3ea935ddc8d071a343873fc18b58943cc68e3f4a0e1fef2358945443eb8e8f9d3e3f794549f7de4b4c99651d78e18ac2cf78c93ef33615422f5a5110cd767d55e79aa515810d5614748c8f26dab48453df2aca396f9b28f26434bd51534561939279ccf32a4f6ce741f02215c59f13cdc1e3c3e79860c75f00158591495daeba79a7eed8032910495e9c02cbbff89c466db6a628fedb659f9c6f94099b52945bc3f4abd4264539e91c3e9e7a27bbd07ec08b51f8e15eed9679a59bb32b195e88a2b822ba53998c89ce3e1405a53976f375a9a80b81a2e06f4a888c97e8bbc9274a3b734a4fac0e9eabf1c21325cb937f9561739257752f3a513a91a66592b0a31773a224d63f477f924b8949df4441e612f67d4cebdbc65e68a298f394d614196f4ffc3351be160fd23ae7c62c260af3b13a931c83e9522f61bbeec5c824752c51bc3dc993bfcb785f5d09d380179428f597f0fe101d839cf016c18b499435467349c2da5f9b8e24caa731c53c9f68d28d23514e5782d7e6fcdd5d5efdc00b48947efb3e368f1c3926fd88824e92e9acf69284c7124714a4aa6f125dd2aba6a6118519d313f5e1e74b4819518cad8e49099f2ea254a34930a13cdb4435155112aa64850cd3a9b7bff622110559993fc9dd3f39f8271151d8fbdfbfd574926fce218a1dbbf54356e3a98d31447963c692358649f1d2b31085ef536ac4e67cb3f48428a6531dac84914178ce0ca224c2b64bcca65353aae885204a3ac926ede9dcb52b76208afb49729d2de90429234094ce74e4e3ddf76df4ff508e19d3fd896692ccb2fba1a026d5c9ecf8d94e6ffa50dcf22f6136c72c57b23cf0820fc5b4cfd3d9d11a79a236f0620f65dd51722a4fd923add643d1749db68ca325aa6116311a789187724cddd541f3a86ff4f01ce0051e0aa6e92c547a7c755ed18b3b144374bfe9f550e161dba1ec613bbbc7972b6da201eb96945603c1f95cadd64f9d79d1a43b6d5ef5e40d67fca020367f9fc828c22cccf04131e6d26219e3a6ec241686193d28a7f5f59f19dd31d7f32fcce041499a133aa61f6ed5ba85eca2a4dbba45966c85105d14e63e93ce1adb949b2c17e5f02749ed1ee4934c135c94e4a6ed8c96eddc41798b827a7acb60524d36eb6c514e82ae127ceb5a9463f698ed37d4a812d3a2f04912cbc4c7a87d627816e5f825c868e97528312b8be6ae2c456ead4d2d2ef4fcf2da4b92c22d9421b128e8d2f458529e70629a7414426051327df322d747e6f4be0221af28763e31094a69f9664dbba258b12acae6939eec1e0521ad28a7d1d1047f2f39a68db3a2185a4c1254934e2757ada27babfab2cf33f14e9f3d610a5145c1c7facd4c4ed259e684a4a2b83ed237a96b21a8301b21a728e7cf5efb4965424c513e31e62f57d1bd39a814857ffb8f49c9cc601b2245c193f84932de2849929051a4b96b6fb959a623e2e55da7dbb60d1145e17dc7e41053da4a4476d4e0c74831c4c8c0de23424251d06ae36b92c94240515a8d79574da5a87a0e06120e1c39406018f2897b459458aec86884433c5196d689cbe69c89ebdce8ba6dd23106f35c0b423a51b219e57baa4c18c8378470a2dcaf5a523dc9e9846e36512c33b1eee49cc3cb89347123241325bf5813f3553f6fa2104c144643d5e2d2c4448d219728cf49ba26499973eebb0e422c51104d1f84a718cd9d3acb4448258a638278afb1b0fb450c8310428992a4d4b4456a725d13343f624470b8a07d103289620c7b9f4da17fd2278962e7bc66ed415c37121289b2a8965c1b4dbbc47443a224e6297d9a4447dbe67a4449509218aa3b8497160881e6d841c60a421c51d2af9e6a73a61b51526fdd22a662942799ccb1838c104614d3e4d4f9a574b39c6911c5ccb99465f87ccfc15744695caf94264149aba924112559cbc5c453f7245809224aa146c7ded1f9373ae710854b0ba9495e3dadcc3144c194be519bcd14a2645521af74949c41a80951d853928717f5d6717b100521d647962cf193905941949326f78fa5637e983710a5123c9738fd98499a1410e5922c735cd6f66ea47f28c506794d52ee87828e2293bafeab4733fb5036494ee2b628419e60261f0adb1b165efa1e4abaf3d641e8d6d11feaa128e77d637f9937495d481e0a3ae33b8849131e760bc143397b697d2d9d94e99185dca1983a083db169946ad209b103a3e15e3277155287e2e57f89db36dab6dc11b60e84d0a1349a930ec2c4ef924a2c640ec53842fb293109254ace47d86cd8d8f12e10f9020c1b36c258be42881c4a2fe399c9a3ebe6c67128adb8fec6e9a7d58ae0500ce7f135b59c9b1853216f28c87f4f6d8207a95b9585b8a1202b22ae42681276fc36145dbde37594509274a7103614d784e93941b3968529640de5be5b3f613bcca8ed216a28babb5be839e9cbb70e49435ab5b3b566591577a15ab2a3a44f22002e84a0a1b827850cfb249e9fbecf50ecccb7beba3d5fb22b84103394b2c3497276f2b2d774078494a1b4a5468526f1c49f94092143a9df7d4e9bfc4f91766620640cc5dea03dd646697197c5501a4db2cb46e95866128682857e4f4f2b0d1b4d3094ca44886f9ef17bbdbe5018a1439f5ce2886fef2c0d215e287b7ffaf0ba7c1b1f8574a1a0e6ee372c935c2809935e649c20378850821783902d94aad32e4eeddd7e7a3107215a282941f474fece1df39e8592f8edf6993b394a2861a11cfdebcead47ffb9778582b291c964cfabd7fc6fc0c0d10ac5f5d8fcb69b37a9c66783902a94a4f178628f3293e4893aa8508af3526eb1da65ea9e42b9ff642a71b14aa1707b2509f7b1edeb41564648144aa6dae4ff9af99235f106215028c728a3c3fde78535087942e937c96b57dac47de5236c7638429c50f6e46a429cd6336d274d28c74c2789d0269e984d5e4f470813caf3774a6b8cd9a01d2fa1347f65a1f408256895503455d725a7125cf77631429250f0d46b1d3ec87ff5d805482885982731152d49accebe20e40825494927674febc031c206831023948448d3fbb876fa353b0cba1c214528b99a6ef236530f42885032e94b06216c3b8d49860c81d570d395cbe8e9b742bcf77a297f10228462bb8dc7ccb28504a1202e4f9fe823b449a1130284f2ba285d427b0e32ff26e407051d274dd84cf3dd9914e28392a074d071a64e910be94141f565d56a34e1fcb4213c2875897ffa7e4f1ae2efa27c9f04933d289374e7b82e8a9b2136fadb7710ff72511c932bc47c9e9a99182ecaa6549fdb9d584a52826e51f290a51db736105b202bbbab7b792d97731e1f359478ce06406a511e194e09dea3aada3c5500a145a93d7e2f4ec974239352009945d14e5cd9f6a5691a25b22885c5ba77a9ec099f82c4a27073add725f7f3d50a0bcf5ede3ef4332f2ce3b353a7da24ac268da9027945494d92d40893245936c8d300e28ad2ae6806bf93c3e405d28ad2c81cd47a959cda5db242b7eacc530f1bd32bab13ffbd4d8ef9415651ec3ad32ddf415514dba3e7b7b1b593775f01482ad0a1a7e7edc43f6154e8e6259bdb98ac21e6290a9fb39cbcb9733bdb3545f984eb09911f2a45e932864e629aa8f8be0a428a93781b3f956cd8236cb94c8618377014e5284a189dbb339c0c7fdfa8c16320c7d30007074e14851511baa6e44bf02b91c0860d1c39de0663e018c3860d3164300648288a73f2e14aed28414051f68cb1366914f577be7fa2f4b249e918ecc42f39c78f2439cc8b20c70e1198718e1d3ad013053d11ba3d852c86c8181f061b1938127d904e14d3624bbe1355256a50c100e144f97b464ffc3c9b0dfa9300c8264a42963c3f1e3569e7c79a28fc86490f9f4d3494fc9302209928dcb9670777139d3916714c14abe2fcb6440717378df161889c5600e412e57d8d31d6882ebbce2088258ae649752725c739cc485289e2f8dc4739ade5d8a18312e5647d6a269c656a8c8db0888e1b673e8992bd276531ab56e9d111462226870bd4cef873e04834002289d29624aaafa69ad48cedd01189d2283317ddbcfe69930a89e2a68e39a952274ece503ea21c635e91b521a486924447144e6acc5f4aaa30f199d346943d988c19bce48f59351d8c28aebce7a43967f411a211361411d95b44a944bbcf2fd9a3f46d32d00688224aa2e5a4b869fb4e263d0b8024a2245e8737cbbc0dbbe9089b8e1c662411c181d234c70e1d8888d24791a5f2e4c7da8f0e51d618554ec3492294b48218a2a06435b14cfa6993cea41025615c4e12e4de8428c73e8d49b5e874b179130ca2d423664df06cb2092f19610bc3e470c11b32cec4c881c302de208240c7984249626a84adcf6420b2438cd4170009c46a97793d16c99581c8ebc861c848f3000820d27fcf693dc9538272fc186364a0fe50fc306a546aa6ca0f4537b14279dce0df482a02b3de2146420780f4a194194d923de6b8481a1fca3947535fa163e5e3e7c880c0860d1d39de05207b2867953a612234b41c7a289e30bf9b377de7b33e01570fa440e4042079d84e787451b1b13120782885c70eb549748d96a25b0340ee60def849eaab1d597e00c40ec5f44174fb093bb6e11e61d3d1752877c637f57832c9be21103a1444f7ac79072526e141236caa0090399442b68350dab1ff24510eb798c5272587a76a129038947fb466974b93a25a32c4b88107040ee576eba033ff7b83f4bca158b91d279932ebaf1ac40dc5f190416932b962d296dc18c380c0860d1c698c1b2208d2864df03bfbd1ccb0a1d45943951a0fad553268bb86a27b9afedcbd19b43e1580a8a11ced457dfaa4935c8dd9b01146189f7820052228004943694e7934694dd0d113f31813b061a38c310c7a20052205040da5ddb82c694afc94221b61d31d62a404809c016d1488190a3a7fd69914bee1455f0394011b391048195611adef969935f7d4c16abc73ccc98d3074a0bf41c6df2003476281107c61397690f105103294b773a4679051a2a8100340c6501c6da7e66356257b327d08d60532388f74871809c900114331fbe4b673af1d159a24826387085a0640c2508e1dbeaf7458e7feec081b0240c050902b999626c37fb8ef0b85338dd99c4936897ba1349f9bce74ccbbe048d553a77f63d24408878700840b879beb4d351fbdde081bc2b1053487acc949d6acf307211c5aa8a48713637763e8940840b2502ec9c574cb49622a990c316e88a0cf614674348360613d59ed6a4ee61dfd4800728592cecd59353f46031c6184614674b02d88158e39e84fa643ef3c8a430c1c39c8b01b0148150a235d4fcecc1df24565054285e2a5e87cd5994d8d9d238c6307da14ca2e1f42be12496eec303b749c1988148aa644873811f9f3d116d971230c3274340574fc8e328e7a200522071285e326396b16cfa0de21031c65983040a0605c7dac7a8be67abe7e204ff8007142e954ee6806b58fb0952d00a409254dda631c993427e90d4098508e31b94fecfc7ffb907183065906c812ca99c2dcd44a549fef34f8313e8761144094509619b1af6a93a3cc1a61034942d16438256a6c3ccb04102414bd42afbb66fb64758fb01da124e67bd2f7fa9e212314d6bae72f4f8c9b925d0248114a3fcab3eb866b3b9d264249a5a8d54eab956eee1d12408650bc12ef4918ef7508a1e47f1a55d6724626519d114082503eb792d7d4e797743a2f0208100a6bb2c8bc76f7e84c7f508e417ac9d93ec767f6407c50f67827b87d12a3e7ba46d8708c2172e71e48818883f4a0b899194d4ef6a0648e7100c28362107ae27e869aedfcd9453109aba1f6d4ae8bb299fa245b59ddb79be4a2e461b9316cfb3bdb36c2f6818b92e867621c51a5915b14e4ec4c89af94d3c1a32381f0618be26cfe67dfb8ba8cd1518b727a3415193a3a6e84f13b6e8cd04064c7bb80167d7ad25e42277f16452b53d2b695300f551625fda0397e431e8b829d989f4ea4094de23bc2763ef880457143d668f268e77b370f3e5e5118f7b857e24aae28cb874ecaf5940e0fa35614fe44ff603aaf47b70f565c9f8f5594932efd233f7ccc7af7a18ae26d99ce172f35b3652a8a37772684081d4476ee03152549ab6c86d165724efa384539779b3e4c51d0c9acf48eb2cd9cf3088be4d84146e1c8b1fa518afe20459a8f517c88229eb65010d1a74e9284b92d79d742c14f1e75160a32debdd87db00e15eba006160a3a9c85778d7c034709444c8c1a572859669254b7fd6f49a2dc831a5628d998b811ab6692146d3f078ee40735aa50de384a6e3ddc6586870a25c9a4d3ab7232d7f53e85722a49d8958b580a88d5aeaac8677abeb89578e613c5ed43ec4e5128c89537f1c4e3579d7e078e304460c3c60e1c61e868ab0185c2debd7a85fe84d2f8698f613b492243e784820eafab41a8fea0476c82235fb5ef6efa1ef256af9959dec48f9ea833a170159f9ec30825e57ee61a4b28ba98c7faac2342ac5342416df3ac9ac90dfb66124aca73f018eb514bd58f843b3dbfc653d34a2cbd6d732f6c36b329f5274728791821bba4d9d8b3aa110a3ba7bde24dd99da0ac518452aea992e4441353ab05a106118aa146798d76935bf16dd80040156a0ca17cef7aa6e4a819df19dc405801ef334f0fd4104241eee8d3ff2cb1ee7f108a7962eef1568d633e42410d2014df6d6ce399347dd3ffa0184e88bb13e3094acc6a0d1f682bb2b3752e175a775dd9bdb994e6dd89cfd6e841c994d02fa62f3426c1a4060f4a5fb2ff9af45a9e2503060b68eca224a322c2be47c6f9f808eba2bcb39b53d39324c7da9d0c1ab928b69ac9d7e94c755d828b62278bf74ebef672b25b94dbf4849356b6e994a02d8a69e2aff2614c1ea14b18d0a8454166131bd9b817a667cb005f408316c5b99db34ed2be65500a03078e13068d5994f6b3f79834418cc91e0d5994d3e98c49277372dc3916c5b01a348babdb6893a5018b62869251a3aedb86bb1b7845f1effbe41873092664940387c818393e036c39be3d40c31525c9bee6dbc46cee986f45e9e39ac56cdc74ad39ac2889d669ecb7daa3d59bbe024f461923685e4541ae6fcd668c26c49ba8a2dc6994b9bcf7e831e15414eec45fdd095ba2838adee2acec35f4ee64cf336dd53445a5978c0f086e8441860872ecd0e1344e51b8ba4c51999338ed2153145f43e734bf96a1a4be1425d5ff25523c86344851dc9262aa55a29a8c2668a0318a8269f9d8df24b3e4f4a228d588df33cd2723ca1ad9614060c3c6c80e43231425b1d125474f3fc2f64806617c0e32b86980a2249aa041d5a7cfe6d0c80e03821cd961c8c832765cd2f844c14c937d8b1608c11745c313c5105a279f30a723d0e8444967173331eca8a67822641831180334385110b641a49c48cbd88156468e10746fa2a0dccbb3072534c2a6e3469b8e306eec90c1036868a2b4417fb6740c7521c399280913724ed3953430510efead226d2ce487fb12e5ddac639df38ebc3cb1842283d0be41e95a89d28e3831bec814b3fd2951dcd5243eb39f744bcf244a79a1e9426cc8d2de25511a29ba4ae8aa9128a7f549ad9b4a94c910248a269f9d678dfe495fe611a54e9aa749ccdab14347c311597ba99d8bb8e8d9ba7927f7cee193a46435a1469466bd93cbafc7def46144617c93e6523663a7371a8b28cbecdfad9c140d4594735042a7d3164af62e1a89289ef694276bd2d81713224a5d92984ad0992773598728b89d6e0d6d82b0f9942196d30b91fbdaaadaacf23ecfa2f394d526691582b1fc34fdab9d454c871a21dcb872b34e2d1b0b79d7d84edfa14c78767610c55862ba09516f9aa42b887288999dd7ca0bd5a648de8e316ee000c19a89d00844f9ac43e720d7a233e72c0d4014ae9454654a9557a0f187a286be96ce27742cd0f043c1437950db70bf40a30fe52f51454b9be4b164990f45ffb8e973f093443ac68d1191b7c10d1d9e01b48762ccd31274525288b4901e4afa93c5adc91ce4a6390fa54de29e584d224bf28b061e0ada297d4785675129dfa1fcf32394c72c19b2363b94ff2441de089de4b6447528dd4932497f2df14c52d3a1245afd9e1cce947d8e73289ed0a5e6457e1431b91c0a2608f5d03e3fd2528f83b9239a35eb6979babb6d32ba70288549e2685255ba4b8cbea198f5d36f69ee9c439a9881861b8a4155de5f937462ce1e2bd068433144092977192ca3c186c29a68e26fca87c61a4ae27b96a677457307d550d2b5fb1899ae948c8f461a4a9f719338f2b73fdf4d030d25a5c2e4d251d5ea9447e30ca77826115a6543c30c05693a06cf1c74a4a7b20cc52429cf9f971a19ca23537da8f75af939c75038594dedcd9577ec4a0cdbb7a9eebddbe97ee8977471778d691a612896a061622789278ba734c0509cb75653721aed111f8d2f94d23f3bc638217227f68256f9b661dbb6b955fba1930997996f7a4b34ba50eebe12b3cc8d413f8606178a416df57c1056afa7a4b18592e79c63bf9b5a9a2443430bc52a3997e441294fdfa72c94357dfe67139f0d1bd391430660d0c0021f5ae2f2f6aee55e22d280c615ca258912ccd24fa9f9f8b50e6858a124f6cb7790fa23a3897240a30a25cf4c3ac7424b2ca1d1a042717e355ec77bfe041a5328095193413c49a399275da02185923c62de93a74cc2e4570834a2504e0fb13f4af611fde124d08042e97395a8dbf424c6cd4f28c98b0f25dee6a4458986138afda744d3d5ce892a8f46130a523749d5e29e64bc8bc88492246a9930b78de3a0b18492faa9d8884fa2a184f26e3a59623a2175c35915a091843f98e423379c90500ab770fd24bb4a099dc6114a555f9292269eed5e2702348c50ec203eedecc9d07227348a501294783d4d42f6324c8850320b25989293cceb1ad318c2165be561eead2faa6f9bcfe4f823abe64d34845074539feb41de88fa9046108aa3a48f956d124be425420308c58fbf6772fca8a75f0ed0f84141ad7c7a1343cd5d4614a0e18362096ae7d673b48c15d1e841413ce4896994181a3c2849198f3fd1e419bb286c6a083db9cd04bd715d945ea47e08f5269acee7a2bad09313cdedaaeb94516ed52709611f74847051ac17256f44a7c898c3336e51f43d9b6d511cd9617d2e4d27e5a15a14f7bdc48f694d9e5cb2b4288e8c5ba6d1e133ba9c45e14ece33c7c8a21cc2367c099ba765632c4af69762bbd9469a68b028cf89a54ffadb5252865f5190276b67d12e173ac4ae28bba68d0e324b5092aa15657acecde6c95ca9b68c8c95fbb5b9f5861505a1a58312be4a366c5061c62a8a1faf3b9764a7d35daa288992214d90b9c4c9e94a055f7225a721d6b11df756ee338327f954a828972062e642afc78de3294a32889af809514aafc914853dd3d998272a4549fadbe6f8274f8a725272887bcff13dcf1e45316fade68e511645491232f3a60962d63b170a5ff575cde34dad3ef557f37acee281a2203d93c9137dbb7ee527ca62566227f5b1b93cf6443975ac1b5d42942a49d909bde2edb5cbd6664b85bc66fa1239991345cfa8279b18a5831eab073336510cda35b5dba9512af43bcc0c6ee4204344c4032910b1314313253987659a293337c10f23a9066664a27463e2e4db5c80230c9c8189c2d7e8135e726ad5b91136c6c1814b686f66df1d973a761d1fe61ec3c6b8b9c005383840060e0fd8b0e1021c61608e1d64ccb044b1947f29ef701f73469851897208ff1073ad0a59f23acc080858c4ca984189625c9793c2af3cf68d236c61c8400c1c0107beb061c3868df6400a4472cc9844b92acb9467cd399dec0c4994c2f4b604b97b6bca1489827aea86dea693159a1990288971e77ab4df7b6efd1185f19a8f7a3a88cce174444928d3a554d9a98d288b7e39d55527a6513e27cc6044e99418c446d36c8f1847662ca27099367eba124f124e3a4311a510914ff59a444dbb2314f04414935e68ea1cd488fd201d677b8858f3ee36ddeb2de65abbdfc47c82125ca3c3868e19872809530b0b315e21943682198628268f6632fda65937b910255f8f6225e6e437b22744f935e8965cbdf1c409cf184439642a55a63b8228e651d5f873a6198128483549c5dfce6a2c9319802889cd9de6c9f4c418cd197f30dbb6bbe56bc6ecc35bb5244155a7af11569d1f8a2384f5bea9a7273933c6c300c70ed371438cec4341d664f83ca73794326330830fe573f78dfb49b50681197b28ee5fe7cc9c348833d1433945bf7dbbec7a943b0fc54beb9359ba83669933f0508cd1621b73a4a6fcdc51987187d2c6bccb24e97dd1e9d6a1c38401861466d8a1287b1e459fa7a30c9384197528977825c6b2fe736539830e7d57cbb7ad5797ef6739d527cdc6d767cca160926c7529499ceb7228eca937514de7a77e4f1c0aea4e9dd0b1a3702867faccd060c2b8ceff8682eedef948ede4d1366e289624266192ec9441c9771b8a27c99cd63f099dc498c486929843998c41491f4c50b206bd744f3ce32a2b4ee684ce655a94eca24d33d450bed550e11a4ec7cc6d461a0a6fbf3b9b9352f39d040da5127556fb71b6e47e86827033a504dfec5b159e3da6eb3c9920cc2843316d65ce24a753f3277e0e10cc2043b1fb4daa53b2c4e9aa9b30630c0569efa13a7ca893b37e314c0e038227a38c11dc156688a134a3325f85b2350c852b4ff2a9d1294d9ebd0b33c0502a7dc2ba5ea8236c64d88e1c384050460e1b367c30e30be518353db6194d46d1d34a00c60c2f14f3e4b09d265fa26146178a9a4a6eab2c69c4076770a128ee99b93dfe6671d1164a4a6cebf67ef213b6b419d8b09136034c2d94c3d7c93449bf6f382533b2509ecddd246494787e262c943c6cd6923ad3952466c6154a4aaa6f19e1693cc7a030fe86056cd8b8f5c20c2b14db2431c6bd8ea6d32a1b366cd8286347193b4e0c33aa502a41ce6c6611e223752a9447f676c678625b7a69c614ca1e35a9fa2094895fea19522806fbad309de37fe734230a45d15f32a6d3ba0d6ea51b6640a19c5e4f3ed964d0bc570e339e500c9ede66afb14ac78d0e339c50103fd1b67ff2f3b4c7c38c2694ae24dd59d2c6a463989950743d1535f9194b287a8bb412a6844e25bd3394508cd53af9d4b7c74c910b6146128a63e26ae917ff9acbcc404239dffd5a77d53a661ca1a47feea478fc869a6618a11c45458c18ef0c6afe34cc284239e899cd9837b7cabf4428b569505a4d7c1b3ddd104a7632e25273cfe8ab6608e1b1f02cfed95714cc0842c96e469798b0287bda108f1ef7b3fc576063329bf016b9a25c55a2c53fc9373ad48ad24893e37326692a25ac289d86ce37e9319f4eb28a72127349d283125514beaac432bd67224d45f14cf24e13a496e70e2a4a621c25d4ef5dc4748a9290a14a33f535d5c614c58e61837e6ad2f1538a924a71bff41f211b5214839263ed97d267a38fa21cac043f31cd248a92091ee7a774a1287bd41825e62741890e1405fde1a4ccf0ddf758fa44f9df4cfd4c30b9664b9e28979716bd49de5852963a511693af24399512577b4e9453eca3994955a2279b2898f79e28ea1f279568a21472f3bfdb9fcedcc944498f6dccfe2ab2b68389e2c6cd922ba749b87e89621459a7cb4bfab0b1250a4ace79e368eb521757a21c45a7e7a049cc268952a22064ba66a798b0ab4ea2fc9f648f1d5ab3367d49143d98b8fcaeb00bef235150d2a62c49e9d5f2d443a224c778b86c9349eaa44794fc575c47937097be23ca2b0d35a2b4593c6b6bae919ec3886292c4dd860d4a4f7d165132254a0ee2454594744e42c4f632cdd58928899365aaf9d7e5494494f4427da76692ebc14394d3f548d7fa5192b4210ea23149635d21cabd795428cf224294a4ff2ed973b6ca68a14114935ce254e992204a9f53578c8cf9ac3c8128d9898ea1d5014479c37ad8be0b1952f387f2da8bfeb4d7b8931f8a7baffa3978c934bd0fe560325737f6aba8f9509ed12156657e3bed3d14467c6ceec87a285ee72f4963f2502c733d7963dc27c9c543517409574a74391dd73b9452d684bb139460b2daa15cd6a361f427fba8d6a12035a950fa94ecfd291d4a26ed4dbe8eb9c3a67328c8e8bb1bd38feea71cca733752fd4445451987b2c6cc247c1e371d4b3894ccb46709d1a12b63f2866256cd2f3fbd9e24b9c40dc597fb929d64491b0a6e1d47c7f6d6632c614331e75462c62a75315bb286c206d192736cfecb54a286f226b983a7ec2739494a4349941d93664e95ce263420d683b65f093a43e1bd6c2d359f60d28919cae6d7395896f2503a6528a60cf6a2171f83c790a1a0eec19414f2338672c84e93db6ebb49fc88a15c1b4e0a13e361289624d2640a4d993f05437937484bd1d993dcfc4251e4f9893a99d5217aa1e81a53a88d3fcf77174aef26bcff3478588f0ba5cd2735cca7b773eb6ca19ce4e43642e9f6a494b4501e938f63a24be65016caa5744e63528f8592ced1b46444572876c8a456bde239e958a198c474996dea2a146f34e89eaa351331158adb260999f57bd4be532828d12b69732a613469a450a957a62e4d140aa3b367cf2cf2a73c0385929b8c4f334fadf97f42a9355544ba4e282713ce45e7b609c5d19339ec772694f74e923ab32651ed5e42b1e664efe910b2474a28e7206d473f34e89984921246a7eec76e002414fb938e9ece2e3446dd0047287a7abdbfea5b09a21bc00825d135e2a9e4f4a2e4dc004528de9cf0d43a7682dedc00442887e87ca2dae8ca1873030ca11cf2ef5c6b7321144bb47cd3a82686681e8462676735499780501e93a493e48df1bd04fda0b472a269e4952447890f0adabc2feb4fc6ec9b1e94ee76bc84d00dc08372ce49addecfbb286da58e1cb941775417a5d9d938537332599b8bd2c9a83d7ea684a971518c213a5cf7247d96dea2682d6a26638c6610daa25423df9f732afb935a94c64c4e623ce95346af6951ce9a5235496faac659946c6328eb68a2b242b2286c52951ffba64d2716c5dc1b3f1d16c99bd192e42c79454912472649c8c715254d82afe674e399f556944ddea6ed68a14189ac28b6664ca6364d56935b457945bf573fa78af2d97b6810ea647b2d15a53cd96bff0c1505257b8941d74cd966a72889274f2343f4de5b6c8a9224bc7cdf2c2e45498c36b625a62db97d52ac27a6f2478a4651f053a28cb4b25282125194840899ec3a4928ca96b22577fd89301d5094ef73b4b97ff5fdce270a2733e92c3997bcc73d512a0f1e3dc37a3ba83b5132396613ca7f3d35cd8962ccaf4910bd375192574c4fe45c29d36aa224eb34c9bd25e6bacd44496e505249b362a224877acdcfa27c747a898249ad4ced413f8f698992aca74ee913f3d2042b513ccf20336692a544b1d294a861fae4fcb69328264def26f8b692288937d57c62fdc64e8a44c984c96f2fa9e3dd43a26882522748d3719432794449f8139330233e679738a218c2d232a376d56e1a51bc92ba834c9ec457c388c22641750ad55e52348b28a7339367cc047d32ae88e226316679cf5f4a9613510af56ca1d664dbc88828650c9b6d5d279b141fa2dceefa1a64a852256b8872509ff35c2a64b85b88825222df74cc11a29c74c79c4e94f8fd980ea2e4a9635ccdc3ff6a2a88d2e69d8d2bff512fd340143f94cc3193a58028f5a769d73229642bfd43c9fb4778d0941e44c90f4593e4a4db348792d5d487d28a658c72b1f736e1c349ccd92483feeca1247fc3bdf39cf8baeba11c3679125eb26426c94331c7278d26f7444e1a0fc51cd55a334cd264f51dcad6f7679da9c327613b9474d824e5e23a94cafaf446e8b28f6dd2a19ce4f5ccb9640e25f931c73cf76f992a8792925784953051c4198792895194defd9b8f251c4adbeff97b931ce7bfa1d8dd49dfc2e25ae48672cadc9c3d8913426f4379636a320d1b4aa7c78672dcf7cc145b2bb3ada19cdad7fdb3bfe6ad520de5642e9fba3587330d05254c4efaf3848652bc89d33aff0cc55a9357547f3394a44e624b3c3779e449194a6362333e98307192a1b07e32eb7335867259c78cbe510cc592f36d7c9f6dd68d6128e528d3e4299329d322184aa2a9fdd126ff85d288f153ad4e7259e685623065b2cdd7db4f855d2899d4ac9a31f8eca6900be51e31dbad915a25690b252508dd313dc6cb3569a164da6676d5a794260b056542ffc328792e3f160aaa45c70fea5fa138fa69627fb6aa0c59a1f4eda13d66922b40150ada4e28117b236b4fae0054285d9d6538b9f3c4247305984239b78832f1b09e74bf0248a1b81a93123d65652fbf0244a16027ba5a8913b14c5f01a0905ec9245949f13da1e85d7f6adf24d7789e134a3a6aca333daf09c59cb64a56371335c6634259cc049d4fec364185b784f2c7de6efd3ba9de3a251493ccbd7c9ce95aeb92503aa93d3b2aa2f74c48285f89dfdde613dbf4472899a84d4a091ba124092b42680ef38c7d114aa333287ff536b9132214d673d0e727b4b41b4271e63a85121a64de8450f6145dcdd0ef679920944c885127e37c7213209424cfaf93cc949bd87f50b43cbff5cfde986b1f9476e402f4a0b8562574cc76da4f05e041797398d25e7287fdbb8b62f6f829dbac2e4a62ff89a163336412cd4531e73135fba0e1a2246bef257c778b8279c80891f7b3add9a2dcbf2a9e5e92595c568b925071fd7299a63389164513467767e5da691625e1aa41c860d2cbf8b228c7539b6f327ed2612c0a6e6e1a6b323d3e048b62998ed64daa641925af288f3c5793a41b199bbba25c7ae4ea285372e8b815a5934564ae0e266fb9ac286aa653133c5d4549c63bb72c49668eb1aaa18a925dc82813b333d6aa1aa928ab5fa60c2667bb91a91136df400d54946aa47e123f13ebede414a52ce146478f8927b6c9354c519077ebadeeb34629ca76fac39f74294296578314c53d1326ddc9d91aa32898e611d5a5d54b0ede8d1c3b5214e57e519f557227a16e620b4531096b734aa8ab031405ab5397edff189d4f94e594feda3aa13e28afce13258d9b6f6d7ed489b2896b12312a270a6b9b971a9b28e8923f2625b5a78982c71276931244978a3b13e5b5133a268aebdba14b7e32eda7bd444128d51276347b26936389e2f2daa44c763a753976908195383b36b7e2acc6dd5cad41897296eec925a394dd1506196264a00c0ae8d0614030021b36ca38366c98166a4ca2fcead9e2f356e5e9ba919248062c60011d8606366c885c0d4914937cf3fdf66b844d8c8d44b9dec4d6a61df38db1940e89c27e12f4fb86529d46461f51f26a0dd1e056ba230aa37474f4a0d11136c7408d4694c4d374d99e4aae12736a30a2bc25d32b2f4f4e927ce24594f23bc92063776da855a4063868b0a335504311c5d178426b4ed3afe11c615bbd449464f7edb9fe16edf119612b634488810387880b72888810a0c6218a2d4277d0a937a92f060e1c78801a864063dca0c118329851a310491f3b9b4e47182f9203870819460c3325846396b5ea629daab6dd1b65ad45adc3acef102365a0c6208a3946ab87114d08c208e3c6066cd81044d9a39de8ceabd6d05c076a04a29cd3c6ec6126987e3849fb400d4014c6046d2527d398bae23f9453cbab8eac8dd63947871fca9ecd624766f09373f7a158b2cd9ed2694b27a5c487d2a63ef1cc644de29624bd8762ba2aa12a2a3d943b5697144af478aae2e6a1b4e9527f74cbf9aac8821a7828bbc734e91b4e34cf1eb52b418d3b143c8f89f3b74750c30ec50f26d7dcf8a69347568752895f7d4bb9f3d4d2a17cbb29a3ab5a6627a21a7328c921831272a633c2e6722889227b326ae79c4b693a44c6c871386e8890a1a3461c0abe6dd2c7d8253894649d3c3afe83d2f1d4371466b3bfc91c952d6ad6704349fe20433d53abd1867209629292cd2cb5545f830d4517fd51f179d28a4a0c1c399255a0c61a0a3295f4a084ca516252eba8a1867209a693789eca2f29ed964186a0461a0a563229ab3aef0f2ba1a16c371fbebedf44c6f0198a2fd2cbc6b435435d997a5ea9ddaa65363ff63988a79a6b94a19847b7de598963dc1011590e4c80021fe0c005f6c9c091e8c0b7400d32943ed6dfd4cfb4e86a58c4740735c650f20e212795929310a2835e0cc513be36bbb558a81a3b0ca5f7523229939352cf493ec7e7e0410d3094434df473cfa284bf518d2f145c53e3e49d385d7ee28582ca665ca6cf5d2867197d622a15dfae5e0d2e14444bf633d3acda028efba8d4ee05e3c1581c0c0783e1601810089d6e570133130000000c1e11c5a2c17040a4ecfa1e14800455362248323222201e141a1c0dc502514010068381a1302008060542c1001010870d91ceeb0183b60f0da958c7cc9b7b236f7fb41d86af67b11a15c9ce2acfcded169c3431d8149e4397ad503dd69762f8125c89f9235084b8041eca8f95537b701e1da7ee103f8e9f95612552d2ab403d0886358cbfd9ebe5d0f84fe5d12067c6200f3cfafcddcacf713389ca5cf8e1d9345864bbe7bfb0231a5504059ccbc69f146cadc0f59373f219319ee6457b971be71467bfb12cda55ff7466eedd1437ee36bf8d1f91fb7a2b3c76b76c73081b536bd6d39d24257aa553da6b51727fdac785048b15f2961e81b7755ee4073304abb4b64a10591cbcaf386d2fe5e1b0f6e5b29da81d35ac4a856e0c44f1c12ee23c0b8dd2792efb2835940683cfd54d34b113d6abb60d6c704c154ba6482caf1c80a2c29e3102ed83bf27116f9d5986283e542ada9d31c5a371d8a6d20cce36c81e873e0fa53ae9e337c38a6f5dcc537800cf14f454e9c340a4d4edb1850ff33357622c72ddcd6e34717d5a2439b52fa6a2b3668a16a712be3da9e3b90f7739d611256ecfa3e35ee7229d471c9cddeb1fd610f0b13d7f256637508405da00ba0a1a8b94bd8bdf81abc5d6ea4fe4598e3eb937f2f671f0eee71cb673ed8ac02b7b06937d3cf299dbaea5c7f05ee7456aacb951260856e5a391934c615dfd1eccebe2ceddef37f24372436f85c7ee96dfcc0f5bda47aae9ff54b44f6442e61099fde6170447a4616d7588de87d67a0386b59fbcac66634277c4cf8e2fc26af4594083ed6f41744339adcfe72ced612eb7a120b6f83297387ebbd4da0dabb8aa6e16909d3293f58b4087fdd3de7a2c9f745b15a83852c4a0a0619fecd68b271a4ba1a676049aca287866b633515f4f6f09c3219fd7224deb5c4edd91b0298d13d4860764fc0da86119b3c1cde7ece5921c257ad10b4d85419be9991613f775e9ed85136445ffae8013f98162adc597b9c2e64bdaefc5a72843b7afa024ad6359f1b2607291ceae0ab876c138a502cf6e7ed475f51e2e78b87ad346650dd25db0db1bf2dce5d67b28efc4ed9d53bce7230bb62977863513472f06911aa23ae6e281054e004d6e197249264e631908d91a4e45d00a4d53991217362be109025abe4ba30c56d435df0b3faa2388d6da098a4f73a5b62f0a9b9921243a36d5fd489141ccb4e48dee490d2693860a73da8617a18182cb5c98a6b69179921c66d4cdf017b4b233152735c1bd5eeecf80a7b475ed14d5c674db354500fa9956b02f7ac5a7609e539dad86f24e06d65cc78456fdf3e3fd54db738970abd66da5cba27a2721dcac0b821319ea453b48876edf06785c1602e13335ebf63ac526627fc051fe039c367b929f1eefb688cea6340ba560104d4b9070b5d6752990f50009d3dbd228c983f3e828ec1223838e96dbe00c88ceda473061b248a203a9cdb5974358c370ac128a6102809e73ecbb4e559a921f0a9742cf95f491df2da1d0c914a61e6f1385cca9c1e441581c238432a14c40e02e5f6b6d07c1b403381b6f42c9959bf30f15d716d3c027903df69f33542e1a03fc01ffdff5c7e117e1af4e173b13038bd79cab973f106de1bad9ac19ebfa31d72c3b5884d5dd508884cfe0e5aab6117ad0b769a94af74e854f173f0e9ec1087eef239aa70bd3bef3d6155bbef8f8375865f5e8dca7083f87ed3f010b4524fbcb6c0b0e6c533e10793d73f62059a4e0e2103cd37ef99ac5f6af5a4650712e0bdf0ea33b3aed5b604089195f81b04af924bd70ab568c1fcb2befa5464f6c318606afafa22e06b4f2034fd3b16f24fc1c3df70f4fbfac7846986a68e6ce3f272dbab9c649480ddb9d41cc7db5b9eb4a73321790d5422aa980592fd0c56a6ed61fd451a1a73edeaace5d1207fe2d134e245db7604b8202ec820b83b4beff4fbc685a6d78957a840a2e22c1e8cca5860dccb6e21c3de875e1d6d8c721eeae675bd0435d6d9b5707c37e09bbf3a0072cf4489c8f70eef4d86b1e7ce038cbf7deeac1d8dc47d60365020f77fb425f2b49d79814589590936460eaf5971eaaca9e5b05d827d9408212c46b7201d631a0c9460d8ebba024a588dd61234bf909f304543f8bc2614185fe536090e7dfb9560c1f2abe64ab456e3347c7248e7f5fa61f0a56cf004563444f9235f63361b24af4fb9c329381b950507f048f9578c3598d65284cc19720945917c3e31fd4024587db8b1216dc8d51347ba650ab6b9276fa3f819f38c8349a54c238a8574cd045c7331b477fa2fae19e4041af06932dbd7ce1d0a2827e321cc4d1c78c95befb4eb064112b788daea272f8956f64a424b8f91c70292af048952877da2130161495d7c881ee174f29d870c02665baadf285e6a51028b07002309cd4560f56cf5b6c1b143f686b91493480de7d33f951b2a821589303bd4ef0c006d3757c2517914ad17a2a2804f9c592dcf2a48a058163b11b6549f599ac0993fae16c5528017539f790cabbd2c5481a0a740450e2e908602f0dc55388e36a6ece7a3a2197a0118884633c85c6a1cdd5373c97620403f41c1ae4b082dfe4fd897a6e71233506f448e3de2d1a4213cdc41f8f58cbf5f84f84ff9781addad76424645f97494ead5229df7255b3b439eebe10803e8f826a5892687920c22d2ee43c1b50ec74a91a9ca3b038a5ccc9550da52d17912acaeb224db812e12d7a95859f02a74e82482730d5e87f6453b2ab0f993e5b6a877960e207a1550a91cdcc9f77d8fd89f07231591c3acd2af735028580017200c33f262fe42e1fdf3a7631759610e7c4c93272a70c5aac6ecea9cd4044e73e4e128fa56f37d61d8d090c3d0ddb3856c3c5c826455cdb5fa33dcca5fc6f66d3a184ba656923e908a52e49eae62fa3179c8f6a331d5d72a17d58e378f2f636a6e4e0c586281d4e2cf4a7259a875006db6c6f0b9b08ebac1e4f18f4ee012d3924bb2ec31037c9e18bbb1b215890b20ea09b90c0ef9def978797c022d6e4a89420384283314484fae2db5a1002311eebae7581580c3aaccdd9e12a54e8201c6064b36faa4d174638e488894d1016b16ab949252f4dc66e3fa963f874f16c85884a455a7f11ae2b610d92f13718e6e714c9ae3943c12a00974956711b6ee88433a4011f7597871c2594b27933e3cfce290e992ead8aab9451c91a5eec2f333ba2bda912c2695147ae33ddf74d8a77eab3e2a8920549e2cdda69b366a34a6252862365a664228b636261447a810a3694b41b9640ec1715632b45202f082e4ec39922178b5249e9fa1a37f3e7b4003a2c4640f7f2d10950543a033e74ab870438b5ab4f5981485d1a6764ab81c0bb359baed382c693fe86f7fc9911d6e005f6d665b3c1e76a266f97f05ff9fa8187d3ac029e90632e06fbc30b09e302a5381f7ace808473de87d112dacd10da3cfe5b447bc53f0a348b2889239c2c113673b509f4364a6049e1fb0e0829adaa988d3435f1ce4355a030369eb9a4e0d6649377e1a46025be4d1925efc3e1f915a27d5af68d43a80f6a875161f5a197c6f19ca4cc7a76e6035c69dab18105b8a971b1346d38e863dd9bff2a7e237e7ee7dd8f432bf73889d5bf035c7bc7bf1be224ad4886674e9270b351b7be11eb3dfaf85713f297a11e8bea9af56266e6fde48e15ddba6874f33604cd5d56c7ed0485c9ca9818567e6a8e2142f54d17b7504fd6a76cb2c2988aaf3472ca9efaae11c67455b2a09fe699bcbf4cb58ae6a5b966022a000a87a635372be89e95bbdf20a9ad069c10b1f70353556405e94c316e876173b80fcc515d59e82e983092e2b4c9a852415ecee3c1fd611096ea7de54863d5a7cfe4c09188fc9c9c228871df099ed4fdb4073cf770d64eee42ee283683b30146db01ed48853c057c6d7ec718cd57201146a987d89d4b257c8ceacd60674b357986d0fc9339fda2e29f9e1b711a7c43f10335a3347fea7bb97395e825f42055e7e37130902e26e7000614a1e10ee26622011a036928c846a327a8b73840d7ea85ad199f3240716c9e1fb7609fec2ac16fc9efbdb7fc58de6f90f01db01788f72d771a560dea06554fa455fe962b1efb6c45f5d2327407d488b8bfc97e525f3777a5d2ca168ef0c597ec99019c6532632a90c0b5d70254744f63c2587740f2989f8231db67114a28e5fd6a8f2d5837bf35a4a3d09c127ee88b166dd6c63d19f96ad9091694242b2f2f557726bd8164e3f022077d6a6d8a7b9311517d77fad7740a1d1382e6df06f2eea2368c93299b0e575c43f6a34c7f094ad88385ac44786e3466058e8254cc3ca89e34397247d04154bedb72c5165334164a7073a1a328e941ac8deafd4820f370b0f57af92eff006fdb2d96c74ea40ca9beed0be624543ebed37b97e55ee6a2cdc460c0f0fdb570a2b70bb444b34336fe029c7afad3e451c4e0013678a11fa4a89dd290e34ea3775e49835cc3f45a21023ce829e352221202825869faa308420ef18430bc380d5dc10b81768d4b2ded48273232f3e78007df2ce722399cc5b96932a7f86e9277f19f664358c9e8b98d99c03301f4372af6e0841aaf7f38fbf9e3b7e5181a88a33049e88462ad7e161b5052bc01c2b5454c84298b05fb38d31aef12e2a25a4b06528d4cbacbfb0debe977288f068e31142091375d3b0ba5e7195b4562cde2a6f8510c367014db927586ebd25efafac5f57568163d976a330bd8511a73e13457f76542aaa3065c8eddbb34bff60cf72f57625a63e344d8d2e98e34629e15e77647b99f06e0d2481d7a15e242805fa4a0be46c25b66d8bf89a0da9044b8ec8c7a55ceddec8de86c047c4e5de35e0c555b08a268a23e146dd96f8da2d9ff7feb9ca87ee0b6499c46db27ca2651f57bc4024fb17168baa26099bac638ab275c73341649b819467836239174a33e0816af18104561eabc71f0cb91ae52d38c3ef880c4cf260ac895b646a7daf334bbac335a730a4ea2827b3320380555e09a32c71162a1f103220b4a85cc094993cac0390c204281d9f05bb6be0311304438dea0e65fd12e9459c7ee75469ec3247277f2db79ace6e16e44000303b2db1dc8d8443536b0a293daad189ddf60817b0d4f83dd1fe408d7caef166e2e70c6448a7a70f6937001620fe29714df9209bfd96ddc66a0056a2845fff1ef317a012ff787530a3749fa91a1eb58603335f8f7c884fb3e8bcc4d6b809b08d589d2fa6d9ae50195ce3c411084f6525d36d4d91be052de736d41f412bb97b921247e179c6fd766f2a435ea1df5277707f2d8df4574646a3e655ec16d8d53f9e98402e95c99a9ada5ff3729e41b5e0a71c216d08104ff8870e6319816aad50e28ea48722eb5bd53f02afc0e37f4f707d9012945958abcae9939344a3669150947e5eee0a6cb7d5de2fc2f0b90149beaf54a43269b97f4a74f463af67126916e5a8d2065f490cf6d68f5a014c7d4ace97e1eeca7a88457d7329f83ed4e4768782c862fe01befd002c5e2170ea9e845ac2ea57d618d7d7c883c898f000c10dd168c24551a7af9fc896ca3d8e91c44bd0e755178aa00df711604ef7b4607152086e5d033248a813401d879bdfe4063a66f458535a93079f3b91fcef560df9e209b0bb6cd15f0217c747374201d453040b843121c5ae3281cf55df69b43ab3962ce78ddf6311c829a03fb1713fc335993a50bcf6a7f0e8ecd67727551b5757942e8dfca9ba9342aab44d7a95bbe790f9010aeae9a00d081ad8f65cac164abc3e28bec5554beb9cdf30ed811312e87c87a83bc3e347481a9ab5a9b58d79e635f6be43c2b1dad488bc2e7398dd3a585956e77d1011113cf3e14ede83ec7f90948cbe2eacfc7485b8d1675e4038aaa119265e50d539865857ceaa1374c0099c1f693380ea949434fa8efe98fcd868e2a79391b59621eeec353d5bef10323e36732896c5c53c3175aa0adbd54348cbb12a418f95472d840165cbe9208ca1c1185932e94fb236df8938f9a466f8476e4db9486b455b9cf9b8747cbe95892db51b756677d05e3113e6e35e134d6bc91717bca4023169e38c61e72b03fde1f20f0e7194984fa795427c9d6067a44f92b1782628af16cc23b3078ee151827dcb993167c33dae2700de2d2482a3382e691845a83c03d1d26b61887182302699cd7507e08e02d7546d037029d5242846df9189470e1b27ecb452ac9995bc6cd47ca8b7551b181aeef2028e7246ac824ae885b3328ad0c6b0e736d193bb31f84efacf94ee204b2c131187095e0386db81e2795d35375addda35154f1d325901b1423696d4a8d520cb1cf9aa15e3d71736103d4f51d52ec18cf2f201ad1fb744e95ee62100e1a275e475fc7fb2c4bec5a118624495a04da7840d20b21eba06f82b664ab5a3719f948ca42ab54b504d47fd6e444ac56042295f04e7adeb6c8efa111f834b9d2841b01f987db3cf33097d781248a1d41db338b36a6c3b7c53d0ef2145bcf971067babfb1e87c66a507111c50ec10dc18e02542334b5d37482eae1e60faf1777ff362ff9f360e71bb0609d689608d4269fded4a9570f9e0bd47c0313b9f50a61cef3320bef4041a86a4e5328efae1dc01908fee9577b31476049e3d64c911ac1cc6585a6a004b43fe55220c220a7f1817b3c45b25e1047e15f5f172aa25c6e8a5eda317d081dc46aebab6879197cb0d17de455f0e3825d241355d8a3203cef71da1794d7d1ba9d9e7f01a07684e912d4531ad25f1fd3b3282fd83780bfc8582219d49a192868b7b039bea393930261c05201bf5a108c0eeb040260749f7f48564abe8f25c4d1c1d1d074063d3aa6d802ef25554103f762791a058f8378d7304426f67fd163245c461149e342a75005cd74888322ff95f65d86524048bcf0ab2279f139ee1b60e04070a0e980eb4b2026a497cdb56761e12304ec3c54c596443fa09154f93336cae3243c86828ffead6fac55740fa969a3537b331e366ca6ce61842ca01e9c1398d89f1357ee3698c9e26bf527ee180eb63e47066e9536b927c5476449716e81cfc0a0ef40c9749255e04351b40ca444abcf898b00b47234b374b03f20be28730c1528b4da9132ed4dce67f1086c97c37b721de2cae48a9b7ad6bdef97f4ca1da82ba75e8b3ef670c29ab280d7212dca3a7ba71024fa860af0b63849b193957d8b474348020ae5e170c8086d2f01e60d0258bfd8df896782587bcf037997ad13d838022fa0e2924bbbfd8f107bb0470086b9b3e0387ab339bd0eca6ede9501714496d542988a8944971d1ef40f26205faa25d4c8a41a52716748018380106bf3820e9dcb9bb6b81fc76e20db5a14f5f5ab5f3a93f4386e04ecee166acf2e2e64bc8d698dd0c6251c6dbe4081c3e6eeeee2ed3dbcf8d17d81b850c69130aa6b075bd5ebc6663c07b587d22fc637e7421573040e553003ab4521a37f340aa1bb379643cd9ace3cef498139eb4240fca4a80cb06d063935d72c43e2f85ea9fa750cf30981c0d9f2c0957bb8b28de3af8b85b64ac2470142c8da8b56ee2a3c7d4eec8d8edb09a83a3fe49c7fd5c94ae98f9d3e7b19bc49865add822d4181173c54d5d61a3822f617f56166eb40bff8bea1880f10c0a23f6acdffcb8fc8f4d4a364a540277ae9cf9c7e050e27ece8cebdacfeee3635be653f08f05de718d526c3c4dac7339da992653fe70dc9307ebaef45a811f2692917f14a71efe2f0171192a551fdfe5af7e52be1059635e2864172577475d93a3c7b0a93607454dd164adbe0c5e4b56bfaace26c3aaea9b4f4dcb6eb076a6d94c52aba6722e963631e02292473699e6e2936a0f50aac52e85e4056dbac5848317cfe10438c83ad3bc931de55086bac504317ae96ca4230df4953ac21ec1043282ec8651e86fd04fcc286b16d6a529c7cd07520fdbf82da92148de0374b45971beb3f4ae5f686578b5a1238356492ecee406f0f07f287270ff4c96d61365d701daf4bdc6d55c92c5f67435682406cb141873c4fa53754f538c3f7ada1cff1913388aba730a85a092dface7b822d0aaf66263e4cdc785a239f45ddb9670823f68f783a40ae316b2bf481abd78ad029884cd2956d8609b823813d4773004753110d2b06d6e184f7fa84c33ce2bed0d8bc2aef528357eb7894ac74409fda5dbce8bc645060e6d46d1edd1963ed0226d99bb2d636f8c806b160ad43d81477effc531753aa7ad188f33d0737038e8280e909e60c347284e1bc8cb22acf9720ea77692d0c1e32486424bb319dce771370da5400d0992dea6b4eeb3a0be500b218bd77b2d029cfb6f3f98cb5637c90e6706311869cad19e39699808498ceb28b4e3d073604d2a9b7f2f779e40e45d1cb802953f7ad3f91c10428c99867f761a9848ae9b058187b0363e0342b8690e1049aa0b1fc7930faaa6c339a2892cd85744d8ef856211bf888223f9f588d4e3a1539b62f86386e31514587522876e89b78b361a3d740461408030b5daa5046f4f25e9422c1177ffebb2cc8c1793d327dab6baa7f56acd2d4989b339aab691df0c03c8e4efeba22a989a4306b618e4a05ab6d9f4fc01b9939b28d6a9de40c7b66d403ced2f938a1e6fdd29d7b3e65a4562534d6af59cde64e2c197f86351f395fe222c5d2eb14dea6d97e34c00b414345a80f0c7874f750c50590ad92216ba021ac6c3bb16b207b4e79b7c8d8610713b3414d4dc3736b59071b769d5985488be9a474c36a0ba37b44f669e31639412a8f623b394197a381b27fb82b0b351cfd6a4f9c78ebdbc666faa7cbbc0d9de8d79bd6fd8425dc42863cd790b7c1af9c1af89949f3af6bd3e05e110848191be6bf147984819fa2b0e8b5ca2d5237be214e106817d70b49831b317f938db06a486cae8bf6f3227fdb4fe1ec01c1bd45aa82246c0a556a84859ae624b33ec3fe6d02526b80da74768c31ca12813dcfe00d659177f595dbdfdf2007a40c691c4bd5de418d737af0c429022ec554463d91736796bd45f771378e2aca120473872092819620a4ae067e8324181f84b2c7f8586c37e8c8399927372656e0bcfebf6da332ca437090f8ce21ea1121e385a88a78638aefea3f5b454446271b7744e95d2ba90b0341f69f5edd9b678332e2504a7e8c83990f23bdd3af6f78a8beb51c2cbed1f523d4f2e893e14c206bd24e0cac562c98358d82162d40fcd4311475458f81b3db6d37dd39863286a6b60e58749257a609131ce984493a62ae8e4b73a8418ca819a1237e79b0ca79a63fdf90695613c2c6209ce8dc9083ac7f3928d7833c66a3e2accdc95dc978ce05c004fce9ff040e649e145b1bd240d94e9f0b9f237de5e177d4381427a16af99803001b54fc68e3cec67806e85e21e29072624143a638a7f97f7d938021553ed4d7294e1eb0d46b74762cb0cb6e22616c4d1847ac84930c7dcc96d2036bf3413d1b2d10cece8aa5933ef6b6399ad423e30dbbc11ea23316d1a6c564de25f23e5bd33f478e6cd45832ad001ca4390c25b272cf69b33c4bdec4428526c8091f41e9c67c8b8f39156a8feb44770bc4db29814d35d01f8106f3b039c7e96603bf78d5f569f33da3fc3b36ede1bbd590aec489c798ac17bd5e92d95c7315e68eb2047b5b0e0e2c622610b1d95db2128af85d3f131c6016218df72f65cb1414759be95635bb51dc0f52a87cc7767c2b2c66b39e9617ea234799ca48398e404739cfe5f5923136ac781e4d80395f2335ec5e211be47fa8acf0a683e2cc4c09f2494f13582289794b8f288c77704f2a22aa8f62b616d4ef90713cff64085f0a4f99f1c4d4fbb48891a880c3e9a71ad1203523cba1417b74a7064b5e5f32eb674358a86f2b19d1e04e500ecc29c790d6d2f1f986ead5801585a046241a7825a18e59a6afd9aa7218502075cab3f6f40e32e4251c4d8e15633ace6ea6275e9cb6d951a95e80d13992caf2cf47e16fc8a843680ffcd8ffa83cc3549d9e67d6572ba16895490b39ff0d7a0cff72d257d2f57d6d8b50822f81d8f7f62cd9605114f6c8213e744dc3b263d5222cc4858748377d7e5de63bcbde0aa514ae1c404de514879e4baa97f137f27fcb900417d649814e793b7a25b7ddcd195d8acf755c7a1c34f8f37d6b808a80771403099aee89b900947700831e3e2612aaa568425b60a2de9705666a40c5f6645b6f517094e4265e38ee14a406e12c05366f673f5b830c637c9d85215d466637290fff2f26790e67e4ad78cf9fb8ee7c4c1a47d2f7646b7a12a56881e5e8c02340a24365466545f11100454f01e8c1e700afbe369b6f858271a88faed938995183cc9b9e7adf912ff558e70ab51b25f2d7f2291bf2660fdcb22a2094eb5fee28442d172b0895b5135e968779ddfe1f8ee96db756bc8be0002c4d6cb241e830075cc4486e910a8250e1c2969ae5ad8dd26e9a716806ae75d4044fd11726915524852968515e655b3fde19becb6c61ba7e765f75a6fb2660053ee8a9b1f0154bb4c80b853812968c3193f435599f72144d3c154a7c8e391853abfdfb23e0754ac9bad1152583ad60554e411da75709c6f5aa31a889b29def752a3b0e53a4ba87d05b6d2656910ccc3f1e318d0317a947e996c6fb9fb3c110b3db3fe96c392b74014ae229a38c84e3c474829a11b5dfca18e440300ccc54225cd7892b6780aa6797e6053904f7f956a47810a09eb95176b6a221b62649ab8f2f9c36943804505b6c950ee54fc53df370348270d2450c8ada752813cc9865c5b1bd298fc573cb5414c4d42464dc9ffe16d0359b0d8421fc1c3dbbdc9d4b4f023700a8bd90a11d75c63522d451c221fe997026f866ff204669459486fd59711be360686684bd53210ae26f19c7795a2c1db60978bb807733d54e72e751d2993078e4a621da4ae87bd74840afbd687627c3ef06694ed426bfc4728f6e3632b1e1828dea82b8d71ad6731d007553425040736be681878d930a0e23072ec3004a45d04463b45447c14c2ed5a67868095acc0e30e81a0eab2dc5d3a4b9844189c75ac13e31f8b62ba193f7c55183080dd02aec938e246b7382ba323cedf84cb09c3d6846c19b04f4282817d92b19137130138073f00f54114589aca2590660aab639272ad26c2238a53d088a62a3689228374e27edea72863845dfc4f07d2d66c6f0ec2bfae2ac56b421e10f01ba7237eb3f7558566809f01d0d2ada6fd15a53e5dff57d0596ca2b1c8ff5b79070e203327d728ed6a4c39cd23f8937a0c5c275ee33f1464e39c8bb217b5017207f8a4cc064dcf113467d7009422f8c65343969d00364a86f3a43907deceb3215706cca585d136dc9e96436a58cf62bb68a03b36930caea219b99f2d17bdd8b3c7578348dfdb845b8582f72559b002c07183387cd1d5c6ff9ac044091544d62af22924cc6925b7400a39e26496baaf94fefe35c5ab05ed1c15bd10a0351b382730256066b53a69485a3f9f4fe3df691392a41a6428658d920d977fd414b16acdea9daf44a442269849ed7bf465a812ae7fcd30497bbf11e111451df6d5669e3b227880ba73492793186bc0dc1498de62c3a92d58fe747c743112d8ef4749688c01257e0e6cd7aeef76e0935a12493b6fcb31a5ae10912a1ef5243382372646766822ecbc88a09017106c02acf21f2be76168b93cae111fd75c2e1af037778d033352ff49ddba3450057c1679c2a152af1d5761efd1e2100ffb9f92194097ed62212756bb05b946a44abca29ce7023cc8b9ab098340667ee13a3d74871cea33d3ce4bdd8bd6d3b08ec103b8259e3c7f6c9f3a1e533dfdf228195ea6e6648dd97d06a5fe3c5b19a55573825e1e62fafe4ff06841c7491025591ddea985d2a070c97218876d176225cd90e64ff626c76a5b9da2ace489ea0c63d43c9ce66f1a546619183ea9b68b95f5c0dabba0df0c883a642e1d80fbe746f1870d74d4197428ca3105c4417fae4934739c670ccc717095ad728ac32c1b5b2cf56f48d87a9d7d22a2f31b22d74940a22a444d799ea0e369ea3a783341354dc0741a7c10cc2c0ae964917b50475426b22be8fb50b5b8243669dfd8a7647b4d0f5efc423f729cec2c3a9a40faa361025d8943a03f7a12f01d4ab47546594e38ec118f15f52a25ca300bf40ec1cbf356f3c0f237d85cb74129ea2743798ed0b89802dcfb6faeab7d94f34894808a63cd938267c62d3ed08359bcabadea0c7187accdee73d6325f1a21001a974eb97fea3de0b5428109e2f388f66e371154977da3a97b21427d6965e9a5b5781b498df31ef7d1d7e0ce1b5edfb0ef7739b9fb5e329138eeb7c71f7c91485c3ac5d29b3a4d89f4a3ee6eba52871949a72a770768f90b3705e2b576c84be8f58b71256bbec8c36765e3bef8721342001827ff6274db9c2962d1e3f0d903d4d30bac2877fcb382368b0dbd8641a5a608657e24c7c563fc879640ed9eb2d72490692cdce6e16c1772d02060356b70d83890ca9adcce344ba1fcc4cd894d92b3702ac9069abcba3975bf72b550e75654aa1a20d230e8e9d0cc5303dac986f37edbb87f084ada1f5a71d9b319c4856d37f7c1e0dc2e3d0d9410e46a1d5bae34640b987954e3b78abe945add6af8620855d3257a9a432eb3acf7fcb0986c37cba21e0ce11904a53c9f0a48f22cf13862eed84bdc656582979fb999800bfc16b871c075510f570211a61cd1f7497324acb3912ad4d6ba8a4511d2907c10aff561aca221ee3d3bfeaba2c6973340253c53936c127cb82dd3b5aa3dbbb2e1efcaf8df6260fdbd1f47031779a332950285d7403c00eb9df637b9751c741350b5197258152f799496db21625da72da9f65fbcca64608c385ce27d8d3cde0935841d5e91f9e8322eb68525c97705c506e0e43ae58d85bef9fe274495d0b1ef7e8094f262c070b63da8499d335b2954b715811e0dc01a6dbaedc38e4bcecacc4184e50958367fd2cb02ca0e3781297f29fb2f2312ae90ea32d078982af88501fe9884c3c651e24e128224016cf090cfbc010e5057409859d1ab78aa66215cefa34a44797283bb91aa2641aa96d9a4a67c849555517d0bdc201ff583e40047217b2037d8232ef8cc51075dc9c68067c3eb74044d797fe249fb81bbf9a51d320dd7170e78bd6ba395635bcc5c9eaf3e52760ea22e108634d506c01ce53aaec990341b2c64d05277cfb9ca2343bb8d997f6732e223df46aacc6ca89811c8c297d99f4daa2252ee270afde22ea4eaf3d09afe84b52f680fdfffa89fc0bc6ae22fcf0a490164e8a2466328eac54bc66145265c5ce73e87d885f502813889d21670a40316d762a7c44b754a585ced616f6b4d94773bf6b4fb13c040655121a8588a1956291e086cc5a2e58c16480e6cd59c3ffdde6be514186ed38a2b2152cc225b16feaa18f9dd7b3ad0ffd18a6842e1e55a432dd8c1e285e21d523ece81f28fa7bffb802ebc2508622060d4ee03eee3793ab057e7dd8aa30ea840026b5bcf2fd9ba42234f09df387948c0b3a65522b69fffea30eb4db4c52b321f1bb810c3fa47105f2c29982db9327744cb73bd6b1bf3df921a75152412472ad7fbd5ac0346fad24a97c44e9ad12f0e61c77e2461b8a00caab08fac139821b10d2e7dd1988371191d2f3a1c40fadff601764bdea66005ae7e70ab06d1949d3493631923e1a660a2d8a9ce4c4bea16e0882d46f768a06d43f7f01701bdf66bfd180a500925f17678aeb6ec65b7b04d6301621a856ed4009ee351234076c8eecad9035983caeeb72e1057d19c5cc06300ab4522c2461f74a053bf8bb7bfe34d78a91f59f051763d0c31b748d9aa4f1b7ee1deb6368eeb4404693f3dace8ea7b219df9fcd025f8394d29b9ae2b0eaae27e6924ab9692e2b460bd73faccd5a90ee1f06576da9457ffede068034b8d97a22b1f0f417ad3d162c8569e0e15d4bb2118a2ceaa70e479c30704058587563d23f2c1fcd657683b799bd4bdc8b71d5ddeae85eea229ff9f8f43aec8b52595893fb845d8151f01d89cb9aafe70454aecdf1625e6518e2e411da9f83e416e452cd3395e7ed5c272529230652de883317f9ca9d0b40dbb376070d9e64a07d696593c709c10a631a685abab79c11c6af3e98d4b69555a574634dd93d2ffac17af48cddb6a93ae3b78b826c091654e527a3aa420046f7f0f782c5b8932bacc7c83d4910871d3eb1f7b6722546e457212de5c1d4b0215fa976012a4d15dd5d526e25c12e62c2365174670a58d69e862c217809b37909384400a1e04883fa9654e98940ba021a0d89da81ae7a691a9ab0ef1a0fcac6b0cf2ba2588a7cd0dc5407d0906b31049f0101992d5301c270b4a4edf4bd5fc1a53accca840d6c844c756c0f5e06296db9efa2793eca992d08573e223bfc3da28c48342daadfc26bcfdb51c189dbc0cd0e9805db1e8d9e86b29cf318b10092ee0c28691e1d33779d8de998c70a51913ecbe7d28a73ceb90bfe0f52353cea5c2a27c2be85e5e95390f3e6c0e414ab06f0a0173ae293e1343508e567e82333c2b06abc42208172fc933d449825d1ff3c78a60cc50fba0b77ed02b20eda58fed9d8f9bdc2b3e92d944d3baea3ac6f944ec72338a5179ce3a062f57b6911a43fa7a2cdf037293bafe979cd37926e0cb50796b3b93239d8e0a559307ea2967dd5fd51cbf27f9a41ec8b2b7c13273e1a513bca3bcdd54d202290026f73a8563bdaf862d1197e7636fc4d20a1c944ddb5e45c9735d8485e9c9bd34db5b7111e6e7fe6fa5ab00b01b6bbb913d33696abc470709a1d5fed05c30ef0a64b02b90b04cafc567aa78cbfa8e4293b7228c13eacb2fab0d42ef20400fedc2ba925cd75917dd9166345c8bb55a9b1a550f632005d16ca4566385bc1474022c9ecb72cfa98cf2f5a6ff212e9860a214384c4f2a571e32c7a0ce70e00eb70cfc987850c6beb738b346a7861860daf0e8de2af0f502278d18a053277ae927ab3ab0c27f8c905358bb67e934de5dcf600250ce71440db666fff9027f8a99dca8c377d28e176309e830bd73f9b5ce21d03d3b16153c43d23fa2deb16ca0493b52ca1bc3c29c4c901be20f8166a400fc3c67a4adf4621fd0e6cc0a9a24561019f2d86fb2398c82d1b611434c7256a91b2a2e7859d62f9aca4530d628657b4b537fe658beb139ff48a8a0487b0c204ad32caf9b0021d70e35ceccf0033e5a12702e401bfe72690d8f2cc88656ab564acdf316350e6517e28575baecca0fe06a194db92959ba8b3608495381a374281ce639165b0c3367316c1483f83dda3c91cfce49e077d7a73643162a01a7c180213705771d2042116b44fbc9224f273d2ea965e11d4e9222a9c0383dcaf9a65f6c8e4d20e27913a26ed3f24d104570e06cd8505338d816600606117714b3d302f201410c1cb07c72ca6628f5d5bde581b81362c16006609e2108ae5550ad41fa845f1ea440d107b86287ea034a200bd582e673abaad7792d8a33c67b272497034496a610ac572b545e2fce420418bc313cad9d371801e6d3302fe2b960a4b50bc6248030705c6cc10e61957e2658b33a05fa427a53920d329020f80c8485c2a222bbe262d60bd8572eeeeff4d08c8d24d941b4abe07acb7ad0d4b589019aac2e6e3340b2a4d001ffffffffffffffffbf676d6bbfb5c6fcd6ec96524af30328429494524a29a5a4b8a6b15d60df4b08e14038edb684c506a906ba06b9c2285bfdf6c7f8d647304aa783797b953c514fbb234702a3d421c429398d473749fa8ba2a6d34ef2a29f9be5872f8a225e44baaf66fbccbd28b88777a41e38122f4a23dfe3e5bab929d9d945d1a477926af23f8c34a10f5d147c4b09c2e3bf7f52ca454965f8941f446e3e59db7ce0a26442d4b445e3e4697a8bb257a6923ea8ff1fb628c854319ea4a5343e6a51eed6f4f4f77a1b21438b6226335dafa53ca9d2d8e0631645134dc9fee9a3a3cbc2b153adf9dad192354f4df1f4c1b23f459618ed2a7cc4a23c7235492ea27450d2e40316053d429a94e1bdca947ec68c193366cc28247cbca2b496e15409d70aedb72bca5f16c233efff95f0d5604b3b528d1d98fde1a31565c70d5593f5e3c60a2b3e631e8f7f23d76063d35514ff3a4f4e95932a8aef993a8968effedff53e52717d8c9c6c08cd2427a651519053ff2a6efb3dcafc3845d95de63635d40f539474b98ff877de125b2c8533fb629eeb5633afb9a74d7bfcbaf6831425b3136d5aab641485dd2ed3535d97c924114549b4da983cbf9bd021f3118a62a9d9bf1294a474ecf80728fc16b15dcbbb0ed330f524e4e9096a461f9f286812a2f3e77cf244b1bf4ec6f73a4143559d286ce91f9d4a2e5d721471a2603adab98cd22f513e9b28a66de6db8e93515654187c68a2f0b1b3ab8e3cc944314c5092ba270f5713260a9a844debe1b34fde98bdc2c7258aa94c8e266752927c4d6289b269160d23b223e30452f8a8443937b3353dd6c85a1947ba6127820f4a94ed547df82c41763cd90d3e2651107eea843e9d69524c3d6cd0e8018edf9103d1246166ab979785e7d6ed5bdc759566ff7692f3231245d1102522336692fe46ebc183841ef8800473fa99775afa5561b1a2cd949520ff7844413c078fd3b1f9704449332839f9a54965938d289dcecb1a554af8dd981145d724d7e2715d4431bcd342f5e6fca4cd1d3d747c28a2a434f4e453a77d24a258fed1b2dc73473ce80311c5e0494c8e38253150b9f130384c7c1ca220fab3cea63cb13a35ce8e4f3c689c01e3c31025e944efd2d8c956c6d2a1838c42947492848c9e9f43e30e0e1f8428b7c90cbd3109da736910c5188366d3bc719eb3e94310259156194adce0a3b9f411887298e69029179bbb7740943d99c72ca6c92b2307bd9ff8f843d9e2b387183d6b3aab7e289676924b49e2892b13d6602b230734d26050828bc4471fca9b53b6f96f98a952f2a12093983be98b103d8a8192e6f8d8433978d9c6691ef9d9a60f3d14bb6f35ef468f38d1b0cbc1471e8a5b5b628796f7dedbf1503a51e5eaf5e324e9b11d9b7cdca1f0722a633d3b943fc8cf2a418535d87a24e9068d1b9f7af0501303870daf43c963bfa89da82c39e8d0a1a4a59bcab5ce56e33d878299ba97176b2b9d5f39947df53453dbe8d3d61026c71c4acbf8018762b5ff86b7ffea92794349f0506f3283549f4d224307e9c9d041f97043490c9373f4a9d3db500ee2351f9a4fee095216381bcab6d1949acd9fc24cad8f3594ba7274a88d496c7ca8a1a4258557dda7e7127bf4c1471aca25c727a93a764eaaab207ca0a1204fd09ad5a492f1dd46010d68d4e0e30cc5b86e62752ec9447dd38dff3043f94cf4cc75fca0a7c4f9838f32945a4b927683f0126f43217c9001031f632888cdfee0a3745b5589184a97a2664f34f5dc563fc2503aa979358c3c494cfe0043f1fc6d3fe5e78fa6bb2f944f297555ffa164da89170a32cf976ac925bededa8572c8db5cdc7a69f4f2830b05793b76a176429a10e3f0b185e2a6b59feca673ec92a385528552d1374da29f3012e1230be55c5d6252a61493931c19e807168a31b74f7bea4f557732c6c7154a27c88a8c2777d2f56e8546755dedbac3735c3b44e793ec6b94b4f0518572d686af7536f94d4c3fa850de98df7932c5c87b2b7d4ca178f2f4689a29c9d4a9353ea450902607fded908af11105ad3ef3e445764d3537fcd6dd91c41023c78dfb8042c13f6e34f4ab9bd89a84c386d9197c3cc1b87b97aff754cb523be9a75ebe26fa704249c77f38a52789b492e94713cae1a47be63bfdaf226f010f323e98907c1aeb7361327e624bd04ade75dd18c7871212ff4d574f549e52c74712743dddf8fcae2a5777cfcedf7d1ffe49b012eac183860e1e1f4828ef9ea0b3795bf4e7d1083e8e5010dd4a13d9242394becc4e75ec984d2e2a4231bfd563495bebd0fe42f04184f2971e6df2c7e057fa6ac0300aee6562143bf144f718619445e8dacbd69c441d7d300a173adcc837c1bc94d80060942429d46daf6e6ad2dd0c1af08ba28e3e79b25726fee4f8a2b827c52749bb777c4d1bd08bf2e8fd93dae4b79373ac01bc582d6b334c3caeeaf333734598e9fe1373299306eca214fa62b736663c79a28b52da271171a55c14e366c97a155ad6260eedda995088154ae249dca42a4e79ce56a1980419ec547ead8f4985620cd7e104ff9229943fb7bf7feea55018b5239324ecede9528a4271d4866d274f8242397d99d46d9d6be64d4f2868cca759c38fbdffc809c511cd2144f54d2858596651b2e68eab32a1dcdda273960a9126869650dc5452dc09fb3b561e251463e7d462b2e9afcf24a1a46386c7b4b64c3a8e84a296c9b313f77b4f7d8472e5d6fa29bd1a93a03142d14fce21b49614a11cc4980665ca0f21c231ac3dd5677f1805a93986efe0bf30caa3bbdc84575991e10f4641497f3771e70746f174467bf65c3da1fe2f0a326c85f8dd3e1994f8a2205488537556a7b2d48ba27d2849f224ebbc286e5a0fd37974103efa2ecade3a3a26952b61a3eba2a417ef2bd27cf6a43c17c55c25eb55981a17c528f77226ce8e0c427d8b929ca4667436d56b9eb645d9c6c420948a96ddbd6b51d2e14eba926e5a94fc94dc3dfa711f9f45d164dd16cdf3a52f9545e9b37ce4280d5b76752cca49c6d438ade923235814832e49e88a50e6b7bfa238da49f0b40e1f347445d1d3d63b95bcad512b4aa3f1442b39c61356634539febccee8c9a46bf12a8aebe3f9a16d2f56524561fed24b297d9a64371505935483a912b47da61615450da24d4acf1c5d824e51989141cf9fe95dd54d51927133c2bdcea3b5a528b748d7dcdf0ced9414a5933ac6da24a9a32889397edb682d8a82da68724eafb539e75094ee7cb543a810225c509446762d6376ada8313f51105599270adadaa6dd359b64d289e2789411235b3649aae444e944ed5dce0425952a3751122bdf2eb9836a33d144310939193a429889627cffb6f9ae92d5454c14cd3326cfa6045da2d4a9cee346bbddeca125ca32aa6dfc04f1159eab44493fd6347f49fbf18f12255d15915a822ecff44da2fcd957737fd7ac7d27895249c2638a0899adae8b44694d67506ef2bdad8941a2b82932c727ed50b2c71e51929d4ecc51b24e95da1c518e91db357659238a33a2574337855a88118591cd1cc4c4f4dcce220a575b3a77a632697445145456decf62b4483711e8e64cb2e9d822a2249ace73986d2e3187289d748289cbffd0b71aa274ca74ee734dae79218ada3eded93b42944cb787d1a22a9041943c6aeae4d6ff1ad31e898d1a3c9c878e1c34ea0220822865f2f4246f763570fc0d15249403059d500e1c892081287d123e42c7656a1c208a1b4dc507f7f394132b00f2874ccd323c5d545453f3e52e34c9bc25fbf463207e286ade8e92e6b17b4b4c1989053366949176781f8ed95fabbe6390992f081fcaf95f3f84da063da002133c00042c78809a2540f6606b5cbdbdaabd65eeb499aff3bc7e7a2826d3713c65d3790c4220792896f4156b257bd09e673580e0a1a066ae7734669e152908408023993103e40ee5ccd438aa5b546f1a08c7dff8433b944e92494d486bcb74d048c3015287c2690899369a4d4e4e09840ea519e1795fece4f89dfd0dc301c81ccad9e773741d3974a0019143e16bec35a7ceb04926c93ca90c07894371cc734611aba6771de3e08e1480c0a1a0a2bbc14fd8a0e920dd4930007943393feb5e4d5e491af27043399be5dbfabe85f83841da50d8f8be9b9320744c2aeb618346590e10361474a691ada6cf835e13b501b28692a444b3d07680a8a15c9d47a756c90d4a68a8f500494341bbe952a14d6ab829470f3f366eb400053366a459ba618c0d1c206828897718afcbd57c60082067282969d67de66dbc776486d276d0501de30e528692c99cf93e86f412d78090a1b0e9d78476cd87137359001943397aea753c51e32bae188a25b3f989d558e27a1e06d346b7b24aad663f5cbc4a8f89bd47f3ac0f0c05cf18a1aa335c9ca41e01e40bc598ea751e4eed9d20eaf042a6dc3d3e931c02e942b9f4ff6a07d1d61b0f840ba5506f62cb42473488b650ce2f49e34a3309524b5a28964e82d68e5b92856287b1d0bff324af4c58b8d6ec6d37d5e2e6f6527b4cc39ecc1fb6e1158a654a7ce710a72471fb1540ac507c2f33254527dfb70ba40a851393244f880f4aa7b3bc004285f27f9eb80c4ae6f9924f374c07c8148a59fd1240a450f454a2adae9efc99491c40a2501af1dc34375db31d058142395b771c99e66f3e7f78803ca1ac6665769f9a7b33c709c51c2d2b3dde07d28482a65172625545ef958030a1a4f3bfaa48cb7bed7f096acee5eed689a5ae89cd24a68d8d1d0f4409e578636a3c7992de24bb2e47826304e8868d1a1e700f8024a118d4067931dab5fe2b24b0ae95da6ad622f75dd9259a98b2b23fc711dd11caa94cb457840cc4087c57a6bd797b6a6ab56c5b87cf272045289bc9a7734c1b63b037af418850fa249b395fad9afa6818e5cb9c4e3c1739390c95788ac4a11c42c71d11728243d974cf8eb8b8fd28bfa1d851af452631e38662124e4f8e714c10259c226d28e6ead2fce95e0a88b0a15cda2f34ff26e92d3a77226b28bce854dd9e7e3594a3c6ee8d2549ff4f929c481a4a82f789cf583ac49ea4c5218286e2892f7562c73aa14a0e0d3b1d889ca12c3e4a739b14e64992732266287bf415a5f4866871d828c18994a16ca1b724b9c5743327c1132143b135d63f97cc95247b2d328692dc74e265f41fc5101143f1ce4a9eff791ba14a56240ca54e429ed0d1b446db2c188a9f6d4749721657d344be50d22f7a9a3447ce4ab604112f1447dd64171d435310e9425135bf9e74ea996dd3225c2889d5afcffcbf4641640b6944b450bef0fc29ef1fafe566a124648fc83c61c54239e84e3257aeb7217285d2e8ccb81ae47a43c40a25d94feccefaf337b679e01ce5205285d29b48b7dc782176e223830815ca7125c3b7475553427922532828b924a51a355b83ad3720228562062de7d93da5821c8844a1a4749f8ed26f52830d25d4c7c35e200285825649bfc813ca4950daedcd3d64ec459c5092e59bd973ca9a5034f1e543993e2965461461424189c13b93d09a293b581d105942b94c6e3e065d931e5a112514b7a4d92457cde43553240925ff31f33842864b0a224830b493d5cfdb2f72846267b8df24889493b34bc3cc448c609039089df9e2756a912294ecac46c74d4c7268488408c5199519167265ba738651ce27dd86503372365e88304a21939924d741f9878351da247d897f3a304ab7bf354afcc8bf409a8ce96caef64d5a5f142f2b749023ba8409632f8e5115fb921355b3907331492a31c798dc395e143696a4b4cb67c8b7c80921bb28ed2869f46a0961b62eca75b3a1cc931c8f4fe7a2a0c5c3986e9111391b2eca2546d7932b5321b7282739f4c8168513a5794f794c32979c5a944a63d025fe65b428ca865182ba5621b3c03ae45cac3ad33a53df37d375c67812a38a264416e5ea53394914b76e3963512c3165bacd0caa4f0b8145c1a3a9d0313b663adbd460a38170fc18ea819057a02b8a6a92526ad49ee7e7f234a415c5b8fc9d93a4149b2fd96123310d84b0a2f0ffda193762d05845262a23f7a57bad999f9e712737ef8f581525315ff67b7f520d361ac881905414d5f4df6acd29e95bfd0d0f4145b9ff36e87e4dc829cad95b5d2bb20f3145316e120d19d275f63ba52849a286c7d53f53f2cb1a6cbd23f5b0911c428a923a4df7b51ddc4a68434651b258cfb9cd474474ce9d28ca25565fe5e88d519d0f4539c9e56133752e0414a5cb7bb33e9f433e51d08ca9646c9a78a2545ab28cf8add0dc3929a4134593ed6afc0439841345ddd4d6d142067711a518219b08d104629b904c58b729835027acdf2198b84431e7948fde179e5cb6b644e99486b819cd55e24228c19e7b57e8d7ca87d686783b65a1e6f49049944b8e902f3f1e3c4994444549324d3c35f8302412051132d74ae66a9df59028491ec3c631993fa2f09ba5edc64d830eb1234aa1c39c586ab28d28c786b82af9f33b46984b72b3924f7a2e59849a470993d3e89946459467a3331a561d76ae73a91d26ff632e084944b174aadf48d973139f8620823d4f157db5bc4f394b7b37e1b334c764b2065bc82132106288a3785ef1981a5488e2d7896592b462929224430851d8ec27be7efa0ca258769eb1447bbc6d1e082182289dde98c450750a094441b3c3a7ce9ae47c9b0744e9da474b89fa49f411ea2384fca1fc26fe6f778985f8a118c45fe7d735a93e74217d28e7e8ce194d123a2884f021a167df9ac48dce84eca1a02657daec98089b5d0f05f5ade39b25bca44c9287a2899827b953c6aa1fd306217858364c296d6af477280659bba2346d12534d2176286e1071d53162ee93ae0e2569933c1717da103aa09b75566776276fdead73669d3983d94523640ee5d6ac4194cd6948ed42e4504efd79e4a4eb2cd193308f903894bd24f118062170287f1c9d3a6cee5557c43d087943d9e7c48d1232bc9e3ceb08714331456ce8242875481bca3a9e74bc75d7990c2219216c2858c9bf934930d9c47c6719216b280833f324c6a942d450acb0f7581ebe1d84a4e1f7a467264919c41884a0e10d9d3c7327394331875eddbd4d27a98c198a256592cff39a20d24bca50325d4aac7dad92ad4d6428c750aa2f63e888a7c7501c15637272538fcb8e180a6ad9b3623a8dcec784a124a3d4cf85e7db932e184ae2ad539bacaad6a75f287edc93b5cbac53eef48295a62532367aa1d52aa6f764d69c83ce28e20d42ba50be8fed3177f27fc91b17ca258a6d9c18fb46ea15b28562362d3a482d795c9412dc11a285b263f83f395dcc298464a124a7f451b39f84fe1843b060a7154f7a993a1e5808b942492cb967371b12c09a80d904eeea1c100107f4e0468f1a62d8c031819ac13bc320707af02063470102d00333010500a0070f325840800024319e0c3170fc0d040880c78e74c8403976e848c00b001000000000000130c10248c0c3868e5740009200001e3ccc0c0208e07b3c9a5180007c8f473976cc380000060092801c3a68e4e07c0f1e34682c00000160c001d0468f1b35783c0d1a091881848e311e5132ed1b747458e8fc7f0dee3332cec6483b68946103b9f5c0616305238e401b3d508e311a81367a9461039141834602461871809145f440c751448fc4638c34860146125112e4f89bd0d612f66f4414e4641acbf054b2653e4431ef5fbae8f4e9b54cc64863f08e18a2a849aad43729534b796ab0f540c718690ce481c3468f1de9860d1d63e4383a5208a481801142a08d1e3b6af0b8418346024606512e29bd4e8da85293b38228f5ab962407b9a324114702511825ede430d1f2499a00519229940aed7d1a6a74fe50123d314926abe9eaf946fc50d03767a9d1dd847b37d2876338294dcc6efb081f8ae65993a0c5c7e45b690ce4913d14e49f90b52f62826dc8e0611b18d1c3ed2faaad7b92ced9d160240fe5564fbf73e90746f0502e3d1b84dcdf1017af061b5b60e40ea5506d8206b527c639590f8cd8a17827e61495a22a65849c30528763df34e9cf081d7c3032879383cd88c3c1e1dec06eb89136b8655a17b632e7f16126dd2e767de39a72f02ec831c286c2a6fa31cfa5e464ccd750f4af4ffad5dd268ca8a13c26aaead3f59134947cf327159a56c65e1f4143d16a9367108f513bdfc819b0cdb36b7171d9f00db59bf21133144f2c41873b1d2e43e9b3fa95a919791146c850cf98786b67ce511e4333bb175afa79b5f2ba7e99ce4c0e1595bb8d88a1b8233de8afa7f7a8a230144ebca6e79c66040c257137951c845ccdf38e7ca1687f19ca94ea2da164bd508c398f7f123fc7f29276a118c366cf59f388cb51d618e14261b5cd549c676a0ce6d9160a7aa3e4bc2e9df9311ed142e17efdf343892359287c9239cf0635a5badf5e61040bc51df926e72631e6a0c4235740ac3a475332f52356c0912ae0d960840a254159f8499e444fb26da660bbd75d9d58665d67be2352288ff660f24a73bf673c4838740462ec4827c0db917ad8a8c14814ca654a9d4ccf26bb4d1214ca274e9c4c9b3e6e4c1e1c79822373f9ea56b6abe5e5315255198c38a130a3b1e546e79b5012e5832a4949b2e464c58492609e4d7413bf6450e21a6c601859c28e28a1a4b92dc3684c528dc68c24814f6fabb5f9acb9b692cb9232c8ca95984f743a28ae638c338284d2959cbac4203f9328ee61c3c8116c068e112314753f4c701591196e1d2982cd182182cdd8619c306e46304480514c422993aa4ffd8bd2676feebb9027ade97c6133b6178abc287a76189dbfdefc2422bbb019bab0193610c945d983a634a1f28390b78ae0c28f93cb5993d54ff3ff759af46588dca270a5e966723493e925628be2ce97542adfb45c9f6a51f4a4ea3f8a8745685174ebfc918f5b641665b919519edd4d5613169145355f9ba174bcb1288dc99abc517422b028658e5b626ace54d29bbca2f4da69e2446fffdcef483d6c9c12445c51d64c824c1de2f46d3289b4a2fc293a3dd34ec96b6222ac2899981394707d22b28ab29e4c566a62f6def8445451fafcc93fc8de88a4a2a4edb4093295dda5e64450512e4928315c271532945ae41425319d50e28acc260f6a115394bfd37e8e9521c4542d45395d577452cb92278522a428e86726e11fe5e48de9bb5194334b1e4f134d1235eb9d288a7726e7fdb72b14c5243a67b0d0a163893e28ca7953f4268dc146ccbafb4431e6fcf5ebd498b5e69d274aa349fc46f9d1ad7572d789a29dd2fefbff99d5624e94cf3dc73cf3b392de290a68406305229bb0193210d14439e9a4c5947c4f9b6ec6cb44399cd220437630f9437c9828c9fe1dd366127567b27789828c8d3d1a42cc986ad012c5511af21adbc7ab84cd384a944b5092d4a9e31a6c3470e4c04183870dbd4914b38f7bfca0dd63e27a9228281927a792396476d25c24ca3137b2793f4c4ef2c78344b9f3ce6ac584ffac87f708e55af3ea5b643736ff8352cbd4605332441c51f04da3d5655e379fd89513441a513c69cbc33f7e8a8d8606114694c489e14789793da9128328b288a2da27b59b3b2ba2984b49628ab4f9336df0e8229288a25588efa7c827f14ed20e1d8724104184c8218a394f1294be89214aa64c9989bbcf97160b514ad98e1025a9ccec649ac952c23e88626ccba01a9a512b2c114114e427af13e5a96af70f446194091b741c91aadd02a2e025b98b1211b9d7e61f8a63372ea2e3cbe37e227e285c5e9d9c275dc74f52227dc0f5e2cd536f2d4f4c4a5c6c68df5b35d87a470f1d227c28ca47bb3be9e13da0881eca4928a9259f7836d9312279287fc698ee8c8ef80dc24339ab7310378f267445913bec56da6e7a695f1eaaab881d0a9bebfe99de3a14c3a40ad37b92e9564a87d2bd5d56092683e67ccea1245c54dd862939ad04c9a154caeeec875ba813976928484118044110c5400cc9dbd201431348201038208dc562c1804416c77d1340c1ca02017130128b83a170388ca32006621884411086611084811806a2b84eaaec73266f78310c5fbd5d81bdc87dac036277280db1d774996154c501b64d80fd6512405fd04d932a9826a84957b09469eba9a4d4b322d5abd7fc338c4793fbcc5c4b3bb67cedc72549b3161d0bc178ceb566fb75e1daa0adcc437446ba1ddf070a10e4d5a5abf2f96e552870a10c0b9d2a7af8774603f48321d52b4971c63836188a692acda0312f3ae9781dfd814e61b4d0b7419c519a6c4e8be426b6c2ed4b96d1ce3a2420ae1354fd9954be8180d4f3d2659381ed5015e42886875788f44532a0681614334dc4b509cf09acb86adf79efe1a72db44091e3c6bc4f7906980cbbc746021309af950c9dc20849732a971a2eade5f34e6d0c70ddd8977262d8fecee277efec034452da1eaeaa782255e2ca0ec038bbc1ee45b87aa1837557170a45fd8c55ad0411ae42e14500f216c510884c59df5a95942aa1a7badc567e0170a8a7013cbd2b0dc72108434a19862a0b3eef19b350e690771c5fb600d7d60c6d80b3785dc300964ad32665911f4b9234e792ce980c5e8088631ad2acfa3e480c81355fabbe97dfb1db0e8ce8ae7881e3f9a70f334c9ce0c41a88b0918f6914731a0adfe7b479d6c415b1a4c0583b3d7f5c77c3c8b3695af39e40a8d22286d80f7c8d5a379d803211b203a14d736f2da58b4dc1bf7c317210c47d73be59b9a2d9a84dbe0a1f6004c06d551948275612527bbe057b59619a918b2934b25d7a777031f6042b3723dc280b19ab4bf53aa061c2c1007195a530818dc1f97be7279137c421301a87c784c8ed6a53422be5d713168dcf3bea9fb86647bd98ed00454c8ef0c0c7c821c53fee176e1894dde5c9b2686572e3a6cc175de75e1acec4183799d9bf75a82875b1a4c4b72177ba2ec43c966fbff9628a5891813c7f33fbf664424030c4b93081256556b765fd60c4cf24f630faa394d846fe7f40c9eafbc1df4635ab0cae3e6a59b947c4b58515b89d3fe022f35513d7314a3480093a1195d09a3aad8ad093a9f96110dea2d185ba70f461ac2b9ee1ef8cf51704b0b488417bd659ba9053d2b3f92860510f949392908827cd8dc8afe4b1b266c05b99a6bb019e1ddeedca955012937e6e6e150c92ee76d2df713cc1efa43b3b77bb6c101c298156ee6708da9f934ffe39cce8b9de50552eb7eb0ddd4337f239700662a80c1117215ebbf9c39cb36696df6ed386a6af1e3133856fb7ecc1955acfe3fcb3f645d6cbdb6d5a6e61e4dd5778b2ad7bf69409b0e586208cc44fb4d8c94e73bd060ddb88a11a02e6c6fa67cee7922126b2acd23f268fc068af60fa640738702104235927523e2d6901a4c14126df8c86fbdacf4e87fc89c6d68fe8bcfc78aa0e861b540dcb8d53b30d5e789c3184988fa3ddf0f625a9c8c2bfab27130fa9ac39567c38e4045411595cef808b85c10abfb5af3b7e5462835021e3bb3c207a75fb51989c8597e863a944851af1c4045e00007402a0198c78d8397158beaa9f130786cc5b4383d7c93758101b3f298424118d6a594397d6ec4b0931a7c14cceb0a9239dc57da6e2f6cafa8583c64c5ca08e17cd6206cfe5f226b8bbdd028058617fb117080c6820e9165beb9f9270e1579c48651081e7e275ebc20a1540a3aa38055415ce84b054941f970c5047cded88af63f68572a1b60e380f608dbdeec12ef894c8c3ad602980a0d7103875f180daf5128b135b418c80bfada839c805f88f4b5bd26ec59a1212fb3a6d722f79bb0fc39ec302d07d8410f0f944f40a3f57b59fcccbc13996c1183bbe7fa0231b6d66753d4274e0f6040a86d0f6546c90cbe95f43d3061115d314a67068ada8a9fbb229788dc99a3a8cbee0011e24cd235513ef1d6e092eaf75cce84daf498b7491617b9146cff1edec3e43ed8ca76587699f291b02fdda9147032914250ab746dde6bbfb626564ea6c95aa696b810890b817baf36dd0916e749c75ce4fd2d067d00d6cf2e24182c3a6827fb034881e7880adc267e778c2c0eabf800474517bfe0bde8ec726e8f461344c75abbc979ba9bcae5cfe21c49340214a6658d225a9a7cdca4e0173169ef62b319bbbd2e07030a781d15f01ef44e96885b61efac5c3ae96398d850adb3480f9f557346670da49e6d2ab39d10315d9a1c14b9b0a4f2488ebbc0a003d4c033acc6f0c726e0d7188a27d57d13c4e80b2f9a189bff1d4f2e4e3f01226ca74c25f7583ba63a85e5d032c2b764ae433eab17abf71ab675a83de7b95decc76c5293245a5e74018419b0a8a9d6610c423ff89e408eb066860470e833af1fe0b8ac77d268b6fbcfff8d5b3e15ca037ead189ab3700d8462e703282d15f91020bc591b909fc283d4ba21ca1947e49de9aa667917445c10e7ec8496be5395ea0275b670decf98d62a8381f8fd931b6bd24f9f2a86924f4eb10b08a933469ea5ec9800d2ffab1374026634a09aa2df3f7b3843b631bad03593f3ccec284a70edeb92b33266e158eac075220460cdf305bc286992d6d6d6451a2309311f40ac51a6e794f3b0fc02ae269bfb310fdaea34300ce72f1d6c92d7b140d0a4d8448934a18de5f04ee050cc7c2e17165a8c529c0732e649922dd87eaff37adf2d9cc043a6089349dcb06311a69914160570985c064524f04c415ce65bd628b3c33e7fa29978db69c8aa9e4c601fd6fa5e02de74dc0043564ad3075a4a76c8d7ac5df5c9a0056304844277135642774e1877d21ab2bddf0fb2856621ee9a2c92c80669b9be9d004bcaaac18f800e8e53425f201860ecbd19731b05461d15fa6d3298c84ab1fd4b9ddc334155b84261270ff57668970b82f16aa204ea804e56eb20106587562b744d1adc0bfaf88c1e2a060e94c8c9a7042443782476a56495a59d7e255be24bbe48a7245e344c0c0bf8cccd64590ff08b47f8d2543f0024d1b8b6c7d882c96f213ff236a0858dc9265683ab320946c749ebec3f4ec3525e092505c97b612f3392218d8ce9595c8317920375471304131be1c880bb597c3f5581c67e4d254f746628dc5ad6e38546abea86ca0f938792c2bad564bd9d84aa2c7a943ecf9f710a443df1c442cfd8437aeb2de974521113d47a783aadcbeb85c03c43628f4501ceda86a2b87ec6b7e03959f06a80da4de8488dc4c1dc52689dd14b3e189202f9ee5f937b7af2cd2a5350c264830b81ac914f55d667b18077e304c84c72f0a714d72aa30fe1bcc7255aeecb5f173728a7363e29cd442e7b7751181384787b52656e321d56af4a456e012a8f777d3fc720b3125041e64e146c9d293972c2c6816c1ad821c627eb694db3ebf37af0758fed56f9d340f9eb1e95cf83387936ae0796b1d910096673e4f7e001bd940f29cb40b016b10ed6d9773eb0d58d5ad3aeaa3940069aa57ca7e152af02ed67339a7c3af6be4511e8187d7d7ace4c4a6827b9b0b329b098a3bb9f8131e3a9ae49807e6f8401a7a2aa8f7da5b92212bb5d765e1add4e6f948cf0885c3c2371990019ac2c20714ff6e33a5db48207ad99bbd96a726cd368bbe316970eac904c4808bc556c60bdcdd0f72a8723b619ca715fabf25daa325277b8689d2c44b4c63b7ef3e4a60ba015c45c851d3200ffbc437830dc6ac51e7e5d6242f5c373b0bc18fa91cfc2d1bf026dff1a2be6366a40afcf04207a8c40f7a28e605e3638c36d7d7666a7512083555de6aeadbdb4610a6a7dc04e7bdff285b07e52049324824536e6087085b44d1315eec65f9ee841082e446813770d733be121071452cbf27522967b5b2501aaf9d2c78dd5cba1ea07254ccdf5372513c560f0027631abeb3f6a6456adc9f0d720620677be34aec6727246f28ef6da50a50c0e1662bd0922dff37c393a62ae9eae87623c1dd2d535a7e295c392fea1bb23a209ea3a393a48bdaa8baddb4ab3da19206571a1ffc5ea976008bd250db0846ae4968f530b5deea4d032df16e5efe0897d93c27185880bd729566e857df30064e8c7f9c9877c172e22f4b083833b60c114cdf97a09fe5d9b2fab500a45341e4c2de472ee8446e4f89ef2523146a0c28490e9756a6090f6f283bac3f88a60713596b01af0ca05e98615c0e2ba2e05a21064b4a74cc9f33a02ae67682e8830118c72566df725ce882d7e2d35935e7bbf4c7c34e7c6f3e609904787a77bceffc2659da245c016c0fddb35746ee0d03d7600100bb3298c354b1b16d7301726564ddd94565c93a58472bbcb5995985c9b982eb43cc66da5827636d8f172c5eaa23eedd791af8d964f915ca1bdbb754159d3de750c2936684064148a4bed4a2c711bc5cf2d1807089f9fcc6d9ed9fc7377a3b268582b361e8d6508bb194b164d3864a814de73c553012bac14551d53e1c2beca153e8327778e821ffb5714ef3ba82767931458519dfb02245a88c45550d4e16d656dfc5f16899866cda21f151873b40c690245642b8135f0f9b6952e69578e37e4e110f9be961b2f70cd6be5b44f23a01cc2511d207094e07619c9e281fdf1cb60ffbd24bfc28120d46c4411f7efe2c5598e8d121dd66d22512eaf9214da8796a93ad413d59cfaff6d5ec6acbd6546f5093b6fc7a5fbdaedea84e19aeebb10b511fdc583aff7d499d173b1a64f62cc8309c47b4b5603aa12279ac4ec122c1150cbd18a909952c57117294ecd122a245876814f92227fa89429acc9c1515306675f5f87aaedebbda071c27605fced4c9b537084f65a0feeaa5fc142c84b255919b908a50808b8160cdb776227f663c45def5887080f92bfbc4c582f93056f12033226b8e0f6c957c6cbf53f243699b0fe15003761a8a3197de5ab5189b24d2deb058409c09d5e77ba2545a2bbf14a0e0c60fe24b6821d7d28c2b233262311897f799c95e809504b17fd5f32deee1e386c756d1e9e5919770113b99dfc0b26e21c84ecbbc698fac15c3c4f36cc73181c1f06b9e47548c766026a966d29eeb464798c4e1a8c8e3ea762ccf0b2dbfab155c9cc54173a10a0da09dd9f5daae1421eb855b2103489984bc88d6f00b188e250f361443671b766b79848c4c39582a8fd4d1905a6b0d38343c03d2d38ec9c56c2ebd2ae427fd45e322de5d5922a465e2bb44700579e173db34a6c6888e9c59810c367e6d67d428013ebf951783bce0a9649f9aeeb103a7d891edcb664e0f0930e28ece1a03412ac1cd74be60549cbacd46657a198586d1ed6d0738cc7264e325acb05960f0c40720b20bdfedf16bd5ba4cfde5376363b694cc1174dc4f8321cbb18708ea2b192e24f0d95246f213e6fdd0868067d61f6090e72e0bc896e299b9bfd5799ec715e79436914502a9e2408d5ac32b80c3eddc2f0da61c6b80d80b607f0fb70d4811ed880bce6bf2a313d5dbaf9fe33997e66a73b2d770b77e08f212dfa07775f77bf661d1b9240461b93ac3a133141e253426ac5baf10e6ed319ef50bf5c3cd77581ff8f42fbb4330a6e852ce218e1869f55f7c69d4f3048958ebbefc155a9395823a26510916ee42e3ac710a3f28688f2b2b7040b80d5732e586e63918eebaefe48256ef4b96a2501a22c51759a8be1bc98e0362703cff2fcf82600e91a4492d852c2171f58ace8455f9ee411e0f3f1678febc19824e73599f80d1bdecb7e812348394ca0db7deb892d0219bbeaeb1f3d7e095f477163d8cbbef087b5c5eb9e56be6b0e7636aa1ac9bb0772a299a8437e8923c1602af0c907c2e3086ccb3d470cf567651744c32d71443cb78a15936c1524ae13e15e2d12e347e17c441e2915bb12cf52c9238ebb0243a4d734275d96d277a10cd93465c6e783ba1f9f51a778a472f4c72e7e217d7b66cd1e27d2f7fab714a055dbec843175e829d53135c79cc211b8c3366517984f7cfdaf20d5133ca081b3ba5321502a9123deeb24070c32734c6430dc09279bb6902948ab96e773d9e28b687201c10de90f4ee48e3421e90526300288b1e5bc1f9c38e0bd4fc3984b87691ae16c8a08fd36599edbefa41b0d0575c6263daf6307cce43cd5f58408a023f84622f8b5d20246417ac7e7ca94da71b6744b99f440deaa75f6fa5aabded6baa59f0708a8996a35509f30e66d1bfa8d8fa198877292849c5645466ae0c4e2ec5a523e677a6496c72a286084b50150f6fd133a057f9c5acd10a629916f4fb83f735b4d006fed8241b65f0780263c9c1fefefb2b88a5f605d0f6cbfe44edac2376c7096cc1b5b6f2c923b9112beabd9c4e6a522f108969ef0a53ed514d08410961e89c866da5cc8e44bf3a633c0791829b3e9ff574e55fee2dbc957b11cfd6814302b042dc588fdcf09a439a6def5b5bc9084211e7b8c3f7dc46af3f034db1bb5b41b1246a932316a42b030d5d63491988f6522a2524c75fb18aa8574e2896b5f225f54342a0fe6f2f70359b2a907e1e9a2ca952761f00529380628771432c3d3c7f010e94c909827a2395f4a4ddbe7535c4fb35ab2765ea9175d027ac27a027fd021e2f1ae1b491fef9881d6196cee81441c932c92c637950d02e24b0e1fcec841844be8a257081da6ba72f8f02d4abad26aef5692892ce40c8338b220aefe23c138d6b3b52584b2a2106e80281346e8c4742502592bfc383bfe333915180c02ab7fcab6bf31d9dc10b644f300ed162e8a477c1cd5ebaea2fd443d14ed4ffa32981c3a01e6db92571237b0d209f34d92c832e5d6d997128aaae0392a19f4d51d08edb182c9c431c660df852a7ff824d45290335812aeb3b3a9e10f01d09e1f7576acc3cc51ebec48656fa23cb9a9f763fa32872bb7288570e4ba459978492187a9af410db95301cfa55221f6caec49d36889c82d834ce8637cd0c8eba00dab1c843557142fe4534e23559dd3923af6a82175314135dc748c312c5b5786d4fa3948f16d7f534dea567779c55ccb2f03c8f875213186408508754c9ff13092cb6bf254911b957958b58b5618b527f7ad1eb0c7f1ca739a0f58a5dcf7b4bb3cc1439564155062bbd57182fa41c0d6608af19a8981f65c16e2cdc4d17ae8b61245a1d4a49200ba29fd581ce959cb26d948832e76ec0853f4f5804132b7da96492cc06580b1e6186d9c40c6ef692b5585122b0bf030a5fddc144e9a5410380126070d87d739ea55b97cc243137312c108f1fa18f9d0573797a8188e5d2df267cb3b78cb28371fe0f0bcb79e92921ac7fb53264f3777364419c5e063089e6e363126b10383c2236a36616011a50c07c75de9165b7b7ff1ad5843bd4934647823e15365b1870dd9120068d66fa06e74dd9723c5168c28bc0130815d9673323dc545c70f830777c213527924ca5ecb107a478bf4b014eb53143224f3570d35204acac54a2c8ca52b3285495115d547899200e2d2e6f705139666e3664dec1ff72cf91eb77cd49de22b00999239f940276ba8adb54f036ad4ec2daf239c0e04d414bbf25166360946d4f2213de84a5d3aeb9ed90558f53c56086a5b8cdcb6dfbda16fe4f8200878baf65485ed54601141ee09f441fe10da693d25e2c1b46496f0375dfe127a012950889bbd689569264df770e91b5edfe8f916a307402baa7a3618dcf324d10055c27024d7bfbff2e58cc6e8972c0d9732d83bec60be11d76b6ee4885487be287c2ebde1a13ab49869101b84c6e26e93964737971f85f996c388fd023ecf2b1149537b8e05c03f86ee39cfe9bb949d5cb99c173b27e77bd6253f587219ae81ebca20666a14a439be59d32e44da90f1751a9441505e140c17d0434c4153ce35abd5e921a1b9f9907b49114ca212f0f9b4efef8e95087b3be10", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd00585cf7044e24461913521058e928e9f067e98eb48fc7d6e6b3e882522660f48debd62239d1e5d9526d1f6bf05cebc3fb7976636c99b8f5f4e957d7f6d9bcb9d2f74e65c61ce9c74947b8a92c36484efcdf486b84104236d97b6fb9655b14de113b138756e0156b1d995608cbbeca0ce4c222f90417cf5b111c0dc6c67afbf36c65f703b9d8f8d9d146c1db66d8f806d3a9f958d90ce472038d1363e5af8d8560ec85476672d859e79546c193c2c036c35e48350eb6165c9800ce4886c7f460e763775140d688d85dced21f948db17290be4f365abfdcce09e640ec11c505d6056914fc69bee7af9ea76d119115072d09416e10aa71a89b329c3003148f91c203b3cac26350c063784c0d380d22b252692ad80c9be131d819589cc1631e982b55f8c4a16c3e7673bef927df7b4f7642c039b9b811b1e8a7fcbc45abf5ccd2acf396245e9ea733d9c546cd5b8f1b110b5adb9158b5d8a8597996891b91bee46c4e60f4639487fd77f8d8c9ca6fd8efee1fe9bf1a1b052bafe07b3688ef8a85b45194725ca3b6df20daef0cd96f4e6723fdb569cdc6dff0cee9c442acc7c90373200e369e725db8f84badc69d78e04e0f30673b69f59eec3d65277bb230e7d2ab5e6ac35878ca476dadfad304f77e394c8c31f214a8c6e1602af2d28288838def4af6221bb0a784f30b52c63234331c0033b9786172995cb44c2d785859e7117d631ecda3c9e56501b36572d1cce0b8b2812bb7c0c5f3c0ee7eb023db8f5d5f9385bf0f3bb23172e162dcb1830c0ecb819dbf261d2b2b06c60cf77e31301818ec8897308612d8118e2b966158c5074f9071290debf3199796c0b10e5430859d978f52b39c8df764638ce7e91fcdbecb19bbab59f9e4ec8480efc5c7deb9341ba30cb8c8756a5e79faab8ba71b12ebf356bc7cb683d218698c3eb2728d7a51e0de2fe56c4e1a9f81c5195844cdfa7029789133d6e04684528ba99c1dd79d600e7cc699a5f166e4bd2fbb962da57cfdf7295fbfca7323d235561b1a86db88f433f98028fbbdd8d18b8c6de062eff4397ec6c3bfcb6eca78f8d9ed28838b672b9f41ed6d49e06517ad8c975b0e6c63951b92d7482050dbbe1030be2746fe9c8dfcebe44976f7f63d36aae9e56457ae13821f779a97f2b477aecb7a39d99db2e0e42f676d643d5d9d103734348484ca489efac85b7f8fdd0e3238795ae3b31d3bcae0e4d9c65b1b91283f3707acac7cf6b4d83dcb9beced88ac5aa3e0addadb8402f73e3b66943ccbca4156febdb723d1ca0a7923c2d944a068e57b43a28037de78c34af9beac44441badd05bcd9650645c0347edc4cc3ceb576e91545cbf320aec5796c0c6cb252e8b58c87cacf74772e942ca639c95bfeac9ca930f2b6fd5ebc35e4e16d92b8f8258f8de8a587656ec0b0381d7aee0deaf3cba180fb27e928b8d7f1b92878330704025171b3133966158d107b950e21fb151d0483fd68bb2f13c4efcdebb3676ce67b3bb717697daf80c3e668eb0bbfb6363e73be346c9f346443e935d26f9358c246620fd6b23c48b5dd74e0838ebd3186afccebdc330079e9fcd2ee3adeb5dd9beb57eb91d8639f4f7b2f1cc42e4e31fef7030073ed69bc5eeba828b4662a5dc3ce49c4bed3cad9732a79851b764e7ad7a4b166e45a49515c540e0e70db8f78b9a5d95672fcac2f3868436ea7d764a3e1e9ec64ecd7a9f7dcfde4644f69603db597f6c6c7c6f486a88a20c27c82e5ade62c539d2b14eb1b1b151dca8c747b20b4457ce50e95f6a213c8487107eb1104218f907d40008aa78a7fa7d54a76eb4ddff01022b3b50d531b4bd3c6c9ffb54744a471c1f7d600acb4748b4612fcaf66bb07c84c491e58d08c7d31ca7758adff2969fc98e2dec9ecdb806eed90935d9cdbf8d089ce7cd012b3bb3b71d919ff5cacb67bd1de1ac3c6fb151f159d460f76c06b5d9c9bf8d1b756dec7b96f136eb5dd979d85d2a0f6177a39de7e90c769701163ee3cdaad7086b1d76978f2cbcec2e37ca082a519ef460e12f37ea2ab1f057e660e179a0ecd85a9d10f08d37de3863e5617771b0f1d9d360172f3bb6bc25b12c9c9d109695f53e0bab10ef8d37de78c3de95858f1d37ead5d8a8771dcb30ace68b20c8b8260858c639a52e1c1f21c1c5d24ef111125b2c5feb9da7e29f3ac54743672c9f87e5f30fe6c9f806ee9dcf579671a7f8d9777e56e24e71ec549f9fbd2c6adc29b6975a6693113155348a2d8c87efc38d48577e262362b26814db77d871ac6f23421b05cf5b0ebc11e9f3f4f341c6b6fbafbbf2ea3d0764efaf2b1971474363ec8db64fdf2965b8c39d7339fb7e391bdf03023ed80f9ea71f8410c277085ff7a9ed8a83a41fdfefc87bd7db87d5e70f4cc63fee6d3f631bb88c6be0f8f0bc11e1bfad88114343434858aedca84b6d3f6b8d3bf5de296e549fa761171bd5a781bb9ced7e76ea14db7ef634ae537d9b4ec1f74f9d7ab6cf1b11789ee6e9d811e1c30eb1a2f69dda577190bcc7bfc70af42cacbc1179f53efbfea3abcf2dc3b082ef012163cb3f2e67fb19edd4ddb1830ceefd6ab67fe133d8c9c0bd2779f78195368acf8dbad1f2793a7b1db4738c254223654f7b5db41a0ba9f2cc58212c4b048d7def6f2ca4ca1bb24228c012a1d9f73e89855479435608055822a67def9758489537648550807deff376240e0dd9779ece5a6316f27ee1b9517cdaa9fb2c3c3f831d6d14df001c3c9f3723b1517c5869a3f83c9db5f6bab61a0ba9f28e2c11d3bef7371652e50d59211460dffb6f4bc20dd977ad536cfbbc1d7943f69da7799aa7799a3b6e149f7f74f5e12cc3b0ead74cc8b8b377eed4e5bfca8de2f357efe1c8f868288b652be314f7cee76b8715cf0924b081ed4862870d76bc6007d18e26762cb143043bacdc607123e6b4849396d3166ebc9caa3871e106891b2e272f9cdc38bd71323ac5e0e6033730b889e204c5a909a7304e699c8a70dae29483931827259c907033c68d18a72f9cc49c6070cae2668b1b199c64706374bae294849315272d4e29384d71c272da72c2e2f4821397d30a4e46b849c18d143747b8b1c1cd0a4e2d385171bac1e98c9b2b6eacb849e346093748b8c1c10d18a72e6e6e700a7393831b2ca73127346eb2b839baa9e2268c1319375fe8b0818e2e74b040070a7448a1230a1d58745cd121021d56724c21c70f72f820870e723c91438a1c53e430418e15e44022c7951c2cc8a125870872309163891c45394e90a304394290830439887280204712393e90c38a1a266aaea8d992a30539a0c831829a17e4a0a2a607353ca841a3264ccd979a1dd418a1a6083567d444a1464c4d126a745043468d979a316ac4a809a3e6a826073538a8b9410d18355fd4d8a0c68b9a2e3550a82953f3841a27d4a85143a6a609354ca85942cd989a346a945063460d116a865023841a30355ad418d5c4a0864b0d0c6ab0a8c952b3821a2a6a5850a3a566a806099a27d05881860ccd156882400386e68826063423a06982a6c8e405531a2625989260129343095319a621988460fa81a908261f988c603a328561fac204860907262f4c39303161b2625ac274c534025313a6221314a6274c48706e988668b8e0dee0b67033e096e0ace0aee0ca70643822705a3833b82db8257043e0bae068c07dc1d580ebc2bd807301a704970417031a2f252d94b0509a42898dd20f4a65947c50ea418907a5304a312861517a42298b12124a3028e1a05483120d4a5c945e5012532a53b2a25445c905253325284a2d285151ca526241490525294a29284551c2527a22c71a39a49023082432a42890a020c1b86981bc414b2185208330b77091995c90605e0a4820d0947858c834ac28e218ef05d40bec8c6d08db147678710263133365900dddec407b43e3828e14e87081098c8908a623481ee48001e90425296c5694a2b0514152e30941cbc2037331a16dd15e8065416b436641c382a56563827585a665930286054d0bb20d8905ad0b1207528cad0b1b173418685994b850da028d0c342fe8a0622333b398d4d88a484d905728898084055217485c2831417aa3648252094a574a564a232891a0d404c90b252448674a4a90ac281191b2504aa2b404e90ba51090dc206d215d41d242aa82b485d210490ba50f948ab62f6c6f6c5ec0cec82e110b9a313824e830c125462301d7028e0a2e0bc7026e059c0ab8293829b8147051705838147050704f704e7027e04cc09580bbc291801b01d7046765fb624282fc9265617b02cd1539aea8996283426cc2d6846d09252d6ab2b84470b540da407e41aac23341a4822483e2e01282cc813ca24f5836b0bc985f985eb08e60696115c1e26219c19a811503cbc8ca81c585d5e55db9c06c417825b096b0426061a9816273c216856d8d130aa41b3456686e44367264217d604be202c26b43d640d240db81e9035710b42f190ae812b4c804021a02698576665251000294b86c65302d4432da15b42dc4274c16c432a51cc8323228a4971c2ea0e1010d0ba40f220ce211221a918c588337021a324848481d9c8440f3c635841a159c88207bb08560e3c13c7319c134c68d9653960b09a6135c689c68d044f207a72e27179c707085b988707a6203739a028d12d7112e334e5ee40e6eb6dcf4401b02978593179712e4183749387d7115e13ae34ae30ac1e9cc9584e7c48d0ba6164c37c8518546849b2f37594e4edc8cd994a0e9818e2c330b345fa891e22aba51415b795b785a78675e17bae871a197786ebc2f70629e173a0a09048c079819580fa20d4c6ec42f3427b414684fbc275e14528bc4426e79287858de092817a635280d62112212a2111e1498179818980da80d30286052c0ca6c576c469b969a12d47ce02de18dc9d6c8a4f086906dc95e9069c9b0c8aec88cb22c1e99a7c66bc273c263c22bf39ef08840c30553156a96a0d9028d174c44d20b19c6a606c5723aa2516c44263126166417346ed074c1e404cd0c1e094a6be8009921865217f207d9b3fc3229ae863d4340b980132a507aa23871923d08c4941e274eb09213a4e9841f9c04818129477e7e825800d00f3d3f3f412ca000538d28401998d2f343867b7a30e02408202740513220a5a7889cd9041ee2470a14a01e209cf4f460600093091c0406a64871c2812a3d1b10c289142a16684a8f06380045c9e712b8e78729414c7102c589142ab6e7872941400068ca0682f8e107db638e0122881f7a80f031d3e02138d0e3e364882138d083644a10528618a267876e2a818b9042c556e9f1a912440492743309dc03040508293f508870d2b3819e0d2c6102444f063200854901a6181ec2e7879e283f208187009ad253a527ca14299f479822050338130dfe41ca1053a4540132a2c709077ea85081e2a44a0f103f5236a0f2f921881f158f198635e0040a101420a000f53cc0348dd001293f50a40049992205c72c02fbfc10c4cf059cf4006de0871e237a68e6195c25880568d30c1ea2470a90942a414401da00949a49049e12841420285536008413a0207e867022858a855265031607bf9e9f0b40019ab2010c3801faa1a78a1420a64871e2e4e6249d6099d98198352caf323e1a1ab26f056fa6048204c2a3f2ac88923812070747a2de91ee86dd1d734ce6397bf69c314743eed9b3bb27430821cfc90c19ce397b3237cf08992169428e1d61dcde9bf23dfade63d28c0d69e4394b724e4a699c909b21ec1821a531b69cb05b36b4625b1884d3a20d79ee808f61f784b1fba2b129166928256dd122417891ba9b27730e3c4f7342ca11ce3927ed86d1489c3c35d80c59ca09639cb39b526eee860c3b36e59e936384b048c3192343d81d3936ec8eddccb479ce48294f9e10ca375f7c12c639218c33468a350c1677f7cd6c86cc1d69dc48346234d4b22c0869f784118b3c39ca388940d8dd9372c38e7332604e1f944208217d4f2e40657df8e091a539a79c73000a480094a528e99c1b9c1300b22d1863c4228c11f2cc30e6f81ed3664a4971bb8131d28e50765318692643d8734ec88d31c72e6103d010d00db9fbcd3609a071389d5a46192964861036ecee9963486dd6b85b6be68ea6863ce764c834326390a1359b2d0819c2ab27cfc973b62c45481b8370cec9b1e54629c5688c0c29e58ecc32766bdd0280010880061ff39c9342eed72c0446ee788020da0ebc98999bad668e23737ccd29c81a37b786a3e164d81036842fc61f74ce3921a5944ee6f998bb5fbfe6d8b1bb6733b3d6ddcddcec7ac78e7edd3b1af67b94369c0df975c3d8527664c92c21378d11c39829a594421ae3b6c56d8bb131ac1b424a69a411420a61a4146b18e86c0899b70dc36ee6ec6e8d764b08219f206dcab01b2b71cbeeee0c72cf39fbcdf9bab5eefe0ddd0d4bb31bf28c5b376f36c026f160e6e6594384104a4a298d108b588c3132c7d90d9b69f76c8d069e0c1b3673bfd7ddaf23ece66686b09967f79cccccb079ca66d8b02184f0c1ee9611d22863ebd0a143070d0dec66669e936173ed1c0d9b1b360e1c9ac675942384102bcda0c3cd1d238410461863bf6e085f776cd8b0bbdbea2827ecc9eff50e2b76688134dc1ca81284067a34306500a2a74a0f1055827092ba81861e2955800830801b00ecf0f901ca057e7e8220800176f400408f9b1a0be80728434c815205c80990140d682008944dc5314de9a14205cae319340000eee9a982012755820082f243103f3f507af00c1a9002346503552a8701a00df4e889e204688a942a549cfc3084140df0b021d5c388208a000240ea061a6a82d03083131a7a7ca0fc5cc04906a6488932049428ef21a2e7c789115034e00307cf9081207e9c64608a940c6420889f1bd339237a809822c5c9142950a2fc80010c04516bf8f991e2a303648801c4c03400051104aa003c03949e2a363d3e4e808ce89912830d504f0606709e6108a021a418d1430002300d4648c1404f152a3aa62a507a7e7e70d29301285582001ac209103f52a2fce004e867035030d003448e0554050ad01003a001861c9ea107084a959e293d19a832440032a601889e2186e8a942450341fce0a44a0f1141fcd053c509942180f8a1c7c90c3ea91b68a0f243cf103b57941f80a05cc0499421a44c9182011411537a200f9ec1c99420a40c51a58708271cc080942a3d443839c00c37dc4003103d4e8200a2c2812a3f380132a2070622a6f440026c62f4ea09f14a4848086e4f566ff54a4f566fb512128a500ad1d51412e228b45acd95d06a459fac1e26242424b45a594f56b09f08bd9590905014824f564f484868159fac9ed04a28e395503f5909bdd57b22f48456504868d5d71316c256123e117a4242fd64f584de8a3e6121a17ec242efc9eaaddeca7ac24242ab557c22c4abf964f578259f303f59bdd52a3ee1d56a059ff06ad54f566ff59ef0ea3d69403cc263e6a78121a0708d05111398c802460dae64f9284b18b109eeb27c94a54b190eb37c9425065e705844127096e5a32c2e804c803e60620b32381e968f9818021926d8e823703a92c882c331451177dac20a67c30378020e87e523112401be400456a0e24bb47c94a58dc844185844512d1f3521848e82cec9e2fa072a864edd9f1f9636eab51738cef291095860efe1131c8de5231334615b0bdc66f9c80443f6a833ffb1c3f2d1125c284191bdd7812678325a6c79769dd4ac14430759acb4328c24d4b0f23c7a878f86868642a092ff81823bac8a955e58706ca9eabdc71acb475874b19be5232c60c0f512322e6dc171184970b126cb61108d41edc95ecdf28d218865f6f22c43940d3c9d8ae75b61b877eefdc4a353f787bd56fdf9614f8d7a368dba42828882a3c90213c022b98512cd9d6c4e58ba44aec17bd65fa558b240863bef53dbb9276b1da1600c6b3d5a5159b7390b616bd5fbf3a35e6ab918706c2fa742411998c356727027aa1e4f0986600e5b6a6d2c3cbad2848527cb75346a709de5a326ac5869f9e84a91fdf1acbe9cd0ec45e90c0d0d81600817a8e1022f90f8428b211d1d1964424460238c218821638422605154c0c5901a4c3063884c14f69e8444fb3e3434f40115147a600519bcc0a88c2b584145ed3b077756336802044e30610844c86204aaf75bdede4b41c6bdf386868686865457c7b2ea06e12f42da06810232446950a1093ed0a2e2739db22c1fc5d33b51c5e72519c31dd8e7736fc8b308e8c212c0248068688baabbf8852a6bad3b1c267d785883104074a4eacac19cf7952ae3ee7eef41c817e9ae2ccb6004318654ddb14aa8dffb0074c2b22c24f1f446e2695d59483b093f571602b59595862743afe47b6874bf779e6e8d3ee3adc8b3b4e2e4c096de085b5a7784c1517b9f154b0fbfb256f7acf58e9790a7ad95951d10b4b1cf0357f2bd30598c314b8c53c48825462762bc12637d567a3ec6a6b45efaebea900ef9d8491d770e56b58ef99a66b17ae32fdd4106476b76598f96f269736f48e8c4e8bbfa58168d334609392b4a79b2325add8d9a8d562c122fa768d62756fa5672deba489d0ecc81b326d1813b605801c3eaa46559e99475cbb2ac58e75714e39f15596fb41c63dc215d07ee90eaa3accf60c0c1df07d523d0ced859898f973c50c6ac4946989f5dbae8d285349dca739ca9ded7459757c664e2a28b2ea62eba70d1459757a60bd2bc3a96ded745d661bf3ab69cd5c1d59465c42fd04b1f51302c17b4be2eaf8bbddbadd3dba7f5be2e347ff566379d8fd1d0775a6f104bdf69ead5b1b474ca5ddce97558af1affde4d3f9a35c57a75ac75d2b1bb3dec3d5a53f5c9aa299b5afd6dacdef8ba78434c26ab54efaafabc575f174f86d9c5522a356c3e4aa99435764230f60c6a345dcd67477a967d76d969ba9a5bdd65d19ca7b38c7e7674d23927bd655996c55a8aaea2394fc3cd083de970237255da31ed9cf9acbb9cd5cdaea63b46ea68aeec57171b957136a336c39e65e73852edd4a8f7c31d1e9df36c1a454fbb74d1a58b52d370991ddbf74aefcdf728e9a49a8454efca924ebb49e7a49fa593ba52bd2bfb2813a18fce47a65393cef71e139dda4c9fef19363b29cfc436a0995ee3d959cb58c976d647a651f23b7690c1917e1f9909d49654a7e4be6134bfd94be7e00ec7edd47cdbea8db6ebd5ec56ef8fc67d3b4dc79cb355c870a7a6c26e07191c567f348b69955fea7690c16515085aec7ab45ec2aacf55b133e9fc12e9a57a9f1569b7ea433a76ebbd21c1aceda46dcef9b4f346243b4fd3cfcb6ecadb8bb292d2396dec94dde4adc8fc75da4db1b13ef3d733a861dd75cbfae14ecd690e9f6595eb68be75d6b7f346440b779e8e9b0e3537d146cdd774349dd639f33c70eb2c9a8e8339d7a7a9e3cea139ef3c9dd10e3bf6d95d1bab59ec6f2b721da3dd3d118eb32e621dbd3a8d47a3dee18e4de7bc93b14ce870637027b186bde523a22c36e3ac35de6a6ade4d4d4dcd79fa6d446a4cd7794370dc74ee94e9382e4fc31b82a326c151efcae2b8a9a3f42613a5a6d3c38d08bd398eeea6de95ad3199fe3622a68c3b5553efb3a63395a7e1d0894ed14b53476bbafb6ccd697832581a33a517876b83a5f5ca781d394e3544e4e10e8f8e1c27d9cd7bb103b07c148229ccd81bcb472130c36650935b6215304b4ff1acac58ecd47943d8ca0a9d68d4d4f17779a3cd71f98b5dcaadc8eb711ebf146747bda6d79c3b85e397fb761eb8d3a33e8139f03c2a4edd5119e6f4ef894f7ce6ebcc3b7f227faaef7a4f5cb3ab5e1cacac941e47c78dba382e7f4a43af41aa9de636f59eae4e3b7d4db7830cce5481a4ada1a9d786addb4106c755a0b635bf3aa8111ffa686baa8fa9d6fcbae9578e0ad417ab9bb45af531bde6350f877653f5a197166e49a4a59586278326697832486965a5f34684749e7e7f9b11ebef5af72c5f5836b76b46b6cf9d273526edafb360767fd8f927702776cebc466dece4c15d64fbd44aa42e6e9dd6a877ade33a1bb873ea9cf7acde130adebe203b2fbb6ad1f06490979fdd5dcd46c53aa4a36ba030b513646cc6e39dbacecd1d1cbdfd755b0629a514763e16462984936218774d49b07adb5a37d5db163e323a0defb356d786b7def447a748e7ebdddd661aced9fdcad83b1ff7fbc840321d23fc9cb0faf485d1ce38fbf47513eac01dce8e3dc0eaee02c197badf4dcf03291932f6226d464cefead3a7df4c5ad7d068a667b186a66fc23622971336831ddb6ed8d1c2ae9bcaaeb9eeba4d8783edd6cdada5cd63e5e08e4dfdf6d7a548bad1d24aadead3df4eb3fe1161d7fba375bdd1065a5a7dfaf3d76cba6373bad5d7a7dd0582b65fbca07dbf40d06ecfe626372d1e0710b4f45924d3dddddd361d734ef311d7356148ef59b13c3ab55debdc73ce29df9d4f6b734a39b5ea13d962fbe435673d50db08e7a4cf9e3679c68b9eac0de5d9597f9d75263dcb62a51ddffd17df0f0bed7cb40bd9c859778cf48f5686b1bb8f7ed26ba53763e45eaab7ad76aede7e56ec24d54b2d8c1abdf68844abefe1683a70e7a563313ec6f957f486c4cf18adcccbeb56b76d46488fd527beaf912eeca558ca26e9d89cb5546f8c275d60d88cca69b58e2d8d51eb9eeded48663b76fc64b02ebb9875d7796016b5c7c41bc2637efeaaf759c9f66d117270c754b773a762e546698f31f389a7b77e356bbdedf1d16e15c7fa75f9c31d1dad9e5e6acfae53ad62b774348d3eab8f1efb755dcf8a9db1634b3b39add5b18d31466bcdfa987832c8486aee0a0f422f1974e20d5d9bcbe3feb08fc6a0d329eb5abfae0fbb7e765dd7f59e753e257a5d5986f377517a789e7e37307b0962b4742c834e3cc9eeb3a52bdfab4ff6d2e5eff52c6ad1864ee1e0ec2ae8c1b3ce83597c2e08a1ce1b026f412c0ffec6a2bfa5bf572f74c2ce377d15eea015a86df67e4b15a82d3c9571d90b0ef69df9da30df05bbd7ddae4f4ed7741ccb717aeed48e7758efb3d9657771ea554bb73e4fbae93510c2cb779d775d17e7f3173a61fbfaf63a1a9e0c960dcd197212bef780bf3895c7b5cd08bccfc379b625d12cfc93a755ac5eaef6a8d7061e10a7d26059c7362216f462b3ac54ead8665956ba74ecfbdc8cc0f7bbf91dddf69bce3a0f84af19ee1ce6c49feaa5a6eba897ab798e7ab8c353fa85c3a6de534dbd279a6abae52a295e34c39e5d192d3dc32a7dd61a0d6fc87d36744ade061cace4bc582ec3ca7a81e4cbae2cfbdb8e942a0d4f86ebf25977813adaabe2d05b9fe7813b4f604efce9c4711c4fc31b727d4a694b27fdda60adefc84ad97d4ad8e59644b3d99f944e69e9972b5d27d56b839dbf27bb75170d6f48761dab3458d009fbaeebba687843966158ed783a66e0c56a96e66084c08abdc1f2911266d88c4b5e707ca444151665f9280937ec91125cd8ccbe6b566c161b9f5d6ec7089b4e712f9dff9ce8d476fec3d229eccc3cae6efb76ab9bf046c09d1e8239f034cfa029cbaeeeeeabf3a19c755f97d55912edef3cad31f186f4ad2b49d7ea6d4b4faab7eda559b19694b25a96f6af9455caae3ed7e9e5ef8fc619d4783302ed9515fb9bab20a167dd23ac7d57c362ef3cd6f9f485acec2eb4d0c2672b6bfd75127bc72a374a6a57ec056ade8858550868efb330c96ddbd9c4baedbb65d5ab59b1f3d47aec14e9d6ad6b59d67b57b4df579422fd3e2b769e3724f28d75f7593be08e1130073e805abf2eaf77bdd15a10be87e00e2cb2394d0f59f8807759ef917779f9b7257997d6b5a23744deaacd036d773bc8e080daca0bd457b362b16fdd7d763bb719a1b9ac3ef2fd124d779f7d1884f035b78112870dc9a2f96641cbc201b15887b76c6a2a94a7d1c0b0d9d5b195f2ba3a79259156f693e16a45d6fadc8cbc6f9f9d3c0f2475a56b1df7acc3fee6b7eeda3ae6464dd8c51b017760d1e333a74e4dd12969a46d291e16c11d8805e6c4bf7aa97d37758f76d7b76d74fbd56cd69ac6c41b729f7d43165ece673b76ec8003b2ecf50b64617f3b76ec80fbd1ec55b15fcfde7b8075ac5bdb3aa7bfd5bbfd6d47dee5b7ee46fb2a0e3df679fb8a8d8758e28558ac4f20cbbe5f20cb6e27fdbe228bdd1fcd6ed77ea3c54e3723ef3e5b766b4ba2d977c65e6ab75fb8c5c6731d376a7ba98b8ddaea05b2ac7552bdbc3d7ed3aac6c41bf2ea1d6265ad67c78e7d6e4430cd8abd3a96d3d2cb012b9ff1eb265d0f586975f2bc1d9156172d3d9259ab6a4c3c196695318b651856344f0751c6bfddddbd80f7deb3d7e1f0d9e2147996df6ffb2cc7efaf08ac9c5dc15704dc813bf3aad931e714412d6495ec9e8ab724f409f50af66322c26725c88cbaf0ddf780858fcffac0ca15d52d4008f9fc572f3f42c897870c218410c646f1dbb8cd4a383e18087f65d9f206801e3c7076dc9c74e4c061534363e24aa44dcbb08b5a5346d88f81f07913e2bd61b5c0f334a57c4f3bb032e7bcf3edeb84deaabbc964cca91861a37848fff2cbb8a35901d796ffce1b92677db8d227037ff59e91c7d164e4086b348a6de418638c31cef8e980d58d36561fae4cf757362bf11f0be98e19c8ed2381ef276b91eed8aee22382ebe55ebdf35766f25dbe65a58d6a0b09ae7f350baf75ea55e694fc7da7342be0a27d48a0f581afa38d028af69d9f125ae0c36d818dd84528e59c734e58b12f9a1547180ff88b07ff5e8c11d688650a5d06e3d20133f28a8dcfe4135c0fcb0ce4462ef24adcc2c6472ef20a0d22177b65160058592f30399059e216f6ca2c5776f004105cb118171d88e9d284372ceb9485cccb5f2c845a322052424745b90679a2eb4a5c8561560a61dde41a644ba1b6b44a0622a7954fcaab63be414acdca33a2c6cd865848fd6832a08c9a9a9db463ce99d408faa3695c9b699ef2d7343f2039521e403a611226d5b819502c3413a2fcbb64473fbbfbc44ecbcaa4263729ad5fd7964dab571e7bc6591b92785aef9138b1f27d1e885df4a23ee845adf7ad4a84b4b3fac85aa115ba3949a9654929a1203baa71c55cc39292ce6bce296fb194d845ffe4d24e1fd39a550766510418502bb913977e5156927e75ac9440d38b9aa34af5a27448f5ead8cb05d9ea0dc25dab979a389a6357bdb74ae04e4da5399d4cf5725cbd94d2eb97b3f4ccd7efc9523eb2f23abd2aedeeed6530161e6896e6b4b10ac5d5d6328d2baa10058ca512d7a954bcf17143023f0fb723f1b3de7e7c26a5f48915d6b88336681ca2daab57a8c8be4b1470f761b9ef8c8d46da320389e76d49ab18e65c2e6363ed9f77c6c6f73dc547813bd6637d59de992f8c1459f97bb265eceda22c4ba0caaa6d460cf77ebb88cdd8db4554e3de9978458ca277260e0d65f20c07696b509e610115a2788c31c6498d1025fc02185f322bd2bfb7119987276b71d6a2d63ab3552f90b4f3b1ce2ddc9c9c718cf135ab7cc20333a9c9edc8edacb151f2cdd6e3b46a04923ee69cefcf4a84b4b151b23e7b3dd88694724a292512a40ca6946f763fb0a372b634c2a41ab78594524e29e5648294116ee18863143b1f67f773b2932d7a7a414f942483aa12ed4571a427029c81c519a72803ebf0590bc59083f20c77b4cb53b8935dd6fba36375b451587096759ed6ba738e7cd631e75c94953f9da48e95546cfc7b3ccb279fd29a96557f7490e0c0e20c2caca496373945c74628d42bda300a52ca6959cf2ccbb2a49c52ca9e3840bd6e31aeb082e498ca471632a195d288931b92b673ce958df3bd118933d61b64633c3c95560e6c65058248a635a18d95eb2a7036f1fdf778d8878a36b663926825915927c742a47598036dae38dcd18139f0f0f3daec4e8dd269143c0438ed57c7c2b39535329068a307acb711b1a255d972dbacdf934f6641a719aad50bb9d8be0c4dbd703ed9b56326285c9d0d8d82dc34d67b7f7e6c76eb3e5aaf75ec3cfd63c35b11edf45857b55bddb5d17a2362f1b4c5966a5eac20c632162c7b41e3cc75ca7db1f4d6d4783b922de976380f1d93675697430e8d823c5797c30cb88b0145baf4a6439fc97bd3e17d87f7a603ab88963cc9b397617f36e09ebd1808766e54569574414a9ee43a74413a7c49fc01383e82628b65cb585aa39dd28e69f5ae2c8fd71b8968951b45fa5675743a08a625021d5bac665db2d6b0ee59212e3b86a54b1f35ead7e51ad97d1c8a2f36bb0f2f5e10636f2c7bf182190b4591cdbee0f8e8893319d568873d1b7a1add925c563bd6d16b9d10ef0d225992af544b3a1c264b2e814ba0062df94a9575e96181f800772670095ce7e145ae31034e9a91651a45abe02af02bcb5ce7f1ec3e7c1cbe025dc625760a47fbca6a3f5bed1d778c02b75129b89b71b15ce08e0f879765e04ed053f95071b4b3ca876b3e74180b68c9f2185830810540b7830ccec7b5ff19b61179f5f19acd012bebe3bc3da07b769e7ef72cdd9064f751719064f7711fd5a7ab19d191584fb03c4e493a1c2649eec37da84149be5201c094e1f8d0322e16da340ac7472dd2d647f66c0cdc2182579c08c3474e8479f6264c56668d1d0e7334343484840a3ef3f205ee3c15bc0f2deb8ca021864ba7ae2c63b9e894c9c2b72c0377322cb2ccd643934be0bc35e1e113f8db9a34e012f8db9a20f9046a9605e6c04ba0cbb63cf8de6349ba3ed80c0bf6f70577c49237f91149cec36fd6e5facdb0589815e1fc6d45da66456964457688a7b18e7e49c7aa24384d76d8e1ac6ad2e13461c2e4acca2ede32220cab59972adc8f46c1675d7eb3210bcf03b34bcb86e033224ceb2d7ba6694bb227e95895bdd64ed4a9acc2674319185b8783fd59ec11e870b02acba8e41a9d037f7d81cb8e6ad6a55116131c8f7a5deb2203c12a372ad334abd3b4243df4831e702635888727f90edd92f3d6e43d08025f5283967c88023f62c95f926e88023f8287f7e5b6845514b895bd6d499f87efd0bd33e9be4488219ec55ef2516fb43c7834ca87897dd4ab591ea78de271de7c9c3be5a3f2388f8a9dc1ea12a99265a270c5f638ceb32e7027c912a94a5295c01cc896a405d75d5848662f52ddaa4ea36092ac06e1e92457cd616e49303b37260f384e93d6e17d56cd8d09048ed3e43dc993d42394fc9d553c7049c72a1e3a56f5e870ba4b01d05dce52a00b7a2a075ca75136340a5e49c72a1d3a56bd2d8746c15be73aabde6739a05fc74c8f5b127aeb724b42cfddeaa874a139bc45f39b75e97220c3431549c828a96207314db425623a75a7e8d435234c936c0c0f58962409d3a9ab4587319dba5a941c4ba7ae1626a77503b365e9d4d5b2c3adba85e942e4f019180c387c76b400d5e1b3eef0d90f9ff9387c0680c367653a7507f02287cfd6e8d415c08d98e9d43dc0b7326d74ea06f9b64676c61e3e7383674801440928c2ac5c57a813d6964eddd477b2e8d4b5e13770a9810b1aba20000c1c0eaf1d0d39bce645c8e1b52fdbe1b532b4c36b603433ca74eaea7c86c36b6b74ea1ae0321c5e3303e4f05a1b311c5e3bd3a95b7378cd8d4e5d9bc36f439dba380ebf1175eae638fc56d4a9bbe33d0ebf59e9d4bd398fc36f573a754fc739fce644a7ae8e6fe9d425c00b70f82d8b4e5dd4730ebf71e9d4fdf1001c7ee3a253b71e86a0a8eae1f046ba22ddd685a6639bf14653efcad2dc47d73939edb00a3ceb360a1ca7ebd1156149e0efcec31f84071f44786040bd9487edf532e03e7808729c5a04c7c30070360b643c1c004edea41219d1bbfd00025840bd3e544d007001704d0e7022231ff50ac06240bdaa1f80872094870108e03e78f0e1a3deee00e0c107004e64a4aa570b0f3f4093203c7c004d0e10e4444602a8d7c717d0d50b80ab7e0b34d968139c0c7bd784feb508ad49772d4d8e6381adc9330b0c40002732c2eaed4e84d6fb33e0577725a1e1e27ca71641936c2732b24978eabd4e9360b44712fb2d090d3cdb311fae7ab1d324b72a702dd9f90d4b7abc861a149000cbbae135d422b8252732a2f5eedcaa4558d452c06ba845505b6f0d344902764e93505a6f762b09b54e64a4807ab524790296d490e434d422b81a68a05780f504fcf221bba1de9df32ce94197dcb02dc1eacd7e2dc1ae1319edd4ab65c96ff0a1c792e3f8b073c3898c6c56ef759e6b9da6a41219dd223786cf508ba04a7a9cc8080138d4ab6dd90c4a62a8d7c87b288901871edf26a0d5bb3d53f248014d874a6474117065a0330ca937bb2624c619ea9de1406438915156af10abc881d422a8917a81502543843c5392655149164f6454a45e2d4a3e4407204a1e830e4062389191907ab30f8917726d0208380e3acc4075c04187ad5e9c6b3a6cda898c1050af161d8ec30466d0e1324c6006194e64d4a3deed08a8573b0ee711811d60a845505aa4003c7076e8819343016a11dc0e478af4a84558b6de1ec7d9e1a4ae08cb6a91000f2695c8e81ab9390f402d821620003c72904805c8a9b7000f402d82639283532f0e2b87e7d801861fa945d01d72e038ce0e3838a41d70482732caa15e2d3b3c004c60d8e139980400861319e1a817e73848cf711eb508cb6a89808d116ab53029006552a4e6364c7ad46b731eb508cdd624888c7af0389191917ab53079910814a05e2d455731794e2d82b34910191520e7444635f5f6788d4dbd3c6e731e4884010b50591e05240001380c117280eec78374f53b5dea86ce86a7eae135743f4e43573f43a72343678056f57020dd8fc7d0d517a023404e870a82aa1e2a91d100ea36a651f04a5c652480ba9169147c00ba1f554b040e43572350b7323007beeb76fcddcd7d74a703a0d3f11edd8ef3e86e8ed39d4eea747ceb765ceb6e9e75a7c74ec7b16e47dd8efaa66e5efa54b72f3aea5646a3e09b744bce4397e44cba25dfa14b721dba2575030373e0957449ea1606b339ba8906123d68c3e2e82c1f141d4106d6a6835120f1850d5bd34d118461460dcbdb113eb23475ebd228787953c7d32878ae639b43a913221e8b5867a46df66a75f72f36859a65d15fcbd25f1ed6b2ce03a9104658cbde1515c2b2592784dc885ce70da8ed911e1a1a1ab292beb175e9d476b479d9be74ea3afc5646a7b0c36f603a951d7e33a353dae1b7309dda0ebf89e914e9f0db18b8c32ab895b14396edcdba7499178c82a75d7603cec260143cd66564300a3eeb321e300a5eebb21f300a7eeb3221300a9ed46567300a7621b1d5d8621ddb8baf35b8db2c70c15e7926862bcb58f8b911b12aca09eea232335dd605e6c03fa0cb8e600ebc03baec0bcc8147d26561600e7c03b231161e4b82bb5917ec035cecb0107024cb6364018cbdd9170bb32e16ee18631906a11c2b23cd802d19ffa0b08341fc0d19c31de61e0f9391239cace03898f38e43a77090549cf808bb5e947d279a028eb3d23fde13b853a3faaf728dea532b383ee58ec29c7e8603bfb2b05eb691af2870b77d440331f69ea680bb94c21d7eff0807f218866118c4ce9d10f0afe3672f8b4c1fa5671e52453b10b5daf91a8a85f490f8bf21b12aa92ce4551d18887c8e26b82b813ba4cbf7007756aaa8928ff2d3a9edf254808c6021cfca1fe114d5b1a153d7e583e0d0292c955d9e019d8297cf81855897bf4c658c92cf66f72ca96332aaed7143832ec14a86827d4b3847fe7d6e449edc886cb637250c44fe720237c6be478ef145d25db119f6b1ddba48ea58d59b116a99814cd801354a3e76511a259f75541a258f753f8d92bf3a201a254fbb278d520273d80d2b39c028792318086906b35e06631fa98b377435e592f17bef0c0ec2282584f00cee6a963e195a4e6d0b955ed983f04208a5e434cda651dcdd7bdbcc82835ca799c1c1c88581c09a5d508344608d316e469ecda294b3bb3118698b62206c517a75971ae98c25694e4b8b2be04e9d82efb662527d08ffccb0fccbc3be30969f43a3b80c0829508c94fbc20cc63ec15d1ca846a9764506c29645350821ec086127ab2604b4b9b46b6ec1c17a350ccb324ddbb48df42c4aaf1f98f6ace0eec932675a0c969fe9d87e907457963210b6ae79c908af7e18ce910c1e5a582f076c5766207c9d13998c7f5cfade29c73a3a36cbaba42db8cb47f785b9dda5cbc01dd2e3db0cdce16ef32400cccb928572271e16b2d9f8ee0277a8c09c784ad94c77e92e6ce685813b6f0bcc89e7e8e985b12f0bcc890d0577bb4b986682bb7c6479870ef1b090f7131a9c1078d03d4b87e0cec7d8fbc2d8782a70e7a5c139f14fa054e0cc7408b0d847592f679f65ad3d2bb8ec0d8167ccf2a9bc21b076972a2c84d6b60103898fcfde1022a8a5bf97653e6521f47cb815b9d4e0e066845a250ce49dd4b58a56690607b3a8bd34f83dc1c647051b9f166c7c6fd8d821a04330279eb61998135fea333bdd05e6c497aed58bcaeabde957bd5c171a8e339d4edc5faa17652f9b59d22a52ed3230279ec48583ef5f063394a58b8d7f5928e5b87bbaa715154f87283764b77a98f36816cb3008cdd5d5a52eb2a73dfb9ee11c998f9f8fa7973130c3f2510cbcd802583e8a01164b352db6685164b3a859ddb319dca4b66307195c671604d86612026c277d337d6421539bdadb8cccc7d9b1bb93a74ffeb03847daf689c8c05dd9b692ccb7361f6777240056763fec08b2189cb126cb4731206333cea2c69b919642e86ffce4f82c1f9e815cfcd8698de21f5676fcd9618f5d00ac855d1da4cf6227636520ef712bd24f221f273f76f3567725921f76fe383d3f17703e8fb341c63fee1cb2f09992274318f37cf09a8b0ec223e4087a0146c2e825ca24c8d98420413af56c5a4038fdd660f93358fe63c7bd215d4d2c03ac2ca4460c591942a64636cb0ce407dce53119d52865d9cd4314dc413d818710c2595b9575e12e8f3923dde8d465305662b12d0faf04eeccc3f70077187292a9356584fd86ba4d5cb8d1022f2d1833c60bc6581e96c7d8e206e462675b1c25da4ac5e7d13f501c3ce1c43f7bd0767a1d58759adfbe525d07e6dcced373d7815514e6cc733588d6cb957e75a48a55a4cfd7e1c42b8139b38a0eaccaa106f1c09c796da57a06c6ceade230d14eafd5a1edda69359aa2c2e98a3301faec4c2eae06197565429fd5a0a7a2978f88c88a23ff2cce9178f9a864ab384aace330d16e5dbbf5a7824b58a53d8b5df6981f2499d0e0fa6868c8b61a60b418b25af7b0c09cf98aaae02e9f89e7e952f704e6cc93ba792a7007fbbc117047fbfc05580811dc9337a4ab16eef33ff00e911228d5f6a2938afb7c4309283a49c1ce33e3501444b5fd3215ec7c86754fa575ef0a7c458d9ad7e94df61dab122222eda413652f9deb70e2b9af545bb76d8fdfb81a54aaefe841a4fac5ce6b5fa9b2acd33a2e38f1db57aa2e38b1e22cd19e3dc6ca24fb56b3bc2b30673e688b9dd71e163bb557047326f62ac740e24d0c24c29c78abcaff98d50772b10c8310b67a7d29915511e2bd61f940f496c074fdd71141ad10d61b5f18b2fd04a704eec8a358c80e8bed5c9f748c951065e52f7fb1f2bd61bb463138ed38b0e24038ebe532f0a41af404e634776db3acc3e193c0e0f0495fa9c258c9d99960cfcecf6a90115726d949354807e6c8077d91190ae6c877236cab9c1848dfc4408e3d3bdcb4ac639803735ed6e130d19ebd3ed6e130c928cc79c7381d9eaa9bdde5238e73f8277a0e65995ac9a7dcb55575600ecbea53a2ab6e6994f18f2baf582ae3f919c31d232670673bdf5b3e0aee64d8af8ee5be62e97d5d1e372409f1deb0d6d631cc391f597aad6398937538f32b15d6e1ccaa84a8cbc01cfa151c9a4d6451b1cae89dbea68863d566c6a80836f8e2cad0900afb610ebd1193fec5e43a5683b8aeb7cb30a43bc4e058a563d435a87f55a3abe57a93c7060d7a30a43a42e8fa55856213b088427584501d8262a4e0c490aadf1587c9f5fef53ed602eeeafa0ccca1ef24b8db652ca5d5475e896864d6b3dbade2f31bd24327cb47593e77fdf291e5ebc01d7a3e3f08dcc1cecf68f7545877d14659c76ac0b1c55142d47f37d96771e483b463a7a73528fbf5950a6e4494101161d7ea9125ba9e551e9863fdeab04e07473efb4a150447569c25d8af33c17e5dfeaa4146b232b99ed57330c77a9075ac32cc59a956aaec6958c7aaab63156f4494509863b1eaad80e31888bc89814898233f7f584272f51a3e818b7556f133ab0be234b4201a52050919f5ad43fb0ea38de531b6e0040bebd5b12f8646e934eabd51ef3550a3dea9342a051c978131e8c09d383434349445f51ea4539c7dc78185b09d31c6eed832d75feec439ef10b33c860f4e60bbad8eb590023586546d6fa3bc212db98c8cd2a967f9880a3016b3ef0fcbaba277b42c409de2a31380619feabea2232a8e60efbb22b350f1057bdf144f75f98c177b1f11112362ca6c3ab4ea30e79da7b12ddc9f1502bef186cdb060e64895719b6c1a85d3671d14ad61214ed7226de559074b88b1d1beffe8141f2d41c6e6b0ef4a7ce89d8bcbd0d010122a3eb2b2867d65ecfbc501aaeeed3d51bc72f90b513c32e2a3268cec65334e6f481b1143a633824698ce081a621ac5364aa72ea5d2a99bc3884eddd34fa74af63dc71b02df867df6b21bf61d76171bdced3d0ecb47231063bb3234193982157b6fdb1a1153a6516c799a0638b0ef5aa7aec7257b0183b12d7fe9e520eb704ebf65bdd4f6ab97b37d754eb691f8b08f38487cd8f75bb66cefab38476ee16fe1af8eedc7ee8deaf70b7fd8a1e07fbc0ed529586fb428e6d46cc21243b8c24e54b56530100966c2164fd4a08d1fc0e0095e6c626c6164a5055becc9f2d112597061644322d550ccd31d3f63ec67ef4d6b77a4fadc6814c67520e06e8a91e36913c755eeb193f5d279ee9dc3305895340a036a141627376a56ec46340a7bd2280c8846615d5b6914d6fd178685f4b13f319dba6a5b79f1f4534e39e594f049f8d7b58b1808768b0adcf53eadb451f17123d259a9ab1265772976d855796e58ec567781b6ee95d15d1e63b1bf35b0c7fac0340a7b56df1720705f2cf62e82d8e4fb279d8a167b50a7b0637f449dc29ec5d8627f5c3a458ff56909a2b0d87d54588cdbb018968519ec716131302cf68e2ce6650d8b31198b9d79a78b96b0d82f29b8ab63b1d83db65dd445454590d2572fc7550cc3ce3fb0ead3471c186bac310533f4323dde61a63d0616372c7c3ce9b092a8c0cd67afcf8ebbb022cf629f5de98cd5595f195463302aa39b3a10984e03af127b7f188ce94c63fa9c26d361675553c7d70343365aa69b2c49e5a4949e018da25614564a0005fbb624d663a5cfa15194d2f3f4d482d36e4981a3194fc3ee8979b19b341fb722d0cebf2d2c248b4e61f589c91e1b9cf69f4e9675db4a1ec2dc5b9168677d611808bd45050efb3cfd5569a3b0ecb2abf2b8b7a5cab3a5eebe322c3d093edbba3745a3e8b5eeea58fab70677bbc8d2c3fab2348a3eab0f4ba3e867191cfd0b0369b4743a152dbd033af54ecfa4537dfa1e58c8b3f441f3d79720ebe5a070b90a941a1dd14764a915fbae388183a536581a06e650fa4b0a8e622f0ca4b469c7be7275690919ffb89dc5c247e6172377fdb8ebd7c99650c2f31661fd508ee5035c0ec3f2dfd01b53e6004b98018d1ccb4357bc78585e18cc037e02b9b18c795470ce982d2c7c57f8020bffaa559973eef3c2c23734edab2f0b0381f782eb0a835848642f29b8ce32b564cc396cc48c974fc27a0d33dc95bdcc37f00d3728febd67bc21e16cd74bc5f639092a9f44ac72d29a047312cc39978abdfcbe557b3b62b29579067e6f469e4a227941f24b9c5449c4cfba04552521c461b678210933c89cf105235512b21af56365eeca4272d52d99500606616c012c1f61e183ee6ecc62a759699465a966a5e3814258165ec8eaa2d464e527833cec8a1e91a7c50e32f1648097cf6ec4081cc208db6884ad07bfc86eb236a3c9583e1cd36684314346392d1a2985fd284f8b5ef4c2322d6a1aeca73196691b299248b01f8935deb824753412890bcb2f71a9c2f2394ee3eef616cb37751534918606f6a3e92c8de29f69a3897aa88d336d98f9e2c50c305ebe78397a55bc2ccf8977a5dbb07c68069291649ed8d0ecc5f2211f591b82e8348affba218c51ce3827ec375f4318a394d38a9605fb5951ce6959945e58c430d80fb3e875615896695bdc36d86fd35ea63ded6d8f54e222c7c17edcf64a25ed71cf64d21e4d4daca981fd6aba1b2de3c89143631da7783ac17ea7d7dd58b319799dcd66e4e1d88ce0c8b1197936ea883a74c07e3a2809e7c8f5ea0db25d715012ce116adf87b00da651fc67802964dc990d3e5a84745446f0560702eb948a9d3e4440aba503d6d9caa0956a655b8955adcf2ed64e76f788212be379d3815516bcd58160357494e54a11d10790185225b15231cca93f6c7d47c1657e90c5473e81e5ca9181f433de207725323816630a57220b9126ed5926838b096c7f1963fb199bb1cf320b19e22ec7b190aecab3559ebd1c95fe00771f18db7f603a75a919da98315e2052a60251681acbcd7fd23b1cc7fd54200a44cae8b090d65808c3c3fad7bfceeb57c4059505b928761905e6f44eef8cb1fd1b833502561497b9aeebbae845e9c3b2e515bda12229ab116f8a2c41cd822cebb477e559b98e7036451c67c446a4081470ac05dbd7fbef4a112c847934ea74fac128fa1ce0ce2b82397d48ff7ab0f20f09b4d65f11dcea3d7159bdf487a53e58c98ca2e7edc8ad25eb2baac2fd7845870217ed614bbc291f172e534af939e79473059c11f4fd288f76af8bfde914ad8f0bbb619b8b46b50a28ed226fb3074e8bd2296e28a250028a84a3f80437f9bd37274b79ee846007f4ce09871d14e461400e9d9a7f59b2ec0481397dca71a72041187575ec4f731b51b250e97e1a2515c0698d6a3acb3c2efdacef2a3ec1ddc785c8d3c209ee72192eb60fd4a9fbb488f2d329f93e95a7050b61dbe71a55867bbf5c907e5850a8ff740a62db04cf7a161819ed143377e228efc4c3ca95ac0f8cddddddddfdee6e276cb15929f2ca0b19b4800b1a67ae70852c5438f66181843dc13798a1a1a12754ef271e19111060ef0f2682bd315c1b7028d9cb5e387bb90c18c4e0b097c9f01a16ce70d90d7878becf8930f055e1022b163ec2531730c1c27327174cc1c2bf8a230b8faac20b165ec70a30163e08cf15592c7c0e5a58782539b0f03d3c6182858f7285162c3c952f2cbc116b58f83754a4c5cc952d5eb04861e15f964ef1d10baeb0c5366f445edc02772edea079dc0c7410860a1ce4a00a5880c28e2a4ea753a3deb9a77a3f5d29c3888c33b4f0c28425acd4e0e64c1653ef4415b57dca0ccdc8f8c7b3828befbd283007a76f7da5b26a50f6f920ec6499764aae0ea78f7dc1e97926d73c06afd35b0127ab49c52a5a29cc812756ddd35908c740e0f95c947e828bf53e2cf61d1e361c63ce09e19373f28f78d91142f8be519ef405f7ce0f6599cb46c03d08215b249c2396857f16d6db030541469fd5dc8c3246da29eea0bd1042389b76aad27b9a57a0d4b23e507614e6f039d8944b9c31669a45e914ac29681bc9a2740ad61448258bd22958532871b344e24c92b499341a2df6a6459a1a1b1c16a523b03ae69c2b3fb50d097c7cb62129e2b2f1db76845a1f1c5ab6119145645b564ccb6263b2312d8b8dc9c6b42c36261b734e4b3e46c9b3072cfc8bd3b29ae01c79eed42bc2c23f296f90f5b3be94e4c05f9ef410a90e0ac51324f2ec387a2da7b906f77e4f734e4b5ab153cca8773e43cb0f6adca9d6e4e7cfcc8e0acce9289b158e73a811d77684da2cc3aecab57b055bbaf11e674f756c8a290e368a2bb8f00528a690031cdce0940530a478d24624dad82906c30222d8fe468b5462568046161518ad21850e2c98a0042184708755f15a67af66fb08b64f592003dbe730b69f6d449ab3104208218410428875ff12c203420e7b7958a8821958188685a72a68c3c2158861e1e9396e8585145f8099811096a08412e438b34566218410d232b8d94416d57baf0747695c1952bd2b81ef3d74eabda121d5454dc1866d326cdfda8834354307280b3f2d154c81022b8385976386868694e8eeee264df0421562a08535d22843d5386c378dedeeee8e1b9136c35ecda608f6f2f062ef0f31b0d8c008169e96c0c27351a861e14f29f8c2c2bf04161e497186859614dcfbfd7b1b16eac0420674aa0f6110b873c8504cf14498343e60460a2a0bafd329781b20847f95aa1ee420d800d81ec351c1c5ce6f4f70cf0bde29f5b0f0f30f0bdc217dfe65813bdbe7df96c705ee649f7f5d58083df6fb84207f1f0f76e2ef0bc3cea3e04ea9464a2f5729976d9d3ca9c39e59ddab3a8d52691dabb05356b14eab56c7e3c5ce93baf9ad43597a7a288b753a25ce99a79d0e0632ff3a94959dd6113d95125445a4c455444a702a12cf30afbd1ae669df30ff8ae0ce09d5a8b9a1c1c9c7cf47813bafd6cbd9323df8d0af88856476becf2ee39cf9adabe19c79adc3e19cf9d7c160ad8e001676559e05a2b60a10673106324f9f0cf35947a4c455cc33dc01d87918f806eb3174cefc9b31346a5ad6bbd5fde8340ad5a8280c649ea7e70ab887e5fe4c2ed8ad2700fbb46e7d3e0a0b613b2d98032feb38572dd2f6a27f459d8a573a75e3a577180843938f9e306327cacedf57859de767852f6aa13a351f43a76a1e00690f38f84b392eb1b1a3ece8cdd75c77b2c982bb25dbe7670c6177e260ff089e337211d6538985f40c32f9d83d1870a7394f9b8efdeab0eb3aca5ecfaecb84bd642a5dddb5b125ec3c7d75a59b30cc4b4976a58eeb6cacc09d1a25339b4b5e88e335e4afeea846c95b4c70a4637fd229edf240644eb461afd33c7b9ac9542f10b4a567a5ee32e24ae74695aa664de7699aee466baab786e63cfdb624d3061c5b8cb3366fedd9bcb723d6af6a734b0a22d93117bc53d8f51892a0bd2ace75f1b49601d1ae8e526b323d768a85b035d5fb63634de74cdde90ace24e54dd7230bd97ebd3722d775d34b9dcf75d3b3ab8ba5674f337534a58a83a474ec464a951b65536f4dfdb1b134f55e27e2d9d2b963a6aed471a57a6a94cca8f6b6ecd9c5ef41d25699815cbfcf5e35ebeeca2a61d2a827c1611fe0987b94084470c3c260790c2258e96744c4d0912429703e3f9aacd707fefd551feba45f2a81acf5f7f9ec91eaa53f5a91eb59562fab7b4f067e32546106722f2bcf0ce4d299b1755da70277b9ccd5d146cdcb2ebbb6974838a55aa46dc9f673f8d1a91bdbe7813bacea2b61d2f7a1775e91997e0c606c5f07877e49231d896fc8bbfc7c43e6e5e9f64bada6594d7bec14764d3b37eaca82d34eb593b4709f1dcef679b6afc3d96a91f7c8f30d8b1d21cd59df2852dd7aab6f14532ab8f8362424eedbb10e87f4674918a9722a9bcee95f5fe050f58d6aab09ee3d8bdb03de85806fbc61d3a8bed69d183e48e23035b80ceb2e0622ffbaf864909fdd7c324879ad08bdecaec32c6a57c7f651818334be6e9e37396d94f13d58c499d9dac8f8c7955c3ad596e18e16eb5adbf40e55f17974124b279d68147c555ee182bb32cb150b2fb354d13bf430764e3f7638efd2bef3b37e3530b1775ac55b914ce21ca1369eda5885786fd8eb63a3d63b962ceac242a211ec8d5bd8775a85bd9a2dd22376ce7be4c2427a442e0ce45d72890dadc862fb1c5ff72c93c1860b2c93c1860aeca51647feb2d35ecd32dbc7bfd73559beb1fced25c13b1ce7c460fb8f8885bcebb787112ca487ed1c58ef63bd2815d83ef37d4dd8be0d8dea0d1c6147576047416cc7f8f72ebdc0bd9f6943a31a07db3a3938a0513d34ca87465131b8dbcb671e8de531b430050bbb27f43c1dc401ee0d55231ad56fe24c94ee47eef87d8fd2a87ef63a2a3ee0e4ab9246f57dde7f1ad53934aa4fa553542e9546f5a358ee47813b4fd5a732df10230ca41fbbb7594fdc958d87376207419deabfa14e5d36c3f62592f864788f753e19ded1135d2c0d968f9e20b23d34aa9f74ead5278d7a43d8c67ae533abbb64c059bf1cc6880f8dea5bdd05b2f75dc257e49dcaae871fcd5af549a3fa581177390c92772596c9bc3f38645093f3489ecffb7d46de1bf25c718ec0d31b81a73f385859ef3b116f65795afe3da2ee5969547f76ef4aa3fab27b4e34aaeb1b6a545f4c9ffe80bb3ab6fb4658085b1db84375c0f53956f8b2685c603373ce869452319c2605774f43c53c2a6652fa863c2a46ca77022fd79818f888cb097e602f7fb9720233f6b2193a38502ddce532dbecd80cb501d71707ceac8de50761801216f2388c65de8263ae34153b55000b4da0858540e0f8dd2b88b45190399ee37d38522a1fe9af758a045a3a23968cffe29f8544c7186384dd1fa8e2307677331739a6fa10aee46b2d1977ea72b4cc29f8c746bdee73a39eedacdf3342c34bf9956dabbb672df9193724483c60e5bbbb325a1f79f8eedab6ed7a441ede67a391b6abf91e1332d212608411c618638c379eaf4e8cf1952865c8273eacb7f0cf071ec27377e9b3f02fe37e0c495a7098b4aadfaaae4147a818e6700bbd8e3fd04117319d621d74e962e127999e663ac53aa8411616ce36ac2b4bac5fc789a7c7b0d36338b136b17eddfa757eb68ac7deb31a14b432e24b0f51340e934389cb7c29c361a2e9d8636512543a63b10e275e1d4eac384bae636ff29ed523b2bfd7f723ee3cc32ad38368d8838c986c37d5a013cc814cb46f3508a50539d1128aa22cbc4eef1c9b60cfea11464c4acf7e84e9d89b64dfbed5234acfceaa1b6402da379c68ea706265ee58473acd57aa7e5d6a8a6c6ad0db82a5cb96a28785862375ff3e2c38b6e4f8e92b958eb38a045f5344f37706e6c03fc8884976d3838cb07fb19049e93435e83131bd54839ea932cc7935a806bd2f2f0cf6050b93bd77c6c293baabc391afc35962bd8f236b13eb7dfa779c26f4eff4639090451b59c83234a4229de6464cb85fbfae93cee43ae9da62214d0dea2298037fd5de82e5faeda2abb16c814565cec0a2327de6d4e9e8668e0e0756a6cf646755f60b8b6cde0f320a326252f3eb41f0450a50d19c54838c98906e53836c4e62c29d54836c6a736182baa62af15434fdc57456997ebb8ba9e2c8af54f34ce9ac2a551c59951031cc89f5523bc7c01cf8956a9ae93016e23479aaeb4f75dd74ee464c482fbd54838c7096946e3a93d24d35c828966265523a5783201698035faab00b9c636099ae0cabb05f8805ab4718b1eac22d47641587c9b76315a789f6ed5a0d32c251825d075661b5c93c03851454a0822f43432a1854d42aed42d937ecc22e167e87178e55300cfc622104430434000210c80c0da958a5d52384b23a74fdfa85612c3ccd0e3804101d59f681bdb08c85c7bac94505dc8503c6c27396c1d81b8b2c8c45f04c47f3856315a67af6c23316dea259c5b6b942c63fee8e31162ad1e1ccc38046c1633f96763e3f3636fb8f8dcdae9d27a517a814ea152a84891e05195368686604614002f3144030381c140b47e41151d4851f14800f97b2565c210bb428c85118428818638c21040040000660301b34003f680d704bfa50027063e8cff5db507277009cc9c05f7560ae491eda01d5b800002e2dbf7ba603d6cd23521ea4624119cf0ea8a57b2789e61d9500c181efb96acabab0d501e79ea0a303d6149dc8ee8eaaa953ae447ee14e0c41f6697726d546cda7cb5c21739cbee00cf93eab013bcb5b29467ff1a3dd5f41c8da3dff35f6071990d2b49af561bc2c21610e2b70d2675800682c56e0706f886b5ac0a384847156ab35c6a89e6c40d53826831fa2b5b99d00d63cf186546f4e773da70a595a19a2431c032f04d8ddab0d0888214a573b574ea2dd6358b5c343c850a6cbe896fb42e82058d241b6d75b9c311ea06a7d23d75f45c840f97b666cb4ed7f8564301e903133c679d52053ad4eca121f51e1454b15f5fd6914d967af6035cd83d9ec000287b165cc35e4ef804f5e0ca19bff552a6e792420d8bf4a3d728101c72247882bee00a6382f084b811972cc71bcd3cc900ebe13b9be4eeca2e8683e9c0f573e917cd0a2511ef5c9aa99ea9c910a59786709d685270e34fcbe56e297af7f7e3dc2f534b4decacc3ff4e982038c7b8681693349f314be39939a3180330409ffaeae5be80941eef2dbdcca6ff4dcb8690363f5e5b62f52f249fa5fa1209df95f86729051f4816b014c0f8bb479c52b0a05f8ad8fa93e28322206b94cb647df0cc9231652b6106bd7b181324dd0d4051f0733b04197f02179ab2499dd0c148194fc7b878da7544c1bebbfb530034545e5fdee8a98e46ce2b7b03147c419862fb52473edea95024e1ebd10722f4a20a85da4a41992e40b9df2f20271182751bc97f413e4b5067a6c869181fc2888f5a89490a9e9fa6363f8994e8c254b459169a344ed8385f52bf4e7ffe7c8b14e44fcaa20f32c348463033267208264627c016e9ccd24711db5d62fa0d9f2d50658d29c535bc57893eae92e60b08bfb08e9ef440f10e6f934817d83076fb3411cc4dda6f4cf2ec17ab89b3ce5a113a7e1a5ea7a3a5ab09f6580be055cb5ebc7d0b0648fc69d13696054e89cd95b5eb48337492b6015eb4782acb5fd789e334e80ca48d362b9d03128074241bb79a25588384e927deb53938881a655cfb75c27e60dfd855ca6c259fc8afa394252f555fd02d6074a4ab48b2596a2712805dfc8770ae80b5d7f1ec5d5de568f8f4d3e52efa02a92ec44bc6582bef36ba8c805abe75d10614d0745780250f5d45cacee554fe9c60453099a4d8602d3822e05931eb0aa715f37921c380a26c3215bd1e39fefa99e15a3efa78b48e9c56a6f6ec716c4250ef4dc26727360e0ea5f7e5624af42ef50ee38bed6730258bcae7f4777946b751df2768ff2ddbdd502c36868c7639af668f6bd0dd2d91a68cdbd921b90662f42ea16181b22ce4060648e9ec2a16949ffb528622a1b694fbc2064ac9db72abf847559dd44b521db857e82d141c40bca0751b16adb7eb952f282a8a477504cbf0fc4d10018f843ce21c2889ba009ea79cae30bba2fe4dce1adb5ccc00d10edeedf20a7b5235358f6a1c1aa967bd4588311a4bc643fa5cc204799ec9c88a0a844529711717e85bd6eaa1a5c646d8aeb3f042c55f5a8838db162c1f7ea18741744a7e5f82eb6187e105442f2d89454e08408834d9231581fc987d542468904e8656c7e227a6fca31588d717ddcc622cdcac18a98f0571a1ac7feffefa42be9afe3137845c1826827bc8cf5426a55ab67999af134e156786759880d88279dcd05bd1cf546a339eb653650a973daad21b283ef1698249dd9f275da39f1ea0bf264c7b112bff1524c2dae999d389ab998d5d30323add8e794b794526e56965319ba422ea131cf3c2926be78ccc56ac4dc110a5d5efe85dccfe75903c45b032c506201737a40f6980c9f9388ee0fb264626e6db85b97af784f335ce74484e4b5a026e463cb6a6b48b8105e4c79ecb8791d959156836cf00f1b12c0816d37092be98a874a68222dbb4e2ab544b4e9ab42950bbc71585a4e56427061fdce9ba4011986d9cd8db53acd420317289994aeff06d5f4a9f63d89b46197ca8d9b094d286e5832297f118d428171d2efc7bda1dcf866d635018d78072c13c31d23c2bd5c8d5a1f6e20049fe9d39274a59204d0436e3e7304408993fa7bd73e29d2128daf570c61d67c487f89ce62ec39950f292f95add8d2852dab2071839301d2f81227843da7f17f0b171b9304e09f1bd68c8ee14b9c73434bed9a6bfd254870bd467cb65e88ba845d90e57e77fd4eff19330d3247fd9241ebef21c0bb4e557084eeeef3149e35672fc4a34b32f12dddce15febee50c988ded143d3a8c5968eb429e2ce8ec128d211c09c578ff9c6175f98b801f6864cb1978934b92948b29ecd0ae71753722cdcee437f8a01439c46a6e27a10150fa8b6807c7da623eac3beef70f1d2639b764c3b3203894f4b67760171fe4c23158f27bec5c55f26d4b09891bcb402204a7b9bbd94225440900289034196d935e481c6d38c3d54a7c4508db9d2e4d1d90b52db3e686c65010ab9f731cc608811112aa782fc34cb88926bd733a0e512d7c8d0dc3115e134732ad09368367723e675c0d83b5c85790e5ee2996a6453e2d8bdd8d6baa8fe76a4eb3c0e9d4335597485f1ac1d78188fb6ba4c3cfc9f672b0d10d2186039920281b767387ddd257b3127791d128c590be20e89dfbef2a5012c58b0aebd61f495cc0d826e40b7b7840d99ad7703412d45e04e9e524ee0e9d9f248d0e46ccb6b49aa6ff53b92f087f5ca10c805c8116290777891fb8a35ee7d7be988d854de8158beb67dae16adbb94c47b5d3826936b5e467cab23cb08365b322b2d48674d2f34e1c89bb4fed568f4cfd6bd76246d7d692eb1fb98a0be5a032d12c08ef2d9bd31fe46b4479e7583592483a744d86fa4d7c5e30d55639834992778e8abc8e29d0ae26cd0e748025bad7e5958a633e58b65516ccb94095c6a8f49e476e0e30350dd29ad46e1ff4d36b07c25f90494a2f5f58c24c51095f3a2adf3bba7266af0c563d21c00345b9d4de8965dd5c073664bbf2b15ea65720454cf1f3f9b98cb3352b7b09ec0a37ee0ad13234dd4c4e92c48c0524b12e44564466d421f7b810ad29592d243262be8af59b169811ba1853830c2d134668c44517867014cafe3e0327b2e4619ec1ff6e65753c498453b693183661a97dc205c6f957a834abbde7219d1ae758ca9f483a2281902b7590e495a18dee8824a4f6b0336fac90fcc254bffa11e33a1d90d85472e350dc82cb0f07b6b51c1f92f3a6a0917e51761a6997c8003d822e07237e7a286cbe309e9097453daf4850f81cb03234878c1bfaf33f4a191ae12020f1e87577531d59879080dfb4279969eff7445b17138c32050b1d6f7b8c6b97d9738ff8bad7b3269d463cf054b1848d60e908443354d40072a37b13bcbaec6dba94dc1d333b6ac5c4522a85454e0b11b0011089f2053917eeb68a84b1817bf63e91b41de1b6110c13e68105a2983117064606307ecc4dceba134088eea89a603c01a20050786e523d55b23413d2572931c1d77804996c8d538b552bddb3d66c5229f2196343f807d6bafa34f93254140cc90c65c8cf81d7ec701f4c15998cc47ecdeb898789f05d40495b7a4d85f6332e65aece98e8f9d3640c5dcced3d3a9b0d3faa2ac5b5e163b5bfcd23459f1be932d79b4faf26f013801ed4d045d9857b25f8963be1c6f3c526c80a5362264238a0abd8b0d1a3f8d1286afa430faf0e6c6b55d1e10435595f3e30e7344a4da76d04e678e6e89166ea940bc0035d3ef0590168e5ebf426f455e10adc7cf03412a9a1ee96a7308e4fcdc8017d1aafcc9060573b37ec1122b73f9ca3437d163f492abd432a88696c0a3b0a2304b40031717c231d6c6f308387744958ecdd05816ca2e68643375f7222622559cc45fb865fafda11d70d8b159de15d6e9b19f9430da32e43a5b1b5ad263342035d4567de77d81f2cb5da845e1f7ab52ed03c4313cb5bd7e555807eb93c304833eeb45f8c043fa0282460184fa15d398dea08eb745f1ae8b56b4d9403094676bb34c34a6a306ccf2dd93a5978719618eb9ac0e59cc28b99161145d6c7f111cd2446cccf99f12bbbddb913313573fc9c73a131643254442dff171cf3b397de566f08667d7193b029d45b4d70acf1345dfd8a82d095c6b9f2b3e19d682686aebf6032a30a54bb58571c86b1851071c52663e5ded1325e8df5b47838a05beaedea35116b26f4a642f59fe551888311a373439ac14ee16cdf2adae83af485bc14c1d7d0b5a7aa17d37cd5d25b000d4ed9d9002a386d58298d930c0fb2fab7eedc0cee8b6748fcbd18bbce6668556defec9784131dd4e7943bb500a55a793440f0f5569d47056fca3bb6c5a13d19ed7c6fb2256ff9ce16bfe78e6c4413e4488545717b330b3d9b9b6891c581a7a347cf6e21b5551af78b1d5a9324effc32e5507a3edc9ee95b3df13de191568ca8f6e8a89f92619c3dc6f81dcd9278317fe19e906635d1e4b1ec12de7c25450d5834445b86b677ac6bd76410beac2e32a72ba3e27111afc047f4ed5c60d6e639be65385deb2caf7ba8e91c0872375e394dcad45d0daca19d5a7d8ca1e9bf346b066bd0a912a90cd54ce4e8e1207c39a460b28655c957480e889be4676b3072444252ee9c377ffa5109eae9ba00b566e82cbc0fad090350b59aa61c346f0f7ce6102051975af835b8696ed3e719a19bbedf2e105f2334593f2d106ed455c9000da6c58062a63485a0ccadb1588142743730407737e9be6e9be76391f3cb309e68687071908c27f0e6810346f57753dba90301adafd81a4f78d75ef7d51ad9fdd1e99038e6c900097c3174e6355477e5549757a237746954fa6aa970970e0e3910d1a030f4cc78f584f656ec58f629542fc380be5ce335dd65e9b259c1574201b9afc95318d734b0aa4641c80ca17c62e5f673146f47bbc80223cd5c733d4a35654beaae3127ddbfe9634ab9e61ebbee50b1c26d74e720d0e34a6a8d6a16adf3fbd0251827377a3b9e4f46d3884c2bb4a7e91cb59b48bc8032b9430abdb9c01e158b27b2c009d7b9cdfdb3f5b3a5c289b1d52121bd84d0dd81ba1ccbb288249455125b58ab5e98ec8aa162526d35eeb1e6fbebb4244a46a41d294af321eced0e482179f474dd1f9d48ed767f8bd4dfe51f3ff737bd7e927248f059fc39fe489a18e4bf221e05477f11d005abd9a2be8ce4af410fb1316127807e2f8ca8e5f228aec1b176684265f5ca39784725455d79178c3f414fbffc0be9b50bfe1ac6c9d2467c52548e03a2da23df020267a3bb1915797c4fa3b3bb6f05c69df5b1a2aba3924c29a1ee3e3498a95272a2adaea659fcf22b9718834b4b45306b45144b5b83395d5e5584004db4a03ce774057b467e23ab15f2371d7cd3118fb5b309884f8f0b5b6f97878b9cd6e57e598246ddf158a1be7a33582f5046534ac3b7c25cb0c6339c48e1d3c9b8bdb6b0dd45447844a727c13a0347d2853aaef95774c8b76b48022401734f82901321b105e5c17d25eacbbb8318a1947a8a198f268d88977a7a9e981197bf562d6f9904f7256a1e84ecbb4c922386603aac07633c40c4ca471a42234b87b254e24354f21b0266261a62c9035bc0aaeb850af58a6c1dcc75004f9bb688538a6dc1990773f6cc3970b01e103ac191aaefd058c900b791caa6692df7cd09e51293c62424506c9d7414f0e9fcfc1f6c9ba82c054c7932f4169a1a051b55020fed3e443b4a8a846f9caef5f30c6540d2e274a042f631d071bd7526b4686b45505913e5e628a5025f94dcd0c173ba3513f50387fdb7c6887803ed1db61890efa92080af4b9a06461fb0f089afc01a85219e37f22a29a705bb6bf9ecbff049b73a5971d392f98610e3c6cd04ae679d8f3ed865dc343572eba637b06f90ee1ce7be0969fba1284de86354481e68d34205392ec0de2f3f9455338c41f4a2e1edd5d8dd5366df2eaf2901849ce8807a262b261d7890830f75667f569111fc252eb519ffd907636d3266d98e1b6ce34b18302064a166e25361a667b4badfc9e5b6cdc5ed883e3d7753f24788b0d932b0b862ac51b0cdd254b8241ca4f1d1b07007fe4ffdfdb4dc00c7d797c0ff5532e832879639f177a2041cc306caeb6b288dc539c5bf65e90a5ab1e5f95a47fe5d16875ab06e03fb0bd9dfd7a4e790c3bbb0b435660ad380c4320c729449bcc77acf260024d059cd904fb71bfe549e55d0d26afe5b6c9da203a55f3ad3bdd18c9b270c6050ae1a2f3798ce16158a15c58de9b22681a0795b4f32fc158008c45ad20a3f28e36a09c4cdeed415fb112b146dd9a59fc1aa9d5038042abfdb4a2bc542862f4cb88f6b24039bf1c05021c2ef560a07ca97cc846d4812d7d75e1370f01e992748e2990f3dd75e1b9ba5f5f47404c475c740649d35a3dd9037721399dc360ce042d9f0e944c0b3b308bd7d9a975aa14575a82b019e424219047fd0986ce75bd9fd2896e66eeb08718d9802e01930cae93b9198800f8ac5909ace65be6d8818081d26eeacfd531f8159b3c7a193f39985cf0d18a8b37374dca10e64ea61219e60df10d9e9b6a3c4b1bfa580487279cbb2df8103e7b33a699ac4e7340f41c2830ce410aa33a39364335d430f148d1a2dcd285688434b040803ca86ee10e4f47894cef36e59f934d5454cf1d6596211b8ef5c76a9a357d7b1e1e6f6b4f22b875443bdcf511f7d73d1d73e307f3ef1f1baf94b4e09742e91796797d448844f545d1916a5199599521ec6ed251a2a275559476ac52e512bcac66ef30a08964b60b74f338028a0438420ac6f5dabdcb726505f0bb0d8956f43e415c660b3a5b98feecdc00ba26958756dd4a548cd71f90a2b733547606bd613557204f94d5d14e9a984eeaf076e87ae8d2275d0dc45cdfa22d78e544bbecc94beb7d1f86fd54767b8cfc395ef186e75cd1c0d8d70ef718d3c5c6ffd2b43cdcf77e0b6883dbc62b3acdcae79238f35def9a4d96f5a7e4fc5b34814d1ab26071e8b13ea086266347a669ba7580dc5aae067c7a91a2ff3c61bd3e5f3b9c74ed3e35d0b9883086bb7174cc70db67d4cc5ec45f89675d65d778c8008f99fa48b47ef828a1535c19f4423827c617b09fa5d4d80e5a14129edd286a70bd0d802903ef333875941e3665986eeacf49dd5e78862b166afbe5ffd94fe75b9f06cbe0e4bad01d2d53d801d423d8cdf7993cb420674820ab1233385016d08656eb75c0dac95e200b900879f8adff6fb4005c4ad46b36051f06e9d9842a95bed6f0916a95095a5ebada1812018b421dfa680c19f123584bddf25fa5fcbed5a6bfd4e6c54f3c0566fd408d3f27c2d6788039c2156f5b1f4ee74b658cf2d2a558034173cebdfe5aba599670cc74449cab6485d06ebcd63a8b610fe19da3a8cd9d6f1c883068688094e6bb28f71b76e91797a31fde3ebfa44bc21b5ca873c1a293722b3cfc908422a980092ca0a0feb5d8d833d99bf4c33637f1298a4404227dac306a2c4c805a81a087bad4971c01e5bd6bb0ef91a65066a68036fc1b0490a347265889c989c9e8b4b104701a1f2ac54768c1e36398c2bc39ca7fa1d9959cbab5aa57b86e1bc38e8d4a8929c342d6cf230fba4c096dff2c5b268a9f301d9dab93010e79c54c2e00eabf8a6125bcb1d8715ccf2a0b720185bd42161c6d4292813ed30e590fd7819206016285059df073adc5712cbfdd0722ec5716959695846590ffdce589e6fe8998e3a2c8eb85cabb5a91d96fe219167476fccc107caf6461148da957456717a43c1dc7d118563ed27420aa6bb1f0f6996c34d2297f64d05efdb7e70bbbfeb368460301f705dac3297d559ddc255deee3921916fdae8aa756d5b4b3d9b84ae5b2d3213834e283db4a949c18c3dee091ad998c7ee578b53546fbb2e8ce362480dc092e4c00c8f314669bc10e4bfbd222ab58be84f5ec6004fd24219e093ae33c6b77114c53e0373d121a15e83ae600551afa9db56436b2edb455336e3ac1f5e69363580afb4baab66a75087f3e8cc592718491f6884f811c53130da0e2685d36fa59b1f6dee3402a22630d47a131cd5ce999f30f4e9f0cbc03e2ebd460554d496841164b393b1165b32895c6ce3d7bb2c3abe6902080eef9eb4ff02d73aa49524b4b14493389ad0539721ba0cd56f1ad45bd1952e2725c5617b0662b9a4e8b368cce7453dd55e81f98bde6a6c5dba7b8b5ec4fe2ebdcb34e0a65d59e974315f55d40faf27f45ed12d61ff54f93c8d6a88521d229908bf0260e1e992fb899ed42360d52abfc7b0875fd9aacd548f2bfb72425253e3b65029f822c2a6c0d1d38ed779a6c91b00e923c99ec4cdf64906dc500433294ab7fb61cdcbff0d0d828f1d99abf2322fe020bf8e5aa5a501617dfab1bb347442cd624915bfc3927b7eadd33a31ac64cb9b768433c9f32a08d92d5415b400c064e7009111892f722984580e1174bb7569eb43005fac72ee169b8951f8d47f5fafbb85345b893882a0a0c2996ea7d401c6b8b71a73fc87026ade3ab25bd9e285b4354b60aaabdd542c1c5be2ed456bf8f7ea9e2dbadb5578b78b165ebedba518784a13de4694fce952dec7f51e9f8bf42e2f36bb0fe9fdd0bcb317a9d3598acea6c91ea73ce7f67e4c81a0542133403ba182da9bce15c1578eda7b9b9877d1600c776b5097c74f0d8bac10f9def9fe1ec4bd0f9bdfca73c70318fa835995ea895e6f3051621a8a0a2d2575a9c9b302221821d6b7143fe55ccacb4f4409710346e2414ab1b88ba80374d92f788f756100d9e1128213015dba963f3e61e78c8c051b77edc29c801409231251494ec2909ec29e803c3851a66a88d5a5c433239d9b2985004d48a479c3924fdaf1f22033ad5d57153f2873284ba17dd921ec25ca7c9b65319a80051f7910284aa902c3d3ba1caf0654c3efef148d80d17fe9f1cccd2a9e18e4de97d14251c012a162e52d52b69e05500e28697222944730a862feea3133d98459b8223fa138d4e34610e08f451403fa06bae9c34e9cbe0e27f379244a3812b56198a4908172d46d36cad2a8d09655bda74b47f4bf5b32a130f0bb4ab2dcdaa913495eba56f5492e1b80046929603ee6b010013a6b34a1a6d48aacba0bcd3e44a9d79a40335ab97e5a8af463e2b6a3c185079749a20d0d499c4b8174c8a2a4ba348e2203cc84e2c997d1b01dd25c1a4a3ecb0efd406af8c19794d0513e036445b8cef784f022fbb9dbf41220b696a07d69afbe0db052978ae96520b0df6d502f22d70576d74ae0ec60b3f3f75434621417ddb87a21def0231e8c51b0cc9cd4139b5756c237d2a6e5f1a0966c2ec82fd13ae1ca0c08d325d0d4e2b1e99ebf74d0241165b808b3d2588c9dc419107381a6fd307868ca7897226680d5c8620836e32dfde8f2fa8fd26d1c8f16d6201b12c68e3996e45f2dca248e20696ef6bfd87a8c4d7e564e338c8a9e5e3ab2adbc6703e19f64cea79954cdfd05f4c78ed908ce22371a3fab3ef2f8c20a6aa766d33dd806cc6c1da6bc80fd0dc107a166173435f1722aa18c04f617f819c99b56aa40cb7948852f7f61ed3721b2b0f6ae86bcd06683501896d0f3b9359d726baf070a6018fb6a64e629e721acba93c284fcd9cd08fed2147234053e2f31bc7c76ecf61f43447945f1f1db6903135cb41cd16f3ea92c1cf424d3df62afdc0f99623dcf4d8ac1d337dce887fd205928008daf2da2dc4c6c2db0fe9dfa0f55dde60c5ae60e7a35414004d369185cb8012b0d0be020b61747b3725f5a20e9791bc6fbcd87bd0d2a664ca631cb97f771e76ddfce8e0896e589a20e9199f07ea92b5068f1f4dbb98d09c6e969b04a81434aa6ce6f68128ca96c26daafee3bf5d8c9a17b6aac9239595d447944ff71ba5273f533f36fa6749f66c5867156aa3204d84f94919de34e3ce97011d70bab075b858a089f6e343a483f4e90e7ea8283e0302f6d72d6e461b541707fe7a9fef53fcda5d876d1da82360de247912ede4e811f82d1808a46b9690a4f3c840b7d96c60b6ab730b53ba32b325dcaba60e0d157c9f1be6b565daf40dcb8c1e1488c345d804d041b5912ba38a28efde178c26816c11e63b5a8bc4ab9660576e8284b821cde8319e2ae1d80c26e272bebd95fd324084b211cfc621bd4726cb176cc176db5155376068da07e682aa3213c0ec44087ce5ee86f756d66f40f5cac1dee049b4a2e3b46f1b1e6b31f24cc5ba110555882e01c89803961876a55b28f1ecaab3aa2ac6c8d8467788e7aa6e34e9c3c07c7e0743466d08d94e929958b184360d24d146dd1c95e4b82633a7b4c2c85ea4b7a09b873620331872067dbe5ab7f1208fc043bb4a1ee32f44fec45321a1c7641fbba40cf56c153b46da715cfe113ad7111a66c8f9ed326f74ef505ebf0af49647f5ff484ce9cdd92c41171210f2cf3cec215d59741300b20749ebf61c5c94e7b7c7dbad2e61100cd35123bb82f59448a2822abbd938fa148b9c07bcf332c2bb05f4061bd86e9df49c904529ca2d5c41ee4b114064a2be71a0fc0db9ccc9c8090db768d03ca1ad8022e106de4545a5d6983d3c20b684284824024e9287e42c6452b6068a4d4f0a47259a08d4d018684b55ebe4a24c89e648dbc81d63a60634ae0deb73fe17c083d442c176987989eaa288818b8a601bce54591d3a362e368a33ca6e6d94c1ebf55238dcb2a60cd494c34c0bae32d37a9714e29d1bea3d50ccce80159d637425d0a5ba95c64d37c596676aa08219ad871844d8ad69a7491393deb666293520d9d3f7c37d12b4fb680ec8c6fa395dff09d11cde30415b8415c2f0e6caf8de40009ed404d15f16d73f628c47c47323d93a268c539c8d9b6ddba7f78b15acf56d20071067e0e648e2af0b48c62eca2d7e683fae47585bee822b9ceafc3ddec2ebd771ccdde4a9d6b660ce42ab636eaeaf645e61ece7e762a43135f18b26ad0c00c4012ba24c7324e4585cf98382a8d3333970cc999cae9d3670f4380a604baf99b9c5d70ca06f1075e0dd6fb901164a9bf44cf92e7a0d6e121d00686c0dca027faa6bf99420e2a622e748af06cfc07a70d05c6e2df217a98483b061b6747e37a468074a9bc92c95f89d019c332a86a687d04a1e181ec91653762d6cca1825e3fdab6d0e8400fc6264ab8236eb2ca09a71942925b44a5196f54e5ceb9f0b075a39e23926b4cb109cb4a46ca682ab7c7692ec100fd6c11444b9a2795faf2c838ed80e3d93c5f5c9e6eefda77881bf84ae55105ef2fe00e28cdf6f3b1744e8c7752cc8bf15b430d9d3a04cbb9c2c4cf928efeaa2055ec5e3c37fbd0ac2c3fba290de0d0872fbdb0107e216a2f5e8e6205681228ae8557550de02a6b76c28cdc2198c4e2ceb4a2ed8b050b995227e13afe76c5acbeff0e40cf247f7047388d3b1e91cbbd87663e456685c33916c8c24bf3814467f4adbd98daa50633c3daf83b83efcbf877dbcb99fe2593854bc68c253f2d15c9f787d0797d8b736695dc2fc95526bec0d05720b8d3ef1d5bb709740deb4e1a0a01289350228087cc0e76cb3c4303e5f8535a1afe60b309a83c3c110337b3843ebacb462d620f3202f4b6a57342e9e906cd13b800d380f5dc8f98cd72cb07b26ef368ad09700aa31ac17e1ba290c25dd3d0a07064fb2e54a98197a1144f29427a6693eabafb6ef3c7afe9ec80016f5ff313951c7030935efb25ce306f83e9ca2de1788f4b2458e954b675819a49055400601cc6cf81756bb62962af0d0c9229b48ccc58665acd36625451da580e3bdc83210d97df402a7a1dd6d3c0a5c1e56edbdb4c904de41220555a9c22eb9a91815bd3b6ac432916e666022be718695a9f7019a2476eb92da7e3feeedbf40ffe7782c2de9c13c4695e095e5d5e19dbb8d1a51676ad84722558c94467dc15a73ea51621e21b071f7400ae4c422e868268f49362660692cbebb7d1a253830d8fba7660be6cfac9cf81923611da0dbf69717b88245c98db8ce4ea8cde5591372b22506ba839e7504e184f707aa292ffe1e25bede5646d95d0ec3771302b981b5867908f276ec2cdfa408df6a96c73a4368579ebe353ebb45cd09392e510cc7e8cd0d62288368302c1160a2c8b81c0bb33b80c3c26e97087ebad8f2834ecf0204fa503cd97220364e8b4055136aca315e5b50093538e3081e6085b7f6af582d86631a1e4214ce2c98c45fd0f4b6f63efdc148dbffec40d36df27bd2507254bce1378a196e4845915e0ca1d95423835758c21a05cf5e606c359c82e19aa89a44912c79d05be1cc30659a7c0f6c15e1f14a6bc47282ba2c1f0cf24fd81276df2337ae2c7076d2500411ad9257a4e5368bd51564af3ec47b3f9a17b8bc79abd88f07a26cf38e734037213d216bfbbd2278e4c7e23bed671502594656687e4f28406dd2161a8a59ca39dc9c82356bfaa76baf2227867b14941d852ec0f68f49a8976df0fcbd7c4a1194e4ed3b0ef5538bf11f4881246376aebaf255ebe29041f03ce95ece2b4e878f0df75e3923e06d826bdf80e6fb2b5893c64e797208b8123df3dbe3c818b2cfff1a143ea688920e08ce1884dbb3cdbac55eee5b70f6f23e916538c48c2f3a6ee60d0c16df12011f6821169a5d2642ec2fc361cc072b0b8cd82a04d7cb011297bb6ce54357a10dcc3b27ed9ecd73f84cd574572df77c2abbd2b3fb29645a802cd431f90d7f2cd7e691317cdb9e20e45f9343848f4f3416bcd2fb5f0e0bb0bb0f5cf0aec58d36c7c8e7177fd1be09cd868983132c272b8b9691c1ae86e5f07b3f1de5b40ea5dd521e42b46705cc4b57091a3781bbfbdfe1b5d60b2ca354d9fbefbddc2e3505150102850c652960408960022d5151a0eac1793b16dc73e3c7b2f3accd820f5dcbb4a699fc0c2472a783fe064891ece8bd2157a5ca08381cc658f31e558a96c05e712862baff81e19b7cd8098ee18250ebc258e565b5701df9ea115448205f98a8d9d3a8495aa6e619f34ef1e428613b254c4b75f05558ed7a6b51ef2b93149eb89e78c70982caa86123ac7292872988c36031923c14efd0855cd0e4fb94ca0123b1d888fc64b889f17a5bc60d45c481b30d2742a3ec6504a7d25c8e448c5af45eabf159ca1a48bdfe3b85b4060fccaddede25c1801be62eb04096e586a95e8a7e3ac8aade53c59a347dd5c10e459f06605ea3768a90e228ef6c1cae42884da1b0e529f510c49c0751bef13da523b74818c65735115d12427553af7c6e9152c59571325d4b5c1d49ac76132bc4ad0c6ff8c063b5aecba07bc11d1a0c7c632f350718c887095c1bc8a72372c989254e28ea01b5c00eb163a7afe78096147749cc809486a20c57f04905e08f7217e416f05fc7e91ac1011afaa0d337fcd4e176a6f271c8fac82c0643c815baab91c0a40a9f35620243cfc99e98c61661913b824e3403c61de5c33990011cfe04a8499d5c7cdad8033a0939a944042b8f462b6ae0e55149d35d5ee0212f407c9a8e6ab868768b595f38458841845f077f1a261689ca66c013f7341935697effd2b3af7abf1fce57b8b54cc15789242bf35e9a9f888883bad7464896dbfeef23abec196bdb4cb9946d9111fa172b46178527a8e0f2d8a6a6c45420737447938da7ea42a8129c322d68aaa6ed25f28ee11b8c055a09791309292f641a4434d0ef2efaefa2cf41c6be7b29a7186c9a0f35588be867b6395f55783e92a0bbc0b86d4a465770b7eb99d93b4fc37378cee5e507a280e994ce6d7499b3afbd5012127f6aa701e8502725e4e5fda11fb030d287a3b3b24cab154b8dcf1c09d416b8bd9e0973a291c2023b20f2c9efb6f8d13d63f2afb5ee59a042ab03172ba10c5d181144c4b0bfeabc6bcaea20dd3d87a1670244f79957486e3ebaefc3af4e15eab83e468419a789cbe2189c18a493637f029becac0b6c10f53b7e68a32c158c0f5e4df4c1e3805083374cb55e51edfcc7e625c058fda6ab4bb5cec0e49f70f648c67fbbfcb4a5a2060c720bc852fa90cb46443483974b92641f99f10f461da7e63871c3c1106d7e0cf18e68bc0323d38c20e5adc98da28a8ee26f321ff01ba7003cf9e842596b7457b7cc9500aee96fa84b180035826515c0c718cb0fb40961b4612bd461c2ca83d49453763798569edddd4d12ea8bd93be05c5f104f3930d41ffc8226861922f4b9a8759db680e023ec6f26f18ef970dd7dbc953b8ca992791d4fea6ec5187437f960c270b3aa239c3adefe08e85cf5a6318d4b195e6177c50ac8df605608b09d3b8646fd56509e8fbce2c88a016eb077cf03c55b0ef10d3b04ec769dfaa5f69d41f5ab6acca7f6982df66cc0cf4f7b57b61009aa714815986123021427ccbc0e6b9925b9c568c23727f8aa337b4363b74768fc7e7756f92aa2bd79e7e20dafc90607a11618cdd908752c2ae29d052a60c3ff95e68ab0caeb5ec4f64709001d746750571573466035eb39dec3ce445d73cf87ed2f3cf8d9c97b49ae75090da37f99838e13477c8adf3879f72565944cf4606ca26ac95898f4d62f657a43f3017b3b7e4511ed470df8a7a4c0ffe35aa2a3d73a7e86d1f4cf681d1cd296c1d6d495d7fdfb5957bce96723d4f856f4e92cacfb5bc570700804f93f0eee46d53370f1c3ec5ff6fb5455bc0061c5322e6216596d375c827fbd1dbfd5b55b585d5830956eb22bbb5a3057907f6500417525ad34a0427407397da22ebda95578f0cb120ad73871e7ac0d8dd187ebff978b3345303f8fdae08d2253d7c0308c50423a8b216e9dce391590dd705c1ebd4cd8904a8532f462dd0907c3b5214a5f7b5ed3b8660f14944c8ef35c98e37e6feb54c526fe42d00464393b74b39dc4a313d52e061e3851cd41d84070bea280a47b710c95ba274f3969fe71a0a2c8c3591ee57cffcbb4e9560955d400a810159a838d15e0d36c4007b1a2ba58708e6dedc18dc6be25e796e8954be5805c47e4cc4af9003323cd595a471b4ec23beaf9a4413e85de62b96508f2ef3e1c4209c9e552d93dc55fa93f0a29c7bc27a66a64ca244ae58ce51ded150b3f524ef8f84d3f51c277b6575d14d8052caa2f45ae549aed92683133ec6c86ea4761244f40cb0e4aea4d5701fb82ac5ab3214634e9e6c235fbbd071d0b71fbcfc76abe9a7f3bb778f716cd3d69ed048722fa43a76e207ca71b10010c89afcce6d23f6efbc90993bf248a2c2dff5833a84ceab7ccffbd40798f44c0b1342b0fe32575d948b7100bdb719e0540f1096cba158c1d2cf64538d6385a490fce98ec3cc23ce1fdbc0773bec6af1c60a158c260473648491a35ecc32b0eb06ec875d18725f4d7935eba66054c8105bbd4cf1de17ad74fba35c004dc809cd6ba4a2cd279102d967b2512f8a70f354d59e4130f50b2bc7c39825931522adefe8b0bc2a655dddc80956e231c408ab6d09fe6229a00a7421a2adf5b4c37ecf74cb660a8e477ebaf6f48795122a4caf9fec701e3b47c684b0641ea51892d902f600b93555cd2c9ab99bb443a7e585fa633038fc4f1f1b1b9187f5948dc5d9936d8957334aa1aca065a325338be996f8333ef85ddd5c84f71a23f34489fd7cf75412263b06b7f2d9f58fb9705f0d2f590821f5e9b060625845c89a44952220e008b54e3ef7222995c4b602d5d1b5df24fdcfb6f24585a109c574bbf896eb45dbe3984ad1bcd2267e6b9dd237350e9b46db904c672776a4dab94dea8f18425139d30742b278990c740323e47554fd378443aa5fd38b4afde4223b74d06251f11f4e4ba09c24c9c110ec10cf4d570ac2d23e8d1aa623a3140bf6b29990319a59d3e903db53495907a798c4be01c77bc952478461f35a36653a8d5fd9faa338e7b32100ba62f3e39439da90d8227ecf35fd2f19b331cc76503b9218d60e94ce11bfc961ac86c3e9580b57d0d5314c0bc33b246401f6f85e0bc67814082ee34e49dd8e5869fc3917c66db67e791fbb231ac968c3353d32f7cfa163f7472bce1b3c1b0a8f0b5cf03f04046d2ab31b05742c7121e7862f76899468866a8b01726d04379726acc8a04cee04299f27032bdf3e233c5618043513e9a0ee04c817c6c0a239444480482b8587666f96b2514876b247742e9ee4c551f7d4d90c70dfd7f3af7c7cde5a4d014f74ba158730b310b3758bd77a8c0dcd55ef62e39d36e2f9acff746842042932ba39f50afcee96c7a5239ea32ef6b6bd6091e4c8e815fdd33a7b1af0dd6e80700c4cfd662f5167145baed292e3813941dc8e3f32196ccd86c6ece9d9a511e552540360c5269bff484895ac8dd753dc32558859119392d0c16879e114ad335e29aa20fe417bdb358d93b9df6e177d1e29c5aa266ecc810f91f0b69beb694f230cb960f833b1d4ff236654a04de8343b8a2f3e1d7be0538676ae729eb0387c5ea36a313b910c5e0c5536b482ccd808f42c44da298235348b3e4e5c3841e52bbf76f62e950e14f42ed327d579fc5c38992edc67cbda74993290b1a20b15d1d83e97e116ce4859e2b90ce0b7dcf631e40856944d330b9912e00875eb9124d289de611cdf9fba42e95ce671c0ecd0fd9264030b0797ad475aae86d13a2d8566dce1c6ad098d9b60099bb4b955d4e0075a074cce51cc4700da251e7fda195b77d24abac44ded2ab7a4b54642012a233de1b222954d979653c8c07129e58bf4e2c343628236d3482f532cbe643fa7cff548ce3ae19651d74a2090e4455c8c1792e7400e4d307e192ccb8dd12d2a6717c3224635dccec97411509d12cccb313b9ddce210f36ac44ebcc61477601679be24313ae77f4ea8d66a342ca3fbc09f2ac87407fa6b663d246f9b86e383573114d0ed7d86bbf917946d2f70d43e9642e5eaca8ba007de2b47d7c09e26ed6076cc0f2a71ac916fd000ba784b76346e08435dfacb723d8af8870489e4653b7c587e545728c4af49532c8fd6d2e8c6c8fcb324855a8f0d243f52becf435327fc1a6a9f465783f0d71dc59f669c590aac721ec030711036ce188f11224b28b36c48d4d2e8a7b0d8bc1c462409e61a9fc2c768e3f5589690abeeaf98ee6fc6db460a2e2e2e99ff2d02dac45d5b91b6b7591b0e16634b8ec9a47673d227b0678011310e7eb5c14ed0202e477c5633777ee950c1142b82dff5d417a5988126ed98e98666dd41c50bed6f903764cb5da0ae0d3bbdc234ef93c4715ec277afe0752be56bdd305c7aa7112c50b17d1f0d2fe5b4aa98070553dd3dc36a07b75005a0ce769f5ae91c554556b985ba3f605a10487567e7e8e3138b92cfba9481c5012b4034bcef2d10b4261b73f3eb2cf5990cf1a5eed96a3636d3f9f7c3fa3637cce1af68a8f99c1b28d5af6a1dbf58e5fa963580ea49beb6313328ee473dd0583d36954c98ec5d580e0a758248bebae0eba3e437e29054cc64b514f04346416bd7b8fc388dfd5c6c489e6277acf423c16a802e849629d030c93fb3ab2e81ea689f225407e610e7f490163bfc2a27f0b467b3a9e93b8f8880ae3273f058a3509a430e4eec03c8b281ece974b2c3a784c52a2707508f3f0b3fcaab2ead7ee63a497891f05fd36d0d9a0196e338ff2e56616f8c1f1a5aa43ce5c876effe1177955a855303cb0edeec603f9aa6d372dea6248c432271c79bc67e22e408ac9df500d5162893d3321fec8263d2a77185a511bdb3da5036dea6754b15a7091eeb8367f0390d0bf3d6d9b672892e39cd192eb34d8af3a54074630b3f6a930e69e13ab2282db9def9c67a8438e11d4c82319de7311af3ce18e5e0551423a0504fe0aaf64dc890214ff89bc9dfef897cb630c0c8735785ec2bad8d0fcc8a3cc0efcbfe9f5ac7e5368c98359f6e518ca1c9f182a359d43ce7aaa3b52d56a5d05fda721ed986f5174273c112584d594eab757190bc233d7f556607fceb2ad32ef0f099fb599c50da497fad41e6a06cad488100655d01367925f7499d9a5ffab270ce2fef2f997e8705f24522e0709940a750b7bc05b7cb1d19d307dc617eb8eca63034f994d8c45f48125bf3f05f1fe086e6efeb96ecf194a19d87fb3cb5cbb4d7b8d1123e91f930e7598344a227e6996f21f31bcc6ce57950eb5227cf0bd5bb56ae0b8eb9dc6d9da3b7eea800934cf886919eeae8d9aaa8f00d6a6d117b96c24fc0b5d2171a16eef7fb7344c80ba2b91a4ca7f12ce533a58f9a6cf36b2d2bcd7ca512edfe547f80f703e6689e58976a6eda5761c89b8317ea33c2da9b384b4576a81b8b2e5935a177f94c8b4484b72bc4bfe36018f1228198bdba715efd19e90d96ae134006623ed6c17f6d91e57d956b9340f0e178e610aed04a1cd795975557a18a7fe5260e0c0aa372da325b1dc2944173d621d1e56f18fa0530424764c6bc2a0e701cf99da61a1220e2cbed8980edf7d09a91e36c82c0a5d5fb87e3d2fadce05a8b186409e1e4eae493c58a62daf333a2c8fa4438f23db6e910472a0556a5208d4b3a3ab3f8b62150a512cabfd73bb59014aca6c3abc6818c2c7f4db6885c1958549eed54905ac2896e1c7d7df99164a06af9a291baa966fdfb9530660daae46672b8b285477e638c342f62c1b9074ecdbf2a92a1c4ea8f28118c023131b425055fa19d79615466a5f57b27be25edc79ae3f75cf7f0bc414841d8781c5c2cf4bb91cc301832efd86c605ea64f28542809889d2962338ae208ab8663c9c4a01e1effd8a62fa20048cb13f40a918a1d195cface52b1709acde67372a807700ae21a9d2248a21b09b14fc6df5b0455ce55f047825ac6f4b6c4e9f7e69d5bdeb79570d991806a1cfb98e1df20e44a31d4082f9f8c94184325fb8e6abf22714890578820fb05046b61c55001c2bb352eb94496668ea1e8f3d4ff81128355fb86f829d3921705beaf88b414e72ea46db94151f27f04a16e30f90b51bb63942f056880b811939080c868109d8f3c5a425c5e067ea53c2c0a226e2e43c8038491fc20185688a5660879038893f8035e7fe65c1ce475dd3611c0712671a960ddeca76314931c4f9c2954c973df9e9ebbcbe1d4e1368aaec578548a7f74c8a82783cbcbed9b74f0807d1328636e16d071719c4c319d8973163870a29c411f0e6634f2558eea5cb810c503f712f16b425b433fa3b15cd07c756771207a579483dd836156f46f20d66cc2cd4ed973dcaa42bc87a68dffcaaf10b552194061c676a91c09cb38431328c76e1e7c44b508af6a89df100c2aa6c27907eb7728d8d0f6c6ccebb34705300b8d7260d8e81853a96c412d03623d71cd714f5745bf6f3117ec53609048465da9a5ef6e779c89763485adde10a24d7487405b3b6a52a9d4f1d8c946878d3e2996919dfa6b25adbdbf28c534cbe369944d9ce827ea1199946c8f931ab4b0b29b4bc72b9abf2fb702c6090bca3f94b62403391d6a1e056dfac9298ab854e000a820464bba7015cb5c62d52edb28a03f839f0633c4197f6134c8cdec42885ee4631ba919b6e6a09362c6fbd5167274864a6e15925a6c78f21ed359dca3a6f2fe0efe8317f4c918a1be6b1eec8622d588ec7abbaa9e8a0398867acba51c1ffbbbc396f03f296c864551a0d02427571633186ab6395c6097a3b39e70a05b79ba6521d4b1dc55aaea4d17853a3be2ff8d4b59c75dc7cb3c2554935cdc00a2c2c4cfb1061e5a25314266afe48eacb7da596db45c7e9940b41dc0f4cd9a0196ca16f5dda7e839c588f168364b970942ede6c2114f205fb3007250c82a23bfa421c2c382f7962c1b649766e975d6e18131c004b6e1c128de7539fad5335e3ae4c9bbb417485428199649a2dc38d374f4a3715cc22c8bce5dc40d4e5cb92c49cf607036f969669128dc92f96778ec22e031e5b4962c4424a0367cf16440086669a69b9904c4eb849fcb1c3d28f547881617ec4c46f4c1efe2577b128b86d617ce2f0f34299a386c95edd7ba882d6c0ee8450f86a0a910bd387d8eb99a184e3e6834e541ce3c0d6d3c68b37d2311d308a431b5cb5bab291b311d36a67d869fa0022f201a8f98e60af57baa808b3308e69af5c005613a2120ca4af5349cddb1dea9aff804e775c13ee72b7b7cf3b95562a38496c483fda1c0d35a38135b743943b14f97a51e911d8ce65d78b25416623c2209d37dec793078be11bded716255f89f8dc8a9c297fa4ea7f6ff88d973cbe2c56bf243632f85ae6152460314156d965326052a9442d34ac54b2b68ca351ccb8ff93757bcd69838633a58bc253dc20f681cd5a2181ed5b3f8d9433d72e07f3dd3ee1ce5240d32465adc037fd3dec4d4933d1b8c0f14ee7c3140a95e1ce724146e228385c08ae128ed91deb582a355a53eb14753ad30cc90cb391ad6b496c783baa2b19aac21141e4fee30691499b74b4d41ab1b5192cb247e3ccc634c3945b3001f6cd38f8e63ff08a2a694126c58beaa652f91d8e1be3e83bea2cf905cfeac5f946ad253115839d7190f2a6b4846c43b9a00f79e05354c617d7bc14993e40d1477e61887dd7103dd86e7f4c215ed993b2d2a068528d5e1b835df4fda9664f7d1d26b9739ca9260a020c3203dbd7217daad85afbe95b4c085abc60c5b5080765c4ed41c875cfac02eb9a262762764048f8c7388e2a0bc2c8fa7b010a7cb9d150095920186742410e8fbca129673317c2a4579a1dbd7c52ae5b18e410855bd4af648458d49398eecbd24e72acad88fc0b77d276bf621f68c2f7f3d1108e5057b47bbf9a188fc2b5f4e774009e7761ef8ed0900118e0f00915c7c5cd73709719f216287ec17572e11848e2d8809d2797c3f1a97eeae6ffecfe26323add60fb272a029ed3fe06c8345f732d8d0adc106659a88797d853780a5202694fe3ca47e4aa4c6603ea2de37f12181c2abaebd91cb467c68abb0aedde416194ed22b1ff8346814805edb7c0210d0a5b8e0b7af5f87001de60d7d0fc7f931dd8ed411f7bf0b05a00658bf29d05e3b4d87aeb8074f1b72e546fe30f31732a90bc67dffeecc2d645d8a7ece89276d1067e4a732248487624fffa8ecac5275fa563dbc1d4ea15548724233eef2d96b5081f099fdf1c90e1b5916952aef5a08437e1cc7759ad400575e268a8cc8d3bbb8c676e596113352cadcb472527065cbd93b362737f11a71be494f6e97dc68bbb47622c599e0e5205c5f06f2342c1788a50b961a4bca199d1d4b5c3dfc817c0dfa4a4cdea358b22a646aee41905e1c76279658be21dec2d83afd55fb65b1d604c7ac2bd2354a80243aef52777abe9e2d3d85725e904d39aa87a15c1b66227a94b67f5e320114a30aaccf809ba8563d50fa4f13cb22c3d6c049496159e5e8b3282ba1818891b365f2b42c9a83fd1411cb06984f805551e25cb9d08f927987e42b322bd274144093d20400c92e46976e0968433d4151a367c944ce57e6ecba6f538351cb478728cefc62d802ec7c74ec550ee76a384387aac840a11ab07d987f483c715309641c3a9947fb27671dfa327d6d3b47df5fba1dc408a5e6c0a221fa433b26b8814341915ec6c6a7d56a4fa3b0afadfd531deae6cd30f98684de95e565385a7b75baa152d2bb0306ba25acc31cd87c2fd059d3cdc99ba8d5063a6ee40b3c81ee9f1e7072597e0d7419bc52a0cd96d1a4ff39950f1f48d77117066014b47a4102f6ebe272213d93d6b59ff8c574820cd452f7ebaee3a1ab807613959791f1ed76b8a7d8322e71eef62e6bed865c4300539faa457a36027df27793fa3ef67df0ff9181000a02f5af6514b19ff0bba0359d2f0e3f89cdc986f1b06ea86ee072b456a6b136ca3662f0b78611567c6adef7fcb193443435380e3605315e9ea5d4eba382624be346b61787505ecced7ad4a90a5b696dc74963ecb53b8b1b23f219aacc2c741242a7b127b58073e4d7ec55b4961188e7b3db8df60a94ab3b9a50548ffc62af3d79cff79acc6cea86fea966639638b4028b46706737a161f68ed3ca815bc765ed4836c922078e319a035a6658c1bad897927abf8e43d15bddce039e894ce9291884970ef4b633ceaaa0f749711409cfbc5fc0918228288f22cd680c95e908cfde2425ff522a03692ff988a0de80232366ba87734165a6d9a3f253a50403037c4788545e15e25fa41f48f03db58409f819e9b18a33c9a9520ab01177ebc8205ded668e8ac88d029e9f00625d99c19edab457f37765565335e21f3addde63f57c79991c81ef12891eb8055d02605cbe19363082a95aec6e1c3ab796767d62edea21225d1eeb98958baf56b5b664e97b1bca42274b4436940571bfaaaf65544aac7f2da9d102bf00dc71a4c738f909f31f7b0c28bc572d83287ecc5d373abaf5e92a76706d9d6fc8372071cda75eb5254e8a80410e9c2385cf03a1dcc21b3e890c2537af59717e9a83b0e7ce531e396b36dab599e41242482a1bd886d2dea0dcbb1d4f086c022acd4e4257206e24b7bf689dbd6f1f195c371db4677e652a4323ea37a884e35f3866444e1ccb94db253ea7d8d5f4dd6834dadfb3120a31f89b458560b97a5140eb86664df5a2ceafc3f23a8d1e2654260842c3bdd872665df793ae5eab0cbb08691de22fe225b83d4ed081df30e2dae98c1d4edfdcf283712ba1ba46320be48fddd54ccf5964e99ccee9764d68055d3c8a286e7729b8514aea38929b5236777e2e93f31c707109f0f88d218089789f6cc5cc171921c9dbe458e96b94599964a3140ec266559e784db5b3b2ea0eb13d341b98c4518aa7370b0f93db8b808a824dc97c09ac1eb8d50b3a9141a77abb8081b89cc2470ba3c613e4ddb74c218f12ef423fd3a3897738c5649d608ae4fce6a067304a05ac18c9ab35408450ced8f7f66f33e6b0bb7f9d1cf5793fef96a8d6aaffc7b136449b2826ecf2ebe6251a6d700ccc5b8641ea47871233c425b194e5bd7119789e7d34eb2540d912a9f47b0a732ec3d795022fe454b76c7cce1499d6f7fb55bbf05fb71b591baf090e32f24dce1c878f69f288f7ffe4766e9f2e9804f87c9c47558da6800070d6d9fcc021c0da1c2a5544f0096eaea8d7d110341eadbc4a4dd0e58c6f2530a6c860e2fbc9bb87d4d9a969b531d616b777eac8a23ce7210c8c63b0cdd9f9e7a0f99481c3aeb284baa781ad6e1d67708f9df4abd9831b4ff079e2730fcc88eba803fbf0d051e1d69f426f9be322cb540c55a9a4992cf85c714740f3ed680273be08afc8fa8fbc688f28cc36749eb4b3fddd1c940d2fd1fae735fb1bae9eb7b56bc803224661ff9576538359e796ec11810d357dc5cff320bfe857726890864bd3703f6833361f6c04fb86d5fb70e5a313534713512778523b033505384084c18082d5b64e368810e62ed09c2b3ca93a21d4546bed18adf09cba1c26c5dca571624af58e6bf835409a0339f748cc4dc9800daf11b510ea3207e2155a624183ce7d8478bb35565ca23daa6f16cc6f4ef679606cc553f40787868713c5932d0eb9fb2cace1e8ffa72c0090e6d4fd8100be08a8952deb60d0c89f91fd1271bd7c4b8902ecf6e09c3a52a54ab2fff4cebf4e372a547ea7aea9883b6a4e7c5bebc5bdfe50a85fa0475bf73a7b5cf32e8995fe1a55f00c47f93a78543ed404f35ff50b407abf3fa1012777968d327874b2a7d855cb030677cb8d1da2fea4f47329488725f2c0ea8628c7df95155b614178eafe26aeae77545a3288dcb805d42d28c524b601437e8eface67831fb67106f4b87a459c1917a561f7a49a1a2bdce4254e9a16bee8c34b83d9b92476823a844dcc6d8fbdf4e6d27e220f30cb8a71660e51e19aea9c46cf996e3d78c68754269fd150ba0c06bfa45967d8de314a80f92aae4d9a6dbc17b1cd20de2418a3205af3217ec8d4a9d6a0f27bb6dd32d7a53e3b6df5be28ed2c719121f96023efa6dd2aad89391d0660ff93ad12bdac4773507df5e2c6a00b5207fb0efa7498f0ac31a009b1a4aea76c43b818b1841744ee1ec05d4216a19531fac06eafd65927eb34dc440c360ef49cb791c37a7cc4e39e55f080fce67fbd50cfbc52b3b57a516856b7021f3333def9cfdd331672616bc6c77128a1cb84de7625fa2636ae83bc952c3cc6daa2e97e6de5b04512997d055ee4018f56d45001912496b58830166e4024313c71f972c2cc37320cbeec7d2925675a607c0f14f5c365c967a4174ba03b437d203ea5eb021c69793a6a6c892dea868402ea135aa3469947b7029a00861844c05f545470c4ca4d1c2074685cd98a02d139a9fdf95aeba128a2daa9dd8781e322d23951c109ac5e36aeae5905afad8f1be7b3a123da347159ec4dae71d6923b45f93f2b9faee531403e0b1274078f7e95f93dd9c80547c91920ebfe249f33b5ac20f6e78aafbf378851b317c2c9dfe03cb042f0e11320b0783f82055e01a2322d709132f9e503c80652121f4c5ab3019bdc9b02bdc00d48b3c940cbed9b13acbe6f38727b7d9956fa0817a5c9d74b52610a057de9d0713c89287049a699d4ab46586e5fd85c712d0d11f01d51696c8c49722643df9ba822898112576052b556f032cd30661815cbf66e4c43a7ea51a9a26b9bcf696912fc05c8fd704d0003864e4505800811862f00a224600b71cc14c8a02d86da204318a82410f449d6bba0eb4560bd3980e0f70ffeccbb8d6033b2eb0abc2b75efaaec61302545263dfe54d6e4864b8ce00f97df970631233c4224eb06c50caeafc452a70f1b6d10203bb4cf7fc852e5972f7752f4010aa82b3fffcc5f2e0b83aafe7ce23187d447d426e8b45c3b4645bff3b1fba6501af18248b076531e4e00df3e6251224ef906380b166c156361212cdca1c540e19787a41e32e5d423746dc245617f00421b1bd20d4811be166961eadb6d9aac975ac360de38c0b57b9eeda3ae64239e216d92b5f7509b260ddf756f5ce9b3a1d6563235bc265422533b105e91039816d49d6a30696ea2fa1d97f91dc61214553f010ff80a3e1989c998e1f108c0d7b0292206d8575ea5884a62c5a14a2e9eddde515991d0835aa336bc49bdd357b9b3651a22f67d213d39d9eb2efd0d8200efe9cbfcad4c663b6335a9ba4e1baffbab58f04c9237f9c2c0f73e15d1c47456d31369bed6fdecad58830ef75f7eb66619c29a8df907f52bc74b03d4f29f7bc3ce852e8c5ff5363eff08d3d4d2a6a0fd6529a427cbd7b3cbfa916e7c4b83487a301f54d84c5dbd54284c61ee79e0b458431436f278213fa45f8afb7dfee1dd2f68284c908c923308f4e3da98c7190292fbf26c780cadde4c30bd2f701ad4b2432a2888e7164abacebef54ac323fc6600299ee5d025e5e54ccabbcc51a1219255e0ebd6813d452b51e966cc1162979cd5e9f2ebe8a9eab1be61a4da1de9d4275c9479c36fa542999383323026f030923eb0e8742f4291decf1b72ca8dfa4456356e8df559e2052146c943fca05785d413a757c40be845ed28bfcd8e185302255b580ba67aaeec24708baf80c836be8d1d1251a45e9da8612602e155320cd7e02f46bf2fad28bec156b317b995f06698a5f5a9100a32aa84285715f818b2cedb843c2fe2dc6cae5a50ce667311c103418f04eb4da53efa976bb94d240ec4b0c69fe75e60c185ef77ebab95d9a7d2b8a2d993ca5597810c234dec0688e5d7c901f665553d43e163b13e10e97dc22afbc9212e6b6b19d8d2078498a4e46afbc34afd62449a22ca1fcab85cef09746bc5f5c461f48132e95ee0d165c9c1627e1ae9b6373aa0ed3bda7de2c19fa890d764ac506fe28df12f5fc90f77b9230ac6da5a2c642509ba12794286272c4b7eb78b85e89a8d7ff75eab954843b4e4e8618d4e69d1f9d37bef2e8ccd6711729a14a2430c0ed5d934bda4577279fc5c734c4b082ee68a40cfe213e15e402fde77d6833b0ffaaa94461d3ec37814f6f3ad3ab441370cebbf1c8caed088e2a1b4917d58177f29031dff12a70bbc053446b7956f1ffcb389ed07bb01e92d3efbaf66f9120fa2f027c17d3fcf5ca8b882de01915d971b02042f66d11eb845e9c3bd7cc6c447df57244654f62b075aef9f643fb7eeb7b1520ac696bb9e09204eb5aa7374e20309098ba2f93d99303ed69d0aad204add197dd8c7d5224873c53c20e3e04f9a325f1ec7ea7a5188dcd771aa96730c31848cc1dc04ad40d6e0ac6ffea633aa8f7e8abcf0f6d50814aa5f7ed630eb6ab16c88dbe4b628b038194e88b071ff8e8b347028084386914c58bb373ce8f13621ccdc4d894d9c06661869a04970dd13b94cea56cfc6763ea7a0964030dcb8721dcfc5a3cb9f8abca49c8d8818ffa578ba6f8538031d63ac4c45a8a851626058ab183527d00b921b320630e50498d50a5da6d0b83b40b70eb8f35456f6bd01aa3afc078f8074f988fd6285f6a5ac8867e85b88ca2b54db6e5c929899fe836721e2c7a22a22f1ccbef0046cae01800b4fd803041be7601d8176359b6ced37a27610dc337a6548a4cb9055a6c1ad0a86353f990001edca34c8c7f2e980dd3d4a7880a30aa77f2db3e0345c17a8f9e139ffff46ba802031afee31f1b68b4e043c1938d5384bb68a1ed7057a7209115a122c7247bdc7f5de31a01ab19ecb29f006a3d03aafe5f1470f20e7c6de66c1fb2687bc1ef7a7aca397b71dbea870b4891c7458ae05e3e2b09d377644bf58b0543236e9f8329812c908e23b7e408aac3a34f43f2d7a81c57987947fb025b683732aec33ac4fd254249fde6d9752e9eba578f95929c2d648d8cb626ad75b8706f70e5516fec7ef8519781f2470d0e8beb4e7dfbfecaa9260611d199b3f37ad5f36489dee75e73a626152cb6946095d2e745eb1d5b5a6ff67e2d69083d8a489e56efe741a0fcb2fee1a7eef9396b8194e7b1a6d4da1659945fa0aabcc00afcb82b52012eeae0725a4a78f76936d5da3cbd41f22542da9cfcc324b6ef7faa8557ae1636e6f0970df6edeca6f11f25a04fd24cec0df696c79654369c086286dc2993fac24e7dff965e9a4af10bdd771810040bd5b56025737b3079e18d2c7754b99d360dbeb4924dd1cc7a01c558df1a7464f093de15120b2397ee05a611d1d51a3bae71c08ea6089fe237cbc953cc006085754eb400c1ce50b5702c03e7fb3340750bcd13980db914c41fe4a8fa4cf6207d542c13b31ee087a495474f88e98867c79362a13704035a15af701725e87b341f9ca6bb6dbe38f7fd2f04201c1f122e4803f1cf3244b6569c1a2f207a9442226517c0837d280b384745113c3b59a531a809d21ba715322e97d9ea74d8db3aababe0a8a217dc680c2b9d72d4bf5614cfb9da81f9154209cc9dc4c31a725dcb5ed85b0d573c9b2fefe7db63e715936edf082b75b45e1e04a8b34e7bd0e9b395aa5dea7c163b455c3dfa9f9ae13f80f8496d543f581238ce5ba7969422188b3600d82a1c4da4575e20aadbfe49a2d6a5a13012f112d89a28afeed61e339799a67e12c6f22cef946d1dd9ee220c7987887949da7d98247b90fdd92cfab7645dfc6e5db96e7a17541b172964cacb9e867425df4451e68a3e8072d4b5b3501d650052d42664eeec237f6433c02322fb105a19bcb7d7f84c33bcc09494628fcfff28b8d8adb6949a0b65b4a8ba40f5c170dba6511142668ca8f9271d7db218d97c8b67239c3b36091e642f8b445cb3a40dfd21dca80a432231dccc56a7ae31b7a4fe9241a6c9e6f7295a03dcfe1ac242f2d7ac850b15ca74301f240b877dc930e61124629384db2e9655078ce8ad30aafb40828f81816ab6e7f5c72b3ea27cf1ec1de02abef63fe87d822270a87de1a95de274ef431a9e613938396975ae62d19643e7ebccc93fb78f49b09fbb46c5a283bbd6df14d31185fae10fbd8e42b4e4d353ca1c133fe193390fe9077023cdc215b98e0852947c1005135c793b48bbe2908135ee75c1cbf252d5e4e091cf5a0422f7f0009a5accbd0ec3da4e33506957122f0a23b3a295f4b63883205993c7f6b835fade933a11c4b74dbba6797f95701c808563a6dfd8a038873803bb064dc2027c89b751c52389f3fc89c6ca552ce0c2d54589fcb01642b9904628f1f6413fd627d5a35f81605a1fbfcfeef299898cd1b681b1a097352b0bb58e98b3b131b620719c65a1d698ca512f0469167a3c052de2c8fbe96234dfc03f5c112af7ecb0b8f6ccc3072a20b90a1501065529d3970f4f273972397476ed08e8aebb716c82cbf4ca90b646e0769fa5637a6c23bb942bf0331e9dec4210f06c6605f326e78c838faef8d524ba0612bb642ecfea64b7cac69357d3bc2b889bd1f1da0cb86fd7b70b167e4d49cc889f3b4fef68b9cd3aa1a6b0c3a81916938ec0b995449b8d1d6557475a15fc8602404c530da465e8803ffaa555bc0555dc6c630e84f95b1a4db24a95c72939c6bab721bbea22be88556603d2adc2ad99dfa52d90d30fbaf2c2d557acdb082855fbddbf2cf029980a1fb9be8c76482b3f83c924322774f4b55c6ca280dc44c88d90e9479db9236ae4da2f4b8c67d329309c6fe4b9d9b58aab3e6ad3bc76d32911aa766d13a7c4f59a730cdbc97131c4894a5965e4ff7a97682aab9074c70fa222121ca50d7e5551c94d323bc09db58e7f49ac71ddc37770b8f7a777b8714f26be20665f87c799adbc81cb1034636e8e543475102252cd6d6324f42a67d24a82750204959ac4d58024cc20c71e67ce01e577abe12ec82a3828642ca634af58be3a2e0f657ba274fb5574ca172e47179366e9a9a6929f4ad7cd733038e607f13b5da541290b7537d02c4aa9511605f7a9241598389d32dce3c60154e81787ae8c72ac576c6a290fb4560569d0c00d37e92a49711fa4fdc83eb5f1e44ad74a78bf6230508147f60ea2a0309eae5270691bb26dc9998381413663d67c10a152d330381e437a55f83b79fe4d0b18d26494c2461406f926d72e8e05c5f1fa36575f51d3fd6c13469c8f43a956668be6f746259dc5aa0e7985417ccdeab7353e2b92a8e64fe77648d7ea2050f8bbf93dfd4c0abb1fea6fbf8b4013bf514e63095d5919f13a478a4ff7139237786b8550b370c48898918f8ab45f3dd944a1372582e08eab0c3c649f572c2207aeb05e1749ceb3714bca6054196737f40c6e031e8bf3a821b25e7b0ba53546d60fc852aa9acf86059e62060785ecd325930c3a3b76ef68543c9bb52485f4b304d0872882992ba56182bd205acf2c3054ba46123bf989c7fe0397474c5e3541f42e1c3d7482fa279b692e1e8b91ea397a82c108260f427ce542111d090541946b9a13076392277c92e4ce1d7ffb51860b3cf4efcc0a79a11e30e20bfa463fffbdb37843d62b5945762e1334b8d2929a7cf24db00bd1f9298d7a800cddcd551ad84d8525f70b8cf303797a6fe1574d9f02062c52b063312b2e6b51a3a6abb05cc51abf26d858a4f84f27faf1d84f7b0f3a277410cf3d91236ab91740d21df4637926cf1628eb5c49d12843e1f8b5f2ce0d53a5af01e8008ec6ff02e53dc4fbc12b0f632d8a91f37aa79003d11257f36df5a36d61b0fdf7faed0b53c639fafb211019538d9361b45313fce3eb3e44c7c9697a296f85ddc9f666438c4a21540cea64730287c28563baad30a771cc228a36aff90465f9d1961f16ce90e602edd890aedd7cd8b59e140699763fbec2b167c43e09f8ac9bed2b346989ccd73986c5e5807598428e61f35aaa14b648e67fe5fa96a6688e363141c7b74dac0125d8dac15415938dd210c78ddf3269113a484e3e7e30830964bef11d47d40cca51d9448494c664ccfc3ee058b161bfa52e66f2f68167dc38e82f82cbbe644509d6f9918feeb34934cf7d88d90cf4c77242ae8d533033b63d3d47da3558407c64deff59cff12bf42888925af0fc3412397dfd586b94c331c9ceab7ef1538db3c10e04fea0df4d402caa7228c5c30d049930ef92352cbb8d98365ce3e0b32b7c99db35e7b7406b287eae5be4ced27acd61c45a45106ac0c7a7e225b65f69683f7f19311a70e8028f7ae86e2178faa15b6c3eda420d962b9b2f6267e4208d972efbde5de7b6f29a59432c5070008f60822ec6fd95fbf7ddf7f34dedf927c0dfb9648fe7df2ef7b1b7c9ab28774fddcf0c5b2f5b052ebb2f256d95f9bfb3ef241d2f5e1bb1e2c5b7f4bf1c9b2c3e0e3bb4af0c3b2670c811ccbee75d963f06f1c7ff718fcfbf95ede9e57d2b7bd8413c0e0b3b35788142153ecf601b909940a9122444a4d7531bde079bca2883129e2325fad7f1443b2ec306e384197065b7f47fda28bfca1266dc6cd2386df2a7b76e9b0f5fa45f8bab4213fdb909b27ef708bd9f53b55975d7f4bbb3edc3dae27770f08e3720de3729706750dcd0bf67a892f318b2f317790b7fe569dd678b5f85576f15fd77d14e5ad38f7925af7175cfc298a5a145ff0f0318c1bea502cc350c43455431173eb92f7f5e2781c77f7012d203e9db6b53b393e8af1efee2f3eceeef3123b10f6d2afd877b0bf5b87fa6b68bed32ff1c7171f7f164318f91714c1cf39835bfcfbe2dfcf4f961dd44f8a9f37c6342401ffdd36e4dfcf3f9636e4833f8a9a8be4ce0f3ef8f9c5f173d97df805b31ec7edf3e239ef1efde4ee097ff479e9308cc16a685eb0d74b7c89e3088a3fbec47dc1b1d31aec34388ee5f7adb2fbf056c75d3fab4eecb3abecaff167c51de04da678d264d97a11c5bb5e7cd7933fc9fd12b5cbb5fbeb05e671fc198ea358761f2eba5ebbca5965a2f8f85194b3e2a07857c7c56f3d8ab2e35d3ff7e3c85defdadde7c5c79f2f96fd878f4f82e2e312fc165876bd7d5ee0383e388a8fcbeec3f18b25fe717c70f479813eafeef3aa80077cf8fc4e4f2d38f478e2f3e226502d38f47042535b2f28819fb3fe4bfebdb7cb00eb459dc1f1ee8e318935c653044397ab267cb59ec6a5c1cf5aeb7f85e35f12bf76217e7efd20b979c49defebbf0ffe8ed5a5feb1ecb9f5e25bac41707c4c6d445cda889f1f3f69236e9efc19bfde5d0658fc3e999fd32dfce3d6bba7f5e2ee79bdfe9d9a750b7ce957cd8661695ca1cb05bac02ce6075d601641171f071f97df932416aa2b5a8f1f13d515aec77bfc3c8ee3d330048dc52dfe8e6d8d4bfcf56249be2ec39f21cfab1c77c7465c0bb94a4c5465fa67e8a2b5f587c4f5ee3ed808c424c620c6baeca2f8ba145f6bb2f562d93f70f760fc7ab074fdabe4713df82329be2ec96f95e358564e96fddb3ed8082c737e16e483a5f85a3f59f288e0e3b2538e7fc43ed8682c7b0c0eee8e8578f833dcdff72ea07241950cb0786c8e27429cfebc26504e733c09c230aa8b72f8afb2bfe0afd66dfdb8bbd67af717fcee3ebef83b36e7d7fa5bff55a67f2c5f3de1dd77eb7bb7fe96aeb270f71f1efe7c95938b61d97f2a881f1085df0791f0fb349f597cfc7e67fb0b0ec3f21e9abf8f77474102f8b7e62ff9b1bfbbc3be862eeea6e9d156e88f4d7cfc1a2620fc3ef879660cce9027ffc5a18bf1f1ee2bd0dc041bde821f1e3e7e5d76cdf5f78eeb70dbbcbea7f5e1bf76f82dfd3b1697e1e7b2b74620fff5367cfdbabceffaf15b657fc15b4f4312f4df6df3fafbf8c7d2e6f5e18fdfcadbe6b54598f95ff95f9ff72bfcf0cbfee2f6d67322504e76fcae9d22890effba203fdc3de4bf764fcd8f302e1f378ccbc9d7353fc7a7214fcd9e28360ccbc1c73fee3eabec7e6c5fd8866139cd6370ef549ab2c7e0777cfd5997fa69c863416d02deb297841e7e876139cdee33e0f7c190c5f7b7ac7c862e2cbf248cfbeed6eef86158bd3b0ccb710dffde7bef95fcdf1f719e8f87afcbef471bb2f85edffad6775527c5b73eb74620bfa55dd5453eb9533ce91f5f2cc1d68b9fa26cedae39b6c00fb711bfe77eebc57dbff577dffddaf37bcac3ddf37dfe2fff8e1dcb0ee34e123c1efe4ed53f43fd3b957eae31d1e0f9f58f252efb0b9b177f569d142feed7db94b3e2bc76eff8387e8a72569cf1776cab3481729ac765873d17ee1efdf9f3cf90478b50f33d2e5b4fd2bc6b6c3dfed6e3ff76f835654f6bdf2a7be99f7a8b3f96aea729c9b27257d9613b2cf3e70aeab2e76fc10f6f7d986d5e2ffeebc3d2f5b81cbfa5cbfe82eb7f95e363d79e55a63f7cb1ec19b76e3dd92a27ff3a8c4b963d06cf36e3f7e0d73fee144fda8607bffef1f50ef7acb2717718978bbbc7e0598629fff2fee8df9e814e82fe82cfd956cef0624a7faee005874161bca6ba5ac82ba0dc84f93489cfd045c7e7ee28cf356c5143c0d5863c97f718bcb3b75e3aefbdb8bee575f718f0c97f2aa539bae76ef53a6fb320feb98517e87eeb3812b83367ce98e15b0d5d7067ce9c79a2fb99224512ed13e3f7bdc721cfc6f1e70ee4586c250cdf8e110b43a8dfd5ce2b7bc731cf16dccafa75c3fc62197fd29cf9d3957366bd210bfa210bef6f6438a5f77d9fd7cdf87296ee399f6373eaa4967e39e7cf9bb54ee1bed2ba141e0bfa050cacce8b1d999d5e92eeb3667fc7e21d8b711611d8fe7ee7bee31e7fc7755dc7ed7dabac5e1a101983e118f02bb73deef9c1fcde831904c1bcb90d533239f3d5c1ff8d0ce77e3962ea7b5f529ea99da113dd9f0597dbd72ffcf6be6531e7ee7efbeefdb75324d15e0d79bcafdfd790c547bdbd6ffd7963b544dd30c2ed7f6fc75b756ec5b91f3ad15df3cb82cbefdf7fd5158f628280ff521cb2a0299ef453efb9efdfe7dd7dfe1af27c6fed4f9ef3083fb9a4fcdb7796dd54611f97de5461ffab11798e56ec951f7eafcd35e400f7db8e61d3013adb9eceb62d04ceb817ba331adbd7e82e07ee8cdb3580c6d9f675b653f5165ea0be7d1c86f0c32bb7f5c70c6c7b4e05748bffeed4fae3eaaa0b96124a78f97275d505abc6bfeffbbea3e05416db2787c7744c6fe5eb061aeffaa7f2bcb949da036f45a82b2aa722d41593db113200823f68dac1d4c15b968244d211a83660f159b301892f80cf1a53162ec204c172fb3cb68675040ed4155de601ab93e3844443948f1ca08499d94740a57c8620f89d0a033e210158b31809c09acdc901bc6f9900ac3a4295591174907e3e9358a1c1ebf729c5b168b547e479d32b1d829c0a9afaa6a8d5d4831e666ceae491cbfe3fc8f1b6eded7d3ba70aee62304786f3a5f876f75a03af5f6178990c33e1ed6328426fc758e0f4c826cbdf1ffc1e0b413effce15ddcfefa68ea7136eb0ebf29e16a7d6ca9aa5e2d4a74af563b15ad541ade2f56918b3aa341b8bf5926f6f47c0ef732ccea962ab2b36bcbb7c8de866a5f550695e6775bcf7f87c2ffc2a6dce1a10af53c5d745c7ab34afd2e6d7a0a943952c4efdaee6a82af0ea5125aa54654cfacb5eeeb8bce17cb3add400158bab240ab9caa832aa8c6aad3db3bb6a2dd6f48caeb41a1bcccfca7352ba3bc8619067a594524a69ed513fcf09862c686179473da0df42f33955d08d7c5559576593520a03e5f3d2b7f46b7d4d89303345b245114973ea66c0ce2916299ef42b95bccf2c18581d0d4c1cfb54685784ec97bccfa9ac0c4c15b688a949ab15e754412b8de3dd55d97ca2ed7c71076d9f36a1edcfd7e966f6d6a4e40f0a4e4d8654de20805a009c68ee11300efc6a1fefd65a3b67fdbed0d086f9791d97b9236a11e0535f7beb9212573497858aeeaad8269da38eb4a6e530e48926f9ace5e0c309ddf1596b1a13d57485f7d748344159426f7cd69a9a601b3e6b370cf1cc67cd094a4e931278fe3c6b075adf1b2e769d2e4114a1caf08b175f7cf1c5ae11dff8dcf8dcc060ad97bd367cfd61b9b5f0f83874417efef06fd96ff815af78c52b5e91dc793ffe2bbeabece1ebf35b71a748a2f5dfdf7409f7f1b6191f7f7e5dda8461f83dc6c5f0fb733124772f81ebcfa1f872bdf2ee6985a5cf0d171fdff0574b6cc5c41a1a180ca65ffc2cc2b42866fd224c8b592c818f1dc06ed5d137aeef37fcfe4540032270372902598e2f6a7cf16dc1eeee37ae7de373e373a34bb8792e3ec71d70dc01175f3feb8a98ab8c71dc5f1cc3fe3596e238b65cb017cbd7c34a9e97ab04576bfbdc94e073e373f373f4e354c207609090baf9000c125130a4ee69bef97dde7fb1ff6afe83fdf7fa50782860b0d7eee9ecc768becfab81795ecddbaf81c176ffa129fb51ac660b5974350088bdbe039b1ad793d955e2cf35e70be65274b570bdb4b86dc61d82ebf38b5aebefd328be85f73010b4208acde33dec3d58b67784d78f3f772a69c5b73686431244d893a58dfdefc956cbc6ee1060dfdadd87b74010d4a106ad4d00be458a47e172ddef2dec5d01d83c291ec5a7803d8aaf05977c7b02b7df02b6ad0f27ff87872250eff564d9ef7b3b45126d3fbb78bddd3daf1f770fcddb6f952f0b800dc3f2d877b0afcd8661790de5355f63f3e75c669b6dde3561c8a27b6bc5dc7d9e8b8f7f5f63df5d1cf6e48400483da80f83fdad2b6a1ef65d5d81e2610fd615340f7b3d41783d0cdcb0320cc30f79f8b9e6bc6df2dbf0903f7e0bf2c79ffce3b7c83f8ee56c9129bee66d29a6f89bb70dcf0ae819fe7abbf55491df82ef02792c087b2b73c576afb05b92d303d7dbd205dbfdc55deffa5c53de2a733d4d09967aaa70fdbdf7f3b7b87b4e157b4e153f3c0cbf85b8c3fdc36dd9bb6e9ffc5b76fb35ad9fe1b8536b4ad793a5ebc7d6e6a179fb34aeb7aebb6d785e6fbf05f686bbfeb5b57efb2df4b6fb55652eda853c3bd645b7fb8ff71efff257e616dfebb721ec674892246cf37cafffd3613876dd06c5dfb19ef75dbebb6bf10a40002f0a60c7729f61dfeee9def3baf74280d9846fc3e37af25bb8c83da70afd3fe193df227c920cb5ebfbb0a467f80c5b2df26febdb3c990cb70dcffdf05b106e3d55907be630773fbcdbe08f657e5849fe2dc5fce21e8b71db8cdfa2b5e754d17ad7fff071dbf08c1f7e8bf1c3ffe1b7cc613996aed286faf387367af3847ff76ec1b8f55491ff6e3d5584ffc367386e1b1ef1efb710c1dd6370ef67eeaeb7bbaea43e1eb81600b59c02fe27769f3c43edc3af5871097ea2057d5e2f2e64e1bd32f96326cbedb32eb1684317e393afcbabf5e77b5f2cfb4bec2f7e497193f7c3b2933f9fd2fbfaeffd0c048323bec0f7e28fa50f099a24c9327c31244b91fc9d2a72dcc9e7eedf6f7b7bf3df274b9fd77879f2aeb9af7124499718b2f048d103431eb2f4f4f83704bdfb0f2e2fc62ec29f378451bcb86cbd2ef36bab13d318bb421721dd5cc8e37d98247f8664d903fef7e48f657ff1d92a679569ad1f7f2c56f5eee2cf6f7dac1c7ffe8ef57985a50994836f49b21cc9529c618b71e6992758431ef25b3fc3f075393e2e5dbbfbccb2c5f89aa705b8c5ffc8ca71477ed8423f7ed98873057c2cacbe965c6587c15da47e6bc9177707b938ee0e83dbddc56ffd8efd7e1c9ffc58958d2f96ae707c3d7edf23beb867958d20e82a276f95dd070471adf7adfd6c1fe6d9afb0b77ff3d3bcb5bbbf7e862eec868d9f6f8945f169ece7dd7d4017e2df1fcb0ef271246d5cdf433ef8ae0d3e09da11fcafeca40bdce3e3b1b430c6b7dbc6f5d6c6f5e08b4f7edbc6b54598dc26fc9eef5d1f7eeffa6f770f826587613bf91b2896fd82bb47bf6bf7d090a52dfbdd3e20d720a711696cfefbe2ee35fbbeaefd0c83590b921684d9bfde5b0b92bb5f3bde6a6d77f7acf6abaddf7b1effecfa5b57c0def55d5d01721b97ebc998de1d7c91f7c9fbf6ef8e95e2b7caacefc3cad6f7d827bfb5ed936f4990dfedfde77dd3f3be0fe4e2dfb2c3e0f76e974b0cde9741ae03f3e7751c0b92b8b7de7a2b77bbb9e27ec795d8f2aeac1307bff7f1560a78c8a3f956439ecbb95957561a15a73e0e59dc5d4ba0b1b6b8d289f90dba6e7ae9baae86ad9238582c7df9ac393da94cf407a58ab1e2246584f7cf39f2d128bf659d322c036e9f6edcdeb010e575fe759a531d9d01c1bb6703af9f22040070ba3da6a9a27e68849e2ab0ade2452a8db010a65d8c316d73fc5404dc3eddeea65345e5f829fd689b137cc3107e78c56f4190d250b5c5c1324c3d75d75a4f1521932ebc807dfc9c9265a27eae1b9d32fbe266413c44d3ead96ab7de5d4aadc8ed9bafadf85e5a62a32132ad41d3b76f8734fd9f53c5b4d6dab0890d07ecac3ee530d47d420c2bd484e64c682e8b12baab32437f50ae64a858545c74eb8c12ba1b43c6f60099aaf22704cebd4fb20bf62867788c83a62f00fa1480396bbd566034497efa3e2c3a863268fab56610e478dd1d0594763c586b393e6b4e31d0a7db71b06a8a532d43412ce9329b4f02d1530affe18187a126ca0c3102658359bf4c4a9cc9eacc2b2a2ca9d28484872339d415b7c904e1f214c8784fadaeb0ffda5e667f2b3bde3e328edf5e27bb2f539535e5a0ad92056297ea0a92d36b03bc36401cdec16b047630ca550241295e1fa4599d9f1d3eae5838e2a2a4062eb30a0a91a0c3921ea28e5ca11065d6412328bc834800e07143103060806898753008dec125a626d0093402860c18333d5ff19ab164bce7acac5c252b0baf9f95accebc32c4a5061162a8502531ab79c98923567a20ddb8818959cf4c40f09e9d086043983040927890c18559cf355e73d6e1663d5b2ed972c93997bce7cbf4e5fa5fcdeafc0c4122091352419854113173c2fb27f553f483460e423821840e49ccfa37d584f78f8ad74fc2cb98282b22199c66fdab62c2fb67f5617d6182f88804f119f9867c4dcffbe7445571e8f72f89d7fe01b19ae2e34906930c42c43c31eb1ed612debd1144d1a26a1c7d890232eb1f4d09ef9f1014de3fa36fd6bf23221e15225e15af891785578f8ad75a35c2abf590f0fa1ecdeac0b480a10273038d2276cca478f7ca90f931450909ad880d66dd338ae2dd43fa711233d5448f15a0a48066dd53eade92c7a49367dd6bb23dc8d81e66aec2f0da652975544a554a56bc7ea764753e10c3d00eab281c969499d59fbd5be255c9081c08297383285a66bd63e2b5732aa207276a514d9ed821c8ac77355e79efa478eddd5417854cd7834c97d411754731de3b244bcba2599a90149515afdf392c2e0c158e0815ce0837846baae19d73aae290aa38256ec92a8b13e2f53b67c42b774464a34264abb235d9a2d0f0be51d536a75adfa478fd8d66757e928420e2ca8ea11882c0ccea2674822c4f84a961048796a659dffa86940224459c2829528647d2ac6f4abc6f4b1b13c7fbd6547b90a93dcc5c85e1156729612aa52a2525abf353e4830d8890310450971a6614e01d2f3de1610490da8f18ccfc9875cc3401deb19306a0a410664c0d4f2f9099755ce3154bf1fa1d4f91bce32864700f32380913e1a317ef18a9d2b26898d6b1901495550e3a78bf58bcde304a2e11254678edd769ea0e99ba4d5517a9ea2a552d592bcf87a82b4d48387834cdbac58a00ef36abf66bd4e2fd1ef5b0547a54e1958a2a35e1360aaf4cd6a956dfd2ac0e079ac2d080ca911aae8e6610e0dd26c1a2430a443352003364d6ad1108bc5ba410b0ac8478a981134e9c9875abf400deed926de232c8701966ea55185eab90d59253959a8ac2a5f25eab68a0f6984124f1ea814a548fb8d009b2562860cae8774a842bc008af4f6b56676e01631565c6142c4b9e661ff04ea5a8ac2816af340cafb34e87f0dac42b75e21fd0a50f2c0efd0fcc1574cae857cb3badc22b3da2463a42e480c20b3ea05003221d669dd256f03eb314304350104e8424d18264d6271677002781d561c0d0103b4431d3042dcaac8e5075ba58cc034db6d44007252a2c2fb306f0ea24c8cb1324559cfc8065563f565730c0064b99188a98c490d1325bc0c6eb7f4c74bf4696ca525d254e9f4bd2dd5271fadd6671fa36abae30e383172008c0ed635b65a9f295145c1cff8d0cffc41feb0057597103d8b9624a1192c3411e9a1ad1dd2a71fab88bee9646d3bd5671fa9d0ebad71aa77fa974af4e74af344e9f22d19dfaa03bade2f43f23fae3815ea68b71873b8ecb60e118ff0718cf2abb97a95f269e855bcbd419d17d5271fa1d0ffae3a2c318c2250d56f13b753365c4ed676f4b77676841470b3726d8d11b8b009b43125dfd9ed315504940217037393dc0c2edd7ec19d984ea8a3e3dd0fba229dda191a6965fa36e88a6e9d77b6fbd2ff2d01bef5f55d07d5a71dbbbbbb1d1545131de27c498d55a5b60e2f5733e42c18603f7f1e39fad87226d756ce84f303634a1349b678488b09ad15d43657680a51983ee1de740cf89a64c6e1455cd382fb33a2540a3667538ab999e20d079e9b43a9a2ce72ce3f28459e312e4c62cc638834ae9409ac5c849329334c37fcb1326d42cc6fc6186f70c36f47f38dddd5639c29ac5f0400c93232e124f68b3181ee460c68f8d037119b3b5c3e50993ca0b54b318d6ca6c5607f417a7deecc4fec3afb286aa66b7b45f66b6a49c091fd1d464bb41d3150f87eb83dc814f6badb5b6566b6d190a66def491befd5ced4f3a9b15cfb6b73724c1c5169230ab0c46e6e8ac56ec3138586596dfa9c2c5e75411bbd2fd43e2f52f161a9144a909026c0373b6fd2d85787d2c6475b6af9f69b8013a031acf9c397366c6fd0c3b5067dc3e21c66cdbd3e28c4a6068adb5d2244e5ff693f2265eab0eb98e96cf21b94aa08906cf338fd8c85a4a2d28b3351cae78fd3a43169562234be956e3f497f8fc0185307cfe400348159f3fa040037e8d2608d46aaaa04f2b120984eed76873b23af509233266fa319393d5117f80b2c4a866756a8d2685a7ac8e0d220a1424b4197d4c6575e6148d4675abacce17e689314dacac0ec5a2d166f43befbf1b8ab55f232aae77c755569c3e09accec51a3716a7210577a6bb63254edfa3bbe3258a24c5fb35e2f42fd375aaa28fad8cac4e6b4a852cb419fd8b846575a8d0e6749530d6ad599d398380931b6ab36d772c44bf5f238c6477c7b4bafbcdda6a384aa6db9c546e07fdceaa281f414ebe2089a186d95500bf4b96e0f7f20bb5440cbf36cceebdbbdb78ebb66ddbb6ed089023438e341d317204c99126f846f7dd3dfa3e1bdbd1e760ac8f6224e5c955121e5752d881a3058ee3b8325715679609d39531a363434537b0aa68341a8e89c5e7930b44584f3f8070909624cab84003902d4374e810ba4f2e98090aa27788d010a321484394862c0500491332316c53583b5359b49d2084bcef70f041c36a8a46a3154d2b3ea15c48b20273d4d84a641881a232909724077149708e0b02e26e50b352c1eaaa7015b4d124deeadc998ebab9c0b7ccb79cf16fc6703426161d5d86ae2e0f23311b0f9a0d8ee3381b4b16677615d82104840b423469821add50da82e078d9dffc1be9887a102511dbb66d734aaa38d3a973d231272026b015aabb64061ad45052e4860d53dbe17d357280040b8b101021ab17680ea64e8750ac88ed6e1b91100200414589a91b4ed4588a0187922942205010036048822161f49c1153fa75e3fb2cd1cdc1a9e2cc9ad414d59de550756f0d6ac464e4148099240a125e6234294ac5994955baa42c3a46f5615652c5995940baac213aab29f6378a56f86ec36297a58a33999cf04e97dad380f27184146dea870a4559422fab092afa1c7c0315138d461b9ab52548a8744cbfb4b6e10a0f4846e0d071a60a11e7a0304dbd128d46bb61e71391a329ce82c6c091103a80388281c80b1d22e21581da31cb34ed2045a94b15d2961b3bb66ddb3c281c61f8b6e50863a1728cb18131c6f85f18638c8500a938734893913b1382443686c6e98cddbf5d7ddd7bbbf954032b7e2f8dd77067d4d5f8be1c3e88703e6a463e6a44791e90e76d405aa4a00091b141a204a912244b90ab20616e92292aa09089bcf130caa954b2fe66bb51559fac94b95b8f2c281f522e6e8101da8c9428f23c3041bfc48911175ab04f555438221b903e22000cb1309563956834da0a768acfa72e49537ca776588802609c829258a1b2e50bb52163862763a807d0933913cabad124648408ea0612efab0e1a3a883acd41e940c20999b1411f04a0a01c7529b9221d1b9724281381410993991e3678c84185a288d8d1022786aae2cc2a2bac6d474cd6b67933baaeebbace46c98ca0dad4d15471e64c87912e082101942069092b288799235034688814a03cf1c18212f5c1cae2cc2e8918d8d00e29411b10514ab8909543cb41b3f8ac21a992c57b7c1f13d9c7f7713e9ed03c35c9b2037b099a5d8a3c6fa889ba0d0960a9c8063598aaa10b121cb3adc692238e5a107aa31ee3388e13e2f3494a88739c10dfa91d8e39f14d4181c6f7dd23a10f0428264bb0902300d544871098121a36a41e731b6744a3d16c701cc7711ee7388ee3a4f8ac6d4992e23bb5c34c8296c8d9fe860c132923334c154d39e24616029210aa301c61aee336900b908a33873419d976b820d9b6aeebbaae9362a3a887d1891fbe0c71a1e11a59e1291a8d3603b5e2f3a90c0dab8f869397291c8c0491b14451b844ac58000aaf8cb80d6fdbb66d58483cac265e14cf33810b2914d1524311962d94068d1a8eb82071b832d168341a6cdbb621f1f9240310be6d489c470d4a70a083c9d298210a542408172162c1082b3ca4e0d861092d5ecad019f70527442f2c1531a30895419d1852b29c47960a4c10dd2e451b96a128dc86374c0351c599474940bc190d433c6f83a2a1c95601a5902703781e71c76ddbb6d58c549c89a46ba2a3c4aa7c16d955c5e16a612acee4fd8359e33bd55b01ecbaaeeba6a470c31ee5c8b15816677641ba1b3c20dd1b44e2acdab66ddbe6930dab59c58f380e828ab04aaa00c9c191a52e4e54a1b4a316726818333b583474cc4bd0fcbe2217aa1343b187718ee3380e28a9e24c201d071aa2635c97a1a2022879a2a3589c873dcff3bcf73ccff33c2746156722754a7a29c654719c38559cb94591816f9b0f1764dfa1508d2ace44525ac23b5f9864413aa65f5a731c571403ddb69a141af0ed088fa21870962ce1575125898d20989078a274866f4f925841094cc056849d18aa1f400511c40bde21959be86d83b28109dfb6190650835a8f2540aa6c192a22074a56d061bdf07044de2b9dc3711cc711c9826744ae74184bf4e1008ac81822221b2ad265a2d1683f6a45e2f329074848fc6f90f86acc20d48113921ce0c00c9131403c0165bcd2c2cbfee69fc7061621483f9088326586c64442d19e747cdf07250388578409e873382fefd2af2129dabda1392e1b0fa3106c288204191f9a70497262e88711cfa3128d464b61d6631d35e2b356cb32e239766032a387a61a80be9401a7e018e2a08840dffef0161a9ae041fb21680832445b0a3dbe8f89ece3fb2060658b9921c61471030eb22e0e3eb82f28c000d12c5236723a8c31c6dc638c31c64ba62acea4eaaab4550cebf992ac8a337997718ecb09a55ce11b513ffc887a42872526908cb954474fc4a05b34b9a82f40469fb3b140f30304881e44486a5c258d1163c46d78f37edbb66ddb6634a8f2bc6ddb361b758a4cc9d456140119961cfd900407961c9a58f203d3b8212500412c51d28214500c4b2c11a669c78680a31f47f0b87203ab08269e8864b9524e2bbcec6ffec1ac40a3e306401ae0a2a50b0f514f2021b344d40d476e7c0a8dcb575494ab868ee997d63f33a668d972c316a11f3c8009d2013109d26fa750ae42d56472b442942d51636c808485441422f520f261c204114d946ca8c1ca17a41744241c8a66d8249e500842483b60c98e17a058c8a188235e529004161f62a8f84094d4850c57c404049516acaae83022ca1589c40f5716084a90952337f458c2e9052d5f9478729f68d08a3c6f0540322cb14456161dbc70894214c5c368cccf146afa559b3203d431fdd2ba0643a5209583966367474e7f53653a8c355ef637ff5b78f8e852e3fb54a0c2962546f4c0830a4492e021f4f148c146b76d3cb0f8e6f10d48063c43b214021a76f042840e23926c6095c4880e2a090e74bc289203092d3b66a8d1c4161e32e42e3530b7711cc7711cc7398ee3b82f6faa4c0a070815a5815ef6379eb7ff169912a44c0e2398642da105a9c6568b5205f4ff39970c8e1050542b7469e1398eeb20e77d37bbdb7122a4b057eaf255652ec2e410840c25709081c24191ac4d0a981bafb732b6ddfbdb7f7ff5360021b058b1f1e586171f665c16ce3d4dc9c139cb3915ca70ee86dbeebdfb65d0e4a11944335c2923e40c12503f8831527abec55cb8db9edb6fdbdfee5575ee6ceb806fdbb66da58f95223770c1515464b661e1db6ba02e7c1b9a6ddb86efbdf3e6b290e7cd8b30f7d65aeb9ebf5369d68b2aa359bbce5aebac77bbdbdd6ebd3349c764754537bb2a9b4dd021c8a921a6be2756530f6ea02f375f307528d5c8fbc40aa253160754214786f3a578868ee1349e81431172fb0bed814e9d1713a7be0aa5100a9ad582a943a3541cea83065743340b0572a2e29891d1a92aeb76e0ba7cabd0293a75844e71ddac6248a7341562aaf8ae383a45a7e81053e78515ce7da75b78d52faa8c063d8ae398265dd719f1beaf94bd97ff20a7e7d4cf84499f7a5e6743d7dd20997da8b4ea198b731c54cca191010400008316002028100888c482e1445213ed0314000d69a0585e4815ce629124066114032110c33008c300c400020c014831a60da32000f8766f5fc569e37ce1860b56be27b07018554a9ef36ad1b87b81902dd8f6c31186433e4ab5ad834cfc1d9d6d09cf5d60fa0cfcff8d9c2e1db5e032dd6ac732dd1673fe72b74333b4c49fdd04ab14fcbb065bd7d313e73ac9c0a8b6fb3efcf7c3f7f1a192a79e1ede62dd232cc002ea4c1b34faa935315a2a46dbd70c6776217288024a60d5ce3492e5afd5793c731bcbf368b4a71a71df7a94d0b68f4d8d56cf08d5e6291d05aef62ad45102c1e3448686402aefa37e6701dc002bebf260ef5cca1c71f6010e4e34284a0ba87a009f5ee2ac8a985b38a3f94ae14cc515e760efa898b62b56e92261dfc6f5b75b796c4989c77b88228b662bd5d8670168d1d465d0ebbaff4f04d35f85137b41e08ed67bdd58e373524c665792879578e83e57a7a086603515867b5d7ebb15f054ba8a6db1753e3de0155478c5f2a538a9abb215b4b7708ba50662c3ac20dbaf02abc7cb71fbaba3a6cc999eb33fed1374e8e91910722cd748440c6363860955c0dea69e6f9204b8bc8ca0072e878391138589b7b7de44d5321a8327a3000b17a70ef52e6b081781bed914ddddabc8992cd6c1157dbebfba2585c2b9a7eee29e840e2c5d3f031d845a21bb4930bff784f3d496111c5d19aef8f05f82c25b4fea79a1558f1d50077d1f1d131014d2cd25a4ff5177c65768b59e3b187884f2adac07606c1fc2f69d9d9cd2437e2fda1f44a29f0229b1d233b2fcee8408bbc7cd1b149d12249e601d9a4328ea809d2a917e5314bd5b924227597e2df10df63af4350c82969f6a0b89c2b107d13f0b910e8155097b1e4a9a71de3f3850a8372f3ae180152fab754af28f7b06decfe42aaee060efd5aef59e3e08a19f017ff1be01fa5d66788429544bcff8640d79efc1b10713fef60aab5eabe68402a6129bfe53063a78b228c0a8ba73023ce0930ba9d15de896828e15f4ba1b3dd7260a5791fde63eb54e24ba6e8f366556aef420a331ca300b5dfbad6a1562dd2b9e6ae543b3106deb13eedca9e8e4c4c2ae3d72623099e61a7879acec90b0b1c4602ed3258520783fb1848befb1d0fd8bdc5d9ca159b42709f71d4a1152fa448f78370c7b082c587d1428e70462f08aa029432c5fc0090cc0f7448c3fb9cb28b5c4c8056a12bdfde11746a281664e9b02ec55eb58916e00ef60bb91b79ea8dcc1fc494255949b33e8d0e19d9de975488c156571c65b4e84e570c0703a56cb7a6af1ad0ef3198ac21e15be6c36dd62927b470be64f1d5d8d6a47ee1387b01f4d2da0a4e11a40d62ee4d837aca32533e5df28cefca097df6052ef764c1e571b308cf37a030a75eac18ad651e39b583068a46265d1507889c77ff1cbedac98b1b9464e32186eb1cef04cd57eb86e37cdb4f5c187b0931832624eaa2d322811456a470c51573b77e2cf30cd7064fe03a76ca54dd133ea65c127310aaa0853f43f4a566c2f32517d11e88e63eab3164ae3ee365a3fb2435e70cf826e4d68619659a2804554914064292a230681979643f069916fce8ba6acdb82cbd60c934ed64e8b45390a5371d16f897705ea1bfff44d6839b8f3223404455150cdf3ade55707dae7d088754ce2c274c9594654918c5143f89450d1a3ec3a3d2a0bd46d340eae2cf49f680d71a55101b424a920eee23b07a1063477388d6f4aa46e72095bf93ead51a549675d078b18058876e5e5001765175630531a592c8069ad489a5474266c65967d0091355aea7b26f71d9fa19d3136944aa297665507095243171208f6e7d9ac436a506b90f9912f9f187ca5d041b7d9e8059cb4056d2c45bb5cb895a35835332cf71728e92a5daf50b25e4e7138db344e0ac187628f4d6caed0a2f9bff895af93df4e042d22c39a6d2805c24b194e786f1d2b819923121f828d83b4d7606548661793f4d9d4261b27c6f278814432b1f4c33b0929501040a3314f8d12500e82417c3abbd7d0cb01172eedcc3aa3bba4fe28e7495837cb684e2f7b44bf2bdc4823abd3ca32b0c29d4e5f3ca7045a9699e8c5d52c3ceb0489040f8138da2e1fad67c035de345dbba2335c4fcea9a395b62e095fe28e17e1785bee276d323ec46402849b74b52d58ed3b5a4b9afb8ce55349485102e482b1f0be9e972a9109700519198cffdcc9c434a1019479900b22c7112a22960dad2e6ecc3afb2568f991093987bf03e1e352c41d96bee8870836a5e4b67f0903cd6de8c01e4543d73294af13996fa782aa5b099ce7dec6e65ee4d9e5bb35a0730cf9a838de53371e0711dae30ce5d97882609cf8b43956128a43104cef711b47fdd332852e6e6744ff44177e5e2ac1b49c11804ba39247b3ce7f986cf6546ac87027c033ea128742c50a7b6ea88286fa84494982aea98cb5aa49ab63847f6356422ac22284ea42db37456976b41305efa520921625ed73588cb21aa0b1bbc2cde1326d8479a054e08d744b7d882d66f3f6c71649071197175c18900df60e7edc3fa460a453b629454c9a11c59d8a063a8c35c484d1cf1840c2d20658ee55c06851615183dabec5e09c7f0cf46e4919a873afa623dd59797db490dc6ec478a4940e00ac37c28fa9c46d07d6fba9acb5c6825c6ef7520bac313820d4976add565780e12095bcec0bd8c2bf73f5b4a104060e5d491f4f07caf17728a69332134183de20d818a4f4bb840e8d89a678ee23a49dea57cc35a8a5d2c3244e2e58a98a5e9a023097009e4bab922243199031658f76cdf28a886f55f91387f00fcfe9a9131d65c71b10ede54d6b44cf41fa486551886d36f5e07bb6351925d1319669914cc145e4e3fa84f607acb50ba3ac75525a818e560065e3b6a60727964c7ecbc3972ad25a6a2a83edeebaa4b250aa0028ef43cb03227280e7b00abeedad5630069ba25c4aba27658eb87702b8ede192007302eb2ef7e3edd04e08f97ecdee2e520b713d715162d7f8db93f612673eeb1c9102520e949da82d9721ddaf4653dfdbb531dfc7f2c228d4fe228d4091bfea6a2ca951a6d5362c66f9c1ccdcb860ed11d4f4084a4ac0a000663298cacccb3dfdf29fcdbabf4fa5fdccbac99719f12ca8a39608cbc30173d5cb0d149788d37b41641d3277a090ab0a88b965e26cbb1cbd5fb9e361b9255adf6ede5540199fa528168641684fb1ed381dcade5d3c3730918a8fbadf9f5e45e1dd9786d04d61bd6870d4cfe4d065283ceeea730e1085ea40668149e3943321332ec4a407621da1fa9549e2d59395bc3dd2160eb7345dca0738c41b88eafd99f7d9cac2a1b3830650452226d2572944aa038a8b62eaf4556c80ae9c89a72f246977e09b8efb82808ca368f8e677033e4f5a302e1571532e380eb1fde703674779b397740e7b840defd171191932ec0260ba318ef2bd0ff930007aee761f11676a54d497ca50f7eaa669d5a26e9fa7650a5ddcce88fe892efc5cdd0c0ed0a25289f7cf929f4cce6055cf21bebf2c6f8d50bef163106bf87518d1b061491816bd045489a5a09f8ac457863724b8b6b05452716683f0497db2f921ec487bb464528aa08638245e146cc18541c1507ae0495951235e178015d8186e9041cb278943fdcce4bba8db46413995113ea170089d871f04c3ee575622679e3d1cf4d39abbd902a3103b85a2833200e40f22067ca2c34f6ac990ae8dafe66ea891e06379065121df41df5f29abf94aa24a3d389140abd2a6fb1b0d7936710a0994422710e12169aaaa27b7a646b771eb623b5cd7d481253314ac9df68503bda77700426c1eccd368cc279576b53f9b890b05764cf718dc30ec474c092d062861e8a5c500b0fc3a98e4119a506dd965bf67712aa8e947505bbcf1e142c0f50c494f7f92e294fe76850b2a8e08b040afa141968d002055114175ab4d0af0372990dee1241ed2b43f74e5306f06a1397cea2e296ad34695d8a0c6bf615e99bad850bffe6e4658b856239e3c485c6435ac59e9fa466704cde5329ed11ec7de88072dfcabeda0565b96835054ba6d55d6ef95086cb9ecbb2ab9390b38837050d4af539da454087a4b79eed39e709de23fb92f7e37cf4dcf3a8188ad7ca0bca0355fdc937c57c41e6d89133ef86e735fe9bf40c060814e2b89c6386614e2eb7c7cbb08ee9bfafca2087af37d5167a9c55201102f930bcf888d3e74272bb94f54b3cb61e914c24ea708ef969bc024a90959a1b422ec8f207d6a930d710e5700f6da25409f9cc55e0432723c92c32efd970eb8b7a2440a7a6ebe958addb7f855130d812150e6a6a401815826086dbe0afb1e450995a2f85a78ba636ed7477b852f640d2887039f7aaf8e5534db96279f5c51817e6812d97b892fbc39aec7413f25437a48b99a25d777088216031e4ac63c55066854b8b0fe03ac95cc8817009bb88c869aac2957e6b3e732852b602c2d5bdc9ca12faab840b6a66f669e7ca85b2d6e5c4c5e53aa2b01009642a0b494e02c1a3543147b61bee608e729b8a74d4cc69d63bff4cf9ba606489b1fa9977dca6055e96020c1de2cb086f3a05652cf08b1391461592db95e6ebfd41cd5faee909edb89ecbb6798b09742abd319a93d62e6db7b2f953f1a35586564e6c63acddc341170511435e5795aa8cac8a0e463d06499400e9d38d06cb61e5a01cac6c57a6adc0e04116f780f063628c79c6f9f441bb321965ed8e07aec1f40e4c54a7418ce4ef4ed31a2618520045646b4f3263a8600096bb58c2faceeb8abf09820bd62bcfd514c6062d38a9d513257202558f745dcc8fd77c3f5ef244b8ec3a5b7034c226d5227f7f3881fff61dc1acafdb866b6259b3e956298116fdd72ceeae76154832fc987a10e4e96320deee18242680ce186d0d713b1a1d7e0a4d2208241c4873c516c8722af9ae0d42db350a258b2f150065a14c492b88b662313af20a01435ee398217ec038906de85d228d75d0c819755121edf3a4c86db8f05ad34e0ba58c5064d5c3d7a91a862b59b2a0786fe415fe120a5fa2f9ebef09c0d9dcd62a33c322c730c12a00aa5ff3fcd9f351168a8f6aacac6f2afefb79bc4b8e2aa875dae3ff90b91be94c5aaef5ab7ccd41aa971a35905aa525b7c0af0936ed9e5f379655006dc7f488c4bc4d7bde16d4a3e6999a4e350ceff08e63394442ca264e0e57aafc2d14f2c39a20e69c0c010e2599dfbf42f4c4f4507749301e8c03b2c6e9265cef932d1aed0b8ef0b94766f06e49a74faa12180718452c19edeb8af178481842a4abd709c87e6e4e1ba7506059f27ae998db27d8e114e4e33af1ead7c8a9bb8564af17afe70155539f942f4dfe04e091170b840b9df79c625194889f852b379a5f2be1763681017140845bea9547dce727b0223aa90e1a36d88831839a546ac73c5050ca1ad9c1590887d5d6f12a654164829eaa24a523e4221e835f2d13d4988a8f7432afaacaa3184dddaa7be09f4884acc9825d75482bbd1da79ec357619bbe779b5a4a3b940502b855a6033695942d223d3a7e68f8334c8133b8a3b3d384e1a3b0c3bb0aa9322914337d516e2ce568f7c3aea8750faa763141f094d7291543217a209202cc988ad17eef06407ea68d467aeb996c652a720cf1aa705691d53bdd50fef18b9864c992efa88510374bd05e3e6abd071372b8089b2ead0ca8916a0234db48f2ba174f42008ef744051dba441a7f403cfff5c9c53d7e20b3e10fc86a602796cdb3bf0a8f1e7590923251af79386ac30be5b730904b5900d2faa94c219d354a3d64abb20739ceab54edfb760040f7c4951e3bc430fe8af7c415703173eb46a63e61c69d38519b7957518ffc98248d31005db91090744b7458f99c469850b1a9e322784dd0b6a866fd7c141d8417f2d833759244196101d65d83ae8ec1fc1a905f692690196afc2fdd629e8a77e34e732e861bf4d9fde34e9cbae89d2c1835816568b3721a8afcb9dc1a47d631b8a0d583a208d01fe181e1d488b142d04d8859e9e9245307423bc572705fa539fc449ae631f9e25dbc0dca107e9d5349378b2ccf3acf21f2da63416d99d9f0c68205c542c7cbdbac37d49dbccc81a85e4397349184252d4c1efe636f79f163d15ce75d13c2b98890bb36d0f7a845a9dc6ffe6d36e5cf2befed34e5513964810b38524d7c1821ae33ae8f17244be22d1825a48b7d1669ecc758f998d7bdf96a6cb9496c02480308e6b04fe024289bb48cc629c83e81c4d69108f49f4ac3c9a71b13397dec1e4f44512fd4844b73a11fdfa4fb50be5900b6d49106b77f038164ef84653a19c5c0b74270d61f634a590510b1ba35852c070c3f111f9330d790edb2b06a2e67540f05ddc8aefff3d3b1291bd6e4118263e915045e9566f1ad31cc6bc8d6fab32e8a246c62cf433e4225cf6ccd10e1dad86a09bbd17bb1fe8dc67cbed8eb9085bc9e5690db52435c38c520563db2a8f1556ea63b5aceedc4ef50bc13649d509aaa697be153979657cec5409aa992055ecba8e31744ef0f6c78cb0ce9b721fbe167991434735457c61e437a664d451a868b7446114a988898e59615bb676569ecf389261f418944db42369ae9f2f89d1f002534feb09a527470f03d1b38aaae1af331c08f7a2008932d4c6a952ce51b2fff206585b76574f3a675b4e8808a9ed75ab593979fdc72f809a85dc1689f9e3cc55b065e0c584f7893cf7e0966ab96f833599d3aa6e0077919b7706cbefa95d7a0687234637ca4d4a4dde887b21e78fd417c1af858a7a8c444513f0426cc780c5160d5cb3792453afde6a5619547ca63c93155f8db5e8a38adca2f551c2d499005a5606d6504656d2484c26681c9aab203e4773216b4d53491d691d2cdd3ecc76dd5c085e4a7f261eef816d12ae07d41e24342168618242e824f08ae81addfade4cdef2a5d71c325235101aae34b5075ed826466e2e7bf3b2af8b7cf79be3b1c0999418b61c7086fe11ecb0aa80f3b3224a88745f9a00ef9e7509a5506d9e9d2d859798a78405112fc50d1b841a490edbb9bb9a9a0a6d223d269e55a60adea2bfc27d4eb6da0ed2c9262cae5cfe5f08e224e418b64b4b3ecf4a034729b3aa11abd544f2e36195fdc379d7c561219277b7611a7a2cdc764dd55f4f763dd1cf8efdfa2c84b8c5a730b8332525c05e2e48a1eca8fba0f56e9fa0bad5132d3e17e703b966fd96b4f960cbc72a9720e698c355a884f8ff169d5fe3e22aada50e32630eacb9caf835e7801e165927bc8097e220171ec58302066408dc13167242b75b8632a1bef3dc7dd122e7e320e6c616587eeebf618c82f65f52279aa69c7c7cf23e2a425f865dccf5178b03df3ed47e2682590fbabc161952690c74ed71cdc94dcf53b81e34d111ed4285834592d0e81e0620cb4f698d579279a23f36e9b85df581a142b3e5906d3d1428401e0de0275af7c14417e2cd573f9f9bd26421a04b80aca55dcdee8bfff98d7c8475730c71913e0c2eb8027e48b1917a4b9662b2881d4e35285587f48de268555a8594a016304d308b881cffeb12eae7527938223144c88d9b785f2089c78b6d1d9c0c47b261262903f9ae5b5814268647846e693d8a2398b0921eef46a9ac303f87121f47b5a1dd088f717cdddfb84427e9b147239b83bf7a470c7ae3b9fcbc58edc15d3295ad18ec9ee48d14a4dde89e85b04b3696f7ee1d63934ec58dbcd392a80cd233bd9c85b47bf3dafd2cc86a8bc040f809e5ee2cbdba454eb563d88679d9d7c6d361a9c61af9d3437510e93468cccdf28164f531a976ee6d7582c69e52b0144dad6cd7472ccbdb13ef9eb6b450485ff417af1a86aa28b4a30cc2ade4daba49e4b9360c37c9c72b99bf86562e94ffae9fffbc36413e822255a34c6253cc3838d57d95db9ef5076e8ca94719e4c4b7a05c94d7b15d347046a02452769125ba9e4b6d170a4f4b22dbfa3ed7faa0806f88b65cebb304bb90d07892ded64c8601afff6fd0f48ffb265c59dff46ae16d8a250b4c3b93842e3e3706bb752aa209315b95325b1bdfd5d67d33921c43d0e5bb73c972c5432a095c80597fb4d0b84a7c50460f0fb0f6da38a3c502eea0b8a18838074d477b2996f8f3137437179e76d422cd97f1007a61e37353ae4db253635098e5eae471260f910b9acb4a16c2177ed129fbbfae728f78665b7053b70bd90c8cc9658b65203bad064f3af22c05df1a4853ad2b1c8d1949383e47d340dba3b2fa68e5f83834638d2b14ae286daa4ba3dbcbb41c646c4ecbb563a33fee1a35d1ff388809121bd1172fe3dc908707c3726eb883c388941191bc4b990b4ae5fb186c21dd86a8f03af7a3a9e766cd14ce9443985f70b682f949ccb85c757aceb3a799874ae98709326cc1354af6c7237f6ae51b34a28e21429530b7aa67aac7eae04d490bae8bd5dec07c304fda25d2d57998907df870f2fd9e29580f8eb22a8787bc7208f3218cf62a0d08c3fb1d1647230b5657ccb500f83936ab35dd492fb875d320c8dfc6a5c6d8d910fbfd72251142164841e257dceffce8dda3063e398d405bd1e808b1ab8e342011515bbf63854f9c3078ea3f8e8428c032f7f5c3e196ff0b0a140de18bccd31c9c9a0c76b635ccc5657010119a5cbf50ddd5cab972242587d1e7ea40743cf4b0617e1db4b148f5910469966ac5ba29a98923c0c9e4ccf502e3bae6b985d1eca64a6e3fbb21c71563790006f2c95922d698a006aa0197ed3b2a7d0606aa475838adb521d56c873354639b0116581e5a1691bd4bbf1dadb2befd27940fc0b285e5e642af43dfc265cc27c8032a3675c758a498e9e1e0c005b8ebcac27171da77190e019791134dc84fe513d9012f10d814198d44c6204d06474138772841082f0b45282a678e1ed794832a18ca1b241b9dd2daa00510557e13831b44f5cef359679605f16e84bab66fa16e3cc6b4da31dc385766494c246e10208f7a538249f68776a207b1c7a0aeac52794ef2daa31aac14db56890851af53e935014bf843d0c172f9ede4f2e23947c222c9d3c9d7b0c4652b46eb231eb4c8b34241c3b1a1e80612a5634e7fe6033e0088204ba2c4875290758a34a529b5d9ddf519cd8518648c379300e868304810b6db4d3a6d4644180c3c47e941352e9c0fc9a227abd78e681411af88df499b3e3c954d301aa7f247bba24e6d283019b025e503a306d487b13a9e5f41f550d89a5b616a25f3f127400cd50034933adeb281a91b62fb3220da33ee5466e54c5f94b1457ebb1fffec7de951f46021f9412ec7b184e8de0a1f2ec961b6103fce66d848537fab5fd023c37786573d942d337c6124051d43d8753106369e03bf57add8c5a8272464a0f05253be3c735a444c0719c97fbb30d238ac536b212156e0af069cee49a27603205c5f55fc419aa6e7fb592f309d9d3fd583cbbd0c0686e4e9935e4c1a9fb14dcb1b1604e5ab681bc05c8737c30b5160a0562eead05f32e4ef3cced9d32dc2e665c9969b52a339b445afe037b228e2b20ccea21133e0e44926b52445d83fabea2e2afea86695d23f4a37a095d237be062801ba1d29e1e2832c38654112db75cf2a0bac99d54c75f3ce7a1da3fae907e92f2d76676f53defc0b06a853af642371c43f30700d99522450ec01f163ba088045ede3496884b0280adfe853df0b425c64b40a3dfa74c1bb02bc4238b8be8f531e93d005395fecf0980bd189854faad5df8f709945ad0d96aef0737bcc560b5c807791df508a2fb035c684218a1a87b3a8b05e779e993fc459dd875581339c763556e032ec43df012ae65fe6820c68adc9cb13fd11fce1cd75374667deaf6281f02b088fc3d2310bcbd3e156c262ed6e5dc2348ec83fcda0018ef6c6fb13deabf309e83931b7cd1271a8b706ab3040d5c29df1abc691ce3d62b80a2752f4b57f18a33a7d49646ba9e4744ace2d1ff61cfffc5b3c2cdb9afd3609e21085cb97539aa3a9b20e25c17c644b759a1780bc2da320409abb197e35f1d3473ede842fa19eefd2ee135ae4702b75ec7730b85f209583884df6a82efe1b3f5f5093de809d36ac7a596b49d5335ffa0804efebbb36eba5decb0537191edd801cc329d00e0cb4a2f2403df1a8862229e6b89d612e0a02b3ab922c7909014b5e4e49e3057eef8fe34d8747c89db93b384f53d0b96923a2781fca95f3ccc28fe5914b13b4a352676a418267a43300fb0cd40fb421b89789a9caf20a1a8b51abf691b4463d57cde2e5e354e02c6e85b08e709797f7958423bdef071fcc1b0b9b19b43bb07fb86e278043a45ad0d087da47bd1064fd6242cfe3811e21166481eddb582538cadbbdb30db61ec21c5bd84183674a5eb20945a0f298af232bc7f1be0fc2c7c8296977b2ae383d620fd5bfc13e72655a92d44ce9448ad3035727da8398963e139038d48ae55362c3e94e01f6c6b45b2628f2e1aa3dd8941d748b73ec5e8fd2a40256d0504e5a9c05eb27665ad7b45161c5f065388360c6e22ce82b937e0ac5f17e6c1ce8474689c80574834c53aa9d8910233b4c838531a23ef40334390fac3a19352b8a9265791c46caa3e48ccc03611ec8e75869a4a3e945dd1dcd583efa0348de1463153cf964154a7b3763a44e8dd821fb2aa1e0ee404b650c376460d0531502b728c9412cd4d5a08faa8e80c2ce47683d0bc039d1d364ba74a62a51a46f39fefbb7e501945af109e425a97407254ff2b81d33a7896285a78e93a1ac288bad7990b9e817dff24f3e4278bbe49179ee96acdc1ac9c2e5eb676b7cedd738ef7d3a108880744b973fee3cdde4a891938595e530fb41048b636a34dca556b91082f7e1a4cf9f77ae828e131cb69bb4d626eb40499b6d2eb598f0375e1bd43e3fca521464bda743da5261c15bb1ecc9701d1d0710daeccc1fcf63c1ea32453ab4b7c8cba526045da8122a318a2677a9ee5d355ead826bb6cae3328706e6df711fb81bee9dbbcc858352d14b2b89ded88f9dea0e55a6980021802c5153ca8227c051a745955194071229f802c28d5b02600653f9bd8a3a55f992ae98913a0fcc56fd7e3c4ceb338b4b59c16a5649ed9a9aebe523fe0b949b02c67b8f6161e92853ba3c106d0c48e1d07c2c567129213b1790a2eec792538bab8a59abd96a912673f568c4903736663c6c79de4fe14d620c3d7e8dc9984174e7212b312c90f30e6ce09cb7d16bed888a6683d65b885b96a62eb7d9c4baa2d28dec9f2953d8b9d4183b02085c3a0ee6196e6bab1224c76328828bcdd2ea5789f0de683721f8030ac25ccfb9a7476368731cc58eac3ebc08dc4d601a0334fc69d2f9e11a155454314d389ead58986d4d8ad5ec7f369d14975363ff1b2f58cd144daae9fc0d6e3e686859960a0fac10031340c68cd78349b77f628d23faec5881a97cc61cf9966b56eb17fdf4ba1909e79120f9bf2ad8542edabf7502ddfef63a63595ce0252026301b0082de2f7279de62eeabea8ec8e4171feada6d5cfd570cf6c8b3366ca096bc9dc87db76dbb5a40497c58b8583c70df0ff74ddcc576200f3fd003f6dbc70e3d0a6888ce3ae36455051ef08c068935c056875f657c20b0529084731a76ea97e8f813abaa1a75766f1405b65a058fa68fca3f1175eed13c2ba80cb370cdf98179519b340444c22ef125f2ea1e60bb361c7ad0ecddcb0d7362056a600247bdab4fba653241857e7974f76969d0d1a335a462fd5f7097a03392a9d80cab01069c2a5a01a43ce4a10af372f583c4c4e8e1ccd005953924aaa5d54b5265290ded2c551ef4321b75fca3d20c537364584cd29f1a54d02bd614baf8caa90d3911ee633cb177e8f2e0dc3e82798013c57fed7793a0674294b56d1867b142c5130ca7bf49541cd02202e6b4027be1c4c51d9eba4b8833555b6b71f2a6b69a0f79eab6dc8800d9420eaadf884ba26ecd7aaf210f1fe2fa8d9ab26f63dad2f6e3938838b37e21c88adda57ee288de3bd7cccbcadf3f0912cf7b6a38c2bc6c83d0e1c0c392dd0d2619e0bc1ff91d2d73846023a0ccb8ae6c567b2b7df107205834935bc7a9632c84b331965f54573d6dbc9f51415ca65ac1fe198ea2e1ad91ec5214b4cba92997bfed4b045783a6acd9bb19b94fa8b75d5b5b8979886e775a2076a6176985c2fb87b2c1d94cb955ba1954b47a78b55dc9fed8ed05ec519e972b5daf77c7f9c56f37d2e8957c50dbf87bc31cc26a9d83d3b3d443b66c68cbcad9ef1fbaa365e8f4c472843e6038fa2b244251a78203dba834a71a37188815cc54cb92be5f59a3e21a89dcff42855ae977cfc16a9c7624e0d3fc3c90e83efbac792aec796c217d2395a2a9af94ab31e8cb9d18d4bd2eb4207c9d38c43dbf863c87d5d6d64e40b51aef8b21ae705c8c9b08898aa230b42c252a815b03a46ca8851a063ea6182a1a3cfefd9a814b76588c253a288439c711995326a0e5c8fd5a532e25551b12781ef5076ac342acc33da3f7fa062fd513034982b7be6cb0b047c3551451e76b903a9a207544de271ed929cff3fef25373d41b24500d19a7ad925e0bbced14486e886aa92e6841e040846cf973ccbcb3a5e787b8cf62c6d20f592a21dddd56c12020dad7c9c30fe4778519c4cb52edc38ebbc39df2d801370e67bd617af8bdc91a4fca0deb8a873ebb6ddff7cc299575d3b17c771b101870cbcf691cf5dc08ffc09ddc049752ff83159eeecef0e6bd300b94a1f4beeb2c9cbdfb8a7517aace21146258342a5b03ab1399eae0adea8b5ec417b00540d73ee34af58db9af08779d5f2d6383ffb5ba3c0580af9cb7f9dc8ed5eaa2e4a15dde714be24350c685d255fc37af13a8e0724edd8c800a4ac3877863de63096f7528dd46446cc03c740e4d00b5f0a4dbe0a352095055d63955ebefa6cf242a3c83f55ce4379b5b6eec3c156a39b2aed09954f20ecb18cd778587b87d2750b2d96751091c291c5946935b3e284a5c7539fdf3a6b6e35bdaf61b979ef4e1e2feb5cf6247c196cb763717f3feea70d23ca68233e586ac7ec31d45d80a9370683c27295c14692ccc8344d4941c39e3e28888d66b0ae0bf2e546c9631d67b96c84ab95848097b671c11050ebecdcde27bd7d186f7039c7ecb1f1b53ee7e127d5b81ccc3a399ed973094d76599250e88980172b36863282642541c0a5a8eb060b08edc92a7ad12173033caea6b03e2fd77daf075a3dfd50e6eab32e18e5b54a2669502cf7d6806a450d26bfb45c23b77bd69b64aaa559c12dc5a33de8a08c6461d9a767464afa2b1cf70a12567ec7db98b8390c6d16ca4ed23fc6a18c74c4816da1d0901f9b112fe6bad093056d232636ca94dc6d6ed18c4da385c9813801cfd6342408805640326c99b7acaaee5387533eb79c78c023eda4e59c39a281dc326f86e2a3e9158c625d67a97da3f83606568d40f205735baa519a5c82040b0dde0da147fe0e933f78c93367e5d4f12144fd5a8dbb1703f11d2ba5ca330edc4ae95f650cfd6e83e3160e58c571e8c54bc6dbc7923f36e4c5ab0098cbc6c426c7752dcf2690b356d69b9249e64eeb8dc49b1d630798d82d73c7304390b7443d4ee88ceb41216cc88a28a9b7dbd98752d02c1be8cd9c55503ef240575f7c945cbdd72880a0a3c258b7c09700a580b1658236e63bd510c7988e1d0d77b343e4e6a71125cf234f9a69504817886f0189faded90df981ab2a660cfa0046f52710bec352176eec2e4c32a616ef6d0a03d2bd84c87826a213aef697ce4a787d9e435cc927759fa2a395347161fd7f215744e6ccf11adb392af499291d5a27514e2d26d1414305a9b69c89925b5eca6da3c47a49e9f4dc52227173879ec55af3834cd2944b2e329d8714c0c1d015049f1efac3f03dac6dbdd8f5128520562e278c8be7d97e3473c35f30375ada3c80c225a089a7923de0eca1a32803fef099dabca4bc534df8288b7fd0bcfac6a2f867598b9bc60d4d8a650c56041d810dea828cba9e738d05163313fd6a3d3ad54c868009bfe73ce565283821e20bf5cd7d5174471e9e663f184c7460e253f43e9b02e98a14c8802f21d198c789aaff95735558b580c7c0eca2910c8e7f794e8f6a400bcc5954161756799be18b7556989979c0437e412b42d0a1cd5eccea2689a46ee8cab46e3b6ba220ae9ed1e1a5f4dbe267283160d01df75c7a96798c807a610157e07e3b38a880534939e7f846245089bc916c1e28951f365e028562e397e24ea307de1f5f8e3d337da4280f3d99ba846bf4733e3692d0c826ffdaa4c09eede6be094269c73e5ddb39930b372952d7c4657e61e0a094c7cf86885d8decdd39f18936539d66e326fc6341eb6bd99d0f30c0f06088f87cfd903953b0e0233d4b9ed1dd0d2ccf341fcea5b7fef9a868d43a34b561e1868f7f44b8804e72009bee806890ab170effab69f14ec39df0b4d76c583511edb2718d3e295b517c6eba6ea63516bbb6540a3fe84f32494306e83660f792dc0cf50abef1bedc96cb0cb871dff81e33bad40f8e06938851575fcf7f808013a8fb48614bc6fc9d83cde719db3d99d5e161130c3362c20cc3c4178caa973e4d53c9710a99811163a769362a9b93506d87de91a3c9541921cf38e2bfbb42c71739103d470fcefae45d87aefec37a3504faf926ce2c5ef4ed30de23034b107a5af8cbe6e3dd5893a599d4c79b4d7210c9a1babd92fc0e93834aa6a5f17bcdc032fe9640dda001b884427be17389081fea34fa64a1ba7bf36d291cfe0aad1b55f5cdfcb005c275780fa211b2e982a995d2eb28beb60e2e72697f6aaf77c6e7a26a27e72f1fc7cc5eec8e4def776aafac7213520aeaa1c251b640cd2466573b280365e84cc52e81f6cca33e4b55564ee2d86fc7490ee5f217fbcc4a33883e49194673a8a70daacb2161f71161f1a3e826e58b7c6eeaea0ba58a519e1cea495182f105e8cd905d42482027565edb29065c46682191122cc2057993831bc5fb51e61704d907d3651e39887478545768b42b99f8fa58c5cdb82156ff279a14de5f2a879913ab99988ab7b54cc788cdeb83d6fb4099acb6c8d3b1b0bb4471b281fa21bc7899d0d6165c3a79a26246fd4b9bb7bca094dbb0ac789ca2073ddb57d53e2fedf94186a9217e391a9f334c24d1fdb94e3eb32e1e0295fecbd2bb5dc8b2c21e348b8271672a980eb4ac2f1b2977ee14aa0cc4ec8b260d05ac57e65552e37e79834d6a44e6db473162868029e42e552a4d04026269f262fe4328ebb1708bb7a812f9d2a66577707d43037c1d14e037e969e14934a36340d6c1b84519366793e125e85af4d97ee87ac10b375c3ecaddcd6e520ed764cc57c388322dcd6bbe4e61b697f274037d1e802a6707e3936fa48e01de6b110eeca6791680324c409808ca9d0856c094419facb73bb9029cfe1753f34c1c79557afb5929635a0fd4b2e3f6d216ac302c3d69f11afd530cd54e967dc62190a17ddc59d1f328860720d525331f263be4871cbab01aab96994e97237c81ad2b0211314f606c969a8a5584377c81f6aa9dcf815cb295b25082df9757dc8a6c700e0ea84658b824ca999fca94ec39f2c7096f22368ad625372fb6b5752ef6b9550aa52734b3d54b82ec8b5ed29f06b43d61d7330e2e83a0f3a8781ee68f1a8128f5a754fb86a9ebab9e333cadd01bb4288aa148ffe81aa58eb64cb4e9ad2b113bac3f7728a5af616a5075377b0849c4f8b713b1d1b5fce50a1a091baa71cc8c91cd6eac257c724dc79534e21d884f5f72a67088281b7acdb39c31676904390b20eda36f35543e93c8c6b24240b78e25cace0f91ed9f5b925a69d01a4bf7f0bb75a7107a927f54e2cb7b701698d639217bc40e20d23c8ffa27123ab493ceac89c6e242588e71bb520541efbf6b17d49ee68fd02415ff040348f562eb576c5cf94dd8951d48e772dbb9c86c8bed3301f38f99a4f311414a30b8eee734cfe1898337ae09976cea01ffafd661084f996d7368ec9288e171c1c4e1d2c317532170440eac04a8ce6d766b8f7cbcdf2364345f39b00ddb86410ced4b4821dec75a451ceedc09d96c95505b46e1984e09a210980ad6a2d083998beaf32c4da6f39acd3ecc555fe2ab23a604631a54e068519611b9f3423132b83cef4e890cc920b3313c29961b0eb7727442ae0af7db238f42b082b1d1565738024e8aee02a140f66c97488923920fa2fbcb49f7c69b61a71e1b18e715ee683e50ec3d9749de75ec452423aabf22f287cb1413c7c88328d781b32105238c65d16b021505027f818857046a2a4dd330531c43c3d653216002b6d30fce668ac16c217f05968d6d016a8a58ad2cb985da744b151167af2773413c5890c538cb948a29fbdcc61450428b9c90fbb784686022a76bf30b62ee129ff8b370d49856a24da48c0bc547179d93705292e413a49f41bda2292913c3a7d0a413d88a6f0029b396b66eb20c5ed0f125699a2e0bad4c6312ba51760ded4cc06672079ea47b4b9304245d527aeb5345d74d92a44ac0331348746c29200e011cba5ec2d1f7e07c4ea7dc15e8bd3f4605bcc93f808d91fec790c982f6089877fd467654bac36e0165c227aa8a6046e2f210f56ab83858949f830da32736b62eacdadd3383100c17514edc4b88f5b675d25beae47b1386266b17ee495e8f63433facaff551954093c7701b98f688628b65d28a166856f8c2f80e0b782f0312188747d787c157854dd195e6a77cf659a1b3b87ee258e68ae464c4fd23677167c65b555c0977978d8da283d02ad10d2b1dcb6ce00e3b01c05d8a6020763a427a2f6e144049a84a8093d698d0c6a2fac9af095d2282f0fb15032ebd328958a1948afe896c43b239312b34c41cb0a9a5e42532fe6133d0a6ff71cb8ee4f48432f6cfd7c8499ce30781f1d071f9859b760bfc23509519c00a978e7f00851cf36cc0e8105166769f65f367c85b33f2af6f3897126d612abc3c757946870a557468c65fcde9e3d5f01455f8dea844f4ca275b2f041f54c19d3db3e2a2b7eaaf7aa480e6220f85b58c49f3383b922745420e01ff708f4ff0e3c645fc16234db3f2943ca3048b602749dac035cabedd1609ccc228077d03afdae580f6fc69b793bc124ea95da9453c1a2a903dc86c1103027a3c0cf2d9e41f354980c8b9b38f039cebd11481cc9c883533668791407a57f0170fa717f6034244a9adfbfcf09c2ff2353f0264700aba1e9567238ced94e93a110ca62fa27c95fec0d6d40f6bcf94277ca55c362441848f2585de3ba89403f594fe391ac3a5d07521b8ddb72c33afab68d2b02f4dd284563b517b2c6c08b142ba452f8633e445ac5497305a9b19d8d9e4c3ada07092a883c0cab9366bf9543f1a2329d51da799f30ca454e824e0b4bf9a023262b7b38c8af1c00d5ebb6f470707e825a0eab740848705bb880d8c0e66c4bf7de132213d1b8d0df13f735c119b6897313d6a1b546ac79949c4cc1b17a3fb713954ec6ed7d5358fcd10922cf280edf7045126d76c6aad513aa43a031308514333a7c3ef897c22ae6b6b3f0a46599d3d46149f9f7c10ce5971ab7cf17302517107baa8fa86994ef6fc600ef477b6a57b9ceaaa59c4e2b96d2b81b0de22ee6f75499207dd5d52ca08735e3acb8d23a3fd993bd764c4ade3405131cd65f15a7f565729de2925d59cad152cecd41c2e287dcba3ac57b70e0ec2694d9cf36559412bca1cba2044e5643316ad263883db80d454496358e23c10bd8b7fc89526ead48fa23f45f8f7137f623316e8398ae7c1066e838a00689829eacca95c8eea6f1d1dc441baae8d3a0ec85c7966a76969ae8438dd7c07490a4d1b2cf9b49a840a6039e9e6f14eab94da5a9298d51680eb508520000a3884a4a0c582b6281c24394c3fa003b2733a78ddb1170da9b6cdc9855c84eec23ee0d188424064d8d71afc033b9ba3a3d73d8ce27fb14cb08c59d094a0749cdf48f87cc53ab0c808d0751a238fbe4f6ade19106144d72e6c9a62ef965b82705051b97a631c08fa563cbb31091d0522c89be2178406c671824e035182db0ff3eb9c2ad135e6aa3c3bb2c97b2f85cf17ef0f064909cedc25fb4b20afac34a754ebd42772099b0c7339da47e0c9b4d16154bcd952dd039072377c3ca7ae2167f1357d0f1281696035bafdfaae6625e7ae7941e5bb65ed4db52cdbe7fb8938750ac6d79013e0355ffebe7b7f360f84b4b023db828fedf7f92aa4cc5727569f6d685c6ec0f60c3bff502d129ae20cdd82fd6897461bfcc36cd1ee0e0341973714851da96207f9889a8d211badb9481e9a6dfa3efb904b566d74fc7db4e109cb545a8382c9e9689e4a5b834f4e6369f63f2ab941b4d8aeb764793e76cec416800570b86637f52fbc3484d1690e5ea7df1d8d86b4949b6f03a4466e17ded5c65cd58bc45e87b08ebf74a8f635283ae6f450c99d9bb21fe0b7722d9a43d62514505e51e6f64c86e559d89d7fa55fdb1a57456b9a859c658f381e1760408f10086977fc7878793209234a2bfa2ea5f932c7781dceecaa048dd3f28dfe5418c187116b25efa73b92294160b5ebc973a47c448438fa56639a41b0c8526fd0fe73035703f369f2e4338922566e547922a7965db4fd5ba3c684a1c08716aa61cd82d940de11263ebf33b080bc47ed113476c3301e4b7d18d9bde29136b0c64e9b9b942d06d9d4ab6f71deb9279fffa3ac694fc1091e12d25b512033e285d14a9e29dd045d740cb5a06bb0902bc9241bee56a79646380865e7d4525bb7816b0b31929cd339ac4dfba6e887cc06e2b3c724be8317099aa17e3132d3bf53c39c95370d602fc9596eb0a354491e589517dc8358756d3fa7fb5fe73f60896171c1b4c8155a359d8423e3a19320ab8e50c25cc190510c2752cc27f180508deabb02e79b99216605a933a3281f91a316cddb4688519d0da379dd4fddfcb40908b0fd38a860d60a6ed8066dc7cf46e4034a2d2944d158daf5be9d0bef09b05f0ba0d36ca7779fd5bc402fc7b7f6abf057b8405f93c455324109ea4751b928075fd472381c7a99883b7547e4625c0ca7a8921758000b3075c8417fe4b76e4516566a9d1cc40780dbb28cc9438bde8526c8f3e25e337a3f6a58957e5b99c4fd66ece30937ca9612af30c8873b667d6b570246f0b23f796d96d9076972745296188805a0cda098397b2f1c137efc0a45426963ba1a9b484d0ca44d4f696a65e5df7814480fe9704c0944d224481b305bb0cdc40fb9ce61bcb649e5517c5b30e9a86ed0c604353914ef1aae4577998b53a97aad748e7d49e2ed895cf0607452a671ba40bac941bb82e19e237086262cdc6e96097bd586586e755fa3f2b205d6791e4c180aef12ab7f59a088b520101e61fa81871314b47a511bdec1fd17d048c8084a8974b5fbae1d2e450d66e2f9613cc73c938bfdfb0c939ad9193606c64921697bb06efc5a7dc0d22f8c33db15508eff12556f6f3430c626ce9c3d4db410112171d51e47fdbfbc886cd7e8b7c93d7df5eff61a22b124e9bf3540d976e859d344dacbc12a8cce1e4fed599bc710fffdf97590bb1ee0594be5beab33f35d97f933a5f0c674f847128dbe41f23bf83b14b9bcdd832e2aa3ffa130baf1666e215b2843ff266a34c4e225c4b6f788d5915dbb3d6df7e8515f561f4683bbe27d216a967bdd1182a8b9aae5f9c459f8ea4dbff14c1c0065648a58247503965e69877738e4294130bf4f01df0e61b496348dbf4a50030179646ca46c3386d80cd9a3ec76d64f2186afa27c921733c3187954fd510a821694fbf27de4fc12545002fecf7f24b5e82bc37b75857c82905c80e5e9b1a98f77f6fd5e6fb3362ad28ab93d999e88cb8b2a57ca4403e56db04f4b3624ee15a698ed605d87eaca0408aef075a8731615a6e6260592eee2d8551f6f84cc67c8b1e1e8582cfd1f87a74ea3e9a53492fad84e153d80fb0755054856515b7f6d0ddb3b382688fd8861d86e11dd1b1032844f702ec28f47db1fb6059a2c14e96c682f1e2cb0b5f1b1f857182765e393107e24fd63f0ede65eb662dc46fd4e79f3cef45ffde623d136e3087fefaf52ad29b78a339eaa7bf57919e84ba21c520b83d7c3316b6bfaf44830a261230685c4a0717c816f964b79267231fb34a01d41603da6b3e7a5c4090b24a072d36e1e5a613849c042202b4a591d4cd90add1829704d8ab240bd0fbf6c2083f82235eb0896871b6e6d71e5fcc0bf44f8c5d96e4049bd6bfe01ea305478cbcf4cf636784f7315f8488a811b237d97b93bda59432a594023f0867075c072d1ee2674ea2d5abf500e78a19f26b69b2b8cd91cf91b157105b60aba605b62e1974e1b6949a159f6fc456ab85c2555b60ab0605bf5a60ebea2672544417ee10ce08bd936ff02fa980903d7b336bf4e92f8fac8dbfecf93e80a2933d3e51c6a90328eaf8e98d8459e55f6e238fec8cbf92ea3b54973f7c6df9a416a0f6cb2ffc21a54449e9a5c58ba98cd49da930b37b94d2b3cd5a7a51ea08aa3a8a2a4e474fc74f83b2371d29e7e3b4947146df063f2453cec9734e14e4c048fc26ff76721e895d28155177a51554f75f3925cac249ddea12291d11996afe9253ca89460e94a4c007072e433de44812542965bcc2cf12450dc1eaee598aaa3fccaaa683a94177d525ca3214255bb7f198091e25b4e4b4d737d892c3653c61c493d3de44c112390a683ac3282773cdbd1718008411567260d8a2f850831cfff65ee017e4c0f072831cffb619106a95e34a052c4521e5879160a158c31f5affb4cf7608faa77f6c909ed6b31a12cd4789d0c6a8fe903d757e8c578c524699e3c7e3b797c3a7f6cb1c3d3942c0377ab2bc38c74f839dc35d3af327d101f9cbccdf7a614d1512520209258468201da87a958ad3999c9b4eb78c0e14a3021c483a909c1c71e0404746645a01406474e11a7d7bb5e0480921315cd0c30f56da93924a2924a97c2ae9b350e5a48944f56f2add93eeee947a4deda654484a2aa994920a492aa712934eea990b4458a841a7525e41424784442584c468a2bdd93e379ddedcb3d65c4e22eeceeba8d8eeb5cf67a4da4072faf6c94dc79bd2ef66243aa946db254f2f5e9ed62095c92e19a9419fd2f98bdf7ad1bb885c3c8f905adc0383144627450b4ab632e14626384a6856fc0a76f4be41116ac20680d06073dbac6cc4255db80a6d8022d4d8885a832d29c21f524a95df34d218594750b7873a802a7fec4da73f1d3f3a72602f7a92488c2bf5007589c29052b3d6a20deb08724f4750f4666f1dd5ac8f4a9870fe72ebf5a194525ed785ed5e570843dd90488df4e5e4f92ddfb85e7af12f6f252389bb1f63c47120b4eee3f4a45cd7a377bcd2aa9265bbfd7a2191babc38beded6188ff8d403d41dead9a9dfac13d3cf3e95a9549cce76eb4d67e7ec9e3384a1f6738d48f8c6beafc72eccfd9881d0daf5d7e3ba44284b13acb73563752f3d103c18245d08426d19508466d580d075f4e2524745b74f822d7ca20482e2a7a9621a8d31621f5f669b61fee1d0f177538ad3523abf5f9bcee49a611e1016b613b26d87fca902144050ea8c40f45440aafda5d060f307846b0b5cfd631eff8c76516b368ce81aa959e1f5a7efefa466f5f7d1de64dfdf5ceccdf48070f34f7f79d909cb65d12d144a7afada311f08f778ecc3405e0b5caf29bd25c7c43abfc6c244b70d82295c606fbc0005f85fadb64783de069141640dd7a8b67f31c3a1eba5139f6c9074524a29a54356f8544a591097c06cc1b225cb16a49f6d22af0946916ed5c174db514a690d2f29a5748aa29ed9d61446dd6a7a130faa8197a873ce30043664054b0f6a861d1e9c64644b9688d125d8249fd96b2ae9600ca13186c6287ac0112d4e723043872a5f0451e43f3b3b3b3b14d56d02cb4f518599dd043aa5319446511aad39a791f6c28529247812c50a2e9c68e244494dec791925b8075fe6bfabe148ac3e3b329072461459d0c027053c400821a124794a29a501959ed92a57706880650a233c821d7258222bce50ea1c257a967c802cdd80071e807e9638837f0062244155b04bca2e50ba20d1854a972a5dae4cb0c8ca22d7ca60848c39e744a2d433cb549170e1f131f25106a09e59264eaa0c5058533851448d231d1c79e782c445890b13172ef27b4e27234bdcc867f6ead9818a93cfd7cc28fe830e66060c3302b680054570a891544a295bc0a467d6091424a8e0b4a00aadc90137a9f4dac1862b54c9ce0fd3880b29d26589054d413c1ce1430b66a8d2e4a293664a3db34d4c5713976ec53d6001948427090f37a104171fe40c46a2163f1e021423e0c1bb4285164f0c9083244048240798528080a704cd43ab0618c81048d1ac58da42860d5820ad20678aa0cea8c4a7a786193f3fc42574cad94350cf6c9327393d4871308a3003885a4730cd9e39e7ac01dc160c8850fa41674b08764ad0d4aa011526433d5958d1848a24488660220a5e8202113899734e2f50c06382252e909498c23c60e1f3c3fef8cc5e5be44043723a519fa794d2249fd9cb8a114a293d32e99473ce395b3eb3494c24c1948c78545cd104180eb89282218ec44c0c30543b4c75870b4f8dc187062aa30f4f9aca90a2c90cb8d881071c9a96605133d1e0d233cbe303b4fa2864785006233559ae64c122bb1a5071850a9c28028d20271c3483aada82a9c89c734e1f2cfe460723451538d050e3014456c460869452ca23788ef03902e80826473839020aade9608af880c940c82f274c4eb804c113844f10401fa59472ca939e59295384ba2943ab4fbae8a494529a44a9679649d6245c42c0b3faac093a43d0ec6186288b04c5876ed5c1749d122762031420f859b2430c6ce841874b498f11343a3832e79cf309979e591e1fa09c219880b3c80d5d84500c9a734e1fa6c1c8c61273ced9c44f4f9db30b23974c315161aac27485090b53964b4a294f52269973ce39936891318184004668145ae0f080a619dc400436b482b2700e60d028988ecc3967154858154a58154c58155c302b78306c87244600a58b2052a054844311a9170cd900c45bf46cf1d375d184a45b75305d477d7ee89473ce39736861d89c73fac060ce3989a848a97332c00826a410ed4044182960a0268a90205269c2210bf32065ca2cb2ada61e223d3198a1092a579431c50e3704694e6a7072290d291529b5948c948e70b88c9c9234b1fa22491a34bc6afe28e9de61d066008550f402172cc528557ce892a8142519a38603423e33e433fd97771aa2e326fd970e5dd01714e4362cb4424242f3b752f991ca9f9f0f29634f174918116165890bb468e584febce3dcd3ac1e255a80c1c36ee3c1cef47b4533bd5a9a2b5db8aa4dea0a00062732fbb241173e5c64426f52e58f15aaf6d4cbe88f55d5fee837e312fe58d5f9483dd47f5dddafd0a07c26d27ff350ef71a5b3ab9a16447f058a0dd1d10f37e907fd58f019f9d86fb336980f57353eec34ed0b5f3e290dcaad614ba135be7541a85952dc8673e473907c3937255dc8413640d0d10fbb499527cd63a1a591ef82db7090cfc80fbbed0b57f2b518baf8610fad51a52fbf87aa1435ab7bf9dde25ea65e7e1f75de7c6df3ba6edaf754eddb9eba679f65ee5aa6795b9d6a59e6bf7dcb37e6530c4ba5af7972d3718a5dc137e86f8fd3da17ba50353a297d4dd3b49a6d9e76653c54e563f2b379ade02ce0903c567690908f2de9d6538cca4109294be5ea12d1e0a8aeca8a142995776cb8a2ce87ffae1529439523c031d4fd42dea9feebb510797075c3f8313b4e357e40b8babf30a83535dc2e15c7dde3bce89a01fbbc01e9aa7f541085e153b1c7fc99480b127589b43869d525f2c28a9a82db68f49bd49c9a74e162317ac199c490f3020c2f30c8d91e069812e44499df9f82dbbcb035980196a51c18568a2a538472b62f8a0fda636fba766c21b2621e0eaf468aae86027940972e5d2a7df684d03e7a426c3836afe773b47f1beee38717ea0bf94fcf79bb3bb379fcd7cf4d27c39e85c88a9dfef4d9c9f31dbfb3b353c256fe7ce31142972e5d2af6352a5cdec9882e5ca308502f2afd7034d8af79353ed33f79e8566856bf3f7fc81f4e833d4283fd3d9a85eaa9fd28342be6ba60ba12cce8aeb0c6319c42b3bcf6abd02caf3e600703cd5a221a7487bcc35aa22c9c845f87a22c5116a07e5628028e66b16256959f544c8bd1acebc4195d2a7fe1267d0375e1d76e119ac5dfe4d4585190d39f7a78ca2bb799ffa7ae27271d0f763d8fff107f3abf987dfa44724e5fcc5edf03fb62f6faecebe15f8c04e65f1fb35f8ff9574c0ff9f4e5532239a7cf2e6f73a8b739996b2727dd3601cea1bf31fb42b8c668dfc31ffbedb95e5eccfe9028d90fc1de7f4894edeb11fffa21fed8532f66bf18ed9300f6fe3db0f72f663f27fb7a5c1f7f48fc62f65b3578facfb9fe944417933dfdcd89c9e857007bfa0d89d2c3fffa21f1b1afc0f5f4e937c4fffacd3909411fa74f7f9d3a872243f1f0be93b049144ff4dedddd45f174471c649dbbc7e67831f1e85d46d7de7c637997cbe8f877dfdddd7796a09594a247a9812419331a9b8708a80692a8bbaf0c1ee3e717a681240c5ba217bdc0a060c418e7082eecc4012da798456d04f14f9b4ea43d641a07b46871db11ec8d50fe3c611b8f21de1b8a035a5013db76604b64cdec309109f728a50efeb1bd2313ddd18b2ed4d0983e655317bf305e9d3107864e4324380d7dbbff88daec5a674289d18bce8bae63c7eeeeeeeeeeeeeeeeeeeeeeeef6eed81dbb3d46ef18bb638cb373efeeee6e7a799c53ba77ecd8dddddddd172653bb4fabdaddddeddf2e4d7f5c838893fca9996b91892ec451e3fcd5aa067439258cc63a9675c47a5ded3f757eb2e533ed03bd5c631d5df75b3e7f86ed51e58d3f90adfea1c57b23feda2ccf84f28adacf36b2c5332bab60d6362863504283fd25744be7e9e8ca82fa9c73ce2c75ca55832858ead50c3a18599768063b35ecdeb1d4ac6837e59c920a23536cf01abaac2e111622a8d2617589b078e261745b5d222c8cd8a2937589b050c183395c342d17435477da415d222ccca8b12e111741d4f06b5890ad4c7c9d167a47dcd9c996c61fdb1b0ec4bb70a9f179dbd13b357e41e20bb92ab634aeb323f6872de8bc494f676b7b2d34eded0497cd8eeadf0f88d7f8e9b0ac5167f79422210658640dafaac97815596c2c2361ab07258cba6a30fed41590882d0dfbb534fb0171922655ba252a8327627bb3756f56a6b4064f7589969a6a8f514daa4e2461e2040d4695488ba42a80ba445958a95ef8a3c2380144939aa3ae134048a95b20d18262d42cfec6d22cdec249e7b410fc445a14556f356b89b46052f91d8b1f015546aafc118c2ef4b05b2ddee9290a3b1d21b2eec7ff1ab6944519e9c24e4ae56f28cdda4f88f9dc6a90b134c83244d99fef4627295de8ad9dd9716dd31085162eea2e18722f4d27f10fb1549977bc1a72939e287e5c1054198bcadf646974e882c4267bb35588f9d213a2e76de67363e919e61fb7e19c6e9d8a74a1b75a595d279a6250433faa5bafaea1db711b1f729be8ad6daa61b7b8d4fdd05b95ff8713b095aeb1709ba4e8826685f2a8facba3ab8b38240e1087db5c8fa3733227ba1047cb71446f96da0db4abd37caa4625298b5ac55113911012524248088c4cf6b8cdf5fd7d60a5ebc18e6afccbc648488c52f626003972f4e4c89123478e9f9a23474f8e9f394686547f2c52951fb50bc382196157604698513df5604698911759fbd4f85ff863d581d0acdeb66ddbb69fba6d5b5376b5cdc53eb52f2f66dcc5488c1446b6cdead736d6766f7e7bb1bd7d6aff6cdf3a7a36e764a6e22cdd658cddd18bfd537ba8e2748cb1bdfe69307a777bc72946b632a15caafed9ca832b263b62adf111e6551ed755f61d781dd4a0f3f62297dca68336e74a7de18abff0555f08d20af33912139dea61de979a55c3861ef94c7fb0bd86d42c5afd3bc86de891ac353eb9448f3c458faa7fdcd2a93e1f2faf7a982f7cf9d4ab1e025c776952bb15e505899b5c0a616ae81d1424d6d09742792508fb532f08d7e905912f6382ff8a2ed988821d86dba36f27f0cf8f070827b9f2069bd5dc4e6ac7c845f6f38998aac85937d4ef0f8150e963df55fe420eb58b84aff23bd6de4e9069f0021bfcae168070955ff39a0694d043851f2ef0fc307982c4d01523466a567b7de2d3f7177e75fec627c87c21cc077636e8c2af2e758290b0f57a12b8c6aebb37c2f9cca3790ca9198fd3675fd8753e8fd327d3600b5c43ae930989da4fe9f3531d2c014be31bfd8030d8a07f7b3b4b54fce92da0c121357e354b33d4bd4cb37a790943225be9a3ff71741b0484c88a49e1ee4863ac608a087aa8a8b2c3173f1c21240b28498880062bc2e822c78df82924d0d2430c94d20023872c588aff94a225a1ba446048a97589c0681229138f3342fcd3c7f81a8e1a6b6a046b64a13e3b7928b9791b1bbc4ed83688612fe311a934667e5d6d3991c5e7fac1c4a1eb5f9bedfb35181d21b68fac499a65d993b035fb62b4f7313ffbe66bef4fa4b2176a5548c5fe44a4621eef26b7aee2baa84442429240f80ec6d1a0db2a4e3455ecbf62d8e914e309a9c1ce38ee37522735d87d844617f6522f352bbee49eeb7b77fbb491f015c3fe83ebe367d969b300911c0df317427bcc1362336d59a7dd4c27f6a673fd09c3b00cfb0c85711886611876cdb9c4d4b4b4c5c867fa4acf2c31352d6d51f9cea9b72259231d359636c22235e62827659e4c2f6c66f4e2c79a60cccc7cca3466767ed63614c7cddccccddeeccccddccccddeccceddcccccccccccecccecfccd4c4b454a5a80a965695a22a430c24f9879bb9999bbd59056ee6666ef6e68689d2b9dd639472ca3929bd2eecc2b0d329cbb44cd3b60d85e21aa535c769dd755aa7525aab18a6460d8d3be840631bcecdcddccccddeccfd5cdb99d9f9864fb62164dbd90050a835959939d654fea6e2a73a33c7df277a946a7f4c8cfc2bb0e0373f4ea4e5a8fa1ef154ffd12c678fdc2a342bdc220c348b8b388151709bebfd4d68167d7f1e7bc3efbf6375ccf72f616ffadd3f167c8675cc4f037bc37d2c4db855361c3a206bb3bbc2dec4547f16f62656778ea1faa251fdfb5b6169cae8f8db9d053362e6e72386fed64c4e14be12366905bfbe4fab15f6ff239b2ac9b8ba4fa0208dba0221e3285db8aadd4eed07e1092182b8b24744edd798a7a97f5a083afe30524aa9a44f6964d177a794524aa74b8fee2e83e8755d30bdef36ef335dd30dc5a11da1c1113aad2f29fd17942b2ff02bfdd91bd060bbaf12337982c9939099d4e69e12d8a79f583254fb85b44de77477941a3250ed5eb9bf721b1c0b1061ba8c3f2dc1673a309bda7aea6ab04783fd263ccf6d87fffc42991a7df84bba058f0f7409bbb259f1ebfa4aa131d0603fa703fb882f9949b3224c832a271d35facaccfc39bb33b8524a2939c65d9acba78b5c7777f9afb599cf5f28a5947476f56a96ec5879d3f1f5bf8448779fd1a3f06b59f02eca96b3024953761ad9caccf839766d3c3690ea4e595f34d332a0e5d2a6bce87b129311c4d0a1ea12290179104a3cd1a783a94bf4c5525be9baba445f1c7d61a42589c809700023082a44588ef882a14c00c91225b88105614c611348592405554abeb6f8c000a84bb445861a767f44b75a92ea42892d6773e2cfae85002f66204a7a41ed972b2f23e5eeee3a51cba2863001e8ef9a6c1083dad7151d7f07b344f52a6bd1e2848c2533e841871298c1c389c806486a770004537c5c5085184b39c8e121ca786203a12edba00ae0b1a078697b59c90193f224eb42063a5c453c397531c60dd4080301d0945274ede0238968a241fc18f193049222865660a488a6277e8a3822aac1154a72a424d1ee76a69c537a0e9d5697288b14527435ea1265b9a24ba7aa4b94e58b1fb2e0201ee9527589b2b8a1060552851a572bf97d083be77e41628d9f1059fb190753c61863e470f7978679798bec6ad6ee833146efce666dfae31772f426c23074370d59fff6f6e2d8a17a59d1f12ec3808de8f63b363333b3d74c05707420666666de9531cae89f51173f2d049d7f18310cc3a4d7808a7d74c73077c73e8c3162f11dc3b02fbc40a73538f663942a905dff642961f405d45088740c3b11c130f90ae01b7c03fb5953a78e02a49472625ba977cd19575ae73f646afce40dd717eeeeee15bf06f9ba3ad94de7d7b1894c8e4b744a4e31fe5ef1bb18e3e31801851863f4a07601a57677197f2158f7b7777b7b57a7b3e8d1a34777ffbe69defdafe1b5577fab15ce85e336cb3cbf90fef545a04ba38b5d3a193f1cfed59c76bab006c352a9ea410dafcad8cef02f0da6d47d53173c948412be980271fdd9a989185b86689223421939fd1cb437dd40ef31f4b7ce0eea9f265dc8423fb59f85e2a535c842b18170864e4a745b7b38077b9e220fc8c1becde9e19c18ff622ae059beb8a14b0ef615b8ae2fe6f4bdf00210404a3b39d817e31f0aa7c7984983fd0128140a8542a15050b82ea5929fa53cad41ed555ed7a0a66ddc87c2aaf6a96aa0cffc27f985a7df06298f215d4f9f3d7fa14c90f9f1dd13c2d53f7afe59778de4242723d7f27a1120e0f5fae8101d7dae614dcd0a1ad81bda2f43580cfb9a05e0909f759ed6e0f629af6b708b0d6ea8e79e8ed3ee719d41b87258dd3e6d665f74fa4d7df446fa21733f737fd94a5e47cd66a6d29d4ecdcd1d03b747c7d91baf8ed17861d7633e2eecc22eeaf9b8be3f5e180eebe02a7f848b5e912ecf6fe3540eb0c418638c31c678852028020e994b03619873ce29658c72ce39e79c734e2a93fe9cf3e79c73ce39e79c73d23989b218af06e35ecbfbacf5c2ec4d5f57d7ad56ff20585313e2a8cb9fc6044c8db5a1c0cec4117a267e6c400318c0001a9a010ca0460000a046f9f5589a88c3d3f14715642b13ca569d9fc5b6e189e25fe49f9376979ae68275aef65b5327194997372823433ff4255fda1bd61aa4ef5b809ab597a31163a8f377e3913a45a02254fe9691f906f97ba34647a7c8e347fd85d78c3b4b6ed3ffc5d08f0ff6604c3d337f3a973affa47dbed4e00cc2356ee9aec71e5b9bee99dda4ce0fbd3abfb083e637356fc276624ff5e7b5f125a75ad4ba06e7778fdbf892cfcc5fad967aea0aac7ec54bdb742e9e8f7de84b35cdc27cc9c7d81b329675faf97ec6e46c8450af0f4398cf79747dc1ebc6f5281bf5fa8dabd7bb7779f5830fac74fed763980944aa63dedea6e3723301025f31ff56b6686f3f191946ab4e692578b06a40b3b6c6991a135077082312737d831a87a9caccbbc594d6e07cb9f2199d0546494dec023a194a297dc875663989482aa994df3b5a46ee90bf5ffefb608fca6d69660c8ff651e977c89479693a9c4ffb275f4d747bd3354e39653f8592ad2a95e238d5731cc771dca75435384e95e2388ee3525c2ac5a5b8a9751eccaf525c53a9548afb58398ee3388e5371a9944ac5a954a9544aa54aa554292ec5a538effad4cba738eebbf73f81eb3a95aae35ef559a75275aa174ec5a5388efb6cd37ad3e1a206e3855d3b7f69d42c5fee61bc1a2f3654355230a9ad301d3c6f301da43e4ba9388e53715c8ae3603e5698974f795c6dd4a85123c5a5388e4ba9384e954aed731cc7714f371d8e53a5fa25f52f302a984f2e35e8af4a7d3eb8907bd5b683fbd4679c0701ae196b5cea371d9527539e56b9ef069b7bef7460da0697da71eedc39e3741b46744dbf9ff7c67fbe8c2d708ddfa5d988d2b1518392b75b4ad47e10d92ea0db02f512a9cadf98ead7f97bd3f4f70bb75f1ea897db4b2fecba7d463d858a7d7b415a08574a3f9bbf1f7c6045d543377dc4cbabf3bd4af95c6a5dfe755dd7757d3bff7a205eaf6fb9725eff002bf71937f781f6210a3545973dead7072a43793164dba88fd2c7a874dbb67ddbcc72ee47ef18ba8e2e67844c5d2232802a0f9614d6e802591ab4f1a4f3333a9c66c5b47ff5974faf6faf33ed7afa3d45c7b5719afe698300eaaf8fdbe3b4d644b71f3eebe07a8a8dda4c20525be07afa8ceed528cdebcfbcaf9c777a218c7afad3f381faeb33cc03c255faa8eb7a9427afc7696cfb56c3d202d7d37735c804d4b91331f9547f99b6e11c9f52fd717caaff080d53c31dc2e9979e8ff94238c4fef281bd7cff1781666fe8fb6714a31f3daebe9d405fcaa7d80efaf2e9d5a08eccd6fbe295a89858e587621829b2a2bad5a859dc36d87092cff4f3eae81fbed1ff719678f50febe0bdd17f7de1aaeba5e9fe7186a2b6bbbb0f393bb136b167a620a1ab7c2a4317f2d0105729f2f9c5376a56fc5661d7ec051d8cc437fcb32ff440951fba50a5cf382b3548c910aaf4637c1e727f46621dbb374ecf7de1aabb7ee3a1ea5d4346aacd92ad03f855da6c8efcd919bf613dec25d5b38f93964686ae7f583f2cb75121911a84b124ca3ff9b91a3f366af0b3c8eb8e0a61f08fd5bf70087f138eb115d0658d55ffe2a9aed4176fd597d08feacb7396faf2c29eea53cf591a643eaabcf4e2f1d7eda6a3fa56e095065db6aaff163e29952a054c52fff26330d54bbb649316c2cc9e50467bf1245324a34b2115a9de571e74a9bdb0972ffc0156d5cb2b1178f924964f16d928a2f32184ab333568a388ce87ea85707d791b4478933335e844cc8d04f9f1572fff6282eee5e55b35584617fe12bbc7978ff5e50b875449a5410f7d0902b4f295065fbef0072fd597ef88d497976f75462793424a9168d2dea8541e57eac509a994eaa347cd4abd3f2a4ba9542995ea3381a97b59aa7ba37affecc5bbb6333a985749a666bdec4deafdb394c755a2b1374078e9e56bbcff09a91a5e0d0ffc52de56b9b46d3b5e3ef5598d942742839eaae1cd148c27b3782d704d7d2634a8f2b64aa397174f6e599aa5a521a3231a03a96e7df94cd33c48d5970fb1faf292f3f2bce9bc3ce7855db99746324bb354fd1de7d9f8f8f2382d8d249566c1bcafde5f1661a7f7a59943a77ab9b4375d3d841056abae0b5a7a44919aa57ab7a1f2b6d6f062b5f1bcd5b0f1fd006b57b394169bf5f272e965555f5ec0fab2e4cced2e5131019dcfa8b44c59896a182aa2110000a020001316000028100a064402a1581ec839e20714800e7194486046180ec38120876114c4300cc3308061882106206300524a51941451d97b1af5afc0647bac3f331645aaf548e0f0907503a70d546511123178403d9c6d78c9c21b3416a5024236f73d9ebe24ab74fc98ba3aed114f40c783d20662df65521a48b544cb57b3120bcaafd63a0893069d0b4595cba8024014ffda334d17aa87908d8c6ed5b3e816305ae3d301d48899e0bfbeff6612bff26fd713ea918d4b57b7b385444219e4806f39744209fe993b0def4a1aaba6a5d9e21fca548787b6c98b3d3e1af5fd0a1b6b19f19f4c81a05c86a46e0c3489f4a745818392943e743442a1da186a31bb8c165a4290494b905575a6362698dd08fd5f8bfd1dee909ed7faee7c8fd732a9f1f93b575bbeec4945329d294af7176022e3160d4af49183b5781c80d86c626ce36389a241f665cea6822fd522950f45a9221fa657e50cb29e862b7d5dd8cdd502a3fa83249f6b652b26e9b6cb0433639463b57aab1b6d1f501ce1e9403b8330d0994f74dc959c792cb14e2c64d3a746c1f803846d84cb78321029141ca2eb6ec837e9baa2adfefc6f9941b89489ec13608e431eab07701669a165a52d62b961a3b0646ca741872763ed8cdb0ea32b822612a52f8cd45626b2a824166632f1633f483cd2b812707d433d3f16b67a64a2a2bacff4cd5a0ba36b6a0f162fb1b84cbe552e916a34bb7b639610d3d2176da61ae5c3e2a3ae4b606b0eec7f1f96b1bb893681696e8b2e3ee1eb78f6a96cb9ab4fb008dad84fdbeb1887daf02024d834b05a2cf9c363c3ed6a6d75dc4879a0470f6c6172f4c71127481218961a77b00c2ac025eebd1866ab5fdb99ba899e040d2112f0838cb73dc2f9eddc3d42740e88480ff3f53a274b1ce86c2b22e49d8953e597ebe8c9a20978277c22e6a4451aa8b9ec87d41e71153b4d6bc62956f2c5f5a4c7186aeb08b746869329e261606364ef0a511be286511c2c8f2e139a3bb07b73fc62739f8bc63b4b25aadaad61cc02751a0669dc9ff67807e509ebf2d33206bf617274d87596c7f59ebe1fb90bca2e68508a8722b8756c967fff573000a7d62c4e0a845cb40f3fc0d9085e2f378b0b266ea15c0a57abf01d5e1bf87d8d8cf5c6ac53db04e7a49d89b9e41778c86ef002398a8cc89b19ae41e23043b726790fd76fcce0ded03329953380547982ef383b29c61b70b1ce66e5125fe880a0888a360ec713cf6ddd72a267eeb6d11439478093548187dbe9dafade91bb4d37ecbfae9279639fc98bcefe31270dc551c616ef86cfb792fd50745a771f1e9904db5c87fd81d0df2c6e953fcabe70770e4cb557d93cf8079a275a4eecda82ab2cb1b4aac41a9558262265ca70af17e7ff240dd2fb11a91aba38ea8d13b3f113b02cb4a3f089b7885c4c621278d422dd50685c7462d2b405e55bf8e284cbae4cb44206641fcba8461c7750c0ab1795b9402991db72cca8615f4b777debc816af9dae07df415cbc56ac827c90ff28b8005471ae3e5b11e3836f1c74b9df92e8bcad2e74b128b7e27df0cb367fe6093af31388e104eaaa297649a08610abcd607d79c0e71901249adb01f33108cd6de278d6b5890b3a8bc920548068248985579a6c1387057b143a5f61ab8f61990acd6d17f7c7b95d9ab4726f1bcd4a55219c446e688d831cff66372570647fe0033d4bb061629e1287b4025d045be26647060bf4559ee585dcde6e50abfaeb7e653c3ca0e38ac1e0326450a0a429f20068765a2a515ee2daad8fa402344013a98a3eeb3b1628535e4a2809cf98459691d5eae9a7a8203783eb35b3cb6d7e14d9d5fdbcc9717665677248581cac0927ce74253a28048ddda87dcc0782734a887b34bc0dad1c1fa849c31015a6569d6882e31e5a0ef9be47a71a3e08c75268397e63bfab6e89fe08be08d966215ea5047de2eda7e3885ec11eeb3953f2534c86e626f82142fedb2b3c70ea18b364699b03308db90bfbc0e04ee0d4e22a7258bef9c44d92f12e0a000c8981599cf427127c3ff86528f61eb4d789168eca290b270ac37e59e898311e8d8514bc0cb81e3cc218bb11b5d6108eabe1220f368e0f976cfd4903a600025e9fd30625d79ec152ee435707372a613564a1ebd40f7bcb86f41886ed17088f0bc7faaa8bb4ca65fdd40c9e2e2d5c6d530a247d68395d9952a0397b6cb1d034a20e6e4ff614dac67a20ed637a60ba03f7a5e78acf594e9888f3cb18aaa9803c60cf039d96afa7f6820b6cd63d1e903484a8196ea06dd1a07c4794d8020bb2135ded9f48588bacfd20839a7cf695561e1756fae4613ccb89dab8eef1a992e514d0defdcf29318c1417b84bce24df3f5444ca021c45834079658bfb60c9d6e402d729f2a2b8912e771f9d33c2c9b389a373b7c8cf6e1808b929b47f221ae275a08e9f5a32dd8c6395187cda6e14d8d851112b01fa92ba9d1b1e0b030c7d50ebcb5d5ecb47065105be3d7a6c69f0cafcefdd45da7085741cefe4c612d932f55779f694e3ee37bf4fee68d7b922fd5a87cc7fd757fa1bd421d10f39d2baa0e4694ac7bd9820ada5f2d8947f00847f57eafbd7a24a18fdcb5ebe38323105ef96dcc58dd472d41efcc00dfd3ba723d0fcea052fd0360c9328215705f1e2a2bfbd1883ca3c1fd4e6705892d0bf61938ece6d3986b77d37d71dce75ae8f0f56c02793c110942872d03749c69525ab062f7a287c0435a04a70bea4b5d8b8efa2a2ebab4e4cec61a98676696a6daf72b5fea55b34a17fc38305661c42ca12e2322d1f8f502a16b0337d482564641401baa08e24cd4249175d6def2613acd30a8014b00e05afbaba8ffac109e6dc8000f38903269839d7405f83df28177ed1b2da341330b206c5a66fb5cc622785dd0e747f5135c1d0f0ff5d36727725233ae32dba6da0f0fee58264784f64646002c2fbc7c84982310f45c6f14b7a932067c5a5cc2f4c2c43d206e41794d8bbada83a2c9d5f7fd50554d5928bc12f0e15cd5d3dfd4d2895f979eb32f3e7da624de3e2967631086b4d70f7f1a52acf4849487dcb02ab0b8e950c1ea829df468df5d87cc43d95e139b5c9c0046d222a6da6c40d6cf81ee37695bddca6da8651aa1de3b76fb200b70b06983f3085c743f439ad1e95ae57556607f8fdf39a161b6c5a6a2ffddd5e2114a3d03af9ca2d68f4a99fe6f6324e7792cdce6f80fd03c343ca44a5072d286544618d3654ffeaca5598c08c2990d65f5dd18b700e421eade3d0be941d000050ded48189ef8066002274fbd7b32381e5f5c0a7c6d544ddbdc31875f8dabc82c83512978a424b52c3636b2efc141309c93cc1c7a78e74e4c50889278fe2eba843c1eccdf12922c8936fbe6ad0e60094631044621e8fb509eb8306ba4401397f047e5b47429c593603c869fd64efb77cdb3334d5220e237c17a2c8d3bccdee0002aa6961e4d4732efdb90e0e6dce57b3bcbb4147e78d53e58c676da33db6ed805d7676f3b224100cce296003992e69ed99203cd784757af1d7b48b2859ab375a1655b6486299c02e0eca6affb38251d4b3c41d8ab64a227bb8e10a648c634c62e2a014b2692da7e1098a0a816e268735583361427dff5be0cfb7983dc189f019692c29d7ffec66dbff076cd017437e9976fa6d380140b47acc4acf812b706ec8bbd7636777e8f893fea8ad2a4181d1a54027677bbe5e20d2aa31012245bc4ee8e59028a4ae6c751be654eb28c1c32860c5b206eeee2bbe30eab4e1b75a56fb7a496c2acc869d3b2b965bcadd4027a27eddf2bf887573c4f5c4406ba40f5dac46a1a0e256fb5bcf4618e87ba0c9b513bd827d8322e912b6fab18594e121ac5717813d171535d903a577d8987c4abb5a9ba1e448da5018fa5ce033af7d3931b9cde068d5d1dfabbe860483e86d0331330c60ac811ff9d0fcaec2b637c038fe619249bc94f268f72ac9030964a81c9b2c615944fdb5ffcb21246fd6830ea91e59148ef56ad6ac6216ed113b2d41b73ffde328846a09a8661686be44cd686d376dace324ad5638e01ddfcca746216802abc23c546f05a32cc0ac4de65a95e0df9bb9f398dc3672286dba17f6bd97491d9cd1ee50d85e01858ab84b288bec9a02b043c96d36b121841472115d67af07f312cd16735f761674cf748cf8e06a88fbbcc49627a700063056ec624b6a75a8fec12e6e83e064e65635380d559b83a27bffe9ee0fa2209ed6db3c68e6f857001e5bde4fab916baa13bec66398f7ced013915e6646db64186d1e1d65a1a2c91e5b92bf821ef68a8970d7e7047d605802a644f53523d0ac07d750146688613f6a456b30216fb30cb54a81e5886dda06d9ffb1742310508d20cbda0e4a6f96e9c66b80fb084504aecb828cfd9bf9c4072c2b2390d72af544466baebb4df7a589e1a11846e38746c3949545f229a3131c8728dd7c3521b345b77dbf1cc19c9de563c5d9d0a5fcfe8f78715af4f3c3d8a9ba9b15c83bb865234061a7595fe0d7c04457bcac58ba5343c4738d498e80300878e28ef3e28f7aec8e046c64c7a29fd292501f007a5c959f431ea11316309a3d7ef2cc52066bf42c3bbcf8d44773c6e462dbf3791e40fe22254d91bf93c840e5661ffb36398fe7c103c26bb44057a4ab35a4359b47703a6c6a6e0fa08c8d6f890ff20568e627c55a6a9b5152d75546a51126d179ccb9b005fda0f88b207b56341907e82f162e92d696f13ae40b5dab60ee790750ac6416e7b21d956518cfb7b1e8b512f06be25287383a82b8e28de3cb00ae0cd66f85d0aa3afc74d7312e4412a4f2ac735e24110bd50e01f3d1a06e427a2a7e118348d10a49a837898da665c4967ae7d56884019618a103dfa196606b0e1b92431f888d2db699e1b08526a84536a787de1416134d51f5e713383bfc6c2f5a58919ff18a3855a8d84daf7fd7d40320b96e53d6a9e4cd6e74fa1199374c19fac833347a1ecd73decd26ecf4a6d54d0a18772e88b28c51164952a538ae38b559d056c0b303730782140d14ea79a50c74d73b79355787b2e3163b38b0cf6fab288ac53b8b427d2e14b8c94f0faa681a4561476cdc9b2ffb7f6ecb529c5eaa1aeaa2efdf8af003b7ff5755d60e93fc5dee667f953cc8940c2087b3ba63973c1173995f08156ff755178a29d8a689cb84824d0afac54c472e557ba8c0ea3971f8010df720c69a5f7a16a0e1c03d0696f021298afb7a580e3fe0ef0a14672fc841c0a40800989d697419c8bac4eb398c1ea6ba86039f410f21cd33d2b1a074e8ec6880d1f594af07046fe0d222c29b5e83fa8880a8ee142fe136f26cc31b86e303707365d2b82f3946040ffc7d7878f061e90bd557b69bc6f3294018a92088427d89d161a0f3bd2a382f9cd9461a15868e231d6ca74b91cd57e786e6793bbcb28284828233ccb539340fed8e12fd25f2719bc2c7ea8b46bf5a3751f99ffabb76f72eda5863ce0df6af5ec5428b26287bf840eccd05f87a60e9953431e7a20ac221f2debf0754027bd08861dcafbfdbb030b5b9b69edf74094388d2d80bdf8e0d1ddc7f05176be7eba94be2b50ee0e986460e970e599b04c71fae8378249bb4ec5f4ab98cad54144b420b20c56b87e916360e0c9c2c1149def9a6a607aaa54eed25efa66a07909730aa9a6eb6293912d7c545a453d6b69be6101b6c040a57c6ed3fa42ea2a9a3ec4df553dcaeb46eeda5d798b82c8e89da1b99d8e6887051f1bfd86390d57e0b58d36488eb7bf779cf1d69f7e6fdd11138a725f434975fc4b2424a254ed02797250408b7ae6f1f0092679d81ac0a20160e2f70d452927db62f7a5d17e8571a3386530abe332271becba5e9b4fc4aacebeb12996219c6af5b31f54bdf16b1be092c186da36cdf1f02c8d24044e9b79df1aa264bbb53f37b1c281d01198ffa01a1a830197fa505f74adf2a80a5fe3916fd324910007f0158914316e6216f6c22c2223c82871761be88382447f6cdcdfbe49590d0151145121011cee42228fb14fee0cc09c3ccce5c9dcbe5b05ff9fcdcaf8340c9e8d2c687d7aceb7b1998e675e799bcb9d0a7134904e69c8a286f977cc56a7b3b6a1724ca517eb2b48d2be989abe13229404025f68dc58957c69d1634a0efd11c991c268ab6eccb5b85f8fdc3062694deebdd20f026eb48ed8d99d6015a457f8190955460b783585b76b08fcbeaaf56729d77a3557f577344d7a0ef2a364e03226464ed775808801fe9647e57eee1332bca2385093d5f4fbc0966aaaced8a77f6c4ca15df3dddb5deb0bfb941a8b7ec1af2a0a547133be48abe8291efb62fa8bdd3a6a1811e9c69f1047ece70860c3df65029bca476cba234b800ddeb30acd1973593b195287aa01718aa7e37b5e24a7bafd03bd765d395cb0d58b7fc81c3b5230fdacb9d7cbbe0d35772102f57a70d740dc8752cb639e45ab0fb293cddf43d942633d5bbc2f6e0454d18a80b030df7a2df788e0775a403e2fd39f86bbbc70eafc99091585b7de501f51af086430872e3efcab807b0e319f603de307eb6aed6b7de53baf30606fbcb5dc10947ce520d082170923c42cd86ae0d88b5326e31f121046811231c1017122a929dd81754d7deca54f283eee8a2a030bc3ffc62f0f55a45cd0b0edc107650d3a1bdaf6679de50098f91a40a3000139186a08373e3fb39a560354edd4c75a948e756f14a078593ec047fb81ffdd13a14f9a860744e5f14dd5c859887be419129c5924536424d78e6978d2e16b960b9fc36b841102562ad938c8136231b4560ceb6fdac4fad27b7dddaef1b2b17619ace7e5434c014fac14d038d7ebb94f059033ffc8bd8c1a2b0c14e6a10227c6297f1c1c5f5915c5d70d9323377aa4f27c360d5ef8c08e76c3b3df402ad11e8ec756ad3d760f251ec8c4734cd66f12fd2daa00f8c695ffc6992ea3b0f37696bbe5036cac7b8c1280b5fe0ad9640ae1e2533aa427073c79870cbd081534f7578ee1170044be38fa65bcd734771cc71e42245a3c2ba35854e1691b46a963db9fc15ae35acc70d65534f283894c859f39026f0bf691e3b3925342ed63833920657aae5a44abe43c9b8ef9dd571c063a77b467ba069fdf0d30f8b017fe6548fdd4bac60a58a3faa9016090e900bd4160412df345f100019848ef7a10ee6b475235e1c69ec29431a42e5180220f4f028d49d51e7136ab397eda5d33e74de76045e6f71a8f15d59bd1b0ad9dc876de5bd14414eef65aa10219fc5efd1e87d75f5a99316acd334cd01bdef80975b49ec2acafff0b28bc9bb3500cfb144be3cccca8e0b06e5f7972527e8cb8e1b088f5fed7bda96448185f1d3f80d096d499bdb22a8cc363cee8ba02101f71cfd03213b493619769d0cb6cd1d6e222262482e6b2522c21f94e1e6fc6cebf59f6840b7b4b380d080eb9450df4e311aab74f98a669d8647525ab691f268a62507d254748b2e331c15123a18180205949900bd0158fc796c2f976058f69725d78c6618a37605eadbff36c18125abd574978b76fa4a239a277bf55e29036befc71e7275546cace99fb5182203f56d8bed13699d6f5399a90aceff5951544ddcf9a6c728f96436a84717ef79056cd0aa0c462f6438395e9e278dd45eae8bb74959b9cd469c698104220c036cf8dd66631a9e396634c9c7d0b429511c66376a83c145bf95d15a03e6cc50df26053b0a410024c4676a9b4d90f2aae5ade50a1fa963c4bcb552ef261aec3017de336dcdbc54cc5814b25f85bc3d4e0cd77f8acce1d92c93dac978d8679598b04f61b960bc466330f05ac361129cef6cd8a090bed7e084c64f1e4f327decbd991ddd39553a38de3b15d02c193564c0a9186026cef38542e5a864b77a5f4a5273db94a21e8e0eaabebfe48bc2a7b13b54f0eefba5dd307ccdb93b9dfab6b0d58b3b9f9466007b54f677eadb38392f9686fbc76e0c64f54c1910f298f36851bfa9667391938c1782ef5d8c2829bfe95779d646611f3763cbabfbea2ef058430e49b0f8ff9a3f4e8d7f86d5b65e9820252b9fd4b0f72580ad8ba87f0d02123ea5328d9820388f4a53749113478981f7d7f137694454a23cfbc21ec483ac428e57873eae73a9a88fc160a5794609d590ab3ccf8c4505e9d6f0fd07870d8e1d5d330e18abbf3127cf183df5a703f77675043b3a743d535262dedb40345d2c5ecf78443b5fd9f88e35d75bc3b3e343cc6696871ebed2867d4369f8ec010e84606123c1f439c427f729132ca98c0bc97322d2599bc0eca7530ca929e1196d3062df8141b80b3c8dd9821ad08be5ab3f9590be965f4d886d4cd7bd5fd9bd1d3a0e013b8ac891c9daee42c8777d28e6c17fff844eaefc4784e15bfb433bbcdf69bd925316e7a8d146db536be32fcac544d8de424631cb73d8a5b56ea1cfec221a306331d398c804ca80798c7e5d31613a3dc3b8b610ae4798fb2c3abba4b1f5cf5df0bc59a1c8edd3fa334b713257716bb1ad5680d5ac5c8841c3334fd2b8aaa37a09cc33798f04f51da93c4d2427500932da7d3cadbac0a89366a79fa2554f985951d75055a2572380c205a49d37724ce712159151d3920ebfaec8af60a1f438b76cd704845d6a4062ae8f9147643249e718461b2e500f58062213bfee43ee40ca4b21e4e6818595adfcf65de8cb7df845de70ae9476b539022ed5908a1c4a5c922d6ee5a29bb6ad121f715261e57bc6dcf8105c1ce4c61e36f642db5b1c845fd11b94323c14fc7fcaa80550a5770b5cda8d8a4ca684807f079c2a69c10df0ccf63e73a83c87ce0c0686229425b800739ffc4b70529cd96144bde05a216b158d5aa57104dfe6ef5f2755591df3dd21158c9af213d140aa6899df54ec171b5ffe125593461b0216e7dfdd82dc6bb2a1dca4398a9ee0dfe169096a8cda48640984e2a8bbfcba2f779bf775734e76e58cdb8cd67da2192420247d06435af675eaa16cd0ba666e675daafe561ec7edee3fe70da0f26252f816cac32602c143df7ac29e26d401ef039a7c88a986a1c302d4c98dddf0a6b8771920b1a9b43d8112afbdaad77e70c5fcc78b05d0265c2e1e898a0571667e331c03738d69b7da70f2ee3ac82b93f3a0b329b3e0e3c8238569b8a06199dd46ff48c84d5248906276f8ffeba645d2579d3a80cc5de6d9a32cbeb16ab1ff09d233ae2ef55388d9f5a1e02f50dda5f053ec3884fc46a32e676cbf68ef2255e4d3cb6deb72369f7b438190ea369431cce602dc9f80c02fcda3a58f3325467bbe009d01617971471b42e6e5a95c5c66fc70c51c99f03ad92f76e2f9d361fc1c90513164463a48e544562faff2e0d65ae07d5f02ffe029319be7724503030ba4c9bfa1673654fdd20742e8a6a02f0023be6f1222a4c07f68bd1048d9ef38be47e0e3e535933e678023d3491e733004206224b40030753bffe5ffcb4ab4aea2d4885e9ef2912be9a7c54088d3fa011a95a67cad9bf50649f5f00b2dc4b2fccd9986b3824804042de0a5ae802d20380efc4b078a5066b1f81a42ef16d68a9f73621d91a7c913349a5d3ca9839c5345f3c20d15b63a3283d6f7bfa321aa0d52676b3d0632126a64747ba334a20136e1e56db84215813c6b849b106c66ac2ecffae16111e1520784831188a27d88e604c7fdf294733d90ca125a8bc6c2d8561a2f32fe8cd04f29e31ce42185d341694e14c0f8a4b556ba75319bfaf8236f2de90f317668e5979889979a12542f87f78cba4321a117d95dce817130d6a0e3bd3f1b21d6e49e703aef04cee6f0a7a983144087a4dd91010772af3260c33986e3bd67973a70466e0338cdefa11ba18fd423bf9da1309bfe370e7ac217dd637373d8a837332e1eadf62efabe363e2a8d0ce105110aa934880ad7341093ff9567387fd70641125ed18738ccefa533af0ae470348718c486235a5fb98a828ab5e743b6f3693040351c48778f2b76d0d912b1e5715b079ae12c4d953c7a3bad5f110d40628a17905b278a45704e9b06297da1cdde40c3ac1856fa6f21e6094de3f02d286aa7056242adbf81860128772d063241c68d72cbece7315a44427eec1e17cac1171d83c7dcc78512914d13ea299e01e1c33885b89fe27ea576200f12fd75fcf354c0989e0100ba971d4f4765c3d5ecc13a737751c7c77a9ca44897423192fdc7b18311ed8a388e8928b3c4bc857b9156883b5f4fea93add594cdac567a7bf6fccc1226cc5c4a8434ea98483745303cafc492cab9ab599dba21961c5d2e540e1e584e60863115d615af5b174678e15789c072dbba1fe8158ba96186bec508c26deef2d7a4150ea928b87aecf27e62337339e7cec44ed1858f8bd34d437cc97042edad052a348f6b109440767ed206aaa92261910636ad58f8950737b558b8ae0f249d7e4a2a033b0051266b27461675dc8cb455d9a08207694d868eb3ac71d2665a8d300c70e9574b08e12cfddcf5c2b898df2a1c49256090f5cf6f9d4d9990aeb50d06fdd14e563910a6ae91179feb1dbaa0df48843c2ea533a840ed8e3fecd1c20b58d3804605cd0e384de809c6226526973fef26cc54263a7a2f6b19c63fc320fe9cb682983361520903058ae02fb9502765db79e9de11ad923cf44eca28143ebf39036ed9ef8b03f45611b8a62e71c103f76c5e522c1226dcc6cc016ef80e3d73671e922706d140610a9fffc1701cf06a4d2dd1a7c5aad1b3e4fde6d40d7decb6b3091b1359f38c0b359d848fbe337a314c518ec952796f873450f721fb0e37b38421ddbef7ce07fda743968d9f6343f532ffc5053c1040c8e01066b765e74d027fd1f61aa9e323eba3627980de3547dd97d486fdf7e71e8960a3e5ceaa8f7cb1b78d493e0bfd687605c6c01231ff34ed88257a0aa35ddb91595963545e46f36b8cdd78c4c481b623a073c04c0bca5531116dfe643cbb8e63d5306a88156555a66ed20627d0fd6dbe0359a1aab794468880cea4f325448fbd7d062d6e40d166b13398d8fd1929b67485d467e16d955548a45c5db409a1ec76d7941a85d648a78c629d5c0762f7859bd25835e08aa28455861521a05f30201dbecc24897ecf1f9d796b254ff497aee1e1b2980be4d80535b96c99df810f0bad718a66c832b839470a954447637357e56bf5e2b34e429e5befa443f0ffeca409d7ab1fd90e2bf721eb35975d9591eeeb2c2f3b0ae6f19f2e3bf266b391f7105d38184c8c18c9f37f6e2c3cf16a7358ceaa05c13782f1c8203cf09ed903e095ada7e50cabce09d9ba8f1d215a32af8b1cb100c374e53a022599afb107ef7dc99e0f53acfb236856ce516a69a4565ffe017efdfa46efbb045134b67e69092513633f0c530be02c53c9dfd956d4f94e7d5fa19e5cc99ed239270f6061aa08ebf5d0eb715af3e6cb08c72efe7ffd113b4f9ab06272235f6999fa9dff1765ea7c94a3c9afd6867765be02e02d65dc036081a8b47ee0d01d0618f8b0cc573c4a0279672763fcc768bee2078935651c7af515a0e9ffadc91a27313ac56360b45a9fdf50927f15072d471e0b9a9ae469bf5cc2a51973c71e8284064ecde949f9191795e6fa619eb1ca0e83aaddb1c3ddf8bc2caf76fe6ce07b13757fd84173f70902b503d5f34b8507b586ac0756f1d1d63310b8ddf1c10bc39ad7c244603b9e6eebeca1c7a83e882c23c49a65a5952988f5ff85863a0d1f82cebd120029aa8b3b7c38028b2eddfce825409ae10728eb6662c96b42d285d10eb3c71387cc260e9a13fcab15059104d314ef9a19840bcb413e6d24175f122e922fac597a3c9b88e6924112ffea080a50a732c6675ee0175c768af871bea4c36c68d043e46c68f9b52749b1870a522c03414a7572f9ece45cf37c18123ebecd186d56e5f0207f4609a76660c691d44c01d11d8c38afb3300042ebbf3f0aac8bd61f7bb94e5e8e16a4ea4239a5dbf6545cfdec6b8f299ddf8742ab408f36f87c88c3dcc216a75de946ac74d4dc3d62898e2d0fb58bed736e084c2c2016d9a45a59d016ac1c7952e596dfab665f5482f1739444873830ca784b617f0a10e678260394d38177f01c95859f99d0da38434986c0b9d9779d73d8a6acb2a8863d8a0e3ebba149cbb0070f12a84aa258d9128a44b958cbd46ade069e756bfeb0dcb4a9b20a1cd24c376e7461009d9cebfb230021ef7aeb91755114cda143ad4e8ec621a8048a962e96ad7a319e6227dbdffbd17b65cd912b4a3e2240433a0c46ed092eba96996a06ae288d7efbf30200842607bac2c2dacaaf543058c4320a9f4837f9d3d09b41ab6ac6d00045217dfae708f982c425b70e63f15b0a9ea81f3efc647f31d1e7df0f0d3e294a9929e8efdc2ff59a48ea3a89c893a16c66242f2dd79bb692913159adeea5a8edf8aea6952d31cbf1e3c32e61102e6255eb61285c2804426048ad61153326c87573348cfd05d6e98e5111eddae794fa85eb5378e0afdf00fd096e9211c98668f3309c35907c4ab69173e00f29f6e410bc1131760eb314e104f3833a072b30543aaf4ce7a08f9bb3dbe4efefe5f89c8cc7502be0e9a29cc353488e648e1c81f247661dbb117fb01bf2cac73988e3341644ccc0b265c539642eab291931bb8745acfd5ff5a8ebd3785487062bbd8ada8a3653d7aacbaf7f9b20e70a4d5d568033c2049cfb9ca23dda37ef3acc71918ab9d0ddcfe3d81053e1161c9b7512c1b774f31414d7af44578f440744340e79e80e7d090918a729db34b11e4fcbb9c0e79c8f9fdaca844c5d746dd3451a26b9d2f9855a0c991afa5fbf29944f864540291426d8a48512e5bf01250ff7b09fc75dde5c0c185547a440e48b38623f46393744661ad55d992f570fc0264c802ad46f7ae8ccb0431df68b5c680f0a240943f70d88499447d3389fe75f3b20aa1a61ef173a846a02f2bd762aa30ae007e1a189fde9598176cfc41c7f3a4967dcece58d86f3dabaa1b61670e31a7210830f916ad95e0693d361ee79b773b5cd6751800823fa4a0a1f05220881619190410b1992e419f971537580fd31771a0c1316cd4a9c699af89d7a497ee54cff40841b383c1fb292bb89357794ad716eefb480fe128f87ae9e06526a3750b0d219b262d37da245856e2077e021594e705384caec0c54e3b1289fe4a57ba7cc7fe49176dbc4b75ba600889d41a2227751d71608ae9d4498f8e87d903ad4bceab4c389d598f37604ebcc8c2a345185374508f4245f48354241db2cac2375470ec19073db80985d0cbca811b37ee78b14fda4fdbd6e469614ed8f1561dcdf68dbc0c100eee08926c234cfb921bb7522cce99efa0b2e82f263b4e6066cacfaf107ba87d5a8666849d1deb54684e72254b6c51b0a16d067a6e00c1ececd8f0c3f10c3450809ef9b6f8017fb578fd5d93072f48c0e34fc872f5c0f8e23256a58b31a43d6901726ce1c7ca9444906f618b714b41bd48d738f83d5e25ad368ccae479250628f78f6ff6779a96e5a2285b6f6b85619e71141cff4df568004a8e5e35b11ced185781804376b791a826203f90f9709d0442ab5ca4fa052b21d7b8b4bc467d98f1f26c0e866948e5bcf61b6428fc1925fa4bda7c9ec55d5d0f0c940e43b5d804cb5e2a46d611df4d908a26f9a200c36417730013cbc7f8977dbbe229e3f4c79b6fdc77a350089ae89ff337c8733dae21528614462c552cbe88cfbf7642eca95cd7cd7887a550db7bfe982e281d237c3e63f69fa0a12b654977f15d09754f22b881b8c6d36de6382a8c71692da916c1b32899414cfba61d71ace810044541463850efc8d4d297ddbbf508977f358747e05adacdf25659962a297e08c2360df915d381dbca22f0ab93c4d50fb4b9fc8f8f8a113c2e8bc92becf74c90dbb798ca7f8a4d0f86aee569e8ab16bcd31df5a0efa2f5810a7732aaa6009a339d96a5c027ac48d5d2d29982802686521d22c30c9a6f79302d5788a065df62227800c6e917856eae1c12b81782f8d1add432529387be00bf71d229c3c491fbe72bed65172c40fa00301142d445b12ad93de4be9f68259e186fc20670653f488e297f79f9d6d9b029173f1f90bb0e6a1d48eaf3247765048c7414dea6efdeeca6ed628750af399b5273c2cbf3e376d3b78fa3d618f584d3e32f40e90a8caddfede3651c1ef5f7d19f8671ff0de60f8324c10ba607dc99611a2b2465821e3662f7497810c23ef59bf7238fc2e6dcc03c20034834109e9e43ac7ba16fe68c234973da1dbb2d62708f636f703af16244b34ffd7bf4b985325418ce627c3e779af384a09c527030257ea138e956efe6d66eedd9eb41dab2d3e303f32dfc052f3b5d6960678aa10331fc0a1685a72a06fc90a9d8aadff5e0a4efc82e1c5a613e614fbe14973e36bc8c86640c032cb90648da02a2324a912a8e222dba4858436868d02e6f3b8ef588e3c075fbe0bb0970f43e5e1ed4dcd6755bb42c24efe9d7e8ec82954590d9f109d99dbcd60045f41a369f1900c778af522c162759f043b8b8d641b27f770dbd32e272b8712d6687666e8e524d9104227170f54526830f309fd6337947e1ee4b7092a61a43d0639c8ce620176a82c7eea803ec9444afe9a668d0f1f20eba263617c9851bd03da35808477e714fcd12ca51ec723f3aa5c4d7a3c1a9f40426088155800e8d7fccbf2c1380ba5f2d1cb831407d53cb998db9583e56fdebaa03894ba7e3f1762ffa86069d51db4f9c4b2c61331dd3124344d24a1526371c68f3c60f38a19c6934ce9735d70663e711e07fdb7cd5b7b523a98112906265d11c04a74df6916cbf74751a21c04b0f7d5d018b85fa204a16aadd05a5c119b21124fe771c504221a14c6ed3c5ae06e970e9684d95d576929d48c8f2c6850991c88f074299eb23ee5f4d7b0f169305feaa99c50e00893f9cb048b20aede8e34257ac0b62ea20964083d8211b6992deedb9f2dde3c0ea0a74c49e750ee694c73c2d1b4296d11da8e074893885c2e36d19f1fa63ed223d4754e4a2547a5e3e05886b7401727ff2ad22127dc03e60defc4c1779385b63eef0170d7cbacef684704a3d74ee1f3646fae33dcd538cac07b4a9d56c3ba7056a3cbb1ab8e55151598c3dfaed3afb4b8e8911c0642bb8343d61e7446defc93b5e67190d722caa795c8cbe46d7fb4d571d9909e828548acd76c9d251e1e64d0032db59cf1ac8a748b79e38aebd42d1488baa31bd26725e45098c142310480a979e40281eb7372af8c4f47c3507da115e88b7c0df525d210108b3d4dd4ec7a063359b33cb66107cd9aa3a0d4adceb937f63266fbd8b6c61ad2c3f5da143ebc4f0399e31147a5f99776807c2dcf644fceec9616d50b6ad2a77bea89f25420cca4bb1b9114cf362577fa630ede49f9fb1736dc61c1cc3d471b902fd044a12e1dbb3d041740aacc15f3adf9dc7d2937367375609239ebf1338121e409ce82c071ba39941b5a2530973800c4eabedc36f4e90f20aa0db779d495ab88e85b65f2cb223b01b4c89cb74ca73dbda6196ae429611024747c8f77aae641c51437c6161a38b58ec40a6536defb6962b9918cc5d5932f187d15c02341d684f833e06dfe7e03ca40e1928030c5c00521bc49bddb692c7182262c8adce5c33d7f2440b25ffcfc15def498ae83c27e3d980f2f55f9104b9faa515966f25421a51891f5f845bdc9dfdcf73b219890954f738a09677fa409356d9f2a2cac86d5eab4d99f349db2d582ddfface17a3258940683844f1821b9278343fa1d9f842bcaa048f8604650e69673c0e0e94bd854d3a157bba60fcabd27021d34a3c6594038f75fcbb54ce24a2d3e4945ae2df09d2d3cc7b652a6d8b449c15e2db6bc8790b90be4f7cbacc086077d9f176ea909a149e03564cebe31fb128770a7c3bb170321608c9beab2f665c81f7c419d8f6b9eddd0b9c1b2fc0b1c967fc512cffdc93d1dff433c4079ec7db5368dfc071401b2f479035d01313f90b74ff70d7ff1689abafda132a1fd13b7f1ee1e80751d65b220ab6b72c461340becc1122127d32c9c62822ebc3b679e2542b6851158f677d9e2815865895e001789c2feb394a365091f81b264038603c6863899a591b1f59c40bf47215ce9bf13c5442cea94ae9e4c61532905bfb0e85cfef6b6258baa6f51eb4b51c482529ac343cc807f6584a579f822c10ae5b45abbceb39ae80ca4081c31e726fe52659d7a1d4c63c43bd6a4727cb2024f8ad7a1ba8d3ce2af96f166f30831c773c8f54541776a93c7940a59aa2375ea8b968db7addb74d1450cd2c713adf2ef398223842fa28a1c34fcadc2e9886e1049bf90425c2d45ed92ab071f2ba2fa5c45512d38447433e98b272dae383d0cfb857748b13b33450f934fc7de054df729d093cd29e36b46238b0dc9f23afc4613e6eea0d591fca0d5fc448209a5ea5187c498eed0d83ae49b3420dde5889799d6e8042c246cd387384a94204050eb765352ee20ebc435e997b0d615bcd2eaddcd8d7f14a56a38933718f5fccb4a01b91e94f0d11c53fd5d0bab1283cb3896bd50bb31823c6ec268edc2d8fedfdc5837e1e76ace6c8a03e5380d75a64e76bfd701d9e1aa9208134e4c5a0f8a36a88f845dc854493a6349c05e3270104f408f6240077b8a4c8cdedcda45d64544e7294f8d13bd4b9372b4b220a3260f03ab7e75b2e68352baefb9025e54b340097a8229358ec1830a76a8d4e6a7d7843fe96ce369eedf40a6345c087efbf80a7a35d3f6717d02f215a8674513e652db159d5eec4862f35813722940ad7e13a485a74eaede6d942727278c52b5e6bd75731804ccb962ad09992faaa9a41f684a444c3fda48a45640393e95d93cac98c457796d51e8b7d1b544f279b99ed997f1686c95b8604d1107111fbb322e5497541d4401f852c4b5e8efde62dd665dbe1664cb240729e626ead6effb8402fe75ecb52e6162b09f3a1c99e0e82d7908751da4216a6e68e00ecb1925174e0fd3895b0c69a9c64ff777f2dbcc3db3c312ded549149990ca12f9044b3203d72db67d1317202468746093bc2469b691cd61ec7ce7645e54c512fda066627fbf7b5fbaddcf0aaf0a57e11837668aea376bfd86fae6cd83a1aa10f1b84d7e88f40e96568b6f6dc49d767f9029e3d09c439a1bbdcc2f9e22a489e78a8a5cc0c39d87364bd9fb71ff27fff151d1df7cfd8c442e703911b95cffb133701c484f182d0411075d4183ecfa1cb7d1c0040f853c83eba28a4af7035d26467e94181480a5c5b4f8a380b6f7e5da5d7bedd2ff832f6208aab49e277631600dcf1dcffd9b04128ab4eb487641c7785868f034db7e4ec269abec4546301a11649f96187930d0d4fdcc615bec6b166d8c8d8fad4e3e21274d3abf3921ea81db9f90c2fe7751e1cf2fe28fdea484d9a3760521f4cdb6a49b95736c3f4ca4fb6467d7bbb0be89c7c651dbe6b4bb2994bbfeef4b4721a54655fd1be7fcf6e77a7f7661a3f4a31f068757e90c2584cbf6410d8137986e3b77a4952af1dfe9a166944ef8f71c76f81054f1726fb31b92e9c60869df7b685bcc12b9d2083125f215d459dcd155337b92339e2873316e0e82dc1aaeac284a42f64a5f274ad0d20b14b3db55fb157cfe5e7fe59b792fdd5bff95dfd62659f895d3577350e0521da1ca73b96b3c1140454fbc16be4927ba354ad48470a2472e1302ac1c0ad255a27567eec8eb58a3531ec250be8e9c3cff6f7ef069db388e6c4b4abeab1abdc7afdf3d188f073edb5e5b6a2bf76150838d08f0730c1e2fa71249fb7816193b3617c91b4068af744dbe809acc386741c2697dc73f2a29bf8128f5fdf44e584c7a5760f689c0820dbd0b7000e40527bea681e48fe120a91288c4001fd117ce55c33da362c0b0564e23dcee56e4d1f7e02afa1bf508c725f5d28659b009f5beee8a5bb097d29a2314cf000760d74c664384b9d7de3fd5c0da2e499af67bcc20aa393868b10c40df3682bf7e1435c7762f365ed1bf6a5adbc6c42f7e0e01b885bf723d5406c01be80b6b3acc9021f72717bfe315506b8aba1250463a964d3ce0531b12c51fc5190e1218870b73a05c9c6eafba04e02a87cf17c86cc74970caa6ea6de3dfe9a8b1daf931a79d95e9abc01d702218f21ba3400edf922696c6be170a0d4e60c8dbd06ac8cbd639b1895111f7125acddc738c5f3a2a96a6d5a51049d8bd64e73c5ef719525611e21ecedbe4db420b3c64284572f53be731e12cad1b3c9352717f46b10fd1b5f19eca3701931ec46bc01782db6b9ae12547665702a7ff20206e175941a0e51c01e45886795a2a87ca3a8844d22693e2205ac11c56bfec52fc905bdd7f35ee58cedbf93ec0dcc963b4a6106142aea35873bce2ab6ce10f53086c3322ba8cc30d6337dbafbaf2a96447de48a22340f03177c2cc1cb6749850c4643f265b47a40b2a3b80a24fcb1dcbc52368900527a1dcc2198aea825252db40a4053d6d50d9431a1a566c300c836dc71bbe615434c7fdd56b44e813b255f98ddc98c5140a3affee03ff6f0d797b4c610bcbb74d05afc7f36882f1bed3396b9b8f1ab5e9a82bdf1aa14b4bbce4c851a48fd1a7e540a55c58f741b6c4fdbb5dfbac51934cfbf63c106e516c8f12677888e97b6f615563db46daf0c67fc79a1010383ecb3f960614aeab0293e5631ab76790a316f85d2b9765258e2639a6ddfd2e1dceb23360f6356474b722a572e9406e18578c41f1eecf10cf4ea402e6e290e1dc9dcedde3c208f4ab97e6c38a50d074c9a223d83adfd966ee5226ed194a85b9b5611c692674973b820ba75026d7c1e4544f054c2db0788d02dcdf12877b109968e7b0071df69ec1be55bc0b8d51d44f56bf55c55a490defbf0f2b357c7544300c257192209b0cf604154ede4bccbe952c493eeade234ded76dfb0cd47cb95e6e9ad5569817177b95cd7915c957826189b772882d391b56a831038419b942742e38200e42569e6b3f84fd348802fb0e221d2903af00fa1dbb8b9c316b55a745b039876b7eb302d5984be001bcc75fd4997fcbe3e605e7f10df6959253cbf4c1b7aec9542373c466dd37f4b0eb4caeb852dc32f1b5d683eba4a8c3ef2f4847b2b51b5ac13b50258b94cacdc87565d6464bff3b9b15ef6824e8a94a270d11c6171693e0f256c287e3de293d6cc1c9ed528e9691513637f2b558c1e4cc7ca4406a7f3b53b49b486af0bc85b8a51638ad1904b382b07b054596e493aa03e48710df272a3970de191e35f653e1907e47dcc609081ed4abeffbd3fce9857df195a000ac9b8daa0efcb6f60e508e44ec2016922b70b584fbff284581f29d8db356f605f29d2bb1a2f7ea3a3692a4f4d02f2279807838bbe07db34552f445ef1fdef3fc642f0e00b7413979bae753b73be3bdbaae486ea773e48cd9c1c4d8219616853be0c18dd062b2becdf4aa26eea8f3dc2923c3ee6a4a089c233b96ceaa48956dcf2e0761f96fdc3d994aba92058a6fa44dcd9b2082391fd214320346a611cd25d3e1fd17ac3896ccaaf3eb255fc0a886cec48090a5bbd8dcc06e1578524d6fbb709d0fd9173c11d9a1912f458cdc6c0f98061f8635b9a44a0a5d539d5a61f09b9d2f571e9e4cb9f2df25c2f2578f105323d6cf0640103cbd1b60b1366d14aae4638618e7e6719c7e88f715f61a27ebef60545fffff7e3d60f8bd16d89f11e775f7962da246ab2b0c06a19384b140b67ad2d497e755b39385b578725b846979ca5ee79c20158e9b3bd602e9f8a6a1ecddaf7fedb5e51243e68f0c67709009b597fdfb5e829c7c485c8f7c936b0838546e0a45214768a65e519eae603bd6922a4a3c07557fac549d69b4fb516caacd44d622c46b5e69ba3a153a7e0eabd751912aedcdc56d5e9a48999be69590600e4dcb29be49cfbd3dcbc662d9179f3cc18d17fda027ffdf11a3bac2e1aea1ea94bf6621d08c476b3797a1f8a58420bb72c4d2d32d692a7e14a6639d81036974f4c69cda9cf69fc084d401dd3d0d558f511d45aae05e7ffc8e59cc17a631476efcb251ac6311b80685d0eb6698f9591887f0514b2ca3e832df08ea0f8529dd4b3965ddbec7db9e4272a842f47d2a19abbc8c591b9c29f9471df0888f00681d4104f676d1ae8e674c90d3f079de6213fea7c4047602ee776d3ef1b9fd56a28ce28e31ffc10facb9cb7e639d5f565bc6a7529bbb91d940836e05f12af18a3524f8763bc19117228985c3a07c8e320614a845a5ae7035a4322d4c8572cf23e66653d06d68b817e9a21b5a700424e6fa31114a78f6eb10d412109b27dfbb6d1f7967d38ea49501602092d76cf4e491e124937f947d833be284cb70a531212bc5d8963e0eb362b4de191be093ba154c6e3213f6d533e6b6834af89e12e6ca810cd9e50f122e8dc7aa9c66fb4e0f595fff30047602d5435f75523411cedc59e60960006097b3c754392e6378f12e8b80708a062fcc042a5efca4bc574d6cece1bad199f1fc6fb041b415b37dc1da13e8a98e5034f43bc7c9ecddb9d800f2be7b17376ae63cd26a79cddafef3c7ffcbbdf6e387b230d64e45cb64e445e98732e2f4749b3ad6571d766ae065649adf961389620588468471642717c0001a7de8d3eb363e4710527d8028573c3a961dd8c0880bc699917a5607707a28e97e22fc49d4d79345dcc5891bfbe4f60ec34a1c5252a60df183daf4167a58254cfc5ec8d253ff293f07f0e0a0c1f7d07e11e5b23e42fe80df87954618612c88585874ee402666dbb388de3450b6866e9b69d545147b382fbc862f953afc8f50361c3a7e969e97d6e310fd7377245e607afef0ad806cfda7848269efd690976a83b51fdd8b621ee4422cbf8d68fcd3f0700fab41ad7b76c8b004620e38bf8a56c616c5d00c091177353a760dd00fdf2ec3ad6fc203d332eb7276304601cf69a531ca05338a7814dfad478d69f53f992b2d94d012665e74df7eea86b9c69c669c2cf45ddcdfd2d4684adaa284df1121c12a7a2a47d37a4c0b2b51d3d1076356865b109a06bb442545b9d518cd819a7d08facaac907380a149b1080a61af08a29df851d3145adfcb10d885efe4547c43db87b2db5e92e971d5986fa70e0d0cd5d4a207bcac9923ec9e1a33cf64182da1ce7fee2810ac5f1084996c81972bfb889661d338817b43bee00ea58c645d1a53d0818a844210f63fa385b1033f3f63bf5481d6d8fed1e18fa133878eff0def7b1cbc9558e83739c7805460a11a67b96340659a0852154b060ec7d4534de451e7f668cdb8f1ebacf63a750e1704ade5d7dece2c63c254382c7a0ff02c0f03be39a3b451de3769593624ca4d8ea50da52aefe752bc5fee2ed5e0d486c54b01edc9fa05fe7eef5b55caac8c39e72bd7b943e9d67c3bdf6e210558f0bf494123f0efbaf0efae06c1a9a5dab786c6122eadbf8932c8e7a3eaf57ec27f8f3c87d902b052c4b5b147d0398fd64b8d639c9ecf714561a3bc4a252593b88c8d16b1f5a37b809d50bb8c20defb96f5ecc3eea0ea079981674567a4172f38f3f07439cacf1ee4e250ca64484d2db0d8905ec0dfd63a9dda28ff039e0e3d274a4d7366374649046a40628504452708f20adb8e2056e70e37e5da035f8acec2d25011f227b08d5b0945420702914a715bf58e0636b1e5ac7099d57608a639b6aa5a80689baf8167c87e631f580ab77d5aaaef9179982c0d9d75ce392f609b8121195441c6c9f5e38655e4891589acbb5cf4dfdaa07ae3bd7e3a54862174b0093caacd19bf7ffea6e3057026771dfb3862e2899633f42135e7c34799965b313603b6d11a6c5005d736739045cb23fa5b4e96da02eeb869413db98eaafd9648c5963da5aa2cc72b0c886a1f1068830123a0e9c6b0c280e726e49db6e0ae86c137bb98c994933a7a1838fe42e490d4c96e742acf8f1aa84ef0aa081a5ed10d5b91dc32bfa75f79276dd5e3e6016e77e6289cc9e2c8e938eb1bdde277252ee149720ca0b0dd08d5596eb63bdeb4ee4c9471a42b478799e59723da085df629a76e9715e270b8b8dec7229510dc661869f2d85f3b9f5c961a206a6d595fc5838fbf441da984d1736b9aebc5082fc041095050ddd6e6a8ec5c4f6dd887d068141e6082bc8a8e2360897a291acf7e9c8e72bc279b63cb2443e1e2a7a0b3f9477343504d51d5571afcfd62e502fe14c7dd6f4b2af27b5f5f3ab24e44f7908a091afad4b1b46fe60e274918872ca06d08ecb81cac6a05ad723a06cf13631ff2b8db274932c1eb09a901de411dc357054345cea55caf36ff46b9032484e320c416342a0f61f05098ea601f532e9f0d4c1c59869ba0d0d9eeaf0c427a0932bcb8e30c431f60da70ff5241f4d20bf78a15603de72f7c3b6b8679188e29b10a72e1e0010dc91d05dca1d2b4b6cc4e1718454b6586378747d9fda14340f193fbfe547fc925b779f644691f161f17a8baa4bb1b796abdc6c5ddd05e06ff9f8317f7c544e6ec6993bb5b17f459cde43c3f39a5f9f66493edd9ddbb54e6563b416d8a0a23fe1d0c26db60929c85187a0c97c083db0f10117309afe57021ffdcc0d5c948a00451f16c984c7dd221d25e68eb88ab13eb96f80c66309089e1d2ed7750b9aa33d55e18e374a1cb4e5a4ed93efc60b88cad0f21b6ee366abc3db181d85f0efd3f8686eeeddc03312692b5128579a58b0b78ec53656c2750b138d76152fee2bc40beb8e7614dae26be0ee81c3dda23b578289fb2374f2d15902a80d8fffca3c457df006aa998f1e3753d4b4174cc278d1c42b30a98f7d791d5ddfe0037e5a374c5d64b419a08a291d5143d8422de42efc827d0371c39aae8f339148454307ddedb1bb3480e4e15ab5fc150086fa613a67d04a15b948dd883ec3fca40891055e99c6a81313db62f2586a441cd0b3b0e5a8c0e81ceae206f84f1316f5a228e196f1b74890092b9a4193497eabcffb0fa6ac3224b185fe9c78b728a2d2cde4023e6b0293fa8a9a8447e13d9fe527603fd278420778b3ad2d15bc5bf3a5cf23c23ddf3b79822050efc783e5cf0444bb68d3d38c6e4242f341ffda11ed4535ddbbfce9db0df41af688ce0ebe58dddaf95612b2657a5b2e98278b3417c1d996b9589fbbf5daf74e250c043c650d8472670d69ead0c36e024776f553044f7d721942d91e84578948ef438cf84e3b0777fb192a3942ddf4c7d7e96fb815aed2dfb0fcdcc92cba831d386522fc8e99ee450803215f39ba8389a211e3101d4cf8c70b8daf71ef32a53032865a01616d2f94d1e9ac2041fd5bd843adce272769f597b3eef717efd51380e911926983e7510922ae2ac53554f9f8f6ce370947d6d29b0727c311e1cba0c510e9b4e96746fa92d7f0c2d9e373f3baa885cb6c31012a2e9b4ea6d5cfcc3330c23fd54409095afd1b26b5f7f103dc5ac9e25e05c8bb8c5f497a70fb60005a938b73c969855caac6cad61a9294216b271af0dd156eca03258544869a1d06a2e0219e31f07c4fd6949d590021b40ebdd85fc95a8da53c228fbd70c3a5c13d3a5dba399cf783c6376af26dc9b1840b2c82a390b94011d460e1dbffd56fc13660c240d45dd5412cda084111465edb526e1f87332e2cf062dc2f9dd0db7e48f7f5ca51ec7155e398a5cfd8493020db325a00b56a5a2a93e61ace1f47a7a0e93dfe64a707b2dcd40fe0745243675606c136fa5d82818fe6f6d6053c20466a250c84f54d8c7fd7b4f6cf98c24d588ab30c63019f7b0dfc1bf33170ab7cd8c5738da395210100f6fe156582f2d129993c6ff55b049ff17870ce5cda07f8d5d8868259921184b937d9932d304d1e8ab6cdfed1cd030a9596dbdd7db00cd6e75c6ecb46227f94afbc3dec066abd6b604d48af000e34c015c6dcbbd2bc2151de509a47abd6e6d9b34b6f71a0b6e8871b9a7c0d973f7a44c07fc4d998371a884fe81286d451a73bae28dd5fc7c6ae16458b23089363c428ccaa50b3879d84203b39b66ae55fd916d72dfec992e7f3123f16b6d34075c7defa2b05bed8d5cc1540fa9143b07655322254dd7d5e3c9563a2bea7d3a01f45609a170474b57578d4ed8987de064afbc0d38513e7502f45350d8aedc0c234c7b0a379d8d55c859aa9a152ebc2b38803e59536503b4b96c0892fe29854dc4f79c9d334d7b418f5c06443e66356f40f8315972b9b43c245831f2d1925de2c038585cef29017baedd319e2f9dae0fb452f27656e35db7677cbd8dfc415353cae4a3a1674db7e43b78e1379ee8a63cdcd22d6e2f0a5d8a37454f86258bc377fe1d78958ebe1a2eec95bed18f1e10f78c97bc74c5ab6e4c2078b62e872c0b5baf5f43f3dc5eccd373fba276fb973b544c8454d3f143f68771467ec1ccd7a7bcad64b1c4ba956d6d0f39ed73fda327b9e4085a45fe5c0ec7117bd7e5e944340608d6fea2c720739a2e6d18ec005a8c4d24f1c8d5c752c283a24f8b0e1b5716d68171202dcd58af981c64211a0d0bb692a638f223145a18928e10282cd70098098ab77b50aa279bace1ca291f004a7eb6e6a63099b580768b73ce3cf857ad44606e370ba7668dbf23d6124f133b18f4f59c78d66980b7fc0a031d59694ee39c6a07d7880f63ebe0d2696afa6976ac404260191c7f1edc9b93ce13c4035a00999b98ca66000f2ee2af84691ed8535ba58bbf92160a8dca1f5eaac667cbb6e1f4d80b3d9bc6411e4fc4d57331e208e46a0d4a0c9bf902e81d6a09c3faebe0fa8e97415700bfc2e0d58efe2611af042b2220e0a14f9a1bda28369e08b01645f8f77c0b47c8f598f02896e7c34f38817162553dbc4ee03fa59abac56205812a9030ab9cd095b2bbf119f20602ecf0ef4ef2434b4f501641b1a3a37a243c0cca984bf982878d0da5c65bc6df3ef7f06d0f3e4c7417bfbc52e6a65c140329ea02dc12bf04fc413ec8590bd7713b9b794294919930af20afd0a241269c78e911ad5254592cb51dc4f52174df2fcfa845cf9c9f2a49fdf75dde827cfaf3d528725c51d5fa5953a2caaecb16012f6c04fa4ba9c4875b72c5b2cd8347314f7a49f1d4c3247712f42c11d4d2cd69315c82879766ae4393b1864ee47d412f947d42acfb1871ae08f3d7ef2fc5a6ae409f3125f648e7275219be409837922cfa789491d30d3c8f2fc91064a9ea69f3c5f06039b3b234c2c4f989e3c615879c2b4f2645922cfef6252a7cbf35954526725cf1f5956799accc8dc4bd12493286ebe4908529ca9998890b99a9a07f24c1754f945e6a2496682756aa666ea42a666e6d84293cc45926ba6d62912ac67e690295217f2c4e5da43efac842f4dd4d43a359f7b1394e77e079ef971144772b93803e42858a766ce90a42e48ae5c4df022c22fb299d9eaced4a40e29734fa37a1a99d4f132f734506a5c52c725738f9a499dfbdc6892cdd45040d9b40226ac3e713fa2ced8f123ea2773636565d34c8dd54b9856509fab3fd2a832575fe5d630e6becc1387faa3c79d0dee878f881e89cd5fa895395a1e852fb33e712f50240ef71f3e82e4e61733240ef72f65c817b8779067862fb29717264c32ae63756ab402991ac1a08b238f5f2b73ef79f87b107b3ff2e77ee4ee53a4ba1d18aaddecc2597b4231a9e33df7dd1332f5b5ba1ea9f33df752a63e2ae489fbb12ee9195d89ed913aa1efc9dc7b21dcfdd7ea5455223f2ae492dccfb592dc3fced446d217dd290b99fb7154cb5c0f3232f7e34c2d731fc23d6412e7c8cca389f485492671b86f2f3cd5240ef762ea3a72e88fcc1799d499cf79217d499cfe0ebb4ae2f4874299e36cc8a32671b8174d7147932c733fbec832379a643104655963444dd2f58c4f171b05e5ede5cc0766cf3f0e8bb2ec14f73d872f75da934aca8946d99b20157ed889af0d2eb6fff63fb8487f7b204027d706a9b3236f9fc30e2efa38899470c71f79fb51c3c6717f3be53e32f7392efa73ffc3c520a9c323735d2c6f5ce6b6df5486ace14568439fb651ca46416d9cb2e492b8f39d071f28809ee684ea2bd3ea6aad482629d1836f4f2b32050079eaffc2da3af512797e3f0098e4f9ed1aad741488ab17d695c4b1f4b7d04f50080d617f8bebd3fafa89c4f30dd3075ffc6052f71dd95ed329bcf9de9c53ca39e79c9544676ea154fe58c3167706774c9243ff5c9ddea250686170b9b06758a564dafd9c117f45e913fdd1a71aec13eef8233771c71ff4c71a06e913fd1f3d77687efade8449fa2f39b8f5c71f5674df853fe88f121ad7860d0eb9594a9c233457557d72fb6be8a966624408d9664896fd2f37da9e2d22c27305c14c463293bd9668e635c592e3aeea22a1f2a25dabffaa2e123d72fbe601d474bbd967aa0ae469d2ab4493382f64bcc0e47bd792a16826717c884ae2c89f81cdec40a646aed115f2e43fce78917900491dee65545e2f30fa23573f31baa209fdc29f5079591ea31a6497d9814a062671fc05f6cace853c80248e7f098efbcace85b1ec3d5d2b7b8beacc35b412c7e98b177df297d80bac4fd605b09958080bdea827cb9fb12c6d96b0ecfd944e2422903172328d32f9656a9d7524e373d63ae79c331ce9b71bf1978ca94f32b2eba431f0bcf94311797e464e794e79afcbf99d67383620db29d0b9a9ae92bba9362577536d71c7cf7eb58e5bb5b8d589bb4bfa7d4478280823a52ac50e2e3c2ae3a8af51f3fb94bd53b21480ecd37f66af1527cbdf9eb8e3977d7c2ddad4487221cbaf4feef865db29549675cacda9ab8734cf10f7568b0ea9151cb26d3d3d1b3884cbfede68bbe28ef4f5a2d1b2f41eefe958c78282aeb8f3e50d361331eba81b6767163216c91e6e7078d234caf0cab6d272be296ee83de97236157593d44e924de9a45ed3393b28694c28354877b36c3f8dbc7ddd41e993ddb6b95551cc0d5ba6df998663037227eb93f58be54e63b9c3d910ebd26f1c335fe5b7bf38668656bcb7edc0a60d9b688eb272e762b9e355d6adf7eddbb45c5479fb362e17ebdbb779b9b83dcdf66d96903a1f135227f4159b7e7a06fb3b68d9fe6632cda2b8a3cd6a34cdb21d6960a4a076e28e362b1a18e8c3f62a2f411feadfd066e5286bd3e3e48ea420abc5ed999f0af2cc7c66dc71c635e39a79499defedcfd440ea84defe0cccc52ed6c9b29d715d599ed9d8b79934e6286bb302a1b8a093cb729106e628fb9eeddbf4d0c0469b5738dab8b2a536515cef6b933bbeb4e6cc0b66aa18fd08fbc80d791a49193d01bad1e1114de2d810a4491cebe48e1dad47e2d8f78e10831ad97e0c3f2fb85428e691fbfa8f333ffe232908ac4d2e11b38edc7d55919e2053a6190948ea746f5fca948908f28d6c7fe6678a6c9fc4923af449413b9e90edef00923aa3c722d3ac77602242e745b66f3ff404bb03510743ed20db1f677ef269896c7f24059d5612a7473fd2c07864fa16962dccc16cdf8649a7444f69604f03ebd4c4dc09aee7d1665503c0235b2b6ebfcd6a026925a34d4fb63fc1111037bad0b2606d72e78f2fad21332d8963df8d6c7fe47146b6cf632675466fb7c8a3d7e005d9be4c4beaf8834366320d81b27def7321db0f0160ec68d97e17b3f6de2ef6f198491dfaf6675a96d6208f2fad6cdf41213c320d51308963bf04c7a5810de1914721cd5fd93ec5638eed937d1095ed7ba10f74725d60b9d88f823cd2c0b2fd2333dbaca44e673b7fa4f941f712fc422284ccdc852789635f888fec8556dc777b436bc3a4cbe2daf4f4c97e17daacfa74caf6ad0b6eff68b3caf66578d9e63187274d238b2ad3ca64cea67db556266aad3b4aa7365a69e158dfc894d61f2679fcc1448a550ca986144b8efa913a5ea6358d4ce9b829c9348e4ceb1332ad6ec8a468bd3c5631321d2d0dee587fe853bf354a13b0095aa7b6b0d27efa447faa4ae254da8f4e8d96fe4b139652982eee587f32ed28b4b64fbfbed129eee9d7a04ed9a731f6659ed2a94dc5a4535b8864669e9e4e859efed6647bd2a9980e6f087f981ed942cba2dab656f6f76c002208b44993d9301b8d2725df7a589da27f5aa9723b19fec31a9407f36910306a1b3f7875f3667794b42935bbd168342080a0d16840d068341b4ca136ece0a8c9591fd8d01adb924e758aa66e9f7eb0610d59e7843b4a5acd459aec445b8b65069ef56c0aaeff487b8e53ba4b96f7c211c050cd1e9f39e6c8a7930f579e9ff303065a54a1c9d02909061656619cbae583e9cdb030cba38c9267a53e6ff2fcf93713c8ccf33fd304e24fca32a71f799ef20442f6a63071e78ea858b8db16fa09fd0401e901c26242c38a090dab5ab78dabb5d64a43cf941b0f2a133d652f019934936ddb6809ec79816c2a7ffb3a1c8d94a078dbe6df1bd9dfdd81a0797bffb1c16bc81e9321a7f3f62799529f84ccbcbde73c5bdec26de33e26dfc7c45379d2d485b697af8267c9c9a55de8d62a2ce108ac24688156ba240d20cb71148b980eac08c309b5c331440620a50ed94e284cb2d34e2eed938f770b85508721c167a788ee8de829c22863270bff243b5e087758823cdcd7df42388648e8bd1822a10e77618c1716f1497692ec04f18d8e3c773a23a53c9fc3444c909334d94eee464323a58a6da6d8660f87609f241125e764194b028b3cafa0ea3e0aaad4ef401dbc0c765d90ee441fc429fd98b8e10bc799bfd1fe7d8a3b2c527951e82df8743261411cba0c8693097008f8dc7b221107f2884425f9e3055f24ca4184670671f7417cfc7233b17456bae44e26139cbfade1c5f4cbfb7d5ddcfe29d2e08a19f33dfcdc867e823e742fa92cffd0a81eedf859f4de86a38fefb97034e551a6f1351c65284b02d1c050e6a3ac71aebcd0479e79477c38955a3ed01f47f5c362a8cb51fda290b21cd5edf9207d071188ada3c0ffc050c610193d9864e77bf0c1b008f047a105898cfe0b8bf87e14523c5258eea7aedcfe236565ef25c8c3dc11852747491cc451f241fa791bab556355e6610a84658e62b9e8d6de5b2afd8fa73c5296abdf81727f2771c719a31e7343fdf9358c21e51014ee6b410779bc79a4b22cf32395e5eedfb8245c8357f0a469bc76f44b6ecfc0bd12bf237b06fb8db2bf7d7dd3f7131489c00f4b6cb1535a29ad7486c26f846da3b89f967b6b6d18137a991de409853f407a833bbf659f4e7d9a96e3b8101e891822776f432fb950380ec161fb121462c350d29076ca86b64f1cf591734ca606db4241c7a7ef2f5b5c77bc99d4a9af34bbd429527bd8031f59fa348145be6bdc64e9c34494ec9941a90b59fa3471c4ea8b69843acb38f938238f3f4e906779943327a4c8a3fcc9eeee8409b23fa9e49fe3e21113bca4c0ca011a6cdc60c7df0617239082237ed43843a684133b7ecad287491b7947963e4ccac839745e2fc2f52c7d563ea0e376963e2b2fa6d085d32d4b9f150e7a8c1af470050f1f0f324041162ba8c1b105255e662c4096410713b420852bb0a8c8c110ca5840cd18583c5132c612516400850a3e435801122a2b684258000c527a8049c28b2862e08410542046108a38c10f8250042220e18c1a4c325e70630c2678d14411980003190fdbca150324e0a019a16702410211790219ad21a81184296c3006106cd040055020414610a21023890eac30e30750a86009256810c6023220041390718413ab2642f079c1620d348410052762c0b133c1f864eee1b37467cebfacad278b071b3eab9e52c8c98df15c45d9ffcd2185ee0558a64ffe35fb9b68d9264b7182d1aafde4b106f7eaead4288385cb746a3ee9c49de0f37cdf7ed02d3d59bc49d47b566ea5758707c59d4fab94acb16bb9ab6c97b36f7421023d12ccea8b8afaa2b44facfc7da1ce6179ebf0f8c3942557fa6ca7a8d7853c28ec8872775339b5c4b9e36759a5d4912d7126fd66eed6514efaac94b8f6386ae5b5c80f483ecb463b561e2b2bcbd9f289dc90527a0b0b696587ca1d8940171758a1cf0ddbdce63571e7bb7cd9274a43ead4bae1eeb465caa93fe1ceffa6a5d937ee7c2a4396db6ad7dd169ebbd75addbdd6cad55a7d78a21bea3e914b6749239595972aabaffaaab472d1e20d43e545eef7a9a24dd5e6a3865a5caccbd7cd714b2f94042f30b556558ee7f47f215a1bf1c1e4c4c061e1c8a1aa0ee4716f0dcfa50433e3305fd5e2f2a8b45f9dd2c29d1e8f49a76ad24c958b958b575ebd5edd1cf2b56305ddccdd29a5ee4e2975774a69ccdd29a59d07ba7460cbc7327aa9c194db64727a6ab1de1f393236e469dbb61da55927e852b29c833cfe52b9e913e6b39df22ae998446546f562266846a8266332b27483803c5e2d6dc3965e661c6626e6ab5a5ca777dbb690cae8b833c6f278d0d059e7cc273756a52c172b14595759141c62943502795c1693b16818aad928c87cf6627872ceeeee396bb743d9b3d6ee6debeeee70acefb56728b7d94a78cd79558b3b6a014517a6cbc106d97d1995e40eb9d2a34c83488732ad3fb4586b341e7aa7d6da38409021586260622c37e594f9787cb65394d6f0a34f49f098f96ca76af5683ea9e2bfb97753ee9cf9ea1697460a9c1486a03c5494841819eca47b79e099af6a71696e4ffc81496add16eea4afffea2a37e8b35a28e08f861ffd1f3f71ca1cd55ff3c909ce2973b14e196bad86842338fd0bf2d055aeb59a6c267bd8b9248e8542ad734f15f3036f4e6f230b734ef972b27127b779fbecadaadcb0726502191a2688d1276e294b1f13b87c8bdb92a58f09a020021db12b0a721b20812a51020c7fe292b2f451420b874209295aca65c9d24789237c0a17b4024de2824040499c01fba296c41667dc952c7d927832e5de2c7d9260a2856bb3f44962c9152e98a5cf122c0ce1eec8d2670913d258e246d36e284b9f253f4b6648d0aa0b48739372c3db5390a752f74a9dca2afddff4e1f9e1da12f2c297465d39aab990b23cac3d4a108d46e4ee6fa573829ca7fb1cb1461119f547714c91fbbf375a546939c8fa803a4555644d624c60e092d794dc2aae4f0e9599d7ae92bd0173a9cc1a521e59a5e562a7d151545a8a4abfa1d272a8f414151af6acdf674b202179729a3de47e3ab9f529388447f6f7a64ce2d40771f023486c6e89b37d689b1267db8c08cd6e910da5c4d9421edab184d0e490575571e45a9fbea48e7f5599e55abfd36871e42aa94347b2293139606fbca48c3a4aae1d6b0771e45e62665712a77fc33239602e0f43308e471eb55ce4a234aa5f8aeb8d971cb0dcdc9458ee25b2dc75d5b158f216723f69509793ea38ed3993905a2425ecb55c6d0179fa8b24568ec03206931db417090d26548c505b899282cb46d00e3aa630a201a9d031071322d94d8209481b3df1c417c40d110c4ee00551020b7c35d125a19504d777bb6022a406cd13c3097b84568786135c9457a88d136c6bc0ac1492a848e0c0a8830a2c0ab4310185075923a83e597590365ab48a3ad558a20693bb45135ab0d1c3c66833123fb666e973441b3c9650ea53a54d5c17597b7169b2f43962066dc6fd2c7d8e58820677260a3db82f683815aeca17de73391e5028ae0b151dc71d65e9a3a4499e8fc6a559fa28e9318092958fca077547a659faa87890c7fb60ccfe48a5b6b4d66de3381baa58f0bc68aeaecef33e4b3f101459fac97c258ee89b78fc7846e0109aede8daab32e70c3d951d20cf0eb0bb5b042eb191536e13e9595a5a660b69f2b8b0b8b8b8905676b8b8a85c171797918b087471f9bc2e6439971ede14de0b10eee749d348a3caf4b797ad2fcb31ee38fa19fd746a46a1b9e83dfd11d0e88d51d0480ed0c9ed989027fa54764e644a69ff480d298e5812f5237558321db96005521cc9a8c83f51faf4e48e23d9cf08ca68d6a951ac4ff4797878d47214fd0e8fb0c0a3d7888b116ce4459fe88f5c7da2cf1a3de9131dc94650fa447f341bc94031ee38928d642359a6aa6d7eccb6d51ffd8ca27091e98f689d0233fdbbba4d5a9c5b04d11f49a1a38a4c47ac4c7f1cc951cb746621893c5e55a69749a623a04c7fab73c4ead4386a9269ab53e348261b35e9d45855a3279d9a5fc4f238aa22013e764f64fa4d271dfd64fa1e10ae912ed6c572cb1c661cb5519b5c0946167a32e5d154956954a11974ad391b1ce279dd170a755f37b3cc22d5ed747adb2ccf91ee45aaeb59da0ed31027655d856012677e098e3b43fa9238dcd755e6beaebad686829e73ce399ff4a96bab4f5d597dea1f65afbf0eeb8f0bae37290acdc5ea4585c958b24e4d2831797219052c2a4f81274de30b2d778c562cfa545f7dea9fc95ff6e8e718cc5eed3a65a5951355579ffa47d9a39fb5e29ee048e7b1834d20b36a91fb29c51d6ce22e063ab91d4ceaace4fece8b4ed1af501ad52feb535756eecaead49316af7498201da46d1eab2bf757978b313b6cbf8545cc9d1ac67c921d77c1fd3c765f963e539ac8341c3b596e2e775ef4a9832db92fb4281e0862350bd74817930df0a4698c212873de7472fbfbe5e0101ed9fe7b1ea67d92b256f99efc5854d90555f6ea37738847a4ba76e5d5d4fa5433a54fdc8b54979a642632a4f82233d54e7164ee09997b931b2ad97446e6fec50c7b84db46c9093f85cc852f58c8dc836b5c95dff12abfe3612c89e2de7af545e626562ee5f105e6a269658265ee54933af647b5af8c2bfb344dab13f73b54f05cad3ac5a4b91e5aaeb5d67461bc4aa53a6267ec646337cb55a5d684409e4a220516dbb8244e7b0e8d8ac6956f0f88577a42524ce2f477b40ea80bea6ab89bd2a7fee956a3a051908b236bef1dcd728f82dee090b8dd8fa35927e6fe163cd2c8723f0b26e1d15746171f993bf0e84a5444787425796461b1b0aa123cdace322e192cc038ae0c177d02011e42c65107145a411a7472c7d015aa6511c6d5a88671e5fe108b4e792662080f08d1012345460e04b1010d64000317b0400580a0c004241001083cc0013f34c007061059400f3ceca083021290030e08b8c1862142780e60809d9a1ca4000418400d407468f821a66690210601c090f3420070c2c73e00e002abe57ac17ac45c3cf2fd3d649d1a7d7fe8923a3e0acafd52021905c917faed7b37d8f43698e64ff8e67b609b77019f1e857bbc0fecc20300a31e6300fc631fef58948fe025ef3d9ed9f1e6f7f8dbf1fa7b0cee5c9608df2658b4737b1e8f769c060b9a5748e3a2710d81977ce0911842a552a97640f0446024ef014cc477007be085c0437c11dc81378285780ee0223f6223bf01cc810f028f9f01bc81d7000ee22f8033f018c01af80ae00bbc0530069e02b8020f04b6c04b0053e0278081780860097c04f004de011802ff001c816f0076c0ff801ff00cc00d781ff00fbf00cc8027827d781ef0027e069bbe074ce475c03cfc0eb8874f00d6e1158077781c70023e07ac80bf01e3f008c039fc107cc3db8011f03c78c80bc136bc0130cf1fc1347f002ce46bb0017e071fe083e09acf78e70980837c0170fe1a30017e00b800af836b78207800ff03eb3c0d18c8a7f08f17310d2f034efd0c587c0160193e063cc3e760013c0c38860f00cef917300c1fe2003c0e7ee1310eff31ce3bfe32cc943ef51886ae4e8d34aedc312a981a14770c5d234ccdc599efa779b988bf9f0646134382efcb51fd1fc017d633dc178d8bc6458345e8729188ef0f5f2e0ef1fd21cc450f7c7f18735188ef0f652e76e0fbc3998b46be3ffc71b1c8f7873417c7ef0f815ce4c0f787412e06f1fd61cdc50d7c7f8dca450d7c7fcdcac50c7c7f4d8f8b18f8fe1a968b17f8fe9a968b16f8fe1a978b15f8fe9a978b407c7f0dcc450a7c7f4dccc5097c7f8dcc45097c7fcdccc5087c7fcd8f8b10f8fe1a5a0d504d504dcda432ad4c3d2696a96572995e26982966929966a61f13cd04640a32d56c542e0ab1e9b161d9b46ac22548cc3a76b2005f09bb53f3fd362f1b984dcc466633b3b1a1d900d904d9d46e5437ab9b9e9b9bd68debe67503bb89ddc86e66373f2e86e1922ce82b6177c2efbfa1b9e8e3fb6f805c04c0f7df04b9e8c2f7dfd45c447d7f0f958ba7efefb172b1c7f7f7e871f1e6fb7bb05cb4f9fe1e2d174ddfdfc3e522cdb7cfbcbbe3f77f1f8263fc673ec90e0bcb3111989f098b903e6eac206807c6b3bf07622b8e3c11387485af1016c64259380b7f425a08140685b51a55cdaaa6a78655d3aa71d5bc6a6035b11a59cd0c0235b41aa09aa09a9a6ad5c36ab95eb0986cf643030aaad9a86c56363d362c9b96a36c5e36309b988dcc6666f36343b301b209b2a9dda86e56373d37ac9bd68debe67503bb89ddc86e6637b41ba09ba09b5a0f558f558f9e1eac1ead30f452c6d0fd8d1a72867e1abc04028f8411aa1d9aafc12bbb7324b47195e0b863fd1902e7fb2b908b01f8fe1ae4e20bdf39df307cffb6725100dfbff5b818c3f76f2c1765f8feade5e20cdfbfb95c4c7dfff67251fcfef1fd5bcc451abe7f93b9a8f3fddbcc4520dfbffdb858c3f76f341707f0fd1b908b04f8fe2dc8c5027cff567331c8f7732a17f3f7732b1777be9feb71d100dfcfb15c3cc0f7732d1779be9f73b928e4fbb9978b43be9f83b968c3f77331176ff87e4ee62202be9f9bb988c3f7733f2ee6f0fd1ccdc5047c3f07e4a202be75f87eaee6e20edf6f552ef2f0fd76e5620fdf6f7b5c5cc0f75b968b44bedfb65c64c0f75b978b3e7cbf7db9d880efb730177ff87e1b73d101df6f652e3ee0fbedcc451b1b964d8fcdca4665aa99824c40269ae9c73433c94c3113ccf432b94c2d13cbd4635a995435b59aa01aa01a5acd8fa36a6635b29a584dcdabc655d3aa61d5f4d4ac6a546118140285b4f0279c85b2301686afb0040502b8c4923010815986c02c1ec02c4260960e60162398a5086619310b07304b10986503984503982503980503b8e502b8c502b8a502b80508dc4201dc3201dc2201dc1201dc0201dcf200dce200dcf2036e69006ef101b73000b710c12e0bc02e3d60171eb0cb0ed84507ece2520076792500bbc072c02e311cb08b0c01d865760376f9b101bbd08660172021d8258807bbd40e804b2a03e0d26a07977a405c62499cfe8c4bad20b8e42a002ebd08804bb001e052ac065c9201c1251d5ca201977ee092884b295c9a01bfc8805f62c02f02c02f30e0971cfcf2027e7939aa3f00f80507bff8c02f3347f50300bfb8805f688eea47e197137e0972547f0ffc527354ff0d86b1c130260cd3e3a87e1a0c53e3bd94317c5f9a42ced01f621dc818468a83fc42869ca15f6670c5b8c61cd5ffb8ca706561955830965c90290ef218baa80e6ce81a7b40197b782cb8a38c4b860b19988b3cbedfe3a24f0de390b89e471997dc99a0e339bd108b0be6fb4ba6c7d80b7d216eb5ad42524c018a5acf9d99c13d5e8eaa747525ed2a5c7d72fca3f519fcf7ce5c459f3c6461f589e5c9063e20e661c21822303ff3336111330a25ca70edc07c921d8f6b723dd34ab3eb79ac63e8eaf18221d2edc8dcfc481cefc96561b9f84ff3a39d6161b1b072ffed71f1c390c6da993074f5e47e4e892bf318ba441d0f0c83e58e0c8ec1aa6e278439aa4357eeec3058eebc60b9d32d711b06092471e90600c193a6d13ad00442c30a9b2ff8fb3b14a4ce0c2b0f248e5b559e2a598eb57705448fc52b17278d2669b452e95ebfc21d6790ab835cb4ef403dfe63d72a2cfb5b2e88cab8a02dc8454ee528ffdf2a4c968fd03c7241aeec52dc0a9b40b838e40b3c903a5c15248e07896c7047aec66db56dabd570fc531eb75af61f372a489d3c87143f890aaa824c6141a6e8079190c82ec57d177d67fb200d461e4d2edc3b961682cd5a1d2915c2fce63871cc0d54a5aa374c952acff71ba615ae0e6ebf4889db3f9af2fcd01296640fa2b6d3b5ec4f663bb78538078774a8d622b44fd2da234276e3bceb426df856f107c4f5e6b1dc5e6d102e762f5bfe102e5e59cb52faec9951cc26f3857eee2b388487dee9dee3aa1477fb181c68911b16c94d933aa1ef3f32a78c35594d9b406618f385fe0e23f737c1bde3755f102efa4eac2573cd5efd336169e49ef5094a9f6412a77f8631814c32e40bfd2d0489d33fce3172bf479bb6c80a6fc70b8b3062a70bfbe52836ee4440920c82524652ca95085947aea194381ee3562317c28afa44781d53b21129255be123451559fa38b1fd5f4ff087f98056edc850455ffa30ebd8a9a18a86f4e70e2d811152ca0efdf9345449293bd38729a5e47985285e4fc0f24b963e4fccb24f14ad2c7d9c54917d9a84916de894f491a227d3cfa1532a99be37aa6f85cadf082b6276908e9299c8edd0be8dd9a1bf07b9d3a174940f1e961cb5bd0d6376d83ea607b9b385456441647b6b3fc687b9637feed8b0882c7a903b4b4a900511fbfd25f02f810d4fbf3d185cf803668c2b77fc3b8607fff93eecb0c43d4a149aa8bafd0639395f589bc3bd14c2948bf87ffd464c9ec5168ccbbdcc5db30e219879864298f21616a15f432134ec26bc6f8bcb7dcb2ec76d61911a16e97032f1fc816c59fe6902f954a59d49411f2ce8036ad62f65a71f73c3f6fd1dc694fcc7d2ad7476cc61e075ee9edcc903f7db4bb087d0db1258174bc07d08c710b11f7afba190c33144b60ffdf6a110b62187b7d09a6a58e4ce9e4d50e18d2aa4313af2a9f2f63d7b1e4ce38e54760536726cca7e2a73f1adf552e93ff383c15c0eb17414c6accce517d2b760960c0323c625fdca97deab204f89f41ba944927d0ad2f6c73072e84bd8631e469ffa49d8652d78eba1e2ae7cf72d9894372aaef72d78256f54dcef5bf08e580b56c91b1557f42df8ca6fc1a3bc5171ef6f54dc162cca1b1577be0d91de6652387e2093be0583998514ca9e6d20cf0e7f39851c49eb898d33a85b3dcba3c73e3bba119fbd051729707f8fd1b4ca0b5e23084d71ebf49fd8c8d69acd80badd5e74503cd690290ca8951f71264d9a2738bf7c49f9574295b0863cf3dfbff76f38d2b73297649f3cdcd59f747c315283ca2a0c2aa87b6cd4940ceb9ea467912a7e32f2497496643c5a45342485525cee4c3bd5e0947b8486bc2c3b9fd3279538f3edcd1f8944edb574fb6c4926876448dc9cb37a208fe7f0d1a74d43a2981b32b551d854d95f4e29715ace5aa7a80cf2f044a5b8a337e91e89d35d7354eb4073ab6a79a42b1e7ca78634c8513509776cd52af7b7aa534b5a7c952ae88da020cc1e1f205e0a2a243508af1a94570dca4b8c076dfef6db7be1f785de77dd187766effba58767a63bbaae7b89e5ed8b1df39ba11fb72f64f20cbf2089a3bae34a2b28afb4a4ce9ca12f28f7afb478d0bc598dd04173c9fb3d65cfc9fe63cbf50777e65aa92867ccf9bc90e556a226dc71ce96c83097746a1b6d5dd775dd297739b9fb91bbaeeb9f4b4854ff173f724efd8239c57ce2a7a80977e6a294722667a5d968141402c21657669bb76f8b2b4417cb45ead370ec62b93e0723c6ed62f98c1bb23935b41fc43f14b3a1dd420987aa543af990e131f0d643deb9d3df72825092995d98d3a920a4942333cb80814e712519b95d59a59d1c90a8fea9240b311947eef769738260c21d67cfec716bef2d957a3e2bbc93f442d993bb42eb6538cd5944dededb32edb621eebd0e674f9fbc54b2e1cc15e764c7e36c72809c9c7e538b970bc7d2f7a4ad6c836c32b1416091bb8adc4079d5a73a6eb76d1be37cf4ec42cf0b47235d2c84bbae2727670ed2928642a15145c9a7c515627be522968e3b7633a923937b7b0d8121cfee074a6acdc9338c89491c32ee781313cb37aadcdd6b666362b99f0b3f1faf5a05fff12327e774b2d45a504a1cba85a31123b9823adc398bd0f7a73e4c40c9a365228c92ccb8fda02107861195479c27c771dce44690b71641dee868251d9e348d93e55b4497b1c4824b58b60b6ec1b2c72479a43f4d32e57db732bb150f9b78b858ae41b2d9aa9d72dd3623f21c93d8cd6edcd685a3117296ab94c92f688021d71f51a75ff9d183efadbce4faa34aae3f8672fd29c5d2d797a470a4c9dcaf84230d4bcbef08c7eb520a5d422951371c85a36d09a5448942306409a5447d21478411d91231b3b59c8f3672ca9486c8b8f32995b31ddd99604e2654c6689db4d639e7cbc8b0d427eb61e9332571c71f3f3c9cdf24cdc6a53ec99733bac69432ab485a4ade7c0b47239f7f9d4c6c938929a549e6f0cb584751d3a7c41d652cc86c7b9a9489146fa3e45329d9f15706fde9d9cf9940426f7ff426348f484a506a08471904308184dc4301705f737c0ac09b74ca2dfe2183833c5d439f96dc1ddcda7ba5481b2543a66fe994610a60029999520faa419325190059fa4051cb4dcb95fb8aa49964f9f4e548c78f0bc7b9813874996ecfd18f898f49a7e873f3c96cf5a97f5681c41da70c36651336e74f97ff24f549365db52877b2df3e959af62486d328937d3465f746eeeb83d824c2329e7f3844bf6e8242b64a5fa034818bdcdfb653601b31937ced4da0947e60874cc54ecae7dea5fcedfdadb5361ceb7321adf5b770bcd9f60ddae7dcb66ddbe69cb252296715e6e62de734f22d51cb9bcf3a67fdf9d2b271b7b7b3ce6964d696503ae794b2d6496f9e35e5954eeab3c3f0af55764b299174ee69a594544a2929a5524a39463592e94b3c92aebf2465ea5bad5b2565ea50f0a8ac63adbed577778e1af9720d8550b9dfbe7e11eaeed56bad95cabaf16c4868a6a157c1737a49feb2535f3ee1206379fec0c7057278234a29fdec4f5dbcb0d395a4256952489a9c73ce39cdf0a47cd9547abb682cd22a6fcea64eea4629a5b429a5948e9cdc8f524ae9f755e95ec1c293ed4929479e41c1c245577489145acc0b7fe2ac9a1c69cc5e5834935e01490923365bf3c9945a963f32e4cc9f210d23cb589fe4cf39922147e288a670c79c1b6c4453b8f22b386486943a756f6ed29ba37986a3119906f54905c8f3688b3e9952fb49838b97f738933780646154d1ad564d89f203e36236c9b327c8888462439de3ca3e99bc392e9d72ba68fe0cb9198cbc9194413bad9b7b16dcdd662114eadcfb4077771f8944a3da94d27577f7d1ca9c73ce397bce5e2191585826cb0a69c4d2c2d2d2d2425ad9d1d2a2725b5a5a462d22b0a5a5e52b8277e76c90a7766738d22659bebbcb6f3aeee82c27b56e74b3f46b5daed271adb59f75959c95e5573aee68ab1477fe07f248893383f205b76d7be5ede7f6d5c91dc98c7e8ec02132f95e15956dfbca71dbd36d65c78aca5d595959597919b7579661bf91ed6557ae901efd4a190975728d7c13e4a9d9c3af2ae1ee7d856c8686c463177b8386861c51cac69d53d22d92e0495452c71f468c5b59669d61cbf768cf4f963e5030c93064e98302206498db9238fe20edb6926e36b71f3b25a399c4f11fab92914ae2742529d73e6916c4ed6d655a83d119b3acb3fda8ea1ad229672cb445e74f39e794b37af56aadd5370f19b1caf2eb9c73ceb03ef7d2525ae9104844d029fbf28b98aa16bb97b7c3481ad5412eed104622823e3504ee2d62081120e953bf6809db350aa2f418acf0a3850ca0308213171ab535bc287924b1914719931358d83772ff3d23b7cf09b2c83e2868229f3c059e94128693d2a5941ef6a94f934a2929363971e587a2b8f2bf77c9bde4a494748ee1d94eadcc1dade2978eaa6803b9cf7aa1ae0b79f6e3c04d5447f4ba4aef98332489c624b9f20064e2ca2929a5a31d2d9074ca2aca1d4a8933a740bf99db255cff4ae96d77f749a54b770f05def6b3f6e43a64e60d4ba5d7202a2975ce0c4b29ed597fd65984b9d95a6bad9f1541d360ab75be9c6fe753fbdc9c2f79b839b939bb7e91ba71a1f4e60475a040ae034f8eda08859ee32aadf2762af4b3561087ed436f47b76f411e4b2d07853b71f0e7be8237d46dab75ab35fcfa04053fc329f597eebffd7cce39aeba83377848792aadb2abe049d308c32cb727414adfddbb14dcd0b7a853200e524adec222dfcbeccd482ca88009337fe138f327e4f4823b86ae1eae2be4a97f44e3b2b7e7e647ea802c2c9b1c0f73efd87b1a572bc957b4abb277f5c306c10fd2aaece02b7b38d20f7d10f76cc3b12aa95de822415036527b8af8cf6cc5cbcf0029c306b129050fad58fdcecb87de7bc1d5d69f2e8aeb33c74f1e43184d862e71e6dbbf4ac9fd398df2f1e3bbc79ea75c55509f5a0ef7db438a396e2fb258420f4de9af478397d0b8bc47434353c2342f174c83050d8d8b068f767266725abe5b7eb4b996591ea626e39279d1c86464649e867edb9c2722b860f68d72084791050a5434ae9c1f49dc91859593673e0cc3e894f7fdf461585207fca6429e605a30ae1799d4f1177d892575eccbb83cd28f30b5fa23c30243054c6bb4f2238c55d9f1234c2df707a233a8c4ccd4a6454c2aa5660000000008000315000028140e8ac56291589667d2de0714800b7ea44c6e4e1acab22487711cc418648c31861060882104194043531a81007177226b3e4c1122c786bbbb0bfffe329b9b5725f86d4a61e0b675e1b6006e4ea3e39d20d2618913217dc84be756c5ef1020ee77820830c309efa205f52ec9b85aeeec3b19e78ac72540cefe04a5cff25976e6422b2b8adca413d966ef098b9b3f02c05bb2ffb95a4f0778eadcf4818001cbdcd22bf7721b24f3ccb3d98bd10c4d4ac0fe0baaeb0de19bd48c3e13ab2e5da9a9215a34232a5407cfce883b6f42a3811c1ee26f2e7582e425b99c66127696ccc10c082e5b94ec797c0ba10e4d4b2871c1a36bca492d1db9a0e5a816732a88d606728a76bb170d641629138083350be6f0782a762dbb95e331e37fb72090472f2a3ce0adb8eb456d78187f82bf5eb6ebfe2729786af2801b7fb22cd8893111ac736cc909904224eb3624366eb0263b291f47fc74b9cbc4fe98b76e2fdf1c4efeba471ecbb7d313d8509a654134f57d53e5f11d3c86aaeb61a87e93b95430d313af5035b6712b959fabbb32c75a0b584bb1402ea5a412508b7d5a25fd754046be2a3d065a980438416af6c0001c47106b49b04b4c759b886ca4645cba9283027c3150a936d1613aabd8de04db4680b9747da939689c6b96278b8cc3a04f7bd3cde554df1c1a8090a756129cbd895378c6be2b1617b760e9f65d8ad9ad222f1be4d505facc97fbea44e31d41c5ed9e1d7675ef4703e347021dc1f0fdc1a8728de00f7f87aa2d9408349eac5c54e5a42facb7b0820577998d353c05af30b5851526bb8e38fb9aca040c5ffae7d02dc0aa30d47843f1f1bc7a84f882cf29d30771caaf8ac6af3f19d2b419e4b118eb796f377f90180580748fa61320fb37a2c3d01bf4ec41201c8cbcfdabaaaf673abaa8547d7046238459b51747a97180869ffc72524a6102c1808baf30a1cb0abf8419f99cc161615bc9f5391e11019347022707385a21eccd386753980b8d4744931a5259955177705c4743da4afe65c9ce671a6043cc8d494d6142887f2e9da272253df0c1400a147633370be1da1136106798879e39325f337729d32fba3cc2a5fecd0414f61618cd2cc89a45dc7ef6c07d5ff4ba4406e1197e59f440a0b203755a51a3cc4aad4a2b4d49da3fee403d34e17b666730b62f4d9ab8f88bd1a0a5ea0dce9200bbae4488a56cb7b5318503bc9761fc6c9e76174185f98a13b2ee7e7669d441f64920c4d1a1227560e2ad57759c9a7b0e4f7a453be7f94c0c13b36434fa52e311186cbdb19af307a20f96e4bdb11c1b301d86fac7844475403ef98b347513c08acfc38ab4d2317c0f57a24b3eca814978f5e8c8eeffa76e04991b941571b8693a4f5c92580c42de44f82c661c3e2ac5de8143e158a667a18f6508c1bca489fd1e47184b53dc7b01d35b0dc3c70a94cc3c518767b6cddf9b406e00c5b14e1c962482c92b888ade94e3c2bc759c997b7231d61b781259b0d4e50cdc84ce02a2c21cb200b97ed0a41800c14a57f44a3dc568dfa7439204dba40e1a12e305bef40dfaa2fa43241deda4762d85cfe3c9b1d94b1784cf8e1c8ccce333091e50db866a9c7d3d7d02d5e1e9e59cdc4e6ff67fdc5f367017083c01cfada28b9d3779b65937e7a016a7df1b447ca2ee609a0474d104e32fc090335b8cb70894a69a9b1bf266fecd73129b6b97bc625ec46e6ca7fa116681a07d50e86e6ad0c3045b6cd3126232e6b0e46be726595c5fb585cfff2340285dda1394e87d63403a1df3090693217750cb671a5b5a20b50e7e05c6492f4d0fe193bc826c5d3272405f734090fb900366d34ea3c24ce54b03c9d1859b20c6aa500aceb891bb90051255457f86fae054688712c2ff2b852c026d53392417a213e67b2fa3e691bc455d48715b47f9f0f67e0e007506f6dd1ee810d2b7163f9970160e0527468d3a9e0f53312e6745f85f105b400f2347df2329c52a4c2f9a4011c93abd250027c61c227cc955888a19fc08c60ad81028e997eb1b9823f6df63462e5b93c50a23d30b3e09cd3fbdcab1c34002d230801b319a291dbe230554143e813f789d633a62217fa16664f8b4bbb147506ad78dc8496771573f421f3a931008b05f32790c1c520121aec842e07f4d747a6f9e361f8ddf91ee836a1713b1dcb706c68aee0323d90eae9041afb69436836b0342fdf60f3954b0cedf5ed75c1351e9f6d84aaf9071338fefb30676284ca9d9f5b158ef06b2dac7865bbceac5421887a4d2af3dfcdcca00fcef314de63264a0f8d65928f12dd15086e31647b079c4ab1f9fd4b0c3e17069d2ec3da754390342f1a4c97d32b14e41c8f48829fc81e613b05119e120b835ee15bca61c5b7b35242faf1d0787a176ac96cd506c4803cc37944bf33d520800d1a577866cb74d0deaac64d18978d49b92e803f1dd3514f39f8de72baf7fc2aebc0d1aa03ea7a189549bf8b565f13c522f712d16e5d875d83973310cca3967a03a8413d36c36acf96e368759242326ef6feb841a9070358e889f30b2968d368d9ff5c829eef08f2d20b1374a1dad8ed89e7386f6c67623b5244b48db7f4ecdd4fd9f0c3de894a036b277c20bab3d41c76d43a9cca172c91e98dfb9c5be2b475b5e2ecce6c3d7b90f0cdbe3defa7566ba91506c498a7a31cc353c8320d60fbb98b1c9c78cbd16335829f8006fb75d9b9e7d6d867d5f57563987c5a04dec0d1af162ae4bc568a6f04ddeb9f30515fbceaebc372c331ea2c48a3c47b054c21a28d26f6c926451702330039413114767ce1210cc57908ffc408fb31de3f943350aef70f4dd825065f56f112107e354a51977072f3b5f3349621b5aa3360563404f1ab8f76c390526d43a9db028d10186f0f181c1ff51c68e4f71c9cd5e5c5d40bbc70019f1abb5142eb97a557fdb4813ef8c09dfca26b280f5273058ec0fcbe36bbdead870109eb1a2d4e01cb9f1b597b1fbd8113f68520571c82be31e3c5e67f516420e09b6141e2aab3e92f640ea0d95529f5c6eddb5aeca494dbcf5295c651665c292111eca3c120f2c9d0a5c41fccbda32a4e9838947bbc851dadf45dd087c8e7621c6c61576c6428d77adb659db124002ea0a3f6998cda9355f236bd28a19884431461c9fd37e7346241ebabfdd2433ba262856937a6e54e1056394f945f7777ceeaac0186da46ee12763fa1f373d758710ef3698e3022cf592f406a1379cb19248e908215f98c8b87179d99c95bd5aa3add6bf568aaf02fd8130c5afba894164b22d1352263edcd38770116d5cf9fdf1dd83169974633b63baa9dc150494e5ca7a87038889271e75ebe16491aec01269753202f7750b0b5ad4810c042b976940aa615283af121d8f6e8514e0ef2a9e39a00d612c2169bb75caccfe956b69fa0b08fb99b9b680f537e5fbc6fc14831f4832815c884f8f58c54c18c6a50cbd7ea92c0d8b7a8a25dfc161c621aaf285860befd2681b71f6697c2216a9638c8a4998e41cbc9578c600de0b4c499069268af71389c039d225092b638ee64ffd7c753b3d331e51e7c3dbbff041fc7299dd40cdb50afac11e1937aed79209ca673f8e2a4a3795b6a2dd5a9a0d71502d4f5d6404c78e2ec5f2aa184f6544545ab92d28f4eef7f1c00b87a7584669d8af085dfdf06b336ece40bdfaa0501f6285d8b2778dd264fe488b33ff6119956bea30a9ceddd517b8ddb679a2930ca266d6c27875c7cf6926fa5b9f5e1cf87690b9420a8e1a94cb4016d426f455c3e0dbbd035af83c495222b2b2c415bbb5ec3ce51ca7acddf401fda3b98364ae3c4504b62a59360c57d767c44be34cd92839b33afb1fac6e3c09609c4cf1cf02da11628d36572b56ca76f89a944c685ce591e608420ec8d2672a2fb9596c76519d62ce767d15055b422cf78b3bf7f32bce23be5eb5435de961b1f32c0e0f3482da02a581f877b79f0566014c37493b9d1afd1c7b50050953a8b5e6d1980b7d743e94093b94de1ce2ca3de7818d71da00190c39ed82e34ea6b7d7d5576be8e5faa0f3fa83080b36a024cce7c37783ccc17b4bebc55f284624fdf551b835d193a1a86ce1312b6c017c367aeb8c6e80ac3b7fa80852f60d627f2ca78a75490ed4f8bafd6904f9b9d7ee400dc9f72ab9fb8de6476d57fe1a74004b208dce00470f90cd062ffa1af0dab4ca4493e2e8ed49dc440144ca2a6ad6891a0e599e837c78834baa4de132bfc95d22d038ff100e67929597ef6ffece75f393514e70611da8681406b36386e526e70c325947d673bc2958d9de40fc04422369113a2329d894a47810010e181a627a1a1c127715d794af1e43630b7bb8dbd55aab242dc6a9c1580d179a9cae42a622e52ccb6bb2b7376cadccf4810c6043866727ae90454e475ba340ce36a64b34db5694cf204950028dfe88efafc441a83faad514117035f19897b1a1991625d0e565f3f6cae016984d96cea3d40fc6fbd2c830bf16a064bda3361f57b8168a1e67ebc07ef53ab9bb3ff91080e845106189f0889667ee1a9b24aace8ff176d311ec41d73d1e5af0a9408e528c29cef4862fdb3df57d3c752c0b33278fdcae134b68a090860135ac616fdf3a5ac95aded0b10443da524153c30a168350e6ef4da09ce34a861146ce638ad9437dc28edc7a081aef022a4e0e4e34466f77124e76de17a3cddd5870b2be814929065c921c103927772667a8b0642b960f1499f3ca14479a4cf808e76067ebc24f0255218523f8e28439a228e8f124d64e0ba3ae71990fdd431c534b60e3ecbc01bd8a03793000afd7588201c84401ce2e73ba3b4acac023bd24da6f33c4831b7e25ef3a915f00a1cac9501591a6800281ec80c8a080464f65a29cd334dc9521da8821e6e4875be720ce35e6a068b7976fc61baf836008b5100a103c910ffd205a3871164dadcee095eb67b8513242cd446e0631f9b6273203cf741681de0220a6bce17ef601085bb0148557883c6acb0e349cf3671c6a94054a9dd35729e28ddc2c724280369af95681b3807b1abdd67152db23bc147e5ee925c59d304f3d9edf9232a19d8423df8ce08332705e00f40dd59d05b1a4c1d107d8815148cd55d892948a195d74f0a0e2dd6c6ed0cf81c09ea8bd1e6e1155dd20a6d5c212c57e7f21ab937bd302c74158960271aa101ac072d6f7d7585675d7c94b6b7296c776e3defedf4811db44adaaddd276292bcc1b1ef24d85fab660c2d7a996af93d7b457773f8473442a14d67c5288e8fe7d36c6cb669747796620452e991e9f71b2ba7a56f8dcd1003997cd6527d83bb62533ac56d4a2a4f41925105123a1c7e0c76fdc3c04150c4144115e7343c6d3fb517f53c7342ad21c989c12592376ac9e93bb34791f590ec46da672cf2bf39884fe648c8a1d2c259b1affa21b70cb25a21bafd3cf64109d12ba5718c565551907f10c90b13130b94d0ad6b57495cc5737b11ea2b62084e38f50f1f4dc42a064fa5291cf54bbfd2496fcedb8f89dcf30055d24fb368868ceaa9829027a22f1555759a7883cece0b7dd470a8aadea0222ca2c1bfc4d6407270aa84e4c18ae49d4e2904d3b4cdecd54845771948bb7acadc6c84bf064fe9a922da0fb37e0d3694e0e43f5988a5188c35be0101f4c7d1ff7b8b8982b5d815ae0ce2eacd1968966ea453e367477ddd7514d817266f126ef8060308ebec3fa843d59031bc900791b8ba40b2861e2bf281f27288f0529d8406cbe315cd7865cbc861b82d4218b8388acd182614a9c009cf80410ba407ff900b7a7ed2c7223addc200c518d1ba1b5c26c1fcf6a13ebee3ec40d4d32b3564150ae8ae8348f1f1a9d84a155468b26bec5a9ff8b455fd3806822be97ca7144e3f134249236f71b07c572f6256b4666d262a88205f5823249a4eb9cc3483f20b571d51f9ba828274d4d0f8ba4fcd6ce89e1782f0b988dea8362182cdfcb82358da82d003b8952029cc004319c68d21e409d0fef34c3837ec42b1f92c526aeedfa87571f704716096783fa02dfe335cbd24380298b0ac7adcd768c61e53513e5d90589d10b8b9fc40ad454e1582253e0209afaea2217dac357f0e7685538e680f5960b96c8d1a0370df3df98c260682df508bf76ce4ae88a538ececf6d9dcd91ea3386faad768853899c4f514f637132a572aea7c60f3000ef011f385514cbdc5d2be5697a37f1f4b646eb955507c5c742362ad1b747993163779c3c160ab278ce9f9d2cd73f1337c1701cd29d6e686296fa696c15475189138935c00d80f5b059066e7959946856334270a3541f7228a0309b0396bf5d5b191189f0efd1f40997519466a19c7486225a657486e57b1f0d512111a989f22b3bb8db6a9e410a9fd242282b6e9e423c6f58715e08c1ebc12996fd22c0a5f23836f2596d8d6f24196d3f3ecd802166069d449de27cb8f36ee214182c3e26ddfdafff7a4b1d12d177ea50abe42f065bce1287e2f31aaac15501c03358a238774b3183953c2196b97f50c9bda2167f4a383c41726cf68620a7efbdb139b95574a1ec85fc199df4b1251d93c2fb828d0bb6db09f28e164fc3f9c913b6f07746890b7fc4f28e61adec7f46c1455c52d99c219230e58542763b801259a5249b2c87b29a9258a7f49b2487b39ef258a57cd6a3f426d9e158a76456a2c426d9e1c4ba60caaf718ecd78b4b91817b5475a062d05968a3c804a1438a4d4ee8230182d1df79fabd580575de01e72f9f79f8056c32c43394a966a229cf8568d9a37261c4d3cd80b56bc1dcc73bec2e9d18ddcb53d941614514752fe520de18a277801eb92558589d9ad20841c4c8076e9622aab0f567716dee937dffb3bdff79b69e4acbdf377beeb37dfe5ec63359fbedfefbef77f8d17692c0777efd5d9f758e18673a9e9bc52039af269572c92c7605b5e8b73e83a68f7522b8581925df8add71204e5472079463e0f444b81c3bbf4e23d43577c367638d41974e33dfd72d6c402e1efaceb0bbbb701b84b5d45b9174b6ffd6155f94c786837a5965e10e1bae85cfe4bd959f924ca2c5ff74196f0a38e8da1791ef343858c0ee6580330e4ad70ab12e6bcc6d15862eb6d3aa518dda9c47487869b672ac8b853dd17d20feb0a973e09b8b997ffb018b2e45b09518e2135a96794ec09fe729adec29d4ae02d8c42192ae49eb97bd33bcbc01d6fd7883adaac07ee13b614fe3b5acaad3e705a6579e3f0703ce36d42a5f20b4ee36d7b367960bd251a0f06934a5f1263cb49b77a4db198807829bc0de2312cec9c5a66cbf8fc69798abb938940916ac28e8889973c0c2de320699876afb8c7439894adfd498c2ca5a6998126a33cea1987945d44b176a538d1e77e9fca7e55c86545d5bdef7ea700c1b84bc4cdd28fd936057738bf747a41137dd3440a35634967ef7f8653d5a715efdc546d32b2894d920c4b108b8d56e7bb9d744c27b3ac94794dd83c6848efcccb3b286c7c5dec5ea75d4aea563995bb863d9ba4f42172d3b1fafe20719c8dbc2383f8552ca163ddb4d4bcc631711060f8a00ec73007b56e2221ab9fa51ce2882fdb4d54206c8cf52070e12f8903547bd06dcde4ce83ce3ecf7ae0a0a1de3dcbcb85db19df32a434f1d591e20f7ac510d1825645d8f6ad4c465d381dd763f580232c8d1832718c494841b3da75c5ca8a73f7e84065dc74cf8dbda6c7140fb6f0f170fa88f6182e3ac5c329268f39610bff48ef7028b5ac87e2ce74188405f0d070cf69d43570a7995e67c3dc9dd42ddd9c207ad0393bcb8650f5e48135669aa37d2d42af7aa2f1281f747f2f4738cd4c2b46c453881b2ba9a27a393e878f8a03657cd9edd30b67a48a2e271eadc34ac3bf7a53547fd3791c7a49fd0c468c1cfa9a56acb95050ba22b4a90cb949680a7420744733f0342b34ec23051d8e1375e80a45c528b83b53f5eeda04907e05873db983048fe48e9db34e9a2b01a84b54ca85efe676b098425a7378dfda0ca5328d52b57f1e1701c7b098c9b55b3a3394e324091b9b3af326207bc2af786fbbf6479d0c9d25e4c82d487f3d5af8a4b3178abd48bda11817885a2f9ae1edf1c940dce33fb8ce3dc352d5d25505be410a1d10e884fdbf0773322713a0fecde381f7671bd41849d2241742ebce7d5eb4c4750fa9b1f7c45ce80f884d29b582b1cd1591f544c771b7a4431bb275f96360bbda64ab5f7930928c4f6c1ee965f897e0b70639ba7bd07f007e5378f3238c21eaa872aa580c41c8015e034cc398e00276d930179aadcf25952e0b5e95083f8ba04969c1adb4bef5e43b695c8fd9557e2c960f847e918246ed48860fc88367d0aa7489d9368b66e14cfece8eb7e3b60a11b699297f7dd05df4f7a575e621942120085cc52006d835383f3f6e2a87216deb493cda4e5965266db0943ce541fa67605f113ba00daafc583b5e1869b70ec1e84104a1f5c43afcb26893e18ad3d1f6a2926d0cb173687fa3b1960da4ae39b842bad60aefeadbcd7d96e48e3e2a1e55126e8382e38fd9887141abc9ef848dbcc343d92dfda6a01cd5ddf02cee476b7a3283ac4f6d432180c42d849b0ce50149ebdeca40e76c0e98e59ba9fdfadccb83b8e6ac50b432340cf1f60592cbba03baa32ec59f625f00c29e0ba98763cae95440e55e0c761fc48afb7ec696746cd48d41c5287ba050dcd6bc1fe3f1782a2b18a6a22114c268dd906261541f522198560e49108645431784a9ea5045c158394462182d0d5520ccaa6c48387d81d057cb42462bcc35fe4641fe25e1da782791afbc5f6b56ecf77ff7dcc158ad1a947faa7117e9eac9c9f9a14f04770d73be58dac2089b1022001621d53b197985a56be7f0c9af6f9553bc6a8a2b6360ddf4d573da8e4e82fd4930a7fad75dc953a2b53b9776067f04ca118c089c7d6d8c88d7fc869b0cc846db042308a26a34f1143f82e6f60e2687f8a1bfff4c5a88ff89731856ae8b3d3bcf86e46f576e566449992b0ae64eef9769a8be4a83dfb4950c0123599539b87eafaa07733f8a2f62aa9a41dc24390fffbe5848619292acda74f35fd119885a3815f32efea97c0cba94f604591c142eeee8e0f911029d193e03999025c488b3ee0934542ec5bb0e1d5188348db0113ac60ae6f879f0aee2e21bd7ceacb0233a9954c5adeb25bc893e027dfa92297bcb15d04f9b2cea4164b4f5b68971e6dadfb1a325184bfd253cc0bf863389814424856aca2c0333d503222c2069fbd71188c21c61c2f74bb809ccfa902b3ac57005ec4d4b6056377332d7d457e634241e6de74c6557e1b35db4b9a5d80633106221d9dda40d8b29643eba2d28c9ce6b56c7c03d2fe6000664f1853ff3b0eac2ac3da1011161dec030d05ed3ae1ad2dbdb4344b1bc4aeb0dd03105e7a71cad52038f6198c91a26b31b9b5766839bb4baac480f3dc45393eb120a04c30c241d18116e5cab031764bf1f80c012266632e8b2fc69b18c778d6fdf39d654f54b7749f4c789a09fd1f24ed165a4aa3bff9582bb15ee45a2656a054d2a235e069fac79797435c8dc6a0855c3b4f3fc3c9caa1b2cfe658ccc17ff70b84809a457aa3ace6579450f2813b8c4ddfd49396c64ca8a46b3754dd303547c5728f82c0956b27dc58087f48bfc5d0f41acab90c89c2c2e66a3cdbc16f8fecb2a7226e544ec71c947b68cd0a585d647a8229a1db655296017fb154dda96439fd9339b29518eb14715837b69f24d88dda03d2984b7a2a622e6847cf65cb6a549632db97de4cbcb3679a1ee6e9020b149f1f941668d1e2dc256236ecdb207e4560c03d56264d32f381dc86e6fd761580072c1f5faf56f0665698823abf45864163c41bccd00b250cc19db42e5548e7082b1688a3f7153cf7cd078ec724c1a734bd74e87c1b33ce1bd17e9005991af6048ce5081eebe2baada25a677840d34625c07bf49d15bcfe3d2bba1c047e2bff8d44a14e254ff07a33670d8555feb24294484ff6cd01b088a9d024754e30b9531e160cfffafe1cfb8d1c35c950f361466938ee0a18b97356f37ae8e1f1ba040aa6123c7adad3e89cdd409e0088bfcd489f684d9828cde4f82999568d8c1068b7a9c9b347b83b0b0d085bccc4b0915eb43159c30ed20ab087af25adf1183cc9da4c4ebd3624a6b5354e5481633962af93c1cf4814fc9ceda15460dae6054d8317d81a41d7ee745a7114ba4fbeb1cf96a750947989f26e98701badd1b8e0076b54bc73f9e698ca76e83b34202d9849184e40886d91d9700e1873cc7b2f1ac94394e989d1142d3b0150da659b11cf902281c6bf2703fed602bece5969c8abbe02ce6de953f6bb929efda095eaa8a5285d18bc5982b6e9c40353f311140e1c3af0ac6042c44330764ce4203602cbf2cf3ffc951d012e60e01a8408851f914d18c34bd8388806bfd4abba80322902d9fc86a347550ee9588085c55c23d0f6621ba9126a31a8a14beab90b685a2c3e28aece6b5b0c4d8648e61f46f67e5a06af2e1a932f59f9eb65ef3e8e28049f3e6561dfe5fc757d2ca37f6cae479aa49b322e7df2560b8b88606602d73aa4077b7a4dea1a0219b6e584a87abb00fcd10050c50c6ecccd0126c80febffa0a55554aadbd63489c8f1218042136a19045af938c8a29273e8507b801fb423f7ab9d3fb4c2d6a0f63408fc600708dea59dbb3501c6542603bd005035d54e9083995d3884fb3eefe65d5afb652f99a0a02cb4e978ec4fdc1a5e5471c9d75cdb70dc37427cdbc667f67632021723341396b7ec8ec413402607cfc2963946fd30497b251d2aadd748f3ad08b52616eb5b039f82c844d0ec2afa7c3f8f0dd94b3b4825e959afa74765ef4d64fe079a46e5eee72f4929002cd071750e87c09a9a573952c983e10d5d270cb886cad4bd6c478822876cd4d92b4683b3226d6cbe06b2b0efda35c7ed75e676dee1754796b9fb3843b3ade3ae767fc2718549c648de0b0dcda15e35c19e4a5e818c74f8342fae536cc54f2356a5b99c6953902da8aab00994c046cf37c022a0ce42ea5a1436cdb4e0763ab8d11d8d558aa2126434895f0287085b0b16c719fa863fc103c2abc2409745494ad48ae164e16d94d2f786312d84b91e08239788c805b1775934095d40aa4522351e9e0423bb94ee095194d95c317d9bb35025262d42b1cbbc05ed707a8f22250dde8e2babb36a04a8b426553bbb0a609057865cdbcaa6e15055a53b0b886c1aa10a5082025e0a11b9c0ba0893e60260c4b67a0000992680332311c9d030300145103c47430740604c021885c00c681cf3d78449b20747d38a96ca9168923503d0d2a2c5e7a0771a4897e5d1129984d5d5e198fe02941f0fa402203e74fc04afd42781b976df4693bfee86c51415aba28210ee9eb500faab86f231caa0e5691ce29e1be75cddeb86f28e59bc9280dc6c67427144e958ffad04da2bea993980f9a4cc4876602f34991c17cd06410df05ef2026e7990a473ff373673631dbe186992aaeed158ed4671861d3f8a25ef46732a198f2439f3a7f0a88c6545acb1c39a6ca2eab55c586db26e7ca9f52f7d82c5435e17cd0a551cd2eeed96fa7cad826e32517151b02b98a68ed4f8d22ff1bf710515cbcc138238c8640b2156e11936d31079b1a1a0c1abbea0255c21247c8f00420b3d62571b6ec00098518cf5e3054b7ccc9d3246704457222118c4cf9ab1f403508232c4749e11621c9062bd834cc0e417343cc51ddeae71defade76e3cbdc391aaf93c60d37a41abb15046876e20139c5e2a27179125363844e52eeabeb788afb03bacb6dd1e1ae469366c821f6a4fc20cb423e762b100c057abd0d1432999fdef8b8922d98f51661c3ae06f8ffe36409190960fa4054f251976939eb5ab0bb009821513f7128f8a68a397fa8aa0196a2433e596f236c9a23ac07c7412a62a1e84e8de27937a9bc6ce0eb149840072a6ef1d5403dd5107474183a5395af9a98472e131a14c27334992824c0466055d3be25a3abc95dff5cd81358558e3ffc9f6f0104abb55f3e8c32162fb173f2ca5eddb9593b0106bcae9a5c34a1712ec0528234ef74640aa425b884dc778f22834406ef13443a86bc1a2730f3d7249945893552f7d55bea36848599f9381c32f2be72280e63bbc6b5fecddcbf5d9dbf40868e100b6c4a2748f3a647e132aa607e92653ba6777c896f06a76727b7e4c96c0563320bee75ca466c554287a7f592a1d6d84dd2e9333cb2165936552e341d6064d8736031b4c94f3b695a7fbca2fe017425658bf7e4ea11bc316bbcba9af24c2b9dc9ce20e370bb174da54277c795b0efae75ead387113bd3d413ed916989787e9ecd958959da38ea24aa2169b5748156c1e52804018bc09e0fd8ee2ec62cbb68ab9de6f4100049577d116e675ef4921d9c71ad378c9d0953925bdca133b6003d299f3e3a131ae2697ad5b734e2acb24966a34da17b9dd9460a800b8a3b1ad6caff5fea8980f3655ec72446f97ed73e457e56bbb7409dacd74e7e12f089f1095e0036525100e794e7c887d3d613778039430514f72941e6dc24b03a81d1e199f3878fd137145bdf36fe8333322448626a2bbe1ad5aa0aaf5af0ca3147430a702ff67f24142f1f99977ee3dc79950191151855e279371f6df86928e8fecd2390df329d8c1a21abcb8a67b1733b4a8a6c02b608c87c7ec25ef07ef764348e4bc0b817e0f01224c02f2f6aa3728238d8b0c1d634efd5c52328490475d331baf578b35da1b24d3c2b84672f2e25976dd8fae850a218f8bf698627c5cec20d15a3c25e945ee08c413163929539dc45454d0984b42776830560638dcfac48106b8c483a1b96bb2871271b5414c798f9f4147b08659883a6212a3a06e88fed157fd955279e989034f00063bffb50df3bf299e78f283b9d4f234163cc833b006b1185e1e5d060d209ae221240a3f162814469f4610de188a450d332114c5ef35ef5ae3408d767f2546e8dbd87e0ee5df60337e8e0d5e9a97f6f3f0c1eb9dfdf043791f6e59423cdd9cb398862e2349ad28db423ecd61a6f963d8dd77d625b589ac8fb3af1b667fda4de7bd149dc519a42e1e1fa14b32e08dbcb86faadfdcead9fd8b44db9b1da22ee8386270b0d923c625ee1b62db5872e578100424b7beef2b00d3a29dd10bb158b34a1d3157f4bf7823cd18d30a202bfae0108cf16087f52f34f735083f5924e2218e17813c72e86ae3c33c5c2035f21d8d0608d8a859a4901e8a5244db926db8e147138f50c174094fcfc0490f68d32183050bd8273ee1d045be8daed1855a86051dc59128a1bd96f11be57074b13adb55f101ffa37b1f3e40c0ff225fddddb7adf1ec3f08e3c716ebececcb067ea1eca924e947ef13f6048491e1c61ffef673bc038311edc065df221dea5592716440d9e493335e8c7df14a75412f30fbab654ebf21fc773c206e7299d81b3443f52facd23df15830d333cc60b92ec895bf0fbb0b3aa21edeef5e4672d6fcf97c769eb847badb39c64f118e294a13b7e7b2a48abfbf794ae21be25260cd61489641ac736ca6375f41eba50b29cf320845eb36680ba03895a377f8930fe4282c52702655dfcca53e78f77561ed7e909123d9fb45230508713df1fd39541796b225882c23679fad5720a70b5a89a78681b15e28071dfb2e7e2abf06205e597eeffeebf7e17b6ef1ddcdce2afcd82045418e84e62d6426e85ffe0db32ac2273dbdd57365f5e6f709c9c2d3590b599377b1c155c9b0fc7f08628ee53d19bc25878418cf1de0e3a08b2c64f240ca68b729fdc5b3b7262ac82e6c10a87b174bb45b243a14954d944aea675c24c78955917c37a39cc3f23cf33ec484ca93e1c539d2dab7408b4082aa1c22f29512d34f58a275f9107e72173fb6e25129c5f09fe9a9178a77633b91b21a394cbf1d9853eb507368b0edcbee0d6a99875bd51fa5aa4e615d3d320da9f89882f50487f2dfc8d3e922a66512faa8611e60dce728822330962d85f98462d57453eed3a54b438e173812be1c36a149df630f570dda7983ba82a02fc1d55f43a0ef4eeaa21db688c5fc6ad137478a377471d1b08a3c19badb096c317d6b3de5db90adabac88ceafb490b46fc30a7b37902631aa8a68c1ff90379cd94d1501bf9c1fc706a9e12a3613c7ebea13d19cec1f9b32983429ddd8a0fd4000fdf31fc57730e2c3dd1360c237bd752e1f330b9d79f617e9559df21190fa919e71233c146238a624d717225811fc3392a60442027f34d8de3924abed2a50e47838db258e869d8fcca4ef576dcbe63dc9341ce88cfabcbd854f48aa33556b34e8ae54998430edc99fc4505e629e446eeec0c81027f91619d9b3d515cc7e9aa38c264c2521a632d9f63e4eaa90feea8d6a4759f3619b835d30de958fa6000ad33f5e34c88d497d428ea1a7b1976de96a12eadec3fec791db5ab18c513b2845261faef80cec37f04da39e317d38bd6a9712ba902ed7441d2fa1018918c5d1dd89f30c4a4912704986e53f43b74bb5cb16b663c91cbfa6c05e2b8843c0c454a1a23413764ed985b28e6dd82e87d821f698096c5b800795c22a9253bb7a462a701666d1a4a8a5cf2e7b3ac41c8a35aefa82163dec1394c699f88ee6a68f5652141a5558ea6d1a67f01a741f69e6be1eeef62ceba015b5eb818cba0be228b9a9db7ae3eaffafccb185e15f8121be3a71c1c0182fcc700552a998d6e6ed05a085dc0fc2322bc83aae657369a16041ddc894a612b24cd1c050b2c2e9efba5054d92eed02a260efb76d88ad72f29f0e8b441a555ed4ba65718bf00b725581a3a24c98dad144a1455a1f52fe92101724e787b9b9d809662621e1abb839731a18aea2beb02cc58939d681eda3bdd036aba89e703551e84044bda185f4f44d87e40727f7de34d01d60f1001e879eae6f737ce2fbcd51ac1cf97672508a50b83c4c3f5523cc315d504c7f93898b295f0042e998bd85f2b71014afc4e80b9c70522f7f049f4694a86c6b331f2867c157f3761676e585cf957d46a7a91c8f99a0539cb5ad87c423d34319ec5ed168aae96ec40f41c3ea1c8fccf6e3a96e9c0d574b1e657d9f1b36bc6ca47e86d614cb5c3a010a24e1452677c46ddcafbed505cc77724ce81463144d346d033c7588b379ee300573362528a7637191136f1b027dbf4d3910c62d04ecde2e7d8417a54e765434cb9907a966a57dd10f432155cde645f24e8a010f6c30eb8de9bce98641bda493ac0b73e526cde24a9d470ea7a95245ae9abdeafa4b6a8926a68b3469e8c3d3e246f6aac0498f0fd2b424561ba36675bf01f354e24f630edcac0083c170b26f0544136371e72b60e688212763ffe271e3cf6b7bf941a4c7f0d80ed93413b9fd26bea8d3100e6915604dbe531b40faa11427abad46a4c2cfead4bd6f5d0d0bfbe714dc97b1c0e079204b643e1296b69291b4aa2c54a71e4ba4451ef65d9204be4d3aeff81e89cd462d71fcfe150916e7c63a8c8bb0b505a19cac8c32a2e96f73bcb8876606e4f783e49aea3f6aa87a15406940bcf36dbb231ca89abc78151bebbed7e0d9330294c8b58bfd70d4c717ecff6289a3ee4668ed972a76c18dac63b553a94f13518d076e4e20e85bbdf88da1234a5cdb34f5b6f6da3074442dd7dc823d33111d8997662bb437bc9c91161124ee8427c1a6552898b7a61e2493fd476639ca229861b224a52de76637fb90b97efb6155e304fd6862283daf4179a5a750ecb1d69e5becc6517636fc95d3e5a30f2f161ed04fd7c73d1afe933c3989cc364d1c7ffda39d036b487002759e43b44ac1b0e7d12f6401883d5d5f05479f3407b2b75076a8852c003704598bdc53238346de03dea3e1b7168f317fd2f20128d909e62b81778aec42b64d822dd013b11f4ea91cbe27cf6db5e6efd1af9fb4e58c1d805254e413b1043619a50273558364aadea4035ed78cdb384e784b359e351d76812272c403933ac82af808238981c69887dc37b6c8db01b7a4ae9119b1ababd004f682bd949ac49eca87c53227de518eeba256dbeb5b49dd2a7e4699345fda66ae3134a1a57a715e796d775eebb084b1b45e9ba78b88111b31fd5095864e659a0cf55d4329d76b37e3a593d348c3431ea5907a69a43099122d03dbc64b90b353ef156c4dda24e88db6a410700c9ad7d649312b31f33e8a65076ee0856b855a76db56399640a15e68a57bb4a5130c9145a6bc892343bf9366c91bb27c86ba4311a33f863a45a3d4d75ee764cc62092b4d862cb6b0d226c3f6faa1048c911f1f24725517316b0779f395db9557a1caeb2b0937cb3834a58cd10e05a222da9cba35a9a86e30aeb5dc65442d0b1a6b30318c210ad2a994a7d86056207db5a87271c83f9306b2c6faf657ab0c7293a2ad1182a396e8eb1afaea2f988d655eb6f042df9759932b2a3038ee18be1088032adbe693bac97946d60c668464860300c63bc6f9d3f1c4a0e84260b9235e5f74868fc5416d48be18ce12fda2db96ed7bad9e3f2c3e7ff1d54712da19214dc6a313d6babfac6109c131f59b0773aff925e02b33eccb21f7d2209a9b981c5b7757064782f20e77ccf32f61df37f774b11a63dd1f3101479e2216d2306ad358f766de988547c2fb1b8bffbcff35b916148f79335d01b69cb3dd45fa3ed54697cf3eced0e4ee931b3b33c35d941ba883d228bf75ca0c77b7e2a331c9181c7e32a867c15df29617a517258ae38ec0a96588e36b55cd69c2558cb4c3591b0ce3ca12eee001d75e3704a17f44f1b859fc0efe84e8639787c5d29f5138e3a623e93ea01527a579ccc1870fda9864fa4fb86715d186a86e58ca2145dcc588da1a687e3860e0c8f0572db4f5da72431386e0d7b1e8da8cfaab08316c4ba0123eb0a35f02c41a065f181327d0dc6450e0da25d40a0ab266316d78a1151716e8b3859257e7d231affb4c80021992ca5d4f1d943fe091fb77122d95669a4bb17304f2ec98ed8ef31caabe9a641c9b09f8c1ad72918bae3e51b0005514b8d97eff7e4809e3c465f098498eb47457779847b1c87145665cd9a567519063a4e98fcebc9649af32497151c736f297f8277877cb7b24744e983b7f104c75ff61628ec528662166905d9a24bb1d3d603f90fa41f1c280d460cad3012688946ea818cc765c0da12aeb6474b0a4f68277ba918343a1cfc9b5a8b83491ac78a98673aab54c333e1461835e8940834f7905572cbd9b654366b8f215b90853b278bae856012763d44805f8500ce69993ef869361b204b5059b51717e4c7a8ddf49a41727183bc4a6f710617f4ceea5d8e9d611b4eb0ff5e4821396589c831878c2b8d578182d35f7aa218b59d390fdca0215d9c626f96a5d9eabb7ddeab558b77412a911500639c3937611bf59c113ba8c97c4173951142dd23b2d2a0a5816fbd5e7729be630878a43f4ad905efedd21aef7e28cb515c29dd0b1dd0e8a733ea2265c5b0df78f510314a7959d81d96813783a3264c93eccb496cc7ade72e5c7ecb4e4e0c24c835903ee77eecc65f7fc7f65d4699e40f82654bc65291c44309aa8d95d8adee182871c7abc8953a6e35afa5bae08b8f9cc005cdf8906df3f29dadf92a2234ec91615a081ac19952fe2d142f01a0b44347511908649e42c3cd5483aae91659442474c7177db61c69299b10f1e6447da032e7b3520046df19b1274fbf36b1c55df0712a844f036779755123210ebd1997c9d95f5a11fc379aa080a0ec172a60aa90808f20bc3d0bfef405e00faa5216a49827e784a3088f397df18051e0ce30785c337a261f7327e48648f4f389af37599040de882355d5763d48d8d9d036d7ad7fecfa288065ce0ba0a4b92ab925f825e3c8eb86322642ffb60b81bb0403063f025a0e379f9623378099a50fdfcd248c7947a55d0bfb99d0e9ed04abca78e0ca104b3e6235984ed501fa3a9c3e94fe8c0f3df61db4fac7f4cf06b89f68fbc4f044540dc40c40a77cbee48bc0468c8d0dc23cbd2cc89338d30d73b0b4f90e8aec816b603da4ba9347aeacd60ed79ec853514580c9103b6b2a4c3466524b612a0589aedaa945a5241faa5e0cc36b3c60188b44d08a183aef4686833d4c5aa40ba71b40ea821517ef5d3c08400ebfd7cdc7b6ba9c396e0ce3b3d92f16cce27132474733a5bdfae9c48f39c14d0446f2880f5a79d6e7b80862b7c9f95c553b7955b508cce5bbbca305437aa41413423a8df45088e2311440985771bcf0098f0432c53f48098a53f8732ce177c240c4966be46681cf7a582c942d37ec4056c6c76e668bf1ac8fb2561601f7316b3a176bc083f9f3f1d9ca89ad87de02af0c9cfad2c44cc1c46de31e17abdb549360098bac264d77a2d8793e0b476bcb504dadc43331b9f405eddeea110cadf542f26ec3ded2bb2b99026077a8fd8745b1ac965bb5bec333e4a9215bbac72267303bbdb1b978e50b60d31d04105764225f880aaee4f3c0df4eabf99bf3b106a610fedb5af4c9b0cf86d4c056be6bedd199a610f10bb40708c5fd1ff2c2ce05da8a72192b7b6beb79a2b6aff3ede6b3c59a3df474dea0f1dc7cf08610a921176c3b0e27aa0251b50fd33a958467a3f1d61f91b242e2bd1a27c1c3956920063a5a7a57b126268460080042e69c1da60d36a1aace23d9e4c89e4b563899e7c4c211010670b2ab35c51a526149c8120d0ad687aa922c5887df298f2b48c6493414cd57cd66b9803f825c662f04e5d94e47d33fcfabb48b593a1b83760d833272b1c1435e98da70175837893d710ec0280e5111c0f60152e95e8f92530acd8df0a4fed15703f754b77a62c97c0e9be7400bda3e99220418a28ef3718010306633b315531b41941c3edfc01a0083164226267aff7d334db57dea3f34e3624c9be272c9371320f253f0d2c763aa98a8e8360d09e6874330643152cb79fdfadcba709c078e0b0184bd884bfff9ceb1dca0430b793b521e2f1f97287aaf8bc3b2ddec0ced00f2e7398b5652bbc27932e3faa186cbd7a7d82410c8a1ea55661f02c4ac29aeb68bc3c48eda1298cbc027a7e1948bc5900b75c35045f83d554dc207729c0a98ac355ffdbea66fa1298844b31e475b3563f18d17bbd45fee9f04e934dddeffb8136c3f006928f7026d82a799d8070e0b3c93114e7a52238228efcb3cd394b1968908e039d5f5d6f64699065d1841abea96ad7b768c15fbce7b101970f403139f0b71e29909f4ec03a33e7b77113cf55d003ed33147b5bb40a07cd2698ec07327215facd5758544d1623f56029ed41b3cfa85eaf18d1bdca9b867de49ff3229d58a9a3032cd47e2a811e9fb1b9c098576e8e7930e6324236ff348cd53cc9583082f37715b472f722c66681194ce38ff9a546477d779a329e60ccf801a4cb29443a808446d1e2155e84593ff0cb34f0fc54bafe66dae627015e60a887bf1346ae4c9b674724ff12631a220bafbbff0e84595ebb1b36487658ca2c811d87935f38a555daf1f55b9b35a99bd86b2fdc5b1a55a2d55f2acd49212cd62f7f69a25c89153cf6a96895d33625c56b273bc836b67dd8b42182493acb3b12a21546d3199eea5a302b31f3cd740fd752e4af7e51c28c312d751f81e48f7ef540c3874ec63c6ba2fad44f5b80900a593ef1c293cefe25480254b38913e7585596ef050df56309e6def004bc0f01786d9bdd2c636bba046acc0e0e18782497bdb427c5e9fab5031d52d4995842faf89e1c7e118d9d443019b70efd0ac35f7e41ddc18cd9c5af4f8f5246e5d5094570c3d3c1946828ce8b9d97c4dc6d9da683d0c9ea056579aee0e9b095de5bd155266af83a9aea62da601482e744f010f604f4facc2851459b57e43d20bf5d6725bf96a0124903cbc6ce877b4cca0f2a90b502dd676f20f5f6eedf6c4ae72d95456ab09965bb9f04cab52f34088fe7adebca3365810d39186f5fa6e1660453ec439affc24b58fe9587c919c5426a5d281311335dbba4b17746ca9155731f17a42ace5a2db1ef69adb53d4a11749dad2f935bbb20d99e08f654891c2f699126983dfddee4deffa21b8384807000745893a1be45b4b39ca35f1168c497208dbf2d50d1e9caaabf4b7f24548070a86044dfc94656be9102ead399d3c908e6b810bc90e797d00f652d5ea4b989440910eb0de7729917ad3f95190dfd1ce6238817c5c27dba103a4ee2ff8cad596500a167fdf4b1b1f3829e28ca97b60cb3905edab72d65f8ca4530c81fbb73064c97f0dd0704e2623c733209046c43bb8f6ef2ba1c98b6f8b1ac9b41e35473a17cdd6b35739d8d0f2dce2b479d5932f8cf75919cfa9d21e5428ffd5cef77878c23c5617d6cf41efd9a09febb96b8d9342681770fd6fda68cf32beb50dacc434f4844e3372b9a9e3c89a0db35547951eab4a886b125fa97ffc302c90a00b634dff9d5e36805baf090b8d0817a32291207c4aa01b25f3bdbc1e119f60ef8740b3db7035de16ee5b4b53e946015747e47b98243977279ae53804e84185419488287a9e275e648883bc9485d6b08ab9ebe6cc4543325a845b432f8f89c743dbec3d62298179ce2d69bdbd494229307032ca9293ea5fff73be9029c5e0a0c27344482c82b33b8bf24701727aa8dea2c1b7af5a9bf56702f96ac35ed58750e9e6698ac75a19e9d459ec28e395dc269893b654b545b42107ce3b822dc0eff91f9ca13ac948e14ec3212f5c104b3e1c1ffdf5595f047da1471d9f4934d169e6f2c6b87b4dadfdc465151cc7bb8458eb5e86f9e9366fc0a7857287dfb99d15a1d4b9a06cbe013256797e9cd96b62fdfee0f837d6487b258de09d102da1bd2f29153304b276633ee2dff1f6808b422946c3c90ae24dad5b352e04a88e42b6f516b7a0eb0cf24cce84385b68319f7a7a45568c83f1126514fa12641cee0a6f811c6889699680da1ca11c11a11b7e658bbc5e6d48cfb0c807398abc27634fb3dd81b09f709c798cc1c34b0b712ee7437e49368761aae2c8c20704ccd8206d9e96b0ec813acc05f40b01fa275eb210e6a4154605dfb209251cea397c98180224a0deff93e7efc8877998c71c4f0af22d443ed710689551cce249824164825c3da1e7050266be23e6239586643af9684ca2ae6b67ad417899287878442d2dbb7cd57731030e4d67d7e2289dbbfd4353f91a07d4587c39ec18221487dec76244556c1deb516413cff0d0b8cc387e8faa63fed4d7966e69f86b1a93c434e60efe3e93d54e04b4eb14d1c56f15a8ef3e382b2ed1d1ba6658172f8e5ce620759802c15ab96257850300bae07291ef344604bb04c859ff29d3c582c546e86da8c0d4b8b5c1951caede42d13dc64bfc8b7642352eaee307f2c8427b22488b1356c39f21a656622288481f84a09e9ecbbc83bf27d5896ce001e3b0348f16148cb238b27bc0e86953455020648287a21a694a818a45fd5f709dd41146ccd55980ec90e731241e35c4b854214d4b27901ba752a83ec199d592cc9ec9383a4311ec0f4e8b1c9274de2ee3a3609f446be7c24c6d3570c0594ae3b19c20a96b5e04200e7895fc18ef9714e44cef9e44cc52bc6cf6f1a05a0d67d98ea1dc057aac1097b44fe26557dd708a7b348aae448be7feea6c387759483524017ba0958acf3034878fd49f9c00836e9ac8ae14af60a0ee67e56c192e4579440edf121948c5aa8bb01d4ac0e4643749fd22418f4c7f743e344e6d83c4fd7ff5ab9f2a88e7541c4816ddae967466926fecd3dbc2d7a8721db0db7fb5986f676dd22b6be91ac5db432e20c761e369b5bb93f4c64f84c7001690206ad4c6f136dda3b199c98364f348f3bbd1008f3601228e6b6a413d45158d73e42978d3b1b6a740d96318a160a88f11d16c063f338a08ceb1b0855a08e20900e3eac2628d32ce4e27ffca56d4c8210be16a36c4b654d598620bafd62be2896720ea2da996393581425eac7f25d09f124bc31b0db36ba1189846d1b377ec5792e189f2efafec688ed6fa0eafbea203261748f624d807e08bd043b7f9e855518aa69eabe404c36dd724a0de142960410a89b68c0b0c297fc5b56381f45dfcf0b4a98284558d30a8a23195159cd0eb591476e1ac972cae787537e038f048a86050bd0c817d14c8e37af6adfb39f93eaf320564d55708619b555052333f273c5db4f1e3fe0d7ba5c54235f103a53bbb62961a9e26b7b94b032ef11c6937d11b07592de0d5b5453888428619b0d1d79671a7e00d277df51d72052d477a28f03e1c0b3ddd9bbe595362c0aaa5da2e6114dfc61db06622bc990ccd75a945ac6fcaa28ddc5159103cec84ca21b6d5cd755885ad3ab25160a90c28e183ac251c2f1851b933613028e15cb8305c0575e9fc7ee9bdb60573b1bf12bf5b71297f1ab889336dc359d78bc2b29508b9ac98b729438a33c63f85584957fa01b2aa25679909610f0d79a65223135ac0ff3830b32447f3d99a54aa83e2cf88ec49046b002d3f77e6d6d0392f822aeaa2517ff1004a3f4eb252e399650906852c2fb6da16bb2dec31f69de47011c8e8cbf98a8d7935cfa7aa1b598ae6c5a770053cc78019bb1283e483858035e5e7c3aeef233ab4c80bc7186785e5ee67515d883693ba3c5315e6805d75e6da150748f1c1b0e8adb6512832e358f131494b28136db1155aa9b9ada90291465829c9e87e0e19e5bd064bba3cc4ef8c8f23c2be8fedb235f3e3390f08379853a19fe0f701364afc89e3153dda4926f78d40645a38ee4a4ff21131133358f8d3400fab3ed1452819a3dc8590e30e5917fab2d150114d5060856968d11555bdb7aa255174df81647c40492724359f67e5747527efec5df039d812338cdea26d2dd9dc781343a884713acc4469401c560934c3a32fd35b3a83a76d1cea9a2a5c73f857b13521e8eea572e6253fc4618309e90b59a623b1ccf2a678b6017917acdca1dbf519d3244b346575d3b7a8d0fd49f8560b872163f4929eb6be61e6e2250b874db26a79dee211979747da99b93c78ea526890aaa1137c815705b5954e5ad7c70735dcd46b8eae3b1881a0d136093ec8aba2caf7640b0daf5a11dc2172da50bbad64e5a049ca0b44a62b783d32a6104e5f4e8107003a815c58fe076f99a2c84a113d67a1e64a45ef16db4b516135ebc5707dcd0846b999e247d889f25b12cb60235eace9f4ef7fd50e2ad4821f1b6943539a48750f77bad9b771727303bb0b7f19145f9c4ce66f62a2a367bece286cf5cfbe60b5b9ca45dcb2c345e0eaab768de9f4b842c0e9b7db47fc2fad3c68db9d2309fbf62796cafee775f391198a0a0b3b9d1be50bccca775e05b3059b420762c01e9dc558a8a3e2c2c3075a5da1333b374d07915d91d75d72277301e3564fd0eed2773c30adb845011137759ca5d3f28d34953b0526e582143a31825ade33e7b3ba9f7a8990c7c562f3019999fa3c36209caf0f0ac5b3b20235bf787ad9eebc1351b585b41f0a7b715076bc3af219bcf41b800d6cc3737b344f4bb157de637d88e4855a3ac0126d8bb55b369a561a68af9cf6ffc22937bff5750db97a371c68fb3eddab0348c75735a636922215bab597d2772dae0da4ea65db6d3e7defd7104f9b716dc09f6fb5486d1c71eaf1345290e18dc8bd547ab9d0a39840eed599ba2d2933864364eba85d5b5f3a12a92ae33ff556ff581e63124903120a91d5813dd779f2cf11e06355a8a8bfcb47fbf9d3d3c11f50f5731ac4fcb3f2f9f92762a9510ee01484bea2319b0eb83b0562544961a76f5b6a5947652d4dbaa5583c3792a4ee803c976e9d2c1757424ffd40460c4c86124adccd43783d25051cb3d1bea0e2591c3db4c72123f5638a70939a52d6920f044da9b747189d5874c00923e637b32743e65db6b86bd0efefa67d191cb41062e9871378cf71b4b18c30a1a6ad10ce822b00452d80986bbea83e755977e45bb5e1548328454c29ece273bef88a3739cd9bd3d85d07b1e217c2e32daf1836f474bf6218d424e49d447a13c1217e2255337e8157a598baeee0329b823ea9d29bde78873cbf0be0253686d80ca4a5978354cbe32b1ef915f817a624d4d374a38babe84af0ef552b2e406b50bae97012b0de089b9134c23ca400b0e0c5cf6c70e83ca08c5602c056219dc4cfdec15f5e40ee2403debda22ff1dec255ece8b6945e32da148e1aa68dbe06e7651a0fcc4299d31418e274a57f0531345b9151c278982d30a8e5678c7a7ae82bcf82badaf6041ccf8e2df2bcddeb77fa114d5bcd041f944b06ca82c91bb3d91e808859aa127f4aa6a6c92481a74414e04fb881600a5fe22dcd222d4120d9a4bab264514f060761052ef8f2b723ccb82d102e73b344fdc8f37314a075477eac49c3d381cf6015b0d02eb37f16a290566c68f8b2930ce773868e1606e8a190469e6d1ee2ac095b960050be207d72e8a2a26dfcfb7b5df77011f7fc1d257f304755c60b62628aa619460f134e081b3d20e6a24e06b3be4ce7fcef31164b4dd78df04607e1f82d9819a1f40b6e0378f0e0539fb41115d00e3f3628b8d471737e0c6a1eb398643950df100fd186a80f50d00d694c068882e7e4570fed53972ab75b7fc25b2254af494e30088711d212ab1d123e995963911ef1464a5d10da4d1784824e353f0da86d99362aff8517ef4455634b8bd21f29cc9f7acd06054609e667c31df6a91747fa84718fcc528aa6e7ce427be15b906f8ff586de0e9c14170f36f974c27bb82382f366bb1f67e6eeeae473987f416779d5d11ad18c00ba0d6792863230adab59aa31464c9ad0148ae083a8079bd4511945cb1cbb8a7290ab5cf2b729911e4c77cead6f98f82ede9f876fc0c64b7922072a3fa67fc44cd4e82f0c03a99c36644bfc167d6cf1a776363e555b173d46310b257281db683d73d31815f5fc70dc0eb76338909004c7ac51abce1aec1fbc229b4b010ff35102b9afc307105ea56ace8ef6f25ecfa7c05c4e9b49729d123d0539f35aa8bfd2cb55c7ff936a6132327a092623a19355e296667d1f731e583860fee4471b873fe7984a6e4a7303b515482df1fbfc0bbd64c7fb4dc8e31358e5e69fc79074c2212073b21834a8342436d3604f4b1e99c0c9aa4e62dc3c203105e94b4b5deef06057047e3d0fc6788a23b7b034ac14fb8a89b36c2cf5f64e07772df3717a748c836378ff856e430314ec49f8d4411bd0c21445518873dca6b971968f21713260b7257e9b22434e2466bb51026daee753656c5e15330ff02154d240122c16cde00eceb6f81fc40c426385ab6cc522ab0f49cc6f4d10a59d01f49c55db168c0bca7f9311b7bdf881ad0552a6e3f333e69ace51aef89364f23a2850982c1bddd2c44d711a897767a675d985cd1f1aba7557062f70d1c8afa69131ccacd843d406b3a21809c886ceaf18a9d338c4af905af8f673613a2a62c0615a565bf49152b98c647c649453c73ac85ca32e489132c29801ab3ecc4280e2c924c10e36378e0e13ea372a954c86507d21e423e7652a528d71a6a0abc833c3f02e98ae950044705c765147cbef562bba2d9c66a9abff0337bd4e4231340e6298d407b17da1cf92753dad4bd8b9e8d68671ced529934480be1c252467bc720fb9de12f1e16e093104b1e5f080b6d178dd0e6c57c657175a7afad5e49a20d44c59d28505e77942f67e74e0b73af4bfcae508ad0ead7ac0d499d897a8c1080fe40a7970cde4230fa89730883dc5d16420b1fe2d6e6f42348e6e5d568d3ff74ec2e3cd98020fba10a2676ef399fbce121ce71d4b3225f7209bbc9adbbbccb3ddf6ffb31c729074817d0d65bf3294d6cb69dde2324bc9b971369a2a9e88dbf61b38a57391240d35ba2030e27ad6c5b65f0281380a70bffd50a78493312d517b868a2db2ce5c60b00e740a624d0d87381ba25c67654e1f92e008b169377c2b5f0a00ca5705cbe6907e74a9a46b3843ec3acdf1c9224e7b6cc4fbefe1ffffd2919fc6a00c8383649fa0ee8c43ea0a4320957d3e2e8010edd9949326477ebda1f7ccd9dddeaaec6236d7667300bdea321f5a2ff51d33e414deb3e0d2b11f5ab27891ad2bb442b56bfc98f6c3404e5b6987e88acdc413757074ef4eac0cbeb619efa7da730ad9edddc8f07fed3bb2438e33046240020669f2efee05ffe94f2b78714ae880307d8512a4866d8f60530d565944c0de5fb91c7d384bdddb41eb2f2663ab666e6826a66410c73c1d4ea559f134204e0b5d320b8ebea9d817ed22cc6f8dd044d376039824467c2cb684983ef6b3673ddb2e8d16487c0d488bf7241fb36fa8b1159d575fd6de68eb608a60b1aa795d5cd4f2a339494b649f5ac35f503ccdfceeceb88bb7ca0f790a2f66d91052ef01150398700747d3fa04b8e4e5dd55d60a2a1a2fe099c3a99642afaad6317d5bb41a14bc59d459a8480d865395a5c10bed4d87563405c70b87987e3b557243cdf3903c306ec3974a39119298687b2e21ea1818fd84af4405c5f2be6388dadbb4fa9e4cd30aebbbe81dbdba6d83720b8e6c9ff9a92ae255b18c90e4dd77cd18753dc3633ca862439325e7b6f32c12d0bff3e3940ef972beaaacdbadca5d12550bb812036e3e5f6e3994def36a7873d7a2d4ec1dd9d8a38c68cb376c19b77d0f26946357b33c3c2e92d753253205d396d39b2ff5454e4c9e0f51164d1fa32e39cf6385c9a54de9378757f3216d397fbbd508c5f9d11135ac628050dabb155c10f30f575656cb0d8cb3322b89e18fc271e40002d34d1a6c2da61e887fe5f1b8833180fa152d5cce920102ebfedb59314b760da771db161d262d66b870383798af90f22de34d137285e8f83dd00c4c45b149c9007fa05529cb124a371edf60407005e7dea98ca1795505031bf0176311f6dbb6cc2c8219c398ea171d4c1c4245a64a989f829ef2449fb5b8089e6d1e727e66c23ddfb6ce217541c505ad92e8c49f2cd81a79c8ae550cfbd1edf2a06ffcc8e5a1522b758e79f20be1cdd589cbeb381c760f7b60c1d7f3688d73cc02ecfd21e49690366db0785897adfb3bbe574f45e77594883876a7ad37f0d34ebbf092b58237805af3048683b6b101d785d4741f9006dbc448b146c438f765a472baa5633061247b1758e0b663f1945b79c83f0ed39b5273f4097eed042ae93eeb6dfb0f37c6ca92cc4b59289f0fe58fcc28966d66b22ea082572a3a492980218d0d71595ff4d7519eb76e1d6428a565ea06e5ff4049485fd1ad5e9ade58045db954fbf7884145111c7d7adc42ff479dbf9b8765417692191d55a034d08a1e6a6c196daf7ede2ddbfe91a49d6d453c902331308706c53a7bbf458902770aaedf85d5bb14f2845324c305d85805aa18c8259dc1176110207ffdff016762b601661c632b79e18c56855b18f80566c230344ef09ebe4246acbb4a00bc4a6f12ee49725b862fd675420e023c93f2c0a68f370b5327c51031db926187d072f40a204b8736554b7c0fea6315458ca92dcb2d07d40b114b37f28e3c78a682fea332fa7131136f3a53e3b2e2701127e1695a0ac0a62ba4b6decf425de0cec097dacd19df35161334fbb97077aea56d9b586530f650d5d09dee7874fe6305cc32e36663402cba6f7815c015a01787a2d5c63a99e8cc380669ec7b651921b6064bbe37d040051e1118928aa1875b1b0dbc9c79d817363053a7873fbdc9db54128c29ee4745d11e402ec0761715b87ca2ce3eff076f783b2103375d62ddd2b1cf2b927acd3ad88cedc7ca258d5619761079706843a13f5a102ef76f33a744f850a7e69e285f96ed93adf3a61240a57b9d8104893fa28a175366ffe4e8dcd8877de2c28e050f4c3c37efb114f26c0434754a06791e66ad6ab833d8fdbd03d74b3d88741582eae510f1c8204a8c8357f3514ba661d4f1f56898a4b956a6480ae6a5128a22c04136a396d2afbffd8a6d8eb8d2b37ee2ddf7a4e912dc592ed7a2ba33b0a7dbd51679664626f44a4c520e7cfa2298b8a70ae3ab39d0250c1c30cc0d2f9484805b6293822ce95e897225c72751c75fd4304956781e5ca0a203d5dd3a87ae52edc7c1009f346365cce6de71dda78f5817c6a304dd8dd9f5b4ffca910fa5c7cf312f4817497822b0aedd914e0faea0faffbdc9255747ef03c6b7bdb7b63f1734ba7c1fa423fdae91f6096a69b6dc226eb99b6c6cd16254b028581388d0c1515d585dc4bb764f1d523e496b0c188d42de90b1ae04eec49f7f23670a21257b734ebc5a32fe3442edf1868541288bff763a561e45ca4c5a3bd21cd630e579fe3d08c90ed04e10d6349652ee8178232a524c149110f0f5641ab40623e3f374883f10e95f733565077eadf7c83e576c4d13337048d51a5c9c84a2a8de0ac1b1c41ead4c7ff99f12ae7b5798e5941b9fe16d3a3f1c5e34203bd1caf832e3a249de6f3bbb1c9611ceb38a892a397fd6c46753ef935d0382d264d943e4ac2538a13b3ec494733f98171533315a2936774aa229c5bac82209d3034ae5eb938b1d3f50c8325668d6df67f17403b029001b350435b65d175d338627f690f29d3459f97a1c563b309e9d9f2430bf2a077a8f67e762ca60a067cc9227b878da7c622476d0c692c5cf2baed0bc378ea405dad01a770c4fdca6bc555a9017b9bd4eb69cb7c3297e5b9519c9c4149ff3590b78097ca66f6f3a67c3d6d111f4c43b5e7fcf960a13f6cfcdfb19f01f17be7d7340df96e690daeffc91c3ec03d414b87240f2ab3f5d37e401587d449dc2b71adc094948f8dc671f662daa6af501870ddf609436653a8e6e85226d075cbd997012f060777c7c114f42a2a4d4d8469022185e3e41ab2dca0bf4f8e04d2a08c4b15ac1d84b954fb2a7bc86d68562065e1bba75f2ab8e83a2ee41a60d6be5b4cd958e2f9bf63897996b9b43a98523d9b70dcc69aeede0e9619efba9ac6905a9d54f87b65cfbcb8436869f61146260de5a6cbaa4125782de8848f41eb8ffa2eb0d218cff7c7608cdc9fc7bbaed1e252263f461c7b72a579c15113bc437bc49e604f5f610e25515d8fe81329f6bcceb315468d3ca8c66db471748f40542f05f2012d08846d5cb63a28bdd6cf4ddfe1093c4b8986623aced7348cdb3986b9f29ce60776b6d79f8de76a031ff3280a6b7ad1cdcd8d4322dd0199651e68b1b06fc371a46954a6205560569c0b5fe806fe243771198c6b0e5be0cd85fd0a4af29348ab23c16ca5673e570b5fd65cff91446db12974d70580bb180053a42d961e6d848082233e4f95eabe100a5e172b95c3bf1f9c54d3ef3a98b14c688df82377b927554ce6fca04895981b06a9054770e323fcb38f9978b3ac7a20a974b871c883f5aec536dd5d80047e54ab69bc162cc3b86656924c9f59307c411e59cf555beec575a012fba0d94dc669ec1252a9d60b01d15977e9bb3675c26cbca2fd5a60243a9d6a16648a5b6ef1b49ee35ee110b1e4463b496439caa356e5ceb44ce878c8366d6df97d8f179115317050c3a3021e4397292feb2b496e21343e1d3913b70fbb6d797bd727085879828a8d4530b2f0e04a061eb342a1d63cb1d94335b7fe1348229416988e82826db19f22e5a4d644446dd4cb34b522bf8293f4548d0955f7161500ffae461c181bc8784785dd367c7e890783a286ecb454489616049496fbc89d6a3e4a51235bd631a35eedb83fa5a8ed651d4801237596a349fc15517340f44e45630274c38477224e6fed242a8646a2fb5fe79f7392a5614585e7f864355bbc059472914e8ac2d1e06db10b22f36e425274a0938f4d69439c377e4696a4ad77a38778d83bac53b9d14a0d484d9546183a8a52340a0857282c61a4f403332e0f2a044b3a24cfa2be9be232664857f9646063ddec3bba4bfa73b638e7901ade35b27e563daaff24e028fed2ebd547dce914ddc6a75641445e37f20a83428b9705e98055041952aa13875f9f9d0a9b01fab3cdfc7267469591ea0369fb4c739121ae5b405c9476f27575869d0b127fdc2dd9f65b307f7df1174816f411049a025b9557301e19a7039d69d932a2a927ab26b7437ec29ecf603b25741b39d0c4a743b085a11701bd4ed4dcf4cb32fc71dc7daf91304b4e3d1eb9457400a70eb9cf1ad0ba32ddd9eabde4b98c1860ff437edb7bef2df79632a59402470940094d096077f7be942df7eb21db93fc916166103b1e0db2142850e5e7aeb02d4cb8b52a7f3f0ede51710fbcca2fbc40ed15a10758b5bfd06b34a12117693048498806596acc9f710fa6b3f38ecc846850870e1d0df2c7705b69ab9a79e15209b7256caccabfa2460f3b8ed2e131fc3628624fbcd3208ecc7114b77d2875aeef96b1bf1fe257ba51fb2bf50ba9ed956c7ca190ba5fe3b76f3fabca3f84f6f7e5d3b3adbca0cacf36d8802a3fbf0e476d2cdee9d3c69b50e5f76ffb41421b06a6b29b80be54adc503ca5b4b2b41f4c199610c0974874c0cc7b46cc254cd0b49757d7c3e2a3fa1e7214d3d4f448131f53cc1051c1e495092fb704ec8393c4854391f7db01f5ed5d89f14501c3aac5383c957b221ff921fdf7c417a601deea8a4a74fddf7f3923e611c03f5690ad1e0f7771ef778dc24caec9b1fdf34d84a1a5ce2d3e0a86e5ec8446af306cd492989f40f82a18cd7e801479fb86a9ac7685cb2e11f6b8ff8c590e12f05aa2fd070839aeca8000f7fec5fc8ecf06f7da8000f1d39d820100c670de76a063162d735eab8f1c2300b4c2fc3b64222cd34f842600e44b9320dad3140b0b1f7678fbf1d1a9c69b0ff86cee946f6b751c7f8d7eca3591b681928bf8733c6c79e3b6c4e2189292851af77ccfb2f7e2a6c1b83ca2128cfc9c363fc657c6829be90ba83460c1e42a4ba3e345126c68cfce40b600a4950a1f237a90a600a494c2196f885800df610349c9546880ea921a794d054cf9e75e70cf3b13e75f617a92386615f383daa04cad5356cc6488b51bba17dfc8e1aa9665e0fff18721d613f3fcecd83e9988edd15526e41ee6e5c373e10c68a710dc62d4c8fcb9a404bf385d4a973b33537bd928df9dd775fd8fd0422be7c0cc48f9db7b133f3fcee37ef6cdcbfeb3eede7f4686ced3e7633ba76dff4cb0b696cedf143fc30105f7a67e33cff7acef3f123ca17aa5cb90993a0ba752b7f251b51763692eb93afaf8b689af3b0dffad45d370f856c9ad795eb5318021174aac4bf35fbcddb5ee3ad33bcfa5c18fc99972d0cfee9611ec7d810dbc2842b545dc74904adc067876a1070876a903e85a010a0ece1bfe6476ffe0a0e0a74a5b53262a471e9f9e0e8cd2f74f9b5aac16e2422918adb53fc261ad04a7b722d4afb4ef3286965857636234a0aa54aaac29596aba4124a47d248e59735d8d3cb9d95113f42a1f2c7d5caf0f71adc982410a46a63fafb650f16b52c5ce609a971912e9d8d54d2604b95ecd94a3f46fcd468dfca504de609a911a180ae44f1a4ff4a6b65ca509fb6da4f77fa84a451d90a953ead131208d51ed24e48b0861a529dda5c8e939b14d4901aa94d53b53f3a92dacf52a8ed48faa4a4f9dbc546f911139599b5269547ac1534d45e696d8c11954739957788891656e5e629c3a2a8875b5de96cb89b31ea3866766ed3bcd639c118706a36149ce6b514c630c4aa66bb81d3bc02942108ac9a2d05a77df6d927c407746ab46f5e7f655ebc7e6545f1b1ce865ff384d46cdb28fef3f7bb68903fdca138aa41cb132dad853163c709ea29a9625e6939ce8a8a04e4a985c15125ea6c227b74b6b867a5b53224a3478fd33c21355c777dcdc3537b04cd835a69adb4fa84031aff4282c6972badaeb329a18a1061b54215e3a649eb437ec04713527ac65d324e299bc832223cca8b7451c6dc46c8bdb3c1d702584e8e9b654becd58956e8ae29ae889a47b4e3b8853bc545c1b44be003eec2d13e5db2bbe17fbd96c9ce46fca2942b63471b39bb9cc0d43047208421c08422964f9f5ab149af80829eb0a054cf846afb97fd386a4e4a492f4873fa4bff66745df95f892851020ba45c9c0d1c6a0c6ad0d540c36c28fb9922a061f643ca86a0f854ce868af868517090acb6293a4b38d60d0fd0ca688988ac8c966a982f9af4862489f8489cfaf3f3f353453d2eea11f5887a443d50e2942825c628343e0651972529bf195d7d6a48ca38035a1953b21f8c0d341bea5328ea8922d4a730fba97d0a39284091f543da61c70d0f10b788f4349494911f97921395ac8c965919fefb31629d935212e93f5bad6161f44ca3b4540156872c0d4b809ed1570f1683221479d3a7ad2b9cd0d8aa610c923831c851d9f39076a84e4ecd8682b2a1a06c28281b0aca86826aff6622c518ed157e8a25547edce65e8a24b4042456ec8358a9d8d72d203ef601e1eaa51bdcc377fee01ab3212a9a913e6d6c7914b16e50757d5167b0f25c4d96a3b66692be82456a2432c4874ae58f531ae53db1d5279752a47a8fa3ba261dd31fa9d470ae7a6efc67480de7ca575512a9e15c799094ea23d670ae587156ff3a9fb90a02656779944631cb59dca8b21c359ff45c31eb499fb0da506afb37570d3e41e7aa3693983f4575afd8c6f8fb82cbeead70c21cbf6b4d2e4496cc9259a81584047c583024e009cced2e33112f4267b3cb417095aa627f47ce8488911a7223152b83b432c01ac4a3f26f06f8dbe36f55832b4a98bbdb638c1736316e4e307b815d204c83dbadc90b4def85dfd9701c735adcb62d6e9bf7c6dbde406773f746512844e5b0ca5f78811abf1f9d0161e39bbabf31d72fdc060eb57d2606496e518c85b1c58ec60eee1f948b5be4330b839f6914cd9061acec1c4bb039337f38f28ffb071bf3effe00fad8987763dcdde524b6fe6d6506f78c118d180ae13e7046949189cc9b64063d861ff4988e01ee4fd3eff1f3eb6968d51930e331fc331eb3bfc90b1bcd741d7fc338ee184083b9ee18d0beeeee2eb51adf460334b42a3f1a5a8ddf9c81e3a60425981eb33478614c0eeb6670ad593703ece516c5187f5b09b306acc74406acd3e8b6ebbaaee39ea2f87361f02f6f9a48fe8ceb93251b5a0d82abc42fdc40f54f88e4cc89cb87667d666664649814ce68f33faece064da552ceae03cd67033e5d6a996042846b3e1d87a3ea59a77dc8da873e9fbfb0f3dabd4894893aeeccc70aa7fda675dd0ab74d8fabd6893c1fdc0711825415fd8a154e68f7db67afcdd7b6ae0721b57bced3b8d6e96dcb5f9d9d0de698d7ef23e9d20df002a0510b11f1b503d368a5fd3ff40f1da7fa90cf73f9d08b00424f5099e543bff961c1367dd8545e3eec29a50f5b0a8b0f3b4a0bfe45f1ee434a114e57798cff17ced9e20b2765f185b4f4d597cff4a9f05e5ec57fde4d121f4170956afa128b7795a3dcc7635ac5c233fd0aefaa2a5638a1a677f997dfb2cee6c5f4d3f462faa48a97213b959fa7aef06265e1e994bc9abc5d182a5ebe6db0e46dedfae20df1f183d6131020f42254785b57785c597c252f8810a4aae93bf27d1b868954943c15bfc2dbba051d6bf6db6f9987fd57eeb1eee6bee96ddd98619d8df91528e1c051351c501e0d5e7fbd0b687fb8ac6dbd60f3b1ff0386bdd28d7decbb7add784545582ed2a819b2912a43d6217f4e4a49a47f1094c1584983521a6992a376788c7cc948269d24fa24f037082491aa94b5823255fae8d07040b967ba80ca5f1829a9e0851248c121e1509709126ca85a5d263620e2252091fcc811310075991cb1810d706a48bfcad6a001291870adcc1141d504be3062a886a423846a3849e0f55b7374aa267bea28ec310f67d65c3fbd9b21666aaec7993559f6cdbf3c0c08037ca1ee77a4145f88f5a9e9c0f51dc0e2297affc7ff70601fbf066c0df6c5963fd81626fc1ab03215d06572c40f931ad4237c6a20543b47a76ab05fc69935981fc1beeb69fc0a52e3f6f8d1357e40bceebbd4ed6e04a0ee77a403f114bdbd4a95ddad52a5e67a9a3e72fd760f4840cdb511caf6cddcdb3ebafea8524587f8a1ffb8b155aad46dff1f5db7ae1319824cecb82ee3b8661d1e0607ce4b02a415e055aa54fe5e642f1e06872ee6d0795b135738ce8bdd776d36a802e68a02268d5e8901a2ef5e87a8e3e84df7eb315b8da8a35bc3c2c271919d99bb9b998cd6d80ab6854932b9d6e636e6362fc96e5c5659324025e76dcdf47244de1c648901dd73afa3fb74ecaf70020d628756a80aa91152d35152ef86fbf5186d850f0d6287ead6ec16e0e2bcadd9bcad691986a0fac7abbb61808a61524a7fd9c59f7eb94b778fdd9cd825a3fbbb4fceb63049e26f8e98c30776fb3e3e077ac8975b85d439378ddb368ebb1b5ea54a9f22f6d9a67d105ca5625fc8f337ef662b4028e727378efbad6a5977c3a562493266d6a428fb8074a472b5ada3926039620e317a0e4ea552d9c71b1363ffacbe655e921823c718314f074e9220666a0fb00aa9c9fcbff026fb21920431537f788dbf5b802fec6808a91dc310c41b2ef55a80574f02a431779f52343f202d230b64dc22cbbacf36fce317f6fbf7f08f76bd32b62e8c6ec1b630523221a46eb2530057a9fcc5e658870de3a6e4ae30d0c8b5e5ca987f3d76bdc4ae777ee9915d24afeb9d460f8cb06d9fe2c61cf733f6b563f1fa1fb31240f64b2e02e90bc3be20bc5efe35d92280f8fbf92b7f3eb0ff316bf3b745ae5329308c42440982589550c492ea2fa47a4743488d3f3b057475205db1df26e79d8de8cd2e9aefdf2980f9041bf63b34d82fc0064dcf3ce3a44b0222481868483532d0190ce17c2003de05630c0a7b6807cdaaf6f300d42929bdc925414b39be1d1e53c351a51cd7cbbfbedda1c118ee6a26c7cc0e2927563f3b64a004478e28ac9fce210a946f401968f5e3aa19d018b4c4c2e8b8fae91947adab9a0594bfd05971573fd5a741d5fefcd4fe1a3d44564e54559ecea13f3ea18c042ac323b3d360bf0c0f8d0c6462346980d7788ec71c4143107c1155cd861d413a647053fb7d989c29cafaf0b37b356630e7fc687c6537e27a7183fdf574f431c6e7f8eb05b132d41be26b4829a07e4369e7d0effff990f547ac320d3648d31be828eafe853fe24791d09d93043258444aed7f11a3f691eb2fb9bc719bc0cc1459812f764822c3af3b27a5fcf20377bf170d36f88e82a9e98f30754edaa0fc10acce34ae4064c5fa8eaad0588622aa3a135b358accecb04026183af2dcc699ca19ab0eea1cfab7ce045c040d027bd55368185bddaa90c6565cc2c6f443a1f6c7b844eddf56452648bdfa5918ded39d818632317292e01d57a9a8d4fe11efb01125a6e6e9f9699e3e31cfc73bbda455cd1306caad42c2491606fbd72a9e061bc9c2e86f1e57b50d68e82a57398a739876112339b491f88086b34e4e3ab1dd248997fbca777e50a673e8bf86d07e7793131358676210057cb14305c1177ddad10b30c28086d4444767489182fcd47e216ebe66fec284ec9fb3bbb35ff2c22eecc2aecb2ff7ae8f9341444c68383732d07072ced076235b435e4c750efdb2091a766a1b03a591e5a8f8acd3a9c689387d0a3b9552d5febef121a71287e8dce0a42227e4a8c89ffb502a7eb19f8e38d98a49583a82e1489d43bf7bf40634dc9f1a2c49d090b60efd151336ae599820eb1efe10777777bf1f423841c36dd5184408c9a2340638b57f04c40fbe59e9eed29ff9e28b2f66969f104078417e887068c82c5694463d97c4c6359b18e8649d595b0767c8e44c4ca448833fa0fd9daa21eb94f8f7a34033330383a0dabfc3360161986b7086a673e8efa440fbc319251db34b66130a447af2503a66697a10a563b6dbb97004e8063ce10c0c48a61723f90b73243e4d7fe7d01fa7408fe07c4dfc4afe5bc3b536040d49201b41fbfd081820a91d92a0acbc6049ed8fa3da4f6a0873c3297f2cb06a5c88c90c88d41f5d351033161a509634b8751095ba95c61250fab44970c2a201254a9f4a34a044a9456676a801e424e7679de450699c3ead132252fe57e78028a0e18c4c9fae6b07a823045fecd0b02c7af41d8e0ae2317d751cc6f9a6614122494a3833333353e7d7a139c49dcde5d7a3800e35d8171268c8383755fec53a7d92bc33e4a81daca18e8791d8b82af6f18ec74458a748ab419c93911dd0feee1c8d0433ee9c736211c3e60da16543e4b68fd11de334ce99c3b089c5d7aeecaf9f73f2e4aedf6eceb804ce592efbb9b9fb17663f9110dd31c758734c032bb7d13427ddbeeb0b7da8375ad860a5868c48501c72fa552348833f3df0ff40f268aaec8d28fdff27fd6793dba6b99a3b19ff07d25f9d0dc7184dffff8f11b131e86f3fbd90abf349197fe1a4f13b8fc3de3f935c6693691976455a37edfb47d13b1b6d3ef69af6658cd9641767ccd8f54d798258a37f0411e2b34f02152975a9d44d821a5a75d7a329f10b89e102d1200648b547f641bcccfb41838706b1893588693f7060d8fc1fe6363d4c4e89c5c561aa9a17ee144a57744557744579a831b3df2cc6f923d60454a952854b361803a4da23ce08a9dcd9c4f8313c9fdc691b8c311aecd0ff07528d1fdd9311091ad223dbf3cf492929a5edf6557b0f671792ae9f4ce011ce2afa4252bd68bdb88b6e5fb115f2c1f5f9b9663eb88624ceb2797df7f5956e94ae1752af2fe4caa359e447552cea878ef1f7e7c13705a052fdc398eaa157fddd3d2ecbd234e8cf123f2e4706ab49c31f350a817993c9e4bec12ed0af733ef6937bd63c927f17e8d554e40a47911d233a8c735d3c846f96a5a34f1c394a1c4c182805b4a3412ef1cd10ce6990bfc43acc467234c83faadbd97cb82c15108e1c3a96a276c496cd2aa0daff0db2aa96604a334062ed21dd0334d6c7fd7b6cdb18d8b665b7c0c65cef326f3eb3bbbbbbbbcbbcbbeb4ad8dcfd223dc76e6208180f68ffd6ed1de3fa0e361ed015d990be0b83bf11ec604a5d24d465b20355dd301ed0d055335289546e6e867c3ba02107f5c9e74e1068385da5ed38ea7ace7980beb99a4f1aa5a93ca6fb143595a35c89a67225be247eaed27ce20b364a5a2c7edc2d02db9999dc61f9e01078746af6510946f4d40ce3927facf21a025de18472507423aa20258d9239aa3e65532577a411b963441ae9987e24d92777bce743b9e34a1aec6d9036c8bb2b775cfef5a1ab78705017907d943bd208cfcad81bd9c7f762b80d4e6f1bc496d8b01cd00cca12dabbf6ae5d81f2fb6398164443b036866198b66dbe3977cf971f3ffb17da63bf6905a8d86fda566cd3364d03c255fb5ef4e029780083c9255708dabeb7efeda1d06df002afeee645a9a8297440e5ef123404ebf5a0a3e6b7691eb7d63c59601accb47f21b3320a50af0765a7004f5e1fb77167a37ffb4d5698ba7d0b84ebf6bdf07af062a7e0c15e520b4aec54edbf6ad9f69a767536daae54641fb2641f66331e93f18c77bfbeaefd3633b332ba66ef038f03649f6559966559966559f6dbd96c1fd860263f046bf633d9775ff673fb2ddb9e3f1a5fb5edf9f76d58d3b4dfb4ecebb12d276c2417905e80614e74a6822506029ba6651c98da765d97a44075f96bd8b2dddde6ae3260bbbbbbbbbbebbb3b272a3ee831fcb9fbba636df076f728a5740c7b678ecdee2ee375c5c6769743aa7dc0b94c0acd2a4b91522856590abd2a4ba1b2b2141a2b4ba13e3d40fddba5d01f2ea5d0ae3c02ca2fa5504e4aa15b39f6c4bceb86eeeed714ca72f73d8ee8c865264ac99befeeeeeec699188d541a1a7fa075d8dd700395d402196c661a868941db386f0d73153bf429e939904dca728302de6b9205422a132e23664dcb8e18a18897c7ea28c080020c5efd0630dc0086cbebea29c090020c17090c2aae0b2c8cfe511704571e0ba33f08cd508021bba16bd9a1b172fc5c5a4637a4c0fef236128ace06f6f10b3fecfde98f3a1bd8fbbb6024152d5e192e2d2b4adcf49189f999c94ca3ee468fd1c8a5a5648a994b314cec721a59b4da753384f40c130b6e5706f6fbb3550079e52a57c94496f26977830235be543989b1232eadae8858bcbca0e8381544a82427b3a8ecbbef546ab214b813af1a6ccd0be24780708245458c27800754ef8d91ef9d8dd780cc7a651b239fa580b16c8cfc96ff4d40c6d831c6187935ecfa21664df61be3d5846cc26bf47aa8f193034713abe8ed3033c3034d133e1e43a60919ff9ae8cdc103f5fa38c618b70cc51533ed3312e909126f2838913b7f21ebe0080d3056c1e887d1c4ae28671c95fdca544e712ac5442c8a577ca47e4e605794be7a56b9a378c53f0da6dc79d53f29e93fb59ab1d54e0dc1dc4daca050a1f841a66973aec466672c356d53c192b1b6f106dc8e22c80e0dedd00eedd0a8ee0b5914b3f8486da601c90554057532112c6661346049979b24f2879835da15ebe5556007eb071e425e2f2f070e1f7404f5e5f140e3f55063879919cd1b825493e407109b03d6bcad89e4b735b1b359d1c2cd2223b2f3fb96659a077a47de63c640f9c3e795b1cfcb897e64623c15a31f46d9c42ec975feda7b32acd22676c9d889a28c5757c5cc76d418558ee299b158c562152b00356415cb511dd8987e110815d11ae21ded0b4283216ed12e0cadb2101bd10ae72b0345dddfb42dd3443937dc40880e80d005160f157cf044074c2819d500c7cad836714109430c5943116660030b87253c416128620624f0026b8147896c758825a8ddcd82ae387868d4e6b0820f9a1084223fb042ab2666a1c6fff8609fb81a5fa64ff163f4c9255e27a0ae8336825a77567a724a39b729a7ecce66621826fd270fce91a1232dee6c624783ebae1298d82055934da1fdda0a68f6db4520fbac0aed6c68ded65c39a0e19cf2e3baa33167c8c77ee588a6a8cc81cf4cf6fd52c751daf7cb9d6f3fb0412984e6518f91fdbd687076472e2768085609ca29d48384262e238250e5fb9046613e3d2ba38594b01c49901b5979111f27d29a79020947b88cf0e9849004fdf8b45aa14cf59189e1e3a88e4857e4a733b2ea900429612d11f2697539a14cf5918921e325f7191a1e3f78d82168a5ec8f7c8ff25ff878cf27589ba33f1ceeef9f4307efae56479ff6ebdddd6fc33c1d387234d8bbc2a1233a8e1c3a643c870ef7665d4d6c0b43fb293737e7ccbfbc50fbebfa4874a4fd7e987dfff585999cb10be3cab4baf16edbd351a3b60fa663fc3b80a1e08abe82f803e330dc9561870ec686d070593bfc0937a66918b65d97b65dd7966ddb36b52d9bdba66513bbdc3d8e8139eef7c78ca021a93679c2dfdcd8a3939fe3dddde79d73e5ce52669641f247fa34b80a4972d5270f25d0933e79288124509f56eec81d9264f56cbc7dd36378c8e1187f38d8f7f7e8e79bcf2fe6cf27fb7b86e371aac19b063df36ca6fac4b51bfb74d4a0c1d160576075d33c76b44cf5c4373c84c5fa1d6fea53ffd504fa93844dc20cd661a4e482898fc518e36b1fc3185d732d6e8c32c618637f33e0cbd0eef6d1e1438c1c37536286e17aa2294167838e0df1a73e27a52760c1c4d819f0651a5ce168d2a4094bcf5797f9c921e3439fc29f1a2e7599f0e8d49056f781a3e6c472b02460414a4e95bf1941c3595f244e9ffabf7b248e64a208288dc27270b01ebf51613cd80ea6b3898eb0822a3b2398e87216867cf67aa8f0e85c9fc86761c8efb080b1a8588ea3b8281d235f8ace942a25952a6577a3aab21bd2536588f954f9712cd1132a3fd472581606b7547e8981da2f2fba30f833506995bf49aef2298ab64645aa34e2a40d46586d00420d77a89254a513364ca9214c951fb957728eb06282c2dfdd3f550b31babbfb35fee6eea69436edeeee9e91c9d1f3a397a0f2e9c0d1604b0968c8b1f4502058417ee01805512a85fc050fa730f3f6bafa3fe4cf6283ae69dae7af7de16aedf1f5d568d0bf418f6609b4dfbd4feeeffe3178a4d490aec4b0e22bd47dd3cad81a9d1dfbc6b0ac09588d39b1b931fdd826bd1a343c7cddcec68eca57d3f0d0a708f68033610c1ec24824064f500d4991b5b9bb6f8c33bef27335f6a2f6f2e82b9cbc4fcad3c9b67d8a75ebeeeef62682493d88fbc302342459c317c83005680d6c05355461c3e185900842a287b431132464504bb55b092b311e19411215f598ed7eba856dfb04e4aa3df61700dba27e39acdbb20e57aaee839f6d7bd23eccb2acb3de3e9b736ed97396fd66af79a190293b9b8c26aa2a3fdc7254b4fcc2ae0826346f5807ed8709209f44c284eabcf1ba22d4db94f4683facc3b68325c0b6aaf2371cd5d603f9a46e46d7950f6342a3a3ba1ca1da350bea93940ea54f1e451de0e57745ba9dce489f40ce7140f09f44a2d47970706674dd36d5a664ebc171d40654e586b335a91267eb8a31a19c26a409695234eee11eedbb9c4680cf18ce79721cb5519a33e7cbdf563c5fb05fe4610b7613a07f53396adb987eb911c1a5f6a6a2f1b5cb5942e7f7e7f4a93bc0cb4fa18486470ef0d967cf9f8fd811e9d3763a550e8093579713dbbb9c01446f1e8014715fc946acdcc7ca7d9bd732bca6d231da47f9001e2fe918f998c74ddae31f066a50765d8ea3b8c763e44f12fbe729e46f4a1ae53c1ea3e2ba510d375595ef3cdd0df7f854797d5d4e95cf895a319a71a4b06d67f3f25bd69a2d1ed2b766a96572e18580ba70e12531fd7efbad08a777366c7a9a668f6bb6ed967171dbb891c8568b884ef3ccd93c8da479e6cfe66924f2894501e1260f0847b54a3e26659445a0db60bc49fd35278a37c6b4a60f2515d387a3367d780d91d7f7f2897fd93b7dea9f320d5404e155443572e954d3875791abb3f9de04b2173ff36870690667fc5ec8d5343f98064d4fd31bb68c999e337943b225a7f850ed2fc9327d2b7bd945df7f8d836a229168665acbc4e2e571b00ed7cb6f8003f684b918c18ce668f4d835615c98b4392925b59ac7a7f409abadf9262f34c51b2ee2c4544c5d3857cea523a95c432e2257eabaa9d1a7f0fa1a5d0bec8a29eceb1a5c592b94c573e1d1d69cb1d5ea717d5f83226950beaacae6e1c178688b57f12b422eeaecf469c5cb8f3c71489fba2255462355e654498425b698f3695a73ceaf060fd727a34896118cc7512e5e7e6bcad0fff5309e6f2b2dd6a7060f8da4791cd53a1ca70c55f92dbe8ff5fb421054ec3dcf851a94d231293edcd6929ee9b592d67154f37ceb609f4f699e29b54b73f996979964f1a5d2fc648bc587b2155bbc6c11d1e9138b222412e977491f3d5383f223bde0f018f993d2160b15bf220ddd942191a8d5a76eca90887b93c9dbaa82e4f9e0e6e150c8960f2cf37c44975695dfa2e1902b34d15b6ff626c1d54b8354aedf22cbaf7cf4bf7ef36dfba687728fd3cefd9be14f9f7e117bc7963013d7939ae027380df5fac5e2af78ebc5066564b00df3628340b83c37fa4d7b14fe237f176f318f976c0b0b0fe95b3696183aeeb383692c329aa6844cc5de9dc7b66d9ce34f7fc3304dc6283f40f149841265e5a7898f48c49472cef5d7f3a0cf7ff9dc36aec5e3250d5e2fe328f6f198eb9f44a2574f1168d8388da44f427ebdcb5fdf44ba489f8cf409fb15ed99d527fa2d7fe5d4eb3d6c9d7a5d5f6cf07a170f636d5f38bb4f67e563f94252dd16c4588edac5fec22e0c7bea4e9f7e0b46b11516f71d2d5fc84fbf170d62df833f1e0d7e1568f0fa0e7b1117a54ff3af4b847dc82c66ad8c9b3e61ddef76effef9d0e0f534bdd2ddbc44dcc3e21e284b5ae1ae9ae4fcf4296422ccbafeb43262d6d6eb81f0bfdc775c11c7b56a55d72fdb6fbb3147e93657fb707f6aac8caedbff10a44ffedbdbd87efb5d28804bd46ddba8d46d6edbb287c4a7ae94ba4c94785237eee6948afde64da28fcc159bafbde6c73abf300415fb626b7b9ae626cb8889123e359ca9db87fb33d3a790eed0a7a7f91aff2447c58de1e7e636bfd0b435f753b76faed1e0f694f473afef6b60bffdf60bb35d4bb6ed6c5870cb85b1a39ef4f15ac1da53cb875dfaf0aa2baadb52f78615bcf9f290a300f04ffa75140e3ffa75970780c71bc3c21c5ea92a6567336a29bdbcf45e0e5da9eb66e3df520c81863c84613cc4541a9491a3c743ccdf0c0e5948e5d1f31053e913e939b2d0065bc07423180fe63792d7f2db965e76d53eb3c3fa6c93fd59a05d790c994c09168adf0b50d358084ac5bee5378e93f22746c126505cc52731284289ac1865fe34f1e9ba88612dd8b77c40b8c607b10f8685841a942fb12f0740b5e54b7f618e955ebc7789309248f48ee0f0301eced7e010ae0fd33063b10b7b2afdcb87b209ef432986ff503e7172f9509aa1ca11e93422bdfc96d28be7bde7e2ed82387844b08f8e7ef4246fa8f23725b644fd034c2d05c1f5e581c4daf241acd496962f7d40b8be7c617cec7bd120d8f2c13428392e4512947f087499e460495d26395052b78ee3183fba57ac91dff342ae5ec496d6ffddffe8d1c962fa6592032917e52167b1108e3ecd91fbaa699ca63d6fabc91b35d8e2dff3c155a84f5b77aa7cd217ced1175297ef63aab25a3c5e10fb921717e47ff1e682fc9ec72dc8ff1e5d90dfc51b2dc80fe3913686792fec69da06fb5a7c4b16da20912aff08cca764c714a524d27f08b6608ea58f4f1b25592f1f9f7bee6c58fcb30e2f2fff5b19fcf25decc97b392b0a2a03c5efa278ef05f370f060bcf8e2ad7052f2e20de8b65cd89037e9135663c90b4bfff2ecfdabeaf75f379164f1100f499664ad564371157370e2879d8aef1e49b0a08c44c454a441e74417344e5441a7e208faca914c2c2aa670641331473e1175641a2e22f21af2614c61a43e852f4f6a50f6f8c135be7c2990a0a9178f2babc565b57a7959bdbcbcbcbcacbc55145e3cef5ffe5d9a6f9071ca8be74b1a94ef79eed3608cffe2f5f0de07d7164c90ac5c160718009c62ca5100f89c4522e1f0a5603e960e0e8509203fecea0bba7867390adb18172e5e0ea5a82e5c54170ea57efd9cd7b0a0fc2a0b8575e02126807ce9822115b4aa14aa520d0b437ee859a8321ae9d346116caa081c23aacc794175f17d18917cefe2431e7a799a7e19a188a9988a3792eb8a718cdd03fb460d7adf36e87d8bef07577ff2a5408212e9d3bf84f914d8475f795f38e5c378bea463e4bbf0fca741f99fe7402db19b717d0ad983d4a0fc1f5c471ec5598e62a1cde56514e9d1fb58bd2f04417d79ef6950f254d287db431ac7eb9b06250fb5f86660f5e5f3260dca98ea13f6cef218f92d2fa37779675d2f5f38a5e9577821d715d827590dca7fd36f1f4a9664ad0c697a39e987b4aa50f1bb2a689a85176fbc88d3a0bc3a96a3de63e44f1a3fd317530dca177d18534df0b3faa4f13bb3641429b43218c8fcd256159e0f267921497e0a2fe46ef0583eb0eaf98823c9aaf25dbc70d41253a48de167f9e81752a622afe33c3a6a30ce1ae5d703f369d1347e600303032e0c5e1834baaed8ac38028d0d6ebe1c856d577a92a8b16d8c3146f9b10a71661f04a61ea8642dd655412d15cd0000002000a314000028100a070463d1603c9e0bb3f80114000d839e4a745a9b89c32cc7510a19648c3160c8000080008060044840007c2f9d51056e5634599f5b72acb5dc99baee6ec9bc6490ab4c9dd8e61060a620f196311adba79d2fcd24fc25212a55f10ea33403f91a090d1028b284cb2aba747e31c17f532e685972836cfe52f497218b2728aee28d6791af87f0f714ec7647dbc93d0e4f0ad20e785f4cd94406d4f5d3b3f1d7b48cf131f370e0735cc0a28837b13b8c121e287aba46a8bab1efaa208572ec62350f64eb3d8dfed23dcd851248af28ce0f4f7d47a240b648dbd6b132bc808cd5b9da67d5dc3d3846227803d4c2dfd06c890194dc9940e273158984678646eb9262f737f046211802d24ca9996163f030df7dd17710ee56d1498e9868f273cf005beae7f32201f90af8dfd867a5a503c8cdd84ff2eb68f958fe42e7a676c10ce940b6caf9bfd05a0cd72d76fde78cb31f8baed7c792e5a50976539526975a07c2b1d61cf09333b514df400205f0faa7f5f0800014aef6081a904dbb88a194c3e63087a16373dc66c408db3a5405dc445e6dd72e9b34ff98f39c3ac46cdb714922eb73f2bb59aca25261764aee5fb9256187a257c0ae1afc723a6cbcc240b243a24919d933c8c5dc716e62f82a272e68395d77ace4838b636680908f048a17602f730217aec1db7b7f7dedc26ca2ec4e76e370566dff1ca25df0f17e1eac9462efdd685c234311a32f4259acdd435996b604c67e83395d58b3235d9fe8becc4a3f6f5a47b95898ebbc3cbc31874a32ab2943851f7237e50f4a7f5835877c75518413e5b24f0590e5528111afa36875d8fa2314bfd84be064a55106e150185c327b7e7f0b94bcc26906c83632265a3b14654eb58094777bce4b8dde90d39250557de773df0ecf363c3fcc11ed543d907aac151d501e55f78962f63c2cf819e250ad28c31041613ab120df04b3448ddb8b6c13e3a7d3c5a8e54b30dfdabd0e8f0c44c0a051c7ef040db1c1d534e45ad9194d9be058afe1cc048eb0691979d8131471cfeb7bf8500e3a46d4e3d8b543ff952a96d4a053113f8596672627eb989d08670c11a633942c0f33bcbc8a0b6a390e412c1561ec8e194f4a17cd6831734dc60aa5fba6c869490a06b78d77c26bc071054aaab96881661045cdcb0744bd753819a2455445ba0133adaa64a0a529ab953fc7118550198ab4297971997b04767a0334a005891a846ba3c7f1a3b8d955d61a164e98312e6967dea3cb07aefdd47b953435b12b03669f7580667d361d7f9c6c2d4c44bec4af738e9d32d9181f0e084559673e402e25326b0b0f4ade32354a71e4d8272f24e7570b1193fc696105749ba70c4d240008c27d140a9f5a38a2993eade4287b6370eb46ccab79df54ec0e6d0ab0e8c36a5c599f06df6d32e7e5b9bc83797aef933bc8cc8b648fb74ff1d9117732534b632223a9c50baade78f285c1b9b8d7df97e90c7a10b21a1442f0062d04c9ecee65c2c7c1a5ad01b26b52fa560099a8199e64cb8f7d99d911e78c601f6432487f1c7be6e94158b29eee076d1de41c409e82d5195f429de739f1e27a73065e624cd4d7852b4b42ea85f5c4ed49ef6fb162ca3fe909d57c7362185ab44b7d2785ac29a3ad276a1581a04645f6ba47ad60bd2044e46f16138072688fb8c0a6b5530a19b713ccb8af327d61e4bc52fe0520238e06f300316f3aa4911a4e9e61c3a600660b6577677754430cf7301f0b97b3c9a6f4efa48bdb053dc609c8aacb6dfcf5be19032734486111490de101ff8611a6b75ca7e8ddb44a488899e3a53b85430e15bb605fe42d5b2ad0056ff6efd7ac0533df5c49b13df62add9fd1f09e7c6e78c0e2c8d03a8d081e85f6f5073b8c99020fd0d0b17df06253817eefcd9698b80d052caf0c56489d8d729b169586e906ffe8170c11925c21299ce3abba9f38d33c6844adf3d8ad45ba76bcaf2754f82ef8f5dda5edc584049a39cf1d5a1bcdabc1ea02c9e4d93db292c2da9382f36f096bf8dee98482c1d8c0953393cbed5be83487abcf1e5f13bc402840e98c7b7a8b41d2dad2afcbe6d88cafd725183a04cb6949266b7f314d02119c89db07f3db5b2c381b62b24d7b07aed6024332f1f26b52752e02c5e6262bc087d728062f142df0c13cc1096aa6dcbf2101da06ee58f4b7c5f63f9c9df2e3bc4cea9fd1459a46f5f285c4bc34bd54b8c434d7af3981d0d1eb0e769da4a1362179684f44d9c70f59ad06deb1d7e5db94b0f56ed5dd3277f681da1ce330bb9df88067c0f2885b07e54a596a791943475c1b634e659ab32612a8b204c6b16c8cb33011057c9491ab02ce4083fb43952d747efcfa36bac85f5b0c99b41e40b71667cf7bfef6041ec459e92a649ae742a6bcea678803c14753848a412b8e05c5358ffef9f99f70ded12f242751f1f1d8846644ba8a814486165cd221a84f8870b436a45b2abb80aa8ce3649d1ad3d8d5bdb5bef1704c17aa6bf5aac2beb449d06ba7b355970c01e7cc80037f856cff0a80b3cbc0071a5cfb57f295e7c7240a5a0aadcca002067dceff1656fc2f6ebceb1e1626c33c7f44b2cf43bdeec726775d53e4f17ef9b5b0a8d2aefd949099b9d0c056b451f3b8c3d468463e074a0241e52ff9104f2c90582e8a6880d7f18493fe6822fd9232d2fa4c4dee0c1d4013eefeaef0e33e20ef7bcbb62735dfc193d8f83dcf85cb665f0fb818019b11fa887d3972d3f8bb457fa561fe96f72b5ac0068b3914220c4eb927eec2da7e3e16c8c0a77f9e8c96615137a043346944a6b7e9d6217bd15aeb8b11c849acef96db1739783c1827d74d6efd8d0d36c508393dfa4154aac7c547f5da22d9b7e91ec2415da3a8088f80f815f0766950847c2f07e8d520aa7d695e2f17610fd84120b9c36a50941422f27cd882cc82351f68ab80d2e8f0710e30daeee4de7ebc43772541e67d308e5c13ea0f488089abd4280aaf2c9ec41316893ce91c872c48627048aa4868f3413a1baa6d4dc3804874f88e3566ddf49a7dfff137db2e0ae67d61d954d9e62adc1d58d3b3b869560ea62624c8aa389afcc0a3f41527106152b18c3e59c4bb0ed90fe9b8359028c89a802caaedf2ed371c3da853ac60750cb51d59190879058c95273307c4e05c103b48017780c57ef1c1cacb6f105d6325c16755d127f356ea0b20230335dd158c3ad19ab42ecc5712487ca180687c2f0c341c1184b9e621c1d3f6d2055e8159b922e2472e0d9265e6f5fe943c69614ace3cc670d70d48113bac07be4c0438594f048a38d0bb49b0cbe7ed0d7f503c53ca8c17c441343c2f410ab1ad5655bd380612e129a924e4b567f449572121ce74264492500222f28e7579de7fdb16cebcd908b52d8a69395012244a550386d65beaccc202a60c208e020cc42db0eb5b32a4a04c2b6a39c1af08bef110f6606791392dcb28a6e322cca85eba07f19eda617cbc44eaec8bdd8d9b5d4fc682605ce124c2d1a6f8a4db7fe7fb6564a870db054b98252556f73d41768a9445e2df8e0040a881e263763a1a80235ec7e9bb086b592034fd7186a9c009aa48e90547e4bb004b31a624e6cec708f44f9057da108ee90934c5972652fdd58d68192d3adf06a8909cacdf493e6c1c21dd149810b94331e16a87afbd798519c37d61974db59fa76c5c1d5d12821d91351af5ae6c0949cc3545b8aca38ef366aead5925dfb34e40833fcb623d9be545a03a0f18c081d6ce0294ef9c1d2c874b4af994330388c60f1e4158e900bc00c3ffb77b2d80c013091379e868dd9bfa32715c6bfee402256ee0503244e512e17f97d276caa77789e091a24d6af96dee771f5a35b0aea3ecb67135fadf42dbae7a99fe844089dc334bbdc1a178a92f0343af693c99ae8af2ca74c2ab162fac42c4aaacce146a6c905e17b855d0e33c02e591aff2773fd98b51719e793b8d3a53e04f5e446455f8af745e56df7359cbd5d945fc55812cbb2a988c54484f7741318b86d2cff07758432781253e5cb31d51b188b3bc8b376c44a3a459be18dafcd116b3976f68eeb24a403f4892847b8a4ee7c1ab7877e54120fa6f105957c1b43650eb33470a20ed87f5544081378a6295f32f7a6d4813e90758c6b454818b445efed278d5c9c6b8faf024c936ab8af30f896611f921a5b1cfc4d0938bf55410a9652d67c1538e675932c4bc4d4a6b472830de15a35e6ba72adcb6e5e27d2a6e95b90cf1b6b3134607914608ef32fd75d36c062c05b142f378136c0ac5c49ecfa47b10ce68e5979ad4fcea1fb168b7678662ecc28b735618de1fd8dd8aade87b15e34c2c4781ef8d7f3746e9b231bdb056eea34e06c4b958c27fc39b6551c0dc6c1a60151663eb6171b6c530dbcb9140f81c9d618e03ea6f4c032fa2b2f1fddef22b907f6ce2e1631d054e982fc1da5e1e0e6520fd7c882362d41c77631f0a430abfded8dec8ad479b1b6f8d9198374a02ec0fabb991f64d446125c1951d0b13f38ee762c79e547ce08c450fce0da21c4bdd9c53e3ea12171e0d2610520bf07e6d9b33683771a8fbb5361aa541f052fb1efa15b2ad05ea64fe29d716b3693859ee57bb55c4eba5c1e2f63eaafe840c70503376c7e7b49202ea0eb69dd1fd7ebb36e3d0f6da1d10069c7d9fa6c68a219069b5d4fbd9d6cf5e0f5baa7d4a886193dcf5d8cdde24f2262bd96ab0009f2f4df3e824a56f6e53b757eb4d4105f4000f20d3ccac8327d7483657df9051394fcef35b71e741c69dcd130c52fa5d2df6bf76fdbeaec6021b08a607d2b9896cac44ea35e930ac7292d02837bc49345c659e23e45a5e1e4a98a176e890cf42a2f7bad19fa4a5a6aa08a11f2eb43fe16dc6429e64f0fb2f742503937f0d654cda72f87ae72df7ba7b00be8ca907c71b68326497c5fceee1fadd64cfed1f240925b69ce5902a3812684d32202146a36fe65559fcf8cce07a3061d033bb0a54b71b1a7b05cabc2638db2c43eaf56921f47c33f9f064fc5d763a37ccc141a4e43e6440f9b69a9028f7f2713d344ea847d7b7de6786fc0c47afec14cafa4339d6542d3464f10230f513aae2401a7c45901ecf129bc050cd0f41137cb379af16a34135f191a88bcf3d8b7893af030e067f75c66a13194468f7379e5bc3f729a4a13a7ca7928d095a41a8221590a9cb196d67be18b88ab20505b96a0562c1292a404f0a6625cc0ee52f6e61fa838f46ce737a3eb3c575bf4cf594c714addf4108b4567b5e19f6b2ac8333909d40733400417a0c8efc88fc421d9d26dcd2ae806a9188734ea21efefc45558aee8e023d1b7b2e764712660e6852d8f60a8346a987ba322222e725050a30b8838494d9e8ad486216a686c12843038380e8c840f879289c9dac98c6bcf1c7cea3574c78d7f2a2029a33eab3fa70fdb2ba12fc2951f5c0e70637686c09bafb535ad580df4ee65f290a2c7b71e7833e6f90525c18b9296da0aee1e163b52f36db5eeeb01b1c748514629ca24479df7b95f609235682eec354470578518589add9bdee551520b828faaacb3ff52add9ac26faa7292f178b0ca3fdb7f36d2f490e15ee064a20df076f8e1008f80aaf4aa78e567fa6376ff56804a884d279fa98efe943b555f9a366eaafeaf50460fe81183b9a77fcb5ec3cff97ea7f472c63d28d8dd17d7ee5514a1714598b78352a80a50693577f822d1336268639e50be1b57f65fa15f98913ec1b105c4a54fa48311f7d7a2cba90b16c3347ae0f9dc3759480ac0961c3f9b060fdc4cd5e9db199e36ba3438bbad88f7483d8ce513551f867b448bd7d151ec614131293e3206c22eeaf84e0817f2e79e33a71351f03885bc82853535676c1da24d5f7006763c589eb156a3c9f777aa85ab0bf1529aebd65a48cb66e715453181fcfe8d094ef09233001fad51e6ce822cff691757f24b0bf125f92219a72e65862225c70875471e7438982454915ff866f3825f51f779a83641204390093435069c39bdff2239f4f0a9a1ce60752cdba94ef5085f96c5ed34dae364c72b086286ea6d0c8885b2a944236e2dd6d97a2834da5ad28f148ec22516f25d512560d5adbc305a128e9eedafde8060a6b93ed156cfe8e6f9d5ea8366c8c5fa2e8f07426b97b523dea0e85fce8998303308c1712600dfc8c1cb8680e2e9be2c648981f7426f112c7603cb65b70e313cf4b081dec33b8b3712077802d519827c695136cb9a781f6d75438832ad0721280ecf4c513ee92b0841c75388b90751a8d5099a0d7695399ea1a01a11a463ff0288f3bb9adf38c9c4d900a688dd7b9dbca041f215a0c1ae9623b450eed584bec723e7f9408385618221f8c260d57226f360a71eaf2c4dfd3630e5379872e55a0211280ccc1b820c1c82a184f915ee041177a74bf7af8ff862c77d46b37b2738cd7dd039a0e722ec065d0a9662dce7e92bc48b343a2621298c3dec904a03a1eaa59d43456ec55b1066d992e5c7e3e9c2396cdf76cbe6a68769d897f8a19b6a613278de8dd055eb97acdb0b58759dae5c700caec2f2b597b4919e17efe6f6b02e93ea3afdcbe884141977437ccf639de8a1b3e272af04b39b382e24dd67e17461013557474385db9cd6d324b51e00e19d110a08279449d1211dfc2b6d2323c91c97d831c4b1948a3324ffbc0d391c551e3499ca0c1218687ce84eae6e54b6f52a07803184dc40e84933ff7f0e4934898e69356432e46cf2d810664357a69581573e9997a1484e032b8c151230c355ca66c4668a096cd0dcbbabe54e0eb702df03452d603ecc1c8b223d16e84a8f15f274732652e640c9232341816c24f13657a2da87585a29ebb6382b762c3bd4222175e004fa841c093d386c8eb8d4a780109aac07ae36bfd155f93e801e8e74ec9fa78572c7712ca0040cf963816fdc87c1c442c0941ffb3a7f897d040132d4b91beee33dc977222fbd556571ecf50ca926a4d56efe769d397cd233700f1fa9f818fa5a3a59def569a9883d9435b11491fe5e56aaf23c087a23cf8e9c96d1c81840c46084b932d0010d0616a12b7e104ea63916ea22c6f7360e7fe2cca687cfc74d130ed161b3691c44d1fd80b7bd8e2e286419df544edf0a9c377bc187405ccaf4ede5ab045c602a2317934810ab02260d7343a37d2909a5e70d1e93b74ce0cf048fcb88ee6bc4033fe44eba50c9e2869034b2c01715293f6121a2ef984b3a9e197ddb81864bb7f5b340ebf28ada9da2d9d5760eb08d41496d370576a976199f6cd179e8630c9e342e0a446225f7703871ccd41a094ebe5da0ac50e0f14a06524ea04c2874b1110ab46fa985f4c618720d960251c7473a3bc60d283cac30f18921dadbef7594718695caa3eac23472b5dd7850704a9db8bfabbeaefc8c00cad1d225c5659074d00f1d33430ec0d1ab23f4f9f3ef2e4ff3bd0625bd736d054fb0a07098f16212ec43f9755d1f042df7e6526d5f004e163be9e5cdbcaf762ab83ec61861d34dcc6fa2ec82df9dcb7dce27d463d33c559f5182de994ec36e733fe007e8d468c44944ecd1a61607913724a11a460c832e2575bb0ab9dfc2151ada1654711d1ea4e23751f6d94708206020297e9dfc9117b2ce43c8c7e952fc5cd50cd3ccdfb259098fc5ef1e5c64d75ed03717ec1b59135afc5ac2d66fade5080f67ee77630e4972154fbdb02c462011741bbecb04122bb49da47aa01da49270fd37ddae2c1607d4ee7d5e63a2083f27a2da86078ca9e01d3b67239636f8b6e22ccec82343fd4809f0388f8747d1f7dfa143ccc8c38688b405eff02c7da4c6e375e26b3852131c1faf7f32c21a74d85c9a68d86bfe50a96e48c55e41073bc500ce16ed28f507fde744f42fd8ba5dfe44ed45975c79b9620a72f7f71de4c6ed6e08689d5f171b1c02787c9d190e5bb19ae41f9382ee46b9eb413f01b25f15e1ae3fcb8aae195f964887e220fc4a43d756e80599edead1ef8e30e267bc9ddfa8e46c53ab8878f0049d7c04cf543d05a60032dbe7fc3613f0b5d908399390d559ffe56c578e2e88ee6c16aa6303dc78b36dfdaa2ea1c92b6f7afbb1fbd154565490e644c29716cd14245c40bba1ec7a3927b77347b747f07dbdb799d9dbf903e895996b2a4baeb05addd18079188f70fefc3101015178e8928030ba173680e933152df037a06e16f10632b73f59e7fdf4aafaa4038e4c39ed074a84a9713a1b69af43ff649597e717e0bfbcc3fbad4e5c10f09f84af91fcbbcd35e0ff4479231114ffdb552e94879f59a04dc47639ada15cb9fd4cfda8af57a522a5970f01da6d3b1895be8d4616641d3735ce65112728f1f9955e6a9e24ef70093fc72f3283b66ffac09be15dc97520c9680f0018839866a26c5f83ca1a7a2f0697da190705d1813c2277efd0d621a7195bc42d9d1d54c035f12de752adcfb24824996bec71014369f77111c8c5171aecf288f843d9479969cc96b85cfb3a0f69e04daba750dadac888f89390d2b2277015aec8a842e1cb44ccfa9ac83c982854e7efa3901a80b91641dfee736812080a15db123d35fba4b0d2ee66e97d10f5e062af96dd455f79c63841fcf72aa85ad3a46a4bb96ebe60a8f2d54fe74da16af2e2e9ad6838478feacaa708a308794248ab66f2f1b7bdce98de130650be8f6dae3bc022b6210b0555a86259ed596e49e1d9f31c2230c2c0ceaaa9542a7aec0b1a1b5ce3736d38b30e2027b54f702a19848ef84814132efd7b973f6bc4381cf7085cd209c95e4f0d7713a4a5acd6fac0d574f7b9c7113e8fb3b01c237cbb007e61f12181496e792ccb9c4994db47200dcfd0fc3e1a05500d9c472601ea645072d6e7e1360b10be6f1565e5a398c9f12dc120652b929d0c562dadaabbd5d3c96f80977c86482f32b5b42361bf34941b30ca07e7658ca77d56f79435b430d390c67460d2b64239d2595172f45ccbece6f5091b3783b3f332047ff5111f1beba14d282d0c7cfc548723f75711c49e79dd1b01599d03819cdf3d20888f0c2c662fe2dba6e0214b29b0af4a3702c4dbbcd5c88a530b8c06aa6cc73aa06a0d7470d653c43d0bf3ef95862f9fcc0fbd1283c4f94aed61e9d8707c160bb0421b4802b1a1f993d62b7f88d0e98af64af17c1c0b50159f5e79ac7f6dac85561e9c5b71af8a1516c7a5ead6d37046fab9093f8d0152d6b02c7faa514d8559f505654e37e1edc550e43d82ecb3701f2753a531c6dc7ece2bf783891cee6a8d76879ad31736c2cfaf9a51c2029ce2075c37cf769441150ce1282da40c3a0b2688f09414a73f4f2de1dc74dd09681faf222f329f4c8b871f4d02556e11a20eb3eb1eebc96326b35fafa60b27b4cf0e75252432d19f5143b96f5ab980938c24398f0b2fdd3c7231ba73fe71d0340b399ea847089ed98b3b09838a820aa2e6c23aa9c28b1fb2cfa7c150010390a30214360ef32939b7a13d641e0719800d39bb6ff72ced2533b3fee322aa6c1dfa441a018646fe323e06a71ca2884909ee64a21f34a76002daa5dcb31e30e45338d055bb6cf367b65951a12a69f04ecc5095cc13b0f60c0ee1437001f175ef2fd5eb563a44150257b80ff2af10dbc915bde41fe04f7eaded96d6e3786211628f551288da64a0a5419f887e77028c6bd8a0c75fbe5367cefb2dfbb9ff0924ab2b2959947bad721147c94f6b52c2f552825cfecccd41e91142b913bba3dbfc31684a8811f76480651cf4684a5282f9a0c1b902c8f179f323e46617eec5fcb6381b751366d1a33d4c84bca12efc01e955f9c80c973f95ba4b85a9af3c11859dfad4e6a50e30f61ee1c794ca8a9aab6ecac8c663aa738de41c6ba744768fdf582ea8d6efbae43a7f898c5f90be3c98e4ebf28e24251fbfccb6cf273d85d274ee06f0c46027b48f239a58bd9e70e1b9270bda5a623683809a5df64e94f16710d0b8354deea5c3f81028763bffeda130d7a5a298e90838e53903d93f129a742eb3be99794b243abe6a84891a6f3e0fe4664c16fd051a15e5d5cf9a5e3e4b62d8af367f4e15d448bfe3894762f568d246f73ebc4745b11e5326e974bf51f35ad06efab1d09be7f608df6e7af2d65c7c392e1a53ebbeb89158c129ec814615241b88a1d399f8e4a3e826fbe77156318c86bfa94bdb4f553e911e20eee9a4e470ff14704ce341789e7f1d149300906c6a05edf425be19a61607267e4c1fe985f000db8774995b1f34f097d2b692b6b7e22f87a21982fc88fa9db4d1130e7940580fbf1475c18f5ad5aab2da4fd3031210a10658373b11c5e2ec6f16cf516a68c60a2a84e400e3c932f95151030999becccf81e1727f59a7925aa39428afb22e3daa68b82618c9ffde8a72dec83165a229abbb1af92bba80ee5de384f69d0ab493b5e3c35b79748314ac057a01a0f839f8214fb83f3950dffd092849f44b36319209c2ca61af4518df802a4d2a813e0a3e83f61479b6c7b0e67d5773d569a902a88323dcafe576aef4ca976b524d5151556279da178a73a625dc3812c9d7b8efff099858d625bd6110273516575be35ef72adbab12f0baaad8e93e2e199e66ea740864cc76b7d7f2a6f03fde53cadd888aa47222c9f431294096fd04775a35eab4f9b032b477d8f38139c009e8141a93fd2d157fa7720b8c941113c63b0e51688920e72ac46934221f88489fa32d287a9c986e4e967763547429a5b3e2137910c430aed04cd903f53a1842343ff5cc8a0e13e92abccccc605fafbbd9a4ade582613e9a2b1cc10052b19a54b8246829dbaa45ae0ab1cb1b706369a30724a682035628bcea06037e8aaf509d7c378dea29e7a2d43bfc913cb1be32590dbbeac296867a36a78bbec95e74880321a841f3f56635fdcd0ef7ffc360e82471a283985202f448a374a0aa31785b2922112df7b4c627fed9cea6bb990a05db7d7d8d6f8223f1cfa4d1a7080b7de3beb89d982b7f244c3122f9958c2b740a3aa3beba7772d79a79d8bc03b5e8c513692b831f6d61a6e9057732c27d34c5f98fd968cb823674d987795e7ed42aacb4ca5ba11afb7e930a26d932912f9cceea7ed1334e8562132d933540f73ecf0e6a3c3ef4c9cae303d218e82d21c14acd3842b0959a5508001a2cf8bd475f2d2e6c3de9f852addb9653513dce7fb895adc8cab072e2f587792918c884e01b70a47d4b9e6a8ff638b4c6909ad2a0b519e695eb434989925e120bc4e6988f351748aba592d2c11fe85b260d72856db35f2a42ca689d1d12c5474aec4d593667f2d2351046a3e20c840575da57a8e7d99f97520e0fda995128c32729e928a2706783b6ea746f4b355b798deacdd3353bc1884cf4f0184cec80359fd600aae2b73ab89b27abba1505b6d51c1b721e8d9b4f81bf5c42a377b0e341840fda8be131c016206a2618378cab5c420ff9ed9c109905143aa578a4c69404087c7cda98de09ea810be3e4e9a1ff1dd70f0c32438e0c17e4faef8295835de4067729841f0621138246226b6b4b38ad2707042fa09d003c16f2dcc9b77bea5f2a10e1b129ae7695720b58554a333193c70b4a100b90cde3902993f4856547cf655e7632c5b840a2e3ae12f4ea0a56f32421310ecbe1e0f1ed7c703cdde8042c0246995754d25ca8a116464108c98b10d8487c1873a24db4e6506c45afb88c5af09da3b82a7404e52580f7d83c075c0372aeb8250942206f9ab158f38c3f531d1cf9face70038da36d4da6db5a3799aef3dda088b488e8d159ca260284b800e520e2a0b209ecad1411be14fb43d86f61106e820db809f84f7599d22212289180a83c48e3a67f7b5ccc7de6aba5b6daa140ac5e50815a3d837652aaf7f2115b84e1faac44c806b82ec755a70e5381f58a4321b2c7b7b1a58f6c22cec718c4984ccd34d3144eaa92e85ca238ae3b7c95907508021433e416a20c8a3fb58df760476b02ee4dd1c01407b23d51b9dc9e379068f9f0881038c822d3ae31fc3361499069c396f92a336571aa66159c57f0f2e50356b6522bb612182bedb295c9eef1fbcd7db987a39da8a80dee4ee964f69b709b5d78f74ee19bf0d5ba7b61a61cffe0462b5a8dd5b1123082af915bf6111b0ea8215ddd962f3575ee7c001d6392d753941a93de749f8c63782100bbb35162b81b48053d174bbe96b36fcd832db8deebd5e600b0791f52cbc32ee3b723bda22dd0d104adb68759ab6e1d187dd9c1673556f30d342d87600b103634bec1e861b78c8a276d37bbacf97decaa7cec63961f4fdd7a6e60907e6e9f7e53989bbf419846a5a2382277bf2c08f99cbc796f899904bbebadd5797bcb1a263e033e6beabdad4c92c030ea39e44ed9a10485538137de0a0a5b5ba6fda444d6d4beae0acd58e1496f97d9ed812ac6f6dc89f128e5ab4198844b327a1684fe88d182dc2a10250edbea64382c71642258af5f2a70c250aac0a181696a1d6dc6974f8fbb7c45c188f43a5d23268cc356568a2b90479f611a8e5e043f5be9777bb84e66ce7ad00e9bb888e25382d950721ac982a065e97fd3a115ab1018824fcd9702c504a6b22f5124eb633baadcc58f7167927dcae96ade0e8fe3586c37425a04f4be9fde26bd9e2132093df2275e7834dafe21df54c624f2a1828cf44308e02cdb3145f6a38ab4e05bd4bbee8d7890a173ba481f0bed5ecb820990e25889e12efabc750cfd32f24913a63c6fa5899226928a53377ca2b7ed438e691f0db3cf342a3675102720d8678399c1cf9a05cfc92b2eef51a6ea7397470d971bb3e5ed7eb7a02d78d49ce27c43b5e93ec612b30fd569d952a2cb7537711e3a332a15833e96fa4212fb1dd9965f4574483cb7f28d030ae9919138976dc855672c19ece9efa2d309f5417aab6c922e8ba3451600f0d96f2afc8159c0f32ff0d6931ee86c5f5751269bc7287bc76c1a650c3b48c200d71903e74bb9defa3e53bf81e7eb7cbc9aaf836397c955e3850a186e7f0b6ab0be07fd0dcbf94a6f00bf13f16f61aa34ab6c87ba3ec6a0c3fa25a3b6eeefc3e19a99623f1b81bfcd087744ab7e3c26638c485789d487ad2cd898e679bbe0aeaf6013a9d4aff7d7bb6fd49f9bc2529b407d6478facd9d7e0fec0d8cf9c0a60f8be6a2013e3256f3f357c3620c6e35c1e69b9d87283158a8194a471118ee3259e20b63381ec45fe22d37a234554043633e0b6d222af2ab9a35a48a1b29dcf4edfe0e155b8c0250da7ba77624d0881bcc30dee663e1bee307ffe7ae9fc1b128204fca8d250cfd5a44c6e18e69d61984ae7b8d35cdf5893189cb00008b10692769bc9875832d68024210725d278f9406105d06e449dbcfa667a393268a94aa2cea1cdc544c0e894059a1a86b6af08a7254700c032cd71f85673d22728cd38d502aa0ffedeba2ce2f4ff4b803664fe413d41d51e743c62df7737603c5656d6848e88f49f9cc801658e5c62102368a63aa2a108e8c3fb98db355a5eedee94c75838cf0360cf9262674a06c4c814b5ead62bbe5131282f90fff6f62f4b90d320730254a0a360db745f19a4bba79f4be4e8213a33a563211169541cc12679646a23c5b2a7b26798098685e45f86cc18526117bb625e8aa3bec00b56240f821a562bc17d3abd9d9e7f4028862086a074ee332a1376180cf0b3be836d8eab3f7c0d48b63c9ab86b807533181888d03a14ec891f7ca014e0d0fe40d67b59801f2d7afc38c9ca454aa41abc1abeee40310087dfd2bda92104597bccb8e9e4212063dc64a81d7fbdc4c8c0af8133cc4abb4d27a41165d5ffcbfd5d615ce2c609b817c92bc242b8cc4f64234ad482444af04cfb8ab15ef420685f06657357107114e0439fac5f6495ff086f104241bc58ef8788e9afb752a4b82d8a627977108c75dea2cdb47275cda4e77c7022a00740e1b93e46e102554d37f16f9a1c421735830c05ed201c8ff1c4421b6188da9cd84c8c910b6309f24a2fa50448ea7fa4d6a9b3c9fc8a39db6dd24a50bb8fa9651decd4a7069a68d79c241fbdfb73516f4b7b642128183384511b16e2ee179494d60e95a2c29381b35c89109a8e363610ca03e93400e3f85caeae9efee3afcf4391934670a670a690bd13743299cc07446aa6e9f74620af819a15b108659db376f7b8349013db5dc8592aedef5d2b85ed6ab66c2959dfee10390aea6a49e36395380690b3aaaad958bfce3a321ae972f0a731204367bd8e69b8f8e815b93c85b1a1ea32c4b2d1891c199b6fc814e028e7fffa8faad2114507876a09bbf641cfd3b66af7e88e416bc3ee6cbb18151200ac425156b72f84671f1d50123d1fbc66b3f8a2e70200ed2894844b546047409926822ca79f1af4a9292fba164a8b19c34c2a3da7a43807f008eaefddd3254b7db2d48b33f4f9e9e47f6fd4dcd03b55d8a46093d474b13bfe43d92c7589bdf1a990e7e8b4b243133bef5e1b6022996a9a85f20a4ea24fccab6e522a9f7406139de5b67003e9f5bfc8a89d512f2dbdb3fa2160661599d3000b6bfce0a69fcd1224aefefe6313e2281b5081da9b21f3506869d1e5c2430cc3c69b98c5aa7f4694089efb030d57610dea7f4000328435c22733730c4599c9663f7671e453cf9d1f6ac1b5c2202cd57013f429df79aab7adfc2a8e82ce6b8587dbfc414e0056e73ebb7133d8eee195a5dc92d27c7a3e9a0bb9ad03d4ee8ac78758d4d4b4adbaaa5942ee2304333ab6d651b4e0e228be1583f3173a92f609a3c769f99d27b5d676196711dddf82bb4542d8f1a8c9e5c9a15445e15fdaee20341304a3d6bded31a1fbcbe74d261747ba5f831dd00f8707bac399e81c6da3fb0101f5741fa08a4c0e8721f0ba4d2177b8092d38f3c8cef56ea232b4c7ce8dd1908d6e063461e01a1f6cf0f88466a65f465e8285aaafbc304c7437e1d7f8b177aa10f7b2ccbc19a7b6d34021112fcd2e1c5a9e1020c1316e637921205583698b0388d11054117eb39ebd087b214410c6cd530aa4fbdceef1353ddff24018d7867c2d85121a6f3166a32e56d340225ae1685c7262a0cec70b790af447f8243cf80b0e064684ac092fc2c47aec0aba2c8b6d5a9c24c1db8ccf15d89aed47a7002a6a332439c47b6c17a5d829ff0a4e4d21e04563b2e07e8c7fc3b4b4dc7cbcace99e33e76972310136cf7a2f4b8cd42134e6aa45904b4388ea4313be9957c0134e1a4942fa482264659b948b5101ac371b061beebf531917cb892dcaf64c0cef28fd90218fba40a9eb68dbc39b8ccb9256f985706f40d4855249af220c8fddd80e404433feecd8fad33b8ef96def0a0eeb4546c6a55def1b65eda6e78cb0ad09a56dee02db9c5eef26873d854f6923fd81445a39e352ec74a17495b32ea4b1ba7edca3fbd8737fd6642fa34f2a977c13f97523766b852cdefd3e57be24b311796dfe7dae2bf61d86e34297c9efb0fd22e96da253c054682582f53da29cde6bd663a9b8a4564b5418bb344b5f38436c40d8a2570d4c571e472c57304e202e90c8e28bcc0c1dabcda7732426dc3ea34d3ab10f658180930fe066fa9edd46a096829803c56515a3ea2bb27e96a4975d89357b66ce4298b7e2d60f9317449fbff78416860f22965935101b14dffc41bffa31b39c5193a4060b432377461ea9250ed77018039790ccd1466b7015e34154f77485446de7a6ebdf414d57db28c1be1bedaa3c04523779da3d4f5ce7c7552face3998974590fbd581a6c7ae74705148520147c969c3181680166e59b18d07fb2098ad3a3ce89690548534bd747c7f741680e109257e27343a15be5e169b0a5f5c640515cd6c9563942835992a84a19c0360a2428d26bb23bed6792059cf8b9d3db9b010654e17666ca4573626f2fd11f4ef162ed51c72d4300029fac47d6dfce8c0c91a81f52865e8fcbb1232792303708203d68e63cb99a4873391a284301e4720da12ce9fbda4131f403ba5509ab6ad0e0302a7aa34de5fdb8538237000a00345524af5e248d5c844e6fb1834a4b7f4065f2ab48f79989c217b7f99c34c61a1d1cb2ec0308e74d7b11417ae180eed07f3c25dc52393867a97ec800fb63f6ef13eb8447ace3e656dd2a58ccafa7b97b145616cf1369776cd4cbed00efdc88f311919b8a1d00824f1a2d23671980d161ca969d1bf35d23417097a56a7a12c3b6277dfe804d27439dccaaa80a63b2b3a709009dd6402aa9723b000092a61fc4f070782e6e087c13e8c3e5a0a1677b9b8dc0b1e9acc59ab46552b7653c52f838ef05790c38ac3f7a36c5d8d994efb1047827fd62e45e0ee57868fe551546dd0504f236d72dc293c0370828bb2864f594a658155181ea85de9787f0ea1c5acd38d9d0e76b6b5c3c7c124479647aa6b0d37228b771d43313b32083f3e13308bb96f01791744170b6ee6b81dba85e05abf4bcb054c53cc6431671d73195a5b47464cde405dcc728a4d5454deffab733d6cc2a576113cfa6936b7665e49ed6ec34b00f531d89ac2a32ba8743c71980feecf9e25df3b08d6cd0a0628f03e655d9c288b9b03c09058033d3fddcdef39b473bc6b49a9d0839ccaad41270364c425563c3153c8fc2926714b9ccb4bdb0a7efc6e5cc031356f7998f660f196e9f85a45dc0b2071cbe30d0c5496f07c68835b2ad18e1b50f922c12139dbb72ebcee18bc1a5a435b02d861e7350036a93056ae266d172a7432435c82852e74b9bcdda916003aa03dda731051c240f81a9bc709b0dee28cbd27752a0d5b2add29747c1b82d0bc7aaa9cc14d41fd6a5b9466677df6c7bcb69c110c2c220e39919f63c974d4a006e7237cc5c0c3005864a6f57996a843253801ac5ac8d71701c2a335e8323c1b75b219f4d05f4ae26d69dd442adfee03e25547a53c95251bc6c289cddd88f1f2a474c84d1ec059b4c4f439fd0f5978efedb79b736975bb6a52096018f4e9b078a1dedc50c080504bac1a899cf741f381f520f8ae06e00b0420c59998e31dc8191a694c32a577b12bef529ab6deaa0174b58349f852b67d69ad947549aaa41fdd542b18e29fbd125ad1f0183873115264ebdd26ecee15a38d27b3b856ffdb0b124658e674e7d1b18ea53e756e82923057612a410613fea5dfd0f722fc099fede9290914c40cfff2de3efa30f3e1900f55062ce411abb572ddee6fcd346dfb4b061f8984f9903d2c2d40477f1bbefbc218f451035a0f041f1123aa4dbd38a7c84dccfb1423e4d5da182d3539cf3c9e94f43553c0da786762d5c0dd1135d9dcc9a525f06157be4fa3011a4d7ba303213eb352489301fc9b34fd5f12c3314b63b4e76bbb8a3f88d2b8a670081a9db137688d6bc6c662009bbee3cace7568ca4e6f0af4c6a7c69a899fa4f3fe8a6cce270468432831d6836a348ff767577c611c083cbf2f466bd7c18a2b3666afefed49a450087f903b5e0ada2c98abd2755e9e7c9e0b91c34c4f252c4e8a8514d58d0ed63391cabff9cc99c9c15ff1f754b56a394cb6f3e4ef84096a27a0c019663f48dac9b0e863650f2e1efcd6b4452860f9c821e1a3d79897fa9d6c6618be4c95517c42198bf77fbbd7817188161ec98fca697494f995301878752f1c17f357aa20902d66994c9b298ea703a39d556712fe1869ccbeb3cde66d1ce00f8a0abdf8140da477262a9fa546a9f92198f3e1a1f2e92418e5e621a7ef609f552334b76631506baa4c540dbede5a6a6cdfa4c14088d1fb86a2571d896ffcdcf4e80384b0eb5f4f0b2321edeb553cefca4dde2eb389977adb25f8c7ac1d8cd2abae1e466fa9b43de66d702e7d3bff0c6c30e0896cbd1ae9a9b3a2aed536ef4ec0bdfa690cfdfec0fa66a2217e56d0d2352c218a4a2b4f96a8107ee8cb18870a332fbf6cb31f2308dd7f0431058c34680394bdd1f3486b55754963c3066b024c08992a25688b2dec96545d36db8234574924e88f1c196af776a9dec302b8573865608b0daca80e25c44029fde815f543ef0d1f9bff0636a30cf72d62f4829e5dc6690c7c4d0a566360328bd853a14d6cfb1f8fe2f5d2a3c18c622bcf1bf9ef8966692886078e2dd025c766639f5750f661517ba7f373a227c12bf0c920bc4dee67595f055eb7d8355b9b7a6b8ff4fc7014336a5e10e1790a1d1db9f86694836d8440c94fe0439841b01daedbb9bb33eb7dbb51cfb315a15d8517fb6f4877148b3c5a92e543b6d28fbc831638c53ee644d480710f55fd033a3ac32fa97f87e40a1e97b7f299a173856e51cc990ff49b95ac80da5b623cffea28807c862837920e0ef79377e6860bf6f4392738e91b1603b1750b060c8772939565c6bdcfe9077ca153511ab28bba7f29ebbbc19c9f393f48270dc81ba68d5e2b23e4dee505d4d30e96dfe1f1ed02384765ce4e27168f3d58463e7974c807aef7aa897eea9871edcbf451a06fc771c5e28b25592fd2798c2197a1ef599c37d29e6572c5017f333aaff33a7178bda2b093c9c13556b362ad8e9dab37df53e3492925e6e3caa81b7fd07a62274bd3d70e192baf3b273402f76d732e1596de387abd82b0aae69e81e2e1cd46033cf138faa5ef6c632b7f26a213c86a652ae0b4a4e67a73f798a6cdff900cf18828db225481c8031c97fd5cd467ec2b2dead12f3cc66a4314f175bcd75a5debd1728da766ed36939ccce3276d5c615c3a22cda53a17310d7a3606a5b48db3d6e26090d76a138c1e67a27cead6ba6c905afa2fbe929b125ca3c416565c2e6ceac6b60724d02350176fc97718d1101673d01a6336d6e38c9f8b52714cc2524213d74c94b2ff7eed3851af1be683f11ecea6e05fe9c36789f4915c659bacb8120c4c32daa726639506c5b0cd23c8921669d0fae9010716e7d862e42df848e79f25018bbc2c7e73b5063ba7059f8d74a87bf57eb3b8a9e7ea31d195a54bddb6ba1b8e979f54ba29988fe93eec1607da50f198f4c328245c60d6c34140117c1861247a040e39c4eb9d582bb060a2884f4e66750a79d516382e9c644d6c26ebebc06fb62c817f73b0cb0e0ddd62776592bd4ade03c46855848cb19ccac8a747b6c14c701256e591e51f1935289def9756212dc0fa3ca265ed7997b45be745475004bf1b9fe68a674259580f8c86e64fa8fa0d01fa1e4bb239c492632727a5061ee65d8f21d2663909d3c6d21b8140bf121642c12839e6e12f8763afefd1badf81e14094f6861049d43c85847e9dfa4509600a61808bb76832cd4e70142c42b1781d3a0e39d9ed7662aa850d904811cb82fe9d68cc2cd02c1d42041990c958176d39ea82204fd06e6bc61ec2340f823f0e778c55ad40c2520985e1953509de311e6fa26e6eba209247f86ee5c57a1029a52e293d85e9d3b6f83d47eeff6778f21aaaaceff014f13a54befde39a6b7c9adadda285a8ebc9863e8a80086e59285536f0ab3834f88523a4adb697a5e0982c0f7e68af6e223c2a8343c0ad277c64c5c644561b46c59e126f3cb8a9d413257814def7d94abcc7e1d28423cf62407b58f174775fe98e8d4da8908c2420ab92fbe039c4fdf99623b313357faffbc36ac92d198e8ae29ed22ed29d326874d2ba448c162673b5897b645e62478d17d0574d0952599518abab3e46f8af2ce112f3240207fee34a7e5cb75e4da310bafb015adc297f57009f1ecd3915a98b9b5eb726a2030d8c99a592eb272b4100e792302f9339c39ed7c7d62718c96b959b7b14b35ea2d45edf1ea041a8124c5cc0735e53efdd2b2e8b4e9afceff953bc37139d87c645d8672c9d0a2e176df916d14b492a0b07d1f726409e69bcec0f8355ad6d79be2ec8e9559f9afcf48d688360d67e062f2e0922065437e4540042643568f448ecb38342d85cea515e6ce65ce00ce347c0a47267ebe8eeccdd4972a4707f3c5500114db3efc20d40322fe9c617159f31e497b0e9e6850a590dbaa8431b4e838fe9a70ee93c583e6c0763a6bdd9d330beb5c3c8f2b940b83462a8178233f0be533c20120edfca154417df3c3d1b3238e88fe8a0d71438f06631b85a894bc2c1215cc63d146682145dd07d9842e57286571efbb7e69126b6e00f96430baae0bf72ff9fb7ede072f32826744f4064884a43d9259fb0c9b8e05377c680327fac47a0048434374e5a365b12d26c988a45e3806be909382d234515506990b7145fbba2b4b9094715c7c455297d7d6b1c22f57b1d4d645e5f6324b12d5c05fbd6920182e97acc63e6cc001451d8753495f998a01d4d06f0043b78ed62f35ae13b52e17ccdc8e601fd3333867a4addc1eb4dbbec70793892fa7081291ebb55006bee9a2005849453b37e8c0dc77555281645a9d084b3d861c99278ec93b2a8eaed4d52ae31dff6cb7d81de834a3e3016b157759cbcf679df0d59d8b49c679bb2478ab6cb2460c283287f8bf44afbf8adfe53f86f1a76a5a713af8dc6cddf73fdd4fe0a038b0fd2792ad7f1120597647b5f456a4d2fd9ef71d79b0954cc3ee5a5d558b7a80ef937b57791b2e086e0f9358ea1012ad2e2410c2e8a8c19c3cfda8761dcf11f5329ac570d2ba7a0a34e60ed91f912699d551bea72a9110d5fbc8afcc54649a9896e18df2ae8cb55b532293ff06bb993c682295bf79e4505a7723f7846880d4cf51ad04f265ec6c1990746bb28deb667e5cd434488dc15a1b22748e8724e13c58e72be6288885db914c9c3fac41214975936bc75b1b080e1e40d8b489053e2422ba48af9ce415f9c28a2a8206429874c1b6cb4255be051b9f013b4e928a4d7ebd428d221605f92bb88d64a2f417dd85b1c154255dda2e074e6869138523b8331f261c128980ebc3cf6199236ee3b3b4c4c9b8168ba2de84c57ae39bff670fc2c09a6f28ddabcf02763f0990501ae20a5678ceba577bad7453a7b6e77d2018b29b4533520faaaaba128fd3c467b5562f6363aadfbdfd21deaac5c36d36cb1442816dd62cc9930cd2edd21a8e479b79d949a57de00413d6d834c7560f2621984f0ca548dc203817262aa60686a741ef362cbba4013d2aaaee0844b844f0c481becd807c6a3a0033b3e8652a903626b72ff83079b0e443d9bcb7db677d4707e9ee033a5a2a4e09f9a7aedb3b32498895262017be921e39156b08629a49d378c1ad16b10d891ca1cb31910d9e1e093c7ea4c8a456344770a4825b1367d782dc8bd9a17a20fc6d84530814a6378881d6e63983771ffe86246f8570df2a0808191c65f051b3e77f9ad92858e90c80edd4f838e603e1877aec24cf4a1d309b39878f3b6a3c58b066cccb78685baaf1e3781bcec2521f9cd5860fb5dae810c9c3d8417905fff80de3e572cc6920cd2cb8dc0e0877b81b6b8af6b4c3142fa9afb404516de310cc9777d85c52898cdcd319010cc506b3c3746fa7a43c2f59f4545f15c253464342cf2a85fd28ff1774688e72361337715f83777d53e887ce89d58a5be3e7f09c4779281f2c0246a65951d8eb96a11ee198834e575efa8ffbfc7e123920a725aaac51cbd238c94446edf751211508017284dfb8720dc5077a73961418132d4dc0572c5fc91f081cae5e5e2848aefa18b0ab97003eb1552bb6d9bc55dc8f3ff05a19bc13931465d50db0baa6a2058e8eb9718cce408348f865421d94d4e42a80d100606aac3a15c731e9589895f8e9d9707bfa321a347f1f8198ef27a4e8dafb679bd6305ad7045f67dc6989feb37453c2e1a2e69e8a41ccf6bd6aca780700e6c020903949d03d373b9dc84a9ecc6015d502a0838e36ae616f253aad0fde65864bc391ef736a6b522beaa6bb72de5618237d6ecfb2ffd1499b71ffc04d3ddda9f1578bbdbcea1309d2cdf39f1c5e9beaea8a21a2dbd315f589a321b6381da9384658294c4852711cc3d79dfdba6df5e1e5a39b997e0fb82b836296a572e92fac9de0f3c0f84766370c10cdb4c1bc010aa884b1e86479d30e9a94a19c24cf736b776895c551efa9b145f712ca47fe7071e72efa0f8ebbadd299b50c72c8c8568e1a96db689c11969e65e210e8461171a7911f338708fd49671788005032132b45b65d95ab47ac3367e19fa227e680384e77b9bab625ab627c0159a89842c561ad6ff910bfa464c6f4ff1b4d7c06dbc405b7e60a628dc43474830a6fd785ad95692eb4fad9938ce2006026f18bfb6c0178d8ed74c68f9709cc10e2c02109bb754f64971f5aee55381f72fe315044b95caee39b76fcbcc6a47849063d1f0ff5856d4420890e5e68cbe2fcbe15f4e6b31a88b842c5d8b9ca9a77cb873046da66f090978643b35a54d31ef35896e5355f840f99956a14325e8fdf1c91b6e1fe3b4f4e737638ea09a9135dbe2a0e786c161616b774e331220f48e4620aabf686834ee6868e3925052c33ef04eb8e47f2aa4ac4f5b4ffc96edf1769517df6909bccaee73f3484bd02290d593e38c11e2b4a9663437de85d850b48957f3cbea5cc4326aea0b78289201f4f8dd92a31afb65b2f67e3bc70d6cf9fde6870320d10662b9b07e36ad85bd93b468ecdcab55c476de504444b244b64111c781ad0825ab5757af6a62e6072e560f022130247966a31ef5a9a0915a5300f365e29f2eab824776e67a6a690a10e23982e5019ff5be7575cfd1a8a14dcecbfcbeb5eea75ade4c59e01b5205627df06e886b80dbd3d3b94967b3ee165149c7e1636f4f51154fd195203b279078110b89e5a39550cf5148ac79a42378546329a8bd6dd84761794592571bc64cb7bdc7eccd0aaea5f1794526434fadc0ff96bad622c92f6e2d951fb2b4fd8058fce2497271989f5bcc9a98bae417e4598a98a2f958614b3cb9b5e7a7c59c3505791e6ce5ef948fd195ab85c31fee812519965450d5b0b471fcd81911378e2711cd42f16ab9e38dca7cac51b2db5421c8833d5a891d4bd2103fce5096a95e8372bc8adcbca7b3ff82e6d665e88c14dd3b29da9aa7292b6addc7234754ba1f72b5d49e5cc5edd854a3d9a57b5505d4d596826b65ea62a42fb4b0b50bd932105f5a71d1a19105237eaee23645ff0e121bab6635c5c045a159adfd0f883004b09e152cc8feca5837c02baacb3bac4878adadb3ddad0853a50224c3076daa9fb96f8b3b48ad4648f2a21006c5532732932e10c5d58fccebfa80e6226a6749ddb8a17de0bbf28675156e2b57161ae4ac594ef58d43f7f221edb64fb3b9723d63b320b26af9875c1321a228fffe0b1db31bed3ac7501028bf5f7c0163a67363e8421b74559a4c32c85521235ca5e2ff2b2015bcf9d0210e3f02564a22362e8561eed487f5d482574146d0412ca635f5a684096f49184f9181b8131cab661b2dfeacac3c7df85a9c7dafd2a50901d3053f80e1cf17a113de67c2b1abd79b924adeff4831558ce167fb16fc81615bfa1764fd40944f75c9f730671e1cf7d05385fa0d0526dcecebb6fd7c5f695a7d1cbf522d594be07a6b53f13b8e5c7cd5b5b30daa0be8217685381f3d4872c036a74087c480c139089cd0b78d73cbdca8819771603c9ff49765de53a0b6d114e0fe626e4ae1bb43021e3075a876c1ebb1d5402d27e93090cc076a194fbb4ecafa69d5396a96e469784f73487ad758bd0591494ff7771179d7efdbd2e74b51a229eb45d929d5778707af1184eceacb3ad0bba905fe9fa9f53ce1273e4dc85644945c31833df1e571b93960c23c9c53d1d9caa80262e340adaf76bae26187e6f3559d2915849a81b9af8a3539d099e90b13b26317d942d3f4876a407e32aa244e00383800485cfb1ff224f039dddfdb668d9dee3b5c96162f63ad6efd30f0e44f03e8652a31b3d8296b927fe466959ec3c2e2b34635d05b50eb2fd9330729b87153962ec2dc3d833400fadcc708570a804e2a4da717604e6a6f53424b7b2fc6b081252ea91ec9b2a277a4124f208b71fd12026ce01c4e908cac440b7454fb532904388fba637d4ca45f9cf8669bb5d8e11c8cfe19a623601688b7f6fe6d92150fec951b80ffa2b6fb7b02a4bd995ea5e1376c21e94eac66082e50a42fb236a843967b0a79da5b6ce9b85b6b77bf73bef2eb2bf3734728cd2b010548668dccd48c9ee5b6ee16532c5c4526b8a26286b9509794d77cb9dfa4af98493f8a78535dd8a7cfa99e1cf1cda62c19ce026bd3f61813b796b95cced538c543b025a16e617526c118669fc5e2e34c139989a192fd130c653c74ada9641ac2fc24ffac25bd04516d5133c385bdb18427864ac284f7ea0e352ae1947733a6a9c0086c1b005527601d052dc0cfdd840a62c142b6d3f08447c3932e286b6724040523522630dec4bf960873efb513931cf1d883db529a9d802295dccc62385b92a7b3907793a52d502f83b1aeaa0414724811d50edff726a4d30a5fbb8351299952b4b3326ccc0094924d112a1181386c36955067e46e12e88412756c32ffe2a58a788cf8da162ca28e3114e8dcd0693ba16e3a43dbde04bbbfc3d105c78861bd96e7d5fc985f48c212babd94a946658ebb857e664cffc48ec77d3a3648ec28c780f551c6f9202741248bafbee1f1c883d88446218c670e7f7bea6cc9aa0b2c3207d5366766f2e4d404898558f71389541f06a6b8b0a000296b1c4ef6f26c0903ac2d14155c67fcd2a4fd90c943bf74d7fc11e1e1db9b0d769fd9ebc4e32f93bdc1e6759694f464e6683a3cd8ed16c13b56c81fe54042b0ffb722632be1da8b5ebb31a8ee042ea75f36900facc3e143c241d8c50023ebea7e0dfad52cbbd8dc5d061ff1af2c3ac0efce6294298319c92274833ee5d9dd72edd8194dd97b7abd4febefb93cb2bcbefb86a83376b79321fd05a7fa2001b9b0565e3bc0491d29074c59adda35365e31bb1cb1e2e0eb70a1c46f86e7d583742ae1d60df4b6451fb18170528e586b635c5aaa6991e2d07d9d3a80128f3d38335c081cb19cc609a81a13cddbbb44fd135063072fa35026189f80bacc32cd6efb71c039a8ab77c484db5dcfc7ebb139511c5e6c5644424be529341536acd300ab5510cddd1d36471aef6279eca02a01c0c4c41b46a8180f2c4d140a8c7adff686bbe8288352a1ffcd6c2b4c875e00a95b3732fd259efde7ce9fe131eedbb11f366576f1f68ac0ec7ca7f20c3b96bea4af8e199ec8c0b6825092536012791b446d63c7910a959cc14ca95b7e1f81c09af48ebb3e40fd52e4c088664cb51386dcbe90d3a280a716f1b3cf5585c3c82a14a8273b4c22c27536093d30fcbd0728eeeb7d9be80a21f0f2686804aec87661e99dc6fe01590aef5e810a6604f027c471fa8a46c02b451fa65945a60778fb1dd24d3bdc05c915456f4fb8c2bfeef5a4b9356ba231f0020214632265ed9a4ca6e68bfcae39be9ce60199f10c6b55361a9a2708840c3c4855c7f25abd6e6187f1f5e9bc246fa877bcb56452e6db867376cc5667cad6eeb84ded5b7ba8288150376349c46a06f8baaee57ab0e1bd6f6eaa1df9abe263b30cb3c7e1b744fdb8646bbef3bc31dd4560ee8e1a9a10fac44e1b15482b0fc273f22af07d6bbea8670fe5b3f593fab1b56870b4a5d8901ff0b6e7305599805103b919b1cade4c56e6dffe7da21b6ff4869f97d34b898f8c60b3ff9da28257b227c869a60a10a556e512342175b4f58fa4a8101fd2835f07d7e80e6f921bfd61397da7f1b5f0fc5f2cc976c1025e711fc92d707c2a91d5f9aa12a38f046e472e5c5b448b3ebe477003656999ebe7555f4068feceaa64cd55f22c275ba66ec38e52002b66f5a0d0c4ee8b94cdaa9a6c746f2076cac50604be7c230cb5d867d3757cab111deb05ed1c9144bbe2f1990263331820e2964ab0827e8b9aaa2797e74b1fc6a00835510ccd01c3b07d8d24df72fa90054258f20b764c3c24712796abf09ede4c66dd53392981a1e9516cf98253c9f9fc578e1806b1076386731ef151529988961dc0266b86ac16773ecea6bff64eb33c93d4aebb2d28c10cc7a83af43b0c9704c62a63641b1be5def597f4f15bf6478fe59e352eefa4dcdff2970371b1ee8246e3546eb77f4764f2f5a7a09e3d2403ac5d696ed30eed4827e1ee1e14db2f8bb972fc993709f0f63879b0bf45dc158e29c74dbfda0f0946b4287558677ef5a2a3dea05bb7e687980698a6e5629c31f0381957c529f2bc91d761358b3b1672e9474d2fc7e89c76dfacb2bf8f36e9f149602ad2d433e332eba93d630a5ea128188db80ebcc55c006e86d71eff8aa8c1e38150971465cad99c5123940a7a5c9be5531765e5d4368b02ef4ee9f173dd15f94e653edd0b208a033c6dec37298a9121efdaacfe4e896b6362f12e88ce77d482c442814439fde1caea88c0d39eb3c2573e018a8eba3779adf9c8641e63c1009c7f57652a706ae7aba373d8feea4bd4c2a4e3593a40ea159535c0b229754a338e69f163a8b187defdc84240f1a0e9c2ad63c54333b483c0c040c70c0c0eedf5e77a1e70240ba14902d79a855057d18b378f986fa90a810c1256988b53a04cf5b9a74e0ab5bf097ca295806e2162666590b842ad810fd374345b7a9cdfb6d92b5a49949574e549c83dd43219c05130ed98e356d428a0308a565cc7185a3dac1ea3df615da7eff637f1f62f6e72dae294fa9d0c499719431182d78e5f9784c3ca6196457d5eb3def0fdaa932759517a976f0f0e0ac04241c03aec895a22c6ddc1e37bebd1537fd45a1caee68e5dd59c551e4b6ad453ca17b92040637f79c3e74ccbca8c14d6c2a9c989157b95e0ac9c617f9dc9cf2589525b3de0f21ce12e9976a0ac6568d59eb5fc7d824d9b2855328aeb3f4468880019e3ba1c9c352ad47506118da5ce64b5e91f4d5f81baacbdfac3eb44f85657893cafc8c9669b93817d73aca887fae0cd14e2b87372a6e8b5464faae891c5212d102e58293177c4359aa2f6f92d2fa6e16254f36aab29609546cdf019731be11e554ba3de3390a545ed556fda788f92d93976895e170a30ad743a04b0ee04aa9d3ce543406f69de31bcdb4b42e4eaa1578a44a085e818dfda5940ef88d3d086a79d859baf5d18998f088a44510f095656f82192124f8030a13b520da9186363156f70cde1b65267f2068afdc22d2ba9e4f2116858c55b58b1ab47cd424b520869fd95e8ed87cc0c80abb57efa6ff078eb3bf33043adaa91c85efe3c3dfc3176d8535492005499491cd5f1baa9000d31afc7509c87c5cb5114721f4de152b64d43f68c3e5c83bee1b9328333a23bb3a766a65193f93d6dd40f23fbb3adaf2b08e1cb009b0881d1990d2c09ab6c5f87630daaf59c4ddde9d5c1d07f4f2905eeff24e9cc7ae37cf7c093ca3b56107e0f1bbbe8d3fd82bd4f452881d95b211b8654f3ea235380ebdec954dbc90e4436823a19cf134d8a649a2bd1a27144a2421f4ea1a0af3dea00cda7bc58aeef45ffceb1b2e6d81e2113a136771d90860a0cf870990b2e2337982ffb3d92b9fd379305e423a4836313c23e76ee21e3aa866a68f3697dc45115419746bda835f942175408fc3e09fb3ccb0dd2ca0196995290522814d02df4f578bc800774cc6b80610a3a7c53a7d85378a41eb246e8bca98990ff7f60c32d64c9c372dc224538a224e25e1ea7c85cb16c438500615f6ae3e5002c9cf343ada3d99a1327b38ce723e643c0fbdb534edb614480c3b9f9a75782f3976ae5db2ec2ce995a12cdd7e184d647912a15bbe7931088062bfb40131a2b30ce1deb0bd374822f83ae2ca4a3aa6f01563c8e96a180d4b2cddf65130418091f882a00004f277d1c11f34f6bc0ba6b6f734c0dcec8c3c22e740818b2efa26da1758785597312f7e6cf9f08891774aaa59a6af24aaaba816a23145edb362e56b73726b8267031210d100774dfafa27f8300540cef40fad748eb0fbc67dbf7fa84767eb57763e3db1c76cfee37ebd217d777b60e41b8f9fbd47565ae53fa20b65cd143c1ed8b05dc8b3379095c7c73a60e0d6dd3206c67f1e6dabfba3e446317328f0471376d686f954206ebc24a2ac7988351fac9e1b9e8cdf69d050605f7b41ea6ae13e47a89364e7a0dfbe4a03ff35c9e075759ae75685237b7eec213e45b934c60a98c84d3979c353723947133802933b82e98413e719e7930673c1b419cb3291583056c972980e8d538e31b42da9b4d2e4832a7761e5a4ed6fb47b94a506ce11e57c079d09668f15d06be6d0067d89a7921e03e0b9c5c5f8c107babcc24649170032356c8e9fed99db46287c2a945a2fab1e2872765a27be6280ee038418a3294d5d5274710d2bf2d3cd744fc7558e073d0ef9eb351f15ba494ce7f88f8433a019b7d4bdb131e309eaef129eb7e9cfedd19965c36ef3b303add486d2bceeacc0f3f8c0a409a02c2d8c380dd209257b87d9c37a767c75057efd4a58fd2c352e4f3d61c616a9268899e7ba5c66b78eae161dd52022d11f3cede7701be6d360a6871106a5cab04869f7c7ead40b711d40fd27247d47d2e3b544452f2bc57d0a2874ac672d37cec4d8f75a4ede71ea4e9b64ddacdb0f9a1e404e554cfc44bc92894d48cc0dda78024a06cc72330ae0260ae83a970fccd5ecdf0e118812222ffb7ebf10e3247fe6653a0d7dd063b6ef2619d06e2ed20245490bdd2591b25a487c89899d32cad3b732aa26885079a9df30965ca0b945b36acf5b964f45f8bd822354884d0304ce28499a70dc20fab89c442a2b131cf6fe33266d4a31c0b8d30faf9376665f632f8f71ec4e25e5637e006b9aaab385fe1aecd903b4dae19dec6ea0d93b467d25e7b25d56e4566edda8ff4bf572d27d67686d07282bdad6e4f8540978dc07aeb98f9479dd47bcbb3890631a0f33057212c16365a5a81ea8bae8f7a89db7a6c302ee81a3a8da20747d1526d288efdffd9eb10c2acf5f6b9b9f8fb36862c83f6f16d1b28cbac4f7ae5272705633fd03f33498514e6760ff32dcef1a85f9c37a582243751f30591c103006518ae25c7a6d0112f4a0d69f546172a5ee65583f14c1c74d787359d9c7419f53604d9fa3929989e6105789f1f255752820005ba586623296f3aa9c3a1e0d18cfec40b23a52a9d11f2021f327ce6da0087dc9819bd19e67cfd0fea8d8fbe5442d50eed5ce97cd3ebd56ed3813a2bac3668d05fda746ec2c8dad991471dec0b7d30a4344eb539bc700de052d2cfc0fcd47ca992d5b3f28688f45f2df15e9b293efdfe008b6336d342234a177f2c3dfb5c8b4781090f99490996532d658f64e0239b0010a2163e7cce3016932b30d8dbb0d8135b19b261c6a9359a58e8166a9f09616db506bc86d0184965e3640f533a4af4eb26bf6afbca890006844d63eb8e528c50412b92d87c4b8dbe49c94f7534f402c742ce548997c05a709b3a48312a636a0dd0e2c9a09849441506caa798c63e41a331866dbcaca449807d39c450debbc852d928fb7b2931255e53df4496bbc52d064618ecb642bd55e54d8f9b8e817559476febe42ee9ff65c6e9d98d778b01972a94e7534f6c5fca8913e3cfe3af718364353252d4148d9838ae6f69e5c59cbe5e05614bc6960b30142baefe9e76490199decc46eca160ad85b9d96ddf20b2ca546018e00d9a80c5d86045da7bc7f6349e6c388f738040f907fc0c4697294acdb7f7c01411bfc02f72dd236d99225cbf2a4344a6fa2d11d46a2866a54add624335c0a060c8d57c167a0fa373493c2d5a95fb2ba3d4ba5e6dff79050e502bba74c0c75543d146d9f80be2ffe9de44f4a2a2969951fd806aea6aaeb9ef0278de9cfb6c22be36b18ac5da8691ae05213bb062eaa43b0100adff51dfc0e712bfa07fc59f6e30f50756ee209413cef7604e1d815911c5ab5383ecceab74a7911a0d1df35b4d386411101f8a9e7b13853144f45cc23758aa943bb1d3db453d9fcd34bb609a1f028e1b00e50eea562ab613ebb6dc9cfb22bafc859d60ad6c836dc93ed17347ade25dcbdd394b1c0a46f1e9615f2d6ae234b53eb9304d626a298faf80f5e79f72af4b873526ebdc672be9a55dd7b4b7275febdc40edb307c1c719c73722d95d5d01941f8581d3e4de14c31232c2cdcfc152f6dc6152a5f27dd6944bef446d59dd462323796803af2a4331ecfb43a30b468a80f5059f31267c1687cbe50315059c6c106f4b0bbf01916ea0978cbe1501e7068e438526a7bfd0dc444565a0b00971547f83d9c8ffdbe773c2f21f7c68c877efcba7ed7c5e9af8af86e63bb95e547be5a2ae3b88c88c4154725ff9e3b51f91a2d77b756bcb9fb10979cee83d2866e18afce6e67e689e6eef9ae92a82d748f16a7012a3eb99ff7cf457997c07babea4b06f520a5d3e9e0d37f5fe96a25b3103e3cd6fd5623b86f09e4fb58976b61284b1d823d54e3449af933fc86fc52d71f7b293c5b416a1826ab595044adb356e11e9e77f2ff4bbc5f957e580c1670f4cf59c388e778d06c7c74079d609f2ba8f0ae6ef4474057cd3f0c7b568b4621cc411e2257d151fbdc19ad887ba65bacb586a4327edcf3c3a2181767192886f59f45b50857c027c9a709b663041231a650d48a9783ff339656951573833990e9c64b03c67733c2173dc7fc98b39cd1a2b4ccd49351f54d424c79a11cd146fd870e115b8949d9d486ac043be6306aeeda1ff3a87c66c8e133a5c7073b5333fc07b8f50974cae166c04004967b7f93d73d4bf9928342aba412142dcfefd1385731df822b6939a8ca894c313860a6c66d8c3ff85d7eecc88b7c84d1e15e3276865312d4ff3f86161ca4745a66485701a1c4d26c7aaa788de313f27c1c3118bddb14d8c3e8a873c284247339b7821f9b707fedc6cd76e1061b38f5b11c9c047a46dad36c8a5d3a877d0a161ec7048e09944f680b992af4aa220310ac2e5a7a0c78f7936e11448d01677f5973b508318466609177d6f2a22ba3354e6184b1404317a94419c53597316386dab74214eadabf9cced945a763d45333e5cb702d057bb6d9e07846d6a9c6755c6fc5713533ed4013829c4da717fad942af0c5039294113e9d9202545a10232e7f4efa3aff8bda4d67eb7bbe2fa1c1121eba58454e8bb99c4e7808d805363fb0a3bf2f69d4eab86eaea93de9588155512075ddb21aad4530512334cee73ffb5ef1f3d7bea2203f83f8eaa958064861d2fa0cce2f95a8cebfab6dc187e30f6331bd585b75729fc3d9a6182f46270915b7a55350177aa8e4a6386742235f028b2cf467ceb5b81efad3ae35e146ee72ade5c4b1d9fa3c9345c7df0dfb88272a4cb944b74951d16d95c2a088ec789f41f8f0f9bd9d744be0aa1855fc8b9e13f822ff1470c64d7a544df9eca5bb89126376c96a3197e23438eb8ed0d5e0e0d7e2d3ea15ca07ef61de8ca80a2900162b6a99790a5d0dd8d8a0d2efde3c6e30cf3a86923de2199d2ee34c5f7592d4975bf95abf6603fdd84c591ef716c03738e0ef4ff6f89ad2913ae440fa6c5a161fef60c6b23494f70ff006ca6ea78708767b3bca64700c2171347d50075fd89565116114231c523ca46eefa74771ca433a53085b4d7007c330062ee39d1f468f9d35afb391eeebaec2e768c81111561bcb82640117a92d00fb2262336b80b963c7bf2a0277eabcc58f8d7e1d6b33929329736233699ab8dcddbe9af8b16f048619962d7845259344ebedea84a097694f6c3057520aa6fb860b5624ecf687e9cb33bf9d96212ca054641d4cdaeffb3c6f74c8f67874475ccaf35ebe44a7fd664a55e207f22232b69409d6e3789e0aef5b5fc5459feb08a03875ca6f55d75a5255a62256512082bb2ee07488430975eaa8a86cb5d0e1d54088f97cb57a02767037c8ce217f0b9ddacded90528d1292dae5287270b9e1ddb8753006c350193d2ebb8fe1c2f7b9a103fecba7a8164c0220537a4345b88a6e6909c7c50ef8d7e1694d1ff484474e6c3a0e6a58d5c60de81dc8bf780bbc5f033602c1673db46de0a299955009937b5ce686db9273fd4bbd77c3c95406a0d2b90b45e2ba7b17f3d32742a301684d6c7b94689041dc96199dd7789d98c001a5a968dd15381b5b9676981195931c812d5a7a150313e78047d81e9989a0e95512d00c21e26e1d4c0064c9fd14d33bbaa8615d23049543f9dca4cb43d067cad208ac485ec121e305938077f0d9602f09b4cd9e39c824fe014233d91a5faa7fa3440b8a446ddfa5714c0157a979ad2fba1056c41b4da7a81634648c3cfb158ca10490a25e260b96d3f9c8c857e7220e781f2cb4201b76ef0c172691e25b70df7c79b811c2125d6e4aaa0189d980f34d8b8de673aa3e838d513da3f934ff85bb14b7e49f9ed4fa06a2f39a3cb959cba50a9a16ce8361c1339b4b501f063f218d30b0f27cca2ac2b66ae53dd7b972c6d7142d2be0923aa0e527cdb3de253657ea56ed44a0a20663d632e6d6c7633ac2ed80015bb4ffd931c9390da9a87c3a60f334f9cf7b6534b6a9f80b30da450e156857b6f45f2edd7832c29e60e60cb7040c6f863145da5912deb606ca1c76216a89fcc485233b7c4dbd6f8315524c6f7d2ac7d6a0bb395457f12a791f571a9b4b15e3afddbb661e21b5cf65fb0bf37e91fb768c8bcf98cb72aa1b0bd21fd8cbd0df7934a9886052a99e8d9eb9f68c31300edfed291905facd2e6b4c5d8a2297a6f654480034c3bde90815556d4b38af883ad7799d0adcbce05ee0164aa09e1635c3870aaec5f612858f33d913515b0dab5ae95d58410ae03c04cadd73d736b12ef65b21b828cefb41b59d9ef2f838ddc951885dff8453fe24894b8135d154ca63ceb3a1e9a2bedfcbc50f9fc220dbc76024ed5bda18cf088e2d2092faee12be84aad64207e7539d78eba2a89a1feffd794642b05b72c81f3a494524b3dd018b3a8ae1514a9792da5b13b8cb3167dfd946dca2262b313354776dfa2d2fd64829cf8df4c020c79f0885cd2c5cd4f20fe91f2aed6b44d09b9a6f6b7470961cfd11653fee84a65d86188a97a757a90f33892aeba46d02d9f0bd5d4658ecd8a1e2d3a8aa1a073af2cfd8887bfb2932dabd1d51d07f94f62da9d2fd0d2f1a207adacd8b4cd3279f0337b2f0ebfb3cb0bcba0c688ad7a8df98810c16b59377dfe8e4ff2b1004723a433baeba1686b2d750748ce8c9b3c94ffb07144524c698d3c90f09200776326b403fcabdddbc353870c4e5e83e8551d62ec632e1965e425970367b0de8bfe17f06d418f68717431b757397fa3a83fa5452866a1c0d8dae2095661bced14e135b0524b4a3b5516cee1b9e6da608f00ce9d37eff2806cae77c9a86b31a6663338842b2f038210417a18621fba875409a57eb1cf19266af46e69c69240c0a47a7cbbdddba49509a2cb2e6cda628825997e221c8e10249082dfb30e8742b893b0701a33ef5a2d45169e2d3c3e1c29206cbbd105e37d2877728d582257bcefdbab2e9bf39d811f3e9e4298a5810c59084c240a6083a924ca76805a39e5b2c7944bf7c812d5b9ef7a4d16bf71deb1fdccc5583ba07e5d8d81d6021b8930d82f666e93de8cb82b2b1ed1c9807acd408a5e868a80c32eea6882d7bbb2f07360f487d51d88cb334b576d7a826c667bf10092d3297c6f0254042686fbc61813e9524a55d67a850a9721573c0ea24022ee75d344fd2ff7212c9e98222c4e87c1f21e8f3fc0552da8cf5631e40ead704017f10984a3533ff019be0929c6e7fde15ae9a1c427b3b54e983cac16f6192370c5952492ceb081f20127d6869a58107c31d6fe55982064b6eb37a57043ef03c976ab2fa8e43c5887494b61585eb9d461690cfc9db84716d764575b254bc3559b7f53f24d695893e14f3223b96d9245f1ff27f95568b028406e490702314c5029a579a745c505a51493af908642f1c38aa151b37806ad1d1caa8ed16e05d21c1ef8a30369112f4d72028548e4e62af311445f4d39ddd29c2d783d89e3cbe8b04151b219d6a5bd494a1e19cfe214696ebff6385f26d2b898d1042c8267bef2df70e720729070907df01ba6c0dd0650e77f239745945da9b0274d912a0cbdc0066ec0d968fd165152b48a6cb36a6cb1c0e5d2605617918948f34593ea62edb5297b91b7c7cb0fc4b903459281bba6c05d065ae860e72e9202c2f6fa4c99a81d1651b802e732d37d60c967ff149534d491620690240972d0d5de658ba4c4a6179efb33374d97232749973b1d265155c4f9265479a688b2eab90ba2e93b8dbc9bfcb56b2e83297327750baac82a7ceb592265a2359e44fbaac425ad16512a7a2cb1c695a932e5b2e4597b9922e5fa3194ee2e68eb963e4da9142cae7fa8282466ee31177d95c4b5c3917eaba091204b644a08b04d7e99a09cac911ddc6dc670555ca47e69039604bb43741d0c941ad56b025866ee34c0bb228b035f664677878608b8f1656aa54dff40d6c89da6d9c61281f3b3a395040015ba23563b5c0b2b16aac532a751b63a92f00ad543c78c0961c247c3b3ab106b6dcc6b59eea0cea4db5a9354fdc802d51154510d04a06ae3a4df0f97656604bbc56b0455e01b2c863a71b601b408101cb2d6079cb088de76dd3b5922cf23986853b583e9b30bc46f242e6da8930e40b8cc9b3bbedb56a1ab3ebe68ac0f557f15e2b181c2f7fede41a707cc666b0ec28e10e1096360cc1c564098e6a2f30a60780216c0243d8936f808981e1b33659828bcf145b400cc2091f44f8f1e3c78f1f3f7efcf8f1e3870f1f3e7cf8f8beeffbbeeffbbeeff3e1c3870f1f353798c11ceedf628283edb948d28d1ff359436882b0ada6e10969c0f7228cd957428f428f7ed2493d3c9508c2d276673bdb032eca1738464b09ee64078a61be4123765d631c1ac0d1e2fc02cfd749bb786a6f081168024db935bd0e5d7bdbe158b6b4ad03ce17982e89c81cde4697b8d77c96e348a47b265913a34ba1cb969356cb5e58a66d21114e34777036425292c284a462c5094a0a0b955ffbe3ac85b6ed98e1026f3adaa32b714593286b39ae7280cb5127f6e84c064de6c69464a1e76e54c51e71472787035cce4ea72ee568938c4e9693e5d45aab0caf9586caf25a6badde6b85a97fadb55695d76aaadd6badb5ded75aaa28afb5d67af25a6fa82c5e6bad35e5b5be54d26badb59abc561bea8ad75a6b55f15a0550495e6bad75e4b5d65053bcd65a6bc96b75a9a3d75a6bc55e2b8cfac8a3561d01a8b5d65a5b6a9dafa257eeb5d65a5fd45a6bf5a14bd9ebeb3d00d45aeb4aada1d7babdd67a924d87dac2c50c30a6d20d2f3608a0061718016879010019566458a1a184c59b4106172b2d46aef25177575fa9ac4428dac9f7f3a17c271fc7228507e5448464f2d00a1524936eb591d891efa7fbbe4f4b6195a078483a5436aad809a79e4e586c82a3ab5bd8dcd999dfcf57bff9619de8e2386ed6cc364eedb8db38b356c89abdd5c6a1104f88be6e3b361d9b8dcc9527c94273608c9c386d92722621278f1e785bf9f679049499342ccfb30578fbdc0163bc6f9f336d9aa7d33c9d66cd69da40d1a519c00065264ee959862108c6a80869d344a17e504fa086a4bac482095066f2dcf02c9b1004c65c9d36cdefdbf9be4ffae0ed924797feed12075066febc3c4b1de0ed3207c69c7cbbd4d1a6b9da81b35dd67469c5b7cb1140194a63c3b32401de2e73c09814a036d1d329e824674ef2f4449750ae0065288e009e1b0b2b186302a44d14850a821282faf9ba94a2092843796a786e1f3c304605aa4df4fb723e9d8df4eded0228437f5c9e1b06787bdfc098916fd4e6c0dbaa75ecc09b2506285369603cc728a0803125aa36d5d36975023a0509e9128913a04cc509c0737c02deeab7c71e6daa2854e441014105c19bfcf6a80494a93c11066d798e4be0ed91078c197d7bb46953fdbe78f3a136d15f3c4713e0edb10450a6fe14d1a66aa1a0c10078865ac0db2900652c9a0863bb05ba847dfb0d186357aaed40b4c93a49164ac3333402de3e03ca583811063de4e162bce0ed2fda64a17ce8d2f5ed3260ccfc76af4ba1cbf03c03dede3d4bbcdd0594b17856604c7fbb6d93f54916faedb34bdcb7472863fd7cbb0c9b0edb0e9ea7162717279c28932551c2414953769a28148a27ca64a81b783e69c256ab6ff5ad3e4c3f7fa24c46f3f28329f67d73f5cdd53757345106fbb181e6244d180a75429d50279c2883f108000753ec8442a178a20c8653030fa6d76af5adbed51765301a17fa83e9e98aae3ebaa28932d70f0c9a93345d28d40975429d70a2ccc513001c4c2f7b42a178a2cc85d3c283a95dadbed5b7fa307dfd8932174dbc5ed41f4cedf7d5d557575f5dd14419fb03001a4c2d0a75429d50279c28637968c0c1f67442a12c9e286371a20c3c985aabd5677dd697f1f889329626c2985d971b67eb075fae2e5767e972d34b4f6486a893840c9d8b6ea56bd175591298de854a88c50945bf72b7af321a95158bd52aa3c1f42d4eb415dfcfc9b7e2fb7e307d9792a160289e130cb5024361281e4c7f4db014d809c331c14e29b0d3869d301c4c7f15176985d198ac52ac56180da65719b1d6f733f26d9ff5fd607a162516c985e219b950db85b23a140fa64fa9555e17ce75ba4ed70907d3a38ca8c8ae2e9acc6795b3b2ab8b06d39ff070136799b2df8ff57ddf0f97d59cd88d07a63cda43f1585c87e2c1f4d9b562d20dd51ec5f684f3933dd993d5e1609a850231da6443b258873c4041d88a33d83afdc098e06c934a20b0c5babcf28b025773abda09688ab77e152a4422f996eef28d15acdb661a59a7e53eb7cdc0de583744d6451bdb451d1d6b624dd4116d32dbd6c62036a409a659fa3bd64795822ad56575a0036f33b6776744dcc13ef4defaf6866e11116fdd04b61bedbec0967e76b19b6fc01d63bbd96e8e48e064989b9883a2b3b2633db3b49ee992f53ec9b0f560dfafd9ba5457abb2975d7985b89876ad1e9c04223feb76e36108ee76e3a1bb21b24e88f6ac171131d64dc044069c8d0908d1a5e8935f703fc3aecdd109d88a41e28d34bd344b3f86e5e180902c2137d87af4919a6d14d2ca5fe0bef5aca46197777e746d30dfd708eb224dfdd32cd62d6bc84e4381add360cbb2fad68998fd6359d83643765c7bd6bbd36ec4b64b3327eb22749430a3f0f141c26725cf1a3c63ecc7c7f70e4e585a4a70d99c87db0e14dbcb1ed2c6690fb396c0f5658f36c52021a4201c10a9239780312c904a4099de11614ccba3832c063010b1e70edab61fb6502773ba3423be56195fb427bb196fc50e4293cc812cf33ad70e9ef2c33d44bf6fba46c1ee8e72800bd291375dc26953a84b79eee0fa7a88e77ba7757a7409fbcc9a80311a0e91adcbddf6437c8ec7b619f12d25503fd1411d64491550ecd852a51203973b08ab6e0a5d86aefc691699832346816710ca91a650079ba525c74992fc3d38c7c00dd1aaf6a690f672a7264d9772a7f09c271803779ef8864081e74d505cee54af525d6a215d82aa860d5bc75a8e6b1d1210c9237bc81eedb9c092477b51feb437f3a4c1f33d69da9b52055be6bfc00d215f4407b58e9c72a64b43740735145da28131d6e7a507600cf6ec58867556bf57db8cee271ae8085cee1c3ce76ff07caf807ac89d2c798067779287fca9ff0a8ad4308f9e52c8574828dcb45ae3ccf78d0e6dddce770e8f2ecdcfd71b79a28e58735da92373240fd832658fee1d51462a0161cc4f29e4414840381e3ce712b0653e370bf07c6682032e4b15ee529657c11827604c0f21571787087edd7ee8c7f8eed651b57cc59a9e5148975ec81c393fbd93b879a9923fddb16716eaee6e1cb7383379a0d8b6370dd034b85d7ee89770d4e7d05e8443386b081cb2abddffac7914a45bae9bed8180a3a79c9527c198c6f53160ed645c1f6474e984763beca0017aa794d1257815d05e16584343b8c10ece39e19c73ce3967ad4ce480a6be5e46a5af27496b390ede138b33e9c1cdf88cc1073cf042b7e544977d092184f15167c88e95b8c967d0cacb43634b83198673ca19addd80c1b20230788878d865ecda332983e419a6e0afd78031f5a378513c172ff2106489df4e62a1a65d5eeca32bbaf9783b77332974b3c51b4c691d090506c3ee2e1ef40217430063620d8d3c30cd2e323694127e621879d00944d32507b447bd9f448a2fe0327c7c7c84d90fe4222597e0e81261e0a80361d0e7961a1b8ed7604cc3e078d2fd0d50ae81a8d35e0f1875268c3a325acb71d366ef12416de7b5474fd25472ea537dac77692870bdac1008ae9f9b0e55db76685cebb3185beb2a65ec3206b0ac157613a8bd7acf72a43961cb3400fd4998c0c109670f43af460aa6e03de9431867da83926b11901a20c1cd39e79c93d269436bad95564a29a5147e949e524a29ad95aa000743267276c0883bbf4b9f36270843267280706f11420cc7118e2b5c622ec8323fe77c77f0b3b065dea241bfacc0ccbb38007694214abb296d80f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f400c9ac9431429608c4850cce47ccc75a61c8c40d54386b8d240448863cd71064acb65ad5e080e15f60604c18a2801eed006429c1520438cacd87214140ed01c124245d9e283c6970d068d465a9c29f1554299f1e98e3ba2c6df090cd470b2b552a1442f9d8d1c949026b5a97fb84535f005aa97e3086c51dd852451104b4b256a7093edf4e854130b571c12e52c366b8150ccbe70cc3934c191b61c838ef34024402f4e25c829553d5052c9f5027cffc70bcc4709b3b4740134c039e670c18f03c6db080e7a90410a3f72518a0c9068de7b901053ccf10fcf03c4be0c34798004df1d4c3b38442029e6515663ccb2cc8680e07d014737878963cd8e1590a418767f9030117bd2f47004d317580677902033ccb23f0b38c410e1dba0234f54c019e7b0b04786e300ce0596e20c6459a80a646c93c774fcc73330187e78602cc73fff0c018edfd760134b58fe9b991283d370e6e786e1ebcf4260668ea201b9edb030278ee11d4f0dc2770c1de8f4e8026792359e4613c472702f01cafd0f2a233ef390661798e3d343cc72600f01c7f80fb510968929f64912bcf31272281a30b66e8c712409304b2efab45f4c07d8662805dc07d0a4089f20c5729d0092afd19d034776e9c3c439e01a878be01770beefc9267157d17d034579245ce4d87b60de8b26540b7800e08187cedd0e8b2554097b91fa0ca872eab5c363d74d926a0cbdc8cd36583e5657459c502f1d065bb4397391d7280b03c02baac226d3b9f0fed6ad8692308893961b3ecdaacb52a7b596bb32d1b69c7b0918665f24aefb2f63a66eb653dcff33cefba6ce3393327acb51666d676766636b5dd387301ecd608c206041e90799c344dc0e7dbf1bc1497e24e574d8e9e91f2937293df83808131f5f238c4a01bbde473f6ba659d11d1a45df2d895d85b7139d96da3d1244509c948a494dae852dcf12060600cf6f81823912496c414d124921e633cc9244509c948a457a494d2107df6ac3ddba016ca4ee98e68a3fac00d6083e972ca3a4bbb89edb0b63362e2ec38447076b9d50bab188661180c8661188661db85d50dc3b04b4a29a594524a29a594526627ac8b39b49a1aa9542a95aa1976c22a8ce6799ee7795a289465a16c544324954aa572d484b20ec0960d4018a71bc9826acff2ced9ec9476f124a23d7ba6a56accc0180c5bef0dc01888d3275823b59ab12727300ccbb0437b5dddc4326ba7d6c59a9803cb518361588d542a95b298a66118766d685d10da765fac86590dbb2c76e7afbaf5704cedc4ae2e882e5523081b36c36c86d979e5373fd2337d83757b8b88b887637a3d1f6f0726da931917d343ad2f2024832b39de44d263afb41767ede03cf4893ba28cbc36c200620291603817201c0063a0e4481d6187b20630a55dbc199259cf6c972ccaa1caad55b1c7ac8a29024908749a49793cf98aab28916ef2148f7f974a1e49461effa24ba3c7f8972e718f87d91e8f00195dca1eef03100eb88cbdd1b0d6c6682f0249538b182d204d2dba58d3d9db41c962b1f8098b9f28b1c2240c9950c20767534bb92a97d7fef77ede19fcbaf5d9bdaeddecdbd51ebadb456ee81cf7d11591dc91975c92a7b82537b9294eba265771495f7155bcef8a9fdc3eca8558e539744e8af57be39066b1541e73e46fc9a7749964a158275db696ca235e711dc1d9a758cf320618c57a0765293762162747f9dc68b0f8c9258b9f3c6b2da507163f790e9d7223224e790be9d59093e7d02a19d5fac6212744cc7921502e8b9b726d7b29976294ab83fdc98d43acafb0aee2f64c7bd649d64d6e9f6ee768cf7ac9eddb23b76d7ac76deeb6c86d5427d139cda375ba477bd6ebed9de669effb6d20dd4122d075a933ad3671cffebc4e9fcd0b2d767543cccb524a435ae0668431cd914cc17acc5ae504b6de42a8dc68d077a75a48ab22909496dc51d1253599f54c063491248bf50904d1a6d1a1655905c0317280088025ea2259ac0f00ca742731c345f60cd6c6c1d837ec1af690146c74b68b707d19b787ea7ccff7b447e1ebdbf5eb211b6c2f2fafbdfa006543821596c19badcaadcaad9a9112c8443d95e557234f2f565aa552759d5d71d1aacc86b63203cb9c59e8f9dad6d2479a52dc9241327329ba92ee094bd2c166d93aad6b96ac9bb1cf16cbb6ed1d3ac6611816c22e8285a00a23611876180cc3300cc330ccc54603d3300c13c1ae699bd675d857361ad8d665fb0b371a7dabc93b9f5d8add88e5f5d83fd8b5e235553d730ac1fdd643cb0bad5ec9d3d6658e4ebdf20808c33abd1247deb4b743daf44faf5a80ad2774e418a292d207c6487cc94b7e125fbf1ea18cfc220cebd7153a0e914cbbb61818661cf0b67ddb3691eddc26925d1198f281dff6185dcabec9e0ed38c0ed303046bbe7728ff46ddbb64de4dd4663eb607b22dbb6b974c91279e62e227255b6191c16d130ee6a91aebbbbbbbbbbbb5342d7467b960e68300d1832918314ce5ab4783b93b4a9f53c716f34647753a8ea99fe71d15cb4a883a4b79d0d956d46ec8c88987642c05553c1894c23653568b3f4d39ed52a284c9ace6e9176f4d4317360eb520cd0ba8402c66837459f28bad4565bb7a4902c83586bc283cba15beb3108d7656b83457fdb61081b889831481c82adf7e190f62c083b1bb00ba38f4ff4b9aeec17766529bf3e8cbd9f95b478e5f7cfbb8a8a25cf62a331df3265eb61765325a38f4fcf705cf4893e5d06a3a5485428abf822085bcf2f189aa28f9c575fd7652df60bb3f75cb2174d08b6feb2cd70816390f62c6b092e7bd1ea8da31b67eea44414c16109c016eb118030ac693d955bd52a14d263176b4cb619b28b36514737848932d0a5bd58b128134497e64fea95ca62b6555907fb67955d66d41ce8609386d58f2e3480bc124fab69170cce3848297de4d7dc0b0c8c81a579fad1b3cb084989c9e57180323258dee4caaf59aca7b8b0594a2e6c920b7be4c21e5dd82cdca562a371c5909fc875f91c7a969f756dbb4cb1cd087546442cd2e5d0b55f276d34ae6f9d1111b7aa3d2bb7cac72406b6bbae4bed57b7dd8889ed718860fbaa49ec570f38c9c3cf859082c4b02e3d977b24abad1da9bd64a3213b4de2589171a386472a4271c3d3ab1c3941768c361dea49361ab6db6c6ee24dbc91cff57286a6a63deba26d460dc168527a3f89c4719f25052e7b1651da7344028f361af67dd325edd6234e44894272e338ef461dedd968f2fb3e7bedb9af75b166eb42db8cecf65976a3cd8d3a7aa667604c69de3a690122917638e6b929e7a49384a38f1236742805d59d404a02f74308384013cc0c8973066aa6d63e307d76b1d65b891c0c03432678a8accdd1deb3c3c7183924395c717872b87288725862f1bee99b1982ae6f64b56cbda299a35a3bba744d9c899a497409eb24dae322ce24da25911c834421983ec71fbcf21c57f189c6e924308d36f7b4bb557145ef6e6e244456b5f1275661cea8523e7424c479f42ada703673c6763626279d745b985c9cbe7934bd1ee2f91a4897308847bfd1502439283a7167d47d4e9479d24499f07e965a7c9ea44bdde7495d52f17994afccbfe812f77997897dce92f679047469e4f332ba44f2791fbab4e2f34038a04b2b9fafd1a594cf07d126179f9f4097fe493add688ce69c47b98bdb379265e5a2fce4ae7cc53d39c95df1919b5dec8a70dcaf1bba752f15b7bebb2adee27617dd16f65e17b7719a4508c9423fa238854597544e9f437777062eaee2ce40089bd52b83acb7b82a1ebad776b963d8b32b62efe823575b71497eaffdc95df1957b7217570249160a9349dc2fba2acee2aa3ce5b2f8bda2a3dc94af5c94b7b8d2c595439a858e60a4498866996fd1cd775de6e66f9749f3a37b27d0debccab5d141b4379f726bb4378f721dd0defcc905e2fad0de3cc99531721190c38dd1debcc885797179e1adbc51a68aab01491337451f4f1d8dea086e8d433249115372faa882d88215c0924d5c22de803e8ae668ce91ada3519d236b91eec9e8f5a39bdc93d1e7ad94404672c75ef2c098d1e96513d0d43b5db21d841f1d28e4482634aa07d3873e0a7d34bae501e2eb99cd9c9934d30313671e314f30029b955c1c16c0f674fb81085ab719a387224ee8a3c78d86b5a16b1482315ccc28b31787080efdba9cfd68746b3f7a0ecd5d888d88f8ea1ae8e606c3a8eb212636e08c98184704c297090eb83c6720aef31479ba04371ad1761f7dee2871237a157dea60085ec190091e3438b35a8a518f2028a163034c1f03227088e0eb382c8031ee196747b73a8c469d06032e8eb67376bbe5b66e05c71770a3d7a7b8111731f175c933fa1c8d4613c83ebb720361fad9c99921d636472f57dedc80db04044cdf40f4063800d8c44834ad393367a28dece4a88b36cfd146b37e3888730301d11e688a3002893b1ad327308d558850c0f4f3393201539ba63551d432bb7ce37326e21c6d60ccc583c437b26ffae6ba6ee8badb75b5eb66d7c5ae7b5dd75ed7ba6ebd2ebdae1bd72874082113303ceca9d5ba015eb4ed908d6823231954a1accc344e7b4fed98e4ce8bd5381228fae8341bdd24301de54662768d73a3c365995b0b5a8031dce9255097229e3ada444a82ce991c35330450e625c2a01739dd4eb592081a08e8068823917e201e3ed8c390091e289cc18630ced011dc04327ba469ceccdc703ea99d3933fafc8430064a5384a259e8696c0e4e87dc893b3ca0af4839dae468836393e078907a600ac48369a748712021daa3a28b6edc717782341085c21bf227483f9c909dcff37e126d208a455db4a90227da5a747bc814b8dc374098be6fba84d32818133a7d230163383041004df2a603b0341365640f9d16e4a000d3a3482072b1f9a15e54459648645d23963522b2aeeb44746bf42c13dd21989e083a0a8928004d339c5e881b304674fa95145c82335c6d38c355dc015be84777862e1e0159e86528a971b1e11c6d4e3225d4e56983e90a965d9e2dc0cfa3879ec52b70248f30e0222582bb240fdd88136d88a038471b922edab44757f0c8c5f1024e74eb3006e21691a88889b9df105df4f96beb41f429127dce9987107911119ff4b082b76fc7acec314f6f208ce981e92b77fb92d061eaade53812a9c2e03c03ce3eafe8f6078bba1b2b98c3dc15c171ee802df62298bba1a010e6ee1664c3dcd57234ccdd4ce6c83077b1d5bd782ecc5ddb371673d782c2c2dcada98ab94b7950ccdd196b26e6aebc214362ae5b812df633e22c721762d8cd86812dfd0d77cf8c03ee935e36dca7248fb322b85f309d2b5634c1c13a7dde1110c21080cceebfd088fd44f7909ea4f91f1d04c190091acc701832810410b6e8ed4a083961d6227bc5180288a7064e28bd6181198bc065172cb21e4370823149c412e01953806774c194f2320a314528edd1f9789a9576b08a48edd1e03873a5542a2a701cb78df87c3b9e6731ef9299d466965dcbbe3d24a576911136356a33fa8dd26bd8e586655996456e6256669ee7799ea7b2d65a6bb5edca306dbb32ecc2b0aec636312b33cff3bccdd33c9589c546484a52602636458946b28d60bf346dcbb22ccbb22ccbb2cc66d961961d26cbb22ccbb22cdbb22dcbb26dd3b46f5d8d2ceb82d06c6033ce283f1feb99e7799ee75d33ceb85149e72595df7a9897b74364b782b021e9dcaeecd92581b075f9433eb18d7011b332f37c3ccff354d65a6baddd6e31acc5c030e380354d44fb4813496987ad3d87d61ea34bd73519ac1d07a86dd7344dd3344dd3b491a669da88d34635469c66336b6d66a386bc9d613e1e36e9a4129bd84c494cea20b167d793a69a74a8b4eb584a93a0543403000000025316000030100c864442a1440ac354740f1400116f8e4a6858349647d324c84218468c618410000000000000000466ac060050c945002ef2b4dbd0cd57278556bd877d212ab2ced019d3f0c979469a2c9e100492e1a2b8bab158122f36d3231d534d0d9ecabf491ffafab4c3be4dab3f20e7f8e9652f19ee87067ae7664a8acf7780141890481526769befd8187e677d4cee8e4a847fb8d99ee226010566c061283b1acdaaf26c6cff183aadd804d8c2fb6de6884901cb5314500f3060555055675abeb630836a8804f574f994a3021b652b078a0f0381c39e26260fb5a527f9b85daabd603ddba00b8f391120cd542b0dab4b8e062fb98342581b460a5f4d2a7fc64478eb02b23098b3dd4f1ac4e0a1325823e2b151838f78a8d4504a3c626b305d15b70b3c647193e649ff2598e3acadd3e63a237c5bd509f7c1cbe729b853511d19d9c12c3c1b3bfccf26d9fdbceb3cfd2f282dea29c879d55210a0967fd97286e40026d8d97f7402aafee1285da2e2df079b6bfdfa1162e52b603465bc8241bd5276ad48e0b366309547302bff3d1dd30b7526fe3b0cf961a96409101507ec251169c0f50ce70771c90d19374e32a5d311ff34769d39af53147e8023fb02703603d075c245ef3cd532038785458ddf27a16f9eaac7f3f53493ce382b33f40ef2c859e792139435425807d4d04506246076f9c8305d6b9d906c0440f1ea3e9c44905b44871227dbc6460d9a9d7238957e1581c25dd69b48267ea733aad9caf397111e7bd9214c7a72209efaa3fc96a34cadb4b56733a601aed33a493b1bc8d1d348f4af7af9029c146b9c1221e66e2822748a997d95baebb7d61633ca918612c82710f737de3e641a6559b1f07965cce1ba00f4d9348d04d2fcc7ddf051ce83fee2555f3fdcdacfede2d64e3859b36e69a2a19d528089219954ed5f51f7ebeca54aee690d9a23484054a5490a807d07c73645cbd82a9c6126ffe80a614f7d76905f8f32360e7bea4e31c2c2a1a689f6b7341a0001e1f423b2358552ad464618b7b7b04eb8c8604489413c4b7b593fc3204aee60f88b88d9c0e5ca9c7d882210fbdfc688919f88840cf4b0e9a0ccb269b2ab373aea790a522deaf601bb99c0e5346e72d382708daeb6ea9f67c0776b0951e9d9b031c91a07a47162dde11fc1526656a46e31e380911be86269a61b0adf654c44a0c3f1810ae7fb1b93fe829bd56dcbd3bf46d91d3ce7853505309a8bf040111429bcb89c9718f851172687bf72a8c8efd77ee65966d47d8a93930533154c6072484100ea6a080b68a0bc4c50bb0828e83d5fd0515ff4c10eb6713f2089f8af6c67ee2e98f3ea6e39f6a1603eff3c55fe923b9859cdc89f3515be379566d58b778f151c9b02c4ac87598956ef20244d55712b9611ac5003545519ec99b0b4ce211f742d3b531fb97476cdc272ce1a592f4017f07d90ea4834df0d28d8ca4ff38fa688d9c053a112e31df5a45bf721d19da7305cbfd518ebadbd5d746e43166486e9f02a03d46db966e73219e0c198be1e0d13082529ebfd9e5c444a2bc7681d8a24cc1a38d82999c3cdd1c80a548ae77c5dc16847f804692be1816cf4ba9272e1eddd560934e6c903686201d88cf1bbedc55965c1b58879786bd6cdedf1c51534cc5b36e363434154ad4e16a0a8cef2adf4b0bb93c2f9de7a36e079111eb6b2eda4a160f5c56969218328fa2c86e0b377b392a03b02a07351bb12db022d0b640134282201ee4481d133a66137c4e0e0c2b1a53f203e506c7080f99f78154fc5e00540f5987c6cd282253f9790698c08109dbc64820feef17b3080355da3e380ac79c00ec09b53a645303af0e6aa4d38e9cdc4e78cfc1d0c15a0639067ba240c73cc7b0e61d1d920f6956a9eefb6715f6231ea5edb9b712a11215ce725c2a727963c375ac7dc381fe297b8185712530c5b3b86053d2f7fee26ac89662ac7955068b55cee479be234e6269c726dd402011615a99d78cae783ea17391264e054ef743f7def448a1a341b8aa3879b719f5b90bc91154b00333b7a8a6ef7ce8702203ffbcd35e63de10bdd30fec07f00374a92d8b220c4d99b2c62778eafa817db25e429dcc717ca4fcfdff4ad35f2554e918f03e6888228bf6c2173c9e10057113a985e8748959baa9a2387fec120582e7731a2e14bdc5cc561fcf0ca21275a7b00b21092c7971d328a2f5151c033a49b06c6a66e235c48817e44568c4b20191ac8c6969b277826c791a1073c239873d05f10b0446dc8bd82cd18d5b93c14b55180774f5cab78aff520c2c8e2020bb52247756ba9ffbea9a245edf35e0d8fa513ed22909191aae3f659ca236595e96b4bbe3c7faa3987fdfa22ddba713c45a3b6b4329e5bfc5a8f30b7db392b60c697588cb7c88a280c39c68699154babb7a71bf33f291502d26ab8cc1dd45ad3a4c7034c25b68c6c63f2639ca7bf020a7c756876d393cb84b16ba31b56f66884be36c151fe5988de1589843bec0f76ac7967b691004eb74cb78a0033797b72050a620a433c7b005f82059680f29806dc82ef2d11627ce2092dd5f88a3271e93f62ddf75174db036f788ff2bfbfc7bb7ed07bd1944492a9a3293e4138523f1df9d978a9a9c1f10f142fa37b57ef30962c4b7309fa96a6737ad88d1866919ba671746fd858d1c9e03f5f694ac3ec1f645ab06d4150cb7d64f4368a2e700a6228451550952a9e75097a6db5c0ad1ae2bd961674423c6ac71e072660f9461d44160c023dfa112a99e06f1380209c9541386d3742c8748142a4e83b8630ed1087b0e9204434d1398930da618a30e9648b68d16118e16671ded608e20638825810d52ed50b12f38ac4c0365055ef3ddaf4656accd6336a1325a16fdec0c54f1011789c94dd8693eb59c5a511b77dcff33d22783642fdab1078e93cdcb34424019780feeef7d77e2d2f7335855644cdba82a612e8af58a5c932b140a6aa7b9616f028018d576e65b8055a42fb0efc01500cc2d2c653d9c6fa1ef6e1f1014a891e1863d6fed3e2489a4aa7ad6dc7b2a9a74b74ae03aa97d1568f7335370cb8dc714bd697e3a32ee360cb5fcda054bfa682c110f89c0a6776aa616fe33e882b9267cd27370d446b443a5d3d102d4c185d4e557a03fd50891bc9477411bccf4ba2deb76a9d46deeeae780d47d476db25a7e1cc85a9442404c284ea03b6255254358fc785c9cbb01ef6b99795e28130cb06a877cfd4d3fd3647eee0bfbfbb1e7c637a6059e870aeaf030d0dca998c6566ecfb113dd113ebbe3dd2ff0c0caaa1f3d9b8c7dc9311cf93d9767150661c6f4d859dbf10dd7e5c207e2f00b1b458337f55ff64305dad5c4fa3bb5b45e6a28cd026dc7e0401290339c6467496f3abf45d53e0a384b1ab04f18c4ba65d6ed62e738878383404e4f53af709449220ee59b676cbcad81344178c5ad1cd88a46536f6f344bf52a8ebf1d5cd337ae85beed1edabcb1523c9f8d666dbe3186cf19dd5d4bfd9577c418bab34d21ead94c8abe5d41817fb15c369ef932c0481538ab882885e0c220123833fc1a7d9f48b69d5ad26f05608ae902e902bbbb1e6a28829419d63e46df176198b8b2bc29bcbd9db838f8fc2907a5be2cfc67b6ae32d5331dbe255956523a5d652df993444f383696d92c62b91ed686d817d24fd7cff605bb12d818fb3357add6d3fe42f59be4884dca07199ee0382736daed2cd994bc65fb8bad410f4f1278cdfc791010c5d6b0cebfea01ff687712be401465ed1dba1160236cc9cee6455546335b080a49a59ea5a52ad064bc07577a875d521e2d4238e0b331f0509ab6be71b1e3c3983a41bb12cd8216049a3b915f0d48a5caa5ba6d96206e6be56be722cd5a1cc1bf4d042ba58b93929c0e439d1406713d2e8ec24529ef0273c12b81012743c9c47d363c391f0edd8e2cd01a1b71c98c5abb2ea25878ceccb9f8e3cbe05688839da081a3be9511cb627420fc89133d08beb38ff9aeb684480e1e98c141439e2c1afaf814f9a4e5ef1fc35567c08b89e4ff38173fe962b4c43b8b04c99c7661fe4c5488b98a842475e260cdceca8a1aa9b4666b5db8fec58342f694b653c0e143d9a20bc487665654ee946d3596a435e7aede421a16ea210a29d68b6323af0713b76b22edf6e0dbd4e7961777a18837862465a0e827afee1b49a3d91d742e62570f4db741aeac9c20140d1eb68fe67848d4b6ed7a89bafb5936c49719430dc38d9188d04f9c8beb2eaff8a69f9ccc88bd3a8aee7d45be05533e9e98469dc371c97dae7d841dcf81b0d36074574536d64ec80d914ba825a3180f8170f4fe240fe5a25b52145d36f8d56abf64af0a2e7c265fbdde051bc69043a78d5c428433a656d564892ec56297b92fdf6419ed775f2ca7d7a1db71f4c982edc7e7bd183de58dd789fce106d88424155855dd284b21bca1375a743b77a9915a74688fa0c4753cda8a14f837a0ee8e8f95aad8c4eca7f27d57e8a58cbb6e7472db764ba3e29b4bf7001360cae51bc1af5f297d3dccf42e993b21e76d0a0a515ce7e56831d23dc944c25b0f96612db61c2854919529e25cac7c65c5ba8d9099ebe613ae912e92cdac266d22798bf09d89e3ede74b17c9f3ca76f7292d8020dbefc53149641ec4148f2502733e3e164fb50b4ac2c0ccdf09910cf2b69f8f252196001ba33ccc8a4091388c88da41f4a7da30a4a64e46feb65c963681e83010ca541bb4164b11f8e376bf82c31aceb48aff84995a2a2ba97af667398e616aa58c254ae997265fee00c41ca69828e57a8a7722db7d6e9c527205d4a9e4a380ee5fde078be9d2cf83302e6a5c7f81401470f88ec343c878bc560c1349e4826fedb95ffd5f39b7b94b9e2cbe7107c73de795086348bb20b357c61f4bca1f783ee4717b7893aa68d7f5f8c6a39de900b98989644f813af1f521271ac52d4f28fbc771862b8844b4f8232be28cbba3bd656a0142d482e2f9b60061e2ccd9704b8e44554c8f681484a5410041b2e99e9f8f62ecb824b1c09002938c5be07eb630b2fe2854be29315bc243369943e552d4c60349bc59b15512969482bcd6967ddbfdaad06a926e6becc9b1226343f0ff4803fd64be71317c36412b94856490f4c1a1cffb3509a821172cd04025570e7141015d02290e498b992236b8b0aea8f4a0c49fc50c4814b500b0180fb032b5247eec7663e2046b3782772dd311aa59d22e9efa75371c847cd255f91311a5a4f1a94df6e4edaa62ef8bcfac8178b6079c751a98419c67dda38efe94e44a6460f578110ced8c0aa28da1cdc2bcba3caa51c513ce7128ecd8f0db0bed1b71efb6e4c9509e88bd712e394a6a2234b9e3a2d09ffd282ee4b80c5085cc1543c1ec35f83f6c4fb82db4ae2d419b82d177920ac3a4d2cf9a9789206630f589351b06d31bd034666cf4081c42cf937454fa3510cbf15e603d5dec78c5dfa351391d5f5e565b42b34c131553007c489961c0f514240b08855e2540cd3aaa84475733ae56d2a81dd45719c9661dd41d4ac5e8e250e23a2423e62d208b8ef0fa990876076bd1ac986401c604e0236636788804a60cce845612022f677382b8bb9ee9ad397e1633e15e7f2aa6984dfafa0a11b232c38e986a3e844e1d28af19216b6250ea2a7e8bf7216bbd30ae0de0ecb4fb76d761d85b35b92a4616ba1cb3a46b54c741408dad82d54c812f33e7205153242168b4278cf9780e155027d7267afb80a293db15186cecbedec06b7e8bb3b46314c11380fa55548b1571aa8c802462d270c55a17d45bdfdf70ede4a986b0e3b286393a02b906085805ccd3699dff8fe3e19e39d0799202529bfcd6aaa1599415c7d41b12036790d8f4db41759a0dced6916b04238220665277773428217e737ac90bf30a3de9e2fb9e145d721c6be484f22d69299195a0fef0c2436f924ffd5022d54d67f694e3b8d690e251040b8dea35e7c8bfb0752e218dc39c037687373187dfa037e3a3723ff64836afc6a64ac1e9447a50cf4be5fa77899494fd29d76d5d0ff4991687c14055be7de433beff35af77b4f6b345deaffb1ec3e2b71ea30c747e4c8a76cf79e48ee27ca40993a7e7a9c7b4618cb4f933e4502d52305cb741cb4983b55ea56d72a33b11a498bca3ada7e49a91281245c339407cff76eb6b31c80149fa4a0d6515b150f17dc7cc395aa2c53c598b9639459886456d522c8dd2104ddded6a79692aa1045397ee1b5c8c13b7e94cc26c92630cac79b4515eba514b18fb0ceab23ca25dc080b4d65be810086633207c4e1936507b8b120a2bdb2e05e7dae6acc4554d9a23343df972494576611af114c08c2e28a62bf70fad5b5ebb85e76409d9cc3b6ab940f8103fa524e342e0be2f863c0ede86055b8c3ce7244731fa7b3f259543f0b48362baf705c9ad20c74498da55ffbc7268ee8a2c552074bad62737cf244e6242d3fe6f5a5394dc932c430861d81c78ddc17f89cd8301cb343b670b132834f327d6a1843278ebd518a95b4dbc26b63140a8e44a528b52f2a5bc181d0143b3ba74dcdf88b702f1c4c6ea2f1cd2ae772e1ac649053b964d6b1ae75d6c4be05f35a25b137b81b0a36f52f8d344c0389be313b12439069ddbc659216dbd540447df5b47c16991c00e37432ca241975cd6474e7016facf182b8906b4c5575a5fac5654d4dcfccb1cfad6261496ececf85004e2ccb442876ed3851b2918d480ec1212df4da0c69b0d6be0e0e36f02dd3d59a3ea92b6c9399231a4e59f4003c94f58d0f834dc5911e000e196a6d070a9a8b6a0fa483c6237888b33abfeed7194ed6c72adbee45b0168d25ad34c41659e79586c94a919a356e8bf8e89aafb06d1f2a3976e7755fe985a0f3fada55cec614d3f89bbc0b56cc89bb4d234faf3b4bce22aaf2939118db0cda9f1fb569bc5a7e22cabb6fb86e4eae2322372eae1d612e7ed4a051261d20ac93458db259518bba5b7e3385c216472e96fc8d31b7e34d84c0062be3eb69d49ea8fd11443e1a4ef0b78064e2a3ed71d2384e9c7f2660935ae8b70eafd69275d81c2da7c676e75a4c3f3550200b860cc1b0ecf65be808d0aaa2833706443e78dc38d3ef39f9b6d569c318db5cedc7626058ab5f1e1a513c41857568020504c5c42b49e10e08c4807df04db86e8be7e79da6df68de55cbf68153ddd68d9e8790382b319e8eeee4499d98383fa049629ab44200fbb5732388b92994a7716bc68f44c0074c28884618039ba292c32231e713de0969ccc33b173408f8eec9f058484cfe067cc54bd7809c567870b2425b40ad01c14e4060d8107566d1be3eb4c581387e6257061a4038a3c5c8af54c39293cb02d212617089a71b5d90b212c61cf7e73227e1f7c4532e2c82aec214070eb7c6069e08275cf479104c582b6c956e32ca327a29a87af780e8a6176a3700a0a68479bc948b5bc0843a81ea54a28bf6e351cf5399dc928a78a02d2117390491bcdb3cc9fbdfd81268bd7fbd56f2e6d5ecc85184c3381798b304afa04f8d69f38a638391e0c236f59aa8e88f292b9fcde2413cbaebce32ca70091c61252c2cd7ce4eb56bab295dc609a2740532ba24fa166d907ade1eb6006cdd5368f004b519fe5607f0a8e7fbafab70cd7a3e8021580f8b96b4ee6dd9c70f2f54b57efcb3a2d86ee58934810fdd460abc8f34979ad6515bea9ab2243c534d5c8a9ddbfe36b421b28a0e520bcb1211ded602478d1ad02eef3d2c2ad97d8f5050b34f60a12a79136e40b4e6612cc19538d0cac91e1917197d9cb4c2baca2474fa28100c15b234e80692f84f2d6ee590d8421f871cf82126da4d9192c0c5285c2da85fed32732a7c010199c180eeaa0bcd8aefeab325558fc5a343cf4980922bbc68b157b870a595e3e9faffef2d486189e94491d7b32c2e6d363f190084aa84cb0bc861fa80ce3a284a20659e446357c744a6e268d074eee28b0a7f06e009baab61e85e5407bfb8a143d10e48b6ad21768b583a6f08838095c66c09d8c8cd812a2edaa549e8fbe833cf1c5bca6cb2887df5aced6959eb69d8e4a7449e2c427625cc5e7c888184a92e7cdd215bbe1002739205fe137c5218396f45c8451f189babdbf771f35ac8cd2f62b38f8b61183a7814b417f40bc6ab89026ccbb4131d93cc7140497e7dee4d0f5628fb71cccf3e8e0b80988719b8ef617032a66af195173c7fdcf98aaf1927860bee8d3039794b5b5431984e65df1ac67bd6b08cac73a1ecd04b704243941f0be8f346354197c0851f909348a084d7d7e1aea909b67ddb4f7161b4436e92ed94b94c5a3e25a996536451b219dbcc44938fdd7b7ab4ea44fbc96b7c2aa5182d5371f3d3f72ff4311741fd78690962f908e145d877c75b615765c0477bc7f77dbbc9aad83dd0890a2e235d1c8c046927ded1d0e963dbb845159076a4462b043dd84a62a1fc0086d99987a51b6c47553f375cb9a51f12f24504b4f8788d35c3db92a51aeedd8238130698c33e0eea000fd1f2b4f0306e7276ec97a4559ecb565591caa258b49db4415a88425673f8b082fea3e255dee8e6f59c57e318d9d565cbd5a65a6879d68214e4cc56b8f967ec4672d1449cb37582afa5efef77a18989c0f66e212127e5a2b568d36b417560bda09df5d970825dd8596bd19f69c55997371d75e2bf547bff0b0f619a81fe6e84054767bcb5bf06e86093f67260e7c4877767e80b558bd7244490a7e18e2ace38c76aacc9c78c8e5012faa68eafe7fabb2325633936997607fd2532ad7639326237fbdf9174c2a7ba91e0f500cd14381e8c3577bcda97c01daeda43c0b4ff336cf831c7465d110e1cd9ed9384240eb0e0c98c8c286e932878931259ee7e92b2ea47a4c2710f27d611bb0302ba181f13f0370d584bb8f1596299c73328927ee2c86f507e5832c40219dd0fc4ce26263202d56726c3dfc85345129a6287e4e503f968d46d3d10e92498c83dd6eda20752943b1869f20b0443b0ed316221b27812f37c5ae0d242e1fbd53705f2447dc0df559fba87401798e76852684f40f71ee4900e57d81ed6096ed44106d20bc428ff7ec509be0fca633d5ccd3104daa5571076ca12700a75ba00e1a0db0a05e80939b191a015d06db848aadd65b9cd7d5fc19374c490b24154e3805689efb36aa706ff398036ec9766f2874a8b37d27dcf494192d531bc6bde8bb59d52d942944dea9c3a0881d832fa9b0724ab36278da5c6ce54cc7aa6676f53353afe59c9113a9315af139a7d81a5d8132302e3794ef922b09feba73702c3c21e0417c56adbc53ab0cc5b07fdbeca1a83f3547e44434bc3fe9832c76334d0cbb042ba98a3dce1d4c528178643c4d9cf80f030d2872231d3f3a046c35fa1bfb0b4703c5c3680550abd7e93e49f0dd7bad0128375c110d9a746e3048e4166845963531b236adebb950abf05cc9d5c289c2697890a4d1ee81d00ce73617a627b53e85e6d56566315a9c3ba7e661f6c19a73352aa0a5eca9852062447089a5fe23d2e13e888e7fa4b60d9b5563965a51a9cc7edf45b743cd29ecba4e3e4734999b4ef89f34e8d21cd6fe4a26f682b533a055cba38714096c308a18fbb4c4f8a81dcd8a2e35f433c009091039001da6abce7701e99d81a2a635c1a290e612188fa03331dc52b2dfdc40b3754f2cc0782abcdb9893623851e24886e99bdc150a5e0656046c35e05ad3197f9e567c8bc2441824bf5fd5ccb012291a03632aa0f18e4b76e339d60ba6f46aee480c4c97ae0b509f286d18a67268c02d956720364c52171315b081ad20120a394e7134a83abd557c4a8f31c81f1581fef31b62617b4cce47535ace3f784e2edadd4951f55f207688e29c4414199875760de003f27da4cf03d2d0ca85b2fd22050e8e086c8061ac51005b18bdb4634cf7aedb0222a08fd42152ee9d722e2c62ff466dbc06d233170c962bb275c0418fdb23fa79bb0c0a51dff7f50f95a38c380ca4d181ea58eb20711331e079d4c76c5e72c521c3e7283fbf86db6ecc6dfdaf9d37cb15b2d43e8469334b46f9f9f6dd58456e0c3d19921779e830133d8072d53a63c0f90a90bd369322ca7d15a43871a585be1e3d6448d2346d2cd6d3f371ad16cc04ea71521773c9aa7ab03b270b7bd65f612882fb33ed0da6cd696b2416e52e0de6ee04dcfd2fd124a5b9c4197799fbc2b44e91c1e96b3cb783156316fad335db38e0f0cd0d93712297666d6fb4e6f37318d3da610f60bd84059002ee49372d95a13cf1415e1b5a503ce7efca82a6e481e54be36c53f621a614b4c9d01cfd506ec189daaea575cafc88481c3f531c65ffd539d98e66d29669034ab660cabdca0c6f679e843da0da8339a91d84683f181f371fc48dc2670327d0f9d2e89dec7f2e44635c7385539596a49c5cbb27195ace48d0ae82a719b75a5c7edf7706c4cc602f519e9d1a158666caab9b5d4f37092a8134b270127618a452034587ca3ba7281df4c36068c527673106b4195681e59c01e2b03981574b03c8655398a06736291926d2add1ae1a2ce675c7a782cd6cd578a9827a016a4fc30d6c03c0a60ef17a4573676242c11e957f5aaf16242b5f88bc28639bc6d2d3aca1b0cb507d82dbad86ca049b27b218617c4d40569be2063194caeae07de424acf236cfb2bec32a5d0f45386b61d0ad19801241662bb9f9f964681ec420ef9607a2060fe0cd46a2d30e56d5cb6f87e107dae01b7112490a2bfc0c71591b3cffb6425adb1a783ea319f6e497f4727440b42b9776b8a3672f45dba1556eac63bf120ce60df5e29d448591e4f8c243e83e5efa7b87b0a320706d62ae08cea3f0d481f9e24ad8228e1523b4a1a1e6e02c50a17879df3c76b0ffdebead0efa521029dad262fedee0c28d384119bc1e136804fc24bbc5afdbcd3633c6732ca0baf68c515c6de24c6c5b5b75169ceb2611c3d29234e8a9767d1e7dec2c27f214470372ce390998d276f847348da60f07a31d5df5459437d6a79cfa5035ff780cd41fd1a6f26de444c001b64fee29e9d70486b058774f27b19ee820c7e153255d3375893de3c234572201c080d9511a553a77981bf61e6317e8fa487834a00fb7b56aa2f1b989a49f3f1ce6b9f9bcdd0265be2fcdd918317662d2a5f123f22217e602e5c9cf2f699fcffc82159f519f7d5e21e50ce405c7f2d13c508741f52d90859a3ad1f3855814bcac826ee0781ba64372ec0accc995d6000d5acf38109f08054b244de8296ddc76831256767e19054321ce9fae319edeccce1e7e282ec2616bbf162ea7317b3fc91dbc4631f86cfdda50b46e7657f5bb72ae946eea868b30c7be9f662fc405cf24796c958cb9f91ca2515875937b4b8c07b749b879adc06ae7824e16416f422ba8982a2a053ecb343967698d521a1abcf02a002a22e45ea01b4c9bfc1c9e0a84568d8017615def0a084c048e82601920c254914a836817226b8b72ba4dd577bbf80ef56e7bd257d42c3851a407bbcc4e1d0beee03d0a80806caa7ff9c211a568ea6daa9adfe8ea19761c384d24078b1206b08044b35f0baeef2160ca56530264f780dcc9f93e68df056628a34dcd02f4f62e2667f09b696081cc36605391838896cac176536cdd640533f28c526eed4390a50f504360bd9611fc58dc01dc13c8080f3bf914fb12dc140fa1cf692c1e90c628af5dfc6312e016c23902a06d22658f5116b1d40f3ee1dda6a4edb1c56546143ca3a55b3c436a6b9e24be80629e04d730ec3294e39cac01043e6d8a8f8a15a72125cccbb8f3521e5b129b0d06ed81ec4f2745d88fe77d1b39c6527288325bf3406c460c8e36d034a4ef104e92fc420fc25c9c071ffaea6fd6b6ff22eaffdee5bbd1d5239e2312d460d4c25b4a1ce12b032136417e951ee6da885bcdad3a3cc843019fd6c6ff8bf5d73afc5959e6dac68769718c2a97b7d0b6ed8fae37f4464ce2a4d562ff4a1de910b7687da968af45e658a2be267a0e7aabd314e5ae74a4c64a1c36c7564814744646f68f4ec6758a161bfbcf072041c36e81a2898a5cf6a6c0ae3214a20a88f6be38b9edcb39cb7ae2ed53cac1c176028044f8240d47ead17d0cf132a9f85410293c71f4e8e75e99c948f506293f54ccb78509c66856846e685e31098ef24bf7b0a627938f394635e32727e1cb49960866991351f1b1f07733291be289e790973e11eb244b1cb80e3df41024feeb63abb0cd89b7532afca1c0512de4f6d91d4dc23c8c9ebf118f343fc45afcc462f8049f370a225af8a13fafc5a4ddca9fdca2bf751a71245cb24994ef83c533956f4486657b210eba2533c90043b2653a4d99afe8b34808bc325a42571679a56a38d9f605d10cfe72351cbf2d7c76302884194e662c59a63ec002a6e7560799c29455d69b5030fd9d172a26a90f22841d8ab716ce21d8a84db4354d137e59caa969ec068af2d3037d8e677bc65a5c51c610e8a3f1543298686cf669786f733809a341b94ea4f2d33e70680573111800248b4eac4f939d19c49a1e4e65c8e256d23fb222287c1a4c5f99dca865d2f650752704f2810332009d35970647d59ae020debd1665ae028df540abf9ae85d903e5ccbf202d9643b09a206bd56359c5e14eb35e565fe258e86279a0809de5427b4c1309bcc5ee0391e087a08d12b448f3789cf4d46080b6e2a6727f4e404ef0e11a3b124a483b2afaa5fee84a09c36b99bed8b495e31ca4cacb91ca6bf231fbf95134fc2222782f2e94ae344dd862bf18e7a380de823db7790fbe7d814d8208d1043af735c412733a12d1a5f373cd6feb1ad30662a8f76628c389a50ab80611cf868b23c33e35a4ee4f5f2567cae712dd3492a831b38cc651db2f2282238f3baaa71085ee3e5f1bc9e8707f44b226cd3cbe0ed9aa31c2047a68159bf7b0db3109c66dfe1bea86ff1345e8d68059f55664b7d65a71198721006470b10c3d1f284793414776467bf4ef8602f51e7048b2b91c5d96f6333f8625cc33cabba63d202a50c9097d0adc4d352bedfe6ae01b4c42394923fedc1af71d9e715b4bc9e6a220c1b0548eff0ac5209da2c81498a86e8cc658693701e8827bb1b351ad7c4d7949c0b2965bf85e270cc2e985ac5c11ffb413536a136c22427838e1982975c0642e7428751645675a64514a9726cb6f4236a78c14c7dacb49f30d999a1adae4898a19908497e0546f0b61815975198287482ee58e68fae240260dd82709e0c3d56e6704e56984f55d50f93b47eede8af250dcdc06efe12fb2abc56cbf6fa5facb8861c90998c6c3574b8fc656cdb1d4d9aa6d11fc092acea762bf37068fb5f5258f890131f111a28b42b74abff690474a8c30d8dc7afd5869d17b9f08dd0dbba487a99ddf5a1a60275719b835c6032917eaffdf3e10ce1dd2213abc490d560f73ee1c2fe61e7ce0d561b1c5f60005a72c484c8edc807213d4815befc6cc3efa1d4418bf6d0e90f3027a1113a1d499c0ae8c2cfa7f424eb4ca1125e48c2213ec151a490873ec9fb13fe16caa633243633ce8fd3ee62c4d11ba48fc4724d79651b09650ac3fd48e2bbfbdadf4dd0381fd375fb406c96f6986c06b65e1a62f9f66e67ca903dba265e90898448c8a4d3f77b63cf1b73a14744502e11812cdf7628820e66f79f1cf4fcac6df9ba7fc6fac68748c8c12aa3160e3585675837d86208e88d47fabdc21df80f0031696b0fbfa76de1061633b7d94e6a825c4681bbed0bd22cce2f404b2f53037dec6900059f4374d2f3be690c91aed9fe5681987f277c4de22f3ac46d9145df13c0faee65e79cb9503597c4bb9d346c7ff5b2286a6ed9b23eb12e7cd948a4a4c619ae86739d540a13c4bee0d608fc61dab0793f1b59e9e2ef2b5aae37bc092ca755bca6e7e8fe78599dce4f8ef011d7ea733c9fb0be8ac714b1acecd436544eeaf783431c74212c04275ce450251d71a793bbc852401e84b94029ab7cfb874cde3e9d6ccd5efee20eb5b2cd99bc39471c7b1a18a84e98f058a70722b7af6ca6708af116ce5e267658e5d09a396e6ca71a018a601b4682e603d8c93b425641f577fce9266c9faf1b33c30bbbfcbe7846ca2abc4401636235123b0a9cb380dc81a8a05b0f9fef238b297f1c74411b5a21aa2ace48c1781138a5de5435ebb611aee293a85ae9693296aac42ff962defdb4237c855cd5518d54c9624c0a38ab44cf310828a82f6ff5f27eafc493b64c15c8c733f210ea87f066f571442a7ffe1ab9937e1a0ea558fe91e3db047dfa10e2727f6cb79d54f6eb1c27f5e0197cf80b48d2457034dc025466b8829a86f31afd1b08518f9ed0bcc50a4b2a4577577b1e5850aa042151739d3843047f9fa459bd0b48f258452de69f5a14db4ed0f80234ef803fd35a669d445d1695c898ad2a9e11303e2398f5829ce966ddd9a0b45ce1f132f38f1299eb4bb9c3deb7a60ed07ee29ecc8c22d795ac389f0d9bb477e807b4b2c58d5b9f44c55da828d317c2f7bf75b898c584ff4617e98a40a20ea44862c4e6738c8ed8098d858d07f1d8b7726980002dcc7781bc7074573afd598d51204a673b91289f24748ee3de369aa099d43d3b004c62254ab60e3f779d80e876220d9b4a3aa4810c2f0e3b6ac4c48b882dcf02a94ee814b430f47477bbe2414f9add5e0116db4bcfdea397d9b8c994df1953e4bff15308469eefeb5df61e0efa9206da41d35bfe5dc02f83af08872ef4adf6c4d60f49ed556c5377a629dcd04390df554d1d7ee6f85e93705fd1684c0dd8251af5e33e9f9e76945452214071dd52eb63cf266aed9ede57b2fc8fc106fd7bd37063cd5e109558f179f380c7b1f84f86ceca8b2fdeff17fc155e4a2242f2aff6113a76e364d92cac7f395b5bef28e06aec3f50c4afc29e5717a44c3c11e177dd94a0bef8f8481595354f151900ab8a7225f5c495802695e20a68eee06d877129f2a3fcb6947a59d194f4cf49a74ea39ba9f3f871a270e67a67aa39ea084016c4276cecfd3fd1ff463fd107dabbe0f88f606ba6142b48b5d831c392accc2950862d984508523c8491d06c05f0312b1ba8dca6c123c8d4426de4a6dbe329d295ad5a68fad4ea436d34427cd36ad2660d90be70d887bc0ab2d06fd6324cb8f4a64e6052f324150b0524471a31b624089691991e36b256137c4114fe861e5cc02328c4e2ea23870e5b853c01edef21e1688119a0661d8b000cd842c20e777d5c46416312f3b2fd57bc61a79d03f5218179703ce69e2c422676301b94d7662e73b5b72e95e27fc0c1555e3f959011c8e840c82d143bba66aafb462b6fe91a3721a78de2daefa68a5736d9cab73b34a11174d14470a57193b48b654da7d0a720801421dda01d9dc82f063f1f7363565705d88732408a16adb4dce493d9f95da3343cfd9ca8b466d0fcd60e37138622f590fb7142bdc7b713fd377dea045d83e62b73860378cc9c7132902268928e7db82093ff8ee9713a626a8b3d244f88df2436f45d6903acf783cda90ff700e03a8fdc663249e28047106dc540a9410a4b9f525f52caa9ef20c075428848bf2b1ce5fd3e6de92eada9db861a35f259c595d455b51a890bd11841ec5fa558156d2e09867909b667ff69ecbc9c1834c919e267dc88920340bdd1194fbeff55767d34cee04f639976e3ffc96271a645ee4c1fc690021c75c3f47e59d28a8dcf78ad3fe188a128a10a9ee07a1431b31c32141c40f61d4890c46843762fc4ccf9aa5320b0f00a7c65237fb19dbc515078aea0e47358483e0f616b2f8716f4b91353dd04ef0a45f9d163f3cfc883c21353c5be2c599d6bc3bd01c90e04b47386482ca6844559ee5ff7d1368426da28889640325b2ef62a3e02db28966f4541bca264a4127c04a1368e80d05ca9d90ad61f7155dcd54cae416ca88fba68031c0d42f880288034645612af2e65a851d80bb07a9ba13804675e3123a7826421ddda4b908994ddd69968b0d810015ef73038e30f612beafa4b05224a08fc68bb5ee1b46884197ec463c3f75b713f50afb9fe1e5b05481ffb04bc61c403d0639f806f7031407aec07c01b2e06901efe016bbfbdaefc25f7e757ec2efd3faf627fe9fdf115bf4bff0fab985fa2fef0ee7b216a3fd2b778292b02ee9e12daa154f0ba513b49213fe7a86d0585be20b59080eece3f5aab1f0b52cdee4a2305c10d3f2f8114050dc6ef77fec1dbc8d73e4beab74734fa82fe3b90cc7c403e741ead1d88864427e03f67a7f78ab2769fc2744554df95b6aae03d159d316e6915516ba9d44d83f62bc87b8e54c9834b6d1f2b9db496f6c3ab6e702d1dc0552acf093da15bb5e52959cb9de3790294dd0c738a2d2c8f6867ba80e5d43d36196c9c0f83b176c33ec388ec4ba2d36ea62b70be61a475ca19bb156e3cd04e90f852c8fbfcefffbad46cf0e940d1464b2162e97f8d93a55a5fbaa1067658294f4bc1ea88d13bfff07f556a4afc38e03423a562b17f77922f70159233d803fe08ac423c29c579382a88dafbfffe674daa84f86c60a9252542b49be01d43ce0fff2f494d8937e0fcce2718c748b11fc4af091df845bb248f83980edca5c88ef9a83108fb84bd24fe66e66af1b32552fae428d32d928bd97f4c460d0e516cba582c2d8aa540adbf0a3157f984990c9826b3046a570b8cf1495827cb01780f28b58b1254482f238dfeebbdb9cb47ec42e25de6d43fe91e8dadd216295e688fa897a52241096d60baa56b439dad702aa1adbfb8da1999b0159f6e248e1dadf3825a9fd0a4c488248c5fe31ca5cde945c2f20a99565aa501f928ab75b1722c3c6e56c4f0a0ee031c5968142dee5a0886ed0bd8cfe9b7a06195dbe2d9690c9dd9e764dd427ab9687b1022e66f606f5869882b032f0aeff4273b1180bd077a687ecffc6906bf00493016ce91b7b306e243bc79fa49b41d8614ff84393d34a9f0032451420cf6648c2be2a17d891a78595d7eea974ab08421390addc272a43e914f8e299cb54896c4a091d100b0a1566748db8972a5c874385a52a2cf2c0703e628c59f6d91130b441b4edbe03df9c0797d218316232594b27475f80631ed421b706386ea4b5aeacbd4ad1e0a6c982d8bd7518e33cc3a72e77e5056533ce8a50371c697c1c6014a353a7777768f03d832128017b539d346d9b6da7babf483ad69e87a5e78ae6da95ac75c7b2b701473e8d554c7feda17b8fe12a2bc1d482bcb873ceeea10a378b668b2c90d800c2684fb7265ce8c3558093f14cd9fb3bbdbe1ba24ce02a08010c05e9da2d7bb05eb17b667a1e71b12f9fa4c41fb1702c01f8f12985d88ca2282969bdc7743c48d8f861feab2f0672d00977c57fd3b6dbde1c0917540d3c3dbdfbd5d50e1bbf72e269e49377661e453fca1ff2ea54458ef69ddb7b7d912e9157e02bbab0b67e0208b486621f20dab9250c3892067937fea8ffdb01763cbb2666e39da0683b052159b0dec5b38c23aa74ef523fd6fcedad56e95eff0a3f07c0e14e60ccfa19941003423cbb5516059fca68cd0cab7f69e281b4baeb2504afeb2b6bbf1d6cf0c2a17245a06365847efdf9cbc3f14c675060db1a9aa79ade99b1d5aa0b360bc351b9220aee030059493dcdd897521290450e735a74332bbc2f2ed71cffa01f29c6e1027f04afd873c6f901557c7db48250da50538d7ca42edba7ab64292d6a4b00d5fc32a8a6e01d5099d32fb7eab1c3e535ced91780c8d401a9273da3ec746eb785bc9265f093ed8ce53aa53003542afc666836d732d9d76ab406ac81e03fdbe06c9a2c44ca99b0d4a938d0ac3b7e62799dafed8885f85dc4350f0db0c27b9b478c09885b2814ff8563962911fd21acdb48837efac463691b84fbd52969fcbdf67eac13eb1378905cebf0a9e648df5a2dbfa28580424bda078aaa5a8c9ce7260015aa0f6b65095c642982397b2546fbdf9b0d8109915da64a02cf534f9fa6dfc04fae5e98b182fbfd8062b7ae9717850b3e9fe637a0268fa44471a3d47b7b4a0972d3b83b4d305080ed6dfb923964b6c5691b4560e7aedba7cdcd01570502eab53357d7f8f8b60fa4d50853fc419f3e9a666d195154d3801b743945773d4fc6dba093188591730b6b86a071891e883669b93de2c6d5a0854ab31e5d5f935cd0a4824d624cf401c2d5f347da58e6bafb414094b8fcc5b65c8361388505ddcf39fec695487da29ee52323513cc4211804348e6ceda8de2042d2bcd6be68559bf324b342ce9881f855df33fa0ce49d194dcc94a91124399949c0bab0e553a616d90365b2349ab91a0285be54abad37ef24100511302844a2c150b9a1f879867129d22dbe2761a5651e0c611bd70153f80757331b62036324681988818053191630a6344c64e8c35500fbd7a17d513580fc67a1fdfb7ce58ffea457affc7e5fd2bf692eeffb878ff8b5fd2c97563712fbcbd58daeb878c8f9542056010fe715a9dc1e28c8187e851df68af1a5973953f05661d77912dc61370d817294837d6dcb85b5aa5f6b9635e83aad1fc87bea5c01cb4329003f6bbeea0737865a21a032a737f181eec784cc7a702d8d43050a15fda4cad6da50961c3e44506ae216f52f2839019bcea4074dc585c337ca8c1db2f3ceccccecc8f1fa1aef4c9d87f7023ba829799a0467cb5c9ec219a9e4d34a0a5733290a43337d07fb47a5fe9df3270a0d0c31169fd840429293ee725353b51bac92c1a138e98cb0c5569036f21e0f8fdaaa196df6c8994983a07820ad1e021d615bea13d03f7692db4fbf18bd5b2406a0f02d57caf722d40defc4eef8cd83549d54c9e18a82907120b8ed96899cd73319aea921a0f67f829d659df21aa266bab8a88008bd4221812bbe347960903e1c3836a6106a41b6f692031cdf026d951489d62c58bfcf4c8161af066ca393785a11fb3786604357a6b118c16c00cb553c2ebb0ea3a42834306cee5be3d2a89501ddd99b2d8fb0803c08012d8efa791d32e4754d5f10b35d0308a9c724f6251a609acb1d2732c402f08008ae5712d43e0552fa262886357c1a1cb1e74a1a2baee29eb8c63497a1ed775aadbd88f42794f194bba4893758cfae2414790e2aeff8a360d18432ba8d8b88856ecd35b000e62cfed1db1a950178bcefa0b1c1afbb01549a0f5317b66fe4a88743722b719ed852bf4d85bf4bc109f720e10fc4803dec737a0fdfd05dadb5fa0fd7d4880dadacf5e2791170ef20d685f9f80f7f00b607fbf01e11e631f99089c9dbcf7029a507e66e328e9e1d61263bdcf1ec8ca5ebd479f8861fd70983a70b59bbee56df93b436c329cdca998ae80015c78fbbfb3c77222d1f8f47a5d0e7b8df841a9fdd9271d6e872a5cc5eacc4673ab12b6a2a1a343c48a678304ddc72623e585b0de3141e7cd74c0ac390bf552d3d1143bdcdb5ef4b62db42fae34c3c3f1bbfedbba3d40bb7dc735c707281fb8f2bfa6c97c03f2357ac9af6870de026d254df22b34dc37415b4297fc154d8f1bd02ed0257f4d93f906e46bf4925fd1e0bc05da4a9ae45768b86f82b6842ef92b9a1e37a05da04bfe9a26f30d085fa84cfafba84be62b2a0f3319210af7ee7eec70d8846d08a318cd47a25fd5e8dcb59af5070b08a2a6e37e36a15eb93485ca6fca82cf3d3aa373ac8d536129c7e8c3df062d15fcd74edeb73293de5b57d8a5f6c72ade2eb13f56717689fd6915b34bec4fab989df90344e5e545976b8218336d781fca5e87905c13cad1b4c8c2f89919f2a72c6b189ddca241027dcad4f4870e02b1f8863892d0c13fec42841d369b204ee01b17ca9aac68e3b669e6fb525ee4c76c79bc8ff5898cf495b0b9e8b4a1ac4c09feb17338e5584c94049c6b95aea7ec4c87ac1694f0516537245a3632ee316d88a6ea16523ba44f4087723731c3d2e329f726612e2e27d1448d303a8486542b191ccec7137b03f892c7cfd5b145a023b0a3a9cf18c87e7bca263cc5a7ad8a80c84d03cd671767ac1803c7980eafcf4cd8585ee24906cd6e84d64fa5615e8aa87893e980b2330d12fc9a4c01755f96934d1108b9c182e23d2907e25b430e31b7341aa13b3a34369209f25e347191d7443328c15e00667f74e6c6ce18f0cf2df3684236da85a447789b2d579a08d1113f42be06a2bfba1cb73660d681213d160635b16653bac25d878eb0d700b0888e337f455a94e82cd375cb268684f057d3df01f3803017ddcc75d00dac19b7d43f942887f3235e0b21f455c62e63b1e7a55c60b43774df4957f25d015374549e2548081d4fd9b50603672b08b4eb224bce720e2493aeab7a21fef6c2222f78b5f7efde672cb7158ed7c96a3615595dec7279f167e5395e36d9e6f73f56dc3305df28165ddcc5367d4a08fda71f9db077be4256b56107deb3cef674b4ce6693c9c9fceab7c98f1f3b2fbce978239bbd75d287fc3cbded797c1101ce6ea71f19c865d7802876a7bdaa88d8f652119dd5baa9a2002e30f6a8981fb90158b8b2f4fb02b5f48fbb1f20ff84a3b95e9061f4c706078b62ff7c612a788f2685baf0717c799e7827d25063479862c72d069fe0509ed8833f8832ee79f8856cd16c850e9671a65c62c4cd31ac63a4f8aef77c2e75bddeb97adbd6863f33ee49f45ab4c63ba6d284aa9dde4546ce90a026dfe331243a382def27812b632c33c9cf1c1bcdebdf13a713004ced5d75a66ce25510f1cee0009f1ef5433b6a5bdf6a2258f897276db1b739192185ffeecde4a3742e0fa0ea8099690996ac31ed15b3ef6f11f1bc2cebc5908e08b05ed9472cb47e25555a91ecca046abf30a705ec5d7f091adc956c612820a338b826da1e001c9145df079aaa6f6dfddd21770b52d1b26f8da72f170e10269c3d66d9fddd054fb57174b37cdde234594acc1c8592f09f4492e43928632337265083bdf79799690d5d9fe7c2a74fd9d3f318c818aeb5a9e4994346d24394a3253381458e8079ebf347356501130c5a28915e4d1d7ef543279c9be0be9e48df59475d26b09dce01ab656bec5e7f408181616f5407e366bf3abed893b1548ed080c7d8fff10657f144674a855961a772c2a57d49e9afb582d3e8e53ef5f221549f2b35a074acda3c6d48690a2600611f15102c2577ba0210d7510f9984129bb94a4ee13677bd9ee54f308139b371118c4859e0b3be7a7c398e55e96c96fbbe2af42117f68c99e3ba94715e07f7c0a9cd278a61f8352a4e644c8ce0ebdac615553912331de6d36af941e6323c88479a09db56c9ed27d9a365fc71118b11502ad3a2c5a825acd4d791af8371c930635633434bf8a4ddf2abec0d8610a36cc0ebbd990d4f31a537aa5af05fd7f138822559acd942c842f7db6938efc87e201f033668dd13018e6886c9e92b2413af2d82dfb335c8ae4993c57cf0465d4746134d04d5d94e7ab694c12de03dc37f81cb0c4a030881ca1af17a962247e1d62aed1c63a56cb6aa7daf353d822411742d2964dd7fb4847a35312e60e4611240e9e38b0ae7679a8341531683df767537c8ef6ef68c32a79111fa83589daebb30df42e19c0a53114b3471db27016aab76326681475cec6016ea96e522ce3f149326b74b0f0104e502ca08ee665b40d6554d079930d6741a0c486f6c9f63f75cd30faed5dfa40bb69c023e260baee07a6b9880e8e0de1f226cf9c642e3c35081774749772ee0d7c71dd016844ba3e21939fc9dc5f113d55e07b7b666d3c8a41bd97b6fb9b79429a51438067806590637aea8fc8c15a1f2878b45c5321e98fcf8f479f543107e508289124af86ffedb672e93039abde997a4a3868dea39f424c25c7ed973a41a3ccb3cf3f72cdc2199238c7df0aa9bac7cb84fa8ee3c7686ebe693ee0d5570d134d1e5a2edf7b5db77030ab55f48e92efff6ddd0e0f6f26bd7d7400d7a8e0fe4f8c092cfbd19b8cdfc48dad01e69ea5436147db8243bd329d91952e949a4e7bcb0f4851c75baad51674d911577bcaf26ff62637893db77b41d51d4837ed447ae8a3d3d1915b4a7532d57ad7cdc724add59879dd81375a2ce919322a326aafc2c3a34eac49dc83ab2b2a4552bdfbfb890077193250d02895ce468635807cca4c3f6dea98d443bc33d7fec6267ba25d1b085db7bcfe6f1c05f333779999306d9bd02e91afad1174e0556c597c3f010101104957f391a51d9a68985e17fe21545188b2a33e148b167877acfabf2f34b219d0abda772142a226f78db7a3a8504f326ee6a909d49655fe2a4fda853d9ff0bca859ec2ae2e69b9d1bfa05cd89b34904bfe6c08fb80af77bdd8c81a658f6d9b6318f6d2b7edb96e9f0efedbb771111b75914e6dcd5c7ae6ec370d32db3418fd6d6a18abefb6beedb699c43e1e1bb3df12c3acfd3fb2ca83d7ff9719e1931adde3506634d8bd3f17756a7b7e36e223be51e3b9cd647a1cbd79d9779e0d3334b8e1006a96657cf3b35b31c778d67ef906cae90b9f05f5dbf6295f0c2f000bb33dcadb9e6501757b189e92bad108778aba3da9571dd36f70930f63b3018627bff4bd6ccc16c4caf7e003cdca4b6f6ecf5b6fdb17fac05af9651b56be95df3cec5bf1dc1f876f10589a950f9906207fe6019175c59b7585d0aafed1fb9538d28753cf38c1165c6cb105175b6cb105174b58021296a8ca8ddca56d1f1b23b948dc2eede3e8fd3c2e7729e4405dd5a6527e1f8755a95851e5873562765d01248e64fafd6e67509c39efa6c715c56b92e735c6e8eea677d3bbc9e4421e9465414366a0f8281f3293ba916a307d6c750ae581766665307dd4818bdf4ae824ec0dea425aa5d243495edbcc8d25520d5c4a8a0a4aeb686736e274aaf4ed6d25f1306be9771063163bc3037523ec0da73b53a2a6e71e8543c970404b1d173235ecd7174f287516f0a196fe9b1536ab592bfe7297ff3a8af398091793289e682209879a1ed76635cbab974a26520da577194aa592d7ce631f262f878879a9c59162609f82a564de6a390a4a8b7e212ba1caefd287adc9bf66f5e04c6f3918d17dbde52d8f383dcf42e9705e0df7fe91a5d8982896860d4c6f7a2e762a1e0ff1549437c5ca5244b13496b410ca054995eff25c76031af26647dc91e988368b25091a7aebc52e57abd5da18f932bacee39ae2b98f7bf4220d23dfc80e8f9b6069c82f799eb331de424328a85c58314495fec3175d22e59095f4f56bb9155ba59df1ead2158548a2ceb21892a60f9b8b6afa52483598de5f516865307df14dd3e5f22fe41c16114a08e771ed7268707a5c51a68c7cc6e121a47cc93925cf2b97f5ec52d881ca7d2db4312f25b47cbf6251b41abaeb6b8c1aba2bccde3f5e18d3a77ca6277d47dc7714361255964c261e6235fd0ea66afa7e9fe4c51a4935a07cd124a5e97393bbc9d43cadd5d4a12c54cfb74c2cd6f624afabc96b16cfc6c856dba0d56a75500b610a94922a7f073974f097077deeea140704e5ddc47513a6af79b8c52d6e71ab59dcd74054c6556e848561d124cc2ea81755ba15a2102b5c1eb431f2252907e9596040a50ed247e2ca4ef8c8f4b9abc17518eedd036222915c8b2a513e0f6a50724f105a4ddfac22553e8b75040aaa7c3741952e57e5d030f2bb69e472b2af23b9d2cebb224b3d1a94df75e5243bb37d39b42f08cbf8459f52c7c0e2f625fe56f71cdff1b02f661d71aa6c81057769911103c50263e5a49282424d2552c76dda7c6e6eac05cf859f5e6bde91ffcdd39ef33617afe5dd7379163ceff8c66f6eda1bc755fff23b87d4c5e9b3f3e7dca3bb772c782ee848f6a2728b59f076a80047aa81858fbfb1f01163e123f6bce342c7233a3565781bbbc4eda5ec31c982c73b2e1ef3708fc748d88705c68ac7400dca3f79dcc463578341424344dc796cc447eca46dbc16d230f2a7b3ce10f59f8dd3476d94437f83dd9dd7ed99cd99615a966933c37808ebb0241355a7533a9d5ade61d6ceac0cf38bb371e4fcee9f3db339334ccb326d6698dbb4340c255b20610b246c117baf9b4368285f3a501d0d84c88c65856df343f9e84764fabe6efb3a9d7923a4869247eac81d998412214b0bd6616404a0734f2586b704049646c6d4825850b3692d27278765357966cf44327d603a18757e9395e3aa9944cb899f9683ddc823cc460e79f2a50d69af1b5749a22e729556e4309a4da7b42bb42036a5052d288de62ca21e5792004a3004e80840aa918fedd0192f74d3eb564676bc8ed560f3d8a0ea170d692e205709add40c3502a9b9503d901b564d1e6f0c3769ee85cebd96cad1e8dc935137ef88ca4bef880c19df046a06d018557a47543e7eb3009d7b2c95cb32ac26a548839d01a010b302c51e87ffc058292bcd9582a34e695b57a373ef545f42a62e86142b24928e59b54f8b31050d5372725c858272346de80d2a0547be34970ba9a1e6120263090d53723056c5be70ca1e15a95249598191806e124143390445c23e96957ccdb5335d0c232396154b8c2296957c49a156a960da2a48478845d463e4d312d2802611cb4a126939aeea763a1e6dd521d172ba241aab5ba2e5744d349f2e486b75421a5026a3d399590ba926fb345736a7ec368d3b4057da3a89a02e24ec4bc9e96a90692e2da8552a3add4eab5856cdb2e2a148505d926e49abf6735fd835a9cd02d405b1b83a214d68e5aa1351c3f49f8c744e4ea8909e21b5595647b0b4568a00d51523b53f6471d54e3192d20229074bc5bed3508c213001d358aa8a9752a461fa5d20d5685f4a4e0fa8f6d8632f2bf751a9655b023af74a557a475a3eb6bc6cd22a18dfdfe2b1ace6cb9b2b1f231b32f2255f289eda3bb57f55c38fe1c922154f1e799dcbeb5e0e235ff235d4016d4cfff4ba9cae48b7f23a2355d8d46e774cd66ddce889503628d7d1563ced75f2b421520e54edbe4e47e53b1aa4e4744375eb8c3a269ca0f6f7775cec0d2d8769f4b3186995caf7b3ac543c0d00a41af969aeee0af3fb3ba2aea853b2537167785ad5ed344c7f50909010119191937e174839566a5c7d5be6abcacfc9a75eb7e5b44ae5cfe94052cd7c90a42356ed0540d2b152b9afd31901953943b59f03493174a6c9dff86584a89cdaaf496f7a19cbaab9ca2c373af7340574ee4d6e019d7b59adddee8c0b35955264bc4003066f46912980010e5003012eabba00e880e6034a5b40098efbf0a56e78d2342c6af2b34e88a7e9fee3b86ec68c7a24d12053b5dfedbb4e7a2cbb26c92053e367dacba891dfc6b20588cf7930b600f131efc434226bbf7d5d83fbd1e8b3621106cc1d5b3c3d4eb22ccbb22ccbb22ccbb22ccbb22ccbb22ccbb22ccbb22ccb32ec67d6cf39a118866118d771dc478f7bcc0b5f2a462b36491f768dbb375e9846062a86a13c9755816e832942305269737b29e539e55b0ce4c87e3ef8c2371c00a2a8e92b7d5dc317520e07dd5194fac62e851da83b788ddf8e1cd0f8e1b61adc0e8703e18afd78699181d6ec69cdbefd62838e1581a98464df12d8af12eabc3e6a28ff07aa4aace321e0682a04c7719b227f914c0ed5f5e6102ab118638c7348763abde6eca68e8bcbd01cc2ed10dadd1b61a211f573080db11dca5fe8a2c385a270f3bbc0104208539802d68486eb9273528a42fdcff678b334fac39800842c547ef5c4b02cfbedf8366c78c4de194547d00eb640e4641bcbcbcb524a29a594d279654bacd41203e6b1a8fc1d60d4205c8fdc4c1aedc369c3f638ba46a77880ff2814c5c1e36f39efe683e02734dab711113be591bca0d355429600c2fbfdedc664bfdecc6cfc9381567f2fec804d0de2853f5eaa7bd863fb88c716c3324a33897dd6e0c68dcf34fb73a598a2faf02c7971fbb21f7f69f877b8aa65bf9607c8c73e02fef1e3407c7fece3c01237c477ec39e02fbf965d9a28d0f02b93eafe48e1277aee717713c1a11a942e279b17ac7685b0ce0494865581bb8346953f43837207015665e300557e47040db7b5c355281411344455f9d8d71243f74defbc49aae91a945cf78e19862aa9cac740a784b48a85d50d9dda1f23aeba4243429865c48b1a6ed1ea6735855cc6421b5562445655d6ae3a828648346044985483f6d873ddcf39b0df1e8763ff35d31efbe6927468df919ba7e1be16ec976646c3c86fc19e2bf6810dca9543560aba3f37c8a9d807c16a3f33ce148212ba659687a4edc36122f3c70b139fa170425005126bdc2635bebca1c19823e6b031b107173494a9c00f1de253606fb8300dff6476c67b5da2b750e34b1c8c88162f40e2a946c59ee9c660157cba580e1b83f5c08286b462df3a605f015761ff83027b0307a681cdc7501846310cc39e9b1ee378e1c0010b6a178831c4686393557fb934fc675733393fc8ac7263fcb150033566cf4357ed8b1bb30127e5883546d94e38be60983f86f5b27364676f991d33b8bb7b16831ad217308e94cc8dd3a0fbca48b764ff35be6bf916f94bc3f5ca55ddf6b5c4cf590da2eafe183d31bd8dfec5154ee8ec668cba3f5f0051a3f378ce6ad07ffb81b2a620a446ed0af4695063bc01659cc67112999939c618a30ee3304e17abfb7025e0dc334c468f913a814dd153f7678950ed77a1eecf922475bbbb518beaba066b4c2f88f95a8cf3b7f6e003cd9cdffce8f9174e0ed8d4fee9612f5f24b69772355831de61561320ac544cb33f37e061244574761ac43e09f69890ac688a16ab533054ecb9e52aa6c19e5d9d5a9590e9b3c4a8aa60d8304fa7f607084215a3c1de3b7a4fa7425f39924ef113aaaf5ce53798e3c419602f21a34ef563f1b196f87593daae6faf811ac4686caed8cf14ad0a43f58e1dd44150ec33ece325d40a1af6cb7558a71fa712a02e144d60edb46a694e95073ab19342a8fc1a0dc69ab830f15d6a9c4103ca2829d74f9817bbb8717b59c7617abbb918dda5afaf73ffd21d28b1315237c9158ad4702527c9158670e2c889a155f518c1d875ca874e0474c3d93518a46b40b119b7533ec45fd2d66ab01fc9c6cdb5c5df6952c4438e1b6b10c95babf6c72fd3d1866843b42143e690690433b38eadfedcb14586afc6af5f7624d504e9ed9a9777b99f4f757ba8f15bfad0ebbb8b3297b1e0410e0f6e769a40518b70a67d7107abf4a21c405d120d5b95df6e4c24751d0c9322d73048d774356cf54152f7a70a271555f7a70aa1caa418b2274fc28e9f3bb987f9101d55337d880d720dd993274f9e48964ef6c4798c526258d631efee3233efeeb2a671dbe6eeee5d477277f752a9c499ba6904dd654adddd1d05254545e574621ec0ce224837a03e9b4f830cbe9c60aae3d0f54150921afeab53c2413040311b3301e08d0de4211fb6918009862dbf06bdc120a04e42d5399446750738d842096ca36e8b638cdfb28c6871a32a563aa8a288e3806e757faa3062abb801014b9541c3807256c8a1a626acfc986841e4d4580821082651b40c9834e10465a9fbc3a405486042821e2640b810b4abfb0324851350aeee0f1013420084458c4041a8511569368a62940f01f4442b0124834e0288045d033aebfe0011e9163d7de143a02422f701256511040a238a3602153cbd032a8ec4f054978a20b2ba3f5490808a225a0d320cc33e1a838ec04a50a495e00b207c2e812243d5fd5912832548286989400bff0abab9099beee6eef61370fbd212811e78092c1aece50bc1344b48207bf94cb35fcb0b45343dbc5044b3ad80bed7fdf1e2c7695d13133dae9e56dd9f9e9e98ba3f3d20a8146565c89808ba3f3d40d4f8eb30dc32fd025536c331fe0468fce623d112c3be25a494d2a3cbe718a38cedddcd930323ccdc1d021aa3a4f244390c9b736a9a46aa89cf6ddbc671cc35dd735dc7dff177a6e748a41ad273a512f65b439f3375d144bb8d349f43e92611ba1e374562d9d4b694dddde5985432519418258d2bc7751e574e6ee56467f2b8d26e12a1fc1c0a69078e07af2735c83ed725c9e083195999237e080a13429d482319bf2f873ac5ad7648c7553dd4e3aa18bfef3eae52f97dcf7115ea97e5bb0a0bf617b1a93e1ae2429cd8ec3751abdcc6f7dbd541fd6aa11e729d8defaa953f3d90c3b4e977fbf516c60aa9eb52ba53373bf752aaf48eb490a814da91af940f278a4c6bb371184dd3865c5c8cdd3af736468769eeb1e631d675ee754a91941c4d4697795cddf3ad498a0b35060b865c451d861f5574d40d9d3c1929b1ced4b9176b96916a66a6699aabdb3d59515e07e4721819dfc269f0889cae48178591f695e7ecdcd09597c308354ccb5736b96d9abef67671df644dbaaafc534ba19d7b5c2d7927a25391d191139c99e29392e3303dac9591949da982d24deff43a099d884e4527a386e93fc2735258293a2939614a4e57f734a482dab83a5795ce3dd264b50c08fea350527ee1e491c16cb01bf9924345a8d7c6745dd775425a2cd8df48826a83328e8a5e42444374a0eacca66469416d8ddb8282fc0bdbc82855dabe44aae9bec4cd215cc3cdc73c2e05635901636def7244e5b97659e1ba3be3e29ea9ba564674e4153c8f72ae85165ae828ad5ecd86611206741ffb3af7502ad739b1e15d07d6507369da1cd25c9a6bbea64e833b2c9e1ef99a5a4c24f2258f64917cb5265f2c46fa6bb47f928e203f8ee65048c0a24059829c8c18dd22c3a507a0121367d5fd16777769911103c50263e5e452fa8e08e175c67c409b3ffb8176f7d749e6cf2ceecf6fe3675f0ce2753fc61823dd985d26fc3829399df6c6c6f88e318d1bfda1ec2ae51799c67e7cd73666b7e38cfc4dc9ad458cb13fc8fca1f1f7475799638cb1ab43e0ba9bc147f5ecee6e1b0d6ec7eeaed1df5e70bba9de95372422a47797aaa0fccbfbdddd6d450bccdc464d5499f9bb894d037d9db75d0fb5ebe40d15b5c77fb8c97a9c642ca34c87285b096539dddd5a90707a9ce8e4947ca2777777777777c7e6ee80346541609b29b87dd9ce5b9f27ed09d44683fd32cf63675cfc7967e47344980a4b546e870d33c48086322d1836a61f2b426536186a3800869dd1b135fb7eceebc10307ad0ab4e3e1aa24346caf6b100712d01db2d7d11b0efdaafdb7b50ddbb88e808a5a433e2f1b9f9b568ecbe75be0e603e3f0674ffbcddbc1852012abd887a220a021dd3e4079e030b4403f3eaf568f4ed197cf5105c2c10b6ac832861d7b41436c59c2babe9056a07463b335e9063f97450852770a5d5a46a8fed1a360fde003d57f80457da188a69b084faa851623ea08092dc6183da6c5aafd1d63f4e2c7638c31468f9d7a690d8944a8d7fd690227072f58829452ca8e316ed749e02496852ea97046c5917d3d1ca67f9e424aeb17ce9a1edd6b638c182986af3a48198b9430186576b22502174c56455afc3044118d1b55ff5fa12494a0a8fdabe40ab5bf9bd41fd5a9f722a4e862ca957500b57f955851fbb549bb1590c48d0b6a1084050f129a8ec29107babb87a0dd898a1abe24b1a9fe717a9255f5244ea8aec409b0c609238a28c1149290850a180a545822b351c3ee0b2a7e50475e9024c300010a202880a8ddeeee6e3483ea5d757777f7169e10aadd4eaa1b5d517dabeeeefe037555a4e1aac485daa627420c515f602302215cd0430222ac1620518ddcfc3cd1447581cb6128cac7073935a4af1d1189c0c1086480831434c007383f3d48d2440f6aacfbd3039f1afe1594a06cc38e067b8fc0feda0fee4cfc7e9855ed6857026a6751fbbb520a68fc91818de9dfe12a0d304c7f179105086a3f03c1c9f855c0478393091aceca8b82e24e34d0ce90ba2ba580cabaef3894ba38f2562fa9fe19b36c4c5576dbd424ddea250f581aecebc18355daefbfb04afbd849c3788abf21fecbaaf9792905d4eb51e5b131febb43c83929b56123b264cb39bbd9c6c6a6f2fc07842b8f8d61cdc962230d3a6b63fc995818ff28504fd026fc3522ca3abc6a70b268c82c1b95d5ad11b5ff6482fadb585f5f20315069c38cce475e2769d0417fffe8ceefde409c92d945b61365b22ccac85a50fef07fa4f0b1c18e4c1032bbcc1c82b983b3003b0df7a4505e0d462201f5b1332cb5bf023be3b5bb3bdc27d49640b6e53112ee69d5f5e130fdcd1d5a8a738498019477447bca81eb79fbbdecf73e8aee17ce0ffcfefd08e61dd1fed42aed5b7bf94d16d0e58f25e0f6654b5dd0fefd9091547e46d263a7327ff4a6b7df23077e1f9d32557ec6e11cd68f1c185566de1a6f2749dd1aa296664b82f6472712ece343e0b865d6fe7607f3a70b9a5bb045cb3fe7949e8f0667f021bf1ed2f321df47b78f0673e891838fde1e3e6cd8d160dfa03101ce49515bd403ee39a45dca971f60e597da1fc19a190c36d8ccccccfcd2a04b6587e9de8cc821bae97cdb0ae8760eab0a3205336806cd293119df012da339e14d7ceaa3f8f3af4f8df3b2645f42a486d493e05afcf7b4a86fba80cef93e3078e9acb3dd7f99193d63468907dd6446679d4d1910b461430a2fc2c9235ffe72ce89cd29e363534e89c9084efefe25424cdf82395a652ca10bd437b1f9631bccc3300cc3f886bb6d84dc604ed3cf37ed836d3ad5feaace2ddf20f18d9d61d999583d8aea7e45757ea2eb82c6e71e540e9dca9c48b8949b5403447ef61c8661518822222caee49e9e4e21e9d4fee4c0497553f5e721366a158300879320d9a94e440df955dd470748d490895ad57fbd396fee1296a4ce2ffc9a838f1f0dbaf628d73c94c3f86f49d0f8d18904a52f2b3426801cb0e365078e1d3e3b58b2dc1d381ce083c3013b70ec001fc70c3244384286f9893f3bf3fa6783dc97527ecc92254b7e1eccfb36744afab7ab988617eca136748a39b4e13c5fb1883935920566a79a144394fedad2e882548969dac603a669df9cdf8239668d75871e6a5c71fbc201a1f1c349833f7922039ad8a8d42d1646410a118d000000009314000028100a078462d168240d1459f40314800d809c4472549b4bc324c9519032c818030c000000000000204034180e008e7550c1213828a81ce8d819bbddb2257e300bde7bfac3c0964cf2ca1a8f42b0bdbd68e5835e62df8ca06b8701ee45c21d1cfe7f1abbc9c1145a18563e79210411346bc7414f3f40592eca68bf5af840f21435c7ed337ce952b4bb2667084a29359287a4f3fbe567d631e234af15dc2b79a240f9b64c9d225e0c3cc532f23edf8600c308ab788ecaae496471831f67b92bc5dcdfaed32120800f93f2076a9671f59b6bd96ac1207635bfaecb0e623f08cf3959a2f22548b82f3362df8fd7df631490ab2da57dbde1f621b5ec7a468ca648e36a635848333b06278f6341b24c80a672cd649ad63da5c934d1707ada02c41e221223447af3fb4ee15efde710e9f779f0cb222f7d9e4c858b615eb6776596aa0bc4773eaa655fd3dfc0af72cf3e9487b1014926c2e12278a96230a03f05229a6129006d37e3685524fdbbc5af702a58b5341cdf6a262523985a80f2785ea9597b816ecce51b08173eb13ff3c0183ecf5d3cd5c681d1d55130633bcac44464b4ba7238d2e2c754efb6534cf3db5915573c07623285854f8a05ed893e8c73e20347332a4a6f6de09f276685715a9aecf0edc642edfc1bd90e841790fd49f478733284d04d05790285011ef1e88c04cf68888fdd07795d403f3c2153069ac84ba39792968ad721429af5bfec9610caebd4009d6255f09bc909387ce04f95a254197acfe183a8c2c2071464bb65a34b9c197b846145c698e1e301c9885c69844f1ebaec647c21eee2ce6610f7d21278e7cd0258018e1ef62550e7cc020a1a333ab4bf9c196314208b361635cac7670ad1ebde6d9172e98c7c73ce54b09a5bf414278b6665e5d53c8739c71a1750d1129b1853e7c49d652d4117d06624ffb60d1e10e98824fb4ae13314771a3d3ad6f5486c978ff39ce9829fe12aa8a5171a25c9af3c95bfadde035b932923c2f01257a27abe1c17c417c664b373a65d4c0c07a233c72e93f64d9c391f0ca4ef9186700805c4eacc764a96b43358a9c9635aab614cfe57d6309a9e3a33b0bfd00ed1cd0e228f7bbb828665cea1e807164e3c872d7f0569c1ee870386f77dd31eb97529c1b97294bb0ea4620e17fc7776276b58914ad65a44a31fb9e105eaefee0db2aa243096de309b6fc63267df7f3d3907a562bec040a7853d0731384564c89e88b1943a77d121568dce8a6e2ed46887840d0997f01b5b8056664084dfac2ffe0a97585e92931a1cde7c2e26e931bc147c17748fb06e059e4c0fa29153aac39b8afc36da2171b04ec71f70d999effcebf2a8717661b5a3fd1cf54ae1f2043ca4ff22d39c2ed85ed604759c946d880896b092276ab84b7d0c787e701c7940535a810bb562c13c553c7511b5be76214ded605aea0b8a472279569f419b7ce4b127320eea4e0b214248d1bdc823c5a69f2259fbd0609d8a31f374e1d1a622b633fdfe924f5fe76840b47ac0323f298e5caecc864aa0e188bee449588652699a560895eb5435f0473307b73be57044c3d3dbe49b06229c0b330bfe958ddc670e4ade679ba444e34a0521e953c3e5148644ce26dea1345d2f6656659ce340da165e9d70eb25f7e1d88088f32703ea25489cf5467b8c37668827109514d178cbe58d4b84b79c88672ecb3dd861cf8318691cd570349d643b29c3aa7cacd610b257c85ff8cf5de0fa5a031d85107aa9aa768c61cc0f19ccb2a9667da856e65f20d07275411d3496a5bb0700a29fdb53023014c5b1b7a826b0b748d6640cc6eb2df8c14e27e01e979d85d210bc235040ba3bde75ed081f0689c01df587e346827d66f0d80c9184a85d90203671e4a0ef2047a523285820be748301442f0dbd73d7378040a09b350322c24bcbb8d84d1724d5fad0dcf8f61a4592bd0235a422128a914aa54e512b7a2c641535e4459c0dcc166f2df0809a3d0f5bc3d60b5d2f3a782b713a2e569f2cc2ad673ec34cc61ad0d95c2dfabf23ef46785ab9a9986af267c90abc21b75b6543731ce6bcbaa74aae850a6bfa2f03256acd507215d7e58178c6718a1009300c5f008a3af1dd7faa0362edef2bb77e2c09c8ece14bcfbd7ca2a96286f65d54a1eaac33fa675054a994844746dfc497d2e71ce34b92c531828170c0c4f2999069991de8f36c0920ff516c7d538769e0f67cbacb62863d340f27ab228270c526753c97303a774e3c95b7ed8ff2d765679fc1fde9122377325a273001cb32725eaa32ddb138bc455aa1040dcc260bc3ce26f73868bc6fd90f24eb77c06b761d1451288a978c43fbd42cb6fa33f64cb54e2fcef43f11c39d6bebcf02905f03d0075666331ef4dd196eea38dc6a4fbf14ac8d5f3d4dae7eb14e6f170c4aa5a574733bea90ba300846fb8f77652a0f78282080d1da544284b27b0fd7cbaddfd00f9ba8fe12877213a02dd70051b068a1f1e554082b8cfdb3c45533aa3c191a2bad7b54c1ae2c0a77af7cb1a359bdb25792684d18d68fa21e141993859ef3d851dec88a7c88f477abe3fbcc8e0857c01734dd27e83b0c5a0f325c0112e18061f2ac53cd2ae14b50e433e8cc6df0c01aa6ae37326866cc2aaade568b2efc62709807786464af494e531a61293702fc78ecf495bdd0a3bb6802b77009f8b850134040a3ace5b4541b5458011b84d6c8e5a029d98848c3ddd058bb8c256bdc46fc8c8c1eaaa68c5c2bd333ea28d2c4633067d33e41fc0f2272d230fd3a27acf3da5dc8bd1e824eb2b296407b94c63ce1253eb82e45271db8e8419c61068f1fd4cac657330cfa294988e5a5781d44f635aa165f89b114a1bde67fb8c1842428086164a29d980219880deabed9ac57f3265180886ac3b5a6b44fafc6c75ecc9313b2b1d506196232aa78d59b683d141012f1fa9113b3380a2d2c1d56bc75722a2e2599dfab1511d5dcf429fbc8b49dbd6f9306cc1581a509866946afec263b8c22e0e087422726e84d3708e3c86ebfd8aac802d7179bd6caa7d86086e6abc4649a882a3e78a3d94964a6cc8562830911136ad1d5c89bf75784932d824976f83c222cd8a9d2e82259dc3fc9c6a22447be0505bc96cd41b735c27899e55a93697109b3eadb23a7a5e8ab5ce1419aa101a7bf884197a918fdb74b069fd7631d55abfcba2df4d64c8f8dd8369d76c49743ac06c9496dd1f47b962e95a4b6366c82623d96eb81053cb24afdd06f0bfc091b33b8d6436d44630162602e60578eb7b9c00e48c1c6180f5cbd6c870dad1efe85a8192551ba653c2d39885e3eba06a46d4d3085d34a9aa7809e685c7a7203381689ae895c93ebacffe1af3ce3586e391861b7ff6a5955c2d65fd37c15ae3cec9fd3ca19be764562e3c5e40a676bf1909ac567e71812be714fc2533943145e7d84b411d4e6af598e490a92312aed362e32253690b34167386103c304bf45a3a3e80e26d02d9c776c3e231dc35db685d79cdf0315d4843ae9a18fe88a4669b61c882c484b28b65f23a45d73af79c9518476e3886ddf492e7943b7ded0e7c134a5296e630134b1e0492f3bf837eac02298bde0f400378185e33cfc9a2887ba63dd6018d92c7eab7c5ffac4f4a08778a3dfa5613c12ed7954fec3aaa8d29ea49ac835c8b1dad456711dcf96ff2a4823db9449eaf5d47a2a44a030a2845bf4332b14bb78824bb4551e1b8ffbea249f503954235ffca5b209f3898ff226099ce585187704680d986e9841f23fcfbc5d788314ac5628ee714154a3536647fcd3120c87e3df4d709bb8755aa33bac549de404d582f4844be36a15bb34f532a861c91c24efd220a654b4821600f314fc3834bbe1d94f873f78297daeb4818653a38df5c334df2e49ed8ffa8ea180dc4e5b39c1ad49e5d3e4bfaef386a703b581a7c0265bf28b3c0536f6517ebe5483c8aceade15c0407c2e626f519c9ce160a4d7e7bea9f8b73d347dc2a1d4ee7290044c261ff73381255a9c8ab86c76bfa1a5335697e09046a024600c0c5be72d08fd324b1df323f34a0b3213286093c6c3af4ff1e16b3e65e033e8ef780c3510cb1df98c3f184dc0e9189eddb6ba19a4f52db58e827afe788de6e8a4ced51c427698fe33e43ca08d00ab90d9549ab5c0a4a1dcd9b2faf214c2cbb30b0170f1de8d535d4f14401eff118a47fb083117f7089ccd7c1ae555259e2725dbad1aef30722c4c12ff61e56f956a4ba970fcfcada26e19ef0f01d66458b41bd757589dd0674e4537a14b603c42dc635330a09a9497a5181272145142b5075f7842137c2abad0c20b674d9e75ad8c9fee3264ea131ab893e8110faa1053eaa53a0ea381444490a682bb19808f0c92d7b7e5dd1ba2d1b83a466482a0062f8d82a177b0d9c1d9e8c54b15c14284c54200586aef61b07a42521872fe42d366df264125323464579610c9fef5af34d22c45e3132fa2f9a7b000a2e61ef884d47d94f035e3c458be62c70b17042dc762b24a72bd0382abb1a5a615df1a1510087185ecc07c8e24714029df9358870b73fca1379f1fe4e171c47bde3a7302bcabe5afbb0480f36dc53483b24d70b76d262d79a49fc5d6bb100ac16f7ef77453334ce0a84f319382e80f9c4b0b321e539ec12e92e2792de6ae3fc4471e8ba0c07914dda789f34f011ed4e8d6fd4dea5e6f05070f798101a7237d09f0d4002698f507a942714491c20227883a943e08e1c0a5bf897c478ba38f5ee9b38cc8f2d20102e2bb49b10e1e481afc3fe94e1c1883a27af45c6cadae6338fd74633c89bef49c768f281b07585b762b49462c45c4342c163939b3665542255b26bde78faac7825d5ac0db5015126966b9dc0b67a2d74eed66191e647a201ae69d83f16ba4b503527a5a901614528a4db50260829aba72d40e3c41d36c49078494b0171603670580d881e3d6d2ca1059df8f8020ba9ef80b6764ec6a1f74f0126b21ece5b537a4472bf5d022b8a758e9d59c244666b1f049f1e24b906b15234997c1a36690548aa432528f2b50200295047c8f223afc4697228e73dff7bd2842c41788ce498b3cf3e2e6726ccb6cb4d96a4d8436deccf02757071c5a162dbb707b26e7a10e02b0628a37cb776e40439e233238b640a5e43d3483285b1376398fc990e7f83994b3d7d663c8661b22534e0b40f3bf8906d1f473c792bb1009ebf17bfe59a08007de648b650e2690b4abce39ad0b6ff86e637a30428a68e91d8447eec0f53f6411b251f2763b05040f87f9c30cd630e83976cfdceb9d90af9de680881e26403c142f0efd941f9bced930eedae7688c8399de6be8a8384f36f63473e6354b61ca38ffa8747d6ca2a9525f4a4341afeff79d6e1188ac8b79f91d075aed7c5b4ec8e21d042353672c5e120b309ade504fbb83029b3e58877a924346ef312d22dc661f62d157e25561ade5357e0e3f334d50ba0817a14711447f83d11f1810f87ca0e0c5b6233f98c8b3e4e3cbc47128a65c54bb1bde1432b4ce76c95f9b2444c637a521291735a135061f86ca48e7c466a17bdd0f7ff63b6bb7fd74aa0b2ecc5950dc0db0cbb0d34612d251b052e68708e466ba31736de461d1da9b8364bc69a0caba6d6491cbfc835d898ff6fe6ba558810a7d134b47b13f1d36072772eddf3e94e230b502707a9e65ab70cff17a553247a5010d8ce0f33b9208f167e9adbe42d1fdc7e09835098e837c6655343e3b3f2c99294cf8048bf587c52d14d4861f9641d88cec39c10b21a42a6de8af12826d5f71a8df0e3ca12b658cbc0fb579b1052461b153f14148a339759fa403ebd2428120ba7280cc8bd960c3ac7767bb8987182c619d688c51a8d995e2343cd26fd10a30fd282bc98cf788a296fa98e702669c9d130f239bb46111681ad5481853a8243f289d15e6582ccca09eadf96ac62cf4e13d55310a008fdb2d1674f3584e73219488bbd89bf1722e3c3342ae374c2461c3d2037ba56fe80ec68ca78362448ec625dc1123fcea9982450435b3a1103f77eb858c86965ed76ad69f8a5c5f1d6bdb0263fb3f4a5f9174aa3272aad2f8d82958c0351102d12045d0601b2b8c68df1cff5ad3ea5295200554b65b82c4454f4ba706d16a102502a91e45786f236d2f04b5280b828eb5ea454dee3350c7629932fcd609e2d3eb13441b4e9708d9ccfc5e4f4021e5bba6f9951f6d66a20de992e7eb8230124bcddec3acd3b53cd8ddbb67d3262aa09a488fc154f511baa126bfdb01dcadc1f80c665208b2949b145daf8857c64ac075f08c8c12db71ed7646d0ccff92564ad7363df5e8c9f1f8ea9b444d1ae77ce38a9811d4f182c57b2885f40e05cccac93a01824bb01e303d80c631a4b37509d9f03fe1b9c24205d4b8a777750475b23b45187ef10b050e6405f175933d0c0aa9e2c8d1acb2a48c65cc901f900507e06e2249804b593b415b3f419901d79dfef3c6d2422f30b7634b0e36602719203a76ddfed0ec728156ba349cb2dd5d3621736a27e0efb599550c188e72395601cd899391c6be909e3700da902b942d8381627e560ba8abdd466d8c0f9e3ab5d6ee29db10fef38ce091d999958e203be91b441ebd4d0688b358743e18b78251700ae39ba034c26fabd13764c08a4bdb2ff449e483f1ebdd38c9bd0fd7bb21736831e218f65e28818c4f126b1f1451f133cf22a2efb121f38416eaa6d8f50071064d142bc300042031aa2818d979a68c092d62f32c42892383068ce685de5f43730a9cbe33513684b6a2cdc52ed702769f4eb4402509f98e2ef847a896e38a167d29f2b6b85c189c101d87121da5fe5a325ca9873bd0ad6801cbec09db8d8ecc6d1a8f1761de52df6eefd98d8af58a2715fb4ecf8d45d0cef5199c937d3d154acad1ac100ff41f459f3a8615566f840288597a9f2e96004e79d776c7a2485141d92bbce0471c2ce8fc77be40b46f594d3eb446d5ee2ae23cebf7655a603b129374e00d2cb87aaf756df33c02d3817867010d9bc92191f25a8deb612737a195951c115a596b2cc2b8052f5cb3b7706e9eb0c6ebc5f8636c513d88107409ac388f3a24628f5e396b4691e18140766012145c98a22221d53d238d7da30da84699a544e98db704517c66eea54eebac5943563f20756390ece448a20dcd61c420e9ae42116e1463c856f86610ee547ce99c72a227aa9168f3268cded6653efc86618fb4135dd0299d7afb8a890e00644655860f3724134269150f55d3a967f332196254414f856bb5c06635a25bcce443d920aeca1d1775ca68e57ed63ca48a09602d6941b1a4f4b7dc5a89fd4f46889d33bcd8353dc8e9464078268d47750acb3a826f092919d70ed97c8968038486c9e2c734264c0da9ffe1b83015ae67fcdefe38f9150a21d577cb23c4c3d40bf692b3ed65009350965b6aa8dad51fff51bfba4533f7569837b737614b263501a02897a4968cbb441da9e6bd3df7563671dc238ce493e089b48417cfc2a16e4314ad2d8a237ede199dfd5698900f7b64103cd0e8d3400a34fd3c4fd9c48ad053316f131a2fbba339ae39f3174c51c0c098a5851579b698513ca6db497f86966b4eab53870122ec8cec2c9d351121aa3fcb3c5147d589c4c94e5cc7f3a381c346120acbf9dcaa2992d03938bd0d9d2694bf781ca122564c6b1e00cff8e6b510144d6f470912a7724f7f2d421b2d31720c0554641413c2465d1ac034425c93ab52e72d8850feef83c5d428310e72507390e3f6382e2d481389e232f90de72c219cf778c117d2c97996e1bc966b83247321449e13821023fcd44015a5f8716652a9612115d8592ba010a7ff62e6ca091dbcf1210e652f7907399d4bb1a9ee5d46361e2ce4dc6bc8a0d7cea6390d14c0ba6c32adeeb228109d3011fc605296f0a93c6b04c6ec7c6b8066c5016ad70e26e599d0c6745c295fc6c2cfe2869c29ea9c6a035474140b400061ef2bf88d98dca4733178f72e426001ba4bf761894f6b997d1979dabddfa89fe359c9c7d9a95293c747586868fdd6e3984860b0beec5ee4aa85b9be002f3a46dd1a7ce69ed25fecc09b735943a835fa22972eaa801b139131bab0fe6824296378ebcd6fbd99fa36adebc4d513b704fd263a08a3f00e2a4aa75355ceec6387b07f431e915e4eab4522e04d68537b94154053e03560e1cecea4305a6ced2c8782db9eacc98c7f07ef4a702906fb8457429c2b071ad8d598963c369cf655225ba2e7a17b87afd01c10e6e67cb6150d3a67764d1dd8fdf207b0f6dc8666bb610a376fc17a7884767480d63f28699d2406c01866d0604489fa6b2f188c783fcf98a6c9382b158dd2c6877daa9690bf85d00e71d50d65f31216c9d4c6640cf9250f96f6dc43647e90ab33eb4bad8005c7965822572724d5b6f94d680177f9e597ea9df3d0e893c645fa6f907b027c80c2574967fe29545c193da01c8a0a3bff8ab13d3ebd0cda9e9e5d58f8d29dada931fad47ef1fc47839824634afc1644a345f03c51010732df28109e5852e7f8282152f2709c6f7de5b5cb465490acb91c08fd1596259c743c56719e73511773ec1a63e0023aab8d60d7db98ed2d15940d9f98b171ce576e9ba9c52bdcf98ac405bb6cd1f8d108f3ebc53674818970c50a8df35d2d312fcc6bbca0ecb8cd4b3d8e485f78043c7add26dd25097270e7ea0d55c81fdbd2798621080d6068d851afea264c81c259504b04a66b7ec0ddb4801523cda96865acf5c51b97343f37f826afe5f5cc9130d30fca0eb867c040f7a0e48af804c449881720089fa00614f655a2978d04327d9a5e97880522c7a9fe1f44ec0ad50b1f3d600e54498c9d2b6573dfe403be1e2c230782a1fd7ecbf008aa57c6b3c36c1f8ed37448ffad11260fd102c12c014723ae6fa2881220cc4183d3ebcb8e2d6fa11d515b2832dd248c4c79de156c21ba18793a34bc795e19beaf506383455e9f6a43ba92dface4a73441eb0434e38a756ddfc60ec572f8d6e57165f68377193dd7c40e1457d751c0a43fc12431f4b001a1575395c76a095f4880f54149aa5d2bf33589245831ef1efc61a9afa04ec072a65150e7dc1675935ffc7e3d19cd0a88b92fd198e2c3f4f7166e63ba490275db3e0fc446f237b7d23e010ec8801eb003839158a2657543471ff9bd20252a31572c50a4370e6e5ec63d44898d6253e1fa10ff92f380889b01e7f73eaacfca9f44238f36b98cac286f8cc837241b87a69bfd477c804cc9424b349e432150ce3d5d0815e7cd0e82768672d3e2b52820bf6cc79bd96736f97195e0152bd2dbae8110ce9decf52566d87baa06dd23f639dbe7988383fdfde71c782df0d8699c044302b8274683d30d11a2e4462ea138fc49f326b4a0f1f340110ade96a347370fc4fb0ecd420cd0811dba5a1f29ffe89842c1c4f602668ca7164ac2e83a7eba80ced458f6bf2c571c9148df042c2ba9ef46f9840d7e48f34a5413f24b9f3aa3f02bc3f2d4ba39b0edf19bc50893755e7facd7fb1aa2c882c9afc89cf333a711030fb73682ba9ad4f2a08cb700c1f6315045d68b8d023fa200c0efd62f9d33fb0fc738f06b0c1d80960479e3e00f0a556a4183fc57cd4636f61f08b67d335dc5cd64fbfa28b2c985131b8c8d548378ea0bf6c0b47d0fb8fe9a69ebe4f4f0eb970d923f497209c68a6c639268a496d60a5c3a172466be82a46374b90ee2929abf8e779adbd73446ccfa5fd3f9c6f18fb1fb9f05295dcaf706779e1622712c273e35d0b1cdb7082eb63a3ab88211afd51e1286a463ab1125b33330f5407d64464bb9580acdce7e8ca58b59cf2917afc35a8be8829934a9188e6dc3cb4561f2e769a132409d7f921340268a24c19a5338a7554504153b022e71ddc946af4dfff63e4b0d72636488e6f91198d6f7f3ee00bd5525d2817eee231442489e89f2936972a69dbac6d89ba1d8ade84d44b167b130059178d59d53cde754c73a0c1d2785910c90ad1c4ffcb618ea33e4b778cb6ec3d7cba68babd1b45326323623e267f2c5a405f23b09cd09d156b79f6181a7ef3014b69cf1705f2fb12a5c9c6cd92a8010b84effdd52789deee373cba101960a507f0d36c9b8d0e7216d940d64438d919315fa3312fa2d5b963241207876986dccda3cefdc8c191eb07b8fed24f3bd7d7b0f5b7a7d373ae394bd20400611211aea3c4752265ec31a0603546ca65ae32cd5fdb600c0ecd5c056cd919563f0547439123797ca797816cfeed5a019f9297dbc08284cb41aa35ec3a299c0ca5c2156ba427067b7d9f147bbd14aeca49a90c078add2e69acd3ac46076e0e1d0165073c4f92a74f6f27755a15f53af33e72fea9815112031df1bcef4aa978c4b6edc5bc1536d5ceba58feb74147942b7138d96aca4f0525516f85afe6f155c39b824f0e00ae4055e409b430f2bcc6fc455dccf776182f2803ecca64390377629f76dd7ce2acfa815ba458afbfebb8822c84dd783ff7bd31aa50cce27e4c1d32817f73658e500455645c136bb054cb23c4d9f94a002808b6612d2f35afcf4e6091101f06b1b8ce6f6dc06089bf0abb97349697baec6b784598cf9a4a40dff3ae7dabab8ffc853c1a7b0d6da9efbceeb0c1fd85be611fe4dc315269c3d338f39710f67cf994a18d3e429386c7b8a3e1d911a2536ed049f9369342b2f798a4b255f811452ad3b558491e5f40d2cb6e9c4b026f8a946da49bd0bd5c06874c508034616a4007c31e1aef56398292887d716aaa1af550acd321653559fd86836288598af17486f560da16dc821f4d995ade621f566b0e0ebed8094d53608533b6068787d8b62c9777eddd6c976fe24a53ea48987220951558c7da4e5f9c8c9d0794c217cd5e8c991ecd5c72eea4b29a2773ad0a8ebf047a903ee35c20c4c1ae309ea65c91c4bb6fc8818a220332cc57bc6a6908bfa29b5c22f7e1599fe7894c09c5142efdde1010fceca628620338eb29b388ce44f8eefc6eccf04f6561aea6bf56033c5e39dc2e31bb129d31e4e69fa7e8ab45473a15b86efb71b806cee62d0cdd42a1279f027285312f9ef453dda1c06e8866939a89dc56566ebdc5fe3084723554e89afea903e4d6b79c016514d780d9b0f0b8d1d51edd406802f51176b3fbca1c2f0e9dd0dcc84e75a52f562913d0a8b63939a7a756b146a449bf17b78963bd0ee3fa3aed62470abd8fb211bfd4369d487b9059eb9aebbf20c61564142ab091395da951ac3784b57aa52ecc1197cf25f2e1c1b2e49ded0a46236b631b3e1edeeb09d70b94e46993a2cf79d0753105c45c5df1900278705c1a063f3fe6c0a016d9e7c5bcd09ba684711166e764c9a43c136ecc90f9af10d241afbf3f7408b0eb6f8e3b5b51c647a3171bb24108fdfb6238dea13bac759c8df2233f4c8a8222ef2afc5e49444dee67eaa0efd7eae862904475ea4558588ed0486752d98402992b128c0fdcdb535cfbece150f7bc570123e9f84f20380d69ad2b34de0d55d0a2c059700d2c0173112c9a03a7c91bcb0031a6841ef0231e88dc04bc6ffeafa7a0e8b9871613230cc420583aa37094b987ac4cf3eeb0490287e1f8f708165aa7e8c8d4cbf9c195980181bb50c42e39b21937131285fb6545ee161014b38a9f224d9053fae3de53d75a44fbb418d8d65ea08567b7acccaa63c179ce71f561b36febb4f3499b3106e97fa79c444ef3e92d064c31b63b479a963b228be266c066faaa65ea512228f53e0735568ccaea0773e565439dd8fcb49841d543ec7f90192e7d34ac24e4708b6ba56f0f5ab2c11abd88db8b176e6fbb2742dd8bad191fd8383753b0298abb53252877b6d2d2ead57ad352777de67a24a3b3edd23b908a567e3d43c2c56cccdaae32f558f884a01d5e7886af99fe64fc834c844cbd8ce74ef716997cc531235e08e8c3471953e90073e8954616feae6c92d44946e3000131fe74b0bec96b6c6d08678285f882074a6281abd7195dcdc16bcdfb96637908e8ee4b4d7e1c171bf83e9833820b7d1ba8b917a89dbe313115d04a6f0e9d0f1fff85804fad979d836856cfe731f5e085ddc4b5b57b93b15cbeac8a5380e2ae9df6470b1a98c11b1159d63c6dc7aa61598f6afb1a9cfd9086578ec1adeb2d1f2d43dc3862ba511bc7a5459cb2392b1fca9d471e983bd28e2cec9e1b8240f63491ff609c57f7c25c0cca3e5d9d065352759c03bde531e9e8530364a14078f526e724b98caa67fd32f89cad7f6644291076e148da0d59067fdf0d59f1a0a08d94704a61502fdaf16a9cad2627f02ea3bd5cd3cdd9a3ce8e94151f36319e96500a2325c88d5300241d908909623bd2346984a97cc905c2cfde79a6cbe4a3873193885e7ae618d82f31b50fa72135c8f1f61407fc3fea34c082589052ebe54908c63da09b4d1e2e674f038e3b2c53a563d5501a9090d71b5d323f1e61289ad4e0e30aff5b423e6909ef9e687fc110886c1e118389a1f0432f1bc8db82c7183f3e49c5873d1aa721bf9e1ddd61c306b8de40594c325089864f128b5f029db1055986b4bd9de4a7f4834a5d3630a497901817dbfac889b69e934b8d08ad39843c07cadb68a577890e53c605b90fdeef549501b0d16bc5e6d3c0b3d1edcdb4c78ae4a746e7e84a1ad1f892b7996767b4375ba17d8c29a680f846d626e5f322a70fa02c3fecd79f72233ca4f7184e5f890f54a49d056656b2fa9f20c1a706e01cc7c507667e379fdcc23edccd735dd41d7f88e51ffa51d3dd6983dcfef1e76847b67ac620d6eb727b03af048fa53e0146d4c93831c4ba83390907b07384d46ad53568356b565380484b98b925198e220cfd662a3c3a4ae826c3ed9bc66cb50a543cf96eae21d609d34dbaed10b71e6ac10ed43511840ba07cea6ae951cc11252fd038138134bc8172093f9c0da8966c30ae810d1b14c92222bdefc357e76084896b563639248d1f6fd2493f7131c5adce13f1e56040b37579df6da5e1a3243d9224b47c3a08126b94e4c79f015885b288f1fd81e41a519d7f2dd97c526d44614a3962ca0869a501c830a7c8e043e00ad50fa1d820721b3793b5f9d33818de2be08a6f8c9ed0ca3da3c4d6eaabdc873501cc49639e77545ba6eee7ee337315ee840ad9109fa883032988a822291a5f3cc48249b563898e11a89cc6c388571b50a337f19cf6ad2faa02eab6a5482f0ce772bbf1ffc2a57456c045cf5206b11ef416d08aefd7c3b70b1aee21c52e9c1218327cf18009f255acdd0eb077910e2bced328b9425174cdc9a81f169733f7ad8d4460302a28637ebaf2ca663c0ba734c7c428859609c784e9355b17959f30245c72e124c9d71062d67d118fec5f7fedda7dd2547ba83c0ba0bb88d80a6494432cb5021f7d07019984e4141dcb7ed7ce400cfede431cb9931419d93a1f0d606efde99d929db314728685642e761477ae863eacb915e894f2a3f6d7607644b17200975817af4b23fd1b20d9923df7430371c9979f87a82feac8794eb131222c166f4737998a867166ec765d0fe77eb4703ed1b6202722590f02dfd4412e7ca3301be029d42054385bc7a7eb84ac049f4e125165ba537f0b5f9c4064958bba579b0a75068251bc52625dca42fa6044bf32ebcf68344b22b1e6a8af933ddcc593cdcb4b94b774d3fdac6521dc565af2b94ede2744cab848bb3f02278f9c77ff0a609ea98e970302d42a482441e12c7cbe33ba1f2c2a4e2a4e016d80a2c3e1940f109e0b6dd1bfed61927d655a1aff83ee4285563db7c104f7c8191c4721d5cc8490c6fb77b6eb26775dba189ff8730a60909500447278a35efeb97f6185a4da739baf166e134de5a6140d478b034c38016520311edac89d10fdd13f77e6f7f3b72e513d21dbdbea242dd015e3b08fdfece6ede32346a00b5ae3811237073c838d8b21a080c502b65233cb547e8c99f58376e05bf1f42c997d9fd904725f0dac325a69fae5ca4ac70b215ed64d4bc706dc29b0ae8e498280e4a2b4d09c7cc88afeae8685244864c6523f4d98e94ae241ebe81e427071e519a0513de945790231162a8f0bfd2acbb0bb9a83669a493676439e82cea6af08e1d153db8ad6c94a2ff639cb71d85ceaa12b1a079ce6040d5e21778bc5925f6e36d391319da0b33396185832a29a2c6dcd94b08c32bd141c801007f33310c296c969c4ec8c46b153e74a06c93ea1dd201652188e7407b5a8040c7b371808e3210ac10f05f86bca2f4dd8b065099e4291c950437a0d8dde5920e4765a6144e4dde602a95d82a8dd017dd54994312845ed5e689e9f6bd190a1f76dc7cc468254ff64976c0ba6d01f4b9f113f57fb5cd48c713d6be7c5f945b00ccd6adae184066e040926f2cb0e504bf0985702b4177629d2e45493e040939470dcaec27b2cf15203bc79f3902ed405675d5c6a7524900c10293f9fba92f24dbaa8e99e83c2ef23ccaeefb2bbdb5f231a5cfa8f640597da255322ca53ae57fd00fe85b188e5a508e00916f50ec7afe930b6c5eae6e18fa2cfb98db3e02ea0f5432e051bb4eab3a91ce3f87fc98aca4ae023822ecbad8bccc9b2eec2701490dfad96f1b6fb1d361ff1a7ed6022e6830123605affcaac8cee828379bfee511e36cee0cdb003ac553c4d10b3bbe23bc2f95fd89f3f85bf9d80572ed53569da93f6e76d81bf2ae4952b21bf1b65ae88aa621383734f30e23365e577446a5d20055832949230f8b3302a088888e94a92bc2e1bac4de2b1938fbc4fe78c6f5f0228c08e367532a698f2e6237393b096058275bbaa5605940a2346ed824fada9a68daed565dbbc59d1509869bdbe2bf6a3e1b4b8529892aeb042cb99c7b3f4589cad0aa36fac5617ad43943cd68b55b8d77421c92ad06588c0d4492d64569d019d85eb8b7cf6f74a38bb93f882dceb5fe63871df50cb1cad480a8c8860d87c0bb2ca32e689b118151f544df225be5353aa1de14d24c96536194076924e7218934183900a80627fbe9d9fe7f499718bfc4bbcc2bba843431f2c0de6c2eb13bff6e8e0cb7f6bdec7c38fcf4ca0667691c29435928d3e0b6b5c1332d79680abbdf832698a67a1b23fd74a1216842db6bc44429c928ec71ee2dc7929ea4246622574c43ae8b4ee0168a819b3e62ac7e15f974c97a7ad09be45d7465f43289e032e0304b64076dc3e4414b472da59768af9a83dee48635d19f00ccd44766b7a3f1807b7782bf9f3b60d43ae61c55ad7e82d01e93c7b96b32587ceb71141fa7c0752fcc424b391b8e7f678771be300691026bebc513c47b26ff9218d994780f401d21dc038d1efafdff810a4e627c2e976bd403baa342706083340d13046edccfcb85b41dcaab01c706e95e7c835abb75305dd387451c1ce258a3a1be1b59ad287b5c9e444f1f365a85260e98693fec4bfaa95d230f0b6130a01f9929bd5cdbfa0326ba426cdd0e10c96ddf88dee8eede5d1cc5243ab0aa98b15eefa4d28b45ea51ccf28d12fdc30c536e9225458cfa2cb8a4d8fa937029b1c587e4aec5ca27c52dc4949f9abb42ec67e54cbcd6fec467fd263ad677c26f7d133feb3381b5f61396d51ecedc3ed4d19c14eef6277b8b7d4bc99fe1addc17b0ca13dfd6f39e1d6db58fd761af7e315f1b62c97a20d9a003de94c84e4dbe86cdf784f841e6c46304142444104085723ec08f0d6be06c0ba03f0fd22d06549c817b6cdf8eed05bd0610840aee09e464526e2f858ecbf7138706558cf0698432d9235e2d51013eb31f9ad51171111de0eb557ff09d8968690b2331fa5b98f883790ff70d2d1fcd410617e9693754629d5662b99bec04bcc472bea59950ac8da1efa16f07d845572145615fb21f5a2a5483020db3df268aaae8368e2ec9f6b4aa3cb8ad7144c0c67d31ac7debd521864164097237faea396533e2244ade3acedb39ce19c2a0f682c42e687aac79d9ff4e30071835390065c3518b4293970045880441530377f352faa36d25077b4650530a4b1bd453d8001d93b3927af095c30448899782f6ab87c3ed572cdc22d6097f00c9b134db28acdc61927a79fcd2137f3f25f4b403216768e27d24dbe77e1036a9d744b81bd06172c76ab8492de38c1568901d7852857c410c479e0332d15cf4bc366f1c7e1b66e337b0d91bd854193951002e19b2bbdb97178adf807f30521be07da1b1ac415979978c4d10b9711f6faf8ec85a2c055ada88a198e161829ca6d4edd362edbe8c50225a53c24bbb88aa677dccd400acc8b4d0b7e9a44c118bda93b0a81de468d03478ec0f2149f6a859317bd4fe770ed7a86765b4c688acc82988f3d767de3701e976975766c044015354efcd5342188b6488691d6dd1681631ec761c3ce9374861666518908b106acc3ff1300952d0b416522bf275d6fcdb12cc8b486bcd7ff4f1fee0f368a22cb013f91ad70eebb5a89cf82fee015c2c1b7facc1e86bf8eee2d516529ae67a7e4f0b2452a092b441d9a9ceff83dd168a649fc1a5459c59bc168009405d06f18538ffdc2918b0ef406cd8e1e1a63060c72e406acc44044e5580d409d944f5808dfb69806c87a7a90fd800c3145bfd0cc5fc144e4aca07ec8a83d675d05f1df84f409d09acbe4e6a1b20a88fec91d1070a3ebe1bb3700fd41dda0476476c1c24e0d147aec3428b467c89127e1f35119b185680179b93152b2703228bc135345519fcba11a7abe099325348a8173e1c91ffc20c19eef901692dd166adb9013b6d8128d8a6a341927c49065b6d86c876054770a2f55467e91df664421576a81702e1b9a6ffae545110acbb8808b73c262e3b03d2c41c3b1014611e032ccad58d3562747468ffdd054bdca0833e180df214e283086806d1a2715850061a7e320a6109b8a4f853935930be8a4eefeacc2a4c7ff0fa5cdf9752884e7fc3164aa6719920c66e5034db3ed678a57a91d355538a838d00194fac617818e051ddaa179867e528cdda73285e616235f7f727814c06b37ade05391a9f1ae3c5cebb6c21c8550e2eb9582e43706c4d49c482a82bbb22244525609e2ffb4bd00f0423c01bd709f9233e70114c3f922db37a5957db64d6763d2d281280ddf0c5882c54849f361129bc8f429e64b318b4407c3c810dbec7426ede59a2b2b63dd4b7e945860bdccb85fc0980aa214e9ceb69a62cbf143483dea9c81afc2b33e4a6a9c53b6232440406b055c8d1ba2be47a1acf3f7c15720faa78782b51cb4baa90378c16bb784e08f4a8a4b07155adf3badf411baca9cdbfa7fac1fff7b74a9e623f89824d39189c3306c3703b73e3a7ff3ab7b44649013fef3ed2bb229ca010e93c34ab8ba722c178301ae01a2560c5d573f573927a2e33bb57d7031722fdc2335d4ee7a032dadd9cc206b6e6ed293c699b2261fd85d961f60c60c74a7c6cb31644c6432a80c9fa92c7870da145708d165792e77d9f50793992f8ce8dc635ad62a37ef91fef8e655a376d5c3047ba89eea57d9773ccd446b2a3c3544a65998cadb9b8c2e207ea8a78d047d65e6efb17a89d1aea5deba05261b1159149e273968fd12862ef7b25efb43509d43a1801984cd10284e50a43da82a660b8d2804b1bfab92515924677771d03d70bbf1439f643dbde489f5bc11431d9751e46bf0abdd54870c63e965b2aafbcb2ce9a14ccf2cd703c7d8d9a9aeb64c22289a0c4b1ca4db8276c5918d4fa83c9de5014a6b9b812605e9d05a2aa9c19286e37a041412af2e244c58368e411cea200b8f8f1086590e5e56e5634dc207c6e9d4baa0ac6a2af362c72c7f0bb2d8bcb5e37a8e3176fd46594e67494e93c7aed4844be381316edff3d2e57cd884385a165bc771597f95e79ad5ccd1bf28c310181ea9b9a7339ea541ca42a3fd191fc2f10dd2d4feb1c40bbc7d64ee5a6770edee30268e8acb6c91b137bc631769ebf38c89b81fc5dd29c4200f209603f0bd53e317101e51fce820d671363a55d8c112d82c68f590c83c8e2bb717425390fcec42e26580d9028ec4561008cc34cd4b130fce25e6fa923d7533cf3548407cb2489d514f610c8076f40a429fadfde5ad95f3cd3832df15302d47328a71fc40f0832f459b53d6da8ea94b8407b6039984f45ebf6c015ac4be68c454d93c801b3585a00b241a5fd68ce9c7db9c7d2dd395e97e24d169d9d2a4af86734298a06d62bce107737512070c7f0776c5266225ac852474f684a8819755d940cf8cb62da4644c4f43da286f7c4a2d401ce332c9016d07dd4c1f56ef58456594b016ef817385570368398a44edcfb3101ee6b5c27bf5ecb5904de5fd80ef0e46b3da4aabf5959882b74f0387627abb72232e94db24545725a6cbc50dd948b82da26ba628598d55c822863ffe50ea7882aa9e1b21231415c0e5fe261cbeba62aa918081659a022eaacb63614c7fd754577c75320e092614af74d892c5f44480541e712415490bdb99730ef54a2168921446e35085ecfa037a083806e1d2674e02b02f8f2e88daedee537f0abf051e3c3c007a596b81981e6c11d94169d8527c1ebc2ddec9f58c037725ad93542d8d473cb92d635adc42927ed6d5dfa9cd1a04dc758e93cb091318a21eca19b635e7b9017336c614a09ee815f9a741e90d713b090446ab54da34b0e0a3599d2604644a396c4adac5f5f860dbb6c958953966d30ccdd4f009bba3a10b308f5a68c85d7ca1efb94416f7c83629761ebb6df3d943ff4c1ade00df0186665bd7ac9fe2c53d7f08c38b154ec562ca892b521622aaa9384a9d175fb320ffb6945665f66635e3c84db562ee0a2f458bb1fb651ca8b924c5902f16ce29c67cd6a85e5e98e96960bcbfdda2367bb96d3afb5b1da08f22e9b7cf2e47f46776f902e6150b394afaad82d93a31ed6518938942f1587776f3a01dd99eb8f3832afecbba4c4d2f357cc7aa80e351f95632f9ac559d3a441e8bbcc51955cff475a3892bf55f0af9524672e6dec163e48b429425d988d3765ac0f524deb6ccf06a18fe7ac44225c49e2850e3856a7c79d7975998ec807d229f831c773009d959200a8d0b59d77ce90e241dd4b7420deb01287f1a5c2a68f84dfbcdb888fedae194b3a6efb9fe3240dc6581ab27c3caf2b6880704202eafad6735d1e499229f901a1af1ac30109edaa625dc05f237c6a85bec67551d1e550241603fea4e3f9dec855a4489525dec3a3753841b77fbf9f24e7dddaec1ddf8670639ce0e7f4c8c655cc7a736ee0c2323fa6406a0b86423a76ed365875f2b5fbbb681b43d193b8d0fb704959a46669f6b80550e393f76bbd7fddc937c5fd5a61ad2dc6cecf5aeae6a039312c5ce7ea87da34a77401a9026cd139691956ab7682cac8c1212bd37a9b070433a46ef3b62e6af9769a0e0ff3edbc216459ff9ef5ba677f2986b171cddf1d3a22185952383c68d0bbc7591025591d8531780527b585c7d1f541145cef6e2ea009999a3f58653bc2b598baf14338a2e9dda00a03af7512cad177b358433b1b758df6e41f3550df490d9be1fe791411114bc8fab979907ee31c70b3e6897abee9287ed393f3627c87005a4c8dd4c09e4be359a4722f736f18f92276e94155e87b4890460b31d75570e0a10b1b712fa5118715ced2773c6fab63718f89244360e3c9d0bdacd0e89155ab95a8604f56ea48a67f2feec26c2dade7e6f8f68b8b5b6d9b9f538042634b9c068bab9e9824047e61f0a7c65ff894fc88f4e00382bd6a8a1d0163e336604b9e73939a4a2f793aabd51f5f678f3508fc05a6c9110bcb495926b350dd31e1fd2ad740cb8ddc5160f05c548d45656abc0d5ed8a0a8443c1b22073df34046d935f9e040d11abe4a0d4c803b04d19a1d7916e7178fc8f0f27dd8a3c4dc37da8128dbdd9294f27dd9e147ae62f83527fc58cbd65572734a97716fd8932640032c7fd5c1abf2dd493aeca87346d162ecc2a121b486f5124f74eea1175f2f11e6e3d9051d72d76761826467df20a302be8cea2adc87244127569e87fe509b6d86625ea0f42579e30ebc613366c23fc5b86582855cef1f29fad2226fece119f025c2a709420bd3802b8428b95dca6a79b7670672dc31fd1b2ee007e96514d7cfd0f74d74ef85f4aaa1e00b6694958a22e717f153e9420178a50f8c635a8a2fd00718dbbd14b86de38833ea7f6857a840f75ed89e8c3fc179cec76935ca97af64573898c09f109fa38174388b8bafb66a02117bbe8d327afb217c9dcd7217ddc4237f822485474d00dfbb5debb7614a050bfb63cb123e1e9fa4e0344b85ec28766316516cbdf82fc1d483c4f07b6c9c7e20c4f7eff77400caeb25d06646e3de0f157646cbf0268f0e22a2fda1bd5763f1315e99d8345201fcecf50d45676b7aa4b459c58a71671aae2c1ede3b8eb395c3b1c09fc8b335cf8f7591d7d9e7d2de75fb783681cfed77b04cf793311911e08c9a21554dda07a60a482797eabce4ad38456d1e11557a6961dbdbfff3e8a841e143e502dcd6bfd24a4d7fe97192d9993a3df5fdfc6e35c460379523e9bf2b98fc5047b93cda22671461a19e3ffd0d5b5678b34d4b59149ce2a59b440b1d89b7c111675ddf68e702f31f6e731457d81f079921e4cffc9bb660b565a92de5dcb79973143f1583ec7a50187203c2a06f02f93d915d362df25c0b475162c451dfaf29b8967fb12005ae7dabc411a05b937d442e5b1ec1b6509e404783120a086222a71260a4d8eff8d20b25f0a901bed2f45a59f8e0ea3db0c0df10f87d3cf738eac916f562f23fd25a98e76384926796fed339af542ddc27a8013da47f88dea6277251d52a803065794746c41f15d213e59828d3abff3265f745e6451e4c03bafe3a023834a1a12c46776f3504d2056f0abbba64a6568512bd95e57e1cadfe67b4dfcd6c91bbbb7a2f508bd0ca98b39809361e3ba918551e2b2aa6f18d41c57867c4dd98653c1c48f83e1e6bce26882b9684d2ddc00e19abedb90a7347a8c9e9d5f76cdb454e49aa9ca06b7837a02f53c7d10cfa311aa356d1882a25df5415e4b860bae1029de75a56ccc9e4d0fd17b503387620624f15d229b9f4c6c7df828e53c799831297a099fbc3a779bcb16c7aec6ef79fc019a0dc167bca67909be1e031c4106f2824ead828237740e860aacd0dda66bac833550c009236c69b2d82663376ed366460c75287d12396ccb59b58ecac4ea172f0c0d43c47b7ae1d08f31a9ba8979fa8fb7f17fa6074909f0cb75650ca1fe9ef7d308132711fd7da0dd06e31599ad46f2782fec9426908154e47b8e66567978bb92b96c38339ce8547584b4237e46f69da2e091a42277319863e4379b7ebf931e9a9b31942a0e2d19050f8b80953135c1f1ce15170360a6345caa806d5fd22e49f88211c5ff4d9afaf8330035a0865657c8d8b2e42626bacf87bd7ed8b9a351dbeb391930407c25b00ec79cd8d1c8eed10cd55e0874708aa874f8bad03788abd25e0a4628703d88bd56896d4a0eff3f3f8672ab305975c121e94ac25fc3ec7a82573ea826734134d80df9895a9fb89087b29c40be02e8958b6e88e2a4691989b8ce92087044969e7a34667a1a8db1f58dd2aa69ab6a2be720e9163a179c61dde0e940fc47745372e6c6c255f4149d5f4dddb8008de70779da9e0a1d5789dd97ddb825e8107d5c8bcaa29e62a1bacda0a147637401fdf21fd769fbda8411afcb46f7124162376c0dac575e3e2211a860ee3e977f778f26b3e89450ec85d6b07b21f2925bd594e9eebe86838b19de987faf25ce601bf1dede291a5ec882c5f6b063c4bebc32216c13ff341e9ec1ee425e3561916178e3100d597a46b98aced87481141800c368c24c6bd16098bc50652dae3c0a31285a9037858ffc0ff634bf2e914c8b4c532568189050f868481b4acc01b54bf4ba62a82c6d5bc6a8c1c0f79575334b1e25ba7edcd4e50a24db520b85caaa59958595b5b8598553c3ff6bcdc416d2489141e26a120e37adf91babd5921b5210c83a102d888676b7b3a6df2f1aee4903212dc13cfce8c0c7aca2805ced29ae968432d5a26c0076930e04bae3279146729699f2c908b31824ecc07199020e02d8ea4f325f1e8523614e88b8a6ab4c6e6ff79c7f40a8078b19e543af1db1dadc9fea51ea3a7ff62447f2bbd6b9b374395862d8e19f719861a99d09df3ab1e157ffead90bf6584f36a7ce6d4450ff72b5a9a4ebb851fa07be437c4c7f0be23582981979efe085b7186bc46feb42fba1984d0dd1df198d213afec93a8537c86beb89e8686427135beb289aef8711d086009a89b2c066814909c0858aac9797a9a1ecf6000241b984392491209585f8fa3a929c948dd12b92672b19bd496ee6783ddc034f09cf3c98f6ff3e0dccd8955eee51d6bd623151e2066f983d7448a895f105c6e1fbc74f586d178ff27d466a1df33f92c1d37b22a869182110a7852025978739bcd18c23ee36cedde897ab34be020cece7985b7ecb088873684241f66499bf213729aea9c4d02187cf35f6252eda976d90daf7841576c1ff94bca93c5395f25edf73a04a30e8788a6bb2cc819dbd88b8dd6b6f2cf62d2b692c338e75c817113f49b849c3502c87d7198dff100826d5adc0cf57407780dcec17841d6e91d8fba455d438cedc20f4e92be9fa88cba175d2c3b58b20bd7c4cb2e4e98cfc164c974cd7e6b68164ae4c400882d484544ff419321343822e4aa68bb11d647de8fb44ec5f4cdcd75e06acc5475a409da2271c69aa06cdc8b4b340b4809494fb5881f39641a45a590ef4e939a048d8f002b7300b17ea914427e9a2c02e78cec2d043ff5dcc5c26256e71dfd4123d918f9ffb451bb67afb6b46367827c51eb53e25d994cd3a59c6929e167e4f93f2685b48ca55679c375c505e9df0d563673c818c8935650213ec2273a62792e1c4146d862618e1a42c08d10119082feff8ace3101475b3e32b23717ebfa51afc38cc0737264eee55f4f1417ba76a2672ae1525065e47e3732f5f4cdea775c9fea615c6cc2c847a18458d4df84c0ce6502fda61f11a72f9332c0e6c428cf43b92260fee29d20c0522027a81f6ac82799642587e0bf834ef510e157a8294d73bf861f332001f295fc1ba4407fa0836250f36179079c1e34dbbb67072cd80ba5129722fcf86411dd87dd71d63e18969c4a372bbb1925f8abe9288ff593e069607291166958192a91a44f918dcc6fe7f61b567cf888873b8dcb0e79d3ed354f1a6b0ae94bf9547f7039877b2cc11f73fb84cde5a4da43e75f98850a2c7021965ea3db29902d6b91b459ba251f8f0c3b990761d22396b9014cf231cf60688623de622e253a5119387bf688b49fd10e7e8f26afeb062e526e65162d66c7b7ac62670c7732fb0504ca3cd95017d2dd1c2429b53adbb7e321aa426e25ab706efab1aa9a3da705c804d15b1dd1ece9176a0e99fff7631b87dc860ae56426a1bd23c1661f8bf220233147deb50b3e144014608c58549c5b66e076edda5e1d52d92f3edcc1ffff39d630f570f3d82ad2f361871d95fefa3af278a529321568479ed21989533c372b908cf50da2564eec91a99d1148e90318c4acaaabacfd500b00ef1beaf57eda26665bf9115acacb247264576a03dd60c481ce93a943bf1f07806803db0bd42cd3d3cf597eab12272e6b1e84e5f3e810455a4b03a451879ee765e0bd3e350c5727518503a7c0b92b7579d568112f7ff106cd8409802b1c1c28da751a602569a8748f388d054d38b8d9370528efb88121199199d9df4fb6c6dbb9b7d70734a852bd4f639c236980dcdae34fd6c25d9519ea133b45b664e2f9f341757fd2033bb7dee0c186230d9d17195b857fe3754afbd3f9dcaa0738b105731f4f1f2dac82d28d013ae0d9720a89c1ebad44345f40d6140527e3885b5986913a73f424e668fba7929fa7924da2e91a266d266cae4f432d167e9f701d40f2c00f6c821f82057e448e46a5d50dc555db631afcd135a860488e97bd50fcc7d7b256183f14c2fd179427ede00e878138887fbbf8391b34e8671fa77cddb76de0f3d97300ba21bc5aa441152fe4b76370e0d5ed682f64a31ffd7916b669ca392e1fc023fd4512f16930aaf2c04d779ef5fcc3840a146d8668d032cc91e07d5862fed95cb6d6e1e856159cc35054a376a620e392107a116f6caf2853d26d23909bab2a6e72a3bee9836793d736b17f0e53f34400e1357e48418e3f268f301101d98067ed3a79b67389b5897408c7ed397909b7600b66b2dd0a0cc33ce172cf7f0f946bc455bcfdd5e772f51eda76ff6572afc2bbdf1a7c8d210154d302fae935625820d8594d07d5c7c64798dc6c085988df646cc030e94022de03595b2935ebfafa18b7777e1e8da7890042407a06b2bec70dd7879ec020c228af3abc836d1842f8986b01716d22dacd131e2d13db5aacb5dd6dcb2da54c29a56d06f105fb052ec593649cd080214a5945464a8ca902c34a8a150b3a8d244823c96924052006f7a418a0b392202bc959493839d13909534420ca2863151ec2c1ba27e6414012c7e8037477cf21c9915ea4a29430aac42a306862ac42435363938a31134386cce4828c191fa58c58668e5230bc286515273352a24c159a9a17dcbb9022e3c426c68d7b1752649cbc70e36e45c6c98c57c1e05d48f12419272a0f0697e249324e68c010a5ac222325c654816125c58a059d4612a491e434920210837b520cd059499095e4ac249c1c8f4f44185552be059c9c1aad2ea4581180006ab45c8a5ba9d18a12baac029d868b08a34a4b062b32cc6065061aacd0e0edb98083bf3d1c77116241b71bb53ddb438f52916c996c83c964332f526d04a3897a49c7b0e8180c9a1e6a180d4d8d4daa8d0809d5bc8831d344fa154386cc3216bea2c45764ccd8607fb4c1ae584ada82f277b21658136429190c4f366bd204d6c95233485ec44734352fb8c4b89962d6b2248b47474746543c71f482ec6683c106db5ab0ae9e6d42c866dc475a3c713463f62a188e7cb6c1a6345942a6249369813d21537930b88c8a254a4ba6d113473464307432a221192a8e6231a72236c2c20886d5d106bb028a6cc5da98c8eb654488c689610188210810a52b31446629f1a094f48375f2a1b48493e347474f74f8ec02bcba97c2d96039355a4753cc36d89428d6d5b2964991c964530b2db096f5122d565a96ba253a590e9d4c00271c45b265a946ab09199375b52c754e1c4d232a28bba4d7507ab6c136d876c46de051aa216b4597ad1e8b97b92b1e4519d213e80e8c5351abd592a16d52291966e0981968d8edc806eb64b26e8976c529473be2110daf17b0bc9a48bf8e38c22606005c68d08d48e2100c0683c160b383a5dc2509b05ce38b46b54d431c63c0aeeec5a6dab533e2040c602d5857bf5a88ca1d91664f1ef17201b72eb439bbdbb35e7560aa6ab6a77ba41528774f4ff30d3dbc2407ac41ce1e581da89080eb6c184a5c0d6a50a869ea0f1599136e6f7a65c4e19c45a9cd59878ab191a9a1a1344935388a18e9cad2524d77c4339ed9d8c490918a316366460737229140f8d582ca20c0c4a4c7326765c1b2d8cc1434372f6c742a6222268275afd493d49217a7228ec56c6200c045c68c8e87a200a09b28a034e61473b6ac9e51acab5f526a77af7ef202eb48fde250bb114c68f60bc9d0d09317ba9bee04ab0b610c83a5aa96847a328dd00e888f5d7ae145fc6205a0f3a17e71887bcde0b5510420864d071d473bec40eab13af180d3e57470fef4ca676bd8d9b1814796430c271ce42ebdd438c44a68ad682616281ba1353a2336757d98db43d615855090ead75c42cdbad7ec84634249426598a1f3a17b2dabbb21eb9a331454a1a428733694850cddbc02fdbad70c73b5ddcb352bc469734ac08c1a89b0a0fc5f1c7a2f4aa566a0a169b0c13606d0cda0f6d0b2faa310ebea5edbbd6a50fb9505e5ffba57ede7066013c306e53e43464b4c85457733c1b9bb57c0bdf60af797bbbbbbb31494db9978c17ed8509ad5dddded4501637b438694f1a5831ac498b3bbfb0792dcdd734882dd04ae06a51d4abd04e61474eb861615faedb2d1faf16e76d4175402262d85564adeaca480fd80765d2650a8a0ae5eaa6ea0783d61a5a378e8eeeeeedd0968fb0d34bdde31eeeeee3539aa7bdf05eaecd552e80319757f53ce9a2b77d948004d75aff5036f0e4d9d6153d7d5c18042bf14bb707ab56346f46698c4134eacf374d7c18f0834a0070240ee1648724740121cd232012a3a5091b177c04c2bed8ec900edaf87da058edbe1a43555f7ebd7929daae52c67f99c526082fda71450c7c24f45a9b9ab6e571048f58f1edb7bd0d1238e8d2fa5d7ffab1154c8a3390bb03927b2e0022184eedd4738259c229d49a060437a84202443865832040c882526b818426c23ba493cd87a278d1e9cbca4b5b305260802c968498a2dc4aedc98a240bfd4471953087f606104265b3c010b4330610b1acc9db488391858010418b000ca910d8ed0027c1b1042788214f356f80f7f0561c798a040db79fa87b0bbbbbbbbbb7b647979797979779777779777779789134eb8fbbcc1134eb4bedeb43fbb774241f47ee61bcdfcad2b400821430821840c216466f8b0a350b34bb34b61384cc117bb52c6194d4a778fd96597f91208b375528b28b5174d4aa3c9995c3aae839168e6a70e35a3a8137577874628a3baa84e0e65819ab9c316e9cef1eecb06e35968db3a1fe4cd912f56cea498b039eeee2f9c42e8ee1d4011721028fe07786c4f9fc7668aa6f8f34ddb4398ed4d9b07c475dda7ba9749bda8e89bbe53d1dfcaaf4a3df826d3b7a83e9fcea4a47bd39f4e3822ac31aa8f13105f3e3727a570ca3ffdb7fa405085bf3d10f71f900abd10c0a8bc410f88fb6f6edccfdf1eaa268f43f68a7ea0799a8781a1f1661e0606fc175f24f54564e46f457deab9df9ea7e59f64ea85aac88c0c4af5f9d493d7274e35b91855ca59addaf8260e76a71cd35d41886c17b2f4c0fc1021ad67bd6fbe69fbef138ecdcb211f9e1a207368156a1ddcbc182268cd02666d4d2d4ae8fd0c72696a04a5bc5af9d4c5a9fe40f13f20ec85004685aed2344dd3340f487ef4a013517706e2eaad0714ffe3f930beeafb76277b40d22b9a1fbd77d776d7acfd5e8f46387e1e403ce66ffd82ea57d4831225dbcf96257499109a55a9fd313ecc6eb61ad09d55c6523ff6138ef81f70f9409a7b218051b9fff8a5d4fef3d34bedfda5fbc93d20ce2bfae1f4a7d75e326065e03ffd9e7c5a52ceea166f57866f9ff014d4a7fa5377a14edee95127faa86f39a13c9ebebd160f75c261eb2ece17df832a6c1d095dddd398942ac6b3e91511b46601f2f9e5ac3b83dbb30a6efb8d66fe1714ab5f8f9d559cbada036dff01a90cb4596a91ccaf5a8707fc150a8542a1501ecd2603ba40d073969603cec71e841f3fac309e0764faed35c701555fd7fde93be66316705369c37c90a01e18f8dce6c47779d4cbbb3c8752a1fe45858a15a55aa9705c54d46b51c947edce2a0fa0edbfd3c3fcd6e903e3c17c91a01e18afc8ccc77840dbc377a8327d976553cdc87842307a60bc1f601e265635ef03806a0867e951021fa6a3f7a4f2c378ebac5542e5e72968bf7b1f0303f331cb5f0466534562be084c8ce7a55cba43e2d65d6c738343635a7665a84b6b4caa2e8ccfa77640a6ffe687c06b11fcaddb10ff20413dfe502502ffb89fef271c3e26e01eed351f12a4872c495c71852db6c0852c3dfe45827adc2b225ff33c20d39b543745f1a5aa07ee19b2597a8460f444ef077fe8feb0887b414c3320e20741b8200927887ae017f12fe2a5620fb1e310f007f845228cefacb9a2f007ed8b48cd934afaa1f7ddd4651776e91af60a22f52f16486aff36df3005a9575b619037ac82fb21f2b55df95be5774bf9ab829edc95d261c7ac05ee624c693a05e38c115206fa1277f91267b1c37cc889d6e8a881a852ca6c3772d651eb3810bb92b23a7e6457b208faf991ca0f8b4104410411f5063780410451fb397720a0030144651f7297d450f2371391f4b82bb208ead2251b492367f14f2218e54c36912d8919c92322a3d812996c2267f2487a942ea58cf2793aba8c2e647281940ec1902811ac68088634a9514c794bfe38359513450d463804b5083dd46604eb8cf606fb33bf8c42bbe4911cda1b4842fdbab28425a9f64b2479e42e0e0b1189d419914947e4121279a508ed9544c861b2082affdb8cb82bbdea6d28cad49da92f6abf2ca2f2459d43ee3275423ee42c36cd17985ec1ee7a45a5e953271cf15f70646952a554331d6dd76614a511f4a34ff4a273186c887ed461ccf4cbbf1939ab7d93aa22ee4daa213e5eafcdc85d0e33525198f7cd108d8c2a55b4887e3646357ed7e87d17a8d073554ddd541346d3306c97c386aa2ca20eeb6201a802378b817971a12d2d54dddf60407bd63aa70d42817c057f28ffd40f9bbb87e41b40ce6671e7dc9a1c827e29df1bacea1a4293cc08932c76b78c45294410bb1ab87b90d97aec9d7dc0ad3e45a516bfd32b9df8ee6ec39b2a151608fd216fce50ca067ebfb637ae80041249922041b22d45f898403112677c0dcc9011c3a6860646eac58c4c0ccc8b0b6d419d3aceb44ded055c732edb98d0272db26e13494ca99bc34204d086ac4008380802109260c216881c890110b32b8a72807402ee420926a01862b2c0dbdd1d42f686bbbb703ac3dd8df0c5b9922bb9922bb9922b29790c52815420154805528154626419b7e9040edae056ab861dbff17f9c55924d8cfe039eadb98431c25de9bb59f4ec20dcddeacab8b989632a5c8732d2b58ec974ea8cf4f4f0a094f4c387d2924c3a3aa2825d9d4c76f4c4c98d11bae8e225c593649ca83c180241827a52ce822d674108df5538380bca2a3cbd807e7ba46347eb7c313ac4f8df406fc269bffdf31fc0af7942b6e79f9e10253f4236f5cef2efd4ef7057cdfee4a1d90ba264bd1ffee905d99ee707e16faf66837ae6a605855efc9ff995a7e10be99f2f4489f47eb4e71732bf7f53d5ac57133d07f4cfffe99fde0fbff64234afe55b16b4bf051b5ac1adbba02bc1316be4d7e67014da1cfed813c43d787309b8bdf9342217cfc7313e72f1128f75f7734d68ab22ac573cc4441c0326ea23d08f634d5a8747c6440ee0898206ceb339dc13e8c731d9a49bc562b126d08f63da9176b1114d888f20a92e24b1b4eb47b31c0b916e1673648394e4384bd5c6950f56a8117547e05cd64819bbbbbbbbbb5bc69deeba3c71f4f4017742d09a8e95bf8623662abb5c605362df42d95962326556bf458a444ca250a9df56d1b921ca141d1b959f752a3fbf8d8d1b9c9d6d5299b64e0bbf8490524619977291a6498189289254187599880256b996ada657ad5c737373ffa4ccbfa7c95b15bad3ea150ec87422a1ee15d5fcb464c992254b4f540929417cf941b4975ecd03e4cf9f9e10cda3aea4a6874f3e719db54596faa5bc091c87b355abd134f93c36ccaabf8f20ed725915ee38b40eadfef05505929f88ac78554dda689df6a1ba09ea5743ed56edae387a37bdf22f9aff6eb34447043993f9482e824cca5a099944472c5db492c4dee0cd611eb81462ae55b338491112493cf281324241bf9d1981dd08b92bbea649d56a6733199d40bf9d7d521693baa51b2199bbe2fbca2394314a70bbb45030c018c0a2f667605dd089fab98060599bd35444a12e1375995081a4fa68423f6ed2849fb40ef3151fbd6a2a8e54c845c834b9a3025bc3df35cf070aa6ea1efb6c4e13f463a179848c67ced4b73896e288d9152ddc348b7142c00480dacb6dbaf0b8abb523e351795c835faa3a0a31b94412b58e2ca28f48a2bdbf0e77c9f707e22e7ae555adb2999352a97d8b52f7943b9704fab110914cd23af05d1a710ba50c95034eab1f4435a1b33a0e73ee8d75ad364d9563737058b94b01ccf277277c07a0a2fafb32e16b5d41a27e7497aa9fe05bfabbf6ef54556e3e6d53a070ad142905c1031e18e1421276d0458e50c4ca90c9acba4ca66c1105090b553195c6c04076777718bf7aeb2ea51110f290a990476cf76d4a804a94a66d631429e5461ed563bb7b40294a1991f03b7b30b6bb4bb75a376294bc3760125a1209898ed1cd07ad459458fdde0a1aeb3289928329a2dc8088fa7d94213a26518eb83cc252bb252548e11f1cca5ac1074f02660448c435238eaa7c973a4aaa317ecc3fbbd211158e9c50bf6f25c1cd284c2944915a025b6922184dba478a0d71a4c4155982682241ac520c80a04270a823747f356e617597184256d9fbe1753787570677776fe725b8bb3bbf3b4729b0ad707777776e247777776778857323addcdddd9d1b29e6a6e5eeeeceedeeeccdeeeeceefcedd2e05f614778682af40981257ac20a221618111b1425219a50658c3944532498183262c522c66458471135420126156ac561d7f74159d145d157bc42d6108437b64854916a1f4d87929c2490b7aec4cb9b999f2c3bd8a98d6f9015706abe0254803207ee0252b5ad36b0e191c4891833a25157ba4a6fc881c7fc4283236a3155b113d62aa7fd78e313c85ebd30edcbb6bdd3e9f3c772d4895f45adea492cb2dc79da6fa3e9887f029945fcbbf3ce71d8dcbc7007d406acbcbd75a5e9337705ea557adab26f32be3c5f8f0635e7e54a11ee2f02c2f0f04e57ced5f3e46f5c1783dfc5fe07f8007275fa40704ffd36666e06bfff2f2b5f87226fe4bf480a65734f37046b5372efd2defa2fa7af87f20a8b67ca6d73c7942a97278fd82aaff49f54120155090ea6f52f1f00faa5b13549b99f1d659dac7e9e5802f1b005f7b97daf3f44b6b51b88f3ed2254f41fd3f9fda114618bb7f9d7a2967adc7ceed52b8a58107bf5c9a27743e67a99ff65b0e0d88877f0ef99af705d54f7a45a622a1ef31793d2881afa46b725458638c310419f8822a07b4fac381d889e0e0c3d93a3cfcb5a7a8a72f2f2f2f2f2f2613cd525d9e630a5d9e83757395d7d927efe3364ed5c36753f9d43e2580b3d48d337d9f43ebf84b87d0a507217487be64e505dfd3cf75c7b3037358e849af4883373b6e034d5d265a48692b3ca3b806ff67aafbbb3da08e6202d02095dbdf87930bada5fac318213325aab223b2a880a7949cc9a857497ac5a69851aff8a5d44c466e8ab5ce6a71685b87ebdc7e40bf0920205157759bf8811295f3ce34b41f54d7fbf88b42714846dd9a10f989010b858f7291eb534a097cc29182826ab0cde1d71e72b1db7e6f8851370fca3687ff5b55647a9349654a42a7c9e83319558e4695e3504bac083f41827e8204b11397524619dda7e64408f2ff89ee0fbd20f083f8079d604e4a53a9ffd56aeeea47d2eb4524868411242f2122a323664d845eafd7eb63abd729091448901e3ce8384adaa1f5d39a7571aa418fd69994a6be551b090af187dedce86d0f37f79b86a0cdfdc4a7125405832afc7e541efb3dba0a7fb9c627abf6cb353e18ff7b7426219a026e6f705aa766015ce35fb99842ed5abc84db9b9ddcaa8fcecde199334654f6d33add8cfba7753ce0f1349deedaeee91ded3273b73b84a621facd6e85b3daa9847e36db667a13c731d7cd3699a0c9e46d62d3cea0f81fe9062a901c81ee5a2142fd5a66755b64753d1a24d016598de20fe3642d6a1ca3f6f139c272ac142a7b33fa983e93f0a37f66b0a1225a3c2cd9a18a0134ed7b2d499783e802babf312882a51a7fa78c461894a9cb640b47fc30c96aee335380fbca526a9aa64108fda18c30080b5b53903ba49452d334a9ade70158a3f7231661c5fddddcdcdc7fd35bc8ea47f917ba803233ffc321fab5765a367ab7d70a16b6c03b7577377a1fbff45e6440f9e70721845e842c30e122c47fe58e317aff37beaf5af5ea791aa7b2c73dcb4d98025a12a93dac31c68efda359dc4dd8a8aa4387e79c83281dd1d33416026ee01967bf2646c8cccccccccc112ef316498fdaf48af7278c0732054468de4fb3fa7bb0604e4a53a9ffd58af7f5eaf956350544f4f75beba331915e09091959b2c49122846046312416691ec18ee94cd14f09b1100bcd28f4e319cff8194aebb417a4573c5cf921dbf13ca8dfce568624a5c4769fb5acf63edd302b1090eabfde38b4600234825d3b92b829e7d4a626b7d61deef2e1010a23f48a36dfbc9d97ba4cb2f0aa500b06b82875777777777777777777f70edddd3b9a87d3cd5f89b8803e5a3822bf7f7b624d8c707777777777f723f4dddfdd5dd6acedd9d0ab95727fb7865eedee7631c5e49814dcc6d7f2f97919d1415645873be5211bdc7be5ef01faedf88e57a47d7b385eea86c61071c1bd8326af9e6dcf47fbede1ebd5b343af985f4c2486041b596224424446fc32421f409afc98ccfc6d120f3d5aa73d1d7ae5aee9fdbc0d4aa833680458802e82a8df7305b42447707bd339c026adf22aa5dc0186a4c76cb1f020dba775be950ea39f6ede953f07315c477591f63cee72e6baa71a264e1728e0580b5c444cb0d3335f68f6cc0208ad7ae67fa71a84767ae67f2d740d00dd3bea2ce8156dcff9c95fcaf6ee9e7336aa486b69ab56f1a86e7018a2373791082d954ac99f968d9d1652abb5b384845464f27197c99b379c6aea61acab029b4aed8d13fd91bf0325543f945055e9f0416a355c24d82ba4cd93de97aa744e4a53a97ff9f5c0018da7056854a8517a3b36870b0a63e5a6ea6b49d5e753a54af3668f568d1e9d75ce84f473ef2a214a7efa394f883fc7390b71a821ca4539234c457715b7e7e938638c73ced89c0741891099af3d11d36fbf271f0eead8e12cf89b6aaa92e09b6e40df4bf50afe8401f56fef08856b9ee0ff70d1c78f24411808f350654dc61dbc640786aaad53a916097dcff47e348b1d40bb5ef1f3b7475ed16c6f7a3b367cf42bd32738ad5bae80c6a07e8bb433cd2b724d2f35577be354fb71e20f20bdea8f9e8f9d6d5bd0f9db330d4d1374559dcdaa1fd50495f55bf9540d87ffe7537bb42a4ca5229456e158c9b172fcca2b5ba9b667aa967ba6ca359b2eb647017d7b38ee504354bef6205857ccb2f87700ad4e7cf8db431b2e54f8316c97ae03b6673e777201adc0ee781d7b034685ace56253bdb360a38ab6e7e9cd0b9c08a8148d5a6952c9680602001401f315000018100a874342a15818a6999eec011400106f88406c54389606034190e4280aa2288a10638c010600430c41868a864a00cf0f5a0a3349fbbcdb4d5a6e806b8ed81a4ef68b40c89b55bf3749ec8288431a22d3ef808ecdbd238f992f973f1972bfdf31d531d1655bae4d8e8d574dfbeb4540f69a3f76bb130570dae5b097f0fd4392517fef156f176e0d6388886ae47b375b0208175479754de717d81783f8a6e0be701737ab92642e1c183319e6f0199649a6e5b30ad025e2974ad03500e122ccd5a67c8a298c31df1ff41ef6ee14d9abd2a9a99822fa8b84886330e961e26b51e740b1e292a24b4af35995912bb81e58a70acb32b5e1d378f683fd0ea27c1cfdad7834c041605e269a5b84b6d3ae9cf2b6bd0e18dcf13b0913c315913ec7b309b70dffda05034db9ab9ab5d9fa7b822841de2e7699b94e3b3ca76ae6a352405b427e9fcc33b7fe5dcd3c69e6f7974d3407c66b3994cfa89a2dffe73595d3b544333eba540ce9276384eb50165148162f0f569ea6ab249ee0cd5f3da01c8aa7039833d1f25f65672e11a69908b0f52c86553c706595247f68066dfbccc4070d217c558c485a4e973b55db003e3cf8737e7142cf81007d3402b1183b54b2a38c948f0ca07541c161bf411f50f7a865184966c8108f32eb5a227fcd333e1d68f76fcf1824290e91fb8c1efa50d21f5ce15d10e55f081299d7115632ca04753d8a724964c5ae73934ecb92008e1d9794c6318577ade4334040d21101e0046a41c0610140a7cc6e5dcb5769650ac36512f5ba87163c1e7f49b7fbbace045f668bfb2616db24566d37d92b166505b0f9572c1e0a919e6b54e104cb049b879e9f6d84e0daaa178d0aa05eba4a590ecbc7e7e7a81c0e929401788066fb797869fdd20fe77070adcc8d3118c8ad7645249cf874c54f9eead36b69d7a301cbf0a2b43db634a1df54aec4b44e0831e0e7d57aca92c49b2490e9982298a4c9389b38bb47e5bbc90541306c82165f5a9880d46fd839ea3aedaeba8ae879064320de18d5ac2f451514ef003e29919cd010888fbd1297defac5b312c600919dcfd540d928e597ede4e8e18544776deb34586f274f64d476b2c95527df18c882e76ab550a7c1374feeba824030eaf5fc4bfb5dc4ca6680532b76c0162073c297c74bef58c3f2264f262d3b900f29f0005eecc114b7035267fb2c3c4fcb509bfab4fd1b0ac3650bc0d776f7e0dcc9bb6bf79370042f9b3c5777d1023f78b817edef469904cf81959f9073c7bbb02c04225ea6a1e37522e12a0d2a21269e3538da01629dc3ba7de5e62fd358b1720504cc5469f81c9f9879143c05ac6df49c9175483b3527be22458079d79049d8232dce29b973e382540e903eba5a462ad9e5a21749c691fde857780225a3bbfaf2ca406d685c64f64dd706daecafa0a98dba44d416a3182eca3d4ca546ce90587e93e8aaf01e4353cf49ebe9297647dc8063f36506b6895ccf664d178010999c1382346967e7a8f2d61b15fc8ec4e39e5d83a596c54ac9e947628099e79818ee4abd45032c7c5caf31cec046f278c94ad8189af8b2b3659403f13716950ff3516f5e91783070b088b808fdb9a6e6fa4ed992d080b77aac478827a172202ce53e2e5313d5dd21f2a78edf7f9c904099338c6fefdd1ceea242e8241b27d1bb5f33a04a684650203da28550a6537307ed596f2449f1de326754bf74ae4ee386809a3e5954720ddadcbf652850bd3af307d41a162dc18c67fc0762bb4c89fff53729145810f119c3b2ad520836a14eaeec6e2a1f44f72483bb0b48f5e4f478029cdb6e7a069894ecb4a30e79d3c0b3bc9f83b1f80673a17762b935e4b60cb9b421e3f1f6e8ce1adb5c49debe47e306e211412a0a57371854ecfd9ef440d5c570ae016aa037dc2bfc0c81c459df5855265e044c812c02f444f4ec0676c3d4806cc763d668eccc87447b487bc3615ee64d3e0571c1b367d07ce4431fca71e21eea00d496d4ba3a3fb0d3048665a8272b40d7c3ca6006d192470efe20c7d8a07328f79d650052cbe9510a347b0aac1ff3e7b22e1ef82ee37e996a31bf78e502913dffd05a10ee03c6d49d88271e8df601b9fcdc25e85be025772b1eafdbc5367010c011f2214c425145f976a2fbbf2d0aadcddd0609fc77eecb9ed130e6eecc6391be29686b359892c36d6196f33ae7f3c7c64db05d25a9ec4e419712ddfe606da2fbe135af8946840cbaf71cdfe9b2facef8bf667aaef924da95f9bb975212094559a8844b37c1782bb431501aba15f013298b58193434ab62f9ca0e26aa43429d1285d57fb027b25dd06c573526d886251038bdcd1d14cb872e75228028d767915a897ffe127a330e95f6e4506ff590ac894b56392464035c31d8f1cb74c51b6076ab4f0346f3759fa1d0fd9426209a1887ff6b25f415517364db1284fcf42482d06d30334a0662c490b84e22223e5efe6941d457226892559094e40fcbe6458e27074460761e2684d63016fc8ee6efbc3a3c70feef45fe16ff9a1cd16b1e656be0e2b90cd58e605e50cd61368bf44af7e6aab62e84e16d583d2493cecebff470e05a91e8acb35fc867ca9ea8addf2c77ee3bcf3812a1e0c3a3863c0e2991a6abf7f9ffeffa63bdb79658f4a77c315e908777bd1612248124d708899e989106fb0464b9480a318a8144dee1697f8b9c2ff24320298e1687b22da357079b02628ba030ef0c7564e37682b93f8be32499d9f6d05a117764bbcc8d45077ff07cffe37449b060ff2ffb632e80230e60e7ea075acb7fcc4808d9e0ecd5de0d622a10e7e063cbb572c21a4aae71eacef55b56dbaeda7fc18567200997c720c30c005ffe62d04ae9ab37134e9d54fe9e8a632499172c9bd5131486770932d38f5b1004e9ee1ef52a456b446b23d82e709fa6db51a2f116c88b8eac61f7ae09884459a50982ee05c27d6dac0d5a5d3a4a566e2122cfc41acb876c3226ed2a151a8d46101f79f958506975ad393f4854be9bd7a900c647de668fcb6e848f76dc9304ab19f0ab4b685f76feee97e4f55612b276fe2a9ace8da7b3447aaaf5b0f223392814b13720a1ad8bf51e3466a0628d62c7e915ccf57bf650866eb56c59da4758a3c56c451cda6d2c4285e17b16934a5988808730de4462c6700f51696f1ecf34756944e18107382457092f8e35f0d6ca0e54c554be5d9bba35b879b413e96639b818e506fda61cb260aa357504f421a156732c1872cf683c430cbd5c4ebf7815bf1b51d5becf274e09d83d9f0f70f27eb44a1bd3d82597ebe18b45ae861bf54e64d54c2c1e4c06f756640a1b0087987661af99a31e54fabf19fe4d1a2946e018c7f73d0f3f3e1e8a9d47234842d84b916cbd2126364d23b5d0ab9909e1530c252dcf8d6f2acb2b317777d0efbe70b5bd642e7e1a6d8ffc65164bc6202f4113ea56c8b55b785f4fce64755ae94a48c87b5747e4c704085d92a6e36643ea6de8efd2ae5dde9431a047724ebca938ecb803306467204754072e945b8b020131ade5fcca80a3aaef8929d0bdde0010d02c267f155d6c282424e790d66f85fbbc72194c7b862def1acc433b84831a619b1846de879c1d2105c4d17202a8d6dc371e908095fe4266289c8328b64b0c78f2cebb231d4fae3b635e78a365d596604d928bd8be465c464d86f8210fd0fed88bdff010943002e25c150184c39572c7e4e7bbfdaeba068b81a2ddedd5e111ce1482ac4dc17b49d6eba5c3bba736c1d88a104ffc840abf75a0d195740b44166687c6e35a8d5688be3b6170b8a0102fed2b34ec2110dcff710812a4fd5e7333a28130e46ad56ba596de6f4bb149720a373e93c04af9c758b991a10180dd7818f5aa91f81504fa67328ab07e67c8f9e5aeaabc2f8fb982f5e862ed46a87a7b0dc4fb1bde476c5dab3da1a15f95b0eafcede8c49ba62b1735051647f4d0d794ce4c8c45b2272f778ab2461bb472465da4e0413f0fda432ffe9f09e5e88fc4bca070332cdc14e2104dadf2b3d948d28f08a21930bf90c4d4d8d2501b674b352b2f114ebc9b733319d4b9fc348ff6c8335340ad11d75e5024c8d141fe59d0f0c0040fcb4aa9e2ba2eb456691cbcd6d3e2cd3b3f9080e8b3d9774f4da708fdddb94d7b48707d43e5321c2f631d4d1eb7ceb5472c98215405addc30c06de03c6af91279825b11176b2d269a2ed0b8676fe5d2950349b85444343d52d23f8adc62b0aa301fb815b62786082842c92584f8ce1d8a140ffb63a24b523368a1a5ed05dd648ac351300bd928290cb641d2c5c7f886f04090bec8ade68aab4886407de4116f03657ef5b4ce53a54b90209aa739abf41dc1af062b130a263e300e88fc1924e67ceb15709e1dd0773927a3842967c5df8e2db77094182742c4b06ab945693c8172e1b555711080f5fd54de7d2ec45d35379daecbfa2cc8e060ac11b740ec437a0ca317a271835acb645958f25b076db4d2d05772e0702b0b26cac5836453dada2630cedf507b8d0b6ef03af30b20b6cb626b505b55fda9d1b07001984b0a923645ac94724b714fc4562c0fbe559cb41d429d10196d3ca5a58822d8fae543113f0a99a6ba2a608172a9e9f6df1bf061aa5b29c50ac52629e75be433a670c4dbce751df2567700767f414f2e08172eb8731192e8ec070095495ca1503b72a0ad42c9cb91c38e44bd48c8730a1dae4d869d40da02008d39524eecad427069624e09d5cf06e551a9510feeade400cd21006acc0d900594031c759d09855fb9e43664f64ac4c0ae6e89d088e962c15fb59b950c4f2711023afd1e0fd206b0ab2672c223c33dd554e28c474411c62f4a6b557b918c3be3abbd8f9b9e2dd4834709224f0c97f00b092721bd4e87ed2034bac741a89a22aeda76592cd670beefb52b0cb8bd1631f058055d900a34ff11c6d4b805ee8e1f50197473c7cab13ecf72e897413170759de17b834fa752a4c9a248f001ad7728138fa1f77b4129d6550c961221341ca1ebd2ba59959b8dde342436a69a454bf56be1c92f5bb10784093ff490ee293ea7a9673a88f87408dffbd72d70ca97bc17f4db839a05a783d8a916fc49b7ff8512b14f33d47b5bace085ccc51bd44d4d2dca0bebf1cec0c7e8205e53de74350c4c00d5068388aae9820c4c25cb2ec093699a6cf3dfc7a75d18a31c3324edc285b10050d3b643ba8958f2533204255b10a3ceaa5fc2c22e28783f787bc6306113866737000340903a144d0c10264edc861330444a32fb11238b18c29227ae6a0930824e56c0646aa028771e3ea3e51e075c31865c927935d335fdbe9509d3693db805713285cbb158dca6e417e8f47bdd82b590456aee4af56ae12fca1df6bcb9e94d34a26733cee62227e3f1970305777aca9d8407d4b6938e4c49c97c4d3f773e9237542164a84221adb7fdfd2882fa40ea3baf755e54ecff56beee29f2f7e97914059e7123b1a31fbb8ea191918c9fbf9a960e662b8b318ae7ac7a4281d4861d8580d6fbb2b9eef538b9e63d407682f5546c7221434313db71d9b6f60f07f2e199aa8f0765381958efe22a031fef2c04c81990740a028a24d600e8af37e89281fa5490b3fe3763378702cce9ed66ccd6d38ff1d5011086d18ecabd24a0af80d063a86c8dbb7cd27f6124c2640d016944831100d6815c24300e44ff7909417408d260cd434a14e9a6ff604b74a00279f9a94b04682ab701814701fb3484b008d0fb967788e2975a5334038c87e5d8dd56cc71d48e40e9082b289f01b234df53f48540b8304c44cd51ee6ee2b08c3f7740cee833ac98892d629821ba959c07fde5323082a9aee250973cbba19b0f08148ac0a66cc6de3c320d7cf4665331797c5bc9c00f0a256d7d1e2cb5681aad34c278349f72b3eb70d462759566edf444029cfc403f07fd302b6dfacf871fe9acb68148e926dc02a4da435628f84a369c0990dcf622dee34446965b7d89c9911321dd74fa57eff101d81015913d1d4c4f8eda1068ad305b6e100ed5e64ba734c5921c03a5f809b50a9b8647e7e264733f1f0b1aaec4f6e93f7bbc731c990a168edb31f1ada8d030583246f929ba1569067e8adc6b00cc7edc90a3accbd8731f16d920af8e373132c786c4a9e180bf36504a938ee4c06b973625678d260a3dcf2dc3c60f5bd9add4ffa16256858c118b3de9d8e2a2c348226c71dd03c0427ad794e3e564d6ffceae91a069c7dc825041ee292f50f7eabb0de2c33d5ce06969528bc0622037b729f8c60959474cd932d83d74b09c1b8d132efabbf319f4606ad4810f3bd43e80e7cb919eaf6566518bcc805a2ee2c2d0a0474b402a25e1922f3bd6fa910dc6ca2776e809a278676aad846cf4c90e08ca6da96ab1dd11927382216ceb8a50612e0a58cc28aba17aca514b71e63080047bdf5c05b1f4c08d90a9ab6d58f6cb6298b90d3b85f67163957376d9cba13d9d0e7b5ea16b1a2981dcf54c6596316e128aaf10fe0041d0ca023e98a22013b3b8dda1febffb902fe46e65f8ac52eacb0b051a20d7cb1657308f49ec6b2128f914332e257e8ede2e4f36c4e42f974480fe0434dad9da99403a25da99d1bf679d26c29f6a05a5f963b6e4c2a21672d8b240c47c787642e296dbefe8458a06552047c3da15331cb9ba1c6ad32871b0791254b6cfef44e4272598ce41ea5254197ba926f6d91508cd84612347596a7422a0ff2b61a54fbcc6e0bc22ca561d8a66e1267a48195cc065f8a14fa76c11c96e64c58a3587bce015d70d6ec2911a7c12a2173bcced0d629a065d77055a5fb24e67ce04b671741fa61e95f1f26797f63bb156da0fa3e1169a7d04b2df9c184bda28f52683d4da2323b0a1f3e9e05ca2ab4dcf29323f3567ff7ed5ceb0ab0e250c59b24202b38e808235ac095786dbfefbb62e97a5203e62cb55a404065e0e2a02164aaebd73d7b2e95ba1ab42c97e433031e600c71daefba372bd0d88879d89e82f83b27d2387645539114cf95e681d4e737a6ccb511f0735365e5cdc97bff394cbc978e915526f4730939b049637881018e91d20a1d96e9bb11f778a0a2b7762a7f4d9552f5af1a9508a10a777ad089407f0a6a8d730a1aca5fd9f5c9039875b4b8e7fc2b9ca403b88489db8d56bc0a4484285a7d013feeceae253a0d6998c3499ba4040263b0051ef0b977c3130cfbc243770423e95032b09591c08f290d325d51f3959b813a79b8dbf6cbe8056a54551fee1aa00d46b7e5502699f60872f612207f9bde167b7724516e56e78d927d60f4416cf0d10238a64fa9130343c97dba8483bc956a726e23487b261ca60a3475d17be3f59b01b31ca5912acf670f7acf45a59531db81fff114b32685899322eddd9827d5b4128f96d858e39dc8af1751e6daf473cf8a0d687e5a18f4f886eb3d7788e2ce4e0879e3341e7eccd0a3d5d83537309bf75b71a7a43d7ecece3a344d86db7620870f4cc563162f2061533b536c6952931dbf2de7a3ecee66a501ed50c2af8069c692d3bbf8599a3bbcc9d06c0e3e3c598796cc464445c476c96287c571ef649ae6c83fb02d0fcc93eeddd4fa7adb5ba169ce6380762be2f2b8d9376921d56c563ed701c4191613e15afc4c2e96cba17f572bc8037bf061dc05b9ad27b1330d77c5815c8f081cf97d60d4ad969b279430ffe62a3abb979cb214a55a3724329fb57dea95de5a3ae334cbb57220106de715e596af8667c6daa2da280c5bb35b32d35b676273833215e142c77751b14aa124e063cede84a32ae012563a3ee9743008bb2a4a9fc1750e19b22d83b37809edb437b32b9dd8ef8f30834df3cbb702b8d198bee3b482b60f7fa23b8c497832c66dccb67263831c8ad21b91da3cdeb9660b560a29c35c62c6d37abe8b12877ec48b8c77f266c140d66c535bd5c1ed6a5b7798c26b427d445090462b207ad0a52e0ebc17b5ce2f84ca58334d1743c226a401b33257553122c58c7f37779a7736a412bbf5d6857d0faa2bd95f13f459f979bd6560f6e4f8338d278212cd1e92e5f2ce179471463665a69b82197286299553ee8ed459a2a2172ff0741c1e46c01ffe2be13d17b12670c43f5c7cd6bd15c8e89d36efe8d6983aa65604afb8738d6e45d12000faf187b3cde0ad78af0e81deeda0703d4b2848895bc4dd26797c09b14bcc6f1c800b66a1a55fbd4ac49005bc914f9612667b43e6efb8714cbc47ef9144196c1d50624ec7b1d583573e8dc3a3f840429b8564a4e4e9fff6a612d8fd4ce3b8b91b117707b53f389d48b0d45830e833b58d2357925b0b00b4d42473ce131949abec5af0d2f3a11b51f6dd41025c3e517eaaf7047c12ecd74c7319e3c2e0c67d5a122e607050f2359aa43911ebeb146ad92f00f0999eac56b1362853cdd5920b4c707d7f08ebd2aaa287f7749c3acd24aed11692ebd2bf4702630d41a88f12f0293e43dd2ccee952aed194e054835f3fb1dc7e38af261f105ffbb65a9cfedcbc04f1c9edb79933a297b625e0589fd689ba01dba39c731245b89f9b01d3f433def367bd692ca3aebf6a5732c7485891a7de1f88975286f9383ff130c85f72ac5052e001a20b05de7cb6dbcaab2ee8433b0235dcf5e18609580cde21f63969785542507b6a720eb7d56116bd2a84440bba4f9520b4dab63053a67188332487a9fb0030c902ec507798cb483c380eb9b9e919290b2d14ae90cff513aa90271591957f992f3c4c618d3402c5ba78689706034422ce257e1b8bd31903f3569064786965f8a413512bd1f76feb79589846aca191a09e2df7c34835dd9ef4f1e81c02b747ba5d8c09f914b1d0a3645407007155a13b0838482ea88c23dd1ea49c239105400a3ca0c84a77840a8d792ee14f0f73345f9877c00728a800c79373630d15a17d117035d49209f1177a8848d9bb2166bde31a75639ee81872312dedde395b1dbf5ea88f7850842c0931bc0d668363f7dba8c2f40ad3b19eab23bf6cfe9ff115edada72aea1481ef5ed61e45907237bf8e92949372a04c4e660bbd086eba98ac3613274d378f9568e6673442ea28ee43e3c3c2d029ccd6ff04896ddb1ac1bf0b6913a1a77ba28d4a7a2b864fbc00e5eb2a04313f2abda442b3f2b61c94d4a197a975b9618f3eb4db65e14db42663d7cc892f0c20085449c152a15b7440f4ae3c0504112dfb0fb46f8fb99953d83180762e4af95a7e53a46b839d48369892daef7d442b072adba070ef18b9a2b65f558778c7e5923dd030cee0df36add1688517f8185ed0badbc6b2b7ea09db340a698494ba1519775bc61739e3376af65a57251e833ddfc583c2fae6d28d7a2c9947afa28f4dc5bece456c8ea0c32603846aa7a900f87475c3d4af588a2c3f4597db71495b55d623fe6c9c3cbcac4e10500dde3f9fd50d9bea63ac8ca50f95f0a65efbb494e17c3154c3add2a86fe3e73755dc32cb41de767ddca298598bebc2698dfe3c0844f1164a8b78c5483f7c35e971357ee45bc2894ab337914e28eec454b0f7ebe6c2d5ba9954278aed4a499bd283f0fc3a90a993c15cb64d01ad3b0ff55142e31c06f0ba122f185c6bb469f7c9b7d205d7154a56372a5b0c81e2a16feb611cf473fcacb9427a87672ea34a1a8f351c3298147e45d8027e961d5f248385c4da7bcea504b7b146b53fffeb30e5a4ca264c618b11b2d7395df641845c458a3e8f9411718e46c267e2bcc48904389f3a5ead8401a2ff2574c5d4418c218273348c6c342a9e7ff00390b8cf20d39c51c9c267f422accea9b68df70506f885d41c8480fbf3fce016e3d52a1fac5e1bf3f9313411fcda8461f6b08096eda12a55f6daf45fa518011691004463666a73c9404f53f261d49cc8ae3464f8e592020f602d338ae14d74fd9520f444e50fa25e00941386645c7a65fe8cc5dbaccde24ffce416115b792f6ede38018f62661de1f540c596e9c73b9117b7bb30e77dbad97cb7d0a9fd87f85da3a5815fea321dd24e7877274dee1f1bd70a163156af9987b088e066316151c3eb8360062030a7c54b4eb5419e368b922946e149698da2dc3f4f4d8cb31170cb9b849932a36cf728b5c2333d0e065755d80509de6c196863d861fffc405593931eb9876d043ab931af176c9b21a31cc9855c09d88694f001e91dd8f72df74f4da4e1d730be5606f67d042c0e50c3e42dcab438c0eccd65647da9fb9f8e6330cf7341bb8cee46fef0fe0dc74bc57eabd15bd67e2e18644603da7475500f3270237b1cd8c7adbaf0070bfff0f00e443efe6abc11fe89bc1700d2a89391af57de418a4b00fb42db743816f75fbbf3059ff92bc7db76cf6aad1640100fd4ea75830b830a33725f9bd7497a24ae0c90391b3bef76c4d44cd63febf61a23ab142c62a06601e5faef1fff5cd9fe0052bb0d6a0e5d7b4023322f937d5881b3e57401e1203c698322cc4a33cc15facd3fc3f54db360cfa8b81477d9d2b58788f562819df8e0511c937e2b2c0772bdffc627d47249677e6e9b5d3fec3adb826be353ea0e1f1dcaf9bdde3121641dbebee1906f59e03f621442454be46bb41d98d9bfa68563a6b5b472c806360c97170e5998e2bd5298efe600918fbb34e3304f88819abd233e5113361202c6b0991167ff54e7582d3368d0f4c522cb9606dbfaba86efd9a0493af6c11d6260aa7ae4b639e55f001bae3961b153665131f17ab142be927104b0f8708045841fe167305c47d24fdf89540624cb5748d09be51e96a932d78f9810d075fbcd474ec4e95800f640dab3a21c2102a6e9f5e82d8da2bad983971ae4a49f1f5e8e678156dd804cafd34decdd50a432086f534ed88fb109a9680bf5b8a56184f00a11729b3aa56ba8910aa018346a11bb199fad4372f741aac45c3f6d90c4554953cd174b74fd76beddba222a4a070fc122d745350c22d760c6b81fa4a56941507b16543db68f866a6031333bdb96b1f6d6019228ac9212981df4c298ab717b126b5324df038593291345ccaa7033190c1caabe02b0e34f70af91bae219135fd74a5c295591783d246ac366b85613f5cf7f362167c7341832627ed0c354e7ee0bd4065e48c5a3a9c50598feabd22952860e4348162168d0e97c3f5fa0e4da0d19d13f95be195d32562eb4fef6bcb6ff374ea745f7e3b81a3f1743cb6abb8fcc795bcb47ac04d308c136c677ffb80fc356968f6b764ea910b3962511753be3983f5c15302930d888add42b00bcd35c80eec6f1b8955ba51f53acf9ce0e711800a02405c579ce34bd6a9849c26cfb66c3eb768d0f6a54e0531c39f4b77e9dc1341cad988204e4b5ac981f67d25e73e55eef6ffc83d69a05f65d2c7c226ad370ad9acecab629dda60b01bdaf085465da07d68e1e8635cba5ea9d871824b3cedb40dd50969f69bb86ad6c762aa340ffb9662eb6a10775a55e1c30020d029a6d60f8684c7befb439f8c4a6590d9e20d25132de64ab8c819995ab01442d18cbdcc3284dc8684401816b1158251997e6b021f45386edbdb7ca3454ee339a339322517112b3fb0357d083c16f7d33d86e571524c8e72c9cccb8a586ec9f5471b5ae43121accec89e9b7dca9fc433ae853b16f0b7b39f485eb0b5c465bf960699a30821c16f35ad86352460dd52048388609a795a9c9d3d1fd9c946c874ec48866c93a38d5fc91e8fe0ada95f71cc49bcc235c49cc279b4967e333d3ea9b7d8bebff3b887ed4f856137bdc4f4dd81ff25bc669426e44899c85d170fc7448b8970d74863f10d89286f724cf5dc28d33bd6ea049e133ab06c567759583cd7846542697eb404bd5e9de71d1b0eb5186986a2cd44c34ab1d85c9752327aacea7a62d3b37568dd1b960a5aa895a709f11f3fcf60833339e66920d6cc0188bf0f62db6789e7e2d097ce29e7c094208e13aaf459cbecb9e364010b137c8f71154f560600459154db8f71358ef384ef18b1805132886300109b812028ea007487b841d470b29a9d8c4184ada0f9b474d5aa1f91a03ed0b63d9357555629a9d962e4bdc1ff70358acf3826ad913038f348a7d9286b4edb2565eccf48eee2575fca5c0fcd9832adde3d14a0ef928df6c0f2e5694f706ec8d9eff4ecfd78ed90edddf95b6d9b8add16c95540c37012b9261929e3ce4bd2b4f7ad69e08e60909657781de90dd004230f026d19dd3e646245604086e92380e7f7255f253c79639087f4cc1c2e33a8327c690f83d4e30f0c5f038ef9c73bfc4366a6a90f1e0b52653983c52f6582c74a066ddb6f8f23fee42d541f5b151ba11b6ae3b5cabf144bd99635609d290d77682f71712bc7d810851a7a1c3a1a70c13cff7c9c0b8e75475455316e9d3975e81af45d31f402ae1dca41e5ef7c58ba5429483cc11403e998221186a271572d721eb7640543351354aaa44c790e7739a8ed47fd57e34f0192afe0f7ce688a4b3c4e69ca8d88b6ad66b5d64a603a7f8ff3342d0a4345d249e882f83ebd518cfad362784dd7b0ea4240c0a55654b461cb61ef1a89cfbce01bf5c98860aa66432294ea8421f10920c03606f3df059c7a2b95c1793ccce386c620e0d8c72828933d5602cdd352a8e309c00252e76ee00e8453358a74f488b94ac57675198a8e15788b18d71b68553e09b5d3206e7a7c66debe5b4ee4a4b786833ccfa78c9d5f2d869ca3c1c85a127c24273f7080f2b7f70b116071deb1ca93ccee456e627314b50ae73d37b408841a2f7ecb89989eafb0a70255f86f20ade281e984ef75757f94c3a15232f7d93eee2588192be6e6f04efaad2743c902015dae76390edc91a4338ba8f5a23815ef3a16aae8e01d9055848aa3a95a68945b86cdaee8b5629c346e37c7eb60b0241422fc080deb99d7a2a8ceb8ec9f637d843f6193b8459939e0be853825e68e60147103eedfa50fb2e4c65c8c260aef282c90cf83954727b9a74144079c00d93e07b0e495b78eb686ffefee68eb8c45eb1b9030c464482c0df93d4d7e30ac474fba9c31b1f14302777af59a3163c57377602b33f94ba326b5bcb9f38f42f1eaf582f9c45058ff1b31bbf18965e9061ee504352d289ecd63398d861a4f484acad5291617718f2954e6ed9af85884e997315a094be03fa7861410c70b2364faac81b8fc72f42f016e6ff4ce8d11cd7cfdb9ad5e1d42b47f2aee5d979b70159f69daec4385452f92c3245e4db9947beed4c655744ea796dd60405f7cf1df9e6e17d901e5ae289ef74bb54ab054aeec54e45c9d7418c76a40911e1851fa025289c4f099a3d9ef71a72356d081fd94d8bf21f6f8b40cd3696af790d1ed537f02da9a8401a792a168cd7f508f4c2e1a50d55290dd97deb7e32be895bfbdba998a90e5baec8b9892f80dc84a7db6a84e3ee8658315a783c9a2e97837a30b290950ebb7b289f3c53a6234f7516d0ad7e244e6608e7097871653c21a085378888d479fd39002463061574352dcc8d550b42adbb1546d813405ef9df1a2877ca6ada4d613afbedb72e6d755eb5b870bbe67c0eb92bcddc05b735ff061a3e3f3d239ddb5d17878b7c9a9ea8a618172042eabbb08034f4c1d6b94326c198f401232d05f4f5e8c5326534c829b56c02cde3c3aa5f4aed10c1c519195b3a6a98a236d18b01b690baa8849c48f9b8c4fae9c2178415e39a1b5e3f83f25434f90c791f57a1bb4a6477fe28014e8e010457b192816d2a26196c4a72b161615e99cc22acf7cd8829a7bec1121975f06c569c6a1200cab156c3fab6e991aeedf4f962fd5fe2e51c75850b655693179c8c6c7d8393eded6876e397bcf9dfd020b7ba423acaa906e7eaeaa07571644b131faf3b3d9fe6fbf20993af02ae786e720305f2f84e6f819be91ab38ea5ddf1d5e14f689d2bb81848a862d955b1c17c2f4b4658d9899f079ec12191d67fb3fb63f4c5880e99f9969ad8fff3853802d4b432f4a48acd36fe43949ef78510c4c09f1b5ca8dfd35ff0561d0f41fba433f41d4d6948fd718d724424e9553336215f604c10d113a443bde645a9292ad10bb4f251f2ce9d791f87a324cba1686835299fb5b0593527d2b40725b98f8ff418fcb084d24de94db4f2d53f062e348733f492ee9e40447a0036e24fa6c38fca7b5124e5a5052259e92409527e71e4e0ffb895ee8a6b95ccf328b0c885f2ddf0f97ebbe9da528f41bc75fe904622b76c2ca90121c18cf5bd18cc66a97d0e7a9f29f2c2b572afea0c1409153e38d27aaf7766c2c2daa4de4a735e49351c6eac21c913ba3baf5053b1dc8ad2679d7d58ce6ffc5cbded787d10e4507a8cd38e7a95f9c16bae26c68edaecc1870b83b77f4c98bae4336f1513ab4733dd28c053fed640dd8d8fce3a4e58552456f3129357dc8fcd5714f2e280b301a4030f1e5860f4ee2cc9778267f25d8ff8bf4d00e3c6710548e8fc2408c537a6826f5a59a1071b73b7a686c441afa858dc54c0b851e5a3efeb8d046d73c63a67564f53d3f8c9d140c79173046fe6b924907642706164ce20cef5c3e78b002852fd33b681b8cded5054031651916d6f884d669854f8f2d279b1219c237c8d4926e85b1324bdde962e6725753da57b96307f433028d9d297edba3c8c1a79ca343b1ccb8e99902746ba78b437374c6a2765ec5519ea24ba373923b59c09b4bd574ef8a4b1ffa3e3d985725ae79b5ce7da099b54a09cd7e6c90e7a106e66e1a42750cb84cc68f41754b6460db6ee3703165bb6c0c839b54b64eaf8c19db5b21d9c1268c8ab28e09e9614b3b0af73613e29bb4849ad221ca3a244cc76c3452dfeb3efc812f49c8ea17a516481528ac5ab2cf0294cbea407159be401c1f7acc0241fb443707d716333dde56f1e62c434b3916b62c88c6f7b31dcedc5c925f26331eb4d1e7373179faaaba4cf9d8a3da5dc9078a82bc18e34970aa887ee3e4cc01882f69867942e5c67b8025b4f1b65d5fc1c82cdc552c0c4da173242252742c8e4185f15b8beee2d4c484724fcd70c8a261dc84704962d66d5e3c2d28c2c284c156eb865dce48c209bd6b863fcc43359fe4a465d55498250a3175ffae567e690bc5a8107514e2c5d780f8f962f3acd3968c0256fd2603d3fc44b28fedd8e5ccafc8cb02e35915828dd3801d63860530b7d2ec4baec44a38f7235c77f3a061f26e356b0378c066ea1a313f052bb09a36b11183fba1a2d1a97b278c0317b01cbb170f5c0f76c041709731fb94d239d2e0132909aa11e10b71a029df398ab85231ab9226421f4970e906ae5cbcd186ea2693e2f03713a4a3d1a6f8dbe4f23ebbbab8af03cfdb60b3444a31f7e201360dc351cd8bdc7cbaa7e226c0888ee6ae716f2a4ef7147507e101adbc6cabe28754ac702b11c9bc64cb80d00295af731686da20eb222c06c32f7b85db74985bc0fb441a9fd73b9d5e513ea70764e05995a72c49992b0038abedfc3dd08b4c8151b8b8318e1e0c28004685aa0d50557c03bd15769fd14983cc016ac9c27ea2523c6c388be5e99152b06d7e59df9bfdee8b92b83fc14ded25a6b8e7d83254773849831c3b7fe283f35966ccf6f9ce55e19ef89b960106a7e6c75c28952626b1fcb87a4fb01a5cd6d139967089bcb7a297c7b9ee2952588b9f734b28b4a185244913c59dfa82c7e7ee7f30f955fda8e661819a25686ce829fc2885db5730eef27a127a1085d534a1dce4e415940c42840ede0bebca366c8ebff4303b20c094daee45fc247e3db565d6f7120e87c5e25ec0fbe3c97dfad2097f1457ecea6331c9aa2ea883b476d4bd809332948ed9bc22b35a9aadd73e5a1661d090a22b8525a951e813ab4604e6f4cf2ecc534bd500cffe27d064c565309b05e02e7cefc5cc0ced7ed968c43f47c0095c9a1bedb7ac0352ff3878c993f8343fa011533ad2deafd5e33b1a3070b05f05ba7ec4d4e5fe1d0ff6aca173708da0c4e254cec1d38b7622946aa8ad2bfb732042d6b11e285a9ef044b56616a10f1597aef3123edbf60405e29eb7c9ebc227c8406b9fb084c70fc881613c7c261646d40ed847ad52433c7e632fb67c1cab67aa48620355168301bcf6dd7c5858e0440bbd5427513360cbc62f10161b4468c7ec7a10ab4d44c396e784019ff305a025cab167701d447fd71c7a94e908073dbfae86a39ee35df73dbe6ee7581cde64e939a2a3fb3f6064f41ab6ed6ccb77a23abee4f1727cccaaf885d27dc6c3c2a0e7cfda4b915986b4366aa97bfa879fe1311944c85d3047afeaf5662b390dea8e6149167dac81a0f106def27ed4682e9b6150895b4451103bc0b06aa32fee61a76715bd9818a61835dd910033d62915e3e7ad424da79c9d3215416ccc116227f975727578f2e28aeb55a60621d80d981611f2527a8cb0d9c0010380ae348b1f77e6d3b11e3e5cf9311be4edef7ea787caefae4e6d2a63938aa16a5e2deae608646e0c85e832af45e1940deb9070fcec6b95fa8e1f0b1d76e4519b927e178f7164ff91ac2c98e0904dcad3be303626f6a2f08bd58d32e624b0448aa921280d8ec2db0bbe05799c48545b2ccf34f5c2d8257be3e28d446363bfb1155d6c7f52b896e1a74c32545ba1edbc055659c8d7d772bd0dd66ec6613d34c0b38a44f954ff6a929d58d2bcdfbc878ea72355d824e0b0f1923b1ed2a2054095022b572e3972942357ee73e79823a7dc73e79c630e6ee69deec8915b6ee40cf9b07e4c70e7deda13b1828b12faa97698c471bf2e12c1bce388bdf6377086337ae46cd09c48ff42851723f852a0c857d518b56a67d2e212a5e7d0a658af934b6a4ad077974eee3469fd35223b2703743ab993e4813f019d410ebc93b8b11a524af0957d3654f311c0b83c40c7d5a487a5281364919936fc2090a6ef19249048f1323efe223dc02ac074ef5f1183cef6c712f4d129492877a5ab4751c1d2a88075c40bec85cfec691dffde9eaf820d8c2f5e7ea5a5b5384447e348f005b485fdc49b0d890607b7ebf4326c0e0f6bf3ebea610558e3fc314eb62d247b5bbd81d24b51c1958e2bc63168643298149e78f005d92a17a8e517e09af22e1946ecc500913a4b5b1f896ee8c91221dd8edff76ed9c36bf06e007e8ea32b7f9880b6a0cbb8010568e662465058bda374f7a3b4132081df35d2d0ab236c5c42a18e8bc41369529d380ce6d4ca8afd7c5dcdcb57bed59564b53064b5a953dd77a441558df2a3f2557a0fff538d5168ecc90d359901b1e9c416013e2ce2a6c0dff71bd16b1903030e29b5253b30c80508da290185f7f4a1e46002ce30da4aaf1fca9d66e9bb0752df0d6316b6057c19f90c232b282b34a6f88dfb2fc1c6b83066e95696d593b42c29764588706bfa9de36c5e34f8a38c3d5d365a37f5a72b0ea3ad3a99fcf24683e259e2c3aefcbd59b0dc5f5d28131198da5239b1c605d8b10b64b57492630690ab0fbf82c552c258a6b0411e57cfae3fd5653455d1abee15b126894b3a801792ed570fbf23bbb19142b9c7de367b885723e6120d985a0e09580f9d761bae61f9fa3a0c706b2ee19e4534c3ded16162ac793baff020c7412a9517fcd4adc95b2863e530d9c4b6f081a22df46b49844cee6bf1c14c7d8c6093962d45046b6e759aadb19ba2c26620ca31c03378149f13a16dd7039506ee20116854793885887b2a3de8695de6f6eb3fd09e05ce2b6cef27f519700fdf249a8f061edf035c52947f33e40c637581e343cf9c09773b6b50f78575411773d6192b9fafbba342fae2bd75e6365803a8ff5b1d2e1807adf56b0a8f75b5fba2ae8e7c5fc44da2be4eeba2da6bdf2bd0621ac94f1dfe0b88618c08d2a341c3fe37910b22273731346a6c441bf7e530c26c2ce671e761c22d61d7e9dd0bb08e99039a6b825997d716747d13a5322158841d7ba92628f1997f6f0e814560bf450142c37982eb41070ed3f5d85f5c49617e992558b2907ee84b6ce44c336dc92a37d4694051f9899e152bbc774aa401b7d19e1986f2bb4f11040e72acbf6b380e0ef9d6b6d2a6d13103cb699eac51f5f1d5e3f809b4fa2f76513bcf3bc67fcf63dd076ff36667353a22b8375dcee5e18444339ef372d3a3289003105256eb2f32de9700a14510ef8da904e510310acad8490e24dd07fb139768db7d0191726b1f98ff8997f396d3d6df34f821e4bf0c18525b529a8f4414fed31740f81ae086e3800d5f1ea0e73f1b0b11839f6c5fda54e5e1803d106b2a28c638e503e338f937a9915b92a3ff8e6457a21fc1ba3d401eebbbd05b7e673b644fae69d1d38b96fe9f16e47048402cca33b1608ca8f875a88362d847b066def004b848c0a94b7956a00e83bad40ef9af355009083a714d8dcf435d4c5358a65bdcd880302b4ea8022f892c607b8b586de79c2ee589a02770193963c475a431c06e18ceb1639467c9c948ce1e699307b72c7a5a4106877652b3f85fdf9e3b4c0ef96b7329e54137a3f27a2949c12db9a79c64060bdfc1995bd2f7eb735e7b0638fd501e4e340527773f4728819b545bdaa01cbcdeff94684e3d6f3d0057cae33aa83fa9c291fc2ef6f2777b78f80a6f75230a2e9ca82ff981f288c4f48718def9b3d0a4f5cca0100b97c8845861929e6d79ee0242bafdbd343198a93044f6920708b92a953fcc6cf86461378637dcf7865aac198f2d71127b791b7094750ce0d0653cf336685635a50a4e6df3afb06c01f9b409fba1220ffaf675164f3c65c158a05e8e178f6a4f038e9a9bccf4698874c95a435118733b0d95fdb6c376a4527734208e199c15aee8dda2629750a0d1b806520b32a698c99e5f9f0b55ddc26ecf97aedc2c8461d8a2911ebf82dc44223a147c0075739398e6c2f69cd57c2e2c8512e7fc4f1e1987894483388e630a947bb8aeeaaa3a9ba687cd4349ac86238c97b58a05212481d1be5931cc5b55b1aa54efb7429e8483a3b18152ba60c937971c607f180be110d5ed7bb4786fd83648083e3d69708ddd52bee389e27e80686347e3e445ccf884d87d1ee5b0fee4afd2614320061cb748aea9f7bce0eaee2e55581dd1843f44ef260e3f1afe2b5f59e826b7cbcea976559218ad1feec3ae260059c68a988078cb917d9a040971e1d22573265b52bbcb69a2076bba2ff793316645e817f29d9729a9ddac72e59a59ca006b2e633a09908b157b0ef906962d56a8d01bc7108d09ae13c8ae64da03a42c19418ac187104fe3e0f135bf14b3f2ad91f2f7a5f53a377a6b63798922716c270ac428b33cdc95a7b1f19f53a536a45c9d65986058aa55f8fbf717e7c0d7d8b19e3b2dc317455621ce7d7774f256a671a3d27ee8da5d20e307e764695c8817c6728fee0f1948d6fa0b2c4e9f916e8a544fa1fe9f47bfbd8b05f742fa2d3a30fdd682a318950c51770c32a5c727d8a7079cbe0421781f109c1171b698787f0c054a7e60990d554f468841e277b1cc6d7910846105976d88b1d75f0506a733a2a86f5f8111f38cf21a04d19a41e28e7bb2640e61cdde210c41ce2fb698cb16116747c31d0fc5a359f77bc526dc0a51a0cddaa3ffacd38d506e955484e844ecc3ffe0f43c2e1613ef2d0cdf6e7d3b48754561ee855ae3818435575702d3509735d950cb2889063dfed12b35c025c1e4360f93d019a3e78fcc2e58614611fd8de2f138cb446a3cf7e8bc3d7663493f01a3677cef8e75c8596d330fa0ad38babc0d8564c21cf9c0edf1844eb3f181070bd7d3a3e7e7fb09a50359f0e245e493f57bf2bbc925cb3caf7fddd76acc5e52594194f31edb4bc2e7e07ba050308fe9282d5a114a5f1b9d6191e652883da23fefe8600924f98f389328c548d893f45c8dabc2659c473bbc128ca3a97cdb0271556c0c1ade8f92bd0c4411ac76e2296b5842112e46112df9b9737d1bc8427829f1d89958f32f1efd5f478708091638c26f99a5526b338e6750d08a1997688ca82f17202f4875f9a78ea729cf81a7d2dc9697e9c4448a503dd7783c68121e17a453bf8c802fd29d49af0d3f6d175af892a253b9477363378f18acc498f3e3b19c348e9944de61f1ff8a2f9df4c0881c636963f01ea66e9e8324acde33c9e6bba8daae4b7d8f65cc3c84703bba1e40c00d2005ced5653f11c1c4403b8d77ce2d1185010a88bd461ce3be815fa0458891b79773d915ce250c90ab254f0b84aada52ee70bcbe9828ed202bb499a1c06968e8a2ce5659b1a375f87f2d038431b09a8168aa28900125a0811e115317101723f796e801a5080f4460e54fa53faf1734ac78592f1d3d20b72c52d4e0372b0587396ec9e920d59d7a666a40144b189f4f018d7605aebf6232856aeb88e8ac593b0ca2cab38f325c0391cd14e0f4762050642779eaa0100bb2a88a72e6f6f9e89f805095b06f5951297670b1af0a52dd6abdf0aa70664d883f3fef35bda1a3977b353eaf10583fc767f041c952e42b1475d7e852f91e5ffdeda1467dfe848d598a7bd377c147cf517e3f4dfb4703847c4028d89068db95ba620c024a55362c8dcd2d38672e9bbd8d27b78c9b9cfed8baaba35255f0227c732960c0802be6356e8003fcc5c552ffc71009e71be2a441100f75cb5b14f6933b5c759f631423ce871a9997697c29f25786f00351b525e7518a29e1968d006287bce3c87f86e4f53b313db48201c701bb585120277ec6308b1853c601e07cad4941bc438c35bc284a6f8a3981949cf0bcfe2667fe52bbd3144eff6d2f42336c872cc92eef36bc91ac18891105eb3a12ed2ea735d8907998669a72999a957308e04ae7c6d7a36386398687a623096606826105064106aba628d6725c19c0d87a09c2b0d85ffee61832ac5b3e8723baf46a412c818b2b7c338bd1380a684c89ee66010af47d1141ba51c11f0300d1374652bde91f06898ad8b0535f586cf29061bcebea49d50588b51cb0b1c88de8e78338410b7827c4200365341dea7890d4e9a13474b178551fe2c48b1413832c0f6850a94f4ba260e5e06075f7a3a815c51df7fb9e526c054d1b96e184cce92d4bb68e588b6ec8fb6d9703b66b2efd36a9e1bc66abecf13af6941c37c0f578dd2d42785bee86b0295661cbd25456765ae48f78a44d5f5145092da7f084f093596f389711882cf6f57d2e492c8c88228b69c3e1ccf016a69ced5b9efa61024af97a1adef68553d2b0113d1849ab04f421708792d1f162f14dd4970518f79405df1a4e51d7b2c7873c3800dc65fb752c2211203b3465755f4629a6a3c4866bbaefd673936ff49069000b4054d8f524a9fe17cefc17f4a779762885da7a3e30a7dec2f2ce4cfd5593f3dda9f2e92191a1874d08d99e1d4d8b70e68360d7f823d494eac4c6f0d245990960d1e302e182a53ab9c6f7be5bd41cce58113a55ff02588f7a51a4f1c6eb9bd9ad7e8a5256a4f15ff0162af4d0a5961b3e1a93478327cd11eb0f15d548de1d6b084da4342fced9c60af77c51ea85af07f55401385559149e99555ede2f321c74ace7d02205fd449d20230a13e93f8e57e1c22243a4285f12ccf964070000b862b42027138b0d6fcec83258d8fe7fd42043b44fee7ba04a7910b5b27fd686c52966474024e42d725f250490620a49bc49e4103e19d558fbcdcc630700bc57edb0472a69ed21f225e4420ce73dd29309b61efd515056354ae6539f0f5e9062c5a7cead44f5c7ae556820eb972048b3463b381973c9609918e39af2e5796ca7ed9e7cd6846c6d558e05eb02093ae48e3d01015238f63088655d6e82e93b49af27eb1c6979c3b81470b32caa3066c628e9476f508c77f2c81a5df0fa8699a6cd3205b0d4b376f02083c10ca02c07632dbdaf72ef1e6ce7b3cf421321b4319332fdecca32899993d5ad4f853471d32565cee8e4a0e192a6c6e8fd0f064a0539d0a3d382b20594799c2ff8120067964ccefab9d96f2fb16716e3d017c8fe9915a3440987b73a6bd07a916f0437c92afa5b7e8eeec35cff3075842bd094b129dc32605da838e89b27bde3829794ebbb188292a1915a1f13bdf629f64181444c10720b87dedcd328c3dd2793ec188a0692bb4d116e791f9e75c1a104a6e0a432b37a5a6b562fd378281c86bc8b30aa13c446a262e22d6fe1ef4392f69d4741a48448b5e92ca9653be408c341698b46a63811912ee8ccbfb22c7fa8a6ae452e565f133d02844809de47b8a696ac8d338954639c3ed3f2ccf99116b96048e66c9c9406b2648209676ac0c64a3d083da645b7c240cf39d2c4bb40af39f91d7a72b6da58b98ebe14faaae842d2ea9a9cd23f154a41221b0e6ede667f1976f5ec4adff870352cf8eb056f87dcd0a0b7e2b10942c3644a934b5da8699d342052627868f273dd634c4e002fd268e9a7cc432c446280135310d1a0822c709bde391254e75ce6c380951beee6273f448692c20b5222389a3867e8e4bd9ba44a654054133099ec036d08959babe91fa74aea85569caf9a454053a664ce25bc37b1339c041e00034f905211744e4cd56e3e5fa8ff44fe96b891081c5b67d2d4aaed4a165d4f58bf867f2094b69bf7dbd508a49041aae9f77e0dd556d80b99c78e4a8e14d673733b1385dba6dad4a4ee2a311cbef06f4961530661f78f31f129fb1cb5c0a72f33cbcb1b4c97dc1dbfb6b459a59ca30c43f0b3a4d5bd5f78c228a4f813ca23e6184c99465c47fe4e9c373d997125d21e0317013090105d69795b07b64c8dff6265f3010daccff529e6fc3805049882296ce66d73cdcdac6b584f22622bc752cc50317927d2d98d2a66c62bd2975d2fc402a2632e63c705090c917758d52cd2bae47f402c6df85d42b4b004181f2f067f228dc92b573454ea1ab519366bf93ffaee56b9a6b3d6028d4ef5d7209ca709f232c09d666509ee3368617bfdfbf5eb6a92c58e9fe4705d8992b2acc4b572b9cc147eb8bb422521c90173874c6d7f86ee530b039dc375decb8a19a3e3233d985cc10ac5431cc60c88fd535176899409d7e11f01ec1832e212f0f9f6dfd8166112d4d07e43c32e6aab14d82987bf089eef3c0f435c5a7d62084d8d89d8365218f129546c04592af4d206ca76d0a1c6122894eab8a048e9a89baab0affa8c7d15905494b55872a6dcec42652a680fa85985f53c8f8d58ae3fdcb56f05d0cbc6651236c7f00bad0b66382b57965574ba327902cf6c15ccecad2c7c9064b570cf26b77fb66e0e80e7d42a30b6b00c83f7216804866c6536883ac4dbf43cc2a1376f1cd62f0b0ecec3e96da3c4cf4500086445b6b29e4edcae1c2d5eee8f39f46c6502963dcf617477406a651c2ef7efade3677ee5178cbc95fdc8120b0841ab228a077249fb9a0f0c59c45bf365b242c8fdba564351e25ffb52c0804b004aece92ecd7fd4bdfab3645d8666df5deac7724b905ee3b9ae6ad17e77e378f9db54737eb70430e4de1db247668930377f0c61228e8b6ebbf2c876b99948fb25a394e4c24e1786c63fca54062bb717a03a31add7c0dc84e102894614078462316a4f946ac241cd755b13841772137e2345b3213e4fc9e717f238509c8ab319fb54034328a21d6536b444d2302ee072848b95401699bbe64f614b862a1c9212b5cd3c07876032476336c2ce0bc71cc22baa0a142c59fd0c190a9aaa7c230b3c10c5a9e79233849ebadba80075e07181294f037188f42239e2a1454bca0e3a29bb89138a03b49505ed2bc9df88c87787c12f6031498911cf0891ce884b430de953d7bd8b96702f7311f37067338e4714a32c2632904b58ff65378836d2e3517b2003a27957cd571f1d9ab3a4870f9954bf8690380b12ee0039a2f926c793f3269b7664c97f5a0e6f3e33480203af0ca92580e7ad987b60a767e419c2cfc1646048407744ff64499763a36be4889f025740b103eadeee56bb5a49902805172f44ae143414d25d0915ce55f41e1cc9fcc7dbd81a116d7ff4344e7902440a04fa0173995b3054b24a070d97901918a7b0b5ff4a36add26cf4dc50c3f676d34439ca428c6f92796e6e31446352d3c17c7448c5a85de725563008c230e81c470f46ea18d58347e8a388e6d15ce37b65ac0cf1e83cfa9290bdf7de724b296592297c09ae096e0948bc6412c30b2d36d8135f30418170b16cc9a19381083502127046a79f1eb61ea30e091db41e0e06386435206d453d96861ead8b293dae1a7abaa0d2c3ab8b2c7c70d910d4c5161e5c312c79a1c30e32347971821d5c4884bc1022816b06212f64e0e392c147c5852a2606aa4e02152b20a2e2092ca8c001153c48a9906c60c4469d7ffa7d2ea2a2868fde91076d0c6d0c6d0ced47fbd1a098b3f3417d7a7b43e84eed6fc583bf7d87bf3f23f4eb1752f7801ff99cfef6d4eb2df57c30103e53f10e7fc7b3d36966d229c237acdbc0083066308431314a01dffca04ed805fcc4d3c0a7b7e13cc2db09c65bef4225045f1f38079e5bdafa6cea56fcaa24c1e01dacc46a792bc65bd78cee456976c69bf96464dc25e3ad80549771998f87a32cb9eab7923ee31209f35640647856f29340bbaa633ef3c923c9b22ef3f1441a6638e208170f0c97069c1752b89c647ec4b54d2eba7898063734b102170f0ca723979393c350c33882cb4976e3099790bcf931f4447232491fd4928b738f87ae62236b1deba17ffa45930dc5c536ee437f86e286add47de81ebb66a7f36305e3d5b14f1a4996f5ce874b87e88fb4d4888802bda54154e8adcf1904bec1fc7bebd34ab7ae5b17b73eaf300e75950f95f4f596e667176fb16f22c57ca1457dea0b511fca264f2af10d7905b3ac5ba62cde6a01f34922c9b2ddf70f379c48561245e11b1b49c438515545f785578ab751bc75a54c8cfb03e58789f9e44e85ea336ca589c474613c6c21d994427df30b559806c58d5d04501ebeb80d6f0536689dbf07ea63416a35b83df4d65b086ca106ad773f79eb272617e5f2eddcaf83bcedb7c939e3b4b3dbb9f4b60a66659dc43e1e274030af5e3f1eec892f9878598f2e25e8e562d70c3209497039b1284ffbd8c5a39fb74b0d5a9faf06ada33ed9d4a0b58e25b1f92159d6512f5e289b8afc90d6adcb175a946516f56ce96d33bde59c7134af7924cdb21eda905b9a65c7601cd6087cc37a088013934b3ff4f9a19f98dcf8ad7913896fc826c9b2ae525d6bede973a141eb451a8c6058b72ea44e9372dbb9ad739fdcd2a095dd4e675d2bbaa16c7aeb13495a7bef447aebad6423c0573eb30db6fd86a45ea7a601832dc618fd86630ad5e7a4990d26931b9dede7af79e669be4908c4afcf9d038ebc538d8dd09f4d36e7bb644e07fb41ef084e8e987b8320e6353d7d7afbfd090466f137004b12b3f8b1ea326d23a3d84ca1d2648a04e2623438ba2f2d003aa20b26485880a0810450b0d8e0032c2f2e9ab8e881b275cbee8eb65b76b77cbe5127a573b6eceeaa83e876774b29e527a59452deefeee62159dc3da7f76c654b296decbea9d4e32725fbcffbdddddddd9beac9c5be8b92524e8f7c83a5942d41d97c34278da00e2d19106a4d819d76da89d569b14a95ecb493469fd32ad9692756e917d362952a558ad95929f605ad95624ad356aa64a79d5f7c31ad929d7662957e312d56a9d2849901b3dd72d6cc358fb3229ff5b89f4d7985a4556236ce6931a7b26212b39b56e92c82553ae5151cadd56612b39b4667ddb42c93d259afb0189df20a4c6276d33aaee3b24ec77a26b36c5a168bc92bac8e752b334d6276d32a9d9b96c562954e7985ed172dccf2c86318666ba599dba8a20caf2d7b808f0d84b7c7fd21f53594d1185b34c608f4c7cf31cc2dad2f4dd3366e02bd8a2c09d1aa6bdd4ebff58deb4ef207528703b061c3e21d7109c838d65f3f2b34f95131a02515a83ddad7cf17462adf1d5f3f5c73be79a7d3a9897b8e0e1dde31959adb30f6ec97f28ef88a38ae65226a104a83b1a8591d774418308e76fb4d71826ff4c7a10c8b1b375a3b2a619d5232efb436ec1cdd46bfd14647950f99c828c8921629d8628c3dcf5b96b0784c8ae59e2ae0e9120ab210026d1900012f9db350826ffa627156b99128fe45d9a32c7a583fa7b8d1bd2646f12127841d08f0530832f879e5ebf57afdccee3e52830d6c6852c30b867082c8d5d3c2bebbbbb924d74619533f6b6cc41a3ecc71c2cfa2293498d343bec258ba0f598b8d0f790b8d19c6243fe7929f45247d1893f8199f1c4d2a3ffda7dbab72f08a2a7eba8e1c1e3fb010c24f5f21c80f3f5d4811a09feec2154e5e4040a2c70a1f2cb0f8e1c11110108c8296fcf428d42d9672458c9f4188f244634471e79c5789876fef396710c290d245b737005660f916b2451a86613fd88204580f98b21f8c81434502b25620c130cca7edc19064517973ad3001d2911545f050c58f154cf44085911551f8500592153fd0818a2615175bf47432d0a1075034961e50f1a1c3a0075828d103303ef42a9066983520e9f06003b6d0e2890d9b2aa6d04208cb76ea3ce438f40c73cda3b66dd8e6393d396e7693f39c3e751e4beee339e2f2094ad69cb3d21e6e90152a30b523b1e596ca6d98cd6a1016b835bdd65a6b9d1608c279ad2b6855dbaa56533a240fc9aa1d1037aed0adea15e64548905a6b759817c6991e7b26b1714de8e2f3d5b7db2dea533639f9d63b54ef2179237dce23be3693af5d82af4456b22ae79dbb6455efbc56ae3bfd5c945fef7ca08163e016f57a7dd60a74fa91236f8a84aaebb5faad8ef2aa771492aceac5a1223fe44d5ca2c264b52fb4d967bf2569edbd3f4e9ed35be7c3cdc2383f55c6a5ea724a16eae339e28a2fc9aa3f92559d7a3c0d56efbc082459b50be28671e9abb7472cddaa610d2ddd0a794b5ce2e1e9d2a757b7351887ba8b4fa6835cc0e6ccbdb59cd35b96f9fc6631599574cf1b36ae3901ddee5612a82e5d05eaabe8ad24207d93bead5468dfbc3d6e95427c16562c7c3fffca25bd958bf356ae4d5a2c277a3f2c66310c6326166cddb79200e6989fbe179c00e9be950bf31756f15bfd38f904d875f2ce4fdf0b3c4e54e8be17303ff9e95b45cffc88eb052027ef3c7af7f138891f90ceb38f67f3ce79383ff91117bbd8659d5d5bec745a60c147fce9136057e62de854ff91454739bbacb78a8e39bb2890153057e1e4d8f78213209877fec22abae6d64fae42e7a8ef05ec5b494073ebabf8a9a0b95da99039e69963de39955be6d948164b9695ecea3c766598952c2924b4b3a7135b04a58cddf1ca738705d1932db2440bc410e470da31767781c94708a1d0dddddddddddddd16eb36e211bf135c0798036cb9902c82a6a419191db115cda85b47dd0a35246d8a4605886f213e837c831e71438d4823d28aa4a6a46427e5aa37e76767e053a3026dac80811c4d4536b2d2f9eae18948723a296ec84c458cd0a8ac55a952d3e706534ee92ce53c41f64c010171bd81748b63b0bd9d59f22687593da9e5c9608745389e8f730bf0c12837b4a04dc8481e7a9359d4338f8653ccc5ae87ea432329e4b0518409e49962c82903396851850e33f8f6ab72d0a6d311f9c70c316270832a682084510d29d09205e5c36d61fefcb9212b492993a618c0873670b0a200497c927091430c6c985eaf970d1a1360b400063f2cb15403972c420c2295c648ab0f53df3435df36541fe6e821f2c10884281a011837f8dc80a5080728be7574778f2124a3bbbb2d4331c64bc7ba5bf5ddddddadc3862856f28fae2243119c646185122b3881ab51f0ddad447f3788e57ab8212b09b941bad51e5df1722f532ec8f1d26d910d4f5ec55c184b48493d7a90549c5fc84bb2842a6a90b4db167c77110d527c17d5a082977ea518482f635e4a292513171fd2d444b9e26d910c44df4533087dbb172131c177dba8c3e86a2f2a49b0279032a51dea5585f753aa219b250975c9a0072b7a1d4188e953830842baa210d12735740c885c31306a167f686f134a88988a62c8410f335071d1096da9a265de9094040749423491e48207b7505939bad263e5db6792f933977cfb11acd03c4bd9620424bc9ea56081799672042c5fd43454d424544465cb1445efcf453b60e233a508f491c6c82939e5945386a93934e79c5f123f9f0435d83f3434568056aba319339464c81852a988666698646484626296522924189824a39797211717a57b9b50a8a3d309a8eb84386e69db82348d28cb8cac65c2f23b55907ea70a9567fee18616899188888a8ca6141124370ea554c90f2ba2c18ed895aa446da84a15a9a752a9538e72a8460d56a25ab46db1bee416231c118e6ef9c68cba15b1a16e51a66fc7863028dda274099b821d3d96a5061bc3f2ed25380dafe1cd50c33dc61a5ec36bad51c3a327bf1ab1060daf4183c6952fe1c3901a6c1d1a1f6645c90d2d145528bd253a2a0a3bc8e8a85ba145a2a2e5db2d52b7421a64a55bdd0ab1a1bf1277f0b76356baf5c3382c34c44f851887b125d8d0946fc7a06045f4cd7461455812b548cb37c55287bea17cfb8e1525dd6a229e9fc6dbb1a2c4ca8f951f2b4bbad54c9e7fe5ed58596205c80ad0946e35d0f3cff07692a61c1d59e9569fe0f965783b495694949e74ab87787e95b793f46468084ab75a88e79ff17692a010112561e9562f797e196f27094b125312535212dd6a133c7f8cb793944492509250d2956e7510cf9ff27692ae242d252d2551e95697e0f961bc9d242a494849484945ddea9fe77ff176928a928c928c9e74ab81787e176fa7ca93a1212bddea1f9eff7a3b55ac282969e956fbf0fc286fa78a96a6a629dd6a25cf7ff276aa4c393a5ad2adeee1f93b6fa7ca1220a024bad53c3c3fe7ed54494248e84ab77a87af726569a9886eb5cff36bde4e95228282a074ab49f0fc99b753050a115151b75a87e7b7de4e952223232cddea1c9e1ff376aa606162daa942a55b9de4ab5069907fa70a12e3743b5590f8067f4e1721c1f4215db24cb3e93b88524a29ad186318f530afdd4bfaa7a720ddf985d1e8e7e270c3d9337b64101292781ad42d96828422e8d0abe86f3c17bd943ca54d5d0a91e7a38d13e001f4f287b60d378c3fdd43bf0ef21e7953c3dbf9bbf1af16d1b349ded4f8ea8f643512245fcfa5413fa7115c6c08e3e9c20d6243742a49d2e3d48b1bce9ed9236f6eb37ebac53d9ed168062021514ccc3e817863f947dcd135a8b6f8761e8ca3fab0f8768e5ce5914817cc561c2e383b1d2ae58e19c303d808c574c4349a9347b7ba0692be612b40a87c4b26275bac4c4c0ec1dc5af67ec06c10f330629f571f7293d63a7fab9de8d37ea1740fc4233f9d53350d5e3b5b1097b8ec714ea6926e61f61107f3fa16298d9c9c4c29a54e25ddb266323b1c78c6198d603955bc327afc6e836dfdde066ff3bc74cb5dcbdd4fd2f0329bd6441cd19be6e36456bddf6ee5c7ad97ef266237bde5e46a1867737621455c9037dc45856c64820dcdaf87f23852e0e41ce7d1c59d38afc1ba2217c0d51d90e93a7d35cc807271de2ec62af7311720ab35ca6b3e831844893d9888870e1d363620e85e6520ad6fb323cbd3566b041dc322c6284472132824f6cca086e31772d177748e5f0bf1e5c720ccda1a7779138986e21787ac0872a2e10450c7511830ecc0c112442e27d2a97757c594938b2c555eae96134a103f2f177729f4cfcf86db7256e98e355bf45142346549123f11ab54e9227131157da2c72931c69f2b6e187ba66d92799622060faf448b603baf915bb66ddaa6653176de4db18a6918949e79ce1c4f06a5d39048f7c702cfcf2627cf9137a7cfc686688c227ca8b242f486f68d712eca4f528c60f4283f1961e8c36b04218fdb699ee6e9f485457e1a5dfff07e27efee695928c2b47e6191477d61911fd25eb98fbb14dac3225fc3fba72fec0ee767643ee72afac5a1bbead17235bd67294400e34fb1cec9825c8186eb6fe5f455e00689930d555d3ca77dab35e45c88707ff2ce67f53a77f190584a518e6128df22d773c8c9519ed32ede0c2ebe613d79f0f767b7ed6be272aa365c7f203f36d9f9405d37c2797b9b9f7c4ce7be21dc60e7a37dfb647c94578f08f728a7def4563e866c4e9dbfbd558fe9dfca471dc279751d94cbb76a67179066c5d58f186298d0d468566e752f265d30b26830a6f8fe98f80da308524a29b169a9ad169357d6847cc44208420e3aecc00a1a38410587307eb049b7965a8bd9b6a08d0e1fec2f6de101082fb23802881bc078bdb49460cb603a0a52d25001a5c9161d4cb1431397ec11bc94524a29852ecd54758bdf8b0083085124114a1c81084c9040841f3629e5ec3e819bc66bf0cc21a59c577677730d4a29634a4a668ee299c5d9f3ecef2f6ce15d98e69c73e69832c66843a9dca49492ea9073e698363d3b4a29419a06995b35c6a89a924e19a594f7e308c68d744e2bd9450925a5943230a7a0d24ae79c53c32a9d99d56854aa99759cad744ba269de69ce59edd3dc6a1f379859ebd8f466e658866db7729ad69daec4b2a9a14e95a24e49b44f93e2466dba90691e332dfb429ec77c62d68b3d1fadd52b9d33beecac5485a5e9a72a88684cbb1ca7666264a68d3ed9a7c59e7f7539903d299a54a752bdb8c0c850c998416356cb836b401baf30b28bfb42bb619fd552302fa997eede53879a81612b9a1266d52c76eae4a9d341d3c18dbed588e495032c439d3a9dfa5dd965a0dbe205d9a37f08cd741a1a536644c80c60b3f6403dd9d823c720ec212b451a2a967191b5ac4e0633dfb6d97281331e8e46a5da380ef5c51dd231dfb41b94b3f390372767192e35a00dd4c95fa12afb620cf29c474ecb3ee330aec35258776fe534286eedf8c471874c71cea813873afd882f0d0737faa6510633e7ec035f9dc18c33117cf568b58ff94696d958396bdf512de934f44e272a7d7c35939e395fa83ec2755703d5b5c902c4c64aafd7ab0657749b200c81a82342cf690838d8c15738f594074fdd52bf59c4c84204f34d9412f4ea964754f3d2c6173678e9577ec1c54ba6327d44855aa14964da4fb742baf4ad842e11e21b34dd0a291038d9ba4d8e13b8ab51c9dd701f05a2d34e6ec7b64c7b5377e5233cf2dab7da78d3aa7b0de6980dd7e2cd90b0da96b9b66d5a87016404942dd340afb1516444cf6fae6158a743bdad8bcafa10cd370f35e77cfb3888eb74953900492b1931858b8c98f232dffe230806fa060977940226df4ea46f588b50932499469bcab7cfc9c98e866f443f61dbbe269c6b5a6b396ce40df7d18e8ce56856db1951aee6d4b9351d39a634c8cfa98f1edabc2c10d105469a525111413f9842454520a11577c4778115cb24e7c79139468ecc95525a63addc54e9ca9bf87ac55783ed42ee6b42c1b88a6ac36b3021825092850b1d6481454fe104144ee4807e446cbed65a6b6d0209eca24eed77db0918e8e0290ec20d6a7cb045134db53a41433b61c30e423720c2c50bacd892841c4e1045efa048a80917d473911012bf3d170901318e7c1fa117d36f1967c30688e5398554515c8e02ba2a7ea8af007c3395505f18fff34e68302acd9869c2149237ed03bafb08a1bc7af5f6e9167b2ad4b493522aa594df74cf693e75b7bbb7bba7fa82f2e8f55b2f8c3e4e3f7ba07ea6fac317fa573de453971f7f93534e22361a179af0b67daced9bf66956bb75eb73da185ceb34f57293f2e993e96da6654c803e0af15c7402a5df64b7337f36189be73cad7ac8103ccaadcf2b5ab4b838aa73949647f9756289f56945e796ca5b475d611d55340495bf7f7d837149c5b8a04ea71a1b28cffe8c93cb8ff9d69da6b380ea1ce59dbcf828eb931fe54d6714ea73eb75d6b9ae07caca9e514249b7c2eb2fdede3fdd1a72ddc5dbdba777601c14ca5ffc7a305efcae7b00ca5d5c1c857217fffbe285d74feee20db98ef2adf3d139cab5aec7fd50dfa6e2c6f8cd515e2ff15a49b3da5fbcf629c28d1f4e2520a179a55b4b8c63bda716286f7f80ca519e8c4fa95ba81ed355346e43949fbc7d06756b08caad77d6f988500871e5bbce6dd703e5765aa1eeadc758eb26b8ece5669cdceb98db26c2fdf5d048a33cfbb4f381faeb9b8b57ff0447cf5c3c170d71e5b71537c3821bc6a7e166567031a76124fe10ac047ac2fe14bef02edff52a46532574e412e6693668bdfea90b697cd83ee17da40f53e18f0f89c47c7c69afde8d275c9287a388c1096870c180f54471fd8d275cf5cba94535882104170c18163e7051af1f0f1b61290a820b062c490817fdb81110dad89aab9863475c2e592a50c79cd6950ad631b75f75186a18477051c7beca5d6bafa451f18df6ea5d20d44a1e9e810eae98c205037db9a81f7135d808681f6eec294487c32bda3be78c36d84e4e708372c62a36db2deeee96cd8fc51665b3654eb24de6c9b38bae74767377335b619c50c686a231aa60a3b2093f1ac236270ca4bcc186c3ad01cc1bb905669e952c6e174c06c6f26ab5d54ecccb98557d002ea0ad32eac4e817f946c3a085dbcb26ad469431046d01d2f283c5e775a4c4b78d418a97870561f9e9117ab57c81c65be9b9e28305d3f2bde5d542f4c38e6ad4d0aa0d9b6c25b7dd62a500fe69e8466f90c592d2b7bc78d2d90d0589887843a76f73763a4d6a9a25dd752e17ba8c33dadc29a59473e9b28777092168cdaf4fc6feb21f5cf690bee69cda4b878d5f1fbd3fb64f2196e263636dbbb5defa255991718ebe97a15ff2067b4956741bdaabc25e1f1dfb42f0c37e452564f8188314ddcbe382b0fcf4c453e7832ab197bce1a8342bba959e2b3e1f63048a31ca8f3ba2f2fae893e544bd7a36be1ca79a65b3b8ec3c6ccfb3c936a8822dfa16652c0a6209cb7c9682b4f421419ddd669c4b8ff34dca107cc96599cb53e69ccea9095ca17cba8cd389821bb20e665c306a327ad67351104b7e93e1118c893e13b96341f5d10569edbd5bcc8c2a6646f5d2b1bab84419e38556f544282472c2b7c79537c3b330b82be9f2fbe18264518f2fc9a2f70b89a4fe445d5bc1cc07aabcc1eb2acf3c95bbf070431074717171661777d9e1662ee3ad665cc6631ce5ad661ce5f137ce935eede18660538e4fc1387fa111fa391aa46ee35be4409a823981496ee6d263083eed317281070957a592f0c85b2fc6a537447aad6e6de79d6fbed36d7ee4392f9ccfb9f4c2201f1be46438773b443e942e8fbcf488c8f80c107154e7a211557961ea339ff15ad041b90f198ff97264ca83f1fec50b794a0bf34a4751d5142179033ee91b76511d09c535dfbe0db4b6288824cf549e8b4a30f45b731dd86d94524a29a59452efb66ec529944e14dc301a45242222510e1b118971520d52aa7d4d6638fde2930685e4cd8c2f0249a158d414978437cb0d23d253af513cf520dd923e836e086e94e37ce3baaddbbe958fcd35dfd93ace6bdfbc762967d0056dd89c90c3a35bf65b619f524ccb6c0154a94f8fd23967a45c270bec73b9a80441fc2b4ca7b188bcb997e98b5c04d25c3a085c9031bc744addd9525a99d8b343dc15f5cdf9e8f572ade8f78373cd79b02246ba655dba0bddf2a65d41886449e9da0aead7f9705d609cc938aad6f4ed4ae77ba5944e575966a594524a29a5949e596c856ec9fb530159443aa041e99a265d4a14748437f40bc471e65b0d786ff5f9d5b51c3736926593a36f4e526ef42d9bb2a6bdc1b6f996d916f9d9cc1f3e195de9f4830889d2a7f7f385ebdd3a414266aa2ebdfe6e5badc52c56c1db9d4ee41b92ea74e639f226fb6c6ccf3f65a1a4645fb1c64aa7d7a8744a1b504a29a59c734e29a59452365766c64eda133ce79cccd8ac93ce9e93e39c45dce81fb83c65fedce85c0f37fa9c178816b4606e410b2322369dc8cd52ea2cd56089383966ac324d8c8a6fa29173d2873148d12842616431a024d8896118162520810ac2b0e1aa9e8b7e7e50e5bae0e0670913b48335d8074ae991ade5ca782efa2941fd89e1c7fdc8c1a61a9b9a83cac61bef74b7d11175ccf86407a8167777774751714cbdfc21cb4b209c78e9352aeeee2628dfdddd0d80a21fa4bc94fed9205a7ee8eef67ce8820a6ffed19cc5371192be677c7777b3d251d7e8749a001f724a967c90c14b2fe112010c8fc6094a92e8618a974e731b0c2631453dd8b0b21d8510034977e76065003354178a1b9ae841075a88e1248bab8f284209babb3d707f3e16c3b78c4ea75bc05255d1cd803ce0f0d2653a1da99221a6d3992903bcdc6187215e7aaad391aa18e4c8085a60c50c5f2c8183121d828a00c545c195825d3e537600d3e9b4df306a38a9e8bcf6536195be5c7913b9140d098650c0b7db4b82a46f57f93cf976179750f8a8e00634e0808719909a8c51041725cee7ea40c506a82149fcd870c316465c616484183cc8d0a826162aa9e2be533435367204cddd8a1e696430d8ce47da97c3c4e55f6a0eb090b8839660086f80db7e212dc208dfbe35c732ca53f59c7ecee1e186bc64bdb125219977467da812fac3379600416930beac1038279c13cec9e6c42634c3dd6adb84a46fb21715cbb464b758a46a8d64d01318cb0b88f1d05ef9948736c8da7b552a19f7d4e703c67ced03f3d27113bad17364d5002bfd90e849da4da05d312e939249c9c8f88c8c8ccf78ca5b015179ca55a919991f669441d6deab52b983a0cd698823405f1d882a9d71ba2d877d21fb60c438deb7db29dd92dc0a084cca61fc88ebc55b0179f1188ff97862b694179bbc7e4956ca65bed8b4b29e72198ff15640663cc667be8ef956d665be060a92ac5ed94f02ed8af198af7dbe06e286d6c872192ae67a7bd6e9b83877cbe54379fc31de745d8f8b4939caf380fd6cf35006598f6b3026282828a80523d733c611dd066dbed9a0cd066dd16362529d806fef3cfe8409885ec84a16c663d78bc7ae93d7d59fe851181912a1a71d2e9669de16d3320cd3b40c3bf9dcd01a3d52b7aa5ba46fb747dd6ac188b546d252c1a84f83d3653d0bf3e298e701fb5606d90661bc76c9a020a38c8b6e8d64832ab79f85f1f84d603e1e185c2f9f9135aa35cedcaec164e39a90127d4776131e48df6435cddd3c05fcae1ca3330eab3d8e9bacb5d6ea1e7764cf2d8359a096e58654683e198a9f8a6f0871ebd7c4faf45075dae186aaef7e1a449388aa6e35467de8cf120a242991115b9e9d61a8c4ba9b11e552b73bd4ef379b25fdf64dbcd13c7a93cc69f6cd66d5764aa373bd0eda7ab64f39a56bba3ebd4844a5d323910c4f78fe620cdab8a613e34eeadab8c63dd249b471cdc6be35d7314ef41955c90ded4fcd33ab79b7c1a9ddf036386dfce95745e335e046975c50874a7b1aef96e693bbe537ecca68bc92cd8872ede6a14af3bc50738ab9f59ce6cfbc236f3d2337441c94ba4acef68e6f4426ca62c3386c3366a73144a7317cd481121b31d1019e5d4701425577f2f0e4ec8c691ae639dd792817cc394b80639e02187489f2eded39e28eecc38938daaf14a82f8a3e816fb487ad6f8f26b815d858e33e166212548c5377e88838dcea88a1cc361d475fbdb8e4c5eb883b5060220ae360149890c237f8439c6f9f5ae6f633fbcde9759dd5df50315a6de6e387439d39abf1b2037c23cb6498e086366c6cec3254376b1b6fd8b5833f0c4009ae506687f4f04381092206f9e3870213458c833f94ab1e7642d930e79ab0c6d157dfb8ab029936a5b1091598cad4e4c9246a92c5c92708071afb4a6a490b0b0b50fa4e35d1a6349a20b484c68e149881a40222593834a50677240ce6f6b19d48534d345400458922befd88680692d1dbe8b23e264689e48de676f3ed9b81640444fb661c495675eb748b1c0560bd5000af5983a806918c79f10dcc635e8f45d64ea1075e23e21b9846f49853fb7ad9f046acd594b42b0d5a6a2d66958e60b2184d35cd486db19e6ab29a9276a55b3d03694bea4a6aa95bf1f314966ef537847aa396525abac59f031aac393aa267d3a33d8b611c0591c56a65c00bab184619fb563e680ea24ae714c08b4e296b104dd91df39258b7a3d2e29af098d3cd470c35a28f9f4d7f391aac9b86c43843a2b77ba92d7e542ddd708636e3e8555c5c546c39a9d71eca876f54cf91d1e34729314eeaaba396ae10e36c5ffd3e49f930ce8cb6c445f9308e0c1f694a5f7dc33819427ca33afde2861469674bc184c73eb6c79e8d06ab47cfa6bd1c0d7233c7181f2590706c1b363a788a0d9b1c3a723a1ac45da540e3f9ad5283338e1aac33a834f8012171d418f7bdb0c2d7a9b0b9f6bda0f9f6e5344ac98b797d8d79c52009faea313d31d563a0f40d658a49d22d2e22a227e605f4b58f5cf0614cd05721226cf061cc93afae30c6e7ab6716d39494ba15ce5862ea568852faea3546e9c187f40a151f522c5f79f021cd8714e9abe649d794661ccda0d22d9452835e6b1c112009afce926f6aa41e06a065d3a0d7ba0083d265702b88ea02dc5a31285dd5e04fc491e3a534e1a547a348a56fb257113d47615cd22daec1cbe7e550c75483970b3e8c5382c2f8e4a55bac763dfa2be6c22b6ef960503a8f7679f3e3747a69e5630c7c43faf4e28b6f48dfa2dc62a4d4fef4b28f4d381adcae1e4351e5890f1b791365882c10302864012fa537c982c89b7649dfbc7609d1fc48e7c375eb921e8384b2bbb9267fc41fc902e2be08e45a5c1235155c1d3629b8db8b715c30c10de3cf07758b31979d2a5a1ae48f11094f3f97262ecc330d92f0f3394d7d1a6ca2da5d120dc1cb34f600397517e44de637d6e9d015a261fcc93c7ad6378eccf2d4a43da75dd16357e6d9e8902c5af3360dd2fec02ee9b60b5149cc272fd96816051ba4366cc006e910463022bd00cca90b29426dd8481665e622f2460a611ce7ad5229a7575d7a4434a21c0d521b361ab469ba11b4d1374438210d522b6ec8484ebd027d737d322a36aeb92ebed9ad5d3c7655eda5b399cdac96699bdbcd374a3b9d262fbe9d32d73223f37f7e73fb829edf7450e091a3e34fe8d610ebdbe648ae352207e59a53476173946fce7d61111e97ebf15cbf924563c64037f3950a7dbddd611ce67bc1c52333cec91da539ca5bf9d03ef3ec1b72fab4e7b721f71999bfad329f9fa1f0e2adb28f5d9305d77e390d1a712bbbaec72eee22807d1cddba6e71857ed270b691c618ad8d98b5297a82324f98935aebb1c058ecb9d1c71a7161fc07cc66a5f5422314bb8f6598d30c87cd3604f3ea1bbf78dbbc710f2df5f98546e6ab3c1e39495c150a3c1a6ce2ce1ded7cf078a2ab06560328e8743a9d3c36a901e3eed5353f9f1e81e40d007c7a0c92379ecf1a9f2a55781f8542c9c8f098989899989998984e4746860c196fbe8c167a604bafc30dce95d7b80a34eef90a48096e829bf0f16c603011b94af023ae6c8b2ef6c497644df73c17246bf6308effcc5cf376310e3323e35386ab9c7a2aaaa294ca90e1aa192a95ab64784e5316588673a723e3e3a1fa723a9d998cca7826e3dc3de065c69b2fe3ad7c64435e3cf3123c9e127c051e1a1e44b27e705e0874631cc601f0ad5490345c3abbbe6fa542bbe7def74209de9e719ee3c2c34d31bbec7063fcb3cda20ee31784f9e687798e7cb19f440b330efd14badeed52a838f8c6f41a9bc75b0e0a3cbac52eb3bcad390d4eb734bceb81f9f61b827dbf9de086387e7a68f393c653ad3c3fc2d590dcd0e6a7e3601c7ea1edc84cc730a93e96c88ad0521191911293962d538e86ba15d61ea12750823eb4437ca386c886b317d471020a291551518ab344445388b8cb596bab8f0e1b1353a090fa50a318a51aa8e42c3835410b159a190c0000011315002028100a06c522913828a049b2a61f14000b819c447c52194bc328877118a40c328610420821840011111a1ada0800eabf0b587452a3d57fcd761f90d5581ca5c09b2f05b9feff04410a527db580f3519dbf20b4811e14a5f946b6b2815998787627714b4045ce4595e497d1711099dc36750c2d83f99558238e25f303848df0cda5200864258c30c845c3182377545621175d1a1031cacef25331cd9c525b0eec4692a29f64db29f6fd5e1264c10b108b752a19a2743e19b2bb79c2040ae6fb9f037139bec034dcb1cab191f7abbbcb310cbcabe055eac84de9c7d9aeb8cce12703adeacbd216852dfe0b5a928f653cd69f95c93e193d7d6ae8800f143aaa3ffe16e2c67a5302a517d1d77950f2b7d8ab43811ac8e40d608d0cebc5a9dc07e8f3f10986bcc6bdc2a563fd58c20195533a12efeb4f383727ea1069528566f4daef93727ea2313f2919f47482fcfd3c2c9460ca1999e7d3d779409e2c667bce53d91fd374f0b10daa798dbd583f2bba41c8dde42ba077212b5d978e4e8fb6b53c0cbd0dbd6aa2a98295988dd57bae458a36bd18467b366d62de3d832b497d9b4b123b80bece93d2d071731e6c54b2c22c86990c0203e4c77509fa752f9c9aaeb9ddf3df88a5661822edc100c46a97993e6c9c812bbdaeb7d5b3fe59d0b66bc9fbece54992c50fbd14f3f38453a2aa2b51ae6d452920b032039b193487e97716201616f300a1018755c872d3f434fc95042284eb806970be26943372b5140cfd37223dfa342c50847ceccd0bdbde336f5906bf91ca5c14343cf3fb0213ad26853e607a6483fdcc2195135912904566f371dbdb11049e07441cb4195005f5477aadf5e878ab020d86a1d3f9f77e365e5386a25354f9ee13f7dca94c2b87a60b3bb800cc0597a42607f0cebfce000d9cbc05bec6975e8e29a3f9fb2aad7b687f9e223389960ba20ef1b57bfe41a77ce512866590541d207484bf7f36f443e5113b984c069f32b4eb23409d705290507b5e05e9633000ea75e5735116403d081cdfcba25cfe152a35a0f80f1fb00e700083d02c7dce3349c9200cf831ed4773da647ee7d9b3ec36a068f4092007256b20e2db469a7b26feca3582474a429c6930064baa506505d797f337ef04610e8b5df62d04e770b79385ae227b10bd8e82fdc7176e10437142592090ca2aaa70311148e9a34715b2c4c830355687a0215402fc366a955970451e43f5b2d19c8e6e908d1c316caa522c5a7cb441abc6b271aa37ea84cc6777200484d721d2b3d536eab3d894a36819ac8c950125169c4103ec08d5d8d65d8c04dba0ad38a7b8c88ed7850da9a48153233f9d9aa57228d895e9e7a4b8b82e270487a30d92f3ab5f3c1f50bb00b45e45b637c3c64e08c9015e7d62d3b34271f438c42bc31d56973f7ae209e10fa5e138f31836022bd3ce756d40c683713801390eee37ac2a70ed391d4d56764202fcfec1e3f78656fc795b92a04117b405b5fcafb27c1d14b704cc1eadde4385d741a5d4d308f66f880bae207321f61aaafbb310fbf234a9b3569be529386e5a5d19e40d332aaa783c8c6b5436d2af424a1cd55500fff77a549ad190c79511402a1535961070115462496547225ee0946ae0bf0b9cbd22a43d76628d60e6f16338d668a3a708e7fc2be874147a160960aafb6c87792b3ba0da0058c3bc272475777995c11006b2fa82c6369e34b8f77a17ad2a6f774f0a1b58014154cfc2acfdbb1acb17f0ff451a7b8a112f91228175fd94b1698ca0e9b08ec2212e4e62278b5548f57be3dfe296e306e8beb7c9081d7e61ad3559f88261c7000f4a10c36238636bc830d28c425583d0eb8c6cb17968313a373fc8cf3435ba2a912c62518b74c7020dd505734d0d86060a8201a0aec8be566dcb5276faa8d7181ce14f05352ce07f823a21c49392c6015c7d720a4ccde1601ee3010308195566b6eb5fef84668b9985e9f2859625434f5f20a2092f8653351a8ebe5e8964e633e723e5f2da71a583e3a1db4167bdd00489710948517c647a13a54b926944831386d016219038001707385b5561a9d576b378fb3bc2a0884fcd7409a80af7dc78c7eddd95071ff5e5869be0ba91821a6fe5f7d7547187c368a71d230f5bf202541e271724d68372e6d3a635e2a4ef79bbcc869fbd1a30934cc86736437d356a9fe33e17420342eea30a5b60303c029c524529ff88fb65a2893e3523ade0a137f7e85460010fc6510e9cc118a5d86e86729a7bd6d44ca1fcf732015b95167c0fe30bf4ebaf086aae32e58043a6b5b6a4558fcbe2ccc3c44690c52be7b0852a5827c8f7660961d4bee0d83dd1d85e2c1afcb044136f09d0652d42fb2efa1ebbbfa743fc1132ecbeaabd9fa877551ce25e6450c04debe32d4eb46b397ba105ca6f2dbca0fd76cb2848160196e53b6aa8ff408440aa2b7249959e14bf4e2531c779d61acbd286feb5a2008539953fc9248a7b5b02881f18340b7612c01440cca668ed525cd7ba241c83fa3b58f64305690e1fe88561ab9ff5186a2f9812d9fb38c53bda9a357a4a0112670d48ae6bf5fc35e082e9ea6582dbe8451626db16d55c9b1d00ecf912c885238a5212e4fc5e3b5389c536f015c92090d43f0166ac1e28742a69487f6a53ffc2f0b1f94abf235254878b65b80ccba00c1d9c87bea0a6ca6a62f464ec618f52096b0e165abae874a5c0c2fc18b9c62dd498ca42101462c6c9ed5fa945a2721489182c9b0555f7ca6d521dcad16372d8e67e91efb443696d311d6dd4dc430f139f10294d483325a96952dc0c17311cd6819274543e46198d0afa2cb8896080a15651329889175f8a23dc4c14c4b67a2dd76565461e8dc5f1c4c659acddc4ca538ed5227f16ba045864206a1b7ec158e5357567e3263a5bd616a6950e3a3d6d8905c4460ce80ca1d18e017b39630f27c0ccb36799c476c854ed3c226f56ca6c0f9d27f8251080fd6ee801d6dd1492c767aafdc9579b0999dc3cbf2e493c0c3693561f0a1e2d60778a05e8021df17f3cd6c51c89b7edf70fbf8eda409b942bf96449ecec91d4d4e2d2da0fa3039653dec035a11b3b80208ddf4143942157f0cc93dd1b7e6b4bd938eee5e7fa959fe5a7cc32356ff2e32fc4c658c0f90f7a1233873bfd346518dc520f03614a32c69059429acc1805f758e4b4818aad5cb88ff02e53e90de17522b1481861b36f2943d22e5789480676b63fcf8d1d20fdb9fe3c98e405e82001cced257103c62acb20e5e68e2b51052d1b8e8a64a8e81a78007521e16d198d24b109e392c47e384ba415549aa3f9a6cb69146cf304e79052f4c7edd778b6808e2bd4c95baa358a775ace79c341d34c30449b3896943da7b1a7b46f52df8684def96f97422267d20119a38198f21c3eefd689980f73a5fc1f6d7c211c343bc3c6ec1dea7343c9d7ea6d25c60c4518287e4e02b5323dc8e9ef930c80d47fb8b8ec880e22fef4ac9fddbe38a7789d392fb94e95cc111e19995e6872432c731a28398fe54ba8f40d570e40710f45fd9771acf92f4491129da92a0f1dd24c4f486da3e4df2f5cf912c74712264772889aff811576c3765501ca52b98378bf562267e9d5ba907b2f67f78fe2c09d687d95e7226a3f845656191ab47c744f1329b3d9cc88ba4a96e408c8974f1ba1c0f91490be674af280f0f1b3ce622527cd5475285ef25a1c0544fa57a4bc96a792eb97e91c4843dd5b825283772efc0915c102103113d05562e051e3cc96cc4eccee050315f0291b5a72739a684f44cf85eeb246709c36882fc5385c7caa3ab57164deb832e7b98c864b6618d11d7795a926f1eb4ddd670bd4d7bab5d1bf887cf490e03b691346409f44fe1174ab16570330a1491ae793937b57887f2face18d43e9bdda605d208c6e0beec3bfb62f4cd3cc510636364d0ba58e11e8671fd4bc4010050d8442aaaa4f577851445df73a0289d5a7618f4a830fbb9b1ab9d94df48c96469a9e65126bea514e04aba6b6ea89e556184c849921ce4dbd1a2708e15390126d064befc757dd01b3d0c3976ad903cb9bc8b00f31c3d9606fe6b73a8dd92a679add1559809b1a5c9c99ff3e1de25a844afc8f2dc4ad730a5ba098b019b19c248af532da2ec7cc3c6a5bea65d500ab81cfce22a06a4bc14e4f47e4a2725053617e5995c37e37b7f4f3d367a3bbc73e5bc62952a5022cbc48c369d8dcbe4285e28877c1f9f746f3f159fbda00a9982b3fa86761cc20d95bde85a032853fb1bc933fa15014ab0e7e4d6f4bccf8f764ebbaf971a723f8508d56aabce587df0fc51d29646193b7b1d5b49dd8366014d34a00db349b8f5fdafb8f185e28e55542afc165e07bc70206a407f878e0e8ec158cf26700cefdf52af1947ad2b1aa4da55a627ef8a9b1427f6c138082488cca8b8f19fefd6edc1d420b3a0c1e16967a359e990be07e742c5be599be63ab653a644545405357bdb4989b1196f1c2dedf242edae4e57d535ecdea26d681955a344f47cc2cf68942e8adfba522184a4b8efcf3099b4f47934d9b45b85c9b82123782b2ad0a34eee3341854b507c38e279370d8449550282f961d36d1def9c49e3b7060d9eeb54e44372dbcd10df3afa9c2b25b8f661e92ab6dbd3025ea9b2cec4b50dc0488ab703857988814e0d80297d168e3ad3c055380061378d55ea5991dc00d4aab8f244555f9e4c1d2e54c4e5c14760f13b5c84b41aa77cc78903381a690fbbb70bfbede1538206824e3440bd0bf5bdcb245823d67314ab226915f70efc91c74433509a49c343f35bc96bae4ef3ac83d8fa97346401b51219ea0013bf5ac9d713fa240d86cb85e89f4babe84a3150c500e085ed8f4d90173cb4f95480dc06f8bd14cd3809318fa6b9e8b0462079e0f68d0ecda62170cd500b1fa68271abf4db9524916434cb917f63571d2ab234fde50b111f6de6bdb7a169dd4689220903a2a7912189aa8b43c36fbf2e2f01a94c1ec8a735b464c684da87e68ecc87141965179da8d9d50bdb56f9a8a90cb6ede44e23899d7cb205f6b2e55dc6b280399b8fab952419c54d0135bbde287ac5ba2cdfd3402bda3c59a2a44625a6af2c4354f1d1eeb6ff5a04796bf12167cc2eccf90b648197e3c94c9003d8e228078cd422b9bee09890a3a73da6ad494943890080ed27954f24f82d18128e5e05d1317378e71a27e79cf42a6f8cd1b2188fa379b5065185bc6d4657ff4d665046fd77280d327742be1b52c5e8a19e53c0124e5ac1926e2910f19cde993a56c6505d62c1826c0443ef1e3f409f0d417ca8364ea32df80b3e086fec9f8f42d4884635b70cb294b6147cc6a3fa58f66ea00972da86ea5738c0df3c317bf673b51b52fd0935a5fa916af67bc2e2b931a929323649f8c21ef4abe9fcb664ca5605aa362cc60155d8ca9d050ce7599d07c3f944608812be581e04385bc30be5926320a1daa6bca7f2c47021378774f2f8e35e69d16d222336a5a442bffb896b1385c39fc9d300f6f3caeda473e7551a3fe78b47f6149f88b0b4fb816566cfae6212e148b12c63479d14fa4433b851ddd9994df2388c359c694f2ade3e84fffd7e1a64db030ab46ebd0b109dc32d3e19b823ebe22433933ff28475e4045939f13b88a90825228e11d45cbd8038e6f3ae285d7bab8146d7dcabb8a47c16b0ef53514aa2b434ec1a9715e3eeb2aa259bdbfe4ecdf9efc5b2e84987dc34db9f13eee16edfecb3bbbc92b5fe0656be8dd81e3ba24aad097eef5ba64b81be026c0749ad35ea94b9879179dc5a30b484f93573eec541d5e22d79571c4d217b5873673781e1d53cbb5c4028d761b6eda7bf362595e3512ecf1d7f705c42b1c4dafbefd5d27cf63e95eb4f9efbf46134a1535cf2501493152ec2d9a9062e1460243a0cfe9b7dddcde5993f7f4da74ecdf553a650d381ae4ec123b9ec788caf6512636efc8fa2de368e89ead916e947c9eda3836d7c9a10a673e9eeeac488e22861374f09fd479ab7cd789fcfbc3334f24ccb6c0d18f664f70e142ad6f4796b77bf8c8999c11969c5e9122c73c72b15efff2277d2bef2cd61dd448b0536c7cb555205411ffdabbe395c75097dc448ceb84963c6a8706f4709ae7a8173d62df09ad5fef1a30d413f560f416f88a658c8226b6f0ada16b040d82d8054ecf2126f85071e122c3f21a41aeef670f4479b03c0aff28aa280d61c2b84e8cf363e8f7f2c224c801257277452a3dd807c0ebcfc21fa74953aa3baaa9150a8f7124efb1867e6cd3226327eeb5a09a9733401cf556cc065140b40a2add563398f3208cae539e43bf1f590c0d2bb90d02164762451a60a66d4fe506263c47f4bcb0542b1cedb7e43c37fe87afb744b599103669373ae6bd7e9174e8347ac2d833567efa4660236afc4a9f6f3bf555173cc340fc6e98afcfe3ad2ce573a7db6abb8794227b1e368e7cf7c57068b80ebc3c3454c01215337c5ecc1cdef42ee3e15e96d4d3ad151b03f85d3435f01e2c32bce3a336e0530dc1c42b5e56545719e4e54a8e175bb54a01650a91d6822c45c3175f81b5c233e3635abd8ced4766ff1f77eea1efcb250c8da07928e3a094181b9b18654fc28dd7432d52e161ecb6e256b8f39e42d21dbc1fc3235c99251916323fff01623e480fe1063d364242f5925250145424cb85fe8bc9e1c0d445b1faca854eff9ca0401190898d1bb11737d873ef4346fc2d9009719075ebbb23e564238962ce091ef4ddbeb12f325c8f47be10804caf2e89f292bd7b88a5b3b3bbcb91aaeebd4e712bc9be5ca40c8905aee23ba58fa9971db33b7b456d6d97903751789c67f7f13cb0e5499a6bf20b3b56ac12cc76e5f7f904f324e78fef53f86d8dde88328199cd367073eec7f4a134cab178dfe0a7073aa5186e18b747557095678a20b265efc18aedaecf92192feaa680ec2ddef445276f1ab739ad2f969076cb8991e2130aa95dd54a086551834fe0ae028471871e8a80b7098809f4d2ace59b9127a3229ac1ec47367ab86f6077b73825621407afa38654088ec96e094e5c4d23f75230acf286801d16b714e22e236d74a5eab811018ed5fa4946e3b2eac30599ba49b9054f02782311379d59924930a0b1847a3bb7f5d400e699260287382048db9e2fe8d86dc1edae15b6702202dd7abdee883c0b8a5ebbf4b0c8236a6f47992f3f4a69ebc6091c09df7f2c92208ddac22a4747a5f827c182d23db07a09612393d70009fb119a7058c60787521f6582b7a4bd3460cc7d9f81e066450c03dda60f9ec7c60c8744b4e9611e9d250f01b2d200627c99404615f8e4426d756d55571f8f4bda3b849b1d3cb96bddb8f9de753cf00071f5039a0b60d4161d3f3fe63cd4319c63895a91ae372cc0f88a03e1a16f3ecf56804e92aef51bf611a48ffff1a437a55fb4ca510e5ab28121992c45ef09a92352b49559728f4219e334e8093d98a0a55b9d05c565cc276e54260ea9256c925529693d02706911e040f318c63bca08d93b7a795433bc913ad424838cf7b08c5080e3df0dbcba1fe3be538b3cbb3216a80e2f44a12f45ccb8981d6f1043b5b67f977a984e22388c23ecbac6e8d5d90e214422802158d6d97e320e24cb5ca6c3f848f1a0548a9e4a41dbb8d6717f734215728a2f49b896b8d25c8fab468dfe3f0bd9031f1b9a2312c8735f02750fdb0d72f390e0a8adc36a7ff07113b09a67878395f0033e45a56da2c843ccc9229523748421ba4d1abfd541b82daa5f732137c2b56eb45d835ce813b43ea5710c9c2b65ae0effbc8ca2f9cc63575f1e7eec0d53b87e4e7004758c86c023faec99e833185f7abe5fb6c5e2b8f5fd200800c31bcfed8d3dfdea68bf0975c5dc71d0f816eea1429cbf1e43130636a76c02e3d0768defb0a6a6c39952015e897cfd016f70b02bad2fa0fdad4177ae74866ac4b5497fdba4d28b1a25818ab3c536ad419a279e6d942babf89a548e7a81b2b135e3f1cb9a7da4d977828dbdca5db846e028080bc657ef434d674d69dee6f513994f5f8a3ed3bb885e8d06e9f8821e2f8833ed900471600e25d461f0cdf510adb5695114878284a3269b004e2500520ef5a878d6dfccd0416cebc7448ce56275b04fbfbbba8df264f4ec3e8cf40a4aba367c566f4ca6ace2adc35790a9aa6cd938d6b6509f5ea16a3ce7624393327d314e304a444a70e6314a13f2c9b528187735956e40f0051ab3731efd97567a351216312bd70f50e4a37fcad875dae9d79dd426cc86ae9dce92c4fe9039622673d61c91b81a048e4544c5e60e140986a523cc52e912697ed930c1e6e17140f45da2c22fca5115f814bc2a773b81aa13697797c3e5983b63af7426d2b04b4fdcfff6bd4037caf5b911f13eec5dcc6601d5d9aeeb7a3ce8dd9570a40f1a5ffde184808e0851109894c02b74229e0593d2bfcf287c095455e17b96e90d1d028f062b8008a7816b76c8cf9e67a65d888059b289e2540d7be3d413c9c9958c919e0204e16bdd162363f417b69729124f9e68bdbdc6d7ff7114a53aeaa6fb2af43e1429f760df0418158ec072d21c25af4f3460a58a04c668d065fd31a4b813885573444057c49d14f6f6c3979d99cd9a442d49b49b264ab9b2acbb1f80afde5bf6de2743f6638c43a36b62e5cc25e2e37f7cc40885f1a85b2f7d9208ee121575ca20ed5326666fa877e7eaa793bda6a25beac4c07695d2462422761da23148bcf3749d3dcadcf1c5fe583c790550bc10169979e722f0563d61aedc1f36ae845a2f7547c44859676709f3ca9223c0399e8fc6a9fb6dbf3d4166ca9f7165e1ea9f11e3b99d48828f8f07336de822eb85b7de65e384b1b9c6742565cbc851afc8812b7143efa2be5b6aa0e52140e7486958e0339496176d6561bf65535744fa85ed5375de3178299ced7e2caa7d56435aa9941ae661ae58a3645d7a50f4ba5497d2ce7a43e636a473a17ad88e275ccc52bd1eab4355b52449c37040a82a3b9ea63ae76f0748607352ea112ed9ab923d8278ccf691f5662b3b62d2c4423ba8e7afa5cf6010623064b79864d93e84406d4c0665162d3646e1dfb3a83f51304819d1896498a0712bbbc05375c9e7f62c159c4fe42c5c7b4fb781103a0430807a82022c2b3657cd78b93bec851df9787c1e117e27cb735cf490ea4bdfcd943344b5a9a8bc03bdecd3cda1666d8156bb3cce8557b21df9992bdb28f951affcb2baa7b38371207fc802c0ed5d2bc628ed1df37a3d8ee75444ff7f5b042dfa26cbcca5997c89389e380ec7ae06cdc61d1e168d0084056b2e595293ac269a31f2da7450e0fb4ffa02bf64e0357b740d0e30aeb24da51d1368d3f2e37e2cdde6b53666694716c3ae6d0d9ffc5fd9f7086c86d02cb4353c83192bed43162ecdbe02515733e87fb3186cdc2840ff231eedf680bdcd9eaf48f12b1471f8d3a9cf61c9d59fa223f1253d69f9272bf37d4c74e52ac781e27e598855b721cf0a821763bfc59f7f3758295ede640a750523192472ce6a7bcbe564bd9a9be8e021c45cb7744d709ec1173d2394e180dc5bd72ea61ded6196da612781c460715c45eaa63a690430aea5521410c65ae9219944019f95a42119b4e419d3bc6306c6d82ffd91d1471a472e8e0a59bd8c55d1cb71c210ffd3bee7374ae5390567ff784eca88646655fee648b2a29854b457958c6278076ca61729dec3cdeb70f7adfa8d8cb24a6c469cbc611778a89dd6fcb24be3723bf4850b5a50178824fb3e1ecfea3a6d4b2f28bec0142074aa3ebfc39a87d3a6f2a384b56371fafc15ae071e353f652dd3a35e6fa0518ae132399eb1d00f702423e58f6ad957e8eb57318dfcbf8b6806d44efcacb73c4ebf49f313420251db831d20cbcb8b943f7ef56f40ce13a183ba9ac4db0ac2adcafbc09d653cf58c1a607a65cf8a741abdfc241c0e515bde89ec5823321cbc58d889ea83567cd841d1ca8e802d3a48a0aa3dd5c7febd284db99338bb28aae62bad9c299fca9aa2a3b606d0b3b8d1259e43121632461b6d49159fa3c36442f0ef109e3d1a2062b0c2e87d9248409334af6c008736c075594827760e4011779fb4bb6f7500263bf3ab632947a334a96600765e04a706e7e42c50c211c71427f599764df815acadee008045baafb546f26758a73261ac088a0658a977042bd74658bf5170223e9836b1d6bcf92fdad9f68ac7a7b06ca9350c1a06bcc30ea4c0de023ef073f03e8ba75739ed3363eb62dd1b12beac06969b5e3c8ce60a1622362b6002f4cb228b6848d4287f2b89a5e22826b2ce21d7ffac047be89ef1f4ae2ba988fb71a991f04562542f0c4ae5adf53b27cbda99ef81b56cb1b83a86376638b461fda113db65374e0e018dcad699a6afc1e1f4327ed17b4f0fd98dede331d4090f21defe0fdc8f25615a63a8d8c0de204ae871e37c575ab3d49ffe0cda64f5df1b589ffc3dc2231deca60bd5f8db666ebb637b0d1a02524c23fe6e7071524569fd04e04fc0bbe42a24fe4f78d1b89d8321df91fcd6e3d42a42b2648ab1a48d9e0f5d6e1baae9a0b85c75f744b1a92f521b630b3422fa7136ac4d113ace750b4d25ae1bb7b973651ccffa7756a4db08fe6d3411aee4a6d74442d9048e4d65f3bf033b171a846b466caa986a139e246f425a797c98218971f04c2ca0feaf16b5f3174934b39c98d3aa10ba155701ffa7082619756ef69065261828b6058b2130ba874e5574c1d44977b3be283364e3cb50bc66f58851868e100365ad39295e7dffe7a6d1b35eb688158ed1d42e71ba3c95ab93ead02486d50d3371d9ce91eb423668f739ab05a94f0a3dd75b55e51758c9c6b620c3800a641b73f9badd32985ce39716d8c7c0cb0607da069fc115848e503a2f02ab537f04b28c169bc302c3fa6db524d27270fdfa68263ac610d464a6543c9dec3f52f059d6bfb043bd00193455a0d1e555f6bf4b3149d02e6689cad68061d9ff39456f121dcf2bfb41d8bd6dff4c028f7847646b4bc2b0bdfea39b3f543a9b879f46e9609085b8668ed73d128be70e6708adf051fdbb6fa8e78a31441d12760055ff64b76f471542e05831d240fc378eb76c251669cfba85b3d52ec43df85f44daeb76cd360e539e184af50e55fcf245a888a252fe5ddb14643d49b04b09c022e23c5e9fbcbbc5c090e0bfe7d347bb806d1624d4ddf6a437d29b6a00214e7e4b862ad3a53b53738bbeee12e9779950e9b46054493f435711eb48e1ee6cba6d6bfcce0f526418a1e28c567e63e49f48e534fff132556528677d8c2139205c0e29d458a27181ebe8ffdb56691e06af54e3af93904263d4e799517d503ef06c32d62175c827aa5be33fc2b80b2486e439ec6659378ae16a55001a868fb5bdcb4b3331b9f1e015dbd4c184f9a0943a957de45ddbff1b2d63f55497f2383904be571d05bcdc7c446ad609d652885babee3785165259a25a0db1a1bd002946c4dc5f44017011ffa514eea41265441674d0895ed0cd5047b46f10f20c3a6008d1f1539d94174f57a3c9fac627c662dec54b2014f9bfa8f5e4a724812cecc60052b79638323bd19c1ecc03e931e3404bc2ff9bf0ff109c1b0199817faef621e9a95f32c6d4ac069d15a693c3065f2e1d08bfa7e9b2f1138b82ea07bc3e83e6b3964191396070218d53202e22ec11edcd3170f6e0ad75a4e7a126c5e419975d49d3d1270de8630a0a7b22dabbff7b44d6388658e589c91d877e8793f5c322dc3086ce66ac7cba958eef065bad090e032eee47b1e06c2b7f421e4772ae3c1386506a0cb032ebc5a8a84c6b63d2a5b5a4fd491641e7217d785d4c7d1f9de55576025443ba96b25054e7d94c38f1c82bb09005b3b6861a31014133ebeebcbf6e7cd5daed9260e8c07e4587af02df58186c40596a8d36377b159df7c1efd89a14b07f836ae485088b170301575a7869848d734ff9cc5b448a6baf7188f0344ab44a38f396f88bec47efec20d30441f1e20fd5ef66b703ba8127f5bfe15397be80b399c908bb1b53eb347546d351f69d0ef4b61da9019bd4d7c79983d8215bbba6e2b0a4f483636b98be600c525e63b3f2c739ee4010f8a0d9fc27b39dcfffb5c8f20ac453fe8bac101487ddd13544bd2b970a7ae34a9115a8d1cb2aa6dfbee5bbc85ea37decfb583c3ddb1d8a02169ce5af2de814e182431e502c0d9978dcd6a39da7748927a46ca2b85cb383929f2438fe4d440a211ecf35bb86823c42d46e8617e4a3d6c9c1111811c48e17925deb6e4f595a89c809d881f9b632e225a9654dd8bbc8fc64e03a96f96e3961b856351f724240a7c9f269ea04f4c1ee7531d32f5ffb5c16fb8bb55972d37e3debd3f6c09d2fdfb670391cd1a46e8884648e04842e27624ad09798200bc17c266d7457230cc865a4685e60f752225dd32ce14408fb422cf1770b3632ba118ba9a8383352134f45dab40baf5cd1191368064a74fba05e432ad262a96832825a6c7d8bd0c395e41e45df1e5237d25d8d1992ec18f105953f7670dcc33aa207a3bd08f6f42f82164d78d259791a694d2effa2b80e83d45f9e140f720a05b882606f6045306e7692879b35a92529b79a5dde8c75f078e746432ffd679eec0f3af8761e7e4396ed809832a8ba90ab5aedcae22337135bbb09ee26d073a28c644b1a0854ff9f73164f2df7b2709eac14220f19d3a9aa525a81686e712e219baa3481d3154e70a0dfa2c7c6a455a3eebc6702bdcdfa6b32317409fe5c8ffb44effbbd325b21ebf67f2ee148dd8ce1b74e431a5da696e73cf69def288cfb62417a5bbdd25b9e269fab1eca7737344a4e06a46bcb6a164646025148b3eef6478b34dc887c41baf81d024d5d0fab6e61bae0ca7cacc729a028c1961819d1fe3775dbd1ddb94f0778bb00e82e46c5c4f8c29229f44ed8c5f8e88b48022cb6b2edd127dc4e6e7c82ec233abd7065fdc882338ea78302d1b98b5b4dd138f668af65a1038ca486819a488adfbdb67ce0677b3a3d173626daab9b9191bbda2b03f60397a2bec0826c0a4a44369676abd3ace106e02b0d9f3b1a2047faa13d5b2fe0963c58218da8ad039051bfce685b9bed8ec49940744975ac36fade312283da2747957e160e9777df430db7781cf85b65a707d1c4a195397cc5a1c1de00e17d51baaa471e6700203b8ee6749b810f8d41761f87ea385fd885ad8c5f48db5d76cbdb26ab5912639b11fadf686063c66479bc1188d324079c8f79d8db79bc07a51afbb5148779330961ac72a86a1601f4c8815d85eed50e8863059969b3c0746af3f03709c2de2d8d729857205cb3f6a7c54df5f6f781355ff45661452ba36c8a04675101e2d466afd880a86ddde2d53cab53cb51dc354fe54eced39eec7ec03fcdf3320fc7e11fbf4d283476c50fb1f79f8495ce8b803bb10ace06d454b61d0e140da6b34eaf55f6550d6bc096a8555793ba1420759021c4e65c3d80768e80bbdfd492ef15181229176fc4c961be62f200a58faac3c596b04163a74bc278b7fbcc409d921228ca40c05309cad2e613a8020f66616e9db076637bf6c5c5929289b9fe2699ab86f0b740efced391d52b0a7d6e40318b1d423b6c2cca08e6bce5f574982d8ec0a6fac045f884c4ff5e2ecd083f1e1955c4994eddf19b1167749f70b15911a69835fb039872f047aa0c9afd52984f541f015fd51680f51265202b47a10f7c895ad600c00b17c5b6a067ab55e07476e7c6b55c8a146f3b80fe216b410bcf68c70acf27e03b0c23bcd5e523b1e962397667e4325dcadf0cd18c3b7e339fe55e8a6d8157b8796134774679fa539aa3da053009b211cddddca966611ed418ca98db20e9ac51936985ed8f23dc5551e3139a03fe87ede910370be43d79642ad34cdbc7cfd93aaccc73a710cd1dcafeaa3f3b3688311049699f0ff901f5f04d22474accbb90421107b38d36765d4e86a849cdc97982ad5449ee60d57718befdc8f1904682568d1c05551a1c9a79d8067ec42cf55a6214c70834c500daea62109a247005d65bcfa86cb91b65d33b4432fe182367ec331fb6d10755eea7b548164bc6d6b2b4260afdd56b75856963f4f7a1d593a5e2ef9580b5c4cf00d82cffd80c311fa1342f9ea1779a466994dbd0f4efad96d2ce204d0838ddbce533b94041c3992c4676969c2d2c06716ae93880c2b7258742e33792a67e7d75494f9f69b399cdf5ab1fc485b57d05c07438315d1501d393ba5fa0bf071f533e480698aa54b7a209a672b4b1806dfdfd30188f431849a2ee84bdd1ad892b761b30719b25098e5379e4316bfdbd127a6da0e471fed7f1c002be44722c5b9489b7512838c1d5af0597b3ed33f4d614a7588de6364b0d634b262e40ab1f4504ca927ef9708041e62f5119690b5512749b0982c16c46ffa2a9903854f3b8aa561e6e86aafa52b95989dd95e6ed5390860439c16177be46ab5a9b8ce948b137e25bd8c92201add408dae29b19bed69eee967bbbe26b8df6d814cfbfab38d072bf510f05b7a707819c900e523f4f8eacd45edecada9b3dc9d423bf59fbaafb90a1874effce389677c2c5e6880ae579eb82aff8040cfb68609755dc7668a82ac114c9d646e673027b8755f7dd87a4aa507c40a7d4ad81da522360c77de0dcc5c252a98c7aacc654f1452fc75b9363909fea03c8bdfe542ff6f89aa4714d67c5565115e08e91f9b0a6f9c03ddbba50a79a8b0d0ca1b75b737e25a88fb78b29f2dc8f73c6000f8b71daa5a6aabf8907b37b85cbe2d1533424de57ea49b1fc475d06215907280da0605713200f79031293b05739d88aa401c3c8db13796814449f05f00b20d93a7df3e6e8b725627d7c6d342a617f08c899a2ab538ff5a0f88126da426041fe9d569c2fccf6cd272e87d2543a43932e868a8dfffae7415383d303ecd4475f0295413de1d9a0ccd7ec590a9d52dbfdcc6a3fa50e0cae8dddb6fcd05139aeafc88f4f1751301d0359fa2ec2b7ae0a6ad99ca6562e338b1d247a46c2e206a637f852a37ced4dc8681485ab30068895023181fe482804bd53080e9cc1df158409adbbeb0143c58dd413c5be40b873f76e0d3769c4bf920d008e77c3b37d1df31f7161228387336923cc83cc9f0c3f7cf6fe9f8c9f0d376980b2521c4789153bf97e39e3beb9a54923e022a196fdddfce6f0d6960d14411df82c2215004dafbd349623f11c4530a373dc5a3403629e96b6ed7bb6aca9a011ab51706b5d458f3333929eb36b52b819e3f6be565ed648a3bb0dbab8000a860a0459f8631512f2d1c21fe36ed4c356aa2ba7aa3726d95964ab3a2fc645143488bf8781c9e6a65ccf006450127ae8bedcff4bb1556fa0d73ed05d8fdb6fcabf8e6dc75f53615e6134fd6cbb197a0c158285e2c5a6bc626c798baa4440bff858f0b33879f996f62cd809197031748e817bdae0efc9ff65f48709f6856312c32086d8c5d51b6d3a5c15302f2cc7db83ff22d836563f5219a38676e8ad831c1f0a463f8655fb30db1129edaabba831fe30da2ec6864dcced13c8a2ebbb282ce23e536a35eb49431a7d7a4ce1d374f6ac6afe3a9a2ef5aa75e404c3f2b85afc3933e27520d9e29d727335fc00fa69a66c6e16190f96d58c29383e9f7326cbdb50064680018f17324a1bd3ce5204212ffc06aab9ca7258a5458c929f3ec3299f22bd262722827560c83f79931044729b612d4b30f150ad884a15fcad5db4a6791de12543757fb94b6395d34e76ce469a4a420428f9dad67a0ba34a396d99c50dac50a12a0d1cc63a20db3217e6166aa214ae6dd6190dcc9ac390523b2b9c444031784c8a3a05c5658fbfbd3b8c4fcf12be4e2d4a515bcce508ba340009e09bde6c041fb5b62d5bca54fb7baa8a22b78b10dc4134a0968a0dc012ac14ecb8c3cd121a43d95bb0d8c5e545785ceb212a92bf374760c6e4ed82e4f6e3a61cb0a802e4f963fd14bc56587c317ba0058a608b088654417cfe8ddafca2f683f75d9d441aa46cae0688be57a4db40dbfd3bfaa4b5c99b3b92cc0c79230a1820674e500fc6bee11af3505c27ea5e76a0e8e37dfed1db7f0b53e75ba4962550fdb6a6ccf5ca6f7ed68edde40c0453e3a9ef04d3fe71c8679d709ebf55b0013b53f5b3214dcbb3432133338e928ed5a0fc89cd3a2440f491b108365bf5c91cec753c413ed10663b60fc8a76a85d14467f1f9e7b321d62ddf80e1aa58411bdabaaaf63f28e2749f6a8d7f68698ba10586fb4ef4600f575457d7f4d310be52e9f52330d262a7bb697ace18f376876bd4271bce1f661c62ea4cd465318ed7679c30182698575fc844e63f827218288eb474018cdf3f790300762bef4b32c84fc315acd8fd7d107c60eedb5c0383c6d81a9a40f15d2aebf06dc7e64cb79f63d4197d88b797f156733ff785f71bb9f34b70abf35ec3c5aef3ff463b422cd37a670ecb5f52dd9a980123d11f9e53668522a4c0b725455fde377f10112db02e2842728372a214b10986bd684e05c222bbffb4b67857e0dc20c9ee84eb65d3edc3cdbb2e30419017b338c4c970ebd27e7001d52b2106151d864d8e864106b155fc0491aebd5a6e3da4209f2b68b21e9adc3487ff637e44ec0fd8e0088c1d144d144beadfc5564f149bf882d5d7394ac777979f7bbb367f1bfc8d4d59b19278eccd378b06be2b8dda941585bcba1477f10fb91517b129d7669811f75bc6b37811c8450113369b29288a9a338f3c2f1aa85d3c149d8fb4e123f95e339c4fa6988779da05ecda08543679c4ca55705066fbcd4bfb96f5f80440f89b6c707edd16f6d200a6a3b66e3228b26ac67fc7704b0583aa4ed80662b6e283345f37c59cc26a01d6218e7be1794327d2ccd59a0ce8c22ca3e54471f0f525598829680ad9bd73862ccdd53a1a1213eba6c92bc79e438eaf30b40a1d6841e42f2e36f57693b2016109f58ca3532af3ec0079cc5c9326b935dba6a31d18d93d804cd2048bad922beae0d1caf0ed13124ba6cf1de6c68b3b4fbdc070bbbb10f798f6c35873184848cc441cd1611187153c512dc6c6b1bccd46358c7716a0bcfbf614a162e8f30ae037fc593e627914a24cf0a94eec067f2028901fd7434ee0ee24113cec32c46ef462653079059329446fcfc9188446889bd5e47f201ffe136cdad7309322868a9aa7227ae5e737a8b7b6c54e03aa96d5a7655e154b7d8dcfc5d8b5804e00be474ffe933412f84bcd1a5abbf0a24cfc79a3b4a39692b3e3851d88409fd1427a12f6bd1b590dade66de57685fa4f9f391b60ac92cfedbeaec15f7ba8f15bc8afbe031b8bc40328157a77f2c122ee41583cc0492bb698e3018e9df7c6272e5da0064db4fe8692495eb30448357d6d32f9e86b9a31657b481a124ef3d31d92b38b353daf193f2b13ddb537cba8867f7eedf9c37bc1980ef80e9bc21c4d1e6460c4969660f1276a95e1fbaf6e3e3596b288b8460bac474ee9e4c120887599166e509d5d7ab3618df62b1da2c0c2020e2a540c68aae11d65e2b6b58319427655ac40cf3dfcaba0dfced0e697e4dc3f63282c98eea629823fd731a218f21d8975423109ef7965c80275567746bd6b6a4900620efd54796041c8ebedf797f155459e9c4cdd0e5fee53bc25641fe15b4afacbbfadd53f189ce2f2abe1a6249f505cd0fe61e312b7ff881c78f429e52240e10fcc35493ebab9e8e687cf492cbf29bae1f20bd34d0bbe4c1de3e293d6258ffe855d93e603b44b4d7ebdddb5f80fbb23f49a27cc609c2a0fe84826c406f8d5f55f96ded9fe80df6c4fa21bad6af5faddefb98263f3e15c270db5c9298252c93074d2c92507e10028a25fc6c43034061509f06aa3ac308891c82557f5c4f70a458c3fb1c62e720dadb7abf5562b2855137ce7115d66717399da992f29c4909370b5701a407b461a452b436d6aa3ef3891b25dd83f11e8c3030bdc4c50021ddaaaa4410b90d305afc1b2a514333d0ba9eaf7edc9e3f04a118599015c3620129b2f7a918a66d073afa7b5d81bc2c3b2c2d0493f5ce6432ab9fc9c0f2fcc4fa9522e2b2f8353de4198d73212f9c8e5a40a0f3cd5de071cff7736b69b564f499ee5d7a25523790a75f9424fd0f586f49eee472523f901ebe1eb8c662bb084ba5b46f2e967889fcc2c22d500988a80e12c826cb5cf295448de4ec1a6f8c5e9804a5d30c8093513e36891dbace0d4a788faa451d1bab870cb77c2073ee9d058316ffccb1e93ae75c66167acb8adacf0c9e824f9f1dff3a25e7d3a4580aee5237bc111d495985bbd12338a0cea12a8c2bf179ca9b1a5bfb9d4a935e57ec29a351a696f6da791ae98e6ed9c34f0eda635f1fdc035f672768dba787ccdf97fb1b641795aebd369266ca6fdbd95c62b953414a43f35c22d0c79f1b190e18045807112211a41c473753842151fb571d78db93065f742857e4c1354b02871e390fdc680db7a73d054e9bba17d4565a7d270eba8222c2de371a0d929e8cdadd5dff11a2f696300edfa37ec3f957c85d31d7d2baa68a9cf0f886b20407797c49b496ed409d9cb8b41e8e34238418f6f6e171c97c733795bf0516a095491c8d604806711f081e7b5a4adf285cb373cdc56319d659863108fe6d0d6625905c061fcf47889b9164b45797ea2c4ddc8348a99ac896dbce3f8d8742bb459cb150c4b8f9e6fa309f931103800ad713da4f36685377c5e8ba2dd24d09f1bcb459b350e1c2b391b9b0e04df2544429b4752120a09f35b22286882a9e095ecd791ba5ecedf7ee0e435e20f0230b4eddc0217f6a7aa915df805821559ce60347d90ba253cdf803046d3703d3b7a2ce2f94773fcac0129514f31b7d7e6666a264fdf543884128dc372c2778bbe3336c0a7e3615d9a79c16833858ef2d71ad85b412b123d5180eecfcbc5da2804600e58d065e0d2daa886258cedb6b84a02c3222ace1356ee779144fed50062f0bfc55a307b42d61442c2c61f79c94ceffc32ad5c3e680d1b99a29809cae08b17d06523aab6dc5b939aaf6eda28f68723eb5e947b416b35e7d574fc91cba08c2e173bf89c16874203c1877a0d7f2456c86687c8fe3bb9592902e9f583e351fc2e27932d126d9355c94b445110a35576b53aedfafc0378588a3996e11b071edbb59fb55bdc7ca5ca80e60d339024168b4971145f69d4cac6b7308c39d8c71c23c95332fdaec9bdafe3a2aa9aa832c86e6b0ac6588ee067ff5d8da62d983ff319fd0f05efeb5932135e35406807ca74c4e4db400596955824c430704f711099a0819270955a262274408dd039bf630c94c04ca2bcddf507343292fbbaa769f4a4592d3e66fcb8c83f5c7224be7f251b272ac7b045eb5b067a05f146e57581567f3e863c3676b00b0a84d5ed8c83374dd7d3c22467c8fee560307588cf0a19dfc02df208385b49cfe24d66063230adf0721d28978d61badd300e3f6ab2e7a44bb273b658fb8bc7abe7a2e04fa780de8512e6e4ab9457c3bc3339323a4d76415fc81ebb28f366ad3c759a70ba1f05ec8df644a61916dc099506e815470b6dc8c42e3c7f05fb4c167e2b40ca965e8768a90769cd66c4fe8553b1a6f58dc5e1b666236fc538a7dd282b63b18e352a8c395282c4b6b8f9f12624945b35ba825a97de9e12578219e5a22b646b5db6c9c18ed849ac431d584b91721eac271698648327e118ef0124595b5b1f5ed91003d34c1c8401a9b6ad73aac58d87e741059a334a916eec54e15ea05fbfab3879ffc529ac33a3abda9cc6bba77f4d03def872a14771549aab4b7ef346bc3302cdeb9dd07c1b8e9f1820c0bde866d8358e2fd44b34e30cf04858e45b40d0d58c498e22aa3155e358533a67fc3407eb3e2c0b9d4cf0c2482f0964d6d5a4b666d09f91e8b1ced82e597611c9cac0a74865c9101e770fcc3d317870b514066940fbb87b89c3658074208aa19538e117e8a0f8c4c2cf341ce832cca0bda49f338cb7b7aaa456d86243f9125b7b23e5970a80cd76f0c69d8e64789a36daef18d9929f94fd73e0a02912308359a2f71f3924135064bc3ed4a90e3f0b1437bd2602069c387933590726a62348fe7d2cd077c7eba0e89db33188aefecedfb14897dadd31f394e0c291f80ec16a3933f9578448a345f50696b3e1c4d5078e25130cff6e06eede00c4cc6035b3a0f8b8452f600421c19c4e1a597e825a12994780710b272298aff2674aa787c9a3e7702a1241cc2f4df0a3742f76f123d019630e131efaf6a7304c5ac987569e40fecdf2cc1719b997ac8d757212f6180ab1444be8aef45f73f8105fe71f663e056038056cdb6d1084dc05fcebfaa468cb598a72f0b46af82c8d11213133353c7bb2c5c6c49622559706c75d7dd291754c1ef10a6abe18d00c693bf47306bf2cc29b3bf253d0c2bb57e5476ec16072333f136e1ea2a4dce6e3d1d53ba45dfe5f8f4a33c0062e71449677a75435e0adb8aef2d60b8f5ea54798a596f6853dfb9910764c39825d4b10df599b7dbd19166f3627c5fe6f0504ac94f4ff1c94fbbd536ee3879506c9b327c34d8d60d10c4754651c0bb410f9ebd20710f2d53161f88e95e468c6e75e08fd2e1f0e78ba1d92e103225d25bc6e565871e0b63878cce283770b5b1be3a7949b4ef42d64ea126907786abecd25c644a6b93629d6e52fbeb2fed01c9de7a298ab3de73128e322326a0ecaf53c0c3b6f26786b547022e70516059c503288ce5f48c52404dc78a5b1c9e828ba328e54310438111e77e4855e7e0ce61034c8294d95ad43f5d4909c39176e00e896c5eab5e65bf71e212715c8380b0113202e47313972c7d0155c9b7166ad5ce02591c3c8f426fd25e1d1fcb8ac9dd690f935ce528d14b069b26f0ceedafa1f19b50aa350719f08f4037b07745212cfebe5e23fd874041acb60ac0b6b8496e217ce501fa9346c2ee917f59196a8cff9479866fd58964a771ad0d8303654dd306c588e42201aadd70cb5f8114b32b3d9626044284aaddf442021bd20fa9aa64437b663408a21a27bc22f581eab803c492ea0911748dc90afcbaca42a1466b556c5e6ad19d631829d6b7dfb1064c750c613891fc30fe68d20cd17f811716978ae7c1f8dae4568804be26bcfd499fb887256731db232148b569c80557fbe1806028c8993cae0980cb340345b971aae40b8972c104378a17bd86738ad2145f7579cdeeb148fd2b76ade974a81fed0340253ee0af9c7ae94b305bc105b182a8a45ddb35a860a29266ae14b3c876935c339f6f51b6cd112497381f1874e96c26aff5e00314b8925815a13d3a3a536d0f615d7919abce0b5b188a48fda38cc9169c4d8dd527346d4982987c04426ab6ca83ab931ad724cc43e63e6e0eb8582c313c63118d1e661b532fbede58e5fe54977f5a4a5ba5ab7b0c81a8c3561da45bb6d8e5bf983744ee548f5d4b8a3b0bdf1cda68e5bff2de79da05491bf6551a3ccba1aab65c024f4328e6fdd8e0219be3c364ba4bf33d34b38afd8ce5738770f69d85d332912ff23bb4a6407489dd25d61bb0af56a13f856f4bbbf62df3166f3b997f402d959d7e082d6af83a250521f42a3c00db6c3596cb71eec09ff15677ede9783c132b2f1b2672d8e3c199ff768bd4a8466e1c262801aa1b71e0bafba80469e13c05e46b0dba2d1ca5f6f9bb5e46321763a73f787b95c5e16e9e26ed66a1237079c215d0b38bf5b7ce68a8b45b40d926d4dcbe7891c2e0e4f1eb778ebfba570083f5ffe4a5858239c150d674aeaea992b4163a6c093aab11c4eadca9681c036b2511c160b5543675ef34e99606c8b3562b023656a30e195a5cf343ff9b54a19526b28516ab305eed9992cadf5c3e776e603904f4c3206d38eb2ee82f8f4c1c0535d5e9c5ec56b55299dfbfecf5952aab932cd98b5d38ec2f1ccc3d37aeef2a25590035d9394c1b0f1082b7c0f2bae8ce57386e2976648142d1355cabf4f66deeebcf8bed225c1b8f071b8b715c71bd1472f87c6e0cbc0686b6604bb6efe7ebd4b75494c919eee9ab7946e374da6472a5f08a8734078c77526ac1c9dee6813612709b307149d1813e521cbafde2600d0bb07dc6d489eeeb491c56e5568d2cd9f3fb73dc6e13a2d7e73922efe340e84335dce0879e0c9ea6460e19912793affccde4bb388de55e801f9185900a3b725af4b446ddc9128c0578bc83c6ad08d1a1a3b2446ff4b4d6d5fecd171d106967a472b23c24f3ffd63f191731697a55bd9b820a159c292c379214de372c2198c99e9764acbd2bfbcafb150c1716aa8c5764e464dce703c574b96090a44b7063130a34862f21527fc26d093352890222a8ecde9fed88aa680cffec791712a6a3b69e1618387e029d2e8c185808cd76276e91c7c064c6c92e252b505e6680d39498fdae5527ae2e53b25297719352280de387a834f84d2bd233d79bd678da94f60c113d6c41083a782f24983086deb5a3f8ecb12705e2ca03e053d61ebe8e5df7b428253e27ce40ee4df9b922ece307b5039b496ebb79dba99528d8ce366b538f212cd7653b785a8db2983829c3087b90a5bfb30ec4ee572eab7a10b4b8d9a2a77f371847b28f24a7729c3f19442649bb1f10943b698d329b95136149f417c2d8b493c7b1b6554f0c4c288acaa8b6be29bf17ed7e6ceca01593c6af8c6bf1dc343f1496b386aac519ac1515ca1a1e49fa59d4b02ed46eb333c75a35e6e50b73d7d0803c6e35d8360ff24d46fb36b46b15dd20b7621c6c075a7e604f6fd2296af8d743b1ac15028c75451c8fb781d3467864064d98480d4703693bacbaab2cae8a0419170c32125b8f92a048f8f5d7c4236d69e0555f4869524131f20be7f9f7026aebe24f4a559246c4b8bdc0199ed5b7c58149f2ae8724efbb8323981740bd9cf13f0d68aeb914e4379022d1c118ef9060e4dbc0f4400649be069d219065e7ff542ec0080eb3e94e60efb98e74afdf2fbf962caced8cbe505e4abc6338c93629bb55691727ba1b27065b91e04a3a46fa5ca040ea266b729db5a5bb4483c76755e7e3080b1234ba3021f7fdc34284604be0769abbf975b79df9e16f340827f407a12fad8c0d0ceaa4b2b04d0cdc8b2a47bb6ea76f2144679516f34017f43529bb4c6cea6f7c3136923b9c8a2d7096da7249ad27372f2195e528daf1e6e606fb635a35f3811af4a60795957d2ee5562af03abe4f983492eaa9e0ebdc1acd69517bd10d002eec4e75319856a59f38be4181f53564dcceb9904b6218c5aa5d39ee1f77eff24a1795eb2dee47656355612456813b05ccaa67d54e4231792498c15a5a943997ee3a4831658aef995d3f032dac5011439562cc0b3d227f4007616b65043f09064bdd58ffe84982b6d9792048eab7be72223ff5c250c50ee8e7a1a611178716a41b1646b0a707bc4d8e53352ea4d9b0f74808c64a0672ab4ceca241efe325058fc027a3e4e789f109d7cb24612338ff5cbe81d8e9ce2b55387b616c98c3a01feff00946318468601fd0fca49c0b0cb6b409d8b23acb29c05d4238e29160718d738de7ca062f5241b61b83e3cfac58a01e2c895516c3b75defaa4834502e735645d8e7583d0c0619c8f554f38dd29b094ce14040cbb7dfa372ba6f00670be7d4a130e9c716e6c44965d7c1b0f59dd7bec47ab97e13b22acd9f1f8dd3b3e3e80163333dac1b1b66f9c859f996af76d2beeb3d36147739c169691afe2efab9f26f1373793b1b60f83d59f2aa956a460599ad7225afd18c9a6424390eb36c48a7afbaee433ad21323365828ce38e1ecfea6af40081ead7a113cfdca5bf6e8025a3a282288111ad6c4b511bc41ef6d5efcbb330c819a0e4130238aa5bd531899ab9ba3a3d5e05a144b74fabeb1183be2f64977e4977b11b1faf8ada4a52383e2170a8478751306768005abee38678225859fe2b6dfb79751821e0a5f0f8337ed8cfe43020563a9ba1ccc004f950657422cb319f65f185258f6a44fe68f2a5d0ec9e82776e5527f5f9f7e29f73136e088843e3c1d4dda39f6060ac1ce619731c763e504d63d3bb2bd0bc6432df1267efd12d3d4836c3fd63dbce77a8f14c1df4efea36550539cf5d1888b0d97aa1bc3f5a3e8430250ddf909c8daf293023e8c3c777c31845dcd97629fc8818b33947c7d24b39ac152293ed631a8db999573e97b7740ae8b0d1afa2ae489bcc13f68af1bfb3ca14c149512c3d0e5bef51f55b70137ab3d89b4ed424865ec999c8fd52084ef0e8fe67ebeab87e4e1c12c08dc35c95014586aa5e8bf2733fca21b59ba2616b94e6a849eeff7f433ae01542811c4165a73eb9a9417b2d74ce466ee357fb7491fc9f29d846a78d1b207e1753e9a098b9cdc88594631710d05c9bbe4948c147120fb6b69e0395218c72fd0d8eef5f77977678b6262fa667e2e5b8c6d954e748a25c9aa0407d14c3c2595da7d292a427390af61ef80a64f8a7b8fb3567ffcc72780daf30e7abb71392ae796711daf8a5f6362d01acfa66583091041132e883c0d08389a1709c93cd3bebe0b8b5fc007bb13303c0611f7b0c16d928cbaf4ec4f944af148a1e670c96ee4ebe9d6e4ef80aca6c1605d34fef1730918dc03652c5d1cfef6f6dbd77dd25f9e2c9aa21e2c03594960a439885c175c4c5b52795e4648b9d5464eb79a7b74502da9ee72078c5cf957ff4a93483378b4c184e655ec7d1758c88616286c8066d7501b602caf3e9d8183aebffc4fa8bdded092a0b73c194c551ec857dd54068073813e591d58860f721b186b3240c035804f351a26913c2f52c841dca06c1214085e088df7f3981e7ce5ecd85bd56d6ab0ae0aa60b83a4c8672cca8c172309702331a713661dd8fdcb470fa6247eedce22927b88248f4fe4f2f07eefa16b80b89075ff7528bd0c03d984c94aa08a0a495cfbc487266407f7be0cef224a05ac45f3be95fbf9337e03f1571096c56166995ff9c057f4fdc32dcadcff388aea4a5b0a97675ec65e97295a84a25575389a78c5ffa0ca858d380aac25dd2dc6c32de63e38a6e78fc5fe8d1b997d3e4ee67ba93124d6d91d33c5955793fa89df4b539e7160c57631e294ad8730e250773ce47c9bc4205e5ba548db1c29a42737c32c1a678b065e7d5c272df9533573ea5b9d6cc5ac9596eb53d150d887add26b8ce8841a4966fc90a0cb3b9efd05e7e71f119297e401b825eb81f24b1a7c454e88f0d13fd60be7f10c04a4dab0077ed6dc1ed0512f8ba46731589aba5ed87b7689cda1b64f22a95c593c4fd5f29bffecfe4a3c18d4c5f96692b0b7c52c1b82ff448cbe786d8277da359b5c4e3d5b0731f19bb493f737547f9db486640efd324193bbed1d0d32b139c10cac857ed70c6f97d8ef940eab31d26e9f9bc04ae29eb7cdc3998fc2020df2568c3aba7f74bd78be00a6839cd34d766c9344c34b65794d3580bd52169239c6f84c62c817a25c13bc278f033a524f09f0c8f87b452d9f9e6e88c1c8f9e22fa7fdc035fefc1be5c5b0989583cadd38ef1f93dec1506c834d9f4e77db070b142ed1b01404d40ccc7a404bd9d8e4f10f2226ed65f764987994d89d9b31943a44f22f0b6e37340f21e0869b03ae6c51ae1c5a7ee8d4815ac64392fd7aad6fc2e269ffb7d9c50c7bb04433f2434d71f886fcaa737632b64d09b288e09d5c38a570c1e88adcd161b558628f35269365f11719a402d8888f7dfaad7cc5c07a6708cacf8d8fada086710a4d53df9cff01e345ca2d375ec6670d4e445858b6b3bfe2d7ebca772ebf89431a2430a771648f50bd12dec350e96e60e4dbadbc92ef6406f10c1fff51197e3206c7fd0433e099330cf4b5b5abbd4e1e5329fa535ba857b6475266d3802ee6962ac984db894eb4f60b343f2412562fe13040ca9efab20097e1d2fc447bc282b0a859c1900d76dacdd88cd1564456b74b89cdf49f4f01156619711d35c6f4047a983f97098b1ef3231897fcc7d28fc9e585f7891f8ccb335ff1bb8d5b79bcb65cf256e54308d42b725d9564b74ac3e61a2f54dfb34abe37037ab37f9e55e8d46ac00b528c45109de3f4de2c8808276dafac3b95afb1af5ad5499f1068d918eb3bf0f4f145d273c7cce4cddfe8f8f14433d41fde85a3ff4cc8e043da96051640d9fa39eebda24f7b831024166c7c51eab9c341b94bb6bc29247045d07b8a25fa997032bd75b5d0cac8727521f87d74d1df622544c5c130bee2d455cf6b072d10b3a0d74f0510b3a42b7ad7fffd85f1df22b9a9f4af15703f3d79e89a4a188de1d8381e74ed4da1d03a6b94674d55debccfbe6dd10a0cfa85b59b9e8eb5038133d4360d66836a12f5dc98412d13ff5d9b85ef918a94aca2ba6882b3b652b831a88e839ca69e4ff5312aa7a4af0296d3f879e83aa6a9bb8674290393eca2be1868e5321663843d539c5a1422d9ace02863849eae87d15972ad25c4ee81709db3b6aff97aaefa25023244236b3e44f8b5943923a6e914ffbcb37a500f762efa4c430bd844331ff56b3290f7405885024149c9c7e26a74687ef679e983975ee21386b2878c7387f88825b6005d1a1c5cf11d593be54dbd98e12da1d82a5f03ffdceeaafbd9da3d51475662571d00eee63d25f60c9b5965271787b833847bb939f13ec4d68ac985fdab81d991f53223fc4c5b7ebf824070505b7b8826874cfa767402729454b0ab8f8b2ab01ef6d910480d50172228ccbd13420ae4758f85db6f70d767635d56e97f1d2df52a836b4c4340bc34eddc43ee0e8090d89e67e720fa54ca15e869b0502aeb8e38862dff39ef021f237a6433daf15cdbfec4f3a4319a8926569df569e6b23b37e504602f6d5a6ad0c4afa66f73adfa24d5d6e6358b617d6e94b6d8d11f184e564627a7523369106a629c0fbe4b3d8074dba3276267d5124468cb75d5a3b29016a9924c0166ae2a97b89dbb154a542f7ab1c97a00f9641d37555ef4acf90de41f8fcf2edc0a97394d4e9cc2034610f664d3736dfce8365f6ff42ec1b1f0cd0bcd7451464dc862f98a5029f9fce2c0658a42832e7d9090e565fffb6f1ae0f7773d4392d7eabc24a5610917d2dd625f05e49f6391fb98245c066f20e0ad1091742ba8d577f0541623e847ce8d91ed1079a18986278aafa3683b33956c2cf2f338a29cb57489a691bf31ff5da5d73f3163ec280f5711d065e47dbe146fc356a7b8d544eff691c7cd9a4e2992d4627b89565161a873bc38df493ff5c656063533787b7f7acb67b0e2b0d7f6fdbf05aa5563d33220ee65a2de7f495c642d0af6c2f49dffbb863946b558269503673031339629da8aa4fd8015a20a7e8486203fdf7e3c4101309eef29cafdbcb3609cf3454ba4db3ea5032d05e92d9ce86349275cc7aa8365cde0f818e85fefb722b78fde51fdb1788e853a45297f79cb467a279178ad7b2684b4b675b296481accb5a7d45afa076c3735d3149843aa20fed727386779319687ef5c0e7ac03266de24362474b749fca7b58dcf5a67e0ee547128d827f37d8a2b0da6aa3745a8e08b94ad0ba0fe97ce4b6283816c19f7052b8cf8c61274bd0d16f2c8d9b98026f1f72ed301ec4b0b0880fd2b49881f4d0589b7208354a45a7ea855b3776efde566a9b6e4ce3ff4ff93263d69d0efe82320a3aaff68d0e87fed8169f4b2cfa07d6537af033ffff14f3ca96e364a536c92eb282ba8838a4ecbf41fae63def518964087ed08748cd33ef1269d37b0050bab7501ec79ebe8843045ee25780a729874b22be0811691d592e3006e55844a0cd3d9e8ab09666cc0214516d946c23e9c1c1eee11bbe1fbcf194406e20ad1e902fb9097be5f22eaf85820243c12912c6fb13f051b03e19edc769d3d1eb109195a00194ac8dbc78a459fcc92b98e471463f44dc27c154f062b1203a516beae406498a62e86686ac6cb0e09472c40b47aebe130835652633ace407a78e40f9ddeda0acec90a566d9292e470e321557ddbe141222e352e7c8c237880aab56f401899f002234d395c64a3656d244b2efd491caddffa4cb610c739981c98a3092b3e93402d79d40fcc3023c53abfaf85d9fdf4091f59073e94b50b6023b19acc9617f0949bccd4f2d5fbfe510ce684a37fde6b648716fcfda42c0338c9ffb57cdcf0c7d681d286a22e6a295b981a6ece788d1406c4f511294e4c8ac9a48c9d9bc1fd10c260df89fb94eb0ed9f97ade17ac013beb8073d992eba0d51b50e4c13cc4dfa935969a781c29435c22741133276aa99786c23067b1a442bf9f6e7bd11ad954ea869687912e8341743cf7447dbbaa656a069c06df660950f5e3ae84dd1925fd2b5bdace3be5d729a79d10a281bbb07ad3cbdacb2ae5ea6c217383a96ba208b2881eff177f6d7de5b232a9be07cbdefc2edc53451a8ec36bb33f8ccb342af674f8aac31952c4778447b0ff20d904540813d246d9aae2feb86fb6fefb963f17fd086c5ef0703dffcfbff49ca9c00f441bbf13a329e0d8857faeb093ef1711b4947443b3d7a1604fb4fbae77b233afc7bf1404b0ebbfdb9705369ab42658c40b8dab198859d8cb5583f228d4e1debf2a6ec3de8a5f8b13ffb211edfa2cfdeb7f9a0c00d3955ffd199164f102081c4cbe39943f165361d9bee70156381cd9032ecbcbc375e9ba5094a7d3ad265fa6038b4aca17b35fa0ffdcee4ee84be2096c9b1e76b6fa15f9b3155866086ca05ebdad0178ce567a508be61a57d8e9096d818c0d7df238c3edffec17f3726451cdee5a78b53cb700e3100484003dcc2b03e045103b652c4cfef56170b3f92951d161bb8b9a09dd048cede9a00fd163966eea01053c7a75177353aa7a56415e854ecaaae130fed91e192642180c4898fd1c4b02559e242496c02a7cd0f152e1e2e4de3adb47238a1d190d4aa4a4400d5f2852a228ee2bdaaa0ba2a9751a2bc464d18bbfab9f333088d3e40e3fb481442cdaf2f6204723d440d84d9713ecc46a4b8d9d8f26c0c22e4cf0f880c7f427f881b86adf9f927c973b2d0aa492892f4c3e73de21b3010c14b0f16ea3e934e8071e16f1fc6fef27dff3fcc4f996db26833c4d6c6889eed3416a194b266cd2e464c00aa7e8196805eb4850380e3a81c14f592c0bf41596ecf779edc489351537e2a353ded297495708d069443e80adfe459acaa10691bc506072efd750944f9b25c95f1020c67218f3134a638419e645bdd81aa352030e53c81ab7555410ff4b1871ee7ee0aa98c1e505e25340b911a69b0c9fa76a0e83b94b6276ff09ed69449f16c45381d202e08a33a6dcd8d2f697656fe482b41a330c45056540826b5a4b7bfbe50f8dde105df9dc11c4b06ecd90ce1581051d4d203a9b0589e5680f490ba418443f1c4cd51c8316479777d324c913296bba29834cede72ab58fcbbb7631a6c5f714524ee587e8a4de7067517a03ead865987351397fd109b412c91cdf782af92cd08087476f4cb365fae619ed04319c5ae5bc2f7ed7d6332f324a58d2e9c83d784067fc44f2981cedd1a807099a9571ff965768dc75a586ebc0184a68c9bab8f685a446d8fa92b29df3c23e60cbd98fcec92c7e94a81ae72257a3facc639725d88c55f401d33445712cd82b247660d6c6fb2550cbc64906711405a69cf81a753b45e5ed9095380428ee722428c4bb084a88d82b43fba75c3449e299a731fc13e1fdd17e3b222843bc108c6b8c0432fa09563915aee2ef32de87116ebdbc4abef52c52c458f5db464eab0ca40c3c523eafeebce9236fd821e62037ee2b76e3e246b52541a54ad738f1cf994db57b26acba503c8234b04ce31e040877313c01e002d73fc198f5ffa4c7947442da53bb9419cf0d93e73333c3ca9144f52fd1a1d49067e2682a820a81240af713354ce5def651a0239c2b6da9a1a4a6bd70678d121f9ecfeeb0a52237f8e122a14a6234c5782802d83b45fdd7991e965c5adecee8ed94dfe4922a9e8dce094d832546ac791ffce8288b501d631447fe30dd795f18e372ffb4c3b94bfbe3604529f81c7e0b68814793338b386d1834e1f561a2b2ddcc0f4124a9fb95b96d7e7592d6a0fa402a4fa6b3e5acd20ccba203d274a29ffeb4a1a9f5a02e3437a7e991fe20bca1a40021ddd78fd716e5f54a923a16858dfcce93805a9dd801fd03f81c5552d2ff6a78ba3bc81f4cb2bb431e85434c5891e556aac7d3858058000de49d59b957dc44a03b06b4797b2b0e8e9c1ccfccc6304250c55c258b2f29b1c79a5e5863f8e1047818e9dd052f55cc232bb32649351cc4b3a940b39d7d5c16094a313aabc9050673771f2508b9c2a0718b9155671d0d5c48587d0e6c3c31f02de52e34a18736d540697a2184d85d92814e7d4af2187235176129702daa945e5eab8059631e1da280264d0e8dcc47bf0d2452ed255ee0a1da4844b3f7649bd737541fc419179474acf083328406a96b00e99131617b69b3ff0f88ac497c35d81c42ab362eabd90f20417c6a5d00db18a71f09676dbb85cdd6da93aeb7fe7b31212d1db0bacdc46576245d67194bbdfc4bb195440978bc7da33421d8a95c558ad41f0b81f6e284d7fc0ee14a8dadc56a546f98493954d16a86abfa0348e8d3ba0c157f357dda99108769825e510007202fcb0b9df282af8f3be08886158ee7db6f5f7be1c5d7c32eda9f61bcdc8063a95b4d13893b8a1430d659137438116cd5ec7e57270b066e87f462052186b7e00651523f0ca99783807401c92ddefa0ad640cacd08cd4e01e1a86fbe4a0c1ea2beb75ccb774cab18fa462691401323e3cc610ac3399b8ecfe5f297f13ae391752ce272170d6b14c03d630bbb88823789d896f09892e2f103b358d0850712139e237d829f6d151948abb14261d4dc2c959f533b0dc4abc84756873825e27daca7036743210bd2c8c748cfaa555ab5651ab26687b4cea0df1d37821cced95d9e46f06537241a555a42689b50672f70439b191eaa0418b1fd0402944bee190605c2859a13d401550f14aaf56c7b19b46098f5dbd17bff7ac43b41512fc99892f0aa025d124672a611013d8accfb941dbd08d44c9048ee0c7a1942b2220249ae7b2d9f0632e0e3083744f116f94157d1e9b789b9941327d351298b77ea9b59fad9adc19d88e889017864a67031a75073843f9e4ecf9e75a4e08ba4bb1293e708f2bce6b42edc5ef8407df8391723468bc68bbaf81ab45396bea12f906e732ba075d6417f24056c7ceaeb968deb60f9e116e5ad1c9b314af6464ef5c72c1ca2a5d16ed4cb9d7e638f0098b77b16fc7763bcf6f798407c3ef77ac7f9a14c1cf18e5e6d8aaf6313b94e876ec0aeb28853c94441f727a09c2da4a035b42e3ac4b881a278d3d30b831969b320d72bb3111cf3c9171b166a437c85409671c34f960f7283a70c73a8b49d4f14359613618cdd514219bf296a578ccbdebc7425ef8a52566057bd2b58dcd877c6dfe533d31a2ab6317e023386d8d400d02153c08605632c138255e1ef6c3b3ed7fb11e1612040c9acd3ba3542100830a37436f49d962c3b59c384d0d32acceb5f0948637accfe218d4636e2de5932f1c50ade5647f218cb53167b7afa6843615043684e5c4a8554e2ca0990111afdf81e21a0d285961ae150f2c04a3ca7abad9ac89d57715e853a90c1df2c10187c142682448e0d8eee80eecc42c165fdc7be344138ee2c45b99da42c3f9049cd05c2eeab2c114ad9c2530f27415f9b2e2f89cef24ac0028aa6cd0231c65a1bc3960d2306cc47d6ef43744c16ad3ebd0006738f43361977c8a135dcf7c629f3ff4de5f41f5db0089bd7e6ca978439764841c117530369026cdec8cfd82190caf0b9a5443cfc7c0f12badae400a232fcd45465c3724643b41855e2f14dbe0de6e2dfca80f9a50416358e5b2e609fcb1ec0572b44c36e2b64f330dd5b03a46bc858cc427c83c39ad8011a1c5d790302ed600438648c6406e190989ad02b9cd01df9ab90ceefe46e9884a3a336d25236b926188dfb3397417d38c66ff7df39b6fde1119a8dc14b885658b45f7cc209ed51d3189484c70984caf48aae0f87b783f7f326ee8efe5a0302415914b2b0aab619f30a59b8f60902b023101724f0e2e128abb24930fff2aa0048060fa71d899119eb138d2bd0b21c103258eb81cb2a2f852b60fd76eaec1bbd59b104c6ffcd196278726c6381395122f31d8225ed07825fa9d82b2fcb245b5b138709d9263031d5af6439ebfcb4da09fa3c73b432df1f023699536cdd26253cf91566ff68ac084ffe79023c44005073a6c0df35da09b094b269ae26ced50c5b6cdc22d07166fb1a7938389605abec7d7d131ed15420a85a1f2adcf90bbe72605a86beb102f423db1df38877b3fd0ba93f4474dec7ec905640bf32d6112a384fbd663c80231cbd89ae227f0de4814473b8cf7770adc2d089b109696454720d39136cc254c821b98b5d6784278c576619cc87fd4cf6fe13b5b46623ebdb8952e417deceed0daa75d39c36ef9fc17d926b61ed052eeb50850501ac524255d8950456e427adece1d9445c65230ac24aceef2a5284ac4c95a66adf79451a881ff6b7789630c2e6f5e6862d8a942d73c115b8342159942c751df95b14cb75b8ffbb86038467c0051396d83ec2c2110bde9175c66331248ea0e9f1ef61cd92c3ab11171c5de1d8813881b3ae6e54dae37c1b507938c3e4c33b002dfe9c37abdecda665d7c774411982b6c6d2210750953e7c410dc54ae527730d3c93ba2c160f90a488e94b8e6930a1e03a64108bf0b889619aa55cd612b7b7f5860d615231e69341f39f054c85e15e256b90c7a90b3311f2bc349b08fb177c7a4e43dbea0c7c9ff3edde4590a6261fe84327aa0e580879b81a294405a8e0b1d3657f4ee680e710f1e5858bbd54b85705ba1afb6454fe469d6e63780f51dac2b1c663e69bc5b1d34fd4210c1688d07cd0997fae63fdfd62d021d065df371894983f0d96e79b4781f0e1531ee7c4bb14c26ed1050f91baec395b05d0a546e1fd5bb6dec37801663d5cde64234f561405e27e5a7618925f48803da6b527a5a301a12a703d9c9f89d8902d64dbdf259336dd6ff05b9ccc9cb1f6545a4e2d405a5fc3c770dbcab7f2b3dd682e3892f03b030da02eeb8d15f20456380d2498c27ca1cb2ebbe2686bda89f05fabf9a46216d6fb9b7dc524a99520aa00794078b074a8250225280d2c5312df4dd9d508286eec6b66eef93fc0534128f6372e097276a50403b21bb1f2dcff1d1d7a6eb61f789bc6f4112ed5afabb73375da1e3fa8e6e8abdea1c7ef1c6825dfc45221494cee9951b991d0efd12726e72cf69aab09f9b18d0029f6ffc183c33ccb89f9f669030366061b297078d02d8c53fa777ee8bbf9bae938f6a7c04dde426298fa0e0d47862c73c72ba96c8b2968fbca2aa1575a6da5cffec49adb5320f0f0f0f0f8fe46942a9b522d1bfce164bae7cd970eec06692074a1e2912595b5bae7f959931e223f90dad0b889b8d71f2bba77b9ec30b466ccd7a2c206b8d616915f6933cd8fbb5695fe55baed9c505f63e209ae35edd06fa7e92e78bb10316015cc3ec3a406de0180e7e959f0d871cf734e79c57d6e39ee4812e27b05fd662552b3ee17e2e57871f40180a1cc6173fa08b67adec0c263167ad5ac4f54ac4f52ac4f57707c852f75bdb0d2152023d0fcfb216bdb80f2ca2798d2ad0ccd69c40f8c82f0c6d45cf0c39dd9826109456d7dca70044d02542f95404493a7cf13c02a01d901ecc2f935b2000a20577881014e111942dd94528b31958e697d9bd0eece21f0614608018f11b30938f26b780f0d1bde41177e1171b24f40a08a184946e485814d17577b9ce5dfffe6c776f4d41409838b2a564c92da594b293e058c8b9db30b75d4f62879bc0fa431971268e8886c5eac14e489c6034636026aca685cdb0583b3b3b3b3b3bbee33b2b2abf42c493e83cc179606056fe7396af288b3546f7cf399f07ec9e5fbfa7eff88eef787cef99e7e2d8af7f6a80792eb5901484e8878ca04889e5559ee5fd61a03f5d798e495e05efb84e33ad371ff559f445dc9020564a9428897e721f658da172e36f7443585ec5015ebaf13c7c05c7e3e886e0f8952f52aa2c9ccb705c4b909667f996ce655ab267f996c7c1b50471e171bc0b9d9b70742dd9b7748ec2c93a1dbc74e36fb0749e44467b6e4cdfb9f151855250549aa6d2549aaac68d1b2c362bb01f65b14e2c2f81bd787c94bdaf6afc0ff47a131f856cd8e07b838ba5508d1b2c9fc27580de1adad7e028a7b97783f3126541d24541a114948ba569174bbb58dac5aa71e3060b666333baf5c8be22362b1c9754382ea1705ffd400cd05842c9da7cb88dfbfc7aed3d4c85e3d20ac725eebbba4f11d6495c61b1583d2b2b2aacadd5ea6141d28a935e595159e1bce43b9044593b2c16aba75756549ac512d122216f49713353a6fddf3152ca4c5f52c952ced92d386cd73aa52e9fb02f739aa3d7ff63987b3648ae31709899ee60e2cd4045222c58d10d110098c42d2f6cdb9d03b84eb98ef412d92cc1e9c10ec330c3ec10c2830d33ecb018292630304fc6c041164f70b0c4c9ad529372eb9f811533b84172ba1f0c121ac96d7773800c2381a744bba3fbd3ef4e8b34c81002f494ae873260723f982ac4d0b9b9b9ce2e822e6e9bb0af63feb792b89e11f6f3606e4a07060646ee605ba8215fcaf7804820061d5ec0c886ff10c2caec637312f60c4a4112d651483bcad5aac4c277bf32b60587ebf66377a3dd8152ee3961bf974ef048e6784b25fe5a5cffb8c331f1670aae3fb4e198f9cf31325be29e121e655a708603a9453522059fb64516d7bff6674b322d321c5423ae7a3f1a840c07d7613502daf0cba76d71f9a58b3b204fe3cedf405f508a63e4c3bf32fecf79e454235549401f459fce3927b333f30e9844a3eeb9dcc1c3b7cf17295d3be68e1d1f17ae13e03ae8fd3b0792b68f5b0fba84f5b78973ce39e5fd78e5dd3e29b114ba6ce0c29efed74ceac103ecf9675f390ff0c8bf074892ece2af030befc7abeb735e3fdd6bd90dc4eb5dd3a76e934c1bf1ef1b9038c6f512fca204cb70e297ecc6522496a14bfc1d7600f129afabe6436339b6bbbbbbbbbb7f6c668622482924516aad48f45f79ec208463a04621c94b308e4619a54f3484cd484249154a4430259628cdfbd1543bc124205a38268ab0b0555c8fa2c669f0af52cacf0eacf3d8e1514bf08bffc74cb8ae048781c376bb6bcc0cfb71eb54d336404012e6d408fbf50905fbe4521eb1a97a44da4829a9dd91809067834872b5c23dce94b8ac13c592cb0c616f4de5473ae7c9463a2114ea8a943e980303035310a7f35b67cfeb9a1dc59298de1cbab2ae5b8fec6bbca08728a779cfdb7a6436b89620367ee5576c7c9152886b0912fa955fe986ac7c6845e545d7abbce857b896202cbff22c2b5dcbf5a26be557545670d558414959a961e7e7f3f9cc1595aff141993538be2b5c2ca1ccb9b2a23279401b1c9742d5e6f2c03c9f0df9d069d015545d9707a830c4a52c4e1b73da08cd396dcc39e79c73dab0119a6da3258d8d396d84e69c36e69c73ce396dd808cdee59c3bf0c6e6186e12e00470846e765dbed36871d61ff7eb2478ed1e3fd2915b02e9b7139958232fc083b8644b9fdf73c18187b5da2ae6c0496faed22ec676fb4d61e39d140e1c1ec30430cdc64476c7618237347991bfa879f637ef896ee70f0db4f822e49e1c36f77fc41c27ede75e8799ed3a0015b2094343e7218f89230991a7944e2481d690365134892342ca5a49134d9fd248e94524a87524a0ef6902ddb492e1e2e6920894b9fc4999142766685bb7886e35e8fcc0a29cf882fb31cf7fc71dc732af8c5339c2fa322cacfa8a01a0f2c74e1c62869248da49934474e59aa22a114033df8088646f2030f6d72ca3d29a51e0dd38a39336de669de4c539c1ee3148249f49dbb9263a677b2055dfc5b929a5a25d8aea3c0c2d69d2dd992adebb261c3a4f2ac73d65a6badb5d65a67ad7563e11bb2ff52668309a694fdf7c29d5f4feee25f6d6a927ae767725386eb521a520bd75f9ec134f8d72578c4dc0493e61462d224b9dea5e6927c3ee34cb4f4f9cc4b1ad712a4bef65afd22a55a39a992aa96fefada7fb84f2777a08bffd6b5f46b5deb76f65927796a2759d3de50ece15fd775595a91549b7a9a2725982451cdf3344ff364bf7a3a31b9fe7549d750e3a4ed3fadde542b5a86b875320c4df298248f29933c26c9534f1635ab8d8f36d0ef43a7514f9084c447d76358c6c512e57cf0a559f65e9a2748aa749e4eb09eeaa99e6857bf6f92f78188cca558f7d97aaa27b638d46d164db0b29e6b55d98a655c4b426566ee71884256a391e5892184f2b31f9d733e9c964372761042a8b9477fce39218450328c46bc40031dd4b233202f403d2016e8096805120376b7483ea79818e0b24eea74bd0035a1b96e2fe4da89899a4a70881b62e3459fc20d51f915cdc63d24ee6da8ede64ae18648f95028e5634c49f9e66497c241787dca757529130d9775b4d8b9f3d6c40dc99dddd644f5d9f978719d5738eac46a37ee692c96e43e3bee89ac15acb6f2950aae4026100f9af4b1812efef5fd415d704cf651102dc182015d8470fd9becb807f262c77e8e9e1c3dd71f540304b2a00d4bf92f74bf8f6abec0a2bcf65141978f34c1eedb71b31418c15e3efa349b8fca8254ffdea7fb3c900ae682543beef75181ecca7e5acb069240d8c7e67a0a880907f201bffca05dfc1d44052788920032818ad0906b957b48ecf7515dff8feac3c46f307d2905d41d880948e55e12c4b89f0652810511c12f5aa4bacb3a5ad4e00046162dad9585ea6a2d2d8c689124e5415ef8a83fe5e3cbcb3a4ad8dc9ac2818cb84b4aec40a62df4881d6807b4d2b901eab24e16ac172eebdcc074412a4802994caae80d3ff13d762022f845bb2013bff817f60648051a03646a992009d4a94c57278b1c9d2c66404c9cc42523d4dc0fa462e2a42e710e8a30036a729da337c47509727e9ba91699b0a015880552cd23d308cdf539334d53a6a6dc73a9731b4208391093d68e809a80b493110925fc28638c90e6ba0909fbd527d75fe59e5726d7e58c853fffb5162469ad562b9381d55ad75f6bf98f37ee6947bc465b41926682daaa3e99b936905455d0c57f87ae2c8f88755db3a93daaeb2d90ea03a9402a1afb815420d5f507a9402a087b6ebf4083e2010002d618c6187777addf578581f1bc7fd1d57da25496839d3b71f8c4cdc373fde78e8fa617b3654862fa52fd8943b7898303ea688b5d5a3d509effa317f4d92ca5206b3f22d1f6af799e6337d4ce32acd6d8a06e7026e61a0aa0df40df9f9963eceeb842e1535e895a841d0f7ea132b0dd276b58f723c4803c2204952777e9cfc1b122670965c10d19c952b66c6606c2751799f2dc73c92eae8363cfdfbf2cbbfe2d9918d1479186371aeb5f2133b3e45c321d254f68be9ae92c99c9644a67c90bee57b32f93bd29c07b63c0c5baec1e94524a2965a4d8a494d249299dd8d7eece32ecc2e691d30d990f13a1943cd9a8bc40929239928944f9f39c73cee99b4d953547aecb23ed29b0b725cab31b1fc9d3e9c8a926943201b6c2b01d7cd47d0109703363b5497d1d4ed2fec361a1baaa9d04dcabec39fd50507843c2024c129d34f7cea0b9363fa04b10dae74113c3300c03fd4703fd470369bf3d04b4df3a087c1ed4fdc8980802f41bca5bf973f3e11912219014841441eca37c10db8382b08ff22dfd4140bf7d1094b7df5b4b773a807e7b08803a862e1040b1dd8e4f6b871cfbb1ea8a56da97764012a76d2d4086481144fbcf0f017541866c1d63536218a519670d3f178bae78071f6518bd6a6cdc5b92ca7c7301f38a397eb6ca784c473231649a642d23192b7372fd39ae563a622a5beddc2f63b5628c31c69dd42ae5ad82e0c17017bcc501bc55f6c5f52e5f5486854216c6f54abf368675438894e8f3f06c95ad2eeec36e539989747053da2dbbfb60fa3b8a217aefbd9e955f184c62b84c93961b617177b7e8e0a58d57ab5ef5aa573816ca2a3b4abf2b260df1273de32e1f38230459b8b5cf70232b48da5e7bafefdf3ddde218ece77f6e120272c6b1b6711842f8c5ffe27e586d9c979ac77b4a1a7789808a234a44a44c498af9454a5bc743e37e00812eee2bb84c7ac88363fa3a7f01c35dac9a348f19167eaf787cc47d6786fcaa3599092c44112220562d968fe8183eba56abd5ecf930a1b9a0d96386cf1e61201703bfb80d201a68bb146007ec3c6f14dfc39c60a1e74939635059c767993b27c572a2b3a457ce743a61a31376fe89637c62c03d1e3866cba1dd0339a6bbfeadc3312890947d4bc46a9e9b7325612390ebe384a58dc4491250826bd081655882631ec02ffece8313d6b213ecf2e603d60b8463aefe1c7e692f5c871c1b6c98618618782787777ae7049052110e2cb70cde653a76becc819970e5fba600bfdc32746745df394cfc86ec9de6744ee76018cd6a6c90a06e783e2d50651f60749d8d4c030527c6e8261f390caee347dc88a37c899f1cc9f58f2a56b18a55aa1f3f20a929b55624faaf32cd041a2e789670a1049d5b65db5c3f20c94b3030ded50d6918d4787153228209218912ed86c032c52301d7d6e3fa3e1b6ed370fbe5360cb75db86d83493c421ce3dd3c20a9916097f9f3e327d0c03c2fbc8201eb6877f5117e99df32dacc7c1c4ee2d27c3b5f04495cd2516f6e73f3e3e40d762a33d23e42a3db5d877b3ef2ccbd935b048a94b2efe4ec74a4a698b9f27b903eeaf94fe5e8e54b393b20fc22cfb03b2d93855879702fe2b40a079232c02ef1634e8cf10b306c7c6e1c1a4aad1589fe3d9c2b845dfa59b4638b46489ce1466c091ba56c9eab89ca3abe0a2f8c91631aa760e17b9cc147ac73c5e9c60712756e5c318f7351d1d0e971ae150ddbdddd10429713c6aeeb6e06f7206cd9f83c169092a287dd8b0b9d7bf7e0ca08acfff7910727f909bacc30890774914f8dd823352f1259bbf32a1184301402e15308997be61817dc57ec78c5972df179eec07e9dd3393eaa4b52b5b5d5f6f25554b67e6f9a9396a675bdc45de7cacfb20e53d981fdb42529f7a47bf275a0051ed68116565d92ef28347afce6ca18bb3e7263f41a277149e3013fe6497dcc934a09812ef229b55624faf73c1e3fedc033fc44a9b522d1bf17bbcfb3e2c9ade1b2ce0c742ecb3d89b1c0faf716bd9cd5eacb819142384608bfe8c082d5d1f341526577bf108ee9db1dbc5ee386d07eebd69e37edaf4bd3beb9a9d53ab5ca61afd18bc1a796a5a29a15d5978fe3dff3116b0c1ff574ab9fc8d03fd5f4d78b875fa7915128a9c9e47bafe3a79229aa94524a2550d0580221dcefef55840541177ee7620c23720d32d535c8ae795a865e02bfc48f567ead2103858536fc1265f7318f8dd87b53ef3e6aadece29b6e9449b0fe95c6bd23eec5ebbae6452f7ad1ebbae4d5411af7e24f78da6a2c8cb1141fc616be5fdf1863a492068623945272c7d07eb6041365bf08c35f7b6c0bbbf7ce9b77d40596089a2be2542887ca3a362358fe4a863f19d0392e826d81000c42b640c07f870876a908035d82c0210f8b948a94bc0392b5c0b6fb10127642b80d552d830938a6bbe601bff85b99560c8a5f6414ece29f53825bc5f5efbbd9d8cf5b2d488a3db1a7157bfc4d903469ba062e38a6bf87c02ea9ae0176bdd332f87b96c1c00c60000000404bcbfda42925a555487a70ee274222f65c6fe950c65b9715ac7fc31d2291e7b5ca552ac8e32d95dda1a93c83b582185578028aeed021742ccbbe665996c5d8c1f8007d4716b1fb9d95d9d8cf59246d7bed8b94405fa454bb96cfd72f52b25fa4d4ef2ccbfdb01b475776abb11f8cc689b621ec27ba0d4dee359cf9686165babddbdc05142919409172fbfd7df0bdb1854db92df0533280e2f2e623e57601c5f531bcc79d38cbbd1ec27ecebafd1b1396871d3b3a00b90639cade6df7f110da81869da1a3ef0311999bfdbc36f083bd72ebe1575f2839b803735259476ba121eeb5bbbbbb7b841452482184437c804666a6504d91eaef084f1cc54793191de440e7caae057365a6685161c5fdb87573fb87742dc302d163b3c02ffd7e06cbd0580a2ceb4861e47ede72726f904023540a26f7f316eb48a173fbfd0934d566f66e6b7d307b7ee3dfd8c2c6f711e18df179b80fee58050616769f7fee43dca3efc447aef5f8886e48ecc72dc6507c1c61a6c75ebfb9c0c65a297c72a10ccf85dd27dfa906ba753f22a6ff88982ec4e173bd926131960eb084753dddea81fbe10848dc631c99eb2daa4345ebf60f7152979ab68898b8ab81e87bfb5edce48a5cf975cd859ddb27ee35247da0bb1b087ee9e7e150a6f3967b4d6bec57e47a439a1417c0ad0737aca2bf6562a33607c892b4c9b1a13905b02e9c0bf78b3934078b2c270bc2f5ac8bebd916d79fafafdd4de9f56117b4136b7c05f6631609acbfcc8fedc61a63a49094015663600696538e0129278eb703216441b1e0b0ac58c460b18265e7fab3dcb0a8589ab0e4b0e85c7f1855502a2815940a4a05d5590a8a8630c2aaa42ab1f1a10a8a637c8650a19b09050ac73d19dbd2dfb7058779bb53b9b935eea782524101600b00a400a0d39571fdbb1e6e8bebcfa5726c415339965c77010ad7df0516c7f4b36071fd597258a26092a4614125719de508b9840a4a22b15fa835a3b05f0895230a1e816a3c070ad4448e9b0b7ac28515c7600faa028e2838267b1427ae3fc74826ae7f8a63fab3295c0fa142371c238f84a4e09144823da721d4d5491a49c382fae815b20135c1a3d0132114e889500b5405151427e8876c7c2485602fbe7fe8891954fc2fd4fa5422763f1514fd2f501747142d1c287e711615140b0aeb5cb85ed234165f7234c61a4c7c1cc614321a7ef1235911ecf9635b5cffaf061557d2f08b63a91afbb1a072e4e458e223c9826241b1a0bc9d942d2aebf840b2a5642066f8c94afea093f3db5efa018463a40bd12c28aa198e5ef8a267958c2ad58f23a7277a6aad5cf9ab7badb556c6be08e3fa4bd6766b27579fd30de0b310008fe2ab1ec2c8b1afb4010e18d38247574db95cdfda35d3b49a61354bf825a5c3e35e0fd693ba4cd765a2c9d13962a451bda44f175fd7755d317a9b03bc847114ba986c703c099d3613898fe427c98440d2e7a9b500bbf86f50a05a19293e6313c23c271f5d357e03663299289548dca5ffaab199a9cbb324def3606070e69cd309f69336d406096a4e99d34d30b314e9a0343b62a37bb0b71e734a16334b9631e8a845a60ff0c679713ec0189f40e83d0b6a2bba8f60081aec7162ada8bef5882df28f6e3da27b7193f3a2358b356adb16adad01218c8cb2a56c31c618a37b9e0e1c90b3b1f5f85ea557567a05be5f98a2a28556341b9bc88648240aa5d4108950ac482402893e9b4824124096ca52b7b31e540bbbdd67378410c62827ac812768d3afc44a39e3a4518b3d42212be2b194526da270e0103d4b74ab92fe5a9558fad57debd1b63fab5a55623f7ab56e0821ecaaa4bb21841042081b7655d2dd10420821840dbb1b42082184b06177378410420861c3ee86104208216cd8dd10420821840dbbb93b7e1ed0b9c8d52f5ca1c6e76e88145f92f810682ad0800732a5f8b123323f0822f2e35f1ddfe0c2726976527432b163e822c1b05c82e1a4845ea2fae0eb43a7717770039b7a790737387285cad2044bcdf59d7dd7eeac3208846114c0a8b30bfca6ce9e7ca75956c6d535fb9557cdae325cb853249215b8304e243088e640d26052081e19803d7ff8f300d294ea418eca3d9f2a601777c972543e9a26f77ac0a37902f672727220297b026764ec40f81fa863ce7620eca6c9f6705b01d644fbe9ed69f211c7db1d6f4f153089ce24ae3fbdc8a08e51b8b17bcdfe69201c609a5cb8d3344dd354811b1f0a91ed4cd096f93577b029a48963bacb549c0dc1c8e597369094a524113cca76dcf38c0c76f1a71916b21574d9f151c6726f083ccaa490ad522b4892406069049973bd6aa72d46593e9239ee6d356c6cbc7d333298747d8685eb7fd51e2d7632c2b9f50032436de4e6bd3676afd93f7136e7b0f8456bc2f65799d9244a66e62889b8ccffc5182111ecf147e8d349cf0f6c27b093267e611f313337c4010303568199638c0d6334b1fc1861c7182f2122c708bb2ca7bb1b3e844a884c8852b2a47442b21a65b37202153b086186e2008a05851659784df8835484cdf57f876c142c8ee743bff8c3cd8706220787d5448e8c3178384dca96e4f8c88902285544e51c2d6344b5bbdb37da00bfb0637823c7fd682db0de0ce347762e61c4214281a849d98dbb78668345b50f2846bb9620342be21f016e13c1b66381054d9029dd7043d7d057cc41a78c3aa926f7eaa68cd00798461a37c7ed152984215322c0edd4e573ce276ce8b28e1218e8e014875042821b1b60a189b597756cf0841d1b10c1afb0db651d1ba86c90c2626709b3a38410bae88a0f4531c6f81042c810724b90ab74bddf245737240893a5a4c810429b054312f69cc44e8146e8dd256f4193b6a2c96501828e1e5cf831033338a30a268a6002ce1360584108d82765fb955cffd8d41a19c30917480cd14413967cd1f2c146412dabc16043854aa6d4efd50075fd7acb32e21588386275451a2598e208191761a193b32367a4b0352eeb3c2145ff7b09c851e9d4e08cbff1b24e0dccf028c829a5ec5a360cc9ee6ed8ddddedd121102e2cc22d077867d67d22d9bd108c6379f560c129e667d95f61c0581f7b2f061c71cb21040c61867d9d0dc85ebedc72a8c0bd3ec344586f0db8e65f9ccfce3a9c004cb4a98f43148a4b80e98196f2826788398b30024b113d2cdb8899142e8c484208492a22c40cb400238d2790c0440c5f95c145114f4c1d0c68bdc20c862c27221824dc95cb3a57e8208b5a8dd8fe2f74ad467954c4db792aeb6887516a53d3584788f28b09a4166d0f1c9597c39a4a7dd40db3e33d26c98f9141d0653767f749662e1289b8bb18a3fee6a2471689ac6d66666e2fa3720c4b8be04a8c8a7c7ac14e8666ca5583a2603603d58fb66ddaa782328ba1d01a57ca0c491b51057a5f166611ddf87843af627c7103c6a8458ee58aeecaa59c686e49accab5712947b7242c63fb3dc618638c3146ca7129c61855b41863f4b02d078983dc72d87208c18d9f53a98f6ef00d967b57e6a6005aaf8b93ecb271806e0aa0900ba5dc8a6990ab716b666fd5eae773eba78234c869b7a26890cb6e4dd12eecd6140d72f4d690664383dcbc75a5ae68220d72f056968aa3e5c607ca1b4370fd3b46e80e935023157887c9027c0413bf3661bf173efa02c7708f0fa24768717828c6181f09995b411e22597e1be218be0c755c771daec3232565d87baef513d77aaeae4687db3cb99fbd99639ddf706e938a294f452b2e99b8235950e3c3af1ca394524687e1b68c7b40b8071be607f760ad5ce4fa57951ea95205fb35cf630cafebe1d6e39a576d1df760a7dc834fc6d553f28d1c48e9fe9a0a15ec7f9dbaa27bbdc43d98c3c3254739f7321cf78eb01ff78c804930f0f3a0ad623f384908ec198ef187f27bf0511c01bbc0ffe141ddd7376c84adfbfa0517ee745fb7e04215d67d8dc4854f3b46013fb974a687f8c4c6cf82edb9feac7373d3e21dbdda87bcdb550bcccccccc5f4fcf694358d6b9e2e6815c3a7c74fdf53baebffe7a181fc5eb8be15edf0cf712c29fe85e7f5defcf2fd7d7336c3f43261ca1c9734c8f7eee15843c99f6cabb1585104208e19d2d486a93a9656ab5e437165dd0340ebf20210956aeba45a9b5d0141be5a37e39ebe5438b5fe4efd0e44a6c8939414358eef6fd28a68218dc9307b8f2257771a50b8f100cf070819671722590203b1ef520c90250a05e27a49ec13a64ddda09b627dcb81929e093e04bec347c6d643e0f872608218470c3a16f3c42067672080b9fc70fc8fd8073fe70ee070ff7e6633db001a184a8b42dd73535858a46020050000315000020100a86032291603c2689b2a03b14000e788846764e9d0be45192c3288a420801638c2186102003040332a351100086c98a52ad7590d61740d101ab93e124865426838aa47e156ac470a030dc7af9e68c612ba9c5e9ed7ba8101d24be14235d3199ad4d825fb395ecca0aae9c9f214f8f020a8ad0ae8519aa3b2b165527c987de57a815fda3dd844cbf56267811d499197889ce63a002cb2655e53e5037030d59d22933e70e049c804c27b5fe295c39134054e6aee86a9e9b6d06d0703a87088f96b2f1c4bdc7eddb3dbac0184708683fb329060b110f0859bd6ca42032f56df06d41d5e6592430f4bbc940150145e24d4c18ef9803aa487026fc49d9364cf0b4e377127b5536fa49d83dbff450df23df07b7aa3087557bfd522e7bc07fbc0218f15dcf441bfbff464daf2bd8eea76d23c97fdfb90180573970848217ce32f3cda0486d9903f2d4331eb7742c768ad9318bc978ef11645794fbc8a6df23db8c894b56dc9967b9480895b44a2c8a66cccac67f748487a5b4d3221339ff33906c33e817f8a48190e0fa7f1a265fd7287a9ecd05a8511106aea2ad847687f73c8de62673a4f37a4a54be923b786d32eef49091b9754b2e83d515c6ed612575b3f49bc64cf2d44a9e6338e14386b6a139ec4f80dc444518fe08c8a2ef8f4eafc187133675036bc31bafe5785e184b77079b384cefd46c46d21a2a0895e3703c4a6e3b3712dcbfd2c7edc1a4488ab7bbb8a7d35b42d888c58d73e1c78431694a61e8ec9121346273e35c31d7301212ebf4122218c1ce61c86eea21c01124a2d35b42d4a8c98d71c550c30848a8db4b446c84d5c173dda4618849d4c153406444e386778d0383b0eecb29c6506ba172a4bd63058513ba26375230e4f6034fb5eb9f33ba201fcb401f571365b6cd176956b16287be2fd1f8411d9bb129d07d2908d07c9edc0187087ec3ce9b3a1e38c128cf5ceccd3e1839e2f9c622d0748b192e372504c99d518217324a8954cc10271dd395b0fef6917d88a844d419d3a359f554d52e5f605522f43c444562b21f462c8aed6b64a2a790c588c6658839d54068e3d66f33dc61fd5a7c7e08eb702dc31d6ee4436d18a2d64a8c91403d0b72f3c8ec22415925212f7c3b74aa099f13798542a4c093382a284485df541d6867aa2a2bed0bccc72b6ab40225cc071ef36bb21d79e9badfe2161a8a3da9bc48aad2771c14f736612cccef5673447cc5ba074583f788c426ba80964f7f103304c2aea872310cc6fa2ab4b8611ede124f9cee19f4dc5cf1e84d78e51f92388bd15c7958b32a5a894b12faada39ebbbee08a2ca8a0490d1457875aae395fe031bf6bb1123046fd7e2ee6066e7d8c230678df0794c9135b85666596614dd5292e73d8ccfa02a4db633f47580f9bcf122669b29d6d9eff8ea6d7d7b284a8647755d8296fc91cf5360726c38479fda01bc9856cb8d1dcc4e9ef24024341ff33046a219e97c971a3fcf614824c7f7548c3d36ade2e43a8db811b903d2095e9fd826b6496bf848b0e29c2b10548d3ce0221a6f6100c40a14c20f6ec9bde602a35247d9d00f2f9c7587754714e9c82f01049866350d1fde6d28353eb843340255a8dc9cc1d7ae933bb66a743e0b1978df9ac3ed71115e18de894e09448e0fe91b49931511f8f894ebc19a61a750744019a1206a8cc27928706c7e56662d6ba3e1ef65f163e5ba0fda7c4e6c2811dceaeb653de1b612db97ce8452dca1d38f2555b2c14162e5bee8d283d93658da3479b42eb7a59ce4c6759c94de8ea508ddc0f1775efff53135a94e7d36e4f883c09050fd4fb58839450d9e74a8259e20a157f6d7f88d1afa956fd7a0611563bbfb040f541ca65e5bf7b8520df72dc3e5ce6cda85a30a01934d68008549cd6d8c9590fe425ab4747c0285380b23ec8b75552d2ecfc7c531501259c86304812ac778b7de70d1a25d2eeeb07c6dadf35f87f8fe46b7714959c30a85b34f9aaf55ca672c296133ed7e83443d243b76a6d65203b7dae3350380735425cbc7767dbc30cdd65edf6fa4ceda1d2d3e8304a65ac09ef73353d0b4dd87b591bc9fad9ed0ea25ab71f200dd6283395d4a955832a340730687edabc9f6baac6721fdde17f22e5cd40396eaa6d0f80221d8c49871fd379243c6a11e6bcaa833f369c6f282d42dcd71101e0a08befc11218385c4a60396c3a643499b4bfc3d7d8b56e87544b73a1d9925c17862f852176563a027aefaa13017b906a936a4793f25a8c2e135d6f918ce003048e63642e2ad7fb325d634582c27ff12cdbd10d7f2e81af15c3ad65c4e92ae701048c832ec2f54e94e36aeaf3add007f188381ff9a3abb29882b1a6b0d9372fa566892dd6a85d0d27a17e7cc0b0cb1546125812a82b31d1c60368d58a66080c57affa674d9fc7920923868e1dae6940f9bfefd2776ba64a7cbbeb22a5582feada52dd7f79af28f1c9d85a6b235a9d7b1b62eea25df7d70bd63d3266563b90a5032093570bc87fffb3f10fe12f43a6d8bbef4e8c39b64ad854128445b1439a29ee8b088be8929624e8865c309edb706de0460b5de32a2621c632bda4b9fba2c1b2872bd4db8b330602ebe539f7e0294fd30a6a7f02b1dd6eec77f6dfba35d1f2db869f0bb8204441dff59a2ab68f6e9fe9791bef1af128f09c48c04d505a93c95881e455ec577acdc92a044ffc777a6112c726a83226b3e7ff94775d6a8cab983ba6105c4ab8f8ccf7b7efd566de330b2f4aaa12116f6b727920baa9c22a29fe0c10c2794b7a0e004692fc1269eb6206fd8f720069b4fb97e1db8a58664fff13f5a212410b72479fc72ec0927c69627deb5f943b34bef718d8877ad3381abb491b638fba1cb5eeb38d2a69d06f3d1fc1ffd2823f1dfde39d898c20699f5bccf07a41a807b159368d7e9431bf6cda516db7069a7e9d41662760dd226d695c0b695200bca0ad931215e43382bbfe2c896278a014481bfd7ce410cbae8d51220c33dbfcd187a948761f2a3c96a91cead0b17ad5576d8d15dfe3b4be82d61838ece372d127309cf742896cfa84d684bb020f15de50abb3e55621bc2002d0d593d88b1cd2a5e416e9ff0ce34faca564e300732c16b9d4774d35226c7ce40fa45e0b5cd419613a4f97f972e994bc7717d15eef4acd9979267c274a430ee0a02e98b18e6becc2536cf617a442b74d877664e4f06d838edcf5ce9039e45c15043fb7105cba6494dcc889a9601b11977b20b40dd20acbe2a4d820f4ebb7093742d24a5b612230029f4be81d35d7619bc584590b2e44b85cf253b529436cd8d6746d5a612035dcc5c3c3bd43a5086690490b8b569969fd6e3a209f78dfdf6a3f2bb3862606a5e651263bc97c0f143450ce91bee8b09a083c2f92921963d776356eeecc22930a926bbfbdaef581b70a7e7d9ac2dcd12d88df4b7ff48afdc7a0488f280bd94ed965bc797f612a30eb19149d9a11f00590c1496b6a70339ee29b04c9431412431914c2abb0c962f7589930099431ca2b024e6e0c15bf0c916178f107dd2643e4af5695ec94fc027e5f930512e61a4a7341e7aca4a64945508bbe7da3f47ab43147821d1c7bd9eef3f795e57a06147e3b8eb494d06af6b96bade9b57dce80b6fb32e5c89a534b6891e2f7a2fb1db70502df1f8578c576aacdde53f654bb1e9ce6f5145b69e1ef1848da4015cd18ba821eb435825c003d4310982374b43f09aa373862aea26ac035aef2312d4b4f4247460481c68ffe6f41be02b619ba376111f410b4aab47bc2c59379925c2407f5db658acfcb6364e7d2e896125ab9a8e55e11fbd1df91ccff5f0339c4971a54559212a0ca04ff7762f48be97191bca465220f511b127ff65bc7999395a5641523c8272e4826a069bf0ba90b30175a79ccbb2b298f395b7e72a4941cc0293824fb5881b8b3266efdfa8fcd2516f8818c4e00950036eb877a7f4b945649de30758f0a965e227abe25c1b8507d8f0419f9e41318ac1b17dc0bd40966546fdd3622908db3cd04d4ff14ae7cc28493ee26121456b859a1e2666afeaddeedb9bee03c21ff45e6fbf5f51cadf3d40a30a85071e9a340550f40e68bf5e11fbfdba9e95025a873b385000a5832d8070822035b864436e8664862a19a9cb134d404191135d4de595471c4debf11f4e09849a426d1b35426210930b45e99a411bec73fbad19420092b3d474d355c321ebb272a2e085e396c30afa78a1d512aab65ea3e08c4ae15ef0009f4212c0cce4efe977da0056ac3be0c7430b099d8a708f2015500a65c9e47c2d070986b1f422b3009e551bb8fa315dd0b4a797541e12e017b9a5066a4c419734bcdfcdb3e464ef97500535ea2ea69eb8bcc3ce7048dc1f8304bab049271d9e4216ced0d64204860ecdc1ccc79761c78cc3a2eef55091e016ea035c97fc251da9c294b82ce3c8a9e52bb38279a187eebeb5c1ddb8b3404cd1757c570abdb6548d1332881af652b0777d85ad6f11c0387509cad6ea03f24d657c7eeb844c2966adfc1408c8af952f408418edfb8789c96b4568412dafd62cfcd81df661195170f59918ce12323fe2fed0824e6a833a869c367a307341b3823c8ce230306aeddf8ef9bb3eb5673798b707af8c8e06e195c0fd40c638e2b580e7487b680418a06e423a699d61c1b158d7e786c86d03ee3d275ca9558878a98cd6e21eee309dc154a603d097928a79f7ac980a5ddc9b1da676dd6e3f1bd17e5a286434592f9f864a75ab261bfeb84611608192c9badfcc43616429dbcd45281b5f1cc889da7004589ed7bc6398e1cc43b3456f0ecc26a79529abfac02052dba3b2b791bec356840131378008622aaae594bc253156a975853ead7901236321ab6371187f5ac1c6f57746d53c2ee483c499486a1d2a5628f563307aad8b4c0e28681c0f81106f6737cdbe259394e8301886147e998eb7ff0e733ae3310f3628ed81712c6436e9e48bad735af8bf4c9e2d2cd30ee49bd64f5812f501b7f33a2a547b23989501bfdf78e677d5c1ea0d79b3a175536baef9957aa352e930e0bb220aa7eb482ec70b6b668000f34fd733600a6c8eb46153c8b915ceddc6d22866de7e3edc15b5c87386ef820ece1d6ed6a808fb6e047c04cc86d2b850c445be16cb9dd8fef7d34d0fe506db688b058dc22f681406bcd5babe0e1cdbdc48ee40059e78c33b6f54e18c91df1dec5e674018647233d5d779cfe8e3155fbb07720520d82d0143e22575412d872504812118761a233bb5fbb777c9e016342bd81a76a04b08c00220442c7baafadf68dd02346989eb87d591118e312290b6ab364014e3d38d61ae087ed7a95cc3237c5c87ae755f6cf1a4b978095a61b16dc928d5ad7c1ef9532811106a6977a3c1a8e5013b99386fd0a6e2324c65e5480ccf2467016edf2314df6ce545356ff662c8582555ff1b16a1404ef1204ffb99428e52c3f49d55ea6e13584094c3b7bdf604fb279cba0cff41df044ae0b0ec217bb72d7c65385eae96c2c9a4781d86cfdb197595770ede227aee4be50839ea8ae9b2bc61870f866135c0cc0d98a8d823f154ea2492fead74c32b91192562959f4ad47d2e5f17dba75ef41c2d7891b3c7adf7dcc1b20174ed74c129b6d0587c591a436db0a0a9b2349ecb61114867392ed6c133c2ca724dbda2e48180e49b6b14df00c219f5bf87da5ca504096f2fdd41aa01bcf10da3e19a1fdf17abc0ae186ff4504c3b52eb5f17c7abc599e25aeb9170500185bad96d926c234620e84634bba03eb318c41ebeda0e5ec77217b8fcfd55ec92fca8eef74d6f743c2390b7c6a793ea48f3d39e91638606d8f32538ff25919be4d0cb2eb07d3285a61b1fe992f085929dc914893a0aaa640abd0add90f76d098a1164cf63960dff8ff5c2cb045cce1d089700a44431c245d96b62e2ec9d8b69e3070fcd6e8ad70787591d5eac121254ec1ae959385bd8e4988a7fcc2980f74a29c1b0b05eff793885b36c9647e3464c9b2b26c9a2e9c8386d772a2035beabb01f333fd4160481f9d6b4528b70c23c0f9c65a5e1e9cc0666540b1d7ed33a1d19b95f9f6ea3ee0f4df4549d9f94c32b6741cb5eccb8ae2408ec57560adcf1131d192da3d0fc12a0ef5fb3f018c7e81f4a9606e47bd38b0da5bcf99df4b4460603231739d0c1c38513a18efa341f75845e38b4750f2b1a05e9c8fc7e2e597f2068ee116b3df57b16916ed1129add1e583d2b78dac4f017a6e69f9855d5cf33bbf6e29ee7584d6a839f9fc900dd0e16692350745c158a5381018b2ef02cb6f029714a4878581bc19de8b93b63064dd38989e9187408b2e58664b950329109428c5a2ee1aa972ed4892f05b590f5605d4a6947752748fbf67f08b0ae8a6afc23cb4ce1f44e8ef012a7fec36bbca5ec02f847d16efb43680875d4154764a5851df27d75d6a24a19efe5f21c4f9af255b826bbacb2b706c4c732b4d5aa55b6da1fb4ad0ccd9b7078b0524b427a43d1d10e881fdfbf8163f428501055305255aebd32873a7849bb8e52a68e4f0226e3dcd3c2b616720c2717d86d873090d44624a0168fda4c014ae83df811195bb1939d99ab3ab5541416f60eff5f84142f38312b23d6849eda542abd48565e90aaf8bfbb2723459d41c3c13635b15d006b85834bfc88d81c30286f038ac8ea734b82ad5c1a2d528d88b307999de771be5030107bfc6eaa3df4f65dea1d9d1d30ae11a903d983f49919f6e2c895bd0d11bd909345dd801c8a04f61a06dec0c4f9ca61b5eed455c2092d985ffeb02a5bcd03c896931ea4491335b37d661d7fb43dadc0b48de9a53aceeb83a4414041a1affdba914d46c7dd2b096f9d1a9be76b67d0424422627c2cec28c0e53c29a8791d0461a32d4be2b8a2d3750b501e1c03e3b30649a9e7330f8399d2182e84371b9ba87548c8688904f5cc0d35e40f5c4e8e19610e0230184db2af45b4bd7c9b4ace4cc6e046e65b15556397086e4a954dd40a29e168218ff896f81bd93fe732d1646e67a5d9b81c2992075cd534578eebbcc3918dfb172e77e9b2b1c33fb1dd99458fd912ec4390cef662b2feed8e0753c62f9e29ee5d8347d967bac50957b994eb49383e9034fd8d4f6b0da4a8e6e53fc42a83e91443640936e58eca35d29fdd9f6a4e78cf10380a765a2403d8d841d3d55002a7b55a45b930360c933149227096b3ac7c42f52dd11cacb286642745433b75668c7e7cc28230922ca27c939e4881bf39d8feab1347d8a06377911a9fd74a99adaed3f116ab56b5bb99255769336f9bd9428b6b650d97a04e63b831d92fb299223933f2d07e0c23e1c7c4522c34489f4f2f603bb6eaa7665c4de1f2221c03a86e30663275ae60f20bc3c06d9b1c369b13585e0940d53694f903730f3d3679bd821735a0471faeadf6fc7803561a9f3dbc012ab494c2f8c56cea0faff16b6fb5722698480da8d2006cbd630324172d05c333e1872bd6d77012d6e568db6fa7a977a7abdf4f253204c7da9a9e43cb0d2c14b37d2aee79a85c1e10305757a804b6f6e4a60b7c909030acf7b522b9dc09d1f08d739e141eb68c88d5d3f85d16176dd06b6e011d50ddd1a0e88766352c3526ade19592f249b5195d16a018da5b11ae71eb49664d6aeba92b201ee603bb8310be2aa7a5946c1803c540c64b8d24637ea851d9a32b0f786c0c89ac504eeab1d5b18f61b30f1abf5ebf98d13b32be939bc7b2b53e26b4ded8e4b764c375537b376b0ebefd9801cebe10e272126c0707a92453e65ec7b3d7bc1954fcb19e81e47b3635ca54d7291873d93c0364c840cd5900589efa1aa76cbb50bf73581f7cc8e8985d426d264af5a8cc98b1905ffd93588c51ca60f3d90992f3439aafad074ef575f512426790ff65ee053704744ec1510b58514e686c5fda458853cdadd3a9a7046b250607e5b11291e789b1415a0d9064cebd2182fbb17e12edad582b7ee157573baea0a608e7112aa2bbbad7f80938541e8a202570bdb6ad130d571ae0dc6aa5dbc2dea1a963cf133ef6eda617febba9f89ac19dedc16deb0bb96f511fca7a451e17bf7c4c3cd1c27c8469527881c8dcf0570889dda247375bd35cb29da4df8193205cdf0d33c8264a2284f4a534670f5196a25fe19ed304e4bea3763c9d26e60477001e739b5558455ed7172984f62f7714ef06861929f64fd257b2bb1e8f83199311d4dba936256e4b0054786b9e57af92f06a3778514b0fadc6ba2ceda26c80a5e67a0c7e0da2bdf5a8fd1a7b5eda312eb777697ebc33a381fa69862c1342386078b4e35e8a7ffcdce6aea3f58ef08008029a60a0e4a1ce7ae9fab255eaacba3dfc8afa2345649f4861a2aa4f22934bc9f37e3295e650bf5aff9057345d3e53fa3122825f67332648ef4388195813912f68e02fcf7e0d3c15376c817a8b742539fbc7dc518145a4c71b842b38c6f924c364b3b9add2a885b905a9bbad3133b1136607c37013cb742abf1c95d697b39c2d05be243976df232a810f7afa4661c369dc699e2a3cf8e3e7be4346a90f5fec93fdcd747b5878b14b2067d5af989e033c6d694a626fe9b7c93900fac67837744ade206e7eeb99b3c402d3792b669ee1763d0cd438d34341463fd04813a32bec9309d0d0de1361f67aa8006de2b9dc0610ef8bad1ad18e457418d3d821ee2e4f1729a49dc2605a85461a79bc681d5941200541a86e51d98ce95275ab6861fe932a85a9057a7371d2137456efbe1503e1122e722f7c34255ab9c667e49314ec3801d281301c82fa225417c4edbb9b8988b8dde0d6ece7545764d18e16ea898fdbea77775f63701524856842f8a28b19b0daea5df5993ffe6e750248af1e6027ced7c2e64ae2355effe62c9c84535baa90780c13d91a4562f03f3daadb1b781f0e30d8da5e0c44950c321bb9ab70becde82e3d1cfe64d1969bc02966bae80afc30300f1d9afee04f850015fe3015088640866411ba6714493b3f637dd6636d6856043f2a365ef654ff002848dda37e45d2a895005f4d23deb509d4ccf868e1ebde73435c89c060e48dc3d1c1eeaac5db455ec38d1d4cd2128745d2bae68adcee8ab221eebcc8fe4e858eca4d6521dbf9bf1dbee7cd0783443fb1af8e027f115790d38a23c7f3425f79beb1a4eb7e75090caa879d37001e4cc5348b08d4abb21fd30eea30bcea6d12aee54d6b835f5088d76ca64f97e2c1861fe159f3f0eeec0b7c0a5eb18774e23ae1ca3a354f74939fc3b10203f2bf9945a460c96e3442021fe03a9613d72698755df7ba8e86b8437de899e5391f098fbf06321d6b9ba7cf605976938f8e0d955de6abc137e837cc713c324e384b843b7c247bebafccd0059042a3d8766a0b5f0840cda63b2dece7eb260ab246589789916ab259546b04250ee54050bbb6a014bb5a5c3b9278b6c693fd8dafe064f43f4eb89fb8adf36bb4ec6ccf689dee315f423e8b528a30ced6b3bb35827941010013a4a750d60726e2721eda70492dd3f694a1c43b4aafc434328cb1abcba0d7ae3945727e96c976adbb0204b8c565b800b3dc8e7fd91738ce88b38830b7fb728426976e335426f07894593245ac8b72619e5e9d9329225217f32147d307012266916eaa61907bd219cd16d366bb690d625bd67a12c2a574715b2c716786fd2528d7b6ff009c410b713048300c48e31e93aae908e16e938aeabeaadefb38ce216450f844bcc4f3f70da3d077c6e3f831814de3014494983038800639dd6c060b45664f343ac673160d043b2f1bb23d605b0f051340507e71e4cef4e218c4fdf1aff3a4b51aa64e6ff30c612bfff2cf02a8faa82b58812ff48469787a3fa3bf1744289f325954190e33a16fbdcf3c69c4681a5b1ac2fe32c064923c561bb80c1687c82528992ba94e200c4e8dd99a32d4f2ac3660fd619c506731eace307b8e3d14bdec14a2dc869dfb7cf02b6452316b3ecd26e2cb06f961d378c5ca12f9dd13677a0d1b46b24f508f02b67f9082b948a848f2da0d6804c6e8a28a31742229d774bba89c3c092eec95f121f5c4cd7749587d37ade9658ff94cc5270ca0455fd5758e924a8e0f5779c10a86ff6ad955812569e319a323c9b532d00a0d853cec4f59d7ad436555e82838aa7b2d5d89fc5842980417d08fcb533aa708865072c9f0e4395927ac1b51c5039dd051b7c4057f4c2e2a14491e4ccb4b2d920d3f7545ce8913f26546bdcbcecb827d1b0a36d7993f3f86f1b7ee628e008e95017deacd64c51519bdd1184a01431a008381b4beb900833e269dce59bc754206db69136c4b4dec9a94deb568b57a803b91cd017860d3e5b23188674f5453f16a15058b9a325092c9b4ec73f284973d451a785d1c545920f0d01d8d162c8af0a7522b1708763471f435fe442cfd0c39bbb27245e23c6310604bd0631fa29e95c0e39a5f439d9941678811385cc3aa8640926172aad3aa2aab81c12fbc2a8d7f1dd0b55144e10652cb583dfde1a55a31d20c8696b6127eca11d3d3de39f8648dd648fba62b4199a97f7fe2012d75201e0fbe1f38aba4e0f4c0575c9f8a4c4c24d7bed166d0f5a7a4764321510717912677fa66a2d0defc5855415dd4226078d55cd7b5033ef5218aea57ece2db65ffe27e3669e3bddb637d4cfee3cbd2914cb76ad0c5899c9ee1c9914cae6a60db707984f42dcd502a60f1c38d0bab076618cd08a5790085835f78d4e0982bc609977bef4f0c48d392fc2c975486197d96f540301d4cde45c170d691dfed5156b40b2c976e577afa1dffb00dd2ca1f5351a9e46bca558c6eaa0f3011ab325f820bcbfb78ec8f0858f6e0320fa2341d27269f3b3ba062fd8311d36bc792e3912f813d53897e22ea5b5a02ac37075f678007e7af2294167153614b116484550b826ccf663214f3c0e2190016c80bae11991a432cb393f7f6ece7f10b657c31a8a8c6db600785dd467554f0ce7f35ed33839a0018f5670ff400fa8ddbcdce55f91c8bc8f9217e8840faf9065f6529dc214c0637d4a5295f9ca6c2f62b5968e2c37d52c8b5d3aceb8ae3c85c7507b0a5ed7bde7967cc629ad437a884e6a3d8a4208d211a1ca48f8ace5fc3cee39342a25fead3174403c548aba9a45ce2392e12d27ce930e0bc8a83568eab69edf043ac7e26c489d834da3400b63079c56a13f71e08449842102f3d48cd8d926ef33c96e33c29d71ec2e483e2bc6ce74487360a2a2bbfcb9bef0234bdc5d4247900e9b54f6c66d2b5313bcf555136c3fe9c151b541d2f3c56963fe5bfbe413554e32491fba5658923de875677e1a69540cda2119e8ca5481cb073a551e73fa60923e1cff071cfabcd16ed8c6b7ae83b889a3b079a38ff4542f90a1888c7613c5bfccbee71c6552ffae8c338f1341ec204fa70050765a1fb7ac92a51ea5a42c7ae0097bea5047a94bd471ea6384515ceabcee6502d06e399af7d963adf942679a798e5e20149e417d3833a72a6de6d782e109f5218676cdf13ee9ed9ab46c2e83fa13e861a946e9b3545372b4705b3673d71352e9b301e98b0f7efd9daa0b4e7b2ca324824f6c2eb4c610b796b957ce06422a0cafd357f1e033c402d7dcee5b226348cae0ee765848087c1efaaaa6c542de8cc4796c05b49c65d0b731c16cbf4e456c0f674712f1b48f7318d52847247267fb3cfc8c5219a6736d1ffa4a1d9c0356dc059f2526be31ab2895428c51a58437142930738810bf9e8ab81c71f9d018da3310d652e53c4bcad9498d5bd4f705699039e4f288c154c823b20a0fd29c6a92150e604127e616103f197896f79d7856e96209bda79740b7fb6c47715c857135a443fc6ce195d76c3f7953d88076b1077d1c267b989df22b69c6868096e7392e4c392211092f0539811462570143633e51d3415a3ecf2a94f6ff746b8d9cfa06ad3326350861ccabc009471a8bd13019a3e3c216dada0cef4a22e1f7cb919ab0c7ccd1e7d5558e0256eca5459825f532962459bd75789e10c8edcf0b2f8b0b67c82b4c302c6370c3a1161691660209c5349b11c5df13c56aac22a6477a7fef42066a79ed56e55097b9adf1f055458f57c32c1b1f3a355a3f52f6426c9a6eb4706065d573270542954e5d335ef946e411c8b6e6ed3a641986c9ea37826be159beee181c843adc0583460acfb76c630e813d5290a1ed35bccb14e578fc6d078b54e22386669b280532d02a87a000453ccf50ebd2dac608632487a72825e41326143e94f0dcb37863426d258f137f05b17f9a0f7a0ae96b6b420b7ae20444d4c54a2b424d9932386702aaded5de2bba5969d50f6724f35c6359f214067ac4fe339a0f4cb8ab974b086a84b0bb45a050b9f95ea834d055abd576bec6d3d9b02846c129b84c9f9a1191c6a5d0364a64b3845d67fdd485f1dc1f7c10931689d667fdb245d3689d02bd01c537fdb300d926b1504b6d0ee126917c0f16cd7bea5d9d2c3809ec470b091c1fa669644222d1901a87a7cb327b80def462cfdc2894dfb6658a88e952cb81cac8d62ef26bb881af118c8626cd08b2125e3c758ee5c87e308b1321b1288cdaae075b0529c1b7e721780de9af2992e144e2ddb604afe8618a643d1e436295c2c2e0873e81fc282999b56220c978096b1b33d96043b9fd7a134c131de9e7aff8c88fc91099fb89cfdc52448c7ae9d0ff97375c068911c9962d368e9c145e73d10ed49bdb2f0ac3a3dfe57b9d0602fa551ad43b15b47a53e2f4d1546d5e70ea6a8f9be0498df6a86f1548f68b396a50accc553fd75a526e672c6203b10c73b747f0f7ace03ab0bc4610604024a20b1cf702e2f00e5526f55dcb374716fedad70f171eb280768ab2fab0b9dc39861da170084651f29cbf0e3df3c0aa50279947b34c1b00e9123496b1ac7b12fd9f773b717f8025aa65b6238ce07331611cb5f13fa44875699b8f7838f736651db0ce950197e813ea8233b3f14f185c47257f0593e1abc0a353f18776f3a1019c5592749eb6b5bfb58b46da6d280ce140c7cdeff81e4bb532939e85a629d22e74d6509ac4873d242673cda20272ddab3b11750027a9c268e5213149d84508c70afe5c2ff4e523dd916228327feaf6c01709382a3e74d016a51f1a7f7e849022242df29bb6321bcbaf1199c659d55a71c32f9092f960277b34a571ae2aee67645ea566f6251c24c6d7b7582f84c48650157cb04774311a009bef87dfac611944313182e86a9b45e6c0cb3cf7d82298eddab1a369f415da7dc42d9561bc448755dc43edc29f0b005bb05bf6b646c01576e7708750f6465a9a30136448fc75545dd562cd2f3c881c276d8ba43746834d45651e6e859ea9baa42d6b43f07a0d308431e11ed8a0561a39ab11b78d6f5f2ca6a7fde2ca3eb26db0b3935a03677e1ba2a82fa519cca34660f7b0ced7f381d09ba218e6ad6de3474c981b3b2255e9f1a5a68dd630d0655325b55309d7b9a36939108d8330c58f8e386fe9b520337aae30d9e37be3273d9df3c2072dbad73f179a990d5ab586699c802d74dcb4aaec270d1d5eedd276289448c8f719ccb3901a9239f10d83430a33057fac6e2c5f1d138ff5a54b9a9a6b7f3c64253234b242c4674753e47610b23e551e83a48493fd61a4a0df8c5eb1c21e595494b0f2c01bd839701ba631174bff374f8e107ed0490ffc8b27a674a65a77ac66bb828469d376e582a7836e79fbb9dc7aa1b2465b3c40d7cb82730f39266fceba6de48148139a43ac5888845171fa5a557426e43584c3c7b9a2b5c6baf06e7223cbea0042f633871462315d052e7ca7c52782c492fc7075ea6cf0fa9d0d2f58b8fbffb554be871e2c0663ed873df6cb105ca78e0a0f2e28fccbe7abb7214cd8b3f2990bbfff7e534014d11bb1c84192038b872b94c310eb95a2893a175b599aec252fbbcb8ebdb7324b19f06139f00c39cd8dd5a19bd92912e2224c72ec981a549886240b38b3b32015c3b40bb3e8f3bc6b30297b11dd8bc0c010bcc85771bbf22d8f69cdadf9be79d014261ed59148fb78a0ff05e64f7b0981ea9e93cd154af2105cc1f7efad6ffd9a80842ef464d3b7489b994629edc34e3b92f2d46cf14968dc7371261c75e2fd29fee804f430ae85a14f51621d949ddc2052e8ac32c6c4b606527aa2ca7906d14892752da6f8a94db2d305b396393c722ddf178f58ac851d2bbd272f464c4e2b6765e0af282f3947a20691239b314f5a750de59a52439d8b83d314c52b42bbd84760212f9e38488764a1f4385182242abde44f6ab5f041c0a6f59f62c2cd5efa37816332f4ec4d707e63d9a0c184bf358b61d3b17312b299602463ebca45de9ca2a1e5c91d84b595e1142c627b530fb0bd67570665402c41cd36ef9d3a4ec01b9fedc23db678c33c4dc24a22082756510c2f40a59495c42716c2dd15c1ce35f8579fe0785d70a1e4c0392470c73a5ca8b50a58554b0ca131ae0e39362cfe0c047ad06167cfa5aae6de065d7ca2829e4cae39035a2498068c256fe5a55f2bcd40c6a217e8fa8095ce7195d585385af557e0c75572f43ccd81cf6cf1574f1570b990a808bc533fa78a179f21628ebf68f6ac0d7ed911e39d037a26397cf9b9fa360cc10c3eca748bdfbc0839575bed0a746233f1578b38b99e365f2ee3028a14778b27e96f196835995749163fa37937913a4f004bb3f7ea06fdcd599c89e1f3d6e71a9816312a99e6e2e815a61008344f1600af942fc7c06605be2bf3d29530371ae46b2c7545a01bdb4723c6a037212148059a14226256145a80b62e4eaa01d6e9617353e170629a15ed44d33de3fcc2820ee289052887707544729287d780503b56899458b05c6fcae5304e757a20d78d150c9a041b16bcf05729117c70cbd2644a75af2b7874ba8b73bfa2534805f33a2af1300abd634d46a0e2c85402bff089f4cbf3ab14b5c092297217968ee6514e3f1edca20462db4ce22dcc98c76d4164312920e8d6c4b97a6176bb8c874cd88156ee098bef5a63346ed384c7e5d96b1d28b6a7dde8bbc4e10799c20cc55aa510654e4c0147920fc86430f4ac4e16c7292b77366380ea67b1e56e58f2dccbc54d9147904a4fb173a22142b6429089426a6b1e0ee3b182e15821fd3ee7e6b6d89d57fa7c75cdec8fced6e2950c1a48ff737a6231ec685792c882415164e12506336678c4351e05929483483f13a5c0180baaa460f4e6f60e044f9f46861a1a7615b04cc5bf0cb3507342b61364ae538766f42e47e6a8e9ead65a5966a808cb6b5cf5ec1853aacc4240018ed7a3cf6b6ea056874f1f6a0d655d52c703e6fa27be61f3b38383567cea03533d857d695c8e986af2d8f392946a978c8165d6d6914e78bd64f9698ca9935bef30c1dfca938ace49c5f53360ad2dceba1a7b13f1b1cd2ef63a7a52712f3baa3efc3bd21db6b0622d667d2c7067d3cb824569032436dfc90031a094f621807d4f6881280d28122c62746c0b4e81b5a796af88d177295ca83edaf0fc4e19b939b83febe694f31840b97a508161bd36c6f74d64f9fd55bdee4270fc5bdc16de3816e2cccd5a148e2e065ad72a096242ab8b9809924e0fc1489a53a13bd35c833369e1da8cc408f3ecd65b4b7903726f5215326d32650d688788f33b5e5c9a2c1a89e2fd11d751b2e3d5a0300eac5bc696e0d31864d88bc045197731792357188c6b130ccb02f1f934221c116b68e0c39106eecc89d9312c91b051adaa6278311abf9a0f23899cf3639d088c6d2beff4d414b3042f630b03baff9d227a80692a83b1338760965470f51d8dd558df76d856535791d711a82a7ebb260312fc096cb7b15d557b34806b269f7cf86486f261039898a777362f0a3fa66a0d1bfec254254e508a0e18fc2200511b92aae5629dfd4cb4cce5828ab0140f739d02de4208ed07aada48164c7d2039ac7e1e2a161e39a1d0038a151efd79f99160b6c2f963d2c2d0c7dc095af6dad3e2482491a944d7f70c37ac14eff19d2ca41c348d8e92f668af536a4cf7bacead5b76175d92f4b507c88fde40d2bde3735a24ab0c04aea020f224c404be780834945ca577e1575d1baa86865306581df4e5d090bce7f6a62e1516a6ae8cd44c2ccb1dbc168011b2a7fc923dbe98fd1aedfd4f67e3b5e1e8f16215b087ae91a67023546a488fa0da401a5b681cdc0f9334f43a2317162cafa9ae20272a261ed6a8dbc3066c812bcd7b825a4359cb1672cb5820153a99eb1647faf2429b850c210141feaeb84695b9515495fa32cfb09c805cd0640eeb4144ea3f802208cb4f56041accdb4cee41cbdf7eb77533332d52d3a454e4f7cdd0b954c8f53ad66d34d9d9686573c17f3f21d8cba79b68ad530351f130c5ff3490de7d96495db9383747810e74feb3f513e04d421be1327f32830b7244c7f143e8bec0285b652fd2c15c0e594f5ec3f50855170663879ea7be890647d79439734dd4358e0c811e5f7c8527bffc6212b3e6f694493d973592c005752484e1fccc0a115645e7eb17e9978fbc948878589c6c8284254d219405b80d7ab12d28782e0ffa6885146504ec3a36c1f2d08b5c2702705d85adc9708a8e59397c62d118c9bca08b920047505c47d6af5cf3c88d7ee09e098401196d4268da785cd8d4bd1e216dd2cc9f142cf42c3ee5cb42552f75d71c3e7ab30fa73dd6299630447e9f047e9b8a0cbb157f82ff28f76524543070eb2f53720642f4e0efc41e319fd813e3887d2366c48475f54d300ae63c2d1baa8c6f82d4e47ae2c192b9837a4cff191fb7e83fa3116621275b0732a390ecadcb2e8295faf343f326aef6e974d6654386ab4c613d55e5b8fdef2c3240fecb216d03c0297ae5ef4202c81eacd458b576124d44f18ef57fcb05f5af3b8973b832bbf7e0b45fa4fbbe311895c9acaf61225c615719f6445c59aff35bff4684e1ac69884c15a987c3809871c2da04b2b9e380aa357687208c5902c1f7c8a5baf6ed69fb5b044c82afbca3a7db8a1189ac501cc64cfc08f9f4936aae81af4e70d9f0105373d57ad1581308dab505b29bceea8a1168636dc606a690e3cb54e8770819ed489ece9e8419c088723e054397f08b96dbbacee468844bf436dfc3dd734130abb39611fcb136ed2b8368409f66aaa4b4d3f5f0ce1cbe5b19fbc6c9f2231ceaade6c76bb7f64347892225597e9c2fcd1484e54115e775fe43b3f4fb635aff1964f9398967e97c4240f0653c84385856ef852a2fb9d40a106731a908c5ffa6b1ad4e113852c9fe09f1827a4b4b62dc5a222b91b05a2653c8c2539f07df3180e61f8ffa515d473778058afafd39c3406566b81bc2e648fa9a28014b7a09cb7107b5acae83eff2874e0118e1c2b00768268146ce7ebb7b79ac2032eb70a2469a5f68207a5d06a7af8ee5e5d0380eea4b81e7b29a8dc0a9b13800d9c53d0e911ee8f5ab038bc87f74c696a08058382829149844735677002c945d0f7c5994d091969f40c1979f217a315eb46153c2423acb8418fac0c10123b8e2a771402525451b1daac2984ad83c0d20e859c9cf22bc8d009321fb3ac2912fb95939f9d7e2db376b3f567cebe0fd1581e4f61e3f4414d14fc08c53604ed44ebecad10d8fc773e5f9be86dda09df7a709d80eda5ed90ce5dd08fc90ec218077c39188fede931cfe628f1ad4ae2ec8688a18c5641f8a924cc824cc73fd7b994d28117e056d94830298b24d350a1f8608355df163331a4b339745922d358412d321be1774920594515e2f44614826d7a01d4ef5976d0d3f141a66c533fe185c3b662828a2eb5707314c444f809928a4f4767c1a2140afe5dacbe6190d86e7ede005723cddb0535f165a880c15cc4b3c5c9083e6274044356a59a7959a879acbff86b03747fa4566a4f0f6d319cbe60f355b51e683b4676592cca0fb1dfff3b1530991af334f028d11880cfcca445d29f3154e43a4e287222758cb3bce55160f56fcdd8e9291c3d9a8c3a13824e7807431dba8af74fcf4d26dcd507fb63abfdae8476564fdd2f8c4021de22c63460c736a0b4fed2a5d4e8563b28bbdb1670edaa5a3d05258c8f4ce2ce5a17d9ee58631c28c891bc4a973738e107b9a0120cd94c41aeb30535f168791cec0488cc3a120db779ac1eee293a10581bc45146196bd6693bd0526b1c91a2e58da0607e320b5885d4793710f39e1fae8e5dba61b7b26148fef355f2021492eae56e494f526c10b2d87eff59fdac5e13f4e1b500ce94170903ab2e1124721cf20d1cc508835f552d4f3eb13a623282cd35f427ccd9d5640413b8238913fcb85f285b37f624683e9474dad01e75b7a5d5db2f04c41c8eddb96c11a2ea377593304160458e65da77ab80a3cc24dbe6a036ec36ef4ce291dc28872c0d61ebf59bb0ebb10fb7670d7b22a4b4de60dadd2821adb233c3b0ce1bc414d5c4e028b6f950f32ed0640dc269c6a2cc16c4c7e6a1d65cbaf963301c91849b0d647064c1c51eaa8c07191e897ac693f37e86776b8bcf2989cb5758c7d73c39e9704425fde2fe9eab4c7c6c64c89c26b935d1b443587c60203e57e00f59bf18164e195e326b1fd262a765f8601f40e573d05d7efeb208346ab649f6c7838b5315788ffb6a5ff85026c96bc54296d1215c7d63122f8da9b17e1b0da92f4a30cd60c1b71cce694ca2d755f1e0769b7fa93b635c1756122ce293bc588c42c10987b3e4ffce6a56c5cf33f024eb51394b952a2f63dde516677e6fead4efecdf732b2f2618744b9d17f9f11daa7653c344aa515315f3090901a5337ad5fd84c8d10525f486b18cd22bf17ee57591ef03f5047bd663a0d1f8eda33068d548593ac027e8ae0ac931ea9a2e84814bd689ee75f5b6bd0c648313026391278909abea1403bce29b09ed58ce54b06b68a91d44c7304120722a6ca3c98ece2751f86b8575517dfbe8ae72b1a738bac2dde677184663bb1ceef07ac5aa5aec2c427968ea87a84dab1c3dd31358453a905ca4a145c9c07bdc35d205a0270bd2f18bf5cbbc71dda89a4a58a5324cd21f92cc659a69131a26bb19c29115107b804324d410c947b72f29ef2d212b8d596d39b6ce639e527dede45648bd51a66adaf2ac93dcd5aabe53ed8985513695c32bd5136a22925ad777aa86a96a2c16e44b9504e64eba186e8198aac8ab20c06c7734e2238c11cc7dbd795f901b261a7be8352cd72dbe2a1f77c995fa19113b66bee2d2e098d2a5812cc7ba3d027e91a8a821c5a1c24dae8784cfa9636fe5497d9d460c20e6607702f98f6c4d70a19cc33c8fd5abcfd9732c9994031ee30f16d354fb8964c7d8de58d15369b7c263518ff58321f168b05b679ff053916c757ef39c1df8d4df841694e4eb948afdf2d764756d77f139baeeaa8280b8ce858ee83659cdc1ed4a3dfe5b89c44237bc0e585ec5155cda0959621c84f01b8c1da63b861aab0f25bb465e483d8ee200196451269d45fe494c3f16f2a20d04e8dd52c7545522e1f4d9a20b03c79a9ec798036bb722f4747a387327ae4696fc5298d589fe5047a9ff8a666484ca84614df52934d396635a27202cda90e48f73d4aa8c61d212ad92b845a5487eadbd11d13fea57dcb06a5882b5b6a54f6db5e3170ea438f12d492bcf33c2d2d37069e0ffe83a41f4ad25f6380a33ab039183e22a04c3e43bc98b9e4243b1f22f1a52a5d65d5e7b83fcbeefa8c5d9b66743ee9010220995cdeea9331e7153c155f176b9fbaf54b9bf13678827a8fc605f2a9ad28ed0b592d7c81f14e5a23eb0c87b709d8c8a2780795a2e4a6a6a4c8e706db4b6b60834edd5a4e43423964e8c15ad63c62c984aa1501dea14a2acfdd6b1c08db703325866ec87e999796435e79c3f4f4b78def12c38dc3e2a22e44971feca5a5113ea1156f787d4309032f097210f42055383590910c50a864c2969c3f29b5bd52a28b47263797334455a06c632445a852fb1d80c62f90d3486ca053f9686f15f42942e567f8cf44c695f0da64d9336a3bde59ce0b4ddca8af1a6026cb2dbb032905141282e3720744fc38c4dc8857ad2de8c591a7a9dc855576f49971ce450888b2a6b8a77113ab13358c1c7b3e2443f4e60a6d4160dadb59314973932b11f8e111bab5726a2e0788677a291b1d82e59bb8e63ff8312fa163c55390d156c9b37f8cbbfd7376ae6ce56a703d358f9d42581041b7bf545e5f63cc56d824d3e25e8a2185a303597a7fe2b309447e8f9583d46669d713abdfb304957336dca8174536c08c224e445d9d963e35b069e0b044e430526a9e1527ea0e5437556a7ece458e6178710c79380de0687abf99a0e6f96833a6459e64720838856b39fa6f230445161fd363a9d8e6304c1f68bba87ef132f7ed29274393ca280edc6de0f1345955f036cc41fed0a04fa24161206e743dcb752cd52087a045e713f6235eda7995d9a7bab0a1a0414c642e6772acd7845153243a59b0895425215b45c9cf1a844f2a23f964947583488011559f81e540a5d454d2db0bdb8c48582f57386f009e39833834c24c4048e53289660c066377dbe5cc1391ef1c5e05a41d6651af4968323d3a10b8afb1f8e53885649d7d32196bfe8782647f52d14d837bdad09fc3f51934a84a0564aa4ec2abd52b5d07d286e02212507457b60e51a2c0244ac2bdb42541fe050cdda4cfdca203a6a6bb8c766620a9c1ba9bd7e88e7329e6b9ff8fe6104d1d2f97f2b8148edd6d0797dadf1ace8bbd3ec81151838cee54ab14e9c0a453afc78374b8daf300d7a2b96bf63fc41e00feee6e099d183229fb5646c13273ef30d9dfad2f43450247d66d94e32ec532b176edd265685d27bfd407cfd7cc7a1689bff8fe8f4a75de8609551d27f3882d2138912e476ba091e2d05af8abb55c8f5c2c03dbdeb4da82fd62ed647f0d917a142e5282db624ea5d1477259db2f82b2d48b6cba253592ee3a66229f68e9ce2803655baf83a78bc9d59f005d68e5aea92d5a3401901b723b80c155b8fbdee55861bfb9e9ee15b31290a3faa56bb0e1597c57c633b479fd3bcb415f35cee68de0750ba803f6d7d51acaf18044b55b12dcbd8528f26f381933551106ec2373d6f6d295304a740db7cb345f474b59a1737f0783f84020dd95deae1e724c6acbd34bef7474f8e014ca1deb43e3dd146099b694ffd78524ec8a34c9317e1a6e7970617fbf9b5496cf5e78ccc6e675f3df26d6c91555053bf06a1ad05d8bd6ad02ff61700f4b92939dfe0c34f637e2d1602adcd103a10c2cb6d25c09579342c197ada43053a0f2d8c4316ca0515f6055ce632a88f325c4761d8150788c3bf4757333188740c298f0aeb0cdd995bf70c32d288b8e7402a7226ae6e213bac10d7f42916026676901845a64800f73b31ced7e189d0b3ac66abc21e36e3c99e19eb66b06ba7e320a99ed45fad25b95341fce741093f7c3100700781d90f64bf21de64760678dc957a5d0a86b89e28304746cece8f405ba81b61b98278005a0c9badf50c26c4a9bd1d19913c60da7a4fd4088cc4c74804e42ae20a42cf9bf9afebed3422f5406a69a483af51576405353ffea1247754e614d0a29a243cd2db41f80974dc436e813a1d9bdcf055aea6210041206a802097023bcdbbae0c6d06634f3998bb6d9b6fe08cc106479b2fb8d4a58e30cd9802fe17c54f947379a5e170a1529ddda64aaa3c234948bada990f11ace3fcf8f515205648a462c884af163c677a8b226da3a6d7ee354e5c3228f7710da44a80d162f759c8a4271f943977f37970da23544a0055e05d2e44b486daa7fa59b07203cd8f1e17dcfa96b10bb7043204f6d0b68b8d59a02989dda625c471c26733d7e311b31635243dd2cd8a38b656fd2548d8deb78f5d5b348bfc27eca81158cb44b65a7d43eebaaacb21d8c32060d22a49fb5c75d495a30f282c88f59087f47ac1ebeda1f0a1e522be0341206398ed5cf64bb848a48d72c4a63d5a4d80454732983004845c980cd724335d8b2d526c19f830199954c4d0c677d53494ed021039e8ba0198a5960553581c1b63ccc447ab74aadfd5c24a10dbd8b7e1688e820de8a558a6c95edeb374d62556c6fa5efb884ee39e5ba40098a9626420184940d91078bb2f916e8271f72c894d5a23a31cefb74e0d6464ca83282ac1c76275af9b56fe349999274ab8597052760c1560df2903e6ba018683de2d65cd960713037def9ef01021d19fcd573f57808a38949f464590ebf95bf319cacedcbce47fb12424bc57ca7ddd33d7a465c9c193c0d5b8f9d595401b00a17e8026eb845c8c7bab5bde26863e13037beaf60ac94bc2c53697fbbd7fa8ac82dc07d65f15070f16faa0563e51b31c144fece966d7474d5eec561c8b565d0dd4e496d0469ca94953a5ebc2695491f42c72ccdca6612872771a2d79390c00366e62e8689f49cf85628dc5e7cb004a905b846b38ba1d3f40c4a9130c1fbaf80c8d7295a161103d82c74293ed8d46178615b8e3ed4f006c1b0caed7b55234bcac82948123e6c5b0a76cef2b4e6f89bfda3651208e3f4ac9faa62921fe9b0ac5c15993f1c8c1e24b5eabbfeac2cc1651b1f98ffa1aaa26564d61f4be4aeedea81e9f5385f3d2cee30e639367b3a827948b9704e807d008aac422d925f4b7619747bd0c793492505f243267c008de7194931c74f0e163796129747820730e9c63bbb19195f40e2573d695979968c4cb2541a4e9237f93d2de6aab22653126339c5346324848e0c83273803011fd8c0f1ff302a30eb385939fd0659cde704b5155312eba59b08e059bf0a65437a75cd153bf25664e1fa67f88ac61be1821859baddea5d31aafd8a8046342fe38f75efe157b91fcd194632a754b16764a273ea2a930f3983c453d5dc3990be807f6acb0884b84514bb8cd2cb279bdf0023dd13ba641d7d753d7ddecc04602e99574b427426a97fb9434ad1bf1ea213ff9c9a3fefe199f13add95c8d5dbb51bd5617b7fa9c07439c9003d2cf20dd5ee15397288499b87a468dc6eb7a2658b0a5d1e2644b4b825ab08e496416449a7fc9d8f8b42442839b0aa956e71529700301aff5958acd077b087c7a58594eac27a27df849ee7ba8130daced8311b2ca821b056199dd01279715508bcb96e243213874cf72e3e3a9f595af5e2360c728ee9e0df376d2648c4616f2582174acc91d951c31ffcea253636b18449c2c35c3cce56c5cba8f034384407ee1272b5814802c65670037b11552302d712f12d94da8637d914048c081b9ef4123a4395da07719b1c79e00d9417dadf50d863741c7315dc8d8a31c9d217646d009ef2b7048169932111c65dadeec61f0fc690c26e70d1d208a140f4300abbf2febc19d35af05360a771e9844d60dbf391dbc5949008105ee2fe443a0884b833474da65180cfeeff7ad50363c37916f384809bf8385c84618e0e331d6eb2a61adedd969a73ad0356a7961c6b9574bc88a5734db22213eb6db2a7f1b2b1f64e7e7ccceec503fc2fe405db87a6ec4cb2ecb2975b2bd3b4c5a9ce50081145ed2e2b0a880e29960c750f514a9ae68e7dd8685d7c524e02ef2f4d16c81bfe6a395ba03e286b7e15366db1bbd619db322b0a8e671d6985b512c00fc65def7ed2429f140accdf08cba3c0c837e8a5c354e7e99b2ce532c9d3ac723b470290468274e7f09e66e93bfa1ef17d0604086fe39f3c9bedb99c371fe72e8dee91c37e5246757b2acbcd71edd8fe792e1c43f8a4a7d3838423cc809725602913108a738afe61e13cfe27bea8c5472404cac6c8fa6b95a5c42025733c898993498e324a1c74ac498cd74293c39a1c4b5608e43611de1e9796152703372bacc5a88dc084e96f9fcd1bb87e1e8b10fb1e52169987ad431f111c405b8d61d57a2a4779d986eade81812dea400ec4b4c9a7b6965be8259a8b11679089549f4a3d4c694cda89020846c3a6a24792623eab060a8ab7efc880ac2552ee124d9efc252dac64564e11946920e5c63317d1060ee1b50f7173f4e6b5653cd097542a6a5361960c67add63d5a6f34652eeb1dab642b4c6e71ddd6511263989b97194a1e229c7d9210219bf77389d637559cc4dd071a427d091a9b2cc350413b9988db78d103f0ce553ac89afb10cfc5bb26136106e6db53ec04ab8302493f93605036fe148b7609b4af88d58d1ee2fbcd982af4183a500aebbc814b184987df89e406b614e7bc32a8ebbf4e39340fb9b20ce8a75828d6502747342b99b58022086348a251212a9348c07a79aa4bbb3c454c2e4f5dc51fa73517dfc5f538895c9db8186ff1c24f4f98e947d843283925ee5c7167ea87cf5dc0fb58bacb2914748f4cd385f1279ff224b106a00ab673737d1e69ca7f125f5711e600e98caf7c9f1057df44d55fad9d90fc81d287e779d9b834397ef8dd2882a37e720b864c3042e3e62de911365409b57f3d85b9219474ac736e8315dc55fc74ec83c555e235c01d918b8de8197cb79a9d7a7156ce7b535772fb432e8116ae893155e8a73e628a8d196d42f599fc62d7571f2f23bca3cb7cc170305d42f5b0ac432d8ee63cdc8730e1a0da6e82f0bd74173716a23828069ffee23ba99b3a2a8eea24cb38db1a2b382c9032bda0e28e1441ade704106ec7258b66f9428830eae6c5be71702c2d3593bd8fa590e0e159e6b1bee40f40b9a9d7c18ea598848db22c1b534863d2145b9658e37c6bcb6274a80d407632850dc539a93eef18a5c1517f110330d5155036b1f9f3d89baca20d11fd8e6b26aa1fcde13e1041da0bda871040559f00c2693d4c634c3188a3173ae6c94b748dfb6a0c6fea2ca483b4a0aea6252dcc74865c58c4125f1a27624ae8c90a760002b5c3ef3db75d94079f4d227ee5399e10d8acc531092187aac8d52121d28e655f96d4b4355c933180a8987e7c8cb948bca6934d71ebbe0dae765bccae0758736621c52ca092b918e45451651d22557e770cccb324303fb81d0421a9d78a4ea07c8b5f1a2c0271c0fd54d221cbbd3dc1b0efac601d913cea0281e1f2d13867645ec6322eca2a9e081b3d0dc6850765b9d7c715c64d551c65594d8ee0792ff9e08f9a9c090cebfca2706e743ecf3b88e26cbc283d9f6c77dbdf4822bda1f25eade989aafd721db91bb84de96fe748379ed45437dca8bb03ae3f60b62c3166a9cb7b25ca62b740b5fa44183e5a24fb7891422db1c62a9cac403a65fed67602e511deb0b06eda7113708344e7df8435db0a6722b6722501131e51a144ef3d4b29e79be0e3799111984eef20be5da8c3a08671e7cbb16dd543211398da1a3f7c877eec80b71c3330aa4da1bbeb30b4a9fd8f058262e506c25df2e5eb65712648af65af04d0777424147bf5e2d83dbe785db1f978581d9a50a02a99ee1ac8af4810a224a56d159618ccc18bcff17382e90ce264dae68c7a341938f5393da2a74a634f52b533c3a6e87e9336ebcf9b9b0c154c6b8e04f0fc318eb000d54effb8d70dd59f9ec97f76f0fc6dfaff11950c6945783f7dd1948376f245e7666fca320476471ca6dc8645caccaa07a14491eb4199036ad25e0e2faf5ec5fa1f0915ca2bf3f22ee331792561ccd19f2aaf3b9bf415537ebdc8ed72d7acf9b05c3705346ac34257649d3b239d569be8fe083a2154e5726c33b162b855528846ee19e01e0118461d60ce446595ea9f2982b1c793cd53b9430b2d4a02883713e35006b9f3088135cdda02a216e06e986503d8303dd64ad9cf77e063427fec1e2b721162eb2cd00e6ab031a7b07c1e9169912a26cc2efdc72272a09890e8e09b68e6d3d85941ce8edf257780bf1d91c7d453de03bc58dacfef0c2f228729614c7779f1e90367aaec27cd61b14867233f06f65ecd2e9f5bc10c4a3ffe83d6911d5d9ec65a7e2204e8dbdc5362ecb4b84c8b2cbd66d1193a2f27b4601d386518bc7a97fd0e0b7940c337b192207089fe5b82cd35154b408e8c966d26bf18e245c7f53c2c5db7330b1f70e41bdeba616d09c73ad5246dd0ada2d4494144743762789e729d04b7ab3160cfe410a0ab383ae2367abc2306e58229d4288f884ed8b8556941725eaff33b5aeacb1611c0f67741321db0f1086da2cb18f5081076ac1861c924210b618ac91a897e53e285ac4f4c88a5d52085a62d425647388c516ffe3d18e9a9d6ea0df849afc931e95924de035bb80256c711ebede43786b1c64b98ae18f85d57b0a2cc03b2e6c213029394921489fe292fcea5e7a8c24015456e723cd358ca4535604ab0f7986519a14504c9ee2b647cfe8b816dbc2f6119a02fcb8be92d699756c226cb965ace4e15a49a5fc5401925c1bddab523afe82609242f0ead49cf157b9748afb68ec769d40a2a6f193b737e21a2fc875b18eb809ebd136f076f415d2a8d1ecb24f026409ddecdcd6fbd51f96ff66cf16e42c87b4aa40eb26f672f3af9b485ba501ccbc64c2ee009ea2d787b5c4483af0df950b2645e57e3482287867c0af37cf06ca69b5c4da0c71aef10fd6d82771c4edb388ae5b3514b6f69a708832cadde038b0e26104622da9fad57b36c16055223db8d92132eda392c6363556bbc998b5c7541a54daa49cee764821ca502a2c18bc9b1bd1c73437bc57bf67a9a64b21808c80c69e193d02ee9c209f86820025da19f3ac47421a78fb0b6faa21c3e42dc6cdd8dc0d8188de934269ccca70735c4d0cb447e6d8848f324ee20ee243764261c51bf946f352275f2309f1c0635672d442382deac9732c92a88ad506cda54ca468a7203c048f74ee42aab20c7de69ea1eb7e75d449f5cf9512798d17d3022810966946a6591d8684feef57542616bedc8347249c06fd71fb50a12e57c453d6e7956b0d236acbc8a38c6fb9b328a8e9f29b24b64ed0ac5e5896308f5b8b961e1e0ecae400bf0a7643600f91d99a19e360257dd1430bb5d6de366ad4a72ccf8cfb8052a3e10ad829d215445b4c4629bc32968de7ba7f625cf142f2ad057155827158e73f35994548e95d4acce234fdcbd7206918a619286ebf0623d3ae41d6ba523d52b8ce4f8591613425434ea9815df916b6f185dc73b30df034a06bda8b8665baac3936f8b7100aa87d98d0393c71f292448895528a4389908f6e8b7a2d4209132f9d4540feb5c7d74917b4307f7198a6539fefd91ab7ee182b3395f30a828ca0f856d454664269ae037f1712acf0e760ef43e70db98139a218577d2956e7de18d09a691784b9c42c40276c8e0d208fec096116c6662d86f07db1f7adeb11a182cdd90427e34df6301a9379ae3543e31586a26f72f64219f716993f88f25829abd98d38c67f65a8fa219e975075445d56df264510a1ab286ffcf883e0acfb29640196af2bd68eb424884583cc2a595430de5ca15f63faeb083991ab41f4a88cd7259261f1058c718f16958493c190d5d713693dc01cfba7d48b8a695ff75e9423f2301256bc9a665325bd40a1a706b705f72462d1a11bc6e9625fd01123a87438eb53fb983f2fab4bcd06dc5588ac9fb1525bbfe4c119415335ac8458d1c7a204edebd94a9b7bc191dc43733fa99fb2b80d06e58e45a2ae99a6fb60227994554213304a6d2a32f433a02f555dcb59d3b904426a7a6f8cfc86b86323bf5563deb409c2ca3db1d9d28e84848eb5a960bbc5a9ab473b8655f7350481b9b949c181587ea3c4733ef52462714043af9352919d93de8a29294f267cf55858bca6b2b3d46c94a8682167a0aa4ad7d7683708fa5676714cb9b6a0087524b2b20e94f110251580ebe28ef8f5e249d7c8007bff93702d2f14446ba32373f65c5fa405d9af85e6f836ac2f8aa98ddbc240f84f6c1846d6e37757a32466293e7318467d00a7fdf63d0b1f624d28edc67403511d23d1e5b10cd0f87af5fe8813be8437f8feefaa3970c6f0e136d215cb4b39862b716421b1c344a744c73d962ad35ff52314c490435717e0aeb2e01684f7f763d3e1336675fe880e0d986a989f24256561b55c5ad8e1ffe4ecb444bcaba5dd7821d3fe316a567d2d10519a1c554e17adf59766f5897aca5b3f5f9ef988ec88684d9c8aa769cf412c2c89b62ffaa87cda7fcfc59cce80a38bb55aee0aed728e28bae0df21ef26b7420d60e2a64b2f21b04fb31c79ffe61cdc5d7f83f56fec31d4baa159f40958e3dc165fdd1387705edca99766982cffe97112baa751ba28536f889252f7343c2deb2e51a9af053970f02e2deeb34ce9dc9442d241fa681598eb4969b4fb2aa81d67090c660354d1605447668954f814c7f34ac106a73ba5161046f8414948636913c95db28e5493dd6f811b93227b5857699651af14ed41feaee114e9d6e5c4309e392d95cef0ee40c7b134addc5ef2ced4d4b4a748a9ef68dad0ac5f5c0eb10950b7eeb3488e117f7730b6c4b1591a6f7c24b6026e76f6ed193b93402caf847b56f9485dfa2f6fb01ff0f9ae58313100822b9dc289feda11c79f5b086c11076945dc7d53e926277a09901c01bb0ca01e313d3f82ddcd69dbb91c996d7486c6ea784333f2f06e8c6d945c8172f6d97c8567316493a6c691783a8210d38623d3b7863c5f9e888749a7a88d782c6c057239425a6c7afc0c6448896ba1534f26bd0dd77745e1a1fb7f2b85870e187e10437d14e9fdb2fb25dbecf624bc25bdf12f99d0d063ad0568f0147bf8284c1673e793a171316bd985c8496a08b21b598fb436f4e771a11bf5871ef2ad3e824d989a7de1ab47e992ad63a3e9d1cf41115f61a1391281c345c8d1abb1b96b1c39c9127ac9bc18d3e3e6cde3d26aa87e82835856b4b21a6e160dc9144797f6c965a1de122cc30bb5c1cae9a167198325fa1266c2b3a0d4b6262c0a0d3aac40f4ad94072a1e39fdd6ab35b38c2d9cdce21cf5b7cf1d330f7d58e362c997703ca870555c7f66b7f97af68357e05e186e1c358c1f487163a3b53802e42beb208cfb5089a62588af56b786dcddcf4fc3f01180890e71a5faff141e5a89e38a6f347302b75141ee6e1115c0b967d546022d82240905416c1288df2cf325666c0ee86413749713906e088e910aa2d69c6414c98c88f3bdbd191ba2edc8f0336556ea6f30dc4caa24882ece37ba5f16e55b80a23f816f1b0854bb74616e5e96e4cf9477698000941c09117a7d140011dff9cfd1e59f5990a12c6c1854a0489f5e04cb5ae71a81255821b52698fe49ef533b86389042dec887cd5d0bd84fc63d0cb04ab3cf471db0f183f6f70f5b099b9d32818dd37a6f12820c8214c99a8515b7d203632e9c8ea1642c21a8c706186fb59c3a23c56447e7135c0dbe7f411d394591e7fac78eace8fd7e96888286f3a47fdb5fea3d167cfcc5cf2157c7be1f657a3a646c03dcb38124baeab7be102217da9ed1f46e82bbbea0c9cf4a2df1cfbd16ad54f3324266f3246bf1cdef4b72d1d6d21c7495523972e936bf92ed38267228a228e91702da96813d8840f8c0b4dfbce8082849547791cea0b901039ebe986ab674cc31312204d3cc1144e2e5e3cc6ec4068e8479c7d2b596a4ba5a287be65a818e8c2e7c542af851830fc1b42d3fa0a62c5304e682390c806c09f5c0e15d171b00808455272835111459e6122058a19ae5267860bb8274ec9cfe423831f1d21644af1d8001f2bbedd331ee9d63bb6817d6f55f518994ffb2b4ee846425a48251b4c908ac9fe1932af3dd84cfed4e70dc38397c44c43a599ca18859aeab5b618629d2c8f00ce4964d3c1cad500f474db044a8c8301c3afa20481e0f3dcd193105ea93a6e64435e01560635cd9b7c4d42cb6cc0515b6f7660f19fda8b34726b69e9e9667c580afb9bea93affcf37e123cc7e08e14901b4b26fdbc40445915ede5ee061d0f946ddc545af3d18c9fdc28170534ad36c22fee9d03614d1aa6d8bf5cdb6f1a2e696a1808e5e6a27b6b8056f8508f3a6543789155031d28218e9335d8b15a9699591ac85a503fb824853db4320b295729270b12f721d8cd0d441e2431bc6d02aac0a15e6040925d51075460911d9fdd909ff9bad9b9a16318621ed8146c29c06fdb8be59a17a8c704ec455070f17566343adc7e47245c4e90be617f638e5d3346a866f18a8d31e134461ac643f4b987b1867bb9bf8edfb87e100efd2d9bec26524a29a50c6f05e005d3057f6b259148d5dc61d6fbfabe7154a95a600bc6fb55249148fad6eb225d7cf1c5d8eeb0e9bbc6b0c685f775ad38836f2bce487afc913ed72799df5f6ceeb0a90f8217fc3eebc83b6c3ae9f37777ee47c0472765f333334adf37f38e8f7ecf08f8e8f7496200f6fbb83d6cd7a123eb95f3c1ff401da4b367db2fd761fcfcb49dc32aae562e182fcf673a6d169647b13c8a7c948b944ef26a63dc590abfc6afb566f1d4a352a97f21c94f81e05b1d12bd42e955a7e3e9218a176dac7c8f16afad19f234cd967f41a19e2517ca88392c0b0b4bbc817a967a5bfa4915dc561c9b7a55eac995ea532bd37619927cd4872c78ad3ad7fc67c5c4ac46adbfa4b5d6e68b4ab4b1f2e38729f855a9c671ef57eddf7bd7f7cb76aeef4fbd2cd380a8383c6c51e7a9c401e0d7bb1d745fbc544bcbcbb7fcd6dd978c65a3b9fb1273d8eea2bfd78f326b77116fb090a894e5d530accef8c6fd2c26d1c6eda40c46f5a4ea65fa57af437faae294bf3fb7507150bf3f44a17ef51af5a569bb490c00ea53a947a1509f7a9d5bea53f53c58baaaa35e65bead38d6a64e30b2f4d2a76e18659996fa196579d6511fdad030d3e982e8f8557fc51bf8556f451be3577147874ee9d5297b499d3a5e3ef5fb5952bf22de78499d28d45ff106eac95f99b5a71e654ac0f6d4ca297bf9958e7a2deee8487d0fdbc97fd93b759eb21490fb224f1da9277fff0af9a27823458ac06dc5b1a163e57bd88e8f6cd82452368c327b947bf290fbd2611ffcfda298e37bf0b978c39ee1c5b6867aa5de1679a2ce527feddf59abcb19d33f54ff441c9697f1aec59d0fe6754bed27d364ca3ed194f11e56ebdc7d6491d8353dca54fbb4f5ac8f2a4dfe5dc3305da5baf2b7d0b30a3def1f999f345b1e725d393c73914cbbad7c2d6fffe5c997a7e7efb678f5fc66d40ad3ed583a09d06dba06b708823b6cfaae3b55ddd308131580fafe32c77e8cbf073f0c2fb7d69459994d62c726d1c193d407b0ff33593ae9c43b2cd607c9da15acb85b8b3b6e4bff0928dcdce011622caf73f7197e78cd72c5c3f83563961fa1bef0ebd3cb3e58cd59795b7b7d6d8dd7f20f4659ed75147adc177ebde33ce1b6748fdbd23c6cadb3fd251d2cfb6e6e52b0660fdd12ab8c32bbb3da1231e6a0cd7f9081e6a2066dee4b97c2955debb66cc6bdb3c2eef0ca3dedcda6ef7749b7d5ed0ebbec0e3c31bead2eb33bddaded168bad7818531d7f156fa4b4cf6dd56423ae118df965b68631c618e354afba25b99e3f7c19093dc3e899a667133dc7f46c6b2ee1e6aa11c616ae0a5653352bac562b661d043181a16576b7dbed2b5469f463d3ee808c3a37ba253674fd07d0a9cd7dd50c6b79fddfcd39bd6cc6f43217acff06c35abed3ab4caaf1a66bfd46a3fe4b4381e0cbf6adad2bfab5f5b620ac33faacf7de7bfff5dd16ce3152e8f1a49ea6043efb3d6c0af6cb7a5bf7eacf9f1b65dfdbdfbfa2e27c3c2ef0332d57c529fd7e9a8a03fefe9bfb3a79d8ee63b6c392227dffd8830d7dff8ccdc6a16f1e8efafebcf7cab8d2efaff4fb323dc43c344bf06bd7f195e09923a7df4f4127a7dfcfe9f77d744ccaeda004de5bdfd65a6b3d4b7fbfcfde6b499fb3cd36db9c3329ff259150b8af12f8d59d75b63b1b745bbcdbdac180131c90f6eecb16c970276081fb12bff2afe1d7529112edbec2da51b8af7befabf6d25fb3f61ef7257ee927705ffcc55289546badd5dab18ba6edc16d6113bce0efb047e0b5f75e7b2f6873510846592db2c045e14ec0a642b6775bb8c76de19ed10127dc594908d7da7e5a6b8deb59e6d7d91a85b9667cd68b2b10d6195958bbbbfb52dd046921f13d90d283ae4eeb203ea1518aaa07486c2041fa0d4242aadb53ef5e68b05fa8382dd418b6d6d8213bd549260632db4586dc57de67589bc1cb0ae31dcd950b467deb55c4b77eed022c3ec336f2668252b61fd34f269375ab3435ec724977e878ca56401de4e7d03e7158b22729da46dcd723c365c458697fb9c313dc252cbec0a39023b001a2e50d4459b7da0265963de20cf8e445a753b6d2891c30913d20aff95c182e8cb2530d75bbaffcaaafc447dbffc3f06e9a62ccbe29eee49eb16932cd5795a6da89e7b6ee690553910908752703cee34522119126d6c4196aebbe6833cff2765ba00ba5c7a626fdfe69051e9cc3913d640d0823398293f327a3cca983e68fcc976440b414ea5d69324b9e4ad353062955289974d9ca5c9dcc15aed2dcd7a1a4df550eb5753ff7261963923716094375cdf49693ec69a1bc95f66965465289324b9426388b3b1943530c4fd15682872136cb1e5e4eaebef307758ea0f9833abfbd752e9540319f6ca71adf3ddb66920b6eedc983d4c30f6bf8b774d0fc818179940904f5e79bffbf39ef6621d417b7416de95979c3ae0be340a8ae6b2aba2dfda4be4c3cd0b359aa47f79ca678a4b6b86f9ae209aa8bfb6f8a26a830ee97a628638a2da6988f1079a8aefba419a853b4d516f75f80904a4824a40d7d2463a838f749186a8c138fada938e1f794331b14e9f755c2505be50f1a4ba9425ade306c3544750181d7a154d77dad9ad496890740fdfeea28d565e58d4a791b2a6f3bb287acdd968fed86cba1d8c5eafa5ca12f1a1865a2ed1b43102dd22d98dad0edb79c3e2f74fba65376ea40bfcf32310ebbecc798e18b1727115cbc7801438ce1b7b6e2d8ecc4f4f15ca13fe4ab8c40614c8ed616a622ec32d5442215761222d230ecc4c3799c972a32994ca6242f60bc5e98cbc0d7bfc4d80ff9af6c139ea79a941e0c136922b9bb2f53ef7219d497a988da2ac2305e845db593900ae351c4da7d9d7aae38437d9d62a8adfb2da622967e2aea5706a64653cd5443996569963516737564a6d0633415510e31f5eeab6ca1b6781186adaa5457c9c393287ff4fbbc68c55ba1ab5ca5b90fa218b602a2baa2ecfafd5593ea8a61a5eba79efb5af1b002a30cddd510f8a8cb48948c8184a1d6dcff4cb28849d65626797b31491c99c3aefb2fb28736b280dc67cd820cc14082208181f400896e65e54d2848bf305d56defafdf2765f484a1c4c8c7d6779bb296fc45889e4b6ca23e5ad3c924939fffdf248c549f5efd422ed8a3dd8045d98f9057ff1d96c86ad34f6495395510f9a3fff329af49923496f179538c367c4986843093156de445b792b6f3cbdd642a142450a16fcc4428c9d7c6eeb3e8d18135f5230cac89e5abf4fdaee4b26dafaed2942d6489ffb92edc0b7fba24d9b664c5802df3c4b90e062e5567cb4dc1e20f0e168874dca39c7e0090b6e13143cb17580868827353cf4e403444f7880c6955e754e829002274774d98f509c10d1022740e0189c387192e485199d9319b0cd0991203809721b5d8eee9429489a0c31a381cf08be40ebe0427951d0a4065d931f2c82b1d4abae8908c6ad6bf24207524068c233845639f5894a61c1e5ee30f214ab601465d0c3382e3982da807d50197e40830c31f25e75e8ec3a19c35e754c7c5085494fc7e40639e79cb10a4c9ee898e0744c64c0328c5faf3a26448e6092011b8ce20f8c0c5d2346b2579d0f32c0271851bdea7c6841097cb8a1b7b2ce0712fc8cce87187ca081a5a7daa3ec82a05e753ef0b840a8dbe0173301f47fa5c11f9660fc64a3fe2e90eb57c90570fdfe0578fa8e9b16209f17c6c6b0b97b44cdeaa07f2a766d60b47f8dee8ca38e4f5087b1f66aa11805d1656350ff6e1704240ced10d5996a13019b9e08c28bdfc70e389ba5fe1474aa18d3b5ebc098f5ac7e9f25235799fedd97d65a63d326f1e3cefa8ddd8a57340f9b442d71896baed79a44bff7deaa57be10e82ff7e7fdfd28f16a63582ef2158cf63fb174471999fe9d3c64fa8a8db1f3b045fde361d3fe3dbe2b5bb304407fe9b1097ec9044b56ccff9932baec76bc23a37f270f19fdb3f9e2bc1281db25b0fb77e638bf710b1156bbefc53967ad3f10ac522a95c270efbdb79857becdc2328e4748a84c7befbd4f18638c31c658b770eda2512892b4a48b0beaded7c1f9fe034ab9aee39ef6f4b1ade84358ad8ea113c21b76fc2acd8cfb558ce1fe27085d18ad90d1d63cc6b5b2c098d3f45af18a2ec31863ac02e314db45aab562dc0c2ddcf7d55a316e0614388c7309e499e433dad727c6194c8433b5f212bbc29066b03ebb6d636b33d6e6ed9b36da377d97618c7148c3acafe58431c62e18e358fd0ae352d68ae2010f56e3e6c14b4a67958a7ff7556badab17b284c10a635cbad40ac34521b9316686168d31deda26c332bdcc383ecb69628c734d9f5c5ca13e2781eee9b504aff55c3e139ae0b59e005170fc6d2323238e31aee76cdc1963153c8518ab5f33d62ab8ce39e7153c74e186ef360ff0aeb99005cdad618131c63618e31a6b53c38266858a14ae168a1326664a9ce6cbb06260ca954d0c1a680e838b31eea1a8e653e371cee37c0553b25e62c214c849a45017ea70a1f9f3f2a2b53e426f8bbf1ce1d01c2e575b280975a12ed4c98835718693ed5403892377302531ddc020420e9af64433e54e474eb630084577393497dba5380c876979596aecb5f20794c32e1c76dd7a90dc00c3aa97aeaa08f5216aeb64227b298a1ea5282ec61c7130e6498742a18e72682e26347f606e3037e46040f42887e65ed290bb84e58f7256e5a8a8b7e3a5401ce1d01497569a1d76b91c1581440f79a919e6251487a2b894f394737e82bbb4a242ee40420179686ab2d2da021567221134047741170689a2397497e36968fec8c8d86ac8913852877c2292e680f7c499f823d66e38f0de4cc4996ea5d075dd322d619eab4167bbaf92872a4564512f457727222809258d09cd9f9818908775cf58e670a8921d95a29e9421b2a89762170f6d826e9017d33bc2a1b89734c74f1117863825298ae3a528d02e28cde5783814681784d35541733823a38c44733c1c0ab40bc2715668feac56ff32cf2271a40eb9f444e444e33d5e442edda1b6604175719f658a395418f75f4c3127a23b7126e2a0e060204f8a501040bb274d6a0cd30dad381c257500ea24eebeca26b555de90cbe5902b69e52cc5b0b285ea22725fab2abc08244a5b5a8e202dd3d4eca868b5bbad201e769129891ee1501ce715f1782614f4fb30e58b139aa2486e699aa669aa244d857a42692a14054d795150a05d5014cee3fca84c51ceab2d4e34ec32e5b0eba7c24e47aa0bc34e36969449cc996e27194c3fe472240e4d5124b7344dd3345592a6423da134158a82a6bc2828d02e280ae7f1f3944373288689b55a7a5f279e1cd4d76985130dc3c49929876120ef74a4c24c494e360c33dd6ef775c2e1505f271dc413ade5443be54c395eaee77018c67b240e2d77b9d2765aa1e4419c615869029c28e4067156f21c15f130ac54c194a49c996e18b6aaa2430f70f7b5a252d68e2861e0952df08e724f2a4d935a53d4c32ea01d76913c32edf7d11445724bd3344d5325692ad4134a53a12868ca8b8202ed82a2d46c3ce43cfceeac67b376d2ac334a409e8e302c65c3ae9bbab5cc8a48b4df0773ba14cdf15214681794e2704a5214c74b51a05d509acbe970688e8743817641b89c0e87e6783814681784cbe970688e87438176413816f7d1722910853b61d16eeb0eb9ad2bd2fa7d7b41b4c46fad5f2a4b457afd120cf5a5baad1a86c17cfd524fc5317d3541283a40a05e1f6c525f2780bb8a337e7d10ad38a7afb5a8bec6e9dc7f9569135458ce42c847b77585e859152a15a667a8af2ff3f5b5ade2b47c7dcd938b8ef4c62180805261ba07a677407bfdcc4385699c7e9295f4fa3987fad2e86ded72aee2885f3fe3c0d2e65f3f935fff312cf5f55b3618f6a2529148248a3b192dfe294b21140df5dc56188662eca7144f3554adb6b0e1bab0796d5d31459af802e7f128624d9ca157441108c43f0c3937ada9c8543b0939f1e0d376e120c9cd98aec21f69023981fd0dfc0cd2e7c2b8b755d3ed49d66e0b87530dc370bfbd98ad94c8c222c67e582bbe12633f2c6cea16d3cb526389bb30ee7fadfc6d1eec9aad7a407eac86aaab86bb35c9e5505d48fa0db595f6fb2620a0e0faeda9d96e2be54db4c99823cb3c85a385095128d417c3553f2c9610dd738475aacd4a1bb238778253b02e2928278c8fe6c81eb2460644108165e8e0ad3315bd332e22436748a7dfa0cfd0386748e70ce19c211a35866a68dc87741fc27d286603372141044242b9cfc8d80867237d06d10c1a42d0a881b30e11d621ca3a44311bd612d9c0990611a641946910ed94909fd87cf4d65b6fbdb5ce804ea96c1e5a7b5e2053a1810a0d5468a04283b544dca004b5a1adb3ce434319078dc31ed27a0fe98dc30c3890019d8e05238cd07a53d15b87031ca4341419da9a082a7a17d99a082a7a17c979ebacd3bbc8d64450d1bb488e18d39f8365e8e0ad3315bd332e22436748a7dfa0cfd0386748e70ce19c211a35866a68dc87741fc27d28660303b100aaa0371154f4d669bda9e8addb29014706300b9845108d113770e870e4d0e5304167c20c32c619679c711e4da71617149952bdac625819ffc0d9250a4be68dde3c416cb3378bb3670915b5c48cd18bcf8c09a3171f13278c5e7c4ea0307af141d1b256e8450815095aae11b852a820529131e9fb8888be1460524ec18a68c50a3186693226c22b31965340c30208163518a8b1f961d362490b119688e0e285077eca0b185360c01063f895b11136c5585ef282ddece066841d8c8013238a099f1824183141f402468e0c9c858c7036f282c9d0c159c8086723373762ec1b41a77fa48d83969d5afb63b4ffdd700d3bcd467062f419380b19e16c4447478ce1d7c97d46c646381be9338866d01082460d9c7588b00e51d6218ad9b096c806ce3488300da24c8368a784fc021b0fd4642a367670e4c858c80873da6d2db971438c611c191be1bce4060e137e640f641b5ecd941c262c3121004b02208025027021421039c841686d2a6b83418c2ab6c70446fbb7db23c23a2333f129a38cd3ecc53967adf5de3b3f49dcf9c052c8c51596d1746ab1e12a4ee3442a6ca7fc87cb70b209c112c2828765b342fcca45939bcf79ad382aac35cf146709578999d68c8924286e3c2913274e0ce1b4b4eef455adb7e9f5a663db2cf57de3a852fd6fd146a95b920c2750d41f769c5669484650ccb45c3f256a45b84a1ae76f93c01db775428fdb42c1765b49be170b4ce028450a15664db593a8b04946f0396d458585d582f64885711a4da6cbacadd27648c27b6e2b5481868510160f0f2be4615113d3438d0d4c0f362d44e0a1c53f07f8302c2440092e5cbc5061182f52072f184a07b09b1192b4dc504ec32e216ea46eea29c108383fa71aa7715aad564204172400c0f402060072c6d74b8c911e96632383c5be36f89c765b4cf7fbef46da38b819815b15825498edb14376aa79ea9b6a0cbb015b73adcd666d7603b59c1c31963fe765d8e88c405c62ecd4d6dc0fbbb64868371b521bc39aa0d6d45069360ebab5f19a0c9d1f5eabf122743ab7b6d99159a5f519e00b9b1c9c43a3460d975e9f89d9e02a0ce35fff398dbb6061d666e33424a6bd61170b31084d8dd80d1e04e6f6d0384d079c962b1ac27b6e8bb623c6f2e7cc2bb2e166eb61a7045e2b8e0d8e507cdea3e2b57e5bd666793cf666e3b46f1c59dc68407303c7c591c3e630e148bfb6eabab6860ae3b44ac3a15f5a0f26709b1636d594032f093c489122258acf267d197f770ae94ed977cac54264d3d61b835bcc7e4b6a61ad11e3d8fa215ad4d20ddf2b43af575f158400a2010c35a0a700a21ebd3e94b536221bf12cd824d2943d05e3b746e8bdcdaf4a19ebf7d0ebf562bd58af4744449400a204106d52ce3ff3950496b215632e22f8c1bcb899196a610d84f5e67c6b480051028848fb3201c25a0810e5152590944919d7eae067adb53b442570b310ebc57a37861f30c6d1cb2bb45e01c61847a057b54f682fb7f8f211a730e68aeb05410d0b1ddc7566305a7b314d35c0e832e2bc22eb609709b7841cc696aed9295ed8a8603574764daa33d0f219420c5860e10668507ac20a74f8c1c9141e6ab0c28d820e01029d0f3d35ffe3a852b1e0a1b1d6aea83855a7d82e520b05ae832766363637372513bb195ea206d3dfc25caecb7ea759ab3f8e322c9e53d8c25d509c7c49a978542f378612d07dc976e44abafbfaf02a3f3f327ebf375ed9ef4bc1dafc247d9e25b6f576d2361bcb24338ecf42aba1493b7b682578ad9e40d122ed227a28c3079a610afd2b78b5a9391bf30331cd6561513397a28b71c5b6628c6b0d5abdbecd1587b4d1fed5d9c5d62f043d64f960fbe3d8f5610e569a989aa8b40b9d0a62e86824004001f3160000200c08064462a13048133deff914000e637e4a646044998743419283200a821806620c328618428c41062134374500f8f80f105bc0485cff8d348eb05f17bb668cdb489e06625bdc81fd40c9f068738ff4bb2f63acd1c8c344db7313df7f5862207fe8886738f67d92fe688c7fe0d88b0bc0eddcb0e96b933ee5940fedc5ad0709f74ca855535b0911fe167053dd71a622805348d9f8e15108cc9e36717b7c29a176374669bd6a02467037e99f3ac7ddb4cb48064f050c05cd176ce33f26d3101fb50b6d20d55e4ebffed44dcbc1405bcc6a0bf27046c5ba15a8d11a0b3ad1462f0d7da680bbc741faa4812b36236e4fbd607edc520f585157e63af47fac1f21ad7abb6a59ba6c24ad93a9bc39a0289995c9b7a0bbc17d745b94f4b607b54e4cf56680a23656c7950e6f1b07e99286f11f1da54ecb8cb5440c3af280dea633a35502b312bfc2f012d6fad237cfb10711a38e3cd06d4ade78a71c6b33422b1c10532782b9a0ae74971bb5491e78c86ddd81e505a5e191f69ee4e37f66ac81290f8b1bf726bef3b3641840f67b16d43d3d5e66e3a95e8010e11ccdd4a89d1e3608baaa5a1add277ef090529984dc40cebe0cf817087d628221ba199abefc9f07fac0522abcddd83d63e9e323b30ab9446acd3c2339b158df921a7afb2177d9e31a43b829dac4c4344c1c1db18f2e4130e9581e64880eac01108fc432faf629654a16895ef73eb3d1eec58f02492ae967ebe2693bfb1ddb51c49563c2962766aaab5f22a765652e07043bf3692a29ef09875952b6279e4641f9127bea85794e86623bc965cbcc97dd9648bd363d093b9a0a68388b26ef2f32dbf8ca130b034361cf5966fbeb57cbd9655b801e880814769abe03b18c33e07f48c825e2a2c38e9876c14b582558dc28e5a72366976d017570e14489d14f99ba83a06bbf5ca4e56336c10a7441a507052a89e99cf42113146c56dc4c0928d9640e7829f9596b7e0ab7f15bcd8dc3bfd3aa66a6811a797562ab6c9188fc9cdca1b6f039d2be8c1cb6af7aa4d48401cd8a1b5300a599c8097f2a97920cba61cc252b72ba0f3371eb0d08572695ab28868453a604cc53e539c8110028a41f4c38e808624a287d36b8c10491ff4a4b9371689fcc0ac58aef1dd45d076d1cd85bbca37a09e34f9f474a6283b1ab022ea287b083d96b6e93e0a35256ec88d9ef9c2831fa2957f48c2d16417de3bd084c66b908b04e3d2ed929ff7e238ff11d2336e7bc7b3198bf0822b543143afe5dc76772cb8bd2fc1dfac20a19a59bdf8f1c45c4e4f40ea323ff59c6b7d87f33a40b6fb10d082ef974392c4c15bd4069c7d39f3fa2ac85f60ff51e076ed30c9cf12f19de1232c1909785f9ba5f213a9f29e8b7d2d57f952f6f75b7bfcbcf0fcf531f47845e10969516b80dd7c5fcb0ccb152bb0a05369ef276781207cc99722079eb28d97d0e070a49ecb8021bd0a313ab23427e6259d5cbd3a6cf8180de3869c9f1a69d2c2ab1c4b8354ca21af1f03b5c17614d8229f53a29662c9a289426a0b55b90a20fab8d98d499f27eb24598b321bc3c4740b698d42b0a29b589502aa75fa060a20a1c6bb1bb74aaed7d7198cd8aa551faf1ee2115294ca80b8a09f1826c2608c28dda9ce492d1a499d13056419a542f33c2acdee9de717b2e0b496e56b0bbb579dfae7c1abdf113385cd52f8d83c686082a32dc415d70caee0d981675e9fe66ccf470f076226c0f3116521eee0b64fb6099646a468928752f88002af9550aba321ef4515499c581e83c066f80200377c8d6d4a49c42477b7172e15cd760dfcbaa0c6a6d97541bdfb6f2de0cbdc2e9d135295d209c614bde80a31a3657a096173d8f98d221b2f87c4ab16c845cc72edcb59f58814bcb47c740fe4de940eebcd61d7e2ae097dc2efb9a2efa92ee87c4d184fa96bcc4976402551a93508af0c0d36f39f4090623cdc62736bc665066c91654bc8014921043e0fc68a03b2eca5cdf2bc18ddc403b4d7c2894a34d56d60a2c8556d250437878c0041226dbf03eac267d209698f648110a4b3f2fcacfd7ee5a9902a41ae78467bcab64069088fac64320e21f421a2dd6003129561c350821668a8673ea284bfbd6523b3e60bd18b56d9607eff44f03a1016ce2e5fa1093288c203c2f4e43865edebc3506866ad300327dd58a63b75d4911d7300b2c88232c1be447a9c791a600abcd6272b43cf779e4b1096c685aa083d8db37b0949f79c49bebaf689ba99963d8dadb3f64a7b888cbbf3b3f0a8da4795f8488f1d353656a08fd13fbcc0e303f7f34f448e4238c99a542b399d41816e4676168b5664696031cecf83fc1b9486c198763f57f544331f86fe7447525c5b8553659794624f1c345f3937d0c179d9b6a8cb25f503488f2378ec2b68e3fd019a1a43be1149e47d7fe2b8d7cda1e735bf970c872c66317f1aee113d2207d6e45977af745804637bd85634d05e33130064a27196973b32e84f5301adbd49a709cb3bedf0da2ed3899baa2f10a2e41b33a817ab9448337615b494aac25b3da5f101b0c86ff82618c8120d9e3df273cb298e75696fc493a363d313220d583102226a6afb6c70e04b86f75e544c20ef855641f0b4cc5a348e9d9fb9f6296ca20425160ffda06623ab603efd60241693631ef8541c4dacfaf0cf79523339d0c251a509cd024a9d3ec115c3b54f2e0e3b13858ecb0502ce95077588a03e01ea9954172f4e74c8f0cc7a6d8a595ebd9f0fa917679797ca4c18c29a8fd93e4214c2e99ad74bb3fd5b87207c60d5f475c7e520328ea417255ab3c47290eef8e0468b4cda975135ee9d03a0f10902faed3084de46e1f4f9a97c41bb11a5e628a1dec2fcd54d78cabd2241df47ea95f4e328a2206209c0560b35b523f521b23b0e971e076d00492adbab4911bf306a98838e8043a6d072f0a7a3d796291b01f44b2be62885796215d344875cfdeede03983030fbc80bbb7c0ec3f21460d914c424fc6e011e53ddbd2c8b15081c63f35f357aa48dc34e9e04fc9d0487b413e56d40f029a4e41fa982786dc691331741716196964b00d52e10ac4bf301cf36a6f494b15b4ad6911bdc6cefb94bc8bfdf1b43bbbd5938b58accf845ba0d492984eab87c2eff5ee74c304957c2ed4c98f5feb6c4ecd79b04d9418c8da223adf82809bf98c6c04109cebaf0686a3c3e481deef5d0387a0c6bd0c78a98448baee74e2c7ae23800a22ce528619b292d8a538f04998c32cab18686062b093b271c0d9aa243c32dddfe7e24a571f4652631dc466ec560f23ead2f8f77536a28a72d62af70700e4e06458f3efaa83fad4555b351c385e2405c96ee29bbb89118a245db1b1991a81e984e3e381a2bce6367a9be690fdf03ef49513503e329ce112308711eadf283480fb7406a90ce9840fa74c57de846bd89760fecb9e1dbe583b4ee4e06e9101c11cc61fa16efc943604bf763b7348ac076c42405e39a437a4be6635a45c2959c17d48b90279e9ce866480dd3f7648a39416d6a445f037d204a59de12c642fee59c1b02f1c564bc5c3e497169cb722585b46218765d6900c6f2d1a9f156f8177feaee5ca15d8d2e2b8690ea99d6d3d243e3ae083140445ce2f7ac7edc4acb75e2a7a5c15e529a30c46203017f67556bfc286e4f448ffedb831252b7228a465c61f95e6069455c8f1909619376573c56e39e2319df6107c7163dc0611775324249f72c6f905ee0199130dd7e7e073c841eba7036539d2416f75bbf6afdaf612eb90b3400ce32411b8aac3644bbe38a199f76e8986d9759df682713382e4ed570d7b031f332daaac77232c3d9acff6bbc46561507b1d7fcfb541ded68ca9159c01661ab06ab97747695bdc366f6a86d62c3b5e589320fbb1d46bbc438e0ee687b76d05030ea04c895718ec43d174e27f81e38b29f8b259809c43455ed6552cf408b8e7417ae89cb000844ea2646ed203104d72678d1168838d6723da5419ed7b49b9e66231eb9a64951e68bd96e734467bf6738886c4436231959220811eecf6c44437624b0f19dd8875fdd4cf4cd329de74f75d638fe446379935765660a67d4234b2aa703b1518978804e5e5359e679082dc6391a4d766f0c039d6551b4a6c6866d2124538e3bc86d6249b75e468c5ab995433677e332ca7d966a3bfe53fd49e51364950005a1eb1587187ea9b3020cf241f8acdfa877df80469b0d6a937ab6e2cd24065d1c59a109f1cb200b03d84cf208c40c10c175410385fde0e6b367df854f26a876d0bd7a89a845e6f2858667c084e21fe3bff1708fba3eb9695fb87eac858e18d9a3871695258371cf931dbdeafc93fbe2d9ce01894a11a1481cb1b83da29629eccaff2f59132bed56c2bddb2897a44fd8fa665050e81a89e45f73f0e0dd526e62b2790ddb275e7ba89c106df928c6973c5ee559c2d3d2134489c5e73a7c92ac0b3978e7da1d1d976be40b9089f7fffa87960339d8a9774fcf600bcb0555166c13d05f7b634b7c4374fb8aaa9f1c804622ed228facc4e4bf574929c28d2b47efa513921fc2c318d27c633e972b0738b77c91d9ea5ea0dd38e81b83c90e3f2b1e93c9406f161a93857c13ccf89b9313c9a1acb2677234d4960f4cd2d267e7d728e9caaf4a949f45b29bb6628cc97f6a48e0e16d1844a80a83ca254430f3939aa3a50e6d8700d078847b036f6f772c4d9adccd53884dcf5c6cc388ec0022f32589a0ef85806887e15d4c06c5e8d1effdb71489fb89911ce5fa0b271a9902d277cd578abde1e90740c96088689837608c9ca23cad4d6674af16e3d28590ec814ccc75d43d1b561088c5814546e98f5dbc210900d8b4afee40f019766034de42c6eb158615a0850f03edfb3a531d3de41a1dded6f967ee42962353f26012ca4f45ae0c38f5b24c650047655b76bb3e4973a5f569b6849205d0c06fac13ebbc89f4bdc3403b6755461e7fed21bd81085693e04c265956175c8902afbdafda6e0d22767f2dedc88cd5623d2d550bf4921449c9f64356192dba4bdb8b4efd21fb694ab2f2128999fac6f956aedccb547a5ee0ca57375a6a226a8f12c904aa05626c6628788fe7cf30154204f2bc14961a916c86fb711e838967a62745154cdb4f18f2a84687b2595a75c0d20e9162a566fe11dce9b5788a97cbc8515f699e2f25b97c87f437146127b5084185ed772c8cb0f332994fd44dedcfb0d7886e33c868e3f4f5051cca506621e3087cda579cf395ca2685ea2cf6fa240048956f435596851600b37053535cb15f51b3a6cf304e668e86f1c7f4519d1c571e78824d39535b2627c9f11784a14b176f1daa8316d4d3dca0777b758e3fbf12d3973009f9eed90ce4c24ac560a8548193ab79249455a857b18985f55086c8fd90b6829bb06c36176602236ddbbc694b1f31484c0147d741121a7b355043a95d5101fcefa24843e3a547a826eb63298b8b7bfed9fbf8afea3cdf5f88d0c1ba62da3b113d86dd1a27592c7f92bbc864e9f6d8a2b4a265f69148efd985cd6ba25620a3fa33b5f1bb23fb5afbe97b01456ebc013d9765afd7ed9a79691cfa3500d8a0c09f8d5aacebad6f824d1d9c70228a7d02c2c1f4c3034dead81cbbf33bc0c54421ce7f139c49dc1ca07d72b6e6f510a03469d9e57c4f3ae49b871483eb73198ac9dd5cf677876c3ff3507394b75f72ee628c98314885f9ee5477645e2946d3e071f460f85285e4150bc2ae532d1d9c786cb8a2532243115a1835caa2e0c6f92dc02c613d6f74c2fa06360507af9165c722a2f83fc16a9213bacc483381a976b1d7bdd9c8ed8a13245d874e9a603bf157357261f37bef996fd749e87802c6131ed8e8a93a5b0e2139314b7e6d17aa26609707ae7f2afe5368fd061cb7804696e02c97c4225d5481f1ac6f4011a9918b9d075158b1d7bc82c83fc377001e75317b3e161a34d4fe5d7d4406dcd692c413ce6a1014ead6d96d665d67f3c143ed028e37192724a015298d6c2c89ed86eb3f6224cdeb3b6762e3050fc63e032095215352e3666c54b31958933af68773e13e1b70da5b773185604bcbe2db1e89aa4533c0a0e8cbfd3bebbda6b33428ecc6fd863d1d519fa9b442e4119c111b3b4a01e2c14ca4298266013bfbfd6c556c26c8b90cbf5c0e18702513662ebf47a7d7348e3c5589a996ff5a881057beab29dbe4ea619ee2cbf812d2f5035ee908ece448f0afb2a3804596d6a47160d86a4e9fa66d1a3e4553ce6e24ebbec8df43525f5e6be129574890cc5febb2b859db21e25930c0ecd469965964059c01889f26aeb9285cf02509652935ad6880fbfe1f29fa9f82fed0a39515e5916f5710d474ad73e80acdd03301c01d4dbb1471ce61db577013ca438850b92194c86bb20b14e51999f531c5f6b6c8ff4e9bb436c9e46e898dd709a6d37347fceda92410ede8a85df41df90c3b524188f84ed97edbb32a4da1710f1a2c8bb41c86623cb8ad8f3b69328302e0d09f1669e5032bf9e9037d211b887f37389c21ba47807a30069ccab0d8ae51d1c075fc789eaaea87b5a4a239a30355ce6dde3069bbe244d7adb2561878258ee32c66d57526f8dd5a881e9a2b21b8c947f748d47dbad8bd4bb90adce9fe13ce7d114682496481e4560e11f249f806751420ac8579f5f4c0544dd4ffa6dd0e7d94cbc0786721c7a7bd96e1b04de0a2489e984023737ee42fad189580a71d0633926771caeed215cf9d778f2a2cca39c84da17b9e917a40747316a68060627e11c941830f4ae8aa214e0ba38b9ce1fd0bbdcabfbd7b7a18855526590cdfc35a20db4ae1cb43e4f9d5be718d0156f4fde0dba1218e8a7d0b31b17cae3d320694d0dfed81e71777ac4f3797b445235710b90a535e45d30fe46a7ccdbc72581414e7a0875cdf817cd3477a9566dbc4bbb36b9af83c95868af3b3bb2ba198baeceade7181711c847d9b1e146b9b384188e559c8e3311675fc67183c9f8c025432f6ca2a5810f5dc6e9da87d77a493c5af48ae1459240ef74d89f7eee66a7b68713241c320d6b1da0323aad6d966f8c7ca85a2246a82b02aa47eea71da14491f827d7c034400433529f7abb13875b30d44f1a992697ee270e4eaf84757fde610cd01bbff93811f10d732b4942991a8d54aa9c6ec1a715acf6e17062483f6a7c0d18325f131c092da5ea48a2dad734625555d93b8534e502635550f59097ab5aac2aa16bb7aa1b4994ea0f51c51938e304ff7b729e2c11ab6679834d3be2efb76572f6300e5361f63f0878c354ae492eb6c56f40c1f8b855af548224ef1d5820e5134918298670ff31990703a6b2dde943150ecb8a0ca89e52288d88a3357f542d7d3e5523227fc402384efa097c543683d9f50df2c4befb68b9da0e66f91871740006d11647334356465fce3892d2ec538ff11008e6343cd42fca02a0866b247687f33efc9b8e090c1166cba0ae6021267a4520a050770e40c5e04d4d5f534412b953482129834f78a57d10fc18abea59a922da12cd311e8118082953428564a391c9608b8d10166658b39b109ab5495f810e2c7284425b4bcaa56ce11d1b129931c66848732bb5829c1311acfb8db72f103e28b841aa97b6d77b791a59f6ad69a68129d361482673fc82ba0f80dba7970e5a7000d408fd4814305053edfb49adcb72657f60dcc411d7eb0535dfe9861c590eadb868693fbd93faa9f6f0e6545975076200345f5299d2dcd3bed38af468874bca1d28e497106ff130a85095cfe21f3fe8b8d8da787b9e2e50430b6bcbe17b53e6c77cfe1c9321e517bfa8a02c3723bad14bbbe5ba4aa6bb3be6f96d17e5ce069f51dcae3ffc811a9a75943031e2e1b436bef1e7dc34aa4d8ecb345a15bc0845f2afc341603d1faf1ad5f2b585cd21515651d4bd5770346a85bd6e0eb51f3f303744083e95a2a86f31be20489cea921a64a247ca14238a822cccef74e0542f8a5a29dc1cb0da8049d7a1d6f7a5d84f9b564714f55fc7b56171cdfd6d40e04ae1b80df83d3480b4bf82ff5f64267c483f10350aea7cf4c09a75552932d5ca525389dc22f327d69422bb1362327400a2208d0b1cbbedd81e3110059df51cae6b2ca15e1b62f7103bbbd384c2bb956ddf4e2b1a8802af484699bb70ebec72206add27fecdef247f8c6dad40b202513f30e05317cb4ed7ae8763a1631b6c0228e76213a890707b3cba6ee2047e624a7e58a855db8d28ff195a013881355d04ca6aa57428675b822b175640915876dd9c992cf26f19231a58d68872195fc14aa6bb8a2238be23458a0d0ba832c2a73c23c23f36f48170a3848d1d61f6a582df450232463ea1cc009dc5d6aa31526674867cca3f03c1e8ad952d3499e1691e40219fac7836aae0925f80590953e48033e23c4ad1c8ed4c3ee9461b7006f4e905fb364438680672ffb1fa0eb7b097db0f3e1538de47b7e181173feb35afd8cb229f5c79971044444a20883dfd23a1386dfc80c07bfb980985dcc713ee4bab8204e3e739be951b0458f798c71377e33a4c48fe01b3116e5caa5e626203c21bf10d3c09ad74027199496f0a0bf777b830e5a0004ba097242d6cc2aa8daa9e107177c20c0e92e99d1415afd3e669f601b67d199a0237ef8168633fea7a0d75d13bdf8589c9ea85e2600844df0d5efc9d0006d29d25e2f1c879b7a814fac2bb71663d3f8c22ed6433a2bf9b2e342090eaad6e87a32950839b4f3c8135669e7c8a0f88a79dec26e2de9aa080b9429871a5d3fc36d4cf6d044e02cbbd719a4dc974c7ca3693f2efc20bcfb270158d1336a6fc84e4ae80a0a64d62f1e6716a02a9344e9c3ba4f5cddc550aba2ad36ae0ba333720ccadb671cab77834fb80928c7fdd9200f5fe242302e4b235f11fd76e2f79b26a15ecebbfac1f1f98d0b45062e0caa8f19510f3f2a33f6faa4245a452711dd4c71332a833ac0618ff2063862cdd839913d27da50ecc3e416f2b9fd39e09b0063cb226124d6b95222e6d6f6eba7467325766c78c070a960c90c32b82f381fc35b943ee1e3dc6ee7e212d5849a02d597b3cf3ac78ce4c8045a3bdf4f3256ec11c969b5733f9b47e1aa1154108fedbf3077b549c21ac6eb98e512f4ab7d4b18954c5ba1f0032757c5573c97a5ccc358723abcc8f05e814d6071b33d018c3966fe0c011ed562b8e684c91bf2d4e35c78458d766990f62c187c9c1f8a9af551ace74c9195e1e8425019d86affa3576a40e8c16e537f182d85af57a987e836d84fa3b3073dd1e05253b0dc481c970e2766ca1d2253b416dfface19ce0aacdad97bb6e7f6d4dd8cab07f002938e5d91a9152063fb082a87449ecf7da933a93708c977095674bac55e426d3469f74e4977fd599bb42ba45e41b1b33d018838d4e233b404196ae5256438bb13d28ea70f28713ae17ad4de0af614bd9cd4cd46d1fb44b058127445ad19b7efdcb1ae5dacd991fe8e9d0e75bf489f8228b0a272d616ea272c1d6b0003e42ba0a79339828e13cf83540c1b053fac5c6042bbb61cf20b133f85f2002f07b59517881c6af3012b80e592fe2c5304af9f340de75c1dadca066e115f926710d7b853b9c2fb45795e2328fbbe98f7040e64006dcbd05c6214d42bab6f8d187f717a98210ce151712a72ca7a18e8d484a2e69952a28c71bfdff6491432e8c35ecd8bd6d539d7a91db74f32508057db4ce05a375f47f21324b18df2af38713b02597ef8717bdfa71b1b11f62a4b7ccefeccf867d9b0543ae7d6f2d08b5912f1d3b33f9229a0e9b528eac81054748e9e5e50e5c433db07228e86c0f94e62ac0ab6c8664c0fe7f5dd538cc84f6fe59dba9ef08c20ec2e752141c6cc3d847437dd8c76c7f25c6f0b155f8c12e7d1c085a75c41cab1e99f03f811e363d7238c7b0bad0b77ee4ffc2d3c6ae0401956785b81772285be4240dd2f63026a31b1e83f47d1d578a4dd81dbcd08f7540a98bbd2b2d8aa752db2c98d12b1f6f4e57ddb045e56d598a694a875a51bbac3dd8d25150eab04af30eafa646cce150a3fd0bc0762f48f3ea05d54273b4769780a34d6335e2091642dede3b369fac362dc17b5f4d099beebec8f0a2ee302050166f55864038d7277036350c04740bc787e7b558dc0224fe2ba0330e4701287a43cf13ba6f2b006bf19d12eee42f1bbcd19be708a7bc5608327a80c3bc7ca02b0e6ad24462f51fef23a3f4d6fef819d47e7412befaee97f97a1e26ce4fa7971b718e60eb4d61ee34b03b14234dc13607b92a8b39f2aeb1c15a3567810156d87b049496ac203c4a5f53b0e761a60518d6251c947cb0679a32a4eae6c8b2fab420264fa2c5841d447e5e222cf58362bfcb8017c0f41008b1c885605ebeb93f0ab468198b48d00d59448e1e76e5a7dea8a36406a034ea7bb76e2ce4158089b2640cc1c5cec843b27c72f82aa5ddbe24f30a73ae3029780fa9848eec56b48ff27011ebe658a0d84d7f6e8e9ec0f639d90d880fa0e59c609a7d97448b1b97ef37aa7c64e9ee5a4a861a9912d51b04541161fc6ffcf953a14b8d05e6dc97bd055912f81cffde617460b99245c5c80f86373bc58bf0c15f0b409ec917e2d897964c3e4afaa68c49174c698d229f1ffd8f719af7d3de28eb7e39f86258b5b95f95327232998f07142ae8e5b7dcd42621df2386e26b271bf196892799cd45da19a06175bfa1442800592895442aa31c4949614b26c6c0224b17ae0bdb9e5ceb4851aa39cae1542a4f64895bd4d28157a5cddf8b63f931d7c9b766cc56032db563c4655a2c664fb0fe59c021dbd02b299ac952115619d30ab3e10f39d97fdc2ee0f156b06e83ebc496a7f2470afaf0ac6058794aa879739040cc18ce16e9f84a2cc5fb5f3fb0aff563e6ed098cfab0256baa923d753ced25cfd696ab555836842bc614a7e70078a8864b7ca92bb75c4c7e15a9ba4f3c6300f6c4e52bb3f6839b1ce286669b0eac4dd37311d1ccfc1b1ebe111fcde4ebc3ef26113adb5acd2ca554ea751b71923c778bdfee5d57c652d08049c4ec0aed51622050e5e1fa79c9fe3f5cf6c2d3dc1cc6cdeee2866f508247b766b817c7d6963e03bf11f9298622ab7a4349b120fbd5d1203f584b3082f0a5c7100835fcd45f8fa4b1f8df2c434c35162bb89f7792c25fb14f00f0c3087cdcf32e8e2d7559f79974c288c6f1ccccf78c6c6194cd24825aa752ea6d730c5710f4b210d86d6b8e17986b668da8395ea9ff6f6da9eeb9bfae3db95c8e171a8fac981d7b757687656333575fb5d94532695d3145836085f8b3dea7d5ec2066b70e81fdb49be32f15c43e24ef125d2d924d1ac0ddf6f55d9513baec9f7de1edf62d88f8f066cfae48231c964879be613d4dce31f5fa64e1f04f8fae902659d281669927cae167e27cb9e0c29ed4f5670af4a4cc143c0a1825cfe992c56f44b57dc1a942af4efa61a0e7a5a8ebc54e659fb3e8c890d4a0481c8a965b37c4bc751492680fc3ec48141e33707cffc2fbabb080a779f384ae8ea21e270b3cdd61885a4dd26c13ca3d203adb41c2c567fc8f4704463214a66c48a7075af227a2e17b3a49e29726c484e19853d5ffa735daf2094263b089144c3716bacd295c8f1e023b36093df315e3745acc4ca47055e28390a5e79e6598509af584f96c8c1db97ef1c02ea48e889345c9a49d4419093bfc3207cb60471c600471b43a32394e2509f403a81b5a95afb7eb9970e68a07b648bcb237226dd015240eb80cdb288a11e9ff3eb92a350adb887d01970e2d7b1413be3f811a5a4c2911484d926994574edc324e0aa4d6579fcec6b18afc3531903f8b42238d295fe267e75545c02a43ae84ca0e1241f80e7fd71fd3cb33f3528778cd6d9caf4a7638b029c0d07efc6cf93b7fb03e402b8968c61f935be9987e76ac05fc4e88afcc658262a94335253b161ebccbd2ae3bd0f7c17977e7d257be6c80e03422735c113bc82d38f503a7a3ea1e59f23238d362b5d9dafbb12bbdb0bd514d0a87050333d097d608dcbe830f39d97f132a4d36653da1865984d99e36184c994d57f3f4ad0d2944a89d0c01230a4da8e55ffdba8df1b46e58e50db514f85473535ad275e1ebc0026db55bec7ba03a6488226d9f0b55022030b05a1373da74d78c967474a16b1bd05b88ff013e876619274d1ee80cf3b98c2e07f1c610690143826f5f20a7fb9f8f75ebe64b4012324f405c8a08222464a9002b34ef2eb9672739aaf77a78a53b58bc9250b80f3d716b53552e9a48023373a64eb224534a8673a6513a5bab49b2b7aec2186dfd8e9013428a4b7496e2c9e862896f6dc3a8b3287333951fb8675eed43fac568961af0779c962c4089eb6ce4d2e5dbb73355ddb105c4f9539550b0ff8f085d19bbfb9c3a43abdc8dfb361e6bfe318cc4633f292d7df276bf2506f7ae12367f8907e0c5af7029bad9537b6a00a6c1d4601815cd91ae77b4eb24cab40f499183016dd65a761f316bf49b5570e2071077f562e42d6f896a4b9b3c8ee4e247235b5aa6a858e64619496d52e67c56d94144c513ed37e1ff41de0889642d4a85c13a4c503705013ca96df60c15cfcb6b8a2a04a8e18b1f4564de0863127cab57f149a8eca235c9ff883e53bd2af47a5576561602994958de810dc67389ec9fec5af9bbd714955dca6e32a52dcdd85e2fd477cd14498b3dd171fb12890b455eba70b3c9ac6706cfc5ae630d37d56b14eb7024fdad0242c66a12420b0d66463a55b262f3a09b488d16899999652bb3250dd9710330bd5ff4106ba2d7e1ff9e50ba0bbd3b94ef64ccec5256ecca1bb435be8aeb81640730a6b69b3cc3a0bd66a9f849e7020521675cadac13256da3f84ef7f8bab7d30866110d99da021542c3ca0edfa789365f2cfaca3d074efc3cad57b9200a24fdf816713efd9c23e0a5a8130f51d355b49e8a14c54f698ea809240b2e0577dd90a7892edd56920c29b38223d25acb2841b01aa090e485aeb17a590d71812c234508e3f7c960b4a556624e0e3e0a7c574d63ecbd0fcd58026559a84065900270be75e519ec767b9586a1412100ed826447a4715d1301606337394dea67c1fbcf774eb7c89a24406b52f0e1419e3f4b11c24d6757d36bcd7d948b806e00019b60bf645a1b8b28cc4d4c80a69bbdd1a0edd2a9c7e7340d925f2c6b916675bbea6930201d6db3d28bbe5e0984ef89f1bffed575ea90f765e9e3e83f30c1a7658f0e7cb08335ae23ed44743064faf9c044fd33566eacbc8de42d9929d7fdc2832725cdd1690e296454674b49c2ffcebf8f12ce11114b2f4917394c2d39634fa423a744549d8878c030810451f3f0ed0023d39f67d5e3043145780e2e6439c6a3775c82864069432319e799e8c050b6541d6ce820bc620b8b15dc48fe13cd963a18d0c9ca687d3a981788d9460520714a13ef4374cddfbf55587a2139354f3183dd1369e0966322a46e0e4ea828a9624b545e91ad282dcd85223ddb5307c04178b92dd825e0ec0737bacb267e5b7855e5c994d7f03224d2b53aa0153c559aa17926491fecebb041a6a9317212eda8ce1709454c1268a7a1edf4d2c877d5c0195e49bfea05af44c302a8fecabd3e8d7828fd3147f057d741086c83537413cd0141a6c3ea109763bc30efc714cee5e03e5a4b83cf22c51ece55a969ea8586261dc8096a86c5da2f2a4d0e519c8f9efbff07b4d1282898cb14d27248b0bc62ab611ea5afd6b55fff6f6355017fe77afb1e45442e5153a50e5718ca1051b4bab8501108991d2a954c9a8fa571435c1993fc2f75ac2f44a92e63040405808c31867fde8a660771d055bade036fa79016210caf559292388c0b18908f55d98d7c098063c0c4ce598e28eb62056b23933d6e4109b93e8a72fbee152bef5549376d16742c6d31a5f9519237c169375ea4183723d65350ada54f2335d859e2c7237638be007b9aacb91478a77749f70bf1b83ea763070126226eec23482c63aeed72337dbee1b86f77785881a4d51c8f3ed8f117b9980eeba6d93c28c10e2fa68b476824094e2c8b0ecec083e1d5b96d29e6726f79ca3b45e72695b9be8a2dd95cd737cb6fead48ff0a1881008020327e1b6265f84cd5acd2f06e3961594d33fc2972860a4fe771758685dccbc9417b6821707b590c377cf71da2c651ba944b59fa85696fd42731785ee9043ad6261d3f2abb1ce80d258fd7439b08f5c6ad0f3bab012c54020de83d2cd2cada1b7f4fa63359095dd2a8f5951282cd7ee2a9831aca0532cfe3e8a80da08f8e6bed50b6f437707f06193ebe86f0df6859ad6f4e6b193dfe6aa3286748066a619e09065580761c9f3a4f432844644ae02bba36c501440413e07fafca340acbab4657f7922e65480cd112d011f1e946fd44427a618b381f2688019849a20e913837b57a55931e1ab8ad4a0d0435c0da39fe4008afa08621c3799d64692d86853ecccd2d1f02eae4b1bb1b875b75fef7e92308415351fc06d221130bcb21a637bc79c320b49fbd67f324377224b761fc9a46441a974b4da0098a962c734ec1b53c09350850c43749f57307f1fc96b6ed9b8591b7b073cb0dc87c0e28c38ebf61033cd7546225bda65247284ceda8cb8e2527f68eee4bb52fb8e7689c6cdfcd8c0970d2e466d1d459e1a040a714441cb5a99280ab69b85bf04a95960eb46c3957533df7c66006c24dc6b35ae3130b7787b18dd8ba9ad456c88d64fc8573aafc114bdac06027303be48bc82aadac491f3b2fde8510b06d31914717ef6aca3ef0325bcac344b22134595d8124c7a98ab3bca4568042cd7386030846341f36021ff9fbccac4ddd4155f88284fa22f85ac836a32700c84afb672e2120b2a87ac097528565cd97439de6e44cd42b072bf7505c2cd68b3d6c20745e765c550ee2e462928437cf757638b9d2c9246acc824c59a5ab7f541aac0333146f1508bac6abe12bbbc25b6fd6fb5b78dfdb401656ac47289b940346131410174bc508b648ee05948db8481eb145dd1251e8a98d40cc838e41b1a0613674753e4ef934be6adecdd88b1d1cc5c0e3af2026b8d4bb764de0aab8763410a8d32727e71ff4a6ebe0c0bdc3b199892e8d3744f76b04823d8bfea6db7630f56174218db6516b27f9828a9a2f6e6c89139b6407bad21687f800ad7aa1cfc1d1b6b553bb57698101e092a10d37adac9a0a862c3312e4de675f99f97585608bff01c7a1e921204af9a7cfc301ded3dbd63e7954246ee2d2b229e1e27a52f718eb3abaf381934a698ca16b2d34293279a14e5acda666f5979456e21fb61bc33a32a794f16865ba656c75856f87605165753a5b5960b81e46ccc7912a77dcf828f4854bb2c1beaa16a307a4117340d417b3da993a2f27e19345c2b0d36abac8a60dfdbd5ce5e53fd91b5ca442e459f6abfe15202268e8dbf8791d631b027853d10cd159092f66d08ba137a5135357420c880a988c439b4c354a4d91c3e7fae52c046bfcfc5e27234963ba148868bb6172ebf5b6216025b89a275ea9645481d6fd29dfde29f0851be2e79a703ed7ffd7ef6aaa55710542d9663bb6fba52e1153f15f3525ab3f931bb29df48dba3152b2e699d358e476bb6beeb75f86ebf038cfe04b0a00a6e3e24aea26636ec3d14c53357cdac991adeea8a0a3e57a5a68d3032ce47355c8e03446b92426af4531635402d46870558b37d1a107b6c7a7dd61e6e0269b58c269ecefc01cfc54e832e7033b28292e0125dc49722377afffba28cca065cc64b8708e7c259f2c63c4ea9277cd2f116b53a1aeafbb886c332ec6b801f948d61d0cb41d28a9f4f9bbc8d34264ad769f5ffc371585df338cff57b504b909965aeb175b10697ce097a43c819a081d55d63b4b1ba17f13b9a92f178a01a7bd5cc9f5d91d726a44ed463b095f5964511b3d97ed35be15a3b5c161de687c046c6ad72b965c2d12d15408740845423e566b96dc1b88116164fde6988bb0f2f546c09b799298938c97ad98f6c738534f499c0e9b25c6aac1491a59504414a8e3329e8cf81fdfec02b22d10b53265a7e03e9ff95edc2371d59635e873a499ffa2a6ed7b477e548bd4a639233bc9959aa66447a6821fd5c4167d27e0e36f3592ede66b9a2e5cafa613cfa74220b45baf1fd89d7ce337ce2e2d823728d2dd4234a5bbe1bdb77babd9c6c89d4a6fbfa9336418e42aa1fb584d3c598818ce72a32682fba29b0061bbc04df50d840299e3da0b56c51f561a8eb12db00a369a4900b63ba6395068ccb45ffd2981a5f0fb0472612ac18b8f800493586f49664ca7d8a7ceca1d34e6f8850b14ba8fd3dbbd98c70ba382d592c7fcba3a094319f7279f9541948bf1c2c0c3c9dbab0a119c8d500a51f38155e485a2ee192af871c568d784de826269417918938256c73d41c2b99564a28786c209fa37f9320bacc6a8a26a2469ec44684c8a67fe4886ba81a34dea990549ec79b9a93a67a8198615c7f3f008be1d92ecea419a3d70f8e080aa09b9a75de7a76e248c1dd8d365d0ec09d904d6f5f7aab67e8aac6c9739712156a92e78ad0962c932eb92431f61e850edca88b59f7b824b5f68f905a81dca02a444473c071d36cb79e1f4830ec9a12489315c77113ca55a204f5eee1a3d00398b68c5fc026214526ea7fc2b9b9604dba4497d56eacb9a0215875ad966910365ebdf4182c4130c663e87cd4be62309c9d8c47f7958f8696970bfd3ee9fa942d397980850d75994e41c4a56f783fa4b3062f9e54e64bf1504afe8e99cc7684244833dbb4c427b7521eb36ddce0a7fabeab1ad9285894a9a774945893f1f561bb971efa73a98ff472f683d3f8d453101a48d9c2abc72f9d24c10211875997a5db45f72a4248a66be83e5bc5cd9d0e42eade453eabb9591fb269ed9463839a834ae4ed3298448e6a4f1966bf4276fcde7cdfffb2ff3def79294f9ca086740a5078c839e354fcce7b20725db3e56ab8b0fa880c82171ef80d2b1c2bbc90ead375e1894bb1f21d6a9f1fe71c5ae44a3b686ed4e2c72b8414941a0dca5de69c80d134d368284a67214ac923446ffa858b547fec85328712ee147e7dbda19e6d25ebbc2bf07951a6a017c5e948b174a315d0486defb42c7cc99e26216c1ac4859830f695c102f7b96ceea3866ac72335b7b16644bcaa0c86861ed949f3850764a2391eb83c9958cb330e5a424dc000a990a26340e46176bbb61db6022657dfdc369e14c398a4ac511c656421be5eee429912caacfe4926956bf9e8913e4f8eb74393a487f1091a32b17009650963bc79150c954ed16bb2e0b86e06c418f068143bf7abcb4393461f4c05787453b018db1b7584d53033f24f675f6f8e0282dbf52701d1f4b8042160f487b817a35916603ef943212bacb7d30ee3361f1bf44691e85b79eba51f2198df7a154d2e9e985fb8c1ded1e41ee61b2804dd92e04ac6bce5020c71d187be1b2a298074e3dcc97fbbc89e6a0b41d617af12fd28309a597fa6386bffac8de210d60fa6943fa5b6cb122285061db773f50958c38d858a04e56794e644441ea933f7d2a1fc6ab1f0dc582283be698e47ca1ddf692fc93d72a96a23823fd41690fd2d716aeef604e30e5ff19923a61c8473d9b4e480617919d14eaec9febb05870ac29974901fe2ef0255307787070ce7732a048f66ca4a354e2c296f85aa7b4d8d2359f7d5f04e0a05772bb24c3a3793af39770f792222c4bd22a7c7ddfcca5764849763897ac6541d1aa703fb574c41737fa6725181da64569240a875bd406af9eee52125c63165773a6bf17f4fc32d7e8ac68b2acd87bf184b9cd44145afa5b7eaf5631c456614901fa6a542ae11608bd6302bd9abc5c57f99b4ad43bafa8fa1c8da3d362be12d0e853d213e7ff4d326b8642acb9a1e6fa8c7035b6291425455b51497d3b4a4385104d22ddc86da1b0af5808476682ca13754db2dc4ddc9b397df504c8f13a6a094ac66168ba8e435c97f8bd9a49b45994455da17020c42c5730e2347394b479af01ab034b41f456966c3197a3060e6a26ee5adc94ff9502deee63a0aca5c510453c999be177ec1d71bf4c62cbff6d7e032dc5522b40ca6f15dc365b0bc1984f988bea6df41f2a45f38ea4df526702469c383562ff72a93979e0876a81222ed4599d9f6661c4d5932249b52b56983e60ba96e67a515b48dd26ba6bf8afc46f2326eda3478fe3aa7c9d6d2c0eaf5c6889dfdfa10091e732c642025a1121bd2e19c5cf4828a6735556d610f0af42fab9324bfbf242128ccccd0d02771f31c1d3b978d62471e48f2ce23a3faeff5321782d4d55070d51d6b5564228f16a32c2116a73862f0c83484f6a17f2408fd739ddddfebb42f54f707531742d5c1ae6429215d95f98445e474265c0a04ca869db67b73b020815ca01f76c51070a1182cda36953cc80b16c7df2d7527697366d0a5405f383c31a22b194a3cc86a9e5422a7c94447ceadc59c39265b1b23a00b4e94be39bbac2120632ba61cc8341cbf1f60a9982f2d9a911f98c2737bf55c4a1765daa74bd42db5b4bb4e76060896b909aacc3632df1e984d6bb8feace550ebe05a88ba17c3a116fd56b9171b8afc108e226f7f79169fc3d98e3491d0a731834ed5eaeb3605da6af25868b1f1ba753de85e8089fce4d2117a1ac0d5ff08148a69734c7fcd14e8d0334b7fcd4549ec14a515cdb2a89ee22283d5163b90e382a445191e37da3797db2de419a8f2795f1f369546f49816495abc32f7fc84ce6892749f6432678df0dbbfe5c214836aa47a33a57ea31b8f918c8f1ce7a70a8298cb86e24987a1d017d98cd1df7fee3365f60d18ec8513fbbd89622ea53ce5cf4fc5fce53ff633da247e4782d74fcc45d0b368960f20ec3dbd5f453239ad13a4367e9a7ee26c990ff4f058d59b58b5844eefe92846eed984f481790e7e3e5b1e9ffc5cfeb2dce64c0a161f8ba94ceb48ebaa22ee2da5c788471fe1109d18087c3b035213c9f81f5fb8cfcc0220504142c034888b3a63180b8c3e7328f84642b97303760c2e2eeaef850351034edfd6ee10399fe4630d10091ee6ac5185af498f867a168d244b5d7047d1d2abd74ed0ec2437093d8c5afaadaf9c7c48352ce221b988e5050c322c30920fc4f1b18ba85d53eeb6daef09235794ca786816118d081f74f3fc25d651aa4e4ef1dbcf1b4420b26030c741617cc768d9b913af34b28c38bd558ca2b9233278d38b4905127806d482ef153d350d823d81aab9e2b2141e342185e6a2f009e712136bcbcb8cd02b56ce93fea5e29bf4b0a5c6cd1212c393fed6ca3f7ec173cabb4ccda7a4da9d73187b0412ac85f861101761699297cd2f61e7d280043602404a1b84888301fad120a978bb3b230d91c2e10fb12f019708b3802b159e07f904d8464e2064a367ae2a401210b130fa4357d6414da4b078401c6f0737b321d7a40f99eec0b466f7ee2ea469cdfcfde68824e03813b5f6f9fba57b7bba7245dc2a53588e492c203dfda1c5ec3dfca9c4c3ac048d6f5f11a61ae92d8daff4a38d5d871ec505bd5becfcc9e98d656836515692dc56e6bef7e471d55883722b11d414b71d83146b66d607dfb29bb4a8ed3c02a1fac3af0bd4ef033af6aa9a5c30922a6e0e728fcce49ed49718e2bb8182024a1433b08b0d072736def2682e08ee336c8dc9754276dd25ed14bbab7a41488400105044c48a840a645a1213d8de05fefa1e91fbde89e011668c5f047d63fbb7b4d1d2d226524a99a40cfb097c097a094fe61ce14a1cd3b7943960395ed3e7a04a96df48ce7b9687c17b96ee859c4a6a535e692a85ace092964a1d1dedfd0fff48647dd994265931706ed24a43b28f64b09548f57e7d19459716946924b97ff1c06721bf3791a34791e1d3f087a36e052bc7d5db6d8fc3fdf6f4b7edbb328794737a8eab1b57bda75cf7306cef95424a7f04a724443fc7d58daba86b80166e09c4a2f469652b915e0375a34a9d4eeb72f4526b4fbf2e73ba1f8e8398fee348d46f24cb9f485de2b8f105ee518fc33d4a3ff75ee26ccf52e6947ea3ac8fabac700ca24ba58e4ef7db0a254b1249595bf7859c078eae8fba80a1405321f449a2c5b6cfae9fc3c7554e62e266fd1005fa146b110f362d4931578d2b58dfb5b22a49b6eb6c937e366d439fdcaea4a15d49b41cb01488db470f4fd9ff4630bded1aeeaea1254e7eaecc19e5e8df3617ca24a73f1a9aae26e7edbb52c8ca6f2bbf6d9fb30b65b10c52fa1fee2d50212a64009b6bb8a721512155d9f649558004b12b97b73d3436456b432c7f9a285bb3bf1732bf0b497a91ecbe85e41ee5fd890cdf448277e57fb889c6aeeaab870648492a2211b5507a2f913a3adde7d7e19ef4e32d836cbf528ebefd11ff9ceef37b8943e29e1402a14b2465bd4083509b6ddbff805d8dde522940a88dcbb6bf91606c5b5b3d2a0aeedaf685edf3e36c9f7589939f54e68cca1a06d1091ffcbe7b4e67fbfcd7069940066a6bebc2eaca4068748b6588f51008d1ae8ee09a7758316f5f2f2a74eaf14f2a04f3279db9bc7c0bcd167190dcc790ddc390a81f49967701ff25fc96d18ba4a7e1ff701c2465c5b04692b24492b25a5e76f5019bb22f9bcb5afed7d7eb7bcab25f7bec6aa4e5f802f7dec3d0fd570af9be7baf147204e7fbae1ca910ef39ca75a4e6381a9a202d6f53029db12b2f9b7a2b2b01d4142d81ced85cd27046e8fa1514edeac80228abe53d5349ff69e5e9d7b086d1ffa361f4a73bff5d0065b5943a3adca35ea77b16ee88ae5fbf8e5e06f1e8cee5578e5e8e2f70ef3d0ef75e997364fb1c1487d3b19477088b3c1244ff897b53f72be4789fb2bc0550962e757448af13becef7ddeb8c5e077c1def79dc246b80c4200349b29445537bdcb47f39215e2d43b07f473e1a90e476a069057a7ceed5dd471dfecf5f3a14e8b3126d4b54a9f88af4f66b155785ef51bbb2dbc7be0b926c7863c3fb20e9c3efbe7e4f7d45fa36b0bd330309a0db2bebabf3d1678d9db565bfce561219be9b95c461f439435823af9667903d7a2a8e465f496ee4fea3117771f9323c8ad0b6f45667c347654eac837a85bbcf0062afb1810f376d757206b186c93d69ec3ec12e78a2a666036db5950a9940ec3f15a2b5096d2b1d9d4336753901778219669c7106655d569e5281efe2bc711dd7c1883c665fb50b7471deb88d831179ccbe6a17e72d6f30228fd9d7c519671891c72ebe184674ed85f97684aeefee9472955362bdba05bdc3e0a533f437bc8119ef8f03b70ee43cb0fb400f04bf7005fa8ddc9d764dcea6ded65a6bbd32e7b66d9b05396b3577b23eee77c0f79166fad6a7a58fca7076f575bf3d063d9c1ceef31016d5b4197821c5091eb49480a1c66c270aa787d027078b1169c3ce623af070f13c68d2b4343efa34d7f8c1445510d121dab9b02a882801c5062bb2c17c80a470c1554dccc4ae30b275404e1451aadd99123068f6a5240c29604b89183738d183174506080acc49f88a95208d20acd090b8b4684688c0e8e2abd160b606e744b528a064a0287cb0831088d4aa228a1fdbaa428a151055f1049231ba5dcdd031b8eaeefa10a0b2eb4fc055a84d5762ad02aea2b22ea66c2aae438d3d39c13eeb0eb54e02e2aa5a61d7c7229c5df9d32ac5ce0febaba0934358961cc2fa7c8918d4589f7d811134d6779928f2c3faf00d2ed6978b2031c472219e10b13e8e480f11abfae00735d6e78196ac501429627d1f68c92a851242ac0fac5310d1c21300c12c5942510f5cac8a8330dca0b13e8d46108b2ac9420744ac6fa5893266accf14e4c30feb3b351154637d2c53e0f0c3fa50b017ab3ec1021f17eb13e90d5ea0436ff0021d6fb176725083568df5d522caa0c16897b1c5fa60bc529812b47c3802637d2f48a6d862e8e504d3627d315e694c55228327dea8b1beb116b5f1430fccae77c4b1ff1d195ba051762dc7164bd586911ac0585fa557280184a1d3b56465c20d1704b16a0fa4bc581f0ed09215c90888585f0ed092988a0f11eb7b87620b1c5c9614411dc10a88a8b1a80fe0042d595ac11b33d61702684911788b8c1e19d09222a03220604163d11072e08809c1ebb82d871042083a9ca4ac4e0a6b2bcc79cae132305f26c1c9ccc9cf36d7792280a9d01c611c943126819e496b68ecb5951e6cbb2d4f532604508b987cb142675378839f14ba306467989b49756fe4e5603032e7156dede5b88ac211c5a64151c488302e2f238c1883039583e53e8931c63f2fef617b3ff06c6af1cfeb87fa0ee4e512c43f9805d80806c246300b8230d0f55e1e0f36724bfc037e5c082519ada3de6d0300d8a34ba7fb5be9f4e2a9f42277e24abded083beb3bdb6e57dfde23b18fde2e7962137cbd525f4b8400f098192100e10d16217461c8ae58d4bef2bc97f8583bbeee2ac17bf580729847cdc62ff0f66073449ba4f95eda1c61e3975d712faf355c98999d7be0b145d8d8479f30b801fb96a9dd919c00dc848a7df479772561f30184c1048d0ce446063262caac62ecc31699507702e42426725b7c601b9dad5940a1da452944289e2439d174c9912a4b8e106dbae4486d9fdc9223b44d971c11dae7dd7e648a5dda74c99112049f88a4babd386f5ce77d6038a2a595d20a8f8b13dd5c096bad2b26d9c7844974f314de7b4f2c59c058502c2826b20f08540baa2517b5882de21ba3364417d125e3c07d68b8bcb8bc3421c2a4c6bd8c2f2392263f4d7a9af4208220088e304d685c3541412291483138381c3970e4204921d37ac17f454ef7c5b5f0a6b22645393ec76bc1a345912b9a4c26d393b47b2a62616161214b2d863e335a5a5a5aca1038700c171717971064bc18c77194d1d135a958c000003b00b0630b18e7e2b4123bc01c3972e4d8617237093365a666708d4881d5dba29b21841042082204000b970e1d3a74048087d025b151c3293323cc8c904551165382980ccd38b0360209239030a405165cd805093424d0dc2859a6aba02981a6846d08a64b10400902986db1461a68682101982000136e149836a18709263cc932d14d12482081841e3d9a0c71259450420903184013245f0d5635ab55d7031259c9a2e6849a9a56b7a96cd67382cd0927804b80b2590ab8d6cc071b146c421a6a102a499f86989297cecca8ccce98d16642b3293627040a3e5040a189d03e412a6b22bb51de470a3e7c14d92748655bbc9165578d2d561d2a49ad00da618b29a410dee04b6798f0ec6d53991324368d6d81c4f3a171b2e344e7855485a6b22d5e7b53d916aeed0f5a295b240088020a28a0400002a0ba482185145228400158625080f0a6000528c08f1fe10df9a245d11515f0c40344e85386479f662843c5cd21579df77de87bd287bce6352f7222372b8a47fcd104124fd58692549a5da9905d89e2ec8cdd29d91d49f7bbeabc2f3eccbbeafef703a218ebfc2dda2d6587bd6d7fbfb5738ec5bcd8229468faf41a9108e32bb3d56add106bb558f52fc9d99513556e28886dffbaaa47d8829a4d63a6a14f27aaed7a8a4ee439c0b63535e174a5b39aabe90d92a871c30d6108a960056eb4b1c3bd2f2595edefc2896bfc8855c441193bdcb8bef78a6c14c152515de8e08b9a0332687073557077d72db8c00b35d0d0810837d6607915ff1eeeee9b0dbea2e3c238d9a7cc09fbe4d1c3471797321963897dffdee7dad8f7b5880314ecfb8f8334f67d930cd9be4f436564b8b16f14590e8ed8f74be1cdec16f1c0bbf7de7b6347180387ed4ff28212b55a2d12b0ea9fa7adeab14f18992c0ab0cf1efbdac00b73dfe7b40dded8f7452bf6fdbf3760435693edfba3f0e6d6dc7bef901508218312c82007378ed07120a8c173efbda89d7b6d40848fed0f8251833760f6fd2fbcb9dc1a41c8b706496860c6be5beccb7101650900f6fdad0d2874a6b335b63ff668570c1a94fb5eeea342c6888e204612dbfd7e8dad008f1b4110f9a20c2790b06e1bfbde6ddf7bef55a2cf0fc38ced7f5d65535f9468cd81a1b37982c078f15004060a7ed83eb8c03062db4ee20f2f4fd11eee0798a7e83eb5b80511453b88960c0c293c00d1b381806931263303f6460f644e66588c51860637953999728393222ab8c0c10b2e88b04ab850011074de54c60590193d53b478a2c39419ecf369d4a04b76aa6ccbf2e7e12a17417fcdc60d342a9bca6851eaf3d854460bfa669bfba1db8ba6fe18e568bab6f21f9baa2b8e1684ae708c665740dcac513607c5cdcad54a8ee6a60482b0b71bf6f6fe9466575febbf168d0531a8e4931bf25ae4b83dfdb12b0e0c9aaa3fc696b2eb7bcc7fec8ab28076f51847fb536f1cd35ef2c8f298f3d772954efdcff501b92a89afeacfebdbf9622604b2ceff7e76edc13a75dddc4810a018904c200a19a4a830a86bdc27bb7ec53cecfaf5dca6ecfaf5e4924882daf8bb1a148ad0144aa5c73ea990ce0e4fd15e639fb58837e3689c10f7b3eb6f535c45b411edfa98873c846318769fb88a76d7a036580c3d52373d075d9318a1cf1a8301b571dfc61c65675214a5a036f8eb7f98c400256363c00ed1c463e3f6746fe4cb7c14d42663e05a8ee62a5a8510af5d9f83526b88804d01dedab6c400067239d69d4b1a65e7df3e9718a051f6f6dbdb72b43f3ccac6248db22fc9c374d31c697af858e3a366d7f1870a6e568ee6e5a939daaef69b9daa7c54e62c6ddde2a332a329b4fd3dfa532163dbf2ab62d426a3296470552d47ce4d1f7a6d831091dac3f62f360d65c104fa5f6cdf623b0abb0ab2026efa5b3c836cfb67a0ca66322f90549db3c6bce862fb50ebef515c8ded3fd8a78f4d87b6d33244005d51ae00dbe9924c6d58a0bb0691cedc2fd9d566ebc6d9943dfdacb54add8e349da967750d8d5dc98ddc06ecb63f5a6a53dc756e8acf56777b31293c439f1cc8f170b3737777f7ea6eada524afd65a6b996fa01ca7eb905d771661549a772dfd8a5110dad65a29b509c31beff32808ed07a05820b1411a8ef5f39b36feeefdf7f67d76f4376ce1eef04d1e397bf4768f4a1e8e00df0b185204900d690471c5111adc8045698af423529724f2bce70676f838bc09bf1b9167ce1ebdff4afb5ed9630690862606dae4017adff3e8de7a08b0fb7b1e39bb7bfba6e93c7ab8b9953435983452b4ad29696ad027d374d3c288507646352761c328a2e9a992fa5e8ebbf7de3c82fb578fa6c0443e2ae37d2830840132fec08a5aaaabbe566048ef4712fc17d2f42ee4e95b449695d2ff701892b258603f35343531545aa5854fbff07bcfa3811e8d466371008df60007c4c0f21e2afc42965247c7f4def7e1b0fc1ec7fbef7424c88a4a8bd582e118e4fbc20f83360cc3d0c4f2e18765cee9597e08cb23bf0749961ad27080baf3d7308887c9188afcb8696b68e80c0be1a6f1cf7b1858401762700501d2bd4e1e838cfee0e8e0e3780f8a5e6a9bda3efc212c4cdecd6ddf71e07b8f03be877ad0fbb0cc09df2bc3075f08ca83017c965248089e564a1d9dd27fdfc30347fa0b492592776915687352103e2a736aa29a9aa4ca36576776d5f2f67456216fd5a23c545621cea5d4baf41e459e449bb24255a8c67da0aba788f5aa423556838208d081a3277d0ee81854859ff42633469f50059f8ef461f01e2c8508398203be578e54c847ab67bd562caa5015aa33a8585421a151f7b9e02b910688c7c07d7e1ad27059c8f075bc3f7d0df7f3b3909455635732780d2d1ab932c8578e172cc7fb3d4e773f272cbd9c53194309c4a66c0db25f89ac2c4c6a6afa9b484a4f9415a4fb1feea4cea84d915d816fab942d649df3fe5561b6cadcfc098bd06715aa4c5ce5aab3cab6905799ab9c05e47b6b1fa4449505c4ae286b46ab15b97ed28f3e04fff3be7b17eaacd62ac90e1555a12040aa9026ca7eeae2dbbe7eddb9307fefbd579b2e3531e4f73024f8238912c911bb90232e91236e2147ecf7efbdf7deedde7bef353d65ddaf3ddfaf3c0ce09bc05fa1424cff95237d90d4f75e7c6f69bbf7debb79499b9b857234d58431eabfd7393d884da6adfbdef438df9b50ffbd973860cee9c17cc4ff03c9911c73f939dfeff1daf6fd09cce02b548cca8a70010931f361e25e990f8fab48fb05d37f8f63facf2b7358de548e389738dd8365ceca774e06293d8a147244084b39fa9b1e7cf04fa49095727cc1f4e08f5ee298ca11affcf723ceca7fef23e6216b80904819c0dabd17863d7472459b3a927be0afffd527f60388f8125db496138d51225a44fab3b6b61749ef5bc8ee5124f72792c54472926857d5f57af17159636245c15da2f8db77cfad68da6d37160b627abc6331d6c6e58fd8d5ef7a45877b0f9738dbebcde376893c1284f49f05453a83ff14c717b6d70f83f7a5c7a4ef1a0659f11f255d4313d331fdca7b38bea0bf7b1cfd5d9973247f8ee9f5e712a7f45c99b3f225fd1c59f24813c779d9ee92264930406290e103b31a51eb877dd390eb60edc5a4235570ada377b67dbd5359e2dbd7a53fc5a7f15c48961749d3b790a82f91e0af9cbc8fd44fc3119756be1f7655613f8462d02edda2e956c5306d770dd707fafeb7f9409f2fda947507d0680fa0b1a103e84c0c96e3b41645d3a4a1a9a9b9610d23f6babf5f431afc6b701a1640593a3aa867791df04defe588cb20ded36dbb72f423414a6f9f86e5bfc761f9efb9d3d4a6b73521109a02f627406db86dad6729a56d15a88dbffd1bba72003dc3bd42b8bd8cc14372fa95dfbefb1cef515d99d33df87d2d012c2c27f285661fb3a912e828153bc6f7c3d74b2e57d9fbb4bb712c9bee5477f7fc4f70bea8223137856433540f7495693465ff6ebbed2c065d5d9a7232bc9b97b939a2b613fafcd80ba1c0f14567ece3169da9ae011662b697ae172afefce92cc0860b303dc516578c317698d1e90153998bdcac2b981a60c1dc218a87d6928ffc51db6bf5d0431686ec244c7f4b7007f5b22b5369513da391178b81ae431f33954ae1cd37c54d53d3341a4345a46d5f1755f1bf44d4e6bee832b10cc9f42026431436f172d5ccb60ff2f80ac583f2f1f193e94fa68c83fe8a8aec2ad36c91e94f7f2aeb503904a5566cc2dcc7f2108e5ddcf7dddc3cb021bbba4e227da2e8720a6fc0ee002b5f62413fe96bf842851e7dc7c2e8fbedaf93b492b042523a73a2760d5b4e71fb0ab43cfdef0ce276d4cbcd50a63bf2f43223181e2ad19010de4241a90efdb8465825d9f63fb7e0eb654ba00fb5a974c6bf5ba214c5ae54ecca82fa637e4b58c54bac4574115d5c5eacb516861b7be80c92fb43352528930d9e3ab0d83a665b070d5462c87a39e43d233892a44d9fa3f8ab8783977dcc55e3e72a03fc59c2bf0e8527eaf542e48be47115f7f66588a84d8bc784ee197281e505cab75582890195688f711cd8085ddfdd9d1c2f0e7c025ddf749f52a16f7d166d53e26c579c03cc1fde64286eea1a42783302ff05c9d8436d30a5dd534ae9bdbf9d393e22fb44bdc8f3a3d9f0c6cb5ccb3437a1b85984aeaff3bbca3ff6b19779ca3ef5d2098d7ad9154b89e2f194fdd3a9747f99af584a54cfea9998ca9f277ba4027d66dae973cdae506f5b5a50e50b7dccf484a699062ea1391349926519de50374b1a9db1af6f0002813fba8c967dea28f40fb5f1b68589b0419775d0755657c905ba844a17a360187cfb2824aeda8292a8362126a827ae1aefa502aa60045472a672cb5c72957a4a3f2557095f7c296bca0bac0c633a84f006fca133d66563fad301ea086f341437ede700089f7ea9f07ff8278208e14df8df4c787359f4bf1146086f2e091bc67704fd3ffc2381049ad2d38437fac32392e38cf186378c3dfb5be779dee6791daac74d5411377f502f3765a043f08660290449e4f9d1ce194aa5255f54d97489174fb6099b2ef9e28aeda17e4ca009268437e1833564c17b2fcf17247aa480af368548e3b798d4813f9844c2a6d91a43a40e833fae3a350dc85520125779199dab3a1d42d406bfcd016e75c80b57d8362eb16bc8baffe7cff983fe1b79e6a843a70e2cca5324d29e69a511346247b05cc137a846eb514076e52cab63676fc87ca51302d1a08812d10f8840b7ff4c5ce565945c993692e9b3e4ba1b77c3715b783f9397a46e8631d07900f8075dfff42c7ffe0a31fb6ed3c7ecc7c64b93697645a389fbf44fb329fbb317b2a91148c39c1fef381076fcb39aabb68f811f7315dd2f137af234907c999b4c5ee89fb849fb58f83fbc92df67720630bcb91f86fe21393a79c15545a3ae71d6945c74660a0dfee02f34cafbfefc1c25c4b6def6af74857a51d40ff4862e3c681ab539a16ad4e68bf212b35f08667b7bbce340eed9f30d0c289328989b16f50a512f144f0faa88abc2b78ffa0949140fcac74d8bea411541fd84a857929f0103699aae8d57d37c058630d05f8f5d8d30a0848c8e7aca32955f4f1d61300919bd4c427cd3b34ee5109697e707dbd524512da448a25e3e00f005f6ecfaf83f6653f76b6bdfb2856ac3f6f28576dd231d7d7eec635fe238ad45f1af69965ca813184aa19daa505f02772ac803ee8864e9e503b0df42529b6229c1b62db9a4e8b188abf04ad32cca69ae8b6cfbf6f4a6127543184c8f2a512f20f4595d44fb2cf990236c2ce2a67d4db3ab92cb53f6692597a6955c2f60164b897a1dd1f8cf8fd178a02fb5f11fbbfa271ff394fd9d1aa943ab32a3223425cab61f7b987d56d70bf96c8bf2214255a81ea8b94355281ed4ab6ea14ff027d3fc47177f2ac9b96a5c21669b9b7e25c75beeef0490d215cb53f00574c552964e1a8a6dcb924b06db3e2abc2985510c651ab5f1605e914dd56f71ae5dedcb0604eb144fd992cbdcb7ac4361903e336dec19617675fad981ee5af1c7f6891c7bbe1442284ee46822eb0e3fd5f5b3edbee5d86344e73f512f236e965caeb23ae8b3e42ab9dcb42f97097d965cdbfefd13f53a4b46c621ce1168db2fb95c75775eaeea71d5f529c14a3faeb25f32e2aa0d0889ab92b86a2bc54a325731f9d9fe27cf847cd90b7d2c6461db3a84e88cfd972774dd27ea157b651440d3470a043053220480c7cc0824d0942000137a0c807c558e55cd0936386250f09102012ece5ce77d254d837aa15eaec2db3e8ac7c8b68fea7195b8eda3622826beb299a17c5c45653d28b22dca0890927da23e191a5aec132543c1b6fd8c6f4ce62a7bc3b6570791f67a248b8fcaec38c6ee60e54cba39abcbfaf2d2843eb90dd4fd9db8e4dc9cb2aba3b1611706a236a7dcca3a5d8ddab4ec2136a53db8d28bd1194bc5cf8e1458db83e3201ce47285f613ec544422c2ffc55c582065db53d1e7f24367ec934e44a4221dd3b2138cdab400bdb45cf0519973078e0dc4decb73c9e16d29c5ae2e0aef8ea688629f249e6ded2f319aa28588ce1831c5784c2e576887d95fd9a233f65dacd022163b7079de25442cb6b53b5c74c6e640fb9f31b36dff2c69db7ecc2c86860386a348d9a2362d1e13da14dbf62b19b377d4dc65077d725b733cec831ac65481722f2a188163c71c26c1fcf72505dab710faac7667dbb798c762fb83811e23c13b8e49eeb4edb7ef253d2674ecbe61b7bb6db537638c31a56fa9c532601d88d4de6bb1bdce6d6b3187b105efa5df0f374397de7b33b4c2d002866e866e8668bd19da74f8bc861a776aef575baa606bf08b2b2005670648c95b0d5236ae06299c5dd5db793548f1b85b731aa4988f1aa72aeef36f406e4640feedbd8df4ab42d9e36968eccd3f340fd3bc186340cb3cce57dc81b8d908b80a0c0f600fe0818e13faf183ebc08e03c316382236e79cc419515471861128dadb5476860ac43384d839e79c83802da1499bcace70c1c08ca2fd26918c9019253a439f4b4229a5a55b6bad5b6bafbbbba5ee94523ad2d1f56d3d4523943a116d531a545bb51e740fba9e711d665bf4a310d5a229b17d7a6bfb3e5d67fbfbce769eedde23d6764512b32b0a258d14c4808b22663041c3867d562130b67b6dbbd316314eb0851a32f009028de5ad7dd69e1d00ed5ac4633625630ad9e003126478d1840d5610f65923a5b57fc794e00910489ccc76682c7f63fbeb196c772d6060f629b3839a083cd08107b42945b82dda95cb7610b4bfef7378f3f9b8d5a6ba40678020d13543df9ff7bd46734bafb959392fe24a1f8a122c4089e226dd9de778e5e0e1bad46c73a959979a71a9d9cce4363c84a1298bb2f0df3f3d187d0fc8729cd6d48365d8ce97a49c4d656ee7c75578767e9ccb182e52656720243b67bdb3cd4445f2d7925569223fb755a0fc1e1257599d9ddfb338ecd34be2c976b6af1ba336a89dff85626f86c34765cedaa24baa38a2c5faba32677b5c6b60832116fe212cf0878c38d7e3fe9623cecd7f7f080b24e918babed39ab811f1dc14bade2c7e783588d56e88bbe561499525547665555abd1e348dabe8aa7e0d2d9f86c69ce8c17e7d13b66949a3532ad0a7deb4d2d22381ae5e1874e6179f77c4f11e7cf05eb034ae4065409832c2603fb014e2bd3f659d1bf09df3e31a72650b2b630ba58dbfb4f10fbf40f798fb4c96630bf8b9c7cf951d701910a6947626a90c083f1b931928e9ec5ec54765561c101060487c97ded8ae4fe3c3571b8c8da05d716d965b6cbcb1cf1ebb3eb54e6d6a05da0e992fea4a85a894d21e74c6d2d03f65f6c3dc7bb913dc20c7e54cbfeef0d6778a7d10451fb4c796a12b6d5322cc9783afece1a97b2fad01b23b51864d53cb4586d1e449098cc3d5a23e69aa6b59073bb480ab42850555d05a6541ad48573b7244ce39e7daac23826b606c351d6ecd04417c10279519b14f4aa350645476d8d6be4843aab2392a1c11cedd1b1ea0d2a05aaf7eab01e82e2f404307ec4ec2eb481cbacf191282ee3fe7dedf820fda8eec3e8721acaecce17bd04b1aeafbef207b2bbb9248f75e5776efd51c72e8bccf81e640cb1cba52ac7fb3751fd873d057dddddd9d5ab7d6ba3b9d711ae0bb3db523eb760fc9d581f8a8cc496bd6e24cc399ff353434406cca7fc41084ce6ab588ab195f8c61b6c0186329d2c062d7d7565cdd45492349b7a92c8d265ab0a4b361f6d910cb54f45c6143b5360d9fad3795a5b1c3aa4f4b21f42bfd5a8eb75e13ff773dd0f54f707253436798e8df67cde82f835d8d9723a9d76c775bb3ebd34fc14791c0f83ea6b4a4ab8ecb5b477ae94f80f77e3ddb92787f5e2df53b72c1d48a338c6c4b76bb8637a20e349ddd2c3e5a560ec4bc181294fad30d7bd53fcecdd29a2014dabf7e767f647edf1dc97120e6c590f062b8c74d0b82d999ddd0375bec835f6e5a0cc345f04f137de2d72de2668f5de11f0c7313893e31106cf5fde37deb0715d927773d55ff929b1251144929277810448436a304ed9048281c95faa3e7c2c3810facfa618e251f0d003ab156ab3e8823069d0c3e118a0d8a9ffa5e4b13d7881d58f53b94910d0a1e3896224a6aecfa7a0856fdede4e5a00756fdfc0561258bfad85b834b52ffda1d844fb8a0bef531ba274e50df2b17a420b45a2860d5af1ef3bcab1369ecfabad6d515a1a042d7a7d5d23dc4569c5049a82454122a0995844a4225a1925049a82454426b0dd1d0d68668684c6b42d8100db7d6525ae25cd9c0f8c18dfbe158876768eaa62dc3d80782ed342d2738e2a75dab69d7b13a39d6ea64cbaee2aeeed5c9955d2b39de7bdad8496fd78aff23bd30a133ccae32605344a86a026e5a17b579d915f736ff6c9b77b6cd3ddbd6964dc97081bbb564702217b01cb7790d915d8d75ac5b29641b5d48e7ee5557e5aa0e9dc981ced87732dcf5921b0a5db79f3466c3a6ab7ac310341f9c541db0f0e1a6b9d1fcd7b4745c40497cf5f2daa912f381fd20b95e7da8c0a4c64706fab0c0bf596badb5d6879bd8bad4d019cc819fdf7b1937f1e314fe8e3479e49c7326471bdb9c4bd14dfc18cbdcc4d65a1c7313e3188ed9c7b806cf6e150fd6a09d9c3bdc615c815c45ffde0ae4aa0a44bfbf5f836e45e2fab4ed572440e03e2b103eed4c02b979fdebeffb953c6d17ecaf824ab6698b2c7a36bd620638d8951c7149c2566d1df483961c360d568cc2677f18ac41bb5ad1a2ed5a6ec0370ddbd6c06d8283fd6d6025c1ed24bda20995fd716025575afbeb4027b5f061dbafe468ffb4b7ff3cb092de46627f1fe8a4fd4a6eff69f05f98d033bbaa2f9b8a2288dae0bf9f637615de23a879ffcc49f6cd42fb56a0fae3e611545595a0e6e57e94a81fb4415c4b15ccfbf4e4b1ef8f3c1cd140b26445e2e6fded0a2d8076ad64b8bd2774cd000d4444442e2cf1025d55266aea3e9088cbb32a29d5f2ac52ecfb67b7ef5981f4c901ddaf482ecbbe5f6b758aaf605e354992ca64b62f6ddfbb652cfb406b03b7cabe1793f55500e20249caf785314d4d4af3514a29fd21b56ae0a3326709b04deb77efbdf7de7bedb5f65a6bb99577bfd2ebd10e76dcbdf7f280edfc27c8c3c7cd4cda5fedba128f21682ae4d1135ea1cf98564c2b46e7635c76e57dfe98570c8fafbecf1fe3e3aa181f32c623635c36957f2363606e16719323716c70877bb4a9ab625c6e669297312f37f3b762beb28ce26639e4662e6b6e5aa1cb5a1965c7ebdefb3576f5e312853bdfab2d4862974dbd2e8db233153be3d7ce38f6b6c24647c54868e71ebb32cdb469b6f39f5cfe6f3b57d8d8f9c527a619f7678b1b3bff4692407426c7b49ec4b85ca16f00627426bf8b153aa6b5e3d53d8d10b5f1efcaf32e4164e7b3aced4c234467f2fd73078f9e9d7fc76b47cf8eda8e28018871e4172410b5e13eb72e50cca632b9bc4009b010061f95e1ba4d7f490e1e68ab417635d6727c01e3cf5f6b99cbb16e9f4359b87278880e713eb0400b7475d694fd5a1bdb521f6c6b8fd03464adfe32cc9081da23026d408d27dbeaf859af57990b54556398e8fbf08e3e6536c53a68fad4cdd447654e1d44dbdaf08603c3f073f7ead262689a0ad9822007860f565c5d5a0c4ddb7ec4be0d0cb3abe4e2c11018b3e946e341c935b4e52a99966999865fe3cfb65532945ccb43794a26ca4555b6d6a6b3edb80adc5e1bcfe6b3652e04c2a12b832fd0748376062ff6559790beef272e67f0a8cb0e1ffb308841af0b7187434c4b2eef45051ff33c8fc749da955cfeb58ff24353bab00bc32fed947636d277c965571f2bb9ccdd8ec33be8f031115d92c14dfb6ddbc602dbaa8e9b1474b2e4f27411e83ab812b9cb5fdee33e5ec457a85aa5a2c6cfb65f8bc0eb5f912eaa3b1e22e0a25eba08d330985dd86522a92d2b1082a36d695cc77dcfbd7d0d45d34097a38ad8f66dc884067f7eb67002e106663083411b4ce266fe0959d8f6c52e3af3a259d80e2e7b87d0a097b5b502ddf2903cc17d823f25239808ccf1f58bcb24586e12a78c3d3b762f93302171133412e3bacf44a24747e8d39bfef47e4ce508034a080b0b905d8d38a65339c27012c232d53006d39f9e8630b0941faafc7a4e240c08e7a0987f451f958fca57252896331b1500db37b32bd3a35ef6d3015b60ebc5f57c2c01a36ba8d46c9666410c95a21100000000e314002028140c084462e1783409b360593b14800b7e9e487656194ad3208761180619640c208618450c1001909299d92000a07107faafbb51a20718060a452660dbe5806892b4a1496bdb1862281a782837682f0561f25741146fef711ce104eba12b33ddfbf8fbbddf8f84a24e64920ec0f0d4e46c357b4b8816180372bea0c14f745fc50758933538c432cddc8287b5c209f581723f822984a92ee7a1ec8cf6213f7808e3d9e855ac5cfee75e17c78830b2530614093085c52ad47f083379be4e40392149c4f187cb8d763bbd98c3dfc70e98f943724ca44607c7b0a5c3dcf434fe7ba850bc1c9d879f9e4291e4b2edb3a2bcd5ad3ea613422b11e0ed8a5bd425dcdcc3e68a1fbe94ce169296142d6d3cdc0e8263758baa5bb7c558f4be819f25ea365164f156286f8a89da1ed3fc24c5d8f78e1707db8d6ed38477d705807daa315910d315007c83c9a08e2ece2f7d5956a87d21989c239c3e287bfff65446488fd1aa690b516aadda0ac8ef1a42cc70e6d9d435af783e8e95f7d2bbef7fc2776e75d03e9b12b0d7370fa81232222240a9eef4a97a35de7ae6079683a48579ca00a004ae8d6f25162044c8d51da4af3db33a843a113de9ac44ae72a0c6569691a92211a0888204731871f5052280727d271b503c62e4a7bfee90e6483c27ca6a05b7466dce935e6d63b5a0c186ab4601b0a0c99769cc73389090b9379484d346b7e85104b1f4333d2318551c2665948375c828a61cfc9caf1c14e76cc5c3c96bb5a2f994e63f93629d2a3e111af812247288d45189169a0886747d8988bbc9af65abe634381b5d9111499ea98e2e991c01b749e93d44ce87a2439ffd1ac6942063898e3d054570fdc3fa37d918cd17aa1e1848c682650395481bd01ac74650c55f5e0f3b098b2e0435309b1395a2696207536a4c50d22e3ecc1deb3cb7e7dce3bbd123a7ac6e9b043c5b84b7e971cb9f6bd97d681f96bb554ac3529e71dbfe690daa4f2267bfdd5f31b7730e31bbd66ac4377f1e53a75000bd77691347a7aef9cc000cc5b6ebfa260b7aeca25a333b087e0d0f576434ca7cb53980bd935237b050ae106bb7b80b837eea883dd7557455d05b67113b20e241d8bf67b54157a671b338f06774de732ffcc462a6c2ddb6fe3ab7f4f6dd86a611ae433b0b38a50329c567838e949e440a20b92de70f298d8b745643806d76bb6610ad85de34e0180cb09caf17cbdaa34d5b2d0a8a960cf4c1ed9aafeedaeaccabbb9cb6ae91e2e7af12ba109c81b7478bcdf54a558f6b44fe0791ac454b1e6e0c3ad2d059b9634d659deda9f46f9efa6ffebf4f3a8108d96d24e32e7d7dd5b7332808a639f544a4e0dcb89c541391b1547359da5ad2d40f5697952c62c8f81c1b7d50728212ec2659cffcd471c738a16afa1fca14e408f1eaa1e82a88754aca7251162ceeafe291401d62f57c03b7cfb3ece705dc7e82bc42718447f761551d627ff3943f46680cbbf2efd0a139df8387e236ccb3c87319d88e67cb49cf1205c5fd3dfdca192a73a450177baae1de004155567c7ec4f3b1ce94b8eab15dcdb76ccc4d63a74ea4f6cfb96a4db55847e1f29310b13b5f629943fff6042c9e12cce6c9543a398a699d47362c130198ce4439c5079d8450fcea6d1c1d005f9338ce0227532e54592582e9cac45048d4aa75c8b010dd97fa8f28a063627d591e7f3b94f6fbebc40ae8931422c134b9a9679199fccbd092de966b86b5daf0ad191852126106bc070ee22edfa2a39feddf3600bee5d2273a2527d8123f9995bb4e17650a9129bf76cf55dc8991dc621da8f9a60b3c4f0d2dfbf2b782a45977e06af0159f39ae1f9d185827a1a9836db10437bddd17418cd518fe9a3c109593172b0615d666412afc28a462183e783d96932b4fd42d2a8c45fe7541a538feea3c48ac7fd7f3f0ac135f64c7db9a3aa17a5141f9eb78ccf7fec4a261cbf6c9b1568ae33b6f084de43db81cad77ab0c5683fa6e49e022e5e28c8b7fc4d5c813c1930e05ae77684666b7da6b2c981fa54ed53d67acff8333eca10b9eab7f5f83d38fb0cacdecf193b225a134f95e013a837dbb2762d92a5c550ec4fc814e59e542f2923a2b129c5298f75901543e2bcb31cfd84d000bbb06ea1cb92244768305525a62d89d6224fd3c4bd2e2c9334ab819bf5f4f7170ebb416420140d512503dbae5f297678378b9237eea1212acfdd9ab43c0ff99a3eb47d71609598d15fa79f44a1dea842ee8d259430c880d68799b0e0d24ecbdc40a7bfc00b32be7db66f9056e1d22439ef0b7b8a65bc520a28bb481d2135efbdc1266ad330e3780a461d84b5ba5eb7f2499063ab24aca95747db81efe1c9bc9d5976f03c0a9b94b13e108c47236271fc36a4fac734236dd7a78dbee9a5d0ea0876ee33de1827765427461e609d3fdb8294878edfe8878acd7320ab8a3bfe2caca13beee1aa4d0477b20ef84d20a3c0a1decfdc0911e408e4b5db47da7a2db2d357ced5bb5bd1fb23ba3571e7ef4fccd920ee04595af5c4abfe63ab77807746c6a1353bf0d340611da4b1ff3e0ffcfc0a6d55e6c1f860f5137888d295f09517526c75c67309e9f92efb12b4c2c8aadc57ece98201010ecb6c54e1befbd90d2294d5e343b17177a326e604b85fe639bd3ce3b71f00ec935bc2039fc04db68f7e5ad6caf96c62790fd67769549c9ddb88a794e8ec81a29f48b5b0d81a41cbf9cd510ea2b88a823f934a27c6f648ba21beac28b191440a8f9ccd79e79f5efc9a36460a71f6544951d02a3e6aed5ab2d939477e91f5fb79409abcf77108b134aa84571107656faa724372647925ae206113d73adb5394835ed12ec9062a986f99ad93abfaa971c996d610e42d4064bec2bc3ca4db33e0199271a13e7a1deae2c7c481394ed3fc2809ed9ae2a3f8cefdb820b07b84221b0332d59a254bb21bf270efac3cf75e0b6d86f56491c1489692819dcd25b8f9645a3e7414417ce74b4f7e3c3388d1018ab19a03f16971721c523c36ae4cb1fd00a94643f88429022c77692d2cbdab98cbe4bce0b16232fcf85f93148971a8a82a98458cbeecfd8942af4e06640eaeb51bb48ed7d91d4d63f2281fc167ba436cda7b071183a1b24eff85fa1e39192d5153496bdae0b508ff551a97256c6fe1f840767195f70d8ab0c6848a9db527224fc89fe5db603ee7f96ac0603a804ab59fec8d888158470eb04cfe2b627a8f309a82f00bc3a91c011c9b0e24beb6ad77be9868ae77b0226a2bd813b793901766dbba9e264b5468b6d7f06daf547e804b1b62cf1a1105c9ba25def2cbe8b1d21af75ed04e37cf8914d8e3450382c06773c55fc3975e5183515298371556da3249f3756421bd576345e9038d931ec6e12a659965cebacceb5fa5abd2b9ad0154c8a5296d41d287a9f50343383076bdd47379e51cdccb1ffbd6f7afc828ec663f3edf6fa3230a3836bdf6e8745a882ae7e76b79adc334982c87d231341da206dae899c42b28a6fb829b012ae6dc1638e7e07dce96854e97b61a2a9db84138fc087e88ed851da1acec28104f76d66a253ba007fefe541bf83263abe64a1f5017dabae5a5ab1842eb56f7a6ffd763e38d02aba6f5fb0bd3803aa816578dfda558942b2fc706da34edd9e244792ae9d809d74faaddafbfac2bed81675348d7e771c6664715f592bd2ebee8924c3aed2563debf21765b49775db609e138cc5aa173ce39700bc3ab07f7e27e72ec489cb48905b1de74a3182fe871a51b537063f923e041f99daef4466d2b6b9a12f58bcda8f2594d8a55aaf5d283a2b164d221c1622aba3f48906091705f063c2f286bf90fa075f642481d86f4c0020905337486a3ca0fd53a00d6e05eff417838f42da31d7bd2ce123b9c1d5408a34468d487c293aa3a535805e57dc30f0768bfb168e1973ded568bb9ca1c3cc95b6ae873ade98828f1c60e11e24e159bf6e689c72612d600d420691ebc7165a462e5e8857ebfdb02501ba1139c816052cf04e6a1c49004ecca521c8dc220b4875572089b4ef68a9ae21c6fb42099b3f2cfd59ad0507094a78e3554511ed633d25c789763278c53bf1eb8b28e40eb7d36f876055bce1b6dc29ad0f473d5ad6ccb46c87eb2e3c800e247b55f4db0ae6fed880dc747ea7321c73e869bdc78949aff0cb4a4a36d1e2944455943e7ae346007893d3b336e244bbb364e0d8bc728f38215b6d73508b418a13f285d551df4a869e68f5f83ac60959ad63d88aa8937a14aa14fc74966b674b7f94cbda1ea3f3e3084f3475425accd8185327881f56cb90f321b4b64913a2d313806bba20735df21c5337e249676207fc82209ae680062cdee290cdcc638978135f87f4000215b4900cc8e41fb9506f68c40335689d3a696a25a33fb95ce40f8fdf642a97a44d397b30fa93239982de94b2eb7d9d05717d30b8bdac886832b5c24563282baf5c25381934204024756556f0f93f53db9006f0813d11203814929edf61b3e28900818896156fec0082c52bcbe3e9b435b90a86dd2a9d4f6b52701da4a30c9a08283fa9d74980f77965e2d415caa868944754d74b7d24ae3091d106bcc13b3ed1e79f0b62d1723f61d92abe89ceab6659476651ec2dbc0dca6105465c57fe9c4a7ea891459b0dfc4b3fbbf11532598728c6a16e7ad5892331f1501a89bb3a39f724ce0a1f3bc54cbb02a72abd82e95ff799b7da6cbe84e7585d0ac9f02a3c74bea7d4bdb1c317d954b5d184d193401c60646397a4a0d3e2abe9b07463874b0a48c7abe7388f7a98bcb7cc290c74fc0888066c7220c7f6a2f671f5dbf474319c82e2a766adebf8ef3a3d31ea923e1e108ea289bd63dbc5dbe9fac426beb29e0b19fb4b65aad29c13817b7d3937d7b9eac8720d9334f76e2934b3ac5782bf7aa0d1b3f9cd57d7933ff9c4da1c25a4d93e26281981af6f3e681a55b9368068d4dcf007859f9869f4f28f218290a5b930a4d02e77589730bb81ddd53a83391180717ad8b5d298b16aec9fb65e695c22833b734f752510f9a85be046d6936b0117e9159c3254b0f9905764d63d81e637618fe3cb069341b79174d373b3e4be643276174d2a99f0fda0cf0371a96393410f054b3c1d82e85c5c4e848886cd9703b932909912399e1fe7cc3a0b741be24654f76de304fc26e4356d70386870b9d106a387a3bbead9f5a48d8ffd449d8f74c65b01ede93c1ed437f311000e2f0236319a67d22e4797ee212bb8565b1807e42780c758dae3e6bd8a162eab703d77b35cba1f4f74394985ac603c03111662a4c78c925ae64622d06b8821a08039f8ce30d030d9aa6700b34fef5ff67a055563646b7d083180788c1bee39fde5d7cf878d4f49e613a20df30f356d93879db1aab94192fd94fbb3919813e1ff85499b0776c1d3c671b05627ecc40eb07134e70fb1c6546825acf8089d0ee104bcafa6e3b2eb5c86641f04910d1bb07b44311b74a4dfe48855f6394bddd0057d941a9c2ec51503bfecc13f57adfecf719dd865cfde6190d041f5e4020627a894e83dafd63025a2f00b0c3f189863fb45081ed151153bd293682e7a88023acf84c21d5b0d6e0127201327d01e03a82b374e35939c7b304202a8e65190a0ee85e17636045b01c4aa0a809d980f52fa525ca010942cfb007ed65ad48117889146b4bd80e3209e7272d02437adb255fdb97db4d36199fad5e681b36acfd6291051803a41b82ee2209ba2e62f988134f95d6861e687bb16e869c8513dc29d3a1f7fd7815eb0a03ec03e7c6d1ca08b15149d3b7ad2fea0ee3dbb09b83ba01c16c404c2700382aa842358e53b6db07b7eae3c55c2b02489106256b3c7e6fea11425066528d566c19ad078d826fc20a5c6aedb66bb435483b96bec24e6f8b6d4494aa2dbdf10c4150040c09484d9cb58e02ec4a61709e1351371348f319f89bc9b94683026e88ba5ab8d52351332ccff93137ade416f8b3ca1fd21c7922fd485616513d494c8470282babab25e628fe0e2a7a6318f6a970e7c80cdd20d490dca967022291e580e366a7f521c3275b15f5b257dc8a3534492d572a43f33ef3c8b9cbf95f9091a288c60676beb157e77d5c5a34879dcee4aba3d19fc6231dbf9e0156f5f978271d1d740ac69158f91310c572090b5016a32779318257392e5093a8ef599819b6e77812bb1d9bbccba2162934239d9d22efbfa97adc89f47890aa7edd3d116a6831a87a6885881fec843c25ad6c896dc59f63fd26cf3919cc3b75f2135a30ba8dccc2e537a1434acc745601db0e4325baa7a0ba1d8fa785ce750152402114b1c440f3d744ec85a033d6d8e6fb3d0c56789a0f95eaf6789e02e4c70b9958375963e9f654851f748c182c94fb8fb720ce70b65d1a19d3381366d1a3d3674bff1aa4af6cff51fb6dfb81e90adce3104580e1e3e361d3322d9c2f3923716c6250602648b1fa9746a7ced6cebf7d57a558f1aeae7d610cbae023fdbae59b5a4cfed18406b79552e697df49247ccbf0bf460d5fa6497b6333fa1516e7054ff7c3bd58984302ee8b436163da4849f003de3d7668ef82dcf654564a88451ba9c22489474dc7798f228c9b376c45d9b4e61eb327477a92e07900475abbea7f07dd0d2f4d403da0209bfb3c0024e11f9d5dedddaac637940578c53f3463033045f8883cb7c1e4dcf91d75e41ec200118c438bfa61bd3777e475e1ef73b9cbf18c481a0175f327917776e9bc1c7d7bc43b77aef5fdb3e38cc14e4e858bae5471aa2665edb38d2d07f42c88b270c294f78ea97a7f6815ce0f9809b33092371e130e3906bab30f12a1d3c4bc7c49b42e8a93426721fac41afd13977e738f133821dd471f672204dfb58bbc1aaa1f9c9e27c2ce724702a02ec22be74766714762c35980fc00268f89aa9026a2c716308b184da4a493e05e8332fb28623a934197aa99a22c12f912e42f42a854846322ad2f1c8343dec1922b57e64fa983f3d683dee112f37ba20e57d28a0dff720fcd5aaa594cee974807ffead1a7cf29790de8704bdc32513de0403638fcbbdeba92ff8e6e1cef6f3e158325fefc7727c8c003db3f4e49a4031b08b446bdb9846780525d61cc0a5ea4985be789f035c7110bc02c4e1033243b9a3c4d8b6e4cf012619b6edb7f3309072768fdf1d5cb313633fd8c6316635c99ccde712dbf2a2ae4cdf145fe000761f213b27c6fc991b74fd88ec205327e80bb04b066fef20de58b87ba013a5b33fcadb437ebd4ccfa6693ca1adee51d4a2f8300219bb5f4fd753563aa55060bc976a6443f9c8b8b704e8f18deef4385199ba5cc6763fe9fb6630f77aefeefd317bbfcfb5a7361eeede111ac48d11793b0dccfab1f63802078b6d0e4feda5d932259bd849ef78b6c35d9c1a6475e896bfd236d83cfa483657b83e8c26a6a20eff03c7240d7956d16857e0b90da737c2ddf858eed4b398c4ad962987ba53b89af590c45d6dbb0244a362a1d59f378b29e1af28ffdef7e53b9fc5f11d8baa4547d79d9b632b242877b7d6c63716dc07308903228f6c7f90efc427ef872b5cd17293f2613e21750b1cb78b888832ece340454291a0a7631901fa5c3a128f80e65d0bc2dcedb969212a9d63d9eac03b0f47664b006c97ee651d440c5acee33d8be1a969c99606182a0ae377476088b95119a726ba54cb850ac9c0b8c42d62a40f1e77ca102042c6dfd8969ba93d9a76b21b1c1763f43ad3d98e9ce012e9cd20ada8154351443f82cbe6e7d418507ceaf8678da49939fd2d3863bffc9186fc1b262dd0aa746203b22d427e693d87398950c40c673192e21c525e2280672ffd1d08f28534edb30c400205864692a5a6ce411f37a82c118182b605aa2ed336ea7974bbc91da464d7bc7a3bda171843019db2279bbcca6f7d2f97536ad0765ecdb66be8029e8df03bca7e626a02a3bf0f22eda40398e710ecae4eb3566cd1e055c30bf2091401ab8f635244c3fd20ba2263c745db44854a44b1467f0b16be1301f1ba977647c763f96debb206799dcc2da8b214a9f7b32b5466edae933ed4ea1b2668ce4c9488f884a75821ed67aa9aee44c2a34358038d20ba6d814991b237c32f6c9e1988e76b13cb3884b259aa4c31c77a1d69ff8664444362c80fbd51b26b579f397ed997fdebc08ba9b38585b46b3fc49a4ad935ddf2f8f48f8eeafa4aa293fda64ed0ef073b8f1a7729988fb8c2c858b34faee2b76d79deb1ddd6fe048195ea6804cdec3a5ec0913bb4e0101fa712c4e0f0503b9859c3a30f14de1f66b0407b7ece9bd403d3009685326487782e7457f1c36522021353f899bdc3f315f5b6b0ce6d51fbe955f83e427ee78f746c12ea948cb1ad891fa845dda42d3d8195d30a89819bc78ad352b77ff390d1b75206cd9451988fabd5d5fae338b944bb9b8182fef8800e973951af53d9992fad364e73953d837cf8c08f0c2e8215dd1b0ec13e8b01692025b0fde16d6c92f28b6da9e4e7d1af6d514383c1020bae95de9dde4d7a11e77b83ab71eb773eeb63492981b1c672542933b8c905ce9d32dea120ea6d6bd92839ead942bccf64af43533970019c98c98c2ae4642aef0d6a7ca160ad0d59894d10623742464fbe8cb0fb2d47ca88338af21589323fce9ac0fa2c7623c6f8138532da333ea17808117fd6d4c0b9e6c7e9e50dcce2706675bdbdaf8ffeac6253567df6aa86c82db2cb1396e58a93cb599c8d660e83ea23d70b9146d8c4c3441c0de896e561491c7c10363fbe66e5d6bb2e2738aacb30e8a35b4ea888c181a0fc4343c973f047b4aafed4aa1d12a27422069462b552955edd16eb9dbd5f627b02fe21008f05357a157f8590ec233b9e54bb16b9b4ddbd98e54b01a9793a98f1e21578f599bdb87e7adea68e4848e6fe078db0c2a5aac961be21e7e39339608c08b5fd7ce04848240e9a12f28f327c8468d960776e414c7ac1f83db1ac20263efea20e3197221088e4e95c8126bb44c474951387cdda6a4a5316a1efd7ae835a2d285663f37aef86f0af1892c471d690009a6da1d5241e70cf711e943a5afc5e5e707f880b407ca25665a06156c4fc1beeed3ee507aa063ce7416d068a24d110cf95bdade6a289ce58681b1919822d1706164244632055c252320aa1b3908d28a9c3c6c00f453aad86337b16197d8daf08a533f771e491d7127ef67d2807125e7a8e49030d88342ee69a1b02cca8d0b8c9dd5463be803eaa8e4b7f668c633cc61f48fa510981120fa80a7499a8dc4999b9f3f29c9e3b1a653e19a4e25f04d69d63e10be19f4136f77e39bc1262c30d853e59b4f0559eb1edbc1eb36a5099bc1984590b1dbbd8ed822de8fe2c494d686e25dcd36e31adaffebe03405c96676428e6c2f5e544be0219a3836f80ea7c41a697a0fe6150a788521b7a4debcdf1955f063442e1a8a26feaf3d5d1c304d791dca7d3b603662e60cacb75de951f494c8050d6f63735e122b4fce75a0710bfc055540a6929d8dc0136a431fa5ffbf0c8206b9221465703abcabe9739cf8d5f2f162201d461ac34762199c3d927d51c72133bb3ce729557c50a65d960b568c3c02626a8198a847b67432b2df49b11e9266e0ae9fc13d7a680e951bd6b2ee57eafde2717544f44ce00e1707064bde10a3860de184ce424982a555fa468a8088b21f246108959554cb36a04caa75c5c465355c10359d9c6232dea836be834b0c79a5e7d120da449dcc8f77d0f8e93ea08de8099523f19f94f26bdf5c9d44b0c30ca5e81036267e060989af780d56c2988076b73081a8cbceb3c9969396ba243b359b6ced763a1d71f0648600b9e0de1871068a375dfcdd72b97327e4dcfbac6ddcf1b5967ebfb64e1ca23c983b4d93fa9b3b59922825737203b5c5bfbb733ae16dfda02c9c103ebc1c5ee6ca0cbd9706d6269157746a69a0d28a7c00ea51b00734d0248b98fda3b0c3a381b1941b0a8c34ca050acf63d5f63947e529d5b45b9fdff60ae99b8b4bd484f8fb545ea9af9e39fa1c2afe3837b276aadd3297f482a9065d0f8ef0f3088d26eb5855442f1a6470c793a7e45207f5278216e8c2dde5e521f84798468a1853905f16b0065dd0d1b6e5ee6774bc1c13b581903bc2b18a8ce1654ece81ae0436b8a41f3330914a76bf232b6b4a13c4249fa6aa1cb8a2c54145031244ebdacc73de1839e9267747988599a3d9b71bf2faa25f6498756725a798cd3864e140ae262e9cfe78802558a572cceb4d3f09fc30dde859cd98e169b3e868c55dca3b0e3602ff867bbc0471f8139ce74796ed41a4fe3b975166efa8b3476c223de9f343028f953cd9b4dceb584a2fb1f44427e5cb1353c2e575df5e565ddddc4d8c34d28743b1ceb967d0093df5a834e0ce820e86bcad97c6fd02c177295b5664cb3628107d3681ed4baf7998d24b123d5b70a82d90951214c3fe2d92cf1f7a0c2b6ba67789931bacb13bf3c1ba10104f40ce1aeee11858a85f01fbbeaf4fa9125aa38fa6184cb9d72a1c5f02b7d0a73c3824b3a89eab4f9372a6bffb709c444028d4284598e531741c9a50f45ac2929826f11595fa6b6ad80651880679a0ec7ef710cc9109ef19dfbc3bd5e1fc15c9caa8fc8f5b17f21674c10286d704f5a9770b323aef1743e106a803a13efefd9cbe2f4296ebf8b5011cc681d0eedf748f4da1af2bb24c27e01f892f591c309f91cf6e86b243fb485b4658d3892669efda1d4e20e148aefca635db68e066d5ffb34d3dc76b2fc4eff75c988cb2599d3e8d1ced5b498a1d746832d93cf3b8c66114930d28bd1c2afe4a47cf26fb545e681d5c71dacbc07bd71946cc229f0101268dc0d59f7351ad2e491852523056cb3a43e8a5933fd6d311b5c15cb387fabf42cf3c9a3dcbba76b0a3fee02754a338980267621ed23e7eb79730d3b4087a97eefffabded58e9f40f6fcff5dba9c75a8c74456295d00e2e69f615e8a0bf77929e23fb45fe43643710763fa6f54c3bc9a1edb9f482e9f547b59c3117fc66456047c1d17f403f7ba9ae3646a40e7ba48200070451c99262162992310f112f08ba7b05a01565edde2ba90a2dd28fc00aca262132353e561cb303a40afb51c6dab9e849ad8e08324b0e3bf58395a2268aea116e7d5cff8e4d9d058b72852f4bf9fedc8aead7093460cf396053aba1fceba7f6b90f1df6ae34c84f9a4e29558431c19fb513fa80c20d35b56cd3f4ae19f5f2996bc1332ae1ba21a5d960dc8c8c9f008e1506c48d526841afbb045883b0800bc1fdc44c87efcc973936a7d937c6878dd9cd566fb2a0ff0ddad447db89eb3a7fa4d3a25632a2da5c5b99c21bd0c33adb12e56dbd0e7e38bf31a307b9ff859b944811b245fadcee0b37634bca98dd50f56aa79916476d26cab8b2d6541b87c15cd3007d959b8d1839baeeed649cabc9b298e55ef9cdf3ba6e282355f4f3d4bf4cc75ae5492769e4b4d3bda89a397a902cd1a0d184bd17d7719af38c32134c12962f33731569ff4b4eda13ad40ab5dd28db7d3e40d8a7aa71715a3db8d8c35df8f3290090307f4ea3ab6f060f8aac9be86a6d771d197f0a61e187380f659110dbb664b3c09bd70381a9f14a4755a1aff025e5c1cdae88ca8ae3b7435d763faf79670c42c874f2685f304472e994b4b4f6b3aea3dab925314dad08e95cf82295c6755512af26868e34dc6a8804aa6a583223426b386c529e7cc72fb7f07580a61c2f1c55bb8c6e94a755b5e628136bd86380c60c18342231425b62b063a1dbd777c6c997e817f6818a501b75e9c6f1e3786aebd4172509b277e36b6cb79e47bf26640441d35bb35004467cbe896b52d3e50696fda5c708a586fee70946547560d75b2c7a88b4c770ecf6c8abcd5868ced6e7c423091155fb631a8bec082f288b7755119170eed89c424d04ce1e368f151405c4e16f7cc6f20c8f79648aac8372b23dce5fd311fc8e9c24f75174963a830927c14eefdb117a32499a4b8dda161f13e0e98ceec846786943692434e4cfb36865158b83bcb3d541c8740ff1387ab3e6d8419c47098445b1f8ca2d1cae88e9cd6304b3b5743c4df25eb182a010ab41502b840446320d0302843dbfd98ed12cab359370b8051cffb9b63e8f402992ced8f8ba8eb0f552f20461e723baab79f6dbc52b529fb2c1a75e3f6c026a92b74b7e206714e430d026f53ceb3bd8528e573a5739caa487c298c84343bc5add90b1778c9f9a98691e8e6825d1e026bb155947eeddac9b034a05d795e04d26476c879004bbd9aa5439f91c3a01cfc908115dd8254e5db45301b487fab877d74255b5ccb448c5d574352daef05a292cba1468eb832255d3cba8ca8cf77bdebbcbfe7b7cc44686d848173c554d3ff4b55bbb4c36c04fe69506c50eedcbce1f11d216410c5545e90eb2df47c7c12b98eef1ff0f3bb4d1cb323e319d4bee20a4039b63a4bed8fccb10790ad41cdab05146b67d5f1faaf41e349d824a43fdf47e9c5eb5e7d2240b37da4b5a625c8393705762485ed8c2380959be879c032c78c7c7a34b0185023baf160b14b30478a2878b7a777347d01e0688228197f94d2ba5b9d2efd30976402f69142c26d7c11ad60afdf5529344f4e5a8dd436ae4b298f3edd7942370e37f6af389522cf4189d5854b8326155e9a5c64566c6b6312b2db17708c79aaadbf7eed53370231dd9430e55bc0c604b7b572c4b364a513182c0dda2689472bb32cea6bd0a7353eb625a5b6ae7681c8a52595d43c282a6c54c84cfb01f0a0247c71304bd1b2872794d677a19c924f44cd5a6ee432fcb00bb16e64a8dcd90c3accef224dcbbed9d6b09ea2f3ea74b0f8d7e4ae3aeb9a8b319b2ff8170b8c2756225fe9e7fbb179fbe77a8593a6ecba5c5a05464e418c8b7c83cee375a35bb58f18d8bd5ea40c612ce02a0945c26d268ddf756be594f2ac5b0d00c9fd8774926a7ed9c363eb0feb29750c85090ffec54299193833624f5e9dd2ebd1d818e78319e97ca9ce30480c950efac67a350b9bc18114c00184a2c34579f4fea3550bcff1e74074a2d6f94eec18579e92692518ecb824b74e76259527038c2d072b0d9e80553378d9de310ea396a4d112d12c734b302735956a358b0d26d986e7f56aec75327f575efe82c65ec87cdb8cca468fa6215ba33a58e71d99380dac0bed4f7cb19e103991993cae761b1357c633e4d0310d0486c4e883c36ddd3d12ea5d6c8a06da2a2d834cf56826945d5d80290d4513eacaa0eb9adb02fbea0f4f3b54afc918d437cf9726de0d89dc0568e1c4fee08415493f88ba6ee0327e492ee5ee932aa1a89d02b4120272a7671ad730af934c48bcfbda251a64ce17af0d17a180f89fc387af53bbbd27155812f34db7d9325d2f4b0b40e3492fdebb83d8e67dc6fc351131f3d749fd122ccd34c6344a68462be2b664fc7af53743c0f12ad208b4850bf67fdc0ef8bbd0f6578b37f7155789943b54f1302e8f147546b75b156094d24b3b4256e3962d9f8b951950a2a158db81a6b6e8f54b16174d8835967cd9e3e537a0f1381c0777ade8a54a4c58e79e2d000964b357148ab2e5847cd8f05cc02ac1384d658afb7708e94831fabc023a0a5750b28b76a249770d18ed02284c425143cef057cc5eb6d0ced2fe3161896aaae3679760c5896158a29dc1e32922be179cdfe834d7e01394f23eaf86dcb59ddeaf8ab644f59534c0ef07a62bf2f6d9549f6f73739cf0e4a8ef89f900e2e891e1a8915e172ec53eb5ed7e270a87b63251bec43ba50b6b5c5ab78e3431b21b1ca9a6b75fd84acf9fcbf44e07516d0e08d62b9afdac3ab7271d462d3ba113263c0e44ac7699d1acc68e831024d214c80842f2f9a2c8edb785d9e34886b5584b2530dd6556ed89900b4bc25c758ff08824c96fa2645f57f5953cd87415b16cc931399bb90f5ed37f29524f9a51b8ac3c8b209d4509bacb0f290e93396e9fe0021596a4e6681b55ff956be0178be56e57f67b61babfb65074a02ce6e9e19934cc878fe59ceb8c034264d844fbeb1fd7ac8091bbd2cd524cb312b2c0a5011fafcfb09e77ffbb1abab2e4e40de689f3bdb0fba03d063867cc7f758fd9a1297d48a94a726ecd3f8eaa219aef4636116eae34252cf09dfc2d2726be6d95f85ef0c200a542d8eae0b92bb03ae058627fc8a530a714df7cf1e8109f38a712826e2c2a23fcea8aaa4ad45a2285b8a8334860f577e86c1e5f7cd47c20c37e681a042abaa160e7233063a3b0225ba33e4c7b884fe62f6c61f6b11ad9da6c9bb9cb34bc069da93f6674fd95f4ca8b11d96b27ef2440cfe8d180924ec99efccf1d0ae2f1bbfbb9a1cfead6ab99b1e9c1a934895f2d7263402fa4755553e0537b0860b916497665cdc2f19301b4b4f5bd3640a96304ae47039b3701fabaa7c8a11f89795fda4b8463984686de735be69382d0d6995d3596e13fd9936812c43acc802cd5384f20038b292b994a641534071efe5d3376b0ce37d68a3d1bd37eb6d248bb544acf80339efb55fc4b4d021012e2fac471c0a33f45eb3a2a2f9e93f9e666c8902e9a463bf5c407cbce538fbf6f48f55409fbee611cce3b5261172b556eb859e02fa51f21b0a3fbc58b9c8210531c0e5c081cb459f72c59be74062303b8b967b4bfbf069f9a881fb4eeb8ffc57feb5777b2d346da2f7afe11874110bf66cac5f236d6badf7365b9578627d4c94072d2795800d371fddacac02b32ad8aac2e5a83f1c47e0a9a686070ec295244df6e3718e8aa46436295340340aa60c9f302a653e00b31e9f530669c0a78f64fb126db87f8d564d1b9007cce3856d3bf377287f070c6d6dafc352b5510f45fe8407375198e79b127b0bbbb89affb9dfb103d3827552d57179b727dc967b5a899ed3f5ae2779a0e0a59b695ad86de008b60728d84ebc38b5453aa7a03cdef3f29072673c4d546c561a9d0a28a1423a30c90801cfd55dac431bdcd2c4cfc0e0526d2b30c889d530fb6b584cedee94f282210cb3db887e01758de8a1a8b0019514518cac62ea53e40349295c26e791ce6870194f5cd7fcf04646a10086cdff3c393631c7492ddb5830a21772db5729976d61d5312b2ae80f2c4298d00ac23d5613941bcbc1aac2c91a5611a358a31a15f55fde6a92eabb6a4de1c181c77ff0ab3946299d9f2a79dc091865c04c22c2dc3a361547ca451a969528d55630f765f1a73215f913ca0c42e8da55b1a210fc130daac48386a341e0190c95106eee6df82e5c969308ffce0381d3323234e01618cae8782b0799115b6e748e91ced1e78e0528a6425cbdcecca4720691a2767d9985b821c2f36f82fa2d787a3fa446a000e2a65d0eb0cc4c4575f57d278f1b16e6ca673ef80ed08a41a3e882cad1070aa17fa02adeb677225be5bfb02a2e6eaab8623988bd8a1bbe6e0afdc3dba07f97249867aeed3c8ec31a04ed6e730d15744b20c52274416ae9477b328c0328403e21f7666fba9087339bcd84bc7fc565f20400f688b7d22153606744b462add602ee6f345ac8ed69f58dfb1920d112f922fc26979a1d4e7d3adf10ca0c783efc6b078304f1254fdf521a39f00d73dd63768b07b269bf5fcc1c9820969314ed571e40f40c929a0f3bac2127514c73865d1c03669b7b5ea0f45e060d152e5b40034155b470f46b520a7a8cd753504ce6f89ac59eb02bca134765004dbcb588df712a5b55d0f4bfdc0cded76c5c376ccf0384a14c57c7401967b47d716764fa01dcf77bc421eb854668f1e4fda797b67b80aff3a8f0407d7c7f2ee9ab806a0151e8566b12402cc8772077b5e4d3e00574a81698350eb10a206bd52fcf2925f3b1b9dcc3394150410c009c0bc2c8830312e5e5bf50d0d7f9ae61d13ab690b336ac4e56bdce29ceb9ef7fe2f217c0d66f992d7fe6ba98dfccf3e0078069656dce97129210b4e3c0eb99223041f1a4ac55fe502aba921119d79aa897a39a6d90d95a10da404569197284d665e96831870491b1352a447f6883e33152d4050b59c1d53558ff4951a5fdd34b21f0e1434a961767f2f2c527548a8ed0abb59848eccc43a02bb4988ac111d67426adf025b829e5eae96d6d80894d3c8468dcc5fa155c59623be629bda8dfb17412c271fb85e5f4168401aeab31c4ba039d8954102f743adfb47575a720b25f067c1a441b6ee217718a1e89c420ce543e5f6ae8fdc92d5669e93c8e4c0d67d863c3c3ce2f5341a00e8ef15ad3bf83a3d449c99bf214035e269c6b5f023f7218f3eb8e98160b669c43c613d50f65eab0fb4b55a43d2867c179a63e1edc6040d79de88067444192d30c89786ec4c19914b1e944785c8ac846604dca3263fbbb82b10ef63496e482ecc85e672240338afe2261aa1d72bf8b909c813e77634e25ae6a14f773b48389498fd038bc230f5c24589fd597692654dcd15c8dfeec3ed7c30d2915bd62f5a93a5e77dbc509554d9818dbf43a2f70979065ba0d995b9e2384a495011cdf6c9bb2f7a4add9f7b45b6f5a7c41f30e59822238f0b02a47587675915ea045eed95f7b62e8f5a485d5d61a91c86e88ad9109f20a9032c39a8eb25b6f08bbecea8fd8706d492a8836324237808048d86d69273f1f3d765d6fcb64b7eb829c754ce212f6ab2866433ea4eb7247293ad4770c0028f48ea1354378558bf94432ed5155b3a454ce7df15ac303f9828e92dad9eff0591644fc578c20b686ed1ed5aaa71484c5ec147726094c978df07d2ae5cca247404902893645352cbc326cf061a29be57aef37457ba3a3d521be2c5bc94d2866f57c5555c5563f1004315f6de1d6ac0a3b0f26834bb2028b2b428887ff24525f5e43b744399d667fab988686b5fedf3506739dafc407159a6ee8f5f17aee2dc4661a10e8abcdb416d9025d4de7f00ba926bab7e35e34985810604e57a4b1bee43d0f697f46dbaaca0b745901878e7bf64d602610d225d176023f965403cb58554237df4292168741c3e6051acf1f05836467af3c0d70365bfdfbf0e84fe240c1d0863a26253c17f48859f9158a0f86f00456ead65bba1f7425d4b3c18310f407f56c515fecd945969c2fa619834f4dcef4248210ee81b818ba580cd64e95aa030588e8dca6314a6d246cac25bae188ab418624d8ab013daca87b3d590c380eec6f079aa83c91f01d71e3e0a10fe89ed41a3e33ba75e2c64653835a5dca6082cc7353dedbfbb2953883c742189a856b2bb32c4b05c3c54427e89e1cd4fc7f60b07e688bd3ce2245223b9f602d70a21334ca7ac9260cc487aa50447f6b9425ac7f39fe9b74420e097262946363264e332264771f90d4c5b0cf6ec35f5e85f17d5bd3494d0aed2f356bfe54fa8a68000d20682fffc8076d6a213fb108ef7c665b82fb04f84f4a479096c632704c53caf131db33a2ec8326a17f0137c542b2f902602a6308526c0f80bdeaf554f07f3002d1524be038341d92c02d866f9357323164acd510e3c1e667962803bba06dd768691a5870434c4827e7d4c498e647136fe5f757dde27a9b53f02adf2e6f83c0c6f09ec4eb716a8b2a74eb1b532c156ccb4b0ed77ff9386ac8cf4bbc6eb68fefcd8bc9fdcd3d1e17fb67f2ec8b43fa08b7a813c6e7a6414552a230fe40c2152728869416732d108fc39bd22dd42dab61b640455ce8c5a88fa935346dd6dcdc9cc212727b682e0d768605f1b43480370221197cdffc2dc8d482fd849b50228025232d0ab1eab1c17bc23580b7ecaa13c0d9ec741d5713ba86ba3f2182027536cfcf62d772bcc9e40a800fcf1193be0dbba24a96bc0bdcc69b98ca40758fe38670624d155c423dc3b36164e8631ac3cc5368db0bd7f7187730de12c2e649e3b3a32f7f3de0bdc184a02e39fd9125d954586b11ae6bb7587f839910bc978ecdf8c6b62265a0c02fe0689aed47bde2ed92a97d2688f48f3fd0870c2d75ede5093f6998991d8bdcc524521a90bfb1f8fc07a16a38786d3e81afa1beb70d71c9ccdb555ecca0804832b80ddeb3eada4a2d90ea7fe722de55b6868bc4f82bcebc0ea7fcb27515d0e7bc3bcf6b0f56ae6f3b9a844276bd2ad7a0a15f2bbe45fd82d576ab2ecf7850983a29ea91a65709f7b63e57070a8ebd9832b7459f13a58b67bc4ca32f1060a50de40a79aa85aba3ae69a1e4faeaea5d077051199c2c0059b01ba71593284565ccd6bad0685f18be9ca6a0d223144c5145ed822520930bc290ac0a2242ba3644c895afe4391ca00f9cae517a8cfb3417767c4cd8d52ed30aa4fbbf7e22098e7c67593f635a8f8c2c00bcfcf8d72ad64816907d2c2061f390a504f997752606ad0eff936476099bac06d36c5da8da462fa4221f4679a778c95024a5743061219a47361bbfe9896c960b7ad5de34ff52214475f4700e0f9f22f4a4ca7df4cc4ef66b80fbe11fae6e6925bc43930b2a0a9d37d3f7dcfac069d801372d01273360af47841370eae9d913b79020fb614764e59328d8b37eb8e62bc47d97ae459d06df9e5f7225be79ab53ed2e5034b3aad6e53480b6fbe201a00b85a5bbe6b3b0e6d3cf411694b95b8d635ef20ada1c0d30c96d3db0c27f042e0db46ada79404acd8a9489bbf82872195b624376ccd971cba3ebf99b6eb34739800334698a1662dc19d163fa8c9070a75f59c9ad9c8ae11a8d186bc35904cce628d949de0b9ed92db55aca0d19aaf2eafe118bcd698d9a01d583550d1b925db547567ed8f1f8f39e2b1e1c762d7071f60b23e28976663c16716c87ad463816d4f551d8298ae944c2c60ed4b4c939378bfc8bd37f16dfa0856f468cd455aab260b976af4548b607ae4debe229ce623673fd56b9a62ee8eb70d9d6c85f054bdf55d8b650c4ec836ffdd36addfa0ab1f3f81161050509277757c00acd1afa39e689c56a522a451e980bba1db5fd2067de420f02dbd1d945a1753d8c4b7006fc746afea81da08dcc66703c3498d3e2cfbfab948fb463b6f4704db240bf7f7e91fb3f5434ee7fb591b6c9fb237c336c2ca77795e39f44e812530c5032cf53d4477c8516e95b7a94e6f40b9e9cc8e2c50a808be8b6986cd390d688e73844ebc7f58803e39b53f4cd2a44602efe74ee900da7dac4ca26980de4aae14603ceff658b19a3f7c45e2f35b6dd649777a2f187114312cbfb7f1507f661c4a0df439466c67220aabac7cd6d942745c1799236cc6ad48ba47cf8dd22414df871f8262187ffc27d373ce1101fed335c1be23b4149fc9365e2e9b2da820eca29f6e9e3f34199e965074e397f423eea95f84351ae4bbecacffcb9ea1af3beff1ee4ff192d1606410646679b8c53e4dbd3fca24f185e6ff971407fb9063c8e0a56fd768049d220e403883d33dcb038a55fe39084e16205c15983536c7ca0334b12240869e0fd040d02b0c3f8803d0b886f843383438f8f612c07e2eb3b1ed39e9f623e6611839086d1d4823e665799ec7c613cf11cdceb237b4fbd12bd7b1ac6feafa65f58d20734287ce8f594a235d1b3ea0ec3221f05d0440238aedc2b2a04feeb6579a4b7319d156a2520c53fad231ac089a9aced7dc89075254e17767299c00fe57525ec1afd049b2091509d4c7664dc8f74f15e9259ed25bd932ed9faafe983c41cebdbadb771903d2d1ed25c4499a6ea1f04a6952256f82f45f64508672d46c3030f5006f3f4f42cc3f56691562a4fc3b05d9d38ad71d8a499516711bc8761f421cdc9ad7118814ec0f1c59f7cd52359200f5387d669870cbd80284f2bc6ebade16f132636af5b43ddb1434d02567e55181cf6cc82fe6cc081b862ff62b6ff13bf6b4d3e785ec79a69da0ec09cb4b10f0108d1dc528b4f599735e31a8642d44c3279443147e80bc61514b44c1f537a9530a553f4e86c5211bd69879e41a89df950d78ec65ad8786c8085ba3603995b279bc417bec3347b03420e7c89b6bd2c10b515c86d883f52a1efe5b8cf49fd299c001dc888832d556b0a01f59971241e0a7dcbe79120f3bad11a23c9aba30b7a7603ee524ee48ba8b5d5450798f03e999489662cfd659a9293a1d7e230181f6a9b150459fc6453e5a1e9667aa1467091a15be5548ddc56d0454e300fb8cd55e746a788c349fb35e5198f78840229d9b6a1e4e6d180969596221f4516f2da8d6f7af14700aa3662e2cc042a572af333936dcfb10c9ca08b98dc31ff3bc6361fe23ee271d291cb3a423622d32a3168cac89664ef90093b09fdb3aa494b245d16123532e8d5291ccb7b38f1dd7483eaa45abd99b0a324fbc0da4c59922f4a9b1381e674671e9433a8d3e136c4c357b9c441b01bfd0fdeb02f234f3783e873b84144413dace4446d9f628959266db737e3d2a11096fe4a497f9f9876f97e209053d0ab90e1b12a7ec2b3e4617ab6ce7ea6662a668745ad596e149cb52f07ff69858aa7835665987f04f1ab65ba4cd96c80d629486ea2cef9cf2f73b0c60dbc77aca5eec515f71677a3c1539e9817d6538a50ac45ddf97152ad41c62bef2d9c5037a59a3bd5bd6ac9a05853ce9a38125f27705a91fa6dc081d7fa33dd283db67ede4b8dcd88b22e282a8c880d6747a564e48c7e89a9b1d77ce06522d3053a903053cd581d5c6ae294c71ab82dcdf65154f4020b787597a170988433a1ce6822e15edaf3d761c28c3523d37f72bd7e07ae4ae02b22c4cc1384bdd15aef94b74b86801fe6d7a564eb9fca26226ace92b64cc08ce2cd1f7ee6f6066a6637de99a04187651a1fe49dcb8456bc6ca47c518b32d963382e10f33c86ca01536fb66b0bf22d1589e7d62eba44052dbfda485e8de7147dc3e3dfe04e18cc19b92382fac70385f6f519ba936f496073f12b266f2290d75c4281fb6eab3403bb62f39b5cc1ea279657ea055800de05e06ae610a5209ed6611bf31420877012980c8f3c40397dcdf8543936ff4a02ce82582d208865684135ae36a5d9d44b07e8d69d0c0c36e77f00ff950e76cdb8ebf18cac2431578538ac692eac392e8099a770d26a92f36e77b9f3bd5ab6cfeddac925e8b44e7d9eab522d535451e5cba67e409910e1918e2c45a1e115d7574b0e51d44829487359a8a032eb9690009e8741236e1e5615aa49d96f1263c4cdb5a0efcd32435aaceeaa12d36049623e961927e1ff1a4397caa7c41c0f0dd773881bfc8b4f8234c6c8bd68bdcde30e6560f9af8f8a129d8689eac6d3b8084c06489742a25e334a692e6b122060290ba9bdb86ebde5d58e011ee16b1d0d54563e307a2caf1823d8f7dd108dd644f759b18ff3f40b33406cf0c94360a061f0e5b6f9655a148c917d13504814f566f580107ab554f6410e8479d3bcd58b614224199c44f75ee832e8e3edd6a9a38a37faa74ebfd3f82ad3f1f98ed91a15bc2ae1e589c70f85bace122f47d9bde1f1fa60cddef678ba1250a0f23a410bce85612bfd3b31a0fea26827c2b529e5507168a6ec8bf61c1814c3134d46121386a5ebb5557b62eca1b59e33dfe253a1bd90eefc068f2a38c4ac2d6e2f51eeebef3219cdf7934b179f74ef677da8ae6eae984654307ea81672d03dddf5a8d4d9e023cf1cf3fcf199a51dc2abcefebbb6bf65f329d60ee9ca149f37573c80ce90dc8b4d7bf2290063343408c2e5b36e5e7911ccde412ba700fbcfd3def04ed98bb560c3f95843532a81b1260aa3609d303e71c4f3c8948d1ad9ea719fa881ecf9b61cbfd89a0e346fc45d1c7126a47c78d8045ee6b9d3bfc9da844bcaec311c4d4f04342327815ec410879adf886779c0fc3b7e5cb928ddb0d8cff1e8f8c3427840e187f081e21132338945a2ec16de1209c31c6ada63d1c605704ce9bc0c6b915b3d1f225e86427ed7ca385372112602343a080589125c56665a4576f3ff1873f832885c45a2434f8368e35606d1a9604f0a7c8bfb769675d81c9490c103f27c0696ad3fde38db000af696d6b8a485232e799fa19d87b38e528348a49874fe1389234078e63c34b553685ba339a6546124c96f32d674ef45ac1d6f0634e8c2c6ee7cab171bb499b54df5707df4ebd1ffa2436fa16e15efe01f49903f22ad54925c88472b156a5dccc903adb49730c16f6ca133edca7935715d0ac3dda1465fe17f57571f5c757170d2695058bff68a937d1cd9ccd0d2d7e4c6a1fbedf815ef6605d2d4ee12b72a589296495f1f21d8a433a73b3642686b31b5755b0fa22fb9b8e61d779547eef72204490a5d09590849c5559098a0950820d08584275b6fab8f43cf25484f82e0c8062e4f2bc54f86e9d39bc3335b98b7f54a056fb6186d092c3bcfbb60eb07c19e5d3fa980f2462d4118ca2a1d882987f5435566c9ebeeed31f56f39563379937efe131c7bdc502339bd30ef338efc8b260fd092e2892a8809c8e3bd075277e7cb6ad1e579a507ede79358feb1464452b492554a030a0c48d705975a444b56bf43071f03e277d25a373d34cec731fe07242e65af7ea8e691246f37b8030e1e2779e592ca7baee088e35eae5dce7e841034aabd4db49cc3936b249acee2f4aa75ae19102e20591071e6cc37fbf6bd86f049ad4a40e9170c92b1a70641e1f34773c2a3e7f325400570ea9130b210c16a15c0c1dbb7b6901805cb3e3f7bec3c0571593b2cbab45a44ae9c6cb78a1a4274b4dafc7a26b36b73d9970167fc40ead80e32e1511ca1a0e7a13e2f5fbab741cc56f4318504721b17f8cca709fcdc84b4b2181953187dd7e02dc75a2fac83d0f5bb5800bbf3f742d06250c883a6a6353c71d5aef5aeee66e410d27d127ca5ba4b36ece8ab8631506fe0583f22141902b729a9d98395206249409bbf3557dc4ae17052860bbf0e0dd303b6d2bc751d2170185ec161b65319d53c936ac2be9a84dcfa24284d1069ea499b32ec56cf9b2193f4a51122c2ada09acd52a7966748d830b3524cd592a9565d5b290912f4648bb446a2ce7b69e845a351935081e2b8a55502139ef5b0505e9deaa05f598e1deff3499558961609376d9bc017e705da1e44a8bee28abde20847005a060394374d206c2de9a410bfc42063159b752e116542e3668ab2ea6b0d038de825bc0658ebefaf36cf15a4d8cba5e7938b1e1daa4334dea7f2f6e45860ae309082f034d5c5d5aceab3ff3133692dca2273206f53774d9aeb1eaf96ccd943e5964f509fbe20cc7b0332066567bb1e07d9f74bd667482fbe6c25a05a39fac8557091078a2a361272b181f00ae86c6301c6a17eecdeae5ce34a17e7d2e26ffb08bc7e104744338d3454aa655d28a28a2b6d88fb72c32b48911c9329d47f906b70a19027ce263490604d44286a35fe78fee642e20e5723f90a5074511ba1295af7beade863680507989859b30bdbac1cf638095806bc72ec73559ac306d0f4f1f11a4be2970d3e145f9a9fec35d3d4c417c358e8f73d0ca4c7282168c6ad9b3012782b7679f48254d37ca0b23916be3edbe4bd4e82a10e66c8d590766644e4ebbf37666440b47cfdb74faeba3a7d8e519b1c63dc395d7f33c88a3f714f173ca63b2d01368e8432ad73e5685c8ae7f9b6257603a993770ec316643c5e78208951fd06a3ea603b906a2fbaecd95c93c955db72ea35b58924de2ea793e1d184e424400575a751942e6e479391105e3ee7d16b00c2297a73bfbc7a775c338b02d90cf80c25088702e3cdf746710cd54d6f45c2cd825111d9ef8f8585ef79d6b997ac66339a913859bebdd15248c178aba41abbd9110fa3ef399520d4141ad5947d06a7fdc89610db252dfd25d2971770b65a84f09886906eba84885bbdaa378aabca8d1b12f19c91838082e328ec18f79271a264211a568f73e687c15a9f0ebe32d70761d6e6f3f60c7ce859c160590cec8ce473d4b86014b0b2d04605feab9534074319f75af33847f7295afb773b7919dc55a749c3c6766c43fd00ca31053a724455323b136c8f782eb35c88ed1e056a806f8b1f8862907191b6f9d81a52487f536e64a02fce373631d2c65087794e35432cd2788e1605918a9acdee4a0ea40a66a77c8c8173275c5b430c5c87b04f9b11a821dad381b4bc6f618ffce193d4b4a0bd8ca81697891bb704e291b339bcc85582c577289b3a5454bf5403700a67a4f823e6b720df93c3d54e48762d940a6cde771d96fed82a094e9de7f1d3c2ad59dbc0007172e5957ccc9b07abf7f1aee439778f58111fb42b0564628587baca00d17d9c3ae1bab4f2ff553ae6af6dfd267e1be5d6e95684d2ead41d1eec1666f449c1800ba16f8fba8f5ed6c8ab9672c0d85b66ff47aff42778e67c5022c7a01cd0b2584e0a204755ee05b9bd39fdeee8bfa94303ce636bb075a6e362c806080b4b1ba643f81cb25d42031b3435a19c00ab0f71aa6b56c513961a4c3595b2eb8f78a806b2114c528c4a2c83a113b23ab1437c58b6031d1a4a87a26ba24dd910894e1fec1bcf07de38dd5adcac8ea4c627ec3e78aad94b2532f397bef4e57431342c500efc16bff458b7c83d0f40e5fe054b4138e235f27f34a6f2bc3da0501d35b8ca41ff27e9c110f373bf636af7bcc135a3014bb9c39ec05af20d3a4e1d514daf651e72f335e5302301178ca5b7f34fdf13084dd36fb460d4112d4c416ce797757cfa44e530d3bff7a4db06c985004cb60394ed896e6f8fae67eedf148d5975a57e7a9df4f5382c5a6b6b1a65052c599a5cc67246b83b22507e22f69c33ab325d81d3496454768324a19208d0308fb3008549a6f4cdaf1698de61898d3facd71c7a059cedf890975c881e2354641d5cd4450789be5e73105f91dbde73a72ef58820126f03318ff674ffeb2a71b907e100c2109a252801a5e726f94f3f98cbce3d99d6e4eebbb66722cbfe1e29daf220ba53f843bb12f4f0890484400ac770ceb85c7cc230f3399bc527503cc4530032c4c31b12ff53a5db816c834eff1e27ef412c03da306e48c6713be6299396c650443db6ed82536000de83b91da121762ba3366543881a08ebad79b6fcd2af9ea2be352c41a910e1c25285737c28ea568125a835580d6401ba9141eab90be92b90fed1f367f11cce0011729e4315985d7fac7e3a0596e4967b8f0400296b975ec8b8641f1c5c72ac770c81c40fd44d06af78c78241eb577fa0ae3ff493a418a508ed9f8d8ee63887877c9712eca057b8d59d3e233274effeed25fd05843e0b0a033f92a82932cba304332253ddfa059e28734d4cd18ad78678db7b4a4c0686a65eead17b9e9d751800332674d3c29e2d410bd55ed7446aa6abf6dc8d49604b8645d220ec67b23f0e5a27d36dda196c564fcfbe8ed9327ad277b046f539cbe665c34e27c4a6ea563e660555a91011774c6ba70a002116b95e5233d28f9ceb015ee2fa9cc28a2313f8d5e4c9872c7eee0e725ef8c4f6bee3de62a7a17cfaacc93203664ff45779976bbfc72a6488e12ae9a582baa72cc26ae7bcec6acfc7c7b7f2f0c775ee1f72ca89cd178e8c559ec0631b9fd75f18867f87b15aeacffc5697fc955be58b4a226eb93ffee1781f12d9b61cdbc22df78873b57836afa636cb21dae713f8b63cf8c0d328e7e12bff9bb1d35f3164106b62533ed89ebce4e93a2b5a18e4337258565ab9a48968ac3e6e0808628f723bd207012ca475e11702f5f3647244694fa5b7e63818fdd6ef295f65a848cf8207990eb3bfa5c2162d86c93e3746f7f323ae2128aa48721f5dfed4d6c80f02a7f56af2f03fdbcdd90ca3ef41db3b92d598177e9a48736113173e672b44a3161ede5082a8f4152aa514437c78a50687a38aa5235e68d126ecdf35574a93eedc5339bf487538bdf94a94228ec27ff513559ab06b34860d6118caed6851c5ed1df3826fb852235e375d10da023a14e9dfd038cb0aca4e8a63d3e1be9f138aad633ac2ac48bc3d41d6e6d097d5849523bfca7f15bec107a2980631e44dafa3e91404d13a26319dfe2a309be762d14d6320c3dea11209a324b6a20e4547049134bfe104aa5753709d5270994c7d251242cae0844ec76841a76d49e39963cf913cf3be4b1c72938c1de2998aca201dd51629c6a5f2d5b8cdcc63a26e2338abc92b9223230dabe8ab5e3ecf5f434b58051971f4839b4060269b5b6a07d70bbbef7acfa5ccd574e6e36a40cfd72c45b11b446a4cfc4cc454a5ad7f4e7254486251a809afc156446e5c41e16adcfc0dcf8830ba0b2b6f59b46c17b2bffe68449864be410916d56a530ee23e4150b5248810e0b46587f76ad13221f5e152fbcf0978746c287090016a8a2028d7131223402607cde01c383c344acfadcd0c26c2ae963213116d9b5e62d292ee982e041c44866ea979d6f233471c6ca951602524738c2f9ddaa00984124addfd66c05e9a6532276be740d4b14c475ae3c8be5de7c92333bba47a027902201fb366fd59d093e9431faad585baf52403a3d54054050db441a8463007517882ac7c636df1d839f5bd3ae7623edff9e887fe5ce23e4cd6b443d4abe3eee68d188e4979bf7616953debd002317143fe98c7883926518ab5ddc30c28486477257cbac6f8d6862cdc11bccdced1f39f2e26ae1a0efa29b139bc3ecbf6f2b139ae424567c23c5d07050d17185c2372486165f6ba74c6d9bc95caf6d6a3c1442b28bde51338c7c5bc7247bea741018dfd9df1506b63973d1b5dedfa0503c7b8bc81638a484cb0454cf593bf039fd52e62884d4c4051f869b9fee61263853b8550c057825727f67e761d8f1421ba9bbdcd236da5952266370eb4c0b69e0292efa2e2b4f020c48b189c30e91f60a2b8859a449d1e520b1891c99d44d395a5c89c0ebe3741388427099ea4ce13bb4d7139341cc58db11b3666b21a17086f56c1e3ed1418f247babb299a5eadefd70804999b9a85de46c2bac1e49a902f2a5b4237c80c5aefacb5f5a91313d8f0ff82ddd8eaf71ddc50771fba161e2d07c94e77551cabb026cdf05c40d1f383269717c70b7bc3126ca206108e36c898eb29335f13e64acc6a0a2d25a53b1cdea0ce706a11afa1d7b689ddfc3e31e4da11b3baa09ca897ec92c04588eab7560baf14b88331166b1d7a539a7921c19a8a6575236912aa05ee236b49db058f0e66681a5c111441966f46688a42ca5459baa4ab484b703c4512824fcc2bea0125bf9adbc8065fd776bd00cd8071d7877e6d377a5ef0025168a02c1e1341d285a9df04dcd4f551a38b85b23de7424b7495c5e14cb4176716ae8d513b23c572fec96b5c0453be90bea3860c9434f58e9d16ae34d47d2f8a64788d5976cf7c6c4ac421b975a68906817ff409c5a12513427c8869e71449848ddf24978e9820acabb718faaa2f6f57eabdce964f8ebdafa9060393abc04cf40eba50dec06abd028132dc30f7d605f75c5a5fe2dd71fc7db1aa78f5ab3bbea14c7ac3932ee2f57fc4e8dddde5ee9083f5b36cff1ea0f791fc54517d9fd98ec920c1a2d71a8f851c0dfda81b7e6959d6ef9571d755531185926cb98a10cdd590ab81dd1e9ec07371f7689ce1913c4c4c02ba210eae2400b88b05f03e0ad4433fb81236204440d8788691b6b08c2585108498387c6ddfdf54c5b609d41bf641a555961481ecf8deac2b1e85d4c431acd77fa14a19543f8d0b8e8f306ce9372335b77fc70ae8274f8005e2d2aaafdb9fa8162bfd4110912c0121dafca7e2f3fd548ad3a0c2f7a51d3f71ff8fef159fe02553c0ca97fa53ff26818d047ce24cf730ba51984c432ded086999fe353e82427e1a55f72d6a04c2b77f040d14fda5a975a9d4a79f8aed8806a20e85f3ac90539c80f2e96e888001fe4c2bb1ff82405c4b6c8915d5e662b49594e63e14c523b1153646d2323b2162cac32533f72508ad53fe067a3d98aa2e211dfa7eab5260bfc25dcc7ce5b8519439c8649ec83752f21cc0b1f56390849592ad01855ce298024c4c00387a26a8ef7eed7d61de446f3404c16ea0df8eaa7177ead9f3ab6e23fcfd6f85159915febf7d60ea37b30dd236d028dc7ab6c8b0a05ef15ba497db74085c0f02ba9711d29e51cb718ae341fe5179ac36fdba73e7fb6cfa6a3f06b0b874266dc1703992c8ee110699a4ddc47f19bfd4227e21c9a68913406b7f00222336c0fc5f8f14d6417c0cfdf755489f8ac17e0e0c5e27481e5a0ac495c5d961ade2f1c9dbb9b3c5a0abe6572a86a0fe6a925b3bdcd7d15f992e01b4514b6f68e9114629a1720016e005fe95af03b8ef669ebab23edaa97fdcbeb6ff940f23b42fed287ee307cf3e546a32fc2da048722058719cdd637eaac6267b7e25c16218424050cc340e04ce9a5eb342b03ef8cd4e4c78c4cfce08a5b217615f5cf0af69814bd303fc9d5803b0948084e8516148809644007ac47ceaad522948028e4e01a937b4d55a42f39b04404670050991d28c10cf206d85c7b44c8f65e180683b3919a80b05cc81b300c43324d65cad04dda956c243eab0ae5453d93a47da6bf32b765cfa54f726fb94517b4dc17e55f32c38b2cac09fb74616cec0953fdb1bf439c6b743665410f77c20a6222036cd604849865398f6b60017a23ff19c964677d7746b4c5bd3325e370b3da48487e09cabfad6c34ba3174cf534f9d625828b56e7d4ab38b8baa7a7a90dfdc7db150842b2810932329ce2deba204d5626a7a67895049e374d44825492451fdd37e0b74eba809f318b326a6d0683b8b8a243caa1287caffc17ec426d0ef8d6bd915b3c4330597207895357b0dba86bba8819fa393471c8cb3ddddff8a3e6726d820fb2e51e4b12d14fbdc039e4383b8d029c36fa064d7da704a571b5f0e6dab81deaff3d9fea0f279b831e015549ac4a1f460d18abfab04696e4b605cc18850c515cd08b96c5a2df5001b848c1d6fd0a4cad1d2834a3a585768460571d7fe0b135aad4a312f611eae87bfb5670950d7becb151676c99bf619783ca8eecc16eea9e9e3cacf87e60987684088a33c09239d9655a16b46cc836b24291ccfd43e5a1cf6d932dc12a5887992cf2f62959559c5c8876b3652cc27d4ab8b198fe54ff93b21ca871b3fd333eb2d443d7fda1ea021db462fbd9f7a480b9acb80a2754fdb77c16ed2124cfbf56ac4a5974d808cec9f2111b599c19c29ee8ffb45dec24c4dab16153ae008996a529b0c7c8613e8a8936f10fe1a1c3c8c8ff3a908c595d91fd036458415d92891c38d9a256b23a2c12f3ac4c43ad90943d7defe10b3ddaaff2bdf013b34757581a1db778a31e4400f8e1d50f6be5f5f008273375069cbc9b41febdb76485684b2d2a712432225414c6466c7c227b94e8223bb2f23de51b76b1daf7acc07561f130be14d630366f6a78ddd555a8e8716ca2a0aa45a9737b356e61e6b4212aa1fd8947a0946949a1bd3fd10130f0c9935d9d027d0c0bf21d273c0cbbf6929faae06b6f6569833a3df4f6bf81489751c5b9f9b7f1db67cb30cbf905b615e01ea4955066de4196e99442aba99bfff76c8b52058d41f87a2a26d705ac49244e30d6278bd99259c47bbb986d45163ea734aabb373952394f714f45e049dabb6ea2345331f753eb5aa69c4247439b27c4c44ff7abb19960e4f3697e864d45fef467809d189cdcf4f7a8b99b877c887202b015e6465085b28fa82503b43de1cb2ee50c1b16eaba8241f8968a2891abfdb3ced80885cc8bd3341c032ae8c190f4e427b744744333ee18193a58b1f2b4cdbda9cf092bb19b0a42527b68733834ac183136587298cd430ca833924d6304a2659222e0a5f6660e027d62491a851cc41a3d7b535cdb17e3b3b70200c0b8f75e7934a1cb86619fafea705d2a3e0734b55cb8911f16385fd077a125d8e043aab70c268c5dd4d65d0d2980820b928f8ea489c35eef4de23ee31a430c573b69fbad09b856405dc3d2dae448068e187538e350199773ea2d41676fa4514cbda59f587bb17eef0347ed177a8ac5f0163511140448d27352cb04c483bd552405ba7ffc7128fdfea3d76d17ba8ad824ac9843f65d711534b8720cebf400a3d5471de4b48f136098527b65351c7c749a697732d57136570ba3437017f26fe2984d947c9cb3d5aee0aa2888863ecb60732671d87e8c1b416f3ccaf7fb0e6c9bfd07bff0cd7989d94d2f89fc1af297dcfe9c8cdbf18b70b6943b890924b965a638f50f90b2e2496d9216f13d630d3b3ef729803d80b651be4f0547ddb220889e99507bf513d40f4825c2a91ff27e4cd6b8817ee47fec079fb9c68ccac6ef6521fd8c8ad0da303ca5898274df8e330eb8e31237ee71c30967dce080abc0253e02017297a2a7244eda01ecc5b19b6f01ceb9ded9beb21c81754765b5016df71b8dec9d6f4ee776ea6bdc88464cdc903d74dce023a8cf377bbf6deb2c2da7db05778098a0d9eedb9495bcef20b6982142c01b2e0bd13545b205d6950edece490dcf10f151e7dc45457225341b506195fdfa0cebddfaa26a54894706da25c9f071b617f6630127911e582deecf2427faab7a9a2ec0854a0b7f00f563fb8b187b8f32c39fb18d11e789305002e4b543b4ea8c8517b11a01229013cb077ed299aaf78e18dfa3e4a4809b783a755abb549a8218eff418beb5aacc8e8835197bf8d5e8fc9dd66c9602387da42d039efc6d6707bcaa5fe3f56bcabc56df5e4714b89b99e54bd92f09ce9a28a72929be8c173821627e4ac699bf84be595f1e356ac6ebdfe2f2ccbc471490d453adb6c45d91346d72823aed28e2a95ed2bfdbec83b5fe8aa75082946aaa537e6db683a7cc2eea64f9d82876a6c6f2ad653f2401978dd9ddc939cbc30f0a0c9fafa58f40141610ac1b89e66d6317ac544e4bad910750e63a275654b53144d95843f95a4b2e8a34479720062f33adfc64a414e56aa3a54567f07b6f7a7c7e5abcf90d10ec39974ef8283827fb65380150f71781cbe677d879d1c0010469d035e22797ab34a8cecee31a2090fcdd6e3fe0f2158c29a60b9d94623d6092ffb5e5e2db9201e82f85806520dea93ee46601397e60e43f7c5d2e85d000b8ebccf490670718535da82bf839420fca705856e0eb86b6fe7e31a36e364b469b34a85e8cf26643b5ea502c01d6bdcd8b313eb942b8323ff97fae24f5de86170341b1e73a2c509eefc63ef4536e0e4ddd8b0f8d161abae5128bae5be15947015ac29ea4c2c3a3490da1b060d52edbd76c7a2c7be0adede3f9998f723cdfbc43a96cf3732e2013d9397aea678180f619a90211767fe3841f86dbc4e9cccbc72e6da9a0f24d8de73f8dd29b3387cab1f51020f3b89b32ceefa10523a4a6071dfb4728c48d92edd5ddd3e90e0e8da93e8880dc58dc44e1bfa57e2c0ab000ed46b60fc4dcfcf3716ac4f7c34f4afd5814c0704141f6eeb7aab8f4337be7a22ef7c86ab6dc40926962991073414143d79f1123fcc4f772768a32c3f7e1d27a71a0a860c72244b60bc4018f8b4eb83e8be4376af141201f50415f61a67a6f85407301e711a92a99e21c13010cf1e950b8a006b82fc3eb56328d7657ec0c508df2060c449cb013eb90561d1089a22e4252869a53067a5bab71e376d663cf6234a618f91cc1f872694c3a97cc97ec9b2702646af618bc0524e1f66216c00d0169d53597a21aee1d91eaa9da4a4d6c27f5bc063ea9b0fca6a1f1acc22c2ede8b2ad6cf343b4faeae116088583434f9c244aab6812ce180eca0f7c3848cb972e13606be1016cc2df79530eaf78a5a6a9cf197f0034497577ae6c3be4596ed176a07fc2950b9b004f4fb1ebd04ce4664f85f640754fd029a37e6705d40d6554d079930b6aa64da01ef2fd1fb10e80389af4e50f9a3cb95dc197031eb9fcd6ed245d2901fe16d41582b2e430ebcb83bec15771665e5434fddca47d09895132429119ed1306ed15e9e6f8d65a48db45023bbdb965b4a99a44c0123070307e60645a688e245cf45a620f2aa0d3cf3c0e0070976e9330f0c5c1f55cc323273b2a7aa33cde69a5763599af5cdf32183a5d154fd6c68ce7fe3b26cadf41362995ff38acc1b74cb30f7074e6f4f03cccd2f5c802a428e54c58dce256e0ba248102e78140c1999c81e5b0fb2cbf0a3a801918767e738d945afc6b2aa53ef866cb17678301543c479faf507ee70e3b22a483d1543e8e97701d2cf4f4875aee2611ee4f1dc8aadef552381431981e7f5fad87a9751ca2938761979f493679e71e2d16df00c138f268f1e673ca3e4d165f476f18cebd13bc633481e69bd79e95a5cc24bb7b28997be01f1d2436d458a0a5e7e41b4084351898837f508da10d9440f407026dec94d9e89735cc93339c77557f24c2ef24aced16ee44d924769914a443d8236c4f660a5d87246de8c50b4c79b6f974d7c7b03f1ed6dc5b74f157c9f380d59db3d185fe4db53d6c14ac4b78bbc928fbc94cdc17a846f1f792f406dc8b76fddc843710eda1ebeddc445e7a095e2db471e8ac8c12de7db397bf24c3c1bfc12dde4451c7e895ef2e28c5fa25f4f86fc129de4b58b5fa28fbc8ef14b0423c851e47c4c024a276a3cd966269103c2cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd76e2c30a4b8e4a0e8c9c544e4ace8b1c548e8b1c16f77250392e7250724e724e392639de97639263ca29e5dc1c52ced79243ca19e58872ba9c16979c2e87cb09e5b8ac9013cad97256602167cb61a1859c16541d274f8684a2ec49ab66b710d78946a45b32999c4e505ca05ea4a460c4705aa99417281754658505060e85c5504e4e26a6128ba770da55baa491c8bd94e8aa33198a3aaece5e7ac8fb5eb8b47016d2c2976ebf16d4b3a77cae972eadabc5c5c5c77e7bc56a9cfcf6d270b617caa7f05cae71f2bcc249c86adb48c6131a8e04bbf299c81480f8e83ca2d39b522aa9a49246a7913aa595524a29a594524a69a5d44394d293a7d4435a70ec02c680bd758e73903d925f3922553e3f3e31d8ca135265e4ed0f225265bd890fdfae60abd9db951da962fe959195cfca6b75e4ad5d19c2cdd1a4938406a6239f303b5232719f0a8caaf8bcf599cd39eaa56e503bbdd48d7969082e68f2719db7eea2a614bbd6f999c8ecf5f441161768f2c159c1648cf4e1adaf746a5e66b2585c350fae7e4e0fae602bafcf41030c1d5466bdb20ec39935bd140d2995a05e594f39b34445aee629e9d4352f255df31e3c58d3595c2d9392bec262d33229f9a51c305dc5a5abac7c3ba8d72f25a5f4509e7b7605b35acf5ba72a61ca900bae565e6f9dc5056b808ef82b3d3b6f5788bc75b1e117eb2324aecaebadafb4e697a2a1b2b4959a1d2aaef2e9c012d1a07d2bad5e59af9fca8ce2cc94149edbe1b0420a4c0b1d93cf044db2183d36381fa0a1a2d66c8e830eeb5c49873a0f96bda1695f09a757967aa59e5ed9e9954253cb2b2d912a6ba2e1a467aa31fd70499589c7b9f4da44535a626a99685a3246fae944f221e9489d2b3d130c27c429e9987a7a657d7e259d1aa12d0546a86416daa48fb738b8e04ad05b134cc6706edda4734522e762c74999c44ac673e5c3d1cee7878a6656466ad5346bb72d14da821bc0921902b4b80104759d48341a918c9044332b1f233fab232b19c7f8c5fecc5cd10bf3573efc220a6fc94ba299950c003d0030994433ab2352653310d224ee7643285cc5a4ca7e2b9954b1c9a9338542be6ddbb681f757486e50fde6ab990be74e1d8a6866a5c4437114d1cc0a8954d9cde56f1f08815fc9a4ca9ea0a0b8e8564644332b18bf58ef6999f9997a4ce13485bdb2ce8345bf1dd4b54f46afacb3e886e6f3db315dfb443c5c700543a5bc709312544a0a2a8c00c0d94979818a11ea1091312553cc2413cdd8308d82b8a615f556b15e59e73ac6e6d208e4c08758d363560c1d19c3e3ad0c31745a2686ab57d66d2886ce1643a786ea63b84470c118aeb7ae62a3822363c0183a6fddae603174640c18238c614d3a5265bdf3158ca56673965628fced93cd4213b4b244c684dc3a8b4947c6a84a5c3429913127ae09385d9049ebc70ab126b4deba49d63293653d76107e5ca11d7eb1be322263ba878f8c39f989c998d191954cc69cdcfa0a898c91542c0007a9b2d65d78e00ac95b47f1c0d5ecad9f786009e7ad9f3cb014be75130f2cc1de7ae7e58822cfa493637e690523796089662bc14c356d0a1296964819cbb2cebd7806bff5928fabe7ad8966f481a5d75b9cb72e622d43a31424634c406eac65986565771674675766f29147666f41ce6744829b72182ebd7330b63a0f871c8864a193026b934fad71cd6c640cc8b1fac356206feb119da883917291010719d3b9751d3246e4d6739031d2add7d032d5ad751ad6de1bd2403de52ca2613a8c8f668990f4563e5265b76d8b906f4252cec2f30ae655570562f3d65bc1bc9511a9b29ef2563ed200b6a657b6d6bc75938f6d49950d997cde7a2af4d5901f32f95837fd5837c5ac9bd458370162dd74c4b2b894bc3505bd3569bd35f9f1d6247beb212f178cad576dd5a7df123742ed2129db062965cada483dd2508f3534467982b0794a2975abd519a8db60908d50e9b4beac8f1f3e3f2900b20af20410b2203f822811e249c2c863c0fe05481f5de787cbae905fa47b247e696faa840ce5dba98f368b611e1f7ca80d25427b623c3e50e1410a0b797e38e241fa33a3bc7fc4cd8334c837a991f021486cd9bdaace762ed6eab536951f0e59a7b7d3cf07777a7bc421bd1f47bfc7e85bd40c391284d2e25c3e70d14a95acf73bd1342d478d98d65d5bf5b3213657b956a83aa76975ab5554b99aee6d0b7d34a8378f2f6413b2dd7b05d359cb6c32240f724c8bd11ada835eda6f32f19c2bb4048e9d5db83979fe7041baf34c70e419d35f51f0c025635a7ae48da34794c7fc81a58fcccc5432afd8bd170e8d8d66a3d968369a8d66a3d968369a8d66a3d96876a294524a9188f103e9101f43916015c561efe4a77777778e1a33dddd9b4f9c892ed2e282a3d8c8881b5fc091cf4b8f1e685f10b2b9102b9abe05e1a54fe728b5a23947b1cde7bb40ac42dcbe0dd6379a15f2f84242df8e1d58f287abf9e6d2a74771241d826346b29112a42771e2a56fb06df6d23758cb98587b37d80693492548263e3a384af2729ba13ca594520a820749a149125e4997a04912364912b6491293242d2685dfc2832649f8e4e2538d6499c0acbdd704c6a20bcc0809f98d6685766a0c10e7073be15c22224061362200c3160686092ee41c0a2e75aede55bf321220652c0e8f8f2055100fc27cfdc00a1e3cc0579e0fb49edb429cc7fc9281f043d143a9183e140a9b27d319239522ceed73b00fb914bd103f24bb11d8018fbec957abced0c7ebce218fc4133fc11c5aadd6eb407d64ad3d8aa66b9a735a7f38dae5f36bd4bd7ef4c3d1deb2a7fb68560f1a6b090ccc8f2e5b61abd50252d3030bb4b65bc0dcdd33c65a6957d1021342fc182244c18f2ada0431a835f0517df880fa80f130052776c0b29bc851d8a20822a270c1112784b0fa882876504b206b7c24317dac00885a6bad3e6ab89a1e50a8a14e7d8860f3d1aaf17104f591d343d6d480e364f0ed2754f7ccd36305cf3df3f438c10fc72e31b2dd6e6976770c75006555cb2faed20fb81c2f708e17e48b62740065c5396d9531555a8fbae2c7bd434bd904ad9a5bafaae84651bdeabe3266523ef2f3c3d133ced994db663ddc383bde38451f8163d68d50e863cd439fed558b78b8d6439e768373fbed50f5aa6f845cfb76b8143d8059282150d3ca40bd7e38e6c791c54d3ba3849130ae439e0db9fd76a04212e07cfb7670425ce991c5a2054caf1f0e3aa78c492880c58c8c36a513469086f2e221812c86103f0a49508507f9899774b6e4e961072fa577ffc28fccab1f0c899a2896401d65dd360860b1005a816f9f9eb5ddd1b5ae9b0dd85ada6ec9b567ca49234a068bc1c880611d38b870a70d148a613030303035c8e6a44e58bee1a9b75b29af0a6edf70fae81393d99096ad7529e5b417a66b13ae7556ddeeba053bf11cceee8e91c3b736caf842043053afcde30639f8e944d46a0c1c465e55910c2d030f1c3c75e2278d33886319037617396619629e1b9552ca2965adcc1ab59359c42af6d92e597aa07d66d168eb81a7c70d019e7968b278d3334f0f43be0ab1f51ca993311a00619e71e855f4a01a64367c248d5ec5703ac0023d6c50822480a0c8107860cd0fa65745c094e04194110faa8a785006091e641f221e64d9c7117c0b529ca008cd12542ca105ab817cf4e97185152d08c10f588480c55268d10326f4c84006533c410052fcd4207644881556b0a2d368191e47001591c288278c98410e8b034718294209456040050a58d16b68191215aa18e24606419af8002b4201044a8e5042084978410f58b1f534e40e9147cbe984208ce821c8338f0786bc0f9e797890bdbba85c1f1d053112bfc8ee59c460fc0ffc7044efe7a7dedf9d1e2ae2883e1f47f453bcf143491516172451c17125f697b889b6b8d1394ef4832b5d7ae414c04fbde2b8003b18b7dec18303d641ed032d37adb5de8307cb7e3d42ce7decd19b5588f590fd7cb0be59eb5b0f6bbdc7f6dd5eb1f7e00f656f73cf2c3876e1783bc1c5a16558ee9031f1ad565de5ed551c18109feb67633be2821c4ea7d13db559677518a962f61a5b4a9844ec130760bea2208721a6c6506f196b3feda3dc8cf65aadb34ea7a19d73ce6ddad0329b4f8f413c630b96913892071fe4103f6538fb4d8633c4e946d91a9e7ad844a4aa7bbec306f8cf6fbe186708179caf8f73bee6901d1913ed4b8a1caab0f301782652851f9e2381ad437e9dde1f8eeab67e38a64ba7df277a41477c194535e61783dc761df2dba37ce9f1a5fca20442fb4f4a69b7b5dd5ed75a6bb3802ebd59a71fc8ae7dddf5b3cccc2c550ef69c48ba89922aee584d434a41cad813e09807d80fc83cad20e6e121c8cb4f87fc0ca05e072a6a55a042eba3f3883107278dfc286284e6b9c8144a1eb42fa7903d1799c2e7c119bc6a9bc3097d6e85163aeb316ba5528dfa9b33b4bbc22afd4df6a4a85b6d10b66a760b719d6844ba2593c989f28a8a30707282e202f5222505436585c5bdafc56505165a58b5d032b24a359adfe417ea1d98f1fa822b6568acb3a3246de1398d85e7ec0acf6dddf45cde432dcf71df739df79cc89f1bb13c475a79eeaa3c5782f19c29f59c49ca73a717cf9da0b878ce05aa071c6e6cddd3732926cfa54ccfc1283da7729f5b61193de7a2e7bceeb98f7bae25f49ccbf6dc0af63916b4e75aa8cfa9e873abf91c00fab900c8e704d06d1eb3e68b8a4e184d89c6c38dfecc2e4c1973e8982fa495a221b2a84716fd6a3a16f5547bfc540ca46f277d7f208f17c201fad95e7177b71338760167943b9206dd135d905fcf22017ac033e2d74de097ea1c4d7ebd73eb3c6df805c7ab5b7b2f0ab523dbd1bac7e4337da34f242a7df7eb9eee99754ff77cf5d6281597fa9435b2a6439ed1f9c9abb7131c338b6055f5ea72a7654e5fcfdc413b9ad9b8b016e5de1314eadbf9da7dd3668994b54cb417e53545c3c9c94f9c59954f3c1d3c70e228be0305c5513e1d50769c388a14d938e1c14ba46ccf7ac637ea449da81375a24ed4893a39040505050505c1c071cb548d7b50f6a250aeaa8e12c405dba66741b3356ba66bdab870e219fcf2f98252f6d5656d8353bd75aaf7ab7aef74871367244d92503d47aab5d66aadb52350c2125103452541cc410208b50902cfb431ca90a8e93e7a1be1c4e8a34b69ad943c36fa45d558f1d6da1b54f5639e1b9f7ef3036f7ff203dd646d1cf58083e13062c789fad97de4a6d7df9de92458eae8481da92375a4cecba73de4d33b081c337d60554dcb84be8ef54ab39b0004f060bf44d676f7722854d7fc1c72b5da35d105edebfe8167d4af8dc02fdfaca154dc9e6eedbd2894bbf4f919147b624fb48936d126da441b1bec762d4a934da732ec762d4aab322c7851f5533d4a1031d92c68b6664dbf78b0a677d8d3321c4e6f58cbf8f08cf85d921855d185fe62f86400c04b1e24c1e2037c8ceee4d27d31f0dc3eab841b5d8552cdd62155aa28608250841c3e1ca48a1fe4d90c0197c3a97330b48c64d15a3f0a84fb34a4e635846ce09c06bb857ce32aad1e7b7673c2a59e669d86ac31bf78821e20dcf8214f46afd87e9d05c72e9c0becf3d9615a464a5474417e30440254af9ec233e2a7007ea90ed37121192d43722679226bbb7b39142ae4ae523d88fafae5d02b134c6a44f455295cead3550e60907dbed62b55f5f28e4b43c2105d42ac842a339e81025bc27446267440ee99092085b8d4e3339da167e21201915983d9b7732b3db214e31101cdd3075b6232065ce9d99131a09dbd30f2608b92174dc810448becdb5b565660df1ee5494709128e3c41c866d402d707aec0462cb8d2551cdbbe43363b241ccd6bf1e9954a129519bf8475a5a7a5c52f0daef4acf4f4aa5b622d45e09618cf882d5bb424f96eb9e27bfb5a2c0a555b622e9d6f074938dfaa2142362db1938ecac52f412ed812fb7e11f6782f5efcd274a5e77ba567e58915d84a100b8d94a1382b464410d4125b39b2225b99ad2c59f1f9763a634b2c94c918f0c5abe5480b92ef172fab9ab5e490fcf0819d6062477605cbd022bc92f18c085479a8620b0a4592ef2933109d73d48fbafccb119fdaf04bbb8dcd11383d2f5a4186d0910dd9099fd091cd9028710111e2b6f3334ae8524204088c90d8e3276393907ce49f8f3123368830ec0032040023e3a30b7b5e64a992208f973eb9f6bca3fc8e00022524d08607b73a32b128c7f56d2359128a112ec9bd067550877cd247721d4ffa484e499674658cf5ee034b4efadc7e336251fd7652c6e4f65a92df80faeb96c745f3bce49927089f8f22d2c7d18e44bfe45d6b9d8a1a50df3a67f2684ceec359a66f09eb29d747ce894433a36e34baa3eb37a08c087ae62902f630cf3c459ce0b9adbbf76b510c95e4d61b7929eb3165bf8e65bb1e97a5cabb8ee4c5bff77a9bdd26920bda07477e43f7d66dbd4e1a4d3e3ddbaf932aae21b85cf5ee7ac8d60a9e38af0e43c6909cbbcedd2f0503fff517f8ef972a398e2fc5899b8ae1baf56bbde421e7f19b8f4825ef8a9c452392c7e347de0ddd8b381ab24371293cdb36adfd6a273b275a4ecb35681a47394e7a9d885251b7715a48dbac26655c82631794265cbf3da5cf4ee4f520f251d789462291c8bbce455d27124d9a9edd53360f8e5166b36be019fc94d26dce6d9b5e68ce90e65d48004f9d86a42e4f3fd2cf8f8bd0c49e453190beaf18a5e082f7b921b0cdf8ec955da6aad7761aacf7a7c31237a4b7eb60290dad83f54d7ef6ea20bfd48d76d91f5bfb5956d4e8f494a6d539e784e19a41c07ece39e7d42a3d4d24686aa666fb0de9dd2e3f10f57187f4d0773986ee673b6f06b9e23a96abd333fd3167052390a79b8cb11affb7686a5aad19a48abaa516bc3f51293308ccdc3c4fd7e471f43c75cfea041fd23637a398d9479c733681d9b6eff84d8828a5d69486524a29a594bba2fb4134698d31e6b8a26a9bfbe419d143ddb6bba71b4e27d2a68568ed64d442335ad7dd36dad04aa2fac1f003cfe6ba18afe8443d5c9d23d26c1aca90d1838c1aa19f5beb963a5327a3279411b98803cf76e888c0049070df042210c307060b189309d775dccc8467f0e9c4e564bb8b62229201c7e9642a9d8872cc4cb7281cedc9d103783466da44d48d5044396642aeb98831461bda1650ddeb974fa777b74fc60f4a7f2472818a8caa756405079e9eaf5451e9317e1ca314f59c9d566560a00fc3e6018ed3bced5ffbfadcec34cd9bdf09a011d2ea8814d25c6b11c79d330cbdfa96364a5e3ec8b21c6ae28f4863834c46b2e492edbb41aea40d3332990cbb75a12d0b8fce2117dbddd30d278edb66a36e8e99766a6f536babd7cf45fe3a830da9921f0c40c8c8738eaa572b6344d1356a0161364d47d93cba75d2b2155d40435b689b81b5d6daea3dbd356babf7f4d66ab756abf7f4d6b62d0bfac5a6da87b62c7a508b8052ad66b518f44e7b4fc35e76bd96dade912a9109c77b47d3667446abcdea0f6030f2c1ed96d9ba6bd76e9c96a9ed03c7d45aa1f0d26b28bdcaa4aa4ec13155093e61168c83afb296e91dee1ab08ca6d9e8e0a54b73bdf469998682bb0a4da6c9b4ded17aa7ca344d56655556b380424d62e7a7eda0fd6665f74ead816247c3f9e9eeeeeeeeee596da81bb178cf9fd93fb37f66ffccfe99fd33fb67f6cf0bae1b5dd3c9bd9fd93fb37f66ffccfe99fd33fba7643aa1a0dcebf933fb67f6cfec9fd93fb37f505cbc48b9f733fb67f6cfec9fd93f292915f77afeccfe99fd33fb4765c57f66ffccb63f2cdef367b6fd71efc76b1e4b7a561bea462cde136836d06ca0d940b3816603cd069a0df482eb46d774720f6836d06ca0d940b3816603cd062a994e2828f77a02cd069a0d341b6836d06c2014172f52ee01cd069a0d341b6836504a4ac5bd9e40b3816603cd06525971a0d940b32d108bf7049a6d81dc03f216008518c32662e4a54f1825a24d4d6b19b5b09bce202fbd4e1c6d4e20dbdcb696719bae5a63f6c84cf6d2b923ddecba96b18b8542af6e0891972e0a47a42177dedb32de1749345392405e88d2a4393e9927272de3097fdd7a75cc150ee18273f682563bba5e4be2489dd78eec99853d309f58bf5a12d66ab55a2de91393cdb4d7ebf57abd5aad56abd512ddce744239cd82644bd6b8c21e984f2c0cc3300c5d2e97cbe5ead84be2bc5eafd74be725772a9dcd66b359188661e872b95caed7ebf57abd4c5050292661ec89b0e81373856118862e97cbe572756c16245bb246ba6418866118ba5c2e97cbd5b18e75ac6331548b29baac0d4ed479d51086611886aed0e572b95cb127c2a24f6c7618866118ba5c2e97cb05e36b29d5c0b2d882097be552a9dc51a87ba34dc4893af115650cc3300c592e8c958133ab41a57247a1eeb5d6caee8cfaacd239eb399b73361ac2958ed330d22527e325873d30e9dc32b4fb404b3f1c0a83a93e24aa217a0a2302859db48c5af42322b488b6ad65ac5c6480106e141bc560408e455738933830ab81301c8bae50e2d0aa552dbac2d9a495d6982b86934e1a5d3d5d4a29619e256914bbd1594a297906911bc873ffa82dbb7b76a4b15ded34648fa468249cd735b4475234d3dfd1a3289a5f70f1f493b019290a725c415b31c618233572518a40758c31c618e36c28eecf586b8cb1866e0105b08831c61863a4536815a5522d5eb0888a1e551126ca881ea3a8868b6f25417a8e502d711c58c529f1cbcde1461af483cb518e50783cad41351b6fd8c0691c191344ca549d1b55677bd19cd8512a868f1f88818f0e932af627702877c6a2a0746c1de97befbdf1933120a0cc3967bb58b0c1ba8667189132f6b623f956c925dfde2e9e7eb20291517fc0a896f8c807176c5777b541792bebc18df52bb8039581c9181709902b1aed7ae9aa47549b19aacdb31c31bf6c384484491c11421389a049822609254e52a064043d29782205b1951100212283273c139141159e9d6b6cafbd27e524828b2e418f46dcee8fb26c09c4c8cb94979204a343803441890421e56c96e084f18c9397dec9d34b182fe90c0693992d333333333333333333cb1a729c16524a39839c9d001a324a10d80fdcdcb78d6d4754a4d1d4d341493bd288cb1edd36333793947826e94855fc00c7524a296527a72c3299b6536fc741bb7b5a66772d6efb0c30485502d8a3e0f9b3dfca54abcd39e79c936b5a882c3033b34b0bfdaaa7b965d956422a1c8c2e254a19bd60ee98992f33a35819dadd26a793c98909a5e4e2a2482f4629a25407835309ad6c2cd635af7eb465baf40a9285d842c7cc2db0a01a9d1041b31ddfaef02ebf69f687fd389d78a8c46c190b8292a19901000040005316002028140c88440271204722494ae30314000a6e8e426c4c4a16c7025914a5380cc218c3084080180008010a1499a92902014a448f118c931dc7cf7e8c1c85b66d77dbbbf324c8131646ca8dc51166d409c43bf800de9b5219030961805ec0716904860c23648428f99105bce3eead663f43433b3b167214ff08595fff49d00867aaac74b4da0728ca2253f7c0e035aecf6142ad3143b35c7b20b0be6ff98ea0487e891a01502746998f6cd52ecb8ac891b6d9d91f3bdd7cc8397af52232a090b44b69f6cb526fa7c4a76e77fa0b6e618d4d074a6ea27c3599c3fd85350de27ec4d2d5ea86c430e85feedc7685bfb5b8b6cded93a5c2bb264ed4da70d3217d7f4212652139bf9f022f576f1ed7c205b93d48fc3accf411d92cef04fe34c6f7f7809badb6e3fd80ff4807011678fd7e56b9221c3d4df03e6fba772ef80930f108b6eacae6d0cfc965ac4d80d715d8688500e3f89f9231120c3e59361970bd8416a53775017798d08977362c3c8d390da7973b5f11a8e645b8eadf7dc71f86d9028259fe1f9c413237b60f11940c90957205eab98ef4450984cc1e9498494990c0bd99639348da18a18b9e959ed9ec852b067c7b4445979abf6da0b14e62205bf69b82435051a315de042995fc4ec09f872077555096e76d3ade58362cb3b626fadaea823600ddda6d7eeb968124e33308be51b51cb72a9d30e037372503b9f7e849b06e57a4fe8773f255035c42bf79670cf931b077140438e100bc3bc05efce681ff116bd79933c087c233a1b29e006ae881880a23263da69902e970a74743d92abf2cdb260c1d8b7a7ecdd8de911ce8d7a02c5ff4f5818049d6c36d73c13f5eb8017cb62c9e1e3433b964741907ed86f30d362b3ac0cb0df1b71ab1461b7340fb3fc7a341a9a44f087aa92d4505cfc8fa82935e574f7a800c2b426b8c63058a910fa2d4a8e4b2fecf488531fdb49eb334df85edbc8fbce2a5db36c40eb76dc9c36e023f6e7ee038a84002afce0c2b3726a99e2be882125e6bfdb214d4f366258218e2487b4758939fe1b6e2664ff2a455e3d8acfef1c62f7a7c03d3ff021a7428de133331c082b91a8a70847b2bc7b6482516c36830055b32df65f6b8df65b4b10f3202148e26746fdb8d3714138859f1592754772fe910a5948b74c2cf880f7561e52e427f46bb5714b1869aa2c9c704c49094468fd847b6bb08b94b0a4b22b4178e1adec61634a1a4e2ca48396ae66cfb38165fc30be52cc201d6ffeb094142534372bf44ec36326fa508218513d226420347ebe95bd77b264745e8b1ccc952df331a07264f883d5a61e9f54056b11177e2cde32a57ad6c4000630cdb8491e0c3c22bd944b73572388a859059805a057eb68392dde65174fed4c028b1d3d4ad72028dfaf2894697f4dbde797dc1be6efff575e6f5754bea75b1a3f75492b81b4fbbd097a8351d4fdbababd754dff07748cdb8b84dbde1fe68db44a50c452101bd3fe87ff1f71d39a30613b31ac898aa1ab4a3178e39d5a248342f79b363bd0097c585af434e90cc5fbd5c8f06c80b595e46118c757ed8188cc7a72799fe394e22bcb339311aa570739a62a2f48218e9047168884cc3dbc4853bdce320a27b785c29499d9dcb0ab4ca805d8c1f0b0d8d99f3a4d6e02225ab44817ca683a120ec58197bfd208797831830d406cd5569c15c0e0e6d824a863ecb91d054c2e3864ab6a16e2976124f068b6ef3ed0ed10fee4ad2225b55e3c6cae4729ec3a44628f6310a815c42d6c45832a11e2f2f6ce6e5a83d26e5dd0bf9fa7bfa23ead775408c6e1dc96d6f48a0f95e4ced6978686b84bc5b7fc0eb139a3dae2a349cf191202d6d22924233d6b0a5e73f9363241ee2762d01c63d91246c98334a9100b6d8f9a8e382dc92603b1253e1dc22134916c81715c41519ac5fd381de4cc0f7f087c37643d5da1eeecbbaf3f456dd0780e6751f50c876797efdfcb537e38d3d02160ae5dd870ae1052358ddc97e7fe836564a34a1985b564dad9a735eb8341eaa1bb710496ad8d10aea42b38aba1eca4dc0a951edd75f4c851371f5242939ee8702a186b980277831c218a36090fe52376de6ece30e194e280ee94d4db95c9cc9af254af37be2f67d0d7857b5db7709452a467432e1ac9b320298c4589af05cdb0a421e4caa45913228fa2e2b8fa3932d3888fba0e6e1fb0ebb6bac339a312ff5e33296e232f255975a1aaa45934fb37352c8abc051daf82c45ce9c2318d0a634b77c4f38691e11f051bbf20d3f01c254901c4b724bb316e3f2ec41e8483c6b5971380508e4552fa84591e06400cba7910c5be600a50a1183a363531051c02378fadf76cb7d78eec12808d3a1634fff4b687a31c8a7ff35c0240d140c128138bfc4e613031dc7b550af807748fa9fbcf693e12a6f319d65c7d9ca196abc3006e16f51ffd33bfe6500a5f8cd45264be924d311820a406d3bf667e38e68ddad952af704065f294a04dca84a196e68252d6e8c52d0378828858033503db5a2c4418371c7b9e11be80d84f7200485e2598b63323c6305a54dad8fdfb30c3a0e36b53e7ecf32e838c01aa2f267717f4e586d44e1adcc90cc18743bc4647dfb3363d0ed1093f5edcf8c41b7231d8d27072c597ce1a5ca00cf00620d85999dcb049c79154a4cf61f3f33667a1c706b32dc1061232de35b1910cf32e838d8d4faf83dcba0e3803502c60f20e8461f8c3c0388351466762e1370e65528589b7936823bdfca80e86b468cc52686e3470aa0624d0ea1795f9ab6a386902b0ba70892efe7f208272daad19ae0fbcccb217343fd30017e63ee4387413df1a20f7f5872f73f4fcc5206c6eb20a24ed999cd39299cb992524df6d7af33265d0735d95fbfce98741d882a59e9bbbabe37542da2f176a610674cba3a68b2bffa9d31e9eaa0c9feea77c6a4ab83af46c70b2aaebea2a5648877204295e2cc957312ae7125a526d7afdf9946ba0ebc6a1cafa0b8512de2ed4c88ce98741dd4647ffd3a63d275205581a31714f4440f66de8108558a3357ce49b8c69514ae9abe1b85336f6742d42b33e6a246d3d10707d0b14a86d8be9e6dab434bc18971ee92991934d9f6deead312f245911bf9ae64399d1b8b430bf13fe421f2d7dd17c28d311834fdedada92c75c2c7f1d205c4e81a2099f8dbe025edbbe70488ef14d91338f0bd33491456e8c4108af407046e96eca0c55f4886c00414b7c506819dd633d33c2dc8ca81089a2d868884442a5bb0e0365735ee0c63bfb75acd8b6b50fd61f68857a69a0423acdd13c09cd68f98e59612dce25aae91f45c556e7fd034e5764d9954ace6b56a8d437c93aa1f06ccff14ed09d0c3b2672f136c4843f3cbe278ded656697ada86892bbf0edf79bbb609187049e3dfecc2bfbcb43f60ffeafd06e9a81242b4b6c3fa375d9749319e679e1c743c30d86fec70f63a351cfbb5ee03c496e7e8a0423be8441f5d36c9fd93ba2a633110b27b88bdca48b0461b349517b8e37c6522406b2d0b0482e4cec24a093d510e412280f82b95e5f94b0b1c230b8c29108ce3b486a952a9373e7faa5b0da79eebec85859d01a083607b79fdbf104a779a777d7d2f7518ed29187bc37e6358ae86b028fb0ad31f7e2fbc78050b9401566fa4a5fdcf6122b37f1bf6497daca650c51ed9011a5bfa437a15c0e8366a93a5522a63b3a15c8e94cad86cf3d865e4f2b01c5a731316e9151ade287d95776c28e64008134d803ac4cc9c98e8b2d6bbb56a0334564e0979ef558ab44c71cdb28fa59d26da2377aaca6fff4128bc69def5eeb7c471745c1aaa3de9effbc88706d836821db5df2192c9aa1f63b8befe4b3b894614ecec3094d6b5caa2d66c852bd1ff7243003089148b2aa885bededbca96f60d1b01d7b8ce68cf7b4eaed836812aafa6a29c068340e24a64e36a2c4bf5ec055319bd03585e311989ce7cf8d9fc7794b9ea543cc7ac247f63cf6e5a99d33750fdbf09115623525d57df4b1c4741a96bff8152bcd39465db448a4c6138cbd783ff8eb38cd6b93388b5ec68495ec209479d7a09e7ac519767ead99962661b382f46606e0a581681d5875ad0ddbe252f5eb59ff25eee317f6909202f41630757d57af634fab602d4e695d8012611d753861e1df2c882841920b6bfe6e02e54bff28dfa19ae8b4d08ebdf49e67b756d3f908aee9a7f7dfa2c713c2a5372db6198db820c473758cb9df134f25e0c25f41b48ea71771657c86dff9609ce7111490ba5b827d73112a2a9202544ef35ef6b1e9d177188d5a93954337ffdcca79ffbdba0e847d0c3264eebabe668ad6f6e33b54e08403750748bf72c5463163e105bff4efd64cf325207b951c7e76925591a2b4762d2798cf4f4ebd9fa2de904a2910db6535da4de0a68786f03e387ea5c22b25d8b11bfd5ae00df5fc54626b11341730212a34599ec15c949a9f3de18a037d4feaa3ef1aeb143b235586780c09ed312e95070d380f4419c15ba289b7e9e293488c6bb01870ab1ccba38ce0e87aa2b78ffb2f92d23783ea9ded109d8e973e3018b4cadfddfac0f4e9a96ef3809b5dc5ad51182726c71dbfdf46a1b0a766684edc63704f21bae6e312d62e4aa648acbd73363a093e6dcd5ff0d02ddcc313b49a866c72f6a27075ffb514badea06120f63edf6b10a4fa30feefd4acaa313d7b4af86108dd6df36a5fac1e20a82837d05a2c9c0be640bb22ff959118c9e64ecdd73786d041e60c9f821363dded59d7dbdfae7456e97a11fc5f92473cce19d6e903fbce13652752f30cb4fb6daecade13e006dee9c825afdda628e6901c126abb0702c24079980b4fba1cc50e876d67bdef7d0c192277cbb234adc321cf70153c5ac0589aef661c5e9ffecc2ee4aa9c5b65e43cdfbc7bcca81b9edcc50c033534416531f76f631f1a786d86b7f41eb7f00abdb6fbdb4bc4d31532a892acc80b3cdc161300b3750c58c277028f3f71ca6f368b00bacea4568e3a702336bb671b8d6495044909e5ac53c44e488ad0c072631a6e23ec34bac9c7f4fb506d91ba2b4b7a09b7cc00be7e7d1abd8ae6d11d31c2b939e6fc521354f3a90a3021742c54f65bc7d66aae3daefaa704186d3a602cb0cffa8fb30a1c0b5d50347d391580b7ac9c2d04bb635d2153804768c99142ff68a9a20909345656cd9a1cb74039d754593796dfcb08c5941c77923f3bb43ac1960c78a75d8574eb734d901d2eb9898f78fd193a1db89c0a17a2fa0c9ec98ea0d280b7b1c6818b48de4fac851aa04c91867e309fd6143ff378c390c48ee3f6db1d029335282d98027ca21b224e5c5204618dc466058df6e03aac97644a54104fd8671a3ce4a4a6f383339b2a32fd5b689350cf81ec1c2184d8ad0822cb3c83402d33061816a49a689b047deee2d236dbf15364438507abee0e5082a9f15f9d026206f605cdb548dc54dd5121c0677bbbfab4f661b75123e526facc77654f5415b5ab46a709f8bf21105788afc0d86e907014c90fc0ecea730d560af8e59e905497468a2db4d1b68bbcaceba8bd5ce298f3071afd20cf1001ee10e1024b40110a6b7301d5821e8d1f18198896fd81c0dcea804b3cd6fd034e3792c198c46ccaac79915f9545a615747baafc2c6860aac73963f5cdc9b888705a20bec737b802e366005e5fed1ac8318ed535377e1607bdbd79ad8358d03d82925489adeaac336153d1168d97e17118ee2825897089cc8897ed7965591f7a3772561280acb75aa71a39d24fd5233a81725f14b41815eb686e0d8887823bfc85f99aea4088fa579daffe943e8b7ba1cc4d3e0f3f578b0d4748029879d8b394b04c88ddb27bc2aa462387242d516e40c3a8d726b749dd26a08a0937edff11020fe0a66e16536fe06119d186aa41eb5adfd25f54c18fa3b31b1adc4b744e0d251d6efceab144e55d779d0f25ae94fc412220a66c102c52bc065be9db60dd5bb2d8a2c32679003734293a7a7a7d141748a7bfaad96ee3921807ac0bca67b956461c723de6dac9d12282752b9dec2c0bc1618600f600359ffd82236f4bf2477249ba376c124ea29a20f2c0128469f0691e6a104d807f2c009fded0311d3d05544edc93088b92875ed9030b029020cd4f272d958f2043719bf2b9ec3e6b01a677c4b9596956ed4fdb5cb3262b301b0f4f0b864f84962b2f504ffaa8985d04eeb96a2fbd6fc5b8cad7e812d31c7a94984bc37906db42487c4a494af9c411c51ca6824b1965c099ba6418c4be46947f0f69604042efa42b530f7fedadb7f35a2f7b856759cb054f4c02f2a9df0d4c439c1b22db18479ea7b8b80966dce11ef010c03ddcd0bd6704904b3f4a508323b3081577819b9468a5828fa413e2ed8d09536804049115580dd888944084613e9bb12a51d29d24678c7fd050157242174b48cb8bac3ce437347c85c895ea53d050a8f8d5df60a996582959b2284feb37e48afeb83c285a0816f2bb31bdcaa2fe25f33c804bd1edc6cb1571344b8469051d07758e8d3a5de8e0bd1a983d5c1d4e671a15ca12da010735157ff5f59879f04ed2c2c1ec191f593eeb435d824c26d52d679580606972ab5ade0b156a78e2d1770f032b69063ccf0b2c2510667dedf5f45393999590e7ebdc3e955f80d38e736d3c13fc720f9f7274fbe0a02a360a603da14df73ebf1a5c3c973eb5cc805f3f454ee21c5fd417695ce933b8ef10b0aee14df28c0f085b468cd7bae3044d19f589ea51746e475bf50a82e03d07e0e3f8e9d3802c763c410fb147dabe8649dbfd7dd24c46182b50f130c6e640d6c46a77c925488ed27a37c66322062120820c0255e5b3054a2526212590ff5bf63daa2d3f65141190cd025edc051ac3553cdfa5029a5b6efb6f5f8a619d249b84e6a7704b833b238a13fd302539d8a6f8bd8371f6365392d49a65c5539db8353be24f02ecf13d0a211d1aeb381eb372670543451147221c3e00e60ed1806d47868483231cf98048a9a6add3d45c8c2e409e64ed4e6d7e0358dc3e9134c36032977a24fe3c7a6b0d022d38291489876d233a872b574ba921d40d7c73c3c446fc4fc4a6336b63a8be85e9db0dd53f4a7956225f5b493e95c8c5e22a9c9886c25fca8e0f822e86ae8da334ac60efda312c068588765fc74806111c6d84c9e3ebe3c300b2d78feb9864617695f761c53b997d1f67e71ead4d15029ec0d25eaa2a12576afea879ec7ca40311efd24924eb27b2d31bfa4cb608f8201ddaa430a1b51aac578ceb64d8240a44ead66b78a9779dfd0cfe0afe1d7c0cafa35ea1b5b29b542c41c1d4f3085328a565c970679fd8d2c58dcc3df414b7388ef4c4fd2aa82c5199ff65feb9604032d20a4515fd3ec7ca6935f3533a3ed1082d5da5ffbfc3a78dac78916241660067d125963bbe050ae8cae3c6d83a78cb68405a58b54d4c1f92112b44f4e8498d221ed57b204c99ad0effc47efce413a82cb9068dc5308c01bb48202c44a13103258ad98b384aa2aa19f6c11ea40a2e10c72a016fd518748347cca12f86b0945d3b3ac41bf955034fdcb1af04b89a1200817199dee950d7ae0366bad8050cc80e3e4c23dea10133dc47534e59b993560298739e183c2f625df4010046e8af325ea7a0e5c36e82b888bc6a75c83be83a8483cca36e83b888bc4a36c03be82b0483cca36e02b088bc4a36c03be82b0483caa6c09820763c70ba41b3fc2825231bbb101962aabc28f940fd65d3f9742c02fb7e825381c445553c5edddda4a3bd312ef20342c540c3909751c9c96f80c38c405acd991a7f9171ea68553d5c8b084a0aa5477c27122a2f27a001afd7474f3bbbe3aae5a313a294413bc19bd46272757a53266aece009d6a030405ad1adede116ca32637fddb5be1023986ef98521f8a1e85c2b4742f00ea86450c52e9f3e006e9df9501f0eedc26d6fe9d7dd7c0dbabb1db26862d16cb44097460e1fa953765ef06f6ba5be22c76247bff33aa338d2e1ad5b9a0b229735029499c4755de837cdcea7f8f13d430163f8c2a79b3f3c0f5b8ca8675f67945fb15cdfecc231c6cb12abd0c3da0aabbb6bcadaa2c5d5128ab0e75c7d9986e39406b073cbd6a8c80820fe123684c5a7aa7389daebf50e35b01a72bcbc0d76b52a141422c000ae1f0c2f1a7bee38564ea483086e2d37baffb484d814b5dc9e86a31beb704967e32dc5e66321ad82fb9b9712f12a2fd62ce5b06628e91101806d78035a7d393df7e924b0f7b82a45a8d6f3c007e93c115627b2b89a78dd94b692666fe62f776ef0f7a88eb204423c9a6e3503909d819a8bfaffb0baac1712d2b427ec9c88abe32342bd0458790cac4e02cc1da3ff022ab2b37e959817dc31ffe62b3caba40b49108816f6fb29075602f37af2a164ff2b0f0dba109738305843fdc3e1f60f3e5a5a913e6a4240f839ba883264b318005b3948ad900d9ccecfca4160f9c322e7033456f63dc9a2fec3af6cf8d4f0b47d884d661ae517376ced9746fae7be832477fe72ad10136983bd04d455f800163d2d39085340d0bbebf9bc0c7e61a6b7aa0119c24fcb5f59c3406577a70f01e9fdf9fe3becf69db73d1790e53e7eca930614a8cb9c3ca8f173acca084e3a243f265fc380aa485781af9f46f1fdae74d9f295487050468943a64e4454bf0364ed24bfc71e252f33cdfaa4843c58722c39120c1cdb6152ec9753f08d97c31de248a867345d53599b862d6423c22d0325068062197bbff3b29297ab95f5046ec923fcdbe10307d4440a467ad09adfa83a480a06bedea1855be448f672e6d70938345eb2f598e5a42e4c7ef694396badfb337e695c7affcdf59afef75ae0f8756a237f3ae4da0d6a8d06e27f0eabd1f28a8afa3f01e28aedf765e32db1086e827487d773c99d0ee5bbaa2c858dc10b8dab2558d22d2ed160d5bc9d621026aada2c3ec04ce7224644c653c49f433788b04ab651f3b8b58823357de67d3f3d614f691b19cc4d1220fed2196e686ab664ba3222400a934c87be74c62559225812b7a2876f15620e4ca149000bd2c66729609130e51b7c285ab65318feaa2fc530f1aa80032fc7078cc695beebbd8576213088c4e118b84cfc30748ca750ce82c0620c51457356b7c5d17a2a949658d6a87889598345dffabc4533bac8d8e2b6711a55678649b4253175ca44cbc1a9286177373a6f0e6cd78363df3c2fea28932c1c7e7250e7c75f24b12e48113468d11e1143168069593ae6fab39fc03472c7a9e8782467925fd2e939c70ea600d47e2850802409751ee26ed9504a79770c1e7f7868117bcb044ca3f3c3b8584d90d6434de5eabe4fee90dda210e30cf2660704d4d781517e1876db350ba78f34bf8686810c07eea5bd148e9f414f979208107b2f1bdc438aaa4a2f25aa5792605c3d24263ac7b412e0c7ab9233b602c10562c341387cfaba96adc6a60210ed4673b30d1ef80f32f46d7bbfe0541eded86919f17f8b032947f5329dfe017c100e0fcb6fcb2632a8295f9d60629524194e619d1df24a0e8e2a0052a38c7090861b901a48e4f3ddb89d368fb03f1f494f773cf4e671f8123042bd6fd836e210d3b7d4687c853ae5ba812656adda2a0c713d2a4e29054b6c3079e5661e63d4d2d2f232d8f69fe665f33e1541da8c47148b090119f0a416803c648e93d7246ea2acc89910c77f3d5a391dbcb612ecbf82993ac2484f6a667d323764553b0d509e73e3cb9a1a122822f23668582fada1ae5f78de31eb2b4ae53560d948886bbb601581ed54c332c520de4b0936a96dd461acb02d7fe245bb038e72231b59c9df74967748787fb72aab6a09fc3ded95492e7af891ea922acea134a5e9b3931713ea7ffa1c12a4118d3e2602f44cc5837679492bd4aab2e5d0db5c6a0d28c85801e0ccfd09eed839d8855b8ceca5ba0b5e450b31263e8e667927750f3ef8a24a5d9eaf0a4e2b07c01f42e84c8a40f2c2d33011c9683464570a0c89fe6f49ded43fb2c7224e75c91666ae24d78f1e1fff92451f57588e9dc68c6f370b255aa72fc51c0b6a6bf4013a4287648a12a818df144e7ecbff957a8ca04b2074042fe85fb4f374aa14c263078746334b001980e412e4f695598c2122d800f391ac0455d1b208eb7909430e0a06b2906144ae38c9e8f00d6707ff8d98a11b12800c001acc2ed8d5cf2ee552c3ab3f166de6687f448fbac4946e20650225e26a34f461537255c022462b99abc7773f2d27b683e3495b1ced299c0176493f3f5d8f5e81304451407dc60ddb5c4504176c4b415534d6905e1ea4c771a521276b780bd2daf1791d7803afb5b822697d1c212a093349b0f780416a956085285b7f3b4a422b204cdd29dd9ccee0cd09da036830b10e5be1f5f674143afc4738fa3078b90963c31d541276d06a6840297a58958c263ce4633bff1406aff4f0bea3507f34d1fe9af8f53172a90a0f8a2b14dc1817019026ceb4baf32129fdf97517cf5a712d0857d222cef930dbaf774df78f1daf8b2505d2bc3e0385eb8a62cd665f0c19e41a04673dc9b3bc70f29bbdd9867764455f258da4cdf0fe82a616c910435da234a0c410339b278387a9781ad60d40eebb029acfeb97a26e5bef9f3acde8feb001dcb6788f046cbd4364c9138b52a9791fdd55afee151a37474d5e05532614aa52e950db39434731de48f9e853eded2cbc30963ed58e83dcb47c39c61a20ecd643cb3297e2633432ce6431f4599c1d0d1be1e3779f3c13f78535ea07514892eb0eb9f34196f90a164387ca4891209ebcce202381a903db261032603ef3040ed40a811128042bda7a62d9f812f971a852a3870737f062daf717c5c457bf003b20321a6a67187d9ea58489c07b85d01d6d4689c189b1d3d3130bdc2e159e6ed1e02410794dbe6e119f9a8107d6b0a2d3c6e6cf1af85b3427661bd00a1b99cbd680dbeefb09a1f8a1b45e824883c5de2e08a5bd143454accd975453a51678b0705ec838f8cbd87aa098ccf7872b887074330877ed59a67a683e5e44919e8ce7ab73dd94d6337f29f5680c2c0865a95318372488f8f9e5a1e2d2efb572153b28c928d7fc1791a40f780341f6dbaae3da667e16ffe6451bc5d0a5c0bad3097671b893aa8b00d1aac7dd2ec7c82c8efee1630b7c9b721871896b1fa302e9e1666c95a56b30c3568016efa5f766810c9461cc0448596f4774607658e702cade6437271cf236dee0afdaea952d5ee39d22ba6109b359f4366701f25801fc834b52394b20916c37465401e8b3b126204d8b3706aa995019230684f00c2e28eaf06c4968b584c57da11a050923bbf6fee016e22a813a9fe3368172c28ed9cbc990b394a3753b52206557a7004aaa613d5a7600f85505a40456275a119915518e6816fe30f59ba6b358455bd84db3ef86417157360ac62454b3c96cf8c333e4d0a7a7cdcf434d058a97885be16ab178e318dda22a7b388b4b8941016c768d5a2a233389de362918d59666068320f32bbc10a5105e00b504cb1daebb680e87a2e9d418c6d4ac514a86147736289a9c77c775526e02f27173958695d65f731e6b683955847261dc54d4a47d0c408f825da72cc4fb92eaf2fc6c3bc5d1ba31ecffec89d78da8c41b63a1a76d9ac298c707c85bba7980b933761e3a391ae9114592faa99bd84a2a25c529a3856c71e23f4164126b9e1872e3ea81da8993e72ca5d1a586e0637f61cb23f5dc74323c656f7129d107ba87964b5dd8280f510adc8812eccf6cfd7364c392f7e77597b0d21fda29f423f11787d6bd3625159498fa0cd0fd0f881ecc052fa8357853857902e8453b6d5a363a37441c54623ccc5e169a27a76d4518b8d8e949549c74176235ad840a134ccdcdb71170c67c7d3f9e156d050935f23fddbc7b9cbb89b91f81cc4f73e2e58e866fc615d3281b41de513b6f2136fbf427d0ab76f9c5dac93d8ea1d2f0c57582d65826dc578b64b5dd3aef83047a51b57c7ef2cc9b167e23b2eac7854f37b9d4313693e559f43d409968bdd6b5b633bd54cacad5b34fbaaf1a739747ecdbc860c454082694d5ebac4bd4b0aa0cf0f8af90e2dd4fc09201247b92a56f9ebc4d67254cf92aa4756e3fdb89c305b75cea2c65d19302d597001e029e14a10cedc26d44f8eabdb9b02d97058b77b5f55acd1a468981851ab72608e3d76334745196a9715b92aeb44d19fb87c8749e7ddf824a0db72ae09ffeb601f9c0e3d24122bd3ade8cd1333d09b4f714773bd51dbbd11f2e83d2d7f8a9e0b9769628b0ae27fe5f8043e361b1321b816028fb743dbd1d8122e55df9edd2582a01c4ab3476ae952d2ae332ffb30295dc01930520111c717c9af4864e409aa08ee873b16ed3e815e8d90dbffc85d0b96352e2baeda7c217bd89829a5a45e7d73f83e2368656bbfd13b80ceeddbddc4c08611bb28f34e07540b92c4f9821d36523f146152c1985eb2e69497aeef03ff2e38e553abdb2be1ce7db1f611b58d93ac55671cf715854e6eda85469d93e19a78d4710caeeb7529f25c57627000f9e8b266164ff44343f6c51bf081d75e3047efd6f267ffa68dba400c7e7a590ae8bfd2ff147957149f86ee3b0edabdd6ab236b80ede9b0f15a6e0fb1ca3534ae41b0a26d6d861c6b065ce40d52fd87b01099ea707866053fedcfc12ab8d765be84c10cfe80bf4370131a2454ffe6d2df2861cb1eb6829c4d70beb3527736df7509cf89a04afea7d08f9788d7495a240cabfd57712db9e4e529c68a505149602b91291e31c8c08435f0fa10cdd1442db9067960f285edfc9f026bbf3f071988cb31b510194b741eae841c43c97f6895c4ce1b670953b6361d16158d5be531e354165aceb46c9c7bb635f23bf36e58228efaa909937c38dd1affa6cff51d8beffe4de49654120c5a54e7e300b4eef46966252ad1e0b0700033b01d05988523885df9ca68682b7c911ae70cdc6a0db0ecac9768245218f654e24aae480635fe31fe25a056cb2d91fa147fe07e82ae305a6c172ac2fd7e472f92d51bd41082501b2eb43e37d4adc18fc46c20fd298876b7c47d7551ffe9b4b1e8aa733e58f77bbb144bae2026ccfe7f453630fa1103f6600da090aebe453307192fe70a4f4634b11b5d17563c8fb906f2cc325d18934a2769f18b922205f056d0bd10b06483cf6f708b32f635b7c17197e7cd6f4fd19fae5e4ef2a3dd724fbdff66091c89bb9171cfa00b75274aec2918a04b6786cde71069e179a9591acecd0b7fd5bfdccbd4029028e2f85fa4ce8a2c70345f2705925701fc022ca1471a511b4504752ec1876083f3c4d411255914cc92b88f21cbc692715fa3f477c1a9f83a8950a4237d96a87b2b8c779604ee3ebd48d97bc82539a011ff127736ab01de4b85c948bc5b44c50dc84f7eb6ab3d4079efa56a572577f06247d084935dc294df5c5514f662e4a8e1b8e06e8e6f4a90dde3cb2ab7a6a8414d080715c796fbed7f41f631b081894f5b765a2e297480f09e79b17f9fd5b76ae530a3bca72a8b7163e79aef41476b0cbe36cce6c80bb29dd8482f86f255c79320ba1fda1e1bcceee26e3dbce66d807b50374e2adb58305ee8a183848035831fb21aaa400be5303808041e0707a60d520ae859821cb03dbd4749db095e20250dd7476b25b0c1e5b616a3769a7caf6cb83c0b53aac5a28a9b4ca530fd110e078ab45f3bae1608661d7a0b3398781d4f5a6e4ae30e1da694ab36748bd960a2fdeee5a148e0af12c7d6574bdd8a01492b9353b130dde3ebe608504b04246c8e4d2a0a9867c40aa7dce92ee9436fb76a1151d734640d34f877fb183e96dac0651aa518193293edd707bcf92b5cdea2cec32c6c94a312cdfaadf36773e8a6ae4280d50748557456ff17f31e4fac4299b8fa3550138af425c780b616e6dab3c5917f76fbe5819ea74bac3c77c9590ea4623848ace973b04f4d4a5e01b3cfc890166df3fb35745cd0031425283da6c53be8db7ad972dd8e20015f988ca7d03b90fa16fb67b684257c7f815436b64e57853c6f9d7e90caaf7c3f93fb657c17996ab5b72491fb63845684a67864349542cb0f4b89095645ccd5399553f050cfd19b910e0759ad4bc520ee2e90087891e2befe8815b0350ec931bb1c9c7b4fd4fd01a3dd61869f9ccb95a861e1421bb5767960f24345861ec8509b5becfe63e3c829e0ab2b7fb55847337e168b23d0faae27239c55b8b7491d3ccef322f1e6e9e064a707ac7e84bbd391f633ae8cff2c5d152078d673e330448f6e01bd54c6d8e1aa8f16adc8cfc7f584962e60375bf6eb919e62d21d6d56bd23b48e36509d76a58a1d0d7d54464de2e8493f043a9b9549a9b55c56a29165da519b8c71ef78ed531aa1a2e90be9a05512c499b880afd5c7ec4b695d8c7cf147cb86a683528d5b2e293061a4235bc1220ad2ec987ad72ebd214b751b48a62d7107648133b8c2f575f63f8d96e8522f8ab459bd2b62403dbf25d0c3b3311dfc55952274901d0759b862dc1f0090f1eafb6ef07db6aaa2c34abded1c00a0f39e609e86ef0500cad57a77681ec0063d999ce11206f9e500ecbf2241eb8335cf4a440368865df3ea6c92316e67e1cb3fa6121904301a49549d09017859b950f4f298acaa8fa781be556bd285c089a5cd01964118910291d0a38df8012885600d70ba414b0a898c42c0b4eefeacba7cc44f84a12dd60e109267c32ed040c6782a40ed02e345376823d7851e0076031a8ffa0088d92b41002632b4b91b2f699db78fc6565773b6b569db11e1161873cea38bd9a9ea416248ff9c7571c45dbd8b9cb4b55a69864934051ac100b55b791f9270256da3a593e4ba21745f7e43882dbce6144ef5f7cad15c254b5849c1348d8e16cd02c07ff38f60df18f86910fc1126a5ea0ed12d6e3f4311a6c5fa3ca2fee3df50f27f625ae254f2bd3f5490dc73615853c9be8bb092f0d0f888962d59a7e2e939980eb4b2ef4459042c4fbed1d43401e2baa7f95f2a5f5a08ede72f70da5d305c7455e984eca872e74ba0120d7e670be92db15d6a62841abcf842993e3e0630617d7c4e0fc016e81952eed3203083809ee962df03ca64b75e41da5a332e907e39b5262b177bf64faac97e008cce740fb29c9d12444cb349c1fac97f6a1443175109f0d03534542ef35ca693dcf739d103e6093c87277cf94cf017fb6822ff021c7a6910149653c2647b7e9b68ba75642ef415169683196890370e32529c31a5f6d7536118e516a12edea07f1a8f6bdca9bb25cf40220d64cdca211d812faa907115800994c5b04dd72449d3bb526a1b860524aefb439b8088a1530681be6dece61e32179bb393b14dabdedeae6ae15e3475241b7dae1a9479d94f87aabd7fcbf1dc3d9ea0469f7c704e67ca5a5f6659663e3778355f7185e2cc50f859925f93734a9c9f5f701e72cc6210a2bab5119ac52bab387c5b6d67862d07000c9b2cf3346cdbef8d2503f281cd1e061dc46164878222a8a705d46ba91426f90b2ff467aa1a748b949b4613d0b7c6c79063dca1f7aaef99139492e974018cc2b4deab0db3e0d5e469dc6bf2689759df79a46d28d727a5c54a9c95207f6c88d29896e0ecef80ca1a091f9054dea1b352f05b6286b22a49a8c84cb19247476cbda53e6d25c598d39ebd29279cdb3dbd5a5528c5fba44825c47057a5e085138c7953997e61a3a4b8fdbb177b116badd75da520a717b2049069f913983f3e4c32cd4e9dd059ab1c97b410e184364ed665ef3d842a20cd3dbd7dbd3edfbae6d5902a31c574ac355f402312182d45c877fa1fe995d640e5e888b9a4e3cd467818c628f9cca81e0dc8d7fed0ec4e860ddfc190121b21d9c3ea1ed7bf1d1adb79ec2652e2daa19f954470ed21cde7aa815078e548aba6c9f68c2fc31f5d7cfcf152c053bb1d3769d2970ddaa6ca46e4467e4d0c7112bbcea0f45e299c61d90172827273cb8df348f0f442e0702251c7d4fab65e1dc5b6d1badb30a47f05b6046a2b1b09495dd579754caaca3e1d33616d55c306993a84ee20e868a3dc3cadf3bbc93488ce9e8b7201a7d11c8beb19dd97d507f8b4e4c6c7fb88d9388db9df92b2ffcfdc99457e0dec5224c792261e40cbb04238e906c009426ab11767fd46229ca0b5e7971f4b92e63707ee0a64507af23e856b93a6400b39e41fde3b909cd864b899801092131191c11130497aa2169335d570ecdeacc1c169794cd11862048b6a8c0563d4014010a623da50037a61501a123f5804d296ff087b98554b5b7f697a6e5491d19e2b690bd1ce05519861a499e2296df5687a466d39b140baa43a02111c000625defce31b858a4b8caa57a0e1cc103e74e0568d92636ef31a8f05a2b0af54a1650520bc56a3b006a6e2e788f79d61d98e05b3b98fa406a8eec35a7d981c853ea68bd1b84c2fa55c38c510dcfa8ad4d7945244d008acf829bb99f03709ca6a1ded6080841464cdce15ebbf563b458ab028b4f473eb4e7c424ac97540bfb456634414fd5e73706ce22db2c10ace789c032d036ebb88b79cf62ba55be71050d6878a6a3b354ab270dd6c724ab3f0565ada4443f51d204d89b18816733b057ae07182681229785b88ca6bfead6e8133b144c6e8af36c467eb7f090a29b6d9d36d6314ef43d540e0dfebbc18a46df248ad57a9d752a6ef84ab34e32aa7732d93849c5eb73a0f9e52cc56c7338b0255f10ed8dd2953edb1ade6e2731091313b47bfa87728c8dcd50508773234e072d09df6b69dfcdd58eb964486cee74da14e5cb59c07c1c9cdc146d78278bdce16d6268f17e7c376a7122e5c321fea1b3779501d1d14cdf96fc9135bdb5611d761da5c324285a21a74092287629391baa46a616b1eb81a831412a1062bc28d28ea22e428b7d168cf2f3fbaff089c205e92d840c5d16faa5cbb590860d389d08b8614207bd5e742456740b81819a27ef706c9a31438dfe1a618618dbc68120e4fa9c168ec0917093a780e9bb4a423c209c80d5a35045c8a5f155a01dbc8b8d695218114f9387ad5075ee6bbd69e45fc09047846442064f5c11d6b474a5c2fd5a3a8f96d73df19a5f7bedefe8ee2150395565bec52a897b8aaf43a9cd397dd8d442d1ed0f66d7a09d8d95b322e24271a43882a748c7c8b86ea1f926809554c8b3c961d92bf2c918132720baf2ebaccb244ba753938f46af3730cacca7a64f229c0ea189d2defb52f054e6a6a1f6a8d281db4c7dd037692968d5120d694f2c39ca36235841395a458f57b83ea88bf27e248c730c731f0a859b31610ff3255152946ba56e0907cad883d0142b9078481e289fe6a524d5abe63507402203e7b33e48fdeb3473919a5cc810958c4141a560412e017ee91988271412b530c3471daa5547db54b60e7e22140fc45fc27c75c9b61ee4fce6ff6a1d7c28d55ba833dc2e5c0f456cdc82d87ec8ba2df09dcb13f9b08dcdc850e1fe45515b3d7125b94d61952625ce34beeb335362550075e978d5b3eca89c9c28f0d7a6b0c2b804ab0816d8b3946532b80371611c40a5b4fcb554de9656dadfb2c316958c20f1d6956957461795f7a6b232727cf14b73fe5871cad521261fefdac5ce5fb68f0ce0631fda0c225f2849013e9097e1600ee0b2c1bb2fb0c6562c2c0d9144100d50a03adff1e77bbb62904c8dc072d1a5e30357eeba21a5572b736929589a790f954dd02a314450333429a199696e23b2d4ef4ef15c3614fa6e53ef2c94f7b9555c50f33483b483c503b02898c37ebbb96687921d24172d6482c97d85a287464a84c39788f14af642c456e27325cf1186007674f8328c1170987e73749763e3a91775ebd46e15caac9c9979edc6db0dd8e1f0a08c7295f3394e7ee822641cc12edccfbe6e451a8ffa3c90fe118df231b0c4b4dfdf30902432a2b52582610c29b47c9ebb396c0518f02ae9fd7c8a9f9e9f51423d07b893d4e0e5df8d42d2aa93477b918ac00ac36339fe0d3e932aaa925eda4b772971291f04ac20cc908569c12aea4a6e7e14ce597044f4c56aa0ae857a9ba68b7db87d9f1acf100bf3fe4c94d4991d3b1bf2f7876d4d36ee09c94fa2fdffadc99ca4bc3ac08d28b5c93ec7fc23aa35323498b57f43d039053b9e41d3004044f7898ae0caf78a3ce45ce337d00d220b8479089fd950d22666f6c0a94b168f8085d4614e892a429e79df9d1174942be367d4a9c3a0342c880a510ba8ceaa4e054e6bec3e92d8021cd0a5a5e7b3c1056861358442e645f1416fb46dfc7e416942802445f90fa3e060a1d89c67875764a15f383bfa400ea8893d0d6f8f81fea7492181390e27f296329c9ce513c3089530cf5aa0a93dc205431717bcc477b77556732a74f089b49f878c4408bb0b32e8f9308963be02b0178540c89cb9e4f5e22de3ea7aa9071a27ebaf2fdb539ac3c5d952c10ac9bb36cf1dca2b66b91a38132228d59af4fc371e3533185f179b27920db439ef1a9a7f681c55febf818cdbf864ece05daaeea3874188c576fd225b6c651fff25c2745ab92b0019967b12ed7a190eb1a4e19c355120dbf1f666f7baac2cf504c5f88327cdfe628f27d5f7103a3c327ebb09fa3039ad2beef8773259a0837088421c59625059474dce5d56f2839a7cd5a2e37d8008e089519165d3a94df3efeb215100ec46533eda1c79827e3ce2363b6b3d5424bb264ff84a3de20c465a82dcc69f97a3c3e52927f1d47d583c2481e814dfc0405e8b35d9838a3279e7c79403ba5fd001cee91a6147a28fbd7ab0cf92bfbb23702cd7e66cd8f0605612d32e941ce84f5e3d3fcca56bfd225d1d35cd86e125d2bb7ca8c072615563abf8afceb42465ef381518d6230b0c614134157f69534d62e335d1127c492b12af7a095cd3d4a540bf3e69ef3ed7309c4435e7ddc87314c7d6098128799de872a2d43280e02f40bcb393855dec06a3d685a0805b78967dc21c3ec81d63149a9deb9b1a1ba49d1d03a2faa7eec9f067be68065486330ae750098f23e4a5e89b592d7031d25bb6207133d284b6e6247decb618519390a304412113678a2317c6bf1b31f1b764246ba8a2c0fe76a1c890c2944ad34ebc43512b03e6d59b65e997c80fcceee6160a678dc7e916eaa915806fb732432e556c5044c9f8b24c8521756409348429925858e3f1572bf491945aeb45b0e44b81203933da948b54c9f1f4425b5097c20b5b454a3e3361b88444ec2c59b2912e3809b3c92fb652ac599a6b60124f2db42208d0606c64e4a9df37499d58fde3c463c4415c52a4bd5024cc994e34394e41f2243802bce5463c407a5e3798f940c7ae58d1893543a20bca6fdd78c082bf61877ea383d651b6a87af4e447c54b6787ad132488534a6bf1e1feb9299eacad7259dbdf0c499de451fdf198c4ea840a3811bed596f41a1a8b38d6b2879124eea26c0ad9f858f1e64e4fb2aad1882f8154e1e20cc382bf0592c6147b82c750914b496ea950f16ef394ed4ddc62d37c86187d281bea40b2258b1b83f725f19750fb1024ca9d1133816c92910251329ad85bdbb67fe01798688bdf0f1f9799cfdd60131944efb80e368965dfb9b348d9ea0da1551c62d5f2caa518729bb5f46b8efda829478e548e2f7049428d5e064508809605ec0c056fd411789278b59324e08104411598602aef2f1a4e44107fc01f01f67bc26d915e1b8f0da6fb217140c8f1690073a6458eef99dbabcee89147585d422c69912803a78c21c3a8f2f1ed0b13ff2295ffaf15f33f08b1623f8f12567b30387dc6b301ca7504cc407b2e89cef38691a9df160118e966bf4f31256643b5e2c3044d0b49ada4e3a5cbde61f8bfcc34a9c806cf11d1094264da88a4da6693baf6e019a813468f83b92aed56c00a846d84d3ebdc36d23e82de5985177479f946a0f55860e6a973c91fb2d0fb1500fdd3d31eda45970c508995dbe568c6a13c938b2d3613346a78f1ec8bf8d14b4b59342ded99472b57a588ec13af0d0913316cbd0ec391e3620ff6d1bbcf46b9da657b01c02817e6c3e3e9600562a852e4b4951d86371e4efdfeea5c171b9af2d395cbe4a7a3540a6739f08173e19ea64642850733356c250d087125a7fdb7270f8e40d15889ca1445c8ea72be173c9aa3cf8163a594c95b17368de4aa4e2181ec5feba79e20f6d85aaa42c14ae4058decbbb3056926815498f5f53ef1a72448afb7c0bde0c40b7084d8aefa22b146394d6c058fdda718dcb8355c54a5ba043ca70076c2b0ab4db15854b3715c4a3044af8654b316d46d8183fc75a50d4f250d0e76aaf99764a939faf56326840c62c180d4e9c24e9eb24188a978a1ea951ceebe49829a97a9c80f9e93d2f2dde0fbf659c97304548456e2b90bbbc259833e6034ff47a164ab502157cc118438f6a29443611244c5811c5f78c140e784d41f90abe6e9d84644967a32bc0409b4f4e02a98930ef65037945741838cf46b2c014a5fc7d423ea7d2268aa62ae2e756428c581877600a3db45fb9bb80a19823c1a000daa456435d90ee56dec1f681db209441593cc50f63bfa45e96f53a81807c4f319151989449708f35f00cb50add2d582c07df8b83fe08950e4ebcd28bfd7b64339dea6887c888f8fce9016d95201da405448e30e25b4c9c74e360510227be4b0b819d614b2da249432cb22e143c83222c4bbc08dc3669820afa60e8a6f7707b254e1f7e931913a2e2054dd2b761272d8c9ae52d3a1d1e500633e2ec8cd1135bd03ca77e65395c04b470d73edbb8ec49cc25bcb873123017919b25480327b9824811b32a37917aa09411937a60b9951bf60af2883b54a8eb623e0af8da87ff5029a0dd67c142c5c01f86faeaddc88b72c0af774e947358c53c1675df40d8aea9ef7563835590edcfc602c090cdfbe2b10004642bfea3da6e0d67716a78be49b0fda4e03d6a73b6166cf2dba45136283fc2e794c221029f745abf5724cdcc1c072add6460a9f8a8044caf1422244e918b0ea75bdf6771194030eef3ba5feaed7ec1dfbafd9fc2b69a2cef8c9fa732a73e11638b3a4b35aac044fd9cdb10d609ab29d9213401c432790e9b15fa3ed801c32426d7ead00558f0dd906db151951c34f3bbb157efb11501d214da9712cf7e2826ffe01f0375538b16f07f693a3f3719609a97bb6bdafb600b1ba518b00cf8751abb518fde78906f47245e09e0ae52318f5a83e724eb1073867209fb456bf67e436a948efbd4e01c58cc43cf86ca148671bd3da5d54933d44b6fa9478c3174d210b8a69d26d9b970eb1bda6787aab038c7622c71382e4243c42245b6718b84c09cfbc8bca6da5dfcb909dacb14080870e611b3d51c4ec9513351bf71b03b907efdb35867b78f21bcbd671f830acbd1cf95470c2822b05b78dce4dc530ab692973738e384e3b8e184f3b87a6eabf3baeaabf7baea3f7a7fafbdf67cbf3d067d974d265997c956937999648cd59749464077dc21d011d551ff3fec96186d5b0dd133f326579c5ffc01b34a15bd34e86cd1a5a75b83ce161d5a3a354892e38db327809b4037006f02b8097403f0f43849ec09e026d00dc09b006e021dde93961b5aa834a06a41a105015163ac1a74b6e8d09208be60490037810eef896385160444776ad455a784f062e84b9f2dc1ed4db4aebfe3a840ebbe3452008c0dc1fd3ea18667b8c158c9b59d68a8659b4e3c54be9c599f033bd2ef06e5378e44155683dbdefc9cf2fad9d10d62af6afb83ea5dd7d71f772b06eec61cce7cd1527b61d173c078d013d28f27c0dfcb8821ba4d8079edbffef66119d17bd957efe7bc6f9992a1506942c142eaa0a7e5e973b305720f5bf8e07c5f27a90bb6ce0de8035db10042f4c671cd7c4dd7e6dbfd91790747bd24d6917c5b5d52d03eda3506622b8a574e0ebae63d3b790c12f68d02b79ff487635f383ad68e6305dda8639ee1ca58be4ad07f3bbafed16401794b20924d5cc6097ba7496519fdba50d584df6211b6dd62eebfa88e931fa869b629e7d04f1c9ab6b2af284585094bf6eb7eee65d5dbcbf965bb0c622a50c6b693166a613422b08351a79844019cd372facc47237c451da004bb766f86019551800dbcf986eec20b1858ba44ba7828ff3156025cb77a5f3aca42707e5dd1085f8dad9c5cf8526e0897cf57e2c085d7d074e9d8110b9717def99def106fd0e87befb62b6c8bb1ad75e310098592db0e67c91791c6da0b60448c1d5946f88564d072bad507b458907b3b1e79ca092720cc79178447d0c45ee985fc2442a72d40de649731a5541e14304cb3ae11656e10c95bfaef77df7505d35d6324b7c7b030e737f8d593882da94cb9f8615c5d3b23e81be5c9da5d91d461a0b3017db158779f3a7035596fb2182024b6e95a8bd0793f2e887459e324e4a5eb424c7ff8d1025990d9a47e9f1f744fd9be1ef69fe4339a0c672ce58490958a24f65d81e6b6f8b642de18af57aa0a4aebb067ac36e19800e35f29515162aa08b4590fcf7a6715f314d2d082577671c72b10d74684934dfa9738c948f90a2fe834c82b2bfe564f90d56449849730aea810af3ce9ac88ff8f7281d7f440d754441cab1e4dfd400b0fa28c2985fedbf87e305e07dd7b2382cec708817450529f63cb817ab5eb1dc8cfacb31583ca9fcedf5a79abc5e21f749b578c57445e889122ce06bd6ca45c56dfd21135c54faa587b976c27091b3586fc00a28d6676c36b63cc55782556749c8a053831aa532272d0d33707f146468c72ea51302a17dd6ac2e9d1dc73063a95e47a1b83069917dd0e71d7375573a601512b0c0623d3bd491caf91308a31b548118cee262770c523c140132e96b9a51d81ac138680b5a1b7931053b7451dbc1fd14f1f949bb28d9f5948fd4dda13568d850321daf4a7f6370b068ed13d0b4a62a2b4a2c2a6d7725b83bf3d73934d954145af84054b9edc3a1620191e993ede8e1a7d82d56671690d19b5852b22dab4dc0bdc437ca614914d38803c2b24ff453605c1f0d73c13bdb70b8fe1c6d96cef5dbbef897cf3a8fc7ad253c3fcd68942ae26a9992ea43dc039c74c8ce9620b0eb68caf78163a793af94dfb36a87028aa098147106082091d791f2ecaefdcac2a1807ffb66d9357722332497551f5896dca3339f6b6e452c4cb37167f84145ccad9b8bc0e18a06b1669fff82d36c45178c3c0f93509c71e80a6695d616529c2ced73aa0366549ae91ac08ef77ffeb8a2cd9499da771b241ad6e222e199fd75d46381d6d027c9542747202e1c704b4a9e2d06e7efe06599e8acba04515fe48209fb7188e4a143e79a2642794dc654a4055b9559028285b1b390493fdbea089d08730cfeceb233a571650d4e1df5b7fbc8f2d60133f5d82f7d6f9657d9397976c1acc56327e8b9d0a05ca637522cf0c7429aa3e9a054d942c24661ec4e39ce4f44c76c40e4c1f742df42d40e4b6c1ea7c8493a1c90d3a2181265e6216c8fad38808b6dc686b696e5661a38b20522fc3db10436e84873a978280ee02a455881978a5dc14e713453c0c24e0c379050336f0a71c8333a091a3379038c83331b008c2d7986313838e558681fab7ce596b85250038484de4860128b1fd1e99f88e9f98df3add125dfe7341069dda263624d9812fa752aa3c042760edf1db4e0fcdc24a0ee402cb2935d05cec8f67db8b4e070efd637dd71a4d9f47823d7e1b74e3df6dbe1905e84b2ef99c2ba748fcf9157bc65d56776b1878c7dfd0c6ccbbe98a6ecc37a2bcaa74b33c27a1e52c1673ec7872294193782be5cc7f69f56ee3b4074cb1d1ac8a2f741c3ef0c27e2b3ef3d08b9a836392056a63bd9c76c5bd2034576a61727696271c126a998696ce9808ff023fe75726008842d9317660e4214138fee532048f2681507ae13e9fd758f99e78783efd8b8800d7a9d0679f794dea7acbcc4432492d63d6317108a0cf7984995d8e132f7a30bc36a1242a19bc48613ba1992cb2b9260ebab2129e7f0d51cf066445625a636a9a8c528a428335f7f9b572ecad3c656918c59367d8fd383b859c77210ec944b92fb9b79bb8e7139320ae67f2f997fa70813830bc3b42d0b5fce703546e002ca5eccc75e9032bea7bc87b1cf12ee1ac04b90a2c0642a2420ec8a4b78cd253c10050c4649165361b8f7310b7114a000ad2cdf702038fccc5edaf111c468c9d75760871bc9fb982e0a088d93239152f1626d4be89fa5e712856dadb7b9d1cecc499fced291a6f1e6d361b58a3803ecc720463e0182dc22eb54dd8c872cd9a21d1dc97d8f8dc0b6e1844ac23957d7279b784e274035448bca713feea6dc66a934d4a9a64d608e3493309e422d1028a2edeefe8e202233c9edea8b27a1d0efada19c946b3ab1b8cd6849d3111f0e1d7511db19acd1cfee31ce20019e372f69e8c0316b5c73030bbcea98ca0a4c9c4d49bc6301010d3834fe069c3358bf519c63000d877ef7c42a00f8ce7031af78e975a3050c24a077a9a28730b5fd0d3ef9e8c9374edec4ef2f437117a8f7852c2d9dfdf1ba47cc56fa6e8400f204d56837ad87ce4a7234a1de41af580eddf17f5b2b0130b420b7c92cdc9cb0b3d86d6362209d95bee2df79652269902e708250928095e358ebb1ebcf42aaf296fe59c92fd18051fbb8d7f436e3e0581b09afb51ccb90e08f495d7ee878dafee97721be72ec826f386b01f2fddfcd494077f048cb5f853cf9f7eca7e4a954a39ed8252d4e67ed4aeee67b10ccb289675254cd7b8db8373fb369e795fe62a958d63abfb0df9954de75957424dc79ff2be94b3af3ca1d4b540a0673fd17a436e74b2cb83f38e310cc3bcafbdfa8d27d4de79ec8070de79edb81c261673a1761bffda6b3c3aa71cf31ab75979fe2a0c5379ec825429cf9fe3aa070d8c56254c4f71b7521ced9e94b34795d894a72eedbcf61b20ed9da73caaf3a3f39577bef2baf26aee57f43529ef0bb2f195f7d95c1ecc3954ce9c23e52bff8929af7a8d677d05b995ce0f95739e722e7533ee7adb0d744c0539168479824313252c63407d019eb19cc9f23840e90e84ec3a59e248d3af80f4bc848bca7f50e9a1eb78c692668c875d108e18cb2f7970b2b01447098b790d157e62dd86b27ac3a29063caf250ea9bb6b9b65df8a45b5070b2b0fcf331bbc392f48283ebf97543197e3dbf6e40fa1b9cdca0e4f965c399ef189e5f3588f9ca5d104e18b63d09e78c6d2aa5b49aa659b7b15e6335d949bbf26963646ba357736dbce8d5d8d87835de47dfaefca76bd5624de4ecfdd829bfe60dd9796ceb3cbae645af9a16234bd3be21b5c6b973f6a0e3f0783a4f88a7812120f08854300277ea190b5f4b17d5f4960494524a5944c509a321841ba59af3e6cda9694e3dec6a5e9661d1b538a184b16127551c3170c0b0bcb5511b497b73d1b451b7d871c058ee3bbba1c32b95651392092b6b3ffdecb81940b04e2befbcb6d24bcde4b512c4ce44da56f8db49aabb298ff763556e95d17865729541df360f3ebdadc439a67b1769ec7cf0775787bad0e69a4b875d50e749e7bc158dad28d672fbb452168dcec0aa26a7c12ced44b3ada445b11672a7a857aa919941304ab77e1aaa7bf8a1ba353bff892b8f53791fd402ff6b25a8aad5116acb5a086997dd31ecd74a23746bca9a1a67e72e88465af3d35817a439a669f7488903d55cee1bd4b973237c3f68f4b335b36435ba65a40ae91ece2eabba900a39ceaecf0042a8d4add992fc135bd5fb18ea339f3e8210233eb0497f21fc7cd824fab452132b73b6527cd23d7d61137e1c24ac93cbfc9d0767d83cee619332306fa5e973cee05006be317dbb1f9d3dba09f6747345c519a3a6062529d3d8e852465792a9fc863fba93d9ccb32ecb325597659e659e659e652acfb22ccbb2cc3bcfc3f9c2b6ab344a69f58d53a9acf35be7387badabbcee7ef4556ebd54ca7fa2caebece6b6db385ae9a6d16c87aaf1677de5ececec296fa75b9aaf3cef96e634fad4dc56bca1b9c6ad603f1d994b771dddf3b142d07abed608ddf3dd90d03d9ffbe89e956bdedaf19bee69d79ca5b94ae29859d578486adc66b5aab1a9a9a9f1d5ca6b56ab9a9a26a4c9c5886552ce6c520e9b3eee4fb73c150a6c7b7675f0742b6231a201148610655eab5b31ebb193d96e61de90ea3167b138ffac14918fc52c8b23f808a2516dbb3a5aabd5ad961012c8775a359bd9f4c13f6f9c24489f9dff4479647bb22c1ba17ba6673dd3339decca6e452a95ac4b9b010e49524a99c4ca18638c2d77640ea474cc43529d63aece5f7dce5a9d3d783fca0d2114549a4d73c299713865ac13274e9c4c27599c387102b32c5951e2e11dfd1dbc7089a5a59a74a844b32e08629ccb46ff6096cd61162ddd339da017319b27bd8e6b8ac5ac29bd1f950db3b0aa95d262f749b7a46a054bbbd51a76e5c74e3fef0795fc3784a1a437c12cdd928e838475e8a45bcd9d10ce9193c4b6975171a90169ce285b4a393bce39e79c53cee973ce39e74c63a54f395bfc2461a82c97b0b25b9086d03e1c8d97d51c7aa669da3de29c6c5b17d4b40bd232582bec82361f12b439dde2165df334e0a1d02d29a40ceeb6e85a1714bd6a518ba9ce07ff7675a20b41cfa89fa07916e882a8ec96d411a47b388846fd27526aad0e24f6b3990f61bd16bb20cd6b9665da3d52e240dce516840e420d4aa4063b78e10cec6769d5004e12f6d301fd7f6e08dd929e79527a1936fafdf86e50542df6b3cf55a7dd93eac14a1c2fece6d12375cded4dc35a99a7c468ad1ba5d5d3ee47378d73cc398cca4c62534a21c4783d2ce7885e7360db610f7e6954a127219cde102c92104e51b97da475524dae6f4c678f1d25c34a97b20b2bd3a824842ca514434a29a58ff18273c81b63531655c71823b5b66b25021520a5f44f470e6c74c938ba25a57361a34b17a8ca3aab58e52b67cd6b7938a2cfeaf25caa699aa669d6e35bcd3f762128744f3be638d03c53ff76fee3a7a7ad254fc93c65334fa9ff684e35aad133af51e7c1d1aad13d3bdd3371b4b09cb7751c2facbd4cebb66d9d73295f7948565e1374bf213c352b4fa5562bd73cd55d79d6aa56d6e37cc571ddf56e6ddcfd767ebb4de38a8dedd1e915824db215549658acce1612c46c1132668b095a4c6c4e0c07585e80d23205992f110716382962813cd9fdd4f36b05aeaff6b8b2797094093bf1705c075532a854eb2c61081763f783bdaf107b7f986b9387e210ee2ae7d0657739e934682c618770ce1f778708b1f343cea173f0b72aaf10bb94fed31cc7dd6fc8d7be69f71bc2fde6d43feb7ef4436a3de6eec771ded7ce95c0ce7975ebd23dc694ad2e39c7daa1d78e79df10a2e721dc37ed1bf40ab197d0ce57a83f9a7278394f7a9cf4ceab1ee69cf7710e2f51bf746d7a959e5075feca5d8fea9b4befb31cf71cf752e5dc3d5d773fef3ceaf27fe2e609bde67df40e21faf6a2a1f8f20e89ddd5d791f7473b3b77410ca532556e28dee16be56c62f4d1612b61341fe1193265ce403d6d717ad292c5ca52968f541a263d79e63b65cf77c3754bde89614d5cff714d1e2ef96e824991b9cccebc7250f298cffb8222e6f9b953352819ec1101379eb70a639ccc9c795fec46d7e6755efaec0f345a628e1c79b69cf2a2a1096bc9571c7b96733cfd57e3a582a6ff583558bc03c26fc1c5020cca478c1909fb6877c83583990042d774f80ed5b8db01f6620c17e642018bfd74f8d031671933dd8a337adddc022774ab5e12da157db6ab23de8851d3e1fae8639689503026a91830b34cc5c0428f5f4829274b4ad95db424da112a6fb218638c319ae11a5e7b852a2a6c3b642e6ed01e9bbd60592bd53c0f07f03183518acaaa302a1bd806e2f965a5866f1c9e5f44a0f9d6f38b88283f88909479fe42200396af2a950d6c4ce2f9b56483874ccf2f2474781ccfaf239a805d8fed89a71f12f2ec3db63237fc500952ff115df18585c37f444838d42bfe2332c115f3bf14a8a85242018a68fa2f05a5a667ea723d739a677ef64e411d82df4c4defbdf7ded7e6a6135b7e7679e87572f77bbdd03cfc8a7480cc2e42f12b32030e719a34694af08014bd5764069a87ed5d1e7a44ed403ca1f6d2fcd5f9013d7a0fe8f112d5673af344fd45e0472ff23e7ade37517df6a209a30bf0c2afb09d3d2221614603cb2f219c3ced81f9e6dff4cc39af294f27e5fc99f775df21d517e1549e4ecae15baf926baffdd5e5c7af3f98c9e5b29e79296f2f722a4f3218aff222e7e0550d7966124b719e794cc6ab78c296a9cee3775e9ef3daada79a2c9439f548421112d4d9a1ff68e6011d7af62373aaf3233ee7f1b9fb155971b9daab5e5554d8ea29affa91af5e23175fe50dd8cca7907d917e0e10815f5d76412a275bbdca8e077b991142d9105200a4aa33b956f894c7f375f3ba764e644884da39d75f7ccd39cd89b0e79a08d7b5739a0fc134dc91c038347686d86a5edb2d79efc7cbea560a6662ba8ee3baaeebba8e773a326addb65a37d7bcd65ac3d0344a354dd334cd29efd09c77b42b646117dcdd9d753796650e3d159365b2d235de1144798798ca2a2b56d58377b018b11839462c73cce33847e651a584e5d714343f5d7e34c33c6b17d41efc43304d6536c1438f73a838cea1f2f6544ad89477ce7975951276739512167395ca55def10e7e95b70a4c55fdc822cf5537f5e8588c14d38ac0ff6011f894c6e8f1fad32b441f40a1471a63a4fe13878c386dad69d376a8f274a2439de8ede32773e875a5448838100879ea947b64de475d285e22435cc6e57aa29adf3c4622ee3707c16b448644f8e61cd189b06f22d48930201878cd3f1812e121e7188269becb8c2376c7633aa51ef40cca9b69a9d3ebf476a09a7985cccccede90918743f1a1b30fd53892e68bd0fed863ee826611fb43a4ebc87f43199a23199a2369be08fd34be9fe5beee3b44a44876839aa87f736cbb4310cdcbabf3a3bb20ff8959f48a3436fd7e43461e6646babb878cb0c3148a9ebd339ef2a3c73b644483189a6e69a08caaba623bc5af294a3403f60af74b5f04eb529e7caecc0f655fa4a6e352453015ef20025d3f24c2436f97753d84ae17a342af2a7e9ed78436e71c3ccf8efda04e9dfa4f6f75e3a139845f83a0e6c9ad08849aacb1618c297887e2ebf0880f1d5ee71cecf0a9a75d21ead56537441ff37ae7ca61a78ac246bfda850fb7d8907140ff1c5084c433e380aef94f1c32f2b15d2b21fe50fc08858dde588ec7bc6feac03bc4e4727d011efb014e1fc07f338a950a976c807710e1f923f622b6814367bed83562210710e64a6c80a0cb9b974e838616fb0d799e30418c30c7623fb824cc4b37c26ee30d309e0c81c310494f2e1710e610087a2ef9430c2d58410723808c58c801045d890d10bb110b0d94b992060041c73c250d003222c504e8468218916242261d73788d70182d30711445031fc04c01c4405c94022d46dc70c315a7295f003110fbc76382bb5c40102ee99e0134913954e61d1f8f6f3fe5fd00435d2c5ede8965d2b3fb01ec7e980f894194f9793fc050c41b3d090593c7ee11ad25f80ffa377d48d193c73ec000a3a5fba9f0f1030cc5085e62f7030cf5f336211d71802e49c83b05e96b3cbfa6bc706484bd04aa3469d23c01d25c385f824032c6e50282472e1b30f030031422018002441617110818ea8f5c07e89284ab08038c96547031144d80d8bf11fc74667e2525f144f08f56602820edba180a88af11f6127ce0861ca83882c665e47201b17f467ede8f5d7ad1bb93c001ba5c49238115982f2e2803499a3440ec3f1dfb881ae57408333aa79d13eb24fd4a92e1591efcaea2b2c7c8e2f156c43cba8639c5a247568c3e1b86c65c473afc7e1dc924c324e7882d79c704a15b3309c9f3c48faaae508f3e9b4f6f459fe93a7887730eead3ab67fb06f5cda37d83e6d0e8c3ea1b0cf51f083f3da776fc4a723db6e23c3a104d5fa35b5427f3f8fd3ad9e557520bcfafa424af49cec14b51881aa5b7104ed4e5900a462b1c71fdd027821c9091e6314fa1e8b19bc274efe90da1462b1cf92198e653e123107a3f15ee07e1639ece8fe8d2a3cb2f7e2b5133ef9c79078fa2ff38a72e449d9f5f40a0f9e9b577f06bd534df3c86fec1e7fb6995e3e07be5fca7b97ad4e392b09c57dfb82ba46940da35ef9ca717230d95554a56f2e8e099cedaf20d3443f869e73c52992133dc40656cc5754b768b6f7c8910fff196979e6119cd74647e42f7f00b88a4cfdc02193b6531d0c135baa7bd8c093ac17ae2b3ac67278b4154561961f93585cc7ff47b313d7dc721b2b5439fbe81a4079a6311fe23b28d3650582eca43113885435bc6af46976226027d2ce2db59bdc37544bc191d84700aa30a0a64d802883d585d9514db7ac1936fc71102a704efeb054b1e46576555119c002aaba6d8762e85c34bca0c4539f0a0823160725842071a0045d92548c656b25b44f13767d54cd3b42cfa4d855d8f38c46f9e11c5d7fcabc7bf79d673c181b86f7cf26b3cbc1fe610621e3fd1e43ac6561dcf15d72df71f82f1d9a1657d74456ff18eb8f31387e8aa2816aaa44c294ba24c55140bbd53a8dcb53257146970854e8509490b0c24179dbebd863f7dfbceb7d758e5db8a17e2e5d9683689f2046329276c00a4d877f095d19fa5e40381faf5039567d8e5871dfe6b7af9e03ad221e61142797f408f0d9378f9f0e4e7f3ab07a6e71a24282f0d4155dd60bba723e4ce01452f659012c7113280e424b60bf11d2ac1b37fedd0881e909e5f3d28f9023cbf90bc7c94185667b79cf68c3ad8e541bbe53b9286aabac146f945a7b104e41e910439b17629c4d84fab5c60650f4acfceaf7a32548297ae81ca1da38c32461939f6ea0b89ca7f962784ee892e40dae1a3df4417fc078250bb942b6e1f0682ce41f93adaa1fb091d8c9e5f2a282380e7570e4ebeaa301f52e686e594484a6a873084b0bb7bc6c842ba0599c5f82001ba947402a0d704613fc8d4b365613fe8a20121d337944f96e9a547043e3bbf909a3e7afc3adae1b983de84cd50312ba0af1c8ad2af3ce5d4bb23129439e7b5a69c6574fa1aefaa70284e9ef30e4a96b7f10e94528cdeac7e4e2ef35853622f987265816ed1cc310c9b1ac5b0396915d9831f9352c6d5099bac73ba84104e6821c424cd3cca59cad66647e29c73d25526a5b794734a492d853286899177a6b3cc6e3ad822314fc2392794b03d1aa5c31861c490e42a478c92fe796a15a3c7c85212f54b4e72bce162943246c9bca23ce0476e1ab0582c966461538c97335ec45481268a7d7e7d79f255909158cc32cf6846e991c51e80f1cba29f2e8b38d86197a8e5c32f4b9e5f5fb6b09e5f5fac3cec7ebcbd31826174627da5cc6cd0a921912452f4e924a9147d4e487292484e12c94922d1e8241beeeed5fa60bf4e724f8a8d4eb261c3868d4eeab1213bc9494a29351b3eaddbf0b2fc6451698be03346ba355d05c73cba74e203f9860d2b363ac94612c67de01d04fb30dff0c067f71311573cf0af9968a876b2e15f7bf9c0860d1b1ed8b061c33ba95b54acd8cd31b73157b65b4b7e7ee03fdd1e559893c572efde520e530e31aee106756af80914e01dd2a757807b3677ffa8e79ffd1aff585fe3cc3e19df805ee39b17b9051df3a8e7e54097fd10daf068bc284786e5a7ae613cbc520e763da8432dca968484d449ddd44e6da5b5f496c9f43348158a82214924a42064ba94ea03ff20d5b0ad2c31759207b45b9b639ed0074e04be0d0f4202155e9eaa9e74cb4e7642c5ee746b76e0d1917c3c9f2e97b2744f073e5d3651e99e8ec93fa92535adfcc454124922c9283209476e39fe75127529e50dd2ad4942b7e607369628818a62a28fbb8dcbeea13e5d2a893e0d65bbd33d4fbaba1d9c2024c827d249f4692850a493545369a51d9ccde56ff723c163b18c7bd14cc6d44b49f1c6f4e042a1e17df0693876239a1f2c741de7ba35c3bf4eeaa4ded24edda3e3d3dbcbcd8dab6ebc866764625d27456aa35392ce55a15bd359de817f7c8608984a79273595564a714fc3e3efc0637939de913b8e37c3f388401befe332afc623929db0baf6b293fb883e7eb3586badb5563e0de00a9a570dc8d822ba8e2d11f645051a235e546879393dbd9cb4581fa0951a78f91a6c7996e2b98bd3337b8fa9bc03674c927129296298ed827fb0143a41272779b9c22708063a39498e4f3c540b03abbd9cacc40d6e2d6d3ef10a130566b147d8891834b5a08ba4294530018a4d1f010b443b064d309b402d46d826223de2e0f942f0d93c02f1af4eeb03b6fbd5881d8bd559b644cad12395ca65b6f4f47ef0e9f4187bf86f2ee57675369f97db2ea5de796cf222269a712d71b24392952c5b9ec8c833fd465238293b2098cbfbddaf290f7e7331f39c6b1d90c8d4ad9b1bb378fc5a67a5b4ec8288f4e0dfbc47bfd6057597f9005f05d24048f0d56396eee1803410ec46a64a3dc805eadb61f700d5c398254ac139e21d8231cb64c870ce94948e79714bb7e23725d92f367df4b8149962130a04161bac74812e2c474e207c4146b7cab93bb7e6ce6701ac860be13c560d0d7cbc61160a1f2ddf68cccc15c62a51cb7faca75560f8e2a2428321a08e6a6825a474777bc57eaa976e65e41d3c1996653609fbf96799a53b2d6c6238e0b1a4a5e7642cd6deb0a4276515feb29f7dc992734e2460b7b0202b85fd588fd5f09dee91903308338835d18cca0cf34c28cbb2ed4e4a29a54e29a5946a9ac603839eb3c6b44bd8cf1dd27861180f165e9e00cfaf2d494e6c81220333cf4f30613f90dc8404b4f4052acb26fbd99fb0a32441b78dc27eaa6f2800507bf04378b358e88c801a8f9840e5ce3259f9d3254c41e5779e5f5268c1dab31f725ea199dd7965b7b09fb648d825a878b23f546c8b1d3ef952064fb4b0fc9a424c9ce2c98eb1fc9201d4ff4b065ea4d0f2d26b740ff7803e9da384505e615e5072fe80649b45b04aac126b03a397ce03c44beec1bf90f90a1b97be65df90f60ae84d44c53608e196dab61464f9e69a0f869cf705f9aa524995b45e21c7712abb79f12984db267d1b1244f3823c6b1bb76d9c4315c771dcb65aad562b95f377f67eaa2b9de3dcfb823cc7f987d1c738cadd92db8d672445286edbfd8a5e4a74cda3a1c56e0ed3fca779a5d463f763bb47361ebb23250e64734bc00324457a7777df786b585029a5d652e95cf77c5028738a51acd218638c180d6b64a3331dcae8cd2ebd4313524a29bc47d0e72d9a50ae207912b5aa0c6e6110c3aece8ff65ba45f5ed9577210820c81462faa1c4ca2ae82060d2d1ddb930e3b19c2af9430e9f0d07f1a22f1b0ac9d3d383ce7095b051379b398bda8f49849399ddaa49f4f146182213c1eafef743afce73c9386ca3b18f3134b7ef5fcd202e5b93323a58c52ba7df2f2e5eb091f5e4a29ef1755377835bdf0dbf3abc9d5f48aa209143ba8c2b0fc8aa2cc2b0a28af28c4bca088e244fd47987327011180b0cbd2cb4b4b93567da1f222429e2f2a2f688c6168318210420821e438473b61e6e50417af52c2b6cbe797135afc47790763cf2f27a09e35465545692f83027b23f1473c8f0ae6f38ba98c6a8c9403f80f7afb2c9a25789eec519f9e91973e63106580e87531144d7e22e42805188a26400378de890e6d8882838827cff9f4f65280dfda1582ae3511c839a613d11fe2343c38dfb6af3704accb9fc75648e78858f29c6b5eebd49873b473f74373ce7fba47565df3388f1d10ea10f6859c03bae69532069b0b4884955e80978eb9d296c73c0b72c210ae08c4a383b9efb484a0a0d46402196165e2683133538f943b4148f77cac1ff8af21acfc7410787ede940082cfbcd989b09dee9944da89302018e8ce014538f8763cb48e842224b00dfb60d163421ff623bb1f091e7e7b7bec6e6f77e89dc1c0e9316fde1cf98f3abfa258b1dd738339f58f04697ef491a75eb95df47e45471e96a166aaaadb2a752efacdeb9c7a455f6bad3ad435efaa9c79e91d18ac4aafb508729ae60d19198a5f5d555d480748e6d3b35406244b65dae6fcda767950d75ccba2f45268bac639f5e06bdbb65da1e99f748d2b417297bb98ca8bcd023302209091ca59604600e610e827625e74d5909197d11b8a40b42bd4b9f4aef38855c7eed779bd3ad5339f40a47757a75e20d431a78e6d9e09519a01a119d5ee8779e55c47c33c1dedf29830407a29b479bd1ffc0f738e730c3ee79347fd512f730eed0ec134f57e9b635ee163f0e1c39fddd3fe8110c2b3f302fac8b3a778746ccda5a0ca522c738595a748e5c917559365666666662e52f3ccccdc41d4f6aa0af274e6848c793ad3e1678eada40fe0a367de58638d65ec8dd1ebe519f39f3803fed3d123d22fbbe113757f7713f5b7081c5bd8228516e02049115450896208208e7a75e1e5c545172b1350c0c8c9131d62f8d2022c64562c6cc1c511ffb53e72614407b8e0028a1ca2fce0c4f4e2a24a94550b9c2606298ccac8e1484c0c5a8040cb1351395cb14213a8311058255925e12923aa051a2ccc1bcc20c382e4e9c59261418b4522a594b21e918a4125e3c38a4c0c90a89e5f5cb8a0b55006940dc99c733b41b501c99593cc918e4c0c467c05cc1520ac70d2c59530c49881610b2dea8b2bcaf02e98ac10020b0a565044165b0461b7b8e2c39c734e2569c22862081ea278c10b1b6c01656ec1c312bac50cd8162c60c18e31e3f915f5c5864e0a38790b232d5640868c526671014a97364a295f51585e4a69cf74f0fc8a92f2dcf32b2a87ffacbfc2ec48c11463609161cbd10b3c3c39a0946767070752ee145121f34392a72ea6f00225068f1862f088b103c7681103c68c8c52460b86b5cf2f2d5a98f2a5c50a2fe54b2b7d87c6f36b8c98c79e5f63aef8cf79ce580c724d31ec7e1ebd81c51c5e2a31ec35c60b0bd60b283b3b5f48b963cbececd832354d9a9c9ec494796a8a3eee4ddee44ddeb4e3218080c3ddda2ce48f00bc7cead666b4d178b5265b85fdb426df5c659aa05236a478484949554959f9f6d4936e8cd491940b2919521d97ae8a2e4c17d599f9f66e4b1744474477a563a26bfaf62ea983a14b416743c74317e5dbbb25dc18ce0b6e8cee48a7847b714f705cb82a38262e07ae072e0822b82532d8676564c42531e26030e252c03d414305fbac8e8ec01c8d39f2e28c5315f65935d184114dbc9a78a26ea932541a6a0eb587da648bdac0d8c8a849ea12324c6c526c546c60c464e1815d8a5731c237a66fdf76d88e6c2eded150583458197e73c192b19f3f5189c61acd1996b4a6a6a7a6a7a6a7a6a7a6a7a5e8239f9e969e969e969e96a09ed09821f3f4c4627953d316344df6c97e5ad3e6722d91e99ecfcb343d4189e91eee1e36827d526452645e29324fa4c8704991f16245d2c03e2a264c640e4c7a601204132760b08f6aca1432a6c82453240c53e40c66a4601f15172e547001c3650c97324d52d847754675a68aea8c11aa332fd5192d51a20bec636ba821ca5043a4a18698430d4ac2b08f3de288a823c038828c23a0aeb08f0563c13061c14861c15061c13c2db50decb33232e2c1488a5115a36fef27aba3a33e72d42e1cb50c4767b8b0cfaa8926aa68224c13514d98d91204fbaca2565144aca2aeaca2985845f10e18d827b5945a8229482d411b524b3ca496a274807db426adc98b31e0110d8520f6d9e813964b152378ec239ff846f77ff289a5008b80ef1b4f4f4f4f4f4f9bd1e6da5c9b6b43a2643bb2b92c179bebe9096a49479fcd935848168a536a2d8be5beb99eda1b877f6c512b76deb8b936d7661425a66a9a1800693ef919e6920c4ad2fbc52528da14256da24dd187c61bac489b689384dd126deac27ef0a9e99b6e81ed2f3320a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a26c948d2243268c97305ac2587952ab94d4834bba2587b2c63aabd3e3657800cca5379540296f065bc9cbeb0a32cf2f305e5e609ab0d06be6b0a33ad8854d5109695fb0ad6e592465b2d40c9c37b4de4ec43b54deec93e31df520d107e736dfa08eddcf3ecd79eaf27e395258694afa3a6717c471f1461074d81dc2f34243d2bf8893e321c971234540398ee38d20c757355ee33939399ea40828e726b1f19a2b3dae3c7ee9b97794e3aa9cee46efe8c66d6eae0b389ea4a60607c76b38094e8d27c1f11b4f6293e3496e6c1c04d127e7da505a632d8b3ffac7f335e352469d771e8d2b96f3e99c778b398f2e392e0bab451f08a402b6e4270e652f69b7dabf9d4f0791d9337a4717723c094e0e4e8de7b80b379ec4e6c6c6c6735c98e1496e66dcdc780ecb93cc60e5f80c1ccfb92eb08092e078ce8c1716674078c6c24c8e87e3cdf06e3c59e34dcce19572ce39e574f9024366ce2597eba58c506caf9c54eeaad31e1949e6468a8032a7de08b26fdede7cf39fceb22cbb4934dfd87b462dbb2e644eb3cc69463d49129a710c55fa8013360d1a2ffbf0f6b55858e95a9c40592bac0ff68bfd627db03e582bec9717165b2c17d05b6274e352b60747a8da62392bd058d1c543b71c851076c47922a59413cb9942b92ccb32aae13051b96ddbb6ca6d56a4b8aeebba940a1bb3e2acb5765553f3fc7aeae286b3b1b1b1b999913a8283838393c3924c68701d74d0410734745628b0c1d5e882600daf51a3eb016d7443304d64ef69c97fdc4d0796f502b3c3b32227a56e1a97b2c9810dc4844163a74ca1d261ce09676d628a13a42b49c250a1420c149ba483941e9db220a303312a7821cd1493c51397051919d224e0f96545118ff3fcb262078c69623df8b17b5380294f5c3b548912e306ac8516576c68c10a9498a10646f2a70e8ffe383d1efd71c28f9e0e84b74db0d9a53df86fe0b59f0e107e7c9c0042f7448f5c9ce8220397142c9ef0299aa1e94b9613c0408822a6006a77f629aae18631cad8c2c20a3ddc00d4de629f08bc104594255f6a50040e80daa39744f7cf0829bb82359c77d00564ce0e00de814daf617324e0790021fcc41b2d03c03e36a6aca6b98dfbf0b1aaf1e363041fabae71b95bed919ff3a14263f955cead5cebb694cb2ec836b7e326f50cab4dc763753ff92baff10efcd3f191e51f023ede789c20313ac305d4f00ffbd843c33fee3df0cfbee41d371eef3724848fced32d1d2e7b7550b151c31b013c40bb0e0d0fbaa051df6096dec1fd3e60dd8fd53917e7ceb870899dc18d47875b6ebc1a24ac0843e8d004040e82b8020306b8be904114292c50ea02b472ce7fe2db78307c7b8d47d42f8356d2a1261d4eed990ae76813a89456a5694a98594245185b3475f1c29f4c10c3122d30bc50a52f4ce2920414a45b3cb0098f15176c40854b18170bb46034415899c2f5430c4d4aec850aa2c080091214173670962852b8d0fc10852b8909dd6acdabc72c59bb4434ff215ff3e072bc512153b77aa95b2704814b678c2c59824f9df4c3c20dc4a0a14c0d68ae80518482133871240b5713942413988041e6061dac68010e1ac0a4cb174834d4e08b2b959b7396e0d207f90ccc029bba7c432adde21dd97b10a9c79c830f101df322e7588ade35bacc30c183e6ae6b8eb01f37c1a56f874fdf3d917d8a9a70c1e4053d3009c1051640ed300bfb70513110a30b1ac6d8e10ba076d8c43e45365ca1c59525474694f104503b74629f0ddcd0022e4b34f9410a2480ba46d7f8a2620e67779cf366cd1d04386389e3a5774b3601f142f80c7c884587b11f3f09895e44bd990178b6f13c837ba8b6395c80a4dc92ae791cb7a47ce9900f30e3fbc0cac892caef839f5e19f356f409c2b524a5f79bf171de1bce61359ab56e5e5e13301e2a43d937a41175c9d18f30044ccf3c162890cdcfd54fef3801d3ed0a56766b666ca334a005d80d46e5ae448041e259605edc81ca8d695e390e7edd34cad9176a9a248d38b0e69473e6683863dc22c6cca3531a36c326c6942d6522ca444f6b14bab579536f48b3ba4d2935ac0a08214c017e8466ba3b42304c96b22ced29c7400823ec55840dbbc418e3740ce36e4d9e2d1f4a26e2c92dab90114a06a2d0a8148d9675392d19a2110100000000e314002020140c070402a150389ae7badc7d14800b979a42664a1649b3288771140619630c52800002c6800c88080d4914315ef03187de03a03f2f0d9748d6e01cd21bc8d4afe3a64f285197da1c8dd41cdefdba9f2a90dcfed402ae82298f85ee4b3648d1c27664b8f15e9a58f2ff066edc9e4a774424a4e09ea0192b37367654f081f0d4146c66b7bae67c4463dde96b90f4620b9ec4b0410bde2b3fbd6344eeab2010ab2db942730517712fe346573fc56e87f2612b9eaaca194303c278a59935c1b8df14d310e95cbae022f5b6976e8dfa9e31f28d0c56d53013b3be29636f408c18f2cadc74f39065f1ff7254f418d70bd71e2bc91e848c0a77fc5e6092bdbdf3316f57c83bf094d7bdec33854497e1f30d92d9e1a48b111e992a6902097018a598bcda5468e5e4497124618cfdbe3278c26e4ddd4e190d015ff0837a5cacbb93c0d0f9d17ae7b40a379a094417e05fd1d33ca9d6cf7b2b8aa83f23d12c76f3cc2beb0e7aabfa2035f1c848e5a9ad9d88fc572dd29974c8c3ce980f90a73b97a8886a54313a396e950894d12f751ad31247417adf14494f15ef26bac0a27cced7e68460bbaf8404b791712872a4e5d945e58d77971c92b64de0be7b15395f5454460c6a8d875386188329b360482eb71a5dcb5744e17c32d84bc8df8c3251fc5d7d3066a4fdcd7500d024fdfc02ef3cc568acff810fa568829f71106a7c7960bf9bd8705a1a3ae0634e130b9110f98240be85ffbaf784d30478c732a0e0e0c78ddba4d5dbcd6007a6ccefb0de5688e0114f51fd0383fbcebc96a6788ab9a9936b86f3724b67cf2bfd14b6edc61c06cbfa41b018af34b7de414e3fd9538e729be080de4b50b4174330bc5915e811c327e4f06faa6ca635749c658d94ed58f1715f2b5ae693935688697b25549bebe16f3f0faae633502e9d69bbff000ca0a0ba0592381a9a60677876c1a0d2a51dbff118532cbff7a898cb237c84dd0571960c7989e44151b16c05e02501baf00bbf25f001b4b176a825cedfb2a329108b444160372d6e62683dc1e4badd76007bf6db6e13741b161182e9077498e040fca7f8241a89eacd283060add615457cda93ac7b3f586e75e8207875dede6357c2473f3efc4a10671f1c93f2e7cdc6e849644dfc36f9a38a9ceacd9efc7f5b5d2a2f7b39844db9bfb05bdc548c37120a9a028cd82f647609de3a51be5eb9b58295bf9ed298e174d32154e8efd4dc3ab2b32a375338bab2c939bdfb1519f8e176f68c63e37c3548b516d4443758921531abe1ddfac7d6d0aa498fe0bff939c69ce2b950c7437012da82b70e059e6387b6cb132f301103ff8eb939fbd311ddb7cebdf3b7792bba7072b3343c1bed0bb8b767c9b6c391ef018fa9e1cf2ca72ccaef3177e7dfe681a37aa751be458e9929cdbeb243403813227c78bafbd7af88861cc80f3b52dd7de13f3ac79ecd093a6330f2f466a96a2223b551c1e65f99f06a88c8570c4553397295d481cf1c85179e6989bf315734b1b927a55c88b5daf770e1419fa3ffd5b03361f8760e1ec619c137916dceab6bae348705962838044f8d996b8d349e5827c283923e2444fe59791fd54c938f0c4d8b324192e5a7131fd8701135743787ea1c4400d8813cdf677000d0666107598a7ccec1fd909750b40b882ffb261cfabd344dfe8d62742f72685a342efc835594a30f3d342ee5a7d3174a4b7ea2135f1cd8f2ea795186407143b57d09d2a8e5a763e962a4e7caa8a348a1e38128982c52c7d5330aad4915d6ff40bda3016c4bd9847f76c6340b1cf0da26b13a27b3658a25ecfeb43ce9ea0d99410090ef36387a3384607908cbe184876893f2ae9672abfcf01c1aa05d4870d4833c9cc4f8fef869ca34a90045c6eb2ea886e3cafeae3bf2cad680dbd02678ea322624cfef0fc31b7af0568dcbc4a68dfb25e2fb3d6758e1c94130e0f38c0262c0f27e009fdd9ebde5bd579156ab2cf7e054ec5b13ea8ecbafbfeef8e05a4d6537f48255a5683bb7e6c1b49f0ac5dbf7a16ac4992f9128ec449ed7c494057e2c7d5576112c1c049cfb1e3d0f1a55d512f390f0626f2f739cb93578d83f0d7b93eb68271b165c946737e18b1c74d67ae87432b56963e658c74076a59f43f768f74dd2bda12045e5d415d455984ea84186ccfdf7b7d9aad2b7c952e13633a3650f242e8cc23200a2b0a0fd461b419cb92f26c637c94f812d1f1943c1813de5d50c873b0e21fa4a45acd616160bdd8e73cdb19e7a8d8f128ec58ff6ab491ad043c7696f521b8fe4a5e40443aa293454e94789ed5473a7b3fb3ce530dde4f00b623a74b6ce8da6448053034b20678dc0c18351c74458d2eff47731c1b8ba5774743de3472a7c45e71c38a95a8880fe6baa578a24a485ee12692513ff9189f7b937e817dca49ba456d60753b54692370b95f6b61b8e328d46f15e18f34b6f1014de2a286816d8baebc776084124f20c11ae70384e4a97451a0e32f8cf21ecd5693071bd61dc3b91845959c46b21dc77a982a6e8905e73fe2e934fcbba40c6b994735fafe99432387b2bb8f93845a749434f4415a5cb8ffa91fea03e920ffa63f1517cac1ff547f2a37ea03faa0fe44331fd93f9587fee9ff9b57eee3ff3b37edc3ff3637db87b666fbd725f8df79960ecc6637380090aec9d01bc3b907704fefe00df19f0bb02bd7b00ef09f0dd01bedf027adf0be83d0fb7f3feb60e1fb7862a88bdaf0344b75694fb500d5aa7d49cbde240c1a69ef71ea9268645b0b1ecb6c662f2c3d83ac39512b6bcad69403dc8119f1eac1b0e79b6ac2be2b54d9b82001e8545d86dc4f765ece76afb76328f68f52aad8969cc0725cff105d27c9f2001617ddc1559ce0ddf8be86dff074ca9cf630cb10fd15eaf5ce7b9ea989a560a642f586cd743c1a713e9312e0c2bd6f6cf43c4052a86f841e2ab2e12a2e53554d758498d39c112b2295b12ad22dc9d467ff34399306c7e67f054c5a6fda5f3125d9786b6c5a42cbbad46bacb2d9c9f275daca663d7d8793d5cebf10ee12b5366a3aac1d2646e29956d210fdd1ee481fd94b6dc36c818c447b5ec9735254ea22cc80778d4af6f3d98bc8049134852a5c85322eff41db985e58583e90a8f44eff84ef29ba471a30d9862630b25f4a3f2b841152eca1d3c6fe108d7ed15dbeedeae198517c946bdcaaa2cce402c2774f497f50237c1fcc4fa4be40e860e47094148bfe3794c4064ba6106b803e970fe17c140c944956d29575933cffce5ac7b554f757bc115c25cfa1b5556bac847bbb988953ec66ec25e71d94f5000feacc496348f825402a5a9a51a1fd94e2645aba5456faea7bb1973b0c7f70da6f7e9cd77184428869b03333059f8a67704cec26f9f93ffb2a3686bc45828936d79b177ab204a650053c7c2faca6609011c4b0455285df2ea7ffde6bcd3e06b388d09923b846f07cd1d18375de12b4288658179513607fdd24c579a4540ddc54d28be2c6d691bbf953bc60ef879dd9db11535a438c0ddf9be4e3835fd563429ecc8c430de54557d7b13b437d1d164dea5301bd8e3ba25be9e4c5ce0d2a8f3c576ec79eeaa44d451e00716ae7a2320450afcd80d90aa1481d7a4b1e932354948347bc2df2bddaa942d83580822a4a72aa91fc99383ae9685a1f13c6e088023a7f6b7e63f7bf7469a1744ef1d5df09052b1f62e013bc81957b347528054d9d24bf6d612cbe5c09923f5cc09bafa8154398e3b82999d1fddb3354220b640aa74c909ceb6d28ad7292c0e6299af3b68805449d6c08e45e8333e06a75000221491c7a7b01badd3f6bdebbba2c8fb3e864d846f6579bdf5e5a4fe9fd9335b9b8973ff838d7641de178b44b6d52f72b5d357accd54f07b814664b98f01ba13d0e8172f3208b0b67c064c973385d1669aa49c69b29f8ff7b10eedbac7332d63cf6a053ea7c97f81aeb23f9235d7ef3a07f79a479b6710d367c35c0d8a7ed4b1959cc117019d60c4ec454f37d05c64479d2c1c8a7d928c00c2f0e2c3850ddc29cbe69c4c6e43531b001c7a53e0ff0d0e66abbd1c73a776aa7fa48bfbeeb87bc710b02ff2d1fd40673e2b7d22698ca69683e6f83a6fd61b81917abdb4cc724fb1f54af10d9b4c082ad1d507198f83e3f9d0f11e7cbc0e8df321c6e3f0b83e749c078fab03e37c9871383cce7930384e1574c4d333fb3b20623e5988067e77a0de0bfc5d02793fe0f70cfcfe80bd17f03b02f26ec0ef7b019ef7037e17c2e9bf57b146c1ac584c51667a4da92405d6c41e9a38067dfbf156a0c70b1a2b87f6da556335f246d5e81bd1466ef41b9d379a63f21cb01e087b8f770dfd153d5a3ad8056de7503db3f479f60e167ff5955ce21c6429de10c51281345a44107b578af4d54919bc4c766c9b0619faf2fee25349e92543fe4e7967fd74a6ecd63c5f53c65f79ba50be6c98df2eef2d9ede94d831e7ef9637bf028f3284bc1789085f9dec09e0d5b1b818c8ed95fb6b9e16caafcde6fbcbbdb57cca42286927dfc30120eadd255a8b13f836cdcf992ce5a98a2882c7aa279177363a9aa685ceec2fd8f9b22219e02e6d7e674546eb82ed76b8b395b9fbb0ecc51c7727ff8f78f1477aca26fe7eb6397573ca0a7efa7684c048a121dcd6cec412b4618286ea80aaf2c7dc7b08457b218f67bc0ebdd3d0db96498822f77d51d514463bb37865bf87cb015937a6918bde51f2efa30bef9e52630a2de695a81c0f627f81c202abf9576227fe52289f0b621251028729375fc22a44cfb313dd93bb83693cd5f6bd927389014cdb0f58f462d61bba8e65c622a7bb63a0538d05a0776fa6ebbe12697f0d4f2ca1b14bc06ae44870a828f75ee017434290b89486ed1320da55299265ed44ab90effd212bf0f384cbc886fd0861d6f37a668833171e705c43fd9a583b35ef54540d368d4ba42b8a8c1f6f0de64fa98eb0e3790cc873b9de3b1650641799b5900a8f4420d1bb4197f1c054ca07311214a551b4f1dd9fa1c057fe0621070d280cc6f56dbff7d68751a335b730c4d4c7b78cafb911ffccef4949f10a1098899159767254c1842a857f2d7f4a84b27a8f2024577b7c9fba41cde0a049cc74a5f98e6fd322377a70859503dd3a937c07aa146791a335b8e9139c7b918bc9528de503542a27d6a010ee47d9153756de8df6fba80276d41c25c042268073bec40baa6fd1d735c8589a4aaf54fddadc60d5c7dd495283dcf86340922cbdfdb5f6e3c3e98ebca6075c2fc08dc47d5c9d612a68bf04daa20276608adbc8cbe02ce3c332f4fd9fd8a161d2656e05ca9198b45304a29d8ecb972653411b602322bc1c91cfdc0d6b3ac72b5ee50be33e627c3c0cbe3cd80b3d385e9bc07a666c8e0055b84ff8c03dd081db370c08031ac1729287e5ea609c699c583279e1db07835a2f9e6a0d512ec290a3b3f7636331d2368e001ce512c8a3570d4ea6a959cccd8a54f3b054590a35190e649a5096673ddc6ee0bce0382fa8eb5255829f38136dc4398840c2371653630e6257d206ca475e9c2f53178e5d6240df5d07a806a7b2e724a7bc9a0e538436d4f91affe8a764a06db313b068e9a0b88a823534f6b5e7a6e2ae660300bf7b4e0717c11bdc46e0b04747b867fafd985baa86181b1a32796c364d2e550539568d4c9a7fc3968ce78efc2cf293842f52be96a9a05b7f2a4fc9b02776591a1fa67f0fa3ccab8ef8b1f17efa64944543a5c48f560ecdb2c74ae613112db5f916ca0039d8e056a8dcc4bce1804b7607534e8b42100a0c5121c3fbb933977561799d1f9a547df29908c812bf08935016c4349e0b279e7148a850458dee61142e4dfcb24725f815e711a7007305e7fb8a6f3f7d15e9c31cb88049d496af9485854670c2457d0db2673d1ebb6943baa6186b6136cd59b4e9aa0d9aaa9ed18f77627095a3f0456ba6c9ae4cde38f20977e692db69ab5839f8b4140533074fc51ed8fc9aac5e238adef59fcc88d16216512dcd77f5aaacd501218e4a8196b8b70851a20b2ba9237c5db2ec7e4c8370ec2fef494f9dbc40a8cfc7a7ae4f97c743c29d0e0868c843022f0453a628d280828097d4fc6afba0f9f1b1607d38ffcc8920e05dd61c8b1033f1154f3bc43347ad66e90811f28730a7b51d1c57b748e3a3b013160dad7c6d7d0a2cfdfa6b1e07aa410264025dffa50889ff8bde342f614a746648a4512408f7eb0d14320f1c8087a8ba1c91da7e931936ce2c382c93bb5f23594f156440eedfe35e32a9664be83674952e00159dd568e522eaa538b1fff116ba69eed753c003f6bbf5a3a551f1a07ffb6609c05b6998a019afa5b1404d204e84ff830f4c4037c1183abfcf8c5b169c4af3fbcba4811472722817cff4fd38e5c99de54d523d92ca71f19f2c3afdf70b49c75107fcbad1a1944f86c30cc59e562d9a2ac385ff8e1eec37e1e3f87a15cf11a914e28b87603b9294e56f07f23833eb0d3339f84d836e488852ce84dbc0c539a03a505f3d5ad42ca5280da682adb67566b546d77569640e8e339b598035edd52d3c7f800f51e0b8e4473c2ecda320ada0a17e044420ccf7211b7af396ceb29fa17bc7a06726791a201c175a4a81f578875a52db03892258133688901531c144f99a25949a2f8bf08115816c874f303855a729544e22e39c940c5590110d0ba3a3ad6a9bb9c21e8c8599b71108ebd53e7b027bda9ca359350f206480a144eb0998e2392cc3d10f5c2663f02e1383b4133b37d075ce8b3d79c355116815cb311a8cac8dbc9e8ca836e9492c67109dd6884a7b67dee440e68af65cfef06ab57617593da1c539082e5f26c37cb5cfaf2536a17c688c9c3dbc07e66c378e1ffcb1af68c835cc537db193a52010e5f56099f41fbae0e02a592ae077ea7c922a3b075f9efaead6cb065ec17c5f793f4ce7f613ac4d5bceef8d03be06155341f286659092374cda6cf41a1f8eb90f224dfcca6057ed0fb667a71fd6d88347f0fa0582ab90cf8f32ec427b2fdf4170b11c2de8bf7ef7f604ffc02c1aec7069116480afb5b09016f45298232852cd88602ff2859ddaee98fbdbcf900d4bb9ae4439457e4252cbc6f4ffdab3c8c6d68ff58e772082fc44ff63dec85a1841ed9d567abc30b26d6842085bd253deb26a8d43b33ac25b4b3d4a3c3d9b2c5c75a256b87347748437b14982c3e83a5ba00a4ccb681c427fbba5911043bab22724466bdbef6ce3b306d0c0fa228d16057b04d5725f51941d2a253193ec3d8a6866cf348751f6f7ec60f0991c09c37bae8805408b2d4175efd41adae991e8fc30c230c47ebd2c4587f1160368d95ea8236e6484fe1e54b51f8618e74a1c1c58e4d075aa3e42763bf7452cb9ee194ec069697ecff6af3e4ef9e46e9b97a0c86a40b9091ea8461d74ecf9a83ab2af13cdbbb80184d87fcc3168cfc1deb264be55ec042bb17856d233a048aefffc094a4b2555b41c0428fe6caf9379b66b32c0bd65180599818ab148db5e0da1b4b4fb74ef9086fc2930805ade4de348d0058a9c8c12404460976e4cc998a778cdb8682dbf2cdcbbba9595ee25aa709841dd5c38693374cda9bf2db2c69d7bda2beea10b96eb62140d36c56d36e4de5aa8f0d4d5f445425b5475342192c7d94f54c94aa9300f70279da85077062a64ed0bc1b289e689f42e1e057d7c9e2b10069e5537d9973e14ae14599600b9c6cc5d34ad06069cbd38a263852c69a21949e8095f10a5b9d12aad776e8a383c0315705d860424e227e1bb111ebad3e21c6673135264a63fe9911be20241fcae88ce6b180720de05bf23a6598478ec4ec14b531521059df0fc80d4e2c04a8f76d480352b939bdb8a2950e50fe3571a21c25e33bf4f52aa24382df68d85b6d83eb1b45134673b0cd39a191b9a436d152c75c05926171377999b25de16ae4318d3d41d830f27e2e697eff908fe3d8b7d54e85e33d9471254d3ed4ab78b61a679501eb69008d474fa97a75f4873163ddedc73d54f2e27177287603a964f5340b281f15a5629973cca437a9a4590d5be4de84945277afeb87f7a06bc8362b6e33bbbc25c88f9c001e928d489cc5e5c4f8d4ae7ee099099701eb24b165e1095c70b0504ba81325d4e9513c2d618129e912670a232bff153655cc89eaa6c8b94dcf624f934b4c14912346bed8a34cd644a0528b9d07866146b8d5e953df197775ecff88486ee8cac7ee44d35f6797c7ddd73ab937e5fff1bde55caba7886a3df134455b034dc09725cc744b6badcc0fad6a932b818c01bd727665e2bfa233dadfad57a63117c00e72465b15a356e554547708234242ef234ced36c45e5dc5cc484ad26168673e294ed5529d3040cd07cf827efefe2f60c74cb5e7d6292e633f28d16787bb7ae3ae108db60f9888b92a24096bede894dda1e71ad689e6c0541e07d1ae98a777a4e2030e4fff6be7fafe49eb8d1f7f65198449e0334866af679e381c407d8f973a788c4fa4038a613189f8bc798d2507d2108225966db0dfe126890dc1e129cdf340042948da38cd66b083fc96d8bf6313da5ebde8ccce83c1ca6fa09017cabb6445ee9c38466e2097514590e83c312b23624e29b95a648b0d3f5a09baa56223cc6d5f7d02350404286819994a858248fe767917c48e050ad1397983a198e742cbd74eeaf98f83dec20548b008c085f8b8004fce189dc1d904585b2977489f41efa5b1968676c463950967413b908aa0f2d92958d968b400f2dba1c97a3a8cf9b2802040b1d421485926f8ec02d5707e2abee4d1a8fad3756aaa218e7e0edf5bd4187993387dc548b3f5f409005a9e89c5dd82a304e8916c9d03a332695384a4d734f2e0b36961859a1e9c9d9ef3a30ff53efb80c811eddfe0cb52158193ad93e337eda20d29b57fca98e399adce51a24001bc91221319f8ab5d80bb523a00ccaa1ae00a60dea0c19ad5a32cba5c7b21f9aa75c947ac39143c5e481daaefc80fb652638944a4786da14887da38af56435b7488b96c07f4b7d9fed3dc2ca5d94feb4f8b2111f80c0f4064d854595422339a608db78436b680de27f32169dca44ca2329885a9cd206cf7920b18598bebc7ca8ec65574f3c7de932eda1dd89fecc4ba88efc731febebd311f78ead2ad51c4a4f37fb8abb351d60e93b96e8f9864581ca5db64a6f2ddeeca41240531c6d204ad6c9297dc31f16de826231e5d6f835da03153885f15cc26821498a89435bfa50e3e43f9f8a3fa7553f4def3931c8ff9968412e2cf1afec8e681d81e0c59a9d73122e40ba350256fc0d082943aa42003f1d4052843a2870a241200b5cc4d4e896b9586395926034006a8284e0d34890cd751c11cc58451740f544eb61e5ad54738cf17b46b2b22cab8b08db32debde28cc211408f9dcda8a19a016fc55805eac2568f0d42218ee12ce6f2388428c89ee562b2c78a24cf6e003bc6185734a30ecf8034786444d0f36604a9b4bf2ed02ff3de2b06df28f5ce53735044be7615e95d63ecf0ba9d8f06ebeeec7310993621d1538c9c6aa2df161f96c8d2668eed2d332d6d9d34b7b0ba7a82d37301b5c55f66d231b427c51eeaeefe131c391af39f1d8c42885c439a077fb1e447d9e185ec2d8967b7e8db9786afe3ecfc1ea94c3025ab8204b628a0c685856e641af3db0434beaecd4ffc4cb2d667c78dcec7dd16e91147ee656ca5230cb0813f70a39b6ebd521be11163adc648173d80705bd8a2588a8392e4707bb257f5355163b6a1f829ca8a43fcdb04fae2b5278073bdfeb745d46a075533621afb9644654dfc3e49a1082664c82d957f9bd025d5f4b3be30029dacd52444c90a0a339c5b348982422713fef0a74304d960394769a9c600698113dff8ab4b107859c08a9de9ba4492f56f131e57071526b65feadfd55620699016b328f19dc68b913b0fa86cdd6df0df26e27153cfebcbaebd4d8b43939ea66684873ca138c78735b9fd0931c0335bc75d8ee213c5b1315cc11037b653a23b0bbe505ddecd13812fc36a0599cf24a3e232c3fa16ea3f8b6e727d90913f61be6bef4164ec9dc316f602847ebd049645d70cdfde9dd564dc5793630ec9b866aef7ed8d279549a7f9285dbe2984381538d9a3bbbd90758bd99a7f9bd0f653c7a9e4a7f6a554f2e07e942837bfa2083df6168b4b1e1871f63433fb844fe4ef25c6a86a2a5b080bf3be7e313de39287d8328b530a85790a7cf53631a480e00067bcd325d06e68989ca4092808929db872f5b9bd017210cd60e3673e48dfc910ca7704a01d739ad10cb80691c19eb0951bdb7e9e546159dc547fc23479ba25abdab0f0c724db54c390342522ac456e4253934460a57cde8e9f2350e89efbc52684d990bd45de281d70bbd1f4a15eb237934fa16d155a8e521187e448827c9a58af212f6bf2c234b9d0081972851c3381ee7fdaf3d12feed6e82d0815bc7142b1ebf9d6770668d03a43a22130823a67b09a4b1bf00238f469e5d8c4fdd31e31b9d221fce4492bf105d39e8b0e1e58f0de036de3a892fff0d81f0884898399f9b75501899edc4e7a0b3f3f9b55f580a06d31e099dea27b22d0bf55e17bd5ea82f895310e76e2f4f8ca42d432db81d3b62233e772cdd0e06a923153a3b748fdcdb53e3827c291201f1a42e2c8d390fe095aed57ebfd7d747a370492322a17143fa191de877113dd233fead29a1d431a814b12e8da25a2dcc4dd9d6d4b8d38f6f518d30dd251051105f73ebb980f571ca837493b6496001051e3e37a411cb1bf1631399357a49a3f40aa146fe2b05ecfc7734bb83bb79cfd23220140a74ec8b47f424070a094b0620219e1ecd1583d8331a18acc3523262ef8fe3cd52246eba2b650f99a1a77d73f738d1592977667dfd84ff911fe313678fa9524cb5e93d69ffe8c0e3b23cd74dfc29f629f6ed6480d75d88535ec112a74d53ea1a607f3121e9dd1bef5ed3745ecea01e33d4b66779eee423f027ba438a774d6dca9d87c87f5aacfd8fbedfebe16df02c857e0f96a8b2ce7d7d44813d1fb25d55b410732a9a5a0838c963dadfe5ee586b46e6f426bc4b1a0c356300f4c54a77ef46cd38bf7ac234c43dc9c56e857c137715adabad5af331eb156a022e7c80fd3026ea32c0880c2924698030f0cf43999df4e0760b13d6af1a4ce46b3ee79336f3f97fef0f0cde22d6dc2871f5aea2c71487edcd50e160d9a5bb3c8a8bcbb7da77c9dfbd0efaaf0978e8465b15a135408a9b713f32f8b4b1bebbc598381c007630f477d4e492db7fed87b0156b3d02f91e173b1f7b0d52cdc76aa16e8c8809bf98ad3cec59ac5e1ed0bb0808c358b8897ac26afe5d5b75c1a31347aac5938e056bba1ceac59189cf204735cc1e1a2257ca9bb8103351d5d91fdadddb178592ff171914a92e422f34136648a7b430daa8465f9fc396e7de3f70873769b3f6338730dda2a5825656e5093f4f379ac20fbe5cf4e17baf139061a3b33851687fed2e93222d3900c4e7b3eac3438e8c12389abeacbbd5e7b6f8c017631ede583854496a01cd990005c19374c12244e52abf1ffb532cca88106700004d9d25a02e6ce931e0c10d90478063398bdaa895160d9573810136b24c6c46910c6621d75edc0c39452b91cfda227677359fedd083cb98b0627137620e302c9e942efd24e2881f5bf7cd58b3738200781631298175ed6e904d47b06651ea77c4cba8b623ee61cc7e00dff38f64dde731ba2aee064dec1e74f132ea1979bab1417a4fc0f4a8a88fc064e22d5d1c3952c80a45ddb4744c73a0746e6481b661f68d16e8dd469baa34e1ce0e6801d95ab23249081f88e57d64eec1c208e8340e27171dc7477fec8cb8596cdc560632860725d0ca13f35c2482ee00cf87d33a126fd938f852d6404b5a5a4864d1033463c00884af044a1078497b64fec0521efb08fe67d58c659f374a495973c74386747e59243857c79df5e8126502c034f5eecf0ab6344fd9eb3341f895f293e558c905a39f6a3cee988ccff326a9f7297c813a1d2900548a26267493a5dade8a916a350eb217f8194c41a7a6b186fb0c59310b0469d59890ef3ee6952bcaaaab755a74433d87cfdf327b5772d8e85738b5b02fd5a43db28159c98f66b35892bfae33cb0532735c5ea749ea638ad1a32f61f32b6925a0507361e6d80fed02c870346a695c8ea2e687e8f421139f043a0025d34063e8c538ef980c0778c50ca72be47d5e103903ec79735a9a2ce7a710b1ca08afad52bea618310251688a1c4c210f56b83ea6018be699db604d74f810dcf5b36fb92336757ada61519990d2fadc31daf8cfe062476bff31cbb628946f0868035c1449ea73b4583b064f1ff6ad5cf4052d1fb0e7a4a79621a844645b40ee6a0867656016f7f80042fbd399b2673980c54d92bb404e823e349fa5dcead8676d9d32e162c0790ae29f5f5978f4845b54efadd4a687a8c91adf504e6909e857069f4069f7fecb1b779acca44e8ca0e3c0a62b73e7724e0e7cbffd9daff2288c694f5220cf66c12b5e5ce32707d8abc56876e7edddbfa070fb869485d458217e8036c844c33f58d5c3c8b687ec1f67151ac0c5144fa2e788f3ce4c1a879a2857587930864f50afd90087ff30cb654d5c3118605e837a4754f736b61b1b3d4327412d830e764b97f5f248a25acd9c14380c512ee160e6189c482ff21ef206a55772657f8aa89602d6cbcae6ac4ec66478b02d739a7359b608a5280311cfe0bd50a7270714bab5ee2563fd6bb4974688713b9dfb19b5add3c3c94d303a6946548ad86ab4f50c3e3734a42316096da87793ad44855371a405aaa526756b111446ebe58a953b810cb9ae411b9e26b2d96488f46a3812fd0d7c2cc54f4d253cb90a7cf57ac7a3b114809613e0e41444f3d86cece1fe3e4ac4626251d8508a1ca32df9e7a2f45c04960433479844ac4c673a062e50189025a24275ba16ee423001c0da587c75b41049eac5a4657f1b5da474081932839f05f830b4c4252c198d31c76a8de13e1ea92c9607fd068d357e98faba2b8eb6dd6c851cccfea49e3e82e2404d01ab62ed2910dc0dd42f7469df3ef950f46e816c41ca2b257590cfa68689f0e02a64cf89baf5b65c10714287d00030018a7b079cda7e549f773be083de93126e2159b8b1db9d3c22c8dfbc92dfaed99ca9018ce9a97d93c02f2ecf3fb757569b5d1214c3bd408ef38385df5e9c070f2e80c7822e22d22844ff03da7d6acfc70e2c7ac9842761b4e9035734e556c68943a7ce9ae23a9284cbf3f6d817aa1b2dca4cf077ab404a600acdb1160eac12d1d3de94b70652e105e5bac0a1f1beb31a6b2dd04203ea08730d6386062d76adc4b9995b6a450e088d45a4e59baa9d2145583d71bb362d43c89914f89dd49a9ffc73de8b256c0259263a1c27c8b0f2a633c0eba74ebcb953bbf013f143055e477c9be83cbdcdd70f815f11b499ebe55ccfd491dd7d9a1276772ef4b23a5e383d951915bbd2f7af89b4111c05e3dd87c6d1e3c497aca5a2007ada7727ef6fe9e606e92768462712430c663c50f05cdada42a3c0237ef3a180ab8d3cdb9729c7cb1d4481b4c70d8a794c8a8393a8f753011215c65d3cf23f34ed2f2f7de42eaa415b8d1064e20e7a6f1790fce533d10346fc359140dd80aa949d3c7249d8631edc66aa2743845108a14d4ffeb0c3d1b613375f988e7c5cf5caf0fca6666d9421ef45aa83d373d27d4c50b943ce6f2d8e0d4f64b65e1c6f4d4949825235dea5df7220e724c815c015f91d2bb76f1095e1b4fd0879f195fd1bbf80cb7d4bb5278ce10da36d404f1038592dde6ab815fc3b53b576572955e8e8cac234bbd1bc5b0208d439e30c2aa7b840ee6709c90b00f49bd1b2b29074d60bf34877b5f7b03fefe1be83e717c03977a57a41d03bc7ac0a318f4b1dcb40581677246461e7a2b3b09dd102c489c4c4aea8315fc80c7bc80936c18145f1a79d3d0ad863e91582f44be413874de717d04039276c7db09ae17501b74bc6a88872f3da77af507fc7ecf718b600e8d7985efcbb71bc8e5efe6daef6f9ebf93f7b90b5a851f668b681501e7136f19f7fc1d4dfbbd2ac60ff7b4e95646368cfc2a98214b874bd3e29285a6a353a1e3f4775d0d3d786583a18d5726eb8c4f880458b1f477821cfc425fd9df2d771070c6c49d32db286cc25ac29b028062e476d327ef6462bba0e8310ac46e58a8dd85fd59898562a6cd77c00a3b15f38050c44df31ed6b379df85b63bb53ac04b823c35fdbb5c084324c2f8d30b22c1f8a09b1bc390e4a253472c58e076bd84933d75a34a04dfebb4a75b2aa0128969f8e7d17014181872bb3213292fe14bdde58245f0866e21736e4c857cba9c8b12ee4758bd1ebaac1094a31989795fa9fed309552edd9e5dfa27ee65f533a4c4be5480ebc0fe50f09fee442febc1e7c3286317c15a9f2b68ec3a64939c665664d7deaa0c3535eeb6e4e8c7fe47e1284245f06d34b7600dcde5f043c533d4525eb62d5987d5b9ef7ceb664cf3bb6ad98a3d158c33b2ec335f3fdac9c827b027dc78e9badea484cdaddbc485ff44fe2db8c8930950528d5f4092976275afe4db2d4dedc8dbc33a410bfaf9e509268e4552b92b412a5987b65d314af04b162a0058fc4707290c522a968c194cec858e551b8d930fc2dae932e576ed84c576006f99e8c3ab1a2bf9019eef78c175c4afedc17b34d9086f2debdd9989ec2bc1e20cbc6ee9eb745de611f779a93d83bf620c87a55045944309f78dd9d7dc9a627eb3df7817b14ca05de036eaccc79a7dd91eb4a40efa15d0bfc48156be6790f48d6a591b11d8aaa05b3455f7460bcb03efeceb7f8fa2bebf329f2bb9b01bdde5e1142bbda514209c562cf2f9cbcdaee96de54c4c6da9070ad7f4b770b5c2f25d73357a1fb17fe6708bbe978823cbcad0cd53e800f8d622eaf0c4fd669b0d53f3e861dacffb0c0adabf57db64d76c56a8fb167d36336220955b5776d55119b33489492b12700952d179a5f2c964548aee133826e15267cb5f2d828075b6c068403c048773046fa790499ff49a3bc6ea255267a4f602619cb8056763560dec9418b87267034f2029e40638887cf3e9933bdf6b6c51fc000cf80e1ea9248a2f8ae10800e1c4f18615bd30afb7e4eea14d9fcdee6f4704f98db08238beb6002c120246d86446c1037f97b80d78d694fcb77dfc90c54d664f5653b939859ea1d7a8b20ed7638172ece1fb75e32d365b417f03c503be98d864e4c91681129b6a3c0d211cfac47a5d200c78ac386c4b1c8c78c90681536257ffbc6c25fc9bd2a63723e070e697555757268743ad4d375e6224ff10bca46201a8f6cbcc7a84714fe78ad10babccc163851a94fe8d3713419d68934595c322c11afe2787d8cdd4f35847c0f3a1768f489b94a9487102f74c8506262ec3d445929d90742af5598acbdcf11e0595f6a91d8c5e77659d472708725822e5f51762e784be27606211075b10d164a278891df41813c79f5bfcd38ae93d74fa28870b71245a0a02931a5072e9a751b252e714d8f43e5c7cfc234bda6fc430320312fb644f83e32089ecf550430e0e88d0e0e7c361e35fec0248516fc30ffc64377e93b501bdf878942e2f58c76af7bde27630189f69b4c8d97c1b5431592cc5d9ab4af4b6d79ff115e3ebf43f54319321db98209d180c3833c0558a389ff244794f58f3b76a73386c1e708378bf0cf1a43c909647e556994264a50e2ff0fee7606229a70ab61bd5bb981e4563de7b95cc14c1ef3cc4d22fcb4bad2e506e73713f6bc5e4a44d84e68e843911c0adcd5d84e4ba50b2ba30981e4e530a2f73b2d9ca06362ea046cf7413fd43cfba291474fd943da72b4787336c16ada2a52b77ac0afa25eb11fe6bd5563cb91288608ac341b76f33bfb3bc31d27ab1bdbfb7a1661638b9a4775e3156f34c19653d3b51fd23c31ab8d2eabe252f1d8be6f8d819b4b5176571038549e5bf9db20c35a1f188aa7291ef5843c2125b2dd5510cb2a48a987b4c9ec50d0dccdffe9e89dbdeb4b3a20bf26820d24cdda5d1d2aa2e94ca1ee17ad6d1ec690d533a154c401abf79dca74c9a4ac4030a6ea0cced1ba560bf8567e8b3308c45350c2b3e2d377c14e2508933fd0ffebf03a5c6f768ca9315903a0ab45236951fcde83f367ad91adf88d8844a0c72aa76870b9802115e3e4278158610e4e53263044f4eb7dd93c2639c632907cf6f40e2cd25b2fad47d6373cd6d5ef2df94016fb9a2f3571ea869d81fcb8cb9ac17fc5f36d4919f133ed41ad4311475f2ef5c16d2614e516d9d6903e7e5f2dbfe60f7e59b3e8a3d12ec3e26b271cf02f411cfef6a4b5d3fe5450e82242eb7285fd343fe1429da42830033c41b860875549276e381fdf77c5b9e73a780983994101a3039024d01791d2002bd4d107fadb6838004198ffd61f4abad359d5633b8415c1517c199b43b3831b6152c0bfbbf4b1716523dfaa14cf8f5043f219cdfa5ce0c148c7680b8e345fbccc46865fc281fe53dbf72dbda2d14bc015d4d4c5bd3cf084f597f0e3663c3ad528d3dbb39cd940e7cde15f521ed431906b002d28cda1fc2d863df1b9372410b5b455b2ace9f825f071e45247769de663b7914efa27de7fb3334920bca24fdfe286bbf3a4005ee90f8c70960107e719421415fb95c8d6a6f19e53676b2e7f81b2e90c98cc2aa937bd0d81a35790bd9a5e8652fa945e529a083208c546cdbf5bc8847bd51a7c3aa9bf38bf7a9429db61d080bcfdcbbebba1d48fd5657ccf0a748a7c6f69611caf2aad63d10b09cbda7ccb1f6f7bd5e9048ad611635532edf6e0b3b4bb3c714057874ba0880317e0739ed480308fcd3a877f8f821de631e13535d5675f8388f1febc0f5a86469770a155989899338c70687f30de572f685d3b403b3d8ceedb8d93f96e131f4398aa95720df68e32d81aae428a03145fa47c43aa09103ee6daaf18934d2a8bfd8d92de8c729269406e4f252700b59c7181f81333acac025ee1f55be0c0e1a4d0c8c100828230e427ac3bc7301c7e38ba9ea79232fecbe1a34fc6dd2070c71fbe9bdbc43683fec001bf6812d51bccc2aaf9a1737ff5d658b90383881c4e2e6a37cb70a2266d1d8f2aa051bee25136d7a193075ff2192c5280f32d58457e983a6475e1a5ca1cf7da414ae5aa44005000e6f6969497556e12b0b56729d7362b96cb0711218da66b3d1f39b6113d1b1497c8ce4b6b69f5be59a4ddbc7392af3034f19dbbaa6ded1c09e8322f88a4640ab84ac8545f987af5352db44476a4bc04d3706936b40aeb72b668b96d50bed8fdb22c0bc1168191ef40817f192bbc46ff859ed6475e60cf1d3f65ec3248215cf90fdbcb2216225fda91d4a5f76ba7cdf72e05bc6f4f885da194c7db121c01e166052f6978099ef837ea4a012bccf94f9ac81ffc0cc723e9735347ee061fbb38900268019513e4078a24ca66f8f37dcefe30071b1c608ec704f8d58b5d18387866a62316296eab87cb29a06d849009f2d47ffcde45fb2d491e78024e1d634b2071a606f82fd77feb9cf5ecdee37f1b9c50c5d66d615e412bc4f43a3ebcf95bf7eb95cdb8e5bd24a4e2d438560e0966f4742185bc7557524e8b98c49315f5e1c11f4ca5f7720f3a346e7635405b871d9a24a483a8a130c560be62bf2aa1c041429082a79a7350abcd92beaa875f9debedddb6defbd04e8b638b4fcd4169e2036b0f0b89300534a4dc236c80e1895c9b14bcda46cc2c8a031cc5aaccbfe5c3a2deff7d9183ea906f12a930b74c6ccd95022b36ee7cd09645209476f2898462a0441220e3a53300c93c7219aee931ebb68f821149ad0734cb6ceeda88569f0d75061c5dadca662d991d9c783845e7419f4d5a14e82b97b548fc3907bcdad78b229c293450bd2cabb3ffc537c21b59430b073b71cc05993f8f6525e3ea8a670443932c2d662b9b8f497a5478464288fbd5cb8958134e659988028e3d6b630857cf3de93a46dfb3296b20b22ecd9a6a790a1add08d38e8f16d8cb5cb3c1fa69a979c75f730eaeeac315adcbd2c361ad41228640d7973649812eaa9fa4540a53343ca4d153e23b56917df58ee4fb832e4c80f309ddd5d973bf4228093a7d24840100221a203b49c4695ea11d4cea187c2e49eed1834a21252f2d447e9c6d47906082951b1c1d2f54abdda558211d3852f26a08f153f4c1ad2066f3ad7094e978cb183a8447616232ae9e73c9bfe96bfd51e4b269352acedb224469d98b205004deb7617717ec14c8a02d35370c2a89676759b8b6b03356795fc99486ed87e7d40dfcba901b546f980a8dfdc020839356284b086f9400b66d174701e5df10982a92a1cb73e561bdb9572e1c7b88555bf0d9161f149b31c01e09c5774e54c1d6aa49a0b8c9bb89e5e18a71c9b22a21c94f6e9ca1a1a594f74323459c252ca0858cae22ff9b33a7e5285e013de49e0a5814be0af54229ce32ae11ca93b6450d1345cce86b0da0564b9425d308fc83911c859a6e6240f3a61246738dfe38e550d0893961b91d2205877c606726337ff1af072dabc2389e3a916edc1c82a17203c12856b6815f99530545a1f944dffbb31ee6c7a0130984cff3b5ba27fa9a945de34ac627ff5f2ab833e82c2ef7f2e4ca75e2f4654a32ab194de8b75d4e94e44e8b8d4119ef76356f96a643d509799238c3ff08418d68a0913dae525358436b17eb3f1f277af9a81301d681ba2de134180af6dbc270155f4923c9c786ab08514817869f15c6c8d86aaa42becf53855e86b581d3d2e3ea94fa9e168e04bb71752af5c468720b6b6d7a623d896023951f423224586916a88d17f65c7d6ec1d3351f49961c3579f8453143481c4748a7b8238d621723039b89aee8eb4bd90bcdd6302aac59662711811037e4c161c14c804df328a7bdeeebfb0710d2062491ef1fa6a24a790e16b56791112147b217150e855b9cfdee7fe93e9bb2531ec3c726b58963e21fa2be2f514ad9f416f8b89b7d5b808bdc9a6e639c874b42fb499109f8ed4ef4aaf17008f3f01377f2247aac386da1f85a7b641989c62145b725a9a28732b5bb085a529922fbf5f98957d10911020edb9c247ef8ec1e8f4bb60a223054c658f2e05bce077ddb22a99ffc02af330dbdd7cbf942f2afedae80e17533059d59821527f5e0aa515b3cdb60c2244306cbefdff37495649360f9ac2204970bd56526f394476379fba68881016bfa5056a043c78dd849aad292764518397479571ee773b108cca1e5002bce05fa4d8229db1b72e2c1270be26ba2da001d121905e597381c089736928bf5d1931bfdaa949ba5c006ca5b897e72a45746a96438ad632e955a951bc661be1b54d71223809d2cdcd22bc766b143dc364046e3c20a3e30c4195e053b5056a61e2812b397ebe4a36197b5cfa824bc88f016d8cfaaf1122df4d3eb9de36c63ca147cbba0cdae56917110f82735efd3209a27dbda2710c1a0a35b84aaf2021ab5c85506c6773e045552715cb4efdcd1601eff097df21aba258127514310e47647d073d84113a583e65f3ac0c0571b3b06d6cde898e8981003c2cfb3789fd9aa82c1777e5d6de517b82c9a2653c4dc518ff8c85ebb4d590aa61889a0b037664fc7f64219dfd46f78ccfc60cf382bace7e5e04c58dc8f29fe84e8a3f9af43b8858bf24ab47a8c4b4c2660368064c3561d3abb1e604abd5885a048c1ce8b7fbe47bab87c3c192a19252ba65f72e584337471e41e87c3a4048a64fc5b3250919c879797a752584ddca1f2b8c410cb94f8672ffdca56f14e6f2aec649f6d96c9d3226cfcf342e5729f796c80043ed08229ea01895b9587135cc2aee1aa2e7f52283ec683a4abcdc4765b9ae8e29e42ce0de3c32cbb1bc512a342c075cac52d318ae17066bbb6d48a6b4fb259a54c910bf63252d7e2e80dacfba0ed6bf652719eaf6c4e24ab85ff69e549ad9bbba69c20799dfb9147adf9452c5c84f2a517bed8ab7cfc1170f07a124c264bdb90986ec81dc0245c0b2de2d18c3ee0d2d81a5f76eba659348e2ec1b47071edc103a5569bcfa5fbe7dce6403b56b113f074618c691b8866e77b4515b4b0d8eb1a1b110957e6f3baf4ae33d255dad6a5911998f8aa0da00bb522e7f1b70807758876d88d5e7ce584f0a23a900357c31d069dd625bd800b1ef2bfe83d681bf8d9d4e284fa58faec4ef9db3ed5434eea20d920d0b4e9439f5c112f06d0b36bc9fdb768eee45090d79443980ce172a522a4c817d77d4d0f37a867ea754de4b352950839a7a03ef82c22681c1f92b891c43cc3d95723dd181594fd27789587810b79fac780e82661ef9f0167f63e9bffad8e3b5748e76e90b0904d64be24076f29c0923af534f98bd4dea18f7048d3299e404d8b530d9be2747e9f7d5c8b5fa4ad41b7386df8c657642649b8d938b50b47e6f45a5097e3be3fa1b6a79807fa085c7141409bd5ca24da8d853eb35779010f0f06917fe7bd334e08b405f398771812382e6faabf13c690a7f17b1d090e121d1a853a005f1210acca8021ea28965b48bcb1d2a002352f7136c679295516403ff9c49616b101c0f93b28093339f3d0bd2768b3c8b1587d6af4493ff00bf2fb09dd32965690e38057365b3afa758037fab58ddbe37507d8d22e4f00e0740b1e9d1e1d3459398982bb9bf427bcc2d94f700ed30de927c38cccffe6963180339a693b641ea56ca71a0b1b4f5ee599fcd665f4cd6f8b3f4e7243e547031dbfdd7264b352ce1bef3bd0f939a55c611eeb8ce5c292f464e2a01da83b6744b0ab5982e7e5c04e4964747a3df8d5b7b9386aa8a96e7e47bc26605ddd274d3b2bea0e154950499068329d508632bea806d53d9d74cb0a7db2b6e85e80eb68a42c9a14aca8f10c94801c7feaa7073ceff753d61c9332c07aa14dd1268477484e4192857681a1fd23a4929fd68685104861acceecde826124842814bfe4d7ade5095c110043df02341008638b76177ca41d37da66fa33bff23f7bdc5d4af8d2ec110542c7681a4f8b97071d1b960bd4ae9ede4af2e6c6ac6abaa58428129882af7c2d0e0fdd05ec54a983c4555371e9016be4a03fcd3b101aef2e6d72c4b730c46256e8e3a6148bc1a366536f5e67860f622a895b1d0a1b7b88542945d9fe1d3dc7a8bd3c5e2291ac4c1750736abe283d472b1849d5980c2aacc4289a8302b240535ea75d78a6c4659a8645424f9398530c8f55cca49aebec08b401be6cac4b92cf2090e3c20da7bf8c1ce4d608dd96e442a0d93d749f1c8fd469f1cc1ca439236ca8939d13f0221130f48ae605e42bb4a6ada107293600e7ef87d20cef2553778a4304f3050e73d48ab7df927832938af76a9130fe4522ed5fca7f00ddb6dbda678716cf44b2105e6ac99e463c295e96f1d84bd599e30bcad94a4058017009eb0fad67717b34d8f7c793bdb7bd601d00ce91223ba8f628422b8befa8bef93a330440e7d4a5fd328121aa72dabd3a51cf688b502c82e7975668e8f1a8cd3fcb92597097709e153dbc5cf47c26e4874470a70b3d8c823ca00c5437774cc28da19760dbafda2ee83477bb9faf22c0f3eb969d2ec0eb4e34d375d5384f3e5a3f4289c82e984f18f942c3ed56f7b743071f6dd8e898dfa9192ac2c6f1068e422814672e656d71d189ca8d481b7df591e1fc82229fd8cdc78f208af4e038a42f64d829f5ffe853939fbdc15b4a641708df3e5a2af6ccdaacd3a16103d15b88dd407943c7446b1cc7357ddebd6c686b70752e6b4d651fab50983ccd796c3bcc07a2b36bb4deeab022479a81a16955ed61945f6e708edb5de3d9ef471e4df594288181f7fe38f0fe3afcb05c2c9584b241df60e520066b422df223eb1560aef315d7777b1cf164f7cc34a4084c8ed6a45902f10a032d7307851ab3c56ed819b97507bd9b5b1b117c31ed428dcbc0a1be779826db062863d727629803d6f1c7e08c8762f600f067818694696c09d87fdf12cc664cb48be2146690a1d801cf797f42dc5b709562854b1328f8d581f86a4a5b95d73163b8da0716a90257a48030d4267b6a89631960443a3f5502523a5c4eaa693d5a5c714b44ea734851a16dcccc981cfffada716f9f82fe025425d3089075b551eadacf0ef7c19a581cd85c3321d248db5f14ae9ca63b3b35f4c689992033d460392b85709281fd4fd92982c5e9dea7b20e4622782f8824146f637389256be2c340424ede8769c42a810c9be8e115d06cd4cb2485124038227f61da659ca30892b2bd8dd555af1318ada4702957d0aa679c84b5c4504edd050f423bc81de047c0f168cd7e1338c2abd6fda10ab3922d56638734d7c933b6a500e52ea5ed333802e8374a33bb8caab844a78d9b805647c14e3f4da98339fe18baaf23ae02d57390dd93e8dd7ceb2cb899bee516f627cd5258b296ab98145aaad9b09336d804252e0b7802150e8c168f299abe79ca8f7aa019728b7c6e57baf9c89412586c8036a3480819e2cbe9654d22dc93ac971f11fd29e8e4ab1526e59c7b31008d75dc78a49e9d3aea1dbec2a1a9f4df43c58b8f029b33511417d4fd13769411dd0da9d043bb4745ccc86c1ca0dbbb33dcc2ad8fa4d1047fc6e50178890d50c066393bd83bc78d9155dbf7a466280f0e6821aaab6abbd17841405cbd05bde1bf57e1c623b9cc3ce99792e321332a634c1ba0dd6da091e69917a6ecdfac90c9648342781e2bae99da535e6dc3db2574fe03ebff83f990d03e75c6bb1f60e85b404ae9547aa946ef07d2cbe99948058065969df03e235ec6f2afcadafa3ec9a421a4ad11b69b70d6452556ee81f11bd4708b9a4732c1ccbace6c7d31af613c6f2673411201edc1b5ecf50cae083c5f38b1ce9f97b3ff742dd6a3828d5e49836c8c0cab3272ce29a98c43612d0944400ba85d80d09a83b1ece8c4234e4d69613be9a42597b7d1530b1e057210dc55a5121463bf51d312c2b79571264814576f458bb567be00d223f9b47592928fd2d41647fee9a7606160d746353c71629967cce235b44a06b442e6588f92b920ff5129f739ae5f3259aec35c41abdbf9836031717e9ea10aee08f3af0a78aaf08e7843cad1d229ac9c15bae0e6004af8e215ec0ad929706c3412036a99c544bbb8f82c0cf823ede1aa5310da1b0c44d983311f58e879a02047fb78cf5f4cf5cb92d0c8283733321d65c9eca657fb2b113ec6900d7fb87328a7a3e24114250103f6b829372871727a7e1c3d54beebce544a80c3d87ed872ee2f0d99e1d1f04c4321e0dd77421c29658f14c64525b54de3dce2c848e4b2010ea06fa8919336d7b8dbc75466ed42f7cdad42fa2596ec59f55b57ba27359df56cfde9748d4ed2697972c15693c9589334f930ad1323505964c18a9963102f35842dabc2a64db9cda072a770cd565e446e2f1bdc2f4e4427d0d8c28884c66a04829c5293dd546f223c4c5436246a434a8d528b89bfd8dcad0eeffc4f56ae000e3100164ff9c4979b1f78a6b26f0ab7f6f895d261e0c80e44e3eb94600dfcbc7b19befd067da6ad5d384da106bbe24855e77dd44b9dd83fca49d7bba228bf5d7b7cd37dc799799df8b19686911934aafe4409980012f202fa47e0c0c68f747b44b25e7de7d023449ed1acf59d7821e9342249cf82ffc56b0250a1d2d3ee8989d0a5261cf4a9e368caf9ec79410ce17c96e48b11b10c078477458c7d78963b764b2fbf844fb05ae50c52cea60aa97b16939df28aba27f6b03a8761e5754ff12453d9f6d114eead388896e133ae20369df962a56d3c0955451b303a00b764a5c10e1c8fbd549c487a445bdd14f8794305289854dda7ec95613af0a0bd3a8a147319c40589afa89ff8fcc1f6651ecfe9a47093e476955e48d095b23e2ebcbc9f0c9e0662136209f87ee5e5dce9d97e88e4ba1bc2bacfba7e34c4a31fc13cd0d4d3e503f5bb25449e6b55050e6467357711cbefafc68beb21c0f50ed6f71cbc89c658f607ea6534413caf68eba549ff32338a5034072f4805a8c0992dd3a2938372a1e29bda41c623f843648b524a96cf6ba1b7733db7038dd865830d59e349842415a737c5ae7aa7a6fac46049e14a7af0077d7b28c51cb772250e4e4e2ca3201874dddcfb035e4863c854becfd793be737ab405c2115231a402a6547f572f2e0ae0a1d479b26b31f2a58d92b398c08b39443a591cc13182abc63a2c97b94f51d5a15106a192eda2ed4eeccfae4f58b09de6d30f5eb21ec95ae5edce5db01ca4d19a4b5a3a7031ca01300f23599273dc8865d248ebb00354190327b99a7ad2d8ecd69f2b5b12f99ff7a48bb947d88a388524f2b6f1a0c7e33234b9be45c2190f1fa6766ff8d25d20470ad9a51fa38306e874135ab133c6e5d4dde613a468cb666cfba71904c15e7b15eef85721953284e6327c536cecf42e5d328843500b3c8b60ecc807f46d8605c549fd303bd82be9e8a6b3d0a0416b8471a1e0ec46b7784c5aa69e7bb36e1ee438a574e0e08b85021d98282505039dd6af843a0d8244c9adbf86306869f90de022ff3cc11dfdb8a6497e4571663952e27dc082abad66e94b012399fd78e4d574f0dad7caff54405c23e4b17ec9ec8d303dca812c009e1ee9b7a035dbcce517f6af7e726fa32a06404c0cf03975373dbfa83a9980a2d11a04afda62fa6b5e961b23ae1ffa9c9c680fea1320050c60418c63cedb7dc74f78af680762080a4c8c7e102a93f4e94cf89d493850060324cd65e63effe2020df1be11e0474db9e98af98c9a63117a09aed8227eb7b6f5e6795a69eb8aac0024e4bbc86649169a8885db418a69d28741011327f46332472dfca66c0862fa428139db539b18e970957b40786ea415aaabe99e3b4b675b45630bb013bd6be3f78e089117b45ae965cb1b58b405f3e0377e4aafb82b5fc81bb43e5a5e9ea5664dc29ee1303a688e733fd3a79a541dcfcebb29031a455962f047f983658ea195c52317e156201f89d4dd6f5f5ae721a298647ec6634d7be5d6c30f772cea8dd435efd606af39ce8c4807c89e89d080209b38252d089eb6f8051b9e0dff2f794ee9cb7c1961107a6def2d77a0ff186bd859d8e041e08b10c32aa6e3942da1044391c3482d2810fbf5bf35ad9b6cbd83aecdab570399b6f37f6de629bb6ee70cb2e6011779602d312225f400a6344be0b3c5c1969ab369154580ab493e2b7ce4db896fba6d972a015133e8e3061e1a1190d79d2e13c858d2515098bc9db4f431d0f8c03d888c1a67c4525f79ce9bbf127c5dbfc1a49163c4778e758417f56fad4245dc1fee27b8a1acbc4f79316d6518c405cb8ab3f21590cd9af6044dfcdd66382d8794b1914114e77ef01d31db701a49ab6e9df627e5f9c509f713b5493d542e20abb19b8ec9a014bec8e7ef71aa5700db404be165de1571f187771b983bfacf5b9d2539049eb8f6862bc914a2bd78ca3a00c3ab88d91c4de99225aaa48e8d8d58cd19d0b17159b55281355021b5c631d9e91ca0e86dd76cdcdf4ac66469a0b6a4417a2d9f4458632ee5fd33bea858323f2544ae2f6783ed980115e270b6c2ba26f709428ff864d4d44b553ae83506281b8959698746fb496d0484fa5773fd89a54cd4c98a862c078ca76f27daa0c7e5b7f6ebd68a42b778642b42111e8669cef9e8631bdd4e59acaa464f9ef29c772098ded8ca88d95c6a3bd36e3f3c538f201aad72daeb5eddfc16f3cbba204a78861b3f1c31a0d6d9d0b6c53acbec84166ed41601cfc8e80684fe1e7b50079e8f090f973238c66c23fbef087899cbe2b0512b1a65c16606f77ce0be2df227434900e5fba81673aa42ec2cf0a2bd24c89fa97bfacb6a6a445f05d1cc4503a3aed72637f732aaa1aa687bad0dcfd92dae3f0f816a4ef9cd6f453be9dda3ba1d6a33d0c2f6716314a2050fe058f5c1f27a9a7e303e8eb5e06aae5297916f47af2e51021b2abe4d1f33b1543d5e0a7a32973162ec8ef6d31d5e4367342fbd8b74a3dda0e599756157951d2bec7c122c3b99c20967f80970a935f3c0b3d8cbad9bdf152b946254f46a59d3bc24bac6064efdf385c646f466d6876c326bb09fecb3e94000bd6b8b803d5a54690e65070f04de124871076fe12c71962bf707a984018b07e87e99bf9804ccb8bbc14ce58e476135c39e641ce5e66a3c819877c97a24eba1b2c61e4ff0afb97a08d98cdd9969959c72c260363ee4c571f63c477a2d564b3d0317e2e8b718925ae0eb3126a0097184fd1e2cf3b4b2b7fa22265f3329a671fe6cbf792d045a366ca70594d2d49685c63223d7125b117f5388e0572e26e05bd796dd45189d43470d8341ae7761336ecbf035a588885d450158b74d66d7797fb0702f0f740a03913cf83112d2dad1520375b5a8a35e30375434e56c6398a200d9757d88546831e2c6851e57769c8a74c0f41afcc2c9e3f208b34086aa0ea4760d365e036e8f294df0bc448deee5ec5bfcf144104bae6f2213584d47ad382438519c9497891aedddab64d68ae010ca78651173a1c69c3a2463b319682a07142c9785c79ae928fc7e3b5aa08ea94a6ba011cf043d323e8794331ab220ef411110424543cc610c10dd26dfef937c9a7639a2645bca4a83813bb208a8eb6159a4fa73129e58cf8e6f6bae91322f4018e1645631c6b8b67d24bcf1d4020d38cf55cff7831ba142f35abcfc7faaa569b71a8d98a6bab086846e662333d2266c048bcf2658e9b3803821760a219d0f989971614070dcd80d07d5af3468188799447ace1b927f196d24c60e1970da5cf18a18bc2ec3a986b46882f0cb40ef4e0c98b4dfaed411b7be2b287b1b19d74d6e5c66001c0de253d40d976a08eb75b83aac695dba02136c4408e9e7ada2f6a9c131b859b91191a072a11e5d36b619db6d667d3b05d1633240d8869d1f276341c38b622e3df5748ae263d187918a90a91bf2f2a33a15985285042c700ada824760cf4c8340d26254f683ad2795a74b685e22951043b9a7c2547ac0ea0c75dd8a5ae1704a63fa82f2403f1a4188640e0506a45fb8b87229cf147a245580b771b5089e663a58e942cd70e016c875fa2047fbc13a9afccd46bb192434b1870814a13ab966e7a1b0b152a4230e13dee9f30d01ddff47f9f9a074405e8b20987c695b4c6a66518cd02180e061163de852b1819f58f354d9f5afbda7b4551895ec093653f876a7ffa3a47aaec9cc36815320092bcabf678bb061c7608094f750a2c3c0dab50c617b42e1e7e43b29a86b3610d6b72c1aa0b5d918c6548c0022852b1db8b541c516e9539887f4d661ac808064026426e08473bf1e5a79640c07bcdac4ffdb8438a67480930d028d776ad98d965433fd93e94ef1061036f62d6a1ab0155620812ba66b6031568f5023f467b7e486f1236c33ca04c9eedd51111ae7e389c2d1bf38783d23347087f80718e9daf046418ef4e177fe00d232712de35efe9ddc20e28c821eacf8b30d678022f463536e042d503acb1724ccb7e0e3a75ab11244ba3277df610ff008a5448cccb835a4688623ab05d3aee5f0c4e7fd594ecaa3a00dd363b6bd42edc605891901ee8788ed438d308183a300d05e4e0531b08ab610d361ace6d45cb0549bfa4aa15e3020f656e29cdba604b03f669c62fa1580a0fdddfd26cf3a1bbc051895e45461725b653191e5ab6c0b4cdf92db3c0b13e8e56a1068c80d36969e9d6e4162a2f3fc45475c654803b808f6a1420f20506d74bc07ade80cb929575de44339181a31fa703812f8bdbae8da6a1190f388e47018880e00b79c4304209b2f04e71f633cbd9977431d7cca55a2757bd6eea04dcf314a79eea4ec7b82faec2931ec63a039b4e0fcabc5442c357cd79d26749da3e8b192363190a1181763f87ae2c0fd17d57cc5dc138fb9e6b6bf253e41514a8aa29ef2b7b7723d53224a6eab1d27c66087c617071b39485bd0dce86141f531353e44b99f69a466c19f52646cecd9faa30a6f0b7f772aaf763d09c58bbdf9c8f2eb76b1e40cc6c5f298b4176b3da9542edb89573517e83283312a682173415649aa99eef3e1eebd60a00ae08e84206744a256833a009944c04aef95da56203e73961d9d36bdd44157a3563d578541a4578c9d42b8f2fad36e7618abf010c283be459280278d826a176a63408978cb300d2003947fabc095ea582a1dd28939122d999d0fdc9a87effea2bb811ccd600edf29fb87ba0c3bea4cfacb9eae1001b6128a7e5996261e6e34b1860b5f4a5d471de08bfc66ef5691ce41b360b673569d81c52bc70b8a27e90f140954cbef785d709b7dab37ea540799639749563b9a5f68fdb18862add0269ac12594d1e83fb3b5370f64d4d2aa65469357da3e1244297c1aa9127fdf18cb5cd9caef1afc0d1f18685a0c630c00f71679968b6600c9ac5a3c5d15d38566b915224a3198aae319ccb328bc34bbc6141808e21603a7c0c14737b129b1f90356ef45a47a1f1e6c4dc1be891d65d9211997ea8300161d17bbc4839e87080bfcdb0ede996d642b6f9b43503a50690527142419060d9e32dfed10e5d19c54ba82e1d9411f3207613b42945dfa877dff9f0e7153602714278cc4f04769d73a7dd41eb5b686d4cb26b8010836755eaaa5de361e7d841f01884090798bdc1d071e6fb6535f69b94672ef447bedef566c41034c11e3bc703c3251f41e22dc5ff457cd762117b6b5b3047ae8543e8e71bdea4d515008956d099612bd321f2528dec9a380f097d27ff767240c04829af45b718e6813fe3ecc2f2f5b9d5df7e239b6768dc00c2c91484dd5364864d3a5a6c91fdc2b0db938c6f9f1c37949cfcef4f89a80b03417bd7b917c3f37dd0e5c4f80061581860e01e6853bc2801e033f68ba0a4f8c45d2a8186869f9e4e25c84fdd852e6a8892aabcfb3fc8444fb731f2c2827e6644386364999a489908a5aa2ef7b2e780f756f2c391b06c8dd1597612f38c86da9f1c8b48cae3dce436d3c909a4a5e03d45437e3b06a703432d5c404a50591fc6de86131bd2d4e5ef72907c16321975d5eb507513fe3d9a830a12ed50c1e3be6abc7cbc62d837485a9413284cbd01baf31fde0a58e265f0783b00b5c230dfddc131d4e1d3a9a68628ff5e1358fb326f8080023f5ed455d30ca724fa50132f8de26fd97acedd606f5d8cef75dbd14eba6e89541573342b131bc52118e2edfce86057f5bc0b1362c508b6bc31139bc7817d891b93debd36e5543fe312b4cd55f07c5906379c39265e017570771d75758a69c50673ba8eb29af674d11fed3a0ad965a2521882f427928070faed159d350e18377e34cdb1804a4d4afc5cd5a6003155c98fe22a145b6b56efeb7098d217d9e3c199ded251aa871c57bbfdc3c6a5dcfc108c53aa2eca6870a820a069ec8a15f1ee5e11f6e6a08908fd8e447d727de91eecb05442aa036a420b19f6733c2e07a6c5d982e7fba8d735188c5612037d143b258ffcde265b5a07dce98ea2f2b9cc189c65cecb42f88e3d9b927a0aa0376ba7e788703ca101c7983ed987a833f563ab625da07dc155967a2534831ba7fe1357eca588e663e38893e10b5641203a3d43e191898815fad32f24b66a1f089acd5a9263f7f6d7ddd7028067fed99e4ab40730c40afd80e1b76c700103047e477a41200b30102d9ad286fd7ed12e88a6370fb061251dad661782e353b2df4f01842a1d1713c84b777d653ec3a99e0da59dc3fe66705b0e42ee870fdc67fa1467191dce9e161766a5d13ce15ebdb2b893917cd6773889e10e1d054d87e427d742060e8c9befdde8927323849fe651ab4a1f372abfa2687f80c97e0ef8943693dd34145f0216a8692078d5f3913fb8f43fb691c7626fd8f47a832501d0ef4bb0de500a7a0b46e11bb237ec09c4c6bccd2f84c0566fee19c6c63f1248f953e9d1fed6d4f075652d2fb147067bae636179e953bba075390c817fa803f99dc513d916f780a218684ee5cd1b7c5e1c4367a5592f3ee2dd1ec11b10cd2b10a07b9a10352c98b6d42d256c76c65d6ed11c9cc6b7becff1671dd923935f59016d6731444a5072c94a8818b8d4b9c80a630cf44e8c8819e0c61f9ec42d94d4cefd0eb3b33b3f443fea84c832c1d1108238c8aa4028ced2674e57afb094fdc4ae40849af56acd688fd41818f988418e9e52e781bc5990bcdf84edcbf1581fa1848dd98c24323e0e351052977efb85c4e1f222da17173d06da60325f095234241f8f599784b74d3a782d417812666d1a0e3dad05897080380940c56e6b9bb0a28f15c1bafe1a51d4874f94dbb1f9e710cd3df67d8faf8688e1aade3980432b03894a484c68b6509ea5251e22079a6f1175eda4267194ae59cadc9799a48667558661228825fca8667a799a5fb794ae9904ce28697a1e9e7f84761ae03de591e9a601d08b9d92d144d61308a5fe2501d71b514a0e633ca5cac0317a21bdc8447abf7cf3117f81e921b5189b86d227d310647a15904ae601c8737c44dcd8f68cff63a93936f7ff3fe9de098d479dedcaf202abdb5268cf6cfc619ba64a69950291565a209a9b141984c270472fee4ec4d352a3da13176e33dba7df7c11931fbc756e3f11d8b59ef4433d70a56d238a7f8301dd2d95f1f7b9164f63c8e1837fff508bd31ebada211036fd0180b9789e9d4c44546af24f15e9f9a4423a6c01033cd108f413b28c67a4551220226e864a2c8127249aa573227648f0f3c63d11e42188622fd5295d91a04fb801915a65a5a4d0fa6292674b519c9e1605dc4bf1238d4c610c9844ea0d2853184b412f78409416dbbce02c7d7367042377bec31cca4376fe2e245136f9d004080d1e06886a85ef6965d2fa41f6e094028a2e2a74d50de4247a5dc825460ba767ac35efdae13ddace13718be8deae1d7ab9531ce229db67b5c3a000d4b97604856e36d7e6fe1ffee72dc1f6289de36f8e4ef9453f937e6f1ec38fab9098261e74d11898af14d917af563b567e9787ead8aaa0404a69029f51c5dc85862cb34ecb96ff07c93f633c053ddf949d04c2ecd29cc521a1205a6111b2bc096d0c9289e01f307a551a68495a81b6b5f7926e71cf05240bdd2cd83cae762b7fa0257738aaa9a7e856f96841c871a9e92a1529482238742218e4a35175a8514b0f126d426ba5109db2b4af27ccfa6152a6e6cb80a6b05e819d63646001bbc41a3238c739da046908c7498449b1964b5ff1e0156072c73295908246013685b559745184f3607a9378817100755134787ac3166b9b8032505402496d89312278ad888be802287451359738e504bbd9302ab4a263d98963584bd6358101151a21890945f3f8fcb4655cc2c5749fc1c627ac8218981ab7053353688298e3efd58c023c5a198180505d9f4d940b8a22f23f5712753c44f11683c626002e83920876f85f14588e2f1ea1c70fe9c92e8e2f658212f8e4717e48c74e1637490c169c06d67ea358bd4aa22881dec2bb7de24312eb548979e59ffdfd3adcab481fcce63b4435f0b87cf29238412043a843eb583b4b9fd0e14810a4bf517c6a702c1a39ddc403bfed489896e224106550095c0e032a0ea6695b30ce424a070a8297257e65b50af8a407ecadd36105c916d561852fb6ac1e1c85acd187dab45a91ac3d50a0047558db2b00054018c63a00b21691b1293715a2dafee424915dd0459c5c6d7d4c6c24641349c8de9b1029a59449ca149f06c4061f0650a4aef8fe150411223043313049528317322aa882498f0c23cbbf4664f9ada005c9d7cafd11c12167b93f223348135c2f26e538c6735032b089422f8e8302151286a61953048da012102415c53c47fd1cb04776ef38f465772382b42f7b2c007bea4ff915a7405f4e2125fbf28552a05fdfd6f9f15d1ab89034495e9492e127dd88e0e54604f9f443803d9d9c4331d61b32555286aefad407f141fde923d79b8f90fd1bc2f6d9671805ceb39ed53bde2139bb822fc764f8b5c967bcb479b9aadc6ff6b3edb32dc337f14f5e1c073e7713e1a7706c128de0cf20f3b7cc3ef71c4661f5f6bb67e3ea73df3dd947bc23b69eb5fad6f7e653df081629b9a13fd4d3fa6c7641e2fba8fef4fe417c509f7a7f134410ca5e7bd58b20b4fddd7c563ef5b90781c83ea7bd7d0edfc8b7490281e3c05f75ed3833309556b74486cfea6e2896a50c7f5e97e304390166134c081242086f42109f1b1150af7a1546217b54fc203e3722a850d8b88f78c77cf9abaf9fadbe379f8d8badba9bf8433df633a91221f3d95ef5d2c7e7e2c637fe29dc8ed3bdcd50dd8d63103a6a70c2616cd71e87e0a7708766b450641d330b7c2b187d2a3c597d5995e023cac106a6167c44357c44485be837c48b0e2b264a579f0c5cb8708971798df182a231b4201a406ea63148308695dfbadbe163281923c98baca33b54006cc0144c6170891900e6b8170174752500489498881183441163c4608c17ec18474473ce39d17481030ac8605a92c406ff624d9ab9660c2340c8356528d39a33445640fcbfd4b0a0082a5d4a17e342bcaed695fe4491268850355aa8b8acbec9708d18355dacaca8c16105354d86ac82500325cbdc4c6a76b002c62406115318659098c4a8e2673c1ac1345ec2a8020619309aa694524a29a594144bf970e21ff97ec25096f651b4b68e4a5b079dad63b68ed838e8f7a8d4849a51f361afaa5cd4f70f54447da456fad6c33ec49e853fb447be96584c086b63afd71052be5e37f1e1fb13545e54babb276e4927f662797bedb1b73d7ca0582621967fb447bdf434ecc5b2f6ae6771901371b2ec05e3f6d773701fdfc579da57eff3b6614feb3c10f24f7d7ba3b421ebd72a078a573c5cfb5e8f892d06f6e5bbd4e6e2c51c3911677eb5f65e97eb1fc790726ce188b3e44a747eadb5d65a2b5025a1c3e4da61605127a5b3693ab27fd97cabbebf67b4bedff58ec2df4199f1acd6b5f918ffbae273accea6fb088bb07fcf3163f5f17b43d988537fd5dd584e84d54f751388b0fa5be741f701088d6327e2d48728dc1156232bce1eb2fade79f0a636ee8afb36d5c1b4fab07e561fdb08abd8bbb0c69ab4d1070863749772cece7bed58dd701baf70b88d3d4b573ddcfe996abb45cd33899aa7f6efee6e1cbbbd3d1064e9a82f62b02515d2286b4ca1bc5a22757cb524dea823bc6ca0d0fadf883057e3e82fe12605c996666bad926648524a4f8b2f78b06a72e1775bb865b5c4cb40870b7f28cbaab964b9f2e1c25f2d01da4922fb53e4691d5bea3d58ce20e6d0ea8cf6ed08ae7751efae98c7978f10808902c62803c53e88b0d4751cb89d60de76767854a7da8aad9594ebc15059672225fb44be47f5ce7323c3de679403edf8102ac1d1132a19a8c3e413ea8455cd05ee4418fcf642afd8a53c3d58f6c071e68ee370605cf95c0c2ec7c5f5a012a824cedaa462287e13f1f5a6db11d6c45d71e77be0b3fae16a60031d105242f4e263afbff8b683e22059450325dc153746575e295daf9b4a088a3a9e4d22527a12753ca01d1e88819a4b863ca080cc980cd463a806b6676660e1523dc2d33838d819e1e504e895e7cc81bd96bc9437b21514e83d6917d28bfe16d2e841327a9173ceee7e971f757dcfddbd760c36e75c2dc964756fc19933bfc81a7e002184b0fc01502c43f885a7c364b8d361e24e8fe931123a113b39feb4f63be75b4193e28e1fa5843d5351ee5838a5c862cd25c71132fc160af257ce8e1d189d2f63c7d85cb01b713cdfa394d29ffddebe5ab29a72e15b91c9397b7effb417e479be941a5831b9f0e5ccd3218470554392975186bb7becd88d3bc2908a98bc6882094d1a26341f13185c9862806595443a31862906494c5f34317db1c4f48512a62fbcdcc80aa385bbe088cd10de4516b984f4a552917911a57a71e48590ecdd975ca43c23c585db3ac345f6ee7fab2254b8904352131fbcac69eaa2897566880f938a2776104306055300c1c4b9e002c686c8431738acba9882449a694aa3eaa285244c67983833c497638ced124e68bf6db41fed4b7b5d52c7bee7ef31c279436679447ce949f9235747ae94508b253c30715186852423883035c960668b2898cc6c81b0bb1b0617ffccd7fe64066ec0612f96e75d8ab13140394039310d56a04e0dfefc53e779f6ebd32f41d2904df7ba3c3d05cac9da7b4039f9beeabd58aedafded3d99ebaf3ad7d681f63f177bb06e3fb4ac3d5cf21c35a084df65a09c7c7a15f66299fe26cdc00db4d367589a69caa8ae27cdd3f6c872c5d20c5400852ef85222acc9059c68a28958d21250c4980086a430455da0146599fb831226620f4a2c45727ccd3fa6f97a40e3ea5890524af93dbf7ba253c0e565155d9752ce3f61c2333d6491bdcb4399ecdf8a685ef31b4b396128f7d04981a11cfd67d7ed3817c7ff04f8f15945b77bbac7bbd9bb47e947fe09127f4000193e7c8f2d64b05128fb8f3ae11fd49f3094dbbec7e9ee1f5da22aa5734ae91e516f1f66d457cf4af9bdfdc8d991e0ed84cd1de1d2dd796022bb5fe1727f3c60c9de7d120439819a29565012c5902b7ae60b575817c0309f48817a6282d3132df70995d493271a2bf7c7030f2716b82c4f6070159973cea9c5cd13158a70c13b3479ede0020d3433a40a6ce4cb2edc101db66c9f0e59e694ce6171fae40b1e60d0c85c21c361e998c5ee873fc4eecabcfb917fe5cfadc784f827bee31efe43792843bfe9111f7af7c37ffc7fe47b7c19dfbb15c9d0418a932ddc115c124e8c707285bb42c689152754382dd7fbec9eeb5f1f731d7bb57b23cc65d7248b9326d9eb1cbee4f81300414c8e5fb8ef7a3d467660033c2fb9222ea51889ebfdc776f88ab0c82171e3c7288378bd8890f26584152b56ac5881dc14215a6092e4c381480997246ff0426e1912bb60fa7248fa702882a3225df872c0d202e74300727f3740714313b01d42d83129b7b50c5bce0ae7434ee976b76333b118f783b5b1d78b8b22e56b882db82162bc32c6418971505ef3ca778314ce09e7c4d61ef4bd03215a67663ab23b6e10bba3edee28866c1c9186ac5556dca8433de9c39f7e8feb7137a8743a468f113edc20160ea3437777e9442474242489048f7477777777775397dd4d47907147dc1177c41d7147dc1177c41dc949ab3d592f72d26aeb52536c2227ad141a2d35c949e7929c121a49f77a4cfc18e35a80fdd17af96a20f3c2edcf86a2ecb9d24c2bdf92344b60e05cb8fdd510e6aba1e8abc1cbb704e9643924b59b4ee9dd6dadad30c769773ff549466f5d7921d13d6548742d47742b4774294774274774658644d73344e2886ecc9c0cb99f23ba9023ba9da18cced13069d53824dc0c969b417aee1cd207f28d22811d3821f453b284915519dc928eed9c92db0f6310990adc921bbfb364c9f22591c2d9c0d5c025e168e090704c38261c124480122c49bae4de864897d2b923d73ae18caee3f02f2ef7978448a6b9bf244ab2f7b11844c615b9fd1d61108a1923a60c193163c4c018dda59c517329e7a4b45a69ad4768a53629add5da53b5f67442a132ab9d50a82cd3b46dee78a669db964aa976342d95ca72a5e418d7ac8930c4a23551c89a345eba8809d3c54b9725a09424c8042a899ea64c990e781c44d930467729278cee52ce49e5a4b4566b4fd59e4e285496699bdc368f7043659ab66da9946a4ba954f7ae561c4bb2581e218b63b55a3366d8d8d0704997cb237479c6b1bc1b2e9751660f1361f125160e863b2347230590f1006e0532c820e345462c167385713df79764489a1b737f4954807d4984d050468cd210c60b3224191d51a59a185c2df747c3162b3068c0e24661c48b1ca7ffaf1625f161ff826191f2e7a4814a9ef35b3388716fee8f8626301a94b857244b9020512fbea8b57a377eadb5d6a326f32869ce537763abd65a8d64548e86c8b5e29672fe112fb840e305748224c31c6199474718a974d29929a52b2f2ea53c90d29c4e9405244228122231a089e2cc99339f9190efc8d1aac988153ea3205c5899f98c94649bfb3332e2628b2d60e852648c4bc7ff0530b8a8dcdf91a2cce388bb4dee2f86158c8c91bd8f51b994b6e052fa25e274e661c44816997e46ba806145260b1768f1d222a605fd8a50f95ee072451543b09882088baf481443b0f88a28916beeafc812122b58c1eb958594af17aae4069355fd8ab63f17c4c01cf667db1bf9469c7eef95e7742d71234ec48938d1bd78846672cbac236d30f3c6ed5a1e585af383184bce2435492167d42cf1ebbaad7bbd8c21da102b66b8d726f7d7c208b277dfc3985f5cbacb26315c973752767777775f317153b9bf1688889167ee8fc8172dc83c28120b4941a95fe90708a83f6212327c1e998d3a314208218410769089875aacc00401853659a1070e9411c50a4c404cb9820227e32382e62352c547c489584c096b63afd71252bec084e04c1127c860c11447486a7a380d99e264c80da72b880c9901f5114182099821456c0cdf1cb2c2494a39a4c2932754b0040c3151a270315ab0a189e10b9bea4a95942ad99d6094d1c62115741508c124155b53be9459d24f7536986eeab5574af5bda554291ce4794edc38e06b56e669bffa03bd684725067af9b881a50b2c3c05bd05d65a6b6db5d6fec96df6a7afdda9d657a5f3344fa713a55e6c761973565447c26b7624bcf24f7ddaa355713bc226be2fb85c5358ebbadf94a45c737f4010f1019104c45234024249f65cd948f60f88a2ec53ce8f9133733d17911244faa884c9fd4d29931990fb9b5244b62f1b2137e6c2af76622fc827982bbfe95e1080f8c00d609e58b27c2a32aade666ffff4f6df03403e65b09c412c27bbb277f3ac3625552a77f7aed27c9a79ab9175f46dd853f6bd59fa277bbaa175debdd6c57ceab40ebe40bb5dcb0583ebddc8fefe5c992b1f45bf5a7b0af25c2355a2d6d367bd59b97da4df4e6d84d15684a1f08db079b21d902bd32869bf3c8b918925ce8aebf5121e788eebd58349d7e096ca54dfbf5aad56abd5bd57bbf75e6c236cf5da6ad5a55ed57940afbcfa5476efea5330954aad520fe14fcd6608c3dd67177b37ba56bf86bdfbdaea765e4ebe9f454deb3ac2b6ce1bcadbfbb6635b69aae789dd59d505c59cd29ec733cd058d727c14f66299ebe2f6630f30acd8bbd7f5d9832bb85128c21b7fd538343477292b92cdffa620e5fa59477c02cc6e82fc0a3bc0417aa0829800adc8f33d667f6f6ec9368672c8f379b41579625b3df8d65ffb8c4637dfa6f38eb544ae7fe3c3bf7e8daf3b5c3fbbfed67cffd30f4b26d74f294ccede77b8debb193fbb54378ed3c7ed87cd7eeba03eeb6dc7fa55f793fdea55cf7537aeef6cf3f2beec6e5c4fe33ba39e27d6785477e323fb1a9f7d0d7ce3c23c8632f7373e68fc7d1a7fff7e6f200c813d45dd0bf0e6d3b7f1d63e8d8e7b9b8efb199db7bdfd56f7b3face70fb5159d8cbde72ddebc7fec5aaceb3dffd6c58c371e351df6239fdd494ed07d17cfa20a71f704c768cf23f75d5e04681a12d19d8af5b05e4d76e3301661e12cbf7548e2a8b294f32fcfe9c750643f9bd839e63e909651efd9927c66e58fff401fd514acc2f03dddd5db624f660f56fd95936d9ee831b619e33681c1184fbc4ed805b1bc990e988d3efc5a453118549fedc5fd21818722cf7e70315790a91529a0c977cacf55a8c0f54f6feb975507ffa74f6366adbbddeca1b1116612d145cf831ebb59811b284deb55a4dd6afe865ae5afdfd3b9fd33047c5f57a27cfa0995b6ff3f37d8070347e6acfe9708fea5c9c1457fbce3fb49f6183ed8da833036b11c67db99d35ac3d8daea306ab4efbdb69afd23ef559b39dd5b0977d76b136b92859b837578882f00a8428d4671095bd77267486511d09b1ec81907f50281484afc51c37c70ab6ea6ee7eab82b6efc93f75a6731a2b20c6f518ec0dddd1dba15ae03808912852b7250c8a069bd0a0e0a87fe428408099a0228a38c32285cca523772bbd6d50c624f52e903dfa23e850c3bcf33fdecadf571c7d766f82773f9f4277bd4f6d0379e08bb8be55b9b5189fa299fc2f7a14cb2373f2866e8b252ea13752644f2fc23e5f6c38bd00866ef9d9e52ec41239ae1a0982b0e8ade0953eaf9b0123ef51b1f580437904fb1b7faf9a9ad03ead4ca15be964a6debc08399f559ca59d67596524ac71216655a7f72bfcd5775d40706450b2d0aff54dcca2fc00dc478411166f8473e7df870c64cded4df7e3e7c016e607fa2366c83e9067986ef0579ce7efee9b98e6616fa48232973a5380538948ab7083459cbf067931fb2640d727f3f10e52fca972f8a942f4a1639cb5a137cb58e55ac5c8b83771c994275f1e3fbdcd8705dcf32ed743a9d7e506d4f274daba13d0aba97599c612f66ed79a243afc764eeee1bf680724e1e500e508ebfe79ae7d893990e09a530a187c2946bb2473f28fed87c0ad93bcfb3e7d36c89267b1ecc27fce3ffe3f4adfaf4332f28be4db669ca144a31e64ef1c48c12627607629a6dea7b403915fed2db3c4f84152e798ebf99eadb736c8faa814f18b573833d1a36b077371ad806f798efb20cdcc01fe293db60f26c34e5fa36afda7e6879feac35b00a6fb8c6d370612387efc2aaf9a9ad03f83f27bcfd06e7fc0cd7c0d3df4503ab20f6366ddb519be44c9b547377b7794f9699befa56577fa61ea2fe761e8da63b46f03d1a59ca57ebc87ec7739400778ca0914be8c5b2c8a7f9f014ad63470638436b711493c18a188e9c032d535690440f4110b12099f848004613231d8a66acb999a1e6c83d3ef411790c65c923c6f8fe73f39101dca3cb3ff2e39c3dde6560956195915d8cdddd79da74970b76ad8b95820b83cc00b7655680eb8a10464c800b1d90bd6e4b2a298b8a3b803b3fc0b2addc2e4dc603e6bf02b82d030080ecc625528299ca4b1255728c33cb1b11a60d71bd9be9a414c23259bf721075d4c0e18473ce39ad7cf8ac2de8a413021591ddd8b8fd4dddddddff068c75e5c6bf60352e5493b9680861f39a115dae16908c7573727f5bd4e40640d66d571d88a91261bd054d8699e504abcbf55e8b451df81c441da9434e8645a27bcc713deb56461dc73765726719871c8e0021acf5371f2290b0635c92c147e24bee6fe94bcec9fd2ddd907beb4131779b275bdd6f4b97dcdf1964577553774e9ff7fd1d4389d92d4e5d22a5faa7b7a7fab075e4572225182bc5371e91c8b64ba424e7e3ac2304a44a62ed7a0a104a20eb97b41166352a6e76eb13294dfa9e45f56bde8830d6951b1f4ed8058152bacb78bab1c842c603667bd36911561f621bc4f56c9e1ebb2030cf9f58ca3cbd5e22a5d3b797d6a17fbaa88e48c967fe78828c5e22a548a4d44fe45dd9bc2da5b57e89945c51036f55b93109870a48e249ee2f09a404645884f9b3ccdcd91143f992c09263d71f12594089b7878c07ccf076cd78c0dcd77f86b3848041ea3249ca1e88c9f14750eacf86a51c3f272a6914bbec2bc9f5097f7ee2dbd09d4e133c845bdcf6e08b20c32c9bcef97537713dfb232b9dd2e3b7254b96475a584068d14205c5dd529453b93f2d6932fc8b638c2ebf2d4abe2d49bd45d6316b5712160cd165c81114302748a2a585d409f2a90a25b47c56b450e9268e60e08485121ce9e1090d478a6eee4f4b122d50583a34118bd5606decf55a22e54b22e111030e77f0da9425181009243740118394263c44c182448b90164e2d50e2083259d4b09e201d9186a5244b982c4e2489257925c9f2c4882b2c24324b9521ac19b21891e50a13d2d151dfd022c410c1855106546022c69721964441869ca188324762f88c3032e28531b1d8116b63468cc45eaf16a47cc5622c2231160c4454898188248a8860c20516d196fb2362055995fb23028a21d00c51c42ad22cb04244c46201cb523ee5feb094a93283dfa8ac551f3b2125205a96c5cffe8481a4deb110fcb791c4a5f73a4e7df928ec9f451a6f33e369fc8c175202d282f0e503812f3110970b8380859480d83cc44231c7a96ff334b04d7d88637d54976d9d8685944e2fa43dea4f1888ea535848f5f021d6b050098ef3424a110b41218e533fc346f121168a580862210d384e7ded85fec6562c4e08ebbba772df3db03e8fabbaeeb11dab135202923d8785604ff6aa5f75b7434109888651d0de46121852719c5adfc677310a424a2174cf7cfadd83c228ccef1e0f52c95a7c68254dae91fbbb62946f40a01f42f7d01701f6744fbf2afe81aa218f35ca8b3524c61af292afaf0a99ecc9afca98dc5f9530d915615f9534d248d6315371617bba474a4359ca0207d9dc208375d27bd596eba3853f3be951f2c428a5f4f8509a10811861d73534954d7936e9a7cda5b9b249862ccb7a831d3b9f0883f2c37cece677076fe243a30c97324fccda876e3b409027359a734a23298da6d194b20c29647ee8e20579403965729466be2a4b7c4264914db2e95bad0883306b272e8a7b7a4fcb3638155c0981a2ef8910880f8d3298b5ed4388bfe1a1ce83a79ff5ed5046751d263b6d7de4a23bc2e84395fbdddb3f3e14b5ea40f99dc4ef82348a91157b5ab61038fdcfd3a9b38ec3b9e07a9f1f4258bd72545c1efb1378797aff0ca24b8a0bbfe73bb60eb1065eaa102f4d0e85b23f97820b73075aa65d2bc22614f2b984a098e346e9dd0d17b7c5f53e4cd4e1711ccd2d0ac2f71e429e30b784088baffd4ed676c0f6e272b9bcf0407b4fd873b9fe274e1303c10ef7a404473b318784488d233e87c56d7d61adcb45a5a84fe9b40f696fb452987f24b65a0b4248c9f255b17e8fd60133fc0a27c0d33a60eb805efda93a9207fe7cfa19abb31b7723ead02679fe8d0ffbf45b3fb9a79d67dfa39faab69333deb34f8358caf36b105472f6967bdbddbf1175288638acc5de90f65ad98d7b966dfd8ccea3ef2d7cc3fd8d0fd6f69b7d7f9b6775abe73a1e4379856ff7a3c29d4f58c394bed63a4e8079be46bf5afb755a5b6d09d956ab816c6d954f3f3b6d1ef0bcd638e68e1e8d037e0a70a815ed9053a675f0ab943248f6928c40062353fc785f55b70ce5eed8ab3f5ff5aefafb1d9ccca864ee3575b1648a6804002080025315000018100a07040281582496e7f2607b14000b8192446e4c984b23518ec328888118864188010411638c310620a214446523001eb7b4fdf10f17f478cccd66d1d77385536c88af37c2501c714f2b79a5707a39275acdd837d656f15c4d258dfb8ed2215ecfe7e237cecc421f8a4cba2d897a9b2db36d29530c9c3e96f4c6c6759ff9676f7ee5ca9c77aefc8f85f29087dd4be576d52b062bc9d6c608f4b65341d88f80db18fc277daa0d6f5bfd148b6c04a222265b2a08a32563365034909a7f03ace71063e5170229b0c4337f100a20b0192a35b4bdde92bf251c3d4dd345dd854d290f5e80a7554ccd8cc96cf6e025989cb86aedf5844037b8df3ee5b15343f8157a5698afd32b158d1e149fcb8c4e510fc4036d82e8799ba0b23957b62caeb1e7a47575c208b76a84644f54c292a479a736b618d173d599a96e08956b9e065dc24e3c610600bf69dc01b6cb53fd1a008ee649fcf292833da048795af2e441a852e0cc37e11b79135535bf4446fa5ec54a8ecaaa237944af28c25e2d1b0ff3345674b4c60df55a3b9f23aa021a3a643b5f6fa971b10f001e3b975b50b5cf69e470af54a13f9655075fc510a5918a3f9a3defdd49783e01d0ea37cac8aef28e8fd9ea79a1d96362737e5b861186fe0f93f4b1e89f756755d900a4f4e38502c1b26d47b34efb26bbb7011eded0c41a0bc802a81f0880ea65c2a5c02b5a96b1c4259ee760f3a26f9a8b0372cc70c9ad77ff445971b588bd6588cbc01af06d08a0f60b7368a7a9190e36c19353cde6b33263ca11f81ae380e91b3f1122556a7a463207a494e8512fd0572dcd8ee0fb695c2f8e26302ab27055a36fa3a84846e3c9e2d6bad9565693a6552753400c628d2a05fa18fa86c7f38e2ab26b7ea8f883a8515136c28593931a440be56730e2a32f5f4d16944fa7617d6a32b5e139c617d013c6d11f22cb50fd202e818093bc621d95f7e3c57e7d34751f592ed44c1d2213399120eed5e872c165be09b223e63737d83fe9b97c7d54467d6979b0d34105ec040ac5118bc9bf97fd8fee5d25b2f433b4a1877ad34f3e502094e27db5e16a003534d1edbe0be84bfe660c2b65640eb468c73a5e48069d602e867e13593045258401a5aa9d63e563a9b6aac38bf6282539961362d222a78390ff60325a3712232f82f3018a883a01fa6a9553eedfbd3f4a166589724bc7b4486ecda478258543a45500efc6d2c73b21fa6c7cac925da1b2f83754d6604454d62eabf73bc4a1d752c4e2d30b02ff6fb57da51e9c3b8e839e98b0fa5630e0525e5b793def8d8ba3469dd32c9e364a805a3ad29ccd426bfbff3e3c6ef711472fb1e342d9431a0df7fee6617ae041f86f1b1322267fad2631d3e983757022c3e042710ba99a6b12b6e939a9e85580e171eac5002f185faf71b7d40a77582d2e7c6de181e330659349b96fe0e5d01c47641ac50177a5bb9e1c8ab767853291e22d9916bf535da50be44ac862b5a8e8a99323ea770fd431d6a05ef0d69ffda15c8be9a5021a1186f535dd2e3408dcce4750734919682b9aaaedb52cb1b0649885d1b6691c883b1c7dfb7da59ff731721f06bee9a21e90bd2f6e0c021f87fcb97d623232652e83e74ed87f4d7e6d99ef1d2da2f51331064b4438a3d4246a01d34f28d4fe4a50e2c932d3a92c9574327fd0e2f6566f3c3a42000d179d8e9c3ac091c9362440de12d4d1f12579c091e9d993efcbe205f4d7f434fc33b5a88966d330ed5c999e80bc6c4983caa08e83aaee7b768345712aabb39b04d211b74345790a2b1d369c59cf12e5117834502630e4e9c1cf5dbd5b8bebe1bd7027777cd1011d3e4e07b2cfddaee4e71406de19ab6e3c9894702c4dcacf020b361d85c125215df490e11584f25aa570d374cdbfc7596322e4c0adb73798ce352bf7b0eb4c47a9a80618dee70bbeeaf87d16c5687c1e80eee4f0c24f8be334f36ea8c0477da89f75fac14bdfe640cf7fb4ff3411e1a76aac885fa72060c485e2a37280a336bccbb02e37d9717a5aba8dc4d6d757fe299ccc4ffced1fae26426d4b97e554cd33222c113606f54ed47f059ae6ea2c5ff536940edce31a462f33bf00423acbfae1d0439d2da97ccaecfb7623ad914a5fc2e48af7fa913a79a9881b1c9f2869d0bbc1b52161a7da7ace6928f6f0baa9a7b882703e863776b71b4af33328593450b668b730cdda1c52772baf000fa2e433002ab0f1252ac730122352e30cbd62a04628c91506b13ca2725141eddd1825ebd31af5d78438bfb75b8554335613d661ecb548fff197b3dc3f47f608575356ec524c0172f3e1e7390aac0509de8b0ce35292b5ae67c396a2ffa47051198723f3d48c89e7212604e93419f43de798183b003b2a7c3647d3b392c0ec108f6028ffb3e56cb4d881ccf4ccaedf264e2a84636f819f9a18ae1c7e54ff3474c7092a9375369fa0b5e9ffde8fb04cd77269adb5cb21cbe80c670c5a268075165c6c3140fde65dc9b80de1776d959f44eb89618387f9689d5b1a4cdab631e7cf46b665abdf0a6c300a9ef535d6ee6ede5569370e27d9f289ad376d4f665479e598594e4720c130c9530ba6b48467258d626027006322d207340c07931d51d4bc0b6bb18e55ac1858990b30e4ebab75ffce2e9680fa4bf1a92de2e1801449c3b9e6fc1b7f44f5bcaa7b73bd45a688cafce864a2063a5f34ca5e092a343694f1f7cbdda6fcee90f630de251091b9f361716ee51e7f03d5153322927115088a27f5647a0f5a39cde58983b2ed889eb82f57ab96fe496a353c2f32113466dd16704d6852826eb9141eb7c57a8ab7c854493e92dbf504c3a612ca7a8cbb5dec3297bec7c4b62a7c82454a1610b40442c4a95cc5996361bdad4326d25dc5c01dc2b49dbaa13938823330f3ac189986dbabf42734b7ad713afe720533f506ed51672c59d425737ba1b5c8843ac2085848057373f7a8525eb0dbc06051ef468fc82468cf8793fc724991a17716094b0dee47eb6fb08711441f7454101a1522652e6d0393233eff8ff7ddc8af43fc336e5c6e8e92636a00088c15d8d07afa8d6b15c39c439afa7f7c5dcb660ffea279d1da1fe0fc214988d9fd3b1677d00f4469af312bc075f9ad261dda59df60ce6fce10c3381982a26bb9ec8968697b084dbd580b0323bf063e30f41977f6c6c938015c481375a641b91ae4eab1e54b6006433c0b661ea2cc4edfd00ed856da5fe3b45efb18014c29082397c3cb833ada80fb5efedb55102b38ca449f0bcc7ccc85500c69673893241a4ca20a8c760fee6017acc22e776c2fc288c8c812ac154fdc23b8b4d5192649ae18d1ff228ae047a965e2ccf6e96ac152fabd67562c3ccbcc2a98433fe7a620e02ec5265a97174fe72890576e6ad12be4b7f85763f909c3c678882082e0ccdde6424cf865084a4b9205710fae0e79290d11122b9f2451bbab2b63fd645176ea887ba3f830ee1ed93d1f9b23f423846919851809d50f05b1c35fc20ecee2219721f350394d9c47f28e916b29c8bfc8e04d57235da84aeef03f11fc363c241d942d87276f3628c6122b2a601922e24b93f47249b3721b5eed5142d1a8df3cd8081c74997012e90b9fed577089dc6058b2899b542d824bbda0034f04dabfa1c48d0094a6ac7775e8c03bb6fbbace6f09c3b59e6e98f64c4a787839ce0cff82f6f8d2b397396f19bbb5ea857a25fe6371d10f8bd6ff011282fe82b26171dd1d80a6df81b6b01cd7130dc6a96b28829ec0c4c80db60bed90f312efb946d9eeacee0d3569cc25718b0026dcc55ae581a929aeddde62a7a5d90737a0ab69dd5ebeeb1137e3ca808b000e4e5fca055ec9500372d38208c16f559053fe4bab4959f1dbfb7da905114c2cecc59aca8d51852b1f51975972d1c48f2673308617300adfc29105440f471744958e5007f45f5f0c38ff062a6c7815269bd887c883d921762959feec521827c04b53715069b104b49375f8fb927cf49139dc977a82547f4036d8a6938df3ef0084cb9c92bc1b0d95c0e6332f998b59966cdad2a5605069ea6588ea521da2aeb0ec194a6453b9de710ce6514f6f1fee8453b5b5d2c4c852881beee816afcf23c07edbf2691dc5127145cb8ce0ee8e3a31f697a1315d0e8b0c1dbbcb54d556d1426cfb09a46befc4bb26aa76baef0346e009797bc8f3354fdeb2769523f795f8c604ce6f4c447a7bd964ae83561e0c70bd3d9619a3e2f82cd6055c784325b1b1046faf68248d7f9b1be5dd4d78a519c1b8378960966e118c42a932799b2737b5c9294f30132319891602353aee839a85096b3902ab9ea908d0a01a571295053ff4321e2be415dc8b8bcfc476a9153560adbe1de8fc7fd0212d7a19a77534ac415e588f949186b7b19eda915cfd33af144972069560005ee318983119246b9be893a0bfff711a9b22c1c458ee0a99ed9fa594de56bcc1592e422a7ad39f111d302b1b1b3c7e4fca715f17ffe00fda73b9e42ef0c7d31c2e648a9f28c1928b7a926a6bd47087057e09aaa1a398083058efe2c929f822a1f53c2818f658c4399f2400b9dc348e143992309acfc484fd9bd733a828a3227392cc176d81b9adeddb82a13fe4973fb4a5037c9c2a1e0008042bb69a3ca6fea1544ee92e41e6e5bc305e3526a438b77c8345e61bac5ad9064c2fbf23cc71dc7c7c121906296cfb7c101c67ecbc010fd824f4c2182f3c8a2dc3155531a886d7018f926e5bd2d1faf30cb6e06d6fcb589e4ad379f7229ea996ed6fb08e7aa31bf6e6ce35559ca0a1cb11c73917d6e4d8f195633c1c9b3cf68fc55432f58273941fcd23ae34f6236c23896402b464b4cc6c79d61157404b487a83e2947c5eb70b031b20db0cd1be5d9c3ec074e4cec262901bb5b7ba84482c3c16776efaca3d0bc4d53e6cd28be0eb66215a2bf6e47d020fefea1b1c42ba59e505704f3d2c9e77258c86ca30d66d14c1ceddf5d77a3f562fb94db0cb8e216345f7e7811d12232ef2a44bb3603fbacb3251c7d6546d1820382922ddca2e9cc030a6eff13041f88d4fe81a814fd50b637f01000ac97deeb5f2164ea9480d29f2b082c37ef8c206543c8dbe66af1133285d0b937902d8027a041703aad19b025518271cb6bbf3161fe5aa7693be142c21adc3c3bf47e731b2116f34b9d7752e2e883bddb7db0ce6418bcd771cb4a092b304ac2b356791f9d2343d9b36c7013ac3d9151b041effac6833ec9c28a3bc7a70905310399c2d5ac4304657ffcd8048ba88e45d1be20d42936632d9e56de3d7c6d9c9e2bffd0dc4454d1c89633f3035399b3432822811de43eeb062fce263f6203f949d7c223edbab60b330e17e590288470abbb888ddef908e14c2c6e80cd40b71869ac5e0d1ad79c96eba4d98f69e62c856cb3a110270f61100ea8d2353c027acae44c10917b5427b622ec7e59f85c42947a22345339e93981122db7cac0b71048e124cca3dd4132dcae4230b735b9723d9fd87838d5c60814e83387882bcad496e4d1cdf28a364e5cdf607e256868c8fc9444d78b30d0f70062a749b0b3823605560d3adfa3d36c5af29693be2f8a2baf8c64648fbe7ac6b105dcf71599cfa10d22883b7b3859e19011016990d294e69247561d506c12a800bb5c929c223922cd423ae27db4832114e49dda0c3865b701c2329bef343d348aa1cc601389b50014af20838de9afe2895dc43c3c3ca21df4488d1a65c90d4048f6358f3eff6840df7dabc8f19e47f77e68f24fe11be4828b59906514efddf3badbaf57fa1f915c145fadef1f57a0b2ee72e31bc0956210418b15bb80b020de82cf504470f21171a264ca5708b39f4468c699efbff25f8aa4ba2a186112b701bc35bd989b6327c93c7b34c69a3810a59e29b5748682b4998a7d9f24be4e6205221a1cffd4a92c2be4e85423f186ec7626850a42d7961ac5c6b5425360ab765a0fff7dce98f19f5e29871e8137e245db07402f73591482dd2b568ae3c1812cac635631bb34d6c7e2d11219567277f815e0733d944749b08d58dc768d1f69a21b2cc16aff35a5f5ae011511d1c806afa805a6dc80356d48292626d119e7ad19e37089b7fbd87b16ce51023c66a9116a8a2252903b6686e00856a4a0f1da9acca5a2eefe4526e0770ff37d2d6eb120ad46179644aa9be339bd57e1c2748d56374d95f7abb3b3d9b5eb13fca4e53b33462990b7abacda716ff1a153c80bc67798a12ce244345b26908e93c15327eb414c955fc35bf6d2285bfd3dce578b4c08cf3190b7778a6b4a75562bd9b6529452c320b62f2590d5b08d46d515540aa5c4eca01eb1f96cba4f1274391c96c3ee958b4fba579e8ef1eddeb367b14bbe7997d8e763f6612887a8c0572a88e4327d2c42a2c04ec1c52466093455b22593a5f5ee23ec1a0bcde7510189e298110598dffcbb811a53e7528cbae093b9730df0536099e2d09f3ec4ba130c995fd7bec8c451db2d0ee4eb0f7bbd0ecc4bebca48de138bf38eee38d705a867a0468f5704b2a3afe5a46bbcec832147c8e7b298abacb757635d1478aa8cace81d55f08a312a2620b3d5303ef942193535380bb86a2cd2e007cd9c4ae024aa32c0b4ccd6e36c089535289c7650bf1e5ac6dcb079f0edd9e618e4e56c388631a80819e5d6fae619ca0c0ca430d99f4d49e02fa6ed071c121edfaf21167addc9c92ae6305260a1defbe839920b6071d1e819db7d376d620296aa1be6b58c980bec1587455c26f4f61e0ae60e52ac187bda3c511066366a351bc0f7ca3561e00198f5b5c820977b574552a527798142cf35ce9eb3e9cfc20f197a64a77d0ed7d2d5ca74998cb683d16d5ac0dbaef5363016fc9eda3aeb78aa9e99aa1a168a9b51a8cc3790276ffb091b428ea746faffdec6c04512125d5594f3964477108cbcba2291630180b5cffc8ad7192b42e1ef07fc4c5220e733110b8de5553c2a6dd41a18cc9de133218d1f935f3da8e4a4a310b9d9aa4e031680c189a14aab5b49efcc9635df73908e96cf622f49fcc8c5599546b8b5bb60a63396cd812b90aeb7691a80c1481f8c803cf4504f66491d2668d71a8f53e48a4ba66006931adb4e15c4e487c28acbaffdc428a7904b0b08e32aa2ba7e884a13391070506800ff22df0805bd357d1033db4cbff052f0bfc0481c3a1023ca810ad12618213432894a78479af027441be164db6680fb30637ca16e34cd98f71490e1935ed77605ce58f925027b9fa80d384ef190960b4940e3a4a423fd1b4892e9ce1284f208c855283567f7458929d505e0688ac9b87c408fed0b14e516d1fab0a00b686fa55d14b6f863489b2de3ef9daf90dd1d192a1e04e9cced34a7a4488c934873e608f097dffe8880070520748a217fca337699709f4d21deabd304bd20165adaed44da961709f8d44604369d86211a51dcd29a01ced7ef697c50e89464e342db8ceae111881b467cd4c9781e563df10c1dc432001f137f7a2fd3797adc1d0b655e20ce52cf122d394df623cc24b0c896247edf4af3cac6d7c9aa301c5a0c5422d94e23416d92587c57c67bf654364f4e06a89f518a4d14c8c37ec712be2e47dcf258c2e6600e2d0392c8671cfacec1f3be1e2b2c190c7a7248fc2a65a99b565a44095fa01a820c16237cac4a0b2341f1db3b8258149616a93846a5ca8adc442c99db58fe714734f8dc94df8c9ae89191847142507ddcacb0959fb16dc9c20f9859970d868d0dac5df48df230361f27726b515a07bac04f32c73994261040aa2e617cb55eb1e0a3257cbfad8004022b4656d056f6882d0ab98a030b115c4453ebbaa841d591db6a34fc267c75d2bacd1beec28a1028e49e6108b5aa8a376b42951eeb584cd8b4195bb6d88b23b6fca19745aca1c3a4725cbf9462adc93f30720b939845ab822a4dfe117a44c879c523eb7cc6ba2938c76cb52d8c6f29a7b2ed2ff61aaee040e088f96fad9614409cbb5e115f19356bb89a8785e3716b6e858dff00c15e4d250bbed912151363028f3a207c7d8beb2a30ee5a949546b1770bc4321ef81466791c753fa439d841e52c5ab0aaa2ff7f7b89a363b472a7f092c81b590d75e42e744a9242d474540eaa259082177829cae2b7622476a9cbb08222d730340a01527beaf4c32d84fb02f040500ffc07dd0360a442187d28cd4bb81b9707bc94ad9e934851d6fa143dbc6d07ce3f68851b807074992637d5aff3db1690372b8daab42e1b69202e4323551a4b94ca7af828eceb93cb457694fdd1a5d71ce5ebba1434c094d54eae815b54c7cff8c06701690f8cf35ff9440607a11f1a5edf23511b39b77a168356310e54278c8cf0b87b4a4bce59ea3355682518ee90c7428a3b2d240b588885980dc050e0c9e8017de26e76c5d4a696ce7d08c6edceb1c91f270316494a0e70dd4495049c8e89a1470c44c92115e8b566aafe00535c4ed1640469d55e9c110665e0583880ecb99644829b474059dd5bf243a0083be9b065394d831269bc2deb701af865c4b34ec69b540717223183bc78653cd479afc612ee9464f2aeb84bcfece4914e553ae556358c05de6cc0837f4740ec1d5ba6133dabb9973366a68a1d80daa19f6b9b382b24892aa326a8fa4176a00d37489a6b9019670eb200ce735d60ad902f225b6bc05ff8d5045e142c165c63b793f02023647028a59d263e7e8c9058911e400e51684912d02fd8e20f7d356086e5a0fa641b8b1d72b738ef7b24c48aebd9be865fb050ae37b6f6ed68b47a1905d7c87f4f62fefaf2c1daf9d2ac3215e6bc762b33cc1801a9428a3a0741ea45a368d3e5782c641723e1be7f2d5da02e966080b4d52c2abc42db5a50d75746a9b7e55839d859404be0c0bc4234fa3daa69834c6308c8368ebe7d992f82834aef36ea0262f56c11f010c103844e55f79f7ed8cdd49ba411a8b801c1bfc46c4c1d3d541c62c946468367b7c35d625a04df8e75bd263905c29310db08f2d443d6e7ca6113ab381367880871c603e02001a36db03c9eec3b8884626e3aa8f0ca455800dcf0b16ec0ff850bb3d88f735c89d3c5fe7dce2bac7aebb9c451cc7bc2babf15c0ad5a50d33a982f5e84b7392e6e920d883e6c6b401bf468982f5765f168f8196bbb8256bd5b44948011128ca91a5495025f031131b46c59c91c5ed12b098efbc5300d57de7e3e89b36ed07e478cc744ab30bfa2367bab7a1e2a24d6a360598f0fc4e25d4d5c8c9590c8d0885f113257f08cb3c66b434d383c8090a059ea4e59dbcfffa3036ffa8beedf7ea6cbaa4c9b65504a4de2d1fea10cfc206d1a843fe258949ff2210bb89e789a648f4cfe6f7206433047448cc135f9fe567ab54f459c8475a7c4ae2872a28ae8f0e34e1424cf3890bad75000565f91ee3387a4369c472253dba4a7fb3b69533ffcd89c2fdd938bbc0f18dfc5b2749fafd1d1e76cf2d91128dbaa9acbef69e01096fc8f8193cd9e095b1082c00ae66b9453a3b60d159b7ddb00f380fea9190eeddb4abd62cb565537147720dd7ea613069f787f02945de554c05825066f16968631858b0520e1b4e4698081e200200bd63992611f01aaf43ab115b1a377c089ec6a2f980f01ef838ae104845f16c180f9fc5037b9e31efa06e04ee822780d5b150798c4d0c6d15bd5141fb33ed00030d63195d2bc84f53f9c010a3c5fdcb2820c04b1077f09538089ede109727b2c731b9470559ef473f951b6caca0a9d1f1113c981985cf26c03df03bdc8c8aee835d658c4e056e7ccd64f0d39e94c7124f6c0f6b3822396c4c32ecf1a0d39733ffeb0b9a266d4cae33337825b30e8a7ceb317ff197baaafb68a51d5a13f50538a180a33979d55d47ce54509a1c510bf29d85e55206149b98298f449dcaf6a7365b61bcf57bf7a2bf7696ce75af165f3195ef1e6544b15ee27c0144f5fb8824febcd3b6abd3adbdc04587973c2e49e102a88d4ca4217fe1ced35d79c2a4a9d3ed207057f8328fa819c67e9f71804795062e18a217c472e8aec54fd9ca90adebd141a976c09e2a6327b906325b6c52dccafd47116cac022521888c3c2ac4121c2ebe53bceb7b15aae00823e782cd0d25b22298afba887bbff9c1de1482690b3b48af2b81dfe246a634253cd3bab738a6e8e0773e31ca1ee62db750191deff453bb4edece9f03a0b410a4df4329a4f06ffff6a4f973146be103fd41b09cb9ef2a0a60be72975e11181b2e8a1b4948975d4e65c1f443589aea17d43f2df92761e17d09b46db8c0d9ef6a00a0a464f64abfa2c526f6f0b90f920bf000e215ccf3a408e84264aef6944ace26a2798c9251a4997d5429df41bf51cf7b4c540c02992ac73ce1e3ebe8253e1fc491caf6176241c6dbba75bbcf0e884dc1ea35e2446912e2325a7a1fd28a88bfa5784bceabced2d0933a48196280adff07710d03a0bd66d2fb6bfbe6c3042365fd088937874f9bb52ff3fb47f7d86c5541a728d92337442464dbc51a87fe312a85ea8b7bf9c75fd52b87084e7f344e5f0e40bdd4b4d19d1f6dfa89add84f3601243c2797ea3ba60caa86da05bcfacf9e4e3e841b7bdf8992eae7666b88af89fc9fea357ed94d2d5cb75714430b79cbbb26b25b45f33ceeb712110456faa3f1bf65d0c98a37821c9c59f9936f3d85cfa8df2d57726efe929941033f9c9c9abadb693c3bd8f28c8eced178d750543fb8e47979cf5fb2a7b45a701b48ee7ab7d701488ab0e57ffd9018badc42e41632dffeba598c3aac501166390c1bd6f44f0e72e309625b01eec2601944ecddb6336cabfc8b6d6bbe49221088340535811ac9e4d97edec5f1035f05ebd989ca34efa7776be714c109d500a6211499e345b897142a5f32990b1d2d6f0cb6f751011123e3d1c310f20582d19c3054f325073f3374649c05a3125670e01646c996124192e1ab7bcb55d2522e182aa4046d90fe7d5e771dd9111e554982a2466a8013aa4e17529690a84618d67ba5e140ac2dea0a8112122c1da728a9686394a9c4d0909acbaae4bb6c64f9e729901c93a8beb27923b19483e38ce5cad7a5e90f530024e89b54a83459d80d019968b3d6f08cbf1480cd9a0148622daa1bb82b2e4e8717a424d33fa9f86eaec98d09df4f3b21c184261e59a71ae0022b1907e438f1261248cfd90ec18e5950f0855dc6236b5c2d948e0cb56cfbd0a7b3462a262d6650104c1af3402b95a9c657096e5c9a89fb32ca555ff079f8ac2f39c1f8ef12451af36defbaa43ed25d5a02cd9ad16b4b80a1d66b3623a4483eda09e06e71ef38be76f98f1b1c944b0457d120474136d0f89be972a9f290b915849cf20433b5ee89a65cd38c386753c570f17f8578dcad4629d20bda3c65392e98b34db8320bed93451ade9fca016088fedec33406dcdcb1ed1843266f3382ef322092c16a5f4077ee20afc07a57921661db866fcc73ddc3089f74f57284cde257998ffffab8e6e2decd8114bc8cf7c2fe5cb2af2dbb766fa55e09e90bfc9c2a5de75c3b83e99543c6fa5f14f4f97235feab494196005b1a7215279470206af03992793e5030031609e4351baf936820cfd6d952d0c023ceb3a1b857ee19b5256f34267058d26e13f03d0a8876dfcf5d5122eef2e8aa12a52923dadb0f6244c100d8222c503cc02bd007f0c4529ac681aeb128bcd38aeab2b0c4065e2372fde7661aab56ef4bbb7cf57a42ab5aedaff855e3b00385b1e8dfd740039491918aa4977c3e0cbe7fae532db6371b0f95544aac09cb8709f40bbfe9fd357ede0c3d26bfae4d4439acfb38ab5183803deb3874720f33677f97168bbc80b69b6891e12fb6014e9daf7cb3a65b916acf00272d205deef1433cd8d20f1ff25ab0e0d67d1666b269c433cf0e363103e8e7af2e57a23507d06990d8e1d668c50be6c11f892487a7143cd0bc20d400e386961063c17db6dca202f68ec54930cac181920f33c4883353817d4c4bfce2d006b941002cdcb56a1c0e3f5697813ea6b40db1686336ddb9daee3b1708af78c3196708b9a3d5c0ce270f0f6fd45c538907a9016660b79eeb02713092909fe8f29df977ea1f6e4014201616489eae8d3eac174317740b05228b3f5c854ac3cc17f046568b890b285423d17e70391cccc1c24da85562cf8b31122918edb3e34281e764facdf607c539f58411d42fc0fb2c4a8f2b953f0987d0ef0be9a7b06d672782a16122ed810c8512b2817a603e7c708333827426b341cdb11571fac88c80a08e17579449040f1dffcba483c2189096260fd27e42608f74505773ca99dff4b9a08701ae02f64587e3bed68360ca6e504fe71f4bc352728437e97b25b719ff066745bd792b814f0ad87586f1c0fac7a81dabb27455770717cee978dbd8ed8dd4b520bc0d30844ece819c7aed23c0d56ae1aa3f27729811c8415369aee4386a86e657c5858baf69d286a8a704386208588ff20d054e5a3568350f76cc844bcc6482ec218231b6e0fd232a0e6a970943fb0719ab62bccdfa8dbe25e335c8b94d429a1b697cedd8c2a623c79eaaacafa61d0fd3eec1b53838715dc0483831be8e8760d8404c447b25ad6c04a57104920eb3b5081547c7e6d593bccc241756595914a3384653cb5c87664b8892e842a5d7f9c0de4e7fd521075069c36d9bdd55a2f8fd1c62eb8c23ee10a3045a9387a780d7e3374dfd123f1bddf1c5016dba472664d644db754d18be4e2f006c27dc86a243cd03f8572e27e2c6e99dc7a1b3630d728b89df6da9a6401fcf6271543f9e5f501b3a295553b1d939927be0d0ac4fcece064fd38526bed74c3d70a92dadac006a6e4c3e73f8c872cc868a3f719f9601360a8d09a24c0788565b82eadc9fd5213ebe6c92bfe9a680002112e0a3439bb252ab99ed2f9e57e8f7ab6df05d899e06e3c651e9348e7873c29e951e14c56b98627e906e9103dc3a8d90dffdcdcd4964279e1a65514fbf4f13ae264bd4afdf2b6b7ca298e2c3ee567d53f7c1dc4f3d5624f321a94bdd277547bf81322a30b3a1ec861949985fe13d8441d5496796da0c675d12670c1bce26489bc8cdb96c0c1cd9c28abfcf4cd8aa311a3daa9e084aca46000c29fde05943de9edddd20441db9e3e814fa97ebd1bdf9d73cb1e85dab5e50b3e81786cae9e9fa557b0b6e140a914e76859b2c230dd2b81169db8e1990c917be95c644be82852e567b57ffcc6d2966a3227f4d09e2e877c6b3b9c0a29612b34de89f2757946f9240e185859b37929e0a1508f582c70f848c56063cba09e371b9630cd4390617c30c38c76519e19255a8f668d97ba1b7ea1398c59dcdcb4cb720ea4d9cd53706fe70f17a21840e7fffa4f2cc3d6410d20ef5688c6113c666a56f1823ddb3a0bedfc4182384a399c4b627cae96763b80b53c41583e515736b3209abe76fd5981752a05111df6ce500645a045b04f54f1e305d3f10d8df063c7934564aebed847d203671b736ad4a90fcabe18ee14707e70890366bb9ecf04801b1399fe21449a66209f0a9ada7603d5cec07804532399a86075639d3adc9d7d08897b9fb5e963b99b1b0e00620ddccb4057fc498197037823e5cdfb6182d562a0125803df038e43e53b8b0141ce600a2ea796a7bc6511f77befbb91e779e0bff3a01b6507a4a0bda23788eb16cdde7e72e5770d9501fdb5363c5d31300976460aa23cb90aa968a642b6284506adab426459cb86d04df4ad28b20c344a451cbe79c4b0bbc8a44122dc139d41e81b284d23f35c5da1c1d02c1632d0520f849d39969bbb2bfe85601033e2f261f59a75a0e3e59b5bb83abba915c0b398f529f48d1b3bd81ac1a17f99b8846fa8321a19d0c06645c72d230b9849d148851b6ce38f2a46b23a8af93bf14e8b34d7c1e5051596be381849a6dcea0b34a3d118f1005e4880f14f43c2daa53e872dc483a8f36f633cc6461c054bc434ac65ff232f5c86138898d477ec2d825ee37aa83d4a89273c1b5a015840f2ba25ae5f94409a2ab023537a8a924d54ed34f29a8562a3f679f71eb71c162bd0d3aed4a85b2189222875caa9397b32c2144ed4ffbbaa09b5011490eab38509ea833e661eb89eb6c7852fb6c191874d2a9719166f417c074fda13a569f02d9381ca10df18f003fb8c84c29b6b8be792af9cb912679e3e7fb19ab5d556fa4395126616ebedb367fa4f7b96ebbc0cf777747754836dc35cd4a5d8815f4547a9c7b3854d839f444d988c16a30c590d8786a3b1396f639c0fb52885e88c84448742502429454de3697632f427c08988262007ce6e4aa770797c57f87e606bddd4c99f88e689a58eb8759bc49d32cbc77478f2f7480070bbf56660ce25a07f9de3bccc8eb98d0dbe25adb73fed9f468e316aa10e253ded70911ada6862db57831c4eddaa01b1ed41ccf2d5155c5999a156423955ccd6b618e3af828f9495f6c537d4b2a97ac978ddb8d8f8efc2e7bf4dcb08b069b9eb3cc60eaad94a3776684d5a8c646bdbfc0102fb3d9aa1df0535e65015e18a395b296d9f7bc87d34a9c1164e9786ba2bd66baad2482baec7da2074439ff660f510603bb3b51ff72d8b8880e6f1c1afc385f7693b8b86b6dec407f187a0d27133df27d3406a8142fae7dc79f66dc7b1dec89d86e81d4d38b8b76f877dfbcb9794195890974c68daf52ca96b1038b813d442546131183972cc2f6f0a8ee5e090c2e350edf60618db89e9810e67c1be712e0170510e365e7ee7e05140e6d51d233be91b539f3d8b95b63a0d5778a943b34f75ef9289f97a003e22c37fd00a714be58746ee0f433b19a9ad19eaaf0cfd261fa72b1f49989dd83b4812e08ce4d602912ce75b976f7d0b6033b4da796697b9a83cf709baaf8e4c853ecdc3acda523167ff09c19e7174b8c7c51612c7a02e1b9760a4c35c79c2d822cf90e748070a8d2e0ce714a1f291b7400c9b53ae02e9585c51a4d641a9b149a57529dbd6cf5690148e12538a6c0adef1c2fcadb0502ddcf8e0d7713119b0db5be82c292cbeb591313c50490af70cc163d4c31451fbf732fa5c517ec5c1f360449d24acaaa463b4269c4542e57b396d1d37f1b4044324959cf068994e937b41b126633b46d1ab4820350496f3a09ef82e70a55957149069899c2d39cbe18e12b3bc6871394b4a6b1a6b805d1f301143501d268c7dbcf29dc44184775aa602227305f0e27ccf48a76d7e1f660b071d8c9cd5cc91ac48a6e62acf530400c92302a0b53d3c819fb6f618cde9f9ea65556d3c016076780a415018e9e964489408dd29a6686933dadab06dc2da429a39667d3b193103804c9677cd8d4db71c8ab040a45a9592b224f5c7db1f95f05b62ba92c04e0d06fd44bdc82b20d0c3b660a8da4af4e13decc11620ce435091d236ada6dbada8ca9fd46a014543228b5186a16a7c508f30a69aa8aa74e680fe4e5d5961a75e93c0bf22611e46e77bcdd7b0a9ea7785ceac37b1ea644f89204b6992400e6778a60110bb53ff4e447881c703b1b778dda5a284ad595ab967a8e3f3a0c215d4aecbf4c04a4479e97838d3e00a493fe3406863a45cd2ae52ff0d7e4584392ad1cc34c7179490b52b5ff3a97a81f6096005573ecc737208b24d0967d4e53008d9839e33949f09fe156f9af95f4f10b482d314a1f5960174807a130143d8feaaafad1694b1078cdfa5e2ed19e0afe01b35e275788909d0ac86cda8c630222b0e7c1ab720bd7cfd2ccd404ce8e629a5e632603ea5c18f7af14d6021fa5912e66966b361f1451ac5b169d49cba3719642b0586f6dab5a4281b92d264bd14aed2af9272631ce4d4c7657f91d2a16034bb349029c084596d40e670638152f3fd8ac1caea3c83d03bcb76a9468a9300db01ab4055364ca8d944afc3aca3d5d6fde863b2a723f367a113f96d9066ab8569103631e684c7763c9d86c45664e7e0632a341b22b151fed9f9b9b7f721b9ed03a32c5352f8b7c748e00dee1548bcc7cfb03df3510bea546a98e683639f972c08b2f87da90555a0fd55ad53cc5a6da2e0d36ae94317bce291b6003681b9f2d64ef0507c3413517df68078a1c03f23594c0df86fda4888a66de3b5aa89e49cb667aebbde1c603ca3f5631e00e73b21ca448f74d9d969abe25f8dae06cfe829266f9da7dbe508e71eae556462465af2692cd245cd9fba5b3ab43ad11536acf070a53f72cedbf1f61ef77704a8ea39c2506f498187ae7dbdf24031a7917ce24b4242e1bf573459d4db43cecd679017bf5aa8aba71ef343a3961ca2f490d6cd2018cca5527880d2d9b1ca6106b4edc597cb0b4908fb9b37ccae99b8fbed114c9f7c72ea7809a668861ca94c10ff56d7065ac10818e9fdbede3f903db77fc151c4cb22be0de970abfa4e30854be2145cf37f1e0b3fe8acd6f34d166cf5d54561f690f011efe942526f597632e9ac117ee64671169b30a3539fe01419556cdd27eb7a7785b579d34cbff4b1d235fbcf590ddc76956505f78719af004929c8512c72a416f95a417811b76658b45f67600cc981200cae7df7adc3e92fd65ee20491ac3a338cfed5a5c51ad7ff130309f0951f576edc403acf1196788fb0ad3040e65536ac13ec5b0055f4361833601b4738de5b8eeb067e663e33bbfb1754d88df4a49184a8367fd04ab9624cfbb45fd6341436248129362a340e4788b83c5e4daa17543e048fb1c45a0aeacb78232fa60f87aa18f9c43b1610f90f269ae0c64eeb9989281c89947ef536cce1ee7c97ff86cdbebea0628de870718d6f6f00c6fed9608012a554e3068e1d3db9e39800f8044534df53f88d56a9cb5f81a93dbf81a19e832f32a8c0f656cf095780321241fe794c3869ba9bec81e8b048d4b8833e3044697e65e8d1a6779358f1d184b2837d4ffc8fedbc0337080d8a2ffb2860cea7c8c23a99536b75a2f7b99fed6a40b9b755dda54bcf30b6abded0fe3e3701823772d00eb2e368e53157273f3e5fe4612f5f47c300bcc3c4a3fd8fa76a5b038d5a2a6fd7b5e47f476bbf3ccdbdbdcfdb82bd84339152c78704e77ad78ffa0b7f6ea09eee96f2e1af42f989e47c5612831e47b9382dee5586685bd2057d86983df97a665f9b0a48192991e88b81d80f8af9e83cd771e96a891faf321ec2f7d499055623aec2816c3eeea0c5f2d57fa126aa6fa68f0f20355d74e03eab17fcd62fb33e8d64ace0b607f3001983d1f7780894b7b875a33cfb5542856f902d353f4d29000afbe4c03102316aff62306d82d30671a74827b93fd16275f411f32275c0b1a8759994b736caf7245ecef0e0401180852cef09165cff6b5acf5df69c1b071a731ac2fe2e0950ec3f004725c7ce81efb5cfaa464acb1dd7a7e73230ee0b6326d66dd701358d6b7fda2249738679669ef1cbc6cd67f099960c59c25c7855edd7512096a0486b6bed41e4819fb3f28cd2c9872e293ab7db91609a9c5994e8fd09e8118ff3728cdae4c32c22e1a7d1420bfb71fe730791e8810fa924e73348ae3e5d42b168c3878c87b38fd5d066d9322cebe5fd86aec0220c7f4cdbe5f220e56cc688eba8acffbb1add6a2a20191b87fbd605555e5d7ebf60081788d8be5ae4fdf84f1bdd790ed3e123b94703c4690e37df4b730c1bbb87fb810f3438f7b6e3d82f8d7359e78efa73772cc892b386e0742c715065af308a3fff8c47ca699fc75d91b9d7dfa66fa87801e9df4851d889dbd8e25e822597a47da00ed9de1a86fda2d26fe1f0257c49b74cce5fbd9bc8e8e792964617c5447adfb3ec1b78bd3879af008ac104b786724b97c86c965e617107dc00f13c9950c204ff67882da0cf3403c0a496662b18cacfa0d57d2fa9b3b869fc215b6da336cc1b5c3973986afa808ab2dad036050f9f6ef2cd92e322456191d87d486ee149abb2d9a8cc3286a23d6328708b0e266fdec3ccae277f9a2cc9f565192710809780c707755d5df1335638d9c75fcb201532a45c88381c27a3bc657fb20dc220d68b702b641a7412d447ee983b89841586865b60c9bcf4a745f353dd11dd319d634cc0e7261f1b09c1dafae14909ce3614b7f6f8dd0e330b6ee836b990dab0978c501932b0b3c64e4d8579a839b460990511e392abce9a59d8a75acb7aac9a09b08c4b44c0cd2898e4ddd86a72aea8fc75377b99c9a184863a5cf51867939e12d586deb120f9a7b31fbd317ed8d71f91b8889f8afa84c733693f394e2e522b50d0c46aa8738197e0499642e923b3c3e3117dc278cf9da63a0c0c6d6a3de78c98d4a9d4321cc20efbc9e775775ace77611fdda94210d46cc89715e46e3d66151c32b878105f28c52789717b40476d8d64691b506e5a7bd9f13daeab24236ced6f99428581db3fbbbc121d8d1a378e4814e64d94fdb99461e74862785f4ed01897a85b8260e2065fde76773fe975c7745dd4e1eccaf19cd28e672bb291e563deb3656fbc18e7f0c84b6b4be6224052ee8de132ca4bc30414cd799e8ce41e4f77f765bdb5af1104493fb8538e5cd2cd4ba241ec80fbd059908649392c771460c3ef708743a7a7949e8afaae83cb45b7beb22ca665168588e3ae931e002a84477ae24d0dfd4bf520b7a07473dc3669f4dcb6229631cc610ad2cf1913b1a218034cde4fb888f085099efdf1e620a5db64a0c73e0621957b773100046c2a7a6f5e2e8ad8a9ed171ac251180b496027a9f995596993d196320270e317e1afd5e2bda80a75803d9f7c0e88e238343c8ace8cff5084d7fc338b5f5c0ea53dcc7da4861e7ea75322f0fc8afbbd7cc3114246a9c4bc82b25998a1e340da440c9813d707c7d1d39f6a29b05b9cc29e0256cd6b53633662daeb25b5cf5f0f8f3a4f107bb21b58e0ef6922c601d5e1267c65d1841cabd5108c0c1fa150523c802f1972ad4a3a97a9c130450cc39039b8bea591828aecb9d5db1a9bb39042f62a181d72e29a977d5ab29cfc485986f0bbbf74d24ffa3f50850492483ea5b82552200685b76cc0c37fa1e7e9bba90dcb1994140ce851c6c93d0b64eb9894c82819d773bd21889761aeb001fe0dc11349c89d2e88a722fcfdee45db3226b48da62cc691b69cb30d2a70284247d614592179de4d8d2a28bbab4162c211a2ecd1224519d61ae21186a7804ae002c405fcd7d94cc27db36e100d167a9994394dd691bfa06a33db733e75a4a060aa5d8823bbd355e394bb41877459106ca76ed32e2da2b70fc050b167cab6fd7e86b298fc0e39e3f243321da576496566d3032fda6e3aff998bf26e6179d8b48753dd175475db02bffccfea3a72d48db18236a119476d0825a1c875d67161a933e97b42b983fe68f60a6bd9813b34ca21c2824722e13607f8d048889ff5c43d99c64453c580dcfdc7aa96ab32f9e8a5ddc4687e3dd673c0a55cc5a76504f86e9e45dc0070e4daa5d790f0836e8b64969dfb2bd402a59758cfeca5900529ac764778b72412fdc663b8a56a59385ec136667e5a3e29aae6091884e2db3f99c2cb93c15a9328b824705b1f7376116013300fcfb05387bb201c1291011c6d86f41853d556e7bffacaa2b1ad4fc3550d4257f87901a1435fc82a53ab784a5e6f7db125be4c796d8f8b584f8baffdb5ca5f305046ea64908b176e216c054e1f64808248de0f68d1a7e5f5e9341a7f7c42dcba8a058c8a37c09b58eed50350a018a0b04f9b6139278d6d52f48e60491cb5f07e7d8a1d587f71b42fc8bdf680c1e84ed605f77a111747d372554a7cf6e5e0f113b7b10d22117130b8ad3455f242038749155d0f462dbbd67fcbf229040c7689c094169f53e935e7f4808dab0a24bd206b168f2ccdc945b0c40549e75ddcb75e163788953cb166a1beee73e1e5f4aabace38ae7faafc92f193709045b637cacb1e466e76440053ed5bed4a890ac0784ffa4e0fd3494bec8af112684e489f8ee587ab83352b9952077bb897a35d238556dfb77f0019ff40f3bfe8ce95b72f0098e35d1f5457766aaa4cccf969d3e9442e1c45e79f02e15b3a0c0015b9c3da62803da322eda45856f19b7f2fba20690b1fd5a8ee025b45624087ced6614feb80fcbfbf7e64bedbad0227ada704a4e2ab67b59fad642d3a9f6cc6b830d2ea1f05de1b3e1870294f4de79b01ef1e729d7a130e4174a6d2f01878e936445bafe3a89e53be4d7b36a89a9fea471ff66801b5eb993e2dae2fcd7fba27dd42b055cd358b94ee4df5126e330b74897023fa977c4c309270748eabe0e96ab9271619cb20f2ad3eabe048bfd116245db8d5836dbc8714dabbf793bf1aede20cf2f60218dd39d122e734b682c0773104bee02569bd09819e0d694e6bd073bf46a2a06a875ae8f6262c9b5c1684284675cc0ae534c77c36269b1b0069637c0db4208961489640b2f8908eed155212f46edb0646e1a80ab85249af0170502024199f1cd81307d1f6d7577afd4fc06736eb7f840ef919b593d9561e43710ba56dc74eaf97a7294136c4b5578b036f27e870c41d80e662fb5dc32bae25b142aa2a43575c5442cdb5226f2cb82aa960b4be06520c52bad382e0af7cb1f9eea9ba2c2abb582a6f8e8fc936d728ee9118421d73485084689949d9f27960d079b1218012037ffe6d3e968b853853fd33c1c7d0c7c99ecdda6dc8f871b8d38a223e2fd382edd7b729f9b6fcaf7f362e9fcb1c3e7996e9d3c291739efd6ed71ad8b3c5de4a2e0e7f4db373c2582b08b0ad061836e35f21430a484a7fbe3eaa1a9f5519a4ce22291e0ddfb4d7b1562696ecca5366f9a60c6f8cb73e018ca6fa6d7219d9c8cfa2b62c349b7a0e98a56d436974cb395b31da73bf878ab1d55c8dc1f4cc43f53fd33c99deffd1c6e7c3444eb87fb6999d657aaa7bce67175ec5ff7a34efa7e1fe1b12c9c4601a679717b7a7c6cc5cec583915d1d465224a4014d5a42fd7803f3c2eaf318c788187dbf67403e358d22f48f0095c35adc244502274421dfb0b5c14f8f64769aa40eb8404f88173ba6d11d090af3e2af878cf1be9a556b669b0da037bf06f692666f11f450d42db6bf5fee726b4606bddafd44a5a80ee5b88a3790303d834024577500482f97af1e482b1c18058d20e3873c27ca05c72426f85e49533f9b78b69df2671d69c97797fa953dd10974e8bb85601ed8b57eb72cfdfa28f8186cbd84ded913e7af02df87ec0ee400d1e7cdec2194b5d31b5a07233907b38e8b957d884e38b3dcd2a8e06e2bfbde7a8dac98a868d673e804946be66b27b1e0974c098f113d3eb139455e5c63ea7372f17f71d7873b512cdc9297f7ffbaee403c30e4ca3d2ce2b253f598eb98d72a3a33d4b245b007d5c8551bcf7b13e38ed8e3c193a4f7e9b7ceac0227a9799d160e05dbbda87b9f2c95cb102060ea7b2c51b065e490c01cd15f370a108c40927968d63c1fb9cd4c2924a86e9cc7e7eec05d3aea9b2897dcd7f7ddeedab904131b20a3435c9782a648fe1bc8bdac8a54cba06a880e98aa087040e9099460e9c2c9584b8f9ba95779b61f124889a274e5e1982b481fcd2c17549519d2ee384c573cf5354618a695495e21459f677dd3331b89869c677c40d05efe06f63dd745880b7791d586fdc6249b1c162dd07905c538f6ba8c2900b06aec036221e360e3c6e555326551613a84702521171db49086c6f7d0fa196a8062af6488d03d0727b3f58232a50ff1dda4c412dc8238dac687cfcb795238774d05f74095ee79eab4effea914c8285bdda9feb77309a43ebd51d654bc80fc8dbf11069910a0a68b7196c631cbb5eca6fa667c39070134640e624484345970f956fdbd1a3a97d7f79db667905055ed2448ecec4af507132eb52d8b44e0e96cd987a20ae18488b882147274e03701420d00e2ac90bd7a5161660daa4230a7143eaef71038b32a78c249e72e2fd0ebd1dd6200f4833bfeeb252a67a220daafe6d9df2a97a7b56c0ec1ba33f9db62cce57406d3c879d1efd5030edba00598980cc0cae3f1dbecbbc03ea2caf6061ad4f5a030c2331340d090371beaed5c03ce7cf9091a04770951c1115503f16c7bfca3499262be1b94dd7e834af03845640993627434bc5d7c2d8360c2777e751df7308ea01b123117a8b5d4df378b50fdf80e701000fd8a44ef4044cd16d0309db7669dbbc62c1225fe1ae646932db76d0a0031d6595018ca1c0d8261731e1ab511ae7d5971ed812c1e37aea4eb9751a46df5a5038f73aa3a0adb3806e2ff39c883dcaa3e51dbb695bd4812b0e478fc5e10ceb5a2ab10db2d3e19305be0489175922d268f74bb38c0e4446e14fd73581b5f2d21c3c2c35f453c0a9916f376567f92c8ce9d525cde2faa672330c9da6d8145bf2023fe5e9445206659880509b804f9409a9098ba0aa3d335183daf408bee638b91688f3873238d7e75330f52a964f1b8629caf4ce718be0b16c3b6f81bb02977ec6a2304d6ba725d472be80c8d0be614325f09e13431028463f4d289e1a71b1ae5660b96d9e7cae01448074d7690cc9b3c129759639ad71e02b042da0c71feb30e29ca57a5346b7f80e26b5eb528f5a594748095d74a0c697d0910bd9da2563caba40ed10daaaa97a945ad1e487468db796e312ca9a903e18f3e4e370b84a2421ed9dd6929ce0e19696d1416074bec84a2baf668d0782026c514c088816b9714995250a0950cea181121bd1b34488ea0df886b5166d68b02d21ac256c83cfb9e27f10b56ac36d0ac1921de7730a562f23880cc73533c02e22a433c3ccf75c9ab0c606c8543f878b3dd0e8f43109dbdc522758ea891552facc632578ae7e792860a1d18da6cc7c8ec920e8147561d7870a0f831db345a66c80f13e10cc96c636445a44bda7b8f6c1a983d8302bda659df951591cd8f92283bf084cac8dc8b666774d18c7827544c2e69564427df23318cc22325199328468e1468fb8d0de1a3e0b010b2fd53c0053fa40cb7032300922766ce3efabeeed2fbc354d14ebe27cf8a2a71c42b0d3eedbd50e28f6aef360d015b52e66640703f1080c0062e0de48991822a74679832441860d916ff356c132a159a2727dbeed1d967cbb2c311fb5e0b4c7b289c7ade54554385507778515181938b83672d41b316d3b9b668b3be8e85e383f95f1f1f0bf6e772ce4bca8be15fc464b5f13c5806fa8da348d4f63cab6eb1734e3b44115275e6194bcb65e1a79235c83a98b8a7ce1e9c627185103ad28319c6aec66726e70170f179a92f0a33db99991bfa44b53212f84d09197d4e5c7276bd77a72eb1959706855741746e0253a48db1e4f932aab575dc5b862bbad7d80fb27190edbf8b2d03145482c02412cb4f5b76191e309f834401408f9aa6366e0d24fa49f3d1bfbc92e31d80848f483e437c017301f711a4eb14f737ce1219442388e5998d52f3131c1bf72a08c7f7f455ffc29982f07eb00cb9170e39b49f3ed68947b62ee572381938b2695708a4541b9faeb95ffb1129c4cc73fb8a6589c304accbdf2d7ee4d65a5c8e8863fc90bc13556ab797ef02454c221e4d84e1dc1466e591b9a0e09d615f0a802f96d0fb1938b5d0a1cfc08bf615c6d68473d1c0dc3977480a3424659bfd24e244be6885e3d97a342b396cfbc326959f0be2afa464c40f23ad976afbb4820b882661e01552976c12154fa7d40cb97b07163a1d2338ab383fd9f6d468394b35ad963af90469075cab96810b20e4d46d47fbfa6b846b1f0a199b1e09b3f676a8a0a1d8c2ed7baf0b670c1e30e893632944aa692a0b0a8c5d1ac18e4b1b2b5e8c81767a28fb29ae10fcc1e6219ec57c33a7ddc140b399b86860b494d0fb09644b21645765f656993ea8e361a1a8ff3c76fc6c5bfbb12a87563188052bf741f4b181b47f05709621d6c01474a3511c416c8548215bd5421203313ea52807a8ea63256bbc968b00bf03d923040868562c48e07588718493c4959364ca93412f2c8790b3f072a353bebd1021a66a92b9c9f243387fa51f6b4bb55036dd2af7ad948b1a8cae2add5be3a3c5391f656e3de99014b6e4b25ff811ec968ae458bf03224c9d719fea59b7b34d2d5ea08ce44ccb806148f201b94cb1b2d415b2e40666b7a98d4cb1458f105e5a992b79ee2eff5d6025c72ba8a37948db1e5f30225349f9cd8cfa07c81cf4a78d126f22b03c43778570b99d99217fb9fe0923e697c32a74443d19fd776624d08165b4daa85a297ad8c7d372addb2b285ff3da3862ee3d1bef4642fb126fa6d47ec44a2d64d47694650304c5f852605ad1f4a0cac8049383e6d71a45dabf60fbae8c3cec04b84890809863c622b2b742afe41bce005debaed3bd303ef7f056528beeb975fc1a6dfb92ae71507e8ef57f8bf3c108e0264ac89278e07f66c365ca3359d469cb272bc0f2bef7ad833af334a2af87830a60086cbf3bfe17fb7d06ea8daa89c68fda9e2f109d09c05d19387e886c9201561fec1b003667a0009e932b478ccefeaeb8fdecfc29ba6fb6e65e2de7a18df8a3e5360b2c552cd2fec8d768c6462b35dc63260e9850bc171d6c4a10e85c4441310dc7072cb671b39966248b6ee0f8db3ab37fff702297164d41b5d3c82ab24cb42cd966ebed2581e070abfed136b27993a4c05d291b6d97a26eb5246878a305725a6f67ce4960135a130098fec7ee53172b164cfdb016829d2507c14f5a22d59df26ce7c0ceafd4d5a1a93cf5c9951ae0eef487a6409f7fd7948177a4cce249468eff2ddb7318ab94438f5fb1178b26027f3aa7c6016174cd139e49cf592318e56ecd97d651d78f64d4a65ef8ffbb9339024c434fb5087a9aa44a1d34bf995cfd9d1c66c84193bde076719f2b355e969f2844a803e09f152ee98a8e5ad752559cc2dd9a12bbc48b5a1bcfd3ab546e7fb2d90485e9dc720379f2870a5bb23ff0dcc5712836c4742f48301f986082642f74171bfffcfe54184c923559cb01e9bf5b679c152406a2c8ad7fcf6ebf3074aaa8c49095022219dcaab4925c8c89441b82bdd7b1b8c6cdca0ec24200cae2429d750623acdd9469fc900465737125fb9464e58199b4f1f580f7508697b725adbdc4c7db1ecca0754a4197b9d8020db95f9dffa187842c60c8db31957436589dc88cd61ef06b3aade51aea0c8a8f0785da179a09316c7aa3c7d94133f73b6512433bd038ecca8cb5c2f3325090b7077ddb5d52253826441b164f979412a6b7136d226d2c71dbdacf5569384048eac0f69c50d0c33a2e640cb8e5a24676b9978a0ed35e36f59ee2b420ed4c733fd1d8af0093c004ed1d08802e02158f6c3fa9b5a85ebc133a38e11e50adb1ac0c94bfbb27b51ce0cbff2502167845e6e14a4e7ba12c7461de40d075e852c6f598944c874fd2f0d40578809949f12ef8fa1fc0967a478229a852a511349c0b776d2f520cf84808cb234cf026b9506175ceb009b83a7308b9192381b602e66d707be8282f31c9f130cf0bba79e4f4cd270038158674826026d3a1cb5008bed2570e70cab4b67f42e94c3cbab586574c04b01544ad0992d3fc644cdd702bb39f8a246c439ed47c0928a2cdb66d6a67b5a5d666d49237cf306fa50236b33e7824888a8a55a6fdbe243d18c2c5c209418a652f1271fd8d59270a486c011aa51eaa1ca7c34c3bd687521309bd165c73079635d816ba605f992a8f9890e0271aea9363882118a1544b4fe43e9a7230ba9414867ef0eb48b949c02160b39ce9a26068d68643d11e06102a4d560ba46a582a6cbb7aa345a6131c6331c667d98952145cb1c39d7ca06cfc68c764dc053a61840a430663316c01b3acbb7d8c237d4f184e6a2ed6d4e1a08e1591b14e0a4637e97a3054259dc703891d833475694afab24a02af94c80b2b00ddb05459bb6145370286795b0e0689dc45495fab8d8e01659a2b30b745308687b35ad3161785190730078f9db67b1e479d28daa05c410cb87f82d74c743dd56b4e145ccf01fa3985425f508c69491b5242a366f2695d45820f8e86f39d5fbe3649d8caf9b7fc76cb6fb7fcdfe6df23483db6c75aef28e6140003e895f860010000c021140000ff5660883180204d78b280cf25e42840973489f8c680086947d92d2591c84d24b27b07a1042e04a5031f118cef86273d1e0f4f587858cc2899fac440cdb0d284294b92f742528468fcf1c5d0f1ad80438a8da3199e1218272cf57c5f9658784966bc9ea92228292b4e983e189286204143b4e247121d61707841363ea619636078a3939e4f8a13162c98699199d2014a8895ef05d317425218249e0944b21f2d313a3c291c21d8509ae121c1f87e28f55051626183191aa670407d4d565a60829114433203d1961f1e0e3a3ec0f17d6003cc0c0f0a0c0f84263d203461f12131f3d530d5420365c5ca6783e927a909490c4422fc204147101c326cccf0aec018ea5181e32e674c58ec382383988f872e2cb0783e38fd3cf98e242de9620e0d249e535251177372729270e8f56dad3934c7006890926c484e42d090a2c02c92165815035be2c16b898b165c97b325310c6433e2d2a38dc8f0742b5c70de0e7cf77c44f8078537c5b6f028aa473b1a23b31c6c81e15243027281e4020c89070867ecee72a60448f7b21be68cb8747aba8cc81cada8b556abfdec9e6ddb2edec105713ae79cb9ee28c951113f6aea20c599aea3a8a331abd56ac5796c7b791968ba5ce820c5f136069ee77d160907241e5d939191164646b033d688c946461222adc8c886c6358d084a23925af199c139a0c68986d89460abb5d5f3e15a973325529f4ccb4782922a4a96baaacb9992232e74927646468c8cba249b93285a6648629678b0c44595cea6c6cca8471702ea22fee97266f49a19a9502226773cb35101821f1af04bd3c4e8c709345ea02075819cd20116d1ccc70e1f43663e8ecc88ecb0b65299c0def780ee7ebfeaf7ab5e8292e27013b2e3c80450956bdf5c1037377f41d8cf2ed9412a42dcd1e28efe7eb0a1ce166a985624ca29c0b9e9149c1139336f40283d483769276f26090bc2087b012b0b9ff371c5b999bd86720333221fc82ece0a80157c7ead3c3a497f460488c68c88500b3975de48f9ca80375f196fc738015914e9c402b289c687233339253497c8305358c6a551322133ca26917c5232f2180d2023618c1a2520db6124808c02b28b05b624e49514430c4a4b56f0a430c19c2132264086e607d9c33c4146dd3053904b1f8c288c13d411322fa35c624200a28c2869aa81e5c61024d80ba0224d23d128a2935d19279459e4623c808c49529931328da0ac8a0c36e2c846983c60d99cc9a2f9457221334ea8a451cb180199d13866fc64dc9610c6ad871599546231f28c56a6430628bca074e5842d5fbc1ccdb011c37824cb204d212e78d488725ac10806a0d9e501b299464e1965c030649c35708c0ea040b6c9a49039831329227288149026b33348c898669c1e344026bdc826931032d96536c92f36c628a34b5664e432ca2750462d1b1a6d642f7a186541948c625a5b40c8260b2f60f1a1c98f518771c640804cee70644c9243f0a30890315582f0802929023302c9211b5434397232f3342231d27365dc2b590d3e9e860c635c182d905541fa41693c3386b23063969125bb318a29804c4ad132566000321a70f8a13202311a6799ad0592f1efbdf7ed0e482df2f3ed26e997684836c4cab8c2c80095ccd3c16553d6c278436201325909f40330a49a809490030b47488a82c4806a642b8c8c20e420939e8c0aa84000322733320b983107d408009908495a4c290196f535a148fb7d5628521ae3e1e5febe6833b8219d18a82372aa05b5cb272c854d12767beddadbc4ea6da8571bb7af7118b074b5d1a1de711cc7e110afa74b7b956bfb1295ceefaca63e938486334171e2a943fe8539d582fafb651de185da823af6b9bf21e642ea8373ea88acc51d50b4dcebe830738f016d3bf59924b850cc186c34d627f5992158515e77bee80bebabb5e699afdc4dcce9ae7dc6fa869a87fbad06d19fcb69cddda03b5f9b47f3701ca7613ddf7bafe649c19a00f8e0a7ebce7aaac5494b501632598eb4bc766c08888ad82fefff8de4b4fd9b824a5fb5a6e372ce9c4b07cb2e678e9b593fe5a86ac7fad4348dc39a166a9a96431deef16b5a285a4a358d6ae2a641f377d0355a35fa77c7c8db07ef589fe29c99c6e873c6fa36e7a418533234d4b8cf61acfeb44256584fd0d7366c92d07e8a3bb663e2ecfbf936c17a4d9c9dde5aebd7ef7b2f1471d5e88b36de8b96bece0cc5b9a94d15aa220ec51dd056ba7deebd7ba8771cc77139dc3e1bd627bd938bfddc04d9af3ff687863f79e2a7e1dc7be7df3eda762f9d3b60e726b7b51339dc3e33c41429501512bab7ef57bd4861fd827deed77893e9fb572e4b717628a2b83dbf2a1429acef1771df3e93c4dc3e3bb67d6c6b4e500402274c31149992a327058b8568a95ba2a6175796a49d73ce39e79c737a1a9c9483dbeb4f7d2bbe34e350e2c8abababf62e67578a7ac7e9bc4dd45ebfe3e4a4d5aa6ab84dd904713bf114f55ceab0c454abf6e74b718645aee090516bad28708d05af06b72a7865aec840e1ca8b5e4197b3a7304f5b4cb0c9818003c49ae380d9d3925ebb9c3d19759f19df01e49bda41038e990a9e920ca0a7d8f7c2530b1f3f5011e34589f284ac4041f99e20e530e29d09f219a921068397e5c63765c637325971e1b960458527c3986f4b974fe88a27a48948d257e3480d423c1b3dbc2232b4c2b0d02a53c3838ae175a9d2f3d95065450e65bc16529f162c9f0a293a9a783a24f1be107d41377c5c66e011e41941c14b8184cf0a1511be28543e689931e3158131d2f295e0e41139d1a2240622de0f3800d1f15d79e17391c2989f27a717539c427081468530de0a504caa1c3d0172f49d50c443928397038faf4a8e8f8c0daf04133c16a6c83e0fa6bcbaa4f16ee8e11b810bcf532b0dd3d762c9920e3d86c8d8102386272bcca0e1c100c38b92c2d39292e2811119cf8c97243c7c4ba2bc98783f90f418f2cd7c7c3d42de8d16bc17277c4e237c334481794ba2b0688df1e1837d1921cb97295e15a5d6d40ead33453a7e784368f864b8f0e100d4f25242cb87261fa026103c9e33df0e539f095b6054c42c79478cbc1e664c807c4d762ce1f056a80046060ca61816a616df8d1f92c47839a2be282b9f17282a90b8184913c49baac1f302c387e306d28cd60fe3970214175f0b5054781e8cf19c7469f570e50bc273d313cf491e0d241f0f221f3f58e8100187f7828d1e66045d284e8e0b4514b78a7c06d51135c4b71ee912805a9b46abb56368ad16acb569b45a1bd66ab5768cc2be45610fd6f05064b54074feacc7ac1a0b6e9fedb37d2caec1a5a84f5997b328a1ae022a7f872cbe9ff3fdfc47a783bee7365dfbeefcfb3e0ada31df32b7697affe62c1667b1f87e978e8ad7b058cff98aff6ab3585f82d6a89eb356abbdbd38572bd687e2aca9596dbbfdf397b42614f96585e20852d4d4f0b77cffca727f5fb5434b715c3a83ae73a1b87dae803e0ef5a69101e27cfb70ce7fc338e71bc639df310ae30fae549b83c0abed81db67fb6c9fed739f7451d10dd0e58c0b935c6badf5ed77d0e70e356df57ab5b168fbd43c5cddabd55ead4ad4cdbd4ba7dbaad5eaf7d6fb35b70a39a87df525a8ca2576d07534e87e7f094a010545f87ecdad42ad0a75785fa55a8522ef75c40cb10e75fdcea57966081c8a3704c330767700e9977ee91ffdd2310dd39afe069aafbd75eb376bebd6d674be340fc86b2896aa5dad99d6a7b43ea52f7b095aeb055274fc9d9d9fe7e73c3feb682ffbe472b6f56b9f367fde5edc504b9d015dcea06e4401e5a81854969c517c7e71075c65fa9affaae6ed36a1434371725a15d668d5d65a6b4a29ada9a9a135afaa59a9e8d65d88e2768e823c0301d230fdd2300d031271068ae1f95201c562986b97e62a55d67abeb4d63c9a47f3681e204e371f3a792356212b5df5b769a9c6f8374c878312681dbf146d4741c5597fcb8dde802e675aa4a0626c89ea5ddd784b532f4097b32d3bb4cb5be1fd2a1575c4fcf91c6a4af9d3cbfadbfafc9ed7b3f7f83f5df39e4bd2d0829a7007ec3cb4228adb3117a2b8fd769f4391c2542eb0dfce849842a70bed735c9d38d4997f7f0b33e8ba568538bd457234961b6c6a72afbc544940456cee7f296f00f29a73ced5a583a5ceb9d69b75a85355596992c87ff17baf0a454ab5ab699a168a3b57bb5acdf969d239b9cf4c2689f95c6eba943ef79bf67703da679a97fa76efcbcb71e2bddcfd0de68e3eeaba17f106d5027a7f86e2a5f40b8558a108f639676672f3d2c6b1382a5447d0234947d09a9676dfe6d2fbd4c9e60b8fc41d3db312c771dcab77b5d69a9566082d33e97797a82aee3b7924eabea5d406603da24214bc42dc35f14775aaa465edb3121502416ba994a62336a04e23ae7c924f5a73d7ebdbfecac529cefe0d4271473e3951a76e3f2b65a5bc94956a055756947b1aeba27ef93878ce3975f077d0adbc967b4aa7cb6adb6b34d6ad7d3c279edc4d9754bf7c2cb55cd990c3f6317e6a1fd3abc29852acba3533d325da4dd32f2dc571596a01559220a7311a738ac164c2483061db516692976cd02f8d6a580ddd94524a29a59422acadb4a3a07d92a0f3699f22985dae249d134d3746680c50bf3f1b13ebf7b9312aeee34ed336069cd3c7fa722ff16313770b75f009ee6fc89f0211c4bf691d9c408ac87fabbe2edb410adedc412901fc7a6e0dcc2d1475b819991e1d3ff76482bacabd88e736819fd33aced2764c458880f68ea504a40cb7bfdb73ac13a60ee5ac9c9344a6bdee0ca4b64d708fc30a4ecc4c7b7702d3dee10bccce7da741c7e1b94f4c152a3a1eeadc09fc38b436b888bb0e39209da473baac942116d1d91ce158e6e460f0364a38fd50cad0025b6bad683a49c3f4e8723655d4bb9c4de5e84f292d51e96673c4e94b16200882a01429556a35b489c245dca776518a317fbaa33ba59362e9249d8131d2e50c4c8f19989ed9148d1998335a6bad35a9f52a18e0aac11215e7ec9276639073785fe7d75ce7423945ac7b76dd281c0702200513d56bba9c8159ea94fae054b5a422f2dcf6056c98b6a9fbf6f8020c6a703f7f775ddb634e7e766ddbf69ce26ca14784cf503f7e9a7db93193c2f2ea79292f65265989a8e35ee5c28965cf39e3218e4768fa9c75d19f7be2c75d88b5edda08e1f5efc6699b215e2d19290d64606b4076edf16f5352955629555d2f39665e6e502084e3df4c688fbfbb745255bd5457e96afd9a628a28fa964bd412f48a9a8e16eee86e2b974ed2fbd6447e1ded338a7c678abeb92cd6dd86aeda242f65259c3fe737217bcef9ed6b2e5177ad5f2e45bfae1ddd379a629bb34c273ba9e9dcbaabbe53b94cc8ae7afd7273c0da5785b653a9de84ecaa50f59beab757859fa297a073bbb8143dbb76c08e29a53645376999a11f1a403fdaddb16b6d1deaf92fb6da8ffd1f155db761db6747687303a72fb7cf0d439b0fa13e2db5e1bc1a46716e15aa6f6dd5ae0bdb50c4dd0c612bcf0c6183e80d8a537ffed8f8e0b4a7a82508a5c6d3810f4e7f80b0ade1f44323d47886a12223498e982cd9d4c0ebd0101fe2435cc7fdb97575a92ed5a61e9c7b2088bfc1b199216b3bd683730f04f137383af8ecdc0341fc0dcef6d93186f811f77ea8880f6d1f3ef4d3453a344487ba6e08e440be7d9c7e1cf519a3cf307fd7513df70c3dce69d0df4d3d436dc30383dd6607d7c9af75b3070e73888a28a222b624f3888ae8eed7af46aa919ae476f36dcff34bd46de6089a423348888ac0538886ac6dcf414d93c6c6068e5f7611dcc16717c10ee2b52ece2e6a1e1debdb6781cda04a458833a8cfb27cd0eb83a0384ebdfecc51e50c4b967901cf0c21ea97a68106f680897a06d51ebd6e45029261a8848c19345257b3010a0203170000280c0a0604633910a5209a6eea0114000a6fa43a644020a1cbe2300aa22006621006811806011806011000401806210444ef050076f6bcde1ab1a698bdd6f28294d8a1cd98d860ac9fa2cc794631b4df3e536b1a811f7b93ec8a81df3cbacd87cb18140b77f2fdfcbbd04fe416226186df23d0afea4bea4a196c2fd03a06809a055ef677b7d259c262a714f810229dc0dde4a891391c1d3d6171dd69e1a28118fbd73ea7611095465c751dc06645a66dc5e2835dc6726b14ad7e6bab613ba7ea5d29989e88ad296222ca381fe9ad86fd62d26e0c921e14701e75e76b234b53110ba03d86afbd6680e776cdf7a6b40ce3fbab43ed043bde65324b953fb27506593b82e6110cfca8170410ce2b9373529055fa388e7bcc00f7a86530567de6ab0b6ff30aed9dc2b3356d64bb0c6114917d22122339b8b0ccb4aa25626505f972b015afcd2bf12bd441ec16e6c58d1ca443ba720dd711c711b286644e2b1e05610cf65b082862cd9ebcbceb323c13c03d2e382a1425e4afc32a649916e7eb449851d2a1c3d7e4755021b6bb1e54c51717fb6b7065a5b3b5215d7a7d698e688e835b8009221311fccc01132f966f7f551c8ddb35a8d0cb8bacf7a4b73b5af3750a3aa6bbd4044d596a1eaadb8acf359be3f28c2d81d94aa69301cc95152c053c4c91fba5ded712f0af1bbe6b47797f319ae87d877b020e259022bb7f75cafdcfb71c3957c8a3dbb5e0fd7ad059d55d4801339d02e22993054c972605c50afbdda70053ffa5e909e77809e27e2a66cf601aaa75c70843b6e045e8585de3ee2c5c790574c54e0db22a48310ccd94b49cc4b8f9ab75270302c0cc4aed9f754a41828f88e676fd4c65345d3c6a38cb1b1655174d178214e00faf2a20ac6116c544ca60e018d5574554cce0d6cefe82e418c21b9dbfd4bd54d972dcd6e9e884e0851df1e55d9c0936f20d5b8b13097fa72d2b20a028ec851bfc07d028f1b7ba4d93dbd71a1e8bbd385c6ebb0a925b44051799f8e64aa42dff32b89c641b5ad418aff2c76e54452e4030784128e575ab5d5eb5ab4db4e84db04bf101c3fbaa4926eba16d81d3cb11e92d03cf77fd56b17dfd5143bf32ae2f4397999535f6816dde48dc56e0f6a6ec3014be1fc579c3b2dba7985da80a4380fcecbf6a10cece87cd4f848dfce797482640056ccb208834aa9a4849c281d7fd67f7103e923f30d9b19f2025c281477b12390a7f800eae9f7b0c634723bcd5261cf54383119f7dba5ea61746b94125dba2838850e3b0d37fa727241ad290fb8f4f9e32fe5f027490103f8ca24a3290d9aef53dbf128b4b80ecbaf291e0217b5e0f7410b9107d59624a60590d7b972266b72cfd2b1ae2014978261c32b78e784410049313fb9e4e332dac79f62689fb8b7ebb1ec8a8755f3377a9d91b7ee7a64e04d56a9796230b1162bfc6f28cccd8080e697ea81b4d3c17feca30c9bcdfc74f9f65d71f9639a88b29a5a0e21cd749e395c0ffb351197da6b5d76984fbf214ba4c48627ed8d80c0e81a5a42c5c5451575d8b4d1e876ed3880542ceb869afb71c949e385dc55000fe2e648258709ca41c67fb067f66e5ef136113ae8bae2a12d7aa95471bddfe3229758b939b62cb0ba4a4aa84a70a24d2150e1e3f17a4de89d9b479c85f270ea38c6338d81cbb3d33bbd687cad2afdb5a4b34a9fd61ba53c970af0cc977ffbc8ffe0b8c2dde8eb52d18fbb30aac6e21aaa6f6decb984399059a4b96ce305c382fe14e77c810f5f47226049b874edc7ac4d794e9c65e709af7c7cdf5d4e996acef9ff1497792f98cbf0f9d17aaf172c866c8cd00be14bef492a91ccf09a32868e14421b1ee695149c4db294e69c4521ac14db3d72ed943e1745799768e29752d33ae046a10e872a00ff4712f49552f4d3c10035d1721a1d4b6c066480cffe31a9467ea0f68328f1d77dbefc986815326c15aa2e1bf584e00e7915c0a235d5cf5988f33c77064141e4efc6ffd110d18e2592d8bf562eed1db15a42d02994a369548d19b60d506aefbed16059082f7aa0233f30aa02f5afcea0d0a870e10ccc64f7621fc105b487321dedf8e3a30f97add612ddcfa4b6d32c2af658b929f04059dc283cfd7c40aa0668d340b1fe8b455974a9de48c2090356d78374615605ce5909c2ea472cf5c336013cb58a102cc4463a05085960281daefd633a100a55fbfff4ed76016dc5fab64be227c4642eb4a61280d9e5053ac0b97151141cef7692fc6c4665b19f585e35a1e6383e7f3653df3cf14c0257d0312c849052330682dd3ab2259bb8fd27544ff0142c5b3e1d52600b5205e0710711be267d83b35945bc0e127b0d4d767cba0e94ee7376ef4626d178567e941caee3145c9ecf07558b5d43af2865310ebfad746aa96bf502dbb2467747442eb7bef6828a58f52cc74104ce869ea9abd8c2f3f2eb1820580a2f7f89a3c66ebb4d96e3dac6393f7fdef15e9de3794e10c355630081f2213aa7c14af63c21d7b2954329b546ace0cd438ffdfbc685b4a14682e227af8566aa352a001ed1e7a82f2c20fac9f8cdcce15f7d0008fd1ccafc3ad65dae5e0b0318213a0909a30ccc50b3c9d8935422143c054630f81f16f0dd163ff53a9ae8522ddb679b4349b8cc9d561cc3abcdd3d730cb34a3341cfb99ce100170eb170e02e5ec724f80d445b67e9bfe438527b987cc6f3dd72084e19e4156517f4c400546ba32cd5e59a1ee7dd31f7c3f6ded704cbb2cbb56d0334bc0fabe33223e6fb70f68c4d0b254be2fea51174f891f6d79d850f4450da97182b62a09a376243b830264ab8b1bc06770e3fb5a9641bb4f7c352f3d8c0a9d8fa575f7a7a0f70afb5901cf197eff191b64e1e02c1f5707e8c1d58d78d12afe51a7dff10d052067a11f4fa6e3cb8f402c479f6bdcdcc47b453bcbf1d9d221361b33d89493aad049248562dd97796ce8a40f406c9874f18f96f9ca604ab61f20f77611af9956f0e95a564202732c52f12c6b443e44472b3b5be58f892e7b0249478ddbac84165bf021bbdc1d16623515d0096173091104ae511b3c31f93e4e654fb5750176901a62ae1bc854b88a1d99b47debf4f3c0f8ae2eb8365b08603499cab214731631232d97f35616cb5922e97b5839f0b983cc9c4c1d8afe1c53c728c34186dc1fced42d94d08476443a979b0f71fa20c1ccfa3fb0c265b6919c36f9e83128ba8ba070856c2307a156d56015dff63811adcdb9b538442c99fae15988ff33a252a82ea3d11a9339972b2351208be7b614c3eb216ba36b7fba82c52c12b589cdabbf88eca975364394dca808e4ecfa484ad1897bd600b20d9241554bec72daa81106cdd1db053e3b3f38803c06823fd9dd0789b20b9f1cee8dd69a9af4e13ea218767f10a1d976353b5161f8c17933cd7cc1a2224589b98b510c8599c90c2ce3938184bee62ef48faf8e53a472e589c676f25cbe0f7882b454df2be88c119d07cb8935c69803cf84b3dad80046160c468e67999a07267c1dab9b7616802ae3146150a5ecf5e802980fa472a8319bb591b448e068d530c463ec08723bdbd7846e0d76974e76df6f6116205643d1432061c3901d6c9b879319c7741353ac3d0a3433ecc28eb1ce60108c4f518d6f49a859cf1e68d89133884a3dbec2f1b86bedfd01f34b1092788baa0cb46253457220544f7e0607c4fadcdc31c016632a495d288c86900c229bbf3d4049475d852eed77bef89ea80e4e263573108a03a900bf826c8e94fd102e48a9cb66b427cd8f49ff6aa2742cd708ea0677ba05e00243cd821151c61cc4c987ca406439d7fcd9d8e39dc1a9295eb7863f33d24bc130e4433e53244087367caafa4b6104bb6f98ec24e3c40763a8f1234aafa2a7e5584eb4246fd289e3ebe9e65c832c64c1422ebddf7b0992a548d289067916bdb36242f8cf0f19ea2a46260f5ec6200f7eb097d8de953adda22754e8aed724372d48f86d5e960e89489f07126161892889c3fa990ac0d94778c48d14aedb898b387d792412dc2b68e853832661a43e7264c56e9f7477bc1e7e9b93050ec1c423527885023b0e422dcd8d9f2b276008dfbb980d0999a43041642c04cf6f779bb57d7d7158ca10f417b1119994ee8d133512623a1304015c9a141475b83f273f0b150e8bb0ad6c35d1fecdc160ae0b71bfeb295c36926f6c0e599320fe4c2fab06d79f710e3be118876b88dc15b21f279ed33c71e11b89613cf0387b78da1a25a057fed8526ab09ebc465ecf28ab18c789a6746c004d3ec3c0a3e36cf436f162c92a55c2f98c42ce67ff4ee36c15a63ed16bc91880428f0f3d9860ec064ab80c8836db345a83174c0c44711cce0e34a788de84b7b0d71fbc1dfb7ce13f8d4f0340de9a2ccb4448a359bb9a16f7c08daf5158ff558dfc504da5d47bac81c932f04db8b79393fb5cc371c74591531244c4833af71e64f286d9f2766f0790624e5274a3dd1ef4e780b411905da1a2101d3e915879f75dd227399636996b25205a123ec20b2189552502f236b2f0b5e105ea3ecadc8d66200cfc5b65671cda49800df883f01ae246ed6abfe9927b30bfaf9cd284bdf4b3fc1d2430c4a0e597d198805a198d7b327c1dd73ac994aa2d0c0ae1c2dc548aac29ca0ce6e1b7040527c921b72ff6d9263441e29180e7eac8b592df498ba78c3ccce6c5163f2bbad0b16d400e49c3fda8a5c7415cb7be2a1e9330cf4f462a7dc7ff40f81ddd8b25a200ca39b666d1c3b922b95d67b082a025cb8d2fc646cd3cba86ca41814814fafa5a6538b8edb1089f3e36e5bc20ac0c74b0fb0a4f95b4900948c8ce1a21105fdf8bdbe9cfe7fce13f522a215f685144827d81bdff9e3059bbfd45b58d9155c60e83c1d26ff684f0f5ed4c016256ec682e9e30e4bfcf98de6a9462b6e75cea60b06f4c78914596f11af00a850244804b9d19bbc57ea49781ac6b06bb90d7ddd6b5e862f18df1da43de390d41fb79978095be1e376aacaec808470b678065f17b64d84c59165d82674b57004197e27b89bd85c48b43b400f81bc0e7b8f303aba7fb8d391af8b6f3522638d6025fc12856052c8fe3ac7642203683cd96a2fe1fd108bd7c52f413f972f8d98a579b2912e79e686eab222a40dfa75d920dab3dd593e8b245029080d057d7d8d52443c307b1aa26855d2d7237b8344bec6667b074d51c6567207b2f88589354be540cae607f897b653213cbfcbe8a4f7176a2373b492cd20dc4d717da111a437ecb9db6bff57c543db334456f6171faac7d09a8d4577330003ba6c3c6cf2ae587e386c238af3f2ff05abb23cde317858a68123f7e662089780b8248042ff558ef9fb6e8b7cf42d5835c68fd13da52b73392a6d967ecf0d5e34ef165e21e4e5bddcd4e7d6db35f2a82555b3438a43a6be6283f3c8411afec2e3851c94bbd30e441944e9c2fb4eb30175ff2976f21214bb5680cc1db9d76befa8ae1879df0a30df2123d8b5a2851dd1ddaa53b5d80a92b91ce01ede192b3e8bf0f0178459059f286156143138e19ed1049490ddf20cc70b78eb3b4b776118a85455f31d9be7f9698abd469e7416ab8a790638bbf0e7733a5dba6cf571b6519ba62cb59eee56486b181af093fbf4b63562c0616345fee7068139410802f35bda24f6085e03d828a33c173acd644e51457744d2527f22f462614b3d9e1f71e31ab94a44880445b6de925a2ae4eaf04da5cf23ebe85264854248e3af040a453f00dfcd56cc2f25a3fff4f8f064d2ba4c3c0a861c2345d16454138b4d0c9a246d52e91b6dd21dad2418a228f693b61054a497308e986ad4a8bd2142422a4647c4252e7a6289d2c3ca789f5bc7d020998d09d265fe13b758cf493765b3f5dcee6a0673152edd6c85a894500a23b87b406763b51226a31870525b20f4f93ef03eb7b011d8db27c0517f94f2c1f5bed695f8cc58e4ec0c8bd9c2c5063bdaf6ccb32eaea8cd961d5b917f0313fd85557cc0d81a56aebd14c9081e2bbdde13ee80949f420ee34b24b81ac5bbe519982e88d2e9b99babae503d0901e1cf3e7a8ab890b0bc8965fdde6e6e9e61f243f06db23703e8976220d4736df92300ad4b6b32c16a26fb3090d4e5efc3d2cb2b06466312ea3018c8337a6ee4a3df7d0c753521fa7f475694df7a0d833795a45b94b942945b339168bc8859a2af27f482ee2480bd046f9e9d4a98620224dc50b14b081596ea23d5fcecae74f29bf70df259e848046d3cfcde99634870053d4542a7b7c245b4a80727a2b29d8025b074eb59842e4ba82db3ae72723590b306407a1b84249686d1b9e51236daa413429718c4a6457b5044fccb0e8a037e7a079c1adc8cf1f3ecdf310c9f7729936b2e9324c745159ff56d547f08a77dcd80c77f7b110b6fe99b3394b9373ae622a692f919beef581163292842528ee03fe6e4d8b137fc264792f7903a9624cb2fc8ac45f4d52a28a07322581451229149acd1c580ee592f6cca5945dc889c98609e3c23b0ae1101a73ee2a5b003995ae607b0442876fc4b43914934c61540778032006923e4696c616cf87f8b3bc15186b2c5f37137305d91e396d4dcb602d0cff05f86b0402a02c1bd92029c1d884e13069d42e44bde512535dc46bd218f76431b21e3e3c20f6db90a1206f9d2686c3a1cb0e1e024f68224d2f92164c33975440d66c7c721b7b89fb9d587a203d83b15a43ffe125e6575419369a635c68a6ca17635262473ed002939a63c07e2dd0c944afa082d0982f97c756e4dfb9c43841b2fea04a5699d38eeb7d463863a401d8c25e44ffeef74853de8a6ce8da5f03fb85832ca8f412637ce8894069eed36d21aa699501507735bda3538f55d81b447b1b4f20eef00b40c892b9cca7dfb01ff3789fbdaed916bde36e73d558b9d2b1b042900b6b57e07395d97008c0961c243aff0c305d81ee91dba4a738c87cb44443a2908029be1e1d4850c90b89f74b2d905c866f672df498084884af07d16e18b10f7c5fa8f7d4daec1a1acdb550708b790e7188456eb5bc063ca721f2cb38fcf24e6e723c802a9c494f24c2b9a1d120b827773dc3b1954f7ebfa1c77fda26135ed997d6b0e301c3fe40b4244207ae792079a5c85e4276e12453538f056a4e46f1f676d3841239c5b742c0b3b053fbe7d9ff238739c86d735aa69a412f318146d0c686d3ffb0971dbbe0da44238c40a39d70ad2dd20a47c2a8efe43be2eb87f4c296d138579841ced4bd9294e0bfe47bf0bc86b3a690442698b8ee1f8d0a1e72941d17ade2a193e710a1af7583f8a772d12c8440efffcc3065a4681003e8adddca26d4186e91fb429edb968dc231224eaf355501e6eaa783d7dd4d01429c5b295a249acbc8543f1bf5d27731d0713d9a9029471036acd92d971fedbae7fa8b9c995b207578f7f665062a576c17d3111e4e9ec759c6aa1a9be52b217e1b3e92c6cc8ef6b2ef4b6e235e58544a3c92a55ab2a3a9f244ef926c7394453cfd9077399f885c7f5f9b132d147786e032a878598bddbf3ceacadb0455d016089063da30dbf8fc00b76c12bf943013279954cd705691067dab2bad94c20544cf7ac3b10947330e8101d9fdb3f98df6afde8104d60e2d9db0e331524c4fa40849fb87a43c9b9059c4d7d4fe03e0f51a6401843b4b8a99b3b1859e56826eef759085074836024d3fece4fe3e4302dd9b84889f42bf182f4ba77d9b8e808d13c33a5ecc8ab6904520bb6733ae848bd2284af1f157ed5a351a7218d7d9ef71c76411ae551861489bd06ed60e8ac9469dda50a686253fd4054910b191097fd80c27858b01ead1bced12dcd816cee1cfd975b19f6625902a52c9968621178dff1f44f64bf33df8832ab2088d3d910684eeb180e6ebe822d79d097b563a5003554ddfdfd868075171956b325d802de2ac3a2412a6ba82b266f71044f5c40ad6f0a818903fce81b1a0e507cd75af19e09f904884a8677a80f358ee7bd33bda29baa12ba8b2610516ef633c44636a4a0ca0bf867d5be90c062fc841a7c32900af838c23c0e3d8e331d5a5150449d3541ee862a874fbf5ab6b786bcfa4307e2ec29ad7f366081ab70b3b09389e32748c23c9a312742b871d7b0b1bab8fa1b3a012b45f94b4b924322095879c82ff937bdaf2941c37357074ced6aea44799fdf7863fe2f5dfdc9c2f28a9f2c05de6e1b7c7b063074aa82a0e2dbff4b29d9c37b6b595e7157c44069173c30481f36e4f552e2b8a492afb7bd58712bf4efdbe73021a33f5901ab18a4500d2c806bb2a040efae58449aa71c497f24aeff88627ea86978026aa198a7b191a06992c8b05fec19e256bf59000ad5ab8cc3516a4716495941a24fe7ddf11365b2eed62a5922178e63b3ac250d7c5b975251cf702e6e4c075846b4eb85fb972254b3c45771236512ab4ffd7171beee13e97091d8c27659c97e178ca3e3b92c37e10dff37de782b067b0ebea21ff84b7e6eb7dcd2f2744fc8d700e1d09b0c79d82de6ce5aad6c3c0a6970004af40c90600119a38d1355e9a04d21081c916ca572d0726ae8e2d87e56608835969d8405642a5f258622c9a90a3b70a7f1a1f39f670d1a0bde7aa90216a30c7903d2a0f25d03edec1651628dfc9ee07bc1ba116b0e251af8296cb42cc4c6b25a640bb89183527c6ca973ce8a6f4a71f7fdab4fade4a9a402c1f5aab869a32b10a706d394c2170fc8e62262faf50742247667b0f334a5cf6daaa914d95fc50648e12bddc81244bc1eef85be6b4eb2dc372fd27d057d6990a99e8065660af151bd1a5b450bd66f60001a586eda04962b4a004c98183a2cc79b870d8c65f81ab3493b49f4e6a2e2242f50d820b4f5d0ef842483c0b92533917257b5e66efaeec05e28ec4174b3522c97db9e8933fcda211e1ccbefef5daeda86f1517c5137c7012c0673f54f6425f6ebf40a7f7f57f0c19b2df3b678d40abde6348eb4377521592f19b61a6ae4bf731611180608eb3f13c4d17dc689a538dd373b0a3f3c93c7343a8a35f170e73e350e33ba9d4d1e4b9cc38a0174cc2ecb07c5ee397b1e7724d994b1f72af460f1e7e90893ffa7feaf63b3aa2c263917144fe03ac6601dcf7158a1ba9066ad08acdc5f02588e865fc95e79a84326a05029cd40cf22f6987daa8bcb3bbd32ce0ed65cc6cca8c3fd4ab509ad8f1839860e462e297b850324917bc14b25a9c6c6ae1a4bf1a4cd2c6e662bc419f29accde6d0b4ef61a74238aa4f0777fe51eede0a8001c60eb7cdca21cd2e07ceeb0e69d8f4c78db5f28cf2540f49116be40bbcc7acf4d27e33c8a40e1eefd6252c10efb84f85bb0c3e843470c3f2672d6dc921b24883c6ab4a7d155d4f85ae849833e1da9addf2669b5a663d09b5611e7ea508809f08e69197b2e200a820e31a5ec9fb7dacd37001780f046e10e583992d00e2479c5239a0cec7ff04d8e6814183d3e44e82c44059899d33b0b0a79877d8b1c3b4d65a0236d9443a6a54a2e178c33c40f5ba42af020250dff35b0fbde46f370d6dc12d5b3d4238c156cc7a47f7870157888d587281fb8ae7463da61df22cc4941ad05f6f0020f33294934e03a5e0a08c5e1384bff0ed9456c01573d5b37ad089b591dd2717c82857555c588b5c290756a415ab59635bc31e75125bca54cbbffef48c82753a56cd02e5eceb8b82b18f9d17304f790c2f19bad57aa61d28823aa2f4bb79471a8341b813d68ed7f2f66ee4da283bf1cbe2195a74404b15db83f1a34b7fdf31527c214a682a03ce2d22388d9c7cf5cf8c38babd81b3403f398a7a5789ef2983baa0f257464f47f4b55b35d44f5813c6cbe83422ebfec8139c033e57eda4186b28e59450b7429118cfae03422df8b408099c200f5cbd857caa2dcc8f122253f8d345119cf3164ad30a518ea77b30d628519f74dc2b1bd9b65411583b065b5a5cfa3d590493cecc85aca413d5352fb587b741802c0da73caf0f088b5816155ad0b644267f6e222c124b7dc3fc48fa7434885661f14bab507d8fb2eea4ffd7ff600bba62dbb20d8d13a2b3fbd883a6d57538205d87b9254a23089cf091ca822ea9d9d1cbccd7b8c017a0958b07eb7fbf771f472e1084fea01ff5cf4c6a541aa99fe82e5eeed94a78ecfc3ada368bd134ab2c55ba845cb02d15c666c65c075633d95b3cd44b01f05bf39818e150a9afc294e606b82d0b91844ce8b752d3c85287669e50e4430a79f5aefc9f2333ca0d036e334cb7765c03091a50042f5c6bb8df479cd52201048895233837d6e9a3ba8df650d199ea64eb8372889e938db2109225144f64388e7ad03db63cffe91204e5a077f314178d25420503407412422415d19e9268a4298570db6c2180f5b20ceec312e021f7ab0f920cf1b70b7e732b4be730018845088c7d333da45b2243119e56b2dcad369bff713a1ee9e2e24dcf1bf9bd061b75c47be430136a323421cf0fb757de81b5b2033aa1ddcc655502c0f3e8a63aa15ef50ccb9c66d80901e582bd22262a29715b76a195c6c31606c9f412f2d2db93bb759d63cb09c01b9e8c5f1c385dccbe558365bd648f13424f86508a2676d78155964bea1ab7a4799a46c66aabc2517579c4c86382fcaced225a15d0eb34611cc79a7db55b8c71cdbbe8d33833c886091ee3d77ba3fdff05c65a0ac3670e8ad556c2fdcf97dccf5866198c52f8dea88daeb4157ed6677e16c87628c4351301360d90f4b688b96da891c18b0bb8b0db0fb3ad819cf3ab6ff57078c0d6600267525831bc633fe345aa8b3b9413a25c927e0300aa4e64a64f66298898f627f364ab4efcc6853936e44fb12d401e2427a73e3681c04da51b97337687230680f63c7294c78a09b9144bde246cfcce1c5bbb80acf097de3567049f0c72470e9ee2c3463c864d30fd6b69128b6e4b4dd1fae3021e11dadcae35f4142138b748975444f1d565bec4c1a9e5a16ee40f92321875988801ffaf4fee7eb8da605a711076f4e53ed9cab6fd01c69dcbd95ed0071c0fb0a37e79c01c934ab76f61c127264cca3f9dd64f1415274b1516e7ece2f42c09a861011638f6ccc8ab253202c03123aaa7dfaf6a68dca6ad35ae9beac41a3666a55d1227137921f739b1ff451c4b271e44bce637ac39251e66628df8e1ab8607bbc6efdc561f7dd4214186bc30d7f8764d716d6dd669e4fe816f30f401f9d742a315e28192f660febf689460ddfd05cf17052112dc5c412b4a7a4a7461773d29af74adc8810bb395b5f1b73c62ed49f0cd0495687cd6abc618955a5906935fd85fe18576574766dcc930833ba86a7d3fb897903392d9d1589fc2adcd3d8d6ecace5b8fe39d84b44c3729bfd4fb1838fec26665dfe6dc202d53781cc2bf4bf515a59a981843ff9caa19e935c357b1ec36fa31892343f4d24d69baf5eda8fd4958d687b602e774b896c9a747c9d581068f0f7991976f4351a2901ce579c5703e06afa4245abb446535d1abe62969c1dbabf5931cc682d9cf5eaff84563238db6496d1b36b315eaaf17dd91a18f3163aac87b589fbec689142b6ba7586df0736048cbcd99931de177e020c02a75b86b385a72450b6cd5f6e7f05beb97a90ab27898b107fb296df4a3fb4b7f06be88ae9b999b9abb37c690061b598ac7b741318070e79afef81d3152a6aecd664fc342195a520779caa39e87a94db72db2a9c38d475810bb18932791010bf8ee4a0bd75ea3a516fd5f5e7fabdeb9e49db5ddc4f2118b6f20a52a3a87180f5295c517128756b78393521f49b555476b4b7e38fbf5d71e83a2e9618d55114f6662a6ca8106655b43e0cf692326c485490662db1a3927c25eab0e6a77d768d41d088a7d6661fb618978261c78e83667018d711bee1625c8a86adef0ab9088890495387ea220c30d6bec32c5c0e28377f4637629d07343ab00338071a99265e57c30690033fbead8c541970306fe5c8b1f198af0da656dc17e806ba03031207b2ae3e76310a834cac6ed1c82e87b8cdc232ee716b865cbf7f2a1e2345ab8efd2712411a62200dea92275d391a473f9d453856d861035d90460735a5705922f641dc3075c9fc79da412e8d9686396a4f0bc8cb032328ea82e473827a19b87bc075ba940c9fb265c783b48d69095a0a8bb2be8aec8e06d19e62f8c2d94e0a54a0214f3a4118f4f46db3919d3c47de22dd4665667a5772308d2db3ddae232e0d72c6a3bced4838f26623feeaaca57b35f25591f2afade68fa3ba01fcb69ec52a615da93b8cb83d0b0e3f1810d7257d394a65378a37e2610815b2e69c5da93efa5dfbaee796efb310b32c1aad4666fb0a984e8a5671abb45d39bd970464b25343fe8a8bb44f0d92df151d94f8f315e7b7a3c4492da36bd6fe9e23b0c4525a8ceeaf5aaa02c4a610c5dd3edc331588a56af9098e7e40217ae51d2ea46144fca6df98184df6db0da418348284ce282e8628a689124b9d867c025c9a08549153982cda3a4a30d15725351d4c3c1da0e0ee1a27e105662d3005942fe79fcc7e356829137ec9457ea41d92b76347f70d73631600e37003570f75bb4b08375c482e85ad31755884586afca571e9cb6fb1c1165b65744184af20c1e3a20fb7d78dfd60f5c0efc96015d931aa90cdc3fd9b7d6836277db8b2b9f38d0e14e4cca4b2991f43591213f665a99dd0982843be73f8a8451a051194c3209991be0d85d71c507b9b2867d47df4d42bc69ba618404f41f5ea5572fa82455d0d28acf5784216acbe510e9f9deaf5eeadb5b2a73afa02497d9c6d026d85ad0152a98db1b47882086303d5237d75814d9f606e782bc79c5045cf121f1cb2c7fde513c633babe3b764c22bd1a13186034fb2d5bce2304b7100394eb02f40fa74325df9185acd66dac0ba441a21629037870b00547b5e6e63938e3e519c771293d2dd07688f545ffa008568c03538f628b4440bf1c773c64ee936c69fa68188cd44a16660046e9be5f87da45252f1beb694797984be54f049ecea6acd0e27d752a72b4b407beed62776ad06e09da22d8151138c02a628a74e1f6969ac36a13c0ca61ad1abfdc87b60e88842ff9f8690987dc07833e87fc7d45eb7ec303b5d0441f173e4e8cfbfc553f0fc8a30faea80ac08b911537f963250d3964244f2285f3901a5f5fde34774593998a69219ed4a84e8ae20e96d4fd1b83ec78d8679e96342407afcaa682cb7fbb19bdc74b15ba5b583a4ecb0abcea9f19ea7da650d4f39d7802e828278acc756380b31880d6a461e050911f9240ce830881210339bc56db7fffc34b7c8d047ab5725361236c4495bd564cce051aaf9364e7950e12517ed93c9f9d41f1feb6482980c72b7b0aae984d9934999847cfe3540d31de804dccfc9b29ed5bdd1f23e3c5ed11390ae8a4a43c78afea9e1ced2bb4f6cf3f6aa2b4e3baa09eea59ae685c0053d6b5b647f8e21364700fed39b59dff7a072bdf1706d7c06175bb2b6be9e16cb340f7dc9cc3875ac3e8838a631e27ad0bd102a18040fd900001e5c3db876e08d8415c487944e5a4107b826cf987f0e9efa16ae7ce9d077343ff4070212e2c9ec09c8ac13ce268165d4faabb8bbd87b24e058a47edcd221dc783623c3ce4c0907ac8bb59b878b6df9a3678b62de24fb7f0a9f519dc8a35bd6153cb843817420a5d4f3b350b8267d04142fc7dd0ea61c1031aa2f803b40fe80e7191eb41d24161ed496eb587ab7bb080f20cdf5d6bb3675bc343881e62f8d07d29787c0f13d9bc85aa5b03888b040f3eaee72b4fafc9c68305972748a7a78ba754a3ff20b41052407988d72c983c1b27f783ee202e523c4971518c3c0ad62cfe3c0e27b920ece02c0fb3ce278a87da9a85c153e5443fbcd883597f8f8ab6f7c1f207d40f57047101e5e9db220302141c1e219d8a178f90358bba2705ee22a2873a1d99b81ea9b414f71e6c4b81381c84ca170f5cc36028e1f473dd9fb553f710969a05cf992605880ba30d15d2026fdc180c0f69360b801f76cf2ea876397c78604514721e05c07dda37a2ae84e06a3785d14375621e8885f03db4c2a5a854441554d312a04418d49b0d0f3e153cdedaab0f2f105c081d844a85b82078be377f85b8f3dda369f887d4f95874b3431c55a2e7049acf48cfd3d6fd611b6211020571c267850f9b0bc45f1f0b6f3be41edcef3d674d16a0dec7b41ba7102ba07aa8e77c323c5adbe23fa8d879ceb6287c1a9f026ee95b233d8e5b701ea460f7606be81ee07c100bc4c5ac270f4e858e0755cd62d793587791f2d0bd93e2e0a1d2d6180214e23df268165ccfa8389f3b4f649b059ae7eee20871a1c0238f63dcc593c76513a27b5c4fb2bb3eb84060d6830a9f879aa687588640411420101ac48a9767b4ce67be2759f3f54145ab2746030621be011a3ba0c2ade12147b17cee534f871a8de9a3523b8628404041b841e842e8208e0a3185a2e7eb5c40b821221782367a1e73fbc28345adc7ebbc40bc3c7020f41029104884302bda533dcd42c3a37539103b084b435c1078f6e354bc7a86a759303cbb7517713c48381557cf96348b340f864e0a089e0e97ee830a160f0ccd68883cf19e642d6b0f1635cfa77b8570412407c44f9de7ec1440943eb66469b1a9bdf9c36313609bd7f8100ccf21a98bfb45778d4c13306e9b577a582f5a2a99a40e481ba90597f49159128f368fbf2e7c50d56f4845952a913075c4d65fc6ec26f1acb2fac44956333ab1883121955b6a09878657bf9b47de9baa8aac0b644a9e3c8702ebb6957cde170af6ddfb6eb7a08e4b823d727077ea78560d7b0f292e3da6560871fa830ad11e1eed992020ccf14434cb87b03e58e8dcff92882fa67be1d63f8fb3eb3eb04e73dd67f1391dff14bcd92c323d5af71c889f7b0fb32b82a8f710501017fff66c34fc83e81f2cd03c55670421d603fe21566c7930eed3204281f774a959d07a864e0484cf47ed743fc4a2c1273d92c80194d202cad8a1615f400ec29a0ebadce5abc1c2162cf391c8ceef966dc54cfe9a87a6e7f894fc7700cabf9a7fa97f2651d245a1ed5fe7af98f0b1f9f192828b7fc2e284dd8b194637a37bc050809657214078939ad84bdc18741466bfad6db9f796524a29a594019505c5053f06385bec378e7db6e6bafca20b4ea316986f5625d2ce2a93ca6cd2fba3b19c4396755c3ddfbfb6be46f0c538b8c1e94006962f7d7ade407ad079c55456c7a2ccf2f7af12176ca5a03a755debbdf7deda719bd69bde4974b535c4474663cca236ceb9e71ec518fbaad6eae5bc71a95ddd365de9c4195b1c167412d642c1771d3bce5733d822f3cd8ff5bafb63d988fed6c6eeed9ee76570db7256b9f4b64db53defbbbb0dd66d9e70bd4fd4d61177049452caf33226696c3ec6f2b1bdd6d26aadad96521abeefe5e8c3f4d565ec8904123f532d147cde3ae293b55ee7e0258e0cdd2f0d72efbd97d24d2935e1f3fd6d974f37dd74fbdc74ef4df7bd346ce7fc7a520655a954aaec2a95675fb9def9ed1cb75279db03797e771c28c61ecfa24cb1486991bad2022d2faf4c75793b85e5250c5fa94dc82eab8b393f1a9bd3032d6f58535d8e706fd59286affafc48d049fa0d51a60b76fab14010680cc704469873ceecdde69536e06e5a6f3ad42d1dbe4b63c3b785a2ff65bd5a3a707023a306855143af4f9fc264c2acacebd092fababc790d10280c8c3d6f34e473de6d39875b7b076e9e33083c8ff3b6ddbbddbb75f8c44fc370ecb01a2cadacbb2e6126a801c2a6f596630347d0d2250b965d85e6d4d4252d1915e5a0d94fcf4e093946c03181127ca2c472aff6768eeb77a3415febb5d6ce79e7b45145b3e929161c5ba22808391bb73537a7d699e1081b54f2bc82d57368afd6593b1cd505d55ad7aa6bf8511773e7e0e6d460adb376f9268eba410d9a333d476b9dbd82e24efe1c34467d041c3446a5d7985715d250fc48b02009f6716c899a29d3dd32587e6e79798589da77b4e5438e17083568cc897a65fa8c8ee66ce687c6a8cc8412748e0b4c00078dd1eadc03c4ea98d21caf5f000f9f8863039f7019d4d66a55aaeb5665c2abb655a97cefbd555446cdd0250ed480c6a8eaaa6a10d586e2086f954e7805ed0eaa9eb5ab5a6fbdf57a8e979773eb475dd4fd52a94251bf0ab4dbbb71256d71f9aacba8210939d573ae771564bd684c6fd7cbe96a68c89f61cdca75acfbcaf3ceecf9bdf25c7ad7dbc4dd814a27dc82d5cbd97034a01b9c0817405d502d83049fa86bada9a195de8d0674167c8122d4131ed8562d203e29a794d2efdcb6b96996d6534abd4d97d8cb9933b457662d379f33eba9a79c726acff17a49a9d6a1a654674da9de24d8eaf289faa5beb9939f94ad315f07342683c6ae069b5e31b6b9e8393548b0df9ae1db240e0eeb69b2678e031c0d7c6edf7969497dd6bdd32006e6b7b87cd7c59d17b3cb8957aef32a67a7d73db0b5c477bd9356cbfdf75e7f713cdd6ab5721af25761cde73a2bcfbe0ab37fbe39cfefa8fc03579e0ae4796fdbe738ec5aebbba7458209a395c62d203e2cc51dcff17a4c252861ecab3f4031783f7b21e0c7184f3cf174ec132433bd1962eff20eb1df592b8a52ea432beab575794e86a7d4f88993e8abb7bc7c380c59c02f3aa3b37c4250d04f6fea9c75ce39671c35259539735a29a594d9aff4acf30efa5de5a567e9d5cb718983c66ad40e34c089d9bc686cc67cea955ebd7939257c9e39e72977de4119cbea760be28b17a62b2888ba02c6e8ca973063a05a3d601e8e649e077e32ed79e10ed22ba34e26c327aeea6b95f7b66d9ee7390df99ee7d7f3ebde7595e39def54deee78be03a90e8f2c11da832faf086144e5d44a9d6350e61e74f4290f177ab39c0be48beaee044e26eaa2fa96446346b3a8ca275eb0e9057a862fa4d5209a56139fa89f54a794f582c56ec4edb9e91e28bee6af7c821f4843fee7d4ab51ab7f61f54f855d85dd797e0576be55afef369fa08cca6d61c61f0ba7f2f0d1b498f8c49818fbcbb29d5b4ac3ce419577d7afca5720d65aefbd7758e3b9cef6ecdef6ec3b9434b6aff33c05c5fd74c7033b2ec7a6a08caab2d405758e56249a56998f7eacd7cc51da3ec1f9d6721ce734baebdd75aeeebce672e5790de6d89f032f5fdea024ece8c8d577e8c8bfaf77e37a9d557b2158a7ddb52e5f4caf56b2e3d574eb7af255d7b9ee92f24d196373db6190f30dd4b17aecd373a8ed1473e4e5abd72c557e3a76a697cf23f52c5e8e469e7e677ef5e9da3b3df1e4bc9c396706b76b2975dedcbae73bf637c69d97833196f285e719e430ecb3d69e6b6fc6f4ca6dd6c33ba77611dfc08eb1581d679d29ceebd9981857e7c9996e67dcdcb89e7c3a563fe50bd72b90f9ce459edfc2bcfc2e8520222f595e3e5195e77c4bc1e8bb1b0a435479f76d960aec3870bbd7795bc25e056e5eceb68978f53bec6fdfb17f5fdbe675ef6a87e2e69e6f2af740adbd1b9c7721377fa56790a0e3028f3b57cd895d85e70daf73afa39dabba8e7652bed8de71607615a85de579a1e4dc7a3736efbce340dd8572c3d786373426b92022615e3ecfcb1798babc73d5ddf0fc0ce9bca15287facc5647c400cfbbce74ea34bc21a29331bc7cf8722442e577d8d7b17aebd6b77927d6be4dc7a0f64d8712f6371406e6e9ec9cb3f620b2f4315e8e43c2bc112723477f73138384e9327bc652c6d8b13f5d746de09b2fab63bba59437f285a43a0811e2af4b1ad9ed046799c7a038c519b30cb5217d3a0d19d6ecb09ccfb0f2bcf542b8d86bb8a3ce1a1ddac83a58a75214300ed2e5adcb8d52ebd5a8384e45abf701f61d7ab322d155afe08c9df9d95d4b3eea798897cfce09c1f2d6edf60137ed8c1acf7758edae63f532d4316f70e18e49bd10accb70470d674cade907b07d43633b1346c1747225c3129d5f650cf992ca18778af52a44f6d6ab8e9631aed7d5d31bd56da516dc71e78cd255211e7b96a1cb5f9f58bebaf581ca53df8aba95761a1be7353ae64bdf617fba8e15f642c09eab0cc55a57e275126c7c8f01ea9be7cda97c215fd0cfd777e6e635d4b13a9b065e82e2e67273eadd068a539caf3d1dabc780942fc4ea8550436b77cc1df36b72a88343ab437d67fed5315f73d33ae9ace72062aceb71267bedd8ee5aabc4c1f91ee75bfc0c35a071d1f0e1dc74a9f7da201ee0abdb9baff3abbd32049a6ba96783863be60c75b06397d7b391430cee98154f8c4327290c1dd3e5f489d6f51864c7fc1aea086cd1c10ef1f0ab97e39014122d8c434ca3100d2e2423e773bfcb82a12a7a1c7af2711d49f172145ae1f1cb5188688ccbc8a8c80a882880021123584196440bc0ac20a887fa720cea3202a132fec8e22a22c5a30105eb0ef31bd4020a1f155e0092c3931f3d7e10c2837b04111b6404280868890d66468c0984b06c23101d845c44eeb031088757bd1c83682f3a4e8783ee664d0508e410a4e664fc410535a8200522f6a9db6a02222e21174b6078e243440bb63831820a37ca3c20640452f2fbe508a4c2285b1a816478b9846c112ea0ea7a042afad708346b0263ac4377bd3e847cd2ad4bd7d0675dfa66e94dc6d06edd9331b2678c5d015f935dbe0e768acbbcf45870f91879681979d446a09eb147cdf583560784c1e9f13ae4e0ea212ba56e3da449e826a40bf9e2ea69fca840ba908f5d3f9feba5057ebab4daf5d389cbc775c2277e7407dcfaf26587c5e8a5db977376adf5361f9691b49a58b1f98342f140290dc2160beb4587e8100da24374964198c3e69cb018944f94b4e9326cf89a3ee9a4202cea1aa19b962a330eaff701f753faa665da8dcbd685c2985e41134aa0314aed52387ba27ce25ca24b53266d97afe0ab09dd62e213bd0490e6064aa5a4f2023b32c6f41b114058ebe91327d4f4523bf992e1a6b128235a4fc61fa817c0cbd1c7cad3d8cd7e654f907d8c85b02f6fc8ad37e4cde49c472fea26a64f9c5193ca9c3eb1482c93caace234263565d1a0990d8d49ef817a57cfcbd1a7cacb2fdf75f9a26f206bd7593028ad2263f269f8d42063a0914fd0cb1105326fc3cb11052a746a56994d62648c29e6e5675f36dc22c8185304f9a2ee5a6db5b5561912c91893e8659d75d49738909f8c6aab7c51d2883881d6ad689d5e4b88a497de3ac137bd935131b34663738ac6669e455ec64f7bcbcb37dbe11382f64889540c0d436b13cc3767512c2d978b42d12e348ace17757aea2a9a68ec7a34e6df249b6b6353e9b4d1aa1a1b2f573fe79c3ae3bbe98ced105b7354ab7d5fabe1ae569baad56ab5dac57aaf58b12b38f35a6bad354d7f95c39baed5a66ab55aad46a33dd168341a4d6fddbea082277edbb66ddbbc68a9a7b3eced5a9baad56a5cadb6d1684f341a8d76b7b79a4101a2f81a8de3388ee370e84f7c6dbd6b6daab66bb556abd19e689b5669341ad84545494545454545cd9cd8ad170d06f708078af5619e6eba56abd56ab4271a8d46c3333b9bcdec2c2a4a2a2a2a2a2aaaa9c9a9a9a9a9a9c9b55f43be178d0d0b0f5b6c1c1c1c1c9c188ea85ad46c369bcd68331a8d46a3d528a5b336c39ad6dff77a6d7a646331f7d78bd29557db749366eed1778f56f748758f3c2e6a9baad56ab5bbd519cd3ead2c4d65699ea5554bbbb9d194666796c8ce6c602edee4598ba230b0941755a3b8a82d4a53bc9be651e7c4b9b8b7a6a626176fbaf04291606b4ffda1a1b837cb06d673f3e285f266787fc30b4563d4c74fc43d5098c5c599c5a6f21e8a0241488848c2a90ef391439804f198c35c080f20c7b14a38fd58dfeb637d9f9529eba124044d80080144982c97081166c2e8084942a9a0061584d060e4089621419ac08024881844f081a23142806a92234349a03819c6392779fa9c7d3eaf5a8aa030937c88f989e242a40927772684e43aa2870b78081912907944856cb3880f2b0208808ae8000a98442972837891612022408801420a0e3e2d0c0dfd20b1f0011f40f840035107522094a404410c21a5862b4066089225c13d92943065c9d21312fc60e508c89ccdd0848712b324c6250ff08f21ba4711631329212e438c5c1f1eb057643c286c39fa213b81c90e526414a94a8f8b6573cc9c65e9f9e125c90f30290021b132040490a41f84cc232af331a58ee60a53407ae041c49324c6dc1e48822a122641603530d154a0d24344131e4a50243c80b0bd3f4994b0474bc872121660a422286cc918fbc7c3636739f141aa39470cf5341103f5a5caf50152876442b6540984921382b8502d4f0b2fa8208821424680822e178526425480249939671eb987181f0a8404eb71248948821252f493744fc0014802445b587074a586a916dc9e9c0408215ca62d8354f4336bb6b4e0042d6431e2c70eb60924314247b5077a9338308484840a9029c184200426f82202a220424c20191dd9243f62929c50bff8d025a1168e404529e269884c121f44485428091eb24f66658694188250c24a96142c91b4822047488ee8a173ce328f39ccb920ec12524047588644c720f9f87caf8ff57d3e3f1831348352830f30789095f8ecdf109f8f6a3ebeeff3ba03121142492616f3180999c7475f7c5260998f0b5843b979661de65ba0dcf0c4e485224045d824ae12158911690b90e7f0669c73ce39e79c5f477c396fd761ee32eb300f1de33cf479443284ec55b3f66e3774b6b34e2e10fdbcf4ec82969f2e5dc85beed091df46be905bc8727560be5318d46154b401f39d8e2b2866c7fb467639e504eb8ef5fbd66f87bd1ba195129cdff50962d8dff7bc10aab3280ce995e2278ef38de37c9b9aa265995a5e3acda6f3dd3ea836b6d0d66cbe67d07fea7d604367fd83f64cc3397f0e696ef864f6796d769d431bd6e49c4cfffe705d9fe0bad672448bd409aae79fcfaeb3ebeaf73a468137bcb1506c284ed86f66a130ea4b6f793326edb3b6dae98919ada3fdfacce7d9d0ba86e3c219f4b377f465d42c7efb05c3e9a08608387294f033335a9a4eaeebed23527bd3af2da9eb68cf2eb230de338bf7c11c5b20e2f4a7b30d1c5a3b65bd2adaaa288c919797a3510f0b5afe823a4cc865ca94997a4a372069d25317797e3a0b4f4f7db2e0f4d43be9d10fa44fd7919ffa8e8efc92c6acdf985eafffbc819dd2cbc343a9f439c724bdfc159c3a8d3747e50bed17dc3406fb0a727ec14d06756bb75ce7cb17d5afcf0b8adbcbab6b68ab584570740305a33614a7b3e056bb39b157306b9f200eecb1eee025a684ba010e5ce50beaa26b4af50e9e8a381787c668ec463e8e098c40fd023246751943feb5d7ce68e824c5775a3d1a99bd1c8b2c8d2990794d611411bdbf1c8d4c7d6777f5eebe5d6680fc0b8276f1c6c0fb4eea565f877d8d0dfad4775440e479193404ec3414b70e76eb2d602f61d50e75d6b1b41bec2f282d9873285e71cf10ed0c6a1d7bb61a7b96b0182c952215646ffdaab01453352c4f5aa09e9e68b368261d4da24934675288a9af6e6b564a0a733003d7ebd198d8e7e3506a70e3b88edb9beb3c956aa5da1fb79a397102c589cde250a468b55cadfd52c1a95051e954e15241435343b36d56702b56543a57d4ac60c1e20216db410e042b9da086b568914106db820088d958acd2190bb77b332c88c187c1b620acc360b7f068cccfa0cb20834a6706daba09d65b68558d8dc7a18881c74ea1de86e274e933476d22c0934ed2a0110a19f972844286ae20a3183d8942abb55a1bc5cb8e12c68b524668b58d7c5b92198ee904860185aa0aab03c1d8b405c5cbb1c9d544e625535184c562b152a490c254b3abd8a8b0acd81394c2658252be5c2065cab91e167bc58a152b58b0d87e84ad240c52c400dbf3851c5abcf0438b0d83c1601e0db0450b2fa7d2bc40f4420d001e8fd86a888b0d2900295e8e539a08604f704a0d2a5e8e5342f07a394e919a4266003346ba172d8a91100044794224832834a016268812250c110ca294190a857e8046823c898f0b987eb080a1c78a2a4336200052b38588a66908222a9ac804bda4c8865c456cebadb5d63e7df6e528654995201616145c6627a47c199a913215f4f5fc58fdf0a14a2ae2c590c2ce6148f7c20f41b8176a296c5378084d1912c45a6b6d0da720f9c0539aa470a7d41064a78440853a45aa884e2123349d7cc8be8fe554e4efcbd149c88b9f03601ca1848122f57284a2050a969723142a23142950949676b27c5088f8e85e8e508c9e90811234a110594a12438f7befbd639238d149a6dc1b846ada614f988e6cf982f8ba271f1fd4d7f33d39fa49c2a2999c9892f69c93522628a6276bedbd4e987254ce596b26314c60388eebbaf1c9f8e4c9d1f645ee70140565054d50606cf0c0dea3b7492c04f95820f8c27c4e6a4047d824828aba000ce027856173bedee1eb1d9694d296aa4e70c77e7a34687edb69e7a6305cbca4c0d7b0d2aad4492a65cf17a11b9cf830e7a4d4491527445827357ba4a321ebc8443432f140820417b058615343a3e2e56aa5c847a48fe0c34dc84cd71dbcfc2926b380b0a9d758808c0ea4b3aabc68630373c2f4a20694078a1333df4ae5ed8edbf4f81434e488223e57884f52904fd2099d75bb44122680eef5a9e9d10997e75e8e4eb2bce838db50b5d5d5c427e66342e423a7e0e38e28f1f4eaf181f978f8ca7c51df6d92836de2d2e193fab87ca2dff02d6d80873b4cbf1c976278d171aa93add62e5942b6f90c692140b948868f805c273e6c75b2d65a6b5d427cae1e3ea5304758a51a10522b8102b259253d00d1ae213e590f3c7489802ceb63a147f5af8e4b9064f425fb92f8eccccb71490afe871edd2649d8d16f9dbee84440d7d92d658c6a4125efe581074a6900ed1ddede4c07e2cc0150578172ba1013f014c67441bd003336634a1c9e3a0d0d4d964f47bbbb8883c1d7210766dfecf6c01e2f0f9e546f86fd5b55d733e041a7953cdf4015b7efea3568e50b95ea75cef58e4a39a9555dee37c8a22e6c7ef372bc7ba56755a18afb0a7abf415d5d6ca07c95acb5a3d5aab04fdf15ecde823bf4dfd0ae74f6f9f9c44b18e5a86eea249d7309251f214a454a474e949c72ce5a2bcdc0711cd76d252f4a5abc3dc151298c50f73a322a2131676654d62a81bc4c23d56aa56989c9bfc6a50de42fdd8b850e4a490f4628f972b10c0ffd6bcf4cc4c2b80489abd24b2197c8f04ba28c4b98680a63dbb68deb9674c920e85e2a4ca7d62e6959f24066f2d3f34bb517f592d46642f4af9109ed5756b0d2c8e488b4d6de0bf59473ce5ad791491393a8dda4a8128d4c8cf0948879713781616cb2b4f54f1d52be602dc1f2e2fe71a988b1c90f9331ffb1523491e15f34363dcff354aa51e9696c7285ce58e95e46544479fd4c7161d980150ebc803ae0b24106d797195efc3c480d2ffa0b858fbe1c95d860e5c76e2f4725e3cf11940b522aa0c8314e1cd8725444541198f90349178d24cac7bd16890e7fefaba6e4c87b2f4725330ca5856e20a5c24c9179e9148ac248d24cd4a9ca134e96974e8fa6e80638c8d01f1a4489a8518dc2d89ee8067336cb32d332f332939a499fb44933a2cd24da64a239d1aabcd461be29324138280cec5e5ccb2b4b072f6f1c6643e911ce0614aaba98b4ceeca5e2f444a3e294b3de681c15271a935e4eb7f7dedbab53b5d5376367662a9d33444947a22d22fabe9913288a2cd1265a2c4faf212850b09eac16a896eb4e4db5bdf6de4ae7ed52ec145d4bbc3f4fddd5f3da54b4629eba0a3b456369682a9d34ad9c13a854ae1745ad64342400001316000020100a090442c15016874128ac0714000b6f86466848301b8623812488711004611c85180308400618038831ca40a4361e528cfd6aa99fd217454345f7a61077befa60686f34bc82dc35d6fae1d9ec30b1f14b31487f5631acc598eca70b5cbc10c780823572d193626c28c7c3e0fcf342e09daee2e725d75ad7cdae55c244e82c445de77d63d380f3e7c2a26f28970441db7a13cd120431250422705bf05a0715649903100aef42718e24eda45d9fe8c7457e49bf59068ad9238968a65dae2d0d09fc8be83691fe800ba8cd5b039f27dffe0ba24abeba8392675c33a1c65b16a667b33d0d69fd501dec0bb5466fa89cdf7fc850f607de5686c035008fde30211cb9727fc151407cf3ab4db14f47f127bd503834f6308e56c58a6cca83752d7e094a4ae4bc49e263bc58f01283149b77b0f351e4ee3d2106fbadf55ce75cda0226e711bc654b1ebad70d5342d27276350c2ad03d7ddc82913dcd6843c55f88263e5e3667517fedb651f58e407179e9bc3b875e01e9cb610c9ea2b1666223d4890424408da0a30af10f2a2f1308a50bcc0039b1280424b9b171d027d9144f245832cc8f5986f72d9e6ea09967ffb0c54bec737dbf6abc60adde06f11cdfaca3e714293c7a0e9363a21f8aab379a1ca9d4a7beef726529be6cfc25b35560416c783dcf993f8b07514a258989f9d5a6769baba160acd7bb8cd178f7f6d7aac69d54413b09d4eea92460d6319b4a3c0ecb81ccb507a22521739c7ed5ea7293c9300e73b69eaa7918df6ee7989e0ece346483013ade2e630a32ed15e29cefd88522019044301a1793a71ed8e6462258d22ab668fe75a3a909e8acd9c441b5f0c4cf8b1e784fc3384186b3aeb21f0d0ad2b368aac702008d51c41088b20a3bc65f6c8876a76ff20e5c6024e2fb83715f2d3c48a7c8346d2a83266b6df812ae9ec3e6bcc36289d63e95b6c1e60091085655368efb9848909af06c4abf8f11f1eddd98b0ed4a666dca762a0fec362b056153b33ee3e9f46e4871f724b336dd66680ed06d8f6879a2d60e0788a9afa83679eac94c226d4f9406fad59f714295d5400f3a8782d19cc839c4df1edb48a30490558e6d8c9403bc2907b02bd9dd18f1cb9381c9db97c05ab41b533ee886530fc2a8347431ca3e3db3e102061ee3e593c1952e175151fea04e15edefc85863e1713149ec1e758b2217f8469b320853c9de258680b17ca4844a0ee9cc66cac924f92a5b8ce6f1169aefb953bbd59c3759c6e60227477acbe4647134346f4c78142a3e15da2efa91b20aa8c0e913baa47d38d0fa0c98a864969e66996eb9841bb3595621b0ac8c4a472af43c14dec4db320810bdaf947cfe5cc4fd491b9c45b89b8192c1d887299e919c89b4f2509861d806b9f804a5543436af5567eda826b1b11035012018a8827b6fb8c15ef3250d31711dacb5805b054e63a3e68e603b5bc5f7cb97783f31c6768e2371953a165790f1ff25f80c7c6f589544b6f23f1d2887ef73dc5a8656caf88a6200ddaee42d6ac640e4147a5dd9eccc8ecf2105c23f948477c04d4677c97d6ac40237ac6da1e3defc2b9a64c1d19a988bb5d88ac2bdb07c82a4313912d0b4f6c83b407d619566b4812cd34f814f837fb3229c2afc66140f1da48251a6eb51c55bac53f6d94b45cd7e4d6492da6708ddb084591e2fc670d8c7839e8d487d98bf4f39fcb45804d44f15f5a125891f8e02a2e021443c49c56e988a2c54f151d4a9bfae5ab105905a54a86cc182a008a3b18b4b19e80e52b46cc7606ead51862b2abe9e54afffa90d4101b4e4f859004f1cdd810844d58b9c7429e6ff35850251b0b0708f93cd3d7d83ff8b02765cd8c001f1aad94f13707d67c145f8026143ba82f82f533af7054d78a273e970e4fb2772b547b1e94a77978f26cc11b4b594549d611fa5c27791af59f39c9a12d934c5d903df800cfda854568058fdc62765c90b3d500a7039d8672342acd5d86affb1861243f118fda941a84a960fe82fb32e29badb0f64cbbb5e76b85d2f17e2424a0787cb28fc3ae9bdf7dbecb697c935fb96f1636dad9039a1de4ae8e3a7653b7b6adb8cfbd708f777f6e756a8af879d7ae293a88f531d0126c22279cb8ba23de1349eaa79958ecab16d929aa9700cf78be22785e8a2613a6da0e862b10ff20979996033a63e38a0284637b34528db29f6be407159446b1a3b3a084ad09e185452e3157dbc66cc13ad96c8289384aa0f578cf58c4ad9c139c11c351b4d12606c3fdc17363c3dc655433188f8e58cc4edce22d567de5ecd22e8d1e0a4e7264444d4406b5484a82424f5d138db9463dd01b5195d5c441709a791a2476b159f5de40b35d2103434217df48e794a4109862060c0679921de266e3f9af8d1a5b5929bedf0cc971db7ef117390564b349259c2159219672a61cd6dd816e3af5ff44a2468dd4e18d7d3351dc1731e2050a75d1c7493a89625d1c3fe1af7d3f9147bdd144c5739c6ec5b861c9199ff7ae82ae53a932945fa5364c40ebd4489378fddbc104729a3df581ca1700b2fd913d2bbd64088172c29399101777302434cfe4c314b5ae00461a4488da8c2027e3b4d71161f10b07c36d5e1c8f7a0f4a27acf1b6ebd29bf7682883eb6092a117193111554cbacde73b0d81d19ab433f5dd17ce5332f7b2316444b4bf8b3bfa75476588d8fda373c0bbf5e68bf047b3d43040ff7f5842c3ce4a7d281c4cd7f45845d00b2976d6ca5fcf3b9d9f541f64a4365310c6f8a2f580c3977b31e7d8659872227644f488ca212331bf9b1d5686fc83e4221d7b8c7a7591086a72cef04e74cd515580dc87532bc9fcc0266244a90ae73a3528fdb674e15843598fa0c322d25a9d3361960895b3a93a5d177c684cae51e956f3293e5281aba63b9da126d86d45163c6b4f365d14f6e876a22cc1c24291ea628e7e32d8d0c4a1c147426fac0b58642666821031c5964f93836ce75f3f8b56d0095186d60361a24aecf301bdd8589d1c2e739e81451bbc3524d2b6e0fc4e7dff0085a4b0b6ef533e6876d8dc62e310670ae02b598d7b703cb27851dc9802109fe3838c1b84f709374e76851957b458c12c318abfc1e53451a21c225eb875d9468b8745f919358260b55e9c3e161a4da3a54359f97afedbc07a1304f8bf16c1e0168bafa08d377c66489cff478b6d790115931ef806efb0522273b10f69a02941a30098c519385a83501005c0448a35b44f4607d9256780c53e7b5adf1e0fd5b54fea9560f560ad7d57da45581ceeac7fbb65238436a343e32fcb4a186fee51d47536e5d1380873f73f24db7b08689fa3207902b6e0b916375850b5a1b080832d5502361232ec4f8b33571ae38055e037a570896f7c3a5d6abfc81d3bb0ec83501074500c36b16893f5773c0d82834c1a8adc20848717c8ba6848cdf197ed3636a93998c9c143ead009ed26601e025607731ddfb5d085fd242d899838bfa933321606441a9007e169d3bf58fa8bef533329b5679ca7fb6bfbd9faf87dd1ea471a2d062b60256dc027b099c45d0289cc1d64fa3850cd7355e1570c45ff873ff4f3dad21131918b61671325db0fef012a41e6162acf9281e624424f176dc93376e0c81d64e788aaa3e0c86739d8c187109f43a1b285e54cf091359c28d00fb8d5e9a81134037a34fbaa153a4d51164f3746e57be5607f25ed535537912ded33dca38409e8f91364148bf604b7b503faf108ec2056f3918e8d877ffe35897cf23a0c556669ab8a78b1ab2852bfa9f458ba9a0fc9cff4b0dc952cf394b22391e4b9f4c857c9bafe93c50c17fb78d1f188e5df0609cdf4e20d361a8462a766e25879fe61e100ef38a21bcdbf63dc83a5225abc20256f61b6eb7d2cbad34349447548387d8d563676e579b02049394f586f4f108ef3b7eba042b849e894c8a0405d6e017f74963aaf05239986a9f307a30c1b0946c5a12b60014bbd1fcf28e6919454095cb09fcf17adadc0c649af2dbcac6eff8b4a6df734ee4687d63fc7e2f0cf0b99d3537dbe31d72b7071c00c42fad710dd84a7d8c69855e33f27b4803c547db3f66db22eef6e284e999bbd4c932769de9fa964f007ca023cebd02883be5a1540b64df4eb07ae38b548916a966065aac5b0f7637fbc6dba2f623a2ba8a7629c170d7f2fc1196b64f4a35136b368aef403433970ab8a08000f0dbeb097cf94a1ca389a8b4615bd80489932adadf4210322c92278b517980acf471192089713a75b3591d16bc921dde14a7cc9d554b3ae727ae8b913d9f63ab349198ef7fb071be83686ad5523b5ca710c97579713a8fd5b0362b451bb74610b99df05140b89cded80bd3d4799acd535b55f6f35084d9130bc7b9ba4917a64941f448bacc635b4e837b7de109349cff37bd8dfa6691e91f45f7552a5dba81795f7e53b0311295e80cbc7419a5f3a175b2fd3a3191625e5755ef566f9600c97b3e54eb0823bd995849c83c2213a4dcae57152fb516177bd4c9a5caa5e06575a99847b567b5c6a2604c1f0ba4e8a5c9ad844929830a2a24995664761690487c0d9956fc1c694496b776a616520cad36f001644a58ec93a00ba849aed2cc5ac56377811f5e09a06ea3c8518030c3bf9abfb023158dc7f895ddfe8cbbb5ce258eea886bcfcc0689276435f72780b346e2ff441e3b7f3743cf1e4acd224c40942d95629430c6a952ca67753830c7ab7c5a15884e8527abb815e17680919fb4295ec8579cce9df8dc9e41b8be371e4edd4256d258df6d80f2f14b003f434aee60053e4f06dbc3eaaec9089e4726f1005bff4a87e0e4efd4a322379d052bce25ddcaf90750015fe143acd8cf94f721f4c685d3c20b50e5a0ccea373e236204c841a4af0536a9c3b10368a28125dc518d5226602b8f05ce437ff4680e823c5fe03c7c3daf77addda9a4dedc701c58fc2eca1ec77e186fdef9de97d50f6cb349c68f9f87665eae01485309902a1967f2089acaa89283dfecf26f9432a9e8f1e3bbb022221834d57f5714fb956eb03a47f58cfd31f3c4820e7cde63e692ae8f419f059742f74165fbdf800afa395a75379257353ff41bb630d70d6a3576053351948bef81f64235f38e1b7edc96d7ba91c938775720de14664a1754460f3bcc8fb0e5e140e950c1ba078f7f8e72be966c57d0b070c605cf9218dc90c79e39ed8dc16f3a7a7c69c9a2c3163bd3ef2f7d048e35276038fb0afce75073c453caa5fc3794833efbe7de924f2116eb8c207bb7752003e947238fda57367444916879a6edef33afc13262550a43fb9a51a6f1707f43ff60228144433e1d4bfdf5d8444b8c4aa307828a2ff033d55897b3e47ffaef0f65c2157742c56075e29c6e15c5859fb2d1b5cebc2bd060884d42a6e4da102829bea98ed27e56d2614b3b9dce02ccd2c8893fe47681e7f92f09f028b49807b26c158cb610a339dff3798333b93b2b7bb53ff90d61db4b4bf03f50bb1df8d660b0aa90d46d9a043224c072accc1375c174506dcacf5fc03857923372c951f83bbf1509d792fad96d2d184525021826ca0acadafc5879fcf7679c995cda1d3a3154453812a0861d5b2c070be138990940f4993bc8fab968bf136a3031a5b1f5a35dd553f90dd5d9f9a4f2c507a7abeba3ab42441f7946147779522b6e3bf47c2c94f1245078deefb207a6264486f9bc6906b21dc476bce7c5bbf37e91babdc380f9a093a5bbb2848de50fd820a391f5a6152ca9b8c7c919fc624c6b5f2c23460086a323630c1f72893f65f008a844b01129a2e45e7bbd99c4d62b6786a62fa0d1585a626129902e41b3ef8557de8e07b2d4dbbc640a5f0efb94af51e658fdbfd645694ed8d03a830b5a7c88138edcb41957bc5ee10380139742403733b8c6f8be5965abcdf806bdb53a9927bf6659857b7016587e4f3412505cdbc5aaf2b60348c4f0a545d2c02678ce58b0a20bf34e74df0a2afaa5c57616289f88bdbb75c1eaebdb5267ee4eaec414ea06170b1c21762c6b83cc7fce1ce580afe437ed525db2a1593ed404c5b981a526942ca0b4ee4557c4f9a66c2bbf7a9c30fa31123012731468c03f3f1cda5e23d0712951221dbbbc01fd20a3c5653480211c224d062951917088db08b5a453beb331ff08f583777fae24f1fc6ce58c1c840bcbd4e66a56bcd9672780a331be404d8abb6d83b4e745efde92677ea803b7fa8ddbf6c68dfede19b63896d47dd6184ba1f56cb0d44f4813f5877b862d870039a06019d80baa1ee00f0eb2e942e501be47f42a9914f0c169787aa4c0d44d55597f73fe0d7ae14bb121620909c72345213094169ae38fa11e940db1b3ba8c2ce3cb851536586161a6c96111a362e9a2154dd5a1714bc3ee3fcdd782fd879f60276f0906bf5b4e4744141191d3ac5d3ebe1b8484e5b00df14e8f0f995fa48bf027be83d4c35e3e78ee6d555763b71fe4ae88f8864b131acd1e3883e9807232e4a26a55c72e7f5ed20cc815dab9e63031c3438379d3d28a9684f0736d5aa2c8726e63ded177a1eb0cfbb9837db76d50c81b77f1fa9293955074d77e17ec5ca2b7df2b6c995fa0ea5e2b4f5bd34a43fb1739cc8c11cfbb33b002a4fdf3a25d1bdaafd000000790194ae75e466203a672e841482569d78d2df3eb72e24aa2404c01f12e2c8279de0b38c01cc1dd2d1d69d972e7d27cdd77a7326586b67e46903a0159ead99f16274f76a03ed10641149068e121c17e1d474f3d97de88bbaf236eb7f14026fdf7b4e0d76db10e7f9b83c1d201308c3c902aae0c456c672870eba6cbafc9be69aecb3d6e9b85d13ff12c3cdb1cd6544abf6da4d149b394c6a0a19194a5e7a4a8e7f24b4a163d1c7d876eef754dc00b728d104ebebdcfdd76e8e62927213b21298e920caf3d9f3e4da8802bddfe8873e005d35bb2929ee5c931e8ad1ab7073878687704d8a3f08bfb0dd5df3e38f5c34f2a47d7350d3b3f6610add3806749f0ec042304849dded8c306a0ab3b4fe2e7b3f8d3b94e7d730c5dd03ef658b311d20346e0f5372bdbdcf50366fcc0477a1135d586013a3d2842eb511ef5347747b53eb62231076508135b67544a9feaf719d2b9e2e0b249b378068bf61f74b6c884a108e61d8e07ad147a87f853d65201a2c63850748061b1ef62421d222c4e0293b66479032710de3ad1fb3a2e11a49540e1a6aa4ea299471dc13e614999c173c472c22ae0c94893b7cdd1678cd0a29696c707b2d7d3ae73c40cee4edf1921b08702b7106003e0c64ce8cbd960f09f5128b5ce62e3b534f8d8a9453942df0565aa5abccb91d5a96c829215a2b826575d27c47b78ab693e5694f0a1a270d03151a05ad018b9ddd7dc9da55515a35b43781bf91da97335d10b6138dae0a82414ea8f743daac762e86860194d2c5c3786847edc4d43af33f13add627f590d1353d1a2c1ec101c1eafaed9c7af5552d25a65009f28d08fca2ba103837bc320a95f69f4a1a06998467d334630165e0c2643ebefa6c4df12d333f48542816a9ac15fdf3eb6379808ce444a5a7bc69755a533341080e05ca91d98fdd31eca5c0e36b76630aa08045f51d77e160dae66372780d3750760e51aae3323f58bfedd190158deb458fa01c6b72e6456940c6a54acaf93f37b3871565dff2d1f1f62e5fccec1b04e8267da34a49c93acb13cbc63ac69f72e29a7f477cf2a24130c842c9febb3b65d5cf6bb36094a11a558bb927414e08108095bfc38a621c484d78d16d76b1106cc3ba865c1d10b3fdb35df729a4603bfd6c40aaf8c59f902f7ec4d8c07b21aab67513349bf671d318352b05d1cd449a09c78c72e35cd47338f1ad4e6f56e4418c523f09a171bcee26b6c85167e5d46f5e643b970308872ac3639df9de69e7810e57c733420731007b0527f27e514f7a3106e89e51bfdd8b725a59a4e359de40822f91f61f67eee372d75ab6d07949135dc29c5e3f7b9f242a3d1a97d29b7e4f009bc6b9529bc7037b6ac03a521a9ae4ed46a8b52f68f6dfe194f3ba92ba7b66faea43c762c2742c766ce44b9fc31c945c730dc03ceb02dd68fb1eb0d88db2e7d5ef6fe5941b5127713113d2a040feb5a2b32a8e0c6bce93bb9a1ea1faad901ddd2a2ac6d3f66ec930ef182ab712ad608e29b15b34c95e91b13e1e8ed19f5406b7a8fd87e7c3e6b6f48d8626951d9d8cc665cb806e2e39358191325d81bed88bcd84dd92e7fe26ad56861c7dcfa30db67c4985cf191bcbc016293252eb89407411d95c7dc7def42fb49a73198dc604c455dec21c0ef526030514bed1803e6e80afa091cfeb64e8be990d82f4524251a70a66ddf28ad1fef55b7e68ce01d3efcbca6e98798cc8ec49a6f0de06f11fd5c25d0a5ffd34af3d1f50df7ead54b97fde83a7c0e34627eb0877237214083eec694d49a3b625c00f498067d333630faef93ac2eb0a44d2e34070bda35a541890f1b2c8ee25fb856fca6997bdc8982539ab96f8b199581f3ba7352b9963930a1f1f6c37ad9582bf583fb6d2925b6a70ee5b7fa041ab6db75541fb8d863f0e06287804cb0120088de8d53af1d098ee84a96b291324af0b7733214c1a11839876bc625c703080a7de3bec592c297f1b3c988a2a63ed05ab2d2efc74508114e1143423f6ec146864e8f9d0e5afba68725e37c5b106ba7f7dd6245ff540ece8f5a8775af9373a1ce11411d956330f5fa5a4724169e1b66426bcea851e1d23018f4cbb0c908fa331d4b73d557749301f76f0d11076b17f71971c9449dbb5b6044046e5a749cb61d15350cae0b626e29c3e9ffc5d083045a87022daee95bfe538390f51d67c3c4a7150a0563605e58fdc798240fa7c280d6c400e6df0e93208bf79266c031deb71d87816691d76f1996d4b56dc5207cbddb361411abde05f125db8c2b56bc71038e286226b5e68c1a2b5c1a06a37e999b4cafbfc5003639d13cf72bebb876ce71ec92fccd36207610647a080e807ab730bc2036ea5204019341dfcf066995f0f4d0127bd11a19da4b0c810babc81784404ba9338fce1e9c9e5fca4d5bf5eb6e938b8bae8c938124a6b4246d29285eee02dbd5fee7b4fc1399a300c638a2174795d9f7ea8d987287b17020c68d599d13749b5321d0e618012d0dc6b1e1d56a03c345ccb48c384941b62288233e541fc70360b5c5bff33d3244eb747493b5a00867c098292ae5c1a86e0a55b4da41418ee43c41eca67cc1831af82dc858748c49148706b6de0899dc78dc6cfb4b88e3f588b356bb94a851508b0cabaaf8ed11e09c7cc193a15d46add879b945272e964cb17287c81d8068080c627dc16c91935790ce9391d5d78e16ea10adacfa4b8214fd23c2f4a0e91b8b5535b2ac83fa3ed6422e1a286d5b8cae20ae6745b27a7e5c9e3a46204dc863cd0a533d62ce2d6bd278308e844aebdc1a6215f90937ece0390827c886c68e0396a73d13ffab755337b393b9f60cee868bef37f650b796a6ab3167c42698ad0e5fc83e078e98fcf44081a64a425df752fec698c16f48da9f088828c2bfd6da7ce73301cff10b8b1d49ac79a9fca4fef59359af8327bf49fb188a199519ab842abebcf4699063eb428ba74771682735da1cbceaed76c6969fc8e8c7502d72fa8332fd903205b56c160b6a65a1dd1d120663d21512a627940a5bc75b492c65b1ac9c07900255fcd295f1321eeb40b3d8d2c337d79652bf8a9ac6eaaac7d1ca5c0c15d0900f87b8d317b854f94f228b6fdc1d1534cd1f5939bad4773dde95b1a41278687924224a6195d334909ef39e5e86a7d875740457074885e77b94e547e18ffefc9c71a3b1d9c08a1b8e74590c095b1ad9ca3a46b412079be044141085b86ec8030d8e7e317263d892d78e9d36e0f5a34c44bf30ad2895e426ba01c0b189ef0f933bdc2335f44e687cd47c3cfa3bec36e30dc44234796003a7619621ebcc6c07c318b75b5054558f80d123ac2c2a249b9daed5488db6337079e0fba030eff6ede67bd7db8174f57b6bd798ef38845f8e05601573e72499200515c251099477851bf33685afbac87d4718fb59f7e1d9fc88f8e8016b6afe846ee1bf39054fd27838a3a926e168b3879c6843012f4f678f97f14ac96b5a582ee9670f041975e39b96584a43710a4f3f44585e8a894fee9dcb116ed7af9690315742d7c85ac30454dbba90459646546b0935f5553eba66bc6ebbb49e1c924c524d1d378888aefec7024fc6ab170908e756099b861067ec3ade20fd2f8e7ecbc688028979b51f20312d51984d07b5014643d4db532c4ca850938466c144ac60e44ec6591a7f5d51220a29cba9e8966ac4fc7e23949516a78681b546a3adb91ce5e227539304c4016c992ca867d22dc22181c6a65df9019fd25f6b08751a0899c0de3f82d1a2172f71731476f716ae1dbd1b9b4c3cba18ce8698488fc2e8d640416b401ba6dd5c26dd75fba2dc767674d97848e24fe02464ab9b507caa37924741d369c00cbd4a1457e71c95da7a5b4f559871552242fbc8f895e84d5be0cc0aa2933e9e56b4047d2b4edb3f762ec10a0194632c6c1280fdc29cb1331cb663cabf871f647a055d4df32010f18a000b8aecab570592c2225a283ddd19ad1efd151b0ba8574bd711e2eaf436e04999f71068234ed344e3179a38e1b1af0c7633bab09169cd061691340304ee9e2880fb46f30e490c9896bec8a3ddee1938bcdd43eceb16d3bfeb87d86948deaba0fedd15de2f8c8ecebb2447214000e1e0040714b4b9b198642e6163cdb763dea2e31d02b74825b6c2770d1c433efa528a06d787c7f780f0510943a890de60f6124e82db8997c0f1349e3cb521db580cd13454dfb792eda4572bdea0829bedab107494198f410cb283393d50264f5947a5aecd79dbcc0f677994e71392815fc9071ace95b85473b14894583eddc0e492e19b47736793352652d6d8cc27fe49dba966d4a1baeeb93d11ab6e1f1e512b180768ec4259230bd857eff1da0dd983a495011fc4052a45a882a5f1029533def3354e144fb29a57a7159238d250ccf6e3d96c81641007013195a835f221724660ef80c80769eb6a73549a78032b67e5771f497c694c64b7ebe45ea19a155f54fdf1b3a6866982b3f2fd2c31e18428c2a6baef708d1bdc3107edad3b48195ba50f7697f351a71c15cd0eb3f0c5668a1fa2d464a4f9ff4e35f19cb69cd20f795945403085868dcc23651d1d600d08d1a403554059c9e179d3420e3b2c8a5351619d88de0ddeb345e833f4897d5ce352bf2c0d46a7bb203396448fe48e8830f976290605846a0fc43f60ef2857d7b325e9cd4357d97a11f6fe23a692b9e581bf1a1df6919bb556cb45101dbc0af03043a11a4fc4a545dd47702369a0e390b49b5a75865b9cbf342b24243bf61d26c211b30334edcb5fb9d0dac4a530bcf21a178f75e9ac8e6c45aa4ff78a095c1548211d9d0265ee1322000230c6918913884588edc05025c823b26cc5c0456a1ba89ab9cd7d0975b916949ec1f326e4d7b8a2aef59ccff6030a33b7f5fcb5653498ed18d30439fd07d9f7bf577c9f867ddf83865e709f42dd2d2814b4c41983a6ff3fabee0c375fe55bbb9b556fb62abb30e589a99756332e8075846afc00ba72a8ffe1e8321eed5589d7b8019e4facfeded3c24568a054b869ec6be0596e9639ac69c029584a39291f301e2a50e4840d0dcb2c5721bc0bfece89c318ca28c0129845c2261f7387f141364fb9520414012fd8822f5f865fc80db6bc623c6012abe49ecdb0bdba6f83bd463c54d03264035c9fb1474fd52688444947d536c3f5a697f3058116c33096fe5755ea6d6b2da7d9bcaf8ae59e954a989bcbfd433a846726df6aa1d2cfafc03d644dc37b6f6cd330ba532923c4e1d421c45bc7a6e2fa6a3e38ce87a8aaade1767c1869ecce9d669eae309598acaa146ec6c2b838fb994c2070797c6633d228589a7f5ae9a79eca5e96ffc46fb3a48f9e8ff875c85c81e23420f64328ae5f81e526b9ebc70b5c6bf2b843085616bfe52574cef2a92766d04fa87a1733d8f457130a654cb7d0a815c0a31af4d7f50fcbaa393d41aa48891f7deb4cfca9c0934fe487c13dab9ad65309dec604ef4c2a1511223903566826a7c4bb3019fbbbe712024fe68114c5c4dd1fa4683690ba9875554249c2232c615050fde4333e87a46bee1f585640f09e1a98f93c1fa081d13c7e472e302a4cd6284858f2267bece7c6241fd02cb762c3bd1916138901a8e1ab9f9f43aeeba70a98abcf3d970e02d545a72d75ba222f9523591d98d8876fcb07478849ec0f224b87bc400ec94a93e8c69e5d2a2ee1480addb19472d9ed064b91c0bc0935faccd47586ffc047a4a4328e1663f05755934c2f38795cc25618e43ca8bb8696b48d74e3d13732eb1d8f0e8d9c49014375cba1c2da94aaf0d8d9a7e073e567a524703d87a0f44f7145081879d4501e6c53820beb732f9a2e989f7033c4b67b0d141f7be4d5865cc8354fa4eb4c6faa0b52b0b77c062849be28ddc45113e74ba655bc50d95fdd53afb8e9288759a2ce77632f53f1cdaa0693d84e605b79b442cf482666b7d02aaa8620e5b19651f4a201e8cdb41c0274e9d4ab1991e7c704e8e406022114a80073444f9a1b5c60b51960b17a89f999db57b91652055c47eac7c3879ad8c08624b48ab52d6447f6036eb0bad12bcc641112b2183b74dea3aee4d151bd33ae578fa1c6a3b8216a76d4da1c46312362a29b884fe28f7c36ed9fefe8d396e4d0a6f9b6773191a278b67c8603244dbc4f4fb083a6940b56a9e341b4f830eb9554511f6f6cc9d9c8f8da1c9fcff85db0ea16a329ad329d2958b03808b0b76e92f367db0dd9590dd08e2420c4505264946a2e1ab0dd4031c1e8bc18c343085532927381a78ccec04a144e2ed74dafa8365a7d6d9dcc2a23fc23a42ae4b47372ded1521580784dfccbd61ac29b1ef59733fc4791f2c79d165308d58a9e7c639b1b462990f40184f6ce620e71235294d5f050ae248f43ba58beab5415845415d365f2a09fa78119d9c8a6a669c472d187a905962d6e7863121f3d17a63b9316e71708cdb2f847e2b49ace25bdf8fd7910cacfc6ab43fe85af63aa47d6949e10dd4b9cd04a62797a79b84d3fc86705f6c74765f0fb4772223e433adbdc3df68fdd5cc1683aa5049ce9362d8469787627db5cd43259609bed0bfaa386614578cf80e841c42d3a87484847c50bc1e3c08681fa2a9a37bd6b78e5b8c779550e48b77997ceb379911bc26494781e213d6a04ec451c7e5c5606f2c38ee595f61c447f5b713a5b4afe0c915ed71f394cade69e202e987568f86f54c293569749c95dc07f80be55c09689c1dbdbb61f59597b83dc46d43f72e42b1bda86a5041966b67329f64648bc9567947cf26e6004a13ad7025b76990ccc769162a6e1a4e007a145921c0bb5b91e9bb9063cefa60eee689f567d5f38d56cd29e0d82cfbf2eeecdee866c1eb53277c12204617cf985234ba5240f1450bb5b6c2819436166bbc1c2b870b95011babe15d1ff3796a38ff52f6f084f1352b3758194462379ef2ed0ca39546e5f1aabefe2a558300ec7cda776adc588b26915376a2234dabc37dd3b2da4852ccfc968cd173531094b19c0c2ad44d17fe3d5c99cb9fe7ca9115190a7a552a46e86f5d8a7c4f855cc2e59baa506276e733ae998932040993131a8b8420f7475d636c8885ca8fac1dccf72180cd44851ed63b4d73512210abbdf36086faab160a7f63bfcb29910f52d28a4e702679ae4ec44d786975f42f21ba5516402a23e890ee3a6e9a156b8590acf4ee7d2d43a4fc6ae2a1ee5e8ba41807af6e396cc9386a7464e37cd40598285a9abad57bf2a0093354ef95de095e125b5ffbc9904574867dbf2aa6b537352bdde4784b23f93515acd4c6b9a20e809e098df95f799d94a706a1d7744e2d9871402d6b72ceecf04393a8df578a1d64fac2d9488ff0ca281e4d2bdcf82fa14fd5cd371e84d8810185101e2acbf1949f2f2b68b0747786675e59d4fccbd2c1d8c5b234c71ded3d346370c73bce3892884b2b71e305be386f0a1e124ffe8d99f8cd5a2b0678c230a4f0f3e316e167fa20c2cc23bbc6f0542a889d5b6d9547e55e712cc6f188af4f81c140955608aca8203f9842ffac84b55813f183bbacfe1f71f14053b9ad0b9ea3c9df349af64e2b6599baf05962e0091938da776a831f16a9640d71ed17ef26806cf1254581650b9126b636c949a1744e13a24ca26ff303e59b235b1c235df1a4a4e69c1705839d32e30b4217e9892754b5f1ac90cefb86239fe4a84db63aec8710819234920eaeab89835166602f28f937a4aa7c17804d081478381cd81d188f4517b4981914e8d184267405f254e70a68f3ff79295121f8db614a9e77dfd28b16c172176f19242a465f021d39fda0d95e941b45f9227f33f142808271e5e1709a5923416d12c906f20ca4e3ad660e91a965ccaa9febc3cdf2cb0ed4d4aa898e176c9de1f9f45304c62d04be7729aef71bc4f12a986a8db3e271b8256628757124e0fce717e19b3a057802eea680436e1343ad05294215fcd249424cec0a923ceed9b815ef4fade225c6bbd06ea815876512da4a902ba283977ed7db771dca03a550b5a84ea5d4da8d4f5721f8da5f091995dc1a920ef3a396d1e7dc054d11d5a1a1281c38f9c88ee9c83f08a43aab37e0e20fb374e7c66cbea3bf4fe1384643adaa17678105526548e740db78a508f04a20abf215195ff94f42f52d3fafee855a5a4dafa8d7aa5a8a4b3a1d7a7aae7f822b600b13681387f3695cd5fbbae117ee91b65fc8fc23368eb909b4008fc104abec76b6a9b30497346b5d46b9fec5defb40fac10c61cfa0c1408f97aa03f0c627f49b040d2165d72465c3e93696b376f5d6c6e7f6d2ec6f886e156bb202a9c65915ae90739dfc9403d5887fdcb4c3d0a551ed8396322077598842f96b7710b3e233cd6e3377e59b8a9a703a899c69852277e4a644b18373acde63c8febe3ad1a942bc64dacf2680f428a15a868851dd50930d5ca51be6badea2a19273756a4350f122fc79d2eaec5e86ae55c71ba85d628cfcf1598709ce033c8f263b0f06b31e6d8adfa2ec05fe8087021f0a20bf5e489a1636d633484711722a4c5f5e8826c80392cac2d7e9f816e83d5cdd9dc3aa608993e26700f2ed2e59089a217fe185857b9e7788e3595faaa0d23f5a3519afe3810cab25449397c75ea3b675eccd49205266e65c604250e68bee353db9a61ee446248c20b9a4877df8429555fade7922e9e4ab9b6ca3bf14c44f865e614d27ae5d5c8f2c14cc0ea09e18348316eb15efeeb2802d865fad19005cd1bbfe92667a76a47bbeccdee9c4e2281f3e0eec2ee890c6a7769f5be5adf953af78de19cfdfdd96c4c6ce2fc3c1b83189385c10dc18204728e418f578f76995235d0449a0df543e637741949efe754bfca8c4f60260a0beed9b4241ff2c241ef2439997c058afb4efbea0c0b9c71ec399d12a167beb443be29e963c3f0b29a92bb20a01b8018ab62070d3daefc32d27e2b0cee9c1a6447fa60c849a4ae9932ec3e8ee183bd9e7c7db452e294428e318aee9b62be154eeeb1ef592d379c28c5d11ac47f9d4a3a06623ee3d154330eae94d8db51bfd6c4c5a747e4da6eb58d651b25302c0c25c0cc622cc37f2d95613a26c162c6911e24895a865a80c1ae69e41d9922d5a5d3c6b4eba04cc467c994fb248b1e01b126b306d1b1e12fe1b1a434d63416c7bced28aafcb8d08b9ee49875dc380381746798c13e9988f8c6be8177954ab71c5eb981794d129af369d08a5a956e2837e594a990510e8afaf1a582ea6771aacca963a4b764cdd0455afd60d347805ed41bf33a80f84996b1462a830267975f060bf51bca236884b27b48b86151d2ab5981db2b1648d4c399aee66d9f7a13a587928521daf6cb897c4a030494fc0d5343e287fcc22d8ebd0a414693f4edd48f86d22e255e890fa4c27e72426895362b4873c1cb83319f294248676bc91c6227c7d8b5d09f5ffd10255d773854da815d3f9e0a86f22bb7467609536d02739217f1be00dbb517d37a34929e9496f43ce72ac9d47500d5f3efa00e18f3270286832de79b1e2ef45ffd20ddd590f139e336626e4b284832652790527848c953a448131de4ce4f821e2ed861a3710bed093632dae491b09ad9a009b6b17d0ec3e5cf6bb7c1598fb806f50e2be494eea513c39984e026c8fe077085c347c73eb24efd151a3828b9f4d627f7f005200efe2d10409733a03a3590e9e07841d15e9c68f55489ba6d7d843e49c4f6b6bc937f1a6ab31b2bfa789349d46ef63dd047289ae63a388df8097b1bfe9cc93b3234190c4a4e5e8167ae9019fb602fcc440444c31c11c1d97cbb69ee224a694d6bacde90b2766a84ee88919b6b210c33ab8169c47a3e2ade7890a82b6716468d007fc274645e13bbad028ef16fa31d287435a995460b82734005e9cbed62896f5f9831db7d7fc40ab4ae373190ab60d301daa5670041cae64f73a30e66e3685bf57b44308fe2dd60518f88b5949ae5bd380ec364db9c6386b6be9a65d7008b793a5f0ac7cbb128f130a7383a617f2896f8041b13ee2ac8d71034f94231e5dfa820311a00efe33ed7a3e8456c6c5b29763b0d2d949aa1a4187e811628fbd36f64a50b087d1693f2e4d0f31c6b85a27868847aed522fc15d4b3d6ff1f82029d2aac78066d67025a6ab225da0fdc547a77810e0ae6f0eb3e67c71685242612cdbd4cbcaee91144a4201f1d1786487c89511b9f1950235ba392f0c81ab13e6bf51c9851466a4dc7bcd25884d5fd8850329b84e856634e4042bd6296754ac99259959ad0907fee597778b44eb3ffea596df3865dbb68dd8349ca59452588161c2a73f806b1317e8acc3d141b1db5c9c54aa634b3838eae0be69a184ad0e1f9f996e35bf6128e1e2f8eabdc6dece2fc584e0d8a53c527f608650fcb285d775621280439c5081bdbe5c0922012e86e139f99040a2b85466ddfb3f3c107425c82350f007c80f6e814f3d57993828065a4308ac153ea98a2d024de2f7cb895446fef3a3ea0983fbfbd037e907d53ea975a150a219bd39d271cd040c9b391de9b375921b37dd249a8dfbe85fe0ed25c19cd2ac4956ffc3f00a525628d605f9f17e42d4800623896752c207147ba505f9b68e151363ab4571b8d41a316ddffc8d58fc7dafe4c5c04444adec440ca1be3d773e84c584d28fd5a43f7f889aab35d26e609bc1faacb37006ab6d9c573a36bfa1a4a3b39ad05c0f6615ca069751b0f2121330a5611ba71d04241c56151abacc89089bdd6cfbd11d440405dffbede4efc835847e26239b7f768c01772774bc8806693a81d8ac84e397146f6b837c551b9029cc77516e4b817922f6887eccf349416019df3e56498e4189d8c637e6dfa9bf78b63e1cc21aef3d3af94d62a679046ed5a60df7f53f2bd576a874fa255316997060e92315d51c108d651a06cf6fd1e188624d6fad6b46d6c89e9270c2158054ef4a75e646999d2c9b4fbf845074f381daf5d3978927b2db9f08a409d88b92320133cd9a15bb711a03ea4678bdb9397871034892d9867cfdb59ca5ec54156c0b5f0454658a7f00ecf75b19b41432606cfc2576877be59906c1a2f58b86ddca9b40c52b7031620ee07325890774bc11aa3353c46b25c33ac7cf6923e4718c6b03abb1fda59279b64ff67d1479cd788c60dd9dad32f4ca29ed8a21623f4988f96262e911a05a89383cbacf39c135d30192eca1b7a61ecb39015cfbc93403fed87d87ff90e4d5a5660fe73d0429ad2a36c75a948f7b23c5f7d3300bc686d8cf01d4136f8efc47693fd7b3f01673689353ccea8118d8df55386a4b3f46f51e8e25df6553a97c37f3aa1c3209cf8615df7916fc713b5da6a16f9a1ab7997385c34406c80a8145b9e68cfef20e1c1b85ab9bba5bdc3c8b60efaeb363a542520ac35a769884f26bc1e37341eeb4bd10e05f610e69985824684ba2b4f1383eaba9f9d06f425ed56127dc6f9a377dd1b1a4996a72c4a6793faddc84102a2e9efb47ab35e21037c3d7f123b10001f65f35d01e93086be6cd006928a363dfeca6f8984ff2da448f1ed971b38ebeaf65582195c28584381ce0a0cdb089b42d7ef1a66f6c86bb93d2451487b543512f9872aa14d28823fcfec04d83218909baeaebdbe68c7fc0031ef5510c6af13ac26c9cd1a611a9964e0ca700e483fd34b1ff5d3ef724cf4cf2da1da90939314e12a074777ca5d5dea7d7f2ca95705bb46eb295268433c0e7b2cf1d67a9bbc41471502925e01ff9d6882db9af31b4f513b0caa56c9e384a97aef25491b110c2ef2893c73c698634a9c4eb7a6f629110201ff70c75a642a70eb5d6bb734ee2367fb5971a5c453680df312ca8c4c600fc6c87aa26a3b4a6c694b0205d4fa5490ab1416dd0dfed45b98f3864fe9d1ea8c109bfb64ac476dd6cf15dd6fab1207b2349c94cf876849fb8f1e10924dd629bcd594d7568ed86e00fcc57cfe203cd86c2c8acb7a2ea2cc538c80157866aa64d08fd60dcf435d04d3a5d5b421d7115721a517bd9b7ee8641ddbc16bb9f83d0853cf0ade687f3193b961eccf950903dc41561df7160bd2eff2b7fd5f62fef07d736a0a8258c671d10f3c1d22226babdc74df79161d13c37cd03f5489eed0d18ffd55aa6e90c363743d2475330e1571662d88baeb6c412640bb662942f864a0f3c9ce1bd004f2ca6ce309a92fe330fba591bf54ae189d7551a17a6c888c2a9d548c8fbba86de3e0bb35ff451c5e0d8b1a06f546e8817939dd16beae7acbf03cbf2c93680a911f731fffe7ba1be431278a2159b9d8357208d8c9d00849768dfdc337503ba297d925715c9c90646e9e2c2c357fbf41c418edf35e75e320c376d6ece636854dad5c13c6918eca1e09c72d6aea20dbd0a5703c0ea0c1bcf9f525e5ff42f74aa9c02b2b707741db6a15682da894e03e72c72bc11ae525b914fcce2a03718197ef758461fa89f54fa677a5561bcaf7c1613f47e22f4d9445fe3d4e02b09fe429fa61da68d10d4dfc0524991597620cb62fc01d7abf78c187b3b0ab0f65f7d54735e31907588b9702de88615e82885e4725ff5222a093456b77110e58655100b7a9dcd8cc35d0f719cefb34392d9e874683974c3825fe414d731c85c5b64633dbd43c0c2d1055dff43431ed75e1efa873f0bfc1472175c45edb36725d6901d93253e7cae05bf80b73e638d8acd4f296d3f6de458377522d7e774d2e8705f9e9caf5a861865012edee8d945cbacfadd24a08267f669d62b7bb5ea816a0482d9725c184f4811ed412afa002b853e3cab0b37c968df28cee391d6ae1b6355653fac0b37845a3bd089c0483ed9cf284b16aa3b51cb012cd21a10e701479030037de790d5e05f942a7992a76add67653478a9914c02b4421d8ac68492a819b930cc25120779639825bc707061fc7fa83ce726879f71cc80e4b7d394d87adc3b594accc298ccb3894c9cc6aa9a42bd9bc38a7b549b936f126f0923b37970c5c6965b10706f74459de19eea035a52e5d0d6c41db6fdedefe78dc3994aa390b2a790fa26513e4686257e2650be75a54b03c61b25a17c1fef834f8f25d94e76cf8a15cfe99791dba86b02730730a6ce58467ecd0810fab78841a3944a35cc1defb2a59cf0368d96c2c4a0ddc64cf74dc0804b6f11257fe4cbc47c3527a01dc82d6216af9222a1a903543692ef554b22be5709cc74dff32dd117c720d03bbc1f8109728959e4d9708c3423abdd0cf010a0805c11ddcd27d6ff3051161a6306da0c5ed660d0688a51a716e90f4a365f6a6945670165e2d998459ac1e0a628bdbd45d1867330246a2c423d42998d1c88dc64abf1732ffbfd807f3a7b48a105669ff8913b6356177f70dd761eac826a9365c4eb969eb5dc4c8ac6cb0d9b02911c02ba049399d45ef55c36da0e4c1f0e75456296ad27aa1eca053f033c0386a8d197d830656fe15267db3b6f5a56cb17d247b1b7f097794903bb601393ec047cb4db05cb12e37ca58bc18f010139d4d422dbe17c7ffe647f053f461982882099e61bb474d01dd4140830a53019e31393414892901b33382d8fe9cf5ebb0894d4b0d54fe14b5275e1ab6f62295e0aa81330351aa4f00d331c9084165b4f24d8e2240607333d10734381227f2419200d723b569218abc96d0edb5dc176f1c83f5c510b671c7823eda68291525741fbf5d216231273a29dbacb63a13ac78aa9c151019fd2bbc94066a1e19298e46a95d50a82ef365277c55b2f0757e10eb5fe7f39f1b88ecaab94dee666aaabfa954fcf11e6db1b02ba4fd900f81eafaf8388b4b54ffe54318c2794454e1d4cbcb97230fbdfde05a34c6cbe6c8658240eb272f523dbf92094141c0b6a12647dc2b203424cab59e47608304a6119a16777b6f8789045b032c4c61e5df4cf81b0cc22593c47f5facf27143491223cee5db0f18a09660e199d824ae1f524df54b5fcb777aec926606d68b4c6a7c20ba004337a201a2cf7c7e24c43d8b7c0c8961c348dab913f782a16854872066388cf45df4b700b0e6c8f620cc980761b349b66def0f332f39b4d128c2712f48b4dc246f7df4bf19b462f2c24bf91ce78ed1e22766899d2231c180e958702e680f40bf1242d0e6f38cf058c6f260cacdf0574219a2496f37b93ad165eb0d348bd9b27e0a11746292acdd2cd94351eb403fd819308ed0fbdc2c2c3589d0a2b824c31b138cf94591234d34a7dd285ffe62567cd437b59403506990e1a51119ca37ce63fdb6b490eca6b3acc47843887e09f496ad069a605b3849c19b1c2c51604c1cdbe14349030b476606d0d84561a09b0b6c57d43243c0f81a0b50bb6a3c3854defe0365e53ecea2ff44d16e29053facccfda0b9db61b255ca304b279ff325e8b1407c443eabb8dbc40b61ba168a80f4466cf5e2312039c6e1d68670289cb027db37f25a9128f2dbd890087235867bcfd65f5c0b45f09279217ce4100d04ecd5c944034340a11c27b42f7c316b775009dc445629b086447565ac89f546a7df403cdbd3e9c3acff1954f867ca39dc01a115a99f7c9a37066de5a9649a9bec9a20bfa081977facb8e70f45a06336bbbdddf7dce18ce0863b7d726e8304ec6c223739a2f875bcad98463d94dce7f6d8217f095eabc4e56a1326c69a72538f8fb84b127302725b87643485a2811727c8315ad4ce5cbf8aa9961697a11f4e6b8cbf1c7bb8d02d289d9e00d1072ee0a9d86147fe91f29ac65881e213bd763a73a12c52e0123a1b4524482148c3415857df4d68dd0c44486d0b676f5f057282339e2dd2fb5db998cda810b9953722304bc55a23dbb0ce5186a1f761ccdac95ec1bf1bc7979f350a2bf6d8b0569e947b55439eb9c08e683a125df633dcf7a13e4fc60fc1d7265928531214d33995f3f534ba3cdae407dc4fc62fc0c47d5bfcc00a7ac014c85277bacb55eae30a3b59640c29b5e62fc5c7d223b38106415f015cef2a05fdfe294563b1412a3df7261bc1a915538113da584da571e1bf0d25500d9e541fa27c6c01d81374eb78b476a4d61ed850db12ed4ed0f7b052fac911f12cc9b3ef5767c2790f589d3e69a1cc49fb4710283d2f8b3e3b5f5781a8db0b5e77e8848bf5bbf0bff77d96473158a41023726ac12ac29a288608039dd8d4f2a3904dbbbc83eb0be779d988dd3a26a8cba4d26d3dd26445d379d7058b8e01612e8d45dab0abf6b2b606032f3ceabb049ca0044742509ba8a5eee2160e79fbe3848dc562302d4e855741ed715b1c478bbf7e1a7c4218909585db324856ac1d9b46d8a3b7bd0364d3c92cd0b47501e37d61362f9817961520e491dbf14f10cb7175b0d4106c5b5d4a76fb5def20b4edf63cbbb83718b02077a140eede0ece7af8d25e836aa22a3ffabc5d93126882d251e599d82dc944b6a74a6548ae71c9146d8d35e96c2a0f712a4fec878ed25ba75b9d686e40478ffc8f4d849e90201c88748bd0a2af040d3f989033f9628fe51db025b76f9c705cc12630557e92383df030ba6df27a3fb8dfb02bdeecb0f7fde9cd9db9e8bd4533c88653d96af97046f04700f2826c8280437bc628f8ba38febb117340ecc0e849940a98fa17ff433fbf8d9eac681ea7bf0bb5d93f562edf4af2a32f8bb9b4f71ccbe4a98c3aa6b6b9408d2eb8132b9403fb8e257c75921ea7209e1c0c3050ada755459a4a37a5febfa8905bf2ff909819e604d5a4d4fdc07dc78aaccc6de8f183f55710b113196a40a69a3a50860b81d32271cc2bd593556531e57981737277617b0a13a2546eb5cfe2ff81bb82210084d74f2cf9a6b278d525eff999128283b168ca2ac4d48bf207e1f51e59bf74e71c3a85a5abbbb9ddc2606771c57e1b8da1096ba38b59d455ea6face08f70bfedb9bc8f6bfabdd0548fb2325cb5245c228773372505708ffab3102742168ab39839a33717a6a45b8abedbbc8212956e8e265104df45f1ac6f1f9936b6e6b9e76677e9dddce692ec841bb6cbd30b380e5f81bb267a99d501ea6c984b0d589dc4cb8acebf9ba6fe13462292b66825dedf0bc3e87da7a182780986bfdacd330bd9b20f6ca27355e0f4fd1d92bb024f58102dc966a2678c434d694ea087d35d9048ee7c6f08a0277a503e70153a4173b6612b9f3a453412569ba6ead284c0b41195c2cb83a082b836ce4cc85ada1d870c703da09e743aba41716860eee64c997218095a8d2b830723828d1ffed69dff08a09f8a90a1a5fe009ff79d9b8848d20c13dd56d8bfd44df2b6913c3f2d1ccc84c5f135d3501fefc5f1e6f62cd18253e5efdca8243b12864df5945b77a4ff27d41d8dc3d6e84aef205a93aa14d23784c285ad2d262f98629c8545754693cd9a9769e79c28dc5ebef13ad0fdfbc33783acfa76430abf40ec3aabb1d453f2fbafa90f56efb050b53bf7a2286fbac4ba526e5969a121d2f572f721f07824131a18b8fb0a2868ed6367f5b140783706f35453e014225d8e0d28f511ee1ae8a907f3d4c7145b2cf26f97e38af39ce71be9879db67b374849a1e7812aa8a52d2f0963dc44808741e759849d9a68b5a25f0fb2b466f74451f15359de8b61ea623b2577ccf91196cfd2d1d9252e1ab79a95ded3ba13ab3db60f57b4439dea410bacf5ba35972335b7385fcdd6ec557a2d567ee07b7b2db31a2f4d660a132d6294c9a057deb65c1cf1028cc0f6bf5908f90159f54c6d7b914140b48ca895893319fa14bd174b01ea2d41092407d46edaa5e2e45ae342f0c0ae8eab592ad89871244afabe53ae2752b1dfdfac57ed3d16c2cfbb9691332e4c9c2435686a06d6c80b875c4559037e1c69cce6867c10c767e827648306e9b5d6eaf56c576594319ac3944fd18cfb29ae9887b2763b648f99f6a662731eb36ea43221e6a603620baf58c2a273b30afd084d85ff1b043fd65a69ab24d7ef3483b9e458ab3c25374c95a15465ab01ac7da12d6b8126b574629827708f01208c8bfa2e24520462240c22302f31d30d49d4e7f3884686068baa5167633904696e421d56724052fdfe70eb3a70319f2134b30909647605bc92718480e932e27f3ead0e07f6d8f3b0635073559ce69085d240d8936559b547403a12cc4b1e3ff1f2cebf5dc5806b08334e2f36f0858308110f210307d208dc8d4d95b6d9f24c26435c1f86a4c91c51283714db627f28c24d58f31a9172014652c23f567b89c3e149cf2e33d7f886329a595e386d84f5f2327e1f052ae213f92764d280cce4b525a7ca6c789ab04cd878d0e2d1138ce6bab76c0696d89b3519695da23c868e8c5c6126bca8afc215f39dd9708891d9d520e0854451173057cae02faccad5b5d5098d9a40d0da5d0b14827b57edeed9eda9a20a83b1be1a1a0664680c01b22ba61f8641b9972e5b652f1d7cad11f4cab288f131122fc2d9f00b9f1fa35f43b40ccb1a13f57f41dbe35e8269ad5fe6e6bbbcdfe2684882412d9bdb97207ec057205a00599c3d729467cc2277cc2a7683bbf37db6eda4e7eb64b390cd9e19c88783b29cf61c4d494928dc99337d1dba9a6af896a425513141585833aa188a0a0484d299d4a31ae977742a5587271a932d0c64a2028551c64253578e1391d6183d00f214ce42739896ce4888e91248c7849c06420c15de193e0a63a9484ec0e4934c624f0eb624a7a26ce513135407b9eb879925166dc0754a8747ac6d1d0025bd59d1907825fc95a86d18c0bc156334e04da665c0e0068ec22be8e18e70e14f9b3beed38e6d3a72125e4faa124e4f938c258cd70eb5b1163248c8b6688fb94b657114ccc0a162a640b5f58a655f787edafc2e62815b6f92cb64f9e62c566b1cd5fb181567262f68a6d7ecce6c2d203cc667962fbcf7f61794294fd25da420fd332c4deda8b70f742bf7bb3981a9fcb0ebdb8803e14b4f21cdd617d70c6599e8b5609ce84a0c81cee5a2cee5a585636ce5a62fbe74dcba2e0e412e7a1e226a41feeb40fcab8b8c3dd6745c439a025f8f3e4a80e959a9bcb760a2bd435a0e944d8f1e5b662ffae97dc60b6dc443bb45f360c7d2cb52c552d52252823a6c6a6d847fd986481b970f9477fc73ec1192f7d24d0d64aa12364eef3f9a00cecfd31b65118ca029382e9e08c83ba1d257330a06e7b8b2eb5fd3f2528833e685f1bdc58b36052302de040dcdce7dbfe96b34adc1c02444b2d52a6151e63502e61dc453e4329a7ae5d36d4f004da709e3e0c25868f21841002f122c60c161c0001273c50e6e993af3b638c52d660be883183050738e1417d7237270626a516b8c00ef462bcb85a4e864c6c4065736f010c50e002a7fb22c60c165c10c0009f6344056efae4eb563e087d6c20bd15a18fd5839090d48a10e6595144ec56683cc850c7880a886c8c65f0e5026e23232ad82e64a08c1f41193a468a50001a39523d4cb1f480434f886ad0a16ef821546c6eb4637486f0e81441059431c6b86520d283109223031c1f421f126407a86780e5e3d01a6e1d31aef032858776b84888971e9d213bf888624e9ac3901c7486f0f0863c81480e38cc3943a11a88f040e4053d1029824811224d88f0108942c40944a660848d113c181103238e18f1c4882018e10423aa14d1a1880f292832040f458e28028422521829192181111b5113548818009d279850418504456062841c7c9e90302c74510e53cab816f1203bac353a84b54208bf0d219c3f44fac204228c6c2e0781088f128164bb6ca853048badb6cb1ae0c89ff31d904696e4c83f9ea8e0f4b8b47119fff4dc586cda033551144a5ea05d9ff64051144551d4463aa4a1268a9235401aebc3dac891bf35b98cffbd39dbb8c4369286ee80d407a4f11d70647269dd9a386be2acdd68b604bb4161a60be50303b26d240dc6031cf5bc9450946c5993e53af398905756344dd334cd344f97a21cc64a1429e30fe546c95242fe54469ba3a8ed9af5b6bf5c09f59039cdb47d8821320fcab0ef8fb339b7d99cc5c31545622628c3e7731890ed54be2724454ace921f2dd58d87f31da19d1cbfaa2063f48cc59473083d093d093d093d093d093d093d093d093d093d093d994ad03099a8e785940829914a795e48897b578043498492c85afcc9134935578ea45401968fe55683b50cb324cffafe827f3e2b56e4fcd913ce296383362b46ba4238c8dc079b11ab89329bf056197dacc6759412e2b94ae071c3af10c4fd20aae7c0089b9bb531bac590a3b4af8d6d3ca01744f538da20e6d5f9a3009bbbc255551b7b84ee19bc3a06979e5226fe0ce93aa6c6efea7f575026be75593898aadad876ab2d0697867e7745ad0a61d41e438eaacd37ae70056f957139f6ad1bdb62b84cf48d31bc64c6e5d815d67f11c3e1cdf0feca04a5a21b78b42221990bd92dff881442926c213a211f423e213f1072042908e9d121a2b404227420020544cc8008179c80ea201341080ca8c842d80d75840c0102fb69c797b5cea96d30948ee2d9fe93674f892383c8ce5a6badb5d65ac793d66aed35b75bebc548556559d7b46e48d7c4fc336d6a9acba85d99a65dd33fe79dedbfa2e1bc829158664bcb353f2c38db1f7f827c846c7fd0694f1964fbe397d035b11a19442445a2e95134a5a747f2e8b90290060070243f3f84343ffab6f4cfc6816eb6fc968d6bb1ebb36c5c68d75fd9403d7c6b9ad39ce034cefab414a8dbf2ad8da3e1db30d0d3b6dec1b72f1f0050daaff4889aa08c7d177ab3edbba6365306d9dffd210cf4b43dc99224a0d34762249eda4019f331cb57b6a4381b3eed20fd01692cda032220bee6c00c99fad8f03593c3c83445b98cd44cf4319ed785b7c3f8e10ad5fdeb821b6ab731f9cd8e05e0bc07e56105156374bbb1d814cac8bfd732cdff3d79d832f334d34a140943f2aca0a8441965d44c26209aaee4d560f4e0cc7c11931cab6c07caf09f5912f326663b70667ec8085972d68dd60d21be7821dde768246f54d79d24aded5635abca6ff89450de6cbe94f7c219f89f2d3241e6aeb8756c88d19035a8d6f2a59e70a62586c4c90d49f4e7cb1a744e8cb452fda558cc0bd5dfbf712d7d2946ca3aea08672a46d26e2531162c8cc91bb66636aa1b958ee1312a6c424c7ec41a00f7acf08b1712b351fd9540a5a15b38e79c1323cd7761ca40b2f67c9215ab48b95d388369a41a514f5d59b65a175a197df954db0e54d91fa68fe906e7cd50d31e3d30cd381d8fd59836e00a3c6cc0fe7a1bb09817b0bffe06a66f60d3864faa7b3e49d6bab1186215527c18a5dcd7ddf79d73dea794d27dbfd65aabc54875d3cd5a6badb5fbfe3ccd130a954a69110e15d6c2fd19b2566dff6aacc57d6b549a96b40c352cb6fd1a169b6a16556efeb4a6ee1862953da90d9cd9980a953a6e29298bed0087414bb4f4392dbdfb73d4f58dd5c92a512f593be0bbe18434d74240e4400cb10a8cf329b6b9aade6e31e428d96a3daeb5da2c060b0b102be7815980db9f04b76b9825ae47a38891626edcb76f43c79618c9ee499a8fd558560cfdfa31fe9a646d92b565ac62d61ba3cf28403042c5480f901f47803812c4b22c8c8f1c39c25335018b4a486c8e547124e76643140645311a895224c628251227488e902e040c934827fbda5027c969c7cf31465194f2134ac293240a8410421821fcc4239bbbb89b8409548a4973c02129e824e1b1b9a993a48424b52592258460950a10a1891f80d081411150ac40856cea3bf8f01cca9f9c29a51487d46dd950e748129014c15da0424d7017c2944170116a828b920d0f20a6920d0f5a8a4484d01cead113254285d093c4d87403244867ba0162dac9a95e4d514a2bad1b74c804b47ed86e82322e7ce9c99c180594511f7a0f2dd8f063e74f2cb1e13b00cac02fab4951d5d2d4a550d02872446b4c37406a90da5553bda940aa094e5c531d4e1021a70e2748775dd7755dd7757d57f56e4ee5d9f2abfad59d9a2347b27ad6f2b0a59aaa536a4f4d5d2caf0e278890538713a4bb30c61863ca59fc71637a3b2b88902d1f9f3a9c2072545dd7755dd7755d18da2f6270ce8927d6d7b2ec77d9285b3e6651996dc2f2c891eda4907bea70827417e65182535f7c53188f2d3f2b6977caedb9291268578fa1ac78aacaab76aa1c3992159c4f447bb9e06a3f406e10ab9323cb0439ebc602627d2c53b45016ca4259280b65a12c94c932d1cacbd93259a6699962756fcea1d0bfe59b48e6846a2a958ab4f22acf61dcee565ee5551e8ea69b5497c2499d524452dff77d5fdc62cbe51bcc26b2b7ab3775530ec3de9c43a1ff4aaf4bb1e536faed6e17635211b4affdacb5a6bddded1cc6f57df96a2e87e6ede2edac6abbcec65b694db94c76cde590d55c2856de8d31fab4dff77d5fcaaed8d06e718310b42debfbac3dd9cf7ef3fbbe2fa6dcfab4aacf7a55dede965ad767bd29ea954e7cadbfed6c674261d0854f9009d40f5b5aa629b6f4523d6c79bb27b6fc86f0982be20de22d6e7d3112687b8679acd6f55ddff565d7875ddf757d9a93ddf56df9f4de7b31bfaeb634cb34adbc1976596d55b5deabfeadda6237b525add7d51cecb6fc88bdea8b2bd6f4b2df9695be58109414ab60583f66fd02aed7de2d8d3db6790b2b3f3f6f1c0d1f03b0771da3bdbff5738bd11eff8cd1748df5f8f15b9f1f5b333c6f1cfeca425cd196c671bda671b83c0c74e3a6d6d3a585f82e1a82f40cbe59fea3678b9ec177e642dcb81cdbf14fe99605b6f615ab3119c0618f9f9bc177a63911ec1abeb1c6f4fc19dc92db67f0edee84ecee79db05abfae93038e79afc11abc1f4e74dd35ed3dacff0bcf2da361fdbae1972253f86619f315d31206eac71546fd5a8b415ab8d3dbe75c4695befd79c5cdeb09f3f3d907dc51a87b710dfb29e866faffc8ade346ce29f1bf679d3b44d6e6ce3326d2dce7a1974ecf978e3227edf381a3ed10dd99fa3a7ed58c5c1404fd8c6e5a8c19acbb1ad877fbdf53364a5818deb40e75356318229ece81e883b5631822a7604edf8de8600d0018a9a0fa258a2c4922596fc60890b4224c89a0c78902b91243c8ef08ae04db1e486253a2c31c192147825f052e0e178427843bc233c1c783c9e135e10944871832b81828ddc81b7c3bba106afc7e6f2f7408957832b41422a71628a4aa0dc10c5542245c9134bb07b15124a9c28816243cc7bce871042b8c130f22dd3b860b4d6332ec7a603d82dee14a45065cf303fee2c6540b57a9d19fd8ad50c60abb0eb06eb5fac6600bb05cc1eede9779b52467af55afdc66c1fa2909b90f3863a4a4e4a6c94f088314aa9a4537203e10c10aa29439173c849a4a8a126a1a29b744eda52830e983041921e382c810817a4a072f99b4481ea909b1c61a154e103c98d4d14337fb40d7590d06073f99d096d2243c9144977e3845c45f672fdf13284ec449e4778e6bf8b2341d0e2d4e4bd733e494e7f69c2f3b106e7c45a8c52926a447df5ddf26510292729a6c69c9e034faccd49636e540ae311d54eea964b1e5aadc3f837ba9d9756d5c213639711d3aa5a16dfcbe27b55989555989565ac5d195bc958ae95f82c41608cb2674acf949e54ce4e0ecf97b393e34520f1264a8751282047069071d2e8fa058cd2a54f4a27adf55ef656d8c2d785d5c49d65179669352b2b2e18a9e52584914097c885e55ac16ae0d68291e2ce2d584ddca089a10bc8c5c56574a1217f6e5e4aa3671c8eed5a7edb84d0f19c4eddb19a976d311ad7aaacb5d6b2765a6badadae9d5756cac1e02e4c37d1f8c02505b78423e999dadf412b28d01d1ff48dc5b6761c4636c565e46b365bfe0e97a5b2544b0ba0b0e5dd59ca65644b97daf25d72a48b2745ba44912e50a40bcf963c3b3ee7e2844a4ad2d01e4933a7481aafd4ce5d6d96132923ad9d1d39b29cd02f4bed6cf95a49d2a47aa664543e2803ee975d5d52483074c1b96c398bd81cfc81a396c8b8b1d896c961645ee699b2ec3e9779b53e9779358a2d3ff358522d5e06c4c52469bcc56bf15abc16afc56bf1b6fc96969c961d49537d23b96cd72e5e0f3cdf69880fa37bb5efd5216a27ba294b6253ad933b4c12be51fd7d1b118b1143665acc0bf6eb5badafcb64299fe43a468a91564427a84032375b7ac89f8b69510dd975156505af9539497660ee00634d6a8e9e36ada99bc8e6a84d957d43ae2fe1aec13e6252629bbb6373ce893da6d7b5514a29c56aadb5564ca443b6de5626d4f5dc94b25dea8b1d57eda5453ae4fa12635f3d09bbfeee0b7fa5636aec4ac7ae717df5a4eb04e18c8e7de998ebb18fa95ec7c6b40c97ae61b1b18670a6d2352c66ace6e869c22baf581d21f221c777910f221fdcbbae9a4c221f443e887c902e754d4d0d8b2db5150243171cc8c60803464d4d0ee3e523ed0169fec78e4fbb1863c4347cdbfa93cb484f8e2445a2da19d11384a35a773818e8694b91e7bfb86c385ed49334ff14891e70245fb301ea0165e46b4e4099fada6b180d07f0b0c1e56d00991ed3287d4210e8e1cb16e31f7a1d2bb86c31ae635e70f997bfe1f22fefffa2431084eb1b2f1fd22110fdcb8720f42eaf6305d10632b98cfcd016311aa21f993e48c710ab806c5ae2b3acc40d9b2f5f43398c9797d0af87013409954a131d76931234414193aec90f4d806832c4bf8b2645a0c41863b48132a65b512c29568f4505f3c03f806c292d94936bdaf21d6ff13af499c14e08ec3e6d585a5f97919f4fced43dd2c71a69eaa9835a5fbd453f6a9825fe533b7d2722a9562755ea4e5f3e89be7c1db5ce27b9ae70c0b4feb516636badb59aabf5afe8cbdcdd2e4f728cf638b2c7af69982539d318ca51f638dbb4e8526aeeaefd9c736a4f29a554abb5d65ab5c7f6ca36510ff2f5d5273bdaa552de34a1ecdb4c8b7a90ef5becb1855f7bfc242dfbbb33cdc9b0b1c75a866dbd8e5d237bfca44c4338c3d5137e88653a267bed63f0ebd89a9621d335a08dd5d2b68f750d68cbef347f86572e04df86c14df8041ae6f0e2846192dd66cf09abff78ce6f248c6a7299d9c9d194302a21a0cc347592a6e2d417409a4a03389af331ed60d000ceaf38f3135071e6e3481ab711a2e2ec49df07d49cdbe8f9be03bccf69527e148a94990f054a942852a4f4f4ec39e7744d9b1039c95cc5b1d9128b9870538cffb9080799bb187da73129a59e474da65a6bf53c6badb5976f34eebdf7fa265a027257b404e4ee4ea53c2f9aa2898328eec55e22c31a773ac94b36980c3520d984a499ff4189dcbdf7deebb2a7969f45054b1b587e3eb1eefa317e3e3eabc3193873777d1b625ec06ffd0d6c55fa56a2267e40c23e49d7ae8fb59c433fb8335e68ada63b7077777777778f718f0fa3bbbbb5d65a1cf5e55b29dde79c94525a6badd55a6badfd3ed9c92e95f23c1d5c5e030291ac757bf1806b88262447f25d80325226060b2dc0510cca824b16a40b108600a08c843b356a9b7b5b2b4435493901b6fcfb73036d181826786234aac6e19aa331df692a0a2748d13305154f9802852848814a1553a0554a3b4650030f1b6ec0c1a6470e3e7e9000ce481a51571de08c7c1ab1ee0067e4539a82344573a48c7c27972714458a24404af6c8d1144dbd1e722aa6804027a57302478098c2880d4a180204cdf9e13bf8a033da90ba4d7474769882a10bee96b67c0c034f3a6042761677c21ce85b96239b1e73ce39994cd94bc030c9b4148222e3eb253c4d0cd38ad918b98cbc2c6623cb2846c23ec326f6246b67315c663eaed6de4a6196e40f762366436a8fbd86fd0c59357de10cbdecb55785cdb75f61a47b5916267de408fe8591a2b4e62547f3317d61a4f9148ee0438c845918694e38832b0c9b36e65b2fe40b5ed7755d51de0cfb0b67e663168c9695699f358433f3351d37a6b90eec4c637f3776e95012320e2c5fc0a731c42a9a96accf0222b55d87c9910d757254a09303c4eeb6f5694b58eb087907a893ffc958da4dfbe08c530aea224c951da5865bbb73d3ac2899cbd6e7833266aef2b594c78e537374c786b2b4b9fa312d581cf76d0b777376db875b8352750a184ae80e9940c104b535242413279838d9215adaf8e5856a041b3f3f374720c618638c31c618638c31c618638c31c618638c31c618638cef51661c8e2db50e190b60840e12504443444344434443444344434443444344435c702fa52d6908899c013f6d1cf1ab1199a31ec8dbf5af49d2b86cf99956e5caaa705555d96353e4b8339c354b573a6ee7280ec491a33c5c0ce4ed197286bc97ae6eb6bc296fb1e3732db2ee86be6ec111f5c85ccbd76df92ddf35c991f4d36e91c14ba99242f3aae99cb5cf9e90e3d6b42d6ec973af2a7e9579ceec24467ad911cabe2fbb1d453bc89cd569385046a48fd1bfe8638b7e15758b90a5394d06558e166d9039e9b613a98c741075909002830b17212ae67411ea61014e1224f044c1c41072a04a1e90001a2801a409131d9e20024e21270c72f003063840184191b863dbb01e63a7301c0ddf76cd4d8cc3d2e67cd77a831bdbdedae23bc5f00019ea2051dafe2c29dc42dcbf813d836f1cd9831e3280e55ddeafffbc6bae45dfc761618fad8d0e21bef5a86dbdcb11dff667a991df3507837f9a9fa8f42ed426b57468660000822001a31500002818100a8442912007234551cb07148009738840625a389709845992e4308c7206194308308400180230325252040263446b7bc2ed81ef52aab368456ac8a3a46a91b9f3b8a1385244ea4fa2601c7a3c8624a4e0e627a250404c392500f6e6c015463cb3afc64ff2f36d6488e3d984e692793c348e8e89bf60c78babfe9b95d62dae8104f93ca418e11a8a2af859f6f0581417ef5bd863b20c2d70c3bdf61389965f0dd6fb93f4f6e43756e5db4e130bbd7ad36ba8ddabb4597ed0d5bc28289fbed7ada8c78ce78f6e119f9b77a35398dd8e120f219d6bf62350855914a43674d8d6432f40864b3c4555b27eeda820661ee531a413727d7abca02a86788b09d42794b188540c56a860fcbf1fd7185b61c05e489642edd686b300c43e1e54980b80a8a381260b5897fef0d419ca5ef8e03d0c73af6f62acf6fe6344107c143ceaab163c9c5ee92bf9a7686b13847f963802f93afadf72118152fd246016e00d48202911e74d94869bdd873db2a860fd45333d1741d5110d1ea8b21fce54b708a23202c1bccbcf22ba14ef5f33f3994393dc8a1b7e4a6a5feb3197ebc0ca4286f2d9ca8773cc22dd7fa2f48b539983f62ac550fb0e6c29d92b52cd61a8eeb9eba3f1f23a18e1673a88f91e81412a605fa2bac6b8ad0443c50d244d002499a66faebc051cbb2581cb44a361a5de1e65a50bce17114f44b9022d435a07fb1d1d6bcbb418864277b936379948b43ba01b5460c09a9db53346db0d20e7362e07349b1a9020c92d44a0784d22323afeb12ae3d65a3c71b1e592d136a0aa00b67b59846f43c4a38c8ed4a6ca74bf9d5b40f4ec9fdb65b425c5ec88878bc8e2823afcbc2b229119fd7667b293c88a88d4ad5b2773a3f3e8b1ba3f3d0dd1c8ddcf0848091537edb97b2341726181d86f03b385c9fe894448a669e1225e335cb8a9216e7788fd132ba99ca781efd0daa103aec97bbb3b552a00dd8cac8f0330a205c108e36a348d45c9bd1483c2d80f2f951b8df3a3fd1b384c760a41982b8c9df92647ba6b1fc5c0a3070c924605f8ec607fa8d9a216170136250ad9c8695b2ab394c3db70d755108b9636d0a4dda76eb00f5736998db816d7b603b453be23d48a157a0d8549af2364c14c8a59427d5ee952c04d97fcf7f131d28fdef04e0531c28e9dd50b09d5653078f42299fa2095d37c18d4ad43395821db515a240a3dcbd8c162eb019fde0caedd659ed2e71b84738dd6faaeb9521b60dd9b1c0ac4123e26a25ce848a9b4f8ba8b55f52d203835d2f072a75c905a7f11173572bbd25ecd37f96f82b798eefa886685c895b7d0820d86df6c69652dd2d5e0774fef4b2e7296332fd724df2ee9265a7aee10ec657645329e3d8eb6a95efe6e2af749763dfb20d48c45d6a73b64db73b2fcf782458608ef0c87700113c0aae2f6bb4688e373aad4f3a319ec18b5bd457dbc17d48aca48cd77161a37b7fe6567d7f28eb32573bbd91e7461447ec144bb5e23ce3c79811aa768c6f8d059950226c9ba001c1299551ac57ce158122ebb15f68b3a374466c808e9a8dbb36783cab710d9ab8698a6479925733248ba42c3e00cfbcc655c04c834010e3142ab49c60e1595c9ecbf33fff23098d92355c6c223ec990d09069956b6291e8e45f4178033846d5c2f96913525d205d26fa02e4ec012100f977c12d9cac163a3cb040d92a41c286f2a53cc63e93320cfb52b1cfd3aecb57c7dbe77a0ea85f05e9f583fe4103d7c0b93124a9ff1e4bd1f9d6760ae43404ab5f96bd600550a29968beb60e94d85198d6b683bae01ee710ddb9b4e523885a47d9da24b5a9c2f26e92e3e4032350abd81c63e9bca6dafa5c3a85928a3fc9e9010efb982d5b48d974aa76b2069be5c73370c21efbb3274d5a9301025fe3fbbdb2d71fa78e5b64c88ae2b1666b68fda1fb7ee135e77d854a86d2df35b7713d9788ed1d26e39419f192cc4bf3cff244265cdd5d838775153f420a6b0cb535f6fcce2190adc6dba360750d6c4b8d95c98b4fba3a9b2caef3f0d96601f5b69617f983365b767ed31bd3447ee0186f0aa3845fa0092af58db654d3a6899f58ada6b406fcd39353a18e02a37311be01a6a2bc2911ea457c17e4575e75b93fb096f47663040293734473c1c6ce1008577c20510ee6267c77735b6cb1440e1aa2a2fa520c70c5c0f3e0eccb40a5ea3c41978ee82a4deedbfb329f8d34627e794726430585c5bed91b552d4412edec053a4bbafa793f751fc1b09158ef9817fc708a5ace43b130446bc601e00ed163c5d78102a5ce0cf2f8164f0ae092f87a8388134bb16dbe01a4f9540ce87ab0296ef22f41294786650efc4154c50004e3ddf1bbc6646f2de1c9c8a7be4ade083131ffb724251572757f29b1528bf6313e120393d84a7d3858309c68bf2d8b3f096614bb41ffbc0b3376d59840bc35f6ca2f1772cced1418b7bf1d73c3d0fca885a2dec26a7e6eeab0ddf13f4545a801c62317549b3399a4407cdf086eb7e0d826b7d5c0292bbb1d4db464ea36f1781e2c3bedda778cef8306031d47f35feb60cfad20d3e09c65d62058819cde0dfd7853caa70caefe94bbaf8a759888c246844b73b1ea5cd60e90f4913e5c35da6a513cdedc2fe4ccbbb5ae9105e92919e681b4d5bed3ade015dac5617877691a51ed74148a9dfc30fc64b6f15ec8370bbe8870fa53c091ba3e2a4dab6493e95a83b5bc7a02352287456e2e5436a7a892e5b494a801486490460bb9b66807bda244cb5c2a72a3e518e1b3278e8b0c3830e1d387cd0e121071677f0c0a1c30e0e3a74e8f00107879ca1a99df3b7e8c48f00eacfb25a5bd57c4919d284234869726a5ee810b86610e6ed0bd5b95d2a28c763c12394ecb27a69975dd313e870bb642da8dfe20b0f4dbb2cad4927e425f3e5d847873daceaeb610092c91dd9d0a28a16e988b3ce9b2a070070559a5d88ecbf08a28bd22369c076e3d8fbbc681cc3dd57347a726acd9000284422479439a6f9b2a886f0eb50c9e54e56079220fbe367f3b854a813691bef89bc5070cfa7fd7dd1dc50f96dd93ca852cab28e3f7012fd23d00585ad474385d16d0d69e64f78e8625ccf51ede420223b6fa1e305b898af458c19c8a404af27a2dcfa6ef35aa4652b1117386f4730a071a1faec4acd3dd36e4a3f038bf2b4f1b956637311043eaa172f8d19501b5073a5cc416dc4dfe7e6a89b7dfe28871173eaab28ea46a66dcd047562dcf8926b83fe09f8c453eefcebea889bc9a4f073d1d263ea903a66049ba6ab904aca391a055ce97ac1a018734d3b1c80c632eafac0f19717e0c25d39baee2946a241ff63b917a2157acd50dd12731240b4d020f37180d86f14fc3b9cef71dea78a564eea08d57ceb4d0a035bed1afc0da3c51e7f1ecc0534a40f9f4ba2eee1696ff9672c182678168713d19a44fc60aca829ea03c61174ab95e0aa3b8b9a84e9dfdc9c24650a82c1efae6594fdc82c3dd83d263636da6616c6cd4b4d078078b0443d652ec4c250c75a952da92182ff809cbd9fb2b0ea16e6d3cfc5423be84de0f635f1b85e9ab8b5954bfba18ff9f8f8908cfa8aa0420b612ac52d771fedc47ac0dfc69ddf55a41f8fdfb0ccbe69b90ac9e9ebd5562fe4e285fe63d6b6be0a5cf37787f99fd8dafbab48e505b0e8398893c9c3526424326369caaba5f667991212ccb48ffbd6b63ebd4580cc9dc14258446024ccd58355fc3137c0c6992da37ff553d26300163eedf74b3206c8902c77ee0f8d23f458873046f1152622d731e2c347cdb89c6fed535ce76118308817081eeca0b447ffbe80232974be44c34dd57e14bee1120be30a1f01bea68a623660daed143c768e8f1f01eab95ce138f0b6129f1111a6435448a70626f7203266c68dee4d32afcc70de2ee8d44ca461cc88f6f69c4a306f1048165ce9b62e80a31f35591439761e2c452e1a17bab2748d7b8ea1194aa90f1ab06597abf609b48665e26e870a10f7c201f1756fb19775ccab78977aee11baec5a63891278a81e44415e86249a05e0407c93c480e2e26ad22f6071a5e8222beac58fc442a833f7abe68f3190204594e38762d0c82d10e825793d08a08dc43f5cd5b2e3351b08e0011b26c58fdda5a65833a08cee7530a84cfdfec22c3310747421acc5fa04577d4d50d37381a78a56965fbae93529a178349dfe671e8e03acc413b706fd46d06e420ce6d6d0cd63b4d08bcc84c14775563bdc8ac9075db735ce11a61122ba4d09a1baa261ddd61848e75a1a75b686595a5768588735c79471350dba5ad34459576958c79a970da31519cf2adfbae2923790a218f27f759bd8b0cf3a79dcac475b6f3e03784c585446fc803ca1353f3508bdc2179c6c09af17ac5fcc4941172740a4a940cdcae7f8ba0f954e5752a0d5e9abe2379fcfa11358a2b85a8f96d3ce1ae931db379778e2f684662ee621377bd2356b2063cd1fd87905feb95f13c6600f2ff367ef641d048b058ad840e4f92331017a06449f5de52c86be953d2ef209cb28df0530634141ae797170763ff00f0af2a262bae85b873db5e31d01cff3efb3aa3c6892b3f68b9d89b00140b8531c13c1d93d4d34066298ceaf4c02db564070efeb1b4d6994e3600e80468ee127cf0fcd692005125a118df4a0ebbe04ac3be42cc6c792139c7791035149300280dbb87f9fb1e2bfdf731b981e112088baf735c448b705a5f68e04a83260e1bf1981e50cc7245b16105050cec00306fb8341cb69eebd703b489fcb4ecc7030eedfd9d654f8aaf6261c6e8069c604566e0099f909f3268096752f57aed998ffaed8d4bc7e3610578add0c1508d33ed748c1bb4a54760a6815e19e08b9ed7f825f2e8cde3aa6c9a900974d802e0f2fba9455f1993135d0032192d50ba8f133821ea58d0d7f41a0425db47c14d88bd1b3f90268fc91678e74cf24c348323d647f0f0d7e7c4580289e626ab096a04079b26f10e10feca702708a0da080818a1b8013ed0a3845313b113d1830ce8070b4953d365df9b220d01b5a6089814de60a1c88ba2c4a8f4a26cd87e67c45163046575114ff55beb61552a0ed644b5a08872c4f4521e37fb3cbaffe3f0987ad66d0510ce257f70fe78c42fd5cede884c459c0d67e81465744606f78d50ba994b815c2def4df2e69f5358c57f74efd0fd6494e9e1b4c2a74adef810202ce03a48a54d12912bfd2e4de4bb92c0d7751e12ffa1ce39e683ba3a6b7680b2cb2ba1962bb2951ff48762612dba764c6aab983164fb6e84225c0f8e310f758e7697005c542cae9dc02a49a11e9aed6b4746edd4445e6725306aaf7ff9d016ab532b413f4afb5f56b78145521ae975473a22e72d3f284c0d38b4e7e3fdee6776626ba5cad596e2a0e7dee4db58a8c36e8a8c2a11c5f7a39302e0a133ca1a4500ec4c30470b29c6719dd0895ab8b4e521ed0c24f5412b9acda048772924b291272f41f2f1913fbba096b69a0008dd23970c8214f7175d3fd3ecdd540ca587e4c576cbafc734e589ca17f8201d8feeb272cb048c7ff7b76cd70807b6930e81a14e38f94b0fa175e7a9aaca8c893fdc29327aadfb7888d77682cc413208d41b183e1dc911af8c99a96b95204a611c2e8912cf807c7773f821db4dce62fcf3e2947acdd09592bcea0b0ad2827c25fe8e56d987698365f0132bb5e6dbae4626eb3a215edfb8f2c1348511ee7c13486412e78ba52207fe64291eb0e58f2c53da9fa60aecc6ecb20b91c745310d548dba49d303b9fd758ba822716a4c050931bf89783da0a999c2c17bfbe40e67a81b0ce5b367b9114044be911832b3ac044e7aadff01e308995ad04acf45d1f5fe7d8295e4ee5a283b2988591dd1372e117357c317f52fe4501133ae95cad7e7d4e901d7c06f29e5a0b1d3bf1d27ab0e34e712fc58c7aa1f37acf432893a02da898c3328b2f5c5ca1e3694c76ad78014c4dcc7b5222b5db9175e63fa06bf3801ee0402f53ccd91012955b1491e66f0480cbd91c3d013815610cb048cab1e4c9eabc245382bbef6f5b02bb18dee076fae3ec78d5893a0783e5beaa7581a0a49434bd2d50fa606ef5bf19c5740c45104fe4d75941f63228c823632a9ad7700be4b0ca3909d080aa31292bf749870b3bda8711a13f412f92217e1f69568688da55f31d2af9dfa435fc5832e599549fa546b66afdfd175934861541ef320e8961d4df44ecfc3a12b477bb692e8864b290ca2433720662f51f7951b64588cccd8d5ed4b69ab2dd4a9aad0efd5d069356aba96001c56759810964e4bad956d51c1d512abfdee2370aea6676a737569ac7318d34d8226f8395c73ec74ba4bcb53a45c37ebe841b6a27b891d82899255c4808608e15ac466f450a34bbad3b270720b9190d6e2e566c2f08911e2395f812ee1c3b1e73dd78e75eedc6c78db59b1ff76a37989f7838fd9484b5ecb6d849358b56e2eebdf8b7bdcef1ae999995fe49919e7b2621796a95241c22f65c07523e6cacf657bd9df15319697d64a4e3eeba191814db3acc841e4a0dea9b2cf5e451d0858d5c4323fcc5324eb184f3ac108a9267536720516c6e82506c38a0b472acd6dabfc3d05975ad176281a84a663cda7e80d040f3a88717abec8f62616c06fb0d2f26dd3c693f37e288c2e576ac67722636ba96c7ac92a09b50f32e40bffa5a106e0d1602158af439cf4cd9e2d439556c7bdc6b239240d5eeb8e44a7e0c087bc245ec2deb95172e95a206ea0bff799b5d5515d2213372125d45b14ad2ce9c3e4634ef0aa7b4962cd6e787316f399faebf4e49b2f9f7e07a858d00f79cb4360df68db35617117903a147431dff8391cbcc3c8421d15451f7f3c688d9614d564acbeab9c24782138e16ac7e81fd415b6b957d839393efd409f98c4107c86e50382f70d91e0b4e6bab5cd15bd83f326c870697e2e4f402c489b0c4b8b214124c3da8eccd7f8d0b987f33563d15ca5ef17cf5e28ec899c2ead9ee92f72356a564438bfbc134671f6fa071937394d8be1103b6b610762ff535ff8edee6cb390a7cfbbb0579624583da60e8761f176b942d839f8fb8271dcb861641ce4725b8632a190d39cc212951bdadb700b2c8723a7c6e91eb48f8c1ab481b14cbda0efd628ff035ba7c33f5fde8516be70e14059b91d769cf9a0e71d92f64aa943ad52517d92d54525d08e2501271e0a6e8ade644756341a455e5f85915a3bea5a9acd1a627005662c2ab4e96166bab06b2516f03af9cee8ecc95b2b68bdfef98196756a2da801fdee63b0a5426a89584396b32bfd5130c5f7a6b93b8cf590a144fee3d7ec362cb0ddfff7c75c1e20a7da047118aeb5a6069e76dcbb18a6de3540ee0285af793db04b33e86a06403d9872bdca753fd6b7ce8d10311f9dd00c2a41f51af7c1aaf548ca8912aadc1ee5a3d45b8eaaf35fcb70c1ec61e91ac5556e4119ef6a1966043826691f610ff55f0575eee89844a038aff97643e98405d6d428560e151e3ffa40cf7db881b4bb8f50c4541adda2095766892144065c3c35812674a8c440735170ecab6b1a6c41466d6c9a8c4605bcc25b784a673db4d45425106aa27fd3e8f43c8424593c3b4e61edc5a77a12ba29e477dd240b286ed8d0012063d087bfc498cd7870052df9aa4ca9be4cbd28fdd0f11cda884a46ff5bbd8246ebb481e079e10612a80e399ce3d339133606b861b844516027dc02a5a528c5035b68ba8d01bff8ab2bd6812683d93e4b9d4012725ba613b26137455667eb4a905e09a3485cb0c07e41289d1bc0eae4653a78e18ce61ad142a04ec8d7128a6cf3bf990b4ff0105e8e6e74faa1e1386b0f0974d9f39f1b724a94a606206dd793547975560dc8c355926ed7215b4f1a0550635df83390164b2f8fd270f89502d1cbfe888fb6453b8175d026790e5787c802c096c8c90c59e2365bf9488cdee29bb1380ccaa3a652076a383b5d5be06eb27d6805a00ac2df625d88ec0e4905a551d050b5b599b28424024d6d9d4f150e8a0bff443c80454c7d6c13fb0bff493e8c2a6fc449205d90cad5cc0ae139819b2bd8680b01bc46a48f4bf66bfa7ab5e120ea90534272ad8176b06d235c031dd856e5230d04cd0485b5aab827426bf905182c5014ef9915222af6b47c84ca99a75abd1c85531dd081d3b0fa2a816652c5782d8b2b49cd23d8bee83f403117cb4081be13de6138f4a6e9bcfdaf83b72ad182f23a2ad2a38ccc55425b9160b861ac61fb564f220b4448a7ae84544993ca73d68265218fcbb68157b49dc2b08e88e014e248f674590674580623304da80e25a920f3539ae8528fef78262dbd92c3048bdb7138d572e459435824dfecde24bc21a0747158229153f2bae1511c292126f63799d77c3ac20d8d781526d3a9f0693dcd3a0eb191e883a1a3d4800cce5196842011e467c26c214380acf1be9bbe8c984ebc920891c7ee12e9298dede650576ac37739680859e7a9a16b5b5990c8c3b007b905f8ca0dee3ac7982748804fcfcef16741e7e83f24f53c4b3804eb59e0c8ffbacac9799ae7163a837e8f68bcc8c550b562d474c52eedd8d4c97b18f02ea853afeab50fd6efd111b30b882385cc3d55c96ea6c997516086aa7f7ec86f73734541742777114b13aa7d3c87caab2780d176819c9a6e76308b4ef908875e5269b6da53a20b6a0a0629aa573f5d2f7b619057fb50aec2a1624db27005dbcd8e52b777b9229b4d12aa4ca22287131d0eb481376b3570894f108dcaa86f7b649ce29328d401c7a8843fca0acc699d7e8174d8163b0777d627e2d72e7e165772877fe3f9fa44f66900a5125b88f6f4e89abf9269afd4cdf34ea050b6960ce0d233a3799d51b56a1176418263b058fba7dba51233684c94bd7aedcc35d879fe3fa60116388453cd4f91f99bf56d94e8332acb1d6d2e04d1cc60a858b5f72eb72e9d1c91f61ae9221a75551ad87f72a7936f0b59070924d54ae8eeb476411d3b593fd69a88cb8de027d98b984544b9279d2ce9f3004fccacc0f851abb0edae707d4782507aea48df075999ed5d744af0053557f3a9ed37abf0dc15e0be3ae0401da30ff6fa962dcf45bacf19ba65d6fd6b0e62a3f9f3a3f68b614f2a017e0b136b579345c45c7e16d84ffac6df5e17aacc90ad26effe26148c75a597d6bb875a98cbbabbcb469996b00584591ff394c6a34acae3eb83484cd72f107034de13d71685ace5d90651e6e8a8aca13da5f1e9cbf24240d4f108cb249b3f915609a160f8bdb53c610d1ab9e94c64eb6e14896f6a52be6a3d6c461e88cbd70723c8f59fa95df88528d1adc77d2babe720830dfbbe293862c54b8d8d588b956461fe23936ca16f3b0773b03f3448006c4defcf47bf8047dbbfa23a29e2bf5500b7847bb693103fc5b6e2c53d7ab686c0e0ab1c4b03f717d19f27b3c5c3c2830df2d723c16d1dfc7b020facf03a54e587a5c86df58a59d7c9e820471921850d436d8444311c7f5afa974c9f3c22bc4a397ca81ba906349c1d82f0a6ce15ad9932e81970191dc218cf71bd4bea174a24478a38e098fe77982aa8c87fd9f41bd5f09fc49867f5cc0fdfb4a13f2bb29c0977b4c46173b7a1c27d25cbfd15cef58cd7050237d6a606770c45203a69316a8c1421b04815502ef07e8e242f2ce667402e7894332352f44826c2c81f36c3fa68c9d0b116491987395c07fd7284e10c75b41e72670f6cac79041bc2cc2050aa6f39a5502d774c263c5e2a2aeee0c742f8331aac445ca7a4ee9ea587bb8aeca89e0ca8298959d27a01b63eab62c7d1c7c4281a3b0e2319d2c54f3833687e75ef2a277d9b2431682b7665ac180fca2e90380a1c203886b447d9c8a9d6c14e1766518748ad5e9bb265e0a2a2823b42ec210fd91204b0ef4d04c9cc77ee3447c4756860440f293c2c01f390238404f0a4d650f2e9ff014ae51be91ccc5f0a4f0301044dd66edf49047e52785937b3c2998a5284e0a9db1bbd2ba72cee91cb9f56797d4fec002e5bbb00b7398149ef9e896543a09119abf2789cf117471f9f7f116b04a1c6021e828ddac4a916a44a14250c6958f6da081f12876eec779d9f9e64e7d307485d019714fabace9daabc22e8feb2f64543e29e17c6ce20ef8ec84c8fbbd1486f99c3226fe670790d383d5654c8890d866a9c1be8066db211977b0cad47edd9767734ebf596268b7c46c57cc598aa9379e13a9064b64470e6cc67cf338bdb9a1059964fd4b78918de971ab82f7edf524e7b265dcab0a140f978f8688f88de488c91e76e6ba5876b3fcb5fc692ca4072fbc1eeb6ed22193831509e67114a262a3f55073c955801f2b01e35d895cf6384887000257dc6e329ee4b0c5fcb4055e1a3edadbe7f59b9846b89ec071b57263c1edb6641ab07d9aac17f588b8bc3de670a7f082b222afc5c27bec266a557ae3091be7794e0803444ecd4542f3ed98afc98ce4f0ed998320f9e8fdd16e0ffde9e8bdc0b92859deea633eab8a204782a4717312cda55c92b8d5b4c4dc6f7979e6889fe0f2f25ece6b6f0c265bfde02e6dc2629dff78f66242658b646e3156a293727bda6721aa430ba4beb3f8e3956b89f9e27c38e7d18d53507b0ceddac0e3b6b404bb75dd9f85976c478cc8dcb956c7cc6b0bc06911ed5564f2de702aed0e6c3ec9469c0b6d5c7b252f974b2e29fea3a696aed8cb62d2dd529c4d4457bdc3706cbf03d43749019eccdeb9992b063fafc4dc2ed17384d5ac549e438659d1a353a0d7346d585389ea635bb70e75a4ae605c25809ec561434a49c22ffa7829ba5539800b7280af4de8d176eb2044e9bbf964163e30a151421523e6db057d33c0a62123dc0bbb61748219cc0e2d8fa8e3189e8858ded0bcd2d1e2c026cee941a2e15a78be5b832b51e3839197298698ee8013d42f5f9618e4c82eaf14ec97f5a0a9817e267d6d693ad678415044a3ada1ea59e4eeaad1cade5dc11ca617578aa05c4a70b5af5e225f4835f0c9d438b58fdd1b4f140e6cd252bb1ec34dad9a521057433c3f17c8a6f4b3abdf049f9eafc3f127ec264801365dc0ed2b4021ca45adc7071646e0c9052c5589647e31a26d01e4958a2c5a4266bdc1b4dfee7f5a751e0928205ad079d675616c8c5b7c84184321240bf944388d41b2b82b8e0965add04032b8c7b0273246fd47e6428be979221799174ec92ca0a7b710f3342c785b82920eb283257fada9613b3b40f3d3296ce62c1e7290756bad2c78dc1318f50d6abcfa291db93e70b7a29ace7c4e2888f5711fd6764b7c1f9f1e433c104b47c1dd64911014eaf3b73f793c09d504919b68a45d06b6e67c45b743cdc92cd3e57ff0f1a097b6b632011bd0649b685d5d34ffe48a397561cea569d1cf86778bd012e7a680078c6baf1ebc526fc71dd9824fb08eef264c803a2368061a03b3cc0d1708273450cec8bb9b2b0ecef0d3d53d4ef343df42c2f64084ac6a0d840e6c1b335aae6a3f887585d17de3972afcf1b4457139d75a550a9006700a9bc9327d22296fec50843d5f1fadeaf9a9adaeeadb79da5b8a55e99487661bef050f58e92eacf66791b3bd068d1f6d2476daf7e3f584d988a66356f6d69ac5443dfb65fad60a3717bc800b825d8924764fa2a6ce7540e45b5b980859b687e86ab666e24fcc1d591c67e2c616f2f8af15b2ecbab795dccda53a0290ccbc46b5c14a93012d0ac0371536829013e52711d282ae2e7d5f0628278abaee4f1924a1454f1688202665d254ba2a89f31490ead41e8a3aa8c8b599f47f05e20960a9c5c75af0552b27414fcbd272a1069063770db4c55888f9c3b4732f6d996ec89f786165472d60338586d1c7b6d9582ebcbb22a9f8b8418826644e08e5999bac7ba9153e052748baeb03e008d2a239fb70410409bba55c22588544e6ecb8469c54eb81748031f323efbcee3ca2e6c141e645a407d75bf126373a22ca42b3958e50698e10d80361ae3cee047a106d710945291d40a4fdab5e7e1417a05043ecc0c04d1cf6bab68f673fee9804496750f03e3abe44d4e03510d1063876e08c9faa16b5b5214a2083aef8a7739e5ef0eb355bc6828034ca78162daa822452f6fc7bf132096a331844cabc816d5f30a6f16c2659e8266190c5a44d48f6f903eb702ab610db02c77a079ddfdf1ed75ce815849ca3b341c2306d17bef28a2be28db83d5edc8dea3eef064c7111d742ae6cd2a7b1fdf21085b84588af485c7cb5347ba53cb6ae6c540796128283a24ffe95de8e4b112c2ad0f9db01894a5ff2e24151d81957e8e0225b474eafcdc8bd37a1bb7da6facedea0fa2366779b7ed601668d3734c6e31996168fcc8a23b590087866c9c4768b2c4c928ca30373a3ae8cce7d373da2d3923c2ca4b087c6cbc5ee6edf2b4f700207ad3dc7c51e15d86aa6cb16c39d90282602ad8408bc8f75e6872da535e0d05f25579fb2747ca34c9f945d2aa745ab534a378d5732e1c85c9d20e839fd98e5843d468cbaf9c8c8b37a696f2e397a6724429f9c8f6a758100759c06a77d4044bb9541e360253341bd8de1f78deaf5e1583cc74fabdb5089df915fd838990470902571d9b489da403612c227a457b8430986781144fd0beebfcd1e38fe6b505d1ec092fecb4ecdc82e630daa9c81ed9e568b55dbc5dd60ecaefaa38b49dec98b3ad57cac2b19f08cba7f9a128ed766f568ace0f16d5cf3ea3b5dd757e50e9bbc69409228d7558202ecde771d437cc2130be7d5993164436646e5e1303ca1b892e09b66ed4ce1441b51031e16c5b9f72235985463450372451d3e1ee8bf287bb56c92211f3946bb95483141d53e4b863b2ebdb85acc84018b836cc8166bb17ed5d45948771c854f0e8cb4454165707d2cf7c684e2c0cbd04029eaad903fd88f428dd39d4d1e3cebdb4a03d333682e63d388104a01c7d1e00f112030d1a3541f2d5d201a08e9f7e184da87e1c6bc69c03c162ea5ee7bf2f7b6a80b09204af5ab73fb5bf67387295f4ec5a1ba4cab7caf23f2491a33a2c9f14100cf9b86e6b524f8ca3de1750141426fc6c5d8fcfe13b62ee2666925eb6a22aede60eca86ad36ad281c841b3908db388e67a9b2578956089b82f6e30b44b5bba2e9a6357754fdd835b2d1b579105ce378c91f035776f4e1c8edd780ec4b67299724d41a073849dd4f8177c0809e508d5920e98e708370aea43af73b658bdf14f9c5add751de97543d3ce039df9e8d743cc6c96d76540ec6e600c1db2028c307c89b30c3a0f46b01f08180c2902d381adacf91ebbf7f78836a4169d8dc5df937626fbd7947cd3fa5f198a743fbc547109d482a8e4035a3d0309ce2b953dd25d8b92eafdd2e07a9127b5a326f4222f68d253d14c063afffd0739137992c724ebc83e9a4eaaf65245708524dc52e9c06250be4e213a828285c63aa9e016dec964e7a744a81f4f9c74b068bf4561569ea05d039bb3001fe14b3465f97fb32d7bf93f8a326c7a57c8e40006a130f90b21887d079380e5c27fb82eb834d5804d2e1c7d235b142a50eb07a649f50ded1b61dfc341bee97fab36aa50f4e51f6ad00f9d3f3a5d4c90dc3fbe543e32145f26a391a9d38c2f2bf1d5e09cce4d8f67d2227e09aebc1e3044191ff4fd339dc44a94f1e262ada20640e872044ee687172b0b4f444af6b59b65bad264caa85b2c830c485202e6abe788abc52d21a5ee8f7ab3c66def4e93da77b88f2216a7a662add96c7e4d8ac97d284f13a4b8604d9340cca14595b6b3b23875978eb429cc02c400ba682cf0063e58ca1fc88a8c8ce85dc86c2c865c2a8dfe083a17c3c5d1c10513af85cfb6ef52f8b807bc0c3bea35f0fedf05f1e3d184ed1f5e5a780db8861fc5d2b4c9876ccf3574c831c6d282467a43cc8c627010956c93bf0a9206cee6716d22d1e378d63ce9fac4f439f460720916c061852010a45bf083c8f5f9ce201148b070173f4518c7b57d03dc074301315c4786f207bc555fbb6e0db05b3c4bdbe700b087d4d527c570600c821e2d2cc88005f2eaef422ed0fce0a2651864ef5c5df10de9348739aca682dd9c1448ebe53dbdf91d549884d0a743c61b6000412384c1d1485d6d77e21d47f56dede6aba705c355674c33ebc7b09752a997df2d3197488cca0ba5a389898014a29717b629ee33652835a490895f8de5baabb90b54d4fa628cfb081daadbf3a5ad18b83d8d9a94776ee94eb3658e2f3fc653f638bc8a8e7ebd074aa37df72fe8ba982e9646171e5dcbafefdebbc0b93d503153fdbf5195cf1f3cda4b6b0509b4a12d511cf5a2c6f050b641e0b35673cab7c11b1fb208159893415045b5db3ec7595ca7d305c5545e1d91db8ff538b799d1b32d5e0ec27fbb892aadbe51282c02d3e70ae6a8aabf0a0dd814619a69177c6a6248f5ef743b7b329eee6117b4e951b7d301a822cc527891a79f120c48a0d6816afcf168c056b5c4c45871f333047412154b981fc4110d6185b86cff3add9c4b62ba02fa97a8d17e34641b5f1dda9b3b713ab15b9aea8810da9822b2be5a0d9d71146edc1957b26fa134fcc419ac3bf3506cdc9d12883efe69e5df93932347f0963efd8a641c8a080469784645ffc9c15fc6264f6612690579bdffb878c918d17c8ee69b0495d8fa2b0067b7dabf7a05fedcf4b5d89849ec950202dbb06cc65ec19689aab70d593c037edd4bbadc070b4c3a23797f79f6af1cced8a0d5e3b977741c609fe70c687401a1cbcffbd4bd2bf11663ab4301f806d737497174a3effc1120e3844328ceaf5f624618e87a51baa841c656d70dc59d04004e3aeb0035ec073c8581295c48afeb018ed086c85f47ab1fd2a6b904374ba79628c7d454a765b920c88e42f3a873a4760de05c53746e214bf822468ceb3a3929f5495ba66bc6b7a8afaaa933763d552376895803fe0749ff4e5cc3af41fc515af13794835773ae7fddef49a7ad332cf0527cfa47bf84d81b168e08b7ebcb3ba4fe49f310c316225a97ad6bbdbffa8155f74b0c3c9fbe99fd0562a558a9bbd55794e69f8e78a20a0dc9298814ef2ada454058a23e4818d7623ba529d0251fbddee248eb37175d7b44ead23e6ca20fd68ada775e8006a781c9470e407a22c18716b3cb98d04afb7c80ba34e14e33034d7dc1520fad9c73d28ba084bc4f48a9d07c07e8d4f85f8bd4b451bdf337466431e37512e1d706d6a07ad4d1510d33183073353643987d49baba573a8fc72de0d3356fc67b53f78f3d896f47192be049e14816ca04bef447bdda3caedfdf703ea446e1c77b5a5b2acf725dc5faf30925da1179474bc4a4fd58c49496162674e599556531ca53e69622a0c5cd9ef3f178fb30f8086952bdabbb4733aa5e9e45d5fb4d930874de894a951d332939f2a5f662befad984a076e7843da1c61d7c1769fb5224ee2862375c4bfce7bb5532bd622449bd39bd2074f9541ad318a6439b718bce5d8f4528f44f7ee88690332a9c33e5aacf615c551d287c7eb7da258b986fbdc330f21223e23562fc926d396234bad9cac9f6486a96dd09ba8124d7d14dbf8c326dd1b2b477490ed5eab4263d8db4cc7b7f45d438ce332c49838bb833449b264923a1c08ff66889301b8cd9b3114ff6f3222102bd976a1b9af08db4bf40f628639cf87ef9ca25116aa6189cbf456690be8784c6992994e9befb6b244842eef3f52c7f1d5734efdd48231159ebd4ebd34bd761700fc04b2807f05c5696cfc637cd97e9dff78efaa7305eef41aa56ba996c3d79cd7c312c48fbc2d99a17404e28fa091d5fb10ac582ed23cb9047fbd9062be9ee3560b9620da9792b5bc757e363a06baac81aeb28b9bc3da1f3da99d876e857f3860d112c1374458b537b10cfe00c8c278e3ccb8738a2414351d8d46d16eeb5bc24929c4099ab8d95c233353a96e28b9ec3bbb4b1910d312b44ba5919db71a9acfcd1b8f3b47b3951f9366b149fde3d729f682e2598186451830030e30a011f3a1551e371a0f5f22e37dd725a62867a8e67f0befaad0aee00b419507b1c667ceb3494a35776e3463dfa7eaecc1c1382efd355da3651c454ad1802d22ca56b9c440de5a24c070ef0f7c3150a23b7387c20470448a2574240a43175b6c6aeb149f77f4f0488263bbb983424eef5b7c4ccd1917bc7da9e2846db92cf6d4f5ccfdff2facc7c073d1666c6df9553bbdc5936dd8e17ce014947a5e3a21a2b32fd3d422b4cf96336cf3fc3df4112ad785ec0f49d684c5a3dd21346e69db040a0d82ab336fbb350c1a6a99fe18afa62dd638af60cf8b3f422c49e18395e325653bae4417d538a468b2d1efec0d9f5caf11707218c004b4442925749c7e736b9291c37c270eb9a4af2920162bfdaa9b239eb002545484b27467d187f218b8d120c883f84445143d8b731cfc1214c53c598c6cf9cdbbb3a02f1d65b8291d725d06c98cc84910923d9a4018a57265c522c86a40d09d8231d017c58e748b3307cfe0566c4cb01b0c00c929ff7984c90feab4be4fdee68131a2e602fb43a6d401344099f9a4d26994fd8895c5285ac054011722ea11d53870ccbc066b153b90b8c4173ed502cd1f84dbaae348314c7406e39bb2d20f1414bc9091b605c07599212f42af0c974120d019c536ba1f5d75726b72b28d4903d2496d29483b486aa9b2de6a4b9d4ae085a83a2f9ce82755d9208464a9c22b8ade6bd3cebf3a0cb633b70af268d792d357503f267febf40ede1f7ca8484b0a2f023705dd42672dd39ce1b82a27174c02e585fedd1499c93774481ebb513dc57c4345cfba44722ef7bd3ed21237b61324609372256a26060a2cefb8c37dad6fd227b6f889f816bee07326dd13282c8c83208b6b89b3a83d54427589bcf9984cb86244116d21f3426bbda99c911d54c4e2eef6049238dfec3e19f44ce3393c94945a491940815a9d25ed64a7b3b991a81987080d2acecfa8fc815161c6f0366a624093c93449e241c0648d9d48f34bd64c3f863b47b29624fe73114f9103aec8d226a3b45b56e366f2fb751e318d5378205606743c36dc21bbaa08334c1566ad8ba64708e8155f73c7a1b7498c8ed36245eed33f20dda1e1ce24cfa885a4379dd42922f301a42b23f6a8f12a0c647b445a35d1fd60bbcc093a2ddc2aeed73024ef9184711d1e83343541a8d148467cb3e69aa92a701000f743388b71e6fc06d22ce5388e03710ff3354a64d95d41b978e3ed061d51631572677f6a195f2d789d69113bae1655b161a82b598d3581caa9ee9d2e29945e760219ea4a10419b05360fb5f732bcc21d1e2c6d890501efd9889e6e78f12aedd3efd1663a7080ae6158afa21490cb12be1b10f0306233b0d4217f5152e0df0487b9b039c3c25eac230132c55c8af726f550d9dc6c176f30ada2f2d4c7ea422ca753e047e4471f5b349f080d414997bc1fc5fb6beba177b6fedf02d1498b0df161e23ee24434fcb81b3b7c545e7d8bcca3fcdd2b3c8d0ce7e83c1812218321182ae0e429d0094cee1a5417626e5fce3c26d71d56412301e5b34137ad39b74c0f1bd810484084c337296902981d8bc4fdd87b0474023ea4a58d693b8197d4e54fe994967bebe91c6425206f721b049dcf3ea9390aacdd403809b6a4f4f2153c34c03fa8d9ad0be2f873d5d93755b5f0b60281a7828225fe5e427d75ae364c3b7944bbfb904be16568853fb93d6f866f142e1ebf20982c81ffbfc90648e1fb1d9449395e13bf34fb4101accad474ba5388bc73a209129c9b67bcd19a66e66f89be6b981df6b9f34afbff70f0ffd7539e0be4a7884f72110d63e0b45914a4eb1dd6af453b07f7c49234c8104a49d27f5d29fd2a74f33cf13b6e757c865337e34ee3a8aaf3bfabb50572062c1885cda891039b4a024c5f6dc671cd29c07ac057d12d03569846670008b11489c68e3d278850d38f75eaf690c17402a141aa0ac35dac10f0e515968e730f3eac93d04ef8f845749d6dd08ca07e21c0e130a1d1977effd608f3e4778d297cf8d017ad64ef752098bfa3206821a25717a38de00229e41648c1659e18f464ab8382e029c634957918d075238dc126a31053748db028d8da6c46bf4a67a4926afce06dfe856d441ec8ed7b83ed6163f7b4c3136055bc65f9bfb395ab94b133dc94f6115419a20443b0e02573cca12f769a7e6602db0a98bfda8566493f0730262ffd9c3e29f5964f3282a0ff396c95edf43b4ee9470dfe0b529e91dcbbf933bbc580a99028d104e0d7d5664dbf06f57a1729cdd3ad51278906d74ae98868f8aa7d442c6220c189bd13993f889c139698edac8799e61db68bac89eba8ee00579dea4f90472bf2c47dba3a2701a54ff1ea979af7d851c1b35f0017ae0c9fc03a227a0553c5113919a3414b39426bb06d7b71d896e0300a51d69a497e0f693e3389cc37b070dd86cb9093a995a412e59e5828f3cd464f526a963bdaa9977431184eac711b44753dbccef70d752ccaf9c3fb41947a94c35cd5411df03b94289869411eae446c32663d56ec5600f59c6e7861791bb51b8c552c5ab6494352aa43003d182c0e9a52ff0f31e7a3c8208fbcde1b93810d30f0b597c14ea352835a3619991864bfcf93903a7f18bc89bad3f9f4b546adc1d0a020a507393d477f277574440d94651d515ed5e3b1671a050bb9a230a4fedbb0fc9429158c8780b90686696e9d91e9b49ce2b1ca16a67f2f8888c1ad740d0499d26a2af3e077e21348b7ea8eb4f03fb33dd06a248f93ea36a1747bccdfc45b7660262647f449fcad621f79acf35e5a289e2a1afe21213e3958768b988496c9b461ca56a064e8a37e391e4e87412a9e6b2c0bd8ea880d03e6592473b199bbe97c7cb371e646fbfffbb62a6452a0258f9180fe0ae57152d947a29a97c2724fcd243a899949a81285bda242bc8b7e8b9a9f878db0681d5ef04e6cc344662d523fa04ddb3ff1a76f4571e5ef2612607049fa4fc1ab6915669e6049582d3028cccf7aa053a3e8d75828fa7cbf7a032b9d04790dd19271c619c9f5655a033fda16bf076758da265e86a5acf0fa1cbd60800c746c636ef6d3f31f4144347f6487ec40e2bd8c2a6b3d938bf6ab350b3bfea27a296ec3bea14052d18fbf9177d06ec61a9bf247ab57daf7ab0dec2900c09614da22144580f2aa33afe530b705919eb5af3db6777e2de428422bdab0b96adcdec2d9579dd21f0868b9eb438edc69c2a6f4ad13c68e8bc2b46200fed3c0db27079f1917ad12c27d89f4fdbca64bce0d155476a1ac84e2a9c68a7be39c0c186268e49589c19a49403dedd7af6efc58f4dfd4d49bd98983cddde8d1d7a61ed46efbc29382280496a8900045de7372ac5f0dc226d3e5c1797c9a22b99fead30c9c9c1ca86e8ffa4c257fa88fd9f9b46cfa4260c501d05b0500243ae76a7e6424cc08ab57ad08946910103847d100d762e10aae14d1ff4264479e081395bc2bcb8b7787ad73120f5629a28f8281e63cce522bc7e2e6099f3b98a1c842e22c7a1e66933b689ac9c50cfcbf2d8f2093d1ba9cfc3340a29e715a27e1e9c294e1eeadf1f463969e926df4d50ab8e3cc59a06c4ede4b2a9028fbbe221203b595ac742ae2b7d91359c49ab39988d3dfddd0428267a884f2891644a252786eb703962d0600b041c233f6ae6ade28f5bde10d31c66d7e13bf4379d15b00f7252b26b216f44ba1262dea41b37b04b46ff4a04053b2f16d23636c45f494ee17ffd01258d556fd2eaf900c1d7be6f390ce3ffa86a883258f0413f6319d382cf794be8d847f80a9d166a5cd71d954326dc9edbbd105d9f5b0603c811f5ba35d937d7c9899eb238f474defcf08224d803a1af43ec6dcf002611703113710a68e58ce26631a7445207c7e87dc150af025b4fe53e5d46ad98d585e036e82a27fc7c0abd067d6e962893e2a4bf565431375abc3df7fd62fa35ad28044076a2bca7efeff93abd401acbf1e4663b27cbf10167f8205369a2941afd1fbd6b747d74d5e8ffe855a3efa3a346c78fce1a7d1f1d35fa7df4d6e83299797b4cadf8ad525b71c00db630332a5c3c843fbf9ca42959391026153b799296fef4eb9db1bbbecbb1d9142894964418fed539ee089f27a9841b2d22c43ce14794ac074a4781a1c41d504a54af5f367575fe4f89b7382efce635032e8147680fdaef168b1f4513087b4d48400f5ec95e3f48603906a96efb608e374dbef69db5cbf1dae0ad00fb801d02132c537952c7f068479134d8f2804fe64cea9d57ab6e708da759eb3aa28702cd8df69604208d8c34cf97e4a19a11ebce7ae401937eb151d19ea2c320c37e3626430ec4b788203a87a61512578880bee8296dc934569bebe72ef6773e491b91d84497d8ac0e02dcf801465f2dc7803b133271ce2c1020272fb1cb1e9fc75286a41bb56d939c5e5814f7701e4017f9038a4d1d25de66ea445ea5f8d540a1d4357b08ea7a2d8597c07d4728d2051bd144de4549ee408a8fa9c5c4879570468757d3aaad604062514371483a48c4f3ab0ec649d1c8bed386461e48cfad96a531aedd46701985964a37cf2346589adfeadb6126056fbc3bf951436e800d399af7270d45886aff3e70080d05361b4574158f51e90fcbff04a922e31ee2994d716064d51c859078f250bac2b70cb79a936fc011ad7bd359ca5e2829e93085dbe32173a984ee4dc4231d3af71e46d3ef234727e49de22d98fe0f912d5af0c8b0f6c31eb29c993c50464a4b9dd287945852aeabf73e1aee7da4275dedd0d2965eec542d6b6d5933f53a2454a66f57f7ad38a55df2162eb0177056bd2de8d7e8c466de0acfcd40172c2cc6ebb756a110e6d489f4d6a829f56455c7204a2fcc943e457908b7658ef1ec38b8834befef10d93e9ede47c78cc4c722c803581562a17ccb7e4b1b133a8a16001c771a3da77961840d4c0ba70c009dd5529b42791c0c5d583acb0bc3855618d583d8424021cc39ab4a4b78b0c17c11e3febc6375569886ce9aad8cf7c6233acc871be9e29fcdeca79e41ce2f09824fef13ddaaf659cc36fc7ee190985156b85cda4fc7273d321db0f3df8095aa4b7fd0c46323d92d54ae69ac71ac30295f80144f2287a67051b842194426ad82b80790a34cb2ebd253411bb16e514457f1f9d81540911beec49760811240d855929204ba6e82bfff12813cf918dcbc40cca0596b39290622a61c06efc288ce1c5e873b73c82cc1493deb10e716f3b5ae981cb4041c33e61358cd4dbcdd5041948ddd1a30c1bf7bf09c25c3c3cf779445e47574298dfb8bebe18a3abc3a38917c6fcd6da25775bc2a7034119ba5702fae8e4b690bd9a832e3575ae19ca0ac08a02d6dff6ce77562d4c00b3ae5dbfdbe22d817aac4d9a413619fc7afbd5f50520088adc851084135faecb99ba468d81c0b122557efafd08edd1074b78d6433dc4c381558c35bbfcde82efa4b91108c4562041396b856a1e3a8c313977b2d95c5d014c7ed9d3746bc39ceb838c53279ff0202e7fe315a9b20602e701054eb1e2a57889ed87698e7ca86e9bd65d2ae1a042248b6bbcc868cfcb671424108d7645b6114b842cb29aa94c284ef9e75d9ffcadd038fa93f554b973939f3b66ad7fe8fb680083d20c899e13168ff17c10b2219a3656bca2965cac5c79b42a4d054defab0dc3db91f85458c7ec53e7c14ce38a2d6ff0e88f024f4dd9fb817944aef58871dadf76d1b47db06eb7f6f8d473bad310b57a67d9996fb30b060ccaaed0a054ba70a808c2e9e7274e6506b47cf24d50553d4e4e5c1e4243a4d7fd860bdf524c062f3a36409efb13411ac47468fdb5d4930dd25b94ffd3e79b221d3a366457f8462583caed0cf47dbf0877d66bc64c88bff067939b856e2bd7971831733b623a45c163611428d2c18a1d57c6dac886fe0ea9ccbe4508af51f4cbf8999de6bbf10b16eeb258f3861309988dcbd38738ce68caac16c490129d3d1e13842c44ab69004f6fcf804a970074a5690805a954722cfcf2ff17d4919cddd20cac7cd6b6d067512cb69a558209615fe48de363e79ce1962c3535150e7f3e2a9b91dcc2d0fad2aed96d62e2d6bde73ce65d63758d8ff0bee939b67a6b872565648cccd421e0ce1a0c9c1e18211fbcd39eb85050d4a9c8d27ea8bd6ac217cd4f36962e365c83acb8671c0cb060264d208de43a9f898d655930ec90c400ac77cb1092f42ed989df704894db0a385041f0c4fe7761b0534a990db9138fcbf6b63f036433fdefa67bb12fde19238716ee464f342fb9101d22b3223123fa59fc241012b7062629b9c1024858b8b4b677489c8e523c9c354386d64b785879465f208dd7b410857e304076469b4647040d7547bfd2b922065a4010a6baece49063612e00b28bd78893220edba50f5b0a9167b7d818d597680f12bc0aa2808106ea294c9fecff83c6390ff2195752cb532704bc363f11c4cdeb234c85a3f6ab9a3e56e180152376800582f2a0178131b03d0cb534cda57f6cafafe1741a7f4d44004a63fbbe3ea2e540172abee6e43f2ed34d4858dd6a58eec0f241889f501d66d7ee06eb3ca1b3301d4992a71e4f0810a21006fc88e4debf6f403e7d79209486891de8221a0bad1b2b0d2d1148a6e730a96945727841a4bc36242213ae042b1cd4b44e33032b15d0b6ccd1ceed74a2aad8acbb4022fc67565ca918ac4b3ad9f5fd483116687df0bf4346c12e72c6311beb5510687e386551d7b6f32c0741f1a60d2c12e1abdda8f65380f38310fba8105815858c069a9e3c00baf2bbab79ca31318698a0a072a504c4fe3c19614a61746c3638a9532b81e79770bde4ebcdc048e3b043d0e5920d619710ec593efe925097c0d2ffab81f5ed8147d5c4b312eb66c9dbe1dbc258e3cd48dcbde070ca88968af49463436beecaedcfb6890e86a1e1299350cd3a2bd54de70fba04cfa8a3cd2c40b5be5291bdffdf6d3d2929d02c90e5c0e5f0d611592244ddf8fa6ef0bab9876a50fd40249b2a03c81db3858643a82290b93134c431ff8c9e0fcdebd05ac2a9c08f118472b9316262ade6a3cb5306d717e54a850da44211315d0c67402f7293370f022831654396d254bacc2891006bc93f7a3d704d80ed6244c8267724219b2666cf8bcef6fe4e0a1441243976e4789b4f290e424f01302e931cca0e85c9d1e6506559ca4772a5dbad1748d4f60a450da5227083ae81ac168519e6ca2ce441275a3f95541c6134229fe9a31540594202bb62855204a01972045dd67a65c3ad7ee744171e95cbb9f02b966e1a8f0c1f0039fc08260411fb882eda0e44047f4d96ca69cb61d9e2e252edd0e86b078c24927d2b52381aa89d17b200ca311f805c15022729a0f06120c0a1a5911d4a4b4894e46a08cd009540e503940e500d5d7c4f84d38e104145070e0f446cf7b7177437a27d2bdf0631941d46732c350243f91d403044f121ccbd168249144f1244ba39c9177e32855034ad390d3801b2805e1f41e02a54d1c3abd2f3de9fc6ebc1f7d2212c81728e4f8409224714ae2f4e20e94219f873b8b45a27e7097294f22ca3c99313cc677100441f14f26cb9f4ea7d3897c6739bdb81a45a1f3749ec8d1389248f3b4225f14021d3439481a8942a08db804f926f24be493c81fa1c813193e698a431fcb7bd22ce2893a7f8d5633c6ef45b18a510ba4f64e15139e8a890f049d3809c3501445711cc7715431315231a162820a1515133b480e108b3e191f0b0aa54d86adf4d7e8fc5e94f2d5782f62717eef4138c51d62b80ab35082efa9aa28bf178b9e40c23cb1dbc2952b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57aec4f0a7130f516533228b33346da2a37a942ff690a5288a1f9aa68d3cadfc6409224de1bf083f5593faf04d5b8c27f978f11f7ee852922f3eb91a49f25d08ff45cb8725d9c3bbc212b2908ffaf241d264f93174f1e2b7ac6c4664e183e54333a6fcf0c9175731e59f5e8c294d1ee49ffef4e4b7fc6965332207d8b2b29d7e44a2de85a9837ad2ec417d69f6b8f0e6bb90e382e931cc0d9e2f5e7cd2b4b9d860981b3c532ffe0b736543e20c4f273224cb90e54f4fa6c2177decdfe0b943308ca20cdf460ac937995e343da9b28941674bcb9193e5c36f29cb2fcdf245e874f1e54a7c9615aae5595ed583e55b4c9b1874b2984e668fe949936923c390243f1457b61771c5f2e207f97867cb8f4e24694416a78b776186e58a453cbdb862f9965559aebe9365654b7da7d38a245f1f31220b182d9461c862b2ad629016ca131974a2502b136ee8956244162508328184249c5e10c8041290200af900d4c1087410850e98e820498ad41e69c25449c1545145a1450eb448a5c21065a250abd487e50e982a6518a6727004982a3baac05441a23a800a892a012a04883be49b3e092ffc3e92e795a1e7851efef83d4253d499a2cef33e2ba015d04a6825b4125a11ad8856442ba295d1ca6865b4325a19ad8cac8cac8cac8cac8cac8cac90ac90ac90ac90ac90ac90ac90ac882b182be5f7a01553f83d48e691f34389664c0ee9c5ef413245d18c217de963c43f72964c4d32799845bc2b1e0a0bdf19825800cf300cb1109ea1288a5810cf701cc771248d46a3d1080b3d4667088385f27bb0a8880a152c943139a4537c9269eb39c70fcd1e2f9ce30b67680b856ca510ac80832a670da74791020b82ed4c408629982b8061288aa2388ee3381a8d4623982b141551a1e239f19cc05ca1f4dec1f07bf1c39c0f7cd11cc53004c36f44e5fbbcf3f3d2ca260a91a755cbb37c1265cc0f2dcff23b2da667f99dd2f4a927bd30fc441238963dfc3cfd08c5839f2796f1737ce29f7250a616a5c9b495fe7bd0f439c0d514754e03824b9ce023111e317d6011a80879e117c28284848484604c603b5893236451f4b1442a4254caef45d109511443972bfc52188e46a169db6168da742e252e9dcb14c593d3e4c4b433059d224c14445d1474a24ec95723928444299042422318123202a984d22612913a1d11a92322420259c3e4ab199f209d7c3524f9847c424a01dbc19ac0765b54219154d98244c204a22a445748c1624a108a48245f8dcd8331424984053181a80ad11552b0981284222410115d21058b2941288235813d41eaaa1091415588ae98b205a9239510913a581322212121225813528884427a0ca2f8c4c86379d4bf94e5114c26938904934539447262129dc024a1ec29bd48fe90a90a131493155fcd68bae2ab19c929538240d2b9969826293ed6938f25647a62928234097d3523cf24f4d5981e7c9823785f72b96096508ede4f9be8e449124a8ff4354f4429be9af06b865c4b5c4ca2cc408ad3e4c444f4d5d84c4f4427519ce08b51806f32459981ee04df243a310db9c4772d31df7b969583323b5499366df39cb896988a4e0b181fc60865cfe8c5731cfd389ab0a0138c510cc7119ce37b5ee98808db8dfe4153476c1224ae4ade6834f2480fdbc1983481058d56be22498fca29da4c54ced10b45936422721a5d39bea9824109be1133fcf0c522e0293a21696134428de368348e469ee789cfc2a2e3adc6f1b4428d3ccf1bb94be75222be6b277a63381a892971742da162248abf4a4139bd4da4e2b48d3ad209fe5723e3c8298a4e3e1669e5fd875229a0b491866c21151e69c85f309c2c59f88bf4e09f562a1894ae84d3fbd2ca24b41a6d6210688a4f3ed60c9228c5c71a721af0534424d3d0098a4f4023a628bef8e3388ea3189ebe9308cad1b56b6971e95c4b5cbbf247abd2b41d712d71e95c4a5c3bd712d0e6858b31f5245315a50c8542d71292032e5d0c548ea082a292a222524d71ed5456a8ae5061a182e25a0245797a1514e17baaa4a245e7d9480e9c317648622862f1dee672821874bb33fc17ab1944a04c8822df5652010315a70955507467f8aa5d19836d86141b99e40c9f8432634a0c4b2451c2e48928aa8002c5b5732d0972f2446828062aa72bfed5c8e08af34f8f4284e4fc3eef88b7e3238d9e942a5b5c8c745cb494a9d07b1889d424e8ab21bd970304513b587eb46221ed20396c0763e2e7f8b020d2cac56f0592a313e91bb1c450f1cc182aa00d5904ca844f2ac9a2182ab619a71de3f89e0c52cebfe284393d8a14a193f44e3046287b482f9e3290841f53e5ab2199b62332745fcd687e66f8315a7c35e31632921c89a1a2ba40797ad5054a1b197486ef2d3b8ff48d5a865c3c5904dac480f24216d94e3a17a60c4f9c26fcd28cd2b4bd942c31a0d8626471868f5a7d15a709bf650786333ed3f6e22dbbf7ccdd19c6b40c9de1ab969464158f85337c530c9533fcd2ca260307cef0c92a3e9215e415671806e10cb128026dbe9bf049d2889903f411ac8959043cc52130f4c2d00b5f0629e50fca108542a1c211850a4b8f4a892d61880a6151b4b848a550df92fa9622a08bb025d5821ad946214bea5342b026b026b026b026425ab8c1114eaf89d3a3d8404a99427d2a954aa13e95427daa4ca546a58b494a3ca11ee5e2532b5b79c488972acbd4e70053a85ff5b0bc9f5eaa259542bd8bd4bb28cb54e9c2856973ed6c5cb43c09b481f12de6a84cc170f12f5cb4a04661c992fa54cae572b9c2d4375ac2eefc40100453224a7c946b490a8572e950ef5282723d913ab19c4e27265e11900595fa94694bb1b43c4bea53a66d873653743a9d4aa7732d712d712d712dd98d3210458a932837d062044110641147a228fe778205c182604d3c1aa6379d4e26ef64f24e26ef64f2728027d3b39c4e27d3b39c9ec5f491e49f3e9693c9627a950a0623f03b3d6a75fa1ed604d604d604d644141a4f701a4197cea5c4a564340ac3914e67235974fb4492247932575187429dc894c9dce1c8b5e4a524ed4070044720088e8e1819c1763026235814a5d108c604f6c468341a6b50e5bce1f42835b0c20650463610b2810e7582b12295489369da8e8c46b0262f659195dd49ba762490e4da995cbb2f4ba4493e482299369ba216f324ea4e16963255dae1393a9548731575e7c8147ea904be6b896b896b896987fa4626a6a2f0830579e589f499e0277e1f2ca8040b3ac1b7e2c4e1f42857ec6a30821a28394910f5fd16e70ca747b9028bef3dd409c6c712856ca328ab286432a960508ecc152c81b026b026a0a9052827f824eac3f0c51188e18b5584fee308232261412769228da328e31b4718938f7cef7b91f49d327e149fbc40718ee3bb8fe32843868ff0657c8ecf5b913b463fae44a118305c941f8a8728f49936128b67da5ece50143a62e483ed604c425814678fc9657c1f8cf49e843df1c990016ba20a6364c498b6ef246141e758862e4218618cf0c525623e344193d783693463c813cbbf3c0c6c0763e2c1c21fc31016040b2265bc6924b9e0f202e65b48e3d763fc9e4fe7748e5fee60dec1977790e5148e604432727ce1f862cc0af5aa15f9de8f56a48759bdac563bd8ee6389a622520cd34672316198b6f285d962ce38c193a813a1c09a88a3e89936ef4cfd87ea319a8a409bd2f6320324752952e8ec09cd50c74b9931a3275fdc81362c50067c12092c4da6ed8575ce008774a30a0625f93da3cee9249f0582ee51c072e8041fd6c483915f7ad8eeab81059da4711c4758138f86e8a2f25ca0c2d0793a5d3c942b909c02383d0a0d88ce2834088a32032a5168f0c4b53b6138111283be1ad38f2f3e213a11a3109fc0f851dc8da655e94def8dc42540d4112348b8742e920bb5ea3991522b6f7c14e9515fcab5c4837d3ff6a0fee49d50efda9de37b9e39fef7bdcd1b3def337b507f1ac7d11123a411c9f5c4691b7d8fc439ae50e1397ad3bb94b8989c23926bc90845229936d7ee1cfdfe48a4279146e19340128964bead072d7f325da8f756b61fcd9893b8c438ea783f9a9ef42e251e6c3c3fd7ceb53b4d5f2a8d66cff89f6924bd0b13e9c5ca411724d3e6a1486f4b3941228de39b4e504e12b5f2d3881a51abf11c3f979293f423aa8737fee94de10ac6bb4b676ae214c5275f4df930a49c303521bee795de666393c5f979a812ea6d2ef0cbd1a6e81ccd916d87a6f73cd37bdff824af0729274e517cd70ec313f5a9b7d94c394fa60a06e5fa30766833e51c9d422a4e140b4a674b5139c5772df16027d345be4bf7d5b86b779ac6d2388ee3f8ee5ae2d11899309cb07c2e5b50892203178a10a50651763036218a08ce284351525025065288c11651a208a209145801054a6085139ec0208a132f49c4400a5b4449e2841fbc341183229c012e4669b839dfda1a2eb66334b8fce6b7480c37dadc1d062f471fdcfdf47224dd7de4e518ba4cf66cab6a37fb7ce6c16ebbf56f36bbee8bbef67999ec5915d7501a56e75b32f969d8351ef546c3d750b5f6c37abd62d6cd9b555f6717af684eff1b301405271228829b7dda5846551f37bf6806cab11b0a94b219a75f8d6bddf4f6eaeca66b5bd3d9aded1c46731adba8ea6e9dddd84f6cc56faafaa829abc680f02d86bba140b1bc718a7bb5db9aa9eb0d05a2a169a4abface68bc5e371428b6f3ba625c4cbfeb7b7bd1edb638dcab69f20dbbb4d72bdfd4cdbe6e6885bbbfdbd25c1ef5f62dfb493c5184cde65b0e03c19ac5ee4ee671710de7337d3eb87bcccbb006df9847f5c1f95db1cfcb32dbfe903d7eb67d990c0b87dd1ff67dbdd856dd381dd9a7795d31eacd6cf824bed9b7455f071ccfe635b669798da56b0b4ad1c4c320462cb64e5f071d5e86c5e6b585ba7a010aa8f134b435ebd74187df351e35d75a9927cd46b83b115e7e395cbbad9cb62c8d9cdd3da3a1d956dd685ed716a55133cbb499eb869c830d3538a439e01b6cb801b501e334b5b1a10646b10dd70d3619871c6c6c70d140b77e5d1a04d8c9c139819c387fe38152f55f695e554cd39864c3c54bafc8b7bae2f4cb3696c5f0d29b7177175e7a23705fb14f7bcbaebba3dcc50c7838eeee79e9ddb8bb0b5e7adadd6178e9c5dc7500ca29abba59b3aa765b697ba381661f99d72aebd9bcfe8dcfb34fd7b7ade99771f792fb97bafb8b975ea8ddd6bed13e775bd7cdcfe24f33ebbe3bbbcfb6eac69bcdb7bce26eea6f15bbfb7958756f7c735bdae36f7477195e3a90bbb778e94cdcfda75d696ef6693fb75514e330aadd169a7d623fd8a581ba9a06daae2ba69173b13b53577717c1d0ddbf1d92ec800424e85172018a143226908111204258c10eed06392ce1b4ee60ad926043ca8b1f52cb4a90137eac4b4451b261ca58a0869417304cb4409cd611c30e365d121820e960e48329a4434182e474702404dda7d325d185a612aa19f4881f9a3d901e7edff75f0886611886a1e7793dde87ef9945482336ef077064fcd088cff7e2065ffcf1738022281a19c091933432c3558f6816317296cc9e51fcd0046ddf7ba3550f290c41100cc1300c43107c0fd5430af4de450e90fe3df8ad8a80a2e780ee0e7dbe1f5f0c57455ece9ecfdce039be9f9e59c4080fde497acf2c62e41c993de338ae7afc9de47d2a20553220b98a48f5821b24d0867cd4eac6bb411d81c4f72413c9f7deca6f4ea72f8d4ce19bbe709524fcd37bab234aef7d25d4e7f86e4eab23a595123bdc806f5a25d17937e02bb1c34d183eea77c0d3932bbf215728d49bc8d77937a624a724a747bdb73ac2f49ee9bd3f82fcefc6b42a63783894b367646e20f7fd686e2007fe0e24d4ca6f747f637ad22a09ea95f81bd37b281309f8de7b6692239000df64220193e8fe06f5206a08f051ab2390009f349180fffdb003fef799563aefc6f4a595cebb293db94aa2c40e37a6d77937e493a707513b627e081ff543807f7ad22a494988233728f3883fc2f44790374a4c5164071594b2885f3947b36703b9ef37900b3ffcef77c0f75e4401f99eb40212bea380800f7ee30948126863c40812df838f84f7e11b99c24812dddf88afc4df4cb1537af19120bde9dd34a2c4df88a61124c63799babf01bf64224132757f83c4e8bd6882ef8fc4e8b1a48a06e5e729e12991443745911dce1ef0fdf45e89d09ca2c80e27f89e2704b923613b18130f1db6833581058956ac442820d1c7aaa208a54d2c3a3def4529a08d28e40d4d71f05b89558c80dc8155f001d1942a4ef15dbad2bb4aa5cf358ea68be4ae25ae5dc9fb46a3197eac50842142f9bde7e2106823ea3e197f7f27d94c016dbcf7cf4df13d91c9a7e405308a5c8aa03047230d94de098e454d4626424e240a7945218ca21324858aa0307d66aae849692b8988c620a2f34b11c144d484071727a46cd838738ce24824892511481453365419b07103a81c7995d1abf828c528340a11b1983677028954962f4e64e38638924621cf89370a8542a3d1c370143abfa20b7c65161b286d2dbba2f3fb184123c9f4eea40d0f3c9c4c93e94424d3144ddb8c7337c56bd99145668c20a721edce6f864422914827265419505d809402ca784f8e50401b7f4fc87b4f04a4f740cf8928e5fb183e9637f4bd6d8412830a0a55938fa4620a9a22c5940950618a9294b77b520986f7a2e5bf07e2e26d2ea52c49b6f205c9858b8be822ba88a6cbea7481d256ee4aa1d557eebe9a6f7531d38f05bead8ce2049f9c2058ee764ebe1aa1afc6dd3b59a0fcfef4b17860c5b8c3c53ced482ec62a942d6f2351016dbc1b710bd1c51457b0a08f2516199da4161f0b24ab7c2cd0411692ca69e7f223959332fc582d302f24e999503b484f7a65e9c244edf06ca417abf2e5492a3b5c9e44edf844f1133ff17b406923a98c289dd1dbd62760560eca88397c2cf0012595afe67bf04f48442daa9c929c74a75d38fa703147d23df15f1e2686f702f32fbf03f32f2f0f03f330a61198727706f9eb036d604ea7f7142af5a817987f7189c225c8e50917275f8d0b0f8e50c080e2afefc72ae5eeab6979f04b265f8dcb835f06954f3801c5099254aa9ca0f830a219f3c3cbc3fccecbc39846a610df08ccbfeca8fee55f4c232faf125d3e284e03926f23a994bb55c9a40c7ae263811ecc2ae6fb9755cc0f9fb903f3aadf89f9978ff9971fc1ac5e563018b5b4c45889efa8161717179795edfbd1bb188f9c9f8b21a049e463816215a7011f663522712a6550b9fb58e0c350a1fc769f597e2cef5fde4682795b79960ec6ac542d2defc2e55dfc8bd508b5e3c593a0a983d1a214bf65347a171797158c7781e1e2472e3e07f8c2454b8b49b289ba14cb124ec8d50e460b56710828038eccd0bf2f64113fc7378ab61391cfe59ba1f3afc6bff792387dea93403dcb115390fe88d3a77e443dcb8fa9df397dcadc413d8be9a0cc48faf083a1a240693b914c1b8c16a5e9bf27917e0cbfb43a729246e18f21ea145e81f4186c314517d82bee638531a0c490124328f4cf466513f3fe65cceaf4c9a860f8e7322546cbd0c8e6555a865a865a865a865a86c829315ca6b84c7109824b914b162e4e70a1e2520574a2185b0c141e41a587dae1f67072caca46f29ce6f39ce61b5735a1ef93c5b02206d119a6e38e92346da4ea635e3c55ccab7e27e655aa8f9111f332c40f060c17de069e2eef31de259cf130c458f1d5d8bc28662826068a8b5715b50cc5108a3182184331aa7099428433ac327ecc1fb9f94633e607d5c7fc8eea638ccc7895b9a3fa988f318dc0f02af3c8cd68da6ca6802edee632e5c5dbbc4a0ca1182358c518fa58e19b5631aaf85821e8014932e3617852558121aa7fe187c4bc8c23a6d881e165fc1133cc98f15f78d5bff047c060c680e60f2fbcea634673e7055315b3f3312fc32c7da9745a8defa8130882ff7d0965f2d3842ac9c0d4236356244881b2e549217f0d8136311f8e761ec3057024c9101ca176a074305a94e3dbc627a7115558fef4e0eac8f9b1944ee494927f2c3623ce4fb54abd0b2b1b78c6306de212239795500c215be962655311e10cbf654d8dba8fb51a93ac46241f928f1526d19dc065c26fa209279c80e2fb4c2741f8de8804b409c393ee54458c211433e4aff1c12fb90d39059409ff1b9f9053584c1b899c827a316d33a69c603463862050dabc0a901124baaf060cc7074fe00a0614362f523d51aa3ee66db58f15fe8e59c50c8132e1ab560ecac44039435591d334296de494337c5b0ca1337c72ca57f305a1e8abc9c2095f0d15b20a487adb679aa4f7cf43d22a74f7bc90651ccdd3993a4825a628c6f742d805397150f5812e56e28ef40fb50385ea61fa317437912f7ea7c57450e685c9f23b2e4c7107cab084236a07ca2ce25d81d1a2fc5e7c6f6533a2cae9b178a70f57474e2f757a9695cd86e83c917fea118a42e290284485f2fb91549260bc58792551772a8b4a554aa11594e49f4add57a3a4dc954c524248be1a12797af2774e4f927f1a9d1e651eb91981abd17b93694b519112729a9269237724123209a923957c2c128914720a68e3de67821f89447a1be9d9bc0757a277e4043f07482239bf2f854a9f7805e931d89ccaf93991cd894a9b13799e4a022a274a6f159ebe111565481a99313f944a0eca94764a6f7a9369a4641eb911df513b5442303ed6a762f222834969fb21351e7ce0018807c1c1308667e5707ea215be1316dc5f48409b274a62dc348d4ce16f84f425d3a6f4260f7c710525e94b2c55401bbff93e9584c589894a498b52952db0e0391999361628ceef6d21169c38cd579eb6129512959216a52a1f6955a6c20b90e27bde970241300cc3501445511cc7711cc7a222d514aa297a80017e8f517cf07b88a038c281ca032a0fa83ca0f280ca032a0fa83ca0f280ca032a0fa83cf0810f48d101107cc03f18aa27ca51351a8b9c064c71e0ccc25fe183485e2ce104c1d4d088c47c9185d380424327e8815e28c569c0771d082509a4c760533939bd2755aa099cceef4d432928a621d39069c834447a982aa08da80365bcdfed82825442244c0cca1e2f9c2c59c0a05c024c0925b584d3834105cae9c138711acf0483cae9d94c4361a948e5243441100c4240852015064451850121c076b01d2c88247d7c10fcc071e5d27d2c974e14ff1bb94471248aa24b145dae9d8f28102a91c8d02c4924d1d349a556df8736535c4b50b6d2b39c4e27a934a552a66d872a52494a99a994e8240af18993169b29e1f726d28f503b5c4b3c1adf9756e589441aad3cf3e4a474ed3cd43803d247b44515a70da7479181121e8c60148e503ae4e9792b0fa5138aa2777a1f493a392a875cfdc9c4f2dedb5691c5b47923aa07d38942edf04428a2151f4b24f2ff3efcbe3442ed083d4f6581121624456c020b8a9ca2070c2692741ad0945a893b506674823f7aeff34893df40019348f57013163485d236a36886bf1c5c8d270c15c41109ee372ad50aca10c957634a62d27d354a4a4ffcf5fd690b118998e4e67bf0fb4c26d3b4ed901c57a537adc8ff50a6adc481d213a7119d9c27d326ea482b3149690cb2a7c171e301d0ca698b66213bb2c6352059e31a0ec7ce0d3407a15115d76ebcb10ebc719a51b665b59b6faf665b546f36aba84aa3bd9a96836817bb3b5eaf1d1c36de1b680e0228a7ec0d381461c30d0fb3f112e1de82f266c75dbbad1a2d1c5a37d0b43456a5c92b4635fe8d81e8bc5e3502b881871b3a24c7c68be34472e6e04510e161d51cc63d11445a32b21b3a2465b310d9cbe64d6b592c76f3cfeb9c79e460420e262d8d6b3dbccc41c30e58b8bbdeea2dd7b6caaa676bab9f66b765dbda8f7e35aef1f07287ecf27287191c41c091c48b20f233337b7db59aae6f8b4307070d1da6b46c2cf7e02d7b1e56edc13bc53a94e0062f75488283e82043a76cbee1831b49bcb5ae18ad6d15dfb8e1de826d016603181254ddf8d6ee17b369aeedc07080b1bc865ee90c504e6752f58920d292c904f999348725cbeebb7d70edd997f6c264eb8a71648fd9d7a7bdb1d89505d7065c408a2082e2ff99d225c38613dc8b203253d3b8f64410c16177b3f8a6e21515626304368868fd6a5cbbf36e6f7bebfc16c96e16a2b45163e3e44510f97c6bd1fde21f5abba3b4b981cd90bb1741646646e39fd346dbc05043e4adfdb69fbaedcfacb8377dac6ef567581e56c5f80705d4d4bc0822335fd6b888f152005710c00504e0837b114466d816f77e9a379a67edfeacd916f73358e736158068c3cb1c6a9043922288ccb83f239359b79db17eab7a873d81f0128723b8bb9b5537bf457048000e46709041073724e0061b6a04a108229faa3f43049156cbf3b9758667ad8b7badb2d9c7cd9bc5ac9b7d5a9ef7f1ad34e7d699aa75abdfd6cd3c2c4e65f6dbe69bbadbfd29ce2eab956637df729a5bf5dbaa3ed9c53d8a57dce7cfb59d661f35a3d9cd7a47590303357c6abc1741e475e47ccecd6f919f218248cb07ce10f76dbfdd6dfb69d6f8077f8a6b676943161965b39b69364069d980d32fcea538bb2bfead9636d868e91eb45df76b5cd3c14b1a54d8b7a5e18dd36f713abb6e8b7e3eddfd8697349eb8d9875565b219bca401e42d37ef55a5f9e0258d775b9a4a53379b53f5d9d14b1aa39690bbd3dacfe19f6fd9199c5df67d8d7f3ed7765aba968d968c0f9c21a9ce2e0e486df1b432ab86973455dc4c735b1a9bf3ecb30faee5587cfbb6dda191d2da6cd640bca4016ab16daad59fcfc9ac2b663dfbd3fe6e5937b33f343958f5e6e69dd3cf333d83bbfbf072260b77d73594c534e50c13cf2e4eb6333364c6dddd4ca3bd3314e3f4d3daef41f1fa58e370cdcd4058f565785875bfaddba6dfee566ea9accfafd66a9bdd5cdba9e189bb9bf5fbebaa6efdd9c579f669de2dcb62b4076d57f6fd5cdba90189a76cd6ea6bf56ba8c1dd5b3be7dbef9675db8dd5ada62ac6a5eece0da016078ed70b87ce09798d7fe7068e1b3870c8b06edcd0213774881037e0f06e9d531c3ee038d37c03a8bdd1322f5849d8b97b2baf33ac7958757d312da7b31cbec99ea625c3feb46c0ffbe2328ae2cd6634bbbf757b7b1f38435834ac85b0543fbc9ce18a9656330fcbe24f59dcee1e7dce20c40cab7206173240f196feadf3c6b11b0a247b9a564e9f8755f3ecb54a6bdd947d6fb7765ddb0db4a39481e6ee3a5ecae04200b65006000aee1ec4cb003cd1caaeaa73aa7de00cc933d545f5ecd59f5bf34fbbbf6d83f0b0b886b22ee6c9eeebf7733435f3b0edfa2d8b3e76d5b7480ee2ee3878190096184410430562e001004f00801100b0cbc14b001071f796fab4f669c8b756d300635b75e735b7a61affe468d82d4b8356d797a6fffcd78e1d9d1fad9ce21bdbb66c0fde37fcb7f7a602e15bae6dadf3fa5a65dbfc7aab331910bec9da1faddcba6275bb18e7b69f5bf3ce6b8abe8c47df643fcfc3aa5bd52d2ea7afd57ff66cfd4c9a67568cbf346fb87b8f972b1c94ab28563ee8f072456ae5b08fcfa1b9b6f1b3b907ef75c5336966dfb7b63f4d559fd6c569f575ceb4d6765b5c5ef38ebbffe0e5cbf033665ce1ee2c5ece58c18c22ca193adc7de6250c45804189bba35ec220f3c210ca177a50be7080f2051977dff152c60e4a193b286508b9bb102f6514e1adac710d755f9c0f9c213339163f4dfd99a7c9bbbd6597a6a573a6fd2d6fb5ddac4ad3ca9996d3169b5f34ad1b7048734ed9b3f8ddcc661e5afbe7bf643917aba84acb6c9ec99ea6c5aa3144f66efb33321999568bf5339bcd2e06c2ba6188ecf30c5571b9fdebaa0af12dbd81b28e7fc9b6cea9ec695a3e7086a42cfec16e4a6b7118f5f12f592b7b9a568f56dddf38cf3e876febaafe7cfbb9b6d3ac55b7bdd1da976df5a6aeb11caef1bc2d9bbfdd8f7b7f4676cb5b8dc572a6c99ed6bedb6e34fbbc4ccb728a5355ffe7cca3e50367c8a32a4ddda98b7fdc96c6aa5be7f4f1d3da47f1b33c6a76b34fab578cb6abdef9d6ea77336d5d314eaab641b8795d314e101e55bf403986dd176357eb188a672d8d5563381de351756eababba81d0714387e0dcd02140807660f73db1fb9e5988db6ebcae2d0e4ead69b7adedf7d41965f18a6f5a1a9b83bbe1adf34ddd0172cb5be784b83b7697b917c0dd8b088288bb133184bb136088bb7b262f616e780c1a7077ef85973032cc541d5a2918e1014c7077f0c9053800e4450a886cdcdddbc10144e8ec96a04015eeee2da00933645cf18607dcfdf361c70e4858c00c0bb882bb832e0d9002850804559103771f2500812a1e16af2de47077ef085568c2c8161130828dbb8713908d9ca8d1c0360477f7b098dd0003220c282204778fcdde5a4ce7720f6cab6a9d857c58b8fb0e2f5f9eb8ef36c53d6b8ba399bd359acc93aaee8c86a6a1b1ebee4204e14e6b5b77b7abfe1c5eb38bb3fbbb6571429cf026bce1a18d9046b872f70178e9c210aaae1a4c82e371188dfd64d613807b3cdc5d082f5daab8bb0daebb43f6ec5e5f9d83d070f7168dbbcf3871f71adc9d0667b90c5ec690c2dd0310c389c7400280bb9befee33bc8c41a48c01c4fd85930d2d1b6ab46ad0a0d9675df14dd3c0e1061b6876cd5297eb861a14cd35686e2dda9abdb5adf2e4dcad559eec7acecadd7970f1f11c7bbd6e28509ad3166577e848550c24671e2dad71ea4631eea6e668ea8abbe1fcf3fb9dfd8c4cd67e9a359e3deef6ce1effce3cb94d675a21df7a194eddedfe56aff87556571c0ebf9bd55cd3efe79fcf28abeaddfe78994cf630991a1ee666d547ce3c9e86afe173a6c5d856d5acd7e171ea8eedbcc26470ea66a12b46633afcefbcba2d8fa741e3b3dbb23ceaccd6af2b93c9bef5b9b67958357d5794553f37fb19199cbabf65bfb6d51fd61ba16a9adceae255bdb1af4bb3d9d6a5bd6cc537f745578ce2f5e5c92e9bd916a7eec7eb6bf537aee13d6bbfdd2fcb99165b31abd2649f6b7bc5a97b7d6fafd597c9de5575dbcebedd6fe2d4fd2b7eb7abfa989ff78bbbb5e8b7fbb56cc519a7235357dc56d7f7f639d3fefc299e9b7dfe76ffc6ddf2de7806f7af07eeae7a3952c1dddd73bc2c81dc5ba8aa59d5dd40b9d9e7d9b318dd2c565deca359156fb6c559578c930a61776c360bf181bba143f00dbe5955cc43eb8ca2af9096f6813384559f87556fad4bfb34bf56ffdd5cdbb926c4b77276699fd7195e55ec837f036516bfceebec6dd36ff57a7e4b264bdd16cdeebbd927bf9edd5e56267bacfa7c9a597ccbe5dafe55ddecfb387cd36a0e6ffd3af3a4efecff81f0edd39ce68c026554bd613697eab57537dba22faad9f35b6cf651791e3fab6e36ebcfb36f55fc835fab9f5df5f3ebeed7eaaf6d3b637954fdb9adbaadeae2686a3c6aedf1a76cd699cd1aa3cfaa9f661f37ebecbe56bf75b3110fcb6cfb1b3fabf2e4d9eb15dfdc967db7a5b5f42d6ff5058083000450f32caeed77f3c6d9e5f996fd9fd6e5799d6fafd6f8b310df92e9c85ed6a323c3fabd7d76731b77d37963547d36d7f6cfacf82d923fbbf87546d59455bffdd939dfda6ffb5be3756b57a5a52cfe9916cdb3a7b5efe6d46d9f559f866dd9cfb59d6ff5a0ed3aa391e66017037937e33eb3ede7d9e756b67d16a3bff3c63cd9e5e1c139dfd26b66595c431f880f9c213356d5efc65bc8a76c16d2eeb02a8feaeadcd02129be01ca299ba393e29badde541fdceca32384bbb7bc2487b87f6ef669d62f467f06f7ed7e1eee2ee3fe81a074077d727010a7720779c0b8833b4c53dcfd5f3e7086d000f18133e4795855eb8cb62e10770f80fb374499e6220f4b734dbfb8dffab5bdc63f9fff27b38f1f96dbb85bfe3cfb3d038b51777fc11d3c428d9726186ff1b02a0ed7bae9e7d6cde655d5df7a56fdcc83b5ceb7cf46a8fad5e347ce8f20a710da6da5af57eaeed8cbd2107e83cfb7fb738a5d1edccbc3aaee9b7ec6e5f6f3a834b6c5c96f7e7ff8bc6af6e6b63437e39ecdb59f4ff346330e28b32f0edfd29ce68dd7ecba79b36f8b93baf887fd6975a4794710696681e091aa2bf66173dcbde6258901b959a95432a5796ff5969f88cfb59d52a964da6cf6d9e1ee372f492ca552c9d4d26a6d3fad2d954a26191a9a466f36fb641a1a6d531a56c5371aadda6a69b44d69d07869dcde355611ba866e8cd36a4ac4dfdaad5f9c52a964da715bd7dd01e429778fc7dd63f0729cc2bd258b6df475b7665b54f6edfe34a729fe3d03abf1cfc6b5fd9ac5f9f6b975c5af7e5fabb59d5fb1ea7faeed947d5bdae71b66bffdf18ac57ee8e40809b22388d88e1e67109d1d21b1d88b86060d1bd46636b35183468d1bb00d3638a039a438e090830d1bb20d4dded8dd7af66a1a7abf6d0f9a6b288dadf2d0687902ecfafab039679a73b63fd2bcdb1fad772878a62a4e05d1dd572fa988029b7b503c63d51a8a6f3479e3ad69e8eca36ef5a6ba387717bda4420654387107c06ffcff93591e56c52f980115a20b75a0a5b77a5371722cf6d1b63b78f6ea1c6e4ddb9b87e00330dcbd09081c0002a07fe9ac6ef59970252e0110c4e0be81320d765f0c8292fb6ab5e2ac1f0779cf5769b19d75cab6b3580edd59e3d866f366d558103de0b08f9cdd9d1b9a298af02f36ff4b8a17c4345e571cd33816ab6df5e7860ec1f13337dc96c7ba629c15e3bc5ea6546d8378bd5eaf588ccd69aad6622a0ec770faf5a2ad59e378bd70a0ea3a7b81e07067bbf37ac5f01a3f76dff306765f8c43e6676ec0e165b9ad0de7b4c5c9b31cf6b159fcb3559b9bd39c1f3d6efbb3339b6f981dc0ce3c2edef986d9585edfb4bda5acda13735b56bdc5f2c62e1a63d55b4b63736ee81037f7e0c0b1ae1867e71e54dd5bb7b7d8c6b11810bee99c691a08df54b5878ccbed988fca93aab16c84aa6340f876438170b0ad9a7303cd41e0e073e3860e79bd6ef061555cc3b9bd6c2c162b724b2fb06b5d60887beb7df6bc800d505069a150ecf0a750b8ed0cd340f1e284c8dd719f57b5f6f3a71320272faeb73a536bad8bb30014f7d7d56dcd02bbf6870580b8b7d2dcaab63f2c50a30245cebeeeb75bfdd1eaf3b878fd59bbce70afae0006dc0875c7c53f3820d216c51beba8408a025128f0000a14a1c08a029e9e49cf8d53f7133578e2a7256b6b3fb2cfcd6672a6cdc84e207c4bd976f6440e32ac57571e2f27208209ec4ca0746fe5f04fcbba9927cdbff1d9caeecbc3a3d6340fabb2eceb6a55ef96657d4e550964e1de9abd04641278c109226fc9340eabfa90a99fb2ed671f9cd7acc389d60956d014f79696c9bedd6c7b934371f2ec6566acec836b3298d5d2b158cab6b3548d05e1dcdd838004d9e0aed520f79d733a723e0259b83b101120f29d080865f5e666201140e25e8b80ccf3c6a99ab2187dfcbb652360e3ceaeaf0f9bf32cd640fc64b6c90d9a3071f7d4cb2636c8b69a6fb716cdeee7f06d63f44db30b011a40800a77cf5e42c00777999b6bdb7d69b8d64d370d33c9019328dc7dbf2d8d561026350fa8c1038cb87b4bb6f6e0dbd7785afbe7b7d896a77571efe6ad31cdcd3fedfa67ab86629c7ec0cb033e77a779e98027dc65edfe746d774a6b1d4043d9840d9a48e2de92e5d6ada2ea8a03ca9fe6f0ade599611fad7c7b35bee558bcc3c2147642bbd88eb4f31ab082062cd1000234c086cebf642d7c933dcde7d61b3aa485c3b77fc9644ff3d2addc83b7ec69f412202c59c192b58537d621cbaefa9359d9d304c1b55b7ffea7b54b6a60800f5a321cd96b8d717a86191f3843b49034ebd76d5d37e7f09a836c1cdb6cd6386a1af350d3b8c68021ad99aa3f080fcf9e0cb0c1806700beb92d4dc9939612243dedfbc019a22487bb2b61b92b29bd856f1640c5dd5b29be5900912fc000ee9e379034e7f542b3cfeb956e1dc3e9589af51be361d5342755634c486162d76222877b2b65f11255f4123adf5942085fe2c57fe08d75a438f390e25ce361b7ad1b8b6d36bb1817cb46a83ae6d3e26240f8a663d2f2813344574497c35b9d7bebdd6cbeb53e5eaf9d9f9655c00e0aa0a1440f945880124128c123092b24d18224d6248468b5643beb989bd794c5b5cf31b6957deec1fbf502225575c89ed6b2be06dbaa3232991a33d9ce42581d19eb659bcd6eaeb139b2b455dd0ce4f6de5456f521cbcd7e56cb1ad77046a88faa2cc6e5bc9b7169ee697d5835dfd4cdc3aa3cac5ad3988775c53849d836df5a9d442809123f9300717f7992905af64c8090bbfba6a9e99f0990c1de3601a5b772f827f7331affb43f1020c55b08d8fdb4ebcf0e026cb8ab5a0701246f6999ecb637d6e7588ce3e5018666bf6760b7fa309dd5032039000f3f99768097d6c61b23a1e22db7fd1b769094606b75ddc181e3f5dac191e620a104244e80c46a2407463060a40823260344c1005418c088017230c01bb104239818812357254745ce488e059403201800f900d5f073e5a7053fabbb7e1abe865777a6a9ebebade2cf6fde78bfb7af212384a75d593a32d66f37d7501767fd3917b32a9b571aa03dc410329975c55fc30b61e9c864b219b755653d3a59ab3f6eae6d9d6fc96ac8b2faf8f58c2c966559bfdfeeb7cdb140e45b2b44ab39bfae1965ddf635cab639df92b9ed46310faddf15f733aa2c6b7c23fb57cbadf1344f6b314dfdad558c7d86f091e153be507873f052f166e0f57903b0798081724b60f3ec1c3d05dd03ad007d83f65c29dc3d655f5a0ef233453c113ff34af1bf843c4dabc6bf7468e43c4d2bb33ab45686cf2b6e71ad8b9b910901c23e64381c465b2f1352dbedec6766b4c63897866d81789a564de35a4de35a6cc5acdfb2a761312a7b9a16dbe6d893866d7f868755d78cb218c755b9a5224c281245119f223b4560e060802bb2ae18e7f5bb02799accb63ffe75a3e369703e65f1105fc30fc1d269edf55db18ffa16c9afd56f6d8c535d8c6b6b3f2fe3665656dd36e6e6dafebcf2b0aa7e4c83d37cbbe5b82d8e1308fbf8991b680ee246afd807470fdaae373736abb6b87c5377d85cfbc9d9a5dd5a97a663ed6e8364dafdb63ced8bbbb7b46e5777bfac8e1dbfdfd98f6e6b3fec94964cda6ed607b1449c7d718382cbedbc6256e5d1625b34bfc63f426e402d19b7557d702dcfb47abb0169dbaccf9b7b4b46e39fb56875e22bce6df5e5e53ac457d60f8d9e2a4e935ddc8dbbd7e0650f140d847de834df30fba30789e7f54d730dd53e7ff60071576b41f4c8d0c67e329bb34b8bfd64b6adfdac6d3b7bbd7670ecdca0e9e0de9eb6f5419d81ca01d555636a56d49aa8f5e0d182a7083c58f0e878501e9216039a046841d05c72917beb76a3e35b36e7b6b77c7b56d5799a7f16fff4b8edcfc76429fbae78eb57879b797854770789fd6436c6b6afd74ffec1eafcafab4acbb357d3df4ff3dfca6d15e8f13bcbe19f15c7588cc6644ff3ff0ad27a1f88cdad69c6394fd3ca427ebf38567533ae9d5931aa6ed5457fb7acde6cbebd3c2ed6f1342db795c966667065a9fa1651d72c4546e2ad1d1d9d2038ad8cce1e03913f9d426a8474d74adbdace3700acb75d6bb5feb559fc936fea0e80cbd5cab59e2264447cae95a815540ad4083486190e66069809990160f602bb00f7e0173215c88c00e0bfb5b5abea19dcacdf1467f7b77e07f0df92c9afbb598fcbb9e7f366b18bdf198df3fa1bef9c4cd62ba6b134aee9947d69bfaeb275c5319cd7b6a569d1549c8ab65ae8ce3fa367b49b732ccecd302ebbb8b7cdcda83d8fb73b2323cbafbb65d9475d710c97738f8cf53af7c4f23ac3b1c7e86665a99894d802623b14a04a01b0f0966cb7ad2b7badcac832cab63f583fb36275b3796b1528ffb4abfb93d3525d5cebe270f86564392bdeed8e2caf78b7ebaab6d29c5d1e325c80240a7043015845eca095c3ab9b7d5a354d3116f2342dd47d5bbd713332d96b8c817604d16cab71767bd0d60754ab37361bd1bab458ceb49c5d9a9b7382a46a1142b8e3d0405eaf9d1b40ed4d4ce39a1a2f9a83006a6fd615a3447c202200222f108941c411bc25c3d238f67ab53436e7f5daf91a64d947ddd84775732ac4d3b4646e747c66759ea6a5539cdda769c9d460e93c4d4b67227820821cc20943040d9183005120001402f4d87849801cbc1593cd5e1d4b339eb9a1060d406435621acb681a36b7e2709a6dd5df2cfef9f4df3697036a5d9cec37fab6399a1cfb6a36bf6dee6939df6add726c9bbe59e33ecd39181285bbf7e0e510020c61792bb6db3648ecf34cabb95cdb5bb32a7e215a217258554c43f16c5ddbb5adfddcda8d832822002f83b8b167605b2dcb3deaca0201441340e058c20e057678c8e1e50e49480d840009a121880e826c20884e86f3eb9ae25bbbe29f91e5d4d08d6f64b9b671af8b59fc33edceb7b6bebda8aba2ac8a2383c3d2e1a1f1cdebf57ac9302e377badd5da0eeb7958956dddd72a2da72583374ef1ceb76755562ccdb27f6d167ffeddb2b2a76901e51ceba3456b678f83d8706fddd4d7336cf55bfd33d9475db3fe5cee214899cb3d417e28d291f3ed8f1fa0b41ea7d6f40f3aadaa68ebe26f7f0059029016005102880c880c9d2c74a0d0a9b9cf3cadd5fba75dd7b325d3b9dcf32306e58f0afc407fbc7c14c1870a7ca83e5cf8a0021f18e003112e7333fba393cb3dc8fe95aa9fcb3d2f9db7ea0a31d3f134b21999cee51e3650fe21fb19194d27cd09e2f5da91fd4ba7380799e9789a569a81541a4ba76a2c977b5e2f9dcb3dbc5e3bb89c9edfd2199763d597c9d4c0799a564de3ad3fb76e34bbaa8c9bd7b575f166bd9ba6f8f50cac8a6b3a72b0daa27996856c34d36879cfe06a562ef7bc0eb2e29cdb6e9cb2f8b6e3b6ae9b5b1a9ba3c3cd299b75fa7aedd434e6e1f5daa9695c23f21e9c78c6e170ed599d1e90e0f0cfd9c31077f435fe397b60b9bb9f3d905eb2013cc91a6717cde94fbbae034832801cf967e7199a71fa860790f384c77d716ca6615bf6c6cb9c1e605ee694eede0ac26ddd1647f63cacbaae185577b4368add0d9477f09207226fdd5a94866dd95445d557480e352f8efcae38885cee21a72d8a23977bc8e59e920720ee5bbde51e56e80145d903891e3670daf4f7dbf638390f09f0f08107c9dd5bd87d51d4cd29fbbecee59ed9abdfddb641dccf423c0d34d040430b48a56517a7b78bb7cee59ec7ebaaf65084c3cb1d4cdc7138d75ecfb0d97c635b57f561f3e7d6d92d6b7dceb2109907e376cc76f0e02e93a9d1ea71f12dbbb907fb7077d24b1d3fd021850e02e8d0d1b143a903061d2d385070368e0de70777a771e301b0ae2fedb19add2dc4b7726ef649d9dcca3c6a2a934173daa2accf5b757f6a3c4d4b26fba89a7dadfeeb856af5f67ab56a0ca765afd715a3ac97c90861e9c8fe55e369623beb188b51d9d380644264b29cb6686df3b0797d198eece7653242be86c761e904a76da8144faea74d4f3aa568460001000063130020301c128b064432a15490c3d0e30314000783b25a78509b08e32c08620a19a308210300220000001049c20400d9e9a42895a86d337f5a41d6a43b8c64caec4987fdc0d452c45570227eaadb371722c2bedeb4135736c4feab66d5f34525551218d6eed6478efce9c98fc7ab8fffa6324fdb57bd7367c3de1126f75178eae9a36a980bb60e63f2d6802a9f2823c65487b8664b4f8ee7a0dc88a14af2ffb880209bbfffa13e42ddf2d609975aa1ec75f19aecb17e3edce83287d6de7b1490111419f15d56fbfa8405cbd4e3e082c440587c2450361328278d6c7b5b4c1dcaedaf641c07b06d28c9a12a88cf066fe0818d46be6eccc4b36146028b145e79b9041b96226955c798b20e3814c5303192fc5903a9186f155f2f59ad9d4910f367a2b767fdeb26e32276bc99a0c114722be212b4e748ddfe28e38f22a98773988a36df09dcff69fb23800a9a85f22f484a8392898d2b8bfe6e70401bf08785a1a6fa50bcfc28110f43c022c3909dab627ebd18cc5dc4490f40a675f1daa73e304c91b31ed1c38f13b0dcbe639715e5bd27e127a1bb34869a35a26bd54f00ad7203b0c230adf1affdd07a8c98e64a8dfe68616a9e52b4d305dbd76b082e705d663b968ea53bbdc041b0501ca2d1afd82516c976c5f146e9a5866135a68f5c0d0478ec5694271754a01fc5c623d30159d1ac49d803ad375991d22783660b9de62a1ab8247cacb8b519224a272cc73b8c099092a388aaf87731b4ba6af3107eef298cdecbfc8110017d33df388c58f1cd20e0e963d31f89e93fc4516481d0f34795477041cfff534e96a6cc77ff74ad8b1401d2e2951073008e61b4f03f422b5e3076aca0cec7e94add0bc4c3b3ee2e698c721b6dcf621936a438756c00236c2069cbc3b8bb8330a6eb64cbe056cbfe87f29ab4ef45915f38ca8b630d1fa1bef84a47f141bb7686cee0666fffe49df7e01fbe1b26d25449dda9e6623299a406d77e0872087b029c03ac3fc882d0f8a7f4c741876242e22c7b9fb6fd493e0305fd0a4ae7f43a46de745f32037c3a2e88c2df36268b7015771b1df2bd2467602bbd8bb1b371557aa95270dc5aa14a98a5ff22623af3ed6c412ee93d7dd136f3f43e0383502c2505a9ac13d6167668e302ee6306d3f800d6f24e4f1ed93ea44f3a6dc135d3285d68fae3ea893bbd31f3a6e9b5878e1dbb09e0568adf08d2d2c2ae395b512256b40e56e5d0aefc3a324d35106abe38cbe55b81ec667d88de5542e0e7fb55fc3da48ef072d645ecb58819bdeb2ea7c6d1a6d17afcdf61cf46ceb2f99406df5db8acfa592749a6225cfb49cad436bdd06335bf78a5538c1014d0b827b74822349fba0438ddcb0d8a34b14e9664d6da6b103b1deb35ef1c54906f03c623fba2c6c974f54039804692ff8457a57bbd46bcc8f5995fb0ca260f75fc19846b2eaace17fd727ab99e89406c63dd2e293861e2a1c01a4264bc266a66b48e40c7806e675a52fb666e57de634e721f046661eba6d2668fe99f3df01dfaaeb3d5d1aef506d3a3b1b0b7bba698331f618c7996c20606bd7cf13a677642a42fa72803c90c3204c83ad20ec608a88040bdc48377a3732d7ef7c454eae6a6d2c76f3e25a0d4edd44f3971f4c9e0a3ab581d74a6d58a2cbef14d2380fed09c0c92d38727f0a35af2ede738820b98cd743b44aa39b86a1584d637ba8048a74e6fd5843ba5a46d867171a6ef437f5d6f7a4fb84d08888f9181f5d97455ff84e89e69e23d7b0f425156dc91479f29fea51d3accb3dcccd6c8ea592db23f2860eeba6612ce39a55732a7cb27488f20e6a99d62f9151001515da404dbc45b6cd3b46fd85e4ddf24db5cdcf89e1a9746db35fa7f9379c82cf766c1a78fe485454fd7c99cce7b3926e3a7846a279024dcb4dba8933153784980c1a6210e38611553b36ddb6585c8b5bc7e554cf6e7d37ede42305636208cd3a82fe876b828b36368993e59a522176a4a97d104fadc920e4683035cdf6910f25e6e7dd608a628482b3d5339efb947260a1e9e75673030dc8de461bee41729a5987946c4a458351c4a85073ec3e4c2d78295136a18570f89051d3246f025734f6e53927fe44565edf4ff8783583dce0451918b64111e643c6d50ce32992321993248da0b8f6f6e82fa37a9272316627cbbdd6768c318f724cfae772b61ce077b7430fe29749b2b48ad40cc47b613991d4290310f20f1efc0fc1b8a38eb10416d98e3cacc423e8003e5aed8bfc438360326710f5e3ffd294870e9f4680607644046b3b7361edb1e9bbe00d26168e0a423191986c7048e07b1a6d10c390254f6b8e33cf9cfca2746982e5523458e1cb308bfe0d09ff7a2ba0589d6ca8e754e02ec14a15d1f8e2d5eff1c1f1ec3be1d1f9131d41e1b582dc50ff79d721b2b62053100ee621a57c44ce5e4a2825dce908198315c389d815789c66a84fef7c6c24dda39dbb011a36b78be7f9f092aa4311f94941ab85a009961cca9bac01c7c0d13216e356083db14bf04f1cb106720df82ea4b7ef09d84bb11b3ffbd142f388e8f718654d79ed23049610c1d3f17f917bd4f3f2c33bb9e5c567bfb7402f02366d229f9d20ff5855faebf72d7053cef8576958149e1d4105f9bd6d77ab62b8f533afb0aa6e1736a6aada7e470a11710045355126c10d1b6865264602e6f04054c1ea2ec2892038972b88ad2e68b12440349a75923178ecc31d884ec9f20cbc6f140c69431728ca9c42b7d3f13bf7024021951a375f5b57f48c851af62dd0b66462a5b61cf0ebb8c1dc44e0b378eba5a90e5965580665f83b83400e4591e5d0a464bdb672f6188fe8193aabff2ae5beff8ae091c244f9b3320be4f303a902d15ee53cca2915e50e733fcdfe7c74d5f18126649fbff61b274aade3731a0c8cfc5f449a85d1e74f341e16ee2d7a289924f6915acae02392c659c5353249e9b94ab147c35f8d19a9fcbf4ccf4176e47f2ab9fa37459ac81d81f29d0080faf8ccee983eeae1b8abeaeb3cf2ee1859c7d1037619fc4ef95ccbfd963067917eb6563da1c8200a5e012d92a0c2a78e4717bead9cda1c434c06e0e603daf0d30e8784c9cd2b1ce4ac14c72729e00b512e902e910494ac7f54a5ba0f9d2e50c000a5ece98534eee5db161045a8fbee6e0bcd2cb8b381d4a79541d02a7bb6b1af11bcaddc1643fe6879a53ca5f117ea977b5d049818c070ce739fe162e77e175b7296d9fd27ed8b6e170832bfc106888634847f1969d7c0a0e388c7b56f9a22f0f64475517a0dfab12519483efb113c4e8be78b5b8b0d671adc685bedac5b606ba24e879ff0f0d6e45638cbd8f07fb204ddacbf1a896cf0644c5af38517209ed04f6a30f699cff352ea838178dd443f04fdd1e57b0c7768db65fbc8f87174290b88704138c91f325590a0e619bf4063c6b8a662660060b4ed4fbd22afcad301f04626e9fe5f81698bd6e65ffbae1593bbe40e7b0f8e86da0300d01f1d7022c27efef87cf41de675f8ad88bf2320a1656b8beb04137cfc98f2c3e80dc2b02c5f09316ee2a23cb1c44a2428757e8ee979ef19c9eb985bd62c5e633adcf85219fca78db2c41ae945ac4125c818ac5e494c1c78992b129471ce6ec2b7529ce35c749e6c68484900e99ae27f65df823c95905d72bb51cf1509d5fce3bb875ba043d3210afd3a9deb077d12f1d55d79d596cd7553334c0215049d2615d8add592f4a5736918f65b6b4f13b8bdbb39da76c169740e39f49a27bde4340253d9288fa6a7a05fd1abb041961384c761fa3f287b6a591ea95a4eaadcf516dd85bffd4e0cadd69d5e1d1571e62a95f3fdbb79a3d6b9972e15ce8a68d76bbdcefef840d7682d1114e6a70dfc507f8b785974b3bf89fd1fc0cb02f6af4d67d79ac367d388aa66279004c1f222d43efb323ba6e88d237f3f7e63ea347eac5f99c24c46ac690131848de30f6b6a6e44d02dab81a1f9a8ad006944b51fc485f32f4bf93f62a197b745959810239580032011ebf7ad58b68a49be9dfcbcf01b83257575293d31ee5abab115bdb2c970a9ff32d0c95a1a5d359eb25c5aed617f0122896c18695ab2ce03af7972b56a7aa10d004636656e9e41c3a03fb839fffe2101f88f7294b775d9f7880958ec81d94a55bd019b1e1037729d369d5e54c021275c170b0fe97015c6a09c4127a218f90f7181bafd77e2de48f9145cf9a92ebb3e22dfa7e979d69b15a7d758a46bc0f40fd0b989b32f20303af19e64da5ddf4300316bd982e4280247ac383ec1b055e64f67d80b393ec73cc4dbd392f45165c599c8c3be6c77c908a5f59bd2d5e5b12a7ee021d90a0cf4aec0aa63633c27763666aa61ce4e0725374e699174cf688e836c8277d17db69d9b25b9386b408361bdb53eccb242545b987031e4d165b21f131c048ff047ae427f05c028d7df102886b05195a646c9e21237847c8d1377f8a8608627946146b474fa2b7d91db0c72c830d370b03eccdadaa7e3ce4b384649cf256d117dc4418a65fb91ce8e3e5a434c12278537d114f6094b95656abdca0967793fbaa24e3d0c175bbc097c32ad31c8b9166e0ae9d95876921364d4de0cb1034daa69add013e650d1f93407bbaade5637dac52278850b5a09a256dba037135432a260456d97b7ce361aea857e6b3e983ff2a2e6fc62160d9ad83c71ab8a8b94c298cfae9e6c90024d86c985e6f3c2fb7eb5282978e92f0a3829c1a39f74b17daab311b756302f8267d44bed325441c826451baa920d08c24d8844afcd2506222e56c9820edc6beb6b6965bc816363ea78c45d1ac21aa272360fefabf53a06944bde8e7065b690bafa01c718f9dad8cb06a6a31290a5d1f1d4a8637577c15fa61f0ed1bedbf98ff41fb3a8a7f2bc63b023c15c14eeebc77b16899e50c851f66f34150edbef36a775f08da3f0cba5e50587ad923840fa879136beb8ef00e3e05812424eda7c18cf93310400ec1d9f25d65aa0244a901aca2917c567674ad69796a4fdd5ca7495a7fc225cb823d1420a456bb3ec8705014319a3a5a6fd36cd93c6f2e9bbb128c2e0bd99dc731a37a2ee2e57a80dc1867fa4ae46ece2f9759e1da3fba19499176b5e849a5aab67fe82b0a679777189e6841d09aaa6b4db530bc7219b053ac88a567f0059ea9e37985ec0972f039ca35014fd70a73e5b179072368560f8f553d6ccc8c52cb55061324cd591817b338283f131e4d2f5873931878b40a9d917c4b7f5c9ad7361632e27e726f37e397497b4d9b6203240bb8acefc890e9bed00374b5ee49ac0f3d55fcf3bfd0f5277f40e17bfc9be5a13900b92f30e80745095bb5c0273a1c7b705a6386fc7aef7bb69ef72df6e1c22d8280bd4791be6d98eb219a638e2b8d8b784354f6153ace317e873e113f595a24db1970837e42e851ed25ab1a2aaf2aec1505d8a755f3c8c18fe931b54ae03d0b32e159264d09fb831eb58b1ec13054565e278009cab7bac51bf3d85cd653b21e7bf462d1fbecea211e513a39bb4ce19fabdf6f51a863051bff0aaa60990583b23f4c452817b1849049554b62281b96fe4515d2b6a078c4a2737148f212f0e810a1755b17e34a21159935e8689ecfcd37ef79a7c86218cba05e9ff814bdde0fcedf798139d908ed5322e37c5336eef197b014577c589674e4e295746b96b988bd24da9c16f20221f916e1d83482fc0e1521f236d02b791f3d0f7f8a192930e65171292f028128e91f947ae828d6d7a70c2f07fb2dbfe7eee6363415f96d9a6e1f713f5ca72711fa061ba5df221cfd6706761d0cd1308c2f15ed0b80454fa2fc90d940e322c7c710dbb1fd0b0b2a94a0d3cee637e0b86032660256aca9298462af3ad0f28292b63401ec19bf7e0b8180ab330ed4716486c8a70d4c05cf9ee5a5e9d6a31d7cf4f74a96ec83de1ce1031c76d6a2d19d53cb324b6031996985f3111e0c5db92bd061d09c9c9e3a707f4d55ca8b766683f27068ae8d0786f366bcd55ff7c8d901cae11b70e0f8721d66a580df6be739d951f5bda05e4ff17859de2e74c0a48fdcaf12f69fc3c23d38e8cd636b76e49fb7e2ba41bd236c4f9017931917027e68c5ef88e973db3b4a711e4e5983de3946b2e1f1f9d150b773e0ba682dd8bc1ca8dc8101c7558dbc1b7f5f8ea7bfbd72711fcdc8d7bbdc16856fac334c41e3b6bdde7be625555ce5d45072edadbc4dd151f177680bf355917c92ca035a80ab1b17d1e02a00132c30c29703478d60160add36c8d4890ed40fcb256a915e530e0c11dd372a06396ce98b591537b0dc884c2a5bd2a4bfe3f91fd609eaf51612144283f38e5ad8a61ecd81932d298ffe153a9b0ba786b7ac506a34bf69616a32633ac0605c574f70292ef227031a2f1c2caf95762cb9a327b17326f3267dd0f521f5a4882922150f4484e4810a60dd970719d46c66e30a27c73a6f9a0cc17844c8213b2d2cefc094b5ef753645bdd24130fee850b8084019d249053804b0a36f9087f6f34a93d670595dccecb6db9d45f2852cdbdeafca88eadbb7cc5e8d9ecb646ad6f3e4f326be977c868a3c516b6efb21ebe0d612e5fb92e4eab27108c610ae55968b4fba63a22f3dfcb71925011dea76eb101e00ab4dd4bf743e35046d72e5bec49790cf2ffede7ae1f3c5346e8e2bd3827ca172c0cb9084d10efe081fcffcf00e301e8cffa7bf7d4d172a92cf41ea7e9f475abd9e85293e95b45ff7992b6b76409892742d26aaeea08700c821f2e1f98097a05543b1371e9061993cb75364a638e7a7410c7b0269f340e48cd2853925bc2bd13ca0a2556c52d1136a8e6658b8c3cc2e3acbcaa91cbe60d7cd218573a82ae072666f0b5e94b485e073dbd5a9804dabb1485d38a2e7af1e1cd6fd832e096de2009ba4de697ac35d6f4ab6b387f0bf56b54fc91a26944d5c5c80511249daac2388085c46811295e7049a1ce4867e39570c7eef9c53386621771bab8665dd51a512863873fa4d904063e7adc8c6c6b8d286c5b549c066eccb5dfc7cafbd3cbe02f2ae433f574e8468c22954ac635f97d2db417f4731ecaddbcc62f84e8b424f19c806641028c84473c2e5c38455bdcb46fff4c26db1c1bbe1064e776e4818b99ffcefa3b4b78cf7c7028d12e21e2589c03a2a34cfdb4ab2a28c8b05b4827e0064f2978b97f2fa76e84b226fa2795626f444e73b6a24c18d7378fe3cdef915160e7d650734b41f70edc132eb0de844832d6ab2e2a3c041dc364f90dea829b360b55486e66d8a7dc02bf743a2f1d82f0e8512a24168d00945f011097cbc62c30224e2f755123848a43f9aeccf0c5bc108b4adca3588007aa430fcafe4734e41a6048b9355ec154e47b00825de303422e727be3dd43a21b0be7b82743c1864eeb65c0cefc53631e25d0cf3286ad8cae05ec0d0afe588e700920bff7456ae22c3598065b99535fd0273bc2dd11e87c87ea33f88f9de077ffb6dc4925dddfa5c406543914ff67cc7e7a7da7dec4f3dbcfc91344b1246f7b5a43c80b8bf79e652c9f7552bff8fc12aa56df8d8a533bbf80717803ecbcb1ea988f27a4eb4f146ac200b04a38e86dff8d7648327aa1aef02d36ba58d7a9738a275ed0cc1b3e6b295d202e664ef29f39820b438475ce68586c6624e88f2884d4b2c3e77c348a9d10c6c189393ce6774334b510518e51f4270b2cadc2aed2d76fe7dbab0770f54adacb1d65ae6a3afb0ec4768ca0a2e9f446f3185f549b5f70970a8fe5a1de2cb008f5d372db39cf108bf7aada4abba6b66d26ced2081416a155cc08524c70fc4cf2b8906e3d8fdc6b1869bb92284f7b98814fc9dc5463edb2c2d2a77abb3f1e2af39e9835cf97def6fd871b53dd770ef75f348d2124c4957d4b23cb4b35865301015bf681cf99919fe3f0ea6941e5fa158f9da2a6faefcce9f563ee227e8b31ef5edc9fc1e8da564930d6b02495c17c3e7b8826cfe71cb7302ae83fe23d6b66f9d708d531d77b1595754702dd4f86af06f55786dbbabcf83f74ec9bb5f56e9e40d291a6f0d33318426234fd7817946d8dcc884f48a39502a0edefdd35c41b81c385b6c0be4fd7505197fa18e14b21c9cfaff74c82afc84900fbe21d65dfc04bed6fc42a3dc0ec67921952cecca01aca3f9e32b6f0448dfd5059452a5c7011d8e8c65b9247e537c305fe83e8c95de1006a9dec5e3c70548e0cd1ffa5921321ae4a108a9c594cbdcb90df4e2852baa83b00b5015c5f6a10e30f92accf511d896a12d76649d0f9545624a204dce1de4183b18879477e43309c69f29deb3bfe42dc6c09780890472faf83e595d58566443b679602ba8d061839d5dc086967bf28b93e1351d0f681ad2eb6dfc879327e945162d35d5ec33829509e163bd26a4cc529d849d137a3e692207e02ca42631a00d84ad7b981687252ddebba9eaca148df397b91e37ffec930b0e6c43e6a407ceefb40bafca3d80c2f595c927c23621d5a762702d519e88158e81f2538a89a7110e2b1b489deb2b6d82d0f558245a7619e80de47303f06f2e235414f62e260aaf7033390be4e8c5e8352c8c8716d75974660d7338c26e450edbf3f1d07794027687b5e131798564966d996bd9c7da95a01cf91c9887451708ce22126df72785eea47643689dad02c2aa5caa83455e67de6031558e311a1ffe4f330c820b91f921b12bcde8cfac0e4330f2c01b459cb7b530437896a0303266b45c49f1fdbabea0858b0c228a05754244a5bbc9c9e296789b72c8127461bb89c43b3d7bf06b07e09703686e1eea53deef9f94f9431f13dee73cc3c1084d41a7301afbed1294beb7a80695e72e4c01fd43ee4cd430f3a0c3c31c42ebbe1d8e7b74489e8f16c7b9bf48afe0b0579aabd149defde684193623c5c0232347081c48b9baa3f2f1e5c490a712bb0a7371bc1ebc9b89108cfa863aa3a4e9905e7447a413238c3bcdd0717d4dbb577ca5bc446a1163f9a3b5b5cfdb6ebb8a6b7269af03cc8ee6ca8f5c24c37e9d0e543d843f79df8e13422a6272f16e9a05f778d672a9ba66784f6ebe74264d4d97a0a0dc091e3bcddf96a28699af17d9251552b0565aed5e0bed10171404584fe37478f82b4b6c7eb53346af83fb3a6802ec10a153f63a89c39c37567b40bda5807677c76d411a1629031dc76e1fc0a3f060e5ed8adf70486766a246a7e3db4f252978d56e70bac5210639d223925acd7e1d52e5ae996e0e746b478047a3782efcf439838fc6c84d847d3106c4a7801f544f51d1aaaac9158b4bc54d09707d90a57caaa6d6e0f2b70000bc179e1ec550dffa34ee5bb83b3238ee680ae339907b059a18d73a7883e4ca9d44fbba6f725bd154ab8beda6a20d08a70d8470df97c1d195720b7437a7a1c62b7691bf31d5c0a85d2832a26758192011b26336f95b26025d4fd2e4e3f38c48fbd2c0029bbe4fa6598ae5dd295e7c84c08614395b1a10213bc608810fa2db5de7d0704e38eef1a413bf366b94563e83ef63247412bbe8962f3a69bf8c6181bc38fbc3e7173ec5c64e3b3f5d0980703f931a573150bc883103739e70802b70d1873f508a82427aecbe0140303eff9b20f8e2b9b08e16b6925014210d8840f4b988107be3069230aebcd6f5c0ba96f7df77f7b50e469a15836d2d7dbea5aeeb36f24a119eaddf79040654e488722ff2badc7d5e4dd5e15623fd3a57555d806713e801095d17386c7b099cf82dfa297b5c0b8c551bf7c53e0eedee6a4fd8068a5dd6993ec320dc270d48c7aeeb916cedb3d5e4c7199f609a1ae87276e910542084eecdde5eab33a1fb456c1e60370cca505969efdf0356ab969549483cdd4213fa1add40f96ea381d14c109858f2badfde1abe53f51ec76102d689bbd4ff17e1ee6d0b582e0c48bfee508c6707e79edf7dfbaa50f4f82e8a0d92c97df26cbd3b5e0801ce439cff41fdffc79260d87669445ea62543ab2a33af525ed520dc993af52d7ca1f49e166d82f5d4e08181e084ecb2359ab0f801777ce2860d557c4b86abc1dbdca010c9e95bfc854688077a1dbbe5bc077099cf5ee1b3c49d36c8714eaeca37cdbaf25906824163d69918060bc79e6881302e41c5d50156da453ea213f564e8e3a329949db33a319311d7f87813baeb0bbb0114d92e87bf61fe7ec6583df290b746104f6f76fc98b6b94a7c15fa02cff111efba69dc73783aa8b85ad3e753a1ad133bef583981c5a3ab7b23e325329ce81066840751389c053f99acd4116169edd8021a04ffe86140ff583f7bdd6dfeebda7dfaff17a2b39b6c9b87505585b59d408278b42f44f557bed71c0bf45bb6b304547b26001bf19c19c6af58535ae15d82ca566b5eb029f62207b147283bfade0f8dd1536840dde6b8007d3e707d1ee57f34ab4ad3cbf867a399a1327927ea04c27ecdf774a57680c5aabf1010083eb354a30fd0b5e3829eaf6e1a005f16d5fcaca13481631d52d87901cafb043c4062718a306797c883e5c99e597ca0599f083502e021700334d7d55a1a71d9724d1f92dd41a88940419b1697785b44a17341c2956563d6caa167096799026fc01e5059d1e4f5a3e4ffeaf3189882bb08a5300993fd0e5b0ebc54ee22b6a98591d73de1eb0a32a22d23ac851628991f9eef009105e1cf747896ae6cd48117604ef49d26cab7d5bd63044fab2de728d9b78407b0259bbd9268d63ee1907f009cffa07ff9e30f32cf56d25fc0a3410096daf9c2f8990e8386740cacaf272dfbdc185be2726484cd3eff6ebd7fcee7f8eb15ed1a952d34bf88144f02f07bd127218539b74afde3f73a051a5d240085a91c9c6806cd5cf3090a16fb4a02418e77881b952dbd0fd0a0c3c8e81306e38e0ec654d97e2ddb17f4c5165d343e40033784f0668252592e4d1cd95fdc4af16f1ce16b06ad0749e8a315492b11692467e4901a837a443f05c36b106bebbb1d35a83558b76c4c16ded2cb4e80be746c40300d5a5d2500140409833f74557963a37e0888d854105d32d324063d2431edb2d2a6f62a538749dd8b32d83057d551d53df79fbdc4c92fe34883a806ab6910b7c0b4b8495f5fe77fbba14d071c28136c0d45eb02c80de180c846b61ae7ff583d4ffa4c58c0ac0815e9922d68426d5264f7d8061c59ec70d963e6c1f08861fb71ca3e7c6edea3c74b179ef6a04c909502234a0c2493958f464e2af923d39156d61472fc0ac764a3ed9a7d64b0a1a4ef283d2411c22c40d2e7de982fdcddec2023d7e413b27c11c9c9bea9648bec30445e66c71d9b4617241b6a6d82be42380a3abdd35329adf41a1cd72e68ef857c1a9b205859e3c149bf1ef6b8f39ca5c33bfbd8c8e3ad49f617050068765a8f9597f0154b989aa6534c5a0bdd8f060103c8fdd717586b655e92485c3f445c79b3be59ab21d0f641096a566e99385700f8c3d44b3320f9056932420a680b0d8b2614b907709951c8ca6b67cd134a3c3a35f65102c1762260d694d522e0b4973d395a17fa90827470c2f61ce36bce0dc9d2d618da66a7fa5fed6725f9b9f5bef7eabac06f3ba89e9337bfac6660c5e953bd6f41a9a1fbca5ac67579b88e2d5628a68a77a2df4fb508d593db7bf05500da15aba17e98d749a9492a00870642a3881e1d966658f1ffbd78e0ce1edf48adc719336da0794462c1802d1bb0d4f76b24c7e7568534b5e1cb159ae6bec0017ad710a192130daa1d8b3394bfbeccabc04d8a739cd624a50d652fb06d911061ea498c936e4e8801412242acf790e4bf3b43ec1721fa82fa35de30afa5f06b8e3ff34c11922a4c6b2ced320e80e7625793f3717a5c741a2239b1a3eefa045e7dd9c50d87992f9d1c3ce7a0bd5968bc9c77c9be1194f7e2ce169e54876ebffcd7f8ff131456cf00daa3a8a2e4fb0df48c619e1a07106a10c91634e7e1e9ad7bea7efbdaff80b9a1a774e23230493cefe2ca6885eb499c18f87b723760e40607feabfb38707279b095dd009095e1fa505391596db0896732fdd9d3edf8a881d95ab6723025fe3b0d3806002ecab633d0bf87c665551adb9135f8f2389638891d88a065b7f387fc55a5c9f3cc8bbbdd56bade2bfce143356b96d55fc646bfaa83a447f57985981db1368e99c1813e039773593f9c2559a9203f3d0e5ab4d5ac99326a62e7e66c364e6f0582bcae817912ec7e3efa5f3789bd08e8a089a9cf13f0fed1674d59c16dcb72d5c92c7bab0794a1fb5aefd8cb8b03d87e1ab4735fa1219acb01ac5ec9c1839ee735ea769fea4def6dc24898ec612417a8c0276b6d933c080d11604da0dad26365f2d182f6c13ff0655a00a45bf9e080f8af2b9d9e7d0b613f432048d7d806573de19bad791bc27cb1156d4d04b29483ee8dbcad033c0e98d115afc39d87b7b09e20ad75f8df3db5ab3f7cb0e0bcfca6e0e034d2a771cf918583ac631340a52e5e05401aa5b01857843eaaed797ff1e47489eda2732f60a7c06695769b6ae7e48237f51c4b0bdfd9a878ce57ae215610102275db86515e9a9ce76fbe5db30c839e4c2c6d12d5d79e8e078992b3961e333d6ddc75015c2d53c80b3886f052c6708e34dbe7af3eda1de08e0bbaa0420a9acdc0b59694ffab4e032f642dc7db064a1b8ea613b1bb9d59201bb065dfd9609b19901cd6a504a0dd813caecbc167e500e9dfd7623c5e6ca2c0bb878b27f2cd6bb8faf47b96a486b7a909d606c487641614a14a018b2e526a204ce45a563118b121c96a8a52e035fd8dc0f427195664885eb8734dddf531c84726ffcbfb5787844361e98a2ca9043e076652030709cf2c7e2dff38bae3ff9b0f0300a732cf4aff8df65ae8e6033ca8fd74843ae6c211bda28652218210911d41d25b34a431009bd85a46b04b46455c63a1e9de2fdb40ed439116c846ebb3cedcda99fcc6359ba7295b436ef1eea80b7d8442e076c2364f354b88253e9ee7e758415dccb351340016bfef0c479fd11db8df76658916bb895c1750b85f71ce8c600ae89ae791166ab72d161441a6d70f012c56208d16eb57d201cd3fb162c07fae1f331eb27bb81f463efc2f07f72f0a913429a3a0fd21df6fdddec4720b85c33ffef9701050aecfae2b6196c40d91358cc0a41da18cfb23e19c0506cc067dec9a9f281e4e9c21cbdbabc70fbd13baf6465e38e44cfc31a667bc3531c2ba1d238f1fde43dfa7cd8bb8ac643ce15e99d9cb6c8c06f9c5e6722979b9b2612baad733f2276b7d3bda7f0b03a65671e6fd17f56eebf78fc0fec27d493f6b1690d99bba1b9b8420bc9771bd4fcdce3fd19d124e616793b48506d21f53550d1c5cc58a1570ed68fc30bc6837d33f7f4c7e489c780e077333a2429a27ffc5cfba8cc409442242cbaf36d15bc53dc6463ddd85e8268afe20cb0c7f9f7babe1668e60fc9fa95badac268e74d05268a7d7a1a8bc59593d8affd9d82fdc2ce536d49ba4533414b20ecc952261377e2dba83d10ff817706d2e677ad96a5cd36ff800262a58e9595daa8ce293b643088a885c82f50dfb8682a14b6d4a54d540f5ae7e8730ff942f815aa88179fe3b20fa79a615021efe5992b2c6c5d4126b4afb541238112b37854aaee188a293d046bb8cda4a03f02b190e98f79e912afd42ec0ae986f9731e1b46c7b3eaf666131a8e3fff610abbee483f47761ba20a9112f001032124e81cb58fabbd49ff1d7ab99750ec7773f907970b1cdc84e8d2dfaad4744c24e39c223562df169bfb769b91a8821bd631a247a26565541343e173a1c7ec826539994b5ce0d78244af211d67fd51b34c9d4c87358fb2b100cea907e758a85264e9401f13367bded0111524afa8d809326098eafe1ef36774b6e18cf84252d14f906c7e990d3a4cf19c9e3530f543ebb02ee59c75d8a86782cdcd4b02c2658cd9f4c0c2507e7a0c6b26cd3177702e72c11ea1f281baad46e9ee94bdee62232dffb157bbf4a6f0f35274c54e6f587e4c2a3fa91266a0d9a93568bb4bdb0908d2852d99cd5f4cf572d89bffc819dc1fd4b2c1e7af7e78ad5ec46c97a259948dbeb1f6a37f6d598942465f89717f5aa9c86e6b31898a85466f914af9642bc6b8fbb87b73fa245d46f5012001128841afbefa1875cd03a2d80f1728c28eff7137a0677de865c2ee25ce450efe308bfbafb0a73f0b29ad8d0da1e8f864d42a368ec0639adaaad4096ccfe94a64a960be2906372246d74fda3fe7e4cfcad024b20e67fd27be5e591df451708a02476784aa6ce0b5c18acbc602a3ce235c51ced28a7d3782387207511f092785430162ecd37ff7736466f6f77e1a12dc727eaaa975602c4f3fe39eb8d3933e67858cce032323ae705a871d597b2905834fefdc2befbb6982a8bf693702dce9b0af3e024270da9238e74c7890b8a6ac698fa3870d5615bf01a3bf889cc25178d3bf2efb58f975f46f8dfc73f793c53415c3a0da650abffbaf53b1fe8868eb51f5c5cced1bcb7bbbdfe6d17f55f83d887fce542aa46345dfce0377363b4c98a891c90ce6cc9aa2e4794f757999275fd38f4837dd82090c76425774d4d2dbc218c9d968fe62044b1fdf61df76db0205489c5d60e9dcede83eaa61669157de35711cf8fd01f90cd2f145a4df4dc9909325e902aaad9a4e3261411920bb7afaf262f33238270eb68a909f03d495c0fb5b424465a0360684b5a2611a1502f2611837f048dc5227333139929eea58fde39686f0ead48435bf7fd804c935b2f2749daa0d73a329c06b277766267d8c57e7b05c79d9a38ccd4e20231dad12b19368457f06547c751874b10fac5071322a99690512c7ae4774fad306972be80cbac3dcbd3ac59ecc012ea791669d83d291a84976d2ce806942bbc79c356b57e19d137f09c6bba3f2df4a22ed2ddc8686a5ce4664641b977b28999d88107dff203c9571e591014809357e77e86d39d312262d17cc7696793fd0c0d48a308f58c646339a4b64493f26675c3eb5e7e509aa0e7c75ad0797917eebdf12413885f11a368e10b6f7799ed6f4d29c8b79d57e42c0d0feabab48f3a38e7856ead2e99dd94d46194a778f1d42526bcb9d2d5b038dc2153d23ab3c7631df13e2ade1864a12f17cbf66a86c2b6d579284808ffb6832456d558d2ef628a1ef4d5052df5352648f7a7720627c14cf729a390f78f86b9dcd15a7d729ba984edab5134ece13fd022415a9e4e5078514222e517c5bbd675786cecd427ce872bb9bf92999e8d2867857650fe2ce5d5cb78743bea07a3eaedca848bf78812a32c25b4f30c0ec4742c9cdd20647251e5bef123a76ee4139ba3f0f01285e18f5280c1b7b7e8c3a457ce0d5c547f1a7d5cb6df94f9853f9f1a82df23a28498525ecf21efbc714ba817700b3135082c08f9e8ea50e0b7bb422026ae969dce97ea135fafd46c1a55202068df4efe9adbdbdd8411309a20e1bc147dad80db0d469d1fba2a704aa916226fe62cc6ea1075f6218cc2d6eae3b01edd5cfb445053e9c3d7cb30467c337f0fd13f4fc58889d71d44ba385f9b0a5f60ee63969c50303215da59e060947e91324d1233a3363043ba2d3cfefe220c6041b872fdfe0007490563033396085b788f44d5871e6657fd635ace405835f248c33f82f042bdad0cd092497d09bab066e8d3c89af73098d6e3ca6a7cca820895131bad96d20af776d42a6f2f2f6df66e7792795fc130dff9d86eb8b8059cb1c49df41c4cb030df723c92d2706db94415137a495eca46f937ba6da9446eb3d73dcfa59338747665b3ce6a23f7ebfd181b59d9bf7fb6d2c2655d8a11410ed662535b5b5561359cf4f74fa0196d1fbcc4abad771637905f341d17311d6a15cc836341cf79d6f5c2cdbabb33b03d9e8b4facebd59aed1c8a8a342385e65da02a79b48a07700c77e1221b2fe23aac9b794b21eb82ca6b5814466a7acc7add1646716b60cd76ac52898ec0b5d4aa952c6a08203944f0b59d8d1c9632c3e5cff0172ecff2f95768216922cdff8bb2a699442fa04d6e4d2d7ec1825cefa9a63b470ca26ee08c32f4aa48da5d7762fc7087920c060d62f90f6f1e96e5e3e0b6f8e4edbea8780751cdeeac844ea7c7c038972363455d6b68677ab590c08d0f8bcbe5a9a2148da4d0c4a1604ab13bb91cffbcc67bfd0dc9ea641d7cd8025367d306f62556441624b0f308af1f50f63a37c71db7454c6bcd4f41e0baee5f1ab156c7e0534daf0fb61ba9c0313a2e7e2426ac049082a47384159f4b5caa36584c3e8a26c16258e3e22eab4a3dc1a127348bae37e0a254b33206be3c9e548bdfc5422e7eb1ee83524211107b1e1509b9ffc6988d291411cbf40e1335c93695fbc020ee868ee15c88dd3e4dde2cae9c409dc0de562bae4170325c8a58bd3a938c2c1e31507797040081200f3103d35ca91ddbdcdaba8fdfe5a57eca3151fd8260d983eb3669ab2a681276abf7579ce46ebf10d953634f1e96ef05172b677300dcef2068962a2844788e26f6f456ef04e9807f100a5b8b1492258dc24b3a96d1fc07de8f8a52b90daa685baf1492ec905dd4574da5591992b9d4ab4054b97fe5e69a9d1734fa4fdbabb9f05d04cf7161a631ed8a7f706c3484ff6a79e2b0c5308c5f8645f20b374f8f862c3c2ffbb9defcfb186ad91812ab9a6919a3354abcb67171d896827f650d9588b094c5513bf44494976934acc284d68ea96ecc519d2afa6cb5a4dd5a00ba100646cac79f269690ecf70bfe697f31cb56167feb65acdedc16f29f67d84c57350b202eb6054d3e54ee5187bcacbb7cc3f3b6b3ca254197802916cec088933600efca7cb3ad01d75f99ad074b933fad36515fdf2fe1ea2cb333b30d8745951cf81711f80d779d4d1300ae191d8ea5fd6e69f57baacdf9a50fb107edc384264ac6b495590916bb6c12444f21892e79ecefe9d0c8537227403d059faef237d067c1b6b3bc56a15211604a88b6eee8c402f2a5bb26e70382ea3ce4f8cbe7e8ac5bbe9b808ca62d8b3953b4caf6a4785ee2ff5dc9b5e88fdb984fd43b16fcfe1306923e560ffdbe26cec8064580f9875579977d990b7600c109d67c0bc0110235ebcd1370db082900499500812b1f826c64c6a53a30ee3b2bd19f997324dd1adcea36c4d9e4c181f98a761f79b96eb150b49166922620146b94d328b3f6087bb7793194335f0c05e106b0e29ed1fa98a7b0484cd3d912fb19a7b9885777d67baa248c7c0e3ddc45618dac273d5075fb42d0069de73335bff4f1e59c8b79266d93826dbe891039071c3adbdc914211b4189975391b9e04d73c2ea887e87d5c808724ff27b3d2349b2ecbda231e6de70f42e89f569a283b3b2c30f1486778a17aded0cc3fc181a30048e33f3cecc71295d08abe32972de20a568f1666f867d5524769de2b43b349d4fcd1fca061e49117436be8c3c604d7738905083413f773303e38600eab54ee279c013498d5040828575bcc329dc68b751f0ff79d9f62109ac27967ef1d44716026ddf84608ed90b3d7037592fa254274ec3f48480281060ce2d36f290640824bf740372aa92ee7e138cfc932b5ce6799a83bb56e4399c916451e2e1f70ca05232e23d2b1f7b45d949532a841af5cb320f7e47368e05279e94dc0da7a3f97ac7195a3793d1cf9e66bf8b27f39293e74af5f582e47c4f4345abc9342f117444cc7a53df0ac7f5e498a7e91fa302234888e8a6578c200830c13635c3b6f54ac3ca6ade66c4d756a2331535d358f8efa831acbd107fd7acc5eb13b3b8a8c514f312939cc9dee0b61a507c11e89bf815b50f35031e2fb6f9a48425aa594d82180913c3d6c21095f5dc34777f6e37e122522f8573af20afa6e8d7ac349f6555ae987ae192b747d416aa986594f64b207f3f9e6bbc87cb9b828d39ddaa5cf6b9ed0f7510914059c4c4cb26265e844e8a6708bd78f92c878a279a080dadf30ef11968a1460089a4e1e9444fafc25d161f16de29ba7bb711ba059ae9bad9e426a222b56ab20c27f6709a71d4d68f2917d37930f0b98f5cc52df1282325cf7d3aac6e6824ce8a49536010c9ef907d418c5c5f033f3b8c1aa06a1ab06023f4885b36ab8a092082e10c5ed33d3523c30f7cf7797245f76e6d17bce95b216a305fcb90ae9c82f39aa355760be218ec2ecb930279afe8bf772dce359c5e978a1505d1e8e0eae6af119c2223a002650654fdf971ec7d0b8c39231b909d5745e1358c6581006025240951b1b12b11f849b02bdc5fdd0bf159daf3a3c1f9d64a63522bc7e54e15414c6810111fcbf1169e21b009b07d4260ae31b54bcacac0c42046018840b7ef476a63e862130c48b4c7e27d71863a8f2a93150ecc02c998f272cbe6727976be1dd5277a15643a2a440eb3c02846f93696fbb492d7c77f2fa2f70f0e69313a6e8b3c1bc6aa4a282195bb4b6ae0a06c701ba284bed8343617eeb917073e13d1c46171745d4de700e5801a213a657db024122ba74e3bfe9c6c5b7a87e44b2296bceb6857451ffae40626521040168e325018710ceb849c485251d7022e7e44d354031311ec08c65cb2b0f3767ca3d663f8d4db88cbf65850359b6a77df8025c31d1a1a48e480ca0cbfb656a3b00623f3593004eebc69ca859e6d839948be8b834e188093a946aa4b2cf70a824157393b009e08e3f0062a813d31074cdadb209547c1881f5896d88c0ce5dca6b7435f563b9c8094d4c2e85def757e136aa103bab4c8788706a9a6e5c366a000bc13d975050d6c90168150673fabe259076d842fc509a581cfb9e517cfe6b9fe5b84d79812143c7d4ec4fda796b50bfe55eb477c0264e4251a4b7839198b6310797234b66d4b3d20d057ad5d44faaa0e746b861d2637679908b4faa5c7a5f3a175715cbcaabca25db9aa0d9d55dbf73454b4ba19f24231cac317c530286da5f310b0c61388e0c27c8453cd6742d1262828e43542a96ff5788219d081c49536e0bf53c498c0f3580b7ce2553bca4d7fea613e369120e1387364021a1ecce8af1c7dca41ad87ba763b8771c6fbf6b622496a2b857f960bf340570af7c1c8355dff115a2666b82d99d1bd400d0707f5e3a3fc4df6f79b40fc2a2b79c38a4b448ba7d45ab8e6ed9735623d922e71e3ec899be3689a619ad308905ec9a8d317bddc97b9a41fe99f7e74720f3a830d3afd9dfe73b31298dbc1ebaa6eb75b5de00384d199842a6ca9d863bc73f723f4c5873d3377d8964c93f5172facd0c944d54055e755c66ad332df801922a57058ff370b4cacf75fe519f1b5324c9ad26674a59681ad8e93abdafb14d4420184be58e93c0b08aa23f2e08d1446a331a22320e873a6dd672d13c4d611dee84ee02939721b81f25869d3ea9eae9f23d1b7a9d23ebb0ea4d248e4b9c86b9b2a51067cc67b047650977a310f9f589694b6daeaf6a7591dd783145022812813b88988ca33c4972a9a46187b39c021c1a94dba19642cc524429e4c0287f4bfd81a2b21d5e8b4ab8def524bec3643d5aa49c633ed47292214e3ca53b077d7a9002256c14361e4464253db6f037f3f6dc14da8fd3a8e2a21adc1642a272726b9c3c91d6ee374559d303f844b1b131b9a9c18fbf01b549466523168ef339d8ba176270aad4ce4cd4d17c0446f89ef4fcf714c22c1220bcaa1072749ae2c1a2e8a66ed5763e8308046f42ed5e138d26645a4ffd4af3aba5a6899516ca1c9b76064b2a0337c69a594b68481eca72deab56a8c4386c6ff3e84163122349731614d1ad81f042173176e3028e6d8999c308e9af29c0e7279e5053ab74023f28029ec112afc0db8dc7ccc2a8a09eeeee6c27bf7af4286bc44bc931ece25604e7067e71d6ed0b1441305b113e2f690361045d3871eaa07e771e8768a609e9432f22191e13f9a10db0207a99bcd72a7a91a6655e239faf9037021a4271b34650ab6f5ee64fb0417e67e7639a474f67ebdef12b2b87a4d1c432989c7cac25d6ec412ca083cb9ebc937f4335dfb3545962735b6e283261d7785fcef7dfbd02608148cc5a48b691feaaf6fcafd1c472ea294725cae41634ab45af0d12ce6603e1664c0d5a78422383f540c888ce041cb0bb07b667d3ccc5f6b2f305c1e707e091c3f25a36942247e748d7e6789f41df141aa4d0958c15d5fde6e7b79dd7c996531895110efd1f0bd7f06eda44536b961cc0d22d35b31f69a00b696837337d61f1e06305b60de6c51325656f1c207375d12810be8ec485bca9d25a6b9be38f478c47e593685609b4955f9e04e190caf5b9027f63dd1864d8543c7e7053fa7011f1b09400fae271145b489cc91113af4455a2d7e1ea43ceea8c8654c1ff28c505f1a98171edc5420510c6cc9c4f3963ff3fb02dc0473d0ca38af9a4648c5c6766ba01f6e975dae0e8967ecce2a838c40c71c04771e6a5e484afffaddd0504ad2b05978852aab4fb56d93463eb0f0b73047f3b7be75df5f6247f165c580dbc92f0b225438fbd85b7041ec4df50d1f6acda14461461a05c903666c29bfbada809a437f7280d8e7e49a5fc82826dc97646934dc6073b534c0ad71a864f5ed03d3ef300ba4d1aea9d79c686f5b5c30d16027dbe26b2bb1a39d4770b2c5116423f38c4e3c707eb159c729c91bf78e5e15bd65a3b66a7f652e765cd7acb0d0cfe1a026d63e738c680294799cee3eb2d04c57c08d841a39e967a33ad6a07442eee8f2933191216e48d1f7ea48967b7d7907bec1d8ee35b587a7f20ae0486fafec3ed67a0d2f02a7138fb31c9ee2a882a6b9ab3b5cd82a0813298059c349ec25cbe42deb42288588d0a4eca9a8407c988e3692d33f06c8f68a71f0dc9d1f4d38768c6d0d18dde9e938edb28301d5ad56c02672417d004e8a98c74b1960f37ed501ec1bfa8a0babe72c192e7baeef00f3a33673c2ee582ad318a34adbf48d4e2899980635052efda0cbc56b67fb0885611f47713bd520bafe179d8c453d61ace1706465ff052d0132890b462aec70f53f1737b9c2bb5f27f61581f4bf55cdc3d9be7d6a63c928de938a55b12abdae04459f30588f435d1148e7e5026e9d251e97ac425bc1cdd48e7e2a6f789477264c802f10733e5820a8d3381df2371d553363fe6a2a88a89ed8076a580605e0ad9f1726b43b4bbd3c2b03ab9108d26f6b2a66867202f4982658109d10bdae8864b87b8423fd8ab85c0ba69f498baca5b05a027eb86c902cee194be8c13c60c5134e8546e624bbc48ae47cc5cc5fd7e954f15ddf0a9129148bd4e3439d857f721616386e8a5351ecae585439f85452f1c2e8bce4844fbd4d25ce84f2e81230b94ad022b0455a8d0555f0540c914a001ac1814744108217765d53e46972092869fd4bfb2aeeeaee5551b0f2795ce56ad6eb6620d41c5caaa1ad98f500e01fd7c5879388784aba07adc3c2824c2d284416580c51c564417a1ec620aca86058ce42e62bffa27767d202527cf08e614efc38c84e7283f80c5fa0950e74886fe4fc106c18b5df830294425fa8289e6819a0bba8a5012912bbc70e226a31915b6a3b93a1cc8850ebd0c19418b3c55177210146373e15ae84f80b015f481ec04a2af3568637223fcdcc5a2eaae08e7c134652e63f74befffed0e7c93382fe26d8bd34bd4f0da3c0511b61a9ce8a188129a7018116e07f881532642e6646d12e51a070a93e67411b2e92c286e4087485d23067522d7ae981a00e1e88a919c702e4396a5cb6a9f9184d0e30d9d541753509fcd6422fbd02c358d3d7a6871a5b23bde2a3f85f15fb0361d6bd3c704f417f3b9601caa757ef5e37b8792251ee362095c1d2a2f62b61b8dc9e50d5fbfbe1617882921b08ece2a6281fa05fc286585f245a009d8dc209cd8350600d0685e1641117125b8d7f1ef114bfd1c397ad18c0d62e60a40048d1a61a49abd13cf56521239e7bd02bcfeed2ee8360c6c68b0e8eb67e3308ec44713139955efd2888c414d5ffd9477d807ea3e063a7fad80cf7f7824b8fbcb84cc7ba5317913f175a262eecc8a6472290613c2679e6a6952c08644d66660ecdbcb3f9285850ce845d8bd1be311c38d4dfa3a844bdef17c0046fdea98ddd8eab02a63d305a78c0e925b8f1e58c7909fbadcd85941acbd076885dc7b6ea6e78fd09cb0cf690e9b0a8e51f38dd9bfa5001cad537300e82e6e563a3a3b7f089863f5d8c0b0127114e4f4de8d1540ad39b187bddcd0bf45269f4284413fe6b6c1fa89fc844acdb24de947ca4c5766129dda61ef071b6ee4b79bb392c7baef59daca5571fb2f033039a7b5639c42213632c2fcd49095fe307b914a303236dfff08289419bba894c6cc572c8ebb4fde4da3ff74c78c59083410a19022f2b78198afd57d4e9b8c2522cc985a973387e14778c8aa9c53790a9f138cc40afbccbae036e53f319efeb26605d259bbdca6e3524c484a7995975d294224f8bedbb3874ab6e144188b5fe921d0eada71e3b1cf35385e254cac6ad5718af7f3ad7718fe744cf5504c80b99c65f41f551db229074e6163ec7c44f485062802eb18b175838b658e8c57cc96779c710a5e02598513774653b6e20eb40a17e0d2198959e77d9661d192c068c0e40464850de4280b4c83a6cc11765e857c45a519669158b44debbb0223791d6f8507efbc945360f5640a2d89659b026bc396d7f46f5847215ade6b6974ec2050c38e07f4248500b3e5a960a212cf37a4e1ab0653e501c0de8c80bb38ee2593701d781318d1f75dd71d3f40ef2e49dfd15360a109b261fccc75bb11285812104c557026e0832d5ff4983d8f868aa017f3369be4902496912cc033814575c686d03bfb0f448b253bc0a5e0f8862158946338e77911c3dd87ca6ce4c53813f119c4e5a061c43880e883ba4ed4d8cf856c89e4400bab45073f1cc46f3ce9d0455f38fd7785338262e194a2f7b255221d985721d4fc95ad3af74f242476033e50ad0972a69c2d49a5a07c4c7a491fd150cbb139e907e950fbdc8d570322c2390f4eeee6d97b41a19b5d1bd7fef5025c3f9467335f2f2409b566ebba7bdec2a06206d495ce73faad1757f4f1c5b2c3d4800dc198dbfa3bf073b51dfe042489d571c9518f87eb971f72189d96938f49335b29a90b9e9e31f3a61c0c08b9c19600cbb262a946b3e2f740f3d6fe8142e0e57c790cbdd6200196d4938dee289316e0d81ed4a80e79ca3fe6168fb5b3367103b54255317e0691006ce338bf642222276da74aa7303f030e4d997e687f2bc9e5885d92c9fd2c8846413b1f8081912f2a7cd8a2705ce11011aca8680713d6cbad1ed46d9a000223e734dfaf54b8555c4f025dc9e84d2370ede7c7468c1cb857b582e8872ee8a602821e3f5f5d809dcd68044d9085c11e8fb9879c7e3d7f8043b4d0a73606b7cf7fe30829c4c87822cbe2b1b74bc082140f7d1147106268bf6534b3261b2f8fe100be66d22f1ac5ed58c0c922aa8c6a9356442a5f74402d3ee4a2806c7cb64e217bb208ab1f789e7a4096aaf59b6adb29e78a3e9619655588f4c60520337b8f9e0eda793bb96ed7ba796b9e876f9d289669acc326384063f07c5e9f4bd7a8a63ac5234188b9ac87b8deafdd111b3919a5897b7b794b6f5e8712ac6f5d206164b07421e8ad8e6d6e40899124bee6f8e24220bb3d625214ad5e1c7dd8c243caa58fe81abd072bfa2674b41d2bb042fd497c898bb5795797f953bedd8c0ed9b0818b84ade120a2f0dbccdc4ad35f4242e8412d862b4cee6535e14270fc93dc5970f02d04c5b8a46af871c20c7d918ecf5642a98846f4768fb35f0434d3701a1573ab24e8bd0efa976780dc2b23e5989bd5ad00f7ec314225f81178fc48bbb34c85b0fc48842c4faf62c8df32e180c01a2ef0355305ecb0bbda34d4b4887f1813f54ccb60b9ffaf5a01408e4d237029b71dddb4cef3d0a31a3f604371ac4ae7d36a5f4ebc05bf210577897442ac3f15280a7a495862b4340ec20c4ea7663a233346ab03b2320bd2c5c580935e82091001f7580c8a3064c095bca15f110efcf5179b2a12e7cc74b21d04b3905bc87fe2d0ed8774df4fa5f12d7646ec774629cbee9e5d42e05008a57c1edb820075de2bf1da795aadc0afea8cc177f698da6aefce217ca697cf0f2043170c5db0cc13777a2e84a37709414345aa64c723dfb3948712c875c01023329f356251a65a883ff3dc21f7ab5033239632de19523911c47614333ccc9ebfaff2c89a54a10393a4fbfacd91707bdcb4810707564f364875e51670c15ed551fbfc0151d9fc3985cbe8165f38c453cd8cf8602b46c9e72ff4e2463064d7dfd99a805e41a25c7d63bb31116456bc478ed745466bc04550557ada44708bf1728aa82f11f97a52b2df2055972332c8848c25c83cfdf3c650378953709c8355541e457febafde846557b9290cfaa669ff74dad3a0523efd8702b3f4ede5e85ddd6de9e2d2cbf5bdbca4000b04cdf42a9432454ac49012ddcd1bfb8cc667fbd471348889361edc8fa20fa1ab5a73f31dfa3b1a862295aa9b3fcc87d1a1ca4c1622ddb3c41e36e7e9447422c7d3f32323abf6aa350b9ce407904e1b9b0cb23a7776004e8fcee371fe76007fa1715a589ffef4f44ca35904edadd07f455f0a0436f6c29eb83b07b32f8e56f9845f3cf687bbf67cfd6dda1f664a040cf9890bead0eeb65817d7b5fef11100f1ed9d9d227f97987011a04c2576ec8214912888668efb84273b36e0e196a2b34857d8e40d585afbf52630b91a8211bf675ab6021418aac668e044309ec53c86ff044088e9bfac155e70c376023e7d7ad5fb88cbc00bc9d1a4e525c74d1af3871f28f61d3dd0b17aac772bbebf035bfd3b8fac5c6ae2ee2554844a10c5e5b25c9e25698863cf33d0349e833952cd008dd5376e08b7d28f0d8935b7cfced08bf0c3b7dcefca629d855aa0f0561c06fab1998c302136e464cc4d98645f7c229d641c165370773591a848d2832e2a8e0769f83b9353b806d3a3631481a61b2995377335205ad13a111068bb32e221166373e2a5c85c0aec2815bac681c53b14d1c62726f31a8b579afc55cc26bcb2504d66d0a78b60de9a668cbdb252b333adb0d1800769d78a9386e2bb3e6972222c3b3380179a35227c22c9377365977de8fcf32ec984cb2812ea501af44be316f5185f1415b3fae2c2acaf18d821d9f297fbc037a1fb46d78d5da975042f0e8909acb8efd6f9f525271f97a467e4dc36d1e3d47e40f4b6254f15f7ff41e6e023331f0c5cbab6d8c695e3b284a04f4ce2ccdc8ea1957fd56e190449252eb0c6227d1d387e4ef89e757e5486de5f615d11bbf5d847aff212006421efaca47f19de00199b9cbf95eb89abc619375ed8c41265f95c91929959427475521886838c5870c9c9d3ad0bbe4e1fc2bacd349b0511b83c73ab56941ef70050c6325aa2c413fe7a797abb3c9a578d92f10c0754ed7d1e90172649ebecd1a2d9cbdfd4e962c7c20d6031a2db4503fd5355b89235ba762fdac5ac52fdc84f5a65eb9ec46cfa276105cb7e66a7770e50426e276d1f687a734308ce6ac45247af37c8b87c3b0a90ca047a927aa45bbe8dba0bb0524b9016b0cef337dae39d9574516ba89c060b006d4844349f9b2513abbaa78a0b2ee55ee76057c860076660c647597a7ee3d2bc4242c87f93192efce45eaa387cabc8840fd176158fb89b7184e3db5c1374a610422588ac82e8bbe8c1ea74848889c49532ca9b0f21eb134cca8d17079d1756a404e4bff65a381dadc95851275cadb33ad213f6abd8366f80e40fb30e57f966204a951fb4fa8c70633e63fcba2b6440d3b66f84f778388db3f8d2262052374893be79fe2b0f46127ff2484202ef58b4de69bd7d9fe1cb744d9b6d89f84842945a9d865be9923a3c3fc596cb54bd94efe14240b7b99e8519ab2611a19429e7a238abd9f62198ceb7e96cfcf6b3e46b8fd44bfebcae6995b65c877254b7129b396dd6239f11ff426fc3154fa799bf5e3a7b276b38e06d24fba423d0ab4a4f45c2af2fce497b67b667cf3f396fb5871ae42801fc38721efcb6532551e513e804734c5dfa2fafca3d29653aab6473a9d5cc9cf18623451d9f949039265693204773c36de4b0756dc7d71ce48554964978bf114ec191c887a426a2ec1ad887112a4ef2ce0d904454e5614fc7811147b31746a21559723b0cc7fc5a0d7b8ef2f0804b7bde403e3de5ec2c66bd210f0ebd683e9ac91c59b663083540da2e4ec6cdfd08d9f4fb77685fc98bfd63d921f877708ff1efc00c7f0db031ce20047e583031ce2500f70005f1cea410e7180c33d0c7f0e70b88738c4e11cac03674d18050bfe8b479e523046db048a8eeda1081c2bbdcc35ebafdbdf620708cc544bbaacd1509637f2c1f8c67b3f506b50b180f4e032d13e124ea62d90c6c4cb440bca91edb2274c7eba337b89d5bbe502e463c5cb70c6da860b6d2e1f2f736dc8b01161d6262103f21f208dab86de38afcf44a81acf1c4000bbc5c5e19478191ef964d20db15e457efec4cbc436853fee1f580e714374e85632bfc9f91055bddca699055ab8ec9b3a5e4624716731f985372ce4e490daf1327166701c781977b8b7bc0f2f8fc0634114ea73751979b71f0af9003185b2bba13b0521d28c60af921c7081092ef91f2f5326a7c0419766d13a2f9ef595ceb955739eb62ff61b986830c71b46b23cfcba4054ec872785c1512cd27e5bbc4c883bf5c569ab2d32347506f1198a501c355291bef070ee8be0a3f132112cdd209968292f77044fc4a3dd212c5544105e654a6a85b6cd451143c06f24b0ae0a14437e5df66d00387de7c1b9cb6812c29ff84a792c1692c8065d1f498c8aa05c4a199f164aa119744db04dc9e52e5322442e050ffe6abd4f7f91954761904622593343340d88e67feebe74971180d0940e15c6c2da3aa33878e6ee32d11b3094cfaa1a84e4c479d85d864fa5b1185337ba660455c432e34231f1ff56cc1d7122182c5f2447692cde5d268a6e333e771941cec7b3e85ec5d192d8f87352e2205f2aae40a391fbab21ad372e169133e3fe9b0fcb072c7c1e5ec1a87ec37d9eb8ece5ce25da15c4785ec475ad78b731dd8e01a990f48d0b3ea6caa773bdacbb35a87a638bb7311cc6eabbcb28c42694f46c7d73a779b9ddc25f5bc9f6da579f10c9d59bc3dd411500a01f2a84e852c6462b6030a16de9c28be12c5614c343a1d563c58127e64b56dc128a8f35fa721bc400a6f11a0d35ccc35759564ad3b21297ea6f9371db9b15eb9b15ba0e21ddbb6cf255fb9f1555b5f837c53d5a29feba1220c0cb52fd76fd8d9b5fa79522085320d4b0f8aab1ad3afcd63b06645fbd552babc7d3b5729da05192ad203711d956eec53f0634a4e63da45fd11e857bfc575a6c0f4ebad8ab3b68f124ed1db242adc3055de43098cd62ed4bb85423b918465f8de68edcc5407d90162739192883ed96ca237d7bc3f9d23739068e8a854b3d8ae4335a9d6d4da6b84ba9fd2e453ce01ee2abf0d638ad86c1b1204a05b2173ce62e18657887275070ae8e41180a4d0441c75f187508e52682a0c75b8c2a8472530260149a2201835d11020c868a1064312830c06834fdbcb1182f4498c9a018a57bc5df0bb1795f0e3050070c0c8ca68408435bc23bd35c35c1c343576b52027b5c378ce0eb33259515302ccd2f6a1092f87c1c459142609c2de43ab5158bc2778015ea1f2215fdc5408ed1a58920f9181ec68540381f0c60c1355d5069a0df0cc5ea9259b91fef94cf608466a8189b3c901f6ad066413c2cca0c75ef93f3f7830ef03d06fbb7ba06df2461a433343f20c6ef3534373629824e6e62e1755f35a86ba7d7a0218c196efa8cec8e7ca90f8abe09276cf6c29c6434fc9263a3bd7363f9f04490a234067415bfddbe2d380459ec75a3e61059bfe9be03f1b7adf4771b5658d36f913083a3018865e0b062ea372c4d1df1d4df452570cae92524dd80f353f2b5b7f28f3cc1a1806d1264ebde106d47007ea5852d7d3f8477200f11dda120ba7099bc1e5cf2b8dd2cdc657fb08b2139ab7b4c549b70e2ada9472ee78c0baa774b8551c5d6a8de72d07039a814827a216296327f0ee39951d013de455be53007fa4859f5be0d4ea7960dda80063582af7a6275debd5d902ab62998404f405564b6a743c0ff73b867fe5243ad9ea1508552f7f07028a10b139e6bfb282112ad3d0386ae2ef61523626c7ee2d48bf557b14a77afa30e7732e9846cc23539f34241bda2464315b141fbc5de5b809eab4786cab71900f684f5f6dcd8dddf0e4cece5a45725065485bbb82c4ef9f05536c2b6980cc916e6b96ded06bc4dd7d4f478bf12af960678e96d18a1f1510668b3e72b492b128bee6cd88c6f05374ad7217c4d98750b3226dd6d1691027da32314264247f4a7f5ab4ebad5eb09cb0f4528e12b91a1156e623db7383059f4b63ef1de85b82eda5cf09731b3b62124689b24ed900830a4ba5bdb3be8baab0bd86a54f5ff07baf532cee5b54264c913e1843ea810c60d59069921035d1edd78a5ffc31986f493585e6f8b0f61177cd36926605e3835369c4c3d88a039f4ad78c5ec66f79c93d0d08035ff1ce790f035070e41af5b7b98378174950b8f623d6352269647859143d770e40732f92e8975bb4aa3e77fc9c36611807234c175c21cbadcc2f1c4feffc4dc704b621116f3469cd1866fcee88e47c62476d4c5b9792f262dca0be4e01a25c19f5d7dfbf016bef99a509925108fdb549ac4efec632df0c47e3ffa086cb2acba5f49a3e2831df1d4cd24a3bfe5cc5b66588e7c168de6ffbb1c042c4b605ded0b6cf069780f786d9b5d050d78c24bf800144c85658955c9ebff22d2839cef567ddc1012158b33c6ed67942aa2050c85656908067255f828381635431c933fe9a9eaaadb128d6a53fe4617bf90c12e3aee7c7995d8b996a11d899b511a456f67d100a3ca8ec4861e1e1e45146fd691dfeb9bfd2909fb88a784a282aa2541456c300740d84d0a032b02d8b92f4fc901f3cf8bd3b51d7274bc7e07406cd5f8ccd81d94316cf569d19415e8844d54bc614a22a7617a00507d08bc39ec62300b577748be7c5d69d2b8a9db484ad0a13ad6dec6e2242029521dd741c762987457c82130fdf51b5d674f8d9e19885b917908fbdae45c2a257b740b4d7f2de1732a996101078524776983777151a08c59c1a86bc92946cb74d33f83d0afe6402ff97714ffc006c7e42021238536cf49b1b5a46562ad254b7017e0559fbee1508c8c00e5b0f6bf687a9acb06b8e8cda725d2aa4365204ed4352563fe848fa154be2c19d692d2b27191bc7fb584360034fe24ebdb57d622a7e6cad09effcfd016d61292aee859da0c12cba1ae996948f42509606b4d2f48fc9965ba538225049142a84a0c3320028183278518a4a10a6970a0d94711a009faf504f0ded19208415b894badc1ffdf27d0372a82061b1246eb83a118f6f1a8ae6849c2484b2541420b5b72fc373cd1db379d3704d11279c195a39c8a8fa445b0e7664be4ef2b473c0546bb0664be0e7c7cdf49265c2a0d17003a6c3503a911b8839201a9819437b31656abf30fbe2dd1bf3ed04f9f14b00ac4f40e47a9c57c9aaf1fdda895aa66889cae169a1be70a95f1afab1a2da6cd3f0b741151afb98a1dda6ce817185133cefe84b55020cca2ad1536cfe341aa3d0c9b62ff0f97c5af27c5d510cbe86b02df80c923cbd15cf2764b9d15d2b74c8b15674a84a3100b737db4be52c3c30462c2f0176119225c535037211f8026ea06ad0a042854591d355db7fbf539f3c5c2430ea15d360b27f725dc18603e8ccf9251ae69384c0378d3f63d907206dae394e4fa0ee161440ecf247960fb21c15ed3cd3f4b1fc3c006d3386ee3b9cd49d73d0109881bbaaae1db3f408a70f08bed945e3c80e6b2b7fa1b077ae8d5632813cd9abab09fa9512c53a2a95c03341f103d5c5b2e06d4f346e54c6fff319b946685799f3502042d21c16bda0404663041cd11f7ba563c7ba3c602d20b1f7efbbfa273491661b85348028da2e1a56c96e5a4964b009e907b7788691c07757858471b0cc9dc6bd0025e022f0621160b8e804dd46f6977053fb7846ba7b568d20341806c1145771201001c852fe3ad203cf6406d3babab0f8ca47c86c9ba1f39cd6f42c8ab48616a0b52189dc3c571bca576525e8b96b1a07d23427d7b9029e0a8f85d61e7516cd7bee8d5d9b5cc6c1eda847cfadb2707c64a4900778e53a394baaedcb301e654d3ae328d3d113544173b918eaf6e44486868683162557dcb2c4a07de9e0b367fa05f159f906bc2391c4aad631aab3b67b6f7eb68368065076c02f77d1c0a3a721cd4dcf9b975fd57a1878719ad15edebeed330c6ed4d87dcc84fe87efb9e2a8384be93ec41fc4a89b7d61dc1294d3c4b51c0ba1611cb3931a92c463013199a151d53fb9574d1b6b08afaee982179b51542882e7dbc0b2bf2f113cff08b5214a5d151037ef74b2ac4776258ac4a4922d9ee6d8b8e26c4745743c3605a911fabccb9e82d5ee28259f321b9b5664d1d17a171522b6e4c134b28054845d2ad7b8b5b637a16653b0914d18d306bf39994ea54313451e95c3efe6f1e42bd256e6cc84c2c39dedda57645c4780b44792f55eb20eaa338e11b3f78c72cf6f0025a06978fef1097d3e761d97a94ff091c5f389e476afd46054d94bd71819bc2d12fc1f7ba06ce2274e9985d1f84511d15738558dc7ada7df6efdfb7f7e242eae94fd17bf963fb7f49d96dd91efb01800319807a460049ac541bdbee67bb28ea9bbe7aec30f00abf5e6be12655180aded2fc793e07b3539ee9ee7eb56c97d25f531d1b60703e0558d5de05ed6349693d664098afa11b984053531f1eacbafafa85e5cf6e3e4397afd442860418a409cb25e085cfc68a82f9332273588a3c168d98d31d101be8758ce230d4a4b65212707347792f26bc17d899c8a6c36f4c195852ed65c6fbc02313977c490ac6635824b5166af2a2d2d29ebeaba06234738c1abe238bc6ea8547f0c23f1e81ccb4284dc66f30b8e25160c917c3e69a4aa409dcff9a59328b9978414ab6bcb8811501f1c901e219661799fd594575457b004a7f3f644e177a9f2277a0ac30c6f744d6eb0dd8f4987d03e4a52ca5fb0087ab43c97a0f48f6bd25912d44ad511fb7186441c6417e8bea89a73f63fc951870d75318d85ff2b283b93e2e5dc2d4355edea26dd8af0e4060fbd07f896d0c0817205542bfc87b8fa67659f7d46e43615aa67d7331c27724ccb33d96534e550f17c380a26dd6429de0e72caac6ed15a8c31d40a8a1f599c5ae894ea7a8bc9852b3df8670476dd4d1098d38fc48ba8bf4036ebc0c0b7d7470d7903f0facb33debebf82521eb606526aa9a2542a1f0db6623443408d7a7c556f46266703629cc8f8e1ee0202c2b0fb74e97aa4784efb1d35e95c21c065c708e29f08d0c98687a33c720d108cc6b9f8d5c93539eb6bd57a15c1c7b5fa0338380400af1db411db73dced5bc706435bcdead0317272df15055ff92d245cc65d3e103b1b530e2c435a4eeb0b3e3c2996b122890344ee7391223e3b8eff0145dcfdd899640c0bccc914742b3fb191ca0933defbc205c8a5f753e8eabad9bc3613417b404e3a9d1503cbfbf3fb3d2ccf5c5000c0d52dc55605691ce62e5ff4e513934c390b2f8dcf1fcf6485ca6997d22a67a970e4db833e44289577850ee37a233110616f7300072aa847eca751ab30b6ebdc0a4e7b5405450d5d247402c96024bd0e517427a79387418aef3b4b593b3c428e3b340d08251105e26ac39c6c1f3d07d994ea34839c0832a33c0dfba564466443ccfa60079b6b0625d9fec8f2d8267d584ec5870f1de7b171dd09d18d6f6913a845ed684418f598d2902828352d01aa875d54271c4c725071a55e6dcbed569c863fcdcad6b34fc96ccb2d52fdf0f6e56a7d25bdb64b2277fc9850a572e59402d05f78d1734e751fc5ac0b5b6ad31a79b0783b50e36c87b233ff8a0f7f1d9a3f416f072f89a4553efbc8fea515edc249d6d289880df0612d07a7ef532de583e24e4c6463b9e7620b140db87aa04f8cef261f39ef60517d32585bb1529145757f5170ac5fb20eb10642c56993453da240fbb0b4f762f412458345b883e034ab2e2b3fe3f1260d92edecfe6e80f4810408abfdaef63dea0b581eb980fe8919252ae829908b7da3ffbe163f6e10cadf444f5795dbd70fc0d1698e2a570f0b213ffa0311e12c883598565602db6119137f4cf26b68aed6354fbebb6a71410f967034d690522ecf47dec0dc8a50b6e5c7d98b4e56594938b158055fda5389e82218b95f90fb95c31dc6891a500069435a118c98325e0e5bd6a72c31e3d1c8aa223492d6adceab315b491368e2f00ae84ee3b0339f4059d6268edf7031600cd89eaa4a623ca61a192ca173faccb21c0f4fb7d7f7eb81fced078aff8e1ef81d7570f0230504d711ebb5b0f1825cc6194c7e0498f98fbfcce8e7e76dce8987cf513c5ef4a8fb2d4e6c2e095219a9e3d5cee89d09f91be43ad44b1c4c90f8315bdb23b952bd52a0d33cbdf461894674752dee25290b94d03dede4bb0ec0f8ccedf5b5ff1d24ad6a35021fcc89a598797faa17116e3a625bd1e7efed86b4191b7f477e228440e1f6beb00d70e31a8160200ea8459416a88000e6448780937a511af9ef26201b5d265026515bc0b6a08a06d70af60521295546290bb5d6b172f2f809ad8071a4c1edea2962fb8766497f825b337453256785c0886c347eea28d430bed12d744b11318098240b2085435aa9bbdf040edb3b00fca3165e0f78896d5b4b2d47aa5d3ed64715b2501a44ce101ac14e03ae10f432d4b300d1fd04a75e5fbdb2216d5da7de0a41e790c1771638e0f034f8453e00f491e793d08d2369dd1d5de803fbccfd92b227458a60a007f949f34b5542db52f0ae330eb30055660c810c5932616f63c9f72f57db108095cd8d7d9864a68fc70bae6b8fef8c3ff6c761110140b28ea54eed5ca2794f845a038215da53ee31e928bc5d9598119c3a45e1c63b2a8cd2b98e7ccc6e1a0cd5a064ce58b997a172025234922edab0deb64b13d63edf546ae30353ac7b4776e191a2bfdab7b307815d8d7702bee1d312aad9b8a10056940497c98891f6ee37f85c686893ab3fbd63e6ca4253cd12cbf9e84904a85cac54507970311d6a0d3eb1116e2b2d3cd00077f1f71ba5ab39559f150ed947cef4c07134e0cb3b5f92c840e189e05243ff331471e8aecb2800cb9e7f7e02a8e5930be8b05647eaf6d21bb6a2e2dee825a1cc28b8d733304751d8230ccb52b2049a29d0ec78fd615bc02b7c0761a5aed6d6b7914d2b3a7ca85b5483ad83e9c8c27f3453cfcf7401535a39a42524d133c445187b4ddb1f443289b03fbc14fdc18f7cecd7720237d15bdcbeab7bd306d30713f1049e3451141f34e9669b73cc3bcb3dad408a0c2476a0096680311aff4f8614a96f2be719c9fba01e147a8c31c30425d236b086445d5df0a9933b8d86d331e7ff5447d0b90d478c3524f0212abe7e258d6ab60cf3f0ba1b7514187d5f2b3723dac2c20cb9a86cf61d1eab86f19a7dae080bccd059b215e41ce482c1db6d9251b7b03583a24b459033094da0be16005e4998464629e30391788a68c200502b1811597a48522778d9c32a0f9b214c44a614f6f20f7a53edb517274fbaa7849d8b107ab8d67f290588e8f3eee40bf86268f3ec4c764307479f34f98886cd871d8f5477037415895dcd110ec126b570ac68536a8e8ca9509be0d5d41ee6c604fcad0da320a52631310162ae0b1addf8a7600840dac64845eaf2179805b9788505f8096336c6a7e153fa3eba92d98c47d6d194982f85c9e6560e6593fb42abe298717021bd5e93d5d237659c2f2ca87ab7c1b3cce60c4104eb2e419240c2c7d85f7e3e5efe43ee00f6bd4564598bd0e21623d9da0636cb0cb851c5357f6c8804b8d2e92b80a4b60374125b002eae0ced5478d975ed86502fcaa6e9304d605ef56a6e0b5863432a86443e9eb37aa62a7968348f9cf5b92af06c7fd04620c41740ca6d5233a6e9f47d2cd9c6d111bc21d702d4e09723307b04514af9d8ba5d506b099bf05de5a92cf706a41ddc2bba7f7a90f60696c3fcff9a03233c908044505f6f9668ad07c13827e1e3be2e767efc2f5bf5a32b2cec0546881cce7055ab0a0fc7a9f0532ed189136b6dd3d0e907c3ab2d8958fe9ccff5abc6e0833d22de8357d1c7f255bd920c31e3c13e53812915a7ef47750761469980c27de04ba042a63dd448eb1d86a1cc3f9802e045e2afe7203dc346d5d636305c72fe59357eded6c511d3194e116a2292babf76a9d5fa5e28e5beb8ecf27286fc49a548de16edaadafb8abddd3fec25e2a1b123c68dbccc8bd3d328b1e24eee190721729ecc79a15c781a80d3b4b860cb06b74b053b7b1b24640e1cc6b7ac48b66a98e1497f7dac429146cbde66c220e995838dfb857e65d721adacbf4ae312184ff1794d75afba0e9985016d7bd5f39b624310cf73d4f94a84ded87c0fc5622e897d4f490eb6576c719511e4e97d73f1bcb8c1c4010e9c2504337a1145b09ae26162fab079525c753a7d584c29d246c138812348e63725403d2d19497b52487f187949d0058d7a874cb24abee1a596f082bab2286fe179bfe6db4903edcfaf451e4ed415f8d64fa6262436177ccaf8aa6e13484bb65917b912d4f8170a48f74ad451fb14cfc4d14fe8f6e1264aa025599359a224be6040680ad7b251fdf48a8188fc8a3058e62d2ad2952d74ecb19e31bc141ab8f09c7237d3232b6d9ce9bc6a97a2ef31a1a1d709225af0e005e5fef75cc3caefd7ebc4b8ac4ca1918700708f9d12b57e0091a01da0a8fb89a22e4fb8143d101ac79e00e4666c0c53e6ba12d9bb413e2fb01c11e023f657fd8f1646569c44e08436949c5b0593e1cd0fb3f3046e3fdc804b2f5becc2b77abf1e1345a24c1712ec126c99f2149da8186ca7c7b14459dba329e67795aab7b615cc4fa5679434a94fea8203c5c48e99af4e2f1dfec1ea832d167a57857886727c5fdb853e7a5e6d60b653e426a1d53e10b23f8eef3228e436ad0e720d2519284a82c94fd8798dda2c5d580dc71e50065783557e7048fbcfad7a4f5ba7a180d574854d8bac4fea3b089b3e4b9160e27b4561e2a9d7f56ec1aa9d9e1025436ca5eb0b58b7337d1e61f08d1683d5ecda1a1176fa51436cf32d94b7284d2c483c40e263d8b46e705a05e3f0ff183ba74e683566f8124fe5baa7e561749294102b98021daf4c66aa6466cb0dc307e836ddb8da84d1f3f3641ccc143392ba7703fb37430520029864e3b225b153d1844ec87c6a52030ebddcc05f5018edb111617102aecf2156f290d744ea028b45f0052b8c4b317453e7f156d02d2c266c8d5ab09382e3ffdd2860bfbac23d40def7303b425e56cc3c55d1c52e4e0f6ead94347228af0d73c03fe848b75065eae7040f7a47c7c8bb295d653acc64c23e97cdf36f043356469744ff411daa5c88744103a19d493df5afc3b13840b8374c2731c37b313d65d594b8cab0482abc01ea42c1eec9c1e4032b6075b7005234f7ad050d01294dcddc96c9e74f20d5d053dcabfcbea36ec405c678d84ce7a7e8c2ba8ef021163b62a7cbfe7fd0363575627ec44386dd821582a0956ea5ba58c3699624194086045ad6712d6a272c7d53fdba586e859a429b33d1bb642ea2b110435d2ebef1b13694b740f5a6c5c294765537bddeb1d9f8c030d7ae0b0f537162caa535f51253b4869b152dd5e6404d14e65036f0c6d044e3145f110501068ab26070077250ff0a79348c2bfc2b61b81c0cd19096e93ec2b496bc30c1dc97e33b237a147d4999999b2e28808ab3c9cc7266a6f8b29af2622222222293a4c5c5d8faba7ba6a4442cdccacdd2d0337127d137a0f35414cf06a8294f16a82b8e0bdd742109ad00b7c10e0d5f0b18057c38716af860f10bc1a3ece78357cbce0d5f021c7abe1e38e57c307115e0d1f5778355270e1d548a187572305f86aa440844c0ccc8b55bdf7de7b2fd400c30c7b0ce0d5ec11f46af6a0e2d5ec818157b3c717af668f14bc9a3de278357bf040a6063d12f06af478c0abd18302af460f0ebc1a3dce78efc58043e8868a17bac1e2856e36f042372778a19b3a5ee8c608efbd1821425c00d2420c0c41725ecd1a4d5ecd1a545ecd1a4bbc9a35b457b30614af660d04bc9a3520f06ad6e0c0ab59a304af668d345ecd1a6dbc9a3566f06ad6e8c1ab594309af660d27bc1a3680bc1a367478356cd8bc1a368c584198b2021e6e1e062a27325c69f2aa0084a4b071a30816e9346d5381a582344ed001313c507d21f29c66e217972e05745d284d335df90144e437cdf9ebea74931f404e278deb7f99b496260250bd285576218623d8008a1edc26eab8782fb4aed3324c49f7285469eb389c13a7b72079ef8df1deeb5ee8883e8e70c011464247e07184099e88f3dbe5511ae7aeac34caa2fd962cda5f79af92e140f5ba38428617236e208df802014664efbd911145424600c0089a1bdff98d679acece1d5074c9ca0e17afe7bdf7c64e0d4fa4f02408dc26326246f7848a27677f82c4e3e1726278228388cb3c4a2be98d8909d248c17bef47971772e2c36da2ceff0092693dcbb4a02bcb6912c66b624513d2bb706e521b0787abf2563085aa0858159956e2464ce86042c67b174ecf4a59b8d4e651a91e2ee76dc184c97bcf0a42e78ef79e91d18973c1c1c9b4d349e3234ea788f71e958b66c90cb0be69dc53d17ee6b3f9cd3f31cab46c13857238ed6f7ef358de7b2f3c265e2887c97bcf878b274a5cce172c78a12ff478a10ef8f0deabe1f5108057430e7901f3425ee4f0425ee817f222032fe4451a2fe485105ee88b202ff485102ff445ce0b7d417aa12fba78213086bc1018392f040617302cf0421d78e3853ab084170283e6ce10c47b0f87f77888083868801022e2e6bd272f21ba494369fede0b29b982db44534b92245c38ef555648e0bdca011178af824075c5032a2bae78afb2e2bdaa01ef3ded859288de7bdc26925a7070502f84e48913a1235378eff9d0afcde7c81defbd27f34247c63802822356dc5c3847fa7bef0894d011fc2e1c8db4e5ba3932c37befea52da48083876749ab4e5ba19659a5f2084c34574e1f8906925bf048774e1e024c1910f0aeb338da7d3342a7d8ba6c271daa4e3a72c0046b19cf850be79170e152954a860970f3ef860c30b6122e021603942f8056ff32323174ef79b116e74330a612eae244992bc57194008026028efbdf7aaecd211ba2db861bcaed4fde8c4b9702e978aeb44e8fed0cd79ef11190db92e9c9b0b877465a5ab7b2a4754f15dd3b173846c077aac9429b8f6f46c9ed35aa76d7d6dd1b22c9cf6542e11f728eed2a6ee8726b872dc0f7ec3b5a72703ba444138b9361391e69cee74ff1a89d34f3a6e2ba536d4d571be9bb421a72b0a144ec4e17001b848a82bd34aa41fbf693feb880cb93c67d24d2ed18f9ca99f9f1f7fd2d98fa8e33493df5aa6715e4265bff443e466c88f2771fe6bfe73a54c93b83fe9adbb4a9bd7e24d25132fd291804a265e42e520f1da6f43ae4b47b97e94f820f93969bf7dad4897d22e0de8eab48c8bb6e41215c94a977ea2c45d56b4293f2b5d5dcf529768f33797e8c925faf9e9b94444b82038943e0db92e11a7a30069ddd5a550264d242b0db92e11931d7fd23cdca37a76341fae7bcfc3351f1d2699c6a36d1e4ba6f1741f434548081e1840e23449e3912334440ac4f040688809848650c0105d42436c19620ff133c4e83d9476110162c88563e42202c475dd0071e1a0b4eb06886bc875e1dc7017134a848680a1216878170e91211a87db449bef50baebd185f38c8488dcf1de7b0f206285d35bb8fe4532cdca08c571a32ea5f9ae796e643295b28cb26cfad4d180db4c26cd2b274cbacbf416afa50484e2bcff5c95f7aaaa972a2d3bbd5799fc4967ef55efbd2acb00d8a84aef55a4f72aa0aefaefbd181e0b7cd5dfabb87eafda5a974c39bc84d27c8fef5a14cefb269deff1a6ad7da7f154c9c23528dda69934b7792da5accaa6bd4967d3b60ddb524b66a544a7ffe57da608fd6045045610046e3ba25dfb94daf8c5a55023adcb4aa3aee53d274e7070baa944e238ef554dbc5731f1dea379d5125a423ed0c76da2900fcf97b68e9fb4df3aee92e3bd0b2774a15ec7692895161505b0c8b452018e78a11ef0cbd19c701a4fc5e5d280aaec5d5122c48315ef8578100093f79e9217da6105594903e98bcbb2e91389677e5f596abb8ef85c4a2e2efac44547f11d97d2242e5848073c423a5409e55085f7de7b43784c00f0423018e03d9e27520b0e4ea544b5840eefbda017c2c18a97798ef3a3912f6d9df542e8863e1ee781bafff9b9b6cc2074c312ef71265d52822468db61431242369011646a231432226403c977a9ae74250bd73acd440a3208d5f082f79ebeae2a8e500d5810a1062496a84107d12e6ddd9569250b4b88863c7c68c8c08f100d37cf6b29856668c21375eecd10826c8b961d119a81149a61894a89196a5059152c881792c18df77a494f31792d1e0a4af341694fc209c9408077e134e1b84d6444db341fc304dec309c5b0dfd5692e3e0bc5904331d8f02e9cabd3446e827c9621ef65042118ba782f04031021186642213742a1351eb7898cf08d2b72e25c363f3a712edcb643355278efb9f042354608d5e0e0bd77c30bd5b071e1f0d1cd85c36d37174ea9fb4dc767d13e55165fa0518223a7d2c5e92da4aed4b5932e6dddd72e94d65d9de6e22b07f82053b6e9cb6bd1f68eef1acf1226beb4f95c3d3be1e0ec536ad3a9a208b93005add39bef4a32581982068f2666fc3842119800812b45bcf75ee80c213ff0017162842a1eb78938573a19e1b8bc500b58704648dc7757a73713ea3ad2fdf7fdd247b0e3bd4a008f05d5944a88055c49925c5b8abf18416448166dc4954444b88b004446d70d37240004b86eb821413ecb28688f46222e2b19e932dfd337cdb912939c269956eada9370707e94f8f9b9bec6af9c4be433ed864957d29ba6fd2d5b3a1f5465e3b688782eaeb46d9a5f5cf75a3477f54c6bcdb4b58bd35bf476913894ceb86b6bae64d21d7773b35d9b2b69d4d5759e2b91ae2e88ac44e2a5cd9f3c09e545a5d375f21d133f3f4a7025ae6f5ab673894c1c4abbb29c4b746da5adeb3c133f5c89dbfc941f257e89c4b5bfbee677919413a5ebc2b934bec5675c4c292630265274b28c4c26bf45092694d872dd98baf6245d4403e2bc961250a669dcc5e55ca26ef2a5af77aa48095ad2fd14a0d2124df3d19d6692d3693cbdd378349e9e55d9c1cf4f25e5bd8aa782f25e75c47b9511ef553bef554fdeab9c54d87b1593f72a9df7aa255511ef5544bc572979af4af25e85e4bdeac87b15ce7b557eafc2ef55f7bdca56f4bd6abe57c9f7aaf85e05dfab8cbc5789deab8abc57ddbc570df1de83a984786feb03c9137d9dde47cd23717ad4b557220b59bc2cd4e003113fa351e781fcd73d419bd7a271aec4440a2cc0c2e9bde743d056da7d87d350320f85339972b8207f04eab43de938edc9a635d97c964d9f36dfe92ba8d3f6c4673b725699d27b4e4ec7c5f37426266f4295361fcda70365a52ed35abcc953e19e4cf15dd3d9e239ee4414274e4c3a4e43d19d66e2bba6d3f99e5e62a2f17053aa749c86e23bddf558e1986c7e0acf525a96e5f85eda3c909ed2bd49678be711c9790165a5de378f12c919e4b37441fbfa2142e466c890af0d71d19f8b2b993c69d3feb5699fd33bf328ad7b1e8d67f37d93f2a5742929d94e4fa7f10065da76658b0645d37cb8e828ef55329510cfd4d33b8df2543adfd3711a948e4b31e97e8bd6332c0a5744a10528a060c764d23a5c749453a9e3fcd5af4ee3c9b4eb6ba79447695ac77389b21bddc371fa120599328dfbf9e1523f9bfeb9b8ff35dff5565a72897e7e525a1205b82e254a74a7995c377dbb6e7a909c4aa41e948e92e4f29bd6f578541014d77569d9cfcf0f7601e0d23a0e75d25c7ca6b5943aae7dd71dd7a5b4eb6b22ae2b65291f2a50b21dafa564ca41797f440f5056d29e09b7898c90384dca5238384b2063095cbc77e1fc5c9dd6744e4b102da146097528010edde93e1a759e1b8d7ae6b991d653dca8fb274a5c67de024938c27b03c84adc496f1a75e78c252e88d3dda6458152ce2d9a4adfe1e27ba64f5a8fcf341e9f24d0c0994c7dbcf75e1172700428d58b55550f0b4190600412f4d1a54e6abc5705752a69930e17544ee77b9ef81e2e65426da99ea0d412a0acd44dda13bfc305a39279ce7926da9b7480b212a79974baef509ef31cd4697b927994149d2d9e0775da9ef8eeaf482d3838d38ab472e25c4e1c0922284104fc7eaecd934184191d1c9c2f86d0719bc8c8c86f1a1f6d4f507af3e1bae734141fdd69262612a79f701e484f117157a6dde82d95736d5a93cbb44b5ce6b94b97b26c1a97e232ef398dc4af2da5257189b84da350fa4a756d435d4208a1b7f8259788431151627289c600021c4f03c21640c0de13fdf41d8f0af209f247fcf82c9afbc9b49f4d7b13bfb8ce036db9348ebb3a94cfc2bd16d3d6416c5ac7795277dd7057aeee535d89e4f70594957ca9e3a5939669dc9b7cb84bc4f9af69db94207f4467c205f923341e9e1a3da0bcf73a6d1bf20050837e353d30e3bdc76d26cdb5f752200023020ee88190474551148b98b4171ae0017d3b78c2d3beef20c9dbb2d2b545337d5e02d2a014c943029e1bc2bb428d0ee87b2f0befbd0a0b0fa274c79d4a9d91ce734c78efeda1042bb3f48b0a449cefbcc9f71d19308228227345049469db96cb9fb49e4bc4ed147769d995e96d890c1625548a73edfadd7329192578788121a6c76000460b283c81c89011571205f92c23a0ace4c34b1f0fa6ca83c16e12de7b48a099811294e9aebdf78ef0de334211de7b44f841086e40df7bbe6b99dee2793660832964259315346cc085688957e5bcf786f0de13c27b0fe60725a86a70849a1aa05e50a635d7bdcf3493e74a974807edcb6fcd9b78d6142f4bd7e9deb5ecf2a91f9fea3edb22c5778de7c76f3a08ef3d20fc400545e0c1e499f0a879ef074bdca1c58973d1a78cdb7c89e3383ea2411eef65a59e2d403ea29f4e337133e822d232a01dbda5f40c8c98c190f780b252a77996dabaeba6cac0083f9d66ead1f9e14a5a4a7df3bda2b123ca7b5c89f39977c280299a90c1e3b4cd3f61eada9b2eadbb7e89c45da983dae181f71e9c4dc8d336456f76c000d5a105b789bad469778d4b9114cd22dc778d1709ea4a9b46bdbc57bd07430714de1bdd408de7fd1f69dd880e2ede7b9ca9a43bdf47de7f3aac784ffb191ddd7b8f0e24e8c0ef3d2ec86719f94ed371bdcd67d9b42da3ff353a6092f0b8d11c763cae660e33e6e0e2cd81c51c5ce6f819cd31e5cd81e4ad214710e490e3bdd7479d66e26ae428438e0c5c5ad7f512003c17de7b971c327023a0acb419f129277c1f71af25a68e1890b1f9ae6464e7bd8742fdcc34010332b84dc48d368fe2a5ce9f70800757e24a9de63aad6d5c9fae233f5cf4c9e6427211e1a24f36469c18622a797e19b99cf851c00be678efddc0067854a99a38bc78dc260adabacc1b41e9531c3ad4e0bd47830792ab974e5511e0203d5257dab4110ea56d1aafb2bc3185c76d2223538b11be713d3c52767c7478aa1831422227ca4864459bb2792d97d67593e6b9d216eef25baecc3f5132755d69db74e92271cdb56cbee79aa2b78e0bd693334ae1e0f0d2e6330f344261dd6755b847715cba0e07878be2052068c386f3dcf602d37bef3dee513d59b8e7e293857b92ceb66159a46028bd6d71011e170e4a6f5b2eadd3e1f414cefb2659152abaeb1180a9a49b44f1e9d1d97c329f45fb786ef33da87b9ea0aeab7499efc961811058d05f960a1af9ae679e6383882a7e4b994aba49cf7c4ff7deb4755665a7d378823ad409f35474b8ae97f4683c3d5b34285c16ae41e9e93a1fc537e9594a6bd2693c59b806c57355b29d13e732ea99e7d6a0618d9a0ba7e37c9f61e43b2d53a34811d9ffbf191ac15e6a4f7ded577e3c212d924602d220a511441ad7ab78788f0a687c81d2a730d6a860aa207888de7b4f38f1de167998c1c5195378a2cc775cfca5f194008e2a4a8565435d57d0beaa2cac9757d9e0bdc7c4ab3943e6719b88fbae653ddc6b19e1e0f84de32314b7843d92bcf776f05e1eefbd245e4d193bd8dd97b68e4a112cb27b115fdabaf728f0d028438915bcf75470450ad8502305dd6fd1b64ddbefbd34d038c38cf7ca48c1d37eb6d37b0ecf16bfc5f3a0e0840226efaada40011926dd95b8d7925d287d1a89b270bd7f7e2e2e6b72893aeeb74de398f8e1a2a3fc28e1b7ef224e43b94437415d294b9d4e1a1f72c36df14d34cda7d378b85910579920d503110a9883c9a3611292038ecaa202c5821c362e88017e9d0b1bd040063260c57b0a50c002a840000236255d0bef95a210a1b3d275445e405c99375df04ae2c39579530dc131052d39554e158242123e4820821f34b0c402584c795688d0e10dce9bf62e655dfb8dda941b75482d239c118a73030a374e6e2c41e4c2b96eaed1f7db109f2d9a0e8753dc5be14aa81cae84d2409909752ab5c144958217e4f19c287941cf538284f35dcb5c20c71b713e9def79ef4579ef15e1821fa1162480054b7817a840d501a0ac5405154ef84d0b1b4caa2fb2a07c9795b8ce5fddc7a3a4683c95176d3ac867b9366dbbf9f1e3c70f20995e12d46da554ce0a42a001152421a40614ba08a9c1bd0704146abcf76c2a04d29061d4850050a0417a4f779c358037ceb843a6f41e1732838cf71e243d1b3368dee352861aef6965d494717a5c7ac66d229a2d3e8ba952806c899b9b244a925c44b8f4d290ee7b2838543629ddf750aeebbab225a0b8b8f4d2c803753f7a820b5a1033c61449900c7165de348a32833198f07cd7b231d4088df19e49fb1ebf4de97af37ac36aadb5d64a29a594524ae99c73ce39e79c524a29a59452c618638c31c60825945042092594504209259439e79c73ce39638c31c618637cefbdf7de7bafb5d65a6badb5b5d65a6badb5524a29a594523ae79c73ce39a794524a29a59431c618638c104208218410c69c73ce39e79c31c618638c31bef7de7befbdd75a6badb5d6da5a6badb5d65a29a594524a299d73ce39e79c534a29a59452ca18638c31c60863c6d7563a6534e96ed3a29c769278ef0de085c4c0416fde8811be711a8f2f31e9a69476658b66f24b74fc13dad6e43debcae6495da76559d74bdeb33e158d87f3ef3dabbf67f14c2b55f1548234946de9f7ac24ac1fcd758e6140a54d87db341eae43a53c15ed4b7d6b2ec5f52cd5a4fb6c8b46711d57f29b0fd2a6cba4b3d49569225b673b7e4b75a9bfa5ba7d5da46e2bed4b934499be4c294e5f5b9b44dd77fa085089e3c015deb39a78cf62e23d6b8917e2c01d4abc67d22927ac2490f099c6f39e75c59fb49ef72c2bef5955deb37c7a98c0b0ecf48c98604ca4e8f060232a52a850c14618942a4ca44419219113050727f359341f53aa6b51f0c9773b409aa9eff8ac0494613a5d542132e4bd57c998b62a0c2e3ab78982f688e3348a084b4997e9ac742a6d9c2bf5eb94cafc89d35b2eed095056ea366de75c227f6d1b4882b5830eef71ef59395838dcf01e93ee4dbad34d34d7b9dfba6782564b3560452f6956b40e15b471aed34c5ca7997aa84dc13142a1340ece08c5e558abdcb82ddecba9a26d1e4bd0922c674b71ae6539252d252658c62a345b602004efe1e08c505c066e9082011a6e1375a58d651c719b47993c09cb98ba8005a4e8bc67c1107acfb46d18d74ca61c0b10216481295ad4f17a4a51a8086941ca228c77f92caea0514682ba1acb056ef31d97a2720179ee22751a75994c393838ef592fb8f01e0036181db200800f315ac45811aa00170a4861025d24a0045be59317eb92402781ee3d2e30011180c2ebb292861a454006ef4d915a7070949038fd04091017a44dbe6fd1ba49d3f868238d4ea90c0b3b1e16501e90c7035af0e44c3de088f77ab6665ad231df699e693a38383a1c083900bf670171851defbd2bceb8428bf7de9504c975e1fcfc5c1da7515ababe3803a6b8a2c68a095851a5013bb068ac991347c287cbe9fee4bb9d93ef76b8ae74850124782106fce430a026b400369e48932e9d135a4015ef3d11b70023ba9ca905b45085194f6432f92d9cbe6e762e5110e79754c123ad6439d18aa7a2002fde0b29c086047c20014b7820a01477dd709ac4d30493298773a528de3741401519fcdea3f2425454f1def35baad3fe5f3f5c961a69c99279dd65fe54da8a04f92c378aa8081601d24c168c65bd10153f5685650a286cd1db14c9288245b22ddab6499c2685a6b0e37aa1295ea0fd6c27c88442e5784e93a6f87038386448415fe93af233dab4d10f892b65a57f2de13611d7954e5878ef555778405969eb7a7070b8ef1a9733a584e3b469b47914177d42c2459f3ca7b712395348b8e89349fb7441c1e3369149e31c00044f241205d17953a7fd06c499bc962b3826afc59b46389c261921719a640028bcd76d1a89bb34adc3f1dce6b5f8adfbad49e6b3685d35052e484ff1fe8fb8208de2386de206b0b49fed44316929417a0ae793d078420438428800450811e08ef7f35e058527bcf75a783e2f44801f6e13f5235030e13d6e1365a3cd77a5d1c9a33823dc6b09417147080a1e8484f746244e3f51a20489497799f64469d3484a463838beb47523143702e24ebad39d47ced4962e2653aa89c603545a42eaa4e84e33619245ca153953da343269da1e71262544ae1b9fed70a921ef759b574224e7bae93b48b8b74244ce1477e23472e2d4392e5c0b40f8810ff4a87ac083d0167282004ebcb7836a07efe570a5289da675eda9046d5d869974d79e4aa7997afc13a56c0775da9ee860a8d3f6e4bd2a8f4a0739786fe47b94d08118f2c083080e18410871848103244acc2073001a140009a1a00e085c693c61654f48810e0800821940bc80002816f0018b162405b620838c224eb0a10236d08187184c0c30031f0624e1818c0d4259159990d0a9a6c2a39a4175c77b150d6610caa24708de7b220beabd2c36bcf77ce0aa3adeabe898233400d37b4baa24da76f9adf150a14446144a5c322874ed6f422426749ec34224dd692621a030424037a19f8451f7dce63d909e929580423fbe57c50006af8a23032a99b47fa2c475292d484321e23d2674f97933a79907f36092546f868baac784aa99f742154343e542452361ee7b99000c0f33160d4d0ccc4b55bd1a2cd1b35e25001822aa377324e6bd2053bdaaaa6262a815c47a5555bd584faa6aa6b2aaea45e609abb2aa198b062a552553cd3cab6a41f462c9c80c017255309605834505535516902a0a56f5e3c55430d68bafaa01585565d154b172b02a4b06c6aa906055958c5509a0aaa1aa5e2c1a17c4bcccb850d150555565656b069a976a8bcaaa64acaab25e46950503e407b584544a68aa189b9724d58c65c1c4172096551179c15650c0c4204d5ea6580fe6591da8605e86c0c458d5cb8ba140f583ea59afa6a6e655af82a9ac6a09158d254455593196f55255b33252d154422ccbb26474aa202c0bc6aae08b28c80d3401a85a8001072b8b2ac6baa182a95eaa674db12e2015ccb34a32effaa9ae78793eb8a07a45b861bd543215cc4cd542f5a28565d1e0bc54f8a5b22c98cb12f26348155355331026f6002b0b880c8d555555355355389565e9e045a6fa61c1bc68a97eb05255f552a4fa11c4aa68662aab088b078b076b8797f7f2aa172a19cbaa5a80a97981b16eb02cab92a9607ef5c3a60a12635531950b37076b6726c80fabda344266ac4a00154d55bd58154cf5a4dac1ca960e56106bc68aa95e2aabb22a9c6a072b88350353bdc4bc54d5ad5eaa21d58f4a485555472a1e2c202f33150d4c6555154e55c9d060c950c158550c4c95ad20d58bc543f5f2625930164c952dabc2c10252fda86860acaaaa70aa1d2c20332f150c0d4c5555f7aa6c108206c9cb1031d54bf5a382b1a1faf10327881239f0500100a6b22c196bc6573533c0204faacaaaacaaaa8abc99877a580e5031218925bc2b892e8a6047123e04210957f40f4650c5077a3c1f1f72f07aba9081efd1753c2a5da8b105151f342902e862004c98a2691150bae0e1094fb40e3077618391ac5d00c1f5410b36d7072095f5418505fbd38706ec958527fab1020f457ec2b06ef40043bbb9a010437071b3470f3f97901eae1a60785cc4c0c4fb8981c0bb60a678151cef5dd943b84d244305102062d065e6c7cc0f181768eccc8f971d84f844c1f303cd101920341846c80b158c109911cc9697165e42303798e2025d645cb0667ec0dcb4b0031e411720568474981b17a2b0680e3155602a19242de892040a93d014160c10182844a4d065085208614714550c4ea88722a2b06070782982aa7c501233041e5d64647a9842c50c2f2c41c08b932814d0e5861f5784c8204486279acc80a2e180f0d10549f7c3c94f046a667ebcb4109305660156444103e382cc0ed50b330a2270e0871035a082660a59b860058929223493618ef04a94408a1862860069022400324bc0083193a538a30b27527ce00134d4402a5ae05018f0822e41521f0353b4205fa8ace8f07264e6061b0590992c0384c68597bbe3e46507204df8e8026466a7851e9a2739604d80fc7822a4a72339a34b0d303716880c4e0c2dc8000982fdd004185d80d03ce16137a04bcc4b4d4c25230019203147648450b22448ea4710344f6480ccdcd002931f36303c3f6a90418700e040831034431c4125005100a111cdcc16e6dd99322304660687189c17fb43084c105711333f6680c018893902061751c5e4f0e2430c0df0070d7fc9d8111b6880d0f0e346a1c31384d20c81b181b191f94017215c80611233440c0f3f6c60747821beec2045179191eae5bf1481798981e2872624b0022d23c108ec60a30424f8c0170c384001b87059bee73f4d2c8105092b557aa64031e2090e9e43020004002e1837dae8638f241081082540fc80c30d335ccc218707c010004604ce0e33080922f30235d01041181ef8c28b2eb8d8a2ca90208c883070019f9e3eae00858d658f25ac31d242117840e92b390264260c0860717fe0e006628481936d0d3204014233a3430e65a46009dfa5f018b1d304d3800316a00018f4a82a20c1083e70802b56aeb541061819d8f1042b4a92d81f33322648001a27e0400524d0002836a0010d3c400a8f92234108a9acf052056b0a304cb8966015018608960f62f4a87260d9c0aac10f3c84dc61c9c0aac352c332c10b09ac2c3003a86caa1e687688d1a1851bac1aac192a194231c4c06085aa1a1817ac203140ac1f3434d6cc4c8c0553bd5495cc6be185971c5e56d005e68a2e30506484b8aa992844510346979818213301c84114305d44981a847c01021906748181f28306203ad83045971f49c06079e12148272384a6090d9601f272c406203131e842634617199688e2c77dd9c209427ad025a68f2e314270a8411721dd0f2be8f2c30617ac99233146622650c50c416ec8420a182bbabce0c30b3ebc140919a1b121d487143143d0e019242f2fbc20a1f9a2cb4b94684406884c08babc0491c101e626487ca96084c0dc00691233c44c123238c800911980101984c8f0c3861f34cc24f182052964707829811431707401620030a76b04c40e3038425e9009c1542f455e7460a608a941c69ab93293c30c4fcc0c2e5432415e626084bcbcbc582f332f342f3f80e800f3325365068617a60009cdc8cc542f333014c6084c4573c34b0e51fce82106045d5c0841142119981c68984801d303297e185daf8f2c1001073790811d71c09102ea810016d81222925c2ddb63094682a879816646092c5278faa0e38e19f4f000a84516455ca00736a8e38d35ca2081078c8802508154f7006e8b42139890071e77b481820318a08925b0202185c749931e78a8810635d2380009466080028c76d041cb7a70a1073c70e2d4a58f2c48818f2594a88186900dde7083056b949102133cc0010b183591c415293c3b75d0e1c61c2ad0e2890e7250c71b6dacb10230be680002a66802136c80c71a2b50e3045474f17d070bb5c0042104a10771b491061a648801812b7c1f35b184125776b0233844422dd441471c5b60000254f8de84113b4db023382eb400f38410843ae880811b69a0418609c4888003a860c2889d2447702e8d446008c1bc3e8410041ec0200e37da48030d138811010838e00a2a7e30626209228c88ae60052847bce0c20e74c0c28a0620710572e08a06047111c18f3e5eb2606121c60a5615684000f3014b0ccb0395b4e20bac44418abc0cf172d1d083a54395c30c0e2f375436c0d450d1f02306186078a9817941880b352de020e486203a0009fd98a19199b1646462625eaa870390257a9795369411df355eca52334be025802c612991c7cf35e4ca4a17570adaf4a649fcd24a7c40093094d0e2bd2b09926b481224971224259878efe7fadad5056d26442291123b4f64707831477e880902cb0d36df751a6564eb42582880a5cb4504cbc602e55d9deef4c585b0dc5c5c7cf749542189225c9bf637521266709b6823f193ff21c50f28def3a9ad7baf4a830d23494c79d51bef556ebc57b5c146258497e3a5e4dab6141722679c6fb6b9669a679639669833c6f8628b2ba67862892386385f7cefb5b75e7ae795375e78b3c5f65a6baba5765a69a38536575c6fb5b5565a679535565833c5f4524b2ba57452492385344f3cefb4b34e3ae794334e38b3c4f24a2baba4724a29a38432471c6fb4b1461a679431461833c4f0420b2ba47042092384900bf448c890ca8c74a7cf8412406e8600195280ab001714d77503e4060814d7755dd77bd50bdeab5cf05ed50236aed871e184e02701579eb842ba22e5e7e7c20172f3f373e174df9bae0bc80f91abfbde34e4274992243e542c60e3ca0d576cb86e8208220b13dec3b132871511bc8b2bf954942555bc2712655680ac2079442e2448ae38e4b202df7b3fd8bc97d9f0de26e4bdceca7b0f2e4173c77b5c967855c8a8c2c67b6f892a64bcf7c3fe40a80a12556eb264a58dc45d5ab7857ce278af22e3bd6a8cf7aa13bc44e1850895094a5091e0bd6a04ef552278af0ac17b1508deab3e9081f75e9517ea21a3a7043e3fb811b789a62816b99220b9deabc478af0ae3bdca034264783e2ff47e5ee839f142af002ff42ef0428f8c177a68bcd0a3838618840079afe6046dbc9a13e8e0d59cc009af668c985733c60daf660c205ecd18f5d58c41c4ab19a3c9ab19c30a0c428260f16a826ce005374269e3e30428d354bef650eac45d55034cd72d7ff4f37aee3d176d8948d43d176d5b8c0736f1ad1a5acae3ec5b8a442291d442eb1db4421af5d7f2ffe9a984dd738dea09f247886ea43ba8683029adb063096d8f5ec34bbad193b8d6f1a5cdc7a4b90645244a8944dc6b09f2479038fd44c7c656a96df1f159b469c912265144a2dd47363e506cb025beb4f98844a25ae7cb06aa1960bbdf8fb3a451d77ba5fc32c0fad5145bfc23cedf665827506a7b264da8d8d881c138eb95545e9eb9c63d4a2980aa0e0ce67eeba7d86ece2dae9e0e6cd27d3997f96b9ee3b57c0e0c428aa3a5f77e0f6dd7726095c30eb5c73efbad2fd631c026e5f45edc63cf387e7a61806139f9b6515eac779431c63830a9bda657dabd31a4397238301a6fbf90d6a8f7ee79ee37301e63955777ecf9e49d639148c651bcd38dca0d4c728e25fed35ffd239d93c634aa363039ad8415df1ca5ce5656aeabf2572fc0badd144e2c37f6995fcd99a85c80612def96f5d35e2de6d2926e8409a85a80d1fc79afb36efde18d5cc6383aa3620136e5ef16fb7d73d7f1fb6a46c50676f1fdb7c22a29be5d53bc0696abacd8ce2871873befbb02ec761eadf637dea8b78c28a85480c5ece3cd5afad877cfb2db5897a8d4c03ebd9d6e1833e658cfbe4937a681c50e6de5d9c77f65f6fe926e8cd122a04203d39e564839c5996f39e926dd08e52612c54947750696259c79d76831ac7c8b4453c2519981d57a319eb8e73e3d509581f5c8e3fdf3e6df6fd49bd75232f97e6d7c9c4c2d15c61460d7ea8f6bfe71637d65d4a41b475a37f2379e32953c58463c150a304fb3e610465afbfe127bd28d344ad0d66598482412894422518c58a8c8c0668df1f3e961e533eafcab31b09bfdd7fd4b5fada47fea29149f00f377da5b21ee764e6ebd370106a9ad3e7e9df1e55ac609a9d8e8d84001d84c8162734da85369e44da85437b225c072a6f64ace6f9f1cda0e3109b0ba63ac36578b2be572ffbc816a0458bc16428c7dc4564b6cb78511049508b01f35edf866be37f4d657d28d9d8e8d4824122161a36313a5c746e7d471a901f41cef9b740f9b5085009b5c6e386dd43252aead25dd88a38d8f131060dfc3b9b1ce725a1867a49706d50730efffc597dfbea7a43677d28dded44ba34cbb3bf0ca518981d9fd39fd90ebd937d43b926e18989efc5ebea9975e66593de9725c74141b1d9b4c8a8d8e4dcf4a47d8e8d8d8e8d804f9236c746c364fe2f4131b1d1b1b1f283618a3f469d47d8cf54e0e541ec062fc34fb1ab3cf594b0b45508121e9dc137f3e63df3062d28d262d1245cba5ea0026fdec937bc8a9a43d7349bab1dae8d8e8d8e8884422112f8944f803d51718cd534e4f73d476cb4e3de9c6a0ad8bf146cc83655444e505a6f78f9bea2da3965ada93ef7644221b1f273639363e506c442293499f7a44a239c1a8388059f96fe499c6dc65be18936e1c8da4346d9d551189a81c41d505463fb6d9ee79fb8cf85749ba116b5171816dbe7bee146e68bd8579926ee434d4d440b501ac678d3e76a879dfd15ed28d5bf436f2fe8fec179506b058afdf3b766ca99d9277d28d7e43496c8b6a0b8ce6cb2fa6dcd27f79bc957463a6612922119745d34822d18d5e5419c0a2b75663cefbde10fa2949374e99a345a2c200c452de6c63d674cf5c798ca31883ea0257560de3f714fa6da7a5169079569d6bccd35a79a7d7225a1aabfcd36eb8b9cc346717545968eabf8f3cd7f87594174718ad7ca3aac0d6146f9a7da41f629c6397792d33e398828a02f5decdbdef95eb3e2fdd22914874e25cf228d278e25c6609aa09402feba6d6ff696bfe516fdab66110c651b455b6514940d25bb59c10724a7bf759c7460747a08a00b5feea3bb385735b0f01bb2b847a42182ffcd04b2c62941ffb3c399f5c73efa750b15962a363936333050a7540f5002cebacb8da8b67c4964e48b3e8a4c5641261ff5f5839cd77cefc6d8d1e15d4f5ba695ffb9948643913ea54aa232b2a07547aa7c553fe5a35e9c651e781aef6b39dce3b118944221f27229128c37881ea0acc6addb1d69ff7cf2fa4db0a4c6eb9ad9eff478ef5e59674a3f75b378ad1a3827c248d78540dc0aaed5c424f31e4daeeeb1980e94eb9e7dc6a6ee3f4372f0093506bbb2b9415cf4e39ae02c395fe7ae1b514c6ceb9cc624aed6ce3e3c4a4b34d0aea54bad1567c540ac06eff596a4c65d79eebdb138079c82fe6bc46bfa5ed1723009bd4765ce5c5bb63893315d8fdd17aaebd87b75a0e2de946a0acc46d29eeb751f4401db3f17162f3b587a26363c546c7e6081b1d9b2e154524da7c964d9fbea7e2bbc6231279bf755b24d24ca627304adfb58cd618ad0c5453607176c9e7e6b4ca5b69df36bda66c786cf64cd9f8d8ec9ab2b19707cb48aba4c0b4ed91cadb69ddd147b84d9ab631962a0a8c7badf79d57d7ecbbc69edaaa0ba6bbd4727f6c33a6d95b395337890360f46e0ba5ef51f6aae3bd06c024cd9f663cb5cf52cb5a0b804dee23b5d37bfee3e65c24128990a89507cb6844008c635daff4736b0ff7e5180a2c4fcdebde3ae6febbff9674a3d62d7902e35aee88edf7b84bcabd24dd38a3751284cd0ce5c775df0e65ceb8926ef45dd0ce5d0a95edd41c2e18a433feea6ded765a48e7166c7e1db5f557cf9be5f65a36d28259db31b617d21daf97f1a7300c79c532cedfad9cdafa0edb5bfff929c6904a1babe7b0ec69d652577fa1ed77fa0dbbf8e3df319491d61fa17702ebd55a2d75bfdc420ea14761f6539bebe472770df3b66e4dfdbd527baa73cfb06bf39ed4de1d7396dff613f6f1d7f7574ca9e59ace6ec226d4bc56db3995134fcbb3607d7348fd9cddee01603df6f9ab8d755acfa5dd258cc24ba58db7d3cf7f949b84616ba58419c28a7bde5b0361b3c7e8eb867163182bd51feb9dc2c9a39c9be6fea5f6d89679cf5ea9b41e7f1a75c7e695b8cf8eb397fa4ea83946bf9cbdc2c97ffd52febcb16c739cb5ffa9fdc490678d55c939acd2ca0c2bf43bff605eceb8b7a7d3fabb23cd23ac76be6fdd98e3cfb3d6b809aceaaba3ed7aceda6dd498094c53cfe7f73e66ece3fc7709acc28cb5ac95c7cf3bde5709ccfb9a77f6d45f0927b7170b4625d5126fff7f9ebf779b04b66584d0461e31125896b5f67c6b9dff7e7a05fbb052c861e5f9f22ea5b5825d3d6bce9757fdb9beb60af6a5bc57ef29a9bcf6471fcceb5efdd635726b7985b507bbb1d67ea5a47e7a7d37a582d9fa67fe5f4b2ba3e55f0098e479c26fe3d514c7dca760ba7229eb85fb6f29f39e52b05939a537f7c8a1f7b27b1eacd77c61dc5ecb9c25de51b06e25b67fe39baf8fdf42c128f55cde09f7f730fa23b049e7bc795a0bf7ad164e23b0df7f9dffe3dd7196f0ef60b3ce0beb855f5a58777f82796931dd934e4ce1bc5a3ac17ac61fef1f67e4d56edf04eb9677ab35ed98e35a31ec463929855676282f132c5a1be58d5ddf9eaddc3a988c394bb86d87b4daa89760b8deddb3cc3defbf35cec13aa67a564a798451c61b8bc02c84345f29739416774e0456e3e7bd76cb238eb16b2598f65cc2bf23eebd7779936031c77ef9de507eefb545827d6bfb8438dfde218f12926eccbc69c4bd96518e7534c29107cba8c9114cdf9db9bc796e9a25dff07f2d43c1c1f6f5324b7b6f94d1fa3a3356a7cef842ba61aed0e64fba7134a3b5917b2d3b18dbd5d2ee2bf7b0e71d7f26dd3892d176a73fed3d69da08681b8d682c7671dcba6fbb6fdd5cdb4cbab1db701115fb15d2dba1e7d9ff093727dd38ba986216c76c2fad7be28f3bfca41b71bc13cbfcd7e8e3fd314a3d6f26ddb845db80a2945894155efc2bad9e573e2de9c6ade322267daf7de3bce78d17fa49bab13bfd5c056294c7ba29e734e77af5fda41b7ba6475a8ff2266104b3b46ee8f9bf3bc32d6925dd48e252a8d1a6fd91cdb1d1b1f1b1f18162c3bd952d9a4a8eb7f26019411161b6f238bfb494cecb73ada41b374de223e8bbd2764524ea4e5f24f29bc6af74a9d308561e2ca32b45b0acf7bed2ffbe23943073d2c5299b26546c6c7ca0d88cb2d2955b879a7ed338e5c1324a7283f1fb33d638723da7bdff926edc7c3604467d8e74f62e65f570634bba91ebde73a3ce03d568e3e384d33650a66c3cdf525a0f15916874d27aa63791b6f1816233a29907cba8aa42881197da46231c888c6c95420cd974174410370400072084b0c101003cfc70830f3a5c437af881871c76d041071e72d8b44ee3f0c30dbf4bd910479e34d2a1066a77a0818bb6a5e361065ba50c58c691f459b4698f80b21289d3a42b062efad4030c71a49946405909084833dd10ba6a7e78614217b8205a909da609e9da6f4382dc00e93c50103f2227048d843323223241c44800c0c411102ff2a4f191df46a398c55689e29ebbd6902a8e8246a351c7c503e0e140470d6758a0f2279dc1d470461d4282bc37f2d023c78d9d274e9a604c7496e4149104c9119c8cafad74ca088d888adc0c21049121410400081b00f8605d560f3cbcf7deb3e185a830bd101579bc5411e4bd81831be4bc2400cd1183f75ed50024f4f71e50d6696e64d2dc26e2e478efd1c4e00837e8e2084e2c185871bc3182e38df736cd0836d8848aa00021d404218ff72e9c50102e1daeef488a6ddc9a6989e582d00f98c8400b2c16b0e1032c5e480f217041598e3c71243cd095b2d25f81a974c564cae959582ae85e8ac994f39ea506f79e954696faef5968f452181dcf79cf3ac39b760988a7fbacf47ddf420b6ac6c365d818a4b70aa4e03d3983f4b6e570ef59639c40a2f4e6d3f39e65020b84f1ac0a94e07151c8c111a49513e732ad643ba6bf7559159329d5c4b475a7f17493f6c43f51ea61f29e35826ed350da96553995b449c76b3e9cf74d341e4ca3004a6f3efea479b86026ed99683c59b80645e3e93eabe24d5b6b3c5d8ce7359e2c5c773d1cf69e25822c42f09e0582f79e55810fe89c38123eabd2fd7b96181605ac304ca614cf7b9607deb3c0b03aa0fd6c87fbe23dcb0bac7b1fed73c0caa28b142a0b1e3f782c11c2e3ca7b72f69d12b5d606827c96f72c0d4019e48fd84277babf676520c81f6172d24d25928e85816ed3a8f7ac0bf4d296324d79cfb280496fcde4c4f3926685dbfc3ef9285b938ed31e4a973325d3241fbf6951fa4e498bcd6729655a94f7ac2c3093e6a58cc4bd8f892b017928265de2a59e32c273992f95b2d2a9e7046d294efbcd6700414bdeb32af0b26c5a93a025faa4b9d4113df31de7af50d1b8c6b52bef591498c07ba714e6378dc4699daca4f1aeb484f39b7f129190484c24281215098bc44502238183c3c9a90507476ae1de8a12ed673b48b8b7b26959e9e44f3ad39dee4a4a2312a7499bdf7d070767f3a81477d232df4f5ac6715c3795ae2841c2bd951250966a92a57edfe13b4cd888bb4d4f09eada926ed3a8be13d4b5254a94c88944ce2a1d97693ad70d4e21c132a6702ac867a136d54b72a6ea88c29267802a5a7807a8c3e6554aa89650e5a052a352011d0480c9c102e8a8792f4cc0fa9e5dd7b86bdf03fb50d66db79758dada695f0216f19fb7c24a6db5d9d2ae04ac6a4fe5beb942afa39f3d0998b57c726ca5d433e2ea3912b0ede3bf1d77ff6ddebcf3236011c25c638e92637b67e746c06eec7adfeb39ee3572cd8b8071c863ee9347ce8980cd9923f4d0634fb9e7970f01d3bf43dbbbd49147092d1702f631fd1fc29e31ae3b531e04ac620d69bfda7b08399f1c0818c5be46fa379439c73df90f30986f879efece65df78721f60b97a1ebff637facfe7e47a6090e6dd69cdb76b1a7fe43dc07ac45c4e5cb1b5136ac87980ed0f618411cef961b790ef00e39067ec29affc4719fdce03db985fec25a5df62e8f9d601c66facd352087df531ee9d038cdf6daba5d3f359ebc61b0718fef67b0fbddcbe4a8af70db0cfa7b6bb524979bdf56e1b605a7eae39879a4748b7dd35c0b6d5b15e593ddd78605c4bcab7e41e4b4937dd77609b53f977845ef70c2bdd34c0a895d9c65af7873beab96780ddabbd955e5b3b39a773cb00c33e46def1e5d4ef3fe7b603ab3366eff997905f29e7ae03a31b469bf3af927218e7a603eb9bd65cebb5375acabd9e0383f4622ce7cc56d799bd9603b31efbf8b79edd6b38bd8e01966bfc1c5accef8df66f0d034ceb3d3dfd38ce8c7fbf3a0eec5b4877bf927a8f65bf1a0e8c773aa1c77ddf5927bdfa0d8cde596dc450e2af7bb4da0d0c7b6d7be6d4f79d75a4ba0dacd2dde5e57ae28cef9dfa0518e4b24f8bfdbc5cf339b50b309dedd41b5f8bf39737ea16601d4f29ad9d395629b9cf2cc0a4be71cb4ef18fb9629fd9c03a8e9f62cae5d613ee9dd7c066ce9e5fa8b5ae95ce9d57805129299656460e7dbc3aab0083f3768af9a59beeff715603bb5ce329a9ecfd5aa9714e038b9556eff7bffcef9c6f46039bb76f2a33b63d426a6f3e03db9ecb8fbbdfb656bf6b36038bb74f4eede7b2efd9672e03cb7c4fcdf5f5b1777a674e01866d8c5be27eb3f697c78c028ce27b3b97df6b4867ff980c2c7f3fe18d7d671af7fe780cccc6fe3dbfb4fa6fe7f4f80458843ace9eabe726c0649511fb8871cef9668e4b80d15fe9ff79c258e5bd1c93008b927aafefadd1e2fe371e01766387706ada37c6166f2c02ac7f5fb1bf1f421c6fbd3804d89df76b0979a471ca5e3108309eab9f3bf6b9bff696e20f60d55bde318c3a770b73c462609a6bbde58e98624e39c46160b7471de9dd7f5f5e21c41ec0b0967f522f27f45aff0e06d667e67c471c21c6dff70e605fdb7ea1e55d5e5e3fff029bd75e1f3dafddf2bdb917d8a69d6edb75cdf2fbca3980c19a6b86f5f37dbbc078e4785f7835b479cf7db9c07ead59cffbbdc5f3c37d3780698c6ba73573d8e1acf96a00c3374ea9e5c574771ef3dd028bbddeec79f41be2bcf1cd000679a7d55bbdb5c773de8b014ccf693fd497565c35b5f70218b67f67cebdee93f24faf0530f9b3bd30fbcee1e49e5e2dbeae384738f3ce02eb126f1aaf87b357396705b06ae5e41f5f7d3be7555200c33dd2b865cf13fe8c278071f8f5aef143fd2f95510298acdcf64a27b5f2620b6f0430df73f5b54f1a67fcf94300cb5d721c2bccdc6bfcb1c074ac376a5bf9d7d5fb076013e719f1a7b6578c6f7700c6bbf539f76ba18498ee2b30cc6d96725fcee3a7d30a6cce9aabc4f3df8eb3d40dc0a69c93663df7adb86e0660d0d26c71a573dba9e55d0016f5c55f632d2f9653d72ab03ee9ac73c3a871a75f01d896154bce7fed5a634d1380f9adadbe5366f8fde408c03ae4bfd7bd6bd7dd6e2a30aa2fad934a3de7cf704e81e51fb1a57df23e6bcf520aec5a2833ce3deefa1205a6f1963e7a69b3fe3ffffad205bb1e5f9e739ef94f187ded03a3d1d60f2ba5f3ff0f7dcd02866da43a4e6d23e575f68a050c5208bd84365f2f6be7f50a98ecd243583f8f5746cdab15308af3dff4ea4921f755d72a60b0df5baba4d4dae9efad54c0b4ae17ea7bb5add5ca5ba780c53bf9bffa775ba5804d0e27fe1ce28c23ecb4f281c50cf5de33c3e8e5beb44601ab57631fb9bd18db7a678502163da7f5778d63ced5cbfa04accb683bc7bad66eb796d509d8a63ffed8e7fc9e56db9b807578379e55f79c75a79c0998de7e73182fff3277c8f7c068ddf04a8a6da5df52bd04ec7e0ea39d14e6b8bdce4ac076f6f3ebaebbd776db4c9380f5993b8579572a6fdf972201f336d7bb63bed4e27a2f3d02d665bcb55b9a75deb2526a04ecf6f9f78f73def86f9db40898adfe76e8ffcc90470c2911b0d861e674d7af79a717d221603ff68d7ba5f673edfd17022637ac7a5779799574fb2060ffcbbd73be9def9d71070296f7deb2630b6da532f31f609a6a9e3b8f7a7e7cf5f601f6e3d73fe798e9cd926e3db06cfde799f32a718d52f700fbfaff3a29c6f466ea330fb069f18d5d7fcfa58f36ef00c3d5ca8efbded3de1d711ed8ad90d638efc553eb78758049da29b57ae2a9618c76e600bbfce60829ecb9cf8bebc4013635f45d430b21b772cf7903ac5f3e23ce70e248a59dd30698ef3ac66da9def7d62f670db0a867ce3dff6c2b9c5d4e3cb099318f7f7338fda53fce3bb01bb3c5bfe6fd250db02dfdf7dce70e339cd0cb19607bc7ede3d7bfc6f96d9732c0fc8519fbd93d87f5d32eedc062c5d1523ca3e6905a2eebc0fcc4395b6c3dc73ce32de9c0f0affa4e8973fe5fda2be7c072a5f8f3bcb91cd8b430fea93da459e36b638049d93dee385fba33ee30c0a0b7f26e7cb5b61fe71a07d6eff5bc72acfbfe394e38b09c3b8ef5ee5f27d65cbe81f9cc63febd663d3bfe6e60d65738e3fe13ee086d1b18f63ee3cea1de926f185f8045ed779c556fbe73f450ba0093766abdfded5cc3af7f0bb0afbff6b6cbdcb7e7beb3008b16ef0c398f16c659391b98cd766e8e69df31ebabd7c028a67fc399fdf57756bc02ecce08398739e74a3d5501d6a3c73b6fb82bb77b5e3530fa6d8456faa9abbd3a0d0ceefb3f9ed472fa371a58ec397fea31b630c27906d6f5a47b57c8adc7175633307b67cff5f3d9b1dc909681e5df3bd474c27fbf9d29c030ec50d6496dd731428902ecd33d7bf4fdf28bb7250393374a89aba7d8cf1b631c03cb114a5bb38eb6675a4f80699da38d78cabced8ede04d89c9cd37effa7945bd84b80dddce5afbaf70e6f979b04d8cc72de3cab8e534fad47804908e5f5b4ef187ff55904d89f18e38da98d7a628f4380412e61cc90724e71b620c0fed673cb69e5ec5bd7fa014cfec927fd9eea4fb1a66260f17eef7d9473ff2e7d1858c676df5e7bfff3723e3d8079ad2bdddbf27d37ec606074d69a79e592e7c9a3ec0096f1fc7452daa9e63c4648ba514b132b3732b1bec066b61e660929af7f777dad952526eebb4884e2b064c3f202cbdcf65f3396d27200a3d1dbcc27f4964a1867ed02cbd9739fa1e57be30dbbe502eb9b53fdefdd7cdbaaf5df000661ff36fb6e7bf739ceab01ac73cbff9cd5dfeb31cf520c6b0b2cd2ecedbff5570ee7863f0358c4d2664ea59d3ac6587dd6808501acee2bb99df5ca48a1a43604d60530ae21debce61f21b6806501ccc62b27dc51d79a31c5947423be98a50526a98e9dcfad31b4585adead2c30df318f93fabeb785d56ed28d38f360191dc0aa00366dd5534398ade634661a23605100b39bdee8e1b5bcc34fb19d0016b5cc96d31cefff506b0960f65afdebd736c72df7a511c0b09ddfe68f27bfb0d63e2180518bf3cd77fb383fae3a6281cd8bfdd71967dd29a5fea4336ae3e364c204580fc036ed35e65aa5cc53fa8d25062c0760ddea5fefd59fcfdffbbd364ac0ba82da68edaf7b667dadafd464ca816505f6e7b59073ee37d739fea0adab15b01a80496f7bbdfd43bcabcebf936e3c69dba7363e4e4edad64424929207cbc892c262c0e497f7af79bed7578f171025dddf5e2ff584be8eb08cc3aa02fbb66bdbffd7fc634db55600d63fa692fe6ff5cc515348ba1146085809c07efd37d3bc398eb84aa97746de090f9611170b01588fdce3afb5f550e32ae9161615989430feae6ff477c29fabe7a24e4724d2b1d1b109daac441189aa64a92722d1e6bbf6242e471a79b08c8294614d81d97b75e5f3e779a1cc9d86614911454f585104595db04871c55debab7fbcdc62ba75a83e2ca617ced96b977266d28d7e4b719a898b4426931ef5aebb92de7c44a21ca775852a0b9763b9a5c6d4735f611789301cb70e5539a1c2c284b94ffca3ce1d661efb1538d4706beca9b5187eb9ad00739cba5f7dfbcddaf22af45935b791767a3dff74926eb4e93765732a913891169b7d53369e671aa49e6752b226960a13efc8f3af32fafd35ee5251b226954a35050ae5c416ce4ca9ad12c29863cc97728cb1ae74cb4ab525dd6832694eb326127328ed884a0a18c533d3faa3e5d577d9291f5885d95b6b75fd7c67fb2b8c51c078b75bdecde3adfed7b9f3285e0905ec7aceebae14c7a8afcdfc09989459cf5ebfefdffb38af13b0bfbda71d579a37a674da26dc9f71ec7753b99980d1fc67df7c53afbb9cb2ee81ed1d6d87d8eb2e65ec7f0958cd3bee9fe5de996e8e9580f5592fe79d774cabb7976adcc8036dfe046335522501fb38fe9de1ff3473dee114894e5ff7882212b0da29c53e634f6d8c7ed723601077defddc1e5f2f35c7bb6432e99f95e04d6504ecc37a7dbe92dfc97385927463973a8d68154555044cd2cef5cd75f711a761e47270012a226030ebfa79e659ffbf698543c074b59a675ffbb5bbe693bf5b2a216014579eeb9c31f32d61a741c072d41bf6a8718d3e623d49574b0504ece6eb3bd5f64ec92fec3415e50758957b638871b5907e3b3fe946ec030ce6ffaddd9ef6be6bc59c7463e781a68f8d8ecd93254c489c7e42e234e9898d8ecd1226560f4c732bebef1ffa486794506f9848a4373f310f961157f500f339f20f65bdf1da8dfbe601d6afef3077ccbddef7df1d60716b5969b554775dfdcc79609d5e3db7f75fff48ab8dd2563ac078fc92e389a5ff76e3ac7380d1dfbfedba4f3e7786d1926ed49dc9f70a2b1c60b4e78aabc59d5e382f9ca41b475a27e3d7b46d8a8c335e1e2c2323aa1b607d726efbd4ffd6fbef8e9a446d7c9cd89038fd8407cba889ca0698a75bd74c2bd7f36faf35299cf6a8d48f4ad6a11ae4300a190000a01ecd000000b312003048241a8c458301a1683cd809148002539076b63e984984c12c46511085200c02400c430020c418420c312ad5d8003bc24126f89a4c0ae59310028a1ca25b2a149264a202024f895b45b18068874a96c40ad9269502023b9459622a149b240bc8e950cc12ac50691259406107f49fe4f5ef91a22d20a443314bb442a5496201d90e952c8115ca263105143b24b3e4542836091650e91099a5ac90d224b380b2434896628568934a01891db2592a15029b9405c47428664956c8d344730c5ba12f46bb12344589f7296949ad906f523220b4439d25cab26afe74ef59a657db0faf6ec944839afc81fe3ead2db10af5264907e43ad4b3045d286bead0f7b29e655a5aece979ab7e934ac687563a35d58e7e75a6cda15eeba549bd5b55a79e39ebd7aa34f1764bd7c832d97b4feab45328a79569866d075d283c8923a0fa90b0258f42f524c481facfd7ef64039260924640ed43604b1c65d5fe84dff348afde0fb85a83105b5118228d4f6e4be1421853d5ec11fb6bbca74ecf78bf467d6873e1f738d2abf713aee641a856040c51e313db52b8901c13a2e73a6250903a26b9030a1fc2b05417223c6963368ce4134c0a8c71bc59a727bc9f476db541e0371bc9d86885d3d3d8cf5d5fd81cc66b759ac4bb35ea50cdab719a8dfdd0b5854d72bc56271446c923cd7a3fe0fa1ae6d8ef85d3d3d8cd5d67d81cc66b759ac4bb35ea946d3a856235cd6c9c572d897d3e8d7beda1ea0ab6f753621494d493f1cebbc27004ac22ee301b5ef45f1d0aa8aa6313f2cce12cb95a6bc708da1d27eb413024b07479692f7161c47433c7bf2016e48a1b04637a3f0ccc1a7971ee6c21345e1c7505ba4c67be0babc22197af62f78d19904b5956e08d764832231f1874f13a03371e6a300057c3fc775d35eac5b6a5e5329005e84c02d9ec2c0959e44ae5bc5316d11ca6061a29089e8392ea0c3a0a532a88cac691a2324f684c6b776964b704616a08dcfeca3a97a417c53487e9e0e3688aa2ed66013db9e291812012da846ee35531c9969ea9dc47252b4b6d98269c44a0ff315927c242d1092d707b2e3d87e6425fdd4322cc2393cad59009fdcbe52104264a6014915f2bf147c5e531613d16f4c58970ef9d0e1ce2a77e47ec7c1654a8d58f0ae633e0da2c604dacc1471c4ba21affdb5996532887d6de7b2066249899d5d72ed5c672e2bcbeaa7d5610a334e195b30e9d3d45c862dbab6167b6533a4169bdf9818e9e7e8a8758b13f9ced590c69ed775b09c0a06db9bfa36b56f4a8299e3879f8c65d83850ee3ccc180043f6b7640c47a5b6289644a64b3d62ea344e251e9c8e7ed432fec9b24776a76925a03a743b1a14719a24e1af1bddf26b33804594abd4578806483ec3385479037b821319230af2f0fcbf94b3598c3692f3efb53b3918d8325de986dbea7c9eb6213c86a14862b3b8ca1963fc1716fd5eb6283fc6588b26308612e1c8c268b5a6c924d3f421b0b375ac35ac59441e661b3ae26824d53d8d3bce6eb7a3f33654d1812d117d6c85a76a37f8ce33a4aa7fd66d74697d91e43b8c955305f937c10dc251b701cb6a0fdc7e28d87163b7db733785a641f52cfe3494db8889016f6aca15e8c9093a310d2b01cf4715ea8e92526d0f834533e6e5c4c50fbbd7fbee02fd02533ebcd3d5aa258ec9afc7332d278948235a41ea8d146423b062b153dd63f1518bfa12d16a6be13f3aaf8d5c1dfdc3033e088147323035f0d3903b6a0bb8650b5746df066184ff01eb87ff8a6dedf857914691caba6351b9d211d7adece1411532be99c6988cf1b73f23654adae67ecf9e8b7e891e9511994901de86fb649fb1a534ca3ebaeae06a7726be8b8188fdeb04ce0f2323d53d5810e849d519fd703dfa8d6712945341118c7463f266c9ec8b0a16e21c2808fbfd9d4a0035408763a88b83453282b3eec46a6447d0d718f4fa3470c174972bfe6c2e87156d88265d92385b46b03e6c7cea98e2509485fa959b428708b2d9f17ff82d78170c5b7d82bb85575109d47ff7b03710d0f6f1691216fd8ab0f574130df2c1be0af5c52ade6ddc2fc0e993334003184549cc1e2458a38e148aa4a752277797a74a965e92ce1d0520c2f196959f56c8a8a01c86a9163d62c0442526f71a20f0cc26fc1af8b15cf3ce45d230791c7581e11a5746fe559f19bfed35b5a77fc593e362749f74650ce112b07d02bfbd9c501f740e9d7caf868feb52f4488d14165790e68b342a06beb0648dce6ab5758a1cf02bd5b60132f012ff9b6e6ea36b8c6b685d90a7f738a37434f6e03dd2a02d927c524c270f4964cd3b85478b52df63942672fdb73c706b568353b65fbc347ec466736691997576cdef35870705182fd3794816fc859177faae033a74081859ce114fa0b7659355b29a532700e4e5e128fcb45756e6ff2d2cc43db9fe4cbb921edbf2844aa0e404d379f7f869fc2f6d6d83981f1dbffc0f3818334a026ddb732a39d72025bf3907b71b87cf132da70621fd839492f9d296267a79c137c92fcb6c529c2ca24adea3ac8614c4592db69ee518e579c3612ef99ea89cdffa6e311e40e9b29d95632e9cc2ca3957fd47e956ae60906604d1f9d087ac408f42a497a4484e82991946904c855b685747002f1223682b2101826836f160ef00a1f0ed4b0f7a835b1db3869250f8647d1fc202d32be11b2d1d8224164337edbcd27a8b43ef63c0015bacfcb2dc275aca7c025b22021e7509cb13ef1c43352c73c562370b4f78bc42f8bc9b866485bf115da959b769e5c85008a13f5fb9d4675ef71821b945e4700196285036e21efccc259fe1684d163a4d03b49bcd0f495dd1db16667c46c18257eb93fde3cf6407093d467f26bbf58b71a7c4cdfa13a1e6d7a739dbfc7e141696433a8f2245017ed48112d8d2b86aca96656b73a3474cfc2e3883fb8c0472f7002c2ca73d1acc905a08cdd0577e83d199d9e8747148a267c4adcbbc4ad273b26702ed500cda1eda32100e7c14b557bac4a242ab81946458e3599575016b6ee69dd0343b45a4ad0439b1380e9572c2de92f40f900e46923df85193b3300065a0e9e410fe632d65b2b728e8bf62dee5b99e208589366e8cd2b6025557c7cc0a61dcff7164b1cdf13eb4197ed2a509086c5795f515e57d4ff1a9434dea5a2f1034c21d7809789a0195e36154aa3d43477d0f4121de0c2f5b2b4f890a75cd559b0b64765f29204a9185e0f081093a16a84b648524e122d3574fece9f3bd50bc424063de6407c1cb2809185d171ae12d948914b4823ad677c101b419a91a96050620819e717504316a2f2106a0844ea8141fe0cbea40487b3523549beb322c11b36215690da033a8c13b25cbe7d5d836b50a34d59ffb200f82640f978972df9da5034834817fa3aa450b34e85f6257ba0e0a79b7750f68bc1a301f83b2c4492e405ec64568ec302a33c1cecfb5169983623686299fde4385245a11809801029eb39a4a490a56db26e88d356ba97f88f525de2676e7b6e1bfb7ba07c4b2fb3645dfda5e24c3af9080df95e98044baaadc89080523f7acb5bebd73579606f6e7db349c0adb41cb0593152282422815be214ec51c801fe57225c6b5b278551ea3f846964bb4bc9d452b20b0fdf4368b89454a2198538a49ba5a23541a6301ed2113536b7242f60ed1844c1433b2db55a53518884197e75e0fb30dc6a87eddf6cbdb67b93a14f3acf84c638512c6b265f6fcb75d000ca654805a7c987c5120e38e367cc05d07fb0d91d9db24f06306556d56ef621d03ccba938ff1f23ab28c15deab90e2efe25272af2886f71f635ebc83e51ad552b0d798994b3a9c8bc7ec4f06b58dc18b9f5afba2ad6b4100ab7f7830e0599b587b1fcc919ea33b85607860803733eabc3e72bab40d9e84f31c80210cebef9931624ebe29a1e669db5c95686a2b0694c072f3d2292b17010079001805f6e6a88f5ef30463f34acbda4df9df9f411c31a882ab3a45bf6e76e7cf2984507b31d2848d8f082acc0d94558da748ce68ac181646f50aa0d728292c70d0861d55ae27ef519e5c477216f85ccd232993cc395b7dbde81577c4c5264c411c499b7070cf63728886dc85466aec5e5f7c625ff9797b09dc975bbd283eef22726cf7c85ecc5d0dde765329b2bb28458c52a92ae3c58c1ad6c0dbd43b24e1459ef1c6eb66a2b1af3cf225344d95072485124a2dd0e8980d4439830e08843c4831a5bc7a5ffc9dbe702e776c90ac059d5cda0d086f309e469780f0311ba556a396343b112b944ca3910def1eb2d9097fefaf6eb671b2bf82f65e965caae7794fb204baf9fbf92d4f8dfa8d74534ad3da524913dae09e8828d2e671888754a9c7616e44f5cc0fcebcc30729ea9fda53e0045775d6ffbb299ecaf3cd4f35d0bbc6e2e0217568872d9f9bd22c8df0840742eede1e912cabdb9c95258a781c64635789a726a4a5e488b7e946a632b3887c230d1382fa15436bb02c0717e944c8e4ff6bf5b70479b444ae819252790afb839fe251b7a3f80ba8dde2f93a85f6fc62f0a6304bed0f9d161f5477724f0abb320e11acb4d68f8a43e78e79d80db1a52b1d8345a60a56392d9d6d872bb4fa34d21eb7d5b5a53ad743bdd476d3218dbb79e356431b6695d6092c7dcac75c520a7d502e31d4b5a532be69b960c0ced58672382edd053c8e7d5bab9ca27de8be96f2ceb7a26a55f747deb59076db27a912f691a3d559a7e1bd3e2a176ecd52935df559a7a7b5a57ac88c3ab336d92f566bcb4b848ba181a050017047ed7d392526cfe3769c40eae04e0b1fd57e0430bf062473818fed82e4470e68b8cd7cf9d359bdbdcb1018b23c672281e9e645d1e1a6cbd4aba5884158ae0386f28fee5b42870b746776c2f10aded28742d8e4a4a402fd4c64af0aa030be4fbeee9957431021065f7f2483f6fbaa65c3a63415c0f0e8e8fd96914907df2acfe4b51eb26daf38e8b9a7b2a98f7efe9832c7aad986b1c9dde15735b2854af78d71430861ac881f49e6b0546d4c8dddc892af43188fb31c470ab59652e609d0ee67d142a5841791f284098bca5ce4f10e9e0d320524710e79a8fd07f4265c7505b9284f3952bf4328c222f1acd1b52ed7c4677069392304229fd1332bd01cebe40cc4b1e31189d98c9e08d757bc321b24d86188d53388e1376be7738fbc7780c93a90eced54e340f1b1ff276280ae06d48969d6b051e1ea5c03800996a4087a428e4ea8afde1cc511674a50a34a4c79553bf40115c57eaccddf04ec164868b5e1fd507899263da0b8620ffab7673da4ad792e1c2cc26b41ac6286ba4f0b9d4ecee64d25c51be7a2f8170f35ae1d9b9d3c085ac07bc6a65b3b4eca698aecb945b00b1c1d5539a6bc89453090a4b55f572cf0ca90533953102dbdc889b36b64ca7cfb745c008e19ab0d17dd4a443fc85ae9d0219c388067a76b5b1ed9bb35d48bf0cb40c8e69099cfb615559c44a7714805d47db24696d205c15cda6048b057832acea44bcaa25eac2c18f3cc56049199bdf531ef994b0f18f48d7579eb21e172d40002b171f6c5e32d6a1147dcba27cad0b80d573410b30eb789cb58c03a98b428980c37d80dfa38165ffdbb73fc7790b76de1acb87637cfc1c043e52bcf1752b2fe5424a3df2135d4136574fdbae04a4f3b60ade4fe864a2061bdf8ee85966e570f6218f456756c2b9f8958a651b40737e64cb2bf545de9eb0ee0b8ae4b44b992c83d9ede8ed75083d017115b5415fd1117a0a2ce1b610641dc3f71e774bd7e8561f5ff4d01a89a0c21d5a1a07f21fe4f04a8b190f67eca5abb047f4d1ef21a9151428a8f4d770f02923a1fff1e3871a801fca7f8e77bc47bbd6c74659cb0f07675e00af1e988c92cfd7294b5e80ae49ec6f78d67b9b613158f6cc0b75a6a16135d034ac9bc8e0cb0ede9bbc7c227f8710e940d762d5b7acc2a85c7aacb72fc90798645e066ca14cc1518f10c5fdc6768a24c931aa10688c16707c72d2e4fdafb2de632ba16dba2c2c87c293ac430e3e90fb692004abb091857e2c981f877d430c77c2430f88b371b703222b7ecd5df4043eee788a7b0e9763ab93f1200eba85459d157d757b4cbb5c207205dc19eda5747523a65ed895ed2aa29ddcdcf278d25412636730b6906c03a335dc9ab3b72d829ab8f4f5cf23fc8438d59e3fd7efd50b9b48666d8391c42f55d8cf1a24d12bd1dd4e7551298e360770510f52e08a4e87a0e19ae852e2e346d5487443e4b78ce0bc352a3088c1b522de776befbe9a791a32dc7f18459da9920bd6f19385de9482d134919f921f2f244f8302b38ad0a1834240bdac220fdbd80a22139b5866a78a6d4abbf3b68b52b09dfc982131d4f6e555d6f4066a431eba37dceb42e83a11e77c20b188ef278ab71647c0cda04d090431b029670b64a3b8266846fb307051d4835942b5b1c5e22000d91e679a3b39a1d7cd2017a346e3bb481788e1df262ae5d1435eee24b77a9a3bb443892deb68f67fa5b4db836b69d3f398f4e3715e8233657138e3e51c489f22628bfc7304d1062aaca27bf37a9affb38bc4dfd23106f7b4305c7663740c9171c539c9b1af60d074a52879a09d087c480e601346570024cc056ea9838572e7855841fd512d13cbd0784d47e630f0688e798affd20c5ba2be52df7c3ab5f629406a147f48520c3547889c390ba077cfb76657ae4a2dd453af77ef470d3ecfa6a20b8cf3c3830d16cd7c051400d138a83c3ced17b146acbe097bb506fb14b6a5eec4b2d9c5fb8bc369f29e8bdc1c13a51c30f38d517b1fae439a974599bc706dccbfdcabdf63433b10a8129b8c942fba380ace6506259433bd577b6cbc3fca2fe649c9629e3b0704ecd89a7b91e8eb298b881995b387a270578626eb48f825e5171c2a12ff483acf737ff80b1725abded5e8b72e507624e00ca7281f1ed3abb2960c46d627b5f3dafe3fb75253817aa5235a989537a119d031075d3b02245566df7b56d001dc6202232a37469a9754bb7fb2c1dc4ade05f346232d7738f02fec538b295017d6c273ab45e9c7124360633bc1f9d8dc88deee2e69c94bc58b0a5a1bde487ac22ca851382dd55551dafd073e4b4ebe5fb55f33087dd4629778a58119551660a28a9f9742e1672e2cf1ba8b3f5cc303fd0bc38d2c99734c500f94664ac7ac43e7b74144ec68c9ca59592779c314721fed02e13125f6404eeea1634f5046476dfa8f02524537c682059461946bfdadd8a334f22c9bfa254ac9ed0d0eb06530fefcc9d43f7ed50f1e487fdf1459c611cf574b58cf946ecc90e5eb53ba3ffa25eb3c39b2842ec37e769817db8eebe828b17340dc346665d96fc71762ab459558b0c85d1d6970dbe43c46fc3431e8f78c7fbd56c49c0ea84b9abf68fcd788d364f725a3ba993e6c79eb87b00a6d7041f57bf85dbdc97f9c3cdb9792cd6839d71e8c4f3017bcd16efa8d9454e62298f29845d0e7e6887c2dc9ce1c0a63d190b79a8fd64a1f973ce9bedf81530729187382a92f378c3ba1781a7125315bf81e901efb6e36a9751d1bdc287cdf4b80b9d7394b3b1e1e51f8153f0f9ab5e756d5c7e087df7bcbd2a5e08195d32e4f265e4c0ffc4e9309cc5e29d3fdb5592bdc92c2932737097e89b53b55c4b4c329f4ff67dd1f1d643bbef1ca4bedb775727ea9e6cc19471f51b9f963422e425c1fd0cf3125885c797e502e62c397d6e027f783718cf51736e234ad3ec8f508504eed2c734d8c0e4113de47327322dcb0356640dfb617dc25ca421d5eaefc26496e1eb6d9499aed079349529755f1adda69832a17af8b1f0ca656cbd08e8900c2b099cf11a64123cc7f310041f52f7e92b5be42a01e016877eaa4e92dd9ad79b0ca1e9eafc9773a94520b9cf6b73025cd928c311476dfde0ff97cf08bf56c69f54cd8b726c1f40963d694650d6a4fd02ce9896bcee3541af2954444ae081bfe4645b3d762a82876c810281603428ab186ba0719cbb4af6f63dadeb3dafe660473d040296441931558a3a0e3fa68eceaacfc9f5a2ad077f19f09ba9e6a81bc3159b99ba225f53863e89f15a5ba350145f3727066b2102eda00fc9a3c8d8f212dc5ef3ff7c8a42399483c8f7fd9772cefc9d9f2f8675361aa7fe3be64359de33f79fca9960a22a56ed66728e833b6bb2136d35a91ad679c0e2b0b06f01e5b193b9ba39889fc019930e50847ef17fc8e872d7eb3b3a11d61a910a02709f6000843c0b0277fbdefec4a741e6acfc9d7dc9b46b07837dbf1938fc5cbad981a79e8fc6d6dda3e85aeda6e64cfbe3d4a43abfb539edfb429a7f9ee9829010a759e44b74b20d10cb31b05f4774387ffa952af513c4681cc28adf0d203fe888782313e341700711fd0996f61a1eaf7baa219c2ccd77eb7ae67c6bcd215a9ab997a532ed64ab82c84cfbed806ca1c685bdf6e509dad7271b2e51980f95c498011226ef4c6eb79cba2567b76f131a713b7ce56c8e40489f33e14613e85ba2b4b224ed0d0afa82b1aa653d479371768ed871c5b30802cae6e2b893f34b1b79dfdf0dbffd4ddcc7ded0c23182f4e12a3bbfbd5c2fcc68da5dbf416a0a9bbffe0b40633b12ab12c533311bb70a1aa99e8c4a2fc703fe7a38dede21d617766cd9d2ee92140395581d13daaec4534a61963e2ca9f74afd14940220bead20fbb45cbf35b6d285943f6d3d137d76358683be3cce76a4a76e98e059e5519fe52783396123616abbfe53a32978d21ae433c7e8c01d0974d5504730f60b503d7ab589470a7b1ee2fef142c3364b102f3a76a4f3b3de6c621286ef2566b7a44bec89a40f85463560d95141a86252833e8a4bb4a2abda109c07bc72fddfdd213563f4bd4a7cf881b2e4a2cb5c36f6041458c35c20cfbb502ec9733a17f003fce2bd461da07ea10f7097d8578837c219dc60e60074947c85f802be01dd335ea827692ba047d037025a6a644b7bdf1a09b100ec8f266e0e6b932daf65a582ddda69c572636839ba163d382d7d06a64fb65b1b2bc993a5b4dd8066d438e270b2fc395d1b6d7c26ae936e5bc32b119dc0c1d9b16bc865623db2f8b95e5cdd4d96ac236681b723c611d6f978c6b09895be36d12694391ad6e6ce95dfbb5c6ac6ab0a8d56d329ba8e42b1334823380109b2a780d4a098afd655155c9a6543294899ac199208d4116ba0ca784c4cebab0aa6c23a5390a84ada06d906225085e855643b265455c59b6956256150266b06668b148052cc32acc2467c9b4884528454f5f67dce6960cb545520617f757f6948ee536fc5c6552d9adca3fa0ff0c662ee9951bf7f226760587f1b9ae9bf4ae307f1143cf75766def210010a9f0d6a33db386d677b0f0a7e0da4342d13da6a8c6c8a503a40537791ff51459ba299819c6625c3dbde7b9c83c2ec1d80fe1da41305f07a5083e59389a43048852f4bc371a6d84c53074a333e4b2ca5184d5c6d58735e645c0195d605700012882e360e52b433e369529a657cf071a85c87095b3c1e0769eff6bb43cb87488d171a800da0db6c72e36093069a149b68f5b4f8627bce56798e785a94e6f06dde554cf489dd7d3a60a1beb783c1f2047a3e30771a821145428c10d317ce9abb96d855a41babba66df1ca598a6f721735145a8664da061eabfb7a548c1b19b6f39b99137d9f247df9674389814c0a68faa506ce5d8864341ea33ea6d80cdd1172144bb9b93e5d0e87cb177b9aa408a63fee4608a5cff3b9788deb4141488ce2547b3e932086f266682b8ce7e9036026ae372dedb1d30787a4a0892aee1eea9abc763157b0637872e8219bd3d525c3d09938e3bbe70d193b3402e2f73e29dd12c47bda7c5f5de5786fd3adfe9a932d6884385133de1e9f6869f50faa22bf107641a2cdc1062966483682ef0fcb40c06eaaf27508d204c2089205ca7592d48b4028e818a2fda219b0d48a36728798ee09629226f6a987ac07e9edc83870ef7e30e6f7913f77cb80bb56438bce624e9fbd545cce9cbaaa0bba46c2a5accb9facf174b84fa26bce0f3e34b9374c144096535348ce02877004832b3e96548919685e3658023e3134c4caeba337dc98e55e84976581328e29fa574778c46d126497b0620d7212d1730886f1b65ed42e5a81e4280629484a24a1a8f3a04ece4e7fa12aa97dc5b14f27dea526600cbacd78f0331d46a2e6a0ec63402328bd10454a6294b85d96a8accf85a596706247348760e17ebc305358171a1510552dd571c6453e8f76f1269cf86d5c95a0bbfc51766a691761f2345890651729ae091a45d85c7b7d47b32fc2c749cdad4be1147727198a3ba75c045990cac2b5e079b995d19c2b187b588c5e3e3138033ddf8ff2ea3ec2e91f1f2c90db5e9db3dc2cab917662ac68dbc52d75761a138688f7d748b43aeca1ecf3055e3ca9d2abc64c7d16831a291ed6a6fe68e0315655c4fc13f243e7dcf07c63bfc00db4b9fde19d12720838d59fb4b94582b716e40771be4ee49957be5ec7e2363d6d618061c0df03ae0b45ffa37e9a891404eab72cdb02b562fa248baf56d998de8ded9b13e01da86826670026dc2a8c6ff47f6af707d60b2a8d3abc3cf797bfde9c3a4f8533e58bbef9069c60d3fb6fab97d20d85fbe78a43791e3c47d02ce35e85cb1c8e71e7492f66f62f954e2e987a7a1d1aa81815c77d3c272690e576dbddfc706f46a0c99403787f73bf85484ffafb0939b413cbc745d34968546620b8a76c083975151224f09ce89380f298340ff9340f404c0493d872cd77e50d6a48aa5bca9dbe245e47e924ef1a404fb6046a60af3924d683a734b6190bd4d23e4d3d13f4feeee65cf584c6a58f2d1f1c01a00da571094e018d93f2cc17121d22cca3a63a6acf01df11dd459c2b1c3dd2951f54e0db8ce33a44a7648f3b9f3e2b23e7bb74e37df4e6ea03962288580d0c4e2ad317f07b5d706a69d7c6e709064933168f0caf519b244d729d433e827529e0a57c279bdfdd098b029df11e6dcdb97427e9b9cdbaac9ab80fa7fd83390783161aa13eb44b6b29411e4879861352f9affc5791707af336bd9a8e25d32eaf269e1e37133003f4cf5a099a6ca55d1adad6b896b5688e3bd38b86df2b0a961739936b0c762e82a73ed211448c0b7e9ed3cfa272a7754d9ba94831869a626b56936313cb9b0f7dd35ca3307a068ef176ac2084cbf09e574f0b6c6ac245d8770dff5feb96046f3afd070a64cd82b6a149f16da47d586619d2e6370a60923f67fcf65a0a64351ed8f435232c25bb00a967a1bcc3d598001507c2861ec623833d3cf7ed5199051933e603a86a026382d09931211d8ee82d9fe99f1e6edb8c4199517581f057161b01e5ca462057d867291a0a62f33b7e46451d970ebcbd15e354cbb7336135fa74c5d1ef91211eb45b9b2a66d844b9b6a76a8a6368a0af5d6985c07c81f7c252af58aae4c4959f5f837413fbd4e4a67a378c3d846c60c3aba302516ad0cb464a9f61ffaf4b5194f44f128f2a8d12a4f12b1d1d155496fcc629aa2a35a311d11983c590b2a47b57a1fff243af85ca8b0b0e967ce5fe7a28456f8f8a4be00b00493abb640d17c808c27fdf3af1a20238afce053595b9da6d733109b9c8076cb488f7f58521d39afe2ee50604a88318ca43dff1d5758eeb14c6ef004a4b675777d669a48b780d4ec9a657167d409d00d36e12edd6afe9810e0fdad518c4adfcbc79246828aef0ce3dc6c8c04a137555ff9ba701e3b69514c30312c14aa4bc5324927fab8041cedc71800fc59092a1655ecd8498713f6378b0638b97c3f9ffdf95d4d9e0c043b6397ce56482b3d6bdf6f048af7a978361ab566bc8ad3323b255ddd7c689bcc0a5005e94dca7406c6f5dbdcd2f7b54760f2286dc05e88a17d878d4318e49c4b253bea679c606b98389204ded649a9bd8b8719b00b9c62ab7a9a9336d34082f8024e4dbc1f0e213d51085e6f8f6a61db258de2d3c81aea5ab1478cc0e7273fc35d0ad81e7b33814531207cdf5c2aed92097008ab18ded4c54a8272502664c527b64d6522d4086009cebd8364a6587faedec011447257d6503dd382ad51bdad7376212a33707ce8e7713c1ee57995cf8909d5ff4e0d423e7f33c86f6c8478386051e8ef13cdf8944b590df81196a00eb1ddc3dcde0e71d0d571af8d679e7febe9619d73ba5270625ca57a552fdac4d86fe606e6d55ca74b0e9147f8b73d6782be036d14dfbd4a14003ac9506e4bdb8b4e10313880a54da908ce64d15c5d06ffbf3efa89a310f18a5ff6efb1d8a34c4b45a553a4b79fc098d5c93ecd7a153beeba93edeced9e566bdb2fa0951ef8763bc3f3c78c3d6dde71722d596def26f0510578006745ec247ae192ea5454c0278bdad6f2f1b170345a8cbc2a601920db6da6e87bf81eed2de96fc7d4b432ee08823425b5d525a2f531f42edb454df4c5702c3b99c13e962818002788c7d78022af70238509ee0d2a7b4f1b05937672200259f21c512d07b94090b2aac8a74d69d68ca73a81ed4ee7a7e5bbbbd44b9afa82d122f2373d38e059b0acb99fc1df2442222eb7b94eb80c18d36b63cc6b0aa33ca3a7bb4cecd2054fe486ddcd290cf15a2c567ea285850ff416348b36ffebeafa63b84a3c08779c341cc470cb8b5b8bf8929300f786b3ee839de2c690d55f1660e30d1ff576182839c6ae66e30c9097d41a471da0398ce0dde7c70f19025c0a158a9c99636b8eaaea71bc5c8e7c8988e73084b93a8e54aa82cedc3863260d54a71b27a6d95a5e9c03dcd4ccae5abb1b2b1c6417adafc7b56630fc0f2a3086efc7288706cbb04748caec40f68a045fe8c154cdb85200f20b3165047859ee333cba61dd7ecfc4189791d774c8c808f1cf7d70be91ff14f903f1f71ceaa510b7ae72afeec561c3159013732e63c09932ac37ab430668d5cb2854f4b02039a98fd08f7d2dd927df435f70e758e690462bd9a593d55e6024d031ea4611fd9894e021b482bb504ec725e71afaab65b275a6f2c65b9d151bc3f62c8c29ed42c4cd6c1abdacfb1819dc45638e721ef887018dad4fe83f274305f38201dde67a16adcbe3daf076bc1853944560eb41e060916dea784fac3a3d253b1fd29bfe43edabe9c967ee368244454b94fd7211e4b4cbb6eaeeca87b1bc9cfa3df9d3620e0525b62eb0659fd6a981a2cecc3a7a590cb1a2656f3307746ef6220763de50ef85ac5e3c444044c2a46ba6670c4260fcaaae5e8dbbfa0409989dc234bb92259c83464492b61e2c927f3ae7c569233043bba1f6e4907e2f14a2cacaffc1e118226f0111beba9e72ee2e07ae9650b67605378b8da4d5819eed7bade09ad0fd60de6f65dc641f7ff31b06fbd2c69bd808c3717eb6c258a7c1198785a9a67d6ece67b5c3a3936b95018fd4290c6e973c2edcf50ea41b0c9c87750e0737c4c62ca0c07fa163f450c3baf038ec7b27f14be00ed57a2f6d0786632be7d7e69802ea79c026ed096d3ea0f146075487fd2259befd0a902c37dc02980a59407a52a07544439cb3b75e3448cd36f78813fd1576f62a1c8a2a88b0abbed47a0bb4147a1ad20fbe7976454a22e2319a7c0becf7d73f41be4281940b95ff585800425d9bb4fd57b333be81674ca5d32317800e6cef6fd5f9c4176c46007877c7aa7b68a562ba045e5c912dc3023690cebf452d94322852738e313d3394df2695f87fbf54dabc5cef4fbe24c04885f32ceb3073042347c9bf3f40322cfe3fdf0d77ac2526cbd9c7f280242ed2d3e4ee91be17d8ebb2f207e7337426fdbc0d3aa3a9ab5a66ed7cc8de15700c2f9d1c0e4a946fc82e8a121bcb5260430e153191437918fd86818be65ae4f695f5f07dd8ea2ebcc5994bcf9fcf79ec35cfbaa3c57edc83e5926b175d6f339113ba482b8af376e94c5eef8aff7fd435f7fc29fb60e34a33ba98763c6557a5bbd98c7971f9d9eebb30134bd3f6c68bc563035329a1c75ea5fd5d8532f3d17971b132726aafa8e1232d4d99ab6162d2776fb802a927fe60268065eeac0bc15ec4a745b3148d65fb3e8170659a3f2b87bea24cdeea4e1a39e7391738501fd7d3b17f7ac878db21ef7c487f7449b4211843d91729e59935f19dbea5da7fb005dd069f8d3d37c91ff29eb91e6c16650de5eef90f9512d04fe4b2fcb5b7769dad8d569eb51a18cca351943ef2c09dac9dc6772176c98bf50603166616cc777c45c414ca63cc708afada8573fb77df95fdb929f9f9e3af75fa1f10c3792210fce1912d88e030e551f7f91f312a7ecbe596d7323d10ef18c63321938692ecadd94e837281eeb3ba328d6b4cda3bec5603cb828922f2c4e92cd1fb6b4063473af0184d97f0513e4b4252e23e69cc332f01bed3f8a888fb1e67e3069dc93b35085ba0af865175db4903d1fb99f712384f6df2ad3dc7a0b87773a30623d48783de0216ed2456730a22c3e32979e15cb91e6b1b5ea79540efefe99abd27c13e0c902e801f714cdcc2aa90c7a958080e8482b1483b0029b05598477d4ee2cc47de77548e6aacec8dd109b91a2fd7c21395b3ba09cce102b24d9bfd6ba344f593d407056787319e909e7e8a9755c36f46a51a9130550739cce318dfce8ec2ec09a786c8a3a9996c5e7c08db919c49cee7b3ceecfd09744135a70ed56a046cfee75d479e83e0898a7a1892746f0d6d12efa672e08bee6ce64d87b8ee6bf8f2c68c66e7319ab7f2b7d72bb6bd4397b8a49005d0f93e1432c00f5cd628f05e9564116b5c85ed5edd7ed4b784c87b5654775f98c63e319229e52abd41cd7f90bec9bebbb7f4268fe1ace55e7b164d5ef5f73122b41e78abd901dafc1d068f96bd073cbb14e766acf235252188708823917f7496d0957e472b58a538c7f40773feb90073c1213702d3cf2be3aa177a8f244b0aa657553c81499a77f2d92df31d0137ef8b6351527eaf0e299427b560a8d4226a9bed18f3de2c88bb6011baadb2ff7d27d1df779866e230875900536385409f2a5f271307071a27fef0a284ba1385bfdf2b8ee235aba570fc66f1b2ddc2f996335ada3557e8d04f8945c062143e40ecaa6595a02d920ad70852a49ccf801dc5db17957c46eddde2abe765a10c6f60fd0ac0d05f05ea5c1a29fd0eed613839b12f15c11e17b2f80d01cedf03e3b7a35638f190df3047c7e377135e3546ffb4dda9e6d6fd727dbdc8876d4edfaf7b6d987b5d820d1ae5cf49496b11e91f8bcc6021ee3761a94bb545e67660eef5c4a04ebc4c2c149749641058705b44cb6931fdabd4a7c29d59627a657d3406757bd586f6dc954b834640c14688d7bd7686e21176b35bd01a0eabdce3c738b67427b6ce71f5e36a5d708a16614c534c77fc9a74cba3fad3e60286bb80fcb7b0cd948f37093bc33cd025eab029ee7d2324b9c0756abb6dbb044cd66f8a9479f8f5f13ff089c2fff0f5eee0a323eabd92fe51ec9be25ec4fa2d90115e777cfd2d850578111cdf55b2f835c725dc854a084b75de0cf5566d5c5b70f60010323b08f777b74143c380adc6b20fcbf7b5a4975de8e7d8182b39ac2eea36c2dce7f41f4330d3702a6cf732806375962fa040a4f25798448f3d8a3c6bc1c3271b9312f61de102f625746a0d5ef9fae4db65c1b6a1fe0131b1c8a5d7080706a12d6f1b1a1a9d05c6e471dccb8bc49e473f7a7d5fd4fa4362a46767d3e22d1f3ff81abb91f7fde7c8cf3c78ae6ecd360b297b487681f5e400856a756f95f716e82739d629dbde29cbf3e030066344b2a5069c2b62d5ec651e0842e9fcabd93be392be30693167a14931135c663975025adce5a8d902eba161b4ea745070ea0f7739de3d262e4c47c9aa9abb66845bb40f84bff0eebe6c56a1f7380695067846f3fee5b6265b1f8a803760fc196fca7c80c097e4b206f5701e92b5a5cf4f088dd595aca0485d759de95193cb2d8e2b0174ab7496f5b5679a59268cca75437bb53f295b9a8576c3b94f43fe28453484c4ab53ef6b7b8817a7752c51b40ad0e6a924bca3640f52516d1be856de98884fb3423fc76b0e09a32a67cb5776e363b8179ff7b18b4cd9b2eeeae0fba8ffc7db3393e3abc9c3a205f400de5aee9e9244072522815fe290147f82f5920fc044cb8ba83ac6a5b70cd97497f77bfe2ad1cb21c0d592cb6e0c31b2b3efae41e9ae0ff54ea2565c6a354d2a6ffd27b440c31b10a064b2b09a4a7376973828d5ff8659cabe9865b820930c192613efa98ea44275238ff9e4d6412bd379bbb22fef3559b149de67e1e368929ba510f3759d708ef8f3e5ba890aed6a61e831b0b64d49560ea0bc56d9c523d5c2c5db6d2b0dcb409c50df0bb814d3c0467731e308834cea6c894bde75086e819e55363bb249116169d80a72014059984d2a4b4f19da8858196cbea2daf3caa112d6abb8baa2902a335609212274d4b907645a255fa51c888e87b414b2ff5d55f0762c73431d987e46dcb225080e7b64d3c0a7e54cd618a12c7e4980aa8394a0f63a7b9a440320a875cc99cfefff0a90a210fc33efc3b16fde5b5c006418e68bdbc78c9d946c18b17a70201065367a26a75352bd817d625d62a6ad7234e65706557e3967e19256f7bd0c3f81a6f3b233566130285c8dcb1a784662be71c29fcefccd520a3f81da2b78e30aebdf42cad6c9347f49db4434950ddec83f41df7255a1b48c85fa22803441f019fcfac86bb72642e3d84215292a6ee39ffcb384b58de1e06b2cac7bc2af89084370df25072d27ccabfc0c100f2a8319d32c07e384060d0b34d1c71606e9fde16a9151ec5aacc71029339448cd8e28f0778f588bfc020130c4a6c103d76b7fb227563f39609d4898a070c76ed567e9b20350441f166eeb76096d0f086b8c0c9bb30ee191edd7b7ff400d404509827fae07d7d3c79578ad6d599c725dbd8584ec8f853dcf4eb4f95f70930bfc73c6b4e746a43051c334785129b7dfe080a4b2b91afc88268498c2cfc76ba5cd32a04ef913a58316e37775de75f36454e3606857df3cf8b74f5a8662de4951fe4e04901c6354a4ff5aa364a02a7aded3f470c6e6a05f158843882a95d2317c81945b1ba1e465e0b9aab88bd210175fc9aa90e9902c5ecc27f4435ed4a24c39d1883506c06aa5d2ed71e54a95b8138067f987311f448ef10794035c59be1b7aa10fe219afc24c79094c04fae743a4a9c73ad1b0a8cbd9446ad49aa22f99431f21d586c6ca4dad5e280883bd1e4366a62b21f37e2a42d3419d53837ca684074c7ab1b83c1a47ba6e886ce3ba5d953f310fa6376e6d08579e70d24f59998fb92708b76ec3bcc3128cbbf7246ac340a06b984ed57f789582b529ac153da2d61b8470f822e58ec238a1d555a95ccfd8e5be5950858cedf188759f78c5f224b4f261b49265a581a033af366e029783cf87746df08f07c15b0cd8dc5e6973fcbcdaf7f647382cbc8a3d82d2cc9f89ff877532f44eb07659e6d6d7353e57fecb49da19699c12c489892aa4c343572cf930864ee1a37da4d7d18bdcdef573d693a5bef82bba52ea6e07f46b88227ea0ce7e5880c3bb2245a5743ebd0541ef457395fa30b53124ca08dfc455fbc0add1e261f2e781a151b20c49871d9ae8f0227e00c61123dc8f2805063c9595eda40e9d6c0ff26ad221f14bf52fc63a620c253c7ee24ef0cc3013f1342313c099fab1ce99265d71da8b8639f810f74070595fac36a1fdf72839b9f15edab30700f06dd5e9dc59cafc97283639d0cf12bb8222998b71e907b31c19ee6af314b400c07a447979f07ebf2baafd0e1d3d6c7547096d869e0fc1858664ade6f08075f60a5b91caf398da5110a38b98d402f727b082618fbc09ef4317ca122aff27f87108d821c534352d29925c7ff41228d3d44fc324be71be7a714c1b1b5432d5e203ab383fb37b5e9433561a95c098e1a44f22daf3c03faf72899a17d89ebf47d8774898ebbb3beb5cd45e33e46673e9c84a9ce95276ee93d6d8c85f147519b0424e67e8ae27a11ccd5cacf01227f98d2a54c8fa7bb71ca3ea2ba7eb0907b559a197c7755008207a17d2088ca62910152302fad599b8fe1ac45bf77e9b84ffd0f03f27fb03ee83fe618e657af7e534043a7d134c44c54d64b546ff4aa9773ad3834397761efb8a5b0cc1f736f4760be44c15343424348bebaec5b70430bcaf49e70392c0a84950c8a27f28cd9b4e17db9dd86301f0507c3c325a8d93d5e7e35b4a0835619b31e2e6fbb680c38a876a00aff4e744951743c6c98c8eab6d5557984e07b56cbb24d82f3e8e01e231483b27e8bb08f1f3054eac19aecea9601bc0606bf6ce08845972baa517713555595957601c27dcf07488908afa480c321b7aac83f814e8cbd82ef05afa8f3996eb1bd5a047d7c4e030bd86be4d8f2a1b244a1c45fb6a5b307ec504fad776f5caca7d380f9c380a1209d4162958697493e6a34cdf2fe46836d87ddca6d46d2d1120da1f9f0f843fd988a32335c6f40a2d9a56caeb542c099f6bffad560205a4b51680932d564d4fc91e8cd1b900fda1d1a67e5c83bcd9e404d1fa8a4c03a724e418a104364e68d6261f0f3a20bd20b2f38f5e6a1ab20fcc403b299b3721b72a40aed7f76ba8e6dea8026ba5278b9a93fc306d4a083c3a0fa432b747a3ad1eff4d86d508d4de215b855d15b570735619680a28a2e543c11ac95aaf58da89cad6eff4f66e516dc483ed309ec747e16a39edd3ffba67e60317516318c233c3f2fc5f8d72d22ef4d9e3d4abfa6cb3b54f9cf65b092cd2f6923f2382e7b736134eb23a0c86668b1caffa3dd32366c21cf08249e8b895639c0f9bfe945645a386e62779b5fefea005ed79c97d169d2c4ae4ee30f4848cb63f530e22f70cc8a90c08c4faf05468c23c5641304ec6eb43c547533b8ac784978912864c14f9976d3fab8b56be2d73fdf8b4ffddaf7313fd20131696791f11ef2f902ae461588eb85ab1a9fcfc7de50e6eb77d8ac2f605c73e263570a9cb2c39bd8aa585d7e6b31acbe817b121b45dbf87404b5746a2b7028f9e0b0a17e31fdd590fd63929b6401e81a82f82efbc487657b90158bacdeb083683f78f2f56e6dc4711aec0721920e59931ae7e0deda7ce8da5dee0e38691ee8d9aa461c8148c7b2aaf5812cdc4622a4d997a5e6e01a84026a7a2264de1bfba5f325effe6067d11fd74d6c023e1bf507544169f655e945cb933ea317aba41952324806d340a48906bdb91d00e83df5df73ac039bbd681e6a1d1d63304da72d9a3574e4075991dc4f5ab796643e7fb0189a553d46a89c00a770926560d3d812fa3722c9b6c2ca973c292c0b76e6560728a167fd4327b3153b4f6a1bb1a3e19055e4f3be603ffe591752436824f77bd29ff0ee863458f3d044e2e50b56e26925c39c02715b7dc2cb7f078617d5a0d457b2f8de9f2a4a36c83645eada028c3aadc382773419580ca46497bdf44c0fa39a47f951220a8d4ae72fead5e6003e3cb79a1b10fe3c20f3fdc940056863a36fb3eaaa786cb990da4bf2bf634730f92dc124309e95f1f1400cf63f562d3f1a47d6648236f47eab105e96124a55ce8cfe6121237c2942ac7f73e37efc321c2ddfe2e3feb466500fea417d00d5b3ed76e7c5589f27fc68150578897cb5bd0cae856b904cd6f5704ea19f2c4dbcacd29630edb554128fffc3051de8629d0a4853d929d25336cfb2f334ef021161cfcb8577f40b74ee71b96ce08ebebe79971a4a5fe36f48a87d70d40962042a002973fbb9153f9f35e46e7702d5cfe49cfa8ba15a816de1f532fa126a42d630125108e94d2c037668657ea6a1b90c6a1c52e76fb23b703c2351216bd2cc92bb888468aaafb4ed48a23a313b906d1c66ee0e4aff22335021fd4e097554b0ceb8bb41eee65e70ba1fd34c1e760f9cf1dcfb4a4d66e2911ed5d10d716877ce23606457a92f99e0f66a8966a055a331e2976f1c89f5574aade59582787432398302f5bd6e2385ef51bf9c796e70fe8d21fb64ec626a7f38fc8b62968d399413e7bbcf32bdfef6b33d46714bfde7079689af4539c0955e63e5e5d2fdcc4366f5ed78a182e11922b570933755d255e7932dd8edd6c2481e0a8317a79cb7ec0754303fa83dfcc4a678c2ce3a035ac8747917754fe601ab036b4104f6f242178de8506b3ab0113505599cd450d5b762be5dfd2585f6121261ee10bbdbd2488cc1909528279ff3f0d18d7250a85428599391d3547562051d094a78f7f8dc562faf304dea81f9663093be37b5d0018d4d952469fc633cec3fce3f75f0687ddddf7223ecc4d9b29b97a9328ef96bb07e319d499736a24e60765767a07fa7ad8d0253c04abd943f4e4c7c99e2247cb32d442edd2f6518dd09508eb18da97db6ad0955e8545e0923c993392963698f9aeb1f812d84791fbec4da22eb3e479c7d2cf4e737b5686573c0e58ba07a4d3b9f87ffacef300089653e9a68e4578a29c8850ff80204413c26100ae7f95f3c2c0584675bc6a9ac70758bc22097f580e3c72de81c80a7cc0ad098e60cd183c74416157edf9d0914d2daa2c64e60857e788ae26e489d6c0799d9e573dd5adae444af6873201fe5bb8646c5a6078e354368deb82c05bb2935f8db26c38506326b821e34aeed817c453e6cef6827dbf89c1d12c2e9a3a8939d8732cdc17695cdb64ea568c4685bad00e6a5163d1fb36f46e00be93af50e96ede19d96c7ef79cc60568e523eaf051733ed7fe859460c77c36fee1785d57ca25e7439da6bd588d87556874512c463b6b2beec437182bb86ed440e2b5ca0d1797150b354b241dbb17b76d95abad4a422b0f332ad6fda31ea8d4974b1bfa650cbafc526e40d5df74f08bebdeda14b74f9d3c36bc474ac13fb9a8c40295343ec4056d7981614f84cb5b713f4b5abc7bddb9b401324bafa6a44d8787ccf64bac1eb1575f0767980145cb41b592b64d043924cba3032740499d6b285a5a8786fb59e93635ba67c8b8f242c8537d0d9cc3369dc2bb834d3c5643a3646686151bde0be0ddaa2814703d985ddd761530ab15ace456a3d909aabb48dd87554307786179d536043c4049a521e06a82b9716eb28a4c943b2665e67a46ebe0ffb81d2df5333f8cd58adcbbe07cb35ee8ca739058cca257ca68bd34c4488d729d4d3ca313d74257f3ada5be9af527df90206e23cefa1ab05c93ab4c144833fed3b82777155208283e10c6f1e6d3c07052a570617745467d8ee91052bd65f8be2629b66f6663923b0b0b1d3111a43c46d18214bb88b2e286aaa3889abb8a039f14559e2bf0a8ed5fe66cd794eaa037c82cddbb8d337d36917c576933d93e8ea0e102baebb4bb6919123b0257e54694a7eab73e377a0f7600344221570d0bb4963d5b2737586e552615377ca62f5238660d1f30b23ae64a588f01bdab52668aa2e0e89777bb6d3ba63d4056858d03f88c5d192e60c78ebf9533a1158475c1f5e971a51610d52c44f6b15bc030b4fccdc320077ecbaec50a0aa471a82ab93f8dfd1634cc68d853f519d54683fe0dbe9ef3b76043a610581c495431de2251166c586064f555382fe170d8514409c99315a4e3875ca43b6ce32e06d69f296bc1942eb5357c587ad274d501264c3650e49dacecfc759367778636e6ade4053b379f436cc9682cb833f0fb75d794838132c032bde85b1f0ae483f6d3d1da28c140ddbabd7c28976a4e4ab9ea0bb6d3af3cc4bc278b5d78a9e1541ba82fe5ab4af18122bc4d4848ba5a1e10926364c4a6d0460bf1e2e1044752e7400e84090474648f4c2a37d7cba2ce213fc8d37b5a83dad30060013892d6300190412017e07317334859c9eeaf50da6cc5cb4d5531b029eee9ecbb64104ed15ab5810221abd57f635bc7a4faab9adf0a1ca1cdb83878de1882035e436bd4dc300bede11cf9c73f32929a070619868175a4281b3901267b03603b0d258fabeca9a7e6ceb770b73099ed2939dfd0a1c3540902c9ac189717e92d7550358a3afe4eec5a18eb83966256d560d798cc6c15202e0bbd062af62a46c8da12f1258a5065824009f706a48395e3f22fffd404a5786aa4e21e35f1972edbd50b73a3f4f4830a2726100ef640f1fb8acaa4e7e2d2399d75597fad1291d569f782651ba960617a978e124938dca0c98081d743aaba47ebbda41112adab58c4bb94c142be34ca879258d3eef840d05e43a5ce714b874025173f2a491b48ad66ef41727b043404dc8500a880582c8ac780aa59aaf090c035553401166c614d2142658aafa8d0cc849060d47d082b3ac1dab2940295d4e951f427b0660a971f0d29164f3e9a69a0f0c59e888ef352be25c389a2594f4f261d9899e9735831d98f90f7c6c14a8af42b3e64c80d085f14809bc4368480f68f1614f1781ce329655c922837669f2d3424fe7d5a1ab5ac88890fe999fa65ec1939e89fc84f490e32fbbf26677d99b275144ccd9b52d1af3f3b7916784fdab320284e93a2f547d90cd017a74d0b1ad70188f6593b236f4a320a6195f54573732cf52cb27570405091cbef9ac601c86cd313432e744a1f380a1e121415542a83282952079cf046ee4200f848468462a9b9047b1e04d7c252f3150de672cd0979fffe387032dbcdf9eccf674df1cf00b68f2b95049035eaa13c82f96d3488791e8738b390a3ea0e841b07d8b350aad9a0267396345b6d01bd8823f9640ee9ef6cc434aa55ccf9cd5dd48d033ee3216d3839a2cfd18c6e5fbff500536146e070ba65cb83cc3d0b5fde8730abdc18d64768a70198254b4868bed17cf727baf11c23ec5971309150fdab0636ba96cb44552a368b85a64933a68c5761857473decc99106331544b26c8488a442bdac1dbbd70af0d29c870a886622be3c0e6557c4bd57a9b2eb34e27a25aadde95be0ecda004b94e99786f9cc418d687b14fc6b5d6b02572aba529a084139e770ff238e396ac99f8ad477a6c798faacedbbc46c5d0110bdb8f9dcfc5f40772f7a3d52a41c14e121b19b638754a15d4d38d7fec13cb43786d8a9a86992f4da5287a808152ed3561135ebe03abddfa03fa1699ebb2323f81466b41e15e11c20c1c08dd0b7229a3484c8f942e0cc059540c315681f861e759b2dea8b66f6494e75e2305544986c50d6436c162450c808b97d1a03219b91f61ff85255b49f57403813b4d074cdc1f0865969800ad265fe3243fae199aec7039dbe61a3547d87e9c4cffabdd83eb210f2ef07a261d27b7a3a5ba9c82d3d0fd4972351f809397b5a4918db895f979d796ea63e197dee40f24f9bbb4ed832b63dd8d4a6bc49376178ea86765bf160d5fc6da5f8562c1b58f01302d4bb3f522512ef77f6a58d94e8bbc2ca69ffc1e83e705f84d540474be44f1d8f309ed3a46fded70094135ae1eab2e7da0d8652df4e704e82cf4ed72eea220d1c7b0f1d4d6aa94b4b7ef7383355c707aba6c091ecdc1930d4dfacdadf70374fdae9f127510ba0e564384e9653908be365ffe39cef6915af290c14fa4587e62d13fcf521e3fb04d3da01064b4e2cac88426df55860f203d55b402453b08426cd5891ecc8bdefee98fed8091f6415989a1540b9f5d34eaa84490d0cc4bc8971bc933ce3ff5cba1406b8c3f7a7a93f83bea3ed6f66d2a2e6ab79a530a7517f7f912788d91224f7a79c03de25f4ff1c89f91d68630632580e2dc6a3c3c0fd49e6c8249eaa371a5c157eeed12dd089fa0027983ce0cccb66d30e4a7d7eae9d68d0d8841c39a27f02a66b598fd97a44339009179b884b2a50178c78e13579234ed3f489ae5b6f3ded8ea967c1ba83c49a283304e7c4ee22320214646ebcd7e95f442cb3817ad3af3957fa7ada2f96dd6ed09f2118b96524d90951c978c273df21dc2f9cce22e33e6b3f3d49bed412474849f48bfc8633252ba1d4a087e00b3bd2c16253c5a146567cd7430be585eaaaeb62807d76c52917faeae82ce5b87cefc22edb2b6b74a0cbdefb0569758cabbe48b996018dbb87226404d36aa79c69a07079a0cc4a969f3abc11d1eec169a15790d476b58ed1d170fb1b0df6c33f70eb68ec1a287fd4b87db466d060b096ffc2b75e7fefac8ffba6d1486c505437805f422ff7968360ca61d1c1b89a9a7cfc077197e35f55fe085affa4649640e20c920ca38c7fb1947fba79c22571e73b0c127109a1b38338ca4bd41dd457b74e32049e9350b926524201b9c535e0fd893ac31ca635b9e37a9f0d921ffc9e7e0106866d909ba8867405606a1c6231f2e1a74150ed6504476467922c67544e1f9ffdff68958db680c246c1bbeefe2e355a82d9490db8886c3a1ea0b149f305d9f632ad3ab40be4d7e8966b314b083f85c4bc9598a6196b304990f33818b2252a2a63929f4e2fe38813efb2ffb99b031639e5e46a96091718ef628a4bddc3b61d3bd1c27af734a42cbfd888e1136e73150a1e3ae4acc2c9e36eafd3f92718ffaadb28f36d982fef4fd856c5935afb782684227d267ae678c79823c4109c72f62a4abe99dd3c79f29ca194f6105e4bc962397abf726567818534c11ad0d0727c9b7b4c840f271364f749cfe29cf5edcc8fe923c2b22241fcec88ce54c26de6735c59260e49e695a85b3a7fc06ff75c15656474836171bdea1862e7d23e8027be2e877d7aa260cb69eaf8d514a4aa41a91125c9c172d11e1f578f54f741950ebf63e564fe01ac807559fb84076e4f6087466b8d6e50ff1aaa42c7a1b9dcd375e4539b922f4ddbcabc136b8cdb57a03b0eb7af6894939655c6b359ee1853e6efb104de95ab89259079a17f33722ed69a7de3ab42c34dcda1cd80438be4b4157b7f76aff8ce0fde8aa5c8e382240b04dd04c508cdba167126ca6c472359a8a10561d49aca99479d43a6972e955aa81a5a222b8e3fe2d8e6a2fe7165dc5e9fe85469ea8c751d851f2d489d71e2c598146190499fc1917bde4f3fd0b1fde754e9b6963e54b14c2fe998bcddf6a4494aa4578236bfcd91e3da804f5723ffc256e9babfab8a8bf6098bd109dbff1c71b38f16e8e3b281426fca1a089cdbe0f035797b0ae50710e50bf4946f0fcb6cf7e0e8d5119263f76fa59301f895cdf272d16f625aa227ba5cd7789e7aaa70997ed642a472f7f35d8b96c77df82efa4570476319f287d639dcae7d4e1f973a13eb7ab9c8d791b459c9ff0467c060c7546e1facb7b7b9e39624ecd7417ff2cc05e87949b48e454c06f7c333dba1b669922f7e0a44bb87be81efec93fda3d0e6ddd51a96798b81343f39535ab696c7903174e22157a8d0327f61e1da52c6d80c67af50341e4761a1b3f104f15f54ff3690e4e037396005a0f53bdb95b3371a065eb733c345ac38965f4c71189af19744a33c8b95a9cb9e877ed3c52f2a08c728178ce244e76e640dc91c1d3fee2a7f23d920753bd1961ddcd5082b8b1fe1a465449bc3c04f5c61ffb64e235da2fc0d39a2a8ba9e098d3568e02260e6675ae053b1886e2b289587b21fbf7f6f32c5e4d085f306a49d91e6a2563644ae1a7573a0ace3277c2c1a4c50acc99aa58ebc56927cfc7f1c5464c5e0f5df3b47a0899f6e3602f74d53a561197347c07bfa35c46d7ecc7cef14bde4423c505ea3d53e3d290ced952552692ae2ba5a5ed85fbeff514341af446c12994bce1350586eaf2f716ea32e7d9b65f6c57164bf0caf8891a1ddc534388fad3c145bb1167a23788eaadaa40de7f5fef3582f59f10c4e917406b9b84252e13bcde617eebe907f769485b17d59733a564249296c0f4f133c2b54e80fe5650f0e244c413578f0e6cca34f076a74cc912c436ef4e0630dc54cef04073d63e0991f2ab5541813ecb80e27169d3aa490b8c1293f3623673928fea85069fe01e85547917a0d8a93e9afc7cd7566c687b7b47a07c37ac1e99e39879ce4240ae4583db772b35ac580dd5f20f19322b63bcdc597e9b2065743942c780108262ba62d2f3ebef4d7ef5f34c5f5529421e74df11c1d16fece6f65da3c7e463ef9495eccabf882237c7f7c3725673ff444b026035bc22171f592ad1e1b3468d4bc9042ec832ae4ebc1633f135b8ef29f321fdf58ad55b4214006e6e423078f8040f2fff5b5900762e9b57343979807c8cab31d46735095f18a046e4df4f515b5a16c86cc8e789b501b57aad68de0c15baec5e4b79d35066c36cb5245fcbdffdbe8510e10bdedb0315a0d46f90535a2c7c736e35c5ed5a8a17cd4325b26088edeafa9ed53382f97257c8683e5e5fc65b8810463c1b96b949da87b508046979fb94e599cc17bd37ed858791a2408f320fcf4ab01d245c7a0a626f34cbbc2cff1a3d7e41581899c6c8b7fbaf8458c3a1d30856e8986b33c84d1a5e8e520d194254221edbd517dff04a60508ad3a69c63d6092e4e2519d905d4f1356b6b8c3201e73705cacdd90e7a1c60f3d4408e3f371ef137352763fea7314989959871ba0ef3cdd6e6de6f5f1c207febfe4186bc5734e1a91f9b74722671c0e6e2ab97ed5c5202b4dfdb790ef5b554e9a2f4d3e33b44102d2868bfa6d9c05ff34a75af59d96b9fe929abd07807de6fbc80106a7ca5a6f50fef7ba2299118dd2cd672ab5ac00bc40abfd8cf727c10efb2b76693248bc45a9bc39b7dd48fb2ca98be27ae9f0a87d7b55df7b651a0a96dde93b31b9b8089119abcc8654fa1bd077bf1fabffa5b32bb7cb1d0569594a673b69fac456a27ac0c3c47048069e3fe56815049d8ec33460b098cd2a5705a44c049b4602c1698efad5e74798d68e415c3267224bf974f84e60e2641590dd25c71b0264d9026ef144dd0c3740b0a6d0013c0c3c0c3c0c3c0cbcc6f0f7e66e6d6649482949a299b0e0cbb097049629a594644a5eefffb3fd57e340cd7e676d6dcde881ff0cf30ca70c663f0dfd0a343c919436978e97ff62d68bb911343a9120e3bde8855b0d3a6947d67247185fa820687022c95dcebab2ac9b388b0282c626926406b75423f33aac9a480e1f5e7eca523b359d8944bbbe4a173ffe69aec444b269461ff1f9f3f0e5901f9e2e9120d63e55ca7639bc7b236bc5c618c30712e221d8320ed0b044527ef71873ff694ce156225143e4cb7992ab795b1a9448ca73ae7e6a3fb4f26564cd0cc8901f3ec2481e84043c78f41a684ca25319faa269c47b40da0e0734249138f25da5b366542b9d051a91d0eb3ecee406d7533b0d1289e16e4bbeedc39a5d5eec28c10e2f767060c81923033c78fcf02143ce18cf834719341e91203e6b3c99621a8e4890f994a7bab47a182b824623122ea83beda672d023e21e7634189120a3626a693e5c1891590f532ba3ec8c1034169114dbf9f2a5ec8511cb0205df40431149a14608a9fa79233b968c614611682422f943736bac2e866e1e110917b469d6d497b6367f88a4b5d3b3b7d1d2524d86485026b498d65688c4ed8d770f623608552244e2a68af9afcb2fba6910c91636e7cdeb1e5c7490209274fd87509bcb2a320722f9e7ef92b9af29d10191183cbc57badacce9db3f24efc9f1a0846b9ecb7e48ce18f47aaa9c731ef521d192a93042a4da858bf22141853cb9d6e173252ff79058eaf26bbe7f4c83500f4915d3438970fd7455c9436214cdb9d45bf8db1e0fc9c1c5d2cd8ffb8bd01d12d36586f2b218762bb343f286eb571279d52161f4a6247efe1fed5274480a968332519dae84eccc21c14f531c1dec5b1ed09043a2c9381b63a756309dd238248b4c3e3ee31b96991b593b0b72849c80070f0e020d38249eda58ecbbae20530a5b81c61b924d264f517683d27d7b1568b821f1e7324b665021c4c6db9078224a5d280d93c1563624e7177d496590bd7c7173028d3524654cea213f98f6f0e2faa0a186c40e334a59929bb917ae1468a421c12dfecd28cbdd9a311a9264a3e8da11179692679640e30c4959f971c77cc3db9366482e25839d900fcb90d8315f92172e8bcc54661268902159f46656c9cea43dfe48a03106affecd6643a7ed9866d01043b256e6badb6d50e1411a61484e67b2335f4e5155b291354e34c09014a2c94e098fa946c8740634be90d41b3fb749bb6e0795193884861712347436255df3ca6c7c64edc75d17126633fb2991f3153a32120acaa0c18564cff6df51e12e074873fea0b185a45051beaf8414a13c3fb29662a0a185c4d252df7342744d66481928e4c240230b09627f373ff7b9f499ab5848f4f8ae418dca5021fb91b5e3c1e3c040e30a09fa9b97fe37a48dec053f7c7019685821e1e2875b764f19660c39434850f4d0a842e259cf980c1d94d8ce70d9000d2ad0984292d8253d4afe8be6cf23ab0986183d4e40430a88788666cbd8e65ea94c2134a290b4fe59252f42c64d062e83648ce363481032121862f44034a090a027d6638b9c1373ffc8da0f204f48f80b1342e83855ab8c32820011624646aa41d1704292d0a363076defb19cb3051a4d4876f553a5ad9b47b948830949b13d67860c7bef234281c612126d65af36e93919c2574262770e6baacfe246e9494812baf74fff5f76ac1212122d9af65122ee72597884e4926139065fd50849f515849ed1b7f049a508896baa7995d7a33de6899034ff155d63ca68a7ba2124e9f2503e16bfabafd4031a424810dd59e46bd79cf02025d008024aa48bdc131f32da913533cae8918ae50f206378c18387ff0032463264a00104477c7e3a95d7cf4ae7434818f6041a3f48aa0ca1a9ab1e4b29df0749b5a22b56d566d7d11e24a7d99f85d549830749392a6c8a97cd4d511c59eb1e860822bb48121654b84f32c31f88e822c9c6c5b363c80f5d25ca45527cfd20474fec3de58cacc5c0bd8c1e3f7c64488fc34582a6889acd1633a60ba281ff38d30b81c82d926da3e6b93219645d1d59eb2104480f1a1c211d10b14562277dc22d77f47ca61a59334bd35a246777e55c1ccf7d0809031d20428ba4bb144b32c5a4dffdf1314c0e44669128671efcda4e8cac4916896e67dd1e47a5fc098dac0119d263a40c3382602c123e6ddc5032bfe56e0de487c122d1f3cfe92426a217ea91b51ec60b21437e244230a0af485277a9fccb2109af6c5d919cacc3f59ae893e28f334610b31d6168a00c0f445a91acfa79e22db57376bec719428694954b81082b92ab62ea8b73e72a92356553b57c325524c59c6affc2fed846cbc8da107f01ef084303ee4348186088d1830c915424f5a92d1d2e7e9e65b71be265941188a022492da58e9d8be990b31822a7b07a4f43c67b0a2173051153249c6ebb99a8a56c0c444a91541784e5b01747f6160622a4f0724c55efbf4df14f20320adc7b45caa7ca67e1913533815a1b4444919464eccd2974fc7f51f1e05104915074252c95de7461df110145824e6fc972da5cb79813f9449252f92674accc2065630a114f24973e69753afe06cbf0e081d6c3ea6c14229d482ca536c65530f30b9641c611724260031f64f818120404683dd00c14229c480edd7eb5a2540e61d15207914d24481bb70d62a4d7c93c1d443491a44b5ccb36c753bad42299488e15d964a3a4a85a1507114c246e8ce5379e83169dac4b24bde5136bf23a6d456c89045d1ff22a63eabaa966bb9548be207dfd6bd48da78a12099fb297e45f0ca7746e12c99b15e37b6cfc3a289941441289e1848c05e5c1e6ba8e44a27c0a4fd3659f9409412229c5a376c8b8a75d7acf0007f4114916638e6b5d7ad54fc711091eb6f3586c4f315976644d2920d288a472ef98dae182cca9674462d48d22449b7f98af44169118c307213bbfcfe80af26247816087173b0a8c1d5eeca80fecf062477db1c38b1d9507114524a9dfa84da5d444247a483dbdbf4b71d335b2a63bc2d080ae8121460f20228848fc9f2bf50c912b8b2d25440e917025f38ab69797577064cd87fc3817868821927743a9b61421456949c89d08440a9160c236985ad2ed255e337ebf102144f2da25bd4963efdcc88caca90744069198baac2efde7735db69b880822512e2f5b1479418a5aaf98916498f1a30c21e357201288e4ce5096cc4eac65108dacd1c07f98bde0fc381f506384082092fe63a8baa6af0ca2aa1142e40f892e1e436be98e7cd1bedc8e3034f00304250041185fecb0c01989078f4b3b84881f92ff7bbec2d9c92ecbaa20d287c49855a2f3e78e1744f89024b692eededc3f32d67b48b8d8d15295696d75480f279287e42d21478ab8a6209ab205113c2477f8df14544f7a588d8982c81d92d53c5cea33b1340d324241c40e4917725ea696527e50cbbe300602913a24598f5ad6a6d78a51a14382e9c91c434bb78d8c043c44e69090952145abce236bc57684f1c50e1e1cb83188c821c993bc4cd5cd1f2a07d5201287c48c31c4799e4def988643821af16aa6bdf486c42444f556ef67a6d3ba217153d76fc99315bad486e4fd6cdbd94f84d420b221f95be76cab838c96be35249ada6fbfcd5d21eb125143b2e76f112a689a14dbbe209286e43d95839f32ed6a258486c43caddaae9d352769e9899c21b9e37de7b31c2b998a8b9821316bc3f3ac88cc0cb2b1824819129496d16b6a1dbfb64286e414dd23c4f55eea519571867b600c091a4b07b558a75abe1643929fcecec12e655c8a5c4710094352386d3b61514d33c52c41040cc941ce78e6af5533a17d21e945878bd1be74ba3579214926d1f42946d4473f5d4838fd614e6eadd39c9a0b09ca3bc4b87a251d947a0bc9b639ecb8e5243b458b16922e6e0ccba42afdcb998504f9d050196f63180d0232e40707b090603a5ff3edfbc3c694107cb1438b895c21d1348e7fcc5d418a4a2141c40a093296f87855a743b4f2211cc01a82481550b554abd4f20aa3e12d2b6ee69c47f79a791506112a24862e9f91d9548c963485c4987274baf499e7d5238584afa4e6b9a3a6888847d6820011d2418008c1000f1e3cca080224c8f940904386481492845afacae6a523b434b2667684a101328008c940183c780cf132eab020028524b11baf430575eb9534b236a406cee38b1d617cb1e30cf7c00530801a7599c813124683cc172c468dfc2fe284a4b03f31231e6e377f9126249da5bc95e692d21f7a112624f6a825ade6e9d59a17594252860e7af45797eefb224a48caa3a3a2a7242eaafb22494812f2b3a794d29d17be081292d3648cb98d19262b2f7284a4d3a473a5ad3d6ff52246484ed194c996107f5abd481112d483c8aca46674ff2e4284844f7284250d625ee32e3284a474f17a2b7ba585dd458490145757c23d99ac64729120245b12a75ba49de80d721120248b8ffef8d147798b5ce407a66ffe7b0b12f141c2f5a65349454d6e3a223d48da94d9d47b8b1ad911e14192a6148b41ae6babecbb480ea6f53a3497461b5d1749b55b7a32093d9a44cf4572c93f935961cb34745c24f66fc6c85397317c7e8b049faba42b95874bcf6d91bc6964decc994fc8ce6b915cf98469c7bdef5a4e8bc4ed7ead386699d79f4582a9958c8d1c192b2e8b8451a1b39bad5ad98e4572503236fe08f9164ab048964db2bb67d36f4dfd8a24d9f0b77165d5fad3ae480c33a5e3bca626cd742b92cbd243668b49cfb43fcedf5faa60215545e2a9ec68aaa91cb22dee43481838c4462a1245b6490bb1a62b9d0e2a1246c814d54f9f8e41c8180c317afcb0718a246df982d0cf31e9bc2992d2935e47933f6bed8eac9522296d4aca375b8acb79ba0d5224ca9c8e1afd93faabcb2892948a18d978a23d992f8aa4d297f3ed7207153b038890216578ef85223975a87928cff31ead063ede8022b96d5375ce21f489444d252fa68dddc85a7ae22af3ce596384963a9118ddb348b320a33adc9c48cedd59bb63390539901e6b6c6ca2deca3799727a1817d8d044c28db060e14bf5648c8dac0529e3870f10d8c844df69377e8467cd31061329ef4eda2e7aa3c6236b9748ce94febd624c2a89e8466c58e2fa98ae44c531157f54893c684daf273b74654b362891203307e1afc1944ef54f224197ba7d3a5bafda5d128923547c839a7ad2a68e44f2ee6b9241a6886f918dac95c12cb00189c4b67cd9afa8192b9a47248878b3cd1ffdf9962392e4c650ef58a2d9616e44b2c9ce519b3994f68911c9317eda672a333f4b5944d297a8463f15b4fbc7ce5011091ac2b5db2ca66f8a2622d952fe9ca6b631aa644424e7a89bdf52fa5c4fac3b44c2ff854a775ee942bc91b53444f2abc595eba7531e2d85488ad7196233ab377f468884cd78413fe73237c34124a5649fe167838c234741248a857d545f4d667f0622b1b293c6a7526a1b8048f8701735717e6a7e21407af80f1f63fcf0811bb0f18704953fc5cd412f3f25cb59f14382c8d4b87f734a94b646d6bcb0d18784f1301564da9cbb6f980c1b7c48d27673f3e1c347c3de4392a9cce9d154a38e86fa001943ed0336f490ac1f3f7c4b4ff6b2e78c0336f290a027a34ea98f711a2a2fb0818704f394b5e42e9bb8cf38639861ccc78f13c444c0c61d92c3aabe6e1875cb1919f2a34cc0861d92f24533a9a229a71c2a6356213ec40766c0461d92525ecfca962b6f203f78f0d0830d3a24a7dd338f1d19c3726864d360630e49413d77bf3d97ac9acae4905ca637ef594f27bd66998a43e27886e93fb3f43a42704810f5a5d944eb865bfc8604f99c2a8c25936fbf0d37246cf21f3da1c36d4c4a23eb3e8484a118071b6d480ad7ec96c4b66ed02c1b927ac42e98e51591d790e4797c4cd5680c63393d7c240531a3470c800019634f043bbc30a633b0a186e4947e63e2efb55942316ca4c16ff7647153b05e9fd1909259793d7f9530bfe80d6c9ce14e42a8a0aa524c6a064696696dd752a2eb3f633300f0818d32247aa5b47c6b1feb37371b6448b44baef143e88d991f4362b64c221b762b6e6e6d88217184744fd661e51d0c43c2c5d992f15da752ae9b60030cc9a35383288d8d41f6e947c2041b5f484e16349c560fc2539d5e4838b9f1edb1b4b878b60b49e1c4fa5daed85f137221e1e5322b5fe5aedeec9460630b091b2b4ec520d4d3970a6b21f15232b74a49cba93d0bc9a16b34574c8879b260214193b44e0d252f566a0786183d02a0041b5748165d9a64a78fd571638eb06185c4f41ecc6414d3549bd440d8a882ea9fefc47929cb6d532171dc63bcadafb975680a899a69aac4a8f2d05f4921496f29cf974e7cd0452151cbb362b0132696e45048d23aea4efde5f34e7e422a9784b8f49adb2ae7041b4d480a8fa6dbd94ab996aa70b0c184a40fbdd934ca5d872b066708bac1c612f4cf5af952ea77aeac12da91bf4c4a26dd3309c6d4f1a2c8243d844791909cee633cdb5bfd4cd236d83802fa6b44f67826a56484b4dca9aca26347cfad088917d66ddbffe737e844d8536c31f1ffeacd8eac1912d81842d29f8ee371d172fe7a3f7c1c217d76676778d91d6c08212d551936fcf8090b0a02cae7e7c4a8ade867780c7af0a925c10610b67011d36c29c86c251555593f99d19f31341a380fecf06287f91828c821a34c089021c72cc2c60f92c285e747fbf5b41c3c4348182018418fe163c40b1e57b0e183e4fc94e1732aa17c34b541d8e84192de27ab52398c78311d2106860d1e2407738d5155e5f449518ffee1e36d64881916e81f3e32c083c71162357691bc7327566f69c4923cb236e4878f911e6e031f659829d4d04552d4dc9a4567ce3b27e591664ea8918b84dbdc5e59bd2f9f84b848d4dbb81f3c8d765dcd0a356e91e4d9359af3325b25750f333bd4b045721e55aae2458b91ae153ed4a845b2865ca7f3b16991bc26ef2b9c124f56a759246d52f374716cace7934592e68bcb95a64908bf4c146ac42239b3988c5d9a84909ac924d48045c2bd7c8a1f33cb65505f91b82932275b398b913222a1862b1253d6674fb2936ed1502b92be928fea7fd9f1fc6145f2a5e47d35ab19eef1d92a92927f2653396232545615492dd67bf22e6ddc13a622514345ec462d9cd60e151509d6c94f9c128d1befe3427047181a3845e25cc68cf6ccde77b6291235638ed1b4b01409b61746db74e86cfd4891704a76ea4c7165f36d5ef0e031249d2064588d5100f1e1c5036a8822143540d1801a9fe8e123c8026a78c2d30f203f7c04b180a71f401250a3130aa8c18932cef01830a0c62668e02388054e000206d4d0c40b5e70c278408d4c60a28c05d4b8c4016a58a207026a5462003528e1c300352641801a9210408d4894e13e0a5003123d7c0431408d47249ea99f4df1bc94991c91746dd6959b41c853bf11c91d6356d0e13a277a674492f0f0d0e77976eac28b48b0944fb78c6ac5265511499fd3e6a02a6e63ca2422c1defe7d6d946bca8848caac19e46e4a1e2269546f6ff29121924e583c912d4dd61f2c44f2be257f0b3fe252120991bc232bafe893315c89834810fb167117d399752888b552ad5ceee50291dce1e4a924d37eb56c80481ebb245ff152ca49e90f09f26a639acf9131ac7e48ca1c37768753e9999509428d3e24afbe099997f7b6e33143a8c187e40fdf20d3ba474d9b1ba1c61e12dfb654104a63b83a5f0fc939274bdafa275d2cce43525b859efed0af381a0f1e39a881876435f9cb9bba648607dd2129dffa9b0c66733947ed9020664c5fa6d6e6fbbd98371030906bd4214945e54d177f45f54cff4103203d800c492bb3400d3a24e81c95d3e6ec27e4fe3924dc58881d7fff1b4fcb21d176c3a7ab364b4da73824dac9af519f794be70c1c12d353dab07b2763dc242f1862f4f851e30dc916e446a5d1a5b2999d6ab821a94627ab74f7667b1b92f4a652796e37e64e3b1b92b2ad2fcd7b7eb1d45943e266ddab54322de98c5143924ee1d927a6e9dad9342477a8143dd6c8fb949435d0905c169ffbaba566d3c42ea8718664f7fdd254eb78a7773324754a95b62b64d2664a6548b4d92c1762f1744e860c494254cacbf1e1923c8d2141a54b3188ccce69db1443d2bcfca68bdaa520bf302489f6cffbdae0f2160343629e884d6eff49cbd2913d35be90343ac6b72b157fc7c291b51e638c71766448106fad410d2f24edd5c514722d3498a70bc936523fbb9e7ff04bb990a0f9738cc1dd3ad564a95b48da523b566e9e21e2d742721022438c0559fe199485a40ea53e650e7d42f48b85c4cc2d1dd90a5ba374850465c2bd9394199b8b1592daf407df68615464578504a157dd3b6c36bd7ba0a1061592c2767fe6d4761af78eacfdf07186b81085408d292486178d41880eda83facc2a50430a09426e7e93579d6452711412b32d5727bd2514b4d33a8dd538e19b213f4e3a26e0336a3c21a992a67879c3251bb58fac09015276778690213f3c831c325a50c309499fab25ea1d5a3b8c359a90a0db72b8a0d498fe52332149d8b505ed4926213b2f215944e78605dd62f59511a38612122df7d6e252daa6f49390ec7b6db131efa3490d12924545d5d8501f21e1d328bf249328fb0a1a21693658cc6c4a152129cdadc52c4a4de5132242e206d11bc53d262df31942c2cff679568eb695540889a2449875b8e4c1728290bca77c84341545c58882ec510308499f2a598ee6a2a2dbc8670809030c317a9ca0c60f92a48987c5ddcb0f1f580220437e702004357c90e09a42c9a41f9392cb21cfa0460f8a0d6af02041534a297f9478edde9895018d5d24bd56daeece86574e1927850c09424317af7ecc7a1baec534bd5ce8c1346dc5d3f549b5233ba48c1d1918c10e3e1ab8485a3729dad2be870dee18346e51521a3d69750c47d6d436c083c78e30bee0c1e307101f43aa982d1c1d4c5816319d52d2701468d422e92f5ea9a8942e46899a062d922be3e66421934aa942236b6a25a81be2e3878f1f66f47074c621e38c0c27c304346691983c8ebc2044d345b1659178fe232c5aaa943d796291b4398797de20f37f33b048d097b3c635a1ba7ccc572407154ac61b55273f225724852c792d9ef5bc62ae15c941e81e3bad4c39268d15c9d12a09bd55dd41837e64cdac58b132832323d5a0ac2239b9584c4fd994b4a039430e067a181b68a82251bc2f26b959177533e5c010a38718345291f4264b9e5cdacc7fce0c3123c8103340808ac4d49a729a53a11d93e71489a682a99adbc8ec569a2261b54307177d2353542840a3144921a45f9ec999679c49919474e98abd316ec91f45e226213cbb76d80e21d4020d5124288f262b8bea1854a74391a4fb74b6503a64280b2892639a5e26a931c8b4f413096395935a0289674ae74e9f3985a7700e1e24497dab0eb2fe54e565170973e321f36a5ccee5eb22e1bf52862dd351acce45d288d1104be64954e7709134f241e9fa54e1377fb748acdcff49fcbdbe682b71d822b182e8bb312563ecb947d68a80a316093aaef36d7d9e1689f615bd2c1d010fbb001c01c72c924e6b76f98d3601872c1274aafe9495aa47476d642d1649e1de92c6b8ddf4393bc2d040ba19639c19240f70c0a2d64b59ef9bab0b03c72b9254d62d63aab679f028c30c872b1244a6f42563377fed6664ad87cf600c20cc65280a70b422b933ac09d9a73f08cb46d65eed033c78bce0878f1e657080078f1e3c78a801072b92ac74a36cf6201cab48102ee2cbf6363d86f80bd070a82261541211c23eac9c0c9732e0484592a896b7d36b962984a8484a3a0615562a44f69b7b384e9178e2daf2f85a4ca9c311c0618a24a53eff66ac8e0c384a913c7aa365f7a4c5119b0b38489154f9b3cda7f4ee622930e0184572df6e59cb07f9ea6c64adc776018728124fa5d64ab2c55385b204aea14834eb8dc994fa3d2c05810314aeaffed897d8944de0f8c477a192f29049fcfcc61309d7efc1721c2d8e4ea8d1dd445b4b369acc8c095d97a61f3c838a58308183138941e6f8bf398b97d1ac81f78fb31e7656071c9b484c522b5fda9c9f7da389c44cd9f228b5ef75e56622b97425f9676f6a2e8489041fd5f92cec69f56c5e2241f6fb5ad675e6a46489c458a1ea34fa27fd901507014725929458d75325549690274a245cae3f25747812c9bef23e763aac55e54822714e5c08bd74bf504d249283d4102db79ced164322d9e405152fa6e4d6461f919c7f2af73e77db748a2392554bcf3b3798ce1e3722b9736adce071d532891189ea9b5e5937966650c1b18824a1576bbc7b53b056d707381491f4296839e5714da95c4301472292ac541ab3b18cf9c48488e4eed1783ace07933f3a44620a9b69b9c28629e53144b259d0d299ad16453385481695291ba6553f8c961049ff797469394f11251d447230797742af2988e40c2adebdafb22911062261f3694fc9b56425b10022d9926b05fd249e79fe213974d4f08b7ada72eefc909cf73da427193ee4a70f09166f9b627a8e955f3e247dd29b426e470ddf590a70ec21e983284b33b2b62ad743626ada67881cf1aa7c1e929330b59753a624a2773c240921c74726cfa7e2a9ef907427433747a8f514b643c2ace6ffac17d52141e97cf397ef438704d5db7ce2e1994372a8b5fa94bbabd63772488c9bad56e4760e9e9b3824c694f752f80f0d3d5238248b363dcd15d44bbafa8604f9d1e5f1849f2635dd90a8b137566b93a50ec23624ff577b7cdae6fe0ad990e8c9a4c6ed4a9a7459d690a44c5ec7eea0d7727e6a48d4f5f01763ee3e7b2f0d8962d94a3ce6332e7b68485c35f94173362c577786e454a2357dcacd90dcf6b12cf5fabf598624dfa02956995a4386644fbf29986daa5b660cc91d843ebb8d4bd94ac3218644b5b2eb360b269b2c3d7cc8b130a0b11acb2cc9bc8bbcc7f6ed6ccc73972aa81ec00186e450aa3cdab8b97c0947d67ae4179263c4e612321eadf284010e2f246bcce9bf7b42adce3fb2d6037ffce0c01d0d8e900fe0e84272283b93f94ee5e8412e24285d7237f57c25c821030c1c5b48da3cdf54cfd551a3e442d0ec6870847c81430b099eb2e56026bbeab3d9011c5948d01fb56a45c568d9a59135be20878c62c010a30707706021b93ba88fc6dbbe20b3241829e36ce00a492745c5f454a95deb61d0e08c80070f1a1c213c78182b2487d8c5baa8c7aed96c159272b9ada7ce59ae67c110a3c70b7050c178241c5348d0e93477a7cba758f2c6218504b92636261590213f38e0051862f4781c5148ea50f31ddf628f5b2a060e28248ff8fc79f4daeddfa9078e2724ed55e5ab960d8713124d3b7b143d7273c8dd84a40a1a7e2553e9a4fb6142623875595a99d483079790a0417d5cd0ae1ff47a894309497925a6a9fa373b880c1c49401c48c0cf2f5bde136d3a236b27c0718424153407993eac88c6130e2324560895e526b45ec9f966507080a308c9314c4b9cda65bc6888902035d529e9bdf67ac2212497a95cf14f59fb524f07388490204fa73ff9526139087380230889c9d38605370fe24c0d8424119195f67468da577f90a02d6c674f517ff45e70f820e964caa41bc344d5a5dc00470f123f9a481326b3d94ca9063878902494d4506b294ba8faec227994bebe788d8c3b75919c47ec3366d505f5331709b22a329c5a0e17c5d7b74b56aafb2d123bae8d75e5d916c97562d945da09cbe1ae4582a8912d42c654d1afa545b2ff874ef56bcd2c9273faec68795a5924658cbc658619f5518d45e2268f2e7341e94ad1844582121ae396f09877536c6453c89020375e91ac71edc445a6600e6eb82241651d110d5131ff6d8c831bad484a19697232588c9da921c20d5624db47d750d7faf9cebf1bab48ce9b1e6b66779492bf0d6ea82241e47b2d9cc789bbdc8d5424e9246e33273956953b40b8818ac41969b952888c6df62992622d2c854d415dafa607374c91749a2e3e446fee9a6c7c70a314097b6976d26b4627719322594b08dfa04e671449493c6acc15e5ba1a333bb8218aa4b829fb4a5cf4e5380a45e2ae8f8e85a8eb741a0f6e80a2dc7aeff48c31e6a470e313894f412799ebb745ee6137837bc20d4f2406cb71f3eceec7547d2712f4ea080d73318a26b9126e70223973fa3e3d3af5797e1349722efaee4b773ef49a483211a1e1a62374d59389e45cdeefee22fd336e3091a4ee438368c7ed797989a4cc568d17d294d0413bc20d4b2465514af996542d3d3f196e5422c12e75f27819a744827cdc796a8e9bd1927b78b831890415311f6274fe52b64b2251acb6c5add5674f1389e495f534172ae5ca17128922723534fc5c8ac17d4452d2bda92e8c08f1204724e91352338ed5a720d34624e6eca8999e8316338f1109aa7359846d85f1942d22c9acaa720e1b8d6a2aa38a1b8a481add7afa92098da1831291a4bf595f4f745df418056e2022692f08ab4bef187f458748cc0a931da5a53f3644924e17fee45aaf05bd0b91d87126c49685d31d674224b5e8d89ad3cd2beceb613788c4d09cd36e88a5d5d80a22595547f7d37cd21c36d7861b81483adfb424dc825e1c151009baa3cc2c8dda5fb2b8e1c61f9276e73c744e29c585cd0f89b132424c3786d5bd6ef421f137b7bdc187c494793695529e2f9a74630fc6430f89d1475f7e4a15b1a35c8bc48d3c24c757c6785183c5d85770030f89bf239fe4a5dd3cdfddc1bc1e3b6cf6b452e1861d12eded5258b48f0d7212e2461d92f57b6d4f9376ca327be1061d92ef54a8cb20cec4767c0b37e69014d62eb5522cf1b811c10d39245efca84b9fac54b8e8461c12674b8ed4a89be54ee6061c923e26f9fad29e4bd90348973724e5d4204f45fb0fe39f91b51e403a81dc70431fec2d2ca51ce3e76c43e267b88c712f42ff5dd890d8691fc2475b884b7d0d8916df212ed9a7243aab8644cd69ca82d6a034246a8fba86e5e9f833a321f94269aed88ba1cca26748cc318e1a2ddee599296648502abc749eebcb90a4792bd56dc66fca111992847b256d9b9292a3b34eb83186c7aef45ad29f6a6689c11c759f825fdcdaac85c1f4c12b66753ee9a3048636a55316ca3305cd17926d6e2b5f4dca077dbd50576c1619d9f69ec42e9c6e84097553195b3b17b4cbdf5bf3224e8bbd85e473d7ae91d94653b325dcd042c2cb065711eb8cacf53843c890d5c28d2ca4a6b2a8dbaa683e168e93fea57fa5738524292e322283d2d0ac9d19073964942adcb08299d7fd94bd88edfdab80b8cea482272917ddbc4185b5f33f5bc898cba3e5c61492b376ed58920dda3597425298132edf19ac4493ce3842849c24e34614923a955dc865f5e8cd504892965bccbd934fe871c309494196e97d1c8ba5ae35214136bb5356fa7eb1d2070d70cd6ce00613124e5acdad7b90f99b5f32120af2fec6126e2861557023093790603c5a70e30889d134af3daf2a2d08bf70c30849e284da8ad5b0b7495e84c4ab39fbb01d4f53b827841b4448eca4facdb5ff1d617cb183070f34c38d21245995978f92a7a56cc20d21249fdc269133426e1643c08307136e042179c5e25d8cb081905c9942e86841950aeb0f12d4e53ce71c261f245c7de568e1b94725a122dce84182bc78bf3f71964246e6c070830749a3d72d9d27b91cd3ddc52946cd2cd645c2c7d550c963c7134d73613c70613c6e917c69db7b6ba22d923f2635e13e1febf2ab453dee714f98e774591bb4480a9ec26ed4abb567701609171f67ecb4e7acf6ca2229f9e78cdbf62044bf36629198c4a89e3f71fa211a03c8db8045512e3663942f0db31a54c4e8d43fca74b42b0b72c82835b0f18ac4d223df2edf67363139f0020783070f327cf0e001041bae486a3519691a3e8d8c8666012f7654e2630431238c1d21f86287eec0462b92e653a5142e648530252b9232a9efdbd2b626f25b4582b8253cd420802524659e3ccbabb6f95317801292c62cdd46ed6a6c0c024842829e1759325d4cb5962400242468b7f61ff1bf594924802324b56c98cfdb1ad5a3a905011821793645e4729bf9e74d11923a877d4c95ad3cbc4a84c44ea65f328f7805010c21694d5ceac88ff4bb5a5700424892a1555e67fbc8da18020842d2a9f1204c87ddb8d3c07f943d160010cca6f32ca9c866b284f88f1f3e8c0d02f841520ab3ca7ae39d739946d67a001962ce10800f925ac393e9a8d98c0af720e976748bf230b5ea5901f020497ef0527f316b748df12ed21584127a7654a8b4c740af0a3a749174492995d36a10f3ed19592bb948acdc983e7e8fb8485cfbf428e26a1b3f213a6ee1031db6407cec0bbd7e326fbe2c4b9deaa84552fa35d1b97583e52c1ad964e73a689114b294e6304d7fa9fb99176a6b2bd0318b848ff14a745d2bc675b248f8b2d8de4906f911532c92af2cb53dc83211eb6091d872a22dc37d236baf48ae1d6919b2346f6ed1bea0c315c97d3a6ed9c88867ab74b4a2b07495a532648c011020233e46fbb803840e5624d7769ecc99ed91b504838e5524883ebdf09dcce7a4aa4810322ec674988e05931723437c9ca08c213ec6183bbcd8b1c38b1d3bbcd8e1c58e04cb7c063e3215c91ae316aaf45312d7da41072a9247884dab9e722f2c4dc72992324bd3a6b80211e243cc00c18e30be106246193f9211ecf062c7171878102448071da6483c3da2f14d9b1219c531c6385e646064888f1324ea284582b07496c236eb358814c96223bc423eeac7d48f2231aecf78290d27d78b2239e7dc34a9bd0961872239c7593169eac2ea0914c9179e933ad12a624fff44725c4faa3f9f4ae6a9f64492888cbf2ee297fa4e248ab090214be8689fe644d2e5465341b8ac9f50da4452a8609e745552561b4d2479061b95fb52a50e3391f0e76f72db435aaa204c24db55cf77782e91dc6b5fb2614b2458c753f293bde778a612896a7927a6a29accded14189e4f87cda6236f3bb958e4924a6797ca8593b219a91446245d5fc9ef924db1489c43e25e6a367864482798777b30fbe9af2239252ccb8fbd5d811c9adbaab394551b12b6e4492fb6e96cfa6addcc488a44badd91c2c558ca645248bbebc224e4611c979ed3106911b6bda4d4462a6c732f5722122e13d8e4ecffe39acb88748f474fa36d3869fc6d61049f35a23caf367ec7c210ebb797e722544c27c30fd39efe5b45b079160de2bb22a664ef7aa2092fd363dc8e86b26460d44629013dd3d2542545440245ff2b079a3c99efef30f49da62ef57d98cc83ffd901c2eda881b55e9ea937d485ad3a4dacb365ccc241f1273b6527aa1939cda710fc927cffe7a4c6d67473d24c798e35c65aef3d1310f49e9a583a72bd19436e241c71d9282671c8bcf1a539eec90285e9963deca7b845887c4b84d311ea262ae60a143829529b3f3360d9fe790f4d59b4665fee6bc72487e0fa192b97971481231177ac48443c25f295d2a8d8cb0cabd21b9d72f26f5a96efc77439269368fc973b849511b74b021398c9acd1c7329a1af21c1764cc9fa6067a3ac91352b26021d6a488afe7f721d45bc5c4b460f7c838e3424d648d32976e73d68660d3ad09018ac726c4b7ac1da534810c48c760c0431a3bdf70cc9494dc6ca5cfec81a9b4187199234c5d8b5d2515352e93224cd85b34c3a6a75273519922aee3d9836d1c9bf44061d6348aca4b47e9985d279471b08e38b1d49161d6248fe2017c56438df93513382981e41ca381d61481e13fda1af3ebdf30c86e494ca63f4d5ea8d6f1a597b1762fc85c4f47fdaa57365640d9dc759de18747821310529ffa74d87702d75742149c56aae7453613f2947d6ce1032c4b44007179266efaeacc7e44955a0630b09e26d3bd73236fdc8c67684a1010c1831e8d0425207adbc319dbbc728ca42825e6a48370da7b4a35848fada4ac945be42c2a80f77b2f6c35936cf0f10980e2b24e618dcff64dffba9bda0a30ac6ac216b4973a6572a8ddf519e973cecd9b8c38b4c3eb6113aa890bcfe312ba9f41ce742314840be80828e29247ec65f9259e3d4a9ca8e30bed851061d5248fab1684a8d9cbc105a22e88842a2e50771b1e9bb329396a0030a49e972953c9ee5e4bb3f21b1fbdc3f3ea3ecbe4e480ea2b4f6649df6be3421418ed01b663fa5941f624252d82fa5d6d4aae3659790d4b31f963d07cf41a84a48d2b725b64d6e36aa9984a4ea50e1f3c5fca68b84e4ac98f5f75ee2d4c319e8384252de4a1d845ce5dbe84648aecc558be17111124ffda5705a5a164a4a84e4f02c4bd1ac2b864d879058c1ebc2f6898ffba410ee94bb3796ac83906042fce8f0e71f44884048cef9a3c3757d5bf4941f246c363bb1abd4be312b3a7c90d4733a327d672d6b75f42071573de8b0e93f08197be8e041a265166521e4768ebde4d845623499cd55a3c80e95d645a2784cf28295862a55ca4572090bb2d253c84a318b8b64edb8aaddac5267d15b24988cae4dfd2036e6cf1699a316e5102322e4a65cba7f0992831649279a849865a664529f45523a3f2b253fa3e787649170d69d763a7755d24f8e58245f25ffb8d13a569505168917ad8312a3745a763bb2d6a39431e47845621293f1f75645865319593b2ce47045a29a1aeb6c1a6e46b676ad480c9afe7444a4261039589154963965bdf4638c0222c72a922a6bec3c32464cbe574562e54e557ee1e6d49e8ae4987b65d48ca69444db871ca848caa1bf9a7ac45d30ed144941acf4a99ca23d5a08e53045528ca54258ffcebad974c8518ac47cd2b4728b4c3234d8630e394891a0744fe8d2973527d78c2c8ee418456252a1d35bddbb938c552187281244dfcbebc7e3bf89c8118a4413baea43848a0a9bcc018aa49c63b4ce152b9dd142811c9f488c4bb7db204aa6b1bc271235352ceb560e5ebf7722f14d268b9e547d90f3e144a288d53c72b3b5a8673791204255fcbc6617b2d41070218726126459ce5a31a3287264c22463bb72aebef8ffc85a8f1e7800f8410e4c7c67163aad1f59eb31a40c20236c39c8718984cb989774f889dd1c8eac197b22872592e47a4e2754c6778e7125922da58b59dfc7ae662991545e296fc54bf35d7012496a2968ef9cb493a78d078fb293c82189e424949dde4f9f236ccd1189441b4b513a691f12c969b16ef45b5d1e91ecfd351e66fce4a9100c391c91dc97732cd9a7217dd34624e724c358db09cb6c3b231294299561274b4779691109bbdbbfa6e9c7c2da8a483c4f66a3b63e8d9a4e8e4424089d35676c88331dbc2ee44044a2b85bfc689f5590e310491b378e28a13e16ef4d218721924354b6eee8ee9aa5b31472142239354e55d968cd1cf32307218c478e41247e3e154b6e6386b2f8c85ab11d6168e042904310c9f1dfa363f8984bf734b2e63b468e40245aa64aef1b351e20122f5850223fc93f8fd1c85afbe8a1f9021f65cc20c71f924fe58ca1a26497cbe787440d9d3376a6d8235cdd32e4e84382654c7bb9a4191b6464c8c187a40ef5b2cf72b283eaf790a4e7d47bb80677ef911e123e5e692e95e1ede3250c39f2907ca5255af5734c554f8f1c7848caebc963ae4b6a2a868d0972dc2169358e99b08a192d34bc420e3b246e6a0c97368a55ea78b1428e3a24bf8679ab3efd9cff34b2864a8724ed96d94376fcdb741a599b438266b5f60d2f574a86450e392465691dd7cadaa33d3cb2667701f0418e3824096d9f3d64f3c9c9f020071c9283f74597cd7829f319591b03ed90e4412c1739de909493ce6e5a961c19946e48ce4a42830cdac43253da90e039dc7768ab5f758e0d891a9a74e915bff8e84b20c71a124d27f1d86cf92c5e5a0d495a7954799ccdb312a5212947dfafa0fe83501da2213993cad449ffda4ba99c21c94ef3821cd118d139332455891dd93d3716968a408e3224a885ec97a5aa12f5c9907029c9181dc352c592194362f897ceeba48a21497f59baac964d9d6463181de40843b2661999c2e51473b9074352dc5162bafad293e97c21e147275921542d335d2f24c71432eba5a07525c35d4812c25f4c93de20aea45c5873ee1819bb4f69f95b48964f4134f4e47567500bc931c7b855e24e4e8eb29094f762ec2e3367b3100b4942fe25f92a7f57dabb42626f87288b967332655648b4124d317a5c1321e22a181592b3b6659222d3b226cbc80d724cc1a073296d25fa2c972785e4dacd0edda62e6f2d67e4884262fcb5128bbb0bddb6970185049d82b6b990c12724c81f69bba24d98f6de094979ef2fc7189ff46eba09494a53e3786dce1f221392e42931aa328597f4e012924e5cef5a89c878ba2821d9f3a554ef996b20471212359aa67788cbc8ee909038b2cfd297bed0e89919418e9054d262c3a891119253f6fd24467aa6b57c1152d263ac1462d66522aced769e9f1ac2ee625659c94c5bce84e0fa5f6afb0f5959100e2ab4ac72aabfbc66c80184a4d5de3291715d3dc63f4850273fe5b82573176a0e1f30e252b693b9336e8e1e048e32a82470251351200e07c38030000c088488b5be01831308001834260d0663e19058e0f6001480054c382c4a3e2e1c281a12160b05e27128180c0402e2501010080283a06020148a4372a8e47dfb5b30c11637330b5815fb1cdc64b018861757ba7ad042a046c3fbac9e7b2c3ece4335bda879f05fb5b36a9b66b787eceb173e5f51ea627556602e20121790b184fad96e401a28dede294435cd3bc0182675f0ccf7a9bc2efd1007f02e47421660e59886a0fcfaf72bb925a450e063a1749823642402bd5a60fc92896305af9546c0c9fb63912116a97d23a95df3c9ee2a5c511d318955bd7014d91b9d85e415e873a89270f29694c43d97f19b31a877baefcb4931da2c1eab3cf54f0d00fec0a490487d1de573439e5e45746c69a3eb7670faa15dd0fd2f272a4a3512cfdf65acf24dfc859022e7bc03f28a7d9c207245f76fc254dfc1648425a4b36adf33e95f1801c386e903ef7c5ca953edc5736e0365c963cc0f240a40272b94a5afc8d93f3173bc6a728eeea35a4e6acc36193ff4369e15d62937646725f0ec135c72ed2b01a04d39bb705d7f5446e18d09d6b027499f97a4d2fa260781c19b848aea39dde297482a1c432adc8014a12dd142afff157dc03fe787d3f743856a0f85a13a8a59680bf0b70c71698490aa379abe7c9daa32b85c1ab67f41c5322b8d18918f934250ea9c222dadfc9c1a67aa05dd709704d8e54fe3c821d23ac734b09b14c910335ac88ba4ced5fa4ae5faef03401282b1afd57333abb84bb2e159a8286ef9c8faf52c6d518029fdee54f07332aa2d5359f63f8b9f20a265ed28044a44c1d62480cf793e5661320052f70bbc91856b66ec9b1aee513bcfe9ff81fa8b171d910f45573832b544249bc16e6b8621ff7d19a5ff124cc3308897c7c51e49f2f58f6413b98d6825fce934633ff675dbe4ec31006ef8f00bbd174c07eeb848790a1e6100257f7f0eca80b4b45f832e14f04de55763108cf1db40eafcaa1473e6522a4f71ace24985b062eac650469ed3f2a9cd0b2f29b13e544f3be1c0195657f6205f09b48af529144e24c2bae2ee81fe89e0af2b2480f79c83ec56dac7e28c93ef7f71895c353fa253ca99f273ddaf37e46f94c40ad9c901357ea51f04036b185c63110840cefdbfa7585c1e101bff0887cb1720c5318021cef12026c339ae461e72bd46ad5afc06078513720c55986fc2bb5d52a34360c34cec2e00509363213720ae8e1c4c6581a9a237e4c53a5625af7080ffc64e915c2d7819f1febf2ba5ca3bfe5ce554381865baff61d828287e2c4bf386339791054c4c23386c6420509f0ca75809bc758e5773c442a0b160bd3d78a206f2036d854bf7891aac98e160a106260b91d6e2b3498028ac5f3973db23ec6bb098d307173e858b3890e1237c949a52b89c2bbc936d7ba082966025d077a9ad499fd95ed0d96f870e868c86a86915695ce58cbc5c232efc67496153317518616bc1bc8776c7d9e2b6452495afad916f0bbb8ca3d7db408eb700ed38474c5b440a3e371d45eedc41b263ca22e0a2c880b7335c1a456767e1d4829223879eaf9f3252e5bc7279ab1b32213f6f4d58b9a28446dec492d6c2959d8515aee8bf6c4a76c110395d51b7d5302c56c622982813380c98f0fef60a9cad42cbf2594ecffd9d3a7e7da44b454561e304a6e7db2fd85f8494a26e88620a30af4e016976127649a529114eb2e29c707173c14ab96506e9fdb06212e55a6dfe70560b88ea180e0c22a2b888bcf99927c88522e42f598f902063c00bad93b02332519a9519cf780582455eec801d250fdc5e3703b162e9c82b5652ff4deba956ebe436b1ded8777411a247aaf769facc2a42aa664982954e5e18be80b1fa72aa3dd7b522359e317a50748027c8562b900e26cf94c5dfd7aab807464772afb489292c6c1444c821445cc4ab4972157eb5d185f3b1350e61fb71e2ad9c421a412021ddc2b66d874a5e93a85fd82f70bdf2d95bef0b16941c10a8c41e099c831a5cfba358e932dbade27ce930a9525d553f2897ae3adbb76e756477960e35f45fd0f4041aea164178c299efe8b42761528eabbb686340d380a6842802fccbcb55ba24514ed839ca3728407955ffcca70cca5ccb7442f846d0cd3e9668e4bd9e62b2a7ee16364f39d739f8309842f8ea6e472f33b42e5522cb1245406c1acb8a8944a93daf4707aebb5a0a7b5b3164b99f0b1faac75193f58e0327234a3de0f007aa5c4ca725483c26a9c5acb82fc2e5cbf95452fb7c791d96cd67fe8a71c4a4cc55155612f0298dbf65c53522cf3f02d99bf34375bccf30063dd300c4ed6b44b3b2e715417e4271aa31a0d374ab6736813a54214b6e4185973bb682a8c6fc8aa7141cd743be40b7deea4b20f1de1301ef21993ddbc579268a0501898740e09e62cdd06e8682d35bfd386d404e995ae8799cc43347513e660b2c0ef4b036e36befaacfcc01e93fee6c70c37d80f049f98b6dda7a06583e31463e00006de35203698ae37c7ae6c98e55b449082152289918a213eb8a0851d29930859ba738758eb030db07f475295fa7a39fbe8cd8e80a267460ce37bd5930ceb897f135461764f432e3ec0108b56e6d6989a78786542dd34c7f78a918647e9c5dfff37d752c3df56c95cfc3fab36ee1f1d13b37813a461541ff64f3a8efa84a919db548a95f1a724b90d0f12b4262a4bbadb405f939a811c16223aea13d480f0e42b8b9ab42411450160f221093bb027a45e484a22da07f524a08864426cf45d36c93ee49f33efe511ea48c7c1a180463d825749ec8139e3d00e6dc1843a75c67267369ae793ae36532af9eda91e1c7217d663aa2f8df6916747b61a7980e1a19b4ae3e8d01f7c9d064e153b981897e1bfa53089088c1ede82c31d30491095b24ab50cb78e44a12b42df2a9b476f00cdce0034614f425f385890d198a37d1e0242d24658815605aacdbd878480e68cc502cac84a961152e519dacf7c276a0c71120fe92d8e3b48362209c8028af85c2a23c3612aa36a63e8b51af40cf830d0db4844beff43035867b8644dcfdc79360246fc571134a5f9116be8069941e5708330589933d4275ce66eea30c6be96df40657dad5b59b8f833d75e7f5e05ff70887efc13694a84086093bec5e48592187529e5acbea9af015a0b4091c8b4c4542cac29c1c30044c1bb61a818375eee204c3805acfd95b3da64f3f2f72d94afb7f7d247b01f20740bb8a0aec2f2417e0bf0030e4166029b5d5d233ecbeca918a72ae0c0905dd6e574751073b45310227c85aad8d112e9bfda9cd3aa3d51c3bfd694f3a97469a490069ce49f8391708505c6f523accbc13a56315f8ec0c09f452c019b11651202087093b4713bc9bd28b4eb1db1048086d221b21d0a0090250e67ed8efc648f7cc5065c0a7b68113c5e4d0845164230a6b62cc17cc106e48ec849dbb13e2601920d198cd10cdd90afca4f2df86008e3f68c6660ba88a15481980b2be829250795db6eac188347800001dabe6608f8b57b801c47e798cc195a245613e858461fce8b0b8ce8f5696e5b268d69f86ff3ec4303cbbe43045c91d7f2fccc4f202988dd62301f60730b9938f2eee52787f2f4f6d6d39c605cae5f1ad60390166d8e6004a37689f4871a8c16182d7ffa35376a0f2a829b0480b2d267ce758c5e69d37ed8e67861b0683f8ea207465d8eda9e35bf40ae3914882a3f1d0e0016811f270d63aa530c5818d958cba4ed7fd06961110f10267a2827129fe27bec55df7580fd2ac412736e3f60d6cfdcb854f82a91084262c090c54185e5c473617325c9af8108b1c43e4fa780ed82ada575f69e30beec371822170c2a205d8d15fe4741e4630c717bd6955de3e5a74434f49a3dad065b1dc219ed6d0de229a4421d7942ac0932e7f10f42f8734cbfde5a056a466413f26a6911f1021dd7c947c40b72c96addd8c95bbd7356dec95a6d0e6651c3683ddcb271fd2231d35efc50ee0555f3f71b949af762021c3dd20b4e52a801e0ec9a112b101e651240275cda888325e8b7dc304ee0326eacd4bc0335beae5386d8daca84521cc7c25c3b21ea5eeced3d40ab86082646ddf2e1008d1be8cb40d0d01a0e929d4e393863095ff920da8465e300b1f67815cf542acdf96c4612b1afb2e645059a8dde01e21c8e20e912f48ce1c1d25605df2b0014f073ccea84df50b60f52cbbdf8fba49c74217bc476f54d0c60aabf8e70e88ef147cfadecb07f376e454bd8b3b686e5485cafda1f117403aa66dcafb4aaae62f2c53ad89aa621fb1c6dbaee91bfb82b396121e41d7ac7a9600efe239504502c6812fb1ec54442d670a83bc1b385f70799a43a8b20e7001811f4334417a5560bb72246f4437502f3f25aa82517a6795f17ecf4c2db3fabc384de7ff65ef1043bdbec3f29cac5fbc2ec2176f2e265e22c68bf280f7c86e4f81bf97ab288188ece0072b80e4db532b4029690787f8e5ccb7d52aff45feea9ffb0d2ed85a40e31ca5d23c9cba4e86bbbf03dcb18cbf435d293be2b0e3cd99d873074ae5c5849820f01b69e8251c6333327809158d6c59399fe45b0c419d0f49bac98cf7e5b10cc0fe572f39c9f3740ef18926235548244a396a8ecc23bf49624aeaa41f032aab67bb753c79c216144d62548b0bc66d9af91c820180f1d98539dffca0059c8a2d0b1f67de1a67822e2f098881973ddfd37afd1e157bc01c02ec296a8a3a714513dbf54b3ff53c235a0377f3678890fc2c26ac8da07d2836753a7a6eccbbaeb297b6926001e76ad0f808489501c62d8116f6ee1d0d79f2647af400df4db2e01b847940fb41078313d8777550a09e243069abfc015597d59b5adbe4fb4cc000f21bff925d392d3c3954270b547d032dda3e318f380178f93ca180df3c79382b09d8e830800256f92249f465d4b216fa91acd4051000814a86a7c90ab379fb11f5d084f933ab7bd5d2d8e742d703ac9b890fb9889e602a55770919f13521c1bbfdfbc7062c6b8af4d5d282a89ba047efc252a42fa3d510bf00b82ba903c035ad9998f069c94c2019fabb0d3ee812e8e89fde5e51f7402feb0729d45e2df49488ee6f7a142c39ef66314d8d7691a4846184100d8f1e4ecf4d670f8f318227335b011918000a656efa31840d9f9f88083d17023482600362911e31d2d9583444b0237ecac3272e27c83ae7ae08bad14916bd68b842c500ccb90ab0f4425dc7182e6d247ec53a1bd0ab9722b4679e74dd10e182f46a7e0620c5ae28d492b4d77066b1db8dc87800188e0600d17c66df80268bffbe41655ffbac42bff2cf5acbb8e4957a1a14e444a13d71ec09c81098b3b28f42e63ef9978e8943ad945ddc30ebb0973b10ad6215309f47501b980f00d8e0c0b27de3751ae37bce6ee115f7601e8a9c07fdaea49f9f27072f908908b38cd03a150160d1dc49dc0153431b1125161591313dd4e025b0155e91f56c775aa125293ff6000bcfe0baa3f42c05837a07196038691208b58381453a3537cdc8e7565b18113890690436962b9709c78585751b1c130c1ca08183202e124dcbf8f40af35af85b415713465f34f62efa3e9a224d262d81018b15813a74c377ee0e0f47cf19b84d16e6c2b0e698f22e9f316169f743212c1a53d8db36b274e272578190d5901fda404f81ad44a2a0d2e40245bfbc5451b2576166562a2a56ddd7da5584f759ef12c30b5add7f75eda65bafe538297f04a16083c89c9e5253945689947c84512324d8cb1f9493f0544806562eb29d12833cf21d4db4494f4a0e1c099cc1309e73f7b2f60ceb9f2311cc2bb147fc694b892a50af635a0e433e21a0a303ad61411cce290b3ac84d795f190e8bf404eaf4607662e4b359aef1c004ee32e5b4318b59eb9486b4d377d2005e33cac584a9c774889257551a4956282ffb0c8850c8c8df087370c53802f99791ccc06546390a69c833909c940a30d1827c94c274206bcd52edc5f035048d4f63e03862e9f7dff7e195ad869e81c3122a835cc5a4a10a784650b274f925e3f92e426d08677be27c89588c7e8d48c0648b30d48c6f58b471910d8844c5d79373ac760d6e71b59e2bc9a115510c764443ed942ce7e381424038d771c197f5642eb3f3c6b7f326c1b490751b1ca44b9b986b085eb5860b24fd364781cc48bcaf02868bfd2bd2cc56a02c818f10c808aa4b3890f00b9515a0480bd09f4046cf87f12daa2006ac80743f5dd6801b57027cefb66b7a675e75f7e00fe06c5dfafef581dacf251c5ccfaeab4bfc906ac95ad5e2ec402387a3b0bbde6137e0b065a896e068323be71b16eb43806c0e0d05512b36259e9082c71416ad704978436bc40a034d663324b667d11858c84b5833f786a7b34fc1d6f72110d514188d1fe7cf916fb47c25b47feedb1939a679fa34ac1778ea42f911631c3b9c103d3a5c2204bcb8eac9e104eff588583548e20fddc1c97d3ce2e4497f695042a20bf94b91561a0ea01d5f478e18c5e2a96d062d89defbb03261548ce104a0dcf77338ffc03e38bd91ff8d514886eac5fb53ffdb1ae1888e8d182e7b2cac33d39c310be6553d8e74879d94d6f6d8d2e15bb2561bc63b48423b3a5cd5913b5fd2aa4838458ee17f9dee4850de11fbbc1f876925ee287c4f22c789afb808d325c491ff49beaa865cc2cd87307b74aa0476416eac8b78cdd444e6841a4656a3ad224d1711a6824286a71896719e46997c7d6ae850b9872d3a62f27686700307b8350c9935168f07c5ffdd1d14cd7f48a64845c5efee90f284d43b5e3028d1974182862fb0513ae29fccb0d2bed0ea8b2b37443d838c0d8d94e8e83002f3231ba937216f6b2bd18b7638ebae5a18e43697ab712c5e422f6eb077059190b0618e2eb2073f1a0d6ca975726161889fe7f902413999e7f5676f370e16e011817f408f31dcc6688625eefa2ef82364515018d60c6aab2f1db03a09063bfb38b0e2dabcc87213260ddcd7718a56550a59696ae582c83a41168360fe6de2e7939e8d25d96810e36802142cb9038782961740db9320e7800c82bdd334ef96f12717631ed60c2b11cc76abc5ff7aefcb38103783c7128784be1daede0dd87d72b0949d59141e204cbb658b2552264e270424763b8e9512b943abe67a1d6efded5c95821a7a9017c7d80a298cecd01882e72e57b5c22b4ee39382905a9bb74cd1fe895be751d4e4d721aaf9341e5adfd61aae0672f52419ab1c0411a65c3761770d8c315d9f54ae4e077581707d32c38b406dc031cb38515e6267f994f8748487f12ed83a2b898c39adefb6e3d9dc92296d5d8fcd4d63cf7445e56f541f831c01f2c322d762d2501d1a21cd21a563cd261418e34f2cc90bab5a47820f7187c02a42b676048c68106840e9d3aaec24ef4f43e4901344f49616e8c72057ee92cc32421b920214ab49b6e7481ca438c2bb0e53e2205c288a4119699ff8a575a7b75984f1a5edf65a6a875022612e79963d866543b61795a4639a5212ddeae23a7236689925481cc65927c5c65ffc6209263257ca0e46f5c44feb6dc605d808af9adbc5f6ad02199b84ee5f9d9ce56feaa00124d3c3672d9004fce365214dc094053b4a2538151877aa0e420251ce60ed0149b0341aad326312cbede0dbd2b621a93079d090ae77c45398ba84dd548d487e1f7014649006c87d2b1064c357c74e52a7e9b41b397d9753c3200ed824a3c51d336c4bd3d51f9200933c7383194344d70599914ac6ebe280305c70b353d1ec2520f44f00cfde183dd3de2983eed47959be66dc191a7eb10dfd2b0d82fc622c3ca19edddb31edfdfc8a18ca87d5f6d2aac303929ea8f847a120320c2bdd2b4e011ba89b7629aa3b1d2ae143c0e2332178d134ab06e080b6076a7e1567e2b3885939724706b2b3cd2d5dc8abab483706c620f9214d5710505dd4d881bb1bd6db70000ffc69a50f4cd8441a8a64e8622314b70ba8e4ba14b5430c597b00264921357990a02eba055e6bd219f0187037e3a6925834492def0b2de6e70f5f6ea06e4eb425938f5ef597dfa6dfce0b4e9926dc045da87adbbd543fae8a52199858e04c7203f76c93e660e7106f2143adcab7f72e0a615ee5e2fcf347bfe2b7f59f1089445c793e984e9a95120b38d61d59f6040c1047fa825c06f730e5ba66b934dcfa77349617dd9286a6d22941bc6352174a8f68a2c4fff189ebfe6c6435134f4dac67d124401f0c6cda7ca35dbe8318068466ae8dddb68027907d1a2f30da11bf91ae68820623a0fffe0e77a4434473a2017094c42f9e33447fbb4cb661aac97ccd9ace7e9c3434dc43d4576518942c4ecc8ca4fe380338b9af041ffccd8926110ce3298bd3383c7b2a0c148b0ea34481fc970219500f220782f4b6a31768f40797405d7089a20397c4aa03815b12fa4516490f637f22ed65b39587bd931466785b4d4d9be47cd7cfe241ca5144cdaa2810bab6d445c0bffa700fcdb0f8ed26a2c57fdbad585c49ed43df753cb13e8e8bb92d43506240ca128c21eaf3b44ae2297f397c49afd4c432fc9ed904bd367ff797f8cd605713d0d1f07c81c259ba9307014053298288baa2b4515bae43a7794a9d41d9a8c3d57dc4ef008a5bc70d28e3e97a7a734459c60aa61bfee77c6ca1c4b99a80c0a737b6d863c755c53840495c70684a25b751922d29ebcd03249f754f8aecbc95f888f4c74600da1dac7e48bae64046b12f331d03177616e83f0b776c57547ea60b5d4c67e958042275e862e87d71ffe1a8d251a323152b15bb2aa75a37d603833fa0ec455e416d016e20e9e2dbcbf4e2852c8be67d8d435824985595d499ca0de668efd13e0305158fe1fad660876b18f6a33c8caefd4180829093089c58d52b0b4b66d4be9f56aaa79a71424092073b7a4edab542ddcfac37e6211b94177cac36b92d8f386ff56afa645f8168590b233bcca52a6884dd7168456d75220bd6ad03b3a6802e337216b1304029048d0a967410c8d458aa0d95e291428ba5a771fb595cdde8c3cafc461e67255cd9297bc5a1c3ebef2499991ce6b47ad1d7abc64d6a03ab0d3990903aa5476d55a3dbec1e60ca7f5de9ab61a3b71354d3a4db8f2e7af25192ae70c9366c5324f94c2a1afe2bc865926321499fe97d01c8248be998fa9e2f198d7074224badf231fcfc8964e0f1f2255d4af37452da4308e4f431e4dfb360fe73f39bc8dc9266f26e4932370ad146d83e6d3ac9a032ae24c37f5f7c346420d6fc673d09952496e40a56b4c6f7de4d0d47b991d6a6a0470ebcb2a588d49dc49a197b83beff3622c2c59f50a9c55b644645a8d6cbd661d2ed1f450b53b5a1f6d0f468e45365af16bb320a4e1f94ef310a2bf19d9c7e553d3a38ea1d4d7ef4c4bb4570c61ead4c1ade6b782a03469f07f52392652fea23a15891f1113abc958fd9db599f9754e3938ae789c91c3ebef58a5cdb1d176d19e359ff887af67def7f47d2104aa6bc0f2a00ff17a065536ba064288a8b33e48c3ea8604ba8a668251cd5519e8873b352db59a022f07b5480a8873b92e8384ed46fc1146f5aea1fa2db3ceb8e1b31b030f0f0c1c47482ad329f745ff63b0bbfdbe4f3bcf6213153e266cd73276969b8fc8a601b542e623e623e62f211b5f347a9494e9ef2362a7dc0ca27f50163e039c059046788cc01390ba0631eb095cdc63ff37730d0a78eaa54c78f0d58baf42371233a13356a932bbedaa80da4e1406f6ca3e5051ef969c764168d13b085590693b35f5af07f5a0ed429917df49a6f0387cdf4df386b4e56712290cd0c022f0313d2c467414d8b76ba6094bcb4d7c7c6779a314d4dc515a1bc8707ba55aef9a60b065d2746af6c91019da166bfbed684b302b894d00adad22537263265a41f1ef00889256702d0bb6928b6c7f439649ab54a2af850017c2392ba045288cca32fcb9dce1823e751a97c563d004c7908fafaa529c08b44aafa2bd44d694e9924b146b0ba59ad5990ab9a1e15768e505747d598ba0fc85ea6c41543ba69c808af6720b9644e3b7f8014e2bcccf02df6b4e4b2a6c2ceedb96000f817d546c09ef568eebdbdd0880e8de867a4d4e8b5cbd203141d58ba61bec705f328a286da93295bdb817e87c76a0f24ee9fdcf1c180f5b37b7a6111ac9e7472e4be6477156b9fefd2334878133d21dee73eb44e0fcf0dac181fc311ec880a279ccf37ec1e608e546868d042f19449cfad2529ad1490284b71b5b00f31049c8aeecf8a1e9d55205495f3c79168d5ed2015e0f75a3dbb2eb43f6a9f8795f5d8ac7796d44082fcea6b65ea6ce06a02fb4a9f369e8782a289f948c738ae35a50aafaeaa078ef50513efadd467b59ea63f4e9b966ba7525b23dc354a2ea3262a1aa82b7f4fa25351581df30a050266433fe499f91e0412c91ca1582988ac5172ac3e648256eacc940627b28b768e7a07ddfc6b17eb7b3a8d0baf55c91211c03e1b0cbdc261513bcf290c551618db453247b9c7090217f2101b41b9ef4a6754b8e525767074be4de3b304f410c1ef85d3d7f70d474a450516c66385e8a9c417cbb8efbe4f5fe96f24260b025cf2747a89b3071f226d5e496593697490ce161ed4ff08d47c2a5e05b7a7ea105734b607703648c982ae42146f58935ec93190302bc222428e3aa937944d711061556c2ccb4b2e1804cbb2a4e6fef022aafe323161204c173b9af5c0215ba272681caf2bcde3eda0cd9a3c8ad6617aac76ec95920d0dcd6970ab59b57011ecb8f3ce1af2235f142e815a3ab0e06c494915dfeadc948b8176fa7f348b7e43f7c3e3acca7e9d123e7a307927f709959f7602bac45db13d83061e3919d33923dfdeb443ea005ef30d38163c7ef10bac65627005259543fb2f7fc3bb7843c9923e410079d2610f113d2d22e1ef1b083038478241c564e3064decb7699e2defa303c2242bcb47e0fbaab3e2c08fa5c152890ef538020003140f5138ac5e1da2c89b71552b3f73bbd50e4b540119492e625a8f84f2791962f482d0f62003e5f844509b81097c75278aa18c84f3c36442206e2d1023b495d90a8ffd56a486146743ee8614e3d65c2431d5ce7b10c899bc0b0662e5499ecd7dfb76c0878886b782e83cfb0646a2c554a34b491265cd9d80f76f1b0da1441647c108a110cadbe071e7370497bc73202848fd4f3ee8c453c41704d88d9f8e411da2452f2caf91a7b44f54a157607ac53b84e5f4c46a7b83f9bc7566fca50db7867a1d222d1500a8f2376e1000b63cea646abdf305d14aaad9e829dcca0a5bc9284e4225953de93660b82344d2867a598d4213d94a003bb556405611784b4735f6023a1a0c1d1b0a7954e8c02f854fbf3d7198acc3a518341298ba6197c66867f2ac6e0c55915091cc870e0346ad7d548d8b1898b77c3f31796702d84f4833296003fe5d1e923d260caac6e1403d5fab06807024428841298475ca24c0ad3e62cc025aaa14f1019652124be00890275084dc056088995ca52139540bfbeb536452ab661429089569e9cc01a58dda2567672870c50f84fe6a1de1da11802edbaba82a973e923d1afd2d51c9662ed701327b3c3014e1440ac83eea644261a451937080b531e2f351a13d3b8b504775cfc9553abeecee931100a8620f4a97f509f88c2955cb33b5362c539023defdb331e8a2a216806536cbacf7c46a99553ec2dad3c52421cf69465e1444c80f5b0fad439c816440d00a7431215b429b7861096f9f4e151d2335f3795cf4d83d875839c0b8a65e616dc5c3cda616e45f0010b2e02a30b0c1f460b6330a75b445a94349a501390338ec2f3750b8bf3b01217ba3a445257cb818141d3d3426d6b39ce37737ec7600c88e5da7a2a74a9442305199be1751d4e6d3a8c3def453f7a94f0218f6e4990983dd7768a5a53ee63fb7bee12ee8a53ae4d4a3939500d2bcdea7bdeed47a5f1830939a157106383c58d26d5e1bd497b8b7514c0f6151054f14b83b39fc3f781ba28c1c599d97ffcbc1b05245aa3b93aaa80b186645513a30f741c370ab9e57523577433a207f73a1868c92b846b61f0dca036d9c861d4804e7d355b79e0879e1cd8f23556bfd07245273b80f9705cdc3a57c91c4d6b4284cd71dbe1d93d3f0d8818580f6ee3b8a21a5242beebab71bcf71b3e5a5f8bda8afe6ad80b3dc23caf8f8f2811e6fb1cebf6bdcb98fce8a79278edb47f9302808bc03764257c4a5cc941685c45519619e1f02b4bf710b877e42070b365cabad21a86d7369511e1302da76f1320e77218cd0f1eac489c8e18287bf92cd384c546986b954d3badbbec17f40dde31073465d525cbc2a19b57d438909199bc826b7d5513203dc64b55ebfd1c5b27c7a2b22dc536484c79487ee804e1645137a65fd896e636fa250d8866d0b5b2c1fc6bb5f323a3c3a0f42a25d5b49437e88af2f157ea2cd72f2b79cfb2d9b23a55e5fb1e8dec0f32fed75910072ac8bed850bd8a23dcf4bb6a11cb84192ddf33cd9d1a16a1f558d58f766668fa751c5d34d2971a01ad41950419d874d3853934fe10379651094e890a318a0ed92f33084ed2daa530e12846930c5dacced6b12e0e34abbd64e6419e23eac6e4c8cc96b8ab8a24bdbc0244d0961b1e8ead168ea512a932fc4697f45e6e9ea8852141ba0075e98dde5bbc0609608f83eee107951b4a099c4744b87c90bd426ee4a195c221afa86822f219b9e9e407f40bfd3bf782b6d652fe30b7271a4bd52f2d6bf6aeae9005c8b9725d8975818e72e1e862ce39da34b1d65b8a4f47ecd1708127fa01a537d369ec41fb8e1d343764b839cbbcec0aaf767733fe278456449e5303d8f98d69f7e9b240057ce7e4e37421d8938e76d051bc98d3a2c60702f6380b22dd069225acee50c1b26d1a8d9a29d8badb49845edcf148ea4f8d3f1320b929c307094826f4737d11f46e6d6d16e5117470ea3b0bb1617440522f391bd43c594e46c75c3b741a132f30536616d9031ba66f95e86cc0fd04e688e4cbc4f9ee00d8982ea60010059ab716020b89cce46e32fd1de6372fbe84cd125beb05b2890a5c151952a74911e226a941371ab7a571fa51e916d9797df48038408d7895bb479b789b2177c8ac3adee7d05318818fdd446a98d4f797ceb001754ae83e056312e9c7e97aa2dd7796bd78ce308695554b3ba77a2fad57b18d7c84b2e04d551c33f12eb8c83e48ce8b47a7c9539cc67c1adca8ff6b599de21debd208fac40e0f3d857fdc822d4ecc07af9efaa2116d0814c0f4cb435ce5ef223d55c49c24d6e56d4cf91b3071f7b72d020d1f7d4e53915d2d2408afaa9b7a0480cace484c58fd52028b7cbaede128a3bd16a5cf8e97f0503d1581fbe8670ea07407fcd6d2b23e6267fd6768adab5ff4eb760c8a400c8751cc88b008d83a3040a5c2d29239d10a75c07e1903cd55ab179028773340b5c38b4b87b5140a4e21e967695e5d3ab713c574009db2c45f9995097ac968cd9ddde82769b31ed3628cb9b4eec4b5d615367822c7162799da78c249c4759cd6480c3e4bd3b468cfb46eed0462890d1245d942b205f65c3546a8500cd9471e194223c6e00926e35634614af0ade33417bbc72e90e5df708f79f4f950263ba64906a803ca2d0c044a6901425b498ada950af1ba23696d821a2375f600a391492903677f9b4b4a1e81f8cf6efc2b3c5c9d417d319c9aa663a5b05d45216055be9401c1d7e643118e9c08a0e2eb6c4baadbc41cfe05f378d6ab0f65bfae75297286bf48a766f2aa432e4e004f6b6722425e6047f56e08d81b604e64aa0e15282c2958d6ab86b3df50858e222a68febae14f9a0396d1fd4be46d468d09b40c7630408ad22c19b1e2f44cf7a80d29ab8018820f69147eef8453efe3dda459065071a6b1c39622e8aba59bac376108c7a76e174c89f60ac906515f19663f08b98f8116c39db9759c44e18b1ddbf74b7d1bf682f1cb9c63f7c0f942b13b106469214d12109b6daa6a325dfd52dd310223cb14ea45c9cc9805a469a1ea70288d8d78c0bb13a9c8eadc9066519361863b7de910d37f02b6d702abe43465385a8f2c0c03ec8069d9efa307c9449543c13218b2533f7cfbcb2a377f97eb1dffeac203d525d6bce105f9770efb3eb12849109592915ed0c0e71c41691c78086c4935fc92dd528a018c8dd8a16d01e05b9dfa0303bdf05c6de85e5edf64c91b6470f8d94e47662bc203c6e8df95391a9b6903125f6f5cf8e3c2f00aad5cfb466fd8417e831e5b61265640193e4c3496653eb9c05e0b9fe805b1ae07f2c6a962f34f43fd59ff6c7f171641c9a8c4d23e3d038368e4dc6a6f1383c8e8fe326a7c9082f4c48d03ae51639461f240689417a400e92a35706b9063f073f07cd01ca38354e8e82b11d955428034e7d85230e3850b2a4d001c33f3f3f3f3f3f3f3f8b50b66d0bb65910da824c3295f77b48c800b5524a29c99492d073a761b7000000c2d65a23840580386e560e430eef0db6676da5cca4006183e945e828e717456c675080acc1ec6e72cbc54a3a85fdfa13206a30a90e6fc1d62411564ad2600ad53d57a7acc3529813206830d9e959afaf33132eec005b02e40c06f5d25126fe3afa491721d840179500318331ff43fea9c58eb8d08b320e185f40ca60124648b5f477aa11e0bd00840c6617bf4bf1a28e748461653d06e358d0bb4f52ea2d2d370740c4608e9aa1c35b581bf1f3580d8084c11ca654909ddaa963e21de7c1700483e1ef6309cf3a26df5338d6b007205f3007ffec54faedb42f8963cdcca0a901f182f9835877af2fd14304e9823154caf515b3aad08e2ebc300408178c1df6bccbfd4c12ac5b03c8168cef7fa6a9fd96cbf3fa06102d984a74d11f3cbeefeea588e42040b26030531f94d84b2fef130b06a12d4e922efaac29b14b03c8158c79e2f7de5a6405f35bcfcd27f5275bb20a3600a182299eb65928f9925f786720009982413b4f2ed5b2ca262b102998926a3159163f96fc4919e828438ca7c08e1088f138425086184f01111111119028184eac36497f5e57bfb49501040ac612f46228eb2b417c65878e917300c813ccc94b9d78d23dba4c32041be8c208204e309818b1a5d7ba1755006982694d5a951c36dbae752c204c300525a53e5dfe124ca9b33f27a8e8d91e3174886107a20453121eb2fd579420d5840712830c1d13b82c8024c113cb2e4c54eb7712efc1438c1c782048e0c52e59d7678bd75a665676738491030c0e74e10509ba08c106ba40349023183bed495207cbe2b13c4630d87f09fad6cb73be2e82b974e9ed92e24451e91a1440886092525f12b9ed2565131b8249f2925da7d504536b44e100220493e01ef377a3d272091204b395aa5a124a5f04102018c77fc45a763019262e04901f98830aa2e71f96458d8a08203e30c559f1e4957b4ee6640709901e98b3c7845a08f160ba40175e7461812ebc305d78d10505bce02380f0c0e49665c2c6d6203b30c949b8493193f1d0370c203a30baa62953f36b2e8c1f3fa59b32f5254738820c7161921542ee8c9a9c993f8e35345246323232068f09cce06f61b20a66c9e52425f63b0844443e6c619ebd3456dabf1a7cd4c218ab3617c7a46961ce9dabe48c3d414c8a7fccc224a8f168caf7fb9085293ea724f62cab84507dc4c27463398589d71337b30f589846a55a07b7db3f2022e23b3e5e818afda39af2ab1a5a81c153c07f04769de3c31506d9dede33f2d30ae3fa27ab9ca197275a58612af33dd1924ad6927315c651ff0baabc947bfe4315fb918a0bc1072af2b47893baf554cc71ac88081860bc6f3985f13dca899ea4c81406cb495c55d8ac56eaa530964af1d35f9d90c268e2d37c08f18cc2a0652e262c498bc21c7746e8caa97f27bda130453337e94c1a51aa2d288c35d6c9c3d3d394ac9f30c9766366abaa27cc734a4b3cd98fa7bcd2095309756f97a3e8af1739611c37e5f22944f667f5b10993d2d1ca611ec1c1838c31ca78b4268c239f2db7a5cd84d9f349b94488131326cf925fa2d97d12b92e6172ef5c1745cbefe2690993526ea7c3b89f94f657c2b02689e8ecfcd8fd286152e92cbe33e499ef098e7db330bc045f10f8988459636546fc4d340a1f92309d852c559a9ed2848f481845c517fdfb4cd51289f00109730c115dcfc5e038f0f108835fd015659da4493e7f38c268e7a604b136a6a7a47c34c29cde4294a043d6afa800f1c10883faa8a07e4e7c0ff3da1f3e166152622b85a51c2fbc8e1f8a3095a79cf5c46c9e8712da88d5e12311e62e0b272bdc8bda0b9330c8f8e20311e66dd36372380f42299df37108b34593e4b0d19e3aeb640d1f8630fedceb09e2728e7b298968f82884490a3f53a27ac4578f67f82084794cfe9fd3b2272fc5ce0b1f8330b87cb433d9baf02108a3fb87a74e75e9849304c78a408c0e9c3506c25c164c8b29f9d6fa791e1f8030a79d894952e76757f33efe50eb6ac5d6f93a921839b28b1058a00b09a899995959f36a164cfce2042302e8c1871f0c6a9472f10fca8f3e98087ff0c1443ef670a6874c0c4b724ae2c944a804e0071f79b80c7ce0c1205a4f8f92e40ed5967b1ec57cdcc1a4d653883c39a950a9c2b1865650f061079394f44513d1958298201c6b6544f8a883498cb9495d26753dfca0833995fcb49f64b93ed90b7cccc11cbf5ea1b22e849e11c71afa2ebce8c27b78293ee4604e6f4fb2aed85fa717c7be7b60035d78d1050f11912ebcf0428c1c0787172222950398c2471c4c72166d216d4e48b345f00107e37e49f14e927369794cc8e051cc031f6f3025e1939d906ac1b13652c68e1ef7c5871b4c2725fbf0a7e338d66030a2a3471b4c9d4f9b6cf9a757a2c2b1f63bca36f0c106e3a57977969e4a27d7153ed660ee73df92cd8356b7560d26ef1827aedaffa1240d06e1e9a293d68a9fcc42850f3498dd3346bb44d6bf25394379e2f88e28a184d70e1f6630be8773bbaaaf242c49198c59d944c7719125bea7860f3298abb265d12dc26275b0041f6330874aa79e1eb24e84d9810f31183cf674274166bb848f3018456f67e7529524259bb0123ec0603041589724f47592f4f505b3a8f59342ebf66edc820f2f9864fb4b6a2688e80ae947178ced49448e7aeaeacbe358e3516e061f5cb88f2d18f4847f0f26b6b3ccf13d74887117830f2d986d2fc74b2657dfe794051f593089ce978a9652b8f160c1a49f4ef21711d65b5270ac9d5dc124eeefc4855750258a70ac95b9e0c30ae6583d3a6b84e8af98aa601879fbfc71a944ef11154c42ad8b2ae1edd32939533029c1922749b68e14ccfad1c4bb5f9ae4f246c1944eaf899793ee4ab20205e3baeeb4dc2b5dc659344bfade39b4be93568c8fc127123e9e60ae64325694bd580ea3138ca22e2bc7c9fa4137f3a20b8401f423e502a0868f2698d49cf04b7e63b19324490f11111e3d728ce18309e6a0e25b844a5a3d5d8d634d078f4444a4021aa82c7c2cc1b81f54b02b29ac8a526fe14309a6d322a6fa5f725f9a48e12309e6dbcdf6e4b1dbd6939060dc2e0fb99021efc63f8249c8adbc114a76ef958888348f277c18c1dce6f9a747fd08134b78347e14c1609f65a1e3d22f3f5c468f1c7cf8208239866a8c92d3d5d56828878848193d72d4d1e163082625bfa492acd4e2422d049338bb63a5aecb04fd06c1a094146ae4c44eda712e0e3e80605029c6754e4dc9f8f88141fc7fac3749f6991cfee2042318f8f081f14f4d524b92a0e922287cf4c0202a29697259b7d2c6f7830f1e98a45f105925a4f5c9691c6b24e8f11600e36307467bf9ce2ab16f42c9f68b138ca40f1d18cf4411972b9fa79a8a692e8c39737264ba68ad24c6857974d5e7afefccec740bd375bc123effe5c6a21d98618b4a634cbb5e64aedb5e359c510ba3dd79e7e8e023a49c7a062d8ca271173ca8986ca2691606ef0aee25a90d5d9220599862c467a598183195c7c2fc5ff1926687dfa5092cccfb9533dcbcef2d3eaf3049dae693a0739cc8b5ae30cc49777ac209de1ecf5698fa63878f1f4ae98d9e1526257f36d524a982d025ab30c996a37d16ed518561743e693daf3849855361362de5a1629bd2af242a4c043330e314863d93bbba60d2f9a97408334c614e3ac9cc6d0d77352985f9cfe6e477ed143df7a430470fbd9d5739633b5c3d98310af3a8c5754b26adb42b0a63c5897dcfab18d143610e25f6cf7c8c91bf3e280c97e25b2971923277f313a60c4fe3ea57ea42c913863365bb7b82d0ba6e270ceb1eeff5973cc917f20c4e18e49a9b14cbb61ded944d98538a23a24e5e76fa90264c1fd3e7b7e3a7f18e67c29c24c1f2cad99914e629983049bbd0179eec2b2fe912864b520e6516b43e6b640983a753429c10fa299b67831995307eeccf9b992dbf4b29614a714fce1d2d754cd59330872e498fd0a173b82f49c2f8e796467888b0fd58240c6a46c8cdf0689fca04120653954e69b5fcb1d777c6234cfe73b16bf5eac56c9ce108a3a524d2535ed98f091b6110d5a1be742c71267b3298c108538cb03d6b1121968478e880198b3076b4f13c278dd6250d6728c274d2729a3b51e3bcb74418c5a42fa1647523469881086396086982c83951a19a71088399fa5fa86cda3e4962885bc18c4298acf259f59810163484636d0621ccf9b5de4fe8d4660cc2b0f6ebd5e76282684f10e624c80993e59360692ac6e06604c270eac4a7a4c4f0d02903610620cc97b48e1253c993247738d67e6d064644a467fcc16c72a268be8af6b8257e30fee7e5248fd0e983490e3a49dab4b429e11f1fcc67a955d7ad3a65b47b30770ebad5cf249df91e8dc10c3d9873ea92e48d0b5b25863d66e4c1dcbddb5d7a5a4a251319e8f0424444063a76ecc083f93e97d0be6ad9faa26e60c61d0c7a62def3e33b577e9d618773f0943e5a3c657ef2827f1e6633ea604a6f95fbdef39b6c39eb1974308ece2899a63560c61c4c7bfa8366a957339131430ec6929f99ad96add49130ceefe801822f4e300283197130973a9d67e2c92bd1477030a75c876d93fd2d999c196f307cf5ee276157dde72e419e60861b0ceba7d549cea5a7bfd206534949855bd28c91aecd608349dd79f09ce470f9adcc5843921233e67ea5cceb5643299bee389ef2899a0ad3b0999f071df72776c5c10c34e88c33cc30c38c3218b764a8eab59a6c41fbaf808e10a4086690c1a4fd490e3d32941acf8fc1d41b16abbd3ca8f9470c26496665fb1cb3d4877646184cb32e669f46ca8fc7c1602a79a226bf49520e6b7fc1944ae4b745adbef7d00933bc603615e3f3f2243116bd8cc28c2e98f54bb6a4269a124ed533b8603e0f4ae824f49b28eade82398730396bbcce4b526ac1a4b7828df4287adfe62c1844ffa8d4b3b8bda261c164655ba3b47b5ded5dc28c2b18e64b4bd025991ceaa478f038650593e65cfcf5ff23985105937bd5d758480f1a3f150cd23f568a9fef5d93c561c6144c4199924b9efa7b1b1d0e33a460f2384a4a9bedf639c56d98110553f818dac2f89c5c6bcd808249ede3f485ab9c67c61ec38c27985c4fa9eafe94448c8a186638c194c5fd627578dbf9681d6634c1e4395f2698dbc3849ccf152f8f7e7298b104b3b855588f1f943c135282b92fe8f98b575f0428f94eaa3ea952c91026513d9ff09c3f673985309f3463fae6eb945c9d10e64acdbd8ba7b17e1a84399d5c32695f7be56d419804cf3edd9fdad7e281308517557e926c77c70b08a3a9cb9da41369b29bf20f86f54e956a2da74e92f8c1a46bba4fc4d8f7d87d3009f27972f3c35cddc207837d4aeacf6584af8c7b309e1079f62e6be2ae07536aa5894be6c1a0c3559267436a676b34f06096f7173d6b29df529cc61dcca16bab4e47b1243f1a76309a97f89ecb4fa30e06bbb0399d4b39f42969d0c1f8717bd4fa7534e660aeb2ef58728f70ac8988f4f81688888888e85681861ccce92f272b1542b68d270ea61c64ab93b64c030ee62da182b48fa53767a4f106b366659392fa13c4e48ed17083d1c47d3ba91926798a6d305a658df0945f1a6c308985f31273b249630d0679a2e3055d72dcf095861a8c71d9c2de499f461ab2b4a9265a9f26737d514d7a516581061a4c37ca6c762d7b0663c5bc24e531d972b2140d3398b637be3bf7da650ea0510693387f322a5fcdb708d1208339e9126b4c84d29593308d319853559d2428416230a7d4dd965b64857653184ce7e124494e69d4ffee6048bcb0344127517fc16c1b7ea6b73afeda74061a5e30975daaf57e49327725834617cce67633aa6fb222632e982ccb497d55f94d88121e0c686cc1282688b338255bb604f10634b460ce41558979fa932c2266c1e8f6f97ab43b2fc78f05c3eb283979ab8a629e2b984d879277a4e5248a9970ac8101468e17345ac12427e5b0d4d11e0d6854c1a44adfa6bf5a14b58c0715cc594527699671e256740a26dbcb3d71ef9ca468a56050cb0d2fd1b24966d256068d2898d3e8d3a9a273583125d68006140c424982724d53a1ae840a6740e309c64aee697f3f5a97d8e9a0e104f387edf6f04bb993f09a60922227eee97430e1da3c1e349860d44ba2e5a80aa692092fc1248feced951f71ac29c1582765d39b0f2526093b0c1a49309ade9244b5094a2a756901124ca572bd62c557c58fab0b681cc1e8e129c5bb3c514bdbafbd8086114c23d5e489f459b99c1e078ddc0e1a45308713e2df427a9c9c3b3ba04104b37e2569decf56d7771a43e0c25e3d2ba805efaab75799bf74332a7dae280f6808c128aa4d88b8a97049586904c1a8a7a4b974de97d3ab348060d253915d928ed2f881c946743c8b9e9a4a6a1f18458512422eade4e237722601cb008d1e30efb5dbe1c215a0c103d399e888eb18bffd221a3b30557d92b55296ea34260d1d98735d7c1175b15c98acae93246239b4fd850b930a17dc474b505b59bf85d93c5df69ed9cca75c882db80ab577d9d27ab9944d3ca9f4229438c282492d4cdee94c4dc5cb8325a710420b73fa7eb693940c85905998d79430bb24b6b2306cd8874813a790589824d90ef97a2f2caeb1dc9aa2de76ef6aadada2bce436915ed1905798c73bbda9aca23384b8c268bde54195ea1b8b72482b4ca92ae604bb3d8415ad9d88a79b6dd67d6dd649d73cbd0642566150769fb6e65249d16755984f6d564cbf754b135241482a924453963aaf8b9eb4a0e21245d4528b8a27768a2fde8d650a53d0d6b4ab307e495e4b616c53a365495889fed34248714cd9369b3de1582bbaa330cd86a58511e7563acc3966f017d8f132d0b181138549ceee8fef8d550b550422223a763c0dc4d02186884818648811120a838957c90aa3a7567609018539959492cee7d9c72aeb4f98e4e2aec579edec62daf120d8d1030466628cb13b7af0404f98bb45995c79c14b2eb13046c47830d6c6d0e1f9219d30968ee7af6ab324eb9d5e8470c2a0bdc42cf9c363fcef473b745c044236611e69aa4bba7d35611243dc89e6ff2588c997098464c26c8267a8ec8bb330cb4863c2e496de2b174c90a67b311e8c914b0a845cc2689dddf2533a25299d821708b1844912259550ea1f55cf3d38bc12c63451cb84faf2f2748e93d476f4e0410993e81a93a4d39556b384634778e438eb49982b68d1e69f4aef74098e4567470bd2cef677e8f00c8448c29c24d90ec2cfd34db71e3c2261521d9f622739897fde2724cc16efcc84871e1d2a9647984fe8ba9dcffff89fd011a624454b19a17209f7d53d186390d1231b61f094edcad762fa95c48311067de5498915d6ee8323237a8b30c54fbb60964f9950da315024441126b152ca677de3f1f5bd904418664c70b1bf4d7555072a963b7af04044989457d6924ffa94f5a14318e676564eda29c410a620942a8bb3a104a552218530f505f5bbfd59d273871006ffb46ad769dfca93483008d3a853627245ef942567470bfe8c7116c60e1d15e81e6124e410417492ca7f59114bf28a638dcfc818e91146620b8404e22dcb39ff4ffb251c6b45c918791e3bce18c5c220430cfc220410a99bf04f164548f7eb0f261933391751961f4cb152d4eb4b25d9963d9c8c1d3d40d0023292a78019f70823a10342fa60309de344cb132b6f9a468af1c124079d152ca77dee85e878404484c78e6f41c81e4c52af7ac74bb1fda544eb0106193c7e871e8c5f9b7b8229a994f8b004be38c1480942f2d0972e615dc7103c9893fc3d6977266d0d08b943b2f7734ea9dbe4d381103b18d49b926fa92a0525e2111e5c07834eca77941c0da183f9d4087d75f275ae9470aca50242e660bc924fd4aeebfde8500e86f8d2692e5bfee479481ccc3d72b3e43fa1a2e83746183930098183b94e4449d9a1357459de60da30f5d9a47c5e52aa1037183d9e9b20544a3ab6589e438ce3011191fde2042329a40de6b82a95d2c830ddb7078f1136184be893eff298fe134bd0740dc6ec6c71cf4d7d5ff05210a206835ca9b9faa81c747fbe38c1880942d260f4f4b39c434d1244fc1543022222658871f08b138c98103498c34af6d8ef96950f73ec9041f608232120e40c18620653ac183129a9d2ad58421810d98142cac05b57b8f43aad8f8d1bed64c1d4c8984e517b0e3078a0cf31c6e718438757e0035dd88e1e637421840ca6202b8995dd94eefe8f012163300725c749764952fa0f680bc8481e658f30128e11220693f6d2f1faff93b42aa6111d3d46100321613096c9d1f5d8bcd66f878ee41c20040ca6581779b14d271393f405c308e5dd664ae99bbd6052e2f3c5aa5a1284fe74c16dd94d4ff5313f87908efe40081736295c90771f25a4630b499da3bafde45cf727423ab4a049b1cb913f52ab522008c9822947cd4ef6a89139fa1d07070fde102c343a3fbb33ab27f6772208b98249b87addec39a5734f64a0030c300e0e1e6b1a6285ae54955b8e9e945847183a768c611782902a18d6932cfd3615fddc5a8550c1245f7e7b4f498dd2278a63cd3f06233a7aa04dc19c97fc53ca1fc3b136e2397a9c1e3cce2c440a66d5ce4105a1ea4e9e404814fcbc157496655c7a90a1a38c0386884808142cd72c8bad70369edd154369195df5255e8ee1d320078f0b7902488813cc5adfda5f4159c93ec78e1e23650b08698231bd8470eb94e49ce5c2b156831026982adbb7744b1274f2c7c821835246c812cce9d744d129dcfffc83636d87e1134294607e0f2aab9628ea53bce058634248124c6b4abab026e6cb892a210409a635f10493730473c9e3c1eb62049394626ee6a9a49d8e2721a4084693927671d19f6d2c49045369ab1c4f25715f56bd3342c8100c5e6265bfa0c51ecf4308e6bb58e6a684675afeeb88101204c3965c6ad35310a662d743080182714b7adcbb966cdb2623608091e3053f3029c194fc7a99a42dfa3e3079ac689b192797cc0ec79a0e3146eefa8b138c74480fcc3ab7e356a288fd9e6c10c20383c7bcbc17c4b7038334cff494764a29b18510a203c3b6db491de369299d0bd3c7a5a814cee3885d38d64070611a5925d89c708ba33b8e5b18ef6ee7fc4c12748a1a8fe203105b18fc93605ab155dd64c6a316c6d1695afe2ef6e43071acf5e091038cef9103870c467a7c0b6861eabd91f1dc59ee4d3f0b7368cf71d293b230aa957c4a43277913672c4c23fea4511e7b3a3c1e80c0c260529be0e94ac8bda8e800e415a633599674474bd2eb892b0c26c45ecf7f90b2dab6c2349784abf1a042c7c4405861acf34e49475395ee470ab28a035185f15269efa98e1e94ac0e3078ec90c0998b51068fc20090549863a77efb9a4f1f55840a63a998d021f424b1ce013985c93b8eb89bf8f8e12710539884103ae98f2799cecc387664478f314ac70e052905082932712bedb97a54df71ac29c8284cda7375c5cf935b4b9228cc265809627c2e2b769540074261fefc4f1a57957a4d0e020a53102fa2f6a43c66baff8449cc74271952f78469f652c34c8ef0103648278c1644ad728c30f1c40a454038610afbeae2c1b4209b28c78fdd0a3a328068c258714675ca55c984313ebca95241c684e93d9eb5472d41eb209730c927f78a2cabee402c610e4ae75c260715b409a33b904a98720eb293aa5421548477209430665dcb693dfda37d1d4ec2203a2e97bc3815aa7449983ec9933ac32f69af4e248c9d7316b2592a5eb294134020614e52ac3f29499dae217c84f14aab44c595a0ef7b4718ec2459cb62b316449e0248230cebdfa13efdcba7357be4ac00c20873f495af915372ecacdd812cc2f0ed39a724499f57e9bd035184a63652dd46be8930e969e7de561322cc49b0a0e43cb73f997808739f1c3a7f756e3e3a8630ccba976e8f9fe7952d3b7a8c0152087385092aaccacad3fa3b104298e49c274fe94cc92729772083309a14c5db4ef83d49f98c8b00118471bd04115ab505c22467cd89f4be193d933f8000c2245ea94982ad09f778fb00f207838ed61243a55c89ca8e1cc703360b103f184cf46407ed265814a53e9845893b1f4cdb9deadd55f7352c207b30092609224f4aa146e818881e4ca9821e25453e7930d7de9f94dde9cb528907e3c75d11b32d1fc3c63b984a12ded1ee73b585cf0e4637ff244bd4bc852d0d01a40ee6fd8e7f92e42164c9613a984ed949c1c4bb73309a6de559ff93d262052207c3f85ba80c65aab3ad2071306753bacac4e88ecf4938d6e06052b71f4e1a25ed84ac099037982479e729974a8e23103798a40c93d3d327f9244a38968c3698c6f7c4025d49298c5e92b4f6a7561ba4305e272988f08ff9f18a8d51e0ba27fede2b51984fa82c3988ca2626e3e8713c202282a3c7b1110a935431cfe74b440618bf638c651ba0309fe7b8784ba974ff07478fe38182a3c719a394d1e38a8d4f982b892e493ecb86278c95a13f89681f9d7a2f828d4e98f37fc59b4aab8e7b8d8c71c2d80bd8e084498cf214f7d944da48cbe88156c60ee64d983b09a677c207e1581be9c1838c1d233c72b0f10023470f321e604313e695b9cbda2556ac14ca84a9ead2bcc2ab5cf3b6810983f2a4b3e92e173bf162e02e61d29fd3f89c9f58c224ebae9a149772d025ab8431745d48b93d75a67f4a986dc7e3a85392749f3b933028757ea61e2e9a90ab244cf2cde73cc92dfd9a251226555236713b5792eb4a9030f666ea8ece71b9f547184ce8899572d8ec27930d47a8e631676e97c2c5b29c3357322ea693798e8d309bcd99182a4f4698c544dbbd9362c72c676311c6f8af517f3b1539491b8a30d6af4956259deace211b89306f29254fdefdca2b44844907f125c9254b87308fbe88f877dd5242c9109cb7b755acdc8867aa9ae512ed64edea92fe42649e26a90925da11e39146084c2ba75bb070975e5e36fd45c830bff5330dc2682a84e893ca54d23d128449ac1dcbdab1e44cd347caf51023870e0fa8d9888d40184ec977da121e7c2eae35041b8030cf0875418f49133abbae828d3f98bdc7cc6328e1bfa4df56b0e10753b4ecd43986862eb574c1461f4c3aa59c88151372cec30793868cbd0f8f6300edc1b0ff1675e73e7b2c7a30c70ba34b6f437930c7ca75825d875151a4783045b97eff5ce927687b07835d4aa72d9dd2b7faec6030b9354dea4aaa83c9547ad3b26923ae6a3a9844fea3dacd3907d39cde975436928329e8af3775f6353ae7e2b0959bdd58f0d2f0f9d0ea13b327354ce060122d8472fb70798369943e7923649a363d93c1861b8c9efd74e53459a4fdc9461bcc5626be2de7e4613596d96083c1cc7bc5ed242965371b6b30e64965629b9cc3869aa8c1b8ee57278cb2f8f3370dc6109553ff4915d4cdb78106538919ea04cbb9bd3a66e30c26cb2c25feb6554dbe6d9861b1fe932d8379ffa4977a8768a9d82083514f8a1ba5647b13deb63106f38968ebebd777494b0c9657ba4a15adce84b85ec758cf9eda088339b6eea2c5561fdfda06183e1345282df94c36be60ee0ea343e5fc1f76e436bc60f26c7b7ab65f4608a98d2e18ae4be9cd9bc8535ab4c10563a566959cf2ac6c09da82f9cce4b5785af9314b74f0d841861736b450c7a59a4d116d2f910f6560230be6f324f4945905b99e62c14ad7ba6e8bf22aee5a512ef6d3a7bdec25465730a7d4f30a7ab9b5d91d8fd8e1c086158ce921174dbef40d6c54c120fc3494ec698f8bcf0615cafb24a92a8f73136c4cc1586f31f73b093fbfd0166c48c15ce9f77bcb4636a260acd3db4bb93d237d041b50304925766c7d12591ae3130cdafee97f174708d1d97082b9e6e3457b36a975afb3d104d3767507cf498ac8047312dac389d9fda1dbb7b104d3e568b2434cdf24715382495beed265f2565e5b36926038d5aee3a7dd46e9910d24985fdcb254f49344d1d8c6118ca21e3bfcec67c8f8368c608eb2bfdf27df16b0510463a7f4add75f2a69fb88600cd52688b25cf2894ad918026b495c6ec4e552d7547e0f4a1b423068ef0fd9ea211b41309914849233bdd2930a8ed8008241e9e87f0f1edfe36cc0c60f0c627e1e54c59096c432011b3e3057be24e8d5d2ff91131b3d3025492ceb24289f07660b19f59453b664e5367660b46025cd770a7e27ee1bb0a10393a0b355d0a6c49cdc7a2eceb832f11af54eebacd93fc174ddc38531e5f357ccbacab3a41ab7306d293f49baec6c72d66c61ca3989189331792aad8561dc646ffe52ce94125a18c4ed7596124a3eb1eb5918c3f24249c9446561beb51cfc46fc9b074b2c4ce24ef7a7609672c3c2dc71727eccbcf519ed15c6efd03929b58a7a2fb9c2fce1dda2637b5ebeba1558a6ac566e37bb9226a5c5cf41e7c9b2c27c927251395a92146aacc2282a6a3b4a75aeec5e15c6d14eaf1dd33ac7cea5c258525b0e2f17a302b970332e97565b43a4496652874a76965398e43a2d53984f30417d5673bf4f580a83752871428b986de9a430688f1e94bcbf52265b46617aed1c4d4f6e51984fcad151d27ed2fd9650a4556d1b6f6b276b17f4b40932f6bcb5ab041446134bd962c9b7b6757650e313469fd1b9d53244bbee0993af97ef8fd04955a83bc1cdab66da5710cf4e31cbd924f9d7928436e1c30993dc9a32e93b6b688b6dc224bf92b85f982531c9911c270639768c3132f2c50946446a68c26c72f62b49b2d31db723038c9419a89109d3a8929275fcebda5c70acb54007185803130691b21d74aeb0d42e71acad8e0d5ce230cb15e4d6e2c5c53b669920fba4b4a0053a3630868e2f44445aa0030cdcd1638c1a9630f9ba99a8562722d4a884e9c39ebbe76d33b97447ac8c1a94c84a3cc1c29c609011068a8888881cfee204233b6a4cc21c2633426f8752aa8448504312a6fb24464c3249bfc43b12063359c2bcb2579076d58084494cbccf19d294c7f88f309565c95b727f76cedd11863fe9753fc5aeaf2835c21454b81613849b9ee5cc841a8c309c27257aca6d1c3516618ee3f329459aec972e351461ec24769f5cbb9c936cc231814e84c9531cd13539282989fb4c0f1159abb99ca564d55dd944a77d7d8f1267cbc4b126c24344e410a6b41571532a6e0883b62b4189093ea693ac1086cfe14b8858e8e4ff13c26872aca8d369ac31089312afd610844994b096d11a5ec2f9350261f6512b2223644c4a926a00c25c63b2bce435499063a9f187d45ac3aedd662cb4beabccaf24a984f1fc60b6203ba75812e45bf69d478e304a1f8cedf92bfdc97af12509831a7c30575c32a51b62aa4f4c0d0235f660f691969dbc8435375f0fe66c2d8b553a79308a554af24355ea49610d3c18ae94dc95db42fc841a7730c8efe9dffe24ecc8100f1e070c2fa050c30ea61377d7501a4aa5243d47a85107f327f943892777ac9c950e591a8b696dd9d5abe53d73e7cb73fadfb16accc1a04ac7537147949cec6bc8c194397bf29efa134f97e2601491fea7739244e6e4e1605c8fda59c4e4de60ac9467fc73ef07cddd60aa586da5f32a25d1736d30760525b96e7ebb497a3618de743e3bafd43fe56bd05d4e342b4eadcd6c6caf24194a3afb507f0d3518ee7292a2b2278f932e35d260dacc9acf6277edd9a3c124e6ad2709759b16eb3318de4d9652aa3783c97476759127d766b635ca60f6e829435f830c26bd9fc49667dc78d08f5146089650630c664d3d53e2abcf6cdf0fe3ec381ef831ca08419d180c424c989f53d2160693a454f8e5360fb750030c2693aac5b3946cc2a41cc7da18d663870e0f94b1830735be60f88b8f3da215bab62c36022f6a78c19c93a685b78aa13d45ab0b860f4a5f0825286b70c1f09a1d3eab6a5ee8160c164ffa87af12c74aa7580c44448ac5008bd5d082e145d62961f4c9e126ad9105d3c92a9d2b26c5a7b863c1bc23adedd34db8d73304a8c6154ca225f541050b4a556811189fa30222223c940b35ac60ac1291a1fa556a4c1611111129a347193d0e0c35aa6036edf94b87fc932aca5430070fbdac7042df4eb0c614cc66e2976052c5fc93f2480d2998dd4c84f7290f172f55230aa65fadd08aa7e33cc470a80105e3883137cbe997e65736d4788239598f5c874b0e359c6052ad255ada5911213b333bd46882713f5a9db0f9d60e31c17cdf9fd3aad4623cc902359660761d755d4afefadbf8c5a1a186128ca334fbfe93defbeed448825945a868d1d35e03090611ef624aed4879d43882712b27a955634bf5eb358c60aad2714fbb67358a7049f59e939c938808e6bcad1ed76e8760ca3d9693206ad61082b143c88776d3cd16cb04358260aea46b72324185ab076b00e1b81433d42a2c8ab8dc0551a29399249552a97d8d1f984d8b56b9ec8993278557a8e103535a9b8eae257b37e52fd4e88159fe54bc3251e228dd77176af0c054655212b45c8ea2c4b90a357660aecb41dbade9562929156ae8c0ec2fb626a77acba83417a63a93d159f726674fc185495b363b55797953c75b18b6f52d4f126267e2b7854992e2e38492dc249de46b61da2c71c2e4f0bf2047b43095e898dd3ae29f4d3e0bb3a7af97deb0cb9eaa2cb62ff9aa97f718d194cb0cff112d37f2d6d758983e4b2e891f2aec85889f400316a62057c57c5dd42f582840e31506cd2c61a927748539e8e832ff68263d7ead307750f31d2e8849c29dd06085b1626a8b49274cd8b88a4a442c058d7313b9e4a9654a7d2e5d5285c9a4dc135d52a575b469a4c29c7b92d6d1d79d63e868a0c244c4a0710ae3e9f0bd6c72aa18217f8186294c96bf334a95a814e65457b12f7a92e70f29cc96dbe6846813c4098d51dcdab1596d95dbb3725766774e7b3964e7474314c61babf4ba8d7b1119258c3030a0d7081aa130daef99eca26b94924409a0010a83ee943e477bd16b717281a443c70e0f9082c62718fd2827e5496ea5fda5e1897225f10a9e69736ec92ba688142d1f3a343a612cab1a2da59495bf7881d2061a9c30ea7e29bdb9563672b209938e517313ed0e2db7266864c23452774f3ee5d1c084d124958408b52694d20b8d4b183bea89a2a584eaa4a338a0610983c94eaff7b1e4c7e98cd8256854c214cd3abf9e5ea724323174e430fc010d4a182b889cd4de1eff91111d2de04998d489bcac354aee73342461504a968a7f13644f2ca9c3412312c6d2d7395b6ceb8a2e818429afa249ad79162dd5f50873e724faa7cfa9021fe82277f4184305341c61dad5ec3b13bc4db449238c6fe349845279d9d1630c1a8c30f98c3e396585e54afa45987784567dffec52ea2bc27472aad026428930ca899d3584d433c10411c613ccce82fe52f92d3a84c90ea58d7d0ce6d131b99ebfa453178331d43e5cc949dcb03b0ce6ce7fda2c96121a623018f6f6ad57b577c4fc05a38667a5ed9e9cedf582d994ac1b66214f50d92e98cbe43ce2e48e2723e582494a9ec47e1243883db760becc933abf3c5a30c7198f9d334e8e9672b260d61e19f723c3941c1e2c98a4e774cb39bc82b1fa0437394f50a63b2b98ee490a4af96f55309c9cbea4b04a3a4aec50c1a8a52459eb3c9e5775a6600e33a6e4cab625ea5230493af89b641e6b3f51309d0e5f927842985c262898d38952edd1975aa6271864fb4f2c37f7a4bd130c9f9e6fff479714e44d309c7fb8b9d7fda99d09c6da927d7e76dfd1b30473ec8bdd211e2598c4934f1246defbed4930b997f02aa722c1302b7729777a049324eb884b7ffb4ba9114c9ee197cd46adc6590493d23947f688a9b19208e67c5f4afcb786604a4a89a14f905626772d844a5a4be6a6b420986d4c7de7ecd549be1a08a6989d7f75744f0e57ffc0f4b6f7497e75137bf28129c9edad2408f5c0e89d742ced3d99ef06e081e13d073542895795730cb003d30735e1a7fd94a43d06d081b1ce4d2a373fffb773612c95c4649c50212d8c0b939457413f2b4c32f71626b12a7755fac753ad2d0c16949949a7933441ad85d1c452525dfe9ba0246961389df3293a09cfc25c2a999c6a45ee7e6459184cadefcf6468bd90d1d0bae51eda6358982aa98e176b665275fc0a73f2934eac10d54969ec0ac3a5a4742859ab152e6e8561cf6249692c668541c9392959b7db7315afc2e0964ed21fc444f6af0a63a5b8a763f57f50a154183b85fe977b4b9d765498f78279c7abb658fc14263b25cf94ae2eb724a630f9f86aedcee849e25218442e5be9e7d51c31294c52fcf2d013fbedea284c77793ea814aca2294561365d9e2be72f58284361126f3a7e157b1b27288c25bf6be8ac7cc2b4b67e2dae15ba454f9883d88ae7c1e3f3a913c676937d494a61ef72c2a0e2e83823dd8471e5c38cbc6e35613c41df7bfcda4c9843ed9724a65abc9c840983924a6c334bba84d1664669b38d1365b784b963f9af8b8ea2049d4a98f7458ce55f7a36694a98f29994444971d47a3c09f38ec936fa490ed6b1244ca2b59a4efa499ac69130c8be3b3929d95bd9a29030e65ca792e3cbcb84fa0873d026b9e5b78cca9b3ac2a44596faea901b61ca69ae47d5ac2dce087349277c92e4d637cf228c1d64fdae8692e27e45986e564dab2849844984665e7c10617eb79adb2b93c5720e61de37d99125de49721bc27852bedd854fa5212e84614bec92ad0417b92c21cc714e0af13987748f0ec274769593d20561ce490e2ae6399dd52510e6dcb145c392546a41409852ed5ec9dfec8fee0fe65b7baf302d294e7e30a59c1d1643d594ccfa60165d1fd2fb3a7c306cc7f10ba7b407933071d2cc9cf460dab279fb364bed7c1e92753bc28329f324fdafa6f47e0773579d68b9ce04b3123b982cbbca24d926d33a18e6522a19cd4b62c274307c2ee93a4997448fe660306d7df3a3dc84891c4c793fe8939f963898f4babfa453163818c4290f791f5765cdf2065385f4b5a073bc1bb3b8c16c6f620853e165d652da60f4f08af739e3be95c206b39b892fcaa41725e8ca1a8c21bf3c49d94cdcbb8a1a8c6772906196948d29a5c1f84905d55919259c8e0653c9f5a994fecbbaf6194c494961e664a7744a6c06b389153b3f85abe42d96c11c4f599b583aa17e22194ca62e6752aaecba0b8ec1a08425ede6ea9fe68262308b30f5ceaafadc1e86c1f4ef614f76070663a67accfa49922831fc82e924714f8e6a3a3a95bc604e13ecabbdd287ce77c19c479b9c097565a273c154b2e89c67cb948d922d18735bf694e79c44eb68c1e4f5bdd57766c12c5a436eed58309a8e2e215bd1a3e70ae6ac0e72ac3f8897db0ae691efb89466ba2bae82d154afe9cba24b4a4205b3e8ea14ad7f3f340553972cfbac2d2ac7560ac6dbda17a976c288340a0693548be93e15ef040a66d1eda1734e2b25c62798f4e4f6be13474b122798e624b992922595a3774d383f7fce6bc2c4048390bb3afbf92598fc82eb7588fc355f09c65ebf32c90495294249307a091f265fe34f8d90f0dc69b5bee908e69096b6334bdc2e31824197923a3c9ef0962e82c9ebe499579d08c62c49fe0e4ac7f29c0fc1a0669f443f4230691142e7f85e97eb098249764b15353f9bb0190826e16d3fc668f14ba23f30ef6ee7d82bfe39547c6056cf77f28979d22ef6c078ea7dbae6f425b9e381a9de5456801d98a4e9133c649790632a800e4ce993f8b0a52e495dca8529c941efb6a7d125f4b830658c3ea1e32b7ff66f611495b49f2897440b215b98d4c5ce9df6d7c2989e7b3e4dc80aa784162649501d4e4a9f59982a5fee34a7a15a1d5998fc52b5582c11e3e1589842ed7d8c530b972f2c8c76a9b4b49e9612e92b4c6bf5a684570f3a565798f5ec4df4ec582cb5c25ce5254bc7ac30285946ad5d0773731506b3551db1ee245bac6ea8c2f8329761fa47fc5c375261924acb838dccd4ce5e06375061183da32c644d580ada1ba73055123743a7cee12fe41ba63009268fb6c8d751e9d78d52988457d349bc9366bc1c3b7a145298e49284c8872c3f39ba6ba330878cf77ca5633c4461ec78a51d2b542835d95018c4e4cabfdd31d7b9ea4061d29f5d2243658652aa4f18d63c8f993e314fddf284f946bbe57677f10d3b61ec5c0f93f3c70963a8a8559f4bc89b302751a2598df6937aad268ca7948b9fbb97c921ce84b13f9f294f3ae81cbc574c9c24955b77e42c9c87fbc625ae5461b6dde5ed533d4e0f6cc06f58c2e09d93a05f33aea2c602c6186160a08c09f0e0713c1002112cdca8843996a77095f1a673d439521a310c54a00222222351b8410983e59c6fc546bde961e8244cdf95d2892d318eb5ff1da9b4244c953c9465257946c294474e7a9812fe4952c1b10609a39c5072e193a4196ac5b1d617b8f108d399799262c8ea33417fc311a6117a54e720eb64cbb1c5c08d4698e4f06149caff29c69c811b8c305b9abfb019a204354238d6346f11a6bc565a516c64f6b25544183a7410e0462290183964200619356e20e250cb3e49cc0f110f307e64878e91314e186679e310dcab9ae5aaf612aff6d2d2a25a4ee3fdb2e771b47b84916e18c2b0ab7552c4f61f00038c1c1a1011d19163648c429842e54af7b80961924f0ccb14ef70acb93108f3bc09a3834739704310c64faa7122dfa13c3dc53a702310a6edd9eb3839f1fd18202cabd0128f3f9834d35e7d4ce40763ebc993e2754384b8f4c164529266d536574a94cc0773acd87e4f2628a94df6609c1197a753a718a91ecc569da4e812f432c7240fa6efa017f27a2c3daeb4c383515b3d7d4aeaa526e838d6380437ee60d01e21a6afd3df73c80e06a5f5db2985ff532a098e35ad8329aa85d077177f564174830e061d3c9596517b920a4a1c6b3d07e3bac54f218409ea2bc6038c31c2c83132a2a723c7c8183cf28b138c78e0861c4c96e49f30f3b938984d1825bf87d072c265389852d74f75923d37de608ab677d12a454b5ee21b6e30e957132ba80a6e928edf688331457c08c71a8f3074ec4846811b6c30fc5ada4f49eb57fe6f0d0665a1717184ce31b4450d2625f9e7a4844e920693a8917aa27c43833662b152c999b55cd7659669c71f79517fde1b6730b97f8a255f7622b86106a305e56e266726a3021fe8e24619cc27cd052b49924f4723ba01094ca0031bb080de2083d92c49bdaf71b3bfd28ed8e181fc330737c6609e190f934fe34e509288c1b05fe7979377bf430737c26092a27ba31fc777dc1711d9115b3018459bcef3f0125bcc1b5f30ebacfd87a5d2297e7bc13096a4b9986775c178d104f10d2e987385e84e616125d8680ba6abb43c694ae37392168ca5a24b123725bdae9c055312840e65594e97ef78030ba614a49724ed72ec8b3c878e118c581837ae60eeace8f1ab244195d0ef0e6e58c1f4a24edc73f8b8979e8e1e6394b1c3f577e8f01edca882c173d7ae6bf65430e55ce9cc92494fc1a0820eb758495e0aaa6cd5db88855c8e8b6692a022439bd2bd200ddc8882d147c46559896e9dcb1e3ac000818808fbe006144cde41490d4f571b3f3dc1a015c4967e497182e1c6c29eef5d9aa058b57b850baba92587e95df5b49cfac30493c9ab5936429897a5780e3012323c20222222222262b667071967240d3796609257e4ce2adee8bcf90d2598f7a44eaa74ca3e13db8d24183f25657e4a2c1546ea379050ac17116fd92e1575f31c2709fa3eaf590ca123183bc4b5fd2f8a18fd19c17ce6bb278e943d55ed46114c2a2f458b78b5d42797c00f6e10c1f83defe142c9616723004ce1c610ccb51d2b489318e4404881e6b32e5fdc1082c993fe0e3929cbdff4378260f67b952f49506dd7496e00c124668e971cdfd2d7fd8d1f984cd0aee4f1e24bbcf3c195ecbe4ebd6c5bd3e2c3fad2647a6c6903377a60523d3d61ddc28e123a5eace0060f8c9fbdb49d28d7e2c9ba11dcd88149525fa3de54bc93a31b3a307d4e69b493d225a7b7f4183672616ecf3e71e93b2e4cb1b52d4feaf4ceb215bd85b14d9c753dadd2f17f5b9884381d4b85d7ed59cb0b6cd4c2b42725f96413e4884f1bbac0062d4cc1f2c7cffd493c95100c1d3a12306cccc2a09360724ea2a76cc8c27c3baaca3c9a24c9c1140b93989c7489564a9592f20e6cc0c2b827e6e6e9b5e492546cbcc2a0adb5a43cdeae5efa0e1d2362ec780caced78fec2862b8c62493e3e75ce92dba41506396ba2844be12cc8c80a930aa1b69ecfa277d8e929f0639411825598ef248fa6fac367d5481566cfe9e3a98f492a0c4aec9cdf17272ebd44c595b4e452bc82596e8fff947ff2a90b9f47f6400e30c600c18e1e3cfa14e6fb539522dde4050b99c2a4939ff292e27b0f8f6ba864efe5d268280e8703a260281008040cefab0023130000000c1c90c5a2d1704026edfa1e148004593626423830222420148e4603a148180e86018160280c0602828150280602395888745e0f07f740bc92de1787fab5e38e3b6c61d8898dbe50487fa9af90673ba5b947c15db706850a1645464c6db1c3f4e85571413f2fae7717138bec9b43f0141685a492fc6754b5d73e0cdcc15fc8097b08af9aba08a4d5859861a83e7eca5245df6688966ba416391ed82930e791217004453d786b8e3ed7ecdd7818d46107fa72c558c44458556ba98d22348c3a513e96e7ed52b98193de2f561ed18eea15ec4d3dec5cb5b7e121f4cab8c16e1fdb6e8b25f77bdca8c4122d95e631ac18b254ee0954ef6f2bc2d7fc75c485ea966cb4db1701fd263f621e6bc7e975f62e1940ea46f3527dccfd0a25a7d412ab963eb4291505ef2382b562072e7696388827a427e37afd40e15a576a9c8c5c79d103e2ba6e7f24ce698abeff4e1a4b49f1efa31cbf08b42ccbb13ebc1bfd4f6d29bf224be39dc6fcaa4633fcb663c041e4a222e73ea42b60cd110f167746a96d324c65135742a4f6d6e947c735dc4d1947aa467788844a7bd137ec41f704e3a51a395f5e6b57e979b04da97b03f5baab8720b87d0f9dcd965e71ac2e68f01be7b263d6668696107a564a11ee5a378bf7611f93e7a04ed743ed15352c00806ca5e04111743272e5fe8bed665da32f3c9c1fe2722cd7c575ee9a9ceb5ec298b2e73114dbdde29b4a5ff4deb1f48873d8c52203ae1d98fa003ba39f9d13ab752a1e496f8c83fd7a61238791d7b0bd62c72d4665a0d458db1ebf2e44724cf0df06fddd309766e85526700292e03952e82bf224e3734ed45905671c1a2fd5e935b95b7422a2bb8b6af3a7e8e09d617a4bf762a4b9218ee842b5ce442828a925179a78d166e5349d293c6c4470305e1302176a1b3a62b15cb9a4d441101d13a55e995c7277384571466ad06c9b9fd048804222c738230351b5810ce3c27549dc46bc02f89ebeda7aa7bef3854200be8293b7ec1258bedd99655a072fa69290820bbec70b88fad5fddd7fc59bd4adaf8dc0c324ed04f9e2ee951e7a5fd8b7119fb84819c5b8d79effb430690dd71055ff28d370d0e1a06259211f50cc3712163a20854214653e40b9489bba3cdacc71a02ff88548f53555ca02887d0422fa3fd730d6fdd7d9f0ed4967c754e5d82c04420e8a6d2f05b90fbf7c7a48642e00b281bee9a72843f2203e4485531d1a79061edd1ce48e0a254cb4be48cecbf05dc10be05bbb41788620d48a3408ba5e9049310adf3a21f850c689a6202b17dde6f409d22fc301c2f63ac7a202dc9b866a8fd037fc4dfdeabcbd25dca99d5416805af2654717b0c55536e097a10713dba43dd02655260f8c04840f07d6b07591158827a02fbf90613087e7bd9e179084833659757e30d874c0ab231052b8fc8e65da72218b5bb6c4fd83b4c94eb5a006a40928b1d36ac3890dfe5d759252de4a7bc0ad5bb248328f3dab484f58a278e85be8416d6e2fd6d1d13413c092ed641b9d32e8f64bb7f004d84c06e27d41d1c55137b1f11026889f0c860b24266ea3b0d70131b941aab2d0888f6d6e2fefbc16f40d54490cb751f2f00964a1778ea5ee8f166fee89608e8261489b536bab6b7ed0dd15bfc6b37b1a2328dee3873620db4a110f7eb81496c05364201d0d5599e17d9c4900a619b5d5be9039d9bd8486dbd9212f61b825e49c7266aa56706b4f9662b2c865b3f0ae6b584e9748e96fc515cf6770722c06729d4ec0cc27e8e0804c295efc03a76d030fc9da39ff360dec3d655aad24bd12ab852afdab46c69c828082234c201cd7ceb44046aee52392a52768c7f64d0d3452d490bce32e1144463acb7fdd40a9bee04129b8185c15de4897281e225ece4a0df243ecc35933ccabd70ca586bb147216efc0b0eb0011cf0ca07009c64f53a94c412e4035490a1052138fdf44e737b4524e0ac48ae150db0e7acce4e4c7aaa59d470eed83bfb76cc99c4d694b7e0e6b1af39ba9bb9f7bf6096d8260843bb92205f956ca63cf697399faa680be838f9019d8565f13299c8a2168f6ba17a6f44dba8f2be0b76445ea8d190d6c34748a865ec9591a95fb98f5dbdc947e35ac12403c83a71aa6a6f558d7efdfdd060022b4269722b67975fc45243ec1b972c22c1ff7c30b7d6136785a56f7ed6e931255f29cde070dc64a11c6a5220166c44c6c31547474e7b241533a9f68f7e2188a8b8d9e9a1c42fd801667343dde54d44abd1c02eab4f97637decfe0d0e6d6cdcef93d42e69f83dc4a99e226e42ceaf66a00d342203af9d8e48d54b844f592abd77f5cfbdfd824552cb270c8f5f6c836d5ba318eb82ad371179fd5d2f66bbb68833edc52d6d0364a5d396325fc0ebd058398441466e275e03a4275d18f3629a35fe6c27930321e2e7aa031ca09ce1999580fa44713e378e9e8caec94ad1917cd5fd0729ce192a0221df15b78952208b698b1db162f23baed325e0d1b85f36e09f0a7598a6fd786c68868c9a9597c6b193a6d27469d73f2c1885a94971a90208d0ab57332dc20a23adae08d071e6f17ffee108bc15003ca8b35fcf9b5302c71d4e9a85237851ed9da88ea0742d4b85abd799c3678d025779b89358d4d4e90cce8694c78f5a42bc2006583fe3a7ccaa07c6e47314319865b7a5b3907768b1fbf6367c38751d6a6ece8b686f8fd0f5fa010a70f015f9b01bdf4be0371c98fdb8f05d66008242fc1b9a62bc7684ce72aea3143735d15c49400bcc614829722377858783d6db6215745ca0069cca9b072ccd1df8c30d43029060c61b1158ac4ca92626051d40ce2f8c44da6a0978c30d09225bcad0b650a0c9dc69eb379ee151b0f0ad87da583db8048e952d67367d629bd2655a7b58cc70720f236d4f7b4bbcad172998b45197862262a99aca439e22c6427a28b48f7213d57958e5a12c1f5c37f8e0f0ed0a20d8769f8b0e14528d3c480f91646a0b70a3714d07d91f89f64c8e56278b290e00040a80d340ea66b88e72f82a40e37aecbb4e88a2ad4bac04ba116c111855e1f5f21e6c808bb5232109a9da5a50a5b81e8a263bb5de7d0c643e53f4e82131624e2055dd665a20a99a83af69ed0fae63db41896fd0d047fbf12cfb94ca2266163e9df02be69e140440bda82a15408a28895677da224e92198dd30e6a98bc988fae40db589c8e594c34ab961ca8cbbb0548c001855aa154a5877e8ad0fda9bec92d5526b19790b0d3336c8d2a0ef21ef2b69f889e66e909121a8ae957ae966a593b000b86776c02543c594a7566e327130cd3fc1e784c464bb9c9e0ba68a1f1747066e69f26a6870684af4731293de40a4633aecd87d4f4132f168e5900d8598682072352493b92111aea8e10f09733bbca0a13b58f01a1b7520b6c5f4d7eb845be6cf69a2723d1a3d75e8b6ccab9aeeb93331a0b3f0da85d37a934b0499eedb60a2c4fcd90cb5253d467058e03402653f53660c64d0e0a48030d2db300995ee86433b573828130e1df662044749e5132e23f40a410c324751c32659891e7fdf23afcb66e0dab28055e550bf7d974096417922adbf12a9e8aae4ebe49890c425f72890392889212328ef77820a13051d4ef72093be55fa025bfb7606b9a6002731613f6fcfb8bc12e5859f20a685a8d3dab2c5d97572fc01eae327f7839098ca355196541210ecaa5865aa460e31219605de7c62a630908fd3e5c330437f0101c179033068fcd0978c61ba4a516c8dc2024af4da5efec2d61e65326c62d85576e2ba4be659d45a702fa0a1ccdd348d34a265b0d5f2c3c2259d5c815602805a1235ae72a54df006ddbf854ff6afeeaec02dbfe2218c978b59bf0974e9a4a5878124079ac0cbca1c2d41f448e1d710e121d7214d40b7138dc55b2c6516672d2f7e13ba9ce8b9278c2a485ed195011b238fbf7a7a07b76b0a13b1c58043d92af696b7a64228e835c350d47b83b00d0d62f209e26ee89c7b91745f7bffa210e91f81a15a124f291e530d0071baf9a679378d4c8f0a036cc76343ad5d3cd59154aba45a42376e6fa60d3eb4c47d15b62a506602d7b64e2db0997283f45bee9de80a3850f5cb9a0fb8505ca9aabc0b48f5e2bfd19debf82904199c8a6cbbceb7362d21296b4335989acb64bc4842ea94d8fc95100b1ce605108cae56e2a8f73e74fcbe0a318a0aaf91fb1c9e2c3822257a280bc4c09d69a389b83870c3155ab1a7faf05768ccb0441c23207a89b153e4656d6c8eb31c62b24ea0db649fa7ce8514107d4a54a17c86971b732c3276a2c0e11b17f6a2a97308abe0fd1aa886b72b1a2780f05c0989f69d8b8b3d71ed94a8365197580b812e870b9a12b8b6273b0b3af22b90ad142ba732d2266d4b1caab256e0b048172cebdd13bd2d4b0cfe7528b2847ecb696686f810d9b82d7928bb2369a2f1a4f92f13ecd22a78f7ef0716d1b32503d32607df515b4d0320df2f07804580ac8544ee0a304305c55824d879b07f17c78890b00139a706575f922ad738ca99406743357b6a02fa716645f966eb6a3c574f95114fe330d2695c587e752300207287f189aabc5941c6403b12d56e8cd0c6f73e0e0d6f295966bcb8595dcb896e16daa8d1d3eee3da7014941b3146802cf2425c278c01b884a98e9b8535a7451df41bc4e79ca69be91c866c2632ca41aec791888257327ae082328c62f28d35bc4364d05e219fc862498b8cbb57ec9e30e0a38d12acf2d18b90d6b2cb3610b26a3f5535b9e497b87c7a4e47ea6279229d647312040799e95fc176e7409255d3b373ec24e67126a43cc4d73887f8fff6481b9f7d4cad96b21d2de773451704294d8f1e8b53f8d38654554a46faf1e975b8bd7808f7c1476cfc3505bb3b1d15ff6f060e959adfdc537201e0cb4b81bc851c87b9b2bf2455cc3218d3a0cc1be3269eef01d27d1440ad0254098210a6093f7e1d1029976410530902648e93ee6370d3a62b2bb09a4c9be383b746e04a849752f306ac8315a5e32e8286bea0e486dfdbc6c584392e29d72f085e6cf9a86139eb312e2b92e12123dc6447fab35af71e8f91e8c8c877fcdbfa02bef4c2016ff38d99c56995680c754823083da63f041c3cdd3a51331c9a97528eca29a96ceaf45510f8319af33f89425278935eaf3acd87611f9a831dd343fe8f43b4fc4c196f037784ca5586a13d6b9ef438ce86bc404ef55f5de3de194ae97aef54175e66995f8631843a1e4c77dc85623011a6b2244d8d83a2f14a451b283ffc11595b114f73c392fd8856502c4abe9ec0268865f0eaf6b8cb06330786ef8ea0c162b7bf67eef6a574e981344105542e7928e719504c12200790671efc0ceb9043f4d605b89cdfaa9971f4fe7a6248c63f89ea41d5b765b8811f48b96652a33b36663d97b2e091ae8e6699a2d46451eca1e5c891134672395e857fa3b65eca21a256ba468f29d2b8e549a4624a25d26f79362016e2cff01bb2f81e12c0bb3f2d9e5d69104acf6b1dde806c40a56850549837e8876423a22a2d0bb8073a87c7dd7bff2e00ad08d52977da42586b0a05f6d9c337312d5cc66905e2e47ba782fae388e7f2935b0ce890ebc4036845839155b196a3e69ad3fb9f06f3a8d1f6a1635da5b25a2169f0f9549ada4430590a3ed9577fb0fef34d2f07c8d19deea8950b0933b25dcd408d81aab8bf01fbb1bec9442705054145840183f59cf7bfb34ec0e15f0d0b4485f78ea9ab6f331c92621cdf0bccc3b552af5fe44df324a46e24537e3e58eba17fffa13a79dc5c50496dca020bc0c4f74b6f23a6fd601038ba7bf10599427bba10e60b4d1ea55f377476da9a1bbd62049c9e67eab2508fa744d8c6de866c3dd245e1f04aae98387587395c7f7bd833ba41c347530689c28771a89103fb8abd6813b9e3c822d1aef70e397ce54a9b7b8788d34d43e82e5172ddae87ad945ba4e596a6deb2ad3769d60354c0bb87c7411a3d7e8890ba5e845078280918224b1950a7929c436908795d9748106d0a4fbad543491971f07a76ff5afd0280a16b3eb89f342ede065a71d72cb5d94020754f065d5d631c372c1b474b3d57bf9b2ea76bceb3e81088534aa09ba1e8c7595f6cc155096dd28c7b0eb44edae38a106bd50560f395719c1003a5066d321c7ab5522e2a9ea220c4116b065f89ddb43f3cc93459c340cb1acdc2c9f9d56521211c39dcb8409908129ef8029f141734dc1a1b1f7928db6e793ab1d7c148003bc23c969479c1acefe14315d6af451b031286d7a87ed7e913817a53c5bbe7a8e27c9b837084616ca5ea9441a415d3f8f90fe747ec6d4508818f5c9e74738e3b399694821f2ebec1b19cec2d6f138154345a0560ac98420ff3b89724e0a924199a18ef9ff9f2dd5f462fc3114f139a020ae7f3450c03273646bd48842546e12ec946cead388915db31b13b306f2a84b3643af45799f49f68b2ae8f2e30d4f7324edf3f5b747c803ceeed0158e029b286e081dd26bdffc398581ba819a1e135fcde141ec482cc0b8084af5f84b2e2e968490caf9007dcd5f0bce1cf5d75785a505c6a78c87140cbbdaea6d5964e0152b9287c84b0a40980ea62485169852e4d623d613775a325960ed78a068f3ac4fe6d4519612113cba13733bd2c112e9a7abaf11641f0ca7cd73505cbede87664adcb8941341aaefcbfcbd92c04bbc48a5590cffbc3c1ad89814b1288e24293073a4ecd9952baf84c242da82ee0a5bd291ab6a02b33252b6a151d1a861e75c768578e8ea04af5942148cf52b1c41058cfc8c36a0f7c352fb6dd7b003aca6de4349df1b7c4e3388ceca7054e75001dda1670c6df98053ca122bd4a2e3e90fb2f3f22e52d2517ff413205c2002f44534d82e8a7a1e836b01ef8528b23ec3db307cb1dcab66013d1624809bcdbd1c961c730ef6a7f9306c9735adc94ffefb6c322960607804ff10beac4c1ecceedcfd18a03af372cc3f6cb34980e935d25137cd07c616603be0f4b2a07ef4eeef1e5eaed3f51ae8d09a84d1deeef6af7e3699ec109279870a2a996e9e5c270b383649669577d634f5731735826a6da888f2771a338da994fa19db03482cf63c7f4d858986c89d73a61f16483ac471bd5943914db782574664ca56a1318368f43aa2f053c153277374b889b50106cea887746cd5e9e02aac46deafe20f4764d7857ad46394a242e5645c8bd5ec773218b2873583d20fc5b4774ba28184cfe694e1fee6e4ee3ae3a9b9af1b61e2777f68a38c1f72f6266d892240891b4183a407fb87b9feceb35d5cb0293349227adaed99a40f15a038ff3778692c02baab4d27266e2c7d5ba014664887a5fe2feb2f116f50122669a6a75ae4b8cd15cc58c7b8145fc2bda1de8322aecfd147918167abc5be6559478c018373c21ccd187521a5f440c26554f05816b3739aedb41485ca35185268c62f87cca39812baf86aae5c21d6985dc8c2473ab5e4db1f96a153ef05f4525804ac8c7ccd8692d10ecd6af44af3ceff9f22a28f684c718134e588ed8139ca63eaa1676103d7594fa5d1ef0534ec9adc38879049cbe26e66d552fbe35b1bc6b26a176bf3b834986d120b823e99f9acad1561b02250f2965633d6b142783f664d1c380c029a94db6efc0b3ea82b8dbd8a4d393072bbeeada6b172560feee9d87a146f9a6058406b30e16ae1d34c3e5203ed9537a11b70a61c63c3699e246e6dfec7f871088e4e896818cda1aedac26163aa7a9269aff9b8606f807544230a1a7cfd465904ac3a727ef7939123596ae683807db4c88713506ddf80c729205209b1be0f0605ad131256eb677d6effe4902c6ccbcffdb6d4a1be14a816b271509e3bb414d7dcb58a744909edcade6d0ee86a8a755ea69da0473325b2f345ebb53a0424899cd7222a660a3b3cdc76da02986e9764d9ee7781b7eb292d374c938e103e623374f45d860f55701b37e769dedc632108cbded1a188fce19f3e7124159c8e8194c311cd6752c6b60bea4327ed18c309085ebdf4610adbcfafa4e26b525cf32d4fe03f1aaa72969550e097b4c8e01db0c1f8cc34b276bec17860dbd883f8e211cd5dd0b7bd9f43b210a03c934a500edd4029215229896fcca6882ff41ef68bba25e8694c0bc06b5deb0a092a0b283b20bbcee99c2fa676532e92325f30d3889a57bd43a008a8d9deb567a0793b7d0e54a8806d1fbc2f470135ac9342496b140ee76cc343c156717c80d9a96e33c0440977054253678907ffc47128f0f0fc4b02c202d55b0543061518eb029239dda72cd5a4c553ff78df827a0569fc41a055e5db4f0e99daf4906ad32664f01ad9cd287e93460e97d20478024b7c2dc04dd5aa1bab89b8fe23b15ed82dc0b13b3b5f69646d0312d803681a2e599639667168e271239b59b7c969f7c000a36d14950b2610b9823e2c4d0618430d2391de33a34a934b8c36ccd273a397a9ba33b2028391ef17155fac62765a106c8ca4466c21fdc08b4830e3ad701cb09043d8c8653876073976c44f90905c17d03158d47f35ae81a337f27e670a17ad8ad148731d346490f05ce8a0c9db1347be4d3d4e0cad632cf3c5efbfbcf2cac3a1649741129c65a6a18be716d2d711057b66b449ea80d36da878bcf492abb6bc8f8a18b29fa90bd234de11baa044c48c2fb2cfd950ef0ebf632d004484c988c2aae95f42edbd6fca9454868ebbf88fb3232b0760e3f74366a94bfad844ce93d01e3688570c0d36073a5b102a4c5b62ee4c0b1c41f5072ff692d16297d03f4a7982e0b99ca08d16e29fd0041afdecd6a110eeb6e1df2815f83107f3b88ba95e0e7d59f704a38f05050e8cbab2c32911161f97698bd3bcdf88c51c5f43222897c611d95a4568ec9a4d041b00e4d97715aa87f64d248e2e7f6b44a228287b4beaf8714398e802f7c6264208e97bffd92843a5440b7a676432bb1248f1fda1cdfbb098abcd1b3bf6d5c02738d829f230889c9fccaa7cbf7a497e5ba6eadb72ebef2bd9cf1860a6121b20beeced5d7f51b43321775c523180c99614270c49dac48e9712360a808aac6d19c3797b506979c473464326e4ac9cf53c5a5a6d80652c61e82924ac9ace02db6b2c990115af357cd739752d83139b4aa01e1d4a041b73f4568273e9025fa12ab87f4be1fb2851e31813c2cb7804509e4f60868c5bab629457a51a3fcecf6b08c21306b13f0cfaa11e04d82c13a5a79772db16d86aafe16568024f3a6316b0a25d94d63d89cf08cfd3b7e6273dc69e1f56a52f762b1b929e9c8c895216dbcbc718de22fe4e2318b6e5d51c8779d9245cedc28bf1e7d3bd299b06cf916d054167a76973a6c8121d58ed5054a27ba87e2f5a85126302596195aee584881d3121e4ce707e3fd6b30d68dbf776f949631d9178ac393910ee48edd5b64b67f8cabfee0d80123782965fc013dbad71200596b36c95b42483f6c74c1387f6c8e0b5d2a8bbfae5f0e2686123c4270c78852cdcf11c2f24c6ba44c0c7ee2fa17525d4b4caace17531b98a1d5051cc77115128d041b9cf5802c22ad88abf0d9c37279431e955c2dd3de8d079164100fd43d30cff0e61cef50c2bbb004dca57dca001c430cf8ecfb6d6bb893c859454d44808f665845d7f96f28edf12915168d807a43913b177928f6f83dea71307a1455be59c059da1462b1aa1a100b9f33c6ed9196895142be130af6cd9bcaa3707612ea7a83f3e90c7f2a61c222d36935dc4588047932a308cb0613bdfdc1b5104dcda3c765b022b083f0ae4835bd1af2fb389027d567a29cdd90f708f6c9a752af695024771addd52013410560e71d59b4abc1c7f687dec5d55b4ea00915a5191cff1f98814175f997b9c81dd80469c847fb3dae8102a464c8a47a3a7bb54ab501e63764736eba0026a436d90bff10e735b119b464d526fd793c0084a10a2564a468dd18eeb7263408ee3c3938ad16585c0149f8f30f1f9e0b34bdb7c5d5c736c5c113b2bc3677b329c918c40730cfc84fa9b4092fb91911c926eb564ffff602d92c1d28741f4eb4b678cd5295e420c12ed8ff24a213397cea93886548531e7af2cb1c82531c411bf6074f9b3a8e46f1852fbf07ec4f16bd96fc1d4bd31867ac61f98f64c186aa0dd6bf0d2fbb9fa206165ab802905f6b46f60a52b8bf9a6d606e1b6ca4afb6d8fdae3d54dd6905deb43075e60ec128214089a6afff90d7d266331bd5128e51bb33497c4482877e96cc893c880521e511a11c38f0b988488c97316b82f9522e387022c0d0186954b86c897a080806c331f825286e760b50dd5234bed3a59be9124cf3245e354e5b330c018872eaa986e1e74dc0fa03ec7169c8b648d4ff134dacc7ded08c219809e2830922c1cb3994f08a9ddd99656561ee7ca6a4f929175d4b2d33e31026cc5cfe760710a1d39ec6c21a7b5ec25789d765acd4acc912688d6292a451aabb32719508e294d38c8999b7023d9bd17cc651395261c49d716c4e7eda87dc294a930d930834a0e148e799e9b9a0832030157b434decbb93c9b654e44c7231a1d31a4f9ea7505fae4dd0140e00ab389980ddad63ac0d0ad5b399aa00de446d38f1a68aadcb0ac780ac1079c249a5f1a110e5ba097653569155b51d5e4074b788e75fbb985f897861e22d51f2c8dac14bca38bae25836bec1e2b74d43d64c2c71968dff3f173c528cbbf43ae691bdb6cec8976369161fdbfb155038b33d018cbbb50ccddd48964cd38dda02ce73ff7faac9d04a565d2623faa3da43da90efe0aa49b273857b82c9c28d98de45a4056768b53cdd7d6206987c1ab2d8242bb132147d004d18a5acbf727bdf74224ca28c5d9c55046fa1ab180e829fe1e39f6e606538ce00a7f3d7fb664d810ab071d35dc679a36aae3c14f5c8aad0cd92403de892e30e884a74d6197eeef58e002f88da2eaf1aec2e305ac31d867fb1a58a29921fb5ed543313243e0d13bb61ea083551a8445b26251375979d4dfa7c27e196d18ab6615f36672a7da7514180f2c75a4f2148541402ae7e904d3325bc5dd3b41ff866cf95a5009759d24defbd9f1a401b4d538aec3fb54840dc5446004f49aafd0379c76cbaffbf7c53c3af474af07231dd515b288d40baad6e2150112e9b6511ab557301e0962b16f3e1e7cddf7dbcc4d15b732c58813b1bc501d7564e6532f57cbcc36c88b8f82caee9684899822d3e406e8c5541544a9610c25e79a7f94b8185f5eb9770ba7ab57f9f1bf270d33b517503f88966f0ad2cfe249458564382009058d3ff73b38daf8e6d3ae5d1a251cde53643a96903b65a83dacda7d82ebcac221da482a8f470bd74b5b4a26723d33182958bef42859ac342b8fab0b697ab8511b5a5c411b5974d64e768e1587adef59a73a937a1d3434d699add8770b2aff1b03d6505a2ad850882706b0e2fadffd1dfbcd5c36116b6461cd00cf0dfaaa97c4c79885dcff960fb0626f528048a5f1bd23fb1bff25f1a1c4cb37f1299ed8a3d850cca57fea84e8de504711f551511eaee45bee3bcc7eb71e0a1c9193693a4617388f50ddac106ec9ca9caed71d200a83b02c11b673c81d1f567d2e41a8c7823177aab3bec86dedd7ebda4a89c6455a25627e6800d2e34930f87dc1a0cc8de9071626c0ee83c3138409c010c08f0a6a0ea87b7fdb348cc60b64ce4cfea57fee07d16f0479f44cf8fc0eb7f5e2889fa99887eac5f975144fdb3be82ac50e8dc52dd3acbd989b3c1a9ef74241b1bb0455aea85655dc6335f8a83c4d2255a5856b7b0bfef37bdfbe3a5675ef5ccf6e1277016ae4def51343468c2967c6c95b9c21af668068f4127b53d7bae34db806809b5c2bd03d0b158da8069cae3cd8cedbe4c00b571732849ef372146e82768bf3c5e7cd1a5d7d7b241c786b4d9ede613a1f4f800b7acf8c4f3d7e7334fe1ef0ef90360390811143891f91de1f6f7d77b8822062e3c2f10097ae8709782e3f0aff3e0171de43732eff6bd158e7d4b1f1e8799df358b84451019b66cc2e8ae271fc26b383c99358ae3f99075a0220d126eaad31e75263e9f4fe10c898544db94de0c7bb1dc1671138e851ef2ce116c4eef93bb217cd922eba6f4ee0b4538ba54699e3ac3d4831ca91a61f7f69945213e96fe5a8dda63f5afe317c32244e8afa474dd056d7d47f2d46f762eff50605abd3fb2966349e897a61087bf5cef9ba33072f542a1848ca49c6f4f0271cec3aa2e1d844c6f50a8665648cae5f710420f63b0e4843ec4fe32c6b887ff83b01a76e5220d4118f884dbbc3a0e1c9b6b20a44b8318bd07d859d2fb21c05a721c485dae4b9727bd465bd8528e2299d05b5f9624683a272cfa1d26e7dcc05dd395cfa92ee96e1627d538ad3028762c740194d5593f48e184366ed1407edfb78907bf42e9b72b4ed67321ab83345edde00dc797dc0a887a40b9d7e6c04e796fb1f9f7725c2c95ab88fc7ed353df82cc26d7668bacb5ffa2c056cac7897f99e9010cc300999d184b4fe8624d5cb0e280bbe1cea31a0b26c67366f578945f8b9de8f615d74f822c598971f5a4da798414c352500045012ddce4e1584e1d94d092af69041c4eb49b8dcfb5d26e4ab340c89ea1026f54c1ca6e23c7415f69db89145c690f764a42b25d5cc714173cee86846c1e9355793446cc9e25c2a61dec6da39242435ac2ecc6e52fc5c31c891d878575e4224d95a285c08234402a7156a4c12503104cc183e660aae38c59e20ce22f9ea2b79709cc32263b34c6e6dfc8c278a5645dcca9782d4441d078118c376ee310b6eba3dc8ce872a17c6d98267aab5ae29c2809a9b484f8c8452ebe55a038ec1a29c31deb96e56b1789f4088d37cd7c84ee30f383ea19e1ca94fef1b3ad7e6f8f42fbf57870436b8f721a259165d06c76281907f51a08c6b968021cc4596226854ae0f162ec61a6bf9658bab34c553ceb544169343c2cda0c9b502e523110898d59232a28f0f90ac81a098199b6a2f7cfae5cf7728d6713a76918bd33d5907f1f3070afa7c7e53d23bd75125487cd71a01760b36b293d139cf8b4915c3ab8b2ad4c43b2a802a53001256fd7476dbd65c6dc629d437619852553ea3f0a884e88bfe9db4028af1299535150b3205288b4723ad1730293e3a4bf5fbf09de32209bb94aea1e19321009810d1d0f64748b4a18ed298e50b92b23728507558483440d2885af9f2f8e809f26596a477c90cb750095f12c0915af1df29aa46cb880041168c3e5b57ba348b8ebba411e14dcf4f5fe163b9921a3cd03ad24c6bbf50d3580a66f811ac89c453d139b5ec933d1605853d2094930d4891579caf79339ad0476ab9490de2b5885ba05bc4738a971d0eb9a9a0b60b17bf2efffa65e728c6cd18184638521f42bab6752f33608bb196800108d87f2634eb308738049f047a1dab01dbbbe6528af7da4d4519c8d038852047159141ee39c9fb336eb80719cd0845c4c8388323e16c2eb3549f5f31debe0dbf1c37b197b1c108094b3092283a3141aa3de914e7e4777fa24446bf08e6120130d33f4c961a612a585a894b3dd649587996ef1be70325ff061b0ad195e9b366b6dce5a90d6ad504060358b269b0292b8c33a4da65af9f468ee01998ea4542fa29441469093db72249cc59314077de6902dddaaf9580e83c6b89c1f231526a20c45682bafc24dc2b4cafabf6c39d9dcc93f042d03ef307398d06924826b24870e043420d9c40c122f7ba7b75af5d5e512473d889664f241a48119e26ec6bac9914bc56bd38fc650726e04c5111da122c3db54be965988e4c100ab11c6c120349db4870352623ec341c448056d4b9acae1568e78350b47fb5d2a9095995f1173b4248200979b7459b02d84f7c46f0a28331dece0c933138d813e51e1c296fb83143d1cbce9e882b495d04cc84aec4dd80e1892ee5beb5e394a24d58cc182b7c618a7201c1ee88e4a74aa89c426be06f8700f650b32099ba444ff0e7111100e166699627e4b89edb8b2b860b397d59c8389a31fef2b4fe4a6f3876039e6ebaa0f7be923f52e1f6b28cd5092fcf681f5e2e3e6f5c247b2a8181907f18aadb62883a137cdc2c92a26813308869a7e058c472b1f37d0a7db811a9d9702f804877a5bcfda6966460f423486683f3290f0f7fc56a113cc11cfcb1f114d09f349131cc7867159ac69217333dd8f682bd6149602b1fea51570ed72c6b6fc22ef7e4bdaf4d2268a21c465186ddbd428e9120f29f5d82be3906948692ccf196558681d648a1412781deea871e776cd61ddf505af5dabcc5d4608c1cd3d38adb723fbc198b8cc197e2f1f16f5efc6e4e0fdae6e4d675d4f8b8a8c80a21038230e324f1934db31512f04cbbe3cfd348b716515d7d8810571666a00f3a7e3ad44de69401b9501f53bb2fd6405071d2242bc8080063163c9c33e2457f7c7ea4194d3a7ba0a86ca101c5e3aca405da48e64e7dfabe7defa89dfc56b71ccba3ee8b145092d7a2821fa2a6cec31c26b4170f14fc1ad6e7bbaf4e024cca988e62c2b8fd4807697b653a2a14d82fb83e51ab44ed50f814d80fb9e92c70fcd6f84fd1463ad1e415b813d27c2b7cea6d92a2070429f1fccb1714e60ce33535e4d2147f01601587c5cbe6723b14caff056b2c2a136d00d6b402431bacf30bd7ddcaa3d7f2dcc53c341296985a1383a1fd54752fbfee4afb1ab511ad00f18b46fabd05e7085152e359fadddf563e577951ae71e7376d471fa4551b4da7a414ab5a97ee548f8a9017718cd2469f6b0ecc190530a778fb700377957dee1fac42a5c85a7f18fdb7142de099a35472a40a047810930540bdb9869daf2c4f3e4b45c591c7ed0f3c3fa1cc156445c57bcf816e09ed864544e9edb014c1848c23c32382b5bb3200899f53cd62027a6c3c33d037a3bb85a42a917251856f16d27a4d0ad0a03bd0ac981799756d0e3887fc9e4d6c39a82913c08a026bc120022e8a314df0e2850c074207335dc211a503e586e3e05615b451d8d9414bb88d223df1a1d7beffabcc7ebcd01141496cb6d0ab2c2816c5b110c3d4f70a30d7890550cecd9da5d349646132fc0559a1a335d4b33ac15018c356de79072973f5d0055e8b2e05e1f2c576a31a8d8cf0efe288ee59b99b6a8f4c7e5603034bc26350582c842174cc211a3adf896b414135c073b1ea019ad10dc087bc0905ae85e10b40549c2cd50bf3487b507fbcd06652bd8d2c3bfc38c18e10c6bb2729652e80c3cb176d1feb466df525585a6cf87e62f67245583b44aaa84ef1c1e9c5923fc05807f6d50fa5b42bc17e081bb5561122fe545d77063ccdfb296948fb437a08f1047465a5b35c509b808ba449c9fc05d36f55add2110d71f9f85e93ab7bd1b64b16a7e87ef567b9a34806c96a055b2caae3ac0f5ef60b3543cb128b8c99639860b86460705ace9ca4fcb7e794dc101147e29f438fb05040e1ee73309a3404ef1c866c3a42286b429db28100682e36e0fba46572b305992a20dfaeec350eafd98da68f6ad0fed891ac9ea904005906ca386c578ac1e14cef7e005981522198ccf808b978607360a8d55b7930bd80b4755a74ed251b59f71182d32aee5a20910fbcd08851afc63e35a88c80785fd739fcc3c239c30609ec827c2cfece8a96d84e45f0ccb43ca9396db76c6469c21c0389c1723ab2979982fd9cf0feac19fbcfe453f3fea7c17f3ae0e060315a4b5fa82ed93779147f8b020a883d286f8dca83e60e0a21b6c48ac665840febf42ea51eb08e41f4e274d2d145c3435159280f762600c6a9677fac47a02283e45630040fc143733b6a64153dd762b54c88b47d6818120d1bff3a0a3dd1f37758f273c6d81f504a4e3cfa7390fe7988cf81b2a9170faa5b8f18710a432408389a5aaa8b44e20e613f2552ca6b4a6683490765e498460e6dc673a90a7386948c8be5f213f5437f15a4d3e5c294279a57add3c48148290def8490a0dd8f97b748f408b49eb2e085f572c03d181d2dcabcdba6772500916d4bf854719bed7c3da1a840008003a241b758f219ff76bc5514e0deca70441fdaa885737b5f3dcb24a2ca95bbc9b578c6297744216746977195e3306fd6235c64a419481aac91fd7d501a873f3095b76d8c5a7017a04a37b3550b024e9f3ffffffffffffffffff47e15b56d96f83cada2f7792241aa37d0b8b0a524a29a59412c31684803cce35d256c8c3bb8e089e078c07890709326336fdaf438972b69a4c5ae49e0e15ee143c26516e93eb8f137a4e8a5b1225d57c2353de4f64be638c2047b2e3034ef08844495b88c7b7dda5ae7523b161a71ef08044419986b633ddb9e4ffccc0e3112517f90fdbd76e6f18c98e1a337470c3e020b93123871888e6885b5cde4d532ffbbac4d693939abf6f3c1a51561125645c67e7850c6d470e12dc800723b4aeb38b4dcd130d22942427a16af2a8da6311c57c9f9d99e4f45044f1c4b7cf6665db4109135130e9b42e444b88289b9f9c326a8e3944595f4b6c3fc619f99b87218a257a2749d5991e8528df6b4c82690ff22044e92f7333ae5d3bff6ec3b0e028e13188e2268f6bf7d97ab5291a6c3a66182f3c04511e997d5d63796d6a1c38c6084449b48afa2464bcd8ba3372243810c3c65d8243072a80c006d8e00188524813cdd9c4a43149e27f286652faf42b33f99fac871fcaa3a967dfc4d0a6f6f3e84331a387ede8d314f5123e94477f8ea1bea26adea006bd9bf0d843c9da53db7aa710d1be1e8aa74d67d92c4276d00d6a302399c4c68c0cc135c2230fe5ecb99452c275748b060fe530e184763001e313bd3b14457b2a9943c90ea5b5d2e0392669aa4b9206db0c306ed4a80102234712865d1dca9a94d9c8991c5f34a543c1a48e25262549dfa0421a6c9b3ce65012af477fc442fc6395434147a3aa6997121b336c9864878e1935b031c65103e3460dbfe4c5b891712885ea98a4e1397028955242beabe720aa9b379447997acd4c5a3714466acc5b99243fc79c471b4a92a0e56f6b8270f3cb830de5fceb3c237b33428f56f05843613b7cb787d9b841c98d6183c48c6183e2a186a2696e49edef79a4a178e2246bcfa6ad316934d816058e869292df234c3c1327a9920e8f33143e368c5dc7353ccc50ea8cafd161ad3b951e77e05186a277fdc7ace8128392d4030f3214c6d574329563f2d25a12bc60060c3cc650f8d495399c4a0ffbd6430c05ad53b3124d06a162943cf00843316a9754923c4160b080c717cae19327af2a9bdf0a794193321ad3b89c32647874a19cceab37bd2d73b7c38592bcaec992ad2d94e4b64fdec42cd66e69a1589a846bf2af0c1d9e2c94e6c2b7543d59ebc73db0508c9a61f49a92951ff7b8424966107d92581d2b14d3d99aeeb7af4e237a54a1d899af32ddf31e54289ece26a612aace0f784ca114a234e4b5979c44939142f1dca4863a119f2dd3289424d9acf17d835028c724be8ad5c8f0d4d7134a4a66934f8ccc5251cdc30945937df32b161e359b24376a9c6d42c12c36f48d07934f763c98508acdf8b5bf138f251477631cf17184095a251e4a288b868e26a63081e1918456c7cdb65c67ddaeaa3de96c828e09dff9ae1c0918608861e33c9090bdad5eccac7dfbdee8f4eaea0da1043d8e501a53b725e892b5e3598e1d3ac6f03042926cd958eb5852b75704b5738f2e75e3a262313c8890f252dbc0630868a7eab686ccb7e8f5364f0b99c4e8790f2194d368683f2f411e4128c65e13e31fd46db29207100a264e640951e2efc9ffa254baa94f29e5f9a224c88f9bfb35fe9ab01ad08b92078f252f4a22324d373fdd805d946545281b616e757a6e802e9acfdc8d8d97b5f77c393f2ddbcefc373f8aa001b9287f9693acea64cd7dc245c1747b3acd27b728e8a0bbd4eac6f8e1c4162525faa235ec93babf16e5ba5056923c19cd8468511253f847116237899f5994c39b30e1419fd2392e8b729e9cc345c61033ea5814df94ecf9456cbed7b02829efded3127e45d1abfffc3727a1c4a82b0aaae34c781953035a51d2a004d127de6efa2f35801586fd9af67a2eada2b026e24ff7d4c8315145491293d6eb6f4c733e152539d7a3ca859566102aca213ac8ce289be4fd14c530f2f65d1d5394ee94fd8b124f4a514eb25e9396b558c6135214f5c4dcc97773d0cc26a32826e1ffe7f33496af8928caa622d3feeb9e92e492509484cbc6780f8a720a8d6625fb53f5ff44498a13c4c491393b833c51ea70254699cdfa7e27ca273f4288ecd21571a27025dddec56993d7d94441c8ea24972e4967d568a2649a5da3b6e9cbc433513c3bcf9bf194f427268a9f49c47fee1c4cd7972896f8e1da33dc4ccc96287d69b4cb3c6eb556a270e922f39f4f89926a9e9855f99328496221dce3d8660d5f1205f59d1fb4fa9b6df79128cac63d25c674ff690f8992583af595a78aaef58f287fdeeaf850fa7fab7744f1ed4c67d950df736a44f9ef63878769df51c2886258134b45958e4983165192a774f439318a285a083141d497b6a6135138b9ce5478f6294988287ce7745a3fe5bb7f88a29b2c729228a5cd3444c15635087da16c645c88f2ecfe69874e9e494b88e29aea34269e50b11944b9faa4e9646903045130ad8eb9ec5426cb0604c21c47768c1d44401445b46a45c96126bd3f14659492ca6d6333637e2867eb51aea6a64f69a80fc5ac9f34df667c289c5cf29d923d678bf650d630294b57c96659480f25e16272d096bd934d79d83aba67f0a4040fe57993bd46fc3b943dc7c75cdd4e6a47762849fe32abc9c43acda943d94c9031a8d734e51d3a14646d5a061572cd63e6506c35139360b2e9f45d0e7d9615d91ff58943c9f3dd97b02af6561f3894fed7e4f8382a23c3e70dc5bdbe9263f21765b2e386c288128349cb9b35b1d386727faacfd9222709da6143d163c5786776d650d820543f09631b6a5243c963a84feae301c5d8274f63ff7b0e3ec3a2f831a6df983d4a5bcbaf286752ed1f4f8adeabec8a92d4d1deea9e67a3645b51ca93414ef23c2b8a2745cb5ae8f25acf2acafea7be2a4df62aa9a2145ad673522a62e55494343c85ca52621e6554145409d2cb774748554f514c62ba18e5dd9572ad298a9d459aa8763b529394a25ca1849414c5f42749654aba47513a490eeac48a1dddb28aa2203d97eafc9a1d4dd45014bce73787eeffab4e4151ca0ea24bc917ef9cff4449a892d9224599afee89624993a3b99e3a5114dd63fee2a7f35a4e944528a1da26c8d6526ea25c194b29fb182337999a40767c9ef09acc44c1c424defdbb6b662d31515093f29b7e7bafe41265f112319f339628b8bf6909bb57a258a5abae846977d12951cea2ab4e6d492f3ac749143c83ac2bbd126a334aa294fa9fd91d4a5776188992fcc936d77f48144ec69c3256c8b0ed3ca2981d5b25ad4893543d471494984ebc26f51a51f6d7f4fdad49ed99c788b28c7a74f7d7f11e6f110531d91c36bf274f27459493c9e1257627a2b439cfafd498ac6f1b224a629fdce4f7df6dd90e51fcf09b57add33f313344393e79966caa41a9668528677f87d5a0448882e9f212547827b90fa2b8a2e413b1db9bbd4410c57893e4a4ea04a97307a2a0e49c04d75052c7c4f50188d2496f63657566f3d6c71fcaa2f2234583b823d5a0a1c375e01063467df8a12489f327b39c383145bd616c9820793148d0f8d187e29af8def25311a7278de34371bbe489e2d71b6f9a8f3d2417aeddb5258710ea1ef4a18772fea4475baa7ba7cadc2041810c19374872e4a1183baeccbd6bcc7c3ff050d8a47fbd3c7b6885bbb801138800021d400104d424f171074c34ee4b2e6cd63c3c3d49a3aceb4bfed2fcb04339f507216b27e44afa7cd4a114eae126a928b9a69be1830e4599d15837df7fe2836e74e0860c193a1294630c31747ccca11c4b36c838a34a12711ccaa1a04564b6c344cfb8350d361c33d26e7cc4a1203c97ad5e7929df60f201879224a7cce79cf119e9d8a1c3d8301a7cbca1207b4bf6a472fd254a38f07cb8a16032474d76d33ed332517203ff684341cbcb47ddbdea103234d8708481f073948085f0c1867287d8f2cee0a24db434d86c901c4a58a0868f3594d7376990262875a8a1285f9e94f60a258d8f349463dc35937e3526798e64478d1965627ca0a118f4096b6e265b9d60698d8f33143cd55b36e9ec59fd84393ecc507e93dd3c4bb4ef2bbc6172cc50dbf151867c634e4afbe5448c1d8e6ad848010964c848b3c4c639356e7c90a19cb4ecc931cce7071f632889e9393e457362285ce71699ac65bdbdfb0843a994fd7807a941be082de1030ca97bcb9abeca9e768e0afd3e42796b38ed1b3ebe503055be6fa5ae17caa31bb3bf34cc33d72ea85b1d9a976b2a339ee1d9bf262217f2b2452e14c4e68a79f2a4e7c47b081f5b28a7b19cddf0f3b6cce0d042d19438f310f2d49e9cfbc8424963d220ea39a5a712f38185e2be26316d5b0951de5ea1204a0e62a6448fa527b742f1e3c6c713834cb70caa42b1f395b9c8395921845458cbdaedb3763ee6dc33641053e2cc53288a785efb3dd13dad4fe1430a65d30c9b04b7758d7df21185a2094dfb7cd254f628d1c207140aa67774cc1c749cf03934d892496c188e8f2794bddd8369fbdc1baffa40008ef0e18462fbac4956b2a5d64a6df868427154ca67bfca3ca74f3e9850f6d09b4415d1417fb4747c2ca158e27dda34bdfaa783945092db4e6aaf4e3a4a4e7d24a198cc6390bf259bafa60f2414eb4388fddc9ba9178f60cdcdd8db7c8a7ecd969c3508e9a231f76184921c377f9ad71844bdfd499d18e9c6077c031f45287f165f553d39a7f5244458ebbcde354edb4d6c56cb9449b2c7ce3f2d750805b9f953dc0f21186ee9f5a56939df619a252831c23d548a093f82503875776992d6ef1c93f2fa03082599c413636dcc2f26bfbf2899d0d3252e3ffd4be88b92cadcb1fc73e9d18b628cc99b4dfa308718c98bb2992e93c6a3ef98977651eebcba4c42ce06fda9cac04317859131b6481d3f1705d5f5394b26a5bd6da6c19623d97123c145497673bbce69e477b66f51fe13e3cfc949d2a934e83d6c51924fe447354943f694b52809b393b9c46422647efa78d0a25862e4b8073d42b384b3287a9a51fbf74930c946e3218b72f80c22329eaeb933e90c8f5894e4ccb726316aef15c2a224cec426496f62e0f18a92b6d21aad4bcbfb9f68b0b9e2548d75adb1b157f7b4301974f6390a1ead286eec5c52751a3555db8315255b2d35b11d7c6309cb902143860c1945048f5514deb7f4b58386cf7c55519236bc97c63ed3a4e74868e0c06c0f1ea9d0c45c767fd26e29a1e21319262a4eb5e991ed14e55a931f7f737868ada628de9a3831785c0bcf4acfa314a99795edc855abb5958bea524a2eb7b649514eca2f4f14f5f7fd7514c513e369121f6563f4125114f7d724d7edb825761e0aabf6ed62ed2dd5c3957bd42ecdf9ebf6004549449f6e35adee95a94f14f4b68fc87bd913a53ec164c7f89b96f67974a298e3499e24a94cdd34f5e0843396a2b3b5d69db57b9ec37c10a6b2e4cde3193c3651147bd1eaac9ef5f1d34441999b38c946092e5f65a2f02a4a9d89a63df58a305150e24d9924caf2b4dd4b1457d6fc474f65818725ca49d2f944375147e80755a2141f06d9b5885d28e8f0b1c4f6b5225c604b950eea6e4447886ca1a0efc4524d89aa4965f809112d943a89126763b532c82046b2501ea545097af47cf0f8d10816f244ae503a31ae535547b906cd0a451b916fd949fe9cddaa4241281373f6a75cecc9a911a1423163d041f8e59b0c8d8dc814ca9dead5836f4c2a661f8e01810d1c46a450924a1c5daa63c86eef2f128592149f7b9f49e72250409da8fcbc1b039127144ec8efb43f53268bef358838a11c54376cadb22dfce4fb74d80a224d28c5f96dd257ad8930a12ca345f98a9ecbfc526219224b2855e56d9992f57137a44309e53b39dfbbebeec6e4632409a539cb8d95ed4a031124142dc6c6c4a4439a645ee408c5e49efc36f909a17519327084113142513f29d9ba4f877142a408e5ce36596e4afc44e6d400e3c6181d8810a174ade549098d7d8e12586408099ac924b1e4a858ad368808a1dca2e4df0ed2ebeb04458250d8cd75626536b398520408a54d6a5a6a1ee38c877e51f23897496f98cd49dcf8e2d24177923fab78da8bd2cb7878503df2a220c642f9d7a89a279177c175b7cdedaec7beca96c8b8f76f62367a66d34549923e66b11f5bcab55c14f38abebf7faa04105c947ed342e994d32d4ad7417d9a3a912d4a6a359af8a9a3a8f65e8b922094e8d12e1d1ef305428b5269d31351a23dc724348b623c1117bfd8e8263db228efe8941ae4db633035482c4abdf9e42c395ac9998345e52aabf57a351b9fc4986d1b5a73405e51d6fb1c5d7d733d2abaa254a6f337ba4168ff415a51b02c19db73c7b2dc130d36dd00082b5651dca0e4c47ac59688f61444152549eac9964174b693af1bd44845d9ad2417934c677a59396a24bb00082acae673823879fd7a3c3e62d80063c62994556bb34cebeecc35fd4d626267f6099ba2209b1bb489af69d3a468b0cda8811900294549c9498c1a17277cd0291a6c3b6ad8c0a103841465fd309a7ba356d505194561bde412b4f4c9a6af041145494cadc9c464110de285a22ce3a153af887f960e08288a1a7af2981c74e9f4f0139c6c6c9549ed7ba2a439dacc44f7d9ce9e4e9443adffe37cc5688f9c288e140d79f2d926cad164c5edc3b7fa9966180d14e428818d4403a600d144394b74ea7e0c8f5a4a32511621437b57734cba339828491f37c6f1de412e513eb99893c496246e9eee2c51769fcfee2d1b25084f258a994796f84dc24600a14439c96b2589141bedf124f6fc693b8ae5c7242092288b0825c42449982a71041289b289932d5b6594608040e211887d401c91d49e84ce9f411ac18852a6d2feaf729b4fa617518c19f724fe3c9cc6cd8128e24012b1b8e5c98ac97ee8cd76d75757e7078288d2499fda35a90bef1025e939ea6f860f5a259d23d9512319c410a89724b65d49d55d218ad5e96daa3f67dca5ea031042e096162f1a27977ad5a1d677377e9a990119048820ca7183525267bd4014ff4f8a88ce897e080288d276c969adae735e6e7f2828f121ae240b291a4f40fc501665aed53188ecf534481f8a6f1fa34e6d26dd8d83f0a17cf23753a60b597dd2c63a40f6507e734d9984d1a0ca4e18440f0593336796fdf49e54d401481e8a71f59946f99ca41a8303040fe55099e584fa78ed5b83dca16c96a14b122794d02446090b700c103bb8a943c9dc24ddbc01481dca551ea3c412cf47931e840ec564e235e2312e536b38009943a219c2934c3ae7d861cba114ba64fef02ffbb7a6381494bcf2a125f5084b131c0a7a54bbe8d1fe1b4a26e575c918e5deca7743593eab898e6e6b19426d309c1a99eff13be687d88086c9d778d588b99dfdc93179afdb33039035944eff7cda64c2ae3ea38692dd9f32699f84d6b9d3500a0f93c43e51afc56634144f9a2cb17f65994f3d43b9beb4c89cd46986f296ee97d954198afb692b3d579a24c21c206428e8e85a13f77792727d0cc54e1354cfb8d7206228ec55a5dee7141aff6f1040c25010f7bf9e6745580719228080a13c425e8c67d0f2a0c49c827c81f3d8a449c69bdcad05205e28f9c9606fe9d17736783000e9c2e1ed177e174af41c71a1143a9b3c3ddaf7848fefc8614ca0831743035ba8d6f44cc6f2d2b34c3e4965d2fe27a57d338816cafb5b9fd735a83200c9424998e8a5c94491b14e582889b12439e9870a7285b209d5cf491e9196ba8158a1a0266cfca609bd929f278054a12c42373ce898646c939d020815ca9f493d5509f3b08c755001640a25f9dce542072285922454097db5894259cfa4a5c858073d2728943e4db2ec689e4f9c3ca1e8a193b8716e449fde09a53f39fbc973d813d6a40925d1a4fd4f993c134a2a830e793f5a4241bd6ff436a8896795509225c9a7337a4935de27a1d4497d8e329edb4c1609a51913368329d16f74e80805cbd818d99e4666c70885d91c74c7247fb7668a5038f7faccfe5a26732294539d5a37193f43289fc818fcca1742f1c43cc9ec21f48e1c84725fe61032e4281da3204028a78f0a9522daa399bf2869b5fcee10f3ced017a54ddbd7224bf374ac17c5b21bdf924c8bd8bc28c8fa9cfcb2ccc72e526b73725d14b3aabc539c9bd0bbe7a2b849b0fbded01062745c94a4099e454c8931e7a96f51ea4ca6aab22ef5d7b645f994c92342a45d8bf2ae8612444c6fe5dab42846cb727953a799c69e45b94c6ef68e673207af65510c9b9448fb208312278e4512289b80d504f0ea1ee0c709269747e001266357863900edd031468e0204400767020a00c00e1d63a080000148c030638071c3d840800074e448d0182f460e1c09180100020000000020002258000874d4c061141080220040878e23830002303bcccb284000cc0ef362e4907100000ce0230139921a20b343c78c190b004000187000acb123070d1d361ab123d1c188929e7bfd54a121b4892ea2247bac367df40c225344d9049333c99df5949f86061b6f48224ab5bba3428fd23fbf69b0e900471849181a8288e4066284114612c601420e813576dca0c61b4207380a813576bc18618c316346024208518c4943995d29a124394783fb6c8cb330921c336e50e3677cb2831a6e3b6ed4401d376aecb051638c3323c70942068133662020441038c240612461182024105863870d1a3acc8c1909080144f104a59b4e6ddcd0edff508c9b3e7f5a277e4d1de287c269933ddac836e144a90f4591e639d477e6b7cff0a1147bb229a5491cb287c2fe750e6d1a4f875186e8a16082f69f66f542f250900d253f89c737df6b84811c8287a26ef668f2e5e8b89f3174ccf804032177408b0657dfb6157769b09d85d8a1246c9e929386b2ceab94032175287987f02493700542e85092499e8ca67459878fed0642e650181374295dfa674a189510220754ea86730f9ba49e43e2c0831038dc1b4c8618216eb8361c1b780da7066cbb4ebe523b34ef34b43adcc43e4b9698d4c0a860068e903414fb041d6d46941c652634943a97b42721e40cc5e4496f0e2aea56653243b9c4fffb2d790d29434976948def797acbaa1032ace9b1f3b1aabba76bed31296935cb69af4310328662be86099f21a457c78488a19cd6e1448c9019c4630f4248189693ff7027f5243d18cecf0ad3123337fb70550ddd151e9a902f1466b7d34c0eb28495db0b052573eab4576a7c947048178a1f729bccbba4d3308570a128a7d53655eb65d0d6168aa1327aae124f3cf6d742317d503b256859c98742b250b6133eff29e1cd7b5367582869b6d19a49facca7432157286cb052267b948458a1781dfba4b813bc66ec9d424815caa757712bfe5d1d46278450a1a4abdd2b1feec3ca1732059402cab8188444a1f8d194282e1e4ba89ea070c7b77edbbdb7e95b6b37087942f1bd3ff786adefa0cb4172433f9023d9f181048c1cc908f072243b6ac020c409c5dc9fecc3e8fc1983be09258f694ef0fd60196ac710269c17a333a7ea1ebb6174a5f679fd9574c81236440905fbcadcacd9bd5f67124a6abdc5367dda933e464308123c2f5b2fcfba6ab12a3165c99c0d8ae308031da1a8eea7be1bcc102394c418dadacee4fc26fb2214837658cbe7f4ef688710c164dc08194279b3daa6f9fb13975d88104c4648104c460d428070bf3819be88f4a22074b6cecc379f3b877851922588dc126ebc4f54bb3019ab0bc55c14d3f7c64c26de37944e041726e316262306115b14e47fee32c8275974915a742aaba26ab1b3dd23676aaef44e125a943e7d121a7544b734159945d962744d3ead0e3b7b4416e5d13de136fa936a9323b12879cedbd29f35115894ea4f4af55892899d0423af28955092f4deda7bfab5882b8a31526489a650da49b345a41505cf132684758615c58e514d461d39921d35ce089155943af97d12ab63d6ac9e2a8ada5572aa33a988a9a465c7fc6ab2115494b39f3c5ef2e3be7d34728a92bafa93e5459d74f59ba2185ea465da128d94a2dc6252fe97af59074d8414c590593637897f25498a8ca2e01befc6347bc8be58140539d7b735d1d34eac48288ab1f9611e9e93ecc6dc81a26cb29fe9e768b24667779f2829d1691b44c9bf7325779e286510d9142143acaaa813e5743b27e54ac8067ddf71a22027fe89aed8ef3651d0ed1f3575c9969b4a779a2809f93f4a6913ec4b27351325792eea6390d726785249f08219278860c264b8207289721a2145f67ccc1f4309cf12c59349375789c2ac78b07fffbc19d651a224d29324c83dbd22d3c59b444950bdaa21a6ba233a9e244cc645a2a444cf3cf1437589fad060d351430f1225192f83d4d89cf435748f28ac8d923fb9bbb4ec7b8e289aa66bfdbb11dea7c36b44412849ccf3efb04f1bc7638497de32f6eea5f9156a36c7e9e41b3d34d87a8cc822ca2f1ebf46bca71d19bb8b28a2a43232b79ffcc810494431b5cf6d9a701d340611238828df98778e31a14314edfecb4be486065b0d1d5d22862848dd7a4d6182bf9d28c981e3401029440b22842889d1f1c38ca9b69f3b887250c2996027c7fcfd494114ed3b735ef778b7a51488f2f9c7137f1def3a880051be7e91175d3a62fb8bfca1642faa2dfbb67ea4891f8a9f4de99252cc9318eb4369e3a5c6660bf1a1b0714a6c7151259ee42141640f2549ddebabf45dc93ea2076c4eccec5364bcca4a2fff838527d1e06642240fe5f560ef193e09ddd7f1803250e40ee5d5641d847aea9e5a237628e78fce2fbe89d4a118db4a088da374d77a113a9c32b7a3d6aadebade5ecea124263b9356747837799243c14cce617b7473d7e8c4a1a0640eedb9b5c13466e15038539f416daaf45afd0de57d137ddd4eda9c94541b226e28ac092583dce497614a6d28a9aa559e1cb5725a6743f146ec9bf8a05b43797c83ac7e9383ba5045d45030cba0a26aefd44da740240de5102bf53166b0cd49923b1d113414445e6b06f1ebe8da9ea1ba3bf59de48c7c113314536578fb9cac27a3d91b913294d47cbd2cdefc4c8f6690a198b995e974692f328692a8e739ef89416e438d88a1704ad60f5e240ce52c73f6159b3a2961eb0818ca56d523d6424730225f28c838fb590d197f9fb3112f14938f018790a8c3a65924485110044110c4300c0dfb241da313482010401e8c4523c1903c52977d1300818ae2e07828108c43c170381c464108c4300883300c032108c3300cc3109e54d901531cd68e49b2bbfccf151fb3dbd65197a84067fd4d31e6d913d993917fecb3bcf68d29bc9a06ec28cb6e727cc7a6731abf4d1b44b0432ca71da2f9362a51810d083a3b85db60241cf1bcf734d744b6deb9e4035a9b47dbaacb0eca583cf0d0ff8932daf14fbeb33e4f21a578facd2eb19c52bdc8b667358e972b4c7cf35d6aa03edac1d50f32579f2942a04ed4b986293f82f987cf8a55324c3d8f44f8ec4a41f477f759c661a6e1dbdf20fc750f902f48e58a8292b308ff13dcd74d0157b785c0f310c86f2bea808ad7ee7b2aa6a1cd697202c0f8949fba32b6452b568b08a06cdb4fe375e85b0df4bd53558e7a1434a8b9ce81559a905e74994592c4e9633db3d36e368fad313e8118be18f453f62285b9aa0aebd465284160c0e5fbef14225473ffba0295b10990ef0ad1228b7d3ca96b04fb74cc8fe3a6c21062d75130a7531399e6e1a5711b65fe17729c2e775fce9f66c4d1a6aa4ed86592aba897e309536530a388f062e26bc4c8fce41f0a7bc342e252f64b770d5b6cd0a5f28405d139c30fd688f378d647f67a707029fbc16167421c3d3f40e751a83d4b8f08a7103c4ff3a67c537dd9e296d85733cdcc3c4dee018ad003711b1d9f2c380a495e661f5cf56133ab59fea9760def8875fd7f62aa8afa68c8c1525bf0827ac187ef114f7a98abcfa667562c670ccb6361ec722a54187dc96aef32fc6ca8e5870d9fddcb8981a504fdf06bf7ee8c9bafcb67d2f1301d984a45cb8defb30403d9080c6f6ade89f8e0b56f3e8669e671ce6d7896d32ed20e59290d1d50e11d4fddda302fd1095324f1ede2acae0bd58ee5312c614c2a5d324ce46fcec023092202b8e3225fa125669d11da495cdd8a6bf051b20d5719300ed0ff2f7b2ff7731f9e8751033a564e6c71bdaf743025d0e1c8768ca601b440473161efd1ac1229e5aa2a782050d9be05d67274a531a6847afcc76e8b00b62d5328c63aea5487d3c3b9d4fa3927e56f88a4e9fe19c1ad1fee52157ee86593a62b2491efaab8656406b9035ddc21dfdd3dd9dc13c7ba257721684b2dc13372062d570d7934f506532b19bee1c9853a740b3aceafcc138c653c13b2a815be209c2781fbc8636c29244351d7c579d4fc90cc7d73ae8fbf9f1a012d72df0424106be49f4b421c5a11b672b86fce220b23e9ae02af2d5d02b8c416972b7fab25e4c3d83b67efc9ac88c0919b712150b922e412acfd2d8b5eaec9ae88b4b71a516a8879c8849010fc6da58e646f2acfe78f1f275cc221184480c8d4cffcd7b8b3b3d4852416a13cc98cf85a90c12a5b9a172cb1f220df1dccdbde35e0bcc41b3c6cd312fd08c9d217e2ab6441c8c4bdfcec03ff968483d32c156c29a6fcf08568e020ed3071c49730bcc4a4b02e22cf295a9e8a42014642345959bd38b4e601db843e4b19e65b851021b57a59e83d8d7224d1aa5317c44424da7d4e7d51b3cedc546629b6af1bf0744bea07b9353f689fa5f5655bac480cfda5a1f8c5780b48f21d50524794892927283c82ef4abef66ee7b010b9398c052b84b19836800cf883526ac091ac27cd84ee81320816098193d10e48098f28fbf21aa1223962ee0c2304f1282ba43efa01f1f09b375becfa1f105fd53a5bcc650ce89dc211845d3efc872afdb3ec0ad7273f83e20397588b8fc89081358b8333e65e3b200f7b84d24077643d91a086ac68291e37a7f1fca779be41f7e30088be9c8ef22018aeb3bd0fafcda89d6082c60c9b967356d1b4e95b330d63e0d084bb22f7fe84d1939fbf03c35416386bef204a3af3f645bd5aba9ce105b211f3319943cd37cf79f358f6151a639f9703c8266eecee8ed636d61074bfd048d86a56253b98565ddb246952de3f400d44b2cc870fdf8e389645266aca2d200f5e57b35ab3f3e26029468adec36da1f4d615366089852f764c43d4e99fe3d172ed6b6883043aea58934502464afb5fcc8b611ed1fc2b771ced8c66916673b98d5c7690bc5ee2f9f477ec14c889c3a14d72ef518971105796763a78a7c6cc5fe41d58a9c442322f9bd4e08a52091bebe1b1b365b02633c4065b406524963749df700585a1bd09bc9cbf74646a5c8e52e57709892f503df039a1b59d84ac4de3a3fdebf37c8d6a7600fcaa256f4772ae5d193937721fca565583d97f9c145e74074778582a23cb73a59b37db0f20b7a74c507eca2cf44d1596f19c28539c612d9a1d1fc11b04865d4dd731a18f1a3201473d3a09018e9a579db94ec868347fcd482fa8952272410dfd967b9c55409792e2784a68dfd43b84a4fae5b4437b37ae404f92536ba7bf3931080f9dc08ce2433aff4864277136763314fd509aa8dea8d871634e3f6607648e98d8a52a42653cd377ca069618e7e72c92b7b44fbd753cdb5d95baed0aa34127bbe193ead62016950f33f93d9c94d4cf69b388f89dbe54d04c82fd371e45239e15a22dcf9b604ca7e0a130a5095d384afa3c227a877a5172969a3484a6bb58b43cb3229ff939532962a0c53e504ddda01ac09f941602a882e6391852b5746e48e512263048092533820ac71cdee994f68816cee7a0a9243b04c7c98fd0ea1293013f977a081a1a0e2ef4d1f980405ee31af6a08e8732bde6558d70ae25dbd7b97e5ab9b1b09e63a2313e972a342580d06933e0c63670ef06ae7c6e33ec6ae2d9ba66405071f92e28c514f9439931f55a01d039ad620566eb16fc0241859c844c31970189200fe90b66fb58079be224d10c40080e02fa68c5ffdedc4e7aa6ad1b3bc3bbefe1b5aa46dc640c24915c8a75a52511453a21793e49cf7970077a9c756106f3c2450cc18ab2d8de43b609e6b411fd4daabd294d4ac9278d99a30a290523674901563b34998c3d55a43f12380d081a1540e51fd26631962ff6428aa4327d88ebf1153b59e4c7a185cb4482e218ddd447aa8508c691b5560a95bdb1937684ca1c41fb43928bceaf854af2e8300fc63a3a7c58bf43d5dfbe8a16773453b7c23066221b1dfeccb83647352cf210eb50b75b1851ad6f297666e00f62200de83e2d12adf5b65d1423fb11b646525d976b6bbe67ec4a7f39a37d7c2be2b9ea244645d264d686096f6cea565718d578fae49cec69938bdbbf5df535f8c54c5597e839ec780ab73fe35a71ab34d0f31162845e16eddc128e127728e3722c9e7e78fa11bd68406a52629f63494aa39e08deff566c73fa0f6424cc839f974be5efd8b420f41f672d3c2c6204c05346b44d9854bf4281e6daf6f9bf70250c0266573298f25a9395a0b09ff1ac63ff5c59d877475ecac6c80a2258e064e7a6359f1760c8d0e3d35233788ea421d10438282e5c32d2e0820aaf6adda2445708c8f390e5e49633298376dc134818f4187aa32ae4c09d55fd3e13e874728a62e268f5f9a2f3d8c35ba6e6c9274640b6021f5977897c11298964c1c6e28fa2c14a344cdfd2cdc354fca5996b8ec46fd292660dd920303cf0780274e129e56c53f9a411cdd27904cc5128965ea07ba4845d144041966d66b49785f5ba5fd34d5e8ae745b01211ea835a2628879d90a510a4be77faa5f2b728b8a24db94b04e6f4d96cfa60baa1da8460c19fb2edcf2022a6a24983e2e3e3fc7b9e4e031699d91780e5a5262fbd362e4b1af4a58f76e2b1bcce111597a6a488d301d252f005d8947baaeabf7c261bc7c11134067ab13908b7d91c0eddf1298c24b96856baadc794bd394de3f40d80ba99c5c9ab1886b6f591775364e34de5b48c92b92adf384339480bdcc47a09ea61b6d5afb0b64613740c2a5b854330212456b149a4203f50a09411025a80c7752b5ed841d422ee42ad5a0dff7c6b5fa91e6a6e8d67e5b5f435efd09dc864cf8097305e15d38acaf96df4b7031a4b1be54746c7b2d7b54de35db6639336851f7a774e6a1020e60f21953a15b07add0dd3834656894c6188c4c7193364d6223c2875934fe605e6370e205094544477389547fa7201e908b7052b79a01833e6a18c1e2b23bcb532ed4fa416fe76886ad88ece9cc09588072891887d13023069f5b856c6dd287773ca34e2c45e165b4d4397c564c936b921e2361f2edd1aeeb2093318ed283ee4d262b8669cfe661edbc1a1f6a5d39bb9308aefdc9135fc0615670c8e8f23b750cc82fe7560e056f2124479f8e6474fb7310d18fc4d29ae61a2cde39dfdc8ef29b6c9bf4c1a866da7ecaf616a2104a3c3b824e3861f773230a521d2bee9af980d3a4630c554bf2bb4309052206be2049cdaf15aed6c8feed9ea56a55550368f9adb4a53ae6c3379a8085b1ed17450dc3127487d5fb9cbcc1200155ad94cb37e5030cd928108921c944520b4450a4b82aafcc677a5a490f8c84099144c1a044ebb9b76fcc159a263ef9c75860532d713314cb57853aebcd25bd2074f8946addabbdb15d1903ff52dcf8e1dd8076e711cd9237f7c3673c2de210cf4672d914ea2e2efc57a5cb199edfc192ad36dda00caa7c426ac8b131d2b7e0a2c2ee8a3095b97591231b55bb974667af3b9225a36d191354541fa98badd787686338539b6a6880dd7992310ffc90c4dd5be5f5bd2c3c1c3ba0db02e22494a446df93780ce45550f6119bf6e6a33d7b833ecb3b8211311748c733024e289145f0dec880b0ebfa1573a1c6526277683d0d86d7928c373f1f97665d916d317511c6ef8db27a99a958293aa5c47600dc003861fbff5a1b97cf76ff922781f3b74fa0fe677e1ef128a2027dc3da69686f7225107d274c7dcdca3dd580c79f773b6839a751247f01feba42dacb05cd07960f713976aee5ca18bdb05085d2a03a9e9cb9e7476e5b9ebb5a93d38c6fe07b26e34af1d81ecce38ccd9f1a4a811b359b14252796275f12321682b20549dc939e3e156293499c41c2c2e3557c42e46eb4a1daacd8f4c1b7ce9d50a56faac86fdaadae12d44a8f138b71efd23bc3e04671e2f68220083b2106308c8b2dab80cb4a6b913a2af0e39bdeabecc7764016f34508114e4abe4a86c9a6f1f46602ff100a26a0097862de080b0420fccea6c2dc1b50a3494cc1abeb3f8fd1d6346c9318ec1c5e168c0ba45b5d67928bde571bafee3b9c1ae72c79513cb39d24425d8be2f6ea43ed1c202237de76bac3a40f28adaa60f9f75e625408f3b3d61a2aae695c5f4c24d276f33b84c1a454d812c350e7244ed058f103559150b1cc226c26136477569a22029139d031734f609fb2ba049bf0da2b838945a92862aff9e98dca628db37907111473c662e0f09f2290a705ae242143408ce3cfab191243cd5c0882fe0671758f4942401b44afdb7b11a1a070264bcca0c8b151a31f82354580ae2a8a1b31b02049c3dba14f72eba401ce4c1163ff0e4a683c8185fee78221cbcefa001c8415a96792b86a9e4e03923b818d353d440c639de2961ea847fe7a3d10ad74e475631f2c60cba805416ec599415a8c7c8dc883792ad06514a2a6b6fd97e6ac7d8512ac2ca6ea1a2ff95fbeedff0377ac8f327da4253e02226d260015fc2c061735435944a53b11dc5e8388733fea4ebcd43aaf55c9c1441c1119aeb1a0963676325d8a01af5835b8397c68333402d8d64e916ac2b1dc8060c4a22e2daebdea594fc95907918bb68108db9cec9d428ed285e95415dbcea30f915622427b2e461ced76768871bbf41a95075c309a15591807f2f365c04a3914c70587986e8863321d7d8d8333f710e329c4f28c3b9aeb8bd511dd2caf47b0f7c123376a7505fb93a41132f792fdf08251e8ea7ad4802af0e84c8f4f80e90670d07647fc600443b1a16ab464761c073ace92630ee7e01c7325b35fa99677d15b883a33cbeb4a7b275589d8d00488e1fa5e86594a27abc608b9079493855c729c5715c83a41b00e08c254afb34740b91fc6b0dcd977f53121806ab8439a8d69159930966a51297f1989904f258fbeda8bca88ccaf3db83fa7f77b3309bc450b3fab8db79eb2df3c7ac3415e8760b34fed16b73406da3858cb4003dab3388222b230ead36a44e5600e88ef374b934f09374acfa451451a573753827e20d9cc33adf20e291ebdb7001228c8b1d72ddd087fb3e9a96084b515acd2c0130801502f5ad3435c9f744c5ecb001623939cd1cc0f0ebd8683c203a1ee2defb15be1cd9caa104d853691d85649804711b41d121d0bc4b2c743dd986225f2810a15e79f6b0834b56fe8578d248c2796ce4a7f968df709401d10e98b637254e1a829109c03091a090443cb0c80f58eaa4636da7aab125368b83e5c33f0fab78433f5b3936bc1b61dac97efbf9f17430bf4bc756fbf69f4565331f3561b96afe5144836791f4022c9972c255780e547c2d93479569ac6b58a2942bc793725ea337b4e3e784040da50280443462fde0d31a8e54b0236413865190d5b855a99f60881285004c46ac2de2d3305337f988a905947073cc58339942b8ec9439667a5defb0b1338eb83e9a920b58bd432d310f4004c6006d0a6f52c654aaa83f99ef5912d30b5557bf1c381d2c8ef4628e1909276fcfe2933a074de21fa97798a50bb6b60a9d0fcab6fde2f632d92b42532e27e1c659fdf1393e5fa3f37f2072bb70c82e1fca566317a124c6aaae3ce6bbeabb175f455fdea6002edcf4eec85b16594f3205d778f1089d92a8c643a5350872cf38822cf1852c4b67e2681d9bf2a273c244482f8e9fe4c4635f98877aa549a8744d805f10441e021cd8cc2cdbfbb6ab040a064ae6a967a0d356cdd8e0f2dcd63180133616cc6026c19f58f22597306c40a6419c151a90176483f8e901d306d4333d04ea242526828da1f990a0e78b69dd475bb86e5818d15db1f11fc4c248dd57a86e2aa47b4a27867a717edb98718efd9afd8058d2c020277adb43d28e83ad8a13187754c4beda84cbed5880044bfee0b057e2e10febb58d45533f60f9c12010db025bb83708d3758efbca7145740ad146b2112f0002b9a05820aee3f57e81f68cff66173cce337f87b1faa4e23ff21a1f2a9a8adb4203e0ccc100c31334e0cd25213513621ba5d9be66ee1d51c77313b54e42059bf17d1a47a202d131b1c84b2e17b897447c448e1b45bc9e823971b4939952b4784a3637e1562859109eab2925e92e9e822fa81444a1cc6cf0f91c61c200b4e8e8a340bbea4fb46c12fb8b42ba142e4bcd7c064f1b3dfde712bb79adeb962239b98dc782a06796054a28bc510187d6159bba04678497a704119b7807fc4ef74fca1e76fa59951adc9b753f997538eec81c15a6acac8d20671c2a4f1bef1440bcba0addfdabb871c1675455e8f4753400be43f3a5567f7dcfd4a3953ff129e3534018f9e0d44e601daf6ef514b9bf1eac47873e3007bf8b9a67558c0c8b5f623429b141990018f5c825113b95072845528663bac065b887507be1368b3c7854ae8050a6a455712a8e4509c8d516feb32535a2f216d184b6cfaec76d88d46aca1bda70be770b9cf5204a3382ff728a63a8baa942b4b04982610dc87ea146e7cdf8c19a51617df128aeaf64a2f304e845903ee1ee54b1c1027e056ef630fddd27bb695106da302b2f3f2b6a46928cff3aeea9c3d0a1c7fdc2d549cea6ce71d3e7da0e4afd8548f8d85d6557e16c3d9a77cda9ca45d0724162de0796a604cd9747d0109200a3581b2f2517ffe0b0e545e5d0505c1c3f33d356bc108774487c6420665e571f8e4c11a1b2b003607bc59299cd05b9fc2646d2bbcf4c1da0e2ab4e6c400212945b0f8d1e6226eed4420dd4b21a3b07c756db8e0ff940ad730cac56ac89d5a495a36fdb31952b00c0719ff05760674c00cc2b79c036bfe9c38555476233c3774b9629ff0ff299ca6bdd614ebe186eff8571f92eb013c55af3cbe929391151870a499b188020ded2b55a2b17b98695211e", "0x3a65787472696e7369635f696e646578": "0x00000000", "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x106c97f53e386c97a7217d23e3412bd98a37ebbd0574c2ae95de296548523235144217f1177620148602f0ce7e4787643f6da946b7c9390422b5b16e8f1745e8799046c7d25f9bc688e9523897ebd59fa7f3b0d44198a0bc6c88a580aa9b3ce67d324ff4d0173ef7f6e75e06b0151998924c1c7b8704f80f7afc3262018a195b4d", From b0715f9bd9f24758c132fb7dc8adcd30551f7de4 Mon Sep 17 00:00:00 2001 From: Muharem Ismailov Date: Sun, 9 Apr 2023 12:26:12 +0200 Subject: [PATCH 107/339] The Polkadot Fellowship import (#2236) * Fellowship into Collectives * cargo.lock * tracks alias * allow to send Fellows origin over XCM * update todos, remove duplication of type * use Collectives location for Fellows body * alias for ranks constants * benchmarks * proxy for Fellowship * docs * correct copyright date * Apply suggestions from code review Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * rustfmt * remove council, update origins * renames * remove tech committee from promote origin * renames * Fellowship import * test * rename mod * fix import * updated addresses (only ss58 version) * update addresses * doc nits * weights with new api * update addresses * fix try runtime * update addresses * use pallet api to import the members * merge fix * hex-literal version * add Bradley to the 1 rank --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: parity-processbot <> --- Cargo.lock | 1 + .../collectives-polkadot/Cargo.toml | 9 +- .../src/fellowship/migration.rs | 261 ++++++++++++++++++ .../src/fellowship/mod.rs | 1 + .../collectives-polkadot/src/lib.rs | 7 +- 5 files changed, 272 insertions(+), 7 deletions(-) create mode 100644 parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs diff --git a/Cargo.lock b/Cargo.lock index 99d36d95246..034f09a5e0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1318,6 +1318,7 @@ dependencies = [ "sp-consensus-aura", "sp-core", "sp-inherents", + "sp-io", "sp-offchain", "sp-runtime", "sp-session", diff --git a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml index eca2c8caa98..3f5c956d454 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml +++ b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml @@ -7,7 +7,7 @@ description = "Polkadot Collectives Parachain Runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.1", optional = true } +hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" @@ -73,16 +73,15 @@ pallet-collator-selection = { path = "../../../../pallets/collator-selection", d parachain-info = { path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } -[dev-dependencies] -hex-literal = "0.4.1" - [build-dependencies] substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } +[dev-dependencies] +sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + [features] default = [ "std" ] runtime-benchmarks = [ - "hex-literal", "frame-benchmarking/runtime-benchmarks", "frame-support/runtime-benchmarks", "frame-system-benchmarking/runtime-benchmarks", diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs new file mode 100644 index 00000000000..5056abb2e22 --- /dev/null +++ b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs @@ -0,0 +1,261 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Migrations. + +use frame_support::{pallet_prelude::*, traits::OnRuntimeUpgrade, weights::Weight}; +use log; + +/// Initial import of the Kusama Technical Fellowship. +pub(crate) mod import_kusama_fellowship { + use super::*; + use frame_support::{parameter_types, traits::RankedMembers}; + use pallet_ranked_collective::{Config, MemberCount, Pallet as RankedCollective, Rank}; + #[cfg(feature = "try-runtime")] + use sp_std::vec::Vec; + + const TARGET: &'static str = "runtime::migration::import_fellowship"; + + parameter_types! { + // The Fellowship addresses from Kusama state. + pub const FellowshipAddresses: [(Rank, [u8; 32]); 47] = [ + (6, hex_literal::hex!("f0673d30606ee26672707e4fd2bc8b58d3becb7aba2d5f60add64abb5fea4710"),), + (6, hex_literal::hex!("3c235e80e35082b668682531b9b062fda39a46edb94f884d9122d86885fd5f1b"),), + (6, hex_literal::hex!("7628a5be63c4d3c8dbb96c2904b1a9682e02831a1af836c7efc808020b92fa63"),), + (5, hex_literal::hex!("9c84f75e0b1b92f6b003bde6212a8b2c9b776f3720f942b33fed8709f103a268"),), + (5, hex_literal::hex!("bc64065524532ed9e805fb0d39a5c0199216b52871168e5e4d0ab612f8797d61"),), + (5, hex_literal::hex!("2e1884c53071526483b14004e894415f02b55fc2e2aef8e1df8ccf7ce5bd5570"),), + (5, hex_literal::hex!("5c5062779d44ea2ab0469e155b8cf3e004fce71b3b3d38263cd9fa9478f12f28"),), + (4, hex_literal::hex!("4adf51a47b72795366d52285e329229c836ea7bbfe139dbe8fa0700c4f86fc56"),), + (4, hex_literal::hex!("1c90e3dabd3fd0f6bc648045018f78fcee8fe24122c22d8d2a14e9905073d10f"),), + (4, hex_literal::hex!("8e851ed992228f2268ee8c614fe6075d3800060ae14098e0309413a0a81c4470"),), + (3, hex_literal::hex!("720d807d46b941703ffe0278e8b173dc6738c5af8af812ceffc90c69390bbf1f"),), + (3, hex_literal::hex!("c4965f7fe7be8174717a24ffddf684986d122c7e293ddf875cdf9700a07b6812"),), + (3, hex_literal::hex!("beae5bcad1a8c156291b7ddf46b38b0c61a6aaacebd57b21c75627bfe7f9ab71"),), + (3, hex_literal::hex!("ccd87fa65729f7bdaa8305581a7a499aa24c118e83f5714152c0e22617c6fc63"),), + (3, hex_literal::hex!("e0f0f94962fc0a8c1a0f0527dc8e592c67939c46c903b6016cc0a8515da0044d"),), + (3, hex_literal::hex!("984e16482c99cfad1436111e321a86d87d0fac203bf64538f888e45d793b5413"),), + (3, hex_literal::hex!("44a3efb5bfa9023d4ef27b7d31d76f531b4d7772b1679b7fb32b6263ac39100e"),), + (2, hex_literal::hex!("2eba9a39dbfdd5f3cba964355d45e27319f0271023c0353d97dc6df2401b0e3d"),), + (2, hex_literal::hex!("ba3e9b87792bcfcc237fa8181185b8883c77f3e24f45e4a92ab31d07a4703520"),), + (2, hex_literal::hex!("9e6eb74b0a6b39de36fb58d1fab20bc2b3fea96023ce5a47941c20480d99f92e"),), + (2, hex_literal::hex!("ee3d9d8c48ee88dce78fd7bafe3ce2052900eb465085b9324d4f5da26b145f2b"),), + (2, hex_literal::hex!("d8290537d6e31fe1ff165eaa62b63f6f3556dcc720b0d3a6d7eab96275617304"),), + (2, hex_literal::hex!("5a090c88f0438b46b451026597cee760a7bac9d396c9c7b529b68fb78aec5f43"),), + (2, hex_literal::hex!("18d30040a8245c5ff17afc9a8169d7d0771fe7ab4135a64a022c254117340720"),), + (1, hex_literal::hex!("b4f7f03bebc56ebe96bc52ea5ed3159d45a0ce3a8d7f082983c33ef133274747"),), + (1, hex_literal::hex!("caafae0aaa6333fcf4dc193146945fe8e4da74aa6c16d481eef0ca35b8279d73"),), + (1, hex_literal::hex!("a66e0f4e1a121cc83fddf3096e8ec8c9e9c85989f276e39e951fb0e4a5398763"),), + (1, hex_literal::hex!("f65f3cade8f68e8f34c6266b0d37e58a754059ca96816e964f98e17c79505073"),), + (1, hex_literal::hex!("8c232c91ef2a9983ba65c4b75bb86fcbae4d909900ea8aa06c3644ca1161db48"),), + (1, hex_literal::hex!("78e4813814891bd48bc745b79254a978833d41fbe0f387df93cd87eae2468926"),), + (1, hex_literal::hex!("d44824ac8d1edecca67639ca74d208bd2044a10e67c9677e288080191e3fec13"),), + (1, hex_literal::hex!("585e982d74da4f4290d20a73800cfd705cf59e1f5880aaee5506b5eaaf544f49"),), + (1, hex_literal::hex!("d851f44a6f0d0d2f3439a51f2f75f66f4ea1a8e6c33c32f9af75fc188afb7546"),), + (1, hex_literal::hex!("dca89b135d1a6aee0a498610a70eeaed056727c8a4d220da245842e540a54a74"),), + (1, hex_literal::hex!("aa91fc0201f26b713a018669bcd269babf25368eee2493323b1ce0190a178a27"),), + (1, hex_literal::hex!("dc20836f2e4b88c1858d1e3f918e7358043b4a8abcd2874e74d91d26c52eca2a"),), + (1, hex_literal::hex!("145d6c503d0cf97f4c7725ca773741bd02e1760bfb52e021af5a9f2de283012c"),), + (1, hex_literal::hex!("307183930b2264c5165f4a210a99520c5f1672b0413d57769fabc19e6866fb25"),), + (1, hex_literal::hex!("6201961514cf5ad87f1c4dd0c392ee28231f805f77975147bf2c33bd671b9822"),), + (1, hex_literal::hex!("c6f57237cd4abfbeed99171495fc784e45a9d5d2814d435de40de00991a73c06"),), + (1, hex_literal::hex!("c1df5c7e8ca56037450c58734326ebe34aec8f7d1928322a12164856365fea73"),), + (1, hex_literal::hex!("12c039004da5e1e846aae808277098c719cef1f4985aed00161a42ac4f0e002f"),), + (1, hex_literal::hex!("7460ac178015d2a7c289bb68ef9fdaac071596ab4425c276a0040aaac7055566"),), + (1, hex_literal::hex!("eec4bd650a277342ebba0954ac786df2623bd6a9d6d3e69b484482336c549f79"),), + (1, hex_literal::hex!("e287c7494655d636a846f5c3347ad2cb3c462a8d46e0832be70fcc0ab54ee62d"),), + (1, hex_literal::hex!("82bf733f44a840f0a5c1935a002d4e541d81298fad6d1da8124073485983860e"),), + (1, hex_literal::hex!("d5b89078eed9b9dfec5c7d8413bac0b720bad3bd4078c4d8c894325713192502"),), + ]; + } + + /// Implements `OnRuntimeUpgrade` trait. + pub struct Migration(PhantomData<(T, I)>); + + impl, I: 'static> OnRuntimeUpgrade for Migration + where + ::AccountId: From<[u8; 32]>, + { + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, &'static str> { + let onchain_version = RankedCollective::::on_chain_storage_version(); + assert_eq!(onchain_version, 0, "the storage version must be 0."); + let member_count = MemberCount::::get(0); + assert_eq!(member_count, 0, "the collective must be uninitialized."); + + Ok(Vec::new()) + } + + fn on_runtime_upgrade() -> Weight { + let current_version = RankedCollective::::current_storage_version(); + let onchain_version = RankedCollective::::on_chain_storage_version(); + let mut weight = T::DbWeight::get().reads(1); + log::info!( + target: TARGET, + "running migration with current storage version {:?} / onchain {:?}.", + current_version, + onchain_version + ); + if onchain_version != 0 { + log::warn!( + target: TARGET, + "unsupported storage version, skipping import_fellowship migration." + ); + return weight + } + let member_count = MemberCount::::get(0); + weight.saturating_accrue(T::DbWeight::get().reads(1)); + if member_count != 0 { + log::warn!( + target: TARGET, + "the collective already initialized, skipping import_fellowship migration." + ); + return weight + } + + for (rank, account_id32) in FellowshipAddresses::get() { + let who: T::AccountId = account_id32.into(); + let _ = as RankedMembers>::induct(&who); + for _ in 0..rank { + let _ = as RankedMembers>::promote(&who); + // 1 write to `IdToIndex` and `IndexToId` per member on each rank. + weight.saturating_accrue(T::DbWeight::get().writes(2)); + } + // 1 write to `IdToIndex` and `IndexToId` per member on each rank. + weight.saturating_accrue(T::DbWeight::get().writes(2)); + // 1 read and 1 write to `Members` and `MemberCount` per member. + weight.saturating_accrue(T::DbWeight::get().reads_writes(2, 2)); + } + weight + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(_state: Vec) -> Result<(), &'static str> { + assert_eq!(MemberCount::::get(0), 47, "invalid members count at rank 0."); + assert_eq!(MemberCount::::get(1), 47, "invalid members count at rank 1."); + assert_eq!(MemberCount::::get(2), 24, "invalid members count at rank 2."); + assert_eq!(MemberCount::::get(3), 17, "invalid members count at rank 3."); + assert_eq!(MemberCount::::get(4), 10, "invalid members count at rank 4."); + assert_eq!(MemberCount::::get(5), 7, "invalid members count at rank 5."); + assert_eq!(MemberCount::::get(6), 3, "invalid members count at rank 6."); + assert_eq!(MemberCount::::get(7), 0, "invalid members count at rank 7."); + Ok(()) + } + } +} + +#[cfg(test)] +pub mod tests { + use super::import_kusama_fellowship::FellowshipAddresses; + use crate::{FellowshipCollectiveInstance as Fellowship, Runtime, System}; + use frame_support::traits::OnRuntimeUpgrade; + use pallet_ranked_collective::Rank; + use parachains_common::AccountId; + use sp_core::crypto::Ss58Codec; + use sp_runtime::AccountId32; + + #[test] + fn check_fellowship_addresses() { + let fellowship_addresses = FellowshipAddresses::get(); + let kusama_fellowship_ss58: [(Rank, _); 47] = [ + (6, "16SDAKg9N6kKAbhgDyxBXdHEwpwHUHs2CNEiLNGeZV55qHna"), // proof https://kusama.subscan.io/extrinsic/16832707-4 + (6, "12MrP337azmkTdfCUKe5XLnSQrbgEKqqfZ4PQC7CZTJKAWR3"), // proof https://kusama.subscan.io/extrinsic/16967809-2 + (6, "FFFF3gBSSDFSvK2HBq4qgLH75DHqXWPHeCnR1BSksAMacBs"), + (5, "G7YVCdxZb8JLpAm9WMnJdNuojNT84AzU62zmvx5P1FMNtg2"), + (5, "15G1iXDLgFyfnJ51FKq1ts44TduMyUtekvzQi9my4hgYt2hs"), // proof https://kusama.subscan.io/extrinsic/16917610-2 + (5, "Dcm1BqR4N7nHuV43TXdET7pNibt1Nzm42FggPHpxKRven53"), + (5, "1363HWTPzDrzAQ6ChFiMU6mP4b6jmQid2ae55JQcKtZnpLGv"), // proof https://kusama.subscan.io/extrinsic/16961180-2 + (4, "EGVQCe73TpFyAZx5uKfE1222XfkT3BSKozjgcqzLBnc5eYo"), + (4, "1eTPAR2TuqLyidmPT9rMmuycHVm9s9czu78sePqg2KHMDrE"), // proof https://kusama.subscan.io/extrinsic/16921712-3 + (4, "14DsLzVyTUTDMm2eP3czwPbH53KgqnQRp3CJJZS9GR7yxGDP"), // proof https://kusama.subscan.io/extrinsic/16917519-2 + (3, "13aYUFHB3umoPoxBEAHSv451iR3RpsNi3t5yBZjX2trCtTp6"), // proof https://kusama.subscan.io/extrinsic/16917832-3 + (3, "H25aCspunTUqAt4D1gC776vKZ8FX3MvQJ3Jde6qDXPQaFxk"), + (3, "GtLQoW4ZqcjExMPq6qB22bYc6NaX1yMzRuGWpSRiHqnzRb9"), + (3, "15db5ksZgmhWE9U8MDq4wLKUdFivLVBybztWV8nmaJvv3NU1"), // proof https://kusama.subscan.io/extrinsic/16876631-2 + (3, "HfFpz4QUxfbocHudf8UU7cMgHqkHpf855Me5X846PZAsAYE"), + (3, "14ShUZUYUR35RBZW6uVVt1zXDxmSQddkeDdXf1JkMA6P721N"), // proof https://kusama.subscan.io/extrinsic/16918890-8 + (3, "12YzxR5TvGzfMVZNnhAJ5Hwi5zExpRWMKv2MuMwZTrddvgoi"), // proof https://kusama.subscan.io/extrinsic/16924324-3 + (2, "Ddb9puChKMHq4gM6o47E551wAmaNeu6kHngX1jzNNqAw782"), + (2, "15DCWHQknBjc5YPFoVj8Pn2KoqrqYywJJ95BYNYJ4Fj3NLqz"), // proof https://kusama.subscan.io/extrinsic/16834952-2 + (2, "14ajTQdrtCA8wZmC4PgD8Y1B2Gy8L4Z3oi2fodxq9FehcFrM"), // proof https://kusama.subscan.io/extrinsic/16944257-2 + (2, "HxhDbS3grLurk1dhDgPiuDaRowHY1xHCU8Vu8on3fdg85tx"), + (2, "HTk3eccL7WBkiyxz1gBcqQRghsJigoDMD7mnQaz1UAbMpQV"), + (2, "EcNWrSPSDcVBRymwr26kk4JVFg92PdoU5Xwp87W2FgFSt9c"), + (2, "D8sM6vKjWaeKy2zCPYWGkLLbWdUtWQrXBTQqr4dSYnVQo21"), + (1, "GfbnnEgRU94n9ed4RFZ6Z9dBAWs5obykigJSwXKU9hsT2uU"), + (1, "HA5NtttvyZsxo4wGxGoJJSMaWtdEFZAuGUMFHVWD7fgenPv"), + (1, "14mDeKZ7qp9hqBjjDg51c8BFrf9o69om8piSSRwj2fT5Yb1i"), // proof https://kusama.subscan.io/extrinsic/16919020-4 + (1, "16a357f5Sxab3V2ne4emGQvqJaCLeYpTMx3TCjnQhmJQ71DX"), // proof https://kusama.subscan.io/extrinsic/16836396-5 + (1, "14Ak9rrF6RKHHoLLRUYMnzcvvi1t8E1yAMa7tcmiwUfaqzYK"), // proof https://kusama.subscan.io/extrinsic/16921990-3 + (1, "FJq9JpA9P7EXbmfsN9YiewJaDbQyL6vQyksGtJvzfbn6zf8"), + (1, "15oLanodWWweiZJSoDTEBtrX7oGfq6e8ct5y5E6fVRDPhUgj"), // proof https://kusama.subscan.io/extrinsic/16876423-7 + (1, "EaBqDJJNsZmYdQ4xn1vomPJVNh7fjA6UztZeEjn7ZzdeT7V"), + (1, "HTxCvXKVvUZ7PQq175kCRRLu7XkGfTfErrdNXr1ZuuwVZWv"), + (1, "HZe91A6a1xqbKaw6ofx3GFepJjhVXHrwHEwn6YUDDFphpX9"), + (1, "GRy2P3kBEzSHCbmDJfquku1cyUyhZaAqojRcNE4A4U3MnLd"), + (1, "HYwiBo7Mcv7uUDg4MUoKm2fxzv4dMLAtmmNfzHV8qcQJpAE"), + (1, "1ThiBx5DDxFhoD9GY6tz5Fp4Y7Xn1xfLmDddcoFQghDvvjg"), // proof https://kusama.subscan.io/extrinsic/16918130-2 + (1, "DfqY6XQUSETTszBQ1juocTcG9iiDoXhvq1CoVadBSUqTGJS"), + (1, "EnpgVWGGQVrFdSB2qeXRVdtccV6U5ZscNELBoERbkFD8Wi6"), + (1, "H5BuqCmucJhUUuvjAzPazeVwVCtUSXVQdc5Dnx2q5zD7rVn"), + (1, "GxX7S1pTDdeaGUjpEPPF2we6tgHDhbatFG25pVmVFtGHLH6"), + (1, "CzuUtvKhZNZBjyAXeYviaRXwrLhVrsupJ9PrWmdq7BJTjGR"), + (1, "FCunn2Rx8JqfT5g6noUKKazph4jLDba5rUee7o3ZmJ362Ju"), + (1, "HyPMjWRHCpJS7x2SZ2R6M2XG5ZiCiZag4U4r7gBHRsE5mTc"), + (1, "1682A5hxfiS1Kn1jrUnMYv14T9EuEnsgnBbujGfYbeEbSK3w"), // proof https://kusama.subscan.io/extrinsic/16919077-2 + (1, "13xS6fK6MHjApLnjdX7TJYw1niZmiXasSN91bNtiXQjgEtNx"), // proof https://kusama.subscan.io/extrinsic/16918212-7 + (1, "15qE2YAQCs5Y962RHE7RzNjQxU6Pei21nhkkSM9Sojq1hHps"), // https://kusama.subscan.io/extrinsic/17352973-2 + ]; + + for (index, val) in kusama_fellowship_ss58.iter().enumerate() { + let account: AccountId32 = ::from_string(val.1).unwrap(); + let account32: [u8; 32] = account.clone().into(); + assert_eq!( + fellowship_addresses[index].0, kusama_fellowship_ss58[index].0, + "ranks must be equal." + ); + assert_eq!(fellowship_addresses[index].1, account32, "accounts must be equal."); + } + } + + #[test] + fn test_fellowship_import() { + use super::import_kusama_fellowship::Migration; + use pallet_ranked_collective::{IdToIndex, IndexToId, MemberCount, MemberRecord, Members}; + + let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| System::set_block_number(1)); + ext.execute_with(|| { + assert_eq!(MemberCount::::get(0), 0); + Migration::::on_runtime_upgrade(); + assert_eq!(MemberCount::::get(0), 47); + assert_eq!(MemberCount::::get(6), 3); + assert_eq!(MemberCount::::get(7), 0); + for (rank, account_id32) in FellowshipAddresses::get() { + let who = ::AccountId::from(account_id32); + assert!(IdToIndex::::get(0, &who).is_some()); + assert!(IdToIndex::::get(rank + 1, &who).is_none()); + let index = IdToIndex::::get(rank, &who).unwrap(); + assert_eq!(IndexToId::::get(rank, &index).unwrap(), who); + assert_eq!( + Members::::get(&who).unwrap(), + MemberRecord::new(rank) + ); + } + }); + } +} diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs index 3b822d99073..22926d1d27d 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs @@ -16,6 +16,7 @@ //! The Polkadot Technical Fellowship. +pub(crate) mod migration; mod origins; mod tracks; pub use origins::{ diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs index c928eda49d1..6e53920201c 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs @@ -45,7 +45,10 @@ pub mod xcm_config; pub mod fellowship; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use fellowship::{pallet_fellowship_origins, Fellows}; +use fellowship::{ + migration::import_kusama_fellowship, pallet_fellowship_origins, Fellows, + FellowshipCollectiveInstance, +}; use impls::{AllianceProposalProvider, EqualOrGreatestRootCmp, ToParentTreasury}; use sp_api::impl_runtime_apis; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; @@ -622,7 +625,7 @@ pub type UncheckedExtrinsic = pub type CheckedExtrinsic = generic::CheckedExtrinsic; // All migrations executed on runtime upgrade as a nested tuple of types implementing // `OnRuntimeUpgrade`. Included migrations must be idempotent. -type Migrations = (); +type Migrations = import_kusama_fellowship::Migration; /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< From 03763dd07777bf454fe1d21ea13b1258dcb7064e Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Tue, 11 Apr 2023 17:23:39 +0300 Subject: [PATCH 108/339] Companion for #13302 (#2357) * primitives/core: Derive scale_info::TypeInfo for runtime APIs Signed-off-by: Alexandru Vasile * parachains: Derive scale_info::TypeInfo for FungiblesAccessError Signed-off-by: Alexandru Vasile * parachains: Fix `TypeInfo` import path Signed-off-by: Alexandru Vasile * update lockfile for {"polkadot", "substrate"} * Adjust testing for the new API Signed-off-by: Alexandru Vasile * Adjust deprecated methods Signed-off-by: Alexandru Vasile --------- Signed-off-by: Alexandru Vasile Co-authored-by: parity-processbot <> --- Cargo.lock | 531 +++++++++--------- parachain-template/node/src/service.rs | 23 +- parachains/runtimes/assets/common/Cargo.toml | 1 + .../runtimes/assets/common/src/runtime_api.rs | 2 +- polkadot-parachain/src/service.rs | 20 +- primitives/core/Cargo.toml | 2 + primitives/core/src/lib.rs | 3 +- test/client/src/lib.rs | 17 +- test/service/src/lib.rs | 21 +- 9 files changed, 331 insertions(+), 289 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 034f09a5e0c..e20de817a01 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -372,6 +372,7 @@ dependencies = [ "pallet-xcm", "parachains-common", "parity-scale-codec", + "scale-info", "sp-api", "sp-std", "substrate-wasm-builder", @@ -523,7 +524,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "hash-db", "log", @@ -2213,6 +2214,7 @@ dependencies = [ "polkadot-core-primitives", "polkadot-parachain", "polkadot-primitives", + "scale-info", "sp-api", "sp-runtime", "sp-std", @@ -3368,7 +3370,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", ] @@ -3391,7 +3393,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-support-procedural", @@ -3416,7 +3418,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3463,7 +3465,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3474,7 +3476,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3491,7 +3493,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -3507,9 +3509,9 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "15.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6bb8542ef006ef0de09a5c4420787d79823c0ed7924225822362fd2bf2ff2d" +checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" dependencies = [ "cfg-if", "parity-scale-codec", @@ -3520,7 +3522,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "futures", "log", @@ -3536,7 +3538,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "bitflags", "environmental", @@ -3569,7 +3571,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "Inflector", "cfg-expr", @@ -3585,7 +3587,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3597,7 +3599,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "proc-macro2", "quote", @@ -3607,7 +3609,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "log", @@ -3625,7 +3627,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3640,7 +3642,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "sp-api", @@ -3649,7 +3651,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "parity-scale-codec", @@ -4618,7 +4620,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bitvec", "frame-benchmarking", @@ -4716,7 +4718,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "frame-support", "polkadot-primitives", @@ -5570,7 +5572,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "futures", "log", @@ -5589,7 +5591,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "anyhow", "jsonrpsee", @@ -6088,7 +6090,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6109,7 +6111,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6127,7 +6129,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6142,7 +6144,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -6158,7 +6160,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -6174,7 +6176,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -6188,7 +6190,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6212,7 +6214,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6232,7 +6234,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6247,7 +6249,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -6266,7 +6268,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6290,7 +6292,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6308,7 +6310,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6352,7 +6354,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6369,7 +6371,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "bitflags", "environmental", @@ -6399,7 +6401,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "bitflags", "parity-scale-codec", @@ -6412,7 +6414,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "proc-macro2", "quote", @@ -6422,7 +6424,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6439,7 +6441,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6457,7 +6459,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6480,7 +6482,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6493,7 +6495,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6511,7 +6513,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6529,7 +6531,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6552,7 +6554,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6568,7 +6570,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6588,7 +6590,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6605,7 +6607,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -6619,7 +6621,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6636,7 +6638,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6653,7 +6655,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6669,7 +6671,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6687,7 +6689,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "pallet-nfts", @@ -6698,7 +6700,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6714,7 +6716,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -6731,7 +6733,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6751,7 +6753,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6762,7 +6764,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -6779,7 +6781,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6803,7 +6805,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6820,7 +6822,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6835,7 +6837,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6853,7 +6855,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6868,7 +6870,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6887,7 +6889,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6904,7 +6906,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -6925,7 +6927,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6941,7 +6943,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -6955,7 +6957,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6978,7 +6980,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6989,7 +6991,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "log", "sp-arithmetic", @@ -6998,7 +7000,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "sp-api", @@ -7007,7 +7009,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7024,7 +7026,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -7053,7 +7055,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7071,7 +7073,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7090,7 +7092,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-support", "frame-system", @@ -7106,7 +7108,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7122,7 +7124,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7134,7 +7136,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7151,7 +7153,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7166,7 +7168,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7182,7 +7184,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7197,7 +7199,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7212,7 +7214,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7233,7 +7235,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "frame-benchmarking", "frame-support", @@ -7782,7 +7784,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "futures", "polkadot-node-jaeger", @@ -7798,7 +7800,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7812,7 +7814,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "derive_more", "fatality", @@ -7835,7 +7837,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "fatality", "futures", @@ -7856,7 +7858,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "clap 4.1.14", "frame-benchmarking-cli", @@ -7884,7 +7886,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "async-trait", "frame-benchmarking", @@ -7927,7 +7929,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "always-assert", "bitvec", @@ -7949,7 +7951,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "parity-scale-codec", "scale-info", @@ -7961,7 +7963,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "derive_more", "fatality", @@ -7986,7 +7988,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8000,7 +8002,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "futures", "futures-timer", @@ -8020,7 +8022,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "always-assert", "async-trait", @@ -8043,7 +8045,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "futures", "parity-scale-codec", @@ -8061,7 +8063,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bitvec", "derive_more", @@ -8090,7 +8092,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bitvec", "futures", @@ -8111,7 +8113,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bitvec", "fatality", @@ -8130,7 +8132,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8145,7 +8147,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "async-trait", "futures", @@ -8165,7 +8167,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "futures", "polkadot-node-metrics", @@ -8180,7 +8182,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "futures", "futures-timer", @@ -8197,7 +8199,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "fatality", "futures", @@ -8216,7 +8218,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "async-trait", "futures", @@ -8233,7 +8235,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bitvec", "fatality", @@ -8251,7 +8253,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "always-assert", "assert_matches", @@ -8288,7 +8290,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "futures", "polkadot-node-primitives", @@ -8304,7 +8306,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "futures", "lru 0.9.0", @@ -8319,7 +8321,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "lazy_static", "log", @@ -8337,7 +8339,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bs58", "futures", @@ -8356,7 +8358,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "async-trait", "derive_more", @@ -8378,7 +8380,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bounded-vec", "futures", @@ -8401,7 +8403,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8411,7 +8413,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "async-trait", "futures", @@ -8429,7 +8431,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "async-trait", "derive_more", @@ -8452,7 +8454,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "async-trait", "derive_more", @@ -8485,7 +8487,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "async-trait", "futures", @@ -8508,7 +8510,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bounded-collections", "derive_more", @@ -8606,7 +8608,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8622,7 +8624,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bitvec", "hex-literal 0.3.4", @@ -8648,7 +8650,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8680,7 +8682,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bitvec", "frame-benchmarking", @@ -8774,7 +8776,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bitvec", "frame-benchmarking", @@ -8820,7 +8822,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "frame-support", "polkadot-primitives", @@ -8834,7 +8836,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bs58", "parity-scale-codec", @@ -8846,7 +8848,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bitflags", "bitvec", @@ -8890,7 +8892,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9000,7 +9002,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9021,7 +9023,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9031,7 +9033,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9056,7 +9058,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9117,7 +9119,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "frame-benchmarking", "frame-system", @@ -9873,7 +9875,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -9959,7 +9961,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "frame-support", "polkadot-primitives", @@ -10206,7 +10208,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "log", "sp-core", @@ -10217,7 +10219,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "futures", @@ -10245,7 +10247,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "futures", "futures-timer", @@ -10268,7 +10270,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10283,7 +10285,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10302,7 +10304,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10313,7 +10315,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10353,7 +10355,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "fnv", "futures", @@ -10379,7 +10381,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "hash-db", "kvdb", @@ -10405,7 +10407,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "futures", @@ -10430,7 +10432,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "futures", @@ -10459,7 +10461,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "fork-tree", @@ -10498,7 +10500,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "futures", "jsonrpsee", @@ -10520,7 +10522,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10555,7 +10557,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "futures", "jsonrpsee", @@ -10574,7 +10576,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10587,7 +10589,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10627,7 +10629,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "finality-grandpa", "futures", @@ -10647,7 +10649,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "futures", @@ -10670,7 +10672,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10694,7 +10696,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10707,7 +10709,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "log", "sc-allocator", @@ -10720,7 +10722,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "anyhow", "cfg-if", @@ -10738,7 +10740,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "ansi_term", "futures", @@ -10754,7 +10756,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10769,7 +10771,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10814,7 +10816,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "cid", "futures", @@ -10834,7 +10836,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10862,7 +10864,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "ahash 0.8.2", "futures", @@ -10881,7 +10883,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10903,7 +10905,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10937,7 +10939,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10957,7 +10959,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -10988,7 +10990,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "futures", "libp2p", @@ -11001,7 +11003,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11010,7 +11012,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "futures", "jsonrpsee", @@ -11040,7 +11042,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11059,7 +11061,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "http", "jsonrpsee", @@ -11074,7 +11076,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11100,7 +11102,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "directories", @@ -11166,7 +11168,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "log", "parity-scale-codec", @@ -11177,7 +11179,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "clap 4.1.14", "fs4", @@ -11193,7 +11195,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11212,7 +11214,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "futures", "libc", @@ -11231,7 +11233,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "chrono", "futures", @@ -11250,7 +11252,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "ansi_term", "atty", @@ -11281,7 +11283,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11292,7 +11294,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "futures", @@ -11319,7 +11321,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "futures", @@ -11333,7 +11335,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-channel", "futures", @@ -11814,7 +11816,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "enumn", "parity-scale-codec", @@ -11891,13 +11893,15 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "hash-db", "log", "parity-scale-codec", + "scale-info", "sp-api-proc-macro", "sp-core", + "sp-metadata-ir", "sp-runtime", "sp-state-machine", "sp-std", @@ -11909,7 +11913,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "Inflector", "blake2", @@ -11923,7 +11927,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "scale-info", @@ -11936,7 +11940,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "integer-sqrt", "num-traits", @@ -11950,7 +11954,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "scale-info", @@ -11963,7 +11967,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "sp-api", @@ -11975,7 +11979,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "futures", "log", @@ -11993,7 +11997,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "futures", @@ -12008,7 +12012,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "parity-scale-codec", @@ -12026,7 +12030,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "merlin", @@ -12049,7 +12053,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12068,7 +12072,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "finality-grandpa", "log", @@ -12086,7 +12090,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "scale-info", @@ -12098,7 +12102,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "scale-info", @@ -12111,7 +12115,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12154,7 +12158,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "blake2b_simd", "byteorder", @@ -12168,7 +12172,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "proc-macro2", "quote", @@ -12179,7 +12183,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12188,7 +12192,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "proc-macro2", "quote", @@ -12198,7 +12202,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "environmental", "parity-scale-codec", @@ -12209,7 +12213,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12224,7 +12228,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "bytes", "ed25519", @@ -12250,7 +12254,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "lazy_static", "sp-core", @@ -12261,7 +12265,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "futures", "merlin", @@ -12277,16 +12281,27 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "thiserror", "zstd", ] +[[package]] +name = "sp-metadata-ir" +version = "0.1.0" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +dependencies = [ + "frame-metadata", + "parity-scale-codec", + "scale-info", + "sp-std", +] + [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12304,7 +12319,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "scale-info", @@ -12318,7 +12333,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "sp-api", "sp-core", @@ -12328,7 +12343,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "backtrace", "lazy_static", @@ -12338,7 +12353,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "rustc-hash", "serde", @@ -12348,7 +12363,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "either", "hash256-std-hasher", @@ -12370,7 +12385,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12388,7 +12403,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "Inflector", "proc-macro-crate", @@ -12400,7 +12415,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "serde", "serde_json", @@ -12409,7 +12424,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "scale-info", @@ -12423,7 +12438,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "scale-info", @@ -12435,7 +12450,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "hash-db", "log", @@ -12455,12 +12470,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12473,7 +12488,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "futures-timer", @@ -12488,7 +12503,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "sp-std", @@ -12500,7 +12515,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "sp-api", "sp-runtime", @@ -12509,7 +12524,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "log", @@ -12525,7 +12540,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12548,7 +12563,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12565,7 +12580,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12576,7 +12591,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12590,7 +12605,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "parity-scale-codec", "scale-info", @@ -12914,7 +12929,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "platforms 2.0.0", ] @@ -12922,7 +12937,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -12941,7 +12956,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "hyper", "log", @@ -12953,7 +12968,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "jsonrpsee", @@ -12966,7 +12981,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "jsonrpsee", "log", @@ -12985,7 +13000,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13011,7 +13026,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13021,7 +13036,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13032,7 +13047,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "ansi_term", "build-helper", @@ -13159,7 +13174,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "frame-support", "polkadot-primitives", @@ -13549,7 +13564,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13560,7 +13575,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "expander 0.0.6", "proc-macro-crate", @@ -13690,7 +13705,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7bbfe737a180e548ace7e819099dcb62cf48fa11" +source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" dependencies = [ "async-trait", "clap 4.1.14", @@ -14618,7 +14633,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bitvec", "frame-benchmarking", @@ -14710,7 +14725,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "frame-support", "polkadot-primitives", @@ -15146,7 +15161,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "bounded-collections", "derivative", @@ -15162,7 +15177,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "frame-support", "frame-system", @@ -15183,7 +15198,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "environmental", "frame-benchmarking", @@ -15203,7 +15218,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dc230b323b5baeb9b4297430ed539b208d30bf6a" +source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachain-template/node/src/service.rs b/parachain-template/node/src/service.rs index 86d85f18faa..6fc04ef91d5 100644 --- a/parachain-template/node/src/service.rs +++ b/parachain-template/node/src/service.rs @@ -22,7 +22,9 @@ use cumulus_relay_chain_interface::RelayChainInterface; // Substrate Imports use frame_benchmarking_cli::SUBSTRATE_REFERENCE_HARDWARE; use sc_consensus::ImportQueue; -use sc_executor::NativeElseWasmExecutor; +use sc_executor::{ + HeapAllocStrategy, NativeElseWasmExecutor, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY, +}; use sc_network::NetworkBlock; use sc_network_sync::SyncingService; use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; @@ -81,12 +83,19 @@ pub fn new_partial( }) .transpose()?; - let executor = ParachainExecutor::new( - config.wasm_method, - config.default_heap_pages, - config.max_runtime_instances, - config.runtime_cache_size, - ); + let heap_pages = config + .default_heap_pages + .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |h| HeapAllocStrategy::Static { extra_pages: h as _ }); + + let wasm = WasmExecutor::builder() + .with_execution_method(config.wasm_method) + .with_onchain_heap_alloc_strategy(heap_pages) + .with_offchain_heap_alloc_strategy(heap_pages) + .with_max_runtime_instances(config.max_runtime_instances) + .with_runtime_cache_size(config.runtime_cache_size) + .build(); + + let executor = ParachainExecutor::new_with_wasm_executor(wasm); let (client, backend, keystore_container, task_manager) = sc_service::new_full_parts::( diff --git a/parachains/runtimes/assets/common/Cargo.toml b/parachains/runtimes/assets/common/Cargo.toml index 7a795057cd5..69f56a2405e 100644 --- a/parachains/runtimes/assets/common/Cargo.toml +++ b/parachains/runtimes/assets/common/Cargo.toml @@ -7,6 +7,7 @@ description = "Assets common utilities" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } # Substrate diff --git a/parachains/runtimes/assets/common/src/runtime_api.rs b/parachains/runtimes/assets/common/src/runtime_api.rs index 6d060f22687..36a8df1271e 100644 --- a/parachains/runtimes/assets/common/src/runtime_api.rs +++ b/parachains/runtimes/assets/common/src/runtime_api.rs @@ -21,7 +21,7 @@ use sp_std::vec::Vec; use xcm::latest::MultiAsset; /// The possible errors that can happen querying the storage of assets. -#[derive(Eq, PartialEq, Encode, Decode, RuntimeDebug)] +#[derive(Eq, PartialEq, Encode, Decode, RuntimeDebug, scale_info::TypeInfo)] pub enum FungiblesAccessError { /// `MultiLocation` to `AssetId`/`ClassId` conversion failed. AssetIdConversionFailed, diff --git a/polkadot-parachain/src/service.rs b/polkadot-parachain/src/service.rs index ee5ae0572a8..000ebef80fd 100644 --- a/polkadot-parachain/src/service.rs +++ b/polkadot-parachain/src/service.rs @@ -42,7 +42,7 @@ use sc_consensus::{ import_queue::{BasicQueue, Verifier as VerifierT}, BlockImportParams, ImportQueue, }; -use sc_executor::WasmExecutor; +use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; use sc_network::NetworkBlock; use sc_network_sync::SyncingService; use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; @@ -257,13 +257,17 @@ where }) .transpose()?; - let executor = sc_executor::WasmExecutor::::new( - config.wasm_method, - config.default_heap_pages, - config.max_runtime_instances, - None, - config.runtime_cache_size, - ); + let heap_pages = config + .default_heap_pages + .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |h| HeapAllocStrategy::Static { extra_pages: h as _ }); + + let executor = sc_executor::WasmExecutor::::builder() + .with_execution_method(config.wasm_method) + .with_max_runtime_instances(config.max_runtime_instances) + .with_runtime_cache_size(config.runtime_cache_size) + .with_onchain_heap_alloc_strategy(heap_pages) + .with_offchain_heap_alloc_strategy(heap_pages) + .build(); let (client, backend, keystore_container, task_manager) = sc_service::new_full_parts::( diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index bc00a655563..8429cd0d0d3 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } # Substrate sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -23,6 +24,7 @@ xcm = { git = "https://github.com/paritytech/polkadot", default-features = false default = [ "std" ] std = [ "codec/std", + "scale-info/std", "sp-api/std", "sp-runtime/std", "sp-std/std", diff --git a/primitives/core/src/lib.rs b/primitives/core/src/lib.rs index d94224927dc..52770cdf716 100644 --- a/primitives/core/src/lib.rs +++ b/primitives/core/src/lib.rs @@ -20,6 +20,7 @@ use codec::{Decode, Encode}; use polkadot_parachain::primitives::HeadData; +use scale_info::TypeInfo; use sp_runtime::{traits::Block as BlockT, RuntimeDebug}; use sp_std::prelude::*; @@ -229,7 +230,7 @@ impl CollationInfoV1 { } /// Information about a collation. -#[derive(Clone, Debug, codec::Decode, codec::Encode, PartialEq)] +#[derive(Clone, Debug, codec::Decode, codec::Encode, PartialEq, TypeInfo)] pub struct CollationInfo { /// Messages destined to be interpreted by the Relay chain itself. pub upward_messages: Vec, diff --git a/test/client/src/lib.rs b/test/client/src/lib.rs index e50d4adf322..4008dca350d 100644 --- a/test/client/src/lib.rs +++ b/test/client/src/lib.rs @@ -22,7 +22,7 @@ use runtime::{ Balance, Block, BlockHashCount, GenesisConfig, Runtime, RuntimeCall, Signature, SignedExtra, SignedPayload, UncheckedExtrinsic, VERSION, }; -use sc_executor::{WasmExecutionMethod, WasmExecutor}; +use sc_executor::{HeapAllocStrategy, WasmExecutionMethod, WasmExecutor}; use sc_executor_common::runtime_blob::RuntimeBlob; use sc_service::client; use sp_blockchain::HeaderBackend; @@ -181,13 +181,14 @@ pub fn validate_block( let mut ext = TestExternalities::default(); let mut ext_ext = ext.ext(); - let executor = WasmExecutor::::new( - WasmExecutionMethod::Interpreted, - Some(1024), - 1, - None, - 2, - ); + let heap_pages = HeapAllocStrategy::Static { extra_pages: 1024 }; + let executor = WasmExecutor::::builder() + .with_execution_method(WasmExecutionMethod::Interpreted) + .with_max_runtime_instances(1) + .with_runtime_cache_size(2) + .with_onchain_heap_alloc_strategy(heap_pages) + .with_offchain_heap_alloc_strategy(heap_pages) + .build(); executor .uncached_call( diff --git a/test/service/src/lib.rs b/test/service/src/lib.rs index e34237d1017..5b38a53afb4 100644 --- a/test/service/src/lib.rs +++ b/test/service/src/lib.rs @@ -21,6 +21,7 @@ pub mod chain_spec; mod genesis; +use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; use std::{ future::Future, net::{IpAddr, Ipv4Addr, SocketAddr}, @@ -184,12 +185,20 @@ pub fn new_partial( >, sc_service::Error, > { - let executor = sc_executor::NativeElseWasmExecutor::::new( - config.wasm_method, - config.default_heap_pages, - config.max_runtime_instances, - config.runtime_cache_size, - ); + let heap_pages = config + .default_heap_pages + .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |h| HeapAllocStrategy::Static { extra_pages: h as _ }); + + let wasm = WasmExecutor::builder() + .with_execution_method(config.wasm_method) + .with_onchain_heap_alloc_strategy(heap_pages) + .with_offchain_heap_alloc_strategy(heap_pages) + .with_max_runtime_instances(config.max_runtime_instances) + .with_runtime_cache_size(config.runtime_cache_size) + .build(); + + let executor = + sc_executor::NativeElseWasmExecutor::::new_with_wasm_executor(wasm); let (client, backend, keystore_container, task_manager) = sc_service::new_full_parts::(config, None, executor)?; From b4a50e2775a62c91abc69ba9f8b868bc53c5a926 Mon Sep 17 00:00:00 2001 From: Mira Ressel Date: Tue, 11 Apr 2023 12:47:06 +0200 Subject: [PATCH 109/339] use stable rust toolchain in ci --- .gitlab-ci.yml | 2 -- scripts/ci/gitlab/pipeline/build.yml | 2 +- scripts/ci/gitlab/pipeline/test.yml | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 449d32a993a..2e0f6330d70 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -109,8 +109,6 @@ variables: - !reference [.common-before-script, before_script] - rustup show - cargo --version - - rustup +nightly show - - cargo +nightly --version - bash --version tags: - linux-docker-vm-c2 diff --git a/scripts/ci/gitlab/pipeline/build.yml b/scripts/ci/gitlab/pipeline/build.yml index a60ef29c9a0..e512c9e7f74 100644 --- a/scripts/ci/gitlab/pipeline/build.yml +++ b/scripts/ci/gitlab/pipeline/build.yml @@ -40,7 +40,7 @@ build-test-parachain: artifacts: false script: - echo "___Building a binary, please refrain from using it in production since it goes with the debug assertions.___" - - time cargo +nightly build --release --locked --bin test-parachain + - time cargo build --release --locked --bin test-parachain - echo "___Packing the artifacts___" - mkdir -p ./artifacts - mv ./target/release/test-parachain ./artifacts/. diff --git a/scripts/ci/gitlab/pipeline/test.yml b/scripts/ci/gitlab/pipeline/test.yml index 765a80b7b60..5bafe970fbc 100644 --- a/scripts/ci/gitlab/pipeline/test.yml +++ b/scripts/ci/gitlab/pipeline/test.yml @@ -84,7 +84,7 @@ check-rustdoc: SKIP_WASM_BUILD: 1 RUSTDOCFLAGS: "-Dwarnings" script: - - time cargo +nightly doc --workspace --all-features --verbose --no-deps + - time cargo doc --workspace --all-features --verbose --no-deps cargo-check-benches: stage: test From 4733416e083781b4069dddc95c1352cb3b636643 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Apr 2023 10:03:14 +0200 Subject: [PATCH 110/339] Bump syn from 2.0.13 to 2.0.14 (#2446) Bumps [syn](https://github.com/dtolnay/syn) from 2.0.13 to 2.0.14. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.13...2.0.14) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 18 +++++++++--------- pallets/parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e20de817a01..54c8dc44ffe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -428,7 +428,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.14", ] [[package]] @@ -1224,7 +1224,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.14", ] [[package]] @@ -2121,7 +2121,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.14", ] [[package]] @@ -3771,7 +3771,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.14", ] [[package]] @@ -11613,7 +11613,7 @@ checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.14", ] [[package]] @@ -13089,9 +13089,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.13" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" +checksum = "fcf316d5356ed6847742d036f8a39c3b8435cac10bd528a4bd461928a6ab34d5" dependencies = [ "proc-macro2", "quote", @@ -13208,7 +13208,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.14", ] [[package]] @@ -13379,7 +13379,7 @@ checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.14", ] [[package]] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index 170372eb2b1..9312575a05b 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -9,7 +9,7 @@ description = "Proc macros provided by the parachain-system pallet" proc-macro = true [dependencies] -syn = "2.0.13" +syn = "2.0.14" proc-macro2 = "1.0.54" quote = "1.0.26" proc-macro-crate = "1.3.1" From 5a0ebaddbcb48820d60bd198124448e1e044458d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Apr 2023 10:04:29 +0200 Subject: [PATCH 111/339] Bump serde from 1.0.159 to 1.0.160 (#2445) Bumps [serde](https://github.com/serde-rs/serde) from 1.0.159 to 1.0.160. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.159...v1.0.160) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- client/relay-chain-rpc-interface/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 54c8dc44ffe..85596ef1e8e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11598,18 +11598,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.159" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.159" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index 85f78b199e9..42984d71e8f 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -31,5 +31,5 @@ tracing = "0.1.37" async-trait = "0.1.68" url = "2.3.1" serde_json = "1.0.95" -serde = "1.0.159" +serde = "1.0.160" lru = "0.9.0" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index 5bdeffa1541..90e522ee17e 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -13,7 +13,7 @@ build = "build.rs" clap = { version = "4.1.14", features = ["derive"] } log = "0.4.17" codec = { package = "parity-scale-codec", version = "3.0.0" } -serde = { version = "1.0.159", features = ["derive"] } +serde = { version = "1.0.160", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } # Local diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index 7a08937cca9..00a9da0103c 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.159", optional = true, features = ["derive"] } +serde = { version = "1.0.160", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index adda06b0b3e..86bb0780027 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.159", optional = true, features = ["derive"] } +serde = { version = "1.0.160", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 04aefe39ea3..2efdcfd8263 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.159", optional = true, features = ["derive"] } +serde = { version = "1.0.160", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index b4ced899f25..fb53c92b375 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -17,7 +17,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" log = "0.4.17" -serde = { version = "1.0.159", features = ["derive"] } +serde = { version = "1.0.160", features = ["derive"] } # Local rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parachain" } diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 5388b83e23e..062dbc834c3 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -15,7 +15,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.4.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" -serde = { version = "1.0.159", features = ["derive"] } +serde = { version = "1.0.160", features = ["derive"] } tokio = { version = "1.27.0", features = ["macros"] } tracing = "0.1.37" url = "2.3.1" From 030db02f876461c19fc617dd7899536881b4ca26 Mon Sep 17 00:00:00 2001 From: Mira Ressel Date: Wed, 12 Apr 2023 12:06:05 +0200 Subject: [PATCH 112/339] Invoke cargo build commands with `--locked` (#2444) --- scripts/ci/gitlab/pipeline/build.yml | 2 +- scripts/ci/gitlab/pipeline/test.yml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/ci/gitlab/pipeline/build.yml b/scripts/ci/gitlab/pipeline/build.yml index e512c9e7f74..e4678727e9b 100644 --- a/scripts/ci/gitlab/pipeline/build.yml +++ b/scripts/ci/gitlab/pipeline/build.yml @@ -65,7 +65,7 @@ build-test-parachain: echo "_____Running cargo check for ${directory} ______"; cd ${directory}; pwd; - SKIP_WASM_BUILD=1 cargo check; + SKIP_WASM_BUILD=1 cargo check --locked; cd ..; done diff --git a/scripts/ci/gitlab/pipeline/test.yml b/scripts/ci/gitlab/pipeline/test.yml index 5bafe970fbc..0ef51ae2e6d 100644 --- a/scripts/ci/gitlab/pipeline/test.yml +++ b/scripts/ci/gitlab/pipeline/test.yml @@ -56,9 +56,9 @@ check-runtime-benchmarks: - .common-refs script: # Check that the node will compile with `runtime-benchmarks` feature flag. - - time cargo check --all --features runtime-benchmarks + - time cargo check --locked --all --features runtime-benchmarks # Check that parachain-template will compile with `runtime-benchmarks` feature flag. - - time cargo check -p parachain-template-node --features runtime-benchmarks + - time cargo check --locked -p parachain-template-node --features runtime-benchmarks cargo-check-try-runtime: stage: test @@ -71,9 +71,9 @@ cargo-check-try-runtime: artifacts: false script: # Check that the node will compile with `try-runtime` feature flag. - - time cargo check --all --features try-runtime + - time cargo check --locked --all --features try-runtime # Check that parachain-template will compile with `try-runtime` feature flag. - - time cargo check -p parachain-template-node --features try-runtime + - time cargo check --locked -p parachain-template-node --features try-runtime check-rustdoc: stage: test From df9ed2455462e8c470a8a7ead44023b6eec79ed3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Apr 2023 00:24:16 +0200 Subject: [PATCH 113/339] Bump actions/checkout from 3.1.0 to 3.5.1 (#2448) * Bump actions/checkout from 3.1.0 to 3.5.1 Bumps [actions/checkout](https://github.com/actions/checkout) from 3.1.0 to 3.5.1. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3.1.0...83b7061638ee4956cf7545a6f7efe594e5ad0247) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * align version with hash --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sergejs Kostjucenko --- .github/workflows/docs.yml | 2 +- .github/workflows/fmt-check.yml | 2 +- .github/workflows/release-01_branch-check.yml | 2 +- .github/workflows/release-10_rc-automation.yml | 2 +- .../release-20_extrinsic-ordering-check-from-bin.yml | 2 +- .../release-21_extrinsic-ordering-check-from-two.yml | 2 +- .github/workflows/release-30_create-draft.yml | 6 +++--- .github/workflows/release-50_docker-manual.yml | 2 +- .github/workflows/release-50_docker.yml | 2 +- .github/workflows/srtool.yml | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 473684d2950..4af4ba06bdb 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,7 +17,7 @@ jobs: protoc --version - name: Checkout repository - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 - name: Rust versions run: rustup show diff --git a/.github/workflows/fmt-check.yml b/.github/workflows/fmt-check.yml index 9d2af9bb2cf..05c3cda3ad2 100644 --- a/.github/workflows/fmt-check.yml +++ b/.github/workflows/fmt-check.yml @@ -31,7 +31,7 @@ jobs: target key: ${{ runner.os }}-${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 - name: Cargo fmt uses: actions-rs/cargo@ae10961054e4aa8b4aa7dffede299aaf087aa33b # v1.0.3 diff --git a/.github/workflows/release-01_branch-check.yml b/.github/workflows/release-01_branch-check.yml index f65e45e47b1..8b8e1522435 100644 --- a/.github/workflows/release-01_branch-check.yml +++ b/.github/workflows/release-01_branch-check.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 with: fetch-depth: 0 diff --git a/.github/workflows/release-10_rc-automation.yml b/.github/workflows/release-10_rc-automation.yml index c6b70326bf5..ebb0770b987 100644 --- a/.github/workflows/release-10_rc-automation.yml +++ b/.github/workflows/release-10_rc-automation.yml @@ -17,7 +17,7 @@ jobs: pre-releases: true steps: - name: Checkout sources - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 with: fetch-depth: 0 - id: compute_tag diff --git a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml index 16424ba03d0..2ecc87b2e20 100644 --- a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml +++ b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml @@ -29,7 +29,7 @@ jobs: REF_URL: ${{github.event.inputs.reference_url}} steps: - - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 - name: Fetch binary run: | diff --git a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml index a8d9a3bcc39..91f8d56f344 100644 --- a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml +++ b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml @@ -42,7 +42,7 @@ jobs: relay: polkadot-local steps: - - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 - name: Create tmp dir run: | diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index fc5d9ac0622..9b8d6f813b8 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -68,7 +68,7 @@ jobs: runtime: rococo-parachain steps: - name: Checkout sources - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 with: ref: ${{ github.event.inputs.ref2 }} @@ -120,7 +120,7 @@ jobs: asset_upload_url: ${{ steps.create-release.outputs.upload_url }} steps: - name: Checkout sources - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 with: fetch-depth: 0 path: cumulus @@ -246,7 +246,7 @@ jobs: runtime: rococo-parachain steps: - name: Checkout sources - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 with: ref: ${{ github.event.inputs.ref2 }} diff --git a/.github/workflows/release-50_docker-manual.yml b/.github/workflows/release-50_docker-manual.yml index 487b104a1a1..4e4cfdaad8f 100644 --- a/.github/workflows/release-50_docker-manual.yml +++ b/.github/workflows/release-50_docker-manual.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 with: ref: ${{ github.event.release.tag_name }} diff --git a/.github/workflows/release-50_docker.yml b/.github/workflows/release-50_docker.yml index fce5e929d96..06fecdd964b 100644 --- a/.github/workflows/release-50_docker.yml +++ b/.github/workflows/release-50_docker.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 with: ref: ${{ github.event.release.tag_name }} diff --git a/.github/workflows/srtool.yml b/.github/workflows/srtool.yml index 390c7628439..d9013805c1b 100644 --- a/.github/workflows/srtool.yml +++ b/.github/workflows/srtool.yml @@ -54,7 +54,7 @@ jobs: - category: testing runtime: rococo-parachain steps: - - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 with: fetch-depth: 0 From 71d427f1e8167166644b593f5649108f8e6e2b1c Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 13 Apr 2023 10:15:20 +0200 Subject: [PATCH 114/339] Updated doc --- parachains/pallets/bridge-transfer/src/lib.rs | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index d772543e399..abf6e3eddb1 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -15,7 +15,38 @@ //! # Bridge Transfer Pallet //! -//! A utility which could help transfer through bridges, e.g. move assets between different global consensus... +//! Module which could help with different transfers through bridges, +//! e.g. move assets between different global consensus... +//! +//! ## Overview +//! +//! Pallet supports configuration for two independent scenarios: +//! +//! ### Transfer out +//! +//! * see (Config for transfer out) in the code +//! * if you want to allow initiate bridge transfer from runtime, +//! actually pallet supports asset transfer and ping with dedicated extrinsics `transfer_asset_via_bridge` / `ping_via_bridge` +//! * e.g. for asset transfer with correct configuration it sends `ReserveAssetDeposited` over bridge, +//! you can configure bridge location and allowed target location with `AllowedExporters` +//! +//! ### Transfer in +//! +//! * see (Config for transfer in) in the code +//! * e.g. if you want to allow process xcm `UniversalOrigin` instruction, +//! you can configure "allowed universal aliases" here and then use it for `xcm_executor::Config`: +//! `type UniversalAliases = AllowedUniversalAliasesOf;` +//! * e.g. if you want to allow process xcm `ReserveAssetDeposited` instruction, +//! you can configure "allowed reserve locations" here and then use it for `xcm_executor::Config`: +//! ```nocompile +//! type IsReserve = IsAllowedReserveOf< +//! Runtime, +//! IsDifferentGlobalConsensusConcreteAsset, +//! >; +//! ``` +//! +//! Transfer in/out are independent so you can configure just to receive or just to send part. +//! All configuration is done by dedicated extrinsics under `AdminOrigin` so for example runtime can allow to change this configuration just by governance. // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] @@ -189,6 +220,7 @@ pub mod pallet { } /// Details of configured bridges which are allowed for **transfer out**. + /// (Config for transfer out) #[pallet::storage] #[pallet::getter(fn allowed_exporters)] pub(super) type AllowedExporters = From 574f425fa2b9c822a1417af705169ab3a1835e24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Apr 2023 21:43:33 +0000 Subject: [PATCH 115/339] Bump serde_json from 1.0.95 to 1.0.96 (#2453) Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.95 to 1.0.96. - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.95...v1.0.96) --- updated-dependencies: - dependency-name: serde_json dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- client/relay-chain-rpc-interface/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 85596ef1e8e..7369594afd4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11618,9 +11618,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa 1.0.4", "ryu", diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index 42984d71e8f..655c7c8e74c 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -30,6 +30,6 @@ jsonrpsee = { version = "0.16.2", features = ["ws-client"] } tracing = "0.1.37" async-trait = "0.1.68" url = "2.3.1" -serde_json = "1.0.95" +serde_json = "1.0.96" serde = "1.0.160" lru = "0.9.0" From b42855d89256153acbdc226cdc0133bc7f5e61e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Apr 2023 11:25:54 +0000 Subject: [PATCH 116/339] Bump actions/checkout from 3.5.1 to 3.5.2 (#2452) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.5.1 to 3.5.2. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/83b7061638ee4956cf7545a6f7efe594e5ad0247...8e5e7e5ab8b370d6c329ec480221332ada57f0ab) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yml | 2 +- .github/workflows/fmt-check.yml | 2 +- .github/workflows/release-01_branch-check.yml | 2 +- .github/workflows/release-10_rc-automation.yml | 2 +- .../release-20_extrinsic-ordering-check-from-bin.yml | 2 +- .../release-21_extrinsic-ordering-check-from-two.yml | 2 +- .github/workflows/release-30_create-draft.yml | 6 +++--- .github/workflows/release-50_docker-manual.yml | 2 +- .github/workflows/release-50_docker.yml | 2 +- .github/workflows/srtool.yml | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 4af4ba06bdb..81b94b0722f 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,7 +17,7 @@ jobs: protoc --version - name: Checkout repository - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Rust versions run: rustup show diff --git a/.github/workflows/fmt-check.yml b/.github/workflows/fmt-check.yml index 05c3cda3ad2..cdde5c820cc 100644 --- a/.github/workflows/fmt-check.yml +++ b/.github/workflows/fmt-check.yml @@ -31,7 +31,7 @@ jobs: target key: ${{ runner.os }}-${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Cargo fmt uses: actions-rs/cargo@ae10961054e4aa8b4aa7dffede299aaf087aa33b # v1.0.3 diff --git a/.github/workflows/release-01_branch-check.yml b/.github/workflows/release-01_branch-check.yml index 8b8e1522435..c6237b40ceb 100644 --- a/.github/workflows/release-01_branch-check.yml +++ b/.github/workflows/release-01_branch-check.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: fetch-depth: 0 diff --git a/.github/workflows/release-10_rc-automation.yml b/.github/workflows/release-10_rc-automation.yml index ebb0770b987..d0c669a5885 100644 --- a/.github/workflows/release-10_rc-automation.yml +++ b/.github/workflows/release-10_rc-automation.yml @@ -17,7 +17,7 @@ jobs: pre-releases: true steps: - name: Checkout sources - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: fetch-depth: 0 - id: compute_tag diff --git a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml index 2ecc87b2e20..340f72420be 100644 --- a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml +++ b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml @@ -29,7 +29,7 @@ jobs: REF_URL: ${{github.event.inputs.reference_url}} steps: - - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Fetch binary run: | diff --git a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml index 91f8d56f344..98b88de2ad4 100644 --- a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml +++ b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml @@ -42,7 +42,7 @@ jobs: relay: polkadot-local steps: - - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Create tmp dir run: | diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index 9b8d6f813b8..e8ce688b71b 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -68,7 +68,7 @@ jobs: runtime: rococo-parachain steps: - name: Checkout sources - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: ref: ${{ github.event.inputs.ref2 }} @@ -120,7 +120,7 @@ jobs: asset_upload_url: ${{ steps.create-release.outputs.upload_url }} steps: - name: Checkout sources - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: fetch-depth: 0 path: cumulus @@ -246,7 +246,7 @@ jobs: runtime: rococo-parachain steps: - name: Checkout sources - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: ref: ${{ github.event.inputs.ref2 }} diff --git a/.github/workflows/release-50_docker-manual.yml b/.github/workflows/release-50_docker-manual.yml index 4e4cfdaad8f..b4b2964cbe9 100644 --- a/.github/workflows/release-50_docker-manual.yml +++ b/.github/workflows/release-50_docker-manual.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: ref: ${{ github.event.release.tag_name }} diff --git a/.github/workflows/release-50_docker.yml b/.github/workflows/release-50_docker.yml index 06fecdd964b..a2051071ffe 100644 --- a/.github/workflows/release-50_docker.yml +++ b/.github/workflows/release-50_docker.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: ref: ${{ github.event.release.tag_name }} diff --git a/.github/workflows/srtool.yml b/.github/workflows/srtool.yml index d9013805c1b..9b20be76611 100644 --- a/.github/workflows/srtool.yml +++ b/.github/workflows/srtool.yml @@ -54,7 +54,7 @@ jobs: - category: testing runtime: rococo-parachain steps: - - uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 # v3.5.1 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: fetch-depth: 0 From a26ebb27cbde26f18bd6fba1544d8f690ae57fa8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Apr 2023 23:13:45 +0000 Subject: [PATCH 117/339] Bump syn from 2.0.14 to 2.0.15 (#2454) Bumps [syn](https://github.com/dtolnay/syn) from 2.0.14 to 2.0.15. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.14...2.0.15) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 18 +++++++++--------- pallets/parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7369594afd4..d3a56703d50 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -428,7 +428,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -1224,7 +1224,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -2121,7 +2121,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -3771,7 +3771,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -11613,7 +11613,7 @@ checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -13089,9 +13089,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.14" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf316d5356ed6847742d036f8a39c3b8435cac10bd528a4bd461928a6ab34d5" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" dependencies = [ "proc-macro2", "quote", @@ -13208,7 +13208,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -13379,7 +13379,7 @@ checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index 9312575a05b..2eb35fe4f0b 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -9,7 +9,7 @@ description = "Proc macros provided by the parachain-system pallet" proc-macro = true [dependencies] -syn = "2.0.14" +syn = "2.0.15" proc-macro2 = "1.0.54" quote = "1.0.26" proc-macro-crate = "1.3.1" From 863e94d8627bfd30c61cf2aeac3b8706f768bb8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Apr 2023 21:45:04 +0000 Subject: [PATCH 118/339] Bump assert_cmd from 2.0.10 to 2.0.11 (#2457) Bumps [assert_cmd](https://github.com/assert-rs/assert_cmd) from 2.0.10 to 2.0.11. - [Release notes](https://github.com/assert-rs/assert_cmd/releases) - [Changelog](https://github.com/assert-rs/assert_cmd/blob/master/CHANGELOG.md) - [Commits](https://github.com/assert-rs/assert_cmd/compare/v2.0.10...v2.0.11) --- updated-dependencies: - dependency-name: assert_cmd dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d3a56703d50..7e72b09483d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -185,6 +185,12 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ba0b55c2201aa802adb684e7963ce2c3191675629e7df899774331e3ac747cf" +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + [[package]] name = "anyhow" version = "1.0.69" @@ -311,11 +317,11 @@ checksum = "e22d1f4b888c298a027c99dc9048015fac177587de20fc30232a057dfbe24a21" [[package]] name = "assert_cmd" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0b2340f55d9661d76793b2bfc2eb0e62689bd79d067a95707ea762afd5e9dd" +checksum = "86d6b683edf8d1119fe420a94f8a7e389239666aa72e65495d91c00462510151" dependencies = [ - "anstyle", + "anstyle 1.0.0", "bstr 1.1.0", "doc-comment", "predicates 3.0.1", @@ -9251,7 +9257,7 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ba7d6ead3e3966038f68caa9fc1f860185d95a793180bbcfe0d0da47b3961ed" dependencies = [ - "anstyle", + "anstyle 0.3.4", "difflib", "itertools", "predicates-core", From 72349fce04b07fc452f117a933b9d402e591c763 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 17 Apr 2023 17:01:40 +0200 Subject: [PATCH 119/339] Changed `query_account_balances` return type (#2455) --- .../runtimes/assets/common/src/runtime_api.rs | 5 +++++ parachains/runtimes/assets/statemine/src/lib.rs | 4 ++-- .../runtimes/assets/statemine/tests/tests.rs | 17 ++++++++++++----- parachains/runtimes/assets/statemint/src/lib.rs | 4 ++-- .../runtimes/assets/statemint/tests/tests.rs | 15 +++++++++++---- parachains/runtimes/assets/westmint/src/lib.rs | 4 ++-- .../runtimes/assets/westmint/tests/tests.rs | 17 ++++++++++++----- 7 files changed, 46 insertions(+), 20 deletions(-) diff --git a/parachains/runtimes/assets/common/src/runtime_api.rs b/parachains/runtimes/assets/common/src/runtime_api.rs index 36a8df1271e..ceb8bc13fcc 100644 --- a/parachains/runtimes/assets/common/src/runtime_api.rs +++ b/parachains/runtimes/assets/common/src/runtime_api.rs @@ -31,11 +31,16 @@ pub enum FungiblesAccessError { sp_api::decl_runtime_apis! { /// The API for querying account's balances from runtime. + #[api_version(2)] pub trait FungiblesApi where AccountId: Codec, { /// Returns the list of all [`MultiAsset`] that an `AccountId` has. + #[changed_in(2)] fn query_account_balances(account: AccountId) -> Result, FungiblesAccessError>; + + /// Returns the list of all [`MultiAsset`] that an `AccountId` has. + fn query_account_balances(account: AccountId) -> Result; } } diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 62425aa7496..5f987851a18 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -951,7 +951,7 @@ impl_runtime_apis! { AccountId, > for Runtime { - fn query_account_balances(account: AccountId) -> Result, assets_common::runtime_api::FungiblesAccessError> { + fn query_account_balances(account: AccountId) -> Result { use assets_common::fungible_conversion::{convert, convert_balance}; Ok([ // collect pallet_balance @@ -976,7 +976,7 @@ impl_runtime_apis! { .filter(|(_, balance)| balance > &0) )?, // collect ... e.g. other tokens - ].concat()) + ].concat().into()) } } diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index 972abe9d427..acfb2417e4b 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -383,7 +383,11 @@ fn test_assets_balances_api_works() { 0 ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0); - assert!(Runtime::query_account_balances(AccountId::from(ALICE)).unwrap().is_empty()); + assert!(Runtime::query_account_balances(AccountId::from(ALICE)) + .unwrap() + .try_as::() + .unwrap() + .is_none()); // Drip some balance use frame_support::traits::fungible::Mutate; @@ -437,24 +441,27 @@ fn test_assets_balances_api_works() { ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency); - let result = Runtime::query_account_balances(AccountId::from(ALICE)).unwrap(); + let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE)) + .unwrap() + .try_into() + .unwrap(); assert_eq!(result.len(), 3); // check currency - assert!(result.iter().any(|asset| asset.eq( + assert!(result.inner().iter().any(|asset| asset.eq( &assets_common::fungible_conversion::convert_balance::( some_currency ) .unwrap() ))); // check trusted asset - assert!(result.iter().any(|asset| asset.eq(&( + assert!(result.inner().iter().any(|asset| asset.eq(&( AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(), minimum_asset_balance ) .into()))); // check foreign asset - assert!(result.iter().any(|asset| asset.eq(&( + assert!(result.inner().iter().any(|asset| asset.eq(&( Identity::reverse_ref(foreign_asset_id_multilocation).unwrap(), 6 * foreign_asset_minimum_asset_balance ) diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index a72df7314e6..aa90ca7a157 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -855,7 +855,7 @@ impl_runtime_apis! { AccountId, > for Runtime { - fn query_account_balances(account: AccountId) -> Result, assets_common::runtime_api::FungiblesAccessError> { + fn query_account_balances(account: AccountId) -> Result { use assets_common::fungible_conversion::{convert, convert_balance}; Ok([ // collect pallet_balance @@ -874,7 +874,7 @@ impl_runtime_apis! { .filter(|(_, balance)| balance > &0) )?, // collect ... e.g. pallet_assets ForeignAssets - ].concat()) + ].concat().into()) } } diff --git a/parachains/runtimes/assets/statemint/tests/tests.rs b/parachains/runtimes/assets/statemint/tests/tests.rs index 501c16960aa..75f6aaf6d57 100644 --- a/parachains/runtimes/assets/statemint/tests/tests.rs +++ b/parachains/runtimes/assets/statemint/tests/tests.rs @@ -389,7 +389,11 @@ fn test_assets_balances_api_works() { // check before assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0); - assert!(Runtime::query_account_balances(AccountId::from(ALICE)).unwrap().is_empty()); + assert!(Runtime::query_account_balances(AccountId::from(ALICE)) + .unwrap() + .try_as::() + .unwrap() + .is_none()); // Drip some balance use frame_support::traits::fungible::Mutate; @@ -421,18 +425,21 @@ fn test_assets_balances_api_works() { ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency); - let result = Runtime::query_account_balances(AccountId::from(ALICE)).unwrap(); + let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE)) + .unwrap() + .try_into() + .unwrap(); assert_eq!(result.len(), 2); // check currency - assert!(result.iter().any(|asset| asset.eq( + assert!(result.inner().iter().any(|asset| asset.eq( &assets_common::fungible_conversion::convert_balance::( some_currency ) .unwrap() ))); // check trusted asset - assert!(result.iter().any(|asset| asset.eq(&( + assert!(result.inner().iter().any(|asset| asset.eq(&( AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(), minimum_asset_balance ) diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 97d2596a4bd..c237c8dc5cf 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -963,7 +963,7 @@ impl_runtime_apis! { AccountId, > for Runtime { - fn query_account_balances(account: AccountId) -> Result, assets_common::runtime_api::FungiblesAccessError> { + fn query_account_balances(account: AccountId) -> Result { use assets_common::fungible_conversion::{convert, convert_balance}; Ok([ // collect pallet_balance @@ -988,7 +988,7 @@ impl_runtime_apis! { .filter(|(_, balance)| balance > &0) )?, // collect ... e.g. other tokens - ].concat()) + ].concat().into()) } } diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index e04c163b01f..c0c20c6b61a 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -388,7 +388,11 @@ fn test_assets_balances_api_works() { 0 ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0); - assert!(Runtime::query_account_balances(AccountId::from(ALICE)).unwrap().is_empty()); + assert!(Runtime::query_account_balances(AccountId::from(ALICE)) + .unwrap() + .try_as::() + .unwrap() + .is_none()); // Drip some balance use frame_support::traits::fungible::Mutate; @@ -442,24 +446,27 @@ fn test_assets_balances_api_works() { ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency); - let result = Runtime::query_account_balances(AccountId::from(ALICE)).unwrap(); + let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE)) + .unwrap() + .try_into() + .unwrap(); assert_eq!(result.len(), 3); // check currency - assert!(result.iter().any(|asset| asset.eq( + assert!(result.inner().iter().any(|asset| asset.eq( &assets_common::fungible_conversion::convert_balance::( some_currency ) .unwrap() ))); // check trusted asset - assert!(result.iter().any(|asset| asset.eq(&( + assert!(result.inner().iter().any(|asset| asset.eq(&( AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(), minimum_asset_balance ) .into()))); // check foreign asset - assert!(result.iter().any(|asset| asset.eq(&( + assert!(result.inner().iter().any(|asset| asset.eq(&( Identity::reverse_ref(foreign_asset_id_multilocation).unwrap(), 6 * foreign_asset_minimum_asset_balance ) From 926799c34b9c00b93be2670207d2c98f9b8175ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Tue, 18 Apr 2023 11:53:09 +0100 Subject: [PATCH 120/339] Companion for substrate#13883 (#2460) * update substrate * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 752 ++++++++++++++++++++++++++++------------------------- 1 file changed, 392 insertions(+), 360 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e72b09483d..eff3b0d49a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -530,7 +530,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "hash-db", "log", @@ -1001,9 +1001,9 @@ dependencies = [ [[package]] name = "cargo_metadata" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a1ec454bc3eead8719cb56e15dbbfecdbc14e4b3a3ae4936cc6e31f5fc0d07" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ "camino", "cargo-platform", @@ -3192,7 +3192,6 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 1.0.109", ] [[package]] @@ -3208,6 +3207,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "expander" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f86a749cf851891866c10515ef6c299b5c69661465e9c3bbe7e07a2b77fb0f7" +dependencies = [ + "blake2", + "fs-err", + "proc-macro2", + "quote", + "syn 2.0.15", +] + [[package]] name = "fake-simd" version = "0.1.2" @@ -3376,7 +3388,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", ] @@ -3399,7 +3411,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-support-procedural", @@ -3424,7 +3436,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3471,18 +3483,18 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3499,7 +3511,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -3528,7 +3540,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "futures", "log", @@ -3544,7 +3556,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "bitflags", "environmental", @@ -3577,7 +3589,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "Inflector", "cfg-expr", @@ -3587,35 +3599,35 @@ dependencies = [ "proc-macro-warning", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "log", @@ -3633,7 +3645,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3648,7 +3660,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "sp-api", @@ -3657,7 +3669,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "parity-scale-codec", @@ -4625,8 +4637,8 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bitvec", "frame-benchmarking", @@ -4637,7 +4649,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.3.4", + "hex-literal 0.4.1", "kusama-runtime-constants", "log", "pallet-authority-discovery", @@ -4723,8 +4735,8 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "frame-support", "polkadot-primitives", @@ -5578,7 +5590,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "futures", "log", @@ -5597,7 +5609,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "anyhow", "jsonrpsee", @@ -6096,7 +6108,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6117,7 +6129,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6135,7 +6147,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6150,7 +6162,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -6166,7 +6178,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -6182,7 +6194,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -6196,7 +6208,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6220,7 +6232,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6240,7 +6252,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6255,7 +6267,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -6274,7 +6286,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6298,7 +6310,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6316,7 +6328,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6360,7 +6372,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6377,7 +6389,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "bitflags", "environmental", @@ -6407,7 +6419,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "bitflags", "parity-scale-codec", @@ -6420,17 +6432,17 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6447,7 +6459,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6465,7 +6477,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6488,7 +6500,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6501,7 +6513,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6519,7 +6531,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6537,7 +6549,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6560,7 +6572,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6576,7 +6588,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6596,7 +6608,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6613,7 +6625,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -6627,7 +6639,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6644,7 +6656,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6661,7 +6673,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6677,7 +6689,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6695,7 +6707,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "pallet-nfts", @@ -6706,7 +6718,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6722,7 +6734,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -6739,7 +6751,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6759,7 +6771,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6770,7 +6782,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -6787,7 +6799,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6811,7 +6823,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6828,7 +6840,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6843,7 +6855,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6861,7 +6873,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6876,7 +6888,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6895,7 +6907,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6912,7 +6924,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -6933,7 +6945,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6949,7 +6961,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -6963,7 +6975,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6986,18 +6998,18 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "log", "sp-arithmetic", @@ -7006,7 +7018,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "sp-api", @@ -7015,7 +7027,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7032,7 +7044,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -7061,7 +7073,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7079,7 +7091,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7098,7 +7110,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-support", "frame-system", @@ -7114,7 +7126,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7130,7 +7142,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7142,7 +7154,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7159,7 +7171,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7174,7 +7186,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7190,7 +7202,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7205,7 +7217,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7219,8 +7231,8 @@ dependencies = [ [[package]] name = "pallet-xcm" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7240,8 +7252,8 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "frame-benchmarking", "frame-support", @@ -7789,8 +7801,8 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "futures", "polkadot-node-jaeger", @@ -7805,8 +7817,8 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7819,8 +7831,8 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "derive_more", "fatality", @@ -7842,8 +7854,8 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "fatality", "futures", @@ -7863,8 +7875,8 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "clap 4.1.14", "frame-benchmarking-cli", @@ -7891,8 +7903,8 @@ dependencies = [ [[package]] name = "polkadot-client" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "async-trait", "frame-benchmarking", @@ -7934,8 +7946,8 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "always-assert", "bitvec", @@ -7956,8 +7968,8 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "parity-scale-codec", "scale-info", @@ -7968,8 +7980,8 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "derive_more", "fatality", @@ -7993,8 +8005,8 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8007,8 +8019,8 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "futures", "futures-timer", @@ -8027,8 +8039,8 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "always-assert", "async-trait", @@ -8050,8 +8062,8 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "futures", "parity-scale-codec", @@ -8068,8 +8080,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bitvec", "derive_more", @@ -8097,8 +8109,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bitvec", "futures", @@ -8118,8 +8130,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bitvec", "fatality", @@ -8137,8 +8149,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8152,8 +8164,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "async-trait", "futures", @@ -8172,8 +8184,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "futures", "polkadot-node-metrics", @@ -8187,8 +8199,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "futures", "futures-timer", @@ -8204,8 +8216,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "fatality", "futures", @@ -8223,8 +8235,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "async-trait", "futures", @@ -8240,8 +8252,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bitvec", "fatality", @@ -8258,8 +8270,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "always-assert", "assert_matches", @@ -8295,8 +8307,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "futures", "polkadot-node-primitives", @@ -8311,8 +8323,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "futures", "lru 0.9.0", @@ -8326,8 +8338,8 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "lazy_static", "log", @@ -8344,8 +8356,8 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bs58", "futures", @@ -8363,8 +8375,8 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "async-trait", "derive_more", @@ -8385,8 +8397,8 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bounded-vec", "futures", @@ -8403,13 +8415,13 @@ dependencies = [ "sp-maybe-compressed-blob", "sp-runtime", "thiserror", - "zstd", + "zstd 0.11.2+zstd.1.5.2", ] [[package]] name = "polkadot-node-subsystem" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8418,8 +8430,8 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "async-trait", "futures", @@ -8436,8 +8448,8 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "async-trait", "derive_more", @@ -8459,8 +8471,8 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "async-trait", "derive_more", @@ -8492,8 +8504,8 @@ dependencies = [ [[package]] name = "polkadot-overseer" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "async-trait", "futures", @@ -8515,8 +8527,8 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bounded-collections", "derive_more", @@ -8613,8 +8625,8 @@ dependencies = [ [[package]] name = "polkadot-performance-test" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8629,11 +8641,11 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bitvec", - "hex-literal 0.3.4", + "hex-literal 0.4.1", "parity-scale-codec", "polkadot-core-primitives", "polkadot-parachain", @@ -8655,8 +8667,8 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8687,8 +8699,8 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bitvec", "frame-benchmarking", @@ -8699,7 +8711,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.3.4", + "hex-literal 0.4.1", "log", "pallet-authority-discovery", "pallet-authorship", @@ -8781,8 +8793,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bitvec", "frame-benchmarking", @@ -8827,8 +8839,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "frame-support", "polkadot-primitives", @@ -8841,8 +8853,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bs58", "parity-scale-codec", @@ -8853,8 +8865,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bitflags", "bitvec", @@ -8897,15 +8909,15 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "async-trait", "frame-benchmarking-cli", "frame-support", "frame-system-rpc-runtime-api", "futures", - "hex-literal 0.3.4", + "hex-literal 0.4.1", "kusama-runtime", "kvdb", "kvdb-rocksdb", @@ -9007,8 +9019,8 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9028,8 +9040,8 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9038,8 +9050,8 @@ dependencies = [ [[package]] name = "polkadot-test-client" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9063,8 +9075,8 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9124,8 +9136,8 @@ dependencies = [ [[package]] name = "polkadot-test-service" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "frame-benchmarking", "frame-system", @@ -9344,13 +9356,13 @@ dependencies = [ [[package]] name = "proc-macro-warning" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d4f284d87b9cedc2ff57223cbc4e3937cd6063c01e92c8e2a8c080df0013933" +checksum = "0e99670bafb56b9a106419397343bdbc8b8742c3cc449fec6345f86173f47cd4" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] @@ -9880,8 +9892,8 @@ dependencies = [ [[package]] name = "rococo-runtime" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -9891,7 +9903,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.3.4", + "hex-literal 0.4.1", "log", "pallet-authority-discovery", "pallet-authorship", @@ -9966,8 +9978,8 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "frame-support", "polkadot-primitives", @@ -10214,7 +10226,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "log", "sp-core", @@ -10225,7 +10237,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "futures", @@ -10253,7 +10265,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "futures", "futures-timer", @@ -10276,7 +10288,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10291,7 +10303,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10310,18 +10322,18 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10361,7 +10373,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "fnv", "futures", @@ -10387,7 +10399,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "hash-db", "kvdb", @@ -10413,7 +10425,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "futures", @@ -10438,7 +10450,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "futures", @@ -10467,7 +10479,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "fork-tree", @@ -10506,7 +10518,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "futures", "jsonrpsee", @@ -10528,7 +10540,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10563,7 +10575,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "futures", "jsonrpsee", @@ -10582,7 +10594,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10595,7 +10607,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10635,7 +10647,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "finality-grandpa", "futures", @@ -10655,7 +10667,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "futures", @@ -10678,7 +10690,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10702,7 +10714,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10715,7 +10727,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "log", "sc-allocator", @@ -10728,7 +10740,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "anyhow", "cfg-if", @@ -10746,7 +10758,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "ansi_term", "futures", @@ -10762,7 +10774,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10777,7 +10789,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10822,7 +10834,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "cid", "futures", @@ -10842,7 +10854,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10870,7 +10882,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "ahash 0.8.2", "futures", @@ -10889,7 +10901,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10911,7 +10923,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10945,7 +10957,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10965,7 +10977,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -10996,7 +11008,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "futures", "libp2p", @@ -11009,7 +11021,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11018,7 +11030,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "futures", "jsonrpsee", @@ -11048,7 +11060,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11067,7 +11079,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "http", "jsonrpsee", @@ -11082,7 +11094,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11108,7 +11120,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "directories", @@ -11174,7 +11186,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "log", "parity-scale-codec", @@ -11185,7 +11197,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "clap 4.1.14", "fs4", @@ -11201,7 +11213,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11220,7 +11232,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "futures", "libc", @@ -11239,7 +11251,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "chrono", "futures", @@ -11258,7 +11270,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "ansi_term", "atty", @@ -11289,18 +11301,18 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "futures", @@ -11327,7 +11339,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "futures", @@ -11341,7 +11353,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-channel", "futures", @@ -11821,8 +11833,8 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "enumn", "parity-scale-codec", @@ -11899,7 +11911,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "hash-db", "log", @@ -11919,7 +11931,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "Inflector", "blake2", @@ -11927,13 +11939,13 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "scale-info", @@ -11946,7 +11958,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "integer-sqrt", "num-traits", @@ -11960,7 +11972,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "scale-info", @@ -11973,7 +11985,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "sp-api", @@ -11985,7 +11997,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "futures", "log", @@ -12003,7 +12015,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "futures", @@ -12018,7 +12030,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "parity-scale-codec", @@ -12036,7 +12048,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "merlin", @@ -12059,7 +12071,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12078,7 +12090,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "finality-grandpa", "log", @@ -12096,7 +12108,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12108,7 +12120,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12121,7 +12133,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12164,7 +12176,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "blake2b_simd", "byteorder", @@ -12178,18 +12190,18 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "proc-macro2", "quote", "sp-core-hashing", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12198,17 +12210,17 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "environmental", "parity-scale-codec", @@ -12219,7 +12231,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12234,7 +12246,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "bytes", "ed25519", @@ -12260,7 +12272,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "lazy_static", "sp-core", @@ -12271,7 +12283,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "futures", "merlin", @@ -12287,16 +12299,16 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "thiserror", - "zstd", + "zstd 0.12.3+zstd.1.5.2", ] [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12307,7 +12319,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12325,7 +12337,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12339,7 +12351,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "sp-api", "sp-core", @@ -12349,7 +12361,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "backtrace", "lazy_static", @@ -12359,7 +12371,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "rustc-hash", "serde", @@ -12369,7 +12381,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "either", "hash256-std-hasher", @@ -12391,7 +12403,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12409,19 +12421,19 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "Inflector", "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "serde", "serde_json", @@ -12430,7 +12442,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12444,7 +12456,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12456,7 +12468,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "hash-db", "log", @@ -12476,12 +12488,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12494,7 +12506,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "futures-timer", @@ -12509,7 +12521,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "sp-std", @@ -12521,7 +12533,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "sp-api", "sp-runtime", @@ -12530,7 +12542,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "log", @@ -12546,7 +12558,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12569,7 +12581,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12586,18 +12598,18 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12611,7 +12623,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12935,7 +12947,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "platforms 2.0.0", ] @@ -12943,7 +12955,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -12962,7 +12974,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "hyper", "log", @@ -12974,7 +12986,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "jsonrpsee", @@ -12987,7 +12999,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "jsonrpsee", "log", @@ -13006,7 +13018,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13032,7 +13044,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13042,18 +13054,18 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "ansi_term", "build-helper", @@ -13062,7 +13074,7 @@ dependencies = [ "sp-maybe-compressed-blob", "strum", "tempfile", - "toml 0.5.10", + "toml 0.7.3", "walkdir", "wasm-opt", ] @@ -13179,8 +13191,8 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "frame-support", "polkadot-primitives", @@ -13569,8 +13581,8 @@ dependencies = [ [[package]] name = "tracing-gum" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13580,14 +13592,14 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ - "expander 0.0.6", + "expander 2.0.0", "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] @@ -13711,7 +13723,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#416b0f50bba519146ec7ea45a67980b45cd658e7" +source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", "clap 4.1.14", @@ -13742,7 +13754,7 @@ dependencies = [ "sp-version", "sp-weights", "substrate-rpc-client", - "zstd", + "zstd 0.12.3+zstd.1.5.2", ] [[package]] @@ -14251,7 +14263,7 @@ dependencies = [ "sha2 0.10.2", "toml 0.5.10", "windows-sys 0.42.0", - "zstd", + "zstd 0.11.2+zstd.1.5.2", ] [[package]] @@ -14638,8 +14650,8 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bitvec", "frame-benchmarking", @@ -14650,7 +14662,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "hex-literal 0.3.4", + "hex-literal 0.4.1", "log", "pallet-authority-discovery", "pallet-authorship", @@ -14730,8 +14742,8 @@ dependencies = [ [[package]] name = "westend-runtime-constants" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "frame-support", "polkadot-primitives", @@ -15166,8 +15178,8 @@ dependencies = [ [[package]] name = "xcm" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "bounded-collections", "derivative", @@ -15182,8 +15194,8 @@ dependencies = [ [[package]] name = "xcm-builder" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "frame-support", "frame-system", @@ -15203,8 +15215,8 @@ dependencies = [ [[package]] name = "xcm-executor" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "environmental", "frame-benchmarking", @@ -15223,13 +15235,13 @@ dependencies = [ [[package]] name = "xcm-procedural" -version = "0.9.39" -source = "git+https://github.com/paritytech/polkadot?branch=master#dbae30efe080a1d41fe54ef4da8af47614c9ca93" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] @@ -15282,7 +15294,16 @@ version = "0.11.2+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" dependencies = [ - "zstd-safe", + "zstd-safe 5.0.2+zstd.1.5.2", +] + +[[package]] +name = "zstd" +version = "0.12.3+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" +dependencies = [ + "zstd-safe 6.0.5+zstd.1.5.4", ] [[package]] @@ -15295,12 +15316,23 @@ dependencies = [ "zstd-sys", ] +[[package]] +name = "zstd-safe" +version = "6.0.5+zstd.1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" +dependencies = [ + "libc", + "zstd-sys", +] + [[package]] name = "zstd-sys" -version = "2.0.1+zstd.1.5.2" +version = "2.0.8+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd07cbbc53846d9145dbffdf6dd09a7a0aa52be46741825f5c97bdd4f73f12b" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" dependencies = [ "cc", "libc", + "pkg-config", ] From 3de535443b2c9cca7ec0c669349e0c566c9d60ee Mon Sep 17 00:00:00 2001 From: Davide Galassi Date: Wed, 19 Apr 2023 08:01:02 +0200 Subject: [PATCH 121/339] Optimize level monitor reconstruction (#2461) * Optimize level monitor reconstruction * Fix counter increment and test * Struct comments as doc comments --- client/consensus/common/src/level_monitor.rs | 50 +++++++++----------- client/consensus/common/src/tests.rs | 13 +++-- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/client/consensus/common/src/level_monitor.rs b/client/consensus/common/src/level_monitor.rs index 294527f1f9f..4f344b505a7 100644 --- a/client/consensus/common/src/level_monitor.rs +++ b/client/consensus/common/src/level_monitor.rs @@ -15,7 +15,7 @@ // along with Cumulus. If not, see . use sc_client_api::{blockchain::Backend as _, Backend, HeaderBackend as _}; -use sp_blockchain::{HashAndNumber, TreeRoute}; +use sp_blockchain::{HashAndNumber, HeaderMetadata, TreeRoute}; use sp_runtime::traits::{Block as BlockT, NumberFor, One, Saturating, UniqueSaturatedInto, Zero}; use std::{ collections::{HashMap, HashSet}, @@ -48,17 +48,17 @@ pub enum LevelLimit { /// Support structure to constrain the number of leaves at each level. pub struct LevelMonitor { - // Max number of leaves for each level. + /// Max number of leaves for each level. level_limit: usize, - // Monotonic counter used to keep track of block freshness. + /// Monotonic counter used to keep track of block freshness. pub(crate) import_counter: NumberFor, - // Map between blocks hashes and freshness. + /// Map between blocks hashes and freshness. pub(crate) freshness: HashMap>, - // Blockchain levels cache. + /// Blockchain levels cache. pub(crate) levels: HashMap, HashSet>, - // Lower level number stored by the levels map. + /// Lower level number stored by the levels map. lowest_level: NumberFor, - // Backend reference to remove blocks on level saturation. + /// Backend reference to remove blocks on level saturation. backend: Arc, } @@ -96,7 +96,9 @@ where /// /// Level limits are not enforced during this phase. fn restore(&mut self) { + const ERR_MSG: &str = "route from finalized to leaf should be available; qed"; let info = self.backend.blockchain().info(); + log::debug!( target: "parachain", "Restoring chain level monitor from last finalized block: {} {}", @@ -105,30 +107,24 @@ where self.lowest_level = info.finalized_number; self.import_counter = info.finalized_number; - self.block_imported(info.finalized_number, info.finalized_hash); - - let mut counter_max = info.finalized_number; for leaf in self.backend.blockchain().leaves().unwrap_or_default() { - let route = - sp_blockchain::tree_route(self.backend.blockchain(), info.finalized_hash, leaf) - .expect("Route from finalized to leaf should be available; qed"); - if !route.retracted().is_empty() { - continue - } - route.enacted().iter().for_each(|elem| { - if !self.freshness.contains_key(&elem.hash) { - // Use the block height value as the freshness. - self.import_counter = elem.number; - self.block_imported(elem.number, elem.hash); + let mut meta = self.backend.blockchain().header_metadata(leaf).expect(ERR_MSG); + + self.import_counter = self.import_counter.max(meta.number); + + // Populate the monitor until we don't hit an already imported branch + while !self.freshness.contains_key(&meta.hash) { + self.freshness.insert(meta.hash, meta.number); + self.levels.entry(meta.number).or_default().insert(meta.hash); + if meta.number <= self.lowest_level { + break } - }); - counter_max = std::cmp::max(self.import_counter, counter_max); + meta = self.backend.blockchain().header_metadata(meta.parent).expect(ERR_MSG); + } } - log::debug!(target: "parachain", "Restored chain level monitor up to height {}", counter_max); - - self.import_counter = counter_max; + log::debug!(target: "parachain", "Restored chain level monitor up to height {}", self.import_counter); } /// Check and enforce the limit bound at the given height. @@ -355,9 +351,9 @@ where /// Add a new imported block information to the monitor. pub fn block_imported(&mut self, number: NumberFor, hash: Block::Hash) { + self.import_counter += One::one(); self.freshness.insert(hash, self.import_counter); self.levels.entry(number).or_default().insert(hash); - self.import_counter += One::one(); // Do cleanup once in a while, we are allowed to have some obsolete information. let finalized_num = self.backend.blockchain().info().finalized_number; diff --git a/client/consensus/common/src/tests.rs b/client/consensus/common/src/tests.rs index e44c26e85d1..23516d96388 100644 --- a/client/consensus/common/src/tests.rs +++ b/client/consensus/common/src/tests.rs @@ -765,6 +765,12 @@ fn restore_limit_monitor() { LevelLimit::Some(LEVEL_LIMIT), ); + let monitor_sd = para_import.monitor.clone().unwrap(); + + let monitor = monitor_sd.shared_data(); + assert_eq!(monitor.import_counter, 3); + std::mem::drop(monitor); + let block13 = build_and_import_block_ext( &*client, BlockOrigin::Own, @@ -783,14 +789,13 @@ fn restore_limit_monitor() { let expected = vec![blocks1[1].header.hash(), block13.header.hash()]; assert_eq!(leaves, expected); - let monitor = para_import.monitor.unwrap(); - let monitor = monitor.shared_data(); - assert_eq!(monitor.import_counter, 5); + let monitor = monitor_sd.shared_data(); + assert_eq!(monitor.import_counter, 4); assert!(monitor.levels.iter().all(|(number, hashes)| { hashes .iter() .filter(|hash| **hash != block13.header.hash()) .all(|hash| *number == *monitor.freshness.get(hash).unwrap()) })); - assert_eq!(*monitor.freshness.get(&block13.header.hash()).unwrap(), monitor.import_counter - 1); + assert_eq!(*monitor.freshness.get(&block13.header.hash()).unwrap(), monitor.import_counter); } From 44490440339a5edbb9595f71351f54951389409d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Apr 2023 12:25:13 +0200 Subject: [PATCH 122/339] Bump clap from 4.1.14 to 4.2.3 (#2465) --- Cargo.lock | 182 ++++++++++++++++++++++++----- client/cli/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 5 files changed, 154 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eff3b0d49a7..4098306f0b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,6 +179,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "anstream" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e579a7752471abc2a8268df8b20005e3eadd975f585398f17efcfd8d4927371" +dependencies = [ + "anstyle 1.0.0", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + [[package]] name = "anstyle" version = "0.3.4" @@ -191,6 +206,34 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +[[package]] +name = "anstyle-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcd8291a340dd8ac70e18878bc4501dd7b4ff970cfa21c207d36ece51ea88fd" +dependencies = [ + "anstyle 1.0.0", + "windows-sys 0.48.0", +] + [[package]] name = "anyhow" version = "1.0.69" @@ -1199,9 +1242,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.1.14" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906f7fe1da4185b7a282b2bc90172a496f9def1aca4545fe7526810741591e14" +checksum = "49f9152d70e42172fdb87de2efd7327160beee37886027cf86f30a233d5b30b4" dependencies = [ "clap_builder", "clap_derive", @@ -1210,22 +1253,22 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.1.14" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "351f9ad9688141ed83dfd8f5fb998a06225ef444b48ff4dc43de6d409b7fd10b" +checksum = "e067b220911598876eb55d52725ddcc201ffe3f0904018195973bc5b012ea2ca" dependencies = [ + "anstream", + "anstyle 1.0.0", "bitflags", "clap_lex 0.4.1", - "is-terminal", "strsim", - "termcolor", ] [[package]] name = "clap_derive" -version = "4.1.14" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d7dc0031c3a59a04fc2ba395c8e2dd463cba1859275f065d225f6122221b45" +checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" dependencies = [ "heck", "proc-macro2", @@ -1359,6 +1402,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "comfy-table" version = "6.0.0" @@ -1840,7 +1889,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.1.14", + "clap 4.2.3", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -2483,7 +2532,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.1.14", + "clap 4.2.3", "criterion", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -3441,7 +3490,7 @@ dependencies = [ "Inflector", "array-bytes 4.2.0", "chrono", - "clap 4.1.14", + "clap 4.2.3", "comfy-table", "frame-benchmarking", "frame-support", @@ -4067,12 +4116,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" [[package]] name = "hex" @@ -4443,14 +4489,14 @@ checksum = "11b0d96e660696543b251e58030cf9787df56da39dab19ad60eae7353040917e" [[package]] name = "is-terminal" -version = "0.4.1" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927609f78c2913a6f6ac3c27a4fe87f43e2a35367c0c4b0f8265e8f49a104330" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.1", "io-lifetimes 1.0.2", - "rustix 0.36.7", - "windows-sys 0.42.0", + "rustix 0.37.3", + "windows-sys 0.48.0", ] [[package]] @@ -7284,7 +7330,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.1.14", + "clap 4.2.3", "color-print", "cumulus-client-cli", "cumulus-client-consensus-aura", @@ -7878,7 +7924,7 @@ name = "polkadot-cli" version = "0.9.41" source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" dependencies = [ - "clap 4.1.14", + "clap 4.2.3", "frame-benchmarking-cli", "futures", "log", @@ -8551,7 +8597,7 @@ dependencies = [ "bridge-hub-kusama-runtime", "bridge-hub-polkadot-runtime", "bridge-hub-rococo-runtime", - "clap 4.1.14", + "clap 4.2.3", "collectives-polkadot-runtime", "color-print", "contracts-rococo-runtime", @@ -10337,7 +10383,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8 dependencies = [ "array-bytes 4.2.0", "chrono", - "clap 4.1.14", + "clap 4.2.3", "fdlimit", "futures", "libp2p", @@ -11199,7 +11245,7 @@ name = "sc-storage-monitor" version = "0.1.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ - "clap 4.1.14", + "clap 4.2.3", "fs4", "futures", "log", @@ -13726,7 +13772,7 @@ version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" dependencies = [ "async-trait", - "clap 4.1.14", + "clap 4.2.3", "frame-remote-externalities", "frame-try-runtime", "hex", @@ -13890,6 +13936,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "uuid" version = "1.2.2" @@ -14925,12 +14977,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.2", "windows_aarch64_msvc 0.42.2", "windows_i686_gnu 0.42.2", "windows_i686_msvc 0.42.2", "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.2", "windows_x86_64_msvc 0.42.2", ] @@ -14940,7 +14992,16 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", ] [[package]] @@ -14949,21 +15010,42 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.2", "windows_aarch64_msvc 0.42.2", "windows_i686_gnu 0.42.2", "windows_i686_msvc 0.42.2", "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.2", "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + [[package]] name = "windows_aarch64_msvc" version = "0.32.0" @@ -14988,6 +15070,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + [[package]] name = "windows_i686_gnu" version = "0.32.0" @@ -15012,6 +15100,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + [[package]] name = "windows_i686_msvc" version = "0.32.0" @@ -15036,6 +15130,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + [[package]] name = "windows_x86_64_gnu" version = "0.32.0" @@ -15060,12 +15160,24 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + [[package]] name = "windows_x86_64_msvc" version = "0.32.0" @@ -15090,6 +15202,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + [[package]] name = "winnow" version = "0.3.6" diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 68f8b472cf2..b6a8804a4a4 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -clap = { version = "4.1.14", features = ["derive"] } +clap = { version = "4.2.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.3.1" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index 90e522ee17e..6b350d6ba0f 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" build = "build.rs" [dependencies] -clap = { version = "4.1.14", features = ["derive"] } +clap = { version = "4.2.3", features = ["derive"] } log = "0.4.17" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.160", features = ["derive"] } diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index fb53c92b375..fafae12aedb 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -12,7 +12,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.1.14", features = ["derive"] } +clap = { version = "4.2.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 062dbc834c3..f04632b3c20 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -10,7 +10,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.1.14", features = ["derive"] } +clap = { version = "4.2.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.4.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } From ea44f8c750788a57c0b404dfbeaad1454997b00e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Apr 2023 13:46:24 +0200 Subject: [PATCH 123/339] Bump Swatinem/rust-cache from 2.2.0 to 2.2.1 (#2456) Bumps [Swatinem/rust-cache](https://github.com/Swatinem/rust-cache) from 2.2.0 to 2.2.1. - [Release notes](https://github.com/Swatinem/rust-cache/releases) - [Changelog](https://github.com/Swatinem/rust-cache/blob/master/CHANGELOG.md) - [Commits](https://github.com/Swatinem/rust-cache/compare/359a70e43a0bb8a13953b04a90f76428b4959bb6...6fd3edff6979b79f87531400ad694fb7f2c84b1f) --- updated-dependencies: - dependency-name: Swatinem/rust-cache dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 81b94b0722f..a5ad2bd555e 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -23,7 +23,7 @@ jobs: run: rustup show - name: Rust cache - uses: Swatinem/rust-cache@359a70e43a0bb8a13953b04a90f76428b4959bb6 # v2.2.0 + uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 - name: Build rustdocs run: SKIP_WASM_BUILD=1 cargo doc --all --no-deps From d403b49abe1d4986ead885694a82a46f6131160c Mon Sep 17 00:00:00 2001 From: Muharem Ismailov Date: Wed, 19 Apr 2023 14:53:03 +0200 Subject: [PATCH 124/339] Companion for substrate#13771 (#2410) * max proposal weight config * update deps --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 505 +++++++++--------- .../collectives-polkadot/src/lib.rs | 2 + 2 files changed, 244 insertions(+), 263 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4098306f0b7..34c15f3135a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -573,7 +573,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "hash-db", "log", @@ -3437,7 +3437,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", ] @@ -3460,7 +3460,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "frame-support-procedural", @@ -3485,7 +3485,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3532,7 +3532,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3543,7 +3543,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3560,7 +3560,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "frame-system", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "futures", "log", @@ -3605,7 +3605,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "bitflags", "environmental", @@ -3638,7 +3638,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "Inflector", "cfg-expr", @@ -3654,7 +3654,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3666,7 +3666,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "proc-macro2", "quote", @@ -3676,7 +3676,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "log", @@ -3694,7 +3694,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3709,7 +3709,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "sp-api", @@ -3718,7 +3718,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "parity-scale-codec", @@ -4684,7 +4684,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bitvec", "frame-benchmarking", @@ -4782,7 +4782,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "frame-support", "polkadot-primitives", @@ -5636,7 +5636,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "futures", "log", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "anyhow", "jsonrpsee", @@ -6224,7 +6224,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "frame-system", @@ -6240,7 +6240,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "frame-system", @@ -6254,7 +6254,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6267,7 +6267,7 @@ dependencies = [ "scale-info", "sp-application-crypto", "sp-consensus-babe", - "sp-consensus-vrf", + "sp-core", "sp-io", "sp-runtime", "sp-session", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6298,7 +6298,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6313,7 +6313,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "frame-system", @@ -6332,7 +6332,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6356,7 +6356,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6374,7 +6374,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6418,7 +6418,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6488,7 +6488,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6505,7 +6505,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6523,7 +6523,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6546,7 +6546,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6559,7 +6559,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6577,7 +6577,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6595,7 +6595,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6618,7 +6618,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6634,7 +6634,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6654,7 +6654,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6685,7 +6685,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6702,7 +6702,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6719,7 +6719,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6764,7 +6764,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6780,7 +6780,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "frame-system", @@ -6797,7 +6797,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6817,7 +6817,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6828,7 +6828,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "frame-system", @@ -6845,7 +6845,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6869,7 +6869,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6886,7 +6886,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6901,7 +6901,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6919,7 +6919,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6934,7 +6934,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6953,7 +6953,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6970,7 +6970,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "frame-system", @@ -6991,7 +6991,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7007,7 +7007,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "frame-system", @@ -7021,7 +7021,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7044,7 +7044,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7055,7 +7055,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "log", "sp-arithmetic", @@ -7064,7 +7064,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7090,7 +7090,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "frame-system", @@ -7119,7 +7119,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7137,7 +7137,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7156,7 +7156,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-support", "frame-system", @@ -7172,7 +7172,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7188,7 +7188,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7200,7 +7200,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7232,7 +7232,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7248,7 +7248,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7263,7 +7263,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7278,7 +7278,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7299,7 +7299,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "frame-benchmarking", "frame-support", @@ -7848,7 +7848,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "futures", "polkadot-node-jaeger", @@ -7864,7 +7864,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7878,7 +7878,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "derive_more", "fatality", @@ -7901,7 +7901,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "fatality", "futures", @@ -7922,7 +7922,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "clap 4.2.3", "frame-benchmarking-cli", @@ -7950,7 +7950,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "async-trait", "frame-benchmarking", @@ -7993,7 +7993,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "always-assert", "bitvec", @@ -8015,7 +8015,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "parity-scale-codec", "scale-info", @@ -8027,7 +8027,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "derive_more", "fatality", @@ -8052,7 +8052,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8066,7 +8066,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "futures", "futures-timer", @@ -8086,7 +8086,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "always-assert", "async-trait", @@ -8109,7 +8109,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "futures", "parity-scale-codec", @@ -8127,7 +8127,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bitvec", "derive_more", @@ -8156,7 +8156,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bitvec", "futures", @@ -8177,7 +8177,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bitvec", "fatality", @@ -8196,7 +8196,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8211,7 +8211,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "async-trait", "futures", @@ -8231,7 +8231,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "futures", "polkadot-node-metrics", @@ -8246,7 +8246,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "futures", "futures-timer", @@ -8263,7 +8263,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "fatality", "futures", @@ -8282,7 +8282,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "async-trait", "futures", @@ -8299,7 +8299,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bitvec", "fatality", @@ -8317,7 +8317,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "always-assert", "assert_matches", @@ -8354,7 +8354,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "futures", "polkadot-node-primitives", @@ -8370,7 +8370,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "futures", "lru 0.9.0", @@ -8385,7 +8385,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "lazy_static", "log", @@ -8403,7 +8403,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bs58", "futures", @@ -8422,7 +8422,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "async-trait", "derive_more", @@ -8444,7 +8444,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bounded-vec", "futures", @@ -8455,7 +8455,6 @@ dependencies = [ "serde", "sp-application-crypto", "sp-consensus-babe", - "sp-consensus-vrf", "sp-core", "sp-keystore", "sp-maybe-compressed-blob", @@ -8467,7 +8466,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8477,7 +8476,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "async-trait", "futures", @@ -8495,7 +8494,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "async-trait", "derive_more", @@ -8518,7 +8517,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "async-trait", "derive_more", @@ -8551,7 +8550,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "async-trait", "futures", @@ -8574,7 +8573,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bounded-collections", "derive_more", @@ -8672,7 +8671,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8688,7 +8687,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -8714,7 +8713,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8746,7 +8745,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bitvec", "frame-benchmarking", @@ -8840,7 +8839,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bitvec", "frame-benchmarking", @@ -8886,7 +8885,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "frame-support", "polkadot-primitives", @@ -8900,7 +8899,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bs58", "parity-scale-codec", @@ -8912,7 +8911,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bitflags", "bitvec", @@ -8956,7 +8955,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9066,7 +9065,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9087,7 +9086,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9097,7 +9096,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9122,7 +9121,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9183,7 +9182,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "frame-benchmarking", "frame-system", @@ -9939,7 +9938,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10025,7 +10024,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "frame-support", "polkadot-primitives", @@ -10272,7 +10271,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "log", "sp-core", @@ -10283,7 +10282,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "futures", @@ -10311,7 +10310,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "futures", "futures-timer", @@ -10334,7 +10333,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10349,7 +10348,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10368,7 +10367,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10379,7 +10378,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10419,7 +10418,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "fnv", "futures", @@ -10445,7 +10444,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "hash-db", "kvdb", @@ -10471,7 +10470,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "futures", @@ -10525,13 +10524,12 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "fork-tree", "futures", "log", - "merlin", "num-bigint", "num-rational", "num-traits", @@ -10544,7 +10542,6 @@ dependencies = [ "sc-keystore", "sc-telemetry", "scale-info", - "schnorrkel", "sp-api", "sp-application-crypto", "sp-block-builder", @@ -10552,7 +10549,6 @@ dependencies = [ "sp-consensus", "sp-consensus-babe", "sp-consensus-slots", - "sp-consensus-vrf", "sp-core", "sp-inherents", "sp-keystore", @@ -10564,7 +10560,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "futures", "jsonrpsee", @@ -10586,7 +10582,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10621,7 +10617,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "futures", "jsonrpsee", @@ -10640,7 +10636,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10653,7 +10649,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10693,7 +10689,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "finality-grandpa", "futures", @@ -10713,7 +10709,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "futures", @@ -10736,7 +10732,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10760,7 +10756,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10773,7 +10769,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "log", "sc-allocator", @@ -10786,7 +10782,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "anyhow", "cfg-if", @@ -10804,7 +10800,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "ansi_term", "futures", @@ -10820,7 +10816,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10835,7 +10831,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10880,7 +10876,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "cid", "futures", @@ -10900,7 +10896,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10928,7 +10924,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "ahash 0.8.2", "futures", @@ -10947,7 +10943,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10969,7 +10965,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11003,7 +10999,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11023,7 +11019,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11054,7 +11050,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "futures", "libp2p", @@ -11067,7 +11063,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11076,7 +11072,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "futures", "jsonrpsee", @@ -11106,7 +11102,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11125,7 +11121,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "http", "jsonrpsee", @@ -11140,7 +11136,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11166,7 +11162,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "directories", @@ -11232,7 +11228,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "log", "parity-scale-codec", @@ -11243,7 +11239,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "clap 4.2.3", "fs4", @@ -11259,7 +11255,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11278,7 +11274,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "futures", "libc", @@ -11297,7 +11293,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "chrono", "futures", @@ -11316,7 +11312,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "ansi_term", "atty", @@ -11347,7 +11343,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11358,7 +11354,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "futures", @@ -11385,7 +11381,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "futures", @@ -11399,7 +11395,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-channel", "futures", @@ -11880,7 +11876,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "enumn", "parity-scale-codec", @@ -11957,7 +11953,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "hash-db", "log", @@ -11977,7 +11973,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "Inflector", "blake2", @@ -11991,7 +11987,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12004,7 +12000,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "integer-sqrt", "num-traits", @@ -12018,7 +12014,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12031,7 +12027,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "sp-api", @@ -12043,7 +12039,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "futures", "log", @@ -12061,7 +12057,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "futures", @@ -12076,7 +12072,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "parity-scale-codec", @@ -12094,10 +12090,9 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", - "merlin", "parity-scale-codec", "scale-info", "serde", @@ -12105,7 +12100,6 @@ dependencies = [ "sp-application-crypto", "sp-consensus", "sp-consensus-slots", - "sp-consensus-vrf", "sp-core", "sp-inherents", "sp-keystore", @@ -12117,7 +12111,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12136,7 +12130,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "finality-grandpa", "log", @@ -12154,7 +12148,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12163,23 +12157,10 @@ dependencies = [ "sp-timestamp", ] -[[package]] -name = "sp-consensus-vrf" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" -dependencies = [ - "parity-scale-codec", - "scale-info", - "schnorrkel", - "sp-core", - "sp-runtime", - "sp-std", -] - [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12222,7 +12203,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "blake2b_simd", "byteorder", @@ -12236,7 +12217,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "proc-macro2", "quote", @@ -12247,7 +12228,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12256,7 +12237,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "proc-macro2", "quote", @@ -12266,7 +12247,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "environmental", "parity-scale-codec", @@ -12277,7 +12258,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12292,7 +12273,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "bytes", "ed25519", @@ -12318,7 +12299,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "lazy_static", "sp-core", @@ -12329,13 +12310,11 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "futures", - "merlin", "parity-scale-codec", "parking_lot 0.12.1", - "schnorrkel", "serde", "sp-core", "sp-externalities", @@ -12345,7 +12324,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12354,7 +12333,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12365,7 +12344,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12383,7 +12362,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12397,7 +12376,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "sp-api", "sp-core", @@ -12407,7 +12386,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "backtrace", "lazy_static", @@ -12417,7 +12396,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "rustc-hash", "serde", @@ -12427,7 +12406,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "either", "hash256-std-hasher", @@ -12449,7 +12428,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12467,7 +12446,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "Inflector", "proc-macro-crate", @@ -12488,7 +12467,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12502,7 +12481,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12514,7 +12493,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "hash-db", "log", @@ -12534,12 +12513,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12552,7 +12531,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "futures-timer", @@ -12567,7 +12546,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "sp-std", @@ -12579,7 +12558,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "sp-api", "sp-runtime", @@ -12588,7 +12567,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "log", @@ -12604,7 +12583,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12627,7 +12606,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12644,7 +12623,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12655,7 +12634,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12669,7 +12648,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12993,7 +12972,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "platforms 2.0.0", ] @@ -13001,7 +12980,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13020,7 +12999,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "hyper", "log", @@ -13032,7 +13011,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "jsonrpsee", @@ -13045,7 +13024,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "jsonrpsee", "log", @@ -13064,7 +13043,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13111,7 +13090,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "ansi_term", "build-helper", @@ -13238,7 +13217,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "frame-support", "polkadot-primitives", @@ -13628,7 +13607,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13639,7 +13618,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -13769,7 +13748,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" dependencies = [ "async-trait", "clap 4.2.3", @@ -14703,7 +14682,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bitvec", "frame-benchmarking", @@ -14795,7 +14774,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "frame-support", "polkadot-primitives", @@ -15297,7 +15276,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "bounded-collections", "derivative", @@ -15313,7 +15292,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "frame-support", "frame-system", @@ -15334,7 +15313,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "environmental", "frame-benchmarking", @@ -15354,7 +15333,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#70a6e7e1e9351e989171d72a05ec0cd2a66a90db" +source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs index 6e53920201c..e0f95cb052b 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs @@ -450,6 +450,7 @@ pub const ALLIANCE_MOTION_DURATION: BlockNumber = 5 * DAYS; parameter_types! { pub const AllianceMotionDuration: BlockNumber = ALLIANCE_MOTION_DURATION; + pub MaxProposalWeight: Weight = Perbill::from_percent(50) * RuntimeBlockWeights::get().max_block; } pub const ALLIANCE_MAX_PROPOSALS: u32 = 100; pub const ALLIANCE_MAX_MEMBERS: u32 = 100; @@ -465,6 +466,7 @@ impl pallet_collective::Config for Runtime { type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; type SetMembersOrigin = EnsureRoot; type WeightInfo = weights::pallet_collective::WeightInfo; + type MaxProposalWeight = MaxProposalWeight; } pub const MAX_FELLOWS: u32 = ALLIANCE_MAX_MEMBERS; From eced0cb3d55c04c3687ff0dc62c480d098f497b0 Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Wed, 19 Apr 2023 16:02:35 +0200 Subject: [PATCH 125/339] Parachain node should not recover blocks while syncing (#2462) --- client/pov-recovery/src/lib.rs | 37 +++++++++++++++++++------- client/service/src/lib.rs | 6 +++++ parachain-template/node/src/service.rs | 4 ++- polkadot-parachain/src/service.rs | 12 ++++++--- test/service/src/lib.rs | 2 ++ 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/client/pov-recovery/src/lib.rs b/client/pov-recovery/src/lib.rs index 60fbdab310c..7d92934c784 100644 --- a/client/pov-recovery/src/lib.rs +++ b/client/pov-recovery/src/lib.rs @@ -47,7 +47,7 @@ use sc_client_api::{BlockBackend, BlockchainEvents, UsageProvider}; use sc_consensus::import_queue::{ImportQueueService, IncomingBlock}; -use sp_consensus::{BlockOrigin, BlockStatus}; +use sp_consensus::{BlockOrigin, BlockStatus, SyncOracle}; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor}; use polkadot_node_primitives::{AvailableData, POV_BOMB_LIMIT}; @@ -228,6 +228,7 @@ pub struct PoVRecovery { recovery_chan_rx: Receiver>, /// Blocks that we are retrying currently candidates_in_retry: HashSet, + parachain_sync_service: Arc, } impl PoVRecovery @@ -244,6 +245,7 @@ where relay_chain_interface: RCInterface, para_id: ParaId, recovery_chan_rx: Receiver>, + parachain_sync_service: Arc, ) -> Self { Self { candidates: HashMap::new(), @@ -256,6 +258,7 @@ where para_id, candidates_in_retry: HashSet::new(), recovery_chan_rx, + parachain_sync_service, } } @@ -538,14 +541,19 @@ where pub async fn run(mut self) { let mut imported_blocks = self.parachain_client.import_notification_stream().fuse(); let mut finalized_blocks = self.parachain_client.finality_notification_stream().fuse(); - let pending_candidates = - match pending_candidates(self.relay_chain_interface.clone(), self.para_id).await { - Ok(pending_candidate_stream) => pending_candidate_stream.fuse(), - Err(err) => { - tracing::error!(target: LOG_TARGET, error = ?err, "Unable to retrieve pending candidate stream."); - return - }, - }; + let pending_candidates = match pending_candidates( + self.relay_chain_interface.clone(), + self.para_id, + self.parachain_sync_service.clone(), + ) + .await + { + Ok(pending_candidate_stream) => pending_candidate_stream.fuse(), + Err(err) => { + tracing::error!(target: LOG_TARGET, error = ?err, "Unable to retrieve pending candidate stream."); + return + }, + }; futures::pin_mut!(pending_candidates); @@ -600,13 +608,24 @@ where async fn pending_candidates( relay_chain_client: impl RelayChainInterface + Clone, para_id: ParaId, + sync_service: Arc, ) -> RelayChainResult> { let import_notification_stream = relay_chain_client.import_notification_stream().await?; let filtered_stream = import_notification_stream.filter_map(move |n| { let client_for_closure = relay_chain_client.clone(); + let sync_oracle = sync_service.clone(); async move { let hash = n.hash(); + if sync_oracle.is_major_syncing() { + tracing::debug!( + target: LOG_TARGET, + relay_hash = ?hash, + "Skipping candidate due to sync.", + ); + return None + } + let pending_availability_result = client_for_closure .candidate_pending_availability(hash, para_id) .await diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 6f0d5790586..ec6fc5e3c30 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -70,6 +70,7 @@ pub struct StartCollatorParams<'a, Block: BlockT, BS, Client, RCInterface, Spawn pub collator_key: CollatorPair, pub relay_chain_slot_duration: Duration, pub recovery_handle: Box, + pub sync_service: Arc>, } /// Start a collator node for a parachain. @@ -91,6 +92,7 @@ pub async fn start_collator<'a, Block, BS, Client, Backend, RCInterface, Spawner collator_key, relay_chain_slot_duration, recovery_handle, + sync_service, }: StartCollatorParams<'a, Block, BS, Client, RCInterface, Spawner>, ) -> sc_service::error::Result<()> where @@ -136,6 +138,7 @@ where relay_chain_interface.clone(), para_id, recovery_chan_rx, + sync_service, ); task_manager @@ -170,6 +173,7 @@ pub struct StartFullNodeParams<'a, Block: BlockT, Client, RCInterface> { pub relay_chain_slot_duration: Duration, pub import_queue: Box>, pub recovery_handle: Box, + pub sync_service: Arc>, } /// Start a full node for a parachain. @@ -186,6 +190,7 @@ pub fn start_full_node( relay_chain_slot_duration, import_queue, recovery_handle, + sync_service, }: StartFullNodeParams, ) -> sc_service::error::Result<()> where @@ -231,6 +236,7 @@ where relay_chain_interface, para_id, recovery_chan_rx, + sync_service, ); task_manager diff --git a/parachain-template/node/src/service.rs b/parachain-template/node/src/service.rs index 6fc04ef91d5..4c9e1febf70 100644 --- a/parachain-template/node/src/service.rs +++ b/parachain-template/node/src/service.rs @@ -271,7 +271,7 @@ async fn start_node_impl( &task_manager, relay_chain_interface.clone(), transaction_pool, - sync_service, + sync_service.clone(), params.keystore_container.keystore(), force_authoring, para_id, @@ -291,6 +291,7 @@ async fn start_node_impl( collator_key: collator_key.expect("Command line arguments do not allow this. qed"), relay_chain_slot_duration, recovery_handle: Box::new(overseer_handle), + sync_service, }; start_collator(params).await?; @@ -304,6 +305,7 @@ async fn start_node_impl( relay_chain_slot_duration, import_queue: import_queue_service, recovery_handle: Box::new(overseer_handle), + sync_service, }; start_full_node(params)?; diff --git a/polkadot-parachain/src/service.rs b/polkadot-parachain/src/service.rs index 000ebef80fd..803d0987844 100644 --- a/polkadot-parachain/src/service.rs +++ b/polkadot-parachain/src/service.rs @@ -460,7 +460,7 @@ where &task_manager, relay_chain_interface.clone(), transaction_pool, - sync_service, + sync_service.clone(), params.keystore_container.keystore(), force_authoring, )?; @@ -480,6 +480,7 @@ where collator_key: collator_key.expect("Command line arguments do not allow this. qed"), relay_chain_slot_duration, recovery_handle: Box::new(overseer_handle), + sync_service, }; start_collator(params).await?; @@ -493,6 +494,7 @@ where relay_chain_slot_duration, import_queue: import_queue_service, recovery_handle: Box::new(overseer_handle), + sync_service, }; start_full_node(params)?; @@ -659,7 +661,7 @@ where &task_manager, relay_chain_interface.clone(), transaction_pool, - sync_service, + sync_service.clone(), params.keystore_container.keystore(), force_authoring, )?; @@ -679,6 +681,7 @@ where collator_key: collator_key.expect("Command line arguments do not allow this. qed"), relay_chain_slot_duration, recovery_handle: Box::new(overseer_handle), + sync_service, }; start_collator(params).await?; @@ -692,6 +695,7 @@ where relay_chain_slot_duration, import_queue: import_queue_service, recovery_handle: Box::new(overseer_handle), + sync_service, }; start_full_node(params)?; @@ -1429,7 +1433,7 @@ where &task_manager, relay_chain_interface.clone(), transaction_pool, - sync_service, + sync_service.clone(), params.keystore_container.keystore(), force_authoring, )?; @@ -1449,6 +1453,7 @@ where collator_key: collator_key.expect("Command line arguments do not allow this. qed"), relay_chain_slot_duration, recovery_handle: Box::new(overseer_handle), + sync_service, }; start_collator(params).await?; @@ -1462,6 +1467,7 @@ where relay_chain_slot_duration, import_queue: import_queue_service, recovery_handle: Box::new(overseer_handle), + sync_service, }; start_full_node(params)?; diff --git a/test/service/src/lib.rs b/test/service/src/lib.rs index 5b38a53afb4..84d5636f9b1 100644 --- a/test/service/src/lib.rs +++ b/test/service/src/lib.rs @@ -433,6 +433,7 @@ where import_queue: import_queue_service, relay_chain_slot_duration: Duration::from_secs(6), recovery_handle, + sync_service, }; start_collator(params).await?; @@ -446,6 +447,7 @@ where import_queue: import_queue_service, relay_chain_slot_duration: Duration::from_secs(6), recovery_handle, + sync_service, }; start_full_node(params)?; From 56644eb40fb0ce9c8627411c7ca402d92e804577 Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Thu, 20 Apr 2023 10:58:07 +0300 Subject: [PATCH 126/339] Address review comments --- .../bridge-transfer/src/benchmarking.rs | 2 +- parachains/pallets/bridge-transfer/src/lib.rs | 60 +++++++++---------- .../assets/statemine/src/xcm_config.rs | 2 +- .../assets/test-utils/src/test_cases.rs | 8 +-- .../assets/westmint/src/xcm_config.rs | 2 +- 5 files changed, 36 insertions(+), 38 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index 4b33724aabb..15adcb2fc42 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -133,7 +133,7 @@ benchmarks! { verify { let exporter = AllowedExporters::::get(bridged_network).unwrap(); assert_eq!(exporter.bridge_location_fee, bridge_location_fee.map(|fee| MultiAsset::try_from(fee).unwrap())); - assert_eq!(exporter.target_location_fee, target_location_fee.map(|fee| MultiAsset::try_from(fee).unwrap())); + assert_eq!(exporter.max_target_location_fee, target_location_fee.map(|fee| MultiAsset::try_from(fee).unwrap())); } add_universal_alias { diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index abf6e3eddb1..f5488e8ba74 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -83,7 +83,7 @@ pub struct BridgeConfig { // TODO:check-parameter - can we store Option and then aviod using `Unlimited`? /// If `None` then `UnpaidExecution` is used, else `Withdraw(target_location_fee)/BuyExecution(target_location_fee, Unlimited)` /// `MultiAsset` is here from the point of view of `allowed_target_location`, e.g.: `MultiLocation::parent()` means relay chain token of `allowed_target_location` - pub target_location_fee: Option, + pub max_target_location_fee: Option, } /// Trait for constructing ping message. @@ -252,9 +252,12 @@ pub mod pallet { #[cfg_attr(test, derive(PartialEq))] pub enum Error { InvalidConfiguration, + UnavailableConfiguration, + ConfigurationAlreadyExists, InvalidAssets, MaxAssetsLimitReached, UnsupportedDestination, + UnsupportedXcmVersion, InvalidRemoteDestination, BridgeCallError, FailedToReserve, @@ -374,7 +377,7 @@ pub mod pallet { let _ = T::AdminOrigin::ensure_origin(origin)?; ensure!( !AllowedExporters::::contains_key(bridged_network), - Error::::InvalidConfiguration + Error::::ConfigurationAlreadyExists ); let allowed_target_location_network = bridge_config .allowed_target_location @@ -410,7 +413,7 @@ pub mod pallet { let _ = T::AdminOrigin::ensure_origin(origin)?; ensure!( AllowedExporters::::contains_key(bridged_network), - Error::::InvalidConfiguration + Error::::UnavailableConfiguration ); AllowedExporters::::remove(bridged_network); @@ -433,24 +436,18 @@ pub mod pallet { target_location_fee: Option>, ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; - ensure!( - AllowedExporters::::contains_key(bridged_network), - Error::::InvalidConfiguration - ); - let bridge_location_fee = bridge_location_fee - .map(|fee| MultiAsset::try_from(*fee)) - .transpose() - .map_err(|_| Error::::InvalidConfiguration)?; - let target_location_fee = target_location_fee - .map(|fee| MultiAsset::try_from(*fee)) - .transpose() - .map_err(|_| Error::::InvalidConfiguration)?; - AllowedExporters::::try_mutate_exists(bridged_network, |bridge_config| { + AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { let bridge_config = - bridge_config.as_mut().ok_or(Error::::InvalidConfiguration)?; - bridge_config.bridge_location_fee = bridge_location_fee; - bridge_config.target_location_fee = target_location_fee; + maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; + bridge_config.bridge_location_fee = bridge_location_fee + .map(|fee| MultiAsset::try_from(*fee)) + .transpose() + .map_err(|_| Error::::UnsupportedXcmVersion)?; + bridge_config.max_target_location_fee = target_location_fee + .map(|fee| MultiAsset::try_from(*fee)) + .transpose() + .map_err(|_| Error::::UnsupportedXcmVersion)?; Self::deposit_event(Event::BridgeUpdated); Ok(()) }) @@ -472,7 +469,7 @@ pub mod pallet { let _ = T::AdminOrigin::ensure_origin(origin)?; let location: MultiLocation = - (*location).try_into().map_err(|_| Error::::UnsupportedDestination)?; + (*location).try_into().map_err(|_| Error::::UnsupportedXcmVersion)?; let added = AllowedUniversalAliases::::try_mutate(location, |junctions| { junctions.try_insert(junction) }) @@ -499,7 +496,7 @@ pub mod pallet { let _ = T::AdminOrigin::ensure_origin(origin)?; let location: MultiLocation = - (*location).try_into().map_err(|_| Error::::UnsupportedDestination)?; + (*location).try_into().map_err(|_| Error::::UnsupportedXcmVersion)?; let removed = AllowedUniversalAliases::::try_mutate( location, |junctions| -> Result> { @@ -530,7 +527,7 @@ pub mod pallet { let _ = T::AdminOrigin::ensure_origin(origin)?; let location: MultiLocation = - (*location).try_into().map_err(|_| Error::::UnsupportedDestination)?; + (*location).try_into().map_err(|_| Error::::UnsupportedXcmVersion)?; let added = AllowedReserveLocations::::try_mutate(|locations| { locations.try_insert(location) }) @@ -559,7 +556,7 @@ pub mod pallet { let mut removed = false; for ltr in locations_to_remove { let ltr: MultiLocation = - ltr.try_into().map_err(|_| Error::::UnsupportedDestination)?; + ltr.try_into().map_err(|_| Error::::UnsupportedXcmVersion)?; removed |= locations.remove(<r); } Ok(removed) @@ -604,7 +601,7 @@ pub mod pallet { None => return Err(Error::::UnsupportedDestination), } }, - _ => Err(Error::::UnsupportedDestination), + _ => Err(Error::::UnsupportedXcmVersion), } } @@ -678,7 +675,7 @@ pub mod pallet { })?; // prepare xcm message (maybe_paid + ReserveAssetDeposited stuff) - let mut xcm_instructions = match bridge_config.target_location_fee { + let mut xcm_instructions = match bridge_config.max_target_location_fee { Some(target_location_fee) => sp_std::vec![ WithdrawAsset(target_location_fee.clone().into()), BuyExecution { fees: target_location_fee, weight_limit: Unlimited }, @@ -707,6 +704,7 @@ pub mod pallet { xcm, ); // call bridge + // TODO: check-parameter - should we handle `sender_cost` somehow ? let (message_hash, sender_cost) = send_xcm::(dest, xcm).map_err(|e| { log::error!( @@ -942,7 +940,7 @@ pub(crate) mod tests { 2, X2(GlobalConsensus(Wococo), Parachain(1000)), ), - target_location_fee: None, + max_target_location_fee: None, }, ) } @@ -1052,7 +1050,7 @@ pub(crate) mod tests { BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V2( xcm::v2::MultiLocation::default() )), - Err(Error::::UnsupportedDestination) + Err(Error::::UnsupportedXcmVersion) ); // v3 - "parent: 0" wrong @@ -1219,7 +1217,7 @@ pub(crate) mod tests { 2, X2(GlobalConsensus(Wococo), Parachain(1000)), ), - target_location_fee: None, + max_target_location_fee: None, }), )); @@ -1263,7 +1261,7 @@ pub(crate) mod tests { ), DispatchError::Module(ModuleError { index: 52, - error: [5, 0, 0, 0], + error: [8, 0, 0, 0], message: Some("BridgeCallError") }) ); @@ -1346,7 +1344,7 @@ pub(crate) mod tests { 2, X2(GlobalConsensus(bridged_network), Parachain(1000)), ), - target_location_fee: None, + max_target_location_fee: None, }); let dummy_xcm = Xcm(vec![]); let dummy_remote_interior_multilocation = X1(Parachain(1234)); @@ -1463,7 +1461,7 @@ pub(crate) mod tests { bridge_location: bridged_config.bridge_location.clone(), bridge_location_fee: Some((Parent, 200u128).into()), allowed_target_location: bridged_config.allowed_target_location.clone(), - target_location_fee: Some((Parent, 300u128).into()), + max_target_location_fee: Some((Parent, 300u128).into()), }) ); assert_eq!( diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index a022a4d321c..17ed6e7ff66 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -534,7 +534,7 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` bridge_location_fee: None, allowed_target_location: Self::allowed_target_location(), - target_location_fee: None, + max_target_location_fee: None, }, )) } diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index a360b5d3812..b7e49c00957 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1364,7 +1364,7 @@ pub fn can_governance_change_bridge_transfer_out_configuration for BridgeTransferBe // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` bridge_location_fee: None, allowed_target_location: Self::allowed_target_location(), - target_location_fee: None, + max_target_location_fee: None, }, )) } From 8615ac834cae3ff76bdd61a05923f9a0d4f9a509 Mon Sep 17 00:00:00 2001 From: Marcin S Date: Fri, 21 Apr 2023 13:04:39 +0200 Subject: [PATCH 127/339] [Polkadot Companion] for 7101 (#2470) * [Polkadot Companion] for 7101 PR: https://github.com/paritytech/polkadot/pull/7101 * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 594 ++++++++++-------- .../Cargo.toml | 2 +- .../relay-validation-worker-provider/build.rs | 2 +- .../src/lib.rs | 2 +- 4 files changed, 328 insertions(+), 272 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 34c15f3135a..be6932b51db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -469,6 +469,17 @@ dependencies = [ "event-listener", ] +[[package]] +name = "async-recursion" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + [[package]] name = "async-trait" version = "0.1.68" @@ -573,7 +584,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "hash-db", "log", @@ -2492,7 +2503,7 @@ dependencies = [ name = "cumulus-test-relay-validation-worker-provider" version = "0.1.0" dependencies = [ - "polkadot-node-core-pvf", + "polkadot-node-core-pvf-worker", "toml 0.7.3", ] @@ -3437,7 +3448,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", ] @@ -3460,7 +3471,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-support-procedural", @@ -3485,7 +3496,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3532,7 +3543,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3543,7 +3554,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3560,7 +3571,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -3589,9 +3600,11 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ + "async-recursion", "futures", + "jsonrpsee", "log", "parity-scale-codec", "serde", @@ -3605,7 +3618,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "bitflags", "environmental", @@ -3638,7 +3651,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "Inflector", "cfg-expr", @@ -3654,7 +3667,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3666,7 +3679,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "proc-macro2", "quote", @@ -3676,7 +3689,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "log", @@ -3694,7 +3707,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3709,7 +3722,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "sp-api", @@ -3718,7 +3731,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "parity-scale-codec", @@ -4300,6 +4313,7 @@ dependencies = [ "rustls-native-certs", "tokio", "tokio-rustls", + "webpki-roots", ] [[package]] @@ -4545,6 +4559,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d291e3a5818a2384645fd9756362e6d89cf0541b0b916fa7702ea4a9833608e" dependencies = [ "jsonrpsee-core", + "jsonrpsee-http-client", "jsonrpsee-proc-macros", "jsonrpsee-server", "jsonrpsee-types", @@ -4601,6 +4616,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "jsonrpsee-http-client" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc345b0a43c6bc49b947ebeb936e886a419ee3d894421790c969cc56040542ad" +dependencies = [ + "async-trait", + "hyper", + "hyper-rustls", + "jsonrpsee-core", + "jsonrpsee-types", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "jsonrpsee-proc-macros" version = "0.16.2" @@ -4684,7 +4718,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bitvec", "frame-benchmarking", @@ -4782,7 +4816,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "frame-support", "polkadot-primitives", @@ -5636,7 +5670,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "futures", "log", @@ -5655,7 +5689,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "anyhow", "jsonrpsee", @@ -6154,7 +6188,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6175,7 +6209,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6193,7 +6227,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6208,7 +6242,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -6224,7 +6258,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -6240,7 +6274,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -6254,7 +6288,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6278,7 +6312,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6298,7 +6332,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6313,7 +6347,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -6332,7 +6366,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6356,7 +6390,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6374,7 +6408,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6418,7 +6452,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6435,7 +6469,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "bitflags", "environmental", @@ -6465,7 +6499,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "bitflags", "parity-scale-codec", @@ -6478,7 +6512,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "proc-macro2", "quote", @@ -6488,7 +6522,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6505,7 +6539,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6523,7 +6557,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6546,7 +6580,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6559,7 +6593,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6577,7 +6611,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6595,7 +6629,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6618,7 +6652,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6634,7 +6668,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6654,7 +6688,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6671,7 +6705,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -6685,7 +6719,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6702,7 +6736,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6719,7 +6753,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6735,7 +6769,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6753,7 +6787,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "pallet-nfts", @@ -6764,7 +6798,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6780,7 +6814,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -6797,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6817,7 +6851,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6828,7 +6862,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -6845,7 +6879,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6869,7 +6903,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6886,7 +6920,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6901,7 +6935,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6919,7 +6953,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6934,7 +6968,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6953,7 +6987,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6970,7 +7004,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -6991,7 +7025,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7007,7 +7041,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -7021,7 +7055,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7044,7 +7078,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7055,7 +7089,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "log", "sp-arithmetic", @@ -7064,7 +7098,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "sp-api", @@ -7073,7 +7107,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7090,7 +7124,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -7119,7 +7153,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7137,7 +7171,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7156,7 +7190,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-support", "frame-system", @@ -7172,7 +7206,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7188,7 +7222,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7200,7 +7234,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7217,7 +7251,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7232,7 +7266,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7248,7 +7282,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7263,7 +7297,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7278,7 +7312,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7299,7 +7333,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "frame-benchmarking", "frame-support", @@ -7848,7 +7882,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "futures", "polkadot-node-jaeger", @@ -7864,7 +7898,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7878,7 +7912,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "derive_more", "fatality", @@ -7901,7 +7935,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "fatality", "futures", @@ -7922,14 +7956,14 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "clap 4.2.3", "frame-benchmarking-cli", "futures", "log", "polkadot-client", - "polkadot-node-core-pvf", + "polkadot-node-core-pvf-worker", "polkadot-node-metrics", "polkadot-performance-test", "polkadot-service", @@ -7942,6 +7976,7 @@ dependencies = [ "sp-core", "sp-io", "sp-keyring", + "sp-maybe-compressed-blob", "substrate-build-script-utils", "thiserror", "try-runtime-cli", @@ -7950,7 +7985,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "async-trait", "frame-benchmarking", @@ -7993,7 +8028,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "always-assert", "bitvec", @@ -8015,7 +8050,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "parity-scale-codec", "scale-info", @@ -8027,7 +8062,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "derive_more", "fatality", @@ -8052,7 +8087,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8066,7 +8101,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "futures", "futures-timer", @@ -8086,7 +8121,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "always-assert", "async-trait", @@ -8109,7 +8144,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "futures", "parity-scale-codec", @@ -8127,7 +8162,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bitvec", "derive_more", @@ -8156,7 +8191,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bitvec", "futures", @@ -8177,7 +8212,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bitvec", "fatality", @@ -8196,7 +8231,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8211,7 +8246,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "async-trait", "futures", @@ -8231,7 +8266,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "futures", "polkadot-node-metrics", @@ -8246,7 +8281,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "futures", "futures-timer", @@ -8263,7 +8298,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "fatality", "futures", @@ -8282,7 +8317,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "async-trait", "futures", @@ -8299,7 +8334,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bitvec", "fatality", @@ -8317,11 +8352,9 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "always-assert", - "assert_matches", - "cpu-time", "futures", "futures-timer", "libc", @@ -8333,20 +8366,12 @@ dependencies = [ "polkadot-parachain", "polkadot-primitives", "rand 0.8.5", - "rayon", - "sc-executor", - "sc-executor-common", - "sc-executor-wasmtime", "slotmap", "sp-core", - "sp-externalities", - "sp-io", "sp-maybe-compressed-blob", "sp-tracing", "sp-wasm-interface", "substrate-build-script-utils", - "tempfile", - "tikv-jemalloc-ctl", "tokio", "tracing-gum", ] @@ -8354,7 +8379,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "futures", "polkadot-node-primitives", @@ -8367,10 +8392,39 @@ dependencies = [ "tracing-gum", ] +[[package]] +name = "polkadot-node-core-pvf-worker" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +dependencies = [ + "assert_matches", + "cpu-time", + "futures", + "libc", + "parity-scale-codec", + "polkadot-node-core-pvf", + "polkadot-parachain", + "polkadot-primitives", + "rayon", + "sc-executor", + "sc-executor-common", + "sc-executor-wasmtime", + "sp-core", + "sp-externalities", + "sp-io", + "sp-maybe-compressed-blob", + "sp-tracing", + "substrate-build-script-utils", + "tempfile", + "tikv-jemalloc-ctl", + "tokio", + "tracing-gum", +] + [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "futures", "lru 0.9.0", @@ -8385,7 +8439,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "lazy_static", "log", @@ -8403,7 +8457,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bs58", "futures", @@ -8422,7 +8476,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "async-trait", "derive_more", @@ -8444,7 +8498,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bounded-vec", "futures", @@ -8466,7 +8520,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8476,7 +8530,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "async-trait", "futures", @@ -8494,7 +8548,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "async-trait", "derive_more", @@ -8517,7 +8571,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "async-trait", "derive_more", @@ -8550,7 +8604,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "async-trait", "futures", @@ -8573,7 +8627,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bounded-collections", "derive_more", @@ -8671,23 +8725,25 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "env_logger 0.9.0", "kusama-runtime", "log", "polkadot-erasure-coding", - "polkadot-node-core-pvf", + "polkadot-node-core-pvf-worker", "polkadot-node-primitives", "polkadot-primitives", "quote", + "sc-executor-common", + "sp-maybe-compressed-blob", "thiserror", ] [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -8713,7 +8769,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8745,7 +8801,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bitvec", "frame-benchmarking", @@ -8839,7 +8895,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bitvec", "frame-benchmarking", @@ -8885,7 +8941,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "frame-support", "polkadot-primitives", @@ -8899,7 +8955,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bs58", "parity-scale-codec", @@ -8911,7 +8967,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bitflags", "bitvec", @@ -8955,7 +9011,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9065,7 +9121,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9086,7 +9142,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9096,7 +9152,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9121,7 +9177,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9182,7 +9238,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "frame-benchmarking", "frame-system", @@ -9938,7 +9994,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10024,7 +10080,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "frame-support", "polkadot-primitives", @@ -10271,7 +10327,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "log", "sp-core", @@ -10282,7 +10338,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "futures", @@ -10310,7 +10366,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "futures", "futures-timer", @@ -10333,7 +10389,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10348,7 +10404,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10367,7 +10423,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10378,7 +10434,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10418,7 +10474,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "fnv", "futures", @@ -10444,7 +10500,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "hash-db", "kvdb", @@ -10470,7 +10526,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "futures", @@ -10495,7 +10551,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "futures", @@ -10524,7 +10580,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "fork-tree", @@ -10560,7 +10616,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "futures", "jsonrpsee", @@ -10582,7 +10638,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10617,7 +10673,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "futures", "jsonrpsee", @@ -10636,7 +10692,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10649,7 +10705,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10689,7 +10745,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "finality-grandpa", "futures", @@ -10709,7 +10765,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "futures", @@ -10732,7 +10788,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10756,7 +10812,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10769,7 +10825,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "log", "sc-allocator", @@ -10782,7 +10838,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "anyhow", "cfg-if", @@ -10800,7 +10856,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "ansi_term", "futures", @@ -10816,7 +10872,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10831,7 +10887,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10876,7 +10932,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "cid", "futures", @@ -10896,7 +10952,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10924,7 +10980,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "ahash 0.8.2", "futures", @@ -10943,7 +10999,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "futures", @@ -10965,7 +11021,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10999,7 +11055,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11019,7 +11075,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11050,7 +11106,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "futures", "libp2p", @@ -11063,7 +11119,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11072,7 +11128,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "futures", "jsonrpsee", @@ -11102,7 +11158,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11121,7 +11177,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "http", "jsonrpsee", @@ -11136,7 +11192,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11162,7 +11218,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "directories", @@ -11228,7 +11284,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "log", "parity-scale-codec", @@ -11239,7 +11295,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "clap 4.2.3", "fs4", @@ -11255,7 +11311,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11274,7 +11330,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "futures", "libc", @@ -11293,7 +11349,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "chrono", "futures", @@ -11312,7 +11368,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "ansi_term", "atty", @@ -11343,7 +11399,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11354,7 +11410,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "futures", @@ -11381,7 +11437,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "futures", @@ -11395,7 +11451,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-channel", "futures", @@ -11876,7 +11932,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "enumn", "parity-scale-codec", @@ -11953,7 +12009,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "hash-db", "log", @@ -11973,7 +12029,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "Inflector", "blake2", @@ -11987,7 +12043,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12000,7 +12056,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "integer-sqrt", "num-traits", @@ -12014,7 +12070,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12027,7 +12083,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "sp-api", @@ -12039,7 +12095,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "futures", "log", @@ -12057,7 +12113,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "futures", @@ -12072,7 +12128,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "parity-scale-codec", @@ -12090,7 +12146,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "parity-scale-codec", @@ -12111,7 +12167,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12130,7 +12186,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "finality-grandpa", "log", @@ -12148,7 +12204,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12160,7 +12216,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12203,7 +12259,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "blake2b_simd", "byteorder", @@ -12217,7 +12273,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "proc-macro2", "quote", @@ -12228,7 +12284,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12237,7 +12293,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "proc-macro2", "quote", @@ -12247,7 +12303,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "environmental", "parity-scale-codec", @@ -12258,7 +12314,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12273,7 +12329,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "bytes", "ed25519", @@ -12299,7 +12355,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "lazy_static", "sp-core", @@ -12310,7 +12366,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "futures", "parity-scale-codec", @@ -12324,7 +12380,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12333,7 +12389,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12344,7 +12400,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12362,7 +12418,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12376,7 +12432,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "sp-api", "sp-core", @@ -12386,7 +12442,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "backtrace", "lazy_static", @@ -12396,7 +12452,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "rustc-hash", "serde", @@ -12406,7 +12462,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "either", "hash256-std-hasher", @@ -12428,7 +12484,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12446,7 +12502,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "Inflector", "proc-macro-crate", @@ -12458,7 +12514,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "serde", "serde_json", @@ -12467,7 +12523,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12481,7 +12537,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12493,7 +12549,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "hash-db", "log", @@ -12513,12 +12569,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12531,7 +12587,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "futures-timer", @@ -12546,7 +12602,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "sp-std", @@ -12558,7 +12614,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "sp-api", "sp-runtime", @@ -12567,7 +12623,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "log", @@ -12583,7 +12639,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12606,7 +12662,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12623,7 +12679,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12634,7 +12690,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12648,7 +12704,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "parity-scale-codec", "scale-info", @@ -12972,7 +13028,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "platforms 2.0.0", ] @@ -12980,7 +13036,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -12999,7 +13055,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "hyper", "log", @@ -13011,7 +13067,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "jsonrpsee", @@ -13024,7 +13080,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "jsonrpsee", "log", @@ -13043,7 +13099,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13069,7 +13125,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13079,7 +13135,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cb954820a8d8d765ce75021e244223a3b4d5722d" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13090,7 +13146,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "ansi_term", "build-helper", @@ -13217,7 +13273,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "frame-support", "polkadot-primitives", @@ -13607,7 +13663,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13618,7 +13674,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -13748,7 +13804,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#50de15d8740a129db9c18a6698fbd183b00326a2" +source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" dependencies = [ "async-trait", "clap 4.2.3", @@ -14682,7 +14738,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bitvec", "frame-benchmarking", @@ -14774,7 +14830,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "frame-support", "polkadot-primitives", @@ -15276,7 +15332,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "bounded-collections", "derivative", @@ -15292,7 +15348,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "frame-support", "frame-system", @@ -15313,7 +15369,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "environmental", "frame-benchmarking", @@ -15333,7 +15389,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#8e06c07264673ccc9fef25173ed5c0e078227173" +source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" dependencies = [ "Inflector", "proc-macro2", diff --git a/test/relay-validation-worker-provider/Cargo.toml b/test/relay-validation-worker-provider/Cargo.toml index a363d3b7d61..e8cc1f16b9f 100644 --- a/test/relay-validation-worker-provider/Cargo.toml +++ b/test/relay-validation-worker-provider/Cargo.toml @@ -8,7 +8,7 @@ build = "build.rs" [dependencies] # Polkadot -polkadot-node-core-pvf = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-node-core-pvf-worker = { git = "https://github.com/paritytech/polkadot", branch = "master" } [build-dependencies] toml = "0.7.3" diff --git a/test/relay-validation-worker-provider/build.rs b/test/relay-validation-worker-provider/build.rs index 9b5247bcbe5..d2c894ac89d 100644 --- a/test/relay-validation-worker-provider/build.rs +++ b/test/relay-validation-worker-provider/build.rs @@ -97,7 +97,7 @@ fn create_project(out_dir: &Path) -> PathBuf { fs::write( project_dir.join("src").join("main.rs"), r#" - cumulus_test_relay_validation_worker_provider::polkadot_node_core_pvf::decl_puppet_worker_main!(); + cumulus_test_relay_validation_worker_provider::polkadot_node_core_pvf_worker::decl_puppet_worker_main!(); "#, ) .expect("Writes `main.rs`"); diff --git a/test/relay-validation-worker-provider/src/lib.rs b/test/relay-validation-worker-provider/src/lib.rs index 840214eb3c0..ccb896a276e 100644 --- a/test/relay-validation-worker-provider/src/lib.rs +++ b/test/relay-validation-worker-provider/src/lib.rs @@ -21,7 +21,7 @@ //! //! !!This should only be used for tests!! -pub use polkadot_node_core_pvf; +pub use polkadot_node_core_pvf_worker; /// The path to the validation worker. pub const VALIDATION_WORKER: &str = concat!(env!("OUT_DIR"), "/validation-worker"); From 2c1dd4f017c8e6383911670ea378e53bc3644146 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 24 Apr 2023 15:43:16 +0200 Subject: [PATCH 128/339] Align BridgeHub runtimes with other SP runtimes + reused test for teleport native tokens + some nits (#2449) * Align BridgeHub runtimes with other SP runtimes * Reused `teleports_for_native_asset_works` test to all bridge-hub runtime * Fix import vs doc * Removed unnecessery deps * DealWithFees + ToAuthor->ToStakingPot for BH according to the other runtimes * Update parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Align all desc * Extract runtime_para_id for test * Fix test --------- Co-authored-by: parity-processbot <> Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- Cargo.lock | 13 ++++- docs/release.md | 2 +- .../src/validate_block/implementation.rs | 6 +- .../runtimes/assets/statemine/src/lib.rs | 6 +- .../assets/statemine/src/xcm_config.rs | 2 +- .../runtimes/assets/statemine/tests/tests.rs | 3 +- .../assets/statemint/src/xcm_config.rs | 2 +- .../runtimes/assets/statemint/tests/tests.rs | 3 +- .../assets/test-utils/src/test_cases.rs | 18 +++--- .../assets/westmint/src/xcm_config.rs | 2 +- .../runtimes/assets/westmint/tests/tests.rs | 3 +- .../bridge-hubs/bridge-hub-kusama/Cargo.toml | 5 +- .../bridge-hubs/bridge-hub-kusama/src/lib.rs | 12 ++-- .../bridge-hub-kusama/src/xcm_config.rs | 21 ++++--- .../bridge-hub-kusama/tests/tests.rs | 56 +++++++++++++++++++ .../bridge-hub-polkadot/Cargo.toml | 5 +- .../bridge-hub-polkadot/src/lib.rs | 10 +--- .../bridge-hub-polkadot/src/xcm_config.rs | 24 ++++---- .../bridge-hub-polkadot/tests/tests.rs | 56 +++++++++++++++++++ .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 5 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 10 +--- .../bridge-hub-rococo/src/xcm_config.rs | 20 +++---- .../bridge-hub-rococo/tests/tests.rs | 56 +++++++++++++++++++ .../bridge-hubs/test-utils/Cargo.toml | 17 ++++++ .../bridge-hubs/test-utils/src/lib.rs | 18 ++++++ .../bridge-hubs/test-utils/src/test_cases.rs | 20 +++++++ .../collectives-polkadot/src/xcm_config.rs | 2 +- .../contracts-rococo/src/xcm_config.rs | 2 +- 28 files changed, 312 insertions(+), 87 deletions(-) create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-kusama/tests/tests.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-polkadot/tests/tests.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs create mode 100644 parachains/runtimes/bridge-hubs/test-utils/Cargo.toml create mode 100644 parachains/runtimes/bridge-hubs/test-utils/src/lib.rs create mode 100644 parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs diff --git a/Cargo.lock b/Cargo.lock index be6932b51db..84c3ccd6745 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -761,6 +761,7 @@ dependencies = [ name = "bridge-hub-kusama-runtime" version = "0.1.0" dependencies = [ + "bridge-hub-test-utils", "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", @@ -786,7 +787,6 @@ dependencies = [ "pallet-collator-selection", "pallet-multisig", "pallet-session", - "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -824,6 +824,7 @@ dependencies = [ name = "bridge-hub-polkadot-runtime" version = "0.1.0" dependencies = [ + "bridge-hub-test-utils", "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", @@ -848,7 +849,6 @@ dependencies = [ "pallet-collator-selection", "pallet-multisig", "pallet-session", - "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -887,6 +887,7 @@ dependencies = [ name = "bridge-hub-rococo-runtime" version = "0.1.0" dependencies = [ + "bridge-hub-test-utils", "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", @@ -911,7 +912,6 @@ dependencies = [ "pallet-collator-selection", "pallet-multisig", "pallet-session", - "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -946,6 +946,13 @@ dependencies = [ "xcm-executor", ] +[[package]] +name = "bridge-hub-test-utils" +version = "0.1.0" +dependencies = [ + "asset-test-utils", +] + [[package]] name = "bs58" version = "0.4.0" diff --git a/docs/release.md b/docs/release.md index 2b7c79c50be..9c0a6acc0e9 100644 --- a/docs/release.md +++ b/docs/release.md @@ -123,7 +123,7 @@ for `release-parachains-v0.9.270` 5. Clone `it/release--fast-sudo` from Polkadot In case the branch does not exists (it is a manual process): cherry pick paritytech/polkadot@791c8b8 and run `find . -type f -name "*.toml" -print0 | xargs -0 sed -i '' -e 's/polkadot-vX.X.X/polkadot-v/g'` -6. `cargo build --release features --fast-runtime` +6. `cargo build --release --features fast-runtime` 7. Copy `./target/polkadot` into `./bin` (in Cumulus) 8. Run the tests: - Statemint: `yarn zombienet-test -c ./examples/statemint/config.toml -t ./examples/statemint` diff --git a/pallets/parachain-system/src/validate_block/implementation.rs b/pallets/parachain-system/src/validate_block/implementation.rs index 3a5f90e0495..f953dfc77c5 100644 --- a/pallets/parachain-system/src/validate_block/implementation.rs +++ b/pallets/parachain-system/src/validate_block/implementation.rs @@ -22,9 +22,7 @@ use cumulus_primitives_core::{ }; use cumulus_primitives_parachain_inherent::ParachainInherentData; -use polkadot_parachain::primitives::{ - HeadData, RelayChainBlockNumber, ValidationParams, ValidationResult, -}; +use polkadot_parachain::primitives::{HeadData, RelayChainBlockNumber, ValidationResult}; use codec::Encode; @@ -238,7 +236,7 @@ where .expect("Could not find `set_validation_data` inherent") } -/// Validate the given [`PersistedValidationData`] against the [`ValidationParams`]. +/// Validate the given [`PersistedValidationData`] against the [`MemoryOptimizedValidationParams`]. fn validate_validation_data( validation_data: &PersistedValidationData, relay_parent_number: RelayChainBlockNumber, diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 5f987851a18..961a9300a56 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -28,6 +28,9 @@ pub mod constants; mod weights; pub mod xcm_config; +use assets_common::{ + foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, +}; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; use sp_api::impl_runtime_apis; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; @@ -74,9 +77,6 @@ use xcm_config::{ pub use sp_runtime::BuildStorage; // Polkadot imports -use assets_common::{ - foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, -}; use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use xcm::latest::BodyId; diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 5d4c45fd4f3..45f95ee07d4 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -356,7 +356,7 @@ pub type Barrier = DenyThenTry< ( // If the message is one that immediately attemps to pay for execution, then allow it. AllowTopLevelPaidExecutionFrom, - // Parent and its plurality (i.e. governance bodies) gets free execution. + // Parent and its pluralities (i.e. governance bodies) get free execution. AllowExplicitUnpaidExecutionFrom, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index acfb2417e4b..b9001a35a99 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -492,7 +492,8 @@ asset_test_utils::include_teleports_for_native_asset_works!( Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), _ => None, } - }) + }), + 1000 ); asset_test_utils::include_teleports_for_foreign_assets_works!( diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index 90b0ee85fef..9d31bc0da60 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -259,7 +259,7 @@ pub type Barrier = DenyThenTry< ( // If the message is one that immediately attemps to pay for execution, then allow it. AllowTopLevelPaidExecutionFrom, - // Parent, its plurality (i.e. governance bodies) and Fellows plurality gets free execution. + // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality get free execution. AllowExplicitUnpaidExecutionFrom<(ParentOrParentsPlurality, FellowsPlurality)>, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, diff --git a/parachains/runtimes/assets/statemint/tests/tests.rs b/parachains/runtimes/assets/statemint/tests/tests.rs index 75f6aaf6d57..7bbed6bb54a 100644 --- a/parachains/runtimes/assets/statemint/tests/tests.rs +++ b/parachains/runtimes/assets/statemint/tests/tests.rs @@ -470,7 +470,8 @@ asset_test_utils::include_teleports_for_native_asset_works!( Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), _ => None, } - }) + }), + 1000 ); asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 079e6bd60ae..3fd27940aea 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -78,6 +78,7 @@ pub fn teleports_for_native_asset_works< unwrap_xcmp_queue_event: Box< dyn Fn(Vec) -> Option>, >, + runtime_para_id: u32, ) where Runtime: frame_system::Config + pallet_balances::Config @@ -102,7 +103,6 @@ pub fn teleports_for_native_asset_works< Call = cumulus_pallet_parachain_system::Call, >, { - let runtime_para_id = 1000; ExtBuilder::::default() .with_collators(collator_session_keys.collators()) .with_session_keys(collator_session_keys.session_keys()) @@ -273,14 +273,15 @@ macro_rules! include_teleports_for_native_asset_works( $collator_session_key:expr, $existential_deposit:expr, $unwrap_pallet_xcm_event:expr, - $unwrap_xcmp_queue_event:expr + $unwrap_xcmp_queue_event:expr, + $runtime_para_id:expr ) => { #[test] fn teleports_for_native_asset_works() { const BOB: [u8; 32] = [2u8; 32]; let target_account = parachains_common::AccountId::from(BOB); - asset_test_utils::test_cases::teleports_for_native_asset_works::< + $crate::test_cases::teleports_for_native_asset_works::< $runtime, $xcm_config, $checking_account, @@ -291,7 +292,8 @@ macro_rules! include_teleports_for_native_asset_works( $existential_deposit, target_account, $unwrap_pallet_xcm_event, - $unwrap_xcmp_queue_event + $unwrap_xcmp_queue_event, + $runtime_para_id ) } } @@ -598,7 +600,7 @@ macro_rules! include_teleports_for_foreign_assets_works( const SOME_ASSET_OWNER: [u8; 32] = [5u8; 32]; let asset_owner = parachains_common::AccountId::from(SOME_ASSET_OWNER); - asset_test_utils::test_cases::teleports_for_foreign_assets_works::< + $crate::test_cases::teleports_for_foreign_assets_works::< $runtime, $xcm_config, $checking_account, @@ -715,7 +717,7 @@ macro_rules! include_asset_transactor_transfer_with_local_consensus_currency_wor const BOB: [u8; 32] = [2u8; 32]; let target_account = parachains_common::AccountId::from(BOB); - asset_test_utils::test_cases::asset_transactor_transfer_with_local_consensus_currency_works::< + $crate::test_cases::asset_transactor_transfer_with_local_consensus_currency_works::< $runtime, $xcm_config >( @@ -969,7 +971,7 @@ macro_rules! include_asset_transactor_transfer_with_pallet_assets_instance_works const CHARLIE: [u8; 32] = [3u8; 32]; let charlie_account = parachains_common::AccountId::from(CHARLIE); - asset_test_utils::test_cases::asset_transactor_transfer_with_pallet_assets_instance_works::< + $crate::test_cases::asset_transactor_transfer_with_pallet_assets_instance_works::< $runtime, $xcm_config, $assets_pallet_instance, @@ -1297,7 +1299,7 @@ macro_rules! include_create_and_manage_foreign_assets_for_local_consensus_parach const BOB: [u8; 32] = [2u8; 32]; let bob_account = parachains_common::AccountId::from(BOB); - asset_test_utils::test_cases::create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works::< + $crate::test_cases::create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works::< $runtime, $xcm_config, $weight_to_fee, diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 1f57b34fcae..d9987a627ae 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -354,7 +354,7 @@ pub type Barrier = DenyThenTry< ( // If the message is one that immediately attemps to pay for execution, then allow it. AllowTopLevelPaidExecutionFrom, - // Parent or its plurality (i.e. governance bodies) gets free execution. + // Parent and its pluralities (i.e. governance bodies) get free execution. AllowExplicitUnpaidExecutionFrom, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index c0c20c6b61a..3ef09d14e52 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -497,7 +497,8 @@ asset_test_utils::include_teleports_for_native_asset_works!( Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), _ => None, } - }) + }), + 1000 ); asset_test_utils::include_teleports_for_foreign_assets_works!( diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index 00a9da0103c..e37527b8d6c 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -29,7 +29,6 @@ pallet-authorship = { git = "https://github.com/paritytech/substrate", default-f pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -72,6 +71,9 @@ pallet-collator-selection = { path = "../../../../pallets/collator-selection", d parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } parachains-common = { path = "../../../../parachains/common", default-features = false } +[dev-dependencies] +bridge-hub-test-utils = { path = "../test-utils"} + [features] default = [ "std", @@ -100,7 +102,6 @@ std = [ "pallet-collator-selection/std", "pallet-multisig/std", "pallet-session/std", - "pallet-sudo/std", "pallet-timestamp/std", "pallet-transaction-payment-rpc-runtime-api/std", "pallet-transaction-payment/std", diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs index 4ebf760e849..952c3147306 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -64,15 +64,15 @@ use xcm_config::{ #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -// Polkadot imports use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; use parachains_common::{ - opaque, AccountId, Balance, BlockNumber, Hash, Header, Index, Signature, + impls::DealWithFees, opaque, AccountId, Balance, BlockNumber, Hash, Header, Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; + // XCM Imports use xcm::latest::prelude::BodyId; use xcm_executor::XcmExecutor; @@ -143,11 +143,6 @@ pub fn native_version() -> NativeVersion { parameter_types! { pub const Version: RuntimeVersion = VERSION; - - // This part is copied from Substrate's `bin/node/runtime/src/lib.rs`. - // The `RuntimeBlockLength` and `RuntimeBlockWeights` exist here because the - // `DeletionWeightLimit` and `DeletionQueueDepth` depend on those to parameterize - // the lazy contract deletion. pub RuntimeBlockLength: BlockLength = BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() @@ -264,7 +259,8 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; + type OnChargeTransaction = + pallet_transaction_payment::CurrencyAdapter>; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs index cfe8662cb7c..7b395a4d4e3 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs @@ -24,11 +24,11 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::xcm_config::{ - ConcreteNativeAssetFrom, DenyReserveTransferToRelayChain, DenyThenTry, +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ConcreteNativeAssetFrom, DenyReserveTransferToRelayChain, DenyThenTry}, }; use polkadot_parachain::primitives::Sibling; -use polkadot_runtime_common::impls::ToAuthor; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, @@ -96,17 +96,16 @@ pub type XcmOriginToTransactDispatchOrigin = ( // transaction from the Root origin. ParentAsSuperuser, // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `Origin::Signed` origin of the same 32-byte value. + // `RuntimeOrigin::Signed` origin of the same 32-byte value. SignedAccountId32AsNative, // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. XcmPassthrough, ); match_types! { - // TODO: map gov2 origins here - after merge https://github.com/paritytech/cumulus/pull/1895 - pub type ParentOrParentsExecutivePlurality: impl Contains = { + pub type ParentOrParentsPlurality: impl Contains = { MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) } + MultiLocation { parents: 1, interior: X1(Plurality { .. }) } }; pub type ParentOrSiblings: impl Contains = { MultiLocation { parents: 1, interior: Here } | @@ -165,10 +164,10 @@ pub type Barrier = DenyThenTry< AllowKnownQueryResponses, WithComputedOrigin< ( - // Allow anything to pay for execution. + // If the message is one that immediately attemps to pay for execution, then allow it. AllowTopLevelPaidExecutionFrom, - // Parent and its exec plurality get free execution. - AllowExplicitUnpaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) get free execution. + AllowExplicitUnpaidExecutionFrom, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, ), @@ -197,7 +196,7 @@ impl xcm_executor::Config for XcmConfig { MaxInstructions, >; type Trader = - UsingComponents>; + UsingComponents>; type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; type AssetClaims = PolkadotXcm; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/tests/tests.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/tests/tests.rs new file mode 100644 index 00000000000..9998e3d804d --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/tests/tests.rs @@ -0,0 +1,56 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +pub use bridge_hub_kusama_runtime::{ + constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, + ParachainSystem, PolkadotXcm, Runtime, RuntimeEvent, SessionKeys, +}; +use codec::Decode; +use frame_support::parameter_types; +use parachains_common::{AccountId, AuraId}; + +const ALICE: [u8; 32] = [1u8; 32]; + +parameter_types! { + pub CheckingAccount: AccountId = PolkadotXcm::check_account(); +} + +bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( + Runtime, + XcmConfig, + CheckingAccount, + WeightToFee, + ParachainSystem, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + 1002 +); diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 86bb0780027..520907e9d7c 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -29,7 +29,6 @@ pallet-authorship = { git = "https://github.com/paritytech/substrate", default-f pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -72,6 +71,9 @@ pallet-collator-selection = { path = "../../../../pallets/collator-selection", d parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } parachains-common = { path = "../../../../parachains/common", default-features = false } +[dev-dependencies] +bridge-hub-test-utils = { path = "../test-utils"} + [features] default = [ "std", @@ -100,7 +102,6 @@ std = [ "pallet-collator-selection/std", "pallet-multisig/std", "pallet-session/std", - "pallet-sudo/std", "pallet-timestamp/std", "pallet-transaction-payment-rpc-runtime-api/std", "pallet-transaction-payment/std", diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs index 109cd2434b3..dfc08b4c184 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -70,7 +70,7 @@ use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; use parachains_common::{ - opaque, AccountId, Balance, BlockNumber, Hash, Header, Index, Signature, + impls::DealWithFees, opaque, AccountId, Balance, BlockNumber, Hash, Header, Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; // XCM Imports @@ -143,11 +143,6 @@ pub fn native_version() -> NativeVersion { parameter_types! { pub const Version: RuntimeVersion = VERSION; - - // This part is copied from Substrate's `bin/node/runtime/src/lib.rs`. - // The `RuntimeBlockLength` and `RuntimeBlockWeights` exist here because the - // `DeletionWeightLimit` and `DeletionQueueDepth` depend on those to parameterize - // the lazy contract deletion. pub RuntimeBlockLength: BlockLength = BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() @@ -264,7 +259,8 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; + type OnChargeTransaction = + pallet_transaction_payment::CurrencyAdapter>; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs index 189e7c74f81..d063fda2c13 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs @@ -24,11 +24,11 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::xcm_config::{ - ConcreteNativeAssetFrom, DenyReserveTransferToRelayChain, DenyThenTry, +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ConcreteNativeAssetFrom, DenyReserveTransferToRelayChain, DenyThenTry}, }; use polkadot_parachain::primitives::Sibling; -use polkadot_runtime_common::impls::ToAuthor; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, @@ -96,22 +96,24 @@ pub type XcmOriginToTransactDispatchOrigin = ( // transaction from the Root origin. ParentAsSuperuser, // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `Origin::Signed` origin of the same 32-byte value. + // `RuntimeOrigin::Signed` origin of the same 32-byte value. SignedAccountId32AsNative, // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. XcmPassthrough, ); match_types! { - // TODO: map gov2 origins here - after merge https://github.com/paritytech/cumulus/pull/1895 - pub type ParentOrParentsExecutivePlurality: impl Contains = { + pub type ParentOrParentsPlurality: impl Contains = { MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) } + MultiLocation { parents: 1, interior: X1(Plurality { .. }) } }; pub type ParentOrSiblings: impl Contains = { MultiLocation { parents: 1, interior: Here } | MultiLocation { parents: 1, interior: X1(_) } }; + pub type FellowsPlurality: impl Contains = { + MultiLocation { parents: 1, interior: X2(Parachain(1001), Plurality { id: BodyId::Technical, ..}) } + }; } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly /// account for proof size weights. @@ -165,10 +167,10 @@ pub type Barrier = DenyThenTry< AllowKnownQueryResponses, WithComputedOrigin< ( - // Allow anything to pay for execution. + // If the message is one that immediately attemps to pay for execution, then allow it. AllowTopLevelPaidExecutionFrom, - // Parent and its exec plurality get free execution. - AllowExplicitUnpaidExecutionFrom, + // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality get free execution. + AllowExplicitUnpaidExecutionFrom<(ParentOrParentsPlurality, FellowsPlurality)>, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, ), @@ -197,7 +199,7 @@ impl xcm_executor::Config for XcmConfig { MaxInstructions, >; type Trader = - UsingComponents>; + UsingComponents>; type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; type AssetClaims = PolkadotXcm; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/tests/tests.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/tests/tests.rs new file mode 100644 index 00000000000..9a3ccd59cd6 --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/tests/tests.rs @@ -0,0 +1,56 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +pub use bridge_hub_polkadot_runtime::{ + constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, + ParachainSystem, PolkadotXcm, Runtime, RuntimeEvent, SessionKeys, +}; +use codec::Decode; +use frame_support::parameter_types; +use parachains_common::{AccountId, AuraId}; + +const ALICE: [u8; 32] = [1u8; 32]; + +parameter_types! { + pub CheckingAccount: AccountId = PolkadotXcm::check_account(); +} + +bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( + Runtime, + XcmConfig, + CheckingAccount, + WeightToFee, + ParachainSystem, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + 1002 +); diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 2efdcfd8263..cfd1894491b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -29,7 +29,6 @@ pallet-authorship = { git = "https://github.com/paritytech/substrate", default-f pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -72,6 +71,9 @@ pallet-collator-selection = { path = "../../../../pallets/collator-selection", d parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } parachains-common = { path = "../../../../parachains/common", default-features = false } +[dev-dependencies] +bridge-hub-test-utils = { path = "../test-utils"} + [features] default = [ "std", @@ -99,7 +101,6 @@ std = [ "pallet-collator-selection/std", "pallet-multisig/std", "pallet-session/std", - "pallet-sudo/std", "pallet-timestamp/std", "pallet-transaction-payment-rpc-runtime-api/std", "pallet-transaction-payment/std", diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 04eddf59e3a..2e985546e02 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -73,7 +73,7 @@ use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; // XCM Imports use parachains_common::{ - opaque, AccountId, Balance, BlockNumber, Hash, Header, Index, Signature, + impls::DealWithFees, opaque, AccountId, Balance, BlockNumber, Hash, Header, Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_executor::XcmExecutor; @@ -209,11 +209,6 @@ pub fn native_version() -> NativeVersion { parameter_types! { pub const Version: RuntimeVersion = VERSION; - - // This part is copied from Substrate's `bin/node/runtime/src/lib.rs`. - // The `RuntimeBlockLength` and `RuntimeBlockWeights` exist here because the - // `DeletionWeightLimit` and `DeletionQueueDepth` depend on those to parameterize - // the lazy contract deletion. pub RuntimeBlockLength: BlockLength = BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() @@ -331,7 +326,8 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; + type OnChargeTransaction = + pallet_transaction_payment::CurrencyAdapter>; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index 17ac293c62b..c629c18e0ca 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -24,11 +24,11 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::xcm_config::{ - ConcreteNativeAssetFrom, DenyReserveTransferToRelayChain, DenyThenTry, +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ConcreteNativeAssetFrom, DenyReserveTransferToRelayChain, DenyThenTry}, }; use polkadot_parachain::primitives::Sibling; -use polkadot_runtime_common::impls::ToAuthor; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, @@ -94,16 +94,16 @@ pub type XcmOriginToTransactDispatchOrigin = ( // transaction from the Root origin. ParentAsSuperuser, // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `Origin::Signed` origin of the same 32-byte value. + // `RuntimeOrigin::Signed` origin of the same 32-byte value. SignedAccountId32AsNative, // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. XcmPassthrough, ); match_types! { - pub type ParentOrParentsExecutivePlurality: impl Contains = { + pub type ParentOrParentsPlurality: impl Contains = { MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) } + MultiLocation { parents: 1, interior: X1(Plurality { .. }) } }; pub type ParentOrSiblings: impl Contains = { MultiLocation { parents: 1, interior: Here } | @@ -163,10 +163,10 @@ pub type Barrier = DenyThenTry< AllowKnownQueryResponses, WithComputedOrigin< ( - // Allow anything to pay for execution. + // If the message is one that immediately attemps to pay for execution, then allow it. AllowTopLevelPaidExecutionFrom, - // Parent and its exec plurality get free execution. - AllowExplicitUnpaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) get free execution. + AllowExplicitUnpaidExecutionFrom, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, ), @@ -195,7 +195,7 @@ impl xcm_executor::Config for XcmConfig { MaxInstructions, >; type Trader = - UsingComponents>; + UsingComponents>; type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; type AssetClaims = PolkadotXcm; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs new file mode 100644 index 00000000000..bf899b567d8 --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -0,0 +1,56 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +pub use bridge_hub_rococo_runtime::{ + constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, + ParachainSystem, PolkadotXcm, Runtime, RuntimeEvent, SessionKeys, +}; +use codec::Decode; +use frame_support::parameter_types; +use parachains_common::{AccountId, AuraId}; + +const ALICE: [u8; 32] = [1u8; 32]; + +parameter_types! { + pub CheckingAccount: AccountId = PolkadotXcm::check_account(); +} + +bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( + Runtime, + XcmConfig, + CheckingAccount, + WeightToFee, + ParachainSystem, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + 1013 +); diff --git a/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml new file mode 100644 index 00000000000..ccee28f82cf --- /dev/null +++ b/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "bridge-hub-test-utils" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +description = "Utils for BridgeHub testing" + +[dependencies] + +# Cumulus +asset-test-utils = { path = "../../assets/test-utils"} + +[features] +default = [ "std" ] +std = [ + "asset-test-utils/std", +] diff --git a/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs b/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs new file mode 100644 index 00000000000..882910b5fc0 --- /dev/null +++ b/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs @@ -0,0 +1,18 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +pub mod test_cases; +pub use test_cases::CollatorSessionKeys; diff --git a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs new file mode 100644 index 00000000000..cdbeb65fab1 --- /dev/null +++ b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs @@ -0,0 +1,20 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Module contains predefined test-case scenarios for `Runtime` with bridging capabilities. + +// Re-export test_cases from assets +pub use asset_test_utils::{include_teleports_for_native_asset_works, CollatorSessionKeys}; diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index 9c1fda61bd8..b2b93d88ffe 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -204,7 +204,7 @@ pub type Barrier = DenyThenTry< ( // If the message is one that immediately attemps to pay for execution, then allow it. AllowTopLevelPaidExecutionFrom, - // Parent and its plurality (i.e. governance bodies) gets free execution. + // Parent and its pluralities (i.e. governance bodies) get free execution. AllowExplicitUnpaidExecutionFrom, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, diff --git a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs index d8ed043fb54..1b42819b423 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs @@ -129,7 +129,7 @@ pub type Barrier = DenyThenTry< ( // If the message is one that immediately attemps to pay for execution, then allow it. AllowTopLevelPaidExecutionFrom, - // Parent and its plurality (i.e. governance bodies) gets free execution. + // Parent and its pluralities (i.e. governance bodies) get free execution. AllowExplicitUnpaidExecutionFrom, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, From 5c479b7d2d9a068b0ada111868cc3b0e508dff01 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 19 Apr 2023 10:52:04 +0200 Subject: [PATCH 129/339] Extract runtime_para_id for test --- parachains/runtimes/assets/statemine/tests/tests.rs | 3 ++- parachains/runtimes/assets/statemint/tests/tests.rs | 3 ++- parachains/runtimes/assets/test-utils/src/test_cases.rs | 8 +++++--- parachains/runtimes/assets/westmint/tests/tests.rs | 3 ++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index 66cf3f79404..079356a8658 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -495,7 +495,8 @@ asset_test_utils::include_teleports_for_native_asset_works!( Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), _ => None, } - }) + }), + 1000 ); asset_test_utils::include_teleports_for_foreign_assets_works!( diff --git a/parachains/runtimes/assets/statemint/tests/tests.rs b/parachains/runtimes/assets/statemint/tests/tests.rs index 75f6aaf6d57..7bbed6bb54a 100644 --- a/parachains/runtimes/assets/statemint/tests/tests.rs +++ b/parachains/runtimes/assets/statemint/tests/tests.rs @@ -470,7 +470,8 @@ asset_test_utils::include_teleports_for_native_asset_works!( Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), _ => None, } - }) + }), + 1000 ); asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index b7e49c00957..cdada5a5f1f 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -82,6 +82,7 @@ pub fn teleports_for_native_asset_works< unwrap_xcmp_queue_event: Box< dyn Fn(Vec) -> Option>, >, + runtime_para_id: u32, ) where Runtime: frame_system::Config + pallet_balances::Config @@ -106,7 +107,6 @@ pub fn teleports_for_native_asset_works< Call = cumulus_pallet_parachain_system::Call, >, { - let runtime_para_id = 1000; ExtBuilder::::default() .with_collators(collator_session_keys.collators()) .with_session_keys(collator_session_keys.session_keys()) @@ -277,7 +277,8 @@ macro_rules! include_teleports_for_native_asset_works( $collator_session_key:expr, $existential_deposit:expr, $unwrap_pallet_xcm_event:expr, - $unwrap_xcmp_queue_event:expr + $unwrap_xcmp_queue_event:expr, + $runtime_para_id:expr ) => { #[test] fn teleports_for_native_asset_works() { @@ -295,7 +296,8 @@ macro_rules! include_teleports_for_native_asset_works( $existential_deposit, target_account, $unwrap_pallet_xcm_event, - $unwrap_xcmp_queue_event + $unwrap_xcmp_queue_event, + $runtime_para_id ) } } diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index d63259d9ddb..2fc700c4b1e 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -499,7 +499,8 @@ asset_test_utils::include_teleports_for_native_asset_works!( Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), _ => None, } - }) + }), + 1000 ); asset_test_utils::include_teleports_for_foreign_assets_works!( From ad2fa5c29cfdd169b0e29c768a58e66b0031f40a Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 19 Apr 2023 13:18:56 +0200 Subject: [PATCH 130/339] Typos --- parachains/runtimes/assets/test-utils/src/test_cases.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index cdada5a5f1f..04d3316b338 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1101,7 +1101,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor additional_checks_before(); // execute XCM with Transacts to create/manage foreign assets by foreign governance - // prepapre data for xcm::Transact(create) + // prepare data for xcm::Transact(create) let foreign_asset_create = runtime_call_encode(pallet_assets::Call::< Runtime, ForeignAssetsPalletInstance, @@ -1111,7 +1111,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor admin: foreign_creator_as_account_id.clone().into(), min_balance: 1.into(), }); - // prepapre data for xcm::Transact(set_metadata) + // prepare data for xcm::Transact(set_metadata) let foreign_asset_set_metadata = runtime_call_encode(pallet_assets::Call::< Runtime, ForeignAssetsPalletInstance, @@ -1121,7 +1121,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor symbol: Vec::from(ASSET_SYMBOL), decimals: 12, }); - // prepapre data for xcm::Transact(set_team - change just freezer to Bob) + // prepare data for xcm::Transact(set_team - change just freezer to Bob) let foreign_asset_set_team = runtime_call_encode(pallet_assets::Call::< Runtime, ForeignAssetsPalletInstance, From 7bba7f072ebca1df889535e6fadefb4f26c66609 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 20 Apr 2023 14:46:07 +0200 Subject: [PATCH 131/339] Added helper for `execute_as_governance` --- Cargo.lock | 1 + .../runtimes/assets/test-utils/Cargo.toml | 2 ++ .../runtimes/assets/test-utils/src/lib.rs | 27 ++++++++++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 4024f5848fa..925f7b913f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -384,6 +384,7 @@ name = "asset-test-utils" version = "1.0.0" dependencies = [ "assets-common", + "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", "cumulus-pallet-xcmp-queue", "cumulus-primitives-core", diff --git a/parachains/runtimes/assets/test-utils/Cargo.toml b/parachains/runtimes/assets/test-utils/Cargo.toml index a5932577d01..b6406cbb5c9 100644 --- a/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/parachains/runtimes/assets/test-utils/Cargo.toml @@ -23,6 +23,7 @@ sp-core = { git = "https://github.com/paritytech/substrate", default-features = # Cumulus cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } +cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } @@ -71,4 +72,5 @@ std = [ "xcm-executor/std", "pallet-bridge-transfer/std", "cumulus-pallet-xcmp-queue/std", + "cumulus-pallet-dmp-queue/std", ] diff --git a/parachains/runtimes/assets/test-utils/src/lib.rs b/parachains/runtimes/assets/test-utils/src/lib.rs index 3faa95eb09b..db5e28fc255 100644 --- a/parachains/runtimes/assets/test-utils/src/lib.rs +++ b/parachains/runtimes/assets/test-utils/src/lib.rs @@ -19,7 +19,7 @@ use sp_core::Encode; use sp_runtime::{Digest, DigestItem}; use xcm::{ latest::{MultiAsset, MultiLocation, XcmContext, XcmHash}, - prelude::{Concrete, Fungible, Outcome, XcmError, XcmVersion}, + prelude::*, VersionedXcm, MAX_XCM_DECODE_DEPTH, }; use xcm_executor::{traits::TransactAsset, Assets}; @@ -256,6 +256,31 @@ impl Runt } } +impl + RuntimeHelper +{ + pub fn execute_as_governance(call: Vec, require_weight_at_most: Weight) -> Outcome { + // prepare xcm as governance will do + let xcm = Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + Transact { + origin_kind: OriginKind::Superuser, + require_weight_at_most, + call: call.into(), + }, + ]); + + // execute xcm as parent origin + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + <::XcmExecutor>::execute_xcm( + MultiLocation::parent(), + xcm, + hash, + Self::xcm_max_weight(XcmReceivedFrom::Parent), + ) + } +} + pub enum XcmReceivedFrom { Parent, Sibling, From 2e33b87afd86e9b0a2e62a92c30b26de428640b5 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 24 Apr 2023 16:09:58 +0200 Subject: [PATCH 132/339] Fix test because `UnpaidRemoteExporter` adds now `UnpaidExecution` instruction --- .../runtimes/assets/test-utils/src/test_cases.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index e26715eaebc..b258a4b3379 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1782,7 +1782,15 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< .0 .matcher() .match_next_inst(|instr| match instr { - // first instruction is ExportMessage (because we have unpaid execution on bridge-hub now) + // first instruction is UNpai (because we have explicit unpaid execution on bridge-hub now) + UnpaidExecution { weight_limit, check_origin } + if weight_limit == &Unlimited && check_origin.is_none() => + Ok(()), + _ => Err(()), + }) + .expect("contains UnpaidExecution") + .match_next_inst(|instr| match instr { + // second instruction is ExportMessage ExportMessage { network, destination, xcm: inner_xcm } => { assert_eq!(network, &bridged_network); let (_, target_location_junctions_without_global_consensus) = From 43ee62707d80b46a954a5742117b258b6996f3a2 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 24 Apr 2023 16:43:18 +0200 Subject: [PATCH 133/339] Use `execute_as_governance` function --- .../assets/test-utils/src/test_cases.rs | 119 +++++++----------- 1 file changed, 42 insertions(+), 77 deletions(-) diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index b258a4b3379..fcb1bdbbbfa 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1344,6 +1344,7 @@ pub fn can_governance_change_bridge_transfer_out_configuration: Into<[u8; 32]>, ValidatorIdOf: From>, @@ -1369,43 +1370,22 @@ pub fn can_governance_change_bridge_transfer_out_configuration Outcome { - // prepare xcm as governance will do - let xcm = Xcm(vec![ - UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - Transact { - origin_kind: OriginKind::Superuser, - require_weight_at_most: Weight::from_parts(200_000_000, 12000), - call: runtime_call_encode(call).into(), - }, - ]); - - // origin as relay chain - let origin = MultiLocation { parents: 1, interior: Here }; - - // initialize bridge through governance-like - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - XcmExecutor::::execute_xcm( - origin, - xcm, - hash, - RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Parent), - ) - }; - // check no cfg assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) .is_none()); - // governance can add bridge config - assert_ok!(execute_as_governance( - pallet_bridge_transfer::Call::::add_exporter_config { - bridged_network, - bridge_config: Box::new(bridge_config.clone()), - }, + // governance can add exporter config + assert_ok!(RuntimeHelper::::execute_as_governance( + runtime_call_encode( + pallet_bridge_transfer::Call::::add_exporter_config { + bridged_network, + bridge_config: Box::new(bridge_config.clone()), + } + ), + <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::add_exporter_config() ) .ensure_complete()); + assert!(>::events() .into_iter() .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) @@ -1426,16 +1406,19 @@ pub fn can_governance_change_bridge_transfer_out_configuration::update_exporter_config { - bridged_network, - bridge_location_fee: Some(Box::new(VersionedMultiAsset::V3( - new_bridge_location_fee.clone() - ))), - target_location_fee: Some(Box::new(VersionedMultiAsset::V3( - new_target_location_fee.clone() - ))), - }, + assert_ok!(RuntimeHelper::::execute_as_governance( + runtime_call_encode( + pallet_bridge_transfer::Call::::update_exporter_config { + bridged_network, + bridge_location_fee: Some(Box::new(VersionedMultiAsset::V3( + new_bridge_location_fee.clone() + ))), + target_location_fee: Some(Box::new(VersionedMultiAsset::V3( + new_target_location_fee.clone() + ))), + } + ), + <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::update_exporter_config() ) .ensure_complete()); assert!(>::events() @@ -1454,8 +1437,11 @@ pub fn can_governance_change_bridge_transfer_out_configuration::remove_exporter_config { bridged_network }, + assert_ok!(RuntimeHelper::::execute_as_governance( + runtime_call_encode( + pallet_bridge_transfer::Call::::remove_exporter_config { bridged_network } + ), + <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::remove_exporter_config() ) .ensure_complete()); assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) @@ -1478,7 +1464,7 @@ macro_rules! include_can_governance_change_bridge_transfer_out_configuration( ) => { #[test] fn can_governance_change_bridge_transfer_out_configuration() { - asset_test_utils::test_cases::can_governance_change_bridge_transfer_out_configuration::< + $crate::test_cases::can_governance_change_bridge_transfer_out_configuration::< $runtime, $xcm_config, >( @@ -1505,6 +1491,7 @@ pub fn can_governance_change_bridge_transfer_in_configuration: Into<[u8; 32]>, ValidatorIdOf: From>, @@ -1522,31 +1509,6 @@ pub fn can_governance_change_bridge_transfer_in_configuration Outcome { - // prepare xcm as governance will do - let xcm = Xcm(vec![ - UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - Transact { - origin_kind: OriginKind::Superuser, - require_weight_at_most: Weight::from_parts(200_000_000, 12000), - call: runtime_call_encode(call).into(), - }, - ]); - - // origin as relay chain - let origin = MultiLocation { parents: 1, interior: Here }; - - // initialize bridge through governance-like - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - XcmExecutor::::execute_xcm( - origin, - xcm, - hash, - RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Parent), - ) - }; - // check before assert!( !pallet_bridge_transfer::impls::AllowedUniversalAliasesOf::::contains(&( @@ -1556,11 +1518,14 @@ pub fn can_governance_change_bridge_transfer_in_configuration::add_universal_alias { - location: Box::new(VersionedMultiLocation::V3(bridge_location.clone())), - junction: alias_junction, - }, + assert_ok!(RuntimeHelper::::execute_as_governance( + runtime_call_encode( + pallet_bridge_transfer::Call::::add_universal_alias { + location: Box::new(VersionedMultiLocation::V3(bridge_location.clone())), + junction: alias_junction, + } + ), + <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::add_universal_alias() ) .ensure_complete()); assert!(>::events() @@ -1586,7 +1551,7 @@ macro_rules! include_can_governance_change_bridge_transfer_in_configuration( ) => { #[test] fn can_governance_change_bridge_transfer_in_configuration() { - asset_test_utils::test_cases::can_governance_change_bridge_transfer_in_configuration::< + $crate::test_cases::can_governance_change_bridge_transfer_in_configuration::< $runtime, $xcm_config, >( @@ -1887,7 +1852,7 @@ macro_rules! include_initiate_transfer_asset_via_bridge_for_native_asset_works( const ALICE: [u8; 32] = [1u8; 32]; let alice_account = parachains_common::AccountId::from(ALICE); - asset_test_utils::test_cases::initiate_transfer_asset_via_bridge_for_native_asset_works::< + $crate::test_cases::initiate_transfer_asset_via_bridge_for_native_asset_works::< $runtime, $xcm_config, $hrmp_channel_opener, @@ -2125,7 +2090,7 @@ macro_rules! include_receive_reserve_asset_deposited_from_different_consensus_wo const BOB: [u8; 32] = [2u8; 32]; let target_account = parachains_common::AccountId::from(BOB); - asset_test_utils::test_cases::receive_reserve_asset_deposited_from_different_consensus_works::< + $crate::test_cases::receive_reserve_asset_deposited_from_different_consensus_works::< $runtime, $xcm_config, $location_to_account_id, From 77c0b76943f86b791024de8f0e898f85b6699ef3 Mon Sep 17 00:00:00 2001 From: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Date: Mon, 24 Apr 2023 17:33:46 +0200 Subject: [PATCH 134/339] [ci] Update buildah command and version (#2479) --- .gitlab-ci.yml | 2 ++ scripts/ci/gitlab/pipeline/publish.yml | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2e0f6330d70..7166ace649f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -30,6 +30,8 @@ variables: DOCKER_OS: "debian:stretch" ARCH: "x86_64" ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.43" + BUILDAH_IMAGE: "quay.io/buildah/stable:v1.29" + BUILDAH_COMMAND: "buildah --storage-driver overlay2" .common-before-script: before_script: diff --git a/scripts/ci/gitlab/pipeline/publish.yml b/scripts/ci/gitlab/pipeline/publish.yml index 84f0a576e3b..e59ff167698 100644 --- a/scripts/ci/gitlab/pipeline/publish.yml +++ b/scripts/ci/gitlab/pipeline/publish.yml @@ -2,7 +2,7 @@ # Here are all jobs that are executed during "publish" stage .build-push-image: - image: quay.io/buildah/stable:v1.27 + image: $BUILDAH_IMAGE variables: DOCKERFILE: "" # docker/path-to.Dockerfile IMAGE_NAME: "" # docker.io/paritypr/image_name @@ -10,7 +10,7 @@ script: - test "$PARITYPR_USER" -a "$PARITYPR_PASS" || ( echo "no docker credentials provided"; exit 1 ) - - buildah bud + - $BUILDAH_COMMAND build --format=docker --build-arg VCS_REF="${CI_COMMIT_SHA}" --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" @@ -19,8 +19,8 @@ --file ${DOCKERFILE} . - echo "$PARITYPR_PASS" | buildah login --username "$PARITYPR_USER" --password-stdin docker.io - - buildah info - - buildah push --format=v2s2 "$IMAGE_NAME:$VERSION" + - $BUILDAH_COMMAND info + - $BUILDAH_COMMAND push --format=v2s2 "$IMAGE_NAME:$VERSION" after_script: - buildah logout --all From 321e81e4eeb5559df336581cb6819c7edf814a2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 19:54:34 +0000 Subject: [PATCH 135/339] Bump enumflags2 from 0.7.5 to 0.7.7 (#2481) Bumps [enumflags2](https://github.com/meithecatte/enumflags2) from 0.7.5 to 0.7.7. - [Release notes](https://github.com/meithecatte/enumflags2/releases) - [Commits](https://github.com/meithecatte/enumflags2/compare/v0.7.5...v0.7.7) --- updated-dependencies: - dependency-name: enumflags2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 84c3ccd6745..8a5197dead1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3129,22 +3129,22 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.7.5" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb" +checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" dependencies = [ "enumflags2_derive", ] [[package]] name = "enumflags2_derive" -version = "0.7.4" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" +checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] From 1ad8cc8f1ae2f553fcc2de3d8e45ab78b073f9f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 12:19:20 +0200 Subject: [PATCH 136/339] Bump ruby/setup-ruby from 1.133.2 to 1.146.0 (#2466) Bumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.133.2 to 1.146.0. - [Release notes](https://github.com/ruby/setup-ruby/releases) - [Commits](https://github.com/ruby/setup-ruby/compare/93287a1fa82c6ddbb6d8db978df4b0119cd8879f...55283cc23133118229fd3f97f9336ee23a179fcf) --- updated-dependencies: - dependency-name: ruby/setup-ruby dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release-30_create-draft.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index e8ce688b71b..eba692b511a 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -126,7 +126,7 @@ jobs: path: cumulus ref: ${{ github.event.inputs.ref2 }} - - uses: ruby/setup-ruby@93287a1fa82c6ddbb6d8db978df4b0119cd8879f # v1.133.2 + - uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0 with: ruby-version: 3.0.0 @@ -253,7 +253,7 @@ jobs: - name: Download artifacts uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 # v3.0.0 - - uses: ruby/setup-ruby@93287a1fa82c6ddbb6d8db978df4b0119cd8879f # v1.133.2 + - uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0 with: ruby-version: 3.0.0 From 383f399001716508368b5645e090a7504560ee4e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 10:37:31 +0200 Subject: [PATCH 137/339] Bump ruby/setup-ruby from 1.146.0 to 1.147.0 (#2484) Bumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.146.0 to 1.147.0. - [Release notes](https://github.com/ruby/setup-ruby/releases) - [Commits](https://github.com/ruby/setup-ruby/compare/55283cc23133118229fd3f97f9336ee23a179fcf...6cecb48364174b0952995175c55f9bf5527e6682) --- updated-dependencies: - dependency-name: ruby/setup-ruby dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release-30_create-draft.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index eba692b511a..b7f3d422a09 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -126,7 +126,7 @@ jobs: path: cumulus ref: ${{ github.event.inputs.ref2 }} - - uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0 + - uses: ruby/setup-ruby@6cecb48364174b0952995175c55f9bf5527e6682 # v1.147.0 with: ruby-version: 3.0.0 @@ -253,7 +253,7 @@ jobs: - name: Download artifacts uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 # v3.0.0 - - uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0 + - uses: ruby/setup-ruby@6cecb48364174b0952995175c55f9bf5527e6682 # v1.147.0 with: ruby-version: 3.0.0 From e63a06d6a84fcda29dcf50530bfc77c40f90673f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 12:39:01 +0200 Subject: [PATCH 138/339] Bump actions/download-artifact from 3.0.0 to 3.0.1 (#1798) * Bump actions/download-artifact from 3.0.0 to 3.0.1 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/fb598a63ae348fa914e94cd0ff38f362e927b741...9782bd6a9848b53b110e712e20e42d89988822b7) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * match hash with version --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sergejs Kostjucenko <85877331+sergejparity@users.noreply.github.com> --- .github/workflows/release-30_create-draft.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index b7f3d422a09..81dd253e3f9 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -131,7 +131,7 @@ jobs: ruby-version: 3.0.0 - name: Download srtool json output - uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 # v3.0.0 + uses: actions/download-artifact@9782bd6a9848b53b110e712e20e42d89988822b7 # v3.0.1 - name: Prepare tooling run: | @@ -251,7 +251,7 @@ jobs: ref: ${{ github.event.inputs.ref2 }} - name: Download artifacts - uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 # v3.0.0 + uses: actions/download-artifact@9782bd6a9848b53b110e712e20e42d89988822b7 # v3.0.1 - uses: ruby/setup-ruby@6cecb48364174b0952995175c55f9bf5527e6682 # v1.147.0 with: From b54ccbac7f38e5533fec0ef080836ac89fdc7cd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 12:41:13 +0200 Subject: [PATCH 139/339] Bump actions/upload-artifact from 3.1.0 to 3.1.1 (#1799) * Bump actions/upload-artifact from 3.1.0 to 3.1.1 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/3cea5372237819ed00197afe530f5a7ea3e805c8...83fd05a356d7e2593de66fc9913b3002723633cb) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * match hash with version --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sergejs Kostjucenko --- .../release-20_extrinsic-ordering-check-from-bin.yml | 2 +- .../release-21_extrinsic-ordering-check-from-two.yml | 2 +- .github/workflows/release-30_create-draft.yml | 8 ++++---- .github/workflows/srtool.yml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml index 340f72420be..0f7eca82107 100644 --- a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml +++ b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml @@ -79,7 +79,7 @@ jobs: continue-on-error: true - name: Save output as artifact - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 with: name: ${{ env.CHAIN }} path: | diff --git a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml index 98b88de2ad4..78add6fc75e 100644 --- a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml +++ b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml @@ -108,7 +108,7 @@ jobs: cat output.txt - name: Save output as artifact - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 with: name: ${{ matrix.runtime }} path: | diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index 81dd253e3f9..e5760269c45 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -99,14 +99,14 @@ jobs: - name: Upload ${{ matrix.runtime }} srtool json if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 with: name: ${{ matrix.runtime }}-srtool-json path: ${{ matrix.runtime }}-srtool-digest.json - name: Upload ${{ matrix.runtime }} runtime if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 with: name: ${{ matrix.runtime }}-runtime path: | @@ -189,14 +189,14 @@ jobs: - name: Archive srtool json if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 with: name: srtool-json path: | **/*-srtool-digest.json - name: Archive context artifact - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 with: name: release-notes-context path: | diff --git a/.github/workflows/srtool.yml b/.github/workflows/srtool.yml index 9b20be76611..8ef2a8815c0 100644 --- a/.github/workflows/srtool.yml +++ b/.github/workflows/srtool.yml @@ -74,7 +74,7 @@ jobs: # it takes a while to build the runtime, so let's save the artifact as soon as we have it - name: Archive Artifacts for ${{ matrix.runtime }} - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 with: name: ${{ matrix.runtime }}-runtime path: | @@ -112,7 +112,7 @@ jobs: tee ${{ matrix.runtime }}-diff.txt - name: Archive Subwasm results - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 with: name: ${{ matrix.runtime }}-runtime path: | From 263ebdf6e0417c941e4c5b952de6e2826b6c8cf7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 14:13:58 +0200 Subject: [PATCH 140/339] Bump actions/cache from 3.0.11 to 3.2.3 (#2082) Bumps [actions/cache](https://github.com/actions/cache) from 3.0.11 to 3.2.3. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7...58c146cc91c5b9e778e71775dfe9bf1442ad9a12) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: parity-processbot <> --- .github/workflows/fmt-check.yml | 2 +- .github/workflows/release-30_create-draft.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/fmt-check.yml b/.github/workflows/fmt-check.yml index cdde5c820cc..1bd6cb94b3b 100644 --- a/.github/workflows/fmt-check.yml +++ b/.github/workflows/fmt-check.yml @@ -23,7 +23,7 @@ jobs: components: clippy, rustfmt - name: Cache Dependencies & Build Outputs - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 # v3.0.11 + uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12 # v3.2.3 with: path: | ~/.cargo/registry diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index e5760269c45..d481b42902a 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -74,7 +74,7 @@ jobs: - name: Cache target dir if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 # v3.0.11 + uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12 # v3.2.3 with: path: "${{ github.workspace }}/runtime/${{ matrix.runtime }}/target" key: srtool-target-${{ matrix.runtime }}-${{ github.sha }} From db74a62c77372f5ae5d5bde98dbf5e0b3fcba9fd Mon Sep 17 00:00:00 2001 From: Sasha Gryaznov Date: Wed, 26 Apr 2023 16:20:55 +0300 Subject: [PATCH 141/339] Companion for substrate#13565 (#2306) * add default deposit limit * cargo upd --- Cargo.lock | 524 +++++++++--------- .../contracts-rococo/src/contracts.rs | 2 + 2 files changed, 265 insertions(+), 261 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8a5197dead1..0e4966f412a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -584,7 +584,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "hash-db", "log", @@ -601,9 +601,9 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.60.1" +version = "0.64.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6" +checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" dependencies = [ "bitflags", "cexpr", @@ -616,6 +616,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", + "syn 1.0.109", ] [[package]] @@ -3455,7 +3456,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", ] @@ -3478,7 +3479,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-support-procedural", @@ -3503,7 +3504,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3550,7 +3551,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3561,7 +3562,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3578,7 +3579,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -3607,7 +3608,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-recursion", "futures", @@ -3625,7 +3626,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "bitflags", "environmental", @@ -3658,7 +3659,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "Inflector", "cfg-expr", @@ -3674,7 +3675,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3686,7 +3687,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "proc-macro2", "quote", @@ -3696,7 +3697,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "log", @@ -3714,7 +3715,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3729,7 +3730,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "sp-api", @@ -3738,7 +3739,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "parity-scale-codec", @@ -4725,7 +4726,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bitvec", "frame-benchmarking", @@ -4823,7 +4824,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "frame-support", "polkadot-primitives", @@ -4855,9 +4856,9 @@ dependencies = [ [[package]] name = "kvdb-rocksdb" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2182b8219fee6bd83aacaab7344e840179ae079d5216aa4e249b4d704646a844" +checksum = "fe7a749456510c45f795e8b04a6a3e0976d0139213ecbf465843830ad55e2217" dependencies = [ "kvdb", "num_cpus", @@ -5315,9 +5316,9 @@ dependencies = [ [[package]] name = "librocksdb-sys" -version = "0.8.0+7.4.4" +version = "0.10.0+7.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611804e4666a25136fcc5f8cf425ab4d26c7f74ea245ffe92ea23b85b6420b5d" +checksum = "0fe4d5874f5ff2bc616e55e8c6086d478fcda13faf9495768a4aa1c22042d30b" dependencies = [ "bindgen", "bzip2-sys", @@ -5677,7 +5678,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "futures", "log", @@ -5696,7 +5697,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "anyhow", "jsonrpsee", @@ -6216,7 +6217,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6234,7 +6235,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6249,7 +6250,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -6265,7 +6266,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -6281,7 +6282,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -6295,7 +6296,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6319,7 +6320,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6339,7 +6340,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6354,7 +6355,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -6373,7 +6374,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6397,7 +6398,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6415,7 +6416,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6459,7 +6460,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6476,7 +6477,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "bitflags", "environmental", @@ -6506,7 +6507,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "bitflags", "parity-scale-codec", @@ -6519,7 +6520,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "proc-macro2", "quote", @@ -6529,7 +6530,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6546,7 +6547,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6564,7 +6565,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6587,7 +6588,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6600,7 +6601,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6618,7 +6619,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6636,7 +6637,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6659,7 +6660,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6675,7 +6676,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6695,7 +6696,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6712,7 +6713,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -6726,7 +6727,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6743,7 +6744,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6760,7 +6761,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6805,7 +6806,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6821,7 +6822,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -6838,7 +6839,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6858,7 +6859,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6869,7 +6870,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -6886,7 +6887,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6910,7 +6911,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6927,7 +6928,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6942,7 +6943,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6960,7 +6961,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6975,7 +6976,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6994,7 +6995,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7011,7 +7012,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -7032,7 +7033,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7048,7 +7049,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -7062,7 +7063,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7085,7 +7086,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7096,7 +7097,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "log", "sp-arithmetic", @@ -7105,7 +7106,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7114,7 +7115,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7131,7 +7132,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -7160,7 +7161,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7178,7 +7179,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7197,7 +7198,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-support", "frame-system", @@ -7213,7 +7214,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7229,7 +7230,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7241,7 +7242,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7273,7 +7274,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7289,7 +7290,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7304,7 +7305,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7319,7 +7320,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7340,7 +7341,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7618,9 +7619,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.6" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" [[package]] name = "pbkdf2" @@ -7889,7 +7890,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "futures", "polkadot-node-jaeger", @@ -7905,7 +7906,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7919,7 +7920,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "derive_more", "fatality", @@ -7942,7 +7943,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "fatality", "futures", @@ -7963,7 +7964,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "clap 4.2.3", "frame-benchmarking-cli", @@ -7992,7 +7993,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "async-trait", "frame-benchmarking", @@ -8035,7 +8036,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "always-assert", "bitvec", @@ -8057,7 +8058,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "parity-scale-codec", "scale-info", @@ -8069,7 +8070,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "derive_more", "fatality", @@ -8094,7 +8095,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8108,7 +8109,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "futures", "futures-timer", @@ -8128,7 +8129,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "always-assert", "async-trait", @@ -8151,7 +8152,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "futures", "parity-scale-codec", @@ -8169,7 +8170,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bitvec", "derive_more", @@ -8198,7 +8199,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bitvec", "futures", @@ -8219,7 +8220,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bitvec", "fatality", @@ -8238,7 +8239,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8253,7 +8254,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "async-trait", "futures", @@ -8273,7 +8274,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "futures", "polkadot-node-metrics", @@ -8288,7 +8289,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "futures", "futures-timer", @@ -8305,7 +8306,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "fatality", "futures", @@ -8324,7 +8325,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "async-trait", "futures", @@ -8341,7 +8342,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bitvec", "fatality", @@ -8359,7 +8360,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "always-assert", "futures", @@ -8386,7 +8387,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "futures", "polkadot-node-primitives", @@ -8402,7 +8403,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "assert_matches", "cpu-time", @@ -8431,7 +8432,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "futures", "lru 0.9.0", @@ -8446,7 +8447,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "lazy_static", "log", @@ -8464,7 +8465,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bs58", "futures", @@ -8483,7 +8484,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "async-trait", "derive_more", @@ -8505,7 +8506,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bounded-vec", "futures", @@ -8527,7 +8528,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8537,7 +8538,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "async-trait", "futures", @@ -8555,7 +8556,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "async-trait", "derive_more", @@ -8578,7 +8579,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "async-trait", "derive_more", @@ -8611,7 +8612,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "async-trait", "futures", @@ -8634,7 +8635,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bounded-collections", "derive_more", @@ -8732,7 +8733,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8750,7 +8751,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -8776,7 +8777,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8808,7 +8809,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bitvec", "frame-benchmarking", @@ -8902,7 +8903,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bitvec", "frame-benchmarking", @@ -8948,7 +8949,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "frame-support", "polkadot-primitives", @@ -8962,7 +8963,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bs58", "parity-scale-codec", @@ -8974,7 +8975,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bitflags", "bitvec", @@ -9018,7 +9019,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9128,7 +9129,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9149,7 +9150,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9159,7 +9160,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9184,7 +9185,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9245,7 +9246,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "frame-benchmarking", "frame-system", @@ -9942,9 +9943,9 @@ dependencies = [ [[package]] name = "rocksdb" -version = "0.19.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9562ea1d70c0cc63a34a22d977753b50cca91cc6b6527750463bd5dd8697bc" +checksum = "015439787fce1e75d55f279078d33ff14b4af5d93d995e8838ee4631301c8a99" dependencies = [ "libc", "librocksdb-sys", @@ -10001,7 +10002,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10087,7 +10088,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "frame-support", "polkadot-primitives", @@ -10334,7 +10335,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "log", "sp-core", @@ -10345,7 +10346,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "futures", @@ -10373,7 +10374,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "futures", "futures-timer", @@ -10396,7 +10397,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10411,7 +10412,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10430,7 +10431,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10441,7 +10442,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10481,7 +10482,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "fnv", "futures", @@ -10507,7 +10508,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "hash-db", "kvdb", @@ -10533,7 +10534,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "futures", @@ -10587,7 +10588,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "fork-tree", @@ -10623,7 +10624,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "futures", "jsonrpsee", @@ -10645,7 +10646,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10680,7 +10681,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "futures", "jsonrpsee", @@ -10699,7 +10700,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10712,7 +10713,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10752,7 +10753,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "finality-grandpa", "futures", @@ -10772,7 +10773,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "futures", @@ -10795,7 +10796,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10819,7 +10820,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10832,7 +10833,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "log", "sc-allocator", @@ -10845,7 +10846,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "anyhow", "cfg-if", @@ -10863,7 +10864,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "ansi_term", "futures", @@ -10879,7 +10880,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10894,7 +10895,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10939,7 +10940,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "cid", "futures", @@ -10959,7 +10960,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10987,7 +10988,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "ahash 0.8.2", "futures", @@ -11006,7 +11007,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11028,7 +11029,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11062,7 +11063,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11082,7 +11083,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11113,7 +11114,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "futures", "libp2p", @@ -11126,7 +11127,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11135,7 +11136,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "futures", "jsonrpsee", @@ -11165,7 +11166,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11184,7 +11185,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "http", "jsonrpsee", @@ -11199,7 +11200,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11225,7 +11226,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "directories", @@ -11291,7 +11292,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "log", "parity-scale-codec", @@ -11302,7 +11303,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "clap 4.2.3", "fs4", @@ -11318,7 +11319,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11337,7 +11338,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "futures", "libc", @@ -11356,7 +11357,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "chrono", "futures", @@ -11375,7 +11376,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "ansi_term", "atty", @@ -11406,7 +11407,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11417,7 +11418,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "futures", @@ -11444,7 +11445,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "futures", @@ -11458,7 +11459,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-channel", "futures", @@ -11939,7 +11940,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "enumn", "parity-scale-codec", @@ -12016,7 +12017,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "hash-db", "log", @@ -12036,7 +12037,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "Inflector", "blake2", @@ -12050,7 +12051,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12063,7 +12064,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "integer-sqrt", "num-traits", @@ -12077,7 +12078,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12090,7 +12091,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "sp-api", @@ -12102,7 +12103,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "futures", "log", @@ -12120,7 +12121,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "futures", @@ -12135,7 +12136,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "parity-scale-codec", @@ -12153,7 +12154,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "parity-scale-codec", @@ -12174,7 +12175,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12193,7 +12194,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "finality-grandpa", "log", @@ -12211,7 +12212,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12223,7 +12224,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12242,6 +12243,7 @@ dependencies = [ "merlin", "parity-scale-codec", "parking_lot 0.12.1", + "paste", "primitive-types", "rand 0.8.5", "regex", @@ -12266,7 +12268,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "blake2b_simd", "byteorder", @@ -12280,7 +12282,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "proc-macro2", "quote", @@ -12291,7 +12293,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12300,7 +12302,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "proc-macro2", "quote", @@ -12310,7 +12312,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "environmental", "parity-scale-codec", @@ -12321,7 +12323,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12336,7 +12338,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "bytes", "ed25519", @@ -12362,7 +12364,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "lazy_static", "sp-core", @@ -12373,7 +12375,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "futures", "parity-scale-codec", @@ -12387,7 +12389,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12396,7 +12398,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12407,7 +12409,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12425,7 +12427,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12439,7 +12441,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "sp-api", "sp-core", @@ -12449,7 +12451,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "backtrace", "lazy_static", @@ -12459,7 +12461,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "rustc-hash", "serde", @@ -12469,7 +12471,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "either", "hash256-std-hasher", @@ -12491,7 +12493,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12509,7 +12511,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "Inflector", "proc-macro-crate", @@ -12530,7 +12532,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12544,7 +12546,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12556,7 +12558,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "hash-db", "log", @@ -12576,12 +12578,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12594,7 +12596,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "futures-timer", @@ -12609,7 +12611,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "sp-std", @@ -12621,7 +12623,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "sp-api", "sp-runtime", @@ -12630,7 +12632,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "log", @@ -12646,7 +12648,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12669,7 +12671,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12686,7 +12688,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12697,7 +12699,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12711,7 +12713,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "parity-scale-codec", "scale-info", @@ -13035,7 +13037,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "platforms 2.0.0", ] @@ -13043,7 +13045,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13062,7 +13064,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "hyper", "log", @@ -13074,7 +13076,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "jsonrpsee", @@ -13087,7 +13089,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "jsonrpsee", "log", @@ -13106,7 +13108,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13132,7 +13134,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13142,7 +13144,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13153,7 +13155,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "ansi_term", "build-helper", @@ -13280,7 +13282,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "frame-support", "polkadot-primitives", @@ -13670,7 +13672,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13681,7 +13683,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -13811,7 +13813,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" dependencies = [ "async-trait", "clap 4.2.3", @@ -14745,7 +14747,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bitvec", "frame-benchmarking", @@ -14837,7 +14839,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "frame-support", "polkadot-primitives", @@ -15339,7 +15341,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "bounded-collections", "derivative", @@ -15355,7 +15357,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "frame-support", "frame-system", @@ -15376,7 +15378,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "environmental", "frame-benchmarking", @@ -15396,7 +15398,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81da250ee159e73fd3c1f3641193ab5c3fc8df60" +source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs b/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs index 27a16a6357e..f184dfd4ff8 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs @@ -18,6 +18,7 @@ pub const CONTRACTS_DEBUG_OUTPUT: bool = true; parameter_types! { pub const DepositPerItem: Balance = deposit(1, 0); pub const DepositPerByte: Balance = deposit(0, 1); + pub const DefaultDepositLimit: Balance = deposit(1024, 1024 * 1024); pub MySchedule: Schedule = Default::default(); } @@ -36,6 +37,7 @@ impl Config for Runtime { type CallFilter = Nothing; type DepositPerItem = DepositPerItem; type DepositPerByte = DepositPerByte; + type DefaultDepositLimit = DefaultDepositLimit; type WeightPrice = pallet_transaction_payment::Pallet; type WeightInfo = SubstrateWeight; type ChainExtension = (); From 7e59781c5883eee7648a0c49715765d0fe0c9bf5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 15:51:51 +0200 Subject: [PATCH 142/339] Bump actions/download-artifact from 3.0.1 to 3.0.2 (#2485) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3.0.1 to 3.0.2. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/9782bd6a9848b53b110e712e20e42d89988822b7...9bc31d5ccc31df68ecc42ccf4149144866c47d8a) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release-30_create-draft.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index d481b42902a..6f9840c32ff 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -131,7 +131,7 @@ jobs: ruby-version: 3.0.0 - name: Download srtool json output - uses: actions/download-artifact@9782bd6a9848b53b110e712e20e42d89988822b7 # v3.0.1 + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 - name: Prepare tooling run: | @@ -251,7 +251,7 @@ jobs: ref: ${{ github.event.inputs.ref2 }} - name: Download artifacts - uses: actions/download-artifact@9782bd6a9848b53b110e712e20e42d89988822b7 # v3.0.1 + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 - uses: ruby/setup-ruby@6cecb48364174b0952995175c55f9bf5527e6682 # v1.147.0 with: From 2014997cb2c9ab7f4953583fcab2f0502672241a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 15:52:06 +0200 Subject: [PATCH 143/339] Bump chevdor/srtool-actions from 0.6.0 to 0.7.0 (#2486) Bumps [chevdor/srtool-actions](https://github.com/chevdor/srtool-actions) from 0.6.0 to 0.7.0. - [Release notes](https://github.com/chevdor/srtool-actions/releases) - [Commits](https://github.com/chevdor/srtool-actions/compare/v0.6.0...v0.7.0) --- updated-dependencies: - dependency-name: chevdor/srtool-actions dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release-30_create-draft.yml | 2 +- .github/workflows/srtool.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index 6f9840c32ff..8e821ff2f4a 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -85,7 +85,7 @@ jobs: - name: Build ${{ matrix.runtime }} runtime if: ${{ github.event.inputs.release_type != 'client' }} id: srtool_build - uses: chevdor/srtool-actions@v0.6.0 + uses: chevdor/srtool-actions@v0.7.0 with: image: paritytech/srtool chain: ${{ matrix.runtime }} diff --git a/.github/workflows/srtool.yml b/.github/workflows/srtool.yml index 8ef2a8815c0..3c6ae2ffa03 100644 --- a/.github/workflows/srtool.yml +++ b/.github/workflows/srtool.yml @@ -60,7 +60,7 @@ jobs: - name: Srtool build id: srtool_build - uses: chevdor/srtool-actions@v0.6.0 + uses: chevdor/srtool-actions@v0.7.0 with: chain: ${{ matrix.runtime }} runtime_dir: parachains/runtimes/${{ matrix.category }}/${{ matrix.runtime }} From 1e83f6eb06585deb97ac13d987bdfb7da8ffff84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 15:52:17 +0200 Subject: [PATCH 144/339] Bump actions/upload-artifact from 3.1.1 to 3.1.2 (#2487) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3.1.1 to 3.1.2. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/83fd05a356d7e2593de66fc9913b3002723633cb...0b7f8abb1508181956e8e162db84b466c27e18ce) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../release-20_extrinsic-ordering-check-from-bin.yml | 2 +- .../release-21_extrinsic-ordering-check-from-two.yml | 2 +- .github/workflows/release-30_create-draft.yml | 8 ++++---- .github/workflows/srtool.yml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml index 0f7eca82107..5a7d695ec98 100644 --- a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml +++ b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml @@ -79,7 +79,7 @@ jobs: continue-on-error: true - name: Save output as artifact - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ env.CHAIN }} path: | diff --git a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml index 78add6fc75e..7fde56ef1b2 100644 --- a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml +++ b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml @@ -108,7 +108,7 @@ jobs: cat output.txt - name: Save output as artifact - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ matrix.runtime }} path: | diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index 8e821ff2f4a..00103569477 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -99,14 +99,14 @@ jobs: - name: Upload ${{ matrix.runtime }} srtool json if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ matrix.runtime }}-srtool-json path: ${{ matrix.runtime }}-srtool-digest.json - name: Upload ${{ matrix.runtime }} runtime if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ matrix.runtime }}-runtime path: | @@ -189,14 +189,14 @@ jobs: - name: Archive srtool json if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: srtool-json path: | **/*-srtool-digest.json - name: Archive context artifact - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: release-notes-context path: | diff --git a/.github/workflows/srtool.yml b/.github/workflows/srtool.yml index 3c6ae2ffa03..3ac4ff8be55 100644 --- a/.github/workflows/srtool.yml +++ b/.github/workflows/srtool.yml @@ -74,7 +74,7 @@ jobs: # it takes a while to build the runtime, so let's save the artifact as soon as we have it - name: Archive Artifacts for ${{ matrix.runtime }} - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ matrix.runtime }}-runtime path: | @@ -112,7 +112,7 @@ jobs: tee ${{ matrix.runtime }}-diff.txt - name: Archive Subwasm results - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ matrix.runtime }}-runtime path: | From 44dfcaef680424455e0c47e1b85e530cf3c8674d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 15:53:12 +0200 Subject: [PATCH 145/339] Bump actions/cache from 3.2.3 to 3.3.1 (#2488) Bumps [actions/cache](https://github.com/actions/cache) from 3.2.3 to 3.3.1. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/58c146cc91c5b9e778e71775dfe9bf1442ad9a12...88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/fmt-check.yml | 2 +- .github/workflows/release-30_create-draft.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/fmt-check.yml b/.github/workflows/fmt-check.yml index 1bd6cb94b3b..6c7a5f3f910 100644 --- a/.github/workflows/fmt-check.yml +++ b/.github/workflows/fmt-check.yml @@ -23,7 +23,7 @@ jobs: components: clippy, rustfmt - name: Cache Dependencies & Build Outputs - uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12 # v3.2.3 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: | ~/.cargo/registry diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index 00103569477..2ff64018252 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -74,7 +74,7 @@ jobs: - name: Cache target dir if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12 # v3.2.3 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: "${{ github.workspace }}/runtime/${{ matrix.runtime }}/target" key: srtool-target-${{ matrix.runtime }}-${{ github.sha }} From 6524f14742f06b4ef3ea703967db0beea5a12b7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Apr 2023 00:50:53 +0200 Subject: [PATCH 146/339] Bump h2 from 0.3.9 to 0.3.17 (#2451) Bumps [h2](https://github.com/hyperium/h2) from 0.3.9 to 0.3.17. - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/master/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.3.9...v0.3.17) --- updated-dependencies: - dependency-name: h2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e4966f412a..6f37a2c3bcf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4050,9 +4050,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.9" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f072413d126e57991455e0a922b31e4c8ba7c2ffbebf6b78b4f8521397d65cd" +checksum = "66b91535aa35fea1523ad1b86cb6b53c28e0ae566ba4a460f4457e936cad7c6f" dependencies = [ "bytes", "fnv", @@ -4063,7 +4063,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.6.9", + "tokio-util", "tracing", ] @@ -4591,7 +4591,7 @@ dependencies = [ "thiserror", "tokio", "tokio-rustls", - "tokio-util 0.7.1", + "tokio-util", "tracing", "webpki-roots", ] @@ -4673,7 +4673,7 @@ dependencies = [ "soketto", "tokio", "tokio-stream", - "tokio-util 0.7.1", + "tokio-util", "tower", "tracing", ] @@ -5277,7 +5277,7 @@ dependencies = [ "thiserror", "tinytemplate", "tokio", - "tokio-util 0.7.1", + "tokio-util", "webrtc", ] @@ -13510,21 +13510,7 @@ dependencies = [ "futures-core", "pin-project-lite 0.2.9", "tokio", - "tokio-util 0.7.1", -] - -[[package]] -name = "tokio-util" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite 0.2.9", - "tokio", + "tokio-util", ] [[package]] @@ -13539,6 +13525,7 @@ dependencies = [ "futures-sink", "pin-project-lite 0.2.9", "tokio", + "tracing", ] [[package]] From 56aa147284863f9a917761a826a12c8c81ae1be8 Mon Sep 17 00:00:00 2001 From: Pierre Besson Date: Thu, 27 Apr 2023 11:15:04 +0100 Subject: [PATCH 147/339] Add JSON chainspecs for Wococo and Rococo Bridge-hub (#2473) * add bridge-hub rococo and wococo chainspecs * use json chainspec for bridge-hub-rococo and bridge-hub-wococo * Removed unused functions --------- Co-authored-by: Branislav Kontur --- parachains/chain-specs/bridge-hub-rococo.json | 85 +++++++++++++++++ parachains/chain-specs/bridge-hub-wococo.json | 89 ++++++++++++++++++ .../src/chain_spec/bridge_hubs.rs | 91 ++----------------- 3 files changed, 182 insertions(+), 83 deletions(-) create mode 100644 parachains/chain-specs/bridge-hub-rococo.json create mode 100644 parachains/chain-specs/bridge-hub-wococo.json diff --git a/parachains/chain-specs/bridge-hub-rococo.json b/parachains/chain-specs/bridge-hub-rococo.json new file mode 100644 index 00000000000..999837a5a42 --- /dev/null +++ b/parachains/chain-specs/bridge-hub-rococo.json @@ -0,0 +1,85 @@ +{ + "name": "Rococo BridgeHub", + "id": "bridge-hub-rococo", + "chainType": "Live", + "bootNodes": [ + "/dns/rococo-bridge-hub-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWJCFBJmFF65xz5xHeZQRSCf35BxfSEB3RHQFoLza28LWU", + "/dns/rococo-bridge-hub-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWJzLd8skcAgA24EcJey7aJAhYctfUxWGjSP5Usk9wbpPZ", + "/dns/rococo-bridge-hub-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWPZLWbbDJzEXAHPuAcVssPrjQLyZK4nvvmV2ez6gy2FQ3", + "/dns/rococo-bridge-hub-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWKWMENpCNH7wBVQoHLwQoWUs6acAEmfdV694v9jCuJwYc" + ], + "telemetryEndpoints": null, + "protocolId": null, + "properties": { + "ss58Format": 42, + "tokenDecimals": 12, + "tokenSymbol": "ROC" + }, + "relay_chain": "rococo", + "para_id": 1013, + "codeSubstitutes": {}, + "genesis": { + "raw": { + "top": { + "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xf5030000", + "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", + "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x1094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe320676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", + "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x0a000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9050f9ffb4503e7865bae8a399c89a5da52bc71c1eca5353749542dfdf0af97bf764f9c2f44e860cd485f1cd86400f649": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95c7acbba5f59ca99cd7b8256f6342aa094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe32": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9867d04f5fd090d96ed68a6355487eb8a741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9aba72baede0a06ab63b4b66340fe145acc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c3e60052e92d2d3cfad167f41164dd110676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x04446272696467652d6875622d726f636f636f", + "0x365c9cdbf82b9bda69e4bbdf1b38a7834e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3a63": "0x", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058147c04de43c5471053205adaa403e5359022427e9a8f1ce9335b4e6262a8de34023299aa8ef49b82d21f60f545eb8f587da904aaf9ea6b0c0229d4198f28423ff92884fff66c3446ebe5b5dc02ccb76d844842f6967bcb2da59429c9fc11ed0edc0fde2876969bfbd61ea0fae894337f29deb1fcd428f7963b2ddaebdf76f6c9729d86fefce6fc953eb96f672729516f4e4ea36ec5a151d7f4965bfea351d12dcfa151577a74cbdd230d39034bf45bdf727763d91eb7627e59d081010c60c0cddaef0defdc01eddc1c76aeebf2ce9d03e2de3964777ec2a15373c73975232baa5ba1808927bd5b51c1e29df65ca71550d92b4da3a2b39b1a259d7d47a36ece5f696b9fe246737591444001b44c725e7a959b49faad4368fac42e2d87ee5ecab2f5e1b04b7bf9a3dff9dc86195dc25481891758018c1de9b351d84baf28b0e2a5d3348abe44410e5efa8e4eb9151010900a76a4df74caed487b99e47cb4ae4fd08354575f6a425bfbc4de1b4de3b097aaa8687cf66e858228fc0dffb00afeb08ae1430305486852d627d7a7bbe3d947ef5654b4bca94fec6e07fc4e391010d00976aebfa66fd50eceb0a28c2d4e2ce1053476e6b7d797da21a38931b4c4e00a3560b0d34e9d8f3adfdf69edafd339a0963ba731c420c4db9ae47ccff3ac4fecf465ae5177a6dcc3998dba964f6fe9d02f939c9f7e399ddbec53fbb5e5502d77df1e5da7af6d7efb9c9b7bd67800829f2ddb24e7a5ed811eb367779a0ed0ba3e3debfa34b9ad5077e31c907ed7852858b0842e84c1450facb0e3bc36ca7ae73a9d823bcecb3b2f6d51d92f0eefdcbdd4dc619f2fc540404040557638e79d9f3a05779cbb1bb63d35ca7bef3df6f7b8bb1d42014874c824e767dc7cde13a9a16209553c3bdc98e4c0678790f909fc9ed3b7b1d3d8753a467ffe68676fb3da59636fed35f316a8049179d27ee7bfe7eff97bcfcbbff71e74370f044344e18d6a6f3f35eac2eff69b46f1f71057526fa76fe8bf3bbeddb53fc9197151ddea044cbc5b09e1c6dfd3b71be0dd4a88d53b4d48d5e95aebb777f4774ee3e6fe6dfcd4f9a8fcf2657193ce9a9027dd690f50bda4ac11892eed8d1e9db646a47e74a7c13e41a7307b1b3f7d99dca2b3e6fa74699e9d52a7497b552ffd6d77467f6fbbf0a5eb347ddb6dc03fa74eb3ec0de22d7fdb75ab7f1eb7ebfa14c4931f9060e09f5fd7a76be49fdfb8c33fd77971736f6d505e993265c87cf4b7dd1c1e3ae5ec6dd0e3e6de693c582f3728d6477bf99f85c265ca9429f357f5cfe1e6fac416f6893de75d0d2ac97008ea6660507a0146dd488bea564208fd9def56426c79e759a778c7b9a9516e0544e69def78e7eec6e95087436577ee2e4a5da31c3fbb733a728d72b051edce295398b946b9bff31d93869c61459fdc3fe8cfdb9f26a4ad73a4216768d127f7ec6f73d0b22664f6e9b9d376709a90769de62250f7ddceddd6a9981f40d9791b6da92b20307fe1b74ff639dd4bb9c6b9f5d96f7dc8ecc3e3d7fc5ca7f9bdf71efb7bdcedf3dbda146987deec6d6ffb6be621ea6eae7f3b7506a8d4f9a8ce9f3b4d8873d67408020808488877d6f5e9ce6fa79db946b137caf5a95da7df06fbd45e800addd428f7b551ed348d7ade6e6a140b797003828697a29acf3e9fad4d1176e8ecd0faf03feb34216c2f3ffb4ddb1e7f5783ea311f81ba7737b77e3b9d8dba31e82853d96ff64d80cace037b8febd385cfdbfbcc0189c2601e884c4439e30d7e36e6a1580f4449cb44230804f4ec1c10f6fb7c36eaf2d3b74d1ef5b973a70d817d72feecec93739da69df1d69fad1e08a939205118e8a12ce0d9db59e3a1023d7bd628f7ed4e23c240cfaed36ebb69db53dfd5a06a6e33a86bcaee1a759db3757d72ee5cc55c43dd0a48cb3b4b87191cb4450a4c471074704147157480a1e3083a8ca003093a98d00103131a3a92304161fa420e31a628987460ca81a90d5317a62d4c3cc891851c5730f9c07486890939c098a4c881051317a6274c4c984e60ca92638c09c8348429099312262f98b8985c90438d1c6b98d830ad91838c494c0e2e98b0e4d8428e34729091c30939a290430b39dac8e1460e367298615a82090639d0303991a30a39a890e30c1d4b98ca301d614ac314035390494b8e3098ba6042c2d40213174c533099617a820905a62698be9864a0038b8e2c3a5c606ac2442607108e37705001c71938ac80a30a38c6c041060e28e0e002070c7064c1d1829a326acea8a9428d981a2ad47ca959420d1a3559a869420d19354fa881428d136a9250335483841a26d418a1668c1a356ad628a1512346cd156acca819535a8344859924665c308365a6053348cc1c311334c3829915cc403113c58c0a66aecca460c6ca8c11335566b498b9c18c0d66b298119ac162a6063357cc583153c50c15333498d93253c40c11332898a13233c4cc09669c9869622606334ccc4c31338319296670500243c90ba53094de289129a9514aa3748512154a6694c294a6503aa354841218a52da52b4a5494685052a294a554850406921ba42690be90c220f980d403120f485dd444819405090b520d4854907240e282b405e9095214a418909a2041419201294b6da3a251b950cfa86cd434ea98aa85ba856a468d422d83d4850aa664a532a102a17ea95dea1335a8fea04e516750aba852d42d3509b509d589ba443d4235423d6254859115465e4642187d310ac2a8cba88b110d46528cca184d3162c26806231d8c6c30121a61318a62248391969113a33346488c9a18c560c4c40806a325464a8c9218b9608465748449059717ae30949450b3006500a1c811c6940292136f09a630b109738c1c639888985098c0c027e815504b0e2bcc28e820c254055315dd048c024a319f30c9203191e38d8ec1fca243091314727ce17ae3022627b098eb0bd3096c851c5f74bcc084831e229892113422b4176830d096d098d0b2684d6831985e3c29b4222e2e9490601b8cda18b1310af33a960e24a0814846768412174a6c60403e91a900c70e70e800470cb226c030644b68321388c5682e605dae22a815b214e01043d242ba822444da41b442a442a741ad983f184d817ec1d6886a907420c1606cc433221a918d0cc434a01351cc43c233c23b82c5059c018d82b5a050684a68496030c05e80b5812181b5003b02c3820561593025b031d815485c2075b1cab40f2e2eae1d4c2bcc2a4424c4a1eb065307970d2697b91a5151eac2b5858e2de400c385c575459c42acc2b5859211b508389e30a18029e1624174422c238e3189d037c88c508a0295a2a68d9216a514583bd041657291a38c8983b6c11bd338c8a6c88ec894c892c86690c120ab4176456645b625a322ab22a341b64416830c4bf6043d23d3922191c92093227b4106459685aa41d1a0695031990b3226b216644d6451502d5406d48909842984ca82ba82aa827aa5a6a05aa946d42ab5884a444541a55287a827a84254a051995118466018bd31fac2c80ba32ed4b0510aa242748a3944e988984416d439b082404a43caa0060b39ca908050bac1d5851a2ed490916048a00886188658a68221a9c828bc21ba856641679069210343c6850c4c3685cc8d2c0cd916b23232333236b22c646df41bed056b8b55854583e78297e5257109411ac2758299c45c622ac14de02fef090c0b2c0798d065c4d5c4a5e58a01a58256416d60e1a04ec1dae2816171298d7191994d804d30165c83c6d22dc878c057d430318c6883782562118d8835882a8847ec5c6078597858802d786ebc2e442664499066d4a4419fa0341000cea88a3705090d1218a5301a08950af14b5ca375705531b77000dfc0d22286894be02c680d4c42e818c22485d945264492a22454dd2091e9d5f441673179d044bc351a05cdc5eaf2d4b8b2b884e217a616ad4546a5855e1bd91073073307f18de885de224a2142a18b6823a219f1092c4481fe417b51aa01c5628a317bc05f70170ee3b16129612171958951b07210c5288d99802442a98dd10e2250c2820722a51694b24840c906a52d2c6044851e37e40c6094456483f23ba6605cfd78a424e9c0912749787e387284f2f3a109cf9123d80c43f48a70017f44703ef848e1e9c091254f7e043e3a3851e244899309f81b8292234e3cd0840813264e18e0a384870913270c18c0f3e2a4305992c487c787233c3c1e08c0138273e281264b8e8c200a4f08a01c59f2e47d9af0806004498cf8fbc2f12869e2a4c9912447963c791e254d9c44c0a749089c2851f232bc20f8e044098f0f34bc2e4eca08787a8e489132029e224d9c2c9122858702db038213c192271f85a7278a930bf0b0bd1f381e9f243e2c61920488233c21e00981047af081e7031f48d2c3009e174e4a8f129e1f94ac9c149f263c51787e68b2c49f0f9a2cf180cdeb8153b2444a9325517c82e0393202264f9e24391285c707264b42b0d3a3c409939d1d8f070e044792f824f121890f0f0448af0b122c61926489cf92264b6a1e17ae478913261d38c2e31302253c41f094de0e5c14270cc89e0e9c149e253e4ba238f9c1270449661e17d7c4c9129f245142e0c3111f274ca41c59f2e4934409c1d738e661d281243e4d42e081233e4a78a22cf1a1c99223477498a2189610d2107aa7a26e0504f4ac7a3a646c23b6c14fd882fd80eeee2ef2802ed2458a38073cf8628c90488c2f5e177c44aeebbae2bbf8ba628c175fef45be2ebef8f18bf18a7cc1c7fca2bc5e64f8e083ce5deddc74ceb1bc607c13f275750dd735e77c31c2775df0718dfc1e33cf092184ef35bfc8f1bab81f062346dfbbb019dff562e42b0200c638291ccd292bc4e47b96b4a66318e38b1c9977780fce182fe678ddf07b93df53408c175fef001132bff7ae2bc6d8579c9323641823e478315f115e1cf9c5ed31e4eb62d8f0e218239c932f7eaea17bf0c10b5ed7f5dabd0b4e1a79609127e466eec8178c91e3638e70c22a27a4a38961d87b33c6eb41fade833087ab01734ee77a880e421ad00006740dd775f5752d60e75fd7007b5e577d2fc6f7ae4bebebe22b620f4248e183f0f105636ca8a3a3a3331ac537e79ccc373773c618218c317b19c705708c7c29c0547a2f26c026e3f7de7b345e91193ac733f29c1256d1837046f83ac6f9e0285ef1697c5d598ccc30d640b318e373d8151983cee510c48a310241c0cd8d0d31c686ddcccd1ce37bf1c118df631b62b4815f06bbce39e984901fc3031ce047ea00117580c7b061c337616417bb06f8e27c2fe27019a0e6c5181fd4205fda9cccac65314677c5f71e5f1733337c36f08bf14118e373570dbd62bc1ec308b58c7d3c2ec093cc1c737a3c86910004e0eb7afc2e1b183233bf78457e31be17af2bbed8313ed80f42082965e638e79cf34d0863adb0560823a531be37279c70cef7e09cf1ba9c73b4d2ca19648b99f98a6c03338691de63e6680347e6c8968b3630c7c7f4d5c073ce095f8c93461e3346e72e1a775d2e464c745dd7753d1be28b2fbe1b3872cda4939b420ae183d78bcc7c0de0451640c4e119b22cf28cf1bdf74e91497cc5c801883102200200002fc678c5eb8afc6cb8ae8bafeb8aef45e6ebbaa27331c699f81e8c30c6c8cc51cbe6e39b37e38cefc5c910c21923adc1728ceebd075f8c103e1863840f42f8b68b2f8e9099afc8fc2264aef1bd08f9ba38f28b30be1863c422ecebc58b9dd361868e30cf7de089c2e3431427475007f0c1b3248a8f000250d2a1c5d0a324490798307122001a629861861974c880f9284922a54992283e477c968000044e4e3a2cc9a6d484e7c9932433b8028060894f931044b1240ff88440069e1f8ef8345912e5c9112552968060070e2819827022029f195007f021832bc00f1f0538e283a72709930e1cf94093253f4849f2831b80c9929e9c1d01b0713e7c9c3839c5e00a9084278a0e9e9e233e41f034b941c7070260720590e2236549103c02c8e17c04b1c4033c519ee494783e90248a131f29477c60b2e40725477c9884208907787cc0c17ca224f19112001f35e0f0491285a709cf07a248b1a1c6f9f081478a149e284f40e044c991283c403851c213e54812293e28e13952801ed4017c3c51c2232565fda0c42749078efc20654993251e38d18cc0034ba2f0007104010538c0017cf8c073c489cf931144515283c58407081e2647824802021a663ee084c9910f3459f2810f3861a2c3816006e6e189e28123519cf82451e2840993243b4a3e3c521c88263c8fe40a70a489932552a2f00071244a121e264a8e04c1e3439325479a2c49f283120f78c0c9119f20782c104d785ec9f508a23801010f0824104d789e00b41f3454b18644c52ab654a31f88c4613faaf87e543f51a58a2af9e3543f3f2a5554a97e5492fea8e0cfcfcfcf0fffa8542a0c8953fd3412e790b89f9f9f9f87e4877f18898a7f1889fbf9f979aa9f9f1f88e447c53f3f8de4877f7e7e1e1215ffa81ac98f8a55aa87c4fdfc3412f7c3489cca42e2541389bb90fcb08a91fcf08f4a2271ae91385544a2628744c5ad82489c8a552ad543e2548c44c52a46020128869d730c0229495c42eae620b665fe523b1a87fd796dd49bf2d2e336adceb3e2c6650bee113dbad479f2aa5eba9c1f56d158ba8115cf47bc5b1d910552cbdd5feebc6a9aa65975ebb9d2a7ff484dabf5726b5ea6d92e19338de434b5d2d44ae33a8f4673d2d623a219d5ea3434241a2769a45a5da7472417899ca6926834796be04c69546355928b68485ee10c2c4152b52388b9e5222ddb32ad087dcc5ee997dbb44f2bb9878cec96109010f30278b742a28ba7a396a2ade75a0efd275a2492c7a845d748d6bcf02304584aee8139f6444ed23492a6915ce79130176d3d94a4694e2289482ec29c2644b350de6baed3d9767fbe47e4d449aed39afbf48b18bb3ed139662e899c92ace6ecaeabbdf37b646ffd1659cc33fb9c6e927b60d736ed7d125b433cfadeb322cbe21759ee5ea71f94f796759a0eaa9f4ea1b5ddfaaa29ec224bc42eb25ce759db6d377aa2bb674b64afea456e6d4c2da7ad86c84279cf1010b973276a3141abf7f16e1574e5882aa220324143221175aa39f52b72a80de9b1ece50cf36b12892e0cbbae4b24125d4edaea36da32ec325538e1e4823674db739f7e76ca1b75da1076dbad9dcdc78e5f6e3d50a6fc74f74e23f2f8a77477e1fb65ebec6d31ff9c0557de005f58f0060bc478fa34cb59d0e503f06ec502269e7626352196b396f5c9b9b5d1f4c959b7bec8afe92d7b33bfac3f9cb623eb1e0eb5eee158fe5222ef915b5e2d7b9d549d52eb5eaa44f2e9a5cd399c696ffde99a9336e770eae61cce689b2eda9cc3d1ec9d6fb93e5d9b8e3235b33ef1adcba136e4aa7a30ebfc6c0fbbe5b208756825f7f889aaac65104a5917d915a8e53250103426c6c2591a85f9b5e3af4d73cdad4d3e0fe279c9e923517a7577f74c47bbafabaf2cb3c2419a4691c74c945d792bc668af77fb8dd1c6d8b6e7f2e931c62c66318b5996f69f8f1d639605c5d8d995eccaaebcf469396c94c82db7fc5a96c51c94b9b482b02266c5f052413c9ce73183efbd2a342f468f31ab62756757b22b8fb9a6b58f4ad87b334ef3620d8da8e49af52ccbd6bc2c8fc65ef83cb352b299154c0896753167c74cd379a26de4d9569d6e986b9bb6b9871ec44bbd2a4ce64d8dea77ce4c342a0ee91f417f555eea657938b0ca4367276d3cdb6f57f9b69a3635bfd9d3ceb268fd159db14b8bae396b44d8a36bdb856f4bd0437f591ebc2f8b65bde622bf5ce531cdb3a959ea9623f377bee6f76d79e875737dd27cb4c13e69f6fa586fb9c83a2dcb2ca736b38209c1b22b7f5996656556b887845a720c31e22eaed01dd772d7524a19dda77b3a9332caacad0dfe45a3dfc957a46bd997e5666da6a799526e961ba9a6743b5769ce3221ed86704e0efa2b7b7a569bc209490e2bc9de1ed93b67f7f4cc6166d9ca8439d531081d4297ce5564375f89975bd6a83d1b5d985728bdca9163d29fac98652bd77571174f6736e7ccdab21569c92d3add2ed7792c9dc28cadec60925dd012f9f3971259d7dc350ada76087ba04fb7a0335b8197c7975967ccadcc1f93ec395bc12c5bb9ae8bafbc642b6ef5aa16661a0b87793a72377487370a73a9b5b58d9cb791bb97aa24cfde755dd7db7a26bdaef72e6a85835c6e959e4f6a6ffff4e761de72d7a99c9eed9789ede7d3fbba69547587a9a658d2e2317fa5635bcff52cab31768cc5b4d5d35cc22c7b39cc4b7f6ed9cb24bb96f52cbfafe15b59fb856dbc592fe7a55ce6d49d4b4dcbd97bbb3ecfaa2fe5222711616f76cc2de72a1ca4ddeaeeebd397c33ce6a34da40d99f1b63ded976b33dbe567cb56b807465dd496d7584e9359334e2d87568dbd90a67d06d38460589ebecd7df77b5bc37f5bf7ec2a6f8d5c6e5dda308f9be67eb459a38e0e335b5f2a5a672b224b8295a75ff897dffa97bda6ed691ff965e5a651edae719e3fcb24fbab1d832e15df5fb6a7dd72cceacb5ebee252d12fb6e2d7767ddeb75fbe321dcb612b4cb267bf4c32f898c7f01e5f79cce5c85e8e392387237b99647fb9c8e15c9fc7575e3a5be1204c2d5bc1308cc3bcd5ddddcd567a8b9bbb81f38755d60fab38ce44e1bd2e0fcba5b93beecd0d3959fbdbdae9755d17dd7a46f3ba28b5b9e6f4c1412e1dd44773441f162439b82e33daebd78decb687fac8a35f3834aa26272727e769b968cecb42af4b87e5d2e91d3d2c2fbd218490edeba7ec77647dfadf83fc600ecf1787e7cbbada2279299761d35da36218591f71bb36f6b2173e5b9b918b6672aeebda3c2c6f79f7e5837b5834a51a9f0cd7c6eef00b9ff7b08dd30733884119ecc561c7b3b13e5e97a77434dadc534a4797f591d3316c9aebe076530e1cd67d7090abc6ce589215c16b527b71f8cb6d4ff491533b7de080430eae8b03839d2dbda8bdf0251d591f74bb3e0d21843ee8c8457e7178cb63a02338a22387233882237b45f6e2005ddb5c9f321f3e1e161f0c1403e7b80193a1d14b6b79e8d4b5c94f3932f8fdb1c3af5bd9b874e7336b94e59037ea6fa3ee9c86195ce432f80eb7b9ba9bfdda7a34acfbbab875fad9ed46cca3bdfd9a63f6f65faed371bbd14b8fc9ec76f935a77edba38df672cda3df1aac53981969540ceea2adaf9a125f8c62fc956e6d3dd67f3ebe6666f8d12d871ce4b97523187f655b7fa84db6cbeb452f2fdda73fb2c8899cc8d95eebc1071f9ccf2fa79c991e5025d363ecb55c3a841046b7d6dfc6dbb57885653e72e7dcd1e066700e02da8bdb6d6baf469aa9c171ca9163faa183c8f3e8f179b462c7cd7d47bfd18bf41bbdbce574136943d8a3ed896e9ff326b987e5aea9346bf051666fbd712cdac0f675d698539d5a721b68bc811e74f76eec9d23fbeced5883e58891797a45f9dae6fe8a51b3cfa96fd2b7cd724f37f6b9d1a8e3f6ce8734d85b1fce60afc965b0f7f47087bd3936f6fe78e83a2fc540d4af1874d8fb43b3f787c9de9c9c1cf69efef20987bddef67a8dbd269a195b82b6c20bf33bbdfd6ade9748241261d445f64e17f9d5ecf59f96762639887423cfa3bd2d668ef9d8643e3a7c401fed954efd8a9c2feb13bf27bae5ecf7b29cc6ce44229128bac8592342ade41e9747176d77fe656da65b2e9d815e8a570f07fac8ef8f9b73d2fcfa3589fc56a087ceab976aa087037d64ef8fccde9c1374cd5e17f1eab2abcba55f918f2c6a7de253bf22eb135fe499dff9964b6d08bd1cf3a8f1903d75e723db4050b33ef12fcf64033da4976356720fa809b1a2976b8b3faf4dfedcdcc718af2dc29f5684b6a7b558f629d8f965c1e0b798e7f4669abbc9cc718431479f3362b6c78dbc3ddbe0cbcdbd6b94487210e971b6988feed30f1f3f7e3ca753cee6ac95a18ffcf28f7ce29dd996fd34f9e91dd77ebc61de1be68e5447d066aa29d0e774087db61b9f6d3d96ff3c74a239e176e1c3cc210769cfacce83db6d3532e729b23d995b33deaed392834c51431ab79cc6de6e31cf247be7acf6d63ab2d7f4ef39b456e616745a11cb4aeec1de56a7212379299dea2592d30bda4b04ba831c04ea3c9d863acab498e9d16f8b79e998a60d6187b607fac83396dc43ced86b225548a2d5b192bd93da5b2dc95e96a1d74b13225f96a7308370839f6d105a1b7f6b44e88f207cf6a90d69c73c6ed0798b2e6ac94122cc61e9ec937686f9bcf5df730d42ea96bda6cb317b2be6f341482d3bdd693c6456720fcda1cfd7ac8de5d2e37313b5d774d95b1fb3d3239639f53b5f62de935d58e62f7bd9cba8bdf3e373c941b0cba53b295bcc33b4accd3d8410424b5ac93d227c25a6c9c10a803efb92b7971578f903bc5bad20e8a91bdda0ba950ac0fce9dd4a055c9ebad118d5ad5430e6e933ccf20cf4d1a97bcefda5aa8fdc794ea330778ec38f4689dc790e8da2ee9e734ab14de4da36bd3791f366d5d0949e1023d5296d7be176eb63ed184bc7da31769dc73e0db79ecc7fbed9dd85d9ab7acc79bbcc42ec506297d569a7f17039bb4ef3161c0473d933deee341e2e7bfb339fb1b71fba4ef776619697de6db1edf26757caee6eccf640cf1c734a5fe6b421efafb417f676ebb7a59af2f3d2d9365f13fcb7ebbcde2e8ce2afe53edd83f9cfcbedbe6f6f8dc87bc8f6aa9ebd5d6e17bee5b37d5ad727e93a4f6e1732f1d782f2feb24eb7c6c3edc75cb3faa15f9ffe76667b6196b7dca1b3b55ee417f94586ec979d8b48c72e3fe6bdc1396bed871321904987de1b744c5a9bcca75b335e4353b2d7048176692f9176e9d259e3a15d3a0b356a3a3b6bc141a433e63aefb17e797dfad92dbf30cb4f176d551b5272697ba4633e2a6d97bf67c969ec35d1788dadf1192bddf2d97edbefcc9c226d487b0f6b1a0fd9b72361afb13496ed4cc9b6f49979790aa3fc6c730fa553cee4061f6ed29dc643cc30c73d2e6bf1ec521bd22e726b93aef3b42df3dedcf366b968c3fcda46feb6ea943391b42ce40f27baf43bdb6f9d7e4d6ec7b94ea34813703bd5fda57444cea669afa9edad7f7db2c697f39c736ab647bae8b2976967bc0507b9dc28e824772ff59c64297c2addc2dc8a210621aa4f7c6a7ba44fc79c3a656666771a04a663f6326f94763667add7f4b37d4a9fce1a1111bbf4b95de6f26c6d2ecfdc729d9742f270a29b4cb53e9c3baf5b4db73cdb207c915b4e7de2b35f9ff822d7fc3297a75e37f770321f6db34f99bd3ef0a75b3eb521ec3d227bf9a7676e693c64cf8e44e473d617f9adee995e64af4ffce99abdcce52dbfa6bf0ecc47e72d3808db2b45f5d333a7ce42d4a52684c22c8f6dae4feee716296773937f6deee57647f0d2a9e36ed12dc1cbb9118973837f6dfc4e23427f5ade827b5876de44dbc340f18755f4e9c8628b0863b48e1d1a91823bd1dd01e1e82e6e333ab37ba93b3fc628f431460bc0d2bb959526de63821516f0ad5f4d5feca0cb173af852c20184377fa16572733d7b687ab8b262c443874dc40e749a46c187f632b9b100c4ca3c8e33de122a7003fb89ece072853037aa1b10714613426cb9c1099ca8495c113dc10722161431c3a8f24695202351c62863fc68c4958f313e60c7bb95113978f96e654416af7b60c4131050e9c0064f088d41260b59b06224050a2a40a10321b8c0024804a5489121d48bcd1486105599c1156e4c81822e37d08aa042c465be5b55a97206116150d085216e1534c6102d78c21a3b784256c41257114f5469c04f186c78a10432c23481099408376a8a3022a801dabb55115ff8fa6e55441a71e46eae5bbde5d46942a0eb943f1ccb9d3be837c6f6e8d7df8a7ed3272be644772e95e3702c8ff64af73e59d2af17197d8f3c354ada5b5fbae5cea59cc3b9f3ef4c55876339db2bfdd427cb79f33e591eb79b3e592ea4d6777ffd2da7ac15197df49bd8766db38aeadec608957676d2f3db449f9239e6d3a79d42fd72d5ced38418a14205f3ccae9ecae5d4ea3c1ccbaf0ddb726ca25357edfcb089d64602985fde03e69747bfec942ba2ede1726aa7b88773d9fa702c9f623966ddc351eda8762867d8e676aecded384d8891f9702cb7f39aa8d3f1887e391ed11f4e1ce27e66988eb001145b38c28b326290a023084b6071653a530cef565038e14d4474992e40598050a68a9ca7a3fbe351d0e315a425650e2e4d5041852b4284a1821d697ad905480c22221bd39350c2dfd3c306507105115e90420b84286327471249789863c3bb55125624d1c4ab82d2e4000710413002195b44f1052fd4a8d922d3421857f82214060aa2586387e6db2b176d8b2d9a17665c19217c41074f7cc1811156250a0c418526a0f0051486cc303d1df1cb1d20613344ad54e8a0c277ab2d33f8620b136e0b125672b81945476c29620a32f3a74843053456a89914445f6a1686985a81a0415173bc5b4d6185363485135f98e28a288a9abd5b4d0144a5522d9ca06a6266008514601fa3356953a8a5226854d4192e5a97aac3099116ea7cb79a81125ea834ef563318620755db82288baa9de1838a230c0d8c5af36e25450f9e5d0b2345160fffd27c0cc478084dafd33a6dbd5b49e1c4d3772b2966c0ef02833abfed93db32003ebfd0297410429215aaf30c3274370d043a6adf84d030830c3b6c62d061ca81a38666a644aa23919651ec9a968cf0b5e3e1dc69ec784cf15ca79f750ee78755dd0d05db0577dece73d6ead83d15b309de7bce9db3bdcea343bfcf79f4e7bc27bef7de7b8fdd60081d240d4183893eb9870e420821842e1fa0aa62628c3146813a7b2bcaf965777d82f0b9c8fb1e9ed1af742a37d21a955d7a7b8fb4b0af356afbcdfe79d628b6cfe3f5e130628c1c638c9165943c885018a28a1899983eca18e3c90d687a5d9031b2e4286315b20a7690baec6942e6b4dc8c72ab945a597bdc3a46ff087da08ccdd64968696050d9db69840064ce818c31c6d8128d880de179818e4838b21a9a9912c5449a55d1c8a14e63ef297b92390ed248a459cbfebcf11604687892b3d08f1f7f598886856684dcb930247b554cd4983907bd140b056936b377036f0909090949cba2e10b0a90462c76216ee08a579c0223bc8147c418a5452dcbb2229417658cb1e59718e10fa8344566961ca5acd6754d97d1a55b9b8e32d5ca78801eb767c9689d8c02d484b4c74a63e2e2bd1a7dbe146592c3464637ec9a394f6a4e0d154ba022a755b31f1a51c32e2b9352ca2cc78218986f794e8c393127e6408748a28c70e86a18063fe7676196216a60597e39205726860a11393bd319203a95e944f80e86619b740688f3a7ffb2d1f188f223e4180f10a740192d695931ca18e1eb0295103ecbb24e6e534a8a5d11c94b8f598c6e410b2d4b7abbb44044cb7ff1cbc2150e838cf249eba03f971b6b3c3c8f1bfca8ede01edaa815e167a1bc76c84c067d51c6274f10e573e20443f018b94128b9bb9bdbd91d3b37c70dcaeb7663ac29ba315ac8aa1806ead3632a3da8ec9781fecdacb61bf31089288600dd98313289d84988cf0bd2c5b893cc5e4ec1913388c924cb6a8fb19c34598e8cc92491b84fa4a14c99320c44b402b61aefdc706f7c741fc8108394030ef7861d1f69b2d413a682464e4d0e4d4ec95e3fbd7492bda79c1f3f9ed4919d19c598ca4717e6a3ce4f77a7e8ad1171ab9f7e33a5642a169837580099ca0c5b4f3808ed0e9363e64bf352d2c7ce39e8cd346ef465f14191733cda755a3ee950b75ece2e55cf987334fa5be3477b723c9e5f639c1c9cdc4d13bf20a57c334a29e5137266d5a5c14fc627af886058b18ae2e963ce47bf3f7ce45b2ec3e0864e257b73fed61f3f30eaa2cb5eff5b359b994cd45ef39a975fd35f3eadfb482983a0ca7ab10ce8c06000c2fa736372fa5abdc213177ef4e9b9297a5f3dad1ca0a8ecf7c73f787a07c606b1d278a4eccfb04617239c9dba3cc678851ae315a3cfe8d1278cee1ec218618c568c31c2087de0476fadc802ca9429f3113e7cd931896c8cbc529f4ba12f482c767cb4724545aee44a0a6919da2285b2316d46850e88f468afcf73a348bfb4d0f190120a913eef65993265ca00f11edada57a0816d3a3d3343e9dd34df6deb06e5c18f424cd701896ed19c214dace5f4e9b9096ae63767f6e97db4d0f18025b02c861f9fc6004b80510548f33072b4a22628042b6cf5d0a5950a1d5b5d129088adc080f980001f2d36e4783c6f2c2afbc586f82f3684ad5c194020025bd504b580ba9b8b8df9e73e3b831b7cd1f21bb73c8c3270718978c4438f46b8548d557e08b531e7bc34bc74abc62a7fe30f1dac8f16f3e2783c7f67c41536040767e41e78d18338067231e598216def13faf6f8aefc0b7a8b887c28d6b3758ec77d55a00e353ff4d0de66f2841ebabc34623cf41eb26ecc135a838c8f7e697ae8ef5be980e3a595417d7a3eada8ecf7adfeb5187fdf6a66f50935165a20319f901c03c3fcf0d22113d34b7fd3cd7969b287d56409514f58a8ecf71405fe3d39384d025802154b80261b58f5e3a90cb6b9c3895eaf294f1f83980fddc5930e30aa7083f94e8ba71cabdf9709817eaa3cbb4441bd9c85cc43089de301dd6912e81df770ae13f3d036132633ed935badd704fd8797b21c5ad6c264b69055ae22e66f57d1f2cf9f2681b763d91e1346577163fe76957f13321918f4832a4ce6619f1c046a7803899160cca5b2883ac33bc7e342a1de98c4a0bea47f7e61160f1d0a3920d1a1bd4c62d04377d30b153a9c5278e99724f4376a1943c3477b0d7d51d96fd4f22f8bbf518b833306b110ac30c48c419810e4f785143267ad7dd2fcfe78588087380fb7bf340f75b894c9e480583eeb1bf5399d97c2c0c3413977ba347c74cd5e1afe9a328a5d5f5ad3a1793cc7862abbdc9c3b41876e8d7f3eb3da9cc34367ad08a94a97277278d827a60cd9883971078d3bd8a91abb5063c52c0bc94377b2bc3522fed0e15bf02d19ad182d939b973bb85c610a2f2d79f3d0c29cf7058e6a9f68faf4e0c6d0f430de2cdadea0bc5a4da6e9b04f2631153e6bead383d02d67e8d2aa52a1bb8f6e6942a24b18a16b44a0cd2cd42e2854ae34b1b51ddc4bdb5a11b7042a9640c5c308ad0d9186b649f62f36a482c542ffdc817cf4f151009a5fcf62b5d4ef8692d3ef0372797476411ec03d98b82e6fb9b3a41ad5f26724e7a59e3c8083f015eef1bc563724b2a63aa6ff3a3036cce506dd29fa93979a0e27fa73bec2419ceb31dd4d63c600718ec7edbf7ce59f1b79290e7a38cfe7ac752848bac914f4ee07aa1ef8634ea3e31651bb391ed12d662f071e3a6f1f8f3c8d88bf64778af1a3db5b82d78844762dbaac733c62a3a010f81c4eda9a10b9837bcb3261adc8a8082094f1d186487bf4f6689bb82e0f2d64a17735a8443c9500533f15080848889d2bbaa79dfd39dca2851e430c556abb7b08bddb89b4b375aac7bc0326512848962059826409822548509024728065f50378b76a41144f47eefa3464923976d828e8ec3388970eb7c9a54fd0faf98efdace31ed2e116b57828246ec13da07d5665717b21a5dcc1fdf421eea78dc14af57fae7a6bbbfe96e50d3daa3e6e5215999740a9cb7a737d6ae78dbbcc4fa74ed3817f5a9b22d0a70f81aa9fdb7dde439e4b9db636d53f9ffe687d708f5645e62f43ff9cce591db707d162fa64b5983e5957e6a34db4b9e790bab32e77f6fa437b7d220fd23aeed10e3766c93d60977fdece8b4e9f9eb54cedcfafbfeaef9487ce9b8d927b40f8f3f2aa6e6df79b53a3a0dba17735fc3c15d63209d4dd5c0efa37efcd3b772e657a38cf0161e99476c6dab434b57620730cdb32e8f465ad4dde7ca8f7c7bf1f2ff5c3c3793e6715a33925b5477ac47e68d4e5cf993cf109620a03350ae32a5c85af40cc3aee318bc097563e9e76031b06362418d800924659dca8cc9f7760ba8cf6aa329efbe38b92ca3f1a05fd790e3a0d6814f5e8cf1fd028eacf8d346a12c9fef25fc93d66abf1ec57dcc040a3ee8f465df7e5871aff3c871d1af57c038d22fdf31f1ae5565786fe39934ef1cea3a1f9ebc448ee212d3f85f2ca9431bdd48f91e935d347be3f1cfb61d969e18f7f1ca431a50284500b844c409805422c10064168f94a4b871e430c42c09e7e5d8e790ef427724e71a8bdf0a96b9b730d664fed6533d72c6639fccbf664ce2f27bdb52297652b6d7b2ccb5e90e97bef59308ba68fd0da2084d9430b5a4db2ef8136daac4f8f5551ba057d6e390fe749cb43ce4b595bb4ac2b8db23cc62e2e97dbc5562ceb8ab322740f9daff0664108535996f352134218ad5b44a8cfdfbba6291f1d6e56e7c1ed0a74e851e74189f28755f1899a10c6ca4c182ba5e825cb43a954c54a98192f6d3356c254b112c60a7c69c52926b718c94037de9856438af958455a0ed3a758f2abe432a6342761eea8cf68526b120ec95ef8247bb327b994e6241f6dcee19024c949d9a6a34cc56ce67cde639743eb3398edb9307725773e53f2197bf90ac9f6941cc3485e2249cedc6942e874e971933b4e1f2f139a9f2e679f6476695ec64dbecbe7d684e67ba45f4e5f866d975b9b7bd2668dfc39a556db464eda2c92e63a0db5095417cdd196358e749d47aadb68ab0f67c8e5d3350b736b9b7dc2681ecb1ebb1cc3aa3b38b31d7de2c6e13056c258812aecd51f50eab2991996616666cecc903c8783d438c96b3cba0f0e526379a8b157f5354eda48a439493efd6942a60c5eb3c940721f1cc43dc95913429a21e54c1f0f4ba32669ceccf8a8b33473b838448884a654ddc79c999e038729c62d308aa7a599e08f2f27da8705cbe1ec118747bf98477b1f961d6e13830e7b49357eab6baef3523bac4d0c76a5c39adce5cea51c497493bd0e0c93b334878f764eaf99351edd5fc966f39a24eb137fa6642f0e5acd31ad364976e672bfecc50187d5fc62568b99ed21f98c33d7644eb23d735a1f59f4c13d62b446aed3ecac0db1f8dd85b93ec94df36c88e63285646666ce9b45efcd4b47f252b071a46793e6e58e97dc9a0eda90fe6cb48936b8cdac9a1a873de7f9f4fcdcfae01fa8c2f1665c40a9cbfa0a96f7772b2b5e9ed2cea6482649c92c5913c273c667f45269c6f22086cb8b794a5d06352133f6aa7ec6e726a794d3a53f4d88d4794f1342f2998d349db7985c9eba4631741f9db9344a0a89627e6e323e6a6517de9c9f1707de4248a4d47d6d94b4b66bfa7b4e47ee8652956c0196d7f16e850499a72f8b60402faf4baff8a7ede2a5161cc4fdb4cca54ff26a6ef9cc7cfa6d9f1e351d58e47ca9cf38c7bcfa74679ff6fef8e9ae53d5d9de9c9f249fa5cdf5e9b217fe2df96c9ccb47d6f509fa9d331b93ec67a0bd396ff9c8317b35c69cb5213decf0676c0fb533d447f6e6bcccac4fdfc6ec85f1e58c5bde5a9119ab647dfa499753dbc31eff693cc4e76bdab945cd9d2624c36674f6b9f1e43967dca21567e46821674ed3413ae6f465a2adbadc464ea9cb8dba68ab6e6dd71422d769ead3e53669a4bf948fb73e4161286e8a2abe23729d7eda90e9237f9a90cbc23e499f5bdd66e348a7dbad2fafadf6e979dd5c1b82b9747d9a2eda5ce3b0eb349d1bf56b837da22eb75b9f3a75d674c09c3a75dee6762b147ef9e4163ffbc46e5d51b1772b2c437fdd4f299d26b63c1cf7d16f5cb082877f3d6708ea6eee5b7d63ef72d0e953fb7342bd3fc8340ada1fed3a2d64ba4e77d6d716dde9a94f4d390adec2434c065bf183bbe0157b6131be757620f32307d7c58141865550fdf9b53da709998fd2ab6e97891be3341d2eb79ab831df73b9456b755a4775544775347a23ea5c6ac61daa9170a919eb1c4ee6a8679d3bddfa44c9f60bbefd0763c8781fef7ec0841b3ced0c0b42859f05a1c20c0b42e5cf9cc60c0b42b53e734ab3ecda32f2f7de7bef3daf244ada2867a4edc21f39d5322c08f5bd1b3db7198da037997ec3cbb73fa0b7458b4e6d40ed8f4aa39c174810ea97e55b08097f9f96ef6ce5c5101a7f9f15dfafcab78fe06b2e43ab46dd0e6aa146392f8656dfde5afced2efc6f77f9f60e6a945b2de1c6b7379646b10ab8bb47feb64bf323879a10283cb21c45b4a24f7dafd7f1cfb77fce2ed55f1e4e3fec9fcdf98205a1cacf9cb2f6dc6923672d74b4b97fdba54f133212e21c8f3772a7091955c7cea8b787bebd871a7555ad15a9d6a6ba632d5dd4cb5abe9db465759bfd65528749a823cd590b47815df32fe86f837dba5ce749176dd7a46d77664de6db697ff9766c13f2fcdaa4cf0dbe9c1ce780b8b7f7f4b61c356af47bfabea14ffdb6e870b3795e04fb6873fad4a71d6f330955ff3070e99b3eb5bff624d4eb6f555b861c50b783a59e5e6a3e1cf639eb893beba14f2cad84524a282574d041079d73fee6334969ad94485e8af9b5e521c77950ef098aa9d162a04fd6c80fea75432f85e370d80bf0ecb722809d177f723ca01ad5ff3a30ab32513c237140c2e0e59708f36eb584180e08ef564b34a1bad51240ff1c3aed2c43d227e61ffac48ee4efe959d5c57382845b8f847e1d986737d228e9bcc3fe837ce7c509befcfdf18cbdf302cb187f4f3c64af8b8f0e5d178d07e7cef1905b3b745dfe3d5b6d50efd4d8a06ec7c1f618f45297b7c72cb63a87f3a04c990f258887af2d304022b4181de69d3f302dc617313a73304a6bc2395ff374d29a97ccdcbc309ac12c7bcdd9cc9cc368a675114191e8358b5658e65ce634378a399948a4c53b1f0945f1ce6bcddc767bcb3b27751425582abde6526be99373326e34950672838c1b63bc741163a88b972e2b8e420b63e1a076e39dbf312f8c98771ec320c1a1afeb82c30f1c3e87bbdf83304a28e56b96dcef4118a3b4a065bd660b46292d6bce0b8318f69a316b5e1786519a6950d35eb386d12cd33491685461adafb9b228e3d128e35a332691322ecdc09999d73c53ca9cdbee74353599c3812373394cd0647acd26122dcdcc64bcd1549a8c6bb421fcedb426e30d8736841fba1c30478ed79c638a6c885ccfcedfd659b2668a6c885c29df437d724e803522986cfe35995eaa9350afe91ff4e278c42e518c3aebcc6a9db336ca452d514b9d599fdecc669d598d5fa297b88a43d734f471e89fc7a146ddf9a55137822146a36e8d6434ea463022188d72fea296a82582895f7881e4821a2f84e189366a94c0324208257cd07330b001666666f6550eccc959b143e182bff56bde79e10225808961609f3ebddacef6c916841bc3eed3a7c7ce39e7d78d714134ca55575d75d505f1c4e74910ef9a4f1ac58e2dc9ecd85522b0c532053437397d7a39edd3887a737270e814cd8ed3e9defce4c54b313398c6dc5189a42167883105b5f3e154306a037a78165b06dab88ae56d794f3b53b14f729546b17decec70a65f5536a6d2a777bd6b7e3fcb6260071d237d6a1f86a8f40f48c6ec780662a03155984aa3ae23f30f0c1824bec36a59842ffaaffb42070e2204981b1c30ccfd38794e9f8c74f1d2a58b97f621e7a587465df69977ab27c8b8de79e10222fe79c441a3ba37e74e708b1b5ad4c86275a18108377794847ae79019be697857e5a5a64fc8c501698f1eab382096478f48401dc4328cf8e84d46a7aca057a5bf344a5a5c1e15a137b6b8712d2d6a0475188784bf222f90f888c55fed883234b97179634b9619bead6865054bfa0c6f05bd5416a671a2ab91c50d2dd91b5b3e6a54843e6a57b87cc4ac950e352f6d0606a846bf5810c9f1e0d2b3c726af09912daa8e07fb75a2438d4e61bb0d84cc331ffd47033a55c7d068f9d8425bbe3862cbc77ba25f1cc1c5df1c3e9a3e7e1144e6efcd4787dc4e1332248d51d06b6b083b1c107e3783777714f8066666e6666e679e73f2646666ce396143a8edd7ad74e6bff71e143bf837b446c4a101edd6b539e9edce7b7ab65fd635ec93eb76ec6158c5acf51ca3175684866fc71abb90a5dda14fcfd9fee8d3cbe9e10998666f7f62de608b016ba44fa4a1aa440513c4904fa3ae13f3ef3e23af02453143ed9746e7e1b4cbf0ce774ce88f99fd861d2c6fcb62b7ac1d1a65d99eb34e87d36ed91bb71dfad42e379d06f4a9dd32a2fa3b2428e98de287eecf36e7a444bd27d4fdb143a32e0e0d68d475ab0734eaf65f1cbefdfef8761c1ac54ef36e05c50ce83b2f5cc082bff387a440dd0dad09a35e0672ce347028afc19da2e770067aa9d3c3e12d24916c1f8143cd3e45a73718f1e107268dc23cfa9346518fee13840362553fd590c3de1bfe3290e3b0d76bec358d9cc6de5ab2364a7b4ddff6fa0f09a18e6118f6309d76de9c53a690ce39a7bb0dca833addcd134cbd4e8ccb402707a4834077deefdc080781968126e080b0e513007190164287f9cef1905140bab1968d99e853f4ab3ab6e2a3330d80788be3117d4cb5596077fe709885fa8755fcd32acbba5840e988b521fc53486b423a1be204596566ef7669a5b6632bd82728afd48670c49ac4a2b2bdd0564e426d372d99c12863942693d5433b5c420821bb9e3fac1c2093ccc1ecc75bdd9063694378e49e4eb76deee6e66ec80ea105e1a591cc2fb6bb795d1896f5766f18d27f723cb24cd3b2deee1cd2d445d1553d7b868d2e31cee90e7d7260d0987ac2599d1b3a41bd39bc73eaa6d39a1f743c68d6ddddf035ec0d6e50de489359d4b637138d2aa996b8344557f5b34fa32cd38674661a75957a6f78e75cbbd7fc4457f536f096e0d94ec7c345694dedd2300a9fd62c1241e1326f4364d4febeed1dc13b57594c802ad4dddc19f4d029b34fa7852d65a35eb7126a302f8539f416f35219d551807b385a66d57140b087ded0e7acd564726378e8a578cbc3815ee7d004a024a3de161a9245a8d7addee93820eca6316a1286b0f15b635e6aeb07f33cf4b0090e07ba14a6152ae4320fa14fcbde79f5a0520ed2ee2ef6ce9f7090b62d14c501b96cdb80721020e65f7eaf77cea70372b9f3a7e930a550af13e3d99f3664be11c7831ddb7ae7b21408f5b9733c28ccb8092ea5c35278c85678c86d3c642e3ce432d69887031d665b8bd95aa864efc9351f896ad54ca6cc7d8c047a07b30de6e140a76bd4e7cd7ead315a841ece59abc974f9f5cbde13746b0c5bd618698df968fde1b0cfa09f184744507773e3eae1740ea119f5c74b5929e936bc736b93db0caa740b0140929043049c1f683f1c0f48f3e3071728a6fef89183ce0f3e9d2a0d35208b498c2f609c1a5e4c8dbad51b756976dc549ab87a5743c31fb8d9a8d9d97c292ad70e11be73055fc17c5ddd578c31bae6cb61a21e1c0fe815703ce024e3a1d3a7a38d1ac7c4311c4aa74f5f1c9076e811cc8d64500c7027e83792f150fa8d621e0e1979383a8ddaa119e05045dc093a8c961ad9a18d28c20e195aec92dbda2ad49bf3d0735e0a033f34238d5551f98724e07840874e72a909300e74e8ce3899f1f03a273cf4abc388e301ddfaa2667d826eb14b66f638043d0241a61c19ba4d8cfdd07b808e8146d53c4cd140df800c560fab1a541ec6e66d88982e5030a3813b1eceac51edd065abfa5d47a0eee6cad5e5ae729687139d52985db962595452d90366448d4e831ad5df4e732d97a3e02d1fdda5184be344bfd9ac34ef9c36c48667db458dfeb4a0ac4f7de2a2c68fce75b391eebe18a30aefbe1843e87bb391160a9779cb7b3ceaeb13dec871e5e963f72c3741f1b4b3a6019997cedb8a8a2c2fad4f3f14eba5c0b7b612174f61d65b6684a731ebad34c65399f166f3dc7d41461a36cf697e3ab5b2de3032ca3c9d196fcf7b9b4eb54c471b350afce852e8a59e3c9c251c8a81fa94c501618f2eb5482e3c843b45bf92898f72cb478fe1c94b711057e9d3100ec529e8e89483b45469235210afbcf418b7bcf4cb59b0a0671bab381ed2de502d8b4210a38cd7f1b762d7b464848f362682327a1b63e953f4b971963e45ef4d7bdedc175030e259d3017b69312a6ace1b91801b724337e438207c84e3113d7a015c8a91609ce8d15e1d7f39c8c4f6f2131ffd92fee67c641c692ff6f7fa9bc341d617f5d4a7e8d81683ae9825891a81821c10fee871e580e0f828a3d37498e1a190e321e576d3a7e853dacc693907350a4ba3dcca892c8daa59350a8ce8564f005db642e8e373420b7f99cb474d8b1624fe72978f3b97b57cf46949238dba3727248d8ade43a376a06cfeba3010803a2d37f6e8a746b547bfa151cfa3cb55abe0ab408c050a66d0769a8a249a3ed95c796823ad0e5f38f1c6476fdfc184f5ed3bf4d0291c426ea5c4151cbe77ee0f2a7028092ba888c000010101ed5ce1564a40f1d781d13bf734248d2ddb10315cb62162bae85367e1f21dc3f70f49c38a3e6d3f4515df797647e3345b539fda9fd48e427560ca90e24a14644431e6bf784114efbec822c68379f7c5123ff85e39205cc5f1902e5df6db18c9543bce77f4cdc90161930d74a73e45f3e913703ba687237dda29f5e148d7ac7b38aedaf19c87e32f7d7af509b89df970a45779ebc86f4edc713b2297bcd94037f270649409b89d1dec149dccaa769c0ebdf41880aadb999e5920cd339ff68a263b366d6d34309d7a0f57b553ae68dbc3746aa7f0cebc6ef5d2a126245a1b22305a9b22fcd1f9a33fcd88666d32a7d6c602bc6339ef584ee146d9397e22120e6aaf8080bea9308405d0671b073d1ce9ad49a07758cbc3914eb2a29279a90643174140d2dfd04b2179635ede27e6e503f3f2be2f2fbd572f551a52228c971eea2f2da6c7bc14e60618b8004693017a295725e8a59c962d2f25fa42094408127a29de91feb8bcd44b82184ae802b423fdad5e2a88116cb0da91febcbc94db29d9eb247b4d2d77a0740aab50af49835ce5e14817719697c25c3a6b79a9cca5b315070488fa6da7a82e9d53e052548838ed685ec5b4535d56514015530b72a8f26347f3cb4abc748a6dbc936dede5f5aa4ff2f2a979f5f6db2b2354a8642e722ad4475e371be8d5553bdaa6690e5dab76cac8369987239dfa14d1037ae999ab7628ddb24d8c0d74cd553b636ca0b59140e6d47bc89c3a84b607ea9afdd25e1e8ef429605e7ad6432fb35e3d1c895d8e07f4cb5ad63d1cb87ae9ee46da1e08f483a9f851336814285ce69dfbcc3b1adada7903623e14ab4c1880be75508dbcd43c39203a3e7ace4b61a9e9f19a60dc97d347bfcecb47285ce6dbf61a3573cd25b536cfdabc77d9ebc43c17d929481e4efbd64fe966e35c3464e35ce4aa9d2f1f1df51e30a7ee9cda295738db0375919d92f370a24ff112e9e9e144f621eea354c7a3fd723c18f3a7651bc5369b1ea8634e2d66e7c36977da0478e7fe78e75775382e3a37ddc3716e6daedf6913e81d69731e8e1bfd3c15c378c572dabde3dc719006aa7d39bbf31f2f85b9733a37de09a437a8940a17aa73410d42a6d0ccc84800042443150030401c120a06244251d5c40f1400128cb0525c4c17e85192e32885103186104244040000040066363000843ea9b3b4c0f9742ec3511fdb715dcc66180c446a5daf8e8ed2d831a959a78e7623109b1c3496acb55a95d6dffe3422db64c335ca28445414a3bc66fc9c9271bde153f8f589d9eeaac46cde79503efcef2146fddfd306b88f63b6b1126e3fc79091674f8c2d09ca93f06372e48e907d528199e1f5a3d1e9752c11ed95a43f79c3a2edd95601f21dfd9a5a46f5848851e4dc6052b7ec738e30ef7d0b32395e8073d76d3826eef7d9a98d4331df07a0c9cef6904340035e680d9a687347c336bc6e0048e3e42aac9a42dd77042fc774370e0372ad6c625c3228f7eb5ebed0f472d482ccfcedc738c463dd7eb66d18bdb2cfeaa672d084bd7596d924e823aa2e1cbe7bf56cd5d97b00d0e9a1c1c7f30e2f9f868945ac991be9d0bdd31ca53fb5b0bf456231f4c9e4cad08aba09e4be07192e45fb7796cf1a89ea07268a59e354413e3231665b636443b173d1a2b3731d170dbc22ddcc8ca3a168fd26b02d7e778cd31592e01057aac1e901e34244181c79823caf1cef5a6786da1abf226f7fa3e51419eda81d584508824219a50ea80eef1114d590e9009c0794feace502baf3659c8f5ce28f972b73327f1b34ca47291aa07055085bbdd05843a09ff853e9336457bd385b4ad530914bc963d3d93da9bcb8b6320683c3906d20ee0ced6de4675d86766609289a9e2c1a02bde051bedeb90363a8970cc903d1681fc7ea52d653192e8f6438fa4f818375d449640e90bb84fc9927aa25e57238365f3a94e12b293482934313a50fda0a87ef5a15a690390113ded3e4c38de3cd4965d0dc3a07f693222135fa7fa263d21bc87aebb4de63770dc6a27114dc50f81da62583206ec2c5c23c09b17ed6c8ce844e639757b47c14bda9d85909a684361068945c162a335d3ad24c59257f799f4c6c44b2c6a6bcdfc0ada6dcd4477b52451533f8747fbf32a3d2c956990195b9f79d134725a6c10daa3fee05fb368f6c47d62a1fec60ee7e6ee503b652834bb58e73695028992402a4fab66bfc5b38ba2e5e339f74943db20a728261ba9c035f19737c1beeffec8ea2a0d0a9503a1d61012c40b659361c4cbd9621c55af4b5e42a6a596c9a9765542c88119e39e17a3c64fd3b5cdde8fe227ba273a46e74501489acb57277c45367d974d1f46953749cf5bf3717d3c8583e9b784408c78e102cf717c6e77d7e9308c4d3b14746841e3a77171b4e2c754d8073124f76876c8fbb90d58e72dbc57237219874e7c2d7341c8e1c9a1e4c4435abefb32c4aa97809d6cb2cf956b61a93846308327a023a9dd5b158ef263f16ea5a1c4fb8947bcd05e1e67104e9af95f9a101da722dfb4d0bfa5187cf6b060e686ef6dd6952887b2e64258c8afbb47cc319611288b749bb313843944c8ff7246a0ec4c3b21fd24abd8d480eb3de08801b2bc32459f079a2c316645b49e7a80b8dbf48d27a0993642c47f0a4c1d2670b4a2f4e0cfc3de58a92aeb225f471166c39010d5d8a795004e1827118513f25ec9c635c38c4833a118c4734f57164aa70e080c007db5dfaf9ca7282ce966f05ea49d6b35bfdf81b870646ecd8f73bad856fbd1613c74995f54d4910a784ff9041947eea28c4cee9e40afce921de638d691f09dd1a58126562ed4a13a8d7114fab016a25030ba29ff3881ccee114928de1a3c563695092c14902af1b8908b21a4023d93c0cf34bc3449c7741996a89a8d287aadf59958d2357274855e0dd938b1cd86976547097f761d6df342b1ba574af0da9664391e424f083b89c8e8240e8afb9a1fa38338165bc3133d54b9427eeccbfc6d19237f67d684e314a62b797cb1e346f12675529d1c4deee1e9af5b926db2b47bcdc7c9bded00edaeb8ab4d02ac204e8fbbf441bd1e8d0cdb7e5e5b0b063ba98a20aea40703228ba2f0397d80b33b35b9623637080c773d3e17dc442dec1a81d8a50a7224780db8d57517df6231b12872acf57eee27f839ca3581c520a4d8509feb301306a52981ddc3fe19c19a26a06536f444fd7fa63135cd1778b1406af7b2b138039a6c7e7513776e763c7edb1f8f16945ec8471849baf59a78913a90d87751a4a858dd456d08f34620a2b4b9a1912e815927cdb49532d2f3dc5347c3b16924259538a448a3d048ebac9f037d4a5adbd08e0bb97f3ef14ab5dbf10e06b97e76fa86b5b73e9c0b7defcfb6d4dcd33ba21df9b72f8ea06a160e18fd1b0ea59c152e308209cd62a15b0b90e98324e109acd76d7c3ad5f7ed755bcd7ccf18bfbe64351c14aad9188bd57d595ca7e9d89e2141b157b0c438eb56489495b0de8672a769754c499a2d68c0bf1d8170b2f8c226e318ef8b9f4911d510190c0c209216e00a07724da27a9d9f061c32f966866ae980f4039885bf3e1e75e966a0992e2d29b9077939240f581fa8fcb2572fedcec9e11b0575bd2cab7e2f9a58e8f54609f95dae2b7228810f9077e06cba1943ed1749b6e39d2fa3f509243ebd36f52f9762fa68545d8b3cddbfcb0dc1982db87dfc8be03a66353b812687ef552676c75a79d6ecbf54ab10ac4059615ce673c8f00e8b4e388a2e233e2526dc132614543126a10107655d1cb2a3f0bb7bda43333ed46b14f5468e089d0d4caa52832ee3680536831283c6d9724e5289f6d5bdb6c1ab92956d2c8664070ae281a644a6e1575d6668b2f1c17149eb64b9345f09b8ced121d32408d38087603d7897f79c03bc80b7d1dfd283fb740e38ed73cd8050d3204a12124c1a9a45f0c04f6261ee150860ffa6f466096bc0902ea0f2ee4bf1158ee9b67825d3fec1f3b0e9cd2ba3a56f624bfcbf6e323ccda3e9940335042d9dc2f3a0f06764352c69a0dd4b7f0eddb16ce69a900f55cd9648bdca513289e557c9a2b9e31698e929b1798e87d0d161d6b817665dee02dad475310dfb0e86e64393987c11260fe99d5f376857f2d54c6bc949baf27f14d0ff282da2e8df5c9394f62ca2f1baf494eff71431637775c58bd32118b6f2478ac744b5e00a2aae669236d456369e4c0d699a4ef90259b6264a2e84f5265cac051351886ae9be6f3e418fa9032935c5ceb5ad3a6505c97bece411cda04341c51afcbe6da36bc7121566204dda0439c95c9450f49d0b468da80abfe5b31a49aec97e4e2a54b6beb98ad432772bc14b782f87a0d979cf340610daab40b91ad2435635f4e724cd021639aa273edcbf69a8dfb397c538fe5c93869f085e1aeb0419175d11be8ac820f7be162d78bce9615a2a1752c098e1fb858a138a1ee06a353b192d429ab676098c60de596cba4d1e0a05c2ad310f2660a605b6692486acde45b309631fcaf4dacf9949b3349afb64d3c7c06f4ab4c86ebbb376870a384e55e355d3fe6a3c8cb04b358c278784d515b6ec2c42fc4da1a63f1e05ce49607dea86ef5968b9431cddb8d117454782f0ac31e05f91c025da880d8f598b01a0001d885b1093ba83df35abb380a2cfeb1c3406d7df8479e2cecb8d669415f381250d74c12abe5c3152fe79487292daeae92cb2f14cf15c00b9f1574d7ee78063efafbfe9887f2725eb3b4d63b62ab3e3d6fbf96c1bbf60813d02d4806dc2f646ca86b59c22c482b84851be29af9fad8e37a6c6759968c76a667e829a0ee13d3f12db6690a51cba9f790bb442ed285bf8ee8d2e9e4e22442e50f1953c008bdc01e556946125a821cf8010c94e9bec17610d8fb0231f0a7d160db82dfb9ff3b3a9f5e9b59c04b79a60afd5036ade448c166eec523e81c83502f78076ed41effc97be045207b143109bc03febaeb0107e42c31f54e1341d65f67b53b07981bd8722099d3f6f1368be4ec6f1c3016ea6ac2fcce0ecdcf466af316abf290c7dfa05acef6b8c58456aebb5236acba7d6338554bbcda07d42063ea0451212f3ddb75090ed2a956167eefc44043102d43084d148855abfbf7528290e3236297b9e99eb38b02bc280e0a33d8a24a88a4b4065e6c4696e0e91687180f0ed0703842211455b72af9b2b3a14074681f67ce585970f90ff049d9a4105db6d6eeb243ab936e9ec582a2e6e246f453bc9deb3f542fafd743093065fb7a5e9d4bc9df531679cfd15370c86381ee8b28358105f54553218ef519a43950eec8a3b9c0c59048019a3aff8b87c9fb65085633630535990d92658aac6e30a57e7382494217da16f11965dd44d4aef3174c7d3c9cc2197714541abd4651323783d2f1d6082bb4fc25235c9fd55613691b27e17d56671a2212fdb2488056d108b95ecfc2f568e7c1ad163205da12e969fa7c9e25bb98f9f9ec4ac19606a5805010c0682564e2103bbd8b442392a9c46f0c0c00b73ff488d91d1edd69797674d56bbfac29e099f3649177fe90ef9bbc87784ee8c0cbe454af6909c2853640dc0b7771078809b35dd3169f905b827a9d4bc52c6f527d42d529211b232f1c5e2038629ed3eca1b30d28b1af80d3cc0fd4d2619c68cb704e1771d27afcd311eda8114db528766895ad2e89db3b7993df4e6d8ca7d8ada7e91918b310b9a192db90e8ac969ab3146dd255164ecbe75e522afd2dea377106cfda698e95c5e2c8ff17f3ae8b9eacfa021ff1befcf6f05418a465a8715c5e5344e7ecfac2820297b79e761acd74862b26a07ca63cc8311825e09df5b8c30edb531a9eeacce05e9178032365c4104abafadac85f17f0ccb17f8a4b07577ecd191401051bbd11b888fdc9912020c0eb0fc9dda7bdb120a8d4e1dd7eb5d707f10bcd0bf781be280ec089a6d33c193dd9df5e787f1ae87cd778a52692a502d0bb645a90b9f2fad39e7ca281a9a0b29aac4396a84ba9ae452938de1597c8339271a6c69135d77be8b1f01859e69eca8cfd1bc62007991d0e40b9867bf7cbcdd5c2a2e85f0bfda16e1fe31aed38329faa7bead8fb939f2225de4135269178e3c8d61693bc9ef23c33daa6c58ef70cd2ed7c32a343a4b96046bd9a5a4a1f6ba9bfe3ee0aff2a1a6eb524fc1476c4c54ff580197e65a49e849b927828ce7b07fed46d93e1481cd1bbe6a44bd8933914b3a3bfea43452e4004d6c3ef7eeacf2b5ffb68ee0b809bc79b7cbd81b176060fc0154686638842e4121d35b02e3f1c352a2b72ef908a0615df5ba0d0e1e981920a2003ca7ace5931c3288fcf31b629c05d60f51d44bffb7f41679b1d07e218f0fca03c964192712a01a86fa7ad16b06e375bcbc12a876dcc560f23cffb969c7bc7535d67e4616cf745003be1d086a01be2153e55fc5169543c97f99259abd1a2c4b0b87183e5bc4dcad61b6860db581fbd5c66ec5bf2d455681817d8e46e195c0758606ccb628109e49b702937c4de7945ca31cc2e7392027cc955c87454b3f6d6a8ceda85999908e47a36959135382b1f878eecd82802f982aa4d683c2ecb31686197ee4540452524eaece00d6a441fcc0ebc781ed292191e05c15c4489c62b56432ffb60a1da74e29967ba29ad255911075da9864e5df4aa4ec21d9f0cff51dc3c843195c286364c23497da4a8e3119880dddd9e2b334ac4c61628710951f972d4163335afd6bd63177b1d13139597301299f6ac8669f331a6193c884c9d6de2c423406b859e6de43925c1357054cd9303721be504581158168ede5ab76a2408cf06d5852fe5fedee6c3d468b30a7362515df5486a5cb9cd22882eb8e702ea3dcd36e6fd85430e466fb70f94c4d651c43f1fb332bf1ceb49d3311338204d26efe605d164e0f5c2c0967d0ce73a7b5d48affa0ba1bd22ca25f15a0a2022ec7e0156622c409b9f3202f5ae1e0392e048401901a595dd13a16ce15d63ca6ba919c26a087524540426c9a872531120da0cb16351a8f5bdeb3278400306ed9d06126c9f00d00def57c497dd24f20f8e8c67bb3ff900bbb02885c173ef315e1dff018ca929438c674e9b8ac8194e24934e2b0ce4d84fbf031c2bdc6f8467aa763e3dd79e78427d69f03f42ef2d0d675a678870fbf722ebad4a67d370ea60659b7ff6faff16a00e4860a4b6d03f9156a19161e51363c16ed7e583074b1f738fa3a28e03c1958309e6cb812ec215a01f7c44c11f16dc3f61337bb39bf9c446a9ea7e6c855e525ed13e85666f32af7fae3c53e452e8f6d4af4195845da2af5e9d4805f172d199625510ed6f20e16c219d8e88d7cff84d9b9fd1e02c43ed56a36c46c18a0a518cb8e64c331a81952f83468780f2ce44166240fa4e36eed48d483536aebb5869973b5bf05329aa82a38a05f05b06bee89057e9d48ee74b20c8b70a5075abd1069eacf7e661a8c55690a0c7111acae5fc023456ed28f52ee21a17af675e614321ed6f1ca132d59570583dc387aa8f602c588dc064124a3b5d4048a7eeff3ecce876e9f9289845130a8c899b3dcc90416d789715527629c3902e2363578396999d4bd9997bcd72ea195c81a80d58b99ac2f431ee549039e4d62c64148a06f18e69884dfea190e084017f6f83d2611b3e88c6d049f09c6a3a3704a009e1187fb848b52acfccbdb4e9a6890a65837e4b89ed671420338c66180e6669ce0a7ba19128a84282c0564f7610341e6dc824118d9c70936ce500d8bd4142a2f26463cb87829733598747dfca60680ee6b796788c11098fea8db0c507c4846dee060279a6baf8b8d91327e046db6ab8ad28e9dc422f265ce0505319c86cda289840a7bc233236e7a9d015350ebc80dacca853c1eeab3b372596153afbbe872d22d6ef838b419dfae1ff6b84d51a181ac53fd16c7cdda05f991c98ce91b789f3b1298f7c6b5229a301e858f9a87ab2f5516288a559687a63186dbbdf23fa37ce95aab5547914584067a7fce882e20fca2531d44eaca81785b1600e3a2a4012ce374e1cc6b55a1dd35105654c0ba755ccbd04657a8fe733aafdbdee17a9d88118fe26c080fe23d1a16374cb749e4df55a62e4acd80833b659d694d2d424ad6478fecef84b8f213f1bffdb6e87f7c923bdf669f1d425d7e5865067bee2503e23da2522e3e1a455565a06197e39c5fd5326862e26144d114522718cfaaf8d7836f953a214d894af82c89748732238d6f23d89f08dcc7ea8df4e3ad189a6844f065231206dd2d14650f713b6a9590e675dd817285027e38d1a1ed51710a3807c10311782619e46dc7b3ad1cde08bd84e3a71ed651931137f67ba0f64cce1019a42a384265112a6c90f8f0182c4cae05b905b96437409f8e396f4f1c31b4488ec4c192f306d6cf868bb255639d08e69a651d1efa2940fe72a8a92971b07f885054881ac3f012f162e4f7a09bf04cdcf999a3ba322bcdde74b1c68a4fcad442a3ade9b94ad088289507a2023c4461e67f8da363c9a9bd35114f62f6c95beab24a47474f432e05914c512ca15a630931a9828ea0a8cc76101908c37591b9438082a9b0d3b9bf52bbdd571e9cc82654011fc059244e0b34feac770c0c4cd64f12e57be500e2c4173587d9f156bd4d20015502e0ca1a90c225ee5e6464fdbcdda503c6d2bfd38a5220fae1d6a4867457e79b69cadef36ba59ec382c5b8f15d20f3ee95ad670f88a2061c5c333fc65cd163cc3ff89d08dd4f6782f6b248a50d7937192517ab6444e1de2e0a6a83a88ee62d0aaa0784f1e436350821debfed622c61435572b16fca12bd9c817b67cd9886c4f7763b97077a840e8c6583f4da3a3d06d339d30e8ca662426124c14a094769954b2a0887d3bc3c60dd0d973b54d81b657c6d03872226f8052589c57646199478b43cb0d859447458458d4db0615f415e570e145d975cda06ad4b6689a83ce7a9497b3ea94457c22275586dad09a7b3f54d7c556e90ea374f70a21fdbacbb2399db4ec048a9b186cc8e7368977fbb8ada4d0db4d891e74a339216b21a2b15e47592e656aabfb2f102b7bb4253cb3cfab64d2cfa0a349db843fd98dd908c2719bd9351e1478702a96b6e8da99f13f0855b24f31128f6008ed6100ae60ad43e2a10e6fc915a4f3244427fef996823b94181319581f202e83aafce3ce44e27c918c0f7b16e58770e1cb4c6a8893155ed48857924ce667b93d7c7eba0b11d63db166ae73cb62aad0ec0e439cf91c984d9ff7cb91114b935d9b8b0c5f366322a8b50092f6aa09ab558c5468a086d676db61f3625f10214336dc22cae43a07d7ce399d84817ce0a292a0e95a95783067a34eb4ce51f3ccfb0ddf8d880197f340b8383da0a2148bb72f8cff5f7d49a58148626d7494caa227a4f7f7f608c08f822d8184fc5f804238fcc587d11bf4a14646bcf6528bb7d1168a78fc8fc14f9a57093c14cf71cb983bec8a1c7703a252ebac13f864c3898dad88f454c75803155fc18a4a50f4970321059871b1fcbc37c842a67cdf88a1b7590f6227f3816ae3da0a43b65b5712f0a4eb7b20b8c69368d52257ebc33b4edfe0b0a80147ff3cc6a151e13cf082db30d0521a0ab20bd241bd03acfb0bb7a0987490a349ae9fbde5676e4b77117ab613793b2bfd6e85cf74f77c97aefee93fe155f526a548da145a362a970d30aa10319d1b0281738b305b88f546277c6b30c260d81f8cadf1495233a9140e6a1c8044618b25055fb124975b69b9dc452f8e25b8e80b024b0b4de2303b9c97389bf96e4838b5f564fe36599900a885e2ac39d61b19d4750b15806508aec1dc5af3160e5acf7412bbfa93aa22a3e070de87f4048b9fb1d4cbaf3e6adf8f6e0c50e6af8dc136ff6aefd14ef463f32ca35f9a48f257b99317ebed25d7ee7648e5257f89afb788a043fd66c5e8adddc3d61b28cd149b4478450effeb204de8f3dbf0a6d911388411ac5b65b621ea6d4a904d9da11782ba12749b3a2a81281dc7b0832f2ddeb5c11b797af091e24fb325e4c41f83b8e54cc748c19f41ff5a93e8c461911d69639bd0aeff6739dd627be2c7d3c15de41a9221aed853e84e717c853eae03f92a66b99788c24eb86aa035b9923d90f9f6a6eca8ad043240108e116682af562a245c7405e583eabf6273dee3c038ce4411ef0c080c7ecbd005c5ec181e9b14862810877d35d0d36e7a9d2bf8dafc485e2d3d261012f5c83778acb8b03f80731d4e549e2d066b77f820cf392ed14c4dca2a9a0ab9fdab89c2a1065cbddd35cb7269fc4704702e6a593adf6b21f5592400e224621aec4cf607ed5508f5a6da5e5ec47faeb17840d628ad97b78973d42e4c656be4d36c5096942a733dc8a21eb26fb29fca2eb8f8a9d5396ebc3cfd4ab92397bf37ed28ddef722e91e8107dda018afa4169f92674a110d40a998ff7de4597186067baee0d30aa18e8635ec7c369a540637295263c34f25634ec52b3483e5091432963baf4bc22d42200a9c4eda58694bd8b6e24d22238a1bcaa8e89eb524a53496bdc5baa6036be60d55253e932603903711e4b1a974a1a2d01ed82f3dbb2c967985c4340208c191402cbc096daecbb627cbd6b0d0c7125966c527ab82ce6633a1f45047f248a018d2035855028a3ed3a780dff8b4521adf19be8b18c99197fb04d0c0903134fd1525aa7b7a3ac78430ee792b066e903219016053bc918e16021e6cd623df3ca02b99f4fe3de7046a78a792daeb363e4cd59696ef866383cb380af2db2efa0bc3943265ff369d09b1b7f9fdfcb01bdc0d1295b7dbdff34ceff9436f000ffc88047cf38e0c6f04d52eb3de60d682f362490fe15cbb0a9d4eaaf8390fd3c8e917d4f37a7f3515c31717280244cd582039b8e663d08fde037f507bfd19303135f456cd443b1e999ac22e7341d8c701d14fa8c5fa28f3330af3ccf3af17d0e527e03da213dd38e494d16cf3bdc31c3091e00ef52dd9157fe57bd553d880d98200690ffb9b24c2fe2ef5c213de6f5b0fd9f5757643ace8d1b84e1fd3e05c62cd41536fafd375c21ad861dbe56fbb77b32b22d3c985f2268d9e5fdd112f73f3aed3456d894369f51e47e1d794bd6b39df162e534079e3beee1e9066815b85baa09c5285634a23fdcf794781ccab03e99cf8161206d8ef51464ec6e867f8841828e6cadc64166fe3d7205c361e79e58778e4f0224d702b596b33e5b4827cee9d798b82354970e41836856dcfaa146932bf0a5ca6c6b351bf9c79a79da7a5c7299f4c711095f245be4c8c2f5ac7035dc6690ab2dc9bbbb187e6db7e684909663e92c3796ef97bb321343d790f3fa13c34fe524043d2ffc33235cd42e30535a0c2304ccbb32a75ebd2e21d8bcce4a56bb324f0e4ba1faaa082ef552515c400d878f8fb0e110b0e85c139a2f7af7c2b7aa8b49b065e4e23d0cdc136699af6a63363d4473d97d1a145640fb9b17d112b76088bab1e758a62f3ce6055ef34a2f0a807860fc8930516ef805dc13a8c62dac18a1d6f48b72449fe0cdffe181e132b979ccf0ae2250ba608aed691d332809247f69841fe0a1639202b4d7f415ce7eddf9094944927f57c9b143cc35f4dc5821d30de54205d844ff9664a69ee4843d82048bc4c0a92b3b261e873fa037713926b5e5d829f1038379f1c73ac01d48dc7004017a6b22b2814ea906e91e0d0dcd3671e0522ad82bade187c758c249a3976acafcee4403841966880ae9402e753e93504b1e744969badc2d23927d4d8933001de4e8fe23103620559a53839854682e5652dfa6b30b1a5c8e775e8d4f48401d22cfece588bb610fd1e5f4401c702fc803f751d0dc9e8e568384d0edb9154c22a15a5cb647440bd90931405871054ca2abd512c78d3a9abb480423e5b046a409588843118a1aa5ee45dbfd4cd8c80bb34c2991856ca1f33f83d265e0b9499880fff299af2fbb8c968fa4956ab9d3e02e7733c9b71608cf723ee6d50b2d545d4c1bcfdb657fb039d4c4b5bbba4d8f66801b742a3146436489360b0152e40414f0044b8fb80dff2876a9d12bfa8cb8dfc1e4a0f9eb9b3d54eea29935473324807e8e7b8d604c8500cbee8d04d8624d7cfc140ffac6b64c24d93aed18ff54038e463e281a1a2b1530054d5992a4a128ec26392a9ce00ecee235283c913181b1e73643e2d457cfed09f3cb95635408f34e4f2df4a87174712493af61d830eafb7cf2a3f9655b22f2a36e3cff908bab1d63d5fd306090e0111c510b94d8fb044e103ca0a1ba3f4c5142c0fd3fc51a5449f541e60f60c994b192ed80a42f52b6026f1a1130257b318be17fca00f93de8e057c3265c0bfd0bb858304705cb4d4881a54a93f5d58918501d000152717e1445cf9846a8f74a5325fda4a6a90ad04d98887488035d1994f3798daead6a6381d3c69ea3c6446169005da6559fa6daaf99cd229047711988944f7e56b4b41e50003b199bfd04457dcc1726c0f8033e8307ee00706d31027c6c048bf45f43abfa9b70667f28c5d9de225641bded41a8d98ef813544f3f7db91adde1a1285a21e40d4f7c4984b00648ddb2b31130db09569b36ef9d173122e128943b1f3a489a60cc17b1ed652a78e9e80b7b98b512568e66d94204916c268f7e5e5f83b7bca713955df836400ba5599714a0aa8a64932d7be6e6a95566629686ab1d8185f72077c8c4e5f84b3aa44ccabc181abd5cdd1afb085952caa817c1552b3df6af11bbe2cb3e6eb275fc639b8d9e7a339bd811e2f23b2442da68204c03fd297a22c9ec910e6583ffe256f0f3a036c1fb874ecb678c167176d44d223fc8f2f997daeeed3a63373978f3e93b740a8a23bfbbc41d4ac6c40b14012635ae4fd2ce3502469a5d055baaaf2ac4659b4f036ddccefae1e96fc44bae55bb175007facd9ee7ae13d5e3881642577f5057dee6b25c5f2708efad8e5954cedfb5c27b5a581864c788fd102ce6cd5346c37ee54e25fd696b07a2ee428c7c084dfa22ffab92102c135ec1a0949e7b3bb319cdea7f445eeba0a3b60921da011d143ae3c144ccb8c27d20560377f5b8ac2cf6cc2d745354548f1c1df88af27aba7924a7df88df3690977bd36b1e53ef0f20bff181af92dfc5f11aaa8bc37121c6944447749951587171dbe4c4769794e76363241089635981cdc7874b8d970f144864f99986b571fd4e49ca3331fcbadcc0be602d21a92db2a4165b2a49275d71900006f63e043a5a5537170d9900b4e9c690f785ed6ad359a69dced5c7a4bbd7869ab2146ab5456cd2f238d9b5b5277b6f2f807140bc1ff0f81ad732b40f4aed55708a75417556204e0ab3a297281135c4872a3dfbddbe776d5402536d564ee71cbe684f71c4d486c008f16d315c6a64d846e6f0cdcd4aed83dee419bad143e6cf8f42c6654cdb485c43e9ffe670ca1a77caf2d83f98b510e61acdba00cf823bd62d7aa05be8b633ba752e4012ccf8017e0347fe1030c2f8882231a51afd3f0bafce79afc802904b1854c2ebd3d7053bd08340597efbd32151e971a29ba6020a6fe5468b18b0ed92f34a2c5908ac2a5082292d3fc780751e8380b8bf04e06990a6b2ef974c72c7d72b878d7087d37c23b88caf1c02c04d6a01441a4582cb7343502d7980873783b726b2ef76ca239f35e20cbe4be1230ae3ffbeb6165121d58c15965955ba5d00f055e8c92e57719a5680ae9f23c8173c340dd59c9a1be3ea76767516168bb60d8a635c00bb95b4dc57640edaae56c8bf803ec6b0138d19aa852fca1bc170624cd3444d2edb867965b2604dfe163ca174cb164195d3506e4624a9e3314b8b21b639badeb56b34f173bd18e5f23a266bead096daa91792c2c2bc8b3c8b7ab78fd21ea2cb51171b2d3821a5f987ab1f769c13a1badf277b605c5d3633f366450f5e2a6d82a77cab7aed948af5bd76424d985517515a836614e919e94a40d68496d900077dcdecb913138be10923795415c8893004db4990ef8248f613cf0fdc34aae60b903bfe3d8ed0d653d008464635d2b0ae8c41a1c0dc4c5d85507e72d39d9aa72fccee4d9f24967c1fdc893b0644a742e6f9940992f2182770713d207ae9ac71b9f5938c2a8f6e381cce64986ac0d7d4f4b7f8541018eb53fca9b6438161e9ebad82703355bf5a01dbd758a5713f85d311c5f0a904a79ee20fab17b12aa54398bf65813ae3e80b839f8adb2595b1d1d3c8319df12f26d5f366f6bf5b3494109b1471040723ec2ad9e662e745163243929e3f7db6480da4bdc83b241c9db00b5bac9c542f15f93880a1ea9406cf8ace8ad9f18fee4f755a160dfdbf6e9b869082c8942249d6ea4fd88cbf93b5f69ae3e2599a1a551702a7a36d28654e952d6818a424e0a8394d6f7385f6422e55736e5cb8f0e9962c80566ca18fd520178bd73dc1c9408bb651d8e0227ea397f8a810fb6cec4ca98b183f4acfea913f362e6a82697d3c180fc7d360c638facf29f828c1a3931bf760c9bfbdaa49cd1e5768645e164b8d58213163c2392e2b725d4e4b6642c6ef616a5fa7c175dbbaf1e132ea1e92aba292d75b1dc9401f22aa6f651dc52fda7e03ac95705eefbd17b41ed733201323aca4638a76a18a62377300f255e96d839a499c399dbe7cfd967b69a2b9d8e59f4bb45936836ed8a0e8be1050609abf40a9ccc5ede1795ce460c150556076db2c0a622a6d38714f91df04dbdc8176ba9a39548d83d5d76127981e2ed85e2532a5938a21d96b81448e01a9d0810370831dcd1138404d5e693985910143a40a03597ed2e2fb0be3cd2336fffd39a8143a69d0e8e40d5a7bda326207c8fcf72317b061d26fc272acba75bc89071dfc3b0ba47217adf521bf7cb16ebd9ee787290e842368a702630593c01506bdb26f55add3031c10dc6fe7e0ced9074010844f09c3ae4ce4b4214f37552941083223e74aca24ba31b892b8b48998668343bcb3ec1424a9e34922515c79b68e21cfde887973e33111372a494348e900e5faf65b9ad38f213840810c3ac18f2954c103c3849d02b638a958858e8f3500c0e027e04b931b922253c2e3c4682949fff97d5b984179341b1690e8c69df08f5510a2f230e97dcb890274108c4878ffbd9789010a2035f5c0d3cad93b3ec5b6fd2b86ceb2b11e248fc0a1f5efd4ed3c8f462b19f02f6d501405bee512866197d87fc1c941e0f60e09a0b91118a2deb60d3d26046d91e0430f2fde75d1f6b99a6ff06786e44d25b6833452112df3f9ab6e70d7c64a5a91d39662471e1a9b9853193ff5db30f3dfe4c76c3d6474a2209aacec77c945930520a8d3142c0fd061e91f1b96e708fbe58d3ad3fcf7da669939e80bb2e8adb5b4b678acff67826bd625a3e24db5ad0e479dafc8110c68eb7a54f834968b58aad5e42893f83a7a196bc829147364ef9c9762572e0b50756257f4dc0fc3ce6771e0e95f52cc7db7abfc4a4f176febe250a3cca89ddaf931f825af13b12c7f255d9ad4c6335d5eb08917d2e5c706099c5b08c407cd82c0969016cbae79f111d15ab5885eca0bc2db9bc8de52b549c30ff1f0d3715b6c188f50ed2432bb28ae5e65e793cf03484662f8471ad3fb011b7114efe31066a89830831deb3a352fd39c64bdbdf663f4c166a854ea9f867ac9ae22fc36732baf8fc0a399e3d6aae2eb2cfabbe97bfb2676baca561146ceaa00cfb5319d182bc924c5f87ab27bbd33e1559b5ec4caf640273dae2a16b464782e3953b6c8b4de1a9e42f82f001851681548c4d9e8d7a44cf02a68b56353057e2f12d348c615194a1214582ca72bbfc28536ca84c4a808b1588380ab2f3f2bb064625f8ed89d03b2681db8d9fe0fbe496f39c82e1f4e4518e983a76079ce5c1f75d2aaa83cc0eedaac518e542775453b80726db5a88376202c622e02cf8591f3258a943a85dee0948aa8c4af8058162555aa88c3b84ed112f7b2aa1a4284923dc2a611334d7ccc6f0609042bff50fa9112a43a2be8cd163c7a21987db5ce78cbd4a59d2c7396335bd228fb24df91b18a2e65082f005c1d072d0a07689a8b739246893c13a2ef2d6d7625aece84942c811998556f7e88319b765484543af4777f84ccca93d61195f66fab0f0ee61092c91e7f8b9098fdae7bccbb47f78610fe5d630fcd982a523829bb3458eac2fddc72d439859225e34aa458d5a08cf4108b80020eaf71dd3808d574110de082a88b9d871bfc34d0ba8ac217a039531b12872b704802dbfef4f8594e90f86c0e4cc0c6183b6ab4e3ffeed0aab87681f85b98d14a51072f890619780b57f65a3635832527592bf9193aeea76697c58c1c014d90010f0bff32672894fcbe0092b59245f22c2aef6b995805713e0d6d2497c85a83ac9247e91ebdc830175d8e47541e0fbd3efcebc107be151dba137db4b48f6e508ef272056a14ddb1eaa62a711179aa7b9a349ad250fa9e7d3738944e8bc4bafff6d81737d8f62dc577aab7c1e5f75a592a9a6b97512e22194078bf863119cda277351fcc3d681f95a8c304005a8a6bdc88f950ac10a2eae738a661e46d66f9d5d9c466cfcc91ce3db1112cb4fc63f237d306b7e4e7aae2c44ad13649a00de70eebb16b013184790a2b84bdc1fd17062c1a8ab6cd166c0156a900d0ecf2b1d7b17a3ce8535d6e86bdb25b2cb842c86743cb1baaa66e61467a93adb64a5394228371829b057bfb89b95ef88f0e7b344472087ff7f00d87e2337ea508ce5f4a47a3fdeff6750f2ad694de40672e54c82048dd66b2bdaafcd60dbe473f3fe6e6dee4bebdb9d6e3935326e7f5e7f0916ceb99f3342a5b02704255dbccfedf8d4b0c0cbbceaaa9d2d1f739670d861335d98346d52f14c9ce884f81a661f3d81c728f2b61077434e06e6ff89d5c7df84e8deac6dd0e60799e7ab7ee58b2a98ab9c051477da623576848a5a487a17268d7dcc2121d3f2542ff4155124523a1c039263a0817851566c13d28397aecb5e89c8a3115121b0b265c39aba7c4b35ae1f7a477b5b31f0b6858870faa76b9a303204e179739baf32e61b2f5ec87cd320a2d54295a34fd6d686b238e1d4e4d0e1a12aa744c26aa9169be4cfa8e4bfe125e5f0067a81c535b87cc05ead182d158bb25f24c4431e6c216f74e3ec475dd826b745367231944a27345cd819863a20fd4d1b1d7c66c654112fc740190fec8901f6da6023e48d0f1178ba3604629dd4e7610e241428a42217cc539953bda3202948c0c686ee7731c36a56f1517b4c7eb1836c1003a1654969b04844f9598b9b4f5eb6730d434b2032fa78ab8df5c9cefa8f82d41bc41eeeb5e49721a208b4c7911478d828998f4641f4f1354534815cdea8148857977a82f1b8d0c3a9cac2c18566e41bb4ed44dddfad41c7547c9270558274db9eb34ee1ebc3088cd4fe9d7eb92d8294c7c313a0d9782cc4e38f9264cb69cb733e5131afa477fa809648d8a6e95099719200bfb81a6ff9add671ae113100faa14692fc8f0eb533d87b585a4bae90fb2a733c6b00413fe050d3dfa9f22c424431e8bd9cc24c9849a0948d4398bc1f332b4915213c9e63e899c0110790eb082010a9c2cf20aac3c1d7922476e12c595a6592c58ce972de6af0a869cfff56b3ed053a10f238e157e1e0b6e52ab10e7215889809c507eb924d9a4f6f20ae329a78901950057b1e0cc801c7f5aa6a3437717e075dce3aeb8feb54d4862f6721255c4132279bd34e986e00a555272d0a4411ef37e7c44da42c234e14f7b6b13741e1fc482eb55c730e944a4c9dedd2bbb4424aebbfe74a05ac70227f06af33e18d35f0805b78ae65579945d4ca6b941adca8fe80765ea594f6fd72f4ec51eb8d8bb3640d8527c069df25f2b0217cde775f3eb3f572b0331f23f78af4510314f0153da6e055a375011d8973291f7b3345b8c147685f839b82d4cddb17ee834490c2fd33fb6eb995b20bd93bf0198308353875c1b01d016f8a35f6b49417689794d608019d1dc0ae76b092155d32ccdb2cc0b61fae1368f4b8e4520fca4e6c371c4d19c4a1c299670d2f23f82bf820bd4fe4a59f31ac3c81b742f99f47bdc8806e77a52f3158de569f7b661db0fef0c90c15b2cae36c6041e0b8f5785bbdcbdc3c43310c0b840015ee22f97c1916d9c53a822bd0e382fa43aa1bb415608006e372110b8ec2f9a2e25c23f4e7798f24311464b5f2400533d7fb5074c5d48b78e8471c7fd87cdaff7dc5d88f6ed48eef2c441fabee0a8b20e04a4ed150121b785a97c801903af99491ded17e86f8a104c4076094bb0d97ef0af6f145bd3f98ccbcb286812898abfcfa351022c0790e4d99758c49722d4a514f1128aa1fd3822a0ff03e5f17d947700491bd750aabc8e5f82b0aba5da9a80f61b3202d29aca715be5411225bcca00d2f51bec0d92cd803d1915b90186d1b80f58840c1fc8343df45faa4bc6bbd4858ef732477154b31eb01d57f23f3e0d83a9f580fa2d2904c46cf2a81a73b8700b81488222d141ae920cffd5997d2d6c1083733882d73de6146dc9d78010f3e75546405d0c10d77a52ac8e78b0410b0a997671a896a590fdcfb0f9bb2005f53cec630e83163497f9782159638d0bc9d270cb32ea16b2b400950b706efb804d6bf28ca1f58ce71be637419e1cb1019d2e0bac75566bbc67de2ac9b20851d77189b6f178190fd1285cc18ca6e9a48a129e41f1a0bec37e522aa6ded9faa7ba70297536d0b3f9f10f1e579a58635def3990dc5ba0571a12797c167154455282f02ba1b5b19d3f585a45ba7547ecbea2dd85a5a8588e7fe32fe7b8ffa12348320cd241bbf13971fd6e252efb9d0d6277eb0c103a7b3c305e02cd489ab5f7b79745d91ce9dc94f5173b314552275086ba9a501c1cc298bc0a92352b70412e951264ce162dc4d55dd1c38c374852b4b54dbd10fe48fd3ff8be9039d6a155e5abffab3869b8c4a1700bf700cc859186b6f7d16a5dc21efe6113ad42cdfd7d73999f27994f40f17c7d818bd26b190eb94a1ddd0c6c291425c266886108ee48f31f1180fb28544dfd2141650da16453d6860335cb1bc96395cceedc9f02e0ee68b8dbccb0f5a8ca73193651615039e585006544858d34f5efa600a910055997d2cc4cf9fe05a9705dda8a9e3d940c10fd1484ba152e5f115cdadbfdb7435f411d0bacf82b187a2ee042e2600a5988af4075ab98893b80d5808adf4a05e26070607dbcfbfb8cbbd9cccb03ee55c41d60f879cdb161ed640b1a8a126649eb80484a5054657cebf96884d2f8af4de64452de38f5ef7d4a288ece2ad224de008d8b7f4939c4114239aaa23a720e5b0e22fd68bb6d25da6f57090c4a9c62e3ed457682036fbea67381b2a152ac60ca5ad1c20dab371443986c75950897185d932d4de893d2c1cc35b11516c051b22663ca875d0d81d48460e1d8cfdabbdde8cc8f9f286c88087a31c41b1241df85c617a0e2216664379ce1f77aed1ee8c2ed4a97e26cccc199dc9f3e0a356821ed2a3cccc102c4f93efb6c4fcaff2e5b9fb552af0b2c64c70901e2cbff2131e9cd2a98185e6529e6e3880e5304dc6a6de93835f7d21143dd13e7cc0f0c3c395f58e166fa5f309fa3a32466140362ed3f07c936e90ca3a0abaf08c75f6658b244546d5cf4877b4695c4d897f1ac5f64a69903b12e58541fcfd94b70c6713cb83bfa22df549f5a6c141423ee473ba2a80a524afa2e86aa09664ce95702e00a0a0b574bcb640962a87e4b1f4e254720f83f6600d640eab3ec5d1462ed198210a760bf608979124ba99259561da74baabb530bb6979c33960d5e0937b174970f905d0fc7223fa768cad0838a26039755911d1f43d4b2dc79e43f41025954278a837b0d948cf92b2e6e0a2132eba20284ba0ac1bdd3e913d1010ae704182d293acd28761c8051bcd2f0aedad8bb6953141bc07eaaff72e67e3feda79a1e3352cb471e33e967be29f10d86ab31cc01f0d6807cbfa2b1f0041fa0a8a6244be124c8e77839796127b044ce63382573ea92237d263437f262c300d905f66cca8199d85dd980da3f2c3293246e1f518e93dc7a4bcfade82fd9bf2ca2bb78b3f85adcb8b707a61956d343f1fedf1e47b44204e43f1284c098630cbf650cf869e5f7f5fdce6e0e30bc1868992cf02ba71f90121d1c33238354898027680e2ed57cd4c696508be88d2edc03e6aae7ddeb75a76812c9c0164380653500bb07efafce604e7f903fd7599b07a21b881d462f7d642208c8987fb2fcc2bfa22df2e50132f23acc62ae6f5a1e09cbf27b19d9f9fcbcdf5253155a72a395e58c9ad186b5bba60bfb336a0d2ff909b09e7f7e29cbff2b879fca23dd8b07a8f6e849d2ef6299c156ad71fba3ab5a6b4cb7090c0a4bc949da8ce6c22852530fd668b3afdb001c34875e569118107408b7b3f7339b4f150b8434ad46dadc9b6b41d92ea1ef8af30e4e725ad467026ddbd332c424f224d425e86762fc9421f90d79664b245e7137c37b11797d92a9aeb45b30e3fd6b03d6d07add5103074c468469e204398f9b9c9448fb7c52c1201d88d737d444bc1b761e7bd72a054f8e9ab0d437f5cbff856863459d00fbeecc38fc246d92980bae4e04c123e09c15c8a9d98348988a969f05e78865ab68f3ee0acc25384aa96c9a6942dea0a658b596c9a285c0237fe6c4b4a40564b08293fec315af5e26205e9a7ceddefbffda6c6c6627c0dc546f710e782e0002a8d1eb0835676508845ff16e2ae16fc7e66e44a4b880feacaba929f3f88d6a6ee43c3b64414402f1da820ca8a8258d2ccbe2a8b9470163cc0ace89909bce0cf4e3a7745e7869269e72a8b4216e3dfb3857e2eb0c8070ddc183a0a16ed18d064ad7be311f97262cb9e2b2403135eb4f4a3ce663270f33ec524d858e57b1435834157e768dd7130f1eac85b038a40040936eb43fde00428144ed177f2153729cf738043fd16adfe4f7cdccf89927cd97f9b56b8c055414aa1f9c66558d42538512e1c629f8deb900d4fd60c5c6745524fb4af301bd2caac08e1f9696f5754088ebc6f9bfb48a1072f7333c65e13f6bcf7f15f14754641c4ce80827356b1a5ba56d5ca86376e7b4c9268b757ec81010ad7346eef48f258e320a26de31cc015b5d3c7eaee06ad7fa92035bbebd83f3e11999d9933b64becc51483cc45bc7cc56869c0e9dbcc047027a53bab6159a519e2e0c99d44625824e20954d2477b4483761283f6c1e2c843f055eb07327e474a2bcc1b69a5475e1301025c6f0c1ad0fc722909a62182c3dd8f8699ffec82b8bcf08a47dc66306e4b268b064669999c9f68f1d9a99ff78b218f2ffa46095227fb5fbc270a88f8cf5dabe7f25487de01b6506afbb7320eada206d4855acd1b2ae4c44d60911329906866f6dbd6b5e79a30826ef90feaa35860406fdeb013820d1278f43e5048199c83ffaf4e61fe8a0a1ff609d7da26302dda66121c782575f89b49d292767ace1c5d6a6536f49089e6053cd0caed9808e642e4873d21f5c8f6b585651c2a2005c0cf5e1b0dbb034bd3bb8fef4d9ef713622f3e87f1fdb06a3459183ad7b017249655dc8281675cb09c0399496fb64f3db44d17651b79349377f6e660617503756be00483d52dd4ce0417cc14a44a7b1ca8d7179cb012494e84e62b518129a25a6ff1c8dc2a7f291205322108a34deaba758aab1aac8bc0ab4f22151a900a62ae3a65d9a946f0318957190a810a3a856e226989650491613c77924becfb51d26ff9d36601f50c57a19c299c1306b836dbf44b49eb3748a540e01ebd62d032838b688189326ce0ab5087f669f185b3de079785a1b9bcc5d31568347d07579cc7b73636dd4a530acab98b5137188b4eb484f2338fe0f50af40f2a788384e77adff37ce480fd0abea25d952d068d11f07887dfa30fe1adbd1dd21c98f47b77240515924fc120704ef4a1acf9ac09623109b15041130b3c9589148b61c46a0071e7c66d8d1a7e858e74f6ccddf1c3420b3ec5b77557828b3ba5bfb274f40040804454d3fd6f43d3ed2b56ff4f57d2299475052e3dc0b998fea8fa04d1d415fb788c5963fba42af5b7bb3eadacc0cfbb0c37685f11d162e9dda7e647b5cb8ff24d67a71e2389d380c46cb5c7d2cbe1e5ade9a89902390ffec95610c1c227c1e9f8e754d00f6a2cb7d138442ae10dc58ad833691634285ce56c762da1f7b33aed3a2178d64a86ea81b0ed33c7f2a119e97cb38cb41d880c327de6b6e1c66ec48b936339ba5091c23e7581e299f7d31ff7b2a5718f613a14231147827616d78b5d50175e6a432c78d28e9e8e5f6cc62410a11267ad7a97c85751cd8b537d0a82b42346296a86be965cce4ca08128462271ba140853ac91ad3d28e98dd95194a55bd6dd89ddc244e3c66ff0fc20a9849ec30fde58c9be37ae8cb5db1950cc48e5776f6e07172f02c5b8d001813595b9c36a4fc351b16cac187b57b5a7cc55241d767316b87686d487722c0ebb797874e0e21f69da655a219cdbc3d2b52e212491d5f2248d1047c9d82bfb0c5a0be81b6d4a364f2b2258fa6261bd7c911c96b322421c4c843a1e94db6c3be68c81449b15724373baca1b703b9f3e647fa2903b2c8f973e111231bf5d0179d9e4c8902087edee899f0d86fd81eb7a79b8ebe61da0098c996d5c716ca56f3b52aa30316f0d88fe9557b653bd77401a016122565cacecbca41e6892c345bff3fa41ff8bf1b95568e2666cefe88596602f655b8e1d07800a7031627094c6ec84afbfafb810843969273f42700ae0ea28ed0f900783f0417d8450f73db002196ffa6318e130f6ec9ba31a7fa90fe4605054cca744c63ab8676d537f836fc0895721930828ea6da82f1552e2311a5f6128f58112b4841bfdd33e61bc759c3a504053bdb0c05d349a0fb4a935b86a923679b6e4ffaef779e703a91095b92333a4e0736ca19fd4fff07372eec3b186ec6dbbc19b154dc3ea9f2a8c301ce0d42194e06d63828fab9f2aba25896382f30a6a90c9897a3daf727ffd1a04f1190d168d211fe24718c29a6261c2ef53b203d8514fdb93ce4836c2cf77257e5639535845d06391e1add9af8cbc2374447b97fbde30f0b87cb9ecbd5411edcd1976adbe7484f02935b41e9584dfeba82527f59e6bd87962a0fe39e415b876c9b848e1aa21c22509042f50a213092dc5d737e6525a960a1ec8ce4d16a14886fd72cb256028f118b003d5802c8e6d0303fe641c0e61734a01b5e2c78f8d802008d5da5b90e3dbb76e79ba405362040e25ec315b223ce09005055935aae6aca47423cb03950082163631c878dab211f36b73aa878bfe46b470b0e92899182a59872bb6f4022fddcc2231e13ba3aa30e18bcff5828928d0e709b94e91fdd411895c995508caa377f4501c72f0ab93a491736ebbae5b55a7e83ba990650308c2768dc70843c37f8cd0fec9776390fe0298b834c088919964d36ce42cc54f80671074660be02f2bd9456a79a2e57e23e02b66bd2624cb183b841703e0d8c6ef2ede6266f882f750672fb93f4b9c69a1cfdf2ea665a1595de011c8275daf0a30f134cbf37285815755c840f35417940d3564778ce080472720858efeadbcd29118b41c7ba96b7cfa88984f8e335e95507870f00271f4047299544008eb3b82f45914c8720eeec2e22a49a7a939dbc2b1f516133e779a55dce473c0767ef280b36813a3648b932c3b5e4dd23a198271aaf1401559882f889cbd7077ae10a3c65f24c8ea53786f65757af19bc926fddfe7f9b29b72d8d8547e237d68efc27733289fb258afff9258dfa60c2c15562bbe8a84de53a6e311b63863ccce9d36d8b1ee83b10338efac283d0dac4991c4df028908ca6a8818cf958d74425a23f3bec858357699f15d6b6d5685ef983c5ca3e23ab5e1a1b1b1f5bb0ab9caf6385b365ff0ef51f7f2eebed8cdd48f9e9b9a45e16177f3bc2f82886b50815477e3d712d8b876f93586d5f15f4a79d59ebb3c59526aa0a6cc625ce4940f7d540e79fba9a9fa07dea01a8630c795c8bcec0ffde6e75f35435bc03b150e2fe2833ab8e4d338ae2e33e3fe1f2e206869cbe8931a083b3d60852ce78e577ff7565772448076c0a6c7499335efb470f3ece08cd1de703039d04e2b9ece715e4fc83b85ee6808b42abbf9ba792828105f82f657c47ba8ce4fc73c332b5b94ee8781d9e4ef65f70a8590a2e2a6a143f3e72423d6b4a37814737a9d54d387f0ceb464acb0ec53810092aeb0f9185af6ac114c095cfd8e4de107190bcd00c4f1b53be23d8868fbd16973752160db0c4021c500cc6485b58c5718c3ff58e3f7ad61a7cd3d1054aa3e1616f8329c672640b6c21aeec5c04208445f7be58e11ad8cd4b33c77a4fe8fd51122bde0801c8bb40806e5481d0cd73c41c11d71ab4aa7b690b8210525f1b1509a5a01efb297334a6c3995380d29715d17540675f288117064a644a7336e37f302246c1e8c536e00e1346a06c532a1bed3d29351aa2bcc7d8e62f1ef6a2bc7423e1c99ca48eb88acb555c38d273e20f7944a8e4e41a3f8a1abcb392015f751514397a50cce2b3a9097c60d971eec269a033c97ea2606ab2fc3ab299b5fafb2aba72c533fa87a89e5148c6572996ea39229da3b9312fb83517da3b06384c0525b2a1ad46a122d9cd9fa0568e1e2eec75d2c35263e2857e43fc3d712681879584c6350dd0cf503bd0f347078c8fac05856646b6059f058e741316f7edbb171be65ace011e30c297848a262c30f62e5a2da016c99ec101e878760fdda497dd9b16907222dd97e4fddd2c7d3a2a5575da949b5063365d0085cadd25209a07e574ca8b790ad2ab1445ae8578aead028924b19e40b98df893a615ca6a0721ad3df00335e44bad441e2ec87b2c2119a4ee2d555c4d7c4e6500e9990d514c9daa1cee1594dccf8a78e72b954899eaf46ea2ebcc0992832ee01ddc9ccae964313b57787c74b484740f5722b27a4bd0df560be3bd9b745d08e5f25745744fbd9ee2bb658168688e283c4e365301bb529f0513f064676d321debe991b069cfd82667a56746fa1bbf90f3f3b184fcd119672be6f5472c3a7622bdbdb59b3412e223278b1fa5d44219ee9812106807c6fa5d92a4a5ebc828530b87525c2772aca84370a140386484f8ce112ebd650a9dab52c78f231d758e6e836c3ed5b4271710ecc5d5fd55ce2291bcc0e6151dbd003aa8d308810dce7b46668692dc845a7e03c491bf3fb5c94a6de939981e86baa15b3bc23e5ca6e2080539c3b9fd7450a6bd33ce23995313fc7418453c8f3a95c277387dd2a1b1358c90392a9d056e10f18cd59f74dfce3a8873370796079ea1aeee201633e3bea90e6ddaf92623b9c1602fdf6568d8dc15624778e2efb0ab939609d6e7065489d2a64b9cb51a1e260ae9c0e82704250a26377477697428f276466474448a6fa8e98b061b758d31f02136c18ceea5cc26b5822d406ac1a10dfee111455a25823541a40e2f9ad91dee9612a10d08665d6a61e72b6e6a1dc2ba542e7f2cef6bd11a7a817b9608ef0c82100615291cc87149102f875645e26e5664bb9875a3add62373da9a741f0f874b337979e3046aeb97a89fc84caadabb2648919e6664983ee28c19029e70560c971aa133502549272316f4135295acd0ea43a5783a4b50a22328aa99212c330f48958a651c8cd0597b521dbfcbc1d157aa490f35ae1333f14ad62a0f9d67b52e312225092f39bb84643b6bd3fb8dc6534a94260a07879cb585dea8edbb7a8dd9adf76d9dc05cb532ab8118abd01e1fc4a015963e61b5cd99c05fdb60973e947fb50c9708f3f86e69c36a1973fe650214f1c32e815a72de0e939b47065d4585466b772be5cc9708cb55d31ef2aba2a7aff123fa059ce7f6e06a0ebc38fbd657f82a9505615d2c6b2f8286cffb29b7446b7cd840be21418005544b863756eb5e76ad412b4e5c2b579b2bf9beb293346bdff79325ab47b2ce0315cb8f788208ee22852c137c715ba92271cd0341505e716a41bbb3f8cc94e60a6192984339acf97eec9bd6f37ee54f1c4c01fbc8cd97cab12603ef679aadecfa99864f71933e867c006f4fd791a04473a157c5ec8fec0e59cb88cb96a4fd2d5698d3a349b635ec9a1c8cc394fde30a6aa5638b857a2fb6c8b47b123c1d4579644862c7832235d87bf68d0233f1cfc89d957783a22c4fe3f1d429db9cc6acec798d7b957fc6b1526b64c7a64ade1b07a89e608eb5ddd8fd504574bc81bc4e6d84e390b6b7ed8599ca155ad3c689ceb880aa16aa09a87e26e3f6e846f800178d1f001845f532970d36fad421cc7994e0b305800c2d6d161dd3f4a9d40f146e823ef21d12f7186c03cdf24da36ddd15d12923f7d42fd8e4591131cacdfbdb3628e748d9abc6c1a771c054fe2d225b41ad2af1b85b62761e238a919da3a7122ab21388fbbde85d626c72d13848bec526acda98c4d336b2672419688387a25a89eaecfa7296abf9595edec91588ecf975d2607ac83090ddc7a0b1677002e1c53c05e93537d0851dd5077980ca104c3e6a18e247b2338d280d8bcc3140b32e08dc6b75231cf32d29a481c8a5f53cac027215d003ea19a824befd0441215eb577cd374a6c3b0bf381d416fa3a06c0d7d0f978a3acc5b358cc32f917098820079383ad4065c74fcd400ed64a6f810e2e83a5ea1270f8c60754ce2f1989900a94cc418be5ed2398ddf079387580d71a54854dc57113ae033a6340db212e2976bf2dcd5e4c0d086f9f1560991b2a39a600569cb692b34c0f950c1be5d0e8d403987098cfd9ef13325492af6600f845bcf6568a8a111e0e75a937c0c0ff3ffb174b3d0d7629cb242a39a0d14018058682d1c284f611f82fb8235e5d20b478774fe0f04db0861520ec2b4f0c12ba3d1933b1f6b2173fede38afa8cdd5ce2e3570c9365f75f10f665d0bfb8adb7ab7924e217d262e949345dd88aa539751fdf4afef12f610eff0f3533726c37f8cd1b0011596388569f4b11d59e22d766d09e79e004ddc2813097f89817003094d2fa069c1958d06bdb0614c80fa78e297df0986e83cfccc02354109eef2243bdb6211044fda787a8cc8b5e07a00e81ba3cfe26930b9a8f792ea4dfb861f1987a35370eb4fa91fb0653264c01dd10efbd37cc47cded57fb003105eaee7fd7289f2f8269b2ede0422f2344e8dcfe31ad83101972037d04a0c730b1da0138287b9f590dbb51a3718ad0d7e36f38f7a087305461f14d7908e91faf9dd82186da6326ca19d4293e3dca2766b4cc87f4d8511609f545a6504742ed9581c7e7e937f11822a548f93a51b9294d7a816baf542fa4774737f6dae9599c4fafd60d7dbcb3d74e4fc18aa9ce7764f17cdf36d6d1ef980ae540303b79e04df084e9caf1a5b1f41f6df25b868041babcc4bbddcdfca1e0c4421cb91c238ea4d550a53b66062e53cfb7329c9c3bd1be94cd933bc2482dd710bb198019cac0807f9edef0011c4776ae1cd559fd6656ca35bc8b3f3f2b12b6af27a9dae08e3dd2fe3062ee89e21196cc057de5b23155e681f8869e45e5d4bd459bb2636f3e1f78867ff5d49ce11944f1e271e7c4a8365600be125490f499974dbf70c0cc22014dff9194a3b79a460a38f6bfc7f5e9bdc1a6fee9598b6d9082bde2f9fe1637e57b33a76dee2f4e274bafbac5a8a758746819bd902eefd8dfd2695a9ac25700c4b4e4b59ae75326e6ee5c33658ce338c53932d243eb2cd3900335f1c21f71b17d639e033cefaafc23c6c0497675da3722d0157df4f005019eb0f0b4dee336b518b5d86544dd6c847daafe1eb07cd11e7ea08bdfb9b493cb75a756ead99eb14412e4b2078fed5dc3db0ad40f0b8907abdb7b9384ff0518e7fb5eb1c35d1d49af345be4a04ccc6e38049abf81fd3e6b7def674361869539318ebd122294fc074007463adfe131c4fedab51fa724dd8b58d39f098f03862c7ab32c2a1138edd48f548de2cbdbfc2d508c1cd8985ee32c80aabf16ec4b395a740cf4a9f68ff4422e582fb8118466d5b3b17b4f2d4ffca758c3beaa148c302f4e38f5ad6fce62090f43c0dc35bc49bc47b148d2fd4af41a97f3cf1aa103b6d2373dfca033c9003e2a719264835643ea59e065f679a92c1b0de900ec111cd47ac82b9f38d0d4ac1e0e37bd94adf171f7affc85e4cc5d6c616cdd5b41943ce7fcd5c241336af736cb8ee3c08d8f110c48fe3bd7fa754ae8e653b4e9fc84b48cd009bcb3cc10c921b5230f6521a1e1d5d0097d90378aa65955a1a8940960e48527701c14f632c312237de687cecf81db43be1146bd325a296e68199e3beab4542c77fb2d8268fa5c16cf5c112fa72d12bd9d69c1b49e46a2923964a04ff065311ad6d663224c578e5bf84e9b0a57309d9ae2318b9820afe66b2155c40935945947b8fc95d03dbc6c7976a3e13e7a8f6d73914527cf25aa558fc187d2fbe215a7494228737dc052517a92276d8a15297dd01b6e1ab70fea69f4b179afd287e60d92518aebbd9cc467322d0a0dd5f456c8ac3bf8d16d49581115660018b37e4f42bc949b1aa7bc59174b175ee42021495b14f8a915bf6c5e997ecb812717772ffb01edb586d407497981cd0332ea2ff3af7880b000c6531fe792d3e26f1b8ff087aab3bfd5a015f696dcdb177369d9d8dde6f77c11f97f733addb567067a1de3ae95ea7b3f9d1b50f80a33c65e206ad204e3518424254f57224d61fd356fb35e977543afd34fc0dfd1b714d6dffd91caea6a58b164aef4429d4d0ca23d1d6726ba636367170402bb00bd166b23dade742be010913f7ab1dc2d4d9d6f0db97ccb57619f2f51122110da974d037bf62e72f9a566fd1b5383a0fe29200de30c82f16b24b62f9d49a70d8a09cc3ad0672f3a6e8ef1c5648fd944e70804991c988d70ceace4f5eb0f5370f87b8c90eb0fee0b04584394d75224a41df6ef369b00d14d17d56b74ff5d979a9e68ca5904e22a661d18f0a4c11f6dded4587af58f9049a624d67e8b75891322446cd3dd8b4cb104476a1b44ec15521a9c5496fff9d6bcea8e4d04dfa16f966bcdcedc1c99b711b81df04943d9a4534d9c9c3ec76442147bca90b291c389191da5baf1270dc88772d63038bd841b52bb4b813566901533f74b539b49eaf2e683c8b6b10c1041f90b0e6f856adeb083a5f0166b3fc9302ca0839c79b04a62d4ba84c4136d4e8b82f3b83cf1e0fe329d1416f5db339a386d0f2173b4a03811953191266c63a61ef9650686bcfe30ac2614a77d4d2176a018cb095420c57caad5ab7b42c348212cd9dc8021f9e5802763751cc5eacd039cbdeb46702c8c12530e1a6f1228c811bcec2a5a5519884d17844d3951659c3ee8c0768d3c2d75238048ae45bd4d531006e094365201b09b5205f57b78d5b5255d67c66dbbb9c7705029cc9749d412a3d5ed0aea8bb24dfb90d68e6b632361c71d234f1084d2715c853142cb0b35fcb56a27375d5a8b6652f56c23caba78e812fae48059f5cd836c920b6ca5a202121edfcfca1137dbd973d41953849a071dabe01053128e5ee6cf0708b0a967f3ec69b5a64f9577e701e268a0b77cfd034cf7025ad75a8e58309c1137074d3937cd5e412def3d6e9aa391c1ae12e4e2bef951ad5247c984f214f813ba0afd819d7406173808669801100030901c88917b72b84dad3533774078d2bee39192295bf1dbda68c9cade22bbbb764b99a49401dc088508a908a4f939dc0bc4550076e8314944683bd8f8341300874a6a019334bf7487d06ad8909bea47c9435869f6fcd0db514e69aa31d2cae11fbfc2404a53f45266874414991ba4d0d541b7eb3460f95a0d2bafc02876c89e335eaa27f6fc99443455981384e6890d9baac2f884b161559334dfc665b9b298a4f052f170c396c09e6c12d174a9427b820db3c31aa3c3b33bab499a5f91b854aa1d73a9341eac1c03dfb02437591fdf9eac8c7de6f2d28d3db9a9c67869fe45754c88b7c9d54163571932c4ecf935bf97e697dc19ece6460fb307014801f8602b14329a6a4c2ccdaf3188267bf252586db04faad39eaff96063cc31daf1b5918c1157a3b1e00637743c31d40291175e985cb884ba7b8c315a62d44f470c96f8eeee31c68879213d55c3c0f10171c58d7829becafc302faad5f13a964573695967354bab4c8dd7520e6f17bbbb539a8dc6dd8a492205965faf3b672d77eb5e93d03a9bc5e86158920bc49274e8653d316747cc0b1951e2537710085456cdf6976ec0f2ddaa61891f43b47ee8ee5e659e7aad4960f94e3f4694d051987a0da5218b7921cd8079513fc618c30b934c4aa6c8e4b2c48feeee2377175d96f8d1472293110e2e38020912a868f277fdfe1205f892538ea05ad5aa37744526a1c5135a3fae64515c992b581738ce19578e084213b5eca86344919aee78e54988e3bb9ceeb5beaceeeeeed1dda92b21a9a44db8cf233724a5218954e3e4b223eb838b486714e2531a5d6a41c6af3b4cb6bfcaac79a6503da30e81a8767c9ac32b07587e7cd0524aa9534a69a49ba865531d5a60bbbe26b5824a9f9366492b13538768e323f2e46fdcf8619aec25830b891a649c31fd435e9a4ff2d2fc909b7e20800e93edfa46166694738fb6db58c2040e43fe35e6934010af9922a2517d4a7ac305175c70c10517ee5c540702fd41deb841001c7ee2ff3548243c0a856a4552adea3596ac93c6182396e40a638cd1a5eb4b4629638cb1b34dba921289a4922271e95058d2c149c258d68faf7529ec1f774cc53cb1e7be71c3daf37f0899e6caac7a34433e425c5c9dabe31e536e831db69002092dc4d82c7183924cc3174ec801155e5061095291309cf01d53377862d349011254c1450fdca002021774d8f40a5d8851240c2920426a0839d8a005dda68f83524a3dc620e808f69cb389ed083936584314aa26080100364002dc1a1785a08f8352fad84d09684209495480842a0c09c30afdd04c39d9f49f3e69a67c36fd1b3385fe0f33e5db94524aad26702806918d60fb9e130a2d723fc0b18a2ab4305362155518d9fe35c934c99912ab6802915dc1d8fef526e6a03411c5dfbf23b31d403f7b91f5f535edeb674f3f48114bf7906f351020417c1031810b884ae526aa7a686fbdd7fed23d2c7e8bb3b52cb2b22cb2b4c801d96b0f01f9561b615fbe16594688acece38af7372e0652a4c7f69ef7b8bf692017c7df9e61f9971639407bfb10d0de6a238af4c06fdf08efb587803502bffdb812de90c0fded2f2f7762ee5ecbdc7f1f6465ca1af0e4d140a40caa46e624515fae375dae38faa6e6d8d3fc50a2b4c8fa202b1f192db2341142405ff24156422f6bbe970fa4480ffbde0329d2437bfbda5fde03ffa781c81ede630d447a1ac8cdf6945469294d6525fe50e2cc2c8baccf2207d08700fd2982407d292fcbcd1644c05083cce9b4c2fdf7457a749f7d963df73db22b93e991fda781cc934f999a7d384fd944c9f8e906c74f3713a724877205e54f8e5eea6837f6e38afdd04f9e9f0fa4488fecbb0752a407f8d903f18739c0caf79c0652a407f71e0dc4f3dc771a48911edd731a8847cf2ed34026a895902b9f4ed51befe38af7e1acf1b4e8fa202bf526853fae602dba341142a2976a90958a33afc071450401b992bd5cc9defbee8bf4e01e8b1c80dffb1ef83d0da488f54050db1fd7f4c0df69208e72afe1b4bfcd7ee3257f2ddfc415ed434769da88227125741923ac16f5f8edfef6570329222242fb07c4154d43c0ca71e20b19c8e0c8e9b4e24060e6cafd23ec6f5ad423fb0fbd66fb97bc01c7159597dc8d7002204c610a494ea795b872b51147587dba3845ae408422a04ea795ecb30f5db5fd3d26700184a47684c20e3d539a2e70262282aabce47f635f9ba6bce44f0487f58666fb77622c1c37d19397fcbd83dade81d9de396db772b67fbd59559c9ae3a608838a917153a489a9232ab76cfcad1b7f6be5a6b8e24f4f6eaa375e5ac17448652e7aeae890a2b67fa427c7c95e0a705cc956e40e1da723b3230e47e020f4881944529016708d266bd2e93292aa087c477bb949c652fd8879007cab5327adf6f23a63bd7579d0d2f400a69d1d5fab568c28925624ba54144e34938e1331f4888b288d1ff21ff9ff4cf16cff217a4c1387f23f21f2038eed4ea368b44370bb4cf59f5193ae1b38e2abcc5a6bb5ae4c2fddc961b4ac6ad5aa3540f70f6bcba77e043a2fdbb900874e4835664ae82fb13ff66b92a6bfbf8bd4d8be539c0264fb5f165f16bb76125894fe9cc0ae1ff3f5968e92caa7343a5a03741e21fe15638e121972508c393ef9dad7f697dbc59f622fc5bf640e4f05adafe35d1d86334edbecbd76d3b80c63dde5753e0bac1efa71d09431cb5d62dd4b42269b6b49ac1053fd0aa0b15da60eafaa434c75188aee34a6cc0fdd6795130acd46c1d4e1ae9962b263c9d6dc7a0e6d9055ade7cff6ec4eaeb1743770dd968ef50c6eedb29ebfad61d6b3b7b5cc7aeeb6a659cf786bd67ae6b6b66d5bdbace7bb35ce7ab65bc3d6b3b6b5ce7aceb6f6d94e8e2b9eb1ad7dd6f3b535d07aee6ccd633d5b756b20eb996e2d643dfbd64aace7b9b511e8e3013fafc3dc76ad9661b14464b2b9082abd2c4e5d8740f6d447c820753a1777fc18e4053860c31b9c1843129070041cde70c44acac31342f67c27c0f6526344119dfebc2c74d39952b2e7177bbe1482889843c6945f6109445082913288210a2eac68ff1f668ab55d872fd1f3f505f61f6d2993ecf954655a24f878610c8646d8655d17384948c05859385d2668a2aa3a321842b5b0a418e2f1a2970d4e05020ae6beae0b0c652186c625a0aeebba2e1b1abfae1854615f2b58b91efc98239ee0b8432c8416472c1c82a2ee989a418d65875cb27ea40287fe4f4835e6ff09a9c64c095f4e02ba640c5c35d62ede6fda05c49e053108ba5f1f7f3cdffd3efbf835fc598c37fbf8b378c3f1bae2456bcd59859929ded7af4366caf75573b83ea7c3cde36836f85bee1e733aaca88d61864c12fe7879781a67311bebf0a5a26a57abad15e770db1ee7ed316ae35aedf6f8a5a26cb5366f8f7318029ccdbe5494d55b85d9e14b4571c086033721c07126a6005351cec4144a503d122fb16911a41cde9c7d15e7b697d13d1d76dc83cf3dd521b839bdd91cbe80db653f1eec29f9ebf35463d05fd8c371dcdf4f47b9df74f8026a9ab6bdf65d0e6dc769df732fda7359d4bdf53c51a7b5b76f5ffb8d7b2d872f9b5a8dfb8fd32fe0d634ed82ef73af326d7e0137f7026ecc5dfaf9fa1c057db4e7aca659eec2d85ed8f2c8decbe1cbf6aefd7d9ca69097b810dcb59eecaa3b93257097bddff205fffbedf368fc7d3a0441cb795c9669dacbdebea6e02fc749da3610fceff31ef4f0779edbdf7f3a7c01b7dcd91cbeecba79b99bdbe610eb4bd3386eabcf71dc5b2e7c01ad66b204be76f802ee0ddcf723cb953bcb9e864244e065d395e8051fbc600a2fe0ee80f4820f5e2085cebd2834fb5f0e7fecafc3efefdd6ffe63bb0eb7f75ec5b3e7b8ef3e3449dc6ff9b32f2ff798cb3edbaede34f79ddd9cb65f8edbcbe18bb5754efaeeaff97b30ffe9797f1d964ced7d7edef187de75087ebc3c5c7bb8d768aedbf61f7f2d7bbf3cb6a736b49be3ac167defd2bdfd4fdbefac73f6b31c76f8bf77abb9af5cf61f0ce0deb5e87b7ffa5b167d6f7f0bafdd655af4e921e216dd77c9fefb9bfdf799bee224599bc31fdebd65b71c52aa1dbfd52ef83fedf2f9ed5566975fecdede7348f58bdd58739f8f8e25fa876fede96f3a8c21a87ff8f63cd53c1ee75ee332e75ce7f6b7e73cfe147bf74e87d4b9e94f759cfed367f6987d2e63bff965c15efb9ece14cf7fdf6b5f0eade8fbbe0b71588716ece877f4fda9be1fcadb7bdf7f0908b245debbb87ff7b8a376536db50bf61996bd8a6f5cc67dbc5c963d17dabd3dcde18f4d414ff5b76d0fda3c4f7308be65b50bf759f6d9101fec69ee1e7bdedbbaa7df3d7d4cdbff6497eed3e18be53e3ea7ef6fd97b4fc6796e2f87a0eee4ecb569b91c666fb5781b10b7e8fbfbdfdbec3dcddb7799cbe18fcdfd97b7f7b4fd9b5d364e47f7b8cb91cbe1f5388747ec4cb4bd0b7dee376db20416b5d0e75edb179b7d941bd3328d6159bee7b8af1c167181f0c7fc8bc5690eac90832bb87eb1bb0352e6c00a39b082c7bf1d68f7b51cfad81a47e98659ea631dd6ef786cff9384bf66cde5bea4183f47f1638c2709bb96e3eeae5499f5e96b1147169b3e888a4d1f7c8d25939bbe0bf8f4ab0e4d3e5e06809edaa7df9768d0657bfcdbd7d7b66c69211fff60e3b7af452e0838a6a68842d3aa8db7c57bcaf1c0bff1d0fefed68938ddb2fdd5f1e9d7fb5e0eb5057cdfbde31c6e7f75c91878fbfa352bc07b2c2f03ea532dea9efe7d9c45dd6be1b5392dea744b9ca4fb9abe3af4b1e96fa1f69d21e4fe5e65e21ce2f734ddf7e95b7fb5cbf79d76b18f690e37fd83ee4f57fdf8e56db13a9ae81fbe415f1febb044d390fee11bfc0ad2a1dc2098c32336dd5e568b2bb035df9101e1fdedb1a69314fef00dead0884dadbd2cd9531ebee9a6e924e1bf5ad361fd1fbeb10e7f38a594524ab7d03efb26764bb6efe39c75af85767b4fa7e9df7bcdcb21deb4857baaf1a6b75771ee7f92e86fb9fb9aed5fcff43ebc3efa9e4c67897ebc3cb878b54bf6da675af883460660fb7e96f1c78b392d22b7058ea929846ced31de3ef6f6719a3eef7d9c268fa7c3eb93e32cd5ed6ba976406eefb71c66dfb9da05bff6da6be06ff97b30b77cf137efbb1cfac0fa7ecddd7b997b1557995c9ebbcb61a67fd0adddac69bf8120bb5e96eeb77c1fe7d0c7c6dfe596abb7fa1cce21f65c0e8f68d9f4d5e1115bfbf8836efb51ee4cd3d9abcc2ccbc77248c48e7fe570023e765c61b13e5e2a4fa7d369cb8f19f0b17ff88ed2b3e5cf209ee32be4e440ca5a02fbd3fc92a5b0479439834e683453fce9872f56cd969d98235e9ee98d3268716a48c0251a07053cb7fcb869bec2bec03b5a110530386b472ba420644b182de405961fad8ccf111740b2fae103098eb5b2b1c98234d954ca260a118506549cf69ca914864aa5accea4993253661a99355dcc9a92193351136562221a85e6101818199f29649e2669fe3cc998e18943b01443e6c81c0c9512c25723712c2d576b5871a8295229ab93521d9147666e6cbab099b1c1828ac3e1706ce818333629cc05180a6341344d9597b018a45472da4cd21533362a1b1586d2c291a94a51914292e25033a9948d118c20316293ba68666c529d8f362565623cb286a60b1a1b0cd5c529854921a7931c022361240ac80790e4d44e0526105f2e8064f5c307121ccbc6068a0810a100dfae6544a9f388d065a118ca060b2a0ca5052ca269a6b648a552b20d1c6aa626151c181c0e8763a9b0a905d8d410f1888dcb3263713856a498104d1c0e8703059b8b868ec1e170604c93a567165385a19a7021545256a7a63a99f45d7cca4dd5a6a66c523765c0386e7471e3460f73140af5200009621c53a2096b0243d9146acfb7294bc534552d541b19549b0b9fe83c11124618383bac313135688116a3c37830a04579058eaf7171d228a34fdf42973d55f3a469510b5dca5aa59452ea90fefcedf247fbaa5266a1c59390abd9136692865498e9f452cd13b63a970acb347b370e77de077a3e36be060ae19597e66b2533f2e666cf1c1c9c3d5f2bb126f69236526562221a854420191f19333c920d336c9c48e0f052b9114f09e1ab9147bc3465ca658e4cd57c2e22a112ab3d8bc66324cd9d91325e9a2f6550a1dd59dde063c47367648dac3111e1d08d64d85861622a1238d879c22717162e55fc0b8b689aa76b8b3ded699e68587905feac43137b9e685016e69aa72762623655d6364a9f12850a5d37c8c1ca2b74b01e634f1ff0e1990fde1979923a904ab0c31aa39da038c53a02922d614544c0a60213b879990130dca7b3f1414dd7759dd705cf8acfca871f800062c4c48889111316c7e6c807c202715966b207e2eea0dbc68e9fc3c5b4b782020e3f399f1c37dd7953573553bc9b79b188295e1722a95bb9095b1971d385712c4453d74554b9a9b3f152cd4cb13893e4839862d11049f341a01d762bad5bedabe33c9e116e7b46bcd567e5a64bf37d567bbee6e591954539381165becd3faead811fd8eb0218decd4c1199015bb94974452ccdd7624f6cb5853db1d55e6163885411653ece222311653e974534114526a2ccbf306e120d2196baa8e96cdc24922296d0208ac2e2cc14110d2269fe141d71c19e2225ec09b3e7698720994f1b22cafc9a3f61441ee66f1974f3478c499a9f65d0c94b13040342ed09c4d541b7d49f1c29e01949926cf9f367dccc146c48132e6488182e040c31c400c6961fce24e10c31ec49c50e473b1ca1f6fc116afe2866a6d42c8f9a98a5f92997e5ea11ca34325d96511393344f23d4895e7a4f3147dc13b4b179836f4a7e788f78c604603d5f9a0fd86581b0d6da5a96212fc9c7ae3c03f32bd677f28ca5b57f1a97c64d7896e4cf4ba39d5c9b93cb72b580c36519a1aecd083542792b920e3bec10006fe5896192e6a35c966b1351e687ce80c34fce6acf07c1cc94f0fe27e72306e804123253eadb502dcad032ecb3c62188d29471946d1a3218d53a30050dde70c5a033ca5aeb0d431876a7e666891a297cd98c813529b8200583b71d53353dd8605033736b50330327d4a8e08b9a11bcb58332b000072760700b29604b8513d6a8c0620848d841911d3e2ec30e6aa005c6764cede0053bfcdf41095620fa02c66b4083143a0003d64117b5d6ba81a1832cb620606ec7940e9a60691d1841017842f242074484a0833074c0c4450206e5b801df2fb6256c76f84028120525606dc7541125dc14f94111299ef427a4222e2822e48b2d05f8ea821218a4c211f05dc20e1fff80081076889f0944a0d8e19381c8123bc4d70753b86193a620c39f4cf18529ceb0c3bfc199c07eb6852f61fd8a5f36dd26aed966dbe6f605f4742e0b16f268a04ff75a97add770aef7b7af79f3cb23538c5fa3f4b7fa5d0ec14db78efecd61f7f1a5a48f9fd2d7a2a896ab0ac87e7b2e6f4f73f8c280aefb10ef2edfdf6e97b77875d8adfbced33b44e6547bfa5d7e01434f53ad85823e1e4c71f7dcb75d168ceb36cc6af2b67419c3977bda7dcd74eae0b69abdc7597b8c1fac1f8ffb3a766e0b96c5af5df7f176af32b52ebbd8cfbeab1ec6184facc3eda30eb98fafe22fe00bb8bbbfb90372dbf72ecb5c97b71d5c6ce9defb78efe3cc7dcd9f0e5f62dec1cddb8259bd7dd6cd5db3bfba8f93747157352176acf4298883eb5e0fca6296619f957c16faccf319989960261e0fa85d2eff12509661210f8685de3fe4f18072d84449c8ba2c5768c62c799f2e6314fabed3be5c5f9b9a46ad96b7ff767ce0dedcb588d33abed77ec37f7f07ce326cf23bb0f758ebd644b760ef79cca339f58f7701e0739d6feffea0120560df7dbd0cd83cdf65917ff69de7895cebf0bca7c397ed596bf1c5d645347e87e84dbecf3dffd1d02da2377991e74db20dd0ee1dc8dee1d1e1cbd6321dbeecceeb1d42624fbb1cd2c774c918d85fe301be6b17f039ed027a7f2f872fe0cea0cf2879fa2e63142a799519ca9ce69a6b3a742fcbf5ee9b7665d8bc3cb29dfd2cf9f0db9eef621056f230dfe3793a5342eff96ba698bce7ed4c01bde771cc01bee7ed7bf2bdef3a7cd9f7b5a9695aa4bda8a57bee7774cf05d19efb1dda73d1cbdd157de87d13bd6b5ad4920139c606df358e285487f4b5774df50b1864db3cb7cab43208fad3f3fe26394ed25762f7f4d0dc451ebefff607eeefbfd742994ed2f7a06c338e28df534a5ffb1d54c788a2b7b6fdfd1d9bbe3ac8f6ace5d0bffb90f7f1722a33f43de7e916d0fb83be77fd512d6a01df7f03ae6344094ff6f7a0c6f8fd7760d7e0247df3ba2d2aae5d565e1e970e1f7b6c675a96b51dd9e3f7ebb99d47b7648f3fc3f772d7a5edf62a8e617f6994ebe2245dfac92ade79cd33ed723d865d8fe9f088ee8b5abeef7ec7d7e91851f007b9dffd8efb5d77f1376ff637cb3176bc9ed765bae53efdab75578b5ae8dfdfc0d538a2743a6a570b42e565b9b47d2e6befc9ddd3bc69e0c67e871c63b3705ac4fd0e4fc788e2fdd531a27c1f64735ad4c2fdfd1ddcdf0fb2690e2f2e7fd9cbd62f7eed8ab06eb9af717a039cc611457baa7144b91f64c7cbe91ddbb53a3c62631f351dbe8041e4be28a6af2bcb970850c7d8113208e8d90a456ced350a8218d393bd5d172e62fb6e8849aabfd14a2badb47ef864573a4b272f272f271ee8d4ef63ed66cbb395fb7a7974affd7d9ac3934d37bad18d6e74ebb446b7ff7278c1d7de37fc94e6fa15c1e12ce2be7b7c5d18dfed763a2c222c62d7bb811fa86917efe69793bd7d3dd9a0e7e9922d04f2783cf8b7d7360fde366df3e04ddb8a18d97df23ded6afc40804d879824fadde7fd9f7aaa0e4f3e9f3e99a497135cc4c9efed771ded3ada1b18fa726857cfe7e3f91edc3e9cf7797ecbe07b720ba8bf223e4fbf9c14f172725f4e823411c4481138ccd085232738ccd0052b3ef7b8e0c11cfad8a0e7711cf79bf62ef83d2e83214c297eef823fe8b59f8fc882ba37b93ef8b50ab2dad35b759801bc3b20da1b089243bcb1e75d2d02dfc5fbfba0beef61af7bf062ece5d0c7f65e5e06e0a75a04be08fcfbdc7ba01e226a0f6a0fbea6c1fbf7e6d0070dbdaefe57bbbfdaa57b50bb803cae7618c48144f6eb73269e8ffd7cb80fe7711fcee33cefaf690a75efe1efebb4c912f8b9dfb60fe5ea794fc15ab91ce2d0c72ef9ed2bf82539ce12a8c36b73dc8754dcfb7ccda107947dcdde779fff38efeb7b5fc1bf0fca2ea0deb6e7f2f79f2f871eefaf07fef6e0dffc7dcddc7bdcd74fc7dfb20ba7bdefbc4ec4bd4b7dfc5c7dfc55e3ab7fd0f7f827a3c5134dc34fbba72d610870365cb34675586b5771add66ef7fb4017f4fee3f9f0d7c7e0a55d7dcc637bedf1db4eb76c5aa38f9fe28c9ff37e7bc7da5aeeab7daa45dbd3c75fb368eb449b6ed15e0b01cea6df69d87b95c9051f3f248fecf85d0c4256217998396cdc245772256df6942b5945288fe4b0392e0bfd1c7707ddfe391cc714fa118b417464240ff3a3b6ab901d4a3054383232080986c8c3fcf9850e3b35702d577e130401a0b03131330704b051805a821dcad5a90c275fa90a6000ac07113187e738800d151f4285767eb8410b204401ae4a6adb58912bb922d5b833bf83cab62c76c80ee5aa2323863d6d54aa283a32ddc5039b85b599241502107059a810f48a36a674de8ae101cd520c9354e3b2b8962b271020840eeb6df6b4377bca150e1adb8a8182ca4df2ba3096ab1a5787b5e50a8ad50e770663161d3a76a876d818429641aee417d16455518586ad7262086b83071bdec9a238606e6e56339b21eb4bf9f51473f8cbbca7a42faf18c2d81598ea0b587e586532191a1a1c4e0090830e31d403168c8006224802091224489020298185fdc98c1faf8c5e96eb02b1ab339aa419fa21df38e122934e02ede427a5b54a974a4fe69ce2073f901209cbb24a20234aa5524e190324961a54f49a5292dc84030709470fb06faea7d3288560d0ad8a6f8c485e9a38bc349fe4262166697e146e0060bb56b994c001806d59a3d01370487213014280635f57b43a96caba41cdc21347aa2002121b648142811380e1850c1641a02255638a2431a2d4d8618c3146771dbabbef20778c31003b7477a7a51a6374235e908c5c568cd18d78a18391ab63c48b1c8cb8538ce6d2001053da1bb07c3fc1618731c66869ad1a4b926404fe8e275ef30edddd65622c4a5121a5d4eb6f16bb820637638731c6e81d96e175a1bbfb07965c5ea834f401c5187a82257efc943c1172f71230461359533156f7e2f324d5b2648cba1932b08c28947b1aee4e6536991dbdf0618c317a16b3e37b925b63dcc38af202ccb6daba17703801400e3a58b4c4815446139fe45ea825eb5ea8b4521a008b4901cb77f9d58ad1ba81a3c60e13a5d6903650dcdd064a8d1d025022e99003004e70d0f969cc906163003fa8dd0e3008a1743e81fde54f77a7fac5e512a6c728e394d137eaee33029306a41d5fd24827293a7605963faf1a82ea5ed41a96f82eabadd4ba56906d014b18e07a992c1bbdb4038b28f2710e37652bb34849e8e30199709d4f6479ddad19364d428a6c4f1f4f3c9a2960a733f3fd9667b8b73eceeb6ac69f1cfbddced7e95c33260f9a701706fa7840136bada73f62ccd2d43ad85ace7218e8b395b4af6379b762a00fde3a11673b5fe7fb3a35cb33dc6f79c68433e1f2270767908c563b9f9565d93d978733f9449806fa74ac9c79ddad977b368bb1925ab5ebbd889685366dd3ec07037d2c6722ca3c255fc7c2bceed68fbdf0a681a45a37d07e409c89c86e60367a2d6b40bef6342bf12ba111683f20ce4464658c64bc280b11fdd3f819986f3654f2f1809ec60cce44e475d7b1cd6a19a36a7d1d6badb6619d4eb5ac9a595054cbaa56ad49585f2d28aa6555cf66b33c13fa2dcf943c16fa4e16d2a139091fa7d3e9b45272cd9031fa441dcff6b18e812cafbb170e6925a0219354378f750cf4e136ed566b6da007cc33a1121b0a6ddaadd6da387b61a08f07fc3a9666dff2ba5bad8537ee566b715bb5b56ab75acb6698b519a66579a6f358271ea9c127e326908d9726e866cf0f3f1a9c4f8e8c285eaa9655ab65d56a59b55a56ad9655b1207406e91c21a7f60122d3091a323775a9b82969a7135803c3ed6564c7cf6a44d9133b7ef6829812ca64dcf4f9f8198d9b4c3e7e161373801ff315db058bc28e8f3921a65c0053c51cdfc7c78ec41c9e7864c7af46dc14fa08aad991e2245187ecf8d50431a59ec0104d15c60c3b8c1dffb4e357548d7193f7f1ab8c9b4a3ec617c2cd8e548b1d9f5e114dd58a589a1f522544534da5d4901a61c7a7438829f5e92ae6e83e3e55c51cf8e3d354cc6124e6a01f710829d279257ea5c81592b6c76cdc5ffb68af297b693b9d8f07bb97255e9a4b64c6fbea7d4de20a2db6b0fae44cd249bb2c331ea745341185885fcf2af6a08559f23c65ccac962508a4c2a26241e5d5783ee868b3ab9fbd3c36ba3c637b76ccc6da567f724061782b9fd25be56c99f4b1db96e32ec1bee4b2cc80be7636dd169fd5e70bcd338a9940ccbf247b69decb229c95976e22cafc6e8b243345b485540c4a0a9917c4d2fc26541049f36d4057ece9e101ea93e325fde1928c41d9e36ccc724b9167cdb26a8c75813a790604fa0a230490b73a79d963bc243519a18e3f46e3351e5cc045c6cb9f1cd0e969d0f0809906ea350d1d8268478722225b73c2a743108d6357bd367875d9c46c9a9022f695f895cce25834dcd46542edbae86c3031ccd27c8d86a57159bc2cac9d4e604d35495e16933404879e6acf9c2f8bfd8c69cc535d4cd081ad46286c4503157b98ef834b5f28408d6917328100c184563544051c7a2b4f68cb4b25351a3468d8c0fbed7f6762f2366b40befdd04cf15493e4611149f3bbd5055c62cae70bcfc83ddd242269fe85b934d78a9b52617161ae0d6633424dd25cc2e2581c0f0b95278b64a2f8e47846b0d7b29d2ec09e3d91e84bb29092192fe347d8cab5abe6d1499493453836a290b462872229f6fc30eff99fc7e5021167cf9f913f63c41ee6cbc81f37441fe68ff2278c08c47c5006c56410ca4ba04f4e8c396c3ca0ae94e84f4eec610a2314b6726c758962668488e06ad178497a0c4a9bc8d072b0d309fc17d3d7465b4df32cda1a00ac67139bb177f28ca52fcbaa54cb32ecdecbe289a17a38933457d69a812500ab811f2fcb2775063a1b7bcd4627cf7c3e6f6521d62b71ad0851e25784288157462f7a93afa799f2594d521231e5f34524cd1fa1bc5469dcd4adbc54ad88262f09b1a62ecdac58c4943b4524cdefd411aac690db61a5a934a37cbb883dcc17e58b24fa30df245f2d2210f3bd7c6ff25dd9501c375d1cb7d9d786e2ecf9f23aa0b362e96b137b981f5282095b796982dfcfffb4c1f3f33f61c4203a1bc943cc813de8893d3f4e50137b8286ec9c8832fff38518ab99220a2392e6dba46a22cafc11ca4d222d6249a4842444235bc4833853445244d29d82c89ebf85110a0c3823948a73c28a46267f72bc34df66d06992404260bc04427d72686caa4534a125e0f0da5c5f960f46146cf5c496a1ab60cb1f6427225bbe6b8f62cbbfb4b3a0cbc29e1fca6ec44bf24139b5e56b3ef8e0f520001f7cf8c1e2fc70592c1843706871f6fc6bdb98b13f7de599ec434456a36c57b187f9f73453bc9a494a22a6783e88a4f9ddca33e256449387855802dd9b58a8844a1a4b8316754cd18c400200006316000020100c8945e3e1445002dd07140011739c565846964ae38120884114c6400c638c3186106208328a285353430400d02b866debfa0f231168d8db4d8b8531c165fd36c6785b90349962c9f67f2e3aef7fddfff3c9aab03f2db33978ba689278db7c0ce518bc9c02b2acc313861f6b50b408932419fe023ee62c8ffbd46931fd8241a018f6b546f398302fa77701d9048549e68cfc51281a752705699a2b7839ba5e8fe7cbf6ba01c52a63ebf9c22fffe27f04986d20699d2568ac23b170fd9107704026e9814192b16d4ef2696067462d1a8181aebc4476d33a0e8dea9a59bcc5745275dc1a13c724e37066c2ee793c11e2bc4d792474bed7db019b5a82bb33b2b4ebc5f85c82c1640609c7780eb48e9df8d53f66e8756cda879f030bac679dfb00cf707ea2d41e8803c00727c03673b94dd2e413fccc82f892547a98ea9951df9c8e4901aed55e47b9687408385dfa8a0d2d0ef4a9e7ff09e8d9f580a7cce2029abc9823736a16f91cf2858d990f80f41457929f8ddddfd6e94daada357615bf4b66541e5bd03c7de0a421954b7667165ab3850ed90a42cd54ab0e0108d6fbb4b911a7b748104c721f4b87a5553abd3f997f32e970818b3dd84cdaa611f0377f3c879d02de04d38521f6a6ea1d8010786a800c97c6d8c9d92140ac7e4b7f4821b051d4c038028c8b1c6ef5a80e5a1c17d4dee852d178b55bd79bcfdff4b6b4b2f6f42fd2573aa645d026897d8ff1cfd00c709529b1a4bb7d3dd2c13006c52e1b93265923f7b0574c241c48a4df99b23134a3770f78bf6a88d7e0980926e5de01319e61a267c4500e38cbf4fc6b073b26bd91c2b249aab0d8d92feca4c046809cf37ba81bec1661fa1ab12bd3c0cdb9d2606e0601b8719c3e9b12cd7b054edc148884a99fb34922c6c46e4a59e161fb044c6f77413eecec15d7c61b231dfe38b3161745f6268740baa0501cbeac29b69f09a8850696a52d021d3c99e37ce245df64755ba2a8d8063062d4643664863a62b81d00654339753184676bae3b463de480f1592b3d743ed56eb14f82e53d07726eaa751079bc7a8d117519bae6b44067d60242c41eb574c6b9c7911677cfd2d2fb05f2ebc1e0801e0207d2e4bc2bdf6eb43d9376f2416399dc71b6338d6fe6375158f10a19fed6cd49277120b6c8eeaa2315d626642d21a014ba9f0ea3d0b23a1a616174c812843ed5a749682565d0c97e7a5955498550dcacb4f2b5c458ef16a741ede1de0d046d79daf6e1de799cbea3964ae1d7a70a54c6ca98b4e57095f479b6a6e333d033a6dbdd4e45b216d461d60ca5e59f74e3a7daec5b4048271f8008ffd9b4549e9ca68d3dd679ee1b6422ae53591300c94897947550e4eec1f6ba7928b1c90fb97b1adff01b812ff1fd244d94b43b974faad5db75ed7b292caaa106550fde9ebb73ecd9d95043d9cd2c1aa0f732cdc327e99c7a0c64808c216f754e397e9af04e5f979d82bafb433c42b9d0e80218e8e7e39334b6f7219486e24b99a728a797f149a0ef263562bcee152ab78b6c7260bf9ad982e50913c6d1a870b25f85fc2eb9303998acf4ca8491ef08ee4caab2c1b7174e7f643f08b173150d6a22f1dca6127dfda7213e4e79e783e07f3b19c41e30a18501eebdc39a639718e84933b48d0c54754dd0c286195a0fce6862379da34dc2f64a820b9407e7d9c2ceecd4611417bace016805c3d31ee807b7624af57a3828408ac4768987c8815f48b3e0a16a3c2ece64880a43c8d0968fc56307fb5914003ab05a233647c506c84fb85dfea8803c83775e0a94b7483c180e8cd8a54352839b60c66c2aecc0315fd3041575048e0aaecd28576e916d92e0d02d570b10184b8b4ad00f32d581b48310310ab83d33c21d0c77902c5c97c70b1d917d9c70f2c8c8e7e0d9fda24710125daa7461a0ea432b398e2af9c755c0a62f74c591af50b06542d1a7910ea84729b011a537ca1855380fb66337592381f2fe3f0390fef08dc20dd15c635690820b2225f3fa2de346bb3e9a60af20344df92db77dfbc72f524de2bb3f2c1f91a7962724eceed83bb9c1a20993d5b42b5fa166002c546be1b74c1e2ebb88605c7d1a3f4bbcddd9c7b58f174b206315b68a778bc88cc049c28014cb46140ba1b728117034b9277bee29eb12c4e6387d450508c0a9856515c286658163729d9d90acc93426e20ed8d3f195c604bdc9681560c6d3b061a3b5bfce8f90d3941800a1681cb2d6137fc0532dd9f8fe096a268fe91cff5c6e7d11c2906382e92ff822737eeb419a3f2c1a93163b36d800e923638101c8b42eaee35c95e4707500d69ec57befd82625527252a551087bafc0d4f58741873c262d376b35d87b5831f8ad1c6259fd1c48145bf153cce12e2fc2d01e5ae19c20ff1d79ff933ac4b23c1eaf6ee60128d11eb269ba0c68586391dba6a28cf86a809d857b1a82175866240b80982b150196e8cff86a0f6b3d675c4519d6cdd8a023f7ff8c149c0872605519247bdf0b40a0a8dfcf4d50178678ac300e066754452be32ab007c5ac4ed5691060f224e375dc2cd3ec05f67fa16d77875593cc69c7ac770794629c9dca60c53bd4cb5ba968aa42e5788ab4f1502e886fd1fb536845a966adedcbf5d9192838b91c8605713bcbfb39fa21f2aa4273429010b07bc48a83325247514c27fd1dbf12683e57fafa0f97f099a6aab49c6c85d9469e4971a9a34ea83dc55444adc9bca073e6081cf5b2e36e901ad49310957d37eb494c71bee5c0f060e1af6172032855de0f9bb1d3919420da69269ccf2a6025738232cca540598a88fc1abf6c0f295550a2b8b1308bcbe11e2b1561eb349a974f11bb18e608ec859b9ea447993f4f9409b5ac5139cf942bb9a8ecc60b12bfa69d32da8884d53a18d9c7f17b2425c29f66f922e15fec5d638e62fa9b293b59464e6c32d252ce1bd9189840c38b76e3de5d2eef8b4d7fb5870f27496e9a2ce859cf7683b21c9298c85b44a936e7a1b12ba5f625150b52d3e54961ee8e6aee7852611e8d0cff047fc1f0934372bb4219d976a44e7466e14722e5103ef758be00acf6f951d7e31ab87d508506ae51821d7cf508c1721f057bed55dbc12d622b55e847ed6fde7562c3cebdddc83bd15d01b2250479a3601003239cde28c51998f07841ef1cc86475cb18fc678796804118750c40a20113e389d888789a4551e4e1a59da6f506e755cc67631d3019ce4a956d202581b00bc62a383d8bea96aba697c120607ab620c3861635ac2c24516a45034351099f52fbcae550414b21d1127dc45a2eba98d5984ed069b906c6780e4585298142974577e94a9f924cd074545ad44d14093038e9a239630c086085f9b4647ce28950226a031ed5002a3cd71c922c196452a853b328b116c5f70c72e207b8ca63f9dd20fdd9b96344f42674c695511605a2842b7640e332c8b4a805e1e18a498067c3112850bb544a9450c0050b755c01c6e03e28a1f4bf052f6e0cd25a1bc5bc36de95014474506733c9925ec1f52c2844d2959d496b69a087d958bfc6810aa2702ebd58bdd4412bb93c8b042e7e49ae620c4d81299e4f0901c144b70281e1cafd271b07ad9baa23791daf9507373ea68beda016920be44960a53fbe9883f127d3e28245ef26280a13200cde3600cc3d251288821960132fb0223802f84fb5f2d7b8aee10ae936235697e216d0cf208c272859f0a07540c822f41a158359314f6701c1fdda42c79392f8b0500031ef408c6bacf111ff53a7a71720e47c74e2e6f3843ca0f47a36833eba2bf5901291b9a12780c20dae8351f7ad13a118c84dd3a8d4397cbb52f4bb384c7ad192165a2a5e1ac1403950094480c10780f3111de8c48a97e3a129ea0545d339b4b0e9a5d087428bfb97af475cf0ca7dba1f071068868d906873551fa197464ff5e799f0b1117e8f7699e016e36767a2a54d1f6eb106604f067bc764094e703392614eac1a807142ac328003a7964ec77901055ec5634972844e1eb5ababcb78be42cd2a688ef8d795ad1bb19d80615bdabae0558515668bcf769ab243d9d704bb19bbdfb12201e76d66dab9c715ab1486e1aae81536ca5df48da6d0fd7f59c1821b6b3f11b140bb435d4c8b10162ad2690ac511f22532bcea148cb968f9a01ab84bfc158ae46c0fbe43d31f991c95e0c8b493e5688418c74d64814709496d4deed75f1c6adc5797296ce1bf40b82d40120a69775359acfe06026bc3a0e1cb46ac34d93a133d71b01c0efcae921a7eed709905d37689cc3972078d6c6780eb7800518025fb7bef0a11f4ffc5107486687ce04a83fc8d476e909251d26dd2a514bd8f0660cd003868ff18e1725c002476876741818d8dcf1b1130912b36d29889ba9f35f3bb4f113c59b8ddbd4f94a8c577cfa048d3f75415c20c094860ac20b9d4589bbd8405fac27e9d5c1ef09fddedcf849f7ed109fe8491651487253e331c925539292e49794738d2f4a453f49b96467ed687fd7d8a8ef1f613baed1bd78f798bab90414967517c104c783e82edb2c67b44760c8fa50ae69463a01256595d3c39120869f57668c7344cfa43288be82cb72fcf75cfb3c21de0ab5fe9d8834e6b7907eb2bba9c8c66ef1ddd40976196bf678e932b0425f74044264cc35b8a95fcaa8b94548f4134dc03d2d5f0616f828bdd002d29d74e6907cf32e528b60f7be16455083ff859420aae5d55346ac9b25b1541cc433549f26b7ef1d94697288d3466912b8ebc02268db2237738ec2ec90667ea5c57880f2572859ea21cc714f344dddd6252fd62993f7ef295f2599796955dac92a7b66c5592fad8bbc8e2ca438a1231c4486d0957ff3e9435c342a059d840dad29c632ad1f838a9fe8f66e50798cc329fdb75fa932517bb88b50bbd48c19939dc2f8ec0563e513f95e93f544e2b691b433865dae146447a50bc90aa46d0c7dc6af6c9a1d964cb889744025fa9cb932f518c25e04f2cb15b10db9df672c33f6235ae02b2eb4be06f7880ee4c13912822a6f32118c6b99fad217223028a5bd5ee994baead0375863a520cf20c41ee02857a083c0f06fe86a058d153f0ab504b4da0e43885eb443ab69575bb97998a59d4d3cc87503d5ddfdc53c3817cacd91656a63aa598ffdd459393cdb2564d70760220554fbf17c5794391e758149b93a7523b91d6a6996495a6b414f289e9812a8955b624b44c92fd473a81edef67228a698e1aa3a91218ca84e800c876d02694d7040d190ac4e43f400c5e856aabef4c8972a0682b78af1c71821225450d3637028083424fafd95c1f3534ff380b2327320f6319c263b116bdf94980e4177d1506675a8607242075f70516560b969308cdf413d4235956cd3d65029dd5178f7071257f4a7bbd748c9bbbff3944bad0a14b627ab7a235e39e15eeb6e56e82ae5b30a29711d37f41cf792be471baed7ba2bb9b8b5424a0eca25d12b6e0df781d2d472491f0d80162519f62743a2faca646c77f899641d114e255b7193f0e544b1e108505f196aa1f7a734572f426187c1a4c8d0af58c877d36a357b61364a50cec11057556a4a93063a76fe21ceb983eda4a14add6cff562c52df57ed60ef3b49949ca2d9351ae483e893aadd2e4099a44f144ac3b25a7d231b356ff11ff9c08a527e6b42a22f9f57db7028ff35621758845f7c4275f3bd816ff468d0f6f5cd8161fa853ba0148989f17991922ea782367f0325361ce1298a908a80581aef162110b3e3702ac690c86a61f2cc267175ca9a7a341b3cc243b98de1a121463392d2a5d275b0e59d06e58b7f09b85d90f43919b9aec020d3878f31bbe640cf6b902563769cd7803a99e52ca879efdaa5cf8077cf569e38a9ba9f09429099a010eddaaaea663e23c05e02583034ddc0e10d349b05da3767980d15beb33a22f74e8532de71456e2d582bcf259db1c1b6fead0248ab2ac7139aab17c547b121ce2a591b6ec01d0a6e30e164e739b2d9ee6adcbbf7c3bf64878bd93204e95a2d7fab074455334bb907a9f2502986fca04dba434ee742e5f1812727daa90e689168ed2eb2d647e6f0dfc551f7ec0e6d3e096cb8164bd25ff11c7ea92a07de5a50efde429ed8a0bf340d2e78105183f833d67ca4e6437d146ce5c84e0b28a1f07a0180b7c0a61e6088e5af3f70c41bdb23e34fbb4c746a4d05e0a211b96b8ab1984fa0722262db030a7f92d66779ff1ca499932a820793736a0d81c64e27fcfdef2be7fd8f07923ae57008592c82b7005b84477030c1666649564ea1c5263d92eb449bd15d222d16457bed9f96db2ef5327a214a2380b17e98f02271465a630630441dae554a1aea6bec959f680f4656ca79aee431ed584f08637fd5b687394b054a34b3c489da0564ef4a23b70425b400c8277371a2d1406e202a5dd2c48b6508a733655bbce974de5cb2ca7e5ee9c23fdb2bb6c8933d097d1a532d1aea8fe987d778421ba1424e6131a08633f1dcda65ca17cb39ab5d3d69a8f3a1009945ea168c3aaeff3c91305415fd14b7378e32bddeb13c79f44025ae9b6eb75c62aca40e86ff13fe0bf5214c9a14345f117f252cc9695617adcf3a030e478a50c5ff5ecb47a36f1c2e91a52c4d8efc1a6fee05ca718f41b6e20713f9578c5bee0c6d3870f16139a95958100e2e562f7c47c4dcf4955fac8b106b42029df69a69c567981e7a789a671b7524494542316a497b9dad6480420b7411c7052e02fb56059025ebf9182952d9c1671ef9dd6bfcbb64380dfd2028a89d9648fe6894d63bffbfcbcfe690f5ba4e7cf3a47371d7215734f42d41a4f81108b2534b0182be3d2b48cc1ba9bc47e2f6e0098a258457bf1020aac878844a1419316e6803ec6fa9f61d3710b3bd5451ae1c85994d5414949334e97271a74638730df3060ec84edd1da26452c7da44490297ad0d6bf0a65378083e2d180cf22c2ee78a2304d95aaff1f76a5540ec65f7aa5f2ad17a1390931875911d4ee3ac65661183b15092473f59621d6c7e16b7b49c064cd67ff68152509c3c3957bf1a3897559b81364c6c3e78f83a6cedcb77f339bf3d9d1c05a4f3ea2f6a800adbd308a9e876f51578dafe65a27cc0655fbdc97b54f937e84403d1f3e33e8636aec71bd2c21f7315c8c74729ac58d9bea3629cd699af74a592b144c0ddd1aeb152f9d0da3d34487824e782b27f904cc51fbfd494475f1a1e5bbbb0b281fbf9b7780ea7916199e5d13f9b0ff7a2f4432e3e40f28d427134d5a1d4bc7e09d3d05f86f01c9c1bb8c0791a92cec58171506f649195f5912fcef75ee4f92e2532cdcca95971a63c393503bf5f7a39f0cf547427823259d719bf81d46636481a6744fcb3e6387ae5859e545879de8b45c8007966380d92316ffe102f417bab38f5670caab668ab536e681b47f5f2cdde62df673f72a90ffbde3bd9b3e90e9f486b1f936e4acc906181197f00f70618735bef00de47b43c4c1963e372e2216fccde485e3d308dff786a0275449744d7e8368f6d4308612a2ba6b3d2b514d03d7e368c3dcbfd0e378217dd61b8c2ae6b17831ae2506caf25f9589d9906cedb2745653cdc43e52e775a248fcb9896f0b37b55750699db4d57cd8e74a143ac28ac783866761ca44f3df9eab0421e635f22fff00018acbedacf5f6f69c42fa5ec55d9986eb01b301d3fa763e12f0df3db596e57259b5c09f4a0235207a939e68b121032264984418b7fc516c62b517732efc16c9b9316fe3dc6068051285eea71345f09d97fe15d3616f73855adb7a9236179ad41b9bf6e0c2ab770022407c594058ed9abb5924eaec5c9b25c18d1a720ba3bb731e3b525827b616e20fcbebb43f28e3ec8072c2e4c070d184dcce6219f9c41384dcb4e5819612b1950cc13bb692d2c6f517ee5a0bd884ef168a6c72ac0221bc08c6eabdf1bd042b0f8b60ebe832111246b5ea86f0152d30fdd7ca4166fb7cf5de82f1f8389cf5e7dbd0fc966b8b597c9b8086cd5ad1e5cb01f884f88d4c5d06c0e89a039d4f765fde7dd77491bee58a585bbbb216eb0c71202727b6279ca48abb861b1290eb38ed352aa25bf2a355f25024043259be6b4cb1d67ae9498bb7c277633ba2993a4ebc5de60370551c916b368ba79d3cd046a72ffb4d3d5836683cdba751eb682d0a3a486ca8cd8c3e92dd5a2552bf440370655ce95bf217fc2d45d324114e141d3409922c25e5261e626aed2f7181a42f07c1364fe60c3795a421ba02bb7c9188f34207a1e309b9c9984b1c7f0d78dbc03bd5524be6c9ff08b43a8a619cce556c631818f3f28faca9d9bdfdbaa219ce1011941c87712f535a3ef2d65e73268812a54b3b6fe1b3c574dc3fe4419ac8ad0e04633ac31cb51c01f67f04b5f761875b0d43c88189baf1ff954bffe77b1b6500d452797d151e656964cd6f07d94671407663daa79dcdbe12d85ea7692b00914c702f81de16f8fed07bac793fd1f958236fe943f348e8061f20c712393e9f9e1ca94bb3d8802c9f4cae7102b41924b6c979af6d3404b73f552cec8589a346b1c4f5aae4a7b04999109f404fbc6b2320e006ad389e49bf2702dd6a1f35d03721cf2fffb7d9f9e551335142945bfd07029c995cd580e694d2cc5b588b1b22355938b2dd3449369554041bb25b5b57e103f819488ee3d8d0d30c208f2b63f3117dca78655560cd735f4f17a3d3c32b97d8096253a7f1a188a96a465d7a7c607b511032748c57e0a3b653070d916ee3fec3832104360c558f4a63c69aa64983ed4b7ad6a32761bb341014477eeadf81779192296bc1d8fad4e9336b8f90ab9372ed02dbe167395ec89e7179c4198bd1520cae884e22733a509acf584edb54ccd04071dead1a54275100a532f51b97e455640503bf73a979829fd408128b97c656354b9af8d23dedc78a58c61553e5dabb4b1147d4923ee7af42f5d7f06d99ede0c2a561a2ebbc06d5e132dc9c55cae4926457b78ee7eaf70f1cc1b01e60103c66f274445386981cb146ad991d7d10cc4f639f8caa429e62bd55c907a51a50804ed225f7ba6fa9b109028619754b595d959a13278a16bf2d5f0734b9049c3b809fa28d32bc1b1503c88f21b3beb6206c51b74cd2ba0479d0e4f0a45790ed0cab5ebae09a684a3448bf0a523f03e21f054b728c63b6d5d7f0f206161325a4546c0ee7d6f4cd28f749ced9e20dfac9f889eeb5b6b85b025af1aa9f3f1862a54c1580681349d7a67457bf7c354bbe4e253c0612f650b9a9275280acb58011362e87880f8605bc2c8c6d8ed62634c3395e236f4f2070b1453a8d7fb6bcdf0c43b817f0f46733b9aee7161e2c0861323b47b9cb1849d0f559731679c78092e6b0da01b4124a99d88346341d50bc415dc004df2d9e32bb4f2f60163623a0a4e02235288e2f5c256088c6849cede9394d2747890f343db1a12d56ce1d0d26f58c3cfe999e4d8aa8282f20837cdfa18ac4099b64f2bb66594f8d200fb52e81601638e6e77ec0f7bd35a1d156462009bf0d598280ffcb9987dd66f5832fcdfb3a961d3398caefacd728b43811b3ef94a5df7a06f8efff6c5f5cd4ce3fc07200ec2afb895b2b2b67e31156324e0d4873df30949c15933da6e52e09f3ec07c8647ccb8cff8e12795c5f8fd1e361654336825ed24b4e5164175d82ae68f63ee416c9e0e4c49426fc476a7a6ac81242ba88fdf912d74a94d9b95c583f959bb894216a1391a96f94f44dd18602723a9c65e7badbebe60ad3cda9339c42cf2144fb594dbf4613c74bd39dbc0dbb3b0cea603a80c7ad1d79fb9244912b2dd24ee7b1dbe013f2f4f7ff3d6ff9db09059e30fac193a984eeb98b356ec5b94558713273a8614d21d1fd26a957dcb09e0f9dae1daa88188ef144acc4207c2d3132dd2087fb9acebfb5d13e470cc956ee26172d48cc31c2fa9cc7027aa38072dd1e99e543ef6b8d86821d511e15383c87224a7b6be07c2ebf46f2d1e7dc951adf913886e5c02c288e79927331d199838b9991ef54b348f3c597d476cbb5dd79b2c915500d525629d0b928ea0900699019fa0c2d06230b88836e0f65cb8838784be2f70245592fc26e87eb44c0a61837c918179b50ee767f13e4946a49b82414b0c50de7dbd12d1a39996401f404668cdf60b67125b976a0787fd11db1acbaa9b2acc06013c9b69875dbe980dbaebbc7030ed5e4087a5924abab8fab2f4ccd8e6d44b844289b8871dc777d5ea50a1e758dff8e0bee1c52cf5bf366f02b3d12e6a2ca9ca13d309a149d139fc69107eae75629263663c583154cfcd96dd70175d75233dc1909babe510836cc79d73c930ba67a42759e758e7475d7f049417a6aefd868420b962cdb1e365a4b0252d4fd331d6f6063c78be230feb88ffa1f7fdddd9bfc8527046434240e3430ffd39559d156375be11b884c6a7cd498d883b6790bacc1b9cdae34b2fa35f2b9d204e1866c042ae1349b859d8d1b461b04b1ab87dc3189b988a4e497453e97d37eb1020e6f41487424fcbfd2f9e048535eebd6423d99c4b8b2bac39aae7822cbc345a3d252708bf28a183140ac73a1f63293c672281c8859a921122e4431ca21a27ce479adcbf55b7514feb95aa4273b416d2836e4513455af34b5f1ad792aa5d61261075d1c1f54924e0bb39be8174b41f6bf1f3a360e1ea6a94920b29211f013a2a381ef7b7ab4723b40d185ef888225aab360a4d8612b822527197e006b8be5b4fde7be7dde5e0ccb6f7dd6c508097e99d4a28a5eb04f01007314128a3610f1d12d0768abc50fd31d2c9383e699107679e4af3f2056c6395f2ce35c8a8756a288f78255637f6a575d4c24209880cf6e15634559490d7616b8e222d225dc49ac803be8f5dfc1f238bf056df82e03a952a9d5d05a12bc0bb26c4f59e5a23d32515847ed70e6cca4a3b707d09c3f3b3f61bf75e799d8b7e067aa7531b5671dc1756bed93717f205b79f85f469038892b7843aa351c596b61e06dc3010383a609ae19e1f7a01b32b31a68b61d8a5b354312b0c60b4f45c6021b3efff3150a6b99d44eead0ac2bc01e5168cf1334e3dcdce78c306ae2cea81900fa72868b9540fa7f5a367b6ee84813396d08ce50b24b050ab06a5436b96ee68872688020fd0534af7ea112ddefa24745922d89933c15c2854c1e1bba0180ad0ad9d9a74a2e52a967712c06f3af7d30199d203ba545d2bf5e5bcb869182bfe6742120bfb15805e106c987d2877ff972216cd0c49417732edf79f2081b0213b91ae330f56a41409fdaaac98626823ee798dc1ce6c4137f8a7f0b81153da1191436d80c0ba7c7c30c8e9fa536490adb33ecdc5f107a2629969b9672264235c2e4fb84c1c872d99da7f00980348ae450b1ab2992d1c6ce0262dbfa25d70abd4728efa106b1beaa4e6706b7ac0a510580078539d6b39ec8420da3eb2d2e91272d89fd03655ca88856c5c8d0a51c64909b760d127789aa43937895ad02b6a490856d915fd79903cbd6644702248cf5d6cb7cb513bd703c3dfbb76f33fb7ded519cdd9a8a886fcfe8664b53b24469b375645153b38420cd1676fc237ad9df8e9289cbb2755cc9452a69ca4a590ff9e2a9333349e15612f9d324dfea2112006d09e954c6842b5e4988ae5e93e3be3fddfd566ebc9a6b1684accd289cd4471499207b454172d56867054057bc51a75742a21455e5faeb1773fb29640fc9444ef9ba01bd5c609c7435f68c9728c2d11c36966866d08981579aa6328cbae372602852dadf2af4f1b64195db85b3489951921fff6213427294649e243133ed0d96791e6d92afc86032f6447eb286ec899a675cf74bfde423011b219a796fae6aa82e539170be887d72b81663bdd128f214124655ce638c61d3c4db2b3694c61603e050d204a68965c20352a2ae14d068e6f2c05495ee9b21a4d2640c1e5c9a7489286f6826d7d44db0e4ea5d94e481b522e82653e0e092e4d2b53392bd14f6bfd9c2312716d190507eb4386b66efda5c9ed498c14e6945f728b38b5995a7445d06e73270b81f0ea4d2515a733a75e8d6d702a85b98b81821bbe377db96bc5656e9eaf4bb5c8caed453fa6b0312837225f2dea4748904ad6ae57d2b8995ba9ff0b6c54eb0799801107d1129545e312bbba83f11e014d324461fd9fecb5dfdc3413619665220c2a4b7a9c6a5d383394f20355e39431e64e7bcd3f791680323f24a2d201baea94c5cfabba30f0abbd73750306e0381385f258461129096c95a50174cd23fc826e6405b8756e5da815c4509df0169b635c92b0a8a2631eb87ecd47122f9409acdb14bc12609e49a364dc294ba9f1195d23a662ca62e0cb4dd25626fed14eabaee9f24311972db6bf6fab8820942406dd69824eee5fac160e8341eeb7353c2898863ea287b1191cf80a176f751799dd78de3a1fd890acb427a0639d1521d097e7ecb4fd6bc152562f016f05c49d98f2571f4826ff9d08bd9302db0c3726b6b805cce5b34a99e38d786e0955f510d249eef1d1b1b4ecb903a15cf1457fa2764c404c962f346d17a24cae39d487a21d6550fc08d2805a444e93533e829dbbd3c223658a33cedaded4db4ef702d7226cd2aacd4f8b7808236e52c48b42cfe7d40e945aa21fe57f3f18bdd9e780c2474111c8a13a33b1bbf42c726dbd3c90cb6753f4b7bd28b549f8961ff0391ef8b800312c8de6455ee481b74ad090353213eedc40f522f32961deda57eba5d9914952f8069d1f39734c4e7bda0ce40a6d2a09770f4e35e44df0543b10edb8be0ed3b64acd4fd117da00049e1a895925c795c2cfe1d19460006f7bad750f33fb0f56762fb67ba06a68a57ef84d4f6672bce98b7709b2d4f20e2eaf98e8c1c01274175db56e421e76310cc508b4bef72f85c84f1210d29d12526b90123689ed2d02a73a6e77387a14e5fd2000fb7a31b0f91019c0f6b1c1b3a501af2d95250031cf00fe5bb40023c5701d47e109ed228e059a43466007839ff9b1859bc76b286817052c7993e3a7af0abf09799835186b8c18dbd5fe5d308e8cc4d9fd2c9d96b780b6da5f6b74e815c41eed0beae01aa8d8e441506a5f1ebbd0d28a7c00ea26fb0f0e95e11b2db730b186f6dcc05cd569897850b639ecd48a1d7502a4d96b2bf6b6fca9eca8ba20385d3cb2adc56a08b494ede393c5d6a944044618530c342ce51eb55454462def1dbc12884d202bfa020842d4baef71c3def27a064758c2c1ebf2b86285c672fcd7dda37f481baff566d5773d800d5854aae014294bbc84116e1f426f0440b4be368a7308a890a78a0c828c8412f1ea542853e16635187f0084fcc6fefe278adf671402c4017f3283d330edaa690f8359a448f8d8a4b29ae5a620fc7c6f20494185cda48b159ec7e6682dce1ba2606abc404ef7c5a643a72af4fe3802385e7c49bbf42e9c60a839b4757972987aa7961879c55e8be3c2a0721e8fe3007282612c194bfa7606a628b9497d22c213319335932b98eb025cb5485083de7c5496bd852cf37ba8783533bb51bc8427b555f799a28404852d149486cf44e12aa8c11eef71fd91a9c053c9bbe40b718790d48250696307827519c12457be0184c8afd51ffcca85320307c454834b55f288679f6926987032179a37c9421c13170d2d59ba0a4aef36d0348ad5e9cfdc34ea8754b9cda8305bb9dccb105f4a351d8ca179f95bee1bb53dc810bc1bf3852a1c894bbe9273a00d2b80c4a807a1d241c3acb11100c8d792dc2b4bf4650df14158e12c1e9daccb131958092ba2d77ffb2aaaff5a7eeb3e6f8f5a915889a3da403874418ac066dd422a80fb40a6523d8ac3875e23be60c624279eea2246eefb03c19b0399df0536b82253ab1c5946043c98fa1a8bbaee95849d003b0705035366543d6ae451ac3980f9e9d4455d9a34edf850f128d42032f1a605a92583a43987961f319843aa8ba799f83480e3c0c393b266e075df884be75811c87753e05974118d3d5653fa296c3c724e0498a7361905b05405a139793d359609c5d69a8c10a6f698a0725807906bcac1d6e7917f2612ff5a7316ffdc131eaf9fa4e06bceb13fa41aa84dd65d1750e84a4a85d30541a83b263f38d12d1e0856446b6be08c83d3445d075ce4107b1f25c9ecf4f422e75108f8d29cb4bf8d6c253653a5a9d9d2d073671756d2fda200d512a09f04fb71a872e01557cffd105eb86fc3c32fca07527235dd17f8dd874ad55eb1618cd2c49baf99534bba8a2248d5e252c499203101888479ae04685200563b2ca9bd72d5b06652de62588eaf57344b77a2187a7d680e98b6829944d1a4f263268aab7f2e7a877a08c0c4ffd12226fc53e43a1650891c051869f88aa8baeec1c076f3238f4cc80f4a41ad81451ed0f88166add166ecde03d92b21def265c8535b818c4af122602b02ad7053822d2a8705dd574e56161a21c97d50e48d04c3d8c036cac8a5e2448829730ab42f3fa016029929733abb2745bd800c11dc0369585374962ab78b0df032ba61d1c89848ee5915995a873f26a811e3dfd35b2925591228c076f596e745665c04947666dd986326e64632310d1364773a01ae89a9d3158155d749370edcfaa28feb3c46e3cd38111a5b0638677fa52f491e4ebbcf488c1645508dac239e24acb83c1eac058ba0a03c540bac708cb40a92934461e697aa687c956c54c10fc1c4ed0a25133a541641792e6ff6c524e2186de421482c4c2c284c422e401cbead0406b17269308288caaa8b556a5ae73e8353d9940f558e0ab0ea16d4a8a989cebf8b69b766e20e4d3bd53d10fb3e04a3282731172646da2bc275f61fa76e7eef189d4e2bb68fbf85e8ee52e5903955d58deeb94b7c1ae9006866d336e97382baff4db97adaf037a1a5cfe26116241b2855802f3306e8d5a8f72db3b346b310e16a8085e6418e2e9b470d23f2a39220c81216ffd5b011506509573b11de91a6bc418340bcfc67aaf4f31e26acf9b0933817e1c97381841dc4343e15f4041025ae38c9d877a57a3128a5125953f122a33574209efd16e46d10e795c263401d0e68831bb2018d30440a7c338f8371482815538f855219b7903fb725567a5562584348da2f258f4234ea8b019b20b973c9f47d59999385e3814cb5d42c07afc8f72a318c4867999b3d078f8dbf0b32901b2089c348e7428de73174e22d2a9ff95c5ff1d699ba6be0ad44eed4bd10c05173f63a65e32e80cd61c91405077b2ac02bef8234537971a98bd1b663f94188f7887fe59e34bca22693449a02cc26020d421c862a0d542108eeb3fd1c5060af3593d5b8c39080dd6759a08c08349be29669b56bba98ac1a27648c6fb5e98611c65bd3edaa577c99ff071caaadd384258b23131587d41600afcc3d1d4569d635a8f30c73a3983871a8f097ce9f2577bef0f4e7d1b8e4c039e13a0c211d0748ccfcf344d25d829f1e90fcaadd37a1d16f5199d4c63c0c464c7f2fba9cfe850950b490e7738a44f4d4604863281b66037047247c4046c965e06c535bbfd1eba56c02fdc8095f9f440153acb76946d2b8866e78f82ff835e2cc57504c97830f4788d30e8fa41d03c5e00badc8ee3749c16fee5469ca5f2e47a70501b1da115de3bf33baa572dc01583466e0de62c6df6c2e54e1124cdd6268164a73b1e322605c169cf71a2eb39a2d32d6de76a3abb7beb8e44339b1b224905f574e8456e4ea9737b85b7b488c60445add8b5971984fc160bf86aef94aada5168f56cc06b249005058fe002e318c365fc81820275df77336f8487e553722fa1aa2d962826730fb0c5fbb61638fd19f49dac6ceeaa33a91f559338e2f6a5484ba71b8a1af68dde94ce3f58b4ef00d513018e1f190081681a1be228a028906c54621317e08815fd621dfbd4b41166c0d8e63f18fce645f5b76c505f84b3f0b46ba11343e53df37452536bb1f8aa993de1a4ef5c610cde701d6dc65f7105fa01b3698617e55fe20dd5d2b8620bb66c488b4c1fe23e987b69019974a66762215b2542db98b3c6c3492c459a7bcff64875a9e44f0fd4fee05f53b243ff7787d6324e88b6dc858a55ba2e9f8a5388f3b22949a8f3fed3ae3dd25622117cc8cf70684f829aaf2f2eab3b56a3825dfffe013dbe263f794b3f0aec674ba816e028845a8e2283c9274b0329f1d7ad9fe3387b7157ca02d5ddcc80d881e0aa4c0d16fdd76f60357f2de6418d5ef53c491302cb93150608bb3b23c48311c84c3bbb4636b7260c9c8b0952628b3572fcb00707dbbef39a8840f46a1c908ac58dcd8158e3bc2c9353a72355211aa08a083902c64597ac4328b44009211070b530f788f7c9d53701371dd38f2c0a943f426f494e75c8e8c7cb16d44529b6d11a5a62912003516b1e236537d50bcb2cead68884be03b4bbc0218c7655d9ca28e500f41fc7d6390f749cac75619abffeb7bc0af8a6a4a7789f0b9c8d23edff268170d52736da8c300c957805e1ef5037348566c4172fb67841b239bb562915b88bd5ba6b7a7de18c6f2256ee2380500f7b8acb675f83b63275ad68154baf85fc918ea505835e765607612ad8091202ef368a4811850a9f82f9c197f1824f9de9fcbf84d14c804722e1d2a0adb43e853eeb1e260d80ddc2e1324460fdf2f05f735cb3cae420c496c0f2878ecc93c7d3d6e8348e8da81238e55da79848ffa81c058ec78c227f4262428ef81f5462dce5a796ef1a7a32d81c8bee91bad33b12e8f434c0cfe68371f8341abdcd6126b56dc8abe81801d4ad91fa793532c8294fe5524abdd6ab72ee5d7cc12ce0dafa683a10af2a7822f30ae03d9bea1252b46756baa51f5dbe47a84de1add9beb9a09acd603e48ae0304ce9dd0a75c6e4cca35733ea87ee110613b02528140c1d6520212722a88996d81c3044fd00cad381f2f5ca22550c204f4f3261ce7fb70e407bb54cb4396cbbac66208007e801236e9a653c81e4ba1d7ecb936697d7d9912d59321d0f97258737339252b1e71e179f1a2d591750b5f94da8f7d992cf149b46d66330bf992bebd99e59df7176646cecdf7fca96d597a93d0e072f16f5879752ca83039bc8c8f0878fa8a37763519bc98716b617738271d243e387a269090783713464fb4a34a65b712a9febb5c99bc66a741ca9c81a7c33ef8627c49e53c80040af0e87249335121e557bb13dcd6f82730a04c8a66b044322ca0f59b08ca342a9cd636cc6dcb43fd72e1c05308bafafac6ccf524c2af85bdd239aa351f804ec73887bfc564ad2c2ac0ecec13e23aaec956b100564468411017871af1d534b9f11178bb063311e4db9e837574bd4caffbfeaed66aad6cf14f482c15f68735ad1f1adaffe87385a6cf9133044e69f261fe3161c11037af8e564b91b910bd09cd84987320b4193e27f96872ef00a1c9a3d3eeae11eb24301dfc3f175e0c0c8aac8588e992771a50dc739ea73ae5280871e4491c0cf36c059c2ec91157eafbb68183443cda40cde54ced727aaf05f56ecac9a9224af00de1b889489249cee42688b2c83b993666c128a5f200f4265b852c9f2370b315dd4aa679a5f6870180331a905a47837a774c4e0e0b771802e8b8bd5c04c5e013253b097032d441e6a2ed768b0fb25691386fa09cd62a22b7371ce7422370c80bb29b7ad6542c20f414d1dbbc85549b1ff509bbcb993ec85e5aea381e0659eecebd1180bb9cadbc08a0324db42327517f2121d41cad25c8979ca389c1f0ece5abce353b53ebd7a8dabd06087e788dc0c4bfb2dc023d0b191e568104ae29394d337f51ef37f4ac91b76db60943f48454c948c292d60293a1de1ee98d0155afbc57aa483f1b169ad3dd25e8b88aa32b5852f622611f161f8e76c50671ed0b47486a76a014f098457ebcca50894b22071f4a641f5b4cfdf21ec15931cedb00fac23ff8c38f661b95d196a332814ee9702fbf9bae9d17ebd88850b04d7d6c8d2e099855a86a301bbdcf275b555f3c8166f660dc036d45a84424b2a0f81095b7de1909b3f054ea618da1c2826ce5523a989724ccd5f69683fd1c5d1a866fd181b98e620e880ce9154313e62d155742edee3c3d52e3b46129b78f1c11e1436f2fc5c43e666eafb32e389aee5d9efe75ae53abe10fd401aee0ef37def93dbe57ec8a54b22f7572cb202133ccdada5db44cefd75a68f6a23930a1f5b9aaea42909efaf5c6120d1106fe0ee63f6b3753e69d58d16b854deb9c4c39ed2c04b6aed80aa2094890bde2ecc5191ff8ada0392ca0ddcd8a7bb680dbff0df5689e21c253021c2595473045f0beb9becd238fef0568ad4ebb1658183a8ea03fabd3ceef37fcb9c41e9857223a82d6686956b6ce01f35483825cc09e0012aaacae3d5eb2da729481dc1263c0a26c44d95b960c483189642a29b15be392a9af31cb81539cc51802a4a0a313f5c709957747c7c62fc54e661b93c8a02bd0573db09c55ad8c82732437e42644c042f4879c1221f00847058c51d9e42b98bc7de4ff56d4a5cc64e93089cce94887c1f9653e0ea1ae561f2a0de0121892e92367e757c33076aee7289a1e8eba25554052b8473c8db397b590f09763130d9669849b51ccf09ebbd600fe9152f6afbcf44154b3de795c8318d9f60141a194f4d2b8fd20d486715478c90647cf8d7b81ba29b19ebc6fe9bbbc28360cf47b52d76b653098234f80f85794b52c17f798f1240f37fb50d9886739d78280ec4e9144003b678961472d129f2c707ba01613a8d435c9479c17e38ec2c1de484608171c503e75ed0c6a5480f94b574887d92c0a89253f980b32f726226ef27632629d676ee06e75e06412a0edfe14142e5684ef64c4b9804ca0533170124325323942d82f0b73c495cdc379bb801b3180fc6dd55558afd3b9f88fee51077e54291b63fab97601350d6817f525890c4baec25f97373c9a8ff6a00de4b57494c56247bac712d2ea552d6470aa40b6405c37017c77183329b1b5cf07f22b003331a4550fc65518a90ad9332f1aea067a0391bb5411014e0c9edf636795f5235616a08b264a83f457480fea61d238b69589d9ec07516a0b61a52141f4a75da8fda82b3a58cbfca8cd09841c5ca3fcd8c254c3584d6e938a05fbfd24919bf1a9bd9930839e1eabb93f21759a5f10ecab6ede78300688c2bfabe07cc0863be2363eb429bf68db4055661e8fe0676483b579ac24fabbc9ba9d2ab0e7103cfae23dcfdb43839d3f94bd37b5f0e223b4e0d235e84d2a65b3976476ad3dcdb403522e526a056861bb270ce47e7cf7625dd499692d42e669bc5fe885d3110e08c3f0e529bab8e7fa9dee3f232a560a8327ea6725b29ead01954e222101826ce9848a870616f9db171a920bd064476983b44ce51bbc05b8e522ae9defc6355166d2eb740cee24860f55ba7d9c415d1a441d5d8ef6acbee9c73d48472182110f67f7ade4489548afea25e712375680f87763c0eccf6d603356b4403bec97ef6cd12d14e756d313d17df8bc7a22e22f15bf52b29be6a5ca9f982eeb3ee4ea2042b3cbebdcd1ee8bcfe854a980e7bba5f48db4c5fbf1e759cb3277e518ebf372e693c3dd13dceddc34aa150618a49339e31a7a22e3570e694ce8d454f62f68d10c4743c421b0d7e0caa0c9c60102623f4761324dc2426418b8cc15b8237f3b434d72c871ed4572aa7887696a2f4405c1b81c996843490e12b1ed890be79444f994e41207ca5c7f0a34b6bbc688c15a2539dbc1577e531e8690a62497f40b87fa6e5e3b3f172e20070c37833fb4dc3c0103fcd8e0c5c65d9267f4d07d9855fbf51974a6fcaf2d4911845c100551afcf1464cb7722ef374b40d6ff44af19cbdecf6a3131e316ca18ef78a4d65b5e18fc9364fa2edb4093ed6132c2e3b9cd43617978757914ad4da7e6433dd33ff2b1cb84b29021f5e5909daaa5c28e3826760ba7905ed36ded55f4f14d3152ab859379a025019c35c1d8943e101e61fe30634c89ccef3733a9e189abe072a6bebc196a893c17a800148cd8ef53f382190abe7d5217b789903b5b529b8e32641375fe247578496f6cd780aad924248f71f838843e4e18c1a3d9819205eac73592044ae5ace285393d33b36e7fefbf2da532d159c2d47e7226a584853bc8744045edeb7100efcf70a113470ae48b1068f9056b6d90c36f56eb60fae0e7b6b3499f83639bfa0fd8206d00f34c1dbf46945734e55e374dca4ed56a4713ab1b16b06b6e7ee64f1b8ffcb494329a37b2f562940409753896282b63846126ab3a69938d19e62eebdad257feef948300ef765933aca0313cce200f300ce2ca42e2a339b0cdaa8aa3c43b8c94edc17b8e5844628752dd934bb26d1bcd7d64a2fa2a74e677a77ba331d8528700dc1a2d01436ca7d6aa422a7f9c9d106e9c7337a78847a9d58c9dc7d048c16b097861cb518a996dcbf6eec5bb9a5b931b229287ced614b1372cfadc0260aa4bbb90cf807ef4b69531bee45018c3ae976e48a89692dc09d31f6e685cd28cb4f7c1d24414a5f197a4f4f993ab0fd47d0dcbd9db21a032f5fb126e36c39cb43d4659b0ae271c14c18cdcf8929f6c30c645a91d49a49d7c7a2409b72c867375741284ef8bc3640db5fd21c58fcbef6e0ca3ee19d8259dfe24dec97993f54ae291c42f095f521e493cc9f124f392c493845f129fa43c497892f348e69584272118af21c55d04742076614c6881a1ce9af60ed34e515c9c3d0eff7b57c5362b5cd7be6b21a62e9c2f9b8c77ca0c373183a7b7628ab0ec747685e2829b524bb450c3bb8aab4e4063b610d2e4872e98df075f876d0e51fdb80e5dee508959cf8d99c55f8e62cd4af1e2e3872fb959f53fa8b21ec909f43ea7cfa192119637b16fd0918e58a078305e80ddf8dc62ff2043e7c4bce9131f9fcdcef2d19c7e47f69ca56a044d20bcbb47d5b3f1b7c2f97dc817a7a5cc7167803aeccfb25bac19ad3a00203a516ba966ac57330cc5886316b5e042318964c8536f67d9b286fc69e2494712c5b5ad4bda15cc63e6ed0ec393ca94164a1315977a1513e80113969238018fd767540bf540db74d45fab842baef30cf1e122d0853581ab80650607be695f0b54e6c7ecf7e349a29efbac1b4db3ad975722157a91c94fd75cc20f2008ba639d894ebb1b60bec7c3d9181e9982a11c9f03b99e9d1ccfd620ddd3259ced33a034e27d0f54b57a4c408f9501bbca420c7bfaf45104b7c94ef49a254b0ae196f369ea637af3738453539a7fe151a832748511e57f024fd79b01c0c810ae4f762ee3dde1bdc22d8b9b0c06c6a3a5108b10336ee9a40f281909bfee74b456e0cc116843a3285a4fd54bc91c4f8616ccdfa0fdfef9148f8ebe9d520be7be1b5ac4d0ff38af6c4e2b991631c95341b40824724c5cf980c0ccdbbb255dd82324f28df007a1959c0a6cfc629c8548ec1b58f472184bf0f38fe8b08c52f30dd70439ad43946e84baf56f8d2e93ab487f85ae425fd12967965ab03d186247433c8113b1e9dace4017d6cdeb23e2b07d6a1ec52b7ce5ba046c0c039ac6de8f5920165a4d073d4b8d73f98fd08ad5bdc4a8f2f67aff3c004389db73fe4f6dadda1fb1c5b5c56db83f6b8de6eaeb823e8280a0001e789614aa9faf158526e5efe9f3a05b5cd4f1f6a5e21a8d940b3c4cba91dd6dcbbda59429c95109a208e8083fbadaadeef2eee93f39a1e6d41256aa4020ccc9a91af627d25b0a00db0221da9e48a2e67b31765d60ff663745cdef9b5a725703e96ab7816cb7a35d9690283b7d632229750e7590876e2e4740588a293504ff309c60ffce3b5a8cbd504ac35d8ac961d308981a4216a930b0774dd87f4e77b50b741775d70401ceaa996a16632f61c097ffff6a552b7c0903c607aa66f2ae6ce0fc12068409c24e03e79730686097bdd022a52fb4171a6e5401a64c3e4411e9213abd90283b5d203220933209e6f4533b8166d044e22cb413785e1ab63043bed51424618be16c062dc04c002d41654603256c83e16c0640d8e6214e7650c32d60e864074d780a24b4253587e50ec2fdd99d8ac37a8a1f97f5e778250ace5e05f7cf685084690e83b3192ce1fe48c5e3122d5ec17d4aa2e6989d466b9f0652c2ed34b8b90001638abb20ce3efc43ae49cd7589c3e025dabedfa35171576bc008fef6b186849a230d07a11db0028c1e60085db9fd210c538c750ae0abbf89a62770143e16e71e02b222480b21dcdd05ee219863829a7b6808f2404bb4fd6c24de410e934ec55fb0835ac861505ea7c928ea6c8b0e9a6e59d44c71c7597cf5e7068ab31893b348835a7076da18187e8e3449a34a78b0956787d1ee038fb5289d20a796b9fd6027beb77137a8ab98fcfc155ff1db427751cc1da166388bb1eff83e628cc679617cb98ccb41cd70a6e331269fc22e958de0a576af0b6f3e6c4d7baa52bd66757c570e87c1590c9af00c0c3f8708788c1ef9f8f8082183cfc361702603244f721013c835c9600b9c61958e0e1f7e8538183e7c9c76a131fcafd52ef8432bb09560d47f0208f7cd3b18661786ee440444c0a638848e8f8fcf10337076e9e868a1a4c30998f8fce00b2a3e579220129a206403a4114031c20c64d00640f4800b0f18c9a0e8064180ad8e420a2a8c70c413b526239064b00614f0a62e92d0c12b5882b79f50868070f771524a2921ed5efef4bcee8b373ec771fdd1a3a89ecdeb2c111e503478a820f3370840594113540d16023778bb39b8cbfb12696c81c6f1f68fbbe27b9c2bb96bc6126af6a52b0ecbf44fefef4c0ef3f725c8e3bdbff700f26c4f44b5fde9a9f56c638aa26153715121942121dcfd6621de9e4803d93ee22e6b81c6f47690aa65f0bd197db694787b89b7eb5486a8190673393000f2441b362094f2392b24f6307b9838c35ac4f14aba45edf7a6d31143280179a210e867c9945b5347083b9409b7cedcb88fc6616068664e97e3d4b9e0968190a75f2857ca068e9c499ba4b8dfab1f7cbc13741a9237af74de25e3e5fed76ddb5e06aa47a650339c28fd6d4b6d8d7f9b73a637548f54cd09651286320a7994440385a2150d6ba6cec4185da15063464d960f63e16c068f8a82dce52724906018e4479c9080488e703f37b4dda0393453309540ef143495cc14e09e47b3889e824e48a6127ae790176d5c5af5a669d7e17c53e84bb9c0ace8772e30bf8271f9d509e6746bd74f6da0e657fad17163d9e15e79c32853dde3afbb14e6606a3dd7171481e0098774987497f4cf5d30d7ede1afa67db9b8593d760a82a7a0159d41f1e51b13ee334867d61914633488b330be686ce17ecf718339bb5998ad89da83c499fabc5e0adf465433cc8461217a4bc8c29692d753c15768e931ba15d52c31ccf1de5238c2db9830c21340525a106078e154cd2a74120568ce0fe055ec281ef4995c3dc1836f55532a84d2a4099426533084d2a409ce144a1326184269a2046709a50909b00b86509a00e1f67b81f628e7c6d1eee47da8aaaa5378609c9650eeee22e389225a93f122e3e58924ef8a179817980d0b6a06130313338f90428a991133635b82473483c60c1a4f38e1092ab443018d158d952c424a02fb7f484790365057dfe9743aad6490a6d07e31c2cc8742a150332c981db06858342a17b456f09e10cc0b7ee8c4708684e5cb8206051a145e00e409c92778e52e17171717146a4cf1a278797979a95153857e4631313131354f83060d1a6fdb8922aecdb579a17509361f8bc562d9b47ea84442eba67563248570f3b517385f4d4d4d0d8e0d6bad7541264ca4aa068d4a7add78dda0f229253d51e509bd81e306cac3b1115579c10c288e1c38706c44397272e4e0b4d41c1d393a9e78c21531c4161d3b74e89043b5b64367c70e2657743e1c3870e0d0d141aa4253f872727272524801a988a298b4d7c40a3c5658a12bda544002194978b0c0834787e10c06452cc05860e173f2d52728521618a8406608b0180ce5c5beb62e614e0c7e60f0041830c1a07685531fc4766231a426387f70869424319c31c9f23059ecb4b0b3f38410ce1f9cc1e00358360c674c8824152d7c4d445bc7b006528ae80b5b6801d533610ecc7941152e063ba7253a31482206486850e18cc90fc570f68231204f7cff0979e08ae78bc562311e9e194ab4d0420b2db8e0820ba81e175c70a1478f17604139c1833288e1f90b68300108c450c0c02b546358032947f0ca5d282212439803733c3e8696486fc10e73fc67545354383bd2223bc80331e459b9cb95b0c4125b9229bf907309a429bf9053ce0d69caed8b268230ad4c2b56baad4c2bd30a5785b6c3c494534e39e544e2e8462db7d907c06e243090c0400203098cee258220c4184dc8b9cdcd8a958dc96422adcc299b989209c77151ac489284a3d40bce0b8ef3624e8934651222228e526e09607cd1849c4b204df9859c4b204df9c5b6c9b92599f20b3997409af20b39e5dc90a6dcbe682208d3cab462a5dbcab432ad58e194e0bc50c2944b204d99644e893465128e5a41bd18e2bc489224c99c327645899219d6216b2dcdd46074eca3d19aa90a2d8ad7eedfddddd1ed1017ee4ff648d972f6171e6c65193e4b6afe68ed514a39e7dcb68de3388f7627ef43a554d545c6cb0c08728066be1c3a70a05c64309cf62110e4b18e1bb7bb6bd4bc6adef5d686bd50e01c01cd240c63aecd4d53191a726e08724391c927861ba2b4d6d5ea1fbb300cea87879bc987c946470b728173334148fb6830c773820d8e12574808e7e3a23cd1ceeb25ee6a544fd74545cda48f3aaf99dc8574a2d1a4936cd870bdd00c1d10c6a60bee6a8cb004ecdf5bb0df8f8683bf9abbba29af1b20a8010454d349b98103051c396872b0728274e800021a1212d2a16387cf0f5a76ecd059a1a093820a33545881e64cd0569850bc1cf1a0c311875d6a426001a6840ca1a08fb6246475ecd869c14527851678aa0a2aa07aba157854b861f4e1d386750fff6b98f71fed851baac1719f4edfef9d1a0be554c083051774f4685a5bd15360ac6b4d851b0a36c7f7b02ef0d8165ca6c2ef581d1fb3391e6659e061570022ca54b83f4629dcebe3aed6b9f7c75dfd3bac8e4b84e3736c8e4b04f4321cf702c557ff0dfbffb235efb235de8645e171ecff8dadf996adf1361685bff6dfda9a57d91aef1685aff6af5daab9f64a8d6b9950b8168bbbfa696cf72c4b7fc6762f63e97bb6bbb6895eab25befa61ec09afecd6851051b2601a969302a403243cc3461208a154041c63b70e3869fa0186a820708661aeadc517abe3ae7e1916e21d174bc4bfb6b4401cabbe9bb2f95b3a8df8fbef73c5a9ef330c4e7d1cfefefb88fc80e367239f8518658970383e0f87c5efd77158eafb5596486fc1a9f752f6433d447d288f0fbff830beadf5dba518a3df6f9962acfb7edb1463a7efb75a62ccfbfe7b8170fb60883d3b73b2334b33d4ced0946a9ea1e11a2d35b59a255bc3145ffdd20a2935bf8c41cd3535dc4ff002e71a26dc35b51d9c9156063a950169049501193f0304792e46ed879c07655042f9c9126778fae079d18b9107772d3da4b49ea488400ecb435678fbf8f3e38f2fb9fb92fb120f9bf5fa73540fb4b2e9871fdcf5392dfee0b04d29be86ac707c1ea2fd41881a7d70d7fc787fa8527fba7c5e6df576152aee9aef42049aba99a6fe74f36a7695eff9ad14634edb5850732bcdb8418df3b9cfbed44c30677e17c5582bdd5c4fb32ae7c79b610dc7eff9be7485c961dfcff726cf82faf9d1c743d96e3b59ba7557ba8bca3723ed9aea4f8fd363f491b2f93f386c42a9b9e21967a71f5c99d9804a0d6a18caf0602b6f4138be078dd87a0967b8043f77f2a5d43c99a61098204f7bb109c18518386611068edddd904b650c602235b8f3a187ed4e292494c49012158fd15852520325262649b329454c4d58b26c4133044660f8d0a3745284f3ca7301c21d7e7b682ceafcfe3091de82b70a73e24f0bd356461014a52985075bb92553abd154a3c96113cf9efce0171cbf66a86689c7564b35c6a8228b4c128e9f6b8e04e1f82409ce3542b32750e05ca3a4c607c797ed32490ecb32359999c332956922f34406ef8a1a4d1ef7c9d4fcfb11711827a16e9a41324b45a8fe364390a73ffecc523fdc6a30c5d7aa07ab2598131fe668fb2c53ab1104736a9b95a9c557acd154230c18eb3e7e8da61a2370ac1102c71a62e0f8324931d6dd1a74b5e2aa4cd27665925427211cdf260538c61aaa211cfbda0c41a9b946138e0de304cc893f656a383e6b4e999a4c1599a519a019241e9b3e3257a08c51a349268b8c96199f9923324c38fe945da3e9488bc3328c1335b2d418a3adc31ce1f8304e401efff8b4e513fd5bd284458d0fa76c06c19cf810358339d1ddaa604efca2b92409c79f470e9b8161cc645284e3c3274a382e61818fa8c082f3ac3293da851c96eb90c3b22a0987c12b709c82f35482a354411e6f8a23f07a38bd072dc4f20baefff49e9f7e7e3afa3ff18388cf6d97059ffb18939705e90be92e0bfef65448bcac1bb6a7cf8257c8f69425643ef7f33923b2938cb350e6c54f02a1a20ad032eea175ec350bbe0f8d59df0b89df3dea1b53cb821f8491f741741f3f0823d415229f7e10f1bbe72c0b5ed6776fe83ebe90eee365c187f17512425f7e10f2b2e05db9ebf41f5fa78732faa7262acb7beea18ce55dd60ddd738f43f7dc0dc248487cfa41c8ef1e07fadc733788f8f4a10c72efc34f4f638cfee961eb7477d081e2b590161ee26b89b6135fae6e8bdadf1968f7a495ceaa4eeeda96bb9074db1da283398ee32007e4fd6fd6f5ad8f313aef67ca715f4f8039cc3d410112981342c67dcb87e8fccf8e0a0d38c1e2a48a9c5b781d853934e66ec433d0de533ca7542986f8a235af3094c950e342ddd5839bbf7d0c3334c1fe3f380cc6229c358109f687572a76269f2938a8095830b7cd159482fd63804af1f2684b24ef67899707b53fca265a47c4142d1993331f1f1f25b2d5ca5b1842188e9284f796b4183cd8ca3dc30ddbbfbf9b386c761f41d69c108840bf0e0e53e1243cd64866fd43a6a882db077723c1dd700cdc3f9b40888dcc30f5923e8a4f64b2a8faadd7afe899c79a4781c63528c68f800e9d94bbc9caf634f6a2a83a409e19d89f07c813b14331b0b710d8bf8d80616067f51bc1b307a8b4ea26eeb2102b61a8838c7e458535c8bfd802b66860438791534e39a57c193b507f7097d7da27527afb879ae06b39c2fe9e2f5525ecef4b3ea76b45335dd86fdeb6f93107761adc71db7ce352d55d9ea230c74f4a38504f45a7215ae1e7d349e8742499b2cc21a812140fa812252e0bad055dff3a3a3a5186d011117f1084da290b0f047086bf5de2f72c3e9c6118239c617973c5dd10ce8e2a0c6752809c88608ad804112abdd0b7a0b48da03a71c7e5c809121fe04c6bc0832850e05cb113245974904c8f33334015d230c4b0887ae6b8b96ddf403eeef1e39cef538725ec0dd4479c7490127329e698f07d78d7755bd7c9e7b66ed2c96d734a1b7210e23006ecc458bfbf92c72578b095eb128e14b60ba776e184e17b5154c83303f2481cbfadc0b1b5c0b1bbc031b7131ca5caefa455041c463f1b19c201dab851f41dd5d303c77172081f2a9c84f3939de4df490e6b720547158edf4c0ecbe2b12662a89f380cce9c20c95dc3b16748389a620bce8d05c756c2f1616e2a387acfe8ed29ee4904ac0e7688bbe2fc955d155579eb1575c9e396c3a9531a650a9c57998621bb63cb8edd1da3c718390c67529ce05c91209131b80113a648185b9c11efc3dd9de3e836a9a49c84f05f2787e7c09e632685c899107fe035ed0395fbad0789336ce2c1870c5a5515f5ad4eb4af0e5f136aeea3a10c9b329c454a7be8e5fd797018cc771e53bd8c77f969612c0fee7ab93ec031b07fed1fec8fbab97eb78fac705e7517fa0bdedc48f04b2354cea354f899cad834e73ad985e7efb94501f1188786640f9039513ddb1614b4a1807038bea78a2da859caa39ea5250c63500cf299cf9a9a5a50fb21c5447a0b9d1b4753d988430c513fe4bdac2019cb2398137b2b02cc5c419c4337cf236073053f18fe1402c2e610cc02be3cea19b8bbbbdb513d31fee88931ce1903714277c518856494d1354004638470b5c2102a718ee3525b445102e74fc9a0cac07016c503a91344f1d1f22d2b80707e1d0ee99dc6177cca4122961097f9bbcc2f1041c8607c45153ca4b5c2ac68e28fcc0a9f09a12042e948159ef7b09577f858287b77350f77f57f370fc15f2af59fdd61080cb6f4037507d5dbaf436081b22dcfbff79bf3902158f5a9ffbe513d2af8dd9cfa1a5376080cfede3e44fdb0ff7db59efd141038f59f55f9f00af167af0a15f51f0edbb37080b2530df5ee8c81ebdb2ab8bebd020b8618622feeecb8cb7ef6c1717d1d77ed34d5fa5907088f1ff5ee60f8ddd3f75a852312b5b1c39c2a83ca02e13d7dbf799b9b9b8de09bcf14e33cce6d54cfcdf57757fb701c190b71bd35b51b2c8ee0fa37efc56f7ed536ee2662806a54b666c95daaafaaefdfbe46d5bb29a1962584fecccf5c206282de88aca6067968300ed6f7d734c5d88cdbd42cb9abafcc50f1a933de45657d9ea1f9db7cbdb9f9fec7310644cb5897a57a28633dcbd629f59dfc9800f390d9526f5ef53bdee3503d3b5c503318a101b6c3369e2819eadf5c960cf56ffee6ee00bbf521f6fcbb3935dddcbc4f8cfdc420189c4d116a19dc5fa325c65a168339986131e5e6d474cae230880506328425311603344343e570fa996f140ef2676e4c50c76e2853d901380608490d82fee95da5c5c64bd40fc72a2d4c35d63efd2abb0d456a71e882f0befb3aa4c46110f7a6c45db5a7de9a1a924ae3ae95959ab7211f7143f5d4a716ca8844acfa4d89c3eaeddf861c86f3fddecd43544f4d151ccbaadfb8be8c65d53b4393cd50f157bfaca2d6dcdc9a9abbfaa1549beb9f6b6a12e6d46b3305d7b716ca1a657373eb55f7ed1548ae3862e1001f88edf43e341fc4e9e1c387281b683a7b4239ea06f85fad8b08051aabde4565218eede43ca5b5e6bccae6a1c36c6ab5b1b9f9c3f5a9cdab6c6e36826f8ba9c5e4309bef6f61f117805ed63da402f7bbbe15f4fa9a5a8cd1effb3ed40d5356538b2fda6a358b6255d9d8a85436360f512ad5b5799b21545bb66cd922937988c2c1653217880cc8a88d25eaaef8c1f5ed7bed53b2e0faa8f7e407a938d1666833588e666833545e70ff4cd38c967e960feba79f7564a64affccd291c3724d2dc961792a3169e2303885861820dcd916537c35a4a2498067d12c9a453784a1d2129b9a6c7c3edd9a5a11aae33c43bbf1353e9047f5313f43833c15a6208c9d8ea615386f43b8ff741463275a7cf5d3239b7b849bba3e9f9a5a4130e7f559a5a5a656b30473be6f9cfbfdcdb5b99b946af399465d05c557ffea6768335a409efafd3341d1e6661a3837d79b209b4c8316633347797583f399de8899398a3837d39b9babcdcc116ed5adf181393d438352677c3e35e1a6f159a505f79f68f729adf57e5ee17ca2d91895954982398d638a982ef55936aa199a857117cbe6fe706c53bfa6d65f53658696f7e97fa03fd2ff35fd354cd146556768403587e598223095fe992a2d93047968e07e95a581638020cf87fbabfd70cc1187f9f7cf00419ec6fd3145401e25c8e377080cb6ff35d46b518fb210dbb0995edb43d3b0d9ce8801c2fd2bdb83c7d86c6fd82c9ff86cee5e36bf10b8df6573eb08dc9fcab13df48ecd3666b37c8287cd15d358205a363fa21400ebddb150e6a55e8695c143fcd4bffcf7281f1ccbf89777d48ff832ded660be3f651dc3fcffb09e50fb737a223306cd7763382cdb260ecb59b4d0f8b092baa75a1c96893cebe3b04c74fa54d2cc7fd736d999c33291cca7aed552532bc0f7d754b9e1fb6b966cf8fe9a2b357c7f0dd38defafc1f2fafe9a26d7f7d764b1f1fd0fe4b09cc2fff8fe3fe2b0acf33ddfff410ecb30fc05721712876501fc3de2ae16224012340ccda04486a2ba0475f431497dff2b392ce3977dff4f71580ec0fbf8fea7bdf0fd4f0500dfffb5017cff5709f2fdbf14c3f7ff1520dfff4cf7fb1f8bfdfe6f527dff677120876517bec71187e5169e27680749ecfbad90c372ccf7db241c96677cbf1d7258a6f1fd5689c3f2eafb6d91c3f23fcef7db250ecb357ff3fdf6c861b9c6b7bedf32715846e16dbedf2a392cb3f0b0efb7531c9657781edf6f690ecb3a7ec7f75b2a0ecb393e07082953e1fbb1075130371bc130efb2371af09fad0b7895bd09f896c5b1453804fccb3eebf50260fdb845a8ab00df0d377facfbbaf98677b17eb004d0ba0c50b1de46035e34f7c728e37ccf2d42f37d1860b0e166570d3660b845eaff18b96eeee16eb8b98687e116a13f6e8681b27ef4bc8be572dd7ce36db05c36fec7a8869b8958ff8306869b0540038300fec7a8e766d7db70e3661b5fc3bf184073294d4b55ff06cdf7af5be4a3b9f122a2f91603540cf8d1f33f46f5e61b5f80efe6d7dff0288ba200c8ad97dd2294deff312200a5e166d47fb47e3894007f290068b85f1580bab9fe473fb50054777f8cb2ec7ddc2234e3fc0b2f7c8f922195f2f12fdc22b5fb1fa3ef66d9a76e11ee4bcdf02fdc22940037bf40a90cb2ffe8f7d12ff53f4633dc4c445f86ee05fa00b845ea0b00f87e86d4cbf02805a87cdc2c7b1a3a1cdaf968ddaedeac7a545751ff6324bb99a87b1f0ac0e9bea500998fff31ba37d72780ea66d4d3f0d6dad3fd31ca06c8b1ef718bd013ceff180d20c8cdf6aa7a9c62370b799c532c08cedf1ceccdf755a7f70458effe18e5013ccf2d42330fed11c3cdaab740dc7bdcdce37778fec748753310ce00bf738b502137efd0530c405e7552a9fca4f2ff3132c0cd44a78fc1db397dccdb89fd8f11909b551f833f90b7390ce083783da817c4bb37b7de7ad7fe8fd1006e26f23e480e3dbce7c9a107cfff18e1dc7c7f0037db0ff2373864726e114a0d00bb69c9e0b40e00bb45aa0c0e06c0b945387c33ceb764dec616e13011026e66ee8f51169279fc8e5b84c276dcac6c6c603c6e86fd8e5ba4cef068dd4c833bc0af64721e875b84caac687c4ba6d5b29169d9fc8fd1016e2692f91d333932bf9ad991f33f46346e6e3d0d9b5ffdcd2dc261221c3384504c3403a3330688f919333837cff89b5be4c377033f463837ff6324e466a29937000ed8cd3c6e918a37f06304e3f13f463137e37ccc8c9b6f7ec6fb8805b8c1861a0840c30c320c20480c407ed814bec7ea3c0c56c70bc0e67899c53e6c005aa6c2bf60753c000229a425237c319c4981648822a9c2fd5504788563cc69fd2b9a0f0700c0b99573641e3d70c438c3293638432ab84a0ccef00ac49202ce300b8e708cf87d04c7d849a4706e255d0ce1f8323eed4209387e5de940081cff754005c777ede0081c5f67075770fc1d1f4c70fc18aa5481e3db80031c3f0708380cceaa28c14a07707c1e1c066756b2c0f17ff001fac1f19b07351c675e3881239c2d155184ea69312a142ca3c69108b418c1111b50a18407448831ae562b0f9a5281244f5871628a069430c2ca96262e1e93320ab13f85311f4e61a4f20da1814fcaba8a4539a858823c5d0473b8e79ecb3b3116f3f05f3e3f66cd372293f1f3daf053dfe58dc8541fc3c5bc7f4c6c21185be38bfb17ebd68be28beba6f8e23e29beb89fd6dfc5cab0de54adfcc2c8470665469c0df1c5a9fc55fe9c8ff8e274e28b53f905e29ff387b2caa920105fdccb1fd4acb23c58ee3721d8c412a27a7fd5eda3f8e27e165fdcbb2ce1b897b129c6da87934098fb6e963e988b5a30f7bec4bd337993030915cd68b1c67d5ce23e32c5189471be145fdc737fbab98730b78a947b2887a8a3a4f0604b892abb5b87f86affed8dc8b60bc4e9e703d1e50aff643b4b2dcb597e5937d09f2f84fefc2e3e5dc5577c1454eebac8a06cbb14cabc5e411e1db61d5479730be17e186544f23ce9ee34ab6dca888567595fd061e1eebea2107687456d08698a1504fbcd0bc01d0a3ce8b0ecd8a3cdb93be536773965f794127b52ca0d42987c77e9eeee6e1bbb7b6329a5a41ca518c258fceceeeefeb09d6659e275453a4abb221cdda64a4a9751a5aa31d6c1977ce83201ecdf12250387a32c1284e2f8dda98db87cc28fa078a2ca5802095585e1ac368227d505c3596d03a929b5c370c6c518292db8388214556238e3a20854b808820401addfb4abd48bd4575390c64512ec8fa29d931f13a83e548fb45409394802fb7b1546151060c0049328b25851852c56c1f1c4e3ea744930cc3034d897e004fbd32d92724004f6ef7e85859415f8f4608a23407022dbc1961f789122b1796048d6afb3136330cacc8b201f59bf8fa801597f0c5490b0d700fb53548faf7a157f15a3d052735e978e6c2a1c7061ffad7f80831de0f8b1d6f8bee4e3e34384bbbbcf40fbc209134830010646c85c07d85d0676777797a81ecf1f4ca67982738b8a27e0f8323ea56d81e3d72670fc95165be0ec065be038c3010970ec2bd55593707c59abcbb5a40545243802100f8a64b18b21b070a1d1d6af66972b474724f08d0cd26438c1614105044a58f820045b68582481881e1f1f2c9a70640b5316451cd972145f106f5b5d75462e8c571245846a319c41514331018518a9a34a430448242d518120a90a29ea0ac35952edeb46f3f1f1d9c096d484b78dfb6ddb3e7f6bbbae229ef80b4ea1546a9515e68ab8f29c0b3fe4a2f8c1dc4b11c8b88769cc711cc731f90b36f90be21e24b4f80be25c535844e1ea42c86289e1ac6605ceafc3d1c083ad3cc307cff7a2a81c0920ec070c7049e0f99b1830d643f1353f7347e00939233821200f0dd714372d9087fe7c0ce44d0a3c7f4b82aef973abc5d7fc55dfbcba3dd4dbb5814a97c30d8ed26eb5b9f2ae0df1359fb337985ad50deeec4fcb523085f95faf309f3a0bf3b7da129e31b86b2ea950263f6f459d85b22d29c67ed88a624c072679ead38956a1d9212a469014b75a8d4b38733e272a46608413ed99c332645272586ea1260e8357d470fe3017386f53f09c34c84303cf0fcf6f25db90fcf93fc4980bbee653ee66ba5d2daed57c1d86fca4b4d6183df89adfd917f89a4f2d0be6ccdfacc59cb581a3eda1f1a9367fabe1ed5b89bfe6f790bb5a89bbe6b66d43d4f89b1d722a72d7eca12498337fabe1f91bd376a5fbad8abfd0d5b624c803ada4fe8aef6db5adf6db92c364f07c0ec861483c06a51c6d57b06c59f07c98391f3c7fd382e7c3cc1dd998f07cca6d5b92c3f2968495380ce68086789252e3673ac3474a95141e6d723a53874218af5dd0b6dcf5dec7984e7cf94b1dbbf33c1c063d3e7cd7c787afb3b3e32ecf3a3bd212d16ff953cbc35ffe2e5945ddee8abb5507be0fce14cff972630a02e7f91b9c367f79fef0e13efcc3f15219d4adc8f377316aa5cf59ca711e4a85e26c86c128cea25e6589c447ad50967e47d40a83214d13953ef73338ecdd15bfa1d415ecf4f161f0382698fbfadfab5e421e0f65b354d44377a1ee576f7679eaae5b6b90cfbd1791a81053ff5ac63b2ac87ceecae096503ddd4ba6ba7218ed1ac614f73e9cbb2cee2166fd68ccbd9fba9c136737954aa5ba99aa6c55a9208fd7c371af7a94dd817bd57bf5250a48455d960ca8a70f04755d32f71668aa823885fa2caa7baf83dd31c53d772da598c70f2baa949a29ae4da59022846d307412a5087b2ad8f2e1f4487d9cff094cbccc527798dfbffdbc7987f8fd7d77e032cd437cd83e75877cd8f3bc9bbbadc7d9ee1db07764d9c3dc3c88bbee3bb0fdb410f5b5d6ef3f067f978fb741883f033cd644e408c2fe3a3dfceb970ae214d2fce1effbec1646fdbe0ff5db43dc9685ba3f30c4196ea7d4b6f9882877d77d77411fee4cd57b291b2543eaa2fe6459a96f9c7aefe4acd4ad32594575dd7797b752edf73e3f0ddb0966e5aed8315593a85eae9d95bd63fe66b7de316744fda03f6df7b10335437ab99e1b9653764719d42654442541feb427e5c805e6486056e8819626922ce184c9165b4821eabcca90c0164d28c1114a58820b9c504942f439e18a129e0439a184832b70200548b58940ba5085184e504212b4f869e206528698ad04bbcc21e4f11a0576500c2c2c68011012ac18f2428b219c56ee729812c0b40cda8bc203d46aa2c05f9490a81e96ffdf149dbbd33aaf4c7ed3f830a9832881842474c164041216c8244d461428a8bb0f47d214cb30b24489147ca1812704a140053299451427e8082aed76c2a30e83f05db5c298bfbc2dbfa55b77ef8007614cc6f78a5d857770b8d37103ddcd85471d5621840e1b4a8c1dccf6f29eb4a8f1b3ecbaaebbd45d316e360fe981bb9731765d8cb1fb2ca5fcd87537d31be526e14b0969e04158e3fc38637cc1e6807c08e14738699c4f638c787e0c9a47a844ebd7ca9a20778a211208001000007315003028180e09066391204ce338f10314800f80a050624e1588a35114a3208a3186004388210a184088314499211ada005b780be41022418fb4b7ba488332ad5329b004c070512eb92c3ff55b1e07e1ecbc8a92505d822be8405c80e6964f85e0e9bbedf78c3978113584dcfb1b651a73905d916d3bf3e176349a02f5dbbfc1e9001f0cd8e57a11e65b8e0d6da8e397af58b4930155448fbbc44d4a074306a89b5f0e0da8e513b3461a2edb71f54d617723c345bf9ccc48c61c726109f7b19749bf5ce817115112addf500b8f00022628c5c0a160a230235c21ec853e3671ea068953c43255fbbe5f7a0d378156c6487ee9e46241967cb95b85f9596675482fa9891d862ae5a6ccccc462bc8e713e3f5c270ffabcc89c2f7d3198d7015d0ef4f361ddae7bdda3e46b8b8a9881174d8bd7923ede7bd5d85eb3689e03e124e12719f816c24e0bb309352dc5b0be711bae95b0914289db1e17c9359eead6692b57c5d05d017793f63be75d41498c0e0452c1ca8490fb0498046f9a0f8dcc2426ba92b89817c5bc51b72a50ff06ee1c6d6d315e3891f9cf7e6ecae1621743b7c5df78fd98ace2c26ba345685db52a8645b885be48848c5f5a3a90858218c3d13d53c453318de9223e6e3a3355645370d128eb0859c88305267358727f5ec0992f8241f135a40c513cbbf2033c6e72443890e9194e98e08e7ba98055d529c3829799d05c2050d9060695911bba4c8647a88930f9c2c164881e4b8c75e105fc0fe3260d3908c32e5eb133bc53f7f16539ad191e8374ada51973728d28059485cabcabf06e51d45ec92f488e0688379afdc0871cf3101c9ed89328655b51c11bcc3c16bc550cf72dc092c7e073c11b52e3eb06cce00d0770cd9a5b576cc36e34c4dc57ee16a2e751abf0c8075c9de3d5f869363744cbc58599fb663efe1f2cc82ad093474876419d73824ff288638ec57567f3a0ac27b0c0ed743a24f07df288715adf25ba955d3138e645dd4ab66d8042da58a267c66e29b76a1e6862de526319910fcb8421b5ca0a08f35e6344e0c9e13232aa4559d53c8cd225e0f347a77059c3ebf780970e0af080c7b2594a707738eba4e09ee1b62539d295a207a9463fa07fde00d6c325814877a8d8ef39aeb76b1c0b6a27d830ca24697bffa5cd70a2115feffb541518682a121fa2b249a2bbd90bdba1fbf0c16fcb29aa7b3b24f2f011393a777d1ac7f6d80eb1fe3aa2919ee8bc8ac1ede6072f9c1b200abf50523f0e93871e957a8e66f7eb8eb5b01628c68e0c1f3f9f2442e8507edf8f75156eb3f4e98af8e33e3383980b84c489fec055475f041e65124d205a93099a89e8606df195074733b6315bde2f8805f4b73b4db3d975ed612ba524358c3fb6849f90f1be54e0b66652d30857f09940fc0346ee3cbce22962d9063496ae2e088042a547a40d47279509a02e1e53009c727b12eb4061bc304247817cfef9968819d8f7f780818b112121bda7893ee3740cf138a6c2695acd1011f142c857e5e48d6e583f580363e72bab2208c00c0fc0abb936d146e10f6941c7e669d8a304d3f40630ae3288f75ec3f423f7011b858fc91904e6e702ab8824d33067c88c55e84198922d164abb5ace4a03f4d35ed5190d485e7eadd6652b94f614d9aaeb97f2b64d3a2a07d4fc60f2fa8d1dad0c54ee8a9e05f2b9acb2490420597833d10dba8fb7de2d47cbc1f2e5ec1f2400857e2254e8573521ef05b7c40ff67880283045db55fad8236e06471be4da9956d77870d804fd85dfafc63afd1e19c4083e6dd017fe4759ea59806fd9c067aaa89801c26c3fd8a3c1c1f583325a4fe1e6af35f4b5bcf4bcfb061c07e4ff1b7e5e207b7d2dbb2656bc8a89cb603696dd034e08039f2808e5eccf1b62d1c9b36056b010e75b3e176e3d9a3d43fa5693552ecba2d5b56837810010a298a0c1c7d4c8f7b9b1f88dfecdca837de5b1c4f362523be0debfd416fb8329eca371e7dd550719afa824b6729181e7407ff21528c6108783e39ddec6f27e07bebcb741c2c15f906b7be026bb7bfc1be56f70f8a4ace07bb399b8d51b1c5843685bb1fa00b54622a41111c0373805ecb83b2691bb1c289f3909a75eb61edd639796715cd9185168c08845b4a84611b29818b280989f7568ed22ab3fc553a1b4439cfd1a84b5da38094a337ed9107bcd496db82cd3387f08b82fb50b08850489da8fe061e1d51073c980c8a0ac1ed627a1102efc9e5c2ac0a10e5a487da7149aa3e4e1b1b13900e9c0fab0ba577f4bfd1eea22dca69f97ef925899dfc988a278e47c832c7e5b0688dd006ff21568b159d3db0788c0960a3b4369e01b22e3eea413b7a94e969d73d4c2b88273e6992e8967714e42f308cf852ea83a73f32e7947cd84d5d5ed3db40fc9ce0290c2e1ffe865daf2d1a4b7826c19f743d5960d83c55ac321003cf420dc312cd6df99ad7c9b72a055a94937c89971581ff4716094c5b2b064b587a305fe551e9573d9c07fe754b5a07e0a8fb2ca441c2578c718ebc344eff589d6b2046f13261966cb77e1976576c3ec8af8394c34fbc97e6e84a1bc261ee92482fa059dddadfef284c25bd637e800e39ec351afdcbbdfc062d7520119b43466267df3779319f7976ecb730aed01aa04cb4406f492fd138c5095a0276ef9a06212516f3d7a6e827755017159a125c757d8fae1b7195ce8999c89d41bac18df822fdca6fb1130d963edafe8ace3e802e838ab4aaeaf366fd46a602826ca0a8543b2eaeafa10ba291d70b7f9c2fecafdbdff70ed6733fe8a9f9e3105b293593ee77871248871f397d8bcb2d1cde16cb18135c66f95dcae3122b654d43ee0aa36e3b5db41182fbfe908423305dff2164b4569bd942afeb6071c29993bf0d7cea626180deb155c6b9f70a6a1560cfc72e3a21fd4372fc2ab14946e011fee8dfca39bc6035adfadd604096427f16d1374ffe15c7a39cb9d4e8be7f5ddd97739b77d87846b5e832c22e2361d1b82a7ec878a47afaa3de964481fb76d57e18696b72c52405523dbfab50600d9a67677022daad3875e17f68120f4951ff4d1607b8a0386e512ed0c7c44239a12499cc9a997122f3ebbea3ec6d67ac5550f8a8399b57e3c5314cf696b8bf25daf9444694218a51d707075ac56d4f8306ad0d70150ef93668a956ce2002a75014fa5d30a318322efc803f01c26005b9e4dde339f30ccbab09f29e9ecc0a521096d5dffc645a3200ad85404ea3d919f0b65af8efb45ac225ae9e8933e566d8bd10cd2f1fef4f642984dcfa63524276125708334569b4e7352d74beb07e65c503c0107240487e59eba768ee73ceaa0dd12fb1a4a24bc98a460152ab8527780378162ca2d9f7fb882b10a01e3483ff85116653ed79726dfd524bf0478b45cf1c1dc926fe97a34676de2d3c366ff700d28758a251ed68cea30febd1cca44c4473788c4f80fc31bf2fe54ddbcd4a964a32ba5a1e59a271a0a65b956baf82996a48c50a90ece5accb5cd6611baa7f579ceb9663c3b8b6ad762128775372889cbe95801c748bdb3c1fc5367aea0546b612110edc0c3a2d595c8efeb1b4b480c125e554db7f8bffa1a72611810fe28c84f06dab703a0c51c9335ca92c567010047130fe260207c30884009b236e9f520180fd202ba0db9973059feae66659026619af8e2c0f7014876b37c3f92f642fbf7bb7ddb7872926fdbdfeb8f624cc133e82a86010a0c397c6818f8c0ce269cd33936ad4b77855691e88556bcf4a4b7f00abd5c48352faf0e92af0142840c7c444a1669d05759401c1a5852f276a58d77060929c7eef955e56fdee3e84fda3d51115bcf8bb604087d719b66a02c2bf1101dbbc7a7602d2aaaf8b6413b9e5d5c59f76c40f371140024f2570038541caf67349a3c3835b9a657b2f97639a67aeddc7e22cfa262f62f8a028e700deedc99009aebaf2568ce302aa47b5547d45e10d27eebd0dcb550c707f989063a88fc2a3a42b21c708329561f698d0967887a22471cc9caaad15117e5b38754cd71fad72c16a16d8b50481c375cb8ece8a570ec5732a3585e9e64e952fb7d65bbb2c25c2e3000b835d4815dc76eb4e00d5a490d32fbd45c7250cd7010eaf033fbd705057cd6ea2de701a38eb75e90fa20ec48a788507ab319672a8194e5b096a758981d1766382f3a0ac49cec8e26891daea550162b69d4d76d55f61be861c83691dba7ce8b50eafa13fc395b37aae5bb6b8597b417b1c3df776d0d8452f4262cbe56c6568d1c8e1e832a49a3dfb1f471f548d05545f3eeaefed8de0384e7e69dfd6f0d0fbc573d41d3e5cce54cad8e14192ce6c036ba7742e598dcbcbb30a0b61a4a9176fa32f1c810ab6e46666909547b688200445b7be8751020bda8050eb00bf6b2638d23ecf537c1878fc635b9a0985c91d842ce2b0bf715c1794a17a9ec30bb9a4baed9cf3568e9bc4a1d993a4515c1d7b3ac95bc8ca9a3846bcc1e5b6c0124e1a877e6cf9503caa3c5798ec70456145290384e7eda6d3005d0219093f3f31672543f8f388917e064e776f7a448f250d6113dd0c28fe0f4aec92a5cbeb1bd05cb4c544001f12c4d5d633d6ef3a63c6bb2963384372ae6a1380dd3cd911e5af90fb42fb32f2d66b42e47dcc761eb236258e23483b2c7e90e9cbbd813c23926123c5965d1871d88dc42019844b321e3051e6ac17896cfd791c9c91081e6881117db27db82426e28552df53624af9beda800d527935612c7b25fa9f54626c950c3c3fff54ee7ac1a06c4c9dd90a69c9ef2c9902d32e80aff4494303b29f01e127b06084480412c1d2e800a5777d343aa0114f48140e902b7da13ca2cd0f11699aaa0a4338b3a9e6a2aa16b8ec6e400132a6c3c149dd505e5cef0250d354e6cdb21e66ae286d17a40d47fb962061c78422671b0703fb01212894802d499cee857aa1c2f9143039f2d7de913cc47a415df2ea8e57f2640a6cb503c38def9cbeab4ed9b7c43a900bc3f32c4ef8e88cc18d72a08df21bc4370aca42c342ad3e30321ac2ffb6985d083cc101867598093ad0471918d03f979362bac3dfc22422030704e5158dc8088cd47f826fd70f8adea846bb386b80346d62086ec1a61221f44094ae2436d7d5ebc6813f0d805122f8bb233599a6a0d8b5a750d90f39ba3c4dcf097e1e2500298025f6007c1572222e3906464f410be4b68e55b958b0f76f3c40a99ed62cb4a849f85b1b3cfc661cebd2b03bb6cc914727145143525e83b6f8661ae17ad469db7a2c05ca2a665986f5d88501f2cd0edba2332d3d756cc8861aea62d72e255581af74b121f571772e7906087dcfe070fee069d417f4c9f8ba14b657f448453721b5306841d8e93eceac9c9d0c578f11729f2e70ad01387a6719c95723b1ff89f3a1dc048da4c785a906ca491d1ca970532937f5d0ee0f171fd14e51793db0ce096cb2549f58aa4bffcfccf7c99a5beaa29ebb9c8e933dff470a514b720f51dc72a4a533884cb5165575e9a853906b7fb7f81bc8f5d25bdae73590f44f453e746469bb6d20c9d2bb8f7b79c74e6493f102a4930e73625a77198f53e9929cb8c93f587aeccfcd313220e2e6ef62b3e344b29f56b47e7fb89a5b46dbe8213c20f16e1a5a6c4b80e4d1fc622631169fd0ad1cbb4eac441e81d62ed27baa431c4b61d93bc08e87054bf46f5615b6a72713d2a8545d6828f6b5caa5b45d9d826f6c8361e9f6e93be759b2bf23846a96ef9fc792c2f632b7963c2c1cc8f6a7aa359a66ebf186e4962ea169f625415336581e766e1b56d18a5c440b86b66369c6756ae5198ad97b63293d1af486d0b9c87124a80d646cae3472c99bbb6e24a5f84f87a49f979d6b43a97df7115c191a0660a137ee70e4d79ea0a6c58432947f42592b2cdc3d59071b4d3f32a38c2d03f765e2a6d635a749d4317fae3374ccc91c1b5ddbb51862ccde262b75ef27463ee36ac081cc37ee664d185da70ac597a47ac45290e187388fedc0decec8c17595135d769b9d091ba457fd8e5edefa0714733deb209cafa7711e8efad7ea480b72f3411b45b1184d76515da52d20a2bdbfa52b97c0dad8fad03fe8e36dd93bfc6ca62ce354275637482550c85b916d78c1d5e97d690d2dbe671d85e790e1de30bcf608eba62615920874a179207a1bf0713ade2154a8eef9dc75e3f735b7b1c7b9f39512068ecb5451306230db4939935385282307f1b29b5a01467d733881487f39f978d0d84d208440f158ce3a47e52c805b34f12cece122717e5ca3f7925fd62cd6d9b454435a6c67da91caf88a0846118e182038ee879801668b21a74cd9116a1bdb73e7f2310b88d5ca1571f7c6fcbbdbc91724f8d70f0c2c2ead649c3c7f5faedda358cf8edb6c05a0be98419d19ac65f3bace7af57b4974b7edf4f7b21ac15394572571733f73e4c8564c98c18aae3443b9389bc9db399585ed8e08eb60d0bbffb45efb548efb0268db2a8057c063a4c498d71a2b7b8ec3bd5a433b84e4fdfb4b25e38e1de1a9bd705192cd94dc966f50964d2b74d1c0eacff550a43581c0dd3a261ab9ee73f4c9b51863ad53fe0d8a88434b2cbc0d91735d6c24cff2b12599a5f19fb8531ffeb5cb1ad38ff783ecfebe388098841c5f6afee7c1c07fe13fe3d3479c58eea0bca668469452fbb86623380c137ef62ffdd696b06dc44a844d806c1d09da090260be1aeff1fa3f5c555e242948b274551b0fa3619cd588615b0238ac77a6f6c05328b067043ac30dd5d0a9ce3cd150f535b9c5599c7b0a43b83fbbdf2610b4fc9bfd6ba0d3a2d310e6e9ce056603db95561670ec639361e94cb0a26992ef803bd07ecbb5d77e6e664aadbfe18c2498e53eb8589f3015decb51dcdf51ebce704245dfe6f21bc2b06bc608d5640d707282246d975b307b64b6ae80eac2262a0a4a2c60c57a62b56b30794a8f19fafd385ab5c00953b61bae2bd0473f94919dbde731d03adc95476a8a766a1935136c6084e4559ebe3a2d288dc99e8629c4c7a510fb4f630d0d56266808891718d1fa43d718fda7ed8da0010c3c1e500b1d4a9343ebc0b1656d7873b8a40aa7cd562a90b57dda623dbf31a9cee71f0fbf1a31a81b2fdbc86eb1c0699802c37b73f08f18435f75c9231324bad39b52e9672064828c626644dca71f0cf56a8067675731291debae6adc623f928a2c5cd978f29dc9aeacaf3cc7d49f760a3aca00ee20a25e993b8bc7bd166a4a09bafca84ea8562e717120e4e54c6ecb9960761ed5a008d56865b82284d4fc2aebb9ffe169d57f4905cad938b647df1111707924c42658655e8d14577e28de4df21a2400f025a273623848da4ffb287b8411dc596f04eddb5051936e88c7128bcfee9e7913b0a0a55bbadb8b480ca6638471c1190d44a545b07730b61f6936597d10a76d4a8a50573c2862103e7b2179a7f95d5ea560b6d3cc276bbbfca02d26bf5d1558e444910a98f47b7802f2d1606af1d623a600b8e139c9b09e664b50a5eadcdf4d1974e04ce5777b51423d8773d3aa93099fc46d9142f56b30a262f0db99dacd770c6469c892efc177ae094885db975ad7255b77128765428c294a0d74b1e4269076ce68fdbf0d9c5217f21ccdf98f7eeab798549ac3e5d88c10c61f1efb1f5fbdb7597d4053ac20a931d88137494229573342123e1d09c3e7aaf9f4de60e96748aa84ff679f9ed58eefd2bc608f681a662fb7f687bdb6d27abadaa94b3fced00f6b1845feaa631f31b6088aa18445b2fdbdf007078ca4f2ce8e9d68f88e34c7d20d2056b1507a40639ef34c02b09cbaeda189aad71fe319ca33c16f3c7a4990df80c35c3693816c698720bd923a5a0f94c80f208a2dfbd9782c6a743fff00b047122ef1419d69e35cd30120196ab9d687ddf1954856f588dd091ddf9eb65f5df4fc432c0738d84ef37c56d509de3d369d6016549c10c993e89eb05f156e7f702484ed273c86d81f86ed175f7c73c680fb613e440ff69f782b0df235a623cc87d43fde1b1185da7de4c70783d53655a8a5e6497c1ce334d42974a0522cbb20ed9ae67c9258bec3a05cecca37af9d6eb548d619a5f5cf79230691eaa705dc87063cca1c9b27f759d62a4a5e5671adb38c26b5e80e44024f8e26d01107ab38ea01642500041b10c0e4858244f496e016b5ca6b2f8aa0d1f7a9c612866a6824c4a0d43d8e2ff27043e459e255a8c894759d3f4c1df005c5e2c9f90a23db9d041082453c8172e0a5eed7a9335a1400faf0291b193ed00f33676a8bf2427bd58c32ac006350594c80ac6a569d7268c1581655ab41b902da3375ca1e810da06519774c57400236d19eab72448408ddc6f013c40cd2ff70470e913e42d7a604c9f88173815b18e35e1cd0ce2688eda394c66c2c7f285ddb5fba13bda56ae06432c07b49d3b684cee104a417119f0cd8d65517b642b5d57edb4d55e6a23924d2ba35964338b74c037a1e9d6d6587db774b58b4858e1e8ceab71b40584f45704c5a25496217c2587c55257068bc224d443c030a1ad69518b228381f727212f1c46dc17adcd024386779e4c22c4c66713c1abc80ddb5b4b434fe97b6c656890493ece0a63cd567dd885327062ec5202999f7b148d8b5d1f27a0df485495d234a886c5406e6adac905ebc6750c31bcd512651715baef964dcab4739046cf837cf2192abf3df9f21dc3ea8de08693cc025ce6d7db8a8f2c8e5bd8a8f1ccbf6642faae2e53d270d9d9cb485ce4fb32146c987b0595c67b30831389184ea7c238750aee78fe2b350330eb83225a79baa4b24b2e2cb5ba064709f74249861228ed4a98a25687b4f2ac7ef205415c2e25c23acae032d43659a2a6c130ae9cf5039248a57999a630cdf0b43df6f8476f9b0c8f1b171a9439eccc6eef2c2e9a77f5f4bdf00a7a2fd4d0787c266550f431e9e59879a5201795995f28f362333d66a9cb3bcfd7a94bd7212aeefba15ce66f86b58b0874e7e382782882c886ec25c6fb1009adc8cc0cae8dcfd852e6a1f3e74e1c30732738b912a384bbb047f8bfe55c8b6016394cc6b6f2ff1f0a333e29de9e36510fb9f8ccec94b40b33eb4c8355709eb759aa0dcea8d2d0a48f7c235be26a590babedbb1182f3a0869cc3da7e6a752311a1abd002db0ce4fb6e769d8047f8f359454ad896083c8fb232debcddb63084f95dff3eac5fd8d5b544e9ffdda06d317fb341dc2c80701cf18ddd34f9b7c5c79e8818785d0ace65061b45136e33cfb6a08868a5743fbae15b6f0c384c9a8d6e9031c2e77614f90dabc44b2c8d0a8bba4bfd26b4cf45784ca8011d8ab534166d8e4e537486cb70eee74e6ca31ae02f7d1b00c1242b6d9fa4011c98d6964c3ac9aeacc072c6acf24b5cdb0addeb1d37e4c59902a2fb3806ac4ecb555531ca008fe6643baf99dbbf1abfdb1426040df0a9dbc1d3455f8a6aacb425233588480bf0614be3aae8c6588e80519323c2bef74bbf4d6b06ec202644e3e890ca4a3401df9f0f9ad36cedac81cf0c07d6a074847099343cd99413b9cb2fc5e1b68db3e65201dd9a66c0742f2e8882b2fd34e13f59d19010a4ad45e26005145305438af0a8baccfb2c8ec3a7d1372eb5d1f08db7bb569edecc14f069d1690db969e04123f0948a778e8860a0a8a470d34e3bf0b86a1571e1915009dac6312fd1047c7f27e839595a7c85b21f9c818f5812698a1ca6eca316c3878e5c856b115cd05dd82c97fca4e244e7324ae82f6862f01f545412d2694f2581788d963fc4d08b0331686f1ee27bbd2af208744d85b1bd07e8ff846a7257f21b78b67dfca29f4bf81698f841f5a558963fad1464e4cfa630a467256bd9d97d3885165a826707bc834c932093ac9ba6a12aee7dc82fdbb1a49d6094f6440e4afd19ca476fbe2279a73bde77fedcf5966686dfa765c9d3c5a96cc3f64bc488a98e5c518ced45900cfd535a11942308115dae529eb01b2162097c08d6277bdb34fc89c690262ca9e72b195a7af490004f6ef6895d7b790604c015e1da584388fe720d07e6f97f1a69bf0964eafc0198d909a45d3c47bf6b845f54ff3c8a94e1fe18c8e84278a0f79d43b6dd37c578856ad72974933862119fe8601c4a6fb45b96c605b962cf3abfc6aebf68c6186fef335388fa5b032a5c90d0edd6f8b75566234bb426a553e1e4f68adeccd7070af4bd2dd6863c858a24cd691e7ae416ae932038bb70f33f60ff10bf927e11db112c391624654a44a3ba6f3c9c9d4ea0459c44bcdd335cb8a1ce04b6728408876d0eeeb131cc8956b4ccf4d0507dc44cb40afd8a41d4f53e87fc1243386df36cee4e8398581e743b048b9ebda0d27b4e13993dac37d5f95ff364dc4d4da8db034236d73e79b3130ca19ddeb3ff962d719e189b224693c44120d0129998c3e5a18df1d716e81dc0e11e1238999c7ddd90d5c6678dc7b7adbf698d27b4b1e77362e676ae6b9f351db43119ac9f578f1538d12bad620da1b24edf94a948efb976b4c6b1d03b94ce948e4294edd8aa9a8bed6617a86fe44ff9af354e5e85ae8068aafd5e8b625bb331f0f5e18724eb571ce9ac8dcd10ef97ba88964b188830bd005bc25faaa5b725bf6f8c68fadf333f3db643493a692c22e60c1fe11db7a12549dc4f496002582a697c6097500261f192cbf4b30aff5a3fd8ab641005839108934a145c06b56c399e0ef5f7033b38ddb2a06bc25c585307faca39aeb9523653302a7dfc9e5144504c9b11df4c12231d4494606c68d01fa7166a18fb8d7c0d3ff5a540098ae75beb8c23e7174abf27fbb395bc6fd9b7a761a039860de3b81f2a76c387eb0156f76a12f66742154d0a8f02b23730e9a0c1c3a83f7c796a38e8d4b4e02b0e2ccd6ac10f858f69385270139c29c15da00a8a272a35c796fb3b7b1a099900ef5dc1d85711e452675beaf2a52f83008da97481e1bd8bde9d8482a3332f79819e18357015d8c3cf1e097ed57a1e552ee5952a21c3670e2a6919599ed554d4eede8b8f5159b3f1de8a5b31e92483e9a6dcc82a7dc491ee94ead0782ca6c1d7b78f55978429ecb85487015203024563fb87246f83f92c9d905ad0e1cc3aa21521d3da92d57602017f47a869426449b46e6b3469e7c2d0b8f0608a8051a922778faf053b18d696a0539360eec039c8bca3f46e0845420fe515ab29294ff288e04096f682059715a895b4bb95cceffe56d673dd617c6214bbca0778fb6a41a8610de019c22364394df1f4095fc10bed89abb41cfe8be40720306c6b2fcd9f9ba6f9411bf70e9e3db1a559a1a5faeaa915a27734eb0f325b9d4b77829c944df0d4e5de535544d9bf67d5bd6c07e6dd022463265213c12c5d099ac94093a86e779916f97b6011e1a2c25e823cd798a5df5f52d6dd5e7985c55450816a35b52c739a7f6a0fe171c91aed866ca93c9a3061bdac9b9f935704c4ec3ec749c584b59af4fa74dbb999aabfe63784fbd69da844c9b2d23d052d8f0e9ca4e5b3b049a0cbc58efa0f7915512ae7c6d4796158ea284a928d80bc86a5ddc51bdbcb6df320e9672a8ed67fb96002ecc8b5e35d766a4bf1c595f14e324cc8dfcc56d995527a82fb45c2a6e9c1f1b433733ae57f77696bba5e82042b819152a207ee3b4d2938b0e27dddf6cce6424c4209dd46d2e81eb8ac526be64921804c8faa4b830776bd16733e8b503d550589fe927bee2823a914d61b5cd3f7ed57f2c4f497b3963da6a7efe4ea35dc91ab127622a918692bf102d134ea2f92420ebe2aae0e74dc46d092aec60996d0c14d70651a34686528d41cdb5918bc93ec9803a4c68089fa157445223f49ca974fa0f6e184bc97f2ce4f0f096284ec379919df51bd65cc41f7c9616e14e7dba4531afac7363304acba8c7833baa0cd1dc0f195ca277ce62edf44b0232391970a44dd9151a1e778b68e389406812a4ccb6d06d8e090cc8c591b5262603e21c268bd4dbe451c1a19f567e910ee9b5e900b305a88cb4a4734ea2418454aed810d4b2cac181f90575ea60133aac13502fa3c46f93efc2eead81fbfd3cc07f1c117f71666aebceffcf2485901fd251f60ad3747e1c6bf9e8ff1d85bdb4abd56c37379e535482f6bd1f27397c4f404a86355cc642caeafa518dde1e34d50d9d5682bc264c29ca8e4b18eda129a064f983374437cff0fe323d2071cb6796e22fce388c64b8f20a089456e07b6b7298a25effb43d8058f30e4adfe0062baac483511b551f0c2d0f2c2583547b958e4e72ff2f571c5db95136f027d518adb63de600bf84fb9133f0ca73bbf71045143f1dac12672fd590a4d7c24e7772d2b6dca2c489bf899d8d9166eae47d6d94b8cd63554bd9b152dddcd58ae2730210dea686092adc4910d583e73394c1ac40300e30147f288b55de394e6ce8b496be8041c890a4d90bcae46ef704a5c07d2e1a76c9a67f32f322bee8df1ef69f4708336e172c2d1ea3e7e236db4b7b80dd5c0dadfd4d2d88324962edb35792675c384efed08900feb7aadcb4a31b80d746bcfa43c446c8ef2247a11d64d7a86a2033066f65cba4c5745871b891144dcb3479d6a37b4980936b5e8d33d25e5106e121dac0dce265f631b06d0bb8e6dac142c102da138f909303346d7dbec20d0a59d9d4201ff7bd4c909dce32131e2a9a033c928749902310f1dbfa08d6047568134bfce0c346779733d170c380d9a845724fe59e3c56b0b32d36ee74632d2303fb593e376bec658e952c09907d8a5803b5a78b4455656d6a775cd28b628eb5a90a4a6988929686b08fd9ca881025cacb0c8d9e68872403548e8c2ca1ece97db456cc75d03ad9eae7a285127631b7e8a03a42da75bbee057dbe2d523bc5974a85b7f7e7e8e300d94d54f22581ff28588b14dfaf64eed36666401dac14cd30fe2817b03eac45ed05b11b5299d02dfcdfefc7765fa7d8a011609cf0e19a5f8f45aa2147dafd6dbf90a7d1090b5c40a5031fbb6e8e7f2b0749585189c0dba2faee2de6ab9c4b657501ce6a40d6a4b7ad09c0ad5e48ea23e6fea3b0b19512c9e7f504d47698af7e592fa3089aae3865862e42522f8a03d5592f0b3d4ce128acbfd264959b8c09603daeeee74a5877fa590cd78a5072d4e605dee43033af4be1f3845584abd4bd962fceaea103dba75972db9dafcd879995d966f00dee388fb2d89fac64939cbc772326dc5a4ed6e7060a0a9585a5378a99afdd0196b4e23dbf6cce16be74eebde880df270a3496020c503154137e7a792493653a2e9b114f4a740f1a0a4f43ade515e6bcf13bc69affad26de9ab37d1b31611cb6fb5ab60a007265bf5dcd07e0f03f82bcfda00e195efd76ed71649e156b993ebcfcd3b06bd17b445856255e8dcfd9292e36341b477dd675b3a56761d39fe8acec33d682dfac3289fb03b0464ebf07a1b4d4b7a7e998c7ce8edadaa04e21c574b86e26758e8fc9761acdec80ac30f3a66ec501c4a8e9c10d2c1fc13ae9db6dcc97695b18b35728953a14dac8067750a8b8c4e1b68a98f9fd4b9bbcc1634d6833c5b0b9b7cc110cf48fff5584e5fbd6b17fe4bb78144a744d332102ec40459f896bf8bd0f2588a909aa07dad2c3812ef126c5a5d6c4874fbf941adbf9b507d008fd9d0beaee23ce2df19394643b5fbe0c8846fabf3f9468f578110390f63d1490e278efb76912ba073f382fef1b5fc966f32d4c8d64ed7256324dbdd7edec47f9bb9d7d083560ee158f5701df432e6a21b726e97b0661ea998873fb61c9d05111712162133f721d32d0384f42811008af5fc9d37d5b2a86f3a0a09828febccce239ef191fabc2a29c6d62f94b8146df5e64ccbbcd1c7e3850eedfccd078d5848b62741e4b67c39b40f935359264571686905849f181e75bb259692c9e9f0ecefe256e92e2414a91fea8f15d49b30393d5dd5bdc2e9f8842fecf92621c320f44b93935e50262cec943e8a969a535ff8096e564ca3c4b4c310b077c9bf033151de81abf486e16fabd07eb2f7d1de5c508c52ef23e6feb1527f8a03644c852c1463d2461fb310794e49bdd448c6acbf75cea59971543ad3a4b76c423a256bfa3b0f2c809bf0aaaf396216481616c90006efc66ce663984d3e269c8548ed21e98a6bc2abde9ae38f7b161e1a2c9cd76c29fafab33128686ca65bd2256e807a87303eca2bdcbbe9c3fee03d4f50d77939a5e6e5d6d8cb3c0466188e15ed1128259eeac72ae041e4844ee03002d30e3fb1a20e8bc60a3cacf6a8625bff54d26dc4c8e0174fbe228a03272c92fd48c00d82c0ae38d2bd40557288fb1e743822dad16e96d7f80625e590ca0494d82ed79bc42976671c664056a4d3913337788aac5f4dd3e1b11359ebc67836e2ff3f22ab6130630324cf6bba701f20e903711106f1bd8fc84c63a8fce709533f568041d2e1bc20ca5f5b4874fdc1ffad43c0bae10a1f9ee2ee1d248001189982438bec302444d9d6a86ff858ced0dfc082ce9fc1eafd6dd5589ac10adc7186510f1fb4950c661aa3672dc36c9d9b44fafe73c6eaeba471cc9c03a0fb112612d07c1b48b3f63bb3fc7586a68f24b424d1b84efe5c9ba175a74c60d286d38522627f604f8ce15473efdc184e2e1d90393387e84b3c7f322cd813046af8fe91527e450a16193c7a6f6f372f9d9e1421a37758091adcf96d63bc31989a6164fb1c56e21251fcdf22c36989e376d238958d839e42acc45d1b09cdf77e225c55057fdb9a1f76eee40933252e44737c1a563e96bd01b66253710d2bef1dfa781ad6151b7fdadeec2116ff8146b42a7744a562dfdee4c586d5bec43a9f4b5ec0699fbd410bc864e2e4d60083324d7008e3909aaf698c06685235298c0196c29416047292d82a65be2e1d444320f41fa59e9094f7ea28cd13014b9e0f0d6b62d13cf4958be2aaf35a4875fe7cd2051d1c554fbf7c6a89b2a35b639beef2e4999569c09322dd8b93832c5196aaada1d617bd82413b7a7288ae0be5115102ac2bfe48319b9962e4508b6e143d4040b567062c8cafca1753a7ab4fa974c40b7dd494249cb52ef6f0b418cd1c63714eaa3118aeed91454cf6457c58b445ac916edc2b79360eaaad9dea4541e08a65085101af95c64ff862f2c87d81537e0fefd492267cf0cb64a1d4506231371d0025a3ec26f49fae564e90bb0deb05cff0cbf938ad5960a579d4c722ceee12b94e398a810dcdd42dab642851df4e768bfa60257fdb42fc8397055d213b5c1d4fb8ae7b4c41d041735180ebf9b8e03b4a7d4f0bb8dd2cf855f8360fb0f6785c59abc7e5382f48d2ab7e5bb2de5658f21c4cd6f2e46f4ad81bf39d8ac3035c6a5aea5cd8b087553511098734ac6b140fd29900e642eed42eb008ba199880e73363896a51a9a9b21dd769e636bc59628232f512d545a77aee4f338b30b8558dca44d7f6d21f6cfdbe1413a475c27f7be47ef44f28f38812166a0df805953bb0d53325038f2a5f93c1ffa9a1e6f966d13fc0e7f42f1117d71f2b15fecdec3a4eba3e63e4ef9208d6e189ab860463c61201262a1a3b20ac60386e874feb2c00f28f966835b369ba616b6fc361c89087935cfd2bb8e4cd7bef1788f8e48367b0043d589e5f1f6b37737e0e68b24aac0017d292329073b57573c7761310acef2673883a4257ed2190c9fbab357c1cbe8f513aee7ec689503f5025f61406121a0629070b9e511165db23c12ba529d79d91fe11e3a6e3fa695584146310d744560dd4256b231c389688c75aac8ffac40aecda382afdb7e2a80dc0c12c5e4f825a1d6bf2d9976bca68a85cd3c4fc4156129c530b2b22be887b7dd98f1e874e0eb975ee091b2f96a08dc7b64b098e4f7c2a602c93653c7fb351929c351e394b438503389f50341a80f45ae81a65579a3839ba28175e99de063e43511bf632e472a74ff5abe7c1d6c571e826d582f9efd3e0131a9b3cb8636f1b88bded6d8b2280200ad515bd993cff008fa1bee5aff9dbf9672498f35718a583069fdb221b23e483ab9ca6b95a7aef103218667bdd887b4567f28bff2c80b71290c2c5cad47eb1b3b4d81c8c0c4ede8fd1898e25d085a7891de7b0673a194e36cde3efc8a97e6f35d5b5b89789ed9264e992228182d7e1ea2bed529006a4f2a4813b124c81927ce2e2194b1e44510ed5e967fabfd0932d3456c258fcdead7d44701afdc293a20c1d6f2f31ff5e73f9e346155835ff5998ef86cbe6af1c4447068603730c5cd1e7b8cb2135e8580fd30c2622c43b0f10ecd4bdd54ecc38c7ba2ec74d5f2d6cda9bc5bd0a85b757014dcdce761a5ef9f6f206a55752f24b57e57bff1b0d328841d52a0f1c92cc6841b92ef1064e19ccff5d48c27074e04f7a186ea930e46ed367012baf39b5a19aaf2131311620ebf0a0da2464c5b839f9900a63abfb88110113fafe8182d5b13ef1c8b4f7ca6252188d6c3556471499ce375b0c9cb43a85654918d31621c1b56a1cb8b782d527ab81409e3d8dbe230be0392a283766738d42d059f2c9125c4cc07c359957f4ef7e7e12468e1bb880a009b65d2c92056c0370cb0c692ebb9d03cff7a4e8f37811debae3164871b6249619a087e2fece9d2bf9240239a806611be27a2036554accbf1e200fc5f6dbfc3a175b042f0829d8fe3095f905148779113044f1e613456dc64e143fa333a468fce4ac867f7000027f5a402a847561195fc6488395bbe444977b48b0d7f55dcff66424269be59b70e8fb8f0c07795166091932cbe5145833a5510b5da769baa9563fef88c484277b885141f022b100fa57989998d6f53968cf6c516aaebd821709922249a7b96268d962251bad8518e1552b4c6e27a5c3be85995ee6597410b891379dcf32d91f1dfe788e15e43dd75d3bfaa8cb82e77d76fe6fa5d22cff9796dfa7b81b3d2b06c5b56bcde3ffae6195cce7e7f2acb02172ccf2d707f8b6c1c1c9f51b1a419cfe56e88f9104acf05d9d20700dc70c5f49ae31e3eea3ef1feeecbf6154cc29f34a2cf865a947887523087fda533c50cadc7ad363f2955705b8ebad7095b878128cbfc50ee7b77c573ad8c06509705d8ff3f5ba952173aeb7611e81846959c1835912355eb9bd88c2953a1fd62c038b691184009059da454881d67fb3a8a2761419ffa95078a000001132ba1985f022b5d088f9ab3206ca8fc5f3b50495f857582e479b74ea1e82b8400b8f6703ba46e95e7cd570be9672ce4e9f72fc92642f4c8418f67d02cd73f0ceeaf3c5ea622e596f14d918ebd57a611d7f6df0787d6da909270c3a41c327cc9c160154c46b441cc6b48432722cd304d8780f90fb016061f4812d781748236775dbc0439d977fd0a652f310f0ed045652d3070006fd9a61eb22a85544fe604648d8aa570b5d32bf043cc05e583d8469e52e1ee4798343b2c6d2051a59e62af499a2ef648a81ba8f93d84fe761de66f700ebda4e5cef57d672f85fcb131d4c684f0f7aeea50e655693d31a7dd5d99b61a870b45b8b363190537531565bacaab88de8c8aea80632c92e268bcfdebfdaedb924492efee02edb37ba33c45e67acc39a680992a059fe70c9e9f12949a69f9f1b20cb388c59fd6623a5ed22a6aff2c53b7585a98507d7bec657caa535ae1d9f868669d515a9169d9873f90455777e5c0403c457de5c01ccd5771084e0f0e7892a59a2b62a097aaa1ae12125e2f54625f8938578f4e2f88c67b5578dc66f1c628d02dce4d8271f84d493e766764a97cb1b97de76ce8d2f1aeb821aa25d169779f60059ada4795ced5403fa1bfa8ec39a8997fd8a9a38643f9916e8f9a79eae3193f2816606c7ab53161412b817dbe29e31577f554812a0e5dda955380c75b60a30175e3d3760645cecfd134dc9157703dac0c26e7411d360697b2116f530aa3aa182fe64f3b1e4dca08762555e3bd24b951f8df3fe17ad227bad487873f0b945abf505ac964574afa7165cadcc65bac46acb209e72952adb369e1fcf3e17b737552f623a827fd7a7b6777036e5944df0cf2aa26cbad25d7048bc4eff5f7daa3026614b19466d4dbc8147df40db15cf67d88e8ccf68e22504161fdd8ab30bfa78f4836775ad798932aa3e8ece402559c7461b6b03c9cf4ce2480dff4c0d3638ecc863081f459e25f8f22c6863baa96eebb7f43722d8458129cbbc9cff903cd9874fb7e6c80de0ea3767729cc1d162fc03581863204d0de470b68a50d09071ddf85408ad88c3ca486e007b34308875355db8cb79af14cee4dcb69f88a750f5eadd2d16b9aba3979a65519820a6c9473b3d9b0035930795158de001235319142879d526dfba3abea5637c8ec58e546be3675dfaaf9f513664272ba93c69b5f5720d9c9db224e3fcc381d83d8658336fa782f5bf2a686695dbd73a751043234b7e4e240feb5a6baae21370adde07cb6e31ccd6ea63a4ea14464684268a5afd713266f56c06a06558856ed25c5033449cf6692156287ed9193c951c6cc61e6e6a1cafec6b56a802424b318a38d6d1f93274988ee9a4347dcac6410437336ad05a44cc9b91c38a3908750d83991e869be8627838b5df9a086a37acb5a4d2e9deccb2c631fbbc0f699db361567c4602bf11ff2cd7a235258538420dd6a42ca8fb9b54ddee0e28c37b7d0880be406e1f60c8cf3de964570bfb1fecee6b44602803757da4b245b5b059b58578ff010bd1730ca8dbdbe36cb7543d4081e2dc4f5442d15a895b4a9da02dc0cfb1e1a94f2a982320cb80c0fbfa675d123d71d972987c2c9215be8b9f93fe6723cd2630518a16511a0ae06e50f6853fea81e29c5ee1e7636aebb72bbc51e17445d547ba97cf1e4ac76e470600816e70aba38d049120ecc35665bfd0bcd0bbfe0e2ae2e0e3723cf6f20f7c301adcc2bbddac4f1adceb70d033f9ed58aa26c21829c986acc6067900e507426157ad881ea9974cfd67bea55b7b1a6f63d7c2ce1388f15269e919eac2a7b535c93697551ed92a24d4f39e8ae402bd265f3f6fe43ec7ee65d5386a63fae8d836fcddc59fd72be63c95f0e082e3b11ae81050f3f925dc68cdbbe2cc70dd4379e89d04a8916fe306657e7f78009af173c5678aa06a3ed143213224c40e19be0b51cb8346af9be18570b4205146565362f377e87afb4a4f9bee0fe6cddcb42ca7554f9dc7a5b0693af366e5652ea8cea09ba6c77d9a343a22d7badd94ee4c1f2b59d239da6a4e11897a7e2328ab7252378058045c4c80e5d2a8a2325e150d9682f678f67205e4cfb7ffd910dbfc9ef2d1bbb7001d6e7d268da013071a02cfe89b7d25611bf3a28f1d1849371240b5f85a3a8e9100d9ccf8bbee80226d90bf9a42bcc7303725bac635d448234d34d7a4210d9ad73c34268070fb3eac19b16ced2fe1a3ee88e8ab8136f5a1065d7c91cfa93c6786e77efa7e49c461ccb07e6d54d71a364a4d40110f2fe7ff77671ca1b54a83953317a26b74df2def890e07ebd687925e8e63b8eef58b4439c93122754ee36f0ba7ace488209c5f737b85232f7944724a735ef3f6a2f02e8928dec8b7ed99b39dff2761f8070a61d4bcfd02811208566d81ac4fd92b640cf0a45c5fcfd400c8bc38593cbdcf1ff0fc2f2891b260fb8c525ec70b4a50760bfac22827dcf81b93cf4581890e092a6dfc3a4fed3eaf885c1ae0c7a0ec9b4860804082e9c66709166026c147bf0ad1ef05d0a70c5332a27cd29dcfbfa769923d5b4392091b66ee8832006440a8d9f40ae77fb1aead67eff00496347ac1f373411f52908bcf2906cce3574cdf59808fbf4a804a975583c40b377dc6fbb6e019346b119087381303e8921f98e5e16310c43221b2fdab0b5658105052a9e75071c2df5f4641402422dcc3239cef0bbb90208d46f8f7ecbee0ebed8a8869d1a806e912b85e4c615b47956818b15a4f10352890933a8fff27384595fd47da97ff3eee8e8320c271859e3e302a8b3aa7b19728afc87d8d44a6a68813994d10253795007fc5a6cdc43cbeb66042f9f3ec699432543f8e0407a1e1baf485ee5fd1dd0ea3cb4f06f13a4ac44c143d1bac2ff64af3b656d581fddf1ef5ee7eaf289f0f7d8a363c99873795d8288fd8ba1e373406f97f1b00e2f6527fb73721f7e781155d1203c77f2899d65876690334209fe4ff2f98e7d2b63123e5275c938cfbe79eee9699d96d051a56c7446989b2a6cfcf6cd0ea79db9e69b15bdc9ab2c736f788f723be3253e3195a0d2f5e313cc6f9162fd94f3d18889880220dc56c7499b067d71f80525b5ac5c52703a7843f964ab3f704bba5717b721d860f39d7718bdc47d35f75f73dbed4907603589f48bf9de0a9c62d7f83dc5c93b3e38693c3260ec9879a3aa9295e2a3390f10661e1727092c9b9d1a131e3fead8e91dd1b52d77cb39c15c81e6d57c9023daf160fe2aef5ebb25e28272b6542253c14e03543abc7ac0e13a1208cf59382e20e6231c5ce02bc21cca140f0652298e22a9416d5c3adc2fc05ba3ee13ba1081e63f04cdb4fa2655cad9cb679a800a025bd39f30d298aac8eccb04d025257dd2ad73e8135d5e6583075c56696aff3efe2b16cd530466079ab718076ef7ace616074afc0c29bc84e6c988491bf6124169c95aaaa571ab2900cf1a9b044c00aa1622b816f256159a846e2290cbe62c5387cf2c09ae94e0557b1298fcdc4333b64cdaf6c21934040261cfbae0b76f46569853cdb35b073bc68d17bdb7b2a302f9f9caef63da4d6a7741f1d0a2f9a901fb7527d384339aedf306e8eb3c2effad6e4b732d0336266cfa5ae93d3ea428725d295a8bdc3fbd74372a000a03b6005bf2d6b3585fffe1b4a274d2b015906b816014f83a394b8a79a760044e96bbfdfbb81a441b567d59baa4bb817f378be323298479da6bcbabccec8653e95abed7731ed9be82839ed1eee7008c4f9afd0a94cd0edea03572c33c06df5716e1e37ca299996e981b1546e36f5061e103fa7feb58c639b1f61eb1f0444d64792d56c4f66012147e54f13e036ac18bb4103887fbc58b31405046b10bd8ea8a4793bd9d68aa11b2724c76115fa64006e5e17e3a36c44b74c564376230c8fd281ee322e0d9d8dcc29a03f981cea26fbe5b2b9b7624167c8cd1e4a57f7ceea828e7d642bd1fadef7ec86ee008120f7c08a7f29d5764afff133b80e0d6a8167938feac0bc83b55ad3242a4d94bcbb228145f47004f2adadc8087cf023117bbae808b826761f561ac50d4fee5cea116a7b844935802f1d38f42e433d392d707b750849f58fe906cfcc34fdc2d0eb2cfc095b9fe898b1969cba6f72a7fa1194289eb1a70d10df44093398b38dc46451542e06038f340b47d3a04c0de0819e131f8c0810881409d07b94fffc211665901ecafc27f2106a23bb6e1a6e0c6a6779b6921a31f6f6baf5f72ebf1fbd681505374fe0f795ffe3344b62bd85569a0c7c3bfa961d5dd1a890fe269f56651610c23920cee7a7bd64e23c905d7301c94e2d5f00a8445f4744df193e98d8aa1de2e820579a522835ea55a45aac10b63c02a8b388b9240d4b0501d937961c473d8b1fe6946d4dfbd3b754b35fdaf30789a6127263b58776062827d21b10e78820fb959f8eb796b219134c3f331474b66764add3310b099d9629a7631ab1cf077b595f9450dc7e67a36ed5291102c679c31fd34c69f404c0a420e0b49ad5dba73720f8426f6d378ce9825f7365717b290251235f39e333ce6c4ebfa33a681ad0ce7d62cb48105c84de060723252ca3ef943f9f7c08d9c481c4126dd66b464ed770173a39413257d7ac3b2edb1da8f37ebb1ed086df293f76bca98bbb1dbfb632d0dfa052c0b23f65c9c0b9f5e4e0893c8b2ce8d873196f41ee244b060cbdbea0a80dd76f1a41d356a63c2c148e921ca207579d9fa5845608787118ea18984281a43660e6b62ecb7f922c6a3e3f944d3a1873774294ce3eeab933d3e7111f402983bbe2e80074a7a3f3829a02bc3b0e04cb77a9f7314d9e19d4e47bdccdfe54f6b6d5192ad5d60360730ab6438dc10cff3c9efd0bba654e5268f06cae6f3724c17a67bf85f801c7365a40e4578e493e3ab0fd29261aab0f17ad1637d6a0545570ff388ec57fdfad6fa1c52670345c561a0eb6b5971f5b69704473216a22e5e9e028ed8323aac64b16b20f1234030af75f3a8f3ce6eb4462871ee8bc87794076ac42f8b6091656bfac7ce926680e3ad05bbfc6b31bc7811cbb9de0edd93c5830c6d9f96fcfb19de7c1ab1c34311830dc4b20ca06ebb9b6b26db3f2f904c508aea04b3d68c351c59325ee897b35a2f5bb6636a38cfadce10c9ca68e1d8ee0864f03a133730b03218d7254be0cd3cc43b338b6c9a8d037acf8a4c638e70a7c02044a57b7a457309c15a7034d5aa769b02687f9604938105f510ea829a23b1d045a7eadde2b79cecf24fa4d14fcc9426471723ecdb319e09612aaacc1307e2d8faf70b4336e6785bdd6c65e4a7820ee23121112d2f6eeb6e5de52a69452780a220a130afc21eb2060a67ea0ab41ba2a7fec1439b3cd2b0aac9f2bf57adac95c130c6388028b1ada40c136f9420d77670c466ab8502a039a30050bc8b0c3640d5090893d63a0c16656600417e8c00c4fe438b182999b1e482107ac2468a1470b99f83c3cb548f082e5c41623c0620d44608175576280220627c858031a7557629841a558e4e0a46e59f8b91b8633d40880baab3044f171c26b589d988ee925af4b8698505977a54517a1295af86c5a6c81468da41adad0c20bb5869a1654a8f14d5d8c4ed502095a4cc1842fc414a13db49ffa6c34750b34ec7d78795337e3a4db52764928e1506848b32434dc960f910d083c3b476451c404b288acbad33cf0d0d0703a0d283fe1d9f12533a091070b5ba3e38e4f1c9e5a19195fe230cd5fe83e3bcb137596ec4e0f22582d88a91107c704c316b3439390d698539bdf3fcadf4aa8f79d135d06340627e6a6411b8789436808823462ce1323788a6052fb27d0b32b7e947b3ca440c3e5298287a7eef8ca8fa33d05a255f468b08f4f4d2f97e5aff76369f3d05df3d0cf37c8c840430ad250da3cf4d71f105983c4eab4c1ee1aecdfa2eb08c408820149eda7b1c50de9346154bc0d30d480347c10d13cf132f363c0e6a1ff2a4281e4b85e3a15552a95ea46a6bfeb3a3a4187f111f6cb3bc4d0a4c1ad49e26b0e811999b81ca5c795bdad924b62a2d130fdd716ceb0abbddca1176a8ad20b1b60e16323b678d8f0c14994f2e5e4f9d26ba7799a877e0de4048f8086bd5319ec1d06dd8086b1d53993c6968dcef15494426d2cd4fefd72ba90f353c3ded1d91abe04b4061ac6c4ec206ddca712cfc969141653a05a18c91426da991aa7ea344e2f611cd4d6ee25fbf53392063ba779c04103bde16f9c063be75b094bb1357270703ae7ba82869ee3399e629b3e62435b891168386be3d4feb95d55d83852fb7de021c442b95aeefccbccccdfbe7ce7d1c30aca9f0f0df66b387c28010d57e788caa351ddb5631a14a247a38a00174aa59165818620183f1a5d04aaa2a696e4826ab150d5fe2568e4bbbbbbbb63d835e76b139bd8c4268639e61ef66d97120df22c42c3b935a0e1b48969d068e4fb4ff3d01fbda86a1efab316d0b055a019d08fac16232dadf29a58d3a8b055ada2f11fff22126922b55ff329d0d08d348d6a6b74843185f2b6aaaab6ff2cc065e217594e051ad29fda4f4d9b6c2d81d6a5a6d3d679241f1aae0e8f464571594143ea84204a303333336fdcdd0d4d75f70b129700c980261144892564124198e665dd9df9e28b2f7e9943b544129e12413023d09059ac4685b367e3d6dc81c6327b021da1611ba9c1a9fd4c64b60c178e1c81f6b7aa866cc473e1dfef29e0b061e30b36b5df876d127f4fe089371b389a877e1014687f680349c3ac92390565d23579270db3a9ba82270db33b57682b5242978a9e5525405d2aac50d139bfa0aafd5bf742c32485ff132f233f49e4a1dfb5405dfc5766eb2804e6a1fd5e839e9eb0fba2f6bfec15506a7fec1a9a6a73a186271a56f95bc192718e5f49a37c94d4205d3d102b36da1186260d6abda451bb842744ead61d3e4c1ab54ba042ab6e0ded18034ea35cfcb9fa57fb0812bbd3bb0308d749ed9797979797162f9cc999c981f12112bb33933393439f3ef6dacb103b80961e36d07f990e236df884d801b43cfd381450f92ebf9e7a79797979317543483f44e5e5779e5279928b177e6df942247607861722b13b333971d2b8adfc8dd424475e2000f5cffa00352f831d00fbf568a4c8fc9993cf8df2c12f5bb6d450d0f394da5c0e8d391ea02f9c3fb20fe7970463428af852b40b1035d6ebba2e9990ab100d8433b503580de235fe4c75336852fb11ced430091352cc97427b5e0e8b957560ef31c618a3bf0804fa1fdc27044665f9b01ff4200ec47d7c104bbfe987a8fc1092ff720fe2b1fe30bcb0476525542a551375368a43cfe2853d2acbb717b6b4b4b47cd8b57cf8b55bbe7e8da7d4ee35d017c60a72cef31abbc6ae3d3f8efb402ffaaed15f087a96ef01f27ad4e574f0940ae29a8b35e217f66b7fa3b5ff817da8440d7d426054eebbfa037b0ff8007de87d80be7f9746d8df0fecc3f8347e3fb0f6c2d91f41df2e4c087a0df4fde0be2450b8bc0b75f9a0e86486949e7e504c99212b3f849aba21bb30309ef44360bc4a8b172211536178a1df3afae576b0aaeed6e8be30f4f56bcfe269bfe2a978266f48e95b0244831a00e1052c38421537324c2c0f8e94214f7aaab006296496863daaf6dfd2d2049d3f5f9bbf9e5a8266a71c810b65e8420d52d6304586be132c5383c90c9991a1df3a8c17828098dfafb102e6c7770e08cc6be417a5b6f9216fa30dcadfbcce61e4833e5383720681c6770902f4fda0fe59638470cd3e172066c51e09ac0af13ab16faf50e2059d2a7febae8b99e049a1a0f147cf89f832fec6678ef1d7f3d8edfdf14a73e9ade19f258176eabaaeeb923246795dd7755dd7755d4d2eecafebfaebbaaeebbaaeebbaae0bbb2e24687b8a713618632aeff6e3e8e57dde4c7ba3e7a4b4ebfe41302626b4d1fc654a886fda1bf2e3afcaa61cb030f18786891f7df081071e6ad49831a3461b6c681d5de547048e06e36754508e72a753345238fb5cbfadbdf65561d76c5e38e2e183a713f6fddeda1b5c2f107bdf6253bbb148a376ba17b489304251afa78179e0cc89bf398c87b5bd4e0d234dbd3ef4ce622eaa5a1e76feb9601f1fccbe2c4ac35c7f7d51afdfaae8f31610aef1093a3ffb6c535d73f54dbd3ef4eaf5856de4fa2effc954d5230c6fb967ee6d0d5ed7778da7bce530d7771da535157c3a372cceede27238733966e4aecfde63e25f97b7dc0c7bc3ff7a3fc3a2b6bfdebbd814f797a886ded23e64b9a1ce0f6fa89c872dccfccdf305e7679ee6cd0779f3dd9b1e392166aa67de9c07630acd7e4a4e88999a7d733abe661cb1effa7cc89dba32a2e45aa079814837b706e767cf0346e7034c8dcc9fcb9c1b6d18a3e5e4d66017a38c0e852cbe60c19e76a8ee230913313252bcf49c903f5fdb2f4422a6fa10e2354908e46fe5256664e4f7909ffcf5fa632f1481aa72ffe368276654ab1b9b1a9a1134a192193223d35ea451fd553075076080bae15251f759c52c1f0374610058a80bb36c230436c2542c8cab549e32c28df0813f7ff21382f3cdd6f05fd18e1fbf9552a05b7715849d789dc0c9aa0b50eaae583b359c35b28e10b39882fe70e2f8213eedee8aa911ac31be78214e32f79b171b9cb36a32cbb2ec4f358c3315c35cae8fd6d054f9143f1fbbe349d0fa35910e6e1d3be272fbf66d0deef37b3a624c4c64d62433e830fca0c3b8c7cf7768d51760c361f86d38ccbe262f9376711ab631b700e676b0d46afc1c1ed8a155f9edd06afca60ede1afcdc8366081d326196314e07d78cd3d135be065aee503853630471f135510e06acc3703b963b143f7e73590385e4ebb8befd405ce38ce4b9844d81ab8e5490c80aba487801910afaaf201008040245ad7b1a6c8e0ffab0d37adaa7593da0dfad46c5977ba3c6e75c6ec75710e8a7068119990ce45e92ec419ea66dbe2d4adbdd3efee472441008b48540221008040281e67561cde330eda4615a51b41f506b6f6c5b681b08a48148aec29c2381d3605b9b516983eb5fd823a632332311b34f58820e6a7cce3997f66fea53608c0d1cabc82de6fd108436374f0bca078b88de2f28574e0088f8efb2096d366a977654a6a2bbff6eb73716da8a02fbf1b7b8ed6f441a1573ec118efc7c01ca2bc3cf4bfc198795342a6737e41aaefd31eea756c699c8760d6ec7c08b29aaff574d14f9b7b28c807af4c6e974687f18db933975399739d5025dd4d42e54b5a5aeca8053576613a06d770fab9f34cf93961ce585397733333333333bf3b5f1cc401a3348dbb866de381671333773b337b3733733333333b333b3f347f989d234ad8af213a5d544a7c9939d263a4d565c44b20d377333377bb311dccccddceccd31dda6289ddb3d46292f795d18366736b30c04d2b4adb5adb7e6b8ad4322ae45a2ad698f465b93d8a4b2b2b2318b7373333773b337b333f3a7039129ec46a93b4e94e0c49a48d3c35a31f1236ee427ca939d1c254da46b7c7a9aacf8868f7cf113ee93ba430c3fef179b4466d10e315b43b411a1b13b662342f9738daff5c664c805888bbf90891a5b0d8e7cb4dd2f8c37f1c8173f3c4fa6c8711b2792858f4e13247dd3aa2fa0f02c99828bb04d0b8975c2c3d140b7c193a381465ef610ff3ae6ee4e5b731b01eda6e9658701632a4179e33287791ce692601096e0d4ece38d4ecd62ab51b38e2a67d5c53f5659f906fb7802ca3ab0ea483c670acf6954f69bc9461aa9cde32989442aa9fdd9276f1a7c82f2e74b1ef37c8a06db6f3a77cf69b05ffef5a1e7e0ec0dae3fb855776b84520735fb88a1e2ded820b28fef655edc1ac4bed9a087a93029687e065e9d218b0c0402edc0d0a9d987a3cc86c3643207dbf08e5fb361636f74cd7e024734ca3f7b03644fa9c87e77a590695986a3dba3d160f619d86016ce10acd9dbc8b29fd9f68593bfb0ab3eb567cec1ce093153417cca3e1fcb84291d122c74501e467453b7358e40970955e8d47033c1a01d13aa60c268d0f61466add0f3ef6b2ade4addbda1527a7ebee1e7167ff3bb8db3e446a1f65f33a8fd1893a1f6cf6652fbb3286a3fc8b3507550fbfbd92413360a2d98c1f505260336453371220aade4999ee4955ed3461e69e4919ef346af4915cff4228ff3e8cb0b9b1948dbb02de4c5e78d42f5e719547f2643f56f26d5dfa3a8fe9e85ea1f75501d475f1fc69feadf5bc8b301fb5032a1fabfcc0faf16547fce1b7dc873c93ebcbe50fdaf2de4b5803ec4a6a8fed916f260681f4e27aaffb6953cd387bc6efb704ea1fa735bc863a9dc87590daaab78bb5b83bfe4f5d81afc246fe4716b6bf053af576eb335f8439eb3b6066b5eb852a85c83ca9f79216f519b8a2e6425d6aa803d33335fcfda87224dd3be2a2b00aa718d54e57307aa3f835a48f567502f289f4350fd197405f6b1f685cd04865d815d5d47a95be02f30c4cb6712b4bd81cd0fa591ca4375022cd8d7fb1be0fd03ad405580403a0d66de85828569904ea3ae1a50158bbaa2585082962cf114080ca0325c35a01df70f455f3827a5decc4c930082d64c252207c4ac6946c1a6e6e582da3f2f2fc82b14bfc8338917287f8706b86a34e9c5a8578d771da597056a04e2454dd46ed04e4ded6f912a04edf0d6b8fe7a8f32243fd1ced5d90ea4489122458a142952a4489122458a142952a4489122458a142952a4489122458a142952a448912245050a55edd7b83dca0b9b1948dbb890888e482593ca0a4b07a3c5e5c5864dc5ba51c51c9716181dcb8a8a0d316eb0e146eeb056544c2592dca9fda31bfee5c66d465414eae7de73b1b95abde236edf2be161b6cd50265d8270306ff7ecb6753fb7bdac8387575b26a3859b51fe374acd44cfb22cb61a930a6d09db1c59cbdb1a252a1d1e485cd6cee0edfb47ae536ac98232f6c62f3a6d52bb761c90bbbbac3dde19b56afdc465ef2ba69f54a72f7eef04d2bfa4d6b226d0d947bf24cc2ccec7299bfdddd28a158983931df8fd1b1e0953162b12b3f59a375dd9ceeec585076a9da1aeeee3a3225d363cc7a28c7ba314af9bd94921d8b18a5dcadb1d1a526a5ec1823c71863dc114143aeebba24cb2fe6741319a3157c45b4c2fd0af9f1d690cc0cc28981155090aadabb9d13df7de01f8c2934c61ca9ba42b475dcd5256f8d239dd371430d7581c66d57de48249d022901e1840084e35b3b77cc0903eb485d2cd4a5820b49a89aa85d88e8f7f76f091dae8004954cff8ccc01eafed7036c7c051a4e1017e87231644201d47d22a60f63d4bd023d2d0ab43d495e665e66e9ebd2a54b77f7df5d291ffb9d31468f490451a2976055a740bf202f48c3f0970490cc0b9244095a978c8e1581355b6611e3738bfcfefd7cf493de5dfe612eb43d611feeee2e7f478fbb7bdaa1fb1913babf55ffc57eb1d8ef31b62fc188effe7e6f90bbbbde4f6451a0fcb17977dddd67d3eefaf3ea76f32e8adb8bbd06da9ec2c9aafe9a741fee417e7209ebe0efef62d81bfcc9216c0d9faa9d15b51153b706e41a876923b8e5ceea3aea8e061adf7d3aea84ee533d469dea8fe144effa71187face5294cf59d63eedf0224d6106be1f814a85cc23d605bac0e43d81bd819b686bfb7b646196888b5aafff5e3a9754abbf7b97eaabf91eacf66a86ad8d4b6302dee8197cfb0dcc5a2e47babbac9099f02fdc57eb78644420d4f75b2b22168d8ef296c9b2194bef6578d753d22f6091ace1a87506d65652e87567a9216482affd45d8da10a5593da100ae3b527288e0968aa866d98d755727b8d76884109d860fc3f5597cf3c1c7ee3a1e1b77c7c7ec23b9b027fe5775339acac4c2f076fbf3056976f8e88ec71c87eb27cdcb78161e673b37621ad1d4bf72caf895e3ea4b5fbe50ec4e1ffd75339fc0d311ef472f070f07661bed734de6478dba0f632fee48533f5f41897e3f41a6fbf6dbf63ebf66d1fb2112ffcb979a108567567fc723e53a71744d619dfc53ac8f8f5c2d6a9321e879f3c1c5c0e19df0f9f37df7b21f6e3f768d4fcf8edd3a017052288f041438e428daf52e128ec8dcfdbca01eafd7e423418fff3b67aef793de42f8ccb6fd5c5545dfe86efa5ba7c8c4f64c317d2976f1b74791c8d81bc88892bbf205010fbf335cfc76a5bd5b4dfb155fb40efdb17ee0be1aabd69f49a37227921d354970779e1f654978fa4a394792bd3e26de7855d59bcb0573c150f483479a46d8798c2b1c414f70b5b406aa0e1eef00ee88786bc848d74f3a9129e2ac261e24f4a3f9ef81813ba8fc3415e88c4b6eafcfd8199746a65e2f4bcc1bd78c753cf1332abc69db6d198e0197a512b5cd8156d6045bc4800ca6722aa3fc7ebbaae223019a712d5bf1877b0fdb6356aaf1853a762380a1a9788221a8c7198f6982e0606f4178c8e7d8ca7baee318f727af4c84401457840821e9c0006355c08c30e76e80e5851a4129004305471e353051b23c8603e3b18c3b5832daec0031dd9822738b15488428d31eaaec6e0836aaabb1a830cacc0fc53a50fcec840f7e3461720a24a256baccb01c12a55f3d628fe667741fb4336d2c59c349ee21f99fea94ee3d985659763f25d82881b6f805d99cf89a1c1af6f0bd2af2bfcfcd018b718e90ffda15d74d10500b038c2532e23fb88fd24bcd7d7460b7ae022ac436fceede8eaaf499f027509c29f9f3f1f71415ca840b80261d0c73a5d989336ab08f7c04d5887fe6ed232dadc8e30e2a95edde8e02ca9cd4f583beca4419d26dc0337a18a2574ec5012ec977b00cb609de3305cd0ef99549ce52cef71fee62fc4fe7d609fa94119df3678faef0bc2d59f7c2b59d0288d92f132870f7725a30efb7c7ffac2293f07cf99348c7c1c3cd799e1b91352e4745cbf92050d69953eba06e507e16afa3024522bc9974da4c7d3c77afa421154ef7d498312a7aa7cb8ab26d2355ed334287fbe2f9c35e37460d5fbbc4983128bc112bd97ff162fe4da827d7285dd74377c31be70d6f804e57fd1b4df5eae644fa37c1af5f2f265168d62182185f1bb3070b40d9eb3e73e0dcabf385e79eaa95cbd7cce6a503ef7e187ce6a02ff8adf79259b481dc905913d7b42e6bbb8785b5bbcad303c20dc7940228b179a563c2051be0aff54f9262fdc4a5ed8c9277940b0f754b730fca32f9c222a431c356dc4565fef7882912228b0398521d62ac626bde384e7090b4af5cca7b67fab4cc7537352dad1e8ae9bd35ffaa7a3e57f3d030d922feab50131a3469e069d0b1a663f2d1a0cba2efb81b2aa9cfd1c59817a6a94ec68518c30d95834384eb856a8c8de68e7e24393d21459c99aaae330fd3a3a3a3aa1253e27a55d6849680994182566117b767c959127f250975fa4feb9c8bf7eabfc7474dd06afadab1a769333277b238a7f994e8be6021a66d9cf4fa3c2d0929ee8d3a830d3a98d0a37284e2a4ba7f3c1081a1c27dc2ab2a4a1a890e8781636718abdd13526461e87e99f93d2aecbbe68b077baec470d0500a906b03d645eac0e5ff663021a230f149a466dab73181e4f653f0ed3ff38dd0d35d2cd4969d7fd673f61e4a9fdda4ba77661ba1dba8f9e767c754f4d1af9f9a6692b67a02e4262c5fe87a862d98f02e2639f10aefef9f097dffc82708ddfcf1720248ddad86a547b0cb15672b8166aee789c3b7367b23cb532dd9d7fe183476a2c72b1a4f1d517953f46e9942f892d79a4fa124f714d1aa63f7e51c3b9e34b685c87480de78eefd4229d45051259b3fac7ade6ce0968c8ace9fc84d5d32966b964cd1d96a7e693278dc26a3f81527bfa3777be65de7c2bb630fecbfecbe5e0f83572ad79850ca5943e64c82cafbf3e1f52621293f2bb65acf192dddd933d8cdb0b672ad79e4b109f8febfbb743c698c3ebb1bf385e97fc5c80f0295336623e586d63d2973c5289542a9548a352694422954aa32f954aa5d1974a4f1a75a5d288542a954a255289442a914a17b743be7fa9542a953ed652a9542a954aa3128934c46844229146251269442a914aa49f4f323da9341a955ee5fd8728a9a88c462aa51fbda6321aa98c4ca55189542a955edb4aa552a9f4cce528955ee4855d45a4af9f8abceea3477fb9d2e36813cb6885a4d269246fab4af7cca974a4d748a352a9342a9548a592cac7aa627a92c79565a53422b189f4269591ca275b0dfa8f489f8f12e947aff156227de186c3eb6772962a3c0835f1da6baf2b5ebed245ecef671fc2a3e7d8153d215c57ce4099a7a50cede3000ba1974baa7c4ea77ebdf64673bf41845e72957b0df384ccfac3d7a0e2b22f2ca266df1e90feeb312f08574cbb3cece7c7f0af9f0af0eaf5a251950ffa75f9da9cf3eb9cbff37ae7f5d056ae22cfeb2a126015bdc6ed6dd5b40f6d1f86425050ed43bf3e425a880c1ffab06b0494e3f66a6619bd9b00510a5a919253dd95195635e707a78809e868282b5a50ff90f213a1381ae5d2df95bffacbc7e6b7d7559b9777cdc71e838272ed764e47e8e747ee71747605ba1f3ef7c035821af485b10a619f3245c3766e5ebfe67d5d2e478b7c803e8817861efbcbf311faf95a261f9373be94f37174e6ed0faea08f201ffa5db0aaff29468b2faabf0907cb84bbc2b1f54bcfc7f541b8ca3f352acc7ebe8fece53b8d1a7be3c7fccce386c05ecac7b05f0e08ec658db3c1d928ce21b5f59ebcf263959fc98916a56ee5999d0a9eb787b6611dfafd97a144f6691bee81e9d6681b268032abe5246c2a364c7f153bbaca6f95d090572b6ec23a5cafcfb48382e156afd8d1b97dd8550b97e8817b58077fed0b4150e5874af0caa93fb66d4fe580c03e3eafdc9f7b40efd3bba75d007e95cd9b6a9b85f11bb34ad92bc87ec6a0baf6b1cfd65042dbe6bada4663b90d621f20b186ecc37fc96d10093008518d1ff334c81bbf1679dd432113feb1fa178a805fc419b6d209168e9046a3202821bdc80c37756e53fe6caaab268a3c19a541cf116b28a9a7419d0e061dedcc16aca3974e3805883ef944eaac70417d04e1ea511a5ce182fa187d10aea25f89e23f1ea5418f423dd377a3f711a6a2a358021a7eabd93d8a5e04553269d027a703abeca441d11722c1ad2a7adaa0ffe47288beee0554fa7c92d5a03ff7603e7b6334f2b86261f01f6244228d4618ab51a4f70f914623d24808d7d127041454f4a164d556dd1ba39ff205b4f4a30f656bbe8cd228d1fbcb9fbd417a7f8de471955e889ebeff1023ea7d55b6380e08d1935ea31e4883f47d837e914a9e84d2a0bfe813a241dffa491eb9856c6d8d1aba32834ddde67288e266f2c2aef4259446f94ed19b3c954ff248268d2abdbf5c499d6c55deff7a011d7d88b5f64657bfe186aea36d643116d6d3a811e9b591b7d5e4459667cec4f22101d2aa91b6291291442c1a895aae3973bbcb900b10b19a3e967ee4715df1dcc7615c53f1da88caa6c2e5d0462ff2464eaa686724622855247a86d220338b3f92f76347fe30aa6854455915899e37b532a2c7b81ca296a7da8891d9716b245b3bb05afabca7417f1627e8e84befad4699400fe27eeb691456fddb88a730d3275b18cbdf3bf4248c55fde31374f4f910fde84b5f287ad2631c10a21fbd26f27470ddad41128d9ecb41f2443ff2443aa2e87dabc8cb11f280444eb642530ddd0312411e909879a17402842b265b40a410b4c35a25675903838dba64fb10358853832f53761dd85dfcd48e31562e155ad5f0a5625be5def1f5fa8ed7e772fdfcb6063fb0c129e487a8f26b9ab76d8df18107114620a1048dcd119c29564e781ad5d3a8f668a4d030fe6ad5e610a7064d1f0885865f5d3e901d5be7efe01abb6edeae0e21887f8cd41ea28310014a7b075ddfa9417fd0170ae11a72bd7e6ab4b8c5214458631e3880ade11ce67b83eb7e7b3bcb5014418df18bb102fd53a3fa5deb2cc9a5aa7c84a7785bfc9fc4a95ea441b7d91ade3f0ee35fab1af458d36a554df56f55d3744da358c5053326af787de1aea28c91db71758c4d04f3fea5bfaec1e56f3bd1d0868d2f9c1b9bb8043b5888bb2343ee096365225572099c4bc03d45eaf4bec18e270bd800c1c8f199c8a668c3ec47df6928e8c8dfd37e9665d7fe4ea7c3ab39bff0e2204c11846824f37ec011d3833fd0619c47832e0123bc87e45595cf4be4cb9f5b65fc811b691fee6e1fcc33d19e00ede129cacb937d6e33173f1886c595b25bd3a7a3f3bbbe2bc64bea609e291641011ab20d8b6dd826094f51ef37226c9f1abd7315fde9d6feb60f5d98cb39e77ae24dbc486b7e0cf790fd0cbd48aca16ce203f6853b4802700f99fb4700ece5fbc73813c08becf46cecd060bffb50011aeeceaac7cececefedc617f09c03d708d45aa7bb4954384a6c6d45d45f1a4b698d400d45d9521a73aabb2c45e4a6c1f4ae58f7f6dd817fec50501aaf17a2c363a04ab7b3207adbde689983fedb75e9a139aa6c52ae5471ed05529a562faeefb7908d12897efefb1375a9e65db14fded7f61b86f8e63a9dcf317b2d4f0358f629b73b2f4cde548a2327a1af3f9bf51a51f7de1a97202b64e1afc637e387a215e93d0df4afa70a91702d1cb17cefaf2a38f5c8e1e4fb0cccaaf88de892598982223fa213332a26f08cbaf7cdf8ff9fc301e87bf78bbefe225117d8b97a4e6657a54181f7b49ba67f1987062a7c8d4c090e93e28e87f2bfb4386d0951f42bffb212c1f75987dd10fe9bece61f6591e07cbb70e435af9e83c358d06279743fe72a5ef9b34fac21e55f4dbd1d7449e463d27b45f6246467342f44bccc8885e5bae87e8133d7ba02f9c1748fb131059b77ecd1be279e661bf3ba2dfb23bda1ae42f363863831349a35cf8e747569d53a5aa3bc680a4c1ad271a5ecc0e9189381399e819678267328c2b41bd2e55dd7f5357b3cf3eccb26c6adfccb22c7b9017cee49892cb9129806bf6da6b99877dfcba3dd6ddf669980cd65c0eac2e07c47c66ec72e9d1a3461c7a84110d5efd04da1f2e4bbe60341ba4d16ec307ff2382f8fff08456e7a9eefed82563505b45f5976199f598ba44346a5bb0ff17a63f6661fa712c8f9f0b76dc3089ba5529abfc7e2c51f93749a40ee30dfa779c820684575e10fbd877f5aaf1fe2c1fe9d44422bf084f75524a9e6e799607e329344c22e9ce534628997476f43bf063c07079626cd4b0ab52ca4c30c6862cc261e412ce6950caef27f04a5a2103308002490ac400e5075690b9cad0240a12d4a841065d1a7e2aa8eeca8b2635a4df53b42e8a2e80589d0960d05c5ec0a6d09840f7171b52130a8542a150284402111d91e4d6e0f6248f36b86d5c88db482cc09ef941fdb27fb920b0ef993ded04c40bc2d5fdb59f1fbb63e69c1f76a2fee4fed0e1757e736bc8974f50ecb98631a830e6880dec8d1b66f6318da22f5fbe8d46c9d7a837f268835c6c900bfdf4adafea1710aea29955eedb366febb54363147f63eda39ffbb147f5271ff3e2465e0f5d8fa399977f474041ec2d377713ecd171ec0dafd9c4e2cc26e663ca6d269bd99c9f3de6f998df1f67f6c39cd87287c2997a7dbb2d124d8c31c618638c0ed2b0719a1b28022b66a06de7041afea9533bc44c192c9723c66b596bb670ba6fcd97d60cb96da7647c38ab0c4fc66b1b112ac39362c6ef378367cca859b6458d5b09e843d9eacb48e3ccd938ad647ef41a67fecc9eb397335ebedc6253495c4d7c3ec36b250d768efc4fca2f8caa48a3fa6bd2bdb135c50bf3bddcef43f9c5f7a1a9bf0f2f22f2ea5e6e717ad937a70fa517559ee4e9c30b8a8aa4cacbc875e4e272749f7933bcef35f65cb24fc77cc9f1d8fa7da7063fc6bedf66783fb225a314a1a0bfa46c7ddf36f7b287be6b7ff93d766854455554451528140acd0cd4fa6c78e672c4f81e0c68c0a23e1938ccef9a38c8f84093d2aed5389e922cd65f39e683bc10f4df6b5aa4d9624d5445d55573d95c46e4171791abc8a5ba6878342afc9e0777c30c9a2faaa26ac61755cde3f3b82a11d1d149c6894e1e3f7c71a92e9a566bc68cff3c1f27ec79fc405bc96ba44de2e0f816f4a541f9377ccbbbbcfff7291c5e7e34126f3ae2106914f7f148cb87114995d1a6ca6fa491a22aaaf646acb961ce9873bef7a16ccd393f1e3f9cbe953d48301c4fc930cd8f3f8d624fb591eb71f0fc4774c3ae1a87c70fada4713cd54696fbe7a5c11b667cac33be5004f57b1c7d92e179160dd362b2a4a76850360ecef7799406a5fca86ad494acecca6c78cfc3f1f2323fd992acbf24cb861b5eb6ae22979146d9f0f2af233d6ef8ba185ea4893593b66cf8a2aae543d972f930aabce0a2fc8442ad4671517e42db835ebcad2e5e4babd5caa2aa715a2d39a2df948f237aebc96c5e734ade891161509053afd7b6511b472ffaf8ccd2b66bd350fa317df69a73ff74f8d3a79f3f7bd8631813eec2a6a8c35cdf8581b7602feaf58b450c7b91b7232f5ed775619a171b4cc2532a7f6da6d754fc4d98c74c3cae9a5cd2a871ba278d7630e2bbba591d9c9c7a3d6814d320f6a02ddc8f68f0d2d8e6f2a7af611848c61e1d27f14984d223d269b20a8598521b9b23f82f6d4e4ddb481e3369f0fa18bffebb8e4615502cfbf961d7b4125a7dae2ffdf55da48f340a49a3b0fffa4cfaeb7acfaeff6283d7973c8c590e73bdf619017ddc35ba5e5b9084b13cb58b3d8d0f9116763de58498a94fc22826f2913be98d207d213ffd683488bd0ffe8e68f0fa30d0e0f51cf6a12dd66bfe7585b077d6dea06914c6fd2ef7bb9c7bfe4d40d4dcbc4291974061d20a77a749917afd9504cb51a2bf1e879b80f0f5d727e1dbb5dae5464ca051fed7675eecc17f7d9dc3750c26a79055abf146e95c50f63cf64657ed915002884d750ea3bda6fdaea6699a36b52855c3d1cb5c10a99b45dd55949baa3137e587b149e5d5fc6262f3b5d7353fd6f9854c54ec8b2d6d9b235383d7ef2a0a911adaa8da4b1b8d0aa90f8dd2b4e7b17d3875b46dd2f96944b46fe6d1a036f9f713a251d7179f07f69af67bd2ae2260cbe5b0e135970b8b9efaee418e570befa25c3e6cefc3ab2ea86ea8ee4a8be6302f597edd653c8cc70b33e250b2aa945c8e15172fc6cb532779244bf668adb1344143fec130fee12f1a943f2efce9e0999595e71ffea2512ccf71441bfc72c8c1cbe13516cfe5b5f562ec4ebb0d1f76b54d56679dec8eefa065d91631110481e4c63e38157b97d7b64d4a9dd8834d2771273e893c114a64c59ea9d364c57111c35cb077f98430b6b10ffb34d8a837525ddefb0b73ccc5dbf5629c3a1931076f97875016895e12f073f06a5e067c6d234271306311e5f2f2a51216e57d8c0f65134e1fca27741fca2a54b9c2825a6179f92e9eaaf2c738c9f06c8a601927c44c5df99567f17eeaca17a5f2c756a8913855971f5c63bc90585dfe87a8ba78ff0dca7779ef13c235c617c6c73e1a0d820dcaefd4a0dcb69516e534508ddb38c61cf1a372aff8b1c69317723d456cb7fb5d965de93e7ab4c1f8d106e5dc3952f95d75b14452fec16ed8a747a34e38fa646af0fbce03c2d5c77fe4b37cf2577e647c2f9d556f5c3c5e107bcf8b0bf2c7f0e682fc276f5b90bff3e882fc323cd382fc3978dac57b7968eba7f1f688361825490e2ca6b4ebfe41f0f39859bb22d6791f9f764aae1c467e8cf1f1b797672e870dffdc83f7f2bfbdc1315ece4aa23748bf4bfa189eb7ab437ccc03bd1cbc18c3833165bd0806ba2e17a6e32bff8f7f8cf82e5ee8f2def3e9bf7e5167fc572d2457fcc33f72159f7f62b4a951c577f72bf8c7530e0667f994b6f12ebac6cbd02af74253b12967398c7c9f26b4a450e563a146a952fac82cb0ef1a157adf35487df4782ccfe3aa8454f21dcff33ccff37ce7e453f04ea7f764c82835975e3ad969547ce279cee4e4f9eada4e7f7acff321e38170fdbe6bd49b565c1c29993c700483e20f65dd7796a7603eeca6ebc0cf59397c373d60475807f961575f10076c6170c0e1e5121c70c0013bb2e3eb0c57c382f2b11b4ff194c58e700ffcc33ac8972e40411ab686fc109b41955de5479a68e35d5855186ab6a8d2a6ca58a4e230e3c3480487a41ca864acb6854dcf32442323000008d314002030140c070443b158309195c10f14000d8dac466c4e9b49b3240821858c31c610420810002200042303690300a424b5129e27f026d35b80ccb2359ab35245c67cbdfbef362d2a4e0b363573b93eb04fc5fdad2ae8ef57205706adeb73a1927fe04b2dc1a21d2c8a0346bb2c79755bca8ed952177b92908c7e6bab2f0424dc3a66778803f8440cc6ab4a8c3ab028b88d7f8a863323435af88d56dbcb87b717e18596d1e1d25a50591898508d7571aa22e816da829561425beb4d5899b4e24f8aaf00218740a583d20cff0250fecec50d4ac9bc109071ba492f8c074775661941dbeaec62fed12ebceb2ada734349c7827f08f91d50fce3979c95a3b443a3667622322203ab6d5a4ff88fa45788b2829fd5aa48ce3aff0fa8d45e8857a98b78d4f9245d86dc2fd6aab0175a4496b18b520ee8cd64c999493f44d7a9b380c10fbe10ce207733cf1863dd91c9ff8dc86fa097fc7a5318b24063c62e2f9b44148b71d0968e9238a5bb901f31939f91d8b254fd4c01060d7eb12ef7be5b2a146aa271cc45ff278cdf7fb83862b338c850d62fd7e02dbc1d240dfb98f51ce2b460b30886000cc4505c1bed79533a936d4b2a75176b94a3a38fbe53fe8c9fa23920db29c34e5dce19121e98b3ac6f43240ed17cdd45b8d72cf897660f6dac55511e1fed43c87d4ed0f032f0a65de432d561992c5da02294e842675146a344db845e6ba2ddba310d85424c939be6fa45911570e9645249387b8bdc2f317d03a536d2db57c435a43ea2b191829b916e4dece00311abd262fd55827a23f2cec656d85433b0d11ac9d4829213a22315c4d131e23184979672acb63ec9a109f2310c2006af9ec14fee5a270f038754ce0a3574a4117df802c7ae27e382eb903a17c02264d45f962273563e81ac4df69ef9ad9b4c2b0e7e8c692b2514981f06b958409ce47bd919edb9dc6a6bdece468569c986e73b536fb71559fefd5d34a1ca0e75fdc7488aa95b71af12fffcc9443f386df67d4aab3dbefaaddc52d286c03dc0c85bcd64cd53d205c399ac7c8c516c3a9335b597255a144d964bd3b3c6b8078f7c45dc799b424b08acc9724d6ab22eaf92442a61283f2ecabaeba5eb8eabf8e10259f1d6e8a3bbbb42e5fdbe93787d34eb07e7997fcf952628e90a58c16a044e8432306423a42c3702307e111c786b345f0371a04c4b565c6118a76e9b0022f92945226502550436700b2aae424f7f9db13d374e9951f0a5c8a96c14a44481be5465c464e5dcddd2900d50dd8c782cfd90ccde8451010e9a853dcf9144d5b309e69ca4c8126bd389c20421908ab61f3b3a15a9a5d9ceb28a8eb3dd39e3b7ed41805d37d0ca513101b4ed8bf611490a85f7014450a99492562ee07a4331202c2b51dc29f53113df5c53a10dcb554c950a84961019766c913224365273a5b5ac97ed3933566da56446caa134c36d59aacab915f4231e3a72a9ba79a174abeffe3f9b529d8c4d027ac4d5ec050cca1c807a1d395d1874191d3252dd9584bc213b44f98ef332c8f4804866faa4ba75dc822b5963d51ad7ab9b481f13da8c98df8454ef232c3f60e9a784c809cdf2db214c56bbdb91044aa9745215c6b4fa59f335565fbfb2ad14ee122bf18f9a4d885f42a411235608dc3f915b9f7b4144fb1ce22d2a2875a9cfed081e9d4068e40993c069c554918a845fbd510ae0d40ee1c82e2a660a7b7080f83943e62238e4dc2f8b8b35a999384a23100551710921f7459215c9f4bdf403ef38faef6310460282006d71dda8b7f91da59833624a9b538a25cdc4e6bb6840f623a438d5ef7745258c507791ee9c989b7d03d58373d1e244747857027f4014632af079fc41b9083537e48d3ce6ce41168f375993422f921f87ceb28c38bfe6489ca64576e9641369e31264d74e639cca2e024032fdf04ac6411cd1f1b4fafb819696e4d19ccc44df20d7532b3c6054b2e2869cc5ced781f142a7fbf7acf1275631c6cbbce3f09d45be86d5e857d435e42de27389c8012be76f7d792167ca1e3259f18b5f716746d051059ff90a4b94f42529a96f2c80af123050f41c9b2f60de826e83aa6338102a0f9facef43d388f7e54acfe90463dd6bcd5a2063108c389402d26f751f6bd6b0b5a538eaae4004aed13eea57d2c3d407ee46ab39a6e930f69d968072d1ba53d846c41d06746dcc43d38e6330eaf3ba16521ecd0c1a78d54c782b3e58adcd40cda869619337c90db82e132760f0de0cb4eb40a687da551df3a05d4fd588dab136d263f736b66606eb572914ee9bb53ff7df62ff635505f2c624289a64a317a78d5b6a71e8e02be6ca715e17c7228b484fbcb4d5c5cb77a7fb9697a7f4c2e11b32539e75b10f9770cceabb989640392b54cd69f1eea74caeb28bc5aaaf4465b4b9dda9b6b61e50b539cd51978e00c16f8c72ec4753ce640468f31821b23da7e47f4063798397ee5c512856dfd901defea43a6fa03865aa96881a6646605917e7600245a42fd163a2180f1b0d0e4fb5b7ef418610158db728285941bc9e4bd7ce7048702daca6cdff55ec05536dfdc25206a66b18e6f6c1d9c987fc09173baec42dd81d549b8af0c15af89067a00a3cab54168f4f0628c5a26e8e43268e815ce2c61131a196d7b5c2cf43f5e9b5c5d5ad9f2c0f39320a89783b042b3d785fe56e3b40e351ab89d1f6749ac75b2dbcfb5a6ab896692422a92584ce6f94b1df21153dd681106cb9b6e3d25085c2968888fb2e51f05b710fde4f786c43a376fbda4c76e312c4ff1ea151a8b30113cfa39582bbd9f2ac34dfea0d6022b62955d8c3f0006fc4e1c93edbf4b28d89757c3a68540efef7045bd48a22667e7cf9424682a9f5f581c900868c6954fb516bcd7b776f402f92e7666bf44b52ce7bc68a08616b7686bd41ad482a8d9eea248adc1266ae6282cf621c5aa35dabe346431b3dae45aa919cc8e9bf0bedb281969bb51c8b66be8657757c619420da4c520ae373d9f27d21f8e71ed9edea409d60ec85bbc5b3cabec10a7fae32460e4c61923a828a2dfdb30ca5c08758b67948bf16c4368224bf2577fef61b049e88c2734de36c5ba33c339066e75015cf4f577751a77c0acdf3b1d25d41078373bf01d7cfc81c4adbbf59b6f9ede4f7c16a583d4049a44f7671d135f1e49f3c39baa1d0dd2ca4cec688cbd074592fa5272e91207fc7384e473613d540a321c4d837be631234e452d9bf43939fcd21a07c64f048b75503742df27d37f82cf0d09c17363a8fd900d868df6a106793963942a0069a8e43ab7682dc38e45c4013194500182541f10a3466b8bd82c67331d25136626382e07b794656362100256a68c520c4bc2cb6c18c11089e32cf8ec6b230ee80b98ad8fe0f540e04e2d8fcf3c95e608551e0e149e1150854afaf0904dd30f11dfeeff1e2e827698eff3c47ddd27c4e0be0b4e45e1fe848cbf34a6e7554c55abdfc2c9ad5364dce563e336388eab57d8c9e44c9c6ee627d7fa23ffd3c4627d682a226012a2674198e36deaa2bc7ab2d0551f1700103cc4bdf38530513c2ed9776386804aa6510112405aedd515671ab7ec81f5f064b1fddc7479117b2107db75455c497017dae22983f186d4064fbf183a1d3aff43345554e3734955cf86069114c562df432d02d858702ac464c252511e2fee4bce751431fa1307bf15332dffee013b6d7e98d3f8ac22b68d3520305fb20daf73d80bb90c4a1d605fcbf90b0ff3f28cad1e6a99d3e46780febff866a854623d00bca328e910482b611deaf1663fd3d8e607129df0372cc5f4a7981863b4ed633c20e8a2ae9855341598d047bda6984a91de3c402aeb158bcf067161dec965283de967f2e784d0eb6fc0c6c157b7aaad0a0954b8030c4f2060b758d86cfd3ec0286048704eecdf7b038221b8cf4566663a7b468784bfc298115e0ab78047a7d9f45c1f64e33dcf7d78c7ee90f2c0dcf76694210a6216bbd4a28ea8840b08594a209b9910523271ac6a206ceda9472d35658f246cf2a7192d722d2455a94a69ed7050127b44d8edfe3ac4b2b693d85ad2e15a9809a9865369874212ddd846f5f7002756e8e32c0beb7d387444f812e592921e1504e8bcc9cbe5cf3ad2208573b03cdd35b063426332960cde9d86ffaa19090d92c5b9348727a2db30011b85297a7b4b0eeeee990af335117cbae0797506698d4027678659799e27d7172baea02ccd25d5998220ce6114c0321910be3202640c8f0d82456c2f4f1e0b22e48b72a8a59e6d404e7204af2008a62f94d7ff34f2e5e70491e39e9f0184bdd8347f5188d368ad382335981289c42ec7f9ef13516a5ef7cbd20a02d142f326d714ef36336ee6f0f0ee4ec52c66cc42e882d5c3277f1efaf9b97240073199c178c0c25fdb6195b66b83a20efdbcbc9e38aae76fd5fdc48cd4583b386888ae22807eead60f44bcf4352afa69d6ce6ae33d8d9d149deab2a22edd011afa81bdd2e11c262118d074daf1fc0c17d09b59dcecbe6b6ed4afc669ea20317d35b1c871d5ec8f532b25d0f773336a5043f2dfa84bf026130d5f2609deb6a4050a4ad4662b202328384694e26f7b04c57d0836673b745b4fa69c4c9738069a9454b56e4ac20c3fc67d46fd0c0bbb882e3529feff5580a13c043ca2064f3af84fde6df634331aede6cba960d665a0764bb9fb4dc2d5b186320db1a3dbb33dade3aecb1e92c3c59a4884be4af0e75b02ab4c90dc5004d6d982be33aa4653f05e4c4f69045ae316e9cd6a607f3eea4bdfc909b538bfd338cb8029939731fd377ca10868737743403c59cbcc7de6e80d9616d6ca45a78f707cf5ec0afcc88da93055957adf9402aca4460c016ac9ff9c7c20a097fabf0c9fc99b3ea203a4bdcc1d58a59107858f759456068d438e860bc5ec07b2180755fd71223a34c1fb0e295915594385a10ab246b97a331c70fe283a64c7a74053eae1aa453edc7aa9d679f810ca88ecfc4380d6698b88ba5817d52ea34ebf8c02124986572169a2f85e3e0ee8bc33c1ed187b2662583eb84ae9a5b7503675f7751ec7ecdb7c4b143b8602a8e9ddefb174e9475d91120eb87a33f466c33bab8449ae197187e69de91bb4184a51445974a11c0818d4b318f4fe3b230d4fd453cfc81f4b76f1493c70d11f07362fe8598803111a4420aa1999b175a568383d449d55f6bcc814a5c5072668b2f14072b970f31c1515ba409f8f4962214404ee66b3b94e40340d7cee37f91492d47e169f383fec8699736b7c1b575133278a713aaa17934a65c03c7b4e7f7f88206b488f5280828307696ea92edec7021064f72e328dc2fc7fe95f7b5dd4f0e0d48a542db8f4998c00e5df6d63af79cb9c66d96e610347d95fbb8dfcd1b85b285431d59435523e316e41c6319512287ed96c709a2e46f2ef689fb4cda4b51974c8ffc15c857008879536b58b4296143ca22d2c27bb1ddb0c41d4735a268dbb84daa412804c24f9785f7e8c80c2a707d41aec62bff39ea0441dba5e584dd0c3181781b862439e0badbac3574d25f2e00da6223e2eab7ee3e02284de2bbcb731b0335e88f8fccabeb2351a8da7b5e7e212cdaf47609f28d3882d974274efb69172da71924532c46d638b3f0cf1e4a1a9cf73bcb5322c7d2793c7885c90647fd41973d7680a0510f6a346dabed2bcc6ec91783136e31aba0a19c09ef5c59abc128a6a54ff59855a3daaafeae0299bd54dfab4cbba6b28baac8978041f98431a15ea28a420d30d69c45a6721537d4c32cc21119405dfa1f2d21fb775f15f3954721533c126d1d70a446fb52429097229047a57064f6c55e4f4d7ff69fc0600f145e6b876e19323ced2f69ead2088a68278622b874e586800907568b76424e6b2489f656fdd2e414842550ef1d5f1f7f9d61ce4fb452b4e7c98d2306d9ec2f6e2b30b5184bb1ca1f3674a44e7b860f0081a802cd785449cf3d44d0f07d3239ab81e66ace03433fb3c1f73997faf4d7507f5e7364a3cbc58a14106ab2464a631c8999fb9a957e6b8fd6f0b84f303a56bc651057aa500661fa3fa11fc72236de696d0503be02e656aa75a3c571423dadc3f295a58b760b7ba584108e895c4adddee30d7f8ade29391b5616a2d436aab01cce43b15229550090305b79d44d123dbf54a523919451f1555ca4a9284f70b54f13695c4b2dc678566605372ca9d212bcdb930e9e6215ed20070ecceece0c1480a9faa2cf4d2e45dfb18f90d48630b28e0cd05388088a6dee79a8670e2bfef9a79b8e9b2070e6b47d9faa7bab79438646ae689838fcf4ee7b50ca8c348a04d0ecfdc8352ae32e9b624404b685aa348450144a042797c74e21cb8dcec82a12f3c170e70a232b5ca29d00b4b20d14a12a93054ef7e1a09515f214e9aa6c9cd6f24fcd134551d3bb279d8f3317e9b63a24e3a803844eaf6eed8981326d8a32c23f3534742a24ae10b959130f25597677eb475c2d1c6aa667d849d64914a6fa2a860715b339c0e4480294af27ffd9d1c4ea5c8328ad813ad0cf3aa9074e52a0b8a4384a94fa6cbc9e4ec630a572bf20c8efaa146e59b62c461f159d7337b1c82722d6d732e82f4b672fa3fe92beeca3bbb0e4243b8faa76127d791097bfbc31753fef709a79c952940ea277fb04c193934e0029b2331adef95e2203c5a6ec58098631084d6e4c9388b4a54b2cf0905064ce84398087889d6e2ad9b9d298e7148617f84642393d735c7bf206f08cbd1a8c36f124c38b05546b050357294627b294b4a746fc0b0eeaaf2be6709ad319180fc3cae3fdcddd2ab054fbe31b2bce514ea46e4167d80421fb030d2f2077d0c1b2b9859f6c417dc55adb0aac9403b321d7ea12cc6fcf06984fec75c30de323daad62aa6e3c4fbe63da8e2b664347a5801d2d822c2cd71a22aba24d311071d05fc76dfdd0a15917fa145b6b4901e9812cb2bf03174a20f71f8f4f1d64b86f07e5f4fe0bd4b2049af547fb97074ba5497aea7557b5433a6fdbc0bf10e301394b0ab712cc7a3f4b3bea74cad40eafa5577cf2c2aeb50f3fd2a0a6eb2e31c853b53765205c551362e935fd9c4f2dc832329cd9fda99c445270a0c037f65e4ec2ba18c2bb6c832ab15474e7d717b512b81e06ba258ff6255505316ad6100a5ac36d6a693171d403e63727b5c4ddd3c5b0a848e13aaf144ab8ec750d717adb8b6d090f4d30c04db3279b8e1277478e3941915f73ca6e363b4ab34398c4148ec2b74041895debf885d8c075337f45fe99c9b32b6937e6f7882d00d3dac5ef81eb5cce3d66e3ad9008c57a86c48a45918425b08ef040c148cf3a42bcc357319e25af507d76c598144f20ba224d0db51994e22b09105d4470660c196f0b8487d7d3ab19d81839e6574cfabec50271b80ed6eae0e2214717e0f31b81730dc2dcfb56ed2252bfd79c9ccbe8529ca6eb690a9f0f0ccd43370c8c7052b02848ca5557e33f7c1619561344957bd37b60f9779ccdeb066d4d268ba855819bd04fd1d7af7673042f31269dc0e8d352983ed8d95c02839e1c17c8b69be125ca46fb5eaa1575bdb0164d8365c575e5f303485da6766cee91ca24823f044ae10d6dc2ff1a1ef417893286eb70246c03c9d584a17c25dcab7d88f9722776203fc062d697040ad77e78109b402090969ec179320b98dcaa0df64bf19d250f0a625c59817f3914815593c844f3e4bf7439702761365ad7c0cd3625b8245602ccaf3bc7b0ea1c40976865dadd750c40a9dd54297600cfd3d5d7eafcc4fdde386f5bd6885e4da31bbcd675ff64bc3d47ffcf6c015a13d26562f1e103483fc4959015dc949a3592829e2e00cd2684c2ae2a07ccb617dae3d6db7ff1641670d32d862dcb49f028254d29e44138f9ac89ea95ae858652b96f8ed0d55118f7feeae646fec99b65a950070793832144957214cfd793473b9c440268613eff1f4433b5500a819810833d76be6c2ce7b1c48cad136c476f19782329080ad979807a4c5e13c64364c0933b8e8622549363db8674fa8b13df4e6f35f168260c32a32c83773c1b098f824a5c6a9db0d7426ea8fa4446dd588da5715acb8d3ca3993a98747d06735e719d58ee9126a2b9096bc8f4d37b02f95e0049f8f57a71a26bb749c9d69862e6211e2fd5b7b01960c6235a4cdceb068a69e1955344f2de7f01227cbbbdebba217069abbc039c636515466cd1ba2e44a0c5e63af7e4899ba6fbbf7f1f6df8bd74ecd71a9a4ff7f432696038ad86eac4781a06243f8d34e170add7d5e8ef05b6c0bfd36b845b18eeb64691acb5f3953f55df15199e5d7ccd49af9a0962bce97c84a74fe231807ffd58d67eaec1c3da33f741f4fcc8ca3449182dfe81fab41f0c55f2c9e3ea29b35bd3ce6c7ba3b9643f0e8557c9173d2de6f70a820804b1ac20b1a968edc84f64fe94f31a057adffabc4c0a2edbcb3e93d51f5ff32511a441ef7c4de0f3491341234d23ca7cf524efee0212efbcad8696fc5ac24986182cd93efa2a1a1e3480362e1b7da2f20e3290b8bb38a40813762390c2b2c8b73cf8f050d7755a27d58994e041233e45e027a985b38fcd4c484426dbecdf428c5dea16367333b1fc23fa5ab3c27c3eae465c43cdb6ac292e55e1454421fd7818aa36bbd4084844b8f4665f816679ddf424d1187cc2235f62f52a5009903d731146459c457114aa76f33e1ed04821551ee82dc6a9a230bbfaa841ed14f152e15f7a9827aed975a22de41773f278ce8f31ace8bb9d05843e52ef1496f806824a97db5aee901107da08af0c428299f6988db19fdf7580e49883a137b9040e76824b447cbbb735d008787aa1e864ad7327540e7517e27bd536f746508df50f8f40ca70a0eaffd093a8cc6216e82e4146f29ccb7397c1fc0e0263575cad57202693a045036baee446b691be036d8f42cc936a308815171f094a3fa03febc29d317e0a573daff44c152820ac064a58753b0df4cf093a19a3c8725703469631fc6b7cd1b96bb1cc668a6c51504da9b6a0d6336616a2cd02983264408d686e62de6d2cea5652a7bbb0c5a4c71bfed3aaafb9d2c09112e9f23467b48b145861ccf4a32395fe50abea2e9b8d6b375c571ff581aa9d8fc96f761d632e104282e1c226096456094f57df9c504da1274b34d3cac7455991c510f887581ea51832963f30b9be39fe138d7706999fba1ecc830235e720e326567ff9cf62973d5071421d243ef42ffb92d4ae723d871faa8750bdde16cb6838f6c893148dd3e5640b606c34253db671ff0124236b8a43d030a09e5bde2abfd7c13e091cdaf6b27d4799c5bc25184ac4b6447e135a619d12907acd51a72c3f77fd3d82f9afce0f5e8cfa4847ac4228b358b9be0146c88f8e06a3517c3cede472e925641602417a2b2127a9aa63fa06fa61e425a855766938a7847ec4ea5f49785d566c205fc7c7848352a2f238e6e97ddb365476632afabb360a591f1bc2ac85d899d604d91f556620d70f53cb114d3872ed56a65fe15838c404d7f90532e58780a1e87580e6057b92cdfd5e8239bf29a6d95c2cc10208f46e2292d5cfc94e6703b4416c93f05b68bef6b7d3618528fe8011683ef8925acf1ec029919d939febbcd6c6735172061e011d73d18ec9f5c4b559270a0e88c78f2e1a7cfc576743b541f21fd30053951ecf2fd9fbb90b9bbc710121b8441cbdb3d69d4bd2d856b44cb7aa3d0b43193f1a07dd2e070faf2476aea8f55f26e74138c49a828fd14a7c39b4e126268eb55378043443f3d4c98391ad401ab62c8ba8555d962e6c530de5003c8939c1080b1bc2623aca48c9e1079da33683e4a8b4d2b16aa3d2533ae88c687b794f04d8b008d042e863916389541b092f0b4a9486c2983e0c267208a3f06c286f36b2ed445dc20870aa12e2632179b61cd1ab78efc07ac8b172c801549293ec23ccc9a89279cfeae66dc835ecb78a70b5b5d2fdae68ace37f457544e122c7c2a4c560efec20595f2d367eece94b84064c747e3c442340d3f52c816ef3efb5206f3024d736bdb31237b6bd96d679affb315f8adb30552c87cce26f31fa5df552d20282d7966725e3af0e9d04a3ecb2e260e2f65f10b9718c6725c06f4bf5446573c32034cf1eb2ddc65f7c8d3e1bc1b3d2a10505a45806bb48d905e687b633075389bd232ad833d78f340e009467696850cbbd034f9a6b20d152cf38bcc80dcd70a7ed4cd3990a8c6435c6450f902fc6a9445086d875922b83779486d151b3ccf0107dd98616db824b8034957cd972c6b9545495fe6c2c040ec343b472d44f2d79da9a6725b1041b71e59f071f009046bc8eab891e93387d14437c37d63438d55b48134c96a19b518f761f8dbd55007e2ba20e86a9390bdbe15ea1e30d104a0f4ea76e2e76979bd107fa0d84a158c479432b4b7b5c5ecf7588140a66756615fc10859d183f425c34492647e48310be26ea262a62aedaefa1f126900ab2c6f2005148bc2993684265ccab22aaa4920d5cf62aa7853469d628526f2d0d9d88e3b9a230c0c99aa8a6273a5169a56476889ff2cacf2075549d8a1b1daea59108759d5446a951b911ea9987a5ea32ef4231b3eb4f5053c8933791447a1bcdacd3e498a72c9738feee32f1f61ab3f976d9d1d99cc7dc4393758fd90d1b727604c0b81c38b5604f9be4347e3554df3a42f96475dd5a4b31e156c1376453bc3c46545ae80c153439788fe1a4ae8e14ac7070b91d57aa89039aabd09a7c6a4c7e3c9402aad81f5494085e268526a39c4b843b45d5b6eb54aa611dddaee37466406da0a1731cd20e50586cf8399169ccce58aca7ab56757b2dc499e9657d75b9c9fcdf5af654e3a501f233e13173911a00a304ff7ccd5a55e0ee8dd22c5cedb9a613f7ccd3efeebd000a30f0885f996995080ae989879fb7acb79eaf527385ead8ec6e9052163ab2d5f7ba11009a7315d312f962656f83ec769012d5fb59c7b7308f37c062141ccb938ec73941dfcaa24614307a95712c4426ac26a84049d0f933c524c2a4ac89fec3d09e25e5f58fbf046c2325f754a36174d4fd549d945b8d8b5478b84325c0bc44796b23e1514197536265ca24f451d919d17cde8cd6d4d861fcac630ad03aba4662e13945e50530ac1985435399c668a7af67f4e3a9851f9deb67e6867344a43eaf88f7c66ab9a2b81ce9c40da880ca9c58d6a3adcc3bec1b2dae40bdd3c3b471d21e8c8fe99e039942d1183acaa388b1bb0916e97076cf03cfb5ee1769019862fe1dcbaa23ffe4e91711663911e271aa76fcdbaa16e5b0b6bb8a21216cb4fd8a12741c660cf64fac3fc1c09e4d6ea6aec1b2996e4a0981b0d4fd830795acf1cdc18d60749eb9ea3906dc48558a0dcecb94818c52faee674c607631b39ebce6612ea5297a9fd083943168735f7680c6439723abf8d7715fd549b16d73c35ac684779bcc3dbcb20ae6a61d4fe54d24597ed5e161c3764a22cb4b8f1c551d837a2eebe5354961b4e46d3b876dff07a5ae89bab3272c1eb91cc435013810c408a83588ff103cd2a64fc4b47a1d2db3111e0214deca084c4a7190c42e22721692a8842f4d52829626c64293935fa68345b698d4e8792c6b88cc30940002686d2fdc4cf7514e039d116cfc12b03eb1029da3aad4b5f74bf40108ddcdc455b9d0f692647446a0f3e8f1ea98252526429c2e918c516fc0381d964bb0162bf3c71c5bd90e7462280f1f88994083c9ea3ca94264bb1213e4842cd9c01eb960c80626c04dbc805791011509da8cee34e72d11ebd4f56303b88212f24b0ff369e67b9d221edf80012287d3337acb5d99d35397403937438f3a6333e12e796cfa899202060cba9e5a2c2b464491a722732c535750dee07cee5eb641e15d13602e9f116e54fa11f9aff736dc368200a59e77ff1411abbce6e05ab7d73ebe680bf9c548177d2f7b691406897317363ba09729b608416dc0db4e4b41eebd90ebb98c915d1c1fb12886b2585591d76c3a78e054521408aea5638678edcd7817915732dc829824115e284a3b7d0a82b0d83925d95262196a9550d03af25361c6af26ca1c63b462858e98e621b7a14a67e441016e85b177fc6f172bc9eecac07eacf9018f0efe2c86760da9593e8971150c7f883108658346934002471f154d63df32ec733ea900b09146c590145297d17bca0b73215961876d2ea9716beede08727e10be5595c99436524df874138aae49de7adaebb4f4a3fa486e1e782d758be3c3e3b3460a101b5b4ce6073bc5e281d63a8df89acd941ca14a38c52dcb0caf181f97f72e8857e0d336d1c51c632d800db9376458d71b26fac4ca1ae36b27455b8c117eec50b5271147deac8cec90ed235ce18fae505856d9c2b3fd085882f8f7ccd584c86581a8e8759c14fec06c552611333153c0ff07ed09c7ee8f56986aaa3418633266952cb8c05863be8add548ef9ce8718c5f1650506fbbc91913d83cb90388b72099016a0848b4300672cfd9bf4a900f2c05020415bbcde880f875087d2126f679e709f2166499437285d0cacab5ee1e7b680968169dba9e25873e5c5ecb941ad8a16ce88b3b6380eb3258ac7d5e11409282249697c7d459f65766aa3a230adbd968a82934822983bb45fa4325c35ea936cde5764d335ad6017c0511689be6d1eb8cbe974ac32e49fd7365839e954b3c151fb21579b46b0c98e45cf86ab9f9302a88c4c0938e0911ecac9ff7d888037fe46cba506fc4fde1bad3f101f583ec0e2b552831efa77fc8b03680b2f838e878065920c833accdbc76d1bd8a52892666281c895f9025d85ff49099c6d64237291cc7ed659a616d2e159519f7fe1f41a821847031c1a72f9ef712a7dfb39e2a491a934b8548024260b06e0d3536e49bf2ec8751a589492a2bfc55bbd53b56afdf9396589d3c282297dce350788a6c09e33839591642c44fb942d18cdce0e2b1218a0e49636861375178862c5bc8cdf50bdfa3193e772080430ef15c0f87997fd8e9330d2fa2d3b33eafa0bfdba21ba22a61401dc70a1ad93f56179a8c4143a9e568b388ac3fa84553915e2710db1b55d3f2c1dfbae010bd73319c0941168840496b96e4914012837a8f027001531a61adc923ec7a28a3c78e2fe1c3dac0f09e6f4d94dab0b6ebe983b8706954f91c5a30601e88a920d3cce1145b8f91daae115e1254936acdbe3b703943f9060ef76f40f4e52418935173da29922f555949783dcf93d5073ac66d113b68510a59d0edb2945633c27fa60d4a34d42ff28c2082d44fd07ce8c678ab2645a678092567869d241aff70ecff8c42174c668ac9bc091e41f5e532d035602caae6942617cf2404d9d868b7225ccc985d8e1a673647095e3f89ab3a8399961f50e4314db832cd80673efd35a6a284fa628b3652401b87690ec0c540b561427632cfaf649242f327ee50682cf75f24729dfd6989d2d6b9ce406691a2a5461a302f9b017ffce29e1e9bf3f58a4bb388d47d65ec35df58a63f39f102fd6f5a963990343d100906cd6a62cbc623d0ce7fefa0179b00318ab723a7787abf4bfff4c475ff9dabb62e7cace4c1eb6c3a681cbfe5cd55809aa793129c1abee9a525078e9d97ea6c9c3c53fd45381eca9a84b997a8e2f29ac24fcd613561cc23eb97df03d5d15b32e901d1685ee27fff29498838645c8d9adc90975901dddaaab25b3c308e20d927ccc6db3b9fc8860723e9cc07b4135cf21f270c3256ccbf908e23d79cfedac289b1aeee9541b58cf5af601c3536a255a006d8613e93029ee081bf577d6f71016d5b57b75389332f4bcc69872dd33475a3e7edd07718dbe5d923bbe22da4ccea1e1b020c9b90dd211410fa6602d0abb30b0ce9d0262b548473bdddb8a2f88ff9e0a4dd69575ff055fedd0a234716f93c6e9fd1820710e0898253681378879c18221c1174d9a4c7649a6fb1dfbcb88f4dfb19b00a833b6e70f6e1287b9a494d0ecc8e3ea60d7bf7d2c9eb8ef6256e5a56ad9b363e413e33d76cdc6e036028701c103c7de7d2700bf5c5cc309ce8b6d63923281f21223cb90f245db6526a87aaf8d8a3986f937d253db32cbac113abf1ab857a2aa5cdc4aeb72e046a599b79aba6c588af62fc8e8c28689add02bc17d5eeb79404706307d98d0f17a6afe22e0e19a27d8724782947881f3f231ec87e917cd7b9243f0b39aad9d837ec60b3cb2f683cea40660c19802ba0105e6f7b9847c95e99b5898679c884b52a96a4c78b96af04e62c87768d0aa392e389588562a14914670c53f14d4daa2ed968299d41aa2e532a1de852d12bfc6fd29e203e550420f7a652c71ed9def45a8fa29db08e4ddcd06d633950db9a0a3801f32d6d0696e52c2acca794b37fd1fa36b43e4d24554422454ecb618a074e4096e3049b690c97ff665bad420b91dd1a11e00a4a86bf72188af80ca3d429c289ef992c4e3444d725e9f4382bc721a9ff373802e35c16e22f82f425035fab08ac9f7410604288a567f5f55c3263035756da5ad722e2210366d7bd7d3e263a9fb61decc591a6d1f696599bf4888455d10b7fa635b3f81a813253d601df9837e46ef34cce6364ad68e4118352001f47ee20e407ca90979de3e52da61dfd3c3d06690068cd183b08140435ceb137b57094b3d8d66ab6f2eb89c0e66c1b41447053bdba25300c9cefecc91bb25fd7495f62c92ada365179335016e1b0e0b50c983bdd91a61accd0bae9687ec0659a795839ddd4191ffe3bc676cec322f86008cfb1788168ee31d12f4317b3db4154ab239d6674a40172ee6ca86ead5b150fed9d68b6cc3efdd0ece2d885c63dfdde7f68eabde4dbd68f320292d99e1905dadc9750ab308cc3b546b69afa14492a004d56e5d796a0816bb6b07476ad90742c0263ea492f38ac273d283f2b660ed8a666c5272c76d2c56c0403a49ef79036d3160063d040c83160813ca007d06dff6186421b0e9b27ee6ed353a377fa1bd5efab51e8624e08130936b6557f714b85883b72184cf7402cfb99dfcda65a9a15342cae2f591e43c361bd8e5c8103cdba6b98028c162359437dcc9d049a8c8cb55da055c8cbc84ddc29f406e632f50be86a7e742f3506342f267c1fb2be749bb13a4a32c13ea85492859ae24b5660fecf74b7834dc951881a14be23acd3dd9a4e21819ff81dbe13c62b76e4162f627e1339ca70425386e23223260549d004b0d029659f7039e8d7c0beb8d77fe3a9b4f12414c48b7536ea8bdef7f286a96f6cd285003ee4045db374de5c9bb8f39d094b1a65d7deb812e8e886be4b90d63a66e0ace1b6fc04951aabbc4d8563ca9e354e8d84c14ec2344d18d2aa700845592e3501395ffd2388b6a236d728bc480e40911877a0833e0d30549af968e233195c10a3eb00a0054e8a51293178a84e443c5672f66a447f67127cb88be7ac890869dbef04b93a2958150e80522d4b36d587335b4b3acd85a4ad51445bba920c45be9056ac6b422f5296d5b2875d6d01233581318da02ce46f268c123945b6bd53d86a8e14996ac3694103374ed7fd84e1ca221cb782bbed0a41b29514d6f5d3f59b2592fcb239d3c65d3309f2077531205ab2697d02ba79e0e84008718661b09af42f0cb444404b1aea82f2387ec725efcd25a700e75dfb8eccf9dc4514bbcfb8ae2af08cd7eede6363fb2da5f5c10251af27619a865941a79c40dcee8e83f9d143951a4c6ebca6596c4b55f2caafea644d4f589b5ccdfe5452704e41d45895e903ef3aca3ef8917b72d0149912b79a015112f350a10f8f50fb663db625067a2bc715872cbdb6250d1bdeb2f1d4f53cbda202315644fc9861911c79e6317c2b2b15fafb82e5681e631edb5679ab2381ef7a922526fe6869efde3f4266ae001ef0bea3608f8a4a7bf4bc7e03f19a4f14870c31e3e5a24874976d48fa90d08dd45be82d623e99acd4c80aae67f20780ce52b2265af27dcc61bb7aeb97e4c54ee184d9d78b99aea820b6dcd3b126355fa81da38d430cd8e3e8c6debc75417edcd717bf0f737f4d35821bdd4bad28461ca1b5254091de0a69bf8f3c280f649ba70f60a4a9d0964f0ef4797aa4d5ccf7f66964c33e8d0ed0ae9d340159de9af5038ff35860c9c053f4dc5b8e19b06c052e8c754d9d70b605abe0c0c20c563ffafd049b9baa2aa055cc73fa8ef70036ff36c6598f924fee562d6a3254e6e1b53cd33aed76864261d3a7c851e6de36ba80c1c651a05abc23edaf307324848cc54881af296c2f286e08f49c3c929d05e3d930aff36dab643da5484c0a861700fa52126982a502786a6f1c3008ffd91b330370540f266b9f6e1e061496c5468a9a931df07f56302dc64cc7a395ccc93c02ba184f2f7dbe2725627a244aa910b468864e864abeca5148dad1b271afe05a6eac704b447991ac6cef31c570242e91ce378694c440976c3b4114b43b6fecc495988103ae61dd01f9bdcb14042559b83d20825d3dde90af7d20b1d43abf1b8556bb6195859582ea14873c4e880a0e300ef3f112b741d30f43f30fd4762001d0700fd07087a0fb8fe9ad843e70042cf01a0bf1073e8eb03078819e8abeabe18c5bf552305a68702d4cb3cc0f115403a431a325785e9a0f10c60997d1467bcc3857b48bea74fcb04713790c3781fcbea7251fcecf4640430cd023be2dfead06943046d857f30028db41f364d04495c89c32b3ee674995588b3aeea21dad95ea6b6455de104c613c6f11e13c2ed89c3cd89e1ded0f37b4c10374c043726f6fb0fbab83771dc3c91c30dfe432bd67b9918bcff1efaf5f2f4aaa06ead0204ceeb262bbf5c0038d9f191791eb6fddc57f78eeb6e8e510ce5bb3c714e735b227f63c329ce13e65cb0cfc65a2818a3b9887607304f266803e7c65949d05009ff6241347288a0ced956bc617ec39697a0c3446aeddf6d6ec2e683ed30a9aa021ef4b4eafb721b8c51ef78eab8594cfafc6f81eecc669b9a291dc754baa63a0962d9c62d9e76a1885a133896cdfc3b6b45168f9c3346a38149b3accc6156facaf767ba4348e601a5e862464df92b3c97cf4a5464a4419a8e127c4de1eefb0071585414d51d96ed3f3430c26265ded77c672ba38b1d63bd7af60498d39c39ebbc6f39e707ee905c79765df8134415447550b95936204a14adf32275a86b090c0034437ae5e63bc91b4b0e1e3d880cf6073208116e3e8fa4fdfc3f3f4d1d68de025c62a2238180977e00adf4f6908440909b21e8c647b57dfd9bf60daaf887466f4d60d13b40143e7be4467c55fb2110433951e892c92f919bc776b92c975f39df28da5e7314fce871603fe522655af3491a9c43c84d6126415821f639abf28af350de0a56c2c44af7f0fbf3de24870bc50bfd2f11d902f61edbc8baad63c40bc95490a1cdf17f28cf40b2aba350c437dfd11be6c68fc2fad17619d721c6d10aa713042303b74200d5fe204ce02bd4f463cac922c2182c75ffcb8afe0994cd5d2053b72f5208baf8355c6b1cde57c7347aaabdeb6b4b11d59ccfe9e00f112fec3bd440e818284fbe4de32edc2875eb161d3ddf283cad25b57105c844a2ac6418e5a439fcadabbad699237fab6d90dd91b6cbfa3b07227ec2914c2fb82b339c03b4f127234a1649f37769ed71bcfdbb46fc0b4d4f64df0cef6f3001c27f4ac97bd83c4a18f4496b2ff7c0259c04f0b6d244ff9db11518ff55d7c66de4992f7b6b182b1aff92d669d48138607d6bda9ff40e836683645ac573d73e194e41c5ec5c87d7139015f2270484436c3102c910a5c9430534e32ba6fdcbb50476bfc848dda0aec032ebee68e7fb435df2fb943e46a2396053dd3734d26e6dad060e2739f08e0846d7150501a145a3b1f3e2f189e3546771e1e4184dd7f3396f00521d21c2ee267bea30e526e94cea65d99cffbb0572630968279c5fb5274fe139482c180b4b8fd1525c72df68d11be142224a288f4661f7a451ecd7a9dcb47a4af2e0f11e513303a4faa307dbc66fa97a46643862fb18df7e04fcd1a8d3ca900aa7e7a1315cfe9e1e2c8b0535de5a3d930b4c0d0329fbdfefc5fd11e2b2cfd1d12fff54a22c4592450bb56ebc5148437fa3f2d2bc4c2dfe7fdeafe8ad7483f3c8b6c75b23c89c7482b68ab4870af9c12e875020dcb90c47ead66b9609b4afbdc349634df2966a8160bbd1d64f2c0b424846425eb66efcb7ae4d8dc0a80889a22337881ef6e914f98df903e350da4e9a11976e8d2265a0c61accb4e7da5c2a25ac8743429038bb19f0be7d8c21914598a4748443620d96694c80cef729519677f8e4c590390eec4a62f9a8c6ff5b11dd395061253f42e942f982d692b51f81a93f63cebe4676d17722404928c9053f2cb9df963bef601d5422f010b322014d50f62489f2458a7784038162387910479f3f966f108d864ff73aa5c174923ac71ee1ae0fa5f310ea6b7e694b52c1e4cffd33095c85a0db25b858eb1e448d4e01a252dbb0d45c906aa454c626d67092caa1c675329ebfac57e2924cbbb86bc859b8853bc591f548f0cd0488795a6e35141a0c328a2fd3d481de9e9610ff30a9f6e158c24d2f2a8273e3ecd938f65a215bf2c684ae692b9641e71badf4f7c4e7c26c01edac42f65b1f1ecfd4c54ade832edbb8d36237ae8080c825d664e707374e80d14f432521d520d857f4e84e94d891755461cfadb991bc37f84dd8a415bbaa4d319299f35ce30d833fbe2ccdafc9a41496cdb1f1d5bdc07f2ce9ef2b59edf6a28c577135879087b9e526f4920ce8e775d4701fd8c2c8f5d0e23fde21810ef4728fba6e2c264ddc279570f2b358730dbf90f8924741d7864070db879f840e295d858409ca7ed29c0a79b766fa2c36dcad13a145a5868192f4e1ffb4ec06b03cfc6715aec99cb5732dd35ae9e9f94cb71a57338d55b8fde879a6b32ad732dd4ac63d655aab704da68cee33cd6ab91937cff5cc8658b5326c85a3b40f07a0b2e2d34bfe31510ce8bddc91e75a060ca8bdcab4388b1fad0218c37cd09740fedc12c418cc827f1dc14462ce8e8a85d4c861050cd37e9d2865ea9b04d176b19f717ba65bcdb98fbfac555424f5c7acd417a443672ef17df662d00d67d0d7d7ecb00219ff1fcf5da62deb9cb9b9e0e7d362f998e9ba0094d7dca69b72445771355e31b11271072b33d1579290e3fb02966f4ef5e28c4e33da181002b9ebf988b825a932ef41175fdc2b53de10bd89b4ef30ada9acea7c33b1f529faf21f2d7a06f7b5af174d18dec5b0fcf5adcecab5e16928593d9f486b7915107f2598d8521006daa3743cb29f9dab8365c0b82c1d8f4304d8b72f5ccc9f0fd74c96286261b8faf91951ca69ba8d5670498aef27956cd6ba1c5cfacc66556bbd05faedecd68aec3b93cdf8765bcc002e647ac00eac5accc389bc23c3e4e0b7440d94720be5b3e673213a92d87a8c19a7c145511cbd039293f3f6070b10a3d920716170666616d5fd49f8278080d0dd0423b3e23ae10232cb8fa02cf9485fd229f2164dce45a0465aa6e848c2d36f55ff8d0667d72e87825a653034f81e49050a41199b90718345ce5954b2cc3f236daebba6a2ae3ec39992f6e9d4efe7c6404f89770243d0809b2409bb144c137387b94e8dc5c8166b43ef1891ec9e9383c03567956407c889d5d7adaf58049d98bd9b4bd1c8ae85ba1e77c65c6bdc3e389045da1259de1c34e186c8e21724f68da6c01ea5bca737cfca373f99dfe013c99ac5a8ec16c19526e20a91ba815f88c905dda53858f4c0ab9e4a883e979f8a91674c28841beee88ed0676708724193f5c2245a46c4ad27b30e58f84c87839843f581f87e625e007da91ba8f55e0e43a07a01811ecb2cebac0a7fd1b26b1ff24812628cd2afcce7f64e1ca8fd696e8840ed8c40ca088213006cb3fdad26301d43abee6bf16433ef4d4cea83c61de2a988f5b48f908970a262fe1cfe15dcf668524d0533629d6a3980c0a2684159454144c226686ce958b80748f1e00b31dda9f43692c2db69c18fddb099877e29aef0363a73489a50c883f4889753a38509bd023e282be4f2f62f85af28b511f43aa617496f6c59799a939b8e124d006aa347f42bc1042583552b4247509a2a89ded797b142075d096263a73b8da828c4910d50b46163a7f78b256a2eeed80602f403bf86344fb2a92b3adc3352fd2ee94bf9bbb64385d020c5a175986a6671d1559a37aa927f7866c484d71a3d00f5ec1efd122e1d123528a91b2122781c79600f9dde6dcfaba84774d01238a54641c70d114885715b3ce13e3a472e7006fc4471d3bd37949e52d402a80d3d060ffc8256e1a0ec2a8dfb8e7f7c8e8f0e796811c4bd409cf808ddac825fe28b3009296cbaca0b0b3d28a030723e2a7a2e9e9acb44f4a83078ee0d2af906a92f552e4b0eaa7cd0438781a2b03202c3ea1d72799680e12959cfd1bbd8f419528cb96225ca15c646b2ad69906f5371d30ef721cbd588d45913b62e22fc314168f82fba0018cdd1d384a2a0c6efea87dc123091b14e9e379784b7decdfdfaa51dec3586500f1d180330657395ab7a3581fe244c043d4b3e319df79cd98a2a0be7885101f74fb59ea3f8bcbb19f92b96de201fc2dd1ca984ddc15eac5823fed8c08f09ad97e62c754b5cd291ce39882bc9f425c69538fdc02aa7d5bd51aecbd436852e602b0af8a411f99dd8347501d44ea31e5beffcd0d61c2ab5b1ab39ea9f419e64e6fa739bd130f1e7e3de7e816a45f0fe439fc8bf82b4f2dbe8c76d2ea8318d56d51849b943b161cf6861608d6a389ef9f5ffe357eccfbb52f9ac926f12148dec9e470cf5aad2deafcadf237e7d0800211ce01d66fc3c098024d3ee4bdd221e5e0f9d3d3e189323c0409e344b19de226d6ae996da8b6035249b7549764d8fe4ec198b26fca428d53461ca80510179390a2450c49e4a382bfe27b88c6d2552b1f752d9bf92825650aaaaea70bbe89530a9954ec0cdbc52a87c89bb174472b5974c9096d9c678d52c6ab09fb73ce3afa5a20b80b8fe80458f2c0658067335c0cdc28e3dc4c4513f7ee3b4266be448cbc33b8132c9d01e1ef46c79503f11abb4889fd59005ea97028673af67792124a341ae1055943c9341fa7edddf4ebb925cb249fc4bf8082d10b8582ba5332de5b996bbfeb04b2cca25877330d84de5fbc40776cf91666bf640a73a5e2fa0ffa473211da5c45d755364d3e0df84d1b4911d3f179c59e54d9fd5bac2028ece6323418708d766f0641cb0bee073fa05cf529ad1e1e15e473d71024061ae4527734349b6df1ec9219c1da43040ae06fe5112d48a6cb47d0221b0839297df8ad7c4ff9054d19e888cdac5df01535de82e9731c677de11314c2f835e403f5a20a9e3027520bc5c12815048c6a01223fb724682a4225af0562d7ac46482047c9ce8cfb94f98694cad76de3866e9140c917387234eb827723219030ece416d3d41b53ce196265510ca91e3cb1ef755c77e13795b433714c28b5f2b9165c90bd3d760d2d54526c9598821a6fe5a6be38d67ed42d9d12d80e2bb2f801bdf4bb3137ef5d72708b93a9e231c348dec68f1ffcd442c4ec9016ecb8408f46874890441d311bac0915e339c1ede80569ea9243734d555476231dc0a78c6078369940001f8a51ad57ef088a62767a8f7b59a556fa95d81259c100b494161368cfaf3696050f475190ba49ca9e7ef01192178664a09ac02030147c0dc0ff0683ecd4a2a5006668aecdf1be80a7fc4470f9023d129f6e4b4f40b196882ce38838b118f0c00a5d74da54f60db970a82d57ef0bb9124188e3f8388a47377beb4691e66bd33023318023856538faec5f0a35409739b37780572a805e5184c323ad7ebc9615d5e1bcc56aec9ea3a794df227515e27f0101bd7c696e3bd8ed7a5eb1ed456e5b1faddebc6f226bd195d049cf94c4c8cb64dfb48e7a279d3b0a550781240463f9853afa2b2351223d05e1d00cd4693f1c4f832247ca6b1479ec76959a5eb06211096b2cd86602cc42e77d03d2a5c85d394a65c08051dd5e2220396e055af99fb6d5819ca7e93079061185cb26258618619e425458793637e5c84a9ca43d4274d3c4c575a9c772fe7b896fba78dc900a329dcccd3587232e51d33440a5615b968ad9a3b27b32256f9cf7f2ea44beb68a0ecfc97e21d800178ebad991a840436fd0862cf972b873a05ee08a1a3ff73d6ff96bc9629732926617508d4b0d7d989d6846e8c51a4d14d7ab32a4a4a93eac202f923c9539f261be0cfa1a03d56c74b12069935853b5eac5c474f7af668d47942444c396932761ad98ee0cc2f66e7e7f9c5bf8d53ce229f4e2e6a258f5c9adc633c8651c0153487e1096b31c478a0cd77ba8d235a27135e422fad05dd21f02425e58d85208ed6781116d39cdfd4347abb71ee00f7d704398583e73d88b7de800bf54cb350b233d587b5e11e5f67fbec3cccad569e1438724b92c732f31b755c9599ee5e9ebf61cbd3ea464c16d3d0520e938c0635dd66b08aadecf63ee2b585ae881e710602ea97350cfbf3eb132096ae3d382ffcb3f91d8b39180cf17639330d76effaa784269c54f3de6d86a02e51f4858c5ff7f46c060e13d9a48a76b00e098ea24e6b806d4bb3de9d604c842557bc6f74b999ced6a0140eb83d9d858177fa4f490fb21e3f9ceb90db95e91580a74596d1143fa6cb65af109074d3ecd5372386fd2412c6562245627ce3df48615daa903b362c3d1c926de9c95ab676fe7068944f352909154689cc143b66e92a47c80dc8ce997f417ebf9f021bdd9187e173f00f7eb8839339f172b5a5ffbed1e00a5a9e1931ee23274ddcb3276c3f24594e02b5170b674a9cbd928608d8a3e005073bdf2902f22118220d6b687a60b6ce16f1387f9186c220abf9a6f7612f1b22a12ffa6d3a8c11f49f7b5ebfaa02cc5db8f179787a6ceb1be5ffdbb1f1e9639a2908d1cfa79617820d4af3efa0fbc9cda0b2affe7d31b5775214c9c75810dfd0402ef14db44c41e8b01331e51c09ca8fd8082468aa2c759c481601928d7a37745c7e60064212250b997665beaf491a062809c98bac6484be44b21dd7f9ab4d4d24a0c6f8cdb18c8fd12f2600f0718dd14541d782317393b05251155772965d4e3957ce74af3d80ecf752fbd5b13e87a56295009eb698fcf551671ffad552e5edb8d81730fab8c7bc08c9171d02f7ea5348295e003d2c7bd9e1f0fa6bf47c0f10acf5d67c0de22cb0d019d6ff60235d6d30482e5f74caac8d0c3ae7323873168cd3fd28f7209f57eaa56fa20a6c254b69312ea7d8a1d56ea92c92a584e030843d052a040335bb5e9928b4b5e8c852d66ec38219c2034be3f103a1aa66c4c1fa932c1908b62831d26628485f2b379f80992cd574cb443b861ab3760efbb994a9031e21502373036b42408839799913979037ddfac7f940177cce7161415fa6c6c2318a5d4534888aaa2e8475b11527f7ae60e98d19d80d19f9aafd336200ced2748ab637e8a880266d36ff7eb1a94ca9c99e43209fbeb9a11382d090992646886390d248f7a25db2ea586e8826c13c187760ffdefe16ad7a5c17acae3720c826f63e57304605b912c9de81179bb23a7be412b1c87293911e664998ee368a6c44676d49e426bd42c8e8410ab9092020a9b93be556a7b493dfd63f3dea8cb6d1c4656029ce258d1feacbd8111289dd02ca47e239599937f6f6d926b63d30444d7aa41a9db584ab04cac840c3211f4ce1075e19d48c62862c4f31b1038de297f4127b2639ac952cc76d07680d8c5b5e95a0c23a443831512ea6d3b1abf51baa1bbdd056e0fb8eb8869d368d570ea292dbf0fd3b08008d862bde0723a52f122d69f16b74f3671d900901804ee2b28d0d604a75d0f07c6d334be387c16b746acd6269af2cf282675e06ca2e0be5d38769512c73daacd31f456c8538fa294dde331a61fbbd33c40c1123e70b1592091aeb018075b311f5cd5e010e1fb156f080d98ee6dd03a00cd3bb93c7898814be4447915ad844dd1211c26b6882361a8038fb2ac5af7a20382680ad3e63d1c4141fb62025909b822f13ec26bcc9bcfe8a26bfdc16301152f66c2e4a72617a6e92908e94aa6cb315f9626c35912b69ff27b228893cde4e9c246906e1276f45878042d568abdf0612b96b1245f6ca9103a9458a1639b9ea26d8e647d443227b1a291e2d35a1482201732337d91f334b031af8662fea68782227acee1c70340099ea03fba8c38318fd244d2425bd8f818a01f57595953924b1e010334daf666682e86cbc19b5998297db68652b9c051ef3ea7c9a4a488492e773375c1fb2d41f9ad03f47053da69170db9108d57adee3900a0d89ae184819f7b6a15a66a48600de58cbef68bee1cb99a155de799281d17ee1d16c6ded950f6a220730346377fef58053e8a7de60aaa2b0c44a79b31b82649cffa24c6b6f69c893cb0ddf1cc891eaeffc8b0563547aa8f4ea9feaa470c10e6f8de2e1cf99026bf44423c4eadd2eee199b02d229d0224b971351631de0eb6079ef64035066ef094cf083a8c608e80cf89f5beca7617a57ab4387c36b524ed63c22472a38dba3a91e301a2b662b894d0d6291b32ca094d3f0e3ee3b2d2b72420d965bb4de7b2ab5a5f92aae17691d8cdf5240d96cc5312ae84b08c3710561432ef7c0d9d989a52e7228f2f9b018a70df5226d8042e8fc082e612ef1250446aba032684fad65430546ef3ae4b52c07e29019819b3aaba5ce0de9222b6ffb0db235fcda1bf8190c35f6e697400e088800e95f97ef32359c42188b81598cb0d0564725d6a18889fc0073750deb44c25da2524ef7056a96d691164d7f8511f46a48732e4206044015c29340fb231aa5076d4057a16e12ccd476026e8aa9365094f1871d4bc1dbf9e1dec5bd7c1bd6934a269b497d77c0995043c4c16ffd0106d2e3c62f576bbcbe89592bf00d27d512b1a833684d069825f89afe8262a7f25d9014d6fc902af6c1951eb38f2738e5b076a220305d1822399924441f3aea97f1d23a834d876ff9a47a2f34a033b020403db2d828dd5138798b4334a3a918918518c538c08d4de152b8822462f7d088a3e9bf34bf5ec3e257e4cc6f608c6a69c98ae664e4d95109831eea31edccf91b9eb67b0ac060940dd330b410ed79000bcee9e43d1a2a01d66ebd99397aeed9166458ec779f8796688d6d2f9e7905b3127e1488cb555324684fb54e0c9fc36b705d6f7f0b840093652f69fabb9be16554f4c3f185eb407f01e8a7badf200a46d1cfa30e99c57228277a378712346e21a260460b0820e99408ef8026eac678368e691ecef199723218a4338eda31b4869b710a60daf40b73c76c0767b108f8887a4175e1637a370d86cee1a49de8ae18ebc546e9e1018b97a7dfb18e2e2581161312aa2728ab1ec1da38fe4feac9bd00ab788e4beaccb0c6de3b7df510b3ba271ce20d826ea37edeb54408d5d6bdfe8e0804664d58c987c23072199bc5142c57ce032cea44080aea6a2402ce0df9a9d965b0e20bafb3b0488c62a06afc4c88ad9c4dc2b36c82f2b9dfb4231bcfaab7cbdb691a4f4d36e5b9a4407b9b3a7c953bbe74f4586f336ad33674f9abc0b1a5cce448c783d6c4b90537b0e41bcb39eeb51ee85935bc1d041e1d9bf862922c3fc38b4c75abfa6db527b160a6332efc559f1b23235d839b3dbaa562630831951cef9f3da0b05549dfa13f03b26989ea477c9aa47e1b145029c47744df1c909ed38b31aec423d55f18fb69686e8fbdde5e474f4c319d381c6611591537e7164fa7e777482442609873a3a5eb5c54cec97667b6b8ba02b998ed12176d8fa5907a1ff11a950d50e786f6d2794c53e8e9395cea1230e3432d0037ddad2dc9d511dda871e1154b05ca20c9b9c776d4075079020dfa36363f46f2db625c3c08b4a3a723debbb93d7c4c0bd5bc587470dcf2b7bbd1457dbb5518534c472b173345a232dcc262a91b27e57c29abf3f8565565e41a599a7061bbe7503681c54814319298b93a8b356de5877df3f5899e8218ad80858a6fb2797ae7b1cb9ac27a054db6997ab33ab23071310f00b2502ceab5d12d8686286ad874c584d786bb51f3e98c6631f6638be0c53894b333486e5471d01307a9059fe8c1427a052d040f085fe78f32643217e2de06ef9572f07d1eced3b472abfd1fc1d099e9a83dcc4b1fb5a96983ca420c340e7bca328fca823e19e04db8327399f7a595cbe0331242a0bf967944c1a605b1ff97d93576e6357438e20a72ba80e170080bb9d4ac1c704efa9cbaeec871122a285656df18aa2a0c02bb48b05f8365faf610035099717462fbf80ddf0723f985152a80d055201c9365f993f17a4428d73180cc5d17070d8553e4404d06d1abc25cf8176afe3b250b6ad83b75d20351c6a59a2c4fac5dd8e70ed05803e507ef0835494c01f8c01e3ef39133eaac4b600e717f6aae357cff00d66104235f88642396d41d52cd582e777007fcb7383958f279cb5f14c7f1907bc3f139cb68d41a5da0f9f1b88dbda1dfbd3f15f3800f560ec93f37d4baf4c122eea412169c4bf4b9671ac08ea17091cf0873fa289c4ddfdb7520144847375970179771938dbc7dea7fab2667c558b26d60d18e8303cf845235a6d411a3bdf81acee37c993f1b786051bf2605ae67f497a41f80a6d7232c9fe68ce46bb1be42384a8d36dff893093466e275368057adfdbc4f102556ccd070a55c657b03e6dbc40cad63f77ba1bb12b42827de64b45faec4f1d86bfdf0db8b5569a945a07d8d28009f173c4ec8dd88c5ef760a8c2ed1f4848881e4834eeab89e80cfd84f5897c662b8b93b7038e2420037c2c65d0c4b7ad9942310871296a68cd9b400dbad48311091fc4d3bd5507db26b02ddca73cddc4df51b7ed139b6349e76d9119690267bc39bb0624baf3b38d7dea087fee9a6b3223d88b4c81e65e22531d6ed43cd75d208ea66be516deae3490260e1076adc0ed688ffe1d5b3123aed5645ae6c4fcaee4fb458787d1207bf29235ffdc76db755232c551880f9cc5c40e398940b94cee5a8c22ad80611d665d9c7559517b42fd3d2f35da9066533cb869c006b28930d7aa2ea430c010491a7a0ca260f1418c970ca958ccee72948b62e61bcebc2124f010090320845e49ff9e55c583ce72f20b12d3fe0b2f8a77ab841f3616025f862725fce22fdffa0017cc9047ffa69909cafc5803af333247c15d8c8a3da6f5654bbd7b7276d5b4375f269b9d22dd6a7d1e1e10bd35f5ae18e5540c8eba9a9ead0a67e78fc2a05eed579c39bad001269f8fa8d6d99d7cc2b5c66c7f8e6702e04572151e2578ee2978f9e46041fa574124ab30500795b568171c32e152e92fe8995bde148270113d6e5200024a67afd47c09d3e40a236cc01a5f404f18fc6110d6a9bc187484b33b04909c03afeac753e8b4558a2128c4369d1ccafba7b35c07eedde6f6917296b11a1ef7cd3d1b3dc5613c615a81b5a5da58d4f9d786db184f67aee35105abb618649c500006f4b3431612a405922682a72c5b2d75b3db2fe638ee4c3aae6712d9ef04430fdf74580c9c551764ff43895a45fbda967d07464453052d48d41ea3e8f1254704b15f9deb792beb70689fd6e75fa81d9e97446ec9eb63f6a9fa2506a532038c60a3eb159397f8635d9240bf92eb95c4c65b389009bee28b7a9b41d9f7d5b61a490260c8a2c101da5946c344fad8654acb19260e720314248040065762218916ccf715b1cc391caa61e89cfd974cf559e7644922521b766edf4d22f6a0602e95d8e5f3432b0df8fc96e95efe178680095e6730a6a42d0ab5c79d6f4c9fa34b54625671192232c7813598ce112d3eddb1c91771869e0924a1bb7d02ca361c1cb7fabbb1c932639ef266c2c03a44e562dedc5e1f24118f8a4ff2e096a905a9f5a23d00832928e61da53fa93ce240aa0ee8cccefd94080b57afbbc836a9d452758660c7b96af7f78ab4b22c0c6d59b0f987a969ae41c116893c03a6826fb4a3fdd5e9d4cec308ea8487aff7f8c3d9928b715d2146ef3d4f1fb8b9e2c111386f487b095dfd7bfd20c66a313384e077b161b06f44a8980b31224dfd209d34cd06f11667329a71751fe10a49cd29da2fd01365e60d786c0470bfabff4257c8bcf6e5eb5ef1a12c1d7f68f1fa4b40480f4de1c58934637bf722f574c5d63b40855a1f456851cc41f547eb0f8bf133ad12a0b6a8c7c7f87e8845fc458099282688e3b4563576f2c147e2992fb39591541bc51696c873d5ce28a2fbc38be7abbf2dfd939f02db162db213d7e3f32b795ef549cd6d6f1403faa6067778da67dc79f8868406f1f194aacab5363198b6b42f781e3cd216b582021ecdbbb1afe1e0681c592a879ec4ea7982c5792c2150cab016618270054a34118092950dc5fc762f08d9d8656233f2fc9e155af4c7e01f1f925c658e22bf4f708352925f23a4229abab2343fdb858d0471494097f9201baf156fc1fa115bcd7499de66d6f394711d7dc6373403c891b6e4b61438cadafa8cbf24389d1fec9965ebd380abd72c719fc11c21dc51327846da506542b520cc6a868399516f1a3fc4e688d8dbf66d2a33f75af0322024b13831783caf952db8eab2cab3330c88a274bff297f835d89bf9414af1723fd96148f4e0f94ce69eb2f8e628f208cca05c096210507d00bb0ade72b0439225aec3cbc5ad0f42612b63863f5a58e0b276227b39886b24903138d6bef27652eeb459dd80a8959aa732b1d118e987669227f7d59c5e169c1c37e204c6c65ef97613198277c694e00060533e4a1ec5bd276f36952f1bee2a2a743cd68a9dd9419b1de68f095ceab6b4dc706aa64f060f76f90c8985c3704883d3cc7b270873a40d04829166cde98eea5f9a1d5396d02614c88d31b2b61d863bb967f70c0d9a857def98f2bf60f22b1f39e2e651b8b353991bbd4b58898a942ce7c7ea1771dc3775f303e9a3ad9b3efca922541e0928519cf7aa03d708ead630718044469a67517f52b8406e18f1ad0832af35ab05d912774ea78e816802081292b0703439bd50614903934aa12b7de45dad26f3493dd910ad1a9ea42dd1d8abda99534aca171ba67a7a7f92082e964d39e01e49a82cb3b39c84ff7438aa21281d31b7d0e5554249700ca0d4b8db02876538745558d7259aada8b9999b72b558baf8464be257142b9aed2af3690affc267039ce89df77c5b427805992f4834cfa5bc89cb8088c4569069d7379289fe7cbc869278258409b2cdb85a87474dbfe6d1adf424a6674e7a5512c461f29635f36775b1b65ed613c3df3905263e93098ec9357023e095043f3ae6c6842b1703ae815faa07e5e7fc34e5194efb98f77198982c066dda21002179206b702d70ba9bbbce920ef27947033e18e915ea2a5761a97b67e5522ef22ade98165aacbdebc171f9d4db008ce160e518f3b510ec7c778e600f846f0010ea0accf4a9d67458818f2f39e09f00c6d87467e358d23ae63efa22174104499e79b6d2c9cef570ea04b7a90a93c23d2de8e106cce594d4d67f1abb2cddfb237fda18a077427b5c83d11d4050ea5e92cddf745516cdfd6837b090ac4148d5651be992bf37c7ee1fa902930e9404fda44282a007a8e408e39b1f09c84524bc0c20614f77c8a215eba5ce3664a59f5bea02cbba01007a4f66fd94f1a9a9ea8bd54443545e12ed42633598acd35efc5bd6c4a9d71353c9c2016e15a77a4eab86a2e0f39389152101317c020c95e1637a9da23ea1f80175fcfaf50a6d0f3696cec745296a4fe257326cd63b64a24cf20aad80800f18a800e57f10374e96ca830ed7589a8a858d30d6f1c8a2d40ac5d8ebc28a2d976e6a36f329b473f5550019d7db0d986ca8003b5744fcc8fca88f88da5ee33c410738357d8043ecb571fcd1668c228b11859214c85cc9665fc51fc928423da2a23c80d03b8c23d6919c27ebd4f09acfa66406403fc91eeec8c1da3463a2d02cbcb91323fe7749855d91f740405abcbafaaff55afc4bb38fa51d129dc53db4b2bb68a38571540647483026804281ee245bd3258f7d0859a8100747d0194e5605cb1b6d9a3cb596fad243ad6a3e0f98a8d1d6cac5aba392457f3e5081f9e415789c09ca4f2695c396777d716987d8865586e45bc24aa5709e76160d3a6485b5a1704311b4c27dd8a0bef970644691958cb1208d97dd842d1111103f5c0452ee5faf0dd801780cba12c1d467e2865dbb59af6b994251728c1721ca90bde927abfa9029836738b42c5b83b3e186d5615dfac49f0eb8c012690ba1d4e60391c4c1998878e5aee5f24adca24b54b9f2005f0bd680a15bdea2dfd8e6da1c5c7cabaf864a070688275a09d6012d80993f0583d49780df3637149a457105851682da097cfc04a63490b16e55a718aa75d294fd05acbfb5d198b1d3f3af320067e72f6c0b33b1a47782faa9bcbf5366b5c8dbb8be0b74b89f56b01a7aae23d524c85ec91b0c96b068daddfac4120dd7404e6e2e92b868e401c804ed9922ebace3b7c064a308e17f2acc5a00f33c6d42991bd93bea82f706ea5e8035419ec0663cb5dbe722940fdec54004112f8d8aaa8a8bbc63fd41f87ede3b7d5bef940f60b3094537b84e8990d3800581b94c90f86641e6f3c02c7bc8cf481893feb6a0ffe989173c920cacc3344d45e40199fe2de8119252006c74eba4786ead2a0fbef2d6bd44001c3bab16dd22b818cc7c40800d4fa703a8d5b361bc70839640a19375b026f577f1186285c189241c101e6fc86f2dd716dc059c412ae401de2750d1d9eaaf4e2c9811dc7e0fc5122932c52ac590e037ed1c7a913841973984cba9e2e05e95183e7f4220d25cca4ae4bcd3c252647e9b4a9df858e85d082913308b4ef328884c40d56ff0abc768c18c60af0bef835e09d331b7f03d13d0c6c38e32d108919d89cb0e3a127c05d4b4306e7eacd9877aab0ca4cf302a5b695de67178f36d6ece4a9afc7a8136b6680e285ac8ed6a9bbb339199cab10ee04dc93d5b2d7df1bf82330f6aa4d13685cd034ec28a552425356c4c1638e744d138e3fa1219ced84061c62f267f8389e2716c5c4d0b73cd501886ba2f569d12c020723b85be2ec39636d4cb82ceb26101747746b4cbe66f9c602eb13852dd58f4b497916a18944953994c6982a6364a90e70cb97b733c6c6b9bc8c09631ee084b8363280a1e28149a55fd46afbebe3a0127d54b9830712ac8279990b1b6f8271dc014b6409055c31ecf50e4c7bb089df186316fc28d33a8564cde037ecb27943a6869a680d25a6bb182f9f37fad730cbe208be24039dd6fdafba4220395e13552759978106c981a369230a7731eb5b3e06798463cd8cb61037bca50dc6017edca659e066c96be0d7e553a6a0b45b26c380215bd3ccc18c317fb1d131c5af73c6ef41835a938c75ef7c1ebcf42546843acd87697e3c349f2f9e526900518bc6d73fee0ca10248b408007a7a24df9ab664f0b40f99717bba90a93541fc13cd3c9297475e68eeaf1ca067158ca99f384cd6012b4840fe0c7f7741c7629b99816e286806a9cdd40cf6db68f145012d43c49bfab595e7d40798b1cee2f7320884de6dc33c6aec9e023a03b2655a30d819a703d9ce3cceeedb0d726afde298d614231a296b16b2fd14330eae4e6a19b9662028c30c8995c9191573b91e4320fce38a83e051475d5c8405071f914f0cebc3d47de1f96deee69501678d78d43612b2bbc92da54c29a5140629065306b5db1193a1455737e6830ba25123ee201a25c4cace1904c46dcc7e0daf34d2f1d79a2468504201f3937d577f5b7242f7798a4fd987b20883e8be9c42b781fadbe76e7708a34728a326a7088a44de2c8a9a9c9a686e9a686e226e1b89b86dc49156a29460a9e4cd25d2caaad47193d213badff9d07de1a2fb309ad0a5d24cd05d51691595a15894294051625160dc845b8c847718091fa1593495a1cd228b95ed4b47141d514769449a1ea5a6cd29126d1ce4386fe6a668db386e34227123126965a554ea5ec0172fbcf9c54aa9eb5ebc800123060b6461f16696173062c460619121a38545464bcb8c1926130d76a1e102f35203c6468d1b0fffbdf94d2e2e3c98be8cf854473c60467caa41e2c1d406b461c39b6dcc1adb1f89c76c19b5ccf864145dfd62fa5b3e99483ac89eaeb2f0890649073e9960fae5855fe24a476266e65ca626a38b0b7471f176619795b142d281349ddd17aed42194a451f66aa5fd82ff692dbd4a413cb088c245b75f4b4174917002ada518ddd28bee4b75030be4102dc351c6a8454dfe0780b8a34729659527a4912863d42247af4e4df3aafc288144d632814a2f4e000bc8050eae2875fff7f77d5f7fa33ac539cc5aecfe172349b052e0ae57bf2ffefca9bdcb448f774522afc69f5e8ce6c197a7daf5b723e956e8a7fce3d334ed2384f063a08c70bb09bb1ff33d5f6046e36fb02e9e8044960c1e7493a7dc9ec914f7ddfbfd98fe3e2191aeeffe8eae3374ff4be20a0cfbe63e4f06e4b8bbbbbbbbbb7b9c394d84dd97c021319d94495c2182599895f19f2796d1cab8efcf6edfb4d48719b40aa19009a20d781274a41122a08c082047788400cda809d1a8fa4310e14ee8ea02296069b0e8eaca8a80096954dd21100144019aa669483ca1b5734929e49a436c2fdb460410e611c23a4530ff266d46d35344c88830d2fd2c9f17071cd2df46683f44edf17ef27ff40081585fd97e476f9afc219a1eef173140e1736bbd38e0100adbe377cfa9c9f67e38a051d0736f07a9477f5c4d363aa86c415ddadcc19c42b80c4f13d4a2a67d2c84cf095465098ed00a9c44166ea069e1cfeeeeeeeeeeeeeeeeeecf46dcf93f67f67e677eef7776f698c0f79f69547b30b3b2c038c511d59034d21126354d7e4e9b72cefbc14a84e1fa4a478f897b43512d995c80008a1248689e73cec830944710d62114c2f6ffae7b985174262c122d805c54c1ab247cf0f5d772470331e98c8efe2a30abc0314bcbf0afd76e3bf8a4e3571755d0dad56f8e02b614412777a454c265134a74b44cdba800093bfda928a5c6900ee109a1f97e9a05e63be57cc49cc348e3fbe288cf03744dfba87946682f64525f9af830c691a649af9726be6700aee42136edd128f9dcbc1a5ce9d8237a4c1c7a2f94223d2cafe082f0f3680adf9b6a32f2d2f843ee85a26ac2080aa28cdb9ff946cccccccccccc39d6dba5f198eff85f157de7e34b8c5a7777777777f7474de6b0b1b191a41f3eee01aa541f7f7ffced5ae4cfdf73d4c71f8edf859d2860aa1cad07275fa48cbbbbbbbbbbbb2f230c623767653a87fe96bd9addfddd25b560790708bbdfc3b5a8695293f1e39ac423c8100aa1970393fe1d353abe1925aa50271c011c05d98820650abeefd3722842c81145c47656c41141312633353dd337138f2822b641d1cde98244175f7bd1699ebeefa33e68f4aa8f1aca3b5c3bf94b1f1448cd9b4caa2805ca5f3ae19cdad4e0a9658cfe04b7315c6a92e4e7d01fc769ff32a71043acdc013f788832f3cfa8f9685410fccba4b1686f889661214ad049a640cb6fd20ff07971c087fe1c4f14681ac4ab50a1524583b811f2854cca4bd31a88241fa4172b06a8938080543ee7cdee2bda07712a230f8d821e937efe1e8d724f878da7dafbbeb94f9977a4135c675a6982aed6c4baf000ad3b63b2f9f0d4e6f5464d46e8e4d3d85403b66e503599f666a3fd636545ebca8aba102d84ae6ed00fb8aeeea15723bd285dba740652d345a1f341bb82a9f47e2c4d936e1d467aaa2779aa3ea8d43c79025243a3d745d1d5495b3563dc12ba67ba508c70b1008edd997778da28d8fb82ffa9ffe674c70ed9a7e036a6b7ebeef3aa0fbabf7486c2ff20f2eb11d4a3000d08f09c73cee905d15c061dadbf241884a9b7eb05915fd93ffa3a7b41348f897fdbeb044e5c319082fbe6beb9efe74af2b918742c5bb6ec8f65c78f5274f5a372765e35d1edc4bd356bdc146d92062a9f39668e398e024c396fa68707bb65a8931109ee9b938edf7fceaedbd42e0dda6285ced5d5efe7ec34f7f922a6bf29d2be666fb6d7b8af3450ed23e907ffedb9d883fff6358a7bedb49d6af421866ede6e333dfaf3d8a95b863aa9c527dc2e8cecf10ab828b5299aa2c97af54ec76614338a198556b341cc7acd7a0746a9494db2f835835146195fb1bb6b8298e51bd43551ccc0ddddddddbda7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7073e95d6e9677efd48a1fd3016613ffdf5cb3df64bb8a3c123d0487f0d5952064d212d68bf6826a3fd1c8947076d9b6be4e487f6935e2b241eec43fb4b4efaebd28b7e18acfeda0848632c8b8e0c28438637cb58cf552e0f62bd74ba0a672d331ccad1ca0d97dee956bbdaa75f0d9b0da956ac3ef282c58082dca5ea984aa552a91a28483673b95c2e974ba552a9542aae83c1c2321b6ad5aa59fc62580c28e8f57abd5e2f168bc562b13cc8d53b2e97cbd572b5cf4b46e89ebb5cee7297bbdcf582a5c514e3c5308e315090ecf57abd5e2c168bc56279d06ca855dd1f5fafd7ebf562b1582c16cb833cc8833ca865c688c6cb09066b1ed969b1ebc7947533d3ebf57abd5eac178bc562b118c631a0209fcd66b3d9ecf57abd5e2f168bc562b15c5e4635467f7af183db2156c1199cb15eafd7ebc53bdc6297f7ebf57abd6a7435d3a67b9960b31fdff76f32c13965ddac59c5afc19984b308e1cc67d4e9be44776abed8d3e605f3548c69a41d4834c6a088b19539f72351284822a9fae10adcc654ef58a364505595ce3bc644a8a8b2c44a1674362229e0c1c1cf098020c5932c76d6451531a6f791efdc3f871ebda858c1f594737a55737f4290fd2a82bf7e52c27f08911c7f78ba804faf4e0e8e7a73f72f4224c7bd22f137cf0bb2dfd30713ffe8de12fe4520747fc85fc48bf817f18aecca78260d3011a80127c21016e146ddcd94b93db845e7ee5e757494ef2a55d0174b78b1121c77f3467fad105d5217393002039f22e79b60b6d1361a71236ee39553b72c6bda0f3e7782d90ffe76fa1ded073f088174a37e2141045a4d7387835bf03261d5db5d80f314cb4c0e5aa363c8d08a99f0f961233c2c6617e5a9495ee7e79f9a279f936f62e2a1cce2e958a523a4881f413320365488215ae842512981dac4a2152e67cfc9935bd5cd392195f3db882965d4a694519b734a29238cd10a50d3b4a9cda951fe388fd0a2bc80164515d0e684110310c626b8bbbbbbbbbbbb7b77c7ecd73134c890ba23e85ba8627e4697eeeeeeeeeeee326a3a5ac68b3172945fb43846334623e20b9954b434fc5fbfcfe889f6e3ff7cc61845222f88d3e8cda561510568c3fdfc0839b33004dcc6744d8e1f4074702b8a4d0c4888fa6b32b6b8c98c56de619e98468d5cfe247efb6e8440d862dffc668470408e0d46fd6b7c6a12b645711350239846efd39ee8b6d7f6e3708bbd387f886335a86952934c17babb13bbfdcff164753dbfdad0ee5f19f9f3c4721aad8cfcc8a41e3a5a850ca1517bd73c26f0e57311c6f818c2e1928f1bbd89b3c238f8eb466794ad304ef74368dd8f5df7e36ec1bdf8e09c9e6b8252e406b49a20eb60e3cb4f40bf7b19c840ff82609e3687fb29e7d4a626b97b557942a118a182d6d9c51557ccccf876010565afc2d01d7193977d7f2239f1fb8388ddefde9096ef3f247a2ffb9b13bf9f48ce694286fd017fa2fbaa83b68e4675071187c08f1e919cce2112ba7e78727e82cbceff049fab422804f6eb886a3c34ad8e643c011951086bd031213a75733b2d6a9ad464fcb657b4528f982c05ada66ec5df9c78da1c79da1c9126124dd1d472744eb7390e65070f9e9a4f24676a4588e44022392f06d07e7e10da4f6d06013f7a43a0f7e2deec5ce608b583620407b47e97604e1c3aeea1146151eef7279c736e10ef95ac11d581423edce6ef6956584714c2efa751a59bf2c43d3c897e3be93cfc254dc84d2f7210d8edb908e72f69a7154f58f1021e96ae0764e4c35af184154f502943d0bd1254a806999b231fe04f0f02fbedc3fcc827ef531542818c280b15794be7fcf6d67bf1614260fba37b5aeabdccdf1cd832fc321f5219749a37aa11b9a807dcc6709f023e04297bd3824fa7200cf682c16031278df2a4581c2884faea3170ed4d8d2fbd1be91494c91c898ca7092dbdb31a05f3a5f7261627eadcf0d541404bef4ceccd8d59a7e26a35b472d5ca575934ca06168b1379727ced27c8f68646944ec5564b4a6b4a4b08d628d3148b137f6cf8da54fceccd4bab53110673c17c4a2e5ffa56b23851a886afcd025afaded91b195ffad6e954943513b236d24868e95bd528ad8bc5913a347ce52a54f6664650a7e46a255bcd5643531ad54284c5913c355fb908b4f40cb437f24bb2d5e29f5694927fe959068b237f1847c4f19567404bcf4ef686e54bcf473a256130de81b5602e5a7a36d2a8183fc3571e012d3d876071a490904e492a4c509aaf2b055afa082c8ea6c3acbde12f951ec8de4c5917547a1f9dd2562e1367be6e0f68e97b581c8d8771c4df9f968e9a83967ea6535aab47a3b62f3d0f7b03bff45fa3baffbec2404bdf9962be3a2dbd0b8ba3fdc4ec4d7fa9f4a5e7c5d1841847fcd297fe05920ea517852b4fb10b2b18563c8cc335b1e169798a5bb55aad1fc6e15aa91f98a736990c2683c9841887d34141211a1fca3cb5c160500683321894e930ce267483ceca535babb56aad5a2b1ec6d97e72f0d0b86ab55a3f8cb3f1d8f003f394482683c9603218e36c3a3544214f8960b0288345192cca741847244483ceca53a2566bd55ab5563c8c23faa9e169794ab45ab55aad1fc611f1e0f881796aca6430194c06a3f1a510e3887466904274c260520693329894e930ce14a2d159796ab65aabd6aab5e2619cf933c343e76ad55ab5b41fc6993cfcfdd0f81acc539a4c068369301aff8513e7448871a60e3b8cf184e85793cb5c2683573bbec75092619f269f0783f7820b5e8c57f2b82634be0ba7955fb59e6bd1f8312d903c19a77392bd4cc6e9d0f82dd418c1c0846ac0606030211adfbbc1d9d85a3f35b616ccd6da5a3f34fe89c666da561b0f8d6d65da56a56db5f1d0f8ff2272916d3a3464265949b6e9d0f837644c0d26240356826930211adfc60cad45d4fa91216a9544add60f8d5f434a178978442bd14ab4e2a1f16158628c2913e97031996cca443a34fe0b920ed2ea401326a4c16030211a9fe35e26939cd0e8a4bfd68fd6b57e687c6e738191746a3a573c73355773a5793c94721dc7a2d1d1ab24249a4c87713618e388ef5593a993d1a9434948609c38273ebec11887936271c48f5cccc4b962b0347183d1f826d20e4d5f7831051df41489e532f165b4811a157d8a9f3a56a3b6272121ed9078b86fe4abfab9fb6ab543538e739d38271cb7f21417a5e37e68fc158d9c6b69e2378d29e8469b6c936d596cb346cddf5dee49ac0e80cb8cbcc5b938178b73b168f456abd5a22f4ebeda1ac1b471f4732e4f712bd39c0d688c31493c9ece53e9446225d1cdef8f4f6235aae4c56fc1425799887efbedd93302928c346a494768946114258905db492c19a037cb105756bc971e205d794857bc9a811e6a2a2dc3793eecc34f9a7f18d65f8ca41d4fed92589e621f9fd91ecb3d9fa104e7a453de7219ce45e37b4bd3699446e3b38fa74846484868941e89c4a2716536a301d6786584fd9951284bd1b17163159dcb8e1ce4ec3c4e93f06b342939fa6babc209460fbfd670dfbf3b9c3beda0022d5a66a99fea02eda0022afdb50475753a644f08531de00bf4209dfd2d31fa22dc88d37eb484e88b4cd19c3f5a62fb22a24d24fad112a42fb29146bf71230e8af8dbefff42692256b3509a8842ab0eba3f3a71a7e932f0b793e8344fda299ee4af17618c3142f8f1618410bac7d6a4e0fab9920e2e1dd898982f0857e1fe3c12e7dceb94483307018a0f54d40453f24a04babbc36d09dd7eed66330cb855515e7553ee5e47827653a1dd5a74162d3485f6b794f66faf57b53595cbf0cfaed354aaaaa928bfd62aca2e6e458a24282341f96b040249751ab5b238b2e2952ba40daaa93c359ab212625166662a2dca2acaecde28a6eaf6eba662b85ed274b8ed28c7beec2916afeb6f5342b72f026e281b6842bb79e0b625c0710bfb8b89f107705c894733747b85b9071768c9493c8022f74a8ea51931d1f1d0b1c34e91dc2b4cdac1297b364bb39f03c29565a7e203b333f12e890044883873073cd0f573ddde103add657729a2073a7e8e3726b1448b6e0ee8425909512e7aa073d7e469997e484547c75dec79073a77cd9dfe589dab51fcfddb8ea7e48fbce53251a8179b523ab5b966ac5170c6dc355d9b8bdd893f819ebbb6ba2b4b962c59b264c992254b962c59c2b3d37946056e37b622e8160a0790d085c2012394eb91694a27a5e28c586430cfc281ee0d1755f68b4aac8c8ce801ca4eeaa1c5d0acbf289485c5abb045a10e1d8201c3ab1e4461570401c59ed0aef3aa1fa15a906252900501adac78b563b445c5cbc7d5848e465eed1505bac24c162444b78d91502da8cad04c36a7cf1062b0975c29b486d66caa2e463483d9a8b38c70a6c819f6607fb01f4321ec0cb202f522b48430862f2736658380af70c901be42280cf015cac047c3f87edf62533f80f80a9128c057b8c40f5f61087a7c0c2b36c52b1fbeba1108f0d599d0c35787020fdf49b12976f1f8ea34d8e1ab43d1e1abef20877ff1fddec4a61868005f9d04395fdd09fad597ece8152c36d52a017ced2904e06b6f0180af8e848e2f4db1a96ee17ced2a6ebeb615387c6d23d87c6da19fbd197d7f2bd954c7525fdb05a8af2dc50d5f9b06399ad4c5a67ac886af5da486afdd040d5f9b0435bd7d3f136153bee332fe38be721266f8ca58d0cc34f77d6529325fb98a18bef214327c651bd07e96c1a61ce6321ed3ec02daac04867e0ec1a67c36bf452d3417d92e68af15687f0436058fb88cc37c5d598dee1e36055f4078d81bed5fbeee0f006ea061a141fb8588f6bbb029182323e9d0363e11e0d57900cf003636a217105e9d05f06af783d76383569e121df1c1ab93005eed7a58898e507f1ebc7ac3e78c8757e70e5eed7470cda87f0e5ebd41276c005e9d395eed2803f9eff0ea0d9f3b02f0ea0c80573b0078d53477a8bf0e55cb53da108e57e78d573b1c5a43d4dfc6ab37fc3be6292d96f2ea4479b5bba16331ea9fc3ab377ac8535acb06afce1abcdad1d043353d44fd7dc7539a0a8757e70c5eed687666bc7ac3619e9240d2e532fe327875c6e0d54ec6ab260944fd3f874d18bc3a3b177c16e3d51bf088a7e4ca655e2d78f586c9f3aaa93b79b5f3ff23f386576767c3ab5d0d0fc6ab373cfab848e6fe2f5ebd6172f1aaa9a3e1d5ce04e70cafceaec5ab9d0c8fc5ab37280703863775100944b234fc4202500c363414e3d41486e8c80c5c2dd18e14294bc3331108442b916ac8e55a1aee4e4db915d81541403167c299589ab983031f574b265b1a6eba726aca8d86a609266baea6eae767696252900501f54eef2c0d37e5b616152f1f17152a4bc39a4a4ba21dd158da0a08e8d47403bac24c16e4c48948bae40f244cbea40fb398b5344da55c492672471e91ac2c806841558666321e96a6a9f419420cf6aa31346669e249245b1ac76265fc7d5b45b121d1da82fa14220b76699ac253530e8eb65322998ef9b3a217f5af29ba3f628189a9c111bd18877fbd81eee7d81bcacd0abb59c81f360908e8358f56d0f5f349e42f7a6d6c53c186a8ef6b46dd06ca5f4539a869e9a28ba31c7bd30f809da20abaf586962e3afe0a0dc0432821890a942851a2448912254a9428519224499224497676767676767676767676769224499224c9cf069cd08ef676febd4b93826efbf3e1eeeebd036fd6eef6e84d3150d8f0631cf0f739f6d5f68b7fc36778e963284d34a1fc3d99f9bdf207ba971d6205b240707b412a113a699da1f025fce5557f2898f99c5db76e82dfdd4eea48d2a1a53b771bc9612344a770f8fd1f8d82f12cd8ec3a93e9bf94b37434aaf37618a536451b3722ad94ba172fcac56091d132c344c3e505a6868d1b7f9aff946b61d402a9071728c948a36246de9ab3eb4c26a7d2f193e65e18e1706218270ee227cc2f1f1795ae72ab55a398e8140e1f7df6c69d73712e29a5fc5eca1929c34b29a58ce1a5c491de4b29a53cbd943732e6a59452b6f052da481b2fa594b2c64b9992ff524a296fbc9428e9f2524a2969bc9437489897524af9f252e6902d2fa59452c64b698334bd9452ca192f650d92e5a59452722f250df2d98994526a2f6ba494524a1c925912c64b29a59c414a29658f46915ebefc8f464a295f90b27b291f4af92c241da40b30c8e0dcd8a45037e4b0a1061a6a70cc40f3bdf0bd3023438618643e185e70218677fa8711d382cc939d642f6c8c6a6c36b61adbd63d7763db361b5b8d56c965a3b1e291ab5f817971a1416a7142866c9131323931e3a7a5c5b1486ec52357ab8d9de8a24cdbe08bc6174c88f3628860c080012569b6065bc2985a1735d825d9adfcacc02409899123389c7ce532d1b537cea329e9214fa75c266b2273e2b227b4f4b0f4d089c5813a327c854968e92192bd89e14b0f559d82ab155cad206b058f506994cc168b03796cbe3a17437b739ad229d86a09b5b2686901d4a8b76271e04fea6b9a76a8c4acd94982dc114900000293160000281010870322812ccaf350b70714000f6988406c5a349607a391284b71208410430400000001001000630064ec08009c97f867bd67fcb8afcf2ff66afd322deebe4f25f6bdde44dc7eaf67d465339db6b2040345e26573d436295ce1416a1b131287a426f3ed3f9b752b1eea6752d6933374976730fada0fa724ee278a7ecaffe7d6bc6911cfd53afd623a141d9432eff927cf212678b91e58399f5ec73a15de704b4744ad98cdfde47ea55954568db5fcf85a8d048ea6aa983d9a8d3893a1fccf29baf956312a5f1471e1bf2bcc608b0085e980730aa150737261ba9e95539167dd746b758a821c96fdb3e8f4ae58a9493e8e743ae5bbdd4a4d41c35b24be148d8fbff5b72e051c296a6076a3a540b1f5cfff244bdd4c76ec0e5075a51898a5e8a4a1bbf8a1bfab5240a2da81be3b526a88fd63434340e232fcb0b206943ca9a17b2c297746177eebef9a143052edc06c4b0ad4701496abc6ebfffb5f920a70ca002de88ecc3946aa7f80ffdfd019d036bbd727ecf8200aed87667cd421b1c9ad7eb29f1b665c577689cb6b72945672854662eb62a59133ea96a06a2950cc4ca7cb846551fae94541c384feab08a7d3e4d5565d95bcf590adaf089876f741bffb90a4f365362b9fca2b1ba79ac91d37e0cc8d5eb204eb344d6261e4c778bfd0867a32d24d9099f42752adb54804208401e71a5ed2044c1ab40553ce7a24194e0a24778be5a60a197130a6eb6d4b113b106d8541915f31a6d3316d561e7e3c7c149305b64ceba5bf40ea690de4c79f16de39cf6db304ffe725a64fa101de82eea21407f0f3f9b7a0085d085a991bb215c16c02a9792be5c53d884d6479719d13277daa649af298ea2f98391897e7fd273f00e2798f30e8bf450cfdfccf95f301e384e2d4dc606284736380de836ed7786cd5c7a5ea05c8cd30b3a7cbb052dc32e6f21b2c26635c6f80cf14637da411150346cf30017d0a8c09d4e6a473c6b8bab9e8f7d48c63f97763eb98e0d202bbd1af9fb9a8040df0630beb78f74a0be167727ed79cdeef7f3ac43bccd99de9ad17d004baf375a32161ad00ada99c094b97158aefe52a033a2077ffdbd873fd470d57e3ebc996845732eb35009f36e69299b25ded7dc26cb9e8654d0fa9ae4bd4b682c901da084a1ace9d8be8b8b1e6a8e2704dc0fab0dcf12d40a65720f6e6c8f21b88baefc05be4dc81a3c5831bceae53d7c06fb91bf76f803fc08e143c6ea3bb71f6907a873fd3901cb55728c405ced6f29428a40562c951286228b3a81faa54e6263c11c4792bad16ddfd4dc941add16a222719bc1a761a64837599d863edb2d83a46eec7da60de8d57a6a199c38877df5b6480f7e60ccfd5906a0782c6763b597ab376946b8506e09ef803d82d2201c8de4ee280bc63d080357840f00ba72438fdc8ef75d0e1239ebbc4d0c4569f0fcac5ed4ee490b898a2c9bf77d8f746480923a6058e19b83487efc067fd6dac1dd856d308aefd473444dfc6c2c7e0e5b6c8a927bb6c810dabfb48c1a4981b753277a8e805e7f5f69684ec2901f4e11241681cbd42759ebe3e6bf72cc2ff691f7528dac7bf91ac7f644371af8c0dcf06499aa51b4447b0dc1f4501f281f30aa379bf980f64f2b8038612451cef80c99a7243499ff3673e0dfa8bd0fc460f490b6a581acc28780b451bb19800abe6f15fcce1d8c298b8d5e7047332684a12d4ab8d51d66ed1c8c4378707b45ace6a4814136791d910d50f767adb029be359dc6292f3f7f8f1d1cef1644d9cda2c801ec675deb9c8bb285127f8b40a21bd1005fdbd8163192e200aa549ecc862420892ec0cd0df4fd9a4dc8126df90904f21eb7105b7361d99119a5d9225605781b099132fff5006890e39bd3ee3199bbf8343d25c7612fcec1853d1dda967ee927dedd5d1360434ae515798d0fc4276b4b9ac06399be057c43b551a9095b5ed3a02e92e31533d6832759e479f9d075c0f4dd683fba193d95bbe8c45f7520b46d4985e06119b89dda5a9a40efa2f78b7d4ca1281eec480ee6e14e5be5032b909543090e911ae4ad40fed928d4c4bacd365a49769114887f4b862b83692d4db9b8f0e2d8d3d3571c480fd02dd7b08d1e3deeaf334a46158d12f855c8584530b3d2d6e9beed98eb8235308c2e99c2838e446e755ac7d5fde8e85546679e638aa11c9302fc2d8bb3d88593582402632ccc643e711e118c9b4c13f43e61671533a44fdc099b6115d219ec124a9ae4840713570499ea21192a5beb2319f9dc25847dec0d57c000cfc65b9606c4469416ca45241ccc872416ce4f28958036ef5f65c546fa05b46bd3a7ef11d25ffd705ddff7b41e7fb5ed27f3f2ee8bfcf255a39748b6ff0f45aaeb70f38bf2d8f0a41c4fc38d17dc2e21379a1968f2ac6e3430089aa5a32c1a0a03f9b3a4a1778158f69240e58935893828059139f3738a61b1afbe360c3e6eb52160f3c75d82583fd1027d0376b46733116d31ab3bf2610f61701e6bc0803e100274b2633bbf238b3e607b8e93748a771f3267e13754478ecfc711c5b926ab8150716041ccd854242e1f8d971f3841e3fbb838f75942d6af7013acaa54d272d95632800f792d2105d09639d1f2b6483e9b01acce9cd040d3b3640a9313d023d43a2b0fa679bf4599ed8685efd7e2d91ca668e96794f390350c8dd02419b66d56b719fc6425eded7ecd1fdf6ec5910fd2c706817da51fd547bc3be2274f97b2662e36101714fed1213b88c606551a0a8acd90a053ccce480819a5884f5fb8a9d3888da4c88e0f73e8c7a0301e2c90196e5b3a843e7a572bb47c12ff269aa50e9a9e5ad9c8a4b63a5f29ec909038336104898a084a56914179b090e2d6d32e7a7587c62a9b778234cd40c27b5ea43024208e526e89864cd656f20297ac5a02da12bd6163ae4ece23aa9e3b91f8965d7dd1ca534168641d0ca721136d13ad1f9891390a1dae45d5f097054b3479a5bfc4a427a08ab6bfd7540129d6d9ada7daaef0b2d4d451d2772442abb81ff216864f080db0911199750c3016b82feec575aa18bbf8cd873c99293f21e43c2641a56cda561696a3a1666a561ad26b54b1a45eda1ea4a056dac89f4ac9a4bc392699aac40138774f9b3c8fa2e8db8cc6d107faeaff4c6e557278c71175dc0568df33405450fa9950f879b0377d2d86017a21b38e4fa8da50a88732e9c951cad7c5c986efd1df649a0a7d4c66df56dbd3e69337ef4d3918e32844bbfcc7b48a13cb014cfb60c7401732e9631c33aa79abd05b2874608830f309b4b3bdca92efa0e2d749d57da48ef8f7688f718d80eb4c883e96d4dd06d61d93ce7989959b7689ce3574bbc2f84b30d5be486f764a5125d6119fce71c9b4cdbe5c0f5a316ce0732a98d2dcc81796943b3cca16cfc3355cc6cd376c0f9570bfa5304dc8d59e7c0fd6ca38f1d95a922a9e1997ce775989b8802c673a6a0e050b9c7f8e70ea715f71af28cce67461acd009edce42a5059dbba58c2c9b88985b095742204b278b38d1221a37254627811cc20b0c30a07fa58e2768b95c9e2b6bf567196d5cab471b13eb6b8656dcfbca0bfa9a8ec34348304ac53f6ebd150c6e4bc6b4728ebe5404a5af3eec99db2637474dae173e7c729dfc521ba0e3a2f37c44a6897071a10a138cfa625fef30843f9a52fa68127f2255f22462924b655715be64f261c31e0e6014c2fc02f37677671a35d71fd401c65432ac7c03d33a062a3de6190476f43e44b5848b2c17a050d650d8119bfaeccf40e6d0a3ee5481c58718fd51cf4c30b28a11c42f66fc79c6c0d7ac5e8cecd0a2e83a15ef69d8fcd77344054275e93509687aa3c030f2eedc05d2648595eb7f0f90b18a1b36196c5bc0b30e1260f0b3900826eb56b323deb5e704ea63baebb0115ee1ea59fcc80b73844d094f0cf7047ab4f0332f56e8e208065afe7fe632eae2dc8d90b52c685f8cd82cc51378f1af483c4772ab3e9bdc600ff5cd05391d96827923e316b223abf67ad856feb5a2e68d7f0270d0da7947c21954c53cf36b15708ef587deb3e1961aec099b840d7d760dcd1feb6d06d2566d6ae8e5dba50e675964597055a95d05d22ddc3318fa6dd7111a7e646f5e8e52483b360ffece77fc9c0b39ff3beef538f6f00839ae3cf6d9a6cb2be6d0b934bb8a26bfec45cd7bbad6374915658cd9f98eb7ab775dc2828d2005b819fc613213b55dc37c0e457fd52859514af1d3586026e81dfa513c56ae4e1efd0c12df0bb74a2582d280e59b02b996e530fb874eac52339bc32844f82e3c652dfb297e782ddaf80b30dd243ea353a1a70a51f181f96d59664949ae819f28a01ee9d03c57d2ada5cd91fdb80eb404e8297f38196ddebfce5cd969b66b810ef864188b83d8841c108070e5e26bed94a0be52bcfa55f47ed9ec7be9ec9947b14712f7f78570786c2e8e935e7906dfe6715fa08b0d022dcbcddeb0239cfb4a766cf5279884a8c8f3c2e68a63672c57f14faa4401b01bf5f3a11aadc5f9208826e86d5f716ca828330e4e9c778b8eda852f2a9f09441727355ee084246933f7bf7efb8da572fdfc2d5201d6992212a616ec498649f08267690bfb6d4e79eee80ae5ff9a50d3a6a06b20fba31a1d5025ce28e6313ba86591830df661cf0d4a407d4ecd314cf070c206361f304f66dff2ac25b40e380f0f57d4e86934f66743c2187d60dc34a93b07ec93e1dea1070032681aaa13a28bedba481b4448911a69af418ba5baa089983b5e80c1bf822b5b6d92050a2e8f46f8d1acf96e3c46c36ba638d866e42f3517b72a027c45a4a30d21aa1ef79fbc228c20ebab413f3b89ef1793f97a5ca85ce9945832bccb8eaebf28ef0ce8f28075e5e7f93156e8d9e95f6f2e584f67feefb02a0aaa7c39d6be586581fb7114cb04f37d31e78c521504cd08bd02fcf7e7349cbbade47e34e4e92039e1d037a24c1f96c663d64cbd0d98d6526c2035895cff0386ee19cc65f740f02b4d9ae0e86458f8a6b06ea41aebddcd8643485bc8a7da64f406ebfd61816ae6b9c065f4a7d2d53d918cad7037a3645c3179565a833bebdba4c7f303b8b144c5888ce313c85c07d965b0bfc56375138074187a2bbc0291f40fe714265b3006d21f79aee0f251d790b7d54bec15233e544a6233943baca15656e15716ae0f1f38d89a4957d35b37dba06dad94684ef0f2af3ac1f4ec6123d83db48256fac6010ea8836b69d5b022357e8056c8c213ac4a759e8cf9cc7680731de0824dfb1b2846b5be1dd573bbca0b31a8403d475f7fcb4939ef1c48bf9a33f78895d92bba15bd82b954bd5b153ccac7da81d0d91c7fcd8766f98da96e50d3605b3f64eb3f75b8efedc2f5fcdd7d905e00c51132066a2a8f4fd8b5b3a73b49349504586cc8089ac17baa5b4761d923f58a51b20a3f10af2064b6a354d45a8e88a13c3851b6c0b7f3ca3879aa56a9c4e2fdffcb7188b6910b0666a3c01c85ac960bebffc66916e5a34df83e171a46063541a9db0e5521ab076c0e48b60ad16a13b90934fa9c718990d37c889b83bdd8c1a3fe39d03688bb62f5a875d1356fd6ec96f7e83181b4c0dcee9d75b8f2c0db0df167bffdec765aa382d38b87465a9b66717593aa2325c77a7957a10818348284162be0cac4a5573a7a320b129e290e82b8c84b83901920d704979651999fde1d851704f83590813cad334ac9f6e6cf1d1b33a9dc6bdfbc46013031a31cd65611602c4577ffe254d278606fde836e30904b6ea76f4de1f4b4286c5c44ef39eb0cc4c2cb0f76bc05a6ba1f1c2d4d434951b186252d3b43a687c87c413b4a5082f24ff9d4899fef667fcb90162dcff68aa3bbb713963e2fb62fd3b9c642ccddf374cb5279a5d27cb5c84658f3a8ca662d60de8a68d01c961f18829bdf89acd14c16c273e09e0cf9b43cc64933dba0c6289886e815cae26c3eda7da8b17dd8dff73040c108e2928ecfaa49471f5d36f7d92a7c2af6c12c371dce54ecb39111f1c377f0f2cc3c2d1d90dc0ccf291ec091a8ecb2232abc29888f798864542befa41a7ba7038ba28360274cd360dd2228a8f063b8a1a9e6ec625344901715e2c45edc22f89708e443e04b6be2370149a1705bc3eec20a592ca25d39ddefe1e88fb926444ece00024952240d789e8c5a448e3ec30120aac783dee1dedf5834bea898f82e3b8e58cf48cc9ed354394ec90082efbb1fc3f174f57591b2a9a1bbe8a12bf97ee13c5b7e9a63c3e0a9db2d7991b5698c5bc93293e1c9ed68488341f6daef684b38b549483891cf391feb36a5bdca467adf90a115ef1d8dd7738f573db0d93c1556930afebf197b6ed6974b5100c165de4dd9f966b4c5e9e31cbced41b6bba188757e01e0c354f42a9b23e31aa5222722fcea7ba5ecd6a63b05fbe026cbd8c201ab3bf009d18d7c9ab4e758d050b87109c8c4c2ff6f2885e243470717b7ed3e52121ddaec10c1f7a5a611cad184185838fe3e3a896a8011d7c6438946a899a83530b9babcb9c29638582aeb53f1b743d709fde074666b3b391a75f7eb6a2aa47517f3c59f0b3428faae673ff693bbe2ae9cedb98d1ffb6d954dd1a7240d510b03a0df7e4853dfb9833c77fba4c238b9855276da04977582e679ae2d8f07ccb5f7453e2cb1919bca2823d05a6967fb22e67505e5031eaffe8f81b97e2c8e19ed657aa233cc20cc6d9310b5dc47dcea5b7102d1595a516c02a52518f04f2548d82f451d6f1ca4dcf472859dea19b93473a1a8b851bd7771f9e808075ed5046218c2dd72b549ef5a0243a31f77f44eb34b4544e6e14a1ee29f5658be13be37062e3462b97e38cbcf72781de228ce52f8509d9ed60e26ec9e3d4ac1085c367ab8eb4c049c26e2a07011087c73310c3bf27479e1ee2d9fc9a4447ad8b9c4a45895eab8ae7f8f19040e2cde2751d9fc92830ce57c34a92f74540017491659ca8930f92f145b748cb6f6d94f5748d4e97ff3b44620b4b8f4aee410922dc326799f4e63d9df983671b65e3a0ce431480d35e400456814262bf61cf99007cc1b9868ca00354a0da2e9e81469f7d2ba2d55d843a670a7ba7b49e73472d875373d9b972e94cbb030e2f54aa35ad649f8f283df9fd6f23e294bc0174290baa09c02925fe46d01380d7288134890f23ae9525346bfa7fa6f99866444809c38301733841df5896959678de1ae3f44d47004d320994727ef045070f3c044424e35d4a2fd7b849f66794c1dee9ce04655a82f8c24ef4ec4ab62c08cc6925c80badf2eeac2ceb45f06ef983a18d8034ba1dc724672c7af4587e75545337023881ca735585861dec978d219d695b75c271bcc402691b9b4824936eb5d35f7a0b87b3c67bf92a8cd1dbe63e23930b30359f1b6c7bf468105cb9d83bda0f066bdf4f8df39bd8789e03a0c9d720ec28892c7effb828d11ca08516c2dac8fc85f821bce32c6d5418fec0d54a835bebbcc02e6bf589d39bf801ace6d461e46ff203a574f3a85ef475b6e15232fab39f9ba3d20d3d4b78af4abba7c180b8d3b39c4ff3283363e060ecdc16a4f130795d3c39295157ef315ed0a04a1d0b4882be861cd9d00eb8f6df74cd8078d5e41ce5994ea7604a6c0105392b9d780cc91a197a605317041caa1e0a2fd062402c9d0b478107aed0e737f3b817b64842662e2c1fe5f3d39b8d425a84d4009c9caf3f4ecb3d179e2d06d121f1cf7e71bf5e3c40e7d70fb9d8a634b35a6cad820d3355ed779f4b19d7b7376cbf68ad628b2163770de20617c7f0b1691894b4be79e8c7c379fbddb6b9a910e8f742d74d8b7d1b21117506821176f0389111a9fe595537fd826228607002b362c0c2575b1129fdca3b20d416765812839a1e1aed5844e2c5ad6240b09feb9e7eb3221f8b7b5708d39229070f7f5f0d452f5b6a12e753a3145ab4f508c1f41039c4173c18b39cd831348499a2d30567347810f05653522514bc8f757a35038ff67164f1dc962ebf141589515e4831f663d628f22536edd56e4f122ec880e3a2613728a7ed7f01de21283626bae357f8f8b4a415ba8f6345a788c3bd7842da5dc53639d3acea5501a989d89dfcc09eac952aa4c7b995d5f3fe2fb1762cd207884f4b1a14ca6cfc8d2cc40ea3fbd9d5d143d29a082886dee2c30c39c785b2e08500f31be99232009226e02b88112c28f417d7b0c2e17d0a81f3e2ebf13d1ab451b2fdf2c322bac41b6388bc822f4c83ac4572e67dd770dce56bbf7e2c3ac5c1570699a039eef63ceb31bfe0deffe5679af4741b39e4433c261545d6c940e8c21412baa0f86a7f4d86fb7593e81ebea99d4516c49b9bc6e47d7d91cd126abd5ee4276bd813c402d20c07e5e5d68674afc9ae8e79865787a97bb93668614fc4e4211b8b734fd6a99cdff659e612f29f370208dd01607e7de760c5dceadeb8d00d0d1b86420111d78884c03fcee9ce8f09797da8674ce504e1f9bdea79b65647e4fa3a6ffe4600351db14b426b40ad1a17d483e1ab35be02d23ab58eec7f1aa6f47bdc90de2bb9d0f9f316fdf676800d2a077f6c8cbe6129f02710797ec9e90eb73bac7ba2792d8142d40174f362fe6a8b7e72884e2f60ad01ae627f9340809695d250eae4fc6fb0e2518a5165899983f0f234483317fe8d5abfc361d18ba83b064d89261e5a9f85d88f16bda043a2d8ac7402330a4cc0652f95a6bd2580e12aa1d225aa421005cbadd6938f935a0f282077e2db8cc133a2ea00fe31e530d4cc0731d3497b18dc0a05b26221e53c66e984ce1687c8d820505ad309a698d82a0bbae923067a3958d2970710fa39c00dc9ab94cc1f20f4f32f089de90b4b2f6ce74f5c10b4191708facc7541dfb7e7554aa70f50bae99785dea5cccfb820e833a70afaef6f2a74a72f2abda6fa2f0bc8ea355795d541753387e761f5cbb0fa076ff08bdd08c183ae6ebdd749733b46cb600383b4f51defa5a1b7f0cd65d57d9d526c0c2fbe9ad2c6d2f8bdba3b521f7e2097f678d44515ceb0518447e71363047477b12ba1a7fd1edb9cf05878273a88829e6eec1aa2b085f8464015721179ec4ec348d0831673a33d995a9e375b772b857379e6a5ecf71d6a21527c0e6eb0752ccc1e81e08ad0da2ae1ab8d4c608746ee9b6615dd204617be852391359eddcf627625d68974abd896f7afa1bb7224025684dd0d1482917207bdddc855ce4e5eac9601145684f12824924157f309583d0ea060fdfe0edbeea111684d9ddfc6d97b54f4587b9a57d52389a9a04a579242ba6a426560a92851de30cefc6926ae2047963ed1de0e01f0673b9f9dc140364307daa2774c7f5508d2b94005d5475b0cde542c00a6ad7a4fab12c6bd1c02c149f0a739f23c66725f2ff6b2e9f486526c4439249c414174dabd807ec8cecb16c83e4307c1c72e6e1db82c15853151e1ce7defd62563a8da59f2ec333f4fa7970a0bbad05c98a6b3b401f0aaa6db83c58bf933a880ccffb554817e5aa8467889b7ae598fea232e81a9169954c1ad79ccb2e820886c6a6cf4fcf305c1658ddac6379f80b68a87e5c3432a993b2072afd54651ca44ead745af6383e6479a68b7b24f83784ae013f13d874e6b77c5549b3841d026cb1d78af20fdefade6d8f43c9edcb53bf2ca70b6f6358fea531769aed84f1b95696d708e9a59b509d25ad9792ea8b073fea762aaac6dc1c1ff72d4506f0de41aa16a185ceda5f48d19424b94896eaf6fae11adfc39e7159c688141edc6864f6cc537c76daf8e602eba54152f9b048f041ff486a1587392ab97c0b37030d8abf0d4ceb7fe6fc0dc6bdcd8b8dff3ce7564a873dc7671584311f1f775c6423524658f264acb64bb73ba12ec1c09441d3f309cb9d832663c1de50b7022a4a3483f94d52db2804a423596fdfb604dcb64853bc917c237fa62e70d0a5818c07a4ff4449c5edaf8cf8a26e1f885422109990c20be23a1fa895c38258758805f7928725d3c4d69f7bc5b3f65a2669de1da996b01ad28716f8ff7eacaa4d673e320fe3626ddbe9bb5a086476043a730301521591dbc19c96e8f91f88a3c92467058be4479bc3050d89f30e89ea4aa7911dd0bd4e720f2d38543be2e1c823c14e6d317d832db1496ea43b58efac1194901efb914a662a873614b61db8c28fc397a13a4e948fc0b2ed64a45662cc689197a3b33474eaaab6efffbf5838cc8b879c914536f6c50aa42c01805a20bcf0fb9e9ac96f7d21b8a38b64098b874fb7db93a3a05501601ab4cb6b072fb62c8d5c317cb435eca0c00cfba1c6bd4b92ad31e051d71acb8d664146362a10063fd3f3e68b79357a3cfc67e4da78e995c38d91205aecc33a8796982394311be1fee38a97380b0a21f4d583d600962ce244fa83693bca154a89c6ba61031dab65104c1c01c891c7db96e7b77488edf703d1ae241aa8c1817777326c83e6be99629bc1df8235d881a3f1088855640add9df7550005aa94e57470c36ed749e92873fed8b75d9cff309dfe2e82a3f196cb69c9d128ec95f4dc225e8c467150ac12c5fac8b5b0a13fec98f28146cddd7a3a8a3412da8a81dbe600571d2870b90059b90cdec9ee13d1ec93d382d22c839cc2ce30755a4abbdeb90da50e8b9624f6fde99e33143e4795c59de84bc41b7eeb1bb26b1ad06761cab308e06976c00da1ad157ea9c58efc3e1737f98a0ba1ebcba7b266c61bf7428b44294349d2e73544f14b4ff478a681a50263db81c476ad9f045aa016ba62b569ba8dec23e56e03e39d6e555a8a6aa1ad218aed8ececebc98ac47ec1176d6299491028d1b1618c141d41f6d049e4e667d8a9a943b409652dc237e2d6bd01bc67648ec1a5c89d3aad225b34578bc00694b05ba839f9f82ac69dc64987bfc34ee16545e9283e69cf1ecdd52a7b505bfbd8ad85bc6b5956839065c8f90094020112cfc017cc577e7506748b8a389f1f1ef77082028f1d4082b00fd8808c398c553a6f7868e3e069c4a923c8d3e3c62aa894b5bc3d2dc93d2057e0417f4f83d7329806caf74e3178afff69105d2da188b7ae7753fdd6f538e84831616501b843f8160ad909438ba2fcc1f3250719222635788065939ab4db64ede759c9c082a1f2d63b11355df7f0f515466a45d2083428959f05a8fc83327f43fe60b8c2f2d3d9c8e59cbf9c4b30ed923f6e73fc72d72d4965cf57f745f9ea613a1e894eb788660367c00a6e83ae313165d37704ddffe83c64d5329a09384ba24fb96861106af0c780a18f9c619188d2c00b6f5c61ff7f71554f6e97624dc72301e5e2830a22d08298ad280cf278d3902ddb668c71b1dd4b659e418a59aab1a1209f62193730fa7c287531a9ef6a2c91b3c75630144efc14f69d579e397128a8a6e8c934c10015feeab555e6096466f4143f1a2f0a1db1e798e054ac1797a7369772d65516f622fe8b10a1bcfc0ab92a766ffc094337fd50d08406513e7cbeb9f7a6fe3713500636a4206fd10cf1121cd26d0354007752cb6994a0dbb9b78ca5afd6ab6aeae62a8ce245c398f44badd4bc00212f1f5afa3a91d441f287a5077d2b8defdb3a72fc7d182911827e49271bef95fcccf20d0deaec1ea691fa2a4b8bdebab10c2488b9190628552f34a0966c3066493923fdb18d53742502d0dbcf4cf768dc173065651bf96a777c1de86f9a0a46d86a61c2e5ceb10375d5315474a0283e60aac633cc6948b98a6781caa0cdd94256a2a95e1a0a2af1bcedc878ce15637fd37795acc81b476016b635aa4574475b70c5068799f077b9f4092e7776cd319753462ec248656c24bca34fe75056b54d9b78655086e4b9bf0ce8ffd04aa27972ab7145398a6dd399a2ff3451a94bdaed499d3999055ad5e814355887a1aa884abbdb9f6256e3758ced1caf1df3e777c1e773cad34c0870fbd4c8a7b8cc0df65d14268cbf960c462a38a81339bff1c63934eac839762aef34022c8772f67268d457e631e6f380039b1255edde957635506cb90f305c999a00f81cbba61eafcdbbd355ea313e187e436768436ddf8000d6b583ee22be3fd5c8a9070b488939242a9b1dd8c829151904103d3a45701810558f8d7696c1beebf2f62105eda85a47ea1ea41ee38d14112e0456fccf961985d8ba7f9a5c4123ac30bdba889a034287a804a7dd0dd078671bc1cb40662a4a646798dd467380799cdfbf4b03a78aefee23d434a1dfa62315f12cba5d1dfe9e3bd5cd84f3789a3a2267345b300c3d9f0c0568a7e5f74f28f90c15ce8e23b7eaddf4a0ae22d306605dea7f01b5a05dd82d08d69d24af43d63c89480737138e83756ddfa949e795aead86fc02ebac52439d86c366d4a261bed684c0f94ff4c7edf6f7c715348e768e51e81987bdb3e6398a694f61569063c0e5d4b403385aaea1f12be45a65ea41ca12597c6e4976db33d04c49e4e5f089ca1c94258b1c4cc0ea26614099ac0b186eeefa2e8c220977e55f1a5f5813828fc245377d1eb91372720bf08e5e73569fc3254a3e60de0ca493a82cd2187b7fd6c180eba493e5bf8a42e236248679f8fcfe95162e2b303e0ed0b33e9d5fb3650741bf7817f167c6e20cb74274b820bf251a77b74254f5d95f6ea120e72915a2a72b83d5d8a442fc4d214b2d46bd429ec0993626887d41440b1e3f54abd67d5efb47ecc0f41ef14494d5fa73017e3fb568bd534c4bfebed50a3c4a8b1b2fbd8da97602150296b60b1b497acae81a5b74ccf8047c72ab236d8e1c1348e255a1cc02dda55eaea10ae7048b46d8c558170d59a995e5f87a38b71efdced21f510b6ed87d90fdf0f840632e029352d2d94f5bc4aa90e14c813ad480d9eefc4486008511c816036eecab2fd6a769f988dbd97735a07dc439df40decc1648e228c7fdb9b3daafe4bb739bacddef19934f1e568ad258665a021017446d4e3399890d60a988b60ce46ed94e62c450730598aac47f15d52be3ce77b3749c34ce021342ef81273a1955c41acd5a5443131a18492fd1ff0762739a2ea3dce9d632445a79257de2b23904c8d448098d22c2b50369822d443a938c57cbb170419f63699950a739a6c4e345d148c12da9d59ffd08dde072b9d11ddf2385ffa522ad7aac68900503b55681010b9b19c23e2b98313b38e91b382f8c421439919cec059653dc85aa4259ee9cdcc50d0b43854e8a27b2ab343fd1578f91da6b7c7bcfc87712026d18f4e14470ecf6daabc5e49364504dc9768d7762fb72100784736ccb9181cf66d29fc9605fae0ddee7277bf972ccfac1741ac4e97b5a554b9de3ca3028ff1e753aa3602046ebea01c3163dcef92a27ff8753c6f3f862964e342c349a4976c4731ec595be7d03ed20addbba14b4f5ceff96371af400dfac4d8549a50001c9466b9edce8cd11a668f83019c1b6613363f031c1c15641f35055be4067840873d555c92db878374492c0b041f0ef5cbf1024407a394c19cc341c2be32b38ea605933addde716aaa4e4ff4540b76258085bba20db151ce11aa5a9414c2e5db70c4861ec8aaaf28924564a1c195bb48d5fb4440d591463a9a6a085a951287e5279f7282dc9d5d578d9a87ec0b4efb6bda45e55f42c4cf4e4a2be6c81cceea7a272db3615a0a2b6eade96f6a763472f74138ee226ae66b526f994680f1c122bf3314b8290e19c95be58e92b370d951f944503c69e31c0cfa713c51d6092b983fc705f2761d99759e16d95f6ae92445d8915390184e703b4aa36156e2b16f40572670f7a79a8f8948408fff1f86d5d212fb72534c315cb9e1612c0afd9df9d0146f612a9ac01f9d725e46121b4df22342bdf7a2a60795c0851d7e0636a951568805d87e02847cec77a1bb4f17f7137b5415b6edd91d84bab4db260a6596403afb6cf44c24f7e7ff1f7f6f8793aa8b7ccbde7fd4b9c7dece32b9877116243d8a3fec6e7023f29efc278f8c200687c09fbb6d8ba8f92954435847e1d83d722b8c711e3d57d66b460730ac5e4ccfec33a44ee185840e03d4cc338032ad9694d5b443249049980987640ecab768e47de92cace4830d186edc19d951701977eedee56fb610b85efc6f6a578d822e863a3309a84874b2e5f6ba74a8b14ac6f642cab6ca985367b3f7ff44633ccf6a1fd9f934e5c8e933b3dbdfe069d57b614de0548ce8573f571454d08202c58b532c2016fc8ed2992d58f58138947b87004a9de4af61284bfce5ed25a69c02802ca7f42280ebc7df8861eca3567a0366e1f08dd5c4add8cddf0cb298d631023ec6fe28234b035411054038747277ede7a8fc6d3d183e20d20c42d8a0e27eab284b81a0f7c7ec49e80166434d39b42ba9f35f61ffb02cda2bca3b96c38197b722acdbc8ff9507269ccaec507f1441150fe27e7000047c51e1db7985b29806bf256fdd5c2c5d05e8f6019516e3e8370c4715b1cb9e998206c5a5efe29193d4bb3e14a5385315ad880664b47a18d5428388a1df7ac8c69a58ffe1f5bba9feec831784eab9d0af80c42d944f7af308bdc08890e9f2566c76b7d77dda4f603007002f403993a1bb1bb9f1047338bed713459881f3fef5e46542617a27b8b4d0bd0356288286386570c3ab2aacf120ff754f8dd5700b52125a70bcd2ea454b63a8601af863b4e4b16f9494a13b3db36b19f14afb4f48c3a654b94d6b8cb794c99ea6d7aaa7ecc362135352e85704dd06d6605c12f746e0b0ed4d33c72024f93f56360058dd31c691ef3970923bcbfd0d4a7febcaf5553057e342fe8009430b4cea4980b3ccb09da5e28244360cbc50db8924475ffa5907b84ec80d8f59cb6f5d886d6106d758ae3f1e1075f2f8a01a3d3c7475019d91260583b678d0b7e82c994dd1c3b10dce7e2e8c5a57aabdb1c447404233efc8823635f2230603bc2507a6215894b0fedc7ef596d4eb9bf91d8f75601ced35a05118a2e074c33e47cac11255c27f2bd1894a8bd48ff77ccf7b0f3794bd62d4dee8ac5ffe419d03a26085f2842b77d743bada68885811cbe52387f4ee5cf8bc9abd084c3d0d47aaec68b196641f4ae212b8cfe4740c6f89411fdd39f28cd9383a16e1159f75447bd54e39a9db6244e380ed4956b281861fe6f1e276ea9022efdc84ed14f82392dd1def735a33cdcf399042e2c64e6e60b3b457e12ccfc0ad103b1ec1faff715331b64984c756abf5c60fa794b323a5a7a2a60ac9df679db751a6b695ecabf4344f79a3a54d1db16e6c29eb340113cf066bf82965dd1635b47784f96b7ad4d701c92755a523b3c449f1fb7e818f2653a6d30b5a5d10a7b5cab347bcb1c7765c8069f85bc8ffac285069a47f00b0228c3878da3819df1b0f80f912eb6c83fac4eb35a5ee7dbb10eb706b4c233d39a12f9a4e5eb90fab295df58149e0cff777708f1a73a355d1d77008f25f5cf2e7aa078fd2e0bb98db028b140b588af6db58cb82facd01653becf4dc1a2345508894b63af99b20817b1624757c2d5cac86638bc62ba4f2e5ac7dc83796b2e01859f815dadca7609798d3903028f40c7dd0679db2c033e235a61aed3bc6516a08aaa795a4535c44592bbe613d06c108160257715e5cc6902ccc148a32c6c3091f71109e7ca12023ff20a3ba31027c235681960294d02e76591d3262067a38056d74a91a6dd2dd421750ce91a8a7d284e0b87bf8f4b347a998888e28613ff8c4e2b68c9728812924ee805c3ae095b4502b0ed6f4d823cb0377f1f56a8814f1070fa2fb36455560eca1a24429e58fb6e6b8920cb90dd14668cdca2cf6744a156d37d7cb397d6cc0eabd98fa51028afe4d4885a80d5da24aec3c86d4e47479ce6d3543be6981ca152db87ca01693ce6dcddfab9e7cc3276ebc933f0df6dd6cc11cb501548e8a803cd444eba28cc98824472314336bf4164cfe5b924acf3787e848d5ce4b20b6fef831dab2fed39cafd7bd06a8742ea682ea469320793cfd82831991902d49054437d536ee383cd7d596039d68d3be29b977f0b42f040ce878dfa621b10d5c4a794c2f9b8907ce4b298abc78174311d2855c974c05ebcd4bb72b15c4c229cb5e1169394b8d95e92d2508f46d8dac8dc792b9430866bd9406fd53b8615c694ed038ec503462fe6b3f35bc99cc67ed19d6e6f847116cf8ac8255378dc84d10660ca7ac08a8ce29239a478075fc95406fb567a6d50c3a05eb3299e68db9b79c99e5d0896b7c2fbd39e714f69669d3d11b5706830df1ea84467e7a7c56ea606633e7336cde7a8a0df5f51470cecb464b468d379922b9b3bf20804010f0eb16c057c34274daf0bb11e61d90354ed8b53ec52ffeef134338b4d620da4f8fc8a4c9aeff23eb4e94145884c89a040ffc8ad941b32fc9afc04d185a0211b82d1698199ebfca75c91f8efacf55a2a31e8109444204db9dc95955646949675223b958347f77187d2110f5936d6801c3fd8b0fb383658f5fdd3b086af3ca9aa3eab83e3c128ba071c6be808987d9ee320c62c4d6a1e30e7e5c0fee0461115922916dc27c1ee785b201e2f768c6ae7a416f27ab9abda7f6ce09a2de588d192e33f524e1e6c34d31f6b989bb0ca25924615699e2930be9a36f46813cf6f631e9419e83f314e426324eca98e827a9cc43cb516e67971325aed79214223c39bb66de1ecb42c45967305931db255ead6b1e8c9611d652b978b71039c1a97831cc96d0e06d6d58da26afaf85564809d02b60cb3860facfb0dd046a1ed382c182fb4803e6074b544d684caa389006093d54c1838836f74b6194b05c23cc3a3309ec3d2ab2051b2d28ecf7df2c5f44ae8d989b458c662545ee4859c52447cda30bb0e335da72174510fd18114615cfe7d91eb009c164a5797519583284270a130b2bd71920ad14d55c391fe137297cf0e9ab58e8441fc1686f676aa891c0d3f155d59b7be77e5e99575fec8630c22d9e01da811522226b69fa5b95950899cc3aeb7623b69c98b98f895dd45577f1adfb4189afb9638dab7111b336436ad93382a4324146f5965a7329497a8c7a63d0468d86edf178222b1d187583903da2f0ca0177dde995ac82d921565496b886bd862aa413cf065ee5b0c20e9330237f57589b07f8d1ec2d7199a6b9eeea188dd5c00af3fb3882b900bebabf2d74ce7dfb82dfa69b3aceb024266b3d9e455154fb93851a7f2441a9cec5b7f248ddaa7f5c833a40edd9135aa7be5b4094a77122b344a4c8ff00fbe940724f4ea856d53ec1c840f00fd260f651e51f6324e01aa48cc449a6a086dbdde41d23bd22615cae0d76331cdb0171f130aefa380cab27d68934379648d1f3c99dee7f5db1ca947429ba2856b92b90d46aa4c52f3c2fb8e62ea762f5ef1204ceb1e7783dd1d112100a7faa9416c0df9b6dbe88f9ba2fd66529cdbfaf79aafdfa0f18a0a0e10d6ba657c078e93696e0f07562ea4e834f6098e99cef93845ac54ebdc5f6a6d07f1221e64c133ccc81d5ce740e6b480e9600eabac753c09d0093a6ba9e4cdf1f087b383e14784dacb27add7319b13a81239af43ea53f7e42e4d4944e40a0141d03759bfd3b1b9baf102cfa040d88728268b888cd146f753a874ca94816c9c9ad20c2a11dac66a7c0132e124b2af3e855089ea6420d2de00da5391f4b623654e1ea4568026f1ef1e2350d53f3e166135effcc3bcf11a59d097f326365e503925c8ce1058fd5f4202a2e8274f105434d15d92c2a13e743daa466240a5826e0cab3d2a26fd085571c87fd7224748ef04886d18733f4df0a49c0cb2a622d997553a60dff58d9614ec4518ae083cb891603c1b788e26bf9537ef583ff94c85690d9e13e95a762e908e603f6b5c877062291c758bda01d886231204923f493408da7cc48de8e24764fb7aa60aaf616254db821050feb4a6f1fef787fff250eb0cc2b47ab559f18bd8b687b208c8dd253c2fad06d5db38220ea825c08f9c601ee4bbdbdc7920157629e9adfb744d3a83342ce804a65a5be8aac45811b08870a4af964b690fb14aa72a36d819ec843c2f6201a78b25810b36458ce8f920b22653764a440f5c1af70bfe0f056e7e2e5966ede202cc7d675b6be4e181694ebaa7d7ca46513c48a99e77766fc14f103e9a05c6a5f515fbb39ac28846b810bdc9a1235cee71402c4007f65098aed376700f1f2f6fcc9291b8a9ac47e3e2a856912432002de121fb14cc8347a27cf580f83ea30ed2e212aea2090af6db7c92220fbcb59f4450ef39e1a816df2d2081bd90f38868e28c11fe57ded45d6f653a2313bce8682c574ff72da1683875c2940b6bae314f542e18167e350bb0227d2841ee9a60c8e364da4e4d375240caf7d9fbec4dc56d993fd0636285a64d326f378c3e9a78b902ee887be62f1c6840d987b492621ae633022aa2b446a62d5a47fac5cbf4956a4ab2b68d18f5057f227a8e5ea8b06eb36f5325677e1256169da05dbdd0120ee42f52571b15eaedfb0ce6dcaf1a0b4a85ad7ee920e35b0ba63816454bec83738d33aac9d15ee31cbbc68c56767e2f02879a2dbdfc2247d027833384743497b472c875a559087b48310d1cf13afbb7c435b61ed95c8298e47d10213d028ee49d5bdc0ff8466ce650cbba7c4b58014f5dab61bd782b24021954b5ca4da358c5c14f37fc9b9b5be7f5b2b46553bd0855e3748514de235d61bbd49b65a3786271cc6cb7b80002c15c0551f3527e2ab35cec7f6cb4d6a26a99ae6cecff94580a62efdf80de205ce007dadcde721b4bb2022687c00ba72edfcb6cb47d5ecb3a11a77634a2cece0f5ca2b82763f30d122170341b18c576743ca0dad2e43ed81c1d1b49f1895a5968fc931e50af98443e759069b5ade4ba11a1a15910c9b426225769d7ea93e613ffa5bab753ddd5abb1ab670b345088ae0bb525b972f146e800c19f5e221466f61e8309bfee0e35280289153fb5bc3a1bc8e34d3da58495347f41e302aaa9427c2cd0affcc5c95891b4a5e4b613c985983d882ae619507622da5891eb00c60ba6a36b51c481a69262a20004742cd3562f71d91b8f4eefee9d03b8f00200fd2aa9520c08b5d3121bdf66b60b4c5524c325612ba33899c3f537d5c4c638474c3961d4ddc8f5ace87707be898b19cadf709e79b33a80524be1aa4bd46a762060470856c39ab04ce10454f10b9f38fdb64f97a4c8941245c9f79f3f8ba716a084f3bca51c0f15df12813f1450ad9ab7a2d24c5cb6737c6b78dd0f5ace88639a17033d6a39f4d7840e107041b9eaa1c59622995a66b545f2281e28afcac6e4f82ab671bcf79786c4df00b88d2721effb1ee03b785ec839771e11f763b40daa3cd034f3c3f60b0a8f5d3eba6347be4cd750f012a9562bc34ca7032320d91bd439e0f0b89373ed2fcd8402e0687380952d038f879d90d38c31e97028309d3eaa5bba256550912c70a342eb6bbb050d6f23f0904139f8329cd82b490ec44f5fc863d1f72bce93c75d00b9ff8df53e3b79d4e19a80b54d52d2325b18feedc98cfd422ec312afe2a20e7c5aeaffdbe265f68b4cb3ac08119eaff434d9c42c5b165f3af8ccbff0edc592a4416a9aceb81a7386a20f4b9125e4ba6012167e2ca2b71ba3a7b8431d7b84ea1bd4928eb5a8ee177a58e21ed24f6c8a9c0804d7e78d66b8aaa72e53d5576924fea007e83e15821e83817a27f61b261ce853fde807c658afab9b1fc2bbbc885726ad6bf25aad8b9638d0328849c617906ebff428cd994fb1d28a44040a2847c6fb5aafae8aab84456f15210fbc96ac5483612b2d8a367504b7ffd93cb787623ba8a2b78596187cc79bc30b34606242079c7819e8a733afac8ec028b7780a49fb10430bd1484844fcd5320ec86938ee8cd53b89042b0b9cbb05388dea19b7fc0ffbf9a1e0c0c603d90bb365c0ede03122767b064c6d450b4f797f4b2b82da4c26eb826b6fe88ff7c86fe43738ee413dadc9a2c98aa419051718d64a92dd97c18340a6808ae603629ab95e66c47fea265f40515754176bc98b82f0d44c27ad55673ac9a46e861fa15ab2207733be81fc7b494185e09028bbb13cefdeb0ae750d86822f50218b5e5e87e18236790ae8aca2081220d5604d8d48df2df2cd0a6c2658c40083bb6fb6fcc756c1c39eead90d817015e5959f63cbca48b3cb7cdbec34e8383e754ffea5bb1c3d791c7b59c526e01d035ac567902626313207a90e11384bb29364de9ff9392eed8d5cb46ad13ac57d600e0821cd2a4d352960f44b144dace12877890f9d378c931104c5506363ebae3a95a34793feab55d61bb99ae6254476ed12b5c45c44251cf7a9dccee5aac7b8de00569f5693247a13a90cf9ff566a9fcf24f074a727bb5ff5e256566fe740bf8ca0cb08ff66a70152d5ab9b5cd1ec314ca959a58d3f9347aa7bb390aacfa34ecedfa98a62ecafb74622846af1c5d2a108c14b6011e5afc9c92856ff80b72aec824d664315a2f2dd64f4a83f90e8b0eb2ce16e4003034cc0de2fb08c94eb03f742ef5cec00050dd07b4af3e84cc65fa5c5fa6db6bf250b0e1aa28de36b0b5d5e4e5f5a860a6daca8d1c6950d79a3697fe728f1fda33861dca898af6faa6bff703b392ef789c9fc902816ecaa5f5baf11c925bdff19875d2ea98045b20b7fcc95d7cf04ed638899aa3e66bfb00d038624abc86e1041f18b966f6f0168f51b1aa54963cab6bdc28543d0cd599d3e8798be4cc2d5c82e4cf3729d51886e97ea55c5dfc30e054253b69abd8b42c9912fcae4aa619db7fbd80445e9fad62545d5690aa6d9d092d939a0e477c90878e6f64982d17a6b940d2e734766a8d0dba5b3755e04f53adb0dd2b29f53f6cd0dbd9bedcb68adfe111fe862d22fce3a81a875ba5d994c3b4052d1688d6ba6bce8be531f0a01cc4e66f5dd4132d2a46579aa8cd501e0405e0e068fef473b87cbf3e2a53f996821e5e7121207c05f476143f7ef9b605b6fbe3b71f6753bb120498003bc8fa8c8aceba8af22e92317fee09677d12b044d2ef44aec8c234ffd8856c1f0c870c4e2d2018cc9c6103529a41617e93b7ba696f956cd253a9c01523ac580fccd673deed538b0c7eac591f12b5e78379e11d8eac8fbfefc3c63b2b6f7b1ca7be71286219aa5e1b83e27894dda6164a9523c2672bf9deb5e030da866a1486e596850acd10907dadb08a177cd722d7afec48b9837dfa27e73b01aef8a83cd9305f1b94871ccae7701ec15c67b9dc6c5ab670164bb0e6935e8cb8e7afbe07c4dde68d1157152020cdd021a45d66e5c505819251d25defdb3bcde7ec1edf6ff33b4be03d4a1ea994f996e31b60dc41a89d43f865acd288b34b56e83507965911e0ae9c34d14e1de8f9e24ebbebccc67547fa6c7c6661e9bc99227862dff116a8d344208696413b2b7947207c406b506fb06d94677a60291fe406bb0673500c2586700acc18a5c9b6ca0587238c5ed70df6e694c6831bae3996e54779ff4e96f3cd3a8ff10638347bac78d4c9cea2fd63ea1cd90dd9dbafe61ef6e09936abd22c5c0ba1d4b44937afd73cc945dfd0fed8a9adb26bb85f5b361a59435b8b435ec59a5fdf11f62a0cce7f1a6cc94a2f2957f2313a6d1f736c016b0b6a8fb116d14bf58374121bfac50c82a1432e48c427ee1569ed066482965e7020592c7fec546627ddb8ead6831b46ec75650f78146da0cf9addbb1757e7fb0677da35bc3290ffc061bc48f53d657a4c0b1353bd9c5cfd6fc9853fb8e58b1e70055ecbd75fffc43ab28709f1c965cc92889f5b90b36ad8d47ba37f339646b5affe47c3edb55b4199f988f0b2ee5f88458184b92611da0cc89c8ce3eb139c24c7adc24e99ef843a4e1d0184dd1667cbaedd1edd8aa9d6cd6a6ff7dde333c425a8c4ff7816232afad7b28943c82fbd6a6d2110457450f1da33956c841ff760655a4cdc0ce365c02011112d26460e77f38ba398e4b591e0add1e27ca1d8030d6439437006bb02e29d3b0673da36cd32fd637ca4250281426bba5e1ba4d8bc11d764ca37bda1e32051c0d0863f10cf6a12ca45ae70d401908e4639a6ac55bf22ed844c3b2604fb5762666250adcb734f110cac8460261ac376d940eb8ea9c6202342db4fe132742a1d66070fd3077d877c4cacf01aadc1dce6ffd667771c756acfbf8abc5f8fcd3e1d0ba3d6d0f5e9a1e5c3a611ffe7c36098d36c5f00b3f675acc2cd8e30f0850558ba19dbb1d5b3f6f0d86c6ff50100d62abc654b3d9280b8c7e06a8ec42b3f9760640626cf686056773d6ca3e34fefa666d249526e338267b5687e3ea6ab0673d88ad58f7037bd63f7087c60f5cfadcd29914a39f3d42b536c9dab48905bff05dcc231c9251924325abd3a6c816c7e24243e57f9e75ac9445daa8f88c67d800d6270d62ab0cba83e6d83aefb58997f08b75ab878e05dbfa07739c54eb5f4cb5b8c90a17b86fffe974445e62c1fad1626c67a18841abb4fe35ece86249192b40041afc98c10c6866104f35ea60c88ffd698ad4be1c018739814f78d40804bfc4430dc63c940c04831f58038edf45d8b4354a464938248dc3a5ebf17d049471411b015bf08fad214e22dc93b2308001ebfcfde04099d6341ef69b16635fc1bec9b4185b5159bbea6045037bdd45de014253dfc097f8c6a9f1df151b559986c3c1679b8e8540fe0be62eae80eb691b2e016153c6a52fe6d4eab1e21cc629c2a5cf23f6785602ca68dfaeedb7755ac7c36a1ffaed3f5a8c3d77f37093c8b5539b8ab186fbb8a7a6b0be8145647fc17dd3a6ac9b93e346a3ab80fb3a95622f3e88adac84bdf88f77220f2e7dbc5363a48132303ea709cac9931abf4205eee31d66b2c32556c225982ac29071da04999971eed248fa481729c2de8ac8c736461e359e230ff662a7204c7c0f0e473f88659c36b50de3d4f89ee1120e7e0f3fe1128f1e02ca7c8efdf379453facfbd6e233136ec25e3cf314c17d7c53e36d6a3c33e126cc5384bd78a69db3831ab96b22bda4ef3262c99a08c76e257719b1a47006249e6d78d66f4f7c43844b718fd0f5b1a78b360ef74d138130b108f38f6dd146c01a5ac9938c9070476a8c474098f88f5d50e3b1152d705fa72a97980065184733e157ef4ae381bf7b66c93eaaef8ad8ea88158b1c1746b9ed49099762a7bc7f34e2b818974019c8bccccc90eb6a3b134f39c83ad99337308fca241ef87da4367df179c2593872e070514118fee369f677469f1c0de4e42537fba3bbe0d231131ba874d881ea2051c80e8614a2cad83a70099e8014bed46a0033ded26007638c30c6c71863ac95112270ea0751d575e052f5eaa39eb3fad60407b819a8f38553099827174ae1127c734308e12e4e09745c625ced6aaa65108b1da92e1031b527105371ec61f761d78ee9a0f20feefc731a50a63aca5eb4a2ee437b0e045552e8dc0c857e33d4ed22fabd8eea36ebd6e9d8fac11dad1bb10011536177f624c93b7150860828b3272e7d4ba4cacb8a7da45a1deb868f152e1119797870c907f6e4d2d08c46198aa3e1125c789e15293e95baff485b435d1c5883fc074343abbb1994e198ba1fd15f81e5728bc03ea48bd3ef6e717a6968e2fb7b5d1ed521afce634fd2b4695e320dd3d0bc54af6248247e52ab77059154990683ab0c01571ddbe58cabee7d7755c12ef2b057dd8b32ca18ad0861e247974f314253a47e1e4763e5ca45c18733ecc1735f0b0981e603524a296555c9154429a58c32c6c7186394315e7a808b31c618a394b166a742231fd0a912f26b8c34432a344203a4b2b61066e5bf4f5d515d18ea42990bbec84b0951f250b2708921f94003ca40c8db5bf5150009122448902041820409122448902041820409122448909d435c1a60b92501a7c86834aa3e3b3a2812e96a12b673b36fda766ea5b7832ae6f9ebdb751d34dfda9c73f628eb6b27894422914838d7755dd7b569d9dcb46c66737635b42cc6acaf9d2412292369a48d849372cd4f488432532e14d116d23ed9fc372b966d9b765dd7755dd7755dd7a5699ab6d5c86c6c59f7cddf9812a35b49bbdb28d262bb1ac658f5198daabe76927648241209e7baaeebca7e5ddaafa965d7766dd7766dd9b66ddbb66ddbb76de3b6af6c5c46b99ded90b7bfe02dfbb66ddab76ddbb66ddbb66d65dbb66dc5c4b65263c5c4765dd775a3c6529e4dea96b263cb96a9d88b43cbd9d5b8b6bb6123f60eae4cbbae0be7caaeebd256b6cfb9d27db3c6fc36e7d2265d57f60bbbb25fd8d2ae2412894422611776cd1d5cd775cd896130ae8ecbe695aae8d2ec4cd7b07103020f98a4519b80d8d1419148a9516a74c26a7cf08c91586f8b1f263633ac326558f50f853770d798539c9a76c5401958bb45b70e96c5bcf874a8458dd229adf2eebe4a0a8a28f4e92bebabbbb9ebfd0ff4d6ba9b204efb759174624e1c7b56975d6fed57f701e1b2bdd23a2c6bacbbbbbbbbbbbb5bcb1ad3ba3babaaaaaaaaaaaaaaaaaaaaaaaae66976eb63aba9914aa552296c56a70a8b219148241269669a36a736413552296f7db057a34deedebca6757bdab2cf6319dd9af591aa0161ac43586ba4787a7686e63aed60ce39af2cebb2c9615c867538b2ae5b1fbca71397a68f9a39678d542a959adb36e7a437b6cec6a665d9b5cd6b9bd985b10c9a8c797e955dbf7ed9b8c1d8d460e5b29975376c742b4db81a366e5cf39a17f60fb5419c24921394ceced7afbad91d97b1674dd932881c44e8ad4b5d17f616b669c6110fb878f8ef2806f6e003948932d24f889de9c9a599e27076ff9c9fffccdf60d3f6f4b4b07cf70bc3898f4c7c45e52947f98abe5ce2409bf6bd0e5ccabedf814bd76534613dcf734e17ec2d4f9b62d8a5409b62e8f6d475b05f68c7cd4ec559549ca588087ed451854644c0a362316ba17fd3475a0476d14aa3d937aa71dc4534944251ae4253be42556e82ae7c444dfc041d1d067ae228280c678ae22c949f024655ff173c394ad709bf588f1a0cabfe7bd3d8ad7e4bf78dac14164bf74d16fa6f953ce0b6c5fac748d414fff874f251ad632d74ab0a96a778d466a838cb5bc5598e71d6a2e22c7fc12d2c74c7d696af13eb168f6a31e9c1f2177c161d31fe06ec494155d0163ad96ba1b2a6a038ccb3d075621d857518289fb03ea26c82720fca2a947d5046a1fc833dcb863d8eb2901bca4470b8087bd62bca39ecf1114621e117eb4d39c9f21871edcc5bf1338b951faf7f5b2385f3737538e235e5599ee5b907f7cd6a3da6f480fb788707e31413aa75562267c833ef28e1129421e5c217bed5b3735434b042c4a832834197633a4013d7b0046fe3073665873a2c5034ec40407501653e877f011300ad5f7d00d822568c8754eb0ce48a55b553b16bd8b783bafbda3914fe276a07cd5731c6eecf3125557e9397d790d4cffbf3ed1f1de008c1ce2ee891c1e3d44efd38f5716aa61b4914f235caa2c18525853dadfb3c0beb3ece6505a7aecf3ffea7a3b1b96033bc7cdf3436f1ee899f67ffbcef2aff462b1f13ddeca64a07f945eb523ebf34ed7c8cc3300c849dc34030858d30ec31ec91ee61d864138661d80a6d06b6611886e2b67fa06f9af6adeb5cb41958a775dfe7146a33f85ed65b1ba5d3046b1aa9d57175d8db78866988a8549b11df33cc8369aec9d03e1cd883d87a7dce39e7fce7fd50a3e5d6282873dde28ad1af79aaf55ea29b700986866ca37dc4e2da7adfe0740b1a48dbf40f08637dd2ae618fc90baad5c4470f27a9ae251d28d375f69ca8ae737e618b466d0dd6e767b72356d07380b08dc27a75537351e16743d5b46b9ac66947b928b7a31db2f6176c82ec824bd7b51655bb0d507b0c94d9ae699aa669d7b46b1a87f24e9ba1719aa6a1708a4b16f70fe51c47556831502a772dd5a8e598eb6ab8e8000494e14a04ca30333333730a0d0706511aec5920c0a900a8d008087a540c6652e8e96095630c6b33f8c3cccb4b4859e4d28774511cfab339f2346055a1c58835607313ac3313aead6746dc00b2c84bd8b3386544a3220fb6ae8f7e703eac7717b05bef275066bb6975be50ad378a4b6c2d4f93d112ebeb24dcad4fed9f7fa07fac6f92c99ef5162d06a8dbb195eb3efee7daa106034701326cd749b5ced0097b16845d012e0a57675e735effccea4aa1c5a8e693fa391f2b654dbbce39ba28ac57a1c2b22ceeeee05bb419f19c429311bbc8bd3a3a3a3a3a7372dca87966755607c24cae31c6643b29291626d5fae75297a75a256bea749c3ce7849f39ef5967a1c5585137097bd63179e230160142b834bb28844bf206ca68326617279fa40d4f6b4eabba2ceb9a56d5332b2b3048a2481245e4ca8ee3528ef82f768c59d360041c1f5b6884d48f301a02b70434628316a3eba7812331a3b1882aff91a675f86b49ada142233d7ccc09e4077b3206a21ca61ca6386c399ce150c56189c238e3c230d8d329ce449b3833e31262203c846f9808e37011cee1233dd89348705b3f8e935c02614850feadceb749527cab6406157b72b95cc1f26fb2d0d057d02f12c1353c3cb33bcfde740c383a23d4bf5532fab74980e1288e62fe6097900c2695cbea079028240e8125d16b329b14212c3791459d8ac7a8221e455431335d1e9f71297419be82e5f12c77e1d2f5edf13470897b3c89458c8b1709e012ca531ebf0397523cbe071fb834c3e36970e98fff814d2a8fb7c1a5181e4597da8c288a317ea418545c85c6997e9981aa780b9de12968cb53688aa3d0946714e518cd0ea2d83f9f73dc2fbadda2170badbe82b25c06bae2212ac3a42e2a34f2e01779ae9117c91a67b8f44b7ad92df35ff00a5a84ca59544ea71456d1ee61ef17b52e0365f946af73dc3f543b887e328a7d52d151689682a6dc85ceb7d0149f81b65c85364fbf9056ec29868728cb29ed7e4aef42435741ff19a88acb405b85b6137e913758866e45e7d27da378118d81daa8c13f501aecc5aba02db407f6e253d01dd88b4fa13ab0178f4213c02f5cb0170fa2312c483478ec72964859387e89a1cee923a1288a51342b91a88aa2c903050c276446975f136c0af604b014da1b6c11fb822a43df5014c5289a95485445d1b4505014a257171d068a42f4f8d98d44d439f37d04ca882edf4ac0cee1d28c2f585293845311a010aafc76d17691e8536627680e27aee11fdc022ec246b00d82cccc43999188071d3286e8dbfe586dc69c5bb727a85da2effa56c32a80226c5e949b1789389bf3a2330f7b1f6fa14a76b282056e47ac3996a75e5fd10277aa7e6933b603c20d726aa84220dc6048153df670526115a2f648127a157a0c8190ea52a19110e0546c6627f60489bcc0063541e2695ba02307a85ecf4181faf9273a778c9b90009ce81007d1a1a88bd9129ce82f189bda27a7b9d40cc5895efd04dd2aa2b08e6810b15eef23a2471922910842988b79e6b1eb7b52e563d733b163275afca49345dbc824954d3ea8f2cc230d004d7b824a8842d1e29a0af7d4dd76a2ee9ba17e7bc2b44c22c1c1fa310f8f54e20894097dc989246c11aa8cf2dbd38d9010ccf579aed97a6dd641599ce938735d74bba876d1eca2d8453f17bd2e3a2f6a5db4da91d705c4351fb762a2ed50c98b30124275800a2dcb3200e490060343c950503098aa591eec7d67c4399dc38267c6a5c8d0459828f6a8321251659c59f102f7354f3be1d2c755a80294e12edf3c539e87b089932e44aa3c03f95cd2b035482e812ecf3f32015429794e51f771a3d14c0f1ed5abd0480894540c32841b371e707166a68643e9e4c419c94ea852f408a10caceb845fe4f7c9e4c1f5c8e1f1983c35faf6f4ede9c704c20d1911b95c596152833d791b9d8384674a275e932f19294952654e8ee7fda3d18947d650b7271f70a17fa4ca3cec39e901b7326e978f44409915bc805900b9665b74119c236e6e50b98850c8e3a17aa80a59ff160bd117170a0e175677a1089d8a8e612126f23aa4366345158560e82f3802d064e2f2356c4099d0a54b8a957f2a2affb41aa2eb03c2c88be89e4c748b02f8f2a9d46f4f5a8afaedc9a5bb8f8f38843228ffb4172cc1ad0eee28c73a24531ea2df9ea44c71a928340705aae8198a0bdd3a4c686b88c2da367480736932428f211e428f317e38400f622b0a192e55bbf6cfec22dbc2a6851489dce755b41cb6937a4e8e1b8daa6f868a3dd2d0e757831197d45007844b8d95a3a0baf107849907558e6e3d5be5a89644ab1ccd6eb2ca51ac7b6095a31f269fcad1ebc855393ad966568e5a4faccad16aa7aa1c954464e568dc13471b080833ff8275e8ab7381301c5d8ec20abb180361f89352bf586da87c8e06adf2e5c8e326a8f23fb911c2f0b1135bf5f669a0721a6821b87640145c0084b9f9927bc6f2366176c24f6a8c8480a6422343f0a4aafc6472233291a1792d11b056510a8142d200c15e7c4529903133c780fb4815ca90f525022ecd0e29418d110655bfe1d2747723865896498d5f9ab883263b788546ecf1d8996b07832ed711e2a64e08ade7d87f15e0ba1cf00bb588ebdfbc758f4b38b87bec411a0a8542a150777804b71542ee50e3688e9ddcec72ec3fcedacf737fd193eb72605fae565d48f46c5b00bc41422d07d1b763285484828222429174a31cfd405de8ace1101f7be80e468efd421542e59e63bf800392ca69177d3bd47240b9760c856e26a29fac2294eeec7122fa9deb70e4d87f2158e77be8eef3b8e76e71143b88c2bad1cf005a472aa2bf9fab13e2a65a1dd82fdc6003f91bfdc2af3a2535fa0526a1f23512701f4cbd5f7808ae032e3a620a7b550fee63512b16ec7110a67ae492f78aa351d5a8d6c7d6e0a0409b5ef44bf5ea404800b6f8616b8032f3d5b91136e9be48fdb02d8e50f73d5b21a1ee3fa8845a592b1f6bf5b5d9c0e792ff581fa2b2aaea9ff921ac695d1fec434cecf3797daefee7d73f9f6bd1661abbe6eeee438d9b992d21224b2468d082216430c410fdac9fbd7a36bb25a83f65dbe0aaab6e4c9bd173f6ecfe0799f0c0dd991bfcc2deae0d27c1aceeacbf51d8f95083e599200e8eb4e589a998ea7ce8ba6e9f753eb0975d76bcd3b10e7b31d526182e78d2751661771759c0e1481097e61773b4235026a4049411a15c24ba463f1451178584a210088a3743e82ba8b7b055665d4fd6c38dee09e170b8846a13d6ed2e8e78c3de0e612f0ae99e9def79c2e3a4ee57a8c045217148bc290243c226aceb25ad649320c97a707daca98eb8fd64cf3d10667154fb88c3a52231874b201cd99b4b30368953803221d143d94387f41375df36ce564ce321bbf6656f9c18d98ea5af93ea58109d4f68e71479953ab87eddb30528b375df5c58534c2d130e441098603441dd99549be20ee0cbde486a89ba3c75878069f2035c1fd6bde4c1a5af71eac6253f24cd667fc159e370a948d549faeb21d47dc226c8ddc3a5f9bb8c58b8946cdf4850ede42ecb9c25611d0d87cef6639b26b245e8f6c8f152dfdd45d93010245c824ee6ab2cebaaaa2ee7ab8ca290b1357b3feb36eb82d83abf3ceb04ca402e413a5bf6ec6d1af67667d88b9d9dc45e579d553dff6dade80b099a1d0e17b36940983eff2e3460fb7da1297c463b44037ba17fcbc3b34eb6675bb0c828371fa23db007afd11dd89b215331319afb4cb42ba3ee9b26ba8fe3aed27da30ab785ca3fd757e80af8925d050aa1664fa14ad4ecdc016af6cd00d9d9a64ddcb1a374365bb6d9b317ac2dda01eb580f3bba166101ebb0360684b8c1b22cad73813059873da35587d1a6df05666aff4567b45200bcc17ad3e4a0ee2d5ad16fd6d88fd4a5c2cb4a0b4014220d28b3dffaa85605bf3318f0e1b3033c426251e1f621401b687adc16fa105c8803c17ed90edaf8ad6b2b402854782670a41086e2976a31c618638c11872cc3c1ea52b8ca90bb99b1b584247e9044123f482289247e00042014c9a9f2186f906f401899418e9037f8170cbb8e19a8909323094ba2c3ff004d282c3e981529541ade85064d2438332813ea438c336cd20d51d668d718e3b66d6fd01bf406817a492b5914a7564786feed10ea479b017a442d122ee940192803f4780c0716cf4f6027c0165cf360138a06e3a6cdc0442294500f9481f1c4a5ed4c61d528d7a63b66dd8ec472dc96006576709d04d8a22f17c5298132db47ddc38d38d0b108ba3c715b060552fd38b5052b6c1946732c0e7686f0f1cdc7377c83a9348a74131a617471b03384258ceca0071ba9f00ddf74ed6d036933b6b78c6ddbba66746f4018692356bda1308d7ba83b21eaac0ed58d752114d77dfb842acf5b574150773738270a318dc69a452e815662376c54a3dac436f184f39b9110ce46c3017bd3b841d825600d46800e3a163314ba4c50100653020926357450ac1b040823bf4bc01a90f09291124870912acf82491270dfa2a0d5b33d3d1cdfac5481db9913e5a15010461e862ceb9ceef8fe41a455006b90df68d74098e6254c5850a16084dec01678d360c8aa759c82725131f6384199aebd1379fcc9c80977139647309150a8a04ea4cd00bd535c82e7255006a88b07cd9d3977bafbb6c6c74d93110f8c6ecde85610b5c1dea45b4312802ff27b3202113abb01d416a015b606c2c8ae98c593b74f0315eb78098449e570fbf823c050ef4099eda17f3f51bfb6f9acf7f6802eea7a40c7ba1e4ec106026ddde1351a6bd46684bad89f314087816382ba7ec1a0063508d48b6ad3da4c21dccd08e78b02dd78d7285710e51b221046a2d808140ac54ab80842182951e591c0d1a956d2f54e2be19b10c618ef00d43191452d6a518bc23adec938529b3a09f085b91bce09730a5c16aa7c177818a1775a890643fb4a134ee6a075dad67dd203ea7a873dd82fd89bea00bd33ad9910ea5a0905d120b80a3adfdcf8604195ef55c14e9b6cf08b4c4dad779eecf4a852857ba18adcb8ee1128f3e9605c5d10db3167e31837b176b73cb63cf6105a75d1e2a8a2a553b0a080e1c4c8c48a4a0a8a28c481362dc3bea7b1950afa4fcaff50fa8b16f13986b150144f4159de34c55b68674bd372d2d0b00f7e916f3eb5e9a36571f6d6693deb63ddb1bbb3167ac98393b4ce372d340705306d46cbe33f2d8f55cbe30e1f6c9212489543ced10797260c16852d735beecd7a255be80e699a822e91c5d9229bb3474674517491d0d5d924bb4357097b4b986c93e55927dbf3846728f3e0971eec19e1faf3db13977ad8c96db07783277bcc194f6b4eabba2ceb9a56b5343d56c88dc4410d9a52a854cc37a5492d191a9101000000d314000030140805c482c1782c103475f70114800f89a2446e4c9989d32488711443c4100208010000000200020023c4010ca5ce948237621cf234610124c9e0434aa5c92fb34939a1634dd914c621da727feb1c58672b225d6846824bae6784e0620ab08f9b49d2ffba41a8357ff25a200e9643816014c5cff63bb3164c90aa27c8cf8739e1e45073e8f81d7058ccc6e065ab6d3f0fa9ee0dd0e541558928331628cea1b5155c6021bd936fcd597b22a6c9d90eb30fbc6a76f036bb060ef7fb24c1cc85ddf0ca8b1ed5e9ec1b725a526622f315adf4ac98942dc8e860b4aa08ca1da9d04b3500b8f05c462995d1a6ed79955b1171a9269870ada718fe4771ab7159e044333685cef24b86af1b73ee6f863031bc0ecdbebf19823b1f43efaaae197986e7ff40f18f336d3fe3dffe668c0580d6d013c834a478ebf143a1c7e8bb725bb8707f123e26a6e66db667576064009275e7c06408017f3b32000c00be669ca382d63f2680259aca67889e4ad776aebf19bb249d295dd96a10883ce20ed0195f11c6934f0f31bd97dfe0b7e2878cf7fa171f5ef11e979cee77992fee1edeedbb0a9612f759127e546adf1e817776872776213d297a9f45096939239831ed2bcc03351001cf78656d95649e2cf1c1ce8617255129544f6d2610a6c3e6dcbe6b10070844eb8c9a45954c813e3f97c3315efb43a40e7e17b7cc2675d2632ee355794f33e00b553c6511f8a83aa5375bd0f792b0b48b65009d71004f1fa6b6e9ae9061eb25e50140f8d0ac7e559fc5f3ac4e987042eacb99e22d8700e2f0b8e121e24971573002f7febe3a274a5a94c1628c0d35ed2ab4e62b151b3b2f985a0915e18c04dc38b1d71367d149412b115adb3196fe3742c42befcdc35992b6be65d84c943da8159a9525fab920dd0e01d5066998663f6c9db73f34909ee2052c4b3f9995a74ddcb46a2ea6f8adce277596a619c5efe0a4850a5196263df402858d6c63f92f04c746fd2bacc3cf5e3ab23c9ec4af81a8d939a242a6cae699242792ca83e9e713bb953e5d1c70db028813a5aecee4819e1aee864d2908da91a711af03998cf156c1b6c67ac12a04e1605538711ffe954c54bb2f7409a76129e09a9085b300c01549da4c32236ba8a68a2c31a05163761e4a6acd76f07613b0e13e1595baa6acca38fc62b01b04dc3cc4647e3c85a6372106f238aec7e586086f4c56bc7438c0e43216847e1fe95011907918a14ba45bfe62aef4c44810c90e176d6e3935fa6326b4f090b49b0fbb073e9953b7e7a09d7aa23c5176b8e0d9288a567d3a3cbce6fa9b3778fbe0418577ee59491ab1705a665e165613b036188913d98cf7e6fda3eaac8e69ac2c37ef7bca41ac3e9ff5809f36089d7b9b952d1947e9f42757eb99d8dcc05962e28d2f58ab73749a7aaecca965b541193a4425c72ee118648ac36830d356308813a43036c0bc0bf3ef53f9d009b209494f9eae1a4b7f78169e8556c9d448d0cb97aef4c29db1eab9b9f1eac67905a98f40eb2fdea24c4328d36cff987a7bc871ac4b306342bf1d02053846aa2690e214dd37a72ff105e81a35b4b05401aa7eb6d8d5c10d2a21c8cf136baa929e57d52734ff686dd468ede029cf4a935f3cd896855221808c7164690be105560596f653392d3f3470fcf64aff107642a49b50f0e6226356f15fe169ec2a246871a8f591711f50a6e875f0ae55680b4706e317cea93c0a7581e51a76df04cc58849a006ab8bcf05283b3d6a8dd92569bd17b6d893f8f96b2b596cb6a84e9d7c530860232ebe9290f4a540b24cb65a65e46d2c7bc54108a9e907e89ae393a9664ee4c63fe5d8e8542866bf4b40e46f3d0d066af230cfb91e81941bb28f01c1ae2cd065351a88e4d422021167818be946a7700989b9a2cb2598627a3a1ce8d00d24e91ddf4404351024352a665ae80a294ded7ac62ea9b79fbb7be184298e02e29a6d07b8ec6c9aa5bb698eb919c06f34e7c26a99003b7a902a61f62456357441f4e2ae4a8d0028ea862a488f37d8392a961656eb9394a5614bc595185c23724c0574539f04f0d8b79a70e672e150d5173454788b552530dddb01a9472b9e5f6cc34f6086608bf5d526b940d80a7917f9159333e12b5e20fce768616672d181a71529a9b0dc7e6bfd7820db2124537282cfe2defb94ec9793dec645e972833957aa75bdfdb695a3e6d5a24ad62f0ed9cb568a2d91a4aa2279b3e3058f6f4fc0cd3d23df28a7e2592a7a66b92a119c8e738d953742898ddadba1f6b177c08e092784691e7d3e45d37042c6862830fd02f8847d88b0322f67f5f4ac916b6b55c77f82122013dc136966c49eb5cc413baea30832023f1a926948a881f959fcf9e8202246363496203dc29aebd2eeadc0351370123c266add3544a24cf34c7b837048c723a248ddf758500b6d7a9e99559ff7fa41c1a5fffc68f2d8873af0c657de9c599dc38e739e1f20bfd26edb432967a326531df43932418e16814d89206c99eecdc4b758f6e4473c892bc6748955f9627397ca2b4013f3bee5affcc85624355840ad27b692fc4b3f22f740866a0d08ea177d6425f4643d7d4432add2efa7c39624646a9689bcc0837a8ea2fc81865333d556b3bc6cd27d4208a83dc528f7ca64b155e6f3943ed9a82ddc5645fba873e52ab1d42a53e15852fb68844d28dbd316753e341df38c074413a4bd603bc7af93c7910a4ab735ec485ea618dd477598180c01f909532d26540c78e3e70629dd0f310d0135e9d3b2a1220b77281413523e74a9b3e95a869686dfe637c12104ff60e7422c024355279d9936b2e35e05dd0d2a91c04bc009cd3a6acde61165e4f8d616513cd2d6c34d7d8cd8084c15e55758abf2fdce8a49452ba6a1370224a24cc089faa1b8bc5530209084a268ce423f5364fb962ebf77fc5a4a0a6647ea9b1c53a0f465ea8f1255df42117e55d8f98299696bfb4efd6854b7c0ba56137646364df7fab54500c9114a3f626c682fbbdfb26293d4e99c37cc75c4358b846b1180ec69f4316a916cb83596e556c787ceb4549fcd51cbf74bd55163f5cc21716f13724fe7b7b1767bd6c552f4eec5742d19f6ca93a82af0eb3c75c0fa57a9b3abca744e1dbc42f732097a87cb61a314b884ecd6c12127e85614da55bdd3cddd811f2f517f62b03744f507bd78d3b17121afe480d2326e091377d6c1410f9ee27b261986d0dfff8598c7d84a0dfe89bcad1a29f7d618af601d3695fffe38f07fc361a2299f8d040036948438a9c0d18247640de8d5672ed3902d2be8b3e3917dd1e377167d3d048d15ebf65375c5d6057c92d6dd2831655a1fde4e9a6140350c8b23509e6a89def3fdaff2a0467bc3d3e64b1515b5659f2ff5ce436ffa48fbcfbc4c1405fe26d4d7f22eff610b827947392332113c8356af24fea71d3ca1dc567a2d9cf14720e03cc667a382573fef1f11a2d94a81cb64ed95863873c9dae2d419ef5b82a2167c9849d7813381d047bbb9c05bda979e0b62e7a7b49d8267aff27f0f36f241f4027da3f274eaff253657d8e760f8ab88f9415042e0062126ad83f51103c0496bf312acf017021546a56b1364685ff4b581977827925e1bc75dc02e7e9542e4e86c2a0509ae45a844208802b5fa2a06ec75a14d10b1c8105bcceb6edfb0866f0c45d73fd92d295c845988b104370b2cbfd8a1f046ae78520f7b4c75ed1e1a0c17adb923cd7446a0aad12379275edf4bd00dee7cd49add85487d09a828a8e54072df82ab3998f35f633c19c74f7d5d483a222d8717e41e00c8a7f4f704308c8c3ef12b5866f6457d407ee79aab0d4fdae099beb8f037de25651382fd81b05d1dcd0d7e768892b294350fcc2f185a252fd44ddad5bbabcad9aac5c697f5948860382bce14e35beab53b316d155124d4bd848df05238051c65d514543a4a8113bb35b6d5b13e02b42b58f2c5eb8de84fc56db501f451952346a56fd1a34d8173eb5d3c0fdea6047ad19c8789d447401d6de3498c74ebbaac492f658ad325a447bc74ec6688c2a6bc7e14581c0349353f91f0f6fb84c6507fbbdd96dab63ea8c9647aea530675aeaf34a3d4b7c814b4ea2e4bc41ce81cb98a9e266148b00639c937ed7b39f606bbefcc34b4520ba193458bbc2767843a27c1cdc2931a039663ae8f6fe7f8485ec6833511fa496f89c4890b065055e48185732db2396e3524986e60bdd72d749c0f29e2e2a9a1529b139b5924cae52a5c9b89001b89cbd627754b71386c4cf091d75ae772d9f23e540b1e4018dd07d0c19ce46b0b9db4bed068b1572f134525cfba5cea40d7ac7cb149008a31d23375801166ef9c65a041f8a996b9f2570c0c1fd4e9a662aa86410b06819a181e20dbe91f6d0d592aa8c2a32504e5e73ffbcb3f5e4225ece9181580341a88478b3266d13d04819ad623562ff32895fde2bab65615d4f090c0b8651b73816ee673b6b442997d02fd92aa228cdaddcfc8d2749d945270365d94e177e0400484f56bb853b86ab9e67f6f6e433d2d3184b0c37e9386e7b91ed1be8e0a173d7693d86fd65e027c2365483853415cb710863c0f427a4c9a53513041ae53d53f251b76c208c5dc4fbce93556a9854ca82174fb7f891056d25393593f852be25a0beb809aca9db49958ebc556f70a436acdf83f382435dd309ec34525d02e519fadc691acaeec941c03c446d40b40dc9211712d35ff6b3ad57b291eba39d8161c8f4df4adb1cf68710ae3d1a6f1f188533b617d5a57b0ed5bf70af0b15714e552ce3e684dab355b321ebb8ccbda95d5043a6d286f6ea7996700c6798aa4971873215841ab363c55a9748a0e771d1ed56d9d676dcbb076bd837c3bfc11ad39c813f1724c0cae134fd02b882fd98f89780f79210d1c63d729f42e537206db0650b9bbbd035060fd61c62bdfba5fd1b4dd1425df1aff3400139bcb7d5708aa204c67c09e34859ebfc0c48d4e056c6aee61da55c5522f4d13b1048bccdafa50de4d0d4dd5d98b42d0f691d540443d7df6bc6ad350e499ded00641b7f01814a57ce768971c43a3a42554f4f480a8668ade05d8e932a27031d21d6e9d8675003ef29d0e1c7ab2b10b4ec9eeed6a7d68024508167a112e43798ac4133217c20ef61b76d30741270c2f1a1c65600b7e0b0474e4b0eb03d97742c473257261e826c4cc6fac2ddb5e9a27d0b9343e26cd2409510bf8a17650d13eeb4d33799238f94f3d8e2a45b501d5e4ad4b7972c77886b6b1225dd1a84a7defe80d99634081a96425f774917e817f381582896346733fc6bf4300c542d0d1e9a32b6881a74b6f80b3756bec00892f891642f90f1cecc78194965c486c8e83b2605111b07f52f5f407b0590d8378ad13764901536c4a8b5071d1e8bffbebefb6de9689e19d9e358528f7e48c16267a71bf6708875c04a8f008632e8b661a76d891040294e4453f0699b31c902b75fb0102e06ddf7cdf9b0e90788d0724097d34485eeac2fa7c5a95da37450e1aabed206008b659a4406f843ef00d66aba13b37a17884d518838d44d35494676a467c11722e317819d7da065d4ef4349c4813193647233d9e2c353c683d22c3f36924282c03c173409cbe5d94885887190afe58555417c159e637a16c06af224fa7f6c2c015b059080edfe25dbdd9572498551421d70ee55f141cafb075fffcbd967636f7643a0ec8d70c595f186d73ed359efbbddfc68fc5cbd954c5684f061880c033c24e273b19c86bea831f1f4198c516bafeee949f9561cbac8eaa3809a046c456b829ea4816a290208e87f9732312724b68ab76d1a6f5d8998055e10d858f6ff0a6910fafee1818be434f91f5a632875c75e9fecaa0530634c1a5ed20c3dbb84affaeeca0f4b0b470b735c92aab622e98925b9ea0d835134cc31adc4400c76487f8280786a7da7f65adf86c4d2d34c23c2d6601adec06311b46920c2660488583fd4cb96abafd1d1736ac516303dfc315d01fb305eb0b75decf24fda10b6bb49a4e2cb6029a3163ec2b80986400421703634d952823c3ca4c40bd70304a5fd8a00f2b29788228d9d561352ffc205689adc10e3d441d3b502dfbb58c98b4f6acc6311cd94add32e39a6a68ef589e8fd0bc02009892c5f2f3a93f7a2e78fb673608fe3180f43199ea90c7677f274b59f1816f1370d63d360d92c498dc013715fc08adbf6784ce73b3deea579dc12db273cc7b0ea073334042d6e7b8ab3a394a1a8df1ddc49ede9af3f3307b9f0ba2a9c8a5c74893aa93957c7b58e442f3a8b68ba9aa1814c219f601d0acc8b4b97a7a5cc96d858471cf6e06adb7bcc3974e257197c64538490070e0d0111d0a9ec914e1c942e7261745f4f02dcb3752b90238940842678ea6b2e6281b4c830a42a64681023eaf7fb67001822842f40ee92f226cfa343c4a147f187c682ae5febd833173b132ae1e93a7cc8954e0673e053fe778a3811155fed6cebc420cbf869e66ecef20f33da3356d1cab696b0f212d896cf5aa7cff44c13dbe34d6bd5e164551de89b6f2f6e17a2857f569d59ec7326b82fc222f3b0dc57e03a9bcfbd81f12b19f2a625829a9c11f99bfb4b8743c04fb0df4319df3b30bc87059b305fb338568cd8e182de8294af828c09cff143082b265c10440847fb081d0b32a1207679bca6ad95cc819a01548f5374b384d93e64be4483741a37651e4a424ab2e7fdf662e85aaf47a28d892f02ad5939fb3de4ea6ce026178d8519a24ed5f2f1ea50fd113e50d303f8c0d2e8424db471e41874515f1a9202a8e91bc603a1a1c7c46156774a3a1f7c6094e7056835a4804b2285d126095a1f91d8e8dbd0ffae31224b4a76051e32a8ac24c9a822938629a5e65652111eae9d41f9df3a798a5d8a56ca962d0d438f2504ec0d1232ace601bc76db96ac00b67462dc274a9e6fd92fca54d207e3ab0effb893354a771ed823271249f6510cb518cbe229c65eeb2934e88887811e706cfa8191da6639e81d058a911aa57c60951ca077145725f07aa3dab130b7a1403755d08bbcf09fd28c18fc7dccabc58222a588eac1002fc73bb398605a339554f66029e3db0aa37281b03fee8b02fada47739083107cc8ce6454d6d9d56a8483013092a7da1600f0ebcff996caaf145021df0646629700dc9a91408e22dec75d88ca7c04f77db2cc9aaaac82e864b0b6749a6237db021c5baf90dbadb182adc2025b8f95f63e1d5dca3daf3ec6fc0b336a8e6e9195030b80c9ae4be53fa68bb39e25f16dfca09f83dba9bd1f9eb11219cb2ae8ea77e9f73f207f247f94cdb2121dfd7d61e4e6cc265e7a61f2885230008c943114be49f8b3156e8cf967c761e6a06077af11294ac0b9db04e1619f64ab247d4330bf806eb0702659cf01cbd4331e47c1b0fe5eb64dbf5dbdec1da74e67aae046ec32ff4c93558503e8fa87652761d092ade2947ea6a9cc0b5efc574cc0adf37e437d9031d03711e8167f7a22cf7319906f6bdbe53acb324619d012e3ecc28b9fb2ea1df6fb3eb3595665c76a753deab1cefa56788137488f48c3950e4563be64ae77d7d07eeaa76398a8fdcb03a0296ca68d44e2db9edd41603f935b26b09a15a49ab8fcf040351a5128e5c07cdee9ea2c20982c9f1e3100532ae896d54662bef9b202ca4d5fa9689d95d864f68bb4a9480e3c5780e2455c595b891eb1768778e2af53f8be69fb9342e37814d48ea5d1c981065387633683a633010f890909af11a4caecfce2d5d6352db2a408cef7aff505b241e5a2dc92e8d2fd45ae34b6804bd20d6bfe3bd0c1cfa9f78d46838b9ec88a60af65b3a20835e50b09dd26686512f9f9f303424156bf6f872c20b7f7ef7fd629d210493857772798a8b5775bd9b88055e0eebe0ba8830049e2e5b9843bdc80e83b7da4609b476bc557fbbc4f89bc765bf8f42012477408d0cc435bb0a27048ffd8dc8c23f03b98a8ff3e51a135adf2401f99466b359eff05c5de21c16c47466428098a0f38520fa11df1890929a3c84d7ff3e0fdc6d2e699b88f8f50271dc51d7b0b72fdb1c78494c39699c27c143aa627f32cf3c3a33bc9db536531acf8bc90ad506d7add57fb1e7e23514cd3bbff14ebf7779a639dba32b7014a8012f0a02b0cbd9722b141108a104b4663fa1030121f58447c8259fe7afce114bc80126009b02a296ba03450a130bf48e17ad948c23201d62a354b8736d2f683cbb2020ed1d3e6d3119331596c82cd0d15b18bc4aff84f2c5892d8427ac3815bf3773436d910609c4508b43a266f57d18705b2e440ed57723621dcdef76fb737b2d227ec8a9ce954306012b76f0fd6e306b1e5aab628212f07dfceb5207bcd4b9cd3f2d9d9b11673ccce35b7082eef3e37d0969c1d5f4e63a32584c27f9a583753bbddc4e3e32a5b3668e4e73108d704bfa35fa8988a5942c569556145650d7d2f33d14487e6ce4535ae80a20cc5faf9b483878ad56345c10931d0e0e6cbfae55e797a7a76d43ccd621d62f2e3d9dcd124bc542676cad10e4506fd53a04ce4a537f812589a6c0c29af280b63f3af1426e392325ba9af1f96076ccb55165ac7752005a9fded260f3246553276c916821684bfa0f6f36d7ccdaeec8fdd55db396a9b1de3006a19581ba0cf8df7a14c2280e042991b1a26edbc108207d1d32945b69750ecf7dd4f67cfd5fca22e0a0941b62e1a047a0788433699480e09b156bdc128f1f1ae776f28f67e507d8a838b68b40b1c9a6f3926b306a3a12586cc2e6a3e9119b110bf149fc0b669d546cf9d5c4816c29377543226a8dd4771def0d1327aa747a435f69701c771bd49eea45d47a30777a02dd102885cf77168c3cc65c2869ed8549c551e4d30ccb0bf2e23b3ed59a3cbdcb6eab2d2fcce1156e1c872ada196dccf4b93a59324b0f25984c6ad3a0f22f0f865269eca5d5e17e11a11883f49fa9233f8451d2a9a95fb5af6250cde99b0ec980e2b93e7c4a0f91814e17105c3243e30cd4d1d2c4aa05ce90414b79598a2449ca657e07535f12ba7fdaeac3516b9844dd0e9da42afb91a372b8ed6d7b48871457630529d2745fb747f279831bc5084caf1676f8780dcbbaa951a84da68eaf4c422cbc8a855a6b3b0ffbf8d5214f2de6e96a110d87f3a14e4e1e3bd2836082972596a904c619262afb1e15aa0401c8d4bfd83bcd9edc3294dc41a24b71250d2079c2357de341fba8bb12ead05fd00f04568dcd5b487f40b1f800d5a1f941f113f3812057f18423c00216a6d8178dd238228d00306a178741082a168781ba2ed023dc11002f57208a87ba81620e397444871220569a481f5c5cf80e3a670371dc10e0d4b84c0f29d6a43f3fa501e15a026658c56eed6145eac6ff48358035040403298fbc900d877ff4036209eb21b907a73a3e85841ae3b1504d86fb5a864ec174e0c4f4b5dd71f0bb2db01702b5feaa215c570a6f813347dd76cac6c8dbfaa2ce9524cffb25c1f5ddb5a2802a8d95cc465b21f0daa175235e62f471e0829bd19d507526f771b16e0a805fb0eb0c3c623ee2cba1378e7830659fc26efb6141fbd93b1dc2944f6ef7ed5dda89ff6f9d918d8da5bf1aadd8ab4fd5b31f9e865d0de0f51a3b68ff00f37a829b1d83407ef86dc95b816cf2ea7f68964da82c40211fd4acf1ae2ab393d4e255827d64595a3d9319e6533205dba67daf1e63423623a0eb5a0bbe8d376cc9bf2dd37483bf14ab756411e3f4e2a0713bf9f83c8552447d204789478e1d8c3909c754c19457f6b683d64627d69c330182976e8be9a6beed7c821f309ae07f6ec3fa37ccb05002da385cd38242373179f06b6eb00864462d93a53f2e8adc318a805af22bccc8bc51ad7573be328881c50436ef5d11ea83490ea46a30061b28dad2a0de7be8653612bd43a7cd56edcec72dc96f4f687361b032c9513cd3d131720e2d98eda6130e3d4502c0212987482c5cfbf8c10ca2cf4a1d8e74339deb897f696b1db28f92028fe56bb8320c195de14c78c644cef4c6c502d1cb30dd8549fa1101be19686144d2a81e2335a1b9ccb42430314ceb341a25daaca1afccd89d09dfad70894fd2eb26582e2ddb3b24d91c5597db9f407fd08e8c9e678b209dca9663fbcd66664d4f27c79bceb6eb3d8c920c6f075e9dde11000d052bf636a1a46ce3a771704929134b16329e5c429e50305776a51ba467b644ca059f7a5a2f0457b31019d252d4ad0ca05186b8b5a9869bfce687899018446f6679acbe5f675b94aabd54b844567dfd9c8c6b79411e09967c4d75b40f4c00e2dad76e12515f7d31188bbbaf7694596301dc98edd711cef36a32ea72bed71581540695f1cd7b809bb14b16b1c108387c1af8c05d9d6d16d276aaafabc383fc5a98e0f5ad37316145052e5f5029b636ff566ed8053d9532a1293478c22f0b47097456ca1aa0f926e82b3b7ed22a924cefc5c331409aefbb405700224b53aff3913f1cee847ed19f5b372887174c2eae6abec5b2c9abe5568d294f3a180bc02708482d6458c99576540d5beebc936e0ee9c12a0b8cd6e422da4d93698238a6e60e49ea0e6d4dc4e8713289b3ac85607ee16e65c214ee03e43cf5b5682184d3c8c4ec8c9bf075c3e685f2fbfca9c520898ae6d445e310135fd0f2a909006ed8d0e2903e405dacd3ee3397b270145a49a615bf41f9ee872667400cdcc50fd83477514ad10ba9a5dbb8a365330bfef0f583cc071c21ebfcce2c1df8a25f824ac0b41fb0096b3d021f3804476c9a33d9a5c433e126299e3eaa2fe67d7e94f6c7ab0361646bd01b89fddfd39916294114910ad3808102130046e1a6173a29145b5c364f0659021464708c709281353f4de404d79eb9c7df5c2383429e608bb8245f10e2a6e62621024ed7a4a3a0a2b788e2bb99aaa1a052fbccfc58241adc855e4fbf7a6877a6175937d3d8ddab317f566b9dfc62046a934d63ff6793efc9414cac733175311a6b59cb8ca98101d015b61ab873c6d197beb225df3fe640924ab61ab75d3784c0b99898b022713be41bdf39204c485f3321f677d13125ace169b02a0e626e69b7593c618178f5b88ac49df23338f0e4181b86c40c65d293a76fc6b49ea63ccf1d344cf9d0ef7aedb5b7dc16225d8bc6922b820afeda772834849dd5bbb8cbef33337a0f9a65d1deb908139a2af68337bfe1457811d77bbd7788ccdae93e752b5ea42753cc906540c2a298420100481419ee1f302801c4181482a32ec4924d88cf72374e99de4b266905c09c249b7aa0962485d9704c55773c89f66e38b06e28465f1ff0135515340c02155a9163cc4b3e864d987f184bb7feac54be2946edea5bde603b0872a93acbc5eb2124165062f39580ca6f9bca8c81375895b33d86cfb51fc5043ad124612fb52ee48016a5d2a2abfe3faca798977151669a1d3d171ff159e803ea28ebcec62f26fb85d5bebc2f081a7a908efa9657ca5b3335518ef94679a9e9d644f0c5d5a1810d90f0e9090fce36797dc35994d27082162826ac4f4616493e45fbfb137913c46176b48415026f9d7155c7fc969da5904611944ec9ac9f79073f6bc9ed68ba0588724b279088e6a8ee1dc4d343a32525bf9e225dd0449a84519c6c680c9e1192343550fb28a18c46d92703177a8a2bf315ba8f5aa6f0493d2b853eab3e221bab8e0091d1ce2d6c371a0344a5ca09efaa0c66dcd2e5172648821ca3deb733bb0887a6a57b7c988d4d2ab31f7b3062613d3200cfbc45e2429e2103e9549864875ce3f1134d998b4cd8dcb6e97f6917f5de30f304f2f24b226f9e76a306412e4ddacf6463f16625da2c0f44543d45ff9b6336de0e34749be125a49e6bb8acf0c481d367398be162b4fd6d090b54e44765821fecebef1e39cc5ee4ac8130e7cfc6924e9425b67c86a541bd23d484888a317058b93bf65b2fc50560d7746ca3485c5bbf63e74a3ec10857210869e37f41aa1376f38613ed8c57e0401680082f7a24c70a3c1e0484b9199993d5d349706f90471adfd1b382b03069d336b453c66f98e7f63954a888ced1b70af1c2b68f0f8c4026498d9844851b3d1c0a2fb3734b6b6eed4fa6ff0bac530ec96c44083066dfa4486ebdf686d0d4bbbc659217f130a63519b6c685c00fa13524225945c7907e2af76088c8f7d17a194e7b7f33f7efeef7f987efa9402c75f15003ee971f067ff170d34bf8169692e074d53017d185881034a82fd12fa285ddf2973c4b4dca53d1fa393f22ee3bfd157cdba0545f82b512051e1fbb5405c81e8dc46bc007e7f0c901043a6bcce59bba02a149c323de6d756943bfc463693be1b2f2654bccb97503415078eb2398013fc2391fe65c71ca3ad7a1a38b8137de73fa591924c5a68e2fd240e609e0d04d5262a039c5225e3a10b87dcda4bb91467037738b8c7f87dc179acadd4c59bb76c1d4c1c4a325582f59a35327965c042a9fd5df21e19971fdd88a09955a2776e5fe14ec78fe966bdc6f819485b0010d100032ac8b25c5bcd137965336afbb74380f14e588b0983896e49b5efcb0aa72cacd4c25d96f200df37774a3086c65f974514e2360c709d1003b26eac5edcba4e4a837d6ef206cf401a5c4d393390817983a74ab421802f7f7d3dd42b0bc540a4e21b42fdb7f396899dd0bc1d08686e32ffcd24fc8c873d6a3010761320335a86951b320c15c6a375d105c2e6d90563ab0eb5f94bd769eadf651af2cb7164ead7025232eb4648977c81a401fdc6f60b57a39be383085c200d50bf615c251669e0a758182f909ab9f5709bcf934e0862479df07d85e5414ae0e8a142ca153fc280d3a93274eb9f92954c890acc2558438c5ea1d68fa41ca27a027e74709d872cf7c2b1ade02abad0125fa0e0c0de3674f398bffbd6ddc610dcc8c34e9189a120718284a34c4a51ebc665e1e8a7485596a8ef2f48b6c04f5d92629bf7596a2094c3b29e8f4b665967fef934450a2b09f551ed975a9b346603138a8e9964a02220a7c230f2ff9356243c80345dc80beb269122dd10938da0779e8301d6cb9a60541fe388995af991bd0ffa089e6480de2122606ce9e63b987129a59970cc26771a21583f5361acebe40a4bd2f9252e261c5e50c068876fe0819a92f9b3134679421f0991dec44f8272b905de62aac9df852dca4df0af13b3b2c0b1ec05410a78b60bc80eb8b36a1a99e39bcb2408e9f13259ab00f9b8679f3339202228616c76162c433e5c851cd9eeeaba1dd9d8e76b92e5a6a111ae9548caad8975974d9eee1ddee5880ea880e03a9b70acd75809f1d867d9306e2c872094330252f2cee0a74ff608ccdc5d622fb83ee196212b35e062c79b07b8972d350c6558536a1b5a20606fa12189df5e8a3687cf1b6d20b071335de370904669e446d46889fe870f8e81bb04734ed1dd6940f6af844a5102f55cc22c3ca62100352ef847127800b7f347b572b36ca2f725163ab1a4f759e1c11f996f14fe9237a1dd235ed6131476891c7946e9893c79c1e9ff693fdfcb2b985b982b1cde4fd24b9359140c48524a091c51c9fd5e9bc257d4fe99899d94e84c668b932cb34e97b902411c18cec8a4bffbd5fd46f8c302ee06c38675f360294d037662c4f1ffc6b8ab2b3677ee80b03914dab72149e84db8effb0235373778a0e8f5c21ac08aa4ea84ad2765ea66d081d44ade9d23522a84ce64f4453aa1e7683e3800bfb718bc126de8a1ebd7116234fe5d0ea66a1862ff0252691e741ed0330b2a845844e7bc73accd757cec216bb8fbcb09784fb79b664180f78804b22e069038b45038b41d8104833dc6cbc80aa8894dc0c83afe91e2f42060f3a4b6d74a7c83fd23319638cae0882c069b48ccafd37f8339839f39335f075d0e33ffa34d9f444d5324538e86a56166ead79f9a4e7825b1b677248bc1434549e2bc53980a75d1d27f20064d319fefefd403384f922fbeefabaa78905c18d6f8980ae0f15671c956bb37c58a57dfc7c7f2810e0b7456e446d03ae51e35463780e0dd454b3f35dc1f4066d1dd05f241fb4856282640ce50d86629c08ae900231b3332625ed04c5d466aa6a7165f9cc5aea236e2619fde94812180cb6dd26f7f6513fd90dea50e0cc48cebb3c185925a932ccc9bbd9c25eea83ffd9d26dbd10f676eb9580b2ed047beb21b45483bb89f13e15a3a3d02651f389d2579fb55e4560dc6857aba1a5a54bc90f6a11386c4934f2a0083ae17d6cb7dd287a1a831afa6c00d041f49302c1f0c250ccb6c150c14cfabf3a4ca39cf67e66770589043254d4b7088f2c37aa98c9f681608e250b5c4e74aff00ce38d255263cd61480cbf7ca0cd87d8ac946816a7e5c34caf5bdb12df86eda77352519dad50904bf180ae2fd6d261784c74cb93336fd259270bcb61e0fec695837b3c6d91771518676fa039234ba35bc31d74bfad7dd8625debda5b7c1122df9e7acb17e4923a9fbf3be07883f891fbdb841dc3d9c7695459097a6864e3526f3303c7abbb853e220598a94c18755499ed5733a8b3e823b7d567bf560f0d5735fae890a3eafdd14639e7610593f47d491a815cd43a330c670504348201839cbc0d30336e8af35e00f2c3654507aaf9a50ad2f7a5e09ed49375996216b50e3718eb9dd5d2d7b20ceb0dff8962d8e496f775dc13faa089e97e1138c2939b9a18c041cfa8aff595cf892d37f38ba60f140c27a8043d02942ece898711b3da43d4b471dba9244bb7cc299c6308d4e870fdf2d91966fd53d01e32a18af5fdb9470c745ac90174010ffa6c782a066dea412d4464013c5359c46660a437078b88748bbb2326ae86761c4f7b37e7751ee594debecce4e8096e9cf93acb07b66e5f201adef44072a9ae5396daeda243d8eb7b6d361c36c397bb45d04a781b3e80655cb46fe90e6263d36e4f95e467ff41da8c8709b721e071f4ea8b52a58cb4bcfb4e46b4c092652e658f22868c5c18d71d8517a04e6e9e0a361396873d3101dd308247346842268709a59bebe20cf28a11f9289e4f7590893d76a75fff1ba5c0b021bf7c3fa9f7eaa0fc2c4ca4a3e3bfb7f8b97e3104eec261222e00c5b74584b9556a80c161e1e402afcd5d77ec8c1c31891dbc4dd0f2cbc141dfe91701157e62fa3835dced2b920423b150c24bc53ccc3c45d82ccb12b601e6be1e521ab5f1d6de7a721af629eb304518cfcc1e29ee88af28a1bde725cd28d6a446e51e1a93fa7c7a8637476b4bf20d0a250bb84a237c66db078901b84872d8a8c0aca8ced66270417510ca22f85a4688044f1eb81009406bffea5e12ba078145bbc2685a13a52e3436c73e1edc727d3c3bdda3520e157f3dbc119238c1b777fbb9122b40837f88628126f1a79c7f24e4b65e7a308d2e21c2602b3968226ccce8bc590568d0d8f888dacc0ca77f93975b36a7eaeb41540f8c98b1def664ae75824e5d678396e3699c472c9ead5c236913673e2af555c62780488ff4afae6c234b42acb71be5cfbfc7ba499d7e5568336f30ebe3016e9a50d306c591e4bb76710a6b99256098250779503fd8f4996c209edb51647c5005c092eb393785f66ff771b5d2b6bc62ba9453f092ba3c3d5a73f70b1907f61b1ed99fc776909ce03bce5e5bcd5bc8580657a574b0c344372d1f0f8686bd147e7b32f970f5de10dd413e6f7197c4dc32f3daa2c50f29919d5710a8821267e3a9310ddccb2d2ca0d530405e84534d92be5e302867d28a251609c34f0050519812c0e1705609ec94716589a3216e231b5e1118e056e7187f848550f8445bbc3f5e8ac2fd5784b6cabc4403f3a0e758b7605c0ebb25afd4be47714e17f6d3c01b0525549ac8c389179354c54d58c14e36af36a96feff32a74e34ab039906aca77d148bea1dd5c63ae963ab6ca4195b9c2030b437d28869fe0d43c5b85d7112d9b2eadc1b17b131bf7d334fd17d220748e4f0f60556ac1c018195f5d4fd0170a686bb48376cb8f91eadcff4f837903cba62daa49bfb1a212e5af584bbb903df4a726489002127e5642b7c5fa5baad017e639f3885a6ef35b8102d4a1ae7427654439282ec56fd25331f15f23e501cd7cfa0bb38d6e6bca2a0765d643978145c26f2cb36dcd86de1ced379e5a28380f808de7e328353f9e5aaa73c48f3b1a29182ce8dc840a258711a90a6bc7101e27f890b387870964616e6143ea027a59fd9880cef92e31cac2955a7c77342c0ebf629d29ebd12746705d6ec2fb3acdf66b9967172052b33599a23b34c03ad91ef32c913890c5dcfa14bdce08621631928541708a44822174712b4efc03562582c160312077f6a3ca72bb21737e6f5654507706d3ae5e1ca32ca7805da4c574fb0ce0979c100726ed833c149ca2596730a508fe2a8195930c48010684a9f828b7a537c46aaacf5380ec26ecde403e8acc4161c20a8394b801af0e3e83de5d34bebf73d68bf36841650c08ed887c6166964a399adab08064ab618dc2f3936786e5659807af5c940a4c2a2eb25853b01e0749021597400d44910ae424e810940245a766995cf1cdcdd930e5238b83ca19343185ca5dbbe12fbd41cb4b7072f1d63bdce38920714c2f99cffe8445c98b9b0e2893d83deac798dbe755fe2eb064958d7b8a00e7810f184f7ccdce7d54da7000da75e0efe9a2020a75c3e86930294bd100c6991d8c5b9068e5456475150f3a4543e7891a6bc254fc2c95a769b2798b61791eddf6dfadf3671d68047aa61a7a77901a57d65a2bde4cfde033675f9cf3919953e07ec3dc5590da785f5300bcbbb67f5d3e5b93837e3ac2325dfb31bdc62128154a84fa3146b9fe7f7e5de7e5118dfc030cdc9b99d0cb3c595153f57f8774288ffe5e13a1bc611c753d4e356dacb9b8feb72193fc1b68183da7686a501711ba50c3383828a96be3ec853c7ada60a27e24e87996de0662421b8d537d5eca78dbe37b1991251b562baef329dba439daead98fe70a03dda0a56f7f560423540c86a56042e6250f6bad920053d79c11d9682a0734526fa737628e9b67b1f071133235867144c6ec1eefaab320c24391f401ac1fc44d777f55de57508daf4f97ac224018ca7f0c8a5b924271a5325525bc0973ca538cb42b5cc01a64a2c125618f02be18a0b496ae455cb1f7d5cf546356e27bbc0646c267fa5c0b3de3888276ebe92d9ef749f2b3a683aa07be355206b9aef30af9b811541d2d81492d181915f5a07b98aecf5e90950b3532cb0324cc7d47337f3db9b1ee032e1d6d359d61565c8902d0d5dd0ac5669884e1afab9210f988fe5c9ca6c1ee180ce930e73d99a53ffa67077c656e8803b89d84b7dcb53c9b3271985972c868727c17d2f0c7dab97ccceb505cc5324bc274b5a6d0aee3367e397714ccdaa2fa61c8cea112788a50509644e80e9bd05c39a913981404592bc97e85d5117d5f86e91687c56a0d8c6c9e242f2cbbd6d585cb59b5b224648d1834e65e3a710e4830b0413608566d1159fc02c15fb85cd4d79121f9ad6af15a7a7c1b9b390d687fb331bf7ea54e9ab98479f116242bda788355120c4f2a787e24cc5c2868975dae588f4ff6107f5c8dad74bdfade9268283a2cfeb985f0842cfeba4f50179ec0fd1d52b68f55c398281ae1aa5fcc08a256038801002b2abea0a499891a6e5fbfb05fdb4d38995b2a08cd98f26f7889323b7c05bd4c17c738b88c488c29a210dc30769707572e9606358599c2fc0b3acbdfbcd97f50dc63d05bb240118a2db796ce84030d67bbe948b5a35442b7fd28bbfb155d0a11c459928aef4e4ef51716350364b7aeccc499c15fbcc82ac141f59cf8c56a9d4694ccf690bbdf6a67198fd905a205419ee0982f83e3f0d53134fc3df9387b19c26299b49c7eb12fb60eaaf1256c9ab9bc355711b9a8b870e571a1529654f8533787774fa3be51edb9e978a18eb14244df9ba9a065806cafbdf848a0e021d4fbbff1e0f9597e9b665ce47e54310dda74186b7a64b4e7cdd1bcbe73628715d633c1581e60625870a4087aa343e54b560fe10feb802641b70b14a88d04563014e151876d25b5db543e4e56ac5a38b05e42b63db694dfc96887a18607e2debe3ed46a0e6850acde04a225a04e84a48db245ad55138e1f64ae21f5203db2b3ebf1ccb81c28fb7cf563d71ab18987d3d474a2fb7ea89af80cf3adbdc35b2b4e02992584b05d33c8994bbe31523a517928f4d1ced7f44e5459f002a3661edb09c0b02bc98c0ace8d311a0b22b114042e11a0374cd4126e08d1934ef3948d9497f67dd652690fd559fc133168d8310796f7ad9859b7a4b292a450feb7da74f718c6eb77b0026d458390c97eb42fc9cc8be20a6ddde8f468ac36b41e4d059aa5870e4c9e377b4fc37ccf4400f3ac3b640fc8818733ed09538cc4039041274dc0d874ec97ec4960e6b858552a134a220be39147a84e38167b910f14149761542cd551f85050471f23711d566cd56eb5d22cd62b6da06c0cb1025e12585c412a76021ad3b252e4e4a15801714a65740986f8c4bccdc8d151012aede85849ab593dce2cdb162ba9621752a9096a24179a1cd8f9c6cd91400e6836a324665cf28c6577ea4a616fce201360082e06f75eb39e04bd0d5d8dcf12e1d93fa00a39f1a2be734f4239653d8376df0628d9fbdd4ac06ce1ecc9654a237f6199bc8c9d8a677ec55c84c37d8b9ecfbcc176beef2b0cd5c52b7e2d950bc6f364a9b07b12466dd1d9a457cfbd8d2663dcc6d027ad56703c2fcd491b8a9083187d212b0926e08caf54fad74a9bc857ca508b34a19ae9291f368ef57070d837d8db0c2b37e7e0497058debac08897e061c4813dbde35f021148b75c14ec8308b28a3220100f2aae0d23c4a1880e988f646a66c05531ecc0a14d59a3dda62599187b939e929b0729a4ff9812accdcbff7515e3043307dda9365d50afdb8b2e8711863b0aacc67a20c6ab48fe186e2935508c4ce5f86a2172b34935ef36538270d2b9f2f421447c9f4e206df2267acc16226fd158ee86c75cbea79f90799f84950bef8b53382410f7e6c7b00c0330a6e767f75b8cfadb6cd91a1e94b0b2e738bf9d516f3da011798f7a4a9e4f7fa8b8afe69750dd422d3c9edeffe624452a7d77f9e4846c3495941b4d36bb0bec509c2ea4b96afad4e12810ac6b772534a98808d52cfaa405ab7eabc659bc26dd1e642a3303549861f6953d246c6c6313926eff76d5cf01ec6e6736695a435686d13e5d9ef624af77a67d734a91a411bb3734030941ff15d60ebb07de4a048104bfdc8f601f5ae1f2250cae4fe4d01528e81e42eb4fc59a8de322752a6bfde882abbf3bd30e603e5f4f9ebd4e0de1dc7c6817e0ccef42c24780d9e309175be530821e4ff0d19a149705c4b009369b641451922a514a5b5eb8d4e568da34de7e424b004f1e18f2f0c1d652827da119ed702b6a227319595dca515f2045c161644dc9ef7ca26f86cf9ae67eb3dbff38588eb522565cba1f63097fa1e6193a7744a8b8b1b24d086d55ed9d7a915f01dfa08dc3465d789a6956c51e9c9197c8507014a7ed28398799559fb89a66bb8677415f624803e8799a6bf26b1a85753080b9cc9a2de940c1dea22090f225620a577476e09512c4ae470c78f8f53db375c2c4260a2a28e460f60cde98a3a50819a8370a07f194841d31598b5c1cbe97b5123f1d9ca7ba5624c787676ff3210ab918a1a24a3979ec583a037d97a73ddc89bc42f591724ed40fb4c1bc04434a86261db7710024ba3cf81c0fcf03b44872d53b145d627c0f4950114b7eb49f680c4c73c6a6cbe44e9aea3897b6b0f8bffebfee7fa43ffa9b2e5f12f1bef32236ff48265a3897d9c5ae173b6ae10f3ccb665105764e112dbe651c9ad4ea59c19a1640dea980948154f91d884e802257696197666a84024dbbf0db1ee396a0e335529967d98517b3a219af61566b501bff3389741dfd406caa50a038129467c81b6cf8981f1e1c6c13952d774b9862354559d4aa652488586e21b443c12f7c98b59da45c8b5158e284c61d15325ca81b53e28c83fb5c4773214a2f9fee4164c6f0ac14add4a69b8ad360c29e3be0323b7f81638ec9d323c2e483b26d8aada4c9f153e864bad0e9da21f95ac101a5ea103e21f1c917bcd8b215ffe30b887a712230226281773704e9e0c74b5110d7a43d3b3b05cecb4fd09ffe32545605ba9bfdf2290e17c8a57bfdf4237a2d312075015e37ffefd169cfc55e85bb060e5b2adde3cfb519f4477b3ed015dbcaa1757cb964f455ed7db91ea833eb7c9314e7694ef132c05686fbe7d7a40fe39fd1f977daa6345a0e6a7d0187f8db7c20445bce24ac3f36286ecbf0a1dcb22b395837026427953003601f4a45e15debe58ebe0084cfd3ad538b8c62ff65ea22dbe794c19834124a23942cb73cfd41968efc3f65baf453b0b66e8579296dcf1ed734803b44475500b7a65d0e8120a4141d0555502cee1aa49542c50515c1231a1d289becfddb5d482858e45010fc4db4131e99ab54b2d9dc036b060af0e348b4e8736ecf57273b72dad3464f2140bb1906688cd2285a1351df96d12c9c1924355b6b0c30fbb8baf308273439fa928f10d4147e655c5da79bca4b24c195b18eb12e8c0844718161d5afa58d83bfda926483267637d70a8d84ad4b7f0b50413cabc8bcef295ecd376d7e012a57b1e1ee7c50d78451421e437ba8ceeb5604f2ac527c855b9f975c16c9df82b252238d265244cd908124db9c991dc5ac27269d2afee838ed05fe6a2d0838828b0d156aee79b17e17c653c8d93f3b0271c72efb95185624b9ab65110122853ca8b0ea92a9e2856890cab741f77a49d61907b4fb737ecb5f200f2066ba6b8c9728212432ade9aafe46e81fbd914c959d5acaf74636dc3930c375986f6c02b93bb3faa486911744259558350a53d0ee8c285d65bce272bbfa252e5ab5401091e12aafb3da8269b897ada03631c0cd647aff46336074b3aa12855c0685b59b65a715cb95020801b5415f5d5cec83a06a1494027f9f72ef02627b6f4f2c27b2957765ee155ecf61166e95bf0c06ea6c0e28f4440661b0c762f50e4148a36a2348a521bbe5b08fcf60fdddcda98fd00346c63ab30697b8fbddd84c665e4762ace167a30d141690130a9ae50e8ed290c0b47e18eee8def1136f0968dc0268873f87b00b4c296c21f78dc1692a355f3d92f27cd276c9e4401b72a363ff24598da1adbb540c02f16f4e1bef041814a91fc7063ed24309563cc515652dac9f276f7cde48a4da8252e43527a5bd3bf4eac57e383d80b8077069e0cf5e541a49c6610d48c742505414ee600bccfd47ca2fa5010317f3553a1f74a3542021914a26a193b8852d6e6248baafca4f81ca6938a514af70120410c5d2f5a2880c4719867b1c955437d988372f3ef0a99465a6c7c4532199b8faaef4948eb4bf57bfd6792fb8f9a10ad98ca6251ea9bc4779ab8e659e080723397bf22e8d0ae12dc7164a0c8c983f06a9fdadb50c944cf0f65637be07c9b0725ce8d9321c519c19ba9e0f5875b783d16b817a38b798ce912be77d953f438c3b7e76168153ddd6553f0dd150d1d8f8253bbb7650041045de2856b280d2a599406faf274300e15bcd2805d14ca90bd34e845a54344d3cd8d48134bb3915ca66fdd73bd230cb148ff5449193f3a26bdf392f547da71ae5863a11282c7d8025d81b67e091e0eba89e05a7e7b148b84c4ec0805314bfb84d26c4a7fd3f086150fd82b06410ff10dec7df4e2ecc442fd381b33d7796e5aa1358363b4d394706dc43885319cdb93c94bbeb9cf7e7b484f5ab55155e9129f9344b8694d223dc85f444038233ed7123c3169e8c0065c0adf09baf5cd9454a3f24975b1725e83902c55b9ccecc69eb8ecb898a3ebb2a4010820715bd2a33e822de281f6155b3e6d591e1e88e0d454f8f10c2d714241648930819ced2a3ee4dcba7dc568c30d407895c9d3fb721872f582c56deccba25caa523a3d01cd4d1c59f78da054c631e5273505e11f685ce2146c42070c54421d74a8a2c9657bb9f3a8663f9a8499e247592f0ef243e96129c6a8008ab6d1c7a16d08b7628aaac320027ee33408924786f7abff2ad859509851b546e33638290b167b6da07eaec8614922ec2b60314e916bd093d0368cc03323c3d025715998149e683eb071213871cd1231d3ec40e81283e4f2a330fd262cc590944a20e454fef46330809d9e82ee3f16c3f916f4f787da0c270660fd68f5a6cc0ffac63bfccd0ded2d40788be649a07c55160ddfcaa3110e86678060acd526c84105f79f6e26bd9f12a2c9c11902f917aec45df262503aa6a5feed6f2e451ed09801929ab34bcc455bfbd4c5a310d45c205204ddff28de87ab1bfc4083a83bc9af0ff9f42dad1aaaebb350420cd02f0af7e36a3e7a053e6db6c9ebfa688d5953263166e7e58969d6a38cd7070d68c65a643d24dbf1d73ad6a39fd127c6583ce81598ace6f7de03208256e23cbd3c5d322dc08ef08efe616bb4fc8c24fe0318952b3da9b9330e16f54309c278968cd4700fe8ea72e34cb946cbd7ce3ecfaca9fd452bf450f0c5a1b67eff4200c20ebf43683958bc6f0062676168c4fcca02cf96c20fd89fd160c1ff8836f4ff50b784b62103769d5a20e8e753201ccc8498fca55682daa67f6464208a944e2d00362aa52a00412d1a99a75fd462fdd42e86f1067a5071c218c7c0d2156bf8f2ef55241881f6bd50b3b1ca2fa70952cbd0bdcd0c0fbb9bbb795a663d50093d43191010b7b0dbcd2fa44960dd97ded60cdb704194830e0cab7fd02bad8b92cea7124578b8d47ca2044d483d2cab2ea74cd5e9bc399314f4902f5ed361cb331678c9ef2f539a1df2ac3142254360cbdad389292df8770a1a631d5ef8bcd520d3d29216ecfb0b29492442998f76ca427571807ceaadfa6674c15fc02593409e3c555b31865bfc33f7e1f22e44959ef9ad8ba5a277ec2a08a9f03c413bce39cae4316eb6f3b1d6d568caeddb1ff35858f6b8595b391abd1f757a92b94086afa18f602822f8ce8de68f70d9e710aa732fa63f384cec846140678af8b3fa6ad59a19e82198224807875a51378ace0079c403819ddeba467bb36da59b3d406f5df71ee30e003d860ee01bdc8a006fb115806fe05700dcc0ae007003b312e0267e65d6f6eeeaee5b79778f567ee108547903aaa6d2895c3052b29a0e66f1684e3d4493f016222efe082056f36a834fe9959a8a7b01f479944b6203ea68d115bad16cbf50a18a87888af033f7d17dffbcf3ed0362e1f9d64f9517ed129555714dd45ef5ed6a9aeb61db8decbdb7dc52ca94920c6208f5074409ab1e24aef36a0e5df43ad6829166ae98f14c4848f1660824533c4d8f913e0bdb4c5ea8f8212121695cc416bfbef80152cc113f1487da2a4aa313253d2063b658c1f23bb1f4635aff27926825e6f9aebeb9fbca3a0e0e6ae977df75347c6c299d38565ec86d15c63c0c639e66695ad7e1d80e87edbaae9f8b449b7e221c382b269c848f3cc33c22df6523a35ab9a391d2e6441424b2284864247043b663eebb2ebc3adc90918f2d27598b6c7574bfeceda329671bb242b8880f0474667bd40e05dfe5628e09d2ef6678e9cc040358ae7f5f844cf0d21917c0725833d4377cb766c806e0659b338a37cd19d59a21db34f4421266330ca07f9c1b0ceb55b776020c17c813f9d8caee8d05df5ae258072fff4000e755ad859469edd6094e29903dc15bb5c8a7571eb2f063fbbbbb937c357a55351e5eb6d6ee46af7a73ce3b770d9c6110a7e7633b9b0b719ac542d462fa607ba303cdaaae7dfd316a3adcc694a3bd6cfdc067bbe2d425bebb4a7277770e9bc8ff78485baa4ee7acb2ca5abde5fd7474ecfc0a7c4c7bc8f7971f896a18b2342cd97e6fe6c8f64d798e63013807b001a356024b61b054de1a6b19433adc90edc1b53e7f36127d98fe9b91cfaac8ea9e0b81b9103acb395acb948a18c8c805187668f606b1ec8266697877eecace4a2bbd55a3dc4f30122de00076feb5b9ab0fe15ffef45d083476de173bff6eadd4cfd4cf84d786d53e84f0da307d3135156a1f6784b77e618c36a8f0149ac2191dce812e04b1f5ab46426b448c3a08731a17eba2eaf6d08e4babaf7d0af5b597af693f79ecb8b4075223431f29ccefea0cfd2e0402247e3504f22485fa5a08e4c96da27d0698073078e2e53a4190f0a5bd160639018e775f43b7d971d178d5d738a915d01a0d19bee8722c3af879b9e8877ce436ed217b116ffa5d1d05775c13dc71f14b1005e7179016dca67f05b7e99f210c6ed3efe302d1e5c205a2abfe05a28bcea894e34203714c0614dbc0fa13d43a0972e108d885e621930f20f56ba88517882e1e16d25afbe8aa1d5d1bc8ae09b22b9a72a2d5d13a3aa9599ed44317dbcf5e30035a888f90acab8348aac578583971227d1dcd6db5d6d7428ad3435c163e8697be46b5edb5908655d399b19183d0694f6ba745edb5e8d25b091373ce39e7e4f047f30c98f27c0e753c2bc32e12638c31c628a58c31c6253aa9b9bbd42878e94777d7a40c753c3b7534f8449d9f9d2fa59c2fe7f790e19471d28f3fa48dde61745d8c56f608360e590eeb141f9f292811ee6e779943a93643dd368eeb3acf33cdc0e0e974427d2f26f7efeefed13a2bdb355233a9544c0cc7cc130c4c4a2625232303334346e6e593919141c99c4c3232325c1733f874777777770fa13d42beafc8773f8fc23e4a84854e67c6f237c8337488cd185dec4ec62adbe5a49a0c3ee404493b81e24dfc8deba457fb8b3726695127d497fa66bed40c90167ea46aa0606052294ecdd3d7ab1930a89429272615131303332326e6e58b898941c59c4c31313101f09a745dd7df7ddc1dc38f8def1e29912f861af9aecb88cc496995409f468d7cb57a413394c8478d705da53d1fbf67ca89f186e31606ef477d3e0e9f12f93a540dd4a34c26d4f8be979719a69c1a5e4da32f7524c3cc8079f9605030303030273ab331bc3a74f6f2451799ddddd999d946f904cc65b6c889a4184ad145133a6cc0bc73ce1941a97943d1754768c124785d1040c800bab0f1c000a9a7cd6c2811a16e4364645512137762da94a894133f56b6eeeecec180cb41fc8e71ebc1dd6397e58b2894f5f096c07259f0774eb8db89b7b7b7370883b72c106dfcafbc40bbc423deb81629bd8a2e1d857ec59ecfbb2d9ffffcc1e71f65abba7ca8065d54bd9c956b205d4af7afcfae7de7ec6edae1a10ce59c524e29432f9461c496c7cc7432738c36f2dbc9fc267f65adbec6fc314763d69843e972ced07dc236d2d5a54fea7043d6c8a76934ec31bd47537e4193dcc716cfd70a88ad80566d1bede357d5ea86e9743279617df91ba83dcd91724a3965ad6df3f58a6a614dfd683dcca9218e5ec9b086445626544dabe075a105bbbd565df86c0d6f0b760b7b685f6958233f5e1254b24e51c20391a51d9a28c9a205b01790a8b8810b0da49012cb42e4056fc84e114fa60c49e1218a2bb09e0b38b1822a473c5952050c1e1ff18b29829003307e70d2451832bcc0021b9e2859e2411086cc3806244a5608c1c48c06214d0879e1013770c193256168c1831bf8e5238a17645c00834842490a66c8414f165d7c2851658b2a96387212e58b3204e042c4224a0d65ec60074d90901184174270610345aed0a0430f93299470994d86aca00533307c3005103c1c2c15c1049132863c41868fce85e843063dcc8498cc9210a2618c9d253f44312083e848169ea538c50b1d57940f194a2dff8cc5567d9e324bc5acada31692e5f0fe90b6c891234992cca0201b7fc2424bad8713166f38bc3a73666baf24e7f35d9565379960c3d250cee2cd0cafce84591956c9cdf61f6ef0b8bbbbbbfbfc68f299335d82399e05259ba5b7958e9fe5189fd7ea0ceb905aa082b75af03f406cc97777d3bbf74eb480113477ffcd7d07f52876099a40bba7d36ff3e76b9aa6853df427fff6dca989f61ed8843bae497d5ac322f27be694f2a7ec915fbf876adf53a9e6d4a74bfeb9c34e6be8a2aa8b2df878388b0f105bda772f7f4542b3507f7ac9fd5dc00852011cde10acfcae9b04f75e9e8497ef28a87a01ef53802da5da476b7a0e94817b203b2eee35d0041c78bfef5fdeeb578e03392eecd9bed2e726dc9f400a5e1ed6eb7eebc222daf7d4aa695fb5d87dcfc67d4f17cefc7b8b0bb75a6b18a38d8c1f9f861169eeb86b34e8a2aa19ac260944ebe5d400091c9c38b9f28cdb48668e36f2551852a2627d482ba5152b7fa6d02b293b7207e28d5c61e8bb3852461d113e101950830d1073d097331ee2c41c6edb67945f83a594314a031121049b96b29c119ed55a6bedc641bba9f49a1dfed2f690e18d10c772b8f2a93cf36051091538f03a2dfc206147d65083c9153860241ead563838b71a795af87c8c83f965e04ea6adfec9f39e4d5e17b24c6539f0a72736c370863f6b0881a185aa86101859f8b030c5773916fb596a9f8ec97e7a621587988dde6fe055d9edabbb7b78b7af324877d756ccb9c6adac576bcc7edb77ec42aab295039656146c58eda3263b9e3d0c711fdd9e7e6cbddbd4c95a6b0d25a76da0aa6dda54c32535d297da530d477329447add4be9ae79ee9ea6554d5a51e9d7ad7e57ab57b9964e48707ecbb881a9b631a10b2b5b7c2dac8de56359a5d534d7bcff6d203bd61f69f8381ec6d1382c242d596e9b1ca5cf1b9da1cfd80ac6211dd2eb10ce0d4d07af7ad5347cb7ea90e193d2325386f968d64386f17cb7d6dab18d352218fbb08c97d4da3f332c772d09184f4c820817dbdf5e4424b8cc9acb6ac85763c20a2754354993fc2fdc4c60cb626007f58afb8e7507c312c3502736c1a409364dd2f3193b3b56baed034c4b721b4d1b400d80b081e57737a130801a005183957b563e9ecfc3cbb0da499428f6f3fced41b3151cc9ca77bdfe6959af62316a39ec25bd6a253a06011c2b2829297d93b974ecb292872deb1fd8d77f3bf665a146969963e40284c709337c35f377ec8ef972090cbde29a08b895cf2af40a48af2270e391b7ec6fefef0e6b50903bb677f4ddb1f13bf68a7bc53e5f875765adca8722d504cdd2a078c3527cfc97812c175123fa847b7fa5150ebd3058cf437d3fc1e8ad1554b05e78bb5fd5f8ef58157ab5b224acf02fe187840a5f34213cbfbcc5456dd34f13de1ac28c97d7c7cc1e72c0147220c8fd65623cf44f3d9b787821178fecc551abc3589910a657cdda1e06e63b18eea3896b9c0ff216f7b70615cdf84ede735109ddaaff85f74385f70bef4c58e4e1e0c21b95a0efcda14ad5abd78fd9f587b41eea28811bf2757777bf04993bed1e135ad4d185a619ae27a97b1d3d63a9469f7e3abc7bab813ea4059f9f2ddd66ac6bda8e7fbd5e967e4f146cd4a0c042af66f8d1f8fbb3700f60fdda58bfa0f5779f71f722bff07c91614c8768643b14f7ce2de9b5868f2d77177e181f75f02d573ded376e55235b4155db747f1833d3bb0cf91daaa8f2689694b3fa0913e855bfec9c5f67c682ccec352c83df910adefa3ffaa33f3a61023cea7bcda2bf6ddbf32665d524eba0a09c949a7298b9c637373391da7d05672e100efc78ee97ea95f7ee8571cbd9b84da3ffd90eece12f2f7f29c97d74530e575fe35efb0da4e9f2755dbfabda34e56c7493d5abc034d245d5f6f304182cd7bf40b86fc288163672b1b1892249b6a3de900e1d367cdd8d2df48a7b189ec15e41a0577583a157b5fbc1a359bed5ed7566e456e946ab8c3c7ad53f6bd80ebc714bf743a059ccdc7bda735c34cd6df2d7ece00b8219db63be2967cebf513dd66c96dbbef2756678dab97df1ddaf89bf8efebce561eceefe3e1b8477d839161859e7b104c807198c7d988785188a0a4e67cda386af86fe8ea55466119566517ef5aa86797c7ae55fc33206ead52a855ef9734aa857fe3722592afcecdfeca6fcddfccd610d0a72d6b53fffe5598daa06871d81b43db884211cbd62662abf69370d6f0b56863d9ac1a6aaee4a9bca4a4117220e0b3a9c23e292855ef91748d6a9587efe7cd075d1ab60f7978b7c35f5776cb5818ba5b1912816b3353bea9bde145ed3d7dfb19da905f9f341207f46dbdd8e9d99eb9bbe73538efb9bc068b98fb68226446b7a1956a7afa3af09d1f6d0911f8240fe7c37e574fd8e8217f4f143da186fe84fb007ff7c25cb96ab20d9c861cd0ed95eb33c7aacda771cd8d603b98b8dcdba418458ee5767b7efc0ca81d172dceb687e1b46c0ad6fe0e6c51b7e0d34c59bd48c871e6b3d4044784b24c1c40d256cad499fb462c15b499f54352d31cb13732a9b37cc54db4b54afe68019474382ebc6f056e771347833e555538d3759e8ab599752591da388efc6a4246777945b19de12580a745a01a53d5e3f67c34789a04714cbc645dea2eff33d6e2fa95ead787605670c9c3fbd42da81b482065ce4f374389d603895ba18638c318620869163e4c8d1a54b97eeee6194dc4474e1f518a58c31c618b28ecf983fc618638c5d643645804dc0618a0033333333b33b33734d04a6fd1ed3a7ac9b38afa05b1aa63f7db799724e753b6d26eecd07cae3bee3d8a2bcce721d68faeac37b1782bcec697b0ef4f1e3ebaa29670b4da6186f0cb0855527e5d31390840a173aa9135321d86bad35e42427b9aa3dfd7e39b95ffe901bf715f37dc7c1ab82f50abedbc809f6fb943588dc91dd45b03b3337f7f80ade39b37506592098b88aacaf3ba621e49b305b5730914580b83a85b77a33ab7e0204b98d17deaeeacc191f413465cef808a223706c0400e752497fafeeca6a7e6b5857a5ac4b4d55a3eb7c7bf7299d2d074699a33dad60ffa4a1b20594ee9dce3d89dbe186443064b9214bd3e5e386da886fbe7c36e5b03f833adc90db1d314b1244b8a19825892175a80cde5e82b78497bf07b03ce3af8d65d0f2c9f45fcaf2a7c2ef5b829ddf7d20dbffbe2fbcf26bb4735e294d39db6bfef2d2e89440f905a6440f2e512d6d5862fd9dfed0d561e9e3c081b3d50daca026410afea052eef85eaf97f59fe00f6abd4b972ed6a3c9236d0f82635eb69301b7a75cc224c999c48c2c943412db2d830c08ce3ad8feeb6aa5e17c9749a97831e2c228de784954f39cdf374982ca1c5b33d2a09ac8ab0b23fd6b41bcea76f2241bc716bfa24d7f931528a389b10ccd2de8818b922d488c843e2b46eab2160c6ec33e006deebef96f95e3bee3366ee3366edb36df42f6a14a894bb5a9f82e03794b7b060282c15b5ae851afa6f839046206620602ea959cf2ddb89402db615cea983b8da2db2265777787f17578a9855e75eceed857474a29638c1ddee895571c1c375675e60b6328ab9854b424f1c590c1e5e3228b1426263e98293e3f40383849f1bd64610ae2e3ae9c78f8ea1413966ffbc12485a90ab903a5d4082ee8c6751db751d38b0baea30d67e70824a5d409a53407a69479666c64d516ade0b46e29d8d166fec6d9a9c5d5941b6c86fae4c8ccc3978242e3cdec2092074a2916520687ae255dbf729e724e09c5276d24c2c106225f0c1946be182990f868f8381b896ec80187cff4c487aae1d3b60cf1bd6461c2e29bd144cf77c37702e2a33612fdfcc86923110e3910e9ba291f3f09a6180620bd1e800d84d784605f2282fce9b257e17b28b324c67be83822b86d051c638cb14da70eefb5558bb74d6b3612e180e4c341a2902c8d59dec248144fecc015ffa5e76318d89d1e644044ca1231c8e84188eb4e2523150e9ec08a00a3090f1517438939240856b6873f3f7d35cb3f45bf53a167a8b30ae7928753696ee9157fd7836f1a4d2b31966717a82bb30b141614159415dba823259490126a085564fb512f6f6933d82286962351c490c53584bd281806b428d173830e8e2c8185eba25e602f0aacc28822234090c24a13d74509612f2ac8f65fd40c0525ca1851b8d83e2d0d7931b4c5e8746484649464fb4f40de7200106632a8e2055f1cc132b3f73404d00db00002133fd052e4baa720ec3de9c8c1480ea018c387480a5cf7e4027b4f45b6ff9e8c4e5666915392596489ed93cc76ece463fbf433814c4b13e8f49a402798ed370d790b034b32213cf0f0021b7a9ed86b2a321d518124890637d8c118ae6b7262af29c9f65f939269cb1553942b262903b0d724846472826482a26492299980944c4148dea26162840e96d05086901bb4c05e2f49470d3c80e227072d6334e1ba9e9205c25e6fe947281646d26c0a1610b9aee9f583bd2698146dfaf9c1bbf203161b7bbda319959915db1faf2764bd21e915dd40a282091851802146135790bd1ecc7bc1073bd020081e1f6465b8aed7c45e2fc8f65f6f66db83228f8c218f70f1628bedbfdd92947558b408122a72626f6704e3ba9d1530ba2460744b3a9feec776275be29696ba5707f356ecc11640b0e28a1d845062818b05f6724539969cf8810ec8486a22735dce6805f6724709d8e1a70788285a4c29c37539241fece59238256ecb152eca154e0ae78483f2f6724248dc1224ce878d0ba322208e7eac0c89c275b71eecdd543288a28913a4259eb8e2badc8b077b39580ef67231ce75b91fa2ed0ad18665a3b259b1bdf1df4d8aed4d09dbbfbdbcb553c3102ed062c30d7e800312137b37181099c111413082079e185c778b59207b37590ca6c8020528e8628726565c7703dac1de2d689bb53ad7dda030198309172fb688606f5d0aaa4741484140deda71b204831b40e145164764a8c0de0a43810f5690455010163dae5b75b0b70a2d01450d4f7ac0c209315cb70e2de9bfd5a85a712135890ba94baa8fed1fdb55e6b025dbb0fa7218ace8a8ff6a4ada962c5a942c9a14cd496b42491a5052d29206b35accb6f64344af10512c940ab5629b1e7511151ab2dd30b3295c8270a08288904b89bd74053374e9c2031d62a0822eae4b73b097ca70c4a0062330f0c1c91049b82e4d622fbd54b3973693d94ce6f4c276dfb914348f82909244a0a5c850161d6850c30c2e99bd33e8861b6421a30761041d99c275e72c05f6ce2a488c906038f4c0881bb8ee1cc2c1de59348d5eec9d565a485cb510cbd3c736cc6db861f3058b5978d0a2858a229cd0c007d70df6caa2230468e1c2ca961ad40053e2ba12e9a7af54e2ec955ba29051a2b07ca5d091747224a12449599204e24e5a6212f3a2082117844184eb3a127b7d49c29ab057c666d82b7f98f8152696fbc8761095202b422ed44231084664898152161624e1c485027b1d4601289e687142e8074478e0ba1e3b62afcba8e0011238d032c48b2958e0ba0e6463f67ad0148762bb488fc145da8b2db66dcc6d9282848a8cacbca0ed6d2c1ae824bd42fbd89f7eb5e036ac05c415ffe5287601526cef3059c10c4882e842890f535c36d8cb4547493ff096cb4ea05c16b21c143510596def6619652fc76ab097613b4fbcc0c10f428431c4165db82ebf68b0372e49208b94241b7818a38c305c372ab1cfce1143422cb842e449112870f504baf515bd08443811c61625b2173861e4051e64e15203911bac1cb966d819e224083e3e57b63801c5d5456c3f4eff8d2e06df9d4a7368e9bbd328079fc7e5f3c6f8bc2dbe2b6796dfd382df53fa52f05da7e2bb0eb3fcb58b6f93e1bb5d64f9abec9b5309fbd9f9aa55b770666acc05d8eb59bfa92543d8042cd9c2ba0e3b588f9115ad94f3ca771b66f99dc9e7401ff7828f13e29b924bb073fe3791b0f36fe09853e94e25cb5a585f6a96d266e4bbdb0cdfb6c367c5d755f1350ac9521286bc78ce39e79c33acf1a6a50c810471f5d079414c2021e820cbcb052448cd0cae27352874cd0e7eed6539ac69027b977f130f83f8cbe5fdd106612ca62c61e4f2f009fde1e970066f8d1d908b0392f0353bfab7dfc2bb63757873b15d01d5650b02cf76787f581d8f5a3941b61bc8802a2f187275ec351037c2451425179020d18a2e416688813453317794f1a6873069c1cbd520db9d2ac5c7b684307480b96a5270200de0197279b8e3ea2277c7ad46ca663b10727515d80c40b18a0dac0cb96c8002042457d79e83ad2a9c0cb980e0508248c81544220172c556409ca7bbd33a428725d796e5e39fc14ce8e58a5f9901ed2d221c802c8fe0c26039fce156c610838dbf09f1cd2eca15ee870d08f22707140e364832a488e1e28629303f3ff48621db4f171b5f461876f7ee6ee98ad1dd9dc9603066ac59fcb1bb590be699af1f11122eb685f40d1a4df3ebfccf08bb841053ec14c2355fd5ade89a32ac51121de1e208964f027551d5fd35b8193eff7a35011ede56c5f7fe35b135c3953b8d6f8caf8496df47a8d84874448a45808d444788d81376c41cfdfe5d83d156dba6c61192b9a009253090628bcb9f840d3499400aa0e40a520025578c29f0ebf57abd5c33040ba0e4ea09f4ca7bf541f1bd8d4b9021b32da168b5f6685bfd6dab5a8f1594baffa04fa8508c7c371ecd78c858c6b213e8f3d3b066c77c3a43e6e1170cbdeaa209b08c67b359429be67d77df0f2404e29966f5427ed50c441755f746ccd6ef50b2afdf45b0dbbb7ff4ef5e474f19e3739e17398e790de0653bf7c4f83853ce26c657b9a05ea99cf4aa7ed04c25532de955fd18638c9b189fb451b39b181f8ddf45f9ae2a49d5456cd1248d00b3750421b6bea8c0b0f569bef881ad345d6ca53488d8fa9b938f3efd4b937424146dea572fbcdf91b754416e53ff8f6cb591c51cdb7fb256f205adea53f0ab41b6aa829ae57d7d9513cff3549c1231b82e5764bde78cacf7623d95974aa552a919335057e62cb65245fef348e49f423e87388e431d4d596cbdfc8c35e680798e79d98e82eceaa4cc39411dd5507d37359969e2bb2a215b554252aa11118b65ee8a659b23cb1c123630cb5700572c0be0c8b23774c5328d598b26c96d82aa883f968f681ca1216499c690e5b731147398ae8d2296e9af0d2a96ffaa8e2cffa511b34c4366990690e59822969f1b8a3938cb1ff38a39602cc7c02c7f61ebc7962a29dad4e78f2a1dc4960d992a0c5b9f067d57251bc0cbd224794b95a43a6a960d99aa8ac8b2a164d2a892bc952ab2216b56eaa86d2889ac54157155297d1d3d53a492d9fa2fa0084b6e535345deb201739ba3668900464c55515345b626c51b3b2314416989cf862ce6f06c7d1b4b9a35e3eb03a028e608c1d6b7518a3960bece207b554936640380191157f555495625640386ad364bb64ed9ec6cc884ba88ca88f9f5a34f1b40b6bec0ccb006e6a39dcf30210af34dd2071f0af4e10277b14dbeff516d93171b5b2bbf50686b0a9bc0def5c1aa8be709ea37530ed378d136f539530e871d4d922987c68b5ea5b2ccf44095c5d6242f9a85fafa2aa566f1d7576d31a5b230cac409350b654464a13824ba23b67ee7798f42b93b777ee266c7dcf9cd6bb621c51cded7e784882c6f889bc51ca6af1f23cb4b22aeeadfc963e7cc864c489dc51cdcfb60db7160f7de507f7d2f89fe6a4366eace2689cc56017461eb5f1b320124c59baa4a655125c59bfaed8536334e3eee7d304d52ccc15fbd50c6b66d636bdd421164f1a6fea549b2f5aa926cfda8aa618f1bb1ea3686a091a156a9556a955aa556a9556a955aa556a9556a951166d669771cd7cc4829259552fac46e52ad8339e2630b8608a67f45b0f16930ebeb95d3c41cd25f226ba657fe1cccac577e8af5ca59272471e53050d800a95aab56359899b74e416ee3bfc57a8524b236247175b255820bc0116ffc3970e5368ec4ccfa77923bae65779ce974e2f68e32af7883ba340c907f6958aefbab3a6d627c5b4a4606999794936a496228d5ead6bd36e336bc799b189f67afcc6be3ba6db60135ebc6cc4e41272727a11828cd7ad97e4e411d83effeab6ada94c34e7cce2de99c9286703a799e46356d6a937a267a42790d6e96594a29a58c10991840191e199fb669666f13e3ab8980669279c51c9c1dc1b6a6e4ab1152f38a39ba86c7c2cce8d3bc628ef952d62bff9392b872984fdd2d3685c415bfff49c9e47121b1f9f23631be8e86103442685ef146e625f3a2318b37de5dec94effc0dfa2bde70b784a473d26ec67b49f2dd1182ac3f8d530b4e41feda7b0f906549a9467332f56b54d3a63629a51d839ceda27c57e6250333cde0a37f4f41f23f2d3e96c1b6dd12df95794d4d9bb27bf128189be8420b069b7839d8c69b7580b8421259317a2c222222d181edeaa27c324262eb14146d5e3240d6659258973962658a58ff5310b1957ab98d7f2dc27e53ac87a726bcb02685eebdf742202b0e64178e065330b7f1ef529eab599a603cf9303274a99494deeda7d4cbb539f9b8e7fe9e82bc1533abfce91059dbeb246bd669890c71e52fbb3484b0fe34663147bfcc260387efade8f2c7c1619965c0cc51f9e4cfb832633a27e56a6262644298c9614362fd6f8d2d1657fe97c6c6ef244bd9b2393237f76242175a84e069359a26f39281356b04eb2f339391d2ad8a24e32333ba3241acc8041220192024244bd82b03452666afcc12ebafcd104c3bdace78345e4723086ac29c9399d9fb447d4e50dac69f034f4efa04041bc0bfc1d30ff1c65f9a22c0590eb5241ff7edd25e72ddb6d8fc61de6cb326fbb829a5b4a3f1645e5d0d6f13e3e3a058622fcc4ce63504c50fbb22511298f53ffd34ebc5fac3d0c007eb0f038568079fd34906336bd6fd846232b1665d9899f5bfa7201828cdaa695624528116d65f86a75bedf2bf323f0ab017468a75ef680e2759ccd1bd341cbe4894c4c8de2d967acd388a39b43f05c51cf5fdb7986928e6e88f990961ef16f3c1bec9acfff6da78628e939378d31359a72771e52feb7f0a3a059d82a4c8bce6cbbc2615a9978cc2fa574fa3e9e94c393c6082e2017c46ccccba0fb6f74f41f1c6bfc31947ddc4774f41d6bf2656f3d3ac19b3fd917b31418bcccbfacbbc9a5586d5c217251f8c8d4ca02068c67afe44ee34c24c6b1f4332cb776312ac799c00a2c8c5cf42ccd1ac85fc9aeda39d9c8434c50793b246f1b1e0ad6620be6861ecd29e67c803be7e74c1d85513c39a0c38161d20e9e2d23e03f46b78822729d0e8ca800604480f3f5ebc5c5a5813431ef5b5fbe5e8f48a1906724c067d2d842cf4aaab7c38de626658b46119b27fd7a060c3c697618ff86fa3add9f1d6ffad873980c1910b965012c51546ae1b43153ae4216d0a348b2357ecc0c61823c7385d1323d6ceab95e8b2a3a366f07d7ce93424dfaf8cb417510a66405b74434429588a9d0d3674de834e6ef1c58f9abbbb3b4b2c52f4a355e05ce1eeeeeedc48eeeeceefce8de41c45f595bbbb3bcf5ce1eeeefceedc5578d3c3c2d99bdddd9ddf9ddbaf80626646f27044e98aea587e509e3fe8156ea87243564a902560a13320a31fe8ec8a58135cf0c4aed0514d1d15961f9377fcbcb2922b2c4b32864411cbafb4a1c0872794ae707eb915b2b1e098e1831338b0a49af543c62169c58f9e6dc59ccd194e0c0e169f7510509058fea8048a48123850221ed52e8a18c8e2d115cca321718931cf15a999c222b768db35f0de8a2e36cbdbe4dfb9f71d701f5899e21c9ef1a8a4ad3595490dd5108d040001c314000020140c8985429150349c077ae40714800c85964a78509a89c328075218328618430021040000000c0181a91251100050a0572069dc4f7d9725b0ef3f1d601dd6d4a87e8156b0a12c7a39082d264fa946e46caabf0cb6cb59dd061d0da17daf0f3f77715a2cd25a090804b7fcc8c7d8753bb8fab661b1f76baf35612f2b53456bd3ccb5d883eeaba397656a05fa0913781d6e0ab3dcf088a43305619ec38d2c0623044f7cc3aca43affd0358fa3531654954d916f53561d6cded927abf70e9c97fe9da186deb79273835073150f354662cd5c007ce962751ba4d3e3ffd92be86a6c8c17d2f3a963c2fbd30497cdc65bb19e8286468306d07c5dd23d74b6c00f85265a05dd94091f7474adcb4c0215a7f74f9b3841b660b3e39d22975f56ea698a2d5a4b5d85bb4a3e6dca60a50e65ceef02b94299d4c8252fe2eeac47729c622cbd313ecb9ebcf0ff84b1a2d171eea4113001a7d713e72600d41177c6af30ea9479cf835214f4ad3110d3d691bb4a457c569887a48368465e5aa281439a4c79c4c8840de9b7e7c0d86ef9cdf513eda9bb5098602ba661d5b82a4d7702071a7bc564e3fa5bafd966f6df45f0f797bd4256b86b66450c776591a07578617e5fe50390d6d90a09207e66817c9b231767a2d4836635f434d7a80f00b5d1261494fa4949ca1c02da9eb305a015c26e0ef9a0f06cc2daa4b95bcb85f842c92e5ba844dca5ce77d0be8f6804fa44313ffe5ae5d403a9ca5e8a374319cb2dec4dfb4c7ac3e0a2c7d2d39d178e17b6e95379dce00a7091a5be2d17ae3d298318e7825d4b3ec9f7c7b6d6c3dafa70a4220108e50591837a537041c77671dd6d5298974a969c378e9864099fa9c2ddbb3138e979e88a0c51922f3eeb13460362514427a4ab64e7aa53b21c39e99d3fa820c842c1ca1e26afacedf42a245b9a42d9ba13816dd4e819dd27db587835c56980068f8e87a24cc4cf0a2ce15f5818b5d9e41e3978af576e4ded11778c176ddb7272868c40f8485c06988f68a78775bc9201f8a8df442837c59af1f8bd8651c810225d612a9f36bbd31dbf41e475ccce050511197742d1ab5dc33e3a46f375922617e81370b691b3491ae689e3ea553ac734f95494b1b3c1c9d4f3c38b59031bbd5f1ef20ee727c335ec6a508479cbf111973e2bc4210e8113bc0c9f36528395cc77ad4d4b6ee0097534b097b573b1393fa15d79cc85899e9d94d7f893cf1f76c4051d19ffbf6f57e2fb1f5352cd2bc92919ba321ab5d60704557d361da636af1f7a32a8283491e79b171cf952e82a8a7c40957040eb8d6fb9aa329cb823645007ac6ecf86c8f4cf3b2f640e0d6761dd96782294ab7d680a79a1955f4cfed2b131cc43dbe8111be17be77dcadc61e82339838f16133d4ed7a92441e91ec06015072073c997bedea65e2ed232f0191969f0d70515c6456c3b70b7411f388b88b740608dc780101342c2a4e732a910e55ce7abeb279c02d728e917562175b35a29330eeb268b9c55d2ca1c0db7e6f20a709893d5129baba82c9975c5934f6b26044d9ab51baaeb1bc118e68e343e71c7e3cae3d5391a3d64f5a64ab5cf54e7e08bf3f51974800c9c8c49e27bfd26519f10be2122ddd11cd5393f650f19e3e0c2879b55160397c94f924a4956a423f6720b0d23fa30a8e59d281df4447413d6900858007e8cce43ddb986fd81872496767ee14e191d6bd1c5e125fbcbe3f553af498da25e2e9465f13f2b425b0ca4b02f28e5a8a3f6cb14ffc225afc11deb3757e808c596ebe075e7141b6685dd79cd59249de65275cb56db19c67bbf899fb3f67ba39c636e9fa795cca550723e4d1ecc7dbff6c81fa36d031f0e6a8074a458b71f6b2f8302a719a05aaa6765c442ca914ae8741b378b2b51f6b305862853d61f9df32d1f8b141ca1cf26568ebc828966908728e4e3abf390e2474d00124f711410b1674d3fc5d11ed3c18edf3b7d6a3e561eb1f42cd589c0f9a01494eded89a25edeee59d29380f9264a4785a8bb6763f1740766d7d12e34730621a61f25fbb3c1e4d14c53a75d7fe24efb9f95ca7bd8d957e3229fba005ef13440bb5b9fbdacea4201eda6ce1ee3998e11257c0439c505738ed5f9debca6317eb71032db51c93d3c122547bdf2421e699248a98e0c6b37942c45b914ea5f51a51001c8aab3ba0ac25f075894d82aa754b82b4354a776bc703c79f43771946934471a7b99d0408d973bceadaa9366e666c6050fed70b2fdb5b13837df524a0384419ee2c96a4f70874de42c1a7b0d6b7bc2b70ccbd52df2283d2adfafc8628185515d1a46b4ddb9e56ea8f1cc68533a020533bd4f02383a6140c0b6510bef4d032fd3b84cf32f3b9983471549fa4a07488a60b086b688008e1d75f1bc00cedada21434ed1d098c5f30af42f2d84dc0511303c40a55d99080dcf5921b3142af59545ebcffc3e53e1076e0649b64fdd08439b8e714cc29efbc079cb5fd7203f7b3c74983a5ff305cb0916114b06075ebf3c5ce2830f99e5b1694887d2d0d20798e51d677a36764c1ec80050676426726fc352dca6da73dc4677ffb9fa1afab089e6c7795299dca53b43c23baa91b979979530646538ef14589824137a90f6cea9fdb5a1c9a7022a01cb06d816cca66735fd2413b850c5565570ad191ba1a570ff4fd45bf47884d046d4bec68c63107b723da959cf0bfdfbd642641f3465801e9cd55157c4a693c483917c7ca4e9923c47e1b142745bcafb691f04cc19a90635894103f38cde9dc1c76108c608b607dfeb37ac8b18e1439bd8c41268598489e7a641159d4d958b2829b0b3baaaecfdd12f3218cbf8109eb2c39519d9a1c021c472494821e5e507d6e3352c1e63ca6bd5edffa1e6316657443740fb233a15af120cd94ceb9b6f11fa7f0ba18f77ace3325bed57c6844af2d7fc923ff2131938723e6039ec1787f70e87b5a04de4eeeb2a9e8982546f744d3bcb2adb8a839dc737dfb4d17bfc1a217cad9e9be9187504a92cc0051dce02e3c9e7d3dfedd6e96f5543f41ec6e6c46ca434734c580bf7bd967bd5d37c29a3da6162db02378acd8d76b9919a8defda78656e840bf43616ed5c6d3ee788ce6075a7ebb0ac05da46dd651cb8b4ccbb89e3c5dbde2acc9b083d9c178c50376928184478302c0cf61b11f3ce0723b88b4df0b6e7727d04cd1725a06caf2b12abb4e0119956f5dc15e4a1cc4528aa022cc88c4d572adc9a211f4ced5f824c12d0d28e2afeda42aedda96308c6df04a6c221c767508c665edefb75b6b4bf25610150f5c95132537e3d9bb840f509ec64877e6217f0f3c509ea9a490209efa73cf9ac2525fe8778702deff66e0cceac3e84a07c06c9ac03734956ef64ae9157b50157aafa05d05e3314c8137f651736649dc9ba5e7aaa5088e84f101686b5f1e29371070d8557dd0b71ce9d5e6bbe19f609e279692f87423298280e2aee3eed6ac0dcde3b1644da1bb329e230083a71e0ddcc0226002f5f3b87896b0ae674e218067453f7e1d4410e2389c265d0f6a2b1909cf73ee8f87ed752133a8701dd866cbbedab6d1292abcb0d0895272c3b365f2c8191e6fd782cd9e8c1dcad5c10e6820874c86bfd7cbdd937151d0596a78c4bb5fae0d85cfc173567e3d96d36c7256d94a1441a7266d040217b1526326f07b2b9223b70b9f924507486d0e57dc12893b39f08452f0ed1cce4cee5bccda48484de03ac109e3020c490e1d5afa2803231237f39486f452549e6abc4fc8cc5239e7cd0afb0fe40132e1898f753ae37232b78cc64b23a339d3677d8eafd00fdd6657f16e7906645c0e3c553b8dbf350a38ea5b71798d6cb92126a6f35039dd56f298b52598ea7d112393208bda962093a35c7d38486d72d244de91ea0a08e036a3a97df1639237fff0ac4586c0cf3007c6136ba255848d65a6ec17ffa2c46e390d8b198a660ca822522c8c44e53e7d17fc9862795473ee8e62ee728f491d4c6b9e13d8f057d69ba55a383d7566b0dd322cfee67dd180d0492189f361b462f0ad76fb3708ea3a5080b5633e84aded623aaa99a60c802a4e14542a65ce95e4e2f2f19835a6cbae25d9137e3e98b3829b3a976c15e3fc5cdf81a56113537449b28f211095e434e7c64055bea8f89a3d4dbf08f20ef92274720b3202e179adee540d439b16fea17ec817bd0ee7513da1746e996d99f9b1187a4191b71cb1130a7ac4246081c893dc64d391062747de20a5fb9e5fcfb9d08f1ab602b99c3ad301bac69fccd3f88f2a0bf081719974a91f58e17fa1ded400dabcad8ab65df227e0922511b3a2436d0bff3c9fe965bfa5584caf359a595dfdc07a2ff9c19c435b4be288d95b975ae089b29fca30e01cec0c256b958fe23f7c5390234fd7e168d80c793306e9081e604173800d6683f58111fcaf5e495e5980395eecf32f45ab2297225d39f3d404322a1138a4a8bd91402c8c015937f582d431a43ab535d683ff15d0363de94ecf8f48a234e03a06bc936110fbfef6b0830071a2c19dafeb355509bcd12640de70e1ffe0b6595ac12125c722dd12d4d9ed07df0f7d6c8999cde8a6dd7c382778ef9445fa3d33a0c9a1b8944463d2c2c16d850f027b6408de8516c90f7f251ade105964fe4aac2fd32e70085249f40b70196d2647e789a44fe002420b6f5b4efde6678e697a5725d2a09b40821f6aba657bef24c82570cea21f9a615dd6196831058441a6d39940f2f8cb4570a33e86ac24016bb20b858bf25ff904159259a216297154e5ecc727671638d96d5c798c9278d1854d67dcb81c4b84343958d8caa74bb869a925280c73941bbe042e8ee778156e50694d8d973fd448a5d64d3bac98fb5d67adcf890172e8212cc7ba9e0b51ace11ef9734f5137483f8fd29f2576938b86e24827ac33ed6fa61c75fe5037689651106151b34496117c11aa6f78701d8292ee056ba555b4b57089e6993db4a0abd8abf6bc54f6424a5df789a3d563ae071f307f617248d6970f10281499c7ff1afc81a9a5692f1c2084fc39954dd70c326f333cff4892eea490f343b5022a9f5a6b5a06d6103c0bff359a1e10738957a58a0383e2499ab9e8c9be8be36fe2981d5b44f7a365896ba6085c5ca78f28b5748b594a623c93d69c226ec5c29a18ba759add1bfba327c2a8517ae7059fd0fbd29d5b6d232a2ea0d0b1753cf4f41882a9c9883785cb2e64c2b10ff027524403d7294659a69b49b680cb33e408016b8d15bbc0a50076056a5b252385c31aa0b7e9aa6a78615574d939558c341e46fe39b53263eb8b84fc850918f0ddceb60a1a93595eb61be3084508b77283e2b004a2abfa0c930749b9c21dc49ad62b75d3826cd93ebf7fb45a5895850addcd9a9176292ea2901c25153ef81c7b719b44a7f5fad71ca12f819daa0c8f05e3cd1a5e8400c82603fa75917ddd0e3b6f711ed130c66e718c37ea0a207372c2aadd4ccb5c3aa937293b26ba4bebdb8b15eadeecf90fec5025914224ef7f95e5bc59cb5c15a168cd482cf8a6591e4e91152e99675eb9236cb0e52ddfcae09aabf31a92472a5371c137f4dd867fdacbcfaf2e75d38ac3da5bc72e119529f828b11737c4ae4c6ee13af8d8aa673494cb2f9a7fc411450d247e64081bdc9e495253ac281398264e416e3ddfda0795ee8fc2089e216083a4e876ae162f952414f5e2cc912e64272c33aa31413f8187d322a0b1fb991927ed5f4fc96decf10f813eb68d49a70d86d0ab11914caad2f99fcc3880f6c813e658dce0a5176f9758402022b019d64e590b5458fbb870289f094382a6b349e6ec174bf59ee70ddef4c54a0e4e55775872fe2d65affad68c05d1f55c7a4b1e58101e686eaafab181f2f289648d09e4803e222cc6a58c9d8dc4db40a68e0c0c87001a91985884ba23791a326916e1a1517e49ad714f6581c9fbd22fa0e94914172fc4b264092be11f77b127e21cdeee7f7ad88c9c9b128ceee58f08c8551315e2f3d12953f4ae64d29922fd48284ad4e204c9bb5896024ea662d3e66e9c4cccc092004fa3135fff36737064981ee96f96c8390844152889f873ee74240d7e1702a669114c801ac8946aa301689156d3d1e42d269fd9eeac6fc80fc66957ce3bc91473b3048b6ad069def7dc77b937f6ef4856f662349d4c7132e0fdf8490eddd56498e8809bcc2b6046536dd2cc110fe3d2ae526fda0fd2523703558fb181d9eea848196fb80dff40eefb2de93d74bc58c80583b2aaa38ecbc6e08b7c75f9d383b94b1a6a738c5a87572ebf490c3d534a1def59e2803cfd548cdc92aa8353857b41bc31650233d7ac22d1c44348ec789c301035f13694a976d09827198b4a34d21a471e30696718f71cb23dc9f07b68273f3467856ea6aa1d5a669080b613a6720f63bd468a08fcca093c1735f76ddd4840f211ff636e1bf6b64a925098e89dda8a4ef8320f338d48c80d88fe607e3755d3537ba92173079c70cba371c0beba7eb1cb0aed17f08ca31f8f2b2114d8228cc1fdcf606c623fc25a1a76675317a220530e3bbe2ae4c7784a58de502a75f834592772096fceac580a1941c836f2a342d13d5100ca9b8cade53e504c7d0879ce36afd845bc5296586abb857865db98404ce31a6c0fe1c08775d004e0528422d269002382d003408d5b49390e8a308c28ab7c0942cdeb651a0fb1e60e0a1684565db104a8b860676d34cda0394fdb19ef42f904c1168b05c43ee3e170eaf7fe3f56d1aa5af9957eba2a5b0aaa777a45ac82674bf08f08ee5a991e480a297180a9450fc197d64feee7d86d45d751eb920b80dd2016b38d5083dfcb361ba921ea24f44ebe908cb6dfcd0adcb0f090930cd5db5ee319778a04c7ad5942839a0205e00e5782e967a103b9015e4010ac7cdd9b43f0e2738eeb2eaeb069588108fe260e5b8c5f6ec65cd4219cd012a962d53bbfb84926986b83ffcfff49efc5c602f92319334f73d586934dcd660190be5e6e45f08707f03e25c48007f6af275f2a29955cb5dbb29cea9d2cb3ec74afbd8f862ae887e4076560ed0018cdb5d210103f25a591dc034bc591d9deebae674d663989bbd14d3dcd147c967f70a4a6dc17b107edaf6ae04bd64f221651bd5122f6a98864fcffbd89d694441032b58eae7cdc43577e620c95469545a7db127892b6747f21449cbf8fa00a38bc3fb93583940f427dc2c6d06e22a409a178c1ddcc8cbba5212b07d14edfaaac9a7f71ec4b0f12836d822b2c1b49b724a88c456d7b54dad36873922a597243a4e7c6f2f417e0421c513cc4ca83044a86b76b8273440e69c10aef7a14be0b4bfb4082b431f9bd84413b27730c2c70cd3fd35e92509a8e03c8bc088a3ec4e2f8c5bb4f4a72bee97dd031bad2fb9142d526649522b5c5d97946dab3c01309a61eb7a5ffb9c5f780f78ae5d6c2e2f88e06c626ca616501e5b55884829224003f11022ccf2d8d359fdf7cb2aa7d10b823d56a0f0e5bbb4366dc3325139bd6dd935716489232e4ebf7ce8eb57d55d0a2fa5911ef9d1126fee3cd4e4afcaf5082dc0eeaa98e7d42223d3e5eb1f77fee55066ec51b573bac3b846c1be58dcede8afc88a0970ad507befed3dd10e3954d394e565730dc6768759b4fb9f05850bc1e19d3ec68267dbfe10f210d6870ab04e91ccf74b5a91be62ab98be8eaeb12c5a8aa0dd10b3bd4f570e8d04a7ad5cfcc5bb71513736b2baf1225b66eab355bb0040473f4a6cd3be3d877f0d1f83f654262be687c21ebceb8887535f0c1b9ba064d36357ea26d2b2d10b203e0ad5b9fd0cd86dc915d5b55c5734e1009549fac94267ca4647f983b95577bca85f919f843c8cd146b0cc1c01d6688e7f3bbe42a6efc5bcb511f730fb2b4d1c0b4d37aeea09284f99d9ea6686dbbce5ecbbfa3234d0b6e16d331ae8f3bdf69d54c7731e8ca36c0d6815a22e7d30d26d43e9d5f3a9ceddc64b04b550615b5c33c85981af1c25d37b96939a093b6a6ac4972a911afd9be59ea41a5a032efb8bf92ba6344ae2de470bdc25423fe8809f46a406cf52842d65aaed34463d422bf310ad4b82e348ae0a09a1eb16d46f6eb591262fd9887923bccd9bd383bd65ddd8221213425f206ee40f09f59500124675d586418fbc464dce2b133d20614b906522a195656288061fa9bc5729e56ce2bfc128930ad6f2625f7963790b3dc434bf0dea7682edd725544f541b472a9663253fc42195b33882c2edb2eb9b4126ee9f7a89d22db067a11c632df0636de12497e8262751ae72bb1bc406917966d964a889d1f82f665825281a077458ec4f94c66adb67440a9ec6557fad10cdd18bdda12973cd7474b5564260a301ab1fce48c8f01ffc99b9b9e80addef01c4e57f4f980e0a024dfb681a8e1dacd1103171e08ac0ed340977cc5a564482e7d5a66354c0be2130fda9429bdeff566f0fd53865f48e6e8f9a5642c2d72a035f0d9f2d321c0a3e19b2e54eacaaedc719e2fea78ab3873ef560145d0706fcd40264153937f8a99e67507d741a047b1728b043261289e379a8969650cea768ec0e614728824c312e2c116ecebc9906e0ef18cc8e5ab7613a71837a6c1ef830f78c51d2ba3aa0a4cefbbbba93c2fe755d1b449d93c6c6cc8ba8eed44b4f6341841fdb431d32c819dd26220f3105432c29cd48eb7135d355d52cfbc34d172ffc1c6e5833a4531f76f54038868ea4ccc3b5ff01b42120e3007bc1ad1b6ff3500ed88471a9499c174716a2c71ab22158104ccf025460f5797d854524acfc125e455611fa54f9cbae95b7e41bd374831a4bcd78aa0ccf83c1205970d3b4e73345fddbc1a725cc2c73066644e786f7e180b6737f413a3a4183251145496779caa6b243757612b96fe2e84bc6994f2ef458ea59ff91f73a6b5f4c642a0aff8599a303b77a3cb1e502d6576274174b1a0ae66c658b9f508b5246e4134787d3ee7cc24c2be887825cb9db9e9f932b0f5f6f60777a2567d445e788f8fa106d91cd036a125c04e24941e4fdff1ea5b02c9cdeb4e3fedf6b6781f45f8caffadbe4c52e1e09fb565970e5991d1f7e040d4c2ee430a4a780bd5217a8cf2b5dc8671a64f7a6a657e452b381714f951eca32530abd0d8337a3d1cd740e88e3e09730522625b6d175448246deba0106542d59e0f0bdef7b9596a7057906f72ac5e3366a81f725af7cbda4746837ae2cd87af06cba177ea3a6094012cf37f15730c4649f4170a8cbe074edef876e24c50d531a659c35e0dd80c66adc0f73de7803ffffdccb7b1ee8f3208c36c975b89b35ba4dd736942a183a05646cc18443b5dadd16d833163870b65214a9149ab02305f7c7f0400028942598da05a4110cbd8a2d2a1790f3b21ebe626e2562786972704fd45f4f5987c53e170c8df9932e1778eb21c1cce53ef3ccf98ead104ea5460cb803ce45d7e3e3accfaa038bdfd6d31b67b58453457cb55a5c76f7a43dc1a112d38448997f6864481bb466718252cbc3bc7071c44a95d6e5930b22daccd40d2216cfa0cac28a53ad74bafc751b1c3b794b119bafb6b13e2c020632e16581a5911d7002432f539c4c949e2cd530004c020a6e449e05fd5938e3632ff2912b9d5d916f728bf1e1c40812609b6be36932e955d5a4349c22583ec6fa8769efde7afbac31e4bda1ab2f31fc0f160736901c0b5cc0bcf9303653410d140b0f5e094861cc41bdd31051bbfddc58d91be3f64e77a00d5b2acb3900a2ee3b6f16c5f7c2aee0741366893fe4a067b9ef68ab5a22feb9b58f9746aae74331d5efcf8c8927ce6e83c8fb4192aeea1ac220241f598b619ff72f4656a5193f9524949f31562ff22ed51944a8b0fdd42b8e70be9c386e9099d740bd62ed07fbe7844a33011e3b9e8b2159238122cb2661cc247e7c5a945aaa17f6e545f24ffd79746dadf7602615e72cd2e629ea6908ae26cbf043668f0aed9dbc496bcbdf3450c4fb5478211b7c0121aaf69c30bc61628582d82aa64fc45900fcf1224ae1e96b18131246371cc4ba19ffc707eda73575dcc937afda36aab89239eb13d386780eac45c6f5cd0122176b8d4dce84c8f61cf3762b5c323acf1e5634640abd099b1537b19d748be2067b088e680762d49096db1dcf9bad3584712193d7fe0f03f29abd4c8f7f3760725526e6b11eaab8b66b5f1febcdfad34f5a5901ab18acecc96392074cd56a56d002f04b8a376a42c9f125de92020beb0a687cc8cb508cfe1c18b39bcfbd9ef2d08e1ab60162e743661f34c9dc5cbae64eaf153ea6731992c59ee5a0cdd084276fb533f3bcd4491f5f8822e2f1b06f0ea6d3c0001e4ec13292900831701eba23fabd09fcd0869af4b380c1bf0f4bb2aaa0efcb1319c98c9a7e62b22c083721340d1a51136a4eaa1ab2b3effdc30cc74532815f540e4f5ebf1da1d5a2761474c9c0cb8646b98eca575b1611ea29340d5eca9208df3d2df869fee2089a7233da3291d91fb9d88b81154e1535c2a5973dee9c380d5766cc025a32582b655abb4a500132cd4de01b3b9fbff821ba07b0f5a8d8baeff3a15216223f247e22a489ec44f0882fe2caa4e3a432d78310c9e4859b92de2f2641edaafdbc28731bb3df5dfe3e34f869f417833236b29a734730d8184fd9760147b87f9cedc4ef05fa420df376460249fda113823ba11f974c7c152a03b9cb82fdd3e6d6e49d39ccb8e06ce471391c8b25ba24a68f0a7de5723ac293a197f4b50217db39c63730b48495a6f3a725d498ca0c4b6062e9eb3a84d04f06e69fa87301e933414e5a242c68fa88c055fc6daae6310d2e08ba26f646a8e120262606ac707f6204de0a888a8309c26be1844725c6e60996e28e4e8262a06960fe6221277b0574a5d687726f41cb00a30ad84e70a072c797aa6beebbc2dd09aa6cda4eccb102052ba37bc8df76babae21928d2b8e72bd10cb6c36a5da297d522b57c50ccd20722ff91b2f274c22538e4836bbf38764809a0cb0da05617b59d0095f5012d773e65b283bcd5a44e451b6e132fa014134d509b0e65d3ec13a2deea1d622e9f97ed494f29f7819642871417044285d84df877bb0a4877065593910e145a4474f69ca936d727ca38bee15b5e1cc73850671b12f1d846080bd231850dfdaf17a2650ff3e0627098e3f2e134e35203bc38e8d807a74dab008aad758c07c70b162a930815899ea51443a61b7b6c8a90c589a88a82799a014c30ae5b8be837d057466844076895be57dd71b021fc01aaf4d132bf2c4ac12f3415d73e68907cd1fc1fde0c5d09cdf775702d90ea871de94436d1fffe8121d056522776a2ed6d0822f06beec28f16e3dda60c6b2ba5dc76f2b7d56f834146b8b81044defec6c1b7daa684ecbab72583df0e4428edef708975ddd0b2d6b79d80a48c3498348aa63f4d57360d13f6e4b18a540a86f9952cae5f9a356a0647f658517a531095f698809b8028fb2b9229d3da16b380549d2f1e4b955c051192d8ea91bbd7a1f9f468e71a68e8d37e8fc56b3e093c75df0d6233559695a23188a3e1aa591ed5bda1869ff34f36ff9f480c2a182b9332da5b8ffd11a09cf015613556a95d8fb7fac7587dd04aae5b76a957c1d2240ab95999922c850921066e39fda024e8eea17767d57d3e0547b327b31ec8e4fc9f61d17821209fa304687e6d7a503e539c338af38647482023c4abab6a5a77e7f3878a1af8303f131faec56e59c168a8035b2d1e2c3ec6c4b1500b656ce493d8396c0410cd40e3b3498913b79d85b0677e25cd6f420d8010d33fd5cf081de12d65b5b135f7f34e5fe30f1cd02f8f0926a49f3998d534b00c6ad40271d7acc66b89d1dbd8db06bd3aa2dcd594d91f34af869bac855be635d110fa600e51b8b127c92db40a9ed128816ea0af36e2015a67ace0ffdaf9481d20099045fa5b0b219c6567b006c414fe132160a53e808c03525454a632a7dfca9808acf0c189d9208d7bc90692a4a47c83752a3400f0a16123f5ddcd80138ab7803de1c6c0769f8325ecd107ca3d00661f8a1d80adbb02540a8ac73302c4419d4988151e174359b6068f12df5dc1bffb11f9176e38eeda0bdd1789c574c06856d0217cbfb83f8fb46c149785f43e92801a7e9695ca2001a6841dd4918c745977025ccf545e26c38c6465292a3d0470784801264d67d6ce0af9880ac4aaf5a5ba2a37d1173f7a22448aa0309b8380a10519c2111f5cfa3140896e398d914d31d6d902894005422872741418bb4618793b4126fdc86915b4e959e6276636f25bfc754ea84c8bcfc16ab91081dd4aee3696a187aeca3e40811bb1aa39e1d9a6886b383c4cacb0b365acbb20521707ca1b7405a48658812e899237c24043adae4f8b8a9c70b7089c279df7d0c629a5cc36d32b123c8815724e3698f3e535e194b7b79c603cf9a5702dd8b80badef76f4b18844deebf95854b9e5d9f2d698e04afe0300bd02c065d1667312f29d4d36c1cbcc4e7150f78291354980add5a02b2fa98f028f275967333d320dc3427d804626170975765ff4ab9069251fcdef7f7317a8dde8a044b38b8a710f04d51f37560120ad2511cb573d1493510fde11816b10b2a34f85900f480b2ea563cdd909511c9853747b74f69d7a46550a5465f776249f832dbb4ae1b2c509d8fa4596aa675bcc46bef2e4d119de9994a69d05265a1fb315d49e4915fdcfd17958064dc4a7cc1d0cbe27043e34127dee9931ec56462c6937ee7178836378f147f1aefd41710f3cbd9c270758e916ca4c78d32eeebed854db0ed81f7c11ad06237513f451a53e41da9186ea6f34f99ea4a013efdf9caa7aad18aa3769a404982f0f5b82692e792f741584f20d2d8545b7b2cd40f3136f6fb3d08634301753103495ade273b88f6c04f9ecfa19e4baa4090cee229ec57b1c6d66147dd39f49e31db3514a95133a4d1fbd758f952061d1fdd6e396403cd62ac45aa40c5dc991321fc004e1819285e8ef466d64f63fa1057a7b97ec64bd19c0a56449aff7256096db42e91f26a9b49478202803a7ea93dd38c3257206e4a39113dd80bc81f0bb2759c1ef0c4030c62c83dcfee6db13a1b710f02efab73fe56e6fe488c0f1d48c90deae253871b0b30b5ba5440250ee83a81184f4dbc36d4da44d68556ed3d923563185e7bb6d22d7b2fb02bdeb6ee79255660d4bcf604ef97295318863db2a012427ba35c07539e7e7880be6410a236c7515530228caed8b8a8eb42799dcd492918ff6c6b21d14b8729c9cb3d4e4c22c038090b7f5a06746f403c336bdb5d564b0a8a095fe5de0adc99db3237ec540debc26d60bd69cfd12cbd217009ddfb8d5e46f1307294cb0a777f6c7145f73e3b6491181148e3f92949474321ab366b6fceb0f869bf9fba6da71181b0b6f0a77a5259da8868c605abf917697029893adc0933c331f59b5d02c10e3b2307766c03cd001afb6ea8d679ae8854ae871c7f0c117ec2fb5c13ba57d7ee4515cd1789da4fa2edef24cdff559574e6e2a05515d37eed793b0b9cc2a30ffba9d68f8d907e536ba560726e97d60de499b00e0677a6fcce38e524d596911faaf05f3b822813acc0f1c31fcd0eb1c7f49d951c4c2cb0e7813d63e54023e05c14ac6cbbd3248d33ef002c17459439e830a0346f831e1df73481e0720a3e4b721155df62ac87cf40b9bf4cc32caa0aa13cd1d2fd931053d6829d834b91a80eb922af49fadab96c3bed74c572bdfe6f4a318266746f0949dbc6e70b581d165558bf007e4b4cb6100d552be105fa6697cb867574623601394f7a6373347b0df8e74afd9896cdb9de25bedad1ba40fc4707d62de0137e89a76895c1b1855d10c8a2c46a83a768f8b2cb7f10f1a0226f56edf810bad04f7df1615b36f1fcdc9ae689a494f1ff4351064da241081520557b4aeb358a3cf8ace418b50d5bfa0bea99d57b4b53420b8261059e985027645eef32b1b2ab8da866dca26adeeb58056cdbcd73bc8c182c5c0c8310c35041ef8aa1d9e209a0f37e2d1ea5fb8e12381b2503914e8c53311a13ca8c310addda00d9abb3dbfca937e04a9cf508c53f6f6154c858359f724470330bf6768658244aa4ff6f154823a2a5a411594cfb7832c3d6d175c6ba5cedd98d785e5b361e635f89d74edda80ebc9164274631ffdc4a5cd0d6717c382677f16ebeb2132426b4ba4b2d5cb3afd791d171f59dcee488f553d7ad9e02a03b391b0e069ffc9394b9290a32d5708684f18b854ca286c543df329fe24a081b1be76d99bcad809f8c320342f86369ca098db82e5ffa58a9e43114f7c68028922e36e309343f833457f8a8e181d56284410bce656291fa17bdefa4158b2493cd3be20bd145cd8848041251aaa14d05f24bbab82ea9b9163aa75eb4b878c86935f6b29769f6e26cfea2cc4526e143075ba6cf5bf08e75b440910dfce978e6b63029f662e1253b8a19ca4c8dbaf3ece09fba849113a6700effb954ab5b26e655219f534f87d0822d7f26a5208e003fb4be11b132b26b3a288f5d8db3ec7c4c3f906d8e616666462136052899193734263d3033831b1af45317bbfa8d1c1bf18901e242b2eda4119927ec4c34f6ff58440faefa4da500b1aad1371c3cea0d7f57325b6568a60cb0dc787e8c3842670925a532115061dd90809cef9290f0a02729bf81fd0f4290c54afd59b8933aeb9448c8c84e2d02859dac61ec5f0c8240bb03ca639048a6780ccb08e8374404bf420672351b5fdc09e8ac3929038732516b14438c55857ab848df2e8909ad114e4879b654cdb99c8631025dfe68f5d20e7302bdee7d1add58c37631552821913cf71c4b7724e8bb127721ce0ba05e2dd8070b8d0bef4150f929a0735cb02a379a550f8246920ac9560d11c4c1106a980ef4f3a1f56bc067d78b2c784dbc919df48551094a91352297d01e8498940091f156f652326887c8e6029f07eb8de55f3a48208bbd1b06659586a910ba70d524ba730ff0dd3ccf19abe98d1979fe81ba03354a1155645d215519ef62644f24bef9603ea61cde5d2b34a7f3e79938485bfcdb0736995d104002de67b274cecbae46e3ad06d1d74b0f18fc608ff1aa08ff4ecb9fd013aa10e3ee898ed305feb56b7fa7cada755cee098f158c6d524c3e958ed511f761f894c8b8276f87afc7aff73ded42f740be346048dcd34c655cdf81109c3de542bcb8045d1b241a8596eb031ea1bf19cfc48db719c48d0adbac1c44718353fc22e5dab003e6076e281eae87b82a77ea4bb2ffbad8e6a7a71108e3e2b3483d189f830ded4bbbccb2d30aa8c47486f2c3284ff4008750cd869aa711aaa0f23f839c404331c7c232edb84a02b7c3d4cb5448a930203ab09b123eb6f0a4a63aa78aeb0ed9218d602014a336409ea629a06b5176fdbeda0540cfaac6d70589a82b39ff7700928044df254c6f301a3c15c97f2554b0b582af08114182d030ec911073cd4eed81bfcc5b11f25e45d9aad9cfe21bfa70182373a0ff8b62589aa5d64759b031becf3e247b66bc89f452a49b2bb2c4d153bd0a355fdba443a4fdabb54a84e71020084036f571352ba0e5d8c04ac33a9094490a6366ebf6659177661486921bf53e310459889549f9b417c296393e9a0d8f2c7cc1d97ca13712aa9137f85cc3d9114c990c121775d20adb3e0a3b0668a21711143133d8a7cfa8dd571e68b21f48c273bfe79a91df843a67148cba24875991e6af4097048d6ffbeb9269f916fc3b59aea984993a18e26c582b42530ce5474fcbda039e2f8c113b9c2ee0aece07436bebb27954df78b9a56c0dce872dc7ffeba927790ff18627da03dc6f9038e34a1321ecbd183fc6cdf67c26b1d9dc9024397e4912e84cdf7b5d6d3ac44ee20242539a56943d918c5c544c92ccca2d555422b45eda29d60bfb12a11cbdcbf2d3f7b6df41e28bb490d2a39f04528c4d3be5f1d69a63fa7050ee9b89a3a8709b40ab90efeafa0a11e8c769333f7dc8848ab78577c3685d4ce4d00de753f8a95e5971ba2a228a30d6a6e0555e7b2dabdf43ec59004f0bb20f8cf41f7f42efb1b31a4b65769da2177a727a61d18185f550a165534bdd83e68e4840ae8defbe239fb83b4fa64c07bc7d023820bedf8cc2556ec07a8923de99465a7f1961516cb205f85899a10aaf225ee2fe0446f73fc06b67e50d8d23a3f5f1e55c93b3cf7ad30722b95bf1e8c94c90304e5dfa0b095c8cfe6b5626c71d22ab1c27022ed48a6e4d5576cba988ecd557f9cb1e531bcfb40874b10523053418704f714aef0a66a9458889f797d1462780fd246e0f45cee0bcba109acc401961afe910514ba4199e8aa8ac33fa8ca1ec16f98766197d568a9bcc9abd0829ed640998b8a94af77c6ab4dc5a4c1b3c605621be29c812ae16e6abb99a75341bd7aa71893fd640e91cbb0cc159eaaa9f86192bbb5773c4c797988c6fd57028e9e842be3757d1ecc16ec1a116b603283456bb9b9fb6f2642076116b525cc0a7cddffa60a62232f2aee9fa899ca9f9087cab677aaf513038c9896f95649229a4ae736ca9642823a9a0b821e6f791858db44e2e4b1683ccd9e426d5833d3606a01f6e6a9376adc30d3d11b1b972fe9740a0d0455a6f0333ea98e6948235ce4046d00a8a863c5c36dc1e9eb845ed0cb164704067f99784a928daa3317b23c60e06f637cebdfb6ed9786416ac88a09ff636d2060da53540897c850d73eb9353b45e33e2055cce5d261634a076e914da9e59f1d78ab42bf5066beea7190d78297cbae8880a554c1c552ccde155e1222fb88d24dab2f8a180400ce58d3b37c1388e4b6c661126a91d1df966e07cb36b147925b17ae3882da923bfe745270f5f00886c282aeddcf097aba28adb8fa6ad586cac982e0d9484f6dd59beefc1969850edddb5a477a8f2841bcf7054c300787cc73b49dc635c6831d13f16236a152f68e6dcc15c31f3d4acbb9360c555793b307c703fb2656ad064ca85711ab90d78af5b70ba121f5cac6781b88ab800b996308d2a865348a139fffa7ccaeadf0022db3e3c7454010428476c22729a8c3e97925375c639fba9024f883a371c27b88dac91809fa3e3dd44c1c2a201ea7c4a655da4de43edc6114acfab9d503ebf2c2ad1880daa8d0f0e54be8b496100839ead693be880b01a6a12ace7afd06d2672430b0134b323d5dcf02c1c3458ba15650ede4cad77c0cd14a7ae364ab369a9b13410f5dce320af5ddaf0893ac57686259456ebf684d4cb78957d30ec007840ae8160fc3ec2a82faf769957d294687497fbe9eec46b6a99605c850b8ad207b82c3c56bd3150f12b8f77822d2b9ed0e1f6b402e7fb2d144e18175f18483839d14f8f8861706e5f05c4dbaa352e712503081e992a3016ea391709615603868a559ade6dd508abd79517559f2c43dca21b4da6a354091823fac33e09cd4fc0b22cb0287dfa728d509e2e05baa25a3fed32a08b070f9371ffd7240777abc0f694f541b080ccad628bfa59f05039b8d523d8c1f3edc6a75ced16e25a819bedb841a14806d62ec00b754d137d8fbd57dff0e7bbda60680024cd0a081b280fa43f44caefadec44f1bd8cabb60a86b9837e2231e43de5a46d80e14d41894fd43669d988432a4a959ea0c33dd8fe00762d31ac8ea5f9449f638dfab341c6a8cc439dc5f003d3a9820035a81b4b63bbe84b8474a9d3e17c4321e9b43491cc383234f0f2dbd6a5ed9febc24b59f0a6e01eca29514c61d13f26e867bf8a370c8b65ba98a70f49a335a3142d99c253b278c8fb3759ebf6a38e2a8dc2cef2a952be94f68630f80910cbf1ba04d2a3c13d04fd34d1ee43ce5e46c34115b58cf4099ab7182e28d89b900a82efacb1c3bcf7a7c36840dc69dd74e0f1aa2f7b010f3ba1a20b0e3fb7102247c08a900627eb10107c3e48fd7a355f8467a05f4808d12384cd8144e155f32a5b3326d6d996dfaa1198463e928eaa0e40ba8237b883bc16c6915fccda993d2d0b9795682b5f3cf7e4557b55fc50f7c09d00b39a54d08b277b8c4a4fa2c45d08200b4a73608d1addc361f49c00ab9c229fbd914e9a0d98bc3af0ed7905d6666bd78dfb345037c0099770624a06ded38bc19542b647c3f79748051a601ce416da49423c38bec9e380320ae16155d8064d456b209044eb7ab43c80faa34297de5da4e693c3cf23371b80b717ac5805551082b97aa056dced93c2f594ffad03df54644437e06b4234a08432b4dfd0be71d6f6310b847b025e80ed35b83b62b0fd758cdfdf81bb841d534ee16a44b2e99968a895d5b9550bfe23c24a180bede87b8a4741a687477b323ecf1c507a28de7223fa14e6eb01009d82a5dc685abe1d65857c7f1ad8cd500e80577b8c340fb8c208e273c07a4662788b6a6ab3dcbbbc5f87723f23630bec0b47e9e5ccf4917fa810a7f5f99c9c20656cacc519d27ffcee57864377db457ead9261c653679c09ce09984e96cdf2ec85385f9c5491c712e848dc529f12fc8228d7dc96957f05c739407d7e7772b8452b97d0f3e5a2befb764b3e32bab10b1ef2ea0b4d5d4222ffc6e69615638cedf1d735981f99e71420ad7df22fcd9de8270f401e61038675ef7247afe3558c0a991892560752e83e149b2f2ebbb0dbed1bc1e0e35febe5b175dffc0cd1d45fb2b430585b53b485104eee0a939e4a92b8d817774d1dd9a4d01e792ef6d68733c6626c0d16b7cbccaa235a65844256bf28ef140399abb18831c526881536352092738da265b36bbaccf21158a2abbcc0c90c99e00283d0063231730053fe6783330e27b10e9492ef4f046a6c186eab92c858ec61707b37b5f6986a5285fd3b9c7daf70b058c125c0afefc6c84e3d334a3292d6aee62e9569c1dbae6de590453303d28894d08eb3f34a890e39e25352fd0f6bedcd8c3c9346b307390fc40c8d5503093782e2aaac3f7add60be6c69e8f0c9d40f459a4b6e73d8c893b091e84d3b1a693e94d63d3a9ace9e3c4a14f4011a223eb4311f738bbb239f1ede163d44cae21492cdc7c2882e3d34c22aa5a122c712d46143a4e7c474fce4e8c3d931295d91c3a9899aa6a3e96a50427eca8e7f342da41f34abc4c04c280f90f6b2c3a4ea182bbc55322a23228a3a184100728324782e1f80d19e23070b01cbe0cc4c61297cad7d46f88670edd9c0062984b1bcc11e1bee3f9b49e718566d8c7a2fa920d5b25c2b9b9eeca9338a30e326081594ba5b81331452966100b551209fc52917068270a4227fc66df5e6ff4f75a0846165b5f2c31a620e24283ef1d4d3b44c002300c26dac51562f4e9800b8a8e863326c5ba4ef9a6c7bf140c6ce1cf6980902206518d0018dc343949d03c9794da0dc98096dbcc040a49117010542bf1048927871de3ea23a2df9b54f7df0a51e39148b856af9e1a74340b9c941429edddd4bcca475492f70f63b824bd3378611e82fb3c88959bb1810724899a07f66654cf4660eeb4edbf180194304540c8aad1a4bf3e82b7aa2b4219d6604f1d27326ab1504ea2af00bf6c05a510f2459e09fbf714590fc8b28bfd652c094088c0aaf65332358de8a8acbe08058fb9bb791dfd70684b0ee5fab6641bec6e5ac376718bc887e089d72be006cd97701e6d6057759279068346f79ec12eb31d913ebbd441cb3d2679741235144790ee6e5cd6cd04784bdb2e7f01f1f0b73354d8d8b07b5734b91851b49f88fc5651e9e4d3672e9c18d07a0f18be2c91bb3d3cf3aa2e06f90bb2dcbd0cf9eefcbc509aaea80206797d072cf3ff76cf65d80c5c666063407ceeed21273db9f69320f483683805f2fd90d7f6289ef6e53ad3cd080f927d7dffaa33aa9273ab540fb4b0147cfbd3a9a60c8ef79dd597348e6c896e70239b8618052281521dee749ecf45337117b3d3ac9941186f8464ae96952262da9fc5685697ea46fe20eb5697c64a733dfb2c233e81c0952ec80aa7502ac6005017d4dc0425a2c502b632e7e7f15f495e417c2ebd81dd10eec3dd03f826a98babe2f6a3405a063e2b0cb61d12b195a60aec98362492811ba0180bdb8686f3bc4335ecf60d409eeae9c03901d54771ecc5f225051aa9e0ab1fdf9f26425ec11c2fb44befc0622747f29b8857430f0f9586aa2b8ef0002f86aaaa96fe3e0182910701c90d6b1081700a2df07fee8ea010472575afb508807fe22aa1feafd43e1673300ff4830457926b6ec552e8416165ea3f4f2925bbd3e43556be05f602d3fe2f155c16513cac37f99fab5ddacc2b5b722506abfb11b8f4f2c0423b65245ce97f5d9ecb2154a4a6dbe8089d7e58086ccf1b81ed4cc29c0eee34d541924fc8fb80f3beb30f34a389de3d3e1ce75755d59f01b189bab497519f2e005e3277a2fd8a4fbfd21c1fc4476d46760b9be285d0b1d20e0a7fd55ada5a19603f4810b56ce3af6a69982567d4766e3893ec2cbce19be921af9afb9edbe724d8c096f620cce3745aea6f554569a3a8f4b8ae6551b25e763a9020774fe8d2e1c8440c51aeaece52e6f6855e6dae4f8ab199d6565ef878c8f17aac09f443b1d7bd4582c4fd4f9e74301418b1ca34414d79fd712fef6f8e4a2ab2279b4a8e6c7c1138b10d12938fef0f1435c86cc2b4f79acf861b676fbbe0057b631fe9d6d5efaa0aa5bc30321b5bd1682f619f506eff7d55e00c6e187a0dfcc53f52d787d51646fb07a45f19e9cd49f3eb6b987e9cf4a9be86607e142f3ea67c9db4597eaaea54872594c340728bbddd853510aa95af19b3d95c8e30c366de4718c373ec930d2c212c892b1650a0e48c0c50bc07298b063a5d4c97a998cf13ca60fb733e374555130680e23e6561b1d127f5cf0ac8979c3562bcd5b2d28693c3c01d61288c89a7bf40369f5032b749734ed35fd83f41585bd8c87d5a925e8a49b66962e460238b234acfb52c9f16d4df3410a432dfe240619a782b44d00ba56459c7053e48528508258f4005133f12b2b64e745f954752dd3dcdfd4c2c84d01892c841393300912952e339c5e8e4a1065e8f4b3e4d69acb2ebd957fd915875df7c463557b7b03a0cffb16531813390dc289d2dbba97542cedff929e08bbb7a6e2855769244c1698f6091c536c7d6c178097baf9671dde41c18c1632c5f654c3bfb6daca1032c84f22e8d4f9f69f000cbe7e0aa164740017748790f0f21e977e389986361379d43b7a7404e0d067ee75e7d1a27c52b1cd94f37df486b8fd8964b3ebf518efd8a3ba23c27f5a312113904de8c85caaa301c271c44e853abdd172076173393a89ca275176dccab40ffbe31e133af2a37d156ad9c695c200af7889d487a8dba091cfe474ab33941f1921d9060462f1aadf4763018b25b83cc75365a3b8399ec35202ec6b1e5d8a8532e19448e6dba316163f7b44d0ed7b87019c9bdd114bcba96e05c0eb02ab8946e8915cd9165ba1f8b95ddbd1c9cced53366a81164dd79a6da7d35c3a8c131c72ff4e3cf292aa4b36a81594fe900859ed1221203e4203ee37f62ba1ce9cc724bf3e38d9dae3d5caaaa1981a909fa3503a57fa58bb7e340f61e1815d4a0999ddf61c7113cd7244a18831df4942aad2949ec3081a4589155e271aa225dcc8fed86bce6da5827faf2921c8ceb65621511bd042515954fb0971f5802ba121bd7eff50af1b159771bcdd01e8caa6987cfa77f61533e015b178bbcaaaa76863868de92c00eb06b8e44a5c9a5eaaf0a078f17cf518f2a5e4eb5d6dc71cbf27d7d6f8f80c77ce62189d3f59801be976f09f8117ddad5a48228613d0c812f8d08def88a03fe3e03f306be0e10a513dda0cefc5368a7f8940d6ae808844d408aacdc2cba4175b3ec2a19dd9d20de35e70d8d0cbab44280c570ceaf9c0c58f988e22b6a4de2e4d56a80532fc36a564ef1277d486edbc7b4f3c0103b686b8e19e827ede7a5f6fa59d5a85059f222861259c410d19340c80291c5277683275c4becebe2eead3aac86aae3588d202399299e1be192f2a97777088b6b9161d77a8a894a8b22bcf390f7273c031f86fec3f65b2feafe4c1ed1a36beb32e53c3d20435fbdb354396c99a8a169903263ce5e034ddbded0ffdddc214d4acd7224609a6c56fa7a8910aeac920906006a8d52a3fefb661f5afb14a553d48f64769e7622793ffa248037d9442020ec14692e6d1b2980f48588b059a80965cccd3b98d13e96c4f9ab8042c73ff2c9dde5803a2decba8a4415676402617a4a899c5f928733cd945e3be7ffcf032a508184b0e83f528fd0228b921c1377f298367acf26c48193c3d08a6528c177e5d5aa435fa91fa7c029496ec0bbb0840387af0422f75a340610791b528af5fe0abba6ad87e52643827279310c51894bd771d94dcbaa66534ff044e5ffac4dfd0f859245e383def16d59ed6fe2eacab562cdf2bca3959482087c15219c632b27e678f6c36611cdec02a52a4118fbb3ec26a0eba813705eba8ae8c88765591e7090a0863857a589846b7fecfac4bd98b53cc47b556fe52308ef63322892435f6f9509248f90ac9a072da95dd2f53100d179266237bfcaad2324e6b02b03c6e61d808650b3d8acb8f73bfafb3d3b20b0036ab2481068483bca0f0578908507e9ebc910e97a50c22cbff3377d378956defe7bc0e564f00388d9704079d7169dab1c5c336b19641cf031d97be7fd90892b846a00c846000fa0dfe8a65a4860519681d0e81fcfe7c3e89f0fe3a49506d076b12df610257580bbd78bb0b9baa5a142822a0b135ae9da204c54e558d1e4de0c102baf77d0a61792120bf51bff1f5e595275c05fbcb34dacd017f34674c8959d14cff04183ba05a479ae02d56cb316307a630f61d890e801e7861a140746d8fa6c483a98db70f0714f19a89721c3024ae9c6f8f10c59c53d74b955c206e157d0d7d3942abadf08bc8dc8ab445398fd3bae5550cab979fbf68f71828d5828417c344ce7be199cefd25197f03154831e305a106e54c6549b36534f6f2cd26c287efb720a86d588e028cdbd4a973883a04db1bffdd34f9fe64013d04be9dca9ee30394ecfe396e782de78f54d809d76466357e8f0ac580f026d838dea83a416a690d99f901879098ac5d207aa1ce6c351129a6efaeb34a3cbd318a4b1b2417c70f8e101494a2c8ff625ff3efa4d032d81eac30a0bed9c45abc6eb068c4e469a899e1d58e79ff5b05808b67d46bfcebe208fa0e2614849e874aa3fe1d191f7b6f2cdbfcf21031e1cea1d5fc9061fcdaf6a5c7ea8fa640ea2b2fc998939157962618c035de1f733a4589853fcc8ab6ec950d9fb3eaa7506ca8f38d3d37b02a371390cfb687aa745d6ec40fd597fdf868bf0dd810d22ffa389fd6ac1a379ec60557139e75e1266440b27c3b3a80e5859134980d38753b3f0279efdd19d26048239cef6d6728392796660f1852859c2ee87f1c91574eb07113cf1786cb7b0f3abc9c5ef3f220539e9acc789afb4f9198e08490c477e92199c890333cd43a0d88383b6d8f39b85d4d5937b0afcee40232f42daae264332143dd762fbfa747c608acbb46328a2651c63ea0ca691a7db13a290441c55f9beee7b034971818feeaa3e493ff6f938579487c67d5aa75fc58785fb8dfaef3f565eaf4b43c4bde4d9196de194299328b1a89fad5d0fd2d76e7bc569a97712f8700358226808c3760010891e6ea7ad89d41596acfbebebc4f94b1b6fc389dd585d809f4ba57a4ef46ad3db434c81c24843a0d377345648a3be486ada1cfbe283dd0f74b7507fb1907e86f46d306912614bdb1890280ff881eb6531e5d65449c383286a2baff768eb0c3d7dbbf23ae66453b86b09219f0b9f185255ddd7d971fd8575152cb1866dabe842058562dd3a9206203acaff7cf87cd680454c05e91d496355cc19183272f1e0ae4e61f93ce09c316c9aa933e958a9832564fa9125e39f58be29bff1f4f6ce2147c348cf03717c20e813c43a20d70f4b3c88d057492ba0dcead8fa1427803046f4dfb24fb50205af1d3e7298ac378223f96b2534943bf7c7def096ff46df5c172cdcc9823a150cbe5f04b468c2dfeb13ca87ec49bc29094a61702e3dc4f467c0f536713f031495798b118110d13015116368d2f1ba57c4bd2824abbebfb54ed08970edea2782a70124075d2199974677399c8686f148fbd9512c992a8110f848acf6fc2242e52cfd4fbc4106227ead6a465ea735b71e5997efa0c1f38f20d5871de70264f3d629ed8f953039253ea2359a9167b8ef33c71e23ec39089b02e984bcdd7b5ba192aa09a91adb611599fd83a64dcabe5195c721a865ffc8d846a1899a26cae4e147553cf88fe0605f930598ac7d7a9dbbdb66e531712e01b3d83c581ebcad76e95cb40b475dfc6e6cfa63085c2af59401056f79cc0bc3a6a739e27e4aeb8dacdc4a999e7aaf989cedef03a8c195ebadbe25069d08594ae265570b1de449b86c2a7119655595af8be1e977d5c4fc3f2e80e5eee9d99f879ea0c1519bf594d922d51133a2f61160407d9c5f718f5c59842ff201b2e74d1f9bbe701ca09ef3c55ab6b7f9ac49644a65232cd36156246aca6dc672650637d90e7a1b7ab7e152387d7aa2954087b8c214ee07c8c89a8bf45f8543cad7d1bf893e9111ce93830ecff05858e906cec06864d0793d2a01595792488e08d9aceba3aa0c4a75f6d3b630788a80a5dc43946a00138aa9469d148b2c59d8a945cc0dd9cb37d27217f852bac3a3f48619c56b3476a86b6b371664f3ee0cfca2d1d353242ca5cbe4c16b6d846042d59b06b461dd21cc3f06162c43e545e29154a864fa20d8d587706183378e7e53be9d736ce904c6a387fff8e6669d92745c35ca470fe850d07d308f438331696091bce44049ceaf38b66a0062f3ed1a0ef72575da1057c9bf74b093f430035dfe75d0d334f03f93f43aeee341039b474c8b78b13a935a447f1d4552779524f6bc3d6aae4a23cd1d0c42b54f1abac61abc98415b2942fee70fdfd42b81406260a9a3b6a1ae2416d3805e4a690f6273c556e173ef5633565dc947be62d26b8f8635adaa8642cabeb87dac9331cb637bd1d2a12bf5f447de1ca27d08536270b0af49122274e75aa34015c7b18318537a22e4a36446ee47332df2878390357cf0f05e041c33b99d5aaf218f362857fac3e1e7cafedfdf5c2de26eff28c570efdccc808ed1ca94ca14edafca67b00942de760687e41c52ab13e98035fec13eabdef12394bac30fbf025b7e0d53f50dc5a235aeca5baf97713ba340d5f6ca2fc1f78ff228cdb369e38f6603af50bbfca93c8dd5c705bd2b8e61b6e3dfbc61441d7a1822321e88526ad0887315e4af7cae1aad49e6dd6268299415429c42d69ed99a5ed1814401a061eaa3f210188336eead95aeeed364fb2e4996ef66c146ee9a1463932598e544809352715cd0f38e63e8f6b871110ab6a3c5b7c7fe9c6ee2a8f6688cd708ea8bd53504263d8b8f02cf5218384c115b8c053a090fc08859fc7b6674f4169ee256af88d9f011b2c8d6f61b4fa825db575050a1f78d654c9a0b7d9963a28859a76af13873e27bbe95ff39a9d99da8dde88c3716e7270cedf5eb0b2d14d33594849b652e668a65825d04d5b0205eac26be60e44b739c7bd1ec3826934318912e50443f1ace79351dab8c7842f204a738aafd682b90acf592438ba62d6b57a1b963a8f8cf6d2c633f3fc23869a46c739d22e9bf669347615da4ffe2c85614b2dc0d854b3fa3873fe2b28faeef44578009ac5e1b871e641327293435936d84940549bcb1216e8822f236f0e95fc7881398e788fe75af8a99065383eb206e4cf8f5771c432bbc51e9e2cfa16ddedb28bb203270075638c281d5b0bed55e8f36007e31d6ac5289da03aca8da0df4c573a4876609524e1473f7a83028548b23f46b6259598a27c8e3124595abe8320a0d43a8e8d1a5ecef51547bb0332948c1a7653514c6f5838ac4186eab660e9974fb035aecc026d68db9052aa9816ef55ad873712c9d6015b3d0630c785d48423747636c7255a227044e381540f196bf782dcc56e22c6e04ac77bcead34d4a381d5ef66b7ef48d68b9e46a4647df0c7b9260ff41f46e30248173cbd21375916b3c56a501d467679464aa4885dee20510860a72e56d1c597280303512857410400e393f8285fa5293f9030ce2fdb742da6ad996e66477b88d3431408e4b0e41110030ee1d52a395d3169aed651f04e22fdce79e7b5a2106be578fe4867157697dc3c87df6b0526e04827d0d8a4529d7b6629ca9f88ec772a06fd1b663475c5baffa55d2deb82fadda56bb64c87cc81094e88460948fabf404587071b7a89d65e4bf81181556a13a384e3c72510ffa21965bf4db1c21821bd6dc5a84a01a4cefcfe1f3e25a414842ea661f3d644a080f4bddfae69c17843c22b673af955ef691b072a773d8feeb02a6f909bdf90c55ecedff36e63f8ffd9f2fa8a33557694d10a4a9afca37856075da0cef5dae559d2641ac824f4fec7c749434c518758ffabeb874d558ac1ef5ad1910f60a12a5fe5d8f3a7ec3768074d12ec5838514be58be3b68fc3d4dcc887e7616c586c06b258d8e62218f47a1a190a0e2a26f44f25408693a73cfcf28f4ff988ef681777e228fea8c5485224852fbaa6f80e2770c9d6bc53516c91bd0287561ee5aea989cd5e4eaf99e73094fbbf4a506acae519a458f230a7381049c29d34e3f17562a119ab4b4e5ff4a16510d0ceed9a5296a05d7e26f4dbc991f6bae01a0f5df0eb60c5d5c21a1f9d6423eb6bf164ae20610e37a6d7c3c26df7d708f766b9de717a05cb1d04c35dda5149f70bd1a8d4a0c75847522ec7f8208536be9aa2aea80ad9733d448f34b36cb769821fad0c603582c404ccd2901340ee5a43d2165edc69574466b2aa2fffbba5492c339d0a36b52d4b1a1871fdfd241aba32c364e7dfa9c1bfec858b6141f6260d9d1562b658f5010ad869335fc2f84341ff0d69cf9342a5c620ab830889081063c2d6a2f7fc1b27cb7e41bc7ce280c5ba195b2652786bfecf8bb8a37ff98a02e232b1e616e7a431fd7f17a241c61e15943f7d557b876b3ec822f83c565c1e2374c29238ec14353d25d58874acd1df864c8b3bd301b3e98da03d241906c11d5e35095139f06fea149dd2a6a450aa48aa4d953c4ce79b454d61b52a8cc7d51ff1794564e8be2d5ad47f2a3aa6494c864f9a4bc683ba43647b7e7322801516a778024b69efd97182af68c2b1e9ed17766b50f9720d734c77db80bd8449753b37974b3701b90cd9b39118c482e9c140635cd6e0ed968c26b4dede60e38ef3c1ede1ed6187e7acf9df84c08d44ccc385885e45f061e0cdeb855ba67e4efdfae914d6f4548f2261d6e9147bffb8c2d6cf7777c22923a95c9df4f03c68d40d15eecdef2d187a207f48d2ef249e2df8dfbdfea8941149e9b400a4726aef7e08b543d0d5f48cf471e1221e6a333333d29ab51492735857252a151f107e596bde55f5219432a4fc7baa4ea875f5291b933f7b2237101f3d730f680b8a4a56b2ce096b316850d560aa6e0bfd2b677c943d0255406df3ef5b75bea6fa9e16e937d3035c804704d17b7313c4bc3913354366122e77235b591457ecf3c6ad9096ab479754e5cba9a73a30c307c26589a1f324ac4a9b08cd29db5b631bdcd6fe245ae1b8586726c22922fc62cbf8ecb4376507efb8355083e188cb4500a460be1ee7c3f35e0e6b42d9d8d091b43a1b54c8df00af805cec2a9a7a241b851fa2c25e440ac340de93ae3533ae31ff382e29d828a7f2353b5f49142d6d4ea950bea90c929f73a913b8bc13f65301f610047a7e016df013a477d4fd5e021e9720b3a0bd23958fcc478201aeeb5a9971dd8c43903aa47de735a305616a70379046b04f348e22250465a2b2adbe309134971085291caf7cf4330932b30f7f161a1fb84302dd023abbf36350665e63e8d61b8acd760135dc5b2f017e00de435a6fdbe997d3a3759c447b2dbde7b6fb9a59432a51453073407f906916a2a3d3bb32a7525c6151b542381bc6cb0c81ec2d4589a8b43c07c5690527e3c7d88b2a5b2d242b4d102cb76396157f0e4ec99b302db72bed458f09c933dbb05e9a45008f59737a40fb1347572fa947304087811c4713e22eace9ccfc1b2326c7452f4542e4e8610c235cad9c685320fd3ecf5b18461374e1947a18d2be0a6fa71146c3f9d5565a5ae6c362e962b9b7eb33a29caf931c6cf381ff135ce874c6259903ce77c27c5f7c8f988fed919da8a8d156ec4cb0927b10b3e7daac0f6c46eb8d05ceb30717ce220c176117b23d332c6b1394772724253b0dee59e1c9b8e08cb82143834cc386243977b90f82441424515486af08565b9dc8384051c14dbc21a2128d81590d099c072627446588e25c60ca2b8c10c68f033831610610644381c587bb9e7481a438e48094561b9cb3d478a10852341c0e24893908ec52ef71ce139b263648584a5b314cff7dea6e2c83d4b39692ab99ee96446668d8ffc8b541c7b399626cab3b3c64b2aaccfdea8b0547cdc5dee2693e0243ac6ee5261a8c9f50fad78667e07a4c4f5dfa4784905874bf14ccb4952655584a7668723a29a725d25674b4385957538d7e34aca4e4e53a982134bfec447fe61e4445149d9b9ce737d8a8afc9c159d7960d326c64ed9f992a3c12515e220102f0f3dd4eb0c431fa34060220e026bf750cf89ed30cc7ccc8a79fd04baf3a54a8575e7ec704e3cc3ea5677ce0e278d1d29aad9e5dcf9a5a2308285ba5669ece434b6737538b17445c991a24a63e79a72dd895c9f59eafae573b251b2f48e2c382b6554fbd6b2783858a8b4d69c12d8e059c1899a152e522c511ca12206cb06152ab03eac9525baa8e9bc085259828c23422d5b979052c38191d32d1184820d4ac88824342d6cb8162091b1785da0bab0d96c1347605b683a26a84f70b2284c709d301c2b92a05ff0549c272598b2861174712c592829d900282dda8383460a6203c0f89943a0bc014f58120924ba6e71b385112b040b9058f9881b1006cb477cc37aa9f58cf048cb22832b6e689fba3021fda2d745892003555763755cee91010a4257d8bfdcd3041a37d6e5724f135be034c183501956e5724f1334b8e1db274d34d1d9d8162ef734814490ed2ef73031c50b1bf4e06502a88789232d30830926a6dc81470a65aeccfc04fc98f3bdf938e6ac756bf18ccbedf6ef4e40f7f8641c9cfc32b963f750807fbe1e2ee3a0f4907f2d53ab9bcaca7cde85ed21bfca0844c04159e7f4e7efe11e691c940e90328bc283bcd10ccb9f8c83f2631c9452be94ee2cdef559afc65607fbca7780bf54b9f5ebadd78f1e0ec8b12ea1b8bbbb4ff7c8b1d080e36acd1de7f4798538aa342d6a3df8603d2fda32ae9457573e6365ff1d77b39a36a30b92f3413fbff293481cbcd24b4c73ac8c3e9b69c82221034e36552168c48660646fd99d2d71ce47c67369c6e4d2250ed26cc741faa6cbb179c9c05e4dd8599ffe0e9b5892df82447e7dfb1ab5a217561cd17f5183673629f08cf62f2c3f007df1b9f4e5f7b28a23fa12b4ba34d4a16269d12058552cb5893e7335c8afdf4b501cd10f595a5e86ed9f960b8b61e8bb123674c171c171c9e199ede9bbd08067b4a7efa272c1b9345bf1ac1cfb6ce725283e26d27aec0e542ce950c551d08e930e158edd91d2a1f22e266c98eddc485d17255c6e224b2bf42191775018ecc2e88ce0a060a20e13f93b7f9c0fc3d0940d339f0ec530f4352f626872e9c7b08221a5c22697db05e0e119975b5db6aac5185994038861d5476b3384bdc92377e9bf4cc1c2fac7ab7911fa5f829a870fd9710a1a804d6d9714c3502fe887399a5cfa39563894b8f471dc486951d801a062a9ff049787be2f413c6375ec60f3c285e53ffce14b1077b1c0eed06b5cec7df8b38cc1a49715cb0fcf604fb160907ec812e5bab05070e9b3d8f04cfc70658c4b7fe58767424f5fc344ddcbca9f78c12253828d519fe844aa9b63e592e299eba97ce252150d2e17933e97fe25cab934d37ca3c1a51fbab02e55e3d20f595a02086298f025283583cb8ddf288761e87b3a36f4a10ed5a5f1b1aabaf443f4376e061d377e3ff4b7efd2d700706998f95cfad94edcb99eb9ecdb6186bed7f70c437f8678b10f49fd182d7d99229360779c5e821ca4ceb2fde14bd0a52f030e0e17686caac96a7aeb11b93583a61427499e424fbcbab9f1a9115c9a5cf0195c02e3a8c533da8d330a4f2e280ae8901ba71a17f4e192174e2e6e6471304660b69cd4521d8c9bcace8fa60bb0ed6cb51ccca26006d0fc26504bf2cfd60462b9d15b591ee48f9e41369cadd99a52aeebe3cf29f444514e6ab99e698d93a64d1127dd3869e238a97e7c6a44e72b0f938565059b35fae7abcbebbb9ae95ffc0ec6e79fe66996cffdd11d396535e03f3f5275c1e02564163f0c6c7777b7e636b6cb95c4b9e7a00d26b5b4bf308cfc162631ef60506e97df2e6263ec7e9634461ebc9f258dfd2ca947772751393fc9496c7cff907f6ef78b93988a2446aefc1eb1c42629597192d1f15439299caadb4bfae7aa7ff6cf54ffbce9b983aab96c72f952248f60e712c6546838430acf3777a6b0fdb1bfc972315ed4a8c171a3b7b74eeadf9e65dbe40d5f6edc5f4c4b0df0c8bf7e3cf4edfe6c70e94668e1848e22e9e0d67fc3ab1eea129bfc860170b9fedc3ce287f2bb50b418e4dbdf85420ac3c0b7391afa4aba04cda34b32aac042e7f6e94ba58e0a8b037f9f6ec8efef97abc062c9ed3b811e22e472a3aa493e1501f193493e8bc2206ed8f280c6b974c62f0c028835c9907ecb03b24bbf1dba3b3f24f2d98b1b734321b187f7a94f577664d8febedc0e7f23bb7c7ed19abb3d89111b5712229227c90e42a72460b4b3acd67bc0940cc3df1c0d2c221c0e3abb4b17543790e2924370d56709847e7174f9702f1b17db810123e0b95708786e0e198f3dddebd67a3a15717bc0be2f7310f02ef62f0e562055abbf8a9cab217bfa01412fed12c920c25a30cc0627cd3bff862797bbf31b55a2270e38897b68a0e44e99907d88386b8c1bf689c8864303285cac5e324e0a71f4983f411912e0a4962b6ec84ceeb40287bc44f2a9283e8e8ff2e34fc7899c0f347e0955706e7c6dfe088243eb60fe701c82a874c081492050d23044272c1a1030c902ad9a4e3331ecd53a784c0cdd45538fe9682c904413c1a3e8ffc20248187dd20ba0ff0f7f81491090e125068100937060568c4f51a77008a2d98e8950438f22edd37c9e4207757d8af19e02936200d23044223ea8bca4acb25ed775b17a0bd4162c4e318c8b6133da37f49c18b9d967ef54c3bc4d53d44a20e9beb7e8be1fba045d3871320581bdc047de295a37adf4679cc2314ea1d5e8a027304e02f3fa6b2eba8185b233c66a52aab5cdbd5ad44a20b18f431054276a539fb8daef877ee274fa3105b11d0164ea3eb43e844b1ded87ae040a6eb4221d80f801e26b5dc7514a3b8ebe15b1893e909b1bc1f833166098f861bf8007051886f8612b71e3f58f26890d3b286c954e07f909b41f75e8be28d85a051b76ab3a0b2ef5139ea782356beb5326868d3d657e73d737833fed2007e3fbbc7e4ac3861d248196f99c0f2b55ee75907f9d45fc336e7ce79ac530f1352b6cd8419352ad058f9916a039312839efee7694fdeea3b6b2e2bec2f9f49ecdf9703a3b91e6b50e7c63d0213e8dc7c0240bf49386217e7f2b5cbfe64edae14a9c88e378ca751ce545e89c73bac8351696f99d884d4e9ad34da71c5c559f9a15bf6f7c27f241a42072fd72cf0fa6382a3ef3ec8f5e574fdbdddd9d88adc84d166052911b3fb60b7a143fa2a0739a08ddc48d51d80ee219176e7c3f5d28af995fe87fbd8ac88a44f231ce47cddeafce5efad7c3bcd9530e023ad658638d9b659f8c10acc7f9e82086892dc5da40d35fd8b059cde299fa31f4dc3333f398af7df67c89fc678eeb56d489bc86d60b715c972b9b15f630af7c1a53e21911fc0198877f22a832c8acc0020b9c8f59c695ef713ee6778a0c1b76d0455d354eba3aa8836a9d45e49c2a389b2f60881564d4dc1b97ad1803e876d9e93a4074dd0d70bd6ff0c8bfbbdb63180fa5d81f3d1cd4de1382ad1f921620a127024208f9f37fa03fbf961a2610f4fb9c68a99bc9391af9d5386a1f34ec21789dc5b3d7a31ca2e3324f95ec5b36eca713d13783dfe9a364aae68e935860cd1f27459952bcc44e60cd253577c3b2a0eb46a68e93ba8adba3e373b7cfea5f9c8ff95c55bcfa3864bf7d98fdf6db4fff162c9b0fc61211ff71e2c6899beb6de24b64e3b1011a8cc68f13615c2c9baaa9c4491207c3f46fdbfced43a27d967926a78a2241bd49fbf9db257de435fbac5e779fe220b3dc3ef5550529e3f3c5eccf5cafee9f165fddf463f9717f3f5f17333365422911349e676d8c89898989449052ca8f730a8d5fa494d36bd91f7e1a2ed1c491bfb78a8991f918ae292b69e27b5eecf131c6af1cd9f24cd2610e21cbad2c0e7a7fdeeef90a4fb02cb77d7e5a34ee314ae9bd8ac1a2d02fac964ae1eb1062ac00075aa431c409aba6e2044378a3cb3daa9a1cd5698a31aa20458d2c7800051448b62a94c8b92e2354104f5218b122c51a9865e9b1014b8a267842a21802095e3ce18a1aac8ee8d1f9b9748e50c4755dd75584eb2c2189cb7afff2c50d3f667e512f7a5d9f65e1d15942e74811d37a96c5da4b47c77592a0c0f23cb1ba7248c20e8a30650d132cd1c424a57862072a1348038a2c8624210935a6b02c4fe43c01834642cc47610cd4095e2085227e4cd70f86144187988088ebbaae6b880abacf8c0ca8862f269cbea0a71f22b6d314ed0454d33eb85cc60d41a9f5e41481dea008aa1616501002105a26d972b9278749ce0f2a8fc63cf30280cf5df43a5c72e06871e186d7020bcc2bb8b3d85851b15d88dbb40cab179d327a3333ef08d91842bb72e039707777776707cbe015bc59a2dbd8b032cab91204db2f27b31485194e8c2ad376f2ca418839a2b818b35806f6c998da32edbdfaa1c5a62894095f2e57f9c5589d24b56cc3641062ac95af8eda389253c519a6a5bb20c618638da368ebb489239631c6187d05f61c162ab3d49593c6687379852d461642cc30330ac049198d955159c638eb46b7b0fd714a5294329a613bce2f7eb224a5c4cb2b3347b1fd5b9604db5fcdb01ca36f2c9594524ac9655eed9c18543b2cd4c92965e704daf38c6f4dd8f81a336749d8f0afa3625b8b8adde2199ef9ae7fa3c1a5ebfd1ba8d56a5c5fabbb61a3443ab46269071ef9db1047d9a53ab028f6b1e10c1ef9a3a146a77c488b0a2bb85d587f9946758b526fa9d810c18525e3db743b1d93ae48a7ea9674a9cec8f597b12f1bdd14456d04b5a143f8071bcf8272d06b38ae483f574543d4bfea73fd396bfd16c91aa3ac1c3922d79fb99aebdcc9c11b5428c422c26a60b7220eca8d1551180decc613630684d02ab41281bdf2e5d7745a77e324fbfe9d7f67c449a1f7ef72b49bf08b4421542eaa0e155a791f23134bf5596e1842d123f60ba1e2289413470f823131322befafad88422c076568a51272b225e1a2bafe2e2a279db6b81d72c2f2ec097645c437b47252b8a142a86aadca177ade7f870aa13a540815ba827580cb3d57a46e87e2196a04f340228af8ae8a5cf17343ab58ea8a7867e3a0bf5d598d7bb815b1b0c7607f4884839f2d6fcc92c1063b8afa6acd4dc0de30077b637ce618bfcfa6ab71d03b9483ae46d00db79f2d6ca809c35c81fa2ef75811e5865616083cdb8fcddd7e62a943a17eac7862851324f5fdbb224eda8ad4ef9f97a750811557aba290131fd5fe422b2aac8ffec22e753d0a14cfb470fd3b1b246ed8a5aa00badc53854ac7e59e2a58b743c5526815571d4aba879a308c6d625de8503af60adb53c5a987896a8ad5ce7de1f2144c9e5ccdb790132fb1c9ab5842d00d3b54154bc829b5a90a293937338d296502cdd68c32c3983f390e4e9d1863ac22365d223645ac65436dcaf5d7d2905146d93bb006e46097d3a1ba54877212d7d83829a545e96e3a1c4da529b9ae9d42db8d8ffc8d541dab040a76fbb9fe4eea2f22811b977b84c0b9bdb950a960c3ed8ad6cddd58b1a44df18d084b0bbafe5a1429576b5dff0d154bda4ee5b12b8fa5f9a87e76aeff9c4287ea504c6cd8a13ad4f54f75a80e15e30472616541b890290590848a9927cff6bc9eb3bf67c87ccb81656f4acf6714664b8cdc5f13b07594a159767665df702ed13f97e019ae4211a49452baec8f7d1ec1dd5c6394b2f2a7f2021b4b2dfd6c5200111ebffc9ca9704b7f6e6a13bf8c5ec44189c6a976ad5c5b413c2d13f16df75a6bad38586e30e8cf2fdd59d9d783611c04fe41fa0ba712b73fc024c95f388d4ce1fa6bceb163885e1ef937c942b3c286dcaa17d617eb14c3dce02c71b0eb1938b245ca6a651cc0b2f9cbf59757ede6e681b5dfecca2f26f7807e974fb061ad3775e3245a6bad1527e84463c3a9e606200c44847f284d33339077bcae2b7eb3e5e035e7a4cd021405ca27e57e9c449bc86d75fde594524a29e54f27d737263c1d224008204c294c319bd023ff70e6caf04cbf7359f4ac9a2040de50e61fc8fbc8c44195e541de077b47e7c6eba4507b7a7252c8fddc284e6a205cefd9b9a144c4b02137816414dbfe3e819460ebcf9683cead9260438e5b5d7fee27962aa7e27e3815f783029a52449c0a0836e454974763f9d09e38e85c14aef5713f9a0ff793868ffcb7ca328126502c693a3ef2f7adb2684e6cae6b395268394cb7b0fe2c954cbca14c8c310d8aa3e3251baa293bf809698d0d4d5123d74fd729a99b5c4ae78c33ce38e7fc24a5ddddd7c5d177a7f3a70b9bdd50c6390848542c4d201fb9fc163701e6f1c9d2fd59bbf14ca09346c4497302c54feac0fedc909e70cc2deccf8c428a2c1aef5448c47379d7e5bd93765c202f389c24e304bcb83d16dde012c7ee8ea51b0ece80cdc0865335e5dffe3c867962af0f49fce95df7eba9e779b5ced40d4e1cf15c36e880564cda71fd7d20022402dce2293e1c857bf5a3bb329b9a8afc6adeed5cb79b5a8bc286bcba2cdce919617b08ab71dd3dbc71556ec8abe791fffb5b617dc258ad7e74970c347e09a9eafaec1df5c773706f22d77f366bce1a5befc16b574050e5df7a5ac68565a04bc51054085185abc58d86679ce7e4caf1b310af796097bb570141fb963f2db6c418240726b785eb38707a7012f7e860c9f507e386e0ad3c3a088ab37b75ddb7229c78c6639858031b6e345ea2a7182f55d0529cd0f7531d1bca3b43343c9a1fc3a358b23c9acf7da1b77d277a9af102ba5354efbb16d6bfb96d07768a0b1ec47ba61c6cce4356685fbb2dba70849d8fd1d09ff451b45e6a53639b7fac224fb238383fe9a39f8cc3878b82e829dd0639d03896a88da52e88961ada34bf4df3436da6eb51d244643e11d5d46c00f91488345d1f114374a6f96e92bed1f9311b407eece8bd3363ea33470fe3c83c8408f313917962b81c0da0f261b42a92af2cdbac28949989b57bf6ee27e94c18af13f9c441198541f9a38a25d9924e9a871c836190aa2804fa7ca38c14fbbf98fcf9a40f4b3e91acde3e96645c963f5a8ded316258f52f6c6f2de15e22665df9d33c2e1467300c3c73a14802c3f00d2519d73fda2bb1af17abdf152392c1c1fe198568511b72b5ae662ddc360076e3d7c3951fc7707883670c406cd0a14f4da46bbcc44e60ddd0a6feee922b364e0aadcf0a6aa566a5486b2a6960a0be7f2d409c471070c0d3c3b5d6c25e27ef081b6f98bd68c533f23dd4fd701c6cad73a450b79f061d577ea215c3344539d838c819f44d95d8327328e98f73c6cfc1739303c7492cdcfe1c3bfd399cf4e778e22546238791fe1c3932f6c7cd395a93c388834f7f8a3e24a19752cb719323154ba18fe60607fb43a1279d1cec1c373eea38e583fd39701ccc71e360cfa01c2922531cec5fa1565b85e54c9b289c53c21ca92b6a72fbb52a9b63a88a4e99c98638ca91bafd2e2c979c58f2502eab76d9b9dd9f23154b2bac164439e1e4a862897956fd3958b1d43e3f395a39824ea8e862134b318b275a303999fa5d52b1d4ef82133d542ce5487939b73d9cdba9db36a6f8b149eed87e02f004e158cc0c3436b1e491223b72e9705104a594d22695270b79a48821503534e612973a4646caa794beac5c9a56ce4f06e1ee67fcc7af3c72931c0dd98d5f8fecd6356cdb9bdb2f63906b48143de089315ef1f23c8f7952403ca91ff80d3d1ff2358ed715af8f318bd70ef1bae663a23087d9c58ecadbbc56307e61439b5561e30d3d09643732b9a8c7f9a03f8976055d970fa71c25447ee894cef5cb070c73f717801747cc98174b1480f23f02c03e1a1fcc30d7d3cf3ee4a011f8d030e82148c0429814e7cc115551cc8e5866988b7e1843011ef98fc173460c4d10adf105d0f72b28c8875b470c63c4e6320064e501e683613668005584033770500d0e2f6d1ffa1bcc03fb161611d4ab7d37444f63b0ba0a83516c8043cfbde7b5cd0ae7c72602620b7d47310cc330ecb1ee435bf7a12df4ddf6dcd7b0d510faeefb21c900a27b4ee5edfb6bd7d34b9a01841340ecab3c10dc770f847d151f2dfd40bae71e88cadb6faea53f0a74cf7d0dddf735a87c1af84240413624d9deff87b689d824130a89b6e75a6842ff437743df0fdcb761746258cd38eb18ba9e7db0eae363839332ac5e37380e2ee1a14232e79850c2cc9327015e34ba43bc927e3b4429295d6349dbcb72c14518469082841e70a105175c68a145ed5ab97277c76dd24a6bf67e2bcd686dd556062ec0376880d170295fbd58ebd56ab5300c67498849adb506c95a5b23461ace08c341be4fa910ed0b88ef6f04a06b755d2b5690137902e4a435c5c7ffe2d5eaffffff63add6fe4b1064fd775d7f5daff1f51793e25fd7334f26514a6790c85ddba49c8ff9d5ba5a35e19a8585e28d719d015d5fb031f0681c2aa414fb8d73b1f42a088d06648c31344f4d7ef5d7e785dee87be5e3a42b0c27d1d5ea0607a88b814629a5dc3e31461feb37649694e981bd10d3fce8d7c2de3f08cfe8b8d5e4ef430e3a0471508738a20912473c5687200e7a0e12c85a302c8dcc0f6ed119e4ba3220fc30b37c129300f91f63dd7860678a47fd3855c56a19ffe7cf7ca2835a670c015edae39e1fdfd45ae911bef8e28b2f7cb8887d031533d7ea79b5664e58cf054f89161d31f585eb2297f5f27096a8281613e70a2b08f6d0b79f8836394183af6c085e5f0282208f14545ac7e218e618190de490001998c551789cc4c474cb09850f142c9673f3639fabebff77154bf5fbdbaefa4301804cd75725404a50d75f06efe19f17472e9dd8ef1922072fd83f0f15a2b821f3104042b121c8c486313c4e9a4c9c2463626228c59c00d25ed31ea4b981002f3c4f6234eeff6eedf935774dd334ed3528738c96f64d9ffe9def85f7010058004c92ab8f51b26c6d52a161b3074c928249973677341b379c3b7fb5ecffb76ddaf82ce2337583b384617898fc00614ee85431c6a8c2d547ae42bffeba9b6bbf9c8f54a79a4d87307b4e9edcb51b0c1bf28cbcfe977b5450dcfee6284d9d0105b8e37240865518b219646e90c811379401251845046018181ef927a0f6c80032f1037180588e8d0f8273325012c761e6ca35d65aadadb1241347fe20f8ef79d6665996653d64bab34cbb6ec8ac8bf2d76f51edbeae2bbbbefe5cce870d615dbbbb767315c3388cc3388ce3b82af3038aedcf6e07c5bb81a1f2e160e35be5fd2d8ee7c9bed61e3621b7e6b05d16517f2d0fe8df7eeb2abad8f5dd2cb5b3cc86a87e5d79242b2a9f13f1855c217706edbb8bb4cd37c54f415cd8ba7dadd817b91d7a06a9031b3f4d9fd86ee9607570c3e1385d64418c1337b3ece666d9ddccd99552ca1a4b1e68b5701d3bd9f02ff3c838275569fcc25c2f5b2b15b1bc3e944fa58c38e857a58d600031f3e4393fbba0d8e9c48993aab5dec7c82636ce39e79c72529d2e88b0c58e55d1164abbbbbbbbbb9b1b85eab6d6b31ee36d0a712fc444633814cfe0b804b8de35618baa9c93eb9f37e4d58ecb452cc7517c1e2eec4dc03ca3913ac0a0fff65a07b49f3cf28fe901868d37e48bd2eba94808cb83bc3d38e85de3a8edfad7a89645850cf483975a871e7c01a837655f23c13046300cfe97a8e712ac43b13f62620f540ad57d5da91beb925b020a13159b6ecd6e3590a7dc48a7e1368ef29b0e9acdcca846759e58a8444dd7453deb10d1000000000315000028100c08c462915838cf7349f20114000d768a4472523619c88324c761100319440c22c6000300318480216668c606018c54366a21e387d42368f0f5e04dbf425ab1238424b09b66b1a091249f8c17b7753dae116a81f10861636e36d1ee2709f6c8a009bb7e4619c9250f380dff6a1b8400ae9bc26ec4f24dfba108c9cb8a3b16af8b93ea89b7ed8fd077768b9e784ef0260cf6010edb5a777d4a05ddd02c8a2c0079ea9260d4e4567f31fe15ab1d2e0e5c07c126d2349bf5e2806c989d88a1df35e25e08dcc70469e20ae32df279946e08053a5a6344f901dea0445a7fc8cf1e2c410ff5c53042089423fe9230d0d61f8f77b801a624c839c3a4c066943d99944810777fc0ce1cfd9a3c2541b248eeb47061a164f1f42c2e71e73fa40ea047afeb87784d2bbe4174f3662f975b9bf72832b6d1d3e7291032134a13ec540259b1584c33b0fcae687787d2d6470092357f0479a3510f459761770f8e13b57e422572cc88d27242ddd7d33d5fecbc2834f40b7b8703957d25073ab3b5266fb29445d7aabaae1d3fc35313123e18c096242a614691066a8b4060993bdcc45d428f902fac4f5c52058cefd05cde4fa5cbdd5367d54cdd5de9ca4b394b32d6fc1a5d9ffdd0acbb5f1505241700795ee4c9de9e37884d8325b47ed470288a0da6d8b680b26227351c9a3bb678e909689d40592b43d2f942b434c56beede68c5842cf161825c90fb65034e2ac9a4750629233fcd3cb10e97d019cc46221b0b5ec2677b300beab6ae1bde62d632130a72e6ee678cc77ccb123421f398c42ac8cf33c5cb996ce5644c8107e5e3eefbd080297363cb7f02c7e9126324d3e96d3485e2e75433b02e28686022cf22be0747e55fc220af6988f65207df33a64826584d2661e1e8b88382756571452b1eb2afb869e7a57c893c1339157fcf42ae5b828d339c8b3c5d1e9a9b4836f1e35e9c382f372f9522b84546a353d9967d1274d19c6fef91cbeb9c3ecaaed33df078c705bcb1a25ca2facd19d7707fa90bcf66355c1c42d29d0991b11dcb069039e1b3fbd9b5ab6818fffc3753e41b9c7ca987ae2abcee62649cabf96f3dc63b8a37049e67948e8be66af73b95146864bd58e73e71644f4253378a52948eb5ba89bf5e3bdb6e88e3de7668df4a2547d8f10460449980a59fe46f5a82680addb7bd60f5a5081e4e395d27a9dc5948176b551c5c880f48c245c8d2d39e98dc9b53b8732d4ef8108cd5159165520f188313b30bdee538ae5da2af4fd359187219f8f9b72815b0de5a4d828488b1818ad357efaa2511519bc63731eb82e70592adabbc81e55da0da9f35c744040ccdbd218d65e800fe13a11a56b4949680415c48c8174e20949ce318b26bcf1fb7e70e688fa16f43896b5dd8db77a51d7395c05ea1391b468b306376fb3245a6e041b4e1f87d9621c17d1304fded4e05652fc1db518ab9df72ab1fc6319beefffb21bba84fb77cbd682911d0e840bb4651c1148ec2076a9727a516382d997f687fd4ce0dcfb4008ea24f72a2dbc30f6a98ebda0f959a34e8a1f0bbd980a24e0e33cc7d9c9a5c7e3c4c1b63a543e307a7feaf9b3806a6a2995dc30d310438bb36ef3f4255f6dff507fbf56e0cd9b7de4a9012640eb1bafdc7f1289cc7d72a89d1f20e48e0243d6cc5a9d70b088844107f11f2191bdf1201d2cfde3afa183999c3993831c314afb30585e9a16cc5d842c8700d158547919de060248d1ad62872dd6d22dad932e992fdd54e9e06e8045c250aa3759809617e89e21a4c9a017be77e7e8c124af35a8daf3e0c6dc1576abf5b31cf945e7c159cd6fc64728752acdfa9872bd8699559d10baa2dade5462dfd81785481cd729cbea861da52978b06d04c03709e0078b6078bbfb71d393e780b115a19b160435ec0449914ec0f3ec73c26e6dbe267cb32aa5bd12a28961437b05e0687e2b70b3c87d119079806c892abd1baac55d64411c1a4e11bd7764cd98ba01cd21b65ff9fe05063223c828de0a868488825c7ef84602336d439f148bd45ad6d0501059a7c20388e2a7c5a3724517fcc84a2b721542db0208d52a0a810ad60ff75506754a740133471a24d85e551f042993a6b70782ba1cf06ae3571254b5865e87c0db50b6c14c089e738c14f3dfbba92b14a9c6ae4f8720e2a8b89769940c5e00141848dd8e3b90d84c9a543d5ee58522901c4e594bda265a24bed2e8b5fc416e3f1b2573989cbd01498be8534b8f1be71b1d751df9c101e19b34498d183d1b8e8cc22ba6081b83968c987517e72d29328eefc27bf3897252056b222118e34c7121218fa4d19231bb9762378055cc831098046cc6da78feab68e5c006c53f8d44a70ffad2e6eeab0b01a700c09a8c9cff345f0a1a449bcec7131da76fda69b838aef20c2f94d97234b0c25e6dc6b13280361032c355b51ecea444080688048370affc064400fd52a1c0bc516879ef616ee062aef1db393aa5ea01047f65cfe18fc06489dfe3b08e3d8dccbd1f707e8be24f494d0c1771d9c5809e84ed28b590995bdd8e82474bb95bf5a85b8ae4def453719861dcc8e0bcda6184b9412b2980d3894b619e344bcb4c7fef2be17a7b4bf655fa235d6ba54c733714c5957e747e462dd326788eb4fb78cb28b7d45d8d826f4b03320e05e7f6fdce562dfc9393bd72f2bf62dd122ee86c6187b39cbaa3ccb991c0131b9b188337776a4a52d2bc71561ec5c9b224197771122bc6250c8ebccd8cc21cc58f3719c23c4bb5caa628de2aecff1778416ae610d2b0200b22771a3968abf995a920fa9145c4d681d4b0b754c8feb1fa623ace44e023fce6c8452327195b78d1548a765a4078b5e47f120d11f94d6821ffd01dfd318c57703fbbf5550f732c2026948ba790fa70bac2f41ee0338d2d0d485a6c9f110de7a7fbffadb20b2ca4b806b253751235b7a5d0833a4e07a08132a7afe4bc61d2ef4ce508ae81f4e5b18146d4161a9c4e1225d851c173c329fc00b2922d35cc3125da8338e99c1cd4ecade61f7af6a58d7365f3df3230608bdb61187b2788874157016ebad6083c636845aca21520bef60432af4042ee2d988df1e59760fb93efaf2fd096019921bf7baea206825d65a00beaabbb209505a7dfbb20160896995e22070c25aaf51eb94b2e2b03a37455f75178f4d448a581fdf8accba5bc9e54e18ed4865209156dec2edb2b6c412b83158d9791fdac03828bab1acfbd04a3f605de737ed8100e61ef9825617b298557604644b354145d8474a471e31120b2afa86c699ba913816ea507d5e18aab326298fa03ceb01dc175230b0726dfa5f35fa0d00e609f5c1af8a06de1d45021a7c5236d6be8cc29527f1180464d1129c8c42523d6ec456c071019256dc2d9e0cd34ac39f4f133648a3ca0024c83488c7415f86b137b5d35ff5cbfba30bc45b1908e0a3ca258b63664973c9e299927e95e33d88dbee3082ccdcc34822885173c10de385052ce8d5ae16316205e6f7626726e8f1c181d82c1b665ad3efc36b157c890c185d13041df59ca971298751f08a2c1aa2640688bd152ec63ed758ea0c863d1310c08a4d3dbf0a5c657f9770c9c48ba783c0ffcf123e7ef9b7fed30109c7dea352dc7311af9563f9b81afe8fd250a38f3c24fd79e7a323611b4a330d542d6a994bfbe97c83947de8b5b3f89082a6703a656056168d8a32cb6da8d8b95303e3499b3fa4c7859cb0eea8aad4305aa81e55f27ccdb12ff79194bc781e2342e65ab27d01a080c073e7c68fd6ccc9baa8504396f66acc0aa18bd23d7eccd544f9f986a39840b5d6842147176d47a5d967cd46c8af5195aaa0df9e92f1d7dd2dbe21cc24b4a4cb146a0be5ca743e5f4b3ce1a3a9bb40d8b669c290194956ce0020f9bd9f984eb40af3ef4d5c39f164d490d4181c1bfaced8973174c2032684ccde4287ac668261816c6c64b8214aeb445b14e12bd436edbec8b8bc64727cba6b18185443bd04613bf55c985adfbad00fabd34b8a4b5f3e1bf4d73a7ae58bd95b70ff11788dd8a721c0a5c5083f25b1a69c8a41110e9a0599830e4424240d6a1da2179e772d6bcd0f4377a253d5f7bb403f13022bc4a624fba85f39746c5d3f5097a19f477d333b86e1418be9f769860b502d6b4076de85e57d9f922e6e8bf65c3062216858d08c7604ab1500a208a5febc63f8a1e7a619aada69df74d4bf81de2cf5cec129f7cb3d7d66a2f5cdcf405d6f7bc8de234d6bf2935e50227a33007c3e7448d4bcb86c50665a8a3e7c5f4e682ff52b2d9e1288f7b29da0d5f22cf897f9e82fd48ae606a7976232ea571f44627ff2ba646c68cf0337619faf17ad1d7dfb55e77011b258471a6808ee87e29661225e08b610412bec9000e91aeabed6e7c5fafee86423885a710860fa0f14c5919ea35843d68196d8fa1ce2b5a949baaaadaae57aaa0b7865020ee02af82ba46b1bc7bc2d51d8e4edd5142cf961776dea67e5cc330eb1c56d8fc00882981d204cea1db7d1a9c3be416b76c6a2813c2c56244aad9014f9a4427e34f7badfd53d558c22f0969451d89c441481e9028b9c08723f10900e2e7060ff0279cb609728a68ad61d15fb7c0ed520aa444a2e37e0ddc4667141b02b8f41fe52691dd5f56eafa4c0f508806c96e46fab4521ce6d5879dee2e5769a955c2617dcd0af92d661bf0bbaf35fbbe537d28fa92409a81bc176b5e96d3caae37a881d42939f604edc811f1d2bcc8e28195650421c9be33a9e0ee2d4aff8976eac28101adc72b75f3b0b34ce2c61dc378f762c42adfc0076125c56f20aafb7034dbb4f24858f98061d5b3b5e19af6d60db17867fbb8c4717e1daab912d403bb93fe521afb37a002428491faf587284785425d82f9ae5aad44e9a5e1de78e30409ddc2ba1205adde9e684387eeb7d4373912aefa435cde97ee4a355699e2e3427fc2da06b4e153050da6c95b776405a50158dfb58076d752f11996c9ac0d297b113d364182ae92fef8ad5f1ad8849d17f6e7468cf73e887294d04f8636de7b59ec8beb724ce0a4ffa385ad4cd65918205accefaa9a7831ba3081312b65db9f3e89b9d37bfce590e10aa1fa0c92cd752f53c53e1c7671650915515c0f0e261d04358b11eae7573dff44685e77f3b6c6fe2d1e311948991bf00cab740088b543fa15ab1d2dfc0a94b040610944edc0dd6364fe2e25954b82fb973c333a27bf3ba4c8fb1d9128040e53a87fa65d9525f222bbe37ddb9d36e063b5663b3e58f6be97d4f76ed83bb89d059f6082cfdc5bc80bcf2944524084211accb60f58bcb49c10746823a941fabe9eaf8bd2cf637e343395a95941d834bfbeb0b1c1af75562b5089818266a9d731236980d5a6aaeace790d714fad068ef2aeb7cc4ee869465de9e7190db58afe3f24c6438859499b83dfa98908005409da4c2b50e37ab0b1e2b5861e61523983c2337a22d2f48d33ea471965f569eaac9fe6c88b174fa511ff148bf2b978b607e25468a634763496db0a3641b5d960dc2c19edd5a2f2365a04e460e286e4603d22a38745e82d4b383de89fa53350166bc35adf261cec3fb6eccf65d11ccfe423665307ae3a265c631f9ac01b1334b4d0b6f06cd6ed69edf07f11fa7d8e34c4253a2521a20fb71f9aedb623848d073d5c22122597f77b0ba9d3883d81ee2179dc1d9ee112951f5aa6d507a145b81a12e22033105f092635d2320e135def40a726e75f598158a83c9cb3c9b126b788d6b68a769c28beee8290cfebd9c270a66953622bda9c3b0feb1109e61350fa880414b8fd85d073760c75f48911195afd6a90ee23b75c72aab370d803bdcf046f607d72e3e89de788873b83d1b6632148aa2aa50ab9b7236768db38bc7643ca11e31ce60b8285dde727d5383205e84284308d0df5e6593e4522372b392f44c2e49ef287b3532e63f77b8f4d982574eb28b27d98b8b508ac025b0921da9404888fc3a5999ce6ef0ce09d98bbdb3e86b5b40ced6164ac5bd7632b957261c6dd558b933c1cb23620c6ac461e186206f9eb1ede941b027f0b1924b389a03534f5d88039ade865d7779872be2656b9e6156a3c5dd3a805c806f6222299282bf66a8cca53e8340fe2d30732530691886a2987679d40e31a25ae5cfb6165c8b52e30e8468dd25e44d2255c82ef19a3b91486b1040acba04e6fd8d4408b4ee7d994b628fbea533aa6d45160de345db241a3911908f18919412f90b94f26c143dd8baa938b3dee731d53333f01d5bcae0e07ad22610a5f6e50155ee9bf3e6bf387b2576909054a583465ed98e3c908691896878840b4b24fe659b81c2a1701c75b9143326e7f264c3efd3d99d3992ec16a21fa25ebdb196aefe5a367bafb2515e8f0d4ecf8ace60888f4673aa7e836d976f401cd52ea37095856596efb2a31f567f6ce79c7faef1a87894066589085ab47f70eac35e285fa621a41ab94c39d1241a063d69d65ac0233bee9ed35c6ba4ccf459fec4453d25d5cab636320db036bf46eb8700e4c975a9b4b143ed545137334f8fc214331f07968de2483554c08918dc1b53f606abe22c26942f42abba14e45b18e1a6324efa2f6afdc273ac68bb803810ce3102a538036b7b242d98669d2b92744024137a26c0de28a305c1a0159f085945a665fb8b78694ad4419bd4fa491444bc88e5554c7ae4337b197078f4be1ca4df7c6f008a1cc53f8823165f384c41dbe24d9956666467f572dee7c2b53852ea0d66b44349c6426a684220e0e91da619586ca80d685e586dbb6dcf77f1a3d0c3d232ea99415a656b53dd9fbc63d8f6ddc7e876eb1282732e0e174eb1fae365a16392c5d4107ea27d9a62ca8498538ae68146861752e0da51b6a4cb9de584e05ca555319cc8fe7fdeaf676e5b3d849109d7b3bb1161641067d17da02f7e7a49d27ea558a66bd3ec20275e48d0f49caf7457c2b866f056497fef1c85ed7423a806c8cb1aa437e59525a80b5b4980840a6a44cb7ef61253f9d78b516c607d0dfe44eefc7daf1daef8da8a2e37005d3d32677c3a3e1d75a825403010fe923f75535eb962e9851b8c02d16f69d81369dbc191209fb51a7be37180f80f12b8e7bd48911297a1f1bb9c49b71df59487dddad74aaa26858027f935b97e7f94250ffda47449403947f1f828b345cece9c5c9fd9e2504cd58f07946713071fb2a49ddcd4bf61c1ac043623f0d8e1a37a4618a30c3d4d8c21cc225694a01441e6a2606520f0489cf6192384be1e8ef89601404f71d207c49d6278901956836aab7c03b1d0fafeb68a2fc15891508629a786d7391e73e46a41a780e2b3655679ee6acf0781dd08a5d43bf84488d2241398f6f19ce59163dedae9a410db8dce4e3796d1c28eae0cc812aca28a2691bfd6541bbd681c31594a325421a2511e1348742f55bae789593109bdaa6f683ff7e028f97227e3ec77cffb8e37a07a63998b350e170c82932fe258dce45cbd80ff31770a195bed24e63c795873895794e509a0535fee5413450330cfc518344fef709492538040ceef32099a1f9bea14aabc8d0b6d95379390b5cd8f6c236f3c17b5fb0abbe02711ca03dee6276dd5a0f8afa08a55c28f2b4702206d0fc07f6ec15b3883536e8a6dc3338734124017694016624011d547ca20ae30ecca27193ff6559af077478a9a2e345c05b46a60fd91bcfc3fcee3580b33df90c860ed01daf01dcc07e524c0ca3df6dc55fe7e36819c031fd2c0a2e87447ed289d8ea268f6fd4ac0a00b6806f994ee3989654c7cbdd972ce5cde3643bed923b141b3287c0e0e9698afbb2fc84d1e69d92bed5b07c70d1be9c12155075936cb581e320847399c612c6eca434f1af32b31ed86b07a2b00a48a07e940aa44916404831c1a3f03650e905ad9c12b2f2f1a6f992aad570f52f698f018aa4c5e1af918c20ce338ee5d3e2e86f00d38c4558b879c50ec90716b8c676e0e4576832a2cec4210a5b4c47a8812991c808c95d90191948a51391c54ec7d1c639ac60661320ea1c6edf13b0d84c2c10c1642bc484eea9e70f4cf5658a3a0461910ee038e0f0e36f14871c7380060b4627b6f6b6b9f964aabbff06f4422298fc11a347bb54b421d2ee0e7a412454c9f05c043321e99a2a676c54764427979826c4c07aaf6fe87950e888c912ed0c6d3777542921eb411c1222b25cdb3af79fc99f99a872acfebfa5a18ab4e148c8b74e2607db484184e52019b5598690f043b8525ec0973a5dedf2eb9aaf844d79b12c22059897bc01c57216f427bd5b9619a516a58c01a8dd5a56f26444e96192acccb9e43c32bd3068fc33b39650d33a5479d480689fcdae48cb1e6d0b8bd13888b1c509ff6cf81f2a7626c7a0a167583e84560cb683700623a4f1094eb37c0912b0224e88d10387a4abd182c83d025f0b33126c940fda05f6ecfe14a6371c3a7ee877eac3218224e50087ec4854f7568ccb13d7d015bcb40128c09d6e556d019f50d0fbd2c985c7cfac6580f0e0276ad932d36e8f2607cd96b271d1f5dc6a09dccb8ccb2d87a7b244435fe48cf3043aef6fd2fadb08dd04f403148f9e8e9b7524474966bdb47af90db9604fb4f20874e475b12d7b97190a5231f52ad1dd6f00e078370f942748f698ef5c184920fc9faaae1a30720760b2c731c1edff0a22938d8b1ba8285387fc6d7cc827d147bf67c6b50f770ea1a4c96b2ed61bed0f1fd9039f875e798836b99085b049f2a2edf3b78791530ced18a6eb2a67260e8d4b80f5c9af0c1f5fafc42e0500c1bed72272bf3a195acae573c431fa7fa059748ff7d8c0ca13f636fb4cc1fe1f48e755efef38d0b24b3f4c5553ca86f68e6d7263f1223ec89170e43bfe5af6765970774386c8ba2b21070f411aa472b96eb150fce65bba89b9621860fcb7089f7dfb76bac2ccbabffd8821b25fc1b1b5ef8869e222b08ae129982477a5081c10063b98d19a1b9d1fda8b21ff87cc319d54b5255847095daef22b9fbd047485d888351fa55ea8224e324894288cf78d391199fc995d45d7e6893f81601be95722fc0576d3dbcf8edad4b416633563798913159e63a9dd9c3af36379aa5845abee73df8e7833327f95155e3385cb81815e0e42d440829b722e60995489dc65f97c4bcd81df8d5b33a9ba4114e59eddb4138e6e91a788388185e87e38d384b5c8e01501946ef5923365104022940fe02483284aaeaa57030bdc30440ab63b6196471553737e2fd5f88fb6ada1e5b63a6ed3fed66a1c7874c5a2fa721f9a25d04f1980726f4d46617f799d0474b454d49b331716dcfd8ae594a8eed1c5cf0ecf7823908ef8f62376ac51458def579da5a4a65ef64bcf43e751dfd6032fd33fa55644119c1a3881b1693631bc49660dc132d2f9323df0a613934920838b9ce2b9b59e5bffc265f6cb0c365b437550f1888a0b4c12b36b15e449191700d2305142eb799fa4d425eead2131209a9507a91be5e914f209b688f8a7c47bb9b394add49da78dec88a68d96c23ed6f3a170975d5ce26a5a3aaf7988b732a2d4c54e27297529ce2368fa30e19117a825571161d0f0a51d6a9fcae01a9ee255deecfa0de0f31a00f75a1aca0c25050649933907e8eeca62d107d6d25a5be77303628663980bb6d21875a7b00b7d98b280d14d003b2fb602714a123362c3521480387d1546cc0dfe86d4597620c8d0a68d94cf78f3224ed4d25f532c28014c00a39b36a2e5adffcd0039469cd23794f1102417877719fac5e4dea22d24e23546ae2786fad8ced4cb63fa2a4bf26239a8516c203ee70b9157e4ed9700af344f5042ef1738275b682ad31d063850ad35b83d5f00dc9301ea8bd2019e7818bafd77c32ccfe5e467011286e684336626e081ba3b68001ec86466872bdd6884a172515bd7b2abc388bb329ec40daebe65cf64de274f672e96af8823619989d3229901b093710225cc4a6f1c33eabd8b4273ea1bd8a6467182c00ab22be6e1986abf9b2034a2ba5aeca2a4e83d4818b78d8dc2846304230db225918610974f1a31afa9744505365897f7169d058edeb46835b64fbb83616edeb20bc46ae07beef96ab1490f556b5be58f4720e35e886924044e427248122baf22062a4c2955d59217a13fd63026e39ecf68bbb7a68c7825d748b1675ab18521727db119eb96020e1cdc87ee6fda5b6f93d49f25d6d5c041d0a0f914715a5d58298807fb9db081ef62b5b1bae7d779c9545b5bfc2ded27daf7cc84ac5a448a70a5831b20f591dcbf6a330de372371cc9a9e173237f6f3a802a231a795805c01b9c627dcc4bae234a4da36c8303327bd9493ad09c423f47273bc2fd868f2a3dd0e3f50755266c368ae168676cd1129f44e65779d1563141864b0dfd936ff2d0f56cdf7169699fbdf9166ba2054acb2da2c767fce08ae6b0b04810573c1e6e72ae1dec4206c9140bafd43477a0c3d83b97743f6d5611869139937f3ef81d04ec2920d14adf5df0992e19f8046c30366983d6a7f16a60059b8dcb45023297f07e1d48da81906fc080c21a6c5414b9205838a8b1cad42cf662799672666b0165adb909aaca45243cb75c2cf1da22e704f876c1c30b8b7eb3baa4fffc2f6a77d6b42852f84097deed43b9da02ce315a9612fcc2ca6c99d23db7e79ceb28157aad8fb856328e32dac20402d20eab633ea273317dbc7cc686150920294c001b53f7dd06420f9acdff66931e7a99311724d9c7de8517d2a488e7a78bd748cee6f9138f8183aafbc42f1ca35a61778757423232dac9093229672f9c2b851e4d7ee93ad1114977a2ced8a482b11685f0599426ad6a26b5a8ec20571ee617965e75d3202d9edd44e330edf4583b8c6c2334a41c626f97dd1b9fafe6ed18fffc9d0eabe4539b79c4d75ea2d952891f818f62338054d15b21939786d91d39267fff612d4a123bf945a58c705c40e33db1906c2679fbbdc823b031af09a2cf1a0e87c58d182063efd5a661357fb82d44061789b341f6cb42fd5892ab9369aba30ae692a3cf8e9a72b9c57eac1f4ec5f22d117e92bec90b5875946fd160b4ed0a6d5ee982f093d7a5e2832a023fb0fca305bac92bdf2f40299dc43b0f5ff89bc732e7d2837c4af54dffc02da84ebb7e0cf9998a2f9941d2d4b2a629607555060c9833c6633a31ef262ff531c115bd56515c821b03e7b948b16f3182b8e0458f885583ef5394388cec27a3e52f71a85dd01110c9150fff81887fc5196bb12181c566fb9189b06baeda18884e77055d413fc22375d82807d1e0f0cdf66127e8615f9e569229f8250187d5536b4845d9639813448eb92d1aedf7cca00c5a602de42132a292024a979415f77f1d2130a5096fb56cd1f541538eaae05024e5b95dc4e0a78edd93d1e0b8310a2863d14b09dd12f763c5f0faf5d11720ddcf9df890ca075c2b44b6ef41f0f79989113cc4cb8bd2d9417edeecc49436cd598ec02e9099b58847b9a8b0134267f4893102b6f0ed68a7d2d8913c922c1b685ebfdac222d404acd69c531e684c426585e5d168f7dd5a24e81b7c7cc3e6652c6fa0f04380e4bcb2e5402dc6bdbabb4893a139d424e75f0ded10d9bc78ddefd5df6f4d70420641bfe53a71d26af3226ff456706a0993caf7e3fd84a40ae42b32e00f025cd7250219d57aa809212132ad712d9169c777b8e139771aa3cb1afa01357c79a5fdfded3ca41196b7da0aa35cab171530dced840043d5c3ca906ecba2cb0ef5c361c2ca2be10825b25a7d3391800d91df2a4a6bc8aed63091bfa247a26b1efac74316030b1a6dc17e677d2519765b5d9ce8e19eded28397b17805b47de16daa1d0f6798fc4af51ed19d309d531c7c54b83d9ac05019c995c1323bdb1a39e1278bea1a072e896b12ff321b54236b2015c1a4530c8ac0d4a92484f867cef13426157be4751c52fa955339b76806571d4049f11afa1195e7598410fa28fe79e6cc8a57ba33231958e1e9c5728290ea046ca4760d69be01f1b7498c0142bd41fb4de8186f4a03bdbf0baad3aba7012847de9f1def7292c43998f189df46d1b54f6307a53791ab69179fc8c7506eacd3c43209dbf752b1a2f9d37c983f33533e28c0c215922a275a606e0374a9bd0908e35d2e95cf422628b7f1189031d4380f6597723390940e21907dd138de0a60e525e4448ea3200ac6d48d465f0c6d2203a0272e822ff2f1fc6c5f6facb77fdce86e69f9155119d5d4c030834758866389ec93f27e3fb353e7bcd18d4e630fcad789e5da3e6e898dd3d3c579016ee2ed7baf1b662b7a13274522adca9ab848c1254c9d13b0e7f12b7c96b001ffa5362693e33ed9309b26f5553f31dbd8a4be9a2d4ddd1a3310bcd18371a22ee9d1745b7eed14483d503f78494788fc84b6b8a379af9f6bbdd50015bfbc91c2af8bcacbc920fd442fed16b007e30d2b2feb18ae3d8d495c5323798ffb2bb00142eb124f2bf739d11dc0af65921eab11bb460f4dd3fa18ab72d3cd86b1d0ffd17d2f2a5c0f66965689d374047d87cd2915368eb2b9369dc2b4629a002a8e658fb01b3442813ce43864c67fca1ff15133c73e4e050368cd89f673805af140839c30c1356e78b6bacf76d86cd148acfdfcedadb4e1fab960ef32120f33b32bc2b8f5e1a9bfe032944c8852fba2e345c06149ef8d574f4971f068e5745912be54e6e43041f1a69d4676d501feec6a2da1b46b16c70b86316d6e05a7fd865cd754b3a145ff3fd0214bb46fd9af22616e650567491e847f6ce457d2e84445216beb8400901e07fdcbca6aa03068fbdafecaaa0cbcb8a937f07d0e5e7e4d80ef38bdca3ffcd6fa18859cae84f5b88f511509f5327f371f3a25293f247cfceb1fc9be3585a9661c1aa7922c0bce3cac9f4fb9221b0d94a7770fb472d125aabed031b0b212f9b597dfcbb482c2cf79db5a8fb3be1d9b2fa1ef8a24d8758a4fefe226306a01ada0ecd1168ef1d7221c47658fc8b741a9c926bbf9bac48ed8253e0467b1c736d5b2aec8d32301778f1fbd246c7b495dd7a7860d359d555225d8015eb8a23f27253385866f690b8b2eac9fd167562faa5579092ecaf4709a216ea412304d21ad9e6136a229efd097981fde403a60c4aee94fe7405d79511c4e73d57b34c278c6c46292164f9458e0317c2fea1e90e639e4de4004237a84b5e412b89f191e6ca2370816aabe3c05aaf2f6738e5a5ad9593f84d58be882a135e65f0c0494271e0bced7d654406ffd39f317b2ae656e1c1e15bf42e8745636bd75bafca231c5d9f9e9ea9a2e50a11c8e0ca483bc85cd3395ac8fa0a5dbeadba478668cf0ae60465c2d2a2e0b301993b3e8e7bf9aa12c19a1b447c2a322c7a760b7be7a5ccbbc9f32bb7e72220ad7856ea3f0293d15800fcae3117360fb8b4fffa5dc88625caf29e5705eca9d1efd0aa1cac24266aea4cedc84f19b1e71e81f3d48c8bc5ff7044cd6700d09124de375cc4d452d06c2af1a92985d560ddb56f21841ee9740b1e316801e5a2d763045693138a3a5ac197131d796c2ae337c7a957d79d14a4f301b63eb03b3f5e09885badf067ce718c8c3d7d95decfaa9ff0ba7ae4d80eb4aaf62d93121eb796b060aeb540b2d7e59955715fcd39b6cc108f88a9d0c45c76a01959fd23a8c7573b7a35513c624101bbbd3277e643e71751f0f16e63cac799fcac3b068b8801b49a27fbec48ee8d1de2319b99c88488d22046278cc60d1112c957b968b6d4d2f0ee99785058396eceebbad709800fd8bfaf4991cc87e5b2396fa28ad31c24436cbc8ccc8b42ec10fd809709eaf2da91035d5a745d08f1884a59a0ac231b3687e2d1a03392bdac458c1a34bf3eef0e79790b46f4e0cf82c9d575804ac78cd88a667ee61e99afc6b142329dc7399a9b0afe8ac8624a5fae60bc33eb8ed601d25a750de323d5e590d72a68f6932860b66478bfa1dd452300416bb1671145f16323226b5235248cf0d9074b8d1e9a1ea7093c8bf01d3f51238a00cac0ac732749b61f8b2c6a601926ada48428760a16b83aa478f22a5f36913178e3952b6318aa8c59904866982dad624bd6a95da5f322797346bbfc2e3e8c3d33ee86b9833202b12812e4965bdcefe3819feb71cc9330bfd3bd4488c4dac10c0b4bb6dc9085b621d2d4c5f556247d09f60c652b7194bc3e6fe1281ed7d8942bb4903bca16c1076215aff135c5f02d10dd9409bb93c3a1305bcc56fd107f7217b335f293e39326e5bf6137fab1472165c93646971093ed8425b99c015624d4d091e01d61e537a3b5d975d38a119ea97aefa3ead70c3cbd32250718668fa29b874d44299ca585600d37ce96f4d9d6f26c51584a612bf2432d5a8eba28a496b5e67a12ec3ac400c491e6d26c067615356a74ab8b13c46e9ecfcd72def60723eddfb4cac2929b6573ae3efd377c0808ea1cec89ce6628dcd40a637988a0bdb8f1b06d9a89b84af27bdf9068149fcabbb33f4b77e368cc0aacd771a3eeb6f303c324999ece3fa11007d3511ee673552d9fa3816fffd5767e5aa6170b47adfe01e3d8295b7c30edbbe26f561ebbdcc1ee3c3ee36bfa3c3a05b2792d641725a9632251fccad18ae2661e99e966a89535e47c4a919fe850c9a407e26abf9493cad0bb817c05a371a592d4b69015aaf1889ea57cb01cde10fb1d26edc0e26aff546ebb8e366a73700f51e72df2a0c3ce6ea02e361ed7571dd71bbde4f02384008c0b276929ed0584d63c97dd1a40ff67688928b84d067cfd6439e271cc8e1db12c3c871ad0e3987cced8c8de6ddab64648330eb6887c213dfa09b307eca70ab3592b47071e936276e2cd167695349db7c6f66eababd9a1a73732d702f29ca35d25d667354e2f7f111f0ad76b511e29dadf60e7c1bc4cc5160dad872dae4a2ad4f082a789f4dc213ccafd96ce269f2af1f970a019ef740b6c6e92f0a35da1837708092092581a8f7e27f86152ea39a53bf57750007aed4cd490a5cfb5e5cbe9c880d994a2949baaaaaa1053ad7bb88563aa0c2e0092e2b58b89ad012c0afacd13e708e1c13799ad142519ef2afe21b18d04c9e920bc2967bdbbcec7c22dee0c3ef6140a1c77050fdb8978930c9a05014ea4ed542710202ce84f166221e1b360738325b495853b23276875b7064267fc140347a7e865ba7a5247c63d2681814596e02cfa0d08ebf793196f0ed34e66b849a1202c4bc5c07df793c7fd4012726a74522739ff5600451d2f196372f3c604fa90043d2acf63d90b6ae54e6739789b88ee62ac564b962a5cb6aaf37e52cbb784f536c909f4a559f78e4c534363d5da267928e795ad2bbb4312d6b7d2ece7e48b7df9f945cd5179879ecfb35e080c7b9bcf4ab4187e3cc864e7a2abae244364dff50f7556ee5ca1e361ada770d5587cd0943a17e321160a1d6a7801c34985f55f6cf1e0dcc3a932e6d4b70ea598fb6af3ddc5968677efb560e63013250d540903c80468c41236720cde8e34fa342df5ea65ff0590f771df533747ecae255f17e2c0c10f7e7094769132aef8dda4378713ff2bba1e26c330e73dc0083ec9e0b118901c2f0d88233251de99724da97d26fcd332fb2798ab6d18bb8adb1ee99753b1c33dee5c3f4f0b141296714525b55c7de42549276fba5aed04780bf302daf4510b65262cd9562fbec3d294f0101417c020858880985d0288133568990947cad488d9817f05f8cf00e234f62082c89210044238d824dcf0b79a56edbab259cad7f0fcf412fca6ce993a5476702da107cd407d3b487ac7dff3f7a60bb21c49698dba70b68b62228f74a4517196868e7a7fbad82031cb02f6a9a21afc99d0031e014c572721c986a0fdb5fb3c2f92e8d19bcfd6aa3782687203915078af8fd4b513e30d585668799c3d7bf0b3afacb53c5839f92e056e51d34c6feb204e47982c22cb14e1fd9325a41839ce38ceeceda0b98d3d0fbbd4159648bad94f1fa171d236505df91c908826bdd127fe221413e35db3277d768e7efb56dc1f638c5e6f8e472639ab4a0dd0ffd702eaf9b20c9ed0303537b3cffc600c1d8db00a39ed3e37e3989ee0ac39ce922ac7e72e5534104e5460b987982bb186e67dbd33d49888f4958f671550f725f39b9861450762f5e73fde1c2a91de4cc38b3be3ab598cd4078b1e636b2230fbfdefc50c3088f7001faff14a908f6bac2d64587afe0697f5c2ab201b2f425012ec1e87910305782f51b2fd78a59dd97eb1aa229ee0d7324bb277047d8f9e24587398a39dbb70cbaf4f8e28b73748c7d9d333c72bf5e72d8fa036f82606d9709e04a82e02fe5fc36726996ae4c2d41f16d923550b6fe6f033243a8b3634b38c5b9719c38867d779c9787e4016a0b07c059a43921ee63331fb32ee1d70b9eb979d894f6228845bf2b06b12855c32a6a42e4014d7360119ef98802295f4508c85bd927569a3810352ccae0241046a98cecc813c51d6667893c7bfc9b6c890d49099acb2ef84221704045f2bacd2e3fa0dba1f2cbaa917922538989a3600e0f54140d1a13dc73da94fb8c655f215514c7308361cd06e1a55a2c4daca589296ec84ec07c690c3e16ce323cca0b3ee3ef3c0887f49ec5740df9dc1a91135b81d935811a9265845e0721b0394c419fe45b9228d88f22061c401f85b02a6a00b31f5453945d22f611186e76af3e8cb41c4f96bc5ebc228ec45a5b6476c01c24ad984695c277579fbae56b80bf4d84d441b583bacc70847a902c26ac8404dc1ae71c4930477b088f708d9fe4115d49dd6050e1e678419a7509fb487e9f3ff2c698aca274b0cd18c2f981b4a2c32caff438e48949430201f81bfebed03e0f4dbf3b995cd500330cc3e04a6596e2e5cc5d7769c44684071a6357711fff77d0a6fe95d4ae85ab17d0a66278b67c25e3f05029ca857fc29e5cdcc684f483ccfea54b54ee0765ca382434d802b00683ce089746f25e20655bc96a9ace791184cb62d023dfde9b7c7c47aa6063c1561156563ad475e6951c11767ae34c6b2104ec5da430682b1214debfe9f57b2105b92fd73de35806088780ff8420b639e41cb6715b4921476dee8a3afd4790aac02129981d8124cad1eadbc083433171f193da0e5dddc484581d1e46da282dc105e5b81494d13a92b331c13bf20de8f8d1a75985245b63d38cd91f0460711036058d60a3391a4574d695db2d76b702290778e4cf78962f0acef7b51be742660df27e5785e1a9d9d819f42fa69c3e22db230cdc2c9e20bdb2c468d6587c1b8328b14bc192a6311ce4489e5e4aa045da7170c77284ea423dff0df986482ad8d8a158d4150ab527bcb6d81248b3e3fe1ce8d8e6332972e51cbffad85b017f1b4f181b1cebce36477aae89a7e3598f8aeb6fb3bc3e76192468074ce4b2ebe2d232bd9d38da14cf662490467778ea4de7fd97c63e90117084b9373d075831e2c7892b90afbdd8c98ec863d0bf2e466266e77086a5179f0157862175c4e0558c266797d6a76e8c7e7871993e4520e4375770fcc3e1732b01029a25df824a582cd3d2a68420613de7e8660ea0c04b895407928eb1da8ee33fe5864146b708e71eb3912020b82522f9b949a8358e7276c986e91582606bd7b7cff7401ea15028e18e2de92305f8356bc39935aecc00b65d61e9a0bd8e7844696de14a254d39ed8068ff09fa15bdfe167b0b71624b255ad5d9cdcc96a6e1fd2316e87cae20599bf1b027ad4f68286d1a400df2794da43702091e47571fd4adf8815130896e4859e1fe9e1d40817ad03b6853a79041244070ae3ff174ee860849e054c2e132a883abbd2110dbbccaf8e037598e84648b9d1d3ac7cc23efb2bf3cd3f0712477efb66dd0cc0339c1d60bfc0a3afdf866e55d709465c990f17d6b75f737a49a98884d442899ea328143a45f9a14f8e16b781f84245a1184dab8cb5a1d70aabb5e987ed275c3fcf0e37d64936b3500b11e035d2ed7f3b883a68e0d0155d2657e2f995b43d8ccae714888895b6523b58914b5027d6078f0159a54fa500b987bcfc12b294e7c7b633ec29ef05667b243219fb536c3da3c12583c9987e8ccacd642eb76578baf0e3d17c300fd583fb797a6efb8384fdf6e1f65aa48fc34fd5f7874650392e5e86a20a418b28b1421f0be3c34faaf4252d5ea2e637d527a8ebe525eede490d9aff085910c67884a81cf682d8004bd5b60b7b3c8aab65f7c087ed757e29f5b984db7776ccda1cdb71fcedaf9f92d1eab6c362948593b4f198c8fa6a03ed7512e61a4c3a702833833a5bdad9f1495157c15ba5493115082f3f4cf4e37223360945676eac219affd028bc9ab2d013350901dc70e0b8e3878030e4b411c4cafd30d4e2cc27b88b32257e29c1d5de237ecd52dbff9417811b5c8290a81e4ca807627c7312aa40d966d343aa011612ec4309b509273a156d3dff6f50f762048112bc040496f63e7c6736cc982e6e79e631a2996950fdcc7a58d6cba70c5aa81cfca02f041ed05af69c48d5e2e2f1cd0db2d7b90c8fb10cfae380dc75d78502f2bd740abbe8bd9245490d5492b9be1b95cb4150588606be97de5e090d0495d5d1b18f4c54c9e5e5f3c027bb713df2332f4d2c61e67abc3903dc1439b14fab9ddec9cab735d6de84f24fe553dc133a07cfc4962980ac8f01399fa8caee1cfa46f968b76bfe9e00ce6c345b9657c669ea6b4124d629f829c47d995ec4fdc6d858d8973ebda50e29aaa011c82f4205aa82a49a0cf20a2b7d09e5907a1bee8f6071ac2ba5cfdc9d3c68fe7e7e455659d69a7660b5382b7cbced79bdb84f7d8fcb93a9aba8519f142110033c5ce6005d0c4f4ba33e9f419b9b8eb592b2d679bcabd14da795e7c049c8c2c691d8403bb58fb52569f679907dff77015466adb130ecfb42524a20fe798eb2d00378554e08ccb7fe7a73c714fdf4d9b17d025c61f6273997402b1888d174b206347133a07a390dd4ddb7cf5dfe0ff45de82783157936834db63e91780ad52ee8820349ee74f0d3bcf4be3eca135253f37c7516c1b18dcb88fb52db97a0c1f4e6960fcf06cf7bc0a976ed9c99e0763b0704ef962159ccf0fc4646598aac37ac723859a8896a8659f1d0a764474d87bba4195a04dd7a7aa1b2417144c4ba56840422c8021b187f5cf7580405e2919b9d2ffc92f97aa661d509bc9bf700ea43c0dba0f317094dad0c7df7a2b86439cfd1ea558229d16b4b4b82a059e9149fb73d2668e2a4f716057e95d5072ab3db79060603cbca668efdf65d07bf7e5813101fa10fc86e9031f4e38052999799b84a6a7f54f210f8fd19121a39c8301fda4824415f634e2b565b507ea193388f96a3f2822b61714252a8826946278b46fac403eb0ad539882cf51d5ee96f7c07affc1bdfd12bfd86eff0514a231bceb524afd4de4b5e191fe013bfc32bfb8deff0957fe3777ca5bff11dbdf26ff88eafe437bec307253d8d535d8e11fda074c997677931b3b2533a1b47a53ebb3be9bcbf0585cb503bfab7829a466b064054ac306e463d5627a07890fc75efae75540d7148962f386bca17c8bd8d9c30222b472acc42caf11c961f30622aed4741d842d9b2ca970c076225539a0e4c59a14d66b0f681b7a8ee8828abd19e8abce4952eaddd57db00c2e5af09d5dc70a4ad1b5684ffbab86df0b78db0b57b6d65fff9e9dae50925e9a216acbf401f9d146ff975357932ce6084e647a5aaee43b9a28ed1b9ee725348224ecbd9a855ab7f7708da5171d42d02b2ad1e757387cd246cab3fd0b2d26e0cb4c026110fa075f882ed07a1f6cbf08deb34cef06bbe3847167fc422eed8de2af69a4734e0fa0fb04a3428fdfd933af283f1caac1653099f48735d108b6d74ab63788c368440edd48da6cabd9b9c9fc7cec91c017ac13163e18f19ab6c9f5aed416e9cf89eae41ae3404bae8806be8fd32bda5426081fdec403d29f72dce39de152aa637a9a03d8b26dc385f7370a9adf8dd4b2ac4221c4fab03eaa0125485cf9b4cd45bf8fedf92a0078411c32a47cef0996ec963f481df61fce10db17dda1b785e50ce218b707596203ad9ce5542e18835cd9aa2d146606d73d1cc0fb242f940b9e5cde02b5bdf0f1810504c465666fe2c3de41b5477612e8b8dd80c17840cb7a8ba68416713cba16826e9c2a0c5d0492e5e7294614bcfb4a0aedb8f22fd3b9fbac65d79098a467be1b8d03aa29284f1f831958f33b14603ff2d57ae99a4e1339f7e01424c3336d36a19bdcd0126fdbcac769cb1d57a6d8cc042f1d9392f1935985585bd1db7e403b025bee7399b9c76441f22bc397b20bed5308d778f75d41969d8f98f14a66ab277fea6db72644af1f19dc2f3fd41710d7ac560254fafa0482bf0167c989e029b169984c6d91a2660f989544c3cf98275240a858eea10cf82fc159a7a41a65cbb91ec370fd2ca33b1948f991863ba3a7ddf6906cb825d364acb7c4ed9f41ab5bfb7c3a099c0eb71f7f79a293bd6999ac59ac2d267f0c7110b55505fcc6fecd82ab1b0a55c239b300c06045895a56abca914bcfa901387a3c879080a1c0671da48ddfc7e8366de8e0b079f20e7c37f190456a162cb785a94c9dfe7c3f9c81456895d0cab307f3ad7a1e2692f3822882e4600212cc2787d91a997ff6d811f604c5e7e6f6ea00ab0c12652fcefdc5e91d7e5f233d02fafa0588bbef7e4ea46bfc8e9970ea361f3a0eab0ca34ffd1d36d607c12e55855c6cd1c67cd5f887902fe09154f5fbf389f7651695b3ccae8f31cbd67b608f2f65b8938d2b065fb0039fecb5ceb805582a26d97f7efe449f29b7f21dd10be609e355f49a1e5e45bf56ae58d1e98113cb7334f6eb5cee6d4dddf0c8822957abcea5c08d690b9eac7c28e0fd1d11a493309b588e35c01b1c170ab02a676d563ecda286a5686b9263749040503a44008c4e4150cd5c9fcc80a78a68c52a85d1025b709786fdaa75b4b12a181f73e0a8e40f1fe56ff3bcec04599ca85797d664ce101de06eec1c2cc81287a748a3dea7a28a8e371bab6215038536fdc6ea61b29c68c0ac5995291c25022423cb5c8dc56f143e286405d050e74879fadbe43b8eefcd99e52b93861e1f348a527eed063152609169a38d22694e5c61ac097187dbf9322c931379e3ffe1d27bd9caa3381680a7c5a7ee7133bf4871d39b80b645e838f95a3678224035961f74cc616203e695a9587809070beafd020484a695c90288d6b9dfa3c162302226833e7b95d188e8a267d2ac29824edc408c9f6a029cf838ed41f45cbded7fb3935afdcfa3e4962dfa31595d34bdaa12bb67fdea638d0c236b3876bff6571f1b3a466309212c715830a2a4fad95390baa6b862f4c348f57157fc617400e1ca271ff325c4e90e6926c15c8f44e8a75579449d1185273060e759817f183f7def8f312d2e0e58cfde81fd6e946de5bba0e9dc3293454484550d0350c1d3ae2249d9dab18a36b0c5d1984d948a932cf3bd2bffd1f9dfa168fe82deb866e426404803005fd9587f9e07f9873c21bcc8199bedd19cb68994d1c81f81b40ebc05a5d1e3343352fa35afdca910d53f9d1567f1c4b8be3d045ea9d6edac8f99c12e80f6c0518e52c5b371500a0a39c0717018a6ca71a466f0dfef222865c8d2047322c84b7ed50a71cbc83deba432cbc6dc7a6a5239f49f09c5ac2a682f600ef98ead5b4dd00d0729ba5c21c471af8ec1214b6d2e5a8b40a0b359342f358343c8229696543f330763d24fc22e531e4a93bf5450b45e99e7ec3c7de866c9fd086d0aa8aaf17d08b2815a53f09f4e9045e138f513b9a31b91a9145ec9fa5615eb4f5610639ef3700ba8134a0132c78ea3e55db63c452df4af4a80f5efef6edbca5c1fe3fa1bfcbf14c4fdbcb719a1fa255aedf5d6e7e392a73f0bfb67b5c5449aded6e289f518277583d9a493a45c7fdfd41d4c257ada98d1acd30aad63fc97a9c23b0fbfc3ea1e179393311001adc3e79d4012834aeb8ebe96d1b2c4eaa27a44145e21ebb00fbba11316eac520ef5062e783a930bcc5e562e655e04e98706ac87ca8d2b6f267fd5db0151ae00d3e1ef4e85fae4c29c0c4b1495fccf93fb305399da6534a3baa4fadc4872155c7a9a847ac2b6708fa6afe1889f5a088c4bc062e788fefc22640990bceb94001d10fe50d8d5877b21a90b732140e20573737f37a524eec4ae883a8588d4575941bfcbd04ddc63425ba93b040180d672c10292e1d094fe9696f92311e539b6d84cd7856d075b5eed629ce47db5055f0e5c8bdc30595ebdaa649c6a4288e58c833fb8fb07bc9ab3a09053b278cbfc54ff01054dfa23e1a1e2525fdae9b90a92e07d9ff52057783777ba472938a9c44ca0750ef27c962968e0da96f1ab2977c44881d64ea50651132f2eddf6005dd23828e64880e666f1dbab84c6d592eddbc7b0d6409bcc4ee2437ac359c7593d5aa0f106d333e6c4c68c5356686a560165a9fe49efdaea9e634a2a3fbb439641c2d6eea45bbb835ba9979a69a5a7c99d901cea06af48b62a36c918fa8856cd7a43c18e5095500a498723032d6eb8caea5b3eaddcc33d83cf8308f4133657d3198c8543bcecaec5f6618e6b5fb07f6e94373214398d6dffecf75cd37ba20ca28981382792256ddb5c6bfd8d2eca105f3e9cb263205b7ce7fdcc49ba0db3fee0800fb5b372482b4e84a5d06a530d6dc01accd34d2ec56e0f8ecd1512451d909fae89ece8a84e505c793939fb009742e524022c0203568597e32280cedc7c655aff12a95251f6eea6b51ba6813021be79024db8f4fe0c4cb45d9cfd03f69477730cfb1d10c586aa0bb8db3e088306288ad364cd764b9b342c5af58f5bf72e04ae59a9ad08a596b6b252f7985672f9c5fb28a9d614e10b5a4082c9b280fb5c6a656c8d1bd7b9db9a12ff67bff71d5135b2296f8df4217004b9afb120cad29d6f701467a6dea1aa4028d10643e1796046c86b0ee5dadc49c82466199a3de64a3df87d2dc5bba585d5d5e8736d0c4819bc988d68dd82ffe76554cdaebca15a646eca36f5ea3c374337ee40cd559c7ad5e4db99eb0b61ee9717e473b3ef5ca6a3d58fb833f8f68c440e8f1502c519482b015636934fe73c1762c63f49bf88aad5dce4484aa2af0cf22991e2edad289dca97e37ccd3b6fa0569d9ab2adbd3a20df292d8f1a0cf5913b70cbdba135ccb4c82434eef32a266d588e8be0d0aa3a3f2e3674e69e18c369497942be4d545a64ca930253a4b8c3eaf8d505c3423cafbf58fdf73d741079a5ec62497f836cfcf2972d0df03f44435ab31ff75d45b05dfeeb77ac5733d253d294c8400f7751c6c32138bb950fec1c52bfc76303b71b8e64c21f1796cbcbcff9e630fef57258048789f40ea74abdc9a58b19ef305dce66781c2d1ef36cfdd91990bfb26f3096ed866b0bf3187c8d802f4e5c039db4cb480a8b5ddc4ee533135d4dca3bfd9d9c7cdf89104467c02757de71190274f9c828da3fdb2a83c82889d0a52b894dce48b5488a338b6258f5c7c2a758355a6c4740908e5565ad78e1d5ae6cf1dc74b2cb43efd9b695744c9a043fe4f6f12f5012bb37cc2c843ed81c2866e720939d9b7847088dd0b2e53c3d5f04ea9cda66a157c64ccbcc35204dff8e10582211dc8b30bfc27fc9d78d05c27e30e0a404e77caab41764ed3f0710b96398e878a3b4cd291e60c34bf7ed48585af192862f5fbed028a5fc008661ab6635f4e2ca60a3de235676dcdc12804dad9fcacf46be92491d1c0ab2a77c5c55f412abd66c4313f75869feac926edab0adf4d9c72287857b747430146889f9702f6636338f2e4d28d4064efc66204750148d449ce29c10660e72ee2ada1c3a82963055a3dd5cd1946a260fbb940378e2caf739976c92306415988e6f9ca4f3fbc1ab10f8c97a648ed7c515cf44efebc52d3ae6353e3df043d3ee71f62a281acb43af5306c9a91c2b3e7fa1face3cc617700719280289ce70176a6b11630ae14698a89283e497669cd2130a207363988336fb6290ac69131dc5e5995f0d0a7a2535e6103720adef656e3330aa5c0f00af4ffdaecd472e9e531d46b4842ac37143fff915c8907232bcc54475c6bbff3b0c82164511ba304e69e94f5822228cb5301563fa9be4863fb6d8d50637f91664238740987441969cdbd83b8dfb9e6acbe11229bcf443e26760c39141e3be16c91425da977bf2affdeaf67054718e93235abb1197ff701d1f5d530f375bc1ae000ea741a54d664bd104ccc41a9645f10cd0dda83f4be35923c36e985994086419377e08140c8f1d7deca312f3f459cdc0ab2210a53af3b523a641d574042ae8c25271fa80d026aa0d41b82797e76cbad46af60251354f055ad4b1cf085f307af14b070b9a0aa2467b860481fb8a8867be805023cdea52aa96d00c728223b74da3d11deab4eafe53d65434d94dc7cd64041dc327a2e232fff815abfd951476c343e050c64ef40fcf4ca825a255b6253ac74383fbfc2fb0128653b003d6e92f27e85ea9c579967c40cd38b72758fa7f17e499779ae7974e66149ae2b931b6f2541b432fcc998f020e92f823baa0ce3e3ae15cf00cf0406ee6da290e9b45c6c0272875d1497f9e56aed3e738fb41c2012239f81660051a83264712c94e82602cf52da82acfa04ebb5e7316755bab082f0296c25decf3a7683f8e90575a0deae4171404fb88a63d553215b51797134426204282c5d9e93cb61147ff0d6d47c5fa95c4c9b724859f5c5b63363963cc9feb8a1a6a7d8bcba953a3c73a9773a189e1995af72d990cca43a91f5d8faa95ea8c4843263db8b454d852263d2c462f0c61ac95c792141624e119813b289f1623a055f055d2466916668c930024e283c198e7e1c122b955317955d981f5706b575c4a5094d47172ab106d36be1623fde095ab4e5f06408692de700aa11584774e012a8dae47564a569a4a10338bc4c81891f5cca47fb6d9fb10baed281bdd79a06567908ea8f37c402b3e01483a099f19989b8eccce477878e230433224514b31996c14cf38e6c5b9e5849559be05ddc6d89a6c1cc23e42c1812f10f2dec532c492cd98a08787a174673fbddfc11cd5808d7beb0a4e2bc3401e377d0d71699fec4d0532c237e1cdfd47c03c8e2e03729bcb30781e3a11c2e8007556b544a5533e4a4ad190d5b2971e593b3c64e95df80d0f4668bf108f01064da6eb5da7bf8cb6fee1257e0768a205e1764184b595125046063e26345d600196cdf5d42fa06eab714b648377c2222d05a3e90c86f89d0144e6d59d18d0864351e59b5b723a24ddc6954408fdaff7be6ea8b8154fd6cac59e2511ce4e219bc2c5b6bab2903aad12ba021f61d7aa71eabe4e3de1a0b154a04abb27f46297e47d31f0927f941c74bbe41faad206d89a92d06f4abeac748d1a86f12e8af6f0152de914b6da9e9e51492f3ccc41c78b9ecca1f518cc2df868359fe55b703c4f9ec868f449b75ac3eb06f6874337e5a2bc1bccc87a108d17947a6c238adef603bdbe9600927f6aa92c2faf57f62cb1e93e323521b5f4d8dae5fadbaa4b7e43e25f2b850a74815397f195cb6402173faa51352cb4e8837c941e450bfdf7e43e3e4e527f152e7a693116fceec3c040c010fa0b031ceac4ff66285c1ae75863fb0b8846d52a4c9c4a5286df9d390b6302ba5f59640affef0cc4bc3c0505efd699d2bac6a1f0bdd69af833ce27e0b4b4bed0f71acb17e9ff8ee45c1a7eb6b4472194278ef480c9079661bd4a203709bd89570627fe18dec8a2e80d4e42980a5b8285944540b204ea2784cdf6a4ecdc39353449597da44ca54c6f8f4708908e46c3bb3aa51ff8db6f585c384ed92b903f11376983697a558af55c54ac88a73121be1574d194053eb73a87d474763130eafa5871719a30678282af96aac8f8c79c23bf39a00ffd17a311d29a16fc11f2ddeedf444cf090241bdbc78a287263032fcb16a135ad91d156b4057a86146b0abf92013bffa59f77f1fb4deb5d9480898336db476f54120225a7b9ee0f4fce82e783b83822ddc8999aa2acf39361f0024efc7c6a50d0dc0e00b2031ed451ae3aae291902649786459c006491a910be31a6b0921082ee15b527a0c0d6d22b1e5d7ce6221722d4cf342628c93d682d3b77fb86cd7f7a85703d2a6bef0fad3f08992ae03a0ede0553c7df8698d7bdddd37acd218a3b45cb0cb1ee499b8e805c0889e8fe1d10bff0105737df85157f3c3383fcdf6f566207b212f07a7821ae0e626aafc7f78987c5ef17d3e0adef6135b09b4b47920249ff1d0b8ba3f37ecd249a7020c365907fff65941e66839dda375210c43782b96c8473e59832f9ce3b97b890367ca6e66a4de642831d05c5120d62fd24fceaec804f45b72a813b9c3c369a01b6d006698f50f45ffcc3ff3fd14704e22a16a12ed20e6fb9fa3b279fe413da805adb2da0eb95d85527e425a9cce671677a30bb7726639d6b80fbe7fae235360875c88d373f8b52e80019fd4479c0cb195c254d45a537b9e47e27d2ef9b1c2b5992adecaa066e0efcc4e376cc9e8d99e09f7af1c76016fbdbe91710483f6e363660a62dcb2a2be1c79b2d9079210969a45b3ca36fc6501caf10a21cfa360aead1aa22be0e72a32b84f44f22e517c8e70056da007be6b9a07b9200addf6b72ed67006d2e932fb2f4d0b8bc93044d2809611f51421060fc877b3cb3edb1fa1cb6456ebfe30f9a704f47f0562c0bdbcf6ae93f482973b437cf6f90be90b9c012d7138e8df2d84b518503a3a9379cfe2e625f2d8ac4b4c2decc0ca54112cb952ca3ee835e8ad4e597912accf18d15bb391974af963596720d94c25e61030d6ecfc936518530bd462188be7a91e20ca69576357481b94934ff4403f38ebcec41016292bca874944e221806365f9f9e63aba1acbf653f36704ab23bfbf4a6f626967bea0d797681d7ae66cdba2ebebde6c3964b669ef51a300b144c048a0e039d5c3016564d0779e4928aab07936a76024295dddfec6f0249cc51aa8aab99149887b7ef0dba0ff494c87e994443015a15d5877a9f1e77e73e5f83baa0d509f282ea2b5e0da3cfa69fb83d7b118f98d070cab690b6775b937b4b29934c01a109c409cb09d569dada5089ca4e3369fa9134a548ba1621ae3c9d82c0281efa41ad2c79ba1490671e00c175a2e2d6671e0001877bb5ea4e54dc7eeee9819297ce26d4b41e8397637c7e54f550b1f33685ba47b8bc91e8e6a42ad098a17291d19262595149898182ba27d3e7752592e5b64a7ba4945341274fbe4a01fd4be184d1f70525105edeccc9626e4d3003f469c8939d3986038045cbbe42ca0e4c25d44aa3562aab2ab15675d11e003df750a1f30178eef149f237c631d3e7923b96667f639c97663c236d5879f034e31820a716c7945230b8405266b3d8dfd8486970b2c207397f6c851d5290ca38264663b2269758666ece592da5cc3c67cacf18bf63ce2e28f374574132b9f2524a5242fae9f2673802d156099556ba844a89e6dc39829495526abd9bc223a53aa1d24a852a7542a594d24aa95727ccb905651b74fc32f2ecfbbeafd2187145b5fbacb5218d3432599604ba12a952c94b9d57d97a3785474a672d17b7061c3878de7783ba77796eb4d68083e68b2b3f93473f12938ea896b35c0d4aa552a934a94f52a9b4f9a43e49dbe693fa246d9b4fa793c47147a85b9342ee2d770409833ab9213a99e9e299d784bd0c371f9ddfaee0156f3c33088bdbac57bd3581616078266ba34d98598bdb50afae60715bb23581a1f8b9c33307cce25e1c2c8aef176db2661543a489c546230d91864873873477ec108934f4e5b8db901d6ab17955bdb92f07fdad09ccda3627fe2991226d9c8986a4d003dc3659eeb87aa573b958731f983367e2cc3939f43967654aef3dd119e4993583308cb5dc0cc22ba6b32b6fdc385f359cae6ed2598598734ecaa59d0a4e17c7b077739c734e2a85b8d229e55aa7cf5a7bca90dab0fc64d7a2b6a49452ca1ab6d0ca4462baa494524a49a74e5d792ab74dca0da68254f54a697345aeac4cd9eaa020254ac66b34def1f6932bc316aa41504ae90aa5f31503522ce5e219a0be4129256eb462324396afa1922dc7068ecc76b37ae24c8c5e39bdea1cfd349472ba7edc60af95b74330b872e565b33c3b07d6d03034f3355f33a7599b900db6c1662da64252ac1aa1e3172ee4cb0fdce6daedc1312eb83309c442330a6e69bfb5642148f9d0c067c88fd77b6cc1438b209de7b9fb16ae15e6c1abc0942527d9ced96bc09122a37af1c9da615aebfc3a7ed0c1a3c70f4f483eca16a9fb6af5bcebbaceeb9cc11ed81bba4d5a6232813d78fcb8ded00ed6a5e3071e7a557778c21050c11d79a84910e0194ee9d5bdd665264bc74ab68e6b650eef1af2d09173bfd7274b25287df1c30e3ab8cdd9527b4b1e0e94069a1a70c8ac5256be9a347449a0842b49f09dacfd2dc073daa2178ef23f1228815eed10bbf74a8095ec90822b01d76ae5bddae18a2bb92366665aab5c512aa5f45a6bad5cd10c9d6ef9ded30636533a27a5ccec52b2a4a62aebc4ca3c5ecb3de665496511f7db6af79353088e10836b02faa848620485ec04048a98cc153725830494e4f9c147ade5edce60383284233adf5eaded80d450226bf1edf652918326bee7eb4a1f5f7a7280f3e0d58109414580a0081a1366f2074494ba97ee09568b18a040c209ac88820f0a4010849af9e3e493f2896fa72daef06dad670486821d233230c2080f4cb063849653336284e33272f432c2e709d7103760b3274a1082278e78596b2d0a6a1386ed134b1471c388a109c3f61e21e374e3b68d6382f61c4e0dc7711c97928aedc478623eb1598ce631a1d576278bb91e2694701c67690dc34276a861f8c77b2305b59449878930be266240c4122eeab9270649dcd4161d8b9225d729a7b4bc00f6519f254b666e2694254bcaedcccccccccccc2c5972e8524ad9d3594e72b5cccc3cb9390c194cf50a89ceb628a58c0d5f715c3856904f2c25b3da69c82c954ccbeea4d0522f4545259dce4d347dc97d6ba55bb753550d6db7cf9706ea2c731cbb0d593a17d2c9a38f79398697f04821414a0acfc0dd729331ccd05f7d47a532062671cc8ce41891d269044ae9e8e3a51581f792524a79dc21f8b63989542775dec12a4d2e8954e7141acac1d25a679d938e97299d3e9da31bad94d2f9842221a517d43633b34c8295cc3c4941b89bcb3a799ebd94041b5a599d74d2721386652d275b6ad1dc5699dbea6c1ace4d360ba6e86c8b35bc1a2fbfc287cf81d5fe067eb77913f4ef386f822a7c673b9237c119df95bc09aabeebbc09ba7ce7791394f1dde74db025f5ddc99b20cb771725064a8c149515969616192e2a1a34bc09daef54f026c87de7de04b7fa5de8adf0e2b5f0c2420dd30c7feac61c6e61b5331c2995b586b56e9b9c4d2927e9132920f0b6bd9241852cc33795620447dff22c85088e3a50f2391b500a5bb306881f35f3fa3851e4e5772387e9db0eee7d140ae5a890a26edcd092bc9b60e79d0c0ae4f297fc05cf5556bc395f0157a04f989490fb3a31e455cf3d4eb8be6b4f9642204a4ed3d50361eff9078e3ffe43397f13052574c1c18fe236fc28a18c21aea3f84b70f4fbf751eed1f48fbf608f973eea9bbc5eb5e72492d5a1944329f4094372ea16745a633dd01ba78435a70c19cc00bde14469d8c3e979e429fc38416e02f40f76e07aeed1c1d1cf9e7b740083efbcf3e93226438d7081f0806441500d866a9ad8dc03120a2120d1aa696207c9376fd781a66d741d68c32379e7a3be049c9ea8643685a3f492571ba47f9d4b1ff53bf7dcf3ce9bce9f9c9dec3a972fc3c30e4c2ead1e29b4212383903b324d478b72f290711d5acca1451ea21b8803a4a96106577a72ca4a2778805a0d725eb39e18cc6cade70857a553a645172aa8eca66438f2d00bcd5f6851929ae84cce2fe30b3c55dc7106eca60914cbc99d03b5fa0ac19d27967007e7fc9d0964274874d1eaa6c78514ac91823bce8085309ed95c12c12be92ace2caab8dc417718cf4cef7c829babb81ac8132153b5f5f3f35235047d78e6ad9f7e5201c7f929e158bd6f066ce440ed7970e08ee9f2597a0477bcb419b170066c86102cee0e3af44ae66082eb39e8b043e928e5ea5c2958e9a8f4a42b936b6216670147f92c2ec37c1a68e49c132cc57c70c719b019b01933746610e98cdc5007e533603c73fa9571062c059b016349149c942b853303a6e25271a9e0987cce39e5e98867aa4b2178c5b53c3fe95cda77c4332757e1594988db6a99e2e30d626b283ede202f63f8097418c734e8e39a01537181b6c631b254695568c20c19f54aba8ccc0b3cc373597cbc2c20ff0a38a648f0d255c071024901474a830f1c2b901828d303f228d007a9e252c1b1996ef21f351d07bb23cf7468378540744d6a3c35ed1df54e952272c7d2512ac81d7916c6c07082a10cf4e1189e3baab85e25470596d32ba902933c77fea8d2a519309ec98163a4cbeb4d50ceae298c4d985214dde71f38cafffca84eea2e271e2d8e282ea7d086fed30fad2922fc5c7d107eae7070cce4daec29a969fc31250d83738ea994abb587eadcdc408e3b45e52fa015baecec4b645a466e75dbea27843b9f7bb2d8a24816410dcba208b287da13904022e765c48911d20548a8a0c24812161c79d5c808810e31d9e087ac8a22a048e2e708503842411656300008532801089a841105a0139c5a1f0f6cd0e0e70450184901d0133534877612a2c36233bdb2b0c2b3f8416bdbc291c7cb8741d9cbe2e75344b290e24797a1a55688e8a15288420e270526242b900882a5688284265434d9d101cf4cb7206d280b17d36adf91bc176478c63a7d592a13725918006651a193cb3f854c43afa41075153be3ce1a1c439da6a96cb2fab5727fc94edc6d600a3c514b6bad73ced0853affe43cd377bf7bbf6bb24faddb8ef34cdffdeefdaea94594517e3798729c3ea57fec40bf4b8ef9d5e7cbef269d3fc1fa230f992f7935acdb97b55f5ceb15c5a97bcd8ae1d469ed4bb7e49576f45205cf3d58ec7c476533a526971c93037f72eb14e5a7cf4f4db4fee4f70644acd32c3eb7426ffd5404eba72110f9fbd7bb18a81415d4c9647a79e104da5ff9e2f273de7d26ea3d9c3e3f81a3947ffa164029753e9d420b7ed6bd2fc7c9ce5e7192d3e2781dc5db1b86e299146fef2278e604f6703a790a28ff9b22063b9d9cbf1c2747f1df1b5e37390adc71fde4dd77c3e7272f7d396e780abb9417c6777e025b48afda63808d22bbf2fad82ff9946801293f812da1508b394e604a1586340c31793bd56971c7c9ad37e9bb4112a9fdb780cfad5390df7e394e6ea96c5ab75ee3addb94b7f2c5bdcef90a93cba57ee4e1fdf5d1479f40fbf5bbe1f4df8385cef392e79e211cf9cec55b697247f92a6f85c9e57c86b7d2e4eed8419da3514ddc9bc60e3c2abcd6bbdeb89a42a325d3a0a6ed4de0f4c071c68ffd7a3dedc7149ac38f54e6a9abbcfc8a9a5e051223a4908288eb598a1808417996220643dca89e7b785cdfa3f3dc63835a8ce79e9e9cefe9e9e9418223bbf9f6ae48c7d32501fad1b6a270fdb0e493d8fb331228e43c0cce2fe3d7fa761d7ad5d45e1d38887fbc9b7a49bd8ea9878379d63080d6d504684781216b21b5eb3adad18e7694b690b9b31dd974887c6f45369d5e754c488b2bac40a44334a4c5306c81e09297fb900a2a14d568d058129b31a34848a582b9b82c71c9905174d4d24234944abd58587456568a5a2a2ab3941422a118318a6028283414aa762fd1d1e91413f23645aeb729ba799a260ddd9163f2cd0d71464fede586b8f65fdc986db5f852c2cf92b33916c6711c9192ac54a474a4242b1519653ca387511da394921bd4b6037a1ddd8ff42ec977a74324d6e2587a0d291529d5ba234f7ad5ad5eb14b90dd4b552ff54c7a224b1dc8c3231da1e08e8fe76e882b25389276be7924c9be3dc8f5bc13e2d6700fe876dedddc9550af5ac9b733d801c1000a0183c70083f3b3d3740c30c000030ccc30c0d00575b30e68058e9687f4e48ea517cf975e2d8e1d2ca7c5913bf2ed54e74b2f2e08d6e228f3425ae41e2441dfad717375321ae40cfcedde8b67d8f582c574accceecc928b6798c951271bf2a427cda2357d4312d285dc495e2349c707fa487e3ee6b9078990f780fec5c74ee6ddb82c4e8b2e78bb7db5f8420de74ec1f8782da73361da6b3837abf4b2332037c673e8153b0b2e99b6c5e0b640a46bdd18b7d12b8ea1e10517c0d26b363b00c23105138e77b55ac99517bad8f0f6593aa07168011c99870570b43fdf5e031c6d916f7f015b2d29e42bac571d13d2a24cc2f3af00da100989c58886b428bb78fe10b4211a42a443a453f4a445a9e4f941d0a6e849abb504a7458984e777d06609ce92d792979216e5119e5f05d0a648c9d05091518bd208cf4f03b429322aaa15d5960869510a3dff0cd066899025b125b1a2a0162517cfaf026d8a828a848a84725a945b3cbf0b68b32407065b72d3a2d4e2f96580364b6e96b896b88a98b428839ebf05b429625274547444a4a4455984e74f8136444a88868886705a9444787e16d0a608e7f52a1ad2a2cce2f957409ba2213a3a4f5a94b4e757016d889e14b58a5a3f2d4a2c9e3f05b421fa99cd88825a944378fe18a00d511091109150514e8b5208cf8f02da14e514c18a60402d4aa0e74781364440349a518bf28ae7bfa00d9151ad46c4a4451984e73f8136444c888e888e84b428ad787e136853242416b329ba6951ce9eff036d8a6c8a5c3c23bfc8c531fc348d0406b01fb9a1adb61d7dd776a64c3da61e4871a8abea0c69e2d6706c1f57c3266b1ed5d874c126ab93753258d7753b2d4a6fd9ed74a17575456cabdbe9640b0dd568b276320a16e191b37d665b2d8ed3b5e3dd2e1cbdb0dbe9d5aae784753b2d32754d9647a4991e4d96173b9aae6ff78834cb3e6998d86459797324c74e265f0d9bb67533b720e9982c2b0ee58016c7ded857af2c6ce75bf6edd4ead896b5ad27dcb193c95a2cf2b55e681cc0f8849aa94df2f2e74bb3038c2520929c73cacf66737a5377035d483870389c5b39c771a39d71cc3870a849b04853633c43924e6733891b55e54425ac4bf758a43f6af8e33a2f81a46ddb7c6c9fae4b3fdb6c6d1b89c4d6b33f6a5cb6eec785561f191d26123bfb6694721441b4beddd2482d124eb3a88ca300726454fb9611f1a33df25a5104b1821f4937b4d280825a3cc0f707d4a2cd12517a2780953c4d8a115e4a99a4e4f3d25384d84a4f79bd1c51845eb68fd04b9273e0e63409e823485d7b1f102b8ee8661cd376d63e5f8b637a7260f591d2ce3aeb930a722517d234d7ad6edbb4244b224d93e77194524a3fefbbc17d5fadb5525a2ba5b4565a41af57305536b160fd6998f693cff5f96ed49f5ef9704cbbf5f99e01595a900f075a9afae26e4d29e8d18942a1502d1955327d4215861ea8a085041b781965a8974ad970942ee50bdfedf6bb772ca53b68f78ede7ccee0430f720adfde523af521dde5bb41761c5cb62e7df3176468b1070f7cfb267fdb7c051363a3c5ee41be7512c9871fadb750fc0f66bf79aac52de53f42bff98b8c88facdb9f59bd36d335dd3b79bbe5d857729397f07ba94c21b0ef0d67da07952e892e300df7e806fca73339370a577872d1b9072c2dce91de0a8a1579db2915aa97c655f9092b9d209ee981a398e67f8bb0aae054d4c26a152d48552f0a74b5801787c14993c84909ccae661022dca2a5ee680c30d397886924fbfdfd998ac1af69835c8194a21053886e9a470477f0fcc621d3de6ec5007c7d0e04adf668f1c2e37d01d2e9df3979cd25ee510e2e8d51577641d5bb5d3daf072a1afa87c4dce041db3a59b8b63e8b1c6cb71864a5b4b22c9d076c702e44a17b8f966c3c6dc36ef0f07f9241b5a1bcd711cc7711ce794e3a95372edba39b802c6e5bc8795f7f14ab86ccdcc410839859ae9342d438b3b4c8e3776798d2c056166b136dfdcc53adfb86c4d7512579d0482c0460de538cec5863950e7d7e1d6042d2caef17c5aec805a5c29a55cca124033b9cba55228e7c0d16e8cea482892d712365d29d1d24aa9940a5740150ea8ba71a5b0a8801c6ccec9bc412177c66d0a21311bfad2a78666813250f6f728e503ca503354a51555b34c8e504f440ec585828392c3c92356cab8f07cb6bad5adb7962deee8f978346fc8f3f12aadf4bd066591962677e46035c6842b6b076b9f24497e60bef24dd57a79cfeb6213e86537a3b49bf54a76b49793a56ab9ba4fa657d3069251a6ab5d2be5602ba8b439588b9372de583ab25356c2c1a9b55537aa9b9aa48d5232a286bee552ddf4ca066505b33818c3f00c7dee693f9d4b01b3a8e7829fde9556dcafacbc13eea86aa95c3f5b5c7906e3ae30066c683c0d6d687c87ae1a5f033c7780e73c616c68a884e7ed4f5efafc6c94f0bcabb3d6cab5d62a6598460d3c6d6a636bbd9235306053e36d6a3c0d757ae511e9d50465a00c2c42dba98db9f1fc94992cef734aa5cc694099c854ad0e5d66b4d2dad98e340b05d45b7b9b08eea86a793b9ecfce6471b01dcfbd50ca444a294c75a36aa960f47494a06628da54b53c1d938d37f3f1e28ffcf4ae97b86327d4f9c04ea8ad522e06eb95fdb92307ab615cf923070be3f28f1cac619c10efa745978af23a239e41f1983b303a29bcf440f092092f7d093c13c3eb96c033fc29bec2b2c2c292b2a14bcdb9425bc2a5a0ce4fe7118cfdc4f9110c02be1e84fd4c809475185acf8763be0ae3b8c9da6ad83ab92dc393d1963b1795c7c1e04aefee065da88a86c72971a57b5e672f3df04e98a6ce1c53bdcea041e3bb7125087e374a6eafafd078a632f3c61c13d2cc0e1c55f8d429a463a7c3c538d80baef44b6334542dd54dd7f80e55ad265c935b5388026a98e91f4ac94f6f4e48b3be1045eb218f9a793f57c6f0e91c0354b5268ccb3d6e31c6b3b77c7199834d28dc1135b320cf77dd99302a78b6c955e1bb41c331d363bd9a43bec91db71d0ffc6ed41086df8d6ea4fff2f2dde8bc060b2c7c372ef538180c4d770000c077a3736ed105cf85ef46774291f1fc2da0fb5a6eabf35a6eab24b7dc56514e4dea00e0752eb8f0dd48f12ec6f398ef46ca57d40a0ecec655aed61a6ae8ba922d953acbd5ad73706525a19c2ead2494d3557112cae9ae8063a733f250f17c5452a64802cff3145d08f9013c4f910411bc14afcf139a3001f002f0ddb8b2a593759d4c0874f10c8acf51057b699dedb69d6baf7e026541ba9173126a465a99f14c6b3a49d6abb6462da6f4aa556aa8231634b969d6cdc7132b8137e361c1ccb68ba8faf9d5695a94b5d8deb282bb91c0913bf9e6dd77e374a25eb7db09c0b34cee006470b12bfdf35165030d56b56e385e55cb86cc84b9735eef55af5e812ad754e55c6fa39baaa58aa95aaa17ff55bd54392a98ea4685a372a95eaa1c154c7eaa9693dcf4dda07efafa92406a51ba189e94c9542d5944ca68523f17d5ce42c1b85dd78e8353c72adbe8c609e9d5f452104e086a86aa4dd40c25849a01d150422825a8a10ba2805041bd9a281a4aa8574a5043a8d913577a95d1f40a07bd292ed469268b36013cfbc5754d96cb1702e1f2800eb82811e373aef1c2ce05a26280a85913607642ddd04bafcec14017ea392490ef908bf56a965a77e4601c8c8bb5c89e8fe7e3befa15af14853b82af9f5d0b4a4617d4a29441bd92deac0930dd044ea79f03bac6f3b1c11d51b351d5da761ee0f956843b6e3baa96cad562d7160753e1348b837130556bf3eeaf01b5e60b51b326dc2a65edd3371e19a397da92344bd5ea2d1cbd47d18cb088b2623bc2220a8851b32177649e9676c2b03c6ed1c5061abf425f764755cb858636b03c66d6e7ec230e98f5855c6cc24c0f06c54fef6c78b248013c2fc077a34469839deba2bc0bc11da58c3d1f1a79e44a67da8ad0647d3bbc814ef06a82dc889ab93619a1679db8a3e7536b7744cd3a2f79e724ef7c7a0dd3695a6cc7e2a7977824b35033d415ccda7626cc4e11beed923b7230d46cb2a40c3543cd2805ab8b63da3ff0f50db3ed38311d94b5ebec5ce07a472db2fde11b650658af7e700f8e3fbe6b1e13940d5ddaaff3e37c3836ccf78c7a357d5a9c1d5a2feee8f9a0c0d133fae92770f46a3f83fc36a2664d9b864a98a812df567bebda1d2ae139fff423b248af4ca1aaa56a85dea5202936639d7047cf67ca2377e6b243b8f467d622ad451a24e40db167e4d53c26de9316edd7fa6e3e1cd54b95d3aba9c251dda85caad667c33de8fae2ca1f51b3d1763378dc620d0ee6c51d519e8a83956a13c6a7c5f67c7e769eaaf553c633346c68f0a8cc000740800b2fc4c0000098550b31b02013801a0218800c04105f566085360a3033034883010e8080ad52d26cc9a5cefb4c2b2a309850b39feeb26da8190ae8f5d351b416533f1da58582d32c02a0825ae41e24b87eaa5a46b59f9287891f51475d8f116ef023ca0daa52554b75d3620bf909f290aacc8902a7d6f664070942a9d7224b6ea975770de71325a1ef1a325abcb8638df12cc1628c245894c12b9d52ac249b2cea3e3188c8d8f9b6826756be6b3ee4773cbd1a8fbc74d9cb1cb866e3429708509ffe80eaa4b0034de8404b432f3d2c09bdf4126db23a4043171da89768355687742c17a14ae48656aa472a4ff5a940b416c7d22ca8c54ec1379d4dd66bb25c74a040ccd0e501b30394fa8f1ae9fced40c3ee157625a1f943d28a838e5f4619ad9faa67aebaaa8c678a90846a1066d5228e48e29947196c58e2e198520febb490c411ed0395e1775a82b89d124b39aa3ba75a89a8458767a4773c2d4b10fd51d772aaa51cfdf453edc42425c6332c3219ad11b420f4d3dbc2d2cb323bc948e9e5fae9d2a403233f9e725e3fdda4839f4e41961a25f23ed01f639c7262f0f46a7a4b10b77d8cc1a3fab005c84df5a005570c8b31a4a57a10d25a5a7071cc74256efb3863f6d3c790f6d367cc78c6fbe93380c216cfb0fc8cc1f393460b421406af09333728ee68adf4aeca57b2061cf8b9821e68990b2477acafae5d6d532e6cd9a2760bd01d2bce4f9f3507d6626c48d56951c6b548c56101e3569e5a577d7271817e505b3ca1352e84d859164690272164caa140a58b004ce480052808028b191648c0a06b5bc3ab20a2c512b4f841ca0043461c01b9820b9f9d3e82089deaa6b4a8810b95822ab105d184f4cd7e71e7edb8c794cfa65dfa9547e8b8c50c6cbf839d59e898e5cc334a8e087794912faa54a79edc51a6fafc34cb6b980ad4f345c94f3b6b6dc63afe4cce9fc9db5f9099df6a5cbdc93f93f5dc0496fc03bb0f2c914a5e57f2ba9257bd2b311d3de6a13ae8aab4de8daf296d79844b9dfd935ff76723bf6de055e71f48720f2ccdcf86d9f9b4547ab27a092435ad3e9bc052aa30b9e34d69d14bc94eb59832aabe67a883dab66db2d65ab7e97293b29581ebb5ac9538b2d52b97bc39e2bcc5e5de07fad35b4c955cca3ec89ff4bb41793669738b6bdf07bae2991c30cc52808499ec13cf3d39483ca77031e7a4205de205115a35b28f20016bd500410653497dab5ea9e42455d244e7632fdd47b3640dbda2b4bbe7ecd960113bbceb36a794524a9b148e3d7e47fb66c71ebf853e68e8833ee7f38719f6f051c475c9e13269afc0e79e1b267ed2a03b72cd87cc0f40b4387a634a8f5a38de9b4ab9af565c9391f9c10977e49a8f9acc913d9adc916bdfb51614dfa194a522f0900e9eb93b1c736ae79711557bc9f335a06bee6cc2484711b9af09231d46254bd7d1e387967c49988c491d29933bd247ce244d0ac92159bbafc9d23161a45fd9d599e178631c8e17f6d2532a498b500166dd1dd641019650300975dc1c30ebbef815c54bb727b874087787c9fa5ce6903e3d1c3aae29533a3b68e853b58268b2a0262fa0264f276f2288bdfc9edf023611c49e0154c61036b0972838fa7712c4d12bafef9186916ec31c7a255dc2bb63848f361d5c468244ecd988cb74c933d43d965c949cbdbb7379ee912177b4b1b3832376c7bbf3f2bedca58ffaa5fbcad941023878c6869ff66050070f1d5c1d93b55ad920eed8cffe77a7c519a6f0a0dd1e38b7e9975a5c9fe1c8475da95b2ddad1ace633c423c43359c6da49337b984ff212d803c947fd4d7ee849ee98fa1bdc8d6e5b7de93c602f2557e1e3f5f2eedc5c2125e85821f45ba577a7c531e5488b9dc4cb94165d2c955d7fc97d0f93ebb90655f280fc21e90a0f6a3ce40d5b9c9bf3e23c739f14cbd81f7ae3297597ba8725472547ab6f52dc51ee1ce1e97ee4ac455af5959cdbb9fc3c26479e171e914924ace40d92564e7077e4915ef1d42970683f05ceecabb790d669b1d68e863249af2aa5e1c83c3b3493256113a63a8ff5a9d6de9b4ab9cbc8346c16c66c5a7b6f2a4561341c574c663fc373cf1729f8a15e55a3af452e8dba149a34da28776cd89091b1f6f200f2c031db0bcea5ee2f376aa61e74958936299d07927fa0109f9b3e67d3e75df77d2e41fb719c75fe1cc0359fd3f44772a15a995ccadeadaef22123599347f2498b5dab45ebe2240c8c7921f78a0624d9b0863bfa558b38a9e78b117c58ac7e54fdac757185173b4e20811392f093990543ada65db608e45d8244295d81270a464853c6ec7c7b5b4b29e9a91393524a299db4c5975a0ecd1912021078523220791ea59452cafcdde0babbbbbb093c4d90354147caef069d220a17b46a6813573afdc1b5740797a6699a3a09ec46cb71359c0d946ee0c8e391dcd15698acb5d6d06f9095bba8b3ce1e5bcc309873af53fa059a09d3ce8536e5aa2e0f4239e88acacb8921b8d2473792c14f243f831885a085b735b438fd76d3b084cb054e046d51e4484dc7bea7c0c437ca7777b709aec72dcfb29f7316b1e0e71226fc5c3121051a182184114a5c422ce091c20e381b3f7a444b54f1ed96e8e8dbb7bb821037df8c8401c2b75ba2d6500dbe9dde96131e6d91c650ceb7f794410847d820044bb8a63041af0008255a239ba8f02d3d223708028302044cf8f040043c413062895a8f12889878d57a96e0d39a1bb76db4573d560061886ddb3697b6650a57b69e93b840669a59415b02cf4de9c9026654fbf1ba11ade44ac721071cbd6a3e02e28715cf506f8761568f01f86e2ee8338f0d704c3b8ec9e280642e8608a2a33fd0b00711e46877d0f1cbd8b3e79952e9885b9f5d023e389a3efdd3497ae5d33fbd9af268c2e8dc2de46107a6b1acb3bf48960de5938611250e4b16377d7ce1a7978eb8f37da0bf03c70cb5d4b9d5db47d96ac9aacf9e3da7ab57b25611d98eabd52b996c47eec031cc923bf441be8c63e6109d58af827047d99237d3a5abe58e94316df6f421c7cd81739a9647602769293b629ec952908e9d63244b1b44b8eca3ccebd0f117e432929c2121222e23c9d1f99c98eb321213187d3fb7c8484ca0a48b1feee2486ac8c8e665f45abf2ddc3e1b2f256388bbf967f3c3f6ea4738fae8a79ea40c48a5b8239c043df78061f4a305838ab7932565473f3f4a19f71c25e149320209eb554f700aa928f9d3e23875bebd6f382746081052d2ac9bae06c613168a8c7bc2983a2db64f222db60a94b0ce427abe26acc50de7471ff3a9cb9d2243b2e9d3a86bfd64b6a6ab45971976505fc93d4e8c1070e29749e7e4c95eaf36d29ca46d9b609dd469e6046b0539ac1949590fb594750b519ea6c924df4a38a607d7c7a649591b7517d47be8fb86a5f6c1b873e38d379e737a2dfed88cf8cb3177987b6e3e993233b3fc2943edc82b65f3e474ac577348c34c9791a1c5eaf4ab4b75aeb15ed885a5d085862debd51c533c521881ed550f901f9e3bbedc14d9164f8b804d6d704719a3348aeb330a5fc4a4b8a38cb9b66ddb9ad2cdebe629295395368ffc51690909489260f28c24c991244ca47c1746a779a9d7e20faf573248ce7a05d42b285cf6818e53c814329b38cd923c3e393f69f8d14a5a0bfdece94af2234dd15a6bb77a1bc8f4bb819bc214a62085a74ee59436e8198911b4fb8cc4089f24fc3c2381b552cf488c18faae29c83f28c7853efabb21fe0099011c0d29951dc1868d970cf69af2d52d251774471b3feb8bd2e642a7c5d1c64f972d35d06063daa8e28ef2e5c95ef2255f1cd01de58b49b3e4cdd094384f7eb6361d264a3cd99c9bcfec65a0d17eb4c1b54a24e85a4eaf378f725eddb82a4bdde77db24a2947efc6e9b3a16f39c63453f743f9b6cd6badb5d6bb52a54c30051c532adf8d5e59912bd5747b25533c94182b5ecac792c2c2c21203858505755958584e2ca68f85c5eb4a24cbb16c9505930cdb4b3cedd202259edfd16129084e9c3871e2c48913274e9c3871e2c48913274e9c3871e2c48975629d5827d6c90c37267436927a9ec7794204419a33e5ce392b4d6f3877d67abd3967cf79e724d9e0ce496bdd6aad5b8a9b79ddea56b75abb296783a38176db39e99c73ce3967b595d239e79c738226ae5dea3c1c3f73ce49eded9fd2b3a99006d9b1f7ddf85a4ed3f8a3eb3cefce39676d3ae70c47cf643a9dee977a2e7247cf2315e9393b069dce36b9dcad643a7ec1c1b91c8e2f4fd965eca977ccccecdc7372af46ef53b8b0be2835f9987c4c3f6ca33acf102222927ab660b5465ef4f3821a21f13c7d350c754a7dfcbc781a6366f2094325e3181a63966af58a7a4b10774a167838867a0b903b23880b3e3c233dc8b73043e8a90b3ed3c7f0f5d4c716604f3d7cf18cf7d4c31c1678e80662a192a55a4fe35f88d92ac0d30c22eec81d3942823b72300ed6e2458b55488cd3e188c85adce18eb4787992b4f8d3e20d7dc8bf31e380b8a0165dea46ad947d626b6b95ccb1bc52a29cb6d3367d43414141f182de5a69a5fc99ac1bd270bc2173551ae14ae7983755afa63d5271f64e71e688b82ade8f0aa2218f12cfab780a0aa8533e7744cd36293d9a07e4cd7af5e3c385aa459baa629e479b1ead5741bdea57c5542dd510950e119477249477240fa785a8a4ad95463dea14d100000020089314000028140a080462b1603098c8ca621f14000b81a24a7c549d0ab320c8711452c618448821000000222083d1840178ad17f679d544cf4eb7ec0d88bdd0103f4399c3f3e15e0666235c874b0d11da86a7ea0d393d0657096b69ab36f96e088b4160dc9268a73addb7e11d24cb50bebf8acbead84ebee13c8888b0be34ec60c66b8aa3e34ff05a6f50519f45ab05add721d7ad092dea2458d31f735adf24194da022ed0eb96e4cad5a702546c261fb47ce8e9633903e36dc1fe5b357381075fad13551fa169431f6161ac9a3d7ebaa2334e1284313cb26912bc0f129f1d509c444164d27579e41d5010404a8257d352ffd588209495fcec0782b6e83c4968b00f0c8a7ba40fafcb566e65f9d205d88a0d4eaa725317715e37f8bb2625c36dbe2a9e04deb22d131b83ad88a48ab3edb553f5e37e1494b21d9c92956b7d3ccd1059933a1d6667d765d086745aa5637dfc1223d1b0c77172021b43a7832da887c1a6f18580434fb6a20efe18559dbae6bb614c254ae107cc7c4e8eff59adfd270895c48b0efdcfdd9a87500f52456f697fabdf970f625b0a4a361cd3dbc4380f597df3974c0465a018f00c9d55c62512cc3abdbe1438ad59d71e0d55a103298a0622fa8d5d7548bcdaade66e63be5edb3bc59599d520cfc882ff8709bfb30848c34d600ecdb082eefbba42c22c3956c71c20db3acc13af979ae84a48a40ebee31a3aabb67bd48efac2f7fcb6c9333ee0da954806e68cbe50c6dea74dcf2778b89b960f8d80be66c6efd7bd310757d2a2974a640a498779162e51210a66152d38b6e951f62342604ce216fd92fbb653afedebe3f7746efff870282460b7cc960a28b49443a4124d6adbfe1d2d4a4b60e4f9214819117a152b7454d227d1cff198b046b6ffd7615bcdfe136d9088c6ef99b60327f10b87e9ad6f4cd1758faeb81d9d7a7e986e8de38a726a788f1a4c5d28f40f74fd376ec58b624b005e0687d20a18dd8c34441d697aa933a4da168c9bf2a2b31dee2780d43b551b5415ee38bc79f921669e46bae860edb04d9f7b0bd32cab72f524cfcb50279cb638aec5354c2011e2ccfb8af30e8b03df7dde177c53acd8d2881d07e4cfc79c446990b99b11a82d8b7a45002b8be984b01389f8af73c6b1be88af7ee70c909381147cdb5700b13ba8fc4db1a053a0121727bebdcc68a82c28d0e7f07905a8f83155c323f8d3e777cbb5495f528e146c4a46e302de798deb6a8d8d36474e787cb80d342d5245657e01c3b414f61a7908e2561f0ce012e999621d39eab63641f24dfefbb539ab1190c34f22998e65326c98f9e23c259b48b61cd634fed6a1796cfb181167267f87e6d0b2396a83bc8774dc3dba04e74aef1f09870b737f1a266c97d0246df14580110281e1941349abcede2b078d66e50a30d657e7380b04414637d6dc0a8fcc2adaaa1f00753b8a03a88db794b0b581fd2de190b69b2781ab29ed0a9f36356be47f2c2f8f15ba595509a9b06813cbbaa5c39029f637de6ef31abf0bf5d64328c4b337e06059dbc8282dbbbfd534fd564bb9a8746e268c10870b9c3c951db9520fca2b3829ebba265cb977d39c11803edcb0a9e39267539135f5bb8a39be959fbfd8b4c1e6c22e41f3b156b5cc3fb9c8aa337206278332cbbe779e88aa432a2cd947844339b598832bff797904395eda6590922a39dd78c07e879888d97aff2b661145752b9fd795c097ac24ec01c55242b81c1389f31d05d44c9310e1ebc90cf69c7a9c396a0ecd42c787fc0203216aaa7d86e5db188c777b8689a17d3d62b8f990c9565e94b7855f7059a6c514af9bd5eac8d60d6a5eafefd252e9052ec9e5a7db7a01be3051e5881db5e4fae3b6608f59997325bd48f4566846d022b085e75f2e4a65ec5421a02b9d9de54604288e3138b99d349280ebc1441d9c9d6b09ae257f5cc9294d30a834d4987656b6df4e99884df682b2fd219e198077011df25d0ba5d2d182e549de9103059763f6a665b096a1d4d379bc35c01ba0b0c7716ab6693fb75f6dd2352aa9a8bc9c6f69fcd3ddd0af5edc4e6ed62e988b3cd99ebc638261b49af1b661c82efad058f78bd69283a073cbac4d3abff0e265419121cbe08e0ca84fa00795b6fe86418a3cd72760faeddeb1d4dbb2c899e1b7da526d82f8a2090bc436f7a662b3423f002189e889da836002f0b810f2d23880d4efdc12965cf698785d351d5abc8fec8d383eee14c5c86499b0f32f7c7bfdb35fe955973a51d9ee10179fa29fa91d2c1113cce95d08a5590e748a96b90066d82a4c5213bdc9bd1a2f55417008ed1acd282adae584683f06102bd1a72870a0ef800e2d684de205040fc9227087437eb740773d1c311b7d0ac0e4039e64ad14152709040cb07ecb27a07c4bc97cc8a119b8e6d6d8916a04dba6eace45f06d427147acf678f5357a02cd54ae69500fcd51c5ced3a3594f0d2ec92a2b227f650bd303adcad15be5f4dc733c44ccf00d572b74806c7efaabd1e2f1dca2950c1a6b40e9b2e85c115f681fbe98b931049ed95767e20f28aa267332c5097576f8525f7e16088c11b74008f92c3397b48cb87a98041d3c13eb15775670c3b42aee5ce6c119c38eea753ee07db0beed80b8e6e3bbbb1e090550c244645367aad8802068f6e456a21e0f78334115a5ec8e1de51aabb62c9c012a3117c86b6cf95689a8388b47a939785147b79b05ea66531b3ff7655a36c079ee2cfcb12785770b68265417720f15ac20cf10ba76e0db996b866679de8da3ecac89c60f3120afef5d4b196a1810981a08d52dc2608d31845130706fc6ceed21d0cf391d1c94313bd2b6b5ab57527ada8eda3db7168e303210a1aaa8364c20242e2d17d4fc678b9cf902ec40f1ad131e93cafc401a56e88b4bf81ca7555ccbe615e6d554ebac127b7aa8eea31105d4922d189c9f4129295354a512d6a1e771f83b8f2e8328ca1dda46da2b785ca617f2aa0fe51d09be3ddba90c5a7d1ca67e7d8482837efd4bee1cb820512df2c8c470496e4c51c555995b67702a037bba154467b7936f92e2722a2066b79b8f474bfe1231408291eb4a5fd9f5d0a2e4ec54f0d5aa94f9527f76e4a0aa281f456364987a0865e81cedbab62bdbf225090c0c7788ea69f45c39067df717608feb4edde0166bfa9cd974d86f8cd9496955fac29f739d381958f5f32ed9aa3771ac7760c7b27d5b90c662e236558c66fd92ffbe6340c14ecdea93058589f7c43027af6b3def9c66556de6fe07126cbe44fae4d016bfd43eea10fff1a4ba91f6bd63628a1a07f0a185cba399f8948bd1bf90830fd4fbcb734e7801c759b018fa10850c9d7a944a6e4c080c35f8e4e52e09a6ddc013fbc0d69cfc990e4536d4fa2595ffb70d24f8f9a8986ae84f9ca2cdaf77e7d89e5486cd5fb4c8a90ac68310374fa57ce81180391577777a6274acce3cc199982bb1a14e11d776dbdefdd1d1f3822dade2849c5ef12d59100375738fbc623666a76917032d4b2c8bf28a58e85fd82354853b8dc02077c9a82b2bef5c5660b8117560777967de23951f2745b9be9a1f52576d6a6e0fac205026a13970a869fad198dca37372670e7cf1288ff671cc151a224ccbddc768d60ecbf39bca43a3e767950e842626a48ee200073787c449b9ec0fcaa7de6f288e91589b7ae51ae73a43b7b7a33068ac38f810ea3df692da29a7d5f7605530d3fe4256692c8bfac412d19a7ceac8d6a320eb308fd23f177cf4e95929423f1508f73914d2ce6ed9c56e4d06e729b8d4f1b5aa81a8e35bd4540d5ea6a45d6407dc968e3bbfc7853b8dabe2426b82f896fbd429e54c55ec40613f2c15d4545d2e06fbb11012648a596e96b457d250cebeb54e000bbeb338e64e74c30c889aa054fb49bac2401eabf1c95b0838e0f00d13d5d1325a92ee4b445ad538af376f2d0447799b9d81aaca29bbfddadec208f00b4a0f386b1d077b626905a159dd540fddb5b8472fafd4d3e90c94b980772810d1bea5df0d24141f9d8477c59519a21a35156bc77a2c4b3a6cf2ff2e510e3268d8feb93c4116bca40aa8c287e05a8da01a1d710dd8e4699ab686cb1b38518af7f8bcd8c263d6827066563620804114e0679e5a5f339fed84168440382583493613ed03dd132a0ef41aed641d03f512d00132d7773e85a1e592bf69fae9fe508c54454e885f8ed047649317850e13888dcc2cd4424a7660d2fca581a3f8606f1341433c9966595235abff52ddc2c3c7344757c25c1b39f4acec57d7c4ea00b40ffe9fec52f6e635752b1eb8237f2f4625ef443f65f6c73b33a3d3937f9021a4122fe272b39ec7eda4d1698014242595d48a72fe805d3206231d80db0e0b4ffded36f3e69b6c50b04df1b383ddcc69cb1b40ead616dfb873c1ca28768fc899648da9c42ab20d508e4b66dee11d3f8a3f52f3a904ca61ce0124efd7883b386872b3bfbe8fe6721ae7afe6ea64139deb54520825f1a1dcd6f576c21be27f427145e84c658449c31161064f5c88f4f00d2e2181b09f66e8dc2c92a5299201cc9ac2a9b191bbd1202d5d1d4172c66c6111f6c186b04dd64f9a4355dc564575b4c61e026841e8adad16b4c9c6ccb40a57b09a1653420b24a93ccd3d0c8ac38eb0034aea1432a8472ae2a55e304c94cbe0e984e3c037451c406e82f7782fafb0c8b6a95b7d94af6fb8c5124a39738988899132d0154cd2aa4b3892f648378117ef8a5370a98747a0911b4d5abf6d0a38336892978464062422f817f30a8deb9454a08985bd8f29e6a72e67a5d4c21f6d03c7f5fa281db0789d45d8adce08dd2171dde6d1a12767e041b6d455c9d3cd0f1516d2b2fd2c9df8aa850d8271fdc77bcb014cfd95b169facf326634d1c746f40ff3b45a3746ba481caaa6c84c9bf3059bfefd68e6d5c2ba2bea1dbda6ccd086c81025a2881d7307f26444b642af102fc8986077bc1a70474d0bdb507b3a2623b5e8901d05d83de460b70e04ccc06206c9185094f9de55080f664a48d64e54ef2a76ce71c14df9fb430226599d8fbcb5aeb53189070d22fd6094e2611b898f632fa8881b387316856c652a6ba350799388587b57e00b9e0f04808ca9640ccb9e7b428f03394f0c3f31b0ba6f09143bc8056e9f0a7f5cc7177a31155b673ec395c016d8c19662b060801a88afd262fef43f8d7c284b3270539a5eb216ba5315a58c54874be4ad37b642d5c1c2e7bdbd1be7ad0897c46b74770a4347c6b994a111b9db116cc4a47644a8e7ae2679eafa53186f1d94624c96d5205862216546d8f841cb76a47cb52b98e2c41a5cb3b1a146de83868c0f094b56bf93da1b7a2c20af9cb5f046c90f556c5bedc34b028331db298053da54c81646e9d427d8e9d23d88436cc49b50b97f33abb0e1e3ddc3a3a97d3aa74816c14494b3ef0a9cad41d59374c83dff6e3de8c60b8bf5c2a44a8b913feb891da34aa01a2c4d3f65d141e4781a22164140238530640ba2156225e93d7f288a3fc8fbcee2943fa61f966ccf6f3bb8ef4aabe97daad714511999638a599470b839013af4d92eca17f51b9ad537ddaa0c784a07842c7b19afc25048476eb5e164ee24d876023303b2e1c298037c042b2b3ada889217756b65460e37b1f8ca26fe90e13463a111cd86fff599ef06bc02bc56e6d4290b7818e29e43144f6dc8384de04be802969c1ec5dd05fbe670de464e468edad1d2cccb0ebc2fd1e1ded936dd7d31658842b680e57ee44029ac1b20663d752909ff026f61566be126eabad968a39a338904389c492c28a3e3a78581592b608a49db0c86bc1b712337511f27f6c1243aa7737e692d9fe991254bb9c713003fa1da42bffba000bb3af547fb21847a918944bac227848b41d190f3d056f0bafd41ae66257606817f24e5e0808c83b7ef224283ea77df811c4d9352819dddd7b6d34378f2236cf69cba63f11bf32fcf05ece7fed85fa11dc97a9d3e4c1feabed160926ab4a56189ed732b481b4aad3e6c0d49ed5f822e839535dadb2438832d62d71ab8f731a2154522909e92c63992f438d354750d8509e2a8c4526b991b76a2fa14eb025695f7a924bddaa17ad92fb4b53abf5a21544db3537caac9983beac915de665108310ef09dbe8027e11a6658d35dc5764ea2d073fc12eb9c3412b18cf660f60016c2da2a50228165acc250e8e48f1c82cc206be7d5a3793550847cf1bb7995fc5ec0c7eaef3249606a8e3dde8054f40d7f5b4a73aeb94451338c0691410e4e75fa3b0c15dcead90e4397500571b0dd8132128038a800795dd4194206ce4221b9a8ec7cc0615b0e69436ce5ec456b438bda959aa3cf49f82e9aa6a90fc1e1cea70ea32cf639184eaee871be1dec984caec6a50865d11da947521d42f6d2097e8aa71e217d5950f0f5535a335083b0d7f8141c32c17dbd08a1dada192083adba4f086c7fe7217f23a5a2faa8159af0a867eacdd44b99751a1b7f09f858e55ba8492b4aa8653b1c3c94ee3704e382634c6cab00e06c2850fb0c92eee28bf47ddba79a30b9cdb1b94fd64f0391453de27fa04c901566c743086911a9b0637b1f09d12b428b4801471be7bdac348bcc2f0a45570339a842516851d76f24b3e75a458c2472c873ca820911cd314e64fe8b2752b5e114a1b4339b2697479e3f4c1a719b3feb758dc1bb9d49e475f0f8a495e229994fafa27fe407f4bf421c3b731830c0b809583b594cdfa058ad599f5846ca239832c7765c582697aacd406d8659a20f6b89298784662e1848aea7d46617da4c0902e348e429e4d4b3302fca6011e637f1cb2b7e4756e2f5cea240f8e9887720ec295f39a0f81334f566717f2d7911f76c22e48964e3c643aa7dc046a9b133785d9046d1469e4dd9ba1f25249512c4afafc4ac8cce1d163b38271534575a66a3147150e73b714816d8c6f4e177e7d5e3247d0cccdf11ce842d0240531ce2db7dc7336d7ebb7bb0a34ad7e435e260d101dccc180375640c4dc69ca5bc19b681f7f3aa55ccb20a09cd101c0f1353ecb4a407cb7e68ba41e2ef15a3f63ec460d3d0324dd37b1dd885aeb9a55becca4794f2649672b16b6f813b7ed7c8cd1c92ab9b60304d18de12a5a48f5b97808294f0861aa7544df7514c4ab1cfa9ae982e24234d7ddac234f450ab862ae460e91638a654f214effaafb51c8241303599a693b25ea363d68c2800a74c86ed0c312257eb5c506d0fc0c4038da3b34c9aff29df5d24f8efd25e9a2918b6dbeeac70e8593491c73247e55f4f428c1b34911276ee8f891c511771367c12fd1f7e1b4941feb2acf584319b2cd0cf2263fe4e641166f19660d54784a31984aed605d4a3a9338d67b8df6853cccdcdbf74a38b2a2430b4b42a10a41553aaeef6d380dfdebbec683c7a95dc61f8201435623b724be9f4d8d5593e9503073827f51b248e80c0a470e2ad00dea9e41645a0828d462628d7d3032997d8c7ba050202fc8646411eb9e8d5d30ec14bd8c39741d9d2665475aef4bf5e80e69f85186338aeeb1b2fd4d99ad5ed96ad4ec3c74d21021d70c2b4caed70c4029040e413a1e6362c2f78342ea036a62a7907acb96759fdee18533cb82e640045b202b3d82ecafab1fc5a833f8f9d18ead445a5bb6f03f72ee7b5d5fd6668ea93ea8f40fd9890713e7c88165d265c0f8898680203d019ad9e77449ecd8bf9a39b855acb25f8253230294844beb9aedd7c80d9988bf33d9a8f0ef036164b4a07446c92b2733b5e2b8e5b00ab2c2f715b0b2131c97fd5576071c80e91d8690d3ca689a9980ac9a296853dc03f7f11098d8cbc6f2dc00711b53b3a0ded9d65394103c80f072ffb7c56bccd997c2e72acbfec749e1d7c05b448c2783a948c0987533c639674274ec354f0703f6a5e77f47a40f2c30b3bde7f705a235aa5d48def2e57601f33dc02f743f9b00e343f22aa1f930b0fc27809fe651460c76fabc6f8efa1ad822d8e3d219b693c07412c0430b7e73407505571431eaaea6a08a11431dd5751dc17205a2fdb4aa2033b8c737c57d19a0a772b4fd58ab2034bcbbc750442bff7ed7ada85cfcbbd5766bc35698a73afa14101205c67396a11849abfebf899fe4606f95408d4e4a8c75a59f1e7241d301e6ec2ba2e91500ff74ca96cc17a9d29f6af421372ae9c58c329c966e0ae05d4834f0462825ed1502a85ee5f803f1a887a5f644f942a4c2987bf9217b41b6e0eee3901266a48e760e55e0a1cc3f5fd6fbe839a4d0e4b3316429b737ff1754d97ca0d13bdbbc74a0e4c3d725e340c25b0db3acd67c1e9ded8912b32f86175c110c15062aac96ff7fbea60f36914f73dc651cf698f5a0f5e695f3db746e767d090121766460628cfa88f64ca82131a50c8f3afbbcf58235de418a4c75431b88e8e599c2f687a210ed81af1e684cd57f1128d62b0650bec680816f2a2b60f1d842e4fedd0706e3ff0b4f7b8633e37751fb170240a9decec116a379bef8ff8335343095362252e4bf76e6a0f1d349db48b6461556f3121fa7ca83a08b812b91a1c5de9a004c7e68830043540f3fb31ee197ee9707f1d466e929f6d9d6950a34764fe3baa151e5ee1a27fe3fa97cbd9b21e777632bb59f6c085a85a0333a3afc7fa3e387abe06e9c4956c8eef2ed67f81d5151be954c4250e4483aa27ed01bb8b83c6463ddebce3f2a0351c8bbb486c1d6621209d1309ee7399c7740331263e90aef9d9720a6f8a70320288f1101a7f2699b60e1185b662b51584df4924aedca49fd05e6ff1880a12378c948c4c153b08a319bc52bee806eecc032bf7fb4e1fe27c7676ebd0049a2841429fdb316deff8420f45f7b2c828885a0beecc5acd84945c7a25dd3ffa3954cb776db871ec6c62ca2f4ff9b9d10400ccb7e49ffdf8c4009b917f6dc13203aea5a9ed1b017827fa3289a9eb85e0a669647d1ffa7bf3f53f23e33c2f5d86f7c922b8f2b10b93889ada35f6992a1c2ab6abff8a9e3761d95e883b5608c9dd36e549275d6a9111f5459f5661579fbb1a462e7f3a8980cf9e875b2b75ae15d813477416d5caa320170c831ec5781ce206a08727365b73e10bbe719807a4b5df490e08cd802eaaefae1e0145544e85874905a96228c3661bcfc2049ee7768ad148413adb17a391c7df2b40f78697a5142131c8a7ca26befa1b743591f0a229777c994b56793fdb96a6170bce7b41ad3e43a4343760fe2027557a37c34aac18e0fbb7866859d108734eafae14001c0c3e03a98a82b993c4fec89c4138cd05a2ba65edb91c82f5332694b1fc2147bc4b5dfa83910aaa4a7b2d33aab3539ea79416b3a5f9f2bfe8447eaa1d2aa22d558867414b548cac2bc4428c7b0526563b386af5fc4c9b11ab22a1d499635d1bb6c281301ae7f4c48dd2be0d1926dcd17333e26def279dd87dc04036dfd0a3bd7e51da8276b1f13b5b5adc430570942a6c1c7944d89702a171b5362a44f90e9df989261362222952242ee7aab198369091ff5e7c51b2b354e03046f781ba52fd36d28bd68f0ac374c611c14bf3e1779dd77e33d75a7351438d8cf4e88ed2b1be13456ca6067784188e5ba6c0289e9398ca5c3fd44c70b81957153fd7f376999de130ef8e1c9b822dfb0019053c020b668464dcdafc1454ed9fe40487be267fa9510c36aed9ac8199866830b8480f62c3ccb352ba833f53ced6160c7a207568b707b90c0e2e6ff32a06a4b951e17291d6c1242dbb45b542a79592d21419122982ec4be58777f102774b9a8cb11db278644d0f7f594eff56a222ec79fe2a60de0d9e23f1549cae081942381e1d5215322aac40fed50a49f52ba4602e183cc4bdd2682f46adf02074706da25e5db811e3916443a39329069463b4107e35d56a3e8527cca025bfc12b0407f84057e54feb7f5e39f389deb59d7c1b0c9ee718202aeda7d083c69a8a75f151c834f17a1b27329a73eebdc52041b07c45d4b8f9fe91dd02312bbfb394ebb7fda3a7ec2d1017f1f1dd6060a41d41ded807edf340d56aef0484a1acf8a098d922c11dedde86de189c722253e440bed338a34718f271e2a4c14aeb27f567e73303dee3705fef3d3df02f1ce11facbb4951c6c905362a5bd2584ed8285cfa62e9f825c19e16f1fba17ada9ef4e9e0f4f20b6ebd2ad924bf80b9d28877df73502d1f32c03550c9c96e2157b02051d4d5350e96afac2b804b5f3f16c1ea4b53ca97d1f6052f3a8bb9f59bb4fe07b5e92ec35008cd7004c55009318d59ea45e02de7e3bc552875e677a00037c7cb4d6092a75b005b00137f0e85a9cb32a57d1404419dd138624b41f8b0e7022ea936090390fa672b6508babaa70ee6736c80fcbb28a8f3dba24af0bb6bc09a644bc4f0f9d90c91957b49a11f2afe22780d32747b81ebd0821f778d8d856d81cd8c8c88ed36489adf308c23419e270d0582f2d14996a4a76ab012c6f7a54b80c2aa4842ef7cebda9752e053221cd70d46af7f50e77b36dd98e9c9bd33486677bb407a1fe63da59e1f80d11a3e8930716cc40185bdf6d05e8ef7227ec65f488593774815a5d4c62b7754fe69c973196945e0f3e4d1869261d0fd8fbe5c65bc679b84c365df880531b7b65b44e638a77f8fd5de99c80302809df1dcaf011ffa431ecbedac43e6b85068252c57722e2cb50567be5c340a7586cde1dd37e3bdee1958aff20e4dd93a8fb41989d452e4e385dce2533a6a10dcdb2d01ed97b152ce673c405a642ac0d5b4f7fed29ce6783c86ae378ba450d48687f44abd23f96fb6cc3caa3a02629e8d9b4c1909424dba3b160a5e717c57440e24cc884fcc5a512c3874a66e897ac66458ef2d575a2269ade14e01e50c2d5b7b6b458eb783de29ecd1ff163f1bd626e6c3df18d18111ad88166a2b1b5bcb1b27053903e7608874fc031f0762f5cb4590fe796de762068bca72cb83d191328d16b468484221b83c2c79cb47dafa91c2ae1b280109150bbbc9fd7641dc5b568d8e4371f08b10eec8557de69304f4bd12336f48908b3fa83cc04d31d0a10878c9f5e04bccdf156bf8bfb653fa2dfcfc17d1fb38a4d69ae075319617843f25fb9d36303aa6c4a1136a490284c214aceffa34129951d100c3ae0f3b4fd342a1a48a953baf04279a4cf5f8aa54f3411ab3072163a7c4f9cd4e9e66f7e2b0907439b668f8279e540918b1cee30c86777e3bb5b7892378f26510f2234508b621ddaea246166935ffa5ee55fbe4b10c8635198f96f1acd47dbbc277923b5a39672a2c744e0346a641bc1d24f6d152747a8e65307648494f5c77e14a3404f586fa5b47951ad2974ab8c3a155a44ec3021747197a3942ee13a316c4db48e4f3eea5ed9548a3e425d4ced68a42911719a6e73a2f21eb2a4ed61968652c7b0990c9b80be78aaa3a12c110682496cc2b499f8792385f3a6f27749c96974066d04010605cfa44feab5e290cc00a72aa7ecdd5d7bb58125362b6a73a031f26643a1653a46f2ba45c54138330c0f00e1ca67bbb5e1b55b93e9479d0a1b80b5032e13817a153906cfc7349559d3417ec3762d4c27e34784ac930145018dd143164ac2983f1fa842be71bbef5b426dc01b51fbe263614829b6225410987d7d49fbf2815ad4b3e240a1da00ef040453795b9f8d94d9d991f6b44776652a077c21e04e4aa1867ffd38e381f2ea022b4fc8a6e3520bcae92437ae02236b0c3940b138cb3f4ebaa24a97802d3b0e648545e3a6d6f5daac50cedc1df3bdfbc5151faed7fb20c3cab4818a5a2c51c97dfec6e7ddb152984eaf611db17b0bcc57d932811f400f413fe82374403b3a4d1018d22f9e3923f427b26a36c7a0377ff88e07fc37c49b4dd6a0f4d3ef6f5a6b3906a802471e16dc6219b47cb8bf571d846024ab6903f983d0321e4f418b57ef9f6d74e9e1316119d836abe0cc6bba5469d4a6b54476dae52f174d5c1127b814d4e53ba92eb703b0ff7eb6eac80763fb033fd9e68dd4a1fc143b67052057510c95b42a2db16355a9925c70b9730291cd86b6ab7965894bc8a41eedf9ae70182641a1e80ec40b6df3a4124da140ae84c6c7c43c224dfc411b6601e64f8fdca97767ff3b4e39e103d8a3a87f17ee53ae041742bab3d669fededd85ebf470f74518f7e243bba985773b8a1e469a06bfffb294aea36e49e95a0546be139fe0c9aa2b841d10a49bab851e0bfe4ad11d62570c8fd6ab529e64c9382ba0e611e15f17380022210842347b8dd6798c1c8102b6434277bb87f36db85d64a2396312a430dc3b05cd4495d19c88b44e698d162786d09447d6773598a967d91af604a3cb0d5871f7d9727fc235c79a00f719179570ea130150d282a0103f0bc49a841d941f11587039b45e37e54e102242f583870518ed75e86b1e5367bcaac93945829697e2a2298b41c50500ee2769614faf671b762ce25e1b86ea4565623689c204dea05d8e24b8a0179e5b5e98038af4d0875afe8f86b30639c74a155f94b1c2dd89a703304ae078be867103ff287fa3b8cd1646e076c3430b03a99b58424c170749d06cd0b8e3aebec2d5186e9462ca5a3e89484fee959173f04e7e1d39e5a2660d73453ac8184970e3b98eb9d03b07fd4027782b071fc72e4c7856a790eaab8fb023011fd4c6566c03a202c0749a2c1e79cd6ae289e612ac3ecf7ac37a5779b2cbaa3bd64781db02426e73d9d4cd04822f23c2d3ef303ab704806f8c4875af9bc3c8b182722c8d6a68cc891a85f44f3cab7984ff5b6ad2a0b4fd91806f3c8bd9504e275ed8bbd0899bda43a6e56b4fbcfa835a2f1142d19c16df1b169a06743db8833c1c75c41e932e9de6bed8a222b2918b82f3f70022742de2d389642f50f760c7fc15dc5e3c1930e9eae8095720a1f5ef45dccac05353603231aac33cab1ed237a6325bffb4709da8dd9597e532e885f78e1791db2f349f9a95f12721ecd0475a7178e6dc9821a6e396ee622ed6cc5cfe3ac554b881b91f74ca7d273e9f9c4203204344e18c128447fdbc0fd370287c3876c012b641dcf1329ea21f8a8bca25612b12509400c49790f44bbf265103ce19b07bcc10ef45297d97addcc80dc69b437f2a912edf4460f7580631ea808f176cb7f100ebd799f0948694dad723fba881e345328808a27829195e2a03baa15bb182f5f27b4b552573108f6c12f2492728b5a6c8f278528fa816ca89dcce1001199bb34d207d340015010a5949a5deb7363c6994a467572cb17fd60524f13e928134bdb1e6067ac8658760926a3aebe0e942398040a2f9b0382c750da74fc69cf3656f034721b8ddc724aaeffafc267b20fd8ff6455e64e1992db85e0ccab6771a2bd568ef9707fdaf4c774a74da1f2e646cce8edb218ea6b615caac48e3955fa20f77507810a68b25079d16879ff220d65a95d82049fe60852253cebf2eb7d30ac0eb8c9876a589b4bbcb8bfc5557f7e8a02a21495ff2496c4afe30d4632900d2aa6c4307601ba618dd1901c4b8a4631b52fbba9c3559be3e285ade73e48fc4d9f32cd9191874d4632a521a935d0960e44252d176925ea04a77b63c8e7629e93f39a7997c970f0f3127a5fa94290bb390a611896b293d47cd5f475d8518e69ea3bc0e39c7a5b32b7e81c7652582a4a2d381b94b1017a075df836e0863c9b6a2e2f9a8e01ac351286a42b643a7438f23cf999106035f97d242db693600cb885a58db1c3f36335d479bc6f67c768ecb3d7b918196377037acccfce8a0667754bc614b3896f32e2a07cfc4c6fe526016bf4ff1db0579713fd782097422243f3f22f5115b802b09e0d0fd41195d8a4948a384e89e5c6246e82d4ad9202622053979a07001389f031c8d3bdd2286b8b417bd876154b8a7c9002cf9223567c3513efe4de2bc3f9458ec60b19f15514ab2e0197fd8848db096ed3ab1fcd75958ebad67bd4808a78030f5ae1a1e3275df6884b8cf41221a1b649920ea10f4413ee6ac5606c8f067ef1b33d447e116c7be02272fe4800a8a363c2119d4f24c66a4a34614d2562811d018da15f98a4e01af1c90e5a7294c2fc96ae0494f9de5fd19ef4536871e063ecfa3dd5d685eec8e035d026d0f94aa5d4b74d9160ae4750553f72f1170c3459c47473011d51f44e5ab26649ffbf8e26ed84207bab1b4ed38b10eba2b86897a8a5ba23c71c2db71e27b09cc20a370f6064532c8cae7363032ef36d03c3c923f7224bb51ba83b09e429ef9434047ca3ec8dee4e52442a79dc1c01cfaa4d962b8f03a379e9fe3c6bfe57dd006379476141bcad00f559a76b260f49cd0ce3f75da7a10813e0f7779544e5459eb088b44d82d00a2a5998763811a3a5c9419f425d38077df2de48de09e50ed17f0820e6f1b925ad2a6580c700f0995935e263eb25aee3a3b62c94b762ce167931b1dd0ac06c8bbb9a406eee11994c287939b06b3523f2a9305f7a80bf14319c267c64a8596640f8fe47838b51d210193c305afef9c481f6ea4031e5cb0919bbfeaa213f32b03901c4f806afb7ba66f392ece44a94ba460082dc9a88279dfc0cc80861419b7e083cffd3b193a4257444bc4015d59c4ba54f9152c0bccaaae488a361995c98305b577ee1bf988b4ce126b91d5378504b5885c09dc6d385f7c6b5d818e8adab047084d15ebf4d2efc12fce27353ccff8f6f07b8c67f50bfb253628a71c321d7c67586e04a9a49b491d8c756935dd62c24f0352d827ce5ef8fe52c7996cadcbaa70e5f0a9dab0c4bf60f587e7da251100f9d9b10c2e36ed68df806f88aacd630b97a013c8b5ed93a0de880987e80f012eedb1191bdbb869aa919d8eb197b6627b08548fafd83b8bf4b205ade8740a45bc48661a66949bb5f209d0519e7d119e9b5ad3a30ca599af31bef345492b2359c8611266226e49deec3f20ab5effc56cb489f39b419bc52a5975b029634ab1246dc54abf1372d66bd891e70e08097f2be4b4a254afd1776064424c2ce48fba278b4816f880e7f79587d2b92058083898c3f000b69375b92cb7a189581a8ea9261b58eca9d31474fb6e0e290e06d918dd4c862c578e83b6682c482ccdbf24d0fc285795953ab5f5470fce1a10c100932828b019c28cff3e848bfbc2b48c59c9687a85107d4958c102873aaa1131ad62f67d358f32556fb414a7a8ef6a8e615af1bfcd7ce60563be90cbd1df0eea2f04d86c9687992b7d7acdc5198825c246e099b4e4fff21fd25d7cfd4abe5217d8d3cac7b929379840202ef37c5229f2630c30a094980284912a62bf61a3382bb3ec3d665d1efc7cc02a4b1a7d78e199e00ab3d80bbdde9801462f74360ae24e430fe92ef4d2180ee421766458cc78a25b10e8d8a519a8284a7b9e72637bfd13bf082eeb2291bee2d50190b4722684734ba2e8a0cc66f56436ca8ebf4ab7a6e38ca9161c68f02515c738ab4bc6e3215f9beb4fcd85f7b7a1326974656b3992bd046b8b2c648524c7115515a7b4c136d1a24f45847628e7561613bbf04d7916b10aa744836ee790e2234511f7224e6398f50fbc06c603c116a46e1d5c9eb2c0108c0467a76554fbf73bcaa08b3e23111a68a773a00f87d6ec0a3c3bf0186268383c85aefe9edf8ddec8c2d46f269b1f543ed08b1bfc2642d3a0cf7fc5b171b899443a391ce2212296f3f28c9a5c5f3a6eb21e807c90f7cba441c553bb7cea68a5957d7ee14480a74df7ff7eae6e521d2d8ac6adf973a624972c8059080eeb7a855068bbc7a2153125a0b8162762825c0a1ae00fef73301a7c74d7bdbc43f53f0ca6200c4d18d0711af07d3fc679896e80c065e996ca03d9d2eebfdf51393a6d3fff7848fb6b740027757e917bf7e79e8a76b04fe5c561d160f7b9ec3a7e537e5e7743d497b5444c48571e97fac704d309223db6292d26864d4506f0905141d93473fdf03fa9456519c18e4b54ec5a5f48336ee56273f914939a6680bf928fbe716a3aeb5427e960f0c285a97752c6f4eb7d5eb815cb0fa78f65fc7dbcf0fd83f0def54d35782d21013f799330fc414ade8e47a35cd2d8cb210d5a2152978837769014309b7dd188038bce39bc6a5e1481a2528529beaa22a4e065609a6f3a19d1d62e7226b233fcc29193722ce60a499c94430f8bf5404f214ae89f784cec16d83bbe24b2ebeb27d22101c837caff997a257e26039c7486bafb44e09a24328d62af4729b7ba0f45f5b19e8fb4120c7428c41d03ca96c3c36fee60aa57d36406df8131b738e469af18a19a3bb521ea9f6c5719ef484ac81fe0125e3f37103ddd710143eb90fe8bd34957de031a83b1b1c67d4f98d1c320831dd25aa40143c050ac8dd6590e4844f08afad7625bf263967f58e9a5d0313a9ed9ab7f7f41474c5033129d004c8fa7a68271a83af9a06dc5470b27223587e9502f52fcf965f80a0609a41bfe875bf20bf1fc29d000a7c21211447dbb3dd7e7835b5f6a770253c4c7a6944f7473db7fee1621323b236862fc060c825ef6ced085f897ec74a229000339573226aa4ee86d27efc86487d00fd2fe45770af8ffc80c296409c921849bc4eb250203ad62b5eb8182049ca93a47186f7c235073b4a56fc6fad12ba0f121cd505d5216042d0a8c58234d2223f6a5d6a57ab735327f25675f4d57fe6f81c97d19bcf2bd9d37ac366aa02306df345a41b730071ce85d13b4da4c284bf0c5b7197fef9c667ffbb2d4035d47cb079f7d19a3c09301983122341fcb598bbc074b37c7e4b552922df06f62bfc79932c9d748e8540a4ebd06ade346ab024ce88026a8164d0437d5e3a76827f58b693bafa1b0da8f964050140fe98bea5458b4ad86c4be162beff3c53eecc3a1c55b9e5685ae1959e2d37b2139780acb06029fd2e12ea799946961614a072d3b7b967cc64c1be7a7f4dc1ebb537b1cba64b21c603855ff083b02e0c2d2e3c9933834b48afe061cdfa09f5b6239dd12c23c9391a22bf0a5c3559f68923627f2b4b4736531f938d60bcb7f79ff6d56ecb99f408970a50b8cb711584182366c97a04e2f04bffea3940391c38756576eca03d59c75c6e39ee2ea265ddfa5ef9f6c603ed6a8da54e0651de9aab5d6460ca269850e894dc4af9e1f41f84768b3d407f5343d0795c11dc9884261f1e33ead6b4238ce2d7c672cdbf0de94474f11dd6c048ea25a9b72e07fc29c0d10458c97d02aa2cebd149898709047fc3c438bb20f88c8189b9686f26d518bea1a8234ca35049d80a1cd8111042417e12f996f5af8686f8b677ea470a7b0fd6729ad89508b6450fd77524e9bd04d544ceb8c8a44d0e2b0e428ec1c4a7c2a3a1f3d0dc12c6fef8ecc4c955a250d03a88079d05f093bf8800adf6a81391e81639a671ce88c4ea64b04105e3c68d828cee628fa8dac7ef2bd166ab69e6f53dc1d73be60de24223cf1d2840dcd07c0427600406f0e8f448796a53f09898a78db7d9cae473b7d7fd44c4229b295ef20f5a44a71030f0a558575333b53f0ee9309f789f70f51c358c1be659ed87c52a346dcf68fad2bae4e56c752aeb74d304091bd66b7545a179bb0e6e5e2eb28014bc44232ea77ab57e8a649d04a3b84c0c90a289f2b9589db0647320edd60eab0052909e84383e826efd150018ecc04c58041b8914e70468592e523784d98e84901cf950fc8cf2e62ac05b6fd05076d44d94d7733ce31af5913626422c94556f9dfe1d4784babd3c621229e9c0ce24e129a3047d724e897951fce6d185ba2e08a5d95739b69ae2fd38fc8fc49da07b7e3776bbf2fb1be5f569e7537586210ba0ec08205a213549d4cb6f7e6763a971d08e37f212e08b9bc6f8d000f44989dd5bc17a1bfbf37837e4d27b9df379ae494459d48cfc700cfdc6be2361c20e56b4f61d3bc134a2634143bbd085a72ee010d123eed6ed3bc0671bc2756e17be4c27f90e92454827c23421adfc4652042361c00edc4661cb69fdd7fa775e48aa00605b2f07a0b2d5508c9353316467d1b933b0da4d7a953bf2e7e266107f3a8f2087433b235b632f4730579e1e4267484c94d6f11b405317f9f2326c0218715a262a85d71913f7a90da5593cc8fa59e10d64e983b47d70c1b161f760473d72112f4827640415ca8a7e4a2126bc3d4c5b8960308f96a5be5fef34358b6a510530dea6ade82ba94115b18ae685f842abd0e79e3824496bc33ee68e1563ef510172de0d1bec7229bef4c05b46b895dd5e13ae4a7d9d52e244c7058f93b4d53602fba19e4cce311e104d8d39fef559923fb7b66196c57fe88ab241812270f7c867cc0b2c450e11bf5413e55a10b1f1eb244db68013ae3b4486bc238cb2572d4da6b0f6522550d3e9c43519c54a49edbb32bab7acb0abf90c4c4dbde36584be96b2555f16c4fba3c77c06b61ba74d9eda2d25f4c43c777f5fd6883951726c7ce5733078325709c2a98f430008cba3e1bd63eeb9a7f4297c9ea50e97a9220113563a511e347ebf666c2ec172cc2bb33b2abbf6033eefa566e1c992c7b22516e9fa1b710926cd6ba39d06285aac70b31e5360703b2fdcdf54487719f8064fb35a1ee711a6a76f7b17b7a3d1f6ed2c37dc29063770f4d3298277445045faadaa9ac7befa78c67303d3e109a30e139d5063ed3640a449a087b0f4c7b46cfab85d6b7e20ba1f2f9e4327f514a134423710bf5b56d7ec2174159b3a979ad710cbc3690172d4e5963fcb182907c33f350e17c960bbfd943a285f392a11943c3afd30c6b98d5a681d93055d83e5826ab17d3f0bff08feb979072e4e53020bdc0947fb0598a9fc53da5817953392491c2fff2dc802eb38b8adb09352864371efce6ca330281a4ee3dda9c3a6a7ebd33c85302669542cd5da7db6d76ef6770540b1484865c0bc421483bb5b234216cdb9d19f8fa608798000b0eb50b696370bb133e119196ee71be897508b0e30b00a60864f3b9e2aa7276c46007e02bc97cf9d1776e0c92cb75857103a18f1fc7434a77be2700c22ecc5245909c2328d4d113194b3963838dcd4a045ada6a00db80e4388d135699d313a8bbb1d5dc5e11987386a09233259c42681c65ce05f73f0fa37b09b7897a4ba17f558fcc4ac0a9ccabffa897551ee94455ce8b63d0fa4840f478c832cd7664756dbd6082076f62e7463d31ef598b052df5223990b5ecc14c742a741a54a166328c8e24cbc2c09bb38bc85a615a993be80a98c768565455afe512fc983a63163a081f760b3481d8a99b30718fb7fef4d93cef105990740389383098a64bd6599ac81e728077d319062d613c6a18615ede88ef048a9a99de381cbcf93bd7d3c42ed2f9102240241975ce0da19a3a7f62ac79bb692aeca70ab99c2038e394e3c120fcb96a0d2f630bb51fcb37690cc518fd976791f49dc1b1f3120d22296fbc2fd0e1b17c0395a48c6a063f5cd9757ad1915e28ef24c40f41767b6a9eb574fe698a5d4115877fe8d2993d12bbefbf84727a125d87aca6cf0fe0290daf0963943c1f8308fd849190b0ba84aceb53336e29d9a1ee74a078e6c5c8b782b71a8b905891748e650d43df410900b1921645186fb4780255db16ca463fef686d88f3d3bf9b700bf20ee1189ebf0ca8342a8702138003c283c021bec728d1e1ff114b8c2e3908693d7828101bbf277452cb7770a70b0ba8dc482d27528722307a6297dcae60f971eb974e4b06c99d04e349ac31c2898fa8b0ecdaa0b4fc437507489ab58b8bfb40ca50e01117539b5000ecd12b65feab3d0ff9ffcb40381075052aa4df6cd2c766413b886c965dc3d19d9de459a3c2c2c43a49f719af5d51f3029f7f8ee05f52cc05af9b6e7a668921fbc564fac8bb36f7cedf21060edf8d4f3863e30bf86e2c79d2005ca55b526c04639932b0bd0623bc711aec4f5132c0aeb7ea7da4323781c1ed62cbfa13d7361e5afb452001545cdcbb4a2c30005d8927d62dfd393b982f6cb822be3a3ef15a260223d9d3d6b81fe40e1f3e6ffd27ab9b65fd157644141e92180846aa90481dcd65a9e4c41d460c1fe7ca1506561f1fb0581e82a388d3f57d6c50d117e622e8c7841b437fd5b2993027609a2a62b05f720f159dafdc8dc5e08589d71d310011f2c4dbb8efef0ad9e7585dffe708c59798308ca8028ed245fd680594fc5bd3762b528179260889e67e028c0387f65fd61cbf707b7fd0dbc733657c25146bff6e1c065ee7698eb03ba9a7082c51841dedddbba9a413a7744acb6bd39a2736ef13ef6a8522c0c7a28aed312a96d7f78c771d9eb0c7c2379145974489ae98dad90dad48f8ca71e4f974457b72b43e1bfb1269fc8ec00c65dbd81ca342e1481b57da64781f8d84fb958dc5bec4f145eea417996c09f6d2a557d55f5647ec056fa9485a0948fef715f060da268bb45936a0fecdb01c7e12bcbd67fa6516471977fa107b7baf04aa6a75d072647bc94e22f7d2856acd9e5d3140d49d4ef61b939b43d9e943b64a41976ac8e478cb52e683cab12df64176bcf5b585e5ec27b7624b3f6ab351bb65a3140383a63eeb3bbe820f9835d83dcdbc2cc5f9774b3267d611a234dd7e3171d539ef859b58a138313c5b8024451ef7fed40a98f1b4f3a8be72836312f9d81307f03cd2611a2025a0845029d838f7be2f405ea11c8636c63f9466c13e92ee810df5f1ee73f5133be9b7ec1f34fecd3d21a77d0bfcd3d8fd3fbea247fce9fc0bcc7fab4f4869df72ff3476ffc7afe8117faaff02f3dff813923fc57ff02c7dfdff01cd6703a4770cd80d48014d0f52a0a0d2d50d3444725a048d9dd97d0a22a84e5e1d625b5e8e0c03cde3ac008a2f9807cc866f0d44ee78ad451dacfdd245cc2f0f58ca47a5a3a2f3e512dfa90ea8b4ae1991434bec24c056a7597e08700cad653e1b5f7f7a2b5b51e0205c8147dbef3cd87f278685ebaf722c6f13c850732ece313342f164027bba318ceb3e335f70208bdefeccc5cd220482f39162e073ed1390a325a6b06a1e4fa83a7127dbd0d6862ef46f403ad3389a76890fcec15d02a25c7caf65e30b89eb20a9d7ce17e6bc507a9469cbfe83e230ec52370f3030cb7ece026deacb2a6079e0fee93e9c8aec0f08402b911af29212505aeaf1818115c81e14da5f62a5ce8fde3876a3653aaad07183fa135071646a018a593a6830a6f03c471d800da9530c6d391993a60a210ef5f73fa78c709aa1a9098b6fed0c6182d2fbda8d5960d39c015be944bcda09a28076cf2c3fb005a5b87918b94df20656763e914a0bf24204df792384d2f087a4158933287d544ae02d104354854ee51abd0a97a04a75033e9cc74279f056498ff88b6c6ebe0eda1d9d73c38a587ed03b62d2b87db772fe194a2601f353d422803da15508c7a3f0399678edece872d15a76004038587a41b4b0a770446e7de513d9cf271843475189a649ed6038a376cae103466631346028534a15c35fd8ca15cb06555debe9913e02879cea10bad14818b6979ff22d12b44b474db11312d8e36e205834cc3c6ed9ff0b7d1d721a3917f8468859fcdead20624913c1d6eb0ef1e8d4316a30c0124136124601f30e624f4d212d64f6e104c5e90e60bd5ba3021febb3ad657d5ebfe3b0300d18d2cbd2be0153953d4d4eec3f574ecbbb414a034b3289cd9de90231799bad29da409008b1d0265d3b06ee53023e4e03b83d343b5a72aea1a55d78014114a27d24de2af70454dbe2398991b5404c44c830f077d17c2415bc3f30f4abcc0165f220d04471d84e4369c10e9f0766f8be7a26ca0ac5d289e4237a6885f331f7b221ae561cfbd59730fd7105398c79e97ccebf0ca6732f57f07c05b1bff1921c8e7aa93c465e76f8ee8a8fbfafe0d6375ea2f26485f033fcb2989b7979d1db0a9efeb4c25c8cbf94ce6bad5047fc708ba14f1f75559ba15a684e08e5e9d6802f7bcf0ab5b33bd94b493437743eebf96772340c4bac8711dd5c5facb317a6666cf38eaf41f3df75aebf356a43d37eca76d2d7d71a8aaa75fe4ce8b9a44527c9c9660c1075280b7edf4e4129b13ee13baecc3a14edef91e9a41b8b154d02a1c10b706a51e7fdb24936c0b88f84bacf2e612deb5d7b37517682687df0015441b9ca4996d78933f650552722782a113b3ded85a50e10f1eba1541fef016a1096cd46af87e33d2d19cdd5316c382244bd520f336dca15cde44fae1e4e12e118c3dc8ad1e8539dc0fee53f329d73d85d062a86ab5b536363904bc8343a9b77efc23a12b1f3c65b29051c6c0869cbb5df3596bc24db3563b24e80b743de97aa09981849650d42837584358685768c779011f328df82225e497e23c88339b8cb78d62c2b6b0a793a225051b2246dc19727486a963578cd84c4d8c8871f8853c1049e7831ac637ea732fea0c55d1973de0f774ee154f0d38f5da47fadbc8bea08b090178e3541480de4919fd6a04a96dd1ec0ef57ea833372268628589dc060900ec0879fb1ab71eddd14c13d782f8433159dfffd47ae038b7b2a324bbd5a2f316271d2e61fab0ed3a0ddfe8d6b6c9494d5b03bf2df885ff761592209e555ac65735a3d6c3f98691087a458b08a1fd49edad606b9d29a4b1fc8f4786da975e4b651c05cb6becebdfb0ab28878c84a857418d417373b225e455d307cf5d2e2019f1cef94fe2a36c592a5425ae12ce9b058036c7fa200360428aeb9876bad2bf84f1e6b8d541d3b54638594aa1bd76edd061ca8662fdcb6f7d53da7afa30eccb2e8d0062114b939a982e5507b1cbe016fd5331ded6db8f055c70942611c64dc2cb1769d706687cad8f85d4aef2ccdce01a789ca7b591991473a8fa7ee6e118ca6e1fabd845a8d4680c80dabae347963a425e6e00359f6c4a4c6ec32304248929a2e7686f80439292da8c045c6478f7c283a27f6927cdbeeee192f7e574a22b339b1545472e9a559eb36212424fc012d89f4e1ea2138ff53133f56c892c11ad996e473d266e7e520bc20cdd06566a423572da17ba082434a8069d70d509ce4d8be7a44a0d83f99122b39f0c83540ab1369cb0228434a20c12696d4d7f3b75893f1b28573dc284f8e23a1f75feb10eedfa35542334849f99e01aeaa2df97c2ba99a0f72b661a70a1569decc9ed6daee61683754fb44d641586a63f5dabdba5efd64b04aa4ffd8c2352fa46ceb3014969130ea7112a4651f788dd0abe6c77cc555e3c8da148fcb0fa43eb321c774a2b9da03d56d3155ffdc1c09d880e1776cb01f25bd8f02225b9abd0b861fcb7ca2df6eb57573b9cfef8d6e8aa334bd457268492de2ac695178df0a63496d3fc4a3e65edd95d26459745c1102198e6149f4de88d0bb47fd66a2675bf8feeed115ae5051e712c5dac4a9d6a7b78703f77bd3ca92f1ba0d46bcbc88d66a154e3199450d8cefa8be5f9112034695901cf12b941fe27889826f9bc2d44d61e61cd5480b147d7fbd448840cbbae97ea53188208235369e8ebf094d58146423b8cf7b90436f0baa42a0b3502949d5bfa2bdc12641172d6ca2d6db8f3588ab9fb408b4e65a37141c1d86c27fbf5e5e6fdc1e683b15ff7e7b793d5274d186473324e16615683c41deb4e1590202b69a0a3c3297427cf8a836728d3592d09e0e14a3a587dd8626c6c93ce383cdc86aae99f31af49e02f4c44094120ab86de6c690b830151445373e701112c50842b1e16c9e784583bbff8b2c3e32537686a91b88b5dfd0420dcbf904f5b3005613dfe6a71e3b1b2bed13f47d156de47755e56cb39d3a28fd720772eb6887a75e37b930c42ab00801536f66920dd4246599d9db9121e05557f13e8b4662ebfc9eddf7b93fc0d1412bb164e1e1a82b00023743e890d8108248f1268af82f0b31c3a3359cf8ecdeb141a1ce5e8044865cf27719ddea796389537e737332a84ea42699fd1dbb0b327fca8ebea810008a27b3a249cad51e52abca3b93982f33a4b38f2af3fb9045440a9e1937f037ac596bd7e8cad8409d69e89a03907d64200ac5b66cbefd08a8f4aa48bec160db815c0d01ed76cd02955dd95b44b962f91225904149f32365f0bcf56d11f2323a66726b75ce08142e52735d10acdb383009e0d149119bcfe197d0e370974389968745ea644bad04a0b89baca342d570361ff714964ab493e0fe9abf90e20290644eaa498aa34cfeb5972a684f701dbce40b40948f850f1c5cb2b010193c9a786c92c1711ed33d255839231e818cb24050a7619e0f7f44abe59c78e0493deaa8e65ca9117d9c54041fbc6740d337b5a77af4e5a3250e05e58b870a73897448dd0fd2e409053ec306236c3a751cd1f1c86604e59808bc0dbf8748d7dfa326d137829dd0d5eea3f89be4d7a3e6f0e391f514fe7edaa0bbdfe3d3d91f75ee5cf46ec474fe56822067e5b9e404380a9b1ce193e512c7d4de1873a5f230530bb36522e79a18db229c1cb3e25a2a4574ffb258a3b8dd73cb992f24e3e5341824bfb608f9a4bf572b62e1130419b9c0c47865380ef60b8e9fc63f2868500cfe24208ce66b4225d2d5483ba378fac90001f415aa43d02c08d7d9b9fdb2d77986f3e1bd18ec8d8ae3c77059e66daae188206e91366490e07d262dba4d37c14b20cd4bd3c0a3280bdf8842378dcd7b844787cb4d43a2f70a7bbab5fc8cbccc546cc3eaf96e5964551625539b4677470100768f5bda46e0e712b11ae5a79affec080ebed579059c75627b43dfcb7c97bd78b91c4c0d7006af4988ba4faf1cd11363b39378b1b9c5cb931939533832ac51677860f18c531afaca64dccd1a9c7fe0f87a390c7b79e42af55737cbfc787730f8a101c8c43802749c7fb64830274d170b450331f050ec75e8a64067e82d8bcc388d5c5c955c52ec94bb8661349791e21d3ecb4c9628cd95ede8e7dc2ff9b6604d0850f747c67a23287bedd090e724b6d493038d4d1f924945a1009c947315a9981f2795457b7a3bd57a1db79ef5fb553a405be69c8eb868af1f8a1dd04b75a6ca690b5ee4638cb2d3abde1da96957c2c6b632ac879b684e135e0ca7fc6b782b859ac77fa68802cd2da65033c9041f03d4ce54df54a5632dac65a67017e3cd411adbc1fa5b3e5e494060485e427bfca1157338a10b358f18d13cabc75843ff19bab40ef37a964f268f38f7f37e0bb4c3b40d35e70629e0d6691a5782ba941e4501ba41f90d873305354ccfae8073a20998459a05c2599993a563f2761440c26abdbac74aea11b1d8be87de9008d847b9ac351fa890f89aecf0e87fcaa9f09e0a35c38c1c4f5982e620ddae5a7d49109f934691f6f33b4758b2d4e28ede6ad3a56603c5b5be0197ab5566a31d5c3646362405410ba9bc00f580a353ca1de5cd8e1922c043acd79494290ac873a18090265c9564bd891a2a26162208fb5afb8fc26b9f54087e1f493caf6cfd74b64193cdd5a37e7cf5bf39551685525ba137babe171bd34cd6eea591921093f8ccef0b9ae3439ad1365fb9c92b2cd7c660334d97af9885431d8ef88a41be2ec78c092601213b4e19f8dabe19f17f3dfd1fc979afe79ccfb96571aea4ef35d6119532d6daf273287789978658a0aba7d0550419737febf6bc2e76d416bc238bb348e36ad80d11602749bdb74caf22f3fc5a26d3c0a2b7f4eeb07e08abfe6bb3421487fecbb8e845fecacbf26361d5a348501c68a279e9283d281fde596e6af3f553cd3ac02087bfbddb4294fab3a0880e38f7127382e9eb0ffe7d24bd15d862f57264436b8c8430dfd5b3bcf86e65dd0bf91f09a19e9dc0a511d99ee2ec3952a307206ee00f212a300e257a60872242600f4c24b00e2162201f2256200e497ca00e238606e23829cebee3992200da3ee1189942b8c107d9a934bb2bfdb783843dea639f354612bc46fb2b55893362a4942a92323e513e7f7469f2c655237b38422739932cd11dc36c04319da21031e61958b45d4ac135414c90d598c698071dc83dfe00b962e32d876fd6616911caa3328bf4bf89edb4e29495ff6a3e51cfff32f37f5d9989834d2248a8425ab0bef21152d1bf9e51bcffe00deaef44d6a64a9b8369493b77942e00f2e7389e461eb4cc2bc0dd360539781060509ce49d8999dcbe958ca4ed7b60fd338d1daf3ce8f71128501c61c52960368c346b1a5779d1a3875a5189787cd40adc38c9c85c81a18a52ff53c62fe20d4943fe67b4dc725aa1788c97f3ebc0680af79614f5eaf43f488cf3f0315b5f2541a4a4106ee94ce70d9e6bb2700923552e6ae99aa3f460da2393cf9b0ec351d6d8c30e4c073469b3f5be2ebad2f87100758d58c4453eb729e3d1ca4a2a08dc15258db78754e299e32151374457cda9c409b0934e275db0c7ef3a32a9d2a4068f3c24a77b13e2b541bcc103a0e8d3d0905695f9315759c9889780b6a07a3c5268a5c23c9a2833ed27e23b5fbd1c0937e64277cc0cad346f0dc15a0a56da1e223130a212e54f73d9bef755997868f8f7275d9a8cda5c080a0b3a69e82794b2a8ca515a774823e967328c25a543a2b269dfc78c75deebc41a699fdc6b69b7547ac0e622d4310e9313a3957b4000167d95d460b5d29517853cd1cc733dfbb2e41110f4010f63d501f90739b7da562a26e4b34fe6a864e59f78aee18b40603dd5237a332c82f899133a5286e809389cec5f75c7d16b872a30d21f0ec923e9cd633838d1484be5ccf1a72db62e763e7c02402dc01ddb416a7100dae791ee5da1ae47b6ca5ef807b04a2284ad4f1cd4388e2d7bb4a64db2af312608ed2a52fe197beab029e6e44e1a14fe8a2e50e479660945259794623110d15403c8fd154fda72912da1901c266478b31fee04bdfc67d13ce401a70b01cda4c4adc0480ea1acd9149415a0797baa645e54d85da95e1e031c4c45ed2c8e1ad157219b90c5c07284245702482a16e4f4de784e4402b51d4425705c4d3eec34c44425d90c835f3114a81a06c66401f10d486aa2444c162059d990fa8382f25205d4bf29253d19677c21b142f01479a16ab4f131e93ea4df6e9b9aec083f0479336300b2d43068c75a4044db4b45e3a7426754351f1dd99e962b369dc837b3b9b315042b5a3446b089e0cad326c178500bce7c12ac39864f3155579c1643dbb4e2b8306176d1b5a54769cd291440d7524ce18b12c21dde597e3dfc8eb5118481661e4bf3df821ebe5e3b31952172cf305610448fd847c76ddd333c5d628954587c67d31390b0c5919c6db555951fae2b06224beacb6dc6904fc0f5ad6aeebecd136da0ae0683bd93c3b3aaa40af540a98137e1e01a7af2406ffadbfe76a5810ea43b66abde0f6bb3d0b5cfdbb61cca3245caae2b5f0159d992aaf73b3df71885a8bc48a9ce2c3dd0c0a51edcd30e1ec0dfe9b12cbd15e4e4a3985d60be85a5c8df14e33d37b969ca6ec355c70314a5c2e131396131965ba01f912c45cda112d1c1b13027293d76e9341e0d4c3c834a25d1c6ac9a267f17faf483e6f5c0fe5c3afecfbdbf7e6611cda1687257f3009c901aec1dab43fd40364af7a0b6090c3317cbcfc05b848b4677189a9035c1d6890d698e82911c80e3324833e980358632c24b9c57cc065c8e01d210431915429805402ccfbac550e60a83ca9d2b5e80d03be9207dadbe68dca582ea1f889bff455b5f54c7b5f438c42690fd06adfbd3fa0594f40bce21e951947ad022cb2cd078cd85324bfe327f40961746633b208121bc9cca2ab7ae8706f114bc514eccbbb900cae3e17f26b772368c214823d1bec4463be08db40a30f694e5d496bd142051b891e48e083e4250d809c7c6d00aaee1a05302a409a0b0f32c06ed8f1034eb42d5cec448099b1dd3bcfa7925b904541577e1f2329b658d68f4366e32ce9a381fa53e2bbf9c3f41563376b30cc2a174c1a71d5846447c0b6be1e4bb5cdc1b22c5912ce9b589957e01f031356f623478c7eea9279bbb4d073c51d816dc26de57290e27a0c125e65ba952ac514164664025caa6602416263c23a4112c4bc659e6efc6f3a3af10baf3eb19737228433ccd50f3309b418995999e264fa003e57899e59df81f1516b04e48cdbbf2c880de7b8453688f02d13b86002b3641251c6517b86912fe5afe4964e87d2661bbb4442e69750ace6b78847f0b4b5a577e060963c3609fecd088406d2087f6036b309de2c1c1a6e92c560f089ebea56c552edbfaceebcf148e427cecba6b3d8273cd6dc3b20f2551e47e9656af15b548cc63e27be85df2412647bd2995b62636613a1364e371758d80ba4a12e17f5045748ad4e94db8384f9d7fcd5e23f31084e62d1c006572f423455aca924841c3229146f544f3c0dbb63a9569a808e9c319acb0706e38e1ae20cf23ed2228f0acd5809ae6a6340a08b0d58f84bb34276e2c218a233edb791240f1f5b387250a7d1b6c9288eb588f178624aa08f80ffe6aac2e178a5cc88bedb5ba1cac1296b791b6e0bb68e04bc27a21a26124060a183a507c9c76d36816f1e1c10901b80b08c14051a714f35bac0506e8b31fb7f29c00313f01e4c561cd9ff7ca3972cf11a9c9e87ca344e9b776920734ff9087f888f7dabcc48d812dda3832c31c73cf0dda006842896444508cec8ffa302840191fddabfcd28a8ef37984d43b09f64ece1e9f142a220de401dad554752f07901b9046bf04c888e46ebec987d13a288389a1c066af348acf03aa33d730f1d85df1e2cc157535cca46393c70fa59214488a66a222cf21afd700dc6e10d56568bc4f15be63b481d3c444cdb41c24d99702ae4701241a68da5170b41070a6307c024dba87b73e5f442dd366d3c199e2e38d0de356976afcb88123e8558ccdd76cab15c8b07b75ecca1685f3d4b3fed27d9f4203914c02d04aabb6bd666b2b663a978d7b43c3b853696a5ebcf92720521372baff33d0624131f04eae10aac3a5c6b28767e79388d947f3379e582de7f9d6659baa1aae578a3f047cd0b9d54f0b184d3cb44b622e697d2d85aa9791d698fb16b34dbf236ddea44fc9ea5b21e133af42f8b6a782a4193b62063c7408816cb2d2f9c5b739003125d9ae719127f69285270e2616d129196ae38203b7c1f8be4ad2e04c1ce515a74771da03643bc2309cc714eaa7ff47c761e337812cbb253450780f2092b92d90fa9d35267cc31d6da9f0ded08135d052229d422d0d02837075b85417136799181bcaaf1e1644c023318d78d4212a227756ae64d8a24d4f244aa48e6084a4ab9796aa0884ad78d206cd850c4953ccec543d0be6d1318fd8a773a6c12ce627c27f4896ac6ea3445162181e45f0c8638928d275b4aed664f7aeaa2941f0de4d64140ddac132ca7d56da30b2f5858e6d3d38d17bd482ca5ee1b5a75e1a66a9108d5024d155af19b5f06f9108812ef6f58bc8aae75c74b3e49f372543231426e1095ae35cb3bf6708813a80390b6b9acca67b7daf1c5a84e6638ace927a1ad57c443849059950900004f670cc45ccd41376e92d40f34d56715afa72250f2afba15b2347fd47823bcd732f7203dedd17363cd33fd8991e726f1bbc781f1a140330ce405084661870025033a6dea791e7d03550c6d4293380a04d3acd41e2e86bdd88438f010e23e8aad67913e1fd9768552359ba4d75e636415da48bf3283156e0118b3e183907040f243d49fc455d7cac5f509288746b4980481a40ec3524892fcff3ad4d806818931fa3da16f8a0d9f00b070edd2f99f174deb6f453b181ebb52587bd1150a5bf7f5fd65c5bc2203f6cde06b0721bfdeff3d66ba08a2249700e70b2a81e27000d88d7f16487808d6d270dfde310807a1ed90d933038038e86a67c1720960a4c86f6aa4efc40f0f19928c69ba63555e343d71e905868a82cea00853252f1c5ef0b160f6962e62c92b20554c7131a3a43719484b7bfaed07c97bcaef9b86ae6b3f71e609d6a1fbfd6c526a14437812d6e772efe20847bf5722dc5d9a40799505659202f05240aced66930cfdf6e566f4c50cb050a7f2241decd22941a091a2010ec8b3db37c8d32bf8430f884cc7f169e225a3515a1ffced7306a933a30f1bb22a63cd758ebbb523e9e2bfc690df0781d0cc395f0d9325e8c02003acd7b4e14680d48d77f6fe00f4b65dfa1e9c2ae2e49609bd681ee3fa20980a46d7c009935653869dd9e6ba6635f38bdc31731ed34675cb2c41db12007f1fab33ee26991a169900133fa1027c872ed2a984ce25a691d6340cd277c569a2ceed53e28a8220949435f4d5b81522319e0234c885f82972433aebf089aa12f32b073319816c38022e8444dd7ee3619f6ebff134b10fc63b8ae6e2d8a9304ad9efa2ebc5f467db2419a731aa150f30f6442f15a14fc95ad4b2ff84c19cf358a0b5d0c9d244a641cffb485a00551280e27d35567d339691b94c451cbbb68a40a2ce6242a2f780c84876f46d2fc11a00b17422eae0e6a6316f558dc0e5cc01746b17bc96952701dc5009246626cefde182a1a54a5187dbddd4d79999fb0f291c10ef934bc50dcd3b93760b21e6d3ae0fbb51602aa567e76bc847cbf82b6d79aeb09ee38b1abefe3b7cc0cecce8e1dd8d7e9ab6fbc9bb65ed688c30bddf80b4c804c1d74937c62a0decfc87f08fddef3874a7768130185c5a3b1e360deb30eb272848da03f35a34fc30ed08f5fb4007400003d326ad30f643bea1b08a616076aab8e9f208803c4abbc713ec50b0a5e97f67553b9d0e759e046b6f12075e34e93ca4dc70feb6a2e029178a66d22863e49dea53af33a505e46c9753ef9c496d322c980323ef20a0136a10f51b9b02abce2d3af5280be7dd0dfe2337435fec5f3d2a1ef583211d286f5ff02a58fed9a36468fc69413112ca61d03bc2d3bd4fe2da1e2f4b8cacd277d6c678a848a87081abf86c1813beafef5d284f2daed8ff22406cc76eba73b4b0a25fc741dad9892f3c05344e8538bd7abf7f1dcfc8e17f7d1f55c64702d40982e132b256e0b2f22807251f1bd506bf4f462c78702cb349c5ed9e8b6b023cac9241eae851571a3f0bcb0357a7a815ef421ef5f43de874fae40605b54a6530c259509212d4cacce248cf8a0d175b589cf5da87b6cedc72b3efe19d39b9190b8b017c6008de1b4f1b07c4754ec5e24db4939e36ea4d7ed793c948dc931c5dbfbc0f36dd1201ac039d59ced8bb140e881609f94ac2fe9f25f24eea7eaf482322a1290ff54e2b799a5b213c9f3fece9425fd04d468d03f74635b448c18bcea6d90bb0ce3e2eecc42696b3bb691e09e29d9fedf1861bcdf1b31913d21de27a66a9c060c8c3c5a19abac084b53001edd6213fe12e0d0e38c38ae5f8332bb0ad065e12af43ca9d0a581fbc951a106ec43035568244306b47f989ad6dde94fbd30ea55524ad13d40b42197ef8a4909d20bb0803075af5d1069f5c62e6149112293f9561c593179301975ad21329a322282434dfce60f993c411c96961a207cfed60b6a133fd8058899f845953f7128142fa7edb0a51a079237ec09a2fb182f9b03eb272d0ecb6a0568c707383bee5fc44740fcc487fd29527f1f42307f74bdf1139ba6489ee2a76c0162e6e703d7866c239a32acd9ac2e24e06e6ad97430a33c1b295b4668f9798c3b2c187c65503c56fb1884e5b6eb7c9e886b05f12c8e83ba9b34bc538f398085817e93dbbecd89642883bc438f0ee0640a207bdf2b227fb625fc4e479b9b05114b1966d20cd0f50a26400d72a07a85b7f3128b01abde44b235edd47d5cca1fdc80bd769332cb1e23c6e75537ab9695a369c8b1181e6c3c4a90cc182b57b47399b80aa70c6b8e2954a69f36454aea43f8da8c52a6055943830bfd0f8fff31fafe3ca7059bb292bbea470affbf9e92b1bc631842f91dd7a9ea555d457c6a025dcc312e3a403174480b016190848680d6fac44ceab201a71d184587541349c8d67118ab1c6444d8a9cc8db61f02610eacc34763e81eac09e85a2e27c3a855250f1188b1203fd19a2f8327a7c0b2b366fcc84580b3f81316d4ce74dcb4f674373c8ac5a68d2b91332836d1522f5f349b17494601252831033c51e458ea6c097505cba3531de1d3a4ccce2913ce2e2a1c1193208202ed2e8c923970ffa480a96ea6073eaca753a866434cf183bf65fb87e7abae3b29fa08c5a46bc3eaade7a3659ef26acb6fcd3b86a1b79e4c9f468d6edc5d4a8aa6316631de934637c736c8fa84af58282e6b47aced42eb12793ac67a3af672af50a9ec7ea12b8c07b9c16840c559602f03e0e36b78070044d91be0a301238e01939a3379bd16241ef60dd5fb1aac2d18cb1d59206e919f6547209199ab0b6928f87c004552202a236242f0348e5810ff00e7dafe868fcab4fd0bbe4c2aea00aa0d32f2fcece779a1c95cdca59f3e68e463e5c7d7f8d2ad74f75f8299fa8bfb6c3ff24f1c7a6dd1cc9b936e45534261e3302a679897a88d84b50459aa357db39406d8ef3e1479155b05ee7f809ea986a59cae02b9c002ecb48b1892dcd4e052674f4fe0aac0ee8e47e77998046e0161713a1bf21fb60127f809a7bf66b9968e8915945bc2e2cf8ba444450685b970841ba08f3aa043f55517d78cc0b3c95569b67b1870c47e3489b306dcdad288d2890152cd45422d1e706273fb670516d35d568a5887225ceaf56ef365412f03673083ffcc4f02459eab3791ea2576dcd7e53b725d0c60ca8562aae8d721e3154d8a7233fe498f9af226e0d1475af31416836aa9360598d4471e39c69c437f5072318c68ea12c1659d78a5689cd9f9260b9950c83ef1db694a997d7e4e9ed7b5986929c53a400e3ea6c59be2cf98e23b9785d88b19ab09bf0f6223a1d131497a550779e690be41a09f9bbc2abfeda021bb0dec10d9a555704aa3625a08651ec0f29986670a56628f2c0df2e95b36dd29b459f9c65511df277e5298d3cb9520f0e4ad5fd9930421b2b1318a98758708de08e49cb0c030e0054a1d4e3aec0260c70f9cd758b37e8ee986dde1ec307f25cddb3897ecd65b7717b0e1c0601a53f4afe52be459984865fc9272d36a1ef928b8cec20e0c531952d6843d6fe159986fd7e028b5b1f78a0e597bc834655269afc75d225838ba27a324dd2bbf0ef38bd9ed56afd4a918cd775c9079ab2f8a5955013e805c15188619e3fbc5424b70ad4cf3fce65d7f61ce6fb7f2e69797b25d7f8ac264fd8e63acdbd429c74dd79871e8e013e6622eb7adbbfab01b61340a952555905841432fb1d21ef7fa3be178d8f6665bfc995f59e63083a2c2d0c4a4fe5db0c0bf5d4dc5e79cf04f4a87b99dc560d735ff32d55c27818608807865e753f6f0f9d643a1f15eb2e78f1ceebb19adf82b9a467b8c10526bd1ee3721274f03b3b94c83d51a6446874dc538995995fe3381190b95ca2f391dd294c7a66efb323edf8473f8e14d96dacac4ca67af61ecf2c18645a06d60150a43be0a83fc561e70e5cbf895fea23e3ce29c596bb5466d7b28c8d88e3ed83a349accb116230dca1ffd30e3877fcefc68ce349bc3c21f57ea9eee1abbe8252ffcb64445b3a869286c26838532018fe4f3fa79debdef722cb993d4d58ed4140af16d17e58354e0b311a447e83602249b479f52ccaa9f0b52b8fa2d91aed5cda8bb036d53546280f163f8e2da4458f91383bf1a9a62875038fbf34c0ccbb7e64a34d0954429095a829fa75609de3a5417628d086f3d4d96897845672a8d424f11b377f40aa3b53b155324feb54cbb8b589f69e254462bd3e6d126b1e523ce4efdaa280d5527157dd9ac23a6f9fc6823728392d516498688a4166bec09f762f5bb9b334000de7cf464bc5584ee51fd7431514587dfe03c6f04a952f68988d2c86b8fb77627f5e8ecb940b71de7dabe8fe752d5708fddffc09c5ff13c7289eb7bff93c05f9c6be8af20c2ea989eb7a30bbce8baa36d307415967688bf0ff5ed8636452b3bd83ef53c568a9f7d84cec0ae65b29a458241fa96d69764b6b4a5a87bba11cf4efce2cb0254b00d911673e117141ca119ed2210b5375cbcf63749c064f780fec56939bf04056121930941c86aff7ed30698fbb29129948715955524db298d36e6a676fcb141d6f217b73cb27b0ab6b0fedbefd714550555555bf4f13cd503ea7fca8eec3deecd810b0aaaf0d39da55c229051bc7cdfe72b9ddea7045cf1fbea7614cafbd8f16b121f1e935262610437586a4b946348ce8053e3c3471c788c513a259d1ee5dd110da4163ba21505df3e7952b7e60ef93f5500a246ebe3f922c1484a38c0b1aab12195f3a6ee46bc46d98170cf420e6297a3ba2a49cb6005d981f5350ec7088afefea860309d2624476e3ca6007a38621c67af3fcc6c42d243e7882767ac62f4aef00cc26c15c7626ce97b0270fb1cc89e7f682a6cc01181c7973ee227104b843e7b2253a9fe20cd18368ca8c72776e4a54a1caec958b8c5353b55206b5d33c9a518878cc741f28fa4cb7d84967eb56a04c6c8000504ee00b53727afc865a968515612ed7ba9f70a347ec64b9150a751eb62fcda8c9902cba54ce42c56248786272d153534455a44e546e8bada4094521134d59ce7a62cb35cf56357a260df03d496bf772fb978cc501729f43e875e789bd6413adb9bb2bfa8191c69eea8ae72fb560d5f3e6df4a9a8c790991fb4df07896ba4bb6dbb53e426f97788a8f2a90ee507bb7eb0c1ec2a6401c82cb64a9950f00db8dc1d317252367311f49411a994d08b6e1400432c81b92fdb295f5b29dfd66ec244deae3a20d85468d8e7cb82c8238f0420a64730f267a355ecae3a955fdef23e4650356fc3725f6b7f048fd28266c17d47d652c105e4bf4b87cbe4114d994bda4150df6e83b1b0b5dd24bf0f540218b442f302ae2da19d04d88149f557b6943fca0560e4cd1058471f86ad2976dbc79d36385d588352987217dc1ee8ac0a6f4ecfa85288ad8d664090454cd738e66b719cea765fbdec581ae8f85afab32e68c92bc38460a2ef30e61ae4a0dd6666c848ffe45889715ee87eaebe4675f37f1db3c248cd72199fb30aec396f358e5685b53317ce0e0d36abf55bbc1635650153778f47a08ab3432b16f691516b58b5c0bac89828ca2e53aacfead48f8c99c14ba43d26e59a251bba006f5ab800ef136d7b0f968c47c2fc20a17dce0399b9d20dd8653d212bb95b896a0bdf984a6a88b2a543d4f779402959cff68c829492ad2cce98940d00d463838e1f08351aa657d052ccfc8ee0980a66695538e707165e0858b4511723f67c2a605eb3456e2b482f2b94d89dc05847ddc3828d943f7a78e9cc19035185a4a7da2214f535dfc9a7bf57cc9c9b484ada63b151cbef387344a6f644613f228835e95bf5f2de35af63dcf501561d8d6fc9c668df4033e3bcd67ef22bfe9fa07c120d062fbfd3a4663b83fc3b107f433d4c14d8e13baac3aad9888daaf14e3f6b6f8dc95c32d45317dc2ffd8ec97662c0b2aabb379e6c1271aa80aa581212482113405fa6fc2bb60ae1c483d14a7cb6095d3ba83b8745fd5a5e4d93e636d9fbe540c186b8f9b637dee78738895d51c426f9f45513b1d45c1f2cd2f49ab5223d438ae01a638e87c13665e1a63c07b37a94f028d53441d713a0c6c9aa0eb07b6706dbb690b74ab58cffacb3961f1c36592d234a463de9d4979c47c41851d46fbb81a0f1da2792fb24da19a0f5cab64fcbd9e7662bdc1ba436bfa64aa70f58b1eb7a71874eff23fddfbfdc19c364402a66b2dc311aa1f23cf19047f496b2cdf02b06114379aff24840b79ca4037a9c42835830da19a50366a99251db25fa1dbab9ea24d515d77a96ce5ad355e8913b190ba1599ffc1bae86dea94290d91111dbc7980218fa0e0098693b088c0314abf0b7545e450ddf577be18b117863f74d5adb7b932db79432a594028e08c407fc075c141810651abb426d843df29e8606649588bfe82269059898e50480d9005b20fa433e2b93f2f8414cc6271eb000d39b6e07d147c7f406d273f9b8854f465a8c8e6e14ddc8c2a72f3e7a932658f874c55ff988030a9f224a15f9e30d213e5927a41b41272e1f4f491f6f58f13f62908e8c5600c615ed410c5237b70388736edce8f9e83f2cc7de663561f427e69391d0b402869387dfe1f8c10164c4394ca5ab31522b46481f1d0714ee667eca77a72d46dd8da04782e5bb1b421f6f28f170c3a751296c09a7a3935111a6d1e98809f477323a1db50ee48ebe9359bd92d1cb28cc4e667532ca56dfc1e841860000eb1a3480b67c74ed6c7c27b37aa94ee667c715a4a4eda36b07b770b1f11d3462199f47909b473133a951588c143ec5182831aa6b8b018aa912c42799cdf26b8b99c2391a0325464acc1422ce915965ab4645cf5c5927068937991e3e459f478f9b4733606dd5b08942958e416217c8b80f6689c9a8647a62905a670710d28c1a9a1d42336a6a66405901fc6879b2a9e83534337608714eb70368c715518ad99d8c54d01f27a36a54741e1b9e436ec9e9a85151c6a8f2c6bc742148c9ac3887e7e30ea0d6d9f1d3a8e83b7e3e7aef000ac0eff8419a3b7e4a42df9d8c6290f8f4e227a37dcb2deb9262b2fb686b0325cb9b63bf66b64e8607845e0617808f96cc94d8c48a162619904cd015374449d0f2d1657e5ae7a5dac2f1535aa90e7d8ee28873e61624cec1b89c924e61c496d91cb021793fb76e1e7d4cfae82f27995537b37cf418550c96ed91d43a0ad431505847a6a2cfa3c6a2cfa0982913e9a3cfa223a3efa09194aff1691d8ff9e19c182b3847e5cf4729354032ab98263e1f3b0cc8cac1bc820ce96e2b4858d5a831b2120527b0a9688b8d8a8ea2471e7c74b8e523e492f566a424c4bd0a790fe40953f81424ea408fee2d65973853a3a263cd6e6d926fa0d106b5c0233ec5980d4d769915e7a8960dc70f9fa2cceaa3cc2aba8c93e8323e9c837d741921cec1125de6493c194df92803f45126e8a3cc151f657e3ebae49311e774387e4e5aa285e387733a68641941a31d44af07f0031afe1c8b717686d0b1e8fa129d5fdc06c6db67b886e572c22cf160fad310699d20578a4ee0f3a8d7a124b63c6672e53a195e95e88c2b8daaea20d252ce89cdd0d4ccd0d4a84fdfa9d675a9c5cd6c9d34c960da3a2332fcbad2d8fa886923f9f466a39ec778f458e369b8b89da6d778dc6a7c5261769aa4e4bae09cc2b4a1f1193ee3309b0d8dc3f83ec6db6b31b44886cc3279716c33254fc68b91194fcf65e0530e9cf39c080570b0805b72c6e15604ba65b9948eada639e64034c79ce77178e859b6998c7c077d34cfc3cdc897b624f04d1c02f605cb39880320cd86e4078c0b99e133dc6b195b275fb6ce04b3e9c73cbf3a7d07f0c362763bff9c8f98dd5ef9e790c389dc29e83ddf270b94c417af595e8792e879d0196a9a10cc330782695c075d3d736cfb8c7366de20b8753c4bf8f454da2f4ada07b7f66303b3e44a1ee618068f581f31cbe7bab41f57928da5e4f912d536d915e758dc5ba2193c53843def4dcaee56e9104e99a4385283b4dc4c49d750a35d48e9fe524ace2425cc6e306da23f2712c4014392bc67a6f157aebc6fafd1940e663725520bacef9e11a6fceee15c3b27a93c5097ea10e064e2f18d806fef2ed5d14e4494034c6f3a252ab90d9bcb06eab489fe3eba4d744d592e6038ade34ea663a507c4378c628f384213661cce83a26484297f9f98ed90dde14699fe907b42b2fe9fc1ec8d5f7e67ea31b0d7cbcb7c6a1464200feb668ee12e3fd5177902b85d127629857eefbdf71ebff7de93fddedb32d72f2873dd04dd4e29cbdcf7de6b8657d857841863d4223001655f26db44435ebb990d3983df152fbe9bb1ba5790f8a482091f6cde170329719e94120c24a8685c869048a28819f33a840493262c21a59437a728825abbc2a4f13a7404d1d011413eee538c524700f9cd901142df394e3cc224a7e9999ec9e48bb323579a4e3829806166666666e66e668a6f138cf1ed0030654c888851ce002610e2db37291486110d17420960f0ed392e95183594078e35c010864a30826f57124cf9f61b9349149b0dedc793e1bb4c223541c1b7db4cfea18a19456cf18de5db6b4c28c27839a2889f02d090ccccfcc413244e8034822c3891622923380233b3f683b180aaf1018b467322c207df3e43fbd1466066e6991edfcd20608808274380f1ed32b2f8c206460c8d51052a4444b1623a61967c3075881517325bc8666c80a1806797b3a7896737f5243d7b8ceb90440f86661085131fbe78c2872e62a66a2184cfb3c360c1420d90c0a58b145d64e1041834dddd2f33366e0ad08510413cfb34f90927082acfaeeda81759b2e822850a90483a01947618babb33edc75b2f805080ef5c3800932c4340bc20881f98b4e0d9311c24954a25441737d0228314409145092952dd021298babb4b45365f78f1a6ef60904878f659c5b39b867ec8f23c3402a02126450cf9c0e4d9af1d66e61f7e683033b3542c6cf0ed1633034085831966667e3b2a20be1db292264cd0858b164e188105163cf3cb3333f3ebb26e068631a88c912446976f6f93ce2d5421468989a30b6c0bbc052c3cfb1423896731a2f04c53c48c55a4d7277c67e3e63b179eb3e0c4f3119e5d6a81c9b316b83cbb87718467034099a52e3ed60f287eae2e508c883f9c10925da6804756172b2a783fa448895d8c90827ec20876490a82674c51ae304aa3c8d9450c273fa25065e108247e3cb16a94a68c08d2b2c082090c132f9e2cc10b2a4df04207568ef00407d8ebf7ac1cea850d50a658b9c29430acb6dca5f680c727cea36a42da2d7f5b91dee47320466478c975ed3bf0fcced8f01b3e3d2a3c19407f8da383f7de5bf8e295bd26c1dbd65555f81eecec690ee0f90e7294553dc25cd9fc058f31f52d8ce6009eefae674eee10a60898a5114cf56e1f965453df7b3070192e67d3dc0c18f3bc5d29bcc8c9d7e56e1eb89c04cc3ec9fb78e8beb210c058d20315f6e71b40e092e5c9ab152eb8bc8e572b5c5cf138288f65ef7608211756bcd72e376bdb82caafcfffac139c4afa1227e315a66ef19d42e1028a62c7360ba80ec68189b9ef61cef372eba492d2866d358898f2a5ab15223cf11837cfefb6446cb74d3a250f3995424c78aa364cbc73bb3937c20302ce723fa86a43339994776642116cd69984d0ea1b86ca277629f535abea5e2f0ac6d07970d036ed487c3c741e86de8dc3713c3b0e06bc9767cdf118a6992adc319eb7ae071f58f5da2feacf9b379bde6c9a55e8951be3b1c7ccccaa3a640d2ec71eb4e4c539eb43f2bd3cad5590e32577240736c3fc238be47f648d5e7a8f850ff3c18a19bf6e7f4f6a33f4779a10e8aa3d4046ae93583be65213025d723eda068f6d452ed72f6d452ece267e6f5d33e0257784012fdd0763da3eeef7d201fe1d62474e08bc8480a9ea44292dd9281fcc3cc09473bc637e6a454e518059329839fa98b703f0de7b6f5555b5b9a90da1aaaafef09eb7bec7ccccaf396666ee02eb25ac2a0e2d6007b1832348054c00cf99570a3137000210801598439771e4c86184d17853cdd3689030be2089305af22a6599f6021313233333338326ebad9f1f336536356abc340755c7f3178267df043c113cfbd6b069e61e96a7df5b02d3577e1eb81b45c999c3f8e1e2b345cb32110c7cf881ca92b2c5a7e771575c1cffc5b315860a72567b7b33abe20830765665cb52ce988dc42a4c76cbf25d08db08ce43ab2deeee7f7c8aaaa31527086387aaed6fd37e5c6e793b06afe5de8ce06837e42fbea4bf22386f0447c80cb91de079ab63e727b7f7d8a19019fc98e76968ae03da03a2ef7e91852f9c5fbed756c4521d3998cfa15c3dc71842ee9132d365c038a7d34ca7a9719a9914a868da613b84d027f4e9188ecce4342693d7a8a971d375f97a0a56af3f781d52e2c96303706d06ec949d6e6ab86d9bf11a34343e85b01c9a909d138746038d4f57ed86e604bda600d92a8fe8bff19a9c86c96b6c68b8c966dbcf5153e334aa3e7873c771e3468d09a197208470a3c1edb00fe3266d06188f718c0019f7b4c9a43d1f637453f418893e463779f7565d288f238b44b410688744310be714d56842dae1cc0cd7ed77357cc6e315f10af4e8518873666842563e40eacf6834cc1a53fc699d2d7239a3efc76833f0d77436be33923d0dafa1e11d741b2f02ddf48cc06868dcc6218ddbd8f663b407d0b8c9e4348e31dc6868dce43ed806dc76d8e13d0d3f02f334bc934ff3344e8386b36306c85679bc902d4d1526cc979c060bb37b2b1a28cceea99ec6311c9a2d434a207d3b0d678d86761adc0e5b049aa00dd7d53071456ab8c9a3c398fc45a3a18669d3376d34ce1a0d345ee3369bbec969b61df64dceaa1a0e43e3500352c4e449f66bbc0647b36546134783eb4c8e79ace18a98bcc6a3bfd4b8a6d160aa4140b6ca638622309e64379a2db3dba419760c1a2acc6e939ecf0af35864fdf2e89a2644fae59946c372af62f045f954c36d93867b09c08d97335e16692fbdcb1ebe581936b3e9c3c82cc976b0cb47571f1c75c3883f307252e6069354c7f3f8d33ab08ba29e1bf16f887fd187a73d96f29c30ea61dc7bf2567c7a5c149d7b1e7fc139924f45902b9229191e623b4b435e3adc3a9c8757bcfc3282f3d1a16534b99f25b47c740cdbacc578e82ca1f4a70989de62a8beebc18787633cd6c3675cb75ec29c5b13c2d3638cf13e9a49f0a54de556c4e26c8444f7fddef6212781c06c69d904aa67559f33569efb866ff8074278629d17e70ee7b9dbf1176e1f3779f6c82159fc248cff612f6d0c85517c713c854ffc23c43fdc3d21cea9c2aa7f4492610a2e8f8d829a111df804bb9d9d8e4151f04506d7f9971c26c69febb39c323c06cd698732d25a808cef0fa326a318359f10980e4938a73533c2270893f009aa4ab9aee42f8ec192cc0e9295b1e5a043b650bb4c29e713b39f98cfb117b3213c5c2205428cc3e99d497e8c77ebc5438d715e14466514e34e1b0e9fa0c7a4e90287c327222803f322054a66a2464167a28cc3b8955205d67cbb6a34d4fc4ee1135c2848dedc80ecef0f14f3f9cbaea0d9dddddd329835af433e5c60bc93e15f02fee9b8f12ffbfd99798c59311ce015a597eaa63da1df9fd65925280a3acc22030cd72d160958211d1aec96082b71ccad16d501bdb7cbcaec761e3640877c8c1e3a91868f752e5f80f4eee6e14c3793e592d261e4e0121531a1af435e957a783cdb33965062565f5555e5d68d6cd2b2b2ea5abcbbabcfb974b9aebfd2b6449b854f457c3282430e1658e69ca345824d607a8361980e49942cc15c4b57a682dcf3b41fcc319355ed8f8a73569579fbf6ac132cee5e971bd9a4874f323333335fd7d3a74f1f3fbf984969e3e115fbac4a429424e19c247cea4c2ad26e7b6dabda9e45e2c2a75e261209b353241d9228e19cf51fac08adddadda00d3b7e964f2530e7c364ca62c6610ce698090c9a796df2be09cf7de7bae8fe3793cbd3b05c6dc42efd7457ef861a51566f74cba8276999dfce8f65ef58c7e0fc62c6a3fbabbbbdbc75a6f1f086394cfb264cfcc4c93d194329362c386c98f4cd714f39a624ac73863ed875c2f4d31b32cd37e5c53ec6e777777f7f65e53ec6e777777f7f6ee767777776fefee767777776fef6e777777f7f6ee767777776fefea72ea3e9a6f7c81294b2b4418a133430821fca1de03f33c66276064f92e7b0603cb2b166058f1d72b166000bd6201c6cf770f0b309478ed150b309afc7e00c8053f8f0701aaeef1d661950aed645b16c4542e66377f378c8979bae932fd3be655afbb0044bf061133e66ddaad1ca17ad580c4bc0386d810844f6f073308b3b11da6f680cece97f3cc33cfb8329933f16991483fd283ea4b1e370b4992f9d023c786fd338d5901d39bee21fdee8c8d66c8cc90b99f9472996c13284fa03082a24885412d7cb4650740b8e271bae9b38a228a2bf467ca5213134992f95d832af485f555ad4a799060ea901428bfde7152142b723466bc49d1f25d07e990942fbeaf3416d55dc97302513dc1acb51a44cc07a49ffb60551dedef0ab339c875cccb44fbc1bde21c4ee21cc9614498ddaaac18204ec88098d2b18784a9e2ec876973c3c543c92fd588f4d860dc922e719cc493bab8166aa2557510af5aa7f7677d553d3e52808284ae10191d2125b18a7b5a4753eb0dd452be7f987b47981d77319fd5edd20a10c20d6cd21789584367ecbbc4c4ecd9a3d6b98e9e3b757139348a7bb20e493617f87cb7aa2117ac268c5bb73df43cb9eddbb636e83c0f557567825a677d50d4fa10bf2b74a56b2295a907b3e35955c1547f485c33657ddb577dabfdd024e556df16ca1ea3de4b9a3cf955f144d25118342a27a03cbeb4e4606486082d24b0821f6ffbd80c9f5add27f7880079303b9c7f38fe9ebec7024c6f600f66b7f60230a8c47cf006a654df734d9a9dff73c532bb09bdfdc14704858b16415a10a90c3d41746a04568a4a07deafb3aa67042929a0f46cb37c8d3a240429cfbe5a77ece871eb1a3257849ddfdbad21e6f3ee2fd2cfedee721630bde9e26a91261b7cc33a378c6ac702178e4ed846139e61128636513fa3209d13a3b68a0a4dd98132e4c12b449f20435ae7798cd0e23cc29d2cbaaa3ae4dad4a828cc4e8b6092aa67c551a8759eb7c72b7b6ad446a2e519841e4e7aac7af8f438410f9f1e3edfe34a8f1537e115af9e857ab46821428b966727ab454b0c4d62e88961f53108c5d013c3eac995e512c255f4a59eab688336e8f748c9066d15a0e7f37cfe5d59209fe7f3446ba2adb412682b6df59a90b6d2562f5306eacd72de1eb7ee0b165f977559ddee831baa1a76bff760decb9a7c66c5fbe0c69821607537378fdc98028c57b7f458677c3df6320bc6c7ac2cc2c764665d992c655756c2b20cd366607f25ece55f118f93ea500821e41ade419745e4eb8c6410722c75a4d5a82ad48a5af97dddbdcbac422fe59c2693fbe9c480853e58fbb592f9f9c6dcf14155d8a96a6b7a526e666666b6a46a2755ad2f56485180045b3de233cd12db1e0f080ae0442b46abc811b03c21094b50e20b26a4a215af5828b1ba83a115f8e0cc19f93ab482d577d35fa07a1dfa71f25bbc0e3581c5b73f9f7fae43591cbd074cdf2951a9549fc494437b75ddda577bd67bcbb9ae6bd4e899cd1569e7d7b73c0e31b922edfd459e7372e84ad277607ac7de52907460f4a265bdac497777cc92580ffd7906b9de9ec36ee8580379924fadffb8d71a6c93ed59229a1cd13dde6eabbb7bf81779c5cb0e39dd17bae326bf25d836a80b79d51baf5e73aa47743a456f04f6c4b08aa1490c3d31942086550cab298ca896abe8ca7209e12aba8a6600bb2456d624ebc988c89a644da8108289d97befc1071f64d81e39dd179ef3d6551e52b12fb0c76e9e6ee96f0a4c759799999b9b85c0a413d365e8193e4561762675c146b9f77d8508db8d57f9093901fa02bc0a2101657db3616f27df57fcbe005ffba110321fb17a787f104000cfb6139e76c2a755b8faa3e3be2d1865c0c80d23a09dac7460a4aaaadaddaa3b0c43498889a3daa6ce462311b430839b636076369e3de7f90c15fab657c4d42b66e7ee021c26aed838b9d0e4e83b131345df49938d930b36ac4a5dce506e4c7a64eaba38e96f83eea3a50e1f2d2bee78d58428135eb92836d197a8500a04cf41005fce6be6a28d7243a0472e029a821c0ea4c1900a8a544044c4d42126825e875470f4ecfa434c000d2d516403ab52965b1dc5e2dee64576e85797f1aa0919c02b1705042fe735f71863b022d9571facddc080d6f78c30e51c758c5fab6a0e23e1d7ee24fccaed1d73127e7de5da0915e9ba994c619c51516b33ee8ae180dc9048c74adb2a0ac2f6a54196364d651995e832badc6c6ad03c73221a97399192d718621ed1a4cbf5e879523c297ea58d49c92793cc7babf1c33ca2499fa41fbaa6540f10bd9bfb3455da34856d9de91f763d444dc88e2f591f33a83d97a58dca0e1c1b76f7d35e2e6e078ef0756f0fcb231f5c02367445e893f4e78002d3d6a162f905ddda9040a7e17debe9bd8b5b453db95179ef5181da7b6f23d243e5c8ce1749d22ffdf43ca9cbb1233b46f46b63727910548eec7c923ec06a4078acd4dbf459888cd520d0df6eb5d66e5d1b951dd8ea6e095f24b70373163f285760d65a0b2d8ead17955b6b0c666f078e707180c9755effe59058fec266bcd1f0542ad5536b1058f2200d3c0881de4b64690d08cfb7f70e32b3b65fa46b0f781e6bbb082b40d0727294b6c95443c9792b0d2d01857b1d5aa2ca9f94077b3b4a63d63701501e2fde5ee3fd303b2522b2bc6d3610698ec8103e350c38446c380539ed9c5cc0f1dd4cee303030aedae3ba6dc2f3cc0e93693c5a0663e253c36c3616b3b2ebda27acfd0880ea68b7b409c4f8e5abbd70372c592700a5a65f1eb3d9483ef56c545b99f6000df36c83d17e64bb9c0d10fd759e7f5b275f4997fd8361988de7f9056bd229794c3ab641bff64709bbfbe81a3875396f56bc06e4fa3d92e337e8d9bb1e7a7e6793deb3c137db63e3c38840042eaf3b78b542042984dee606cd33d7389b282f6e00a4d4120320a534cfe425e5be689d1a299facd3ab95aca343a3d647eb6c128a8ace449990002c167d54a92c75a23aa2c7a99a269cd6d1d40d66f4bb457f51b52e35d95215bbcc377c825bd27e302c7189d38edc4d0fe11ce8d029c0366079e83a402d0f931efae01ce8d021844d78e816c70d511dd08356a5052397721a59a0f7805a47038a7afe829e9683ea782b3569462c90119094739a4c0eb47e2491669205b0986b147f90c5a83ed4a5a827a7cc76f60ee7dfce731c191806ced1211a60f9e743de2b1a2a55015384a94334b0a28ab9bbbbaded23eeebc7c120c57c1ec401399022e8db7168e87ce262b277defd7ac0304458d18229ab6841d3a2a20d4d9925b0508511df4d7f42154330314baf43416350010b3e4152e832add7a1a0a320a31920050163666e665ec9ccdcccdcaf3ae2839073703373dc9911767773ddddf39983344a9973a8beedf57177cb1caa13a12f17e19b9f83193355c1a42a37616077f3a95989deebde69e75ac25cefb29f42ca138cd1094b5a325ad2a515e1ab62494bbe9556154b5a32c297046945f8aac0172d095f4cc283f0c52ad282af8a252d99842448ab8a252d19e14b82b4227c555ae60a98de746bf42c99fb455545697e6daa288d53cd57fb79efc1dd9cb73f2c8410c268bd1f950e391ca922b43279f5101898afe80ae0020e4a7bec937d81dd72950f11a22130fe3cf9f9594be513b96eb3f8589c65dba99f5f1a10e611c5ddc7b5b3b3233520ac999e705e55ad579fda6355fb02fb8c225788fd0a5ed5f6d82af405768bc3b2529e6ba03af8bb5505c92028be35b25a0610f2ed4a5dd7e5fa94799c1d1bbcd42b587ef5888a9eef1449b95861fc4ea183b7722075becb1e2ae0e114413ccce2350701ffbc13f05dc5c9b7eaf4174f70428429f4abdb80f7fcf97b12b042910f64a004134bfc907a7c837fef74e2d376be3332e0819c5b9e3d06f16400e55f97e066b3f82e8b01957ffe3c065e489de64ebeddc96eba428c2da4408134050b53a4d8065b58b1e41153eeae16f52bddb8b0417c07830c7a85aa967f5bfe291717de7b50feed142dde5a3105e9df73394d7ec2b1c23fdff11164c80b7ef8e7447088c13fcf41072bfeb9122a59a85e80458f16fef94a21c63f5f9f9f17689102140484c43f5f181441e89f4aa549ce11c0142d9e8d3426128771ae98e067084534000b23305070e4822e4304fd704403b490e204892b3d5192684016464353ac284103ae98668033440552110ee34861c2bc0e3191f4a26566423c31652051345f5e879a78e2658889bd0e355145eb411338f8141547920a1f2a5080c3021afc7b1da20289ef1c07080cd3ec65c9b784bdf75efcbdf79e964dcd94714b78525eda4e3b4122249a1428f12c77149a79601ea8d8c05ee2786887df3d11460b96a005a1741f0c2d08a165b90fb624e4526f319930b13c3a936b48c9069f1e11b9e9d0a877d4a827653a67e213f360b2421e6e9803d56112c44ecaf21e99920be891294b013da7d44ecaf20ee617c08fe7be5214e958c3f7debb585ad6a61db9253ca953a39e8f46bde7b007f3e6c6341b261133cc92578c313e8f97c718637c31c6cc638c11f36e579c6d1e4b31fa6e33db4ea3a2cb2d8895458c51864c0e38c418a3cb90511ecf979f13ab8f8e4dce81aed3512e2336f20a94f828241b152d972e1d877db0322d66c9a7635500a13e680ef4383dc6cb7d70d4d1c1243bf973dba22d3a730b142396a3cdf2d16190a4d4b88c3b8a43ae2a760acac347359a7cd82e3f2f2f96b8253ca955352afa6c4b16c332bb3dda2dd16397830be7741ac61e2d51dfe7337a0ee5013da687c7b3ef52f1024aae5d966931db2dcce2954e3d71a90957e9daacd8d0079167fb01e182a02d565b00959e607a539232994b3635446fbf21daec6653433bd68ed9dcc09e397be698f396d9ccb036479e5fdf26d59bcd669b4d0a6b69f96894e5174ea32cdf6d886c9465b9b42c4562e617a8fe75a6c5841edd03aa33a3a8f5e74734e7f2175dfadbc2eab4be185645051487a73a857fabc794955fa248f7c1925bc2933235eae134eaf97bde5b90463d87db0f2611cec181023b84493b7bfbf3e7aaed1c448cb3a9013af48ce3818a0d18679382ce83cd723643328f80a632c73ce3785842e586fee2094e54298ce3017ae61967b36e394f8a87e836bb8e714ba82c6703e616b7e472cc97943c739e94a634155d53d86a3f901c11b2ff1cc90f181f62b90f4ec5cd26a5491b88d8d49039f41b32871c0f5478b0c9fc06cc5f381e20675383f4e836cbdd203ddadc6039c45cb3c0361bd53e1ad5254dc11c3a2979183e2bef8270ce94b098252a94a850a2820e30e06985b607e4d6685f78fe7c879447730b86ea780e65425f1ccc9e5e4cc8756a2484d33a979fd6a851cf253febb9b2aa51afe79fb74f96c98e3dcbb2a2252d6949cbb2a0c5f5aa7df8c485d1bf977ade3e36caa7fdf7fa073ef9e02a0baaaaaaca0c2154ee56755ed51d234ce5623e29562be541e40ba257cf8098ac4544a45f7e719a62578dc8c9c68625ce99248743a3b67568d4faaae80a4ea3d62defa00692b2f2f9911224b445bbf2c1691d5ee1e0ec987e77fe0c2f112c424a6732ed15587efdcd08c1d407425874a807473ae40327cf494ccf3cbb487a55dba3b9bdb22ffca03c965b2d548710cfd742255a8886aa460d61769c0455adf390927a16c60016a13a0b0445c152e9040000d8d8c890f1188c81f2e8e502687b2cb744fb027b04aeac0d667bf79080be337df4e2213d87c1276e15c7495f4c9b395f87880083675fa8ea9dd679dea7d3ab64e43a09a16ae11e75313b189474256966996b4581e98e7985c1ac521e41b660cdddcdfdae52a9d48f9b170684e9ffd6833c244c2c73cc79529af3a41607bde25d03fdf64f33fbb014060ad22b446cc4478cc4491da1a8a8a4ad5675410ad5cc0c80008000b314002020100a0885429138281ed446517714000c81984272589b4aa324c761140419638031c418628821c61091a9a1a10100eab99309c14ad6ae52005c6ee27b952c280b71e69151afdc6faf5ea5ae8e27413a8187ea551a7c6a9daf5362dbab1475035f1a3f3462bd0d6467e0c13a32fbd4cae855d25ffae7c32223dfa655a537f7a60b172aba00bab28ed29c616305aa8eb690aa38bed4b442d53d2ce1a443602556bec56cd35208be148b2370cafbdcb01116ecb48227c956ee598e21bdf5ce3147488133385046bb00e002781be439e4d1d22d3804673185140ef41631f09e5b6803db83ff9b6d48894dd048dde4d24e95d6d335c8c40cf6db330769b735babb06b7d1f4bb378155e0b9aee77040a1620da585182b62caee8ff474819804c370e0e082d6a4a2d4e888ecb16d1ba545106864596d0e5b9a53536b3ad5a5ae95f13529b6f6fa340443180ec42a6d60ea5a16d7a28505d7fc370b673aba537f3fa05af95c946b51b5939dfdfda4f4698d609bbbb5e1b7cc761b92c5ea18a0d5dca3dddde4f173a2bee0414ec0cfdc3cacabf4c14185260a5d38113b7842f83204382e234e748fb6f31411a38cc511c835423af9d24b7a5c261552b49028d9864777d9dd2acce96a65e3e79a426a6d8a2b82e255b1843ce70248748535b615f39e0ff899757cccdfac0f11d84f2de0a05b13d6c88ba2623787fccd7c3cce6a9ad52cc6880f2bb268e8f65d7299a7f8f6fc0a4796d53563d81a6af2b8927fbdc27804593f3c01617d3e0bdf116b0f7b07d7732918a84ed0cee73a19f5275c1624d6d3ab5550da0585b7853e3b3c0b2b787d15b885df2b35b799bffd99c2751589f726797873f4aeeba6f0833b832381f184da7af346eab4baffb18e7bbfdcc6e0da26d1203608c52c04e269c79cc23fb7e5406588d39a1f21a575403e3c20a901125e7b405a6d3cf625ab13657482a3bffee8bbdeeb0ccd36cf353a2a381258a7ab6dc1604bb4a694472b770dbb341b33c6729bd704efe11439443a496a2fc8771ff576d4f1ad4edc5039ea29d834ae7468a0f7dbb79f189bfb64b8df20cd2aaf5893292fee3fe13036d83bcdfdf42d56126bd4f745a17650ce1ed023412639a2151e42aab05bb61d912a0f92424534a5213556d107b258c0ac7a02a256e5b11bf9486dc95198c3dc0a6536bf71b59089c5e493820db508c5e4dd43847a66433f7e75621adddc6643fa8a10a12fa8fe656b4419eed36680246cb466db7e2f32c5537a034edc745fadf272b9c5a925ad1b6a537eb2efb3bebbefe9212f06eb7a36dfc9097d7cc4c21f41374d1f26d3e61f6aabcbc8c5aa78f9589b1e5c942909ce805299354780909ecb04ef8325072a3430bc0ed455742838e82dd173e0bf0efb0e88c9d5bce94715e2d5921a8e1cc211aaee706e969823cf4f69a956babea95c4f3518d3aa1d13cdb48d43451c8e3a9c41f43cab200dcf633c658dcde1388d2ab3e3ba72419ac826a84739081c980bdd5ec8d526801ff2d6aa718114191ea452abcc1ef032b5e570a908d7a2f2c28a265293507cf93f16ed60a97ae7c931e2d8cfba3a65b434a7a3c79377d95b49ef0e6894b9db2a9194cd6a482cc55b3dc9feb5bdd6065db3388ffbc5b7ba8dabaf8e8b655148bea122f9b0a12aa0640518444faec39ed1585eedf22a4d08935a31f9b9a61a7ef524c08581d06430ca1a4aae529ae55cd762470580eebfff9f09c49a7c405ea6bdd33b8b1786efaf35ea3f4bd82eba429daa27344bbacdd687354d6845ed1238754b66a46aabddc175ce94154ceeabaa8e5332cb433b832518decb380fc9ac0f3e69266427396b28526ad35b648071f622cc2b533a407e21731d69ce43133e040cf57861571eb5730d0b6601a6e723d4c57127de003717796bb8ea40fb1834b7d041788c0f253823f659a0cc50886284600dd0e9836e8498e1507c807f584113405327199745a0c2e0445fc6dc32ac65a19b16e32ac48a03e0178fa10b138ea54bebad9f3079d58355040672a9760028a6e88ed61328ebe3050aae628f1ca0451eeafbcce4db754f4d5f82804f45c018ce8f2c486c04e35c5a8cf707b49888d164a60eadd6148548dc99454def4d8931b2da7917a8e5df63af133968e70f2e8ef06853ea00138c6c6718685c0a0d47ef2d6ecc1c667cfddcc367f710fbff06c0545057d2babe065002b11800917bc4dc88567d19f6e70cfc796b1089e339dbf8434c3c41e434e03f6b564b3764951abc586c6198fee18436722e9a5eee746ec54ebec2d1f5ff50ff0d14fbeaec8f2142fd53c06292c5ba1051ccb419a12b6573dca71bc5bb3fccdfeb441bb4e8ab03b8dc76ce87e793737028de6e38678119dfc6607beb337b66ea1cc28332205c4e9de21971b05ee481038e183bb57cd49f7a8104c6f94867eee92a8557d18d9d6dcb7caf67164211d86522a5442ab710f8a0c03e4ed67b788b5f798c83fdbef5991cdf62567a1d8aaef18ae619a78381a672a63e31410a4fc455a856bbe2cf981044ed0e19518aae75dca7414c8d1c52dce041218e775a2c249cd68233730b70aab9d27bd0de0d651ec8437b99fbd800d931e0e09e5e06004ec6b9867304789bd0cea71e1de59f6d24b963b1b37a886355b0d4c7b53b7a15d886b0937c714e29f6cad574d1191241600f6b99e2284a97f6642ce77ee8a3db794b0e4884121dc88c7ac9c4ae6413adcdc7f7e20c39cbee7c4924c3950911299623580493917165b17825adf9da81a85407c8787888a118df35e8e6767717dfce70ec5ea981787648e550b9256be6c75669955ec45efc02f03dc1acd43de23e75763b3cc8725f02797cb77e8d129f97b3a686987d5bd8ba04e8db1ac81d9a041e1febb6ea3a37964ac8e8839a46c3e1bda9e72da84758e8595b9adeaead7b557640676b8ff6dd2325a6d6d32595e50a67a64b71562c702615216d410b6b65917e894cb9ed6274c6904351be2040d331f8fb9ead4964291555d2aca32413ddf6beb55b626873274c8cc95864b0ae41690bc865f3cf866d015d6b90e8921da8238233f7c874804bf2c8e8f41010bf46dc4806bb71cbf9753527ab97fb7aa73707deb8bfef43ad826b987e41d8f47942f8f3f866d42971fbc9954684b2073b517f69dd65c972d819e111f659f413c7ed6518340f22967265663e78a99e2a8a8707273017162840fb16bbeaa05b72039de0b7fb20c5aae043292e62cc8668244ee045caa02fd6e0cbfa6cc1891391a080ff124014ef6cf977bb2fc5de26a75750e780e7a11301af3011377526934f5809bfdad6ef34c1f76524e69765de21e4e01571646a10a403c1aa01e3346a4b4415e129c7ba29230fbe72ac2724e017427569d0000c4c79433eff1d36101b8b972b3ea356885b0a1ba4f358002c6d2d0b4211d6efac848af14ffeebc32ecd80dae667364de7481ef8aa8bef8f391e98699b7d51b782140fea2ccd537ad882f65bd13027acfca64a56f5d184838effdf7b11bd687edd07e758aef8950e3456faa14b3b714b47a7cee65ea21ca91df2f86d30116b8740f423930a17a6129a6cee8693e4e79c0df24f4667a6fa6e730e77c4c4a7dfed10229c66e4432f55a90f91654e4f66647afa6c830957c404d5cf6d0df39d8c8db62a945d45934fa9229e8a26260b0e45d6eaab81529b3aab02174e4296acbf1aa7ba706ae950bf02a3e7c7a21011359562a9e8e3911349834bc6f493660acb3e70634c6ab6295c9ae75ea8bf2d0cb62f88b60280c35a1f8ebf4d1fcc9bc822ddf7a38a8b3bb53b12a9083b8b33c8efbf1a7a8dabcda831b28bcfbb8eb1d4c07141b8751237107235385a754544e047cc2d7debb6653c978112b70fbcea1d362480db768d53210dfb4d80d7f5a422d95847cdd1f920e17805ce8066017813499c036d93fba60c9abca3ca43c5c66e8c37f420db7a5267a5df20c4e61c400699d9a247d67c5865f5ea8c3dd662cd6d62f0499f0067eef0fdcb1f38d8a0688f286e280463b28befec00c5cae8ac1f078123b90451dece4e75ad9a8c6a12e836269451792276567d5b213cd1971698075ec6d0ca68a1d162cafff9edb612622bad3497386623e96b2c04c0cc510601bed10e96f59c672b68aafe1ab7e15f420642ea9e32e3e19c813f73d7e36ede82086c64e54be214939ecc230eef64ae2ae4a5134f6051155077bdafeec6044bbaa2a04552cba84a9b5f9fe226e67817e89426f51d169a3a2ad1a9155dad25590f421148674eac1d45808171d15c0c816ab5aafe4d9ebd308e618d8cd997774da5195529c00a9ecfc9a9673484dc3d0b8417ec01c89ed1f05332cb1f4d9d1669ee30b76575b176e830637458d1568723f6224b55447cbaac3d1f1dab79afd3e1b4517d5c3923f95a96ffb2b0cdfb862a80096ddf89cd52ad7d38638dbe0a45b91531d2e435c71403b52c2b9388782964d90251786b1ca59aa4e6d0672204c75710e829adbaa7bd401fb7ccb0f8db7effbef258b0154bd4128de0beb0fa3aa2a1c66d54c54079e3a1a228bcffe35a6fc08eba885f9cc012639ac65fa15dfc004292d1793535aca623be7f7cf7fb8ba83493fc010096b851f944a6334f274ad2a3bda33bdbe236788b84a743b381a881b5a7871fbdb9753265aecaa00c60acfcdc469ed09a31a8f124d09bcadeadb8230fd782f3b792b59dfd973c39ba36e65f115dc7ea00dc5d8f71a99230d1583deeb4c3c64c1c3f55dbc6e558b715e297bb34a2bbfb582b3638764cf4020263502ca769cf8bcff73e789cb1e0b0442f34086825d346006b8686afe0c4f3bea0f92993b72a128b8ace4bf5a2553f8bf0565e8ea24f55a20054e8cad593761d9c3b6e9398acb51b10f87b7b6c7abb1f939367c73047ac7490594fde087ca2460256d9fbb113cdbb4e8a897b4b1331e110d7281856200898837b2c92f76b1d39276305318d7f602a9096283723148561ce94a4093399dff68aaffa57604dc186ea8e41057a2a3b6340d120958d028b7bbfae06d4b499fb252d430b78b3ef9cbce1a2a7873ba991291b7aa30f9f79e434c90c580e115d9e70ee8b73bbe3b6744b1e1d741facdbc7ea0dada5e3e1c473da0ee46956f4d784175c32726fa2f4f5290120021309cbe45f71af0abfc464687cd38410aeabef77d5933a9a11108c8d04cb1eed14fa11115b53d09b3be087953d66c19f80b4e6ac60e6a5222a7f657c75177311f21c95eb1177910c5565493f0a4122b6ab65747a3a33a943f0c7e43c83314d06fef8d70652b546dedc6ec40bd8c3b8264885b2838eeea5d86f2e5d6c30c038d74d1aa6a5c70332a90aa41388247a918f3ef30ea01d7ce978341de15b03af21d90194e5d8462bbc20503d671ddd6d74ed98d41cb69719c8a53033f2dc2b3dc0e945e2bf240696171773e995212b188f50a1a77837fef753001f4a04fde6f1ffc9b74a2fa44d856e668f95561acb45b2961f49193138830f8fac2d1909570aabed9aee7f92914b7093915e6b7176e6942a8c0d2ed3e9f53b8229c9de8b47eb950679c5b60aa32c3b3c6fd036e5ba1bba3caa8295ec10dfb71ff689fecd3492e2fd876712fbd82c6fcc4dce62b527efd1054e9538aceed5ff64a258278f78abff708a872f100f509a585e37cefac7bf085f8e2c516ff4fc16bb9595e412857417060a1e0912db047facf0a4eaec3bd6527a8de9006658704b3f4bb8c622633e0e08fd417597638b17509283a502f12c5e59692238d0fe84342f66495760ff2c83d249b80ac11efc1b9c28fd7197429341fc2696e8ba0bf501d48339df18ddb0d4a597734a0effc018bfb100164b4e44f368c2bacf81693c5202e9fe19fbe6761415e53c0eae8769a1b8196a57311cc54c20b45eafb3e8b31fa414d4e9173e0a46731db4025fb32e6a5abbdf4441f63b2eb84a62e3c14457a193b4ca23926c272413860a0d98b1e46e263a56fcbe93566647131fb54112faaa2528b695e918cf99dc8022fabeb8c8dc12de8c43ceb2fe448e30574d918e1580522d6aee35c65c4ad9c62098067cb32b15780b6b2bb895ac98138040ccec651c73f6448668974c0266917acd39ee7981737218dc3026a31aad248251e8957a542e4aa4cd4b08422f2e25eb2db9adb5318ede8bfbaac502b3091a1785e7428d9ba43d7407b849e09426d564b5ccbcc19f03f24829112b127ced9b34561ea363bfbfeaab3d91d09baf23794a992641b16e952bc5d50fa802eb438561917b88672177b4ac5c9081da2271889f6499182e142591e78d264d04e7b0622d912218574a1351503c25a56dc691955c537af02a4acdbbc7a543369c5c244f248522acab0a2d9328bc4a4eef2197d1b8450be51867519601923dc3882f7529b5ec9ee9aad867a609d58f07d072481063ba2dfb0dae6a4193ec5604309594dba0946b0bc6fe50fd5e1411b81197af84158ec4c79e01ce388c155cb50fe186fe21ee4744b5242204f8c1a041d3c5bde3ac29117d89f0bbfbc396d2cc3a7cc7ee2bd1928114162e78c6c0a748541baeb29d61c35454db4e8d29125d6a5f9d6e79f57f25235d26259825c1e67f6493d1762de696a94e43fa944242dcff4e6daa04138d5b8e12a96a0b6a6228bd42683ba275ab8eaa8ed3b1013aba38a94e15e517932f623a96f019ae8652c26af0beb0fe7689b419fcdac0fe17fed18cc958c51f1f33ea25356e95e4f2308dbc81637cab0bb3a55abe22593298b85adeb78bd1ec3d7ba4f46a02185fb8a453bcec424355e9a476dac0b1db3b7c180767f00112a44225e29a0032cfdbe13f2ead9d4c316ebb27ec0739539bfa9cdfb29bab9266bddf28ae4b2cecb58da4e0502145954e4994b49126d1ca3e7435babde5e131c2bfea18814aed62e7fa4689d2c940b10cd5ba132cadb07b2716fd124c4861e09b8c65c2b3e532077470a78c579a33c676b1294957646f225954f4d7527edf39e64fdcdefd20269635356e28ebaf81984a4ff10fab3c4373b206c79ba67ad04f5bc720f8d783d66b91a8322e00fda917810291776a5ea21c977217ef29eb124079348a126d955c6e921833711201c2b503341c21346c157923bdda3623856d6e61377b0dfa94f72e980db961f0c6c310cd5ad0f4584d90d529f33c4c0ac802cdfbc83c83ce734035b43ee62754dc30eb4ba2c6f7e3e782e631f6a5b41eb39a26e495479470480a96f66f456b2ca3c55b61f488031ab46dc569bb738eb8470d477dbfa20358b44190150cfe822e4205746be2e740e9c550aef5fdb963ed8e65db4a55b73f584b92b6284d2ddc046dee19b600615485e090ee0dfd156ae4704f600cd295d2e2d1b3963d17dd83166669a52ea7f2b27948dcf033c04fff8c37fc397f29b596eed82b1c189536a0bd67f145c9a2419469da5badec642277cca7c5855b411df15210cbdb0c79ece3cb473854bd2a042131b8898580b8ff8f3b4b893a7eb26c2be05550de2d3106d3a6ec8e2cd52f97fa41697ab15fdce770492351e6533a7129fcc81008520f26a8c6c9bc6eb828ce525d673c0e7895720f605c2f6f1d355ab7b6d0eedf65e30d4e5d237367e11ae4b35f7d5a0b333913f35eea81e706cbc79069a7601314b2ba5055ba1bfb0c755440360d95126e9630850df768355b41c5fc57f56f758d3869a8e4c0477ad54af742cd2542f3e08397c99a2bc8a8416f01580a7859268646c7ce54ac1fbac15cef7c6a6ee7c1d2e251a7b6f98b0863241e7e776d9edfadd5d83a84bc5c3a5b5ec2e4e43735e74640168465b97aedd19dc1913b292834a485653e20c7e7872517b13df1207acee064284f3729dc3c6e29b992e5d28e8ee679e7a5b8ae1a5badb829cc0c3a9890564a7036367c624d55cc1360e26286ff4874c6705a7d83897e5130ac7c4b2f0e34b3b338999de33ffa35930fe57ca7c027b4c3583549cc643dce1a6ac8e8ebd3fe9092cb0e62eb1d920708d45b0a4f02de28fdf402186dc3c40ff5525e2841cbe806a34916db678ccd03ea43bfc5303c33942e142551dae1b961da7468c7b323078a9b3b76b4209abe30ec7265f009babc3a5646a31d631d5ff3b0a6a14a5cc22422d3c9ae77231a83c7b4a18144051ee2ae8e5a0e3ca337c293e15fa7569c45c2b45f12c5150d732afa7fbbf9c323c68979742631b610358985124ac13bbd535cf445b380e2f0149cf99477af7b1f8c3d2854751c10281ed0a8654389e468106bea720cd8c00eb3a65fefde718979400cf788408fe740c02314533e3820e4ac011ee0f19bc8c5f18e2bd901f15e0c7807ffa1c296f93aaa93e48e81641a3024df63ed1b13d8896e7ce9c362424c6a8ad47ad0489c26a4b9ecd44db0cda80667349db3cdc6c4175ca48758392588d64db569bc4c524651bf4a083d6dee596ff1b1a383e28f0b11d7a623ae90640b5f98b47243babe0d59cd7d6a45b78521cc55bf1bafea2ccfa55cf829ca73204613c297e4b9ef2ae71d4ee49be48bc7ecb99b4691532328d1c7d8c6b770a4c78e49dbd91e46bee5d096cd97c272bda60a2b3f535a23509da09d22f92c252584aeb9a03acd1a12800b189a47543c558bf6a20bb672ad4312e34601532b401981b25732013b79b2359512152a065005de1931e52e4c7a1cd5c94294f98eee8d80dee920f4ca68505540f8e7b0456d76c9721fdef0af8c4e0cf0c52ae9ce188f07eb109bbc64e9d35f8e56592c09d1c1cce6e1b4ea7db47dd652a1a2dfde1ce79cbaec4ce7c22453c4ecc176d9e04ad6acb3559e874526bdb0de54e245aeef3e51e1d0e07d9b41db40a55e9b249505282bb05933e49769d4bac55347cc836d13f1bab7ae8df24dc37e8cbe9bbaee6349220b644a1e54c4a587fb7e6d0b00904b795d7f60fcc13c11fa919a5cdd534551e5417eeb98436332d10d8258eaa40826e18af6313eda646059a39d85edc146ce14dd1124569c62fa1267184b4f70b053f549df3f4316190840bb1f18ec647f395abebb8caa23e0b8b74fcbbaa7bcc07cc2760e184a4d4b1af1bbe77ffb0a4aa613c7cb44b175ec83d610aea1661a4e5ddf6cd99002714d71615ca05031a6d44baa6fdce48b3479c7bdf2ea51c27ac0d03559997b098c91cbfa8beb141b6f1a39e531456fef85eacdffd20107d859885de2e5925fba02a194a06b1253a935293687df92cf85028c546893191d284581d188d36860c3a362c97e9bed0e6c7cf84f29fc293eaed863045de0c57aba265b5914e47addc8d335d991c012561b407f1658cad733cd27b1c8dbc92c3b69c434fac51fb7e00f40eb3a5e9189d243ab4c329cdd65b822fa547ba4372708d23c6225516b15b82fd24fd9a9fbeb05ae04fca31c669b502970ef47064243418229f1639a8870e7c7990daf94fddaa0ca291ba2927ed4bf24784a500c477a224c934c4d69914e00ce13b80039e2d635995c6aca04f77fbeb13fd833677470473710895552dfc8513e1d5b4b6adbcd4ae0e60e583b42522de4275402db5f394f6e81c5c669d41b7642e10916453c4bd7bfc8a3526317b921320e3db4d80b97f2b692e59745ac6b602fcbc072889a06ca16b18b12d16d264a2127520d179546c51c61c0fb8ad8f8fc78e3881e5ba9f7d2b0140873072593c2bf0663e82c8615f4ac14a1442c776ef03c20f0e0435551acc92e9f2fa539431a38b0db2201b786c9f46a6e38409e197cdae830709b272cf7e4c6c810d36bf517b9577f52e12387484098c81b475a32ce689f561ec7bb7015428b4a84da33e4731bc5e06244d51f0a609c0c55d82ceeb85520308d2ed9ba8f6a1add3f92094c8c980f314e6996c4830d2d507b538aa40bd7a30dadfc26a7dec561ed817c882b58cb3d93dfeaf92f4f0469057633cde4774c3eec7c9c1ec844c44eff4b544648357bc393ceb8f78f1f4edf1fd36e3c0345aa7abd0a443f3a13e5703cfa795d700e13bf144e525618c2bed5304ddd7d262e5a32e3ef41565c673719c83958d4f86ee2f581a77c7584a3db8f6e8df273cbfd2687d5f7c7f413cb4031172bae869b79107b43ed6f7d8db342eb12544d321eac33d14761d9873e94d7b5cfa4717afe381d8c3a10a4b55646078d70d27ed78bb5e39e428cafeb0a5f65cfe8e30665a53bbbe57e138750f753666290cb00dc8495eaeeca4ff81393154f161368b61179521cf1073b10eb0a6bb78ff8d6e3e78890b64acb7d934beaf84bb5379906b2aa21cf1d80ac90ddde9573981c8217cc23f3479afcae50bd991e42c31ef8e1b9aefd2687d2f77b4e1c4fcb3efa8dda5dbd5b6f72cb9423f0e8e1f599a79c540f7df4643dc4bbd3044d30b6d87875ddb53df6d1cb2ef14cc415808f3de131c3edb802b06b81f464f11297517c809b89a70c080452ab51d34b178fe06f112214f2e8cda7d6b05309cf1f86aab586ec562580dc62ceab4c55fe13af1393499509e9a63820bcff85e9ef7d35e1a5b6f82edc3b2bf055a765229ad609cde0bf9764824068a270765241311c2ddac2b9380d310ff34ab85b4897d56dff1e1b1e5ee88cccfa3a92f2d520d36a2d0fd23d306943e9b5fec603fa8b963a30d2c30b412273ea30a4d49427f418f80ea55d2f413557d452dcfb49814f391115ba9c0d89af186e1a68cb16ae4239d9233020facd3581c357fc296d0f0c347794210769a2639926a6a305b20134cd361392c0fc1b64b6305e9265dd5f3b22b0680572604eb22f48cca022837df5ce34d692cf471f0332e7e73cb98875d3c1d53e8393f24da7e2dd9a1f7a2d6789d2e29ea08d6604aae2aad7c8a0cce22defd0d7eaf7abd57d8035442fa953ceab4f0b11ed7efb6333f5abefba766b43739b52aca80830a716009c644e9e674606ad2a9e12e1d80cd9604969be5f411ca9304176583242abb384b1d6f2189ef1a4e7547fef7527d539675db04224c4be9cc3656af9ac09bf3ca335458912122c6c1d5e5fa7f8e11efd7d25e352a19014d308614f19e02c153612437a1e7558b02339665158326bc94944df8537b38ad81ead2199af40340e4fd376b44d856bbabd30ccc5def1a2bb1e3e358f7719453c9752f3006301f0b528ab8956ec0609463a2e1ccb803dc5a09976949a8fbe9704996f339e15888d236e488b25705e15f0861ba4faa3860e7cd77840a2221cb80ae1154ff1c96c07128808f32fe6048bb25a68f6e0d60183a523def4d0c8e32bac37e704942c1549d50033c600cf6d101823c109e09a605ace977bf04c6a0d6914de6395b984c816a55ee80be60ab26ff601ee6646175ace5d418365dbe3329bc01b502c81292df0319070f6da1cf953378e67fd313d2c842d9588ec10ab7b8b153324cf71e0c137c6068389254b2d839edbe98840f9a781f9c620622430150cae63bdb1343ba2e9fed6583fc32203be93294c4fa60b5f260f59c381d9713387f6b70787030034b0e3dd9c47cc4a7ace071e5ce91f0225322b5a17d611edbd1ce270dd73ca596988a5a0b348cd3e6202c984078f62460e0bc4025699e45e171ce580cda1d9cefcaf0a23b0c33e86e8eea36c054e7d9c1b70ffc32ff5fe0c86893ce8290d4af44e14c8b33e156a889260e88b5a7474baca54d7e04a6509c00860791bbd5ab257b4dfe7c57927e6a0a34200a6c86f9a53eb496ef7e4126fa3d7213b14043beb9806322baabf652514cea09a3f74c2fc96c71230d597d5f77f4ae1e9be27ebc7549a4f56019eb57ba5415dfa880e10236575859c7282cc6b164a8e27af5a4e9b8445dd2db904b335e970b03e2101fded152bf946201c5836fd3fd14524bafb78587d32a8c1dee08a3a4aa462cce88b3e65ca3590c794f756dc24ecd73a5399d9891c7c0f955b44c05c9fb7cbd956928a4e7b91575b64899a2bb69871e9c7186256134db2158cd915bc2960da7121e486ff21afbefe1d3de06ffb8583b9f20b7af184aebab180b40964436fd5e3900ac235da8ccae0a1a0701e0cd7ed4bd6a098aa8fe2088156f0f1f15280eab971146a56b455c3419ac3ca3ae1e6ca2598949a19c7536e159917f8bd6d6d14266eb6b14132cebf98e093e1e7a56868f0d4b424ba3eca870aaa56b3205e36f9b6b671cd01178f249bf0ea7a5cebaa13a64a20930db89c024bfd8bd59141cc69a23d5b8151bbaab191d55c6720f4c6f65faba56bc4743c863edcbd48642660e44cd8b267de3b923608dce8292bc76bd0bbe33912dc283c10a3c3f5854767022267823d7ba6bd8f3441e0669e1292e3d2213de05751f6874da08768c6e6281d42a1420e6591d500e82f6f0ba0ea2d0c6dc606c7d06bb405c3e2c627e39acd933c7396e005929b4f39867ce295841f5604f8a868d91a2260c9214d4f998adc07764dc175c79b884586b72774043de6ba3b3f2f0e9199a94b2626cc171e99b8019726a63205d773e12a0eff5e67ff10c8751ada269d463f24dc80fad0b166804a214e8fcf5552b8fa28af11a0d4d3e8c92834ecb982961e6237fcd382ff65799c227aee5f125e0b4cf73fd83fdee34763936b8e5b1c9be5b9397579764794df3becfb55215d466a489021c10d8a674e0b701bfd391256f9da77f2de660ee23d31ce8d37dbfabcae38b1c373306108a3013f0129bf1f58a37d325bcbb5ac38fe0e23d04c6756965c5974a97230eb745f464e9a0aba4ed6fcf4736c6879f6f4f5c012f0ebcab21e277ab1e7b5402c2d5113917ec6fcda1ea9a094efcac95613608e3525f0a74c602113faaea5e872d781a561a4a8dd58f3d563648a72f30f6ec620bcf6862c3a42961b94d5230c06fcea5c5ac6f5e53dbb0a0e5c272d6cc9157b9fc707c9f4b044317498c93020b8501ea995528f138fa09f0b81e25dc254c1dac7d77a20b27156fe7f9aad929c0798839fd2af7dbc7be5405564301d74dba91d7551759c3887e313b2c37d2af0bb7072c7b6cdf2a904ff3fe590a9d81de1b5a0987d03255c0bfb5fe135ecead0ecdf54e098ba8cf8423219b2bdd42f56ce9b955f0547fa3b7400ea39c84e9bdd34d33ddea814780a3c1c800c980cfc6a6bc4bd72646998399beb76f1f34d947ccfdb4c55fab526762cb9aa04a119260a02b22ae6dc5eedaf38a34ac237aefda3c5c4276cbf2cf554c41c2c041ddb8b707023cde32ae0061e985a62dfc372d5d7a42a79dc96a2204194ecb418da905e5db662f4df27d2635bf1ad173a10670fafc731e35b459cc90c63406ad23102be96a33eb2382b01e0a417c372875f1dc098c3a1385fa81da37a8cc506482b8923e240b9bf2a2a60c569a779cef18a5fea058361e0755d534021971a6ca799421d5ee9e44a911f40cb680244461d248ab0a7a2f4800e4c8e30f2f41c167b4aad4c3e7c8e11273d1978250d2cd0ff6ca95dfe204e50b5b1d9609bf5e0163993a26d3ca033292c4c16a60c7976672cf1f0877b5188c9a8ef782dc034a39c043186cffd7de30ca1f89cd8ff20489aa59c93b22928de36f340937d5630091c02c1069062da0874c98a979f6cf38a2eca4d0906d4ba39690646ae6832797c87364812934ffa8c1123dd65eead0cb8138a6d31382c50d9c4c1a6594d599c62d91578f8df31f72103853e45a171b2750205e6fe57689c8eecd7706f1006292ab4af20868406e886757f13af5d399ff7270bf73a18a24586df54446a6794620e7f0b652e45be9a039bb36fc0589f539fc9612849115e5ca3ba9b21f6c44a8eaf64f91960b5fc62a7900817e8a28b3465ce50e8dcad9ed12932b8a5bd148be2ff5024b1ae5ef995aea4c060c520660ef75b972b61b58ffc0f5cb57073e021d136e5ffde884b4f1dcba02cc9a1642ec4a8f621b99c6751af0babd17baee9a429e9bf4d7aaae49301475c76d11d4a2f6e1b35a0f31fca2669984ed00e8e4c57b466e2d8908096fa1424a1b92718fdf9e81e1c84ee4a3b8e873a22fb83b4b93228b542c79d59f458a837613a9a85448f4541e11124b4861018cb7e53348f30547be35d4e1d35f182da664880d252985c56a1b944fb054c50ebfb5830d3feb290f9d963b9b02e1f4d098ac48b2c4ffd6e20dbf8b748a854ec8a9a1613709f905c23049f21774ddc7e8904b70bef2f853ab4b8f98f29657718170b5129c2f6a6fbe79b730871ceead378c7c129b7f0b9120b3ab0b69c2485f6c5a5e1b965a3f023bcdf942232e9e76c11dc2dec72a12134f81c3c1b4cb15c18e159b23a9bd88a9b96d49d484f5e6e5abcb80e4d29c25b149abfaf32cccb6d7fa0ed527486850e20cc0602efd5959482c43b9f3f52079edb75127b06a2929c95f71c4a492dff8c4c52cd294405a5088144a4192472f38fa4f8e348f0d2760e2949e4f50240c8953ff901821eb64c36639e21c20ab3cc8c00675861689e910338420b6a165a17e1c0e4c801de82555e93673542498ccf05cbfd06898a3257e605fa776e0e006cb7ea0b765c39a021ddb02faa7b76034151340016a13cf39a5530b7122ad37000cc128e7b67cef4d8fad63a72714f6082bbbfb4cb5ab28896920f38c78edf9890d1e6dc759ea5e629f91a3600190823446fa99be751dc2e0b5482824371fab2b5dfa17a936a5dbbcd81d275a64871fea0477ee56aaa69e385a0f30ab0e63f5ba3173f9a1e6de077788106e46cb607c1e3494461d92ad913781eb7e68ee6fca1927b7866a3dad09952f058fbf9868e38e91f3e09fb96d1ecb7b1668f33719c39c22884f86ad638a205b13a14ad2391bcc7ed2a284e955d762123c76eb5b67d6d3ef13d0ad5075c23e2f12ba08fe2d79805fe809e313388406ee7ceb3211dfe9f359f7bd2851521e1190c00f01abd0bf872e279568460ead9f91ff8e110146811a2b70ec5582af1582391d24a246417a4d87ec9fb44ea89b4872da62bb11329328a64394462348f305a71ece9d57f1c7cf17472f2bd2f492ad8d1a48a740ec9a56f41dee6397a6e198be262c580fc41d219fdb8833a6bf2952a4b7f9e04951c017b7ac17477b927e4ac6cf4ba519e4d10a255de7d907d9db39c04c16e0789ed02762b15d758c9dab52621c8a1d8dcb7154a158da0d8cc6cb68752a1922a87f1ddbda5b35e836d48bb3f065828452234e9135dfe70cb6f2d9fe549997af8789c32a9b1ec01fe2cfbdcd6eefda69c2d35dbedfc2d578c030838e31a0654197b66d5201d6ebec720fb9d58e9cd5a09343360a081f3922b945d79c44a53e2845e24a2c4c50df4ae39d9ef084f8ffa2218ac283522054d61924f76f0034ce89ebe5a593fc00b1cbcfa90a41e79f0e34e0f727170a5f18a05b336be3cc5f4b81ccc09aaea61d9413fa159f67df76337370aeca287e4ccc1d619be89887104a6ba454c503b7a9c7f9efb4d279dd95c5b2ccba78b621e40e682abd6e96d9bd273e240df1263921507c8e19837648923b605cda8f46904e30156543f4a8947329723757727e4325d267051986680124a6f90e496bd3b95c93e1c36a45412dad91504a17e96518c3047c88621682058755e99e50f21ef99c4ada380cb11a0a5de144a10daa065a25a3f0521515efc4fccb0863fa6c33f1720030a2b188ed6aea3defb38df2d72bcfa8bf397b0172664ced74563206cb720df65eb5620c651ea70480ba7f6a27d44469f4d3c8b90dd53304b4038cc0b368db4a699a3173f6976066782d913535464a7656b618a6fdc6e17a69031f99cdf98eccd5511ddc5e277e94984a8dd6fd5d17137751a0b20dc5c8c06ca052d9d7af7d862502873a20e6d9c0496a8261a86f35b51f008036e0de9911664b92fc9ceca21847c6a6117b2af4605dbd92f1e654d652c759bd0d41f1034fbcd09b782485332eb8617d56b5318b6126126de8a1f3f0306e102a60cec7f147d3c81e5856bc5769418ad8ca7bc90e86457abc75772b0a56ebae62e0ff22e8aaae9073b37e8dc5b10e56360c04e694377193438360428e9f0b642054aa62189edfa908402ba833dbbf58dd338070235b7bf546ab1b44fac003b1662374092d352110c93a2071dcca8cfe898c589bbe716951afc2c213a4f3819d3363f16796bad2980299718dd0cade97321c186be210de7284a7ff4401f0bfad8279de767e39cf6384090c89a1676c56610139015c0364ed35ed77a0740cce8c7259171f423dd1934511750ee3905680889219f23b91a63cd588fd2cade83fb1a3d2319b184df5cd1951c10239625c39213d049fb741859afd01ade918723270b749aecfeca5d028eb63436fd356ef3600d0ccf45493ff0409b0ae9314c6a74524da532ef09cd562d74ee8aa7e9fd8a39ac14c7e5f636cf4fcc61a529ee8dfd6f01fbe7e4adf520d8fcc169ea33c38e65899afe5a009961f261f03227089da8b6e43ab2362f2c773f42d689ab176e563e05b75cad668ba81c5845887800bdc281691c81fe993bb07fa8cdd51db84d2b897ebfde36ef2273371237c93206addc59c44f0f23c85bd207eaea9ed2c0d162a03541cf75a35dcd9996ea07193c4ed9d0b6aa1f0e99f5d671d8e8cde61f9c9198deb1e3533ed4bf2cecdf827d2a241afafa7825ba126ade9e8c1b80f473a6c432785283876da69e67add9693e061af17440a85458160fa1fbc9678f1c4dbb71f1683a32dc969091353c31108369c76d30dba6c05f4ef04c725239628d21d4505021f95bdb243c6ad5a3dc3db01752652dd98d113f0cc239002539117243bc65bc41027250d194c1580c62c7dda9de8507f4e6b55d3f64ca23034d0a5c5d4f091b672859bb44e8cc93fdf127ab00cb303d31f0f1febe7e8b95058d09e12f512585c58e92034ac711bc7a474748b93f65fe2e7460af3868983e4cbb20d97797a5fc938825a02fd9e73345db0823e49be25a3d65b8d5e1c361c5521c1dbe409c9891d89dc8dc139d01166c4f9685caca3279ced22176dd13cfc219c9a1ad037a85049c1c0c9ea80f4b86994b518ddf16e67c45beb2df5e67fc0d078c6473d4857487fbd218e0d48d298ad85de5aa79cae5619a8cd1e2fcb874f59373439b2b74d96516659dafc6aed43fa90f3ccb95a9e4476f8812610e37921d254feba6d583f23ee4b1e403cc51c92cd2d52e5dd395d9148abba6a76c8f521fdff8fa26b70be34dc7ea84d472b4f3dfdaa2d0ddd1695674b73cbbd4317390fa7aa7ded66978c5c15f84fdc699f1178272cebef50e1efa0735361241cd086b06092bd7507c40564ff05f452bcee89ef5148159c67fd91651ff7c63d784270861e70ad2d6e810ec8077802799970dbf4f87c28e4a4ffb05e5d435ce55be2455ff92b79a58c490985f1ca05645c044baad5aabc555e536ecbb92f5e8402cb32d88c0da1518f488dcb59412edf57ea529905a1b5723e23c373670f042804c7d35d097a931c44483a2bc8dbae9f8f1e2b4687abaa5b131063d0ef10f264f696ce6290ca41d2fa46a6590e485f0992cf092cdcec7ced119013eba13cb00f77abe1d9540be7ce12cbee4367b0b41c8ee8a02a721bb7dfa671ab9c3a6160bc4ff7e1af1cadebf8cc1ff4917b200d9c1608d42fcc3dc718b08f48c031a2d7921f48e037a53ad83207d30d917a256203c5a77a5b37793cdc2b683d5418a0f873bf4fdb83dce2ff11cfce040c9e5cdb3ce7680590d490a44866bf02e49f1f1a41b1f234faeec462243a05dbe45d98c6ed66346f5210d2ee7a7f763c7ec086b09e444298ca86526d544c4ccab0bc82738f6157ff02a8c29a4884e82439374301b6b4aedc03630fda3d828145ffbbafb5d930b7ce61f37c199c3d0aada0698b4e053199cc284c89dc89574931f1fb2bd8f9bbf840e1b34c5127236eac06440b3eeeec6c19f1032d1a89b249c827cbd880acfb8f2df93977dc00a512841f59b44556c56fb59b46e846d68ba380b066880ad4eb21de288a43a859f77608ba6a99b53879740fe248652e8763351aa552739187a3a4d8fc840ab6e8e0c2b48e7ff7aec2ca42d9ba5a9c23dead52809eb6ff812cc3e132705af0f515dcd79581c494744a1813524e33062a044586f18d0939a14617db474e59dd7711657a6a5cb9608627aae37f0be012fc5ab06ecb3a80abfca87c810d3bf51d309eef09e231d380962753ebf32a48b6695265e76a2d7d102a30047aed9aa83df569d85daf104168bd968a997db6100de2deb4906e166c106bc0de5c723cdcc65b55b884c04f1bd5c1c84c90893d0b25ca16b80ad0048e84076505a5847477191b9b485d749e6b13dd052e5925dd2e15e074034a11412418f0780f2469808cac91f4a36498895b4dbc29ca865db9476f7c2479ac7bce1e6354ba5df2a816e3f79fa05232092b3da7d4040bf7e6721539f9f318f21dae0f894a7305113474ea8d7c5769860b93e2ac659ce86f8518b41400611554021486ffe2d7141a57ef7157b9c955beb441392d4b62414cdd1716fac0ce24ee888fbb3dcbab18a286e3ffa5457eecfbbad78b93e6bea27ccc00da06720c7b6e3907eb47d16bf2bdadf3a455dd650688f1b12f61661dae47afb47f176a426ce330d9e49b4c5e62c7c08159b8ec965f959bc4eb0114471258ee7abe0f4356ff27e2d5d76717eadde03cafdd4b3e80a123093bcc25ea6a0c059339b7d0015056fc3cdf4b531101b28eaa74a45f8be19c0add7f5e56a6151698cf4d39795c38d83c614bce6ac0d5a59363f8a7e3e53eaf2cccb3d9c115c63cb4cc922ea801f30056a41b071b462efaf13375e78bb4020ab6c46c913da9ac0d1279ef146771ec21be2ab8027dca115d922500f56f3dd86b4d244ef9551c8b69040893f737d4b21d2e719eeb4d88d92e6f1f0dfdb415f2f0c97bbd1ce0aba4804d12461239000a535bc1c249853b0c02569e58123dddee84b5e03d4d46948dd443acb010ed536d6589859912374ef9beb815cd012b5e95866f718c0803100330656b7f200737912221244ce5bc3a372b2c5c05ea0efd5b3bdd983e3664bae67e6ce401d81c7c87485672b9ff449a8f403b4243024f2938a506e05cd03b8e2d2b7cefe7f4b3abe2f971a7c3bf48125ab0721c465634b8a5f249deaa90173f09a6b1d8df7e4a425fc78334a520a8837d42c07ee4ecc7a110efb80d76e464b686e8b26fda3e441c10c9441bcd57aaef7b24a5ed228d19a184fff2f6a7ae3f665e42e5d76ec32b2f73c7f45f36d55eef505cbd64faea021f5f7c2aeac64622ea05f555e25503c0b0e6b090d6ea62169aed9956fca5c0db00249accee70a16242bbc7c804dbeff615db23c9fb0d76acd30da7354214e7a02a5d56eb48788da370750a40127c9f2f77f01bc3bfd7b3771cfe05b49b834b6008678c60540756fc2b0f61395cd8b95ebe7d2cf06a05a00e0491b827825894e530681f7d347b54141c4308d5236cfac02e95639c24f508e733f531360c7dcde9c5dfb8fa13ac15f4fee0561df2e6ec0ef1f8840e4e572c82c16e184a3ca0f1b4e1d4d3f8e46ec988998b0010867f780f6f72b6aa984b5f516e4b0426b1a3447b8d6949457ca05f78ad2e9e5a21f63f309be36912cd32d00e66d864e70ffa20bc9689d21c287a7b3847a06aafa26432bedd5ed92be50828fd530de4d00a6a2e08bea1e00ecb93be9222d3532f69de5695eac2d5d985f3e50a1400d5e39ad995f87dbd096ef109fbf52607acc76af431d4a4fed7dc72c79681b390adf5b101e9cca1c7b8abd0ed1472e9c8d587a1452878036c8d4fc8f8cb19f4cc43dc5e388b24e61b74032ee5e9c057f35df5e42e178e1839f5775a7d65fcb6c9a38c34b4228dce6dc372f7399dbfdb67414b7c2a5290e9c8300fa1647cd4195da6d6bb273130901aed370f0e4abe5fae617fc1564c691b4d5d8b79a6757c6bf0d02b83348b7d9b7549261ff9a51ed73a223b56b3b61670786ff21a542a0b258da879bdfe7d0001e34e0af6c7736ffe82a5aa9d1ab5bf1fa001e12a2fc75fbacb72e7f72d67502b151fef4cd407bc355dd21c236b3d8202dd2e88e5f9c74c56474690ba5729b7eb9512566f1c75a33c7b45f35436604448704ec1d8679e621f9e54346dd6ef6044f2eaa6eceddf68cdc8da610156fff439404b180ebdbbe36d343090cfaf71152afcd59465c1ae7c28e3e4bea180349ca874fca4d990ec0440175878eb7b81dbc26c3649541ab60c935b767cd8a77fb86715a00cfa38f8f9b3cfc40641f46ae928159414d86b79c5f5592773184831489bcfc54bbed4266d9ce5ebc56d3fa05f742c57021b4470e798a754cf7e3f59b2b10a358645dbbf0c27dfe9bb5372dddf8c1f8efa8bc9f91b357100e4a9f3eefa93e674d25a02223aaf3b660e3f6b99132ce287cdde5f6285999b510a06a90a47aea07592d01e9af65b8ef801e2469c5e2e3f123edabd60e193c0808b90e1b0c1d7181735774c4985b473902cbea31ce80c119ef14c1d195a1bd5ad00f209f43c6520537d4a91b59fb120f906f45b6ca16f9862c09d7690cff94a130304ab3a2cb9c6cbc3e8e88c610011c6aa809bc6cdc8923fa9bbc3eff4c72a5e5f48b646eb48c70370745a4d0b3b4f8ea88b665d9b256791085d9a61bb288314521b8cd8a38b1c2f6afa9de35a44dccc2c342112a753e2863b5bec20db1b132039f312e4590769765e2eca23001866aa86fc72aab09a593c5718a7c555662b92bef3237ec3500b47c7e1de2dc16bc980b48931374cbd1aa9aa83e8566a89d16bcb212409f13f8d3738717a09717359e1027f11c680d9061219573cd9432e08db769c0617c4587d05320e5ee39646139366c7dd763f50399c5319c1914c839258ba034441191df26ffcd2038a509d57ec114eceeee9bfaec1bb6e5dcb3131064fe3c8cdc40bb5e72515aaca3cd2b597a18250840a43e99561d9447bc88d97ba91fd9b310fae581540c6de1928963c4fe294d4462d845048bb70d8e7e2abcac1c14077f22875bb24b68c6d683fd38e88f2f33d96d6851fb821aa097924765f86e5db77982c518fa86ac9ca55028d1b6af02c6aaa731aa076ce0679fe58981e109178087e82a99b67513bed750ebe8c105b6f5ec7b31c0e66f0053beeefa672ff4c4c282c4fdde31bcc458e744ac347115e3bf104e91ff507932c9ba406c52c006f204bccea7dd95ae9b9fe5f4ba3310a52b697d31fcb8a2ad4f1d711856e1fe874d6d3642045a6719d904d3d8d0be4c64e05b5101e3a5e52c3a08919718a90ecdbd1cbe1aa84e51d8bb22c992d2a6ad94990a7e4ad83e04f671919ea3780d402fbce630073b2da6ad19c1e2ffab5dba3ef5b4cfceff03d3230bb9c3d52ae56f0a9f5b0623490795e77242d495362626e9e61397a2bea18a09356b2d96d92f79c4a5678243e48f028a732563821eb636b9f186c4d954bf6750efdf33c8a6869f9c10f96cfa9a2bf3cccdc052b1bd9db7c2b060781bd736f6c6c1cdea9471f860454a56809edd10335e8457a9f38b27f0ab096012f755121eff6687a7a3c009ad034719f1db4f7a9d7ef6ec91eac5bc51363f080de07bffefc0f4722ba6e85145226960b437af88af09cfe9120790bb35000585ac5325f457c3b4050e603e1fa52c2b5956edb8a7acca366d9fa8bd2a6b1738888938af50d03ed84fffaf2535b3785dd24d40cbaf618d8be811796de5fdc1bc5c8d2b94c704ee28807c06334f2b6e14dee65412ef4dcd6098a77f0ad0260a9a8e0a8ad07f68648026ccf560dde3347d49118da838a2f1f20845ec5ebc6554a2e2a550baa7a916c232507d43701be5b3e12ccd2e12712161e3d2d12f26c3d2a3a6a65db93d32f2b1db17667cd9242e50155f97dccf25dbb4af8185ae25b4213e8b689f5b67a0a207f99c682b59cd3ce2f67a334e650ca793c60fb96ddd2f753e08cd82ab6efa3078db38f9a9158721118faf86f43441250b5d890c54f1206df28f69d73df67347a347187ab481e3e099e203034b872791b960b644107cde75405b3a805416a927a8adc295def739cc2ff691d71963752936c97e7fde517bf0abff0636cd2f32b83b0f31ec6b33e915614d1b6c5978e79d0b089b2cddf887ec0cbcb77847e6c6a6acf2b57d1e681e060e3c2bba32a58289cf4743296247e2389fa4266b1bb28c30d0accc6268d1010522acdddc156d7efd548afe6c0b1ee751ba32c7bdf059e1edb3c82bccf544a6a6e8914622ac742e31e7386749cc0e3828ce4f8031f5a88fad36894c062b1fa5d9ae2fdec7a9a831aeeb01221b6450cba47aaf8d589566a05473e042aeb62a2f81bc9f9bd6f9e551c885c4a2e770d0264bb20345e31e47c3439d38c3a6b64fadab0c9f94e68159fedec81001011e21775759a312b5a6ef0b10691dd4ff44a478c98b61d14ef3f25e2913a7580797253a238fa4549172975acd911e3f8224bac00ca4e965ef0f407cf2e5db5033723f2136b04d896de60075d7b3db046cbc8fc0280d8aa55af4959fb5dcb5eb3b884dcb342214dd5e321f7c00fbb6c695a857ad964250ef440b986f6aac15e5e55f0c8c505f048b4d471b62e8cfa9f40c6a5412f7b349864947d0660f0d3d925385a2a99e7e295e3dc2769e286a323ad55d6eb11d5dffa72b5cc5263cfb1a29373da4791b76a03868c7f746c97dc84ccd8d1fa80a55de5308094c29620252228209578afa0d6ba7ad68f2ef883747356bef240438bad51617ceba88f8ec690365cd28133e3ef7694f01f5fed8f30044e3296cbbe27db655fe3d5c2ae9c583701f0f3c09ea88a4c34063d7e1ea56e86797a96b40b26470d37f1944bdf140abe82cf71273707d688724f84c4d9c12a94d766fd7185ae40850ac5b92f99cd7cd3a035921dba9ba2a01c067932dd76c58b5ec0521d7e2cd067d85dc426120281bdeff8a318151223846b7837531d7a6fb0ae6839064adcc4b069f4c2f11dd4d02738a18819420204162124cb19caf91c19c2273106509c269fad03d4b123998296606a39460984e0fbda72423833945e620ca1284d3f4a1679da186275912000c8fb4113cee556cd70a0afac9fe2c43beb86164761c71495043fe8a411b651af3f003bbd236eecb2d8a28e91909b49c8430f96927444e597f4b35be510ca749da8dcb37392bdb6224814527cf28f98a11c04b73c7f11ebe32493ef4af5eaff59ff1cbb1008711010dff712b8071381c2d9c1345b227c058047ced497cf94ff4f520322c4f55b9ce830f19ab04b001e37a5244b572134ff45df431f6b177cdcd41db760e6745abfcff88921f768b8c1152691730deb66c8fb234a1e5d870b681b86d422738871ddf34f82ee0482bedc6b7b13d0b355f4b1b3166bfc4b93919bbe81ab2a9fce6ba8bc1bb7fedd8c3d0525490875a865272d23f6b8f65e47dc67c9856ddcfedb0dbcbbac32c75320d25f64f20595b165b406f85be55c61934f0bd0aa6684e86b5ae64177c3c3ffc61bc2cce5f015193b212d42599fc8597cd4cbc75ac64b1f58557b58645eaf72360ff6e6254404c4c2bbca16ccae8e707d949bdc0d98b4f387c6bb9d72f2b7f428bfd9afb9bfa59635f40a8df7545b1bcf8a5c9de0751b27a4179d1485e535e3d039a11d0818c76817025dc51f3093cb706f24640f34f6ce7e8c6e3c1af67b431c71c3b4d68d09965b98d9a3bbd8387a331377e8cd40544a9e4ead1140fb6d2856f30205acc073e10d9f2ac07a5d1d850f4d5e69d8f611ef357cde25fcce526803cf839b2e0245632898bb3fd71af6bfc4e40af828431f886d36e7460d57774674f76a7058ff9f228596b9439cb5da7f02ad160fb6a8f7ee971d0e06fe2a40313798f78b0197d3170c97035f446cf9d6aca99719949698d01226d906ef383226fc5907e2e985c568deba67f28b9ed2775c02e7531bc95ccc85256b2f2fda4d604243462679b5f10d9bec9bbf561c6cf04023444577063dbfc09ffa0f1e122e2eabf7e393f11b20845737e4096ac9096052d221cd5e7c2bda893604315959d25cad89b1575a5649bb2ce5dbee386f65f558156f1a43c1b5bb14e843ca777e7bb9c35e8b6b7a6d80454344735eb4bf5a8045a720e2754b00594ddb6ca295aab1fb37fa35fbce3edd6e6b32e3a7ec6c3cd5041af3afb9494a18aedb671c68b3a5d201a6745629f7e3401238b698aea7d0afbb81d8fa8bcb09299d02b98ff9dc86b78d1220fb8d773ee9a34d7b19c9461b7c0870d754933e137403c4ae5b7ad68e5645f00b1c8ed000c8c1499778b06033011636cc9be0c684a97aea7d82b20b42700509584ce3f0b0675dbebd15ed05907798402869a5d5d8f6150e5ea4619e72b3ed33c42bc40b2b272442958124730216e60cbe2b969d4e332811e7a54e8ae13dae3e2fe9a981a5150ae0087e71c0c59f8595ebd6c07c602211ac0bc4a657f00839c87ebc390f6da14cd57a46835fe8b6cabff078ebd56dc1291261ae8353957d0433036428df4763165e6437120ec51520c1783b5abb8ec9ed8b887c92c66ad1ed7c1b4ef9d0caaf2b6f7ae21101f1c06d5906513896d146aad4eac3db7d8f5dc7a3d970c8e0bb0562e8884a285a175de0abcaca5a901e4cc7a135c35682e841a23f300c894c90aac4b5df0a21f3b2446869a5298f3b2a63875ff8e87184ed9426d098c8134d26109ed280f0d095bd52b6cd34f4093926115f545e3fcf65ee250ab12c3aa69b88cdeea202600350685872db45cefab5a8d3be78d7d0139cb373cca17817611ec13f2406a675d9ba8863c8943614eca133aa2c4ab450b7170b5110720b58835a5de592c5acda7c352fd676468ad9a6906af139cee3b0f817115bb9e3aa006ad7e541c906149e852078fb6595097857e94d8eea63873031a65602dc930b25723924023378621f9e7247dfac5c6037b795092dd17c9dab80975322d2ad5b0c8e24e77f16e336645d2d3ce3db9416545e849ff8ae90cc4803dbd40a5ab4456a6ad9392c926f1e95d229e9053c9f0d8201b7f180c02c5d84bc3323271981d266a592f78462ed9980f90c548c1a8e1ee1f033c8b38d14ac5c703fa85c43e5ebc6cb4638cd721a9ec0c3b0f4119c4a409dc9d12df50001e5e26c85d7113777bf2341137f6cee2b2558ae9a24af54b032fb3372a93014f5b52422691089289c04a9c5b00e61c93a7cd66ef90dc6675f087b44216320990f0e52156e6f02d4a0bc987f0b4bb0a850c5eff431424b0720e204e2c268c9405315415da43c6578c20fe82f89c5977d6186bfbdd4160fe42033d8e5a40904f44c94bf4a209638e51971fd3e267727ca5bd23dd6924640df7fba6562892117b4e6cb422070b665cff41a987b690382130ad1142993077f6d68e67041e80734c6c747c01f8b3cb81daa61033f3f8bc35fddb339c5dc4c244ad77f9b15b02158ce0aa5c8923e82942e438b232e16cd86213d349949d8a21359d148b6f588eaaa120c118820cb888385645699c5d822f61b977c938d3e7309c1bdb139be297659e3e9b2b554a92e934ea8719ecc35f14ee02e9fef4461b04761611caa23d7d5d37736ec271dcea28b7624c6f3d892e44352e00d793648d6be1034f253cc485fc5e373e06599e2cb381a64f67957415226ae095ef0a0d8ef853dae90efb841845cdc62d9937a9fd7a213479c92070e171f2294476d26233e251d53b110b82424ddaf858f26a266d806c4c15d72bc770d98cbc29ee13c8570116b55129b3fbea39a0060c45058ac904466fde1830759d059f168c69760023c4983260a9a993bc3195b6173f56abd93fd7fa6949c3282468abe35ede0ba1f8587d7b8fe7a5edcb8781011e1c96d6b9ad56ae0a4f83d12a1c85ed3c85e9ec8900c6997fd16d42b0510565048946a49341685c3d663a3f100a430ebc5240dcec11a5acace3e8ddceec5362f1b5e8ef4c9d2ec231dc3c00d122c67fabbb870ae09500033e3465290c362b9ca550b5ea605bde75733747a9860f87a3c7cd4b0bd925255cc4952ede2b2c03d35794a49e6458f3ccd551fe162ee339ba595ce12445f3f91655586441d27e90a88d061b6ba72f8bf853c5a7a8840289255bafaac5f2b337e3abd9baaeb15bd29ff4bb8aed9b80baaf4886c4f68cfb90e5974fff43a4357af6778a042824480f18705f1684230c9e8335007618ee7b6bebffff3f017600670267cd2ac702ec50d0a33c3541a10bd5e2d6f2710c824f28c0cf077728dc2e03e99a0e27d5a88c3c64cfe085d3948ae7a47e0d7dc03946fe24f41a085843e2cfefcb06e0e33f9431b22bafc254baba0ff4bd93026a5b66ef76a8ade80083953124e7d32ddacd1f2f36de041e1d6bb78a38c2930c84ae2790fa513fed263675a3c1ddad992dc34668a0222a907e17e610f8cc0e47cf93a7813f2c6f0ede330d332f7d4351596ff6672bce72d044e390ce2e847a5f2f5104b96bae9994c29dadf9a18b938d4c9e923fc5875e19e96a64111786ca96f4f7147a61d437ac18953c74e6b829cd14296f3d0505d9cfb025132fe96e1eacf20bc9d13437fd55254bbcc88e8010f37db2dc4e3365bb1dc922c5179b65ea780fd68123caad95d24813d08404a832b82fdd3d8cdb5fc4bf2c6a80e1d60167674cd7e7ea262d47401c1552853930a1395ab4589784725b03c70c1305246f7f9a1dc69629fa3ca3e18191d9e3dd0ed6ae71bbc153fdc75c2f33b40a638fd895fe75a594ebd49bfb31791a96c4ca89f9ea9db0e7f16d30e3001a68eea65911383f69840f3d8b29b2a25588f8818386d4aa9d826e54a41173716be9e1e72a1084686bc8e81f6f982979e8a8ccdcc789e0946d7a5158274e98d400c88bf2e194d6f62c6c26a3b7d22faa625f3e0ae05d3b8ccf44dc384101bd97b08d1b2c911607610833a085449e8522f9a49769c5c028a161f4a670360f706f8691a80f7953c92c58b5fdfee8e14af2be479dafeac898ff70223ebaf883fcca409699b7e60ee4cd505d2b81b232310707850f3a32acc3ec44addf7221762cf9c638d43d151c77584749d75eb2e639bd3886c46511d30edb0a0796fb46cab4950c62547c6606fa510219e18e6c038d59564eb5bc044055f07563b9f75eb6b969167bc03a10de756c5307ee27d6ebd2673fe29623784de13817933c254213f10902a7113d248150b9439f8a474ec32c51f04b88a6a329c74fdaad342c3a2171d1342708da18fa4eca191a91fcfcdab3f76edb250222c193a64cac6802b7e071a4ee92510d576ca0eeaa4b4f2a02219b76732958a0b83dd4b53ac1108be6c11a51f8fc4a08bd156130e253bb8ac981415522e84a4944cec1bd7c6be018c14216ca6b6c9a1d5511d2a4ce78db4327e4f62e740e9dec39574647e09d651ed88208f3e13bb9121021e68fc5265e4e47c17820999e880f2c36b77578d4f7e1c3a2d793cf2af1de5b666cedce8007dd4d9bf0706592ebf42a6c7f845a86e50ae4ddb6a5abf22fc497711af70b82153a316f62b1d1e2623015c61c04a9bc7cad53f938e570ef090d1a728791c6f78e83745de0c9e08a63d72ef22ba23f85201c13381d5d36fbdc7a7b1e9c8eafa604409b77d7f489f8ebd9f99789c4ffb6e2d3fed7e924ea3e0c98bc4ad69b49c96a9c2e1afc72fe66ab18bdf783b471b04b3f67cbc942fd309c42bcb018b4c61ff0ff13a8282e11145b70d3aefdba15f772235699dbd5ff635ad1065999b90ab97e6c41dd0086a95186b5bbca2e3ae87cc0d81f371834ef145a78650980f0ac653f729b97d519a93dd47b6f68d65e13cb1d1bd52b40d71b9f094644b31d53c8ea37ea584ab0d59cea18a53246e77ecd6a5c41e2ba3fa6475d3815f66c2d7d866f0cc852911e4e4af8fc67fad4082561053743a78fb0479c58bca47c6bc0418f16faa0cf7ceeb6bf0bf34475207adad893f83e3848b4f377d3302939177ed8377027d4a3cf51c1558f75c7fdb88c0aec7f6ed71a8ecb153b6459192ec8d8507abad896cffb1b575893a1271a7f061917ba24427fd3c2409c4da84bd50fe8fdf75b42361fd7d8c5fb1e50f8d2d1115820fa9ec8342acc898ed687da22c778533f808bc0051c15067ec08d47148d413526b6de52cc3aa0b5f85bb55e983fafb5497229a0ccb2e451c42b3a9e1c97f592c0c7b33372891158bd92b8d2255ad28422c3b692e9cd1852d3c5208df6d5da97bfb864c1cc51f06c77abaed0111b47c86a1c0186b5cda2b63c3106c4bd7d149e5053905209607dbc311af53e4c1b3692b6de0569a11e6976f3d8193620c28043f27345f423a9d887f2436ccea9a1af24311f526b8ad4c90987afca3a054a36a276602ba7611444fadb588778e2a25f8e14c2eacf3dadb28f4777fd045c01fac6cad1453709fc10f643475be5152fc254221bde775680fa2fb50997623138a97c289415cac9c2be143c40c871e322fa4d631f401afb1f159f40f4c905413f18c8f9f7626459f46362b42bfcd1fb14ac5d0964fb25cb13a27638dbc68d026009edbc7295a9775051b316a27e363b3c90473570ab513eaea028b052e2f0b746c51c015cd4091afafd564ce1517e5df196387627f9a12384c3b97ffe27bb3c677a60922926c06620857dcb4fee7d644e443150244be8cda44032e3b143c2f04b2ab55f92ed67ca6bd1b8c067201fd5a03ea5f52f638c8d84f45275658905cb708525f48fb00a2c88567ed5bcce99bd51885c0c34ee08a0b05ac9bedb4af29e9f0739a04430e012211555d1f2947ed50d3a85a102b58b9d4d3f92fc7c4db121bfb86dcbbc2d4f4a404b4da2c2cee07866ebfcd0ddfe0cf5abfaaf57848e0dc3e0907dacc8ff8df58557be0c8f1044751f0d3dd8d99cc281223e060a0ca89bd867e65490f973397628729fc4af5df5f3a0413b3335ffd78474cadca0ebe3b2ea54932d56492a18ed5c27634fd1c335159319e4237a8cea2961f6c856e45b4ccae6c3a8cff9f2285c0b2df081c0abb2f5c5638d4383d21f883391f8665e11a4a90a05972d14f1a31c722928a22d8a96470ef2edaf2ba671cc8490ea5664a72f0c35915829f086cf92c26cb6bf900d2075efd04c1e84698bd02c06126a6e114b99b32b432dc2f25172380218610b3d48799f25ba38e82b918b603bf7bd261fcbb87ba735ecbc32ea7185063533a3d6e058b95fa4680d3a86fc525ffdbcaf94180d57bab3a4898d6daa77339e7d0c132e3aaf51af883c22bfb0f0a1946e116148e581bb26f2a89c83c197524a917d71a06aaf3ba5a802ec1f1d9ef1e7d2e6a2ce9ea65258b3f942847cba88f959c68ed859686407ac161c92d92e8d62e40231c90d8e405d7f43e0ab506777f7561fd28d506e1d4c3cb861e5d6dbbe5a4ffb92cfd2c04599ce955b2c7f0b8c201e6d490dbccea20bb0f8de42b7845bc022c03f255a618374fa427a0b8320e3ec2ad6f1a105d7c88a6766038c76a34538589dddd6b5ca6f932dbf537ac3480fe68e3968b8372970366701650741c70ff30c4fd24119909c1839b4524589af369a706f2bff6deca133aff407dfb1caa220f5e24567f91d2110eaa03fcb23fd3f9ea2019c4a77b25d2a9731120e2bf09eb3d1a3ea10300428d5e5724b4e9b602118710b06b95b12448e1302efcdc5e8aa7eebedbd0ebdec3cbbc3510a3c5a9a54e66aa660f43c54267f9bb5255235a90eb56c3f8f0b3bc5c325965e2707a37b25c9d01596259d19063383e9c7956955d2ecd3ccee9174c498b661da086005b30ba31682da6c9888232b97c0105f01edd3dde235097fd386b08d106ca5c3372d5a8a42e09a32818d48e9c5a2cf6c354c8c16564c8341055bb2b7b599e26af58c6747c00bbd2b02ccf1f06d9a49445a73c966f3243e17cdb110a2436ea82f6289b0b2c154a61fa9a82b337907dfc4716f9c6056f981bba63719472c21a38f22634312365313f06683d6c6fc35630f92f89505afe58acd33ecd35b09c309fa08eb9f4ccf623b9f53a72716cb9faee50db0d1ca4d2e5fcaa23b24b72b6b0b2c924c496508c1511eac1fcba0c4b14ae0290aa1739d23b9f132317619d7260f8b6a0d869ef84c40dd2f23be00dcd1fe12467ff79f5b7c46aa81827317a68af105b152d8afb2e536260701c3d349ba2b2bfe33a94d91918337de747a966586177236c46e7505a76e85d4b7ee69b84358b1388dab3ee41dcca2ba036e9e80d7b886ace8b9c0d7ee7c22751a29bdd6155cc22b4558ec942a69109efb64a514de11a2af2570248741442f35127d1ba31760173a1addc27aeae1c48c2a03bfd7834c453d547211124413ce798a730ed7225b018e1d15706dba4bc60105aa283f030f672999455432e4a897beb122c63b50184284912b849b2135151ee6eadc467c89047861321cdd0ca76992d51d42658aca67f950a2484749c2149bea7ea312e14d94f3b198f3bc72fb7e9b468897f30477f796ea2570229eb94b2a67864ce338f2d9c57d2001746203aa56fa775a3090b29a0e2c6a347f5696a778e89aebddf2389fad8d822bb83cabb6897897a8caf55a7f4a07706c6305ed124b80550fe1814a18c85260373549dc0da6a0bf77cfcdc409e77bb4611fdec066d16462d27ad392b6b79432a594021707de074c07a9ea79bf7db75a6d1ecfaa6395f7d18ead5eebfd6a95e2ea7da9df71a15095f278f80877d0cf7d38ce7c843de0671a4d52d993496afc9ec5938b2df51e65483795b7fa90478fdafabde17e198c1fd375726e28e985e0b5033d0874e538af842225308221063abce0491660cc766d1cc03dfd988f6b6db984a82a0b7c752c0552ca6dac538543bc2f7ac75deabb9fca3d3f8a03e3e79ad1f55a425b2ccde8b626e4628c11d544353e711b9bd3446e133fc658abf14154cdbf899c730fe552f5a7d2314faa1e6b7b53e4363ec2570946a358ab3edb88aed0301a71348a2c88478dc39c51c4a2dbdd5d17a230a216a02ed20be2a81dab5f86e190065500814c5085f81090601cc2b5259341fd993b0b20fe1d5106eadfaf92a92fa2ca24dbb68130d5abd0fd7c15b8e3088501e97e7e17bf48e52f54d52115f52914ea13a2aa9ccb472d75fcbc23d23ef6ad43f3aed727a50ce92c52e33744cab8dcdcbc4c8bfaddd4cb5fee564a81612fd56e26ff42dd1b679ba98fa98fa663b10623b8bd3a965453a9d483b03505a6be4845bdfcb8221c38b903f93bbec55d19690d22900e0377dfdd75ff5d775fdfdd3d5aee432925277f67aca190dddde52dbbcdc847364a894283eb9741ec7ac8f97c9f8e929cdca49453baab3a36e79ceeebcfdd080b64bf4115f6e7cf47c915b22a0f14a2aafb51f5bc2a30f2abbeeb381518724da122a8c2feaafefd53a8ef50a91490aeccadabc05015f6a746d857fd7aceb3e2bfaf40ea81aa9ffffc0da92b4455e93bd7361c0a546184fe0555f8426ea5fae2a78aef7daa8f8f12a2fa54e8fea7764f6b54a962acaaf77ef5711ff9bb6f6bddf1d4a7020b3f353e070a1952fb990517e2b57f6b7b5d85451048ff7effab86fbfd5e774f745d7ff3bdbddda7bb7bfbd73e9f93548eb2b5e7f1f8b70b3de706269992bbf945da749fce600423c79329250407ddb64c1a485144a92f9a266f780826c3319b7904597c5fe038989564614e92c59b76821a9865a02a5f21aa257ca1ba91cec9902c65f0e5c139c0d25e94dc913ab9eceeeeee4988408bbb6bc18259e66a1d37c8b26ce3f415ab30a0609e724e99a5a80aedba485488a8ae97d745a2124455d545a2b243ec22ebdeca5cf446a292a44a30a4dcee8c59d658deb0a2c88a24b662688a105592aa38c95439aa1ee02a0bac5a94a75a141f6ac7eaf7a00a12350fb8ee479e4a74777e34d5fd9e157e3a27a5b4485298ea32d590a4b051c36d4242d2a186eb255ca5e84c23171a7250ddda0a82ea54a24269d4ba5411aa220400781cd59a2c7921c06c8f721e4141654a0f42d49dd2c3931a4107a0ea563f105887d87fd99c555a6a4d942601385183135c6aff3f11852b294094258f550455afc2a8ba8d47f7e81e4115a2bb47f7f8a8c8d5aeb7daf9ac5d94b593b176d36bb7a1a218514a29254d8dbb2233f315ec7143d5cc9cf9928f02eadbf8b37d2f09ba3ab60295f911322fd8504d51ba42866ddb361c7458d9028639e79c9d1771c458a1a286feecc24b142b3f2819f122a5a1f822055fb420084c83fb284a7844c9217e4d1335a839ea2235b1a5862fdb86e8505650fed055a98a6b66ee586c266e8faef5d11be734cba34747e11fe9c6e4ca21d5bfa5bb37693826c77d8c4b388e9963f7c871fccd1923e74b98bfc8f6f28bcfb33246191de47cf4d81b8e51e6eeeebe354fd331f68d2027435555cdaf93d942f96598a837c3a8712aca6dc741130e9175fbf9fe28540a854ac9450077207f03973b40fd5c047007f3b74f4ad492ddead6f9c98dfbf25751afa911544281b8498afb7d1ab55317eceef7342f175571be1cb70bb3030dff6b988ceee67e8edded8d46175d069121f9691d7bcbb66262b8d28ec5999531c0134b2815050d394963e64d688ba9542a3048e6d0328c906b0f5a1f1d186e476fa4c07033f28202c3ada8cb461472bd0db5941c6ae3108627b437476f140dad6a31767777b7516d2fc9517fab9a2594d404162a94a8e8e2325a123b16e3cb15638c4cbaf81ba58c320888002ad33ae68294bb437eba6ee6093953a3213331132b3196c669cee3d9e6d631958ef96fad63ee04ed388e93cd3351501f726d8b1d637fd1a478f413345ca7ca463647e6ab67791d6a0810c767236b33a46d9c05866c44f52d3c30e421aa2b998099547f0e0cb906065a0109ea5a01483b06eb5fa4122cc11ae422f71edbee8d6e6bbadddddded524874919860fa20bcd534cef6dbeb6cdb6fb416f2a85b8fbaa1b0ebbb6dbf6ddbf7efcdf6a923fa75f3319430f9f5c1c3bedbee38427fe9a9c1a725ceddddddeb269f5e2f4a8378056b239f9790520ab924072a978aaa0cf9897b922fb73056d43828707b0e9c60b77d2db09cbf7dfc24a3a0aa1fe857b97250308f8e49a9002985fcf828a420e4024c935eaa0ce2a314f331639e6381b5911fa31205262123789d08ca3b3fdcbd0fe88903b9bbbbd39ea0ecf9ef3cd7e9bfd3e31e083f3a367bbebf9e1d1a6891ba3b3f368f67f34408c30f2a27e06683ca329bb3f3fc31fceb3bedd447351ed5206e13dfc98b9cb6c5e8149f9f68414344457ba4b4c4d44e9ee34115246ab3f8fde424ab3156638dff758d46ab1def320cc87c9f208c2b52a311fd58fbe254a51b6de954d188fed7a51748b22a958a3b0995cfb2ae99776f76b7bd79bd8daeabe9d87ad782e672b88db2a401e5ee6e17a26331d7cccee316c24ca23d26112577726e1e8fc720fc9d38375434bc54479893358dc3fd8a9c01782c53658f873ab6a463dc84077bc0386c074a7808719b0a6aeb10121252b239324fe2e5840651bb0455b6372ca0fca12c0ae5dcdd39599d4c158c2a24b437610845dfe2e0d862e2fb690183bad3cd01911674b9a0216ba956396852f9bf933ac6556841c3176c1986ba60ad71600ef0aefcac24cfe1198b4a655691141a7295d554798903a2167ab200aa9255a5dca0e6f34695cfe494c51235dc37aa94bfc5cf52a54c017df9a3713ee6dcc34c0089ec7b173f19c1a01fcc847d7f0789ccd83ba1049e356f8d2caa82d1e8662fee9e42ed6721afda5ec6d6621759c57354334932358eced66d62f04ceae9494aea494adaacd07093faf5448d8f5f0d9f41435992925c924cf2656ee33f5fe639e06ccb82f2330c88d7f8710475f7a65165742eea8a89ec32c68ddfd76566d0dd37ba4f22e4b30ad59fa36cf72c26e8a24b884b4af98291c9224b39b7e3142f4a5ffce290bef042a3dde0c465b94189972049026102d78b87a0b659a11f3c0cc517143d70e47eecf0f463884691b27071c376ac87283f7aa0d22f3598bedb818b123f70f124898b222e88644e560a14fc00451625a0b0b1c5174034861f4cbc64b1b2c5052598c10b23340611cc28c2862349868890d245d00bc6e48a23267aa8c10937b870b265e5848d1c362755a6932b46d41083ca16329af45046154b4600ad8cc8a1862d9c2c4d275a6648835be3c9d720ade1c31a499464db94f2fbcd092911890b90e4d0050d11d42139422131411092232492248c7c3bd1450f3c62fc97ec6bbab0a10b192297837be164a50bead54572a252c3a74e3831c181484e2a40d26d80b1264d2b29945517c989e88a93d0c79c82bec6e586510d5f2667582abd6ddb11572cf1700597185ce1658502dad1b4a03990b08c2801b1024329054f74d645523aeaa2f484cb0d198390b52c880732284aa886a586d51a54d645c21234059619ea0e57dc50b5aeac51e3bb5eb22b5c5ca952c3974527e3c52f3896685b6cd1460e54a62ed2165bbc3428d3164b5f13eb226d31430d5f06850f3c280c9c6f73db3624af8efda0a1b6548464c5862512d490be7434649367023258b1841116b8518515b3a9c59c92c362469441f67591b048515350488f61007591b250523b20742a63e1b2b183ba485c60a9adba48589e505ea2f5076255a1df93967b42a129c812ed22095e0db8c4800ca718cc008d590465de57aa2c8b1abeb0d43076a5863a58d47093acd4709794fa8aba14e5072941c0c164082eb3b6629594686222a2c112364c31eb7fcfc1401bb5a32672606389a45987610414146cf183510f4766fd3b9e83001f9210c1c60f6500b1c3acc80e5b808e58e20444280165a6e354c3185996c2a082c40c8c230533681943056d04316b9a54d2fd4d879a1fc1adf1948c6c10b272021d6e886e94c11935e18414c7162c648894a6c0e0430de90d2328dae8e246b536b6d4624811d5dc20c288982528a129b424b4146c4c5368533011828b4a444accb0d1942062d2c38603955f53a1d2c9c9caa6e4f465db948cc4a841bca90d79d950464e92c68059f20453ab2d7112b2c1a9c6a4082e524e00a03545a2251eadd6049428eabe0a08215e4a484034692724209850422ac11257f7db89090b2e28a62f48d47d55152c9a142c54685c1cc124e50a50dd8f1f6706f5ba4ff354b7eef7e4bc6a484a4e75b7adb851c3ad754658d850c3ada2e9eef08d0da231a563c5de802a09654288b94bc5a0a771b6c674be63fbfaa0f6d374acbd1c4d688fe621cbb13eb6c696a2062ea2b82656b957bfd6ddbd53715f0c4156a38e2f14e5f16c9b2742918afaae93a897ed85208bbfa17e878e2ff253284f842231c7dec4efbe99bde10e22ea1754750cc5a00ac51149971b6ae874e898744ce6779d0e207c35756e9476d835fe7850c31d84a0ce09d3fa8e09dd8eb54036bea8b4b97dd57a6e81bb37303fb80367c5a8740d6b1ce02274cc3f867aff1f2f4a534b8537f62a7ca1b2e035823d37d08e45550b5c85d4c042a0757b5ab789430c317451a6e83a6e8eb5cb1c79934d75df87e454d1b0b95c4cb4888666ffe543755745036dd5ab5e45030d69dda902ca208561c51627a5373f4de522925d47bce005cb51a12157819eb4c072bf7ffbfd38307cf71ce06008b4fad3fa02ad0ee184d4540f5188dd4a68a0e108dde72319e8962fbbdbdbdbbb63c7f6eed8b1bd3b766cef8e1dbbdd39a023715f4a29a594524a29a594524a29a594524a29a594524a292567443a89fbdb717f7683a190d79cdb9cdb942fe3149af193b28a36d24922a86324f2244a9284061ad8089954e5934c9249dd547d28ce6eea26a0de50c8abeec72e28c4a51eef21ebd83a601bec5f20f9a51788361872d006f150b73532c89a3628f49dfd999f83e1f7c2dfbc11baca2043714253303b1e531e07050a07c5f3589ffac25853ccf455df6a512893820c457a205086c21e6c65e9f170c72a1a9b3f9dd0f82f247932ca1143610194a32618281f1d1dc9284f15708d840a2715a5547195fa988209b9a6ba9af23c9e546af53b1ec3b8d3405420fd18c41ec0fc0ae651cf791ed8c18021735e080192eb6ab4f9818d7fd75bdd7416f47e68914e9253a6337f9bdfab639d04f33bdd4092921ee03a302bef97e585f546528f8e21a197cc263dc524edf8e4ebf856a997f950effa541ff3753bbe9dc5080df5b09e584e492c27204f4ad819cc37d8f30101712f1f68fbd5c322385bdc6afbd58c84adfabbd0e3cb05d37a4cd6ff509005fac80f02a4fa2ef528eeb7f9b247101456a02d353d05f5e8c892645d117e2155a4a3b76271ad1edca471f8e5364bb1758aa1c97f7ddce7f8b69ff9e6bb6462bc9d96f976e68a79790e0709fdeb7798fdf5add6aa56ab0589a9b5daaceed462cc8ac5b57ebf5b312010d07c6eb5a22d10d6a08ffcd53659df938591207ff526c85f758fd6b79382dbb8938eacb61d8b32a0986f7d7b301256bfbdcf0ae67f627ef530a00feb27f8d37ad6af7e7eac97dbb726071269d1f49c90820bb49de7a26a8c6e6b6068e8f3f7c0de5ff694838358c8a3f9e4c3beed777cabd7f1b13e47cbe372b4643ab21328c8ee3299ceb6fddcb62732b95d0ad27a4abbf5336663fa302d100868f5f28158bfc539e97c1ff973fb613de13ae62ffaaef26041e697b01ee7339f5bfdfc067d5aac6f7d91996c3dfd64658f8510b8c23c7b41e4772708c1451dd3a1a04c5665647be39f2aa2cd032361be7c135adbb70827b80d2d48833d331f6e12d0ba0dcc8b3d800581f5bafc067db81fea36aee7bec88c7eb1729e23dfe5fa1999ede5ff3ca1ff13f31bb84e411ff91cf8c3b9c0ed89c4c8ed5b20110e5c10163faf5b8f137464558cbc2bd293d297e73c593d7f0735edfb9002e04356e2e0698e36f8909b76c042fee4ff379f83eff500f858bfc127f3345f8e877daedfb1d3dfb7b3ff76c6c1b733007c3bdbe0db59d3829222c8421c14d40b901fbe28ea539fc5e6bcdbac8f57b5b238add4772e05fdeedd04f9dc4fee2791eda5378d5aa8f3d18ef84bec8d3313bc44f41d9b089df330bfdfd338addf3fc1735253a7a38ef700d758c2ce76804040f25f0f349ff531dba68393bfbd8ffced05ca97e00f0b0c02eeb88de7f866be15645cab6fabcc6340d6acf5d18d351f798e6b6dfaa8ce822cc1526aeb838fac48e12494fab8c86dbc0a0df928dc5a6d1c5fd5984ae3c4ef7a76b67fff1552aff2e7d98ee7ec2c49e989b5fa22b7b3f8a3e6364a4c4e9cc44bfe2a7ee2a39e1d3ee252ad27f8e5394f5c32cffff1693ea49bb4e3c355caf161ecf5e132853a341ff7b00ff53bbe98d7f1c17c8e0f265f1f4cae3e989cf960f2bd19ecdbd98e6f673956dfce3a16f21c176835be50940163e0d787ed531ef21cd8823012b867bd09a8a72091f9a86781449ef8cc47a19e087d0e84ed8c462d5482b220332f7380bd89b21a11c036f1c354dd03ec4d9401657b133de749093b9b791ad379cf99cf7a58ff56992f6167ab127636030201c53cf740308ffa8e7f3d5883416891d956197082b0a6efc33dfd8979ee1bf4413d7d0afec03cea89fc0ef52d03939171bdac4752dd6a7c148474ce8c510f51aa30baa2d694cc9071c5e7258db3833ef73ef439f0e749ff06feb49e8230d9a0cf7c14f8c3fa19f3117942a48522c2026124d0473dac411fca7aee613eace79e05936090150804e46dcf4b3a164f4801f5adcf646e1387b8ab10f50bab221d3da58ddc6e71507f117a7eecf8d2ab8a1fcd2ba02928ffea439aa4fad3248dc3b3d77b2d64221d1fd2d7cc87cf72599dace36bfdeba33ff3c9bcf771cffa6011e683c54fc5ef7e67db078baffa9dad07eb9dd6f1edecf5ed6ce6db99f7ed0ce6db19abdb71ff1d06e90aa4344a4b1551595b885eb409d1fe6e13a2e1af26b037deda91aa2d0ab08d7f980a653a3a13d81bff555f41f977f41894398ed2d72b1693c974745a707dccb3c7c2ea63c0f5587081b09ef2e3370e0b25ec0c0848e65b0fc43dfd15086b30c87c7f1a58ffcc17993d913f5bbfbd4febb7cf11c66aeb43aae3ae77aeba7c77b9bbdce56eb3fa2eaa7ef06cce04b64af5a6135245d0d6d3dfbd89799867bd8b7bf93ff365b8ed4bd8d9f6331f7f9ee4007de8cf803f1c088bbffdcee8ffc880b0d87ad7c7a95a6fc2fc1648e4890febe5138101d7e7ce4c904f41222c70dd66052e088b60100f0402523d50ea81b89f0fd43d10ea81b6973b1d230a2bb8cdc7426ee3dc938a874ee03ae61e8bf00ba822cdada8ec76376f64f62d38a0492922882f3c78510326244a336c48b49048bc98456080a3062f6b08a1435119b30d8c2fc25071d92c4da84832c41834fc60c42c6ae9c2888700a3736666f6e6715575de4890b32073823f2fccb84f8773ee7e45d70208db02085d5b30a167fdec5512e48ce79cf3f75b8f9f146af0e7851983fe82774771a3f5c14f7bc36a4145abf2bb3a0cf42b77ef1e3f31b82570739c092919585fbe7cf97282c37c54cf7a16f8b302b9067a20278126c4201dcc47f5a922b3f9edf9a85e05aedb70adbad27a24f0ac035f6e1363309ffd592f32ebe21746237f8a5fe8b59ae77450123fb590dbb8c72667258f4bd53d1af991d73cc9979cc99bdcc99f222d0ac5a148148ba2513c52f21c37024376e2265eaa1eb9fb1b84b91b45a7d99e926e6b4237aad1697de87830eb7e4c45f3095b651ddbb654b7ec4f0586dc4a95877a0ff52a549702bf635b4ddd3877ff886a7fd26dcd4c8df27b1efba3b7f2bc95e7795e8c1ed45c8c91a317d99927a27cd97d3274efc5b8d3de8742752147845655a94ef56ddf815c4d656d144a96ea7a4058d5d9d1e042435ad725d0ed6c63b7effeda1b2e27f26f5050a2d4dc50734b71286ec80a4cb677a7b727a8cf23ddab55afe565e665def70f77a707a453a9ed795da89b0b1deb0d1c02021a9d36ae30a463fda896563afe8ebbedc07fbd69156c21fe10aea2f6c69f0748a4d1501b634f7e3c5bfbfb406fed41c065b3affa17e4f6c6ffe381c91a79b68301c10ca02a9fbf8b31825268dd66524197d81c39248dac1449292a4b29a57a9751439bca8f627ed10d0c617677fd9342a8b5d9ff8c7414d5501249a6988673ec5b54c518e35c304c41cae0b52e6394ee93dbda25bb7331babba33aba4a87466989518bdc76a03c623139a70bb4e67f6e520b17b5b80b1c2ad52b68710777631c7fe28ad135ea031d9d96d47b3ad6dd4316e5d602e5119373fe406bbe9b9ba4e1a28b2e2aeed4b2a43a0ea132c81b9372048bdaa4ecee82edeedeee1eb7fbbbbb7d3b450b5f6d06e5ef2d8e5813f116a74daa213fa9d1440d9bd640df497a49ed1ea22d31130b8e80a25c496249921733d0a8212761a935642ccf45ddddc58bba6aae7b76f3e8028e1500f1a5cb16235d6ac8436838a92113b1107b461c4438e0a0469391a1599f51439d336a50dbb11051e1624350193228cdda8c335c50fb5d1bd2d45447c38beaee6918a99ec695ea6afc50773d2040ed9ef378bada343492a8a94ffde6f1a48a844802d4342b283b0bda666b94b6d9da46954b453d0f0a27f46f5ac738a881821ac783c20ea2719719ea6c3171d4737a92ac540254097344c36f5a738c46a3c550a37deb39f40c1c6a8cdd85869476ece5ae7e71af1ad2a6b9cd264d19b989aad7a6c3b4a0dbe2a0fbdddd227477774ff7ee8f8e71dfc0515ea5a813590b066d88d5c240356aff0e0eca4b87c7e359cc98a1368d3106000719ce71854b12b57f068518b729073698509a428c256698452e6fb4d1a2a8a1262db5b3a8fd324c44a3d18ea82a9023b498811a477a8083064d4d3a97c7d3311e8f0b20d258a9614d8d3c7a6c31428a1a9fdb22831a9fbe60d0438dff3048a3c68f4151e3cb16898ca71a91caa0a246a4261f6afc96c7139562802105e3f1b801c688a336c756daa03559c3c8952eb32ec38cd91d4357c5e951439a1a2a1850c31e3586612516461b62d4b07411c3cb1850d4f82b1dca4fd09ea60c169ec71363184c3ea81ddf606a83a6c6a399f2789c4989234d357e8ccf05510603690035765f9ce85c25366abf44e1557342892867d8e083123256d0b90c548b52edda1f3f8831c6a1951b400b10b53b4614628c31f220451833d8a043adcb2cc2a0c61863ecbea021ad4d3e9c3820c1175bea222925f1a88bf4c59124aa5cb4fd2b463f49875ba24cbe1464737acb92832f61403063497567027da963cc811feaf6405a62d40da67f9b889340689a48dfe4d09b22120db908b63d176bc31f46e50f9bc6a5f2af51f977466b215ffa8d6bd0977c697d3491116dc2e66ca2c68995bf85e0efa2c66155fe56e2209890bc58a2e96661d72af750cd26871f3449716a9c70912a4fa15109b70c21a0a122881a27642a458d13f2f3937fe15bbaf892bf01d4a386beb4a4865188ca63d4301ae1475e7376e2a4229ce641dd43d5888b7034b03e54545058904e52e29e8fdc8697a4506ce297419256f9a9f22fe84bcee44dee146931280ac5a148148be251acc5a4a8149722932f7d0b71fcdc9782db3435607d746fb0f95bb72d757e94ced687ecc08e513be03c54a95d83edd85e757d74e059f02f6f5421bb650a1255d49d62c4c45477ca0abca8bed4383b0589262abf7f31c54993aaa3ee142746953d086c3f7fbd119a561decc0e42f35821d98208ceb04774b9d1dd82d75fbed1d84f96ea9f2db2d357e35dfb1ffa07160311edcb21e4b4b1090443459baade9ae507f0e86a1ea0dd22b5b53689c05615cc77a8514d6c70c1739136d155e0c89b0236cce6b6d160c4e724258ec048de9d55debc2862838b06e316a87d10bee476077bda8fdde02dd1bf928d8366538c42b093d7350486e4ebae5e6e211d73cfad7ab0963bda914a796c531a3b86d4a146a65565d73f7c655f85319b4c2b448e54a451366b05fb07b03f5ba3295ba81f6739ddfb0473dd34caf2d95d4171aeed20915681cdae4a505cc71ddddbbfba31d6b2b688c31a680504ae8ff827b25b6442223593b602f1d31395c30b06f3ef7af6ffb1c5fea633ed4c37caa77ed748c2bb28a39b698e794ac972c22ab9f93e564d7ef74049294f400203daeb96a51c962cdc87c25eccc050201713f674010d6abf799bf9a727b291304e6bb19f32dd6b35cae18f087f572671dfd78266141562c1870f5811b69fd022dd271a544e4798cbb6ff0eeeea12c490793ce0b009ffc0dbef934df8c8e1d395e3bedeeee31eeeeb2218edb4022dbcfe7362eba7b74cf11e38e80ee3cc7ef73abdd6240d9deb88c3d16d68b5e8e99079aef8a1cb771ef2365fe6746c605c698d6f7243ecc473f58ac51a7e7841454ee8e0a9f33a8344e164545ca148d08000000f314000020100a07440291582098a7db661f14800b778c4476563818c6b220c76114c5188310228400030c21c618234435ab2000024e96d34835ab083a08923c5b152f05e88029fda1c00fb839c154ca57892de080791ddc7bbfd4e955b5707a88dded0d0c715efec74ba217eb6d7c934de876f42a065d28ec49d35eba0a574d2b7cfbbe83a3fb9877ba74684c49ed6326c2829ccd3368ccdb7b1ee85f6603dd47ce5cba8159c60fe4b43800b7280de94050aa8cdde407ac3100aa9ec8ec0c06905f9e68f376352097cd6eae66f5e213673cc9d2148d52549fc51b0a275083e2025ee3ad973f393241e4241389fc0d34d42dc90e01f48a38d650ba275922fe146c1bccd96a6dec4c8b0e0019e87b0407526ba3d44da888c59ebc87d6e41570867fd5ff858eaf708a92f873806a3284e4adc0c49d07b6987f27fae8c99004407a9844b4c1f61f86fd899cbf4ad5cbfe67d6b4ca195849983d4a309082bf7cbaa8dc6c7b91a5b6713fbffdd9f9274dbaae684daaab0c5c2b00f5d10fbd378f9489ad0a9644b89b91ff30a2d6455a6ffa55bd159ba273751f5927f8e5f3230d81d571f3bf040030ef4cb8d81cf17b47dd602527f9d0c8e1b8efaaabdaae3e9ef25849e91e0601fd480424dfc4fa099464a1eb90cd128c356191cabc777468c3062b0aa85c09b058712b1def0b0c073bf09e449f64d95836efa71bb00ec56ddd4bdd215d9ab25780f0d268d21766b92a56e742cf7ab069970fa85e231a00c771537a6b172b3a83b6ed5306e5beb7cb7c110a7d785676d7d0338a1ba9a1df139931223029196d024e9e2106f22a7ca6b4ece9cf2d0fd550dda0d312800c5e0aa1a3e42dbff08bda121fcaa7a7ba465920357f48ecccbaac3a579e63996a702207533b2402c21482ee7add7575db2ff15204a8c596a1981c4312d9dc785e935ee7a37b67aded854c9d97b965824f82b7dfb77a386b99d04061e8677a516209657f9798bcde75427b1dfda15524a5a649e81cf0d5c964920e0bf83c41127e07853413bc49b3c6f82d9478bbe9b5d555689fe94f266c94f0faac8749a020eed29883a448e4b52eb4a82862f3d337c2119020c8b220f34b1a1b0516afbcd9255568309472205db411949b5b3474db31fa2b086d9561084df5a6d4d8cca38636939cbe7cb1dc9aac8ddab454fa95566c9b31d6647b8058b07ad24a609830196cdf590fc93985b6e0bab9063b64326854261fe58e09c5bfde3be5f4fcf38199488f9ee03ab3172574d44396234dda0f29797a82a94b000f9ab886cd810af78fd628545e44c424e1e01e1982d7be914aa26661336fa08e5f781ae1023497acdb0d8f95d96e4032b66a5014775111d2e800af7bbc6dd4edd25279cefe56489bdef032229364f40833821b2dd96bf5f919e2184a958324684cc91b282c50b8505ff208abbd4d1d3e7be82c80320e82d1ed899aaf48ece60a93c04620106ae548559f4088cea6032791a7c9288e2a262b63804094557fb3bdbe01e46a2d45a1c3da0030e7a4f866179d9b415fb5a2cbaa147086a86602ca81f246e080dccfe3d688255b0793dad748906690537ea803859b8c1c2967fd90ed134353f6b475fe1705f3eb55463eea0cca48ce000f4cf48199846be311ef04dd0dbf9c4e9e0fbe6d2b706bb03802b43e95d98eb55e45c7108eba319547418c1899d43939cd1308bb9dc912117f2e4f9a25244633bc663d5963d6ed17cd891d21cac4c4da8ef601a8b0e70d683519f12c84b4caf833dbcc45a34cef0edc8aaef88d600a0da756ec820a5730f3d748d23de0db701c0ddcd97da4e553584534ed5238f72a45d832f0422da403e8a1f75825c57e531f48ca9ceff1de2253a2094839c3ae0967c2664b0242b827ee92c7175c17b6be18ff2342c4fcd3debd1d43272ad33b0233e4e3f9c4a8b5788e861a5ac8cdc5288994c47815763c150f02f7e0b2566ef7e38056026d7559b91c84fb0e14f07f8e350532d2ec9151355b8e960cdee6b105741eb7a6e19345e9970204f8c432041f31de1688e6393117390f6f8f3c229ddf210531b20ff907e798b35ea719854eee09944661d8eae3b447e9494776c9850ef6e6c77be62715ef432f16e4ed5fd3087da60d7d6c08cd89fdc1d3e77660a9c2dc1ee2988ec33ceed47fbc2e664a3d27897d0c8ab89b148fb427f7ad28f390009fb5d32aa3dff1fb91114924c34967ba753b2239ef9be16a41b5a85829890eaa96e7df2ca66ddf411060228a15a4ff0066500e440065582c0f480a453ee23a6c01d5c2b7c4079509742e4504e6b8ca65dfbe4e69cbd745811167770d2c8314d755eddc6bfa5e75f340431c24c6b92461b461ffed8c444158f206a8b895a71846de40a2683f689262e5edf73b64ebdfe0e18533b981925c19c27559deb8b57ee43151ef3202414bc48bd80ec91e86d9a2b06b353d9bddab7bd9388ac081e638803f201576c49ef1064c5ad336f658dabe84521bf00136faf28f639f31d2cb32e3122aca3652917578607be50b1794036f06cb8089bbf66ece029e0e89eefcb4363a0846496061c05aac440f62d292b343252b365786632cde428aa260c5eb488b583560004fb020b2bc270bf27c34f2347ef818199ecffef15c429e8fc559c00579deb36c4c2a05f23cfc016f90c844a5cbe6e2212c8f7d2dc2deffd36692219d964ac052a8fd39a2c61a5c6e0c1e24aa89820459d300da7865f34a903282fea9e4283448bfa92b563d6336d823180e281548763e05498000d58dac71c3f334c3827126217d126cda8d6f52d8e5654ff01066c5a81fe39db3802c1e6c8d1f444231d780be5297455a7d1c93209ab2038c2ae0a4aa875ade8cd1159b704c98a0a57cc832d57d5b748f163f40de9f729ad1e60397b96086fd4328702e97d0a339a145faa20c4052ef8466cda0dafbde33b913f7fd7d053501d822aa57e74cbaca8b1172806545e13e72812886a5b679bdd8d40b331760dbd73d63ef8520761004c6ab36a4445da9dec0ed6c150a8635eda6ac06d4f67c2357bbf9532f797e6634e9a1e6e82ad7e02e3e68e2cee30421595513c9445f34632c4e61d3e18519a68e15ca9408f4963ff6918b80032eb2707f5346f1a9e5d089d854d68e11e374dc7adf47da14fcff23f73310d8beed66f17b13f9e1291fb5d8d1abe9fdc801b02ecc2027844bdfaa0c3bf3cb40b0f9f5714d7b5be1ee3852df731691da354a95b83ba94171afeb4bf39785c4721f9e7b85b1151c6a6783be8d1c58a1bdffee6045754ad0d946c211631c109e0f3abcc948c08f1cdcb3be26ea467f0d1875a5b93f2dedb41023802264098c8b65ec43158ca6a99ded17ce2c812d3ad79faa7f4aed7a9c001331b1d1d8f6370b4c6140c5a061a2313d38cd9ef80929c44c64c75bcbdae59df36a6cb28fe19dc607b8b5611cd63074ea72109d25a027a2320c8dc6dc8f5cba989b2b541c4230808029d3dd3f949526698f51b04fe0a92d8a02865e47d2615cbcea0073e870e203402b991b9baf54c36557e4a45a0f271e04d848b80e1aeadc70edc29b912b0183a9cbce6d28e3b5d58930a84a400351e63454045a738eeb7d118b0101a97c1332d7ff171b41dbab2db96ac1c0bf56294b8ba90059020dbb9a28406d503b5af29765d233a9d2752aca417017c555ac3ba512d8c6e606fc6192a10a19eddf02e5d78b45bf8538f613ddef657478265d7f5fef5776e7ebb3bb118970d799fb2f6bba5f4663d3dbb49b4da24f6e24effed6127904ed2527a5a0bbb1c4753359063f616410b72b07d6cd0b9b13affd83aaccd2c120a407aa31b00f9efd04952877f8f6552f3064daed77f437acf524dacefec94ffda22b69778a2863fdc74530b61a107f690da111c8597b2e0e019d4376065a1fb7e8576bfcd33eacd3cd4db38ea1f6ebbfc5265fa9b227d4c7396c07771ae5bcb02fb434560d2c4b100f0858a1d22e94d3ebec5a820c62d9e36ee38f820799182f18db2d11f32e69f56c2eb3086dd3b5f526228caf8c6bae38d4a9de623b579aa47683436687c0df91dc9d1e2c75bb0c59ada332792f9e2be89dbbf5b72e3d479c8c0c719a327e08645f80062897a2e82885a9cdea4b7b9cc00675f320dbf312ffc4c9bcf3de1a89865418509f7fb9fb384def6e8b749bf4a2d83ecdb4a751f9a4813b1c280be2c39e7eb34b938b5e6b5d9a9d27d4c520d01fe29ebafc421ecd1652a477d18c9ede12900025c255a35885272bc0031e2ac5469842c491c34e218cd82d3a206fa8e67cde377fcd2f10fea917bc7d6c22674a1f1699af39226f9a3b2b6e32e0dfd33e1c03e7138fa2ed695e71186ddc66e011b3d680045237881a4eef907d4fff233fe31a44716a7f8525b657588bd14dc278b6437fcfcabc44451b8ec8656634f810bacb308060e75346d66d0f2b5aef52c3914c2bbe48514f06be6072871292b0332c14f9cf5a1404221b45aa637cbaa7462249ee0add36aa573751ff882c916c4704aedd1f0a3d4103f586762e7c0a183640a0d1fdacc3920b294f317274e64d44d06d302d6f80caf018565a7a0366abfa96ed4393273f7044fb16d746d17541da9969f70898298cae54626660ba7e81fbccfef92f8fc9014446b3ea009d429c13a19b1d53a7e39961523b1cbd4fb9364a3c6006e9c4b6a71aeeae9b3ee607352631c9c0f588585a0664309923aa75be521b50f3d2201eb76c0e38b36adeec3f51a001a7184073156f5931e73b9eb42b468e629b8f26cce07ea7a08bb445046f1dd0485b4aea68218f1e14f5b454052950444cbbca928b0c16822a867ddf3048c9efd7c65a9087100fccded140e45b1ce0ce7fb0598e8a11ca24ad6fbf6a9cbdf0edaa46244b96ef243db47439066a5aaea5e694b7493ea952cae9d91217509e1b5d2c65fe0584ec71905b69760230a8ac2e1ba9ada58df7abe45a6fe29f33e486cc72d6636eac2d743a061cf4b1fde1c2718081902932d30b647b5a662bbca57335bed668984e98f45a5d80261c6f4d8ab78faa8984b422618bdf595e705f344e14bea366b89f9b02aea78a836a7463bfffa5f7ce029d6fa7e13d0540f6c474146aa621254115f0988cbf6288f1a44ed02f44c0340d8547280b9860e10c62103a3e899b018052b98e6737af7296883658441c8c105ff04ed1e440e6bafcdf0fdee2c4eaae06db67e35ad728607a1d3451a2426e193631fabe6504738a752a7c6b73188f58cbd21b7ea39a511b61495bc8d7f357d9e3bb362157343812e7c53fc8feee020f6ab484c9b12b684ff1cdf9cfad89d50eb82539c55d7f53d7b8a88086db4812a36ab5fd723d27ea70fd71a1ff0bad58a01e8f8b85a304463adb512b4f3971950e74d192774ced8c7503041786016afd141b3e6535c2bd8d978c9151e59b48ab7b4d607c1918c19004937f617454d8dad7ed266bcaef72b52a00c6c6d38eaa74047931f93942d65b0a19c0b4e47fb482122933ed3dc81ec0902541010736184dc76644ae5d343e4707564ad975db78e7708d739f19ea7e4ac1bed733d9d1d4d6a42153859abb5d43e0ff1ec5836ba68af604153821e6b59f837fd95b30d0388bcd06f0c0ad11b1aa9302324ce0a2a8ffff36a037b4b13e19ab0158b6e42527fb9362cb195190c643d4e1f82a7d448539e481a679838ef9ec8660890c4fe28dfcd2805ed69354a891a8fea882ce2be5647501248fb5565255df570a88ca5f836bfdc0e1b3570b67a0c26130c96ea1733cf072d81e604ff21c033ae95fec5a0795920e2496a03c437c3223e27acc920843f409fd688516c1b9c0a8495051a9ae1a439097db2845083020dc336e0fd32ae7b1387d284f64a8eb5cc1f45eb825ffd2c6ac6896647f247eaccc92358393a14408264eb16efb10f23388699aed9b3fed8fa3e64d1b26fe20fe530c7c9c39156ef22de65991e7dd3bb6c52a337cdd922089810608392e63eae78b276ec14676787f632004762f4392941644ec2cf6587c9e92d2a27a3fd5f6e451b70b4c5cccb67f86d8bd9415a98904799ef8e5e774d3ccc49373e87c0fd51b57f1b84b60fa4b60e3b27856bb3c65bf56feae03c09d4b1d046944bd669a659aebfd54e2d5bf2c305522781cb4e8ba2a7623222f003eed302723bf37e204a82ffa6148dc23555087f9176e6e9956b0947a222fe5a555d60557bbe553e6ff108f226c90312cc0620f18f9e98de25c88dc40991556f3c1ed16807f7d368a3635611fff559326f8b8c5ccfc435c675cdfaa00a16b64850d81643ff98d1cfb69f180c8a05d6ca6d4fa2a3dfed4500a0b811135283d6210ecc3fe983712978d1e0f41777174aa162be7379b9b14cd0e12d00a522f272ae264f989d6ad487ce29fc85c79dd0d8e90bc5d3bfa3656cb88154726d4153370b04a61174d50c1a493d0b24ddb8b2e5675c6e0119e705dd48ae24a042bfe5636a23d0d6abc108a1f336ef063163f76b0fde44928db10f440820d1cc517e93328b652214b4bbb2b7de2de0cb0858ecd111294dba9d5a7b601ed631ddb8440a7f7de05b2c2089ff6c3d66c3710321e88e0df65a297e5c4ead8eaa3e54c50d9dc4343627d8729ed40ca75551827b25088264b081c5286580ab1e9268c6da03562883a6522a45fde5b10194d477ffaef0ae6fa17d2f49328be6b47d2a1f32232e99bea53fa75203db7de6b16281ce2876371073c9db6fa96efaa20436e402a8ab07e5471aa2c72a73f98924471ccb3af181ba37b269590b936032e5d1bd2eee88777f766ffca360e7596ede02760ad83bf68d3baff498f31282adc9f450e3bee06ac4e189543c68819d5f37665678ef2f560298a0ade895f8cf2225beee247fd206c297ce1215f43eb08c0b71cb66d08c7dbe7a2688d8dca3b6fc94cd6ffb1a6ec947fc15406f1a33b441cb5d65a1d6f8c94e895f63e2af0cc61bfc401dca9f7c2bf1fb7e1bee8df9be1513502ebcec60c2657c3dac96ed826d1cdad020450f6c383debc7250276ac1a32bfb39289c12885c640fafa71954275616813596990c4cc201b1a2585f05cc2d002ada4da4f042b1a085ae63471bbd47a970c221065d4c64d12f1237c25ad964ce1b87001126003b4fba6006ea090ed0a3904d824ab0ce3b0975fe9385247066f5425010cd369786b8805944b43e84566a10fc1eaf1f5db60dfd6447c7a039b984415ee21c42a1431c4e219ef350a87183a4c5bc80f40b5bedd6a70f9b038ba94a5a3cb6ce6c7865b556ae03bbb45adf667dff41156640ed3ec3af5e8311d2a370607be52ec88165a622b6c2d548ad40f7f89710196a663ffbfb0246c72e91e804239815ea76665c7e04e61133a27362986046a8c2795b2a071e77b4804a9b38a5b029487cb69424dc25e0a1fc568e10d9573ce60435f4961240e1d34d4183f3d202d9fb31caa4122184452a6669aa86616053a7adb2aee13da7b1649e74bfb638e9082fabab48cda0b33602846ba0fd32a3aac8dafdde20fc3c22d54d658940e20c3ccb3ae3752220c5dfb522d930f0fc5bc301e6c3e9bb046089d9a6c65594c4a55e095842d0f2a8c0f173dcb2d60ded5ca64fdd538acd785d415a69b276a9370fd95b90e6193a0e4d80b2ed80dab2c3521acdf129ee37f48ac5d5ef9d62692bf681d8e1b8b58dfaef0bac01ccb9e0ac940c816250d60bc31b2f709b78ebecdc252f8d21cb289e7894ef6a20eb30412c85e7555ea2b985e74568c052322d6bb9fa512deffd00a9ad9a87eb9ca74474eca7f81952c435ce2fb25e4dce1c7228856d663a82ab21443c7298e4d4e8fd7315ef449c68186468223dd63c57cf207a07135ff08d7a409c8ab6173b68a0dfc3f761bcea01ab147f93ad3dc48b6414345d3d952cdaff6b739de7d28c6137ba315397ebddaac77a4f38a7d59c5f42bb0d086eade67872ffb51c14040bff60f6b0fa28296078d839dd1c77c73326c78d05a014deceaf002b879613f4b0e77a2740e209af5cfbc4b29a608e95db1306de9ca07a4eba5bfcc436ea6f9bdcf90ed4862c4018e9c297a20bf5e82eedc0b5dcc2fac185659c7d850140d324606fa613a0e90481601bec93f7485da1277aa089892b2612ea80131647c89dab06dde0c4bc022628402bf834a88db4c60f584f28d110860185053c0acb4375ea8c0a95a64305174087a5b7b395a5c3552fde33935856dda4438485be90ec63e1e9279aa626f64ad6f1ec10df007b94fe3e7d52b0877f1205e67816e9ca5952380f8ec49cfd60a4cdc90a092556a25ee1f20d312b833e6611f7693c087c1e0c35d209377538c5f6bf0a065958776a5544f71e34862a5614705eb4027f72218a6bf2de4315efb0e8d87fa7e6508423ca616663bf71406ada8ea339b3ec774728f99748bea1d3773aaebeb5da901ccf0160b465643e7005f582bbe7a5a11fb6f6be8533670d74da448ebbff7a4ea7893adb69f848c3308c07275d2321f7a658a673b06a406f9d8ee315f8c14e4b58c19745ce209ca0ad7e1301bacd182bd14c4920c74b4a8e1aaa8f0d9b53ac57649b5e32b825057e2171f371237d1bb07d64d1c079a23f64e9b2523ae45020b322cb9312f7c21feb25ced51a09fc1ec1557942d21550d0249b496690d19e722554336ce3e2787be2ff04fc03cc6a7faa38f07a440c316650b6b478a6e283a9de8507897f3a724aaaaae19ea2e7722c669fa2103a3a45a86f6df0f5419445638fb8871f0dd007190a928016bab0a65ec50c555062e2693c3aebd14dac340d7f808ece24631312425de022afec3a074821f30ff19f3a5435501778c5b707d07efc830593e50f4ace158e2edd655afbd06c27e250b0df72899c2d80455c07c586139d106b26b2a9bfa996c3d65ca1ca5fcafe04243f1bfe02f080071654b6e8774f40096a892d95b6b43aa2bcc004c1dcc3c741fa49775b27b918314f0ed8edf557e267996a72e0be1de6b972e5a88e39cd0754ff958fd48d292313ae4df5d0b8934fa41fc60f7d16cd94c4e701c50e06e43ce88fd1054a75f8f7e04d076e5c6de51c4add013012c20a093bf8d25bb1d080058535964b659fc1074f7c432d7c36c98056fa98c1bc43ff8996b8cc7a014e79f825df1686af22902e5a020d60b8efcfb4f13e92787ce5ff1174b4c1ee87ace8b407b7344b3f8bef1e7ec5d45fa0efd9379b806cc69b0e38edf03d31d64805495dafa283aa415077eda63fe98d039089ab61031746d4ef6628fe98e25f9c3f9143391de0918c91b1886fddb6e64cd27a181005d52d62bd2db142599a66e0aa2ccd471a068071fdc13955e9cc95758a94b44a95f4b192862cd21337661f933f0586c0ef0dbf73776cdf2ef86f1c2a2860d51dab805385cb2359b2e08c811a302dbd342a84403b93f02640ede77368da2d249436ae37c73f3501b31db31f3030dadc78f44975d897a74362b3930e6e56d162c06a5860d554e000d807a208466d17879910cbe21c008917890dc9de80c04a33973ed8c4d0c76bf2743b5bdffa807d455a02c12497874823696523d2f1f33baa562d9f0e9f29a3da3b571d3b8042eebbbecfc39abc0733356bd5b0823a9f12a4ee8e0a7adf5f6daa204e77ab2394dc7662a610c9658d23e93193b5aa8add3a048440b339edd96cd9241032ffa6fa928c997985f05394896f46b137daa6640940ddf3157a70350f5b9fffd5debb1096857013c2c1e5659d628a9f24448196ecb3f31f1dee847f9fc563ae706d160b71a679e0d25fac334fda1b3db56bd0353c6a0a6ee35f43411184efe508cff4c09ff87773382080a0ca4d5cff15463350dbdbcf4e05a0af92203c315267868e8c44777607550e447fa02f64e5a633c00f83357f00ce160414ba8bac32874604142b50eedc906b35d6ee05923fc788f6c9221c2dbccfa35dc01ed847fbad53a62e45930276e5f6423b08a0c6cf024f76d5ea9425076f582a41a35a21656ac016ad474426f188d3ea73f3d022441a03c81c864f606210545a27f13497ea18133f8545540d22401b9d85b58c3c5480f938b86159b763eb023f34f944d958680c874ac5335d8cfc5df050d438dc6f454ea6d0998c6f34f21d69fbb07143cd3edf74067d8c0fc928adcedc69c3ef8975d983b9952051bad3ec8188491be151b25293b93d06f513e9ff3243cc557c7c48933ab192229651b00747cafb9cca0ee57341579949790f1879eef92274cfa56934a51898bbf0757628b01584443a73856e5216b605d532f8838ab77c9545e445bade2638b5d0178587d0683b926f53712ca840dcc0265ec7cdc14ff4ac3c1f5c3d2dc21369bb9a396b3d8d22a222c217c815402f9ad3c5057af02e89874ea10d861a179f2d6991227bed874ef76d0ef2bd1650aa3e6137783b937f986482afec61b0f3d08bf906ea0063f6514d6189eee0abf6f5b0308056d7ca17d28331889eb80b4a35da2680ff251f709c9ef84619d9fa6782e283659b5a9062804abe5c5919206c384850bf1714a627ced92bc7acf366284d94916bcfe8551878fea48ddeade1e07938daf3853a577e9a9c58fe7508e54467fdc2a74ac198bc62079b7bcc24c111f0e94773e5fb06387c94a0bd45191b74f364aed81c99d4d1298021e7eedf1151b64a03eb931b5a4ac6329c1f457dce06efcd0ccf2ca084a6bf7ae306cb474a9701958bb30b969f52b1e4a2c7bab874d5cbabc060b8dc3779a9c78d47d543c20862998d017e363edbc72e64ced2af291ebdcbb94735b0b832307ea5af2e0d6134236057ca0b1127346a9f547855c9219b32977538dd11930d074c385ae5c413f399dd34a0d99dbbe2024c677620b6dc1f7d5b0cf33578f1be8fc8cfeae641136db45527847dee4736a80d4a4b747f0c75185eb16b28a6f20ad0c0cb2e8131685618e252ca5f022dfd202ffdfc2ceabdf8c4967de5b5bd337ef169d2c404fd7b765f2cfd02cd512a31ab5f23962cbd7cff4c069cf30b855dbc2a4eaf1fede6efcb3cb8398957051c0ab7ba69d9e23c890e7a0941cf50e70c4c1a9efd21560e93dbdaaba5451c8e276c160ddde1a8d1bb9d0256a8b00ce4e1d0a9069aadd81cafd5b6f195fe8431dfb294353a532e960fdd200ffcb7ed7c8ebd60ca6dc75f23b750ca006324d78c3cdd5f8c1b993b8d44b1bdfa33f374314223f284d5e3f592dba428a995c5f04718a6913296cc10edda730f948fc8f8e3fcb7211ade30d9f0f9b6038e1d038c6359ce759e3b42391b5699f49244f3565b188544d7b9c63741bf3a7394d4e0fd148d43c83b05b2c3e285fa5763bbc9ce180e810b957261d1074fa642d3ac1d633519a6bbf758fd2e3a0b79a0131a36b9c7041a94115a5f632351de986ecc479ca094e43eed0fb9d6f29cea9fe5578f5ebd00daffd85dd196b0afe8a046889345e34b9de7c01c15f5ca8c62bb862229e051ca80c6ca11cdf3930c032b869e4b57381564dcfd36b037e59f2d5089fe32f5574ec11a3c558cd5511b14e6970d7e062a27913798d41407c3bc83b775f30e4730283dc94970bf8dae6272b9c296e2e7f06b2705a18b2cc8a1f8069a78f2dd1d5ba6012d9fccd426920a08a63a9febf1f535e7f371d5f9ee3b9f81e9ca626ca5f6dc2598b172668b274e979e94360cc88c4962f36501cca2f29ffbe7f7795779b47a886d3b7b7afe8619c531bc265484984c0d96286a8e42878a3e2d348b1cbfcc517938c11fc530f3b54d6d88b2e4c901221b8d58270862d96b157926cadbd04b932c5e0d661a6837319fd34282a8053c1b39674f46f9673899da66749051bf61b3d3bc0179612aac65dc091a7a6e7303bcdbea445393b3dab159bd00c68cca743bdf564580667cefc3ea197c93d4e2ed288755b6ca6f83fadd40262827f75eccaddfd97464a38d98e13a6b5251d05c4ad040f341cb193d5fdae97f8adfbfa57555d07c626387e67e37f7abd4c43e77360bbb12b4ce6689e5c798ea6b76b84e0c2a8277f14b74eac6d97fd60266b6cef33f8c699c1b8692ff82216980fc8aabd995863fc50c8fe73e0b8023285a4b4e5138a2476a1ae09128c3445511a61599151bded225810e2656808fc33370d32a3bb0dadc59b0ccf4b823d53abd5ca8e4515581342cfe997c8fd3f541104fdaeefdde9af33142625e1e95ce1cc9140c65b3102b9143d926a561653e6c4b0cc30d15055a1adb25128f1062a5d142f59645710c1556927534b6be14816707c039267fc44aeb89563ab7b2d948892b076786452f70313867c5927b980aaa050ea4857d7a924bbe4a278b9d268ecd18d1ccf36e1ddfb2ddd9bac6870e62d68fb295d6cbbffffb67e4a24fdab98349382b5e444176c21bc06b5c846545b28d646a634259f0823441f8838140e073845f03c80426e5141f98ab79c1707f82c70a978a0e2b151b599f4e44d2552905f1d1e88ddfe2e3db3254a2fb1bf216954e320b8a80e8591a2332ef3c554c003dd6602444d6e53ec2d847cb4ebbf2547f2b3b92dab29c3d50dfdd9a315f9945161a6fb1cdce8ef4d5974552ad750a9e95eb9fb9d925380cd9343a97f0d445bbf874e461f17b2d1590d1ad474851431678580464a1f22d9d94a9360f6f607de818bc78da4401a62ea364ff6b7034704780e9923534177b76b5c086634cd27f0ba46b8b8ebbcee6769dc7f4d3dbc5770da3acc47107948cb7f02502031ed82e9d69c735acfc76f016f8bc7a494d5a19206263fc866729357d4b42d4bafdfa568503780809f172825e92494fc77137ab32662b93a5e448139838fbbfd5f9bcc36e15aba0126fb764b92447db523aac391cbb915b5de041a9e1473672e56476c5c667e61f66398a5b80e546fde9b6b41819ba49b528e7b05e3dbffc85f78920d43ea8847bcdac3fc154115dacce2b21fb9e311ee8bfde35cfd692d80258b6cf40c008082ce8b1bdc3f405ebbb78b48e3236ee88fbc86b82c7c2fdac40f1eafc176e7a0ae3e6708e355e4e2458283766dd122520a843b3677c1e3b1510d6c0cbe3bb4792d00a7fc6ac4912bd9242e4126d59aac319ae7a574b71014d5380e035fb41e5e92c2eeb85c957f7271954961008f735882fb57c35891395dfc117d021f3d9341d5e2126356181e0d9417aba167ec9f0a0cbe5daae56cf2491b9f636f691ae18005fc621165d571a98a2b9c855b78effc1a5e8d0792fcd5faebb49258e68b9699e6d57cdb9bcec99118374e2b00d891da863210cea1deb0674540d8d0711ecb5832a28a13e9d543e83799e0e22aa568baba5416d78ea8817bcfb83045b97d4414454a46ca20516d066f6ae4cabeb7f4c2cad0c1f5293267e2a502c7946d43a0ca782404639c9461699a17e376099f3d6a05123e782ab9957478722699e8c5e4e301550281bcd823a0d8a752faddf7cf739202996a4f9f8c3322677ca6f514ff484a32854325a59e99f5a15366a6582b3f1ff7de0a34459ab555c482ec96c849dad34ce8b4e27aeacd9cd49ecfc4c91694f33d7d4d03dd45224bff23d245b8644aa5ee895236fafa63d55bc63d95485bc4f00da49713673623ba8a110e2228137448e99959a4e939b2a5cc34d5d6b2048636c47907f1257ced3979cf74037c12dd04824f7fbb653a0ee498b00917f4c4336382cbc5d1176a66a6368949d6db123d59b9921b5982fefc344884e8efee01d1ddaeee416e5a7f9b0849c2ddc57fe02480635603c38de6ba1ec88932415ae0da9a79c7c2b58ebd551524b13d51e0fec09513fb4d17c3fb608dbd581026478bd027b9e85fa378d8f27b549cd920aa6190c2acff50f2062d692b00816a8eb3dd4da3f6395115c9345a1ee194957aa686f17ef84187daf34c747803999349f52a37147eb4edf3276d3d48a3c9871d019fa2f3a4da74e0d3b1b0d50b411379c723d9f336870bc1d381e69c9f205c6b24290cac56758c6b47ad4413ab897928c249700e1986bb662a6e9281cd015f291f5ff08f39561c1aa7440c6395ac6a8a2a18ad55949931ef3392b7c3cc38f40cf9613a49d9441d9fb89195f230d03f14c9b25cacbe09190657f8def68a1d1131c12bef9636c4499bd7b526bf783dc112168474812b2023699c5e40a5ca90f549c224f5226150ecaaa438049a32dff4ffa508448ae6dc201e1b69d802aea263f2cbff08af3f070a37a0473a7b5b14e2f4b1304caa271c1f472a392efe636a412a8ac9f9ec1bf28f8c0d4674806b88b2cd7c1026112d3b37995887b5cecd0760336189e646e31c2255aa7da83fe8e27ba2690c5b464e64d2b1836f1cb47db4cf400d87e1400ad392685aff6422826399612133125b3201d028881e082d23325a1c2f797325f0343e1d849f1aba7e9c4ea2e2405344f6358dafe564d1aebd4392b0ddc29a663c10f7ed12accb1a06303e726591d2d46433bcbf1d0fff45951e465dccddcb6048a70445e20215dda28a31ba899ace7a48b64248dbce246c384c125a76cbb05509cbefdd2333c4df6a18bff0d75625930c2107b7937a75a8ac088c40cfe8c31081123cad03e814065fe0265b6df9bb84daf3f904ae2455a2b1c3fac61433efcd59964231e1f91b21313f8745e553d0068ea552ffc041076201d0c2582ef10bc2e4f0a10a588ca32feee6f29ad95c256fe748e32d48cef4f970c6612b31f70b4e2e4a925b301707ff226d52b2b09d24966f1ba2ba8ba94cc4c1e695c6c7e7bd9d2a96b1f45c7c15646db29b5d4116ee96ed4134dff9f0338d990adb44a30b68c9893b6b58292947db61a5e7fac701f9965e1a0f26684d6195624f230b55690a4e2a662dc4be8554f68b3c454bcff304063b780e4b2877de615c55482c126e19595157e34468c44627ab701a8ca0d18301ccc2fcc6639206864458885c092bc646c4950a896976f19fd550163a626558025bb2d24d97a25f6305dc312958948ee3e77eccb68e83d2376f80810655a86da9db843b9fad261dd3ec65482066dad0b861d99e458e22363a9b2c1804910405bcee94607faf9cc5a0a3db8254a873215b8aa1bd7091826c19718b227c3fdf6be235dacba4a34ad09239480b70644f61f14244ef64bb44365c3a3eb099e84a9d86b90740db7e8fa375194e399388c2288879e6682926332c6e04414e1333b2c10a5fafe323358f2b08dd187f2adf7e342976eb8446b4bb11c43e21fe3f6fbc0acb6ad4564a47c7732a22a6931eef1df280c825bad28c037f4f5bbcee6101beea325a14e91ab14600c5127e4a9f009f072b3ae6ffee1525c6c6e393a37a2ae3358477e09b33b982e96b9878851d94a1e6f0d7790bd0cf2530d141f6b2f83822a06932ae95c06a8a93558d00cfced4966d7f40f7d47959b182030dfd7e1ca9b01e0f418eaf5aed01ca99a7cc4d5d49bb59c8959230031d5cf51b541617653680f0a4a4369d2b5811c7cc0dc96cf2d5e1cc207c48381cc9023d4c620518bc8c1f75656448246acd0dd8fe6ad9218bf96183834dc9728849ce249633070b0d7e28bc95a6b0948fb2ca33728b5cb5f3e09fa3112e4d0a5053604ac7c7470e09d4ddde54db07253ca50630e2d92efffbddd58792febff184dbb3742ca640d72cfc6636da11118269a7bb8da90a3015cd5b52ed3c887eb5305827b77e6134761c99ee6e2143c1368fa5fe03ec45f5e9442c92a50449a41c161101ecf96fae2bdd68d6acfd88fdb19be9821bb93f2cb2356cc8c1cee62baedb86d198a2f834e83ccf743906db231a41ed9d624c5971e272135ea481f53f106e2e69ec381debc2e73324f1382b51d70c81013257361e29b164e93c8b247b952eee2453b241375795d770ec5f78c7c530e6a62d11b843fc59e4157a27c02f09cbff5568e594101a0afc7aeb4d19ca3c1408601cf5151bae7d56bc8b27c6db2df84d8205917e9c211a516b530761779fb823687c30bef17c513807569742868a4121e7e759922404aa3784ebaa40d2213e55605a253eea27018a970523bbb5d9060137dc216f300206c36176c519e1233a811bd24208fd9332aadc8ab25fd239bb56419c32817e9bac06b55bb51e51fafdfbec6afc92c71dd32d2b183a9c11405b14b2ef85b2a60cbb33bf6f3833508f1e0ca3665981966f953b1fcccae0410038afd588c2cd6e328dd95c0a480bf05040adb753dde7efedfecfdacbbf77ebf47462f2e8f0ebd7a5da99eb58a3639fda68f8c17497fe08614ca352f4088293f4637d995549f8eee9f5e9cc64da849e225a5cfd414262e6dcc4be194539968548a1138a266fd524b8fd8cf3a31dc4c7acef4b781a2dc8fbfd40db5d115afa7d4bbef2345968a64e26e2f00454fae0ec646b6eabed234f7cda503bf9355d282939f0a0b26cd15ea0ad460a7a5bdeabb9a2d0efc344abdaf105d7e34d3b4ac606a89ffbb65b3a6e34a95c374a293c6be73d472257377f81e7396023e757b2f5a67aa7766886f75bbb1a68eeda78b0b68d5d2b9d62cac863b861014bcad2622e87335e3ba2c5c987bca1c530d7b3ade2a0440677874572370f6a3310ae0734edbd7fba78c3b46d534bf733c526ff5929cc43be449e817971eb83f733dbcfde2b92f888497e4462d6601059f5abbdf9d8ecce04ab51feabfdf59c54773c08625caf6beb568f9743379187bcc92ad5127dcd2773f09ccce2e810f9fdf330f1332b24a328a8caf13c265e1dfdcbf4e173f74c31c30a8b31aceda9e6f021bc35fc1d7ee04f6f1a83a4b0c03ed957ca9474ca0c66192e4cb214b0856dfe544a0c133d10eba5480328e036d4dde97fed26fe54286b3f4e2860d724c51e711dcbb9f9bdcec7a9b638ad95c7c8be9622fa31259ce92740a19612ae4e511a3a9d89101ff3e1199c7c77ca9bf686a6b98f2d94119b038385814086a027eb1bef14a534bcdd18161457f6b24cc85d57810982401afb373d42114513cac3744766677e0bd8adef97ed43527a85ae270ec8b73478e1d1046ae187d42b2033308f612b940b24a9f1a024117668d5714d4fb15234d402c1893a70f7bb8923f914240cc1679ee93988f828114bcd2c74fcbbf608731c497b483e3df7b0b19914ecd352e12250967151ca0016ff1f71a6d603e7d40b35c970728788dd8e325a41f70cec8023a0c2fa48800dbe37c039910c2b64e26c0b9195b851477689ed3125f49d3846f81a4a50160a006ab9ccb85924c3c9bd2be20acb7931c1fad9b782b45720a8208e1f9ff0ebfb031f8f0ff1625d631d9eb370d4e9bec1c7e52f4c2427a1516d34b10ed57ccb2d8463207f0ad7ac811907a7f5158fbe5f78a10cbbf795f51b3f84def2e0a4bbffc5e9162f917ef2a6216bfeadd4511acc1df4d812213e457d5754cc482d2a163220a4a878e8948d03a38266241edc0311105a503c7580fd1a075b0f6df77546dc4a06c05311cca66d54d3530bd293cdcd2be30b5197baff87042440a3ac274ad4953714a04e2866efb137b10d8a025d0e4dafb551e64874089e89a7a094d7249884f6800833c8f876511e59c2550b8a403b610c75288b486f82dd61183986430b15a422b9bbf9e6700d97ba0f55877491885f753906ae18672987acc4310319c7319e581321231c974274edf430a2fe958292c34716bc12cb15f4c3fdb116fea9832c948bdf70753bc0b0bba2f02352d65330bb1821d4696c769c50ca6931dd4e914d3a096234779eeb3b459535f067675e8d34210de31a9818b7b183781de4082e77787e5bddd5e0f8d0ee19abae165a49e875ae59b7fe9fd753e195860d68ada678768b9811a4aa9162bf39ec27892e347961f5a3e0f85be4e6614f949f4bc9b4c1a235ed370be62dd99b96737d5e2bcba52589ccbe9743952620be7722cdde0038ebd43713b9907506273bc414ce5e30c7d0cd4db42e65e37c5ae3f22204b75703ec38b2b1b5f12d24c96880dee4fa3e033ab3bfafb311d5ccac047119b8c9abd0643e13b2b7a5af55f1bae372770eef21dddb88c411a3a360b522806d4897bb8cf65aea1273d3b58fdaa45e140112155a14349f82b90d3f832549933f17fe5300005acefcad1733c23227a826475a60359bd8ec65082445f076925c0ac239b2327c3eb62296e4414f6955fcc941f3ee2e9f81ddb8795ecd1747021669fab27025b208fb976cd62b288c1b4bec1b78acf8c7e81c14d04b4b8baf183cc3814c1a4b2b9aad974e55cf190164b734e00e20cfa449f0d0e4e5c557211da2dbb9e1a661dd0220beefdfeea5d75754b817af7c07b52c2e8ba48301c3f5aca08524f2ca8d3f528c12a35432ccb216a881988c71d26435f7b6c16dd76d076ca20a90f89abd79a1ccd29b153562999343c7aea37985e1a4d4bb1759c4f61f0ad3ceb8eaf0ce5f725c4e60677a92b86e919334a3492d4e064a355d7630cee58323f1f5ec912a5b7d6a6f438afe0168cba1196f7a0154e4557f3e6a4ec0be92c1d5cde65127ca13ce975a297d3abf1ab4d1a30a853b0b691c72b23b8ad83296308445fdd4ef3038d910f98b30f1c6dd59d488b0e4b64a4a3f4eae3c0ebf2330f60a0f4345e6097536feb8770d3db5aef84c6ca1d9bcaa8afb3c41b606801f85c71b2358ee80ddbe3e0100ca3cd7b0397097526784d05f8c22828ab3f0cb0904bc5771540e063a4629fae2635be35c6de7c51a4d7aa2ec3f7ef5bba7cd44f6c15fa25465344972fe2e8df17936de871bfa328baf245739870483de9d7e3bb41b5bf44dbadc79618f9d7d10f13aad22fd406c99a289e82cdb57110fdb658bb7a29628f8f79ed9358cc363698b6e18fd09f7324379bb0d99a03f2962d661c36c5920902b0287facef203ebb874e0e39e0408e83db3f65121123a8959fb0dd0a077a8a0da61c0b5541416582edef3137bb0edb1fd48174f304e42688d5b1a74c889a32c156ec3341c34be3343c24af01565c54478dcba52e686ef9f84782bb1229ac30963eebe4ba7470aa86769c34f03f1fc2c91b4fb1a2260905db9160b9c7bd722241b1e26974b57f839616914601cc2307022af9c25cc878df9e6c103b2f395b06d1528a0d83e29b50c082ba4871ab2da1c11469418ca996019c20ae3b91a0b48d1bde19110daa50ac4d2642e0fc3cfb6ccbba507ba86376f0a329d644b09b479180fa6ec863ea6721f9d6a2615f69dc04521d8fd89c8ce2a294e89003e1a96708143b00e63c8f447f0fe4478a2581b5ae7853d1105044ca83f0cfea8b63d11f5568065c3c71c0acfa044fb6424d4883ae0022d63ec2c8ccec3e98cc4923b95ebc0b29431ca446cd4b295bc39214bbe988b95ff414179098c767c43106db8ac6a5a8f809affec41483f5525fd8a717310e289df135a8b832f3534ccfb0b9d5b79a046126909504f5b72c26721a472c0bc49ac9dc260fb56bc3ef82317f20c4d7f0e6eb0bf578bcf45700566a8bcac134d765ac943e8d850b342d09d12daf629b65b13e1574913bc3dd13b36f06481fe3557688d4e62ba736eb2498afce79b121f62131cd6c15ff5c6b9f96b82e07f16c68c78f261f0bb3e25a68e2b0bc45d1f0d4cf4ef78b183d3f5c4ea2511423a2a7a048005d0c4a1ac4fa2d4115f2ac6997c94a003f90b9bdb0d29db92426c99c9ede87d0f72d0c969d1b5dd0fa0cd188f187d15b10add8bc850d0904cf01d14f0467aaae92e7b57d827e289515dad52ab233829862ed9126cd4b94b7c10bb5187cbaf2b9d647be23bf01a76c6bc73a91ec9d8c679f96cad338e963f15767d31ff4948217e2e5d814f0b2d17fdff285ef517ba36c99ce72b3d63a74892625b52ff969f680edb3d65c1593562e036b929badeb9998f5e293003cc281a89c30d050aafd6f214bde9cc0857dfe57b4e896941e1b04e45de3d6fad52e853ee2b48826d2b5cf81ac823f4fcdaab8d9222f51bc62df8fe1f4c375d676e0fd3d776c0b6c401f574455f9f0a55c8bc42ae14d41658c33afcc5d1ae56c8699770ddcb7fe948c26c0eee04d98f6075140324cea958904f850163ca70f5352b1b4534244d863cfdff9099bd1508978a3ca6bedc67492a09908a6556c0b3b1af3284e7a93159f8b199b8270708463f474b12acb8b86195da32d356b51e24934a320eca1c60caaf3b032548ba00f4652c49f51ce206af028dc7e35686b2af3850c82b69268a7f57f8a88045dcee095dd7644ece1dfeeea10ed4c3d176bf8c3b519b4f439b4c51a2183449dd33e31ae801877fbb252309cee927f120c42bba116e370130e84d9e0ac79db3998ca27d6a8d6dc449aa4acffef73a2d1b00df3fc06150303e8e05b7b31b972b33a2123ea1952879fce1d22887cb9fc0045c6138c92267e02d318439ecec9346d44f7a6a9733c1dc4c62534226e782237b927200fc3cb30370ec8ec005fa46315b9219fbd9f7587148bbdd81808dad694a21c14dc9d38343c430d2fd95add476273aa027773da0246e4c4ebbfb3183234944934dba84f10b6454796c3ab6c60b36fa378c3fe0026a0be15e4f4b901fa695aa0418c6bd461e38413302db071162451525cd914fd9edf86683d3aaf6789470e140d7183062db1c7237c27d5425c4835369797fa4339a935aefe1ff5797907c04a39a271bdcea7d57a735c4c907e9fc18871893725f8191f6b03fcf9232033c93469462c11450ab86475170d2b9ac3e455a3731847b273159a2c80d6e757178db790f4b4e83ff7089a2740698ff710ebb169ef82511766258a9a5228b5583169b5239f99e932e56b867a54862ef2e8d159f9248077a6c2aa27dbe5a6c510139308e82bd0b8a893c16f8e1fdec94660208d57bd05013bb2699b4cd7131c17f3503a8f95e1056ed745c11b422396b00219e57c89cf6dd779514fef182f2b995a2e2b64016c03b3d42485c71e87bf1204b6ae8bcf07bc7841e322bf1a88ff55496621905dd2f6fb9276f4e3f65c1a55985237287b563b374017cd24fe660fd03c9613874b6979955519e2ee5037e4d7983f16ec9b1f13ab2a451d13307767fb4bdedce44d38bedb7ad6bda4aa515817d01286cd81607ec6f8b7f43578492d2739a2917a1b5f6d7c021a6805546cad0b210428ae4046cd4e97cd2dc26e428f1b9bebb8de481e3c99e126e0cf632ee5c3c090cf3a492369de9108142138a59cccc0c7111272f13b015393d4470e418ba1934c1076819ce0a1b4fec92042def666580dd33b535fe44cf4135919bdd91e216aed6c57a511aa053cc88cdb34f802f8b4dad1e5e9c072cfa5bb3e59f1b8e1f96168eb85f65f6d4b26c22baefe7a5f06bd620820743e56fe84542c9959a96d135c157710a14da1c18f2cf72739f64c07d3b14225157673e9a40b96f410dc0b9b7225a380a9ea6444954caa4c8b3be7c873d16788c21fb0b65c69c98b17f6aa844e2387a2bdb2a0ba67cef2ab0543826e1779e30d8cf2fb9b7e9343e60c22dccdca1c5b281fbe0a67918bcbce23d0e3d5d3342f770a2b72290e4a321ec6018497c0ed58e2940612f2047eb4618da46b32b39cc5dbc59024d9bed1566e53232c6e2756eb00911ecd71b77d4fb65d6c52b0a4e77b9846519631dbce1b4bd1f3e25a2d5cb63d0630f1eaf06d688023769a60d7aaa0b01d269a8fbdba718509c53ce6cbd1660eba8ddd0b38ba7a14f19b9a1eba05d03d8b91744343a6056b02589f1af89335d76b6c2a0bec348083c4dbd6788b86a54ba502508ac110909d90143a5ac73ebd52bbc578cdecae31e08062153ada9df692de56f7f2df6c528581b96b7dceca072c1ec3d44beb5e74302998b0994a8c1a8d2a6e0314be2e5462318e80cbf5cd107f05b74de2173702db638f472357249e6a742e390a9fd071d3eaf445cb499d43b8d2ce75ee40f4884d1b1412ab870a54a37ec24c8044c334df6ec8c3c7ff3b7a6f6ed3141b4ed23775a0c878cc86e6375f567d91be968a2f145a29e9ea9a0f7ea7c567c2968f7aa8708e281109a8f0815b7da1e617a8330956e1f5ba9d7aa71da3a25af7c3b9efccf78f91e2d310ba7100998241e8270c00b5a75629a13324a29890df303ab6b9807ba9a13fae5cdb8848370e43277e64a8dee11d115db25d77497913abc2fd31d83a4f230906b1c10c71b549f539a267f0ca422f0e8ce34605652f5078184242eb53b7aca2b0a3fa9febaa9355d84f4d92f738dc621b80f49e91ad8080204aeb324594e7b6c9f188625cd9737de2a67bb99dcdc7b23ef988c43c02d463ed794ea5eb46b8796bfbc94a3182cf2e267a77f5a3582f3a218669ef5500105fb8ba64e51fda8667deace63ab081740c43f5bbeb445bd3e6a10e842318bd518da52a2c0ad2cea0d73db3286be6fe148f3262a93e6aba9a7a2b8575b0bff20a2ca6a70d67ec0cc1ed71b0a76ac74c71b1bfba4d2c1ca1b0e5f892e65c1bee4966e2557bf1946f5fcb53d30485685a8e0e57b79ce40f32bdaa27219ae3291e9098cd7638d38293650d70ff9d9118172f44d8dcf435bf3854ff09dba5817cc834398feb57fef51a1338014408ff9d890c08a3cd84960fa6f3fd814020d5d7cd52b6158d9bed225d2c891904519c9da1a2568eb19175c0184006bc995acb4821274acf7ade2870a1803e720a841ee4fab1aca61086726c23ef55a9e443fc0ea3b3a0e7cd4e570cf390302fc4a07621149dcc948914283acbeb97cbb92a8a0f3725843695ee6bc62e693f877e2ad8f00101e210a0d322cf66485d3f26c800020685cfde380f879395734d4ae13d801b25f86079c1474b2faf8717d7071333815314a09cf05d9e9dfab4034c8c576e8d2cc759c509fe31541a59433bff1b701b7aaf6c3b53f79fabc095bd4e1a71b3b47f457c80cb60b3b6e2b67f61312dc31a497eb5e8c2b44a1c412f15749f33ae0cc3a7a6decf16f57835178315791888e162cdd519f6c025e71f0ca511499c41c2f9f61fe56195cc1ab0a76b86a56b4202b7c99def22d1bd3ebd00c445310e79742017c5fdc7afeca213c18164efd7e52d3a636501951799f9a9459c943716c013c802683459c0c9c58fbce007c29559806ace0216961da9203e0b901597e6b1cc30842f7baf5dfc36c00424c6245bb638c4bb81b25ed36ef6f3a43aa28e8f602d1d4afe9d668e29b5538d39e56be25f2bc50051a80bf09500ec7936c977fc1638f60c5ff5dd1762f5acea6019ee7d66abc05ddaaf3d6e7d360b2163c3d9bc7edbe6f829464572efbe9385d9e3a981fe6bd649f84fa8376a384ec437e14a5b97ccfa4180bc28a6dbb2150faf12a2440c76d26a0a004e2a00b8e2ae4722cd8412d02d4ac0c53dbde0af3ca2fcbb1b68cd8078463a6d2e1fc42126a8bb42dec06b33c12776c09958e2b161c3d4477e833ff7b30f85221ab2102b0d434b04160dd170e2745d5ace26537bcfcf51dcbcb0b4dec2536b30765945bc32ea68d26719ea9c0567d7358b2977415e18f4f23212116d5e78a2f6a4971108e3b44351f986a9bc0f69fb891ac852e9a0eb7c996fb2c361780afd4a1889b8f319b84d260c43ac09ff1740b11d664187f5d9c8e84cff6066a588dea5736be54de41f325b948c7ef4b0e55250ae884b6f43d8324563b62f02ea3209db283b898ae067e700916764041db52093de326abc8d0e20256b4a5ee154f949610e5e0b4f444f108174168d1bb64e7aff334e9653a577bf9816017e58e2b90963bc13fcffb34e10f64453ca69fd2d202aa7b06f9ac4fa5af06b0705587282446288a6ae6ce90da024371d00ef03f14bafc8d0314899392f340ce520be2eff0737eb29417062532f5c0f2a7170a5c81ef5c09a4d02ab15450996d2abf3c7d381ae63efb768025e72f9f33528a3d969dc4962f22c85bce9dc05b21ca29ebc7a160588dff56e2b9bd558ee11de8a69ad4515e2ef3d80831f787203314b855666898b2ca4e5e0976356f3872efb75a9bf0535e397f781c93bde82c3b550920c1f730321a2bd4e33bfca09767ca5f7333493d92a419b6abce6300bd55001cbea51d9383bc3c7e7b826db458a1f56e6815c90e163f49271c94096cc1e298766926c4ea499305b497b62f20b1c95dbdfea047ae8556f7bfc957a7bafb1a97a2402ee2a2d96b9017daaeeb81cea24e87b26d9655d2bec4dc4829a75bbc883c5c05109f2dcea4e382d7f70b16953d674a66be495b0834f9a00d87bc91e0ea512cc118341867c501690b8589362dbb807399ca62292146ee220ec095ce13dc0fe50c37d642abd28ab2b33221ab8ca028537148fcd0370752b5f820075905778927fd42edc107437174ed1b8f632351119238c425bb6db81f67e50b8b28a39cf00612f9c56eec876e7333eb562fa9e7c82526ebe03e36b9bcbf182778f394668c0c52df25132252f1e354f77bedd7658490ed66cae5efbf42664ed75046ed15e5b5dcbe8fdd8f3cd70f8fbee248263e589f9183c67ec328678594bd20cdd92cf20648c6258853e254acc2a6715be9ce57514a61b3bf9e737c5ea75132d8aa8e36473e016eef632c5590f52e3ee6a011745533d46874b730339b73899001eabb13281c74d923f0c0d2ab93ec8d3d344a55fefb8beb35e0a893f9e423124048f4da1c93672c8f2f2bc09cbe1812614ea6679624593a9e46d1c1b2efbf158e7762d1ee873bb9112f52a1c5865945cebd7268ceaf49dad2d1a31436860a63cae79a9aaa18fc067d5473886337e53e9bc628e47ae204e08562ff829aa77be0de96e8776009f7c053d6c78683d32d964f2d4f1012b3602d4f5015f994219f53e958568386b4540c9f1290e1393e7cd9c3846a9d1bf10101e4b9491279f1e29cd9f6e201c9420a854c56207e4491a0b2f48595edb6fc765c03c6db08d4986f6141dc95d971f9edd2e8b0237b4468ff06e2a6034aae8d23c3567964227082cedf709f829a06a1632313c1dc3b7d683f2301744c8335b07204fc2dc395f42f0cb3df8db5c7c14601e48a2ad204e6ac1cf7f0a12c2ebed4560d1e348328b7eab8f2acbe5db6ccea12e809384dd35097f8e1f0d6349331429d712c76afce197514050f10b6da2f8bb419fde3920aa6766beb29a2c97a71530d76b4f81ad858add6635a374a7ec92ec2769b3fa3d3f98cc9e685d406cbed10d23b30aae70d113d4f8a4e56554e54fe3a2f70524fb0b0099293d4710a7baee2a6e23324e1e010ef1dea48e60a483e4bf8f1e1c04ec9774bd02025543b7d9ffc448254e094902e3692baebfecf918baaa0a2928ca6092d846a3dcf8b01dcb04d949c037d45693f5a51521627e5f3014f3f1441b0e61f4203c63a72e50673db0d29a3889fb6f4b46e298fd3b5cbc58f55168c2b996872d56ce6fc808533658c5093ae068d19400a66d0ce4ce4b6087aeb007bed9064cd35673d8b05c371e0081cd609b65cc118ce450c0c98078f26bebf2637cf4c83714b6e84159b1090a6aed9e70126997c5f7ba51353af2b40c82bc82d5a4fad3ce816af7eb2dc860d933377dab949e7638b89180ca94402543ceccac9d2fe5565fe146bb057f918e99e300bdffa1c75160a702e06024dc21d0ce45c9074b52f209229c407eb93a4390212c042e083ef149dc86ac3b3f47aa6220ab306ec36d9e8d04559d6266e0da30cad8bdd5e82e909dd84aa96f21dfe17f2c933e91d6b3ec58c5f2a8ec3dbb3cc95d24a5c6081eaf4300cbf676cd2ae3d52e8e1310296d4f1e790a9190792c7e20cf71d6668af8673bbca71eb90d265e14e9b1a9c2f951609d054df42052e504371d6e5b8bc63283e704f22095df010d670298c1c01838781f4b0bb6944d223af27c403ce2ff7118c8660c9c2a3850f236937b608c1981b1c28878e0209e239efb179ab7be135f6b3ff1ae55439474bb4bde91092474f6ad0b728867000a7af1c2d8d5461748384b496dea6c440a98b3a5e12137c9fa4d657fbfd5223df41b443a183efbfcca6ab2fe3d72820a609135690fef9addd8110c50d202c0e2a34197b2d8bf56a386ed35b2e5c485d9fbd2030d1c126dc1f44a733608ef1bd05cb516484ecfaa84c5360ec3a875ce4867930a2e1f9698ee8489a0025e794826b67785c4a8c0e7a74fb91ad25107ba2fabdfac02fa2d8eef335948835c0be7d657174024b6d49ee3d493f1a8d9eefa565d9400bc48db345f3ed7d45658dfb3af2861ef57de65b70c1796ea2d4fee8c174af9cc07fecbf5b21b77b85354946147f065f7996b0e6649bbd6936c44c5a384d7f59c120e96d578e8e90e9bd0c7f98143fc5ebd70eb343eb46be395bfccca3626300a293bd982b54db6b5142a4ab29577f861313400d585439624816023f27a1d5709278840f33c9cb9c252fee45782833b650396cab70ab6cd14f929c2aa2560a6352d658509cb51352896cb6ed844222c4e81a282131ae57d0409d9c80e6af7b9ab98314ef48001eef0c54b1458f3cdffb1862834b2b74cf857f0ba6012bda370601946dfe4543f2ed43b83517647e6809fb00d9df33bf2a03af76b1964f88eee8af6fa375cd7ab318c7142e7148cb8caa5d65d63db102f94bf0e36aa6fd75f4bc5473d43fdf55e90615001643aaa923a4da6a4427330a0e4f7916debaf4593c8a5804efc5981dd261e31a532583dd0435db27ba00b15237edc85f185aa503e64882e39f46b92511728859007b8b4089c52526292fcdc18a7c7d9d0f5c3436ff20b73b821d57786cc6dd8d9b1ff0c536efaae59903069c1d8f5530fc7f36647a7b5820c4c331721e650ec4986d7542b21794b40d849e916e0cce8ff0fc23f322de0969fd884c82cece76c328bf3da101ffdf79730db19c0547c8bfbdf7497e55b5099db26219d6d6f671b47e979169881102d0e030d2e2e2062ab33ccf1c593cc92a490626cb1fedf22b36f342828a34587078ced49c74ad0cec41ab662a3a8890a320d28003e0dab0eae58636556518360705234c5c5fbffd9613ed9cd429d45067d972df9896781c322e51ffb856867a0f7e3dc9b1f10b6de11a8448f649484d8d4a443d5d545b2a1e9d5b6c1404ff63405be2c3365c58e251192bd405d47e7b2c74acc50d0839be442908bea0729bcb2a914339117b9f6ccb4e7d9a4b88ffabd507cc3691129e0b84f282d5624d5f17140216d6e057253c1bd0b331e06f0ee5bdc9063f486f90c2ae638282540b056f57268c0ecfb29907a1bc18ae7d529ba7b16a58a31adf004fae271646ed66534059dbde14581e7d519d9c5f5514eb9e4711a79dd23de2f5e9e99c051a641b036e76531cdaab56c82e1adae1f0f41bc21dc14b107bc2bb1c6b94429a81757cbe2dfc81807a011983037d17ceef7c8437881b3f69206570ab052a7c67937d52fd722c1fda3357998f10ad993ac8ee22426734156a241ae713f307e9592061d9ccdeac31c4a66bedeeeb159784242c91552b9fd530a9adc3e00e07e1c1222f4a2511fc1c14449b13f579087aac60d9d4201cab7ca66005f00546d97472670bd78c6048f8b8e85390a3cb7ed4337875101e173a011e73f387bb360b4e4cda17409df40b926885ea1dbcbf8878b51f4549b5c09d7031cf4601231cb4230a2ef8b45aec1a6b514c471a2637960b6cc2ec17302b003c13d5c8605ed33164a2dfdbc546f439dd6e8051c652b5b0fa5be46993218fb797b7a014be685b5ea5869908472f8d0091c358bf23b43590a84ede081c75c5568c57d4be917173a9f46821bd9f5d161cad5a7712da7122b526b13eb809c4a8758ae6b77bcc2d1cabd852d9c0f9f185f64590aae2374ec1a4a313d1dee9958737ef60d0bc685ef090e771bb7bdcee560a57dd3228a86a3fd6960a6b5506e1f72ed1eaf91105df59030552b03cd56ef35dd56ba151511760b9a80962fdcf09e4d4952b3145acf5082ed44f4241cc741f4959e84338022354ffe079c9e840f73d341a1aa6811eaa618f80ec21f721511c91a0b0da730139972048b538f53ba47a6f85b57d4cd4db9994e5c4c2f2fc3c43a05bb2612fc149ec5a8beb1077cd47f844a2de5eb53ca311eca39c711aee60c78f89b34289412857e6435c323408e42578200418a4040799f8bb6e334f1f96eb8d0aed30353fd2076123c8637ef28412e90285a0c7bce494fcb693b1eb2bf179c65631489ce7f39d05a89ac98c66928f1485109ca5e25c6b506e4c652be54431e091f9c44d3eb278ff5695947f1d2e56a351dfc89b3ee3ef8ee9f116097465330b702d3576c3657447be696bce7a71dbed735c907c530ce2f5ec5e0a3b3e34d731cd0aaac46dfc2194418f6b4dd908da5907e07a9810b4faf6e1b43c5b12bbdafa22e5e28651521e114af088c1c899c20937ccb8201e9bb9943e848a2198b6468c8f58ecd06cbc34ae946e15dc50ecbb60e6796ed39fac6d4bf87d7b3eb7cce58771f0d92813c0e6aab765910859b2f9de342e30d5d0658514a88822581c86f2a221b96a871613e9b3b663020f5e80a7b9e3f71dc28052c6b037a5256745a30561aa5031ae1de55a22e936e9d989509cdb30497cd06e9dcc166189616a0be4128b36d01bcffdf19988881201f5186c7cd7db4c7d7a18e7d82806aa1b2b967c17b2254e37adbdc678d1138b3259f4842f6de7b4b29a54c49a60507fb0629072f3918a091d8ab68a748a9b56f158a8d5f238c30c2285fce3861e3c32f11429fd165f418e375c4f6c718638cbf8575c4ce7d88cb1297a58c01257559ca183adcacd4eeee5356d831c00babaf1ac036f1a1b052c4f71bd6111f6bc2ba17bdcbd15e8c3350ac87432d3d3f7f66e2abc47da5bff8e2bcf6ea9bb81cedd554975dd7755dd7fb35755f91cb01195a551f489056f5d71fd2aaf9396eada95bffaba995c1b895b9dcfa38d7d7ab5ef5aa9fcae1e1f89a8b9b61c26aedf9b7e967a25853866198467acb99c03ecc75d96718fb2492b57f71a5ce5e6f323d8e5f5cc99a38edadf6258df4ed618fd33517eb1b39586f873d940519b71836b64723861708617745b967c6e4b7f3ab9db3b3da67c2f56b0cfba11cc7e7f07a15610ad16e8d3b0f5f769b514021e3cea094b2a01cb9483963e7ce1566d7a58bcb976f069b9b846355211ad937e026e0da5c58069debde6d98b6ff253be7201cb8c3a313c4ee50765422e33282f042872563118730a802c4ea37c2a241fcf3276be1a8e5697c4c9afaf5d16872b9fb523558fe2cde20f5fdc563f92377ed60f99d83572c7f73570a82e08c5818ed84e1e5c227a171200fd954ab785573c3dda7e219290cc1ca17222e633ef087cf5d0a0ac1da78f1dc451b5878f5f0d00f598d20d40082941c0d0b9235134d0b700616674bdcc94522ed43e6f6fcbe3d646ebfccedc7f1ee05fafdded1f468ef44d0f785f92c458c9d3b9d153999eb1c4bd9e2e4363744e6f2d3008d741bc1fc24bb2a9da552a984b2512fcfc602332bf91080c35a92524a8eed59c7762108317875751aa7943352774c0095c686dcdf5aad45a1ba9b8a71c1d8ee31566a66d879a1bcd00c1b2f34c3fa856f866dc8e4f24b33a6bb3333fb0b007e2199618cb131a79b2865949717163a33333373bc89d1ddbf58086f0ad98df0621d25a1890d61216ab55aadaf9ccd959c056e8c23b8f05d3e7725b701391d8b1e2fddc2b7f04bb7f02de816be856f11b12d9801d1218410cb328c0ba8955a1e77c50889a972468a65724619322239a393e29455867af413f9a8d5fa69fdb47e5ab0d5f1c2b8669bf9dab591289d72be67f772dfe2069286ed51ca44a36e9da239e77c7f03dcda9808babb95d3c0f518639de1caca3c721c0012a4c86fe458f89101174ec0518187e44cb869af1ff32ea200c56a426408d7cc0099556e4a9a1d8b5b15253dd5990b46cbfe67a056bab81b5e6dcf41dca294d64a6badb4565ab51da45bb337d9b818e5360d044a29a5d7557b547ad5cda1d7547b32f88af4fdec436b57928dc60505753e413e413e4130080605157563f20d709d6be1669cb38d7c6debf1d73f0bc1fdee3aa781bb6d3dfed2cf48901bbb1f0df7ea9a75c8f719b61cfa59965d6e55ed4833256d06bbda86183c6bf75dcfd7754de8a5272520d4784b4c2e8425a0f6e00dd904a2c6c7d8a1da73f778b9aac0e3049c2a1fe4d1710f82d5705b906993b491362ee6165a0b8315c3300cc3306cd29f35bbae2e87065427e31a0d6ef1db83d4f00eecb3873c5010e072079fa1b7693559077da4b0f0af97f2c49d0c05ecd67ef8cd4d2ae579ff35ca9d1c8475cc3aeac31cedb5e7e4ea79c6f5c587baeeee343d4ad7bf74bda3f1018ddc2524884f24de253ab1b36ec3d7dd7ba7c4351ac38f7998b79ffd052113df40fec44687ea6a7433325d4cf7d54afaaced3e8beab0ee09f427de4426c5bacd6c205842774ed448f00ed8391744b004189d3bdfb9e01d5d3c3a3a3a3a3aaa3fdfe7fb0ce6cfce8966a992ec86a2b58b3cac63fe115d2d6ace49d302fdedb76e862da3dc0c36d0277d1152472a429fd46d3f68f783dd0636a199444e1424c3aef9f546cbb0596f9ca7da7a7957a607d6898adce828ea384f0931bc0309fb3596c6e23c468cb0dcc77fe63b901b91a728decd4a73ce396badb50a15a0a00ebd60c2aff02d10664cc12e7c690514404e22fc0ab51f58a142baf09b6bb5f539865f218441455fdc8aaa42bc4bbbd9511ed979f7a16ec3af59d50a495364381e87f5e8b0b36e44c635193750030135500335506379ece3bb0f581571608fc75758e744b45e3972dccf9d6cb56ad63a11cf75a22d964ee78125d0ce89200272e01db3732e58471779a47c4e7461add6a250ffb1b1dc78d46ab55aad560bfaf8401fe8037d82c448e5cd55e99437d5a23ecaf480a8c8e828ea380fef70f2c4574658f13da8e52b0e8aef43efb3352f1e2cc1bb1e3e0c70fb3f9e82fd67c2652da68b930785c2d67e59af13f17cd5836dfa3d5f312b75bb593a5a066eda3105590c4fa45ee6e1ab46e1e2b07f203588af683afb16e66759f633d06f8eabdbc89f5cdcc24ad4953fb0cf9a51b012ebb227363ebbcd8ddb30053a0291714d06bfb1dbdd4004cc9f8ff10ed8eda8af657fc3256e88dbcc6eab55b33643a1b0ffeef36a1704d6c066720922e04fa19009b1dbc4eb5e5d5c62653fea077dde7ed49fad3b6fee8448d8efe6ce9b56f584512299b5eb03f1024040be822c1b03bc9f04f234acdc4f125d47b10e96acf96e51d5c6b84158ad45792cf18e7e7f3a46367d00dff45d96b8a627c5904349cfd1ad5c98dfb0e8e2c3d57e93d265ca3dfd73d02d7d46e24c5fab80d194b0f2e1fdf84fcf309db6f9806ffa6ceb717a53f791fef4bce59c7e522aecc741319fbd3f4e46e2e03d617e4ce56f25d94b2291be6e39a47aeabe6a69a9e34bfbd2ba14b4df52b097d451eea35f22d2f7f4d3d47d42aee9b43ddd2600b33d8e939edfc4bd40ea84c45c1a371ff0e99f389290181adaa1a0fdf67cb13ae79cdcd79f7d0cf742fff6bef9d07efb6cd366b0d8f92ff49ffeeb8779373de9e7c3705b8ffed3df52a9547adf724adc5f53467a7e6e8fa4d556919e495cbd6249ef75e3fa637cf46f343db637fdf6a6cf4c9cfd8c3798ee337261480fb79cd39bb8efd4a1c0aca3f4cc3a486f82e1ec675033d98ea647e9b52f915e237554eb30aec28f816fa4fd645cf3f94fca6d68a034a454c0c310ab89cde6118650440302bc001db1b819f0691712f10e8f757405aa46b908603ce1c38a1cbc459a5c5fbf080dfef4af4e8706ff9453a0592626d67db81b12f5c32268c4d3d390c5404e7cc541ad216f2cfd4dd4df4544aceeaeb119003f638d2f9203768258fee3d8518d31c6c830c02f177ac7e442246628c12e4bb112e5e26a0954e80ccd2cac6d2f6ba6a287e59d11d6ccc2c68e52b21a4e11850f47603c898227cb3dc0e5286e08ba475e7a2381763d3d51f0f073398a244c6e2e47b1c3960bb79c991a58be313563030b677aec7c1c98737661690ffb5aeb67240655213bc9a6ae18887550497b3f3336b07ca7252228cb5196cb528ea8700e2e4b39dab9657029a38bcb52cab0d23b5c9642c6949bf1963333c5f667a5191dd8ae31467b5d97fd138cbde216adb47fe24c70fa18f7d373cce9ad3d75a7770ea63b710cf327f9270ee64d8fd39576170edb7dfcb5e6ce6cbbae2be612b231c374bebdc3e77274aa496820ed415804d620b1f046efba3602d39814183dc6189bc866a600815062d725e5c54d5aebac9c3f9d2e6184de70c65e229bc9c18c90656c67c74b7bbd9384edffa097db3b124291711fa1c9b0318bbddae99ac0cf362d2ec02e01f31bd7547ac80ad7ad6e1e5f35d0c683f1384f5369a0d2639d771f0a4683a194cbe896436360300d3e8651ad72f0ce6eb10ef9df9b674e9d561ab78ea6625fb19fd1362ebec6c13c6f996b1784626db7629e72a7cf201679c59c5016626920d3cbcb54e10f9456d5eee1517bf2617b1242690fa7b9b48a2f974d834157befc121703bc5d94e8cb2d07deb0f105de1c0a61d4b69cdac9c7f16c4b01de21d98d6b95056be1d39bd2469b56ae2f047529b6e5d05a2bed62ac652133911e05cf223d7fb139d5eb1252add775d58edb667b120348684f9241047d78a4c955ff833e5c39a4e6684f5e5c6cf69f97ddb447bb1417092bbcf9e9cac510ef7743ff1e690dfec8b754a4a4ad56418f4c20fc696f46075b1ffaf0dd384844e5e08f13b65bddf2d58ddbc8ffaa454922a8fc236e957fdd5cdac11fd6217f1a5d6e43493613050c193ec4f884f58fd19f875a5b2d25d1a71ba5d4be0aada2cfa355f6e97b351f83a2bf4161fbed556bc5b427712620bdc95ad2b389f49a4622bde536fb24fba5d2e3b8e5365289c39eb4615acd2a76550a94718d667a98d293b89af6ae87e1bebdebabaf6ce7b9cdf557874161ebd38f8f32e1527d5e8c0ad7f55ecdb78aefd57f5d8fa355dc8c141b614e303027181818989aab7b818798cc9797d38f94fbbc1ba3e4d1e1b4e7272861fb2fed6e52ed45618bb4eab3914853cea3ff94f3680a35f12d0ca53bbbffa80d1fefa4a8f6fc8456d52bab17d6d15c95be917b8d53da3e3e1b236324026f7cb9bd5f625815a527f0681595f4fd81b48a86564c0556c78c2331c62864a3bb7bc79a7846c635992c921a733307bbaf76c3ac8b113e7139242594549b79c2f2bd7c7c7c7ca44fcbc7a75b41509ea4b2e81bec6050507429af0e06b517ffc98d953a8441ad6238bb5414ebffc116467fa855f4e5f5f1b1da753aedca4cb79c6ea160ec9ff6a212e8a30d616b7b7dcdae8b0f5bedc59fd1c1ca06c23aa251e90a193b527aec18a37429a594524629a594524af9d81336be8c4c8424e31e036634f66a677b143c4b7be634fad09b2ed1b86cdb9693fdb6e574ad30cbe096835d5b0ef61786f99693fdc51191a1c836c409deb0efedf2eb371e7cb18ec6dfbb1b39d81a0466cba91d07da8bd7895b9081e078c6f1f0d57fd4b8ad6b02ffbab2ebbaaeebeab48ae335c8fde80b41ddab29a53ee4bdb48e6fe067423feca2b5861bec505cecf743a21191567112fb710bf250e1070bade2f63abe688c4e58ff2e138236b302fbd9ab659aa6759a1536c29f8962b3f747c5bfde5e0f35ad8b32c6581fe34c80fda669d8f3867dad18f61a777518975dd8356ba471cae8b1092bcfa5d059d6e18f3561fb3905f910a23a45b03f7878d18ddf58ec0799e8b4398ea25aa91685759b8bcb6274196364960e35d8edee32bafcd16a920c6a57e4c8118506f6878c6b8468972347e47a754e48173da52ccb60fb33f739f412ccc020b2f203f290093739600d735d7df6ccdfa117414eb0597f4ea11b822e7bb92c74821e6e9d4b60788bc17ee9719ad212c7b796669cd8d2d7fa2514e413e95b2a1111822a7d2d55dbaafa5aaf22ab769f10d4b56ffa4cbb97762fec868d2f5b8e256d3e32d35f68dcfad7576e89bd84a06ee94d3de6b59f9134b8ad40b16ec9e949a78e0614ab49fde6cd47fdd267a692bca6528e083a60e496ea9bb8afca5bbf245bd52b98af5f6d35bd10d4bdb61c539749adc45d6f2d57b3a999b8128742fd1d9847c1b360ba26f56fd8277db66d39248dc4a4ee0b825a62e7b2100d8edcd4652125b2dccc35dbf598a6af1c89a3a90f6f7d188ea6761a0ba73121fb554d2b71f05a4b2271f56d0501bc58174be47ef68568975432d96863be98cba40e0d5b5b85fd7ccd6275c6dc89ba31adc2d1aad26b4734adadb59f025fdbd198fe05fbf56d57dff4d81bb91747e23e229764e2ece6244e8876b70ca7515917db631b5f6c7dfad715abd6252e7a28d281c9099010610b162c6a43152c18172ea094522a191635cccb422740620446e5d2cc1c601be6a05aad45a1264f9eb3e67277f7ec3927ecbc6377dc41d3e0e5f20edcb9ecee947a7bc9aa3cb1eda0066951965a5a854a86450dd6c65c97854eb0733ffbb1283ecbafbebac0f58d752c5c45faafae56e78ccbd136f1adaf30ef7acce53f722483d25d051c54c0706020adeabe40381064480c2a07ca06971e49346f7c69e4abfe288f6e7c1eee3691d2500a243e07e20759dd10f2c35ea00f74cad82cb8f153fc917065cf1ed9d48a923be78125f29770bd5dfbb576015ea07558dce9c4e716e01796ec746247d3022b76459a54805933d0c05db0e2c38f9d0e77c1da5a80cf5d5c7884f885edcfe0f3f3439a1ef3e3cf4f42c965a1248edc035c169201d1adad4ac2e8fe65a124866e1633dfa42627179f4a806fa412e03b2bacffed60d983003ee6f7578e6b4e5e587333082f4d8fbefd22e88091cb17a727305f981f2777b3a8fd177f72fc78fdacb992e39f1cf691a3d431ee9390fbe2779cf523379f72cd85ac6952d817fc06567295bbb8d1cb914512388bf70356306aa2e88c2c2624a3555faa8bfd78a8a80e71e1c717f64ba54eb88131c49b4a55ebf5d017ec608c1e184d9c1b1770866e62628c71c61967c402f610a04fa0ebdc85d7a545b58cbdad8e75cde2025f72104208218410c61863ec48bbd968c8518b52613fa83395b4eabb891fb9f619349b14848c6b5859c6db05aeaf5d11ec0b411016c4427dac2b92d5de588aedff206c36913e1234571fc7e10af1196ea9ab59a9d63c44577ee6cc4393087ef6f2c868165d39b1649f316476d212c8a5dc467610bec79a3ebe7221faf0d0a9ffcd27f30994a12b7f164d2ebde27ee6942756aeb413cb9544d7480561dc6f8271e563579d3e3f2d20257232b972ea38e11d3357be0cbe822fdf055f55e6c95856f4a37fd69a8d94708747c7e789ce94567d42a693fb0ea51f409f044d1fdec13bf20676b67c550570e5cf205f390b8b749ff088e4b101ea449d9d5e4d286d23ffd3ee077562379fb4278bec37e713b9823a5f952172ed4a26bf7ec6ac2c6b6d6642412c71afd73e9b4b2ae933a644e2a573077a6342ab5ed0fefa7e2d85ecb5a79cf67d339d949baf5dd86b9ce48ac8b75b059855832cb7d74fd302cbe767be14eb88c47bfdac34f4e3a53f2b4bdb6279e0547f9616a99c41165f3e5766fecac1c0af4161bfd6ae4d29a544e4676f7dc9c1c029afbda649ec9020ed696137544c7b192629334ba6dd37e4a79ccf0bb0d5575af6a7d3e9f4339f9db8e7505bece93fd44da1abe9f9349f16812ced65f095f67db29425a4bd1e52e59105e282d6f54ddf3798ac7e197c05f35de3dbb76ddb1ed52a1b28af675ee64f9ccc49e6749ae13e22f1cefc0d99e72d476646e66f7030f0ccf39633d3bd4c87b2717aec847a0c75c58be2687c5c7ffa53f782fdab05ff1add8f22f1536ed39e0ccc7fde4cd16d55ccb77c69b758195357db86c670a797dc672b0c677a533743c4714bfa98713aa2707cbf6f13a05fbe7cd972eb44712288b7762fd04e6a5196b091066d24b61178d92c2065c2a46da09452aa5345c95584900ece0863072a5ca4e0e2355431e2aa9244121dd7b9df4d0db146a113d8904568e78b0e294f14b1451843280103567c1ed15e16da09e3962e0bed106d8912254a971b325d64bad43869a971d272d2420425acadd2c9c2b5a53feca473bc71fd5326f48a01415a1a508270bc47028c41adfa647fb98e5dde7cb457b7fed2c7db07c5eeee32a8c6e78afaea5d4aa743c798686966de6280d78775c08f60d80fba9075400ff5b0bb99dda1945d111a58b18b5bacb0a2c649cb494b1a3c3764bac8749146fc7dfd637e6e8deb8fb35a114941a3e793403f4c18a101c5fd78ca75094bd7df3b8debd865d29e03b5e7ef443a010ab20452720edc7cc0ef238a80a8b8709b80774d2cec640e2cbf07f1c31c65f3b017780486d151174456b010516941096a5d5f82880b819a6b863d31461382ba93f3e9e9d1b91fec81476ef75489eeeeec5ee3ccb263b7d39e2d1b5e3fa1617784dd9c8d11638c1e63843eff6366f6f8c5bf8a504dc8c0f58f1ccca2e62a82775c792c7cf73803e85dab9c54461a83163282408b186324c09518b8ee49f9304a9f3fd0bd1b3017660edfa774395512aeea73fb47ca36fd0d848d1c0934b50268adcdc08db1a1070d6d4975aa8d90b841160b80cb4248281103091b482cb03197858e308210ec8dcb424758d952d35e772fc9d259f70782bcc4a0cb0ac40032623992228870bbbbaff0a00833ae34a28925de9f165303032e574c21444495228ab83006163ebc10ca1d8e0a2aaaa882bb3cb7991f8e8e73b666c56acda01872c14fab66188f1f73c70a10eb1306085cf859e420273f46dd31ce239183d00808a9586f8e23f658ddba332e487b3c4fea7850d7ab5536c461cec9908775cc20edcdf93cb0f4dbe341e204f2f08ee71d0e8b8042dc097fb8f3b35510d0932865180279e011f864d5001de843ab58e8082278422877cef9d483783a37ee7c195a457f671eb91f73c131e14e0fd9db8c34033c847e94b8f3b5560de0cef73ccfbbd33ab9e0490856b48782a92e324ce5ca18589e5821c60d5e58adc30bc280b1a15bc0c510fc42a80540ed49e003806601f7ab19828969082786f8c1ed21c8f01a5e21c4157d95512b934e09117c64cb6db8faf45024840d498e5a42f0d083194210a1a40b8f10412af8a3a3994d791c48016589bdaad85c60672e0bd5c093aa0107524054534a5b5896e880095bba2ca4848934942cb1c1c25c1652f2431221253c4a7458c08396acb6ca56f718a37bb7a3628c54898f1f63aceeeeeeee3e49342c4c567fdf25dd159981c5590ab2daaadaddcdb015abeb7064e3c68f47b4dc58631955c4806268092b8a86c8618c2b6a3eb058dcbefd5d6b8c110d237e8c10c517317290032be260c446809f245a3aac569d8298229da8351281c3130fa2c90d764b9145d918fb530a8182a82a62108312d241e20a2baed891c2fb8c73ba900120ae8021170ae2c8f5677719bfffe1ab761e1ebfe1c278c5f6fb7bbeb238aed879f91d765508f6fb1b3f035ebbb0df5fcfe28a2bf88a6df98d5db1f0d2b8df98a0aa71e5076915af562b00e34aef02e49028b81f09b700bc23fe8d1d96e993935f79070eeb902fffe2d5651bf9f2c7ec6edca6eed8cfbb52074629326f2dfbc2c2e7a85561e1bb73ec28032fa49472034cdd3b960c1d42e8f013c2ccccec1cdda38c57c02df6b4e703ecb9a0b4ceed0a81e095573b541296b90538aca30b0b816efcc0f8ac60cf8ed9e31cb9bb52030f9b63ece92ea594524a29e5e46070da52d21e169ebbd7037da04e709430ead423dca49ee111d90e04820938058b9438aeacb9523e2f71a5943e185df9c31357fe27b9f23da9822030abaa4ecc752fc0fd725cf7afd608d71fe5423dc8e0ba0f365c4f4193ebcc2a226841c5d36de8d5f6011a44a754ca6b0f7aa9c8831337461eb4dcf81b0a260d2b196b56b36245cdedcf5123090f49bcb8fddfc3c4edf77848b24397db9f6d391dcfc022a71dc90e4528c0a2e1230355350660871b6eb47fe32bd46b415390d1dd7dfde03f7570e3c7d8699c51060e4058f1c312203f0110b1bb6d1c001218dcd82587189d05a1d144ab56b3aa2c03f88101aa0de3f6a37670fb5f480723dc163ad2ba3d83db36061595ca6aad4656bb2c84c3119f1e6a108a30fb314801b5281b836a5dd5891d26173e75074148222a445688b250941748621078260e62e0e03ef22d0e6724e9f7bec6db22dacfa107a805910be520840f660001c8e789bc2c04c494594a23d52922be3871c5972ac8f882e5c9172e22b0821e20a61002420a00dc7859c827e87e9fd2224a952c51a240d8d31efce9037d7a4e44d18afdfec2b6e197af6961218c3db047cef9df759fa5dd9c5eae5cf9b1abac8367bc028b962f82a0e50b2d53da6bd88241eda5523445698a84ae71bb770cb5108f97dbddd1e10f9cd22a38c50afe637f60a05feeeceb67e4cacc1777d31e17f64b41e69fcc83fdd4843f5460b4be4a40a75847472dd6bb20347c52970d57aefc3f951d5c396163f07851ab1a7aabd8bd449d8c65f6eeeeee3ded451f6eec9df64c9c094c0f03a1e9d9f4b59a3ad343ce3b138426533c7263ebb8cc6a77d55eb6acb2ca2aa594dfd815f6ba3cb31bc0ebeec48b7807c73bfa4614cadacd09cfcbf800865e50042404831a5c167ac1d18def4c20701d70a1b81b755e3485f59d96af7e003da1c3323db362cb6d224d0ba6877998ae88919f212f3a2c53075b9994a931332453a3868c17e0e705539c15bfc68ccc10162227565ae53b597c8508af7652ffb5a1e0b73b29ece745b7c80b0f173f6a95ccc7af9cef749e85732cedd1d4e8450e46bc71e3479ed81395c48f44f48a002ce4022e37362b7e75273b4f5aa5f29d1bdfa1b4ca4db04204e21d5e656add9d5b696f088cf6945837eabca8bda11b9f870dbae18b1eb2743b8faf623ec29c7c27a63be140c1c4d81a496fb92f66e3be88e4c69a0b9f7adb43a2de69157cf873996c60ff3d6cf9468b7e7ce54388620315e3113a847371a3f69cdc188152375ebdfb79512c2a7230629ff4a8e48d9754350b118d0000001000a314002028100a0704c270482c22d4a55dee14000d7e98427c54188cd324c9619842c8204200008010202020224034da06013ab6791649bdde8bc726ff07a33daf2d5f27f555b180c75706989bc85753fed3970b4b101563ee722ba8c5584b0b1af3be4ef429d3a785b73d046d8e419990e8997b1896290e4abcaa40b6f3425f370d9106d843f6291e1f33f95c353f1f1eac4b2622826c0492726f0d69539a728d80c86e629f440251aac0161d2fde3f20ee99104ef9bf1e219f077f22d1e48c8b3d816872e7543c5a7686d9e8f6008d3d402b1a9f0496934bdc9deef362d74d51985fae1e6ffc07936c703c8d58fe7b39e69298c7b32fb1ed13c3861c1060014cc722938d6c582a67799186b9be9e75ca031ada3a7da012492df292d1245ce35d0d45d7494ac2c294af6c3fdaaf452f011ff09f7b37053e1c8a075dc4cb802f7930c1a3bdc957e2a4ad2e228bb0b9d2e6eccdd6e76d1c14bf73bc7ad3092c4ccec19da2d5ca9f549b575b7b7174e4551d7dc30952da720a9d726a29472ab5fda0f48ce0be043c449d6e03158f278e74b63dd0ae1638972b10962be00450b17fa7d64eabe5a3d582f210594baa63951363f6a6b63d820d228196b7be0d0723a80e869ba6ff11022c41a56f50266bfe0bcbb195962d89b13ab6f9b7209a0ade4b51630b4af52f6a5569b11f0ea7e02f0f9ad24c0a4ab2c54dba51214e26f013807fd45748860e2eee5ec21542c3f1f55e5d2d67b0b343cfeeaf334515bf149455512a93c7b172300f3c3bd7725962778beae059b3e24db837e8123802aedb1371c45602abcefea6813de0fe0dd4dd74467822e519b9f79c515246edad8aa49ca1a4875daac6b53c8d15d3e282cd4233d74ab386b2987fa0ff4fa466fbc944681f0583938333b4900b1bb389b251b02867335b050f7f827d0592a73855b5bbec882fce3ff57ab822a344ce55a02ad72fb3f9ba67c3dfc944e25dfd67198f7eb49ae12d728107b425fe1e05dd93f55b29eb36a3c777ab23eaeda0e94c107d525d320868cc591ba7501779feacbba9bc1f810f17dde8387151ed9e3e221b536c9da11f99bd05d2577e03314fe9ed806fb9de8b8fe3244377d1943dc35526579c898a389b287eb65cf998a3862018c3c03871e2639547f514e7f0beb0919aa95e3a9ebadeded9c755809db32b7a4d12566adf8bf6b07fa3db07804d8133d8948409e8a86952b36ae61389f3620f41eec30fa105329b061840b6a5977ae8d785ba3bbd2c7ec7d4187c561af54aac02f1d56362ed113a03db7e3dd499058656f461f895735a705e8e09e76dccc78741255653fbe8adcedce281f70f50914b3f7b5f3b9a2053ad6be7266d7f8cfb10d2a4895983797bae1148ffbc199b5f9f680462b4a8136d8a5d406e7a7794092f75498b288ea223a271fe770b069a64c2a7bb9e8e85c69dced6cde3671ad07b0fdc5ff467425ba60691a9afdb4136984d3c985877c2da491a1e489109aaf84da9835b6037ac217947cf2228ebba954a33bd1102caecd07fac8ed8207e6f7dfa1af54263656ad10377880951b09e68291ad85892f86fafef063e3ccace2d6481ab1b745650b75a81a745e927ac2895006a8cf47bc602bfb0b3e3cc30c17a757db15e9f42e4fe94283c0900ca2e9acd5500e12b49a431fdcda3802908bb43269066b9ecbfeca6a70673d3a79e2138803799c2c33c6d71d79fcaa2cf2d6533c0f5ba1605279d14863506138eb8a2c5265e3d0cdeafc9a5ebf8bc82895e98f58316977f2646cb01d2a60ab9ac2637332951e0d75b9c42cfba9d73ecac829db5243481c31556540dacff1d090c138dfff58100b1ce0d04c6d2d4bcb61872db652151d52e7e6d77625828c1ddd1ace6ad61c6dabc77e06af56ad0c1c5f162d73126da77caf9c509af6cad45d0f305bd7bb432b876a0447b8c6787a0f02a27b8aa8398258c4c2e7822e043fa3bc81eb40a23f789039023ecda5984ca5a096468dda0c8f212c2638c63f1816c9ba8cda483cfe948a40869b902ec09b582e057167ee8df93bc0ce6fa7c3832806257c0716410655761a37b42d00dec68c4316bf507450aa32d1e00887571179ca381b20e6f077a6bc965b89c79467cc5c59d9ec75df1b39712080b41a3fb1c4ea1670ae3980df77656f8448a3c10c5c925fa5a5c7bacc48630a8f5b030f9a032022014279b00e679171015ce3ebb9d9793530ac39806cb9a53d0709f372056b9710117ae74d16a97f1256239c1f8986769562aaec48ebe4123c7fa03a5fd83009bd28c327384d507b6c0cda71dd8e308a3b7d007a8e083c4fcfe92383e5ad681118f6c69789fc29ab0b62efba636c7be9e30e38b57e85674775b25c46bc4da81a66ddc58f31675cba9f45c13e0b845e27cc1f370ac019b492a9fb49adc522cfaadf0a347f50f0bcfa6ee6ddd18277a1642475af6fb211bcca33158cf92023cd21e341a5137f4ab0c3273208c067d1953847568ebd74fae815c71e73bc7f491438d5577383b052e3ef78fb6df860b54038b65c88fda2b0e3df8875702045227d09bac1bfb28cecd6ce0bee1cb4d091ccffe36325c72c7ee2bef4882752358e940a47476387df813ded8749a0d02ad5ffd56b5faeb79fe1f94225d29746029a69742c152562e1712a8947c71dee4285fbdc1f1ad972c38b95c3aa3509e743ea5fd7fc0a0599f80ee77a06270be37c575b5faf8bd33a548e616952a70711ea633c518029d6d2dcff4d97b5dc2066b2769c90b29fe37feca9b16fd0c2f71f7a9232f880869bfa2022202897f5b117e477c6b4f6e6940a975ba6c205a55f2eb9b576042d66444adcef63478633481e9d5aa86585f4d2455c1ba06f813c7895d115d1df218011d9f2f8b859efebd0e77510f773584a45d7e4985778e035da8acadb5dd90380b551bfd81ec0a61f2d07d253cd9d0419067948aa0949727df434d657ae13a056da6fe398c011697b84a1aa922d3fa9878cb2c92321d04dccba9108311ee4a2755c5b4a45fc55ca627c287216428dd269df6188c0f2d7b8ce23c0200b37b22b997179ac3c757b96812f936ec84e05bc442c33808da84673debf33ed1b8a9c0e81260717763bc66d404806e9883b7d91df3b2f2fd07aae8525d566a1bd1c682a62e44e67248ca83336c446118013378ced6abfda6bf10b5d4f10794a75ab8b2d25243dff7c26a90e4b286944e61b1610d551e8d9dddf91eee9f2830baddf49e56b9ca37c67a93c402840fc52251c8c5c2f2386a075b6e644bbfafc1db393a59c9495ef8a66d963e6e84ec8294904c109762e1b374cbd354cd169280b16ced44565f05d5ddf42628506163da6c3002ff4f26bb45ad27227c825c997ad7f781956ba27c67c7359b92fb8e7cecb0db5663c2349eaf66b3a95114b0616509ecd9a66452e7c4bdb5defaa9ffd801230b3e205a57ef7b8cf888b6609e89963b38bd08ef4665b498f2efc91ec995f874597840184cda3e6db7caacfe88c52109a3c521332c6d021a0a2a3cc453e1114002d9541b1086b7905cdede7c7ad710af81e171dcc79d630095b3df055da546b95a06bd2fb5014424ccebd537717f2af723c38db06df884951117d01ee09e9285a7376cda24a1830ea92c26254da908b70146f712ec31342e08539a1b08fbbf8791df074a7efea292968652f4c7f7cec0c6a35a1fdb6a7bf50bf051498df3ed3d70b581751f07c0d9441077c0cf3850ef046d4b6941618d6054d3deedbad2fc4da5e020cd0017b6a10eaeb12145a5045f5aa4fd9fe0be3fcaf3d64a814b2bce9101f3a9c671ed1fded4729c6dea56a95c01057ab74550c8cc6c1adc9bc8f096f6c35320b098141f9f09edea33dd1992419e85c02f0a39d0bcba2b130bfe71b8d0d4e0c5c4936622bf7629ca1694ee483f94235bef543a20357833c7420ebb4a2b3c00678fddce9cd8012e2788c8018a1e6706272329173554a8a3982397b8111c98f3a8f03dfbb6cb9de9687831768ab3030370aad13a45253efa38f846215173e7ab39fd4f7a803b272511ea4806acbcb209320f117aa06ae36fc255d6ce7219981765186473e2a19b97643a10c84e0b0077e5d838d82089d6caa59f88dab7cb26b82e4ac7c6bb022c99059f9ce5dff41b9df8a5904ede4cd2ac89605cf350e9ac51fb53935aba9225c045a14c319d2c2210605a3e503618802ceddff33417e0769a09848dccf92007da94a85125be1fb1d09b4130f129ad6ccbb681e0baa3e287eeae6d292337b3bd42d29844c2967daa4d49a3a9ac544e84927cc9d2611c0a4da00d7ac7397b10bc2488ff30ce35324b5b8980f42206a44bd10fff5d21dad828f78048afb59d5b93ca8e4ae2613608b8d651d662c6a5a60b5564bf8e0650df4a3b1e2d77c9f6d9a6163afc729bb19de981c0f76e1e69199cd78aee47e55413c0c049d05d73aa50a85b748fad7607523eed95b25e67abc00e1efae080d13298a17cffe7952691996c9f4af7d3e0b4c68c4bb40e9aa6a904e6b5873b4d8f7108a620832f4fef14c80e87c9184b472a3ad4b680bb3575570f8d03b3360d2a9c2bc7ebf27f008e22f8ccfbce786c30bbaa2b5eeeafe153366d37188103bb513097287a97c8c75897010cb48d95e490d436c87af890f3d93e46f13f6b8a00d0a08f026d8bc2088deb27cf0cabe4c042284c32aeb58800dd51a8e386c5d202305c4c59c9b80c05a26f927139f677afd1e5f7f20cc88c3372124a5417e372d95e7329dac7f8549ad05abc7dd033da42674b97c67e0c9fcc1550cbe420843d4feb2dca1e74068d1b9d00c487549f8fa5133e2eb32217035dff815bd904b07e70c9fc8b15e38ed452a927a94ce05450dca799112bf819f566727605d167c794139e4bcaf6f35a6a564fdd481d067cb4c481b5d1a28732062097bd751e0003fed8b6162bcc5d12231d0aa88cb096d5e8af52784ea692ad8114ca97bd30ba9675ccdec2afcd136ed684233ada28d63d233fe9cd658dc502d97d4ae5255529ec253a2e9e13eaaffabb21cf174bf57eac1158a7765ba94bd762e93bd8b513afe9dafd16a40aac94abdcab9a7bd80c9b91ac4c6097d4dcbabbd2b67a93b85bd19b69625f74d8ffe44ad1a7c33afc58eadbcd9bb13ed27c0e69559a0a4520f2ca09bdfc4449dc2b447162c9c06bbd3fb5ce00cfb8adae365d77c5d1f0457ebf7f4409ba1595311ef18415570f00ff6af7c190db85f68da0bace1951c2ed3c831529e6cedbea969da2a61d1fd6ed391d7f89afb2bef1a5a266aa0de32739e07cd6f83d0b575016c857c9d18686245929373ec44a570097cd47c858fa2ce1da8ab876578f032d1ffc715f8d64e32a4bed5bd87553d23d832e705cfc5e3065eece938a15252d39831ddde80e19a47b899d6979fba14bec1ae39870773ed2da65b5750467bea248fddc405b64275811d9be39d112c862025d8da5453db4944c806bd426e23cbc22786b92ac8fbf8233f9e869067a5df02d1a2c33e0787d5659d132911dd1ff0064d72aa68d5f01aeed8272de85052a12535b854bbba8ac076a67e633c72b82636ae09389d4d28447fc0ee8968781e91bea30ea531d0e68fd6ddd65672a58e61d2afcc35077c6fb3472faf9224c890119ed31cf54bc0e1dd62244b66c79c4bbba0b37037533d2b48a1fd1002de1b6421d02ad7ad4bd34a897e9e12475bb8a68fc929e95bf42335e32e51df8286a610101d4f69278fe22b50506aefb11ebb675c933c14d83d8e6e040fa96398b56113e3d6175f329f1191f97dce2e8edc08bb5a174675eb06af4e5b2c04693259c4fc2f9ee9bf22200287728a71e41ffeafbba2f64bcd8de028bf510e6fe0a300904c3b4e89ac4c783c5a052f64586e6c34c6fc8dc608b1c797ef067ad46736a3faba12aafc0b82b7a932e51d3b49fb290e4d8ef3e074675f4372db0a4840c3ea09cf6b3ddb52c7c60206eca25bcccc8c344022eb157b6f612a4e9c30256b220a7902323641441b2c0a0c8ddefe8adee0c3013fd908ba0b80bbb694c05c212a23100e4408151979af39a878c6dbcb56ca66a4ab18e84f062acf2dba65eaafef117a7e90fe2c700ad90e75cbd21a8859929e06721cc14dfb532909bf12927b926cf5921c696e9797a1f12af24bce9e94d1d4b3d241095384d6d29043c7dd5b01c642ff588d541ad139081f2504a6ed474e23fe31b05e0a4de9865a92de16d7d34d23b623a2bf21f55b52c8b6c4531057ea4daccdcd04dfd3c4dcc26da6e8f03408b8c457494465b9f13400323b3a2b3637919ce9cefa5bb5ad683fed9ca565bc1b3f098c3446354ccba054b4967c922ed28a282c70e3cf0e51fa14808796022c0b691fc821efc350763ceeb3a018b3dae5cc51e93eaaf1664e3e0695f171f7ad4fd383fa73e6803eb8e65008b4c7aea11d00bab10f96758d9e4a42050c0483d54c19fd51241fa7b8e7722ee58708d8385f2497a9a9381b6d82d4928e8ecbf5cda08bbb846c5bc2c091a82a772fd91b44368d0f38ada0df7091a0a251bb5816b0ff0531537e9a83835f1a92575f3646a1e801114de589ff31468de968f42f17d4edb3e7cca422589c386892fc0064252a0ede23e240f8d1f6fc1233dc2ddcf075289fe61badee4f6d29b6f8fb4596c8646e3c0d89c4161d888516c7a66aae2e5852cc8a25836e2e13d7f0df2383c95ab8e51d9adcd2c951a8fa0dae1e592da472924c7d454f46f6776701b8dddbcd4b9ba4319190276e8ecfd27820e10dcd50ff508cebe89ea80793bc625a4a9d3fac1c686d6f0d4f9573bd8fc56843408432ebe5ceba3ba0f4b7404040a7aa288d55e5a3a057235129c04ddbcd0e5b6e0a7fffd98aafdd290c9973e74996522736e043e0607709be0b4c806036070dc2ac9c87ee56f631d09f76fabe979edfa66fa9c69f41fd40ed06cb2771115af9ed4424ce7c423c2f2f593dddaba6f8dc24abccaa6bd9afb3ba18d6ed9b44eb0c833a39d653c023492fbdb8001adb25405c75cb4b17eab0242722c297a3bf33abfb9dfb025b2bc0d2162be1d30859759500a3589c1b4847da1e50e91e8360c457d893549e120d6e42182db3e96b9107fcdcafbebf8073b5d6a276616836ea3d0e69f06eddbd511a155ccf1fda2f64cfc680d05bb231cad91e054690806ae417c00cde35fa0a99811b3f1ebdfdf5f87a98caa21e84416d0947f250a72482719276106c967d7e51958dc9e4e22bc100dfea214ce8ed13b1b7e225b6ffabf7798fdafe3e79af53ccfa1ab38024b332926b47e5e26b178d1263ab26829a0f1116c25538be48996bf35d290483386e40ff56965e73ac50583f077fee3b56e366d3e65ef8e696e015e651ec9682edd97f6d05dc361b6cd5114ef230e00f52952ff55abf60e6286023fdcbaacb7358dd93078fd0ba42af6da5c57dbe48b4f585fed7f0fcda34a496e02572581843cafaed265b578dccb48531ee8d99feb0f228f6e68fd61d3e3d3041e7122d73eec1a7a4f87f9e1c6001fdcf56f9f6bd79b19a20b54029ef2d6b73204f08910aa9e6b4e0768a989481180738df24e368b30f8ac15cf42c183b1a3a453a0e466333400fbc5135cad5d68d02c40b59ea1579d6b072c330524fdce5095a4364f1f64ad0fb8add2b29ea93b80381de27503fa8f701a42f0bf06915175a8680df4d33e35c234e78c0dd37e74f5ae72524490f697ff5df4d69ef3594613065d37cb50f11baaeaf36709a7d023983b5881daf4638f6efe2cef283e40ea9cdef35c50a94212c680e8d9deb36b3d87135dac5678439a92dd222288b33771486467e8dbc7364221dafd939978fe9ab720daac1c152563a43d71e76970e718dbb26e4e24170e9547824d7a6c491da30816d1cf3a63f106d083ae2db1e65db8326b4b78101c0ca616695c7cf37e6ac7c25719ceb605f6a57ac6c733d7171bf1ed5e1fc417e320241439c3341e43faf58342201b5885c6ae49425b4ac4c7afcee4aa0e8b56a54b2da91d9e25c9359ef61010c754ff0b9368298c46525c887f24ffa8ca7e2c8665fb600e6840caf3d019adfab82f66612c6b94ffcdb509a4deb4753254f244e4ffcba10b0a804fa14de31fe4f788ee1c9bd293a786cd2adcef9ac88aa59636a6c2abecdded71909d388aa5d54febdeb835a1436016f16ce2dc9d818cb9610266b65984dce35ce45c113bdb2072b9e2be75344ee52304927102c4bb860168c014c11d4e68e63b2a7edd7947a28e2ecc843ccf40e9214a42501690114b0a494c77190b5f20620bbdd08faf48a0773f4f051352eb645c5ebb09480b7dd3b2040970b7e4f62ea6ea8da1efb6fafe437486802a4023c35ad1c01527e528b9519878bc0f03f2088d7a7e98ec85d1ba10a2c38a92e0e4bc02d34ae5fd8469cbdb299c1f5ef8c48ae14ede6792a45079010eb5164cb9e5c22cd742339b2cdca8d50f8209cd7b2b57f6d6aea31844084da50cda92d0fbbfd5248d78d2bf366d85ec238e4307b8e901d210934612e90135cb59f0b109996823519051e0b87d99f46aa421c8ba2900ef8bf65141d99eec9c70db869e244a022b8890d0c404506de82ba778b9a811bbf4954ee6d41a96800b15182be3080e3914fa85e62b56d7e67faf0ed56fa44a6aefcaf41a5cf11e3716e74491857f8e2b06b8601b5713570c618566e7f8b4e390597962cca4e224c92ff412b71c129630573005b99d1139c5f4c652905b5b21c19ba1b7cbfca4077152195abdc116f66f20dfeb50ee6022932ff361166d6ed4a0efb46cac887b3283baf85a08294747119dabe98e5fcd4047da1be01b8283af2da57952aec2082c1cac7380fcebd3f1625417498b6bb3258e7f6c1d95bb8c7a9c130d69506aee2f5d4577ff2476e38c4b27700052ddfda4d761a767ec3fec366a6e6b5ee2ba3be78b682741d3cde6a7125ffb435221da98a7985e00733858445acc90e7b2a97be3713af75f6e1f5efedee8fcbb248813a37f86253e49245bfb6aa3c4fe495d58fe9b69b9f743339572d25a1007ee820442f20d4a7aa01c608bbaca321b9b202120a910af7e87406bc3705b4a0190b6028fb52c5c8cf8bb76b5a5ac00411ed1603fda16321f6bab11440cd291d3d542a86eea4e9af49301b736f0e654d465d7a3b425742dfcd0b3fd2fc67689ef0569a66f2e7756b8b32e3ae82d590008833e007aae178b93b3a68efbc96f95238d276bed03521625b628180ac8862beca86d99b336e4ceca48697fb2a08eb421365a80958f676dcc013ded75aa113d4e1e9a7be7204bc591c5a705db36cd9954d12ce6dbaa90203d5da1cbab0f4c57eb1efcb8a755d088646378720eb6e6f506bfa65169556d18bc4afba6a706f2abef8f3997ab5a6ea96b44cfd0400ffc6b3703c4d067f08a7e240f9d011244da30848a03ba7a21dd917805b95645af0d48011ce73e3e8497b685a6da1f9a9dd796dae3e4224fa30053adb81111e17ee13003470e0fcf38061f9457179fc537bf4d0936e48c1154fcc05d7395923dd94308950ca2a850095f8941b66283ba9aafdf0a2992d1dbc5ffadbfb5e4c1251173927b850c8984dbc802ce5e107fa4a01ffa4e7a8dea900380b6267ef1ce0f874d9ceb6b2036dbb52d6dea651ada54ca8a4be570e513e5bcd6f5abf149e9c8a02d81bcd7f26cf0e815eab230fe96b1524ff94db8617d639e0deecbdf1c5e7d1668e5d0ced3172d1f61e0ecda901699ee04b154ee2a37347fe071bcf075f7c8f73a9594376c960aab28988be2da4f6687021472ad29bad8f9a36eb5effdc55117706ff1af67b1cedf8bfb52094634a1b237c81e8ffaa9c1a8411e634c564f91c7e2c754467538ae87aae17a7bb40d6ef9e30ae6103a1f31783f8b8c6f275d4ba3ffccf7a5ddb090f593032b61aec37ce05bf009a752ecc4dd233c27929fead2c38698c21819ab248e9f9acf33e38863532bfc0008d5d19e343a6aff808eda83de88e3029a91d2e1b8ba0c73fc126da1dc3b9d4ca32713a9abd976b650fc3bb84ba35b0003eb193c5bc691e8817f250bec9eb6aebbd5d8efae06035f7f5e3940010023b34abf71430fe147e788bdc2ba3d128bca473a813e4485eb4a3ace3681ce88a9991e89e57ca1e6009a977024f3f9ee9ba0e24735a5d6fd7ddcf5a09e62fd7e57d34bce33f0efb41b04682d2cb81c91bc1ba41d4d9d0da0c41cc966f5b3ab1fa9ea086f328488ba3700d4b2419727a6a389f3fb3f809f31a76758d0d6c3a7bef47234414820db43b63a1e0fedee2c8a38fef348574527d6f7a7b061f3f205ddf5753324518a11284f8ecd50ca99bd811070538ab5a5ff7f5764d81d209f78b3246a0df39aa74b39ed727fea0f6f4c753e950a73863b65793a6c6c35596752bf6def3484c51728293ed947741852470c95280c456ea27001ae74e0c568d047e4d4c72e1226b68940b36836b6cfeb6a7e58bb3594bbb59dc45bc31e8ce7ad11999cebebd57d90febf6d04bdad52dc1e03406b3b347512e94c30033c2fe7b4c26a13b5490bf0fcb057b2da6a80fabebc0ddc04ab1bdd9a9277ac0942d6a68c6371ba22f2a2e5acdca1e074f42a440268cea8c562ef0248672e7109c3661db5c52fa97d3176b4d9639ee2a8a37d245b8b4bb5481b7c4419f17e05c0e5476bf8ff30389ff5eb144c3666621023ef24120a1733243bedaf6dc77cf66123eade2b7cbc02183a59708aa83e5523f6cb4a02508164f9eb507286d2159a97c1b28545eedfa7e2e7d45ad3a2da7cd4c3a6585ac96c5f99c26ed9319173c855e9c59ea680a13d578efc2a30b04978f7f50008c60d92d810790e4aed8fb4e0c4ccfebc2e7fe03a860b9795c694a2450837169ace5dc8845ea6253a8ef0d02846348102e2fa187044d768de9a3df74adf7e2d38030af794b892a9ffee00596ad09edf3f45fb7e699eb91d35a46d5e1cdd0151ffa60e988122f75c326a963e041f4b9a19f7c07126b743975974c1b96c92106325de129b14848d71efea425f3776d70099e06bee8b49ea50dbf263dcd5215f67698bb9fa69da70963b7d42a352126f04254db9490299a8572008896608dbbd5833fb233879dfac8e856cd60ca158da5b90ff60cb1886e73626561e73d60cf77c7ce6e8b9929f0bb3eb89965026c4001de32ada8ecd1c31d952bb9482037a9b7643f28de1d1cbf574f7c92f550c167bce818c25a64658e5b598c1b11657fa22fcca90f50f732fe537e55655aecb9d95785b4f4097b52e3d8c8544e643c75611559e500327fa7d86518c093054847a6f23b2784ec13de143f4f97b274e708bd306432281702a3fee283fbc455f7781a97e958a89b67f209538b00a5faca7468112e2505ebd5f3074878d3eeed71b861d7dd67e8c121ca8564aa047293bfa648c6e49935677786ccb3bd95a56f920448ff79bd0cb7cc3b3f55e69b6b7abb3ef134db49738257120444a5f9520e4529a94514f0cb37299f949046f24db8f76cc7521226ef309769fe5381b2b45847124814c98132b47889513a851be48da4226148c839b3d2f96fe48e90843458df75de794cf2ee0601ba417e32cfab23b124004a942d1e439c207777eea81587bd279bf45c89b2e08a5a252aa6142a96544d338eccb0b443f37b5b9be0f38d80459c29335c66423af70efdd6dd5a0a39a64a51f474d879173a97b312e26e4900802bafec8ace3d01eab73aa065801b211e21f0d37de258f8493f1517ae9113c08acb3c504e46af1368377b50d5012ddd4c292b7e522743acab80f3ff1a4eb9bb8a396bae4a9dc3ca1751895fe3ea9ab610c16d0d36475f16bba1aac9cd09edab6359f541ba0710cc6a2ea4d6b51e46a9daed95819fd20567e0360dcf4d9f6e287dd755c4cb0f4eae7906eaad3272b88cfe965a17a92ddf08b09f8bf6ab8bb70ecbfe5a3e2a451888039237367911ac4616f1bc591d803957b6907fb56c59e7674eef22bbcadd018466b49a0969a648622bbf9a3622b7d0cfec9d4ccb9093f61de42770359f788deb94f7d905cf9f5e59167eb6e0b36e25c278dc85a79cb0fcd9d75e0cb90d0fd0e2047b67bbdcae0191f014c3ef95c5e91624a64031554d3db8158ca90a9b9a0ac17b5b544fe55e05be92b891e7db1644646c8de6c95c68d971f51a9f282d00fe192efdbd752a93b06f5c7569c62ce33291ffcedfc7c36c62d92e1f53dcbe48d99113ad7a6408743c0ad0234457714ee9c313d53a8f3c6f069039f158083f82ab42ae467c30d98927ff26e633ee515b62bef16c32e723113118ef0a8eeda5410680a1dc72f8255c9a0e2723bb42fba82b50622888a3345a7dae2ad2e69008b7cd059eb1c3465ec4cd11f8899c87a460ac3af82872a35ec9e5ff72812f65947decbdfe5420a9dd712de46411463fcbcc1fda5d8cc389a44df1802ba73f07bb54c48083ff5a6f056d2494e703ddd64f8e854b527c42066f62ba05deae21ee9602665e9c3bfe6eb4ac526339ee7e6a797decd3d3ac0877a9a88ced614758f3e46f20c34286a313a9bb06500f261bcc66d87cca11000b41068b8cc68f4827a25abb9abfb5f1f50dacdd4d2f0bacfc06571db7ade81488aa3e961827587525f279eec90aeb88dab42b348a6d5c222a16f7d480a16e15a61c6f4b9c24df138af618b28e0c01f197024b2e0b2b8fc04d0d61006f3872640b6e8364c987cd230014a719868a6c842ded8800754b4c35f85749453b47625ee5cb465b2cb61b320ba486e2f475a7b96b71fe4da18b46412ba292a2c705228d10e84b2b83980f1314d97320b22145b44f6e4459714153a2c98b7a4c6f392ef0b95b2a796d41ddbf038cfcbe354ae01061475dcaf128a651fa1d992909e820293a18a58b7696011055b4c6a696437511dc11c46d8e9a5650409e5c8c820bb34c6ff50341940eb8ba2c9e1753316aa2bed6c04c6e90017a3ea4799e85446cd48e120857c47b9945c0e3f560fcc3ed984080a4b01fb6ba1b0e58e898a0d8a3c053b2a5aaf9fa2dcca7da8a5b1bb8b6e4680aa2a97e26248ffeda3f6efd25560ea70a15b58b75db07ea596ad5b7589f3000431d4a17c141a98aaedadd00da1570eab2a74473206bc291f30544cb4957832ac69fc114b2ba14a55789ed0a0f52f0cc9f8609b8f5183878344e0182528cbd58e968bc8b925a59a61b8e06ab4cd5dc2ce6e50dd31c4db0dcd29966ef545a2b4d5462b25008e6c88eac0a2d1040408bab78a4146dbadfc28df9dd71cf2819fb24878347bfca9a34c8f9b4d1ab1e205a698a50d1c987482dcc67813c8bd728e435c968313363e490648def1b5727517ce30ff6d7308d39e37ae93b7e61127538678e82919884082e2825048725b0aa98b03bf75a42fffba16bdf80da6c94c0b0a408cca3400e599fb4b6ca6bb46ccc3d7b3cd0175fee20a1b98a808618d0df504583ec655ee7420a9c0893d20bacbd8d30ae829ebe8b321099469dd872686bd3b965ff8ed9ce411c41d0780171bbaf4f5e87a880688cf0f1e221c967b01707e45cf3b3850e27fe8b5aadc210d400dfd63435709488166112f0057a45a40156a94485a3c55332cb4dd9c74860e59e6aea0f03a412f0fb84c40cae1cb0f99860061d22b4708bbbe85c705cc7fe68208043625e157e95f79f76eb9181b2b3a983f4cf5739429284220205470f8f341373c298fd9b1f6fc24089b57cfaa6ef589f24c8baeac475c8ea51e09fe7c5e84093e0ac5ce7adc9cb37ddf92c4682f77bf5f41f8013ba63f901b2d5a3a8156c0dfaffb366add40569b590e85d29bc2f449bb7d94ac2c786c2b35f2a759bcc586ec8973e77389fd8a358fdc4adc8e9fa67cd172fc01e5509eb94b40e218b569deaa0f78871230bd20856a391c1044b79ca2b227bdfaa2dbf5f18bf93ef7304f49ba552b9588d962c7d0855dd3f3dfc36c2e2b550a60dc94c156e848f4c06c5f1e590072b73cdb27b8c6e838acf153a5425133c4de47c6398a5c5702695a251b994a7eb2d81df018e941970909b5a5f4854d153b2587fdbffb25209a6c1aa9ea225a39acc23d679f83bd03ea5dfbc6edcc7bfe924dc90cba30c038ab6de0ef2d325a0823148e3c15492730835e1830ee518d3b26d2947dbd405a03fd21423c2c1204244808a00615a1b6860af80f7a573b1259a313240c4fe460177422f1b61eb6e4b25175af62ca444f94888b3ee21f0f6b417e4e46e64a44dffda1c7cc090158c21ff1ace1428a3082397f6b200d6f63518fee5fbfc52527b0d9ee3324acb976d3756c68fc246c0e4aedc61b6133a7ef105fe1b96539b0074c809867acdc6524d26d6b556b4e6d027d1f373772b5031785fd24e82fa5cf0cf278ef964bc1445bb0f327fd8d017d39ad5e59793845955c28b6aa81da58a86008bed86eb3b4e4135aec04b404e7d29a2178ea162217ea703a039770c78b947ebe2d55951e4c3b7be46d18bd3ad349f33a43fc6d0da63992151599d3dd141a6bd8f79db528cbc0db0551a84a782b6c301cdd7b54730e06339611b837a2d6a7ab8b8f7fd139ef9ace625ee2fb6bfd712e58389b6e280a296307d5d89e2a9a4dbc314e052798e5617d52bff509dc1deab4944665434cb097a887d817109bc3b32e2bce2777421eb3b53d19356734387968eb19e9f76b032805cc47e3bc7290f7679d5714de63bd83e1468ff63fb500ad1b466e0d807678d502b42e8cecd200d41fbfd457f3d4cc80e88a92c20fdffc45b3c2fc2a4472a5d39acb9215f24653b05f0bfd06e1edfdf764828326ca3663376a4670e9a133185c6d8c85518c9b1fc6345ac0f391991a5d032cc1471dcc143e71ad106353bba13364ac86813927d1913e042e29946f267ad93efcf973352bb5b7e0eaa2f0b0d21e8d2891e231016296d5bb5ae00a1847bf96ed416d3221245a0034d6ffc162bc1439cce2a876fdda03a46bfa5aeac799e252248c599080f60f5c56cb1a5d0a7d7437b9713805a095ec7e9bc3fbd78a5beb20510d515449946d73d6c55a0bea506b387f5cbce62cb3a79188e34b3cca2a37b5368f9b5306fd21c6466897e29cc41ba42a41173edc33aa95e55f8fe8fe1b4f2a9a17655c2ea1421f60348e418c67a10f4f2e27b88481c5dc4c6f14b99d743bd0c5b93839b77e5ff327d3f919a7548c8bae054e2c81f9f13d7a455613e68dc70489fb7c6145f652729ff89e181c94fa3d30bb30e7192b1ce006e504b97b1e99648f0df068d0e0275c97a4e7e55dd5a9a255a0bfa9a3ee64a9b9f54ce7915fc5ff2b0c0a6a76a168ee5c5d2de8c1cbf56400175b7991b402edb4b8a88374564e00effe04940cfbb710796e14cf29f6c7e20318263099464342cc536b77bb80c7e3f95d538d5d599e03859ff453de2ec62a3009ae64f3a048c7079918158aa2e2281a8829d04955972ce4216dd58fc19b7c738ac6e3d14627809c5e14b3eb382840e20c0b039d786ba8f0b17ecd13f3090dde3762d74f16a4f29c9cb9accb1afdc189b54e2902399aa88968b994a82c16f4010ceae8dc49372a0094bf0ad1362244a2744f013cf7889917a660a4a5a0747376cb4911f55c01d453050cfbe69b4f6900b1dfc3598e175fb4834ab9b82542695bf2e01582d38cc160834dc4ed233e8e040dbfbb6d3bd4cf41fcc02e5b0bc33ba0fda101ecb1e4d5af6f1371f17e2736815fa6b79a75288b98280483d1a222b8ca5d150abf7d4f7d4229fde1052980a17ead2544d46a8d76ac47624c99ffe521b97e2a1caeee2668fcf3167d0088ea6d469352d896ee60e84966ac00f3d390ad07a9f7eee19c0a9ac549f53e610603256a13cdeeced84341314ea230171bb8ab12593bdc18f7efc6964718e83c16a87a9803ff679f67f6ff5ae66fb58adff01d9d3ab1164c965ea6456faecdf9eb1196a6b9ad19d89f6715df3dc2e81e26dcba565e1fa138c08cf078e1114638489d29731e23be1e6107975bff15684ac67f92a5892627ec413571d2dccc1cd2c95646b9508d042a8869bfb7e4b61dcd5cf49aad55e389ed13477b4c787374d5d2952aab9612fdeae2ece7749fb2e3d1776dddf1b84efb167249ccd5afea9b29dbc13034df5a80e7499900be0490cffe63afb8430823152eea27622b34fc9f4b658dd1ef02ff04235317988868fc07138b134f3f6cc1b2739f1dbdb17180c18077f80d98f346170cba49580247e8948432f9c37c52f18f61a46492c18d6c3d508ccabd5a7c7a67d4d9d069b5259d96587031f39708b9da1bb0becb38e50497cdf6b73e29dc90d191dd8883c1dd7f90e03777890e858e2dd12f5679eabcae3b2134305483331cf2fb24b64fca002eddb887d775ba315a58381b8276e704427b040c86fb7d73615432845e679e67d2f96912d6dccca280e484a7e3008c76c0109572d0d22623ea2bad2affb41711a193870a07e2a47387dda05ceaddf30792e627cb8bd8d4f9f9e2c4a23cf3ba909f8cb7c444ff7eba8e83cc98a2b69e16bb0c681e2b807052e3fb2f0fb82ba04b2b35578eb729115cfe050f720190ecb3b17eb2c778422050fe1774515eda701b9b19ba496fdaebcb81be816834c037ec14443a599a366fe6fa4e1b5b0ff99b2d0433d8189bb5ceeb07f017e7ff99110d77e1e7e0af88f7b706f5c16da2b2b0952e360d4e686b86b209e4db2983518a4336755eb56b400786b7e97ac8849daadadbdda9d9926e586c19c2bad409e87633cb87f30a0554d5c8d00c051446fc1216c67c4a9879a78e0b2ff21260b3016126db64039c7102948543463c3b26e6f8397f4f5a058d611675f012bdc51827be7d54801235fd5da478b16567f8306c7dbb1ba3062be161d7f5e762a010747498f1208880f3a1669bbc18d77f7c16c2ac74d4d16106208db986ee317598b6599dfd89f9d8ae5e88613f6f2eb74c268f0037fc6792033491a6313b0b50c9c31c95be1a24cb9412f013b5c62717a9409daf64358ca8c455e7bf0053204756e0cf4c1c054b1cc3a595863d711406a70702b0e71e6ba5db06c36733f9dffe9586abf70158c6ac2224ff4d6e78b7ae15976eaebc2533f3595f42a7ed075d5078520db8d1e28fac1bfc50c5fb08995e3faa7d5227c4148e12117ec43022ec5f2f986809674d4f185555c8865f23593d1c3082291aaa0f3885527673271fc8547f17a7c1f49f451e0a3c6cff3143e73a813915777bae1f6d5db449872a01122ab5a402689606c7b496e35c4e16d6501153d93a450e27b768e8c769a693d6550eae129c796c8a65d3da562e0a59945f036cded1bd8e8a00df2408af6dc384d29b93b788123668d12fd825fb3e688d81be9f3f6cc4ab5426ae782a534cd3270fa966b35119d2966792a7f71e96c5aef30fcdc14619d1b1664ba702c7a6cd8034bb9b167e99461fc268189b25b8cc2703910a78327cea604680a1715955482e2e7ab5761fcdff435e904882c85774d9f65dbb518720114c3aea9274f98c685155e3c5af6d1f551d9729c7337a38b8d1940f4a62fc54060b8045fa6095a7656120df3e536f70fda29511ce727b1d5265c8e30728784c2a36337a2f385845bd9575fd6574a5b6fedde179e74074d23ac090cf93a1f4b5b48d436c4e5855276645e21433d151d76c727e6d735328eb95b61386619fa2bfde03d1846112727558018f5831259c7f5481751cb117b7057f90823e83f09bbca1ce3797f626a4838e5d15003263545ffed59ad0831a65fd9a30732d65a809c3866a6f11a2a82dadb7abb2986282e0668a9b395fe26a99a3f71516bce49fc352a1aa31c070aa0d583e0da60327653c03451772fa04fe6d107bcf62f94947351a9853e346fed9b5586235da5714e2e2961e3160a39922d779ae40bb5dee1f1d539584ad48fa5d0ba8b618fb6ccbc8fcaeaad6baddbfda1a3970591eea44c99a6976d7a39a998e666cfe63d0b2236387b919ac2a5512a02b75f33ddc9e52ff42c5a40ded24ed4bb47c247cea7c2d103a09f3670d7db7fbc0829486ec5c73aeb5f8592c3fb0df7e9c843ecd2d215e424793745f76cfcff95d3a5937145a968be6f5bde8b713db1c88c782376195d0047e04cf9b54d39111361496ea6f8bdf05c00af829e7f890e9f5857207c6671c584fad2a540daf27c90dab9390fb5b5dd70aa5e90de410706d89f972668fdb08da5bd93e47b9cdfc24adfcd3e67f368d8518262a3d4d835f28af8c829479663efec89cef9c67962836a02820e8d2ab2d7ace5816a1b4881c11d7d307c3c35fbdc0efe7309f13e2e5eed0a4e409f9078270515e0172f0c7ebd3e94895503728eba5e480ca3b3d2eee24dd1b16eac0eb60a861e424c1acf2f07ae7a102d99fbf005e9cd1fd19d08ee789e0bebe195162e9085c4d45604e4b0ad1faecbf123b731ef23e059dbc5c9229b0f4ce54517ea35bd223f4311cdd8abc90d0b5a5eb110d26c3be3cf9b4fc614ed8afc9d18b20d4e862bb03fe0aae22ea58386520c3ff88efbafa7b477eac12a6e8b49faa9cf1d7412c64b900ee83fe8793aedc8d5e5c3b0714667767d32aff850f7147750113c34eb5d5165fbd90bdce76100d97ebb6ec115380b58013fa68dca2aacda6e04bfd87f2c1bfdf2de4c14eacac90c252abfdb00481b2430274c76faacd80b96bb3e32a06c71636b7c1201a69b0489365b4c6a1e8e0d2d8a154253c90676452cdb78d95a17f5464a0cc494e3fb5a3a9c740919fbd3eb9e3da7ba5cf81f576f81fe84e1526b2b30cbc65fd43181f90caf34bd97b6066ed194471b8e8eae46836b211bb2431b2c377d5181c9c281d37802f7df9a87488241dda882e88f2006076d0c8c0d30cf3a296586d70d9cc4b67e6b3cff00b77946788daaf344e12eb9bba7249c6074ab0a2dd652d2127e85519d9b03d539fafff3bf513b8273492dcd6936815ccc05787e92cbde9109945b93c9e14aa21b62282e2f859ffd59eb686ebd26d629f27311c6fa08c24b8d1cb9f056f5d57a253f053c0e70ce81254ba394f3a1924262ee7c13d29d9a4d2e69163ca0eb16720df0dfb7d407afb5df7f14ed444663463a8ca41dbfb5877f2784d2bc64cadc5be5fbab3955ce8122f48fbd5ba65368deefff2bc79215fc894d570b929b5c9050013c1cd9a424cd7656739a3a504e23ac40698336ad1d8265840a8f45b51057b0c737f0e5c25bb5cc7bb2804be5ec891d237f52196ce51ec045eff2b401748e7cf4c4031634d97781cea3f7ed69bd0b7f1709331deca3cfa66699641f5452e7a25bed42deafd02864dd0898e93420fdd696045f1c2b729d3a4b7c8549c8000618a8cd41f6635ee99413d6847be3caaa2923a316462ea00b07d8040f66ef1ad71d83a2eb58268d2a85e539288e52d49e60612955241ae61a3af8b70b6e18f2a8aa49b628f0ac4b078c48988b5a3e54ed817a10d90d055c835fa0c39355d7680547f224d162414564ef764a60f864acbf4b5fb2684a491ca99f97829f6629235a5f9372bc36f14cdfa1d5e30c7169105962dd4accae08608402963f923a4ad60cd7d19d42c128a56e42f855b2d436404338a18c4b1fbbc4b6bc73611f2abf169e0eeeed31c721709608e2bbced3991eefb8ee0ff2f1bef81621635c9f87cd0a4da25b8e8b1879c5055526cc9046c60c5e44b68601e312337b8612cd82ec78752a2166ac690111509d4d7be9fea1b5b51ed3e85948353b05c9a62ef72d987995b984af0b5bf7fe3e536dd029482d5061efb117151f38750d04286702df1dac7c5aa2b29f8f9f3075d6c93d77e88c8f54848b010ec6fbc08282636fd8d1878b2a5540c0199004cc14a99ccd417e580cb898cb183b2ee643ae70abe608b1a8317b3305a667ea68972176b16d0b4a6c23ad7ec74feb8ea76eaa409a24cdacfe61f75bb6d6119f74d21899ca3b610d5dcf7094d133e74c53eabbda05d1a291d2f01157d6ba3ba011a50d9d05f6bc430f3950ce99e4b4f50125c3a9ca06e157d965a932eb23083661bba9c97360770992c2024934a8d2bd04b0d3633d81f2d49516b8c8410f1e1ebc487691629cdfad9588c484548a9dd65249e53f11775cc139b8d9c22d66914369ac3cfe18a04f183d76e62ce15c1ed6cecf7ba7d7ca0c2361228912e9c23abdd3694144d0d91725ca1c3e1f9cfcf53a8f6ffae6aff69aaf1549447dae4bbb0122c4521b8660bf164d45d962f39eed587448945fe7afd4425da513ca97ee5977146a56d0c5c5d94d2c657a0bfcf7a36807d3f90fe0c3df97d0e960f39491a2aac47920b3f15f2868fb9a5a65b871822a7b7ef6a48fe8472f9d8ad04861c5bb1ac78adfb182ef14afe30aa235dd44b7b2e00d1db06f1806b62ce53ff9b68fb98ff1510a12a53c155c26ed9c9e5fe517b8ec172a66ea8ac11d29b48f6802e622dc273012b0b306eada4b50f4d5aca6a0cce56cc8b325c1c318ce3b64c212644e62ccdd97c26a93b92480fb3b70cda3bc67160f65b6b39e2aeba6d2a2f40f62edcc5e3939589b71d82b1f21a4380c41a14cbf070da558dd9d6c38983e03c0b0aa45dfafa06087066f638b56b1eb9dd755f146c723490021dedc6185d84aadb4c6685521be0509f2ba17c548f0b0079b3dfbec999b59c5b465c0685a4a162573dc2c6b6e6e450b535afbff1a7614980fa3dfc9276cea299cc7e34a3f5f2b3e018e0a94ce93435e5d0f8832f229a80afd8586eaff97f77ad2e55dea3eab2a84e14a2354e42ca323458c46d495040dbf6f7fe17c67bccfa107378bcb25a7c3506a03ad7b48fe66c8dcd650076b166422b9df75b4ba875012fa365fc34de07376c9e885a6f0e8f7250c6c2a3d6d3ed14bc8da721861d3386753810fa681c4e74c177f229355f4c5c725f401205d3a977328839103e277da9b2e35c10d1276889a50c968bad4d736c8b930f8b0a26acc152944a89ae885f5e91a62d9d99d203841d50482290f4620a9423abf3bce2cc1ebaac280bc12fcf7e61aa70c811b52e3478202f8cdaa2706a78c848b409f811881d21071450eb569bcf2afb3c897bd41c2e476d21c8065f3c160982fd0e28a4ec9d5939a26005ecfc26ea848bf6d109be2b0c6db2cf4663e571b5de386d32501febaf652ab7d0d6e4b5d7953cd9640b7eb0b0a233b24fdd42992bf875a87607226597864104499c326c4ec3c4b901649554afdbeca8bd298e14395c3593518bfe9f8bc4f170543d0781819241ce2fdba67dc3ad023159dc08ec1d4b0cf04632fee2a4338d7c24b2bbb1b53746f8a675456ef81ac981357102d622d9ba400db309cea757ab2907f1706b2df9d4ba8e05b3381ba4164259b27e39bc99f66b87cc0a2e4c7a4921d5f46e0d892203fbdc104179c6e1108ae91117cb3a7ffa68af6b25b5694c4f0555b68954741db59b420d6aaf5da1494d4a7e8d53e8c7f88183d7f89ea9e393aad28792df8e272a765e012b60189b93339141fcaa8fb7aa9eddedda5999b4f0ba130e725db4f82a49a91c62d282657b9c91f81e46ea8b18a7ed161adfb98198a80c22e176c286c3379f4683d1e86046afa35488145759df70b840fb876146f0e01fa37631e800b08c876af3d254395359e6247ad9a2e4ed59ef6be0b1a98e16e8b62859417b9b38eb2022ad3612b8288746f90e54f7af520bbc077380caa6914c45c2d30ca40e4a3505bebcdc5299894e4fb25119a550540dd2296e6ee929b7eb0c6f31001087539f5fa3fe5ac79879fc22234dd5dfdc6cac91d1e3e7b33d0c37bbd237a44e3c94ace7f9ce18f0f7d8de0470ee3047921e1d9cb0761210f54ea757c3d39de480b6f83d54004308a3c8fc57904ea5311ef1fe84aed1ea8a179572b05194ab5471b19e2b04b3a07fae6d04edbf6decf3207d1d67b8fd2563b7e3d1c6d5999c2f828f30816574a13a06a0125247c6d4f80e17721eb10b5012997d8f1406e2321ea4e44087a57bbace6ec329f98f48759b0738000873810ee98303073b68f7890f671ed86abee0ad139dcb9217396fa676d844dee06392393ec39e08f28193f9207239a80d61d91800e04047738fa4afc983c047f6653880d39acb03311e4f47e029a363189c902557a8fa5cc00030f9739fbeef3197264c04003c24c48b7b90fe8f4b0b928c321c1926a15ed1ff8ffd022740b8324a21541c28188647e99a3678bed792a23d9ff00772fb931c92fc4a7482cb28fa61542b2f4929552353a5568c222266cc429658fe5ad6b6a4440a00b808ae6c1cc95b477a801dad23739dcd9b7805cfe5a6fe72be5795e9c96969c918692fb633b23d0d087f909cb84553e7f25ef9d1a3ebb04822ed8258d6f8308e38d051586259b101d070f69f82493eb16fd021bc7ac737f6a4de5618c6428e2718480a42eb512b009368ec61dad9198371bd130135f8cfbed182cbed89648022ea545e50227700b5f8a56788ae8a1832453cf7716743f184bcfd84a002faefdcaee2bd547fabc64093de2789c7b31c2a749a27cfb58f6ffc8e07364a259e5bdc0ea2b7f29141282705d20b78c216ec179086730cc89e551c9da02269e586600177a2dfe098a3ebfef70744391cf1ac5e1c7126581d4c93a61ced9334dd37b2f63a000352ec66a4f4c020d2f01da0cca789e0b75d8888cc7d22b31dd187c0ccb329d1f8f4b3234a8b0f59fc7cc44fe9266f1da8de1573b26151626f0a0856dc626828e4959a0c60192fa78acf57b24b6cfd73eb9f4461dcb412a09224a5bcb7d52754e1bdb56b472db6a7e6cd7225acd35da1c2b38f49d416a7d989a663f81c64d5d56405f416bb9c94cf27ad2543300111626365776efe402334ac476ac89b108365131ee44d26a07a68616d12287893518664402c47321fdb774a16cca8386b90892ce61d38202941dc1311000718564817bb5c0e787cfc951e22a459af66f3a707e6ac88d63bdf1dcfaa2d89cd168629979d47e55ed3d7403a01372f4d486c501dd7ab83bddb47c287027fc20b55a52afd40b6bc5c3f180e46c95e3ca4d0897d7398ad5deb40a6be340c14fd46ccfb6f01626d89af1751adf74bb89a40224f7701de168a500e883672823c31fb66f57792c6a8ec3fa0626b96f7880519893dc318086e3e830208fc935d681381b5c6fb817098684ce7186364aeee0c91f5c641b4037d43741ddc0d304dd3c634a6175301b301e155573ea3ff964378ba3ab1e3466108d871d12989424d5cf1f2c71e0c94d19d38937291696c3b93a3556e95281d60d011bf4baa84beb2e7aa5ecd957e448112d0cc49e31b9970f4c1aa2e395f3f2be53fb3e5bdaba799db65532f3c538fdd32642d96bb22b62a74ff6773b4e86629bfcb805cce57e25df63b88bf05d55ac859914b2d57844f4e3974dcbf21a6fb2f41f128f461d278319ae8099ba8107c0520357c0a509459bf32fc9836953274ee21e77d163e7a07facb80a5760c0fccd6601083dc3370335e82a1741b4f0d95ee81f8b0bd2d99bf3d3020aed0cc094715257ae54876c86857aa76fecd031265b733741a7dab05d231ad378c1edf620bcf4c40b71ce77dd1d64e76333f5bb75009f2eee39da9e650f7796abdcb6846e845e85e74131f342bf816ca6537d9c3026e3ffbf7d79dc591d4cf40d410642d08db0a406341d05c205a0b40eb02c8188a5c515270c202f7d3dade1e933f7be49475ecb46732bd81d1da199acb0326b629828afd3366669a41581e30db11697173647ff2e9a0f8c400ed4185a5e63456d831793121d561d3fdfa897e772d94e5f2f3a15c1a015572d581dccc13c61909e13cb0ca51f720a8695e76c02ef47d1f7de6b89ec5e968f21e14ee8156f3ca75d6d3e7d931c45aa0f8045b83ae350d17e0f05e22d84eeb3deda34ee2fecf993f1f07df41661c3314fd4e8b04a6e5d15178aea1cb60944a2f9f36f2fa820434eaf62b184360e2f22d149e78bef5329fa5a19da94829ef7203893a6e0fe2adc3d4544cb9c37bdb4821f52444668032efa602f7218c7e06ab853443eef8da52e6d22161857b362b8a0a451515c5d3a0bb6ecf80db93e6b9e6e46a8cfbd67c7e16b96c2a5f36793dd72b99f89a9911b1a0aa27e4de7d21ceac8ce0e4fe62ac4d65368f1d106970667d3b402c6b0b1fa4cab38c2ebebc6eef4d006f10d1a80edf182faca38007551a4c3552c2cce967a8b7b245a0718dbf8f2f965e607665fc69af9478ff875e19be031484ceae7ab6ae4defeedcdb25bcbf0d81e892f7dc5133786653a25611afa47a7b3cb5975c059152c1e9640c05777950c5133f76fc734a9228842a8640ab0994676de8efa6a883f491d7112351b8d81431fd46396f08d8493cefbcb43ea1a028ff49d052aa5387b3692a00e6c1c5db02cfcf904b0b8ab4df39322e1fe8123d60525c659c5e8502d400edb51b1fa76440d3effaa9740f1bcc5370e0da6fb6708d3b2858b531f742cf4a54a244bb3967cf1af5e469c38f14c97efafd35a7f97a1a1d371cd52b0d4b74d2d4cdd29ac553892dc2e1622ba3fcb408ca334965501850be38a902e4f14d422e65c7d10faf40fd98ff751ff63df6430aa29770f31e2d51f10d337af823315dfeffd8c77dc07d90c15ed932cd84765b9f479b570502ddc9c24393b5965b04d04f0ecd6e40da22b9594f5ace0863960f2559083ec9b4e6627d6ac0713a3624efa6ff931f90946cf8cc23a621769888b0eefad43f904dcd6ed3e6114184b9f854bcb434216998b8f200e2121dc575410a9786e08a0eb4b6c6f78e5a057f8f3e3fb4f6b8ba71cc0517aa7a9ab01387ac4e1644fa2397ad2c1329fae422a87e28aa8f95a37b76bab32340422cdeb88aebd4845e05fa6eda3b7ccefefdcdaeb3824020b3efa1a6437fa2052ab732d0c8634e37fa4d5e32c3eac743baf895caebd663fc5f3744240b9f2d5dec7ee4673c521efa532d92600d40abe769c566647e0f37aac86daf67d27cd393637e39a23a694c7377e8ba87dce197d653c0ef155cf7a575186cde1ef2dc93ad472212a2af05fdc82dcc64e4b07ed4da0871f971e19057f3c78f7372d0bc043f998acf0856389c84334a5fc672d823c6cc41db2ed47c8bd3cf20e8c519044eb07dfaef0dec2659e910dcc94a927a0005ab9ec89c5075329cd967702cb1d7b52e80e95042994e02af69bf408d623d4aabfa9a236e6dbebc0abd7d97d068129be05043204151918f6e5fc422b2a1a4ff780a1c39818a461a10e14626d8eb1ce54ba6bc35e5905b4abe8699d35180ed491aa75bffff75103d74f61d2a0883057947769d66553e1c899940670cdd4c4a63d08554cc4735cd5708899b66853dba5c57eb1a19be715d868259ec511bbfe4c8277391fe44545b97fbd2e4569a08f357fdfa6d0903526486ecaa0e25b665fab2c753a26e8b205f2646397be12039fcb7aafdccd6dc95d414579a5e3aec91c4c4be57777c35ddaaaed33fe2fc02ba05acabbf071a81dee6a235fcfdd911c379c57c44db6f1189ba7f3b3bc0ba7431eeda6d235965a165666ab20fb7acf114b069388ba48931497e8928d6369fe6a59d3fb3328f469dd063e034e5a2250b807fa5759326a713a98a2101eac4a0a5186b17b686d67b430fab3a1ba98e9479989d2a4c7d74a9bc85cc214a8d3d4d4d154d15bfd529321b29b81ac44f8763ef5cc91a0128080a8f776778926e4d5943f2849f6edeaa295753ca6b84ed77b814ec531edf676770ecfd70f67785a60380bca750c9406dac605dea8a63d8ee4b28e5b1addbf7674611a6c26bdee6271e47c5499d39de4e5e83f8c255f1aa833f07cef3fa04e5eb9933f6dc146f17c48ea380e8f7e6a632e161865c78f4f75d03fd85a660c3b347a8941853ad4ff4c9ae6123cddbfcf56c3f114010d74ae8d9aae7457b60654aa26386a8895f7c9d9c6bde865764ddd4044a18a181efdc328108341545abe93c5d3b9af7f61465d9306d7d12813ef75c40f05224f0e739909d5ef2dd5eadaa5b9c2a0798035269a353bac003d5b5c26a75b8a4754c2bd5b3c9212aa1d27275c56a93d97698f626e4540e935227448a07cafd9aee62e1c3a53bfb13781608605cbcfaee925ca03f1180ae16a3cd9bc923dff53b018eeb0826caf58bebd889653b54c86058268eb23ac96a0436882b09ba3c42a356699fe97e7c6e573827df18b91d26a4762323c8e0569ef622c8a36d35cdf9855143d0596871a3bfb8e707a56632d02ad25f84cb7bf7c470facb335a81da2fd14786005a180ce0f91bf490f4eb3e1425b5733ed232ca3f796e4a27895c52ee8e3974a4830e76662020f65a580ebbb035b654581183d131cb0c2b9b7df606e8ebe2ed35007f4ecda95a0772af1e4ad671e881bcc80f2f353f6af149e9c768280d9f2638a5c7a27e8f12cbe257a93062204c34a9f45049efb5088d12423d1e260b11f44d8d0399ae2e76b80d8e19b1a95ca75d188f666a91e5f244172040b10c2dbd2ec55e6b404c124a50129a415ec34af8f1554ad97c9384c638bdf69be9e609771894d30985e30eec57129c27557cd655938c1ad2852df9bd64143d78487b70040d1775957287933294a71673c3dbbcc4e21a67aedd8da6989e678624e6fab649aa6bd0e675cf179f48b555c7266a7aad821c4f031c5164a33bac8df677e3c7a0d825b77eec8c825b2280398936d183de8b63fb8820f5da0fc84ba0a49f277761bd3f79673cbeaa65a36551eff73780c884ca0c343743aef91f2aabd7015f0e96600b855735757212fbf41448048262a004e854efb886ba0c9cbeeb6f8903834d80d15aa3d7fe02d21de0a5fd6c1f9d78f81ee1a9a047b16d85c70ad1b5a3bbaeffb001ee92546ec1716779b157cc206dacc6e53c30b053d211059f3202a60e35bfda7e50c7e4f2ecb983a2b7708f7200d0770900d5d9d43c4b097368484a36624a3ee8b6a9d13e50a6df02c0c16e60637abc743d0f61603bb118a34c5d775fea4aa56eb273a585e2991321d911d0d666de2170d72fa37543a60e1f21bf07bfce5050145c41f38d324ce994f7f4fa29a27239ba8741a2285e809fe51efe3b13252a227e20df70f11887537eb8535a78673f1f5fbf9a9d845db7a79c5f36d4d2b756e380ad00d1ceef4465a84c4528a31ffc4677864bcd0d7def4b1545be845636dff8423146c0a9326d4e3e410cd3d478f3415069b879f17f8fe88c2a3859d4fc9ed231596bde568d47d51feb2c709d424d16a37de0a1e4cc6fd80bb71da1a1aaf989a647df2dca58cbc4ba77865403ba804159a62622adec67fd3c439e397f9248eb67d1ed30b46b841d2d7e64df76b615ed690526b829f5edc8f4a8c690e10481c1f4752cd7cdca7cf00f712997f3c37d0676c0464bcd652ff4dd7201129a0cfd67b1a6d22e47f60470f511315fd7533c6ee8c1a8c6bf2ec434ada2f0024001d868b1f070b866faef2f98a70104ca449282995fceb01ff72831fadc70666597c5fc4f4b1c903796dce1b23e6cb75d6a78446c5a30a17e6d0b952bee182a46787a782f7888bef1c9c00795930201af407978e37910314901bf911a314984901c71dd2f00416fef639d730af82c48f0113811d412278cf3e223ef01d556fd0bb8e0888b6e8a0742ab6335b3420d930f4a40d8e0807fef74e03bb8c0c31e767f5614a8ca77944ab7f1a806c8bcad9e3d95ea5093fcab8a197fb27c1eb426ad7572b3dde9b313075abdb10918a973d03dd92a9003182e2abb4ed071d0b6ce461a01303e0934ac469347fb8020726784e47747a5bbe1e92cd29faabe0a042edcf077329b7021802b17a2a905e1c08e06a08cb138ebc826ce46340748b8d128d947ca10fa91f7a5338aad8edf878532ee5491ebe69c28955b2c7aee1839832c648aa9d0b419fb1be4d546d7bd9995ab9e3a5e3d214a525749993d5fd340b59b9ae8469c71cc3478dc6875f4142adda372f847ba9d2c1c075c169f947f86185f79792a89be2826edf0633254e16bf87fbfde4437623974252823b5ac466a84d91860e4c39faf97f6d3cd09c89f7e8995760b48616b0230bbed383333d1362c92f91eb9774b766cc453c194fa36bb128134e547d271a8830c00868616bb9aecb374f390a01e657d2a40d16ce4809f259b00f53547b2d8248f454c83b87aa9e3e6d02e5114401ac370c63315fa3a34f6b4a0428495a23c61d50816324f60de5803438d0b068ff57f73f904c033e887f2418ee491dfe564bbe754176ec8809903f0e9333c18f9e672012315c0228dc20db5a65432796320f10fc79e2c8ae584a2748fbaea4b88f1514937e82d1595a6e6904cb376008a8ba6dcf164365aa4acf5701f43440b70895b3c7381a1ae0ea1a76eafa96f2e454a414f1104bc5b4917d882e1aab705ee0ef37ffedb19c3136885877c06dd4ca5e0a52bfd9846a9ac201248c1ad67ed6cea7cf43809a50ae4280c5d2354ea40d777f20e33a5dbddfb36cac35f490825f85913a20bdf403f8e0d51d00b028b9c584052140e464e194c5113b0c321104a218ead76bcec144cb1f58f1275b2cb4edd096e5d17668a1ae0d9cd0d285ad7aeab226e77128b0555f71abb4130ea8b350dafbe89b1b42146b0f18cb7b651492730fa13d2860ef12d4c459e255584dc11e2dde9b2d5a64a7532ba28b9c35d1740950db2dc35f54f307ca97f7558f63f8739dbc1135065ba77c89f9fdab83e1cf6d577f47a6471cb9ee3641acbca5d5ab3a94708460f065a27b027319d87975392ffdcdd90250046ed894fd28c3ece9cc8b139f7aca966dbead74ff7f6dfa80841686a8fad4c9695631d928618d262a6c854d586b6bb247f614ca1551fa583865d0ce2e1ed1aefb201142d33916430ce27b4b0f9957a37eb42c4399c1d259d47a1258a258761d48064d792143c5458aa9e4f0a0738fcebc90b051c45e0c921c2ce2e01d376e5302a949fa0aad91118955131ed4c682a9a91ade47f1edf317a1d9500f0bde6b790fd766c0cec49ebc4e49009741e826c78179add1fed36cb07b19e93d3b8e4117e7a680d9f47a50fbeb9b685a55ff876dd215d03581c78d220730ff1a1cd63e83e97c950da39b146d39bb4b4d3d408d929b26aef744fc33f31954930ea1c59722495570a8fbec402b95ac4a109229ad86fe9a5d135b76474f524fe9f764e1174c7e200bf72414ed49a507c30020aa7395a5a304ea99b0ecaf40a3c8f7104c0106c0d1c2ec4cac0a3207dfef6c0197805186723dbf01a507fd2c1c35d050632005c773a10d6932aa802c22040b7a49a48582e95f96eb678d011b4ef9b39b1bebcaf977a08d95b6e99e49652ca8d05f0056c053d2365c89c962e768c6d1b638cf1d40f2e47faa671b4360326d128f38bceac1ac836c6326843483768fdb5496559366571ceacac2ead0de2272eae91be691cade71716409e17a535b82054b6aa27638c11e35f15d6c698e862273a75e454af9a7edb9b80f46e0880ce18d26407d9634d8bdbd534ea2e20910d1d9dfa29f12aa34a2df08f2234a02e1ae8739ff33500d51b474d5ac7ab785d1255be682a25669efc68f4808850adc04069c8a885b2f6b6ccc09e2fa17531f2422686c80c93313dd6b400a1c614af4e1dd96c3885494a52ce88c1c3fe20fadce7fc4b79017dfaa671f4d4378e2ae501e2dd30c370da04a8ebc6f8e165513de9882ad2e3851d31d080c420d59b048e3e7dd3385ab751c306c7950d502aac983ad24fad140e72c0a00244828a56f6ac273c2377d0ce38d2d36fd158335764388636b051e454c3da12327e60c7182b5f6460944e5249f606895acad14292a1b01b8410e18103489493d57115629dddc0eeeeee5c64dab868e252c585a11d9ce3071322ea43a01f3ddd335d67bece809d193b53e6397cefbd370f651287adb085adc0186322bce55f48e190bbbb238d4065f807749634c3cbb9867c3ce65111a5717e4131407dd3385a8f715da47a06872ea97055430883c9ea66b841160c309e55561155a13482aa6ef6786828f92f4acc028961bfee60563741b3f2c80d345ec0f0c28e5b1cdbbb6cd9f8b9bb43153585eefe3840376e497cfaa671b4c6805819af183b987a356e3c1d6930c584f9aa0a7a7103900e6b03885051c6185f8c313ec3647573df1b8e6d8c872678e64b8fc180dddddd5310234c941896ac1043851a67ceb2c88a8aae2fe7eeee476355378fcac252f36e3cbda4cff1be2c560b594347b98c3187198221d908366641bd116d943cf780212c63ba84812aa56cd495a57befbdda8bf8a6bb4b6d77c718638c7d8e650bb30dd3ca615b39acabea727677332ec8e8e831609648355d1d6181fab1c5fe209a6384924081c2066a852d9606102dec73c1951f971d463d2aa819585660f0df0fa4a4d701bf4c1017a0e6c0aa14c41762b529e2d320a85dbba8c3cb2f0b97ad1a943cd9707f40aa8cb4d66fa1e09b679aa0aa9bbd50493fdd7054dd4c435575135f5c4ecd9d2015e34a500c45d610c92813d2a0cc8945ce39e73046931941babed0b8609dd21011d3288901822008fab442695eb849e3c50608823af57a8d33c74138e9d501e08e00264869fcac5ad00082d5c9c6a323e64927cd3327a79b21c0c7b971a06393c051a74e711c47912441bff54ab6621530cc17b468eaa5d142f8dfddf8b49146a38d22f64b6fd0c9c9e96688fba2a86387eae7af6f458cc3c1246707febbfc22297ead95c85f7f7c91ee4c9261fd9963d18c5301fa899397bde3838f73033bd8893f921c9c69f1c312e25b9e1147b748e619e61cb0d21014a4254548084a14f147f1a728fe8e8338d2eea53735929ad59cb8d3d9e248bb17577b352752fab46b86a02f3a597b544bd31eac60052b582d06bfdac794acbcf941fc2b453b2f5f3a3ec69da037b813a0f8167782d6c40fc72935277e4512ff9274abe6c41f49aab502d5b2a1bedd2cf1773a5bfccaab20c40a42fcdac3b1c5af4a55fcfa5441f88bf845310c4551b4392269a25ee12c41415a52761cec2c8e6f495a4f63ba6d8f71351b792302dd378f71b49f37249d527335211d662fb0d61bbbf1873724f51a29146dfbbf758a006e4cd2ae28fa6647bb6c607e8a3b41c377dab5a353327daab9f02b52f836fc1cbeaba0695768f5ed6f56f821fd7062f920db61183e15cb0949133509ab18e7d4cd1d0a45b71dfbe00bf92f20013f1b301bb0f32141ef4aee54000a856f5fe88642f6859c2cc16157909c3301f36b6d043a774012e8aeef03bea520e9c3ea707382170c68adb5f373ced65a1b6207a7b54e4f543d333331312f2f1b921d568f299bd6138cb3da5a959c5cede8dab6b905520a82015867468e0c5df96d8c5bec985aeeee3dca9404880d4d15686becab2c4b16334b8a6b63bcc19414a20c3606a7b2ea0df30b1552244c06d8565996bef9734105566df8ec18d2964ec68e29989998a011627afac6e30791bbbbbb3bc61863ec2b7a2280fd41f4b9cff91732b554bdf0967424b97283c8660dc155498ae6a885c516ce37e79c3fc4c939e7ac556af1b492b498b4a2b4a6aa6eba8e8c9b6fca9f8e6c6592ca3095892a33f54458672a60803c2bb6dcdd913c54fd983851d384a33988484d65ec18638c795637431e635614a950866912a5c90cac195b3d3ca3cbcd98afa6a9444c154acc27005fb24f4cee3d8aa95860491264c4fab67c5dbe2f1f986f8c727965ec18638cb77ca9ba294636628bd97d9e145108f7de7bc7808d191b53165686f1c292c298700828a8518388113434aab02c13b1273531ae1d62513631204c2d6090a46f1a47eb161af080e14a1ac41812b44307638c6b78dd1a5fb4989d356a10b1bbbbbbedd9344737e8908a41680cc715cf9178553791924224268d14757b1f32d3b9d9c3af32e7523a179e7349722e4cee38e79c7376c718638c7d3e1e638c45ac1aa836c6f94a11819924b08029f52002c2c28927c31483654cc4a28685bbbb0d44aa6e5a8db021cbc92879793bd55b41ec1905197bba3eb0a9f5a246162c4d5a886161976cdd177cf52a0a0cecd1cfd76f0d71fede7b57b0b2b2b2b2c23a2eae91520599608c31eec2abba99148ee8c2a46f47faa671b4f69dd5848c2210c618632948ac6e86b627ba40f20232418a2e13a6aa9b514ca63493aa1b13249f9b59565f805c31caaa42831217387871617dd448cb488ca864a74c652a28a1bbbb3b550ba07577d7a25475938496a7502fd1f285880bfb7577f72a4a55379f421c7a4415aadbbb635929dbee32da60bf1e667777b3a76c8663a2794199aeaa1708e12083d346cad01603d8c018e3a5295537b9422f4d62e9cbed718c20207dd3385a6f10e3c863b400aaf118638cb7beee1698f69e7e30485795c53f881a12e6447d427a403ea8617536768bb48ab68aba8abe8ac046a0c7186351c84a44cdd7875cfb91354c1b4015798b5966ccddbd68da4046036fa98d95b0aebf2164c3094775b050039903f02062a5e9a6884f2a09bbbbab505675b30c793ae9c6f451b9a9aa9b24925485d083969f94a19155aa774d4eea5e230f14c8afc88c2ad7e747628b15a074689ff3b9cff9f751104c076632000aa588a48c4ebcd0f891850b0b5b4a585802d34c49c395c62bcd97ef5112512803a822dbee41d58c560082b66c497991e48465adc85c602d614445b60124e11a41553df0e9480a0cb2740345e43e30d19382749c8889161d4a5668e1826507afb0b1951739a0367e1c102fda60b9a2424d95a6243fa08c5c46334c1256c0b6c66846faa671b4c63d34b34c878e9565898431c6582cdb13eb47b5312edb226a6602f46395064a688d911a244b2ab815199a848cd8dddd5dc691f75bc7dc3137ec86ddb07bc52c453483322d6de7b1a49554966511d5da332bcc96d606ba28b548d3bb02e382244c4c0e33f303e4e9f1e523e902398cabba03461908c38ca753795637c31e120661aec26885d90ad3858f9072009e8eb2784947786940de1aa6706909060c1830b63b908d9c1f223c7efce86a01c310216ba4ca05de07f735d5a2b11fa42d339aa86013830b4d11a3add1480b8bad7c256abb971b4b94c572a3e80a88182b9489c95163ea8ac82f8790cfc66760c20d3698311b6a12f365086d4bea880a349a3a9a91b3dfc897872acac792d0c79316e3907e4b7600da6309979a5102467468b11102c272460810164be30b215978e878d99732b132b2116566b7c72b3ee78e31c61813d1b01968b2c285191c33a4f90ae243065f53453a32030d474361e08c290c6654f5fefdd6d68055dd1cbb23d694dd1166e56359b162a46f1a474fedab208b6ae4cb08989131236547ca23bc1ca39cf3e7cfa0520e57d282939cfd54207372c6a20a0dde325bd2378da3f54f53d9ef890a265778541608b855caa0e2eeeee5aaeaa616092f5b41d2fc909208c9924189fd11f6956574860626173fab348e0f217dd0060ba96c48c891b2301f555f4a34bf6bc1f6ddfc4951b251d02db5627ed9c193f4999f8209346ac0a0c2ac0c2acb9df93b9fede4aefe08d2aefd5aeb0002b03039db993f6b1de0c0658b8e364067673bf345545bebf5acd18220c5e1bdfa5eaf7e7dfb5673d7631841bbbbe9f8dbcffea1dbb73700dc7a796a51e6e04ffd3b74008ffc2f765bc98cf3670e3843cc107433a0e6ee9f6d1dbb0b6d56ba3e0d731e541060cd857f3f8419e27fc4e9aa0b5fc48555170220b40eb8555df8f76f5f009821ec9ebf2866db71bfe72fca94ed41cd85e177c06f77dd1d30397f52805484eff9ce0f73eeab21e3ac20ac05bfbe0d8b9ebf2a5cdb5e60047b50085aa1a2dc3d3b16ac6173b6fd4ff8d94e9e70ffe24a088356a80077286c4b4248ee50b83c20d9e3b32bd6887f7cdadf0f71b59f338408e2ded13ebc3111fedcf317a56cdf891bc79c5fc44dfaf9336ec4d1682388fbc7175145d891d2c6df381634edc717eb2e93503ff7d0b33c3748a3b6097c1dbd25ca56ddb910a8a18a714e3a272dc13833075acd8135377178e063ecbf0b0183d885183f04f07ba08298bf28541b3f08bab0bd8fafe8938debbe41d918073f6de6606aabc66943a2e78f0ad8de853f19bc76ad6109e02dc76b5b6a5140b7ecfa736ad75a629c1938691ace9e407d3bed6b4b8179436e30520ada9cba1bed6b8dd99dbaed161a8d81ccc6902e1b8abc6811b6336b1c6c533f284c0ea87457af4d49da9e3f28bc4d6d394e5b115d435a01c669f3a1ebd36e648c7bfeb492c8aa70e9521ad172e66867d646fa965632acb5993958f16f15041e71ce98a671465a1bc16a2177b417693814b64e6a6fe61671bae68a7e6756dd0ecc79607f0228eea634afcdcca186ff411476cfa7e4b536675f1a6f93d2d436a577e1d5e23d417271b79aa336294dbf9e30ce1fdbc1fc3d99e2fa39a9029f52902c41df56dae4e7246adf3d7f3fad3d31a0a2e40ab4a5940789253102aa273b6725c39f2626d993c29ebfab4f290bbf1fd59ebf5f6f83b0e72feb6bdbd1af7fbd16f0efe0a493e19e3960d36873d226e8efec578aeb4005a573040b5eaf6fdf84fd2aa28aa8361b7ab4cd0aa2da9fd59e361b93b65fbf2785d07eb576e2c699938584b683400e021e6cd6d4b68f63a7ec1d03e68395f6c3a2daf369ad3e48822d8cb356ac2cecd741a1cc239479867206dac069888fa5710aac0a0c89be4969a254c4071594145596a58b30694fac2a4492ac0f5eb652257a11f342e6c5ecd605e429c3a2e451b605c66ac7a36c2f8ff09adc7b198489859185991df9ea994d1afbaa395c108d49b4ace8c754d6d44207064a8e646810a4288b08099392fe6acd40a03eaeaa94e17861f212e565ea627777f7230e5249d8afd3a99cc1f82d7b343538d450a921a2c64a4d163eca39e79cdd1d638c312ee2e351d47499906a9b28126da6b274c0e30d8dc05156c368c9b775058a568f4d150f638c87ae13b0aa9b63978493b29b55025fd0231ea7f2cb0ab598bdb22f44d644958d5122a20543ecc22843f42098d5cdd07b68b0143234635ab4b082cb90265762e60fc7540e14344d54b8aa8059da71fb643bf8c331b6c4018ac897f465289422b23c9d7befbd4b94aa6e3ee1a02232628915d6b19265e464e316a2b8b802b388f006102348df348ed65869b2e1b9bb0f6d4065fc56c821c6c37771c618638cf10c65604a303c304960983c7773ce3967c718638ca588b05f7777f75de5ac0544793a496559b6c813cb8a6963ccdb9f73f4b9cff9bf69fadce7fc039101444626e3d2c21813e99bc6d1da07c6ae996a5395411b2c1ec6180f8dcd6003d25041e43a3768bcaa6e7e4123a6d190dd9e36e1b9bbbb4b11417970a483c1e700cd48fadce7fcfbb05f7777cf2bc8b6bb2b61bfeeee9eb35e446df7af59be90c822a689f44de368ed1863a2b1aeaab22c8fecc49ac2d43504e5824ce59e954e5cfd91dab8747d7a2ded82b47bebdbfae3ad8930bd1ce76eeaa693d43567806d5b18a74d06db97ae40f6fc6189b12bd49e3faeb29ddbf3c735550205d0d89ebb15b47062b37d69db64cf9f962e9b66edf9cb42637bd8f30783135a1b41a4f2b57b44b0c768ec9e146ef60e45972d37a8bd4331053576d93b14475deede9d0043910c8090646bef4e40b2b56758967b9eedf97b7e5d1a7be8ae324cd9b88dfb81d9da17cba6e4eef755b6e9eea70309178b895d0a0d68ad650047c24f0a0dcaf6effa5836fd4d02cec4bdd6fe08f42d8962dc3f19c8368aba53d06dff07b72d0eb72b8a715b1e8e4d6de4b64febd3b74bc08aa3d8f6829ebf2a4a3b143fc4edc437913ffcfbf8ed8f37b80ebbfa1d4a88bb923db69d8266c375b879900696e51e1fdc768f75849bb7e1f463dccd579ca5d970e044b36d38bbd76c1baeee11ac745e0cfa0ded316eb2d9b67969056f6a6f778de6b569b8fa1a677b11d686bbd384057e96843f435b8296c01f76286137ededa691bb1fabb2dcb8f1475ab371e9f16f70e3abd8e38f96863d826626d93e01ef14759be004dde383351edb0bf4f8235813617a5d4b29580770337e56b962dfe074f63892b59ff38338d69e567776e7a7e547e15bc48db813b45aedf920bf983de4ff4933874b6e7b433158ad46a3d56ab55aad56fb995363338ea2388ee3388e36e41c8639e71cce10f935ad619cb5d68a6bad389c1ff0539c6d896d89063fcf103ce10c01364edb11db0873e7b8b56eadb5d6f13b8e363fe00f6d4af4fc5129dbf7f1d366087ffc35af3ac671e286f66d126db2466bf383ed45d489a3cd0fb6af389b127df3b5a7fdf836255afcfce1e3b729d16e6db6a7cd10f56d5fab362ea3fdd1e26c25f0e3c776560e5fc3b7efd6864eb70dad257f87a489f00221cd36b4d6862fc2f6f8d00f6bae610deb535ccdcdc775b0958ad8737ad8e1a7e1b7b8b9f1091434156c1154e0c703c6edc23761df92277ae658596e14186cf1ad4541db620654b0f3899e09ec3a3fd847e1357c144e420876fe0f7a2610e2c8393dd8fbd6e2b094f1fe7833075d7fe2a73b1f3ce79c8f5f84c53d3e9bf6d83d6bf37b3c5071b6534cb0e6668de7a6d0bb04b054b177f57bb0998ab39d22dc6513e0db90b6ab95ec3991c237fd14789ff0b329c933fdab53b30df6d82b5c0ac7b93fb9ebf1d9984e9f5a6bedf1994f4ff8d9f32b9ede63c16ddf923d3edbcd48d066b459e97a337f5488504a47a0ad683304ddb419e204bdaad95297a0e54e33d21f6d73832174769ee2d39f1f74c012212e0cc55114213fa57b9c359e99f38fbb9f4d330ebca5a07b9782ee9c414af6d8dd81fcf9613edd212e9326c21f1facf584db7fac1c680fdaa268fb2449ff678b54f4016da5d303fd5d057e96ec393dd0cf2fc2f6f86c9beddefdec1ebbadb541d1f6abfd0fdb71f729d9436756596e10b6f7b0f80db07798a4bd9a9bbb578219e284ce969aff33c13cfd39c94b060d7dd8b9cfcb60873e88b32b61d3de0c1a08ba36267a477b336cf07de66bab43f37404ea48d55759eedc12ecc1e2c60a1b2cec040d7dd8a1cfcb60677ed050ddf1e7496087fec5f124b0e3e38303f47d34e0e34384d581efa48f0f0edca7a4cf5b1d386d20822245260b0f2e2e7450eab9f3b33485051a3498740939b33377e6ef7438f065b9430d3043ec74ec8bdb41d284f9c5cb0649df85197c134272177e0936c8d87632fc1d68716015a41d92523785bda36ffd4bf879daa1091108badafe3b90dca1b0ad09b34ad2f6dfb56083a1935b534ac81dfd1f151cdb833d7f5486b694cffc146c6767674f3bb8dc604b10203125f8b40c802f8752d409142a985fb65489002c4dca141108ba42a19c5592766695d4a854ec5a6a52a8d0d48c00000001a3170000180c088603922c0ca3246a363e1400095b864a5e443025066391401448210c032100c2000cc2000882400c00811c4f43f604e2c9a22acd41d6e453e6111736f9dbc763de3087e9cc304ca15d4982b23872b0ee37c0b40adff7d1d9f7ba59703244d52a94d8b272d939964333ee35a9a9fde57ef955ca7f6b0424514e288a1babe80e0dc022124cd76934895faec09f4547c8276b99ed3a626f105ea62d766bed37b68e21fefa567d3c6de24da90fe9aff077f5d70dd37f960fb88e8f65d7a435e978a1d06ef5ccd2eace8f380710587a7461cdd1ec9458df291798dd4b268e39befa11c7b73d220a6eeea70a1e4cabb7f67de162fa019e2eaa50b144ae2abbe2c464f6630d5641df37f3e1f9da9bb733b450d72aa7d2f37e092e2407734b7a36d6a11762b562df6385edeebb9e3f40cc493179b3e407c6b6fcba58150a35c6acaca6eaa8a896ca7d2f43079d3be6cbb564c65072b19b9b907be78b6226c8cf61c90ef6d42b81735c9c4a00e2c5fc81ab1f4fc2a14ed0a6e61d5ad97b4762108c9ce532d379b4b55fb9c3d6fe38afa74eb17aef86316d0e54e2123ef3048ccf742794fee50a4a0ce2c6f6d9017dbbaf5fa25671fd8a6d6b053e369e2463bc2f05253e22d1a8a9a16656346998b8a28ec3e746066ff0a3c77db4b8eee80346472f7ae42eaf0da61a2b18a1ff82f4297ca10766acd47d69f9b998d1113e379e2048241a39cde64d079affb442a706430051536063e0bcf9c347f88939c9ff576edabf0fb8285072cf8b6a9f2965649053ae64a1637a916a842433075e03f78c214768a79acb5069a149fc166554b2ddcbb4b072ee320120dd9491b60258ba70c2227999f1d3f93e921c17f525b584605f99a8310443f0dfd5b4697226ba33e419853fb06bf6568515f023efa580052ab6bc2076064beac0b19082828b90e3b237063f212dc00846fa7c9588b34e847c92a0054db76d0743d8016aa7fde4e790202d7d780094e7b136b7ba824a847ce7509346c08f155647ccb99e984d9206b558f4dfb5357d65c6ff424b38cfa67ebb90ba8d74874c78dba91c63451ee240edc6d2390aae4b6de8ee555bf8c3cdf36e7d8fbe1b7026b81275ec9f45298225ff58429ae2cd2262b898f1efa7d3ed2c477285d85c9aa0cdadeed2314084b43fe6399feadb07a3d61cba6407165a7171e6bbed2ded4b22afe238c699fbd79ec044d3b97778458c9aa1edf8dde8f10270b0c3ab5f3409c94fb28d80f4529087a935d64f96d924207a59b38b97ae84bbd9c32412afce933145e891d521d205a6bb6ef4d3daaf94e3e7cba7c49ea8ab75ee9cfb0dbea953e160bc5f8b9a1c4d14afb72bdf48ddd44b45e76efb6f7d3f687663108a84582413156650bba1a6d0cc77c70865501cb3d0615726c429adb4a21344e7bd89fd3342f173786376d822bb1a3d30f756391b39f42dc04d4731b3e514c40a5b22f94b88cf1e0fc7952caf01fad6eba1e7a0091c43ba37ed873e617e8323f0f8fced5e9d126a66693d9e0906102845ee71f22071068cbce4a59b81bf117b86744625e6ec1300c4779995b7214fac6517db19fdb4344a08054e0815b492476527a6b0383102ddc1a0108cb16ff4c4ae2ea2dc9d8e5200f962a5a74be25667076c448723185bb993bd1bf52020dd6984a82992f1492a3396bb2cf9d69c9d7c8e3a0f1c32dafee66fcf9dc382a4a28b78d7a3d8bb0d6ae697c73698c642362140d0fb9e04fcfb7c372d2d1799b280fb6fe3617e85ffa8e105eb1cbadd68e0b2ed578ccafb574506e9bc0d43b47514f2bdffcf593ad938c4439dee5c3d7b18b1d2b4d6a12710545cb170fc63ce4f4fc404666c12471449ed72889df0c4fdb86b2982913e20efe53a6fad5acbd02db773316688862c75a9e77841454145f9b9d2f923b9cdf52c229985958e58f96f99ff41cc5ac5841a40447d118c86a3b5ce4abebc1c941faad568889a95c6225e98c8d6bc63cf8fd5c5a3d519d376101f1f6734ecfa3f135bfa71c6ea582419b66861dfc5581f31492395c94e6901a95cb79232c300c2bd780da9ef9b48573c1a5097f26a1c651b2a5291967fde73515c395bd9eaef8f17c174fcfa45c9726d99f0ac297555b7a68b09a043bec6fdb478780d975ada98d0f2fb8102419c21de644f85da9a5720af92c6887031dfede413eee95b693aec6171664fdbbb57e2a38cf75246deb3b33d7869eb605f9b3026301357b5b1a88f698ef9d251c6cf9ae95592b25fc72ff8fd3b1d6691b363956f15569fb00742f3a21c3f2c6553d7fcdc27ab944fdb83d8c230c485b4890b94fb38da32a898d227f2df20f20f3a79df65233e28bee05befddadadde77f3475565274656d601abc78885d34a40c0d45e530a25113e0bc1045a0f07229a67083528d365e947115d784fddcaba1b70f81ebfcd53a7cd8974d0415e649cb58b2ad675c8627447772394a4758e078a5d9790bf7c1be209af9f4c9f9e5b5385cd6a6da88f85c58d169ad2d09db3250a00a754f600a928224d58bf6eabaec8626b8a50acbbf9d807e768fdbf1cd607a922e78a7992887dee32daf9993a10b3aec133d46e1db1b8f364df56581b118cfab844e5fff74a02622c420c14b358b29edd8c35bd10e7f73c18d2502406720a3d9dfa374251701fa8104d8d8fd502d68dfaaa198612e1e00beded7394bf768a88428f97f1e888a6cbee61aa83e38b96cbd9574af744175b06958aaa26f2127f1e606e6ffd84a55af86b940b59e1351756c4af75fecb4b4ecc0c78c4298094b2592792c011327ca92658785eb614859c2706cee3f574dd0279de7d55f1bbf39b0157e01164b0b488c491632c022c0ca5e3220e9b0f306fdc0bed67e11f35fda5e4102a1cbca5bfa81965da758f9a721c84e98af8ddbaebedba3d8a3e5dd40153f25eda964670c79dc70d19f64a0281aff0e65168ee4ae5e60c60b5541e5c7c0817b7463dd0608148614595f367a53b04bb7b4aa1758ce3d87861de5703ef4aa7b389a92fea463b362e838bc2f47bab1e63915cc8bc3ecd93427a8bd14a93a8a4d2a1421e86258df83782a8b5fea9bc280f7389864f4e8d2c9d0b62cd1a748080716fe73c4a8d928ca8610ceb58715a033948947a3cf161ddaee44e3b8b5635e6a28fe2f0e619f69dadf68b2e54b2af13b3621863aaf68c50915b200b4a0f73167fee58ee1098c05890fd00758274aa3dbb9673dd324aa10549d64e4e376dbe8a8d686588fced65b75979f78529ea66103421c5ddebb76587de245e7a7df6d07ea684df6aeec2df2f9297ec56beb91b140eace33b2efa5de3168ddbb1f229bf57155a341927d4b580077dad2046773e1c09a1e8f0361122ec8395b575f6f0626912d92946568a9dfa8162cc0d671dde934fc99074c25d6c9ef818c395e5a89870095b1aed98899dac2fa39e2b0420723c564d2d862090fbd28ed5d658395de6a8366d472d558a4939161b89b8a6e51ffc59b56b2785d70185fbf529246034a423bbe36767799dbd6328ea4aaa2f5769f39badb12825d068ae780fe62ea4956003d1b2579413f4b323734be2c7e58b145c2001fb41e9c8eb7b8d4eaeba3e4789cd8743ffbed29b142ac66cda4a4e055dbcb351a8c1aefadbc385c278afbbbea5e41f4d8008fa972b8f2587137ced29ae8facb6e71f8c91c0bbaec459246ef14548d91d99badc50c3e39638fad89f912665e00c83b396c845396fa16e2929af792b874998b75c995de639a14cb5f56389be0ce52c95350a1df241a3cce0f179660082b72ae52bf5cd55829c140248857d6c49d33419610b3b3ba05d32842c41287451fdf6892b18d1ee0c8a2fa41f11056be04bf6917670afbf6924cf4c4dcb99842806632d7c2a01838924c254a934825537d35538137939f3ec6b8cea1ad1b8a1d719c970aae46a2767c00057e47bc322c6c9558045a3742413fdf8bc0b076f96525fbd06af5a37e0a0e0513a5b137b795f283e1dc51c54553f08e1212a314eeda7d35e995e5cb8364e2bba6d50679d12919b7ca9158f01a9e20ef4b8bcc34256ae0a30efc60f54aed6526666eb2477e572c9896261cc2bd1bd7de5725a5d652b86303a36a14535b1e6e3085f6c042162d9a2869b4835091a281a660b20fa68832778a1dacf0ed1fc2eedcbb866e462ca67d2d8322120fcac5137fc91611e2c77889b83b2f132680bf6213e41909a33d57e318f6e8ade0a45b8d52536e954280dca7197c9b8caa9bbbd03d5f6563e2700ace77f57389061baa46ece2f59939f9e02def0b7401aa98e117f61d340a2f9996f25f9bfa9a521fab2345ba0d95993e3a004b81635edf1d172d182d5ff0aed92f88127cf5ded867eeece4ad299f17cb16e192c0316ec07398207c634534ab974586ec136dd05ddeac6c0d5e594732f903e14d8cdf92dc3c32c0ee0c8c23fe6469a979ba321ad4b963dbc5ae3d61fb980e5a8329b701dba74fd3bd29f97e84c423161d2eaef620b0cdb3dc515a518305d4dfb9731fb114cf24951ac115251ffd4515dd1903445d7b9317ed033aaac88e8fa59a464f4026539b96c4bfba788e8b7b468c2f80c9abfade9d784e0d56acd694dd5a413812b0a17389b0a58786f9525ee196a8a444df3de928a47e97cf015d3e5552468e7f32de840f2c075d6c10adef04e0d2550a41e937ff84db567779fe49ff4dda836a25de819b6622a811366d6a716a2a621ec1b6bbf49385a90c4d6301bcea1a59fd2228ac854c62b6bc8955dba8ec29ba46f44a9dea523343d4405c8a9c6662697b96106e128d0cc9a5f77ca423b2c3cfa24406f31a1175b2dea81a5a11d29c36f13ff3a09e97d2a3c82fda68067f3f752644571df64fe8d3903f83a75737bfdb3826e18d86a3d8c502fd0799b3e6150ad5b6ba0e9f2bc32a6842c27dfee9d6b92842c5933f245a986f556029fde4ed2aa0e11138ddd075cb12c65a53f4d1600e214075513a5e9661789a2db156385c3dfd3e3c3840b249ba3fb40b9fc01499965c0cb31cd8456c03bb25cbc60940152051706e237a682a7329c37075933cb73b418d0c9717e2efd4b749dc5dab5260945660f33f99ed350a21157eafca1906d210816a72224b20047c3e9404b929022f15c44fd90349aeecc5ac0a5bc8d40fa20b80969ab29653d713abb33210aba282a309f285abd37cee63653464dfed9cae5938a05084814deb448082f72fd324849adc514dba0850c22d296673d105e059f4a900ae3dbb38a1d192e4011c68712af4a8521b895518f51a0e7a9cfe7e9bd5153b1d32be3180b99ec190edd6f5457f512989d0113359b05aacf22c47e19554ea11c4ce52ec6f098d0091e893ea364ac25e39ecfe2d91e1c49540eb81f48d3ef99bb9c13354fc67a6ab7a9a093b953fe4429063715ec7ac873d62093f496e6f108b5ba88329c238e559f7c6f286b0fa98f9486eb9aaa42440799659f12c489e633ef3f05db29f39c0341c1d02ba06a4bd84c1da41017782ec864156771172ac7c11329430c9822f271871c6eebcd50035a9d8902427a74f60660e8adf3bc80e7b7e0a770cf2504825e87413fdb494e5fa709a9b2c5139e0311615113b35da33d7a145272fef349129c79c43278f5de1a0b2eba21db274d32fcba6c367f3804781ce1eb97b9ce10e74d32d69cb43824a376aac7922e1a49525f8a2763024ec5826b6f63589b6d3a3e32a96a357682edb246bf6b320b3d9805e4af4dcc90ad2b0dab2e7c406c00ccd50062a2e4cd104854c0c2dc58d4bc332e2a269244af21e22f918cbd7889286e88feb3ab70e09155649c7752c29322976befd2c50ab95764e1be4640246404bc7f257f68fd03022e493b65d0b3201df08c4eae720592405b558950689ba259c261d1bbe8aace17e43eb1fd5ba5078c9796f135c1214de151dd85b91a2b6f584e8ea3635c0aa0210d6c130afd6a9e9576739a189948899099e27fbb05d82392cbe5181753510054d44d231be9cfcf6288b25d5e8d854549acf32cca2533ed0f9d7f30b926b2d2e80a276230adf4b38c13a4e3b522784d3c5ec8e9560a984ae6952d95a9d9018558e890e04247191c0b156570e41a4dd91f9a820f456e685880cce82e3837a4611894ff2ae8c3677181e1ca03eda9708ce2bd6ca74934e5afed4c2975ac792f4ad1fdd14e6ffb9454b8ac7e12eb70e5363c7fcf6fb095e761dfe70edb5bd386fb877fd259c5d49950b9f1cb359263c2761decada3c02153aa5d34a00063d7d0f0a38180f8a486fca5a93eca69d3fe77111a63bd5ee26291c5e6cc7370ccbbc8d61bf4e121acd2664769a6dbc8417f2d14bebc1bd511f4b0af919633510117620472a5ccc32996176131dbb1fe68d3d03e1d25602ecd205c62c1592a9b5de5fdb6fc1d46c16015cdce2c1004ab254c712e18446f8d7cadf67b23c7814d5a64948b1837d5d095c999f92e2929f9711646f8dcaa11d08cc7c8b7af882c472162cfe7ac865251ee260edc70191d2065d1a219f4c6624997afabf3881d81ce393300c4c1845d75f9c540117873ca82f05c5482e700d3228ed44a13b1f52b5df3c650d2edb48aec885cb56d26ae2b1626d80fb31105accc1605cbb9fca84278d4667a7a4ae20c62c424bad625f6e2df7ad9a42297ad8de6decc14546a891be0fd7d6b2b0546d7e6be760cb88de0fa6abb6f7946251796bc2a6407cecdb701090273c053257e5db182240b2fe603064afc3b7c0352a7b23066c74f991e4e4ded032c550bd4604813a7cadd974fc2097e222b94c2fb02c3a1aa4f9890fbcaef9816620da845e43a334d622df7b4f7c4185c1211b5c4ce4d00cbb60bc29ad817628b4c248a6e73a5a0f3e7ee1addd485abb2b01c3239ea141a3a8e5a061a9398061cf1f595cd8b0c2ec76b33c69c44a914d54c0faee18811019797e98a6735932f5574b78801ac1446aa165289bf41f5471f82b1fc3b35a8d88c5a8adf846cde454def34fb6b16e76edd7a65b536f4c7e389665043396e596adc90331db7b6a18f1f96757ef2e26db0945e543e15050d50702218dcc14e5250e56379d50966bdbcc5217660d2ffaea9687dea23624209e30fa0da85185ad0a612b3460b03e9cc413dd755076f9ca1fd78acbb440ca86ca825f8e433898e090c41f08e015d5d56ce3b8c40661d952d9c4d860aa6b611317686cb41e7f469e1365e2911ffdb04b58eb346f1fb4d6ff11039a09db63edaca309f490a5e4699fb99d3e8d15328d6fe91ab477139ea261f257e17bd8d0cc28ff056c395b205059fc8c116155484aa303ba4e3f8817be737d093aadd9da57f1a7f00e61b56127bb5fb798cf2da44307d7cc5654d6f33989449c30c1dab9d281d6a5138684914d225a0430df7a839d2d480c730a88ef9d85a24b712582f23bda8ddf940c0913c86afdd0fb935f887ed247385d7f02c069ebf2950cc4dab773db649e6e3bda5887430c984ecc23af480b03da869377b8e7e9c86bf4574cf9b24efb5a952d9a34061387450981b9db6227bf77b55828b8c727d40837abecc7f09a034058e10dd2cc709540f8eee321052c040481050e82a8efdec76a14a1135a08dc6f6521735d61799d8866719c9390b39946209eb9ba505667a5c715384dda5779ea0affdbdfedd662f62b7bea246df71893bd62d361a9963552df0440a963c630c8b5f895f0f1c97b591a0b7297bf25c80a90bf579f178489d2d2063ce94d7ee460547f144a0b0507bf445ea18feafffb90fb23c435e121a32ba28d294bf1bb0df7e8b376d3c0ea6276ac1cfd4371e4ab1ba27ec89c5a4d8aaf7ab1beaf48da0845f88fbc66bb7c40fa290203be6d2351fa24be44922617c17f46b5c945e3063c685ecfeac2dcc0a43926900c6bd225612c76d6635ac6c2782fafca645c1b906c22d52d55953689e1fd30ceb02da4b449b2151e31e99e3750df22095a993e59331f7c0f44c861e4de3441e7548b209b540e4cab86e085a214e35c4a2d8cc18c6dfc666a68d4cb2f7f475759b6b61b44a4aa4e8ec17b28be73e3b8867ed2b111fc75e6f12fbff9f2e51674d14190e427d835675457c6175b1598d85f2dbce1af37e993f908647551a1a3c228b34acadd5d76388e6e3559385f68ce21f0238b48a8e0a275ab11361bb12fded03a24c16c876a00682cefec4bf650bdbaf89ecac023f3d6daba1181d66915d295093cca80798603a816223d6852d5b7094e27e17e4888d828930689d9d6f1faacef51fb833b84b7dd450266a5ac5f63b9777c50b5745aa008b2e66da0a6bc9426fd5fcc64e13cb92dddbce352fb87c17e747a7ed036a5a98e015614d9fd744e08c8d949397462dc36aaa2009e96979d78b5574a0fb8d1676948f89637b699b56e1716a1970197463bc3727042edb80ddf12787142a7b92fb8f34185d010388e449cc7311c39dec25e6806c560e88b019eea58f7a02fea932edcf931a6ffe1ac7c0ccb59c93d50fc9c95dc444112e20a5db5c628d4e732af6f7a90e1db9e627a7380eb0d72d8ad69517fe9b15bf00b77e8a3a8609d8b60d664895d6df9c5b4b68eb06cc4dd4514c73e5e6778a105506a6f6e2294274b24e0e82c19cb3f0e44c716c6d8a4b6cf51e6b59b3543652946750a60ae479d026d5b3c8e39ef6282ed7ba2473d97a83c30f384a83f1860da720272fa55d6c577961c70e8514d09cb525c42a09d9d14dc99c27611ade68d89639b76cb25f216fa74dd5360c3c53464351dfb181c2150ff1f11d2ec26d35284ac391c0c6f573d3a35b26f8443416702693bf9aa9e767a2183e611a6743e0e45cb8afcfa42267b4439a75d4e7fc869c1a4444b30d4201454c110046fb8c99ed3b13aed64019038014cec8fba0c8c677fc617989854a63ab118f734ba50a5520ec5b1c9fc27c79985a65fd68bce015911e1fe9f4a635b289ef5c67cdef5294b7a21eb9a8643370b89ba0ce0db715af40566a295c3136c8984f0f1f51e7f1e25317708f1a2d7261f3fd397880433c8678b0832b6d022a72540662bf8322931ce3c2bb78713e06551abe6521d8261ef2ab8023a0b820897186e65a51f45d04feabeabf57085f0fcde994b4cc89d151196ceef688af8e5660045d94ea6f9f23463f778b765ff0a3380f94c1d6c024483a59858e0e4da9c0183ac0c46611e4080d2f7342210af5be49ff0f1093588884785de67df557de9a36fa9d26244d0aa8a04d8042865a715418072fb251533fa301c5b7bf18f4ee387708f5982f562e407bc6d930980f460b094f78a5afb086ea077a7427cb1b5d8e02860690fe7ac0c2631a10311452f3f904468e3a45dc35e478ba83a0da6e678e9727196dfc555431d3b4ae93067442a60c928aedfd1bdb57e6ab7db8266434a22d3294123aa616bcb7b877849a2618ae5ad68c1890746aed15221882d4cb7a26ca6db1c7b3aa6bcffc5aa99172ac0a57ad8ad1c350a6fc5799b2e135b1550a22d041420e92bed10f89dc77c9dda8ac04587d599094fa4238fca5f4e0f99665db88af8d20ab610ef4806ad8537f76c97b19ad8d9e283b03fe2f3e5635bf1cddd25a5d7a05fb4fb20289abb3f4a3d50814bd52c23a3099aed85c166064722a0d8a170510421fea99402f5a68560146d0253ef44ac807d2f1641628847b2727596a668fb6e46af0e8f6aa359b0ae9aa3bc9a1fcdb0ed72489bda7fd327ba88c0638dde2eb0a8ed4b6f12f762d7a4fd42646060a51c6a6361583179c9c2e39a073bd4b6f58041da8416c2cfc3419a3aa001a7be5bf4c3a69116ff8b18d12db12ef19dd8d58285f174c0c2386cfaba3e8debc87e620ee538b7df7f6f00074e9d55c3fc1b7af46ae5ca9147ab8dd48263445d00c885c9636884818185c789a0e2a2ba133a650a06c46bdeba4ff9d56eb44308e4d73e99e00452cfcac6fbd1162705a96633699e358ed80a94c69482209c7816b5f27455f2ab73c9a1d3fd18d3deb2ba6d681dc46627142b39780d535cf1f5afd7c61d7d6c9bf42641bb917cb60d8153a4f65dc4d6975ce7bd9d292d574d564f7d4e7f4e68d0c15af190412d5eda8075b43d3d030da01caee753dd6ad6ba3ee08c7599a3c696c5e6a9b414a7d590420210e1c7ad41c217eb8706cea47383d5dd9e0bb07ca57429c43b640ae68b45fe06d594797bc77a6f4d95e723771114d832075b00eb7047d8dbcf501610893bbba9d5049f1c9625c127809c5087ae689f1cdc64c70487ec62a92fd250f842edec54754a89ccb9f4b96820dc2335715cd766223f2f4b5500fb1cdec1c434442257acbaac1ac8a8708b513f338fdfb96cb73d453212c5fb1446b9a17b0a13fe4f13904efcde23de18ef237f10384e10e14d96b566ecd52b4aabcd03fbc7e25316a9b6d8809b8c272380d067afdd662eca537ed37a3a34c7ef2e4da8358c9536b93ab05dec6d218e96d33526d5cd98d0edd72f058ecb27bc02847a8d200619ebb03434b4abec4ab6d7f594e26ecac15998dd6a366dbd4bba230e761247a7f7fa09e0e7c0c2c4bb0a224725db5ff205c01768f03d3a67f0d9c25b059c522fedced944ff432459b148b1107d7f4d4be0a4c791901cd33b942f8982a5de3519b95d743aaa9a65042ff62c0b6b1556ceb4f08e2e60da449876634c9786e0bffe4bc2a2b3d8b356bcd1b5487c17edb057684fc52e9bc1fab237ee7b429457348a383ff665979e5f2cdb63f2cc1f0c79fc3b5ff5d810632c94c3057af05ae1b21522c8d7e117ef6269990f8f99bd6a8355a6a9965a636307cf1c9cf8ec4ebd881c3e80f251c81090698ac4b1b1c48d57aa5f10401b3df701c014ed3e5e333d16e88a8491d5b8c07ff92baff774c3ef59dcc948780aa2053e608e35173680a721aa42f5b84e2ca0d985b7ed470482c65e5beede00caf525732e73dae281c6bcf3220432eb895e067f2945b706893c74710d82f9f0304142418ce53b0eafe417cb2daa631bd4707f2d74c1eaf412a7a2b88e44411c77fa0f35fe5d1da9ff13a5add92a96b630cb1625700347a07c50d2b676d317c9399d55a0adc9b3e013ef09128e0e75d7a0dd3a152cb8a78a4dd1c6b04221e9a52f8ab6e4741fc7255474614c6701214b9dd74d3f8e395bf48530d8475f551955ba15e0f2d53a35199660e30f21bf671f79d640e973344b7d9e83f93e158fa286680a78940d07415bf7c0725d94634d308223ac345dc259ad367cc4d765ce6afdec0b5684aea1e790e94658327c2b419cc234aea14fc2c12d4488032b44cc396d6c9d2a87ac8077e3552ea60724b51f350bcced4b22a10046f61401d31a2ab443ec25d27b9ca3c57e3d845eb443cae2f6676964b960c1b9d92513adc26c970ce28ae400d94c5a01d0df68198d69a2fc63d26dc72786468d6d0c44e019fdbb8af3ecc839287f8da1e20a4a6904b5c60ca47c2b84f8325475f7e337d1f2462d532b4717a256c1b08d527e74d92e21f57cb59a440916cb82a33448671ed6b9069992f6dcb4cdd5332c7d044e77cb678403ac2a55e3944a47448e8dda33aa681e5b54330881794b52d66b57b673cdcff32d855f7746b165c0906554df50c012b85be5ca91a365005050e17940658bc68207534b603bca17e9db41a793bb4e0d688e140a688a52131e6e212f57ca6977cfcabf81be904d4b451d55d99767e66b94168dc3ee045696f099d1e15d76ac8cf8e58e6021af662f7f15338821988641138002d6ec08cd8a8ae08b7e6afd1e995d28aef6d21c862603564719f3605e53aea2d5119520e5d0f3e067011013e5b1e69def991ba61aa1c79b3bc661355069f4f241df568a62f371a4763d6f4e43403b8bfe32074e4eda4a08703f130c929deb74d36e398a30ead9760eb0cb429873b28c62c532dd44523b09a2d6c1bbc8d3dc7a8d7c834addc8ded571ca8b7bb203d1c2aa6521766b445e55c9e09dc12d1ee21509eb2dcd5bfaf3081a050fa39aebfc7c183a1c8931c0545edfa33086d84a1dde12f511fd22556227a2b2fe691fbbf0dd1b4c6dd50388d29dd3cfbf174c21b126603f59017c14dc2442c99b8a7305cffcd79103c26c46ae552c40f1bc272c81a2de41c68a64e9ea365a7ad427fab746a0f789e809cc10e88b6d50efaa996511fe0cdaacfdc94344fbcf0f55456803f93aef1ad0d9e59da9ca90db447a438cda4f7c258f867629f3dddcb5b81aabcad06982332d2f132e92651b428c52a0d6321a6898552244c2165cc732f2e6241cbd0dadc627a04ab60a3226fe6c233bfd6b03f9e14a5f0473ede0ec65abf00a1959e516d6b93d51d765558dd0e489a95bfce4308b053c5e737082b5feebeaeae3128d77be8ff9fe188c5ae5fe295bec1905080676ae08cc6c4edba5ba8c2192cf85cae8896f0e7e0d73843a215ed5dc449d30875d751f8424d79c6e96873f406e1031d01e0602295e063d5b0ff92db337089e765c42d833367d0dcd1d2c3666555a7cc6d3bfe739e1cfccf5cec4239ae4b3bc47ec71d8899ee6f8b976317f8e383da317df0cda59519ca95534c7e6d9ce0e11e95e36dfdf30e9b6444cc1b3b893d82892da9508ae17032e921d7e308d8523ff08a68c950bc2880c07074b5af29b5aff0452accbb7f0f4bcaf6572a5817f56edb5579511d164300e3001507036992b8189146db28b361167934cfc9d6d51e656782c602d0392ae3922ba98a886991b44635eda2a09b6077e9eb3f323b5892e3e96889ef5e3dde36917d38d9615549836680b93f16dd6e8cbd6f5656fcf6303c4ad70b220f23349ec8c8adc9374e2ed40bb6d3ffcda0d0e8f8fbae4cecc85b8c4c267b6ae3a703b434b43024dfbab4ff7db3bd261b0c01947498171cff505ac360351e7258b0cecfac810ab662b80cca1ff43d0a19ee59ea1e7d3914beaa1772bab908ace9e8a9e14017ae08cd33830283d302fe82d0a7c9065c64c66e6c50a1d9a124e82d7e2bcb577ba5abc41657edcf79d54caac68efd28fd190a1fccc530057a734d271a85d9a6a5ed4a2c399f5043e5b95559a148c9fd8423294b79a22eb178df180daeb101cdf66a36af245d73faa86df4b1935e6e71179989187e212993b22c2f687c4edd7c526eaae5195a6112d2c43a5429ac7d71bde0522a97176c3c905b5b7ec4afac0197965f64096fd3a0beb759187d9d34af79aa7e017fadc9f1d2bc34c8f7d0dcb3cdbec02a79a0ee33e9200d44b024c1523e90a5cbf62b76cf04604546d8671d1b9d17ba3449f85ed9c055ab6abeb4810c20c4a6fecac316ceedb171fcb44512538305271c926eac0e9481c7386ed71b717c8734a2041810e1e4db6ed2ce796a47019f4d88203d03e981b7bb39a06288b697a13aa5e3d636de3d015bdf72c86560bacbdf24b696bf247a58fc1712747a52c7fee02dde84beb25c84de381ac5eb55084d8b24da1890e825e0dffbfd4a569b5e8b92361e74c61d3143b43a10c600a02232450e75d145b1955a866815e8fe68ddba65743d91ba32f59d8218b4e3cfda428b83de0f239b0431dbf96509ab3de718f3aee5e44705f7006a1bcbf83c6bcc4916bc8dd8baa8f672db6187b978e5c9e5cba30693f5d99f4983e96e72165936e2464c2bfeb5ca12724c16be991ba9d2f2861557be143d3bc8f5b4a1a9c0823def944e7e364fee60212282bd6bfc53bc7d4df078a71cd1749394d09bde18ab226267b50962dccda8b6792693e1a031a97d2acf26f389bb33539ebab653c0b9c9258b3615901b90b744f65d2fd1563428bec53063821bd46c6c114706f04270a71cd914e3daf2dd8b1e4d17f638bd483bbdea237e26f1fcc34d9587968d7a4f365266769e3d22ac5a8f3ec48ea6009adb13c27752aee198357d8d4035076865fa28c820fa92853c25910a8137d1ef2421d33b89a3eb68c1c0633e860fd9ba38d114fb2c6dacdee8f58349fa0b83b7406bd9e21311274ab873c81be28dc4b2429b7c87ce7035000f735e74c8c02efb5eec3a3500593d3e9fcce34856ac903921d9143217b5de9ebbbc10583f18bf23eb21b3fd983209f883b631f08995623fa97fc4c4857634a98c68fbfb7479e8c277183a35e6ec7134d87a01f1f9690d2fd67808261588a57684e44614dad7216ce5e0dff5f492aa1638e8608178c578b7381dc469f2942f7172564027d37285df945c51a3f026d0472d314661a42cac068e1467f511252b417e648eba3867be710a2a02b22becb12881d597cfc1d740e905c9ea11ede5b5b4d7782de6e817fcd001931b230f1e22b89dfae595d103ac460e8a40c87dd01227ab25a68c18e8ee83469d9e11c1017636962621187db3e5a26ed3f2b7413cb614bbd218b1ffd63c4157ca1bff577c22612dab686c672155268881db6c814bbc9198973f842641311dd70a6631f929eea18a18a666ff9f838783ec292820584d2e04c69819cc21c5fb4c6475562763721ebaa46b66ac147794887ac0d2278be43759f31750c425b843e9a7b1f5aae183f78902a46689c183e33e964ad4e48f5578323f8031ceb38527991590c0b606f55bf0b6a75e3727d10172d7329106f0403db98d1e2e7d1910bf03d11866d6cd9fe01ab21424391365a439cdea2f8610dca35da984805499562ddc754360e00b0898305ced379935d0d2b4738c2a021e6a85dceee7c724426c2918c9646b68ca6426e7c763b33b8c2b889a1c3bbce5e15c20ef1168f93e17f1ec02d1a7911949c1430227298644a6ffd3fc8093c69b57c6550a44557f0d38f806a42d7c7f93d4035f45b49b1ccabb0bae4232f0ba214c499ae6c64a69558f7d948748d3373b903199a1183a9e6e4929751f8bced389f9555600d2350ce5c74a8be6c071c6f723808472bdf34bf43ea44d12da0b10ca4468be0c28ed05fa9124116759b3e234aa97f43789caeb14c19fc9ab3299da8f6924556118898b2ebddc16940fd59cc0e5811e88d9445c60f034a70c90118e9d7b6a7568fa8250daa37e8f7084e546843e2d5d3213c574043f873d4e6a050c4e08881201145b23caf16fa5d3d4c8e2ff5aeb23d450a7b50c466ce4f4ea155873b21cbb491a52204661e88c9acafc2123100494ce8b963aaf037b915d360ae65fefb43b01994293fad638ffa21e51996b02848b61272a8cb61a19d04d1140687ca61df999568ca6690123490b2751618b8e1c020a32084425b293d2f9f6a03fc4e18ca1c6d0ad1f80b396aa92d9c6f638a771095e850f8e4704dcd1fd285e18f32420b56be104e74fc05e105017c5287355711f3399965ea46024a99f7607d51aa224cb9b35ddb624bffb1d0ea2b29f02845a3ad3ac3faebb6c51bee21664a388d9e046b97ed163bc2944fdf3d43b6594622cb38c26eb204647c88ba750ec9db5b48cb34c20c88b2cbd5128d80d9503d2d9f0ade84eb5944676c1a226b5e202db4d383e686127e75db6e3c24af27892f09da937c01e2df6a36ab18fcb602754fd20b41ff7c6d435f082cd9ff655f0b3ccf601657014b21ac00b9453c11eeb87085211e2587f4c3d7f89100fabda9b87da0abfbf9f51daaf694effd136def48fcad14c83a3995daa7f70e3908e24a64b863542b122547e7a3e10bc94b869f191c9874f8b265e355c0d047c1e4025e1100da02e5cb406b9e77b02a7128481ad5541e1b055d55c985b2d2a3e74859a8bbc2d5b28ff8191c005baa283ac50b7cf828f9e890b5282a8133c5988cfe85ecc57c6027106f120cb84ccd9aa6f706dd05cc1aa64696e009752f62262edf622f36caf5217e510db6ea75c02594c76674ae34e386fcb94ccf9e2d9af1b4b8865763669553e10b6ffc19fc3ebb8c2f99b37cbc65e2aeaf44bc1c99abaeeace0b09cffa5986e95a1c266b62213a5ac590496120bc204bd3794851646b17a1fe7a1cf69f32bfa0240d0822611dffe4fea293643a5d238eb0e6753bf14b0674621ef04fe7ba414477680a550f242f96ea18bdc892b6fafd6a215bb12d34a8cbf77ff7b98cb7412a414d608650065616b04d200d20de550a6536ac34467d9a71863f823a1e12496f73dc27be7e326cf85615923ec9226ee874c8fbf095432d7abd533a62b00480cbe9810e606b5a699785595b341d5e557c20aa5072e67d68c8476f6a597526fd0110398d54549cafc9222fed693ffee4e1f6eaf82d6bd78d8761e248c93e7398eb2504f5599226568a97ab84104b756762f7bbf17eaea0494472d52cd0f62318fa0588d97e47313f490fff4258cd6ae070e969b369a6faeb9d1209967dc576ee6b6a3f8547338781ff8111e69d22bc0355f52b99e1ddf6172481c2227671d8148e74cab8d427a067e839de1d3ea1e4c6df5d73cf724f7a5169df12607f03a6f6457cd4ef29e1a9303b8b40c965267d83a99fadfc9c5801a3e9275f7cd34a682eaf475b9946c64efdadf5e847e792c2c8a0777c04c96a024ea770e499b79c25d56c8851960e0790b74217c690017a0ed0dc3f04ce9c54074640d37a28993d552be9f2b65b436a7e5788e2e095c63fe8de6652c0ae4a9e0e4e730d8a7f440ce0d5169582053dfa0a67d0c4f481280db045d67eb1b07a7ee412de1dacecb3e24a21dbf53d92911a6d8bedafb4bbd5ce1e6215c948c3ee29bb907ac56fee148557249e2ac265d02e1a1caf65d1c729e42a444f700574d0156c50870963877edc7d9fda68bc3e929f0d45a281744e45d94b66755d92df8dac9d9b218f51fb633d0421ab2680f9da9282c9e5fc0d0536c2b236b5fd23a95aa72b7431a3c282e43c9a4cfa89730e4ca4db92836757c31e7a2db8a5c237ac4799521bf14937ec31b907ce754b719a02543d0428ea312f32f1960d3b0779d72e516719b73981a8890a08ee2fd7498db40e31edc67e590246de536081dd228fc586e0c83c0bfbd356bbcbeeae0c1e10b6646299800c77ce5c649ccf6fb88b0fc2d7ee948b576d9d464639e2fa88206d0787b59b61c242416176855e47ac0e2770026bd10ff08ad6e6e6674d7e5000e6dd15f05eba9968649db466b9587e5d4fd45a94a352b0b18e0e1ab9db02da79db08bef9cb00b6bdfc42d68b3d41769356c3355c7bf4c18585ebba659b9659c14130876df767588d802eadfa20eec1b92eb7cd782730a2b9c6a6b1c40588a163c3f2a2c78609a466523ddf1a164a87c205f15fe55e369fd1d9ff6b96f94848ea8179184d9f5c450aaf86319f073d15f5872912b0fe0f763b5cf8d056cb6021ade49625b304eca4a07ba1b9f173133c0a6eddb6f673c2f2e74b0be8adca1c56d5bc303966a70d39adbefebdf9ff674deb02184c1a64e28802ad35045c46889ef1e8e081b6f9f7ba7c951d0180afb5c1c8bc7fc684b42f6de9bec2d659249a6c305b9059b064b393c2fda02c68fdfe59fa0e9e2fd9d6db4781785fc3f19fde29f2d9fdc8ffead7fb58fd0fc97cbe572b9441eaebfd116067b71be9fbf170fe962eb5b32461741e0cd6fbd87e1e83fffc674cff5f25b7fa383260c71dce60bd13e15c71777e4a79c7719fdf2ff298e3cd71f20aff4f70fccbbd409f1fec71090f75d08026f7cf1db6fef79de0f1902f2c421aadf4491c7bbc4a5ee5f7cb8e47d0bef693806dd96a8e2c4aeebbaaeebbaaeeb9efb212ad1ce1e7eef8770a28b84f9e389b0d9d3afdab6cdda9c50decbe2a0eb99f3aa8f839c7710d62f16072e4e600848f3d13dfd38a00d7bd0cb124940b35ab1144af7038a4991e453da876352185177e7ae0e519a03a4e3ee74fa83eeb80336ee805d4eec56bd4ad5fc77525f629162589489b95122068595d81926aba4ebbae3bed284fbdb1aecc8bafed6e79c2cb6315fab5ad56c09ecf857d3ac0c9efab4c2da3871a1cf27b0b6e572771723add8d15eb72d97534a7d90b5566b831d5db7ba769ea756d6a4d4647dda345fe2b4afaf89429aa6d16ddbb66ddbb66d53a91a9603a5b6c98eff3c2f09e38dad958a42b026ce20dd019ce921ea89a6cbcf586eb09eb30e217439d80b742e5a1ee8bb6ccb3ba1edec699bc58eacdb6c43e21080ae03be528a3e58f9ac813751306efc591358f720f084d2e5b91c339354b50b60bcb1a21015978c1e88da1d6cbfa4a1631e2eeda3bd1062bbc74bc66c221afdc3a1c089e3dfeeb7ce013b2eee74f899a9f9f5c225d673e192d103b1de431e28105d6d3e6db4feece02ff7eed7fd9b1375b8a7a2d71f276edb7f5ff8bd87f3296a96996a888e90a6345dd9f245cacff85451fb745854c573ff74d47771146fb70ae56d3347d77bd5a7636ae9574b5c5926f67e1cf4e8802ff7abb0efd7bdd471c296f6f17ebe278eada38a53cbb885b2056e6ebfe600c985d30bcf98af1279c8b9a55f2c295df97fe9d709d7af8bf38967b060c789054bfb68699f245e6f2670d6ac94a5c652fafcaa2dfbbae8330b1a34513e5a0c9a0d7c83afdba7b863830b1a6989723fc904735919afdac106816407ecd65aeb0d5b95f4bf2b9354460623efe2f37c976365dadcf161d4681b37b81c233375c1cb3132462e0b0a4aa9d33246ab322d1071d61333b4ad5819262e77395606ea8ef64a17827506471b619981cdc9320383912192524a29a5f478463b81c60933978502dbef97634e3871f93be684d47549361d6bc9958233b77fc7b501fe6ee2f6db66e28e5e0bf4726c89332bd6c0dd3f833bd6a18a8203b8895bd9436d44e1d68dc79c37a001a2221117916466703bc91f0532b8b3c174ac25195f90aef7f43b2c41de568942f255ddc3c7d67d7f38bce7b8db891e705d1fae2b45e67a0c398cbff7c5e87aaffaaea32ae619fde9f057bdf737ba03edbb9761f7aad0fbf9e9d85eca16e577e1d8dce643caf727c0f5af1f9b3dddfa5a90085edc4c20984efde7798db081d911055a81d41d5bb4fe8b296f3f7304d1d1f541cc08a74b9f46ff3810855dca5f5a5709ba7dbffc2040c2d5bef97dd4dbcfd33e3ce49b1efd3eaa0e0c5ced37ed9b359159068b3854df07433e54ae3eff8dd6bec38d85c6ea8126eae8e8d7be9fe57738bf93fdfc3dbf451dae9dcecb975b43da9240eeb87d2c054eb66b7d1d6c3f9ef0467e15c70672b7efb8896aedb9a9e956df33f3eff0f63c74b9f0fb2d1ceaba4e677bd57f4f6aaeff9744d1f55f42bb6e48aa54aaee3bd93d8f793bbeabee857474b8c6d274682c6dfb4ea5e2441cdbab5ea5c5ca7521fa2aefb7505ed5fc70701cc78942f447ff12866e0943d77ba1fafe72acef892a5ac3d1671361d6400215ad9e08b306f525d08dc9e3c7f570fe2a6420e73175a844a1effd67edbe8ae3f79da8d3dde84fd4e9441ddbd7dfbed6907b4d68db341d9bb6a9c4b17ee7bd8eaa863a2a1107fdee3bbe5ea65cffeebbf684b81feb7b9ed71f8ece83aefbf92a715475e2c87dfdeeabbcf2ca4b471a1bac6043d26be1e9ca3c13e584441724a8fe50875259431dfaf26aaf02fd33b8f32b7dd9b56b57edbb6e4401bd73448bf944b4593a35e1345d6981f68105893042fbb42fe19fa1245120a961062d2588a209a01f0f8a13582185133653d200f5cb27fe197ac284992c474b3d64410450bf84e21f0d40910226054968f0e283d28581821c9a73474dc73ceef5e5d6dd218be336e7147978a452166a46e01f66e629c27863e74b246aed6477c18e2c3502110fdd48e36270b905ffb00ded7d3615d7928c00e7fc3b6c41b945c7d7a573bbdabf3ed17b3d7541b4c59d7414ba2eb678c6b4fce2d77c55b8b1f36be2685d6f91c78f2510d0684b9db38daede3dfef2e3a0687b16bba31ad0d742660dc69c4b9fd9001f1f803ecb0aebfd62db825580d10355b18b9dffb27b4dc7dd1151672c376198031df7a454cadd9d524a67b4a4ee9342a19973d2af15ec97f31bea4e69a54c9999d97d0a31e5d6d6ca76cb9d610f79b5d7348e69f9b285df26c5d6faeed65ad75490529620ef645633e72dc2a7e6cedb56bd65b9d05a69ddbcfa0b53b556ad52d653d5344d6a539b1b534d73e972d61e761c8cabf69c5c41f76a75f59db5bb7bce5a679dd2322f7515746f3f43d5f706fac575fdbed55a35773a5d6efdf2a2e2ba4ee5ec9b37bbaed9e86b9ab669daacde9473d6ee6e4dab92ce3a9b74054e772ab9bba5942e178e24fab54e50847e693f7f735d605bb56aa1bbd74a9dbacb77714e3696c8325366596528e37a529ab25d82dcafee769f3dbbdf59b2649692d99d52eaf37bca6ea9654e6dc8356d03a97fbb2b31f7a7699abb6b73ce29a5bba6514debbaf9ac41a8737577d002fde2a8f69e47a94b4a29bb900bed94b5b26a73fe3c60f3358ba929a232ae27254a37073be0db4f7f52965f651f7d6b9d3125adee6c925c8eb1c17247179b26364497636c3cc6e649d2ea5b75093a15dd9170266772a6f9d34dee347f4468828272262867eaa6168bc5face86b1633755697553abd56a75934fcbbba9a1dcdd553e37f08f8d71a5f8add0a9f4cb9bb65cfa31dc9d890496fb35f5a35ff44d70a4d9c336f847724f8ca7acbad2317e6c758c1f9b4b3755efbf6f80f1b4b71d6c964b61fcd841dc3174eca84bff5b3160c48811e39dba296c2b542cf7f563d07fb18fda674e6a02b52e57bfaee4291827572f572e63bc94224804d4a74f01b6e14fbf02ecc3853fda9be3ba39dc233fe7b970f24b7e0db718577ef842c60861bcd9bc292cdfed55b5db3cf975b0bd5451e19a9898baa91baaaf3497fe42b5dca0a00e871095cac4b4a6e85bb134d6aa655fc1a2a59b3ef4ad5fdcd75048fb1ef2c6f8a00fd4a8595169e271b13cc93a9223d92996c7e54c4cf57f422c5b9edc4afb7c5a2efdd1b95cea4e975ea92ceb4cce44a589c7e59c3f0fd67511c68fddb4bd8b1f903882fa45ff837e69620c3f1a33cbcc1fd6d316efedb3cd9f568a41f4752eced891b73852d0079e8444a515975f4e1c4f9868fa45a75a4b63e9a6d9433f86d24e38cabbf3f5c3a1dd2a4e37fda2cf9ab2f23178af5f2fdef5ddc436240651a00b97eb6f3400c21f92a89be68f0850dd04d54d50267413144ff50e4eddd456dae9ee847c75c20b4218e112eb5d21f7ab7311f69077ecd16b8539610fed8e0c457140d1ce1f96b8c55a6badb52e05a2208738cfe08625312b8a2c09ec0cb1354b626ac6c4d24cc5d28cb161b4ef64eda10a35f7ab387359cd652ad45c6608f08c53ea6e2acd279d4d3eb13437cdd7d5de82b153fa356537f9490b35ab945c81848292621b3a5453aac6d0d9a5589a2f445461c5112333474ea4c8a206204e736d09bed47d87bfb1bc55d775abaeebbaaeeb3aeb596fbef8d5ea85b52fb68de3fa7a7f2f3f8edbb81bd3b3bf6d9cf801189bb52fb8ed5fbcd066bbb79dddbaeded26f2e0baaeebbaaeeb5ebc7df142ecb7d65a6b6dd759ebb158615115a1fa5fff579f0b2f30b2decb3777e47ef5df77619124fa7ee510e0fe13474f1cb7a5eef95b327aa04e44010654a5bfbbfb876e73df374685536c8a2f4c5b8e13a5189aa6cb31299c625230d92adc4cf6890d6393926c920d63c3d8273629360592fd52ed129618356adcd83e6efeb43ef0881d5fb7a8caf633c727b238feed72f0f5c41d352ef7f3d3f1230825539aee0e86ba9c6fac457ebf243f693bd067a81cb387d6983d1408eb8fa3c58e7c05a97dfa5bf4212f0749eda32969e252934e8b7cb5392d1a9c98a59f430410891d21031b2022a17fb4cfb8e375a509edd3f5abe8c3a5159e4167384a249c981d25d29de00a766434f449f0d13e4cf347a54ddcc15a7484200623ca48dd1d2c75e5ada15f6ff50f036d40d45e19973e6341627bb6f78ff2e906cfe00d6a5030c80e1e4ae3c523dddd773a50d23a85534aa933bf6b2ae139e7d418f6dab16d289553b6240dbae683a03b5f4a29c7d7fd6007ec06435db9a58694e2961a2cc5525768c8e5dc4146bf2cc0e3e3f2cee5b9cc3576240d77b096b0bb9fd26edb76f0b058c3555d75012f6fefa647f8566badcc3f7982496c1b308995bf44dd28fd29d9a7efd0e719236061e553eaf60a2b9dc90895fb976545a64892a97046b64219d951d45417d95191ec888bec6889ccc81899912b32236a8ec8e0a587a8231cdaa8c09150158aa091425684cc1ded37a51064a63004890b2fae2a8f4079d4124d939a8646b3c288945d5744765d2d59911a2ece655991a43bdaa7ce03a55b8ad856112359ced060a1c911511079620d99158c8e728c463003992d47a294a00265049b253f929ae2054a699d92020f600a433021e3465258c24a414a133202b82c3372c2c84b95e91b6fbd599714c7b9895b774f3aa703790f3e85dc4261e7749f4ea87047d7edde1125092cd42cc55085911d8688a658c144c50d4e78604111d99029d990237b2608304630443101991c6444b258324664435448232b8a2ae3e54916263f14e9a1c808a3127af6d0724592182574385a339582134e0c7101919a430b224294ac902622492ca5544890959028c0206f84b088d89418c309a9b5d65ab7a8a05b81103148ec33a288524a299526656650928510591009e2b442101b542e2ecb8a74d06430970cc8161991982562518a9019028923233543d6c8820c21811541d8c0c60629425c31841701194381b4e0c8522a2b10a82a03a204111bd5e2b2ac28ca91efb2ac88c91195f45d8e1ba55456a4c2a53609b7b6251332c5f52ecb84b0e08ef627544f989021275da2da2079c2224812503b5931410051049525c28c9165f1201609984582677e153076207774492946052b2841050954111b20f9522675dcccaed81b2ed608fb8235c242b15f96d0a3a231ee6eeeb83d4d2c73ccf6347d7b7adaa4e6936f4f2d9fc0d8514ac92fac292bbbd20f8d66c36c369bcd66b3d96c369bcd66b3d96c369bcd66b3d96c369bcd66b3d96c666776669fec93558a41a185896d629bc8f6ba71deca4ac9ea62bd2b925c21e4cab752ca9e2e9aa8e7ee4eeb0b99a6699bca85188ee33a8f4bb3f2beeffb56ac2bb0003d6bad05717084b4bc9c9c9c9c568b1593179e0b172e5cbc70b9940b3c183060c0b840075cc2c0dbf938903bbfb3f3752031f83a007893635728a92ec7dc38750c4f865e16af73aee8640652fed8d9e343802bb31883c5949552042bca1a8d763c24395541060816446e922c95286b785ef1860d0c19911215d6786fa2bc376544b0e60097636d8ab82e2ec7da38d52068077c658b003824114d3101145650c166cc647922a509104b9298451df378e75daa83a3efa5218ebe936a33d4c121afa4fc8160c59614adfd80c68d1c22d0689ff913cc1047cc88aa3441c4cfd0922725b628c9a1043c1801d4fffc33f4021436597c211264062840fd2ffe91800a5da81c2991040f6d80faa7961b0d60813812834e7a1f3202b6e70f00dbd0ea8c036c0013000b6c7d8e1c3818dcc8d1801c382da7e63706e2b3fee3fbf9e86b9f4585e56b1fe7b9f971b09a9c7f1c80b3c58aeb5a3870c4d12fcee77c8d1afdbaa0e7ce201800f8915e0c7eac77fee85d17531c776c70e7c3fa55238d156b482b00c02004812c40ff4ef84327c8ff02718cd12ed70bd185288f78467f8bd0049ed16f652df84b0b9c1416a04394271bdadc9025870410a59951a9e282d31140cd7d3717de689c156e7f0e8dc901f738fe7207b5c2331a84cd1db41c07849aa330553cf174c4142f65e4c81197155430c1b4229da48dd95162914d0e244218d42f5812d895224e5801c3022217ccb09b1bae184144c39127279ea2052a3920611a13c513de42c50b911b1aba100d01819b5ec8ec9cd803875f1e3f2ef71ef8e5684f89a55f220461f9e173246ff70d225458e104cd0b6eb2ac196241c91040c8103d2935818064cd1928519690d24601488e48c3e4248934593a96587cc617f67253532103dd515ae9d7a75dbe74898633749e315f62991f49805116ec027601bb805dc02e6014d8050c037601bb804a8062c024c024c02806802bb0fca05487dec433704892443685682cc2b294e00a6cff0c29515f019bb04c6c2d66069760afa012ee1414e3bd6d3cc13156beb4ee609495aa231d6884e5e77e4919251575a64c9454d474a7b456cd3d5aaba6aa9eb66d2a15c7752a8eeb3acffb66e779dfb75ab1bcd5eacaed673951b9dd6edcb4919b267233f5c4250a8acb13972d920a934c924a12a9dd4cf199331b183768e6326e504376cfe94e65cfe94e69755aaba66d9b8a738e9b2d396d53a938aeeb3caef3bcef5bad58df8ac5b216047170725aad162d5cb87831439c9c1c6f86e3ceed6f7d1dc81eeeedf34bb84e3c4305767471fba9114d52802c124084142c820c21454d9121645290906284103cfeaf2d96bb2c93b2e5e2908265f6f01605055176b8e3c3184c41121c5190a2287db228558e409998184f0c068312223fc0704464bb2c83a1080620427e50c2a2e807a536427e90293d71b5cb32a5315994be5c067359360237bd69f2677bfa32e4b663bb877fe4b994daeee99eeea94f2da3b8ec1d3788830c0a142d58725519191426eef8302b509e08a17a3273c2f4e4090dde131d586082c2e58ef667144edd290a8e58973b141caebb3b5802bbba2c8332c5bb2c838274e965191416da745bfb34b394dd01a952d2ad6a5d800803430a6bc2080102c893c480565e985201a9ff3cff465d4d0a5293806895fe4b284aaeeb899b6b2fcb9e9c01d38d4b2e12a15085bf8ad08e1dfc2d76403e8e199884bc002ea940a607cc642ecc906288c189932c544f5280618d6a07224f702e4c5104e6b24d6c472a122a4aa904b08c604a14588e44e18494e4c397c4e50853120daba41d989e870912b860e585322e60618552ea3268e062c60912388859018836b93489854b935a600232c95c28e27697652e0031443f48831da59374329ae2099268f6f45751270499a40b9a3f39186afed8d9d33f459d1066fdc940edff03051751a822f7014679e5ca9ff5ebf4afa24e0424904e08f5e957716bb1d14c2a5cac0b60bcb14cbf3f84d9f45bd409f27781405f27080bcc452adad9c3508c86a7e6f7e011823ffda0107442a02704d1af1b8fa04d7c9d209e3d3f5000e28f47083f5c943f9da8e3066580c9c0f331f394215991216949d3714f1616cb32254877f46e53ea8c654e59006980305c049581885b976d592b845b6b5bac18ee687f9ee926495a88016c81c615363770913139a3c4973441c1d64456546bad15092aca3c315183088aa2b0d0840a6d72c30ab4895213194025de651992932dd6baa8539aa4485b57cb52471a62a48a6f887c54b87f69320bd2048c101797654da2ae5f9635816ae189110b2d3829025908c06519932aee7759c6a40513eaf5245bb245b6444ac684c895ccf6e9aab10dadb28d4ad90675b6e1936dcc661bcd33d88607daa6d5ea9b507f0db55a29759fb3d986a4958756e7973074db5fe898c737df6c8d06b43cf949b11093d2674bc9ddab963a74dc45b22465926448a6802e68afee544c2cf70c01eee56b9c2654555225fff3407b298e425a28543547032e995e4011f080227066f6b949332fbbc289d9ffb655f89a3dfd5b7bda779ab6f54b6b8d16d63374cc33c2344dd3b4bfd15a0718ea0a69bf41692f19301a6ca37b9efbfc9ec571d1e2f99f0b9770be850bdbfafe9775f5e7b4085be1f7ab5f1a5ff07ffee03cf8bd758ff6606861fdd29e15d2e897f6abb001fdd2fe0b73f44b7b2ffc200ce219dab3f6da4b6e9396522a1d48544316412256f52344bdbe3c974d8bad3ff60f8d6db3b6abd40b36ca25b75b4bf36ff4b861993574cc53e9278e302871fc76c06e076057c87bce1347d8f55ecb693de33cb7c20d44ee9705c39f3d2c1ed7f776fe806fbf1f0c79f6c8d17b6dfcfbfd2a1cedfdc4d1f3780cba2c6ae21c624d7f2265f79cee9443f9b26f2c8b5d1696c571ab29587ebadabef666e71c65666667cacc5232338f26dcc9dc1a5867db68b23a0ceaef524aef1dcd023c6efceb66b1a0cfbcad48008b58f93e6a9aa6cdd989e0bd56a1cb0102b1f2997d905164e5bfae8042ac6c812a58f9b64d8d1faec7f50db6f1e3eb7acf2fa37f5e73878786f2b6ea8fec682d8cebbce6b9dcf7a7030460480026c9dd01fbf241377b2417cabb0a99b9a804cef734ad7466680400208000f3150000180c0a0804028148284ab34cdb7d14000c7488406c4c3497c6226120874114c3500c8531003106216290310629e510190587e00c5af7820665e283ba0c9bdaae8d1bf78003d2623a1580fb17ae79427f403d97177fa51e1a73ebc048262bec8ca7f78a168ba3edda8e3c8320408b2a0cd6f91876a0b7442f8bf82e08acd7aac7a2b330b474eff7ddf595de6c8c5fda55c1da0108082dfdde9f8aebed828df79caf14c7cfdbe2c208648ae3d532e37d14872c30db4d2bd2c26e1cb33aebae80d63e59d1d4f0156d0df40b7b626494435b3306da363904ef7b4a2943492e48f57054a5e498a58551cca0972a706214b0286c24e16915fadd36a5081bdc49b6c21630adf4ee22f0d0482cd392a1a12d92e8e92ac3f8c6679080e88ca9b559b10b9c38e9e087351f9a9880b9044fc2433d7764a55cb40559367ed872a135448052b668abae102d14090eeef78ec7f8abe1bdd81a11c52a99e79bf01d6c5a25b3c0a4101b8c5819a4c8a4c09166444dc6c1af4c8354b956b45570ff63778ccac00e3afbc92c64a5f56b3fac831ef012e6b604a906288c2ec6af60dc26d53aa7aeb0662ac9de7f4b07eeac92484e7acc1eac22b2f1ce60a38220565bf47951b36c9af65e5c77bc4971803c6bd2635f487fe596ca92a513f9c33a539410a0344a8d43747f521ed418b0d5daf96c16d1b9c0665d9e75a90315ce6ff41eadffa27b17f06252b520f37681a19eafcdb0aa80d7f0f7888bc9a8a99d4788b01b47b40ba340193eec5fbba7a96743e077bd3c2406111e34994fead472391731a8cd98c732b2e702e0faab0dbade0f530a48488f30ab432b209257ddc0072f41222e6f0490a743d3d1f70240cc90713404bdc42f7c320fb888df1febeb27f22b4c6cc3323d529f5e791d677f67fe93220199ff05b464f9e0c19447720e70ce3416e0573a86ee92320a109bef8202bcc4ca0e7a9c22af322c2c5f4a2c454d0817bac0433417e158c0dbc57bc668448c55e98803a1015a99af929be3424262097b1282b0e1941def76f0eb83bcd2d523c67a9dc31af7891b575f9926f2bd0f26db7836c67a172f6d3cb559f58700af6f11ad6cffb840f32d6a4ac0a6e81a6fe4c84645ce259f635c4be445d8769f3b78b88b0471ed2ab2e9bddc714063b8a55396820014c411dc762577340e904cd53f10debb8be419ed4d77987491ee47dd093952d4b6dde22ca29625713963fe634d8ee85c877acf10978dbd1bd4e77113c353c3f09d787f3b5aa3cc590bb78a5ae9cabc302535c0b3bf59fd11fbd723b17b7e248a429af2fb4164e8f2906c8ff04b88380fa0658fcddad664d5344605d688ffa76b5340642f0a653ac3b428c0c0675d8af48c55e53424461cca93c10146410ace2e5fb7a7bf816c9bc36209da4713ddc637771310384b8c3ea482d6cfeee0d8167c894429a9b10ae0bd1ec8b3c981b4f1a51a47659928ff66af49f0bd57e24c8da8282ebede576759250df3f85e7bf6a6c0a4f6ce223fd497bada73a975158e071a9a1fe2c0f5870a2ed80ef9f770e34f07586a729194ed26fd2d6cbe4a595ea140c34a219bdcfb2e6ac157a7fc510f72d08a4bd534bf5f793d1eec16d2120d85226f49471de6d19e873c2754adc448b9501d2c48892c73982f2b28636e8484cce74a098f5d6eb0c47435cffdfd8df3b541882606398de96a75ac319c49ba8c9fd3175a82a13405f87459bf3527e613f73af6684960105f16aaf313fbd504966ab2c30a1838960048e815dfdb08a09167fec55d9ff061ef7396d300a8d82088880333dea4bdc90884a6b67ee3f722d266af7abbf66f719b7a1e327c81390cb239f72f40f8c603d5a713c4bfc470e179b07e802f30dc09e3cfcc17083638dfdc84294d15873bb976da9cbb0d3486857ecb4bb9dc7e5be85f635bd8c4fd921d02c507b73e7830f1a6a9d548c1078b1524960d6331e3d470d09950919803157c10c0811b1a23e96a33c585a279cf81b1692b32fd4942e33d84d98702dc1c66fbfbb8b7dfd8c3510c4686d9fb41c3ce60c66fb7a51c4fd41a8b986a22937567f8aa0f68b7f989b7f7abe385b908e9c2c847f7686906c1c18d21dae43e80de0230ca9f99f82fe37699548330ccdea89686ef4a6429a1541b6208673807ebd34442cc59c9fd20fe8c8a0a24173ab2aea6413656c08f60566ca91609c5f27f6f4cdfc958500a077af6d5e9a138bb75f9d05f4693ce91cce636b105522af107650e4ec670f0acd6909724e52b515e0f28a7d3c8940692f6f912cf130b82a3da1e516f845017c3e78898a9296d1bc6bbffca6365b2763b8d7348e0de8347611eca610ba52c8aed2d6709c6ceb4064c9705a9fd4fdf67a945b118cf30199dc8cd3aa404ed244ed0360c3af5146ba2c4fc2d7da0e798cd4f7fa16c00e76b3221c412d1874a92e9ee94260e04b3eb9d3e3de775139f884a53526c8bcce1c406c98ca978d6b4d066032b337d902e3e5a2f48dd1d212ae540de489a9f495f304064c33a1dddc8c6b8bd2088492af091ab834177759cea7a4e0d371b1221b6cdca03d701d57e432d9e905ae36133423438af3ef53a7a9ff190b354aa4996be0e341f382c289d753e120ca36408a7dc60450d7718c76dc0a0954ab35190cd9072dab451246397dcfbb468182624bad9f63a02e0ed718d1de93643a1c2e433c008e1941df9fc8718ea2954853579e185c4e865d7534be9ac64e89472cff85e0c0fef7f6da688cefa84505316bc0a862953d68b4de3480c537702d7ca94442a0775179e03d98494be48486233e0cb3f3d0900fc85531d6df7995d363299e8e5595011f7c6c5767f582ac9c6e1995d383e9b254f0ba1b5e66a7b23c49a3cee42984d68f946253180e1e7e8cb26b93607f768dc3453d5524ff2e5090d322fe87a9e2bca65a7bd0c27961d4e5e93f0747b2f563443ba12637e63a23e9fc09c3cc2f0fce97c946eec8c229c89a97dec4d65208b2d1cae64b1f28e585303899c145226d2489f35f4f9b6fe465742eaf20bc4959178368426d9be00a27035f8f1471c817ee82563464b5dc096f3e049ae4055dd9a565dd693e75fe213b1e222697093e130e990cd750a0c143fdadb7c6a3a6b36895d371398de6a66e4e2d03a8e842cc5e71246cb13c7ab81aab0d2f1b23226a5275386da374ef90982dd543f882cab70be10fa472e77fc21d4204f8542360d9c494d715963d030b44f6765e7e541db31c4c2ab02336cc736a138e646cbc86077d894f2ae93a0adb96befde4f0f68ec56fa85207f5b0cb516fab8c52efc399f86956c95e78c7d62cac554447aca1de701c161fc8acb9a974d3e91d3707c71d952d824ddf22b76ccc9a0b2e0fbde470bcd014912406655df5e6af55b3feca01bf60bab2a4b1a47bfc3312694d7c82003fcf538b2eb6e9c5e88098ed10c351c71329395a11de509108e1632e526f84d9f072369844b94a0b8a62f953bd54fd9e67b4026c5c1577340c72d00869e5e318aa78036c8c790ae1943e6e561958b745abeaab5510e14d816790de13c14bbf309dddf80f3a0673aa69b6aa2a86ee30853518c12b5c81749557efbaca6a20bac0e147471ec39bc9cd11dd3d6fd3156d674933c1747e8c6355e3705381af4cc2f5fbf705a3d7b3a650af3040f195609115e41b051450a5a2735526a753d42d0533f30c108e0eb827dc054ff42710c261ffb8c6d19113e7633cfab2ff6ea917eab633a56c87bd5f85bccaab3be055b8e99083edc80cc2da7d87eb6479225c72c1842fb7a095642e0f0758f12164c279be0867b756c0d8321e36461b7caf3be7bafa742a074b4fa51f4e334e8a0bdb9290a7aeb7ff2b92c7d51207bee90119471d7ae31c16bf97467d9579acd5e59291de053bfe679cc6e2c979f1674675fc88deb21e19cb72e34c9080cfc68642f7db5e3cddedc8894d6e55c4b628be355bb3ebc95a4947598ad6a18b8b76918c87819b9c455e55e962dc677b6bc113b5b265c64b25a13e01087f892d8e5aefafb4100319ae4bd7a78adbb6f2c703e076c446a30e6e289856d1fd9ad21d651f79a9a6432f3076f3522158b54e95af489a2ff385b3943abfa05f2c7bb79b3f989701cf97cd845e64c30f4514a609156076bdae24f717a1de8009b529942df056948550cf4392c0db32f838fec6f8b118f5cbc1c92f3037eb2eff72467b643ccf88d4ac4176032c55ad09b64a0ebf4d6444facfeee43dc15fe0c80a1a9214a974b9811b1130e33c23eb205cb61bd4284e60451b5b9b3d4ecc07c195c62d8205bc38a61eb595013009707652fc7349ea8c0a436e186a210fe1d641cbaec188a2449c7636cf63e6746a9a30af41c5260d14aaa872ca4cadf09c4a2fa9bd0bcf0563341983f7d21899f037d61e2a07bd97c1ce21b1151b5aefc4bd5fee261c5ead08a5ab3951439a47c3a1aaceef06acd6abe62d1270918a2896d237e6ab582f1302eb31363d42f2b6cf538940162aa01076293a6372d735793f4550391211d02201e3ac241155c31a1a5a6630e6bcb53cdd017725a3d50fb708afdde3ce274354446f22831177e9ab10b1480f3586bb6c889e20ebfda7b94a845dbfacd77a29b6aa5220b3d9793022faab65a6bc50cd9a7f6abd61385f02084d659892d4a7dd676b66eb5d394b1ef81b7fad7db8fa0f20dce6b565c3c5a87f95006a372f5a5060a6f44d1428778daecd357e67b7b00c2cec0e86f5b21e56050bf21eb1d4baa66081e5c826c376527f238462810303424c323161fbeb95b496686c47ee368314943824291014137d814ce21b0f9cea0ecbc6b720a6a1140848c185637582cec9a3e6753320690098b4d83b29ef8af3959d501a7eb6e032b96c42a66bbaaac5b3f2ad0e84658205418b9762a7999588351781327929ff5eccfd34e69a76feceba3794cf78dc3fd22ec049f14f41ae740673000e238928669cd6f10f9478298665b83e1b0cf8657905e00cde5e20eed413148e7f87bddf2119da9f16e3afc5dcc3cb802870470e18dec875b580a9cf752b92d18d9feaab5bf0e4c66cbe66309e2b62bcaa510373bc2dcd811e2164738f79e933e9e94803e8ac128365d1b9122c197e214cd4f521e30870c217ab3c222471e2b9bd8cedaf285eef97661226e7a4fe102037efd7e3969f77c17aa854600003162003083436f1ac6f36ca52ccf00a23efef97c78e4f0ae3b74b3a00610b5a834b46c5cc96e425cf8a6a80b6624523f460833aa0f8aab0a32db41fbfec08fbfcd0ef5fc2e485eeff92beb1f520552c4d676fc360b2acb97d7164e13489f0b552057f74699fd19ebe633871e267a94b5b81ebf2396b38ed91c8edaa3955091e5483a6629a2d630bf57890564e4bab958501fd3dd476c9cf8bd910469b2c94d8fb286943c02f72b5a2267bc8a667030fbf5dec3c28488c205124ec059da43a55e0764fdb2d37ac995777c6c2baaf7c26cea5e01679537c3848c216280935a6640e9d6146b5456014f62e201cc28f25cc0cae1d0aad5d0346fbe02d97f1b214065aba974afbca2e6f4647168c442cce79408a84ad2ccde330d109cdd8f261f30b8c89cd6e1747de5171669a0cbc1f6f93575e5a46a7b0d952d93b331566e16c3ebac06f7c0d37ed9753184966470741d236690dc6c5bd1e87c8f5ca24b64ca48d675b56d1bbf414a1a2324469066b985a01e9658f2fcdf0f9dcec89a22a40c9ff29303fa797343a2b6a5fb01a954f50f8b0a8a422adc7ac87901e909d9dc59e6b4edef49deaabb1c295956fb062e64c7b349f749368acee0b6bdab598d91830e0578fde09dfdb479ad1eb2de43d9b212d56ccdd22822c9b99cf134c538536a802a97cd24471dcd022aba2996d4ad2e46cb3a0e6d251a96cab4f971582109e970f271cef9585678469b66961d0ada80f8e382c9989528e4bb4342fa5907d5380d3812461cdc9c04d421a738d345dbd21551671591fa80dcb3aa490f4da60c5361951b3c4bc6ea04460c27c03b647c42b30d9804957e24b54ee73bb307298279f66e3b07509e8f058c3e4c713fc36265266f566576c9ad43b54965a4a810f62ab9e1a358b6936345346a561abab9c40d1340def0ba2199272af3a585f3eca0bfa426ee4286c36e8d08602d796934348aa1f9e27e4ed0adaf09354ac2ad5d58702808a61a2df9e61bc5618c7da6898f784756c1b266e33118485f011fa7d078b2630a77fc4a6b7f165ab64100f70074a9f6b8ce05e5151f0ce9bfa991a3cc4c308d5b510cee9042d3040d7c55bce4d2111c8a523ba69bd23822bfba7ef3a0ba4000ea56498fdc298f630fce5f257cba29422e140fb6317214dd2b4765c0d5ba898940f306a8ceb403fcd5e8aba488ecd0ca76abc59c06528e66258366248fb9831f31a97b85970338e15a30a16525c7a4962c99bb44c89223709b4690b8e63bcb14adbffc0e71e733ecf00fb958c11b733b7661e5efe55a807ea89416630bc9d253e25a4838500dbfc5c4a825cbc489ae75517ea0829f9d5b540d576009e9ea97a4368e4c1ec5a9622360d90a2aa447be84585b9a224cd9411945f2d517c55942aed070b060378360e855ab23db3140d6be24d87f7bc6444f73a7cbb7b8c8cdeb311f72bf234aea080e7e9cefd81cfacceb3b8974ec22c7060a36932cfecdbeaf8c8d9f6c0c8f59c53000d5ddc51d08e75c04a7417819839663c0e0a221df8c19459bc2103b592e79b94e90756c6483cd7a21766c211a34d6b45f1a43c474c97d29230687892dfae712cd18b22f8c440a1aaa18cd3202c263172768f079a9297e1d8d58c911a861d887c9c5d2b96cae2839c9c60a89743d6bbd08610a02af95536aa6aa6b25192ea8c3292451d90d50269100ed7ec6930ad23f6e0c83efd0a89c0a638f0b199409838e3cc068a8e929ec6d8b5c19eb6dd1a7e90615c428e6dd1213c43d1772a8d5351932ea9f299b38ea005f93f445d46d7760d4eaf4a57e74ad11dc6c38e13a082329d91e19cbe8b4b7c4886807b6a6d2b0d4c86c67c1eca534082a738e854cf6b9824801de54970bee2cefe8e1f43d9ed4aa69e969b40a7dd8c6a5dca41d653a6ca3f39124429034efe6f6e3c345c87b3aa510565cb8805eeffb58046b3e22507a004ebbc7c5ee040e83567fe425822ce096567441c2b47a52deede566d753e4e3c92c288512747cc09ecddf9ce3c1948f6e497d4796b226a992147149258cfda593dd4840d8688c6ed590602585d290614a61bc46200458b4431e6df1c2af34cde372c5b47cc87f7becd9b2e86d3a54e98f210a6eb2c0837fa1946385609a9606ed440f72e2d642ad3a59086721884acd02245d559ab40ef1fe28e8d67bf647060864a211e8aedb6f959b4b181623a7f10b988ca7f5af208803440c34658f6cbfc5172628c9a3917e70671ec0b5e49e199811995e20caed545eedd065007d1166ba7c16f042fe308e0527067273ef3c7d752bf23731e6d88a9e4d9843b90a120b8bc2d2dc1fb4ada04be250fe2848bbb266434f5b4be51af92c3e4a7c0c6d266fe57c108ccf2430b6be0824944843f52fb1cb3461b3dc100382211501a2d93d5375f96e653e361598c4387da5e536dd2668f119bd7419a5b4b7ee37efe02fa1c248b996ae91d5783353f439abe0f2a2349729a2c3c9216265e4e4b7a1b045f15aca80030fb264db54caee1c027a2fd9a66bec633572eb2b60f140134a887a3930a29d2ab7687d52efe106808221f2dd7ec44dd6a6b3db5bf04ad9b61c5381c0909b660029d4840ec92001151d01269d5e1bcb5e03ad4038d6ad410a03d66c95526cd0e69133811d3438f81179661aeda485738c075e215f8a0a3989de24c63254a4a4217b18fa49382254d7e236917ab889af55f5ac2e74a7660e9d852ec86e2d5f694ef06282f67802155bca2d7aab2e74c8f43565d93318bdee5c45d84a95219fed69b962f01391f51fc140d6256e2d88cf5a3fad0c168bcff57f5400772eaa80c984f2805053d264b09b31d2fb8fcb7ec40151ad239279ad7566809747051682e2bb1250543ea3d1d0e4fb91fc4092ee3a75d2cf9a9a4eefbf83195fbc9f147e717ac81c403cd7bbc97dda66844d3962708a6565399ea3d256699951161cd13e726997c9ddc5494919b68f1684430934ab87eb9abb5d3aba47588d2c177186f662106b3faa11da92be528da6e6bcad941ea42f5293da34420002c25b513c603538fb0e90e223617e6620f2f1569647d6d272c0dca0f867584c3b3a6a5d0d411baa23a9bf63b001e88c8d7c36c2b956590a5c32922dde4f0aecff3864c89d08b39c155060937876d7f4af4255e901fe57aad8165063b24d69e35f58f1bc193868972a25dbd944ff277a17aed7a27656d385f95659b9399fcb0f550de0ee474df2e3f75a6ff06eed12226f51b48f959efb8544bdd507381480689058ba67924fac7a23cf4f648489fcdf48a9af2c1d46d0992db099806b18fb89dd16d4d04a9731bdece4d323332a7135b1d96303dada2c09dc474a7c6fd7c3b16ed951cb3c8115eb53bc08c18ebd498df483916054bf986421d2ec8c5e913af923a5504d85bab98855c395716f6b113da6b299e7eb9b4a8b824424cb9e6a18007d8378d4e16ac94875e17aa210b59648d34acf41c0dae24c004a6461761e40f5a8983b7986ace869647475d11e87b23d551e140d4160c125d1a48d528486d137866e06985ceb7c5d775fdab09402f531976c02c91dd10036f445b5bd7f8267ea119a2241c323969b571360a3b4beba8f2bc0cd32713625798e3928aaed9f2bb6b2eed90159c62d2c75e669461ef93d14f1302964acfb839d198ccb1dd2c7ccc016b6146782ceda38c6fa38c43fce217f82fd9e278effe76ace74d472b13845e2b80bab5b8469f079de330e793cf0618a1faa8b398e47585a927b2923268acffb222d27eede1b592a4816e135da8343cacfb72c04022c1b73d9cf1f27c06592dc474b026231103c1a6d3b039353e243e4b0f2eff1b053132793d7b589094a1b84408845fb3b27d08320f11c3173ec469a396211dbd07007ed707ccdea1608736aee175e4626682235b7b40f6d1068ca3537ba0f3dd5c9ad148f978bcfa96de9d01671488108ccc2a1ee14ef57c138af6af953b466bf21432720fa8b8ad82437ed415f2f0c7a43903ea28493c4d69d26c63d1cb400e6eb09a34ba885be20485c4a483e890c7a999ef62a82c81bb35228d69c044a424963280b503534f99629f4f9887a8042290cfbafa7f5501497abbb80ba2db4064ee08d1a2e1614b83d493dae58be92e01e55c3d7d594d2dde27937d066e9855264fff98d0eb3b508102f440909ec902d91e835ee61026ff524a4380a0a2c78512bb54dfab6dfa77f7b401c75b472c56442954c179024d136ff25cc6e63c63e09af1fc411e6cddb268d6433d7b479ede5698cad96a6d8b67bf47858302bb85cd3c5a996938d506ff4d612694757a2e11f10fcbed09bbe7b9f5df50a78d23aae21b88e77d367eb87353a48b44e9b0048e0d70021d8a132fb547eac8656eb787065e631f4185d500be16f1d8aeb9e5df3935ec1575d9eded1df3af49c044804e1526ff9b518da42be7962589c8c85fa2dade7da21e461901d63cbdca1e54fd3f518251af285e2731f1da7e334d37562357b6e78b29cb44ec4838fad250b5560e0948cae1e02b411252d2fad9e7787f28d97058caaa19d79dcc1a158a065b7ce9579f55d7cc522afce0f5f10c10bfdd34cf29e9e472cc8a304d238825370358ee294b8824b70356ec5d1388a53e00a2ec155bcfad36edaa5bdf49feed37ffa4f3b6997f6d27f3a4fb7e92b0dc4f5d859628c7ddcca8a604782b3319f536afb09318359eed2ed9ac02ca6734b6d6f42fcacc7444ea94ef84efa455686349d38d045d1ab1c3c753ca8ad28b6e12b121d99eb90cd9d320a67aeab9fe914abed15277dc5a59a5216e5529af2539af2500aa0cc013124409312a50b580f09f919d17d15b771b47dc9eba714888216f4b34f77664dfcfedf0d68ee5c0a426f872ddc090cc6f0ba3e353c97bf00f311ebbde213069aedb25593640e6bff584de0ae9d2cb5a4bcc7ba3b575394b700fe941ebeb2b380c1088526d877a977549ed5fa6aaadc65e51fab66141b201fb1ceab7c8af5d474d9a7b573409515422b11d6ff3d821d16cd600cc8d9102f1dea1ef72ba5e905de72660f318b8dd75a4f0572b81c10ef37a8415bfe949ba6a06f7db9be0f6b64bd9b825b37954fe82fa7e78fc5c2bc9884b9ddf2a5ccbe47515f282f795a9e07daeabf7c11d80e49c8bde395ff9b6e0c2f954b9e2c7acbc66b52c05d953ca83173fd5597b45330dc0d2f16bc9ffc8357144ae67bac72b68865c6b0b8fa1fca86de5cb7221e45c0848a3a333c2956638689ab5bd3d0094c6c17d73288e11bf6a9f17237e0dd7ab7d59213f3b90046916f1658b9e27399b88ead63919be378aafe33d41365f845b02ead3214764910ea43263e519f13af4e39dc9ad1cd7f8dd35134703283d8de16583cda62a260c3b85b8c18192a6583a1a316aa260320bcee784bd0c5db9ad310116065164db2cc3b277dda91c7c4e8be0c18daae1ea04b5e12f67efc9a0855e9432f1b2ee931d8cb12fa2358c64cd828ffe70fa7dcba5e11081717b11b57f20c2ff361a3a4a11fb7e46d8e0e6a077088e25a0452c216ad9fd00a342d75cb843a2e43156112e6c6e9c4a2cfb88b9936832ebc3d5e5b3949607232d947eed368c31e936ed8c40b1056d1dff37d33de25cfc53c75bedf6e932e16805e3bca256dc82cf36185b8d89feb5b0f9097f0623d7c3cb8c2d8a618a4688187a9dcb5a48f6213b0dd72e1c2e9c5c1aaa3ec1b3ab3eb4a0390c66737358913939dff2c2d840ced7a7f5ff557926ddf4a43d55b1d180cfd86d15bf004055709aa0c8418d8dad8bf1a62f3ab84854bf38862b114760f42371a233e0330c50bdf20dca385f121dc34fe09f32cb3b7baf15d888bc81ad2347bb137feceb54a75d2c83c5048ad8ba987e95c36e3181a90b2818787a3409215be73fa5d510aa41a521b8967fb9f1250a91bd4e3790adffa52be45fcb8db23d138087cd7a285d32ddb3acf1d3ad7e12e84322544f6661ede4d148b9756cb649a863a4d3e769fefa113e6d9ceaaf412be6052ce56e11b0d029903393d1d6a67120cd5df1aea75b8cfd1de413fb03a32225c6cfa0005d09bbbbb50128f08c38df78cdb79aaa545b72cd30d3df568067986900580d4da8c67901a1aa41e6374cd0d10793ef62c66d9d55a54a6adfef47dc49e49127ae90efbaa2a0e1836bd26b4a11e81c66aa30656b075ca2df347d199c12027c3c88ee88f0118a7015b149213a3c0871132fe7023283d9409db8fe6dfb47063a0db43d5ddcb273e787e41a08a4e7019fcebc7620bbf5e393d0e687b0715defa745ee65061c80aac090d4b036c53cfa8811d3c90e03df5ab6f3a3309c2a282373e1eb81a8147d0622dd437515ed660a16054315baac188370a6ffabdad8d183a3180901d23dc6b9a685a7c90185728f9bd911015af6de36925a7f9a64f9e75e32dc5d8d26f5a7cd364e94c6d53f3789a3e7b3b41be9f68e568d377d4ed290cf346b91207a8a55753b902420ab5f270736584b4922be8894445aaef0b9ae85cc19cad7db60641184957034793c78ba169f576325d867ba40168a048c2b8499834bc891ef868fb347e8ad4477707fc00cd8c57a59085b258c236445c08bd73b530c24c3da9a5c3115a77a18f9077da13a164cff1eae88c38923b425bc34bfe13ee3d5df612c5bbebe4f4e7d823ec0487161b702214defedd86faa0ace200f15710f6ef3809bb3783e49a1ad8112d4aa8e74d94e54ce08c5924e03c0728df669624f4bfb39fe996134bce6aa52b4ec4355854b1e6e1ed19583bf6dc6e2ddd3f4258485c2b5521476c17b80892234c406703ffa6548561d96d2a352bf68f243e7e307012d0460fdee631dd0ea396ec8467e85ea72dd84b7fd6e272dd4578b6bf7d7bf9c696338772690e3a25bf473ea61386a66fa721c8e7738f98f765c8d4ac419bd44b85427dc558332b0782c4797c14e89a3567861a8d36501b1090ccc89bd03fe235768c79db48c4682633fa3f6c4c775d24024025a59a181c70aef1da52be40f3d3196f62011da0971831d391070bd35a6048158c4a1bd8da3d6bd7a2ebe4cf66dbe38d087fa22077fc87f688b403d063790008a03d7fdd22bd269de54422a76475e87996534f8f193e8feea8fc571592bd2db36fc53a10b3e5db11357c762cf4548761ce4e58a4c3b606483d0d7f236f07c322f825536a9c48ebb757ca8f1423e8db6e408c35d48d431a8f65fd5fa7abc8bfb88bbc9c70380d35312ee17edbfbacee4b3c968100c26082ff01047d803621e99acbeb6622b43d1c8772740b1b77e47bd774b418d68f1aadc571d73efd52863a0d298f3fa28ec6826f656481a890173b80f9477bab446e79ba5bb5b1b0c9fcdaa19c1f1d4dbc5265966d49177de3f4fd92bde742374a009881b60adaa89fc264a39c921a2b880db7cdb96f1179fe5cb0cffa50ba1d200f11afc58c3f70688b0b95ad7deaedbeb07a23890023125887251fcbd2e0bc8a8a1916ed52d0c3e0e04aa72acd3846fbcad8e8c3a3a85e7934b1a968226ca64849b975228678fcc01e03a9f4da99a43c20e671325f8cfaa3812addd4684c7f3301ac709c565093571f43d33327153bf58efc79ffeb14bb895eef3e197032a72fc2775bd29ae63c1453b5dde165e62a1bda297888eee2d508af0362a9c0b8e35620ab18fc3b50da1b6a13a48e5b60a2b2a3bc0448cdc50bc03a65faa04a0d997d9769c360f225203b6b632540ea55c201c282c6f2c3f55f75b38295ec71479b39ef96d0e2a56cd95451062bc936909379b7a1b4db64646568150bb058464ffa40a4c55419169beccd088750fae55fb5a0ab5463bb63e33ab9ad78014cf4881b2784d55bf5b99a76c84a74576d41572aef944863694dee7c3d425d4aa68151f3340b2c30cf722d9ee08e38016ed5257d322a6201907476f045d0aa926de8e63639cf10603cca28dfa4e446093766247165d2f18ccf02f1b806e55d099e3002e7c9258697b5dde8f1d741fd8906c377ca11d6692bef9a028470acb52928e9b06fdfe4c1cf2bae09395e248e18673ffd613c8fd6b71235583719869d26435169174bc121d6a7ac387014a6de065a1e002a433c85eca9748e5c890e8353dea319a38ec64d114df369d0aca79d986300e05657eefab2533b9c39a3b8d4a5615c7ea69f27c1b7891482f7286ff8ea1b6105d4c2dc446a9bcfe18d714f0a2de9ed0f8a5bf833fc4d4aa2fd644648399f2bcd3d69fd7d090b4499262d39d3dd0519ad398bd4936cbc4145a4d3899e80b2c856bd3f618e4de0c09b1763faf317edea10d7e9892577fd0d6bb04068d1a460bbb89f010914a1b26f23003bf1585ef05e8ab0b8d53efb8942434a723fe9b847c15422e3934e120623ebf02a773f0068557451c6d79e99654a5376f671216cdf71ab78e5a13f2f0bdbd7b61dd66b692c6987917aa38e2ee9afae3ea3fbe519c1851705b82a73a6076990c55876bb03bc17fb18dd7d8691fda10b91bd4d6af0d92ce7c9c2028c7ebed828ed446c3e4fa25ab0bc2599f1b1338e79e57d573c0923bec71a18330e0b5df6346a053b9c8e8d4f6170dbe2ab52e466102a4631c8cad94be978cda178c85bac304776ed8d6a84a85c86703a46b78519668c0b36454deb56ed694dd5445cf314f8c2f3298a859c14c5617680f2568c6ec8f8d75906a4499a9415cc9fce6123bb327e68495ad9be9ee1469dc4729ca6c7f9c995fd35834181431bbc956e431e61d859e5f48aff16a3a1e6006424b901fa18a0ed487ad79852102e55e9b01d628ec0d2a37e0e43e8b2af16b76ae3a299f9d5c9ac80a21ceeec6e01a395c89135da1c6d535f99fe339c74207e4fb77ea86268f0f9a5376a41d4ac5e0f86f84d6b8ab33a8a145d3f84f2e0944d212b4136505250d84682448f4e7342bfbcbfd1b98729e68ca5d45d384e7d87df99dbc152facbe96e59342e2fc2887b9df1fead5329c0f721df094b92ce88218403ddf58eeafe48cd463d8890b8abd6edf4767a63b9cc9ea650e50f6cbd38d200ded555c4eaa705d50eb96cbf9596fe780a6afb6497c524aa2686dea33ec1b9ee8006ff2a955f78ec92943c0a3447f43896060d83049131d72683a29e9626b02870b3a28e75e0701eafe1b9a1ef11cb8009518256fefc705c72c930e9384a3a0c2d2b97f7b831f35b7f9815f2d13c17f271165ea65bd191e3a03ac56f780b0784d86e2148e07e3505d26be5e944486ff0eda5a4c3087c5206441b18ac43c28e82f1943589c3da14137455e5a057c629e5982030eddcda8d5fc2115ab003c6fa6f37469429c2d4628acf078c4e8111724f1987dde6e317efeb09239b3b0ed57ba7fd2d15169ea6c60c2314ff593c64b2d739c8b82ec2b502525bf970ae527c066f32563796c57909f0a1a1a692837c7106e35e2879ba07a3a49203c259eb039180af5881539e1fc478ce914be47110ca2212813c36299bc1896043eacf41a26398bb0c773dc8cdddfdce643e1f43a864b0b863c2a6e468a713fe5bfea3af4f301613d0beca370ae0916c055a880afefa3557b8fb2d8de55af3810b3917756ce16fefff33c7ca2cdf9f5b81397d54dfc0cd949bb61ef43404b653bc4669625af277d0513f9462ab03bc1b56eee189201d28b69c6eb8e25e8cd17b4464231d7ad4336348ae224fefec92312d0605033e74e92eaa83a6aa7875fc2a9cc9430f20c931c21cd12e177a4cd9e68ba3fda57b527d49d75256bef0ad336c39d7b7e83114e0a7ce24576deb0dce2540bd39747c10368fae40cb0a48672f4baf4df3ad7dafa387e5974b65575374b5edd9168e75192dfb542cc1e0dc635d261f044196d8718a23170c186ffdf76a8634f78d24b1a5bc012d774d632cc90d6e0e3297ed36446841acbcd3c26ad22578a39985024dbdd517b14f2f8b4a9a0e954301c37969cf31973690038a9db6cd51c14d24f83687f0f8d6f56878c3b4d1e6e5657c8464e58a18a56c85207bd2c67b4b4f677f3049075c0e79f788a65e6ae27eee5d0c14e59dc54400d5ac5d104941754da73d6ec47f5adb2821042a828efd41c096a948bd8f0f340f767b2b44705c6048c2aeed11004185c5b3179e6f2441294c356b437424836b70b5fa45c2da787aa1d8b81d32b5f99f5aea266803e7045591db012d453d1aa3cf1ad513d0ce32dccd80e7ef4ab41e368fa391f59a278a8efe94f40000b91d435e5a11f01cd47e963ae5359557c1920f481d5d909d8c09e4c8dafd382a5f108bd904220d2106fa6ae3237c131e83bda5f6ea4e8a905de45d45f00403cb36128f6df1e81892a264e66fe80c9effeac33e3325b02c027141e38d417e827780759d25d3c982c4721a6acc62b9a908d1edfb4969a0b77995c978e01635cc59a93ec6ba32d2a7054dbbc2951aa3e2f421f39f72dc75962b9e17673a17f8cf00b379f9b4af0bdf500bc7ee8b1178c9f4eb2c217834afc1aa6859d358233b3cfd764f7007b1ff15a12970221e4f7634b4d8e0c3d2f7a9d8088838aba2d9c1a7b71f95525350beb4e05fff6240f96074c0b44afc50a33b4ca941c0e50dd34000e97596e9af1c46b929738152b271111b63676f65a023b2d7591abf47141e6c4d84f224ea91a46e949fa5c0a1d4cadb914c24a2d89a8a79bdce424b8ec0b09d6e4377639fe3ae42b2a5b5935adfc328ffcd8403d6a238e2a7357d4aef73caa3e5a79337e062bad44ef213bd1348e4d39d9de6ebd7e3073f69d9c9cb1529c61064da5d6080cb91f8e93cf6ed7316f0dd6bc2881a471afb86070d7aeeea834c2ad7d0497215ee967a04288520f71dc097f98df3c11eddc6cca35eabd6b5aad759f08bc8bc1c8e53985d6fc95987b830aed7c8c11a865bf1059e378193e80b89acc703617cdcabfd0d7397d21b219fa704424b5123a4822ef2787a2239a22ea9c6c2c1d76513598a130129b9cb086f02c05f89a05b26705f3324161ea01ba2d9c88ee863ed370cd4c5cd7e4f015038fe17cf064cc9ce844d16c15195889f3f163840e410b5f9cd5ac2c68396633207910c1b558d56deb128e25b593826651263fc42255abaf680250ad69de319f27d5c028d8de03667cfe8942aa833e173fa83d39e52e9b67a1e9c851dc44ffa9a939925aeb7fcaa77322f3e329b4c573c1e447488d26ab771b306edd76530cef39da56f40c5c032be60e17be832533c1203b4ce77962b8a2e3ef33d7e549750a8190703e93b96bcc1509c4b243d9899dbec5765d5587969cfd81f19cf73beb3e89487ae7b83c3581a05eed4741a914f4014497f6ec869b727199ce7cf7796c84f369ec4e9ce182ab17f98421a92d566703ca5511426ac6ed7b5ccfb4f219ba656fad8977797bb3ef6a3c0b4003fe47281077480f01ccc6d97ed56a1bf5f75197161abd2a353f324b442136478235b199f0d4bad129bcf88809bde770e27b4d6326b0e86ce73f739f933b5f59633deca34cd9d6353f1186194b25c763832844ddba2f6f6b83f154709e793bb1cc8cc156c370826c8f5683707f90b147c6abb7e30d4ba633747ae1935edc282787d4719db72f4048a01fa4457554adc14fc3189f3d97fc4b82c0674cdc4b183f72ce4b99014876b96327e21cac0b2d7bde43d4bd7fda3156a2276612554a31d7a186da675e98040c2038afe497481b46bedc0dd4f7be8550fdd4ca2c8a8291d89771409d89bd6152cf08fd19bb1093ed9e66c36ede94c9b32f5a99f34de99c9f4fd5aed16eb20b7528a2b90c58869f6eec50d50a4b7fddd94f6e61028a414b4eb7a603e4b842c5d6b0e879c43cd63f90215358f68fbc485b868021b76ce40d159e44c686ae687f3a86d2ef8b98cb73598cf745f903224ef30707a3d0d2e5d323651d668c2f4e3d38e32313d95c30ad76d34b996e28ee7111fc38ddd0f5972330a9c0e340138253733345fdb98351b31ced9bf760cb34c6561a9451189a8a685dd0f48955a0847cf9e00498f0655827dc7058cf368d1f1a038d29f0af71ffe803c30a94cf666c1594504a555aa7dda8a5b789a0f086d64477b641c770ca8574b1a1ad4813e1962cdb6c2438fe97e8930677788b08513384bcbe4f09818c3099c5bd176f7505eec1c4b76edafc7722fba1799f4f95db3d1ad13388b329adab17c038928ab9effe63d6b20af31ccdda149c665fb5a64bb6daf7d5822ae80d671e58b853fb51e0f8e7039f15122b0f816b02f1e45ad07bb0bb7d1b4593331d12c1227102bc0ce9ca92962b6af4714cd03372518db8c1786c80a5fbb75ff771ec7d11ca21970a90c33cde804c714a9b5db351dd6595f1ccd212db1add0260d3cc7a1ead11c8aec26228dc531f1ca86221bfd0ca272fd58f7e8bf52a18af6facc3bc101996beac59be5cb88c4ffc79d62da40656045e5ad7fedb9a5af44d2034a70c3a339c40b90fc18fdb251e9b314d8bba54b766b2eae1e1da97948b875cb8e0e8a45253951b5e9e2921d5358ae9b31e81b7d5eebf3463faffcfbf9702d494301c1f06591a330a4176e399adeb173f94735d76a969e2da6651576295d3834f7e39aca2f3dfe939e2dc95b38746be21c3dd895bcef59cb74f5657665b144de92faf42db3a4f758a55170fb31bb2cad4bc4ef58c42008dc71f10122b843b10745fcae450c04d11d171d204277297e508d10bcbba01121b8e8c001058e99dfcf6092bb543b273c03935cd2b69bd059cc722ed5fe04676102e4f2a4b19fc0d9ea1e52de4d44c466a86099f9fe4a03b1280cb1a02919a657f6aeec563103177998dc82bccbd561e3022d6d23eff3071c00a2f9679e1718eaf820714252d1b0633df761acb1dbe21654fc5537aaafef073be1407f035fb728481c6c6bb0fc5c13e1e766d276fd2a5da07b08deecabc09312bcbfc3772b268076e8930edd9e4aabc2e721105f44421d22c1dbcb25fa1b84f06738dc273df20c50e1f257c49d51bea96d3b1d2c8856e1c5cbe6dde724bd901b3210ac2c916947ee2c91c5374edde1ba76a215305f9bd302289de492d0e5eed5d68cb68025aae4fc5295e1bc76b5ca334cdd090e96049561675b6040d022f3d4a26559576261049cf3e6bd8540dbf02ad1b60b07d08de447528bc7707c2abe838cc40052cb9c08df564d00b10e5c3f592201f2694eafbf6b3cc6ffda4262b03cb51a0297e1820b3dc95e061f9a08c3f23f210781e9354024a6f818c2b1f1630bf104443c6eeaa7f0d84e1917ae25c11a3d89583482cb4d02a9c26178e266cff1e489b1e38e85db595ec684f5cc4a919a53505b6eed3bffdfafde3b5cf6e89448d50dfb29f05c65c005f3a573536f3ec3e370a91fd1f91e2321f3d5fe7da92d7b7b1ac1c466e096be81b00dd4494995b78aa4c7ed9d21aab2b1405ea115a1996869ac1be8a35302ad08e41aeffda9fa7a61622cf77b3996e22b7f37f953bc55cc8ab8a838972c362b02fbc2e05811e515f7bb2919347f61cfef1c31273a799ed9a676dace67b807730d5b7d672e431c1c3c6a8a71bd786cc861e38b08530249eb791dc4721be0459f88a14417987af81a54cb3a6e0ffdd5a5a713312eb665b339ef05eceeb650df17420a771d4ec93de406065148afb87ea74d101c82731a392cc81d3713592fd0eb99342eb3d5495e723fb5b519de0d446ebb73e2529615eeac320c237869b36f37dfa5a8868a4bcb322508339d2ce7058cca5ac1e94b1e95ca4323233cb172d4c2b63fa758b535526d19c509ffdbd92ec2e69410318494d2593d33467207eb6e8e39b1fe716627da92c91c7b09195dc0770b689bca0a98587fc33cb40bd8661dbe3837763d7315b2d6f335f4d884470ff7d6129c18e74dee862a98283454f9e4d89007c2828c2d3884c3b52bf2e804baa17503d70223953b7861d0a0d72c1ebb9501c201420f340a78b1b68aeb66e539b58898621394738fd1018473c963bfe7825f1e913a44b55cf5465612a9d258d5cd29591484ba62422eea9f970f361cde3e649ab5090a1316917057dad594e0a57543821057ee1002f8d550c26e0e97f78dec1db91941d5d2013e381e682daa0335330616604cb6da4a15a2d77e744ad4414d7c5f037155b93a6a3306fd2c504a5c9e8d8f65bbe6aefd458a704a874cfc2cc1ab41d8a773e70b7fcd456c24c884d26dc55736f057a53bf5455dc51208d1fb15954b2e65a0d51d162aa34942d0766b3312b66041af55172c50af2171246069199604b9cf39e593d99eb988b246a855e587e0ca650c8bd2e30e6c7f783bb0cd0872a891edb8827a66206f15d19c451c242160d47cba635d9bd1d3d68a3440bd2b5adce050ff32493581b525d214520d4eb536db7eec01a270a335afb820114d7fa9f41b42dd941ba46ca71350d89fed39993268b20f85b8864c6c2c6fb0e05d2d5ce1075e5cae066f7ba8dcdb66a30b354e053d4519f6050ffc9e854c433870670201db90c0cd5b198f64868cefddb89902b86bafff3ed321d2d71b9857b92493c41d49a1ae52a4300832be89e7ac50dab724d85a81455a86f766f02c1e446296f9f38bed2e38245690a8238c43e03257439b0e28bd2fa83178e76846c650d8fffd4468b77494702168142379140de98e7bee33c761b31f534358e119344163ab680289da164d55e0e973e7e57e106b91b107795679c67d584c7d995f1c84ab1f7270dbea6e198dd67fcdeabbd543db4f60040697d8fdd964e72ee1504b64f12b73e6ea642d90eae2aa642a4bea8dd3fc8930c7c8cfc75eedeaf3aa7a5f39392f21feeade2eec35270d20fcabc09e942b12165587c0299052f0c58bec59e67e191246ff17a5d946a055725a823b2f74dc8513fc65f62da065d19287fbdacd73362a615d3231f8a75d3ae507b753400eccbdb295b92541c0ad0f51251bda24ff391c8ca0cc33b2c74be35d6335a7e5332d932668a1e5b9303787d9817035f5b5534745ecd05a98f0917366193eef3383c4d07d38f2414f685ea21675a67251589269839b1b41ba96b7d05ba2999e7c5ebae4fc1ee5d28b69b147d03ad615d21b306ceccfff6eb3dd453e63b34e47a18d5ebed058f499601a62986711a2ef179ccce6d88b1d8ec77af56a8124d9964911d866558c8b832fc9d1ca2665e4ea216b633b8e1b060d87d6ba1227a0d0414fd93ba375052d3b2f1bf83a41edcc9277134d12948704b80ddce24e3451c6f60fd02ab0b255b1c3d4105a213f567322236c0b86c1f18d8cf5a02a32d1a8ab4885831a2cc82c5e2252d3f33d9840e615463b28686ce94b35695641c0a68140df218d329db0f2ae5c99dc5cee30fa9f9c69fbf9149c40c5d04cb874c04428fa62798ad7395f11f6de676da3ef33a5510cd8882ff5e261aebe87bb09beeb55342de44f68669426c5836b99790a60cdb25e927469cd6071a9d7aa04d1b4f772734cd5ca952114feea23131a6cb998cb144ea96575653e294885e064be4a95ad38bf39a2fcc19f157cc0e075fa01f351a0bd3d2d3be22c08491b02f868481376e09c3d5446dd281634f06cd3fafd0a22b6486d6effafd3f2b8874fc852398897e7c5ed8c0810dfe6f77d87b5fba3bb73bd3afb49e9519b1e3f5375673b9b86e35e7be3b8ae96045e4ba13c0b5d04a3d4a93676f32f73e3f77ac17363a3ce21316aefe47aad10cbecea9ef326d0c2599fe91ad385a2bd2455dff29c91f0002658ac65f133dec72dac24f9eae4a924b13b0d18020641c22a906fc5a02d6cc3d4fded9da4981dc0b011ba8e6b2b70a0494372089dc0672c3aff983e55e3a887fc29c5efc1eba2118a1cfd1b47fedafc18da00b508ea8bbb67180c26eecf12817786327632856243bc7ee9f4696ae2af7288c1ec824f85db061a30dfc675bacd12ca2d8dd5ebac59c47c5fb2d2687d41320d399258936669733fd459c821e306ad5c6767fd9b760144597381a8c3b8b57bbc4b08c747b5da1a1f94ff31f342d0c3714827d108988122beadf9e732a0993bbc807ddc88ad3c70692567d756ec31ade8d0ac38ef713849525c099757ee88f64e9d74a8b79887f0b3cbd7a3841648afede9e10541db1836508bd94d3a98ca1a319db7369c96912d6fbc9615bc0ea377c748f5e34cc4385a852236ac81d0042716b798479120d0b55c9d85b63870662434f2bfb1cbc85b87a0476816e8875accf282e1b18d64eb83f8295fe78cf628c4859ac97b11b0944f3d16fc106da03ca0d2a60e4e67f2f098895b5afc58b8e246770d5586cff879578a11deb7317691b155bc068c448e55c53258a9734482142aaa44a7032e459a239109c3dea9c06cf617de7d422ecf726b028f7c153126ef09c287c4c407fa3d2f7138d00a59df7ea3d2a0612ba32354f532b10e248e54efee41078ecc345d227bbc459c43a9a478d8182954338bcd288b3749895901a51175535b4655f696b3322119080d4ad078b3b57c5c6ebd1d88fb190a4fcd49a97d0d413284bd9c449b132e925bb6defea7e346ec86ce2639ae6b5d328d7cd7880b7f483982ac5435a0d618413a04f38e7daee1400c0139ea8c597894a00aab0b742efa48bdbb5b1db73fac462caa1fb1dc20475eda08b51d3444b194a00d596a9baed4b23da65498ea693e19f2d4a3803759a2a2569640e7a50d1d3afd8ce264b2179946ed3df0a9dd820d4758a9c55649e59166df6fad48a56344e07ea9bbd91ac65bb22f21962100a85f358e5b0527b6360c06ec5ba3a1aa59243aeb2dc87220da11126d13e32102620e68cc13b0543ef7a5f7b9a2eeb3c0f1ebf4aa9de67129409b222c063bb0aa75f680570e2c6403396f3625e884d7729fa571c5c04e95161d6a4031a79362cede72fd6677b430b22421a4efda0e054bfd8ce67f6b70993c6c4a4d1e4a35bf6c686e57c997900aac56cbfd7090b02115c4f7ceea36f66b25e353dfb6abf84f2f58b3d8e84dfac5b6bafc15b3197652235bf77210a936d6b8e08700c170d99d378e6b4205420c6793201abda82cfe58cb18f14b986612c24c5224780fc7f444bbd737b3a4f3f7eda2a798ea48095f0ab4333279143838324cbb77ad4a0d795cc685104e5a771e0318145a738f720932913465f34b2e18a1963eb3b9a75d4b34e45780a723ac2befd5be07d050660af76c6b546399b6eb7a927059618d8b14a87b265c45473a6c3ae2362ad6e75aed99f7738234fd341c19ce26475e4829a583c0b93c659f4eb24ad0aec013eebb4333da52debddb36bdd51f0c8107ace1218231e59d8ae3d0fc4640c5966ef5a997390230f66b170781173cda9a26d651af7dc5703fbf7fd8a710cbc261d9b4a4e487a1aad7cbbb9a813d4ce857fd4dc50c90c0c329b37e06b3910452946e177451f1194360a6a8ebbba2e4bd47f22caa67a5e82e09d9ce904792378e023c1a022a6ead495c40cc424a07c393d125f631e9844dd5c1516d7348c7615b4485e33e146a9daf801b83446690df35367ee623b3025de4ac3bc07e9d7ba2ee8852bc583a84c9657eec4a4df698266653f26e60bfadb64f089184ecbdf7965b4a29654a0165045c0457042830466e59c3de9b1f527e9d43422264ff1ffe767b11b283a1cc951baa2f3d6539395ddc6fa7130ea3cf149e6fc3a0c8fdf6b4fbf1e3470d43f0907e5074c917214f309459e68cbef5b79ec435a7d7238c1d695cee43ed6bc5a117650e571c66b8d6b0caea1d6cf32b0e7d629eeded5320fff9f3ddebe1461cc7fc8a67a87a6a4faed9c34e154ed93a535dc5a173f32d47390e9ccf8133cf4dfa05d953ef4ff42f587f70efbed9ecaddb0dbbe6736fb39b8ac2619b9923dcd0df777646b8413273d835ad530f88f33048f2647f7a6a9f3af7db09eb34dd2099fdc32099b9a7afbd477fc3619bd9e1efe27a74d9df8f380ec7a1f63f2a0879d23c6706e272c57ec42fa043f456e11a03550bdd40ddf27b8c1bbd2a892a49eb61dc55d7681e1f9a4c114205430e3e201951b1d0c3142427b839c1ce155090e794285fab1571e8730a0a397e8f0c27393ee75feee14b0f5b3e12a4943247a55fe553797de40bf18faf42e24629e57c2153c6223d20e5f04a29e2bff4e0274286327d00f8d247fa10f9cc5721713da6232682a8523464488ece71e4a22f84620d5490fd9d0de7918b600ff9711274cd3b9f7af2a363577c8a792406726f8329250fd00f6509f6882ef9aef9d18b2f6fe2093ad59049e79c73424993e79c134a99c84413292c582933a0905529276c523aa0f1c0e6f230c58907321d142d76698725285aa88892be136aadb5f210030f0f3e9cc00516d3630546131c0acba1944619a222b283165e6c072622aa21505cc83ab96350a0e4f05bdd910a05282b4041a21a6176505480622487dfa22a12c24f7ecfb7665c7b67772778696f9bfd9fb8691bd82f6448475319a994760a199aafbd7f6fd8daededf6767b6bb7b74e3fdbecffc80d9c3348965df36916d21732344122921c71f1f324c78e3d9992a318550937eca50bfc7f274d15915b3588ac146ef81fe57f4b8f3d9115b32a851bff9b52541d686a6a6afa420dd771dbbac64f5a43cb9ea5c9f95c7b05d9e270660d6795469f149bebd9941737b671d254040b27685cc0c289d20b584c275728a593162112ad24bded1c987228610b4a295da2c3902229260a72c79cd0e0c4851cdea733224bd29416b74189c32efb9ceda913dcfed9dddded6bb2487de150c4efe8fa39e39a35ad3569ac9c5df477cfcf70312744624db8b8c2455ae5d7fa4399a35e07dee417c49fb1731c5cd659daa5a8b833879de748fb86fd08b2c2fa997cfad3e3014248f374d5a76067eb01cd6c5f4e97274a7110992dae1e507d797be0ba69501addb171c4eed81dbb6882fe8c354193e77c6eba07d4ef3b3a4dd3e3417fbef480e4cf28f1c51da5c716a4941ea5a42ea594524e59c27469c6cc34e3b39154dadd2dbbcd7477d39ededd3ed17093d6cc6ad68d9862922c5a9a5126ad99cd64d1d2a435abb268d24acbb411d394d1ddcb7477db2cdca435b39a05c35ef2a224a668a43469cd6c96c4148d26ad590dc35ef2a224a6492b4d9a747ad194ad5e8a1f630a097fabd45a8294c32f934989b91d5b4226b6644b0c87229490492d713bb6a4490c0732b1254631254b1f9e0d51eaf876034239c3a1fc0f6cd811945943f2ac71e394600c55951bbe1219c71d38b35c0eeeb35a1bf8c1e17e90a4818eee6de40eec5ac983cfdeef7b7aaf86c3effb6765daca1b883678a89470817992b620be8acbbd8959eef77ddf98d89536797ead9f3d50dff0ecf533d720fe9cfa86f70d0fb39734e68fb741106f9a4ebf3e77035a6f1523d2a868327d1e1ef6ebe33c5d7d0543fb61fd53f6f673dec8105ce4acabde06abb7e0fd18a8af2fed6b1fbd1eb407f71687435d8fe7e918caaa8fc17db53f41ef27c8b3fa9befbcfd4fc4f91c30ac2f7f037978708ff3dce3609ed5f3f0b879ef6fde7b2f8791ee0384f6e5a7740c6515b62e14fe13e8c21dae5ddf10e2997e67ade720de24352dfba09ab50c683d2c605fcb6c3639f8714f47fdf9f3e78c6e0bc253de0008252d09a83f7dbcc95ff8d36eb3fe09d469baa7efe609f5ed9d50f444e9897e5be0dfa9906e68c1de32b53d5956af609d529e5c56617f6a5c67b570cee99476d26c00e7d188d895fba8ccdba4941287994ed345bdf6d2db80f3ce43dd89c2419247a3da3a8d43289750586badb599fdcc5a0cf480dc6b9f815a4fce3ad3a8a669b5d68a6d90ce38b06ef3ed5310033dd995d59839bcdb72bb5c8f7c5f0dd67e3d3d4ae6ec9940a76eb395840c68c6c1c5ac7091b3dc312b59c4ac0c61a4632ce2ba67c6ac28d9a943cc4a92abb0dcf873ce568c5929ca1d1342494640ee58153699a33662b91d591e6633b2326c69b8f329b62a2b376c0f7cfc701c9ee9a3a0b83177ac0a539e1f252ac175ec8e1ee555c29ffbe19a0c8a45f6c70f0dbc31222bb26e3c70dbb69909fcf02312bc499226f8e10b1f927e48f343955c65290831997ef77069a49472e2569e3874ec99b7237bf9dd79ce3593c98210e040465b103db832dc0b588b66469ffeb0b5c422f34a36a63472c206901e0a85b74b29a5f418a350cdf059f9846a862019249f08a26ed43d13d7d33752dfff8341ee0c5e6ea70d8c1fff07cfce2739aed334ad035d5b5b4deb3a9d77cd6257677d931687314a504a29a587fdb5507e0864869438a375484852c7f38b1cd6075d392f4296602833fde801c9acd1a61fce3639ac41640fed6fb2af6150fca0283f27e730e5ea63966e1348f8f7960f5ad9431b9ebd67ee9ff39e246bfce56ccb1a9ec460a88335bcd928d2799e9def7b1838074ffa128740f4658f99c671c877ac4919ee7cfd7032e5cc253fe7515e8f2e539afd07f375300a7b18060eaffc7091fc76308afe49c3de7b4e2f7d0eeb602aff8381511e35ca5c47f3563b291f9452e6c899660795ff2371c0d4df80d90a3cbd83f582218ce945b3a76fd86c73106fcaa9b761a399421bde64aee9689187ad29b286b18b7ef7da8773ae711cf4267d5b3ee2ea386c6117fdecfdbb0e72e71fdacfbefe07de04c664ba776a5f81ccc8dd874066e4fba80f5b39eb3ef43e9c9fb7a37bd7c561a7d33efe33f4313e17c88cac3d0a87ad5ce71ac7d1e150089e6bea64ca5b86e71abfa0e2493f7f1dc4e42ed74f429281ca1499ca142a2850292273d99f0b5592cc9429a36529b60519d762050d0e2c24e102d3e4410b131226625b92e49a3bb64585314b2cd16a29b59c9a218a25652d772c96060b115fb22ca9c410b144e408234c30c20667f9cbd7dafb080a1df9d8342dbef62beca37b89859c8bf8de1d22f32d96cf7111c6e7e03c8cc779a1231f37ee3fdf87ff9cefbfc23ebe0f7b80858e7ce4bc63a196f4c93ee761e09cec1db7f4c169dd60db3d070a1df970fbdafbb0af61a1a3d50b6d6f7f857d78df61212f923ed97befef78c3421f489fece36b1a8e58c8355c14dfb150c44243848e7c6cef58c80242dce95149a716ea3b472fa59a29675e64858e7c687fb190e7d0de7b1418c216c2918f0dbb910c61fb9d211ed6b047913e3b44361c82d051043a07fdfa9dc3e6083d4adee27b11628a60ca2f01cf417378d236e43383a20aa30a93252987339605c9e68e658912cba23453e03a72283499f61788f1e7e9b94ebe7fdb6ac19b4a3510c8976bcc66ad7493f18be5de6a6fbffb3046fedc2de3bbdd6d4f13859252ca1398d5acd1ece97060fd9d4ce38262068a5ae4e14d4d4d4d313a5082df81317359d7811ec4bddd8d91a57c206ed8656935296316ab969c90c3614fe6be7ed9dacfb14fe9af70f899763f1aac5ef5ab70f5f46d743938b4da4d4e0e0ea21984a6a626a50ca495bbee069c7905769feafe825ff727b0b3a0ed2eee6417b7bd376fa7b2bd834a6296be87f3e65e6e1cde400cb472e841766defcade6e9bffad91625df0035546dc78a54ffcc8c5aeffb47d167ef9660e6f6e5b5e9c5038f9dc8e6ac9e540d6b832ab216bcace9b78cfa1be3f954aa552a97b6f77efbda9efdc5329f0f4a8d49fb8dbdd37f5273f9dbe53a7f7d4fbd30af67c0abc388c71f109d5f57738bcdfa5663823dfe762e781e190f7a9ee51ff13f38df984e71ace3f37125f35c4edc71c60c75b3eabbadc28147de247a2173e68d9c872db1624dde64ef8d145d97f544a2b9d5e3427753a6713d264cad44875e54e26a7af18105b62484f664ca69926c7b92696c52886a585c934992816a29cfdfcec2bd71cfce4c6426490ecb52015989b0716e8b01a7825efe4211a328d82fa0b19cab6a5a7c3df664f31f781f4618012bc1193b3e7e1213ffb9dcf36d0790af6e3b405af3dca26b5c9d9d3a42932f752e72598f3143c5599bd94f8d471de8eec6fde82379f025d5cc83dea55208fce7786f17d75fe933b3bcffd0ee6d1c13c3cbebffffdfd4bbffecadba17a18a0ea73c0d07bfb38a02bf59dddeb913dc521f75605f6802efb17a340edebc0ec2de609e24d9c2635a62cade64b59e220de245fb3f2014357ec675e07f3331df3b3976058b124c9fefddd3268386528c4a3a33fffc4d8cdea293f25372adccd4d18a432bada875dd676544cbac88048b9e85d87792410dffb08c4f7f0100786ae3dd5bec964596f22161ce7fdacb3d6ece6fb687d769c119c4134c7f719a401317ac7906594e2ffbcf6d4a281a538c3149c764a066c2f254737a9a2e2ae799c5a3655b11b44b3f69926c39fbefc6f81377e375cffae8f2d567de0760e45aa50f2441bdfc1e80bac09d659bc8078390f2d660b187c70218623d816580fce022a025e699a8061f01a418b2260ad170db07fa980c3eb0358c06a801901f35eab576ba9a0bb38033be173325c600d78b5f082a2c1b4790186044c0a58005e41c0dc03f5d54a2c0163c28a241805f7a58363e92d4ea44fe02c78970e810926d00a10040d599098c10a2052c8420929301896384111484dac9481ad81edc0b04105ec0212600778a981692f2925c051029813b021ba97cff09a8d2609987b51f4ea2e555e36446902760616451230a6540f309d97131815300164f06a2f8678b3214209356848a0a4e80c931ad86759966545322c7296c490d79cdff87fe830303530229883498225e009931bc694c0480a5dd67c4102031730196052c04eaf0294812941c3b918c0abd93c811d09f3056c890d6cc68b8ae7d04b5fc0fc0a7e351364605dc07a0b226028fbba0106be963408d4bc8ac8e0c551180196d6a29fe0e244a4d0567816aea5a3e82a5c8c1be9a65ee35e90c0fa882960ac570930ff01e668b2a11f9ab821071d40c084929a34598ec0629fc12245d1995811138eb82289a6a218b2c06ebc9c78f51550b852c7606370b8e0745955595561d226872d196dc68a8e3129caf1675891bb8a3f8b5ae1ca77f7f914a7d05cff785d521d6126aadb574382b82ee73711638c1d1d04dded0f4276d0da3c2b8d351823a5547e1febda6f65746954c311e0f6e40670bfe81eb100ae2b80ebb93debacab1a6e002e8500ee660371c12e381d9ebf82db9302007097e8c833e05050a49432066b8574bf18dfc3e2b926e07674624ca90dea4e9abd69c4897922ee4cb39b10698c1b59546e7873a5b456e969b8eea941d41103e9d269fd90524a57425c29a3ff4a882ba5940ea4cb5102f1f5c088b1bf2fc707877367e0dcb130557253c0750b11591d664af6bc8261f5c20ddf86cf2f79467614629491c60d6d9e33da4843e2589827b9f33c0d499f801359f6f487bebebb6719a59f45faf2ebd3768f79a87a8481d229e9b7a493cef8f2ad836df1cde5c9f0c7923e94decce8845b5da2a3491f731d1930515175a508ee0ee0acfd550d3775b3273aa2b77b7a228b7e8cc85a21ddf09b34e27b3b9801cf7332a9ff13a59c111549e074783ef11820774ca9a76636e68aadaae9b666d8c880a31533a1157b9727e28f257db25fd970ef4d27c51db88ebb3db7eed62ed111c5257c8e2f62207f82373fdc9845b66cd97ec114b9634a620c9077c42c23b2e4b3224bfe6a841bb26454ce2b183113af31252e72043ba6a424b74727b63736e17478ce6e679c0ecff54a9c1b534a923b7644923c23772ccc133908bdfdc3cd4b7424898e3c7e2c0c0a3928e6205916228393f1f677e5fc121dc52fe1731cc9ffb8be4447fd25fc6928c7a18c3d66c79347d43194e7cbf81e0f0a60907efcea6d705fa82b8122a531bab4a46c64753f572edcf82e4ee545771f604c0ccc171187fc459683a83017cc961c763982a192fd2f8e31ca190343260606cd778c014919253b8440071d56405a01f665842f6dbe1cd9c248962c88880163440e4854c01021d1e21341ae67dab06133c4c20c4aa8f0c408871c907c105304e5a50cca4be6925c08810f5f88c0982c71c414274e4eb246258b91942f5e8a723d82a58af602bba20612b82059a2a487335e46c8d245082e485421a5cb17234bb12e5974b9c2a76baaa8702f52cc240e7c63e1401451c4b834896da9a27a820b12112754b9635caee4993bc62592f7a8842dd765b5748a660400401000e314000018100c8784028140281cd05559f91400098594406a4498c923811c06410cc2300cc4300800200080000883000628a48cf71c212744258462107f880b3d2486901f88150b8f357765493dbfde86f151f1da094a12c3c3ec7cfab10dbe3a993b1a9e2bb4d91e1683f0435c865004f1839845888b054f7d75a5def0acb59907c41fdeadf9703a44615e139ac54b4fbefb5d0829e43c49d22c46781cae2284e7209285d6e35fcda2c9932aa7e76c4f9c9b4549cf97db0c410f813844f9202e163c6976c72af1d817d773d363eacd22eb49d316c589a7371bc6c3ee0f470421c51f4fb683fa70f5e1a04094b5eb8964b348ef1970afe363962c57411194879d13f1811fc42f215620f08497633cb3272ad77386e7a9c9f463815787268b8607d7dd85ace764a3290f2afa3dd96e4541fc7ce119e73820de02a22c22cfaf36cc0f16769e3347ca077f3e287b58cc07fe0f162db587971e4485e8404c7b28338c9a0761c26e18b28d5eae01711f4211c40fc405441687b8f0f3748b8322da736b453cf87f5adba42054b4f6846b1d88538650a1e8992fcd82e9b1aa2e4fac674f9b05898717c780a07bd0c28f14ede56290c1632be77396c7e4487bf89f524171926b8585b0605b5090c02bc1db8e4144dcf7696980b838dbe3a45584f0fcc72724f71f7c24cf278d2284e13f5244760aa888e8f170972108077151e3492f67d6664f95430c883c153dbd5cc3c3e9215428f6cc77b360f45895631ccbb36707c5694faf86e9a1741f8bcc4eed24521ede340608fa87c5bab93f54253de5c2d824b83c92db4db41779c286f8ed27ba03f8567715ba8e25107edcd83a1c2ca8963977e0bc40d6dd00091553956625db877ecc18843164819d51951c3e4fdd9eab562c1a8b746e613dcfdd24ca7ef84af4dea201c2e8ce6367f7164893a4ddc135dfd4e6b609af5bb1e1d915c778ac07cc5dcf538fbdb6141b9e6b4db2106521f678394d0f753e48b107157f8f769ba621ce6af580ef38105411424f82e737370c089ff73d666e16939e5e6ef30f3b1fa638c4c5bf279b2d520f2aae3de268da01b1e2d26366575629cf77ad9820f0bcf3346b28f560f1df036c4768544fd89ac5b827a8dbfcc3ee3eb1a629821c2e69aa7e962ab999cf2070d6d46d40060f7f0e94f9b0fa7753d845f8f015c21ea2280fff3d548220fee12f04650f88fef0efe1720f8a7bf8efe1b287c47bf0f770b907288658f1d7d3b2510a84cf164fc26f163b1e16572875c15208d618a18eea90c836988762c3bc75b0367b6846b54f5179e8ee68219fada7f9c57bb60f66e29b8a6769182fd435b5720bd2319f81117f7651ecf244ab5944f7dcdc1b7fcc12b4e3269be9b156c34020ee837f0fb2f017c6657c576356132f51b084b4ff95185f11c86f053d4c0d85adc42a0ae75f4ebaa1e2ee79de977a5703dcf070103f8a4124fb2efd3f5dddfedf4eda61d18ad7c6865ae005eb55b0636ea42be568a0bd793972044c6a42a050fec6214e238f20f8bf61601b17368807295f7311e1eae2ae67a354ba87b4436c9651d59b7a53dbdaafea74fd4eea1d2e69b5f06a65496280060589538e988d46a1b44887d44c6884515c32f48e2c6839796f08404b3a1aeaf5d951bf80eaa0e63b0ffb7e1f2442f81d5890024004faab2da27a31667aadee075354c938f2ab7a13d58e2c4ecee9542cf12444eb74d9c58ee4f72994d8c74979ad2dd74c310d176eba92d81164dd840819bc654f6fae47b82de618b86470165c2f08cbc066d199bb668f552d1d1f677c01b2be74fb2351a8b771a59d1c2f5d8434d30be140f39c8bbe74175d7e655ec0d40555a7e729dcf830612c4e7c6c0a93ce20d84fb187f5e5bceb871613b9882afd784cf819b84fa5134e6f53a44d1d437ce7c0238e6650adedb005a78fae806d490f5f2ebbb09263972c268351b15a0ca8134d13cedc938041d9320c488bf86955121b8f94efa6a9fce5ceb6dba5d082421a60a9f14ff668d0203ee3102f899a04a833f63b90d70e7a19b8076c3709bc576eebe5328906602b8494fb1c85f32aeba24b82a1ef1b6d4b19040b0e9b9042d1fa4499cd71041d5db91e31714d9864f696ed8276aa6c2a3a21ee8f46c50e08932ce156728a569c7a513df37e18beb26024e33f26e2681f78b0f2a740759ccf3d1c49151ae1857f306b3065ad0be7084c32efb9d05c380616b5b283855d84301a6b2849801340eccb71d66a53b7da0fc449d7bec2682cbd9e3d0db4a8b4b8b9de1ada57558c98af6a0acd2b839d6b339d9d572608477b12f642b8e4408fe972a83da9db1dbfd0c74b7fdcdae52db62735d80a392a21bd8231342f59f48dbd603e02f0876a3c218f23f9f20a20d886f82d1bd8c898b05145d1f289ce78568af2cd5e6b98a0144b4cb32a21fd499a8446259dd3c59bea94501b699fb97530c5c7f01921c473c69f4d8cb66768ac3824c3fcf6de699346864535996366c0a70258976272e81c2e8726db75b75f1126c34ec42c6c07b91cbbb8884c5de65517bc0f0d7122f273a410a9102bb0474080671ec3936260c3c800d9edd1c5f97c0a45e1249afc0a744a340125f1755129dad5dfcbbcfaf6d40b64406b9d4cf17a037b0cbf3c638b53345a2a0f68e256e050229e0247b1722813cfdc4cbd24cfa4804e367ee812ff2f297c0d4f71925bbd29834c5b862fd30d9f66cc73bb55bff099eec26107d6e538f9502aa3abecb5fb09b2b627068f8a366f65576434087fb209805f1dea862704edc7658a102d233555b747531249bf3f9bd4b80761a183fc217f5088712bddbd4f3136693900d0413edf98d628883161781c6e4f7fe7dfdc726888548d8a140eddce8004551e0688da28caf14ea9ffbf11efa3d0b29f05d9f95b14dfe23bb82d50a8932789ff359a8814b140276e5fd51240e87045f21912cca4dff67c55cfaa40b36b4ab1c88fa03008c39f06cc4cc83253ee14d4533b12e124876c736294ea57aaff4a782ea1cec160d682791fd4d97acf72b38ffd01a98140c1f925d3b87d20059815fdedb86a0a8d450ba15b0510f4a2d38fe814e010711c4082f7573a8b9c0493566303ff1cd8cd477a0cfa4610e2dcdbb419256fb1d5fefbdced9df5243037f72aba9d8a6270b00ac280e503f6f1c71074c62c6363fb61b423b2a97ffbf39c72df2ae9d4229ca3707c8d4c57509314fa050c9805a6a4365d51aac09d15f7944f5083bf955005b20790731ec7f8cd1d0331760afd757b1860411d1f4da115e36be6f91bce11737ca28680afa0f3cb9e14538883557019ed862d41577cf2769411c0e8c692c8aadde3bcbf72d2160f909c46ae0cb1c1b78cc9a1630fd88c3cd0191400cb62c0806b2fffca459dccedc109a44e47c9700b3706b0f1e24e1d05307a5677ccff93fe31dbfb91cd92f9648b75dd1395877422f19709cb7323a73e50e0aecec906837ed2522bf8161d7f3949fbfe1f9cd797255eabc885b8b4e5b79bc3b77bc5538831efc4e46dde615db53da515a7bd138fc684c7d11f4b80d101a5c883b639d7dd7fc95f0e37c9a618727648b5c999fe5dd3d7f3d29aa016ca3178a7bbc0816668b4d53c722f5d0517b442f981bea8a8550c97e2af464d297f0611247455d8549035e9ca5e143e3ec9e02bebb0a8d53490f08f92f2d5242cd6b3a930a85266b7e6e32a57fe9b58aab7ad082b831b74b4800ecb491bb9516cbb1c31beeb79eb32cf82730bc425be29af72aa5ddf8350ff53eae88bba283e5571ea23d297a46cf66b9ea65c05d4934d5337ede8e2b7c14f1525fb13fe388fff291a518274a3f4d38a02a126a9337fe12e7a60ae086344b943b2aed4f863a5f9414a35a13f710381c9edbb03f4ad4bc2607f512e45bb8161ef9e7037a2bee030684ef2091d28efb656abbfce618b755c254cc4431cc65d9c8b1d2bf9ff926e98800939ced13cae43e6c8e67ee5a3394fb5001678c3968c3c4bf202c76c283a1a8bb802fd883fa7b49a08c438f10de1c1a6f1e3fe944a742eaaced14241df45b2ba47f9981c1448c0fa3b53f6e4ed6afe5f090bc395063f4809d662a6bb22ec932cb6bde04cd57634fe3eb36b88fd4e74498d2683a2d2e051fdfa0b26929c62d570722ec70fec07ddc0539ef2aaae03b9100f5865da8c8856e7d6e975cc20280f394f8f9165bed4009f99d32398a34d888b18f5b3582a0a4b2f3e0b84ab43143a0a4d122a2dc8e5ccca6874e397a393d6356f144a9c837b3c361da9901e10a7863788e750ac1e86817432babe3f415024ff58c8c7eea60f8eae358cb42f1f68e7fe36d017e3cf4fa063a2e0bb9d54b2ef6b0b4b871202c85ca7484cb65d60856228656a2542f7e233e17c403aec6f68b00946dff33b3c979002114a8f9c8fecc88d5df232d766c335a8242b8c60c6fd7570a52d3021b8f1042d838239ee8a89e10eeaf88669b096a985b830ece88c5fec795c8a08dc4ffd7d7ab72feb68c8193e3e45a376c8e966ce9902c507cb19d80054ef99cc177fbf8f358a42d13f46028b9169b24f2934d1c1a82fa705513a3141e0b1a3bec26f2b8b9fdd1169c1adb1cf4f4f348dab94b4911c517a05eee64505e1a84c290b9a2ee03f48a9f50f94223c33cb18d7fa49642e6e09a764231a6678393bf27279cab9ae9d407766570b30466f80be8a26e8d3445dc6fac0c269e6ac056489dc53afdc74350217089564cb7560d1734554759f684296e1a96f53097762d7072a16f006ce6a663e15ddd3031752beccdd229a135992ce4d8feaf7c200e8fa45e21c6e8790a7c22a5374d465561ed53dd17454d3a836ce036e147ec676c011a1fb6d8edfa4e7e898e72a7d65d33bb8e66c455505a88106c61ef57a3f5b066141741a31ce1e9eacb81d364a159790f70d2b5663a6595519955e00c6048320c7cc3ad054b6c70b2c67eb7d42367694e06b7fc86cdad8db829f08e7c45a5d5269b220cab1cb379f44339c59ccad961a61d08c9036910b3afe34b5154e3affa6ae2084a08a7633479a929501f8278f70c19fe214bc0195798d2b985c73d0d8a018416bdc39f6e6d4fab45787f29c0015a619584c95c62fc2980a9c72382c6b0144081e9e6006c2edeeb16c45e7a4fc3fa191a0035171fafd2f493cc552b8d38a4d62e28f211ed2e941f5a13c83d0d73f6169245aa6d2c07b26ec2a54df07d17d0f644500042a808d1f92b6c6de21f6c7096f89a775f518127409e36b2b46bfa9dd1215417b6b65d4185a357037871d7a6645bf3e22507888c606325c04ad19fa21edfd24d6e5b01e2c4106bcdf9602e21aad27c8c91b225baa04772e24542594d14071c4226682917363c69817f861bc5fb4a0d41c3aef1acb5fd2d75c28405a72f2251654169ae9fd61a90cd989eaec6cfbd06af5ee3d2cee6d952b66c10c644b251bd8ea46bb596d8139d21cf2235ed7c0c09b543b21fa7743463e40bf0ed0c65bf10a66f725741dcc8cdd10492f6fbb958fc643825367c01538314199c1b88cd8b98a2adedd70990023800925a010dc59396582e877e85917898f454d344457b0eec548be6bfcd04820d070e5cc056498b30537553d9719a0a238615cac01bdc18f11959e33c806472670a8a8fb14bee2f0f3d65b78d63096555889feb9b9ab252db05249fc4147642b1e3ed896156cb218142a4c927c4b38a54f652f406db3426b76350ddc7a9bccd1f01abf5a67e91c3caddacc07d621c05a01839396beb951eee6f6a048342bc7f2db40535dcb1ccda87a87fabbe0c14ca238e85aa0b3425fd5bc9e915367167c858e4a4bda3dc83440e42f6307a5af776a0c6aed27db4401657ac27b4cb49355438474f0435e10dfac936c57c536bf4524d3f8e22e84c9883b33081c21a7e06b818db0214c26e69ff41b7ac58cd69de82f965fd391acfe1ab1b9fae741246ad9fc43576463f98b2846c50dc5059515e6494148a0299b4db34a47da0588e5a23036efb6c4d88616d8ee82451a0478d5e6b3e82a48743094271605bfeea0b6a1cd30b5b40f833680365f8c0cb125f34160285dfe042d8463ba92cf248add1c86203bf1556c45c9db5600a015dd605b48b76a532aa618a0acb0dfd8b25bc675f22fc592bf0683fce891765b9225cb148e5fbcd7b2f19750a4fc2f88b8d708c211559f205ddec161b8f8365c43616d1c5f1b79dd7cda873e5e0d4e214b7b6f72235ef93dda3318827dda633b7b4f47a2ab9985a1168cea7c608c9039d2236e01ffba221b784c4697291c4646ce7701c4e827b7e35fdc234f4d101d43dfa7bf54ce5d9db496d3db8815cfeee254bca13e2bb26f6d811fe062f05dafedd702a85d4dc194a22125a20996a7906ed7097c214671a513e6d88a258f0fadf4a6698399ec1898d4c20466eb3288675d36851e59bda2690dead20baa61bb74b15a0491fac669009b2e089e81a2da8469f4096cf698c1a397a8439b6bd5d0947fc4f5cc81630a51191a2f3877535f56494cfb6f0ebe24921f57a4f2c4a459f76a810b5b4ca5aef20c69714ab39e1d0d4443b217d5a701c117c75ce1ff07559a23ee7765534c84c2cd6992d28b04502fab15b00e354200369fd0af0f7c88c53c972d17349d9bff4c2bb975194d11ee107f58a968d7aa5eddce416d238f35b9b338a12334109941200ac8388b4a0c07d8b8de91ba9498b4bf0b9af5c754eb45b675df116ff98ca6d911a127c1478618cf9361395f8532d77d4f0b83b3f101a17aaa241c31941fdfcaf070ca57805901bf2cdecc970598d724f955fc4d062a5c0f4e0f680603acf22cbdd52af4894a2fb62df00b62931475fc2511c36bcc3a1db203a407420310c7960a201b6009a2f1a18a940d3321e862aded8f23ecff0452df00f6d4d66366696882fb354baef7da03aa2b3c579a98700adb66925792f16e6eb8656c18d220f2682b3da1c6dfeee0932137cdff9300cd03300b229994777361542c24dac5ab90c8def7de51e13336832468ac5df848a37f616050db561622a8e4c4cc1a2eab47a5a42d997656149c87eea587b540e79276844a8cd80d2c8386c5c8ef6214f5d46c49293e7b744f74f4a76aa562e35289604518214a219f353176ef2bb190709fb4a7900cab9a9ff55e6c2bc3eb40e5a98dc5c8393084a8ac01f1be9422c2fd24f6d02f144aad219d390f9a8913335d671f361e6de264fb30833b3f6b743f4d5c79a42cca13cd6712f3f03c5c47cae9def5c1989e298cd8d703b8ccaac03fa5251ae8edaf3dde847327de5d2a86e5bbc1976b8bcf949ce3fe25001cb15fd0591dbfc01af6e69bb1950d55331edb3da851d1115dc11a06eb8b6d388164f878cd2e194584137179a8620c8a1989a07d8faaee65fce999bc662c05615d44a14b20d37f9d09e098b5609457f24cfe0bf91c19a25d37564a9b5e2fa668eb388c1a35472106a5a235a6d0c1962cdaec041d34a5001b0586d4e2021c546cc7b199d18225f8d810d4a75db55259b9832db1abffbd8dcd17a656f2a7d402250f47b2eac647fcd3d4599c69d3c27324b28e690cc6239b3fe4aa051b08979c8d566c2107b5aff9a65239ccf9a49cd2d1f97560e38244054f8291a9593df875a7b218e51576ec5df2791c08ea06410cf5e882c6dc739d8d8d7b7442ca417452d12e8e0fa74a738855cc8c0be528bb95dc3a30641ac02754808d0148d5c3bf7abada96c4292cd24b41b9ab4c3383d2445628808b37b0a8bf1a99840233a733138d93d2a15d34e838853c1fe863b20c60eed89ded1f4d2c73eff8e2889ba705b9302ce21418ad0a981f52174e92a4dc2e621bbc6909649e2633729d83a02732bf73ca7021d458f877317189aaee95b40075df9cd6d155b495d2d5b1483fabccb82433c342fe745638afe71b890d36475a1111a29a80821f9032e3a42a2011a06801b9714452165f2413798962154f63c57fd811c6ffc7f23114561029972e0fb123a23bb5ca5a5a971b94c738379f52c831a30dc7c55502c01fc3bb75b1e99aadcaec7d46dd3ae28c684d00336599e9e999405202071377dc7acfedc41d52a940e8932761827cc47c2657448c1d36680e4c09fce546b89d33c3acdf68fbf14f4f4167e90a85dd79be6bc0f467217f04844093847012b3fb5639c031570f8a5d6904e0c9ca6a6d5a478032655e7996b34459a013b0bb0a153f8e84eb158d4c823b6cc686597f8c02db635ab5c34d09fddb6ce289054944f4d877c1f111f005752f448e575a00396d012ae908321dc75bb8b64770a71b5ef9da5334d44559315eb976287afeb8590bd6e755fcfa9db24562ec23a99e45a305bd0c34d102ea836d580c8a5b916dacf3d887a212375a8221a57e2922c96be982be3cd0af2495e0de0b7b1f2d5c81c1e96528cd1254902915b2185abc2d61e1c5e5047a93ba39f8975a31170f11ad4cadcd0c4643c5cc67cf75aaf6295fb344a12de4f2ee32c225242b70cdb75fffbe339ffe7b8a189b57edd2478cc8b1eb46a7b6555a72dabbf2d3feec19f08395e49e95aa8282dd38b7fbf097edadce1aabe371e2a054918831c5bc10ec2ed0e3588328e1924d8ff1480fef369567a52c11a7d02acfc19d2adfac3af39e07d517b04e5090fdcf0ce1a2c73a5d3c012ac6e02b8602b162c23eb4459580d9aa7574a9aed4157df359911c2918df430988e042ce86bf9476cfe98d193f971264a580531a1c21ce3f4c276dc02fe0750a669c67ce09e9882cf0814bca45834ead02d7df627fbbc02d0d56f55b80869cdd3202449ec93af0e27ea50f7e3469f0253b4b0c2c4126156b22af84fdf527462eacae850eb1d1adbd0ab61bb8e348c991ebf1797d566440578d0ba36c5da86a6ccef7d4e1e57ef2b09bdbe4d53b475e5c224d00df9dd99381e168a266eba28edb45b8824353010c845f8e370618c8b22027072c7e7f2fb0292163b2f1a814751d947cec9954465214564747c68e8af4cf290343ab814186722eedf9897b360de5cb70b675982be4b8fcd6d83cae5994f34f82857c843da381fb6793b9f80dc2b4077b29d8e4d4b98bbae98a504d85c1c365033b4e4ac97492788f7f2667fbe2a5b8bed2c5ac7d8019460c9f49f345d8a77a04fb7f8cdc2eb3b684ce800a7571bb1fc17d42571447f488ebfc63ad29112c86290b9f0372883ffed61078286d17719f7c7fb8f728299fff3b8ba3b63ad33f14f9478b2c38c18781bec62fb2218d589b1022ed69d70a183560ecc1e85a5e9ad38c82e58b49af1feb01e1bcc9d828af7402d3f88e7e213aded919c9a56618a226546556eb72e2bf5b01369192ec428a1ace4cd814a0d7ae2bd790ea831b5143f1909249124f72129e86a65e1229bdc211f5208e28debdce2a63c6c572bfdd2d717649e4ef574d30b0cd326df3d03502cbfe7f873384b1c70a0ef847582c257c0eec063383540be75b56de3af333e6c95ab576221209a2e8e2462f1766f86677474409be604a4121b8e749f5e8b9b91094727230d87b01ebecc5be86623399c11c3dd79fee4f52ede77911e41c19bac5ea75d8302d373450e1810ff752f97ea5d8497eb1fd24bf0b6e4980d60f41adb385b463894efcab6e3574d1a851f05d61f75c55add0e797fbae56f8c91b96ee9792925db623cd6afc30f6b0c27676019f3a19a4afbaa673e040f85f06df321b309f377c0b12cd12dc466002a836eaec499037be957e051259db2670888fde752920f3ea3c69d43bbe890e9f1f82f1238c677925a09edaadeabd60ac7c3d87a9e748b8176284eff7e5d270ffe421dba3dc6102bb989701497eb412e45830ebac40b7f5f16d5d55d8ec0be8b170343b215389fd80416966a4ad48f370cb024519b9eedc0874ee264960b77bc0d317d488cef517e46dcc6d87e43eaec57195c772fc4b282145a00240fe0e1cca127e43069eb15e4fd96d524c50af83cda354a3751b899d4f05809aa875608135401b4cf9927617ce9e1c21d2cb69a7c1751008dc307d1b2828842ceb53093b86029801c8dd4343d33612cc2483ff72f633f6576b58e36f1824448af342a37363929ef464eed6da5aa9e1e085ba0cd1042353b4ad558e328b54750a918b1398aacffcb45ef9435c63551218e155b1d6c5362bd87b79ef3b45a883133a4c8f592f71e91d25683850bf1f96f1d1dceab1b21b96c71e37f88fc43194b54e4721d6f18d80a26394cc038ddf6547a92511288eddb7629ce98fe4948e472c4f9a190c914a084289ab6c07aef43c43ae1c64b721b9677408bdb7f765ff6c3448be8c8ecedc7bd9b62d13fb1af9d5182d6c14ad72528b70b25b1240a8fedbec0d9b58a36d6f9f9ce552b1ddeb60bb41399dcdd2747a5a994d271c7b1ff923feec9a64a23a9dc4fd04b046873a86266a07cacd85b89485e9962570066e3ba5c6ca0191f52f38c07fb9c7fe79fe0b18ab95eeda403f0c0bc5d27d271396c29d409d66192e454e4239348b23bcd2e80868ad8c3989f3b79278edc93595b8fa22a1d9b49443f00b23e0f6e1751160072eac8b2f1052f68a4d0fd2eed9f938a085e49b225b98bc73685ca142b5e266b84ebaa9334e05a1a35943c00aa8210e5cd1e7c0ac53bc833f8c520f809e5cbc35c83321233b3cc540205cef01ca0726cd2015ba64a16858050944bf80420716d2a2bf182d1b07fd06fd40c346358ae3bfeec024a9db556f3e9c153d9e0ac7854e6dfb9ec96b067a305291c4765a8f7901e1046283870b3803cbd6b94f8c3eb4fbd869a56e8e8d1448ac1968aef2919c6e41f11c24cc4215c25584ee5b94d28662c4213e62837544cdb05bf50bdb1ad8e206a8fe712dc457df2769906650bcda251cb6f7b99a9b2a383e674b614aa2f3c12ccaaea1569a24132d9a8688ab3a7e271a6306fb5c1e48c5df372300d903919e22e2d8fbcb102b7d34dd79e25ac949cf8636e05af9a4702df0bb59aca53016e1602060e5a8aad22ecf9aac0abcba019b62ef154908bc38d2415f5cf12c1dddecac758e4a475738c700d0a2d89ddc078ecd2a6a9c7258da2d6e3899329b2e9611232472247ffe9d44b8cf1e0bc252ff495654181a02dfdb3bf2a38d669d3a30807bbd44d0d2062475f5a6353d7e8aa6db076324c7f0e1f1f64e289b431cbdb2e962d1881da9a3f60fbf82f051fb7def6a97c1e2d647bd4e68f8331990d40760845a09cc5256c5b767969059365248190ec80ecd33f384b19a54e456772c28c1e5173165e2e0f8c1c8ce695d7e8f554ee9f160b8fcba510113e945c834d1a5b35f9af27084130e59621fd75796c96266da1ee8630091f786547f4b397ccf3a4048686765a72d6aea5a54845b6daefb2f34494141bf12d304557dbbbdf9e41931739b961adf48a798a737b15d9f7bbae9ba9289586ad4b286cf9e51a995d7c6114eb8ef049eb8023102cb79a737db1568b105d0eb567d1df95f4e7e19991060a0f338296c7c327db872a531e2b129e3c6cdd31569fce299c1878a4bdb630c071e6f9c16937a9afb276cdb3a9767e01d3d14618afa6d2015736152101951c6b683e552b8cd5ad60e78b38dbf546971921640b41866fb4edb39348ef146805774db92dd5e89fe66d85fd34b312d3de9761875edce8354ffb9bf8be9135fd1f9da84502ef79cadf8150fde25837bdbb91d484018dae660a4f692a16a27ab48eb43f2a98ad9b58e034e1abf8cdda543567b70e438a8bb04bc2152379fe347349fc9b6989cc48c678d2be603782b8fd910b04ffe4472fd554fc4d326cc9a8c81fd7efe6b2d263aede53b9e4a141997e8567e763960e988edd83ec83beacf0a6f0abc94d213bc960575233420b8e74fa13dc8c3aa6fc62f197d689337b86289250a3efda944ae2c149607334517f7be599e7c83f956be75923a03b33d0de493b1580889d143474ef1d49b213e25fc63ee228a15ae26a8f894182d0536b47c1203fe5a33a6360c7accbbd141dcded70daae5d04c86af4d51307bdeca18c85b0189a21e793cd45e6016a0efd5a1b5320bb3dde4746a4bfae063b719605ce85fe408ddf67d51840044a6f719ee4ddc37a3810a8f40d53659ab911a500112139cc097ab18ec66d98964a9e016d41e149d486f2fc8496496d8d9cc33d8b85648c9a14960799378be7c9170b7b26389a5cb986bcad1be453ef889ddee0d6b22e21c54c4bad48a84ae20a38a9e5f38c25052964bed50464c9ecd30a45021677ab4014b90904227fecd9e745a928d328d6b5c7e8555f6e71bae86939fb79b64d7be161a26e7eb1355bb8d37cc593f51ee18ba70012a153804a548604ec406a8f827bb12cfbdb6aa65e9a76634c6763902d6be41a425626c2ea800a0382dd777dd3014c29402d56123b43071ca4560b76818bd2d934d5eddb4b5309489e9553b2c0fcf276137694f0b26343fb6d872005b4fd9d23438c4833892165219d40ba66c84bb354db6f419fb4995693fbdaab6bad0a1650e9f0fc57da41784a9b829c2f5635c5c8cef33a0bb40de35a2ba260f9c2f56760b4803283bb206ed235ef21f20d44b0befb2a9463741ada74214b2c363aed9ebd09bfc22fa38615c2f70423c17b9c08f2d70b0660a19ae5a2ae907706b9cc8fc03733876998b3a07510552e19d8c28aca7ce653d7077684f243491136f4327a089332b9eed888a19a7ed41c9282e7f9e37bdfa132325a467f9b221b88e1cbc2d1a55dc5d03bf53518c90eb98c7dc8a40189dd336cc1b6c475e9f82944e186c6b5666430f4a89c382991d28cfa03af2b4f51102e9898ce9ace1da25d907bca253c0ab9a0cb6f7464f78bb6b44bc51173a11311b296773d7b58120c04641cc24ef681c6de7e91c1c56d23d5bd0205c604dba1cb657b184aabfa252d038af82302894b4645bb1073fdb3ae10a37b42bf16c008dbcb5fc5d8ad39487e8b2d3ca50b435726d7a051201277e7b6eae3f35f131536f8e020db4444530ec7a5b3c0dd8759146f580dd18fb834fb72e28d90848b6181b3683ebf6ddcd7f0323262179eaa22a48c4b0a21209f49ea955c91b36b798b499069effa4eb3c9262c086108e01b4bd2348401aaf2bc9a7114ce6630702955a65e37267e7ad7c9476e2391afdb5ea633c78f6062274fb66bafd021f04f8015279d3da6e9fceab0cca078d60c53bc1da333e1952b62a54073075336952dfb9d717bc50255cd9af6557987dc760de0d86cd0b52cb916a9e4c5aa55c0c9f2288d7c6a1c440b6bfc70117634569ceea24334134ced79d4e4142b93de74260ea5d0fbd01e1df3dbd5e9d3e77c20bf08dc7171dcb39400a4ce53f7d10cc41299dbb7dc16c229f0475147b8481cb7e6c43e5de8a3ff9c63fd32b5e30b9114074dec13201fb5aa717106b5a7a7ac9b3451d2e52316a604aad9ab30cc69b21d878b6e6ddffe3371f7d481277bac9db899fe7dd629f298b727fe9e6d4f42884a167e92b0e870521e83d8032cd9d045f21b1882e362bee7a3df202826215861a712754cdf74841f282a0b5619600d64268a469dd84d3428ff118b94ab2976d625f9753df3e7c244c96e728ba2785545c863c5f3104837e9eaca8874cca13c3d9831a299b85eae4d851c4799228ce06077624ead3ecc625f0ba2c98078650903d2f88ee8984528577071a94c6dc0df24e4607326e8d7cba6e4103e6591b2777d04d234992d8a8de6ee143b29fa887f9afe3910e5acb85a6810c9d3c4d5e7ea7a02353c521888b18b8db54a3aa277df887208b327c08145263e15b8b2c142826960c2e33503232d703d2546ccd4d50647bc57d1f5cba014db5ff8bbeb6c591b0dff569362d8a2fa3acc29b4c8976f27fa0e215cb5b403a020a626f213eedd7df447e1ef78cf8449deddd1f11462a66025f6ad44bf449f8f7cc8f93840724420022e37cd44d83d017c96935f48896ca3ef0a75f84fc5ca86b2abb6180f56a22922eaeabf0df57c8ce53c237d46fec3c2591619724091331d99b9a095d4fce5b6181f31d3bc81bd6d35f25c99ec686adf9c83f9519b2a6bbd6395bf5d51bd04caf87cf3130cca099d29efbf45370eabb369ec826a2edea1660759a4ce2499fe05beaaff2f85c6a20a5dfabaff646415fe4695ae414f90ee4a3936b92c9979e31ae39b4c1cf050bdbf756132bb1a6d92bb27435d27475a950626f45962fbb86369c863c8da77d8a68cf788b1b00a8e557494f7c10002d0b529ebbcd80e7aa730242fd5d3cc590dffc9cfb8f81d22144e0c21557ea5be9c166062443072613e0da35b28fb04aa9f9c613f4e5694e5e94d1215c5b2b0bb8dd0be3c1f580afedba3ac065cbd06698879e0c82474fab5448862259fabd3fdb63ccda0c37c2bc5375cc1407e345b2becac34ef8c4affefa5f91da398e519d8184d069dbd119acb5b19b13f2d5251ed3da9a2e84a42c7b89310038c4617c05560ec8740148442fdf6c254020b9ecc03a305177694484b6feac01c3e7ebade4ec7500b0762c4828f3c205193d99d78ffded336eb69f7a8f60b859c18b2600e7879735b8b8bbfb36cd5eb0663e4a1100d47f741949da3451307841caab0bc6f09eec392b8e1107930ce4d5635bff25a697a2b8188b5ac7686c4eee89123b427d4a914bc1d0e297d168354cfc880f142122ee3e91597661ae1b2bfc903f085f8ae3e94dd61a896e3e3dae17acb7317cf1e2ea203b48ec3c2986100261eefbe792d2b959e087332115e449e55736cccd006b67dac9de3bee6914f2f9a99dba14609c66505e3e9e6214c19acf8ec65924f8ca523325efa26fd0af85a0cd79dc0861ea186d902978060a7bf14995c1d08e0d0d714277df565bf6640c12626197603b94b19e53e1bf5cf15f55fc5b6f78ef4a64d485a10b5badedb1da081035349fae41ec66f4e23a59d356276ae4f948b9348ff300616d314eb7c04f633a827e93fc22d1e90e1bf65765c505dd15c2cf4c275b20ecb9c0f59be5848b4b7d4602b4161c7a7398d958e2031ab4a2131a21514c96882177ae7642a79e9bae3a979324004898c48345f0b0c21f086f0ab42301384eb9467c0c2706b4bd1e32360f4d8819e3d9ddd68c8bc134c2497f189a00e85a8356946590b47c9c8130bd609b291b0d6c347061b55c276555e37130f1d808148ce08869e586ff6fdd02c35341833db6a044db551c9e2e0540133341c3e7d6e1305035c214f6402a645b570fc2d415123c90f6399a4fdb68fd5ab6e54871441828a22c8613735b8c4478d6e82a65916dd9cd536694374a95ba4ea6ac8c6bcbd9bd866cabd9756146fae6c79000a3d726098fd73454846e4d32090721db0a25a9933719161a6787018f0316b5b26c9dd64a81926af32b3c7f2e5bc12eb3bc5327cbdcca32059b8c2c789f7010b76255de17b4dc83f2070bd663e7ca3d17870ca7bcacbb6a02a86935a828b8091ae95cddc070206c386abeb60a3c53430e4de1d540da4e65ce14655c8c5bbce7fcdcb4a7cb6d53142aa96c874f379607b5d5268a7afeba277399508cb3e37a89ed5c07e109519822988d97f1bb7d7cd1186c3a6c298a42b431b0c6d89aa4b9f4a0f142e4fd7ad293147931ea24fad05a24fd01eafe2a9733024bc4ecd2b257db356c7549b6ff31551bbe06f7839a4c0a0aece989ad60aac5929ae98a93931272c274b3cdb0a1fda4e6b35c6f445e4fe81215baf946437ed1fad178deb928b50afd256c0d5711c8c853813c05025bac675cff9e214092df4f815cebd5206743f80e613b37b61357cd23b093bb3f10cecaeac2ded11c6d56acfa83949bbf1a48c97dc6b8768ba0d153d38dc9440255ff468fd97e09b9f4efe36f4506ab4b5340dd446feff25aca0fb4cc8a24b07714747f3ebc0afddde29eec9f83a60beaf4109b8598c5936dda641361a62ffb094fd75633509a731e0d296df5cafa99122bf10b2ccd505af8f2114560317e4aa28e1e772cda6992ebc11784ee1c2a0747b6dee3cc61bb46a19b070c32c8ab30d4a3ba22cf3975ff9b6faad8be261dad44574b9a29660a3d900fd88b783398e229ed50e98eb422dca7bc779b0af3075ef29fa83767a12f760245a71f598a342dc137e530270ba32d8faead789eb09736e452c702c6ed08bf1f2a59e8f7baca3cd90c8e8879254cb6096375b62bf797f642b7217221247e337543656b56b2ff26d759823b4f73d800cefc3d0551830f0393bb9e25856674af99f40f68e043f4af5b3fd623f28cd0ea8dfee6b33427732fdd7202ffda6b833d9e2bd608d05f46223e7a0648aa98e41ae408528cfa0f46858344bf79f54972e216a53f445d66a55263046b6f33d45da6c0300af12ed9377788aa1b1742f2b060511cf2228a7514cb0038ab8055dadca5b44677b7ebc7b93a5e0a8d7c71cd82f0896e0a30aa812284ec868ff52863d9c977c9651147a1a12a1219112d5345a99e8082b70a0a863866c8b74b626999a0c146c281c86c7ac40ee48c94ea9970ddf1cc83fd06de9a33f2d826cc0f30dc85c8bdfcbd12ace32e1d37983a21cba0e5d73fcc9fd61133b098d0309b112e4f26133694e9ce4623bd47f46a85f87ba0a762a68a661de0e2bb311f69718d48e84b9749eed899edb2fd21d2c806e92ef3b841808966f632d23308760b452e9f5addd40f5aa80bc7289566a86b2f4d54f0107127b6a4564d98bb8275c14e659b923d1337be47849046b59aceac372d74c81112a2af71e68a42e92bcc68515908b668f7c8e85dc7beb66edf88aed5df8fe63efabee3c812edddf3ac612159110b09293f9e2577a99239231dd84e2c4415d7267385fe0175182a3c9c03dc7b6fe5d469652ba23379f6f5f9c6c623fb6523ec5ff3da375729500a1d342ab6841c289b6fdfe8ae244f45228eb5c2b250446c3ef29d4870010bff16717e41266de1fb8055b454343e4266e9fc6dfdfb331930a9bcc8cdc8915adcf90597a1131ed310ad2a8492d5fd95f50ce01e0e7fac7ac6e340d252ad1f27a320c29d8389e71ec0e52e497df9d47a9e706f08a4c470f7a130b33fffbce0f5aecc8d33cdcd6c429c33a80b1b7a6ab2e669fb9da1ed910def009685e8b8581e25dbb4c134cde1a22f07a891ab792684a10bc3b211e0465dde6b8c9a3c36f98125f12169082d7272765e289964676a4edd1404e2907d12c780b8bdf3f5891f2b1db061afc4a9f37b6a9f1991f549008946b8d208484c87eff70536bd8bcae9e9f9a9b41cc45c3db57e98ff44e37e8f56d9d76d5c6f303f954649dddb98c635e9392371f746863bd0c94f65180b42de48699ebbb77a6cfc54b4aafe55d2878388f3c85782e68e0ed867f8a96e455c4a9a9b5ce5d7351fe74968de983d3bbfee7f25f6a66e02211babe3455d758425df9c0376bf025b1d64871bbc3c8b0c68e1b9627fd73f89a4bbe94e1568cfd6cddac5558d52db37943bad41725edfbb2cac90608a8accda402ec7e36ffa155ac65ba18c8be797ff666e94367037e7366dd70d651e59b121b7c45ce0f990fd995822bd6bdedc78fbfcd297cfefca822bd74433e301fa85bfe541b2e977cd8c4d2dca10fc3d000cd1002a9415ac492af40b89e13370df8ebc464704ddc131c99b2f9e3cff53f44b73fd03028346128e7a8f962994ee41f4dc867ec3b90c1d65ba146cbf3085168e0f11b5a1806f78f15afce7048a05c27c5e804427e0425bf1dff3ddf1c8f8245cab1b9bc17f17283c64037a43a6755c508a424a1b6cf8fab2d2d2e22e4b0868038fa282fd25fb97b4e23d2cd7a3772078df78fe50fb8390378ddf200e03cfee3717432904c762084148064c881b56b7bf529817db23b958671d6162f25b9badb1f677b7944422bbbb7bd30e2f08ca06d406d53b4866cb4f6df0bcecfa28ee29577bb3d4cfb89b05c3b0ebb46fadb5de2c11c70bcc4bd9686729a4fa42fadfe7d8993f4b0087b4cd9cf3efbd36bb37dfcce26cdacf81395436da3ee7e4babfdd9cdc9cf3723d937b3a679e1949cffd10f684d17dce9a89cc98735136daf4210f0aa8fa8544b653ffe0c22d4d951971582ecfed72f14805876eb8087f72dd0df8f327fc995d5ec17ccff4bb6c946ddcfc4ce5224f405d719d5ebdc675364ee8cfd250379f758a1595569cc6755247988b6aad79696718866197cb45d9b51d3ae6461f4419f1e8a5813c492988e451e9e8e84217744557ced9662efbac1b7bf81042081dcbba75b95c244117ab2045a50b5dbbb65af556b98fa2321779059e8bb2512e922a0fc014dcf9e08d3fb3b8ee601c1f752d6551574164e37df3308d96344ad09c41d394c6c7ce36f6d0686729fc196f72bb7b8fadee132352adb599f42794985beb6e1dcbd9f1edc40f37fcefb30cfb201042d8f2a14bc20e625b4ffd10b684369f65f0419757001f8344306bc3f5605fb5874f03c222afc0be6b5c073b088d54586d55e918a834e8726b21c637f686fe8ea692d05ff559b601bfc76f1ecb39f0831ca7e23a096f385804977686550cc3ea8d6c5b6cb351f769756ea77e542b7efe1765a4382c656bf7c8c7beda9c399cfaf4e7ef44197707fbb47c5a12031cb1dcb0c82bc0b8ce0341b0c81330798cb6c3a218420ccae20d97333f9c0181fb1429271c3192c4cad118250be68f3d5f1fed59049233519ab29723dddddddddddd0ba7b9705c698eb6c26b2df7b20db8630423663fa6334a7686e51a0fea74f8661b71c7cfb0e7304a547cd48c74eb1d864e8ff367e18c326e5d7c77fa3a03c488557539f3a384333c92ae58a3c76c9cfd98cc603103c40c1f77762890104e4081035a7a67023336ecb81f93991ab6110cbbdbd144604605cd0733445465cc00d15e30c34325e60a25325b7c59d9b065c583112b129a5644a65cf101951554385139519164840a1634325414d1a4505182f6840a1f5aa869810aad082856313ca97e38628582105a141f564fa48ca0cc130d4919197628d38212658e5468ca9870a4cc0fd59216ab13ceac74083343131a0f48a860c589978a07106857c8dca04d21d3040b9924426452d0602013642585cc90aa87352b2356a8ae904223c14b0a4aa8ac1451e5072d4b3d72501d3186869508c6bcb0aa610c92108c19a252620c910b63768c20cdd0181599279a2ca18100cbea0341682d884073d26155c2144a4b532c519d9962051510539c30c2142e16a6e8a1a18085e6a4cc0a08186d052eab2159564946e0838a9a1d8490c20695192962d04e9002a9072950583591a248e584142298c96255c48cea4b142c3031c649c8109a154c6578d06410034504314c8e10e38208628c0c8931d2961033c2eac7164d54a1fd2066d54397150e49ac9c104145154d490faa2170d0ce849941954418254c8439f2258c1015166148600a23a4ba82667534852a0827b41bb4105dd1820062454308b08862421435a88a88020620a25041852888a48902886614050f28aed06820a3fdf802822daa272354619ab42d53545b3ea0ca020a272b13a0485a2d81828519a028a222028a12342050f8582151a30a01154840b17a41df276d89be47a88cd057088d88be3e682f7da5a85efa3ed1c08061a2f2022689e603cc1115156086a8b28001a23d81e9a15a42cd2ac98c6a4a186d47972c9450497165052508d51453342c3bac889e18f1858996c297249a962f47564c5f86a884f802c4f5a5071735ab2066544d8471a18be64509ade98a1626081508a64cb18396e6892a8a2798a87c7822898acb134734229e18a2757902c8ca87277a08a9d18498d16a08a3a2d2050625341daeac6e0862cd144dcd0eaa2a9eac6460b245122847343443b41c9c00b282133d42a066c5c4cc52188d4797294a345d592105a1d262ca901d563c9e684930518d49a27ae2481543a2f00244b3e2a587c6849a559199550e6176e852448927ae681f0822c994d58e1db4204fc430594549a21d1d1962880a8a2e407a74e921851a266690b40da321a16d17cd062d2a30461c1142cbf2a2b2a412810e2b970dbbdbf91898683834a164773b6f07c6189b4012e3ce4e942121d7d903acc952e4450c094f550c01a1437ecc27232ef99e5e70c567e5f327274f3c0c3df93082d61ab61fd353d3eef45bd1a8686d04ddfdaea2a7d09111954940e693203267723a4a9a4a2d2440cdc509973f973222fc7fce124576f73b7688ccff496add3d002f6361dae203d316324c5bbc4829271d12e2729425659b271886655913a5c2450b172752a9544a6b2e69b8947998992d48236c59e2fa416e79b23bfdd189083244f85875a145d870c5842454d354114c3655e2b102c26acdc9981dddfad7992a26fd8356248295125df7635a6287fd3a9fb384938dda8f698924bbfb1d29d9834dfa316d311a4ab33b4b663fa6259e989640620921b6df6d5159bc303d89c986e810232f60274f3c3cf9d044b6fab2058969cb921743024cab20340f97134f8ae001c992056f8b2f53b29517edab27dd0d60bfc5f176640da1fd638437640f768f04d2111312489664a922f4e302b012425619381ccccf9f3910e4cf0fb2008703d4bf9cddcafebdb6f1b6ce8b01ddc61739f8bac8c9c9f9ebc2c5f6db823c1df6f61dfbfabf6aa25c8fe55e8d46402d412a49773a4808ed2e67c31613169777b6f566367ced16f490f97e3242bf82454a0d7df0eab5932373562f6d01469abe6856844060be6012122388137968ac20a2092942b408b9098213c487c878473821048d1021479e186244132b659048828a1c80a4e083101e63842c110223c8028238145a849011d2802050442942091568102282300608e2501010e469f1c404691a820b70fb762db2d78fa41f473f86767d4c8434f56d36a7d6b676988d4ab91e8b7ded5a96fedcad003c9efbf13db6600bee973378ad37c3625cab6fca753daf11944640da14fbce62bfed9bf178aedc16f27800b76ffb66bc877d0ef99e7b0517ee9833786bd6d8c0de723837fcc24df38db7e49fe5784b1be7e796dbf30d1712da6f69db1bf62d27a1a0cf613c640f42d6135d73e8cf8790d2cff4d65a5decfad6daeb184fccbd8c8582ee7676a28c7f16120dffb9874f6e2fc6e86bb2077b28edf7e22165eff7e2a1444a08610f74eb03336b050dfff568b55aad56932673b264d09dc55872d6e113917e85f7be762cedf7daa1f4da2102e54164ff7eaf1d677616f1cb53ee982797817d6aa116f6dfa516d71a4fb725181702b66006f8345f0071cc0de5dbeb736711423ab76ca2868d981543f45c43f260f8eff614a0b17f1887d5c7d8dc767bd876f77dadf915dbeaeff0b26df67bedb0b2b388594db40e052db85d3cbc4f8293e71a4ef305ac186846717d1f653c0b3aeb81c4b8ba51bab3a7004d9ffea342b473f82d112f21a4355df675ba586e962919c61c6ff6ed7b6d09dacac8e063d2b175fb53e3221dbfbefc1c9dbb69cc2ae1a53c2346830968f0f67c3bdf527f10352384a8ba45d2de0269cbc72d0988b47d6a63c2acde886ba45db218e3c7549077409bd6ae67723e78c78f5264a907ab900550a6acb56fe36dcbe1dcefe930d0f618b42dde927bd1084c749decfd7bdfc6dbf7de977f3919b4e7d6e13deda6ff720dda75f3c19b7237cb0ca2ee69b2ec61081da3b29ca1361b6fa31effcb1490f2519c7c14d765280e0783b7516fe36d1487837d0feae963a8a78fe23e686758d0be9b4f6b5b28b7a0cc619aa523244847b366a3ba3425fc59e30b39a1e48e84b22cbb7211943d1f724a5067fa116b04cf452348aa43e6124aae6217d4a9121c4919eb667167f1d0964f65945c540275e2fb11eb87865d507c10384cf443c38f4856aaf07484ed6a8b252a559aac607162f1d04b7a492fe91d4b4ec563169da253d4e2436bade5e27374565bdce9436bade5e273747668df5a6bb9f81c9d5c94892c692b5afb252a7a2917e9a5a3ddc125bd0497a20cb894654b2daca573d1930ed9cb7117e4914f643b773fd3b45eadc19ff957e730ab8747892fe2dbfc5842bae7fe8c0279b0af4e05f2d026b70279b2faf16395582536d54ceeeb7272de04ea24419de8494a90c7bad26acd9d970b6289a0edbfddb592b4efaeb56160226cb4e9a319f224c8d3b5d0e868d9f1bdc963b2c24b944de409e8f05095b415c51525caf02418c569ad18c675403529cab0f1e986a3157c82d10d1e3abab9c146f3e6e6e6f1d00d3ebab9d1373737d8e543fac687347e6d63c3ddd8fcb3c198081361224c24d32c6d0fb21f939a261207becf9c4ae7d73abfaeaaad27849d9de6ea5d26a29d4e9cb54aa5552afd34a2cebff5a0b48d4af55aa7f4a7b24af534a00deab52a95caf43b98ea5255f55ce73636a92ce78dfe07f54d55a1f4dfdce8973652e74f49eceba3b65cc4d1e948daad0a46a9c7294c944aa51e0fa552293c944aa5b0cb87523ea4f1fc8c42a5f48e323026c2449808131955285964b10fb01f5316567696ba34c618e363f9216c9f736a9d3d17e5224f00f658d43b0884ac757e1a3163bff56419a5f5e78cf363ec276edd85b07b3c47f6f969c0fffc18e3308a732c85cab273b1f3a7dee6fc289839cee22d17b57251454229bbb22b1369b56e94a04bdf6054c618e7c7290821bcb9b981372d983174e5a29696370431c6782186f1e110bc10caeb7fefe321ff8b8f7ae6bfed10835862a3dd45c721ef5f8a0596ad80fd98b0405283e4be1a17165eeeb5f7af0436afbfcb2fb38d1e88bd043842f939e35456dd3cea559b0de793da320ea86e8cbbf031514be768a940c22e3c845dd885c4d3d98b64647d088564646435deb046a12ec63e843126c244980813216948b178f1a94b886dcf0f08dbfedbb3931b08761e1f692f603fa634623616465780d959cc96e90aa76d80fd98ae50c25aaae647f9d15f0ebb50d782503fac375f35d5dfd7b47dadfd958de5f0df6c0fbeb0e13ab92fc77540755b8c03aabb667fb1ccf9b476fd4c3e86c56bb9ca6532721ad6976343d7297e0002e4c1fe6ffe2c4184aa9bef5a3ade7be3d6631fbe37c66b519fa5628faea134ae83b3ce39679d75ce88bdd7ead78bc377bf58bc027fec6aa9103ef6b4d6bff03a6d5afde829be80d5886295eb99b5ba0fb602b3ecc96e70b35c5f5a719d55c11bcedd2f967a9dea75dad8cdcde209c094a20c6805ca804f9355bf8364f453f5211f6c6543bf59300cc3867616638c374bcd34226a4b3ddeb0cf1b861b4419be547ffa1354822d7fbdb97d311b5a5c31be59bcecf8f3cebf59a0929590ccd3de403e7cb2f579795e722c2b42e84eb77410607b20681f21c55d567cc85d4b183b910fb9eb5d40095b38078b2420ac0f5d4f56d15ab0081641172c824675cbf99cd8bd25a97385eede923f0de9ade7d1e196537da2905d2cf17955a21960dbdf53ff8bc56f96eb0479fce306c207fe72a08e9016495846a42d9e6505a13f0a41f81e7c1d007a33fce34be0431c6c1b401dff1c5610ddb915c7f2d9f3c761a803a78842bbfe7ccf5a30b2958b7251364a6a82f40443290bffcea37815af1225fe6bd0e522270a59790da9f212b2031227b2f12b51e343cfb55f8e9c6ec12724b06e560a5abe8440d9ef899eff76f73fbf73b12194a7f3786c08c9e1e9bcddc5bd778808f1b1df2bc8991d82fd5e4194e09f71a5346f86a7d900f2500ede0cdff163e6e0c5a811a38c32c648e4cdf0ed44f67b37cae02351f0720dfcb4bfd68a323e0f6314254bc167dda07d77ae64bf67cda05d08a69964ce401daf7ee4a405ead86731d1464a7407c1f8110403c540328e83763fd2d9b93afe94e582d5f29ffc291f0b07edfb85275d8a4771258beb6ba8532ba7c99f94d64dbedde6a6d8450b49773a14c0d871000dfa36d27eef5fdf4b1fbc3fbef854ce9d666eac1c34fdaab5ec6b0dcb94cca494187fcef9de7b51f8278e19ceb06bedb5134d1659512ca510baf80c29a59f8a111573ad374b7cecda482b95ac1e76cc642f870545d3afbfa3e38370870584f63bb176b1df05e4f98c42a16c6c6cdec6db361ccecdf7d8fc7d1b0e686337dbd35bd0c6f2db2d9b18670e3f0c8bd7e219a7cc58208430684f3a2537a584514a1925842eadf77b0951b2238c43314d1662585034b6cfea41bf287fe771ff12ea789039e79c106208b7077540d08f350efeb7218618e2770c31c610cfe9d28ffd7cdba334a252df531f85fafaa9b7401b632988f1e68377d6e96cea47957e0667152d4d5a7c34edf7ea6165cb1e4b9b4e10ea3f4e431d10dc0206e0c47f2f468b6774691a1eaf640f6a265e455668ea3ded285960d9a067562f061a6c506badf6b34a1d5e0a20cfbbf7ce3927d613401e4db5568e0e7d7228a30fc48bd6b40650077bfa99dfef20037e6dbc8d7d76dd395c3f9371036cbbd65ecbd9cbd1160bbad3d100f2744f010c1cf8fe67b2d9646702973e2d0da00ec4004a94265007da2041226274e36308840f6c0732d041c6810534c080860496e86e27a6e294d7a57f94a9944ca5b24ca53ee79c53b0b35bf7d21879128d16962648e99992324ab92db992eb649c574a4d236e6077f37d5a9b467cf822e2562a67f933e628a37c41776f293e0d0f6ac4af319f06ec409816c3a6bbbb03ed29b4b3dede9ca898b70e6f4beecbed63ae21e37212802fa0a5d1c2d2bd9992cd7f39454bdb8dd8efe5f201593264314e1f1f2c50c79da00efca62a28294b5094b292242447d5c87db8107ed8c5a73e1bf06945ae830c24e9ee559913cbe6e4668d99711d8e8f450eba768c534ae93edde5d1864af0b1cd8fad138dbd7fec71ce97d88f5bc47cc418310c8b118b1dc4cc69f8c2310ee318717874160cdabf036bab7850c3bf06f65a0bea604075031db0889e6a440c208ffdcecedff1406ed84112fd1127725cd42497716c90c98d03ec3088c61b21960ddd6776f3806fd60b3abf0fde16857a9b3fdb6ce1b3aae8f9d9b3ff2436a79edfc252a9d4db783bc5e1e8ef497dfd14575ffffda00d847abdbd0d07edbcf9e08db1b71946dfda5a776499ec53eeefdddf7b3f9f5bebf6b973ef5f0d774eda9fcffa3677b6656f737f0ba1b58f7b10dacb59086db510da67fddfc682417776779562fea4863aded22ac7fa41cf5963020c653c1ba7dc2c22ddedec70327bace259b38cc328b83b3fedfbae334bc2452465f79394a5a42995af7befd3daf46d9472985544fb7e906e73d78dbee71c74d349dfa96f673c3bddded6713ef8d3884503109c7009160d2dea857582ee9cc88ecf62a229779d8e60d7c652207408659d3ef5dfe60fbe17e39c71ce38679c33c269dfabd5d65abb1036ec287d3fa5acd855e7dce88b2f2f1371eb7c5ad0a8eea8c22989e98c16262b8e98aa00434215560c4b47be2dc19e62dbd05b80fdd1cc322e1b4d024481d204be887f95401d247e4482ee08408037e35922cd2dc522297bdb8f09cdd1ce5219da9c39ec823af2c5886f911c6d6ee41a1ad25d6ac7db4acd393191e5de86248748c06ad29d9d01ebd4c38791390ed2ad9d1fa5371b6feb871983185f7351a3e8a3e86b4a0366f931ea69c4ddda19078b3c01f77da311b1cb49a863b1d66212ac1168095841e84e67be7cade5e23184f8e7e3d4f6e32d98e16e36dece1c0eea7bf2dbcff65170eb30d0ce5019fb97b3a09d6d37cbad12be30ba2f3cada5a11134e29249e902f24030995194306654c29752d248a90b7ad3c6fd54eea14b3a84bff7de7befbdf778a48cb00208b77be0dbdf0c0814d5a9dad0848d7a54e9ae68614c0890a0b2a3490b4a908c40223d289212920f3fa1c790932b7e3c39228811fb3938d17485928f16a660410908a924c450d00c351469a1e5881aa0a4594189ca0fea151021892f4b00b1660b215470124451acb5564a29a5949ed06384284d242845719a48aad45a6bad95524a29ad5cbd45e81210596bad544a4a876aad43bf33b93c2b421031c31153988005c811272634e1440dd10f289ce1f294c234b2c40846cc9480e4081dac50a109245f94ba1c39112a210577fae1882abce8c08406052744a21327267040049a1c76c861090a5a8a28ed804e4a1861ce135e4a3d86e050ad4eca0ce51065ab06d7ec3189bc6c2021be6a98a2478b069949201aa46cff47431324aefdbed2a065fb3f1a9ab67fe7fb7557c74fdd2e5e8ca7c3696b7c3fe4819f53a73ffdbae9adab4f318efacf9f6f11486ef9f36ef933a319072765dc7cd64de6ecb973cee11f5f833cef23150cfb8b617f857ca9e93eecbd041db677ebaeadf366106f5c4e625cc6b98f2f809bc20d7306376cb54ad8af4e65d7fadec405608dae0fa7ac6f6f544ee2d41a15ee682d12f1ab1246bbbead6fe34f15bdf46aaaabbae9a4f626c813f763e50b7c695bcb65f7c6c6f6d89f6fa3f30dcb49ce62dc057077f533b869c4ba3ddccad97100061c74e0f3810f23e850200f0066c6f8da16863df6b137419e9b337024cc6aeb372827a5bf38514ba92250a7610266bf1713d796e169cafdb2ccce6c88c1dbf006a50d5f062b1bbecbb0b4e1672fc3f70cdefbffd4fd62c007faa9fb411d19b471d4adbbbb7e741cf421e41e7def8e0594fd760c54324b3106b39f1bd6393b6ed8cfedc697f2d6e8fbbd1891ebe84f3ab738391b39f9e20832185672aa6814d0cebddba11f29d81c0075a07def7636b59b07b373402bcd07514607f1058c3f637b31e0777f45a4604307d0addb993a30deee763ac8c0066207de8c09de8cb7a79cd28887ecc1170c48fbbd5e88f27ac1f55aa2e4b5c4c70482586a6495a4a42d1f261d6df93329cac4ee2f7df300e8a76efb62f87f7c1d3f75e31763661cf0e5cc38e64b0eea70e9d1e61cf20b00bf002f86ff94fab43e952c333a7ecf7c345ada97efb2877ecde886fdbd5ce7cfbf5a6aa5a75112b3e3472d4d52f6db4167f600f67bc180650365d6a9bbd70dbfb5f57e7e20b931a559ae41297d31f2d70da339bb664f376bb92e5fe01fb1ab436e6ebadbefe8d79719077d4abbf8b4f6f8d3af5c976f38a5f12b7dcf17c070eefda4b6bf18fe3605d7cebe0bda378bfd76a6044912315af6db6f376decaf92263b8301793ad46799be97d36e866519e76cd4d6658ffdbdb78b3ca9ad436efc4072cf1676d19a3385b98bfabc599b71609f714196520f7e3a905f877c9a7dae817d8672a78ff28ce33ef659deb6ec73c63d1d6ee3668faa9165500dccde8b81519bcdd9d8f61e9533f7b0971907b6599c71ef4eeec1803a0f0392c4b5fda10b59ecb76996ca60c0ecd1d703ff6d9d6ffaf246017abace03411bbe6e723dfef02107234c266673fbbd5ca8b27dfb496df9737d3a7cfaf69f6ef6efcbd930200f9541998c2e44d933f67bb590050c546050da1ef8bf17837e57bfd2f76600c9eddfd1aa46fb7e54e297b361bc18ef8900e3f5a56fbe66c31fbff1dedfc6e3707e7c532e066d9973cc7f5ce47444c7b1dc8d1eda1321e441e90a60b6fc97c90ba1cc38280c43c19833a08f6dc0e0b2c733d90540beebb3c468ac05314e5bca9b01262fc0c9af43dac7d121f7cf4f6a3feec771e41cf21fa7c3237781dfed598b79a5d089eca5708802dda3ef07ed8333e693a12d3fca873326fdb9fda436d7f94b185f42c8b9d790c5349b7ec501cc9eef4e3bbe3ca2ca867fa3ecf89285a4947daefb9a6d5cec717e7cbfd721b7ff4f6a3b973dcd39e8e5bae89c0edf8f4b75f33db8a1b707e0dfaff7a1df5d3f6edd7ca0fb91eb913d3784fdb6eefe93f2caadf39d7f52db03efc5782f468ec8c93ba50ed7e11cce8dfaf12bd7232990eff9e3fbc737e6924926bf0e2121dfb270b4ed53f936cad8d9d9e13c90390ab09d9b400200f8d03b30044084eee68e713660c7973076dc51ce97c3f19490d3e17bbef40e4b2f807db875f4f38dfce33aa00e7fa242640ff2fcf80a3a7c47ce62c04b902634c0234c11290ca1a9e24b90157aec56dcefb582d08c422f24af2367585e5248e42778ccff9ca74caa07a8d9610831488cc0628405d46807d9c3083524c126d8a880d463fe54e1470964ee0bc91525b09af8cf79a960c546edf75201ccee7e273362a1091bbef61c2e3084096498bc9818d34311ab0b8b899db8858913865e43b63022e6880b2bcb0b05242f14948c5e4584aa08ac23dc4e20ac2dab2b3c786cc1c2840f204aa082bd8e8408f22a72c3c6fbbd8ac410c4eb08ca0b851f585ba68b85455b2981bc8a24bd8a20ed4eff8eece5c009610fc491664942bf97948b96ff267e33e6ff84b0a5959f650cfff13d803deb4760db7f77c3b15c0610d8b3be354c585786605dd9f919e173708cb5e2bd78bb4bd918f2e5bd789b7292080d80fd3607a006411b00db236412a12da8c4cdd646b16434030000019315000028100a078442a148142649b8093f14000c859c42764a150ea420865114c418838c31c400608801000460684aaa0b0051ff3f7645d252a6080ea2c8318a03635a145f9e1a1a4d82c964bc43b2feb51edad3ca5789b951bbf277f0799c680a5f3834e1dcd8c36e42aa1bd9c87ddf429440cdf3ff0e6462f2bdfa6d949628e743c7302c57e0e916b6366a49c023245a0a319399993433c2d57582df923eb3b84780391a35b9f2c3c10b2aa4485d5c882f1693ff13a063921c3c3350120b2e8e672bcd81c2cb9591a266179b33ea274ef3b558a968cbde2f36c9776400a0b4b962424055a7950d2957e8d6d0bd493e486469f6c27f7f867c95e074e44e8a2f946e0bb2c684130f3894fa365ae2b75556803c104dd41ac44a1c37215ba598e1f0c249f420629a02801e6a3a40a6a92d4f21631940a816ad26752f6b926de99307229109759e9a99cf22cb05812a65caf2ced5fc762a22f9f4c2d825ba9c082936c94b0e65d6231cc46990f9d291c8ef33d86fc8d2b4905e7a9396c295c6abdac3b1e016b4d5e396b19594947fc40b05f0ac726ff1ccdd568805310ca93b7a80a4b61a039ad6d705285f1ad3006244f029adaa21a6e5b271f91431c703152656c088420c68c2641c10bb0e51ed9ede798d36144cb161e31555376f23b35ad917e5ff5d80c3ffc37bb9b5f2b439260a9f958f66c992282cc2f800ff3cd6798cb7942214b83d87fad64afc30526ac42d0a838cf7f8a53374121e993b527a6a006a94a9797457ceeb35628cc0fa7198afe1f48f974b4be6be512db12541f0889ed12eb50bb63895309b7ddfa405363cfa70ea9843069d43c22b045819e88d93565d4c55655780742eea209aaa858942793f31222f91635cda9f3730a9aa44e34037b16c8a26acf96c4a802f2912e53f49733c647fd1311f900621ab722b82777fb23206942c6bdffd810eb03aa6a07da640711841334f65b03b94fff531711e151c01750b629b1111177060cabb2f50f6b9ee8011cb0c89caa65c8e02cf6077cc5be480b1e9fe64d31cd1c97704c68046982232f811724fc49f565b3d1f751f644e7d21b12f9e4d11938ce4e063bd53e84f2afb66a429e62b3e8e8ca778863f8e9cadca3bb8cd7e021412e9c8880ea4cf7e3245c4ca74021237f4ce5749083c837a32d0ed008dd1f8e803db7ebe58991988e0111fc738aa4f5ae60cc4b18483f6db60826418c6ac3aab1a76b5fef3aa6fe6f84960cadd74ebedf89aefd7127fd32b4273ca0818de9a4bbd67109e76684aa8c63760aeebb77ac5a5e902bd58579725a74a94b970e30415b06ce023c35db6bed7139b429c37f02c26f26e308c425111d76aedb9493459711cb555683722c4f12bbf306051e9b94a23bf317e7c65af25fc88fbe961b180cadbb02b855401edf828371b0201542e295112c08398458e118d7b91e623a011a1e83a2831e9eda48492101b38ecbe8b17152c99d4663bf1dfbaa35a2c496eb794a800b49406383158af4479f406d667eaa6c38f29669b3244a730b5c1ed225f1ca3b8331c20bf03c7e52334ded23cb2c830cc10e9b3b04c8da0da83561a29f1b10ac9ba1b9172a13a395882c9608b089cfdc51cf0d81c148c84f17aede0fc5afa6adb7a219d72cd2a887e76985a866a7b0ae3d9d11150d7940f975fe4a7f250bd7822400903772a6de3b05cb5eb689a1699a96d5bfca05381af463ce5cdab1f1caafc6b969443ad7676211362bbd7b93339fd36e51f873a9a551d291d5bc5d8666014ad7f47361a1508afa823c0e1b7b177b5583e9419949c6cc043c42ea264043165c0e0de0fa5758a5e736cc932b72b5feca2a952e520145ecce42e57f936ce0bf615e5d497e927e28b8051df6c6d21a8702ff921b6c66d74a6441c296d66f672cbd8ce06d478006c2399051475f36557eb728e6c3b811e46021cb9235adb46ffed593f9a1a517c8c8fa648874c0313d4f0fa11878841dbd8cdc8a337a4747943aa794488a923d81aa420856b3b34ae211318591d81534f7a60f51f532a29170a6732d08b712a8ad0e85205c3c42011824d115b7a7a8113541acc1fe51a44ad9d4e2d8bbe05f8e60ec71fea56797c1850b0ceac9e75b78212f678d09c4f6f13708aa496055ffd8688bfe4507914109441fbd40465b90a55f040ef2b748a0b81763f0013c268d95eadcd1d8ac7cae529bdbee1858793e37ea4d2d26d1d232339852a9ea074c26082bce0ecf78a4685dbc9a85b3f31d4e36a3a2ec9a1e865cf2438c566d4a3aae18c0aafb234c5ebb566a2d1c7988b92864c9f76028e78f590c08609419e29d60a16c5db56198c48a3b25cf2f5194885349b13796e1ab890920e8dc5760ff40ed228f97b24933a54e8fa596a731aa33c029849e5dc51a5444250caa89a7b8a412a61db5f73ecf41c8dfaf340ce3a597d3a4015d60669f1cf7370361cad1486cebf823321f7ed42fd8e6cd7d0aa3f17a3280a3cb3bbf0ff407fa81a2e2b184ab823416f03f9ec2ed1111fb543dd16a5243a2595e97d392dcbffde00d1dc8d9e46217bfcd01b5c64e2f444ad610bd0cbd328e680cde4a35c62322e3579c8b1a08518a6df0bc8bd83191e7dc3cc9f3b65b5599dff5ec2c40b6e8e066e1e60d24adfad98983d6fc9583f8ad5821bd212b413104713337227d74b428ae3728e0129750879797693910bdd875e9b9b99db2cce55682207baa392c382400d3341ef00e1bd5e446f7e5308daf7322cc749c6bc9a903d470c9b96ef3d5da83559fb8dd2303e4507720acadd5806e1baa52aa939e37cb685f3e2b37138274680edb0e23a3ed5d636c1ba9ee6ae6b570471c1cc020f197291d58673bb901dddfea32f21748f8a67ae7719dc412d3261b548791e3a5dfddf1adfd3f94418bd669929cb28c1b3a378e5ed068e6a340a4f477d8045794a3ef70e5b5875a3e7a55a2768c3f92fc971dc4fd43635797357665ecced6bc9f6781830ac8b4ce13369df8b19b76ddce54187200b6ab42b47d8a80cbd7aaf20061dca9db79b359bd0152fc8edb664d68e6ecb8ea107cea95b6133e909c43793b18e177f939ad3400ff6f81a1678fad67913d4b4709aa7f6e4a80d310b8dc235c69bc26d3c246c72b5eed599f3d3070ed40eaf6e3b0f842c14e74b4790e12301a38690eebb58e0752f1649d020c008a25bc4c890fd26c3db6623f6e814eaa3007268620eb73438334966ae3777aa9494313624110e4ab3e51767b8faa38dbc9cf59122dc9e1b32df275c5be472841aa5e94710b621e0788ed2a4e9ad96180289cefa634cf181cea0a70c8b15ae1400d6e9a81326c14a7f783004e174018077aba4d3b99016db122ee84242723227eab4133b9e5f10b8c654b2e4eb5b9283089307509400bb315b741b6bfaa67b9b68c82e22f6ddfcc199c37d8bae040cd96fb45f4ad687e94656ba0ab703b8609c0ac4a5631b5bf9d04fb6d3af4801a0ce0675bfddd6cfe1310e818285f6db15e3cd550fc71830c678e8ac6a54a49b939cead2c5de7e15e9f11a77d587bc50dbe3e0cd2bb0546d4076ea4a1417d31f6116846098b828f983bcfe3e7b4e19b4a38c57ea249cb181c8ff6e8a884e0b386c978238c3718ebc26dd00e305f4cd1ddd3c27f5757a534d5dfaf616f6cb36e956a1463fe841b35fc693b1cc08fae3a309d733f5492d5d0075ec867a290ebd61474588d2b1a8f51f1c8293d1b0895bc50e17728b393f4e9b60c278cd64bf47f8f6ade605201e259defe905fbb3559fe23fbfb7f2b72c49896c200ba1cb7c0a584d46117620445c93ab583208d2f3b6e279ecfa022dc2b3d0f0ad6ed2e838f2cdd6ec5de24ed9de166cee72289afa82da5ec14d73e40102a2879805be5f80313c902e4f3756e7590acaaa6687dee7dd0c4177098f9f44c0602ad0ce7d7f452f4e4ee6c919c9d3cc5aef08577b714d3793467970b47e5ddf482aef04f1499c86cde9ab61800573caae9d0fe071b2cc27bc25f3e593ff9e2f067358420f924b71ce2283977b51d4800496916508db7c0e830466c2d463a16701dd5bc740018eeb241ccc8ebc326db6e6468b70826320264437e88b73eaeaac521730c833b7c5133af9abfdd08cb7b7235cb4769fce7c80d5eb3d182526b5cb238f45aa24ac80514557d33cbf3b12a38489d50902cfcfa5a8da72ddd4195dbbb9232a2e24656a7b1c4c50024095cc8bcf86531e376646682d0f5eb9fa290294c47fde8439f06bdc08a3235d81951ca4adf2c2d90fa368e4144b0e7d8374c776386cbdc047449e3e9ac9569d0bc4d40fd21c9eea2bb296bb66db2486ef5d823acc7dcd9322c2e9bdb9cdd2e4671b1774565904fb7aa44c8ee3cbb98901b32fbbb853dc23d41812e0cd5224097b52e85b42054d028f52624f1f21004c14fb5c76de2186ff745fee5e4ce7705b3f56310bb24f70b2b2320ae476be1ffc0d482bda4edccb0bce0e5b3e1eda108fe04b8109004cc6c60f37906e8067ff1fcf0560996006add46e051045f18b77a25f9a4729a8931ac373acbee3d2d3f7279a15b12c2a55c88e857f63d40a08277c521d5ecc6b81324b58567f0c0f47dc2b110245dabba01ed231d47d7c59d4b4fbfe0f073599024bdde2d59b437ba84e24dc730b8c2f8c70b7188a6238363d233b097a8b725364234730bbc00cd36a34faad355dd71d700266c73209e062e2b66cd4914b6f0c3fce61136459bcadf887c37e80b1b9ab0224f58ab1e5d2d6313cbe594ce9be845b2f80e5fbeca50e45f30c70bfdad92b38fafd452c5f3ce854f2f501f1647cdf5bfb3849b6969cee681cd35444001b4113dba604566ce0eff2406ce3232bc2c950b3c8e4840af56200ee94a02822a421e2e31acd177813832722e259baaa1957882c93a3a14fdf013fe0d251cb740515d8b23f8d154d735129ea6fc3cb16e888fef4480cd1e6e05fb880d78e5b0273233435b99d10fb4df340ff5d4ba804912b289081f1ca8169c860ec58841c56e796b475bf79a768c7179114e72a50708d89879ad5d54e06ff94861e58f0c88b7d645330b4f383d70fdf2bc9983ca46ff73cae39b26674968a2373acd453082a5b609f0391c7b444abc7889871d16305667741ec59715ac3ed563b5ef520c1865327bd17ea66f44b9635b14474630202ef6a81a538dde972a1aea6cf53a6ab200c55b02a69a5b50d6429af5a3354066ec138a2e60c5606ed9b15b62e9c76c3206080917904022edab2675a356c49cd880bd84a29a8313f01e27f08ccc5ac1f5cab0f166aa759c3a2da583ead5d0f938756f5d07a84c1003d421501390b6b57dd44fd627a37d8c3e512d92e6624953b0e25c56db7b27090e6de4388061aa73510e639cddabc880050c753252908b7fea9b9b34cda8d229c9a08415d3cb4cbcafc7eedf155bbf1e23e9ca30eca6cf5bebab8daf14201ec1fd0c1ffb709c718ce51d62a97a062dbccdf0388064a176442714a6e219e8db8af6ccc902c64143c8b3af98be9af369a87602e457e5730f573560870c6edfd22c1ac38a4b2c21a5d6d1cad6778c1f8433cfb3c981fd9c74998952731016de1dc528095aea92ba346117128e0bf0e21f9525e1967a0d65c3a76bba9045acad3ea439ca1877dd99395e3ce8e818a6b17c0673311d215822872e61f8477963d2c33bfac5adda608084326b609c95f8c16ec145478f08c9d444f2a481e2873230d5c461e09afa05a55915c715101d567bb991d64209bd54b249885642d1c1339311cc43e0771329ca763c5ab832a85d9ed1454c77a82d34ca55488f44dcac4bc4b26b47700c6728b046222db0a6e31d4cb7abec1f7a849ef6f98bc7020d2761578fc6f9dde8432d1d0328bd6add34f1dfe7ff63bb1015abbfd6e2bcd8201a6b80d4d5b78ae465095f8e6f5fa32cc32dbe6b5e6a31243ecd3e603150c07653bb8f4ebe1e3bf1fc120e990ab44899e85914c18ed41935d149de3bd6a154d269c2c42163c23e3ef4b201ae49a0fc82c4ef29539d065ea755ea29a4b7a251537aa402f99ffc7fba3865cb1352bd57838327203232b5de0cab250b5dc12e0a26345429aa018b741719b73b63ce06e3112b90aaaab5d996486eceb87af30fcb2af8413b635e14e9bc006d61a4c565e5a0f6e0eff4a7044866754682c6bc42b32e9d4ef82681428b2abb5c99d00881038657fb0e399a9d533191972a4e19e116caaba872e2c652de30b11c41ce155e96423be7b3e43d9f0602c71cd9292eb0dc67410f4d05e776bf5da45aad4209a547ac6864a939a16ff6fdb83a3db188698d272a6193a10265cbce3418739053a5fb410cc12694fc47e3fc5dc0e681be710842ecdf7af6a548100a7879947c169a516ab7567121a6a61de5e123aafc94d1719da8b7b92492c8cb56428f710281a0be783d5432dd9497c963a10b6d8fae364b5009e7253d3cac79a6d4a9f8ab9dab781e486b34adc604238a40c7ba4fa52bcb19e4bdcba5427b1c5d2331d45108352e08afe626de6e351a663e8b8a234b3f68cd66879ad7a23460db41177b28b0d743d4367b41794c4b4646da327dc28867783aeb1046b4c3e6485f7579a3e79f1e0e04832ae8f94fd20ca54233d50b9cacf07e2e121a4df1f59addec26d4c41acf4967b269a0bdd9a51e4b8e1d2013422c188d35f9c9ebd1d8a3ec004967ed6c7963707ddd146d2cfa3a4d47fe154d05dd20adb5c4621a1b2d4152bfe9ab6bd41aba2ec6af41ef20431ca98ed4b040abf52d17b13c1c187193025a0901d55eecbda51e10ed736c97d856ff8feab8cd25654dfee47a64a69bec4c281e0d168f1e66c31121a9065eb127d7af4107aaea516109c4c23f5635233ae8fc9075f8964c45521454bda80c06180af85f834e0de9ed0238f43c4504cabc2db831f5d3a7a315dce8f0bb0e8aa3454584c525cf5a4c51074a0c8973d3eeadc14390e4a61b0ce8a38bfd24915889fb4aae4192498d74588f6a3ddc4308bd83f3e48b881ca4ff49ff51318f9da0b1843cdfcc221c69841fb906b4189af6a53ae66ec9ebdb883faf2174a66fad42ae30e21f15bff64047fde60fde0f4a2acbdc26625c0769e3ab9f565c0989483dcc9b6f929f2d576764e1f432b1cf9063e8cb3cc21a9ec9ed39ebe4fb179a4a5896130893dba35818d84961a8c704bd50be25d0afb25b7c3e531423f6303abdee669e425fc2f1138d1ec694b20684a76a6c8cf50df00733249aa51f23e1c8ed86dca0a520194cd5caef181a0cdc9c5d1b38308f977870fd80cc5e1c16fba1a7aaf171f765787d62f777cb4bf7bd632fefab042e1bc4abf405fc8d3e8b8bb04afa23596bbe6a040066837ac7ae6f429706be6518a16ac719fe62fbfedac59da0883b298ee68ac67d98f05b5c2ca7631af08b41558e9b2525f0de2b3b52adbe6c52248a25937680f4ee2cea50135302c66dd6cd360c95ea191057724f0a6dbbf7de2e4ecccb5799074df6fdc4d3dfe53d554b3f402baff6424ddd888c7fa1a74969fb4551e7cc3614ab428794bbe8acddd1879e45ee659eae1e91106bed729922f1770f780eb412039582a1ec36d3c33d4f61b884cfc5a30d4644fc8ead73c674796565b92c3c7f952f7c52ce948037993ae5fd51bbc9ba64f439ec5d9fd50b9f5b5aaec1f0cb4e3e6f1cecbf7366b09e398bed4dae763e63134d32aeb85717d0b519da8a9be9cbd33b2c8b37690cdcb61eebcd22e7b7e71dc5fa8cfede8892ba43e18301470a1eb2048bdac25f52916518f86fc6d25ed31052bfe13c286e91583abdd3f1c078606e6f6312926045c180f89115454c4565200a72684240c06e2a4954f5ad1f78a97d8289ff0c328007e9c7303503c45cac22470e9140bef40f1b15f00d95d122fe05fa9356d254e35a2c5cfebba34c1f4e51729709ff545355f752c0eed568bc6753c206eb82b8368c8fadc2b4efcc497180c3963b0cb6aa9d3c3b0535f6361a01bba5704e6ab29f3416fc5b0142d39f73a2dbe3d26dcc047bf9dd83f220d461171e9e62d316df327930c01d53bc7c9947fbd9528ac3600d656fd93e8ec87d6d56242fadf7c8d11c537eb47aac55272846e500e4ccb627c0f9c014f9eef8f3e65b72c22fd9899390657c5a4dbbd8714bcf8e0b77a4ccc38c76b5197f21de7f0f41008cd42ffab8e85cfde367ec6cedf19334659923be99561cff7d30d46b8395333637cb95ed8a3aa6d1469cf391b39dbe31f2128fc85538b33700cec1fcd8e0ce743b452dba202d4ba59a6055a6dfd856aae490a00ae262d20ed9edfdd259e2dd91f4ad44b1519f6f972eeca4febac511fa1bef32388a52082b661889b22fdd89d6ef704c257d49087e129fe34ab014c4d4a0caf538962f337a23b7d567865457f26eacffdcd11b14cdbda96417aa5138bd74cb2770ed35ce0f47129dd438c77e168f887146f1a50fbc05b5ab75c8c7128a983c2822a82c4be849f133b89e8f09611463bb0683492d0f085f299b40c97015ece53642307d46bc6011784b6d8b945fe0d3703f1af92f3be50f574ed262274b4281a2021dcf49630a6923d203853b60aac9e1cb8bb98577b9fa808317faa45c5f153639619434366f78b8268d32b4c5104eeb3f84f5e92ab7b545a11e762df825d0f348bb30330302a71f36251801eee14256b74c6faf099058a1d2d34ad598a2c32f13a414454a07fa171d156f7e0586738cec7b710a6723eb4c92d66c4921f1f7838f79fa61669cb0cf34099750eb14f1a5b3e06e1e796a7e12b7d3afd62dc7945d0818e57589df9bcfaa54bb08e21e60140068bec4c867b116f13968f0a8e3a5b61102ff733c34d605e2f29c90161a03406e207b1247b7a107ad88c5de197b358f20fa3dde397b00fa181ad85fb729f1179ab1ad30ba18158e451bf916ea551a1d1ef75c2e8cd8b6b213185190f94e27d1ba1c44ff8fedac8b7451535d1a4a1475ecb0c0661769a1ae7337b156fc413f6c7e369dc13875341484dbc057b9aace0168680aa5e4adb8216d5a4fa2487d1ac1cdea1152608693f04acb5d583252439430c89d7b31f09caf3134258f91f7e4760811016c12a6829c82cf095de06c6469a249f239803c9013b999f7a48a9d5c5cce12c99906c3f98c15cbc927ea2b5c738c0d4a40c6d312739801bcc57840edc4a96e05b7f0e554e8d4031c1c5a8549859880a2369ae437fc27e6ba753c75b123e5ab1c1fd7f4d62a5a1b03df327bb91f4e661fdb9fb726dbcb417104130a8d97035ae66f3b4f6745d0612551ed8f4fff91388bf1f4643a1783f011b32bc755428c47f47910e6052b061fd58486f4d51d5509730878d92c599793cf9d124f7c15700d3b4ecf9b876623ec4500637a2950ed82f9c9072923d6f52d6c4a134a4eca6927886163305abf70164df499f591fe875df1d8332e9c057f91d7ab09876a93ab0ccf8d15c30aeb603880ba3d44bb05f5cd4b511566676da11e4bab3db2faced4101ddc1a58b987602a059606570d64bfd4a47fdc1471b1ab0029d6e7626f63b32bb88169f6801365b355265b02fd64c489858edc84a94890b60af42c9c0630b26a8e117f8211f2020a8080c4ecb754b51ee9c15cf281eff20065ebac98c6fdcf88be1d28b3e2f092f49bb93969cf20281c853dc650907c97de20b08f9421c2c8232ecdd98f8a218ec9367bb6b25aefb3f23f45392c59b0b0a52f972e5ab8a93047bbf65de4182e4f134814acdea8b24300635b8ea8cb5052be2866c7f83fc587e7c002e01a24d42e3dd4b061d18b27875419ca3cb2eeffffdd2ae35cb29019715ef7a13fa2cc9c22de22adb5aa512086d0941247833b0401645c8a506f8a564170690af199aa3a95b77508f2ebad9926bfa5bdacc1a061eb9b2fedcd6cf9353f01e1907ab813d3dfde33780e95e871b81f4df817e64d0528114508761d414c8d3aa019e17bc6d00bc6f4dcbaf0b16aeb7cbed780e413c857c261079e0c87724300f81352e60c954a229e9c406ec6bf982b83e029a5158756480083edab51dd6aa68f933b57e5460f502a0351886852bc8308588af2586b9067445146b0143d33232b88f2a5111263b402dbdfac804340fe57a36181ed46f26927e036324beb53d5db159ef2c489187b933b8af41833ac91f964c74062f23348c33622a6cc58b5cac24f8e8958231ce00f98400d410ad3333a70c3db09117741bb4065e045a3fb80115c9f0cd12156819864c94ef4205fff7af11d469c6c4b999529e136074387f7f0bb10c253fd9c6eff80e26e53733294dc51ea8594e5341a9b067b0f9ae4c7e57db8a4bcc3c15c5290be7a91ca15ba82dfb094aa2973b77b110e10f4a30f4a6e2d820b864f34370b5b8807dca6151871a5e0d686683a0ceeb137879b2f60a505a239724132b1b0085ac88fed2b40c59a32e138c8b2e3220dc596bf07efd38688ecb222bb2de1540aaaab685aa4deec80c8e6b2a1f7d5cf71b996b514bac34582633277e8a04f251d98600b542ff3a6c744a2106520bc141da4ca679f45b889a7f5f96308cb57049a5d3bb0385ac437dd51e490d163a23f372611d1f457b07cbc608c27c5a0aa37cb0202f2d2238373f417528cdd5d6cf7034b8b4cd82c1a4228d6e1ef7075e2e029a43f1dbe91918b4a656c15a1c34d8b93a67fcd83a8ded92cf33da3951ea776923988c2ba98dbd75208ef85f9da2e7dc789de91b0f7298d24efc2f9ccde530707fe8ef3c0db67c4215445a49649b30548b140384e0d14ce3df43b20b5e5a2c6e47e72dac7eb2f930ef81a716e46279a4109a6d6ceb4ca39bab57a066ca8028464f96e7fdfa071d89b736b6d8866ecf07c67ef6ba602d5a24a5654f218b0efa285a7ea9ea9472d352a47e30a7333925696a0f067b5a1e78166d6fe7215438194694eb83ea30a63ddb9639362fb8388f390048b96be6806e9d5a728a3140678b521edfa293c1994cc1a0f50c2f552c3e37850048b85b739e93a1a3f0bb7a1601993b0602624cf3e53ce94fb68505f6cdb1af9e26fb057c9bc83d8e1eeb5950c503722f2d412ce73abc1c7e6d1d59e5608c69103b2edd0282b750a82790310cf4135133b34c9520abe9f8204ad9ca948cbdf155c2c5bdbd56419996c2e92376ed7f13c0d58f1aa9d4040b9ef835b736a99756955a1b7a759bd71a11b6fb4195289b24086025ef1a6039131a63288a080aef7aaf65ab9079fe7c40a8c8f8cc9c37d3660d40320d089143c1ff57479516a59f4e1c6b33b68d5a8e87043f479871dc5b8a43db14ca4b0395e4444331fdbca843317251b0a0889fc404f64a03fd4b6471bdbbded85f1b82f4ddf8039c1df372a53051d1bb20b0f933318e2e39a2446d161ecdff92c2e80b68888c0146602ad300a203923c559f3e11a0b6e9449623df62ef936e007c9db135663f745864a8491e4080e2cb5774a39c27c6398d9066894ee5cd66105f0f3b2f8312d3e8f6ea79cafda22780ba47fc7f76b2c80c3555a71736a633a6f7fde4353a45cda01ad62b9818fdde467bfebf8966531873a013d05ba0bda682639e1966fabe6bf46e6814bf7df6cb5414119600bef8d8892db823c948696ca258306e1c1d2b02407981efa5cdd5441ea1570efd86815d898d723ef94d88425134c2fa92bb87543765225d909e226f5786b5f105ba9de4081d8d72dcc955b703727822b0669cc2666793845e760f78798922d9a956f9e56aece7fcc3751e7ae681a5742831614e8651845e4346c1f563640c289e6e7d4180ad5f73acba0f79387055026b55c92807c089964edc16df95a527d3b1486d0f0d74af0b4380ec358c0879333a3e4508b84ca8982f533b82cbef3bddabd0e04585ee35f84ab0f57e33aa8ecc363095b60c03bae290313e35770e9ada90e041acc39b4c4a08882f8936af089a43b186860b01313d642df84f3710f7f8c5b183182df2075ada900e88782df9b2d8dd519ed9914c16d84c231a6b1130d308fa3c92842bbd99da2574e2bbfcf8e0aba0f06cb1bc0e0914518252559bfa2cc50b2b846825e9c90ae5c9d9f2f80821d80456e28e5e83302eacb58c626d5f93f469796eb9c8216b398ea7e151378f64aee24864485c9010256a8394c08cda9f1b4c26107a4bc4902a3ca8963808598104d2f6734a54b2a71cf0dfd893109d701cf0d61cb197b6dce6414e11d52a12299d006c9a899ca71a615cc865aaaf0584ba655e006e8879a6a2c6116986de9647863c0025918a309d27ec83430445496503a5cb4c520e134c65c9a6b8234f1cb2ff611dfda497f5e919f7733321af288009b1cf7ff565759623f2aa1b9c5ec091cb050f5c20b09204cef1c51c5a7ddac0a0959f65e072c1127bce32c8c40b5357408f7c233e261c9b258b8b156788f4f2b3905bead2b254948ebc66ea81f92df4d053555ef4c1e13b866e458a14cf4d7ff5cf827ce84d67e73b058517cd9d9b2b0d0cf0c03ffc1e260a26283a0de4065a63c5a063e948620601fb77de7a48a933d90443c7bdccb47471ba85aa4ae033d4eb68e50d185942cb487972e23af368efacc5a521924644954813e659871f33111ebd9bbf302d1afc8e7a91251c48b5a565c22e54a30e3af0b21476039c462c736196515386bb3685d9d26fb43fa15c6fd985ef725af13800ebec9c59ff97dd2563c86349b94199830f26abcb99ba3755569e4c8e91ee0b901dbf0422fb8233e5610442ac822bb714e42a833ef86266160dc0d5fa25faddd9ae1e3921dbc073ed35b77c099890503a223fdb2b2b9d3a0a9d334b3ab93c123c28c084fa2431c0ba988e57aa84456a73c36d97735268ae3b735d457de21b89866a54507a07a8d4cd4565674b315251a9cac0b67ba5ccc35a97c285ae5a8bcc89d7e4344f1d8ea25f4e0a2c93091fe5af83ddf5115f10fef054e52e3a0ddd0aab8dfac1efc923035f09cdac3757ee2da383dab819ea0b0ae22a4b11f30b26b51290f6af3fc2d27066e613c3da1c35b2ccc6a501b0df2f1fbe5f2468bd20bb33f23626ed864a614e8b77cc708b541e6b7feec67c02aac55754e1f09d53cba678578cbdc14a21bd14a0fbeff06c165773ce793063b0c28a6468a71629f50bb9570819110bba5ffd6698c4aa309022c0845cb92e77234b6351cc45a175e7b498c919983246b1bf4c16818f0a40878b1999287a0115189699f38b8b7ca3e5c976e245676ac57a12cfe724554fe39972b7b009e8894f69de4592f74f29412773c559970cfb085dc83c0f0338e00cb459399ede7081dd0afe50a5e72700bad7879262ba5665a31139cc77490ff8e55456630a38d6b26e7ca54866a4c6b07ee4203605531f4c76f784c72b8991b41b224b30aee175bfa2129305a309ead21271382942fbfd8b1d634e5d3c407248fde1f10fb21c7cf5962deced4a6be6ea90f53195ae9c8bd6b8cd70288671ca0377ea9cb92e3252d1f6036c14a73c13f1e9f09dd72095c2b7f18da46406e10181964224ae348064e3ef11e5c2efbd66a708990c0b08354f834c0c0db04b498d298de98ebf74957802f385720d980107013ecbac11fd8726db17c903ab6c79128602ffb471f3e34fde759c4bf26940ec451cbd40206ff462e4d62e8d72270deddcae4f3a534f36faca5b8df0801eb689beabf1e8c7176ed95237f9184a30bcd5513e6fdfe38a7cd9d6cc71270d63370cfccca04cfacd05f5f726ac41db24f0b4a3099bb4ef02ebdab9aede08bd1fa71c7fa53d09df1f26595648d7c1f2bc79b61bee67b9fabd4b03fac23febe146447b7b1004af3d41758869d1e013d6e47c2b176ac4ba8105ab60e7dbd2fd080372352ab202b51220484297019c3af7ee732ee1ef8aa215dcde6156a2935d29d4834c953e694beaa0a67b88606e3eedaa971ee2886b43612b127b1a181dbdbf79c0e2000f501ec8f3d6c9ae4de7a308cc4a2b826c90102a7dad7be6375f581511b6d24698d1d4acc367fe309fd01f2211ed6bd1630b691a1214c420861c84d0d0150d198e0f098099539e80551dd1d654c9623f9f455eb21e82a5d1603f452d1e1279c132d851e78238b37164faee2f162ed9ba359986468815eec665b69ca62056dc1315c20f544772e9c62beb82d24691a107346c5b3c56add2edefbfc86af8e9e891f3eb089af1cf5912c5723cdce4f01156acd2ae4c0eab14385bf40a6650d99e23b11d51b8c1000f273558f2e5692fc7b2ca0d3700a99f2e9f119ba4375113cc2c6ed0e00141376acf315190e6b3b4bdf4a8ff1852d901e287ae2e1a9c1115d295429a72b1f89be47f19839e9335bf4fef81df0743641f8881fc83f2f42c0f8cc3fc549a089d18e434649d25d181808ae6a2141ccf1f0d176394bb8fd14cb0fdc71cc3439b300e87b119302395accc6568e9e771a03e6acc8054f2c259fb5616e288ca34cfa394942b05a749d5b50f56a5db720a507bb95fecff271b99c59497b443d4eef7652724ac2c731d92c783183b22feabbfba51bf53b74fb5a39d48d50ca866d9da16157296972c87c994b8b5f9837065664bc6715a19b160de2c69dd10a7f809eb1872682e64b790ec31ae7a04670d2e3550c00d3457d8641c624b1068ff063ac2b86b8c57c63d5870454165ea6d77cc51c6ec244b86fc3db8eff6dd67d33467b3c53f5c60d116b3c0b5c5271fc8e08700478d1a4f63d26539f18dab2e461e1452a48fea340695957777d811b597f40775e0b543daf73acad085e9ecee3515728144b7926f8a45f14a1ac5810fb8d98e00b024e16a60d17be6465f6beb7331c96952d5b21d817e465f81ad9290a9571e503659061fb33aa6cab045df269baf34334c20ffcb1b6c870c9626a41d449bf7e8363d218329320b4033f0079f0795d40f3205835d456493c8354b6e73e0f7ee49739424df45db73363654f1ac1319cce184ea035939e5400b27ec3e79eaf34e73260ac6b67b811f4a0504993443369995fa73f03cb14b6824f5cc89d965ef85206311f25455149bceba308b837dcbd7c3af1b8ed4fea0f78ebe51d02fbcf408fec8478cb6772b3b05b67705e5eeebf83635a1bb2b75b56ed43621839afd7fdae5d3bb6b92a1b622805769464270336ed6ac4a1c97b2746502f5f0fece1653f9631aafbf6629fcaacf116720258c720e4ff9fd41f11cde52147da87478eea3fb137fdcb6efbe92005185eac505e2c1a34946d2e91b74eaa29444581fbdca93d86013157e8277839cd82cfb78f6a63c6abdc0834afddb216efdcfcde3d8653ed75ef8e245f113fe433cc08fb5a529e6533a5efad797d758536ec40500289c2ceb4b09b392e24a191261d6ff18f3baec651ee7810704929f84e99db8dc5d9629c8ad581e22623fcd2562989f9e2d4550cf5d53e89a29907917b18ff49a25de31eda6a60134040b46423069a963010ed33285fb15fd6d178a704fde614a45cf2f0d63e631bbc8cca39a28a01f9f8140081e3e96d17ab7e303aab8d3a48ffa48af490a2855ad3c9f54c10a2318a4fd1e3d82331c777531004e08979565914aeb0b0533968c756266a2b5dc2e4705021ec9fb02c38d178a5eb04268df31530345f3ce055a67c5473f49f0916619d429d8859ea2bb71179f15c63be8df80c723a09789c055a6258571f5578cb630854f83859f3821e5497ca519d224a4e8df97cb399136e9d970fab4cfeeef584a5d22c5ad06284232d19553a6af089af2a3caaa6753a05a0d3a50117c0666b3c42e59b9a1687353879d6c56c11b6e18605dae6191e63a3371694b26f7355142b8fa485733a7012e22c3e67a263cd0fa0e93a8e55674e7d2aee4e64848351274408cbc8b7e68560bbc6be5b0491327efdf47859a7ce6dc57caf35718e017b78e5b573db47e9a7b69483a83f430c4b86cbf1c9feeed17f412e86525d2f8a809931df10b5cd511c54d40f73fd4d4347849e390d7d3807f8fd4a8fb16811c0afe4f68b88950f7309fd9cce104e6940d967683b92491c13f5a5a6a773c5c8444d2a52c994968ef7eccb30dc4856a401a362c03f6b019b91deebe423e508a22b64d1332c0bcec831405edd500d33711c34e8fe1bbadbf7451e5db4de9468c42745daf4c137b8c6329b595d37d55a414654710b407475717a0d8d2a51eedb058cc39a26f55e8ffa200e3b2c87548c6e028cd82eb746de0de2d22b08c005b6df6b21822963eb7f3c335ab86db962350cac37f66d7e76d09e5adcb213a05d8352e49056c18e8b369ae9283891b61ae7d9bc0eac2e949ea833cfb7671a2ec329cca92cf2c338183ccef5a49645cce5ca21c9f743c8937b074640d2cf81076a6cb7e88d919f890d3be1ab251381bd43f6886567b1fdf32fd2028551347f3499a030ec24d0208774a74827b20bd657670ee4bc156e104b9aa56523b8415e811409ddf5a426ef9a39e70bc5a4919b7d941c9265e652a87f9244facdea5a16430f833f25d107f85c5bb585550681ca93ee91118d190e1015690f62ea6c75e534b584fbc583804e757551a24610c95ea5f90e5d4a3957eccf9dd10e6c412690ce21767038c73a9164b104e6c441d9fd12e7ccfe98fbb70d2805e264f4f0f61ead48d20d0f55f1b0ff5ca8cea4a87376cce319cc6b875cd773b3c9a0525623ae81de8a91805cb3a7dd3893130e40476e0ad53bd886f16570442e0d795dbad471f897060ba5f022c8f72d359198b8cbbf2be3a157b1c1016fbb3a6704cd64c5457423938457f6346348b792f6963f6b598661e252554a586e00abc624a0174d1e337e64092bfe32965be53619b080b4fc89b3489794f673afcbefc33858053c7921a052bb6b512210dec070d7af76c962f3a264b24f67010fbb2b135b02f75f8831b5e491079f8c76b8bd1923814d4a3d6ac6bec0f4a8d5d1f347daf9ee3480fdf709ec19b12607fb7219fa20f3150c82bba6486b1f83e2896d3673b4bec32b37c28c27dd9d413e7092d58cf80723a0013fdbd81a48550b29baf18333fe34941f9d116da3779cc93d506c4c24019384c5fdf3574c19c37cfcbb69fd4d7df28f629bed245b255c0036591a3a7400573d7c958ee07e3f4d418e8dbbed3daf007085390afb8efad3a008c4b5772f58fe3eb9e6fdef3c67ec13325bd783ebf88a94deecebffc15185e663af52065b47a4bf2fc56b0ae4c45002c5a9a2e129307006243d88138dec16990b7abfc0d138d2b0b29f5796a1aa4f176c183cb4c185c34a1803de1779129be91cc2a0ab639569efe27aa1c002101e000bb6716bf0785d99e25702ec1b1810f608943ab5466b3c9419ef21d40d86d4b22d7dbac9924af2ed075615b48326ddc52e50b8688feea26fb4cbaf6cf30597dad3679e75eff1aec280bcfab233541c861711dd5fc2ec1799d04a4a4eecaac2b55dba90f80e1b1e0f056b3dcef28877b693094799d724936737ad030907c7845c5da9c6772cb9cd3f16793a68fdc6e9364e059b0f27aad080a68d73939652e07dd49870293a8cffeaca40b5c56b4a3611e3525835d86d61f1e386a185b4a12a5013a8b649858de16279f9d86983e9115a314d488cc8cc6a735a702a689306d95447230be4a2b7ee1673bbcb0a3b8ff2713aa33fabd60b0b8505d2b39e7f5439ad3716f4d5cf6d6f944e74f2c26c87a8499d0453609ce3e4058b89ee240eca7a82a130eb5a36c8a2400958e5c622870b565730186fae7aa3da1830c04833795bdac7a389819403318e39de161c2244986cb9e2f049fd9c88c0acdc6dd87abc9ef69bec60299fad16ad1b4d388fe526c2e4716b2cf5d400f43c7a9c2cbff7068afbd36fe67b42aba82d850ee9f27c373ccda3f938d83ac171bad05e2a9c559f143d6f2b68d75ba5f847b880bf715730361ec2746810c834beb10004654c4076679757609949ce3ac2365412eab08048842385acc6a4fe099c6da1001245e2a5734d49d878a4cf2b2c0f5bbedcdb23e05c2cb10e12cd08514f7c16f0924da2256f9c14b8e038170fef7e9f3d2eebb96c03731600ec9e28312a48232d4bdc0063f40128d5945a2b0bf4c96dd479982647c92f4d982339f4d181c45e38f5c3dcadf2baf0fc3013c7707110fdf81d5d2cae02abe33636bc28d53aefa168524363d0aab514150eeb3c9571512834b2a90437132e1986ed4c693c35142fbb4539969900240d3e2e9b1dae5adf15ae0ca0d97c9fb102f8b2e387bd030b40d6c1117c7e58c74994b9e6e403770215adbae0c80532f48bd9aa2921d50a96270181a56d024a44c8c10f39b8a4a817a7266f123bf847cd593b41d6bb087b170983338d8024fcb762b2293e31bf39746434fc4ed803ea33004c2323c5df5dafbb8b47131137411057c7336b06eced3a8039d4bc77d930721cbe056f1b0763005dce71365c8a2a42ded545d668cb880abd50b4bcaa1945d7cec373207f0567c890806d93c7dbd964d38a734273f07df43ae5de34dfcaec1a70961b558679f43728594a92404bbe974bb55e0febafdf7ffdb2d08be2c509c49b59780a1637c912de98e368da19e4770619c9cda868beed4af3a5fe58be6d009bebff3731c0b44836a1852f1a23a82835231f674ccf2235b466b86b14a8518fa048aa6b081e587c18559ae6566cf34205e88ea766201cd2269033d626302d7ba4fa2ddb47a3c803cdbeb3eae3c87dd9b1a40c1b68ee6d9177e12788d23b9043c166f16f8e80a8a14b2ed83e9a35f301931b120dbbb6fc9f9b93b1ca09fab8c5098a6835cb900bd45fd2a9820748ed9e9da0150c9cfb3ed24d389b49285fa960c7eb027ef285f1ce8dafc8e69b8b3ef78f3bb3be1946e926eddf62525f93433cf32d02e4aa6e7e2b824842b5d14c21dc4c865598b2a33293386b1970b76d01fa117bc959bd1d784835eec16afe8dd2c6b71227620aa7802529c354b0e9b00389afa8477a51f93dc68b7bbb09ab4078dfbf3ba6f1ab0faba47e4cfb9b1221eab52f5a1b933e563dc3bbd4b7ea43e8ecc3dc8d04b9fe9f87744c7cfe5ef63959a365ec23379aa5d0cab9bb41ec3c030308680324d1fa778c5f15bd3b6182c71f5011ca8684a2a1319a31664175c56724d38c8ebe1e38e205284f70f60949dc0cc2cf839d509013799c50e33f182cc3a58526128f50220295ebf9cf5d1be8a07d95d318857a1ffa572ceac4c8db29c0eb565e84242b5b329415222cdc86d7df79afdc473e7d7ff74c6591dfdfd3a70d1df493fd0ab28535d8720b55e5c5c0274565e899d245062d392ce501a64345fe12696145f433c997e705b6566f881715181de66c4b82909df2330e8edd15ab37ca56aa8c09de4b2922b2a420b88d5163e1bffa1aedb0751b7af321dd59c42dff42548eff2b81d1e2291ed44316a3988f3332393e7ec0ea90ad7c629a0ec9f660f6ac177357abfc686ede2fda649ad19a3563c666344834cce935e409b0d6e8f2b1b0f890d4ca7e0f7a964c3dd0a1a5e2b618ff5f62cf8678c6b5645d86dc8a9c9857dc49a27d3770f2a10c37eedef9190822a20a5206142220551bafa3a8a885204b74e81625cdfb52308ec2b7026291cb71e37e3d930c98a9d4c01c928c3211e0f1b765c13ba10fb74e066263f72747f2b8f47d5daebe56581ee60ac42da8c99831e7df649ac3de9137e1352a935e5c53bdcb1d7793bfaf4d400cc7c068fe29395f815b967bfb36c93d1b2f0911576fe5e9909fa3c07cf5a09511536a4a90250f4e75f6d231b2b4b1ba12a5b5b126c2331cce245d862545c422352050edfd9c35e629867836b181df3334f64e53288965b487084f208209ba9d56005890cd9cf0a8bff9610d222f6ddad8c63be6183f77d791941ff89eab7519716da5fb43b473d1495a3b6cb0ae311b4e9ef7ab04065e2d3e3228ccef6380e784d7ab71204b9bc3da46735213e9e30264385c9ecd817870201511f62d4de2c79ab5e5a6a446118f1f4691e26ed5550d785330f49cf5fabd45c51b9df11dcc5afc94453008dafd1b10130b7651b8d24c77ff803629a21a9a4a7e9311cfd8d25c6d2eab8b3b1100b64080fc240e2f30b203b4c047a5c81d5f3b78dfae0a050e6efb38a4488141a9f9d0784fd05c4f1f11b3fc68b39990719f844b8f077cb0895a0db86c4b1f9aa69d6c1dc0282a1cb1692c1d9ad9a30e0d1b90e86bd4d8bd3046cec0e7a1dbe6f58a2fb206f8d4cbc30b9ac4bef49fe02989585cb57fcf30b31aadfc1b058227863ab49c64f1a02601695890de5e1f5abb79e91c397500de8682627bc4146410464045680c400d8eb9d31bcbcc20b3d2f72e075107eea31578a9bf09716605c000afd3ab8e35eb4f1295795c5175f3ff79d8c142d06b5740d5fe54760e0dc08fbbb40a46dbe8d97256c724fdba2b113bc1a1ad39879bda320e68a9f10b43f362adac3474d9df8ed84748a89698953ffe7ad43565e1cbae87f656e26b792d95e0951467629fbfe96374e566a6c4e48e2738054e36b22f11441b8c150075b0a9ee7a7d14941fdb33f05313723c5c2e097ccf02debb3957373c408efe670fc26e944529c7946ccb85d258fdddd99609d6738be5d14c67474afc6bcc310c97108287ce45b4fc219fcd1c0f0841e9f3465f61ad66bba9c5308b8c92f8e69d30650739796f3532d4b82ce871f565685e0d927eea4a844d7324c06515e1a4bf4731e018bc21edf039fb42e4cf04368c54832ee46321a1277cfc61fe2a7f40a32476baa664d7252cb65285eeb9db032c3a802b9cb6f6544076e08e8515fdcc8002aa4e134ee74a156b780984e8829a95450334b484660c3b1554c104a00c15b362dcc70d9f88e0cef59d68c26bf53e1827d5f0cea38f94b41021ac40d4eca1c17c65a751a60436d81407bc48b14918cfec70c8401a0a4924c452b61081f203933103d000d5ecfab2a3036e060ca438a6017184fbc333398fd94ef6b984620c5138f7c9364caf18ce6682c6d79e669cb8a44d7a8123b90f8537eecf7731a18100e260bb03e6fafaed940c0346334a13c26c2607b37175a6ec3a7ef1560648cbe1febce7e14c561a3869a072cb8404ac77065ad1c20fe394e2cbb7df6aeace1eab0a6dfc24116a4b1867600f3a0ea99ff2547f6eb3a3fca638ca7c937e0e54000c45fd737a60d18bcd6df3d77e843d53c6714f93f08fd9fa4dff1aad3c03752e2187b68d409f30fb4ea90c6b7a9bc60111f3f90b4d33fc0bec7e3cdcbc4cf23bc8a7f936a83e62a4489b651302c55b7180ec0591036319dcd56be9f9053fd196736c87d701a2ece699acf0d659a7f265a3eecef2697fdb4a269b158fc57f1be45675c0bf9fbb6d2a85c8260b0efd0aa605056783b7d4e19f343c8b0d090a973f7eefd148abdd513d86a117b3e6ac43996c02492384cc837abafb83bf46147f52387cef8d7e3b220321a8448a4fd2733288566c9aa7f552296210269137074ccf992bdea6f9fdbf60471b3b568baa5d6479710d443d681c553a8c7b724d4165f2bcdf48f6fb181b3afe6377f37d031fea8d0ffe5035c40acff231843253d00a5ffcfe24bf202bf62066c00799f81c72b34855f71ad582411c01b4438aa6f9146988b83959ad7313118e5c1c123180a10301a4226e62f738edb332cbcc09504c65d511e0041ba95d06caa40ce00dd21a600dc00a61a8d602c772a63cacca5428568b7d0fe40a061f556b2b8d8c5c38e7ce2296159da74a024f5f0c60f2c366a265933884ab197babada82324d5290a1fe7306c92d67f765a71aa4ae525d431a91a053bfee1162d9ed861d4748edde1385a0a5c9ab89d77320f5cbbed448ebcff91c6c4d5e7ad805fe56236769ebad6cd8abf5dcc405981971c0d9b6f9e6cb260f15468291ffaf441e4921d9dba47c9d795b1173ba29e6e40b0943460d14c8fedceebb696ec9058fead31ff96e7040d0839d7edff368dab16fadbb4208957b0c81a9b5181297836c53f4f48d1e339f87bc405c88dda9b0a2ac17c013518c3f4e924e440290885227e2eae114024abe58407cbae8fe7131d7d59ab88b89188715a39f28458ff866ba0ace140b3f150d8df350fe1eb150217cd51d56b21b2f248d7652cb2a3e0f0215846c438d098d7ab0b2f44a842ecb22d4cb26e7e7a00daf97b3949dbd38d76bf4044b01fc1be0865098a720a608dc12bdbb91f05f25d741ed50bfca1f8e6da2b6fe4e8056aafb86663550f9f7d3f0b6e8d2e4a6bed3e8906b693ff6f859eb72e6bc0d13de132f8eaeed6b6a3300b50249c8bd15e1f561007bcb1a097091207ec778603c1ec3f7a22b876c6ff088a254d71601334e3568765b69f0fd58df6b2925210670b97844a825e520387892cf19a098af0909c358d21745a6a431ae416a51bda403b9810272f787c0fb3e656ca6c1f4d4d66c5f23824bd117a5ec18fd37f7ae38046d0ab10d88ec754308473f3022de546ea2237567712125099fbf7cb6c0880c1c977c684ce54fd95b743bd488a7cf98696225411b14bdabad32bf9740e5190fe34756a8b57f025826be1033a9ce79076733b92a6d9d4c509cd63a8c7508e0be187edf7706655361167691033a178e50fa0ce314a5baea8d2018d94843cdd5b0f367e68048f0857417ac623308b5a3a5b9126741aacfe47e5037936139c253405bfe105a9e6e2a2b327913b361107e64723be70977faff21927d754c921483ffd3043d874c53dd4cd96164cf7aba9bf674f87198d6bdcd88f503c18643651a932e8a9a30045a906e23dfebdedea731c2bf22560fdd1f7ee6e8497560a5ef3c73b8c8d939ace1b3bdf0a2b32b9e2bd5c11072c230690d78a7c9d676d424fca12685704fa20f279410db55e0801658dc6717dcf13da36f021dcb73e1cc6093bc46c78d0404f90e94260b3386b966d77237136fed39447055a4c499dac9f1cc2f5229b72fdb66855203292d3da20331e2216adec7eed87f0372f93f00317a957bf6929f59a7f4b79c46d64424eced93450b89fb160328d467625c2b83bea3e908a4dd30cbe14bbf425a6a0b795ce807a1bbd5a40c08091bfb26221b5c54b244987215babd56206ff679cd97312a58939d58ec6d014c7f6e41c8624f788a5488c940c272a289c357b61ed9e2a8422ce74970257da8cf7d766d63157dd6b7203e8949de9947a21403d2e3a5ae3e18c4c34cdcec019befa4dd4a172c19d6f6672c4541ef8d019155c84ca7658f94f36118fa71907c7ab2dbcdb3c09a0938f95a8d9b661745e0e1f51e0f798a9c1585b29c1086205eaf3206785c7b8800cbf0228747c032ce0a7ad8365f9f4198db7ba45f92eee952c12ab53e820e9906b8231072012612df4a3ece7eed39b16547707177d48ea0e595fac7d3715c153f10071512dc75680ac07a47f0f5fd9c8510d00c4274cb7e38b60c1ebadc10b202ce270026874be2aaff3280964359331839eeb8d12a3838242ac5abce724ce1bc76087ef2d0de4333f09ce8466a45dc67c9fa56cbd6630db5030ae5b3efddd08c9f1a414ef8a4dd389d5bd8bf225c089476a383ef5f0ccd4045960dcd98d1a972f85e0c7952f52d09fba83c332251eadf2df5012f6ef7dd35c1c014b1a0dbe138900a5ffe65b41e6389aa6896d8c373f50f4527859adb76660d147b04d8bbdd48fc07053c3ad0106808f0571e216c58b02de7890c224b4776dc9443004fc6b8db7fd4ac40044860f4591217c0d1e32d18ad529e80e60ba4e2ab6fe6e21b94a70b55eacb970c6fab453e61ccd5641b3dc172e7be284c697eab2df18628491a930894900fcb9b10e6ea395a5b953f9cc03d873d9f3e8fc422892a7f0e186e37c073771979eaf59c94a1fc02df6002bd1366dccdef47c7703fbf0709263f57a3071125d63e7546e872a64aca4b0ffaa20449d8ec3337bdabd9150b1be0c1da9f59ba6aac66a6e0c26491b8e21587d10cacdc82a4e0b3d67f70b7bea2d659e2d84b8c1eb5e1e3bd53b1f453c110246ad428bc2347a5f3f2b040d44eea776384c701604ccf171029b1e0d00ff1ffaa7af5b5480ff284e9c834e0f9c18db21eb4f3232d2b8abb52ab049d28562248f652d7d3317c74cca34c1d3f76bada224828b7e967a0246cfcaa4cd6dcb070788b5d436a31606337e2bfb767aa6693505b5b431f6cf8a8debcd02f6c2b517fa6f7fbd09bd7dc2d8f0f1e2a648d5d2874c7f1562d913d4248fff7ac452822ce1678a2a348ca4ac2f463462cc6a1294f2b4f49f71e3c78721fcdc12d1ba4ea036d4b71668d7039c7ba00fa297434aa0731e6d9cb98f86d85fe355edc833730b5f5e6f27fd4f75c29bac4840ec173d8ff434e3d0d6820f67d00861ae129a707991fb0e6034e813e9d67806685a0dca0fc11a94838287a7830fea05a772aba9e71c036bf1a6d662c7858db834c616fa6219a54bc4b1629d93d100798259ed197ed6569e7fdd6f5c7e734576b8c7c2a2062e01632e7e0ca8668511d1aed973a8bb0603d8f983d39b50d93981c835b9033802bc53945f784e7e511d3e6860371e99e319eec25339bb5b9de9f29be556d4541dacd3e0c873361fd4415804acb405e8c40631494d05351b67822b3fd46a2ba08278763900c2dd8ebbb236e153299f7482e12176144b5427cb9f452c1c107b2b95081c25a12a80520aac2563815e92e1fb8e0dc3eebd9c59b3f9924b922a46b24fc5f1afe422826287d80174f4dd90098d4462e2443fed50c2e0f60bee41fba1293087937a681e423ffd002a2c27608fe422898f83839e32f444c30a12b3c2cf614c24c192b37e35660c22ef0f9b5fb8cf4d0d78765c04b0b04df16cc4d7284eed03aa402083f60df1fad198da56aa794224045f3dc773fac02c80a0c625e01029166340fa0f79c3514ed3dc8e3e582e344590704620a455fdf9ee276ada5938c215e8a81a00f7e6de9da612d7b8a1359f78cdc30be3ccac132d4cc9c6001b2ab008b2a6e8928dda5fd59f076ed88518a5998fc782eb0cef64c96d9d902524d93ef47bde7cd02a34d21e8c4848a57997cb1e01a5c4473896b0a61eed1945cfa8192799d9bd822543cf6903025b8422b32a5c8df30be8ddf5e69a8145394844cd88c7e6008b0f8db5053f4e0c3ecce503157114da2d70fd71df36865f32698589e75fd5717b32927673a20d81d1d80864c07cdbe81536d05521516030c2201eeedc33d068068f678882e06e5f7c3e03c1b64b3a426791894ab3dc18295be50cfd9aa3de2940a8f39d9e90c2dc716f8ff7e0001c2992de0fba2467853f1384103523b01d0c468a29e13006151828a067fec32987b9cff1830f6c0b57ded330fbb7b9438432682e5d862d8414820f4a462e72159fb1caf3041b0c04b64c23db9bf3f6eee007ca1bf54050645432f79ee1826c5ca80f360721fce30db909c0b3ed6f681e84b7fe844298f484cce4ae91c39c5fe857af0bf8bd7815f81223c540e41299c2620fff56621a495dc6f2ffc2e3709b1de843542672c40c2da3bf53e2fbdc1e35b794b228880eab61aa1ba0627c907250859d0dd52b8d1b6523680e303a603f77299459ccc40dbbb7d628e0748c659c41910b33293300a603e42165d6c3ddbff7810e377e6154a8b4498f6d4df434a7f0a31b243036759d655b84ebc5cbbff62afdad1d353283fd21ddc6c1b7e6e7a8dc9ea75fa3d0c03b1d45942f6aac8a511e41615f2f3f41719c7375e0662d4e86a54cb371fca58c2cb851bec16fcf27e862b13b2821ba87b5272b3be947b8369a1cd312b617698c75fd452af653f55f05d789da600f69ec5ffb2f1ccb4d1e5482ef2f7b569c9537b2e7782b1b13b267b099b457cd856bd2b47335eb3a379214f5fc881d213e53d6e93b0f169c15514553319859bec3b5b2cfb0805689a0de3e58824ebed64ad54aa5d546dedbd343a487cf8b891b8338f2cac0c9f4551c16721ebdd5aeb950829537a237640dc1899229b9b564044aa8713e054d8edd9775deaa72b2a96c68f08b7822b48b79a0b2068440e8f92a14373052fa3d3614a20dc283918404a9204f88a20641002240156c300449040e370299497b80c834601838479549c35fe1c078e4503c1c673b91adc5514123a9d3e4bd186e6e8336030a9400af22682325022ec00363ad52030147a6299d16228724a2a178c2f91118014cc30440e7f848d8e8ac6c42978be1c5e491ae22f8190204bb0323015700e839086c24be0b0a95990316d08260a1de3f1782562963c901781cfe0a0a248e16e0c26962c1d4fe9f10884207092acc682246390f3641912307e1cab240082834003a021184296a0ac20676013c1c5c02258149e89a3065773a779f29c10790724004749991474e03a500504ca89c0c9e962a0394e808c0702820cc182a070be493c3205956e1927097bc04b04e1802283341ea6fd002d62b41dae99400980794878cc418808a6453620700018000400a4a4240a02424207434f5985f43a5c741821046e3e942dc0c393f4c068f202558530a3c9a074ea085404661927097b1099c19f8ad7bb763713bb3dd8db8fe151f420b6983995dca46b6dd6df6eee2236edafcf2f70d33e0d8d31cbd4cf68a55d2fb79d4beefdf8fedc3dc6d3f3c04df3e5f5fabf3d0ed3e7ec0ae8247a87d60bff6eb77a3fbe7f8699afd2c863d83fceb592dfb4aecde8d773cc1c3e5680ab205e08d5b4b83df48578a6064b8b179735a48e82ff5b2f61ffb6bc553a06f46da65c70b10f12677388badd2d7fc487ee0f5bf3110582734d71346c1105200326009eb86b650ff0b274b32d42b95280f802ae02299b2fcedbd642513c7f60e9d3889c43fe9f5f8419a0d53444e000ce9096fc6403c90463144393a17398c203f7dc597ac30262076b918992e61b205361e9b67f1b29c8ffb627e6b7a1a18b26f6afe2babd5001c2d547d9b48994a130132c159c2657c46a0412a69c981e8ccf2947ceb557b650bdef86d06f4209282ef3517bc91666f0e971ceceda4b36d26d7d4ebf08f1b188d83cdf68b84d78832a233d8a8610d3bf8b1bda092696fde424d801cb6f75995340d59a941b9c608f2e3bdc4c82856a7695369218878b9c06242d6aa44e4cacae71566e031a901f4420744e492d5f354d4ce2bb58b2dacf2bde5b3f4d4fe9ea55e4d0509690820655406dbedd2fedb26a616ae1542abc5f2ca08e769db510ac49be3c19676f17f8263afc5728b2eae06bab7651b2ad3ca638aca7c3c007595e9d945b7e040551bddb45bca1776dd5f4d7e6b27ee5ac694ed9ddc5f8ec20aabb6ee5aebb635f227f53d373464f079bca5125fdead9470ac367dad614befd588c136b9b204dd521a8999e37e9bbdaba1abe423b9696925cced39a3d6497ff18b786c166bd0f6f14d8ebf0f2c04e91577a84fd26fd0a4ebe698b0c7a589428a3969834c5856d5ff6f2341959c97e0a411581a3f58f6dcf14a7003391a6804efa4c1788c52071487f8c1be4863b04e638534b7658b41e465973ef7d216a475f82ff6317c630c75a10acda9696bc66765169789215556579af079873915ad2a8e06d2546a5a869a844f57828a02afdd9cc3f1cfe56b6f867a6854326b909d01a84ea34999351a7ed7156f47a44942e5bbbf6610c926ab01a8bdb9fdb500b31f038c7b92cf42e4ed78656a0c6192483fe910c5c3b2dabeacfde1195304521f72927123209dcf407706a2984fd725489824297ddf30083087269e2835df97f39311cfc96d11304f1e06bbb99805a0fd726d40b41af6d9049cf609541afe7ad59f6979bdc2270f2f4fa35cb8ae448e9bdd8322cde41f064c33edbebb4ab554acab7ce1e8800257446ab210b823f814cf2bbf3de84a681c5bc18aa5e9adb7ced6b3476220158b18d9f6840f7bb155fed4288c80071f8fbd685884c866c4a9d2b70b505cb6810140af89011bcc64e625450985387720310aa2bef0019e08e1a23bd78fcacf73e4ec7fd88995255f4b77f6f74a5c24ad1a15f4585a5200e99aedc9ca6cea6f32d4cbd6e09ffa1c9f32de611ae3198f4759142631fd4ed005e7f0e27ab5fb8c4ab9fbb31964d8878a6d69b22e11256965ebae9f088d86cad73f2dc9fc035c348ed7ccee2154a6dcd4fa4bcea7dbde0400a72f4478e04b8e84d9f0bdaff7620fd4bcf059f7f2c96612ce8debfdd2d570c839697cf048bde2b52c81e6595fb2eed4ad02ecd1d351b42fb34f01c6d136cd8f67b281e5a9fb2052b934fa44051669439109a107f52a68a6f65dd966569a62ff193f0ffebd067d9ec7cf489f49102f3a3d76be7fbb15fead2ebf5df65188e7872bf8c08108490a2edb67d8a623ed62aa7667f0ea7d04eceef7652c4c015c4cc9f7b4c949af32bb5a7231ebaf7a106966ada4fe31d1e65ed4c4f66d6533f0b2915f467bc1ad4702d727b602544db84c97e84c7a655c1eb28d1f0a85d42398d35dc764fb494501d17ff03d5a432418ff344ab3cd337ab9fe8b42b1fae5e103de979a2dbc0eac7a2e95d0e22adf2a0bfb592077a43a817825e10520fc4057a3d87cef5bcdaf3e99bc52b3c8cbe457195077a9b151ed6eb433d105d8fc260c4641e7647957a70eb6069886fa3f7acf43a9826f729419a72f7b3b867baceae8428ab5e8fa6773dadf4a4f4cdc24a8fa66f2aacf4446f032b202ed2eb91746e5a567b365db3689507bde32b39cd47957e36c48aeb50f7054acecc412745259e6e1d251f6e0e97f2a0c21e4f773459fac1273d3cdc6896e2a1f482d82aefe1d1dd290de29eb5b246795496029ab8d15a6050ce5d4d1bc92b0c1007b77b5306626cbf2e13a3c96f1fd5fa90c1e6c186b217d81f0b336fd0bc9ee601fd4bf5c7dc9ded9638eb27255a8e7e0530bc1a488f7db9ecf6ba7efc018ae8606fa16c8e2144edf821f5fbf8649ba42412d9dd9b5b06d605cc0570055a7af0124e9391030e220e0a07c4edc0f1e08cfcd0419e5395c8e066704d3890f7e08ad420837314b9cb57111c3ac873e86bc816d6a551c3bed04383b5d65a2b330307723f702f22473c3feaedf245a4cacd01941ada941a99151c5948062f60a12666dc18b68746bde10c996b7d0d8981f53234702e8e3bb974f91a4283212de820c7750c9da9a63a28a4907be52a24a51b97a75e3d1e32be3d1e589d3c80e6daee195d0b1f9bffb653fbaeb5d6292b2ed9af6659b6b9c82e7d7b3c645c7bd9b35cdfbc9ab7e6c9162e34d72fe5fc5ad23d7ba7c7b1e9d5c576afdc6ae9e35a6c4f77ea957ade92eaafa5ab7b963ddee7eed5f340eef6abd884b90a15a6d31797de222d5fca5c2449111fb222588a5ce945aa74301bed5c440ba594d64a5f4332eebd17e3211e38b22ccb348d0e2519ea511a4aeae01e1a878c4c2e232fbc8cf0ac983132c573fa2a42c4506ca88a11197af7a91c93c9c47146707051a2659078f28ac143a17a4a3559b12f32b8424de018437ac21868cc69c91071886b0850e74e31af2136e4d701539aa6e9fd1a6234c48a9665ac8d689923e68b1193489697944a2236e85dbe888cb9872ef92992a377456ac02ed0322b98f335648bd534ee0bbd7b11a1a1d66a2dedf12202245f44885e4492bc881cbde541cba82047a6a807191d3f7490e34e7c7490734a7e7490e34400e920e77208e920c74d30440607eebb7c0915790919e1e11c45d6e54b484907798e0caf1f555e4060e9b0c4aef45cee0229a2df0e08211d42332eece85548242c495abae40f7b1da0dce3859210bd5197fc5b49afa284a9a5cbe789bd8df7791e5d6644af6286a15178145a0991a638451e1368f610ea3249971c03cf33162e49cb0c4b789dcbadf0a3ce68001c85cd7f8be23c97fc61763e0f0dab1d122212878430ce4244fd79266a43566eaef7de7b6f34a93f2fd1d144aff4e71cd2a75ed33e402db0fef8709c8b0f507ffed282f9a93e19588b8864a870601d614e311586aa4595c8cefcb9da6a2dfd69754c8c468196a73f975975fbc19aa5267dea5132329b7aa5feb0aff2b19fdd0bf5e7332e9a4db79d1ad49fd700491b6b63437fdae4528d08999c31f539e79c33b359c6b7d25a53b3bf358e23d7c7f1ea714c1ac7711cedcd274ee49c73ce62e6a876b33c8e49e3388ea3281289a2288a39d3db4bcfb22ccb322b19a97f88b531691c476d1c335124124551b47b33b9c078d483e9a3a8699aa6692564aedb79d33169dc231dc7512412b7484551d43c1d8b21c562b158cce5e584ea683ef860e758e90f3b759bd4df6ac9f2388ee3281289a228de300cc3580c29168bc5622e9790cbe572b964b60c15aea3b1b9e1dfc340d83939393939b655c22863611886a1188aa2288a351c7fce71ce71ce717e28d439feb75229cebb8ee32a8c7bca31ad2ecdc5b638db32d956c9b636abc5b2a4711c479bd150ac44a62a96aab855915651cb2fd6f0757c6a58c31ad6b086fd39c573bc485b8cc6b45816cb77bb66cbf53a5a48e3e0ce5c2ed7d6f56761205d519e57618f1ee7b9f6817b9f6c6c50a01840072d0ca4ab9dadf370e05d75d88dbdf8262b6d1796011bfaa7c4e1870e1a03c6580613338608c9010ed68401c6c760f9d0337594c0889048faa16514c48579635c2004820524204be410c502c91124e40a8e1aea0a51786890c47aede0c425a4e5c20cf9de7b2fc61863cc73341fbf83fed04163c871438324397cb45ce0821a4008514bc052800c19312021d6a0890f3e6654930d2ccc703febd121c80e262d5801e2c90c6c0f213e6eec3861460d361425f1c30537ec0f526ecc00430c164c0e6ac041941facd80e7cf891a5a7079f1d1f54a3861a170b8d19661096196262fcdc7befbdf7628c31c679462541081a3330d2821e7ec4c003126b862936f0b8e10711375cf9b143901c3e3b300c2c1e18631c43e27befbd77870b345ad06af1ec6802648b8c1d33084fbf3172d0c14585c6c7c48c1f0be442101d6efcc000e363e4a036088192a386cfa1860d63f4c8a10926433560101e81c38f257090247248e1b9ac1d3787cc8c9f1c6a5c8b79ce5522068f0f2f21af242f2aaf1714ad8a7e8a74280a52e4a3831c9f49811d4203312580984115a21a4133d0afd6d23abb2552493475f5796fad1feb8ffe913ae534d62be5f5a8d70f12723d10c618638c31c618535dedbd386735cbe8cfecdebca96a9669daae99f6a3aa7b2b6da26adad5e3b85d5d4c9a73d9542f94c3c0ec7a7ad9d5d327a09350a73cc6d5eb0375cab5cca6ea767da0999f99a974ce64497a9e5f25258d45444730222271fe4ca0d6f4993e611d2b12d25db17369f5eca69ad2c399a6696d6f4d6fa592a9b4396d9b5c5e5e605ef649838941a164ba196d6686fe9c99d9323334343534dbe68476e204fd79e2c4aed9764edcdc7870b3b9a7791efde965142080104208bb7a0048d5548afe4cd56ff36da77a1f6c2a5e3d14fa830dc2a69a7d86a0430881fe0ca13e08b954d3817ef9c3249f265057017c68f93d7c9056a80f2329295112273be8a1c3f2e3ca8ccc897ea8a717d18c5e82410739ee6304b507a02a32525e442cece00271d2c4cb490e3ac873aafcfc3939a09f73e0fb647f31678b29429c88781598cb57d533373890e32805abb5f4de6e94b47edd010627431de47470a2c4c9918eeaf2e584099528c0170b83e221284be763c0903abffa14e5419db228ce4ab2807d37ddeab0a18dc53ea65f6e75846f633616633d953a368b2175700d99a2af8371ce1c879f859f45c37a1d6b6905d227e5e993c290a99933a6986e3fb12ddcb11a9b4f67bdce9643e290aad81a0e351c6a38d470186a3d38171793c9643299c2eaca364655b8203d0ee556321287a54beab19429143b75897d8a72191470a029ec94d30c5112250bcce9e420656d39905e85fc2d942c68e5e0e6d3a9169ed461f907350d7fd77b185dc9147f045218bda3c1ddfc9cf425e45ad0b0d3b75a302fa2e8c2c54c1d8b9b1c568fa6b59beef9f3b9edff1d0e0ecc52d3396dd627971945cffb74aa99cbf5ee4c55642a25f73a35b3397d1ced38c7f54da9b641e0ab3aef8a55c844dcf4c19dc0c90d31703de02e5f4e8030f15162d4951061831223945c519274b48485244b6e0cb1a4c792224b8a96883c3e34478172d965ccbf6b93f4b42cbbdc19edd5fedeeedbe3f1a1b99ed6c76b9f5c002bb7c8b8d65d534a299d92e2d20973cbc5fbbdac6f2ffbdecbfd7a53a6b8dee454bb52ceefe2ae792b3ef538b4eb4c67326b2570857efbf656501cda4be00aef55aeb74ad31c0fff092bacfafdaacca56c76fbe94e5fd87a7768f9495e4a7abc94f4f81d4b8ae8fe9fd2253c6064ecfdb3654025cd87e916e14a4a5cb494971315983d61ba7c3139316922a60725838b8b8bcbcbcb926eff30532a42c33d999dc882137b7aa212359b868686a6a64664c203940fdfd3eb5e987c414cf966be6f734183e089e9f215440c45103700c1c44208590e00d0ec48b908e1cc3c0940678400f6f45e4d703000104acf01d11d8c2545e840b1040b8d0f7c586203193abc1f1b1ca8c7031f2ddc14997142c90d1b29356aa8f8d03089818e991793263a2bf6dc90116508adb5760857bb7c893cfc60e35404e649f842c40d1716d8e044255a30894cf4947c62d87c80613379414fc1a1051183210be2062e646b9bb0d0adb5d65a6b6d6d92a3a7c98e1dd65a6b9b08e5a84d9ecc409b18f1f34d70e0c2741283f5721276dbe5cb498d8ac2cad04b090f253e5dbe94f0ec2c576eac6b548252c8a1c98c1c84e42048842071a12621725138dde28143c20d7148b4f02459a920230991ace69cff487a20691d6121498231ce19c91112279aa6698d040b12a40d8996ec08fd5c76b9cd2f7f8ab3d6ee40075b7a0a94cf3eb707c45410fadc543458a678ded580c3fdf9e4265057a778733c5abeee9ae026dfdd969955a7054602ee1aa9022640247a14fbb9031a20b904f0d34f076d6c50b03a680019badbc109be6464cef97fe4071bd51ab44a1e1971c0d97a6f09268871430538ac6000a48565d2ad901c38643d8204571f86239c11229cedf275e475c488c68f7ae40437e45c5bb90d1a3184b01023079a86e536880dfaa5712f10478274adcbd7912023b3da3a6582e09e705c91dc22c0d3789602d72fc75cd72b6f917927ace0c5985b5a58aeefbdd87a95724b67e81a07c84eb94a76fabda8212173cc2790bf14c5a1385225a7aa6a5d63f9a7d25da5fbcf295afe9c93561b380650141e4984a21c4531d2344deb284851b4644ae86e89102ead43142c322629953d3a58bb2d5a1a71fda524f5dde54b4a953e3937a594a2c5c886a45c6e31724a41921224e5470a0c4631782f231a7af7a916747744081dc42de5cc9c516c2431e7fc17224988a7465c7bafcdc00d49d02043060e347a58227ca80c352e77efbd97c64b8817a4d430c2763e28a594d2f9fcff7f1a517f059d8f6dd57fc5e2f109572c1e39246489ac685d76c80a59d76b1dfef800b5c21f9fb088e88a779cd6da6baf27e9a612054874c9696cee90a34b4ec3798320bae42f3ed15c42b2b854c708bae4b3459398d2251f41b2d0fcebc576b4f64a47fa948dd96d27fcf1b940b715fef884b2ea3bb68280845cad20a016de7befbdf7deb07dc54c945dd82dba449f7a7153611ebcbae3cd7293eea87fb78280845cad20a0d6d65a5badf9ec1ac364cfb9a501695710d0a7b2bdf7de7befade5e4b34f0ce372abb5eaaa350cdb18a93fdf70ac848f3e8567105016caae5610506b6b9e95ac7aeb3c6e3cfd796965ca5972521e55a89e712db3ecb38c6659cd8a32a24f7db67747939878cbd08b4f19a83f8f697dea51a82850fbd17ce4a79db490e23c9f5a4c8b69312da6c5b49816d3422da4de8ccdc48ce3ba8e732dd442aed3c219cb34ead13c5177c7711ce76733311333311333311361631ef338bac6a1110683c160d39bd4ab99331de716cf631ea90acc715d97c7549fd766ab5b9c66bc33aacd166ea56cc6a942f58c31c618d38a732bb7b4dccab955732bb7b48bb9dce1a95d7b478a43b9fc811cfe66e66026e63967ae180683c16023f54ef424b0373d295518d339a776614c2b866118868d1aae1cd46eaef56e6ca956ebe560d6365f5bb586afbd614cc76ced922888eda085f30699f844a38edca249fcccd69aecda9337deec7953a13aada58dee79b50ddbb0d2866d1bb637eca31bd69f835aa6b44437baf3474d5a5831c6bcb46dfc510e66627f4eefe59f766d9abf2d8fd8de4deda75d43687a3fcdb3befa03e9c6b0fed9b76558c0817aaf24a5f9c1ee7eda95c22d4a718be216c52d8a5b1ff830dc1aa98a6f058dae716814c7a27166c92b2e14c5fefc8654c51467d10d27ec86b3ca0d6337bc62639307c55cb1a1d8e457f2c8c92c9d6bb2562bb2c81575ab2a7da250a8be0ac1aa045c4845a84a0d29b8610508478383714548afa2258aae9c98365f4369ea0cf85cbf2761ad39be188234562302aa5717585d3fbf047ee0e6da4a4b20083cd05a966b090c01b7255005af9341c59c606e0914c1c73db839615343834be00a1f7c1ac5e4b316d915a7924a2a471a1b67f5643a7d2ea595577e3ba84a91e893d3984cf1de896ed3dfabe978a67b5da7b194ebff3ec3c183b12677bbf16939df9eff1681be2d8c7ed32d87e19229b4150cd54dabef8238f004d36092c5c629d79b6777509b07d3330ed28c342d9922a6d577e0409ab1d53d68d18c9d72974c314f2b1a54df9eecdaa4d1d08ce004d356600582f2600c4fd06913a35f43290dad33d4767d660b57a94c971f962ec902e58269f95a72fd75ceb9018981a39c150c70c00814303ab2525d276ee73ae7fca752735630c0012310191dc54edcceb5d60d546b31a0812229aec8313101390636508206aae47dea409b0118801b751a9eb89db329dd29052fda74270dd659196d3a3d848d117d725e828df44c25e05e454431ad71f4de26977b73513f14a922a28e0287a78a9228e1756411d2f8a24377409feba9025c05e6131e3a669efca071ea5a4f883c29d2f144054f8e782283274c40e9812203941ca0f88042048a111424a0d8e0c5c24b8617502970264929a59452cea74f6db5376f9c33ade9bdb79d52692b99765c5e5c5e5ee8cf17d4a68291e93655cc9e41ed480f6653cdcec16c3ba71d53b544c5a050f4272a77945b3b6909e440a7dfc3bcc96bb5545b0fa49f562bb5946e3b32fd61d845d6328c31d630ae18638cb38ceb5bd004ea8a40a5a10e15d4d85fa69e4b6e5946bae4758845e63663c2c2d08afea663af34165115a52c14e7b989551a4b2385190113fd732f8d14e7615ae3d89fa3881e25bece45617914d2a3ac3ceaa8ff519f1c4419c168195fc726bd4ecdf23af4dacb3dca9229a666f438ff69459f2afad41b7dea2d4ca6f8d2685abd0e6879697c1d9b94a5a445a6df9a51a3a597094ab4443a2853d0435087757a375d0ba98a9228719ee7cc5d9e395812efe56049bc2f4b04d1bf24be8c306249eccf513ea8f075288c0823c28830228c0823f6e73030443045af732965a1c41e5d3905c1e472525a2aba98721eb849e9ef94a298605da6d6e3d0966b53957b02b3b4e24dcff1cc65e02fbbd84df5d29de04ee1c07a82713122373f93592b3daf51bde8b588d6a6ff40ebea74dbb97da883b473c25dfeb2d3b4c0f16dd2ff8d52bad55aeb66adb576bbf7de7bb74e0aa7719c85b12cd2707c11b746d86c49582785bbfcf5c633aeda36cf7dd788d0331136cfb86abba44c91d56cbef19a8cbfe8dbd781fdeddc681f98c5faf3ecdbb9e9f9fb40cb65afcf55e43db3269a1e71d3d46a551775535917370cbba3eea83b0241938b1dbb9229527059bf9d9bfe1ffe31e7dbcff6481d0e5a1b7d72dbfae69c1304b0beb98be2bcf8a9b74e64ca164999ba77034db0ae5e6b0784ab9a1713eab9adf83a9c5b273d32957a3e81981e89f3dc5484c4b9dce57297cdc5083c32322e2326a438763ead528633e065b8d4bc1aca3bfea245e6d5d0af460219d7380919d738a51f091aef3e1566b8c655e878c65fb4b045fdf98c17d3797373d145e1eced94cb7c27cc2d31acc963263fc178939bb8a98a6451f973538caad078894ba9f3814c3d7fe152ea700e4cc1fad3cfc6fcf4e731270fe603637a6877f9405311fd39e781a62bfdb909d460a631a605025837c1baac8bda96c4c1983fff00731bd431d71f983107533694389867f607e3ee051ce5f8939fa2944b19e3da56f817b8ea579d53565a6b9e432f21e6935bd6d65f93a9e793bbf4b7415d72db92d686b4a1ed910898fc432105ced6e8929b42aaa2f4d958b8b9e656d3b490e656ce5cb6d01acfb25e3fcacac29f3e0900d29e5ea34f6e73b8c4269f934fc9a7fca8fe7dd3adc4799eb316d65a739444538814d3929484050b1212680a4d3ea61ffc3d6cd29770857f716b66a2250ad0d4624916b8b390693f3604b35e250bca2ba78995a2d49f52914c5179c703f7a0f6d36bd8aba97584fe9ca773d25a6b2af59b6a4a15ddd19d7ef65bfd9c1c5aaa5c65bfef4cc0817bf6175d6e2ebe6f2acbed2682055ff4ffea57650aa93afdab5eec96b3dd542e22cc6f7e53a6b89b8aab51c9fe5fce5ec3176f2a53de48c8be151467f2fcadc8b62abf6c760b645fce94f34bbfa92a8f40ed804acf2dfdf997658a2953944caa2fdb54bb3fbe5a965ac9f2b7dfb7a56b1368593327b94a76a96d097cc137114e9813902d78646c7ccfad46021bdf9c846df2fdd3252741875d72d5ed95abf476c2dca292f329a5b9d65abbf5acb5b667aeefb6debdf75e8c31c618e39eababba62b171fc3aa26c7b404cc75c6bb904beb817f3fc5d6e4d19dd44c83ebb92a60eecdc74cc776ebafd6eeea4d7dbb9bfa5d7cfb26e5fa1bec8afb5fc07a4ff7ff56efa0854855d499ce7394bbb82f149c3e2384041ca414bbfec41e692295e5bf57fba5ad198150ecd3dd5029b54a8a4ee1606295433030000053317400020140c0a44b2280a922c0c6bfa14000b5a74446056369b09a4b16028c851104651186388310401600830c628a5941a1412c55f2a2938bd2c0095e157cd9d99f5f8cd26d01042117c474ec01be3cf525c0e59a0e698331a918f0fd059d597cf9544210906f2283db0afba2d1b94b2eb21b9649e9167b0edbc79692948479eafc81dde91970fc74b2b3ce0942d4349450f1b85345e6dc733ac8b5b6599f5c41d2462cd57c3599165e603f28aa74dcb55aee180e5036dc1c96114fbbcc9b84f546e5394986ec19ed51ca0cbd86b0e358b886dbb27eb30e6acce3ad4d4ae51a0f9fd0724fcca7801ae26c72f9cefa8920f2e4cd2ee73963dabcd75cf56cea1ab5f8198e66dc68971502ddad42bb46076a19fc942bb1a1f12c4a7122bc266f9d3430b635a69d1715f73f76632baa08e4e0d4d93dbb87d9f0993209694d6be560336f49297d73d93e6d5b49cd73056e96426b92dacc913e02dc841ec465894f7c22ca58ecf5797bf67503793e140a9edb126c79eff7e6f92ee0e7173b4e044ae308c3aad8e5934e3ac695734dadd1ce58b449619b9f8ae130027a49d98e03434142a28439797425bb5c4d6c4e36abd8ce32c40958b4cc67bcb2452b967de46242c173ae5ef9eb43c398662c18c0c9ea1525fec9674c18e0e83ef934584cd405ca3c4fca53821a112ceeebf05a03c0c94d6909fd7a12bd31b68e23203010ff66092a00a512aeb50e786607d024fc2c2b47dafc75782b41d7ada9caff8c95e7321c5ce5bebb496ded157049645bf084e507e38da46854f46330e99a48a01d2694ff4d88803f79f2ed3b6b10d4e3321dbf0aa34d94677335ab61df358675da1db0580378f98579bceb9ec88af5136147e3e1b955360af6c16ebe50ff0004bb09b12ac3a1eeb3e0a944973d46fa83c4740eb1bd00d8a96182ee2a641c1b81096db6b64b8092790dfd27b8ed33254160b516ac5796c102dcc574d84fcc969d8777ca658fa80178e2a7a2b750c51ee32c8cd6887f9a853aea317dbb913b703973c7d2986a89255c863caee202252131cda3a051b6d56e3e87c44ecf9101f6aebb3df22cd0ba6a5703ece480b1a96994bf7a569cda316bafb4ebcb686ebc0de3a70460240eceeb2923559cd16c9149ad67ae71947da030ba569f3a753dad02bac6cfc71953c1e217a0ba484c1ac27324150944979717bce024283fa6869f2ae9aca3810080e6d5ebb92577e0e30f280a1504ee2cf088e1fb155dbcafe9f11dc886a65076def03e9652d96485abee2192e3422b613ee9a08b406044609e4b03b28f430a9c7911f4c5f3e562b32bba177c5f57ceefd29f81d7803b61ea45392ad449007e601434a8b9492c312a0ef1e86403826d2bf314e84722638441ee13c02419191aa680f59ddcd59283d114e7be3e13412f4d46d83f0ab7808e5f4233c435f29f079f6a18e789badbd78491d9daa467a6d02548072e84652b47a0c371c405fbe0968391f3cf6cdf8eb95bc9a1d88ec854a85310a9a3d7b3f6828aa1466b615232e17f0ed046a172e7a23c1343241b1cc8714757db32f40d7639743cf90645571e02ddc511f8e99e0de5d783f68c50d310be65f1b80a10390f497609b0001813f0745903cc495d986add70e2d14ec93de344e2c94e25716435cf2587635b10d79d6bb7a58ebda630950136b08f9832b8feb5dc4231408e0c45a15ba24cb10d7e3d0be23eb0bdc89352ef25b526da6f4aeb61b64e23b41765e7ffe9238e9a63f2548027fb637367c9b451ccfa6277548fb6a5ce4ea6d4ced3db9aa533a003b08ac94cf2824d537289abb0a61154d9e2c6cf59f95fc8326b7bce034185529571cbfd4066a0c680f064c190563eb40f4260596f950cd56eb4ea1c1080ee90c16aff003cb38ae2877284024e038cfa40d3212500315d64aeadf0e33691f33148125686e7a2ec2998a14f197b5b46b0f84ba11040ce5346882eced42fb855aa8ebc520d108ea494e81a5623773413aa62e5ebe8c1309e1572d74cb4a690100af8f7d10f8649860ed28b32abf5fc50d2f2c3fe34de88fa3326e7ad6a6df9a021053f2ac93d3a65278f15b33c4818596a44581c005705ab713252a6c37de8959f958e2a56709dab8b6c3a99fcb97202ae397206673b794099ed028beeda64991f564a20b722ae95f4c84a59b168c8fbe03a4e019541855db14745e52e80a8ff199ad1f41d1a0fc36b0aea5868a7c32fa092411cee327b4869b1c97cd7615d8a194ba2ec533ebc81c3febf7a6a35b0d37fd6697a8a561d5534f8750fbde487f048f0b9bc0410981976df50f190d3a46ab3e7b56edca0b6b7c7b0cf349ac1758e23baa9eff2b0622db63db91b9fabb974853d417ae2b09d1c3e10f06c6e7840649287c708bb23048c3d6f80a6621b1f4e62d1ab4bb0644e3916210ebbd87ccdeca74800dcb798fa584687f178387e0ffc14041cd15b7e7dd6dbe7558aedd104ae0d7d0451cc83a76cd71ad50bbab2395ef3fde28247c3498208a6e0254936acb3a9491ee02ffe9438c8f89f8c990ca0dcc97ea61c4e5988de02ca8bf1c9a0e59d7859566470ba4d13bbc28a246f20a4a654aa63e745a99dba1713fcdeb624ba63c7ea81129f5ffa0cba2658d7017ae0c02197ba5f8d8d06815be568eb084aa004bcbe65aa02bc494376212bf7486558cfbda914a5121ebae06f1e37ab736708f1e96146a4b58e9a0a487b5d30cecd8ce013302abe7a0827a3d4bc4de17849df301993c530ce3e4667ea18d45e99f3a31fe084c7e0368dcf427faca08013329729c92114d2c3da66904f5316a44e28c24c9045dab54dae6c51d12ad721dd4c2303533539d6d28059edb63d62784dde428ca816ef8aa5a8662e4d05477caff7b5a0ef88db919d41bb6096b9413a4a20c26a4a251ea8cd10b812b0d8e1a3c40c150eb7d13ad69d2a3683842268a40609039e110502df2c38cedd3ed41a61d2a6e6a42a4273c005289ea25086bb56a68c19374670d8e0606c4aff22575bd7b0c3a71406c1cc904c83abef2d611f02fc95f9ec88827310281fec1d72012a73504a5331e826079477e58e0cecedfdb7cbf7a0902dcde2e094e3c4f7ff3698d5fa90ce4f081b48775d7c7b2afc4bc7fbf85014ed5f5d2fff6cbfa20b2b264a88acc1c9a78f84051641d3702032057fdaa663e3a8ad926e197093b7c610ad990e01bc7acfedf432b93dd6ab15cb954d63b256782c473b8ff515af5996cc0ae1967f7ac053089f45e775324391b898ae7fabfecf47725d84ba5bc386721ed66a8ad022b04c85696c10d1aaa1742535db4bf817ccb00d9f1189af53a383621559c5c30ce828660d7052e2fc57ac7c0d07d7e0991c621ab8568a43e57f0c9433e04a662aa5db4b8105ededc8b201e1dff31dfa389a33489875ef5140f9882f22a18de94de596454fda7542f05ff2d3ab6bbcc81b101563476b173b83d40dabce10a7f70ff729d436483e09c25e7a8671a2db7d4172ce4edb8121810e18985bc57a2ee19580be004fd84e923a29beb002ac6775c9b2f67e584f83b783090abf4b43996cd1ac590eaabda3d8c0bdd542faef1c6c4de5548199c0af8335c757dcac9eb757c7d00e2c6391926d8a232c73e2090a1108ae89e7e38d30666a0ff16947d72d8dd909979ffe257d69c3eaba551f4f3a85890fbcc296e3113174f091f152693f2791309b4c1ca3d44fb783a8e795791b5b9d3d1f26fbc223ae879d9fa0cb60134588776374248f2d555dc1102271e044bef1aafc3eeaae0d6427ce0214bc1671e741f825f6a58d50d15ac240c451e406760b16add1d406d3fa0f26a5493e2111e568517997b0ad10117af1357fc39baec8b956afe35de750db75811f70058b00d2c427adbdab6149e0e33d85ab1b5ea6e7db01c1faaf081688d2c04381d5a02c0643c09a63f6195f5c2adc57114df12b06802bfa4f9649ac9d04d76a47a0835ce5f03ad8a946a270d14641465a3710eed88f0b87903a4a43fc6899e324927c6ebae1ecbb3a2511e81010cf8c77dcfbedf81bfb1c9ae44a2fd618722694dd62d4db4612c37d06f8dd88cde9a6834de94e57345a643097639d1dd0bad1b5e8ae3eef79f1c9ae3fe3921e8cfcbf7446d10bac50d381e3fdf7351d93ff1e938828eada66d69758c44100d9036089f1e9c15293453d0bf96d7d8246699e942d1de069ce4e10caf9a9dfdad111206a39409b8b05c7a4c6017d6a58a65e76607daa7315656e59d15e7248c4ec1c9a214c2755c697907ea91448d88bab001388bfeaeabae3ebe559f63a44b166cbdb83d6c05deeed13ab46f290a0be4c644a5d19a5d990a980e5d598a085fc30e674c8770536d4276c1d7dc0d850b14637ef73e09306d43a125a56dd0cd212acf2c6f0ea7aefdedd1b2f3653e3b2d59a36e31b2f82e05b7a06ea766407717f6b877fd88aa5de103d14d36684f72327d3049e1b11a92aa65bb8b77c07ccb4ebdefd3928c5401ea5d252d88fcc566aa5545744981f9863da6671a815172bccab8281c5336b3a77a5d8fe958d4cb5f77ebb8da104e0c013bb49b13ecc876ff2cdae4beaba80090850668a449d334db3ae484a3a700c84b38b4e3bc2929d95e1e2f792e20d946cccb7eec278f6cf69a7f340f2635b80a6545a6ead70467b0651d915e517b5f3463617204550d8637d9b109f01331b50e30185efe75c7b7942b8c605e11583ab59a1b4d85b761433c09f2bf99e254144556f2250cba6628df586941e2a7ba225e45c42c8bf8e5570d49ed9f605331a3fc9658be7cc62e3f8072c29318ad916bd5c49f0e25b3fb25fe6acf7d8ca264ce4402ae05df9bf5060a876f429f5ecd408e3ece7e6bc5aa536b876a49d4a8e3bd08c89f108ed8a27530299f16ad38713d5993d238fd4a319b696e93cbcdc5ccd4670da8d12ae8d6e035bfe6e094c58486b997adfb0b3d82c24a2cc3b6d783f8f65f1e0fa8ba1950bb9f8deb27263701191d157ba7ceee78fca3ac1e4905c0a893c56c7991c055689f1c28d0df6ab9d6aa77b114f93161ef52624f4099035b8cb08a2f939af5f4c6fd90ad1222a330ea4f312fc44595ec9ead1347f9e6327bcd3283f01588a06635279680b67279edf6e597ec43b3265499699b71fad015016d562495fcb8b46b1407ca5c8c5b126552e6e45b40b16db7478ddd2907d4e5be9a9920ba941deb0fc501d552826f43a6e545efec29895d260d6ffc423cb4b08bb4eba758c4308f8c7e36ececb2d7b14ae64ce412722903d4bff0c10fe1f783b7c787edf2b25a8957fec0f2df071ef2d29395918c1fd362bc510d18438c2c8cd9377b8f1710a2e542c386992aecd93aa4ded47db49b70ff9686a164f56f64b5f61b41f6f27f80f3546d0cd47475f79af13c0ed086f86800a94554ef78df34a991a0d6d44a2d86973435ba5d7f8e8d070038afeeee9fb9af2e58ac252ae1cee7a8134d429001a31e5c386d12d0777a50ec440d6a63d7092755529b1c258a15d82ec7c60634af93def0288051febe4732dbcf9f79f10601f405d83afcf714bbdcc9ae907bbf1840997ed9bf9d3153d30257937d713848d10e0f5bfdbd9c3e1edbcb0aca3dd03e6b214c1bb52b372c6da66c872048d4aba03dc97b4322d5b41f47607197f58a8ac3ce1017624356ffe207ae2b72539e4ee6d57db883b2a597165aaa889fb7106da431043d0f7af807a6a81b8e8f2e6b69a9e2d29196f63e4b8af2b116681ad23bc8bf1199a6d108199a6d0726d96a6b21c00df7e4e988e6886ffd8f3429320f41dc52349a15a12eeac8e88ca55597c2e4607b0df35352c21413778767ff79fd9b70b244922d8de425bf1e6637208a8a6a3cfc03c50b7f3bc1e9ce511ab672c8dab98fcb90c3ca58b506e80248d323755eeec399d92187bbfc6840e08b2883ba3ff6c1622cc06ba811f80deb91712c29dcfcce64320b474e80feb9592254180d0a61a3fdd0b809086f4c921649063e62c83254030e0c6d32706bbab866ac953720e186b467b493b6bfeb5446cc27885d90f1a20349453ec9b23561c005f4f7714f340fa941485866ba53c209c6d24ce066abbe5b3c2300c5418bb69ee9b0c3e947712a42e3dead520bb94b414ea6429ad772468837278fe066846cd0a873cedab831c44a905a58cde7170a59a496429bd12ee5493d8f3be3b653c4342df06a58e0e0ec9f2d8240de6e85ca9b8ae799baaf93da9db3a23c0728ba15f51698a6a8e3d4f61ab3ab56f0248fe6eeebf6f3aeafc4e1a466e7f38f7a9b5aaf7cd1fa0e56b81c8004df9c10d709b7092784fc1f24be471cf618f156cfd99466f34d43b163b8c86099576f29c149f039e1983ba906eb4137980f6da615e570f8aad3b53109ba088c0aa86d80a93726c3b97cd2c5dd3bf8c89e70bc8e68f3a5fb7cbac986e3d8ab8500c89f5acba0b31efb135f51a53c4f78d8b8fb6b520d73bdacb07105eac9b0116a8413e495237fba71b22522fc85d78d8dd10fdc4eb34def5dd8fbce97ee57e739ea98b09b852cc832511eaace00719c25dc2d2f6e384e3e186189917141df6057994dfdddf7844055084a7a920033b7b6be00e239027d6e1df3808c38ef587609a718967131e5d9715493053989a1ab5c3642604a62668e2f0431a78c26c0694faddd9a51132479cd2ccc7778c238151f9eba06ec43890e26f8ce798b0db40582fbb84a1734265789b0b10d946e85270dac769ead36e0d454fbdc6b2e427f4d627320cf8a6696d1f943e8faab0b35ce996316b85ad86b0ef7c57a3019a079978525455f051a5d0c2800d8095de6e746b31ab7f6d6ca4b95b43da61b8eb05f936a3241d2a87244c4531ca062196bd03b4da10521fbb3908e0b4201ce07bc664597540de1e700c89698c9791c41ce99cea053c1139ef8154ce4a392810c32dfbd53d7659bc031e644e445d28a5baee3be0cf3446ceabae5a41896087a9aab81721b73c0363b42ba1c72bc56d74f304f93b95543e6f2974e25785737f9a640a945c3d3a5534bf9feb11b3cdd98fa83a76a3987e8a9d0b9bfffa4bf056cef686db3af7bd4af7c187b1e44f1645b09be899021ab6000f98595521ab0798232c020ddfa9e6e32e4d4070766e1c0a08554f7a0ac7c42d93f62cbf18325f1387773bafd1c08d513c02a24d5017470fc08e178da60392ba68ce8266019ed74fbc464ec9c6e69331c4cf1cdd99be079804bd3f39af7fd2841874b655c1be20df1cfd4d533dac26f16dd0bbcf5a36cbc6d7ca05924add2a280f6489ee92dc9158d49e895f4026dc6665ec688b78358109c67e40621ca234159200daf76e79a5d3643c69830cddeb3c6fb36e8612be4c3af4643d6bddc4c5533c52afcfda514c7ad562e44312030e06b80655058b1fd5cd240470f7dd0e42617f16fa4b8b694887d89eb9c449220b4bf6e3ef38229f498d77fda51e08233d55f1a6c9f82ea881c93826f8f69e07887c379fc0d1be7e9a173c3add6625169e37c2646b1aa49af1a39f9b27c8eaea69b7ca95d8f346c79be595a71746b1fdf6c4931bd7e901bde243c9bab1e9c3a4852daabe77988b8d28db83e9de5377c3e470b06daafa15c2b001caebcc2bad6ed552cafd84868ff6f910ddb43886a88d05a4578f8764cee21a21e084042cf9c29acb22f90a9394e79be7acae787b0877bafd228ad2cd8eaa54a684c2a4c1bd7da0b07207506e2a604fb1307d4eaded6f815eec1cba8ea84e2cf808ad1a12f9d7fa309715e09f1083d45c7f25897bf75ca4262f4ce47158ef2848cf1d3f541fabdb663ebe513e5d09a9158ae64119b8d334fae14608a3c918546766b7ae833b2a5827cbf4ac4367585cb94f491fbe9521044be011c0130f383b75ca285bcdf271f61ba03e5302d70a421d45871d47b8e530c4d534e8259a10e5742977928403c6b22da0c2874969f0a003cd1ec3cd0138e3b069ca21e194061b018f80583c0f011f1ff42e1df2382b8f3cbebdf748be80f0d752e92a9cd2eeb661da8f66ea3dc0a5b85266e8cf663846955f8ec59335ff6f1bdb92d640050d5088e4e4df3e18dd832ecaaaf7607f6fa77e6137e724df2d2f7df4b1916faa17584ec086c5692fff46ed3da88158edef84cfc8e3351a206479a4830cc07526749522bf307aebadfe0fbebc7981d0cce57b172fde596032af72a1864e02dbe2a8ca4a009f56d9f61de129bdbd3178daaccaee86cfcd2262589667be4c95e552abd5af8505a26b0cea2d6494781269353b592e13184f1f0de59222e4b3bbb17066e14da84002584aa33d57ea3ee86545a06c4727ef1e66b6521187caa5fcdafd524a5ae74f120c9a9dd8c89bf307fa46c2304a2a4c574b807705649cfa6894adb120ba1345a2faa77ea90fec54256d007636890dde4bb5a3c1eb18fa41f01931f4b30da5d52b011938b0832e96c9b7c8212c784cc9450c257f524e452120953758fd076e1d60e58b526e64dbb62b461a73eb6dd722f26747fa7f081b0436c0224d14861660a7633ea0a36a92e3fc1e79b37c5996fb180b6ddedb14a2c6f9b7b0b9935c407a44d5f22eb4b172c7fe5334c5ed67f297191f3f2781cac2f29d7252927b255e822d0aa48d3fb7ff7d13d4ccb822847dda1722a6c930c71a7d82a25c34761cca6fc15c038296db1c19e5293442e5a412617639cc365b547c3a9c63e4365e8238963b4797523a4ae0d158492eaa581750e0019365eca104a9814b9a188d1d77ff302f68520847daaa2d89c3c9fb980ee133e3329c059a5c7491bb563691ea5160637ca43227b2679e926f476a20e31d0924659d23c42456811bff796c48f9c4cfcde098a1fb1a2e9f634f6b5097e461a1c2405d4a0699bdd1192e00d1d24c5e7727dbaed724504124f8749f2867da4ea3c382c5863d8187394717b75aeba92149d48dcc94b46fd2c5579c969810b16b73e75524062b05ab8a9ae09821ba926023a6408a154491f68cc2a4ac39902cad9bf6a9f7dabe0b7cb2101b7d06ed2e94430b67706575469fd851a6ce57726388f53361f2785beffb70c554e0fa1ff42a948c519fda712a595d05320a384594d641264ec24b18fcf4672d38e55450a3f291e4d9575235cdf3720dc36a92c40555294cac2b588f2f39e0cf1d5830816fb394ebc295949ee283722a9e6d9dd3f5d933870d09f4231d3f539fcfd170514fe179f2308805d0ce3714b624f77dc5ec9688d612b035d87b1dfebee01dbd21bebd54c27b61d37a0e8235beffcc7bdad6e007603e4dcda1c2906ee30f80377240e98cabea6244ba20a887c3f374267bb7bcb58d668bedc918186755daf044d71b407fb4a008e76a5889d30b37c9858eb5a50cddfebc3b9704eae05613bc8f3289f352759ea018453d7bbdf2aaad276c9a446dcb66916b31952923ccdcacde350120ffa9dd7236a4439b4ccd4b11a52cb0423f431a3806c3b73d0d218b1554573d962c78292f84f6a29359a2eef909245c686b98ac5d5b4099a8bbab91cc0ef2fda6e3710547c9740f7ec9a42272896be889b66a3a8079e5fe9412bff48c4961636568dd7cf3d5639f4d8aa398a13d184ba56f6038ce59802a7dc808cac81a17d1732e9604cb245d75930ab1e6698548a65ccc66bf4a6be2f7867c0886754a898030de1a084c84951a5a9031f10d75f805e4f1260bc32319e9a56d0d404493968697c30f885e60f1714cd541f8c1ae0e4543c8062f90244b63c0d9f8cb1f858386e8ef65ffc16e28db6d6a8ef193633c50c79a42301c0346291ac6a0ffc752de26b71d013746c26e980931905d0341a4474aa11ba756326cb21a511da596efed9009a2cabe40628a95d16637a880cd34e39838190e396d3499c90fafae77d3cea0f0d69ccb072ee16ce172b2f8794ac09a04f2916ed4fa9312bcc0cd12627267a833b3610322b87ae32772bedb5948aad5045b5c7cd5ca24ab0520fcd2e4c12bd930bbde93795472d90ea1db9abcb37687efa878389b423d80783aa6d698747b3bd2031315db2b9e90552daab96e980f1a6d38a12dd6800268d4e18cb09509bc2ba63e154c080498255a01b13eff9a73d7a10dc27da21f9120f0b2603b0df1ed32d863af946f0e8028886e5410e50801321fca675fe0adbd3a260bf6baa588280291a75a1b100cda5d4f693f7b55843563c2293ece207200aca42b3fb5689b60334cc5c666fb8ab28e0cbd21dd41da4b9a3b2cf3ec9456b1fe653542590f20eee85bf72a3c5f2670b5075ee9fc628abff8ea1c969dba45964a06459b888a80d7bdc339d64dce1f7b3b32f98719f9155a9207e9664c4d8d0bf883bf6979cb374fe3d724bd6897803cd6d715749e900e2b4db15bf7bc3110fb1b16cc0b69795d248cdf3f325af315193cecaf5e7751d6a35c7e1f6e5aeff5e4f77be695497e9dea9ce1971d5b0a82c406b2231037f89f943c716da33ac2a57c09c3b520ff685a29de105c8cadab1a1dbef597483c86896fe236278207392ceecf723c0095e992910a2e83b9795411dc70c31bbb7f7c62e989fee431faa98fc3c78e1898b7550ca9a47812351fb3ca10af49193367094f82ffe01703428ba49296c2d2e83489b347631af4b7fabbbe5920fc5f0234976c27876f29615b8354892fe1114e995b3719699423ed1bcf7002e9abcd6ce59643c3b81c297bd511ddd4ce967785f9878e80c83d96a0b46c223275bf26c79e6ae62b62d855081078806c535c588ee5f9f8634ab2f5e748b64bfe4d720ec27732221ab7f17128947f1c0336df5bc777618b3b3ae63d467e2d9ac9d3d031f4a1bb556cddb8690dfa7898828f96a26bdb5f3d9ceffc3a132670348c00f571234b8b0739c536a0b7096f3afac51020d761bc12f1bc466825d6576342d52402ef875171a9f4e131a5f9eff28bf61d0a47d98db25dd8600f190ff79feee048905867b96c088eacd2c04c7d5a3798ffe0fa5147fd8b5a7a204738b4e37724dcebd2d872859d495e8c60742aa2dd14562f4ec3a0f952755e6ffaaaab49fc5faff97b15ae32b5b5bf87dd6b2fceb57a53eebaacf3f836addafccda6a402c66e11da0a19835976bc2b3ffdc176bec6975949436739425b6ac25ef8be147228af580904df4d8d518164b124671e48658d5a6263eb525d9adf75c6110efb34c46f2057010be22b823f622ecff11fefd867830320a3d27e31cc50f49d0f0a79edfe2ca3811993afa7d51b8477caa130abe0a22e91a385728260eb7b44d57905af7e2016fe10162cbf38f3765325e8f5f9dbcf91172c5009cc224d819f0db51c56ae829bbff6061ee1fc4c15dba5e6e2f891bbb01c5a266805ee804884d2daed44a39e99dddbab4ee2c2312ba7f4edeb6bb6f8e77dcee62f41994809ada27ba92d6fdec5e5f1fb51cdafaad5b6bbf161410c0a1acaf788c30580ff11260c76c5e98c8893170f04412429095b3c94c37e253da0d3601610519040fbb60ad700bbd34d6fbbcad06da37cc62a245f587cf1af193113d602549a6e232c8104218d71047ec9b6924dc5f7d23b03c46342cc5f3ac7e33b18cabe2a0d886cf180b63779c9eae63efb408e8d8071b877436a41e44f5095fe92175b9703ff9e45039a22c606f819f2eea38888b97da007eea9cbdc158595588f61e92d7e61b8722b5dfa6676240b27c8ed221d57c101c913d280925914583e9e0ad4d7881f62ff371c324a4c21a5f5828d4d1311b933a550ece0872bc3ad6e92f15f6b2a363e63628c32e637af1d7e81d5d8f0b86c9a71130c14f999c7c5fe34fcc7eafa3c08dc25ec478eb4872d106dbcd9690191561ad6c4fa6ccf8d518bdbcb0483a189a465562528657cb474fdf4ab952720c7924b49d1ecd7a7d0a123dac9885ce041a4f668bd23e3bc9b8a8e8d0085e48bea9b203826cfb0a81ba94788e21885768cc99ead59f71d5bc01e4821822a51ff75d367161af9abbc12f048353fafb86b6fafc089fc2d15c9c40941841ff4eb583e5768d018ee6fd9b1caa3dd9d06b84140a534bb78276b0dc819c60b16215987fcf6b03c7773033028741ad8f0de81491341b8e4896153ba01b4b711504ab3f5c8c15d2777e40f11f9409ad2ce25995517ec2f2b3c634953670f06a84374f9d5116dfb2b042dfcfb23dc00afa5d7789687bcad36cc16b7cec0d2bff493430ab5fb0393124ef91f863e00764c92ee4d6ee61df091468e72e4d8cbb211711481d5f96e1ff5d781cf235edd799a857824789ae5183a137fc9ab1bfe63d2e611b9f7d4d14e2f813c5fe7fde0a160d5613ff8782cbd864fc19b9045fde258390f652e620f93428b188e1d18aa8220457e965d18ba4689e79c3c45f3cc59bf5c47ef40c0f2b75f84ee1b181a96258697ac68d3d7dd40434f40eb705c49a56b5e9d356dbe3cffaf5c4163b15fd1f58964a5c4fc85a3d8850fa1c7dd430f96d0cc9c7217a72a23188b8fb7b233ed10d76aebdd79cf8805355a487ea19ee95b85079905a8e957f0185b8d5e438ebd07f014fd7626fb98d0789ae03249c167307df05a74f60f75f59db7b1ce45d8b84983a27f90f736ebf703461532acf63a26905123fde26d35cfca327bf0c325c15e6ca1658a8bf817629f89d0b98950011a7a5c2c5fd650ac131be447657d13ef9e23918b1aad3ed150d6bc7b0fe820531f27a14a8d229ebbe0b78c5aa4f936ce6dec4fadbe3df39ccef112fb94d516a67cfc06d72f48292fd68f6266a4a27cffc6558f0eb12bc39b9a54e69b120140c1f7b9e284e3ba7f2ea699c98d1af83cfcd61781d5a3d375190ecefd6552c5f9e7473ef83c06897448e6181d0d44c99c18113f54badba3966672e81b673e2a4bd282041b64ba0eafbc8464aeb981edf150366ab1792e7873632d54151d599d07ed0380e7af2865a7d644a1c219709535c68985b656e4358583067074a4002e5f3832fd4915be036a7ac56684c5ba5b0537a2005899faa63bc35376e90a5491d08fb9ca91ec7df981169b4a5ccf668a91d18dce8df3b48ad201d22f6ecc90cba5354fb45a10582589dadfe258d036acf98a5821c3735c85d9b8fea8c02d60366c8b7fe72442a603f6d2d92875bb1519eab859cac6e1670eb6da01e256e7a2e39ffe7043d117a3fcd7b1f60357e720923f467f0cfc1af59dba22d96e5f6703d33e57b299748709f3bf3f049068e4eeca820c4247a14f292feb922c8c99a240c9678b2a93800a01657cf4397453fe3a1a40e08194bd0e63160c3a66649c186f8071a7108da0e22506b93ce0f352141ecec0cfa47b439218e33c487cfb453289d8360f89f90b3007f7594147038737bf857a7df5fbefd763f80a6a45f59281af79377709f71522b29a9d0a70c857d6b0d373f47b4aea82afc153a290d9eabd04dd9adb43eff873ba9e41af8b8b950906f99f27c582ef4821b40c29db79856ac770ba9dca07c4e51ce95e4463964f8dc241475ccd1e2252e385b4a401cf59be8369c84d270214060c93583a707c17f9121dc3cb9b7e7e0191f3a125752d947fd84f6db22b9fd32c5c219dd5f84d19689b83e6c56f6fabfc98aaf12623b2368c9240fffa3931ad7ecfd8ac04e2d66d9c847dc86846df23bef33bb7654ef1f35ec72be83b81938d4043e30fb0b188b8a3845d52cb78bd5c0586fa34091d08826ea79c32e784be48eb8b9432a8cadc3662a50dfb6cd2664323c66d16e56c8485228d93e4e8506d34d00a4031619c0333b08cad4126b235401a7bc8b8b8b2294fe14c5e65966b1840a2b12b2ed8f022580d83fc81440a09039ed381f88ab5d235ca013abd3d8c08982e1117eae08363ce116e5be04a79e470799b20c0064d22640433807948ec3499ed34a5bd5b23f3d632b6d07215a5bf2f9a9867f1952ebc2748fca7b15b2793f10cf3e0fccc418486809daf2bbea6840813d2e0d32401eb7a6fe6b3f9604d4b348f93f9d9714e208d1d065e9d878a1308092bb16b939076161990dfd3dbdfe78ca260df94874daa085900b206fb3364cd000068641fdb4ed39906bad80cf4ae783a4ffd36d6dd7904bd64a6ff0e456dae9f8c2cf4a69e292857997b61305ccaa39b5357526c994532b010bcc3336c0e31dcd1b712da1f7f83e60060a767e5f6e281dfa5116961cba54bec65a00dbd1636aea0b1fdbf03a0d218ddfabc85354972263413c881ac10902c04b2f3c371930d2d90e82b83d052beafc52fef2d6f9e8bd88bc756964d20bfce9950887686a3bbb7e94f7fc3f05edb5be9568d31ef7a4f31a2186b6b0146f1edfdade402ca32ebe822d9e6f4f3eb5980267fa57068973f02b0d4e452487164987f3d9e578d135b5523431aad5d1c36fcd279d6e1f4fbbcaa95272e313382d011e23d83a4a0c2106da17d1af0d28f16394a843820dda2fcf115455c74a69fbf19e6c41d3099f97fe6326aea6106160ba16633554b9d870934e6e162717ea4d2e1f27d7a4d9c9a5473a42cb9d3f054b6662372414ce1738d69ae7c02b2679cc42a4f6a2acb0e82b4655d0686b3b051194f3b9a8728b5558f779e92b2703308179359f4951145a533997f4148b74144af2e504c45a6a6bb2dc8916230e5a7fa1843a8833cb1a21a6aa444468132c86426db06d84bcb38912f797583e38b23699293b0c722e33fd02cde55e724868bf0d1e781601be5ef64c6e48718e447cb7e2f13fe015643466a3c5c46079910128b08631620e6ddb988032ea1bac34e20033a7df68a20d80423338fe625f807cb4b434f901e2a26bd051a2afcab188641a9e5b0d6617a8c2d1c49554d01506983c3e033ac1b8385bae84d5b80faa71926b1180e57e94ba7df8ade2c2f13d5b8d2b8fa8f2cb4144c59d82b7f14ebfea0a4d1a926eff03c27e204b951193b2375e132a2294948aef79232f86625b5b41c7d74f9f0baf04022158f33d12587697cdaa261832de2e85f84130d33d0b040d909c25c5b7e6abc5a112a4e14b13642a37b129aee3541941c295b0ac91fc04f116e95edea9fb6c0f00300089956fc5a3a08f745d3357b520f40bfc0d9d1b03e2142fa49c60cc28c9affb200d808269ee085aee4608217c812833c06b52c06fb87729f4806596a0480a9fbebe8ca3370d80029246d292f629691ae8173ee3675807d63b76d0b11cb7c4a43e81fcfff6648dc664650e55d8289a72672aa4dccc3983c2eec68815ac8012076f4031bede0336041c307247d0ecc658116900e2dc56dd67f41ddd61fd9d7a6b5c6568a43d52c1b78ada5ead6a8979197fe649f6cdce16c8b3655d8ed376ed236b04085dca9f39740496074e22798941921308fe8962e18f190fec7e655ab869d2cffc63cc79c90d2a42131bd6e617a55e3bca9403e9c6744439e8fedc4e59242afdf99ef018b1ab004de178e008e1c02e9e6b030eafb2e0d4484e6b93df9253d44ad2f424b6f881778db99f03a59cdfb614d6c3b2adf4c1de0a37ae788829ea92ea19e3d9120ca2fabd528502676bc1fc2e2eb3ea34595d32eb1fd41d514e0b3f915e4fad1e41e00442daab145ddc5edc64be77755c8fb9adf248ecc92f54e5f25f999c231571b9294e586dc82bafae68ce7d70ea83199d8d64c4085d1bfe2e6dee3f9d498da0f0b15076ea39eaf21d9db82f47ce0ac4bdad90b591b34223138731c3597c280d53157a0ed580cd9791703ea75141471128bba941c3e2f148e11c31576d5a77aa60f6855d88454b3d0653dd89f47ea47ec27d41f5f48b21d06f4d70ef9bccd207ac45e82a11a90527b6b9ea1eb3b2f599b4a1e3b3e63cf12014fd7759fbc7b64f5d0b84e06c52d49452733768fb8cefe15fe0a0329d067fb0089a0063a3477c2c98923b64db960dab6ff6e2952b8d46b9517c9059e859e4ce4d8d9ae91a0a056044251410a65d4bc0ad0db0e7b351ac910806c0c56c00c72b8d0c4a4a0890dd8167c17e1c7f97195a949f836a9f312e031e6f32857c8134ed660b90730a0f41707e1d9e8580c7f61b47b40bb1aed00b259470118c076553b4a7e9382322f0054ed1bc873e29cde352cca6a24894b437566ef2d5016052e2326e1af71feb860398048d4dc4d8851443adc62445a894dc3d32ecc27911f7ea405707f2d801f470e29ed7043a0aa561310cebcd661597a940372d97d99f1631abbc023903d9204ecbdc931094d2d3bbfa8c5228b724ee82af4c3e4c1060103edb85d2410a9603edda8562ca9e49e5b6ab8ae7814fc58ea91e58b83ea36d04b62cfec44364ea1e82b61198ba74dd74e6687234d3b3caabe3b311999113af1269c44cea98e89282d4307ab08d54fdad99ce03794245d77ba301c7f64c438c7d0ea0588da20e272cf73c418064e1595bf6d0f7914b691c9aceae8646fe53c2e0b9fd2203215997582f4fee130ca67838096cec2f0f7f836cb26270620844e7d2c0bb248688cfd8f1bcdf10da8a0865f3b4610fbb06e0f4f38ccdf7096e36c6c05d0af1dc0c3ecd0e4259fd5822fe0d54b2364c915258257a2952313b61c14895cf09b746cabe52e47711e64f8ada0f19a2f0ac01ef3f6aa5d680cfc65a52d6803fe9d7427e31272f43c324fcfa97a5a76254b1a3d1772d3eb5385e6da432d24e7cbf85e77a859e6853957e140d14e9550af038e1ddbe9e285a40bc00f104b684560132efba8c62730501cf6e285e89cd0f9c54536bf608bc34d4f706ef9e86788c85549b1ed2d4896e2da595ab383f589bb58b58bca7998ac1dab2b10ef29981770689064ba4940d3186aa7cf40eb0c99b8689311a0336e13f7830044bea6931a21d5593a948a60e0dbded1ea980896e1024a08e632884e5f1295467ad21878e4c1bc8ea413c1d2fbee4c89c3020da02af2808af66c7f071e82e2f16ea3c42c9e11c83d194e53ec95a22ad0f8788916b5abb68e6721b55a5bca29de433445e1e9ff431dca8609efa1b4c63dc15328b3aa4949c9be7152bc1b646f25761847496ac1fe541e0c5327baac1d0f54f11d2494f37ac4160728b9895ab519aa5d5b0ddf965ac9546547408c37989b7f802dfd472a75a294c1b21d84c3930e309061626bbcf854d8cbdf8621fe7f221b1a64408a8d1a21b0480834b4d05c98181be5e4d236159a63e14fb60b4d116a452091bd378685a86320505363e3ff0e0c00835a8c57ee705e11e61803f1e6ae82908d0bad9b5d5602d49c2eca4a4ef7ba99acf88f349f86fe2f17ed1853db519cd1ae41b1c864e558c172ee8d80645aa47cef64c67bc08b30410950b40123f89a2dcac02fa4736b84fe2a36ee8a312a25040b60ae6ac2f0c70e336b072e3d7345652db55c0665f14c4121f00cda76130d8c61de3187a2a887635f2e533d0a2260808f5876cf1c2dbfdcdd0db076a5ff5190ed8cab31455485436754f1e46e018363a24aaca62effdf386468387a593cea54be56c4ada08f0b53aedba7f5f2162e9a93bc6c406625bed766ad336911e3665ad2f3f37f6973ce2185d17f3cbaa9f6d5197fd3f4f1c9da8594ad6722beca7092b794318b4dfdda4529f9c3c72f62a200b9dc52edac738f907c19c311ba7f6ee54756030af70741ca28255bca98789f1dc9329820908a646c5f4c9aeb8ca66cb0f4355171950af6441b33acf4b737fa0bbb0881d9b5f3938a13a26dd7d0166136d0054a12c62726570d7559395dd3ad00b13574008b97f2ced6821654ef2c04f7aea9f86460e0a4649b41ea5f2fd378e68e29cbcbd57779a0c46f90dbc78e333675bab1176d286336e26fccd34f9a418781b03a67d16b3931b0834acde04338b77e890cb7398d85803b25231591efe7cc9da98429c56ee45b5213fee00645b37facd7ed64e4ddad4b54d209c9ddb6f8dfe42197427df04d4a4905d54117a57ad2184f9ebf0e50bdf1fe9f4769c04d88e9582a77863cf1ea296cc0563798d8ca3204a5769e5decb5c9580fd1b11964e5fa78cccb80ca2947f520a68408464c31783a2e6249e0b4e09d85d713f6556d8932885f3f5ef96eb236a9a47d2e5e5d5b38d290db72b3fa06765d0c26ba0a08c83644b8cb340f430413888d94a87bdd2530ca0c4d10a07ba3ffb77c73f51caa67e1f0cab1ce07cfc985070a609189c0965a5e91af5800a16d723f53120a23c6bdc20dfb30ca608608178b3adfaa50817acfbe857a78d3c1a06541006d1e9745e6c2885bd24df3d2a8f47211c47727373fd3d609a46b22613dfc3e1007565443d56bed12b2b97d43e8d04b655bb18e14954a8025d44de5f01a73ae8b6a8d348901a18034a5e216253d0341280f5c7c71cab8e2d3bda19fc7c3196bf729751defab46a417c4c52ce1f63021f5f66d11f27b23bea2a9658f44e901f57e2ec14bd5d2aa16cfb75f2751d0b8493a81a17835b2170ae7f6395169084c441a6881682139f1924ea7a49315c80c159d2c38c2b3f7899d575a8cc07ef7e40e2a40dc84c43f63bca895c204b9821d96921f0dd5daa7a8edf197f3530e625d22be5af8251e779106d60694d3a70ec9393305bc9038d780f84ff58475d5b47f418303327647f8147157e806ab30f3cb869059b581340ca1bf4b07e9699d7dc50551b726926f016d8021540602b518c71f0254f640d741e3d47c2f7814e529d4f8024d57357b47b829dde7996040b18141ada484a3ff1de730b58323f7583ddff29956469ecb8002a239abf8edf617f524acf5551c4da6bb1e99baae4fbad1778a3f42f9d27e1ac3d96818e92eb54afe5589c50ca5cd0027bb52550b2a6b3622a9a252c30f00890292fede0f415f86ce8fc5cb265ebec99fbf0892007a21ae767233a427537bde892e33bb39479d531fa6c9ebf97ba98759f31cf5277eed09461eb083dff2c815fb4c141b82a7a9fc65119462c33df79e5b38892a6211fe0e3e46cfb9f79e446c0726634c810d08c666c210f6f28fac442cd3f2f7d60634a56319ba5565fdcaf5910c8da814ed046996ccbd414a0fbc86afa20f16b2700a2489c375202c8b367799ece97e0067c40852972aa130612ef35620e95e052c7ce9fcd69914e0ca1fef396e80592e5261e6928e73d71d320c90c98a2e951df3faf85484ce1400affdb1b821de51d7f0045487fccdfbe184faee93f01ab92219b612ad37a7f4f329362c6bc200dcb1d7ef522aa60d97c6b08cbefa405803f3c5d95da6892e9088801217393ca7d164eb1975bd610c122862995c25d7799f95f9d9e15e68dca8560023937b53322046aaebca33a68a11d8a781dfa26575ff00fa292e993c2f02b10eda362936cf892a6c1040402caeb0d39e55d2cf8da177b4cfa361cdd34e6b69036ff0c854777a533fe6699a26cd24ec075bdf8399c78b413a0eca2285ec639d8b962af426d823564fef19d647096ee66f237b334e7b80bc6d586b221dd3bcbb9ea322402a57b9cc6e51970202804846d1e6dab9ec291c9ad0ec93776d7aaf57ff2cb67758c836314b4eb6f6359294118acde546d112a5a21137843058771eda4d5b15d80f245622a87a18834037687eb1c565f94484fdea950eb5aacff3d92ebba427dec743c7b8ba8fdd695806eb605bda64b1d6b6d3e1922c9c254b427e74706a0fc323c1006c924de245e6992e2fd583bb4fed0d7b749a64c9eae6a31a09f172d08774905e0a278f109aeee0660a9be1be72ff5fd008f78ad8570473e848a656e1835b73bf87c8ef6e80950a8df3fc8a19d0bf51aeac655f3ff2f3a8087820c31fdfa4fd39ee0ff77c82d1b76cb85cfd01fcb6720724884199782ea3422b170de24318c5c41964613a03b4ece230492b86915b35ef31326b8f422814fe628f053688192770c08b3b10170302ed5f8aeb8b7903655420b42635e114e0f146a5d1dfa8719ec41ccc01e824cd88393851ddcbb48481b28c53b03c82d88e365dc839d2af422c4265837c4fcdb3ee48b30df29455af82bef64fc0dd0135c3c6803a93bbdbd251faec6dfe45afbff9c67470483c307139803230081072fa6202392883dad50768cb05b77adfecc499ef6c51f83bfa691c9dd184b20b4eefab5dc45be5dec35af4e1414d2101db8e5e089cd711a917400393fd57f4bc299d6a01d538608050907c2803b1d5785b5290b1079af0546d0c53758aa66ffd4e17cfa65d00e17b3097c970ec64e9f47a5d423c569f82b30fe3b033903551e60b0ddaa10013dc3b7a8a0cf5a6d3729125209d35685c396c6ff57c5f5e04d10edc90c598526226872d850f371fa75b9109f0675f468a72a3643820dd60ed255445c6ebe1a91fe3a6e4d75b25de9f54b549ff41d95c538bc44c5795270e0ea8e8927e0323b21d25e36981296789ac8164d5e852a1a50c7194904dde49580a54f895d64decbccf8c8c8407db7586c3225ab3343ade553b261bf5184121b5521007f279ff5879978ba519bb70a493eb5b66409311108a230a3176533c37d4a8aca86db855b88f7f9dacd0a8bde5e9ec79bc347a52e284975d3773a3634d55242b27dec7972440eb73c9aa0c885f20938124c789a18845d7e21fcd4b985f493ed4488234245f56a9069c79f7f21d5825fa55045479d8d3be5c996a8166671e6e2284ac4e63272211e9998ba44db91dce5060b1d18e8fa5a6c3e3ab6e8b96fd975d318936a683fbd8ac6409c4ce693752ae453c8eb883afa91406ab8c76f74cc95cee2c447033c4e563ea24c93a11f3803b7ee06acfaf46596c68e826772a80a765360ca153c5a1a71603969ad8949fa51a0ef8040beb923a553bb7332bdfe8c644efd9193e1f56724636a9f150af3a60f96c787c656ac9bfc98928d157cacadc68aaa7fdb2b6b96fae745de62a16766aabd8f2eb4e06c088bcedd5dd16878c89a663f0c4c18a80ad32784df596f3e7f4d1f5006d3479c5c40bfa878fed1d5a792c4ead334762873300a27d39b8f48e6349f24c0b8e8935f37f861e08e6854d6ad1a467b3d36cc58cab5a57d56d9d16779569f64051c3aa435cd84f8f2adb5a36a2a492c6e51f126989000b683120919ef807656706227afd020ab9d08b38eb231e018b8128f489ca98443fabb57d7c5620a41f1e6a7d96868828e755b1f5e7572784d15eba586a4320817094ac7c43bfc64a524452faaa526525606ee1cb3b8f3a88a3bed1d6b2e3f0bd57c32f1eae5d793a46e626b0e468f3f2318147f34988717582de73f3044ad58392c420bb2a4175facec730106a0afc6e926d63ca7dccc90b75f7ac2da57b470426b2fc1c1ac3d1e81e3f12e8758f53da11252e5f5db23f1c57ed4dbfdac0523e5d5922bb9508ecd6530698c290272d1cfa8b7ffa922e6f5820c219239e1474e62fcd1f7e759e5cb12c5dfb504da0dd60a42f2db1163d3a398bbb838bc730ac0ee656b3b5e50731b1727cb7d949716b3ee4a8ebb70d7a7eccb87cda1439638e31f7d26199b0c1b37b2b0c7e0983ed674c96bbf13059ec80c77331e7b566387a7e478345d3f742e0f59f553d94212d5d84581b50eb7e36798320baec8f0a5770e52837b2b23cd9959d95833fdda4d0f51dfecc7d3a5bb3096f9aa565ebc671d55b1c656de9b0c2bb9b2f6fb1692e4c68beaf01132700d4d2ff8c7cf4de8ff2891505dd82f36bd85005297fa6c28561f66dd35311cd786feb40a516b3b9678a70752a9859e10fdf96e47209a6edcabb4d60f9438cdadbc9f329d9234b06fffc721d2dbadb6fdfa54083f5edfb9b385fe330f1f8cab0fb1fde6aa5e0a74b2215fe62e3c4af7495a7edf4b83e53c58ecec66bd1acfa5588bb80a42703db5ac1d9781732cfd9c6d4065b5f6bea1fb7437b10d56d26936f9c0b8c0f89557db99eb5a16b78eee3e80e660ca08a5d51902e414036a2c366e5e5094554d1bb132d851ddf2a323270797f19382ca2fbe11dcaf3e85cdc8855e79c82e2d512bb90f27784b12aaa57f8d808e64285c4208210000208e186f27ccdbbfaed7d554f54a05f461a9f866404e13bf8743ed2684480aadeceeeede01e906ab06b80631f37f90f47befbd3785cf1d7f5078498e0fc87134825ad7d1485a5ee583793097d727b5901fff8c8caf7daf7c99b978fdbca9dc7023d07da4723393e583349bc1787d08b58e5be5a6befc78e77df6d2e85bbba994524a29a5945292a47cefab94525a6bada5a91fdfd618a59c73524a69adb5566badb5f6e727aaa2aad562b138193089c2edc3404199b1565a8c060e714baa248947e4ac28bc6e1af9ff62bea42dc895b00426286982139e300485284861891353a04fd8c0d0010fe088e1032038e59061061d217830fd05dcf5e6c1c47f01ab081e4c7c4a5b4f487c894fe41e515922491c406c45257168d322346df1d8020200a470c310477c5882831e4b5088b3c33582832333bc15fddaa8f8d09dde14f44084128e849f17686cf358e48f339bd9035ce4cbcb329acd609f61d9b78813db339967d90314205fe6e76a6da5f6c2a83df65ad5f67d3014b3d90cbc57be6416e75174798f4d3cb1e8321fdb5836339f3e9787e16c66ce0bcbd995619f310c5fd9032e1835ecef83998fed8b1fc4f1624dfbf760e66b1b726c6f951c340d56e1aa3f645c003eb1a90dfeb976b4b8e42122873f9e214e3c43a438fed986b0db4f8e86014515af56ada2ed284551c127388c8f6f3f0f46c237fa792ce66bd5a5555cfe90bb5318788c36bcd727ad60fffedd34bc9356a0b19bdb18e3a3b4ea145a54a46021ad702a28525046272622bd691996f1652bb5381f383111e94dcbb08caf6b2b9d374d10b10411483811447824220744e8501b7ee50b54c87a0fc20d2184104208218410420821841042082184104208218410c297306a9d86c75d1321018218526180ca9adddc52c5599ef43275f227dfe50c5c4443c2c0557c8f4bfe7b5492e27b4cb244f7d22605a2f83e397c71ef7e79d79262abd85cf7cf3da9c3a1838a4fd12259ac964ec5b3749573dc135ac59ffcbf8abf2a5ec566e9a86449191597392cdde42ddd8e57802e53292457d17129bac723ffee3d98130ef296ce05a777414aa162bb80b4add5b8141df72c2c9de5a4150e4537fa940e859fbc8aca68d441feb2d149d7e2b11e8b75bd4a275972d4c99eaea294e893c7df8da2aa3bf994ce842582a8944ebfa0946ee32a4ab4fe944ee32a4a34fc2eafd15f3edadd053efa942ee328f064bf3091a2aebf24a8f082502caccba8fa912cc9a2215775422969c8d50a91072023b895c51f0054a40887fc567414363cd257a9415340ae384d5671824661f1fa1715635278d4b64b5ff8cad7752940fb2c061a72ed27c57abb36e472f5d486fc9dd220a3e166dd7b5b2db7257b8ba64a712ae13ec919a2fbc98f8ac73ff9b928b962f17892030a9b8b092cbe5da9f5f65a0f1af20dfb1691765b07793c72c9e80bfea5f5d154cda0e01009bf5f5b0fb910e88e6b0efd8c3e463fd3c7f42fac822dfcc2bb6f395c42b61fdb030a49425744408043971ce8a0e1c2e5f38047c812d8a3020488e4e1c30e4e88a0c7138a38114495c09fb35cd97d661abccdf9726fbc7bcde30ec6fc14a01fcf0f0f2edfe4470797af7d5e0172f93516e03524a7d15ecedd51fe99bcc47ef472f793fb3438fb8c3b6a047cfc4b38fe141e2489a15fee4e83aee80c7c229319fe0660bfbdc43bfbac932b88dec60f0bd9cb4dda5e3efed991b6cf3f49db86813f7f7edc751bbaebf92b03a068cbc01e6f1aecb74d93d2c9aecfbd53fe7ddc0f65d790dce4e7e3dd477b9eec1a9277d8f517b8cc9fbb195d309600dfbe6631260b3dfbfcbd869c5fb31892e79d6dbbcfaf2171e4f2aa21b9942b2d2512245c06be7eca95ac350cbde5eb6df76dbf6c468b7eebe6671db692bdceae7f79d35c8f635c1bb370f12c1f3ee6c19cbacb7efed66940fbcaf3a6912b6431e4e3b7f1c3452fdadd96cdfcb3cb5e77dbd6b56d317e17ba2ebb6ea353c181969f5d34e82aebfa0b79f71738fe873d86fcea15686540c56dfcb888119de8c014e88a6b0072e844079ce01085c367a1c0cd08119d2447e68f478826cc2004921e089184bb40081d7ad01b1011e88a031de02852040942d8084183103508a1128205456450e406458a14f14191248a2c5144a8080a3e206b111b4ef1044572d8c103457ef0ae5f48ab7c1f0011210f4823e420a2045504c707789845761491811ec952e8320211254570c4905f1c815e81d6fcf110012242c407911e22acf76080c083ae4187401341810788a82006321082aa88205170021235b8a03ee0f4c70d22e8fa6f100513e81b84199af0c1c1821976c03a6dfcf1ecc048119dd23d3038e91868cb4387e6d13b681d2ca1ff2b7610039c5b9c91f7ce4d9a89537e44bd39f306618c3331e0befbee1e31ce19488a31a77c21cfcfdb9c72ceb949332a9df167648427a876528925a4f0ab950ffe853046296954493b2fbd2ace33671961a657c5365fecbdf7de7bf9f6c820bc32ac49d8c3c258de309d8934134c04df04beaec71c0e610ca2bf5266f4a2dd4df4f71af34da48928b3f3a44f2ba753e9a67453ba29ddcc2d5a267cf01c91d233cbb2ccce9a65735e9f6d14cb3e13fd36e7f626d4cc5ed4d168ff36936dcb5eb4bd689a6c53b489b2956ea7b6fdf67a9b6fc231e198704c3874e5449452ca8d66f4b3d2cd9665382bf1a0c9ff300dc3b0df4a59966dbfed5eea9b267a6dfbed45a7d369e5742add946e4a37a51b8ad2a265010f12423c480491524a8d52fa1133a54c29130e24007e8c611862186218626f42c51612c3af753419db300cbf86bd8663ce8f450ddb1a9611fbacc3e29b704c38261c130e5dd520b42a4ba7928e928e5e639e4efa947ddcbd86d4648278d6b4ac6d1af4b46d5ac6f0ae316de94645e379774859a59552da9a1bf0ad0965da614d3d2e6b4d3b4c3cacad3c48741c71b2488690fc64d8a85b8141d32b636bc251d1415140f15c425d794b285c42897e77fb57dea7fcd9932f77632fdadb63f4c4f5deb4ecaa31b9c5aebc69d013b778cf29034461e9a67453ba41f107805893674d05cd684a418dddb865a4319a529729c5e5ebe007e08fe707407c090f108e441e2008e101028f18e96a6505061a7485adfdfaf2da261c138edc4ea0643f9fae289018a34383d0f9be56534f36a578c6b756ca126b35eda8f9617cdaf5c859bed21c151b680db5d6c8c2c27c966f1161975fdca7ab949189a6abb8fbadbb6b9549573537a20965da114d3d724783210b84a6fca61dd0043f9b7844964d93594c382b93c442da3df26c4af1aaa7c91ccd94f93407e9e796b8c31570dda48c83304d8533a14c3b6a8ca6942995591e5f142827ff44f3e9df1aaf6ca63e4ddc1dcac0787d8de254346c5a530f4b8b38eb93baec57bafcf06d779feb54ba0eeb50265474c1412836ca1e6d1515d16ee11228678c9e28cb84432b5da16e1fb3999a3d0e9232baabe0a07c02ea79c569e6d315b7990cb86d92fdfcf45152c645bec8d7d8ee5ac585b7709d4ff4afcf3a7a7a30f969aa0c8ce77791393c5cdac0e252eb70f9261c68ca7fbd09254d297e6badd5840309405156200a26fcc086637cf4ac1ff4f004f0c7f30314e7312288c7081d1e235a25141fa956341563f0d7a73c628c8af6a03931c6e4ebd39394117dad5f71776dd7dfced21c32abb9f1c206f8fdd2a95483df52d6d16077aba99fddcff68bdb49e9069ae2579aec317882655f42f1fa10ee5e63c6f81d560869b2c7bed66a6b6edc7b4b3c78b7f15fe035bb77f25edac1ed2da170bf77f7128adbaf11efdfbff7bbbdf2de7be39f3cb64b1776fdeb26618fdf3ecdc1427d583ac518fcf74b3aa0a9c65a2aa1743633faba6946b8de1fe18b47777798ddef5b0df7d6fa1863f19c750fab599d3cebead778af13eca115fd2b9d300d34a7a5061a381582f0fa2e2323c423ccaeec7be9be7d932a13c4ebb6bdc6c40f37cd63086dac0fe1265db56f3570bab5846a4c9efdf65d0688639b7b42d37851a7bb275f6a4c19206e332cd3b253e9069ab0cf5f3ae5afd98b5c42715caf5a6b85fc95ee4895258a139d8c524aa952cd3925a594ca5a6bad125a6b2d9702192451121559ad1654492e055af6cee7dc30c2ee3d494a15961c1e7994913d487104288047950f3c3d28c2059cb4083c12e105d1a06204e7811a1cc9411047747064881c47783802e40810468e6064e8884a020dc99064861c3e49787033043d2a01effae70d64d0f908a9a123363ff820c708124400c2880c466e8c94c0080f233718c931a2c3ff0a233f240146187766e64508796429e703f0b5af7c89a391d6544a3b33f79c14fff578d327c1a79198d327c14cad32f2fa59ced44da59c1fbfa6d6f933726f1a2b08f25b1169fd6b6dced65a1b6f1781624c0a3783ee973f2e87266d4fa37dfe6dafc8a0b59db5cf5ab74119e326a5dc7ece39b7a79452ba7dae98d6d55a6baddb678b691d87d2d85f54d56ab1262aa84bab6d0ea5efdb6cfbfc339bf6976bbbbbc0635c9efff2bcbb0b1c7f0d8fa17dfe196daf6c7eedb727e5afe1db7641db305078566d60a0707cd9ef72d56ffc701a3297e0677c89af72024d83aee27e6f45cfac39edcf98e21307a983be97aa285351f225c78ba9aae8828a32b5f2f05ee68b2ac6d49c8ac38ba930782e3353150c5ecc7b35e7e72fa0e6cccf8931f2c443cda9da0cd7ee929fee9e2f45f064eacfef9be576d3ee4894a148e2cb7c24489658224912254af89c73ca4d81b893ee559e322bd648595590613cd9821c8d5858b47e31278cb9c16d621847c3cd26cc60c47761cc241905e1ff7020d0fdd2972f26a594c5a22854adb5b258d65a7befbd17931da7e3f5fb82d3f1fae5ad168b055110d555e0efbb0a98e4746431ee8b1519f4ccd6d1254a9b53e6020c140e9f6e182840317725f3c7fc38ff95ffe6b7597eaa1363b00c637ede34d3557c4a83d42534e8fa782c2c8f4fe991f848281784960f371705fdf1838ec05141767676767676767676767676767676767676767676767676767676767676767676767676f263188cbed26d08f1b93b7d6d463fa5c99a52fa73effe1ed75259e2f927f3b798ed53feb270f2337b949fbb8ffe6e9d9f7eee6ace8f62fe89e8a7ce33dad4f267af5fe6ad7d9d264f5fd4751b422c683f3749fffcfcb423e9c79e92f486911f7becf38bdee6ec4db68cecf3a6c95e6f1a14bf378a1828f64bd935243f79fa7977943d47bb86e4dbd33fd95d7f814f0ccb33eba93df6799b4f27965f9b79caf958093dbfdf991f633fbb0d21fc7945247a98c1d07ebe48ebd75babacb8c9eb8ebed665269de8356d467bd1ee34c5b58df167bc7b9e39ffa45da7294ebb0aedb494062017bdc5f2671b42dce44d76a741358a3dedb417755a77916b5ddf36d6e5fc2ed4741b42dc0cf49cdaec727f01c60c3496533ccb7287bf85c416d0c9c08f0d21fefe6a49a50c4320024d4919863004baf28154628912499028814409225b7601e6cdfdb0713f704a045122c8b6cddd6bf4ce769675dbcf395f703fe83937257c703fbce07ee07ed09ce038ae061c0d381b70a4c77e467efc31c0196f8450434869fd99b9e9a96e7a8230ca49299dd5d28ed3d1f1e5c5e9e0999bd13d73e926ddbf9e44bf865fdb85bb616c182ab885911088c8a70442f2392710934f4a291094cf5a6badd75a6b2d1033964f0e081d5f0605b55a40e83df75cadf4111c90201617007f3c49c8fd2001eacf8eeee0d3840222cf8df341ce4929a5b5d66aadb596f32128a8d5ba32ce0739a37cbaeb573aa79c516edbcab2aceb5897b54ef4f463d0a416444f7f8668cfd0d89c915e59b5c57e7eb6f7b7b7afc5d85e0f1adb3d7f7c99cde4acc39e065dc997b3eb340797ff42acb986b04ac11927fe12ea2aa12efbf3ef9cd7e9743a9574944ea59b1e392a8c922ff42d4e71bac36987d349076a156be6a44dc82b38a935a5ac69870965c2c14b60211c145d28a7035dd115bd35a478c0fc90a24e37689f412d6b81ee54a592325807eba8b08e0aeba87a64af838360161612632a26827f624c060484e46658e954ba299d7ce4e0558e0fbcca51e5a87ae4f85801d1c12bee868be6a872543d727cac80e8f450a97ae4f85801d129dd9476609d1c15eec951f558f9c03a38880aeb946e4a37d8ee7077ed957d3a9d54a51b1c642536c3ea29100ea18ad636e4cbb14077da934ff245febd3d1c0e9ae67a9a730c2aef88319547ce393927fbb828f82d64851b2fc1435db6c14331663eb58931165ed986b3e1a29c0b680f0e1ade8ff9a14762cc7c494d38261e3c404a78cf43a918d331ed49c2e553221428c6c8c74bf229c63c1e201db4279f4c38f47b56bb9b70f22ad3207336681afb9457fbdb949ad828c6d0b98a2e1508af0fe105218570beb5f6e596516371525476d7ee35efbe0965daf14ca969e98570b6f85cc12d5ee1a4fbe29e0753bf45e470a06bdddc139ab2387cb95bc8f953aaae14acdd6ab5b65a4b1f6a2d03dbb0ab757bacdb2c84d0ee5e3a554abf8482755a9bd5d2cd0f4be96f2cf922b1eff40797f5c4e5db70193198c590ffb05eaa8a2e92f6801f334e88ee374e9d3e7fc0abf358b4704de8b1b82f1f2b02877fe9c0e8f0afaceaf72d67d39ce8f2d447dc7a2ed6e112ded8b4d65a2b9d239b88fdd0aa29b569918989486fd08432e198522da4edb4dd6b4c3826d433e19852269409e746ab915aa49694c93707915abdc584634205e0c70652cb84c362431a623999522425a4252c38482d134e121a7b2e09dd738acf7f2214bcd18a744c3e0749991456d752a5b7f09e8352844e263b00390f663e4b8a766fd129ac2d8595c2faa107335f84ca3ff3dbdd5be2ee2abbeb0745283e492d1d3e9fd381eea4169f39c84381cfc7a4560072082284c811244778bf4141a694094787d5f30314801f5d44ce0f03f2410f8f11d6c4fba55b429d9cd82de305bc812da4cc5e98bced4cee7da5d397743c5ebf84baddab313297d9624fca8874bddbdfbd020366937328c1152d3e61123b38c71f0f12433c438cbb41d3dca7bcafb06450bef21363567a56a290152231e6480d6745593b0e098d3d87c4fcb7e91fa213ec39079e82d9ac08ea5e06a385c3eb3b4a102b4e0f66e2ef29283e5fd4b5f4c89799e5effa878ad683992ba2139fcff1e84e57587cbe109f9f75bde587671c7c7e66b500f19983cfcf38e2d59177641e3df708329fb26ab79f2da14a37fb02d2be94a42a3e21d5e1f357b4f8030026b129505d7363dbbeb49574064b27fd255ddab1416aa2b5fe5289874947a36da26dcbde647b9392d6dae44d762fc998fc9332271fa44e62c1e88186d90b0cccbc071363ed525635022942527af8944035f99cf3f578055ed763d26392a471a6a474c951fc53791453c5a720098931fd059174484148ac18d332fa95a0c7223ecaa7ac628cf6f35380a4e8a4048931d84f20257817e9d4c75fe32256157fed147fed1a177577192039fa8e0284f2fd0df1f95a97b24a01d2a5e8a404892e33622d123a00878a4ff199030204ae677908e02771408719299ef41c50b149f559fe7a160ea4d824b95b60f9eb4975cf60d977c6e327ed9cbbfa2fd3a49471c36ab02d4720bae4bc2510775e3d98f9b8cbf207bad79cd563a193b7b4ff543859b32cfba96d9dcd5e6cd889eb41d7ef3566adbdec6a78d4323d5ba765a0eb45addbe0317b8a92a2e7ba2eb9caee3487ad3934474a97d2753deafa8a127cfe4927aaa7e8322b8e6a63135d6610ef653e0d34d450830d36c4fd96301f561b29332776c2b824747f4314a6ac483a8f457df9f9df93d9fe3d19fdefc964a09a9381e4ebddefd53250b6b1dd55f8961b28083edf767593743670c3e614e3ebb06ed471487415207d3dfe3e81e8329fa4235f2689c5e74a106744f70cc4e7f714a018139104c518a12431a69587eef7b8ef7ef14dadcef7209c5aad5b0224fd42aca1f483e4a352aa975722f61d4575f9c5ec856846fb3a9f94d98c96492de0c77e06de33f2a628f962a245a2afd90bd168341a755c0f3a3e7dd8751b439a9b9cc41a0e3b1af4c44ff49b745da687ebed7577d1d7cdbda23a74f543c7af377fd7fc6658d7c50ece6b5f9835565e4ed0a718a343a3f40eecb755b6f9947540d5755d33b26cd7b8b8ae0b1fdb7dfbb1ad1e4cccbb6754c6115de2e32e9fb28ee8128dd03f190361a1d68e5fba26c61842f8f6efd7705bb30dd7ab4b7990b9242030010660d1a5bf1edd5f0f845c119c0f34ac58844ff00b097abecc7fbfc605be36a9057bf70d1dae3be386dd352ee811343784eeaf47856508084c80010d608003628c44f23ec6c4f82e0850009574285e2daad2a0f0e063619393a383f7abf572befc19f3e5bea1c3fb1bf2e7ee32413330decfc5dbd04a41cb9fda9094792ee26f38548f05fc07845b97926be85a0205a8da5d9b50d0540f4675b5ae5674b9aea1ab5f2d3e4351dddc54fc01e00508e76c41a60f61dca49473ce4969134d3451adb5d65adb44134d34d144134dac80227fa6ca1a0ee9cb9fa192da2138214e8813e28438214e8813e28438214e88133282119828421223aca838fcbcc21981f1b8b1b00ed6c13acf0d49197a922ff051a854aa8f5a4230682638d563215fb36ce0f0fbc60487a3168b434ef560e0a8c5e184f3922b2a20461c50df56a20ba4f3b9ecaf053d18f91c0c3a8713a1c7a27eb5b1bb9f30c1a5d4a93627420f46e2d5a623e7cf83a1b31bb1a2502a073d302115c40571414798502694291565ed4a27593395a5538cb55a4a29a525d4ab32f8b90fc20e66324c38549a703286b515ad66196509892eb4e7081ddf662f4c3810c223b4a9629032711521040757813f9e228ef02596582cc6dc1d8a44f752284324eae24f19a0d722966eaeeb35764d6a446ef2787b9148f4f955447f4df6156d9acd88de7e165115ed4173ea532a0334e3e3fb367b51ba8104887f751abb25db5d8c43a24b28987df5c96f85a6c34c0b85bb84da3aaa7596af80d85abaf76659bef6a3ac2bc736535b3cc26d4ac5bf31268707dd5bb096c7e2713f34acbc058790f3128d837838082f818570121c81781ce2e9e0d9c0250855ad6c8795e096ea3dec2a57125fe2c7d60fdde90ab7a40c0ee2bd00b50ca1a2036c83214e83a8a60dc5a1ebf75cac7052d0d306e3883127ace3ca792ce2ff1c8a314ba80dc531658230defb7adce58fd9ee570e57ce83a12a8eed4e4f38a20b8db5cf219bcdc02778ce39c61ebfe2182bac7308a3ae2897d4b7bfc2179850261c2274f0bdc01cf4fceec207a0428431ca185f655ed7857a5706c523f25b91c33bfe788cc0c133c474e98477a96e39dccad28cd1dc83c63a3de19bbb1a8eebc63f5109fd81c1fc792c5e27082b2544061a0a3f3247a6719f4eb4847a25e415ee89b81242cb94aac10f6a099b202ca10283868fed6025d2f09eb59f03453d16d7ae66b45d6a469e8173469e23bd33525e57a72b9a63e6baee75efbe007c62f532ae4757acf36022ddf434572b242b2274a73ab3a652267c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2cb43fdf7e8e6f5de40765d47af4d5f36022cd2e909c11dda9100ebf734634942fab19b8003937040e89700894120e8172c22150523804ca0a87402987403904ca21500e8143b821ad163724de11bc0370c480c54051f2256730de7371c92dbcf792bda05aafc936b649302a7f29a57c491fcbb4d31efb8c611886e57f1af6b4ab9ceac4984e5795e70a54b18eea4417989fae709d6ea8f4edf46635ecd4d0000040004315000030140e078442813896c69aa0c91e14800b9194425c4c170aa36112e430083292306388214000400040666466040275e349c7a61204379926993c7d9fc9dbc544776fa0d341cfeb2dbcd9a8562c2e9ab686c00de70f51aa4a3c63622f188668a4044ec6bef81bcebbc5fb1da9bede04c045d6678de7dcfc17773db766f8aebe57336e4b08020c00526b014cfd4d84653ef2c8dc97c87777e14e733290efb1f9d11d11472001efa0612e48042704b99197582ad4d3409e715127ecfbd478e5c2c1dc2747880a3aecd61317a1a4fa494fead146712a2b8286b8e46e6de410cf57d1de184749627e8a64330706f3e32b2106387cbed573ab9b3e60ba3913aebdd43c05fdca96e703c5098137c80d77cb69778bedfe32d1269ffa6442445b33f0b949a8a9ecaf3505d06f7c2234672d06ab8eb15d7f14ae65471e33249cc4e6380d92ff97d39efd8ac4ab29f1bffdbf46246c488eb46aed0801496309c75768f57452fc442bcf72e2e1e6af227c0ef9880c6c11db27b7f9cf84f0a6cd0c69915058c2e6c0e24f1b77b5ff08ffa19b306a1a599dc1e6a30134d948f3bb5f27f88688aaea1f067de4a8485b833ef91f7d72c5e709745281b0c8eff654b6f624e94480fac4314c0df7dc13b75f098f6a7aa70ef8363eb9e5cfa4b6e473e2e0ccddaab8752ad08cb73961e22ed0d406392979e53f41ce8f2bc5934026c71bd215df00056b25fbef4f1321c85ef72e4abe4687dac2c1f84546909da21f66d152b57f009d699187daf335c0589c928e044ca0e37d75f9cdda1acb4e8bf647f9bbe09bbbba2909a1c2832757e580b01c1c6c813ad68221e5052a9a7e499f637134069d1225fcedcf00c06368bf4291d93ec531337d51abfc39b9a660bf9d0f4c4d63d15e2e39bacac38e2c12ca738f9b73c22559da16809ade299f1f3d5fb17a400d81aaacd1ccb1db560e9d3572f04edb818351549eed9221a71500705b9d40814275077c1fb2cb200e06e116c89a6023b7ce0947d9098cd79121776a8e46f4a98042193724f721fbc80a97e5daca689327a3a3c53884015dc4e51474030455ca1976cf2022f532aeb19406f49a0995083af11660ca74ceb7bb8de4ad8654a2bd9000189713dfb60d4a5a910946476371c81e34d72a54a58516595eea06e89135257869243736d8311497d6715c486f6a007468f0f86dae4e8a448df37f0d340b4080c161dcf574d27b869baf8bb092f98377e7359348974feb4fc57510862ca050d8b2ab7b3561bc9a2b37c832b1cb4bc12a6c9561f89dd51d822e68b9086c05646c3be116e99ff49d8a15110cc442d519b2b1659db17690ed37da466077570a7945d05566f20cc4bad23991dd0728712c0b49b85749c58e8241c5dd8bde2642f2dc8eb2589a477436839c917aeb24ebb20578472ab85a9ecebbeff5e218ec4c20d88d59b6d54d4c10ebc5af2318b68703c614e7746f2033c40ddafdfe0752ab0e4f568f72d89c48314a50fa3064ea6a78887369b08b23b189b0d52c537db28a04e384143e422c04e3b2520c204783402b6a63c4fbdd5c27432d2325737e24b89449c03e48fbf21488a6ac4453cbfc3228523882d298bf3dad0797d58ea6c6ce71ba01fbc70c4c11fee11cd35b33f63c78aa4601f155d22d59f838e6a87b92339be2826e91db8d2ef7a29d32bd8441847c131900ff27e25b3dd64a98a7112b9c6f0de2e05d14af2c11559ed11d2818a200a00fd91848848f6bbb2ce0d86ef2119075de433a3a6282a7d4dad795e4000bfd1929748deecfa7adec7d1f6f240ca369329233666560f6a3518a552f46154177897118bb34bfae6a4587dc94cd3b44a7a52ec5f189157c9f7275f697e37f396984b7865e2295b7ad299b1adddb9cbef288c3d8376047e96aef7fa4265f476140624158d07953b70bdd92f00a8282ef8b9a31985c78fbf45ca3d3ca3e528a78a0cffecc40b9833a95759c541084a0beab995d6997752e45abfa28c949ef95a85dc2bd546ef57720053e74760baceeadfa0e6b03ca7cfa363e40e14beba0e72d513c1c9a11f60a017231cb2736480955df81766cd4650fcd72872551ac3ba2c931aa07c580935a994d405e03329e7d1002c03c09a450cd84a5eed019337fc2578c3b12f03da7e9a7d4a32178db791f459f6f0db6d894c77b5d9821d50f004c3af09b1fdb02bf8d05aaf626f8772d19dcb3d17f0b2587dfcb5a728c5c0f346e7210d3a1b2a74fb96c1f43ade9c0c6ad9b8d138aaefaa00cf48906224ebd6888d17771c59d2b74773a2618d6dfd84e5a016aa997751bdecd287ab12fde2ca370108269e66fdd415531ae6f4f41ffa48b10f3f2fdb119dcd2081cf80d94b7c75b970e260b2ed8fb8435a5a1baf0c84eb43682de1e841bcfdcc354dcf977810d51af29ab04e0a1eb71e70e0025e668bd3c5703f91026c1c2ff1a9c3fc64c4c2804308a6d15fc54dff2be26803991f37b215b7a631064ce68bfe144d6f66cd4005979d714453e90d73ebb3ea577fa70d9aac030cc41c45fec1ae5d4501e33457e4800ecd8b1a0eb112c92e499e2717d6a4cd83d01db0fee4a2bbdb3927fe0a8791c799899db603c561895dcc378121a066f41ba4846213bb92aa446be3c7a6f1639aedc35f08061baca2bdd38eefce8890e948f1dc428bfed59d847a5c2288bf029860744516ecd2a7cc3ec8da20d6b318a1c3c1e806aeee613a1b51f5400e9860a1484c61ad485455ff0041a1d457924103f3a4c43db89b38e1c8a7bb382eab8aa38029510c177953d879c9c74dc29a78880e8078ab08448fb82fdb1989407878712a62d217fa9aab54ff9835f06071a784b4ef3090d79f7fb9458142687d05d9501a605e4edb037e1a8cbfa073d468b95eb0a873e9a3c0c85c4d1e3b18696caf129a32ff49bee5f031e9a597cc072d439c1269f235528eddfc1be1e8116ddfef54dafd95a2af86df4a8d8d5b71028b172621e01b1dff0815e5afc8a4068837dceea8cb8dccad20699c8c74a8923c31e6f9550af0e64fc15011bf3f69772008ef54ca66e0e02cc72df58ebfd5ab9bd3579e820e80befa8018db914edbd08e303a2f05a7c063a86a3b3464c6f243894e6756589db56aebdc7e04625f1723319d60963aa5c7e4e207408e26afcad55d18929280a23ec791c51c2829ee2b9d3b8f1f49c62823e7d0c3a8f5db74633807f525e9e2e8da63598c90ec74841ce8c7ac2ac21bfbab9be8db2fef22671c9636c37df41db822acbf0fa58420593b51b70acda7f3d2fb493ce1399799c9c6242fe4d1ddca8a3553f9bbf0ca2667caf15d684af35ecd1a93dd50f6bc12158ef5d31d9fbe1368fb65e8721ff947862f14f24ab4f285fbe94ed0f53a6194ec6c4b80b5d83180337ee2dad861a28155f6c1db006b722ade20d2a78590ed0d86fcf9ab84514f4496ccb694811cbc5467b9bda8be9edac7b9dafe4b0e7debb71b21ad97d127eda3e4dea0d1e8ae75023cc4707ffb9a071c04f48e67271870c249ad4fb35dbdbd801492fd42b5198cc821599c4602551379df5e840e3485e4ad61838ca3e6f41055777b6ad08265963237e031bd21a9f5035dd50ea16c3cfc681e491337354a251e3d33d4a1df0c2046d8b18607d5ffa40f1595a8490ba2ba40a96aa5dce19c098dca74bc1381b0183f416a3298837f842d024c331007a4442b6448184e9b8f59029a45f583257610e4c9723b6b5692b86af27cc069ffb03d2aa198ee163d9896d25fe5ed9de16628f4e20607d2b59d7ed3f9ac75c930381fedd804909b48212082fc501e7651742f95277adf524941c447c7a7e4fd877dd6eb5b37c24928c0ff2be21f346efc122b1d5bb84cc33645ec87d02fd414386dc642f8432ffe017e496f13f2bd906602e25a650bf3e60f632ed5a201c3de2648d2885d1ece25aba54ecc00c500d97e1c5d6ffa8a6b46f9225c2b29e20dd147d74fad377147f4f3bdd7f3e221e7f00d6f6773788b7368bddac3d591eb5425a687398a214faad09c73ef9ba080bd3d34f235d6766f141a72e06b9f2d1cebe737d32b04fbbae7fb6a5c88ce472e3987165eefc7c610515d9980d992698187732771cb0325eb98d2bd7c1318357c78e59fe9ecbb2f175f9b990af081454d37c4a0539882770d51265fabd8010b89c7d0219de173a80f22b6ecfbe6977e6996d888a06da270034c92073f1c0185920a4799e8ba5a798fb73e769979fe550d1240da34f463e749c5124f6afc1864eed79fea9c569fbbc1a2d194c79dec6e106073e3066b1fed3a98944d8928fae622683f18b28134627085da1d36c005f9c651f1314f2ae3910726d8cc7269f984a2106c831f2acbb407eb0ebc510a0254b1cd4e21865cda390ba99878b28ab53fdeae6d548678251ddf8846a32eccb587c67c1fb762d85bafe3dbb8a80c5b89b46b42ed03849480b58ec736741aebf5cda7ca8ba7b388277e1a9a6b49913cd3d849be1040430c350aa50406b5942576d27384d7c245eb47319d7c00c649af2aa249de727097408801c8301f58c4e58caa6d5dcb2f5c17dbd1303fd0e3251389e1bcf802de3dd345be803ff051efa36fb9776eb47483b79617031acc85bf37dcfc96ebe2e9ee4c51677788cbc210595f03fac5c85164f12274912ed708d52837ba9998f5499e7bd9e6d14eaf5597d8040084ef2d66c1e1088619b29bed642feb53747a95bcf8f8d84f0c995e712d7c64c1b44e5e72ebae40c25e5b615c81ab858c7cfdc1199a301050fe05d3c5894e13fd4a46d123aa4f24f8e30f5712b0d183e9f7865a2380a081362b6f27a4a3383cedd17ae81411bf68c07482d757df7899a1fc733dbc930a514992dfc8e496114c2784cc4eb63e877523e814be3b212f18b2ca436be9bdef198245082bc83a8ec90c3bcada4675912d30b489b741f7d64fc678c2db13fc65364bc546139a87f627253438066f3d3556e1b7f345eab928ff5e265c4ea1881c161f4a68a1a16d76065a8092492e07bc20a1f97271d5f4b57b12dd62a2403e91bcae3ae09b0f8f0fb18ce2a68545f8d62953e120c2219b8923be60a390a245641ea35a7e942fe28a27e42fd4ea390d06c9ec078c2e5096a8d340e460af580d3f0647e799866c1cf77a5f366082d5f5e4bd9d430a455db8e68acb6920a8b05336146e2cca3ca45f8405b41b9e1e2409b45c7a5644423e0c1ef423cb0bd1d60e8a0e3142bee102fc2b0e4f92635479b301f629b98155f4979d51763e6bfca5ac8d95500afefb80063de39147c3aa17baeb5134b3c9e4bad074c3818aba64fe9e901bcfa9873f138fc03084e729c3d513e596735af3880f1dff704b85250148266117668554eedc10b5433114600f9803d8cd5618bb8bef8ee561eec0229024bfb220a51c30198701cab7000e1c76d98382e49aa12477ded9b39597196fac08ec32254b7a4d1b0b70c56e1d34122d341627bdf698e57801e0093502cbf677782f23f6155c4505c9376ff2ace3e07c508a8b921d3a77f82cb3bc23ea82fe418c79ac6d9cd835a19dedfa663b9eb29b05613da6f470fd040d70978f403c6c0e5ae22191ba37b409fde095f4dae12e2d237663f7a18bcd5382cff71e3a20bb34b074653640fc7b91ccec6f6ebba04bb8db859a42bab0798a3aad00baa7d30910b5bced35f3dedaa4752a596afb332fdedcfc4605446851b5b794113d3ffbad7680c340a0985b6989c8a027351165d86037252f656b6d13769e251009a7b95080fc01e059e8377425d5f5fee7de28bcdcdd3bfba91cad07821f2b4513087154b6bd5bd2b272eae51e2a31c35a96ede1b052648620361fb4fbac108700489c1c828982efead0eb84154090d180281107fe8532b4e5c7f4146ff81035de19d305b9e96bfa0e5d9118efb3a3ffc4b6a7bcc32048e521f33b768f30bc237f55e346dcb05e1f7cfa30c1757d5975252a2beb51be6c18a56e4df97462030f2a97263ebb4cb4f5dbf00848ef4616eca54af80a9864395887573efcf7cc1c86a74cf70d09b97576681db47351f166e42b17dd95967f61dfb6c35680604c7efbfccc3a8e6765216a8eb49347f830e08d3fcacedd2eea4157c2615d140197434c6c02ec7df75dc0f8f9ca4bf799492270cdd60b134c6ffe79b96b6251641c234a9194a59fa336210932508264d74bf24524a93ee217ab03ce758a4118cdf4f17a60cc9163401f023acd9b7ba9f088056e67229d72f96b97cc9c5b297aebe72b5e4a5eb2f5cbd58eae22b97afbcbabac4e56b2faebe7059ae5d0539dc62c4f19be1a705c55fa44dc8fd11f3e907c09756c4588bfaaa8ba1778d459bde2dceabb21f8a88af8bb96cb9bc725006f8c14aa6c7429b616cc39602f73986808760ecda759bac4a7e297f580f831843aab3fa686bd78c5e5bdeeef9ca9cdb4cd52e523ecc7dc300bd8b049bc23d85a13c915593679f2a70313a9655cb8c8d04547844f43905edab11b17e6240f5bc969e4411e8061401249ade2de82989b78648bc0bc909c385b5670feef2d19757b71f024c28fe1570aaeeb1083ac7206b5cf50d5cd1c1b90357b538b3d3f840094e1b63c54c50a6a9a8fd7ae702ba576ca9f039ab32b4d0aa1ef2daa459d53070ed336ee692f1e7839841be7a5f703b854eac9ac181946f1a00680a37d3716632cd36f6f494c395de0f595055cd3e9f9d4057726471cd15b9f4d9dffa3e825f200f8f4f8fa5b52801a09d4ae0c3ed152eed7947c830d1ef92811ab3b3df95409f63f8c2b663670e02c64134f957ff333369047e393f8be9757efd4b87d0eea3975d8e3593663c6ca7028afa07e95ee362370896cd9c45246991e4b68bf33822d928b46ca9cfd242dd5cb173c9eaa7503d10f6fd2b5d5d8983186cc0a0ec48498f794020f01c1aaf81606fb89922e72bcc3483b9071557bdf6db0d991bb84771e110c5b25fa0b091e90981777d8a57cec89f5799046f5ee4406f4cf3c2c57f2c445ab0543b598528c2faa67f5fcaccb080970a1ac911d1172845105c24d1a957090283304bbe9e7b5d9b01da7207c42d722fa06ec267bc2dabe7510103149da60455db2e812cc286022d8a3e4b5424e5601b17efe41778c9427de0c12525afd81c3bf2bef443a83a37f6460eca01f10834b26a488ccaa234f8a96e3138384ac1c0b614bc7e5ff343f57c96b6e2110c4e48826c17e1b0dd54b840969fb1c2533dd0e4dfbd9587a1f3e57bba2be12d52de73ab3ae8ed9cf02fc924b51fa1cbbea2fcc28b922fb9bcb0d4f52bae2f2c71f98acb4b2f94bfe4ead52b972f297ff1cae54b2e5eddb5d82fc5efd9621e7f105ffe3d935885c1e1ca9bc0b815c4dad2e65238fcf656aad2f0acec90e9bfad99dd877fc7948e8a797d2f7519693927301a2b93d9e0b6879f8ce3cfa552567826772ef9bbd2e711463b8eb5a1f8080f3f78e917e73de3eac3cf80bc8a896800664d5d039bad398441f4f0e34a215263e26761c10f3f95347daae9bc9a2afe001f7e5e3c4f059fafc68102a853686bc6fefb37a414fa76ed0753e13b19d9dfc30f56823d17a9eea0516a18e9f50f3f1e3d6ffee36420a5d8caa1674a616daf0b14acd76a485cacdc117e16f690c36fcff31338f94c3bbb1fd0f5c378499d061d1f134395007cf801409fc89c3960d6ef712181dd19861f9426242c5d145890f525deb9de10071732ce9b436de48b121fc1456ee6a61e0c72431f7e74533c94e3879fe52704407a3fac956488fc37710961b30fda54378f2d6dda50dcd86b0065e4cf8f5df5eb71b4c72a974b869f3dc9b12e63a3d09c0fc8ab580f2d4822e1742290f411565b2c9cd018ca03861f090e85ed8103cd3594737f57072597ebe28c46ffc8bd0110a6a943bb0b13380c3fa81e20189b632ad794683be51c65f8b153b558f9e46c5ed0cb1cc0a7e383659cc0cf78809ca6d2d97ffb8fd9452eee46ecbced4e0d66961d0c3fffba16d35cafdb1d39dacb3307ce71626eb0b16d984086ac1254287e6975f58954e8e206e2a2b20f97a4c81b980590e72a3a113d806107c1973a2bd2e8427ef348789f6519903acca66f9a8444a00066b5fbdfdb068038a7f38b965a2b33fcb0ee8e0ac361b341d2844da4a6e132f9d4d48069db0eca36bda6fa73a505ad6560e688f4c72c62c0417a0c3fb0859b9bb4ed187dfedc8cf3514ba39b95bfeb41c32ff18cbc8b6685cb3cc6e4616cd38d44a71b3d4d7dc0b0b25837ac346bbcf71ed91a75650003bba197b6fc8876434752d9658713e56e35fcd393fbb6c352373bdf6eb093f0fd7723a62bafacdd8dc572fc6e8c8148b0f0663f356cbcb957594a11d3ca5be4f4030f888590f7dd0d8de0e8d3d23aec8293e0494dcaf47b427ab48c9452eb2954d228bb21d716c3b982cabb7d5de9b3ca67ae3106067152583b4a230b69ce0aced66bd2bc0fda912f85df07dd1ef3dfbe04019c09faebb51dcb7d2281f7eb8396c55cf725b4b791abb28e20c9d9423f2778bbd6eaf24994d247ab4523cfd7474a46eec28cab1d2127f0a0febb5e1b949090ea038ccca6d72df153fc64b04c245ed7b999a7733ccf9de757caa918207081b2267ed246fddbfda00ae91912939d502e9d9db60178943fe9dc55c09b61fec6390af146436faac0ac1cc2ff7ae9dce5e1f6a07174e804f5f4cebf9e7a4d032a9060fe40e9b64077b5e4bfd6c51fad23e1da6ff5a73c248223ab4ff4f40e7dbd866b50367a05f9fa82083ac618e002657ed75eb58c88924b75f7c00e77b57bff6c8a12cda34f027adf35f4bb2ea684f32be2a4beaf5a8a37ba08c2ace49c033132df5793d42b6c18d234bde4d1c0e77640871b0b0450ccbe93daac6f7e908e9f24eb0b52b218a34c6e89f443f6fa294002242a8e73228a90b2bb8844320c0941c03ea5f8c92f2f826538afe64795ca96bc1645fc3dc2e8fdb6442a871d6dcceef43a58e412f7f84ccd8adfffabc27aff088e6e780fea1e4b60467c0efe3010630c059dfe5c8c5073d1fb2ba61162ec635b137805f11ddcf12d6719e3766d471455dc0d21062ee94916e31bca8a246110d4fb2826a10bca90cfcd26a17b605abae6d293d02126599154476324c61abf9c482ad4104352c2444321be8814356208ed9450be8e12fd55ef41e970cab51178c3abd0b581fa7d176d3c708b5b091fdd4f75cfd8f8d22c5f7b78bed0a95b5b3e65f3e96af8ffdb80d74a981e85af75b048dc5b3edb0dced5bbbd4520775538de3dd04687a3e93a91f859d40817a028299690265c9caa0382fc051093750981abf5219414f61f9e2a9c60c4eaa1a8ff21339c7d5a74c6ccf886f4bcfc02f5cd698a6a52b1c93af8901d63e5464214602ee88f24d22f623db9c64602886a27665102dac2b708d80c9a89afb48c9a2ff727a71f4c33e72daf4f5ef4defde13d50036131761faf3c7621b280472586c1584be84bcffda4a1bb51f3990278b06b5b45e084b8fc1361156d4185c2116f5945df9febcb6b49000eca16132de1edae56f7ad418bffbafda9a93772fab8cfe1d106e36e73638b2d44809675fba3b10e20ebe3c4bce98c3434118606645384db3ec35bad56efc32825fb3bc3c0ed14a0b2526113b2d389c0299e401d2ccb14d1060d6cf14033b821912afa6c8f270fbdf1b236ac4b939344a962bcc33428f734a79e671b9441db4f1ba510c5053224fe29cea8981c0c2f1c888f7d881071887133bf504985e531324a9e51a1879803f48e0cc2520264fe5d51279c8a991170cbf685030d0f736209b8814b5031866dbc9d0e6cd20cb619dabe236365834147cb85a3d0ee9ddb881cc2ad70dd94d5342eca1310800e316d87f1fd51c012720a81dcc45394c0a7b02f0ce1ecdaa73b8fc4ef9232d9dff5b78fd3152c2456d00ca982a640aa83102e9116e1f81acce8285e563168a08742ea1e2394d4e1774eed8e3246a434291bc6e23171ec42fde19dd10409166c6641ddc30a947280e622450e8ccbcf623058fb0e84c1c8e63018c329328f6108c230d1413578b84a72bcc159cbc32b0c91b3ef361384a8480be0255a0bf9d78b02cf415fd375b828ef718935414c13734bc212d3f601565e3bae63b88d1a88e2d898f258796e08658fad25f1d8c76626fcf88c6a44b0d02582d18c61b2ca574851bccf02207c0621c3e17a797815a86785fb268b51dfaaaa725344945522160ea45fbd67ec789a0bb1c4c60e87b69a16444e34b6315334e0baa8b2a0915c4132e9fd4e4ef3f4d200e509840e7e087ee5c45f16ee190cd412d4f3c288b99a30dd92267e6de525a61c026302877bf2b9d076a0fb04ece82200bea82adce7b4052e0cc2dbb4faa5b552e5814dab3c243c64a31b8cd1336012dc41c6eecb2c479540898dc7a8d4225efe29e3c3670f2f56cb798068c4378249fb06a28800fcfa5ebcc9337a1b4ec25dfd4131b426559523d5da98dceda60766da4108535418f143028e7d3ca3dbb4c3506168626bef1b3616c923a81aa7ec298c97176fb8906834f98aa4cf2034ea29802bf903fe0816685903ac2c3e76605569528b2b32ff0e3444c7076e1e47770ed0cf8ae01b34520e2b0cae90d71615033249d90316bbd95e633d222362ad55d7ea077b81e5dab50e97be09cef2bb4a585a3750eb9ffdedb3087990847c3477a1e306cbfb30319994c1dc96b4b2c4b395418440cdbbce530999f7c8a129730f924c35e63c8e3c754650ea8129bdca7675705b3ca990e634364cf299277ec7d83e90982451236b3fafe7a5f9623e43826ab0fc39b125e5f6e09e2b19aa388898b41c931d32f9db075872214ba9a26d2b138b99433fcc3d67d8626dce7a045ec102e5ea17df35800425843aa7f7cc2da6e862f41f5603b77850caff99215f7664858d57632acd0c01a840f966ffde03f616654bb8f725c3bfc6c70fb489dc6fade43e7378a547e0755bb847aff4b81275c6f416a5a945b1ae2757b269b4f1c240cc029cb76230fae6eacfa335925c50f581508649455759771e6dd8a6765fa59eb662acee948e4e5ad4564c75113a76f276b1e0109f86470bfeb9f3b4fef03aaa2d94c77044127b74958cdd9983f8d9c3be8f7fc1f2c103822ed802abd683b507842aa6ad14016da52a6891e213a42c5016ef264681f9ca1958188f1e75cfef38aeb681ad0585b5b859a4cd3e3aa17e5f1fcab3b2cbb1f6535fe5cf231bd08b01ae0c5e400127b1a76e73beea4fb6176769350da36687721a2fff51b036c09fb907b4553e983d040cf3a0fe1698973fcde0e24e69ae4704dea97fdc83e9d5b97e5233e69c3bf00838a8846a67722a02927138d922916d0955706a33ccbccbc7757c6fad80045a9ab0574afc3e9c912d4f137c4bf3a43ebe45043cb3f176b37d87479c5b01c29285f1734fd6cd36fbf47081a4be9d50b5e10258b442cbce4b6f2a6a69155fbf4caad31caac4b7fb944ec99eedbaee06301772d8655b8f1e557e3c9ca3de3f87fb7f6f507f4820373793089cb922d7be0f1312c8a82b1c58862f38ec9c8a1b3d1bc5f300fe474cb6ba55b057e76c2dbc23d13595ed5288697cb9a09505c202e5c840fc89707fb3b8d2402a9a048d3350dcc70d60f0fea93f7909c24d7aedd95b144d978726f4e9be074fad51c24116507e49e1d33cd511f43b75c57653007df102f7e7dd79c59782be2765b2cb756051dc174f662377a60f37330a7d9fdc23a8e819e2e64c8b685f63b9044cdad35cadec784c4be37b65394ddd6abfa383b8bf10d746d8e03da9006d651c187ea86d07a0748705de20f21213aa1844f736d8ae579765c393de1b524b40f4a76b65c559e7e65643f4185802e8773b536e2a553eabc2800047df99ce9d6b5e9ab2a1d2097ce8de856e4f6551007eb4d08414dc3be5586a5fee57b4a9bfbf75319070b78f60a7a926b9cf9268cf2b8f092d66d975eacf5ac38b89a45dc1b8e4444127b26904f391d52ef8ab29e5faff5d74499aa305557cfc2b39603213609a250360407424c6329cf8279a6ae084397cea073c4f300080876dbf417de50b78e411247a94660665f1727ae042f7402b073dfbb9a65ccc847612435802b32dd104449ee03d2e86b66d2d2681253956ec12fb50bd5bce14877f56622ffbc8f20d6e8132d756b55f5983c968fe9e6fff8ce5b8f69cea062671c9d04f096cf88d9919b3839686a00df017837fbb02c20a763aae832ab14d4392e1f9eb3540c33e64b56c4132db3bba6750649c34615bea25dd8a09ea480fd72691c7ebc24ca0e82385761e543a7077edf9f8149645baabc14fd4f5fd47783bf10fae6666a0bb37a55094ad3f6995f096b441c130d00c6fc71bf5e44850b5197182069e217984a01d4d14f7f606d9e56475cbe658f339d035e0821a7c882e89a6046507303a927f13c09041b5fa1b6151803c688811530e192025714354edd695e3d49902703cc59cd3b306adfb1541c65298a1adc5821b310f6765164507a29952a7947e014fad969339f9fb71d4c5f7e495edf4b12a4542ff5b824ed8b56e2083512115b0921462eda40204993cbfa68cc0c2b6df52fcd389316b425d6f8587d8110f69b73735756e6279ad091c1601f2ee9f60fb35067762d1a9873f4aad833f2834efdc9039364273710acb6a3d0dc91a79bef05079b4f6c82099fc9649ef98b5dd3cba04e4f2ef72c33d49c2683cbb71c48b376620c7adf7fb888f753f23dfa174a2d741bc6d98d18511a5112fbc2805318ed4bafcc133294a11dbadd07d7b5cf65bcbbaa2f7fdcee4efa689524c7d0bb36cd2aa18d13df755c8ae807ce198a4a35fcf6ecec45606e0e8b1a01cee8b123f63b4d8f1c8eb106d36a6e94732680ced3e3fa114354d2d4c374e202848e35b603924a985a7efc892c66794f34524e500203a7ee168fdcfe3253a901a9d9d02cd31acc1ad79387dae418de32cfb5310de662352a61382cb607c905127227a71143beac4fe5332d5dae6284b0a51ce1f887c5134e8fb0a04b89d689f4e3006a2c941d1904e834378a79b95ab68506ed316e80d7a3a91fcaba68c9789f22400edf883c8970a1c80615eb53ff50aed91700460cd4204c0960935c60ea28523260605e20911d3d12f4925404df0329dc8f2c9711dc0fd54dbf5ffe4be2c2935b13bcb8cd38c09c3995d308023899d27e618d0679032f44473e7132dc3d4dfb75ec98c574f1f50229ff9507c9ca96d66a816665181c7fa7280e165da089e19db41301eaa31351711fd813111063f38fb5401d753c0d4e8f50c0a4d81264131eb41fec851e4a837d021dc896762f55f12e25119c269baea7eef5248c3f8b1ff90a6603fa2e2d49ad64159e12fc64a055b62f4dbdc72dbb09c8bc81a54e75c862acaaa83433db7c0a80dfb26906ab0952914ffb26be8bf76cd5203bf170240e54a80dc0e5c42a14d42cc74a92768cdf329e195c8171fb18f336a643a3dd12fe54ac36db7d865a5210d53b3536b80cae512b8edc786c6438f4842c8884d99c3613093bfcfa58b736f9663cb4af1dc8b81776d2ef9130469704f978acd47320978bdf4228800bda16d13e39c4710085c4a91ef63adf8d4e86dff50f779f615f16fb7805a2c0226f04009093da5143e9d700926102cccfcc5907fc2559b3003a595eb8ddabd189547c3f3e58edfdb0d741d19903b07148d838b3c6b37776ab674442c0cb6586e6e7c79cc2e83cb938ae2a0fd0492c185c80c7eeea49c6e46b77d0c98c72079aeff0b587db0df20f823788b0da80d2060633722dfa41ab4ab9e35bcf9e9c9d0c319c6c8b8566869253718910f455b12e001e35efbb5558e79b53d7e6b7b5ecb0ad21e3716e682d1856981c6d04f239facca1407dd764dac063fda6fcac89468d8130a4043585b740b09282bd6bf8de66267f93b6a42a189f18f758b051eb7c3ac73461803d850cf08457c6e0d4b281c1c9d500f01278f4a2882c60b52bc861a456d71b13a3c70b6ac426f930a029525672ba5236b6ebce27d948717596d8b1d0dccd96d4f5b573cb8ec2250967ac47ce0567c9b160aa96a66c5baea69142ba63259012b6a25f52546b9159cc928b67b8c250e89b387b4ba28c2f5a082186d07063630214c7377a0ded840d711025492880a7455df73ffb6636dd859d7073e87df7d08a433a5af304791e2f397e4b82ddda33a236025d02561330ba86e95afecea7a76c5e330540d7f4ac4680d3e14e7cd049487aa72bff612b3073193448885a18457420c20d47fcfe791c159fc3451fd04217743b5068a1dd82505c1d4697dcd1647ff3c22bb9bc860bbc7b5aab354094b88018cab0cfc280081eb77b6af23cad9cb0f94c06dd4c60fb51e9bcbf5058daebbefa9c6f1871e954780f602441f85f33f5a462909403213500fa8c42629f451f4731ea636273e1945c2096e73c6aa657a8e6a594965d79b90168a06980d9ff79f87480d63b096985385c22535b192294689a9e3203c7b473ca16154e6fcc40b09ef892ec6733b14b959d44ea7669c159c3810ee056571a410084b9100911ee9599329b533a0cfdc71e398a9507bf4d5e87f5f2fa72d00510894e23ffa94fcdc36bcf167ffc15f3fc8455f384e914ee0e05fb59709a9b38c64011053ea7ca74aa2d62ebeec17a65495c3e72a9ceab843cb7eaa410d9c72737d37945cb18acb9c4da9d1b23da8e21f1250d07219400ef3704af7f040c290115aef02a1770b8127066f5254f77e200f704986e753c9610d196fbaa686d5157b0c3ed01593f1e8b39a9a7855259c1bbb2d6d8084b360d93cc8ccf10b189beeb268bf6cf2f4eef8287cb145eb69c5346c1c8e57b923554f3077725835e26e8b507b9ba811c0789a0b1abba2e0169727ed7a256584a30e9a01da42a61d90afaaf80284c93686eef6b193b6f805b603e27316561c053b2011bb4b183cae0532d20526904fb565784cc831a8410fadde9df156952b72d78b28c75036ac98810daf33ca249c1a043938cda2c3a6efd4a9c17996a48544fcfea763fde8f957cc3ec800965dec85a47ba146087d64cdb14743713aa1441c1763057b7840a90beeb8da9e881a0bd4e389240086e80424ec7f077eaa5fb26b44d4aa6b214526a06c62f8126a4295929df20655b34fc2f9c30dad1f3393e7ed06b2dbeabf3f4e38aca8c53901d9dc1aaa8c8af323b065670d75051220830ccf81a08a6f127d121c54cf0dd08d85e8c8dfa0e67a12f90133a743efd6007fa3dee57f67a886a112ea2445dcc7915b604782b562eb6f16a0b333e2446db90cc760df76933d7fadbbfc8e385af7be08465b89ecee0f1bffd0dc62876fb0388774d8de30222abc4a91b8d083d4e7938038158d3b2138c4e116082cbc78d9c9e709495f0d1e7f557eadf63d1dcc1755b562e6f52aff8ea51171824bce63f340517514958bf491ccabd30bb6d602fa368ecb077e66c86c86959223a0898fd402c98ccd76b28a62bb4083b49f732f877a16f2e0a2d51ce846223cc891747ff8734b6d09b2008e2651798078cc4ca353021b7d7881aef9a0c56d2c1d40f89cc3ef0d7840295f3d62ccc9fd0751003d2191bcd318ed64e346363c84c264f9bd8ee0fcaa3ff40be0458db5068fbdda9457b369accce3c524d65d25c13ced5eca9e82ff9d01503e9509a7e04f1fe125ad52b933dcf1ee3d392a0c2bf4d43fd07802f27b7402dc76badf904b66478cfaaa094d8b83c4c661d40ab3423133093f5cb1c1b599c478957ec881860a63cd8078a4020cb003771481ec52e67f1f7f1fdf6ff26787ac55f19f128eed445205d21c07c69973bd0ed7fe5761af01e099dc963e3461906fe3f623c2a9f8a50f6bbe236aca2a62beb903ca88333c1a024db5344d2ade301b9531fc10abf15fb7723f8d93d06e226f3a1f11ec3d127e3fd3e9a535eab01ca1205ec3e9fc8d0314405c850d81281f419c5868e968e95c2aedf40d14c70bb1638c71553c15b1f0b72ade5d01c06ff671b7932280ca020114e472e47b0df75f4c96c3971a4b87c94e69702095005e1e0092a4b5c30299d973510463d97004f33834b9807238eddafa9901e94d8213287e084ac9dcbff7e59427c1355f035010131248aa8708502ef2c65f5a2057ef2379d45aca0eaec3d8b9bf3c69710c4b226f5735444d8fde87074cb8913a37d22ab6a49a20b97abf375df843671b2f3e54cd7c4604035a41c7b321b41af4dc6776c4f63ee61581af69cb245761febd75d095a1bc8d407c1dae329491924522227ef489d80249230e472b69e854133b26f82f6b8bf351c794160ec25cb7ae263dab1e10b07ce638681ece44a8552008e833eb9148c55f3d1a432024c56d8764cc4737a327c92d1ff3726b2d134262d90706e985ba4123c339873300211980ad8f52922a5ad4fcf2de576d4075a0eec4e705373c6396c8c668a33aecb53f5094abe317df679c4e915f103fd5fb385bc2ab7841b2b0d8fa1ba3296995c49644c86aa6d08de4526ef6cbaf72337b3a96506c65e2bc6c29ce08e2f01e62390b50c24c6e3fc457e836d73f22fc70a274a4f52723884f2fc6dfe3c0aa99967be46546c28b9ad4407713256d27ec495f4e76b1a4ca9c3586470308508101600d96c5cf917e0b8b4e7b7608d8abae584e08ede32c48e12407821cd05cbbf7862d8ea13daef452a63b0850a57826a8a4c47ceaa3951a87868a84613aa5edfa7cb558b0d10f58c1c298a5776ea1038b1d69096efb93494c970a8c902bcc46f50a0ca31b0aa582f23f4b43b8334804885470b9377554009fb70437611d8aa8b04648ef740b15b6c540b1f4ebaca3bac2a780e68bc2cfcd5348d63a3c29ad5337755457da14d07cb9f8dc6a0ac9aaacf92734ab4eebaa13ad905967b21a64f8b9c2ece5c252a8eb4b1806ef7863485d451e3ac93f82268d0aebe6ba0b624b9db433138c5058969cd0c77f2bdce9c368edac8e18e4d8021938dd342e96a08b16882c35963410aca4b0cd87baa248a1be4663b8a2178230644c30a3ec4c80959619407495b4d006027568d3c7b3e492b8cd4723a0242150e33cba4b891459f694951b468029dba9b16e4fa3ece5846322af691f3e7db2499196f121f6bb5f0861d911fbb0fb5f65bb0a095020859d4a45573412f3704a0cb5067b2bd6a877df203b915840958d10a69605d523544225d1ea1f8a955e50f3e63404a8615079083bf414e1c1e4f4107546d600dd5da8eef35545b05865a4e5eac67ef4379474a00a23bb97eeaf45a05f7db4405f93d8deb0d7b17115f4a0ec935497edc99e8743138b85da2372f9dc84b910250cd2748927dc0a67562be965f422ca887749af626e164b3cacdfaaa28964579106c808e142c52d26d0b610219ba2d43dc62c9c7e4869674d0384bf8756354e8d42e53be01c699b4d6d622520d8c3535838810f263f451a17c0a4d7c91d50cf8591207e7a1e1c5a4d3104312f9254a42bdedcb40ba326ac37cd305c748aea3c97bb36c7b3235986089f13a8a12e082a904e77e7900682f7379aed97967bbe30c42e67cfc6c0051ab1c4076d6651fcaa27da159970280cc3a5c22ea97c34b4903d8a5082a033d9b3ade7d31a3d8011f66ae6de8e261dccfefbda52e99f0337fac2bbce140d79f8b71f52bb036955d65c991c43540ae5624c847c68db5977094748141e3eb4bf1f6f96083a2be3ddcfb12eed6d1894e3f8054822505d75bd394434024dfc0402fb9c05626fd02dcbd586ac52fc3b8d5bdf8e6e114e3a6373a5dc0e80dcf12db132706c4dfcb74b463f54a427495ac0901e992aefa212d7163819300ab4d6bb5314e3765338dc6aff410ae050ed368aed8a9eed3bbcf8d2527b9b499fb9a016e6da4c51d7b3326c09634cd7ed6d1982ecfd914e441001d9e5530bbc392b5992f4ec3fde1acc28f2cda41e46a422c0cf51ee7fd1a4a035fead2f62b9d19155bae222560ce09a458c1b1caee8b26b282304085c93f26fa3632b3a74e90a169fc256702d5311a9a8a0a0d42d5d47cbc1759e434ec06b9716f22fde6fd1fa943762672d59b5b07dd0dcf28ce334f35bf5f48c0729e2689f846bb921a795b44668a423343d371c3c43a4aff6b52c9575dd6f412c14bb7f872269ea8392a26eae4de9c7998a60bfac0950f78c3fb3dc0eb6575913980b14e35a3b42dd16241c5fc771504a97373f1dea81133f3c21fe84bca4f347d3f9df691ed7d600e406ee0c1b1d7d35a05e179580cba320ceff67c519131150409c7b6ac2f1c4628c9c5c72c99421721a004acb25eb32618e6e598768354035efdd5342553123a0fe10faec6830050d1cff6056ebff7333e946f7cf32fe448593052014e1ca664d2f75b97c8183418a57a6bb2acabfeaf468643948aa371fa9feaff9a36bc88690defde47e5a3364b537d726d8066ded258ee9abd37d0fe481154726d3e4476d1b33da047299c88199ee5f61f19fe229bce6c5a3e392d93c70bc05416868d4866afd5be2fce11149749c713aa1574fcef59853587268f8c8f267c21c0f7334eb4739518db13b22422aca9b4f5d9a245bd5ab1a153a46bf3a3c0e3b1ac27654b0e97b91f838913a58f5bc5fc9d9043a3aa04771dcb9108d54745c9b7803d230ab965da20d38c183e3842a98eefd91047fc9ad307875f3eb8723ec5f773e5538b97289806ebeec47f4dbe5147709305605a41b5c5377292c9a8bcdb777b06e8bc80b8e7d4bd36527e0b97f8178cf47e4fdcacb48f57a141e49f28b2ae31adb096347835c015a04635b6faf9f09ada760da0572560fab42f9404a747ce33ee0a255c091d05c11b720e25cb9119eb10b6ff010c9ad753de4b161de4505c68797d242a7f7b44ffa1b86e522b1d1b9817d3d288a08050767eacafda7469ccc881e03c029a78a356ec3fdbd679137c0011a0471dbdf3133f44d9b9099c11f4e9dda229e0383dfd14f67e46de2d3b82cf16867337fe5a1d5353162073fc841cb737db709c9a19049449dc71530c90c5201bf15864ba7360d057195251ddd60d823f06fb48038eee428c027cc3e6a83f1d884f0480f3c1f524be91f9b6617e3a4f6928cc68397f6dae527c4274cc0d4a9df892545900d863f0460428b52b89ed70192e0585918113f77903f04511bbe430621fdd8be8bd55f516ea1373fd2ca4b3294572f4e958ec8dde15daf10d8c8cdfc476e0b91dc8209b37a827655f4ad4dc40141bb554cbf8baf25f70570ba66c0c658d2583340d5bee968ecc61ef7c7bd12cafc0690ea3f7fe18eaa11a5e9b1944902785b28fcadee9fee1838c5b8328017783bbdd84e673532fa0d57a9ab5ff10f2c4bcb3c26d1aac3c5d2d25ddfaa731f7becc6250aa37104eb3a8db95c9031817f86512d620572255ff8ca1055eb5d997eb090df5874e0563e2370cf6277193bbe3d3dab068ff9739e752a904b13fa13eac195c26dc1a64dc85c33e6a4cbdd8daaf65422984c85c06dc9f51a04f4845396886d93e46259dc8e72963124dfe4d3d20aa21790cab9acb897fc1882a17b248910e83abc38fce5975cfe2b3ff2a22005a06ca4712d11de8238a0ebe97573ab7b79c9d737855cd8939ab215bc03f3ad0fee49c883cad684cec9cb24abb072ca3da55815fa9148fb385c4fdef84fc90de33e3f09eaf31c126d475798eaad90f5721504349403e435e41b8d67d9f265e7ef12b59e0e4d8f538ece3a8042578d454e94a2c40263d43f340464548d9c565651bd947849551db36716e62297ffaa635f46ee644d4789de91f3fe9938355afb5598dccb00c94d467201b280677bcb5c70dc1e80a7665062adda8ce92a675192976a1aa168e0c2129ae2e08dac5afcae66498bfdb4f02c26516ad6e1cce2a73cadef1016fccf62442ebce5cab00c198a49dd3a53e61ed09623ae0b9810e49a69aefbede835b4123d7033abc19c9530d552547191a67b7f58613bc6c260a74a42af6f3c64e3811b3fd8e2c166265e41026fdb3ebee5115b0fdcfec026faa0aa6fd87a2af83bfcfdf66b0d7f23f7459336650e973667b3a23f7255530e39af1d8da0d2faa4f30e17f7af3197ab674c0c7dc612382494fd19fb2456db8e477bfa0c586971f1ae7b76ed0ff4b1d96f284adceaa6ca1d85750670b57ea0d8c19947013ec455d037834124e6544f86edc841ea8b545cf36804e822537a3bfc7853c21a7f050bd09f9906868812805bc00e3c2849159aeb81a107fe1abd85f4272b75e9107aab015f1057d5a052e2a6bce7ba6f136cec0356be6afa9ab8f56aa2a80751a4bb989e1994aef9556ee979324033580043c8b75dd9e33e030dbef7fbde98c057b3a8ec9c573021dd3e0fcd6b33d27b3ac2893ab722a82c8367d406f91b03f350051d202d9d558126c744516cff926f0e1f608689171cd6a1c81e49e3bd4526cdbd4e944df41550a9dc4a3dad4254b7146883326b81a2eae5da3288c56f2de2b7ae251e58cb52895b8a5cd09518324c7ca275eb6e5e4861746ad68be3291452745d825c8220bd233f1c74bb09e01e7fd8d13585beb8b4d9faca89b9462828e65baf3a8d3211106f2154b5de3a80cbc04b669312112ea0dd215de1fb2e168643946a6f4cada62efc184199d21b55a2d0e8eb7142e38c618babc65cc462379082be08e1a8c3244b04e2c9b7c5098c8e860d9a96b4a2de985e66329f9011df63eb4b93f21d2d14530fad0809a6b0aab1419bc2a629c8dde255db64fdfaae9616623658e697512ea76a592920ba406079971c032f13279127dba13a5bdcae549053e082c284b4e1088b04bf3e33e59f59803c0cd181f591ec604f635a7c71ab0fe27e40b82a10f95d2e954ce7101eabd1740816353e886ac85435e15574cbac2c3fb8c798e4c20a8df3fb2c8e11ee518c736a78f99438755fcc424244c511613ccaaff183acff9b07a13af0bd2b0b238e9a4158a825aaaa8807b424c04e093d4867382fcc6eeb8f18af0162deb5cb83ac785762157f0992bce844701703d4ce708b1a9dc189f6b43242a9ae192d47880aed5ef10e08601b31a6711067a73648fb45cabfa6aa2e9d76d2d141c5fb1ce71b0f9811ff53c7123746027c6d45ba6a75f84112e4501bf3be55bee599635e05a1e42456138eeaaeff8666b9f5eb82b1d2b651e57a2dbd3e98f17f768fe84063ea09c885e11ab5edb4aa58761fd41052fc1b24384e127373c919c8a6a7a88fa910ddec13b95961467a1698a491e5266960c96cba599990068b66a76189897497791eeda1b33b8e0a1370b10cc690df33ba19f84b3bfff3e5667f782ffdef59dcd25de0879925febec105f82c31213d4bcca5cb629374b06036fdaccc49c97c5dd07876c17297c102dcab82fd358533af38a59dca6d378b42151a67c180cb5ca544610ed31a76b22be7ce33ba6f1099c4f0d2ae70006daf2f29b072d81510c7ef73a0d5c0f0d8e1c8e4d180d78a3c094ed7e37eb2cbdaccd0d4769e46e80899853671477ca0578d4d68ff9189dc106bc586f6a31573d3a8608e4d4646cb2201be02e2bbb25538301eab4da651c1d971ac359b4605c67c61adc9b42a30f11babcd4c57a165378c79b630304eca4365e81b7dbf7da0d2922f73925f86c3f9663a1c227c9c56dc6788152d6a57deac1c895f948c8a5d427d4a6dd8cf7cb5747a1de4c6b45c5ca64249b72adbd2510d153cc5904ed90c62c1d5cb137d1c7ee6f986ac9cfc1b6f0ef2a8e38f7d7de61e6654b4170815866f900b57962a4f2f47ca42822c43f5d9be58f22a4040ddba5c53a76457e73738f0ab49a5ddad6704a3661c814789a533aa87066c38feb59d00587447c857029c4a69c248bee4d6ba6adc4c2d727a545514d7b41693c6c9cabda1b63c5b1c7c6763346b3c08464734b6e1ccd3d2e7bf600dd582e3fb0bf1d8b99e99cb6d9a87506df2ef4243d650d1470cdffcd9a06e1a8b59c71999ecd7a1f52733076e596f2d8e21812829be9ed9fc96ee2b0caa080c3cb82dd40de51d932ce5dce12844913035517517aac1d82a69a0134e6b35200da29f2b0f0eaa9e52f62b524d04ed5cecde385e530bd9cfa2c7f306f0edc1bffd329cc014d3f78ac21197407b791bc82829607f6f599b7f0dac788bccd943b375755c7d54ac04e8090ae44c141eff5daddb43e8787bc0327d60bc4432e9421ed0a4c3d56d2e0c566edfe2ef3a2432dce1fef302323e0404ccc7b73dee6b4e0f7d5854e02941906ae5d9731b1b6fff7623217c26de3258b1a57682f94c516602246f72db766670ce8bbcae992257ebbfcb0000a62cf0419eebb98de1f1df7131d3aa7ec33bc2ffcd36b40f7f41653af3ddd6b6ab53b26ea875349301956bb0ed9de214e0576567e0feac23fce2492131d79eeec0fdf476d090848184400210cbe7bbed3f8918368858f5f8eedaab92fad42b4067bb15dab587fcd01113e3a6a7229fc10b42afeac8c5b5f93ac5c3ea33ce34fbd091fc0ff07bdfaf3a9938f07ec2a8911ed6be80d7453a74b3cea2d4be81f20e527c6ea30d8940dabd9f304df3ff0095aa7a709138092a4c7700b3a4d0ea7b6713ac8e09b00a0865edb4b5487db4d09eb85ab9285004c09201df73fdfdf51faa03f603b22929b0b37c56fe26fb51af238fb0061093fcda1da3707b1defb20a60fd3be41311f4ef8e7fdb80de5e9c0e02066d879f5780df73967e9958d364b003e03d63d9687e420ddc190b52141e1710a4dd2de22e218fdddadd47a00311e30cf17f052c1ef5d0e41cb5ef968bef5341d74c38f45a231aabeb41f93e3bec43693c4c7f207295a25b55a3bf2d9769c886ce1e9b13d560441573f6f1bf6208bd84ad19ee0651f67787bf23d39db2e8db19fa9363dc5c0a5d991dc53662e6ccaaf351ba519a8df8511628046b7e7bf394cc3e952adcdbced1b8f357414d99f779a7d922a4d8a3e257b053f339e03a61ee4c4c1027496e27643512d0bd7ca967f4da3f3a13226286867e5781c73a979c8cd51102180a9d5e999f8dae026882fbf224f1896ceb660e8a82ec35420b89d2192af6182d3730005f02e6d59f833457214b17d2c1408f5ee3f4bbcaf294549c98e714e3d63e6f90cad5da68e9cf8245d42ff3adfa308f644fa6b77e8b0112d89d0370c8c40bd791a0aeb6f24e525e8559d8cf2d741ace90ee6877981e988c2e599c0fdae703da7259d06095fb498f4cff9107d69c476c2bf6ca779b544be307f09012ef963c88651940f7e6febd5b940e4e571bdd8d93f1e2f0e5f4433e185979a72251c972a43a48a2525febfe3f1c2a1dbe1a1e5b60d19d0202e977b64da59cedd691623db94a76a3bdb5f53aa826d05bc9a41cd0196b43a8324ccdc5c3057b4cd481f2b9e9ca1e5c31bd9eea3ae9b7089ba9f8097397d713916ef5462fa728330b9964db953851e720913ad2d1a094d2208e40c30aacc880fe1bf4c68a5f44ca92854f3a378f41aaa3c96685b5b42b5c2dce65eae094289bb2ba31e564928e49725e2d0e1ea5abf8bcc652956357064487ac1ed5a0f922b3acbd096633b10ad6ca2504638c9fa4cdf2342e0efcb8acfbf5d3ff29adb20543b0156e1adc3aee5edbcd48de8d3f15a39f591f04bf943fb63d7ec7c5d4be8e9fd62d82b66649b9102a354f0cf174541bc3c534126887134294d1ba00516bdf69809a7328afdcbd98d5aa1f4094f77ced21e799ce8d8e2aa9d904b54b18bc90c9cde616f5591d1c5398affc7917b1c9c1c3884ccd92c33674b668bf5a4ca76c910f91ca30f5806529edb4b2e6124b440a22ef8d2516bad65416b9603808ec5c8ffc41842d0e1f1a6f663cc5f710c8c444e6a8e53611a934d4a7080da09e67232d794f5e768f8a813d2f74997230d5425258dbe18ab8fb669d3a4ba62341465d59056bfdad7a8cb608d6c066456743faea2557c1a3192c7569cbd6c7b42618581aa0df3e5e4806698419d76b75af2ed574bb8e41beb45e944b7afae72454cc5e5a83b68fa2a026ddc2a292f89bfc32fe47565d0f8cdad92c4874f72b0febab4848433241a3cf42d6c8c6fab3e4b1f77169d3168d7df91c4c0188ba965ee52fd55db3062c38446efbc91a28f795a52acbc62132d0695345d24447399bb9e744bd1431e7d491a7eb2c2ed17db57f5a874b19661d0cc38efbdd4f3e7ba6edc837a3210e789391e330c2c47143dd51998e2d15cd09c9f2708468fa912b9f36b48a67a583b430379b250eaf9ddcac04ac283071a9e9e3608d6fc00e17637d81c2b20cc47a7fed9473ec9c78eadc78315a5bd2171349756cac4e79c23e80d2d5fb758deac4501d39234fbd4afd0808b6e0ba05c6aacb999dc6276225221cf8213f93e2682efca96a31b6fcf2a5bbc84a675cf3b0006d2b4533e0c4c9a18cd549a499e9d4b965c39f0b669202f0e9967a9ee18e4459d5a55541e8b38a8fdd581aa03ef48d0ba9591c87260d6ac836b216c3785f23a897b415b8593b7febc3b529bed275658a6f874dbbbd00921066ef72feef12be215d87886c4aa93525dfc52e7b77939afe5f7aaae8c517ffc69128889cdbe89c45d0eb3dae6ec3414ecdef62b90b3e337e40c29903a9556c30d0a5e007bf32c2d9827c9d89b4b5041cf228d1b996994cad9ed2bbdd3547c9491ca2b9a950063082a7449a0829d2b5e6220b0cf7051992eb109d764ed4ad0664a566bf449f9fb8df6db5b3cf67563902b7330c076df238a43b6500e54afb6295eac6c75dd40d7e807b9ad50986ce7e9fe29ba0c1a5e2a09058f87250f43f20d86b21f0ef726e4850d9a9a32e8ef41032389f2f1baf99873dc336832eb2836b5ba528186b2f045f053bd088a6090b2411c680ae96481251617c802b7b6c1ff9989efab8f85c3a7df66f8ef63344509ea7437a642aa97be80dd88897b871d21b8ca99ca9bbeecdee7a0c4277ee2a4d68d64a0c45e1699ffc1e8cb03f2733c8b4d3df6bac2a8e9a7d13dd0ab3c1b2d0d944a144968f142ada2fb0f55471f862d74c1e5b400fae19ebd6e2ba778cc52b2f7135947c63d27e99055d88dfd3c28798a015a97138bf84aaa9547db563af77b8175a58a57252e6686ae4b13ccfd74a75dabe89d459ee62dfe8b25ac42d1e5055989707c8c7e1a437c1140a061d63a07c634241bb2b538d678655b411177208e81851af4101d9d70f2135c257886caa12f56f3af030daa964103184007e7f2f4b10373abf8b424c0fb4884e59b5cdc41b77e38f6641e79e28784b2d5d8eca22ed8ce382442558693552eedb08c19be541a98f475dbd2d6400284565000a9854925ba8de95e1f70d72c301e2e45660abf7a5922690a6c92a1e719f9102197ef8a482460a0401346d6020ab29a1302ace04e122ade2483e4e42f8f37ce25c68812106bb37bb2f5bbbe76feb479f0d1529ede23b564d8196b38ec531447d3877310291750cec84d9d40a2338fd63ca1bbc0c90c4458dc763fe2b93b53c98c72f4fd3ea1a35bc98dba84cc4387eff7559fd9f856dfc29d8aaa6d1d874dd577036f41df97fe5bc7ccb9376dc70b8d819a987121949e0cb09d3949831e856adf199d05a611cd8d78a493e006988d55ea1d59497af59788fe80485e15877a4128f6c3e010ce2a6d0119b3e7438226bf32256613f9a1d62f6c9162b54a8f00df7a67fa890cff77da84c4b8e72df91528f706898ed44d22bd2723f934aa91f41a902885b5d2c155740c76d9581bbef60d60240b233c1f838f072d334d2da63de5197caf0f0e300b1e8e58d93de11b1062fa4ff52bf1600a18d72077496051e65c5f31155106857361d00bec4096c60a00bc7620d21e42d1810660436208c56c0baf883a1fa690d82b694ac5b64875cba91b4bb454f486cdb8e51dc1a69d99291cd358260c8cf26235b0f9de4e4481226eb681a4130a891bd538d115f10c111f49235b61ab5f974b13efefa78865ea98b8ea9fbf86a3d4fafb4f633c7d5afa57df9a50f0ee2db67ea3b393b3b3cf7f3fc5b735b1d676fcdf1df4a8ca77f11076532973d29c9a6ffcc332e6ffe177f9e21f5fab6ecad71964b1e7f48c54adde2f29183d6339e63c697d26a95de6cf8b317bda65a1bbf4ffecc7363b59f67ed6fad36dd411c3a75b17e9375ba8546c42914f56215a750a6372ae43e945291af470cddde22dd6607d2de043a35d3e91492941290544eca758313d290919a25a421235eab14e30fed5d6aaf4886ee94946e1b7ed060ad5292b457f4dc98eb8f143be895ba7f10d65f3c241d2531c18a60ec83f8194f2196568f307e0aad106cb484df86a791d2cc93a8689cb90f92a33ec986a7d1fd8a53ca7d102cde89ab384b243eae43f2bc5d0b8407025a5a5a5cc4cf99dede8ff8db9c5a5a5a5c727da8221eacaf062d422b645222b546ff3e946dfa6a8862a956e938a34dfd84ce058c9ec2aabb9ffa935142fda770ce2ab585f356f379666cab4c7f3215e86e578e78d4842f6863f1eb756dcc07ddaf1ce20b561bc66266f8625262a54f3309c32a9db62127fc7a613cc721a2fb4b0e81cf81102994bde4db702ece174358ecf619e7f0474314ddf76f25ae36f45aa56129fef54a5dfc3a24a4352ba4091aee4783117f7901fa00ed806f862eba3bea6be62de70c34e8ee98988cbf46451fe7639f4c25ac529a675b878e3e1986746ee6e263598dd2aa1d92e172863ff3eb35e4975f2e899132b0be18a6f0c5f0811836d02d9339947f6d5e9b31867299cc6baa928334ef38645b8dde70705b486db819c7f8ef1cc317dd95a8020a4f38e008f7a16cec430a75ff63b7304aac4fe21293f68ab712ff15476bc37f6d3937c3176339a437e3bfb1719695c6a2e62d46dec2a8d8e7299225b6b1c19feded6f0c9763792bc31d4bdddd4d749fde2f970c098de30c33b6b7589eb14bcb25b04a9f62b1a879fb20288edd624f491afebd2fd6c7d7d2dc9d34a4b4af3f1be78d46cd5bae13f750b47677d021d31b1d63f89fd6dd41f99f429a312e16356fddfd43a4b1dcfd72497703f978595aa5b17b6da5b14a6fd72a99b7d8e779c3bfcd1abb75f7cfdf66ed6e9feeeee1d9d1a934e39ca76b71f9ebfd32dfaf387bff29b46377c7905db14c957437ce8e1b1bb0bbf1a4232ca4a40d29699df237bd6891f03f90fc4d3fcee6679b34d6214fa11592af1d27be0f45eb105ce6999b9672f8645451bda5d038cea19c560da984544039ba553e3374ab6c5431dddd437f367c9a450554b3a850a25954bc4009cda2c246b3a8006a161544ba5b4777f774778c8d86a1bbbdbb866e19ddeddd4debafc692c617c41fd211c76a955e9b2f97bc180b1f0ac8457aa399c175c8cfe80df1ac6c226f748e435154ac4f92b0fc4df747b14ea36fc2e548deb249ac25ed99aaa5b90c3faa28570ad52a15476bf479d24ceb51ad4e5b1855c424d60ff11329ddf9e350ad526cc72118fe72c933d52795c6af75da86709f44deaed17d1aae96c4cf94bb5ffaf0e33b3d14fdf099c4277aa8fbf899f2630c2b52de8ceb910bea161a69a2bbedfd203c37f317291415dd66cfe4ed739edda3db5b4077dbfa6351a1868c89df84efd3fcb53b9d72349a6d52b514df2782c5f9b954c27f84bf36317e24f2161aa9475f7f2c207f65fca2e7d2b272747777abf4f75de183c2f749b1d95bfebad94bf396bfeed3709d37c73e29ba1b37af68cb14f741f998b4bfac0de7adfc18cfd88bf88235b730cae61646d9e4e04cd78d28dacc7ac2d99ccd7470c2998333c59f9afbb15b18753f93539cb15cf87addc2a8ee66e96f061633a274b7bff2b4e1bce5af4a6bf45aaf3416ab33ecee5b7f33765a5a5a5c404c6dd969b6a5a5c585c6a606e7fa506f83432bd6543a6f369682200ead6863f3c264ceb69924f888df6cc6e5504b4b8b4b771ff527438bee06438a2bbd392a37f39f799d619e24a662ae93de09e55fade34a67ae76681ce71028c3d92af3bf96f63397e1780e8e65fe779235e37c31d7f937c7d4e6e4e05338678e9d30cd8f7dfadfc7ddb7e5b71571f096a1d3ac3bf65cffce253a4ea87a94bf09e7ea44b2d60953fcf579b0d5a891b54ee28be518d6a39c38ff8eb01fc33a441c95c4ff302cb1e3dcc48dd3c791e2fc1df7d5a7d72ab5e192748b31cdba58a7b730f56aebd7fc3ee9e267f2c370d2ac674c477f5beeee1839889fefccd81fe775dab2fb5f7b735ba638274b17eb7bee5167e88ff35aa5b5bca4dfcfb4d9dd45dd9d14dd3da3bb7de08201f197b80f7f5bf64afd6fb3fa743c6dee0f4573383d771faae8451bbed8dd20e86ea8fe5e2ad0dd36f4f7d2eaee95fe5e206063135e6c831f8a667aa3977cc175378ffe5e9aba1b143f874fe2bf98ba3f6943ec95fab5397c28f7e934ebb65cab3f3639850f158b3dcdc7bd5eb3d70b874f447cb19656e8697e915cff969b4b13d7799dbe76a76d085f7046471b1b1e1f9d9cefd9b1c9993c3a37379336fbcf71e9e8d06a3ecf9bf1acc4363897f6297c5b689369edf522a90dc7f28fe324f3b52459e29abfcd4b7bbd5c8068bf96766bf4e6b6fa00207004fc6358cb587eecb97842ba3bd65fcb0d3acf1a859a5f8e13ca655f6d92cca757eb329a19725e5c2d5faf6a692695642efe38ceb09bb1e0beae860c5191b45a3f827e384d94486732ed85bc5ed956a34c5729d35e88bb7b452284478934f635f1634fe1bcd96d619eb729b8a0052b1038f91144fb51003f803cd7d2869e83d71f63d956a337268e36354513ad22a2b2838c45fff1c36966ea8f607831d28d07d1d0adcac10bfda918e9176df55c266fdfdd38f4a7c2a3db5f2fdad07f9c4d5b38ffd6d2c5bf9febfb6b9cf57eaed40004c0f11adaf8d87ffcf06cabd1b7815f133f88ee3ed2dfcad6f8822fda6af37ff3cc06574b73f8e368431b974b878633d3c971f1f8dce4d07278fe47a7e7469ce18e4ee8baa1ddcc8943bba1f57c6813665c5e9b1f9c8e86604bb02107f22891fa4bfc914e1a9edd3dcedbb5492f5aa45aa579de2795428aa7d0e7711afd8de65ade1839bbf6dea21f4bd1227d4da45748fc8a53a2597b97b038dfe8f5fa6bc358b6e27c1a2d192367621050f844827c4aa0f089b8724a554c5b5a3d9a772ee17927192367589c6fe4ca29aba599624bc63e5f4bde682c477db5e16924cecff8856219ffcc86a7d1bc73c986a72d26ceb7253d857614cacdf199eecf6e658d3d85769cc57273fc1bcb29974aa72d8cdd17e7db62e42c7f937894bf49a4b1fc38632a2407c34f33bdd696cbd98d82eefea13f6f87eec61714475ace6e4017e8aab1b44a6b7e9c21b6c971f984ff33137f7e5c3c61f83835371b82b3d296692d7733a6b5bf36b6766708dadc661073b4f99bb5d9885f6b14e3e9d956b7e5b914243e49d29bf1eb86270e68650636faeba674a623895d96a7ec467f5dabbb69f4d785a07b9c50f6f6b7bb6374afc26ee8eb84ba1b477f1deeee1afd75b1ee1f512f567a1f578a2f28da9b4df850348ee98cd71f1dc87fe6e2585a1b769aee6ee9f6c4eeced15fa7c217cc379a4a7777edf5b5f7bed7e9e2d75be6bf5e2dcd33d7bffd48dea8673a6ff65aa539cfdbb5349f9e4a77c7d05f477537abbf66a2bb7176a4dd87b29ecb349ce40cf105c3878ae1e6b5092fb609ed384e9bdc9d7746c7ee5ea554ddede9e084072210010f2d385630050d0962c06469082970a2dd4067093063d14c4c127ca4bc806301b3e0841749231251b4f8c8d04c0047ca0b3a0a00a6484cc44307254f065001161dac740181975e419326b04ead3481062f2f3010c07be23d71f2442573c411318a523dbcb4b724e5799e7baaee974aa55279d775dd53a784c53b7f7961a2a4f31e885071151328cf5739e52bdf21b54aad98f440048c65c553aa98a795cc1226b0169995130153e279b712f3c4a252a55229554aa552a952a9f64ed575de7e81974e79312f2fdd2b999ba13c57f1952a66490ed8932793612e324b98187530961619252aef5864963081adc8ac545454324b52b0a7f68679ced27956b074774477849327542cd1a1f3235432542cd10156d42b28f202c30058523d4c9804c0f39407a0739533a1828993272eb4726af1950780c55d64981ce1422b19260150711799169900b0c83c71a100a8c8ac6452de1e0095aebec0e0e44507173e95fbca3b2096548f4b8e2fd50313e3f94bd70979ae22d3a4855e5e9ce565a545e52d9e2ac649cc102cde792c304e044bcc113a08a5bc25c6c9934e28e547e820a452398c3ba55e626060bcc5c59f74422d4e5e589cc40cd1e25d8b773e848b7b1fcc0e20317ce529860c06729eafc8602097721d5460625ac825c6898b3f71a11657897102e347b8508b7730324d649c08604618618411c6100148798b4c939493272e04e3a91840a41c26668800a4dc45a689ab62f810c329e59eefe0b5c43ce9845a9c25e64927c4e22e314e8ed041a8c59f74422e318a76f8a072180722e52f45881072f1ce8768f198215cbc6ba1969823a858a2036cc53b21188cf8967418b01599270ce43cc7404ee52a4fedf041e59e3b2d79aeb2a4f28eb1945aad54ac980105d6f9cb8b0f283e98681658a752f980e2a3091f4eacae5881076595c5ca8a273e25ab299dafa4a47a5651ba2a60ed4a565ab0acbc98951521788192aa421707504213584b8bb7976a15d84affb474de8a8aaa8aae59e998c0e7f9aa8a5e55d1dede2c3d5aa47a3a6fafdb57de15ad9838800b6eaca0083ba8ac56562cab9655d46a35c347c7117c80a2be950643a5c17822072a53a84489a212250b1e19402b15169528291aef894e254a2a8a2a0acc9bf24411583c99af0b2ebe1b4ef42bc5e2e2dd2f5a1875322c322a322b1925344051d1a2f36e389103161498e7513005a83105f632a3c7a77d52322b2b3e48f83a588a072095566142a5b35061a2bd304ab1b07c5f8e1c1e0b5014996e8aaac614180c58807944909931658b4fc99745162a4e64015332c308308fc5091616161616161b5e7c91f379dd1351409082adc828a12bce92ea21619e121bcc731894043105e6c92849b9d1113e1516cff35858603aef1727bc8be2e29d7720e852dd132b2f4c8c68013362042646c98b141729b0979718c05ea6646124c4e351e960462ad0333cdd13de6a05c5091696186f45c55351716f46a55fb2905284cf731edecc8b142d609d1b49f5bc4c798941771578a101acf3eea50b58d7ada08a94cc4b165dd3793c7410e1ebdae50b1da8ac40e68b159706c020095fc02009454882141b291c375ebc26de8c124b4b8dee05967bbe038def53d921f57d346ac428f95e60a1e1a918452b1b365636563656366260be26df13311e6c15d3b0af89c7e321b1e14a3e26602927602923de4cea6bd204caf7446a081f1707e86084f079de3529b22103d3244abfe09deaa1d1a203041fcb53fef232e5a58b55674366b5b221b36425a6b778e9624a131b9ef216254bde4cca916881e3860c0f6fe685982f46c9474386f532c586bb4cf9628b2e3c1e2a783c60783c9ecc4a87944fe6f1789e7252b4e5a8ae894a05c946d72a192b7fb9e13860e86ee0f01bee84c36fdc701c381c870c131c5f13d8937e79a91e1c9e92e14a58603362ccf0183770f80d1b4c783c369ed838800d281ecf0e4fa92c5143a58baf89c7c3f2947f4e3c1e1b9ef2efc97700249680a55ea674014bad1cc74a66870f371c873bad9c090ebfe194c36ff80d1926373c87b71263c3bb183cd0e003246a44e99a942b7999f23589f99c7833295fc57c4f0ee0cd78303b525dcc0ecf71780ebf11b3c3071c9ec37778324e383cc70e271d7ec375f88d291f8e181d61acb0582bef182c1b366cd88851e2f98ad35059a9d0304ac908f16652bec211b3fa224593f21b313de57bf235f1c0a7a4a728f99ae8f08f05872bf97278a774c4348e984ed1dc50d25368d8701afe42cc4a8ca21754649ee8f8c0b772d6ca8adbb06123a6c62a8686dba841c35768f80ea91768b058322c4a564f9078028604cc17d3a486074616992c565432562a21292da2a888782135430cdaf36e002b9fe103506149f50c41858b0fb1f219cea2e23276f8b0f219eeb4f219323b78b883b9b8caebe91a40f85652a458a2b8a45c5c6494a854aa18312e2d2a6f51398bca93b2928597e6a164c79422e491f4665437a2dc90a2ba1145d55ecf47d352a3a7f48b0d2d6cac6072b0aa5851d260b0aa6055c1aa825505ab8a172d72d8d0c28616368460638a8d2e6c7861e30b1b60a47404780a39021421e82e05c591d7eb7b824977e340b9cda538e24abb4f964fb4fa27b083be131040778b197f9e2311bb64b3385a4b71d81f9733bd7756eab6708650f79bfc0709d448327241bd5e4188409e9d109820dd5d0f4f7477471d0d08b8a03ec61f1b9bc4cf93de3cc967aa43c4266c85645c12898fb3622d7a40151e503e40c751d444aa5113e946337e173ddb2407eb93d6c9ff27b7f906bc015d50e2df669283ff97566bcda66add47f255e4a494e4606eac16cb64b894d9ecb93b458a6bd58e532673dcc2349a7d71debfd9b0147250262bed0f43b8070501cd3c89bc7597bc1504f47ad1c66f02ba515b133991fc873f99cbeeee42b85f4b73ff9192371bda2a93c98abc0607afcd78246f33ea1d675a4bc7b94c455a2ea1f5e8a1e80823ff83d48814cd27d2e24380164e00b00024dd3ddd892c60c6866766e28b6ef03e941b81891080229d158189fc0326748870a0802bba1f8a7e0a78d20d8ad8eba1001dddbdb404d9dddd1975773c7445dd1d517f0980f225c04937d4dd09c13c9804e4e85696a0422c718efad8bce55c42d538280e2012849c48ffd749a873283caed8a183a0f8568eb35cf28fa1e83863e4ffd3381640000048e20b6cef07f1e3fcd16d769c290d298d566217bfc897c44e124edce400c095abd3f1dfeef4257cc11007748139353579d2fcab75ba010144dd9d8feeeed5ddfd74773e1d9880146c41e7f56173b53ebb9537f4e9f86db8246336571a13a15e3171a4b6f0d5ddf574773cddcdd2ed74773a5d8e0ba7bbe9409a197cc11c2803cc4cc07ffcf05b862919cdcc938d610ad260674213f3169eb98189b76672ff14cbcd62311063fcb75669518d02f8587b3f24b6d0dd4c29182466600bf3bc2d8977869812d19124614d409e60f1a408ac9656fa7ac98ef87f9383b2b19ca1c31cfc6a5b44ee6fafa5555a7b7f9c5827cdfaf46b6979da70a28f23cdd8ffcefb385f42623272904c7210878e5d7ca8895dac73da519cd9c7b988270ecf3bfebd596cc3e4acd867938e33e3796b91ad3b49cf8fa9cd738f8adf8a9ee938efdfde463e18fadbf2bdf4e654fc9c44263b22fb9b6d92d11616afc5d52307475c435aaf3007df1f574bef1771f0e9cdd7668c7b644ae6fcd893c830c5f7976447acdb6a0be73bcd7a4d6eac36cc33a4f9b193d85f0ebe0d1d53d186498a8894865eafd8383eee4812d98b367cc98ed0dbaab1b5d2f143d15ab5163b8639288e4f692dc73e8f1c2be584c4cf74466df62ed5a890b54eb06c93c41f4bf16d6153b6493649ac439810c10449cb644e19c02407f1f1eb355f2f0208c184041d180417dd313ac8706cfc9abf26f35aa5e33843f128a6822064318fff92fe336f4677e7facbf500c7c4cfcdf13e9495656b6f4c365dfc9f81f8b17bb5ad794b185803dfc1bfd15c1ffba44fd7e21c97b87e7d6c6da1dfd2fee020be9324a78bf6928e030e79e25ec8414cfa4d074af4379a41f0e1a4f44c8263a2fbf1cc766cc201000704facb63aa155f08d7f2172e050506540da07283b97fcac165e2d19339a7dc0791f9db72ff94fba7298b552bbbf3c7d071fe9ae723076de19d8f3d7767a5334c1d873d93ff143e94e8349bfb27dce32bbdddcf8f71ee9f447ced53dbcfbc56e9d34c3da4375b6df85eab34373a39e820d4e73e883892a54d4afa3093eecef6ced4d01d73bdc0779ca1ed1ebb9340e2ca70409c9ab1da4ba1ea57a094c0dfaffdc5a4c4c454e431313139fa5b3283253258126589146d8bb56cfc25feb5c1b171669bbd15fb9638f11f3f7e74774696dc74777777448e80d400092553f163b7308ab42412d207b245139b717fe5a86ff9cb6d5ea92711b3511608abc3d2e80665b16a659882f396f396b306a9341dd6f2666fd9fb41584ca1ee8b95cedbdf2e2829cb98154b1c133f081acefa0a188da0a452dc93938343710edf5bf4a454c4f437dbf4d52639750c88c20451bac55fe2639ccd5cde6ed4f1c479a69446457b1b27bdd969d44b4ba1fe924eb34edaec79baf899463dae4be2f338a3185bd27363c5b73bfda1ec6cfadbb2c5fe77fad18b364988e8e97572b1ced76b762bef5057c4a7040736cffb99e2796f3995b4bab9682d50279d4d77776077e7c61b72667ca319e7fe29f74fb1afdd92c4170c31bdd98498dea2faab6581bfc498dad8c2cfb94cef246d3ccfeb8fe78fa4fb10ff7ead466f7e288aebd35ef4599be2ab4dd1ed2f9c5aebab3df5e339fbeb5194e635fe35fe144e9bbf9488949c72998e34975f6d86bfc447ea36c2d16c1f4de7e9cdb7f937637f7af36bd1bdd03e3496ba5b092f30f83e48c7fa6674326866ba27b16c7cc1d12607ca26bcb82949e9c8692869480f312330247ac58f1511750cb8754c646c6d4a544b9904e92fec86591ebc5529cd6b4973c77d759bd4e1c4f9b6e9b6e6657753429ed9c8cca7bbbfb9859e5d8cee0ea6bb7be95aba3b96ee6ea5bb53e9ee565daabbf3babb2e8ceeee427773a1bbb7d0dd5ae8ee2c743716aed0dd56a08214ba3b0addfd457743c109dded457737a1bb99d0dd4be86e552b01ca65334f310615cb8f65dd46b22d1afc5bd62ab54343b22ada86279038df47c6a3f1056d669ea2a5d523287b7b26518425e11ef749dd1d902152be185077a5b3361d3fdd79b385f5675ecbeba5cdb90f270ff2a8798be568ff6e05ddcd437f429e747717e3c499d6ee1c7d2cf15febe4bcc568e0533867d773e3e749c5bfdda84ce6b84eff9b0ddde6db04e2600eff5e1b2691454da4d7eb8857fca3ffec45ea0e663c8538e84ee3ad5ca6b5bcdd6c38237e14a5790be31e88b54e1567eb531d426ff797b24dc2e2519e34b418c36c92f84cd9267d4862488cba3b7fce7377a3e03b12f51d39728408898eef4817dd31a2e7c6b1a41db1a2bbdd7337bbb53cc4be23ddfec2f7f3dfe69da4d72ac5d971b434d1ebff6ca9bbb15042370e8068d28dc74973fd72c963afffb8fc330f122dbdbf742b6fb4522420cf78fee8f98695de00882fdbdcf4f7831661b5e2acdaea18e9071e9e83dbfb41545bf105f3e3d8fd6ca17870c09b9a5a4d2eaffafb4186112eba06cfd3dd715ff1ed319e4fa11532f324baf5c5a3596ce649f48ac592948e9a988a88c48a788031293935c562af1efd19d1a17b697ca817425aa7af4d929c6f7bdd8acce0662f10914eb20ec1d97184e10b3e912d1ce3498a54ec6e9afe887c20f74f9efba7588efa4a040922b6f697e7e934addc3fcda41ad0dd627f43a2d0ddb1211fc09fc5587e2c563b8be5c2fc612cd7cf95c61e6afe882f88efd37be7cce989ee96d19f53029c8cf89c68e82d7f61eaad4cc5bf43ff349d6c781ae5321d67be1649a47309ff03b97548d3482710929cd709ffd3747a7c5fcc894f73e2ccf59bc4873121f9408398f8658de5b19cb417c36b691867b13e5eba80d338cea1217fcb914e2062fda69102f97136eb901f67f428db24a25c266f45d7dac23a9f29db5ae71016a7904d12715648b649f991b24dc2ff40b24dc243ea51b78a0b41c0502a4229b7581f2b11515a6addc035d70a71eaf657185513840341a004510a62344368875417562c9b98988a20651ab53511dd422343b7d0c85254d1bc256cde12f64dd70ec1f087758e53c8d2ea11799b19ff8d3a3559d1dd2730417797a0bbabc0f3cea5efa84677471d1439785105130c50c0457777385abe5c022159c041777b33fac34601090a60427777525020034b2f9c208b9eeeee7448c01125284844c08aeeee0cd0041a68ee0a6803dded0929d2810b03f430c015ba3b654309294f60801356e4a0bb551cb00030ba1dbcbab04377775b546109265b6000127aba5bf500d94a036c33505284eeee763073618104014b86d0ddb159698be1dc07694af130a2e96e128ca0bb69d65ed2df96b31db1fbfcbb92417727f5c7c314f733b5b93644000f4bdd45f0d01f102d309030babbbd3a532800f1e71f5f3c52b9408f1a952260adda8bcb7fb34d0ee25989dd16d6798554a050b20c43ebb498f8b8543932438a46afc4d5035ae50415a6403313c314ccfd53ac56694c2a8c21ad2aeac175abba97ac08c9a5cdd42df6d68bb68a9f71d9437797dd9d7177df253dc537d445b70debe33e69024353543a56ea3f2362826fc809bc9686a4830d752fe9dc7d281b624a741fe9161a79da6caa427717f52714a4e673584b5b2b2c08fab5b944deaed18f24bd4e389b447b2657ce10eb248a43e2389bf7eb5842d5235cab54acbf24fea5f889f050c6d6e8e9cedbfd3c8b90b76b84a7906cc7a6d00851add23aa17e7ca6cf3337bd68871e4fdbd2382d650aeb2c313e1a67b64ef5858c230c3f15ab15ca8539ea93f0b5e28fb3892911908c5f489c6f142e415a7223ca780a997912353511e1dc0711c5f946363c8d443b542d2582fb21f168884889722ded90cd53a4629d432fce5b238730653c85bc482f7923126d781a8df8823636363c6db57cbd7e48a0bb3d4f2fefb5434e353536f87e6dd679cb346ac34036f8b0daa41a9091c617cce5ad53752f3c086249045abe3f1f241f346830749bd4ddb55ba5244a4d77d70326b8a0bf97159dab9346a3a24f7fa86913ff6b2b77eded6f6e739d767c1b626acba5ffacce1000ad6e4f004f394ff131b5e169f3176d9db22fc749e4f57ab1168eddfd04d3dd4a50b0c30f13f88264f964edd84d001da80ea903e22fe9a2b5e5bf750cf0527d4377e783ee46d29fcf07ba451bc65eb495dedc5df9f504a1f1057337d7b721e7ad878951b514dbf034ba7d3ecadd5c8b7e0c6b23d1dd44fae3a941e30bd6e0253e8cc0905e2f1d9ed2df96ab8f638fc7392e6dd907fe1bcd9efbdbc49f2d947b9da1586de8a4b5e3dbb28f6c8984f533a651ffb9ce3bcb9a635ae3b63aa6ee4284c068d66fa592d72ba4349a71d9c324c53a2f0ff3e6a8a2bf659eb5469bf05f518495af5748c5af43c227712c2a3bd55e2f5c2dc5f573d4bf5e9748f8645394d353f8b6a1ee4e7577add2a9d12de65061b4612c478beec6239df9c5d83fcda5bf9c2bba2dade64cd1dd1f565b63134a0ed9dd38f74ff871ec8df4fda76b71311acde6007d9e393c1ae7b034cef5efdb2afd5c5f747f2e2d3a961b4972bab298798a33ffcd1525083aba9ce8ee773de96abbfba53f576eefbb1b00fdb954dd36b4a1bd35b3d25633b3c11f8e17dd2dc6b21df187e3031c2b669ea2e792acd4c529d4dd33dd0d04ce52e7802e1cf0a6a6e2ec9dd9f0b4e1b4b2dbf0348a92c513a02084ee2174b791fe6e32bee04c7c7ab38e0bbca99989354f6f0ebb7bd63d652d3ecede6b67229d4bff40aaa520c6240d2779a3343a92b7f938cfe5cc5b329975f1f19c39792b673e3d7fedadd8b24d0eca489a6d768bc7e9f8e94892d3efd3b7e1d21fe71f568a3fdb2497c964ee832607f7719f22fd03711c3c07ffa7c5aaa578c67f3849732cffe88386a479261c6718fbe19e7fbc1688dbd8f85f5b6bb495717965329983feb64cd22c966358a9e766dea22169765b673c088a6b72e39d23bdd5f2d6e46a2f6d9cb73b96e138c33996b5bff5ab2569f6298a739cb69967d66d76d93f2d36ce4a69b291a4792c6f8ea9cb647e29b676e636bb0c49b38fb3cc9742c9f8e792bcd9d06d762c1b67b5b2fb7424331dcb9bffd31ce62d24b1a916e5fa4db97e9378278e9c425368a41308c61f8665138891868c54eab54a5d7cc7d4f3ffa58d74424dcf515fa7e31f67a515dde211e6a04c265e1bfef5fb50ef5826f349a15c7ccf8de32cebbce5de967da4b9964ece5b6e66ecf86b6239738f9a37175ffc0fa31e87f4366b4ec4a3bdb9dad0cb10579883f5a168cda7579aeb63ff995b3a71d331f5bfd4bfbcd931f5d1da19f65ca6d706ad83160d4e211dc429a4c312af57f850af9798718cc4b1980e3382aae86e30084a502b48f5234a83b5fab61f4bd67f7c0dd61c280a0ea8493708b4046226a019e7017b6b2688c65be21150f8447c087961e1658157f8d2c9cd7e2693f9db68f386393b922f7aeb435a2393c968d69264e90465bda956a9f8b88c8947f4e7899fa56e104fd6cfc4d52af559818fadbb1bd31e2931e871d2f3430f13abe78507073c50f00cd16055f2970c97fe92c9bce685c17f9ab95afab2282b140b0a3af29613d07da0d7eb3e5962dcd79dbf95799c463bb21d169d0fe8cc747254eab42350ac3683e2b561387d12c9a1400e92eb0a2e20b05c4f5c372c1c2dc04996365727a633cfdbfddc18ce4bdeec13c4d9fa443d3fa6b33b3d57a7380b6b0ebbcd5308870038b73b37cb4d245026f3d70bc7c19b2fdae9064a93df88372a9b28dd4d238a778a75665c536dc5ff361b1274b2b9692a638162a53827f0896e10fce1e2681d8bf36d31284bc6a2e62d890fab268a0691868cd4b2268348434658353ed478d7b08098d592d2b97ed87aa2bb59ada8a62d23ddcd6add7483ac16cbeb15c37dcd2106363c8d8280eadf2cd2ebe584b3b5093804010701e0d083834723051a0ad0dc6872b068522028cb8f634ef34f33bf5e32a7d919c7b9d1fc4c96bfa92ac9665c96ebdfb7d523994c969bf96cdaea24dfc5a020f1c85b4dde32b2e1991494e42d2320b2493cb2f9662fedffd258333af4c0d88e9ecb96e77286c3d686eb5145370863f518afa550d3f6334c6f3d6ab8410a99cb2076d60d509a7503c9bae106a4b981c55a1b5600d2d83ce34d36900dd2e07f1a9e381b6e680dca612c1e5df0906276770ecde2413a8f1daccd3c3e9b1abae8b66e6dae8104dd357f492111f775b476f67a39fd5f5a0cf7955583901abc41272525a621f0c3d910191a315160c598208c81f11fb05c0907721c581e030d5268d8000d4d34c898e1083348608624ac1966bac19b1091dbea16573a2a794d9d38fc742dce6332b196e3ccb8246292c5705f63d5be5e55c9b1d7b883a2acce3026f31af71713587a541d670df84d4e33bd612e67b7b276670d78ad4cd6ea71c52a93210b960c0e60c96000197cc01ac65bb681a0bfc05c27ce4b9bb3e1e7077c9a498ef8db6298410c0760c5c0c30e2dec08c10e280dca1c531ad98ce3ec78ade38ec0dc48da4b92d36964329ac1ff0b44e6f7f38e1d9c0003126080d260a5e3146793d780b925c3d373630e6754114b4716744ca123081d3c72e0208710399a72d490e3051c2dc0f184e305d60d14dc60d25d833b98f1a5b8c77d7c9de6cb9b67dc6d6e6592e6f138693378da683e8e3326abf3476b6b40100cf37bab85ef43d919f9976cd1279f797472f0672d1ad99737cbbc3ed4fd8ffd389bfe97e6fafeb68cabc533c4f4f67f691f84bdb4d83f8dd231160b32028ab242a5bd41e251abc9a5e5add72b08287c2231fcd942d9c8d138a90618a093d4867b34ab46160d8a49359ec8fd538da56e9b710f283ae63ec80b1e7801891792582fccd0d88245230a8b0665d1b8e96e39cde2fc1894e1dc3f35b19260b168ac1c581eebd300eb1b00ebc3990184190360cd18c29a5143cb5ee20b7fa6b7c88cc86b642d99cc5b329a9278449d64fec2e27ca61991d780e247b92da43358a4b1dc3f0579bd9c600ee2277395ba8c0667c86b409a8c9de6c7d1de89cb19273a72fab3f069b4bf78c6699c363c6d96568f5832a090f32fd932965832bcbbbbc26280d13d7130560c29dddd558915e34983219e369186b46c62c510028a306038c13cd1b55bb2608658302cdd0dcaaebd76a8e8592f5bb05e9800731f2428f74fe34867f7975eb461d007010a9f880e4f89bf2643b35ebcbb592e5e7477a6b767b904e1d262b5dc320c71ee9f6625b6962957c471c001071cc03108ab250956cb0fabe5068b458a5b116c160b6ce5092b5bacec80b50202d6ca05582b43582b2d2c952f1afc9b8b3898bb0f454151463334a324c3f11a90e6a128ae8ea9ecf5b2344662d98ccb689a669464feb219c76b64b13a4399d3a2644d32996c4826a369f21c7c08f72a597c134ba5493748ceb739eee139d8ec8b34a9dcd0602c9566ad9220a3c1995192790df84f13e9f1b42d3d9e36b208cf3c451ce2798b5e2fa720f1c829268e96a5028346bdc43e72e2274172df8a253e82c4dfe6c45265d1dd479038f8642d8ca58280b5e1a2acd038ce30c80988a624443caaacd411ac9465a562ac144c83373737ad1b1ccf619ca10c8ade178b780d4833e33d617948ba3b48b33c16abbba2c1fb8e6bc09c2d675c65d95a26564759dd0fdd9da3591d8cd5bd58dd0dabb9c06a2cb09a0241405e032844e45f95bc06f41a90066746c96b8280bc063016f39f81b97fb2624923c37d95cdb89873ae6fcb252c97a40d4fa32027a0f08944bd5893dcb892b872dc874f79240c2b9a67c765740b8d28bd5e3e65d0511740d0855817589220f1161764c0050770414848f3bcd95cceca85d5166ab00527792c69be5e3b9bf14c6936d70adb024c0b5e34388e33b4657ab540012d0801f1b469e1862c6ca19320c9e5c4d1ec09b200812c3490feb0b004168c6081058c289d048987d35b792c33a660e0c0e8810a9d0489131db58e20016f69dde69bc513376db02b58e00a4a5bb0c21456f8c10a2af067b599bd647da8fbb9ce7a1fcad61cc941f173b8b4f76b758ab9b43693e2fc3b03e6c62a40008bf5ab70a40a3a508109546022091217a9b74aeb62eedaf2b5de127dd62a9d930a45a8b0432bd7875141c614a62441d23a820424e7cd4d53809a82638a338581b95a9bf878daa4a0032970400a46a4a06a45bd586534de128fbc25c350d3568a3e64e33887643ec5281c210a516614a2a2e0499078c6363c8204c4b8744cdae9c5174f741224ad49fa1124208dec161a11eb37c93ed3ec4c9df81fc8173d7c6103052040c149771224ad2348c06ac969f3c5b96b674b8aa0a004059b2768d1dd4990b444ea479080b6c6fe696699db329da23fa1c9dfae15e9249f60e4ce27e8e0842eba3b37716e6b0b4f9cf8d709517a38e109e80423272fbee8ee9abf9f1752745399ccbd30824b2ca43f2f724dc802acf3e6d6e62690ddf771297e137280d53aa638cfd18ce39cf18ab34cf8e263c213200dd29011f192514f67eadb9c9860c4614c98691033a1bbc16b69df12a6e8bfa4d312c825e4e806c3493e8573f489c969bbbfe460a6a9559a4b7bade8164fdcd78510fa671f024505058de31c7abd8270aec9f17427a0a0209a19a05b682408c8955366fc62a6372aa44850105094154a420a92408238379f308c8b237041002e2e17316cc1822d48b085f86d71d3dd200e7fb318071fd5d2fc636ec413f738645b71c0742c6930f0c579b3f569e6b7654cab7dc799ca6449606e1ce7b53f8a3f93d5f04d462b0c6c796b9c75fa238107ddadd41f128e400214127834f838cf8dd966c74843463c57e79db5bf8e4bcfddaf553bbaad4c4798c1082830021423f818e185292b98e3385be2e37f1a883464645e4b73b1ce293c7c536028c215dd0dfe389b78969b3799d78034a5633a73fdd0de66484346666813371561a9083014a12382143e223c016297790df822a632af01b3b54c484346ae2d8fa3cd5145dded437f43c0620829e8eea6fe86f034842042982204187c427821cc08c214419805018820a8803045773bf5070423403002841ad316de92441a3292abd36b40fc4f73cf4df2f6b906cc4d2407ff69af1ad09553a7fbcfa21ce62f99cc6bc0191c2332190d0d08ce786bc6654436ce9092b9ece3488b38e82f59c62fcabc06acd369969c2192bf6432af019f30bd9e67c55426cb4db2565ab2f496ecf699c6fe693297e117e7cd31fd0702fadfac8c1f406025a705994952862f8863f7499aff4631cd13df70dedc872c6ade783890d344cd1b0f9b253323fdd06d7c898c8820dcd7eea6bb9b460fe9af07adeeae01f716c9bc26e184133d98d2831d249144125d13dddd023a05f4d703285f0f9c7409e8ee9680f901716ac2871ac779c33e1d149f1f4da4532289ae0b1e20d932bdd3069376bed18f16cf9472588fc4f94614e999c4af4376f0c40e9ad8410076207320b77907383b681d2821053f82fc679ea75f4bc3e27c5b1e6b9562505623cb14cb6e5ee99228a3998991cd3b4999bf18ded2fe131d1d3f592b040748a444e94e724c1d07413870e140d5ed18cafd153e89b3942d5ed0dd529ab494212df6982f937d8dbf2cad5207f1ed6dd95aa68ccb698b2aaa411360d4d764b0821e6840051a7c410329edafbf13f7491ee336bbd3e0043470c269403483191c3991ff41ac13bdb9bed76923af759b739d19579bcb19dac2f2e678e646f246718de3cfb452da8bb776c9fb3f4e30ac4ad33159b6c671d22772d065b8da71da649e1b6b73a4f9ad14ffbe5eb970ded0de5e74f0413a83dd268f9ec3bf54f44b33f5bfd571daa683e374d81251128c8907eaa0789568b472e63007f1cfc87933cef69225aeef3657fba2638aa9adde926199e34c6d2e93613c2a89b630cf1ba648d95a269bbf46bb14248909c892ef8a1add1d23dafc820ba48098b495ce4be481138ca05b88e8cf0533ba5b5caab558acb3da9048ce2b6ce8a829c9e8ef520b6eba053558f045fbcb5bb15c397bbdf090e6800ac49d4f250537b7306a0541e8f617c65854c11562b14c6fb312dfafb8582c3ffe544044b32a90f114249182dca0db9bd76a93121f0a42802f78c313174edafd5c690d696ffda7996768f5033a1e6a1401d28d53a43f2bace8c1016f6ab2b577d60dc104051e0a4ef001217273b4fd2d92010f035d100d3eb663e851197f59f3222d2ee0df793d4f202d2e20cef476b3a1ed5a5aa5f938e984ea007043d7483f2f30c1075f096810f5b91ee9a4655b8b80d0450954dd36aa83cadd920e7777b7bb5bd2dd59b2bbb3dd46474220d103d338d220b84f125fb44324e88204582cf9ec34354dcf4ff3e636bf9d4dc7d9fa84e73339183e8973f93e692fe9323e3b18cb847324ffbacf4e53938b8f5f047b3c0f3e2302ffc942558a67342b7ec62f8e76e6e648429e423b8218bff00deea08df4b7c9fe665b9d469d66c61f8f13888332574e2993d527c969f3bfcd2acbd88efeb3ead886b4d2a88ca6f57a39cdc86cf8efe7a7d1ec0dd33a6de1dfbc56297ea81fe918d6645b8d8e8e71761c674833a6e308037a9a9d34363c8d5e2fa7bf331e52d2669f480e664c4797053901c96ee2fc5beddf2c5642b335b9b46e6b9e6d8db2420ed654ea93885da255ea8f29ae5ab1963627ec608bb4e169e4a04cd6e4e0cc69669ea2cdb80726e76dc61dc413a955b3d973498e93067fcecdbcd219776c9d1c243a0ae91cc792769b49e1934d47d6098bff49a175bad921a26a93c671ae64199061c3d3f6e52d6b94e62fda241d5081022a3840c51454384185013e2a9c7c540841c5122ac8ee26ed8cdb388d0ddeb2c15fa4f5960d33ee2f5baed51f3dc9918f8a231f15b06e7fd1cccc571193a5d5fbf78388555b67480145777fb5441866c5b229f741442a964d53ec4c01d3dd562c9b66cc8aa5154bbc8102745bb1c4325166c5b289095f500363fb2b776d9e629db7fbf781a836a9c88dcb95839b4ce251d48b755ab1c431298c6051c791d26224c6b9b42fdafc388ad2fe92b171a44fb1a73b6f7f61ac0d0ca1591bd842b3a6f8c1d44d43f70d8de387a5811acdd2400ecdd2c010cdd24015cdd2800f9ab581ae591be8d1ac0d0069d60692346b034e9ab50114c0d460e2447f4ca2e88f8908fa63c282fe9810a13f2660f4c7a40bfd0d41e3c60b302edd1f1227fa43c281fe9060d11f122dfa43e2457f48c0e82f094b7f4968f49744477f49685a585668c0f470eaaf47d85f8fb2bf1e42f4d78300dd0df3c20d1b28b18111fdd96089fe6c10457f36584177c3d080a1e58a03f4778513fd5db181feae40417f57cca0bf2bb8e8ef0a29f4778516fac3c2a53f2c64a801f3c528a2bf1848f4172302fdc5c8407f3144d05f8c16f4172307dd3d03070d1b0bc8a2bf05f8a0bf051ca1bf0560a1bf26bcfe9aa8d15f133dfa6b024805071e417f5805fd612cfac339e80f2fa1bb615e808103b93f0e34e98f034af4c7010af4c70115f4c7811f74f70a0646864b8cd58b14fd2951d19f5209fa5372417f4a3de84fe908fd2979d19f1218fd2db5f4b784a3bf2599fe965afd2dfdf4b704a4bf25a7fe967ee86f69497f4b02e86fc900fd2d35f1020dd63783c502b35b40608527b59712dc4d77370b18432b90428d293360a102336872de58905001ef6e97e3e0e40c63e268c919f6024c70644401227ae6107111113f07f8455b670004d60c823476cadfc492811332a08901ad1dd0442744add2274e96fc8562c1c08a2e8802909ff113ceefa2d3934a36a97bf0ce6b69ad96969616973a8572f9d22f1dc67a010f09b0b01059578c50b8a009dd3608e1029deee6b1b3440b0ed0b1264c8460c194ee9e194f24c487010b843ce9c6ac15dc74770d20000f1538e98e52814fb78dee24cd4ac10152b0848e122bbeac138cac13f8b04cc0a49b67c765714eff34472172c838bfe92ecdfbf316edecececececece8e8e8e8e8e8e8e8e8e8e4e4e4e4e4e4e4e4e4e4b85c2e97cbe572b95c3838383838383838383837ae1bd78debc675e3ba71ddb86e5c37ae1bd7cfcfcfcfcfcfcfcfcf8f8f8f8f8f8f8f8f8f8f4f4f4f4f4f4f4f4f4f4f0f0f0f0f0f0f0f0f0f0fcfcecececececececece8e8e8e8e8e8e8e8e8e8e4e4e4e4e4e4e4e4e4e4e8ecbe572b95c2e97cb85838383838383837373737373737373737383f3f3f3f3f3f3f3f3f3f3e3e3e3e3e3e3e3e3e3e3d3d3d3d3d3d3d3d3d3d3c3c3c3c3c3c3c3c3c3c3b3b3b3b3b3b3b3b3b3b3a3a3a3a3a3a3a3a3a3a393939393939393939393e372b95c2e97cbe572e1e0e0e0e0e0e0e0e0dce0fcf8f4f0ece8e4b870906e47fd4314273defdb847488bd0f444ec8263d2512c7d21641c2d9f185863e087b810ce9f686b86fcb4ade00986c1276d2dd9e00ba3d23987253884deaf68ae8f69a747b2511dd138b615191df217c6d5285dd320c6d8551284a349f8ab3899dea077181885f7193c43ece6e6f88af36c963e20591ebfeecb5a499cd7af4b7cc25ed9679e6b67ce9cca757b04e1f4b3c7f364718883fdb8a7dd428d6004cb717d5ede1ba3da86665600bafccdde32c97242902e2a829465444a434945414635262622a8a15091942a4841433024382d57fb24e3e65d0edf351cd8ee2d1575aab4543522ca09b66a6bbb1186f270506a2687cc1dc2c86f124655e2cd759e98dde1053d16f657d7cc313e7d6a85669be760673f031d0f27e0075e36ecf87f7fae96e22f1afbdb7689c7902b9c00e929caf57cc6632774357cec462f8e2ff4da2b3c3a313c511ec88b31d9b7478ca288474c74872be5e3112ffe0ececb82eaec0113e2e9c212c11a0c014dd15c8f17ac548dc6d9b0505129ace7c5c38317c9f1cdfe6ca297d5c3825144b9486babd1b9beef1dea2d08e23ec0916d4709f50a962604dc089989513ab034c004737757b602bc792c01311f8a29b26019d49dae4b257e3b53093d71ebb2dc35eaf0810018125b02050c40153da01483c3b2e2307b4fa024d8ed02cde802c1a904577d4cd11ac0608c117cc955a32d6009a201b9e4640359c9be38b1567c5d1da30f6d716bb95358a014eba7bc905f57a351145133a4de4d8b18029f00529396358f470e5940bc0d134b3a39058740b8d7c9e61b543afd70f5180c584aabb3d1b14f084029050800dc8fd259379c6938412272b0153580990352b01deedd9d01e8f1ada45a4c27088e03e89b584534349021427ba1bccf86bb5123f99cb78da926e62373117919bd84d0c87087ea67184859822fd0351f151428aeefe5be6f93497e15ac6a09e9ede9adc3ff5e0803ae04d4dcd8e32dd5e4cb7e7cd52a28947432bb1a4bb2dad1ee5469284d52abdb929879374e59441b1fb64d4bc0145cddbe3390b72e5944051f3364e270424717f091f40eca63e64b16b63321ba695d25c085f107b3bbabb83a1bbdbbb6183568f90727309ff0f36499c7f716e2efdd3623837498ce7181a80e7ff02c1f59f6c2e400ebee0385f48f86810047be41ff1f850aff1a17e7c757b2cefc317b4e169b3e1697b12d59dafb561b736bf1edf87ea9e2735f005451f2c0244d18d2f5863f7338ddd9ec436e14311e0c90708c0eaeefa65a5370f72b1be6dde3c2b31eb0802b006c02212246614140434ce5c6d50ecf57a7a738cc45fc3b799a7e8ca29938c8c8840133d29b972ca39f2e094a3b5b3181e83688078ab49fd201a1146e3ca29c325b7d8929bc822a224a285150024c4f94ce2d8f441d0a67a44deaed1501179bb46dd5d185d17b8d01d7bbd624d4eb0c00b42e0810e145802173190e20740476ca810c122021796086eb0849f2008af4e6104310c000955d8306300421a100325866b01110841086aa490a3891c36e0410688029003a702fc20824a16b2c062e22c21a2785610527458e8eec0e8aad05da1bbb34215583926f882232b67c48a12022baa8a2ea2766828b070594c294421c7c2dd4069d1dd31b8fba2bb83c21358504d5ab002f8144e7bfd6736e90656b9430d981f8fb328138068e6491413eb7f6d2eb130043a27d41a1de70741712e6d6e0ad1a1fb8b26b25eb9adb4aa553fba5e79a21357ac6ea56774ab1b9d8c8ec5a5eae91413aa19563c1696952ad5758dc303dbebce07950e5daff858f50c95aebbae5bad74bc17afbbae4b79465db7d2795d975209c2ebbc6ec5bbc1d4752add4a7b5d0c30e5a9a8ccb878a7f23c15944ed5759e4b5705af6be955a7f252df754abcaef35886783bbcce5351795d13bcae53f13a1f3a1c5d97f2585cb04aadc8e86e745dd7793f9e0d96541781ceeb54bcaef352b1ce53b9b4e878305d104bb7e291fad1ad789e0a27e5e2791dcd0c9e4e0815ce0b90d492d7aaf62cd0a95233aa95d7a57ab580ee085d7bfd7d5f77dda93aaf7b42c7e2e1d075decaf3525d97d3d9742c1d8ce7799eca50d7c3f3545e7793025f74b0dcd0c5a00183c7806ee5e9e8545daa6b6fc973974ed51e556997750848758c0bbadee1055eaa53e9542b5d8c2ee584e7b1bc529d4faaf33c957b302d33ddaaeb566e543834dc749e8b0a8bd7755db7d275afcef3829052e95a3c550aaa93f1caae4bd5742d2f5ec7b2d2793b783378337832a43ad5dd8c4ec5f3ba18aa2fa5f274789ed7a9742a5ad7c2a37b5979ddaa93d1d3755dd7edf08e565e5abc6ec602b3e2753e742c5d97f23a5567d4c9e0fd7831782fde8ab7ea529dd779ddab93c17bf156545d6a95eaba9e2ed5cd742d1d4cd7753eba193c97d44ac7a2eabcae7b759dca0daf46a7f2ba95aafbf15eba943743974a799eca53753f9ed7c1e0b9742d1d8bcaebbaeed5c9e0b9aca43a158baaebba1eef72e0c00294ca61d5a5ba964e95a36b6979bd1cd931435783aaf33c156fe5bbcfc6cd8b51d7799dd7755d4daf34d94010d17df1c313da7f80a20b293fc46ce1459179040e0c31c294768a0142374181836f9a37682628ac8800538c55f2010a255f2c4d9d1d844031c3148c660c373f50e4b0f9993236d06384183c7a625c3a1e23745ce0918521011eef4283322dcc502393c26b4db9806df90d0e393cd182020d3287a1c171d0e8275e48d2b2d512ed2a0174e745507717b151e00baa3871b161064d565a565a54325878565a5232c038159124c332a3e2c2e2a38299d1a96054622a5c2a468aa5d242000e68a222c35b6951b562c8e0c381262e446044554b46119ece8ed51055a702d482263f8410b104e0a95c544268aed0240946e020a5886ef562d1b043119e0a86540dd9c504ad72e0411315151a969cd898213480140f4510a0898e96223035606a0401c406c9825dacd00428b7f0204bc0b7d2928ab17a52217180225854325464e866e414a1040ab4e0d003272c60304086f7b2da81b5f2a30af247a218f1c26ac60588cb0d2a485438acfc18510228783042034adcf86e9cc4088514e08a262f25ed010288e19ad1118921e56345074f112e2b3f2a2e2c32523d473ca46470016285262e2b47319a588c761401716931826912814ad00487aac5e3a2f27a21868acb4b910c002ed0c485c5688699019aac52dfaa53f141c565e543058720a197b2a5078b918acb8a8e18442d3c54492d386ac470030c377060c92108d30d45b8b0802b3931727a8e965660542b30ac5e299e1618550fdf61a565c54565b30aa2f2d9a15bed48c5ac6edcb4b084a99f221f39585c6eb4f4143194f4a2c332a3e2a1e2a1a2812638c85011ad7258cdd0c24315c30c9c940c4634016dba142d55a34aad849001800252606b0738206505513aa081280a40c41051f889f6a10c00488030426448d392901e8c5e3e393337d85083ab5e80451850f042093a04d92003838e95276a40030c5cc087221d5e32d8807951b9c20a1350210506a2a800144f4460c84c0f1bf0010e706a0a630b549801018527a8206659095082d2827cb8ac48b104949e961f689101295e3f3c386abcb8b0acc4b083042340f2a252520f47408a2490041204a0316507051de08006882842a48727470d150ea44c8148d00f9e9615150f1c61820f50a00905184088094840024a282505f9e801d3692195050f0cd517fe04af0b95123c23aca67440f07ce0f5a08507303bf070e0ddc0b3c2f340aa03de934a49c7a3a3814586550c317478383c1b5d0dd60b2b1a1eabfb5432bc97958bd7c2c2e2adacac3c5597ea3a958e3123b5239582262a0434510951c1c1bb952a14f15da0c96a05b37203108a504181a3c20113c506540ad04425a4e5864b0c3904d0a4e5071510a9195eb20a0c0b10161f1597948f1c2eab193461a9a2490d2445b4f4a42220059822345985d1640503430f9ac06499143469c921c35bf1b1b25931f1c4c68b0e0618a13a40931931336252352c1b961cac308c58e5c0e2b302949a91026289a2490a09c746c545658a26a917151854ad179c54a78251b55c80ac7258f9410506151715253035606ab4e468b9b1f2438a0b46a8c0908a62c42a8b26362851dd3c66830caa17cc0c1596aa4bd5a486544b303854bc95222b3b5692563664742a2fa9950a26954a79a995144baac52506556a65c80a8d194b2eac1595952eb5a2d251d9a83a161da91d45b4d0b0da4013195314c15251ed602132425504236462de617441093fd0020752629045596b5a024a91900e3f7a6c85c2136c7a7c3358568e00a19414860d7690031a94b87182013b38a0083eb8010c5440820e60c006bca189322b816f15a2f0851078b0032c4440440000800408234a493c00a161061c37ac3801111de040008688c91083ad34c828021196dc9a84d1852b5801c9111c37583e80c10b58a002128cc0034a2481440c003f14514a3aba810d5e5003143861140420dc000658a820051788c20003104014bef0010f5490022b3ee0a4c98b4745ac185f70b145116280c5094c10820c2c81801763004072a4c851918f170d2bc60d6c1083083c6009272f02a0872320453e5e3262a89a8b2d6e600319bce00426088107329080249c24e9e1e8878f578f0e0e0d0d96aac3e0620b22c820062fc0e20426f0400612b04412087072845812243ad8805bd082902033640c21062807308091223714408001725154b48491ea82c7859516bc2cb06c40a5012f031e063a978793bae9c0979a540e29bf41831743b7630586948e2e870a4777a3e5051a34529f6a068c8c2f060c303a5e627061b5acb0a8ac782a2aab55aa6b185ce894aef492362fda90d672858640a559f4081a006a44e633ee2377e7b4853ee90d5486d6e896d111d3f80f209ff901e4b62d6c3fe8ceb9591210048f1c19a9c0d02b1f32ab1e36a7fb394fd2e6661babb6059a1a116a59b4e799a7e39a141ef5e2d7a06aa25f4bbbb69a0ebee0b585b7bfd9748b11dd2244f79737777745d8c2864683ee9ad02d41b5eaeeb8e81f1c0ff27bcb10879f1f9f9f9e1f9e9f9d1f9d9f9c1fd70fcecfcdcf8f8f8f4f8f0f8fcf8e8f8e4f8e8fcb07c7e7c6e7a7c7a7a7a787a767a747a727a7c7d583d373d3f3c3e3c3d3c3c3c3b3c3a3c393c3e3e2c1e1b9e1f9d9f1d9e9d9e1d9d9d9d1d9c9d971ede0ecdcecfce8f8e8f4e8f0e8ece8e8e8e4e8b87470746e747e727c727a7278727672747272725c39383937393f2e1f578f8bc7b5e3d271e5b85c2e1cd78deb07c707a7078707670747072707c78583837383f373e373d373c373b373a3739373e3bac1b9b9b989bae9fe8752569b7ca32539e2d29a719919c2877021dc5b2e2d1721dcddbd53427797842d5e88bf7e46f69e68852dc419c864fe7269c964fecab41fdd5d6434ee99f6e38cecc78f1f31f86d619eb7ee8e8b2d58e20298f0568f1e4fe2d8fd128f449a764cbf44126289aa6e1064854c08911056d1340e04e43833ae8110092bbc79aaf4da30ed3bab41777740e8ee7ed0dd6991aa424a099d0f7ac083ee6e07dd9d0ebabb1c74522030ad9855cc3e7fe118be204e8dff00f2eeee06dd9d0dbabb1a74b715cb2626a65b68a405742d1097d7ebf58ae11763f54591da62949c3112e3205710ce910b8ebd5eaf575048c759b9449230a7d78b87e3e9f39630a079cbb92488a6e5ca29677a108f922cad1ecd87a2b5fc4f21cdf89f7684a3e6ed1646899506793297634140e113714101dd4223af570e94f84b6e22111b8cc8cc489243ba00873c316487212cddddb359e32445e38c4927d2e9a61bcc8df4a8594d5a383595a0c9d61487a9cfec38239b72749797298beeae553a521bce614c0f68d02689369c791231adf8a0021f0cc0f281faa083b58405f06f362c5b222c8324cd4b582c5950666d3899e766ad7f9ab764ff34192c6adec46a674a539422a064d4a00c578a24c3592cab7522a518ba671eb2921ec04a024202a31bcc4ddcad89ef79c2c0bf65cd56a3b6f2624a3b0269709e719a459a00921124966e10cb646e73b54243b27146339b79a869a39933a010290de26b673c26563b13a9901023dd58c80e2fe46ba2230ff245102941a4e82051dd418c34ee696ead53901dba3b488ef63af110560f1760f5d0430f99867424a3dec59bad81b979cbd579c44437d8a365b40423278c603c74818718f020458332af196fa11172de642f99cc6b90868c601e7a000246cb4807c2049000b080e4e896d9ece26833ab4803b459453022596ec4719a85e149bb8fb3a3c3405b38494c6400a225d69017b2dbcdce5b9e33d3b014ff96430d18ea612886eea15c5a1b1069c808661222819003849ab0847674cbc0992791ece535e0dbf22d69a4bd22cde232cf58ae8f836c781ad9f0b45d7befc3aa8041b10e8b0261302fbdc276e802c45e613b48d1dd3b2c813bb0e4251dbee80ea9b5a85450eaf6b19e05994268464406000000531100204024188cc60362d980d04bc70d1480026dc270a24c9a49a32c4929648c31841000000000000002323310009ccc1df8388f8ce95cc9ced1e00c421a59ef3b3ac87fd1c1664a8b0b551e97e6b154de76308558c78b81b21cc3591f2193b7d19d21ab51581a20bb78b76b8ac79e080e52e373e312bb9e2614b438eb69e171412471612ab95f6b6fff4ded37549eda44bc55c825d0060f6a1e45f6fa5a8fcedcfce5c3a16b39bb68876ff16def1de1dab527a0cf59f27a3cce88c01240fd77b11f67ea8b6f005247faac5957f1ecb41a1c1209e5e08142b758d9e60a4cce756bdefd87e26b5e771f3031eb9a9053a5fd04647a522505148e6caccb44d3bf78e13dd068cd4ca91237562d165f5134f9b2a76465e13f9c607bf96384a0c641bd251f6d02c9a2eecce869728ccc8ce79f7a1f7fbcfc84eb4ac043637c2650987223a038c5b9f798fe2b8172298f25d09876c4ee51901c5290413a5eeb665b9cd0f48acd260f35fcf27f33ed1e07eb493fe8b1fa3e66bdf4ceca4c9649518dc91929a7e0dd9fcc5e7318c9dcbc16e2d0f8436350fb67cfde8c71bbd762b8e7a763881d188a4c8a55a850fb57273f9a6ee18c17b4dbbd2821ddeedc0866462e35a2dfc73f1c5d616d3549a7e26f1e510d81d541cc0dbcd1b98dea49ba988fa27e43495f2f6da303b533ff0ff0e1f5de1aaf2d39b7706b3027a01e666367bf639f72e6f9d413c3dae6d7d72b341146abed5a3279bdc436635b6681190d5c239e7e2ca5a4c96799371ab27ac44ba6250992584349df3628d62dcd76d1010f7fce09f4293bcce49c4cd226ecab72b0555a77be29bb5bedf4a8d6a95ae8bcbda7a9236cb30fc1b2dcb55a9b71f37296e316d0932419c228e8a2b6eee3cf4fa65ede34f8de854d03353a4265f7aff17bfb6e3cc750163f84d31504858c4d2952d60a73c495b5018255f02cbac7d16195a2ad3c01b0f7d7c8d512163b85d0d8d584c2a2361c06d5e1d8a80ac1565d00d6ea61b052098b9d4268ec6a42e18458fd5278baf161e07aa72d7302a0bdd31165652c3e10b4f3b551a503edbe05b5ebd3802512163d85d4d8e58402a3371d0cd5e1d8a80ac1565d00d6ea61b052098b9d4268ec6a4261511b0e83ea706c548560ab2e006bf53058a984c54e21347635a1b0a80d8741753836aa4262f7c265682dafe1566d1b216d2364c305dbc16b255ba3566d506a28d40963d94b80ba3b3b4381f16bba19a981774395106dd115c0b57a305e751916bb87a2795f0394176b87cb80ba386d5409c1b63a025aa71bd3ab1560bf6b60f4763446d9b236380cad09d7461590dab21390b57b63b64239b63b0e436377d330e926d5142900d5ee51caa942a31a53d1a2c550af4ce4eac340ad7f4dbf78b48f356f3d56ef96ddd48bb5bb414f3ebfdd407547d82d0a2ef0f8be30a9650a31a00028c9431f5eda0575c3b1a8319a297ed3ea6de19f4f1964445098eaef298189c4a3125c2dfaeb9e237eca7b6cf2d07199770dfd1a4665120c54ad235c6d6c8274e47ffe1b1acf47f8154598a7bc8bdaca3545400c37eb5658286effd531cf8f91c5b6b3d44cbe5a004b121cfe614bb2202e8d387740d162422091545db56b6597d1eaff65f55dc61be80a9506f93c5d0e8fa82258fa59bbeb9ca8e2c458d27c0a0d371980384d8dc0b97942e7d5d571bf427f68dbdf7b0b4f67a84c7acd449035a5d40600fac91e37e7b7171a9288f332990c107797f47b788d32dc215caa805b9ea57e25893cc92aa380892a8bf4f450a00be744b80b75f1f2c02112942ed70f32f18e030bbfc1acb3aa5f3a9f883395c6fdbe05cc03ddfc7b65580caf8d8d1bd8603727f554de3bfd93f588b7124262df8d4b1744105e9b8cc75da3d80fbfd15100125ae9ecd436b480281e60a581da58a06c188d0e9c6ddea881401af46cce1a5160682d014304cf18d1ebe1595d29a762d9074e608a7b40d5bf80c47753100e68a72189d55430a0c9447b8d2aa99368f7c90f245cedca76f38a987781ca093f92341ea91e396dc87854f5dfe721183275bd06e8e695a2637fdf120f344edc387eae4120f9c947afd0d0b92dc335d2ee675c4d7dbe2d28d9f3b8d926f6c4d787b883716a950654307c30ff38a087d7ed22a99fbccc4660a6fd648072d88814f42dcdc900b12d51545c4a2d500e1eecb0957ff4d7e993bb678361209cfc7e38176dc397652526423606ca6543d9d6fb0e479be6d384962dd70a7301f849c5a535e6ce90f8484da0d0e9c90591ddebd64d4a41c8d3e8ca1b2c9dcb7171f4c7a3a68290eb2ffba12f52b0c1c75b1763c59c775b697a4ed78e02796617f44bdbdc85f0795a0f8f6bdd048414f5798e6d567c1185c5f726cb00738a9993d29873d174fa41a0155006a3f98c9788f763bbd4b7e134a9abdbbbb8be57cb098192ff15964853104b281f90150e7cb6de9b29b118cf9d3c5c200c7b4a71fd8412464f1300359ca85b3b4795be25007f5bce6ab8712c13fb81bea1b934d09c84377a8477a57053efd4bd407f77e93e2268d8e3ae262253854c8be0b501979acbc9409734c8766b4df8df6fa17b1b31a8bca8cb0414b5099ab2275479ff59e1cbd484f7c6d15ebe6cc6e1252c8ee7bd93c7136873fde58683bd5df9e188afdd55fc05e51dca5358a7df7c031e022b2beae6f757837e5bdad93b71f847bd54db8ae18ebbf84807fb7e5395723d7d587a8f8bdba68654be6263a29abff4d4b6e9ab30425515a99bd8b7c59890e953aec2385994e4289aed3c3249f8586e436d402d5360662782804e5a395d6a61912e887750eca426b15e16422231fbdf44fdc2f1b2549c8fe4da4eed3c641a7a01ce9b2a9bd0e93305f39ff531b5e38ea23b155567731bfd3226fd06760d0e6eefe620eda361c8a590ff50a8ca6b083ebab3150c2a9ca46b1258556ae6c720e2ebc6108dc2704c83282acdb5e467f43cc44e28b95b92784058fb9e2197c22749a6b1d529b40388e9141f520cacecad3fab9cf1870985fa4aa2f72a485fe8f43990fcc0f168ce019b5ab91a71c8b1fbc0d3e0187c73a056f64df34b9da364967fe569fc8693169fe7f8e4fc5aa9a4d3ef2cac8f01d152c0571dc3d9872b558fcdd790a1f22b61351ee63b8cabe00bd5202415bc15bc2a1badefda4c87fcd7a0435901591d993a5d08fad765a68daf1eb21e5a54cbf0f6268c1cadf2beed56aef2b4f5e7fc7574f8c7c1d8f3b89933e4714bc15e09c6b0f52373ae4cdefc0d5aab24051e6bb2e5949acf42d78d313f50e8ddfb406b840b81d16f977dfccf45088d2e0ee4b2cc62fb1c92fc05b241ac7c2e307e29e18fbaacd0943555c32365b6b64153ded6ca4e88ac6437159869398556ed6a5ae11dd1a4cd5d7b132503c4cfb2edb0e1cbfa8f6e9a3e8866da914959fb4561441654d9917903c4daf826662e1d5db500baec674e10bf9ac549260e7c60326a1408efe0fe0b1e2b00ebaea3ab63e3073bb193f4feb897a33a34513e968e1e4cce249bc2a09a8b32203e4526c51aaaf0c5293b52a64e5d4e2b0c570a9b013509cd136ecd4fe09603f50635b5f493b59eb45e27527c72ef40e6a5435a59e7bc623a9cd92613d2ef58f1a023a03b093cbe67e5e85512203886d4da04c3c552dad3d3c696bc16e87eeeb93f49ef34dab2d7ebb5725bbd9b0793ec61b4c9a52b39bb53f82f89c048a3fc5d3459a32bfc2e863a5ac10a703567a7b5fd4a66f5d61f5f7c6231908ac657889d047a4ec097b54af175a1faaa5fbea3cd54041f9784d5caa26659a552e80df2fcd6ccb6ab7444c5ceaba90427aef83eb24972b59acba4cb737ee27213ac8e387195a457d2c8013e5591a9c974bfa3becd4d1cdd2553eb3d443990f2f0e265cc17aec664b2a6fbc0bdc49a7f1aae9c64b5d3e2d857c5a8bf150a0819d0462eddf0d7fb5f1f8b9f85fb8e406374a1e92da0419afd13d38a6ef44264f9ddb5ce84d55281c83eca3b27a63d2983df4a82e4871f200210ad09c3dc7a89907e8b0a70cb61beb7d93d79b01bf1e8fc680b0a60c6503d87f462b5644666b4b6fc7e111d8b309f15be87f02d064cd422c152ea03c402a273cd36af4eccc403901a5ea4a639c6391348bb2982833f35615a36cc2a6ca5d9fcabfd7ead37ac7fead5cd3d2c57ded7ce52346d9e60d487a1d5936a5638218112c0518b7d3ed4ea7a17784c238f9eb6bb8d284a0dea935f023c044568c824390700a2032b4a872e601dec331c1d1fc7b8f2a746a712ad3dbb6095e2ee2160ad7963f90ab489f25ebdbda0a51cf101845695eb0f5526127ff576ad4f59d750218b197d1ac9d89b3d7275de3e18e0b7802c7d5f9759be988a729a2047178024e04cad0a3595419433c514ffa2c46fff6f7c433bcb375408b7c67073f512f5b803fa2a56bb00e474c7765adad22d1762c50ca6c5a0013ebec1415dc49a4ca8f291c32f7111e1384d37fe584fb6cee3c720576a0cf8287172396b3e84a6fba3d008b67a5ee68b2350f985758feb9117d28ef34fe2258c8d761793a43df192110bcef6a361671a6f0b79821be965974e993ce440d1fbbaca5999edecbb28cd81dec8d16f347ad6569e770b5c790db555d2f27b66a8098aa7f9381abbac770b1046404683b80cae6c1b16851dd6c4170bba7747ad91498f5a01d0ab66a607fb2f7ac75e2ef47b9c00a2797a6210d6e11b477686a5853e9b1320138353b94910b5cb2f4d77646bab7894c09e632d7e568ce0c9d6e3fe3347d200a37aff69f181ab1be37efb4095461b66c77e5282696dffe4fd90981dd67ff2c46ac0c03fcfdbb92fd9d4c8316d4cd29a1bf98f476d4f19c5cb0fcdefd1692dc7f96167f404ab9ba3968303f606ae8e68fdd8e73ef6602ab6f98885610656e345a6a1d3307c578ebad8e0869399abde7f559f81f37479a3979da1c96d5846eb4b24f64d8eabbce3fb7844d6301735aec70fd8ed744e683a70c896b13c9c077f7f1ace9082816393f8bbb42701e0d61626e618e09e29864dce1f1510986c4f071faf5952ec924f1bff899b4f6a27a2a2bb070e8a118cce35cf34df0cda7b9ce2fdc85df7f078226870405c338a8915656a7c34d8826969fd12e67714f3ca72db2dcb09f22d32a9c59805ba5a18dbb23e7f82a5a71c4b8dcf7a9dbd6a8c4d72b9c6d56fa93c7cf91f5618fe5a9ffc8448af75c3e4be83c1fd3e4bfa32ec0edf7ec1ea912b29dad53cb5b3fd8dffb859c4697221e0fa8520c9ea73c2e9f3c5fa13e373e87988c2b951227ecf38e5f225fa0da6c0847597666cb4f8f1fec682f7cdd124ae498b75ef025cbf001663aa0c48fa6977876893e92796c95a15cf2b0e2ce566abdcb549bcb65c8a0d639df56f3142901760bc9e421361912a6be80bbfa0f3db4a78604ff44cc4e3f768dba303d966a4710ab80d78ec9b390f675b0e08ff6a6cb8fa2671b77cad452c78ca8af95b78441665cc9b2de96f65f01d66696da7ea6829edc958197cf310d3aa7c437ae3972e082979751efe21c9f16fcbbcafd525a03dd6838758c69ff2d6d7ce0bbdfa66906f0f903fc3597f20d986caf8b9fc5766eadcacf017caaf86b4f685e3a6f4ddf7e592779e3902f7f35b4040bed9ff9af7d38f721da3009eeaed0a9a47de6367bc41a04925d897b9ad11c512263e217aba2557bc0f7f066f9e68f919ba73dbd7230d36356ef61ac6955ff08797ee91d7371293a53ee909bbdaa6a20e25031c79f582c6645113c74c51cc33eab45ddb3265c56c4eb980e52fc1e1175ad4e715eb1763051ce881a33cbac09bfe00e1391829b2fe9caf1a31d420757549c154cf76c0059494f1be805af279d4bba61db5636061f28833ea1b4fe30769bf054b1bb2d769f049b2a9b8e9b35cc04ae790bea9eb4e26a1eeefabe2c12d9159edc5178270f3ea595903f57f72d0e16edfc92523a353d81701bfa752301e889957238f47c4f4e91379b878e5494d98a4c89fbeca04cb1032bbc512025cc0120ea21316e529f158f5e866f5155f4fba9480445c761b2dee2a9841e582678c19636e060b12a5829998681f8e992800936dc65f4758ac115e8bff45617ee899e156c4bf9ee0c7c68581ac29001aa468b9fa0d527587a8ed9941b4d338fae460842b1a0a4332b5b819a00b3a2937600d1e951c9ac214d16ec2fb414ce424c0b934152a702cc71ce10d92c02dcc2f5fc5fd873c1c37ccd97ea9346bfcc078c08f0aee0f77db32cd5eee319cfc8180932343e6f8fd816a4678002fa51861144f3c89c6539fa6717edc2b3efca94fe50f0914f451b0187b780a541435569a1edb1510ae73be6dc83d37300291b0f5e8d73c18b0a339e6984984b01ef3b87ceb34ca58e7a8e2cf81d4535e773c6da8c3639e280129aa92e36bb618b20e411303acac8d6bb5d9745190dd4ad8d6edb38423f30389932948aa530a6bfaac72c3d4f4e8f26a4f906f0286a6415a55c1e05d2dc7ee408af39e41f80ef858f0290cb08869c12a67748979661c10c112226d95e7e78e3b871f55646c82ba33cdaf8f424604f419982dd28f89cdfd34ffba5d866262006f00faf361b95cdb341d5320b695997ce962d04c9d796345da619856fef07a27dba830d888f5173ac75f3a81afa610c3f66b39fab7c655c32df4bfc107ca3d0e9a352583e1919d047756309897671845e7776494cc54500a0eb145f68be268fb5749e89798ca3023cb1de1532b3a66a6d3b90cba0124d0763174862067fab0d8b39c1df6a5288f94ba64d474aaab1b809363c96cb79787b7426a0d88c65e39a9e630512d329021bcd1b7feacb52cc9dc7fe542e0a9d3b9cca21678584688ec13521f9fd23f3166ea55f9f2e0e3bab23406fffaaf7810d556483db1ab8485b8e0dd0a6999ab3031593195177104bb4c608442e02ac6b30a8f494b57ff01f69323fb3fa4dcbcaa7ea8c386dfb35809787284a5ffc66cdfcc7d027e688ae02210c243c23ae94017d48849ac1a2085e8da22f06ca56c25e89d5cab4176089da3dd4ac477d5e6bd01381b3ae0815ffc0ffcb58ef01795b8b0ebcf6ee058bea54d2712e4567109564633c35e5e8230cfd087e86b745f25fe9eec89ea4d145dd82805c9378bc3ac8f362ff6a20b2a1bee0d94e1a5f164ee895af90b0bf8fba500a4b8e8b62612d5ad996ba8d54b7062acddb3e7ddab9114eb513fdb203233e0e5ba11de02cceae9f2a7adcfe391b7c06a06e22b9f54d5ed3fa0231efe200444a82d68d8630646df0a7cb802fa2a14c873c5e14ed3c04a192ca9ea40e81f2415493bd0f1cf027f270c16508e63bc2469022263089b64cdb8b9f8958fc0078bc1cb8011631e974aee99ef81ade18afc0b74e09bac3600f6abdcf11f177a143eb75a2432ea11a2ac87f8170cde15eec0258ea823603875cc66442879332f70beaccc07daeebc9f36b22d19514d3db0da03d99abaf34a39de2262766168ac602c9f5af657369807ca76c17652d17d37f8b583076eb4dd33d306fe2a3a4b1b2b41879d8da929140fe1f9101f75d47c71cd859f8ff1f6b1119a8f30724805eb11f6c59212648cb277a9ff53fc53a2aee05820a55f1d524409c99764401a6244d880e3b889098cde3995b20e971f7d58a08d6fcaeb424edd181df2d53b9f165d625768671c55f1396846415143e12dc77803fc2d7fa4e94ee81c2a7f9a7ddb7227a09e5676624cff11552d68e92aa2c36d8f2a598630b40e82b3283a9df5ec19a17f1257f42d54d879a5da1e41355081d9abe6b5ca240415deac12733fbbce26070190874d960008087d2fa10de14e3caae1dc431d7d1f6497d144ed25a49c9f6b5765cd1e6074e855b5496285d134fac99b1f272ae07e921672fb5fc7b640785e9d7e8dc79f3b7bfc3b08c00cf6fcfd98cc00c33f2a6a0edb3c6f98f31f4f0a80ef6bc64614d54064678345002089fef5e31dceb73b65d32b54f4b65ead03a1f91c85ec946e444532a743438c94b68904de3f6caa8e9f0fae041c38f9fbbd1a8d43afb5d13bb22212ae1920487b09573bbae0102acf8c78320b36a5e51a1ea80ed7d16bfa2ee15eccb95fea218aead26b1bcb18e1e2caf0756ee53e0ec06897c7df243947fb16b44ab598bc31212d3b523cdc4625db1144a496f2e9a853907eb7a8eab6c8d3531dba796f0a8425419def0df9861a1fe42781b84061fdae7e3324d22e2f4adb01592295c7ab4bd37e65df2df37185b9e7385c8b0079719a0cc74454361404484579507660600136fec1937384edf670797ff89b76fffeb8d07be9e1e3a2dcc45c4146e62d8c34902bdd2b2e548e3dab4420e76cc55d0c5a501eafc7f02d0c984cae1dd6707c39cf44b51256a3476b63cf91425c422892f655ed2f4cbc34b279aecc9cbc4636d4d147d284eb3d6f6f2915eeb85c44aea0dd9675e05b20a495694bc83abe0d56ae853a4882a05888d8a4ae6ce85d91781b2872c2ebbf47a45285ea8460aa7a1e06590bc4ab55799e19b316ad31ef29379405b7efb5fb9de3b9757e3d28b0441e2af33e618d59caeef62e8d9c7718e3621f6df3ab4d3842e094aeef657160475fd12cb35a3c32bb28e52f7b850f0c4f764c9de3b799e1452aaa3748dad12cdf3e2f4131961d4b7a031528b561edd905ca2ecaed09ae65809b6978892383623d1850d3b906fd96b54d0a32888b4fb7e853d75adcbe8b5e740f8388ba0f958521b5947a30d162f42740abae6df66b68e0594ac385479126be912cfef96c9f2104d1089111d23d42275bd5534db9d178c24f627443b2a439e25f8ef70bd1c8b600474b98812ce5eb772542d92111b1ea10f9e4635d703f3a32965611ec21b473032ae5efb0cc71007ef1b83a339e7ee67dbb44c8a821770edcd6541d13a29961af3504b8d04d40d98a4cf899e719ca77354176ebc3f2c269e3c87044f4b0458cfc8c023076ddf15fb59e5ad2ffce3fd0758f8624272e39b257f0020534c884e76c1f50c716721c013d1aa0ac4ed651898b9ec1d393aecca0bf8a3ea49752ded59bf31374dae97ee5c7df9f33ef9500ef0e7814b1dccae276889f076e636cdb38ad68ca0179ec803811074aaba1b2c4f357e9338847efc1043a80b27a894980836dd3078ef67e962d922cc3bc44c58c0e184feab1e6ecbbc0a467bae8405183d617d8b4b197bfa4e3a66cd9fcbaa3f3996c31d69c8bba77dd8d8626d24f61f6a2a1fc0e4ff6fe5a781fe4f4e2c5c8302fde532796e11aaa97a7273c9ba13b19a1f71da4d97619cfd4a9eefca5495e4e995b7e492ccb76b9a0d186827bad85c741f108813f113c1ea4d0f35405ff0a8071c13f1754b8b0d1811d353d554e64eccbf2f96ba49d40c24c3de35c56d085999c436569e51ed3b6b6f389663f7aafdf582111723680e48993b2e744b130c3d2e13e76101926f2404bb51ffa9d44e112ce7ca8ccdf4d247f1b377a6d9f223dfa8dff6104bb1f05083077a5ba004384b66f9202715e91434fc3271e8c7370bdcce48959c82d9da5b0d30b3c617cd4dbc865fadf064a546addcfd5b3fe161dfc3423f7bd478b427dedf17e7f7afcae0d986837b5ce3b57280292cf6b338e3c192cd7735d1933ab9741e11258b0c0f01e28d116333d1d18c1ec3f0102b25bcdb5d64df661d02f63e9e16183947b6e803fc426744f4d4b58e5581aa9a0172a3b2b94e9363eacd594b9fede5794fbc7c0de115c9923a4412a975f5cf7379fb534be90bf26c543918225b203b17fa90f4b4e5d6cbd9116ce9fa63af109707d8ea67786a6572a5e69270910e867c81d373db9d568ea86f3bc6571b086cc6935473df2bdf91ae2e26553acaf234e8e86073d8983bde473d377cc4c5dc9c8b409de72d43d60daa11afc0f95ca3f2aed49e4979c7a31a80b63db6d6dbe53b3c5b3869ef56e7df4a22a7d9cc487794d6be6b46bdda3ea59bab18804c5d9cc6161ccc7d048917f8b098a40841217603865f2f356292f5681ef0b243789454d01488afe484d518e405b6a0a8f2909d2631faa08a594c49e43258b431c3644399b3a95ab3235eef12f93c368fc4537900e152daf3b3eecaddffc67cc140492163a2b234ae0c034b254d1dbcabb996681d5f069d2a5cec0bc5da6d34a3a748c0386d0d9273e0e25cffb02017e497603aa518b56b18ae00782150ac46c407b504cc5742db08bb57f0784bfc9cc2f926361d1264b10e858ace5af252863888e6f8e6e04058b130c14e2f158e04f977025724dbd753c9680a315421deb8dc3e94106fe3096f7c43d100f83cfe613e7947eff42764f68bc9f8c76d1fcb2c94fea7f97f01a851ea089fae81c0fdb1c078f3b26a0c636381acf7f740f546fc6c0a1365fe6c6e5550f71474672c3337144867c326298885721cc721cf13819054c0e7fcb634c7132f14c9a932052a38853bb71d6ed838bf8bdd02240d42886412f77bd7ada5a3b4e1ca41f6321a0eb53c5502ac465626784fc598fc2355434a872d0d79762f962f4cbfcbe4c3c8c829a2a75adfccf47e3b62557ae4fdd1e6a4fd94e918287183a34d23225a5fb748348eb1cebde1847a5cb40070008bcae6a238c4f7d558fc3742c99a469e249a6f567fa7cea65323694e4c0280cddaf2df8daa1492ec1e6037a3ecd305d908d504959a0e0079d1686f511179f6dc9d926a52cdeeb60635c4ffbd9ebb874089fdb65613a35fba2c1f80c5e6c9c83017412bab94c66d33df3089ad062b3864bf870885cd39b0fcfd355945988f22807640d177b2904ea089f3dc172e0e5802f5e4b41eed4e945392444d6e180735643211a64c3bfb00142c0c24453be70085f9528ee4458df72dc76225d4c9b12136100cbfb9a1f5cb6b492d6e6aed008f0ddd5fdafeb1fd9a0e77ce08c370483156996c4a04572c917beb8bd004ea974388886dcd850da8ef4cf58b5b21b9801e01cbaba4f97814e642d31f79333f1430aa13c0cff97f3d9f22125f5407f918d3034769e7e21e59b2c9e6b3276b86da59be020701cdaeb4a7ee5dc82213c782923512f0e054922bc727df923ef07ff0b1d760a64a88e49e5082a0c9e2111c5d61b3f0e95a3aa19f2045e2087468ddde3b8ec0de3ed823696748f31ca5e15b6459eff9cd09730670a1fb340f6df9b70b0275b83d085f695001150fea4e36532c23c2faf817458bf10da7f3520fd5640199e8640bd5a10bfc8a079e78ed2662052de2e13a09dc44ae320436e56577d44d82edbe6a62e90c0021703642282fe10531613bb80ded8a189d88b14bf82034d6a35d79f8d3eecc0917e501dddfbe9a9bf329cdb06a219707c9631ea631667a5cee141a80d5de7dd24d3c0aa28af08024ce4c692d04686d4d03e78944256ce08cad7c58f49cbed73a1a3284a96dcde2b0e29818320054878f0fc5ce266fbe4228c265d7b241f72b93ce6977169e3afffe5b11ae7eae0aee3c5797be003fa6855c3f07d107952f85c307dfdb89e39600cb63b4de8c1736ca982d1c6c84d6ffe5f99418106a02bb5f7f878d95249d36716f6c80aba17251755bb30aeee7d61976636933d1e35dca746172fff28d9fa61bbe55939967ac5d719a17892f0963284a1a41030000cd78cd7fcce8a1ab36dd6b6dfb4baaf0cdf5d9b9d247535c1d50d62e6a20e74c5e50337044ef94836b8f6b214895300ae03666db80eb01a12260fda808b32d4d259d547be71923e6a331a0fd34baf34d037e7549347d4efcd37a84e78d4844ca574a52900fca06f394e2270db2f8958bc1dedc99da836510c15dc6e1ecb6ede06c78aad1b4b27269c45726d992f59988698c2f96b002366f9fa34ec53cfa3620a7b06153b01245e3ebbb7963ccddc2b423988f997b470da14c8dc5decf4916fa5960e660d75b6fbc341217f188baf6bb6fdebada72770e6c16fb25b7285b5924a783ad361f1d401376f17d2ca88c552a522ea8f9f004187ac430eb6d5163565cf065f909ba5b2223fdf6a1913e5ce74794dda7aa98b5ada8b94c34b94f31a98f55250463b46af937d1549ff5741e81ce31d61dcb760cc9e45b06066443caae518d329d8a27c9ff6020b76fd2ef79ccdbf8159b81c0316273de6c0c5c5b7b029ae5fd8fb9b226313e50ea9a37e0a5262ca9cb60cc84f3c12f2a282db000297b1301eb6656cdcdbbece2eca7dd989be8ab6057f4c6e325bfc8210c60b497a2d114ac6d492453c4fd9e0c246fe854e6ae7128c0ffe8e3c941bf82ffce7054065cd0a37d9a0deda01e1ebf45097c1c9916636d62fee87f022cfac2a7bf66434264cc1ec08e02c06f360593a390b691aa04beaa4c9a335c611d22a366984bf703e48d553550e7598440868b14facbe285c62d426c7ea9073da7265c2355d4ae021db46d12acdbac932c0429898663adb52fc25360a3a4d292589765a781f6d9c124600d0fe4a9995eeebc86deb371bf38ba27b733a71d4ccdb27c3e083748e89c296d35af0f679c2575e957f9da005cab534c1ae672f287a18bda37103f871fce91dde6eb15a8ee2708c0875b102c63342bd7ed0198484a648689d5222a4150337716c2c39f1d6af87673abd5614e79ee389e3c3a367f9c97c2c6a96b740114263760f0b77b1a43aff905a8816c7a1eb05fac6e585e8abb1e3f47432f883c48f514652fe6f8d18d0b5e1ae07f90ce7b421e6e6a1f57aee02714d6a8ef187f4bc267a0e8383962430e01aa2f6c4b48e86e5789e304cd4b00868c39453b062a4fd711e43059d588f1475facc9708d182e91bb0c94b9c34fbf35931f4561154c7c5131c0d38c69bf270a6094e43c81202bc66129e3b778c7d6b62cbdd39d5e1628ad758f298c2d7f8bffd755ff0b44f5b5e2862e6a8169fa61bf94fcd5ce4983baa78b2b9a8b69f98f8c2e84fb6cc090f66cfb1f1a7ad78306ebfdb329fc0e89a36d921367f2ad139d1361c0ae31bce44c60a8ed31be8753589bd099fd7c33e59bf4b9f6fd8dfa9bdf86d7310be66236140e1f837b387ea7882155b347caf16db01b218c3eff556f5c5ee9dd7cbed2b1d5f72b87d787667a93340bb3f579e9e638ae3af7bd222ab8d268f296e461a70665d0676aeafd760c00ee86c1a1701aeed393b842f0022523239002ab8219b04730ce76814de473cf0ee3e98927d36e031ae141fb74bec187125eb287d953d55767ed20a61b96c1822253ecad5c77c9bf0ec7386b5422107c8d2539e9fbfd084e99b1c202b26c285ce92328db0a8daa49c0961d9de31edc1dae026de93dd94e1bc4d63cdd1a036bac958b4146f992cbf9a18196a74439c8fca3d98ee68e73290d60f9a0ec155c59f311a7a4955287f080879e5d0b0171e1d0e625d8c110f89f07272957351ca80120048b9790a89977d8cfd1f3d0440e414fbc4d722a587aa991f24e4d7402bde93e0124a3723868d99cd1334608b223c8f71f27fe71c4fd6ce9bbf922fa631d2a08a7cc8a846679dfc023ae3902d53a21fa36b47a6721fb070ce1516b690971875d25837e2eb88ae39e464cbf5268b4247d06a2f19be313b50573f8efca8be4872a3302133e80b01c894865905c7eb919dcc38f531f0bb0fce63bc689d993ec5fc0020ea0377f9ab5ba116c60ca3454491863c9da34125f7d987c99fa1b58e0e5a823e3ccacc8350efd99dc24fc28f92acf5327b91068c0d29edf3d59803ea5d8a4c84b9e45fda2b3498792a49503dc0c5616124a6b42067d6234ffc34a1c2c3c5e00ead1e615c5be5197b399390f16353afcb6c73cbea870c482b4ef883d9bdfdc30c169b25b15a447a9b8006930de658767b2fe7323e7374e4fc1d4ed71257114a12dfa24abcadd21b54801239b7d4874acf0ecd9604485f59b41e94faf8bcc9fe4829fc48835b962032d37ef5ad7c411a25d19cd2fbe9a4e833500e21179d6635fb541f59bbb658507511d5d7f19bcda8c30ff465938975bcbe5ac63fbae2fbe9f90e63f99ac93d3c67e939e965170e0990aff6a5078de19c3143830eadf83f3405ad6d1be053e174cf7216d7a1865a218036ec7486310434314450020603635317c3396f2f42a60b6acc25f9f0a27620bd75acc772f4966f98aa016c5721903be0ab44a417455e5385c13004a311d41c7baeb35fe389b45bb2398180e46e0b649935383ae59d04654be016e83f892319c089bff2fc7ccf7ae07db45a3d0ecb649acb4e30dd93e7e1a6eec9c0b132287d287b44664fcffe0fccfd91f88c78e22ecf6a3b8898394a2d8278f4ad5c3130bd8ccaef904a619982237f0a6ae5dfdb3b3eade8e57a81c80d32ebdfae54b2347b4e65627bea658ce135a9e5567e76e81d38ee30528a39a418c2f431a555f68c1f80d8081319fab522955c8862eef978ceeab24ea09c3031c74d116aa669e58c13ddbba1812f8e1895cc298c2e798afc1f39bae23d807c6e5418e2c48f6c53eecd61f777a7f7315771e3712bcd14c5a06656cb3df6630b8732c0d9d1c775837000892627271c482d6930e0fc291743b43d85ccdc5f496e5ea258ea5f3aee05a10b6f81effd6ec66c158d1574e21a3498eb327b42ff8170a9a39f0c7f54a8dda3c6a09eaa245c45242ddada0bdb7b780989db847bc22b3c591a753acc5bc9fafd4dc1bb5a94db69eb53ed7d2c3a59afc76fceae4963c496f63f1093bdec3d43f5f2990eab7046ca2dda6e2efb32943df8b0db2ef02cad12d262df0d2cc8066c00361933c6c4bc0159b417aaca1cb893060580a99a072231175be3b3103adf3d1c7fa6ff61d4600e57c436dbfbf26a6c90bd754389484fe61e3ffcdc8f2f79eeb1d39b37b367f7d7f02b6c960a14029c86f307b214f6364d195058fffc09715453f5493973df7ccde6ff67995601dfe42d669c3421391a824e0d3617c4ad00fa4373feebc7a683cf13d191e7ffd3fa002beef5e457713f965704342f914ec5d0aa6d7e1457968aad4e06ca58ce6b5dd3624e596ecbe00fa231a246a04c44e44696582e63308ee2512ef6fd53a48b8ffbd23332c8516329e0b50b798c6f27c83d431ba7271300fa353fa9cf27d8812c642a1637941d1613df2efec20a7565a798dd5c438c9d226fdcf00c497d2450f326ecb56803f8dc446d246b10f0a99a25d53db96032f8d2391969e90363f4226a937a4e3cdbe89d8d67964ffac82c424810a2234e1e37ecb62797e2697655eaaf63ecdf8bf8b403dfffb4e91deab876c507e01bc21f3a5d4e30a570550ad94c4f91c16a763e988b6f3ad4fc2466ad53e96b3f51a297037dd0037f730a2601d1c538334aac80a31f19af2de9aec7d95caf615e958782f8bfb1d60ff06ed6298e8c0af84977e6d86c08ab60564d813866e54d32d87ae7306b01d3bad7535b6bbbeaeb3827c29302608b45aedf5ad5da2db8abc54fc96b4ce58b846da0bd417060461201b616beb91ad582ace4d456ed30173ec8ecc7a2b00c6503c9a3809fca2e52be36ce404b2a35419863739b25c7700cbe57065b7a622d61fa1f1587ed18a384862a989b12f91d8b000f06cc9fce8e41635377b8178262c5118c9e3b83cd5dc294b718b687aec3bd1ff4f584d5eae450dfecbaa3eaf70793734e49fef5b0ffc1d96ee7f5c3710fee4928ec58785e43f9699977167889da456dd676bf3e20e67ab8bb9a0f51959dc9eee8716d9c798faac183290387fb6462654046074327a976d772dd8f1dcd87025e5f4cd4c12908a099d9570108b63c3c237ee7825e1b5b7b7fd7cf7f928c978899cef815bef4111aa39b310fb71efb19fe9973dd380e7bc0ae013c7c1d9313c128a34f240232080e7db341d5cb74296decb5f278c22309e532b0bfee88720d69164dbf059acbfeb69af7d05a7476d161e1dcfb70f1e1c82598fcb4bc004e13bdf07053b7df4315c261a6ae279e2a5eab5a9b10dc1bde74605d42a085be97dccbbcef19bff052fbdfd9ba2067bcf81d284b4f6df71d5c31f5827fa334f36366c2f7fe0f9e82e72bce1b18a7ad8a68c8a22a676fd49426ae9b5a55b80ff547757bf27730ac5ddc63b36e4b37c09bd135bbca9a287c4e51bd32935d63c98263d712103f99e60fafc9f73d8981ea29f962d978da87e1ff345d8c508414f96cd5d024ca5f3613a0853df64a5abf761fa0380a260c0c851e2e3d4bbc7464ce6819b2061549e383c584714409cfe4cba4bf0544effff1a3fdbdbf2cdaa50e8ed6343eee7e8bafa8a5dd2c1a202ba1a49d2644691798d70c22a6c3a1b7790aeb606d7aa388e3f74fc9b3e3b581269b728325e3534dabd3a8f3e9f69aaa03118f1b3547beef2651f4eea1f126162a7e9ac7fde15b1b8fd86faa91b3625e2c9f5b84e99e0f97c4c7c9f9a0918dac8a3f39f04b8babac7c2b23370cb1138c2f18c44e9a6c7965fc509239c70ef989f1b96a2f063adedcbe7a48a08b0d09aa2a07d8700af07f62d02b7deeca6130ca72be5d2f74fe61b85bb29998c3eb3f1eade936f77d4eb790b5ba4fa0e9088510ff384f19b0e40e9d0601e60fb33fbb656878a207732ed1a586775650c9271f3dfe20d49e973616e27c84063f3d10abd4cd43927f1bdb5fb19a7475ccbfa16b88b38e90d06f52fd92928d4ac1b59e942d128c1c0d5453415f80f620d0427863963b7cf2d7b7fcd869eb7c19a9ffd7025922dfd7edfe87cc45cf56b7c12f244832b1f9e22478064741be81cd8336f2e425cd1a75464d293e2ad5f3538c20d9de3f98a50b0d46c3e04e789bd99a659bdc5507c5783b5e29e4033ab3df2ffbc4cd3b802f224a2c67163b0df9e321a5276af08c8e6e351d0bff5aa92599417804de73853d1a89483fe62c077fb936302a3386050fa55667cd6840554b2c3e80840bceb32dc4f3452bc43ddb0b947bbe60432d23206d03af083b9d58a29c9e1f8a65f7a9d11c9551038bec17ad939478fa75f0e62ec058642d34ef1d8b78b1602b3dee5f2a01197c8cbb4c7d110fe47361fa1d7d9712db773f520d13215f9dc4625f6865e7a1bd3d4713fd32dae261fccc6234293c8f2a778222ad0968d309039900b404a8394654d6fb32d77a16f70ab17608ac0ed1ee91d16736e1d7cdfe15bf8bd58f69264c8d0d15f38473bb3969e2900fcaa5456eb6527972a573805753f5c1fa820066fdb0ffafc5dd1b3bed1992ead5df50fca33e9306a90e3e92ceba17d01d016fef4e3f24de60e949b4a2b22b4bb05a99114adb2b86133aa07e09357815f8403add06d552792be914328e3926060944b78295d7b552f35a5cf8cca4411f95d09c0480c051bf04e41e624a569173320fe65c474b06e661b17a010e6bc39800df00d91c77133478219dcd9ada3f7656579749501fa56f9729d9f2c98fb5c01b620aec4d5ffbd812960ccff3479a6b80487b368472fdc8e5ebee2b5d3299170858e7d6afc1abf48245f76d93fd07032ee1c731974ffb11d6409f8a53885c0f70d9b1700ec2120038376fd903a3f6ffa3652eb090ce906e89426563c0ee095f36eb9a3fe8520dd18af1791410088d3c801b5b49c1fc3e9bd57f06999d44b8da96f55e553311bc5d2f30c44174032576b7a351e13c0e5b4355f40052bc386800d4db329f13384df2a0ef3792df5136d684707846168bb3ee0a212cad05af66ca26b7f39b65066338d0de59d8c3014e4e0cac86538d7328f40fd02ff28fb129e3d72758413ab78d57f75f074030a7c04e1cdb921e3e8618afef1fec37540617a7a222d16c3e0ab575ed30c0df2b54faef5afc7c270ac54b9f1d559a58ec2804be0bf12fd939232d9f84145e17f30efe2fd2d0a279387f7a26b96a53446e3d856e71014702c2253c53b969cac217584cdc36455f6da3ec77ab17566a564a58851bb61609805564fada662d2ca12f5508f1aaa348044ebd6897c999527c37fc77d5e85f660655a547b0d32fed6ef69f3f3804d304b129dcdb253726a6286c5954761db17f9b0778c3d4248a8a1834cfe8f59b42e4467cba83a8b6ef36083047ed01589ecc08cc48b0c0f2ba49229561b42b47968d23cd4f40d6097c8fb1dc0ac606b67033d544ac22c1eb0df7b020b2f01225151f66b95a7e16560cf3a6aaaf9494decc2d034016fa71831667aa3a4dc1528f8da03892234b63f5385d511aa9ed235b9880f1ef7fb148c8ac4d504ee59410421c827d28b7d47b0aef2114016b5154cbb44c42ac5d765b82234f88c34fd69b77a790c3a76e0a653219756db637af69d31fb7071c00a2fe1167b7b15ebb656d014c74c853010ddedc2f5cf88eb06630ad32e7e454b76dc95c84c62b9a4df2a3a1bc412026f9438f052a3f82bb48f41254146f36729bb134adbb59673ea26ca8a2bb6f6154fd2c04217c5f87f9b5562db2115f185a2c55f0431dbbdd47ef993e1d2bf1114dda064769c81461982195c07739f75d91f08b399fe7712f092d2e0fa9859ec42f1b23cabca214cabb7d167a24893f343c3b7cfe647dc13f80db8d07e90ae0a56f6104d127ff73cede364b7036feb58cf0bccdc629c122d674fd549e4dbf69103620be857c9d0a9eaa6f15ad0f20cc8b9c736971f77f0688a46f57f893eb27fc4761d7771f14ec227bcdbcf8a77c050f1c41741653cb3b2e5f0415a1f45b0029dd3441dc50c00a2f11a7296cfb870a00e266ec7f05eea091d1509015d87044243e78f254cfc7e8e4c459f0821cab30bb30bfeebb586537f7633a3d7f2eee8c10b5cb2855f4b3dceabe2b72307e995aa60807a1a1347a2c267fba3958e1c2facff4c02e3ba6618224fc14462e04556067d2c0ab7a6a6c80718325d8cdb0286317d86f0aab950bba649ab0c981e8a5917a3629e6abecab6a54fb29e2ca7a7fa9821c2f500eb18b370877e3e86030cb8ba1b9c4364b6df0c5e05884ecbe72ed0033fefdc9fd4c8e8462c71be43d7bd3782c58bd4fde7146fc9b57ff781a7478727032b9ac4bfe7d4f03fb48fd9723f06a15ff075f434687ef921ec22c3ce14fdd2c334c429297d30a060b5a52e8b628346a10089022d000a5eb4821cd63efb0a5c7c8ae575b5f6ebb21ab096728ecfe476c722e2cc8048788cbef459288f62b122293563def5a48159d8c2c7407a430fd500459858a268d606aae9948a670b2fc69fa5384644b7130d7d29680d85c3abd844d3c6eda7a61b0e7e36ff77981a71ca448d8042dca07269f75c03bd07b553ddc125766658ab5787b812557e9e92ab29fe739a92ce895008550e2eb4d542408286a38953d9e9640d100a4b9fbc7183f8ac69a13b82747671c8cfaa247be7d5eb9a6a8846b00876a30799938a3bbcd001312679a57aade60878209c7facd4d1b7c451aeec681be23ecd6ecbe6d718aae6e7b5b1359cbfefb5fe6611e32b743ee02d4fc83c0b972683b31e4a0a008e840efcf971deb3f6f4d3ee416d043b234e810bc790f06aac0f666091810fa5bad3b5cc26a12f69504cd2b0495a396655e2a0524c0c2a31a0ddca087b475156d334d1571ab9d148096772f9a825a10d12b39c91c345ec4e0e7a1246da6a5b3d7812876629f67d82232d985279b6786a49f440cf9f248d68ed7a3aa450cdaaf5081fe1c85ff6b34182727cad524d0b308ab42b3c82947ca5cb7dd5102c3f3e7d3d564978107acd69464efa2eec06432f1d1696acc018ebe3a998bfcc4c309a3b60519fe021477ab832d1a1ebf60f7115cefc0d5186031d8af3cf842679a6ecda8513ba796940d02e0aff7f0cb467394077b27afbe5cce62f89ee00d17d830707a73b5994f886e8201e6c4833475202825257834cddce7eb8a039bfcb5e7f4de675bafbbc8fe706ad96e799ba926169ab954ee56ffcf0cae727395eb8fa503d3494e06528ac4455bba0677103f9ad9b276f0c5e673060b5b2f57181daafe70363425d05198b27dacc94c05482bb36389a3d655f09fa898838f28a75b21d181175207fce18ccd230ded73c4c22eeb53873530a1bb9b823f52842b176defc63f947e8a9b1509a1bf97f7b43be59b3794de54df328cb8e18ddabab0dac7ae4e356624a5a76462854f852dca533f05c75ee6f1db67278e5fad81d3cf440e09d44e3008a2b1bb8eb17735487a283a092a7f1cd49b2759fd9301fbc22b14e1b5cbec39d42f7c979837ad92d4929ab30ba00972080a971220b43c29b451925939fcb0f800398f09b0685367a26eb35d16f430fe6ff56c1c08a1341ba8bd2a262fb538b2c0f835ca56573b4749a1bfe9c27cfb03e81845ad53b0cdd6e0b03b194496d56d85fd38b235733452646816bd85dd6f0348313712f02e63aa26b551a9156d4699d5f504acdea864159d92fbebcb5f4d394d6510ff7736fe3a0ff8ce839297abf773ae2e97ba5c309a1c590d19ae226eb04840c794a2f526c902e0fb384e68d2b58d3f9807b1ae707d642e8610e44ad5fecdc0c23fc67656032bdf4322e2c7fa60c68b37c741cabfdd1c615fa32da665169b89e6dd1fde7eba3cc1a43ec0dd9b1409aa372607ade22d10622b805290022e1ae103b5620888963058cf5f468506ae082daa5fa2619a5f88e2d463a4a0dd8f72c6bca8418a8e25b294e3177d379ee7bce327fc611bd92223db96a0d16926812f167593eb76ecff9e147cb4c72be9f62bc0d11aa5d6db5328a47debfc394424d68dfca9466807017586aed50d249245b82117204a9101599046aae04f61c41bec15fbb559f5b0531150069c6e0e9087624679164d752e991cc49c7ccf375747e9b5d125aa6092d263f59bb5a172397b6f2bc75c88b031401b584c9b3e9b9588380d8ad863963fe83369e81eac3c51cc8bdaf8bb549afbeb530ff6e30f43937f6f0f88b50484bba0aa45f76333ec9a67c5da54f4b5685ddf70b5587bbc060cfb6dffb8209280ff492bfdd0e4364c7cc17d35d5b0b30918f57ff3eb6063ec67c30b8415f2fc0a4e0a12b59db2e744623fd70133e2036520ad740c46317af99422eb751a345c0a15841c0bd81130b6e9e4f0502c51af180dd92f3def9e4efd809f37149b9dd965386e738187b26b507b4c75d8f0c89f6bbe6b63e597be1c6b545d9f699ac8239b9fa66f4316d23996a0f90bdf40acf282ebb50a5cd64a3fb09dcfe33d67ae1abd55ff0acd44061c9faf154c6dfb9a08a12525d60bd5e99d9729e29275af398a1c380e4b37153cb035260a1588fd287183dd99e5dd694b62ce3b73d6cb5145c9c38af4a2062015df40d41c931d18984b5e179d5e05b0ab7b792c8ccc56fcf8975d47fdb016865ddadeb73f0a78368525c3b5436dca73e34a16a7cfb08f7e3f9a58682204e2fe12d609edf654790a6d0508d52c8261708a6b20981fbad5688352e1fb941ced7b7752ab989abb8cac3c01ff13d4d85ff08d69c2ab7a265fffe4f68a28584b52c121aba4e438dc9182e957b22b2a01b0d4a515cd7b18524e4d362a19041c080a3f724a89ed099c7fcb4233b1252419eb543f905578caa7ba7109f72fc79fc97746e6b131ffae2fb7edec4e6f2f032a9f13f0ff03ce0fa4c554628e44d324dee0b8133f115ed67b53c91bd9441ac089681d2f82bbd933e1ebf79b7db3467554f501997f55545fad759b6a2e8675b826add5a7f3ebe08c582a5a6c179ea63fc0f1c4e04239e1c9a63a1a8eb8e2d174508e1a646dee15e88bd6c0dd47f8505118ee609d1622453d71ad28a355e90ea0cf77af5522e9d2270ebd2a57b2a9b5ee5129dfb0ed3d35568cb4016ec04a72749e2180cbf8088691c507409521f4b807fb5f668dd05baba3d7d0d55382b6a06529baad0217a20842eb0d3a21b9dd5d553163be4897b537fe1eb5fcc06652152bb868c5882ea69679585126b84cb80a5083a67485e9cd00fef54a1243d37889cd170a2c98d0153134d0ea1ca28991236273d98138e342b11630f5d3e69ab9d273a46477033b56e43fc12d0df810a6aa4388d9ec5180c2efecccc6a7f30baecc879abe77a6aa11662a3601b8be050ebed0c51cb997abeff28ed71b79f326f12d30b3af9e3c567fb20e670c57070da6e23871e6dd433e421f7e48f7011721fa499e2b26746afcd86c2b96955d04cfb7ef1e5c7a808ef7e4441d5cfdea9b8fe4f4d1057cced7bd7677ce7afe55484f596bfb769b1b1b1e8954f4485984aa8f216d4a32180e09edd9b5747c6ee6a0a2b3645488d0628bae1e85992b8b212aeb10ebf57a816881abba12326e20c73442c60f4ad11a87a30ad877ab6c9d49398b33b3f1a1f701f9a072ab80a8e644ac8093db60955c14c8588bb7c9f5531069f45852b80e488ba26865d8b9e81ff273eabbe96550ee19307e029e9916e1eae18e83efdc372ec02e1b068aef2d2db958703b34574f315671fa6fa131cf398e0d86658f63fe473e90264d015bc39c02930020188c4b43f38d50b3153520adc9c3ccc3748e70d85f6266f498737f64c5f260aa4fc96bdb2698a3963806987e7ad9f85e5531aa6784b33bbb9f5690d1229d2b8bfcd2cb6fc05f7038685e7cbfb2f65a425864c5e4c9b185ff2953e121581bfc75337b29018ffcf674f2b70cdac56b6dc59a997987dc97bb5cba804dcabceb50c9f39e56bfece38b96bc93ad1f7cfbb821bbf5d94c107039e3af266745c6378b527d40248391c9d057c9357b9550f5e27ead3329f752256d8eb66c64b5f55b2932ffdb3916fe64976e0680560f9979e8d9ba1cffe5018fd9e1eac0e92973ae2c0f9e65792ebdaf22eb60b6db01902f750d3f3e6db9f2a5b75ec7a7a6c6f19a39f72c66c6f8a7aace25a95b987ff32af68a7b9109fc61b4149c493e22df1b9a23f70bbd4327033eb71d4335cda23daca9ba53249021728a99b0a24e14846d27a52dff5a22c4995d407a15d4c197fc48f1b30e66688c33a2d503893388ccf9f4dee3eaf2f876833adc6517b671065cbdfffe34ae6e6d415796e0141b771128937f9747e57270d8f5f96d334bc0770223e8b4f01723f7b736323a19b958821055c0e45262df0c4e16fcda1205b239a593c31ae30f90b4bb89194241d670b1113b33fd256f9e80f87d47cb1e33613a9a4306894c1da69ccc967a2f31d24322228a9fce73e72610665e4601f743e8cb4f81ef9f12206354d165e072fbd0cefcccb3d02d865568e31c6db298379b83fb714712fb55944faf718356d03f2d07efe18b3cbf67567be0457c8c087898b6f7c48fa0bf4605517833cd33382720daa74ab94b6c916166f5c099f16595d8337fead929439df2eb9ff8ee420f7e8168746cd61f8ab912eaf7ca9f93af1f0db255c790812dd1515cb82c6abd90d9aaca145452279eb32b9697e85a431defcacd75905362b465839f31d01302b346087265a7822105457ac37cd13c6157885a8d06f372642ab9cf3574b8c452b6ffb1d791bfd8c300cbd4182803dcc621790c053b60e7ff39fc4cdeca3bc9fbc0204ac6eb66eb4076bdf52f3998b2d3ee20f198523853cf0c3d11677538003ab1cea678f611c4059b4110b7220a7c12ce416c3b847d3c21a934069beedb0cff584b6c8637b0bbf365e79c578ffc8bfb23b5d279046693d1bd5023c03d561b7ac47e240c42181088463080eefe60ceba0f43fe7a25d95ef98908941a26b71c9ca47c8ba735edc2b81766e083c8cc1a6f3755b325d8cd4b0e887103a45e39f8036ee5029d360a2e8769153a58012f367b3389834009d0d85e19c05604efc3ea927a7e0959055230266de66580f3e4036561993174ab666e476192280667b61b073ef5a4d548ea66ece1f45d7efc9c447e8a664ce7ae8ca4c0c14ba14385d5ff47e8b7535be8086cd20e79650bf1e05d89081f58df3dd9174ce2fb60210a88958318fdd155e458f00c98864b0b4d1b50a6cba8ac50d93e8fc286a5ff34d148c3517adc551a1a54d1c0178f1e1ce569886410e2795b5cf2d918b40779271d899132e8a82ec741fbc4c1a3b60cbe790d7a139681f7b61305f02b52115fa6686e519a5b0f9d09670df21ebdbd30f2beda06e97974fd6375727ef70b2f69823cfd3064d8fb032368007d5994174fb1aa78e1b2ecdf5a5811ade6c8002ad28e2ef66f1be49fcbbc2b4e8e7a3cf64341a36dc6a99e0337f64260a371b1fa4f461931aba48825f5ef6a4369e45b5d058874ebb56710a948b3abcc30b304657d335c19bc8b013dbef494b13e50bdef147cdaf086c66f5f194ef98663e1071a9f2105f3d33a3fa9b5bd172e212edfcd68c27b7f6a49bf79b3ee5d63bfa7a686964d29da62d94a2c072cbe5b9b9d14f3d795f47f013f191d0cf6f64710ce6f4f76f564362c4105247b250d14175e36c0103d702d827902591dda583c5a09bd47b1e82f4767b037a81e4b6dac215f8752143369c22e827a13bc3506f04d5e329a4c4c029227bb0c969bee0d9d4bb27893ff4c276e37209f3005bffcfdfd0117b341149bb3fd852293ae9c029fc2f34ba8b23f65a4053f721da178c9fa4d9301db33c820b1581c9f21427218898c288775f56a9ae30921c62d06852afe14192dcb4d16725ac2f5c93f05277b9dd11f024b1bfc4f9b3f7b72b49981a679173020de8fc462e2c0a1ddcfbcaaf8337ba94238990beed9bc3af1fd2cfbe85e39da20f51f2f93aaf9b1061315781c2792c06abbcc1824c7384fe9dc114a2a7fa27d602bd9330642536cf6abed90eab8097022cfcf777009f759894ae30de848c883dd0c767330a51933423437d4d0d9bad333a11119470dc2b5f75f4092847182387bf677365091d51781c1686887bc5f10a56ebe31b0e8f6710a7304428b7b4b24bc1d74289a12e46524be62b455d021478f41608974dd3ffa98dc70a78afaf766902df03b8672a9a744b030cc5baf48dc3ee8f13c11ddba49142876327f0d1a73cd612b84c9a920a6563b6880e2718f63776afba20e7ec00ef66ed0673025ad705dc8a447ff3bd4314024541e04bc732eca488790124131ccd941550259aca34b86d203027b91d66464c3a11d0bb6fead76c23c17a779680370b96898d830f7ae3316408e969821b6c834c08ef6583f7748bd01a570903d6357bbd46019b02c2c2dad5f84a2005020e0eca237bd5308bad6c5663b35a18cfe173edf1e6e6cd0d2c342be68c7b8f238e0eede3ac21df514681fa98c558b4ddd7d5c7346832d9a18bc2854d9546fc675f2cf08fa3989805353f781748155af3e9c03d4731207294d92507fe6ad10428381293a7ae29767272a24e8f091ad66d21b7a24f3332ad418a43ccf567b8012f5179307fe2fc529072f407eb565f216e535adb18d44b1edf09907aa11463069617639ce300e90be9985c5c529c4b10c56b788a78f416b08028f8464b08c6deb79495a7c2ebf598a9785be9f0e0635eced2cdc5b5f00a67060124393c530bb3c9b6160c395c6751d089f50f2b104db6f366f05f7754fe5c18cc62614dc17fb7edb63c272abbc0f27ea022f1bfc0a156273af92a5be388bfc1b0ed93191b4980aaa4f103837c5723ef42d15d7a64de71621dc0b2880455a22bf2c7c2d4472f6ab200295e64ae15879bcbdb0375f10221c428e1b328dfedb224c7ee6c6ad02865615b8d36ae949064c730dbc82303f3610419c1c4f7e9e6c6bd8a1ce5b384a39e594b4d79e3f31dbb0c20c513a9a3458d0f99aa76456e93da3d00a47783188f8a744da41362dce573783a7a58010baa92594a32779db3ed1d5a3e83b8ef50461d8a3c425ee6d55e32789d0e52ad7f5c2225307d7772ca9067667ef13f0b74d3d62e26404c71dcd37b748a97c4a341b9c3c7ab751536dab0cfaf99f2dbb2ecebce4235e3504f525d075e1ad253e789a502781db6301c200bdb0db819193bbe4e43652abbaa31df29b622c87a4091761a6b00bee7308895bd8788953e38f02f3703db93259ae179b348f32dfd426a1a4274de955c23c451aa8bfad4ddef21e37a028b2dfbe4d562f14ee05b3dc70d2b1f15bab5cbd97bfeee7c3380140e806011bd74c53ab3791eea4488ec382dbaf35da744d70c1ee8d1938d0b38561e258c19b11ad2932de8fd36631a6a8ac1553bc9461eaa914fe5b0d9b2521423d9c41a15004f59148ca90dbb9e31ed3a7463d0b2f5c44b07ab3abbe8f53e8ed028b521703c4f42654b7b9d09b867ddfef374574ffbf9b68a61e189417b0722e937d609a17eb0d59e0c1267124cc86e622d1aeb8a6c1476adc3d5cc060083513c73c042df5ed72de8122cd045733015b7a5afa5538f3f9f149b059cca1f31dbd6bf34c91584521fb47f03d8ee4569989b9046917445d4435b638c1d9a34353cdbff7ec032b983d27cf2a67faeae531ad696a3b81d9b3aa1dc7da339c3e3646e6b257e0596c51c38d7ef40f12f5c7f8df09455df0f697ae56079575e332dbf71a63156a65460aa7ed156e8a13a45c381063b4daa50f699dcf768362534926bf1bb28b7d2714eacc1078946a3a072b41a5464089f9427f251a09448ad4612e36a4e60ca9186330ee5e96abc5f3b5a8418458e74a92e5b466008d37270749661103a4c479071d136f152c78262d5d1857501586c9f662e6d94e889723361cb399d8090871204279487706c813d9dfd1c1321bcc7e250e08006e11dcd9390e67490e1f5bc38031b49bc81a7ebcb0f202912b390666c526e27bed9bee87c62ffe995127587738630187dd39a272f744947e8ebecb2956033d3eca86d02599db87c97ceee04aba3851c6f55dd972e138fcf24e4683b707845786898998f5897c25762f639762ebad138037c4c8dd339ab93d998770ff89e4019795871792178c14e62a55350edee6ac45b89919ee34125eb57c0c350a05b85b00ec651c260e836ef7e9f3a00ba5794ceffc01eb00442956f0811679433cf5e937a6b87668155c5de388182ced0578ec22b1f4d0c57e32c82f898ac9451e5d52bd69271685f6574ebcae20dd0043f895f5a43e3a77a81ed0387430670f368dfd57ba4c38896498e8da20413cae9b50aabfc3a2d0f8a2892b9a752c200249ec6cad44d6226dc21e955a16824b928a7440a682fb7003bb4c28cb0baf3bc6df2df392a9e331f18086d7c87c96bde962a0d668ea1e24259e5d2815708149872f8b901442a06de0613860942a5af508a78877fd0174bb3e0e0603dfeb9bac382970f0ff33dd40265559cd141a70bc1fa382279ec7a16fe1ea56f2e32f0b8266247c4464566e015f41a523fa732341b0f6071425053894aeb136fbd5df217b00b69f4c785c15083733b86e88820dddee5efde37c44f44db39fa0788766d34e5c272c08dc918fad14f6394601e57d30171ceaccdd724781caf6250a94788c5d6d432ae3a01dfa5a67b2b7bc8437fcabc4c83cc496cf23bfddb109356e780fb73719bb27c1c5c3b4b8f10a27890f8c573dd1d764c47454296527a905c1e3856105aed509d54350cdcd71927118ae4687c11de3b2fde872ed950f5db815878713b1f4a0db674f50bfabb9a1325dba7f45e2a9a62c8b2e546d14f29d2cb1ddbfb8a364a143ebdc83509f07e7fc6c46c750b481c8ba21c5ea0310f12cb745532c52c1ccb733f0d4b0ff58c3014a476fc21b10b1fea15501a45611ccd5b05d308b37ef56ad07ab16305ae328d8df11ff8d184f5b4b310e9916716f32cac001e9f4d5413801c286f048b6528acb06e5de9fb8ab2e0d04779c5e9afd1ece08e095bb83ddf185423f575358d2460cc106ad4fb4e9bc47ddd97a9ec912ce02d4e1840d0d2a7b9f4ff3932001aaf09fc6de749fffa5779155bc60677a8d27a4ee2cf826141db2b358a631cff50e4bd84adc57ec57bcc5c027c0277e5e790faabfa5c38f18bc061ad17018a647884b61274c6c3bd7a0ef710f20fa25eadfc667070945880666197c7a948da12806ad8eea530c78807c11985c59b6b40a27b347d95c5569dfe7eee1e0f6399bef954f8b19cd8b5222df9805f828abdfb58e14bbfbae754affafbfaa19347635c9b1090f8e1dfbd3b05e43c5ef7f8de1a0f090a6e4a4ad864dab445cb7fdffd60366b8e6020ec654018459315e598d9b44e88af40e0977721ded26e6362ae875e77a97679973396544823db685766189c9f4052b98811bb55c2b17f8aa9b689b83449f8852a312bef57ba2783ec913f07529d590467b8e2450087c3c04730d2a1716258823ddcd024f01e0fcd2823178029184f91403b4ce4fb1d95b4245559c19cd4260c823c02e2cac6ec880a29c126ba5d07912e70b2d5686b636edc77b033d3e1dbb0d18b6b39cf8ef840d45fe02d6ba07fe8e86b54dedf9be37ecdb90a284b2883b5c35a23f5fc148043065dcbf09f8717b1c2317e6f0b5b2453113e52adfbb922bc02442578c53e8af24355b58dd7950a2f90cbd576e05090d5e4d3186f613d7a9dd03c83534852cae045dcbea5dc8cfe202c06f06f895fba51dfc3498172d0534d058526c64b92d66de87a5238e686359863ad56e6125dacbded0455338c4fb0c52921036a45342fda74d325fe2c0f182323e2f52e979004ae52a6a16595c2712f1ee9021649929acda206de4b25247f5ee95f6434a37074a4cb9ee2f9b7322c05a9445503ffe6f4fffa67e39dc9ff5473e97daf9af331b7b3fdb3aba686fe830679d547c10d178da1931520f34acb1b8ba6c2385a92966c7b389897a774e430e06935b52790500cb426d82bba29c69ac759638d6b104959507046d26d1d0f984a83f752e9f623808d8010088f5c1bf46ce78178c921d29c3e3c573f4690ccd814ba4b49c16a57d0418e8767524ce298a09457cf339915d10903871b080ad4e965330d6383b19b2ffb0e892d553fd99d7a5f87913b3b49641323ca89a8a30a2e80ea75261ad86af7b938de44e91f3e2783b6d2c3ae46f57797825b8be1c7fc36fc61585200adcc937900862ed0b9335faecc1f89258c02d6ea0e0c0aac7216a066e19de199320b8e2cc522a00e0f2b956740353fb391d5c64b8514d1c76caa32a14c0ddf1d9bf263991b0534023f0740eb71ee123a36ff3fe2f93000f225217dd0763d715a86bd3cfc17fc87c83f441b7e112da9d5f1a53f541a3a3d6033c101fb709901625be708b2cfd2e3a68cce9522adac7fa22f927cc856e3097791ce84642b2a6b916291af4664839336c41337e5e67196fed8ce09ea8e4bb8a566ae3247521119886bf02de0295d937802c79675c3120c7cbe2f426ede71645a75471c4772e71e591c5965e4296062fabb18a607a4af4df2a577e0d9972e7e20c2456af18319a31be937b8ed6fe85aa0ef2fea8b6fe83a5f416c4ea56c0776120f3547c3ae923599605d439e83ddedcbca63712e871c87633897bc55fd42ad189177f2d2ea6c4ef10a52e5e5755b3009c0f7059482a0a926c76ee33e79436d93b4cecab9960c77fe8f395373ab45b69854afcd6b68a6a64d17f485e6da23fe99511ebcc0903f4f7d4e9f079cff3bf253a40dc0a89bdd6d13983203584f60370e09edb32aa353b4e396bec5a042fea3529048302c67742e1a398a097e5f68dd620cccc3db9d8c9a42e1dbff6f37a2e9834901b52e4ef8efd4737104d1417af0e640f0a295aa08026a872f33ab77cf0888df48f7fc905ebb301d626a31477ec38c98e655b5fb405d3fc387b20c4ada91868761af8e48213aec4ff83ec989b020f12d56bbbc5202f3a73f6b8d99485bf31e8c781da198caf6761b87f5b27ddedebd9af1a38f230be83170cb149cced79da73f043309fb5dd790f1a25bfc4ac8dd38c0f02dafbcd2a11362a162861d1d4bc0f2171c62e48af7365d840cfcef7b8e1610717fd2ed599db31b3838055b169adf668c1ed3056c5e55e16048cbf9ded4f7b84831b477140345e0715cb02ed9b521b5e4f13e702118f0914a50069dc8c7813f22366df9cc23c28c6ccfb70b166a46d11209f0752c949596e37944363bfaabcc27bf243c09571d3259839471823057aa87c214a05490c9678543ccab3eeda87c7f9c5d486e4340af90d1c38e5972c46aa542dac831b795d47047eccbae44902a23cf686c828ca72b08e2186ec28af41f97da6c0a756c5a5de2991805d557803d00d5aa98a32de1451abad76aac1bd295e6c669f90616967cbe193460df12248434cafc3f67b4d5821b1f2ed444d7d8b666e7dd98c8b9b16a411c31fc4fd2008b815a3168d2a1d1aae4a20bc09dd459222813864e9aee93063e17651551136cf2a49d7b922df88ba72c297f69125e4d68b25a87bff6580515b127db3fd303ff63b9e9488b6776c1967a0182099bfefc30e6e1a9bd1e7620f67c4bf4c914992ccc352d29fc8ad356e33681252a51253ba555fa79c379f82a4a279f915b9541a39ce26323064bb55ca755ea783de8488f3f0125d489e3176174d41ba7687c2cee5ee37733faa7b31186ed0f017d0cf030360184c6f0f22bc30e5f988533e76f2567b76f2210749aa7380c93ca7a705cf0d663e6c22c7f8505612062d271b6cf11a57cab03f0d0617f688be057b1e0175ac7bb31816b4201ed12e8a41508df193561addaac8e321b1382725a3b81bb5cef7edcec423dde2f4fa49df9de6bd3a20c05c698fccb5d593ef959e87d12dea81b6d35ddc6f50b5c66a1edab0ca024255b79264ec6e6be774fc2c3d998d4b2b6d7f4abeeac4896cde5c1eb4c6b78dc13f304307ed90cd17ba676d4f07870221dc723d1aeb3b64944153fea78364283fa01b144221980558f5ac93f81b855a3ae8736de0891a1faffcc141a4935b51cafba8af062155ccb275b22136e0224f4d196e59ec661e6a908aa14b393c06f5edf3a058614ccc148a903e27b636e6b9cd7598df62d478b06abc0c57feb17b88fb7bb257a5580c8e00296eb27c110954240dae9a961cfe2d5591b25e81e1b059330e21183e04d195a529a8dd95d73555dac82275da3f6546e116ffdf4d49f946f46dd225d5a84bc70435697416248afde844617c00c926a10aa08f72e43e2021a9e779b946a910db23e0912f35d61e3b6a5e3e996331da20763fd23ea4e1cfd3b0c975061e0af8f69dc4e58c022e4e23cd400b840feed6110b1ffdb46d2a36a6057ee1a6f1b32bb0d659307a6cbb9fddb27c105f6619d40fbbf788af08bcd16d37671e5787c1f5b33fdf0582f382066ee02bc6e4114d4bc35fd102543e03987773591ea0a36904b213786a12210381b543fa633473fbea445174dc75b88736dd823e371e70d20682907e7d493fc12c80468c63f3dd78faeaa6d0536770cb8dfd0bd392b80e77a9110604c6ed9d364786d730fe6b1c9eeac681f83c0663009e7360e57fa33231fd800723ebc46e1658c8d1c5a4bdb56b536fac702e00dd096773e8305683e0e2b1507cf40d183c6f4bec4afeb6e4857583030c3bd39db068d2d00f7649fc332e22428ba9e5e3af48b794b0d6b53ad824c4a6f511549c683b9062de18eb4998058d8732bc48bf6fd0ffb902daa290c190f89117f27f22f8bac3342fa6b5ae8b0f842c2fb69b8982466d570891e98fa3b297fbfbb168a8f24889b7f7a2f97bb4fe8046afa783b830a4bc9a783b6c9fb93c3bf09591cff5c8c0788d79f50a51f398007f5de9a5ad4e38ae06ee4bcf95e8c138e824d74b4949a05a3180738dd034f4245656828a2d5b17757ae1ed47439eacecb877f7275effe84b47a3eb393b934629e787d3dd03e86aceebf63055a69d58a0823bb2a9f061a127eb467169ea2353764f2026125cdcfafcdd35f47231bb4f434dc3dc9ed47867a5566342dc145c5d79064924c77ead3391336d373c673019c6fdc87dad185cb5b584c0163136e57e6060f9687a13f1e346102e4a2ca8db1c2e61c43db8f57a126f4366ba7e35037d3da17f19d21461b86dc46531c6086db798d86521b88346776408a2e63ed9e0d5ce89dbd050d5423677e3e025a2d39f441d305bcf4898ff56928dc625a1aeb7e1ee156f1d437859f9b78d59672718848343416e9f5c978a79b5a539bc9d73764eec96b7660989ecf8c7f07678d8bdee1031f4fb7a90174f8311a3e92d56ffb738d8f0ed5ba95e5110c114f1bb4c7e0e20fb9f2cbe0e52e4ccbaf864f9d818aa94f146ec018661f93ed1b0fd297abcc8990abc360eea2550d86e4642c972931f1c0a0b71698369c32f74a0803d409a9ed5c2fa262ab52a10854f26865391963a4ac4364177fca6bedbf0897f64b0406705114131a0c3ded606c829ec6b43b94b7a25e027150ea70ef10259a3377a4747e5942688550550cf202a83a3511e54cd8ab4c5061a623db5a229a26b1a2fc1cec2ce8e5be1a163df44afd78ddd672f185902fd4f2a145f93765df1d087ebf86129aed838219ca9d46dc5618bc0f829e40af67526f4be86278be9ca419fdf1de283de1eb141dade7f5c21bf8d1d830014bb5896dcf2833dcb258ef3768ac063329d860176865a28425c0aa2b8a8edc8bf0ce67a0ad80798747fd5f7c3607f767d14bfcebcbd50284fd5ed91e095cf5c67cdc96c3c8ba7fba875c1cc886769f7f71cdf6d7fd621f4c3c39b27d1133b9267a309f76b9fb89a160ba2ab0f1cd9831cacb16952b19501fe80351ded33b147693a26d5c6e27d3f25e651deae52120fec5dfe4841e6870853b8ae3496c8e41eb5f85a3fd2bc275ea6a8894fc14dd48e94f7cfc033f9ca4298ed37546ea0233a704e4402c739bbaa120a8b23cc30b6c00e50fa81e96f624ec6f19f5c76ffe530dec4c675ad346b69c10f907cc8f7db9055df87f6ff7c0868f8b61fa2d9709195fae77b109ced389054ce4dbe85aeebc4f6761a9d8a0a517cebd31bdeb1bdeb6a8bac761f99935ca3b425969750d45508a9ed1102778f151305575fe6499f9216102b41ff295d48febbb4b9304045685cc1bc0b97b895fd7b0461e0d839ff895c0865534e8eeecc178529d9dae3cb2ef087b8d4ae4e5ddfc03df0c428a5c9289448e416f2b5327711f39fd5b1b0551f9374f0b5cdf87fd639cf5c520397bede94fe8e30dba6b9f517e28850fdadad9c52794a60e9800ba265ea728a9c8f1b1ced6f3f25d162c896edd79ebd5f692e551dfaafb8c6f4124d9083791c5baa20b436489dc16000b9fd4b861f53ce4c923f9308dc672f0da6ed0ff419456800c290febd3cc1e2c7c529b9b7134372161bf859514bcc8afe28688a44c359076c1352077fe8377bfb46027ea67059148f09cf2b0388d5393284954cc96bd2f32bbb9bf58d6d81c221d49e722dd7e50fcf1681edf3824ab2ce41e8319a1f589fabe0a71bec4659a5257b2c2dd646af63fc55d3439847eeecc219ae0fb5313b433c7d30d4ea1fd99636cea1d1c23b0ee9651e1e988c4837655aaa6e37064bd229f36d2e2507c247b070acb51a2b6f5fd9586f7f3e103ac0247b9a77798b8bcebf9534a9869bcb3211a51c55440cc4e28538ad1835be73a18d0af898f567a049308f00ef103db4752d7bb8800fc491d6b1655e555151dfdc188dd4c3a344e8588eeaf2983a8a088811a1943a8e1db11d80bb634c4abba6523c7df35c75f83afe01cf8f928f544b4958329b092415b0b1e3b7fad137163cf0a48caf32e82a0862bd0167b2f323da671464d61ebd6f6d0ca639819c46d107331317f1ff0cebbc3e67f34f2927ffd8598fe297ab168011f367d62187e6fca4ada2758a6a7876f66bc4be81bcd8f11e92898c21fea1c7275ece679c1b72b2c8440d9556f79da2756db5f9378f77839dd1119539cf35c8950f3ceec7d6ee043013a82bb1ca91c7a441ff6de1d7e0acbcdf11375bb5ff64c096893337b5e59fb5995595f794e51b7007d1066ecb613de8c7d9244c644c7d48f9e221516f9f22f1e70b4b8656021d9ccf587a89ce83a8f2f973bc46260d10f793546b9439915dd70b854ca2116d8e618fba44c7e34776ab8cdb7e030b1dcefe30325cf2da7f4314b44877f19d902c8e6cadb70ee67e6c349f8d343468c4ab9968a96eee4eef352a4891ff27765efee215d49c5d29e48a0cb237e694b2d1f54f3ad5bfd973e2b0fb3e1f54de67e50348cfa278cfa0fb54fc82190af9d101ae226bd3abb3eaf4475e648c9ffcc612568c3722fb3fb85f0665f822b78ca1baf693cdfe4245ceaa56405785c0f8599233069a1acbf26c2b64c8c285a40de88b151117c05876112b1725335daf06b50b17d1bd312c46fb7c59c5d640760b2d1fa63d66084d42d280c568fb90e42bbd1c74239b9c82f8ee64dd1e00e01592beb63e948f91a10c02e6d20e71caaac91810233e2bdee611781475e70c57669d2763a7f56083f657e4ece0070e2110efbffdf8393d0ae03dc0137d6abe9641f6bfcfe9faaa7e364253fc545646c560a263e172b12a19b709a57e9c01edc09d1a62647bd8cec221a5ddefaa4782cb4a3f9a8940f3ee3e64e6d9c4786634d38af2b5e55d52001a9ee7d4ed63af7afcf6a9ca84fec5dc321e015e1ad62723c5c5fb9f55d4d039f46c36f1d0d37725be147f74b172c3b516999300b0d739c741463f4ede15a5864cf9dadde0cf5f1668fd5e415daf0ad32f4f1513286f1ebda8c461b0cffb1d55ec6c7dc772ccbb2f9e86a1e14bcfd16cbfdc5df2a58f17b33971a19dc1bcc8a3f921953c30a6e651ddcd02e997ad664f264c2a7b37f6d1a1b9a0b9cdc6c7bf07d0416f27a10f9ebc6499710181ff7df72229097155f7378a9ebe76b23b8dfea917f00702b14b2c02f491f6ae5660a4bf46b15051904675cf4bd6b156a40320d9ad3b07c82ab2269c510bb8542a9ce4e3ad2a973f02822fa081699e967b68cab88ca2c8f077e8d5f0efa29ab2184cc921a6113441808dfab4b1725b1f6956c80504dd9a291f945565f3c1393f518f2c260c57fc7eb2c87c6b63d126a60a177c5830a22d3911c18b955f253ac34e8b2ba4e995fd54a0209c261ee48b6f899d17c97fd0535c7abbb596ebccb99e5193690d09cd7e642264fc34190bf529201a12dd2e196dbacb1cbc1fc9e66bd56de55d905bae69a10fa46b075372508d9aa3d808f94497b8c2c94d40e04267a1444e8bd25cbadf502ed21186e676791c3cdc4c4599901851932820b4ec4af101ab51d0da12bfc3e7ab9dbc1ccae679447bc173fac657a78a5a397a2586af34ccb8fc116b744f964cf4530c1f02577d54a5dd9a71a8024cd058c256dff15589cec79e461cba30bd11a4d90ce1c11c5024918d01466d95c378ed0a2d2d16150fd0a8113d49d0776e3b1661cf19b51aa1539bf5e1b0dc943a75638b0a4f06840acb979b5704f4dce69ed59fe06d30d5f8f008901749b3752d4772959f0c4d068ae86ac71f1dc8bd800e500f499a353d57e190df10e091ecf8e45c2546def61284ffc2c8c58c329df43c0f31ea9cab50eb39168edba447289887ca7f8cc47e4a9a85281f2db877c0c7be1127728c366115ccdc5ca61ee69b355944f2714730c3c6bf40a8ad9de6fae5a2bb11a17092d16e9fbc6fb81ba7c6afd8a046aa3e8e0be58897e1b2abccc244d684255b1b5e4e48a745a38bc2937f4133f51cfbe0becd5cf30f4de8617393ab8c36f65900957f30f198396110332a56f9ad8f1ef55fd8c4fa4f69b0a21ffa39dd1e96d9acccaa6bc7147ba8d03ea029316df066d1d794e8b7c33a2e9d733d18b31506bab2cb4c66c7a43fd679305eb100ebae81e8072ef639103b5c6fd287c3c2894d406d0f1fb3351380d5f486ef64e634b7bc45704183e136e2788834eb26560cbd5c63f2d80475410e2662700f2c222ebb87bb6e2fff4923d6982461c57020fbfa365170566d8e6d396eb64eb04ba6cfeae124216811d55f108271ac4a559735b64f4ff30e78b5144798111104b7f1283950d51e4d85852f378632059ba7f5774d4fa9405917bd55ab5a48474dd8bbbc7999f53671b7292547a530694520c40dc4350fe3a40a3034c96e39b5934cd8b780ac836e6dc4160b4f38637c120a3c1275b143ded1859ac5e663256ed102f06c683c2511f5101b95a695a9ebba9ec59e3d8f215171fc0cebeceecac41953c7fbd4e25792a6b0781f80f990846019a74a130d3ec0b9a4790b74a8250295841ec45ec9beb8aa9a7b81fc6104bd2a5fd9cb63f42afd600851e85e08b48d1d1bf9d4aec9084ce371210592245645214d39bb4f9451620494db2ef0230935cc530c0ab06244cda46da1e4df30f4c155b306aa06ace5785d5f4d81169423b348788cf4bec5778cd669cc2f399e1877c93886df34716a8145621c883ab8b751b5d4916f1658e7b39cac128e148476f4af78497dd57be76ecf65e0015463e1e73c47c0045373225248fa571afa8cfb12c3819602f8aa5d63cb5e7ff8641419d1ff60f84de1b1a64cd87ef39863e8de5718a0a80281f227dd28cb1842841c165f1dd7ef25dfac307dfa178ae04c1f369c9354a652efee3d5c112f4e1a20b1c302f88a5bc75ea0a9052c3e29e041ed16d7f9801b22f85ce81ccb235e62bbcf55757ec9a9d32d62a7a39beff38fce1a247814146d8b77e0ac29195d84d14b33b3252e2b5dd514b9f0a096db12b4b16ab4011d68b41b2daeff6cd8fc56d38d858d38aba0f2fbb1b2eb0ea3a8854cd498a8c46b1a35e516dbb01b99443ab2e5d79839491e2c961228f701ebd5d7fb9e3ac8df52163a74f63586b06c3cba7ae58395f37e4a091543e7b3b1f42eee9fe21ca599fdc1c57c3a41c99554b7a52f74fdf2081d409aa368b5838a2bc24ce884af447abfc02665e2c48f28f60e2ce41e2098b341dfb78763012fcf0bbd6671d83a8d8577b48917d0b5dc98d5d09a22358a103ad0cd671f2e897e007abd98ea69dc9ba24b059ee23ad67f07d7abeab3ee2a5471dd486d60fd2110db8a46b49ca0662e70a054fde64749cf87cdca56b105395bdb2849662e801304b912e9c2a1172f4b614c20189616c59111e32cd377609f343f50b363959967ea89e28cf67c84fa73cccb817a0b4908ee02e516003b98c83f88e22e973fc95820d9ec8c5628ae7bb8ae3deb795f1f9075347c9f22394d104c6e2c7e9341bf7d0e977d3ca75c044817479c1c75e1f26a1f99e22e0225888af1e3ad7622b55a5180395d3b09da942e4df800907d72714a051d923400b6d7b449cf1e8361139e7484ce32e54e2258bc2715187157d4651cf4a63ff0fc2238d82ef3746dfc2b7d569c8a7de959b9e2762d5418de52b111746890800876a173ca2836af4bebe2dbd07a5ed888af485906d5f6a7490b3a7e5544efc90dcc20ca09433cee5f42f7742b2ec6eb4c6a572fc0eeddb7a669cbaaf2a7410758dcad6c65332cadc95d28a4325eb07b931f130533ba7033cbadb43f1e7d748f4afb7c8f1024daa39501cec519b1af712c3e20560757eaeec9f34956901a55679601a01d8aa25b1dbff1a2f335aa6e546432cb20af00c03bf0b72ca1045f24b88fa13c6ad18a38ef936d7e8df2cbf30c2a2adc26896be4a3548104b4685513a362c3e81b9824e076e80e047a1f5b80bbccd2f37a1462dbe9ea00612a30fd507029c35b1bc1205b1a22018e328219c0ca7577665dcc6ae80b92b45bcceef42aaf4c20b5e360c031c9c21f581d98cf768ae7252d35f8f4a5796982285e2876ef2e5a313eb5057934893529d4fee9a098852eddaa5b278a734163ad83d579eb579c9948884797f6417462df8511fa1ba74d1471ddbbcbab9dd0cdceaf488317036764543926084f5f5e9770e629fca70b1a899a52da8359abeaeeeb2d208f04b9c733934ebcc1138033eb685db8ff1d96ed06afb5291331544bbf760f92a7d913ae291311f361f53a819cea3ae2edec8f8323282cc271ff7c8a65fb88d9bec8e600436733d6667388866a6ec7717ec07501be69e576cc9df7f30b39f169d1167b03a139a80bc6c1ab480b31361b935b618ff0c7eee8856cf675c88b0ecfe6339e07b3b25f4284179933c67c6999a1a96400bb7f6c8c59a5b30e2e72eadccf6fc4217b7ae4535abfc35068d3222dca5f5e003f6d347801ae7e94eef307719994143b2925ab0e6e1c95311b31f3daccf483eb1628aae6844cb6177308b6a1abe3c547aeaf0ca5911e495cd82e0c7df79277040b2237e98e3e38b689722117a30f27c718b6a171a6a01d99a6fe436980c1aae104b0a6af4653340c7833a223054be833ac2e541fce5a390acb2b4eeab830bcddc57547b58bb227166a095f5001228c0768e6b53f343de6e4cb0f7966426d0fc7fe9be82ce3c4f96dfd2093ab68d8508fe22641a0bc001cc001b24dafc7ba30496742a2c137cc33499430628291fc4b539f58e4b3fd6a10538061198aca920aa1eaf9e2d2848c9da9282f05853e6b4251bd6db9e69260abeb892bc88db41c075458cc574084fafc381a2e258cc5141879c1e09af545f4c26e8de628d3951f2deeadb34c8eae42533275cbac76c31547da0972c98582e15a2dcc9b8ac95715b125e9adb761a798be5bd9e6970a1dcd0a4faab89bc48adf34c306e2be28b9b22ae6612bdeec52f1e9ba02a91d2ac3292397d818df08ebfb8d58c666fd3d37eaecad7ccaba8b84870c484a5b8de7a62028b76caaffe1dbd303c3b6b04d0479569565d1078e79f452f419b2f7cb359730b43fb8f1d928094196b79945d96b3d84768d874dc7db0025d5cac2ecd848ed36ea98be83b2425a52fbe64cb42daca694ce91c909640c2d4281a8217a4805a47ac0b9ad594079497661a584eba90fd2ca2082414c9708ac3a6c688b01d3e1f16953c5e720779634b00052c08f45d23a739912b154358ae15c4ed8ad950b543830eef422da7d134aee8e5d120ff04afbf29c1f4f2c2a1ed9ba9383e973936cb61dd8e3b18dd8c151967739043ba0f3b06409254d1bf0a90f732e0428802c40e93ad9a87e07ba0b9d0705d27742024d184d7bc3de74cab69c8fd831fb4c5134525e32bd7036d07403acc29a85f35767e6585808fc3b03ae6b85d00e3010c89b4207ffffffffffff0fab1841a3a91b791394524a321a97c52858a2efe6769249a6241341eecc08adad7f9346026710a20ed10d6869d151d34b3122af303aedd462b34ce7776130f8e4d15d69f9d5ff61609cad456bad2175de24fec2d17974361976e329f385c2a546d1f4d6d6928943472f9ecf99c3633595509d213a78b1c71cfb3689066d5ded42f17937b54a4b5d36d24562e7558f143a967c542edcf056264747e5a51045072ed0f77d2fe7ea3d4af516263db3cd32238476922d8c1e852cdd51e928d6ae053245eab55ba54a7c6e4565bdc075d0229b6f21377656faebbf8e59ec617a93ce6ab6d359599ce44de9cbcd2b1d45ac2316bc768e9767a65ad70f8b3b99f2fc79a59222ce1ce878c54146cf23b654ec6b76c5a3da2756e966967cad58c383d6319cea86e83491216d04d1a10a1dac5046c55f472553a995a12ccb8a1021409625c84a1b40e0002203206f045931e245569024e9419fe19e46fbb23042c72adaa442a652b65adb56216e048923a5053a98a04315eac9a4b764f6b47e93a42c42472a8cfae942591623434e14a10315492db62e93f24fa1d4ba4c3c29ed2e539ae2a85788cd1f648eafa65268a7e975cc5ac30a0f93222964ac1323737fceef083a46e19cfb98b89451cf951e3031006260d00122478a0c3971224792ac9c10418728d659264fcaf54c47f428cbb2868e502c3d5de924479c4a655249515151c111748042995feeef262d34f64f84c842c3083a3ec16c909bb66b4a46ea5196a58dac651122870e4fbc52867fd4a899ca64946581838e4e9c65566e69114244447a8810214ea4d730e282654122474a0aca1b4196850c3a387169873791bead62f44d34a75e87af10b2e4b99a48e679872ca1796384c4404726ce79b4defb50bebd2f4ca8a4ce27368f36ef4c5ec2b45a334c67c8798c96e0cbc64fcaf44187fc54424d4f8db9fc74a9112516e1c2f588d079cd9a8442e8e624fda4688c8622061d92386ae797c173f2332d83b22c2ec75a01838e481cb3caed13d912fb1b4898841cdf28f6f7326a8f38a97e5321f24dadce39c2e0191fa356ef4eba6f84f13676dc95a3293b464939599c8db8c0481acbb22c488ea4a80e46dc1a4abad0a2eab3948c0c592abd2c42900461b501c4880b80b491216c00016276e67036801c152041d0a06311674975ad42cab796af08b5d5f46b54425ea57a724447220ccf9f7d3e4735a26a94655916212b100207106303c86123c891d5c61e5945545256968e2ee840c47a55dd771269eea35941c72194a22683ba4c5b391f946511d2021d8638da86eaef4669ee1c448438915d4b6525082a004284c842034810349645c714741442a5a773b2b7fdacc746599647e82004ef652333abcf2dce44591621405680a8b40124c81973f0b204d101091d83388a7a5dea33c9dc394259966581438720b0172173bdaa0ddda9402c64c7c9d133b2aa3b28cb222408117400c290fe1ded6487ec6da12c4b1174fce17cdf2c777f347d372b485294a0c30f99f9c657b325aa1b4559165739b22c42548064991144471274f44139711eeaf4649b28757041071fccf5a7422b39da315419007923880e35e8d8839f753ff68b33cf4ed2839b5fe23eae884fe6c943ff4aa510d1d0c95b090fea509fd545bbde34c23ba442ae09d92e45477e3aec60c728f1f9df9a9336b58e3af42f4a79f699acf61e655952564e74e086192478030741d8d041074f93d4a23cf7df681dcab2a0a1630e4b659bc3bd6edae45972403547b573f1f03d651c2ed36154e698b46b14c1e1ba91194a55a45eed11a20233902c336a1084053ade808ecdb1e6366e96591615a0a1c30dd7471b29f54fd7b6b60d6d978ca9e64cf4a98c0d4bf9a073f7cb8a2cc5c8c91ab8d916ffc2479becd5708e615ffd5ba44e370d66774ca765fb99456858fba627f9cca5a36740ae8dfc50266e47f366b06cf5db5b067db39701e95a4773714f152a198c953f5ae87852bdf131d82a2e93072d5d3e6e31fc5b1a5add9c0cef86213b391f7d4cf5930886e3ece93fbd51b76ef80b86f8a8395ee8eb9c5e507d6cb614e5eaecd4054d4729f5780a0f912d17f4ced8b1d598defeac2da0a1b4fd3c8e87c95ab0be94f04f23bcefcdc22fd4bdee840caa552c986ccee4c43d3e2be915d6789d531957a7b556f8e42bfd3243dc87aa0adbca0deda29ae93145057537987a96cdec7b0aa7911d34cdedbd50a5e048a5f9c546f728cb28e8fe2e330bcd11a5935030c455ac0999ebf63fe1d4d37b725d654eb513d032eb2c536abbee6a021e62262f66d4f52a31c112e749a8a7a6f27809fde908e129a3ee9712fad23943535c89d126a1d73a8b8f1a29b57ca10e2438badfb4cc7acdb2e21174d73fcd26b5e3bbce089c79d0e8a9c657fb2d022a85d49c85ea7d9c08abcc4a071de3271fe1102e1ddac1f5f9bace4e08b7c99d8f26a4d4eee6b883cb0f557acb440b823f62349c76add9741010327d5b793a4d76a97f90329d3a9a4de44b2ac99faedea49672469667e520ca33a97efa5c2d12748852b98d715a982ae9d252f99690dfa1e4036352ae739fb2f9160dcab218712227ec3f3859165e4e4ece3872741d5dbf9072a5f638055bed16bb1bb19121cab22c8b902245d630c18311b316795af9cb106ad445524a735699ed83d03909e5c48fccf18620882cbb4ce555e7c79489b22c3f90031072b06a737337aaee2f13cab2fc408e935f4ee444881038d83091430f50615f1ecc6dfbf5432e9d9e9d268390d351d2da5d3e69a98c7c711ca6d8575b95f9742e144264195171810e527c525f74870b33539a85b22c1e477b3beeae4f5cf56bd01f455996388c0c9183e350f1223ce84dce7c860c36deb9a22c0b0e38d3a144b44be14afc44591622cb57909cc84124c92e8b103880b011e406bb88cf213cbfd6f6742f537607ad95d6234fcd03e4be1cd73267c40bf584ef8d5be9a222d59f76a06e569fb41c29e4cb5007af9bcea9bc5b88689603e63ebc8fd67c327c83b22c71181982442509bbca89c7d12a10f2cb5b00040e206c005949d2c6b2a8b81c2aabc8bba1c6b278a7185996653161020e10d3a27c3c4bc70721376ed07cc8d8184fae8e78e4b0811ef38c2eb1ca33b32a480b6a70876e7f11d265468fa5d020adf5ba65ffb59d141cb90c2d59feadb96234834c8e88c838527a9ed514deb8cc663b973cf35499e56a3441062b174a745eccd6064fc71262c08731d5545fafabfa0e1203187c723d87ce701fcfdb17ec3f762e364821e35e2e403e988796c8925fddb04d0ab1b2c25e46686d3c72c52959426470955b608c11e7324adde79eb2f19bd0a75fbbdafd158a8305af0b21262b6583d2a6654192b286996450525708f5c247946599c3e53859454e8da44a5fbdd9ebf639bf82de4ce677e6fb6c4a2b0da51052fa968837211a15ac8412fbb91a64997f29589c1ab35561fa5de468742f3e0a5fd5e432b3272928386730fd39a70bfd231b671cc2e3ae90cd2bb3125184c491643d05cb1244062740cee8d0f2944ca934ca032800724607e030c11a647c9b91e7b59f425916214284a4acac0c5959a3488a4a1aec4764b02c4174304188397a094d9fa9699b8372648e9565112224e58d9841e4489121419605c909978091731753424a1bf50ac2ab4cdd992a8410579d80047dce5d7a7bde45bf44b01cc694d29fe35d1fb5ff943314fdb72b36d7734c2d550955a1b931099dbc3328cb72b22c4384644a07fb20d5293de2d428cb72928aa4a49cc4a17272f203f7f8a993d6e1bfeccd1595121c5fdaf39acbd2d4ce5096e5e4d0752f5273da7de5ee41591664979fab961944a8bf0dcab2002145250e111c846d90cd778dbb5a83b22c2a2b480cfb19275637a60e13a12c23e084c99c15ba3a469983b22c276d649df80f547c59dc10414af6d9a9543af5730b65595090243972a292f2cb22e40c206f04618703082b06cbb22c270801e7b1d3fe777f8ef6a32c8bca42e1936511b22c2b459e0666ac2429b2812024006218f5ab5b2671215a465916212ac90682382f22474e8c0c591695150382b5fe96e193bd9629745096a5ddc807b48d79cfb93d471d2dcab220697724272b1ec7b2083103c992410c96a5484a1b592a282b08120fa49c24b40f744065ad7080030fd80004342007af254224e5031980000628708107584002660c295224a50315b800052230010948e00211f89524138040101ce544020fb8340107042105082b14684042338301cace89b91c8bc89ec46164080a928562c6029051000712602b292908e8e52a1d38001003c4c181021c241f208019800704c0810018060070a28132ac480a9fb8cac9c99123a11d6147923f507865ed49077c9c9c60a0471056910af0382729444ee23032248e3852883c808c2214d8a192b2b2246062868e73a2b29c089f9cac04c12f5002812920601653d0e14596113210300b2e94e8484101d24032e4c812808e32082000258f98051bce28198212c77bf3ae1de8200738b8810d6a40033866f0860c62008317b8c08d36d860c11a6aac200d15a4000d149c617202131308492507b802154a0e70056294ec8042004a1e010b329c51b28b39d882162525253aa6a00b3ac4616465213921b290a88800492df0505262420b5d9891865c5cc1641626b280c5492c605152820b1e64e000b7a0450d68918159a09cc8a20ab210428919cb196834925ec34ea5b3294450807e60b28a92121342a8e200b08884892a6001e400af404249091f50d18e640e2367b417596ed80f9645c5912451f123496450846be08853101942032244ce683f94949898a2dd0544889c515262520a13521849f2252526a3e8218ff01557e1334a4a4c44e14406f1870b458902453a732c953e7ca2a4c4d01c4b45e50c242525269cd8444949899968821099c0444989491f2c01884a9494983ca2123240627014e120205ff1152742e48dcc800891246938915d296e349114355c084382b0da40a2821494949850e2488a8a91191419b288a01184d50612f7345652dc50414aca1b4796ca1b5e64b961648d20a880c8f214a4b82107a7b4c0c80c3cc50d3e4cc20f922829318944494989491f2011045f31e183c923dec81a44882471a3a4c4c4112525268d28293161c4224a4a4c14d1fe46ca27c2c40f88c804251e410a429002100720c51e4a4a2e19620e97a3a4c4a410c6e670364c085152623288a5e26c10594113198282c61c448cb8a0a4c444102b2aeb48498949207a884a12222f282931010491b5294456e03c24050e6fc3484a1a2b4896b760e58c9423292a2f30b250de709594367a8d217f50713986184969a3a4c4c40f253fe0214650d8dff01f0c89c35b40640de1219d84053d9803052525267d2829292931e1c31ee4504949630e14ac220b491236da88af20711aa4700aa7d080871449a20257494141b2d0303224855786a00089abb81aa70656035483ab01d620d5206ba06ab02c480cfd6059ec07de293bc76a831d0e21296f648d20ec70a8a478916544888a6f911423de45528c204182a4890ca1819020ec700c89c34892348c24f94e47ada8ac17ccd12928585159477a8d393a05054284180a6268062b488ca4a0610610952488b293442599c3e5b894a487184a22e41345d8000a8c008501941cc11378d0510b1db6d0210a1d84d051084ffc2821231348e804194a8cccf1892d54c0044fe004277ea4e0009cd061128c2bc626f860084d40420b2504388319c840062a94943ca1e4095160c2194d10b232809292216d98c0c8103348606668c00c234ec40c6346092c608611278207c004144a4ace28d171868e03f0a204beb8431d2e60061484010b252f2881c30412b804194e6477889137809082c611242a093b1c48861c3903c990232b0e23448e141962091e25252b1052092225252584a0043128218592921223016a0441410ada083207197238b7ea79d8682eb5188540461c927a438be835cfd93145061c10dbe183d7fcb7dc8f11c878c34a8dec6f2b5d9eaa65840c64b861b94ae5a9ab690a4db7e1ec583ae6f8f277ad6203af414b8f31c91622af0129856c955a67274e359c7e534af5d1edeb496950a4ec2e5dbbff184734983e1ef75d2bc4d7e80c29ad4bebd7a8a5cbb03a1966483cf99af23432e75719da8d55a7545366869e0c8f72d14a8638cde3f518d2a6e3e6ec3f4d994528cbd22745c81043af4eae7e33d3be5983424618967db67a3a29d741072d18f20fb9af7d94cc7b5a5f685d2af9a9f255950a215932bca0cc2e956b14195d3076ceaeba366878f6c8e002bfe2dec5c488bfcd72838c2d28b52e29b585147a55dceb0c32b4c0ac10bbf51393754259b855caf4ce9c3273080bc609df559ed9b4faeb0a6815ba4984cca020195658ddcad0e91bf4f6836e04082927292bcb520232aad0ad8cda4d27132be76432a870d4d2c153848fc78da7609bb613aaa2d5e5caa4acb4800c299c42efc710ffaa9e2b9435c88882a16143ca92571135a22ccbb20841430e5e2b325081011950d0dcd52afb904208b5a22ccb0a2f329ea0d25b99a5f23bcfb55096c5c82272448d20ec9d828693e184a5e6b8d57962a4881c8508917582b272c49bc968c2f274b82bd3a763903b136ca9758bf29c5e02a62b362bc735e65742a24eb9b415217487340928b97beb1a756420e12cb959bf7c52dfa61d639dbdc4b674f73d37ad1859bce0786387313831a35e3de6a4b4a851961395143880b011645962b0a318b894b15fa8d4a13fcbc4d83fe824d3b58c367eda310c445f6bd44107394a845096658e4564598618c91dc2686347306cd99f9bf4a34ccd71b00318bf386fa6174ac6d8c9cfc10e5fa0850621a310ea42244407e99841022142129a1acb12040746d8d18b854b3d4ac4082553b678a1d08e6a4ae6b5d6f4b84a1224294478084358961347e1c547929c088101901604b1c18e5d1c74d8169d46c6a43683b22c4528429121284844f083210c418d1dba58a8fd8c350db649b323179f2813a7bd455cf5b870b78498af760e4aedb730a9ff2874b02da974942dd6624e5368fdf9934eaa054a7e27a94dc34b3c8616ead51e2ee342ad3c11cab29ca0204972645982ec988541ba6a258496ad31e7b2e093d2e93b53af562d130b3747cf22af3be9fb1c1629599fa56c2d56f9bf5eb1b6cf51d91ae5eebe488eb0c315aed0a06633e7bcd19c1276b482dfd66944b472a93750d8c18a463d69df5062f2f3b88ae4c38f474f1ba55cb12afcceba793e4d6a2e2d22ec484526d37dd4f1f4c6a465743461072a8e37aa4586d82095e918493985dea79bb38ee88e78501064adac146861872914ad4da933e798552dc52fcf6490fde175f29214c84e5a9592194f956ba358cea7eef8794d564563d8218ac59adef89da5cfa60ccab2c8c18e12c489ec3ac38e50e09f4748ed59ab2ba14459c10e50a46f85fa183ffe3f293fd1af92d246bfe73799f3861d9e68440915195d78ce9f74946147278c32d733a576914f9f13a6fa1291e94264f4bb094dfc9b3189e6f6f79a0d19766402adbf931e42d58bac4196450b3b30d14abd59c2a3e899c9f0b0e31246b5cab5c728741e5f0d3b2c71ea959f7b3de6cf32b522871d95d04b656cec987da5a78104b1c20e4ad0c08c1d93381972e48c3956ccd82189941fc29ef246d640030d10ec8804077640e264c81133763c62c891339c8da44c6087232ab0a31148e670392cb08311438e9c4103175860c7223c8e38d61b20d8a10824894062c60e444460c7214e24b0c31007d8518805ec200402760c42003b0491801d8138197264013b00b1b28f2d2946bbb631ffd06d6f6a3de5316af154d6913382a8b811236ba0b1c30f7d14af45acbdce9863ae72821d7d50c8e8b1c6e66f4fe64476bd61821d7cf83bea745a839cff970d5179c3063bf6809acc27daf7fbc24e946591c31dc9891147593979c10e3dfc7177b58ed1ca5ff3407023cb92c68e3cd8ad5135db5ee81815cab29ca8a49c00619d60071e9eedecf8301966738db22ccb22a40541961d77b053938fdefddcf13c0decb0c3dabc430a2d351b5a0be52465e5052ad85107a5bc8c193da7ce984b14212d08e24354de6863071ddcfc16ef59eb17abec1d73d074c5282594d0a45ab8430e7e690cbb39682126631c3be270b2030e2b97a1ec743b691b2d0b1122ce2bd8f1865bb4984e2beb1b5608e5c0d182203a90b0c30d6854e66183d67b2ed33bda90cca92b951a9dde5f5e62071b18a1756ef5bb2a850bcdb0630db8e7acf7c7c343ff97851d6a5066652e1ba4beeb2c2359c1c18e34bc62368a9faf139ed318ec40c38e33b031677c64d4bf668ab22c40582a2b3bccf02aad2b2a73ea3442435996651192b2a30c7b1c9d3b4d7d29bb92610719963df5735a688d61c71894fd3ab370ff1393ab18d63676765aca4fe72318768461bd19b6a3e9e87cd7828193f2ee2993fc6bd861b0e30ba693a37328f396bf9f2becf082f6a283697da9b9e4b9a30b2ad318c36ad5fe42be5096650717de91fec233c6ee2d31cab29cb411233bb690674fa14e9ce6dca884b22c76d8a105848abffbff8db22d85b22c2742e0b0230b7e089d29b36c4cf2732c9c2743dce998d57fbc57586af7509934bb4f675921ed7fbef19e7e3ad22ae8b16cc4261da7734c5261d3526aa30a5fa11e4e41d542b57754740c2624854784f818ad64507eb22820cfcc5d854ca36c282c478f485ba95f64fe09bcd0674ae8873b25e3881d4e3896e78eba49e79e461c7634c195c165d0ac7d395ac8844d7ef86b964c5b0f05d9b1045db878d99b75d6a62b61dd29e719349667cf9390ae6a4eea44b4eca97620019d5d7c7ceed5cb17819817e85082c931dcb4f11142763cba4c8c818f1ca94c6cb7ca6c520cd3ab0f3753b7b91b2786f23bbf889ed2aa3bfd81154c8681e6ddd89607e9d9998e24980823572e5c06791dcd6f46591621494c82618cdf7696e6249f64830930d458b3c274adcb5eb10c26bf3864eaa4b39b0ef62584e22b46561c2f30f1c5aa35fb760b173228ad93364c7ae18650abd6f39498495e0d135eac296550b3b72bae3d946559319224650526bb58c7838e79a3eca9d151960505cbb22c7e86892e52bfddf6f3eeda6d8e83492eeed87767af93ab4f73103c98e0a2d31df5b8bb6e7cf97be0901d2046054ee44892373a1044871a4c6e81d0db14b97174aef8820009b22c6e30b1c5e9b36ecb8c5a9dcb38cab2b8bf1117ccc00540de60528b5cd4358ad4de1bd366c184168b89ac0e795bd3a26382c92c4eb1265f76b73aebb4144c64d1b9a7f8d6cab0b162128b741a214be585897c102ccc246ff3ee9378f4d82bde0dabe149f7cae43aae38aac6bca6dfe7e55428adf8333c9bc7906a52b5acf04447f537cdd82945ab40deeea9baa6ff54be2ad21ca4fed00eb522c5a9d0e37fd20fd9b13a4a0d13547c7f427e7947e52e2a23989cc2d649bcdfd36b33c94da1b7d898846c1859ba548a5d7bbd6a11194b4a9114caf8ca3b73469945c646a18c715fc8cfebb7392f0a46953a213f9ef951188a3e7a8a8d1f4547994ca0d8e6652e9597f2efb53ec1af149b1984ac123b3d91b86b55a6d6f7d3c974c25badd5966a39cac5c809d546ad9f35871f1dda4d1c748e7a8eea2b22a326ce584ab6d6d53e6b8f63082699c0a38d9037733ff1594c1843938638f35c625294658982c925ee204dbb4c53f30f9125cc3a5cfd8f7cb8dd5809e53d85ceba730c4aed94b0937b9042dd54b4924d02d951329950befb1ee7c04412dbe72c35c6d8ac533d994365650e670388124c22a1101da16594e747fda32c8b0f7c5984f8400544d69095234518c9b2b8610209476b3e612a85c6382294655916152c8b0b4c1ef1cb98ef57283bb94287224448105f03c81b419660e288b5fd4e54ead89cfb41599639f6a4ddc80cb460d208a530cf3432eaf8245b946509a2e309268ce834958b19a9a350528d06901a982ce28e1df389f8283506bd8922d653bbd2354a3317ae4922d4519a767b33e2c4ca0411ad9891b27369e88f8e0edec0c11b268748c7f6afcfd2cfe525cab22c4b0b82cce16c2ccbb26c9ff8109595203d303104371fb37c6c6de3d92dc4b16bc3ebfb0fda95eec4841096fa684ed26c352a9d16980c22e922624a3e0a45881b492182c6b2b89114229c0213412c37aa53298452424bfd042681c0538febd2afd9e33940bcb64a8f78dba8caec8d33f9831f307ddd59d4e4691de63e989e3a23cde5ca49293e583f4a79fa8f61636bd430d9c3bb9a73148d423ddc26b4d4b26c5429efe421a1fe3d69d677f2dce0219975d6bd3ae8cef4fd1d4cb9326bcf2dfb45e47650c5ebbc42eb8e2af6ac436ad33ff39b189d2d462674f853f77ba77a99852ccde1d3b74d31e7cae154aa458ec98889d359161407fc4fe7f02342a4d4c1e174ae3f6485e7a035fe063c8bd32433a93f196a3778ab6742aa5f5de3526d50842afdf37a44e6c33761033ae56869dde69aefae612dca63120f5274dce23051c327735a5522f5c4a43ee57b6092865ca4d2b154fc85971c0d7b4715d9f6ac47cb243739c34a89de347ac7c58b68864da9e91c55cba032b71c9894c1f01cffe685d83a59f2810919102d7a455e4f6e1ea13198b1b473faa84db9be08c5440cb6cbf556dded9239c7240cbc4cb55a2999b93f9d60f88217d2bef94ad62aa93e6d284b9022292a69044931e9429eda5bcab0f5162ae5825acbafbf862fb1f9426db2056eb3a7ea98f67097167e9d84dc355362277e16ba951a5a7293269d4c5838a4f8d52f4dc84fba2b983c699e7cce25bf9d15ceec5ae45c363d7ea80afc68f43c67a3fc938c0a691db5c8dfa8a3993e294840603205d5cdc6dc9d7e17cfa22c4bca8a91212773a8ac2c8b1021330892b262648d3954de085202132924d4a7acd041b73a19435916216d984401fb986bbf7c453e1e8414142c4b7b1052f6c4040aaadbff6bd7a1a5aada031d08624c9ed09da99692b29a4ebc9cc0e9bf4fdb493beaf1bcb18120c6a409bf769261751a1df57226acab934c36ab5e421eea36a3de53baf93251c2aae4778c199bbda51c6559849824a12d55f227bfafef5128cb22c40409ac7493239fa3083d298a101dc750b896215ae49936df18d1610c6c4fb5ed5cc91cf62ec6b3aeab378b19b55efa40073190cdaf3b94df6c0a7b1801ca6e083d54a10e25e7a674b66729958a74d0ca76a369c6fc94083d509192bdd33e2d5e4945a1c729d6d0d5e0ae45bbfed7083d4c91cbf9f8d2d4573ceb283130418f521c6bd3c8693a33312d9465d91ea4b05588df1c3eee31ac1ec78aaf40a5c728f024cb4668514a99fda2d05be49bcae9a1c8cfd5b89cfaa4759c4191a8170d5a78f613cf663bcdd89a22a5cb13e65822a418fd5dd9ad4e2c345b2b3f5139b18e328dabb6764ebada84f3bd3a794919b919d4842edef67b72837a9d89b51662a399bd6bae8789d4c99e129fd3513b45969165117209b56bef955026858b14083d2cd1e6ea091d328892d2a3127da990f9e2e6e9a354c58910596844a107257e4fdd41b75e5922a62040583180448f49203fda7aab1cbf934d093d24a14e32fbb7127ae6834488100f2c403a000488100f7400c81c2a428204016228491039d851cae8458f489c8566fadfb8a3d37d4830a6c5b48ed51c35fa47e469374729fae7b5d48e70ed473cc617bbb9d38df0ef5bbdbdc67cba6546a46637c6b42a4f3dc68b50e67715616ff8ba97143ac9962722fd52b8d49b3486dc11a1e9b42afb44089dbf75887c43aa598d263768ca10ca8d10d721a63a9b853046ff7fd6774d7d3a42a42dc3f5dbcc7b98d120da302e4a85c912114d108c929abc47a699394f208cd1ac7db3fb8bdacd1adc0310e61242efeb870d115a637bfcc1b0e2e7745c116a6ad7f1841e7e384ba13ac6f49cc5adace244882c1df4e883235ec613979937789c0f9c89e657b5f67135dd83595a72bc5345337684bcd1430f8bcb94e6311ae4789c0737dbbf4c8a075cbd0619ebcf4b99d21d92f19c958c6e97fba11d34351a3c84d6b317b23a985234fee57489c774408891ad5e483137a69c8322fdb6cd3d9fed9ee490943968d4a345ea1f075dda8c6739ab35c8201c7c19af539da3528e6fe0e6a48c793b87af776ed84c0a2585fecc7f4ad4064e0b53b24d6dcca199347ab041a9ae36ec7fc7ad969ad0630ddebbd629a5f0a43d4d35f8eee2ea6dbae95428080a7aa4611d29758d27e52b234603da356a50275aa6cced19b8911fb3fea7339cca0c6c4e5ab9cecadac6b00c6786cb1b4fffbc5224648d27f4200332ca8e213ace766a1565c555c6f00a33ed782d1e410f31b49a73678676ad543e9465e91106d55eca6d2dae5fe32765e5c4d34879a3053dc080da34f3b1c4daddc6bf80460dcdf6beabdd84bce0072537a8d0da38ea93468f2eac27536fe84791a2792e70a35befc3c379bd7a0b9dad8f7e29d7357a0b8d1e5a386aa1a56a8c7855f96721cf32e74bed792ce032373f6e4b3dfbfb15521a466f5c0669aad33dacb0720f4a8dc778f32aeb5105d45b698e89d1b627438518f498425acee8ff72a5753bf6400754d0430ad766253708995d86d10c7a4421d5f8ebabfe33429b3da060c8f13462b326a5538ee2468f27f470420b7a34a15b9161bd5daaaaab081e7a30612d7bf1a3dad5d8ab28cb22647b2ce1f8a8b40c9b51f567ab460f253032749cdd6ce6151ecab20829c23550e991044eacfaf8861acf0cabd103099a7bfcf3ef5c993f1ec378f118d39df598d8a09cac2469c318674d7eaea4aabb52138f62289bde5187d09f4aa5c4c04367d6aa74ece76a18693b97df5dcf9626e4210c377b87359d5d46cb778e35018f60bcdefafa5dc9187d2e30320fabe495162d5e1b11220b0d1d50e0f18ba58bd856da564b66191ebe58a65fa9dbdd496dc947e0d18be33ee6ce576c54951777e617a9e247eb56e25d187e424913abccbe853c74f1cd78cb9331e4918b3c57546b36e7d84906a57b093c70a198d0726f948a9959d3003203206b0439b2da585944d2581623beb2b288bc0a8f5ba037bfa4fae04abaf7b640fbe7381bd234099dafc5253b5a4f4ca9c6ac69618bfa144fdf7965ceb358cc775032fdbf8dc8b248dee5e62465a811321b8bb63ba34ea34a675e2d582cd5658697acaf50e651a9e3c7c78ebe7285edae45881ba9725baa15e8a8b76f665d7f5cc98ae4f6c74eb6ef5ad769156b617342859a561a4caa685f4cca95a64f952ea5e2d127b44e1a75d42746549c74d23ea6fda447213c859eb3faf0c15345fc33c5a6638c4c3278ea9cae1467f9ef54a655a9f7881467bb8d2fdf633eb9d128786d7a5d859028f2f3f86995f810e35a28eee4e799d4eb8f9582a23f21b2d4eba447289d4ff0e55a346bccbcf9399ef84df737bb94f24e7b279659b5c820e2e489c97870e27361625e87ee58331c3c36719728f1503dbea57a14003923c8b22c0b12223c3471b453aa1b45c39ff45096057964825d93c27596cb18d7f51e034c9c5dae16eb2a4d47d7a32ccb1b3c2e71ceb83fdfb63ac36c097bec55ea0cee396e0865598ab80c7854827f19b3f8a8f2d4a6e7021e94588979f5fe733a5ac2491c2ee565d72753623b49ac4f56e7e8ac4f9aec2261a8fa8e969d4de6777c88ca1b90408896fa556a56d335a20849c10c783c02a149eb660f7af4aadd11ee8c4c23f4b484961945c8911495142ccb9114957e834723d06ff1155b19cc66445916462ccd55bcbeb3f75fb888731ecda8ca7536af064511abd3ca4ce84ea1237f367824c2979fd1d663524b9541c4ef2a94a6b78839ad0f715c35f18fe79b460b5196658e149515242df04e71c310abbb6a49d1de31a9390843be10269313ae4d95eaac6942744a785c3dea576f569465e13108d6958de7b67acd2c515c06ca43108adc97c95648913373200c25b596d39d37335b40a051c6f3dfb589a49cf0f84342dd8b2ed9dc4f7f51966565f9e12c0fa33f28d70f3551964525c5c8901315f0e803bb5a846ac78f2621e683e79ba921abadc9845096e50c1e7b689576d7d8e7c8d2526df0d08322d4a7d4f28dcf521e98f9d91c3acc73ce4127e081874e9d92496851fa5466efc0a7b666d7faf828842de06187b5b7db764c9b7d4a58875d774c294ca6350f1219f0a04366ae4226fde6ee4a3a87f74be79cda36b9af7258ebff6567162574fb386c32ff3467aacfa25438204eb7269da6f40637fc5ccaeb28434d25e0e106eec73608a1bd934c9d36e0fadc94b0fba0358ad9e04b9d4a3b9f30053cd680aba711fa6dd33b54946531010f35f8b232c34857676ab434982b6f1af245f7880d1aaef53237379bf9f5cff09b8e4ac74fee515d6a86433df6c8a84d75f553065c5737e964a69a5a5b830719f6d53a9854a23265ef2a292742788c6121b73ccb8cee0b530b788801bd9ebb9336a961a4fc8d18f008c399ca3b7690b2c15549d4083287b3818264a9a1c30f3cc07012ad56bef49b3c3d797c61f939d98f7a4ded9dce00f2460a787821ddf79ea6514961c2d585cbf4be69d763b2b4ca053d96dc4d9e6a1fbbc3630b3cb4c0230b27adf5d1f5adbecfb1c0030b8b87d8f84a0ad92e3342e07185834ef31a3e29994e71630e1e5648fd8e52aa3989789757411d6b4b67ab6e53d2e441057474b3cfabe62eb4018f29bca23366cd331efe83407c88ca1b5ee02185a5d0ef22a4a7068da628a883946d37f23d9e5c41c1d220525b09f559f59e70e8f8f9b23e7548f9dce0e18456669df4eb1c638a545792b4a1068f26fc753a7e90272e525c28cb22c47ec08309689e2b93ad1bad95e6093c9660eae9f30c1f44360b29c18c9fdc5de97e94f9e5910454be6de818fc93d626cab2e860020f241cbb74bc368546c631d8bcee6533ca75db468631d241444afd516e7c2a15c3a45cb9671f513a9d470cb4521fb2a5de86717a95f2b49fa60f6408e3dcaa4e8452a7fb534541b2d4506404c398d71c7342095121a32c8b1a417440810c6058a384f648297b95d87fd12ba13f3ebf5c53a67db1149b65cbac7ff2a9edc52bb43633faeacf152f6c7d6ae2446a176c6a948f51dac65546179e8eeafb7dfdb4695cc9c8052e56ed3beb371d3c5ca42bcd74d68d9b95e76f91c9e6bfacff742f755bbcb659783e93cd60732d3c95223f49a54de669b43856a7ff8696d538cd2cccb8f39aafa587d5ed040d3264a1ddca673ffdf8ea3c42462c54a231f75599e9fc7258e0b15c0be97183c894bf6225ebffa49a53a3e676052e1f52781c255b07652b5425fafcdfb592b156561c1ea49a6f2b57918f2791eb59eb185115e6f25add5b2d4bbb948a5dda681fe152b4f81015e97a71f2daa753182bcd53c3dbaaebdc14bb6b5db5a659a256a5e074bbf2333b57e921523c5a0811fef3d2dbf5a3503b4d8a13db5a49bd28d855da9afda3cd978a52848c5024a308a167dcb5fc674181c92c2db4e88df6aa1c647ce2ce8cef9d4bbbbc663d818e9e743f74dc634c3bf1bd8c523c7dc5895cb55e46a9b642283781aa5b9561f7b31a4c4d60e25c766a5dcd6eba4c9ce295dcecd661ea61622576948e59376488d025d2ffb9b5abfd7789cc120bdb8f2ef408338d9a24472a9129d552aa167953fd28a18c39b696881bf1aa9ec44193979e790dfb164b623966a76536f8a78e228186fb57ba64447387049ecca529df525ac71f619a6911b372443a09cdd8646ea2538dd063f252291ec2d7b418910c73afe58512f9e022be8d2552b392a9ed55459cf643274d0ffea226021d76576cd45d299b44c4eeffaf9f49b712ed0ff10a516d9daede3d848650f6538c7c8d29f5090b81dc12139949ebf797109fe9e6d5f18ef1f71bc49ee1ea3d6a2d3f464d10a692d392f1731bd30e84e223465be694678800a19a557a432829d563fbc3dff955d476b6d751e887e7831042a86d9029577dd8a4f9bec8985fd9cc876314ebe12d6c76847e0fb7ccad33eb8f49668fe901197a508969e7d4310afb90f3907c77ded8a63b956af0a0d29c51faae492b257e23c80fc8b8032f4ee753ee43d3e7ecb07299d133e7cad3fb7c40461d8c2fe7ab9b65d6f01b17a8112406cb220432e8700ce6b9636f3a0f1a4691011973489f794ca694da7cd3a32c4b0a12232968a4c106903428e30cee495b51264d6a90d932ccb0baeaf8d2c184fcec659461df8c59de8e122d4df9155f411dca2083a55ebbf4ea75b931668632c680fccef89e97e6bdbe18bed34a37f887864675187c939b3c869b3acf170ce64e71ea1e9356957f4135a633b9faee85b4863221df95b47b55195d68e65f8953e3a5738dcae002ae9f9f6dc2de02767a5dd829dfb44da12c8b1fcad0c2275adb830c694ae7a432b280fd97b0574f257352a12c8b1ecac0421957c895e89cd446ed6abbb7a10c2b983eb3c9b437215e7450f8a48c2a9c338f58f92d576f1f1424cb02471954d0b3796d2c979db5b6654c81b35d4d42bda5461952704ced93b2152242195130ac27f9ea32429a4ad55006149acdeb4147d6932acf0b653ce17e95da59b57ee11d6b42194eb04ee9f8517cba0996365b59a9fd75eb6530c1cd317ce69c3eaa69501a652c211ddd85ad9ecff3513447194a30ffa7789954eb9ce207a18c2424a3c2b784fa8ae9189465b9411948d0d54a99e49c07113151e448e91afc38463a4bb13a5cdd28cb728264c8b208e93582a84ce28731dee04983902d2e464264eb2f1d2ee22e458c84a9f928fd562baa0d63af55f273f546104e69c1b22c8b901fc2e883abb8b89812731e30fc08c6b5499d52512746cba9063f80f18b1fbef8d10b213f78d19c6e19f65986b88efcd845deda43ea5279c0b903408420012244d94902a4d738b2dad881881fba389b79ada7a9043f72716759dfa84f9da66bfcc0c5a2b3fad64ae4660fb6174982649320b9852aa436adf4d328cb92821fb6489bf618c4f347b17147599693395450f0a3168bba90eddfd272d4465916151f92b2420b557a90bdb2aee4e6ac4a11aec1097ecc22f78fa7b34611525facc20f59e0254ae7eba374bd1f347ec40299a5505ac67511233f6d64c82f8b9021692ccb0f58acd263308df2f1b4360d413971210c4122841faf486b566eafda6831dfb224f9e18afd3b66f3ec711db67fc28f5698b537a3988f6285f1672742650e655952b02cabe8948a08592157f34e3f5491d4a385c84ee12aa509440c3f52719690de39d4e7ef4d28498428e1072a56db6c3278dea05c57466600870a7e9c62f1aee5a14b480540de08b24224490f7e98e2de9849e64e7e29fc2da1a13e06b526c5a450e817f9ad49bf57a34691f6d2396a6a253cc84e14c8fab6ccd1fc76de09c5b239eee122a44cb641f9010aa55269da6ec59e6ddb6b04d141851f9ff8e18963542ae6f4c65df9d28f4e7082003f36f148e11abc34a98ce61bf9a10934881cb17272e369d37e6462959ed55b6d68d252633f30e1ce6bf169fe5fafd25078f0e31289add6ff399d6c8414cab22c8b9095941415191459aeb282e424073f2cf1a3128b97af716d54a7fe7c1a3f2871ec2acfe699a93da77e4c22f1fca78378b90edc3083046fe0608ea5a2b224a15426df7cdb3e0897a12c0b1224ce2a2bf723123f20818ee9ef42ea9ff620343f1ec10b13dba73b5f2ea38e60f4366fd2b9371dcf46e0c9cd4d7ad6d8b17442d230632549910d9c116425491b283f18f16311d76869a733aef643117ce7e72435f4e8c93c11898b96674c1e55bc8d883fbbdb289995ccfef910aa8e784d26ef3d9bd610b6877db80a51cf51ab1066ffe0feda836799518470664dddc67b6d3acd411c4e4c485933ba3b4441b03a2b54530be1d95e208cd3b06f274a40584acd2a19e7537cf60fc7f0ede9fa731c0d911ff4d1e25ff369fce6a70fbdad8c880d1bf21ff3830f48bde9d9466528cb727eecc1dc5fa6ef75ffbf96eaa1d9f991f7e6a74a7b08e541cff4d0e135ae47cd54f0030fc8d61dc46ca88b0df90ec750a9859061322b53dba18f2d6398cbec172d9ae3471df64dbe6e5acd33874f073d66bc4fab639427d98f39789b4988758d73ef23b31f7238ab9b191d657614ba99fd8843bb2a333e8756dd91d90f3874aa72d58f8cf2b56ef6e30df6fc87ef2095cc4fb5d90f37dc396eee7768d1e95e6dc0e3a5094d55eab15128cbd269fc60039adf59b22fa492316a083fd66066d549bdb554f714ab4111bdea943cf9ab639886b5d61d4b967b380d0d0dea96a9f5767e9c01a945ee447dd4c2836c8634e9d16a1fdcec3d68adac1420f951065cd98debb8dca7f7c8f0830caeccac59fd3e88d2ac1f633066e16abb75d6420881e18718349d39889eba4ddf7218fedffbfa0e73d1fc9fc0e00718fc9843cbea1c9aa3f857f8f105d46a909e94e7162eb7c20f2f1c757f95ddbf0cb571173299a5d70a2917d026fef4eabd3f1d5a5bd0b3f8fddd2074f4137f68c1add3625f935e6d329d85f563a8cef2ad5b8e180be88bd12a1aa245370fc38f2be45a35af6ed0b16ea21572ede1598d9fde9f470c3faaa0e70ea369e7a1517454e0d7cf8486b7d1274453589b90792e64d8342143e38714ba777975aeb47c6c5b093fa2700979a35bd45f5d2a8ff0030ae8158d51f37aada5fc04ee73affe4d93083f9cc06c07f72cecb3522f05c4b80088710388690388690110c346167e34c1fc41ae8ee9c363fc4d906539e30713dee4a1d34fbf6d6f6de8c712f8522e954e2a6d33caa0a0e18712548df9bba95fe76a4cc38f24fc31497942bdbc5d5d177e20c1d6e2a2193aa47fc98eb166ce957ac58a39ad35064a493f8fb99e4e5dc5604d84949a9a4aef470c4eddcba8566e2ae530d29cb378cdd90b23ede0ea958bfbf4b10f06f2656d14737260bcfffb52de9caed5f92f789df977da41460db92fd2d2f7ac498bb796772f92ee9d537bb5ccb779d1ad3829e5b8cca2e45dac23f5a372ad8fafc4ba38e8a0a13dbc5536e45c28b63c3dca965bdb312e8e79cfbdde5ecaa36ea18ffc743acb2cbeccb50522bf2393a9d5bea7ad8559ab9631f673d26e5a5aac4e6b54fe9984d24a6b166edae7fadb1c31de92856955566db7349dbdc6e2cc194c33287bd1718545e3a549a6e918e3597dc52b442bd75cd13a94942bd2ab8356336db90d552b9249cafc7611e6694f56381ff58dd8dda4643a57c19a674fcfad438c26559168bb1f65764a85b245efeb50afc7eb840a7c8548958f6ea3733ac5eab5d0a9f5b88f7a93293c1954cda48ed63ea5526cea1adff3b485d04152b4abbee74a8677cb6f1408f9a14565cefefc48149becd5a526468ff4d447287c173ae6d97da94b0b14e8a43f4915d33ae7863e8167a89731c794cf0ef28452e3c724f4bb4c25efc4625768add5ba4f549c38c3464db3873791aa0d526d73cc1f93a60974b974a9ba6582d71a653251b26b34860984bbbccf61a538d32fc17cda12295f3a1a3e96e875542f9559f687b912cf9c4ea2d657e48a28e1c7c86e5f9d691be3732c2244560b7c4c42f531fcd7be923ac6283880b021832349da53d07e24497b47c187247279e7aa44b9269da42281c8349e4b8b1d8f4a3df880446bb7e63283ea7c0dc1c72314fa46cef5862aa55994657957393947f0e10857e87d1975db394afda524498cacc047238e266aee497f7c9d71467cb71ec75bf6d5e61145881349928222836579828f45ecc265ccb6a3a4eb16d2820f45b4ae5d72c7fe4fd5690a3e12e108f1f3763a6ee83c197101903782e00311b86a708df15c63f07188b4efe6ecb75a86d8b47efbd369de46e7c0e0a310ca125d3122448470347bc53bff696c07071f83503b07d3984106b3570be258fadf6ef6695bcd81c064eb2cb167ae5486296f648d37f800c4ea6a5fc7e6943ae940f0f187d3a7e9df7f9dbb47f5e18774897ab833d124f202126489828f3ef4264b4dbbe65ba38458c1071f3aed71dc3bcb966d96c4c71e9657eabd5a67e5a25940f0a107577ff7caf3a454c5ef230f9847e17542c935dd7a117ce04111a7443c43478c7aefa0e2c30e7548f443c7fca5654ea312820f3a5c9ebfa4eabbe7b0e8fde98dc2cd56cc4892acac15194cc1871c72a59979cd4bb54bf9c0471c6efba0db856e90bee1233ee0705aad5736868d4a442aeb093ede903821aaa35e0a997fca0a121527f870c3223b6e681935e9cf2f4a91218b0833c1471bf4d56426728428cb22040d1f6cb8d6edc7a56999287900c8a524405412202a490758e0630d3ed470b77614193555d4d868f84803269fd947eb8e2263148a11172ccb899114341846c6ec28ab6e5c3314244894e0e30c78a6ce3a9bb8153fad357c98c14719ce7b9965aa06cf2af46a0451711cf82083e2c5e3976ccb9e7ea12ccb1c3f6425c5c8898f31e4b769b22967dd6587b22c487c88c15c9f731e22edc664509645080d7c8421063ec0808c597352262353f6cac7177c78a1dd686e3a5f936fd897e0a30bae9c2a19bad6c4eb14cab2f84a0a100f0cf1c105f53f9efa8fbf961ef5b105b765cec14c46394a33f3a185b7e37bb52b55b57e06c14716f6fce9c4aca63ba993d6f01f0c595971b81b45862c4b1c3eb0f06f887a0553e8146a5d46bcb3ca0abf898c10a767150e1b536bf9f9a38252d6fe67f528f44f340584aad7c7fca1453b24054d7b2699c4b7b6ed270a26a9f3d53b0d8565b46ae59e57dbbb9e6069f9af336af7ead87182d1572b3f539a65934d60bdcfb566d6395a4c483b8cd2a073169e21e3868f25b0425de6687a49b5bb0f25e81e764ce774be6a6d1f49d0c6e47bf7a54c2b621f48e057264d13afa2b4698f61cb77254be7181a45cb18a9d4acad57783625b48aa1301f539eafd48a4a8981ecde6437f2567d940e43dd286bf2a3224b4985a1d6632f475b4b1d4d05c3acdfb12d4546757b02e3d06c42e6287b1ad4f90bf4c379eb91f72fa5d2176f8c169e616f7b5af6e2f09db559ae68d39ce485e67273c7f9dcd118dcc5fa65f8749b75819442e74ea9ad8b9b0b844cf137fe59fee1e1c28eeaa5643035fd29740b6e4766c61875f23f992d0c62fe644ab59ff7d7621527bafab4f872d122b11a7b5beb562dec59e841cb9647172d559485d971426dd0d14bbf130b64cc955d4aa6072c1c216394baee197d1b5f5924e8f18a844c53a5746e447594087ab8e2ed7832c3da78d269a5010d80d08a446ec776cc3a3bdb8eb22ccba2b22c438eac131500e8a1072bd41dcec566ffd88a27c14184bd8dd16315b98eb1f38b95421a904ca86410a533611c0c8601613018000003229b460013130020302428128763d170286bb30f14800243483e664e28282e1e0bc6e1703014088542c15038140a83018170308cc14094c971aa9a0043a892e1bc45e81fb394811bf6c3188769cfe759085631e5c1f7b17b36a84abcbf245831da34d42c562b2986625b4d504001e6d2f1acbd9a401747d765fef17cc8b8209f04ee8b20f20a669b1fbe78044b3f02e7e737f7d8f2c94c08431f18af7b21b2381cac9de0fb21679881063c1529f43c857c43e270f1f5bf5c266f42ec874cf8cddcf30262701e44cdb3a09057f5d7852df4d73e162ca151599edc38ce338312f58c2a7255e4a0d14eb69a823ec4492a82c77f01c1fc95b240909c3050488c31584ee8239b04148eaf39220d89e8305815bc2e98e8e24089b3cf5a310c3ca63bd5c054d94412e0eaa1cb27d4dc0b6b423adf9b8358d82e0d26b6aae84e1a1f866bac77e9ac44b457c20a0699b00ce9f388125025d5879996c8c81a3bbd69349ea8e8f24d1d68f91d62516df47dc7e8022615b4d36f6f3aa92e038d1ba4dd0410ed038d59b51a49246fcb17aeda232e7c40a05c41dacb176f7069bba8a14f8bd38615e7eb0585b8b78ecd801dcf5fea819b4f18adcd7fc81fef539be2e8c02387f262514f8be472198bf5ed81484c8a673b1171fdae4b6adedb156e437115124e785381b87e5d821cb09f500464c799d7fe84f03997b9f7723e1e72ff85880a64036cafab6cd3f14d52f559ed30c5126eab6b625b58af2d31e6377acd18f786bfe096ad881d0c00480c16fa3889dfd9571229f6a792bc1968531bbc458720ecd4e8da642a6988ab8be3337466dbfd67308fd58bb4d9ea13c5c01b6b6a4cb3201103ded90363cedc9ac2104fef5d94313d31fdca9d92356a7e5220fffc9d9a4a14363490b44730da215e3d1f2e2060ae91d7a9c6b2f921c8510684cce406a2662f09f706437eb4f44e500647a64aec932f3d4c0416d02f13f745f0ef8aa417ccf723364e612aed9a73504b57e46152c74ddc7ac8759127cd418f5c48decd390c96da8f3cc10ea1c7f0ffbbd7cde283c6f83873bc56dc78d51b75e2a32a560653b7d8729a669b75223a0fe9c22781320f2a171ad2cda54613f684e3226391b9c85de80664307ff66203c7def409efd840cb6c64ca253b1ef0f0889e52210324b624a890a7c33c1b2542a40002983e3f1bfdf025d26bae000eee216e3f562ea911209f6d0099fd7116fa9d7e17e1ad673dd4e91019809bdd37fd4a7bf2c4c2c032246c5608aa8197b1bf69fa09e7b9f1dc7ac479aeee8e36b15df5d6a982ea3179dc3e47f31414e5fbb5fe6d148c3a2e1956b099ada257465d50d923b5191c54cc412886d55370c5a04b3f010e0c9e8b0668f29584a8911795a7036b41d76189c271698d07d90434a6862f7004f5da005f9b449669f9b258b9419bc354dc6bb8f01142ef8f7c485ca70c1e743c8158a913c63f521e4f58b26fba3dee637408630c1245c51f11ad8b7cd9e97676fe6c0ce2f5d3029ce42ab92745b2f3f88ee0b9f30a82c631ea36e0106913e8d4404c0cbedc89517bf04ef526bfacb85964b8226593cb87cd8992fee173bea47fa83c839fcad678124aa172ce26548be7e51cc01a6098ce74db54be86a51356c5734cf0e247befb9bfeb39fc71c3bd0b33f9f3e5492eeb07a579d0a3c6acf33a67271df5486bc2fd10fea8c966b5fde156db6c0d1dc8bf1a2d315204bb04b4b5279e2b5642c8e053278ad4f040245ed5080680fe3d20109b3796c4026a133b0e1de43663ddc9cbbe0776b311bced42fb30fd9f3d708d424e51c6ba05986964ba3ebd8a94c4d78e88a98b5b8a9caa87bd9e498bda0d918432ae8f84fb9bb6c7a5c48fa02eca9714fc1ff7e44da0fa33b814c2371b236d2df3d8cc9976d6704f2e7a465f323905b1cc5ec455ef3f2f165f5915e06f179fa7cc6aaf812a3ebdf00d21c705c0fb3d4cff81ee758cbb0a5acd236a9bf8e6712415d199c814b4edcb6a2d56c3115942c45a5098432854dcb52a84e518a55efa4d7b3b6cf01c475cfbb9cefb900e9384096e76231ba5a338f7b6111f6a2e3ccbf6a2103db18eb6810da05d8b72a34c2f77ee9ba172a3dd0fb366c40f96225446b41269ee32381ab15316c17e8273e2059ebaea0b404a816392600d9846493763f2c26997d88a31a0c2c39fa17c816434c6e711bd80debda1e35fbb24b45c105e39617b2919c8a4095a9f4b1576e5919eac2078dfb668950085e69491cd5be002811fb26bd8de0ec5f2d3b2b2a3d5d04509dee1d055f95f73dfb4e750e75f97921bf418b7c5ee85640babb7ca16c671457b98a1d5ee124924890ead9901eed4e6579a9bec6f1190095f878c8dfe11ff526395e3d7974b6dc378ca0d4cb9ded903ae1dceb0ea253f1feec683df7ee81c3db29db0e6e3a8c8b016e58272bcf51b253e9f4f0683adfbbed0d04b2a7b70cdb296d868dac960c29eddbf87c4a82d71d501446a8a77516714ed97c8cd68cd2cc54e7731ec1aba4ada8448b55bfd1f83d464e775302a0066a988e9778542313c703487d40a496e5c6d23e254721ca6d2c3d315d124772c8b8b8e87ca0ef0e89b314506cba84eabbd07dde5f40416b1f3d38e228b6b76e8628e233b2a8339ffa20c944332d08754659ed1189b6fab14b56409a80693ff7d1da0b9b2dc41adfa1c33d888513f3eb84fbc5bd4503822baafd7fb5bf4ff47aab1cde245c1b85bd1b3a8b54bfa9e0109826c2a14e45eadeec9d6365f79148c30d0b2362bea4d7ff490d90ddab8bf8f885004e88223f877812dee2ef881833995994951afdca628537ad3b868cfebe67757d94a1ced2ae4629c6d2367f51fb40258659277c0b11f483d4665611b3bf958b05155518da3556a2b5cfa1996c4f60b2e0b60281360bafa116d19a9b872cb2b46c5443098c65130846f341e0af9b58ea7462625557225bb90ac9d22333a8f4d22d128ca9341056639b886e1fbab1867ce32a9f68f5499c8a39b53f4ced9584abd996dfd064a8300140fd0aa7c55e41e8bc1a258683917022b5383a899fd69a4a069195c2da584f9dbb005f3d45f9474a04663be80b10128dc224dfd0b36563ab3c2e3390e0415f9e2f485677ff6fe6363ff72b8a1ed5a0364e1d97cb8928d831388bdd9483c3893c8e95aedf53dd4775a750cd1e5d07ec3d09d8c0d1609ab7886b40e39d2aa00f3fedb232ec358691e9a8474204edfa8ac531d4f4bbdf52360bd757c7e2e298e82e559ddcd81d442c8656cff4504aaadd9073f4087cfe75d62ec30130a80c9ca50e8ae54a7d33ff68eea68c458d38e17b4d621cd41f708f4f075e3312fff9b56505b0dd6d2f26ce2061b1e1c318d67717ccf668953dbaf15ee42a067a2cba14e33f3566fecb5ec5491ce9a1438d80463d58616d865e6a0830454bec450e4792d54c69aa02d95831258d661609efd50b3347f0d1744df69027189425d234d643ada139c7a940722e865d9a2de2a16a741927cac131ba94fc1f1a49182b1e9e2b5b4efa3566ab3aacf14274391a45704c70b778b3c0bb584587b8e3b5cc883e58aca42dc30652b2123b005f7596260de9e5915fe2b93a2596c3ce25dade2a55e506e7c2e08592abc59db5d3873311485bb0c9d1870e7a7c9b7edb3deca5b0ab6963b1f5c858a30e7f58a49670d6ea14d349c358e1912bdfc1d7ea8b8ff0a9514ff6d21a970f474a7ca003be098fe8f77382dd493fc9f17703fd130fd9f5fb132c0eb59df3bc20302334fe8e7f81ec0c86f98211781387e2c628893e90a526399590063690065b9852f90ea9334aa9a6d9b04a0c644bea6fad9396ec7322652f952d344327faf058d9ea46ec7812acc03432dae71e2054514946bc7aa55e160462be20b4bb6f6003b93688ec0fc09f1f60ab15ce5a8414ee07e96c069bd471eb9821304f3d462e138dcfc0bdc26d3176ab6bc15ead748dc407ad200aac88b0b955a4d229086f2b205d9412b7e10cb1c78f629fb009caa92c35c0a1602586042de4463e8cbbcc8eca224e785c92587ac5b78dea4a6a2053e67790bc451ca2a25a49f1e84b1c0e54b950cfb19fad057c7e447f207b568da81a32ef6d75c579de23d67441069d761f3667fb7b9bd70cdb35859cece11f4714fc09c259bfdd05b5f64cf44dc3bef5170e68b14e177eedea6bff200a8aabe2ea0cb2c86db941fd456775efa399860e1edbc5b3d97b8068917eabf8e1a2e74a139c12b39121373b61bfdba81bcb3cb32a0fbe8c07913486055b9c5667dec8ca4bb1faa094d72fdfd3a7240855e24db316a1b5c17262b1df5ca4df8926dfb9878a706a456c60032b45fb59afd5e2e69c33579fd217e6762577f6141c36a253b1fa83c11073b281ec26846838b347667cee7364b26bbfbd1a47aad865a6519838ac435b8ada6e856cda39991450ed62c32767a9979518409afd923044ad006dd5995280627fad561f3fac86329c5e26422565c7e1312a1e1ec64a0652b753a497ea1060e43c41935afdaa5e0ac2080af2d7127ef97dce66519d65d0300242649c6442c72794e58e9e426be95a2e5b68287a2fff4d56fbc64028fbabe820859f0f153a448cf3ad42a788576eaba4d3858bc5833e16519a870ce6830515b2a6e0fdab849c3ae7d51ffd2ed4f25184c2720cc9db2927d047371fa9c7a3302750c60bec19b03610ab3abf272247d36b7aa11c7b5de8e4293fcae4fed7e9f9f98e4a725a91d7089663be2ebee94a7f6bbf07becc124f7bc752a3c47970f6262d65fb5b3bdff920faddebda4e0b3f1f21082bbd8a7ee3fcaeebd7315f4b8423172ed2866422c26a2377ebf3bd5f8436e1fedcbe9a04289ea4856a95361d92bf61541af9259c190bbec3266f67f780e908a72665182d929c161c11eb43a57b71098de6f3f8a8d421cc938501137b116d9907c80b39ccbb527f2568946bfb730e4f675649659c3a1d3010bd8303c031f46b91b05d77742807eb870a827b6a695d6941195b5fc718c2363ce2036961992a88b4d8568c3755278f8a86af6c877fb3b06b22bfe30282f273d073ae3f3e865e24565d5b569cac8a890072716420a02c2dbc15a1414d19a7f82792dd2b0a1bbf699495555539b29824262676f844a5b647fe382d99be863bfee04292908ff4cfb470be38b0611c0fc4bc8fdb490ce83b90127cc5d98959789c20208ac46cb495ed9f44441bc24faf777138d10c5ae1092155d5343b2555a7c9d41b8343a96c80b03e792978a8316d14316937b1b1a49ad1ca25d0bfa61ea34b4fb9b9af33c681b9a129719e40451713077a42d6188286d95cda8c81fd12183d21d624c3555a049cbf42f8e254a952f650d42aa64262ca93d82318ca53a595d25b49abbc58782bea96d70a8fa25e79add0334a0dea8118e2945dc4c24e3a8382c25e417c4b88f228170850c7075c7823d6f2cc8d4263036c854e3f2d149c42dd903c1003391bb3cfc9f8ed6aa845146bbfd38617a4d12359ac28c0e3080c0e91f74cfeae3c18f2e678d99bf6565d83fb8a2dbc5aec5f00f368ee09aaf9c60825390131b238b2e58aa380bf288c9d75115d95a868b466f6c02a234b29d4c3665a0040ddb02b5e39eaed22a8253c87638024dda32afd29d8dd2325d4b4f147f550103a1120e475052b1a7cb01f51d3c549d3cef03c48242a74802899d96d5240b50d542222fce70817ac15a0843ace9ab16012c42b73675cf8295601102fc56baddfa1798f2b89d058996eeff80d5b447f7736a9f4be7016f67abe4e573f60703461088d2da8ce850d8584017b18d8db3a0b75449da4c2f844dceb9149b67e22d56d18d2e9b4ff4927de3558084af4bab42284e3d3f533b24330fd0c8852a8b2b518e0487f6a8006794739dbeb7ab9d264983b3fc6ad70c18671005d72c75a8c9e97f4b40bebc3a44644be8109f11826fae783250b9e83489cfaf11ddffb9a6969eb490870072a6cca8c9ff56e2f8fc43c837612d4e3f2e46263ab537bebebe1bdf22b32fd69e8d9df3b907b5faebc82a5611f640eba447ba75419225c78759dae3840b02f6ec59c05150b7997fcab5ad0225f19f1b05e0c664d785737a61f6541d41a7ff2b4d7bab5dfaac24ac68274becd5d64cdab88f77cafadf43fdf02b784a1cdf3ab30133d229f0918d8760ae16fb1d36c885f89521816b6b3408783ebe00af389bcfc9e595f7c07069359711a3544ae2bb4dcaa8bfad23f0ead6bb7b95fba08d8e602593c66956196f2543756ec9ef4e2ead5b0e8ebfdff5c39659b2c67a34334498d3c9a967b0dffa06bb5a14bb432577a52dcb53f4d8efd71f0882fdbe0477ece29da85fd10eae654a2d57b212929f2a2e4c1f4e0657ea4ea8eedef4b27d63fa2010516a0c8c6b9faf5167ecd93f86f232916cb7cf398aca90c03d085c4e6434fa5f73656eb27f266e512f4d64a3c7f8fab8aa8255e6b7d14dd7c1c383cc29cae18f71b28be3cbf3d7291b29ee34ed1e476ccb989f208bbf17da1f790ffb06b71820a24a81da40bd72c9453d49233fc8f838c2417bec52c23185e9a03371521f51dff2f9f68df57e7a7f5e0641403d10a335c946b262d8bcc6b0494dbc96f64c2b5b08215e4a92a7d834662be6f6ae55955c027b91233e14c178db41832fe7a9edd33c5ba9de4e5f4842953cf5af6c9850630d0d8be1182d790715af667cf3d806889131abcfca9a6335f933c5535e755f8fd1988493d3ed9b2a99a8139ad6e9f82cd5e8a70d12e8e2f684fcbad0a138e24613b327d4d29fec85361f3cd76043441a6765348fe94254e355be804ba6314d884bb99668bdb9ec0b3c08f6bba522f988ce190612618eb715fb0f25c7dd5c670879e01ce863b24fb4de939efba4bebdca13f5d8a5e39201c937281f6a497b4250e0e36eb5c6f70ee685f7226f129f3b0c0b8564ecd4c91982addc2de69c857ff10bfedc277185c0dc7b332bdbe03972f81ed9f955e8ff72b8bed1b77a32fa1a826bc001044d1a01c0a55e95e74aaa5849312cbbf01d8694a12548e8f01782f0c4618a093ab34063bb2761e00c986c1ab108efe9890381e46f4dae6164863b83e10d98ff8a87420d181638bb6890b9a9ca269f998924bd99ad63b3a386dfa8ecf53b6756f046cb479c9a9c13cbf78128ecb3a87f4ec32dd85c187d30a03c48c1af673986d2ca31aa80e520fa2e4e493d8a3d92d443cb96deaa8e558052f65750a785f082c1f50933e527e8508c0e42009ea88bad161d09738d733f8ff1dca5fa7d2ca1cc42bbca265ef2ab10448e0e43abd8321d98abf27c3a5cf77936c18e2ec55074f6b29815bc4d77098f7c2645d34c3f0384ad2e438aec8c365db77c2a4ab0cea25cbfa386d7b30276fdcd0718e3973b1f986887cb440479c48502cfee8fa897dcb22a1a0108ef436256117bf2d3000de76f4d642ea1621e3bbd61f63a2f2dc19a7171daee535190e420ee759b0368d92e490a321e996e86792824793ab333c7d78269cc234d94a3ea396718b0a853c80d05a2fb4a93e1e2f6e79507cf00d3f3893d6fec173f2a1f9eda93575ad693f27645a500c6649468910e7ac35a951c0b4a46c46e199aad25aaa006def624c246009512857a2d43fd2a99cd40148fd84c9d4135299a3c64683f4674136004dc12e36f9bfea7bfc3043dd1f8d4dce3869638af0547934de919d56bab3a1ec5aedf3d7ad8b4226a3ebc7de82ec592cff4a5213b245e7ce129d9f5fa24888886da85e4aec0a22ff00c8478a5e0e9e0b08e4be65e705fdb308629ed863bb2c4cf3cf29468a13012e6a13e14e9631e49350f7e3f5fcf2714640f58fb760fd2f794911eb82386a204bded77a2c72b6c78e6a8cea68eb8c64a574008574aad0cced7209589196e1b83c6e4125cb9e0b9bb83b5ae741e96e73bc312c0ccc27ba4ceac1c30c96b158698a47e70e5f38db1f2b5374877b9ec2008838a4e728520e14d7680457d1465d33fec564bb3cf57d21c0902627f5034482aa58e384977e71991ea5f4186b30c74fb593606ad28fd342f302160d959d5c17f370eb24b0d4e802234a2378b043f317413d5a2b19f2197709de157f834489876967f628ee2c8cd6e1630f83487eb944e0d491bbbae9ff68488c8e936374005f4cb35a31bf6f6bb69c0e3d5305c20527a4913cd3ed14f24174829ca586ab0a779dd162e8bbd92499f9e99c138ae2b56b1f015a736b95039566c64398108e3484d900e223bbd87fd33ad96bf8a4d87c9070f31ad2898a31d51935728c60589e723ae82e2e880e6610711f7094a0e9b9f133f1422089c183cd9cc7504e475fb3ee4106c37b0bed5c2bb1104d85fb28bcfd88bf70fd92e3847c28b41430dbb616bce35c4e56c9c1a9efaec00bc9f11cddaedb864c1559eba0c20e32d60364b7866139e8c0f9f8c8df42bf16a4c135d05e45ce0d5dd4fb113941643397daade79a1021a159a663c5fc9d3cd1c3d1edeaa3c8275cc2dc237ba921023b8c9d20619473f5f559507cc6747c30d6f5b4a5e535cca06fe83a9c3aad257d4501e3c8d25cd262f612d1fe3412d34a066d25fab48e83d227f62efb7edf50d7135ace7de9e03b92838143298941d627a3dc76386a066de53b0752e0ce120008445b4ce95d5b472eab42d71d00a1dce1d92e2c64cbfd8936314c2d01ddceeba7ea837b22e34b8a2a6b24377c480cb03d4d605c94c870e66c4a8455890a26cc8e518090d3464971d548d15cd2d84d74b14392df8a2773c11d4bf9a59e81e48a56b528d779bfc6ddfe54f7bf2f51fed428d46c67c0f9d7f05642f984eba2a75cce5421d5340dd4b0c1248e9126620c05618892a3e9e2c294c482927b242d7a1f15e318908225de20068c123ff080deb8aa27e403e103f30216816b447b0f46a634198a0cf342d271ef5105cb062569e47f48a87be6a2af1ba4560b6d32b5885a679c1246cd82015108649598f7ea8b3b3aaae74b1795b4291f16e04b4cbb6d49d604531b5bb844c4a7be53decc014df5f08f7959175b2fbb1651bb08a57d527f9d62e84e8f824764be13f6bf0b36a41223a34471181f23250184c02d22c0b57458a12fbd7dcb0b7e56ef6e99f40df879380a51d5571cf29173b0ac761c880027f697dfa9af2883db2f180fc80cf8776d2e31000e7b3a8403a2cf835e2d79106ce543cd1d5fd3c4ac9fc68ae3265ea62ae8c20b1fbfbf5e236dc4d08f6b93abcd5b36dacbf3d5f6edb6f46e5b2f6dde68b3fe6df4d4e61d6cbbfe70ecc9ada977af80b742f79ad5dd7daa1de0970260e5bfd0b34da4facd84fd19b8f330d64e595d716fc9209609137ddb0162de6974e5e1b0bd7941ffd5c6e930ff42ac443b0baa625b824bf21b20fc194cef9e1bee3ec8f187e0e7ab41daec709847e575e56fea6ecb46acd36a00acc1d1f7fece12a8a86fec37e9497815bc8cb3ade4d24432074e0e2941b12c9cd4ba88883673a305eced2a13af242fcf88208c23b6c08ea63f31cc8aae3603440baf402446361b3d655d6706bf130b37d08e1c8e2ad9ed9a1e6ee01f161484872f783c7a0d6ab0601bc89510d85d3ece1a8993a2349fc6fc2b430a9a3552a368fc05d3f16d58ed52d7a5286b447871fc4f194ccaa35c46cfc522c88e5a5a001a7f13c39d81244ffcde65097f05f18dc0692b7ef0e23d3685195d30efe1662cef2e975abc9b72e4155f741b147dbbfb114d0fd7237dd5546398b435c21604e067a84d7bb2bf738bb9f8ba9ae9f7c21fc3c95affa18456092faec6cf40167f0710c1e450f15b50504423a732e32c60df57c0e25bd7213c0d1672cd5d63530cfbf8999f792425c65c5961684b6450437dc77741ac85864ed8d816098ea0072405ba9ff599842d6d04fad19e1d173cfa11e6b6f4a524b685875710576e375d259ba2afbafb732db8b674c54172b5b9e0b27443526ded6aeb1a9ed54ffeae085416bc615fc53dedba4cbb79779444141583f65df3ef169136d377bbe209dd23aedce151a2e723b2fe85e865e0d7b971fbca3a609197ddb2a8b96869866c3532b846abbb9e15ba2d6c3a91eee27a261ffd40251e131bd1a2cf93446e70229c05f594d28c0da57b27afc92a8f8ee19a4c8899afdba2ff791aa8e971c6c09c6703df940cfede37d2b09218bbeb6094414e9522d688d16c99b710804494a53630cf6a3784e1828282c683036eb09a206ace655abaf17a15e9163e1c99ef2db63d5f5e9be5a2e6da2add30a4566ff8b8322011425b8c9cf72e48d7cf152e2d8e207a1d310e5fc1385d0134fe2437b374e909d1052800b1270ac01475f3961ded65126e961448e26831d0819b73936d9848662b1a3706048bc2a62b7ec850e411dfa01b35f6944964dadebc9cc271dd15aee0e9e7ab8ab52c6e176752d228a02c7fbbe8185d3b9220b39a6c066db5a226980db7c3b46927ee9a8845d3dd1c7fa2817c04047a486deecf4dff72587b0e6155494e1d9c0e0775f8ad9596302e76cd5af49b653682588b1b214930600324c19d6cff1abe8037d9cab1ce735aa747e475730d66d1781a5be23abaa29ac2b725dc849437124649ab172d8a22e87929da0450d2d3ef7ffb98309c41a3b527b34be1b73503284ce7bcfe810a1425366009cc1d3bdd65aed26ad4bac8e4705664e385c71c4ca309c64ee7cfea98a3aa7ecf18ef351b101b0f81d24a109749e30f3bfd5c9f0c57fd1ebd4724b7085640069791ab1430ee6d23c80ca7493c8b538f7566dfcba23825378a85fbbc884237dc86911a81900ab0bd36186ee3ddad696f27e52236edcf82b35ec7ce8165a397bb6527fe6d41ed4697fdf5908c755c648b5e6e6e91c0445d703396f85d44db6c700bc7750af18c44501da19ab4c4bcd833bbc3bee22068a89e9b173b7921bb1e410aa0f9b51610422ad2fbeab4af41c5ceb35aa4abc4c52aa31a74b3f28d0ec31888b8c2c87dbe4f70af3800345a800c26731724bf4c21d9e9020a6955e0d749053838ec8f94ca900d4b428906d0ea0c4baac850b2f36be91a7468cb85c4c415d1ae1578b7d71b74975a2e4e31185dfc72d480c15a8a584ad39ace0d8149d541d0e71be83094f799163583e986389809b1112b885f1d3e00b3c0a40aa170f2932880366189c04d3b5cbfba32d1c42e1ad947b0df36f9222eb5966ace7d82793b0f87c4d1e7cd8ecc976890a946f2581c0db057c9cef2d857fe246af141a80d2599b0cde506b168a8925929c644baaeb0107e33f4fe86c14140967d1ae100a1ff90bde88182d83d77da2e73058ab4ded3fd108b263a815bc5ac4a6a414f1741a485dea8137c43900ebc8430cdfb17acf70690330d5d7a9bc9c4089d6c3fb296a2b5208ab79c1abde7c7c07174fb16ce4580219140a836373eb2453b1c67c742437c96e57e0853a5ec5bf15e26663162577192b6b6df41fae8ac32afc20e610c1129de19eaf8628223ea8e4b09652bda90f2d7fa8ee76dde019c983b16a10eccbd3f10ff07feff64cbf9b68f7e1b750de301644cf93568a01f7ee2f579903f98aad578ee3a4f5ba963ca92336d06dd68c1b40115d5316ce20a72a5f90dbfa3a9869faf60cebffdc7ff5cb260ef6631d5feb8c1fbc80414e047f113ab35b9ee4252b8cbf2e8b25c9b9b19a6ca11ce40a9d4d37efe1c2f4214e054f8c2e0dd1cc3517ab95231bc9fb2a1f45a2405171ca17f4485bf6c12d699c46d4c1170e5f7002837fb378f735cc26a822ea2d2b3c8ed50dc106ee0ccd42881ee0ba6f92231c3b8a872a1af4b946ecefffd5e8278c0c18c7997787962c9b610b080734bc21d7b751932a9a0588511459e0b27f16ea05a8247eeac755a942c01cc240f12143229eeca52b7d907f0fb1b82472254878048bb3ab3e95c33bfeb51e058a02c8b3401767a80b20cc7c9e389c6093ade031e2a0c94934fa74d0e0820638e2a15b0193c3e115c5c58581c225a5e39c30311f1b417b225219958d51ce514c721380d88a1d31b2b2ae89142c7f92e53c36c7f2c74d09f46ce577b276302254f57d43973462c1b67748c26e8295e1f6047e8c4788b7428a5538c136b95305e2ec12942c768150701d2c4acb92030262ecd8941176827070869631e5c58181e97e164a15bb49e0303c9628e5c60180797744e2776cda1ac74fc215fa5d75e9876f15584c629c097021adb06bf0a505a35f8129038c0d0f672ff347559d58a5519a576dc0c719e6ef761c32f3a8ed8fa03b83600c19676de99fce5c61f9e7d684a0175d0c9f711e0e00ed77eecb65306675c628d4a91339503e9d8eec8fa290d9438668559f671116cd3e2f48d6843a7eecc98d237137abb14c3ad9f306ec06c37dfb6c645d83975505b0c79e3b4b20bd051bc4d05bbaab22865adca54b6c4c26660501d26502f78027ca168c2d7e35b0568977563376ac81ff19789453d365f8f74ee9dabdff97b3ea7dbb57305d4bea8d8db957168f0a8d0b7cd2402c96c9f56c1233f29b9267fd04d3e7694e50b1fe3ad782a3ff76bed9ac0fbd0f77fb6702a8254155add4beb52b286c59cdffbec943ee0faf8ef4dc490fb30e5067c1259f4721237044bb6b0e4400256f0b02f6eb192808fdb709da9f242bfb661099be605a1318040d1384d1abf409bbf1447f0bcbdb2f95989c13e9e13a0b2284df510278a0f01f40f3092150451a53d07681df097392a2286885af9e7c14597829e2d91dc9a728e25b1502c880beb42553db0253d14c2a51cd1ee69bbbd9842fbcdd22c05bafa30064e7396bba4d468237eda6f6cb5469e87a45b70af1a73435b278a585e6098678774c3de6940a12155238fc5d42fb1355d74e2d587b9c550a93c305908b8c38b66546c8a5ac65fa7e6a9ff564bc7127e0a83bdd473750b5494985be61a6c30ec43c56288416ceeca872ea1c0e16800e059975c86b3f471160a857d7b378e82d81dc362fe7e1b8f3aebb0aa23f8a00a4f414635e3665b27174b90503e41196cf5d2cf12bb6f4922dfdbfd16cafd80ac7c56a6397bf8acbecfddff5a63a7586109cd5c7d09760b1edaad8c7f253f3a51d01af30257b9533304214a4a8f44232b1086792e32575d767cd2a8e107c267a716ad19ebc6ec0646eb9e640429f98ba9839e784b5537105103ee2421cd3f548e7f3578520d9771f043129ebf9d75db68a8fcf06a0190d2e766a44c82492bfc438a1c34fc003c9c812bfe5a8281126c71bcb0a701430e8ce14d0ce2776305fc990635a4fbafd790e184f076c8864fa527870d7b0ca7c539711a33cb227cc3548302b9a753204535eb00cf85a63d79adb502486a5fab379bcab4714829ea6158c685035934cf1cfe503316c05cd7d825d5799d36877376a7198f3d11c1c6f2397daddf20765b8680ced5291547566f1aa7d3864acc76d4490768d3394234604d45ede64acc691ab8514ddcb82a1f2890ec588597dbe2986c8dc20630bf08be712521ffa8c7453d3a19c3499885983c0c5be314e0d37909b62243c9673beed4e9ee3343b4b41c213d83891065cc3a9f175b0c31aaf6106f12e0518956f81cc0ac6cdd717f763493f17b2e8742a24f9953e559d204bd0fae76bc14aa741f61a8f633c9157a3f9cd87d19a4d27cca84aacf9227c89db856ea1cbad626968fb57155a5a120fd1cb84bd1f4a223252d92eab1ff0767d894917d819338eaa67ab8e8a9d5946d2fd44ac1324ea5e8a65b7f107f43d88ea54e2ac39c57b9fc40bb8cbd81e5c272a9ad7f268f39facabe6da07db8f3edd638f4f2808f29067e76ec7bc082b203f15aca2dfe2341b4fe7e875eaf4da36494dc3fa689dda3634c3ee4a533cd7a651bfc80e70d80b5eb4e32c76f4249dce9c006cca3afe6fe7f8172c29fb9e37096b799e61e7b21b964744318e28032518b6d05374273ac6dc74ecd7dded9f1dff8ca1407ccee3520d3b6caefb00320bdcffbd7c8da83e05201c8279e0b81699a9c65acb5f5c12667b76ef387b55306ba4d37819ff985d21bafe703ffacd0ec90f22f10d164a424175a4d077f977e140ca45d0ee63068bad3c2530a05dd853e2e736d6a72dc719b20d1f2f896220c7009c6051d734833203b565f660f7cd9863fd8c73ca3dec09bb94f21461a578478695c70d39560f8e0e54b9a16a205df4dd04f9ac1db9234ac326c758f825a1ce694a8982650769cc27338562f620c4e5950d9103e27baf8de709b62715872721defbbb99de79d6775e0ac9c87e7bd358893597baa96854c0f5dfddc785c2a3794eb3565fa31d35a75f4a0073da64917153b93c941fc34f38c80c0e0f1bb7cd48c74e90dfd178cbf0c4a9f6dfe01dd3dd30909e5527866297d69c9cdb9d67caf4bc9ea2e5ccfd91947320391c85ce28e5b8d542fcfc1c2e2bf8fea8cb4fe9754627fbb531b6a2f3e2c99464ea2c74501b40d9c45f3bfd45fbc55421b15c0d26e7c15ad921a8b21c65054e31d5ceeddd67c818fedf2caa21b39eb7130a48517f9a33973a78eb8a00044a9c4fe393a004ab56bbcfe6aed530ae646c33e9f2c52c34f20fa9e03d330c4a529cdc418125f2fcec2899fcd9fdb907b75007e386f1a25740799698468b414a27b26ac1558693b1bb1955f13b248fdb8b196fcf9c57e13cb5210a5811ba3a919d43d42506665dab1bee27cd512b1b8cd2a75a8d993104bc2201fc71086b08dd00de828685152b87981ef36fa42d1220f218b993121a3c1e91eb3de3ff65a1ae85d93f6848b6c713dbdd599f45541cf4ff7d89a41239dcc3d901986eb985cbb7805a7d4c4e45056cd99c16a24aa07672e472edbacdc80f5c056eacc9f07ce4d5754c7d83bfe5849d47beec9eb67eb85f211bac43646862bba3f7187788fbdf8356bc08b2c93b560dee77c4dde79933a0aca62406a92f4fb6cff5b14ed8434848dc0d7db1d2d3626889b36f5349b92a4e913d3e5bbdbeb7b444cfedfdd79be17ee04c80751ec86be66995d4a7ed9bb7b11a4c208759c8791252a6d8b1315b9d45a3edea63378461f7b2035a67b0d89788240d8720523440f736379749a262a26cdcaf01fdeb8de60a179289b49b557375cb2ab58973c8f663ba40e4a3b29e655138414b12e7cc3789f968fedfefb8c72d055b909f99a49ba369d9aa10a2e473ef5fb33c8044d2dcdfffeade5d4f44ac96ec927ffee6cffaffc93477215561c6242ca3e4308551714373568e249a071d525b93b6e9ba34bace0b87aa6c62b81987d5a4fdd32006191505368c6c77a7ea2ac155792fb97053116b8ca043af15d847c1ed755c0c7225cea427bae0ff498220a6d467510a705c4fc2cb0e9da47a648e40994096023932eb9699564b1d221685be57068cf072cde180d97905cdfa3c7105ae000697fb01f4330cb5261c1f4c24f684e5bc5afc4a8185a57ced407ffb9d9e2f983026c2f97e0a5c0d33748476661d0a0ddf93bcf470659bfe9cd0f018062fd349492e40f72558653f3c5619923ec3a20973bb2cb91dbad8643fbce787338407fd2873dc76ffef777f8f3b5ff3e1ad71bd131cdc48528acfcd6fec4633a65fcfd751a30f68ccb4bf43d6500f3384ee3ff57a8ec1efc3ef7ccfab877dbbe4cb659a89a772ad264f8768f9c7c506e71b2c247c3210925c038e59431e1d927bf3a19b2cf2d08d152901830a66efe120094b707c9718061010304fa5915441c0c85a231f358c44775dc4c3f879739dd477430a0e11a058ada8f815612afbb5a4d2c6392fbcfdd01c70ec3f152aa29e0a0f79fde3ebb2053e1783823c7a1b61d4c7860b2001a494be64e42fe2b5b9405cd3b0f0b7cb16d53c5f5d40934eecc6ce49183c5a92c3920165843e19bcd4f172cbc59dea154595442674b090ef6af5ce8c5082ba0cc4f9aa1f888d182938fc139c3b0c702d5f9c36b529a85cd050c3fd7ff4c0f2f79533677c6d0272409f2443bca09af6b87ff7b4606b6e5fd8f8283a36aef3d180b1a52777ebea9ff7afa021bc8853fdf1c4b86ce0f2638fc3666834865f79ac37cd73ca21d208b5e755567a61947612668bcaa027449036e3186ef0f3430aea690033cc3333cc3333cc333460f9a7f105975db33e58af80c17542d2949ee160ada12ee1f001e00c0a3d9ee66df0f7e060139108a0f29108e4828f709eb392606c711489f52d390315449922449529224d1c43301240187114e614bd39958427fe94558dfb3a4bd1f779db6141fe020825e529c99705230c1e341b8318c24932ae976e36b57f686307699edac9af960609f849d0d16b24ff6346e0003a991515b977f71ca6177b257459327f30525ea65cb302925a9fc1bbd4063e4e68e96b969738317e7ad0e6a49f60d2bea8d5d245ac4c91fe4c293c4baa0428ca7fa93a74fdc0ce1462ed624c47ce846c94b626ee02229e64e2d39ea7857b760e37f3a74cc9b78e21e6ed86213aadc634f658d6e32d2e3462d343977aab56a4fe71b2dee8a5b2299713eab4e881bb328cb42f758ca01c40d599876ee72d55ad00ea703f0cc943fdc88c57f213e5cc8da1eb8018b840e27963eee8e466d448403375e614d49e2d99628ba258e811baec0a2e753adea249f888854e06fb4a28e5f9ff3ee74cd75462c708315ff758d74eafc9fa91babf892183be7d30ffda926e1862ad81ce23bba7c9e553c15dd8646857f36e9a20a0023dc4045d7416b762c56ca6d086e9ce2b08a29a67fa5926375c314aea65589e994193a2fc28d52681e2d2651b7430aad62364bcf5c745f083746e1a4996b0ae1294f6c841ba2404a4f0eed1c73cecc93e04628ec2411e5525ebdeedd00457f5be13de529c137bc811b9f58a2e45825b91ead9323222228b8e189523033eb9027cc79f646276e70e2b89a163edbe3c626f29cd5f309e29f53ca8edcd00439eb1d73d8bba076263c9728b1ee928c8888b0e006267c59136773f4bc65e98d4bb895e6d929f611111115dcb044662545c99a95ae5a57e29aae89ca37dbfe299185b1f029bd64eae44ee28abb2dcf6919f2a3248cd226454dfd76f58944e964b345abce7c95410249b5b324279c1c6d7984d972f9dea5709224e56f38829bd81c5de2df625305c6386349d0de0316371a819f9ff4efd5d6da19c48c1e7783115b88cc714dfa6bfd750c0e90716311e5efe6bb73ef8c653212811b8a78d384499bd14454e75159b39b5aa8ce08901e63dc4084413c4aacdc540c6e1c829d70cfea2bb6e086215aa9d12cf91e7dd3322222d26348056e14a2d94f82c646661dab08519266fddca434973324c28d4124dcf67fd4cd175bfd1b82d0e478963b2a1b881b8038e39ba49536d6d24740b8f1073489e1c4f45efe34bfe1073b6ead494942c86b0910df81d7e0461fdcacf7b0b1b4e4509622dce00396febbf69a4fc8de24e1c61e8c16fe64b72aa8d48c841b7a603a9d99acd9dfc3876ab891877b47c2d2f26f97fcc1c399994dfeeb686a4278861b77f04a2e7832493f32537638c6577fc79a201f791db0122c6a7e4939e15f3a7cdebb16df3d73f053ffc69966eeacbb1c4e3fdb142526676ffe033db8118782c719b98d8d993c6498f1406ec0c1704276d42c9bde9f82c68d37bc52e1c4b83287dc7043b1e4ca6f77eb9c4e921e7803e9c28d3664b1f43cad49e1693f416eb021d73ad176356899b76ba83b3ec921e5bc33c41b6ae0b4424cc3c6d7cc0c166ea4c19cc25ece9ca43cd53e861b68b032e88c556a6db42d840f37cea078bf05b728f7aff307c6f0c0181d188303636c600c0d8c91813130d000be61865bbfc4436b88fbf194a151db8a1dd9f4e94a8f24dc204396e9cddeede5bcf3d1230d3663880a44448408711f41ce10f2013286f4800337c6c025d578cfb31d3a751cd0831b6270a5d7df7d2cc9a6370c7d32cfd4247e4c13c615fce00618b2b8944fbc91bbcba88c1b5f5853aecd1a1bf782353a95826df63aadbbe0955c399ef4779f9fc38546a62e624d8cbd57b700831b5ab891857f2b5364c3c735ed9146902137b090f8d1a4b1f41fa69decc18d2ba0a61fe4f4da52b270056e5881bae4e1844d97bed35a85ac849dce5161cbcc1f66fcc80d2a14d5f369bf42891dff142e4f36193feb73982d053cf694e58e594c52370acf87374d95b3cd6b42e1ae93dce377b854be3da1246339ceb7a245ea04443daffdab6ebae44dd8b253cac9e49a8d1b138e653397e48f9aa4e82ca1f05a27cd8eea9a8c4ac8736b5b84a7664b2b09acce46c92b62f9638d84e3cbb846c577dff411d4945a4cea3313344ce786114af28b6acb46fabd5b84d74efac2c7b366a63d6e10a196ede958c99031031bc320cb72dacf665be14a1bc250e3e48fd92f2f41d69302119113c446308c16fb19c38bad9e070d1df8068eb7404484033680515d12bf2e79fe8ba3df66e5563fb9bc7d516578c996d5631a9f5e98eabfdea325ef8b6e086cf0a29c35f9bd61a565f52edafcf1714fce3bd2161bba4043b2c4fa72750d968d5ce49fc492442d4bb9a564a447902167888878d9c0c55a1f93b019d3c67b68e316366c916df6126aba808d5a9ca4fe136e3426031b683f7b860ad270113cc1062df67c5d5294e5740c968f9cd580fb08b2820064c2c62c9a5b3f713c27d53049597827aab9a749e98249d988455972f4248d286d7961c1fefee44e25498a9a0407365e817a4a9ba9b99e4cde157cce88daf4dbd15c6e0561255a65b5ce58a8ac486d572d5ac96312d30d6cac02d910f7b9fb01b1a10aa36bbd9e5cd239b0910a2ac7fc639237a76ff8870d54506fa2f657099771ed53f869193bc524db07197dd8308596fb12dfe3319e7c96a2dfca54db5775f72734b0410aaa2c66f79ca82c66b283513427b6e75a852bb184e36043146e4539f9c247cf0a7a28f6d978cf9acd49cc64a48719437a78086c8022b17f2c5b5aab3c7b95c1c627f0ba3432997f4f245c6d85da59f868ab9032d8e8c423b55a315da5395a7a0c3638514e9ac232a577a26f13d8d8046162922c96586942ad34e9845b131b99e024494ba5b953f86b60b08189728cd9a24992fc5da176c1c625d0984cfe1cd74d78cb29c1181f20630a362c81058f5739c9b8cb955cc146258adf33e1c4ce8c62192ad8a044d12f46f734b9d0da4da2932449b22bb7b6e01b326c48e2cd9494dc706ff1a423e19e389b4bce23de9d03897356fdad8e0f0ff13d22c1feb2c5b29d7ad838e23e79322669fbc36ec846234e628ac97e6fbfada60d46d858449643c6187d34ebf26543117a686775eef28ddfda4844922833717652ea8d1a1b88283366df89323193148ed0c0c621d4f4569df7e484360dcfc10e6c18c23c61b242b3b35ee6f818e1410f3386f8b05188cbe3a89a747ff37f13224b67398465ffef71109ed877d96689fef1326243109609b2aae9ee9a9ea5e1390072868d4070e92edd9757494b1d1111393600b1854e49dbd72c6ab67fa8938999781db9d633dbf0838d3ed0b96c73c5b9d8c0061f3ca9523753ab3d98d69ef96eb16b373ac1861eca41db2df5e48fe1636ce421ff737f8fb9c5437b257d7c98ecda71d9b84355399966e3feb6535260c30eab979c24cbc76cd42199935b0df3c9532cb14187bfdf37ffe85b56866ccce113d3f426372dbf0f4744446cc8c1aa78f72f21bb639f8c888868c2461cd48f8cdfd227b767fe83d77ff062c2061cd01ab7becccd9a376f287665e6c535c13583b0e18692c5e7e82948d86883e795935052eb760c2608c6b0c106da4a90ad575fb3544744441c61630d86b04fd2264db6fbff881ab6b8dc27ed9dac21ac1111911fece3a0d11e04042222bf081b69b08106ff64b15abdbf24cd35222262051b67287c99c6954cf2a43c304391f1fd67be632187828d3228f7e55aa93d8d063bb14186e2afac6ca42ae39fd818836a258c6a12dfa42737222212051b62387996309bbffa2d52b0118643afe4cd8937ef686064880f1708f9f10303638c3186efc0c7136c80c1986372e5dc894b398f828d2fe4d539e798f23ed5520d8cf18131544006079860c30bac5559b6ac327143b7d10532789455d73c3fa15d820d2ee8e667b7b669b3c676a48790158201001cc1c616beb811b26145fa63d30263b93e7592bb4dd262230b7585d9c93572263b041b58a8ade3c9336e491cb98460e30a665ab05c17aafde4e088888815fa147563273da983c58260a30aa637938edebc266bec0363a8808c1f1bc4cbf091333840860f6c50e1acfb5049fd5e828d29f45ab33b966d728736a4a0099a27e5c9bdfe9675828d28984d379c54e9e1b96128141f1ae4444fd3627b425993ac3d6bb1caa4d609787a50d5cb5a13b09c1a93b8a16402399263ff63929666969094d56ee44dc5ecbf12de93263b49768a4ca924a8f13cfb6bdf75976604488f1b00f19146db404227dbb664ae9613a64c63880f37d838c2295afcbed27dfcd816f4b061844bd690922b9933c436c44611c8137f3f942c0ab14184cbf35a90088bea2967185eb68f9bc9dc16d909c39827770c93dbdc2925189db09fba97efff96a407358081fabd47ad9749cbf02f92a4df144bc54c48597d6198eb71ab98a46b4617d4e885f69ee4fc31695dd69316d4e04559ab2ba565dbadee152c4005357651d6937e97bc310f09a1862ece7c6671c3f3d5d572841ab9a0c2cf6fd0e93d4155bf01904d8119357091a0b395272a69fa7d6ff1af879cd85e36cd9790345c04b668bb4c2b496214a9f8d622b313b51dc9a0a1252ddaa0d53d7d31b7296516e54d325249de81d4908549bf9355e5be825824ac9694a0f1b623d6203560911ca524df30f29ec2fb0aadb4b35c9de6cda173c553d1c4d598b7d2d3d80a3c8de5f6e77e95a7d460459a9d2627e950275b3ae280168c2182069011c48c215b841aab48c39ee0f94acaf77d06a9a18a3533f75d2e8b75932415fd9db831a58def29d0410d54bc77b2af65926e13c453241a67bf7ed23fde262bf951c31449a2cb68f6923e6fdcd1a8510ab47b93187347cb5237298a3d1f3f7f4e4aea8eb951e821a22c4f6a99b05014c725a95c8284e6b7170a6c456534774ffba71cd40045169d9345edbe5a5972707cc48c1a9f48ee36ddd447744a45442a30a4071c38a386279c0a5df92f47b9b3be13c426f94a39c5d0b4d9327c08087cd4e0046f72cbc7bfe6c9576b6ca2ee5496b6c36a0a9ee26d4609b88626d49273dcaca8ddedf94c9c83fe5c981113997dc8141e192d257e8984eb90fdf2b378b52d51a4a76bf495f218b512c89594503964b66e901274d09793d7f4f5fc26c1986872148b9be9fb22094349b1628ef1d62ed50c6a4462d7178d93ff21915c266b4597ff083d6a6a8dcd991d4f3b22c9bc20fd390999e44650c13f68b2ca32c23462517d37b708d3d398050b8fcaf904063514a14965c8dc92f2dd1aa89188a692fe46ffbc632993a006222ebd1daf58db64a29e037721350ea107bff9e417a5eaafa96188f2e56a3a57f8cb9c1a8560df6d93850ba3a9f28888485f0d42a43b15bb3445cb9f1b841d611e36532a88929b5b927e2b66f6ae462036b90ce97a4ddf39019149bbb3259eb38423438054a0c61fcabbbfff99fde43a0de6400d3f90a19e2bc96ae6e87ad7e8430d3ed8b6732549c2f55b34a880031a20833d90a0861e4a50230f35f0405eec0d72a9a72eee2363b4a1c61db2fa12243f856698de0edcc534329d7fb12b5b8732ec9cc7e5c7844a35e890e598e28495c5b4d821c30335e650430ea6d9c9d8f9fa9b0992c1811a71405349e99ee127755f2322222ff01a7030f786342b6c2c4c64b43e23222235dce09a6419b55b2cc5eb8c8888f4a0428d36f029968fa6ca9bb21e4ea8c1864cfc2f294954fd74126aacc1880f6b52b699c4687a20a1861a9eb8b431675f6cebbb461af0dcbc143551fd8479053220e30335d060670baba9796deaa635d43803266bc5ecb27133142707dd6856828f07d150a30c98f0177396ce92ab3619148fcb0ddbe62788c906c95d29eaad98f44bf846e3e5325f0926dbdacd9b4546ed2498bd26b3d82749101b096faa57922461badf3dc2276fd8ea4ff77fb246c0dd3de6dce696f298a308fcfaa5579e8eda5e0e2218f9dd5e1e1bc699a2e3bfc685b1f46fa668b12d638c07a3d7a94ab557e195e2c0e04f63c5ee5c9775f25fdc25fac59532413ee4be48fe24c9f748de8b2ea778d5713fd79de605fba3b9ef76472fa777c1765c49f177be7a6b5db8275ced0559d918ea5cf03137b3751f2a51e3e211f9e0a9d75205ffdca2fd922d5ef4d8c2989dd36749fc74712d18379363d3c4a6244c0b2ffd42e77455d5ef2c2ccbb9e642d437aab2e0ccb25fc23f53aab160ed55c792b4adf184c5dfd1de4e8e1383f70a7a2e4e7e9fa0ad39573016c7dc3a6dd2eb5ad1a55b8a12b3cad058c145f17869939ce493b28a835e9c08dfecbfaa0215993a7f398f662a7ecf2d6ad2b57e2954d8295bd3bee5cc29758a3aee691e8f2945c714c88565dfd8fdb79252f039dcc7b9246d55428a448f16f36f2ae9349d51a479aa3d3746510b1d5120b7d1217350cffd87a27bf70a4d295e927350246969aa56ccddea4f54c2da9adc9ea22bec09c3b3c93946dd132adc892ec5a6877ed4bc97139b702163ac28317cbb09bd2fc67bb51c75a39ab0c4132c5ea88cf699f854633a39598eb363c29caa71b2c56c51cb4bb41544c24269894a969243ef64c961ac84b99e757e624a64fd7525e5d424cc3eea229f628e4a62af4bf3e99836dc84239149c17f74d234830f892393787134d474ff883de6ebd4704dd7b423ee6c1dbd6a6d84a9911abf938ce052cdcac78de40617916872d68a676bf93f452059e2a6662511dcdaf69524574c2e2250f3e89672c91ee2bd2ac13fd334c4f9426bc69ce525475b884bf21ca2928f999c27845b3badb9ddfe161f84ad6d714eaa4e39d782a8e36298f63ebff604a290dfe125c7aaf21810a574ad9a3475638eff704c9b9ca419b3f7eb87b5648f498a39c4bedb07eaf256b0900f6c6c0f573aeff1eee18a694623a57d93aa072b55ae52a8574ae6a18a368bd69496c1c44371d6c498a249d6ce1d92b7de242fef500fed909849be92437d79c9d5e1ccbc8feca8ad351d566993c3ced23968d9ab2cd689ca814c9389941f0b71671c74cf71aaab4463d909077a5d2d59ac94d3a6f30d56a8a02fd3d249e2744396aa4ebab0e17358b30d27f14471cb247b9292c9063d4cd4f789199b31d760ce141ae5996983986a307732a9fe2c37a6976950e24bd4749b348a976848fc12b4bf63444a976738cb9e94945f123d936628ef6a7e2837293626cb90d96554cd5a9b579264a0c2ba2a8b74a793720c499982c4dd6f8ad9a318e8e9e85025c9ad1dc7309c5ed324e17430186f54e4c593706a7fe1dca0d7bdf9e3f4ec053645468deffb0f7217883d31c5ca612d9972c188faec9723363bb905b4c6827b7f968d530b7812b2eff64dd20f66a1309fa4a496c44e2662a1726dbf351b0d19c42bf0f2d1e216c2ce3eb44217f3a6c2a6da7d0b562121e2d553553229584885e4b624315dfe6ffca750454b76f164e9cf7129d0594f36233ae7b0a390681f2b5fa566933a50e833d786ff589b2e3fe170d533d9d6ebd93ac1d9a8249b5d3c2dd9262487dbe7a5f18ae9640221aa1f359e9c38e7120a8b535e52a984e4cf95297f44f48f4948ba768fb20d26640e09c96a6e55314cd5538e70b84bd1e5265700232475e5cae7f1d9355d018a80a57eb87b92cbb2740520c229c5cbd9b9cb848d0f430b7da286ed73f55b186cccce92ad35754c07c398729b49ddafd732304c72b2f230da2f2aa13d85f76495a1335f74bd621bf3376d89592fcc1d473ef73ac6b1182f2a4d316f5f925d38de17f34ea5e40e992e4ad927976c2ec8f8f54fd6c9d723c3059f25173c836f647f8b4d1246237cb785293a3d93eab5a863dd06cfef1abd695185b018dbb36e793d0b5dfc663dbf7eda5716cc58e4ac9c7c9ad158609260b14db27c929eb0488e7935a65ad6bae42b32492e99ac27d574d015edc6457d27f92ec5562c277d274bf395b26758e1a476989b4b7f5131abf0b42d49f2ab42bd2c67327d3f6a9954bc9ea2eec947dac651f1891daa4eae8c95e49ca2fa3c9d25b3299cdeee514bb19ae690265a454d2b2912c36f36d14cd2d170147fd58b99789a9736515c99a1f555aaac6342c15d495a73679d390514cdee650d2f66b29f305c9e0bde6da2d49ea04a1039f1b07662aa139f6461e2d349e144f2b4c67d4d523661cd966afd49f95349d1c441d324a1bc5caf844a264cb39c35d1c2357f4c34bf5b2f7f5d96ff25b66462528f4e1defb74431bb363c6ab81dbd12dffb5f94a4a769e394403cfcc768e890b24e6229ab2ec9c48f9f5549e01773d094cf6aaa8cc4916a929999d59824244e59492df74dd9948f30ea98a6be4e294ed01146eb18aae782957a8d70bd73ee38f929d7c608a38d4f95a82d82f51377a53693909a22fcaa8dfececc1a2d11ea66d9dd4eb144328508aed27def9b8d76a50ea1bb45a67d1ddd6c528628e7282d53a90ab17c486fb3b698a43c21cc27d5265e7e4ab30f0237cb3d65d9b9ab0bc2f49a84cbb80391f6781a4f3f19bd0544b2f53969c92597dcfe01f528172b19ea34f4031db52bf5e3632cec03d1a9abf25973458f0f0965de55d924af90ed0199eb4e9115153a7a287a66bcf0f2e09d9498fd3dbc62785853d6bd6839354be60e84d6891f7395d801afe9e8ca27491dd031d9af3f8fc70b2574f833cffe8450ef8b9239185232457eac6fd0e54057ccd11cbdfff089839e44c67308cd493b70b8d3479ee68cb631e70d8931ca0497edd7d4710397d9a4ca5d1b32c1f4a3a5389b67c369329a98b2f484c56b487384ebcca549a706b3e96f46cd8c4948d390a49a5cd365aecc8806d32b36472d4de7cc19dc8aa3a525764ac13283e14b533b83a879ca6089529351f6152fd18888c80e4444840c01b23e826c0b900064587f73ee8bce374d71c4c78f1ffb407c308000637835d3cfe64e6f51420288a151ed0a96d6790101c270c64ca21e5a05c3b73f1171a9570101be6069b49c2d4b31b3f65e58d389495fdde450d5a680005d38cf598af49df5549a216890800baf97a8e1a41cb302026cc177bf8d8c9e4b72d819d8800908a005b235dfc99149f3a6360b9e60498a16328a85c37512f35aeaef92730565e6e344f9982b7c9410c00a558a9b3c88647aae9c2a9cef21af927f05ddcb488f1df2c3fb0104a002adb136d8d9f88d7b231b20c0144a424707b724490029b8399bb871e77b62bf512889bd39b387160a577d8a6f3b8fe5957c42490aa3275e5cae246f4e306cebe7e41f6297524d6893d0adb12439cde9c484d2977ce3937bea1d0e11b28084004b208012d4fc5131d47f67354c92e0f7c63efb2c1102019040c97e994c850970844b58910bdd647a9a03060218c1e4ed55f51b5dbbc42f10a00807999c71932f4979735c200011d674639e842953f10d17700c23693e6e87bad3140d0b43c90e7631c4fc7fadc138693c736fcfdb1a1f0e605451edc48b39ff8b93f0c933b352b6a4f51117e0f0059b2b55dfc5a4f9a4bb17444929680a7626258be1e0852972a231435d2e2967174d9bf6eef77ac888a6804317c52f8b3967d9bcb96a2e6ef9285fd9252d26491cb848b8ff1493d5ae7229b7c04b2a58a7f1d2a4390e5b5831c59834bc098e5a5cfeb12749dbf9a24a5ab452f9e46b4d62236a1470cc222989e35b31ce50c0218b3b3dbca8563c167de7f49e3a7b0320437aa41164c80870c0c2bfd8977c5f7b459b6392bc4924bc56c2e10aa5e3e5d6f464af1eca028e569cd7b3e7f01763a695acd833caf685a8e5d867051cab404af6389b83d788ea3854611cb58ecaad49451fea69a44232010e549419b57b9e92a720bf2e85369fd6fe9a80c31489e5690e9d73a4e7588a63a5181b227b41a30a0026e0204549325464c89c3d7f8ec2dd9cf9d67af1c31ac0210a4b574ad6bc235be587c24b957cb5e52f26491db1000e501835ab3fa5a83997a99fe842c718acc63de4898db890207b868848057078c2f34a4d5268184727b20b934934b7e0e0442571b27678a7ee938263139a6d4ab28a8a9a38f7be46a7a4ce80231367fe9c96efee1722830007261233cd379749bb9cc48c212d20238d2043807000c725684db93a0593c5ddfd36a38c4403005ac06189463bdbc71cdd93c7201a382a91f8c9096bd29d7b724fc04109b2339f7aa89cf84e018011704c22ddb3d891cc52a26a4270480247241af150a739c9887f6aa4471a1b648c317a0c32d880031266f02ef994a32e4c362222d26308103f41fc0422221bc0f188b24fe79b3cb59c4a1c610110138888f8b8010e47285a6652f6bc25d47f86a31164c66476c25d81322a800132c868328eb7e0c78f2d4305222264f00007236acf39864f65bbaeee8888480534408690068206193fc0b108c64c67e387e68d6951441aedbd528a932be04804d6b93e447426de9434a959e35854c07188522fe9444f0917c51cf1c103128ca181315640860a7018228d988bd4ac9ebbe2380a91c7ebac5f413322a2021c84b02fcd93d6fcc5586de4043806f155b2b89292183d7fec0d380187204a699218a3f44c6c76c750c1182510028e402459189fc8ccb97f7d4068a2c92197ae7c56ed3f24e47dc4d77eccfbab1f3ccf1a67b3957c3d011c7d30eba4df64923464c87cb857bb2db7fee6cf0be24078d0011c7b702e43db47355be5bc1ecabef963738b7a3e3b0f6f8a3997f7ccd5e885073d84a58a7c7ad99d8c88886c00c71d9eeb14377192b7cdc9480370d8c1a89d525d2a51b684f40c1c75e8a4ad9ca35bf420f706a183ddd12123cf63b435cdc03187379b6ef6f06fa4070e39d4be963579edf5999ce1830734c01107c62ef4c95c98a4e18103f11ee08083a14379cc2906f72c1a38dec0a698d4f11782c30d7884a590d1ed4bdeb481bbe8b497356db52419111161831ed463123baf4170aca1945e8fb5931a52f9e015bc3c23222269780e7a9881230d496a9dd74dfedace19178206c5e39dbcf1cbbca62e03c719924da3a7fa246c77a87ee030c3db264b7a46d65f864db6fd922ecbe7fa840cd56c67934e54b3f31e11113103480f83630c96f8d92e9f621963d40638c4709ce899299d7fdf85418953efb524679a3f7380030ce5bef52aa974e529fa85f37ff6bcf681c30b678c1d2a5669e795942e3c1f4e38e96c673a261172031c5c48ce0c1d972effbb21215bb03fbf2b839f9ce3de8888c810213e7ef8101f233ce831c46fa0053a7889d27144937806471628fbccf339e4fad288055309219b1b4aae5069b8d451327d9638acb0d9c9260972327f1a1d1c55f8d583eeaa6c6b26958c15e0a082f9651e272babc4471c533065d6a6e3ea598e130e29983edd76c5dcdbd74c1938a2606a84c49dea49eb09e9b102324e100c88881c20692438a080e3093d70380147138ca9d4941e3cc7a41ef103c40438c0c104e7f2adad764b4a31e258025ba631fcb667060d560187128ecff155226767f3260a389250ae782bfa31353601aad8918a53f9e5cfb9bb538eb98f1da8a0a4647b26ff7f455f46769cc23c156c9345cfef30459bc72bd6867e4729d00a9ffd184ef4144a9eb083145612f91fcf6bc7280afa9a426f8912e6b228ce4fa2496a284e5d7d9a334b4686bc0314477494b47eae6e0dedf8049ee55acbbfd5d2e6a5788292a431293a48e8aab5a313c9ab8713afa56e64e4849dae36f64fda44fe5e255b86edb730191111d9a1893acf65b2d09f4c70626a3ef12dc6264a30717650d51227652b9c2397307c59d4870f11e7f30e4b1cf7d9175ff5febe2f20eca80427c99e7179e311119121427cc88e20c80e4a183b95182d16b7c08e49bc394b9669451245b4796b8efdad5424707df3fbd4e1b352dca3083b2051cc2599a83fcd8eda23ba0f336f6229471ccdf6627df00cf9f70e7634223123e39c6498116a85e9d33c1a744c5e04274495f861afaebd55841ad543ed2ea967dc135146498693f4436c127221eb3f7620224b9e524a854ae2fe07073b0ea1486b9cf073bae6b1218893e63d26f1356f922e44b2bf7d5f8eaaf93335d2c3c7eec04790337af470c00e4224c5e5a8ba714db070f9f1b7631007b91265ac52f2527dc4ec10c451552addf5c86709fde0bd8119234880904d40ee084461337c73bc93911bdcc08c119c61460944446e60c68f09ec004495848b1abf5fc36a6a64c71ffc1017e23fa7b689b7c30fe6b3ead40f51c88e9c8077f4c137cf25cf6ece3c9bb3830fe63fbbef68d3712bbe87a3786659ab97f89edda107328ded949e6416cc1b1111f98146193fd0208188888888101fbc230f6ced868a721f173b8e07d3b8f7c587bcb994bcc3eaa7653a15a37d7d3bec600e33e7299e78fb19dd5187fa747e234e1c13434f63071d1276d63dd98b77923d40d83107eca2af06c96c053be490e5e452d36b9763523dd811074eb04ee12479c383ff1980c3d173df9628e38888889037ec9a59da2cac3c7655868f1f2ad8e186342ed76b4d8a21d26a83796256eca56dbf9fb0a1e0e91f4b084d155e5a43ebe63994665e8c49123598b1266474b298a42447831d6928b7c3c512acc025682c60071a6ecb4ea25645b75dce19ac9a0fcde31fa24dd20c5525317c6a0dba9ac61d6520b5435f55f8d693090044d841865c34f796c7c534730661c718d6ce97dfc3b5f8598e90fda10121ec10c32a57d525ad468fd4d3d813ec080327e7baac26d77a98ef08f151c60e30d47999a4bcb34b6dd9f185452fd3899ac79e8a777881df2c7a174f8e793a1464d1f0c08ffdb1a30b26dfbd249ddd4444dfc105a724ab986c136232dbb18553c24fb652ca1ed3dea1852b496e8ee5370b8d64a7f9c80b6e42c90e2c582e63314487765c818e5a1ed766bc65c21d56703a5ff95712bbc5bf1d5530e8a6778ecba1b4a467b0830ade7b95773c8f16e514540d255f925bc35fc5a5f0c97325b29f49ba7247149c9efb8a1dccdeda6407144c25dd754a7b69d37a4e06901d4fb03f37c7d64fbea8317e461a2b40638713f8bff5143aa927f033d258c18e26983c7fb353bafd159d0a3b98b05ebc5678e6e61c63762ca1b039fd6a73b6a7cf0862c609d208b24309f78efc8fc5a49b2d33490b2cb023095e92ab3589b213bae90e246ca26a93494f3cbebce308c91b3b255b97ec30421276f92d5a9d101a32c90ea6b0a3085efb64fae99b68f60b7610011f4b8266c89aa99c0f83578b9339797408a3badeb8df74ff126fff701f1d50828e607c9727fc4287accddd82348600c0093a80f14d6fb81fcdfca2dbecd6c12d6cc6a9c3179918767e37c59839e6ac40472f12b263ca5af92a4af93a7871924e969593261dbbf8a4532a0bd1396bc2051dbae0b6a45cab984c1ae96041472eba3c9fef3f59b15127830e5c24f961cdaab279d6948e5b346d266f0e51d19f3d5be0f99f242ba3f8c9a18e5a9851d4ba4c6c57970a2deaf8be92624575cc22414c0c55f335ebfcea9045e2e9dba7644933a555472c484bc12c5ea96f8a1916b76fca26a76d928dfc0a6fac2da746c615c7f8a87ae9ad3d96542bdeb8bc7ab63a2bd60d9aa3fb6f4cc9f62ad6e95896dc3c445f5a15e52561c2f5924ad0910aaf92a45a62ecf98e411da8309e5b7776e8a1a0e314ecb9271353123ee3673a4c717c1fc9bb93925c9623e828857134d8da787c056f49b1e88bf6656747a1b9c7641b962576a78842ff12567efa436c7d3a4291dc79a7c2540e8a244fd7a92bc89a57a6e3137c7adbab24dfde5baec313c750f9c35a4ed56fb23a3a516f36413bffa6480f278a7937c97cae1ccffb4d3493a2e9428575edec8888480f1191116020032618810752a043134a9514c49318f37fa6474c4726ae123b66b7d9b4c73a30a1e312a624a8a574b3c15f333a2c816f49d2e7b5c89b70a2a31294f06fbb53b72b633c131d9330c9c9bef3e5a54b13d32109a74bf2528dad8e48782725d9f237e76db971a003126be670d164b99b8c29113a1e81e5556f86fd205bee107438c213344c920d3d6791af8f6c0f336ed003083a1a614ebae895c7f41f041d8cb84a432539e96b4962f6e858843973260ba2194a9a5a11cb74a49b48bb021d8928af99584936afa89532b28013e84004fa3f166161a36b8cea38842796498c27252925d1dd800e43903737996f357cdd2f44f256e2a5ac91bb9527c41e4d4c4ad3ddebbe07f1a9e6cad01b41fc627db28e895b9d74206a8d12b44f364ffc181088db27b92dd426f6fd8395c4774f3935ffa6d10fc7cc2c553d6124e5eb431ad115aa64fdfca9e103a5964d9227eadf3c7be87334fdfecbc192ab07ac3c6eb214aff4340f5e7fee079337ce8778b0b35b422efc2e6de50ed68692aaf2adfa63ca0ed6c698f12a9a7013d6a1f0df697ab3e7f44ae840abc7d84afa75f1994339192b9aa19f7f241d7230e63c512565c5eceb75c4819cc91c4af389a9579e40071cf27bd9122a5e9a556f444444c71be88ee94a7be6110ce87003e39599fc2e8ec7bd75b4414d82acd49767a402630042071b2eeb923cfa3b7649a98e351883764e5973f0e85c51839ac433f396cea8b774a421dfaca29e4c9474a0414dde96abbffec27b1d677864e64edaa0ae1fcca3c30c97aedfc5f792ec245b47194eb77a72ee6e62c2a7830cdac929af630c6619b10b49af942dd1218636c9f5f3b69a3f7cad230c697091ab8cd19a8beb0043429f601b4b4c270693747cc10d376533e5eaf04262ae98637fcf021d5dc035dd86cdc77ba9ac830bc4a7d8e8152fa7ceead84226fce76d4f256dffae05cb9218772126875d5247160c173475c7977460a16cc25485fdee0a73e9b84239dd1d2a8966f244a4c30a6592da53b6ce967fb33aaaf064091d6a995e6c261d5438a653cbde72720acbcbd03185ae37bb5cba24558e94031d5228d2efc4dcf1672ffe3cd01185c4ba0c61af172894a4dff14f926d9a489fb0955882772ad9528ada0945995729f1ef928e3c2222f2e3878f1cfc40471316eb8da2a75a67313f4407134849fbe05942eb5552c81270d1d5e029cd3f99b8124a4f4b7eb2e55f37b12494a65d6d6fde49a32544071292a4d87789f88f1ea3e30888862eb12f53bef82a880e23ecf7a1ce82ee49f5c98888880f1d4530860f6e2932bd695b3a88b04bdfc9a55299de9b32720c83aecfef9b4ad21d9784d126ff107e2974889f2318596de557787eca2ede2007308cb8147b71454a437e835fb8d12f49c1d71de91cbec883af45e93157f97b44444488192322229ea317677bd5e5947d54531d1111d11cbc48bc94734f2c29e94a9d63175ac7f0b88c6d6d63e9e209b14e27a78fe9d7930b652aed55b0984c4e212ede8d66a767a99f53ddc275b59192fd2fe5b485dad91a35739fa3169ec5247f96202dcead4839c1636a27db083966714a9f5b952f4a3cf932841cb2482cc624f335fbe4cc118b4fb3d62dba49924f9d0316b4f6bcb96be802395e91893e279ac9ad2f33e77045a13177ad40c7c463ad7b3e39fc20c8c10a4a5adf10f15352a5ae8212c5c43d9ffc2a19a38a4d12d27be2c7d37bb602395251cd45934bf20915e77b96247b2c4f51facdf856398d78ce8c888898338525bf7b6e1a493b61721ff810c2023382780c80985102119112e42885292bbb9bf4492a0729febca1e2e3cbf295f828ccf429e9c43c9b47ad203e7282acab20c8101588888882137c33e69366fcf259460f20fee30c334e289c0f9d82d5dd897be7057280c2b38dccd12da6d8b15220c72758718f1a3a59a624d79e482daee6f075a1237b03710be4e8845b413fa7cc539b044d8f0de4e0c449d75366db9996fc01e23f7a6020c726d01c34a73359d4494a46e5d0847a97297c8ea9aacb44f6f596bf6251e55223986846ef55ac2fcf461bd920371011d921db3d2ef15d0a259ea2c7ae243c440819490e4b74a93bbf5bb1fa6db34a184ff8ffb9ec12eb6b4309d635ac9dc9272ef62993285dd4b3b390cc5e26e53fce40634806724882dbafbe8d0abfa39690489463b23c39b7632b854644444a8f1e374083bd2191989c4e34f1a4d4f9a48c88888c91e311a4ef989882054f6af21ac8e108cdaf4c30b184aa10ef888888101191202547234a3929ba329a26a16184a697c418c9b039d98f888804d99133811c8bb0dc3a8652d97c5a760e4590daf91d69192ec53b92885e5b3aa754ccdd2b4b200722eaf8d2b16b32a5f48f0d7203df334444ca086246072cc72114f5ca154fb212347a0c29e31f90c310658fe525cbfe981feb610e8d4260627759efaca38578040484287977e8e5ca2e9e1d042b1f2c2be5e819fdba8f17115181480e41f4269fa9fd9f94298e3d828c9c320281e9a53ff1cceb3d8188889020ae821c80f834fe058b72396383f000081a7ff04365d199cfdb1d06c8d8400e3f24c8979fe05973dc2873f4a19ecee4a369a4fbda11ccc18763ac4d8efdd375a5eee1b0ecf999e47ea9f4107239f4b08d5ca893cf548b4a8e3c24586bc8d2d047f0405d58868e1e7521a711111107e4b803bfb1d16d2bbe5ed2ecb0069ded9c27b425c2327c88889481069012e4a8836b31bf92e7e78c499c0e8b84497fae95a4b129c71cc80d76c936a597ab8f0f207b02325290430e97a8d3275e6e994c1a08e48883ba26516a724acdce11c801874c3bd879daf6933bfe811c6f50b2436d96e95f6634871b8e7917333f3f2222d26900c18088481a4036c9d186345cf6b9ace570fa8f88882820071b72ac214146a3bc05fbdeb4070d0211112121c8a186e583542c2971472f1f0912c487f8d0808848bb8f33cc58801939d2505a0e35911335367472a061bb7aab9bed98c7cc111191213e7200c44790112114c871865a343bc247400e3350fb12b6bec173f6b10c658d397ca790c1fde80e62ea3976e58ce1897fcf12cf505bb5c921063ee57787eafc2729382222d26684812c79935829d5f78649b71960284a6cf56aca173e6596e30b8ec409ab613188a6c9487b901d2939bc50ba0b675259e7da98638e2ed0122706ed14fa376a3c30e3c78f1da91c5c6052fe3b78febca7d58c32cc0872c6e5d8822272a96fa23432460e2d24ca46c6ca49ce480f33864420471630e953ba4ceead90cc488fe363c80e1102811c58b8c46c95cad241e20c8888508e2b7ca2279857484bf2ab233f725861db8aca31bcaade25f7810f2120c85185d3964ba56e0b213a15f01837b4c48d12fd9e427bf294bce3f9c275a4903029d7f1d36492e5287c265e5ff265c8761f0a7ee797e4192e5694ff84aa3fa58cb1b4d682ef84523a295b749224dd926f02b5696fd67298a6926782eb06c86860c125098fb194573cf2276add892b0ae5763d5ec2ad48f81cbd2b6e9a5262567072c79c6bfa55acaf169bc7ab53bc558195e578613c6dbc3b157a4876af6ce8bb0f2a78d1cf797982a8784ec1068d37dd31056e9af93a255f5a4b615f1e4de164354b2d294c397c495311be9a1c855e11af3195bc665014f4a592a762688c790b85e7563946fd646d624081670dbebabb19af4fd866e14e9394f5c4baba1f6126db097ec5da92981e7ba1e584dabad9eaee23f64d24a5789ad42a4dacb2bdc124590b9dcf447e39f527fa98f8ba82965cd1cd4dbf44df3164deea24af7f2c410555cf2958fb578e5602197d0d4daf9745564a98135e52d0a895724e2791e017a3a5ae44fba692e82fa693928a46e24a929d2c7fe7fa8a42c2cf32f14c8c99842ad147f83ef5e1c47f97f338a20a3d999abfeae46c23ccd0e4164b8a995c658419e357916e75952e4235c1a4cae15404abed152f59d7e66022be2a3361b3467dd91071189b93deb5431c6ed96973e69fc50c71e7c88cfaef941c538824d9f267ca689fd79284482fe4b64d7e2e4fe520be4b7d1b63f9fb5a2988433e953cd1faa9aa0c8466fbe17372539c4902e21c3e68ee31c93f98d366bf37bf9459927e60bae634fe4d0c97b20f69f2558fb29e753b1fbedf94d9a45b62caf79065b7cfc1654e8a1d3d5cd26bce54e26bd59a07eeb2fab5e495fc493c6ca29b333e79872b4757fff62de4b403675739437950f7b00e4ac8269df5746e1d1d9cbd32134b32a9a46e0e7fca98a56de440a5a7abfc1716f638a0c19345644f6b07077f4a3de4058d49a8bc01cf5abb29c665dd4237341267e14dbe0d499b262d19678362c1841e13ad98d36bd0e4601bdfde6258590daa79869267a366d5342c6752673cf5d06054dab967a9674def0c5ea5cf9d2daac64e9e19b69824937c93338d796548d6aeae3585cb793c326c9298d377fdfda4f1c6b0a579eb4edb57064f0c5f94d49c2e5de87b1706b336beb5c40e0cb6858c998d26cd96fb022687b58995367ca69c173217dda84ead4b52d785634c552594d8d8858e0bffc7efb1f1d49ff62decbd91f96149f6752d58f91f4f34f49bf4b12c98339428f51f7368d8b0708573937d4f0c69d7ae4079bea0d5ffad256a56286f496b162bceee6655e8e35b7a2e95b56d4685533a3605d3648dbbd6fb9d149342e2faff4b4568899345a1fb6cd9f9d146ec8782bfc9f793a72beffc13dcb86b71729b727627681dc7cad64344f62658a2b55afc4657ec4c68d64d37df9878b15e823d155d39a9848493d279a479923b4dc2fba7f1d226399b1409a592e266ff23f0d5926e97327e491aa19857bdc3440314e1dc759a4e4d4a239a018870697cab482975b70c63d1dca02946364f4518262b0dd1f379192d138c273a098c37a673746adc9594f94579c3eae54f69e37b5f1465935495f65e24e6fafa6e31e94b9c179c5592c22f899999de051d5bc563dc253139baa0730ab59c63d39b9c8b3a5fa60bb5d1c45e71b16fc86c9dd65bbcd9e7e1e4bc3763da02b18f136b5d62895d2dfe3cd924c9b7428b5c67f6cd720c993665164cc99a233a7dca1e5364a1646b68682b13a55262815fcca13a961458786e72bcf5d77d969457bce157b34c867f0e1557509536e4a66492b07e2b4c8d9b934d86d0a4b382729199f2d82cab575189a1b934846613635524c60cbda1cd42c635157d12ce4db2767d5751617f96bc0d6a41da3cc535ad9da25d6da99942cf97d349e1196e2ea5e8375c8464fbee5648b189afc142c9e249aa519867ce3565a2604f7ecdf9336da524a1a0c7734d3ad13fa9041459a5da7d699674527dc2dc7a995258d633a1f244a255e994f79d30b45eeef07b3b31cf89cfec6d66f24df471ebf3a352f7a3897b362521349d09df3f07134a7ebedb4a294ae34b9463a6d37db7b7762d61d656c9345952092b6336a144f661e7c44e615127c924ca594476a3af9b9c249104a7977f669f1397248984a627a78fba25e5db21d16c8cb996ade6657f44efdbed39590ae5ba239cf3d47fe96ec45effc92c57491d1d466ce9f9c6826a4a1e2f628dc1565ddeaf265644aaa91a19c6e325d9449472936c559356ba2222d1625ad0704b6ba287d83aad3596a4214e9e312761d348e50b71dbbe8915c3f63f24c4eeaea93f4cf4dd83c8c37570ef685e5d09e2a8919f4c12cf4322122310a7493994d89d78d3a518803874e62426c14e2e0d1f0762fc414fdbd79f2c539a588ae10736ddcfbca849b12fd3074f334f4d92f7b7fc440c3efc1d1232ef62d11917630f4b5c8aabd271535c0c3dd8137e351b7b52fc744444240f7efd7fb547e578c8e0c1b34d492aad24794d0bb9432668c78fd9a44c4912b343a659deb165e6dba63abc9fad8227d9d2801874489239d9d399cdb0760e6e77fcb4efb14a799403268bc9d2d964132fc5e240bee6db7c3925fb8ee0408af4cfd4efe6fdca1b56fd9ebbcbe11f4edf80186e20b4c3f5c58eb4ff6c1b1cb17872da5131d850f694542d6e8719d780aba9ac988692fefc2168a801354d5aa6b9648fe2488f34e4a21e639f98194183186728cf44d69a9c36c39f73e99414334f30b11f6794018234322044c89e60054284ec196294814e713916e3971d928fff1680a0031de8c10331c8e0a6ec911bdfb6c4ee801863a84b9849dbac16c5f06f4a5ad9d35fdde7464444ce2a0ca65613ef120c659861c600c4f84203f1c1032068ec10c30ba7df144ca2f5e27a427e788f2066a0185d28daa52635474f675dc88a8888c1053aac27b953c8764962437ea021c453f0e3870f11888898e10307626c213929059f333b0dc96881f697ce3d99ac64cd1192053c346d77fa5db38fb170bed097c14d8ac8cc5e41b99d10afcab9db99056258e18f26e5ce5e0ae1d1a40a7f495bb84977425eae0231a8507cbf75ccf73ad91306624cc13449b24cee570ac490c232a5fdd1627fca981e1111398118515846df5755ba4ece1d28ec579e32e33a22225202319ed09875bfd749d125762322226238a1d4d4fc133d670f51204613ccb1927cf18f400c265c925d749e0d09f303622cc1bfb9d20c15cc80184a502c8ca52c212ec30362240139c9738c59f9e78018485853ca9353ca21dbc20704621ce113a3da450d161111213d80041181184648b44df9337cdb4ab2c8408c221ca6b77943e66c2e8d1844f053f894aa256584c730c8f8f797525f6118dc42ead80926491a0b065179b5b1dd041886477eb0bbd4f27a79fca20aed41336ecac317c65c8cf165a6299689011ebd78c7e62c577e4d9ed320133081444306c683175aa524adb5d7276a6717a524cf78d078c209939e71c6fe80872ef23c256ff618fa83bab9387d25b1ad3c279345c2457e3176aacc07518b6ed1ae896165b2859e62b9e5e1e7ab36ed3dfc0c338e900cf0a8c531bdbe4c0e9ae671fee0418b72dd2a6b667c44360b74939c4a8afcf550b70a1921e0218bbbdd733dd56d364c38e0118b53a61fad12b1589f61919ca9d1515392b63c7a45969d96824f4da9ee4078b882cc1d0be719d6d16239e0d18a523c337f933fc737c58315e6f28e2926b35771ce14dcf4acc243159e249d98354995e8faa722b9939f70a2a7c8bd242a4c5e21fadf9298a4db9cc224f88e9e9476989498e27082859d6f548ae7a7663c093d29ccd0dd78bd73795719859dda62c7b43029899b2166fc5041193c4471f4602b1f1e85c2f0d7efa1841293249880620d8b0c9bbff2893fdf8c8a274b72a7db1367718f9dafe37ebcc7a3135aa7ee18bd3f9ca0ed2fbd329ae7b4ca26fcd9cdac165b2d42d304b3dae993709d39c52e13fdc7ca26f978a8f41b266afbb4fed2cc147d018011785ce23051bb616942547421f0b004f69792e00e7cb4087854c29d532d694d793e2694307c92bf9417d929eb4924fa650cbdf2e9f38425918897a6984c427d4c8098e123043c2271cc270fae6d6249e220e001094355d589a97f84c9bc4bf0184f48dde88c2d63033c1c4199dc2b8f4698536145638c8ce03287c7cb175d4461b59afb3be8b4953c1491f4a94e924c4c51fae48c3486a4e0023c127127a14326a94b4a92c488603ebb94983a87e8f2105b4c1ac6e2a5d0e93f1e8630c793c3eace39222222e4878f2168248f4238eb415bee72ceee4d10337a0009e2438068800721be925a364f3a87f800e243c8b200081a3d4444caf032068165ce25761eef4ddabf6fc0cf486305cb431026ab6b13735da75c07c2123f2dd7939b185a407c7d2bd74976444464480f1cc809c818e2e3c7192a0832a4063cfe906478eb2531ed87c2a8b5658949bc8cb30ff97dba4de92b1e7c404b8e277517736e9cc71ebee89c24f55c0f9f5e30fd2a0f9f4294074b2fa538a0017840dc3cdd62adb6427b07f3b77bb4942ffac3c60e4b05ab4fa2e475602d06f38c954cb9ac15f0a0c37a1225d895fc6f26c4630e85bebc6163b4da53cf0f33cc6016f090c3d25e576979d6fc7f3248c0230eb9d8c6cee9bb63c5118d1f1ee48ce30187739c13337644e6b6e2f106fbbadd5de62e95a92343f60422222343f60c119134868c80871b3ef51c2a257dcfa3191e6de0b624d9bbcef16083e1962f9e244db24997352c5e51e4dcae15f050c3b777e267c5acd9a44f439329fe47955877b7a2e1cf6bd5e2fa194a52b7588a999afda219c8bc143d4965e1b796321cbffea253d222bbe14186def534d35553c85f3cc690a68f26b45954fddd27c0430c57679d504b7f62cc3f0c67faf794db3d621e18126de4a44a35fbccf0f8c210216804e9d1e3003cbc6049524a3132b95ede982e546247694d577181cb7632975797721e796ca1cc95e6299a46afc95a402f89a671e2a3fd9e0534c97fad498c4b1b331e5868a7cdd2cf25b13fe6063caea0688c9accf246e9ed38c0c30a5dd59688aa011e5528860a1aa357125d43d303ff4010e7811923283ca8603a41f6f35ca749a54ee114d6524733f915bbf4101181010f2924e6f6ff349782808c6e1df088c2b5edfd267da46e4cf380021963ae635e134f2c9b041e4f305eac9fb7f8f84d1525f07082a37f52fc143dcab4c7a3099e4baf6f7e0a0f269c3ec7bafc7f4977353c96b0c9f95387b09f8712e893756ecb3c4709f24882b3711ee6f340c21fe3e429fb1c1e4730c747264ef43dddc6c308949c2b6e7b4eafa97d1e4548d6d2382e61e17a331e4438fbcfcdddc79d4f9d61a4a55e6ed2091bdf83c2d8243a659750f22dee0846965534c6a514189497e469b2bd4699f42f4c2d7d337d65fa6a7e61872f988acaf79e241363da56d8d10beaa3c3583ced4b993ac20e5e24c555e4cdc6f88a294dd8b18b36d24ed3a8d57acaea829c91b314323c49c2c98e5cf895c7d385ceb9c1eb1db878b5e459eff01a35c95b3c7792eec62cefb0c53177fc7ca627b530c854b43ff9a4425d5a54727277188ff92e6b165e8598894d91451f4e775fac8cc52968c813472c37091958d09d62b00db193e48e9760c72b521f2f31597f446a78821dae48b213a3849dbcf60aef6885b92d97e5e4b0dc7ab28315a534e1937b27cf3ce22a8e9daf4ad2ffe6ef0c1a670001010e76048ec0a8e4aea2e1a1a1402410884461201018b23b2d0163130820384c248d0543b170a64ceb031400004c2c1e4c3c22242a16121c140e0783c17028140c8602814020140a8783a1706b1c6689de1a7b6fe0a978b81dddcec048ecede675b908cb654a248e814824d07e23252a4f03ba357858320eea88b4b85ba1522699f4820015c8d362ed265f305e3d800ec47d61514e34c3ce14878e6c63b12db962a47223049309bafc64baf382f05ace6311e8d8edb5c58b1cbf322e4f7ffa7dada483e759771f63e46a0bd328208bf9d1fade204967fb32c4c44bb8bba538a49ab465c8e22f49e3f79da15e33a644180e8de8e1280782fcaf73c299ba4174ab2a1fa7ddb09cb232696843d53b4a8c633aeae5a782c151bb5dc7141afda5cc2474fda3c738a6d120af87e4d2c4ccca6de73ae9a3a4e806e5b529194b9bab82a80155fa7ab38fd0974d403aee3267a98259a638cd4cc48931156e10b4c7a6bda7d4c1bf904d6741410272852aca823326277de7bfde3a9d5f73ae941358bd228e15799915482eaeec6aa6413b696d92dc36efca90d876b1b9255d29ee8d1bd6f24e5fef722742383bb407f35d7ce480823f1d93beb68045cb35c60577c5b63a075cf7e4f9d98bf214953499d0e75e7ea6c90ed73d060a90363e8a1067321ad19aecaf77727620b0ac8f25b9350668d6c9a191eb0470b9474a92ec9f52ee928c80fc4f24ff8ea7c4ef510e19c74f1c2171eebdb9b0d660d289acab0f0be4d2662998a47bf9abde14f538c72eb35a8f01caf7748cc202cef36159e366092600f1de60578dde181a38d25c8ec8daa19210b02c2a228418783e8f1561759278bca7813f67c78d8c18ffdef60b2c804e72c88aeab4907eb730286afa428d54f70ed075f1d11faf168538e5c58cf9f7233a233a30643cfe52ab53752b172e5b294e4e61d5b8a335053042c24db70dfe44915ef32e39fd42a984f1f74a3611ca00ff8535c16e0ed85c4d42805ca77fe944871558fcdcc8061e8675e385e4b3988669825a5b79142d727f3fd3a805003c95b4653d65502253d0a1cf50e953bba9213772b91d21eb62e3918f8f8d1db419302f7d1b895e0fa920ed9d3e1c85097a4fb1af330b74edba7637d9fb07f2ae060bf7de1185ccfd74c86199559af259944ca7942be49b588d992d5b2c3cea6e814f5523a6ab341ffd4756213262cf16fb4473acaebe3b76a1ae79e2224bc2a5f15f9f686eccb0b752db89200d05cf778906e9b814ff59dbde0d7724d6389a4d27bf53e582390b370e132ab556f5bcce5024f5f832513513b5da046b1f08503b9707769e8283ae38bfce18b549f53a6d445b33c9fd549d57b3486e0c6f9104a353502a9d2b438268dc9fe8945ba83980ce9ef7213ee6af616a571cfcc9955cce5ca7688c319dd4f1495992ef85a3f8bb627a403185c75c9571e6c03f269288727244547980785fad0f71bfd4a9b93aad62467ca10b5d21f790e2166991120fda368b5770f7bbbda3e6b6964441b55fd13919a3397f75888046b4fb0012c2c0c6bf0bb7c1c1f66957c9821a39ce8fb65f9f73d66289015e504262ae7ab8b292a91cb235330e74bf0b5f2450f605452e98193cf8fc5da1e8b78bca8f0ebdba6855d3992a7a730a4fb53ed79de43e54d873121f9d3ce006af5fa342483939eff99e091a0b4121056bd802f181f0006783a3ee5c281f719588cae6eb74509d7e92755cbcc7c9f663c5133a973dbbd1c4ba07b63a2cae4268db872f4f31e29978a20a070b279602982967292f5b6c0f1534af484ff20fff25c0570b7f1809487a3928db2a8f923ac343b6be0dc15bd74019a01e345e23678d02f789b919c85dd4c0c30e192292d1db6b103abc5415bb3c17129d84b49dfdaf453381a1b371b1747bcdb29cfe392cf44ec77daca14349f05fad18840b00087d4aa146b3855fcb5feae4a7b1122e51c786730303f6355c49f6cc6710400b1b8e4ef7640060e85ba212e799580458848b1dd3e0243cfd78957c7def284be15c8aa4ef13a2a1e1b27ef6ac9fef5bc0f34d278572fa9e7981361fcaa23ef7c9f81623a4b1a9ae7d5d18f8ada59010cb80ce4d0dc316f8634bfcfbd6e58270e3be553f7b4432725eb4d1cae7398b1278a09f5bc62609a042c1f9e6d8e7a8bb11a491113c776f812415d936fc065798a6c1ee0e02f6c8f1802824b0be527eb4a8be29b02e31e2782fb8b7844715ae77e234346bfc54ff8c5eb8cf6e01392d38889c80f965b0f010e6601e1eec0be0cae0efccb3cf035be1dacf7ce84abc7508fd204055575ed6a423cd791dbe0fba1a44b8fb89bdf8c2a7340ed69d883a76efb965aae8af3c2f99ece431f1164f793748eaf5d785130f35ce1a07f0f6df539214c6070c3386df2a635b4dad23f800157316fed9754ff12050fdabf165109bbdc459c18e1260a170682691b92924debb745af349ee22f5d68581144ce1958e3b4b79aeeecbbb94a23dae535d63191a2fd6954c57fe8e903a9a5d3deced0b6b2b7cb94a644cf974fff68eed5b620c6f2d80de6b5eea9dae2328522b6cba850d4d106cd2c0f2abbe6077a69fef98fee447a7e43cde5afcd3ce9f9587063d0a8af9515e7b43a50ddf1c09a8a1a3d6a5d8f466ee663f55b2aad1389dcefd2699c9689eab70d2e270c994fb768df1e377c1fbf2e9da45fccef7382e08a4bc2b604f9fe22f586a910a9693eb789377e4ef5071f3d8e1d4e22763af6b16ddcfa5d43935c3ff3374ffa05d9ac610390344c1e00f5b534aa08c62836c7a74c493ccf08b867c3731c7dba0c4c4e4a2c712df443b2f00e13cd0bf491b79e97e12dddd33abaa7aac536703d33635f04752ab35c3286ec8aeb9277936b159dd35d584335d073f83a92656595af7d7ee1a1a2e551857d637b7ea3a5af2458a8eb97adf577c95d43aa57db659d06a4996fad187e779c5f1d388ad922946fcfac86c96150305dd9458014e00116efc10de669eb44232b3b71bc6c9e8d0db160ec2495a2331acbd71f14bbc7cb556a7e4e1667e04398375ce325d011d76780b8300dfd8f310188651da85c0deb8dcf53371ad72d114610181a6f969d7a5dad8681369d59cb0a7564e5ddef1b2c9746a23fff6f84a498db2ca19fbcb3799fe46465ca54245f46db86bf87ea038c249cc39cf30681199d9b2ef53e74b581a098b712c59b46e35e80b4b58823e777c2b47a5a74c2d9a94c865d2655c9a548dcf4113a3dc567b21b802ffe2c27d43cae34b171653d579fb1581dbc6730ea6f302819e259f3a93bcd93a6f0ab8db763dc468d3d64b9a5fcb7486f6cadc25a6269d6a6c247c0bdb90e70b744edc6200249553418197c331ee2e784a5a0d57be4cae5c30f38bec3b7b0a4a697cd90d347dfee1a2ce5216aae72e1761be0d0d29d48f5abf9757a0ca9d047dc7002dbf1f220e01cc07c8e1531a80877d778d7c5ef1a6134a4133071190a8bb0e95340afe0407b15446515649dd2cc59b6fdbfc2e30d0d865c48d82c05af8bdedea5df818541750dc26221a76ad28ce1e16797e2fd5f92bea49095fa98121dff2bd68fc8676ec82a9a6fb5fbffd4da7da1fa29213631bfb429779722bfbdc0b2a5932347242e2eb9de18f9bb1196856364a8ca9d33a658819d9273acc31d22ebd5bcf84a6863d70065c27dc1b9414dd83f0e881ab3fa6a40c34828c058fbaf6f49417eb14ae932efe5f323b9971fd570145e158cba2f67df981e71eef0f19d42929d7242829acd8af0b402d157d9479acfa7f552a0a3d7e05f4ba8eb8feb9e56c5b6d6a7e1f584dab117a88f9215af290e1c4b28a3cc9f2f966020db8ace5935bd74158cf21c01816f5d86b758fc1e874c511348f26949afa03e836edfeece028ff1bf9d9c24bbc7a2950a4a3a730e8e7b6ad70c58a74628f169edd79fc8e14880ac7760a96b8775cf63ae6691b9935a2173e8c94dd5395413e9126b36af4a50bed5226ece42562b8017701d061d8f7391c92d146f45bcbd1ee2140fe5f1e8d50afeb64894f61ec41ecbb3b7234e78ac37c8f842be8c62fa2619cc1e9f60f28d847234a14ba3c5ff5bc7eb6dabb75eeed04032eaad91273f9666e68ebd8e097995c80a242bdb39199e794a170bda3de15949c62f3b8fb8e19a775b9f2ef00dc4a379caff9411f20502ee6f627ab906712fa68bc291596d2aa2f7a21b16b0eb345a2787861c39d01943b7e36e6f797e9407e27234eab73d97795c8e009f826015ae87c2342b5f46f00e50f3175b97f9986bcc5a8b33a078f8726cb4e4b813680d60c5b4c32a8494f0a666ea9ed6fba141c07b128f6360ae92b428432af2a45acdd1b8a238ce8747a25462d5867fbaceea2b279148d703e579c92bd147aacd401fd0fea85701ea07cc5592cee26f38e5f55fad8d9893aec529370bfa3d4ee7b4647231d083ac304c9afe89300c03b0046374966ba7b5a9f5fc5ed36c1092cefb1c3c5a5c359205bf5ee81f12382f3529d4125fcea3d747ab7313e7f27b8c90a7087cca56075aed158692516d2df800a2d017b69e45673a3de05f17b66047058fa7c48de5ca06d43f01492b55b4170c763d15c564d20652bc639d0c244eb7b180d1038b3f578e7ac6582ccff49924f8c55fd6612428afedc6f7496b0bbf51bbd9b757e60a26af64b7905b9f40ec5fc2ded64096b6ec7d8c9a38f27569522e005adff90591a2793d41bae2da328c759ae0fd7df413c8c922ac984725542c6ca5d4f6e33a747c284c51f1e4a22dca14450eb310e44683342c1942e777d921e248168ba4bea789764bebe880362d96498bdf90e86c4e50be01be993b02de761627594aea9a2002afcb443b2e18bb7f9bb5e4caa2740da9c1cc0ec34ccda900bea918a15d42302a4916e80d99095005856a5545b94a68305e89d4c051e507bf54aaa7d00b5feca659f07e276991a57119f261a8ea632cc3191831bacb3e3082c3ddcde2fe02034cc5055747aca9918545f479668401329e03ff7a643c0c3284cfc927e698a3176e1ca487964e2019a45126aa6bca7690378f5d027ca2933225718861d6718a870a010a0d098aba72e5008a0a117743cefd89859b0e004604111a4eb393eed0f89b26108040f874b2932e7b37fbca0da04f6d3c2d99729c89afbd08944fae544a43f40d4375563185a615b145250ab92f58c78371d8204bafd279958c41b1dc5d48d68a698375a245555ae165c4b2744e9d303da539ed1f171ec18e79252caf65e5187922169510bacf12dfe8f66cce45c5db70992d5c55aff32765b0eea215c3f0e9e582511d62aa12ee2f155e5977561bc442d833b2b82fd7c3ec5ec1e18fcd3483840710a541f8e48314d82363c74cbedc2061f73095d0b540c0bd39e96a449b6e196ad2985962ef339010a28aa683f88b312632cd5963de66a4b1dafecb682dcc015851d6f4fb996c5a5bc9b1f6d45caf3f2758ebaf12d2ef48ed9b1237ec239eec2606ef173e6e7720b017b66aa98268483392b0a9cd477ca766794fed1e24d7e3f341c3746f0b138975694145a4e63944d472394f98a716b55955118c3b8592a195cf0e46fb5297a556b4b4c74a2036032d882954790abc611f3a7626257e9f1272a7e935b8130b6ea1b80b632ff209181bd47442786273ad340a76826e2594f78a6f3408e888032697d700dedce92f9d4472fc1769b4acfd966f53044dcbc67253b3820c862cae8e1155e4f99bba7d075b49836b1f0ba55039a06c6df5c6e58b8800326c34cb6ccc0df1fd89b8513a461b0217d016ab9bd49c98383ec03fbdae31112f0ed1e79253a1876cde5f4c2c7efcaaa1aeb8e7606411504b3db0a917ea960998fe2bf517552ad4a1544d596ae68b66c570b471fa6c0ed91c2de394bfe185d991303ec96e9b593a4b0da8443164131f60c0cc2e813d81188e1c417362b6906a775a5d5caf6237ae37d9b9af1eb60a43395a41152ea413bca48f563e12f213110c527c780d3f27890aced8a041425fc262e1c1f87cdf508ab7105d685e3afbcb8637a9b6bf2fc1306ccde571f801f8014bcab18567fe5e997289f42d3bc69fa9541a1c8e8ace9c7838dfa52437b4d868d0421af42bb3406d8704231eb8642e62e9c2c60763de67481298320be94ea886300b4bdc4be40120978e975fe4ba993ffb12931efe4166f0f14ada90610068f944b8e784810bbe56b624821244f644587168791f678b91039ce9383ca44fe4b5386511afa314096d6cbd8ff8ca6331f83df37995234f87288d404111cb5f02bf1b2a18014062bfe8fe9afe957862e5a91d274e3300f8c6695519ff758fb6fc1268c7894489366ba5237cd3731ed8dd1a905f4d1e872ed5e156cb7951307f1b9adf802e168de331eb4a9573e850f675cf8824394e85ebfe36fe0869d5147cc70cdab0fcd4a0d571b2c2257f501430eddbacc01859524369870a6c6988e768b2ee1753cdc820fa713f2db36589a2e6694ebb3c87bdda1becaabb9f6556e1039ebd0b6d3e273faac7f897a983699f42cb47ea985d0ea115522526aea15f5b29bbbea6eff7fb06346ab6a8ac5a963072f50e143743b14e86fb7ffb5415240675a41ef60c0e47e6123715cefea64f50323048a01ac740e3ed11d73e2dc3f429d1456104912a10013926925f34efce6beb59f91969cc65597bcae998a93d733dfbcf9dd9e1ef2da2530038adebbdf08e70b26b5e6fa707c73b4e627a9c9362aba8328db6ae600ac88d7aedf57dd2b1873c1d47e753f1d5ed803d728e799d93d36620a1fe2a1c83b147b31738e14c47e1a7b86a321cf09371e46b32d3ef1b78ebc962d8540781f2f5ddd46f6866aa4e4f6bb1890544decbeff607715142da32ea577d7441aae853902286bedea42071d2edec2ff72744261e2fb247663175fce0547e7ae89b404321aa95ad0e17121556715f8309aab344a0a5769a6c4eb12dbd2b10ca2d6141ff97c955a66e917b82a208b008d19f33cc7c53e3a404127d81ec30e1f5ed5ab58d43ee05aabbe0af6a6c7696369a70df37679cd010e820e2f14429c442412a0259451dad1d9864cf67c2449eda5c6321e59a3485dc52008f8fa8d9d21a3ea678c74fc962763c7536121f647dd07526ba6a1a542fcc62482a864a52d8fccf1e8378a9303869f12e4ee624e123a873367a2924505431ed5226aaa59b6aaf721a95a84456d85f7856f0e7996de210baa368d71a6e8fe9294489ca95d9da2e710b20cd053825999cc27d6dc93ae8c812b8e66ec40ab50beb09393d1abae4c8105da6658e47ed0c55d5ac41247115daed6baa2e143ba64b2baa1394cbca2286308b17a61e874f5747937565493e5dad227120dc02d2db260ca95a6a4208aff614175f1338e4d43e9d295696369d2933d3782700c38f9dd7437458913a07dadc9c42cda571e3a28fc715fa32729038bd6a57dbeae6ca931b61d4a68895a22edfdfd8faa8544d0747467d77b134ceb884631e32c348ec50b4d94cdc41742a67883441e9378474150d4c50248cb0c4b3923d376f4be1e7a3077179044152a8708e3a9b6e911e3ad2ec811e2ae3e6891e2ab7e106162fff4f78f9d2079d6564262fbe259cab3f9c3544a64f8c55bb26439c55baa44f1eef50dd4e9c148574961dc3d5e985f8eb4066801ddaca97883f7d7d63f2421d9d53502c3b2840b9c9dc4d02babb4f9e0c792da37c79edc6007622427019804c96d19cf04ca65f992068d8fd6644397bee24c439434b19724f415026f03594d921fa2d2b11cb9850eadd2042e50cb8e5a6f8e688ad194c7d17da47183b0f15174b9b695496439b696593479d66ebfb07bf3e4e1b42ee78e56cd662de20f3d0d393567a7751a02886a689c56a5dcd66466f5bc0f104335f154915922a20fb5d7f019a62c4da393a42a4bb1a1932edfd63e8bc46da0c7ff0e737b8024f39300f865b6b2608aec343a2ab9fb07d1ea30b2ccef4bdb9263a617712fc432cd73bf0655b0cc1b2c05bb51bf01fd26a625f36691147bcfa25d87611971150f4850c8fa7a6d910ba64c91d4d5f98665fb1e181ceeb287ae3671f598fc97c70bd6535aeb1be367e9b02bec73218daafdc92a601704a4f092dd8675739453f08d48ff2baf92047fe6a0e49fb87bf239d951f6e60cf8a99868f17852c76399cd2ce0a26e61aceac6349d2179d8ef99be5ed6b3ee16144fc57aca3b987deb8a195aa0af1d6a83aabbfeb61ae1290ebfa9279aad7ae31d98645468922be690661c4cb89288c8856e177c9f0eb0bdc8dd9e8272f1b236d0afc1ffca9fc1cc4933fd1cb65c419d41ddb9dac0e149280173a96703b4fb6a3a85f45beec642e9c5474a46df475c093332aaf3afe7e7803bc6f5b0ee638945132d2a34b2287bdb1ce5c0dae4c6bd82231d30c95438c534fe165eb2175d1317eb2bbcfc1691ae3998c650751029d8d3a139ae85aff5622dd023224a15844f0228acab7d7aacd27cd7260a1ae1a050bb1b1aa76f38e33b48a176e1cc3212c7892b9f524424ee5baf229359badcd429ba8bccdf52b55e148bea18454679ff7a32e8fd3ba293a640efddf12933435619f54b93eb053d18c5688fac60e832c38e6f37d9234cc4732bebc8aa810143beb331140a32e2aab27283f2b8bf683c593daee8fc1e01969d2ff6e45c7a1d8c73595ab6ab646c7a04c755237e350af98dffe987ca1661e14e383ced756e4f86ac4f6bd5a97130bbb1881ff7395f94fe90871870c6cf41a11cec2a91eaa51724ad4c304e7fa2b1f8cdb67385a761060f13015502002fa01f368504ba4ea5a189c4f498003b465a41d668fbb0f14f83146ab11f7d6e65000e14c96197450c455fdadb346c80aa16a0401b25e0c292ec427d97b48cc432101da8360d1be86d90c3919bbb4e7259fa24e024832cee5c8d4911a4ca0320ef08ce0f561128d15c166ed7610ed67b5b65177bf410360f01b73db8d84ac6ccc850c976dd65eacb21cccfb999c15f21751e626a7981a9c45e3982984622ba93c1dcffc51eebbdcaa46e2574e242798e18a1d1efb93e4b7e71d6a2107eb13bd42a30ded95329e777307f369687d8cc70a66ae872806f93696a7a000b3c71af5dd5368facf13696b9efaa6f352306d075d930f4aef0518a74d7ad3c00883c8660baf6b21df3caf6ea975ba66859a0d21008d7fc2a0770410b0632d682233078123d659cb3737a72e1f31dd410fde9518a0d96840e6cdf9e936d0852ad202b2b2beeef48a24b922e2ebc86b4acd5c58040718094b052510e349ece8df682768917c08244cd8e7619ec52af6d2f8383450197f6e359e72fe99269254e6c069fcbdd73749a5d291500cd68d4322d09d24c6b37c97526faf7f6f600d7477adf9a714fa40595a0ff65098737d40871df7dfbd838033a35f27a3ec4b203899d6ff1587e378c096450d2624f3e8fcfb3a4d8f16584b4619fb6141a3704df4692b3c9fbfaea9637103f7b63de88eb543587f5f20bf7da96d41be869b0e0bb3a1e9b01fe3224c539d535b8901e64f6603ec604533860be5d4877ef1c0283596fe0d1d0724bd6cec7dc758bf1dabf63fa01091bd63de82480b7f25d5deb6faa18e6a82088eb576dd3d601da434e60bf228e0915010fa648fc365e0e0aad948f8bef597b93b22d4e79074195f0444643dbd575b71c5066758edf6b0df5cd1e75fe7c0a81fa342e14e7f6189f52f991845e386c5b625e5c193f4a746a0e93c51278887f7dae1a97f7b10584bff8b8edc9b89ee31061b0663113198e438e08e50b2717d64cac2af5003ad8f10c84327dc564d3a1c59fa7be8b2d6cbe4c7dc9e9e70a4af69e729dce1134b1211d8ab9278618876ebdba543fef8bbef7e94abdbec8722a067efb6240b17d5a2c223743c1a3c26aaf4196a7898b9d3e478a4c494ace8b0d2e61293fa46584a43fcb7cbdd263f6e0e32eb3b1e8d2bdd76ab8f78de5cc47a410a979089ef39490fe20245e1a3f61444e1e836423156beba2450275f0390802bcba5747a75d90e61b58b4f19927158e431dbdb2b37deebf750ab11aa465d1fdd88060382243323a831bc2c2651db387c77644f5ae678f99167a4c305c6d96b3b4bbf66c85a53165865e6015a5f75c8b66edcd29adb61fad927f7e6fd1e1b70f453cf308ccb63ecf6d2d62c55842c067dfb76c65fb266319c4583617cb8ac53254b199368e59590879253ae56bc79c5e7bf56d577c5af091d236b41d446fb7bead8018161adf7302889c48e083dc97d4a2fab87d454ba9dade5e838a2ee0cd0395740e56f3441d13f7b127946e5770bb42d9443f977c9185ac629f058be4dd5c001bcca2de08387801403b9e218c92a1b18a73d9caea0a9c8f44831b96481ef707bc67b9017ef28493e38bee5c730f8726656e8bf1dedc7149495d5944bc3138b4d6958d26a1d2ce78ce71f52ede3842a2197ebd07b8305d76c08d30624431bcf4d4a227df7ecff8d3c0425e184fe3cc872d39ee7fe2d08f4784e217281066ba38b86ef80f17601026d554f45defb651cbd3a73a292d62a709cf1bf17162fdb6ae34e39a760b1d128f3c87044b475f650333a63e896eb0a4ae359f71d35126e02f9de024b15b1a0ea6442bbbb44e83cd0875636607a80e5030d63abd090c8524db52d94b57e087c20a1d37b00fe4e2d25d6ac2418df0197af19469a96f87449859c30595dc4490dd727a49dad63a2f43a7c51891b5bfa30929e6c7b0b516feca15faadd7456c19f344ecfca27bbac116c09ed51df0828a145ec5973176b078c808eb2616319817587ceac456b74216114b2690d9018477d786b2d690c6ad3947dda0eb1ff5fec5d404bf0ff78fd001d543da2080d76bdc0f373dcf6ffd09b035b8f7dae5766e7a70e979b7ef73e759bf5c20ec037a45cdec37036784e35b90536c325a9ad429b22abc2e69bd693c1ca9e21075294ae83ea4b62f9803c2f9b849e28f0a056695484b2315a97af1daa1a84f92583278736c4b1198532248e428fe2d4cf8151654739f1c73683d461702e7001cac1d696150d799e922a8d03dccbb499d35839630c6353a32ceb127a44bffb4a8335b1487098461a2f9f20fed4d54733ba8aa45743938544703bfe1fb4d1999076882db18ee73a81c59da8e4825c055d4d06356f4689400c13704e80a87a00fc72bc3f56d0be17d903dc9f00b7165d9eaa95c99676531a40c83d4daef2da6022e1a1ff883b30d1870634e8d305e8673789582df6681ee5906ff9187fe18d5f83a377270175f16211ac01f5e704eaa038ff25b4e54acad044278a908b58a681f9f64e2442b9c064075977d0259746fe4e9aa68089bcd8c6d0f89840def21a1725c5d7735f71032a1bd7cb1cd13205aef96a346a187690510c78093814d73aab9221da11f5e672e3c7e34405b58dd4095109d3ca35d7fe189db8336f92c8532d0389fb215deb041e278fbbf0d0da1f1235d465ca319163d7708747d69784c139410c17a7020bb7c5cc010aedc8808e5913cfd809f44f660c3ca65711f24fc3702077d86e91acaa732904883963930711e1dd868127a1b8d7e83a9f20f089f88f33223109595ecb3627cbee301d192137fedbe5795ef495418587bf4859beb30d4eb25aec2a3355c3385284fb218484c055dcbd64b1b78d2163bcd0e335c6c8870ee180f973548a88b5941d6ac8aa7a3aa179bb14fc69dc633808da368562c3c9588f1d8d2f787e19e539043106d7b1560572c4c457e986e81882f888f6526c56b4570826cfd7ce37ca3c81068861946d4db6467eada7a717fe54e7e5bfafe3eddc8caa2116845835e4e539dab72fdf98eb659bcac81b2b218016e693423d5d1d02a472bc71f37e85f2024e436d5075dce2da78aa62571054a4b7e8cba49604619a2d4b3a0397d2894d9020722311c3d7d257b1f9a85cdd254e12d41cf49bb11053afd00df0e746bd83086aab9cb978a255309e19e63d43d49f61e66d563a2f0fd5f3026aa36f3a6b42967af9985196a216d15a76be2d6b274a346d60d17f46038040b460c06c6477da8738ed45419a9ce48077a3b629870fb3ddb972f56cbdc438c19406794b56a3bfcef35b7491d6964dea1242cc28cd40811c225fbc29af96dc67187bcd55d17bcab33cead1ca3681cc2c43f471dc7e83795538c8735a243b0d8eb38c60978d4923a07a7a37c8cf64c6d7fd8d71221b7ed72528c7a22f68efe31ea0a35e86464d48ecf224491ecb26d77cc262d4e78ab1802953607632879d53622b79614af5b85bba6c7372233187a4d194cfcc4cb9000065e62e886157fcb545bfeead4242f0a1c70da9171e0be0dc437f8e12721bcb109ba3ef7afff96cf6371b56263c57ee8c0835b845e877d30ee7a36839f3d78f2395608c3b6d4d46cd29cd66880a09dfbabdd5359ca3523590f14004ce7515ae332d074c254d18c592c228bacdf7a821ba6aacd2adf77408df1f596538eb2a6b230fcfc83dbebd4086a5ee091817f1cc9c9ac37d9147c20e8cb3e9a0599fd9192d064cbf4ebfce6c60c84958cab1184b1c491fa2724df192d5e5f151caecbc381af5cc65c8818271b65486f56203160b7f028ea57815cb96a8daca089e9d3da8cca013a503c90fb10239a5986505b89384246b344f6b7f287b560aad35e700c5b7aa469ccbc465727750da8bb7cfbf4ec5e1b145a0be1bf9f406750bc1d13b22481a2fb423608782eb641dd539458ab56f249cb5134ac36cb4332433c9118d8385a9acb44aa2cb9d929e543ba4a9c178f6744de2e73240c64c08082c62029bef3d8fdd2e9f126075915bf331eaa8fa5d3bf57340a0d3c7ed55c6efbf67acb116219eee62fd5d4a0f521166933dbaec81b23530573766e4b1ea47b0677a52bc33e9b2e178695925fd0bc85b019907244a501950454cb14915414a8c7a78d2ff86440489c9f783e86ad874762622ccd8ec8dafb0c68fe6cd738c040e8d3d4ab1137c06990e27f0f42fce93498dd983b72afecff7717682e060d4eb0012d691bcd13011b621d2154fc0be1023b6a1fe91f942e6253ea059349571f92fd44055c8f5d5b3c106ae66362e01d58645b62e1198691aa02bd5bfa80e417371334fd12769e57d5c0bc02442d87b7407698cf88c4b6d1ece9c215aee5142dd49ff635045743bc7d97d7e478a57fb7428521bb7ab42f8ac226b5e08ee62b8489741cdcf831d41e5e908c53bf5a3b73d2bbb3686afe5614769687050fb6e6189ffa5ee8244564e66313929f0e58a015053910e4faacd63d5e73d539a75622a786b3a5608f9198d570fa7ca2593594ed846e9bb1732146d9adf1cdf533438e556960fe8c830eeb79ef9fceeceb090582d35203e1b34f8f37341dbf8da0e1d15d4ae67a9e788ae30c9b65f39a28b6b506adba5ee0930d9e861589c290f29d2cbf1da7808bb647c64476ec20f602da4b4947a558ee9291a9f25c1ec0675b57859924590db0f979aef30581857ac996caf8b8a416e902b42f7d868f5cbbe4d3436cf1a5bcef6b842f6d53cad60ab39c93c287587b0a01d899d2ed3f77752a601d631f7c53c0778734e91272a9ee9b25d42dd031804609874466f0e714e3f1af5d6a21d33c77821da180744d23a238c13821f4ee8df6fdc68681007b88ee9f2e0c9cbfde37f731d83f7c45f701f03c385e3927e5a7efc202329d7d0047a3b91aa216ec4c1d6e4e34580270d278c83e179702e0d3f6129b4821d225314d51433dfc6b6ed60ab06f07dbce168b8e3c11d8e72f37a894de9e99653d3d9a2588ba21fbf9a5fa8a54a9b06754f6bb970ed60c7d6933e8ef4c2b1838fb9f692eb4c8493af59480604be85143c57f529d2da5ec9619a929858d22e2081cec09bc3c5a711c960f2d746fba6765e44cc11e5bf7f028e393e5f064855e11a04a47268dab1209f263987e44f9f0e4e3d32df8c40a1787d4d7a4a1ac75afa235a65d07e0b80c132977cd1da6d71b745282e3adcd3fee69364ac75b3e470d669efcc90942db75d8bb7592b92a80d2ceac64bed36b4457293336885774ea95463f6941c9c9c89b9f2d06aa6009e527da8fef9fe4154285ef1e64120fd0a66dd77e4d4b3ceab2267040d20740c1ba95182806432f127c15acd1cbc53f957c1fff49540aa992b5fe18bf90c2d14da54ddba183e63b852576a619f1adfd89192d689e73e001456c52993f47ae69d653881b81e6c90d173cf1f482997fc1598d55f677f7ebf8b1921436caf68265adf4bb72926451b0bc66a892f5dc49e5dd57b57075665903b225d4b8d15df5a03f22405db2c6ef9df08f68970db8d04868c426689916b2f515515b00992c3b44073c0963e3516ecb9d30db3827ab9f52aa7ffb15dff6c22b8a825e331fb7d060e4c018ea27523c924cad1d3780a7fff74ac030bbac594e4180438d9775df3adedd17d78bf396f315c5c7ef742aca009de157953b7207305ea4fabba16011373457f31311b7ae752c7e98735e493d7ebabc6ccc1db2bfb19f9252f553af188e696f7b9743c528cebc2551147028efda8f1acdb18725aee84fe136affc6966e96a1ca4d7f87eeb0506838bd4d886865af2c31ab6cf026ab4451fbd624e3a18cdf819296942175f1ae4f75f490134faefb8189fd051f9bbc3e07d3e974f7523b6b535d88e94465c733ca98f7719baea52b1a44e927057fdb1a27c3efac45b03aee0553421dc0e51eeb19c0a2236ff6a5e95d5625b476676db333788729dabf549c8b5e35c3c0d6de83320f544b4bb8069a3c7c4d5a3a1dca26bfd362394c54da4810e9f026a6f2a76cfba7adf77397947e9f4168d4dbe9ef720b5dddb2ae492c6864443311b75b53e4f24fa5261b86ef24394e096c8b165edc483079e25a6e35c234d5b3d4b0321955272f949b1323e1373d91756b86da16164c61eb7900b2fa6a6be09d453ef06b62b559528ee26eaa709af33c9c7c124d648f8b0ec7fe7278d3e41e7456a2fe072d352f5aef4d8d3680c91b2ba9da04c1a69a40a566fe69a2112956db6f656feff304beafc34eafcf5d54674016d67011aabe26d3440ae24c901033ccff33ccff33ccf9f738efe10a2ff1d341091524a8ff27767139172570ad1afb39f70beb1d96f0fd87708bf2304a206d906ab069fa416b83897fab72bdda699852af3ec3a6ec5030b49397bcf9d242e33530808881820f0b8c299cf36b855c8c30a974d678f8da638b1c4a30a78e6d83827bbbdfc7d635b50070f2a9ccb738a1b3c1b52a3141e5358c3455fe5cf5a929c14d6b7aa9253fcaebc570ee70119376a340e1b9f031facc00a1e51c02e43dcc7a4902146282cb3a59f21522da2e409c5387f9bde4301f0838713d49cccf5398e8566b409bb5fa61caf289fa9f1c18309771a3ff58cb761535d42517b494eb53493a2898712e8d0acfa797597164f42fb7b265a654d82854e7b20e10c2a52c174ececff23d82567ce699a1f242a0f23942e2cb2f3c929821aa4bda673c72a2d65e04184bc7b344e8ef75cd7c370dd92681573b68c159a218c4a9acc3ebf280d7930fe7057bd1f63ca6b1a189ecc78cc61622119fe2259a3868d5f65862f5c55cb4daa2a1ece64462ff6c94e9b7caf19bcf84aee8adddfe19f97001461c62ec878c2d566c95c3137b60c1d704017d99aa8c9ff312120203372f185c7933f99580a6eccc085d69556e11a2c26e11a336e71588a4db29865737000046473380808dbc8e138fc062c98610b5bc3493e25582cb9de9019b5b0ec6a5386a8dbc9f10c5a64e2f96975de6aaacfcf9885b9ea9f827b8e9cbf7860862c12bc43b6c947747963713023166676b09cc25c7fe6de3360819b6c56d984fc06335e51d2193f69e3d2809ae18ad296cc7869ba13dd56d061194c3b09f679f3acd8465ba72aa66c60c62a4e93c4dbdf3b318bcfaa28ea6faedb4ba5e20af6dba63ea36255edec9222e2e729334e91f5c4a7cdae31c99e630a4e9e976694c24eb3ad97d14edcd899418aa48b75d6a17219c4c18c5178dda9bfbd57418e1d3a76862888cd722907cf983bcc9050a41ad751e14e9eec720628d8ebb8175e5c7dd38702333e51f824799dccaad4a35ec08e32c668c00c4f60a91ef59d8289fc55333ac18971c24952ca19b33c270a267d95a44e6da2cf92fcf28ed0ce279af83689d9336a32414b9a918952d00ee7e1970b6660c2bfcf9e4f516e63d071d8386390c120202a987189adfcb78359aeb0949e6109b7a37536848c82199538777c5fc46b13cca044f5296bf7973f77d937664c42b594c34d864fa92d3a431279fc907f96d27612cf8c4854f9a4285ea24282ec4cfb268ca724af5782198f78bc93e427d45db2ce3be20cd53a53e9b34baf11fee7981a6b690f27348311698ac48c7a547aee3316d18949cce6b279b7be2228cdbe953d2e9c2711562edfac8ab95c7144f42767c8e0973f4f7e082e2661d5ed3fb7d686303ff46c3d877ece8538bcbd7ddab8b21c2604b1fe615a42eacb832857dad38e379954411c5eb27f5906338b0642d7d471e2a580e04fbe124db2793acd1fcc1a7227327b3f98cebdf5c424e538d9f7a15862e9f9e30325a5fc695fd258b687fa644bd51a4cfaa9f4f0c91a1d3606ab8ce7610bf918c73ec9fae2e1ae9b3ff593a41893fc1d5015b79cb24d454bdb2161b33e55689228eb507c5450a91cc5a41c3a1c2e74f8b50f5ae139d49763a13df4b464e550f78e4ff6ea33e2608e7191498ec2a18b16b2dcbf27547d439ba5b9e5433714336eb496f2d818b661db0a2a1daf41f76303bd5267316d70b1185f43b19e32c915afc498e26ac84e43e68eb6cda2791a3ed1e4da509294a73347c37f826a12cb44932df333d05d49b0752ba1f372331caf3d9fda675c4be26578436e0a3f39193e49908eb3f0ef2bf918d098f39eb6c2e4f4c580f9a7eb4e73d26e3a0ce4494287ece0625783a1984c4aeb89ab8cf90b8da9f46bc5547db117cc0c1ad387f98df07421c9a48f31f3c91abfc3053aa78aa1a9ddc29573161fbde412522d9cff365ed64c839c05e3aa692c39c1e40f62a1fbbe93b7bf2bb81ba663ce392b3c963da595d42895528562feb78f5e9bea332a246679889d9eaccea660dfbced99e687bea4c045c9d9e5531d853e9895dfda68be928642514fcee4fe315428e927e01ba24753d84eb046329bd8e61363df84f5e2a41c56a7c56526a4d1b334cf2d77949750fcfd28a1d32dffea56fd7993409de6fbac8d75ae48c032a5527dcbae2779044f0a933c866e9c198d502629c3c8ae487537a308eaca4d46bc07df6d0611a874fb244f8f955fc350c2929444d964612416066da5e6e15a4f3be260ec1bce72bf8dbeffc048b813ae2a52c4fd5f5c9de424dfdcbee8b4d2cbe458f7b67b61e58a4c789817a74e99f3afd556f8ec22394ba786940a7339ba30532cafb42d6bb6e6e292a643461717e59c5c9b3acb76306fc1c97f0ea1157b4dd216a8bad5a464c91ac25aa4654990cda105af256767dff021bc5920529ec27a8c2c8ac92aab7a6271975c26984962ae5adcc755a58f1d0c1dcff96c574f7eeba05c7cc5b78f0e449a6c1a63eee6b0bfeb988ce6b94e727260a75bb2cbea344a2e0e7a89af1a7f38782799e617afbc72f3062c57b889bbbaedc7b8e1db8aab9cab2fe5316d68d389d5175e36e816c37ec8ea64f2b7065d3a9787ec4a7fa5066a3eb4f2cbe79827260d091b7a2567cfebf4a3610b9bb64c9f2e1e3f43725eed133cbffec7663027e16c529394326ce3259f566e64b83525fbb4d9c6f0b4b94972f8784f8f89c1905116e329a5bad2c25092e4a09b73a45c4c313018e7d2cea2c949d8ccbee007f5de9d9a6a97cb0ba591e892b773b6105717ce9e6ca22cc805b52c9e078dd7305f6d213f3984c692fc1c27a585e24c84ec9f27933e0b252db58831d7b81d0b45c5b25497af50921b4ffd5ccfb849ac70b6704d52948946156c79bd601e6cbb84890615f43649d2f2c6fcf9108d29b8415b4ef4570a6ee84f7b94f77a370a8f5caced0f42a1998f1ea6ab6247f109f76bfcfe946c96a213764b676d9a26b83ee9baaaf93e5b9860bde7971bcd61652d81b48c11fd7935aa44092629c9b69e14672a118d24dcb6f5aee12431a88676bc8d101d35682001cbe9b37c6238f6c609121a47308889397aa4cf973885280d23ac992694c79cc9f4348a90dc9db341db6230d1d020c29eca3493c69c31b665079e0210901d788ef7188629cec6fe8e8ad9ae968730cc5862658a16b739a70f10830667117040091a90058f60d8d1c2e5c8cc24567580e1099b92d7b5fd8b4b32b9a66c7b7c7cf245abfb9eee244e8a5ad2810ae0e8c01864e4e80008088ed7a1c3a31796b4a14ccc190da9d138b6c68dcde1c18b336597ea92b366cc700808c88db5b123c7e6a0c62e92e3baec6ff84c524cbdc04317565ae8cb601f53c6bc8ebd31038f5c5ced7abb321e259b250404240764b0c003177ad8df7fb8ecea490c04440cf616e06881c72d92a45fd9b421516a5388182a28410e13e8c071c3c31658da2cb1cb9bbf445505251083bd05018882472dd0641f2df377ba90a9101db43899904948bdbbd9f7434062e0310b7c5546aa42939cd30c0101b181872c8a1b3d3322c3d3a72432f088c5aa7fe1f17566366dc818630c32983d60d1596d5af69e13b1860e1ceef10a36ce5358d1350404440c15940004c46f9c63a386872bdacc9012ed2f1e90a10110101e909123c77bb4a2981f4b46f7670562c992ece8c64a957bac22dfd0713975a8051eaad8369594969ba184eb535112c572a69cd2cf89395498c73afe9dca895ed1298a6d5f55ee1ebebf3785fae65b612f2a851f6ac43d69c6d992430a6f56fb2dc53c2bd1f518c59b7721674fb23a7d0f5134f17b17cc2ce3558c3d42f125bd53133a74a38a1ea068638636bf58ef953c21787c22c9534e77964f3c3cc179d8e5dca5321ae220787422b7e8ed6ff9f51b32f0e044e2719704bb50a3e1dec49dd7d3c24939a6ada02636d794af9f534cf899094fb2bde029984850ab947653e54dbc5ce2aef7d23096af4f7841208687255293f5ba3e7aca2152258c31ca732d94586e552fa67c963bc6933845ab33492b27f1639384ba9b5d463d2512e958f2cca821487cb1cc4e9c3cf178c469dcfdaac657ddb516783882f914322ba7ef36a71bf16e7cfb952e79faa3147830a2d136a93351c73c948b60bdebe2c46edfe07a480edf81c315b1a513bb0e6fcb1fe744b465c9538e194a2ea1ae810722887d73950b966a637988743ecc8e6e46f70ccfc0c310e7d124c513f33726831e85f024b5c81ca34d6e3e32f020c45242a7cd6d2c176d10e7c7e4498e4db1c043106ef212b76dab452a2ef0080463d32261b62999d8a2c00310e658d7fc56f2a60e7afc819cdad7d4b7dadb280e0f3fd0493cff2df865c58f471faa24bd893187d78c69e4431d53ea6977b97c3d8787f0e00b1e7b5032794e2a966dba233dec1e4afe354950b193759071836fe0918736a56fa704170f4731c17c7cc3674d9a1c2c09eef04abfe94967cb332f0c3cec603ea1a47bfdd1cde1f1a883a7a37a9eb7a1832d7a5297e6b59c0a79cca10aff245d421e72c8a6a7f3a71db3fcbb471ccaa136656c79b3b98e071c922c86bab89921dbf67803fb169dfb93abb55ad8c30df88aa6b9941391caa30d7dcecd2cb12ba5bb65c39a7a2c557dad4fb4d6809d9c5dec2449bfd6d5e006d1f0df4a1a6c93fc5fccc484c0030d9ca88f5e6eccf7ef0c58b64cf2a5facd407ede2bb7fdca4ca22138767894c18aaf1a2db879c9dd64e0666acee43e3bca20410edf01021d788ca11433aa9398184bc871f88d1a3bd8430cb4f7a52c1597eb666fa00223f00883f29ede2f7bd454ad85d8a8e1031c9b838c1a2cf000c35947f44bd4f3a6b91e5f48dde4cc8a9a9324e709088887179ccb27871aff5c39945cc0a30b496e36e3a9939906d7830bc6952cde9bbb347d8cc716bab38f8baff1260123f8c0041f1a2e5a6fd85ca89750ec533b498b6a9e6889c4943a2c6b85548573051f9528277163ddbd06d7d0bae08312c9d93b25eea7b8d5960794951101073ce16312a60e1e2e97a856f5c10e24e143127b8e9893912af1ed2dc2472412a9182cfcdd09597a0808880e4814dd9254639bff4eb85bf0f1083dfe691ab9f8bb510d59b67143070a3e1c71666b1ecf924f7cf446109a2c8bfae56b30f90020e18311a76c39f8585c4df396456452eca53ef5983c498a682af4bce67d627c244213f573a7c62c3184f58108f3d6e87a86fcc79439446279e8fca4bdae29d2f16108c6c27b76e59f5d9b05848f4220d3b94a9476436adc581b3b3a87093e08816477f7cff946f992908f4118b7567a625c3a4f4c10895b54e8ea85d8fd0341e6946e4539a16c7740142ee3a68c1efe039e49accf3cc9a27c42c1871f529f908c9b621fbcf1389fc5d27a49221ff29c929a06f5345fda1ed433df92523cadfaf560785093437fce2589251f79d82cf8573ee1badac783c1cf3f6d645c92b27e87e582cb7e364f093eec4025d1849a8e49ec1cfa3a98a63f0997592f7c2ce9604c6eeacfd9b54ee79018956543097ec841314d62e89a133724fa88031bf61bf32b6559723fe0e0874a9d14618e8f37e461ec73d20c97825b16f870c36692a1423b4617a9948f365cba9e557e7b7b888e3272a0810f36b0a904cf60f9120202520304e4021f6b6076c3a6b974d4e8f3def85043e31526a5aa34e0230d854f9a84bb5025c9ff22f840c39ac29b7d94ca193ecc70c7a92d21cd2f439ef25e5ac8c9608a25df65b5bf68cf8cc18d9dd830df57eb9518de2afbceec50c1a2e4230cc6a6af3bf153ac2fd9aa0f30e4e92ac6eb1c27d6371f5f3827b9939c662b57532f1f5e4812190be7bb69f1a72ef431d67c5a8c553999f5c105c3363d574a83e512df422191d943a738792e470b5dcceba9933cf4624916d8aebc201ec604fb101630b90aa71b55223cfa7185f35a2a2f3121c4636905d737fa7dd668fd54a942aa7e9fe34742534a12f24105aa624ce9daceb7a47e4c610b1e56bf4afa9e33ff430a44497ac9f345353ea270092d1f5d725bc9dfd18181137c4061d76419d633b645ec8f279836066993764a9c4c8790b103070852f0e1047b4eccbb6ad27644ac828f2658ee269594ebed7ffe10127c306149f9fa92d524b518fe584231f642766654dfd23f9490f479f4a44f2e191f4930c9276a5a1243561f484870dffc9c73c2649b847c1c6159cb1ba5528655658d60e64fd4c55c7a8ae9471188dd60729fa249fa291f44a0cb3fa547dec8f8456318f9bdd8557c5dfdfd690823cf3cdf397430402318aed7bb58cca2a9abd234809118bb27aed2469dae6440e317cd2529486776132fd20bd0f0451f2d67f5ea6940a3177809efb9fa6e563c0fa1c18b53ec186229b94649e2bbf872adf947da97dfad8b4ceef0d59fa539c5391745678f35e21d5ca41a6ba7dd5a92b87b0bff3f06ad7cd516c9274929fbcf598be365ccb14c5c1b190d2dac99d7bdf298593c9537aa2a9cdcf8268bf34942f7a79c73831f0b2a2f76b6ac4ab32a581c935c5571a2e60a77f20a935dd8fadd6d031aae583454634cb44ba315c9d525d744daff9534a0c18ac44365bb941c7cdb5b45e289719f27a864d05045ff4998f3d39462c24b2315c55dfb7d749e51f17240031594189b9327cc65f4b07440e3146912aa935caaf1c67b1aa650cf6aec2dab690c5729aa95934daaba36539f145fb0bb2446b5e8fe5308688cc26499248b316751d4a3e36e51b33b72ec09404023149adcaa298deafe6d078a4ea888b5cc523b767a80c6274e26afb16330574b171a9e30764e163e854f93b1ff018d4e9c254586d7494d297e8640831367ff7aca750e73dbe8d051011fd0d844527aecb89c4bde5f33848626bacd1cf673d0fac83f137aef6664beac4bef314175aa893dbd5f22b9d2d5680a3af6b95b82b3b896ba335e89ac6e65fbbd4d36e594389cf02e9f3d3bccc427617596b3b1568b7d5b125cc9795ff24c8e6d762430a93e25e70209aff7a5c4b0222626e947147fa9b5b3dcc6fc71c4d6b6256448eee98d4847643f6dd47852cb88426f44e8b54d8c092fa294e4b43bd37f8d1d455425ac579c79ee7e1371a5688275c59c9ae5410427b23d1def2aff7308264fafbbe73de78a212c0fff290593e492af2d84e63f9a4fceef25fc8428e78f215366c75b1f045231b22b8a9ca7b4208e21df3999570ca706e2d8d6f3de71437b0404e9f65226c9db276dfea0781cdbe861da46f3c39529ad6d7788e84bfbc0fce54f9151574c960f468c5b07f70ee1c1dc83eae1c4fe3dcb4abd1e50b9cc92dbcf53cc7930ba2d2fc7327a7c110f644a22de69c433ea3b9c0e0fc892809204aaa816e08005f8e0c68e901bd8c021019ac0dd041206f00e1d65e42040007c7024900000ecd051460a061000bfc19671031c7be30002d09103012c00400ec66027988d1d394274dca85103010a68c20ed731868f51000530818ca92b2e06db13f31fb284843e61ffbe2c4783254409a4bcaf5c4ea7149004bc4bcc5132a5a79f2800096663c70e6c7419356a20400147301b3b6e84e8d81a3510a00023f80ec818630c1fc3000a2882d5a871000510c10739e0317c8c0244866136763419639451a3060222c2c863b3c45e65ac591692959401023286e7a8b1031b5da3fd07366eac8d1d3676dcb051c6a9916304916094462fa744aba5a4251160f41bafb16a3f962451e417885d2751d2fb73ceb72f92eaa4501964eb059f1efdc2b5c50bcb2d575c4acddf61adb10b9398c3e534a11e3a264310d1c576a325942485c728915c3025846d92ecbd3e65e8000189e0823531b5891bb736431e020212b985264b668d1b4a4f268ad8c20d1a3b7b0cd994cd482d1226ee324b9e1788d0a2b8b77b27ff264986c988cce293e4febbf214594462018b57b8a215ac58051d4eff2ca6a91c5b09711cec0a461051851b3ab7a224136bf74f85626e65da29658f214550718726c12fcf7f0a7b4a96f9d053c414495e9f2ecfb2c7bb934829cef79792844f4548c1e5cdf1c828fe5bf5f5ddddddba39228ad7f25dca686d93a386a234b72e715f1fba6704146426516b2f6aac62f61326f94dcd63c7524b16f144aaa9a32907fded98473a719b1c6c2cbd63fc6cc289dae34b8cd5bd6cb79b6893a8f84dbf49315542229a386945972c313ae564278864c28e765db57b463081bb446a656a77928c5ca2a01125a58d7b9ec73b2296d04e54d974112176a60e229548ccfcb0955e5726d208257af1bdfc9b25478d253209f42c63cc9fc636e74822f128d53c8b47c294d2e4a819a682ae09894738a258cd8c6d31c74d8d1bc108a5dfc2651ff14ceb0041056e90c349105984220a73bafd176b2bdb9588bbee523eb5320404c471808040208208534d8acfcbbb4ad19b1039c4156345dd4a5672f668c4102e88144237d398c4cc6dd5492a4288414404110840fce1d79cb2514c0a39d2fac118e273a84e25d207e3c31e92da24e50b3d13dae3881ef26078f0929d7091698bdce1d826ea6d274d2ed27e206207a274ba53e82825b617a943e286652dcb311dce99cadf492273d892655ecebeb20f45e45094b9f66837399c552271a8e2c2597a65058f397030a755d0d0dee62f165044dea06d8a923de52096ffb9c1a0d5f26742e53b6cd408c02b226d68d63d0916538f988411369c66d36aca4f7995ad236bd893144293664cfa8d6a68544b5a4fcc6c10498326474b1b93d6d792682894e895aaa5e259e832889c61f7f513d79310657d9ae1f14ee983b696d4e63210834819cad3cafaddb262924f065ea32b660ed9ce29263286634c5da29d3e51524a0808480e1b7b0210904444c41086b6e3e42499a4f6a879040ca5578c9a4c92605e9244be50fece9823239371192044bc504a9e837a9894fb94a9f241a40b66768e78f85831a6e00f225c306b76c50d36a1dfed16ea0c5553a9ed20a20534facaa75b15334fab7244b2609667b01433bbb545d5830816a8f5f13de9addd4abfc29e35bef119b640c40ac89898d4f3e4912a906d16e622211b274945a8d05692f9f812a22032054e2763fcf8f962f89455440ab9b75989e5f4515315c3225140d2637ab9e5c898c454040af5e8b4bebb49480d1c64e0a8a1c3466920f204c4d288c5f14c994b459c70f54da79a47d97867459a605277a97b9b74b3985584098a6612be34494796b04b6a4e951151429f532ccab8c602a08448120a9d1e3dd6685df47f0811247492143a48aa66ace62d7284ef2293d8b539edee190202e283b791818811e8ace4e9f4652db7c473e40004a40391222477aeab9694c44c0a47885068564db9d2d2af398c4d761deb1a5318d7d4a58291306b13ea9e34a58d3e80f10bcf62dbc3a6d866b3f1c529db358fcea7fcddf6e29852a8fcaa246a2e0d2f340b9e84d490f7d7ea6317675ce860971531ce872ed88b504b279e0b5c2c9e83d5464d1112e9c72d36792b9d5025131e4b5bfc5d42a55499eab4c28f5ad02231a6df9097a3b3f0c7f3bc7310b32c9a2c4adf15ff4aa2a2ba148b42374a6747df126cff800525c9df26565f4ba9fe8a722a93e412bac4cbd6ba42c9982a586fb6b764adc047f7b3c65b322da10f56b4957f5725fe3b7bfa5885be3a3296d51a7ca802b973d7defa9a8d2e031fa9a0e3bdc7ec927a9ba3e239c174f7e2925827cbe0e314d6275fcb15bcf3720e061fa6f0e75b342ead3ff83b838f52649eded75345830f52609bcde724f3dfec160c7c8c42149ce790d1e83dc9c30c848f5028395562fb5674ca988122dd78629e46f5e3134a496ba6707a37ea7b825e9bbbe8619e64d24e3c955b4e5cf950779d139b3017dc7fb71f7c6c423fb9f4e383c5b6aa77f0a109c6d2d8774a9572ca4b0f3e32118631a8933639200e87511005510c8230a437251da3135070c83c1a0ec6a2711ca9c20f138000cbc2c060381088c24151200c053114c4300cc34008c33024c34064c628a38c1e5f9c7a4763b44aefa8c58a5d091e1706b92db3db941f39306c66f7753634d143f52531aa001971eff8651410532eba83c458bbb10e65d5865af2913db980c2d7083412b5482c27a9205981561849aa150e79d7b11b4d42b56fa4c95890cc71009c7e53afbd388118c041a22ae2abce92872c60c6fee26200e0bf5f7eee30e5b898bea40b56292d51935be1190770f20ee2dffb74de20fa89e721bbe812e1fd619620e3a350f9b25283d6bb63606901d90d39810ebf22fff833992f6bf88a59180faec3c27a3d9a1e08439a9e253158fd95d3a625f40d8192bf6c908420cfea5105a0b87ec9ac4811e8c0650301b0e64facf2034dfc516c1fc4e24e00cd67b2db5c3bafbf26eade68c40d9abb7bf4ffb99eeb621aaa8b49fd41baba5229c2e7db1888f82f7db147ad9069b7f51a5cfa01dde1da574f8b46addf28513ebdbecdff39ff04e206d2fd3a099e8f055b9228940f241768f664fd6b234b2a7a01a80745725a40e47478dd5edfaa0e239cfdd4228658a74975ae7f88f215159e28e7f7c2dd1efa6d4613f24b0e045facf20e325ee1ad9e75d0216bf6664a9e8f11cd8b8b62ea12ccb17164a5e1b9a91ceaf5613f449cd187a4775260f3fbac0033730c4636dd4c18fc3a1d00359523fe8f5f383dad9d2a9a08b688aba810e6e37a88b6d5fe778eb82f8477bf4c49d20b3f8316209465ebc6f1a82e2b8d4a8d44720724bacc60118cb18dac76a3fb950d84dae2a53efb6feec4990fef8864784f2ee1ef1bb205b17421cc4f08bdddfd77a109e5487d3e42e8a89eef445f93fb896b0dd348bd445c5db4928f10e50725a6a93d0053ee3a8dec8a8c554974ca1c9f3e782cfbb8a374fae2eaad9c48140821f8472519dc60ca5103929b396866b4410aefa48032d4ee23f96b7844941ecc374511bdc59bd6e47841517f436f2443d3c3d5137c73b8c6b19fca26a62bc1869dbea0cb735ee0582ab6acac241941eb1a8399b6dc1c50cf8ce30ecb96c117882c95089335977749c11d413f487b75b522f89f47e081cc7793707d2758b79cba86fe6599d2e24acb66769ecf0924d7d01f591e42f1e8b22893dca599f36ccc02d63bb7875f537f12bc5a43da2c00c4ecd657e56fa1397c393ff15c3d8453abf3c2912c00ce24448a447c20c6d4dce9214ecd1f4075353e76c69b6fe5ce20fafeb0ad6c5f03dec04266f4cea2f235858fef7cd72a3b14105c008bb7a3e2fcca66868b74506f4c150dc533c66a17d4841dacb60b41541b258640a0f59fa7d8face0eafc996742062d11cd68fefb6ff9e6d8ff37f6a4b36c50bcd0de4daea347aa096818387896122904cc82529d48ed5bc38453552899f3552a2958ccaf8c572e663fd1f7488e22c9340ccc23928a51795d624639c5211e7be46f5b2f3f074f8e3e611f7802b7e968c35bbde28963f3cb7dd105890aa36641675bb294017a88ca00f74b4b60a4f3f5ef8f1df9530272bb748e7257852d249189d07460a7b99d0c82a4b05e5d04031c1cb51f929b8a43e6a6217b9f2affd7550f4b0637973998db0cb75ed1e60f6baa7b90cd8099c4c515ccad9e42a6df646b895ff4b44971473118bd01579ab0471c76e318d831ae48d47351f62e28f069781f37bc33772f1c2d27b2fbaece93dc8eb842c91bd315334b753ab3116074d8facb48713489b741c6efb397220f2cfe06370a9b0888857d07564ee66903e517492c990135c12b9b682cb58cbcac5bfbef48c0641b079f5e74e50d030f1f9d797842617f81b8fc72c369b59d7ad5f2c40d1e93656bd3dbcb11ef981529eedfe7eb460f22254e99015614fd30f0d7c85853ea662bdda8c830a766bfc9960f0b7a83eb25c0e35dd6b4c204d337acd6b91eb7e33ccd3ed6c1bca18b733d23ab48e681d84f89b436f23cf1d89e9066d53aa6d4980ec5fcd587a70084e6365598f2fac058f5e935a05f51bce14a0295491735601c8f58318fd044aeed6b2a627f2c84449090ae2ba14a1d3d0495869b7e88677eafd29d171b5a587f9115603fabf7c7a11a576ab4275d84bac9e4fded3c2d5af03c3bec05a8ba07e3bbd6a4ccaf5274c149c3593823ae369d1e23c8748e2c40270447479bdef73855a95ba359c93b1e76677ab1968cc4ff01940235fd9f9aff2d022f2f23c0561bc3e510a8176c0f3ebbad853cfe3cfd980855e247a872a01d7a3c101dfec16902babbdfef8531ea23233c2108fb3686f91e34245b5863c1756992d2e65f7e8eedb985df47045198588aad6418b350e60a32c7b75ef0b4b3ff6591bb921ffcfa2e0e1d088eae8b469b42a1a6a59672d6b8abf3d763722bb753f53320a56a86360bb041a65b294c73001f6f09a7fdfe6f2968e23c3d897e2bfa0122245d2195eb3828b201c5ce384225090c6939b0acd0996a955b433967151d0547533caa4986b6d0f3d5f4c653620105247655e257b4e440c6d44ac52806ff40fcdfc57483b1b14821134400721045b3adbc6d3747f317c4f44853be001274ec6d90648b3db664e0df71118cd689e04c59c39446532b80fc5a78454737330ec11c4c0024cf8f6905f1f54ed2e1611b9ad30de3d0e5a32ad5b65f53831873f3f246211b1c65a8aacf21d8e7a280563b8b34d2d3d7d541c591c21fe50c047e276d3837cf09191fd36b3bdd5d6c365fbefc4caf81ee30ed6689bdd3eb85db6fcc0e1b9b03002b1c5eb041fa752d43ba950127066339316f12c056a3c1315fec238580ec8223bef3e802a4a07afa3650d51c661e739f806a9639c5122d273f35a09a2f47ef1c136878451de97a51c6101bb352e0892fdbf8ffe89d3e4210f8ec7b34cc65b167e6af9b49350f3917767764c45cdecd86f985bf7c6046d24cee758ded220f67ed913d92378d057deb8985ccd6e6a255f35e98f4a5ec05c9658a98ca66e684f8441627eab4244bc0141b6f42eb417fce5b291414f23e76abd20ccfe7fa5bde47399b6fca00c88d95ae4cc46db2a2c4f756569f9c847b195a465448e994efb83482f733c3cb6e683391ce08b9d260e59ea533ee1ba4130beb04c5b0d860402929bf3915a9aad93f56db5756d6a85d8e1a4464d4aa0b324e213c4c18469061e21153e5b7d8e4bf88168349b018d9506cf9c4ff01c4039dfcd6fc30a50d9100ba36902af9ee013a121d0edfb7e7cca7dead586b0950ebcda7d9dead49ecb14837ccf0ad8aaa53a5eb6ec113301862ec604a3a054ab036ed9311ee267da95d12b7094cc6ae92f71c12adc19489837f135bd805997607026ea3955f0df311c3d303081ed49bccab80424791101a724f6888faa0f78de1f1a1712d2b96dcb03c09573fb09a44de51611ea55e1281ea34e0874ab12fda3cde5cedbed43d7694e49aad3b74230f74c8d0ffd1af398cbb8d38e598e03de751cf57ec22e64e5b61f871756c90025e8d199ef40384a1658ea61cb5e4f28c59e0cead024c4b88b4cd1bf8184c0aba16f6c55a4775921a2ef4d9cd3d816e53152cba3e66957b5879adad7d845e5d575c6ad06d6114f276caf096253c8967990d9160cc56ac96154cbe3ce736f2f1fa7ddebd7f6e761172f73a3057cad238e461301a7a6f854d298f9abd35833a15ec97e23a42c3518dbe89e2f3207c70c8db8e299c093150bf6c72678f2854542b9bdeb281353f1f0686d19e5def01c616cb19c5baa034c4019573a0b4b50de975e3ec532ea4808f4bb30976037b3e26ccb125608bf06ff0fe2be720de818bc23aa4764aa0b32f5dc2c2a3c859a7746035505954aca3a663b58b735825476e15ceb90aa5896d6373b283d44211c936ce267815501091355da8a8725da46c2c082cbecc5895f6cc2f7ca82a7db3d4241e43a77c1731bc7018cf1ddad7f4ac7bceacdbc9b74abe5742c82f6a6e89450f3ffa55fdc0370139ccbdd365f45208a554727e7adf8466d7df1f752130c97d6aaf5727280896774ea59e47aafe61b6b3b1a16c11b373fd43a89cf044c84891d420274b63184328050cfd6e7d6d1ea5b7dcc3f88cbbba25860c4cf00d345fe00b856e8aa5f6337a479c6e0f44b8755908b0d3960c3062a478c6c6e2b98cbf175225ea3a79cf12f2c67e8fedcb3e418a9374285dbbaeed712beb02bdb2399f856f9e0f11d52af5ee498baa4bbc92b10237cef8c7045102290aca055d113e603303d0a3170fc117be22ae194c591b7c8728316750a958f4deae13bf6ab8e40295ef8dfd4ab77a7edb3f15dc9f47f8a13d9230fe62730c837c11d7a6f09dd29df1ddb0367030ed3d89208404f19c2c2d37e5044b4198792fdb2c8239c8f20ce9e8997ca20df628863697eba96ea41b12a7aa7381ff304109868b0fba5a49f65923c6d10a1b8d4df30a707b91138c5a64159853adea822530ecced363544a4d5e17a5fb4a0571e8203161ef47aad7112f920cc00bf958e4680fba3f6a349965f1a8a269f253011e78e33fcfc9a6d606f796ee5909e5b3773306d397704e72b6a4acd946bb1dc77fa90baed3ea9c20c95b50f919b0fb2bc2824caf864329887d058b3ebc5daa8f4e0541eafc55822c18fd9d389920c570f13b68432498b23ba5f6a1c7b1cd8f9260ff6d979dd8891f949e45c8068a104e700662c507e5d013d6728f44b182db1ddd4f66cc460976af2cbc9e1952b9157f29ca3e4ab598886cac9e07376d289dd467f58d0dae7c2d402061eec7ab8b6d548fc1456a8a6383e82bd031512f339cae32d12e71093bce8967b7043ad4300763708ac3269862c5bc59ca3e241c5dd5941975a8fb00b8b627b50ba280ab74e74f938e8f916aa2b3a6fb0e29a14d79881a42333e9d904e92663ce0c47ad07506bdce2ce764311ddac7b4a3c19bac9129507b227b9994bdc4e825061f5e09e207b19fde4790c32ecb170274c7f3dc7a4d862e43a7c9fe0320001c940ab4b0ce95533b4128ae6e9b25ea0c7ac4be6b4eceefacb21fc6cf5933325a4ff4f2a605a83f4549d0e1dec83b568efecce140a728ac213071bf962ae8ebdf85e08ffa17427d540435e938c1908ec36a91e2cdff72194f1d0870232b7c86e2487da52081754a69a9ce349bf261d7a33e228a176ef7e2f4f15102cf63162eee54724daac20c5387ec17a52b3602165e11736c3c94fa269ecbb98505e2700a65d0a27faee321b9fefcb464c44103639531c9f22555417a882b80072cec78c8ef15e3ad0b3283fdd3778f85ab6229d6ac4505764c48267d7a36aa1787c470944df84363d6c3c1dff9ac3630d3d0b8ccf181466820c4652f15670fdebe94903f405572fe31f32af6ecf8d05faa3b4f7a3679ce03877f98c7d2b943fce08ff1ca35d0f5b82b7d96cba1f3e369e2d239ae8812d2045af21a0557ed54ecad28b75cc43103fdd5ef336f935e677143603ce4ebe11635ebc65a6e78228ad47ed7ad755f3c9070ccae75bb10f00357db40a8a87ab5c2b0f13811b67221d83a08da21624a0e949f83b7def703773a6844e12a160fbc739f89a52f6007cf531d4484b5d085f1a5ab13736c15654b32b97ed9507c16ff2d1d9e451a3e4aaff08fc83392047b0912c0fa44cb86f6607b3fd50bf6bb32c3721f094e1d2814abd559cdbb27116be3c1a06630496e0ceea84c4cc4f6ddc29e97f5fff6275a415570c231e416a3cfd773c25382ec79a1639f13a1c7f265e734c0049d12cb8b9f721865080e43b297d4e0a3f922bb56adbd0404443df98b92ef3bc7c3649c0d353e7a4b9a44a0583a74bf49caee8dfa2f4fd884fcc9fa9f6cea0ece931e03b0e863f0fcd1004379517ec4bb88d10b79de920d124bc2f29f430f2dfe615a73fdbe2aa835e8cae488b5d55fe4b830fbd1f9c7526209b158b822bafb43e0896addcc753cc6bf1a52c221a640ae68244aa2487fc832c9595d0ca517b3ea7b31bc72053969a5655678a3e130d57851c72a68dbe8249efe9071f6be64dbeb5117b5c6b985120eb6615805fe0851e3ed9c6b2e163910b1610bc751193f6a8844e34e99f69b5f520dbf848249468df3cf5ced20597a67eb153897bd2808b436c7e32a0466447942eb7720ccdeb5715e469e43e9e1462c13daac5bb32214b8a085b1f94805a96d86d692c3497c9b93a96b0ad2f618ba9cdba9d067bbf5add457aded77e5e95401b911d497adccb294d6d2ba9e4c6a5a6db8836e9b5d3404d4c17c06a33f6b54ba238181eb0ed300cdf60a6d7c90ea08cf796462384e4dbc6cb3f6a981002f009", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x1094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe320676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", + "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x1094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe320676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", + "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x52bc71c1eca5353749542dfdf0af97bf764f9c2f44e860cd485f1cd86400f649", + "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x88fbb13c02428a6ba0e3c362f503d78c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x9ba1b78972885c5d3fc221d6771e8ba20f4cf0917788d791142ff6c1f216e7b3": "0x01", + "0x9ba1b78972885c5d3fc221d6771e8ba24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000100000000000000000", + "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb34db9bf7072c23e5fcc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e": "0xcc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb364a2023e1987811b741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602": "0x741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb37428b13f2e5363940676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702": "0x0676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3add4f66f85260a9b94e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe32": "0x94e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe32", + "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195092cf984b8a6521a76175726180741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602": "0x741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b861e1707ac2446d61757261800676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702": "0x0676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bb7409db8b905d2f6175726180cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e": "0xcc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d9ae2954d96d8a5d617572618094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe32": "0x94e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe32", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x1094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe320676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x1094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe3294e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe320676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda7020676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5ecc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", + "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", + "0xe81713b6b40972bbcd298d67597a495f0f4cf0917788d791142ff6c1f216e7b3": "0x01", + "0xe81713b6b40972bbcd298d67597a495f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xf7327be699d4ca1e710c5cb7cfa19d3c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + }, + "childrenDefault": {} + } + } +} \ No newline at end of file diff --git a/parachains/chain-specs/bridge-hub-wococo.json b/parachains/chain-specs/bridge-hub-wococo.json new file mode 100644 index 00000000000..06837cc0d63 --- /dev/null +++ b/parachains/chain-specs/bridge-hub-wococo.json @@ -0,0 +1,89 @@ +{ + "name": "Wococo BridgeHub", + "id": "bridge-hub-wococo", + "chainType": "Live", + "bootNodes": [ + "/dns/wococo-bridge-hub-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWCNomXYZWuhwHsWhZpmrFmswEG8W89UY9NjEGExM38yCr", + "/dns/wococo-bridge-hub-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWKSq37RLqP3Ws3FtJDYB1xsjoBeJmehVYDZcCDRNLBXas", + "/dns/wococo-bridge-hub-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWDkSQzQYC7VwpJKF8VJtJZMG8bcvWXm1UEJSKk8UE2iv5", + "/dns/wococo-bridge-hub-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWQoUFxyPbpotTdUpfnsxQfQ4uyxz1beW5Z39LGM8JPhLi" + ], + "telemetryEndpoints": null, + "protocolId": null, + "properties": { + "ss58Format": 42, + "tokenDecimals": 12, + "tokenSymbol": "WOOK" + }, + "relay_chain": "wococo", + "para_id": 1014, + "codeSubstitutes": {}, + "genesis": { + "raw": { + "top": { + "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xf6030000", + "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", + "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x10b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", + "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x0a000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000", + "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9050f9ffb4503e7865bae8a399c89a5da52bc71c1eca5353749542dfdf0af97bf764f9c2f44e860cd485f1cd86400f649": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b4dbfc3b7761206de75b3a8d70fc3d44a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b908aa810c364ce8c3bd964ff3d424cc926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f52c4b3c3fd1c798e3843e21a38f1421b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ff9bdc7d7afef8c14d5b253d4e25b33db0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x5191446272696467652d6875622d726f636f636f", + "0x2b46c0ae62c8114b3eda55630f11ff3a0f4cf0917788d791142ff6c1f216e7b3": "0x0000", + "0x2b46c0ae62c8114b3eda55630f11ff3a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x365c9cdbf82b9bda69e4bbdf1b38a7834e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x38653611363acac183fe5c86aa85f77b0f4cf0917788d791142ff6c1f216e7b3": "0x0000", + "0x38653611363acac183fe5c86aa85f77b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3a63": "0x", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd00584402045e8e84760e521040ed361d686da611213512500714bb39cad5cf5641bd06bd0abd9638f539f67d2082d63fc6761fdaff8a1fa0ce30dde74873a8d1951f13478143baf1c7fc501ed2ffc5ee26424bdade7b6f29a59432c914d40f5b0d260deeca2b0c7fdbbaa337c730fdf8653b3fc62f4b4cffc7b7f86506e0f85b77f5661a70fdf8e55ec2f1e797db5d343c81010803387e6e77651670fc3c57c0f17fe2fc1ad70f4a8c13270e1c3c3f7e39052c7f835cfce4cfaf7177482a8ef48352f1bc19e278a1c03871e2c4c13986e3cbafdd05af7417fc176e116214ca295bf7a04ee0f5920d5fb075582fd9e004eee7dc070ee96f39ac978ce0e0fe1ddcdf3cfdb3b5013cf8fd9d6d5b3bac2186dfbf9dda612d1de6dfbfc14d72edb0c6d9e26ed40a6eb47157e3283fbe7fec88f86d885ac10d37ee6a0c3f7e2d2fec885877c5ef6e85c6b023e2ffe3d08cadb1fb43f7fbe331081db0c1871faa04de92d11a9c25f6b7f0adede8d3de933d0c3f7b5842d84284d161fc1f8731c618e1c708dddf62bf3a47fce53b3402df6ff68f0e219aad79f263ffad4ff0b636c1eb8fdf1d917ed8a940839191910db86fbb2b5becbf39d70e83efb07697ff8fc74fbacb1f8827bfe5b0c69ec3da5dfdfe2b87c5f76f390c62ffee8844f9cd10029612b318bec5f0ea1c812f1fbebc4410c7db1d117833c4f07ffcc79bc7afd0e3162116213c636bdc3cd9c3fe9b7558ced931e3c1cf1cf6cff1db5d3f3cf8f1fbbb43025f285eebae2c71ff8f6ff08b7806ba06cfc09936c8c14f62ae518802dd602815cf90ea1a8528d0084351009e81c3f0fd4d8d42146884a12800cf40317cff53a310051a61280ac0f0fdbb33228d8c30fc1fdf9ceb46017e8edfeeeab70ecb10c7efdfe267ddd55f002f7e7f7745a4bbfae3b5eeeafff1cd39f839e61a85287009cf40317cffae5188028d30140560f8feb043e21961f89cc31afb7767041a61f83ffee33ffee3fdb5bbfa9bc7af90875b8498439f636bdfe0b7c3723fbcedaefefe1884acad978cb8e0ae5bb3c2f0e0f7b7b6a3043c020773683b5576c4ec74d9c9610769e76847079d3874ded07942878d1c38726a908384ce520e169d2d397ae4c0d19922e74d0e0d726c90a32527881c1ce878d1b99223454e1c395ce4bc91932647889c31395ee41491a32687889c2372aac8a122078a9c2c3957e4a420874b4e1b3a5fe4dc20c78d9c2472b6e848a143458e113943e428a1d325870d1d2e74d4c84943670b1d2f7484d049810e179d2c72b4d0494207899c3572b2c809a303448e1a3968e434a1e3440e133a6374c4e860d1c9a2a3854e173a6de8ac9173860f2e7c64e123091f5a7c6cf131840f217c28f948f2b143eb8ed619ad33ad315a575a43b4886815d112c283382d1e5a46b4bab47a6821b572681db5acb4aab47c6829b56e68d9d09ad2326a2dd1e2d2628255048b4b6b8716102d245640b0ceb0cc6095c1228365863506ab042c3158655869b0d2b0ba608d6171c1da82a5054b0c8b0d6b05ac395872b0d6b0e260a9800507eb0d961bac14b0da60a96165c10ac3c28205867505cb0a161a161aac33582660b1c15a83a5068b0e9617d6142c28584eb0a2601dc1328285042b0b0b0b4b0b2b08d696d51eab1bace658ddb18a63058355192b33565aac985829b1c261556565a4aa4345878a8d6a052d2aaa34546da8d4a8d2a8e050a140a502951915192a32aa12a8965460a8c25029a97e50f1a0caa2baa20242d5838a08d5169515d50daa2a2b285438a46e908a418a8e1497541da932a92e526c52665263a44c90222355460a4e8a885411a92da9a55517a91e523ba4aaa47040d581a203c506b502d41ca814a0c64085818a831203f5065506c5060a0dea0c94095060a0be407981ea227584fa821a83e202b5054a0b5416282c50605057a0ac40516153d091e9baa0289042684dd0353a2f5039ac86a03fa47e48f950bf785ca4122b703c3820a2916dc1ed50814d0cd561ee21e730d9918dc9bcc8bae0c4c8b8f08ee40a3c2b340be5c1c8c94a648185c246e1ad31b36c65e60f560913189c0b4e649cde7049a73cb830ab32528e0e88037020fb20c2c7122a36542950c9a19a830271aa82334ad9b07a0206931ea637a624930ea61898dc98f030bd60278b1c2f2617703a7467a85ac0b540fb82b2e1a9c1e261cbc1760396145d182b30a6195d178a0487c56a4c0a063e7ee0ca9c84e07ce07ae0624071a049b49a50b5e1baa850d03d4c30e8c298eed870903385244382915b482da419e9854423d19067c832e419690269861c23976416b24c848104436221c39063c82ea418928be826de116310ed9062e417328c24234b10c988654433dc0df4065c95d416292d52625259a4c2a4b04881495d91b2225545ea4b8a8ad41429295251a4a04879493d917222d525d5448a89d412d40a45a247ad24e80e9b1b5b0ab63128961614ad28343ab4309a1cda15da1c9a149a155a15da190d0b6d4c7cc1c441eb08af8aea0eee87d40d3eb8acc2b06db82c03180165c6c68122c3aa20270ad50c58535253ac98ac053488eecad60595c36e5911416db09a816a881a05eb07153a2db638740eaac6b687d462dbe8beb06f745cd036ba2d681a140e548dc604aa8a75a31bb319d1899143d013d034e81b54087a443481c988728966c4335447aa1ce810f14c95629b82cb8252d9a8f0a66c52c835f4064e0b0f87f9c644639e99269867a4ee9868660db41fa21afbc589052735d68b531da736bc1a5829362eb30a8e8e4dcd1cc2844337c4e90a560e53ccd4428554a9a044d429e8163a03539b2e0b1947a605a724dde89672bad00943c708f946ca60e2a02ae35169c1a065470bcd0a07120ae9c55485e9cb76c336451a21a790544829e4171985b44256616ac2d4c5c484c909d312262fa627e411b4074e0c35826aa145705e5857621b561756132a213a21ac18272d34e944c7ca8b131b3487139b79c5a6c4f6e544c4690d5b666323a6a0dbc285c1ba617b43a5474b89235d0f2b1b7870565e72b0d88e905954656c557838886c7060e45c3155a15b54303965d831b50a8ecd14827b01ad62b2721a22e78ca6a55e31d558346c173a6298a6542c5462e488d15193842a715bd02bdc52ce163309eac3fc62a9c8c9e364850e13d58a1a4662c901c274838e1b394b262adc175b18394f14a1535ee8404e9b9a05e7c55687ce11dc981c27748858d58005848e12261b221aca854e191d2d1c9906705ca0d4acdef84022031aa0c04a8c150d567016b0d24388498aca8b84120880428312b141dc904b22f3182445c907923c5112044392241b8c2d34094a9244434d210129241005910c489c50e08582e2052552a404c5d04489035a682283930f3431128393282a9480f27281273e20c30a412fb4c024ca901e9413177854976e81484ad007923079824340a48293254e963891c0a39a5892c4890b4d8c0c0d395900d192a0a121270b18008a899632c4440951500b4982825c10006a8976e24213264942102548062849983cc1444d8262088112161ea544072d69e2a449122549983cc1414b9a3881005113199c2c59823f4025d1829325412d848042a2a58420482889142921083ad2c4091329528226f0a1b83408983cc1518284a238b900920f75442709922148860850a085a0175e50428101a08c6829424b82605852444b216a1214250886264c1eb5a5091317745044f41226529a30894244435092100c3d79a2244994a0168698c83044688993a1213ba8213a86244a8894b4a08428e801289410226032a484091193264c5828199604d110944205d1519c2c8043656929414c889844710203910c4a54282cddc40913222551646821099193212949983cc14aa2c880599c96165ae264e80349828894b4c06448c90ca68641431f5042d444061792102d098ac2a485264c9224f1018235aa6eccc06107eed8d64b464618c6a20f4ab7d02df009ac52e775a6ce9c3a73ce391f3620cae8ee31d2e88336a554c618a38fd8b4db2775eab46937a5317a8cde9446a7d4bda98cddd1146974d92e3dca0e423a21b410c23651e9d1caa6749e28b5d646774925758fdd1dad8d32524a29ede8dd4edb3bc6e9557ad562a4d57aa4399a4c596beaa47b4bf76a8a31336516b6a44d9d76b791e8923645511aa36d1929a5d4463982a49c779c515277b7564ab7ed544ada945211a2b74f2b9bdaa61d2195725249e18c905219a38c56f300d476f796b77b6c2aadec4c566a295b6b8dd1bad328b5f6485b4ed931ca6ea7b63dba5c817e965a08671115887c1f03e689523a29e559c090384f725a4abb1829ed6052dad46b94526a324a199b6e51f3683b464a1d77f4e15ab7f49316393a42bb7bd4dbfb27c7a9d3e850e5dd0e21ed1c053c37bb63c7d63414ca5a77872dbbe794d2d2ee283308a3f57992d1ba161b00b43d84107a7ab6cd7d76d65acd4ad9d15ae724c72500019ca7c0c52929a5ddddb6b5c8797bc71829a5d23d5a6a6d8c1da537d70ea5f40821f5d853ce9eddb337dad1bd63bb5c11721db5d8b1a91480bb006208d14485a01065cbd8b1a39c514a2935adbbdd5a6b6db4527ad7c9ae93d235cddd5a2badb4314a6b350f8075b74ebdbb4ed3bc45698c07a0b2a9bb76d2da6ab6a7b5d6cae8ae494d4a193d7a8c515208a1bb078992cae63877cedbbafb50d8cdba1bd2da5edbeb3640ccbadb3bc208238c1dd0e89436ede8edde1ddbdba97b778cd129a5d4673bed760a29841f50e800701f1edd23ddf16edfe1a2945abb6b10da181b15a375eb313a75db326aa713baa7d3e8de2d216ceb6dad49762d29adcb38dd6d942977f729a395537ae081071ea452ed31524a6137f47677299da7dd9b8bd1bddda3bbb70928947487314619a5bbc728829452caa64ddbbd3bbaecee3c46975d53f70622658cd15d528feed5e5a4d16943e83b4aec301155ed2188e22486a01868092d0445096a218a932430030009621285680401a87c749023b444c90786869c8cf0ca010104107cac2ad11225529a288942948488490c313871b1aea7a36a12f4e4891210ba84189810359121caf55c2092e18320189210356112e54992255298c4b07302ec031a9c80800804980180acba8420404a4802244848c9d00792bcd084090c5294c0f0260c31117afd1040011a089113272e12ba04254151584142498868086a4200d60b02b85d821422294c68081a81000d8406262e044579f25205bda0248a132229495a186202c39224444332287121a8859e4a14450991140100116100444aa20435097a218a14006c0da48520295282a23c89c1c9922451826670b224284a1225525a581294a404219801803c591224c52783610991920f2481410a93264c5c707d1002179844099a21c9014a30800180b41094c409d193104459224236143443d050121a94c410c2ce0b4e8692bcd084c90b2f3819f2016300a18382a2b890248a1322254b9c0c0d29d951110549f9199a0445af4b48d2c409132951826648124549d0d092243404b5d0844992264c94c0b0c405179c2421a221e8ced024288ed081e13158543ba0188cc158762a92b1c8813a5654818a8a6214a808c6602c56648162b0a8a828a635501715c58a62d1818a60aca8a8481645a0182c8ab92c2a8ac536a02e2aea585151512c36818a605151516c027551cc81baa8289601754c032a82310854048b8a1c28068b2050171559a02e2a8240311883b10ad44545b198042aea18058ac18e4da06ea0188cc52450c762b108d4b19803c5600c02750c021d9171c0ee86314851d201dd3e26d376a9e9cb161a451fb8147be49f3e07c9afecfa56f6b2cf16c325f941b89b5fdacd2e9ce15277f36f173a5cc2d98574fb6cfad3676f83eb764d9768629335f59f6ef63698be1b994c6f7a3732dddc5da2995bf2299d66a85ff85d507e05b2c1dbce3b2c7b8ffab0e8d775f4f14ebf456bad8d9f50d5ac8dd16a9a971df5dacd8eeba36e76ff3264f3f22f435cfd7afcfa6e791c66caa63fa50ffd297483f3f4a6344b7c14fdcbb00dce93422ffb496f866cf07c1a9f3e7c4a23fd1c25a6921ef1b7f0a3f1157d7a7bed01f542783dbebdd48b3ecffdc9fddde9c32328c49f5a36900dce4c5d11d4fb15f2b7dfa132ed39a7afa29fe228ea37fa92aa6eca1fa5754432bf82b7f835768f2e71fcdcadcfcffbb25f7dacc6dd473b9fab97d78b3eabfbdd73f7244dd07ef6b0bdb65e21ffeeed678b2de471987f47e7b0df3cc46dfe7215b1bd42fef4b3b7bf41fa995b9fd5dbee427ffb65a2881d5e9dfad9cfffe8f382485088fd99450c3f1345dcfd963dd57ebeec73573eebebeec94411dbdfee43fbda67d9cb8e4806d960ea5f63fb4d5ced4771fd1abbbbfddc25aef44224f863faeaebeef15ef25ca526c6325bbc62e4799577320f8696002f87d5e71c7efef1f3dfb22ccbe06f9fd0c966d9b6e93cccec15dafe64a18fb845cd6a5bbc029453d0ba3fcb13fe96fd26b9131cc6f270ac8619bf5f3372c1997efd84b208e1c7f88242e2d7a80546988fcff10a10fbf914af60fafedd6d6d7b2d78a3859f4fad335d26857c028559fc32f40bc469f6db6139f0b79fdf06dff428558c2f986559275ec980c01fd56a9fe2de9b11fe073a7787eb8ac417823abf7548381c1f083e77b3d52ebc1fd8bb1375b48e488d65f0b69db6ed94bde2ccf9baf7f1d5ff8911fac71ef9a66fdd6c511f7d7e628ffc8c75557f518fbd6bbad96676d37ecb367bfa4dbbf637e7809ce0b0f9f1e7cd27e099029e5e193c5fb6cecc394fd836cfb6ed6167e47481c01fd9cfdfbe6c6f9638bb3af627fa00c51ef96b96d62cad59c2f2814021d9c4db67a2894f6ffa7c02aedbf64227ed678784c3db039dde5a0f9f7e4d0b9f6e269a387bd3cd2760fa6bb0fceecb8040215bf6da05027fc88e488d5730ccb22c0362845b84580ef4e00a0887b3589a81b6bdfe56ff0bb78fef0f92c20f031ca6bdd7bf6dfefef0a38ffa6a071eb452315603c7bdbcc2c934f1d4715cfcece5954cf591eb4edd47d469d59d7e25cde0985d78e6c733b7f09c34cc79b92f437ccaf1f3898bb7fefcb287278dd5101f4e1a1fca3442dc17e1383378730c4a2579e50cce1466dca3eae9b33f84374b3398bef60f4f97c871063ffb25723cb30b43086dcec323f1b9f9c12f6b97c871a461eb56acef8679a7a8ba5cbc3aa7af4f55dfc1cdb683f7e066cf836fb95a9fbaf9e7c79b8d3cec90cc8f2f951c561fbebc0285c487dcffc41f8f5f63ee8b3925cde0faeef0e3158acfcd796516f8a3b2be75f3afde839b5bdd7770b757ddf8f42bac39755533f51d9c2fbf8573c399dfdd199ffe165f05e3a7383878cb263e7d8d293ec518638c27eeca2c515ec1f0695764be3ffde2ffc49ccf07fce8fb973dea3bbdf7997efb3c5ea9e4ca767ef6eae7567e1b7d7c48ff0a0eb312f0213ede157d58e01ebedffcad7a736bdeece1ecc2d18525b45f61e5be7e96b8fee69ccc42adf5bc562b3fb6f1b30bdbf876e885b3cf43af4c1f3ed70de332987fe5aecc52bf2cb59c9e3e0bd18786d823ffbfd5f2bc4683e5cb2ca76fc78c37f4c2dce9e96b9fc39dbefb2cb560ed7d7c1d7b20f74227ee69883e36f6c077fdb75a32de3cf4824658bee9eb7675374b2d98becc028570328b5492666416c885e539344883399cfa31406cc106c0bdf4031bbc350a055e2ffd0006bb702ffd9084b746d1c0eba51fcae00dc3dfda044f622e094b2e58fe068d3cdc6ffb570ef3fef4fdf08ac3baef875a1ca67d46bfb72dfbbaefbe7e343e0dd1c78d624ffcd46f11b56d99bb7bf609d9dedcb3acfa767fbc3b24dcc3ff710e090af1af799a9ebbd9b17dd3cd8eb3fff1f9652e09d739e7cdef5f86d8fae739ef9c7e85b2b73f7b8b5c774522cef36a0fbfec6148633514e1f9f5c29a498031fc9f08bfcc69c199bef609f917e1f9e588e17b6724e2f85b0cd7875f8659e2a9c1d76ebb6b664e096722ef88d40b256221ef9064c7be51cd1dc3aff5662e09d3b7f5a5c34c5fbf7eaeb542a8c4d56f87993ec3244ceb7cd7be0c6b4e8cee4343ec890fb0f5b39fd9fbcd12d718df8da24f3c5a7dca8d707c00fc79b311f8f3e7c30e09fcf9ed30edeb734750c8fceaff13b17f3b663c22c7331339ae4f3f734958fbeecb1077ef7545523fafd07cff53eacb10432dc6f851f5ab38592b53bda9ef6aacf5b2a296fab1de95eac6f9296e0cdeb2aff19c59f6cddf20373f893324134f6ff8237347b83eed8ac0ef9e7ef37fa2e93b3df779bf7dda43faddd7cddbeea2f1934f43f48947b0e1b41ce6b81f6e71d82ce2f8243f1e459fa825f6c897f01e61f9f0511fb4fed98fb0dfaeb3dd670e6fce7148504886181ae1f89366f3e16b0fc5f086389c5da1f9f5b5cf7e83f001f5b59b21fcb2cd3bfff9ddc3ce08fcf9dd97258657c7bef634bb12961fb5449f8e3d52462df52951c5f03351c5dd9b3ec323ac0d71187e1ee270f7dc6789b5b75d11f842ddcd10d7dfbe7648380c1b0ece16779fa31358bef7b5bbba3f7dd25dddcd4415d737dd0c8f30fdee5e76370f71b83e77b3c4f239242804de2c2586eb6faf7d6b4f3b221a9784b36f6e90ab1fc5f66b3cbf1c02e86eca23c0b37ef3bb3332f1fc1faf9fc4f683b83b231bae9743823fe8955c708b104b410fa8b830e59c3226441336c84116187ce14517a91ddc7c3cf840e50331268eac30429aa202373940edf0c60e2ea8f28115eea51eaaf080871e7304c92865c442ca6f2b65b6584af90696522a91a93222183c70b1c399243982bc18bf79c002c797ee038da2121ea0c01de05ee2010b99d7ab056b5f3c3c4ba4e47901f100bd8078fa045f90b1c38b249c80c10d1e0f49a634ca9cac58b166e8f04687a40dc829e594f2bd242a584a292fe0d91ddc4b4954608a7b29e9090f236988d70b03d6be3c661270dc6fa38f1425e850420b1bb8a0c2e814010bbc2c20010ea98c0e521c539034194725b0f2e50b0ad0e061426ac204c6e25ed2814a0e6b8ee048c0091c20cc88630b2b2fc8a343c29221197184a4288d3bc8a0e00d366cacc1e5e006090725241dee25241a20b1e0dfc5c2f3b8dec5c2bb3ccff53c2c3ccfbbdee5792d345e0420000108cc53f3e45ec255b6fb78b1a77e5b2c3fcfe95fe7afdc55e7ebd53df5e7cdf43d7755fad93b72c242b4e5307aeb77fb74f7648bbb7dbe7beac39be9b7dc551f56577d04781eaebfc1eec809cf5f790e830fe9d7d83b07c4f08c3e7048addfddbcf9b15febaefa3f2e3f7e7e6133ee6a95175e7ebd1c96ff84faf583386c7efd141c96e9cfafdf11b5821b62ea374fbd42bd14f348a38339e79c55bc60557982e5b599585e2def795c047877c58fa70a96957cd7f3fcac62c5245f6e31684591f42f3f97fcfc3cf27ffce5c7f75eaa91f3ffcfe3c10970fe17dd02057133c18c22e968290f7ad4c4105176f4f1e6d10eeeb562c32b8f6c48c29e4603530ba64b38681399f385f3bcde2afa0c79c38836b81421851d446c5d661449f10ebdf07c6f7ead55fdf81d7deaf5620f7cf9d96288a588347888820b135ec46878be37049ebf7258c513093cab0c9973ca2bc46b9c3d6c87c0ef4bb5383c363dbe81656e7e26c0520a5d06e27e09bfdf7582fbd821fd5ba3caf07a890a1c8cc2bd44a507dc9dff8f33c0fbf8f0771c9679708e778807c3975c2f5929018e2f8518127fe53e7248fc6f14208e31c6f8e34d32f0bde82387c087ef9fe72ef8f35b790ffcd51a6fc3bd64250c66e15eb282046e1e580463d25d0e2b3fbc5e09b0f6f5fd5bce8e18f16bc28385e273916b87651b7bfc3bd7b7eff4e5e7211e6c3ffbcd7ed65dfed9a700af7e63fff93f9e7d1277f49143fcadfd1ac30ec90c10c35b6f131e4caf90fcc961f8dda9206fbb2b5e0b1d696bf781464646464643f20b77903683a34f4c0b2b92f8d2069c3cf2886248bfe7b00c77bfebc77de490fecec0fcad3b220ff03cdc4b555a80fde1f75b1ff9396ef1b3dfdd918a85e24b77cdff71ebb078b3c4f3bb61f1b375d7fc76d7fc15164fe2ee76453864ce6f9e79853cd845ea8d191ca0c00b1a274e60c560e1b2c9cf96de0c71bb8b3ebdd962e83d8d42e3fcb0fa99cb10cfcf1ea6dfeed343720bd3a7f6e9af1c2631bd798807d3dfe867dd053f058f3efcee8ad06bed573fe9ae580f539091c70f698800c28621f4adc32aa6efe17084e9efb84f2f191919fd30843e8fc31ad377459f1e426f1e7ae179adbbe4b7bbe40bf1a28f1d22e5378fbc42de848e044f8c3146f83142777f19e14081473a36b223060f363c28cc97432f6ce74714b111961735a0c0f0e537f49218be9410ba0163fc2d7eb03bf83f3ee7c78f9b73f1abfeb083ef5d740867b0f54471ee6a77e51d0cff847b69ca1adc7217fcde998206678bdddfdd5d0c767777ffe6f127feef3097c3b26c392c3ecf94231c9f739f382412c071dec1f1e34b87f1c42bf48ae1856ac3eba51bb6e05eb2e10dce2eec6f02ee251b96707744bc1ff73cce61fd3e1ff76ff36b1c3f88b736c18398466e7ef4614724d2efce01314c37d819994f6f9e3f7ff3ce8887e77727dd257f935cfc20de2247bff9b0ebff1321073e0cb82b7efd8030c001208755e830eee313d9a7f3e61807821c448d0c1e0c9282c39e012b38c061dbc767c161d6088733c499c21fd6edc0f07d30830187e5200ecbad26c8128e9fc20a0e8bcf0187a9707c181cd64b3e2c81e30fb90f1cd241f00ae76e43e10f7a279289a1c438715ad12748cbd4ea5a78c26b7f0bf25a902c08aed7ba0b06c15109b708b10e6e74d4c0aab5d6974a9a34335f43623ffa52495e914a328b34c37aed63492579258b34e3306aa954aa55667987754f9fc761dcd377390c3e7d02386c7b6a29bd7966a9850599e564aa52693e0bd107ae549b177d42f82f38c2cfce37a49a98c6d1400cef194ce195664cd943d4c3cfa6bf0fff666ffbecafddfbcdcff66f7b081e7c6e7de0e3f38370db7b74be7f27a7d501f71d7fe7eadceccab93e6efed6cd2d0c3bb8d607c2b86ed7bcdbc36741de6c3dafa5baf9fb66577cae9f0ebd3097bdf59b539dbd465f62ee0a791c7debbd455193a705db7985bce73e7bef8e70d9f6de15a2d44289bb1f77c52e8363e672170182e0f9b076b08310baa028800e05c15485f9dad3af49102c34b5df36c881f085f0f6044c5f96d26bbbce7357d7754f3f280af0becb07bf4dce469f0f24e04342b836f6d0fff10fbe8e3d947eccb22c9b9c8d3e1ff890bb82bbbe2e213c343a456af4eea2df7d2d77d1e7be1d77d1df3e1e77d1ef2e02be85f081f0d9d8639f7e2b382cbe772a686fef0a12884340f81f0fe1fbe0e99739c05df141f8bcd813ff83cfc69ef83f31fb629bc1320bfc426339dea2c206890d92890d365d93e908898d0989cd11121ba40e29226994523894bea1d40da57650da86d20bd9983e335def3bcd27f579fb93473def7aba9b25ee6ee670173d1ae5f7b763c6d32ed77ffa22d6b297f54f57fb367dffe93351c4a63fdd0c93ba2b647a4dab37c74c57c87690fbee886cf6e9cf8feebc0bcf393f0fadb07d6add45b9bcc2747e34666fbf262b2c443ffb2d72da977daddeb65def4b7df7d5efe2fd8fcb4e02aa47d9d4c7794f4d7d5ef614f5b5f7d8f7aaf6f5b3eed25658e3b096bda679dfd2723bee82de0357dec3860d1b36486c903af7c2d8627372915ba216bf02313c921726b96bd2979ffdfa98dede6c3ffb97fcd8f56b6ffada7bb4cb7dfd1c87b52bedddb2faf26d36f1f4ee88bd102976856a9d56be8431c62ab9d9c273c6fa4939bfcc6159ffc7a1c4da84c342f2cecbb92bdad8acf4abfcccf4bd624fa417c92bfafc98a431f59b471529c961f5e71c03916a4dea3a1bcb8749f09b5f4bdc52fa4cee157d4c12ca3bef676278f1636cd580e7cbeffe44f92521c11ff2e5cf9f38e5e62636e8d7b806faf4c620a4104ed4dbf99e87ba48a018d8c67e504cec88d0d3a3be130c632d14032d180ac5388cc236d852086118995fd8e61360180ac36c5b63cf61b47e997dd5bfe67c3bcf4833b18c2f416cef184cc1d80bc578eebebecdfef6662826f5306f8fead7defbe893fa08dfde1cc447f5f0e617b6a7b75ee6bdfd8e3eaadbde937dbcd9950f87388c92d7f45aee2e916bf025465da1eda27e7bd3cd2fee127976ed663931457d7def8ea0ea29fbed0a41786198ccdad969763e7cfb410bad9d75da0967855c772ad0d77e8b5cea533dfd4cbf6d4fbfed539feaeb977549fd8f6f6f9f7e76d5a2147eeeaaeea21f1128104a7739fa21a9fff1d815b16ffad811c9ae74177dabfaacf7d0dfbeec619a7d9ebbe2abbeef8a684fffc74d5fbbcb7bfec737fb6d9f7dd25ddbd32f7b78fbed61a782f6dbf6f0b35ff6a0404ce947c46ba97d5ceba3cf8ee7307ba19830274f7d71a536f8712ff5b0056fbd39d79d4a057da854aaff71d81151a1fe0585b01ec5faf940a010d645b235273b22ac9b6398f5a8cfda47a1ac45bdfdd811b13f3176447c3cebf371730cab50a8871d11d4d60e53b5fd06f2f18ac32c9189fa545f8658f571ab9c4dd914b03d614a200f3a68a988cc8f3e3f1e74d09a1f6d837de05e0ae20cde22379d904b442ebe05e279b5603aff0585349e375e7117d53c78f8f33bf8f959fb393b1520fee07774726e46bdeadb61accfde77ff137d3eb83b3af7b63a039ab775739f69f54d01cf6bedb3be76576645cba57e655ff5ed98f15097686255eae613ba6fc78ce75d22c7aacf1ed82242f625565d21d45565a8cf3ab8dd67ed7693bb42a8573d7cef8ea820eb1239f7a82b647fe2d82199d87240e08f39bfba9dbe3b22a6ff71f8b02b5221ee4cdbbe7eed2efa75cf15e95e65b9875fdd320fa60f147da4f7d0e7ec0ad31def54e88a38e63e9e3ed3273fce6b790ffc17862e0ce3d780e9cfeffec49ae31520f0c7fcf9f427d28f612a6f9651c63c705516230c7dc0bd84c50eb9d5dc38fb7eafebbaae7a9f50a66fbf88769de7656fbbd597d1c97511f52bcf5b79deea7fe2aa7bd427645a9d3cef572bd4ea511dcaf3fec74fa837997ee5a1565d664955eac4aa1eea4d2bd47b52255312e5dd93d4bebea9e33eae3bb261ed66fad9ebf8db4be10f3ae1d73182188347c0bd148412de4e6efa84727df945b3a2503f6737bf43559b259e0f8094c21fda6bd1f4289486d2501a4a43fd4f44696ffa843614874299506fd24cddff38f7e5222c64faedbb43b23dea7fbc7b22c726a811cd6e0861caf41beaba77b3c57ebad9c36ebada7337fef651f843cbeccd1805eb94b8c5d8555921ee6a841271ed4e8518b6bfc9fa650fc76a80dfd50e7e57ff27d6f8da2734bf31acddcd31dc41a8d5d7dc8eee4289183e4076dfdf1d962b1808eea52b6bb0bcd16139836589aed3b8d73e772fbb2242f566b8755d966559d775dd675dd7ddccd1ace5d92c3697fdc5dfe0b7755704f6973de76c840d31fd84a0d480ed37eece48847842fa9d25fe0c6fc75f834dc0bd04441457d05c71026fb1ab7f450b1600ee2520dce0cd39da11a90f3bce5dfdf55bb9ab6bb6a6cf2d5c6fe63efbf67bbaa6dbb1a77ef431bd9fbed69b1f57efb78a7afba9afbbc7deec61fbdda3beee1eefebee397db6a7bbd9e2daeecabe1d331e778926ae377bd915c93121ed7e16af10fcfab45e0a7f1cd95e5e0a7fc4db33c63915c304c74098b4ede4faed94d2f9442ee41ca59372574876fd244cb2493246da5466f4b32dbcb254d636c56a707f78e45a8438b841682d54b26e9f3bf926adf45e9e3cd3cdd6badbe73ecb23dc854856722f4dca9792bac3a45a4dfe9ce9244f9be9b57882485996c13178b39cb596f30b91e4f665ff1337c941a41d99c98afa187d50f73b2985e4dbaf553e8448f047f71277dc8ddc6f96abdc476e8b34494a29a5ec25937b79442d9ab7d9b8ef7f5908219c270d426b2794fedc2731fd1a3b8542e84f2badf53c28fff4fec18ffb38dc1e3d7a845a849ff6fe69dfde495e2e56837c6b5fcab7fe86936eca124bee2514e2cfdd9f28bfec7670d67485b8afaa77fb9093ab97aad5cdee6dace79d6eb7bcdc5779e9fd710981a2cf4f6acba47c29e54329edcfd7baae087c7985e49f9e8314fea059447912f5de6bd0bd9b89a685f2bdac2342b5e04d72527e12739f94107b6764c32769bb22fedacf4f3efce69b1cfe2639fa82f4a1b556fb1ac3ee6dd4628cdfbddcb49b3d7bb395b25e4be18feea54e7dfa337e6bbbb99569375b4c35ee37ed85b84ce33e7291fbc8dd4c346d7c0a8568d9a5f007ed88506f83a194524a49e18f29a1d12a0bd7123b7e74bd4e089282c3b6d73ed3779f7dff4c0fbfba52a1221116583256830646934bc84f88d36e8e61eda1a42fe1cb2d52cbc240215a279f4b653725dd2f97297577d7ae907cee35e95ff670ac06ea95ca2570ae4fe442da1761eaefd225ae607e22fdb2dc827395da77557afd970f6f8d13c609e384127e866f1d963d8410d2d7b4f74f5aeb79dddc8561fc93afd1abc3bdfdba42dddcf2a7371bf1a74f1f7648be38cc3e7c08060aa10f35fa35d6e86769dff4795d11d4d32b445ffb13caaaeeeaa62efdfad6614e596bea8a78e773355533753314e3f42dd711d9363929e6bec692d24f62f951ca691482f137fdc4eee3deeb9b3eedb3eff4f16399e8855fdc55e7d3cfd673ab615e0f61991eb65a4e27ec60f6d05a6bbb2b44df64c34021193a4cbef71d7de27b57e28d7ed5beb6b7b75f21faf6a17d8d6e374331d65a4b4d500c8657277beee7b75af6eb739f94d8f4f5b7ee331483b7677da7cf12496cbfbe355dee2b50b4b6bb198ac1f5c370bf3dfcb23ded886c520bd668967d8d29a5946661e08f4aa191e73ebec009679a712ead77bd3ef81c64e7732fe97c6e33dbf773def6f1dbbe3f04104c1fecbc4ee6eede69ee59063dfbce2914721f7eb18b9a77af4d3370c9dbb81b87739af76e9ffde7fd79b3ef7e7e16e1b2e0b01c29a59c69aecb79c6effd3e4f33140af138cde0094d6d6ad3c39bebc4596c45230f8ebb8137d7a7f0faad7049e3fef4ddffd976089fbd06a1bbd4efcd1d4ac5eac08356101fd27d9a996670fd6dbb14fea8ddca5eb7087fe2785e9b4fe30300de1c2fd1c4fe9c6b3f5eea01b07a378af23bf2dcd38d37fb14e1423ae1e02debbaaf719665ddbd546e1f7cfbe5df3e04106e6efd0737bbf0cecd2f9d9b8360f93fd1071a512824cbf1717390eee620ad9b5ff6e6970737bb5c1ddcfcac9b5b4baa9bbaa89b699fedfbe7ee3d33994c266d7bd3677b290bdec6dd389c68947d363dcc2ed1c410c2cd5a9b3d6cf2cf2d6cfa954e4a29a5b4034c29a5d487971ae4c0e535a9a559ed3b6ee03d4d25e9ca968a63b044add9eb0439b881892a698ca0038c375878f060adb5d622808b1a3dbc80d3822890c8c4d1c8b8c921084de332441859b880066c30a1c3901a8328c8c4608b2462d0438040d364b600c3e5861af490858a0222183fe0e1c31ad2891e7a4a40e72b3ecf0968b821e68c13fc70050509f8a2bec14229a519d5ae54e967e228cbac0cf132adf1668d1bb041858da4f93972dcb0871352bc71811804241db5154ddb810a6e06aa2972072b1ee89004a5948201e33d3da64cf603e6cc534a2911714ace0c5455ec10565c76361a2323231c68adb5b21185f7349831652866e30ca5aee74169395da932e79cda9c9c1a3d4c9a161303e6cc164188d9c386255250d26176c1a2696dc8a1d3c60d7cf857c541a5c3136ac82c9b42060730e894aa06d73a258fc65f3891c54887232fd258c11c6608f9e28b46e68b2d785803255f3e240b1710c018820b0906103b24552cd424d912e07c3105ba400ccf0bd4682f98230710d2c820a90c2058000334be40218b35ee48434d1a6bd26843421a38b22519fc7065eeb186524a7b50e31b8f399096b43053850c3d0e30459824b8181919191929b911ee2526b41809a169796c44685a1a49043563ba000e8a8c1d3e5ca9b29179810d3c326d4ed08351abb502ba83d7f2569ea7431a9e0956def53cff409ec0527778d55a2b162aded3491363b9d28a4604a005061456ec0e5d6489811e53bc50c38a206f661b4869a295278e40010f44989182295990f1a9c28c172871f4721fb223dc4b561c1de10078d1c2488a3b54f0e608d811774587773dcf3f5784694a00e210038b25ae00d3c50b0c40a908f1aee7f9cf6323e25dcff31a921bba54f1018d227ab0e204306a88f857754197c7a6e466ac31a38d196e2a1044fcf0464a1f3b44ce39271aef69356bdab89143b4c091d2ab9862584cd9d28551162c4a5698b0451c7b58c9010ece70a20d901d58256841144234b1460a3a4a78c20c0d0b28a67c41d891c41674f84046122fa57f5122bc373232baa1d65ac15862821185d7840c5cd0050923f4b0e28a1f612c6185a70ea5a3b8078551888666709329e20c9c2328618238766061b4e6a800532c4d244dcbb952c5948419f7a1b71a234d1c2c50230c376c9004095ed8c1439691f1c20654bc8f4bb3d25a6badb5d65a6b9a3770ad72881df08064d070d380339618038e334865d610204d13199934544cc121b1c7111b61dac44187990178c1e20397d6cbc8c8680aa594aa31f29e3ecab01aa52c6b41a1b2061c3adc28c388140ca12360ba83894c1b53b09851323232ca41f6120ec698c1b407d31c2861fa84153746a0f4bd36984ef1022a5e2a9d34c394524ac56893650ec6107270c1c20734643084ba302553c69a24cc9833e032adec68d0464586067b1c35a00c30ce88e9f2c51e360800ce948c0c9ca42a31ce7681317030838e2ccc40410b02200796d7ec3546464655e69c6f5773ce39a938e33d9dc6bee1b169d9e13d950a17aef525b930726c61ec4002001664ec5218347e30c349102c28038e2fb808420b1e7aba0308315baad840658b0857a49713000146075382e88114270c1a7508a1c7f582b481f144172449040f1e8cbcc04153c798af0e248e8e785b6bad6f784fb3b176783f6fbcf19ec6b9f553c8518498247a48620c23fe8852b9591902b543ec072b6cac00872aa840410f21d02094f4b0628e90bcc1e20436bc80871a80010219206440660a31901acd192536be443144970fba8854689054e9a4b0f5d1470e518a3a4b584ca1e5c00453b63459d491650c1c1510b143c5b261e268027770e1522689277c8043c78b1dc24a1e8d066f27c8c5c8c80889524a698606f7d21d4798d24683b57861250f2bb2d481c699213998be970653374b573c7f63d65aebac3f3f9e338eae08b325a90d1940f800c3892e910d0cacd450868c25c250e30641f4d0029346aee0cd0eef7a9e2cbbaf471a2d6364a0061e6178b0042607948d0d3afcffeb4ddf600dca4d1694cd952a40c6c8228b29b05843055c7480038e0c0e7a30b2b8d65a6badbfe2813a78f52b66b3147b1acf69f18f679ffd56ee6a373150c1094ce0461a3e28c172c2b6f9e283a4523ed5ae47a9ac2b5cc9b031836b65411a5c6bad370fbd3c77c9cf84f01a7b2d6dd8fab34387fed0ef02e4cb2c7f932da55c05e1b57b77f37818dbe9d309a149e88fe1c6dd81f0c18e4e8e8f96071db056aa14ca3b993a6ed3325be994d19b84feee6093d025fe8f5bdbf176f714c198bbb3b935f87eefeeee7edc5d3ffef11883900431c6fe7e7873fffcd8b37ff60bcd18638cd25dfd664a895ae10d35ee6a2c5b4a29a5942fe99c7442d966c96f5e618932c6e81f1fd64133a594da34fafe36e1cff717729392e79f39188cdfb0f9197ebb4bc2772c045fba4bb60ab42f22703395b0fc8d76f140c0dd2464f9652a61f78caa02cb975fa612119e7c69e340c92f384f2e21e07933eecde422abc07972511a83055394b0d4be94406a1b673d544ab5629d4c5d16c4cbda95ea85f2ec13ef64eab84d6b363f99dbe7b1945e0955b02601ddc8b623f71b3cfb06787e0bfd46a7e933b9cba44ec09300789aba27904a10af2de562ddfce26e0e82bd27dc77803a996e77eb85548a6e80eb0342c0a8875f5837077961faab9b5ff4555ffabbd9a06e8e6df1be6fd7fcd919e925cc3d548a3ef0cbe99a6e7779f0e46ee6c0972f5f80707d592195bae6063d402a2b98c1218509d0582dab9c4b0bf7c280c5f55fafd76b02fdb42e3499cb34e89c70287e99d4271e148afaa5a20064848e9b33dfedf307a3f6734421fbf9b0853800fee8323bbca2cf130740213009fe88ef799e6d712fec38f719ac3dfd64bbe63f893e16264121dd3fecbf1b376e50e826213bce30095a0b95a28f92126e30625e3cd64cdbfd9a84f957bbd903583efcf04c82db3502dc1999b0dd94dd6e12a6a55de664250c396497c13266821605734e5a6bad75428974cee974cd6c69ddc19873c239e79c904e7a051cd3b3cc68835ab39f6f1b05faf3b346c1723c50a9f21a62db84f954b2aff24334ad88b609d31639b677360993e209e7ec36c0ac41d25969ad53721ef5a88775d3d25f27bcfcd5b109c0836526b797109b46dfe5fd5ce1c1cfbdd44bd2bedc4c392c9d73cee9940d8d8c680329d0fc363f59b7a9cd3929a5744a0e64d9b7c36a9854d2496b9d934e77c92b7d684a27849452af66997d3a9f7eadbf550e89fcf9c5da199197bb4df3901d11ffe9ad5a63a07c7fe8922b1ae3483c89b472a330bfaeb6bc8cf0b8cf2febae88a79423c053ca4a219c52d4392dcd68d71eb4cc023d9c614641e9500b533a29a555d096562cb58401cf97de500bcf8fb6f38ac392b68070cf0546e2ec6a8da0861735640bcb5803d928d0b8c411c7f4ca26814e4c63f5eb26226b9044314e9c38716688785034e484b235c4cdcce109a77f5022843ed66b496965a535674a39a5a453ba7c971c1d99a5da4b88ed73754f66e9bb68b0d5e594083f3ebcbd058c1d116bab0f5e2bf6c4df7aab9cfffc7c3e9e9948d28e08bc2defcab4020ffa6ff3017242a8855c22411b0c9fc2e165a8c5b56029653709b2634fee36585e1f722d30449ffaf2c225d792049d702796221087d41b95624f7c0d8b3b91dd09d712d3f080c6b5c82579c59cd3d239e72442bf9896f3ac98d4a7153aa5cfe145eee7dbe8b3bd10dce6c25a665f4fbc17cb8b1a5e5e585a8f2e786f35e184d07dfaf53cafd592d67d32197d88ad6fceb7f3eb7c3b6b4744ced9199997f3aec3c38354e61af09cdeaa2589249eefdd1105c4891347622971f344eaf3b583e94aba0ead56ad40ae4a6b903c3b62f058014f5443dd58eee6f8252661199570354231948ae1ed2621c7a32e9efcee5460613458deec4f7f287ef9f22a0d96ef68da0d8e9f87e21725dec0f3f30a473438c725371d607aa9929bb8e469708e4bd1a900f3838d5fa86403ddd04fb61b4ca1bbfbd06a367cfff94189eeb93569bb1982f3ba0dae9f5bd0880a180fbee5bc7693fdb00419b2ddb8a159a637efd3eff9591ebc69db45394cbb874a8b290db6d639ef1087a91a5ed4f08269a54d38cf0d47ddf0629c710f7a048c74465a65d233b65b9db98210d1ad7e5d84ea5dae17f75a76f3b3107d543775339bd9ecedb51f113dc5891307ce40b1bc338ead79b2e6e6ad73f29371d6cfd38989049653082ca70f58fecc611ec9973f78526636044cbfce239ce7128e9f83543caf66468d073fcf258d8cf9057a41c60b3bbf60e92ecd0d171b94327a97f6e0514a29a5b7a5c33210a63fb9d919794caf7744fceb4b7a25d13c12429c387130a5ef4fef0c13e20cc637fed23fcedb5bcece179e7f6329dffd8df8c71b8b106ae13e072901cb9ecf47fb78ad46817e90149a0812420e01670f6f5a86a63aa617862621befde2c1ef16a4803a2a93844c014b0dca2b3837214043bf78a15fe8172e948a1d3c2f5d9253e8125da25f2017344ed02f9c1b19dd153120b387ed37e4c2d2b39ee7aee8eff9b4a4f5ba789ce7ae18c45df15bd127f39a82bbe2d3a52096f31c4ad71af902ca5292216b4d7872485bf28c1ad29694bec0f4330affc0f36a689a84f8b40c0f7ed6d0686870fc293787dad29196238c2a565b62491881983e459e9191910d43a4f06ff95448d2dbf2e3d36fe70b4f7ec30e89bcf1db04af9b3fbb151acbdb1d8147e2851225846f54585b58fbf91d875cb8562d5eadffe3daf7dd33dffbcca32e3c69b0587e4b202cffe96cbc794784aed0b8de21179e0fbb233eced471059e167737e7fbcfdbc485e595afea51cdd62778f48bf8cbbbd36a08615ee1a6d9c2ee964edf7b7e919bdb6ce8519aba49f0bcc2ee9193d4d60c85f659c52d9efc22f25afa1eacdb954f987ebdf98463a7c2c4f3ba9a84f85d1c1efcecc2310ac4d985e35b0993d3bb151ad33bb4c2f2bd3b62821067eac0b23b79758cb8bc4d5658c2b9471ee260124c82470d91c40871050f00f7521070f0766a87e5a1f905c79f2d2d0d98befcac102dee92b508bb102d38cf9fdf9d4721f136fc41e997855cc1f25d8892bbe44f2159e00f7965ac42cfc23fe8380eb6bf75a702c4f6eaacd0d87e91c6f6ee94c07b9c6d0cd72f3faef55dfefcf11ac3f3239afe3f3136215c636b1efb0dbd69f036eeaadec65dd5dbc0eeb3cafde93375dfcbed3bfab4fae6c7f266a289a4e10f7ff94148e10f79fd9af97157bc96049e7ffcfc3886730df727f6a4f087944598e6189424f0fc9fc76153fe45835b84a218d39c9e606b9e0c9570b4edc25bab1b05487fdb9c839dbd2bcf23e25ed33ece3b0bbf19bc20d10786d813dfb6e95a064f88fed4607058f6f1879e1039ac068719394c931f1f1ec123982435fbf688b401a219a8646a598a4335ca9843333390000034005316003038180e080524b2aa6af20114001179b2525e4c948aa328c95114848c3184104208010400600818438463039b800a8633fff4469cb02112bba7b18c6889720983c7847f223b9fa0c8e05b82de07071d25ccf677f412f1965aa818d4491dbc287da19482b109b0a6ee1f9984e00db19ce74b3d9a168fa6ea485682252495d29dd0dbd223fcfe7e96f2d297f6c51639505a73da552aa6b995b76f5751949906b5ac454006d2f0a35901f92005c4a22a21b958db58153d758a38548447420459157a234b34bc3c86970a262a4a44a8fe835c3accc41504cde1f8769e5be53f14a268e726ba2fc37129f22cca15cc173a186afef1908ff09ee0262b6e6ef8cd027f270ab50cefffec365b712098ff0a89dd72516d13da3d44e0b19ce4d71b5f069b80a06ca562909fc8ecd3306976f35444ccc32ff084054f5e04ee5135c25d3580150d04de271e15270695536ed00df8a051bd03821b5ef8ec63b2d0f17496427d9799f8feecaf0ce2ab300f10df58e96203ebda71c902d61a2b61cc9433be973f0bf658f3bec0366c79fbaf34b140ed1e42b29eeb28353c537326a83b6db7216d17ca438291e60f1bdaa41a71a43a807ad708a4a96813cb910c0234324ea62702d044e8412fd27edb3c1347431fa23b71940b02128c79cd05968172ec84427229f2409574359c3468a7273a58fe88953bbbb53aecac0d75bb1d8fcd8ab60f730cbba170612e09b1c71d89571ebc64a7884c59c8161d34c41d20d99ff5523722e068722461bc8a4610988c2103c7708faa59b4d821e14efab164ea248a5c58ea3a92e110bd89c68df5bbdca69ea2a0480a84ea4eb3e2c28de6bb457e82818697e0618727696e59f781831dba51f572b63488b5930a725acb7086a47029f909463814b038a913756edefe8c955d3c857c7d755bac9ea6272be3080bf970bfa5efc42130ac8f8e4be28819617ed4686eeda6b67d4d505d014ba3775e383f0a5324e08df6d96c6d454c863d31a1901982c2ad2c3f02512bf94ffb81b02bc62084f6a007fce6a3a79e51f83639ede732bffbc70fbb95ec2d409e7ec36d5fb607c227353f873ca7660fd652b2c04b6975a806f4f526e28aafdcf92f91ebf23a3baa2ebbd54900b0f170c399abf58d814679d71d7b5d1ef9fbabef86fa4c56951a4df4f3d8feb9933c2341225c61e865bdc2f20d0dcbb3facb10ed0e5850ba175d0e061839214e01bd04a5383df04a775b2c3f3ff7749e35b84919db2c0baff729d72d0e1c36164865d75081d2eae90bbd05bd4636ea8dbdb72e01f635ff9e59dca97445abcdce6842103cb0b32083aa9866e33e50ba4d9921273a2d17613ddcb2f78bfaa9682e888510aa701967a509f30749b2ecf16608a4d9db59d1592c54c2d25f7e6d076a76953a1ef347e1b7dbf3f73b8ad8352842ddda9041f9b5e94a8802d553bc62568fc68ae7a3276f1279565b4f2f8767e8f4f37d00ca8e27c7735db6c6082024e73e7027903b65457d791f697ab6600c366f74511a4b85b0d8b5a7d21bd41c151057d11f9205702982159e2e513d19a076f054d53792d5d0b8b139315bc4afd1dac03c9731971a22abc93ab5a4d314b65c10530e27ca1ceefcf793be863d480d617b506b9e292debf6ec1be6d87f9ed8999ae77e0a8a821a10f88d22a4346324376942b484b10ba9de14d1e3d7468235b74e089e4be7cd4cac038ff60190558201e13cee9d765b18569dde3d5c9a68c70f2bfc3802ea584546d5ca781c99926a12e5a3bb8293726f0b7c365ae1ba511515ea2656d04c043529cbbff9ed72183fb7abdf6a4c43dfcec55cd4bdb0692b5cb5853cecb78fa384c78d61e4c461320fd53047e7997a5681b8d5ba9c49d2093a6a656a13a0f2c2acab52b0ed1c2678373231ec0369eb9af014883062dfbbfbbffa0627860309337088060b465e25593980f1f63245db4d2dbafab0b26ab0200e7f4b7d813185acb8688fc62782b90036bf6bfa83598f76ea6a812a039a5917496731e5105a0c8a4e27298743c02757f31b929baf6d5961ae7222251b62ccb4e20ad5f62a90a351e2cf877f34029e42ab0aabe7918178a8c8364f4292bfcef84111020a1b2ae040594dea6ef73d83d618cbe23adf4424accfcf206468cd7faee4000884af6a4f82cb7199d4b8732e937846a4ce0b7cf3890fa26e7df5ef61aa2ddd943c1eefd0bc64728d0d612855f115a773ac4f46e2db3ca201eed4a6ed6758e9686a54c665b24bf7d3d0aaba98c5a3a14df6885735abb64506ff81f657d34ac1897f31f658d20f643fcfa1f70f68a8ea511df4bf8ca7dcf89347ca81561694bbccf53dad64847253a68b1660bed6a141754bb6fea99c75e95665721c3502fdcd72ee05eb3b0d88aab0e1092e2b2e9e27481492e39ffb7d5c882c88b6bf3d4241f417ad9b7cf46e09c8e4383100c4f16e3e64b6d25b1096b4e6d19bc6c8c660e19feb36595cd08cfdea2b7ce1868bedccc720d954ed6189a3e13f8c9bf644c20f96e706e5ff68423cad062a3af527cb0c8bea85ecfa0c6b4d0e864c6b3246fbf537ac68802d6e6f7d120035a1851c61cc7bdbf4cd88edef952799ebd24a4d05c7cf82beae23c9933acc09d67fd851ae6553309d46a160576c1174ae9351b8798854f2712983b80f75b1fc971dd8d50701eb2ced7f31262dabc006d6284e0a640d4cdf9d2f2f14b81ef7dc2e430838da441be003525f17d0b326bb844877e457fa0ac7479d52822ba84d1eed93181468e5a5a671e8620459c36dc4e7f26df061f55e800282e43970be4772046fa0963c0c7a6d80ae040a02bb891e765dac1ed7641a5b45202cfca6039317c099b6e542b823b1d1711ba8796f724995e1ce3521f0584ba3b5b194234af17cd4561df5c52b29b12f8a0374b356e71d7dcb974b051146697a438f2f531f3b80907ebf298f3312a04f6633dae17bccd8b4902da9d624a70888230f2947c48c7ae139c4d9295770b05a6b3efb6366f7d20af279d9fb84df379b5e4b3dde917fd6514bfcb570f4b47e56af5ba3e9d27896cf3a23e9d89774f1b7e89b61de876a106fdf3c936ed9b1c520c696cba71f98934360420ea32bd33e7e217590471a5d65975891a0443b83e2f310b0edf9d0aabacda842bb82b7756460b4d7ef8f035a2b21868d0e3bd4a66cfc6cc7e553b3b616b5d7fb48d7b80cad7a6767bfb40676fc7ce62545203b42225e2f93d7bf41414b7f0bf051549a92f946ef1d2b184d650289cd0673093ebef15cc088830f99553b9481f649bccbdd06953ff311f0159b7c845fb4e9a4c97a0e5de19a62f62e43b81636032ef22e7adbebb64798d1a5e5a921aca0ed9189350a01e8dec10a70630197bdeb8288f256ee9394093cbc2fe5604240434e82c85adf0d31e882d64be51770e82708a48d465dc4f792f63aa385280e53571b5e0ec57f1f9d8bf153337e1652dd7a11e4ce9412206650cb185058fb6efb53dd1c4c3b7e33940b0cb00782d36eaa25a7d4ee3035640b2d4ee07be3f88e4b126d2f8c8eb17c486851da2c9bc045906dade52a85614a2bfebdb0e7a181d2d374622f65d5cd396f85e6bb252500234dc5d5f50e93ee12da74a9c849e88e15bb81de159a60d20bba68cb8c30d1806955505d1557c08e162ba002707263cce400a1a879b6237f33339c05b565251ae712ba49c4cd0a1fa82a582e3919722c04a402236b9fad914b846beda7475325f9a6f14a6e218b709db346fd56e35766bd5876829dfe06ca938d3fd9d48313906ed0b4d1d36fe5e6e10d0e550323b98504f8763bb4c7799671c626272895b9e6611d4657b36acb88549ee1b5e9ce29420f82638528ffe4c378158fbb67bcffee197f1e4d3cce5b2d57470fb2856ef3e683d5bc446df6ffb905041af320e8a9acdc06b0b045ffab110bd9140bc8e356508e606d7f52bfab673edf130631e2a1b2c84b0eabb8970b66b533bfff4b44483e442e90147f3778361bc6704c9f6c3e8ba2932c466de7da05c6ad8b62b354d575d1f28e2e3817d2ad8284a6a87386c0aa37f5aec395a7a0c6a2a4a4b085a9800c204efe084aad04ba95773c587915f8b3e1c8d855c8dec7e16a75df04d3e42424417fb1390892892f1a3adff7ae09e0c7bb8938c98ff077f74ec63c9dd409050e58033e34019be50a9a035c2ff8447ea304d318aa23a7deda022e6283dfcbed6431b7849bb96d7aa62293043ebddb1df1116720dd3361b17c419247cb652f1e915443fc6be8932d642ee94881899139e128f6ebc1614311ad4e10cb524c224ce0ac23dd81a3b476e9f840bfdcd8c30a2993701b2548f50b9c504a7a629a322bb22b6c469e807fae416d7a6ca486a78b89f6067eb45a01e235da8191b53a72325e63b6c06c58ada2cd3d1cd5a1f03feced9f56cc4f6a9dfc540dcb031bad8f42d94b1817f2b99e74dfb2e0ab98d1cb5aa92bbaf35fac643979475f33a2a44303edd108e9070d643291f9e487472034f87dfd605f841afe6152c33f63c92aacc9592ba1682ed3a3fb3a0a80892e1d618271e60411910201456847e935165f320ee402423ce913091b8e2f8f9e4f77f498759973a426d671df83cfcff8d078e3f38a67e2bc691c57f56599802af9dbc6e70a1365e2be85cc61045a346239f050fd3cf15c010e5a0de10655c9fff039f56a6c8b881b49c489e2e08f24fd80823301b3c4b76d362b2520e66b838f19cd360ac6334919e456ba4d2de24dedb140f3cf367eb4b4941f9a0770c2a10f4d408e7475210de2d4e8d9a80748afe78b3b5f5163622eb45a0cb3d31531b4a0fbcab933b278eac661d5046a6ee06296a3f77fadb5fdfd647b1be9cae0eff5fcfc6876cde50ade9655edb34e626e01f8dbec4a4300148f7139738314c9f78c61ddef08a415c4beec71487b279808d8d04f118d824f5844e03988cceaac091528395ab7e88fa5cf2414e2e95affb4dc6b21bd8ecd3682da314b11ff9d62fcb0cf97f309d9b84cb0dd36bfabd24fb3ac5eff10fefda1f833b9a25564747d0deb94aa7282ad0296efbb52ca5bea7bf23e1fb1e8170c4a3e1fd4f60719c6b5b44cb0c1bf6374d159e3528014170874cb5884864d80bdd7616354afa9f6a3b7d9bb4c82b83af079e780aa45a4e56bd23248c08531e629f86c64b94b0a1b1c7176e1eb689fc2073805b1f8c45a8b7ec3f562c3d5ddf422f939fafa85c70c6152de4663692d7e4e3d0a8802a695ed9926470982615ad63b43913611b51ced522895669479bda82a1314a6c66290d4e887764cae247782b2fa9a04c86216ac5aab45b5b95e5798210e1128772d2f5065ef6780302b4a1828ef2fe8fa14197bf8e57c784790fc2db41509497feff9fcd949f459a09560380f7e90eb1e3b57cc6dbad2890b08fc4a40c1f23ffcff494361854d66e5648b8a69f6af222987df781981205e5c289a70c549df74f76efdf82b22549c06e7bc6c1904a79dcf4f411caac79e5c93c451a82226aed8440fb8272abfe9190a7cc48ed99f738a67319ce9e3da0cab966372ac6c02826f1cc67acbbda5d76278f5f1571638f6ee172d493ac996b2bcc11b6591cb6948228d2a989bf606ee7e6ffe49209fb752b8603f4c2a64128adffb6608b5f09b94722420fbb1a98116d4f254c93784ad71ccf398ba669851ba948430af0456da252358419d5674ee9b61487042ccd6e58adb58beee8368ba55d5efefe7fac675233878d337cabe0986c78a84e2e71e10760090af95b5fb8160aced8f345a47d7b94ee300bf62e3bfe92769c0d8adb2a48d18e2b51c7c164127dffffe3df979d8a292ff60f095fdc157c420797c857ba7ab3c5ed766528cf354a3bb10684bd08566ebb00f2212da607d8a704a68d820c9083f9c0c3cb1bf4065ac91cfb19ed9c74da4eb90c7ca395d5f7dc5f811b2d15e0d177a40f86b8f7eb621c0fe2002ec000736d80e542759b32dc1ada6687a60f1a50164435fd9c7a30d94696e36859ef54aff538e22fee6de883213b92605a128c614ae533f831687b5e75bec927f63dfcbb7e95c3570920e5c3e47e2515a4cae43181248570f0f9d3da5220254e8ea3f457579485cbb7ae5ede7a09c44596ad4456ae04002e7688e2bd6b6514046476982ec80728c5a5de7b6159d9175a1309c77d618f7be11b8728a019501c571909a496a0df1e268b2d8788821f5b80a93febd912a71530d6832193e4e0a09dd65b1e521748efd83c5128ded6d21d5a1ff3bfea6ca3bf4685cee29ee0f5fc183a39f0df78f71c401bb039b38a21ffcbbd506ea311c118156488d5e00a9f711805f11415999b88dc3e731f7aa3cb6dde35171b95e93bbae1e1160080ded4e0b76f174b6ee6826447a440ba31b79774bc2700ac930068c76d5f3d0090e19ece53c76023cbb8c976e63b0e1407044ecd76a0f666132c6b2cae15867e8392bb633df67c805d72acfb530d21af5668fa70e0ceb025e3743cedd844339c2f7d649aa37edae9c0cae71cd35938f2cc468a9ef09338afdfaa377ce7f64ac7d2bb310031446f7d9497f13a3596844fcee309adb4ff0c8a6527769797ef52b769d4aadce3b1da8ec676be77e41149e19f173ca9fecd8d306fe797d5b6aa93d8daec63f077861e13427d039cc3aa1b1f3c82307292c1b1930b719fe35535b316f4194606a877d95a78862596f8ac5e06c62b0a7ba2ce8c42c37b203422c8d90eaf98bd7ed0a2e8ea1108c4f05b0c4bdf9cb40a1ec40aa26273c40550da1671e825224ff4897b27f7919e92ed11299eda8710837162751c1f96ee03908d8e1509a8cb53b6fd5fd56c2b77fcf7e00a546867c0338945ccbf3d5508648fa7cd18446820d283ec768f03f57dbcb7c26a0e0d7ab2881022c6263fdbdea9e021b152ae6ba4aeb757ef1b60caa95ff9af37b9661ccd370d20485ae3a61a94e0ceb3ee04e8592374b8c90e221b4fd83417e0d87d0b90dbacf99224324e19a5b637a61d89f83808300119069116ad2e19c78d26c83205c2e06c17795ad453ee6d47955c9fb5253f3b46a5b07ddf8d1641ed5da6912c1f85c3bb23436c16645637b6b79841d85247ef80cc317b0f40550ee25950868d38efc17df52a01913f59587c84fa089c2b63447067806c3da0b9090c5bc33d0d8d1421aad66ecd9c706a2b809ee4193c6b71a3a384fbaaaf5f47c2c4f0a41b148dfbd3805c86b1a73425da8524a81a7b9a1dc322142d7cc6b7da25fa106b6de887170d85cf5b04b915b78dce04d02dd1950dd68e61055bbf5db1b5af1fabca8c8e00cc6dfcc120cdb970c50e12c1d73701f00f4d0dcf2a8cd91bd2889af3d4879d8caf497e485b2a6c44d8454d2cb02bc97880bbac71b099124999a23444658ad58eb6248c97e9c598faa5f10ea52b9300abc4ca06f5d21a1a586a45c516a0c585256c3a410a4db066666c444cfbb89bb26ff5123555490a7e47cebaf49a117f5e81f1a9b8c57209be03a788f451f52536c446f2aba792417bd1d8b74a3ea6d009b602bac73c2f01458f0da65440628acd0af53bc29f0e721dd04abe2426d0ce470ed2a42312b78cc486a8a0992ad3f59aa4fa165f40fc1a7151967dfe3144795b05514447f024e5127f11afd990ca4b1ad1429174a91d685889042acddd1020edd07dab346643594ca8d717cc27bc82fa8d018a6d04061067294def003ddd5350b25e93130c91b35a482bffc792195706d13676f8082f134b34eeeceb78db8bf31f77b68580b667f2c8d86d2fa62c59dfe9f6136667a11caebdea53b84a21f88494a26103b393ed394c520ef25712ddf82aa57b470976fabe3e629df2d53a259b8b4630edb37a22160095197f51655ca14d5e6d64d48539391d2be9fdfbccfd01104bf37ba949288d8254377cb43172c2f6389dc8768f231a37e8f4165cafa67cd0a2f3f5c08a3b370e73f302d0c10ca063ea46cc3970582bd5d2ea781120c1d20014c20c332a321e4d5151e3db8903a14a7233c62635cf6c0e02c0434164ab8ee26b4e627d369eef0bc4b3eb3f2ba91767e6be0a84bb70fcef720f5366f63df229b6331db067753126473e078ac9b1cc848786b24b0c21bd8d1ed2e8cb1bcf8795cd58be6c19441c8a41161d730aa2cb65d15ab1f5c9d57a8dcceebbc0f22560c8d87055c2166385d3e33f88a18022cfced79da7a60d939ca36a3870f1ee9d4a9cbb5212ae29feeab8cc0197404440b38c6eac85519de69016b5f1ad0ef1f4dad51522d3486d983812765a42aade8f859c953152da41df9141bbc4f7ae59281b4db14f24acff0b39235f5e8b8a55e8f3ac90b0c237b7b97bf1a2c419918da08f69c91a5e6973339d434b3b4f3ece1d9dabd8931644a9277ced48658b04e1eb11b984e7b6d5f734932208561c9069e90ca0e615ef82d9dc12f7aa0c16fc7e9512d1a86a772a08454bee0066c7eca3e7c90ce619cce1be8038faacaf434b752532bb0ca45141ebe9fcdc72a48ca6485680467a4213ddb7f756d47953230291d678bb71f0c18ef01b71130d0a71e8161ab80f247d529371db418f3c1727f557d4e1269741a0e6a1f7317102eb5c9270bc20fc0cec4550006b1c13892b203e62557a361e198717f02541b35e532cb364c7d8940d20abbce6d03fce80e1c28bf0ade4dbc5763834a927bb6a424e002b2f9e014b401dec941a07afc43bf9cd25c4933f1572787eab436485c8a8da581f513262666a6354f5c2f3f044e419dd3ad031df63b8aeb154ee008b69d8f101bac28ef4181b7ff60a404d2bdc9be14446daf489d197eb6b341c2723c77c668f0864ed0fdc337b77761d8a7a5da6c5b3cf4af779379e704c08373f66b7188b381a28b4db9e96ea4d5dcecf0f8d4a64fa60eaf33445051d183f7d203326cb1eb01920dd68b1fc45a59c574d87b9f08b8c59a54467d9beee232027cb1b2dc34fb6648d47eb05552d26f7326e338c8d9a6ebd6eca51c9e1ea1c9c15c6e02a91d89dc7425975d20b5c592753efe1b9efb31cb6e840723e2f8ecad092353292bd57e107c3147da1e47810204ee1b9138b04112de9711a7310548000629dc0c58e68417c193359a0cf0f06fa0d17a317a52a4a5a4ec7b5945cecb8e337f8056140a5993928eca2efa063520be19888e7eea349218e33c05e71346894bb087d0595e2618120d63bc2002cc5954818e5d9632b9dc13345d15f336ba6ddb9d0b2de6f51a482b5c365d80223f957e7aa6420458f504ec77ca3a223223bea6d96420c374fe4d1312c636fb3e638b084661171c45b01d566c99579922ca319b9494aaacba9017160cb878d868b7a3f99d38ca5c1869c6c64347aa1b5a0a06e7c3bb4e932bdd0df529d61144f61f80667853c62cbadc6c4da073c7ebdd9b29733a2b6cd838d3ba4080be80126170253c5050e336ac9a8ad10d74d9d7f86321538c9f6a30bf5ae9500964c54612919f04e9979ae6520f961a4f6d8fde0e677f4998e9dee44f94441915c56d942c5037110a5678456b575b26aefd36975b5277a958cc2f425acafd650a663093e1077623d9ad3a4664f73c26191cb5def7edbbd4eb6701721a51f299088774e70a91301e70066de0f80983cb6ea865284e6bec2e65d68b271ef09fc7fa317962ba68266a9def9876b85865fbd4bdbcc75960b41fb091ccb8e98750b545de3786ea2bdd46dee9847df67272817a25760bad9ac75d08c816cc7e2110102a04edc67b2aa5d695cb616bfd31f9818775173b2f4ce3717dff84c486ba32d4ac8d7b370a86ee7d1207a661c5cc097897e7f71f2428d7bdfd5cf26ca57b4fb1ed52362c44c7cfaf57d643154f8cccb8124a4d974208dfafe70f0ec6cd1b3c003e361019a651de2180636b74c31004b700990841c3e72492c8d83e9786d763cf455ce6092272119ab98d7c7881253e68d77a1e6a3ce8aefa4652f5fb6de6e530b1a9b69e6f320805444e7c6885158828d2919e2fb14a5e99bf54501c548579129e5746eaf9f9f52e8c29fcc912f6e3482c004280e77eb5c4c04d99b4829fa8b3080772150f91556d815daf58068b78b4af1d78e6b9a8f19f55cb022eeef016d0c7df2038fda1b7c059ecc6b7d6514fa967e546218731481ebedd5c58d76a33018f16b8193fe6aabfc2634e3401fd85a5e3bbc2ac7b2c38bee2100749a13babb11ba999f4095c361caf4a0d7e9af829059e0c418e8865db30f957c674af04875664319f5479d5f2164cd73434dc44b6c4902c54a88d962b187c0a4026756307f6d644e2882b6afe25729ae3bbb23fd2d2e1830f22f34540409a20b4a11f344f9adc7bbb22fc2475536f5be2f640eca3d01132bf8930c856abeb40f323ddc8ad0081230908fae7718a3750c3f05be05be56aa8b05a4e05d8432c2d454dde0e82d267801371ab42b2d38f56c801cf580c60b2646cce9123e5d2cc558533aac8eeb3ba4a2d9a338a4c92314b52ff92e56a8e9459f004b20bc49aeffa612e1653b8366609167994c866644300f094718a4e92ecda647a34f1f274a0084b33f6a67eea0fba32bc6c6a1d0da56c85d45b0075bb6d9959b57df62a667f0e915909a086168baa9e8e7b221e70f2f70812461531d203929e2ef06a751357099ac460482ab07e052506ae67d7537c75433197c19a0cb4f685eeb1c67d9774fad1d532502610aee0aebdbbbaa5e6e5dcbc9ce0f65329d7ba51075e82804cc03b57aba04d7107a67373bef46e974f0e86eb771473238b2422997a9eda3184ac4e7d7772910e9cbb5c9661cdf20fe478786b492d86b8d18097dc236a70beb3cb0120c9b5b7425be8dd958861ff9083824a4ab0fd2ba1fd8bf464c7a61f4c254c9a6cbd9225f6b59c0362ebfee9878b2c1b89324004a57dd68ca0ea6ae6a33c8e5602c1182f5d602e203395ee60c186e38391c3be5459ac0322a083ab8f5f265021b6a0265060164aec1a484f8bf2d55f794aa0796386027b6433fe0b1c6b7b960be8ba4504ab0fe57e7a240c05f0e2fdc98f3038e7943e59484de333887290ed6daad0ff062dc261bb90a9dcd16450ae902715ac3f3379de529735bc20d903b7b85ad15eaeb74ff9c15b1f026a07b53d95f34238204a73493c9de1130e47b80a9ab1314fd13f701f1094cfee038eb9f9630f441aa0c9d55028a12bd8e2253e0634b510ac2031faa190e6aaa4af991ba40f942cc90bb938801d64f71e20a33e1f4a2f7fe899ccec1803e83f4489ae3bf3464ee1bd7ec37ef735eac1d07fce9bea11020e03643aaf8a4e13f7f7a307d577a44a5257ec1d12b337047285e7ce803b45d32840f8a571304bd31733ae74642af71e3bce1c7efcb42acad1c22b20727b8541a99b90f6e2b5a25485483e3261a08c1da1cf4913a4b5fbede2cc0ddbcdd2edbcecd667625cd6f14a539313defe3165ca6a088a7098cdb2ac8b0974489a0948b76973663ef85359ed65c8cc1015281fd7186c370b919a2be6351b19bc00766ddcdc87ec6db23aca7a3344640bf4ce44a2ee3c0478b30d3c6e0a59c71bc313598b31fda2d39e303f669ae57d9380367ea2b0d8664573b45c2455194598427d8c144d8dff15b40bb3d684401a8036867e0bc4a2a5e89a29736d1edc791f0083de1cfa03bf0a0e2cbfd84497cd40df1a64cabc840f00bd7e3f5f5a01a5d1d64a012544062f12f89f1a130325029a17e8dfb8c5a6451e97190f803d735765b1ab7072fce7cbfbc62c37a4dafb5a6e3e3844b2c2c186039b4c66a8e18858eb2a38f0a9a2f6f383a950e749a6da415a1eb10e83e0cc1af9efd5001daa3f859e05c32781def749982e18631858c1e845cf8de6c43f3f7128ea510d149e92d3088122cf9e897da8c46b6b1856278930558297b5e213d0510b731d25294457208ee3b98eaf224ff6fa242b3a338f9beb5031eb150d191d0c16fb7064e133c4125cbfa5fa9e10ed42018b4d49810579aad5a7d678613943b5c64dd54da1a9cc54016077159bb9cbcb81a2802aa1ef0eb5a05551c7360daf51f5bfc40919e2b7f2501b89a3a92f9b219ef53fc35b75040ab4ff6eb88a6b83baef6c11730438658d05318a81811a96ac324608bd23c07d92578281fe0938268f9f7c219423f4336883d528c511965e0e162f75045730d1507f0c4ed0624a4818e9943d53792dea0fdeae805957b4de45d511c0b630dad14d39e319389ae8fa807a450a2cfb0594a868236dff5c57d50394874ced3523327074fd105ba4d3d41fa1ca28989dfa73e4c42893503c37283aa7345fd3be29f35b5ddd2d5411a998684184650d2e976a4db40099ea53bad423fa5bfbd96e0459a57367cef5a3c26a70e6e00f2114e9944787f6e688ce46d5fac0b51b35c28eafa722a08fe618a7828663d430391c386e66ac92830418d8542e54e89d62cb5b9d38a33fd07225e233e4038266a4452559980a702a241e674e433770818940a77836eb2aa35df7447dee2e2a456ac82674065d7207eb50dffa23c549940da1b2bef74c196e5cd3d696a2fe6951d824e69386c0904b9755803ad3c0a9d71688b27edd12236e92d9f58291431600b5a96ec58a064811e76fc81c8bbcd71ad9b26fea607abd7cd44accb4cc9689a84216354df9ec9a255f3aef8f2047aa3d37df42bee02e043675056ccf5854f09697da6fba3d581cf4a10346fb4611a7a92b18a761ccd51bccc338b544de02dee76cd7a443c34f7d9bd7774172ad8e5271755cbe88d0fa6cf196de06d42a9f18fc086924856ae8c5072763001e4e21f6245bb9196fa23200e20ba106d544842a26c6c3ea9af7bd895cb611d8c92d3975d10c39bebd093089728bb0e48de6334132c37a83227e2e0cba7b2f6d2e2a5bdbe652942a11d181cea5c21b06d0208ab3e7aa356f625b498851588093e252b8884ace894e048be21870c9d24af21cea1155f26b27d60be8e5c12db8b6a59a2d8d4390691af42c2bec341d2afd081299b6d9fb73b2d3a976906124339ea950f4e9e41dff8e469263b27990ad9c247a6a70c720b07fc037a0a62ad642f562c48914ffbdb94ca6ad409cf795eba607a51156082d79267922c11881b9552d15ee30503d4c48673e1e8b98e1ad06adf6e28f1a4a70dbd44ab6f02d8e115fd1b442d725b8db08163f75b21eb4f103bcb96050eb5cedf7977bba3d35bdb3095f870c64985a6cd0f63df567610914b7b19ef625a6a7d919632092e23e2c64f6e4e2c9e24ef25b72124a47a6675b353762d34ebbc0c9381bf75628690250d3a4189b258a4efcb1750bb6f7a5c74626ea8b035e87a57fc757c4a90aee841606c2235972dfafec93f348a1f462bc8311f525b85639739f97d455739051a8769df433022016484cdc0445a2451017eebfdb2a8c197f485e72270755320b71cf10fa2277f7629e5f1b72db735168699890e210c558fb07a342fbae09b65f820d340a6472729679678d1e13982d3e603fa97bea183fe1339728fb7e6d9f21ee6a01a5c8b296dd8e6fe6d2bec3419a21df90196a8a9a5052ae594cfe156a06ae52bf0060569cb3380d4c71eb7c65bf83648d054d6c6cbbc6b50ca3e178aab633a4653746a868b1b9178008dcfb0344f18ab1d7e63205a03d525aef820c700641dbb3009e100eb386ade95834962d938901295785a4af3c95a2bf16840cca84f54642719b4b23463407922e3b05a302c3b5373e11e8d14a6c762a6a8d90c5d7a52d495f7fda1d6dcabafeef0f88cefc6fc51e8d96dc14d09549ca53728013ed058d88ba56e2dc9790cb4a256982b9a52d2a04dac22376e9422365a2bcf6b77f91244e92aecf58386ac4e823642fb31c91adbb79561fd6cee60a5c6a1130ceb62e6d5ad611ee6a169386da93458d00b64e22d4637308527af4ec82d7f1b4115c82ed32315e99ae409e39a0a16e8f3d9ee608f8bc7136eea94e86067e8f7cc49244948db8381e36b2c68c5898c18e6a5c3f529541c3963071deb19dc3aee04e213749e7a7145d770b66eabe54133302b502bf64f411c42c9c9f848bbb93b0f0849ade1b5c1d2cad3643d54328acc77bd0addf4c133d566ef829e58be06115e0efc18edd21bfcb0b12eb6390648ab7e4c1e08297a21fcb352c99405c89bd18d3b2f857237808c1128115af6ab7ec5e32af85e8162aa70a572f09a01003c121b6e96d4893dc1d5745dd3eff84b23a50a872ab51fcd48713676361c227ad4a31e41105e8579605a016526ed4f12f265d3653e5eb2027aa85124072cd8a0acd01401a48112aecb305c62c5be6fa97c535a78b95e46d44011b723b08fda34292b75286416a918c7163cc5c3bda8d4bf7370b8067f266e5569ca4b065b2c99851060e80b91f18762897748a17075816eff00de761d1c26f8e2d32fb0b294885a47164b2986c8f2a919de41d110987468f543e7052606b3280090d0736ae857facab96674eda3f13d2382ee279a792cc868253c0c90c84245ff8c4d468b72b6656066e5e2f2fd2f49ab32a0fba95b2197fa05a0070b686201fadbef8fb3ab8d4684498a32a5284cd752cef61c0f011969c451d36175fa420cb8e52dbce24d143fa6865e992970b63c0174b05d1460571105a22272898f0c089c52510c3891dfc40f68b8d881189f2b7613054444f3db1aa537b8b3a7b220eb7c750ebb19c19e08344fb8648c3a57accc9af689c9fa3878e1386119b81872c3ce9dd1e1dd22e618ab479c8768774d2c44bdd2eca43c7ea0046e6d3415632f51742a974c093f34a35d2046ccb170a6214c0c95e2328c120da8134488eca20c67f1ab28f5fde74852da2c2b8d0a247bee1356917bba66acedd6cf5a852045c87c96592044c86063f923c9cee41ae43696d8365f833bc17a0049803c2ac6d1e1533083377a21a2ffb81da5b356a4dcc8333297e3386fca65c90b365f503d484566d3e1d809be15d5e96cb0c38df8a863e5fcb541663090343561c4b3c977edf5a9fc579e6042ee75c2c60e0d495dd656d4c415c155fd6c4d868c448fca9dd3c9db4d64d4470ab9c54b1e53f8ceb9096ea04a8706fe94675911cb5e698a0b2df0f08cae791b53f7b6bdc78882dfdb28bc563aa9d690e245a54fe7cd6a7021b0795d22d67e3a7599d9d945950591318eaaed440cdac3a7e3850359358d6582d46fa4582c8ac6938e4ec0f6f21cb2e43be1179ad729163267c633203fdfd1e4200128cc8403ebc0b03a756f270548e88ea893dcdc23b25817b646a3ed0312ef497c37511b56dfc314fa8de95e90685a1e8ac2b2609694187d4664e711c2de6719c15b8ee64e53ee1fd366151dc6d4f728d12a9ca38325e5296dc828db4759610cf5d74abd0b24209abbc5be88f90ce450719ae2fe92c30e35e28d38c1f001405025cbfac6dfa44ccc7a1a8bd1c9714d8a748ec65e3ba60679c59051c7cc9e15e2e044aa5250a040faddcec45105a6ed0509c211fde6f746eafaafbf1f2db046b98160132d10af77fceeeea1282d32bd49ac3878e6023956ad4a9354e0104291a34a014ab919d708dcf24f18f715600a53294b2a271cf4d4f2c3969f30cc80562c859113d83638300bbc21b686e582501c158b482981bb148045729badc8179838f43b0dedc3e89e3839faf1d895215d240d0c4fb0371ec17d220ff7cf21f0e463042723e929a5b785987f51cf559445622eb59c40521f4b8d7d9fe0441f9cbb3228adfa6d5994be466d53e50a041283e204c1f900b782526b0edeb83c07f932659e4ff011b189c401d3e16a9de9809cbfc80f46cc60b08a22425976f003fcb2bf27581fb91f00e827d472104230e99630e1353220abeb3344b7659ca3882931a8cd715fc3b827d201af53596b8b0316e1243ee4e661067b5922706338ae231674880f7852bca167f473dc4df0bb7cffacb32cab4631cca535ab5c33fddf7d0eacd25690628074a63d8b13de6f95c378d00104304c27c95447c1ba68e51e1218be0125ca33b841cc0472cfd8c33118fe26e295814e65d3cf8fe284c7088ffda0568fe8507510f426e34439729eb5783827813229420104051bff2411e9973e3e383f92d6efc726ff16b3e2f859450994d361252439e3416c4856c8ef6d15b0cb652a02c05edd9993aa39fb7220f6c8534967e3f4abd3f803bc371b7cdaf4c9ed22ca5b67753bb6855a321e251b55e136afb5e8837453a738e25a5ae437bf19a25281c2b1dba55768e5d20ce96f6b9e4234d20a87969588156f61868e24e143b9326c199a73fb75629b29f93c0b9798f8a1160790a322778723aa24b83273ca8988141e2b26dad560ed59db88424366d9e8424fc04f8fca0caa44ce5d5e1841f30f1ce3840c454524fa48eab769da6d9e125aa7a5663e6a5cc7256e1f88ab09b321c202c52fd3cd6abf64e0151b3d2ce5095683c8867feedbe21c8462c419cf04982eb24ec379df46dfc6542067ab208e3c0d7926ef283d6437017d860cae421bb5841b114526f368dbbbfcdcd094189c670a105e56d52dc9c47e76ab697612ec2ad9082b1263d7dd0b56b206c00dee7aefc0a7610d091c06a34a93f323374467aac15526e0c6c007f47add3ca1c38c46b2eab23deeca15171e4fc2f73d2fa21f98ddd3659b5ea2a60453a48dcb4c497268bfd012dabd00330657bea37ac5e10770d26201e26c788146108c8ed6bc3b90f94266929f6f775f8c0fa6ab82d901332421a4274b81150a8b8728ad7c75ef421a1886bc8c5cfddf6440696b4a0442286fe6e1c7e84dcb107c5206b8614fa264e011bb6e572e4cdff6bd8544e7121d2484bb806124fc9543e5c8fd77f00084decf21a9d3bd13fa5a42455e74e6fe5c2bdc7d9ab61b4acea6dd885e31c51a6f9d0ad363d74c88d9f056570cd6f30ea70d7787551029ce1dde8fca9c1a8b1cc3c4e3a84d23f23103fc4201bedd68775b40ea522b4730b119ca786a571808ce60b69ccf5d89332247660ac9650d7dee483c1d13e5c40052c1d5a30c86b8b7939ca12c6d887627c6062e83640dcb4fd0593343502d26104691474b9caf8e00dd5e4544803ebc6d6bd01fdca27389483cf97b5b2ec2ea552657903a578144177687b3761a4a21e9fe89268160d0466a168058aca24d49e16997e5ff6edddd72851c8cc698004b739a130a42ddc0985c6513a1d4303f8e488f534086d223d2443b9c2861ecfe2543c3a1a059bf52180d53a5ab5bdacb9fcf8464f0bc38e6cdccf9c1f25a80de669ceffc260e2ffc22e225f4389a5de085ddbb888f7a1a17244b62c32474d04e545b05702f028d254f44817d0f47de0596baa6db4f995af179aa90d601dd571a1111f6afac42fca8bd93a303085f73d9335f90cd988796702e9c10f3ba4916eb80114041b45a0eaf6957c0efe2a2373c9bcb87d1f9935827299f85fc6843782c4999941ccaa08b70bd3bc939d49fa306d406acf753911ab3e1ae3057a984b19e807f8e261e0afd9f6e7b8527fe8d30c19d0dd85a4fb0f8537620805e2f3ee4c61dea3f6cd58f52f99b2e28e3d8cea610c90a019adb847bfad4f6e933bdc3769cfec627d8e60c8e415b22d1500daacbbc8b007c41600e6f5b2e648cbaad9073589185c42b76dd739cd420198380c856d00305700e30cb10db99c17afe5e452c03dfe27e7cab2fe0f0ae5cedf11a663c69b486325503d631f21a720f4f25ed7c00b0f28179cb8361fcaebd12680b32a29cc191b0b4274b5815a711deeba0e0697ec1074684d87edce403871ae5a0e9df1013711a1bbce6910917901cf2b3d674e8427f477a9f446028878d026da5d812d78ce851951455aea96bbc581e18b69524ea4ae391da385c22b74d8d4eaf16c569365482907fa9388e5b2550e46ab17e8b6794f9b0978c56d51d77f27885294ccdb7da0f0aae27463e38552c9226a3344d5a0d4dde860aadfd38e4a54423c8a467e7c90953e96ce7de969cb32fdba4b251aeb0fc39f5012d50076ac527db2a9a5a804308e9f94071a06652573d0930d08d5fba0fc597ab6f4133a0e92461c0601186b27e300d4bf4897deda915e85edae1035ff8127e210540e2d11d5d6e1a66d1cef6a95b17281ac71bbc3d45b227bd1ea5515dfdcf43c61d36cb42ec686177ebb61129230c9a49814d35e04530808850dc5be1f39501d7c31551c0c98f2db5affe2ce07b84634a99c5f00f33d4f6f47db05802276fefa8d80625523fce3be2ddc6eb2c207dc1e0580c54bc475c952dc7d4f45fd6255ec878e3825055464c5d5f542bb1bd46db9a99aecba7f4bfa289375f74e4e41e6167c4ee04b4ba6c9d3b0b50bb6abae4311044fe88a5514a7334e8f1b94bf18ce0abcf1eda78ba7669bdb9b1ea1690629c164cd0b3f6b1c9faf4726df5c9a7f8ab7e2b46ce1e264e4bee05a0d6c76c4979d328c97262d7df052e06eddc373f48eb3c94e3ea7d5f55cb4c6794ec5762acdfb6d3c981893335b147b18783f1fa2d0728a6cbac0a55b15eb189d50eab223e0ba3ffec60f0ea296483cdf8f03dad3eb1ef28d69bd14d939d02ce9d36e324f8d396be870b13b349644f1c05e9affebd40aa656a18d17b8359697dc4c79c432b2b862261b743701551ed88c5a37f91bb82e5494bc2d5aae14fb6186085dd206a0d1ed3ef6a0c7956dabd7006d293b5f2097b72611458d956022a163170c34196cb253985586332c91cb10933289db00269a9606b71d4f5cb2be3de048779b83a6d32c0c0b11d202d25066a285215d59d92c90e40d0f19448fa50a143a3f006a28c89931aeaa637bb43c6524b2b854e92d0fd51f3915c5dc41ff5c84b777615ceacec8a8d6bfd9416698714dc4824a3dce93db181637f34faccf3464e91275e045fdfc23f17d8ca845d3a605f33684afe2bdfe62cd0a8f98e84a3fe3e1b067695f6a042e19753af1a89c1b8e2866b87be775fb87c5b5a1191c3b04de32f4f23ec33730058e259eca350c3e45c5186f8a23641bf08d65c2106f3a2c2d926f99f7326cef97aa29d43dc70036a28d44ec7e74fb2c41c498f041acf52546ccb4b67d7403a430c9b07b399ff314c106ff4a90629fa4bc59612f1e2e837e0fe465f2ef61cb75751df5dbf812640c945f953e862f5c44a167f6c287e0b4f5e87c0b2482a57ab141ac9dc925bb96e1032a4559b96ea217a904c6f71c57c5867b77c65dc898db2d4980a3fb10bfc515aca7728bbde27900f819985fe34476c141da5e28781e5ca07da77e0fe40521fbb658b2dc0be222c59bac7cc6ab669845c01e3818979f1d5d58871f6bd9af6c0338bb6f256131549a7bdf0888047624ae948159f78604526cefe093b98a4db4de044f580511bebdb89579dbe49f88a55e1137a1ae680adfea2b7a5941743df7159f89f64c926bfc38912bd00494c4f9e9fbbb64af38dc260efa0529199dd0748774944f9a4cde52a61325e4a76565f11293aaeb0fcd78dd0a85fcc5bc649914183bb77d2d7812cc33c0444fd598a49cc7393d55b211934c1b775301d360a6177770932e2cce529a33490cb0874d83743830f899493a1add68edc654de0ca0326cdb0e92457f84471588b6ac07af09128aa300ddd02793007e0e1b2cfc5b041403a104e38ea327809811deb89a087a15ec8f28303ad6a837d7684df5ce9a0c99d88e5bcb0a4b076a92eaff44453e9821e2479c0d1ea44d1a4e6aca78991ce1db06276a86958c7d74875e082de81ec64212dca90df24794a2086b17353ef40f442ad1779d117a6c97c01e3542e32f0edc2864c6874f886afed1c19953e167b90a5f99bba7b5ef9817b641ea2f17e5726a6c4a588704fb48eafebe6590f2da24c5659bc9789df17bd99402316ed35b389cb64f26fb4b99c9ee6612aaa09d7d2c9a17795411076e35910707e0578dbe47ac086a803c123523ab0d61cb48a5c6f9219bf2496abf4f259662341ba72ce84eb955d670d55a6c583eae5ef947578112e23cf125e12b5e4d9ff62454faa27d8efdc93ac33bfbe8dc9a7a0da102e2fec79fdc53ee918dae56a9706506b5605f6e2a695bf6ef7989d3de94cd9fcb54c9597dfdbcbd652596bd9383146994f0dc685e1943ff89fbf2e84b36caaa42a56337ce3366aef26969e9c4d57859dc6f776af984feb503055532479a3c5965ea5f98a871a14f8b434155de025815fce907af4990ebf8a7947f012b6b5bf9f26ab8522bc4512e940a93ee405a21b3fe426f0ecddea96dabd2a24e5724c29eb5d8a6778f3e28008f08f9f30c995e2df14121599faec216b2ea8186a6e590046ee929519ff715a044dada1dcaa11e0d64cfdbde1ee7043f9ef0e31155e5f9943da319ece37ec4ea8f5a6aa257df035ae571ccb846ab7c3da5cc83db384df0db2c52c42872ad01cf8a341cde0a85fe84df1e2447940012b0aaaba045fba7f7b43f1ba6f991c47f2dbad4efc4aad980086871db16527d3527f999c40c03a4201c7501121917b19ce419f84e4464083eca618007626e07938ada6a54121cb5ce8e6a7c4495db2fa13636ae84ea0ffc66cd674c56a921a8157e9880e8a112b8e2463931b0b6fd8bcb7c4ce5c41630ea60661346a1a4f5b77ba7c5a78ba216f2658f366917a29938e3f912f6f19d52f83cac79d5c08c6e11781635ec2e10966d34bc091c6a28eb98a30aa1aeec99e7da40a98fc00d7dd23193c5e0d1b38437291563442ac43a4797b1be5e06493da831f59ff81cb643b88ae5c2a543f1f38a1e16be90130d67e81668456b5011f41070fc476c31cd02e1259c6617576e06cd9a4ca27a3331b885dbc6a60106694646583a1a872ab51b2d4b1c1e34b4e712c5420692651e1f523d34643867e4be56059b238bdcd20e21c0871d67af2554bb1eb50fa9805bb4e8c27abc2c48c6a4ba12204c45d394d0616abfd291c94682dcea560daa8347c1802b2c47e884b5fc6c1638f68b76a3e1dfb2b2ec5ba4ab319289d1ad92bbd2f48baf8ef609b8398659857c31128a4819c5aa66f448064e75ced79084f72f0e6cf1fedfc0d9b230e2130e6af7ea6e7f20aaa61091ea7bdc4d13ff9d07a94f0fa86e8b2c12af7b772dd182b25bb26f409d6d8ffcc34d3533e035c0ddcd649fe2e96d56c1db1a028de26e1aedc384833ddb7ce6e8e6acacf8b081d436a68cf6be761d31b11550e10d57cd9346299eba58c7393f82179d40619d9017c32749bc6169a6be2c96679c9df0a3dfe7b0b860ce749f80ba094a72824a84309e99fae29b11562114b13235ed32fb9f4ef189ec5406e26ae08a8be363eb464d3aee5b25428a887ce36f014230213cd8799dadc63b81dfc214e6edd830c425d427d393662c09976746b2981c265d0a16a84ddc28c4ba3b7b308ed440e39ccd29b92db94833fe4bacb3cf8f124fcb56defa4e8ec0689b255abe8685b424b11c57b52887ef8a75ad312bd399d640fbcf18a6b2b734cb30137a0497beada06c0620cda06729060ab15c90d600fa0243a33e418f5c77f1e9b73cbd73798463cdac7399b27bfeb1ea9347b979dde900e3a1d0bde76e6ff58bd0ee093b41bee6b9f3cbe478693d8568db14699622d9a52d395435b6da18d95bc520dd154d4f6cbc3c2934bbff7efa5152c41009f45962b88a9d6a93cb4271f94826ca03bc7fb5e11d6653cb20b3fed44de84606657356f0f89a8b2befbf4e20b34f2581006c07ce0a75bb794e07ca99638a390c897b33a82678feeb88af5eb7409ad1accc594d4f91b315456e217e9d9c54c8a385c6baa22df614da9de1c7c1535fc48a70c47263d5bc388fec29e4b51b3805dc2a09c031c51884be2afba06386ef4130fd9fcfa88bd8d86e5008bfb8ea2d4a26a2559041f988465dfe14d020e04a123223ba232f85760d2308eebf04346b411119b6e64124a64ddc0645cd8acd6b99d70c09587b2d445873256ac92ca3eb5434d8eb8fd0bfefff72919f9aea6b869b9ef9f16b8a991c5b60af64667df7976eeedf0fb57d1abf4cbed64cfbfe3c2f78c1549c909349fd83b9b06d19b46429040d2ffcfd260c559716adcdf7b9c4c2fa777e4e0b18484c417e611e482eca2b32349e7a4092e037a84ba1b2557f5d29515ecfe8036386aa4c0c5048c5c7b9d36d79598b98441a8cbcab320a3286cfbe7707f80fd6783a25294a43151054d387df22aa89a4a9c075b90fea908750e3503450dd123fc69a4fc1a5c4a880e9bface41267c88cff61a0e3dbace4126728e31f3b04747978b4f01f0cdd978b6bf489f1ec58fce26f497c97c9436b25c2108a2c4da12cfe4634c7d60a8ca1165b244de5f1aba902e8af5249a9086fcf4d1eca2f27d5300e12c9083ad7b62029d237090d0994e8dc1098726b80cb72a8fb114b8cfbac298380d63a41ef9e40356262f3df97cd0337bed56a2e71868cf7ca98f0bed4fe4aea065bf2734dfea85a9eba435c20465c638f1114bdd00bac93d543f929db09a24bb954a86fab7260451b69659f04025009f8b022d220ea07b09e24a37d14f616a9a4f12a1c5049c2fb5cfccf4f212cb6491c41c4859b010127c0380a165b0308df13421ac4f200230c7c04d7050ea830a1287597eee14ee8bd59d95a2f0f97efad560c6cd2a26661efcdf9a1e28f8a5894a07e92608821c7e7496f05ca14e06c7c843261b23c732314e20e79f98842ed3bded9b419ed381bf8c4b976f3842c48fe75b6142ba8c5c0fce33d3b428b18660b1ff828af4cc288605d7986e68d15134fe85eeabc4c3d09be579e0eed24beef8f8602168fe35f53d104f13558758cc17782425ccec7f8e7e9dec73210274ff4b7a888c348fdc5e107e4bf415b70f1e54d3e6d4e1c0dc8bb6f6dc6923ef3c40e2efd694e46bd75899a7e42873cb04b4c7cffffa9d090f3c9d7b118fdf3f61df569dd93ec4cd00238bed1855278ea154acfbd96f8776803399e4d1b1088c6a7d023500e58fceab1261fc34665effa240046bca4e77d9116445e161b2b8e007a9ed1455d5e51e7fc0c35496ccf1575d2587e837b3622f3a7c7f0ff674aa3e5c54d969bb3253a03f1c33a9b0b3b95f6a8c02559810ac394c4b0dc5f1dcdc5c9a7b2b5f3e57b432258e5b50d4f4c465676b3e7a151b8119fbfdf76b3068830d027b1b530bcb247b2f8f4a206e14bfb54a9c3e28b992a3c50c419f245723975c39f5011bf460965317bdacfa28966a3c4ace9e1f3820782114a7b5e9ea202e56fc55685cbb7acce3960081ac7c35414989a18b148bdadfca98f8b1f986a3c95675c549a17d5cc2252c0324444629334aa05e80f5c4ee641ebf95b814eb1460c500c34682d4ad279c1cec1f80fc5f94e91a45824729557519049ec21cf9c014fcfada74a843b637b38bfbd05a16b221af969f10724eea4844c6c246d33c089c3570905c99b9e7e93299ccaae4ccb9e53a94e238c813e20903acac47a6a097e36d67b18a5be85212c446d2edfe2662d80490c63c0f070cdaa752ea0b3285015fb245e04be38146f2720f506e3b0419f37a213490fd325b9b1fe81d2c7edb9e076ded7f6243415ecb10bd9d5fe5dfd3c956feb6b74b9e1f5e8802b0a08ac012a1ed241a72bec9b8ae2f6298b592adcc002c11436f2c56bc102985a07988859706b90ca5b6342511f8fcb296ec54e1907c8ff3b6b8c1981e39902ea520d9b9aa07edc428f13a3380ca7afa609fdae2b4a14dc760a49a68c2bfc965d156dd65727dad6826d72de8eeb486884296af63ec0925150fbe0cdc95e2162e5218c057a8fa5408c12313f66e292593f7cfff7866e7ead98bd2909eb2364de462be74b6c830bff4021c3f80aea93eb00438d033f969d5aba51432b13023e188a98fb2a519911c15f0e192ecad3882f8bc06217e3957d191b0e1b4eb578b9ae4453dbc7001d95c4244dc249e4ee5dde30ab2e1a0abf4492bf0868f1eaa8426aedc52902fdd9252d576a88a0fbed37efe23d3f23735ff61fcb9dbf3956efa443af262d8abafd5032780fed2fbfbd6c9eea8dd470d9ddf1e7b3bf6bbe0a646dbb7342d264a5332e05e56d61db969b12fed1431cb50afc68cad171485cec25c4cd84116c3cfc3ba7f9752e3f9850fb86d0333a16c54ce8a8ae2d4d08daac026787fedf473f431c2f3f476b83759b5c54141970416cb9728a9283387db216e390b3427c26e25351c13304f41adee1bf7d7f9a5b8d99ab27dacd113acc19d411000b88c50c61fd94283b80ed67cdf2df249366451d8afc7987c4b611c75a1c43ceca1dd49f3c6f37904a582d3c8cf03be63843df5297ba4c79cc38d0136da4bc427cec54f300838b841b8ead5fc07403276b34d1a31cc481558fd2a0a201d30572eac84c2916070bd8a85478fa86d4d08e8e2ec94b16d7c8023c013d2e576f3c3b1a685151528bb8d11080da02c0372d15cfbbc65459bcc20f59a093c96d823cfa93ec5d3320f61ddcd9fe8b9f3bb1ef2239caca74dc3c1bdd4e7655108e9b9a5ec6398ca81e80abeb354644068ea99a43004c73857236621f27e7000e4e545f0815103ffbf9654c7d90a69e1f437bfa4c6682493dde7a5ebf793c94a5a1ef896dc647e3d842c75f482f717abbd71fcb13b90f32569534d8f282f3a12d32d70bf6828c9b4f836e2158524e52c49ec3b6324b61a4db12c2dae8cab14fa73ce37997d07fbc28f55e23a675fc436882b92dd8e7226ed512d42fe8ad912e19f1004ff484d1209d3dc013dfc6b0466c35ef7df98e84f4d760292cf40525155e75eb6d72610afd30e618169c2671ec698d036d6a49d38aa3293854f638fb0af6f08aa2df5350fe14cf9396aa4917fce0207f38a840592d3ee8899527032ba1d147452f5879cfb0652601eccf8fa212f57bd8572e9cc04548e3e78f9feba71b259259302842a0fe28343cf927afb82fbaa1db7fad65d3e09b16c1ce8f62443dabb7b8fe8e5fbddf53e673a6e09eaa9460c97586bd1b4630fb42d3172624e3c0fe47019c8bc26cd03fdbb867c688b60e87b820b4eac6427a70ae8551cf2115451f886002a6877844cc101cb5867cfeb25787c1be75ef0da87f1109851de3d7749448f9d233b70b079a9d956693ba1539dd884907a52bbf6c18af0855d8cfa555a7df1eda1251932a31ef42595f6148db63000e5900c7cfc504dbdd95bbc280a286993b156ee66197b0aa2ddbb665188d3877b0be2b6c7dc391ec3962518da3c404b68e4e993a421288862564aaedb335a4e0d4de238b0d0d021d66a9fa516328d41618a4f41aa406148f59735dd7a42890f61ef5fbab91c1ae217dda01ad441510989cfc7adc6b4915453a74357123bc7c35b5d182253840192ced6c711c8c15e7b56a840e5d40c468ab4114473b38c1d1aadc9a4802b1f81837e3440e5672decabc19a17df22135317f9f8c09e3f6a4ff0a921028a643697cddba4d748211e8c96592c38916062379bd7b5322e495dc762400a8a8d818d7a2bbfb52aead4e3535a7760a55998aae4421cfd5497c62032ff545c5aa8d8aba612985f406ebdd8a31543e05ce8a8e630e4057a03186e5b2a89017f4eabd4f5e848aa83c312eae838c962a1e7e0434d9bc43e1708930f2a5686505a8ea0ff56ec3d87309782bf507cc57025a0bf66d5e30d0399b36fbc90598330a2813eda17b2cd61aedeb3f85387031d39af7b59f5d80732cd449536f24fbfb11f2389c7870904af58123461707880200203410e4604827b3e230b3d865be46f17ac0d028f2d4b977ab43ac9125462bbbbbbb779e07e1066906403748b202e6b886ba349473ce46d52673ce19a8d5ca25b888720a504495199884f0b090e080e5a6438f0eba70214aa18a0abb1f2596d0d50084d5c383188f196c489204103a254a14d1c1698ba089aa2b2a5d50a071c4eac895160e20a003054c7634e520c921861b1841e281e24ac81e81f4fadacffcdfe8995c88a21821830b3e5926247154431116d208227a00b19b1284d00e48b8b01b7a0f78eca9671d3f1246961bef041884aec0b024e4065725e9f8869dc739e71c0413b5c927a9a90b23881eb86327c82804211e947e24211464c7952147824c189a3a0c501ce71bf5eae64a81c40ec6187ff8c3b320164259b48f910f928f92cf924f13a8d47375c601cbe9e6c4e324e484a3a1b5d65ad3d859425103151d3e544574d06075c4902074c4f4d01fa0911232be58e3aa4dea9d1cbd63a726e79c791c519bbce191a479932a792469017ded67be7e8d1da236495474f43b46a6121a39b8f028a9728a322247dd41d11bb29aa0216946124ba87c48e2724281cf788c735b0b3ea67e100114c5c34d2ee2ee762acca81c989002d0f7e5686a01551f8acc9b1684f60f5e8cee47161d49b87a75a8728d9c1dac33cedfcd39e71894aa4d6aecc3673cc67905ba596dd9b163484806266e30114373891b4f2bc7508dc6f5c118635eb5496d430e893d9210494108a8188690210909fc44eeea972784b0d1a27aba375aad6d948b08b55a32871f285d74f8c03aa2a367a3e9efbdf7eec0519bcc69237eb30369f6540248b1f3b59ff91f40902e3abe0f4915a21c2d3da0f840e2260be1020ad9051bf4b08801a8060da52251928eac283159f5a04a461688c20061e9a173c2b2854a95254335f54ad3d557aebc2411ffdacf7c8fccd945e188ba5a5243851a5c7835828435900049d119e79b73ce50d526f5073e3defb45a39e7dcf338becf06c38ec49a56b7dbedc6944b2c2849ac09001c7f33ce39e79cab9e7ace97e39c735e8107861250b86c71f2c4d2122a4bfc008d94d0035df293fb98a7a5a7a627a83b93cdf8e1331ee31c07f5fcbcbdc105251e8355695dd1d9d139e79c7394a228475192a22489c2846b3ff33264e35e6b5bf2daa08131c6187fbd213476ec7c4dc642b728618cf18d0e7812b013f47d3f5f63b58810602203103f82340d614310447646176b8c31c6988810111c911c11232248449472cdccf5d15a6baded10143c84c4bdf7de9c546e2ad7cb55e5ae72597ae8c9074bcd71257b29c88255c291a826865801081b9830a247c617638c7196aa2fcbd5f7618cb18d5eadce10a23689cbcd309acd40fa5a8e50ee76bbe5d0425d2e19e5845268b5b0803c781c717908f1c0f1c8f130e28144021a563c1c783edc2069ea080e2f477ec86102e8410e273c61850769e787293a6868031ebe1a3b3b33fcd372408d1b4d9e7041a28cf8210987440e638cb1134cd4269fa4a63e184ef4be8fcb50c77807064518cd70840db8d4b0e506fbd003cbc118e30fd7087d1f0282e88a9f7cb176d292e46786291c4b64d91dc1a2e3fb14c063a733cedfcd3967aa6a931a5cc2e9169104908d5b0a999cda9cf7de7bbb0c519b242a3ab2bd4b92b54ce8fb32c5680ad214a5294b539ab48e7befbd3748ee04fdf0af28aa28ab282ca9dbfd1d3ee331cea54839a1621e0f5a28826aa714839193a01e9298d08465e2566d52efa31c1b2bc823a0824ce1312a62091e358878e8d85ae15600e2003b4534210429080a90149223aa72195f3c75f4a84deaa8d23aaef86c2be560a92f40559bd4435a723044647d5aad0a54936f909e9df37d2ff09cefcbc9dffdbeeffbbeeffbbecfc80e1be1612354d888153682855fb8615cc3232643079523965878c2470a5751476adc80ca2e280421c4d4a39b4149141884243185c87dd045880d4f3b90f0d8a107a585a7b9e4a7b5424ad44e091f4ea258411d55ad40afaca84df62b2ccdb172a8903c36885804fc1080c8f50100c6f8678510942055c448cf951c946e3094a31e4477fac0436d52e8c2f00177efa75320b18331c6180705d55c104aef42a9820185cf7428328431c6180785bd1e3a2e5e5f7cad6eb7dbcebdf7de7befbd513c514251b8a85c9451145294524dcfd9050e3a564ec0eaa18a0eba275156e10d514f04e1331ee39c85272d310861ca3144e5498a889754165c1056bcdbed5682b4eaf2869e9d55b7edb45a992a0917ae70e1e1049f1cb8e858219dab73ce5988276a9352533d184254fd68ad754bb7b44f2be71ca4e4de58bad17403eac6ee066fbb901383815c09619d0d82080af2ca2e00d1f9dacffccb84f47e58803288a4a8b440044815131d27dd901f2119638c31c63a45d4268f92927c373a4cdf877b723c4ca8831f3dec19070f1240010b152522a92641418cec0842e473f30307e486d60141010768435eb9f5d07060460e271e5c8448c20307255c9aa099052d4047434f922b2780e434f94c2c4520b54043951b98ecdc60271deb00a5d89139e8fb58cc9005dedd3c91c659ce39efba5c1a82eb39ef3ad852ea81e14410ba9da919a0704d8e5465242b20d5e49c3392aa8be48aafe0a187881454d8098a729399e8604a52365af86b3ff3af8444815eb05f83a5c87e244e09c9d6b1ca4076165433b758fdccd77ee6ff01365c209e562be79c6fe4661e2043cf52104c6c6c61bac14c2edce0a95b76ffba24204287179c78a2c7101a6ef212a03ce387cf788c7313acd0077456d728a35b97ebf5aa4fc54aab38ce3aa5e2b8ebc3a054e49be71d4e69e37e7981c1606062b1100794f8da4a63668c768d32fa8be3bc40beeb14075f0cd0e79c94ce0cb394d2b4a4998fb3fe5a20df3c74d9cae9e42e3d03c0032867460ad5e983548738f86d1883f6fa77cfc47aadda287e2975e812c4f3d6676869a6d66271eec429456bf46bd5664e511b7dba83fc803e9d559dfee8a2d3d9d35192867ea54d284953a3e8bce70d7e9682bf7439a1a48d7eeef26794b4c9c0fc7162995de14274fa52ce299dfef7b1d669cf80a4a10f83d6287c3e98779de27aeb6aa35fbec45dfeec13b9ae36fae19516650864566d577cd6b0b57a4bf94277f9e0b7adbda3ed35873855c58a262eb3fa0a6c1f271414082fddd22614add1bf527cfe38a1baa52d6ab5745a0af5f1a04c1461441320a434d93581fa195e1fbf26072813c0679f7d2ec941a5cbb70ee8b6a9db97da3ea72d00d0edd7d01672091226baedf65d4c2003f28594bb136ab7b485d8e94b143aa547af65c517e3185ef243c77726adb0f86c77bbd43189a14acd5c48268a2f9637909a3009b2e3315dea980cd11798087d8d098fa42d2653927c83906ebbd43129fde851823e38317d89d19a8c50af32970682931b59ddfe8cb6a09dfe8a24b9d30f6103d40605d2ed769b714375508e14d0e9e842c7e674d841c72574bbdd6e3743a40eca923ecaa74e6fae1802103d31841faec4107ec0a235cea53a9d353aed210041158a2076203c7f83692ba88d4edacc4adecc88b7c87ab3de8a33d369fee6c5a87ab59ae9f3c78bd5675ae3afb56a53ab30aa4d5daa9826ab8dde7c52f8dd5d5ca73f5f76e02e388c24bdfe0432c0d461960cf5fa16943214b0ddbeede30cbaa54949336f94eea958973c0663679d23d439a7a58dd6ced9edb6e27729a5fd499bdfeb4f1673f6fa521ce7ecb58212ffc839e3aff6ebbd3bb0e49c33fe6abf5e8c69f256ca02285f5c1b3342acdb4b6bad2fd2463f266d6aaa8d3e1d57f41a5aa33f7ba8b6734cd1e5377ea0d77fbca57c71b1ad745e6a55a8a999616e4998e95a3ef1faf847f82705065ebbd4e9a4faf842fc76a9d341a92c70da6b9208dd0d06e815003aa55eebcf6ac5b32e75ba5cdf5dea74434f6c4b70a9a16308914ecbcdd491bc49803ea7b479190069c33be813095b8c69e2cc0c13a8d01e8d4bc398f6347e106286b6fa7a50632a480c5a80e80194a344c4a774831b9fc2eee317f5b1d6278d3eba70d2421fe5d20cdd933eca9d9cea3574e2a3d78fcd6408f96124078a0d1d4d96b8a91f42b5915568d8e0e1874f4e0c4a6e6acd4e4ce8af2e754e74728f71f6c2f6399f4f3de78e1a28113d6188ab217afaac832fd9a2fee32217881c3234cb932732708b838eb7bad43db1413e3962adac5b6badad369e08a938f8ab4bdd131e98f6a484a018c5f1840655c2b7962bce89a0e232283a3a2a4f45a615bebbd43df998591cec52f784a34c4f3f7dea9e6edd5a6b676c466b5a382c89a90487994284a7d055225ccf40a1f0d88f1f294c273900f5c05174a973d24283f0982e754e55a8140fbbd43949f531d69d94f45a61d09cbbd439c5d0c12e754e387c308055ca179af9596bed6b1ab3d65a7b6fe8746b97605680ac0c5921b252f4f33ae39c73ce5aaaa84d5e5d185ab22e0c26747e1fc939add6117e216708c6187360020da0bab40588b733e531c6f887476df2874aff58f11facd9833d3c5e97371451c5a382badd6e4152ea76a0a8c09e1b357893a2a59aab6fe30c638cb18f2a1f573eb28a748a808a868a888a8aa82de7a50e837e3c6cadb5d61e10b981f669b586805008499d0a581ed0110109c9d1094961deac3ab6818e2f89e7938166f7de7b6900519ba431a46910f1d94eee927649764c1ff4960c1d11eb81a887a21e8e643f3d72c9d012a22118293d295552ae3e6729f1d8134c96cf788cf37bc3b6b3c294ed7a0cd1e307158e1fbabc80e4cab68050e4b09443530e503a35a210dd2b07638c3ffce12430e7bb1f0ca0929d03e46425cd63e23df1a47853bc1e04ae74eccc1c51603934df0d3f08ed5ca901882c2e4844386d2e069081e484548e23237c74663c8184d3015365e9581e9e1adcc4d324d48483d1949b7dce79c7c8e79cf3932b6a934fb2b40e3a5c07a0d9fb04a5a0ebe9aa787ec8f8628c31bea1065ec7584609af2a11a2875e21559bd44db81e03ec5478d25962d4a387129c50a2b365033c9484b050020d3a94d882c3b6b003e27373aa4e0ea8079b6412b404ee96038f9eae89197a605d2c4b3270408121ca094582f458016b07971582a414205c624713346e44546cc0040d296ce14036f57a8e0839f11375440b96203db5c850bd29426221a348871d26e8c822b4044b1622443b72f4421c4330c6d869ea73ea7d4e55338cf18e11b3044590b8da2129ca67882b1b94248829e829482a686abb90132364b1300e57eaee680b5811add167d16554a09a59758ad5e9a68a8935f78ab6f39c431c9dbf8f52985dc5db67e28692a5f826215a1b0af7c6e1c79aabb8d7110fdfc57ad4467f86382ddae5650db674d28b4629dd81348da479aecfd71fcccbae22d85d62ac2a6675859525045b3282e1aa4d092957043bd2b1adc5182fd68b55c5ac6257314338180e86043382e160447d84e17697312a98d9070260b7e616677f89b3871314658fed2a861ae9d6d4d46affb3d9a58d3aa906df30cfe55d2aab194fd2ecbd779524539dd6546059f17a555662ccbad6bd7cc156cfd22a8d06ba5aef0a71f6bbc218d5ca04352c065018490846eaad97214e6b05109807e98ed91f13e2749738fb8a5dc5579f899b576dbb5c91d1fd6abf1dc882058bcd79a7d1429c16c62fe5e31ffc3efe76155ffa1581a87850dc39153bcb85debbd6c76ff77d9aeadb7d3bcdd346fa4823e924ad7479ba8a4e72b1aed5e5adc0f6f1f254883290fe8738df7f18c37615cc2e1dbfb8ab15be228c31d33d9d9b6539dcd230da0b6da4bd9e8b16be6895b65bb46dc4a3d3c77b74739266fe67748b6e8feba3cfcfb451c642a72f23d4e7ab1065b581b61d8030068aae691a09576d3413b5dd1f5fffc8c1b7b40f87792e16be5d2af1f23eaaefe3a936b78a6aab6af35955db77a32d3e1fbe1cd9e29b92b57bd5e9d78fa7d36f67c5c5d9c30178c045d96d1dec0e429cfbb9c7001e6c2dee5cd111add1dfe246a2359a446df4a5eaad8ab3ce5485de2aa6257e3ba86a73a14088e959450efcdf4ec50e775b5abb429c664a9af957040243bb52d466566d1eec2aca74f0835d4515ad0b455bc468ad66573145bf221098b7345d6df3c103ec2aca3a98336eb5421c1811add1ef7b8c1f0be1f8fe2792809160b92fc4c14360d1165f4bbe909dfe072a605731d641172fc4b9bdd79669c2e5c3a0611843f78ff6ed240d7d992618aedabcbc60e91be799c184aa68d555a6559d3e7ebbaa03020a277c84e1f08f301c52c7b4512b55db7c185156db7897fa7cd006f6128ba9c2ab15598869b2dcfd6f275fec145757b21c8a1084988e6929ac2eeff6a80d0cfe70d5463f3765d443aa52ba5afa9a7a1f94ae92e56ed587ab36fb68277db99de4c36da60f693f7d38a9a54ea79a76ef83fa7ab96f476b29b691cedf948a1027d3be5dd6faeed6072260bbc4d9ad287badc265424c83e1b410b9f5f4bfdd7f53d406c6681f511b598eca72497cdc49669b69d3c6fdd4b4a52e6ddc53b2ddee7dbd4e1f94e5aa4dac8adae8c7ae8c62595c470948961b9235c51041f598a24e7f94ed98fa082b8201200441d6312d462573057fe0535987116144d4469f8310e7a3c1703bf0eff1e3bf1da4714933bfac19b0abe8ea570422f356e6af14b541f1f46544594e85a84151e7aa8d2ea236fa4b572e6a2e4f5fde2ca9d3239debe3d34f215eab6aa30f235eac6aa33f13b74cdc54d5e6f228d5869234f4b5b871b446df256e225aa39fc59da335faa1b88b9cf876148bb6d83bc87aab575f35eb63bdd57abb19f571d6e9a310bf5db5d18f113f5eb5d18f891f55b5d167118230ebbb2502e1f91b98d79baab7f6d3df5757be1ddd08d9800f373fa02f5f7c4f5f56446d609ebe2c07237eb410e7d2be1dee6d2ada423ffd5d455b804f7f5bd116f7e96b24cd932fead3d749d4661f511bfda9a95eafaa8a5e5dd12c9ad5e973108210d36d4e6ce5d7a2cdf5f9a0f85cd2cccfe2165b1fee05e6c36d028438fa0910c6b0fd7b018431623a48db46b4465f450e3e7ebb4e2f8eaad30709108a40fbf758ecdffd962825cdd8c2f579eb230cd7e97fe215b528ca72e3d7e753b04f59aed3071bb0abf839605751830fd855cc1d8b56efbea57cb182bf5cb07083ad2f85cef85a1a0f2250e97cf9a0e6000848800256b85a5dc527e385b2200782f415eef8fcf972f1f0f9f4a7fc1a23ec52d2485a6b13d789cf9fa135f9b546f1f955be94d2865b461e6e994d2b9db8758d327aad342969e4c3a0b40e593b27c5593bec90b5ce92b3d08b679d2f37ab56cd829c7376bdadcd7b089ec2a9fe5a1c9c2e586a2dfd682d8d31801ab1104e49c04896d6eee5b11027f770bead706a91248dd419efcfda7bf1bd17e3efcb3bcf40adb30ea7b45136f53975cee195f64d4941ed423b40daeda22e853166b792663ef8ed6fca39c73df7ae1bb4a0c64fdf8ad4524b69b4525a69a5b4660d6a3dc6ec1e49905616dc3b0c37155da074bd5e9c8a2ff28e327a18baf63ee2a394eaf3c11068ed8952dd026b3597122a64c24707f4a9f7ebb579af7ff951f74f04dc796881dca54b97acdea2018179575883d9cd10fd148714d0ff7af0e5f5126f7f79e997d1c110873fd5ff22ce1084dbf5bf6e07ad7e4b6d60afb97e7912669d87382fb4eff9e6a27ec1fbe52582a09f3fc8451026eac0dec6dfc06843f4abe0ef7a300c715cdbe5e2b413f4913f09b3ee7a189487a22e755159355deaa29e3a58371765bfe1188a805faf459728a37f76fd305146d3f60d8ec2377f71d7a74516cc1e3ef13eba9e84dd350eff57e812ad4bbabaa481e3df9c8638faf5c6af1f631d8fb3d80adae2f5bfc55146df210ee734991064e71f43764e9379f911682b9a701911f86bfefa5fbef532fa27bac4b105ddf5af17918ba3ee2f317c19ba5ea28cee1249d83da46d9ff901f89f38da0e6e51d2dae3972148b3adcfff7dfad3b48c6923d46cfa3aa2524c75cef90329bd2048c54d0bc57bf7f7fdfec0dcca9fcef5e9df5aeb1050ceccb0f091f7dfcf6b0dc59cf05d7b87ae300c7f8b2d5ab877185a9d979d3240903653c24a10c817b286d6ee7d70042035a8b919f25bccd91f3e9882115e503b1019ec971d7c1834146720e366ff278e32fa97814ddb6fc5164d04c59106b70eb65e861a90371b14f36f3147c66d2927c4a34363c6eda6868c9b9638ea9e3f033cad5d1cda0c715634e1af6e69b2a986135d8622bcfa47ab1115093e72f99c7efd0e08c004a82b2a5540f8f06143065c4b06167ae019b8880a555a6675390269939452b9a435e7b3d97fad56835dc8a58e23d047c0339d4629a5985e6c71c518637c29add4526a7390b4b106595deaf4faf5083ebf923075baaca26d91bf56ad6fcef8bbb4b471d6abb4c9af592fe330d2466a993e33d20a2e834f28030a332c9ff118e7980b2843cf0cce79eceb52e7e4471ff95f1f506ac9a5dd3222e0b7faaf2e0a5597ba28bbde4197ba28475def24fdbbd4451175d0ee1cde9d3716ed0c2f20bbbd17901dd3b00232f45bf942f63bc318f82da64fefeb797fa6cb88403bfd17986094d169c64f47c00f5a1104d0af38d3e54cb52580ba28a0fed2a52e0a56072568f70bfda37d2cedec327f8fa59ce95794561440cfb4da12c7ab1fb4e27d1b82407f62e0beb5bb4bf956c49fc5f15260a6e399d72f2d8d083ec28f9acf3029fd39e79cd58a24d4fa9c3ac4a1d64e7b5dd20a986df0491b6393d25aadbd17e39cb5feb49ca2fc96fc560b04f70e2595526e9c977cf0c55fe69c72665f603018f9b1584ccc8cb92e0ec2c4260e288bc9643218984cf6c26532d94be60a65b20db63e9d65f8da017c59548af6bafccaa3523ba949ebb517676db5ae746a89b3fcf4d702b7ddbbd2b95be00e5dd6e5aa74baacdc3294af5bb35daea42eff8554d4a514476ad4e5bfd0229885c12a9d309aa335f958575487deaeb0aeac9a98a4a0989a989666516e0e4d217ad5e557abdaa3eaf26f0f040aa0e2289914e0a286d6e44f4a6bb5f6628b71a5134f5aabb5f7e26c73ae74667b31ce797e2ddb6a553a5b597f5fab05823bb46158e90ce79ee19c2f6e39af74f2d0f57a71fe12c69813066361602a9d30b02d652c06058a2d65333b9b553a672f7b8aa385911f0b63ccce696d8a31618cd9e7833128a4ccca64954e9976c950a0f6f9b38f33e89396718c76c95060f7f9ba8f2ce893e6410b20285fd50a970fbea8b55fe79c73ce491bedd3f954565a5de3089d42d1da9df406ca99518504a7fe1ea4b8c7ad7df0f21be3a0c4398c61bb0e71c007b5c6693df87d21ced76ab540704e2e69429cfde0b67d8738af07c310277cd0e56a2d615788c31f7cb91ee4bb15ea075f2495d54ad885813374bdf84b0a97383b98c5d9412dce0e82e2ec604b9c1db4e2ece01667075fe2ec6028ce0e82776f7176d9c1bb5fe2ec7c5721f87cf02554016803af4b6f81fcd96548815997b4a21a223ca4b1c6fa66517dd5e5df2a6aa3b151b551f1f22f956caa4db52275f9d5a8da502aa5ba546d605ece5e7ecd551bd94b27648dcaaf38640b8a456bf425d0aceaf02cf9b48adad4db5721f9e27bf97447a7288ff628156db15f56239d21f76dfccd10fbb2dac46c2e54b54df9e2f5b2f52e51a21063aa08a3bf1c59fb6ef4c38d1a877b598ea7262925596a6dd706f96e89b283303b667fbb8ab090dfded1e5c17ed42f3f7297ae197553eb566ddff751812a24b8ab28556cfced5dc5f9cd8ec35d450a2382e13e193dfb156577ed2a5618110d971aa894cb9aec61d221743302000000c31700002810088724511ea969c87c14800c5078505e4a34508c486271300e83208642100461180641108481208002294792bb0150f8ea20842f70778afa1dfc6306e1226b6871b0b545448aff8f8bee024bba1249cc327f3c2d28f6cb4c368208f26d5bc7a3ac3e1669607f6ce913a3291fce8ebe4e087a9db5405a665132ae1c885cc826c5175bbd2249647682bf0e2b9998ce0c8a1dc63aad6d1bb4dcd39c28e8706b9f99812f6b2029738240d74bfeb815d68fd3b58db14ca91b193215951df2dc38e8aeccf88ae32eb50871736591fe1dc3f3c919be4aadcfafcd03b3b0bb6c0225fd9434481b2e345baa98405bedc09ebdcfe63cad8378cdbd0b6370698f1b698accd0bc50971c0f80346aa5a683b3ff0cebf0d2478d6db2cdfa9fa8b4ed68c5c8f78dfe3453e32773ed0b6318540a114f01e5d4349d8032f9cbe92f747b5465b454debc7ff49a65b90ef2f2fda2cb24b7f1768fd3c7a4396ec890d4afa0f444f877ec86c5e5ad172afbcc0fa3c4846931bbee2da38903e985726384ede914c08026166c4caf63980123373106155e3b71f38f5e6ca61a7e38347336a49eca9c000982702ee352659bd95beb3020938b5014070e9e291f5d51f1d8ab74ac5a0486d70388f2924e03f843c985e69502eafa99ec8fd7bd12a312b83a73024ff7cf77dca966ba179989c44e1f562784de86d60bc6cb78d6ba3afbc879bbd805f4953b6da158415c200545237ea84065b224141a2332cb40092d37220f20ee004f77b2610ab86649cc74628fa65304d6ed67179d39b6f74a54b37de36b5eec2cdde1704dfd4a604409b655eadf0625fb39f83edcee00a25ea5cb9fa3802c831bb478dc8561828fecc0f95acd69543c71be9dcb2be096e3559c1be195204ddce4be6e8780b36424d36ebfdd180e1a9739cc0f3d6d9f6b09173c69b9d2ccf4ce6c4fc41aa44c0480881149e3a2ef523f835d88b3ce54948c822329ac147ef49eed35e04478be88641b20f18a7bf9c4a4034a8a7985a8f3c0ec5a734ea423839ed389e79c4e2a40bebd62638da5737a53620bbcb2ecb22a750ecda138303e0fda3552b558879551dc65d3a25723459a678e30d7b22b754e510b378bc87b1a4715c0ce14f5c7587303669b6792335001e58bb5fb3f111a97c341c521b4699dc8102e28a650423f6d0d8d8fb0265e7509219192bd903019008d01c5ced7f468ab3c32e21d527d51109d0966d04cc31352ae097e93f6986ac09349b14fa474f4d458f581d099428a3aee32c51e43643e086df5dea5ff23cea41acd5cf92cc4917619e2e59ca25c76804b0de95ea127ca518be8d5c9d8b9d8317815d894a2397c827147ca5aa0f7d7f0a5001c2dc5e870ba4401b58095cb05106794aaa1b37dc0512a2326896930f6cc7d95725bb815cd25b727b0d2036ae5c135e2ef4389082bb77e481682ffc384613d34c123ea9a9e32aa26091b56829573b8cc68f1e7c8e042593befe42dc5a28b243c5236390b6d514936cae1f8a4255afb9f07d9e65927d7e516e57f0247666dfcea6dc703989e498b29e0509f7ec2e53e3eb5a043a919f5550a81b5793f785e2c7c93871dfe89f673d97d16f20293e60d00a1920a278e7dc9add61869234c3f38b555741d494229555d50fe73c9591fa4feb398f7066f349a5c686e3415b01d6de006e6621208f36de4a46cc3c0f780b980393efb792f5d9da957ffab0cba9001c35b8998344c74906298849311800559daedebb8e2f5be996779db89dd3b17a32f8d400ad7e27c43a3b79d4c100ac834f27e39d0a907bb891f618ac8f30856d95b3386e06de7ae442cacfe0b1dcc31b3d884d49f1bca167955c019a025c09b432fac04f6c77a0e0ba90c32590375fba06140359a68bcf33d79fdfac02de0445a5f4c491d7c001e3292334eaad03311eb4dc514023284437f32a1b85e11c7cee8fefa2ad85b6e09519ac719371b9c81def078e1ae4a26eed5ab0cdf24c2d2652c3672d2e7a2d789081ff9d386ad20ccb4737768c6049a2198eb913d7a6fce4ee583f06faa609f239de1746a5e7b6eaf38f231de498d5b12ff4f2a6066af4a7cc5dc7a1222ba221b7b90d1be79ec658ec616840ae164c3941865fbf41e54515b7cd289db3618ccdd3f9d4c987ced1c929f630ebb743e05011da61801ad561663c19d9fc9a9866b2f1d7f2acfa046dda5ddcefd1aaded7c83481620581be9decf72e79ba6e15516237ca9ece7075595f32dc6ec4c170dfeb6671f212d6d760cbb61f3448db11b99c232bb26df7ba2f6e9904ab8d5e4eb89874db3b246e51f89f76c9cf99f2c700ecd24fb183016c639d2287ed2b146244f6c47e5c601604be0b4e3210ccc90d7338f08eda9aa9baead251e8c598a65dc3a582d025b5451bc326316da97fda3b284db028f8bbec37a78e67ae947341fc963ec3f2228e43d2bf5a4dd77ceae29e0cc664a3dfb8acf04c2982622200eb07aa3c0affb1fd5584fd45a7206124be295b3fa10be883a87a96ac085497a5559c388ab6c4a9841213407d91a62bc5a8147b69a77b96c778b654f6f826c8c8c8548e683c16e991daf40df615cade8582ac73ec6393530a1932a5bac6a50d78a636ad9707f201d678d4815eb3f62c6c4107505328cb23bbbff5f4b0ba6c805f093780dd10b62b2449a45d99cc222eb0ab7245bd3561ed0ea56f1ef099897aa69c0f86dad6f639ed0d7a56240be5e1f60eb8d73ab1c8e2ce4a06c30dba9c3dfae37b1026364c51833addb02ee160acdcd05cb122ce7611f051624470694d91f1958e2c2e80fff37059da683888d5a21e29c058473ced5138b40fa8a3c20e1574b288e44adf685ea801c50f66fc9ecab049f84484015fd08614365551235793e600b61bf44a88d70aeed83d9948341a02fab3cbfec6bfb7780bb2a7941985e101929309f19008a1146a97bea0b90954a3c8d7234daec45712ed7ff1dc72e3f5eff65d8d2260994b5f6a7f48bf7d0dc4522604e7d623ce71f4b316a932e19291371967b7e01e4cff36126ea8a9f3e1999c5f24d5433f35c69b51be2dea26e68650950eb2b8d583ecf22e017659f287b8e7b53b6f4785aa3d56c03d80809c506c2684ff3d80a324f4ac3edfb7f14e47511aacc878be3a82962cd027b8e4058713204a0a1989ab3c4250fe91e645ef2819c9322a0087ad02d0b87db631f3c94ae6805102c495ea90298527b121688d1c58d50bd45791de8b4631ecc314ff162a8e6ee59bf1f4deb899f2f78a4c843bf8598ac002160ecf1b7ccb584159564268b8ee327dfa941c40b670e71c46e4e955a415508550dcec4da093aac9e2318c5d0f6a70809e383a51c8bf34ee8b9961b50c7325813f9e72c7cbd6c804f0e5c8e2ae9369216966492f0e2c793557848293f573a2fd1c008a2d8d7fc1193fbc6f49b74447586eb3c893b48f589caf9447e9382ac7ce7be0ee7e95f7c0d1f04c18e60662bf71db1cf9d39bf2c21c41987b207029ac93959c387fad74588efdd19ec577825004502768f487c88359a2cc2e19a46ae3c05de5da1e21ed9f4861406fdf0b5e9ee51b35dac7f3a5f9abe4d2f384365228df5b02e9b076fceacfe9ee1ef4729f9aa58b90f41bab64a60fdd16a17db699e3c3a7f88c2319738994a7ba73861af5423a48d197925a3c4b6709d9607f3fb2b1c853151b5defaf00b446588af5a1b15abb9c403ddc67efff8da71b872e47491afca0811e2812649536138db7390cd0a6e57ec79127ab7c0f5b4bae986d78153027b42eb4ba55260583a1ec6e7f02cfa548d488700b3a9598b72fa23215d3a95ecdc4dd712e30d9d4b65042b8eca4695853e82ba5336567df99e972e5cb6cebfb31010631d83c816b4d65f595baa2dc4a585db5ac8ce9d7ae0b668e79b50c8b50467f7df09ad3a72a63a1443a3549f3afd69f25794829b496a77a6611fa7a664e89f6812dcf17bb95e66b0546e454c07debe05a0495502e16e7e60b71dff36ab4ff7b5fd8ef1b1962fd5b7f0e6c42371e73a7693c7851c3c8301035b3c80856011813f434f9619f7f013658cfdcaddaa7070ef0b34654cdb63510eb2401437d23e49bd1766b533a8ac02d330419c847eb3a6d9610d1e77d84cbd16167663a3508e3fed8990f55f0a9873da59884d55c8ae5081ed411f93e4dbb000c257603389bce453907d5eb0631acd4fb0d297f538352e13396de6a4fcf8d1e393dccae2c32f27fc5df243bf386bf70cd8471efe8e7fd20aa5dbce51185ab8fe20924e548492275ece4c9e70265432f42dbd776a534a42fabded539ad629d079b43876fe5af177109609d50c78ea637217a90795bf6e03845ccf71325c154ac06032863130a50d7dc30262e25bc595eeb22bb5680a5308a891eb7bf06cbfc9289c130607be5ce967ff76830636f2ac3ca1352b7be7e177c311d009cda32cce9f51d4fb8ec33ed5ef2f0f7ce1d323074363eb35cf53f69973d4abaf00eca4d31e14134d86c0e97c8558e3bbe0b87699b7a68d87f20eb499abc9216ed4cea1170d267bc2112e84ace5465c6c47ad1f41025c6cd58200bba03b92902708a1101b116b6265567002bcb7bd7773435445545a7a0b1cf2b7fe1f332c78c08f876ba8a3f5e60499d21d43ab947a389c4bf44a04cd7c7f0bafe6e1edab371a3378a488030e4f4eec72b0aa40b9dfa192a0b0cfc88ec061ded11b0dc6b354f075875e9a79a99c501175f2a79ab2e15b4cdf0713c1e24d2149dea9e2f169cbefebce83b94e0f15fc4da34597f9f618ce038b9bd49273bbc43e861b91274c11139650465a427c5c6045d0dc85a46637880badda3e333b32affed1a9f276f7c4faba6d863b5a3de055e3b0a09a3023033d72e5e482886bba82a2b1484bd854a67a3fcf914e210f10b9824c820f6b27ed2911fc06f12e9449f6d6ccde4763f6e7c8da67db9e68fc2c6dd141edfcbc94a1e276ae68c830dac5d80d113965019b0a9a234cdd785ed6991c02931369d2adcc217f5190e57afe2c515a76db4b09f9906f4af046fcedde2cbaa338c3159239da2657962ee5ee3ef171a65dc62dc032b8b6cbc85475745f771e7a93e5a9bb00d48ccaa7c3b85fd6ec408f3a392634aac844d2c96eae6a1dc1adcab1314beba2f756462b26e794e8ba8d7638b1e636a781e6a006687c59c6b03f994ce68e6c64f5e9d1fd8bf5681601142e64215d0f684b253c1b350499ac6c63a38bdabb9635644d134151a609fb0dce3900a339ebc0c448d15ee3ad989369e630a7ebed34d4d1f5663ecf12a86f9cc74bbc44fb48050a848e09e0108cce411cdac9c04aee1f2442e68ae771a145a568126061ac968928ab014e77138017b4ce9a9c866bbd0328f0625e0923fc4cbd0e5d56cd90842c539610fdd286ecc4a01b073aaa39ee673ceea178fb19dcae2c6e29058b568891875418b8e2a8cce45ada98785022f9e1c994b83bc0a41893555b7eeb72e6b2d448700f1aa8e1ac3e1d87217087903bc4fb8b3f62f3855113eb6f21938c987e0330f603e53cae8311335af9712221e1fbf63b7362eda61b31927dc6e31913bd712ef5e27fdf18c57515c5aa153450a6cf0535da87f81951cf6c85d094065ae8bcb2f53e3f61983b6192abf07a80854ffd20c177dea386c64b04e637743a0ff31268d597fea63d051b579cdaed4ad1b1399d5d046d418041bdef92a99fe92becef8ae68e9aff7926d5c9d6fa9b4b8dada5613193dd71468645482b1ca9affae07a24af17f7f1bc69f6c2c189daa184686c34a5861c3b127063e00aef58a8f531388ea217465483b6c64c13f4fa2aa913ed3d0683b416f8c1274cb3620fab86ed3c771afc1ebc5b0e5472fed6b0b331101a4282fc904d6199b32e8461f084c8c619ecbdf0c00125c9a83e7e1de0de84e04ea1ed12dd56f84e95acc0c6dc56a80970de8131e40e840086e008c8a30479a0a5531428d240eb306619385984d2da7ce16e9b362dfb811efc1e800650c4f239339ace6685e4b99864c6ed6d1f0b9e439168c46ddaeadbc6f880721aefd806b5abfa06fc0e2a3fdac99cef0911b7fbba110059dda3d330d5338d0bdb52ede4ec85efbaec72976215526dafd420cc79c2f44302e33ac3a2e2bd1a13ea9c3e598a87d92b9d4245b6ec0bd6d74fba29292ca5bce83fd8556ffce1c48c324f88460e2a663de5938105c7470a27db0a5326acb13f2393893e6adc344169a7c7ba212d8eac1c9ad866bb0dbbbb1912791cb7512611770ddab0e7375c1834c0fab95e1a866fdaca018d65ebada3303663e3307e6da60f1b5f3aa79107e5f28ef3aaffb461c045e4edc4652ee546a122611b79921e5127986a5b0f1939c0d2569346de1a0637d7c2963271d739aa7c4806cb48739127dbae2dc04d885dbefddab5c4a156c16a76020e6825db92e6b3f8c6125fe8088b82b3049995d3ed5cd665a8b8d71aa42f2c096dd9319e006d129185fad6ef8a1b84f80e6d497a371013303a04bf19dbc705cdeed16953f876c5a6709416446ae42c5aa0063687135436930511c0c266bf363e74b9ac31090b54e83ab8a851f4488c19f0cf626fe767d5a8f71479b2304666f7f2afc1339d5f0f8a50c9d1bb55f991dc6510bae5760a670eb126c51e69e1b065a44631f1631288c1dbb6155e6c286f7fc4960929e4ad78a462ee8c63536a811ad8559c8ae3d223843dc009f7ea160ca9d944dc54685c580c20afbd9d7e950eb4310b69b99b5e05b92a847070138fc860d4266c9380079acb7f836e7475491992b6937ed1ba8944aaa2c3195fc75f4a3b05edc022c75ed41953b026045385c7e264920b657fadf37ae19395b20663921e5a01345f3ca00410fb8d2b8dc85974458a99160067cb0584863702aafd0bb8840101faf5e7ec430430cbae8ba2b0450db665db8e366930b577dfd7dd50dd96ef6317a18155bc2c9b9865bb14756fb3155ace4b26731d35cbd2c1d0c574751255645970c83e8b0f3fc55c53c37a39e32950130ab5b7236151f9cee457e9e49655d398b16070691b864215e87516d682cafbaf547dba0e7b4d4cc7caa053eb4b11ddc5b209059c85eb2640decabfc48f1c6a6529469597afbac30476815bb7c2f39d6acf8cc9df3a2c21f2cac0a4c68b00a66b42207edfcc050928374820a8b81b3683b811bf96cb84e7c98a13aeb548c8e19a0fb4097065c2ab613cf7b2e701397115b2c893d4770325ee0a32d43bc62a8481200fb18cbebc21d0f00f5cc5888e0cf5f8bd5e96ccaf3f376da62102435650e01653b6b380dc0fa042730acd00f2264cbe367cae190b35637aca81db547dd3478674a615de81c52e423347a158a21d0ad652ad4ff9a465ff42255989d2898e80d9dc6fb35526e0833f25b0642017c3d8e1c1c7cb1c9e07d7a9736e4adc83b612fd5de2d92d9c78c8ce4c4e8f0f4392561b2299920f313af1011d655906fba9f27e767668c69e1f0acd1d9936524f5c9a269a466b797b8701cfc63e9fe7e9c4bf4b74f7ebe544ec6f6defe1e04a10f68b87550d4b95e299f7a11e592e17262e448fbe48aa0aba3099e33c9996e1d973f594f368c267b8a524d12b221758076977c5815b9d5f780abd6e664f8c8c85b6201c42ac4e664fe5a92e49b85c3309deb6b04f1e6576598f2cfeee4e0cf1ce45127af4fe7df3f23cc92a1eaef047a994e3fc96bc5655e239779fb54a9f72e680174fb2824e90857d1a23e20f320b414986f30b1ca0d3db1b2dc47569fe6f321578ee91027c037c68d08f76d291c36bb01c3041029c72d51435a7504524a773d3bda7c2fda1990107416d08aec14f6189c700f882e77c44e7c3d55dd91167d4430e0ef05edccefa4e79aff988da656335d17c58adb9dbfa288a8a8f1a0e914a7a890c714057cfe0cd8289ea87dcbee9176ac40b974cff6695f06c7927a0d604b8b3db307ac26f1f24cb750f4dec0283d3ce15827eda7e8781bf7a4a248e7773ae025898d2083aa8919acf0481f3782411c482a7502c3a3d9aa102d8cef5ff3f7342329f944a43f8bb0790bf28c813f12fc4a8d7277e1a043b8082292c90673fb478558ec8c07f9df84ff72131b69306af87651c2ce08b1dd127f20cedc0f8fffacc45b57464ed6870cc230848be3e848ac05e7e66fe238a236dc6316fcc99096494956b09617a2d6f7a3486b5387b67a3155aa1a77612355e172d05fb19b7b3233a3eef7c6dba8308e2f2d190e9c6e50b7051d43478d94d89eccbc9324226988ce5023cddc1e98cc0a144196f5f414ea09256425aaf84726a0997e08cce1c3731435237b6f7328558714fdb6c34cae11594053797647e1071dfe409ac722e17748b67f6e4101d187f88202a023cf71ace27002dc19510d819926452db70f703a154a5ae322a493d1fbed43cc599c57126b88d9a7b89957739bbb63d788698b120e8583151688644b308f957f33740b31320a630b87495400753ef0f778c9e0a8913ce4107f73d49dece1c1ed8e28122b950f946871cb943afdc9cfcf9bb8022702c366553995a69bfbe5ed5a33fce6ce43df6351f64848d38994b668a965065835d19c45890ab7f15d62ef22f8bbc34b6ddff184b49bfe73fb829f8650a890935a4e8c85d4843022cc54017df00794839f1ce8d5b91a38262f02fccddd130b9290001f0426f756c6698ba5588dded127d9ba5296acce409eeae2e8402abe458f5404bef9f565dad4dfa77039cb6492bf6ea0936ee7d3360449c6a2dd5702ad3e9d69ed58b4d07f10aa8a3229a9b10722ea5347412f633ca46199965248d1e7a30ae053c255ea7f8b21c82962b3ca060b2bd28c412ad3b2eff727ee282d2332d7061bdbfa1ba36e18e3fc883b42158999bd1353783e03c337ed2638a0772d05e0d1f4c4a78704039145139097a22f9c046c0098ef80d16372c7f98ac5586096934bd3855a792a5ca97be72fc4ef4a966c8aaa5dcd62c6a06e17ed472431419ed8bae4a0c75e93978d32a7789e3cc42d8e0ac55bf09ff61ae685fec59bdbbb796e29a3db1a3f07bdd4d8dd3dbcc0de2657a97e5eb465b6e1f603405a0698e1045166bddc58ce1645196670c641099ac1806dd4ddaf28c31e14eef0a73e05c30672e2c45daa7c3b0f0d57da74b5ccecb96c3bb6c7b65be37e11417c108292599482429ee29f093762f700f3a1a9965b32a89a2cfa873d2a208d78437eded875d809d0708c2cab6f6bb018e085175b3ddfd000e5591228fbcbea9d3b5813448603ca9d5c66a1327cc3502ea10432cf09d8c06f3428e55decd4de6be2d0b17ae022abcde2858dc18d7ae6eb6c5d4a6c5659ddac128f891209eeceac101ed5b4fbfd563f03cfc67d49186a9dc36414a71f9d190acc21bf2faceb027dca918e987071aa485f2fa393d0de23b44980a32ad6d6cce2e34e92ec419a89485eafbb3b23bad433d2f0889d561397fb1e562d46fed8d095ee65295a79ac3319fd70f0a11ccfc3b7c2a5fb905c93df2e094acc6c61fb3097d17311e9ebce6c653748d8d64c0e3bf7fceec4124b09b59056e33febf27dc52883e72519df1d5fd817fa8d883a7d7c570e2d21368471082aa86fad72d847a61f0e639099e4136c92af29974a5674e561e040330ac32b8eeafa736476cd6f1be888dba909b804b920131f8bd34a2a4bd57d67c6f4deb09a60ef1c65bae80ba44943f8d98b00c2d842bfbea2d7cd1325200e61028164f4e4a8ca4866f712563caefc76cc705c042f4810d61a9e5a17e94813ef904859f42dc75ef017bcff1a79fe82715ed66ca00d56f4581014a5d8ebcd54cc9cb043cc8d80416cc3257d2aa6283d52e5f39c4a81b283b75eccf943d272c39b07e402c8f2d5281b1e7d73791cf545543edc9085485e9ad37775e2bfb10fc22f587442de1e664059f2a8610dad9517e31c730fdfac5d22ed77f309d8707b68f2050de9626c541fa48e58f3c928cdedc3ec67e9f947cd58fa170ca9809c97251265a4059592ff4c50ae07d58a7e8ccf0b75e428ae55a016d262c1948c7029643a25ace5604d09d174f0caf047dbdadb8a9de9c305e6c7efddb7518489c32243c0b092a743fc81e65f9ab1891b7e2752e4c1200b36a8fe8b9e7ce6673d69c4c95967d67deaf04a2b73e1997c16fc7d0cea2aa72ff2a5b3212ea1acfd1dabdfd2bc7af0e978c6481fa35fb2d0d4a46d6d65d77a8129de8f65403c3f6e347f04e5bdf46979828322eab7068642fe78deb72db93c4b306bf7b127d8d475aaadd84653f7416908424104781781470528474483f82ae05234511b58757dd5e409d6f8a6a02282b4c41cd5671531d3bec6bf09bb6539c6104b1138cc1e24e21b3e93d0b384d24db191448fe2d278e2ca9807d90a7a20636b982dd50f3e8de414e0a9074599551b680529441e6c8e2ca6d60e8f7251689f0744f3d038d9f504961243f4112602017bbbe62c72192538262f3afb0d893b43426a27f53ffd910388072e603ab51082d5f76552e886a5e36709273c60256cd1c63ce1001e0002dcf2c3693fba193aad6b6e179a4100c902c7c86632b0117c44deef804a02e367d2aabb57f108b7fa45772670e2432b9ba5cb9cbc79db8e8239a81b069c6c8d9a3995b720995f6012bbc410abb17e8be30ead0e9b2117d88ce95434022047f67c11e0275a3e68f8ff41f7dabbd163a2bb4121d2d376f5217d0a61c168bc60136fbe6ebc1b93ee023b668702b8910c11d6ba36f521e2ad3de591273b7e588e4b4cad9d3a4042d95fda0af74b2f3af5fe964a3805670cd8ab7e295378617eae22de52195f54481d7637e0cb3abea34cf0e3142d0da865972892f50d726cdf1690420b8e96426d8ecea1c335516f99ae09ed413389258615d74b40753c640c35048387820959f28a0635b7caf396af4c31fe6441eff48954b8629270754cfe91446f5b55c44509f6ab9746254813fee5fcfe869b1b119c7a6e1965147db07217c42103afc0625509fa3d8cc38516be3882884394d8d311cc3c6944407e55129d9bc959ddf67341d3f18b5651529ffd68649535b059a5d4e925c21140f0800ee628bd45cffc352239d9119c24127faa0d6383022de75924ee4f51428416d59877265c7f0e7497c487df269c7300b7ed74b5cb22f6f9200c7497e270a9814d10939b20fed85b41d02ec246af47eec8463a5d7002a8f2201d695221480ce59e0951054f07dff1566274a587aad0ac6e0aaa682c7b18f131c35019e269026dda3e1570dc502a6c79109981d27d28092512cfc91e9a07de5f0f3a9aed1bde9d7697dcf4252097d40b84d8b58630008d583df1c803b2fd222d5a8ab5d4014517415489791fb953048fc78bf69df412e9df1db46e8949092a443b132fb8df02499c1c963ba3be4c3591e14e31140dbfa00a59ba5703ee82f9750caedf0a9a96ddf68c3494b219d916ae2661f39017e3ad9985dacf958e6c1b3abc43c6a41aada35c4450606701d23c53a3a416f07309440063a7647a148b78e74967a5c44fade62ebe8c0f87a83bd69348fb330b01b11f78689025b0ad1b944085172121405c47e929a7a618a695439a38fb2ba040f30cbfa3e38a42334cf1a595327b4d7d2bf9c3482989e1f02aa44c0eeb05e54eb456001936528cec2a1d62580e967523ac02aaa015679e971b3e815ea7733ca2399236fbfb96c7d1e386487be13da649c7a9b6636b674858791ecdcd89b112ed064d7f27ac7ddc6b011ba68fec654a84145dbe369b187cd4481ce8c73cbfbf1dfe98f5803b3a6c8bcaf35fd6e0370dc0030b9b80d96aef8f2363dc14141aa3d7458dae32a617ce1a005fe0a9d7f5862f4e1b9a060a5e10a520b9a4cc2fd0c245c4d83c06f453a51d6d5518887e7a847c9b1b9702ffc4717990a708c6a0736b9bfa3a76398b3a5d5c720d03e89e96692466cb26596014fa0c55402276ae7c77f175d0f715efd033938acaa450570337af4a585031cb2b361ba7bce226f97445c6424887767d5dba11e90b46c47a09c49db2b6dc6df83f52df32b1afaedd94384a28f5d8552ea45c3f8d2c6aab3f9027b4843a111f5b7b2cb9d5287a32d2e64be9e1a84a9bc538ca6c186bc41512dc55213778a728cdb875d291e788412a128c3e361d2ca33457a3a376b0b0d43d90c1efe8ac2718ad45691bbe6a45a0b11384582878aba01f1a77f6d654face0c73a8c2c1a5e8bb25465fa2baa691869e52024981504cbf621a0397a527ef8d77c01c93eef2cc68d639a476fe462047958261ab7f516f1932996cd6c4b9aaa86ca71dffd162842e2486ca097f08a6f8ae9143595af047552ee44cda3fab8da37423aa88cca77332a86fe5b570cb3c9c0b214444a0738987801c6d006aa1a019c611726d6560c4a6c3225cbf89394197a28c10953ea08c789b772c6f24829644efadfe79f176ae550a6d788a60b391c12de55f1a874cc768649ed59d6348c026ab484e2a76b84e3ffa2b22df23deb15805e2887a56478546eafe4097512680471063bffa84a93fa84117fc3c771da2687d24a5c5c418c931a9ccc4584d1394f24107c3556f1cf6a6200c91435a8b7c64003795df4be374c3434746d2e83666eba3a4279182d761f6e2578326dc384cd50686ca05482988e22150f9c70696a982877974d4733eb2e6afeb381814f46a6e3362fb7d7f58758c755ccd3c449af1cfeeb491e626140d260786f2e409a9c25dc6549352d0afe5a03548aaad1750c3d4863f66affee4ba769ec7e5600e38d3df4d2a215c72e6fb542ffca1a09c6954b888cb7186da89fee09d4757413e4da3f16e5fdc172083c2df2408462033fd30f512f9860f594110eca2eef250318501d55a8ce3d2ed90df1d819d1a5f4276398ddb4ce42ea380d26dcf9cafb8010f428c974a619f815612a42379a846941ecc110cda2f2a6aafcb8d1207661717f836811402071cbf724297e05205117976f0aecdf873b716c1a929a02645a2a973a313613c4b5c9e18f8c06ed56e10a353a275400b2b99fad201c13ac189f0848c5132565103ae51a1a86485035a483dbfe7807d1d6a479a64e68cdfdf989486c56532e549840a17a9420a809dd98d31a9c0aafdc3445ed93ede8cd6a4a2bb7c0775d037ffadb4e6537943e4867dc0373a97c0f486284df999255405c792210a9c6165c760bbd8060f7d94881e436e4f4ff024e507b46916df220a764914bd235fc458d4fe28faa840d615df844a79c8612e95b5c78b31a00852afba02135361a7c50c49db998cc601091400aba870cb432af43f58a5f2ee46e65d1c6f19007909b8f321357c9dafe12b8d64d3785a8c3b5c0e129542450dd125d44ecfc1a3b177ac196141a262e9564a19d23bb1eb501b97174c99f7cc2acf8a273e6727da0421707ffcb05f7dfc2dd70769715921803f885a6023517b85bf368de4a2e2b521dd86b10203e4fa42715372870abecb6e2b09c342bde00ad006eb701ac2697422f44c51a0880ae5e0ba2401d15882050453438718dba559e8233144f5176f0d0d88c1e032afe2769930d82bdaa6185532fcfa8326f9f2afdab4b81b0cb5e44983a9e078f6c4b4a25e74751d51c0abe4d6068a55ea4205f776ced60884251b04c5e8e3cb8fd878c58998a3ea7f58bc62e5e33895d1045640edcd1c05fc7fc116355f9f964910f21041b19f6e0361722c54b3e775325a6a7f57ab7731f81cedefc961eacb560151ef75347a3730e0c7ce603888ec7b5797025850d96162706a32d9c6b7c3acc02f7f542d966ac5c0400bad07c349fcd7a5ce10074b6b7805dcc9001f80c3cbf5b1a140fb5fb24abd2e60beaca17d435c17b5add0264ff215cc4943ae244f0bfcff6e0d29837ad2fa216af18c8f0a138f235b512ee3083de0a0a4be0922e801c10395a401ebccddf687e072680e934bd1cebb8f3b9122cc918758848ce319d20a1581325c39d507ba053c9849173b8496944c8c63ab772df63cd6f3051d506de9dcdb33ee0dac02a8ea7ad1c7213093046608e1e1275d5c3315afd1e98385e94f5182d1374ca5fe4f7a8ac83c615c84468cc5c3717723a26263eb5d9979a2ab930c43fb60146787ab872220f9eb9c4a50198d3b63efa0d2c51903534b365bb950ad2c610afbf8e33f1d6c1f227845471a0e2eb50bb035ed6e85efe4f672381de324dba2492d674facf93c43ad47351fb143ea5efb2b9cdecf592652e048297f38387350401517e198d8114716468a37d08f794944e4b4724a59be76376eeab653295e89644279736e8b5137ceba261e2668230a18253583625b49dadcbfc3977057b0d9ca40f828fcf284fa8ecfe80d1c0378433ce0efe9bcc181b3e7ec503ea94cf42e83269804ddfe104b0c12ce3d989ddd356e8b0109dcde3cd182cb3dc0164bfcd3b423e2bdd0c8aeca54b68f95f592f56fac84d0179fd073524bc1dc0c84ae738c92c6a8f021cdb872d052dc9ef0910a7f60bc262c2e05596f3a2509b16da81063d81a6c03ec7954dafa63283b40d374b52dfe96dbb4d70bbd6b3b514d8b3d6c0fb5a2b4ae86c62103b81676bb3a22be92654e7c2e2ea0a7f60a1097c3c1d66ad1295250d200e2f2e991d01488c9561191d9a5be9b547e3179d8049f3b044f0220e1acf54fe4f22cc2ee7c9a9ef3c94008617210c502cde9d014722b530c6fadec11082530807a05f191cc2ec51475ce084192033acafdab90ad20ef5aa0dfdf82c1cea2d850aca8bc46bbb69e1d00608e6b15b03406a9a75c4eeb66d2213a23de790a5ac57e9778d22fc8f6d82d334dab5954fd1d88a4db7cf5a9273a6606b942dae9ea0609b28ad442e7c82ba088cbe7cc5813dbfa4d85246ef4b2f8184254b9644d04ce000fd0c4e00f92aa806c70279482402fc7494cfc50ac3c2524b6545a2065d5a5a59abdddbcf90cc842105c9ada87716db1d5fc80e6eac533bec6c2aafa058776fa92744de5f2673d8fc2bdde0f05893df16097afb80b9d045f37e18fe02d0708079102f9a4e9f09b0fa4f17c2350b1333b5bd17c77533e117faad4907be1f11a301d0b4502fc545e748584e7acfe9c5b1a5ecb06457d16da0b02878d8f446be04d880dcfe466eea4d7479d384fa0252480f0f2bda6a6543ac410dbd44bbf3fbda02e1a83ce69a3538cfc331f3f90fab0e18438a650e84eeca4bb20cf9652f9fcc92c995436826d03fac9899d119f9afb2cdc92b6db97534b8699c80375296b2a54c79f81b03508a8f4ddf5a354b0e2905ba05131a82fa0f447696b223b6d0fbb5316837e2ef3fe33001994a1ffc05d0b2317d9739118f443be334adfc7061ad83c4e4a253c98387957dd6b76c88bf7a35e43e804aa2a3794bb587a8248f3b8571e78386817b4d5520ab7f2815cece3c8a1b2d3214b9255c768646446f8ae595d006d739d853b840817d9bfb429f193d7f2d41d3161c4e9448889941fc043ed77ed48a3413be6eb516cc1d5da9b8a0f7d09f2dc41952337918895925257405498812d653cd60a17aa274702591fe9f9424499c16ed1b8489feeec063008791d18175aa1ff20cba01e8002860dd4fe23b4ebd31514f485142bf339c4206b16628c7d02e02fc9185c308669460970c96bae8f051617e2da07a2e4e00ece8092c042110ab343624aab027be788cd0cd694e3008a4797cf16026b3acc55a7fc9f209833dfdba97726d9bb0053f5e77390936321695334cbadac6889eca00fdf1015c6996bf4d0eef600359ee53dc8202b236623d787d426109f09970a828b1e926f843a3154cd1c36e61205f8c55b38caba4a78fee34071511ae360972867b7d003d82ce3831c180288e85641c6b8ec64447bbc6e2961399abfa073354de98761e205faca20ac91af5ebfc6aa6b51c07c5133b7bb4735075b7512222ea05c7910e4753db69c92f34f6a49a7950f462bd40cd2947221ac1d4620163a61688ab149f123bc9b0695756880c668356ee1059550807549948ee54e8c453c24419f35fd01cd2d803fd69be278dd5ba251665a493ef9bf10e0f928754987774e03b7f350eb33a91e4a9d08951cca4e04f9e90361942fc3912807b650857f1d78f9abfac1ac3b7f37d1d75fdc30a15554b45a9021b3d1e014177516adc022872f4c45cffdae9b4f3e582238202cf8255b421772ff3f60256113a0ab459587b3f901dd456737bc4d67b27c2e9db0ad6b0bebc925fd21d0d79195828cfb4ee0f84e17ec038ecd74d4651e285ef4b5ec2197f0387134470610c2cc373d9320a67778cfc65abc7b845fb1f6b00694c3063646adc52082b5b6303d24fc2e7739c7fd634b50fc648ba63d1cb2ee2bcb0841d6b8609001810dfd6ed85dfaf5aeb6e1164e70d306d1b23e78546432efa540341d0e9ca8bbbcd13381b355442a8174969afc2bd6aa086c32dffe2af9c6382484c76cfc124a17564499c5042745c508da35d222183eda7cda26fc0b803cfc140055f218a9654d75ba33c767e87d5070039ca2f8578fd13657c193c961bcfb1d9206fbdf3f5513ff4902b7d4f40437ca8bb6e8c28263bf5f8902db69a5b28b1c7150cb53d3cf51ba9bdacda6bdb19097e5f646b68b860ade8453da30daeff7300a8cfa179a76605fd5375ab8c90ea5bf2e1e6aabbdc86d2e28ea3649f81cce2ba7dc0d11b5a4a4bc800293decd4d28a1bcc27a85e8cfe43b5936b706452f2868a71831f416f02cc5e4aeb7804285d1ef9a846b79f4fe93783927021c7beef6e0fd30921d9288b47033a54d3dc425c8e0668285b5ba9cb8210fe77436133656dc5539d9660cc30725fffa7b571ea644de8145387e4ef064ad32e7dcc7d5de838fc90fc92a6c81f21c0809efecabd38d74b79ceabfe54b74e5d8097058e224ff750197f924a8b1164f1b334c512bd32549ddbe6773b2f0e0375dfe2748abd848b3b184667d90b834b7e6c99b460d040c77c8ad00c81bbc29c8f3b123ed4c2a1e780b8b1b3dd83575bcadc1117fbcb1182c7f70b01cf7d8083285902c9c54c301eaebeec38efb54b99f9aa38442ef4221ec5d44aa0ba33cb1489a8dd22c9d1ea5e9fafca3f3f33426211b22f289986ab9a7813ab430cf10f49d338365740c4f883068e84d3fe73833e134433dacd3b14b2935514200bd980bbcb10bcfdec9af3e5d3b4d8c0900252fff8268936711183a0499c0a882776626567bc04946c8e0d9823c5c5f86bb185a0fc5288118bb001e92cf51301accb036a766ba857309c11a539cd9a8c737e6e97cac1f8bbd715015cbc48c1b99c23cba7d67173dc720c0dc1d590dace5df8d8d5cf180680400804f2c45da40a0b404b778d8ddc9c173b8bdbf4eb1b9a0542d65adbad7523dd88f59295bd03f50a200ae609d43e6cdd1b293b5d0bbcb4956b816a0812040e7190810cc62023481038c461075ba7ced57090c5bab32c8b5e52beeacf66d41f75dd7d63b4c9ca2ed8a2977c8f980d1f57e3dda26e43d126ebd6e91ba35e6d92af7e12c9353ce8ddc6712dd62d322af5971ba7928f1e64917899f599d661e38c81ad4f9a459bac22d8bab44eefe3699375100d1e8fd5b5b61586f5c6e9534e9fac37147d7246aab083adb7f5d6e95375eb1da485f4093467add0b2ee56ac4bd33b202ec840066390b1923bc755d8750c526765d1c3ab2da9a053ed208b69cf6c3c9c1d64afbbecbe2ca82b06a9f3b47a8f8b17bb3388417f435c8d1ef429bb8f8bd30787aa5d76631b1183eef3712df3561c6a76d0e7f3f3d1ee6c5366ab3f8bc4c32c1231da2178feb2f96581e769f582b4693e5aa1e6c6c1f3f03e216d9aafeed369d33c48489d7f3e13d60a9f4f5b61d4fc7cf0fcfcf3795cf4c919e9f9c1f30f499ffaf3af8b3ecd3f2fdecfcabc349d0352820a5d28230c508c80085e9060e70b9d261c0e8ed00114479430822a70a290814fb8802eceb03332852ab2a0ceb1380fc0172a5e9e09d01580806ce3dc02dc02f28f7eefd4614054dcd732311f41f24cc42ba9792b647967c239269c63c93d7076ef83ee26af7308706fecc69391d6c93c0c8807c4c4fd43fe09920c13f1d47d62ca309184f3194206135a74818538f8408609797dd08fd739d7370969d32dc3e0ee208455555537cb43096704452ac6282384a00761105fc7186d8db5535d4be30084fbf1041f6b2822f8815c8d3550d7d4f57bb03b42186177144b8e106109d65c8f8c0fec2fed12f2d4d481738deb9177583e4679e59f8517b284e006f725bc8ec68178478a808377c0ee481074801f2604fcbbee7d9f756de201c4447dd712a3ba4318ecb815e75c942fa78160d838188e81e15be2c5cf922e9068e183240b1e2a76201188b409baf7e99302c321183af8749c83328eae2863bcbca368b41796f1be9c94abc2531f14b83ba70ab424457d1775d8450a81544ed41c8dc28ea709425ccbc3e9e1d48225dc04c1810ec0288243a23857494949ed3801195730210963a8c20c32d2092cb5208337217646a040049ceb6b00a1ab01a5947f125e31420863c326a08412c2e08b9e028c1da3c94463655e2a57cf27a68b8d457c500c312226c6732850a2448912254ade53222191c8c37371f10106a6e10afc699862ad2a6d224529dfd5a62fa4a328098b403de99c73ce41e81c26c66c0921a42ee79c032581f00b28a18430f802070f52a336814465a8ef0e3b233d44c08d3309374c7681f1810752cb74ec136882a0901294402767d6c04108a1a4c14b69d82357022205c337ce18c0110b9a9d730e7bc31bb273ced5ec9c7330a2384751f20444616f787087424275f8c12290250df53d8ab037480a140251d49049adeda2579442aab4d861cc1042986b865508218c43b221d8513a62502feabbc420bc2808af5c2b9dd939e7429568424c0c509c97fb8bd81b9e6ba1503e40c527282227c567082194422e512eaa86fa0ee35d4b8c3146d21549e09c73d2e66aa22933ba94f21c55b97ef44022189ea601129971772a4e25db81064e2861010b5e4a69872d898f167ab41fedc727894f8f4f4f95c3058f114a92f8e8a1e487f2a161d8626707469c1520300e315fec0481e30b1e3944470706efe5bab9d181a20b2d4419656c839349c299e49d847f91a2823cd722df7b2f084adc0e752bb9dee0fe1454efec54393b3b14a887b49016d2459a481b9ac88cd6e99cce494929a9901a8ac6699c1c4e1a48df00c04472d1cf89fac6784bde922a873a8288c8fba1ee4bc244122d47c9cece0d81dec3c3434a82c4e7a59476d854562a7557e5482e86b02189cf4ee5822aa75a817be91ec852c560a7e7dd1ee91345129f1e9f9e9c79750f1b768eec28d9d17292ececf8b0c1878a224a8af8eccc21497c0670817eed80ec13a263f2880c69c3109f2ae70b36d8a91e909b1b28701ececb79cffef0409bfa4b709f1640828ae0e16a8c5092c4470f253fa4d7837b07c812bbbbf7e29e7bbf17e9f32417decbb5f32c9ca54fe32b0bd732862174f4000131bccfb5c84b123613ab1c1f2df4482e70bfafe05e7aa777b6c0fd3a7af7da0141a1e5f44e1fd1c0d07eb49febc8b513c4b58383c700d8cc1494f673c54e15ee45fb71da4f147ce610ca06ed4703a35fa8db5a744f955345017f88d9a1407207644d6fc377e08bf4d9f1d989402a8c8b8b0b025a8544424002dea8d61aceb9972a0a57e55c550eee5f3b7d3ad22f920be91304e9a372137b071e9cc0398803c3509d06a85b91a7de32b3e4645a0603a3ba6e99fa96a0a51c113bec05c27b13fcf51b01a597ab970a7e5ae8e09ce9e1f70e23d6a14913bef0d03ea460785da40c4cee750a5639c197a85033093749a55f68b42905d5b93ee92061bfb8031b6a44709f4a9c364121713004030443a540b3e7d25c8d12894a490259a6784890e05ef233e34ab9267c9133b0bbb4cfe7f5a4a494544825941c4e720080491c01002ee76a8cb08b4ad43c7be41144441e0f646979df4ebc793b444e7e4833ae1b7a4320cb13f284e45c37a4339c1481533c228f484a69874d2587ab62e7248ed401435d995a983d1a769f57702f7d33b7c07dddf48d0e7d33802870963a59df0cc9c1997d134447e70cf6c29cfb7b51b429e7e5e490ce2080eba6c685a10e653dd0c3fd983c1c38c5bb1980e9824e3c4c6f6870e3d660ba9cab6155440ce153040f243502c08c484280025c3bdaa4e3023deb034cb43fc4ec04c182e170342ef81c1b212c75da2406171309b311312ca3be531a170c436db9a0e89e3d4170bf97702f12c7e19480d40de390f5481c8863006c666ad1a69e3d0770b99cb86eae25dccbec81ee2a01c6c149dad4a75fcc1ef8227574660f6e9d8b05f4001724a3ba48ea8e74dd4096aef3ba812f52ea489d8a53301b3a6009c7d0399c82e482804640025e025414206930a58e8c817bb96eae9b1be09b8b0537b84f1570a9e4504a99414239311989425bd5324c452302fbb2e0e1d87d899850f37167d28a09f6bc0a5f53e2f3fb6c538587a779b75eafb54d599e3a95b6ba1f183ef6e9f5e16542bedd354d1718ca3a29a5a4e2bcd90785df1d45494aca8b44c43e280c9740c518e19b079677363f9328e74eddfc0eba2ebe471d40178988e5f5219740679f5c84b54d3d1bd3b4cd4be2f5b342852cd53384cf411607af9450562c638c1144cdee17af6b5327f16c402d85502cbba8aa5956d5c2a0bec87e5d7f325776818e6517e894750abb40a08ab26e84096f5a8781717131997e12c97aae79e2ec9c802bd0a9492beb52d47556b01a1406daa7ef7a587c6333f1d008f8d23235e08aab61dddd08f872ddbd077cc1eeee01f842effe6e1e0e7cd1eef2cbc1ee3900d44503770fce1d80ba483c9c8f3bb353606ea84f0523b5a94fc22a809dde244a147832f44f865e9c4b063b4e940142dfc494790e01f3977d328ded8832d86d62094d86be655c9f3055391987cde8a0d73904cccfeaa5a8f054e7045c7d52540ee784d77de18030302e2e26d34f22d50a9d80a74d133095235ad7b996f998ae4c6dfacba91ac405284881a11004f7af3ea969bc8b3eb0275467f3083ff8787d3c3c135f8a77d7dd5b781b0944344ae9bb99d4f0ee1d3e683530dc92f6023fc70592a7858ec7e37a7c80a1e10283dfcadbf46cf49db3f9eece479dbbdad47d0a2ffca27d87afaf1c03921e8ba28c608104bb31b033724511f0cc46e05c5199c390a8d71ed3206ca63aa8aae66d13490c55fb9cd76cc8671fad693eb076b3f61a129e9fd88cf689cdcc536d3e6dfeea9728336fde4e37abdd7ce1aa3a5c9d5af45d9b757aebf4dbeb29365381a0db2b4c085019659441069eaf303b45ad4838a2d06758d72cb91ef4cd76e0e1d07569340d8b2ebab96684b53beddb65730dd66e7669af872e9bebad195d9af64bcb2e6dae51b1a24ea9fdd22e152beac4b966946b46d8b2fec31035d87d56478621bc600a3523dc81478621bc400af0a44338a0239b7be05128865eebcd3d70bc597bf61848e96b7de86f53bd66473458ac35c6cb1beb43b54d6e641dce309b6d5a3e9eba972138feda4207c79f9cce580fc74f987b601f10d39ce41910b81e511eb7931e6f36b91322de139a1ac6bbb6050ed68e72ea362daa33c28525d45179392c077dc484d02e6f3ea2e20e94f0066c3076f96a73c5b59646a7091dfbe8620fc58a9dda1c0a62fbe810bbf5d5462044ef81437f1804eae32d8d5e1a1dbbeb5b1a5d1c8e7e443f3abd23ecd86dee1173e8201c0f6ff2a21b85d88e5d9aeda34b8372cd47c4daf511f176518078d7feb01c28d7cdb83e20be2eafddec6e34b93e203eb9bc6e7ef8e4c4e62470d434fbe4558bc02188230432f6ec03e2939b4540e7756133d6a36dec3021208eda8d6daaa19be57d405c6ff601b1c79b7d4029922471392c8cbd5aeb1ac466acd1430f7df64bca43a7a120b687b25b452ddabec9af5c7b66afd0b3a7d807d8e052769af8d0b31b1f7a0cddd1c3d8a5b14e0fb5fa770a81aade61750be39d9eba4d8cea8c70c107d3d7d0cd363874cd4a9b7b949eddf54bcae5e825eb9a6574f3c49af6141b0343b6030f9f5cda6c72107669ea698e7afa98c681625ddad0b7938bb4d0e54397b72e76144b13bab14d237779b36b56f413bbd9c6229b4deeb4f4997e033638748c9646cf3e3a664597567bc8e68743af36f7d0e445d8334ba35d1ba16f21eb2a7df5cde624302d69a791afd7e4abf68add9b93c0f4ee3e22beee1eb6e8b5fe987560f769338fdc033b1948592ae27777440fece399a0b4a8060ebe9476c4cbcbfba3072908614726de4666254f8c659c9005c2977877576373351c8c6b71438d6de20210dca701238235a8220840b0865d1540d8021545ae788317b800d85d2146cf16b228d2180fb9061901cf123dc08e47092af061b0e3514209fcb0195292ea70742199a13ed2914a5dc50378deb2d43a0284e7a84d8f349f835975e9d3acfeaccaaaacfb8254f6e9d827042399a13a2c1da6aa14f4452eb6d003ec8c6c21887b0276467cb4c03e477c88809d111f29defb04d819c94214983a6c8614466d9218b5678cb15655552f0ad50aab5393f522bb84e82308457723d16b155dd1a10d5d91752e2412d9d03641950ae9aa37bbcf9a150bbeb2f015a9aaaaaab2f498cdd4081a0add0b428bddd91a92116d7ad5d2b02e968736bd63964711353d7c78e0479b6edaf4569e509f0d860ff7ed77691e91505b465e8c31c624505218fdde83955da2ba35677587ab4b59559f96ba950581a80abea2a07cf1c17e4d84929690dc509dd5401a08ae7f63d806d2267752186a3fbf31e4730275d306b30635d246822576815e14fd78a8590042df31db54f44e9be42ddb476c17e9534be04bebe4b9a4a990ad93d10b9bd94eb199581d04c2b0776c591476a3f1bc5dc4b5c81f83148220688222764bd3fab4fe6ebd7afc0b5d988dbfec461d75d784a61ed4ea9af23c90bdda7405a9daf3bcaac7d33ab2be563aaf07f3d6fa5c6793cecabe24cf8b36c936cd99d783f9987e5df4c9bd2eb0cd5ef911c1f2d522117116483cdc05ad288f1fe81fe8a66b6a93c440f7e5c4a0fe8736c9c750e8eece9d82b09909df14a1190a9b99f3ba669977d87ff4e9bd9b79f30332a93c18959d56a54d3ffac4a34f0e7449f499847950539b30d07d90fa7ee8d37b45da244df25d041403a1e3c1f254def4038f1f34fae5e55c389be27d39f0a58b4016f99c1c2a64f360f972f0cbe9d3c3f22f8a3ee9bc207d6a2cff2c88d484aaf3a26893fc65a7652fec30907d3951a8f15da48bc017539e5517298265147d023da64df0e5a5c0b1c8bf00cb1a60f97480e5a704dd97935951fb8d04eb511828e90da12e62cca2c2c7088f03d2b26b57c52ed03550051d848140200df301040a02479fb483fe114905cb2c098cdad7aa3927bd75bdda25ea374dab775bfd75d55baf59ec569b658f819ac56a66ad57eb9a745ad5044951fdaadfee3e72995d6953f5cdbe4dd5277c095d1364a95e5d2ad40c83ab78d24a4c9fb2e9873ee55110d571f4697b75d3ca4724953e51afaed96a496dd8427689d045db16128542a16fdb43db160aad5497c6f50cd9021731c668851a218410768443fc8b943cb54bd05fced13b4c2f25bdf4cebedbfd685beaf45979a3cf2bf28ac81e299f045d242595a74f0ed34a47474747eae8c097c7a3a3a3f37876a828425d5c8dc6f13442ecddb7f38ae8c017f730ea6fa74f11ca59ddb753a44d31bf2213042bf5768ac0972713ff5ca650e1f3e3b1fe78b2e8f141f292f4a97abc65a3b314bb7a5210d473cecaf378200b36d35b14d5e2c743a2b563a5ee13d2a6189d50e78d8d2bea4e9b9d0fce35ae8bf8c7d3a6785213ea9f4e9b3adebe3c5ccb0c20b51fdf8f86052c6821258c1d636c28a59452ca28e5a594524a299f6551e365942687c404d44d1ad4154a0faafeae20038c2be0b004bf0059422ba38c32ca90b9dec465aec7c3f4e91d24abea4e711db12c6c86dec266bab2d84c05aa287dd88c35b119ebd38216a4af6c1146d4b4293e623cda149f45a1becfbbec9060d61b736d82af2a58c10cc3e1b0754bf034efa0bf212c116d8ad7b0997977b4295636c2e8e893d301ab09133f274cc3e0186164506132e835245c1d6233a0431008545dd75537f5e9651a38b6293ef38089d057dbead4ce3fecdd790531f5c9d1227e30a98a6afde1781f6262daf4ee439be24136c66751c0d49577b635054a9242adf092a19f7d824a6acc7587c4866a1d9e94325fbd3e4a658c71526acd496d45e92deb3190da8afa659dcd93c657708c43c04214b7375c6377ab6b81cf786aff86c34068bff7deb37d698f78f13d2b50d72fb1022161f9a4bc9a05cba010ffa87cf1a7c643d32b23be273b6647628c110c38de0c4ac498e1e15ae2edd1020c086f063987ddacf14d47273521f1708699f085018e25de09150b1cab00311b8ddf85712df1194f35457869b4c9445a83c9217962feea5375eddbddf334b569be5a1a6d9a2e90653ebb34bba256a7ef550fc298958080b81ee2fc03d7eb5c4b95f554f78419f4e0ea315d8407fa94cfc3881e7da24e03cf673786cb8d0a9ecf2bf36ece39a763a99e64e70757f30e2ec1d5bc0b0d93ca572aab59d219ead5a679f8ae27b1a1d63ba9655957f6cd2eb13d5455db5d687b966d777b65b5bb55aff531b0b2da56edf52d4f7c65d663fa6db2e8cd2bd8a2956d152b2a6cf8724028a06ecea0c63695b4bbe7e2ee44d07a365610ae9858dc8834c305e658a73735bbe0e8925ddac567514aadca7577162a252a7c9c95ab61639b64846da06f7959575c97a0cb5799febad52f7a5d17bdb14d204a3e315ce65319d57fc5c462c532aceb029be8573f74f17233ae4df0107e240fe3a1bbef29d47375eb5a6f2c47f5b65e75633ff6dd0a6c03cf13526078eb27f7a2bbc4665e8cfd306b05f4f1a33ecd7035feaeab0e7ab64eef3c7d6339ac43d8d80c0df9616c52939a14858166409b0559cbce472c740a8878044d065c300df5eab23a6633b665ec1676299b5db00e1cfad5a7bbbb3e3d0a4481a8570abe80443763b7feb099d0053d06d6ebf2c4d975b14d57bc9cd7d150b7c605cbcb08b707ca29829b5ef0b683153ad78f81135ed4ddcd2ed8e16cc2f9b89d9b591ece79c1f88701d18f44e0e9eb1ee7836930b2c51652088694d6c7ed3183e027d3e2cd526eb24a79af2bbb306c54afd33ac2e2265f85c8aeede6c862b5f4ee10ca7a5ddae52b65d296b2ad94dd1c20f801c10f8edfe841772ea6b5abc253eba509d5c81c5c43378eeae8c444848944d7eb69155db566d7abe8aa597573ba19a5b496c491505c4dfb93d9cd42da103c7a66b757ed6699832b8e84a24da15b2d1d5c6fae9139979452ca2c7bb5d96b0eae525e3657f65a23732e795d19043fd925737070ae91391cf0e1001210fc40144c0147e640144cc10969f2aa097e6239cb7a24dd42b965726b64cda86698988c2ecd3cb1ac0ac5a4aa500e8f626272b3cd89cdb2939050286c66a2e4405229a188be519195a74de9a539b68b6e88463883b0a45d1ba2d367b556cbaa337ea3bac975c16bc6cd51dde495098511de61418cae6d303b842420aa6f971804b2d35b82a737f9664bf0d6b750a804af0d93876eaec1a1ebba6ab5b00480df48f90c912842938b007073a47cc6534c3ec3da40dc0e7fe01b2637d7606add5c83b7db600cc7ab1eb76a240f31214687976674edd29c1c3e64473007d2e3a14a09e56194c7340ab5145248512086cdcc4398d16955425894f42cc226df5c0fd73b40dfc4e4b14f2837b9c9af3e9ddce4d5d518dde4d735b1d8cd35183b6d4a6f89be9463bbf61bdb351b7aed37e835cdba90ddb094a31cda2ce5f496721cf1cac0a3c39be3e961bc35231b7cd9c6d7eb21be4d0e4d22d2cd8df385db24dacd1d40746845232cbae814c5c636897e622f5b5d8be831c6d3df889866c77e23bbd8b5c1d0529be1e15142779816d32856742d74739c1cfe4474288ab7946374f80dc0152cfae8d67af81b15de519b442f470ca4f37a9810f3669bea4054d8bab32ccd0debf51033c136939bc37abd55314c9bd65dd96360557dd2ede69a451d7478a6838d81a053685d9af9aa9aaf6c9894b0977288befd8668bbceb5d4db60df7e03fbb66155d49875ccbe32b0c342a1cdba39b0c76374c36e29473cf60d60b7ba96ede61a8a519b785db3f426767bb419b57974a932f0292d69bf11baceb5848e5de75a44b7c1da2de5d08efd8676ec36385a6a31ab59910dd91c31c4ea2956aa3707f678a97637a0ddea5ae8e3adae05bb0d7698766f64d8757312f8d68c6c66acee9cf6d50c1161cda16d16a8c8661f58b4d507b11d5e58bbd94396b59dd426ed99155d7fc7b457cd3a4df6ec6adfdc85b57b89acc3219b6bae4b7643780a6f52c186118300fdc921bc79d4b0b5d368e5c9254476cde64b2b894eb3fdbae85edf2ea83d06467bddb279135d57bbd42cf40101edf09644992d897e3ddbac5b125d1c0e97b0d358171dbb2a56886eddf9ebf1db2f9b7dc0edd415e38597bf2e4dbde8d29c1cda1c6fcd85eb8d2727903ec251a42626105e1bbc4ce0637508af1ba1161b42086f2545856fd1639f4c2efaecd3551289be91eacd57858f305eec249b3d74d578131b3a0dfcf610fc76b85d384765b9aab2ac0b678f36fbc071625966f268f3e8d45bb34eaa6a43d9f6f8edf1d5bd7e626936914dc49ed9d04d6cadb671c8e6d10559d6f66b131dbbe8970d3ddaec9bcd17d9eb98a5a972cd556d4e22d37eb90b4f9b89a06cf681dd61dc0116769005786baeb7032cec000bf8bd515a44443b25e54a829151461965943832f94cfbcb44230b65869cb24a92bc34dd4d4a29350d463b9172c6890909453bbd26e54de44fb24b4c080aa35d461965945146a93d4a6ab376a965f4d2661c5866b7147af6ebd49642df4ee7ac9544fab3094bedd905cb5b0addebdbb75fc781e9af18282595269730583e83c1f546931c263348379e8c4652cbe42533f928a59645994529a5945264330e2c2a997084c1dacee4a93d241f930b8e37946d39c4d01d24a5a8a8a4904eb2d056b32c7bbc19066737d7c0886cae81891607ceee6096f21928d648a472127cc9e1a519249c652a37bbe0eca6904e6efe4d2e2e3893e273b00eb2441c301126cb70e078cdaa585163966559ae818938d7c0c0c8247c727060f75957b050410e6056b050010e527ac60c88c0f4541b8d6aad2bd9cd2b389bb3de4c048e376738a28c32ca28459a9477a566a566c5c484141a1de5c4047b3df6788a65d94352bbc484d84e8f3ddabc826316b398c52c66dba5f7f231bbc8666c747a983d9eaa44c4cb5bd2aa2d611876ecf938c3b69b89c0f5f46622b0c4b29168f4ecd28c4e6b567076b98247a12c44ca504e4c4c4ceab3d3cca46619cd4c6a463322544651ae886e83c6e401471f703c6d3836ab3dabd1e4e61a6f5e11adb4a966a512b1729c1d4b152c557036ba9a3431f9c8ba36896eae99a6854426cfece82636c748448428746b5688a859a959b189c2a60811304ac4c0b302a3440c5798e8f4c0548b999499b434d67aadde614264988f88b938ddbc446ed65a7f851eb5fa4c087aec992c693707bdd843365351c542af3db057faaa95b69b835eec66b4da5c1faaa2639746f4edd25cd4fa88b8fa885854af8a723232198db25146b35146b7edc2a1c77e3964810fc51c5abc35bbd963e0ed7679d10c1b9b25c6add6dc036777998c8199cdd6e899157d647360d9b5cde61e18bbb4db4356d36ce3cd662bb3d866736037d324c6a3c749572b5cb732eab05a8385c8ba6e97f6b23287379b6b46d6ab910884cd542294110dfd44b45ddb2c755aadc49e5d6e87981036d67a1ae333f9cde6118e37b26fd9dde2319bb72042cffee2eb633c959766b3572b81b09e5db3d9a3cd3510d872dd2cf60cdb6ce6301bd7b7c774b6ddbc1d141f311c0f876e09117abc34a16797863e7eb335a3d08d11259e8846373f2c1289b66c1365d84cb565d5451f9663b35525aadae36dd49b6da48d527667a1574b5fe10ba94a291202bbc36eb455752b4765b9cb6ab334d7ad5bd6b76b368fb00cd94a2275bd39bb7be824abdd3d066ab66684b763b6030f5f879675cb6ad76633ed8de5d81eaa56bbb4a29b6b9cbda1bd3eb3f9e5d0eaad57d7cd6e6d8da5f5b939ec46ddaebbbcb4a2d6ad2afb7ea831e9d1109ad150dce208474dbbb906c79be5af07d0ec4f74074377d33e437bbc798435f79a51362f93511d913e4d1e6fc5504e3eeb28bbf6ecf234c34cb6c72bbb4e25bd6ef6f8ecf1f49bcd57fd76a8d99c9d5e29e5f678bafd0a85b64b7ffd3a7da69dda5c83e345aba6dd9a11a6f5f4d2d46f9706bb6ccd28bb35235c318c6482723232198db26ba7da28d3b48b3ebb36cae8a5cd5aaf592f212c7c5db3d64336d7e0d0e1c4a2bb7e119d8a6c1e69526553b1a26e36f4cc62332e7a76d1b73bcaaa4874f308cb9b6b4617d52eed0ed3b45c333a894e55645d9b4237579c6597331ed6f2712defd3d6206d1252a5681319d5c55b757890b527f0bb86e36af45fb67cf01b6181dfb34910f07bca88c7b5bc5bf5e406bf50121bd4ac25d1c1cfb9162d499ff2d3bce853b6c116cef7e96a48fcaec3d5b8f0fb0ed27c414d2142abe8cb1cf852bd2f756e758e051ef1c3c6c4477800471019478e8856b0c2c37bd2b21c6c18d35ddaa4c38ac6d95981e16dbc1efab027bb0cc1b3c385089e223c38a09125398097455871e101c6c5c58507d31ae68448be080327320192de26d8a436ddddabf880e17da06c6dc39c334e41e79a389348f0a59f4918f2b89623520b0872ef6a13fc73ceb9e7e9fe2e854c2785b83aaf5961051f943e9247eec81ed98321cc320b2dfa942b177dca328b2ca490474222933c9f48466d1aa0bf4f9065814034468bc648ab49279d745aa7a716ad267dd47ad57c0f142184b18706234904ab401aa636c18751b309d3e897918c8be9674f8243854f1249124537d5ddb161773f1f2d26cece478b1e2d30fc8e1d238aa8f129e23344083b234b94a8579d3f69d079407ac3c145ce14f43ac862a71b6acb0841efbe1bfb70406fd069fad4df21f5dedf71dc73f0efe6f90ac73e206d82b09aefa64f0f3704dd2170c4e8685317d103e44161048f1f15cc0478f3838304489f72863c3e7a55e9539f4a431a702a139ee003e4094ee0f9e1e1bdf7de7bfdf76aadafbe275f7cefc1b8146144cd73edfa21e1d127238ae8534dcc869d91307e2ef845cd13ff18a14fed4c71081842bcd0011dc1d10113c8a879de00006e1db0c3812ff333167135faf21247aa20224182e1092cdf5cf40b2807e2b81a3e7da24045201022630c012383847801cae92e3227a80008386329000396e35ae4295b648c213a00c07db31dd7226f8100804139f0e5eaa259e4bdd00143c835c6100c08112c31288a60994117121b54f96ce56cae2584df6506705f76565dcbcb1ac055c62ec5f89e08cbc3c8ffd02ff5477ed405964de4f202cb9bb0a444ae50a20c9c7dc0d25da1041538beb638b8b064064717b41c10163a2aaec6c36e08ee6e25745c0f4543c618a939e78c261bb344ed43087fe81384f03cd429cc2851d09287f8c3abca3a8aeabeeb6975dfb2acda17046fdd5cd909840eb86f3d768e135317c77589d9d10349c55de4dd21ae8e3689e250454ca87dca0e49764930cc5007ac14098ed0c0072700bb233360014f0c64e93705765789d88c6c4903c73b0804ca6e078370f409741b34a763a12c8e981f8af0809f8130e6071cf29a98d03038fa9479f821883ee58833cc47d855d1c40e7026e1fea93d23a0d28a3a038508a17272346945cd91087ecf9108122418e6c09cdee99d9f9f27044b2beabb931468660e3bccc63bbc25204c72c67d2311d7d28f92a20a21e26a0000bb3b2427e84cfd2c81e077a9843b3979e36ac4bf0af77b24e26ac0bf7b02217c4ccb246d9a8116091b33114288d9a03997479bfacdbc6761d45c75d250f39c8dddb8110f3118638c0e8b11da0a678a939dcf7b9ff0aebe1b34c7b5f4dfe5e15afad4bd1b54bc535097e2c012059e8cfcc339090cef14f20e0159fa5bd42c7fe48fabe17a09ee4337066e4b0ceca880b3a5831e827b09ee678a236524176abf678a83fb55888505752b940445cdaee7e9c09dbe8333c98bfe6edee545f53fe04ed499e4330d9c5d4fe5518411357db22edfa34ff4f23e3ce06a80aa6907d1cd34707e37373979bdb9a25c0759b27b72dd5cabc97590851a5d07595a5a966559d082cec54f37e785e78cddefbaa2e16572353abeb1bb8ed743bcef4602aec6bb6f04ae455edebc1e5a092c0fed93e2e950fb84bc202f8a97f37a80e5a50edc1be25ae4b7a0ee4df5c2fb21cb7b44b4ae98a054d39c6bedf201b5457d315eefbdf762bde8033d51ed45467dcf454949498148da73cf39e7faf57330d80c7487ddceb9ca39372d6ce6bdfbfabdd7efc57e8ca018f328b6fbc1efd0a2f4c29c735896695a7597e65c16afdff411e3acb0db5137a9d3dcb1acdf7bb1e17b365ea8819ca8efe6ab6e214de4466fe4b2ec974c42cd3442319baec55da3da8545a8f5ab19e8ed5003ea56f2dcc1f1f4bd39ab7b4284bc5bb750b3dbf18138f0257b3ccc812f35c31807f408999514e36a6038be7de04b0fc8123f67ad2452fbb81f1ff8f2864096f83a9f10c812c3a8b97d7ce41635bb1dec625c8d77d2166a15707458e087a710f882535e7c0ff8f2bee058e2cb30d750c3c0f1e79591d34e7cc6bee2192a7d3df4783dc0db3e48b81af336175c4beca10313cfe70a3bf7e96a4c1b97155547cbcc5b8354f87e5f702f31af0c38be35e0f8c27865e0e88410c8127f980359e235a8f3d23ed7cda66fb76e26cd7943b56e2452fd6f6e9f08b44c76210e6489af3eb97d70fc133267ad24d2cdc753481582233677aad68c80830714903c8b043c385e7fd1314660e5051f182b30a26c425250ec9c2205b272409723d588cf0ae8a19f1180ddff6849ae057e88d743df19ee0090bab3c4052c2f8fccacb8a0130912243c201213121e104e242624538c9a9764c78321fc10f0451e1e0784a0ed083850388104cfc0ae0a277eaa788310ac825d1562508121114c352ee9b86c64dc557ac5e46a3c5229fef43fb0cf4bc0c990200bf5797f60f7363277812cc7d4e7eb25e064eacd557b7691324e263bf55e295e0764a190908093c1717fc44016ea978dcc690fa6ae82457532d82dedb83e7fdd1becd7e7f54106644a7d4b1598a7df51d5fbc3077d77ccd3fbe3c9ccec7630f592fcc3980eec9674805eda711df4eba03f19180127739d464b9f730f664740fc44486aefdcdce01e430f106ef0659f0e64a12eb750f3c38143cd6e49e40159a86796b24e51b780abd181cae3f5d0778a7aea17702f409a30c960c721c9d453efc60138243460eacef9800323833dbb3560ead4b24fe6b22f073e9c3651d5e737dccf0f47071020d7b303a1d75e8aafb791c12c56ef0fedbe9dffc82e0fa67edd4686527b5922a578ec3632454af19622709d3ec6bb831ebb425e0e64a1de104cfd7a3a98ba1e0e64a1acf7cdb5c45717b2c4832e2482dd0e495836afab26281247bc32b0bb8f99b51edb7fb603131f012a230e37b8735075c09769723552b0bc0b7cb15eaa4b88e4ef3b6550af63d52d4148ddec92c067f7070fc8d27f8d29b525f7aca7e49e39fa1dd6e9dde9fde1037777d067f7870b6491ff21a909b2c8f71b0e2341722dfdcdb558a787d86529b5aeb4e33afd75ef2cedb8d695c09371d0edc0691b83ae0b64715acfb4e9963ea0dd327d83ab7b71ae5fdd05beccdf1d06be4cfb642c5bd9ac4875b8a40348ff7dc30f97e47f5cb73e3fef0ffaea3632109bd1010488f5eb02a94e6f8c655d4af2f436323025794b11b05e7d8755dd1f3e907747757a7f38c852dd0a5940ffe1208b751d64b191b1917132d5842ca0c7b4cc8c42adae457e732dd24196d9f31a96e1260bf575a9217ef7a14fce48178a9c4ef0bb113efaa5ba7946c0a023939f038622383b24f8c51e306c01f74faf87c68fd4271ef0fb3ba9bcf3f07a805fc12f0738d3984dd4e30c63829d912ea4c03c38c36057450a7e80dfcd0cae3ec9964656600228e6745f0421b998825d154d780193b033e28523b5ab60822dbac84113c468a20c49641e0ef0042e1d1e4a46f9b6a08626ec400d443035e420e6a0861d50178646d410030ce1492e8e67c3ce881a489086318e604fa75f5f0f0f3b200a2e96c8d077b575000970702353dad18787f7470380ecc8b48d0c75ddfdde83d05559b6c1ee005a3072239344bfac05d636f070e8b34ff3d6318c52ecb4af8d3af80923176070d105de013b235b14b1c113bb01a25ea854cb988a8b1a650cd188000000011315002030140e8904a3e18020a87aef011480108dac4c62449889b32087510a19630c31841002400446006664061b00c0497ae8d130665179b0dbc158114d3f880b3119da4a60013541de03a980b8448eeb53b3221a5cecd288ace50bc4426564df2241db17894c82231cae20f6ce9b98499589cc461726626d13613c960a7161fb1314c8a5984640648b3c3cd45cfcbbbc60ca865fc6f521360718b53b3a072495148d4f1ec6349ee1a9e557944c254bcd103e3b12d8004dd42d2ba37a614c0168e45a06a7bfcb3fee76e9bd98c51323fd3c296e675dc04d4c9f378f33010d4a4bb87346463c3ecc6673274632181df1dcd3d1445d1dc8fa7e894550b4d08cbcd6d98a579567906320914371a27ba96756c1da306e581e2fd8f7fd0636b673163f43bb5bee9b82b1c1eb893f474d4e5de7a2712d55a1d9f6f2476ef9dddac23d4d61a29403931e7f2e104d14f0c866254198ed9ce2b2ee0d86074a288b8b42eabe42fb7b07b11ea6de256a3f46d38793be08f241ee45ac353e0c733cecec1d7b70635de0ca7157f3dd63f007647bb51b243e87126ee61debc93b7cf64630b68894359601f076878f869772b3522f9b46bc23a0fb1c44d523ad8ac56b771aca25fce7b5d34096e53f03c1aba7bffd205201232c6ba193e0763a885cecb17f0553640a00b88a3492953af654fc2193fb940cf9d07f7ec64b4ef02909485b4020d56ec57862369a9fe4f4145c6f80da2df8daf49392435e674e16c33d11fe5a978cdc727dd4285df4d4689cd8352e1e8b70cd424eb6bda7bafac3e2b8cc651f6c9890e59a1eb792b4cb4b000283819793392f54932300bd241249f9b125045e53a1cc46852a71cb73c944a32fbbc0c5474ff16ea5bc34e75cc8a8dcddaff36591cfd2161bb7c017f4a9378c4aaf8fc707f2dc887df517cf8ea7e0d5971d5245f501e324b4808b5f070f4f650bfbb0c0b5690ba19486ec5057dc4dbfafc8f61661e536c18a68009d901622e640f31a15aaafcb9a0159d4385e4970c52885409f9ccd5119cf2bd6870289b2726ebb2ef334374caaa2c8dbc8bc0040ec50a27e098c83891d522de11123a45a3725f0fbf73ed89bfbe51e75acb9b0a5e5dd6ef65f0f557fc87da5bbbebf1404e9455d446e0ed7cd468fb575925f16d11e683e36265e2b98792d091348bba1f1069f68695d4a5282b2d0a9a0b80da8258ae8683e003d9834ae693570c10475b6b839cf9556b4ab6a1bff06bbc1505e40d397e06cabc9b5fabdffd7f970c1df37c64694be2335ee2308e13308b4d2eee6f2362fbce8fb078a2afe217d3b68b83a4724476696db93e0660804675ad03cee5ebc2b44278347b043ccf7b0e1cf3a6cc156759c00b8f143981d0c9867b266be8d44216ed33dabc147482711b1e81308efca5e3a35af2ec284fc348cf6f3df5df0d0df0b2573717f7b3d5463c37f27240d0d05a5b4cad07fb75f14139d5b207df7e56d2bc92acc0595bee1178672eb6ab5cc2f8c61edd5b02aba7525bcbd6c9b8c955e57d3e0f5ea0e2ddccef88dad8b23d0770fdb5d896c6aa731267855bdae10e5d6e03d8b6a38e8ccc5d87809cfef0eb63bc3261fa2fc9edcbbd65f97933bf55792d1bb9c1ecd6179b6bac937a620f7262337f35d7e079b813cae3e84bb6fcce2d56065efff64ba2df3fcc48f09ff91c7ab0b52a018fedecab16b6b0782c3cf6b8d42bd8111affcf9f2e482c9c6b814855a674b0e173d5b62806b33b8043522286fe0b2afb84032d890843fdeb5602d42f9d361e74514abab73124fe0eb8fb5ff65339c9ab94df8a370795016696dd2783e9254addaae7d3c2a79a47a4b934e4706e4e64cc6450004a65845383795017cfb1173dcde89710f3c7cd66935720954726fd02cfe991823e903e44b7a2bb7e08d383b17a5e2355c4d5726a584ad5457c730cbd893068844a45f89514b2597fc12a5940be4bb6188a1fda31ab3f3dc340e91b8c062865179817726893b2829ece032b45be6a8f39d3e4b7854abdac4ad533414a7c0c1126b7951135e94e5ceb0c34ee482b3635ceb2dbf1a697044650159965018b7ac603f8f61a0a392940b2328c876001f28a0f4bb0ef1fa4ba2cd69a9d313348e9b8dbbc29868c9b7a4f29d61a808e5caf27d80d128238f83d1cd48b7812c0f454988d61dd1f0e42508432fe2811112dd78e0c89eec1d3b1695d3ca2a4b2f026acef294a1aa5c728805a0432e1f7ee4575de49aa0df078b1cc52b10a510a26bb0eed096f396e0c32bf17e00f6800f17420effc6e2802a00e444e872c9b18c97b05883ed67b48f081075408c293b72a2129b11d0321c08a574043532e58985929c25ee04e5ab2e189225913112841e48c4cd172a3871d8721891dee9d4c7b97ab4517f57419d126f2818c5fa6105f4c3e006e912e2b0632dbbddbda20f6d0b5199f4736dc29232be202b3de04248df8526c78c5032dc2abc3dfc58da17c5b6dd03ad19890ad6fa3ecf5d4f6c7a16956dd004213ac62c185b8e1579d9ddf8b26021517f6883665125c117d347124c88f1d48abe935eb1244f9666951e3e7430b03a0068a2c3c2e14851029e48377310b310f3c0e54d68a8851ede94571c1e1dbd0c73f3d3f0e6c40f007db86d04872b0b10d892c5bcd3cd3fffaf26d7438e2a85fe63b25d70474fe56b6126f91025e07f844f76e5b8cb1c8c2afb88b677ee1286e1a03089cca87f766a05bf7a0bd43a062e33abd0cf5f3a57a55a5d9559dfb391ec7fba02d99cd80ee32371dc019113e7295ab130547024030280b9397a5e3505f91b7f82674b362094c59803adf15133f5ec38fbddca832a00dd148129b8f37d3e31a078a7a80ff63e52d68c9f67e048152330650031c3ce028ce9ee4663c4040f66b1e1ac25a6b867fe2f1b00bfb90ddb5ee18aba0b3e6b0c12cd0d66b30c7a35dcd0163c3a90ca4b26ea7c946179b17bc938e7194bfe9e4462c3ced0f871c4c1558f2a6d31f37378d144e068ce16e5b3ac15022b1aec41553bfb24cd78e7a21b4eea7006d0fbff2982d0a1f53ceb8577433cd807e03001fb20a3930329034947f77070ee6482356fab16894b4a1fe1c2049785b044419e6552083395d1aecb4f03d13ac6345f94abe08558081db56d3668cf05cf8262f4ae0fb9a03d357eeea31d74ba8bc949e1a57f5120201c797c80b6ef1b8e19faa70b48adf2fe1a24d673d490451eb0f5c76ced64d86558a81b345fe920e575440fcc9ce83ae26cc7cbb86fcb54939aa0b03f4aeeabe4fbcf29710119c5bf612458855a131017fed814f138047b9f962381e4153f783f6894210f4c47ad279888904f447708036d3d03046104d9bfefdf3d71c0fb9140e6bb8c2ff6f79ee91085d8240189cb0ee8e23a02cd18cbadc3ebf715f523e609317bd01fd20385450ab4ef8a4590314004b35fba937dbf5fda2219601520cca5ddc8e409a52b4cc58b37c6a2fb786b127a09b36f45189e6f93a802224127415a7feb0c5d13301bef9a6b9705a79391da7adc07964aa7babe043c54ed8b90d0f59735981564aa1400cd79bd6a0240888e45c83d1383fe1aef9a613bee70c973e191341575f8ff438e58310797a787c778e05a543e8d8f98f201b1ab7a8419f9b58d8c78a167237afcf7ef20faba0c7849a6818d4aff4a42395a061450804a444561d8fe8ecf924fa1ae14f4ecc632e4fc03658b0a7a4bf228ad5a3e67c2adb3bd1f90bdcefee815a05039ac7662ee338ec9c4454415ab78121617f63cf8f40c49cb675628c534a062e1da7875928fed1135fde6bb25d41a38105a6750ab6c12521a06c593d0e185d0bb4a9ed42ce69802661d2ab34fa633d2a7ac0336aba04de75333ac6c34d4629e034f3435e8221ba549ba5dafbee73dfb8a9e1367754d727da5d21816c5c0854c0b6a37d24021f5c251ad66bf65db493e06d6bc69436a2ea50efc6c3cd5d487dd06ca10aa2e995f56b7779f74fa89156c8603c20dd50d9e1545746f796b07a356c4b1bcf00d2962c9b22dedb0ca54b94ea744e3f9ff916dbc33e1ab3411adbf710afe1a599ae1606fcc59586934584d7fc1bcf56a8a0f5885540e32076c2f8ee237880571905c890274467523fa38d06413aa2f7ea077ae37f49e80b89bad7ec78d9d4f458621b6a2d1480f2d97ca2536155b2a25fee08aba43e3ccfb2a194e1206058472dd48f2cbfa3c8c14491a1a9a91df516b49e3aab01e50a7eb9517adac7e36cf6dae9461b22d8e42176a8da1605c25ac686b40fd382b8b08ed149a3a2d8860f0c1d447a6c7c6df7bdda7726a3c85c3b80ec7da1f7eb20d09cef796d2a611ff2fdd9f690967cd49759e02c69c18b50f930737c6060e71c7bfdca3be0514452271a81970003d85bacf4221267af2aa1f3694267769f20c201c4b062a1d428feaa2392dd65300c123fe47e776bd8c387a66c79725d5a5d0d99a06380a2e670574bf2c70ff0227169fba0242b843a180e237d4320d8e1030f8641858b84e082217581050c137c4dd1e14df9bee0431f1e7b68b48047e8d8eb56382680f49be5974a6ee293d06149ce1162fb5e7797df80115e0934b05f4154fd7e19f31d6d5530554488b2d32ec8b6835c4ea5e688151a04210d444c30d9067f5549761f961cfdb085478ff6278c6f3089c52d1661bc7ab30810a604cb676e2984826d6decadafc3050e17cee1ada3eeb82d362c0b1f2faf08718cfcf43dd3f31a94a6895cb4c91b268a6887a1b1b26cd309159312a184b2b59e9d8992a69dff37fff1317359bfbf66cb24453a8f067d677483da615c1f1911432df916d2165355100660d9fb96139b0504bd0eab6c6c06a4d38e34fdd31bb50bffa4a8f7c36b619edf594a7b56b95beb480aa994470eb6006f8499c36791e1f07a363fa903192457836a423fbd91d43bfc0e31388ce0ca9f864812d501a414aedf028300a0630c42d8f28453c43d443ec4be332cf3b722642d851b57753a2f5753ffe717420a4b4359bd87fb90533f5421075ecb38c584106b2f5e555410a766814d5d9794a55970ca8414196881795dd4099ce2c6d994a2247fd33b521eb1fbd7446ddc2bf8b7fbc2f6853918ff14ee21c99a2875f3c36e43e9b06e68c89180b705ec113c9c7390509c693aca7006a9d1384a5853f74ff90322c49a39053dd3f04d367392f31c7fda3132e1cc2a440ee62887f248c36adf8554dada05f4161318b42773a54da85b6649d296ecba8a29652444903dcba55870070e2c160d3ede1292d1ab00e96f55787f2ed346394a571435427e744454afc5ad52326f760ab7ad7b66d7ef05e355c6d7360e62c0cb0dd1e2137968da6bbdcee02d030216f4c0634d1890a5cfbfbf7df5c629b449c62e2897d7c8f1bac103d76ffda860dd724fa854ef27eea95610b9493aaacd0353b1b58eff09e6d1cb9815ed638d9d43dd5de846f9832426432bb45229cffb958e8b074ecb1d8da2ce4861c097c0b2e1b2c3b0f29f6e5ca9545c5e8d72ec4ed882f1226ce6b1053701ba13eaa9f015b77f8868d03bd8f5644873b896ed68a0ed8b79075b03f7c0b7f7170f890deb5957f3cdc8b58dd4787d86b74b50c3484bf87507dfacea4aa971fd05bd54a931afad858459c0a13aa83bea32de28283fb2fd2f0494b575764525d8c862da3f4cc0ec5289daddf86c40c5b0eed84924ca3019d5474e8dc436cbe73d3537bfe59dc59ae8d9256611864a41daf02b84bc85ccda5d1e17fbd58187cc50df0a7d1d89119969076f98f71d7a93b4e4fe9f6aebcb536567897c200f913a54bcae2ee1e853ef984547f303c6b9e52b116a75c4d49bf657ae04784bffeea3f62626085159ba3bf0a222503334f86ba4b8abbb7e422ac575cf16847637c30b248230ed84c44a15b0305cbdf97046ccd8252b88f21d56de3d69e725c6091aed8a99957d7b030d14385d123e17a9112be6b4c52a784f9e2d5923f6ebfd56fe84140e8cb2c17bfd32c88decf39f16ee519cbc3afe7daf4f2ecfcf5449022e1eeee8635abbbcf7e1e832eeefebb81ebba71ee46f5ca1add181be547fd4066d3320d21d6f10159c963c76699e009e8442c8a06a057884715a3aa1047aba357cec0280fde3ef03e7ac5629528da36ffa7c25698233b4d3336b3e49dc93e7c0da3cca12cb8f29f641a8c36123eb7047a0796ad44a7d1686d6b778b591ce30908d42a21dc05452b86bd4d9305c54cb18ebc5fd281dff02e30ce1b34f57333f257f121930cd95a9db867694690c8001d7f23b5703c93e89a1b402e932234458eb50a00e27bcc298a7c01f6007a59ef226e22faef83df382313f76330b636e68697522fa2d8f23ed1b63713631f917d17a2cf9cf728e514c450030bb3fc57251ad3ffb3cbb0a57c6b59d4230d3b7297d9dd473b157c1a5bfef957469b9e796a4a427e0f3f84f4bbec90dfa89186b787411e0cddf55b1455051b09366029157c198ac0ee36eb8085bd50fd43e18afe50cd42ee6cbf381d330f85e043b2eaf6409503fe85157bad870ccfa3008a7bb0d4a6a4581d40b1f7de3eede566252ac5c003bb466191215395d175d0ceffb6c9abd695963081e9028532a084414a707712f9b271f1c02c805c97374ff632a55a9d4a98463687cc6613b2bbbcb85197ce7f3b83ee067ea3d3fd38a9a7b7d074a55a89ef419a6af27e5027810b6b2f2563a2593b49c86758f3118dba894048feaf461b25a9f1de895dce1e40cb6527efbd2544ef0aa15bd04e3e686b96cccf6169724febb49842d8398ce15f0f4077cc03a5d6b5a9ac443d68bf7a40391edd2f225a70b35243da3d4e95b3940c3fa07390c341a5080d7edf153fe99a85aa400a94bf412e540eea40fe7bda3e472d698409bb5620dc4da54eddffffa95a2f46523755af9678e9fd6521f30c7d490a0293ac7a9799135da628ba09360ecf531796c1236c71b2694398251924720f00f2e07a358d6a8bdcc8beeed18c323cc4c5b19a1a3c325b8ed2680f780fbb0abcf0d33131d39e6d9635b2ad02d69106e0ba6605e8904f0fc0a57a990d80d4d1b902d60030529eaa42c25ae2567f8df1c7d284fb806afc01c816ef12a1b880af78a98a0b5894076c6daca15e00a33071010d8df93b0a74634f241d7a572224821b50135c9850fc2f5d20b8cd0fa798eb3c211b67fe46cb8609f5c90f10c060592bccfb0f89e0ff0f0907b49f3feaee7b1cac39e4d5d8cc6350e43988a447fb1d68c47d1c1186c3a2ba6e39e6b1248da2266a5f8bca81dcc1f43e6393fc8f6d6c6d2ced1f417321f57210190282b0a2ccf8d017f228cf15d52d60dc22224e040fb85580b7a80d34115ff4f2d9b984c20ae5b912f5aaf73a102cb14934703581d6d9721ac61d47b8473efc557ec877830a50f21c700bffef71c39d01d4dd452933cd4464f7fe2b5350009cf0781710ffd648121d5ba11dfe3f376fa0487878fd7b5f63df9865c0557be934303bfa39b2d4f40985470e9e0c2202e588cca83fe35d6114403cf4d1e5c9a71783c02fac03b37da7e44229b4d7b7c0bb07687dcd54d6213173dd205e2844a14491bee714a64f4d1d521f760deaf41782db6440ea5494167484f179aeb95a130d090d4f286522b7be7daa84b6f7c2426b6867c426051e38862047b0564ef2fcafd5dd49496315f2bb7765b1662b923b437e375a0a091f1e77f8c3fbab05e2df0f9efce7c523f70942e6955c939428d86ec838d80d2fc10b67b2bdb679689ff20e74a276c88ad01a8d3d480fbd377b7b97dfa0fc3f9bf752380e73a768525359a3e620ee8c85e7daf74b35bb2dec80dfb469dd939c7e9e385a1b89477fd3a064e9f8898b53c366bd5052f5de2025893ab770c4208ad99479953aa1cfc9374932d3840c1c589284304c3829359e31695b19fa8bfaed2d035de4dd86533a397dd995637351e4982d9066bb1222bce73f950e08c68bb974ad632ef75cbb106c9fae00372517e49521e6c367bcb9d4e0061606f39c11e117a226222891e3030b51139f55537bb2adb236b9acb58a690d8a13b3fe73b0e61a3eef9ad5fdc89e9d60bc529d68d08aa48f246e480e836e1b494a37969b57af45072bd044c6ad0e1d3f13bc532a47937a69a55635dafb31edcd371c6a29aca592b27dbfc83e059df98512667a9df9bb1da300da3589c25c12b6fef11ae31fb8a07c049154be6cc54368c041c2c3651c06206285a1bf672295d1501f7fa216aac29aad726a6c94a90f482b59bcf3559d22431378b374cad93c26247e2831024efd6e892d8610cecc48df3274766ef73696360cc046b3941c2d7ae6dd78b733c241d1b8526e5b3779824f3475820d37d12b50f50b1b49111dc14fa2afd6bd07618aba4657f85f6ec65b8eb6a723c75f246a813e8e6e526039c575ad31c41e5a39674d60864ddbe348628135360b7fed190e88190d6c94f8916e881115daa86f7eff89b3086bdbfb98e1930216351d0d02f1184d87f7514099c21bf66113fbf198b4cf18ab0ca8a93da2344619c73edee1d7b058182904086965e89a81761d67f8b7d4a88572872b018159055fb9be7e2b7783fa5014897afedef9ab9552bac0b89246f20f69523c0a54c291d304e67f1ff93ce519440b77f20af2990335e16ac9b59964bea1b693a4d6702946e1639ed933720acc9768579705ce628edb375e157608621b92a82527eac3852abcc92d162f40c7b1de7f7b09c48e336177004960fd3c8752a15e30ec21866178126f6e447b20665a792759ea097a8c153210a26468c2688469098b55660fb81ade35c258be700310055df1009a663d89feb1f222edb1b711adc4fefc9ff439980872c7a3731d06752ba6b8569feb47bc03c49a705b6dfc499ccc3da11210c49ffc6ad4c1fef5e156c3d4239359fbe9155710575084a6763f9cbd926498f508fb7f6e726b4b65a305ef20779e076b6bbc398c0c947cedef089919d6bc695f8f226a55cc88d3737a4a97631378fa15a570572b04a00268f1a5f40a99577cf45ad381671605d3e9d4832dbee7c30c5eb4d0230458f6f40aeb32300042c101b90d03a9f7867936d32c2a8e41dc9f759961ce0c3dbbf96f7760c9678f14a6af5667715f70d3ba998f011fc5ee7a66b24ccc0fe8a07d336235a97d0512c8c8880d1d0102d205d131cace11c0e1d80e14520bef477b4a2b0d14f8bc6763f9461c6945958971bd4ac3d1814a300e2896169d58d7fc90a1904e74230e18e138ebec78a4191d1a738f92fcb20be8a10a3e062f13f9a996a0c3fb8f71f128c9f00ea6d2c0ea243e73673baa12f78314b4cf6f1480929c52c0f53be4b20f76288f69e3dafcf796d844aeb699383e4f0896a9a34b3925a83025e52b599da432b5674eb8dd68d0ecb312eec47a5fba4cf841b47208ce2dc44aed4512e39eecd2ad2198c985501341e1a3f3f0b49342bcd2468e9222a297191a56e427858bbdbb388331990fd236101c52e3c8ee94ccfd7235ba83b08b0f0156243b8de1fd63950ffa8db714cf69128558b693d18cd754fcd46e539609e186c640d412c789b528f24310d1068c419ccf92838ddad3a776a351e6b8ef36a41e2dbf36611dd1b5414b2b2ab0408041c3d22aa87324c51594631f3ae99b8e9d31427c653f4606867539328c8aca2518255f332701f1ca07037636d765c8e20468c5f90b63fad6ae5c4026987f84eacb532a33c67d0fb5ec473e6c93ea07cf1e0923cee427ef3bb0c893c61c26179696921730920e691a34ad451da011944b88a0929bb2d356dcfc0600912bd9f2978a7028ddeca7359d3c03e6f51641f02013efb89906509618b1156f9202b725dad37b189e6d0929a422f68351967bf15c3eed8d628c4e42c33f90aa9436eb90a337f86807b52ddceb117f9792bbd1909cba949140ec476c356d1e9ec412b6712535d86841b33261ea270548e3f5488275357f290e7b73dce2a39d616986ce2ebcd2d1a3805ee1b58fd3cb7d096edca7a7b0f585a0896fa481b4e566d662d006cd0c33bb9a2e2533294d006609962e769211a70debbaa80d63518e331590dd100941a08726711019406479274b1f1e03a7300de04a4020d8355a55aa4b33cc9b76356b9e9c88728d83eea7a026c93a1474804bdf3af2b78786373209424418fd2d1129f8031f84727cb14d4d718383ae76b2bb39c9b4a43c23fb312957bf424622f5c39bc2bb2cc0e58bc2ddd4179ec1dd6a6e33a52fb69915d40c9f399ce134378040d172299aa0d1e69e1709ac6e273f94bba512907ef1a24f443bd7cb916f06ccaf0e845b32ca10350cb06a1dcf31a0c56125d33183334bc931700ae46a3813eab8d3f322d702b9216a135abfd1b86d1a3e2bc01241c6bfd732014940a0ad16b214c2bd39584be9cac0e0945c2661238bcbcf92b30c51ad565c394aac5fd474b0a2cf6dea34292578933bdd37d592227559e5252029b28b05d179faf187b315a1b5a403973910952be4071be5469989f1d84d8c3255adf09c46339cb415d69d38a059e2b997a097eff749ca34811129c4913074701cdc1e5adc047b3c9108cf911b503ecea378cc34217de5faea035ce00da395517a2aa92ba745a9558ef9269f46b0ee7cd12182f8c306ccd29e0c7385bb5c90bbef53213371391a969b0bd3c4d7955223809820d063bb1bde3e2a1b453cb816d550794776a4f7ed929bf8ab453d67431db54862791a728c9b598dbf14460cb215b20a3f3ba85a879a9d35591fea6a9532aa0e9949cb95ebc3ea55aaca54c8657578d1402b6e013dc3b5d46de350f9295506d9ddfae5af68abbf50a667dd3548195a070fc86047157637156bf0ea3edb9bd1effd3b6b61bb4d77d224e238553949bc0019ec26a049c87bbfb4906cc55d305e83815f08d4f1b13de82cb06fe7146313d799e607cd7dc61f3508b876aa5681d96f44557cb89038a00f6c12d0e4ca5902af993aa251aaec16046a1c34447c4f45c87fa473dc961485e0e2c53e42065b31d65a2047fa0dcbce23abfd1276becbc88402d0882e6d1eca20edbb00c6c517b536f7f0566f0d50542191b054abd3179010bbcdef0997154ea15d63aafe9917a3d64a04a166df94effa807e752c1bb84f4fe6b20802b2b6f982553a82b04e8d4c2907b42a608804d661b813c650aa6208330b7e7a6321e77cc7418aa5f518a6034fe930368290e2c613af4a054fb425b13fb81708ed969311b835bf84e36b8a11f8312e14d72df746206dc9508c2e9ada95a091b087d09decd2889f06bc052ba6a46f3d3494ee9686426b660d1c6f7879e331f8e4da5bfa826a4246f23241550c99df7e3b40f6e182d7a3fc759a0bac5af61ecc21b3266efe30d2d45a6725d1cf0694c35928ecb27a6a3e874c4b9fc5ab6056e85467edc49ee96aeec720b11f25ca0695ad11c880832e50601635558b527c0230496b704ded2fb225ba3125bf46da3127c1f0e2188737933cbde7f8b7986187fc3c969121253fe49be7b6c4b6e74a2de78789ae7eb32f9c91e9ff51c0dae1703a5e2660ce9564c90f816c63c84d35090c7b5384607859426990a6b8d5d523b6f828ebfabac25a09a37d25a0a379944bbf6783e31cebd410054adf287be71d4e4b31d67e07443644d43c7353104b1498b73f9981296cc1ea92433000755d1e0e060c9dcb9eb3e860761c557cabf613cc1530c02af32a832dfd81d2b04a909952bdbab4eedb9e7d20d3d94c0faa9a9165a587fd1fe3adfa4b6c9d231c92cf7d42b3a08a8297ef497563076c1d679aed511cf4f663793c53d88409df3744a9295b86a9008ec87371a4b64574a4393d293e17e7a23473c324a10c50ca9880e779e4d5c10b21a62b0fbd799c398762245c4542b736a3f2650f7c91032bc6e852afc097e79e479bd046d3a2ee1afe0781a33c61eb8820989458bcc5c0f30a6b5c3b13d5fd8e14ae40868b6a1867c3437ae75eb98d183a5815f71596722a41f9acc28c7f924abc0d74ba76a8a8cb8a81d270cd1bcb653a94bbc2d27846a61500c0ebb712831d4367370c5f601e26072a9ef33ac93c42d9beabaae38a11424acc19866eb056c19cee297a5628d7948592bcad59accfaabca67055da5879edcb659d317b246b69e071c066385254435ea0e996a14606e85c29b4e15d6f609c077134621f8dfe7e4616d6fc30e21ed79f482e28206394202fabe82a70abff9fea2f93ffa26d4f416336958f1f36ccc594e0cc16d4867f3d2bed57cc7f360931558bf9afe6a260ddcb341a7e34a872e9fbc0e378b86d0514ebca02bf1c760909825a07f888bf5828b4d1a8ef61085989907fc81d69067b284284ad2ba84fe3449a8275c36a006bddd14cafec9a6693909be0eac1e1e9307fe232895fcd4f11dda651e52f04606c42f10041e23e78b90f16ba9359697e898c178466bac2dc631bc1a42b61ab6720f77b76bacfb124135374e3ef9e711b4d023a5f4e351f2c574792a47bd74d8561d66f3bff15236bd15e07d28e769f46c21be3f2aaf9d8ddb0195732a80939266dd69c1d56eaef8137ad87f473ef6e4c9970334be96a6665ac3a11e050265588b09df816edb734abf11c83c19181a1091090f7a9ca628ecf3bfe304a1dd83841fac1e02b1165aeec6fd8a237e41bcd782ebe7201aae08f67d12b4f363e0204bc6b028ebfa6dfd3a34688be9168f03574a5cefc11f17eda18ac7c9795d5ac4a152947cb407bc02c54b97729b11634b56fc7d126accc8c2b7e405d2e3acb11d85d3605c62ad07e85790ba6e6b3611f8b204008871871858c598c0a9d8f96404c45d0971aa433507613102dc55f01c13775da35cb20c82b5dfb207c54922ceda2f266213949d3885272577a3428705698fc5311de87664a4350c82ddfc08621574c5a39f3b6ce8b8a3592d4da206d0698d7b6b653a845331a2bdc44843be90f5d301489db89166fe815c1e7068b81f3f57bc81e802323d787df5f2df906ccf7530e13496886b3f3100f132ee27af3cac7d262b03610731287d7e434e5658351229501d72821c41997e2ebf075552451e8ba04bfa6b020f927530ce630f46d3023ba087c7e5642a028d47f70e48284a33a8513c3dd6fb1696df05b67282ca925ce3ce4436a0c616af995d6e295d4e5b337208778fac05e70856821b8cac38ebde6ffb4c02029b83a9200d176a3b85571568484b8c0ad7dfe2324ab318f48640112d73dbb31d6a5c1a0b88d0314a51503f954dd0a2b113583aa060ca85196163388aaa57615763f5d82d33b6b51c9848cfabdb397c382a7369262e25fd5481b096c5c67ca6e3f8bf1aa097ce10df2b4d596673c09c2a07242acb91f769e40f1d5e8b0c3b70c2f5152d358f4ea61fd6a22379c9aec507f35d49c88a2f89aaf36d18f105ec8a18118bf6106a33fb09ff511e829c3867c91afa4775d9ad6e9a12139159449365bd94d42422a32853c4c5262af636a266378e1fa46ab8906889d6173b3cc184e8288514593038bd9e90e5841162e014ee85d247a6f0280886480688dc2908ae9307b006f6fe9d7feddb73d8e19c6c7cbcffb59e0bd0a6ed74c0c3fa0b1e60317fc42c5aa532b910e34331ec6b1450a2ab9f2a8694d69175765de2eec9303b20ba9305dd0d665ef4d773e1a2958b2971a45c1c762059685be6a91a3966c68f2fb4f1890842c3fc956a1d274d48edb3d8e4712996aa000ed2865ced4cc7d0d4f5979b1dd219ea74fd927b8e5c49b81fa9b13f53d075151e8b865b017810c51512c20a6ce53d15fbdffc411b6502051a880ac4c3701bd8f2e47858984ebcd519c900950d25e52e20dcd3a0207c3f1fdb30adfe70231f14cfe6daa05877cb2992959f4864cb0bc4eac32a4d5ddc1421f7b9c42f9da7e96a98cef79be54f39fd9513dfaf1432c16ee1e6e79acc5a3ec17545ee1445ca247c73462bb13c89bc6dbe1dee037c014a3f79c011646cce02e74a4a3612501c986a98f8a865418809dd5a461382b9e1832f637d0192931411b33001bc36ab9da3b156b05def7bbc04fb6297685b1b86b4b2db98aa962eaebc0045851c077d882ddcdc79e55d8887cb941d29436bfb458830d0e40d7fca3acd7eef4d3c82b9fdc2f7707c3a0272f0119f5f4afb94ae46903769ead6a06a238ea9495f2bcea20e5ed3f353a37c64b1192463f1d163a95e5bc53cb12b5327d9c602d2533baee979b38491886e626e4c58665129720f2f5cbf7b7feddb3deeff6dfb30092220bb632cb475dfe1e9f4250612fef277f0d5a36a99dece4879092f845f97775058c8af580528ab5cd8bf0a120c8275d70c9861f0a6fe02784cec84c1203745fc87f5e57e34650d0d1acbc4186c3e9f1dbf1ea1a171174d3cceac37d6023bbf5b75806709ce9ca4aa89f3074468b6e6b55c8a587ef9394395853cb003f4867fb7c1d107a0189209079b2e3465bf5ccf75c5cba13840cab4f8eeff9f6b646327e7e227bbfbc165519df4058eef162a78abd15ff874e0d392b7c7d35e078b83c04c878529584392e54c8bc9902bc312162d704c5bb2809174ebfab77cbd00a7f6ae59e9f00a7b794eee43defefb7a67b04a5b165e8c4eb406f651843b6e2c8cb97c18a2449a1a734c6613fc2104705111a98f9bfcc1d5ef52e2286dfe72563dce9ba0cccaf6ab4e35bd9c1a2031160b262fd609619766e5e00a462fcf67b77511504468699f80c3502e6e8540bbabea241b30293301f10f533f0dda50f347db910f5d66920457a057203fd84c7f583da1fd75205c3d24042417a17734c104518f4dfb3a2758c61e830b9c53c987a9cd782d40f64d53b128dc49772d559dd91ae6ee54fb43f4122b8c12118cc02062b8a880ccec7802dfa045fbe850ec04186809b86b07e928198ca3f84934c7db938cee12e79dd1bd65ac3efd4c0fff9ea69738f54cc915cb69f5dd222d70671df26cb59059b5bdceed523b38d366ff64d59ea01245c824f6a9517164967fde2ee433a2e2a9a864442c7a9cdffbc42f6b9e0fcbd267a39fa7e8bb991541aadbc3f5b8d85e90c7d453ad107e4d525dcd66c7cbf88eab323c9891e78eebf291d0016419a7e4e7449ffbca3c4e6e6e1bdd7c96226b3ec3726c4d46424c2ce72225e1d2d4aebcde48f327eab4a0df7ce7353d4a4b9903abc196dfe033c5b133b150c5f2174b005d2b60a304cba07e8762097309181b9ae3413882b85c4e7988beb3f9f4b9f7e947260fdc1e2b894d206d18b7d89926518b989f115268402f1da14ecd71c70d8748a5cce375a97c8be5b10adb784e460baf14f064f33153ac85982ab2abb14698083bef339abee8f3e251f4c53f0c23ee9a0a0c771756940802a0a367f4ea83ef000e924af6f241178adaced8d405071b01d5053da16db08382589375373e9a21d17086300cb118e3d359215c9d3a92ecee0280b24854d964288fae1e9894b6e7752ed9ba085e89a1934091b8d11b2f8121acbddb9e480a03e8abe62e8fd1c3ccecc3b3f40631e3e942351de038cbde8780036a5509ace3efa7b91dc8a4592e98ec9ac39386393f1d83facab83923516dfa605de82bef59a28dfa0fbb1a7c6cb1e36c017948720f6f655de99a14a81e47b0281936ea41428220056046abf0390c13bf8153bd963eaf750e4b874ae87173300c854e79f94d23370a60a527e8695458e0e714ce71bf1678470093af4d6b67f4955484474627e24c3f6cd1c3ac3876c28365684e5acdeae005a87d237835ee886cde76f8face187bf190de7eed02b396093560add81a5c9bd15d3efa1032b20731d296ce64d3e814fdc11051af6512792799d46fb605164b886ccdb3e242c652005fa74f05e5c879c00da0076ce6b39ae79a358e2dd30e890f10232f7af6878409069b3d1d19ea7c3b8ac59345df2c69120e67b3f650ebcfd49cf1da70283e51519a910578df54206e1a09d5a682b806404bacbeea0aea27abd1a3da9b46d799d59dc0c1b7a40eef932c141dc9c25e95abd8eba6cae46329a2dbc68eca6b088b08e3a4445b7f1c74ccf27c8bb0633a3bcef32211b1c0ec1bfbeb3c5a710071f37f334d5d1db3c6383318e1aea39acac88469ac18639bec385e61f1268262b969b0692e0c418011f0fe3f3e334d6da211b9079c207b08a71a8011a339e59f1ec6d704da11a1930d995b6a3be1e9fb79022fb67fcf274dcb4fbf1bd0b34d252b02aea7a5ea5e7eb3c134241635459e9ee26ef2fa4dde8043000bac960c2798d44b9b07415103ca903f11eb7283bbe17e71e2e270b9109ceebbc45a54f3a30714b57cd0c42ed089a5633860f8eca630488d8d5571e2708d8e6118240f5a96764e4ce5c8422a80d5e0cf43210b85bc5fc39d10fb077ba9d472679911220152ad9b6c20a94c5d6bd657318eee3fc886eb0c07e0cf066cfd8782700416dd03ccddb90a8fc186754e8056cc523bf758dcc3cbad14ab068a0ee5406cbce7598d55501a414826b879565865f481fd6a477c839b6185c92cf07b0941efe70e72fe07ea27f1f8992ec499d958a4e1b4c92d0d9a8da1c4e1815fdb38b72f8c99e9c7e0c8ae67301b0d7351afb68ffc6e0529f96adf20f8a6787dfd407f63644e8617cfa210ba55ea80c5c9fdd43b344af800af92a3a680e1a185c1da4328448e2b9d0bb39f251038e46220850a4b37e7b034bf11517818a3185893a6f6d509707baf57c4bc3b9ece6f2e57157a062cf8d1f7c23df248a4b14f9f94e33d4b0c631a0978f014e08ebfd9528bcefc4a2184c0eb716c1ebbea3ba6a0e1a0f2b3edeb34cdc4d79f33096168796c34be75e1d718a302212157ceb5f3754fe0022f8c58d32806018572242fa7efebd52fb3fb73bbcde4063108c3e1269a3274d842ea880f04e56192128e669c688deb307380179ec25a9802ea78ce53088706c40dce1228e98c8e6faa2ca2d679cba48f3807b22242aba8937f165511d6929d5858705961796e97c185032213f3957db4e0337ea72f9f9228e4f507ee667d6b7d6631f38d188535e19d925ccb8eb20ed2ec45b410c6f6d0399bab323bbf9588a968d6eb8e0bc03e135c63d564372f5217dad2aabb1230e5ad6c93fe90a9ecd1714afcc580da5ea29100ced67d1c55e0aeb33efb1599869ad86560abca3c0a9228612a4dc8dad2ae31dd079ac34bc1cc0d4a5986981b2e87ea3ad27edd6196ac72de8a022db0ac64c4b871c9c4123376f188fdf32ac0951a6b6407b59100ea6255d4020e8162fb5122fc2bd0fb4d5a95ed5e0482c6600c52376ca0680fadcf70358a332f643556dac3b31d048e934184407f3202a9ec7d5adb0a55e2d044de040b5575628f898361746c5368c1f18c3aaa901af6e3a2fa33ce87b3e980e699cc0991f1c12d1b0b0f204fad75ec2de54e4d32f209984aa068f25a0c3df95a004cdc7297cfd1fea1d6d02f985273ad2e8133ad8ad37bd1c817790259fff3e4ba8d7bed6f35adc18d4eefb96f2b4f716d869e1c01602f32276da30e680b1216290aece63a77d682680414967206437dca760d0a01d5144fcf5270fb95b20568d4ab034380540b9f8d160f8857b599125c2686246004fe25fd2617dbad3be5960752c9ff2d5dc280a00fc139fe23077cc6d6023f34d266406dd52f3f7a8718da2b6e424d4ffeee954249d4e56d414cd2ea334490031fd3b5f192eb13a78f149526ea7b04f31df046e062118a0838e73fbadfa15de560e350c1edd891a49cbef7e25b6430107c06c1780988981dffe0b9ab92d961c5683f560eaccdf819f80ea53c27d6afd6e82f78a06ed24b220f25c51123dcbafd27534732fe6ac87f01e2868049f873f38e4d4715510211ca2a96eda54fe446b97c07adad887a3c9c95b6a2288afca599f672dcf9ea03ad4f0bb40280bba768a0f694b806b20df86bd59058eb9ae62af5d4657de09a41918d8900c20e37d35eaa70867394635dc318cdace713a71651382ef128c0000369e74677e95c01cf60c0c3adcaf2bcc74eb100c4db0760e81ba00a0522e725f8079fc777ff280e6f70f3ace6c474477f593f3eab0502987e0e64c4dd2a5920c126ebf4338354c7c09275511d947127702492daadfbaaa71f5e9f0b55c297e8452a126fde37d501aef5d8c97125ebc8f7436c619501ab2ad50b4d188de6a83f611ac6faa37cb97a7c94883639d8c59ea58568c5f4db5252dc514d92066c9fa0783ba82f85d094d546cd999d92e737c963d6a8dec5c1d5a4b590afb7aaaf815aac8060ab346b827c1e48023e7518ed1328c9fedf6ba216cdce652b445e705f92f662a0cdca3dfcf69639ba0b37c7ee6ec6856b8791f111fba6a2523920d6e7f21c86d4b5287362c4e55775e43ffe77244f7a54d9214e3d7b7c225989e536c81e8b2edde3d08b2f8159b7e404468f73b5ffc634981026974b92c1a92d749b86b0edae1cca881c95c8542a786193f014b3bc870982efbf8dde1e10b7107f3bf53c8b070048e6492c566b9f78d38c0ae0e122346c5b264fef61da237c11dbfff89ae988da0245267d3ff2fbf80702f81126a1ed7439810c26c292000b7c68b81245e08fe0edcc597199e05dfbabe2e603488ac613d2ee93a1535d5e562ccc14da4b7c8452427c2f814311c59dd627b43d88821e429be44988b45cda01e6a6ba14288f01b6d657c7e6569d86404eb5c5f2bf479c91bf4b6c70cb11ed1d4940cde3a21923b955c647903a778620f50d1e1c6c753a8877a29406b6a0a76dfbdea6b192fa87dc314d50afd14d2488147a75b30374fd0bc41b100ada13cd01f645d0ec1564a8231527e9539e696ab2450d817586fcc12007d1d6277ef10ad5aa51621f6236e4a0e10206d5b934e3a26c26a7d7713215a369c355eb032f178617d98cb9c25cd011dc840e149650ace3704c377679f895580c376128a4d26b9a80bfaa69c3d49610a6bb05c3894160f550e5a6d33dcc12808052b521fee1d5cc774b5f0ca1e93d4bd0bb841dc317f77297c92e82b53c321aec9e0463ca35409e71deb668dd776e139246aa0de2ea46027593cc52276b4c0cc6abe70ad7f2c3bf0d6dd0dbda036a1e2cb777e16dff3651bd4076936912c2c1e54b5e4db0b88c025f6b0dd771ae9f25536f9d3b8e2c10fc34feb9b78740ee101c4117af9513f8b8e5f130d3f3de6944de645191d94af4a0caea3d88b972fb6318556dd2ebac5511564e00eb8911f06f14efbf4bf631683399bb51a6cde836c451e6314aa880546a55953ff66ac19c27c3a176df6b064cbb140348c97869be3c2893c04176644348dcc3b0e2d19e9bc667646dbe77aa84e27c300c915544baaa8108ec252c1189f1a5d0148d0b1847068d39650bc6351d131cbee20e0924521dfb92b710efc940b831e2b4dc459bd83dc011cee13f7577d016bc8eb7e3e445d91ce55c9dd586a7e129dae6f6449754bc3a1709249710aa13f21f1420e266761f3513e0bf99309654a569382f24f41ea64ee8a50fd7d8f30e79ef5d5514c9d13ec114e6eab688d2194c2de98bb885dead08a53067f94832dc6d82eaa36f9a0582c1c3ee18760da99a914c7d765286eb67f1ed3060b8a97fd3c890e31f60b51554db0385c7c10202e7d0a55326d917d34c119abf390cb7351c37f918be8b2addc15ce4c7c9aeeefd439e1677ea17d51d6a7bf42fbd3433123e3f760704f4e61b587e2315f58ad245b252c6b441bf441d1e337bfb1715aecebdf2868d6a5693176766c16a876ea4b388c7d2ec4677ebc3d99d1470ddcc3af141a2b695daadaf71ebc3de7b9730bb7eb79d49934160ac6350fcc70a466c2aa44e408e2cfb8d217380aca995548f62be452c4bef58284eb10d7183006cb52d514ceb9b2d93595e47e5d69cf750d61263251138d3be04a0d37359320fa1b6d93b5ca4dc68dc379df8cb28044c7cc3cde42f0f03678917e33b61b3981521e83c5721795e4bd1c8d87c2d9a87eb3335a4c7e434fb2d29f64dd6a90b349a4bcbedebd17b986944c936da8649fa640580d88dd08e99a3c95571120978a64354bcaa0e152330f3a40af99b54ed07d04e1835e6c13bdd26cbb7f18717a97573509a37b26f9fe0570050fa5c7703458960bc67cacf81deabbfcdf4f7c2dc2324f4e11422ced34d727d5e1bf5c60d43c86dce606f3c6970f2bf61ebd48fb8bd2d7ffc41b6ffbf3c0d1e6f32ba2436601e93df9ec02fc800bf54aa8b620a0dd0a40ab90e8cde2c1e7a333503590c79c9f1e5280390180908ee0a301739c044cb3ffe4412cd0103b605663fe29bc78a9c24f9409ef65eb7c188d28c288e6c5d0f17818b70fb73bd7fe57170b3923c85d4c022567435e697140c525a3133a28a6ef0775101765f4ce70b58e7716fa3477ba543f924475e8f2ab08d053754fbd78dec0eacc6739e64f9d5b10ab1653fb3cece3c4c420047ae4b8dba48ba42b50035baad037531e89de359b75e4637d743329437906d56b42f6331166dd6510a1818b51552b6b6b770089f301c2640e2cc937889b5683a9e01c5e53aa88a73a6cba95c44f9fefbf97da93355fa39bfc30064b8d5276b3cd5452cd7b6baa4ae258778261e786644ac31964edc1322195b38a9f74b74785a54759bf591618c3799abdd7d78d0754666fc4b2192d19bbf7ebd6321597269d8127efa4604800fcd3130a3ef69b8aa71dcf52d08587500c2fbc52142b047d24edd98dc68da2de097b15417c0dfde2bd27ee3542fcdaf48bf44e482f8bbf7f5cb10945f8a463f50ea84e18ce538adfbf4f6e1d372d61ee735b39b4b18fe83cb93a99af594068d142079c26ee03f95610aea51e854b5369b8ee22efb52de3993a85769d21f59e28bea9e14b0701fc7b9b0944bb1513dcce3bd5cbc561efd30406096a5ccf59372790b5decf085a16680dac16b6ec0192299b31eb5118a071724d0c9db93180feb0c3b3da0c6e3461cec5610aaad138887ef5d06ace81048ba0be9a5cf76002b86ceebc6d33be3a58b0cb01d7012eb5a561047c168464b4811c424d58861d047aff97baa7baf20109e3eafeab330c0d567e6586005105bbe4449dd45e3f7b207172403dfae469388945454fb897c1f76a7786733cc600b3f9052c5a73d8bdef08158e5466af39413df3145c776a9e3586b50105b960174c2cef114b1a762130cd0a1a15be621e8049c8ff448212b6a70ab6b3d6dd3d1da30c1a9e5a5a1e0bf166036be53846831434e4d7460177d5667536fbc8a536675a1040d101cf7e93a931fa182460f2da3811c99d1d24efe4e212aadf44d74c480b13634f2188c498d2dac0d2aea0e1180d279b21f35e15d1368986deff6ccf089608cebe704d78910a5ac478f442bac79a2bd6851c3ecdc5ca364b02281e44047b10ebb59878b08821427a65c1cf9b8e001fffe98b040f19ee9310d53328a50359bb0f7d497a9d548dda248bd047fcab1be8fce58a936c90e7e88fbb4f434459e47bba1e3e6347560407f5ed9cfc36915e003428040b249bec7f5ae5b5ab345a2a0e1d50e798e730a7872eee6e488c42e9241b526a3cce7a59d84fa6dac636bebc61a3ba425e4e68d8a8c23a6e0dca86b118945e37c49905802cb0aa4f1ca5c38a1610ef9c199ff94604c793e7fe4889e8b83f13b700d08f687433e48f2fd3609a858b7c8b096dfd3d9bac653e50f5da61013f3018303d62a4e470366e71c245b2951a42339238e141abc1c3b5f0be73cefc5f67501308623dc1308d83aa2dda762dac0cb50054344eeb36061fb3664bead35e8a193e86ecf62fdd6e9134eafc700da10edf7d8f1e2ae468d357a0a507a73d890efc81b93963ea8db641f680f8dfe63e25013c7b3a38ea171740a086a8d0ff392aca79175c20b826b331d484b72fc90ae9df044fe714177df48467aefb3be47baf99d6df926ea4629887d52cc27ad31a0146645471aab2da813168bac09a1d2aab234d1ea6dfedbee0aa6fa3ca15677d9b678ec559baeabbe38e37ff24b89f34d883f4b7b6fd8a87e39b89e6212caf331e70953f780f762c399583437c95ca571310ee7138615bbec210f0d7710304244b3cd920a74e537eca85d4d34640e1da77c0b57614de382d18249f4c445f1181fe9c2122310deb0f0b2d0391976e16aca4c1d3e3137d6ae88442d01e5422f2a164dec9be2a7bbc763b250740d98487c4613e5f16da09b9d8bedded209bde1de9d43c6edcc2e9f85be3e1683cc4c64188e2a4642f248139353685c26d1eb0b291779962e2d6d3d53a1adf1b745743835e1af588495586733a916d48cb880daa017266aad39045c31e27691f79b5bb6d6bda723d9fd60e04f095bcc83668cab06c0755ab3066e684c443720939d8e8522a025ede6ba613d6b05d5379d6a78759e9803edb29b32435947919d68b1c724149216e4a10e38571c4a825e590135a19f316fee463c6d361f554fb0cb352b83b8744dc6539fdfc73e31c65458b00fd47310d08c41f861748baed1afb3f1b1770aa6ef1d69b29bd854c7c6ca5f00309de64022d07d82a6751646ced3b744f4e2fe340db245cc736275bb8f6401655852c5861e5216a5ecdbcc3d306e66f8a54266c3742de60a984093e7855584b20bca97202e7ac7885c0e60a86b247ea3e78acac0041ad604e374ba0d718e3a861ae9679d271742826ad820a5c39de7e65f80acdb7100eb4a53a26575e30fe3d53aa5469cdfd3961972db4ca151ef905b4a55398888f0ccf094041fe3d5bb33121958f5efc3b6464a088cc01ee1ec70b3f3406dc72f3537c9d2fa174029815660af4159d17eb9702bf94f22f18d933f320b29afffca3d940317e6aed25bd99801feb588a7b244e2575644f7e29267476723facb3cf2d558145ec050ae81bb885b63fcbdadcc6d98fceea04e3bfee46b434065e0e8faf48d9d2e8ce322a718f8c9f18a9f19dcaebdf16857ec63a4f069d1ed0a251e9c2eb80a8b59c286d5469a42ec4cb9bd6864a42514ca2cbdecc0669e13ba23ff607e780725793b4fd165087dd4853e61c22237f42ae7801b95d082efd4967a16f247eb107926c56725e4e6a48b1c334208f8551d93020f4e13e43d257132a1523299ba810819872a2354a8b92358b3516291f7402c53ab74c2606c01676bb17a7671e30e23d55d58920f2e52308f6668014f18ffd6688441cea2a8f5e8b6f3910d5ef85968163b86b19a36523777cec55ad10750b5f42dea88b901f7faa18f0cb92470f379b0dd010f09c234121b2344f0b305822850d0ed96328c2fffae843755d432f287a44fc07409765910900039a1b673cf1944658ccbf3381f08181c209e9ef004dce543cf0db09810f317a374bfc20ab5d2c20f118095ce1678ce6f382dddc4898f711c7094e8a75c9cc8d41617eefe288053f57f4a07b70e882694e791c319cf705cca51b371a2cc370f935d33bce6da6a1ab2ffe807acdae95a424f06445012b52ea7a7523aba04a7d35e7900ed4b087a1af6b2c68746bef8cf21cd1136277b85cebe87329a83a8561980e7c1a3e2a7c380c811e7c6246cff78f5269f55a2ded67265680fb5e5400835929b49a651d5c9731be456bb5feda4929b57ce72e4d7ce956fff1eb47b80b1207b18130b93c1f74ce4cf5020e70e3fba597f80432a2741cd223ddf81b0219b6ec0f4c76744d52ada2a3798ad469f3c59f1a9a1b1861fa6762e2eb993fdbdc6c82c7525f89c6ddcc7ea5447b14eb762073dd44dfb1a8262c9724dcb26593e95ec742d1aa5e0904f05526cc8797c06b5a5d325b062483d77f4b208e7cbfc669efa20c66abd025c29617693061db0920f28c4d0448a69e649718f7515c9077a6c18b115794e7a931737e214b5a6a106f70021162f425c9810ff1f759109abf450639224e84c642ea38df3595a45cc5086e1576c91d5a022f90f22ed1e3c3074a648d7985147f13981e5bcd06fcbbcdf15b8ce574e0ffd5f0618466c672be487da6b6ff08cdd3135d17f50fd78547657e3e5e8bd819a465020d750018174efe37583d2276f0f21140fa1188619239e51e74c36e6851cc35cfb5d73f7d30b3cc80df11e8cccaf361751e991bf03b9e64f0c1d5e6a409bc7310d6f2612b0993e0964b59bbc1eb0dfa1bad2db7329a6966b54a4bc40da31cc78f5c4c763de0493231957aee3e314f69eb9120391558dac7df33878e98f6c65fbef0eb711bc4a64b8ec57279fba51aeed2386e741fd4973af8c57f5a3fa8a3c56c23003db6a30456283d7e15c8ddb74995d8fb6f5f3fda6b3859c54bdc11a38e79859f9bf23a8e12102633970550c31f0d2b1ffa4601bd4591dc198393fdedcfbfc4ab86737d47dac411270a6877b7f43fcced4059788a98419034efa0935545f0d3710bce0052618d8a3247a974df6205bf6a62219e5e1304296e6f78f61c981b33d1204cc765db3394f9b120300312fda7f7256822a5f22b2737333500371c4f0d398ccedd0a37e73779fd6168c179a375b75af6f3e87bd1a0810be5146754aa34770bcfb9a69d77fe729ee67c0bca84d4482954b199c286909ec0db935660a74005afe1cb339aea226d524bc2e3601ae86a4b8fc62da7bdb7fa8865bbab955832764d7957acfae9390b8a8efde92be5067850fbdd4803ecb81ac3eb0c02f0749ef0bf9a76073f8f4f74cb0a0081eea7e745064869052ad5ef162045f76fa57d807da839ee551cc90d1a31c5bc1fefc26a6f68efacb445d8c53e83656d0395192f2fae66ea3f7428569a43757e5965f0d0db0d5f3a464035bd68575aeb5e86ef2b5dfedaac28bcef4bee48a7c0e968136c50d1bee09c0cd00e3873e682816f62ff009cf0b4d5e775b2d3ca145000b6be6072379980340d21a57574fdb275dc02be0d68e2765c74a2933719fc3bb7acd6481f894c44694b15087c7cbfb38edb248c1430b1bc6c31bc9e0149387fbeab14fe04f58ffb08980cea3e8963ddfbfaa12c39a4531274c53519990f85c3c6ddb9bdded671fc8a2b3226d8e9b631e670660090ee8c1b7ee778808046735a3172bc4f84a909e8f99f8b20a638dddfe715cbecd63526ecab86b0be8e2315ffa04795967457ecb31f3cc79bc853db6f57b1b893e348097d048e6fcea3212f7939be3fd2bf729b6b9b4d03291d5440f6aa4b9f3800e3ae71a912c936e21045fabb3ac012daee51c287d862fe6e9bea068a8282e4298c5dd5d700f1d186d66d265083802e3833d22bc4c8bffaa7e5a13fdf0d4d8cb62f3bcc2d082d0d80686bad0b22bfecb6d372d9a23b3558cb21204bbb71b0391bff29eaefd7d3f9ab6c246ce90670f946ae04cc7818404670e479602162168a82f3b5633df361d60e08631efd97914eb0c6c4a3dab269be6cc1c254e706033ef55d074318aeeace4d0d05098914136e8b39db318688642d515a41f5a5e9926316b8e883301c49013692aa450bb725e5607385a4d296cd540ad7cfe8537d5bc407471e6247efa5571c79aa403ff88fd0c4871f579ada4a7fcf2b97c8902a93cc914e7b9a9278d53980effaf8dc8d352675b24059f16e887d9695f4b6dde500bf4e4c9ad42d9ab94e464f5f0233008d74dd500077669486db05246f0940938c7c7300384baff0b080131542f040481be06d70fea2cca91558cbd6d2b3518848d016bc9090b79a5db829c61b555c4f82828b3ee22345b7ba32a5aacb5d34e7b6d19d0ac09155cec81296498843fd988e3249721570b9d01d051f8e1eaed0822b9dd9e333fdd79e650abab159cc4c5ec9a5d2be567feffe728747480d616babc7a47f3a8ca3a532fe30e9864bfd7282e87644854999c1dbaf169f7e5db37b4495c2ee1e5ba3df90a170a1a7944d34c8e473c3e4903adb0da13327991b63b2a599b9a8d0ccf685c8ec10f77f694e7cad8255e91c389056ad3d459caf7669937cd6144bb273f004b95b6cf01a4da2dec2190248c272995bb7bb2b44c096be66a1da0facba20b676116d610d5dc44ea690cb29723b039b293cdda211f844ba9d350aff9db605abde98cee9e43c83f33e8b057559e813f1e5cb0b0b02a4c600c7b72e0bf3ccc687e702b2839fbac06127e74a0bea944ea69ec244856fb7757fb2ae4435f130144ba96ffa46e1439250c6641076c7a8ba27b4043bad1a8ae37a99499ed0ddeb7cc5574fbd85ef411ba2a3b461428439fd05f9d39308fc2e76f12d65dc01530912002f8094a9f5bae6af3cff7f485ad64221e6a514432ff02c95b9298fd89eb552d08ad34aec8e150a0b5b4804a92e95f7bce0724bca9c18c493baf9f176bbdd6b82e02d06cb14bc622ca5f1e298106d19966d7bd6854b12d3fc9f10ad91944754a3ebd6c1a3c8d4f2cc8d398257d09b866060b787abca334d11a78058df4392e8ceacade9673b403120314c2afe32628e4f3234c0157b8969fb4170f63c608c79a3256b8421a395911137d285022be812c00a571713333f53d52d45401d2d0e78d828d05c93733868ba43528643bf39021b8a1126de0646be2405c7118c5819e378c1ce121ea3fc8b07674d6d586596ebb3c350d1fad2ac466212c0d834798cf8e2487e3bc1d83dba2a090afc820e7c6c88f9bae35a06ddb85267349c797d672e321bd77797a3116a173d27741514bbb06dbeadc32f2b4599b0da5f07a4510e617c6324550a308aedfaa2d0c49631a8a6c54f7aec30c284815c40ca9886267c106ec449c1cf6ff622441023309e6b7b66a259a33a6afabe1c9de07eee3f5872be760d4b91c7dea23d92b283d54338393910ae5b2556aaf96ae80aafb1aa86a7feadba2470b29fb3217cf40b100350a4dc7a085fb712e4891206c59d3321bdd2e9e041f2313935fca051610473d816839878111be37988d9cfdde1ee4b93247a919ab3139c5861a675bd9ca3702ee14d9b762ed233890c116c26c8df3706eaa2fadc2502172ccc8df5b94851864426558dc859970852676132bd8abe2a695b35a8434a656dae4043c42a17eb307acba4f1d761d2362dda7f4d1ff21fba4b9c3dde04862225182dfba3046a687d49d423fb1f0941b22f0895fc07d26f9855e1345447082f3f5c9140fad1077e6c5be0359879bd0d972cbbcda537fe765f6f8dfb620b4cb99624dbefc1c302f68633c3b5c0351fd13ed3e3e84f910789dcf9c049efd5e9192e090fa57f54a8bb6a661a96372997625ed9d2093fba2de43eb694d4729c200e41035384371ace39df221a8cad89ad94fd145b0a01ec760a0cf6088b3f70d1ceaa1a5085c1ad6ae91a4a69a2c4a94983a9b6b33169b909ac54a4fb2626062bac4abac27d786db7016188e82dfd582d5bb68a9bd93c5eeefae1b8a9755193023e43a143e74dc938372dd6999a49a9fd08322d84f7a26f8dab819c4661520f3e4b08148e4a293ae20a78ed4a02c59936d5494f61ce825218a72428ae8302bf988a603f0b670c9ca58faa2705ccd5f07ce2464b9b1716ec8547ca0516bec2208fda681dde93505e8741665b9090a92f1ad52891a73a12608548f3cd9272a22a058b5f173eb8f803c3bac30f8fd7d31b119a3b4ca60a00027d1b5d977dc77f64508789b2ec3bd40594da4d219b06948960ca8ff3bbdbb178412c6048e50bce58f40e64109f72510d24d87b130cd2f3749959a10a116caa1491bea492e48ad8354d13446368650b3cf81bfb2a8a637d1437bf4f16cdf202abb081b112e04087a2e6824d75e9507092a3023c7416e12a3d01c298904370375f3b2b0b75c4b5b76abd75bdf1309447cd0e5ffcc3f399111eeda97089a9722be42bd461df015a7872975506291d15e483471605c24538fb3fff3bc63fd325089264d7b968f72f19daacd4b8256f9fb808da3c4a7e26b7685699afbd9c480a0b87afdf0f9085a54824dfb7dfe768c0112f20deb9dd803f98d37cc8c8754ff9016a5782c1e906088feef34d4488ac25a25886be8c03c60bf8147ea628ffdb4a0169e509df98f2e03312630205c82234c7520d8d6799c368936d47ff3814a5b84fc86b950b4dd007cce908dfb8034b3a81f8c44c063d75f34f604f39deaec7dd9d40de58df1d78a258afcf87b884225fa6b5ba5e12efe77cbbd005513c4453fde385067548b32c2cb635e2e2b68d96c19c54a4c33fbaf33ccb7f4eecbb0b770ab64b89e9d6239952d0928ff93de10c5151b9849886f97851e97bc10c5d941c693c478fcb95d61192142d408b58f0f4b4935d8d96ed108372c077e70b350ac0b1e931c251378224d80a4d81e1b4130fc151e4bb55b80bf35aa1916aa716b488fe0f0b046ed39d90abe74f30cc7aa816d38c1ac554f823c7e2a97c211ec7cd47251407534ded7d5a9befc03ec1593a66b3de56f9fc9276c4797df7b2a39484ac08a17e21e1a3ad27f9fb7ffa6c2c3185647fb5b0c8a21614e9be4f94e94555bc22d8682b82a9caac376e6dfec5ffe6f05c583651760252ddab743c9cb8debb0b44c8afab794936f7b32b400e30ae7e8f1bdf090751b533d9386ffd092c45ed003e42f1545c913f28773e4d9a768fa5fd253a38688cac7c5c5e9eb70261ae22266266a025ad990c7d338380ac780e2a9b4a61bfb8a8dd4ba046cd0a0cb8325a028e4f8e6655886fb66cf817fb04c8636df220e59096bcc965ba24c2971840385ae74acb2f7da5377fa19b69e8c8c13ed42d8985c7077988815b32438700eb792f698e9599a8813ebeb301cb1e57b82f7066044a8198e97fb9c8b17ba2db9d2050ed5ab3376b3f1cfe58775de5abaaa7e106e0fb005edd5b926ff0dfb80890a20a858822baa4c1983a04086be6afe55b40e6a349b2f885f48af3b1880ffaa3a55ae2bc796b41ec4b042e1684680d5920923252073580551cb8131241d84541088f2e0a3a53521923719a9bc3b8c6b07e59e32995be763e8fa5396bb145323e07838922c2469c35d984740ee89cdf158b4b899dd27fbf37bc831f32ce8a9446f6de7befbdb74c49ca570dd20cf70c9f459cdb9c19d451c2a54a38f1b4b1511ca791511c7f72cbcdcd589f6f8d071cc29f6c34ef20cdc946731acd538ee2f88be6cc8ce2f8098cf153299146669e7a954a9d431aa7c657cd5451648454b65b167f95169514152d258e34b21ccd0c0c9a2734517c467572e4c0a71cd521b1ff6892f8d46526770283ea34d5e9f3851346fd3760449dbdf2b3e461c0a790f491efa72f5bf234e05348eaeffcce498391af4f5f411c34294662d2170b267dcd981904c1cc208d19430dc1cc26eb94c3fe3ccc187a87994d1c66b649e4f0cdac7a02fbabccbcc30aecffc198315411cc6cf630b34d02c7cc3702664f7d2de0bf574e1a31e9eb48d881eec327fdf7a00c8dcb27bd2d87745ffa67950a0b92f7d9c162c4f4b1d22bb7c282ea4b112bddca5fba159e66955eb9100b2a1b12d55111d88e50b7f294236feb569e62e4a85b79ca0aff9d66cd84752b4fe1f9f034856644de5f1565c8fbab8084bcbf4a0a02de5f4533df5f45e5df5f5553bdbfaa8acdfbab6eddca017813de5f95a55b1900af43d4ad5cc29b372dddca3fdecca2c21de0fd555b5eefaf2ac2efafe212e4fd55395517f0fd55462a2f61ac5bb9f5ae9f6e651f4f826c842704981920ca0940059002843643055513abd8f7ff5bb772ce8bf0fe9fa55b7900dfe3fd9f08e7fd5f0b8ff77f5cb7f27dffdfd2ad6c7aff2fea568679ffe7d2ad8ce3fd3fd7ad9ce375bcff77e95696f99af77fa36ee5984fbdff7ba1797f33d6ad2c800fe1fdcd9f6ee5d5b3dedf94752bdf3c08ef6f3ee9563e7f478f7d39e0fdcd99ca345bf8cf1c27f0a23913814f993a4c25df03fecd47f2ff038909a7125045841c72e60fc9cc9f79c8ab9098f0a953c945f22335430111c9dbb4f02c9c3e4159c7eb9c4ac03cf3259420e4ccaa7f04d894702ab9978512de274875669d6fc89911f0259c4a4013ce5c0288c4049d572151a9ce6cbe0d1295cdfb0421e0cc5390bc092c9480e47fb050c28ff709d239b3ea859867b67904fc5380851990859438bec9c2f77f2a2159307f0a0b9fa2c00c0b2f52c0049df7091acf6c3e91efccff431e34c11d02e4d4bb4e25e0ceccfb041d60e77566f0bf9df1d3b173809fd921c06be6470980671effdbf970026091d32728bb9e8453099875fc08237c0f060943127e8453c92df23e41df995d1f9e4abe2fc43fc2a9043cc09947007782b8fedbf9be338b1fee7ce1fb04e1334fd9f9204546d879029c4aee0804f81e871fe4410988249cd9f5af223ac02224a4668a804546f07d825c679e52e44990808e229f92808b84f7099a39f3f80710cf0cfeeb5126cac8e9139451c83c5e8453096844c7fb0419e08433a36644118cf038730aafc3088f1374fc0c0450679e79d1c8db08a08e9c3e41d900b907284201ce2c3e0a88b5229c5984c7e9f13e41e299817c283ccea9044ce1cc38a091020079d188289e39f5d6c869834f90e81384c299a718f9021cc131f23c8ee0f0789f20206716bf00f6813c0a0206f8138e88001e39e1c8cc99538f3a32837a9f20039c79ca913f0102221cf91e1010a1c7fb04e938f3cc1be0cca83fe16b92f0ec389580200a21d4a47874a41210c2a9e4f2a880828e53c987cface3533c4f632af9f09407d4ac70fa04e51432eb413895802180508383862604d6994378104e25770556eacc305f021e07cf8e57e15402f2e080f9144f2a45c393a2799fa0049c790acf83b0c20e9ec7b102083bde2708e6cca987a1791c5f732af9f09424a614403c658510c01550b86f5a41c7994d5f732a21f169834f908e9af7094ae1cc53567814928470e629b17fadf0ac53c9c536f80485c07a9fa07b661d7f4d67ae21324408020ef0c2410c70420180986006e0754c007c09e6cdff30cf77992d124c1ff5e5801fc1bc790298e78b60e6f43007d02f073c8e79f33cccf3433005c032573dfe72c0e9131480d3b4f5ca01709a587ae50f8279734e49f23bccf39c12fb5792d3bc39cbdf3473fc9b32af3263dec63cbd0e33c7d798329f32639ec63cfd8c99e351a6cc8b66cc5bf3f4a399e334817ae50f9a32a729a557fe9f19739ab4d36952e9953f0b66914762eefc0a6691e73177fe8859e4346b3ba729e42cff9229621ca687051329bc6018f39b22968512d8643a1426b732f0353d1d9e30e201a6650ad4864ba739eb95ff204d18ec8f441a8bff9da1991f7f9fc9f07bfc7daef93efc20fec13003ee3e2fc11d06df474eb7421b9ae0d3f203bbfbceeecd59b74c2077edbcbf49735791f7376bee32f2fea690bb8ebcbf69cbe60dfbc330c5474c1a9a1193a6884933db3169645cdc4c235311f5cabf01a66ae62c7f06982a2067f92fc054d19ce5af0053252445b7e55af3abc1cdaa197612a64342349c5534ecaad9006296a4d04968a3753388ebdf24d8bedd99ddddbd3731edee52773748bd3a8e38dc553f08d626797ad5e009762008762058bbdad5ae56b05a13f47610fcceb305d0a38d2d3808daf7b301e07f592e4882eb7567925e9d3b9f15974559fd2294d04d7174b88f332d6a3368985e3163868730bd528616bcea16e87d1a975e29030bb6dd42afba855ef55be97eb8a00b9616edb4e0aefaea6e411738ffc8ab0690d83b4133bfe0df5bc11e160cd67f8162c11d78839b4118090523bdc98fe910135670bf87e9101334dc67beb88a980e3961c26404eab4b859a489455017118dead4dc13454e884974594383fb38868ab348c3eedfa51191c859fe37ecfd41da9a1e1ea9c98a4b87ba88e12cceba95c52da36c76d4ad3cc244a36e65f1688cd22d58b7e8101755b0ffe8d3e217b1a85b74880820ec2f7269577d8d30714bb7baf71974c0dd0942b91d6e22256edc67071412e1d92c0ad06d0626858c2e22ad8a902d0b4da48935918a586504f28c18e94dee8cb8b8ddd756e784aefc73d7a47b82fdadd013f69a680fa738fe79c494c430d437725c8ae3368ae35fcd4e46714a1dada37554ba5a879375559e74b30e4b77eb88ba2d9d503703ea562e75513a2954a7df28053730ecdd8b823646365eb8601cd85f05a4a2d22e5491cd1731b4cc08a97e54320b13630d9c5533a03182c059254505c3feb6f68c50b7f20cced6ad0cce5899c152aa70aa6d6163e42efa1ae2ed449cc96e3f4e76e6992223dd6b06c7459ec11561df6144715c9c9d6aa72a27a153d1a94bbb646c272b5da294804e594e4427dc89cbc956022ad1ba95c559494a89ca0e20aa53dfc519d5e9f7103bca0b5411c5f1534de6aeef297d2b24ceb0dbe49ce55fcb22ddcbb34ee03c83b391511cdc0cce596e636473067585ef6f6344752af859d5e4fbac6282bdcf366c60ff19217785a78d91b3fc4114eab3319a11f26c8c6684b238cb01ce3b8690612f01617f7aee00a2385bae794282e2f8cfe0b07faa9bc175abc3fe335da860ff99a26ec9607f9a58b79eb4ab03f29fe1d22d7a258d1b769b192f47d8bda8cb159c6960d8cb2e4538d3fc609fc961ffce561ba3da51b7f209091b2fddaa2cc06e04ce365f1660310a5b9c6ad8ff8404d5b9817993de4803b7461a4ef12dc57c03ce7a653b0ab6f5fb473429ae74ac4be0d1f481c70e4d7a458d30302d09803bd62b1047ad20683299683099faa79f604b021e3f3234c758af6c772199f566d62c95c859f649b36ee995adb82737f7d197549f35cb9534bae01bc5b1dfe4b651e77ab5806bb13f89a90d871bd4182247754a6fbf7feed730a8ab028122593ee969ee9957b79aa338350c4a3af3cb00db66229eb9b20154cf006770fb69e7b56bad5d9d7ae79d77de75d5ebbe69fffcdcdcb95be7faedcd82200aceb20f82f7f6bf5afd98627a232fbdb28f82bbea91b3ecd77e340d5b7acb3577cbb9e56e8fb3dd59bb8c2db835d72d297d42ec5fa6b36691d22b1c6ea59d368dfba9517320786fcdb92f291b47199ee7d3abba02d1466bf56a9dcf0fa61dac57d607975628c6f2884b3f773022b09771e9d7bca46b858da2ecf6f7090e81614f88e278252fbdf228156d25a35e79a5a35e791fa479f8708944cef2be8a44eea2215a7d77e6475591c8d5d528cb7b94941be509d6a1cb8186087b1f0373178d2dc7c4c092c9cd34361a2ced2a19659a2cd87bef881ff07dfa04f0bdbfb06ec5c06aa6ec77d85ad1864727b24daef717467546ec3d4d91eb8558322ebdc28508978cba65dffbd251b72af6bee4a55bd5fbfc037b9f738ec0de671c5dcc59de5b77816fdf444de8a8d41ededb07a94ecc0db6a20dd7ba98bbba9ab3a85413686cb587f728d4bdb9bdae86bda7b15513bad853aaf3d1d8868c40344531ec3d68ca7eb0f7344533ecbdf75d2ca609f6be868aa1dd0e284607ecbded6231343bb86ebd52eb02612ffad5fdad696b14c733484406c7c0288e949b4522ec7dbe30ec61ef4522aa1383bdb74960fbd926a192519dfa9e149c496c698ab0f73445345cda05bef75f7db05612e9f0c3ca303ccfeb9ede649a1aaeeff85b81686b211ff86e1b8f4e76a6c51fbe3fb171766354405ba5a28e018a914275bab403baaa3140b896ba509cfaa51dd016a5395c2aea56898cce750b2c19957245dc7c67b959b7c06e7d343cb83149784310e1fa370515e80e4175c4af7fa3d09678055d41a12d91a857f5633a356e4657722e2852021bd175a6876b3964c430d43788c46018ea1b43643aec47385fa23b8479ef8ce2d49b82caba82b66e1491a85b170aa5f5a6c6152317e49428c2b5b2f23582268c9b455cbf11be88a33add33c1f54f372462a8f8cea84efddc31c9de1048e0f08ca1e2ec0d81eb77015d0dd7c666e8e9cedc7dfd7e1af07385755f777ad503cb75865eb5574da825f882f8d54a85f54a347bf00c675cef51e855e7f1bd91c4a23985fc9e7691df3f43b76cfd69565bb9dfe3192aacc670f73b3b7062a0869b97d41ef5eb9357d8b8c286143c365993f4aa056ccf16407ce617c8cf6c210909eef799128940af5a063cd6af0fbe40e2ef6cc18bab42f8de995f00323ad9959e0bf52d083e117ff004f281ba04775f8574ffa457668dd22b201910b7cce1e61f3ffa4b2617656f4d6c1215782c5910db47c0009ecc60044070a922c3e2659308810a377239a04931dbe2556b46264ca9097604d86bffb0461a389c83a94d46c34d6838044c876251b07d7a93abf7bde77d0f82f7a250be72f0b39d9db9761688daa3bea556466bf5afefa590ea990a400103ee229d07eeef6e70bff79daeb35a0337d31ca6380c64b0669a4b42bf69adeea09dd1d6ed15bd6137813e2723bdc96e841dd411dfa6b2dca6d61f603faa2cd0ac63d3d3e2b14917cdc6a327d42bb7829d8a0903d3d676d32a4deb551bb5b64680fd69ba2937bbcd76732277e17857ccfb7b51b7b878ce853c4abbe8cb7f3409b144c01c1ff52443774f0f9a3018e045d3c3e069cae94d667dc59897b2c0c7618294053e4cad270c33e05a4f1fa429752c26759653f11aad5725a6b61bd8c06e7aecc79256343b3cc68004e64d4fc600be0cb22a045df9c7d096cfee89ea8c5f69a7c77ae56f327b70bce949f301d574d90fb7fe8fac57ee58288ebf0b517a7f9ff5fbe330837860def4b41422d623cff5a81e75eb4bb7c41864b8b87ef8f58b63f19b67e95514b4877f35c7ae2b85d42fbd72583dead5eb9abebf1e99dedf6bdd3a39269d3174a5997d8a98ff74ab7e9b20f698bbc097bfcbec8fb66d3b4ee155e7141c6f4d1083a591a07e1c676a07c7e3387bea8b06d3c338a6258fe961fe7e53e926d455893a46754aef60c9ec1891bbba0965f9bb19d887c0de50b0b713ec26c5e50c6ec55d575b6bb5b576b72debd9547eeeca1d7410bcbf02cfbccac939385ad64f7ae53f83bb9ae8c72de7c72ae76347df3fbd72b7d91c0b8eb36a6996bf1355c782c3f59bdb88f0a706ce6eaba1ac5aab8f0be576cc5d57063aabbec93c750b48afaa1b91da4668a437200882407a453f7fdff799a3936eedf7f6ab3dc1cf49b2ef86878f1a2fea3c6b3bdb759d0d8188b6f3c20acef07de0f9bdfd4eaf938286b5d652ef8430dda9b5d6026181d947f7e985fb35d4755d342d6581240665c0deafc01ffb52153efc819f9ff6878f5e754e941c106c7ab1b760d7c8e9ac6799107fe86823cbf83933e881417443d7755d37a44689a5061eb0f480038b0a9c98702ed7e82200985e594308ebc0f4ca1a42f8000a212bdda25008cdb0bfc7a53da36e51289af8c19e974f865345be0f3f253ef862ca9e48be25f6c5fae3d9d3b364865b120c90148742ee96a3386b7af1edc9d3533ac29eb2a199b267aa48f8e223a93f9e348c5fff4c591ab277f432fd0f52fc9e209ef24d670fca59ce437e79f6acc81f28b0b40257d843547d6a91883f9e3404f1947e7c1a4c2f3e92f1cb2f4f1a4a3f3e7de51f0f20bf2c99296b3253f6a4f74593f430bfe4d5550847ec74f654da4c881683b9a4eecf7516439379d42f79e578fa227dae42305f8f9ce5ff3d413ce39bbe27487ce7293dccd953794c5f3a7baae93c7b723df55671e24dc48db51e617f92d966aafb2f55e4fbfe547722f9be5348c0222da878510308067b911ee68378ee871f864f7a9ef0493187397b3a76366d167eee58d8339ac77247b15c1fa1cc1ca68c196352677962ae8fc6a7aff1b3c74edfdf13c413fefd9e201e1c1f7e8f7fcc002f98279d3d413ca43f9d3da727f1dc279d3da7b32faea785ce1bea0ba66fa6a72fd3e716329da9ee97bcbca35be9e9ab74a6ba73c7873acb2b7296ff9297971b87fd63985cfa4a21a9aff0eb2b0ce2217de94b674f50aa48e94dcf537ad3d91364bf873aab644f9ed2dfb3c767ee424e2b72d1ccd197f8d967e2494310cff8e2d357761a0de399e2f9f2c5338584fcf2c9b32728b523be11fa124f24de11106398c0043718ece53db17e912f82f1cb33c513be985d08fbd760b9f4857396bb5bd161892aaae00283bde88b3c6910c178c24aa3201cb8e0053218ec157ef8d971d8fff4c42d808f0dd32970f61caef9e086294c89b08d617fd0f423d38f2e7d89af8ab31f7d329825b64f68dc8ebabcb6edd62b65854a407cea16f5eeebda76e419ee7965032cee4edbb786fb75358c3a3315e53226882975755d77f2707c30a029bc62692491654992c69278431308f3e1f04e5d8c95f11c3d43d219140d09ec157d1fb9b8d759efeef6bc73ebdecdc5d82d7274b3d28c4eba89c239bc320570fc3eb3a3acd203b84c01044937718ce2c52339924878248d25d24d128f7834916e8a78c4417e267db919e211c7781a63c61c638e1135ce8c3533291a92870037a542bc07f7d7efdab178274c44182b64b53d6eb8dfdddd99a0b9bbbbdb19dc48e0fe8a806eed509d8a7fd0d91141324023056b0c61c4cb91c0de822e3cecee5e832b0d777b3780e1f77d679d41ccb3e5402a9e7432c87d5efcd827709e11193f5eeb8cd8c0dff79d50354bef0df8ab4fc8fc0c20f0477b856db38bf2724f68187d3da2e1755e1a5a8881d1c86d51051a339c3f478c22dc34c7c78f9cee078a2507b7cdf951695e37f9fd0796fe9874c575f0ddacf85ad0adbb5b775b12c51f45b1646d78c3ff36408db00be17ff75e4a73a02e98d3a3b49f544a603a69b3b24be98174c5754cff065ebcb3b5fb4692ac2591efc31fa3f4aa814eb7eed6ad7b674b77bcd7cca4b5b5bb4f30d4eeac513a2925917fcaab74ebd42b777721775bbfdfba95a5dfdd5f2debd9ad63fdd34ffa3b4a7fd9673411d5a958a47ddfb2ccd0dca439ab49575c0fc76071f619f6a7659d59fb6ee6d19b866929a42b7d9d8d7fadb8b96f7deb565e12962a94ce54c92a71af694b2625edbb1837835fb67fbf4893e3a6f59e64d230483651be586c21fea1e9f9d995441ae7509cfeaece6a942eb83fdc5f6f554bbb4c597f95d22d8a05072db8ab08e1f61a96181a38571b6e124b1312e05cb3e0eeac3b50b7728ed3ba959b08cfba45b1c4b8e07e8fd2ad6ac31138bb14dc41383b15dcdfe5f8f826ea16bd628610ee6f2dddaa3bac56f6cdd50ed745ece7eabbc1cd9fbaf804c57d5c650ace9586bba657fdde2fc6cd282fb2211ae94d1e800dbb91234fff05fc7da60b2f9cb048b2715d101ff5a3090affec67cf9c5f78e1c75ac3174e2e7c8f7a5a0e417daf9cc877a23e34f309873f36d98343d1ac988e1fea5cf5ea3f3672b8fb2e851189c9f32c982be4f0f8a81b1e1fd5060e534cf18f1fa8cfe9d50f14dc91888f21e0aff0b534529fe76b6984be7c76bec87747dc3a1a317b8c7c913f62f61cf99d6f1d9f92c1b18e332fc1366f73d652888eb3ff83b48e244f55339b368ef0f8363f7a576570c557cd5440bd127ff4a48c1e59cbb1b4829b5533aaa303e340c05d0f78aac2d2ad940aa857ae9272ea02f670b36a769e724e5c08bc2af5e3dbd8bcff29e7ae9efa82c099129fbe20f02204ccfb38ab664ab88171cc9adbb579b114629a4a052cc136a659b12d5518dfe64ca930becddb9c2edcd393f2148f95b4b1b1b1b9cbc765412d7ae5e8a8ce607f15c5b921644305fbd7530e8477103e9704c93fe06b894401ff8013d3cc7ae545cc144f91d92f79ed98299e9d7fc03fe0eca101fa2534326775485c1a769e85a7a1c823a9e590c66211d75f343da05ef98e495f45524878789ebe583053485658e1e96bec91969e945e8de3a9aa4d6e4daf50417c6cd203ea16bdb2031fecef49e9161d7fecba1c7fc7a4afb1b6946e8da7bf07d42d1def3fda3c2d85a8a2e83053e3573c7e1233359e34b217cd9366f97fb8abb23955b35e753e3775dacfaa99a53829a1268b98f4b5933a73cd8be73f2a09189ec1144b12328ca4bf8701bfc2d9c3c2ef7c2d91d4ef69c0f39c3d481e1681a701c9d7df316111781a5828425f11f8209d4259a49f85e731ebaf603e9255af3c50b1f8a449f13561dee633a82325a69e762b358ea9d409f66afc5aa6be5ba9332fc137b41b5ab752ef7f43a54ff0a757b0bfea7710fdab66eeda09c3302c8b742fd50c85ea685e0a11532991c4a9077b957a5a8a9ffad44eca9c528486c747fd581b856a638647f264a375341a9989864ab7f28c91c94423eb564733a3a9d108d9b0f8d364a1894203649a31ea5656cd668eba95bbdb8c97992f5eb900ab9aedb85db3c79ba6084fa9e99a3025dcad99aef9a34716316f68ce727aa542c1fe1d0d04efed68453a279868e6b348e4a76a36a392d9d8ca12ee948bf1e956beb553eed4e56414138b91c5cc62a2c448f1723a12c75bbb42ddca25dcad72ad4481fd71bc8d8dea88bfe3696454674ce9b0116b25dcad459145afe6ae93cd59fe62cd1477549f6f6d0711c5f99dd15401519cf0dde6d471a6ce0cd2c8529f73601e17c43c9e52d70c8fa791d138a13ae3fbcf18a5ce9cc3e6cc57c78c512a07ce25dcc9e6ae120e756d70ec0859c023c23662a67c4cc4264622ac131d4c3d301123cba27402060e9915af872eac932ba2cc0c981ea6383989f2f5c0c3c98a5076a5e4440b0e1918600f44e0a8d5dd6bedee76977db9b741cf2875b2eeeef6fab3fa3b24eba7419a09196ecff3aa15c25d8c07166ec1fbff51a81b005a93013d5101c0b9abddae06329cbb9ae9e1b149ea1685bad71a79de574a47c7fe6d3f9b70776f8d1c04fb658ddcd5c99cd50f82f71ae17e2fd6addc71e96cddca5ecc83752b77b5eea85bd983793f5dadbfabd29e4f7f97ebfaaae1ee72b8e5b6f313847231ad955ad2141089bfc0b34704af2f64612772d704d7ef64f54dd40cae3213ae9e6c06365c29143bd0308542872d459842f173c35646756aae67387070b395b50facc86030188cc9eb7e57eb84dc45a2810da490d9dcd536d8cd5df5e55668b10116d8ab7e87f3169c85b345ee12bdf8608d2c3977552318ec5541d17adeb9e668ee598d72991a155518ae63ed80aa0cd73377b43ac3355b19b64245f5bb9ccc5d3044417081bdeadb9991bb6acc13b2409d91b5b98bbe4ca04209dbcb3b7317ebcedcc950385b5937f33377b03eb33df26c9d96d1a365cd76d6764ec086c6d8f205183b58f1b256b0fddb05db2b2c304a62688717e011d3a11d6a385fdc658cf4867e4daf6c7033bda190a45b8d1d0505ec243933dd42967e6e8ababa9306c7096efe01c4ffc7d00e40980efd64c104c074e8678651a03a8efd53a03afdb4cb5640b7285eb92b4768760414422c61032f2f7f1e0ff8203da5eb1980d14b0403307a51ca5361dd3900a3572ba0578e42af604e701f531a7c21e556db5619e94df66a5aaca400e883c11111407c08a2efe8e86886198efe6835831fdd4e7402f404c8a3c56a2e4bad4e9034234a9104eeb2edcdf05892a41d404cba40d5843e4db4877ff652d061149eac5bd9f3682592dca27eada79fe052f76aa5da486ff2076483eeae95ec55f7f7703d9c1f531cdcdcb1ff665f141c700e9d78efdf32d0339d7a557bd530a0cec2eb6dd7a2b697dc926c576ed1795fc8a323100aef23e98aacb1dddc7810f9a0404a461fa84524222a6d017a7d0f95e0faeed525b8e6bf0131fd9b1b9c1fd7dc1348a250ffa31471fcba25c66e793d5bd17203353886669db90b8572103c2b10ea51a87bbb4ce13db2ecc62d4a7bf3b27b227129cab688e290645002dd153ea57d4da62df8298e094c303f6abe59ae9eb9c4cf2f82e09d959ab8f573c390f447138ca9bc2512399a4453089a3eaf33599377b500c96539aee86c40da6bc5bde28a2b4c2d6c706da45d31b5433b68712eb8dc70cee051ea2284db00ce1040a90bd6475e37cc91a60243b263c28604436624472e6296c8a8d112d488d213c92682651bd79d2c51506dc9895b9f9a485dc922aa0d7bfd6e2d6cf96ec9914c286c11eb15dd69efa626905981b0ff0cee2a4259fe58607f0f03fb9b3853222f7728ce96a35ee51cec0dc3dd095a9344a386e9df2eaed3efa4b8fed405bedc56db778391960ba00da027dd1961c879090ecf9c2db7737ad54f63b788c1e256fe3003c1392720393e8672f0d1416e7cf1ff7b5bbf2008c0e1be90d36fcb06e425b83ef8b65c40f8f53be53dc51fb880f74bf0dfac787ce1f8b414c7f0ad18be0d4fef2bf63e13c430b870da25d8cf4ecbd83f9686d41e72b27909267b5557b9c37488ed55cdc9b1b576b5ae9c557fe5ac223f7e74de29ff283fb29645bc7bff20ddbdbf100f1019714764c47e82432ac5a95f777c6cb83680cea23f9672fdca211587e59051a4b5497909b6562cfdc792903a9646a8b34a2215e391a4b549fe20c5a1751449f68774dd69cf940aa30c4b6c056932b467fd65682f38044c879adc30cd2fbc9073bae03de89d2ed8eea44464e86cb770b8fe2fe4600be29afbfb5fcb5013211d7cd9814f26bd14e2b68b31e2062cb067d70f5c20a542adbf04e3ba45774339ec1eb551d7dadd3ef34426e9c0cd555654655556651d7014d84217750ee5b07b041a758eba2ef56acdd342c4c52f09ba77d5bd562e9ff935a0b3ec0d076ea6b6ae77d5f66dfda1aedbac9a8313cdbc7ef4a4f6f44eafb35ee73ef3747ff4aac660dba9b5a8d20a82d4eb346aa55dfdc11eb5d9aeabb6eb6a0ef6bf9a5e9da85e81191c2b79921eb8f9c70f77d1936c16fd5a2991c5a2fb917e18ca6067f466dd82e099bdca04f85ead526b95093b4340909cdea9e7ca598e020c442db853234a77ba15d1dfaa10adb5ae9b61eb5d0b46f073aa0961f6279662c9404e9d3fa5ef11e0fb1caf0470f06b201bb89912d976baadcb36e903db4aa90f02b8796b56fce94dee225cbbefbb1f4cbf6ec1f565f8b0fd6c71ae44f4f44a15446ce9772511efbfb6247df2a714423f9346a940bdaa4ff0572937d71bae5f6f55c82b5869954aad75eb64ab8bbe9c967ede36512d84187766a43ddab794077c52d396b53e357171290d685c9a62a13a5487521ab8800418e5525877073df0039d65ddfef7cadddd3bb7d6bd3d140b6e7deaeef76b438b5b9f82a4940a00c0fe156707603f6d8357f4e311ac9fabf3ba6dd7edd6adc5eddddd6d564cbbc16ef0037b90c4182a09413054f2815e57b2b6ad974ad75d2165d9a7260ee0fe6a4b153eec5609eef70f45f0f32c15af32e37261301dbae1864ac62dad01bba62f6cb821a643366cd1565c11d3211baec0e15a4c876ca841c5723f4c876cb81dc006db90cf15387f8e1a15bc0fe6d823421821522551229f1a1a1c9570a3f4b24f9ab61fd401ee1a6242fa9e51ab90c1b906fb0eb0bff507af14ec8f1a410fb0bff8678c0b2f72a012458a279ca812349638ec00f4aab57e107751296c5dc860affa3b5e3f49b76a85c15e7985999c00f7dbeec1556385fd41700914990e6954c1031b3479436805a70f0adcef75773716475ccc60073f08caa186573781bb6170777777570ae94c9e720d169c6f70e681fdc5c0fed6aff8e0891ffc80fd076360bff2c613d887603660cfc1d65d089801151ea8a0600747bc9c09ecfffeab6eb17cc0d17d3ddd13e35613c4117c9182fb6d7fffd336dcd0a10a0f9610a20624961082c2e42efbaad88d3740a0453027f8dcb0f1c086901b35e8810d9c1b5edcd0c6cc0d307e8e8cdc40e3a70d58f8a4dde062cbecd6607a850b1f5c8182f3b709baa8f5d005140d45175b84ee09d32b5d78711714c5dc766130bd5264026c627ac50ba11c467a9363567099d056925e7910a02beff3e783bdf778405d15463d1f7869602f7b6460ef3d21aaa3c3bd9bbb4aefbd47e42ed27befe1dc55bef79ef79e171402d9132249b7bc195d79ef7942fe79ee5df39ea369ab09924822ec9de8cb9aa433e787b3c08a49a1539325d39e39267d914cfa02cdd20dc0ab347deaeb06f0e573c393a808de937504efc126c17b4fc85da76679efddb0e7adc2b8f4653fe6cddc95c48bb90b8518f684cc199ce5bd584531b40274c2666044ece2ec095daf46359cbd22710646c8400c2bd08dd6ad4c8fa274abb2a00ace24cede0c7b2dc0d9a39282ed6a542707f6bec2a88e8f07a33a157b3f83f749bc072f4871d87b1414d0aef1bd1f290ecaf2be345394e53d68eea0389e67cd1dafd1f4b93018ac88d70dab97cf0df7255211bc07eb085ff56996577d7ae57ddfbb99bda0ebffb937a338de07698fcaf56e1e96f1bf3f6114b27933aa439de5e1f7d913c2dea7c2107c4fc8b3756b067befe5bcb48b5251e4bd87a55bf44a1b32ec554f0bf69e66af087bef59c161ef69f6ba60cfbb61ef43f0f366ddf2b2577dba5595588097b0eb9fc198a2ae49438cb6ead5be26ea567173895e12dc130dd4f3ecb57ea24a54a7bead5b30d21b6b76415c5b8231bdf8a129a26a447334fd282434b3587a93f8a54e344be6354f585cd4771f665a149abff2b9a4173f3f26c727387c981f2b69329d590687f9b1144ab9a5a7bd2a9da4e9cc38500d38e2522cfec5a73f7d97297ca7ef5ba314323ec8e4bb2586953a291ce2383c53e1539c1a5271f88d2b0ed2a4399aa119c441109b4ca6bf54876293e94793898a724d5df7a6f02dd5298584e358325d08dff463085382299d29154a2f3e91d2892387ff818a4b7f5f2c7d787bd53daa57ddf863486b755269de1d93a7572fc5fdb65c7ad3dd0a6a310356c60efd5e4e67cae1bad07dfdfc02d99dd905fffaf574e1fbd0a4639319ec64f84cd299c117c8217d86b9d6da237bb8fb1828c5c921ee406fa4340ced0dca2f954ae43f0afdab20eea2affe1d9efe08b4abc678186120fd25929442db6a4205414c92987cf249d2a44e2e09924ffa205d9a53ee7b66aa7cef29ae66aa3c8754ea79a4b32cbfe97dc1b5b5548174bf7cd14c91be62d28fa4f3be4ecdeaff707775e65b7ffcfcd813df3c9928ead549b70ce2521cd3ab3dba2e9343ec9ba3b537b8987a4fcbcec3b6b3b5fef97961547a19bbd5185370caf7a76ee6acdac9a85cfb2ef09d55bfc3b55222da34debd25dbf5bdbf6776318ae30f0a259144267157fdc9486ff2ad614a032f68604a032f64e054f721f670c595ba50aecf264c4b2bb83f50178a5659b778e0fefa84fcac23467574e066f5997382ea594d80fb81f4aaed0aacb5160bee1fad8024bd8a40af4837ee0f25f1039ca48508f4aad69f5e59b901ab7ea31be66a60614e05a322f41371963c984ed29973c860c26aca18796912648ec05326b7c3cd30b81814e8e4a58d27799642a6c4fcb9634729c47f0779f10d79530a21ffc654530363eb158c09870117684b460b181a6944a24157fde451392b9b286b4457986eb79a1a58afbc2240717c98219bc94cc99ec8e46068a41f41203ddacd35b01e6ec2e8d0f129d327f5af7a9b30e7625763a68c523992992aa23829548502e71414dc9f4ddcff995cc0c09b32665011fa55a60c1974847e1b53260c4a423fcacc117316cc593232b90090a953264745f80973e4298ea78ed386268cdbe5303d9ab3eac904408daaf4a6dcb31ccff276438e6300483769400fcd29a713f4bcce8a625892652904664b075384233d15782df2ab270c1f1e71ccccfcc9f439bdcdebf81a199c8c163530130e095a392b85c8396eb531cb1a5011fa759825157484fe1ab38c82925012a5cc12872b8bbcc8f73a9de58d8ad04ff3862bcc39ab494663509d7e9930a809a65bed4175c6cf397e70e7f0c12df305e7284ebf8c165d6470dd4a854157fdb71a10c5e9af81b92b150565a5924082865343d06ea5a0d0951051b01535302c8a707f5803b3e19213b319532667ca18f5cacb91b372c064722a6ccfd42c05bbb9bc81f5c7fa612e0aaeee04d72a228c0aaeefa74b711f707dd3994d52e07e1ad351361286f4117c904082b71cebf4b0c1dfe9e69498a70923247354041820120dda8221823c2a676513261c79e426f2a864ba996ee447049009673203e60a98263e195ccbf5e347ea8dd41ba937489174205c7f1c8124a7a0500f9a31d4277d07eb5669ab81b6ca21130e86e6ac0e0aea828102c606d4ab2b680b8608baeac7f13947939f4bdf853877c9e040940923530a194f185c6cfc405bb76088ba1ca22d982be8ca84735798a3b98b3c7228a8cb54036a7397e9e62ca06e95b55ec110415b650b72dc1b9a70259cc9a312ce30b412164f181a0c0ee7ae726692c199a9544e0610c720c385b9820b0c51b7525e843977a59ea0acfe28707fce0a5cf846ca4671fa4b668a4671fa4b3335a338328ad34f1eb92b550465d500c87473570a0a65b520f5a4ac752be584aefa3b2584432a09dc7f04c339874c660c9930688f7e193347cc94e9d2abfe1853a69cb94be60856ce707f09e5108beb2993d3e1da68e16243d4adf2a3f8cf13f7f19f2fee836bae8175ad81d55c03cb365b6a70ad81e1fe1a588d4f4dac5b5d8c59e3d3ac7e9d528877d6c04ca831a11452e3635403238dac672dd5a11497273802e966e8c3b42484a08749b3529cfa3126ca59f547d386e694d3499b659a7f3dd4dfca1b004a216516104a2135b0f25603ab81c560700260e1e0f0c82171a510982dbdeaef510a296f14a73fa5c4cd3238dc2f73d4ad5cde70e7bac818c978e9567ec16bb8bc511d4a758c62689e3b6e0a1042575aa392954b605a0910e92975f9dc26c1fb1bfe459b84af59dff8f57d742bfc4a96e514d28b6696c192ced0cc3280d676d676967e24e9f3beef3b53e053ec6729043c7f58f0cce0e360357eef991feab10743077098c2c5200c178367ee000e4f17be074f7a7ed7f3ce947d8add330f4c36180327ba34510316144dc10419621c7155d1a1081c505053220c2332e8a34a0508444127a00d7d11a392bb38e0c2061a54a9a24311180638820a0f6ce002329e48f18591112481866d8d1c9400c8091e2c89a1a00539f4e0498e56c405ec958fe096cee8e18bd9961c7834d105b55c71c728ea1b563a7749980ecd8e50c18c88fac5ac043a98ed70c32dfda01bc3871d59dc530e90b8e414adc51d6d5ec312b1208a9012c409da4a103fe0206ae82145415bd940630808336a184340f0408bae610808222843403cd10d015105db13b6d65a5bd70082160410425429eec57408081d78b839bc94e09660f4172dbdc3d00f371c0cfd00834a34f4436de807150cfde0c3d00fb0a127604cf1a40b9c6f9dc193296231f8c1d093246030f444881c869edc50dd18f2810d3be48318433eecc08732ca26d2d04287378c9c206272dbc1117ae50532f8320217b0c007247470c4eb41133ce0404a1858047961642cf213c6951738f101076bf4507484ae808720218ecaf0c10db52e8eb4e0031054dc8084131bd0e0c2c816479230d2046602273e7c19ba4194d8161540e1018a0d3a88c16c8a16475865119d1bb040cb5015143421250b2325a85de1c61644ec10430116472a00c40329b92cac2041159c112b4a14d1440d293da80087235e340747c822a41116cbfbfa5d8cea78d4057ead1d0ed7ff5c45b87a8cea7caeae09653571e2040a9421bad84963a39f5d8ce2d433bfd0d53058afb8f906df78494485bd18b627798322c6b89f1af547dadf8ff5a496526a2975fbeeeeeed46d3df56a54e2661024ad3943af6a4f0b6eae76f9ce9e66d5197a5512e37e69e04c8f8c9418e94d077a55bdd833d390c3f6bd2d6eae7dd20fd26d76a057b58f6cd36e4a9bb6f5ac673d6bdbb6694f4b7d80393f7c802b10f5f9bbcbd251b40f43fcf4404415214c707180c183f6e28e4d54336e78442771bf28dee49a74a07245264f5c100c16dcd00a252a97510d2c40604e9843cba1e584b41a48abd1b6a079c92d89085794cbc9312327a79643abd1b8a0e5d47268351a0d68e489085794cbc9312327a79643abd1b8a08994d53d6dcaeaacf801ecd6e27272c01c5c43a250ffe314710c73c09c90560369355a151a4da8e6029f56a1b92b27879653e3515be5589b63736cce89bbaf13c0feb552ec0ac1cfecb063d06ccaeab288bbeeab5fecfde8d66cbaeadecb20c01efa68567f17746fbaf2dff30e37ee5c3e8eb83528544e2d8756a3c58006769f9373821c989c9c1c1fed6a5a9803e684b41a48abd184684039be18ad5befa10b67c11445f4c084eb704f980ef5c083ef7063dae82a2e98a576b9e21507e28e4d78096e78041b4ea2bce14487867261cca05d10d3211918ee23bb42c4f5301d9259b921c5c0f9736c94d1bbb8f51b878705a31840a90702b05fcc237e2c42d535614365bac72e6240a291f4845802ddfa4d29a54cdcfa4d29a55d22a55490c1fd1fce19c02d0e317e38df94bb7f980ef5b083ca850908d72f74b0420a325ef47118716b0d3018860b8c88e20656d8808817edc1184ca0418215106184e555dfc375ab56d185ea58bc811576c1bf3f7b395c3d9fbc5ff97b66eece1756b87bf7707e7a449e962dae57eb56956ee5c03970f5a23041f1a2304531fd98b26946744464829962b8ffdafa69be37dcf9e6ab03124cc1650926b498418257be54e07c73b8f335ba5e3c28d7090f8a15dc57c803ba543ca05ba5e6acda05aad1707fa9288ace25a31fe05c3ada52650b2953b8608a26af7cb3e07c63b83f5fd97d1246098b304a5b78e05cc21995b21895b478b09290072bd93cd80df79760fd349762b873299766626c3104ce0560cc9af8bc72690a9c4b34dc9f4bb5521527d870e20b6ed291ad8bcd0b110947544494c3fd24a01ee04ca29152509443174048e0c00667bc32490a9c4937dc9f4944242d5d131294ae0929ca007026cd3a19e947467ad2011d0191601dc9d6e50d772e73898b99a249edcb153088d0e195cb28702e73b83f9746279c4b2f58944e60515a1100cea5505149a5a8ac6254ce8c4aa09286fbc9a2353299c936bc98628d14bc21a50b28af5cde702e63b83f97b2189ccb27b608120b5b04b985853389b335328bad69b13652c8666d3736702663240762a0032e455f82c061f6ca2414389334dc9fc91a6e9cc92ad6c9c88675327e19bb8c5e56388f4776366eb1332e34a11beecf23118e571eb59c314239638c32fe8c4f4c9cc7d991787434c28e445b3fcde20d771689b2881bc1113e4c51c596d918af2cd200673187fbb368247ac14274020bd18a4845acf2388b42456214514a0e770e8d70875960c1124b630530c8f9e09545d80c701663b83f8b32f195c5274f84583c116e09b3845a70fbad59f5736805778805f787301de430873e9818c30a932f98784119af1c62c139a4e1fe1cd65ce32b8755866063882f5dbce0068f68208e5644cbe17e1048076790863b836ae00c2e11420a327ae8a283152cd1c52b83433883379008d4e24c4028ce048c02fe804f7083338f7d4720cc63b11b2e87fbf367f479f1e273c28bcfca47a50aee4fa8bffefaa3e58ebe1811fdf97bf28487c513de162f0b6e2db83ddccd13ba79b67e0fd6efc570674f0c9cbd067c1102075f48e141114bbcb27705678f86fbb3d743743d44d775e98e681d8e560464847347c39dbb1a1e03e74ee80b2a5284f1451559d0b8bc72677b02e7ee86fb734784bbd3d24c3a28cd244ad7ddac63471dccdafa69b637dc8b0a2ec0b0e9200a32a2bcb22db2e16c73b83f5b2f565827acb082fbad10ce52c1d92a393bcb5920dbd9a5c0d98f6c0cf7672b83c1d93e19c2b118620b6ec7e1a679169a162117725b158265d1d97b94a1040db254e1021918bdb203c9a03f7b95da848ddae44b77f182fb08b7ac28476b222d5974ee2d0e6828148b28b87bd682b37e9e74cca855025dd5cfd5095c8215dc5f6dfd34d71bae3f572fb85fb952c1b50a6e5a1067d577006d857455bfbd737d82fb6380738dd584213b238b1f8c4883c98bb6d0af8024dd7fbb062434c1043786ac8b202e5e1506b83fa7df876371b377e5660fe8899bbd5a6794bbd98375595c70e882b65b2ae3665b84eb97c2b8d91ae1faa52d252d6eb6365cffb671b31fe1fa9d12f5cb1f2e89874b7e7173637173d370edba2b68c470d7fdcdaa7b544d570208389fce58038fd003237a4069ab13a23e58457d908a4b82c12559b91e91ad1908d8fded98e802779d7d75bf434471f68870e582ddc3758b8824a33ed9e59642dcd212b754e5e6c7b54d40d833ca31c2abd65a6bedca9e9dac817e466bc5275442c1cdb6b4c31232886bb948d9598d0ca1575311cb01a874a9c08116dbab79a8e246d1cba50515dbabe7079627845e22b03e00bd68936069e78a81098e5e63e9a8541382bdda44750ae063d3696a4b5f6e578b25a359a8f44a95b7a922868ca1190104000000031500303018108ac56291481669c2e8071400108da44a704e9449b32887410a2163880100002100000003338341020091ba00e1af897c8868da0161a2a3721fbc1e43d59be171e5c48b796715a9e083234ef6ed7007d2021a96b30c75e21e15cafef8b6bd4868c7e1fd4c1be1f7793b083ca846b9ed8d54305cfb96c8710d494950d85a3a467ed944225eed0ff357bf14ff5fad032f0abddfa2eac0f8e76c2258c8c533435250b30a9999f246ae42edc1f44235b8a03d4e80524e910c520cad50c87fbf8ad44c52f72543b295d32fe0655c1de103732047f5c784fbcd3ba8df6894133316d8ccf34253b2b13cd9e57eb3505884cd63f9ce31d88c17d05e81e151c60645d39383fed87f341c131e9ff83fac3b84f1e05714636400101705d81a047fa79b8b893e644fe8c246ce288612504fa4ec0491cd82e179831f94c3fab115795e01a06501b7cc7cb5959c05bbdfeeb64c6ade83ed157e0fad3fb9fec16cad04ff531956bf7ec3a67e03f4f718adeaa322ef14d0f5eabd322c0628d200a0a02e5041f28425acf2f5420235f894c2beb18093a6f5b8f2ccd3448e0e93b593d08f4b0e8e0d2aac571db0c7ea549e56f741067096e38199c6d108e8ecef3c1df417898191121d659c53a977886ddb0c09980da71f30bb9fa6cc4699ca770fb3107353254a7e46d83a4da29d751e1c734744b12d5af3de8005e6125d0787e0aa3166f6be49f4f8ed11cd66caf6cfa0b04dad88f9ebeb01148087518c46090e2b8c60801112327ddb529f9f08978a9137681545d33c1c741851144ade48a6059f9fe057123769e46efc3b240e74241e9ecb3cbb99373c043ee2fbd6e416646bf54d34c4986ddb4b700e7aff514bfb6e28a5ac3a6d97b25dadd3fa09e27e05da86b0e5d7882c24b38d26a49781c7f08b7b870192f58bc3397c120bcb1b8585745b2490d79980ab129ecd9b0222facb5ae54b54f56366699ea61cd4d12bc9a99baae20444a884b14b8c2fba50a202fc9efc5ce6744714cb9459466cb74c0afbdcaa6436631dad13af992ec9ea894b7eb4d974725bd876d519e877c749e445dc40fbc2343caaad7de59cb1e7eb1d1ff2c10ff3f85d60df1d98f1602891330902f238ac32d5333a99f4d5bc39e9b27f28c0002a1b655cbd9db8ab1e6f685be0da4457490af6f1f065922fa1636d1723eb2790eb89c5672698bc35392042b640b3a12624a7d0482fb91712fbda1aabca374af90292f4631734ccc793d97928b6023786bc649f98e57ecdde0eb8d1c699480c3537e9d1e545737a5390f83ec4c9c32f8121b6c0c6ff0fc996554ca4676fb3acbb4753574788a7b8fd5cbafacbc9936fe8f41a786ced52f34d5daf8260d42c61d5de6b91ee7de9f5408444b6c6839e01193876960d935173c4ce4fc21190d1292076ff974081ede61f6184c803f963783eac4ac0927ee888c0f57fb53f256b59e2713cc0849fab62769cac7ce2e68561e69b7eda0527d5dac3c3d61c18dc27294714a9a40fa3ae9f403b5c287bdca2d1f84e218b87d6f5dc1c2361cb7ae48d333a1d47ac10254e419fa52ba6855f96ba3f83da77f215e6acbe87b542a679e3956d1afa59e53b0f81311b8fd8e34e7a47add97643ebdf9cab0749c34c608eb8c910d5df0b16a7ef0deb84f350e2adc9743c77962cd073e7047732c3a4766df1c1f464be895082215e228c58ae4d73cabbd0edf455cb1b2fadf5a0828f9b0e8ee889cdc9fc3626c4dc54b20ad76dcabf17a159e10946c47d6ab130973c80837576d758a6160f05476c3472eb9a24d5548650734c0a6deb5672c8a0a490ca97699cd790c88f8276529e1916fc9893398a01723e8b9ee707dea852f39c37273f07ac88909072d180c210ea2104f28642963725cddb7fdb98f88a18e5cb9f490fd69a38ea515d1eefa9e27f039356466dc19e0b79ca5cad7e8175406f76d14a571482197807037e0df4cdfe96809989ef8bee482e99c2ad7bf28b18ca2a8e485c2dda76ad538a9fdc744a8cd486e0c3760f3ee4ae1494aba143d30c2827006d5fbd8687c3eabcab468dc8e53f664658169900b66e70fb291825c8da7d1b71424044b898f0a552cfeac6fbaa645b3964c047fe1d0a5ab4ac7a5b8196aec6eb93ddc8416e5cfffd2ca85f0fcc38c4627f90f385c5c54133b74214419210342da896d5ff1568c39ba8006305c745c6ea385582bee6a6c1635db72d60e1eb71306a6d68c0370a50927aee4700bf48de2b1997d158b27d77329bcb5e43d0733ef644b11f2f2ce33e920702e41fb2d377f785a0e916abe58b00ff033bf63c734a433d61817e3057e409136a37eb2f2dfcf1048ec6a56ad2d738fd4355fa751b38b88e95f256cb7a0cc799cea6b62aac94c46b2c0755d88cddbd10e1b2751740045e10b3375e1c0186388babdf605780d207eab21620cbef960e01c925dc7d274b7aa1391d2c8936e605a27c55364540d47ed1f16d8cb3ddd7bc1c115efecc2c4bacc7367efccdf96cd3002b5539e6bc48fade49f994aeadde8a83b173b2131773b0a36d65f7ef5085f68c990b3f76aa09d24e5e4e078bd0782a0d4bede01b3131f4e38f8fd1877cc95dd86bc3ba30c7d3f177762be25f69aac00defcbba2aec2f0471cbf4ef446c56d46c8580fb28ffd6d9389e280ec8bc328e01c42c4510d64ab7cefc1e0649aef6793d98811c4074f13182b0389afee6c1167baa480707ac2435bac3e7753101ec2cb8fad64f132ce8d3b85a168a25415bd6462ed0f69bab46507d9b67298e92f6b237826d797e2aa5ac59b4510c8eae4335811f6f371dafe32c3396fd2e24665dcb4b73f7b0db0afa6ea36ac3222905c41e2672ac188ce68d8b6649af3cfab762abd971e894fbdb01ef31348f5ce251602834fae6e8615be6ee81ec47f7c0c85708c62605f004a55c9e2b0ee03d0aa966ff4f5d50ee1ebc369c693e1e07f970a82d84aef09aa68222fc784dda0f4a149e4a83148ba2298bf445c164eb6f9f12723c94290b3c2e1d0a43b9663fa80a2b2c7e9ad6ab4550229b9a5b41d10201701e72f7f15cc97911919a2b7ccd67104812231fa72dc8262f5fa3877e48afe26ac73958b6c2ed789aff8d1032fe60b52a641cb9489e68480ad7d421951845c743710b8fe78edbaef8534b825ed84cd096416ce1bb52f9d9860ea0e36eb648cc56fd3d92cca604255168f640905d183670703f02b7c74291a8f97230fe0b0e6fe4db9841352bdd399fe28bc4db8a759753f2ddf4f0856588d12e54f42314455f6ad8e7f14133890b3e8fd73f2b495057d66a655f458b767720be3fa8218c719d13322e094b1c9b2333a37cd9573109c23bd2bc2c94afe029062c779d3f95ab1a6e585ea3d6e3c96a514f8cfed4089ba25bb31d55b0f16f08303d5a671124b7855dca37312391e51c20c0c60e3edded1cb627a14f2aa5753d6e8b6838bf194978cb0942f6b7afb92f49d9fa975ecf8860a8974462053110641c1a9a5ef7f63f791a8011dc05fdcb21ff02a3e4ce2a55e64b3bb3e8ac21ff078bf067220c03068c5794a5e6921d33b5d2d554264ddd5e1c1b3dd1fec895abf418c7841ec4f88fe2c0710ccb275ae2c4bc0604cd1550a80dc0d0bfb012a9c3829aa8ee011c6214202a027941ec0292f56618a3610774da08ebe163504eec39288f1e46bef980db61e6e3fe4a60e8521cb78cb5122e1b53c578fa32de9d6e9e9f68c8da6e5d7f8f450537c7a3d478d20ebc0c20b30780e109ed30e703e85839e041337f00ac9deb0a549d08cf884aded21442129c341183ba9d441c0f23a720a0f08e38687a625b0c76bf72f83ac6943e3e7fe5a78293624d87dd9a51d574610085118816a53b280c09810026e3e011bdf1e5b0bf0996125ee137617688f8306cd250d1faa2cc87a06fd2d3b15a85cc9700b13f8d1caac6251eca9c4497be1643a9187ae0d3997defb69f60a873dc3af66c4f21e3982784398469102ec159140a8c859489834ea0dc497acb45214de60afa0e13852492e241257d89f3319a737535874f6a1a30c434434baf8b6a0343ce34d0fe1211d49b3910c85005ccffcea7a21878fcd27e33d199bb22be18933fbbf9d9ecafcd878ddfd2b92f046dc24dda1ccced6c293e125046dffe17823f89306e0085b87287d910bffaac58ef0b796b6c67f786418d6a3a163a35a507c985be103381c0cff0d6169e2fc7650674faa039c056cc0dd977c37a4e97c12f0076ec7335a4f3a154fb0e545a01ac3c8fa807156ed11434970c8181e070cefe5851030382ba9c2cef5b4632694010506f2c56aaf8873465ab2191e9d61f10686af9a8367bad0499c180a8a519072adff284134f348b8afb4fdef88316e0496c3af6ada93488a3def40336af431c0e7dd2029dedae6000424001d529b0c8f48646cbd926e902012520a220e249cc1f44f55a9388bfc0889c60210428b40acec04e086371c62968c31df6af70c06d6a519978ddf73c86ab986cc7e70368410e18e01687d4f74738d0f70a287b5cb060c3ea57bcd6164969185df07128874a1a506fa49657bbfc27ea3db184ca4f6cc9108e9575688f97334e382ca28169e3630708135d6544a0bfcd6e41fc6166207eb8c5886df1bb0ae9098db8cc738b113f143400396365820997a6c46fa715c1f12bfa306ebef2200bb76a37b63c9c3f83cfd1c0452c039362cf8131cfc54ef876357bc747bfbf1b5a5cd955ad770d3c5caac2f74af0cb1374b2ae5fd25c39a206efecfb06844c1d026a0784870c2d428e96f38af6527d6516970829fae12561c61ab33b3786d847534544cca4303d4aa7e00e2981eaabaa5e6047491716d3c8b60ef0ce83b6fc1f246c0fbc6234c220993db362c484ee75b5c7b18abc979a10ce1c0962cc16488b2fa0c2e38ff57e6f690cccf96fc27db208426de2de77989cd569e970bddd07cf81807ad7ab09af8f4493946999a68d69e19b3737fb8e7f5c042de40070cc5ad426409cb256b9a6385fbeef912ad049c9b4f1f27a04823095810708987503c4fb98b164062169c2321bf2a63bff16fa66a6c98386127989eb2250ad05319260ceae1758cf0bd3de6cd68f04987d1582ba630cb60ac994ea63dadd5d50c1202fe381262a8627ec7a34a9b2ea2ec7685db50d67f087436056122bb0a189a73719d04566be2dac12bcf27b64b94d13263583c7ef9a85d8b05cc8cd8e6a407d0f2865912f191c8abe4b8cee6d8c9579c212fb62a57cca81b90bd3aa7b93e4c4b00a6817bb43c7590431968e0a04e3e6629904364b663b10e1dc5fb6472a71f17b45239574687b431554ca84085b5984447d18bfa1be4a605c2a6057003e4642da633f1bef9b1aef9288440ff18be960b985ae507e5439a1505ffe7bcaa17678a64bac0699bff04bcc77fb63d1e051aae4d1962b98ffbdfc765cf362787f0ab18c9e602b233567475f21913df11112f511d0c777ad7d85218268b0180d15f516def5a3dc79d6a7d36bed62a2226dc006385ba6b15b23cc3d7dd8b4b34461d1cd93829a7610b60b8216f072b9f7dd39c8af3d65bd1acc3b991d5187f3667beebe0093222a0093bbd071638da7b661e40a88977ea9901dafe3bf32ba90439ebd36718c22a91bcd28704b952437da8461fa2a3117f1d5e5c6cbd784fa1cd1dd662be1c0dc3116fcf9f0bd23fd3847306a310c1530bc64017f84d3b19592ed5f83c13bb30c1d5ff3f3f66f1924a21fd3bfe152084e567ff537e449475abe5fe549f4fc5a17c9eb7bebdbdd5c8dd558e0d51f2eb0c0a009512b01aab87c9a34031c98b8b5eed81d3b4e316f7d19e0ecf5f2dc230f8db5d8f1caa4a9e9df1dccd1f9bb44685e3ee1f273fd0933a052a21aa20edc3e0b55dc3e5547c1d597d3355ed6246b7be89fe6721a73c716dec18a44452b6188800a1c3dfba0f3d57cdd32bd2b00168a726e6b60763c0a6d7d2e9da1be5bb5e79a31966a191f66ff7d7a132297c0e6f78b1181db901a6d98b797b1bea8a7980154ef45d7676525da317c95f25fdc6ce0634a02ad2a3d9f604816d2946b9418e3f6146ba3cb1285707c67288998e04b6e494540648e21d928b668f2f210534a1cb36092237ca661a46f70cd003457548cb9ea384421ce192da4e8e67d8c900893b48075d7ff1f126c74a7dac9b75046f3bee7d639583e72c8a39a4ca327dba3cffcc885463cb6bd6a66b07af472a1e6d98666fc490165cf630e94c52c96a64cdf58ba5a7e98557739aa12302e0395613824ddb81598f200e94214b52819c6b28c8a102225113ab23a9f4a5c9e248804044374f4cca3b23f6f754a3855da68cc6cddc42b9f13af09319c427293f56e35c90905f78ba2045833cf21be0216bddb83149b6e4a6fc7f656cda630bca98593312668c10e6318632c00e5f21a7082760c079108e1d24567f6cb1c4d2a4b8923347789b99a89b7e8d4894b83d1a7e029ce17a8659695c4dfd0f697cb06f3beba25177c71cc5897dc431691c36b78ab65bfd203f8cb0ad7392e367981dfc6134f5dabc8d87364643848eb87db282e323cb5b001b6f89cf1bbc26d8ec304491e3ecb854d929db5054797e3097091014afd66e7fad8ddb1321021c9d7aa32c3ccb5550bbc5d94e989f1830ebf4608121005c287dde0be90a18d55094b9a5b764f200f624494dbb406f0c601d2be25c023fdd53f457aff057008d90ad901a0e25e1989b8a51a3aab89a9d00c7151c79dcafd0267e34a2f0a6f49b3ff7444b369690146604c74dd2f5ec52f3aca132b24e5d174bee1e7263869f11de6b1da933c1621f06c99a15ff3d86973dcbba64c2f9f99076086485850f585603498693331548e9dcbf338ff2b115e3d98b57189deafd000aaa810ce1480ed464e0bfe6a5980c0fb83c0d5546f4a82d608ecaa24a822bac712f74e21dc122ab25f283320ff400801a4efb806c41dfdf83616227e69f5d939cb8f13364fcc319825ac19040f5c207d99225a3dca9c255544389550f10dbfc82e6450c7e0f7a9dd84e0c67e9f5b64f79307aada47de985a33c85ab12be9df433197df22618e6283717164283e8d9623c94c43478326628349a3d0319179e058d8486c646a1eb20ac3c99a85796e9e68e1ea1b8e4d51eb06bf877ba14c64a11d8fd6d69ea7a0de7b0dc5444451f2debd5e5a8b708d4f55e28ff1a6b6fde01fdf9619625b0eb06584b4c7f7596b8de0d0deef73d461c33b7b401f95f835f3cdba4514b27664160f49d874bd7aca20456ada553ce46cd24317fc03eaf4c668db312bad06ae0df229460d27efedc3384cb41fc88e9570d16f8cbafa8e745552888c94e3ce4aea0e8c1a0119310dd11644fa03d337f019640a43ba5e22442617ce4325e2e63834102a65cdb6370e14e3dbdf2ee0130c187f223f41182a71336e4484f6f488729bb63c38bad8bacf8e5da313e46de77e964eab814c29a44a519f9d269bb2b7b1c84a49bd367bddbe614d17d08c855b0ff9194bd6fc6f6cfd57bf00508505b61d7fdd8b05303c04df26f13980a5403031f8b43e128d4ff6c36fb34a5c2ccff8ab583b4a99a9a5589dd36b3a7940702756d493db4552937a1af6da0cc8586eda11843ca2455203c13ade753c21add945741097036629801535007d8e0f921b1648bd43c61378ef07c8030ef7ffe3833c653b23a48a0fc2d5765b7b589c673c080bdf7715db61f5e383482123c726116972653bce560943c1c5e921b0652d958ce22000786810d70951f102d6b397ed25ec7764a640b1ef5c8ad32178ee27c973219fff7f763cde0653894a85850bdd8e6ee1740c66788f63ef3d43b2957aa0a29ae1ed36e380ccdcc0f098b5bf43173611b58500ab7a5d5e4ffdba9a56ce6b6c73bd9114609e3d6f8180ff0379461001f06b918e724d66414fc01a2f0c072b33dab2f4ce669cb5ba786a2160f4f839048dd9f8fb7043fbbd4cbbc4fae30f9596ce18fc8579a6fb34a3ba1466a73f848171eb1e48213da25407a7aa42fb4bd310244d9a8c6769381e825c7399e8d9a8b16b9879db2ed09b03e523359cb5cb21f8f0c97e3e718c2039f8a950ff4f726dd15c8a2c24e0a6a9833bc9e403add9f709f00d3c3d6c7502e9336a358acd57c6967b8e6233f65dcf436357e9f10a604f56e4a813a332b8c5a85893942cbb657db7375117d8a621f75174ac278c38a77c2e72a8f324d53d19ca6f213a8103c5bba6220e38d2362367fee22b0c3be96b3f3bd4c52566d7877e45bb0144b0228b5d6c2a198c0379a1527c553582b31296901d2d85fe4ccec347049c263e276815d305df5ffce69051d4b31f0b2d36b2df68ac4cd841febea129c015d7f963be8cdf226ccfef3b75d29d0e1d7b15c067916032b858862e0db949de242381cf8c1929f79fdbe06231b0a8b02b5414b459ea21b31f831a5f3527d12f3903a84dfa3f79a4c4903ac7426af8f9da13fd9dc338b1f988f39f91d83efd6dfa33c78870e4c4669b4dc96c81a2032ab5e4390f53723d634eb05676729a06a61e0da70168e28eb3a560c11ca7afc383c287ecbcd2492864091e3cacc4558606fec8647099d22ffd26cf5a750f5d4adf7ca717c73e0cb44e8f277fbb50c0dea50960f614c17fb003c305f4bfbe43d1337c7b65ddb003d52309a177f0307ea8cc0163f122892fcc516f9a0426cea1735f49b51ba02539a6276ed27f320fb5821f070ccf78679f2bb05f97efd89b459e50d44f9881a7d2037f9014f8998deb70d9b814fa095e0e821a9cf2762820035169692a9c02ac036ea94ef06c11d555d87ebd9b77218115469ac3dc1b311bb42310110febad50c49493c120aaa1dded3b7dd46d820392b5f70ccc5a6da26e903b406837d9f54bdeafc2df3d2a331ba5571a85165541c37083ff0717a849201944c8b54acc0655fd177e2683ff0fda135d14e3fdb8b86710f7a5522f2bff24856ff3210b1bb76176181887cbc90fe29ef9d127f5865c55cedd49cebe501a3befda9ac6be77a2083cea79ff7b3767ae1911ea1d35428d7fa36902481896e728eab4deb2294a10dba28add573a0842432f2c49f258b67fe52eb666630200721f283fb08f4ca5eaa43e694ffc37be0c3404fcb5ddbb817dfe2c2519d4791c3c1d01e31b7f8c677c1c097f3e902949dcaa2b5f052d691aabdb57ba5fcda9dd27a0ff73ec7916c2a6aee42c55c9653219754ac3749e0d08e3967363e6d25bfa7d2bfb9ddc7316328b54179ec7e2d9c42286f4b6d9533630e75a60f699adacc9c74c321382eff0cbe22fa65b5b3363c9cb55390de574abdf7cc2e8f878268a86818d3c0009374088de2462b3d5a5f27c780dd5e68e78d28f218e93d4d44e860c5d7dc8ff7fa0efbde108395a7dbe8833f75d69e5a15641e5755cbc15c7aa8a856017bd05e79729a891466e2e0d7ba97b530895dc430282396bb3dad8a500c465dda7a3b20009e8ba2a259901cf31c6c58f758fb3807800a33fa2e3d30b88a4acb5793fa423f964252bf9a9b9e2f413bf86a5c3fdc65ea12cb4cb2448afe6d83f3a0fdb73b7caaf7c7b1c3145417391ff898699b25658f0b2c33ea0fd4f650a513087446794049dd2a68d8b8ee8cd5adc6dda0716eaa9f5e4af6a06f3319ce70574a33aefb3d3d0b86b942a9024ede561891e54af8237a93890fa87f920f675c23560b4130d5194be82c8a2710784a39137209a4e1765d7811b223399c07301fa687b16784af5be038bc8af47289925b83cc392796893ca31086c366fb02d624d9d4110a3b6bb608791ee05d31c1cf59e09835e0982bee0e71f5221bc392eb4e93940309637a9f7ca61ebe5edfcfd7409abd7febf4fadeb07b7dc84bf7a138e3118609bfc8f8118126b8687b0e37d2cefe2d6dc67c3b78c98145eafd42d88ad39f6aaa13ddddf9b28c3ec8ff56ac33624481065cf10a2c7964f31c86329e50aa793b59e783bb884e5f611eb1607181c2a6242309cc7db4accdd860ab6416cb83ac0e01cb160b711232ca1bbde897b9db60662e9fc54bd905e4cccf003374b0c15ac7a1f090c9f19f66112a09930596897e0ee6773842938a01cdac0834b5e244a6740ca7bd98bb5d6ff175b2bd8a357f8240a653064599f93655d82c3b99b55121fea523362a43ccc5d92c842419114d63dc31d441e0554c698ba74d475a8243fefa75b6b33fdd638b14a8cb09fafbc6c192d6c5441a4865eaca44127f1fa061ee8ed7a42cac0ce29e4221c5c7f9528f105c1d0b6f58daa11d3d996c7e7784df60642870157d9e3f5dda68157b8a7b7f233dcb1d10958bf49af0fc2f4043ec18e57b3a67cde79f75ee8cadb44230a8d9608edd8763abfcfdb617ca3f6919c4ffa3d65dd10fccdc793f61bd468a1e9d32d36d4ef185886fa16ed9cf27ba8e96d1b3761bff477515d75691c3e7a3f659a225391c6aff71ea93b38978986a4aa8866a4f1d7bc841e5cc3e6b815ff726e44d9316a3821850f31d385b6152306e6b4f631b804c97db65d04f2bca2a268f2b6f30f49ed08151cd59ed28c1e3b5658bc982326d3b58f2f94c1da6d1281a00075214ef824288c97837fc0e543605b1206df29c4eb88dd842504f9cc14acc12bf5c42878ca7df623bcb09dada2eb428d821cb4233bf371b3286c170d42471d465b01e1d38f24fd078356460298ac15a019082febcd9b06f2f9f7fa67526d39e1427d3576fcd7c3a91e3f1e229eefa62f5487edcfdb33f40f7a986bbe047b3155a9ad2fab240ccf32cb47c68161934a28bd2bf5a1ee1f241acb2032116c6f40546458db16937e01aa15e2114dc79f9e86f4fdc33915d13dd57354faeb44d4b5c51a482ab4e9385a174cc7c528a4ee862b77e1f08ca8fe2e71582198506f2206ef9873f4a3efb6c28ad198f4cfdaefbb397e83198ca03acaa418d5ac15b5c62e78d9fff60b2b6ec2fda258e71c1c20a9249a77176250fa6c78ee97a1ce7693ac42bb4b12cd9cea5bdb4e6a2e41b77ffd903a2ad87c52e4eee4f5b232079037b1c8809928ce8d84a4ea58c2b88c0fd8702173241bd9cfedd3f1276fcc67ae8264272ba8cec27b58f549349bbd3b2a3e8ad5dd3adf004dfd6a7b1b4137eaccaf59757f34fcba67dcc8ab68a24f3be135e6c9d0f825c68e219c79d4827f6ce529acddf6234f780d44eb3a4bf702e12c25581767878a58e3855f9975bd890189b03f3241cc010aed0b64411bd25563dbebef3687c092865ff7ce2368e2ec450b26fb341699557487a69e1fe17b29b3b3468fa463286b5c0566e0accf43b065fe86fb3b0ab5042931d2573b864ce5cb35942496380601897a1b37d7a6520cdf51739ba91b2e79240fab3fe8548f15b13708939b82a39ecf412aebcceadc0d90347bfb2758dbd0980e8ca0cfa2d898424f9b827db0abd09af8b2f004e3125d411e5a283454aade5d0ea59a90697140c1e22f82b0cbf2d0bce6eebe515ac967a39a56832806d09aa14101eac20324f79fa784cea82b7c1e08411c8ca469310742b18120ae5cb52882449ce9b7de7cb149f522c8eea1b35577e55744f8e4558de9fb4ec0848d22e5e23ee78dfb141b9a0c1aee6d5f141f8dc1ee38cf0d97da2a51d28fe045cdf7a6cec2530d317a600223c5fae21e4bd0cc89951f25011e3377c4638c5d073a5eb790cf1e1011f86244314064541b6f4cea38c324837b59d5900e32c57ff1af8a9a27edaa22b4c7c60e26ca83f063d4460f9c45e7861efe858aa8cceed35c0b8ba48866dc62ae64fab4c39f8f5e84aa31f9184aafe2a54fb752b9ef8023ef2162ea39993cccd2a06292b7929c97da8291b0bff31598989a8345266348b37c145d1ee2919f767485ab1423ce079d6daa0e536c34bb4d56d1fa002885190fc541f86a2415c4b330f9ead968a5f07ee9bf8c99795a9515a608f5cdb75609118ebac0deb910ab6f994c86c2d03ae271c13efb4deadbce6bc2a00b6af4029c2879201436338d842ffbcae7334a5b06a3d2bb4f2d21b70c3f1d2b0a178a49ff3c3878841a88500f17c5c9bc8e25a0471b2a38514b1f094b994fa096a7ca7c03322992e0d9334af11657baa55a6d68c6c0448015d4ece5707d50fde23105df68f7e285440020c6f3b7f12955b087874545dac456cf2187bc6e68ef9f5cb5e4caac49d379e9576463b4dc2c7c1f5d889dc0d3f70f61151d444986226362622989b3da664a70875cf06484afa6acf383fd38780f1ac3b0d0081f2b84a318cff72d3195448c0cc8cf93fa8444941ef8d7a6823eb8adfdb6e2feffe4ac956e82319704c0dda2347907583208bbe2cac85422a616a4c79a29901d971a7358950b80d8744b7dca42bf655ce4f159e5e9f45cd1af70d2f2c8fe62c071dcedf6a1a1e14a16ae92f7b8a09760aca1554abb6d6e6db5ea24d6d3e2b80baabc09a405fe2d125aefbc47aa92204d528f69cd6d3cf18d9590c21d0230d28e2976785605a4f83fa33682bd19ed4926a498b574b93bbfbeb359e22d451c65aa8aff4945775c1a2d28b4372bc038a827e464906565e02ccfa4e5adb2f578e26869e59137ccbcc6f88bf256e28c954da9b56172ab6154e43ec79b4631cf91911f557e691e28eedeb9bf2d9fd6dfa110dd0f239a6997a0bf9904defb7dbf6c62d518b5b8d6d9a60d73c96a3743e981ca8287d5d32f3f5c96faa476cd1b92bcf38a85f2d6c0084268e8b328d6ed75216d73e4ddd7cef1e4389b845419f11aa1520137978657bd6435e2d5a6f47af4dc874ce648c9d656ea4334b8469a13f9d8076c52e23139c627babfe4f68f7821cf1e4859f240a8de8c2b7e2793cbd45f526dc41c15628db3ee3500e719240f96fdbd69d4c43fdffc7c53709cea9698b8a130c8fd76f89f767c3424f7373d7ade3c2da15efd31780c9944ce0390b033c5a59b12eb43190e548ccc5fc5e18ff45aec5cf77fd3d5503d4d04c451ca82b464e1528eca51758daa79ee749a449b38485a14892e69d44930c6d08008533f5aba29ba15b9822787e15473093ddea58df33ca576047a9ccc201be09e286c251d47c6730482072c483e3f0f9f5671d40275881242082977d6ea32e8d812747c42a0a52bcb5efa236dcfba3c33f01f6f7dbc6d8962712b75ac12f21c6e55aa66d157150df19920d6db52350b049bff4c30d502a7ab3ebd466be3439d40ba64c282147cc56fced1d3cd5c4d66687630270223370f8b24379208a5ea89f7574e239f0243ece8f34c451c59e20e4bf46fde1a28d9bd0e36a9bcb86c4187b5633f5c468aab6cdf76b5f71218a90a80e66083bd5c3df3fc05e8d1324c2cb6b8695af2e531183e6b9058b6d33748c7910906aa54f72108cdc9b8c19dd5d411d42b28c974028be120cc76601bfdf9cef13ce648fdfdce3ee5bcff2634886d68481104d2d645157a98d4db9a067cd2110d04a641b1af5bd3c63c61a89fe71853aaf16c47f7ecee9a4f7a3bfcae974c73a0d00931c02533ec8aae8a8bd0553375a1aa747bdc9054238259df4ab86eee91c4dd89af28b184acdfec52d6dfe07fafffcbfcb700d8cfb31d983097c0f9441938d169ed9bc3f14622bb84dec143aac0bfa085526988eb961d53d1d54efd414fb71cd316334f518e8d08c94fe39b88f4cc26bc88a4b844579eae8b3e89efa58b5e06de47078265f49eaa3a5bbee28a889865d46c053470fdb0786d258270fbcb13edea2685080ad61c789663954581486270152c1a6776cc4157ad12d8584c4fe7268ef133fd994d900409be37118bd40ad46777f972f49ac4389aff5c13145cc251e5793b416e4e3edc0f8dff0af919a9cecda15a54626d301faa0ecd49d1d6494c311819ad535bea3c086fbacef24e976bb7631c2115b9bcc5ed8cb798e1aee24b1f47369cad9763ec5ba14192b6faa9be782a1bb8b1169325adba47d081de48ac40e8bf92888cfbbdccad3da9cc284434def24ac318c629f070cb7fb9e3d529981b9916f1067f527add497e76f978e773734b64c6249b6969a1a48ca3aa6d54c79864d5aaab05a1c61be466cc0a1063af4db274b6810a56e69a19c6d61aea9e37a9634dc4d3d1951d719d6df6a5e253323f13bd5edd7d267d22ba563c2ecfc0d72f50f359f951ef9018eea573a91492f59425d6934ce899bf10be318c39fe3bb7bd2a95b1a828b5f81e0fcab72c3be60acf7b23e81c1ddf436950b445e591bd0b8151c7c65ed59593eb38d499c007250fe89043154b9ecd2d006e6f71b46644e61c479a87d196dc3ab3dcadeecd4b3521f827e40e2a12d5d2bc2c7de02d155023b451eea9ba7bb0632486b59408f24c3a509c071b753b6ea9e177f260ddf0824dec6a2b0d79c396eff603e0ad6b6d30d023cda254434b7784b74d89584cb78985bab8fd5d1389e31c046e7d214bbb06cc79c439772c5a21aaada9a3fa621857260fa201220dd63ffa4c9e1693c534e16b869ac9b17a749735ec74a5f4e956f6d1875f86cf74d6c8d90748ae6fa87ebb724e5685e3c937b37e1f11d920faed22876ccbe050afbd64a5afb6fc0ed26b9cecd78d7ee36cbf40f410e7fb65a3cfa64fbdd2cd4bbc55afe07b70425aff1ecd5b8f1fb3329fbe57bec7a26386c622f4830ac747f9d3f922e57e67cdc0ce2fc905a60f35e6cbbfc5d542bf26bd8c5aaccf2004c47ae9a5b10e1f01e75b7648fee500682abfbcf6aa60d1f81743dbce42b2de0035dd50bdd5f79e5e8d6559b504e2e3f0514d3c5af255a9e9759c3a78fcaa648259f0d93a7374294bbddbf4f972fd5edcddf0a0e97d9d260835ac5406d7c48d0564164c165586e6234c3315476e45f27f8af3c7865cff7e4bda05276fa3524ae7cf8624093629eca8979d5f22485cb12216ea7528bd6953549c70659ad721d6a7ab8e6bfba8662d4b9340c8cbc753f19feb05acc50c4f0c8d641f4aa767724f1dbe188d5ddb04665d8e24b69a8ccba927c5354f377fc3cac94c28a19b383aa354f68d1033cbb292e08a17c97f4d781a3b84001a9e5c912028506dc7ab12dcbf1969672ff666e7545d94c982c5ca495cb816d4971dff6cd4091fe30fa31fcff367549d517ae31a3f8888836dfed5b493c87879a1d4f3fa765567451bc87fb7925de607a8462c3935dd17812ac4e9639e6bec4919f3e60f17a246dea1d8e72d2c7c4a3039fd0343cdcb77d8efa9744455411e8e35e1aca7adf9eb280f370d82db602fa5b2c24d7d3ffe1cdf17125adb8b6b3d2e4cadbc37c2bae0716ed1574b680b07c5927794e48f9945682a11876a504c10941e5144e5525d89868c65cc3a0b16350e4148337b63da12b1a2508e6128d6368c08b4f4923cc0799db0a5032b1aa7d28e34da0ff1ed6d4ed785a2abe6f7b3bacc86577bde57bd5a5d86b77488a0ff3b7ff1543f8cab1b40971df651dfcca50c354370d358f11da1b9573478902c072f596c373e0d66e10cd9178a1d3926bad22a77e16d2c034f83b330fa2b05469ed0ac8bafa6b9a8e6e4a10a7f7ea7a409ebd9f772a615475347f27a4a9f8f0d37ffd23e734a38684ad2ac353fcf7956b0d8d0f86ce1866320eec8bc6b0b7a52cefab7f3eb136ef723b48d320d6b159dd9d8bdb25a20b46c9da5368d5d0786212de1e9d50b9be0c41bf86518300474aa657c8cc45a9e66c7eb47f6acb28d967fec5fad0f190fbae7a46a124028ec49f3abc6a6733127661f1b73da5bfd74fe1161baf0cfff7b4a5092e963a3036d24499de29d5e7d862c1a9552bfdc8523bc0a3c7278d8a1397fbdb272f318659e1316e9f14dbd28fdc9f21a848985408c7e21195ebca01d9a93593eaa837054f45820d1683e8a82239f4aded32f27d08e67a8f318a00f8168a68f9d259affa9d9d043428174975b85934ab73a1062d27e94cbf414d32849ce775d9faa4a9ee4f18ce83830411dc28a89dff94079cd631fc265ad7db8fc8a21d39676b85fbb9ebf68c7ac0aef50afcc9c27628641f9c9cac710c2cae4cf09be2f69b1c336744d81f321f38c2e8f2294087b294877e0f74b88accd59e8fee5cae6fa85ab27d31824cbc83e4f7f2b0c35bcde5a85c14a7e578e1450ffbc4ed45f95cb4577fc3619339d29ed893d5519a87470d490242530d27112db17add0b511a6500a199c336ffacc67a64226844169946c0fffdeaad7d65e8b0cdd5baba0b5ba8ea8bb40b7f1a79575b5968d60d96c2daee2af6749513df9338e641b3a5c5150a1f10d7281742d8ba0894726daf355619bfb06eb1654ab8e9da9fba534b9c8d25218bc8021d18bb60c9761e0037b7cfd57f5cb2cf09489c1142c7315d63b961936ddc7a886743363c2e3ce14d83de2ea66d487983e1c760956153664efc66044d16e1478bb00fab4df9a3595ae76de5a08235a39dced20cad43256adddfab97ad7ab91bb0d0e3a4f4cb60667bee643e8616cd08047e929c085f69e66bcf6b00576d8caf942a919c3441c6318cb05c36e6cecf52bec474f04690eed5ce486463d8a12101ba2ed604df67d3dac48b94e3da759038fe09d4b2b5a82a5f28d8ecc09e82ba47c0e9b8bf21f7d77b4c2a495ae26929d836a34bcde31669dc10d4c7467f6db6dc2a837fbf982104fdd6226dee6c2db56dc0e5099a49135add5a6643a075d573f2ee155f238f5b2ec9041ecde098d1f2af148ffd8e2fdb5cfc22db34b823f172418082f6fbeb2b783512121a3747c10c2fc8236d5696de903632cfca4a0801a0b130d959185f4402e749c9dd74123c46790c86e3424f6b38d5635ffaf0cbfbcbf15219a71a600543329b9d993cb533347862ed13ebf73cbc3a2db9df604173c850168bda7c20fcc4a683ca7d1a4ab00d3e797d10e0785a206a1bd151fb68b76cc94753dd630ea9584a630a7908a04eb3a3602f4e3b78e1a75e5f99c233dfa6086d89636f8bd213031c0c02cf0074ec1ac5b984da85fd97aca5a6241066d299b9aaa77f7bf58248007ac0d095cf21ececea89f8c590c3d2b6774798e59f5f9a28665b9ba18628745b45179a0798a174303667169e8e24922d8a45ade8a71320a434620b72d5bc9dae2e70a692e4ea0cf7469dc680077395f608e2f12323eda107a427e303baea6c80c895ea436c1622eb4636e310ade5d2b123a8fd58e43fb2841b591049cc44743f1390eb148ac983830453952f67d9bdbda95bbdb8f48b58195552bd018acb3ae71514bfd5daa56848e6d9e4c68ecf6dac6e6a18a871403c08442fb788b22c2189771e5683aeeb325163ae11351112e27b4787be6b2674e347d9aaa70afe4f742df4491f2f9bd7c4c98d86338ec4da7e079c1e01b7bcb70f89f9aba08bcad03b16d92f474bc1b2361a8552aa671d0e14b62d9b35c6618c8c0e8b6900b9700be980094f18c9e53fbd5a99a4c534f692e665faebb05024edef1cd1413263715143b2a21d4e12b592530bd31ebf460a41262c113b4cd90999e290f355b412550aea887f18c109e53798b5778f26e3b88f8a3de89b4c628e2ecdd0f4f485af3a8c84c02a9370a4c92412855ab3e9753914bc3a459d1a5def39a941c1008fd4418d6eb396c17b6e268dda9cd6a3c52b51f2eb5f612269076c6b10062b227599b7419ca9a04fc4724e47424f70a00942fce4675881c18ab5a91333e498cc691780292e5686115694f72779019d74b0de2351ac90e75c97f5d9533dc8ec89411582d24c1b60804860b6eab643fb216f82bb9eb799f1b57d241e8f1b51e1d81b5c5d02660d19469c0a6a373f80e28880dddf07ef043cc5bec0602546c3ff2b153c58e038e265ba0a57a93cdab83e29ad7e733dcb4eca548788123d25d64cfd5a9ad9760cb1156da08a7377266ecb667fb05a782ac3163b154419d0bdb6dd12add44a20d2e19fd842b00650cf0c361063f72e113757097722eedb6926fca9983dbf882634635b76d8541520e5c38b25f7b61abe573f429ca164d82b00daacb4500d1849a4f696bead7f2c017685d75b3f0f5dbba4d7480d57ce09cbfa9f60acbe1ef3462e2cac905f06553b959bfd01d82e0aed05163932d3a27f73d2d68cab73f83b09a16b4ca2fe0ef462db4328b2d009004103de589b30731a8579106359231f670fdbe06d9c487a3813d2f33f6022a747ae9c25ae8c3295dc43a13c43637c4261ee8499071ac91818387acc5a624d98b8e5af5f7da00812371b553b5643bf340672b0006ef78a190557dd7316ad1c6354774883bc815c87915484071a6f2e474dedcb1cd680030d9809ddd0c58a96bd08dd80ef472c80b38f68885e856071940ddbee19a934c439a384b74838b70e6a1e9d672463ca9648aa9a8169f21337ce4e455fa0b550d6e57cca734619c1d73d0e92fff2e60b05b073d2860ae7f92c17b529a136fc6b31875554c02baa5c0a06eb28b7491ffd5c324c780ec3a93b407c27172ff40b365844e5a0ac5b9e48c139f72f8e0d2bad067453ae14174b3cc303c52dfe16573a8eff4e055073941ba863046767f27024cb2c2db0c3506d824f86d3cb0fbe1dfc94ac302093b5c201250f33d97233867c086be8a42a1476be19a1ca9c36ab9b2d05a5eeb1b6f26a04c62a5299730167f5d1f2246474125442b9777c8420934a8441e68aac1d167b0d2cedc46af49eee5e5a7deb8b95f8abd13879ba647c65d0e70428fb25388995ccfe497c3c18473164dbc3a64f35ff1f7a958c06eca3b4b71aa8c7b13c3d5ab21d12f47e554a3a2a8c5a39aee1f745a73ea18a452699bb09b5957352dd11a461947e39c1fef3ecdb1f555ca8f770e3b07639b7b49594ac16e59cd8f51963aa19fee57af39e2ef69791757ebe0dfc98fadd7f24e06abfae6c6ba745c9bdf5a0fa16d8566ac0b04502b3e60d83a01de5c8d5545a8c1fccacbf54c3cf449ce1a965687e09b8b6eca09ead113687b27894c9d845450e8c2d94998d9ee9b4e8cfbee3d5640eff915dcb1a951b3a19a9d209a2df5f86a069a9927f072cdad707443fb111bc6c84b848d85159d135d2708ebe9675012b79eb0ecce1f33be2f9016d3a1908f828939c365c6b3de39d1f4f2a9d9fc13dec475471067a4ddc57b4b8290a74ab4dcb7f911b1087c67274928e7ac4fb70925159da048208021426add74f3e3ee236af5be62a95d9cae2b8e618d4864ca7c8871086bc78464d5fa18e561fe4db8e8e4954b4949af877ff9ca62a4b44740179d7424ad674f89efbf2b843a25e36a691c76c82b1f64a717cda6bfe3c795cc2a3ae968a5343e901910e2d4275a748274ee876aee7bb00a585ac20371006da720474a34b90e080f0253c8dd40e0531455922c2bd509534ed870c31262ed07e0027b225091b2d01dfdfd5ebb8e33c7eb68adb783114250a26e0f7a47358503f06d3ac9c54d82a328195e038024f4e9f96ee4d86fbd497ea9fe175f9fc804cf02eb2b674f692daad64f8717a70c750b83bce77949893fa70bdf9688055ff558b2feb12e4c83cdc3199e3bcd4aca219ab509b14ebd5ebaa9c9c1f3fadc67f949619217e795b14b7e238aa17da3c026d511c7aa013c07b50ca9570cafafc8ddaa1c0950f428dfbf4e6b3fbb6c72cd3c4f97c9e0a315bbea275c2e426ba04aee08351ba8ce9843599039c665c686367670daebe6672351bb5fa609e940a2733cb745621643558c47a01dfb2fbca5c1d16836c0a1c0433fe978ba2488edb18ece5fabbfb808df610868cca18d73a94a524ea7d9fa2cbf0f949b72aa2c5b3f214134faed526249fb9e8ecca9a9d33056d368fb1d549dce0a3bc596094a66eb3a92d3d4bec1113e08be8c0ea30312a8b817d0d5727e3fb9e0a9146975ddb0d4f1602e2aa5393351a73d312714ec386b8a4d6af69fa35e2f7e451abfcbf63927f36e0ea18cf65f5d2f56f5ca637e3892882a3da11e8cc4ce867b9aaa6571de806038245a13981fa759b4a6d0b51481fca45eff2674983eb4b96c5d476e02fcce12cb57a221317048a651628c0f2c260b22706dc7cca6bc6b83d4996eb2505ec7142ecf2cf185594c636c15a8491a5bbe7d19b09b516831150198eaad5a83ee257756409d331fa8000b091da8dc4b11e0741c4cb8becf4e115dae06378413c2d7569b4a2b2bd14f47f5e2f829f1549b1343dcb79c22535d7aa7406b9bd5584b1fd8d8ef0c98bb31690b35639b1352691c8c941932cc797e36793367c34095c6d1b6c03e8ba0b589058a85ea55290a8c96ff31c3ca8f7c55c5222ed1081efb4477b4dae99c188af7752d982d758ef8baa0b9823239dccd86736e306aaa659984fa97d6ce045004d4622fa52b5448f19776fd3a1e292a7ef620c4a186b650252cd4c80719d08486bd1c50b06cb46fdcf9790599eb6014504c4dfea7f8d6b445bb3e0a633a45682e29aac6ecf2ed2d169ce3a1931fa77bfda7346df8e14b07a0847e701a4b37928b2d09a07f608dc24dc225a59e94d0f47ba3cbe4a407a03b90712906525b375b9f5b6a112b33d015a2985c63ea80ea07fc0687ca6307faef69da2e2e669cf9b0860552f2e678a2d89909d85178ffe78e82bd95db64dc19437d18dce5262227547d2700d1cdcb89967a0deb43f8619b7b5db9518c80716ea533c080e067ab512540464d67db2246752f8b5ec0469144baab9795d19d9f11922555d59fe595b68cfc188eef632bc4aa135b043083248c12aee51f776bf504481a817d80d36ffe6d9a25039071260e6666beb93d93ccb783ddfedfe58e2e3a7a8d68bd3dcd5ad329fd73ea94f7d27838f149d882b7a4e8cc41f54e89925737305372c483b42b10b604f4411cb5b318801e4bf72ae4e0bd3560b4b207ef1089d02d3ddf9f4a73b1e2443e5cc2d96ae33b7b18e182fa325916ddafd231242b7c3eceb311fc59000f01e5b63d92ed2024a4831e9f63e599ab5b9321a4a38ad650be39f4c804ff2abe90e123a68d6409c8b4bc082b7573f0efd4414925b6b4fea116cb0a2470ab0b023a07050eacaa643b2b55ccc954095555cce7086807f26a45379692936abe7b735ff12f0c5c805dcb05e849672a027b4eeffe5170abd1577be274567d152bdaa808f6d899697e63cc3f3892d0f23e5cb8c82277679f270abed587541a04811ffe8321c8688f2f46fcc2e02f463d31e00f43bf18e88d815f187cc5403f067c61e42b06bd31f209039f18e8c5885f187c7c84cede2874cfe48ce4a41c56321e4ae6602fe895cf6d4dce372313ac334eb524bd5c0e577d5fdb2659a7b468e82b769dde9fdfddf49cd42c7999f17f333a3c6041a499e77c0bc2421a42e2cd67ebd60e07774fb780477f9735100e8f9b0356dc8af756363759ded51c89d1f710719ac57cd40f94d27e1edddef41752cf55616b2d381dcca0d88d92f92c2bd9e1d56c9fc646cb10864b9c98393a0dc395155cdfbca3cfec44d7b66443b9facb35be8ff1336ffff35d30d097c4f04229ced104229f115f75c68ddfcc036a5589430c3e41f7dbff47df70f7b4356882f4dd776c706d7dd5ee2995848ef5a41c806fc08fbc9813385d8f7987888400591fc9bc9650d5479dd1fed10e613f5f6f876fff759f69c2e1159f8924050b40c6f224d951f421065871b9b117382916fda600195f607295bb36277d118670848827877f563bf2fe9fc2cc8680aad045ca40a8c8fc587a4746110d18136e7cb5541044302a0e299a43fe22b76c9288f8774f077bd9d56dd42a8af85ca731b3c1ed678741faa22002605f009bb417bb6aa1217ac604220df4652c438f6ba7895fd4196f0106e373e13383d5f8a84be589adf4d22b7a37bdf791ad046ab63cdacd664214b35c27daef2b9a985aa9cf41a23ec1bea61cff264de2792a6e4aed3ddd824433a0d009ac53725934dfd210b724a2220aa7c9707dd6ce35dcfc6cf198c2f2db2a4d426e8d87ea99e40145751f73cf86525b330f8c8db803499bcbd3c2f67fe21038ce970ad3a78982928813f7c48745e863a35cbc49dc189958989f484f6070156462f1accb3d85709a7b62b23d54ce01b7381f48236b0813cdcd7f66da5f28da8fa32120d0ded830f8b5db23948415c2edb40b8d401e1207b6cdb360b9004434b8d80b553bec0b58e2632261781601545d48688cc1b430d27a99e955180c289517fa2bc961640081f3a22eb85cde4adc8dc5af55da6e457eef5245426d8a73073e1a740cc00981c717cd085ce5a72398f25eb2c5cdc2376d1bf428ed2523a2e5f83320a35b48627d7d98fbaa618d3793b98cfb0b75a883ad5a8d37d766e5e9aaa13c5c444075b4b1fbe02eaa7349f7add57e9a0ba8569416f06801d8b45dae29867a2ef2a626365bf70502931b41b9b46b04de5b9cf3c50c22af971cc196799b6d0158a7a8e90954c7e1e0a861adea3a288239edcbbf081e55ba8b6838bf19c989cebf9624aa0a08146d699d6b5ec43737229e0d97836b37561d14766b33f55f65c4007997a9b427eac8da8600cba2282ffbbf6d998123923732449e398494aafcdb2d39507eff9323a4ec6492568a8ad15da68fc51352eacdbf23286b27a20f6c490c4c0a69f4103f953af7f080db1fa43004d31362cb751c5ea1d132fc97735eebfb17c29826cf0132ddc200fe7039489774f53bbc829ab88cd460bbc2f080586530921b6fee46b2ecf409be32d7ecf71e83e261d48540c33369f8144048e23a7c3a840931b15f5d4c6a7c81b5ee21a4299d1a67872ba8c683573ce8eef53199245eedd5dfffac6db0aa3e33044e77d235bea52329a429381c56d8d19db41948ce80e330c14fc43286a4ca041c5b501aa6e4a9e8c5546352baa5ba7d5110576e628cd119a82a37a720550ad1b4615713264470c4a18f2e83e51a4e32aad3f65584d9e584188cbd29b751514eb53a95e9ceeb312cff12a7419fe3d54799905c690037d2cb6b6f300ef0f8935ddc9c574ec46247cabda17582b9b750e92ff084da56a001b05b085b878da0ae3c0d0a6161077c73936bff7e5f36f829026a210aa771678713d8f3d679e5353b48d34b4962fd1c05721ba3f2302b752f3af24d63fc3b91803c5ccc67d6fd16372627ceb52ecbd52deae5cf0b9506b9fca4c3cca2a5f3ee8e1fc67e5f537d8835b517e6b78c1c272c2c40a6eb12870960b2e1a44e618142617ce9b338d9d3539b53aa48e517c2641997497d44b5b46e8ea4c116e023a923c5c6d274eb5d6201e90a5c00f96321e0a4a076edc88dde9de193c50de00dbd0e15a4b6e23e9a7f70312e75a744cec7e17ee414f0b52c37c5af1333e4a1858d3d9b99f9b440a3b5ed7f39424a8ee940fb320dd97accbed5ea28f997f5addcfc81cee1d1a45256df9ce0729d1239925f3c9e1e37a9651203457b76c2dcfd0db3de19d43f422a1cc6fa4ac64d9ca6665c4d41b3252b04f40771345fc5aaae65871b66b04cd7e3888e47aa261511b406b1d61afa5abb446802d45421538654cbbad77792436ef972b324dfc31c184c4093dafaaffbf00db71e5e39735e37452571c6a682f939af10272349abe6bac14e37509a1c18222ad78702161534753b292a7ab947c817ea8e668a960fbb484d64b0110f4817f6385a58a5ae29d3489a982c4c556d34629879268e85bbd64a9535feaa4dfee7a6401d7bfb82d1b6154a25194af8e1a010b0435bf322a515a68cf75a7cbb02f5d3264b47bf05118469ddb540a7c2c754e067ec410c01634ab02eb30634860a6fda269488f0d826d49d74da29c95b34c23eba455e27046546228af960bf1fb275865f9ff5661911f1592d8676f83d129f4ad8574efff5cf40e08274cc14afaf6ae8991e026960b942db0177804a9250f010d912db1aac8dde61b3c3191c07a4557fdc4e42be5ebb9127f1de733fc8c8aa27bfe0754dffac6bc4029d5c3c9bac743220b192dd338493528439843361ad91f355e54a5e7a0fd9f06759d88fd955b9aaa6647f408ea67e930a6bed848092c2b896c24bb5171fd8c80aeb340377a132df212b43f1b93dbb6f3e1404aee3581c6fde992806abf441ee5d6f43c32d000a20c1fd384f4f7dbc4bb49ce205e97588075fa0a35dc055b650d09f24e52bd74b5c439f23baeb01241070c58f5ca295d34653b79ec871145f8ca6981ad0f1c81440b80f62ed8c010eb7f1a77c5244809db8e47ab8090c50cdc1e7101e33dd937a253d269ce9d60cc9ca1fca6ce221d4d3d57f0f8f70cc453c7bcdf407f57d877e9d67be21847504b0a2e36d8cfc4e01d842df1c96815211b71ed102a2660110f1a14fe61820b1b6bd6975c7663ecd0e54f2bc69c830ff4a938ce89090ed987ae5d1157170cc074f8fbd5605f8775c4242adfb57a197ab637a427a0f3d8a6df7e0fb5f0e67df18643832a13cf197a6f587b8324b9855a424ca4e2db5d16e6e61aeae9e19d38500403b9e36690df0a9a59e33a4850c7ec5cc9f0143dcb945fd637518076b586cbc5dabc53aaa4ae147c731cf45411ef9bab8d825a6b9e632ab65f999199bb4ca49154ceab73a6761c6718fd89f2e7a1a8ae1211d7bc3ede6957d385934a7192968c44b3066c48cc7a1a357c6213aa064c6f02b90155b711e477736208886c9ecb4e8b0ef5abe21c98471b2058f256f0a3521bd31c5426959922ea5e2380a71ccfa54d2ed5f2111f0fe4f30dd4c582a5242e2309d6a3a9cdad816366dccab7a4379053e5fc1395892657a29478b2d501dc2961108f9dbba494d48bce0df7f14e0e9ff3036c5e31901b53dff87212a0187e43568d7fae7577c963050703628e33b2ab58378731d15e92f48f2e24440fbe22b518bb5f59ca743a0c8f856247c803e199eb1f184881aadc985afd8449f8431fbefd92b979b82a686c963becd15f6f6c1f07435d5ab60f5c3f195af6eb3e90dacf9fd791577a7faa9c753530e2f7bbdfcf0239a3f62dd4f91cd5377befe6cf949f56b9560b79005af45fd4ba2ad4cdac86370801d99b120d4e932d37d185bf31127255f3a8db31c4589e763c4093cdc6a1abb11690e52fc8f4715df831660f5f7a1cf21a4022881d7cd8fd8a93fcb61f483f9279a00b71ac0a3143dbbfd111afc1f967ea6b2227cd625121b03566bd90f0738909e9af5c1a3453c72101d38ad51198bf3381a5506263b89e9268ae8e1cd54f01acda2c2ae0e8a31055cadf3e41a8ee42012d08618ce2ebe329976f7170ac118ae1dae29d4c6a2ece6c99793b2ecc11c6322190fd220090c7771784e43a1e5c59e5199a8b3d2aa7e15937279cb5d931061c986f1cf43181b7bfb599c956afb7139a39745af32174a13b1f3621405042b9f8c764699b6833f8016a886141a136bdbdae32427df52d4acc8cd14d068c0dc11195581b06f9f2b0bd167e5d42df622045b8656971fc12402655c7faced0d9ac8d55f25e6cfbb8d9c91b13a83e91fe3ea06b9ef6111b5148797ddc41015158373a6325bf6fca08f39637c61fa5e092f4625d40a257ce6eb11c05f3dbdd15ddda1806e0a5ed2869e0105f4597b86eff75fa4db07ca60e1f63894cdb2816089223884af53b4337f60f9f5ba544674b8b9037acad6847d5b8c7214b0dcc1979b5d042c90d915dbee0cc9a0b0fc39aa6a9934a27990599a697dfe456d0d95797c8d22fa57d1783ca6cc2990b11d082bd564b8b09ce54024687569c2ae12711b2dfbe0c9aed8a0ae4870b02421db8a3a1eda489e34cfb9b07ed117860e52429bbc0eb0ad088dd9d39314a003c7fa02fef521db6eb1970d18b8d465e8cc4fde7a23db9a8a5d515b5ef922f9b9b01d540636645a7e35cc3402db6d7dd44d54b6212bdd96458585aa8eb468508871c272960391602dd2e4588531ece35cc56dfa4bd207db5664d06e65390824480ec56c18ab5e9a3c6d0c5dd37f605f1a2e915bf6766777f3fe17a8d2889ce0880c3afaab9a281543091fa338c366de34c51bdb9657ec1a9ae341ad83b316fabf427edbd316c7dc6085663c87a101976a37e718094087a6d8aaf3c1613b4c338a821c8427ba82f28a9668f8588cca463d56ced75649477e100ec5005149dcb7e4d5c9b805f0771d985274b7411fb1954b596321c4eee682b92863704af48b1acdba0591994c3198437127c05044290d2f4f3ffbaef0d0fb8692773584e1f1b59553e4270af83b0169a8d26e684033aaa832284785b54b744458e5a496c63bda1a5e986478a803c846122a629dd86ca5390cb37c58310a0410a611998c8df877fca1b5ee9d9630331928fba5071479852ba094e82c1b5cd756688463094a90ea685169c6a606d8530be195d01298375fcbf3ffd35f42fcfa96cd80fc894d59a815490039fbbc882d37336864c7ab2a658029f1a3821fc890d2d90ae8672cd118d67cd269ef20e5e4511b160e554dcf61b1b0fec58b0d08739eaf5cf9e46f0404db0373d0c2467835a12bc42691d69b9e63a708ddde6c45db9387d3cd472550a1a8685b699f1fca7037f57419b16aa6f5f1911da3e880d51026be9a0c4ae2c91f4846697a1e630b64c9f923a6f893f6b8d2d5814409032f9fc3f9cd2edf02ce6731fef91f1f9d1c74af0481e45327918f5126025f38a88abd316993bd16111c02576ca976f4ed0e9eaacc35ad338f9497910812e9c56054ed5f7523e059294d16174f919741a632a089359e7fb1fb6a4f545c3ac5e4d345a44579899f88d91a64344a2df8cdd9750d7940c4a9c6289510160a597a37304e4ae264e7c42280ae3c434439a593badb31c04c6164889e7e69e89bd301ef39919c8a48a49a7c2efb10b7041c4a8099ec915aaee5c3bad2f54bea98cc31b3e079663c11a016ce6629f1cb47a9f90f33da5b291891acb7876109bd95c970fcd850c8487cafe4197978a2fdd5d8070b22b190586c42c1ed4a6b205dc97b6d40fc1a1e3501e5b07a5ab45c4a907d74bb8a8ed415d3f32205ae5c90db1b2f8e8b924e940797fab1560ac7f4a1341565a6657d4976902abdff1f48cfe4cb3382f2d4733a1fb33f4b54c255488b5085eb1e101bc699ea18944e50f9ceb2830d0ec7c20f3629776213a7cbe76fe49c772f42f0442788e4c55efe2098ece66c10da7d69b999cf33c4fb6a9b001da108e1359052ff227b85236708ed4b2d71d48cc4a28161158cc8bcb8e3131b30b87f2fe360e4053a804b3982ce2034352d2902fd41811cf32578003b6121b327d0e491a5c851a59353e65a5a3d357b8e13c0228bfc669566cbe68860b915f27fde7dad6f73ac39f17ad0ceb0acf109a008526561fe4a9e3d3d84d98be8bf2c08ac670d8b9b7011f06bf5aecd6a5ca0fa7b342d9aca18982878b45f67b851b937125f1403a50b41956ed3e411b9e384a283508a0017b06ba933ad39b3786764bc6cd37e5ed088ce9b7fe1e57fbe1669675fead7fba5e6c94b75f485d3374f68a6632a1e1e3d034c6309b69294c063e7bc531b55532c0ae0ff6d0c12fda5071ca06559e0e1ea1fb1a3722c5e264447e0db418816582a720acc93ce8c3e70c9f4d911e46b9dc9054fa0548689f74d866ee4103a2754764ccc1695aece592f47a80c0b4dcae5c284197fdbb63716424f729a13169fe272c1ec70c3eeb5ec554d0d34c897c4fc501792282280d2edd9460363410e74716ad2991d6664e5c497eec7f3067e83e30f0fd3e9eef1546e521247fa0d23490021d06dcbcde5e0e6c6edc868eeaf5632a327717f643a1a534506b3948698a79ac0ad6fb5359031c3f42284ad106a01970730e0efed716296af748da3a0d50dde46831fef496af2f942598daecc14b8b905a37ac183ace0c5ae1085aceea4bb119042ce8a5e46bb996476b8ea7629e1ce07dbcc31f330bf669a95599bfb4fa9f357b93f01fe017e394f50cd7059d9745e9fca8fc35bde26948788baa2f18e1289ff1e12e27e37781ef4ec503d2c6c910ac514d83ec860c403eba82e8e6a8bb0e43f23d77e6fc1815c41b6b3c4e8b2427ebe678fe2b4243b1ea2fcbdf8904c7c72a5cde9802e1c927db06681dcd1ba8173d172963581fb78ba4c69cc9589110aa80eedd6ecf7e2baac1eb8277038963759042fc7cc64bde6967ff1143263c926660dd41568f7c805f993bf16b0c4332141c9d12db6af88a118e447e3b860f7420af1a5d10ab008b862b878f9b5adb5d9757e4accc09c384a860d52e4a431603bdc76e259f22a01b417ba5ffc126c544dbf89a3e56fdcc8e85f56d82cd162b7e761c08133f3094c8cbeb4fbb0014a24cb444f29360f78972a8c95cebe9ea1b2b4a2b15a4824c1f3aaf28d27922a3966d89ed1ddcb74235185d14b5e6c9749bcba747f329bf26fd6d8c0bde1b7148a8d83a821072eab17b9650dbc3a65fc3c8b96ffd278eab6c0428cc738193272fc00145b4eaface5922abcc326d71629a056913df85b454f2613332af046c68d6cb297e521c310c74719e1534b989accf3714a6815c1de53a61097f2166ef43da424844d9600d992cee97f1ecd48874c29bc7fee64d0c30b9c4138b5c8f40fb3fd0ad94ce20240a715124f744b3a915c64136ccf1c613ee53b842e8f2527f8b60d0941cc08deceff1ba411829fb20400e14f740f11765f0343d3c904980da5a2e935d48493c189f0c16f09d54f31789733e169746e3705d130fa7891a4730779e132539d57e151a6a678b47d49549ad6c6e5a0b1c3076b3355e3faf906cb4711c9dc052c62bb62f557ddbdc527b87819f5e0f7c7a34c5307cf9fa766e6b71280f0ce9f14a3197d66349812deaeaae8d7c55c3263fee22cf8bf0dc44837e69c33e4ee67f2c62e5199b1f5d1b291e2319a154619201683c0dce007b3366574ed3074b82a4c967a214c7873076167293b0be438635aa08c4e28a2cdfd6724a15b6e3158afbfdb7110b9542d1490229f39dbd70de0cc7115c0578d54fc28898d388828ed264234be07001aabfdd49b1109efcf6d145af1f13fb0c06d170842ceac02cfa58f874a289ab3a34616175f3997d1984e1de7a0dddd0cfa91951269cadd1e0fa1ec10aaf54bce51cba3cda5c495138c98337236433936e535f8015c9ebad54929dafc918843d811690d0353159ac37a9be7f6351af277e242a24bd7f364c25866e91541a2a6ec81f58550399d4848857914e7b16d35604461fd938bab0d6d5d58ca37f9df3cf85bafa0372e272afeda182d1edb546ebfdf074ee3fce1ee0c7d7f19158f025b5b0accdf9ec5f135561b5abcba40d6c264f852a9774084db29967e3ad0be81d9997fbeab384393f4a6ccf392052482f9b2eb02e5ff1dac09fa46c6d7304cd9cdba7dd237c8975d2bc678c35408353ba04dd73f229ee41afbbbc569a7283d0c46f2861177fe54a80fc47da0b5a5d522ed852c638eaa4f5b13fdb1141a16aa1370a1e81b3208ddc45b6d4114aaa8640f5d38cbc46c5c0e0843cca32739dcc36dde7f1f10d73f175b1207df9eb8b901c15a4ae5f67a41412200efae7039d74e1c6823a4076de35375e68eac81377309f9c72b32d5c2f8bdcb38115b187e605aca98c7059d2032bd3a2d7575177b9b7922894b50851988f78cd853384143e95dbdd2de15c6f8ef251c3485162ce8a38be706abab55d799b2ad7e41a139326fca26fdb7fcdd15bbbe26d71f912378ccd4706135d5f188411a9b29fda558a493f6fd0b12d54496f34280a9cfdaff7924d743af6a4199749b9cdc7114c532881e82db40031fb8d2e58ec1f2b38e05af7d81f0b4bc150024513eb74373f3f3d8c8412e7267b1921dd0aef55e2def1717336d360091864138a3264d2e23d9e3e755fc140e03316093c82590a6f5bb891985e50fd51f7082cc217760349650e87a2a7ba352fb0d808c0d469970b92b496a3d22ab7476c6c71498be97a21eff5c491625377b0798beaac618aa597344f298f177a5b1a60a4d958cc46b2587a8b0389f79f789746d53b6701aa087911beab2ce9751e17a8d67c02032434722f58346c6456d7226c0c7f59cf31d1c15cfd27cda0e2214b24cca28cfc68ab0cdf3fd2025fec065070c41b81382190a1c3e4a33f2c530e39e9fe550ce9c98301d613200f5d1a94563b2426f09092adfdc717d4169c92e9dd01f10ff42bde0cbf8ba9133711bec28ca869e4a623a7dcaa7f300329bb38a8658185c168567c0222001ca053881d640c2f40745b929163858ec03106243ca041ef1b6c19698c8fa0aa1c83f6f802561b098d007a93cec2c1dc11765f88dfaa9a4837063dbfc880164e48b5045d82b28fd52f5d787035ee3c833b0e33c14ba3bfd993b8b759ba3097617b97afb7efb85c307121086cf558418e94dd11a9fab2717727d130dcb6455c656f6a74ca296e70c973a7a86869373a17cf0a406d049c3ff364a04dacfac15c546d2dae56567e92846c8992fbff7cea21c6b3efbfb3f5f2ff3b1306797d4062f4a4acf2a84844b0b2ef46380bd866e1855e7f566693d2f201c9987f2e617b54acb34f12133585014babcd3f64b5b674396c0e996ab3e021ce801ba50ad456040d05d6d0e451dc31c668c7f22da9fc5fdc4e01246c8b93e5da52e1b5fcac9d8a6e0a0879e306b80a72718ae488b7d06f847dae7ebed0d704f0e1abbd5b5031ff0a1e18076de053a36e3cd1f812c8ffbd5d66ccdccd6eccaee955b4a29a54c013004340494042914089e3e10044d60c9034190869e0fd0d0f301ad35ad35ad5b584e26546b0586ae522764097ed5b3e8a65d7446dbc09ef0b1d8b3fa1bae4a2c1d8221086aadc75514f4454196d62bbdaa1cca345f21583994895572ad34188261088a3dabc7624fabb46a551157462c1d30ec4416267edd559369d50a5da813d895aa096b568bd62ca9ef964c166d793614eab46ab94c2d21b89550a754c7d248bd42ad5aae53edc41e17178ec5457409d196473ba1562dd7e9c5e5e55da21097f8ff302e5cc59aa5e56442890fb36ab94a465ec4c246bcb884a0d61a049704b1240813d69dd8c3f258ec69790e14858030fff22eaf126350a105e6c525748126ac2b872ab1585a5ef43571758592d8a42b876aad5a4e21c8994a26164bc963f1b892a769134bcb29043953c9c46229792c1e57f234bd89b3f5daaa657a9538c3ef58751caaa575c7a142d0642a9958ab92b7f24c254feb4eeb4eec0141a32e035fb9323aed95d169a764958665545f9495f2d9f4cbf5a5127d470906149d800f5d67fae6a4b6d6a9c14db4bdeef45c8bb3d51a56f2955fce3a2b09b112edd977993ec6e4f570edef645139854a9dbe542a954ab55241e09e3929add5da7b31d6b49cb76de3b8aed3daf34aa592c9f4dd9c3c1454a0299014954aa954e04ab55aad52a8d5eaf4ad562bd3aae4ad562bee89ce634a7f52b4e977164668d3a9af881f46c86d5c9b1be9d77523f7437c73731c2734356f222b6fe034916dfa37705c1b4608468813e70671d8dbcfd64175d09245904dbf0471d042be0860d906a27dc0b2cf6d5c9b763e5eaf476ccffc258b20f7f690d9738cfd382cc95772b19f4d3f8751598efd6cfadaa8ad3f29c242741e53c2e86caacde96eadbbbb8fe5fc6ee6397bbecf79eecaf96ccf2d4e527f8e079f0929c9f1704a2a8debfdb91db729bd8b431bc8a682edbf41f1991f9414721bedfdb720b739b94fe8964a0cb7069fb9384f38cdcd39dabe93b48fe8dc9d4ac37affcb53695adeef1751b47d8921a7b94a9ef88b7e6983b6bf6de234f7478a93d4df1ae133578892466ef3bdbf15729b1fb7f1defd12d56c4eaedeff2bcd46a47337f5ca68db5660e7f27adc9d39ed7937f6ab68f726f6b0587f63b8384da00c11f98440e7e61851722b95bc9b1e960712b90c15d017a5559c7e9a290b6a8da53ffd892fbb8a75c3944c8222aa345f7ea39548865d29ff1453f0bc1bdc852eefa627fc95aee2d5275074e5d01af43199334b6c29aa2fa2fa129a3224cbc1e141a7067f09d9419ca41fc46ab2e9e9448464d32f8d382b23239317d4227e412e63be742ad5dd5165187d738a5819d5974511e1b0c4ba535fb37b8d7b3e51f46ef28b2c9bc8c24469243f80bc4ececa88ca090706c76154ea8b65b7b16ce9616b6d2c593bb5e3ae17f411e59d6ea5dd9b93fbd93de8dd74dfa950a142663ecda5fca8df1e14852c993fc3ef003d994704ea0705e4eda078503e6c51d057376e4694a4cf551dddf8a3be649069fb9495a0a93982dad1d1450e1bda1971504c86cd8dd30c106ee0f868681ade8df63570cc99393367b6d74534a5c948a0396f799c5728a90d314393432684593497984c38cd349a4e68b299dafe27bf31939832f48d2acd9ccde66c26514ea2211cfa717837f771783decae6f53bfcd6f68b22943f197dda44236a538f38a6cde98493d184b6d88591efa72847044efece0a01000a0e70c670a1cae08003ab6039420d400148870780ed8323b08b043a3111371d4d48800004fc74f006444e868ce9ccdd9b432697451d19c45219230afe761783cecaee30edffc6e4700740f7dc32ee74c936d238a9b683a56b413da8892453737decde561abfb8c7dc74a1c66e5bb4271287953c72cc50d0fad8d349592dc353c6036562245cf9cbf6fce601e0fbce7ac045f07a3870fea638439828c00e61473e62ffab3074ea38bbc88c6a08b2829459100646232289d8dda2852a50a121a0387ab681f8bd9c36f1be2a1b20971e0ab95e3f9c193271e3ee93c263eff720c7798fb9c738e2fa67d77f1c2a4e6ee5e7d9268e193b3bb7bf54982854fad96dbb43d5560c52e6badb5facf29484ca762c4b5569755fdf698fadd2cf2ec606b756ab5b6de9f02f3b9bb7b459d5c52efae548bbb8a056cadbe6d4316cbbd15ae58906881b5b2a8dc5bb46765de1f9ffaf2d7417312a98cab7d7139c1bc7c0eb3e27b37fe5e6bad96a7c4b3fdd6e75c208ebabc3a5a4597dd576c2cb497f4cd16572375cd2efcc9cb5e179af3e19b5fafb5d6da17da63c2b3f2f3af7fe7eeb78cd56c180c1a03e6ddf84f9918323160305eb878912d58ac8851318a0ff3e2e292a136a05c6b91f868a574da91ce2122907a8e8a20c9a0e1cd660de3edbaa873567ddcdf4de4462721d72d8f9692d7bb41b2f8f3a89180ffbec519e318fb4835e8b2fd187c5573133525adbdc9aa6dcbf966fbaed1ce39371b7374648fc47c12b561fd6c4da23f0c411a8254eb0c4878de9b825a6bb5010933d14d9be98cf95953697cd05aaae3a4d5fa0e9f0adbefc755535fd4477d1d8032b179b4d8752c014a508b4d2fc6d35b72be1a1c9486003e80f87276ace152110ec2afcc9014c407215058a08928a4d8e490020d98408826acb060c78502882736e0b66e07caa1e86b41477374d4bd5a6a2979290af804e4f69fb5d6ea4df9e65f0a08e5246cadb5628d0a77af7cf3a324cd3e5f993f3a53e66f6e0efbac29cd47eba63cf6be5b6bbf7ea97dfe4e13b3e803a8fb3e16fdb5ca82cedf5a6b5557fffd7b6f7681b5d5da5a3fffac8f7f6ab77a23d4d15aa7b8e26bedb576d4f68822b9d36cdcbb0b74e6cd330c3286691562e28bc73bef9c2f6b3df0f79bf3f3d7f9f6eb7d6dcef71b6d4e6d4eaa7d25e1deb73fc21d7511b118131b84b036c686aed3327cda0ff1694f82864720770442e70d5d67f20e4c5aed5da22da1396f5ca7a9e7b0187cf34b1e8fd3d4e133d14f15baa0420baae9ba49a554aaa942a554a00a04c1a6efc70c1f37116bd239edbe39bde75e8c31c6d8628c31dec9796b8c31c63fb5fdbed3c9a232c67f350dbffd7dad8fa9259dcf25554c81560c8324419ebb4f1e987071f2e008cf11d997a1e8b0122c3ddf09079f07fd702508081db607fd7065973908881bb60729b9b24b1ba4e4689fb6072929daf3e64ca04a0fdf93567bb19637aed35e698a23c0c10e4fdf29c94e0ef5c99b739e504c26c784d529cf5a9b521da10255e090291d147005ae708e5782156bc5ba172809c10a5921cea1f3216c852d223c0ca192b7212d9616cb11447c367d4d440911241f8bd65a6b96162246d9f483b903142e6d32994c2e97994a0997179717530a627450f01d1395e5c93a37474779817981e921490f4c6cf703a353a9540ae67b30ea44f01a0441f0c5ac8160b1582c716cb55aad51c5dc21869815312b523c39277f482bb48b8b8bcb0a16d9ea80450b162d8cc044581bb4d073033020b5288a22f952a142858a970b27b2a626d363f202c60b18437278b8e23364665190b512183018304cc4ac8725b24704160316c34ef962c8c4e86434a24f2626132b2a72831ac8e0063119b1989dc2f34d913143868c2247e4191a0683c166cc20924d20232323030208448ec89e6c763fd498a95163cbd145925039ccd0cccc6c073292b353db81348043534343a391e86f3b90111cb28e910ab46e5063a3c6eb6ce829fabb771d66c409234d582341467c8c2cd9f435cd32b06163c30611a2ba1d88c8143be555516c6ed8d830d9a576a02239c044d813dcd0738649b72341021a76386fdcf06eaec31c362489b61de8c8066ab8ed40476e8819b962a40acb8989cf818ae8ec523b50919c9d6b8843dbb061c3060e1c2b22376edcb89123470eefe6861d523287b782dd393687d1cfe1f5f0fc670822cb29069f03f5302bede636bedd662c0015ee8789cf1604d97b8f8ea2dc28f6e85e1b746d1421295248b1831dece05e6be55a29808064506228c8de2656ae1db2b789956b87ec95e2da217b9b58b976c85e7bad5c3b14c4817b748f8ee63cba47f7e88806323070e26466af946b9d24d92be5da6b93ec9502058945b24848b52259248b14459369e7db39e79c4854ecb5d75e7bed104ed29c73ce59e79c4944494449444944b53a4112c30907cab516096905760517c9da0bc5de15b4606836ab52a58ab537c9ded91147e010498172ad93247ba55ceb24c95e29d7ceec9572ad93247ba55c7b6d92bd52a020b1481609a956248b6491907e0220234237675d0dec759264efccda9b64ef6ca88a09aacc66b39a295c50a10595f5efc694281d157c37d6de7b31c69aa67579e33aed954cdf099552812b56d8d22dda3f27849941a7f9535ff4ad0c2d2e1880e5b8f8772f302fb6eda7edd813b58861dec59ee38b2f712447152d54c414c14296737db6af6256acd06432ede743f2637bce70569a4c9369324d362b3559b7e74cc80aed6e23c312b3dabae89b82057964dcd979f18fd93e084a4e254a26134aca349f51324a0e6709a60f25e9bf5e2e7e8785a3cc5cbcd0e16cb6c14c4143f725c5403716915b1b51d2137a0103032f3939309e14183017580c578c16994e4f9d984c4ed79a3812f0990c1933c2caa2b1a251036c52c33bfdfe45a4642a045fdea24ddf84059ce0425fb1db5aec61c0833e2c2d4ef47a50c0613140cc2898f0752ff415370c435f3177307d3325f173a28ea13dd135aef002ce76bd16b950ec31e15bf7bbef48efa6fb191c371d86df04311465f415ef0ec5909274fcea8b62293eba00d15d01a2fbe5794a7a620f0a7f82a8b3f1b388ad133e147b4e7896d1c6bf0adaf841ebb3f1df9c2764158a12feb3f11bb1f1df9c9e1b64e39ca49ca31c5bf46489cf0e6dfc338c82f8d517fe135462ca00a2d7170244afaf04885e4db0bb8be993d88380ffc4ef1020a2c403884e5f25d94207ed6464cd726bf87c87d341a8a5d22843e3a4af5481a055356ae092377e94c46f0031cfd057a4579c34b4d863c277e227e2d907abc1f110b3fd5ca6c0fd50ef66be7b2dd43d82cf0088866d1fdf9402602881ce1c4610850ee6cf03bed6dbe125dfdcd6ded80f870571828549e3017446eb348cf18c41c05ff48324f951ec870ef29553c78d6aad5f4e9daed378c0f3f3e4cc3e24b0a70b7b8ee5fd07e29bdbfaa8343f7250fd3ace7dc5d8ae623975102196631f4333a5f1c1b37d549a1f46dff6a01b2899ebf843874d3f8830490f373f7c2e9f4c69a6f947e300ceee4c140625e948e35fabb96eb5abba7ab5545bc0fb7e1853f2cd58692c6b6231fd5ba65a8ccecc9c29e4b230378de9f45d1973b1cd95353a7076a63335f88bfe6c5293c73216824de9634ae9dbb1fc2a0e738ee5cf1c87d13fd1f0955348484888471df5d8637ad33869f951d99ee4fa6e6b6a623192fcb7b97aee309bc2be4fc237379e40ecd7b70f9483d02e730e4984a86a6cc464902f71cfd69cf33d1ba0e06006db9d74096c6ccb9c7f50ab7b9e34e0af9ef5e51752a7250cbbb43f637ca67b2e35b9544c49de683ffb52099a3c57e875548c5fd8620903b96fc61987372f6ceeafe841dec4868c7dbf7cedfbe4a7def4de77a9d6be5f9ef6fde93461f8f55d3596305bfbd458c2809fc732448de5771ac39135babfbe7135babf4ade088ee1c6da0a2fecbc892bcce9b59457a83b8faec128e706840ba128474309db727f630ec4b96dbae7b1bcaf5d7c471df5c62811dd8f6fe3fc3e96f8b5affe6dfcb36a594b21dc3e7dd08d25a93d9e9af637bfa6b9fb5f4a5622f35ad7c074f759cb9bb7cf394b4b6bb8f7de7bdddd4671f78944be9aad40ecdf7bef6de19674be5a6b75bb2d92bb5b77776badbbbb23d1d9aad55a6bad5673fcfedad75a35ed8e628dd2794c49f2b4b02c88a909d941bf1544862f02dc8f91afc43f6e23c3fdb860109cb81fd79e234be6b0a2af7429926d97a24d9ffe70f88725237990ac07b0cc06d5eb61bd5afa332db6bf3700ffd973cc30d4395110c5ecc0572ba5d8035f7dcc029ac792528c29a5948ee5fdfadb8a29543a038ec10bbeafe82b3f2d830ff7d88befc55a38e99c934e15b6d75e7badb5b86e9dfba40193e7a8046c5ed8d839190100083317000018100887854241160449a8ba0f14000f5a76465c5232170824b1401c464110c53010c44010c640084341ca40e50c53a802007c613884add2807b38610ff173cba2eeaab0beb1edf2e2ccb9c512f343ff8cf7561241b144afd16e1765e115ddeb9b439cee38284ce03f8c5b712632bdb616f1fa1ffefb53101126afc9a753d7684ab8e9d45ad26bfc0dee3463ff1592a4948eec27f6e4baa2b826d5952dc24cd541ca9eef6508be27c835dfb3b47fd220704fa64d1ae63410cc30809b7f33a1448b3a65d9336f569813d7112d7b272ee81c6579efad80e40d75246410bfe4402de463827973307d79fa3345054f0f81bd8263ccdb9deb33ee731f911db2a54a71fd6a86d1b7908848a4b260cd3c8c26a04014eafb03215d59d69046824b6bc696327a69d8c2842449495ac443966e7bdcd9c88cc77bfabfd26b205718b869e9ed12c4d595004dc3f2ec02b45d5c895ff1d1a8515e4522ffee05f32cbc93710bee3cf653ac4978b8883a8bff1193c202848e088e05257a1b46483193c0dd0457d15c5d737c1e9181424db2f64b039e52017862ee852cb97f271ccf0b29e0d91f0d11f973d284f92629dd479b963364b9a3a42a35a79eb86043387c02c143ebc9562804a8c33652bb800d0d7ed939eeaf6622cbf5afb058631c91c712151ce1f69b195e232ea2d925fbfc57f2c6a7106cbebe1fb20a1aa69e2dd457612531a21ff5e2cb50b150c6e87ab2be26e27d6d9547c486b3e0601f47ce6b35f193d59c03b72f4fc32688f1aab3f7f42efe1a0de0f581f003089e20bf01295a4e52882f8ba857ceffa5e8e0c531125515c704c7252415796162b3cc89fd86c4a79913c3fc65349a391dc7a66148ca96f98d0e07faa7269b4782b807e0a6634fe7699f2a825b4c3477c8680755c323c6eebbf4900066a90d4584a334c0e4b260eb708def9f0a4f81957bce9d71b5fa8ec64960c03adc21daf466ae11f895328d8e4f1410a4e6de3d1a83796e502314aa42c2957493246ee0cb9d5b2a93df6e4e22ec8be3a2668c89b69ed83393785c85f4ec233d82c74b945b5479acef8ad5afc850e3e6a386f8b42bc1e5c92b3f5e919a08b615227e79ecdd9b8ee9313d489203ed9a7630490e6b9814b50410068d5390b826af5d07e317ad4ff6f1129b0201956e9817c829a7e259140ad4679d02462706345696dd8df065d5632e7dd843fe8c05848a86bac6c34368d1f5f1c593b0286aec1b90d563660a827cb00c72713d736249f473fc58d91823f83b643973ac9f97811598e2a7dd8c231e672ca80c6b4cb2a5945f1eda3c8d957e1f5621a062f6cc4c058b8b354d4a0c63281c6aac216e928fe808d315e5ba73bd737b6ec56edcae19cd813c8fff5c097d12136626432a78d9e6b9d5d256140e7b29685208bd5ced0aab760b25ff7dba3e67fbfb25041e305456817383f97ccf236456e04d8303943945727e231aade5943b87f0569cc506e3c790fef6abe4670d350b12741f8872c1696941b7d9c5b8136b107d7fa77243bda1061a3153abd6f00c927ca7d5aa7501733a1c04de310e80b55e274feec0dd0cd1af642de5a17398df5e16e50766d7cff94c70379a8a1e358c91326c180d6ffcc676279a2ae7d1dd347fd110fa8119c25be313b7f749cd56da7d42115215c287fb68f2a11664e4ed69ed13ff2268fc5ffed8d451cde55f59049d6c379040d17ecd2e164c87cfdd08d8533b6755a250babfc194defa0a65eaaa23c468d332a0d82fe57494b4764b771ce0021187ff25ff280d161567591ece86deea96d291bdce95aa3e8b482c974b5b2930f6d5a060ffa28f511a8eac5aaadcdc5cc78483b2e86ca88fc162870f477d120033e20349d74fa11eefc1f0644b177ad2bb1f8c0b682b20b7c3933717e22bf7a165585af93c5da5180c983f4667e1ba1663447440ea09fc4480ba715358a4c8580b2a3c8305ba43392a2075ee0482f9108615c33bcf070249bcd606a04811a594f710affd78439070c72c023e5ca6d417a7b85dc64fd299344d355bebd542a240cbc848d4f5eb53adf72a0207041289bc72762c34bac91004a063ea544217e542b5afa80f625d558784a8caae1215eb526a89da7cc8301e55ff03ab4d9f5357c8f7953ce17bad5e7f387300fbbd7af3d891172e992a68165334c855988b9c43055177ccc153c4ca17aeb949b9498a033d57951f26d222412f533c59624bf70877720cd66f6b3a2e1cf162ce9333a3eebbb488c6fdc5089a2ce411c706c557153ce2b1d9f4f10742690b9a83983f84eea2a0631d88fec071831e80554ae7689657dd29c07e31046d164fd5af8446f5d72aa67e87b3cc21f999a54d10372bc649d84a67c0f316de509b990142d1c308df1ef2ab93852649c1ad309541346482a49c07fe34c4a8c089661911f950476fe4681aed4d7447ef5865f11aa8e859e42a951e652ed375ba36d12572ead9402205b8e10676e1e4485c93874197e0d1b408b87fbb854037c3c6fd5e45480b41bca44b5a080a9f2a087f7283873ea6f1615a68eb1df4ba33bb1a7427f306535fc3448f487cb33496e368028b65c8accb2012a6bafd85ca92a43f59a23f921aca2905c79dabbecbb3a410e1dc6a4567d2e353d3448f76ea1e67b9794ad8f3ef0de559747536b54452f2dbfe70403151e6a58531958160d138ace928117fe3644d9fe58a6eef8b0cfd57f4c20861bd62d1985349070ef2308d382e423e00b6811e8771262149a0ea87084acd42095c7539f26fa07b6efacda734cdce650563c3a6e352fc32d748b35a182d7347ebb241d4df5a469847839494f3efcd0faa1dd2d8853ab07f907d3d8ea30f260ffae2d42c1af8d7e89bbbfa294be274d40e801a24eb658e309adc6cde649c710a07d778796be1829e78def075ec665bcea621f8ba8918830dcb565dba8929c3fe91610a26f1a0a33b3f4d6cc6ea549d699a257751d0ba56f37abc38f59bcc56c85447ce104032350ae0d75cbffc2a2adfecc3073a9918134d489888ae2d991737a0a7adc2b9e767070169f4b4a0c96914955297298f70ded567d3c56c2c76d2bd60c147a0c7897dcc5b590cdf6241ff8446a8f625c56f6d75e34dd756506155d8be889c85de0639a5b07c2bbaa7ed132317ea8947731b1274e29ba516a2530b971d061165bcd93cb12c55f78263ec5b1f44e704b232d8ecf688cf2bd603e4eedaf1478594fca9b21899c8c321fdfb291c96ffe184f3d9f4b0bd7ee3e9309a2545bcd490636102c6a0412316e7c8638c7ef3b8d4926996ca312641e9fb14fcd84a3e17ec44d9a303b3bc5473e40b129307ff1e4015f26d662974654c85b6e062a209d3969488e3a4f7bd935847e7242d0d04bd662d65bfc7fcaac08ed1d94a158762cdd48a7a668b06f36394853da44eb83cb2983860808742582dec2d4f55645966916b92c231525b443ce254f608ec1ad71bdbc6abd571bd4ab4cc4f41c1c3b7f2b2577579ed67a3972c383afa4c1df281d2b9cfdafb965785d439cfd16bed7da1e82fbadfed116ae9f75d7ba72b532349c0898587e51773fe3d1c2862edfd6ed5a01453b0a7a8da393c4ce27fb5b757680ec8a47faabdd6e85abcf1bc53057ee10eaf0ee7b134818c1607f193d87e934ebf6306c5dcc6a0dea91beb2441f765b574dbb4d4db2d7fe489699cdd9ff864acb9503dad6ff3dabbb4f861535bff87045f8fde5fffe5e344ba9a384aa3d3b2c18591c46a9c2479266d5c1f01d7a40a0f118550e294b240ffe789ae9b5eafdb3bcaee80c9eb429aa21d53ae1a230f1f846abf55267e5aa92a05de4297db929719bdcfa46c989f66e107f13908c34a61c5f63d95b18aa41771aace37b22b5231d137c3fae76e7a4fa154dbe9379075cb993f646568362bc418b63045d047e2c5a76b1edeaa6395fe87fcc7f3c51f8864444a263483862274473345e05e0ffedfe3d76d85d89dd7d999be108da30c223b84eecccdd11a5183f2a82513a2b15ec00ac819d0db73e1bedf2a88e1fab20cc74e7dfe6e67107a235a10896c5c49b71750d9bd70b8d8d35b885cbc8a04c042c987b039b1b85a02c1dd924e2c8af9f4fab756510a1078f936cf16ada4f585f597804efa67a4f9f1c17c85fd1531a1f3216f7890407d6140c8d40ba7f882aae427979f4ea89d33938a0a874339526943f31483656685f0ef034806843cc054209171426748449c06e5960a7e00c063885367c2f7382067e20e933ed3b531b8393f8095f84e7fa5570447f0a071a2e93c81cde10d2a697086489c3474b9e5d00ca3fa839d3385c595bc66b54b018bbea8b3c39b9d0e47db1e1e5f5d94986bfa3a31b9a595908e69652957b86748ee03643add9e1b52c3dfe71db5a0d3f99e8e16849ace8eb018453c59a00e4d6020b12aa5e712403da615459f62baacd83c17b9148e1a19239b64694f5ec4cd9d18d0168c8a240b95be51d4bff68c32fd0019a62b5c82620e1bb386493ac9787d98191067b99391f65635081097b33ba7f122a92f6058fd2530dd67ba5effd8173889124672895ab1f8a1a66873892e0ab0e04e8a5e86860c42818c5fc9d7933e5de89f02356d356beeb75523a0bb1ee1ad9d4f70daee08dd4b2771903ff409bbc5954c7c672a22a55c520004dd3df2560a2ad59042fe563a1ff163229e8add3a81a939e0606465e0bf6cc3493609526581213810de48df73343f1f80daa037f6e94f9d6522372c34fd06a30be5efc0669072c28ab6c8d79d2cbfd0a325d3fc97931cfe2107bc4098515be68b3b6e8ea7746c8d796f4a7df63c09656ef2b17f339a21fa15b5d2551c9a7b3a68eed74d774f37fa7d4770de8e1f4d54ca614b3a9b7ebf7f5bfe074ba7f91dc8bf7076322c64c0f26d5eb4f37322fba75cc034a17fab1f26c14cb094667df32f00c67abbaf59f39080d7c8339819a1556902df448c0788ca0847c236658c77f9c4060b316cdd85958e1a0e988b11b129e5c074b913c4ad2a762e0b692bbdb35785966f89bed2bb5b75d40f9f6e9136a57aef5247e40deac29e43e0bcb042e92d054c752f8ec5bbf4133be08e400c5f443f9ffa0f58175f61071bf1b8b11f56c5b4f88746e680b9d2e88c611f6b7873f247e8e68d9180f1879fdb559b95d584583f054d07abf3c22c2d71da0a2a18f5dc044f52e326d4347d25810a19fab600877edf2f0d52a3490607dba25e143d325f762a1f1cc692afd47bb2615db940f999b913eeea4546a2bf6023ae0cd2d427ab7a7365f705eab99fd3255845338df5547ee69e275abf7a1ec8a3559ada64587042ffdc40961e44cad35e78df8b44402707dcc8aaeabac6680b8bee1c537fddd784345ec8e9323c252c3cfd8b7939797ab637e22a9867db495ab702c90659610f0252f181402edc85b164bb6a2365fb00eb3b17e99a704f3795f0a96e0bf9294bc37e73acb04c4303ea39b48a5d4480312d5f46a3defedf546bbb855113521df7eac27b9cfd88762de1d3fb17e9905346c45e9c9843ca0dcde4c4c65437a1a54898a142e169497ba1f88f88be11daef61764908540d1aaaf14f3058d4ad50085a67aa7f99eb9f61c00c14f55ee0ae0da5d7c9841003f9c93dfb7f65029faa7b39fa9776d8cf2edfc193d86b5fa62850163470898e3df29efb5c6a32ca6bde2367d6dc0999f4ec91913bc533641d0051b659f16e868b8dec11c3e06c827091512a7ac907f9579e1043b9efe70d059637e9d53767221f64d7f97b54175bb47a0c2345ee36fcd7830666e6e07158a7bbc00216343db8d713da29d616687a63fa8e2b67e7c6dab15e96064eb59b115526c8919d723720d66125837a6cf273e61e5a66a47180a48f2d025f736415c20d4581ca834281f0ccf822f619c9ceb8fd6cdce8a93b8c0d15937a27a11c6d290f3a4883004d7752a3a59ebb9ab360496c047618365c5f2178a3c85140c0b3271c10ef5711fa456e3329d146243981b38e62224e46c2375b8f96674ba6195f7653ec3d35e720ecc13243fc956f89a628aa7c808e0ea1c0b02cc34fca863e013c32b8dd8cf5182008aef9fb24941c50f8a929cbaef69e17771140607d74a64f84c6746e16ba6567cab56402ae0165f609c3276557b25ad499ef20d05eec2212838698a59285a7c2eb8eec7b5474ae606c3deae0a5e32472e599cf53a64f95c8751c9856c2f6573edf7e1d04d7e050bdccd0f0d012cad98565a1b27a03aca3f2c86d7c1810e89671ce6e2c1bf5f63b585e25cf01ee660c3b6f280d4e123f6c863d7f280d6e12372c82b9796a462756909f734d0c7675346ce6c739a6647b695399c8c73926d00a94742420e05ef0b3669892948f12f190181c9dd3810323c64b1c345ef183b79cb4548eeea641f50ff3013ab8cdbf7eb1f8c9669c795339b859fc62fdcdf583e640a8f865031c6022020b2e3afda2f69d27d17d9610d69795b7aa1df81bf5dd484ddd835d13ef60d05f68035dd76da254f276ba0d2df7c742b55e3e5590b29d681b585baa3c6ee35d8e4541421720f47818024e9f7d23a857204bda300b3b3df6e819a85cc83567e1b84e028199ce0da63e0098e2514330781ec15d0a7a901a6a3bf0e72dd0fa16607d0b05f07453aeb6859bdf51b56eebeba0b88e8b7a999db607963127172e2bd5ca1db00ee591dbf8dc9041b18439bb7059a99acf60794a9f03dc37671cf943293849dc6231aebca11c9c44dc62132ee78f86271dcaa025c13e1c636230aba3b1197fce3521b0494f27e25e8e310356a0f4313061f7823b356248aa7fb8b4c23330b73d46a22581c01231f0d38210b4f2e8a393d8f126080459df8ad34840d603233f28778988e54a28ed28660e9f6196b9728c9bf7dfb9a0ac7cccb24b0278e66cae40dc1bd57dfecee298e19052cf1b3a0145191fe4f7f2fee4d8e05d76a9aec225135b7ad20f6df866ab9ffa873768afba0ac851512604b91aefc1571951661018967041434b846bba9dd0ecf5541f0f1df7524833ef8fdc5ec2f2497df75a2f6ef3fac2bb8eb6fa08f9114252aff5fce602b3acb60ad4fae9da4bb522922303a7e85ee7c5cf2f4583bbbe40a2aa5db8ed3a5e243d1369cbe47e90a27f22784593516ca4fce7c8722a1337a1e0c5b1f059b41091ca6ef7fa4aeefe23551d36f825e900e6017b39b2ee2447aace2bdf21f43f1bc775a9d2d71d1411e4a4e126a8e17d86195fecce3113d192a4b32b3262052fb68c79eaed77617ae5afd2e4499609154cbf13eb97fb37388ec7999d97aabce60352091bf877d5059f1207f4501df2b49cc44ebf11b63505189a5c9c75ccdcbfc52f5ef1458ec5d05a0e4ca9f4d41754f1999c69e597a6b13a39cfd33a39c59337362e16a5218554aaada5bcbafc3c667d6123360aa0d2fc028bc1cee5f29ebe792a787afd6b8db2d44de721c6396847e85faa8d887897a58d16aae96e40873bb9836c921654478aae956f38b680288a0d14a4c331646c4dfc7e029986a243a7e73014169fe4b0504595aa8a1bce85a9ff9dac76e52ed1a1df7112a2dc48dc8957d12a28013d184f225868b3eaf92f32ea6b38cd2583c0abdc7ee4c2dd10580226ed32112d6fcb86bd10c32001088bbdb138e0ef03f98a18282e6f1130e8c19b672c1eb0c16f3094ca04a6a0cec14b6062d91884787d61eec43b088d2436e2c2a74da5842f5c9752c3d2ab90b553a876f776766552ddc8e67c121a07055f70871a0764aa160ae80d78c0ce5a2ad079a0754bf98c33c5045a924d1a410f843ae7e086dadaa1049c9c2be03962f701de91a6e0cb1062c9419b8fdae641ae7f52261cecf652fe32e327cc4198ede52750c9c47289c7879526e91e9fe0d8256bd708492df9ddb6de8a2109adb1cf83847c950121b49d84d10df32b87af8b5468ec0b81fbb9aa1202a6573a5a6870ecec520fa740602dedb6d157c02fe929104a5f5667225c4f4862424d1961582d8d2689850b6815d7c2909b1c40d633ee5ce4420db336e55db8376c46fd3862ba581e01a5201d91be33ddfde6ed9d3750f3be4bf90b99c0ea44ffc41fafcd454b925c6ebbeeb3d1c3b7866717486e6db56104f4a68bfadb5db07b4f4e82ad580e9957abcb5769f744f12b11cc5e12eb09dafa2e07f4b9f30f7db0fc7735076b2a704058d95ddb9aeb61f10482d101e5823188c78019b071c6679085099f5c2602b2f491c52dc31c71f4839b2d10b9efca791cbb8fbbab629b3382fd29b908c72dc407bf17b72a9570cde5cd2e76b644caa40181f800b8a3a00c9fa5d420ecea36325d6728cf9ac72d0479c22721c1e99e05a2b969ae59fdc1fa663c8a8191cdd08fb92e1cc4dadb0651ed0e19f375f7071e660379d313500b871ff50e934b8a94df1e8b2bd4384864b38141b741b2228c89aac85b484a074abd91d25f2bc4dc4766824f42d4252dd48e28be011d42916fa255f41b276049d734e002aa8deeb35e176c1c69568f5f0146e37a08824476ae1abce4c720bd5f19caa4733b9755a2b83a9077a8066b1e89bdac9e0ee20d7452710dbecb073d8270459d2a2eb4a7a693e045f57f50be79278fa2d1f073325264ba2989c233df229471ba57b13501488b55e3504b5b9443c41022fc3283582ce5d03278b9fab6f9e148e8400e16d88be4fb370eb6b88a51237233194ef63c91fe15c1710300f3247e48855711761104d7cd9dc1736c20faf150cf0a8e49030c1de082cae9b9120c75cf5476440ced2df3c22b965505f33708710d0870c348568b7bd8008f06a534b88c2b46dc28997d640d1111680b5a3362de099ba548496a66ed5bb780b1acea2bf00d2061e6a47f89ba0ecd588f20e64b8146a98ec799ddff6dc647a6afa8f1d066dc006d2b4865d80270404a39322bc8236943272d5e451dde4258edc942a2cb01f5fa237d8b55f77c894190fa96aaba5ec1de8f5a9451461eb1a8fd484afba1821718501914aba2e5f2d955f2233c489477da2601eba8d4899c85902278f8081aca926836cae881b023119fce2008dd9d5af5a4dc10029ca0d38df700a329e0259389be7d4da18780f779ad24ab3ac80c7aa54f30aa1a9330616daf41d0383730b3402cf4b2e8faeb9bd35f4d7aa0b1b29bed5aa64bbdbad93dbd1fb99ef353d3f6f7063be03193d6300fb1e7e425b25717c55386a507dcb3477b7cd858f022ecbcdc4330c528c84fb8ef512b9d8b58f430f572c50c150805d775f7df091a7b2860bbb5737ac4f20b5c0495c06a4a2d03849a51640f6b68f2b03d07361fc21233add22ba2e5c0ff9133b890367455b84d53d0650274efca89df068442a33010121140f90a524119e596b17e1a56a2e8f2d5454f2a49ecaa469936badace88de4b77a6bc98f0711ce411e4d144627a2b34e476fa4584b9b10c632f664df1cf45707617e5e16173c011266f2b0361d486914dccd58dae157ed311fed4582a4f7fe8c94442c8d0baa8e3ce3e49eb0619d2fd4b6bc4b0d6d59130be6d8e42932d59db8cb9c2d2ec8e6d7373b7f1d7e482440dcd0264649a42af2cf2b89d42a520b54d887ba6519bb04310c4b845bd27f040c69b50000df0d409ed821904a877800d117bec6a388f9f5bb86f60fc5a21360f0d5cd72c7661b108100b23b43d986786b0da81475a79252c977e343b0827b02a62823a6487432cb58e0ec4a1fae1c8726df41f9f80c2015cd0060b2a03fa3be04e1fa4e3634c96a1fca267645eb8d541831dde5199173ca1769928119d9ae703d8188cb1d23d1257e5b0dddc286c35fe85a10b836d39eba544a63b8c6bbc9c4a04a749ec9c6a564cc06bdc1e04d269a4b21251208b6a02d3fc1458319a1ac8933dd05e8980cea4910f4cdaf853a709b68ff95a22508df64f908ac0698652953aa5f0174d9fabe8ec79fcf81e8405f43ee27d78da1639720f33b09373baa84d42334494d6100830d924cc2b64144258699e2fc219ba79f42e0e427c9d5cf08d612cd16953f0538534fb8a39936f1dd2f0004592d9be638c485c08a26afa54f81af670114a517ef1743da55ebaed0a20e463451d38c660ef97d67d15f4bf296718fea62d966f6d07ca4b0cbcabfde44b496d4a9c5dc15ca8e13db4674a30707b0e462604d38a54ec20d8df670f21740f2b4bd0c070b9143d220800b82b6036be403e1c56cbf9e6491492fb0c8bd43f56412f803cc6c284ab0b075a3acf083143a41e40538702a0a30aa578e9360e496168a803b9fb08a48cd198666204aa9c0ad5d8e7f33958dca227ea6673f4c2703f52951aa4e350fd16b78f04d017e3b3277eed4856f5e201badc3b1d29c64fd86302e551c1da105486a13f57ee8a044840983a37e52b81a4faa9e17f9e40dcc3b992bf1f370960d984a0345f295f65521dd052755129390223f9b912950b93806724d47c109c3767fe5ddd9079cdbd52f20a664062590e46e0cd68b365ae3f04e204826dfae3833623517ec91b27182d26f35ab6532fa7962bc18ab10de18aadddf77d1ac64bdc3301ecd8ab0160ba5b3608f1e287c002a1928d1eaae1a74cebf91986f9788981bc8bcb72cb145888120f863494c7b460af2863f0eea072af6dc8ff2d3c5005b2c09772793113270b7b2d8abcc1bee3c743a6b8bc71b8ba512abb402a02c142ac0ef53455531c7d2046c6b67e581dea0d558c9554e0446c276178a1d6f07ed32419fb3cfbb39a8d10538bd69611808572c98d7f98580323b416b326539efc1a650341a1db25715c8ac7dd6b1a4b5d03b380d7f76f4a880d0f4753de9de4881aa0c2d0947239e0143847872d793c815ef9176c3508950e9b241649f7aabe641000e09a568158792ac27b5ff6aabcf597c0387ce79510a300af08e72ab985d3b240feee14fa182f57de5a97325b0cbde035da716784e6710b41e59bf039cffe161b8b507f2af1195873bb057954c0ea213f6e41e4cffff1736643dc934d78e05a22587d419b2fb08357290bac83be9f4cd313f9611f4988ab50ff45ef3103ebfd43b02bba0ee4282fef49ed54a78b8f0a11d238ca579dd00c5e8976d85760301fde070e82e46ce3480ee4edce85a8f1f057d20d432365bae69f8399eea1facb541daf99138be8af7f8d26f602bc617f73ec8e736540357b820bad69effe052c2df3110cec6b92f3418f4d2197e748b605022c5a5dc5739b0a0af05436f100ed1310a8d56a41c401a39e6b29a99e3def8b7e6b47bab423719e14b44bed6870c17a1553ca52b17dd32704a8cd1c9474abb6fd1b9c9e17d933f825d75628bba8086a00988819365d064176732d8a29fd7334d28f182cf030ba0347187bcc6ae52c688c7da074ff5f51b81bf78dbde34fdc02ad3964ef5084bd52d69e3f70cf25da7b741fcea2506284f84963691bcc46888aa6350e213219f00bba9878f159eddf05cb63e1d333bc340728c409b9116247f4e02d6b5fdc917086cc58f656b942eff4267f6e9b02046db02d7911e2c538d26dc7ce0cb33fabbebeb7044db3e7d0a8678a7d62004d8babe04d92685890bcb84ef8a9f49fe8f884daf3d3974104e54e5f478a67f29f1ff0b6dcdf66c4ce54224790da0382fb84e01e51ed068f647407aec2304125c348650e6810eac5c6cf606fa8843e4669875510b6d8bfe4e1563fa20475ce7a2daf54a1cb50b4d2421220220dbd6ef3556efc120a1a880d884d990e02e1e808f30873e16c1a2fb327af0e818d8d18938f7ec7cde01c9f171ee07cbdb2f83ac197c7f78e91397a2b1159f759df5bf8d7a79a6d3e513fe39f7c380d4abea036b4f277b8f9d6761f582150d5899d25df210326a573aeb7a33180b37276882240eb302c3ebe2af03277a3527a2f4e86f9dc1c925fe3bd4909566353938d32961dc738725dab6c1e8c2bee084e870eab0ae6bb9a351d9d27861f732f9caf8fba59da33e789bf290c4201b21e877fb46749b368e7273bc364aa2573cb47249fa9f41182846f2006644a5fd6f4fec95fbf8644c6c7eb161f59ab8e8fdbc4dbf596dc425e82f16acf3bfa8afca2477ee5780425abaaa04c7a594ecf7a9561c1a091faccc0dccb1e26cbf553a47312c194064018619df033e9745812843300a43569a59b0199be32d845a4f65c28d3a0ed3a8a62433a3b248ab9264070b7131b41a1e044d103dec353ecaaf17472e799beaca62ff812d99f43d80fcafa909ccba2e47824ea55217f4a777a0b131d2f7ecceb024118b5d00a71abc225de6faddf10af730fae80823ba6f7b5a5dd3436b8da645210d95cd8c1c5ced4ab321dca0e56775ba9a1e6eeecc2c9a05ac8292aab50d7ee6f4aaa54a441d233e04a3a386fdc907b6596427636b3a4481ef779f9addff72d08caa7e9202dc11d46cc81a8e8270617885cd7aabf027d21fe1b7e96a8ddc41b04f6e3d701d9c5399937ece21fc21f3655e0f4e9132aa3e2a33bfc8632a010dc097b947a8c8f7f0880b18c8c12ed87651246d11116e09a5e529750a93a546cb152d76bc593213ee80da0a484220cc229f1a99bdf0fa82556d4b7c95c1b63bd4df2964332e1432c5640a05afb6505178b84cb5ccf4a7aa0b8cdf34b6fc73cf0024581c6f1771250a5252444853ee86a027bae57c20dad1474013d2733945cd7dbb02be22b4f57b6d92cb8c2646765451650d4ec9990699e29a88070699a88e9920f80a273803a5cd220d98bb07122b5d8ad07a9211bdd9f8e0d08f84faedd2439b938ba793dcf4f7c33a37f9f28fc85fa13e56ea467b26ab6d08736937a365ac16da7f3d35964e0adf1146b172208de6170f07838be79f6f95d1efe2d12a888ef504cdea3e4b377e1ed2892487929547aac32d1b063338728d300637afd8e3e6143c90a0c6a864a38a7a1861815079fab1288f29869ababf8b43fdcb6062a60ec89a602007fd48b4b454e8ba701e8613a7178de66634f11ba4e3b3b8555ce272d926b6fc80777104f425cc0ceba725b1056a92b9bfde33192ef341098810f195829a1e762d47044e7c6112cb843bee698d3f186968ad80292874ac756038e4c28917e1036532d614337f3083ba4a7004deb98f241e7897a415857d42c837387ca2be22a4faf1b05381f5934c7d3b5edc4a7a28268b91c84b8a28df977e0534443796686c458ff713094323cb7467084567d2f5d94133d77e6f10242f38819ac3c13adbd197c1cedcedf40381e72db32093814691c12488e56aeab4abc03d407504df67d2c7ba8daaa376a9a7aad28ee525199579e18fc36853ed4c6956839598800bbdd29ebaf5d726a62ed20ca2265912d956a9a96b1e163bd4686c7bdae16619861fc57e7861aac2ed78a3353aa6d11c9f010ab848657037261c984b8301a10c52db4c8ad9106e00820f6c51112528ac19bb15c5c32216ecc8689f2165aa4d658037014a8d820b3d3b864ee9d23f698506f6d058f543f7c37cda4c1fbd6111960ac572b04bde41081beb9fbef8d75008f8ab477ae062be6d50951e5bafcf1ac10bf9cef43d8a8ca648093eb6dfdc06a710a887339f537d23c377bc16622f4ccc5bf066f3ab7446438f9c7f2bdf600a1fb4038fdc4a093c21c911149cd8800d627ed4e82523abf2d8d2d1f9ecacb0f0783c5eeeb276b67b885ca13dc0c5073d943b0f3024c520a7c8970e0f333f13dedc905a5351e7ff3f29bdf082ae1f75ddcb3a66b345287271896f3274309bf5aaec1277797b3d4656255cb04da0d6105003b66c98f9ab5dde2592f96f083a761a734c124f3c4541936de3e2d48702d436e8d5c11d3ee096c48932687c157123c885630e4680a50c723d20d7377092c55350bcb8ad35e1ca4806652d01f3cf613d8c3dfcd14998be3ea9bc6c6dc58724054289f6021e0c7686e0a8621847fb0fb7b0fde6d244a73e75b24dd5a88145d5ede993dc8c84c6006072b40619dd2306cb985207c9d28ba448d3743e67b7248c5d012469cb3a458a3ebd5cee0af66101e236b0fd6f0cbf167f390297ff0def7644e8ec0385f4978f80dcd58fd0caecff58636348cc1ad315556b349a08207d61b506b02a204ebfda62e621401ecf2abac3bc388e74d7c00b0c05b0a7672c34eaf0504763a75d20982adab81ca09fa044d5778512515a968f96405185a450f91fe25cd777e5de3758503ac50a2349568e9190fe5a95960e305bf8c9d5113f204d1a1fce77ceebda52a148116b4b2f3f0d2c5d265b926d3be283ae6b2530eac4e0fe29fd246b7ad81ba6baba0f731186dd346b3ff20fa364008b06c37ff51c99d7da61912707dcdfccdc96c4f3d73a86a429102c0ff129632b0e098b1ae5953334ee5b0115c797f5ba7eae38dfc7e136cebe29adb0603665f5f52abdacf9de2f4bde5d1c3df41819061931e2d5dba4fcba5b50ec1055e2eca5ff6ccbe985b1208a952c4813a6d35288016fbeb9251060a160da18b85cfe8a12213955f4658dd6a452297c11daf6110db57048da85e7f32ce7f821a0aa09d5b8fe84cfb40d40f7baaeb1f8ab02afb9e71b4597851498ceb7faaa61f94112151370d8e5550f84649004e60b80de46f00291c92bb97ed9a005a63d1ce1e410b2e50e15636be6c2970a0aaf2054646b1b9bbc2218a0045aa44f4ba42b10932e070bc46bdd72c4f3b7e7895c97c15470bf9cffb3a02f01f9226eb5f72865158070249479854a050dcf48b9fdcf8ae9dc28822f009f7315024d9a03966ee192d2c8d032f3e3bc141899570af0310b493fc628d92ad90371a590c27954ec47a19c84a27b2f30b81291ddc19fd397f8c145c5f6e59ae283605719105b490d4c8d99ccbbfeed4747bda4977824d6740b876e523fbf78f0ea8efafdaa3a3ce35f225580ab9cb09aebc76646c4f1370a87401faf4622d1a316c2397a682a02c37f5afc817831f6fb0a10869ab08d70e348a97c7abed699ca20d290633a53b3f184138f79a33ccbe2b084526168639c8d38047b97fcfb7d09c9f8f86ab702fe86a7916593508ddd6950f2b32f0f04b142dd4bc2421f27231ad103001a831721656fa609f96cbbf2b1b1c0baf62c34092c73d223e8719b73367e28df23b914d7ee443065723a9d40669aea9c8ca1ce167375c3632d999440a771c9aafd8571eedb48c337dd8b60c8c7b3a1b4d5104f346ccb6981bdeeea7bbb6b2976413919560358129e3a29f369487543c3279e5b5de44a859b8af3ffccdd62fbe13ce908a2d760a7049b5f5473d4940062a401a6bfe1a6a8e4112149a7deff7d94e067c0e37a99dcf39fb96dd18ac14e4dfac2afbb25b90c695fc19e53fd6dd5fa9830810bd91122b337b8e92fc0ce5eca00d54d64f432b6bc65ff80d19c13f28c54e87bea14fd56b20bc7b77147a1620879f20d1d07a262194e134fa08a53c8a02219d868e2ab8495b3efcc52ba18e8db138b987c78362fb17d07de995f9eb223c7f9c09116bdb376b87ede49848858b69fbbd61d09eb189f23baa391659f36cd58c8e190b6f96fb6ac559b7594594980886c85beab2f1a824368055560ff43fe357cdfd778358ec7bd11a96263f04c372757a6e91eeea93a6671e5a3ad2fad38312ed68e0839430522fae9b430aa49aa42db0a3abbcaa31f91d7cd751c50e1a7a9157d261bbde52d8900b1b5dad7e50890b33b22b122fca018ad3cd5b8ad95e03352e8b9f7e8b5859f95058534cc2e41de815477ad32ad06bacb04dcb339075b35a9e0d94c8c2717b12e2dddc85ff3aa527b41bf99692187201115b2306a42d94e348ddbbdd7c8d551d2958cdae5303de3e095fa615644bf2cdcf68bfc970955edeea75f8a408cca2039aaf1e8852106878940e6848968671ac85bb11849b17e89e4fb3b910a6c3007cea63eca3e4630e7013e1c79989369bad0d8224ed80cb20ad905004c700b4d4c70d5f16be2c961694d0e1206964257bef4de49652ca9452ee0822086f0836d5cf57d3b82fc636d5cfd71679f7bd6956ad6e8cd32f51ceb573fdadf55584119d04fbf7105c1062654e44c4ca9e182d5606351c4da0fc7cf9a80469dcee2324c8dceeae9d451925561635af8f082e40ac4c9e01852fac47860c235636ab90c114ceb032d30a945819a6797d430c21c4ca32cd2b961b33384290d65058828c11101ac4a0c5ca4e9ad72e23093e28c3ca6a8441626554f3ca3a98c2119258998d1b9ad767840cceb0321c9a57d782128a58198de6150e29a1c5ca72685ea10b90708695e9d0bcca15e4000644ac6c078f21850f8f21854f5791048533a89804c5119668b1b05c2df05912e2716405134c21c4c2d2592043894c8dd75411789971523bffc438434b8be5160b7f7106168268bcf6146600218895d5685e1f154818b13200685edf08b420c4ca5ed0bc624ee082102b83c1bf10210421af58fa082964a939904082112bb39a572c0f055b00f28a85bf50420a8a58ec09e8b400d8d8fa3636363630d8bc6063636313e1f3b6e961c92dd9eb7ea2c8b9aee185b9b5a64f3a5ad3eeefbd07618c170d2fdcfe6c729c8fdb92f9ba989939cade6c9cc3b086f099999999db8868a81adfb6dee2893ad759062156350d6ada73ad35d671d23422db840f3a84b02164ecd459b9cc96c7b332a0dc7ece50b5fb99a570934afb5cfeac35f7f15800d79f0e548aed27208c53e30cedcfe0468390db9f4516a3fdf4b622ef3eabc338fd409c6b0a4fec5cdb549178b99f89f82c72337333379452c668e110e7323e85acbb1d42d80ddbad88ff3a8ec97ddf1d9df52bbf1be9ff3ac2097ba0fb15af1f7b4769583b2117daf8ee0037bebbc1f15da5f98ec7edde5abb942608bd613dd68cd6beff56f4e953dbc19fdfa1226b3536e421450894d0c64f18271e845e98b63769b7bfc3be6db73d5366da889ce6a9dd9451a9a1619f61a6dab786965dec6959dd7e52d14e9fbde9b14a8587def9d86733db6ae8b9db33ce0f53ed3bebedee3dbc93a65b8625c434410acda9e514ddaf6273be8f8f610f6b4737225843bede55fd1f0f6c1ed8636a4f02f46cc895463a3ab75fa3ba89550a637cf83cb2613d425bad167c2c05181de6c8df5b068e6beeb3413d0a2f9b1abf69d3bfcf3293c984d2fe3df84cd779886182178e87182654717df2e69a3f263c9c9e63fa391f42211c1168fb9a2d68fcb993c3c1390560ce7f433dce8f2800e764b9fd44a78db3f93ddf5b11f8d7fb59e3439750c2d642073980efb13c73b8c4471c40d721d20edf1f8378d5c3f747215ef1f0fd9188573f7c7f2ce2950fffe4fba3d15b61e07b28fedc168a43fc747751d44540b8fdd00b5ec5a2260216bc8a493bbe1f2271101ddf0fbf70901cdfb1359f28361efdcd4152dfefbd00087cd3e0f87eeead947cbfeaad74f825dfb693f25eca0c47bdf14aeace3fa92d83a7a935be473dbd8e8ac3a3aa8de751e92fa9cde573d424bf43ed27be87da34781e6a13fd0fb587de87da33f858dfd5943c519969d0443d54996750996580434dc2a5eabc9b1d6474a8aa53a534474b88b9f0210f9621bbb41ef5868f1506279cf82c877a436d27361c15c92ba9cdc4eb501b064f536bf81d3502bfa4f60b3e47b5e177a81d83efa176138f19a08584e2520c9a88800d6398944e464215f56ee4d780840918bc40875552b52a2b0ec5b4587ddc2cd3622d002601ad0e49c032042af38fceafec2015669c29585a97e6334d8b35869b6d5b5cf0b1deb4608b0b5af043ed25de87da41af440e94bb4b04295183052bf85809a085052bd0f2436d15bc0fb553f0b10e2007149cb95d44ca4105294041ac026082aa433007d40d4dab43126092839d434c2caa0ee5606d6c6e5c4a2273630dc0cd68b4582dcda16d157b54e5f1b1d66be31c8f8fdfe3b31b1b911e3c783c6f4478d444ed331b1b118dc75683ed513b663ab61c72f86ba3c70e0d472df24a6a9be075a89de5692a0dafa31ef91dd5c82fa95d82d7ea5003fd56873a8947d5a13ec16340df2389e7d12738111599944c639c888a8a8a8e18391161455898c660a3531727a213d18908eb02a8ce24fa043414691374962e410efbc2cd505aac0088b526d6d4cd525aac3dae568798603d688d162b0f003cd48d75c7cd60d062d58146ac39d08895e66656fba13612ef43ed233e561cf7498d5fded093c7400f1f9ec70f8f6d75c88747d5a11f7e870e9f1d7e9efce0037d42481cf153990fd0452564e8e20a12d04514e020593b58e6033ca94dc463a0b6cfc77ae36a7508038faa434f1ec3c0f378f23c541f1edea788c9224177811505912fe25951c422aca849507db05dc4ff50db081eea6b8d87ea2c1e6ab3883471252473bb88644417d14418f1a0f9509b04cf4385acf843e412854c4a263430255a2dac08034f687028d161898d86a33ae095d49ed7a162799a3ae477d407fc0eb547f03dd41ee263b571e30c5803aa0ecb7a2b7589bdf20ca839ec7d25b55b330c71400f962b3d821e628607b06eb78638a007cb9506fc926ae57354060840c35157afa456791dea079ea6eafc8eba80dfa18ae07ba821784c08bd31a7eab041de03758915e21350735805bc920a02118440c802822800043aab2a1f1042042110b280200a0081ceaaca0784c0727e49f5c0e7a809780c8b03d070d41fafa44e791d6a104f5355bfa3caf03b549eefa176e063ad014407ec3b5a7558043c107589e5c0e3d41cf600afa452e1e90010191070002aaa1f5382e0004f0780c88080035051fd981204070cf04b2a109fa3e21040c35109f04a6af73a540d3c4de57e472dc0ef5037f03d54291febe96a75488747d521259f55ac08f3b2f9906850ec3bac082edd2e22f150a3d0bb1940d56163f80cd42516ca0ba0e6b037afa446e108d069004a0f9a0d48f161e3ca2f400c37513802741a8032805f5233f039aa007ad0d0ca69382a0cafa456e075a814789afabfa306e077a817f858b7bbd521258faa434ebe47e551b54a253ecfb4c15aefc631a177e3d8100c4a58ab158b5a4550e97611a907f93cd41f2a3ff93e3cf972e563407ef642d561ed37a94bec041e003587adafa45a002b6abd555c127aabf8830df12a26c137fe30c0804251baa385b5ba13d1f5cf2e6053e507c056ac6829891fec0758111a4b4b1670f2305480021380a7f8435c477de197d4269fa30200ab4aaa76a3c5aabd1e3cea56877a900146904066bb6e3bdad6af51125f7c41e4cf36ddd5bacdccb6d32ec720e77abe9bce7ab3d11f9be055447a371db1e038c56d241adc7ed9c539f9457e9160fa19f5cb30b248f64b23296584458d3427a548b7d9caa1eba5d05b5d567627816e9391593ce76f7bf972bb78e6762473fb8a41718be7c026dceee6f2773717f5eceff5c64f59cd937204ba5a46c4fb5e1b83baef75563a65f848088cfb6cee6b21a1346ea78a494d14713b21f74528f472bc081bbceb76fd3d887fd71f852251e412893ca7899cf348e41cf7a2d08b449ec3f7688a2ef39a01f5db1707f17ff0898cdfc674ce8773fdef25fc94b445ba48228d1b5f4748d1333aea42745b0506bdcd4a3eb065a49539eab22423ac468c70a69d885bdfe5cf98718af47dedec43d77f4dd13f0fcaa0b104b594b9f223120a92aee92f08a1e96166d29ebd2ef9d9dc8848db3733d52941dc877f6d36644eb623f1a5455a8113b753fa0ad1f7bdcf2e47728e0715b4f3251fe3395d94f9bee44ae020f2a7d4908ffdac59ed3b9150b0744d2fe59bf8ce1f21fa4ef93cb6dff7f07657eeb30e8673fe3cb4a0ec5c47732f264d38c823c08ddf1120c29dc7542295783b567a166e69d07e2f830145d125639b6bfa79bdf76c67aac17bd7bb30ec9bbb1ac36c62534e9e40973e6b92364d2e2430dccb46275e3522a3959ad190211d07e11c10a81bc5f4552acf46c30cd9358b5471eec278925cd77c29a87bfd109f0f67bde28c97859ca4e662b56333940e99c1c8bb9853471a08d48d027f2302e103b95e859ef3ee83f0c1f71ed4e85b6596d2eb4d292603d89a5a1533c99d2f471aa95243ec9782eaee8635b75989c9fb4951ff26d36b26386b0f91b5b7d8f0a5a06e438824deb635a82ae8ff5f46bc32a8bac309937bd94e3e977adf739f93d732ac696e648de437fe3438e0b7e97ab64913a26783beeb5f1256badd48627cd048a767e3d1d3e9f4ff5639fe44f4d9e99dde1342d4481bd25be9f88df3f8cc5293ed503a7fa37dded6065a1e96df0dca68eeb0ed3ef0410e1ee8031cae6d91345fa51dcf85efafbe4d83f6ce5141ffcea95dd76bd7958455d4bb792ad2780fb91b38381f2acfd9be6f547e37d049dbf8d6b991bb82c6e864da2548bfc633d56ab0d64040a70d687b57bdbe8ac4de460dbaf05ff7663be8543b1d9335994caff21c21e28d72d1b7aa32dfeac69bbe4df57d6ff0df0d2e5ea800c90d2e5ea4a0ca5b99beb6cd7bdbdbb66dfb57a738e09d3b0df18d485bf8dbbff7de7b5beda638b935feb4a91eb41d9cf277b39d935bc3764e6e14f8eaa97372b7bf3a743385a1efe435aef77a7d0359935f55c28fdc0d3b44c80fa87fa773230b3060c080815af610be776998f69e76cd0b4e613e8649d3cb961d3722b3e714a017b38939e7bce075cd26aa206517ba99d3b092a4c71b7982a6e2f7dcd411dbf596982af22e7c26ce5971ae63d1e5ad48c74add6fc473def7d710dddda69040b729ff9eebb6eb9b3ad2f55c6e2150b79d8d4dbf16060d570f41fb916492ac0103a19ffdaca8ceca46a1e868119aad6ad73f4debebb3eb3d0c5e4f427a339ab711c1a0e75ccfd85f6fc2ace986be4c52661e4b30df1ff267a64ae337ef256f3ca916f05e90c378220c28aefc773dff1412fff8d146e9f7e71fc2e4eb27aadb0ada17c221f9e0b5047b9364481b107f46ca36db880c691608f6d8fb33795b0ed89bb0cf78cb21b3d836a459207ee30fad342b9bc104d408cd82769c94e4adb2f767d203865a825993e58d324effd2e5570aced00204209bfe1a48ecb499e69f34ed7bd332db413617ab405a800014e7a4f43fdad47c99c212cea0ddbc50a840bb0622d3405ac8a0ee19cfe240415a8000b4f564814a0505dab1914f4b078aca890a0814321333454cca6f938cb67fa60f1bc1a7e3d75f17075d40bb6eb596076f16cf0192d15ef7d9fe699f1e74cb814c7de9e019ad386e2ba3f29ce97e3d574453f07b2e13e7381f4e726438de6dbcb7aa12f43a6c8eea4bd5c570ce2f0eeb555067dab5df361b7f82366e34511084df44d1c60d18df86edbc0cf6439e445d5a8982b6dab918d75feb1a890aac5460ed34ef742eeb3c9dbe6e3bfa3d670c613c3104540c613c11c63bb795a1433b2e1568fe045fe9c89adb3919277a2b27f17dc93997d6bf38e7605c0c5fedb05e83a2e9fccbab02ed9ccc9730d7cfb48f77ecd142dbd1380a45a973b134b7f3202fe34f48a2feec6e7432f29794648b1097eca7b3b44f7b61f2ef49dbf9279982b618e75e526c24319e23c53871eea5da274baa835a888b737dbdd25cde88f4fb1e6fc7638c1e5d7a8bb9afff9deba2944d4ae70a016f14d7714eb677b784efd25d46f1ae6edfcb08a58c32466755ff90f764082be8047d2fe6f6d32b409e3049504bd314547ebfb4a923f165b4edd3ad2a8c54430761df45edc573be349836ea308dd462ac68d64ab7b4cd34bb65dbc7b969bafa0bcdc52a2bbdd59c94a250ff1ca75219a9c18b641184fdee6d53fd3df7c8fbfe17055a20aa2cb38b7e2893264fa0480982c7870f950d596e3f74d2040cca4a3e7d7a925606a526945f523edb8e5641fbf68641be18754d35ca7bd835a5c9f9e9abec8d6e566dfcc6b74b055473973242e79e1532064287bcb975a819c59f6c87da344986ccdfab52e94be79bd364a9f4fd9697943685e44a9b92df73a5edfa42711bd1521ebc92e237dd01eef3f7dd0d9bb9efbb7a1fc53678880df802edbb7ed3179a9adf73a7109090d0cd5c9b357564fef69bedb60f027e7c20e0c78f1b919b75ddafbbe76fefb7cda68af0e529dd051af86e0fb7227e37fb68e01b450afc090491386978579b9fc9daf5cbd72a151e183fcceddb778b28bc5cbe7c6dea08f48d88e639effa67a7ebb1ae27c3aa5fcd733a2c43782b0b5d4f85350a7cffebf263f5bd8ee74ad1aee965757f4f1df1bfde2ddb14922b0a3b27f99a329bba9e59367ed3a9ebe1bdec0b81762ad585628d26615eb41041cb5f219e937adff7fb0c3a6b6c8082dbb6f34153432f3716322ad0df4411d18e938c763c47a3516adff11c2a4dc5b093273c220ca0db46612eb33333d75c7fa66e83f2f76850171568879aa85963d211d2e900b1d9885c45501b8ef361f3342877a7f19a9a47d1568da4db4f5b6f55a34c8b8ea11d2d738516b7abb15423a98611053275e982887f8811317ecca01dbd5f946ea77a6a86164237bd9304215c82323ef169870e638cd76503286ef7ee656c0163c718db2f29ed55c66d3bada0dddd0d217cb19b4a43f86243f8623784f1bdf9a65c010cc8d45c9a3242aeff0bc142a9e6b29d6528ff99ef0249427fc8b61372f96bf480762a0cc3302137fe157fc21c137c3a9ed36cbbd386695886613a2e1f5591058699e625ab469da341d538c7a79650384306aeaf7febb80a883f19de04136498bb3b0465b42bd058a544a01c978fb060c2edbe8c11848aa230c6fb8e99d9ea38d74f428176aafb638c408ba277e2f6ba2edbf947ab724ec7a547772ad06ec2f9942002c707c2c59faa195fc773a27bfc6955cee900b96c072333ac538bc17fc3d9855b5bbafbaf93fbd751284aa30e101d9e785955759cfb212ec4368b2f16a01032d325ab2199d5dff1c518e16316f38db79453e4400a51c8ba0af415b3f84c15cfb142e4c5878c9656905097db7f4109c5733a951351e5ada09039a349413b269301c6a901edf88c5213aa58c980e442494a4905101946170cb85cc1841959b22863832cca70c20c201b5d9819c2bbfcbae425fd3207bb1ec8330ccdf9a6e0c196197411f4450b1962a4fce70b40480aa416cb6d92eb4d0f5b2d9e9f9f2c5fc2686971f969a2223039edc36a96a9d26e2bf457b122050a1332cce2ed896a67bb7c540512b763231f2aaee36e1214c2739df8fddceb7eeef58b3e1ec7236e628a269334c95875b4f95650c8bc17827f402befcef74e453ecfbc4e9e3cebe4df7603bc52087fceef647a939369bb9e77d9662e3e22f83c08bff90784f2231509dfdf252f699971607c9b433b84d91d3b6443e9784ebf10cff9ebc58b3ba3e0f0a34befe747507fccc567124170e1f52e0c8ec0186ffcc73f640862d4dc5fbaa5e2cf33ef639cf8504acdddad334efc7725f2e5952f938b2593af79c253941d21bcbc618174cb2831460bd48aa6c0833180ccb905bea3960d8410ca187b4888dff8730c68e4fa9deb77ce47bf5bce47cd44d1c08804284518601c99e13338e74ddcdddddddd7fc7279d1d2319b197e580bccd125aab7ed96110ddddddddddddfd2f09a48646830df9a69f3b2bf73de7b904a42e35a6f4d3e0b7dfdf2f3333333333f30e338eff0ccecfcccccca8cb47566481b9b985e0115947d19b0dad45eb69bd1d81afd58230ca8f5398b9dd6b74966183ac684e1613e79a08635cf30dc9759b386782262eb44324a042e88c2bc8094b17019777b00432ee9c94a250ff1c333fbf8a935cdf598cc4f496d9a58bbe84991a9d28fa0dd40d74d906da58405be9fa76db3e970da265458ae7fc8de276ac6466e95222cc164961b2c8a2c4e4ddf4a42c7e5f03137756725672567a76062aaa20830b2131170197b9100acaaeac9934f9d1f22489cd3839d3adce92d3713b3def942ad7a758b93e8373fd2a959190397d7829733b149c56a042de62e67b5d97bc24ac7c55401e64e63a5a9ba169e95603db89ae24cef94e124e4ac2c47378ce0692d20e6141bc15f63a1c44bebf0278d543744be7aa789cf3e939a9fed3cfed4e3ff75509a25bfeb355836a416be39cf727813049da392945a1fee575556e097a35a1afb4dd3a6141e3cd78836f92b54b72e510bf2c274575a355a94c5f7cfc9dec929fba6c11bf1714291dd45c78da2788fe69a0de72fb2fe9c4733ad593a1e98469a5f84d43d142e3c72a84dbf0e33d9326feef4221fc4e795d48e388b7ee94d78ce358ae7f2379b6997bcfc4df3bc929ef46cba4490f13cf7976687e7f13cf715b8391b79a56e7dd20a98014c92fce304b218926d26b05d2bdbee3a5eb310ab49b971d9a3f2dc7653a1c64bbfe4288f44fb76c403b5e72b2c4a71bd0f9a66febf1afbf7c23e2c37574fcb7ab530695b7d34972a3ed925c55cb24578a4ac56d413b4e12656c8303fa3eb7fb2d7eb65c045cde6288a2cb9b4b817633045f74f141d1303472b4ccfc3624f1e5f551dad705ed26172a9e8dd3f7de7befbdf7de7bef9f8e11aa8576dc7d76e8faf73e3ce7b2f3d138f75a08d9cfe5a31f98b9978f7e50847b048599cb47508cb93cb87c0445d05b51ae79c20d89c6ecdb0dd70d9ed3c36d5d3c2e1ed1eb7628ab938347a5a0ef5c435f4d4ba5e577933d213acecdd805dd505d885bc07c4c64a4c0854d9664e25065080be1beefb0333d840bb4e333dd44f21cf8cfc7179d77d3ff52d6eb39153d33df8db3301280414649262d2129193da317c45bc97f3fe4aa50decd5382e7743ce6090769c6799784b2bacc90469009b4e33352e83e225ed26a506343023fca2845628494bc147d495a1af3043046446784b874112a2af2525404a648b66299eb11fb5416c1006159867d44e2d2d77518c5a4084614c3575c85a5d885cbcb4c9816cf728f6650e6668fcda26903353f0ae636faa74c359ee3f1b9b7f2f1a5212fd79f755cff5ff9683338014fa1cc9099eb4f4d582cc1f587507b5b0de3c89f991dd21ec31cd36c14925d86fc6abf793e82398d5f9ce34b733b96b9d208c297271a14dea60ff56ee81528bf1b28efa6dfc6b97678ea7a6edfae41960ad38307526c4599143dc4c42d70af525581049417786995410618ad312ea04d507ebefc88db3f7500a60b582832230a455bb2383203c5135820018cffe490441233609bedbed47b39494d88b95dd35f2218cf71236e7fdf9e1ee431c8df74dd460cf294733fecdbab1590f684bf0dc49b3073bb9ad79b0d7e03a688c1ec69bef549e31a0dabe07fcc143e0821843e02c833f25086e2208ee2202e73e6330d8a79b00268b8ef5bdb2c8a7122b49d81fb68988ba8f73452eed36810f74d9ec851c68ef28f0a4900c3c4edfec9008c09ae00d33a83839fdbfd4d41963d3127a5d0761042f810c27eefcdd41267f9fbedaedc21b7fc6e1c4b3becc1cfc852bc07e0a0c54737c812032d6e60c41347a0503e5b391981beb7c2834412462cff1f44d8418b9559a18c110b5e5d40a8ba10fe0e9fc1c58c11cb59b232cba808f01aa16174f403337ab0050aaed042fa0fadb9fe5690e5cf431cf532b882098c934ac085153a38f3458923a8a8e2f4848cc92891c6991f2f9060a208405408e160b9bb9dee41d99c8106505041128ca43084c47a4938e1c1282fd4bcece3aeabaeeb5c67a3242def67d8a6d0f27ccacbbab4dda490cd3033263eb11cdf4f5e50f89d14d4956fc673dec7f7249f14e54456221914cf71a307453a81a202fae4592862e8db3849a65ca47fc2ac8d17ff8909e3ab664537923aa03c7ce8fbce8d6ebcbef32425c6893f69fc530f2864a5db5f6e7c4fca7cc9c76c1fdfcb780ea655d3cbcad7a1731de6c625a87d41e7a414d5bd93b782acf850b2405f119605184561f84646c55b5755f9ced637eaade43ff6995f5aa03ea6f93eefafa0de4ada14fff56f056d8ae7ef986c8a5fbedd79368583fcf929b63bf2676a27fef5f1af1e16f6b44b0bf46d3934ebfae7fd4e297e9ebe29ed77de9b7efbbeb3a6f8af4491fd15d3bfbf12c56677e0cfbff2def4574db14d691607d3bfdf31b132bb331ffe1568536c51ce61ffacf9272b688a95caae5f62facb5e8962e7fdfc2bf04dbf64fef597bdf27e3eb3b0eb87388651d5eb22e3e7e2065d6eb7562b1b4aa051f8bb753b7e0773fbf6103d97ebcf64c98f75c75b2c2c9d10f0c64f1d69a11bedb31d96bb4359b28b9f3a82dd68a7d47826c255ddaea7d5ad2b6fb4687fdfdea6fc14ba9435ecf61e42ed10328ebccc38f2af4bc616e3c8d79cebb1f48410376b7ee65a347a2bd3cfef6dc764e7ec1866ed626841188c60307a395a8c737d8ed6bd1a3b75425ccc88712ecc68b65a465c9e39a973712e3d41e6f6cbea574c8fed981eb36c837a37f1676a4e239e136ffc1ac0dcf8493c67bbf1ab788e8fafe28ee7f011972d373e47462273a32771f1e2765ce6c6169724dc8ed3b891754955fc187322156ef413dc0ec88d26b8cd85dbd5bca93e1ad45bbd8f6f03b49901c3e77d056228be141e7387780849978fc01873972e1f8581843b842caedfa31f6cf941d1ed8d49f7e02d16db167cfeee022bda16b4a9252c68ad449103b3ae60e1312cdbe231acfe4ec263e81586004633f75ebb37433b8373fc52ba1d7379b3628c276c614543af20d0ee55dacf9641472157dab38e535f716dc5b99e1d34e7162430b878b9dd42fd53c6d63e73148ad2a09ff9cd5c9ca67fda9c0ff90734cd392d15ecfa6e4d13966576cabbd70ff16e75cb3993d5aae637fdf087be9ff115e0fadff00f1f3b977ccf33ef0de3c4b0e4ba61ce1fe7ba92ebbdf72cc7387e7377b8f099f36e3189f59bd8c0874241b7431ad4b6d7d1d188c8e6559955a39b691555b8f3a2c1c5996b9a7eabc9b20ccb30efad52e6e06b958639f85945710d73f0bd3e73f04d55e3c99039083b29f73d2b379e4e3694620b9e8e773b11bd3ac608af772a578c505e3142795dd76563845c85e7eed3dd83e69c33cea899349ecb84097199b60e5c73ce0f5c87b30a34fd7b1f2698447777777777774fe90b3308fdc8d9773c4763cedf9f6f7c8891f8cc9c3f73cc79174411f6242c89e37c30790204e9bea77a4f8cfb30314f890b2d9735413bcc0833c2c23c882569f1de0d433fcfba9ea72f10ef5e5588dfbc18df7b526809a5bc2e1510210efbbafd917fcc2721a4029f67dec838fd9cbf84363e09218416324e3f17217cf3dffb98308e8151c6cab761901fbcf7de7befbdf7de7bcfddfd6d98732f6273a758b9dd704e34fcbdf7de7b1df4de7b1921e783bb7cd50eaa0da4e5a7b340e85bf0f7aeb762bee9369dba2a774a156f8d0b86114209a310c7227bff8391f4e5f95cf085991e978fac38413b8124c6154920a39de8d17197d3b840bbd9aceb278764ea5809ab906ff826feac347c13ffaa1adfa06ec773e78517da29407c7044ac7c74b804ab98c5af06e7bcc9fbb37c13854869872e192d10d55b5dd688d339ef9213fcd1b99b17f042ffe85e405f46d113d04703cd02be7ff437ca99991b8c9ef73bef3db456acf42835d0922bbce40a3712638c9134274571567e7eb27c09a385cb0f1051111825a09f9f9f9fffc2fd645ad0ae5b3f2d1f9e20deeab24e749a30928e7ce208fa378deb4eb843f0c29b5b1962641a51149dd10afc6859aaf7fe2db450fb3322c529b6291ce2cb5ff21eda2b57a2d881ff6c8a9f59f2afbc8f36c576e87a66c567967b4555b6ccf079119860c2e48e240673c7904cef1786a4c29886ce2fb14cfcf19cbef05d401f920d5a97bb8ce4e5889b3deda2027fcfe5eb9988f14b1118ae890ce3f46346f18b0dbc841b55f2bd767d7b70f15af722d2038976aabbd1105bf7fab81579c144c30bd764e112e3f41779e14e0bb17f75087becb18a89f19baef34e0ce98a02ede217a488d4ff1c756b2415656c337dbabbbbbbbbbbfb7cdeee5af48783127051c5ef67f256d7f712ede6ed614d49440fabf6b05238c8bf7e47fe65ad44f1de4aca9f593bf0a3b562536e290bf52e2cd04e75051aaa25da71ae84c7dd4d1a54f3dc28fc52b40bff8a5de4624639f7fc06194b4229e39bf39a9a13325c3ad4f4fc5b2c1d61f1a5afebbab84b3281fef571bdcd50763dd7eb626677beaeefa4bcc33a3fab3eec9f3984d7e5261b85df947d766d4498afc953da47627a7ed904fad78a1ad03819f406d307a168a8c4cdf644390a159a110000000000b314000020100a05c462b16844a289c1ba0314000d80984a76589a88b324c861148590320410000030004004648666241b05e8867416985005c033236dabf73ca0a07a7bb54425016e1689120c3026fe0fa0437bd3d85637ac4d6e83b15ab798c154050517a230f2e98bc988aad370b0e202b1df70fadc7cc48e5bbdc465473b614cdfb3b5da0023bbabd424b42931e3e4aa4258aec408c1831b12606db331755ec562af72c7532e4da4b93a786b0994f627aa17cc493107d25c826ac31683d65b24aff119e4c8adf9c1a73afa2d0fcdf007d5435bf4a3a8dc78c26b6f614e9929fa574557476ab9c7c6325063a02898c8ad506fdc4d2f619671e7c4e179de0f38491a773ee09fcdae1de8fbf8d3e3cc070a4de3bf8269b4a7e17b7f45d5eb95c9c5c6a17c1004645feba845c95094daff16fda8127f8e5f715436144ae9072448f1f4680cb568dc785e49ac30ebe87300784959583331cff52b593e06c812bb85633e3e4ea8c576252bde7a335d38e6cb9b5c21f91ac8c8fb5ef4a22b1fb65dd131541f9a5daf0cd7c350c1f0d28569cd0408952ad08fd913fcf67ea82cb367d847e251e99b1181084cf3e3cfaf685ad56ab3afa97a43c87ffc8540f25c315194578491c18b9606e4e61c67034d89fd338096e5930a6b87cc95a38d319704904d122fb268e3c79b0487c8180e602e9d5c2dc9533943643eff54bab0e4de1bc563cf7df25f1c88c9aea7e33dc101bc42eca22e6b7537b80786ab08d127046979db23ec707a6954a5143f9460db75e8c4c37cc45aac805e99c7068e7317d689bd454fe80b36738a58b94fa11985dd86a3b4bfc36e894907d259ad1e88b5d1dc9e49c8425b21ac10ce2d9777ae12d86bebde8703cd0f612d1bf6acdca32414d423afe6a602390fc8ee2fd0284db09a70406eb32e62acc8c761ccf1542484822df0512987aa1118222dd6f40c878dd68b3626f2642f4324f1d0814c914d6d6e66a83911a396dbd5dc0275005b042e843d32589c7224134d904c54137f606fec202f5c41dca22403ba3a18aae405efdd1090aa4e6f50662e61460b2b5a4a18f6f8830d80dd53c44539cfd0d8b0b4dfa39eb06ffe3f0d1592b5ce2c3ca5039684a890a224077ab584f01ce1b70a4939adff9b0420d1adb17643c2488fd9e93022c12a9248a9e3b171ea2835a70eb28d046de133efd5881875799896111225cbb2c2c4118feb9bfd7551059d8cf7789a104e519fe259c7a1d422519516e1d0f2b87a64f1ecf523cb5dbb8c0f4eea1f85a1cc93a6db89663983df937852ff26746030f55a7f3d07d77c7fc6ddd8b1edb6d495f29b0351571fd71a580a1b95ede6d07aa4c109d2bf43669b6a7b8046158e840281cfd95ba959b77c06b1337421f975687d8ec30247d59d4e9e9024387d74d81f07ba8ec31542fc0c173fdefbe87d944ccc0de723e10d90febcb0e6b8100baad93d3cb8471d9d5c1f0274aa316b35a7ef12accd4b3027bdf38fce4ff5d7aa962e2032c5d0efcfd14f78b55e0b51cefba0071c35fcb0d41f04f2bfe801b8baa43d12da85af3cd08f4d117eeb5d03a77dd27a0cf742d95fcc6051db958b175a151bae3729421c0448a125a005e593a80c61f47c8eba74b46864ba06eedf384003cf188da071165a590c54499b1543ed72cd1d687c85086604b662bef71044307403e9f06db4499a063275d1928cc50b4c6f5b841c4b24a3a01285879a37bf4b367babd3bef680133778d5c77b8131bd020975ef8909e1d35381814db475a89703d725c936cc73523fbac45c62b1bc9508f8a005957021d0ba86861747f11e287b7d70b00c85e6442c2c717a46668f227ae6f95e643087e1f6e938d60ef1ef855ce4c09e01da5016f7819ecb57f347c8bc2cc1ce19a401c281d3b686d4d039905cace59d5fbe54284a6fd6a1de33bd455690e06056146cc2965a7d70b9ed25d43c191528a04032907d74313c031cc8834d2c9d27909ff1de55582395683cbfd315ddb02b0d9f1b716b2e62bf7ed479b30f5e8501f306c802108ddc042993d0d2e69913e2d35f636851c1dbabb2dcc466a0435df2855ab28674d1368661a728762c7ae79ffa2bf72f5784af456fff3d0310bfaf3ca19fc82645f8ffbe5201bf7b07cfad46b5143e0ea1b6e25a426d2800345a7ceb6fa60c77fcf46863665a120b8075c44eef53a2ccbf7b0040ae8390e365edc94d20cf2d7e5148ba834efc0685bca90f7262771bec30b22e63d066be2bf1b13b6d4e142896b453bc457140e70660366176dd0a0033ac160ad5018cb33483c79d39725c4758cce6f4b0a167bee77b97a7be7fb17d93c4344c0aafae3b01b54998b36b04e385e97a72054905a2112f0d880aeecc02a6e5b0ebf0b4ee2444c051d6174def3c9aca53b3e021e064535d363dc99b011d9086a19f36b2bba42ddaddd4215a1e0b0f3f3dfa6127719c3cac0e7d6f0b114b1f09682184ae9a9c9fe935fb984287fb6b00a59946ca56e0e0438ffa9ecc091601377113916b9c7e1926e011bbce5a9c23c0730a286b1001112f139dbe6f8f0c09624abd12202553b7e5fd79f4a126ca84b827e733d730a8adcc29e032b0ff00492f59764bcea85bc00b9006ecd9d6c8c47752b454f0b11b450fa47cff4d0084f3a87c8a94f55e8cb1d97e1713f56b879bd3aafe5d5e9cf02eed16e81aa439342a750c8dec957cca3798ed5dfc642fdf80289ecd41ab078b13dfd68132d0534e8b661ebfc7e8a9bd72b4899cdfeba45441e544b98cfff1884e04fef696b1eed24aa19118fd2ba2f715b1161f10a039dc8021c98327fe51501011fbb6e4de45d7a66fbad0127e8c6a5f412221628bc3da4947814b5946a427f17d00053bfb47f37d8efa1e8a8bfffc3bb0e6cb1e93fe02dd4f1b71869c9181efd3840f8469ec0e6ec367f19b487803beac13cd58ce9d9bcd7dec3e84bbd6a934771c632d740dbb80514e6a5e736c7f5cef532678c10a23548df4c6579780d548f049a11d6682b0cec442bf57ccc255f7502444e793135de809d4b8489e3a8b927fc0f52f6d18f05d9c7cab9102a8944c10ef44d32e21b8a9a1f90b93bb27ccb672e9ec46ef359750c0f43b72c9b630b902ac401357ae528b1830d91dc08a83c875e51c3352f274c8397718809022c8c862dba1978d0a84d3cffcf6740596a2bd63248fae800dcf316302b928dcd5eae7a25a7e945bbbc76cb90e0caee490219033be32c623f791b52dc8bf61f520100a3062bb9c49f8e31f1054ad8c5d11a7131a15973ca14a61de261e11cb21e59c23b236842741ab54eab5d283aa6a17da3e022710724ef5d8666ba2d38715ec135aa475299d70b3c5aa59fff4c2b4b9d6cbe7f5ffffe8f4320d83fbbdffaf47a18a452828b01f5e30551f08a72746c445a94e0a9dea689ec8bb7a1ff7be0829adf32784ae170b64e97951a58c00dd46227de0b52fc02128dd36978e959964c4072cc239c409d0b88a449c63d8eef0196a9440debf0a4b7278411783c0151941a1b6336eb055913b30ad11c615692cb65a00d504a93f0174d3a6081e1d1011d68f562c50f2ed784679ab27821b9f3e95bbee3bda84c2ff0cd9cf85e783b3964c688aa6f9c88731ff489489d078fd3051ab4d9f74bb005a3630929e69082892de9f280b15cd1352d9038e280372dc8bd0d4cf13588fc45c0f351cb4e1a0f7579b9e9beff91b507de83efebdc33238592cfe2996bc95134c20da309154e47d06eeee4706283835990e4dceaa434110a3995e213b22026092b240515fe1c1344b960600c0e92aa2deac1ea15172019a4e39c481bb6f98d2ba1d584bed44e914c7f2e8dc80bc50fe2dad03c33063ae6eee4545a90f1cc090cc49eeb129d7a15dd1703de8c704485abf139afc9cf7022974f476f1e80e22c519a182d343ec2f2becb97db6e8066c8a067a1d96e446931461c216717a81a17a256715375b2017ef998bba1b44e7ac7b7587b074e0751edc2b734d9b5f27a9744e0644f843cf34e20c2e92dccb637cd1d513dd43f8563814995e9efd824cda59bdf4b3a3860aa8d0dd212f9d3883b1c3291ac98fcfbb1ab4139cae062a0f5273c34d457e7f539f221226143c358c89984cd34443ba23aef2ea176db71174a0d7cf641e2692132d017415c310884dcd850cf248e042f6659cf964cac2cbcb3ddee85dbeeb6b4fd418a8feb6088a5382b90df466a181df2bf46a4040e685c793611da392e803f5fae7cf32e3b4b5a82d29ebe6c45ae57234d3f455bfc177e8e343421e68fdc06fcafb296683710936d932b47d2b77253890f06005504860874394104bd9448ec8e824adc51f92c20ee05721025ebc2e81e93bd7fb4702d94c5440a7fdb6830ca6d1634b6c2540a2a7c14ca548eb16910039508cab07d0752bb6edecd613565747b40bd5abdceae3e5d6d2377fbc016136109b39c6a5e78edd7c53dc2f242425d784c78206cf2ffedd0ed36f08f02381e15eef6fded6339e5fbd680d6d6a4864469edfcb16920e7ef81c3aa430d2aac8e35fd3d0fd6356cad56ba7e0032117ae536ac2b2eb010db3a100913615ff089cecb103a399116584396361e15360a5c836c177c837bdbe7dfa9e272fd627c0790c8708f6e90f82669a6c136d4186ac319aef60118a70522a45f4ed46d3c81208e521a5ad94ce5c451cf0a0b22a79edb63259470ec01a62ee41c9288953efa4438722cb39db32485e88f78b4f2467e5b843d2d0edf506d2c49209ce365f0ad27e62735e0fa09147f991f6570a8453d993f74b16285a17838a38baa58b26c076dfa121e2c0206dd99d755f80b63c775c0de2bfb0b873504fa9a6766ee773258d5ce5a0070b037511c4d713dda0696858eb6e6d0f2d88791040fa284f12bbfb0d213212ed1093bb96f294552e03de0bc73da9b5ebabca496db889f47c700891c18eba3468d9637782a9ac20944e4456055a745518bc1f71fa2283b12c950619c42d9bbe1c20304c08312c8f6269d3d9ece930d232e7c4a3811881a99ffc42bdcd6f1dd547c85bb7662cfc9c8e1ab907461a71c15e9ee5547c8bc52f917f9b60bd1d2976c71f1084c70fcef7509e2f8d35640380f08939e5d32c281f74ece1aa68ed3c293e4bf86bc0624195bb405ed14bed8cec3f9a1a04695f31ba86387343adc4494283868f54ae9aeffa9fd0225cc711cd19900e622cac7a80827ca8d60e7f45392eddd6f2040dcc39871830109f07c0c3a281f4840b8c4fc5e1a4f9392a208932f87f73b7dc2a863d96f32fe01450c0641ad6f4c991d0e4756e9da75c50cc1cbb784783766ca31d1fcc7463f407d9ccb4bdbfa4e5ebd8fa67fb45736bcfd799d33995ca9eac62a0701f2805edfa9e127da21ad30d59a530858f74e02661ecbb2cb4f1f41a50c4ba2dae80bb8990dff363938bead282acc07bcc5c5009908caa989fb32c8ecdc11d00dfbfb6e5fd49fcf5d251242af0ded9c69c99a6fabcfcee884f10b2dfcf9babbe82df42ec50256c6c7b44bbac19e909cea38c14cc7275f8d3270c3ad6f09b1721232e4a2a46664b0afb195f9cae4557914d842a620aeb282feda0cf2636ff60a89c9fada8b87f2aa7f2a1f840024ab4467977ec258f70416a4456a04a58d1e0b4492b8b36c6f9e4b9ba4942e0513e2b598cb41732bdb4224f88488987dd9dc1c8d8899319dd1ec358847631b3cf115d5604c80cb551393e19e4712b5d635774f946532f96625c114d504d55e42db373ed4a6f4a7a0fc220fd67888c91b064eef26b65b7cb8a4e0c0d0f8d642439f7f456171e568ee943765baf16b094bd8ae5142be3f1daa5c48ea75cad5daa585040160427151097baa84eec994859aa652c3d15a7e53fd74b4d243db6cdff35e58f53de8c1faa09ce4d750e78b46c6bb7b7076dc6b6819e17345bb5046ed052eacee65aef4b95b84110ab84d9bf92f4da05a4ba71bd7fa3c2424f3d486cf265ad8c4d124839abe5afe0a260ba6022f6653ff57489893dc8a64db22d6f190df8a910fd35087fb6ba6e36302e0ac1b616b3737f3e7b487fe16b8f8d2d97962dc741367f698530fdb7d427312b2052e80dfea9d69c00b8fbfb238b233e772019ed0790318ffe085956204c56153a341d80b61bdddbfb557ad9d0504927f90c591d9a5539041f3f65722d58b334c9c0925c848491d203b2b85136431733612d5260108319f0c2bdaa3af054398cf79c6b05bec515d5a67b145b865337cef85e7441bc59abe9bd000f4d8b3471eff0f44e9a5f9baaa9a3c8e3e233fef7c0ea621833f97100e9d33668df9754ec993d455f44e4f4aa2593db9dc27409ce7a606c082cba9904d5c2efe0471d436f2a9ca51b3c9cde55254bec0b9b02ddcf4431c12f7aa8280c0e0417fc6230d1d1c338efce28e11371c6c61f531bc8bd267b6addcbdab4126c2e6de06fddf2b43fb503676d0b55f9c2184b40a69b673f2b4cd3e974530c4f8d0078920a8c441cca7f474cd3dc6f81c29dffa776625331c30725861b64d7d21bfaf5fc480e54ca8da4eb12fdeefd0b2fd577d74c06876bc237a80e10359b264b5d11e420dee79871da6eba25d37d34154d8e1ba9d2536bfe5acd968a4a980e22cd6af1e545907c65c5b7ad5bcd2e7bd7cfb98b9d1cff5d6a8741f80f122ab0f960a959db23148b15906fc6e1a465c4fdc4bf3626e8e0448367721ab45e8fcbbebc0a8a248ce0906565688fd758a91b5fa984cc9f9f692a5b4a8afd5c4c25af7962583cfe795dea7e915de4d407505aae8a75280cc6ca64bfe7acc2d6eec3f55ed2e9314a06470d6716335332913d4af82772f2ebb5d1ca9c713573ae7bb9afc376ef7d638e5473843d34dbadbfb5be016cdbaa4eaaacb51ac0b04aa2cd16c0880710ec7a1922fde87dcffa284ec6c1c579f6ba629f8d36401eed63cda37c73809e9c8de47330a2f58bca93b91708c21090dbc3acbada6aed5d36a3d2190cda54ea93a2b91fe5d3c1c21187204f753e3c5604470362da365732fd86d8d99e629f72e081d27c7ba1c0d030dfb296b3cc69c3dbd3fcfdd3b5e69863eecfa878a5d01822b239c6920cfd512c278990ec20b944cfae0edb968b6608992ecfc062c5697b1aa97996b751c118fc9f2e9beda28f877d7e1030e3ff3f111c332328262abc4575e0063c6b18c6889ea456c916146eb5ed534b029b8234a5ddf4d2d60d8a9c7470bdc32d735182c250879d4389410be40fe2f5f06881d64c74dbcf57de9572f5765f4d3f0f02781588a6878f3f7efc110fee43cc88269afd8ccfb252d305dc80cdd45f08b435c77e4d5cb5ef07bf7f3a3a0a14d3d79801b16915e3da2d1f5da420c379accb963455744206e86a5aa3ea7899a10b76e4438b7d9da0f860237d57beeff03e48dfda004b86acbf75c6ce8899be6351dd2a2de9ba6b28160c7726c6c94a6e8920e63d22ae7c27c452d7e0f6c667dcc6681ebfbdbdfb8232cd17dd1b7c45a69027db0277184eaa1b979b9d86e755fc94edaa46d2106bb0cb0c918e83755fb7fd524e7813e56bebc2a890008519d0d2c08832a4c30d22e1a4f449dce30538102f991221aa0020d857ec1bea481f78db163c912697fe0948d2ea30bf413264269c1cadff14a06d5c42eb51d4e1c4c7f90c69a020ae9c26e7e0b5c4f172b206fa9af09164fa2d15746bcbdcceb358797a5893cda83ddfee2e05ff79732ae5308b92adedcc595f4704860e50a6cdeb51a23230499d633765f1cf8af87c5d941e7f2b4188f2c6203d15658e34fbd4d0f4d1809a76bbeb3647596246c27d43b47f36524ff079e51abc13e6eca46fd1a5bb7228e1812b97467ec1df479bfd9717707323b49ce7b30049f301e03a6a96a28cda54195fa369af3080553f3ad86020e642c8ca6ee360be0650da6c5d638e44979fc292b149b9319e9917b8ee0488998e4d29b5088832ae0e5111452d0b47174852ea76d50d9a7618ab411e8eb3b06f32f91bca72eaaf318335c5d4082bbbb3be3eb2d67c502d7e6693f6e53e6b58581f5145337080a529cb75c8a7d9cdbbb6813de505442c0d4c1ed6940c5cfbcabed7a172f825a6e9886cb6279709c60f4ee93ac49f8a65414afddc21498621ed0e0f904879528bad87cd0534aed430819ee74a4e42e4f22a889137b4d17546d14205881c6d4cf89e535f8e1969d5457a61ef49b1b1934e49e9a1405451207dec7169fcd672b183182027cd4e53d2022db34141bc8aac109ede0a3012f371984be9d6041f028a9712b834c8a6fab3628e8764b576774bd8cdbbe86c0d58f18f242c8afa2ae0c44076b4680202102d879006ffc88d7269271f28fc6d40cc4b1e6a55de0a5456d32b0a430d7451f8c4c2ab445c41330764b63675d4b1954ba7fee9347c2c8de8fad8fbdff87c9ca843615e1809a9a9067d0e51836b7b5e2935a3f68942aeb4f6ace2b9a63ce346424cca3a357dd7dc98b28a35453ee2abc0534cf878aae0daf491fe2a072fa2d5cb8ecc73c24e07bf48623e1523b292b8f8125a246bb42ed29d693802dd8268f63b9b7384735841521f00c81596a582aea9d2c3949710f948ac62b13323342e8b2049110e83c51a71d2adde8de951988b5e46da21a0051ce681da32a614344c6a8214585e872185dd9ce8aad29c156fdf18421c8295ecdc3143e426f8a9578f9da5804cfe38fa8c3fca86409dcefb45d0418bcd146582546aa91c30b0194902204eb87245a0028ec60da189c9ccbc2817b58d0267b60a523b66e6c8ac12ed445f3878537289903d355e49718bae48de76c3fe6d0797de22da34d0347f6a14f7b67a0deccb3bd225472292b8310990d09ceeb6aeb62640619a23a00146b8690df2bd1d081bb4eab32311bcec9d8811a668c32de122e9cdddd08e3c409ab0588d52bfc7f33190c15a70521b4e983c674a9f6d0dae66341022cde477f8712fc0a74ff0120384fa0ca5ae9cb0ef947f423e7e8cd0f0ac5590224d3794dc6705990e8e0c9336d7f8de1981b86c39918bd0da1222cbcc84f576b3511cf01c6a048f21349024c91966d94bc2cae99187a0f55611e7d0398ccffc6b23925a0b401860561fdbc3125fa854c0b6ba6bc830d86ae7dc593e5cabda3893e5d974efac2d3c73f44414a4a097f56d84ac1141eaa10825e97679242e90a8cdd347cb943efce8e57edfbb73c6903a11fab8843912e272707dfbd103628e15a0f8af8108202e430bcaab31618097ba80b11b5a7e33fd66c353f984af64d78d590d9dd3d57141ac5b499c2d68f6354aaad41b5f401218ab39a42911d035e388769c94d18b037945227c69845ed1b0e3650212d3718bbfc615625805afaf98694573b075521e70ac64bb77b8c45370c3d4d6e28b9f54f5d9ee94bc618ec795c0f54ca2af64e6a1acd745b8b0b3b426354fcbe72c755ec48d015f70e2c8ca1d4250369dab1845f8523f5cd1562569c7be8027d33ec87b83a88a586773079dc66a884dd210039cbe2c3adbbd814b20e175a5b40019c053f9bbf7d87ed084f4a962b630e2df43a64c3f2fc24234c22cf647b9381c3d5468c9b7da45601cd82da9b2308fbaf4817238691783286134c018652eebce203c501acb8c6d66b6e82a56a1ab163ff905f5e9c9e5baf3cea986064ee9eb94eba2e5922ac90f8f6f512cbd8577e3732dd2622da44767d31086150ed75ddbb5a9696f4b997c7ba2f22daf45d962032415918b9e353cf1b87f60ecd290c7a30c0416dd13931cccb485095059024b431778a4e4d1be0f6cc93e2d3b4c8350a57b85f799aeb70ef54acb30678655b1494a534b712064952a5eb10c738920f33f2c1b1b10218133c54167461dcb5d47d33e86352ee2c41c016c4e186a7855d9df102b52c3875fc0417c7865277b26474f48a9434494b84220e1b4c9d5de6989fd9c81f185e35517c451601aebc0380677fc1f0f2a600a9bffa39ef1e332136ae2f036ec45381cf3fcd4074f106b930be5e5e4ba8505494b30eddf8837b70fecdf8c9d9101862a8ce7c261054194c6dbe0d8a4430257fb1e94441f68dc03f1955b543b70eb8c106a78d60911488c662f2973c00512d271a0b4f7dfdc13f501efe586ae53da4ae841e9f25228dc46b5cca15a85157cc7a905b741ad11aa3153a06743006e42da52009fa707915b6834ca15522f289737ab984e0c20ecb6bf63688d4c9866f65f8fd75d53b7ed23e3be5b8a0bd66c2dec204f4735a25eee4a2a56245bd1d7659298e4d1611a9347824af786fc10fec74373a8278ba5d69c13ced920c82bd6fc8a61663261ef5725ab860d63638b6fd420fcf0a45632bf78b88c10d434eabbfc12d8b82eabda832ee8819165573e2c286652b4a1504cb1672de03b50ccfd09629ef88df08ce0d8fc83506dcb113be11c0f61d38a6955b55165f978e098ac145776332fb2f9fbe4155656c02465171a55bb09287226bce5beb2f731ffbd430c18dcf2327e30b4ccdba8730b012249aacbe01a10973febb2f68bc78845bc006e031cfffa0595f137fa5a515f3a1d57b5f71076ba0d3b02d6ba65fb0b3e9764a7a43984770245fcd74f086e70c0a0b97380f72b4cd05e4f7f6a43a080324b4f2720b61cd927b7c2bc98607f4a377453e5d13fdd9daa23bfd8cacd15ddbc0018abf5b539a5e1d325f3ee5f4e1adab3a684e88ca1a0f179be11d28ce2284b119425b12f93a84dc65e1b265ce3f96d644fd56ab466373724869813f6d4cf326242d5886842c07d1a4ba8291ea1bb5fd77cb72db7dc158dcec7e20c9724ac0118883eaaed96a42906ddebdf790a48a1ba0120c4199d6dd829c244cd57335cbbb3fc85c901a797c69bac7c220232d56fa77e02504686ebdae49a580340bfc27febbf125e19c4ea0a51a9fab1232ebd86c23e55d370de42244dc78c8af53624adc708724183a66041c1fd278b99726ba81e21ae403bb4957018246e5641b1435229e4fac5df9661f4c93aa435d28e9c7ab609de4ff856700e81b56adbd358a70214b2baa0d9b24f0a8588824afa992356fdaefe5c473dd347604d32cbb96a90acb717bc51059cb99b94578d89100826b4d130861eecf72f0beb5a6d4bb970dba4072d2240468854f266f11dce48c19485f8841f62a86575eed6cd92d4fad74d2fe024f501175ddc43a0071bd78dfe8d1b38734ae61b069d8da69335a7317037f7f403127054d7e9bd2758dc17fd5942149aa5c0692f01231dc1dc240aded34f1f8b39432fd3fa55effd1426eb9c4d8584973ccedf648fe4645a64890b9a2de285ce11e428d00321c9774765c059bc41e7ecad8522f4e34e8d91e9e06a857f7e10265ddb2003ced4f98b430e0565784623bcc719331d4a245b62260ca8045b0ec6601791ce9efa4f46a0fdf74024264ba809c8db343b8b5909911c2b68480102bbd88aadf80772b434bf5f81e963b7f7b555e8da08efaccd0f64861d544722edfc7e9172731372840c5915fc28bc9bcbe59a521d909a77549114aecce3f6bb7d57d27b1d508689929dd343bb1fb359f1aadf193d4cc11c376b650c61ebcd7833ed5865238381224d18068c655d0ea6a27077a3acb4ae030e5cbe3724131a9308bdc036c99dd4183375cafd29548db74f9f5075096255d381ad88879950f8c79a616612d216660d0b4f0d623081f6fa742bd543873d2282c80c6cc38875ac4989cad2b07ae09f7a9f139b67a565f69ba218ecc44a03c5fa2915e38a203a1152283fb2a6f19b31b3227922a363e2c2643434a6db43a9b86ef3aed04cdfa543ffd63862d9725cde6e80eab5a901fed002ce104bcb9ca6b3ec9394eec45f34790821c213e58d97017ea840b2a688046a3e35971f05d3171892990266189141eb0338ee5ac658815f8640382f51875c51b540a5299a181d0df71b7a524496f87ea0e2b9c08e5a0cba89894d7783c49f3dc2aee478f0f3d40944b8e670ce4e5d98579ebece0de47020de3d11fb7bf13ce8089cf378355378b9091d24a19547edc83c87b421fc00b6828a40f7ba22914e2d10fc12840bfa340a504a258aa57a48ee62d38f35b367234e0e60a6e83f76ecfd1a128cceeabccfc0bc6773c0a1e80b306142669eb1704d0bca753da2755ae737a1c7a41475396df63dc15848d965e74a48e362490b1e283f20560c949a4f0133cc9f48ba9ef6f1c827863911d616a3cb22a8dc11c5ab64ee6ac818cae732e43b12a75e8d206c23c73cdf0317b1d6ceede8c208af574fed8150b7ff0ecc1da48d88475aaaa3b188915f4e0ea5f3e6f1cabf8e11b175ab1560106649e5658472f90ef756acff5eb0bbf6c08994db3b15db6db28f460254c4d8801e01329a8641328cdbb8871e81319d4a3c106f9b5903bb3ab3bfaa2bbb980d06b78c25b21e4374d38cee6f49c3dc2999770d8b9c4499e9ba77010bbf2ec204c9622c9c7386299b3a73dca6056ed636b20aec4a5a9db13ce464c90e7099e3d11136710d78e6176153d416e465376fc4d7ab715a81bd43d910d9941c1fd6d4bba63023f699fe0ab5c42b6d0d61bbab61e9651d7dc3f7d17395891a7f25207ac4b7fda0684490195f110d2a82004166fb5106ad7e87b0835cdaf4a42d80ee68fcae3dc25a72e0d71e0a277a7937528edd29a2c1a4a6d7a3d088d36d1aea99e98f5f0e20e864d7b49b1681ad22d3ebb114e0808b00c2fdf8447c0980c1983023bcf18415d79c6ddf5e2cfa9238e5ecdbd92e976008be7d399e9aa65e0136a80052e0b3a77c9cba16b810c7a8fc0762d18a1c21382c18cfd83a1510aa04ee21a3887288425702d210a664b090a25d5fa3b4019e1d18c18ee6a62ab752a3c0c3b2ff9f6c0e096b44c7254e6525661d30192087973299a4936413a71e07c157082f154977bfab9dad1994121d6a01c769ef2f2dc94619619cded3746815222e168e8cd48ed8bb024a8d66e036a38399b03140536b4fffab11a1135ffc6fb9437b185b6472cdde623317638de28abcd96365301d3e35a27b54704f32b26d42e1e417ffe9207e7d6cab12f1d7de26d2d662fd51b2badcb10c32619381b18131fa3a4b6befa3615086b7a799d94a6c8b19c330cd073b1adcb7f3181cfca98adf5d6f47b83fd3815f9b0acd08772c97e169299c879c9b1ebfc4547c5c49e217716073af074cac9c9ac7ad8ee5dd9d8dcd99c5b4930b6d97b086095e89d4240bcc2dea70eb064fd83da0a65c1bcbe8debedea59ac3f23800d3c26323c1118d403e4d182da2e5760d9942bd881315383d8b3ccc8214be757882886149f0c3760f330c4868106fc796e55f6d21583bec1008792b3027648e9fd1e6c5d9450f2dce39adbea572c0a4af86bf2575432b808d629101a32e48829dce32550778295449c4823e4a6c522473320534c044aa00d455651187e068ab17eb088ac14288c6060827aa382ff1c98e1d1011914734bbc2b6feb62b0224d1717f8340973cbe1f50ebca49815ee2804ef71552a9e48c940f65519f8f79214c3877e96d5639f7619deb6d3c53c15db6dfe1fe5f8c282f3fe79ae93b16d9ce9f190e7c1ec36608d99a5457f0e8b4844ba96d9ac8152fa484c11e70107a9598ec1daf0c7e88bdc6d83f721a34aabdb92a9565089a03332ba19c46ee48a9ab7849685f3a086d6aa70ed01930f7ab759773884c20bac95ab2d6127807325a513d26d282b9d5530629f1e2d105a06f085df0d17a84521bd6c02280d9b68002e9e6a8f79bd72cd08f1cd1d441203461cbfd7a358e4defe8482da8d9b124a6ecb1b34947437286459a9252d881b3c6a3f36cbb997555407e505991e249cf1d77d1d88ef4a6dfa2baec72b3ce5bc28a0b9e0f8b6bc2da725f685545159404b7d73ca89ada28deb495b36de3ff13c34bd3747b99c24f9e39661c1d6514969df1220beec5bc5b74a1a1a010a8d685b6d30d0822721cb0adfe802adc15b96557360a57a5e4b58e60e6fb96e3a3c7624c89d569ca3c19ae808cce68753e7ad6e46a8f0b2bfb7a87368c7f86b6aba62d170c213af80a2792290942681431e8de6118b2b560a6ba5b667b46293dfcf6b28bc1ad5d09053a32944cde41918ffcc1653c3074cd33143d62def39ed03bf5917c7474d146e332d1e4f2a2b6b088cd0913251d26449e86785795bab348d469164f92768da6f4a7633c19eac2409e63f8e7f18131f9954bf6ce0cd87ba89f8abf8a675adc292e18287fa86000d5af219e4c2eb7909ce762d786e02f3ef2ee46937ac9ffc839f9c686c448cc310d438a4381d8442f2985df348e00cff531b9510a5d3d1856456c3a54d4e2124bd95b4dd89c554d377e61bd4eb688c5596d19983df035f03af821cda534fbe9eb8f950598e2b7df20192c358459ac4cc9e4d043e87b7806c8034712604b2261fbdc8b6ab8a028ab07f5d2e07fda59589e13cf6c00eeceb66c5858de1eed0a54605cada8cf745b814a30985c5d1fee7878c4fd9a03548f1bbef52a136a84ff5753693af590f5771dc582d1635ca5b44d4990ee2556e20ebd9e40b56301c62bb4c93f13fc41746897e3cd8c7df039742256274ba3bfd3a3b4c5510c906840a0596643b31bf9eea2fddeb9a3dc3d497638cb51855217fc430e20866d08036ca321ba044891aa4899031d327d063218bef21862e63135bc5c4ed421a060ad221db0905ba2f473cbd200fac2a40bd57e4950113275d48f734f923b10d1b281f2293802a5cb6100b9830b01b6a8bcda46910d4b7d7d068f29a9311e628e8a264161312e8d01cd2017646e4a4c77747baaf13f5209acba0d01f10526bb5f5b179f1713353082a5accf8c3cea7b1e2a4fc95b4990cea6fb20b1b58648dfad71bab72e8c8f1046110abfac7e520137dcc881f6d4d117862eca8c88eb43388266620a0732ac3f0e71c47f444f4d1edf579c9b1146807aee577362dcb36e00b6bf5d4de9c600efd13646e5bce707a63a2aaac507acc5baf6373ca2a0bc2a7d14cab67a3ac4df004d3ff565c7f81b69a60e9d132469a6440b4e2195ebc46d18a0d36f5f3e87204a349c44b0fa099c9045e9ba940b2adb09b8b3e4f9e2ac96e1b8b94f0e46739aad49f144af71ef365ad426db0e98aeeb507720ea2a06c9ea43e50a2a7d33ade6da15a04235a8452c2ce8f869beb9cf541e4958a9df854462aaf3049633025c69bd1c9e751faaa590008ba476dfb516f24602780130c11240e701377dfc0fcdb41a15aea75cd7e88720c844640365bab4b585f08a45bb2f9e99c862918a90cb0a2f2c9bcb16469f55c89f6c6b13410708f0ed175e2b0d22527bba5983e2b63f03c923a581ba75d08ba1a45a08d9242e1b39a6aefee23987edfa435b6bb915ad7906ff2fbbb1447c4b55031950442cc26b3842030687f1691a0fcf441b3a4e844c28d1d181907dd4f20de091ac5e45e2b2acdaaf07ce36ef71b1b0d01fdbc8b50df75a606a4724be20d669a696909a83da617f09e2140e605a4a8f750698043fad26eac354acb0e89afd6baf1ab5938fa3ab1b291c062d30691b183eb7633a1a1862e904668cf97b291672516cb6a2ff5a9d4f9e7d7547971573ae70b4676dc83eaa16f0eeb9368a2661461087fa9de8c35daae769bc0c9932c4e430f843d18a9e861b044c3e6eb6224be78de803da9558d6d86a45320a65fd64e9a96cfb0e44ca50b8ad729e35561bec4adc44054f605fed468587f97d403cf312de9095219797e2ef86b5e9de74bbf3d926ee6624b19fda24423a0b5182182b9bcb0a85b8ef7ae9d040b8518dceaf63ab02dc796bb0fa74093fdb61aa97282a9f55cd354cd18f51d17077585987c9148d3a7deb79342f3de5ea13aa55ecfb62052711ee0cd2fd0c5212ed52a5feec62c0c634805616dc0bfea15d91e87696ceb526e7fc89949f17fed3dcda95a1c22caa92a2d9156d6228abbade1b84bb063ae0269b8b9f6ec7b9c6d040074ed812a6b5c021f16d7564e8ad218431cf7f3e02e4aad384bed13bbb83d65eed12cd84139dfe9e19c487407460508d62fb343f596681818f227b3492620ba90adebbfb7e055a340e80e5b0ceee717db03c00a4bdb1551d0b53392f06e119d34771f867bd475c9e26d782ce3eac17a8fb999051e4591b956294f0fc5c02e9ec0830cce0736afa2e3806274ff0080f1a594e21dc03769c5df4ba51773232f76eb4fbdcb1d62cb23f4bae1c9ae56fc3b85e0cd416d07607daeb7f72301a4431c8bbe607d2eedbe0233052953b6d57f4c29b535b92f52ab8ff4e8fafd29349793f756780121e6f8f8f0ab9f4c969e23e0c5b37448abfc3a512345a5256ff041f2214f398b25ae08a8a5b4058b2803470054b204525e61b12b7f8586bffdb4326c75198784daa293db213527578086ad82c590be697305fca1fa44dfb65ce0af219714dd332517fe4f17ba759b5f0d770893151da5fe63fd7262d1d2bc15f2da873699ddf8262a06b580a214709adc9725f142a7ac358ec1deb590808495d3a22697e95eadd4a9b9b1a64ce269783af9c0139eaf6209c9c321c175d0de312a2c6ee9457c649890b5b5da8db8b2292ee90263f667058bb5544b5747d080605a973a3a095b5899c6ab96c503af4ffae60eba8dc37afa4d1b48f4e2ab7760b5facfc71dbfdf1fa83142de407f6dbf17ed02f761768fcbc9c5d643a1f1c47a0776698de76be5a59512ea32b631291dc4dd9e8047d1fd1701ef33010f9b79ebe05f5dbf750f0fbd89471c3a1c9de9a18238ae33aab2b1da7a01a1c7e41c798fc673a7f612a5a79add5da8d24d625f573cb08958c946cf38743b69a63281573fca6e119844c54ba3263e2ee6bdb6eedbe7f2897dcbda3e8af72d4d7750decd20bf2a6cc470e50e5bf1e6d14d6a7f0268313458dee8d9e2ad7d1c64bdf2cb0e2f816454877139c68d2bfce08a8e38de782aa432deae6f0166914edd1db2cf4bfa150cf2eec02cf4c3af254c1c28cdd7464b98aa7498f7cbed71682b7b8029b1755c6eb035495577d3d65184cb503592ecf9f91c053f909c49145b1aef95b1ca01f322562df8d68e793c0e7c19adc7a8c76398d953e9960bc2efcad21760619ba44315b3c3a61e16d01bd64919ed0ee110a66d2753b7b29b2177b9db16515592b444cd70205f6f858fe4db5ca238b4ab3776759a74638e60875288fbda843ed5d52ed43a7c8de94b4f20e0ad9dcd047ac9ac379c911df8a67d4566dc23e90182890dbbab6dc27d0e4eb0214c6e920165d2425d13ca86b901461d2b725add3e67f0e880ea55b231c808d9795d06c3a9052da02e2c82bc21ef2a4117b04c6ca98ffe07f53308a9b325f14fc821d0ec09da4d561a382711bb8c7dfa026e15e47693f930cd71b37fb1d6f3f838febdfa6dbc1e0657b38238806fd04b70dcc590c20ddf6ae76b0441d0c46c362db9cbca227c0067215605e6cc64a56bf11d3a9de9a2b801cb79b72aed9638405a1404b48ed0c4c682af7841c9ea3a421baf8fb0f3d955ef5e704d1a20429a4ffe019d345d932e7b04ea287cb38ba80100004a04338f395acc8b5d4c5e6f6e8f9ad8cac6c47b25568f6305ebfa3d36bfc75a28edb5cb4ebc577094fc96c9b46358061acd4323776dd0f40133e3ca1ad1d34fda716a4dcc0b518c8a9951ed1c9804766749d5c90ab818a507436468c3a6fd13e967811baa13758923944436ade3c27681483c6c1c8ddc9cd9c4da1a36599d43e60ac63a5ad5b3a9e57579951aad6f28ebf559f8770f8758ef5d1a7cb17e52e77b570287fe6580467ab19fb70e8d75a81621b876800b8e031fe81c84892f45c268c7e2ebb3155778dfceb2450ef7c41a4c302060bb38edb8c6472388fd2187493244c2536945bcd1d84b351f4afd8ea08a5def1d049b0b603a098b266bb9cc8f8d5b51c92d7cb98ab51c0f593d62d13a54d031eb2067886f8a0468bcc7a094236ccd917de6cee1508512d85045c0d03861ffe46aae66ea7c240b1ff2166d9f57b406b18026cc4916362cc5d3ccee61f6e8929e0d3810d6e23bb992051d3516197d13ab529aa2017e9a2eb80c7a30a0f0ee8db65608cf94a07df01755c0736a81866c8d40ee88dcbb63d30c72c26a498ae3e7628c118b3294b63b44ea6222d725639f76037fbd9ebf9481c9d26287c618249a1d0a8fda8e68b258d256250a9d15029d17ec2ea346043c49642b68d8732156c5f4124fe97599cb9482e043ac172d568d1a0009a675a32795a0ac171c2374ae066405d24a1cc27b5d431350ca8a3625c416c5972525f46112e4ba08da698640768ef4da4fb6bb3e13169a22162642f3040d8dc027a0f0f019e8a3696ef3a885ac20243be1d4ec12285dd746d677d712264d338c690226fec0dd57bf8e86af1546e7837a90dcffe7ea81c24e1b9810e1d9f880f4c48e3a9eb3b760833dc08be0d8f20074feeebab2af678ccdab4fa0c82b57dce32f9d5a40bce5e968600a57e7c2378a8f0b4d40974fd4124d27b24f449102a0d2728347d33ad3ba41db7d9b2a066fa00e99aa0b84cd42e73ffaa32a12029e05da7fe04cf286a2129fcd7c461a6bbd28f9a28c7a11ba1316a3d8a0246ccb1333426d0c6c71318fdd3d12f1c5fda933cf50dc81c0ca7df0c239a2e0b8664969e615a3c7b60b7ef45dfa0d9f1570f3b9f01be833552e770dce8261c357d63d49eebc1e6a9b6ada83761688c04b83e2e6d791dc4cd6341d3a4c4d24399783b1271570932097a4b891204319af8a383eb4ac4a435b7da783f87e83ebd838802806129587aa7e0caa00872c9752739f79ce74e0224c0d3353ac38d0101c852871a588bd7893a570ae137447658fc59ad059ed3a18e71bd364a2222ac9e90bb2285fa5a2463e66cc39f651519c47a2253c6ea772afcad7266dfa88a9c9eb33cf4e9597f0a9ee72ab9a8eef1644cf818023add36e95004026a9d74fffba9a0c23929ee531c7779da58a3fe0954828d55672504cf56551ac42b7e1cd4759aa29ca1bd9d9113b162000bd09949b3a1920f148d40d553a4483239b14d13f97f973cb195752a8fe556d4f55f22d864e8d163ad1688ab932b8890d27ea23489c69c32972f83077653c1b768963636c04dfc6691904894fa8c2993e665ac2e664faf9e9cdc930c3ae4c06f7391eb42d09dbbd9f7cea6fadc4e354d6197be8b92f6e5c96ebc5506ac223965e9ac2d3b11e7b63dcf762f6e952206eaab2bc51f856e28f6bc36e109c18b4fc531ba0e2b4a999c2d61ccfdf4df42f7abc8be4df96e27cd86ad8013cc596e3d23bfcb9458c942a3b399507f3cf8cbf75f2d532b52bc3328d07fcd405b2ce2f67205be3871da2c6cc38d009ea0ee626a4d0f65b8be84df5079a451c05925a9b8b23230a195ea0031bf776cd075642469d3ea7985826f4a8edb68979927b9388081cb9d8106b0d003998638d4099704d46543239130dd818a407e771dc0171158140882d7741681f063d3d1910e5803d6716e41a3465ccd317915fd8046babe80afd2b5bf041cd2602cdeaae17636472d855e103e0b0b4da807bcdc7dcf1f8f0a4acae13410a41c02a1cf81365c9bf19ed20e2cec7fc88f965cb4a137309c716a55266e835c534e2416d05e3d15f3a74874b5758a3f78fd351e8c0286b23e6859821c3ce52dc393cf26bdf2797176857866de93dfa565b693a8b9b22df70da3938afa05ca07a977769609b8e96ba8228dca8a85881593506edb1d23e5b2f8ee06686a9b3041367b26b76868c76e748a9049fd6ffe7fee8a17293d83a94cb903c1b08990d2f59c01a7834203d5c230ec8830aaada4cc0628735cfd649af645f3d7858d046b91b54685b23a7361e78e575709f0094f9e78f9073de018b04c35fb1bd7c4288e2135746ff1b1d10ee74ba531bb14989880883020cfd9c45634c1648992f412ba8fcd2486382c7fb4f1b3f4aafb1e83b00462bdad391b8fa112884ff4063593d486141d3d89e894ed2706afaa2dce31093e0e8a3011cfce346cc54a10963d9dc8924bcdd19cf16205c48b28f13ec394e2dd7db534af3c2cf03d18e1a753be5a3b581c4f1ed364f82752d3d6909297313add7542793a8ac743480c85b4e889d723912fa3b722919685d929e1c2a6f897c9db6391d4534c30b346e64f4c6cbc6590405eed8055fb7fffd5edd418c459cb52e01e7d4f2a14d9a2a6bc008421cdceea9c0836b4e0918aefd2a1542135c847d060fd5acdca3460aaadfb890288b079cab49c5194e4f95843a07337733536e60507858c8b33167884f0e2aa3ccc5b6433a9f61a1633f24f6b0b96a4899710a20992d6d1482e3a742523d650e5b7c5e355321890cf71e0338524695dfdc172cf30240cd2b452353325500d076c164319196f86e763eba9c57c4087b473a811f3b5e099856f24344e5547cc126a66d3a45a555b385a8be9de87afaa42ed76ff97653c1d45272ca9cfc44b28952648801a06e853c3f849347182084614e213a0100d18d24fe8c6805e877c23c1b7208b2f840260da6b52472ed2c0d46e8d42b3168437049dd95040beb401ed2c9858353a980523fea835418c9129ef87b40381ddc7c7a2ce4ac4068077b9121aa7967cc39d0e93b1dea247e166c20de15a2dc5fc0703c28c3a89d90e0364de47f4b5ddcfa3713d54555c79fc87f27da0ec3f4d55834aef2e0abc892334f61b4995df1cc5308b9321546af77f2a3d431a4359912a1e58bdf1b22e0974f57ef5d207ce10ddb57faaa16f46f5d09aca0609b41dd548123fa430a1f64bb8d683c8a9f5704d81f7542f40fa79f1531f5ffcfc9bd1c781f5ba1500b61b286baf56b8c16084e4d13e5324ac127379321cb987836416ce2a56405b4c9be98739c2aa4aec5af69c91be498c89e0584aad4f6f9b9570b8aa8df1710035648c6c7b4ae86ab6c9fb60bb2e7a3854a6547f636ba1c6d8f4fdd03f26833b9dfdcc9f6460198ee335d9b88c49958f1614db6befd361878f80224733e396634fb1f2d18e02905bbb37c8758a4ad6d8bade58c6e818130a2a73d96a696ee4859a9f1d3962bfa29f06774338e12d3df7d338e73c1994ce1a6e237e725e8989a09e46d0220161496d2b55f4048b44165786ef0bf101dd9c9ce43df4aa34644be25faba32c5dd8f710aefb000f811a03f910a82110e14b17ab35a2ed781d5d00569180b4222ef7c918e80918f610316a0d521252aeb6449bb134ceb2658ca28f6255de98e6b55f83e2f9e7490a17308c6608cbc70ffd9ca08cbf346f277a143e430412248cdbeb83f4a08ea020402a0f59e6229d08490be73127232b636a30f54d89254d8336b2191b0a49d177062be61f605d764f2e0ba2ecb5af2b57d48d7d06fadc838004e17b71532cbb382675b75095a2bf5a2ea8443678da86a279af6c32365613a8fbb54e17b6b2d9567a763fbab2d03cc240ec04292d7524edb4078e41e2aed91caaca614eb7758578a7e46f11fed13642160f2d682e081c59ada62b679666e14941c745c5d4fd0facea75bb724efc3914219b23a3ccc06a9a2712759ef9263c5d8b7868a0d8562e7cf04068ff579840964c12036b6594396d293c0cc01655f59585355c6010e023d5eb76c31f72d86cb6c140ad401689a86fc225ebfa18898025f29502a9bd41be3d0abd37a757075c090fe5908ca36b1839d8918fbb3d1e1af3eeba9522d84f0f02b31e07719f62514af6584272b63664cda6a4dd6e97ce7012ebb191a8a9bba122ab495f5992ef2175de6c5ebcd5ba10311d2890a96f40208ae0abbdbcdc6307c426d675bf830aea8454cf531f38be148032d897ab1621bf12f174d96d9748615eb805d43abfb1aa459f0f3a0a0e191fab80d76a2802f56eb4ba02b717330bbf9a03b4376cca4b6acf213619542199c692e427ac4b202171217aa15c777c27735210c68963ca9e8f625187c9d60b773df5b0c5cd8dc73dae3f660701c6ac3fc9a38c4aac8ea37f10ed7a6b73219e3da427a5ea2ad762bf51d202595f08ed00523789fb14305ee7fe1ec7904cb89c1ed07fa230988072d5ffb91e80982c0fe82da9dbf635212a3527a437b7fb70cc9b6dfaff624e61eca726506c5a8b7e0f73f9326eb56055ff71253c1fc6922ebb93986c0a6280f2e38929cb6d871d5d9428f187e32d3652ed807adb266baa2cff5d03d03e84715c790361cf50c8e14da2f33716efb9d9036b0b5883d981a2f313989620a9f915a5143a162b2d02009432c9b92392747b96c3d5dd9f01cb9c0d35f7ece90fe5fa975b6ba8abef42258da2782fb19cbd6c65d593c862b5acf5ca934f012192bd978f3e396ed7114792105fe5e9d07c10a1b66c8a2e2a6a14f31528067c5268f86b5a0aead28e4b8fe7b758a18b668c00fd078705e897900f0971ea1d7c96f9cc720feb7f1d23b71c2ecf3d6161ec91377697aeaf061951e80f51789883599d4e314781c0e94a73b39855f419984eacc569204742557bb4c7c9f82c6a59afca9903a76ddb6950c2cc96971011b73ba67c239bcbdc5eeaa37be0a418816415547486e4882e2440e50fa1844fec8de6cdb04a1e086363a4450e22d4735523a2681c4b2458c164918d6fe0cf3a3394e5f92f609a07423855f005cf401dcb393b71c8ee8561af9398b32066fcc852f075879488b008dd1ccae3b07a92a7c871776caf4f8601c2ba5f2505002ba9e5274c2701509c3b5ce5ab777cd389d735c2a1d977eaf4d3cdfaed65b8e0595bb040e4bc3af48e138ae2dac26ee5c3afee165b705c5e2ae3f82ea5c24dd9bb712c57bc0a9cbec7a905cc2be949f76bfb9d24ac80c7d23381f46f6c9b17419ce15231ced5341ba041d31405c46811c4e92edfa285a342e28b9f21c3d8e9ce11c90b5ecaf7e9b9066e0c89b0d451bb724f4690fe67322d19f1b0e9cda82b19267b719ab5d3def7e9419d16026bba65f7115da32057e6ea1023995169974ea617f15ea4261c6ed105e01caedf60d05c408d5bb7284b987f7331bfb43bdd12f84bc2561c778d5b3f0a3fa0611bf004eae58c349f39a19c007d8084a140cfdd395a24293b7512fb12122ae8fa2196345532aefc8f6e3161efd6d4b7b8034e2ffcda3a37ffda6c09c7a15dc5f4aeb9497918e5347ca29a3ecd04faf2056b6d6f737540f690bd051bb0e3aa29c192578aefeceaa58284d3a1904a300552c9702d8338d2640f15ed6900a3aa2e356bf14cd752044b5be41c06f88801fad3aa603e509e2a0dd35fcc4f45e782f09dd67c73bf904f2c20800e9433ec04607ef83318da50ec85be74a561d535bb0a6f08c319d798313e0087ae1e660bcf7b8fd74146c16e200022216350692e7725e7cd0783e5e8db4ac8ace04da5180f335d74d398aa7c21ab33be38e012113e71ab0bcc61c959cf1c7a9e6bce82606e2e33a816173e1badaef571148c2d1a30e4d9c36d1acfd5150996464eadd450e593d9bccccf31ddc2bf524bb596323620dfe7f4fbe903ce8fe5d9d1decb4dc1bf59e728add4ce2f85823ee1969de4c83abce0affbac4a4823e1a8e1933753a98a2d9c30fa8d95979148110ca4616dd8ef68fd56c6a0ea3a478e2f74a3df592cee7087d14a00c9e071d4710677cae044f5ec92b13046a4b0a2249fba300428e87ec1ae6abe8f0ab7aa459343cc8404031478859788db5377bdf652c7bff0d554606a09bd5fdf6fb60ba52f49c1de0eab3311c031f03f547cd5dafd6bf8815ed648ee68cf77aefa4ac9ddfd13dc8c569f8f3bbaaa656e4420c5a702df66da1cfe3f4bcfeab9c9a9a418fa636ce7058d5b70fa745d0b5f4c503960ca10431a75339d01ca23c0452e9fb2f37df32d5d16c56da9dcca1ea5af775099c42dd970ce4cbe3cc9bc4e818be2cee97ca3e2dcd0901dfc84091023f3b02d3ada64e7e099a6a3bef77d4656ab59974be56086c210147c65fc3d9a44200b69bb0da90c53499f5aaa1641e6a4ec38e78424b988ef134c57a627b8f537298a4068f9458c83657ef6952760790f6bdf7386387026b6fcd25474131baa84147a17fc2cb73394e6a462d9021a88b83685c91f9191b4bee341692acc5e827ee1130f31fdf90dd4ec293f953bcbe936415330b7c32ddf358bfbce14484870797bde1c99f24029240c18f18f929dc3b9160f984da0c713e1bad7e5cac5edc4a5d3735358729b85278b785befdbdfc5a208fc838c5519c01f6870594bea17dd59cf6947f1e026df9b2d4537efecc3edc1824a980133f30136ad3b1b6fef61f7050f395a13e1d112cadfeebfcedf2917f4f78747772a51333a305d1b78e0461c752b3ef1b2034f554840a67c39a34a7810bcfed22cb14520301e6d3364bb14e202710adec22826a61d2cc58785d70dfe80e2c87ed0f26b22dc74c57828358c2aa61f86ea85a0d11cbeb38fc8557ebe584089d3b5a9e68692f7c7ab9c89958dbf6a92adb18e9a5b443157ab3ee577ae5e9660490d1ae56af341146510e54f5a9efc646610ceef22bf161759bf11805906b460351b15e720dd9247b167ccea9ff44c52745867f2d1dec9e0cac36706d19d5ba07140aafc9fc99760cb5714e57eda3e71f910f0c5a814fdeb5d4e833abfac7e82dad32713f7941820bbd86e6b5b9de115dd44e78fbe126225ff0ee6fc37d6185ed304dd3f0e2e482db513de060f264f6ec9a23a6df63a0f51c8bda8cbf9ef4ed3c64d5afe1f6d40d6ee06753cbe09d892cdf66e29f76a47188d652ef6fd481c14540ee7c3f8137c2054d23e3994006127efc7f3a95614df42608322b0163cbb5a06e28bfd32aa302a2f451f84347960b96ce828d20671e759439a4e8b9dddc826672e8e86c96a3cfb97449b63396839606e61f116226f02fe4debd51a14891115dc8e9ae15dff5d13e54d7ed97aa46f911e5b58c3b358877aec5f2e7fa64ef05efc10e3568a9932d9f8b24783f55ee6fff46658c549efd4dfceb0cd0961e530a81f52c7d2a4cced13145a0956a4702245a05b1f9b7348c7cff48ff5e2699f3bfcf9878808cdeab75e2c95cd5ae793c690398a2d1b78245f6b4f14b62ab43637aa26fbf5deffb1779d8755f524c912607df6179ef9314f8f5cccc1623917213e6e2c4780c8f8882605802932716006c1e159d25bfbbc872c23918e08f2c8d98e8840431964e77d2b0ce23b465b4f939ab5a24807958ad2c8459fe04784577de5dabdf85ee05ae869f5f52ff67822a3a29dda914a4547b9e3bfdef366218628298c49d41cece9fefdfd87299b89510e4af2d6db94d610570bf7ac9d67dbf6f8cae4f3ab1468aa74448b7ab71be08c53b0607914d3c3e1faa6608e1a61d435700805d3f4b91a837e4a8f14b95fcfee6b0c1ceda9c256eb0d9ecb17ee83e4279c080f9b5b241c652fae0d98d8fab03e4816d7b8da1feb0f27b8702c595319b448b4dcb17e2814d84fe739efc6131d7764e01239dd9ca4bc4d1d787af64eef8ef9e86b486e1f8f1cdcfc28083143c6d74773edc8153760d18376873a3d897fee276261fdfe4d703673d93123d3f2dc6b3717bdcf9edd67e24b5234731b1850b4e980c7d4b13142669efecd3da8112e0cb9ae951f4026e0c21bbc76a6cec2383ca236614596db1d1f42f3f9109f631afe001575e6e1ed99054c8a145a3fe2c186469d9aaa9ed53cba04ac9f15920db2cc381f4fcdc6754ee5022c4149f9499a7828a0872823987d4979ae5fb09f8a1565f9ce6965c791fc926285b995638414e532df416918b73207312427f11c90f6b0c4ab689aff7887d7045579bf4b64add0d1d44f7b836276005dafd6d97bdc5b23a54e89ad3f9fd9f3a3d1645d317a546f595ceff6bd2a6933b9555ce08d8627cfa904d10f4c7ac00e6a329a66cd10aab4a0e3b7999811773da3b38f4f84a82c77af8856d5dac77d7dec0abf161f21d3258ee4fa2d05d16141274664794babedcb391752531bcad77f88274e34cc07d8bd0a8e01ff196bc8cb361f0088150d51e2e336491e9b3529bdd9176f013fdf104c1ce801d6fbd19031c9f94a28b81bce041d99eac1fed4481ccd6e900ab7d157e9e921c4f4f99c0b9cc9e547276f4879f91f073599cdbc2b431d8f1b7124f949ca888cd0c54c5fb7b42af5af74df5e2de0917d7d18e26d0f5af51dea6eb2e2464f295be92ae820c9a0e53586109be5337d0f3767c86f6cbc220c256b802aaaacc757ff4aa3314ed57ce73425707c1c0e3723d27884c0fb4a023478d9fff0bf0840c838aadd09d115a35da765575402b9d039a8abe0ba75931c775f659291bb893b562f670dc48bc8921727dbd4767ca55a262046765503694cac94c8c62bd432ad1d7d6aaea0d9e8b32d3931250968e782e7728bca045b6a81dbbd18a39ac4f2a747384f817c9a9ba975ae5817a76a028b79d9fe7453d74b883233906dd01fb67dfcea4c0215fa28fb14cfbfd49f365b144779c74aed037146f45289eff7211a6af05d0feb024c4ab31bc84bd347f9b05a65b5cc37c7a31421077e9997c97c7f7f3e5c4575d6b4a05c6a5cf54bd1f55012e91d1e7242e2d430a54670473547dad97ac5a1aba67806b1c42f869d605220730ad8518e2ac3809bee5bb80c104b3e6dc2ab8c780ea59f9cec4bd3169944e9ddbed0994de700c24198793ea21287faa5b097d28c563853f53163307119453b99e5ea8460679942f7b0ceafa6f2986ba1abc87ac1c94ef961ee8d883e47fce6408393ebe67ea4d57462b9e6de2688f23c0c113f5c1e610ad7bde17b4b694bdc12b3c4270013b2ac60d260ac1a32d50675d5d4c1ba3813b95c26ed8ad3cf0201882109901448eb1e7e6b20ad2783cbe53ab0f91783b146fb0bc5f7995ea5a51b7a2ee205ac027cad6246ef5be805075a759e039e45e31fef16266edcb9cc270edc7f941f8c5e3fb480129464ad7ad63ec97ae83d11177d7f77f1bc360ade296dce432e5dcc15be68244fcdd664e2d3fdab7f95569a1050fa11e218bd17171e25cfcb4635a66b6ebe8281f311f621271ecabed36f5515886a8bdcb63dd3c7a3d2490fab301bbe8c5ad886ebd88c1fa99cbd474cb02ff86583d4cdd355e712311370b3fa29b80869239b043e98e00e53c27de4969f9794b56250fa456575b2b3d73109f1ad6da02803aeead351c8a009c3d26aefd0d8ab9f72de95fb8afa2c329ce3b49e29e9b3116f1675055b60ac525a1988069e12a00644456755f39bc672d99bf8c860bc3a65dc94bd7a16fac1db1e25b6a0b480a6d0b535df9fd27da8054c23dfa66e1b6a14f9a0c3989db42c759554bc30d63d65172f02e67dd9cf1e73ebe6e8024a85cfa317489d0844a619339a95d4e964ac191c4664890bd85be143a879f471b93ef93b24dba954bafd4420e62c9d432227d8100805611bc2094faf1e866c8aa88a8bdf73f2fc90171a252c2115a015b2f5df1929ca217f4bab3ba5c5e6e3b580749c5211240a8b5a3e079e8247f5e51bb59d76ab7ce9600a00aea0e1525ae8f11293908a174a656d34eddf40740043a2394b1c7b60a9834dbec832238036ae826d174cfe523021304e6590651faa3540b4b8b5dda1016aab4ab8774cff498cb0399e3abd132f86b0028dcead61d7340b9071366d0623b12152cdefe1f50d1cf2a8bfd0ad81b24195c382f7025f8a73fc46b227b29887e4b81625bfc3f1907b7656ef662f8763e579da99438cc8c2edab6e47954072428370dafd190523fd74d444c3d85f87d7a1ccfd1934c618ab9f78bab29afc4312c8c490a3364ab055f846a17d28b68961adc68b32272d964e04ce89fc2ae57b0425fd9e07e21818fb78ce70c2023f2d1e8e2c6c92934cb4472d6ae775935dbded7804fd6a6045b3642745208c459dded34f1de1305dd50c4aea9b1d2bf52a9ed1a1580b8b01e1e2b2a945b935693157d0e2f31207f36ac19a17f2ae391149af16874a990b6d492d7a40832642c3a12992b520e61b8a071029d18d1523621eef447bfbba33a86b47f27742c0d6d1b0b588dd9e8832ad7d94cae37de1a6b4a6662fc9aa65e1482b2e6ac75c76c05c8083e0021f17e44f88a77021c60cd8dfae30a699f9d4b950b53461502186e5dfa340b4160dc4396770844436d396043e5bad90fa8f86cd44c8296094f55b0281d3331a8544f341062a81802eb5aea56e37720a38de6b29ce7f89517099b9291012d0067c8f4f8936e71469cfd282796d203649e3f4207000261aab48b6df1a4356e8545e3098824b39cf97460acf0adecdcbda82ddad0a5f1373fd118770c7a64f21f3232a8407ebb48abe7f728f4117340a1ac15b8db92b84441a2bac138a30a881c0a84d78675fe9e4408c16b8d8c3a3d177726fa06d409d2d2e92a170fb578d16d20361b0e010009b8616377570b674bb3fe7af98c38bfb0e9012960a89fd3c3cd4f031554d6b6521a4b99907db4ecc0f0801b89fcc6e22dd3a36c5e4de1717bd4009d9ff515f49617b7a9e14f80a7980c3860c5909186eafa90e2afef4aa035917eae81e10a6b35bd2e8eaed22d0a3ae328fc97b90977f6beadb030554f25a2be64d9e62d3fdd8ad9ccadea33f3d5a7878ff2385fcd60c41cfd100d091e3e05c34a2d8619c5614f49ccc91e94191b2082af6cf5c0afbbf7d73831e6f8a77b450b0b92e36c56c5650b09ecba289e566a432fd332cf60e2e6c8405b60e10ff8e69f878b0c21a66056b99a10e18c4282dea0dec6a3e0138f91d8138c9b1d8c76c094ac4f9051b1f48e132428087f94589dd8c3b058b49085d65b22e70aeae8ba92e54374cc68e25dc229b243fb4502feefd2788b833f8120fd5cc34ae85c6142941057f8f7a3307a5e0c29245733049f8d5495e62db3c16de3ef3a02e650bc8304a7a465cfff1c87da88fb035c755a1233c48763b62dbbb8f246dea673acd3009f0feaa39d1cdc630136319cb508370ae23a5cce045e011301f81b7712d7594c320994670804a6b51ea9a10c2291efabda6994bf96ca551efc84db8685f0990eb1a25c6f9c9b426cdfec465a8c3ef2cb32184268f62d8cbe11dd952df7c6a8b40c3219f4b4f7265b491425ebc2eeac0f3064b788adbdc9a50479acf0bcf2a034fb9bed3747133b6375f42cd50d065168bc00d0e8fd59e2d58937301ea52dbf8fd0f94c075b065dd5297d25b5a890d20970781b010267043210bccc05e22c51b1f4ff1c293a4d7adefa3325787253a4aaa68e13aafcfb7571ec426ad70f3231d0f728d07ea52ef6048fbdddc63afc2b1e67307fdb0c4c8ca8f23e25a764804940af9960fc9d70cd78f6d6716ade4660ff0eeba41cf14a3d29ff8ccb6ce62b2a14669af9395be229ec418132eaf93613f30853fa73831ca67f1d0bc3985e83a36032bfcb5d789c1ce334de9c4ac9f19269029d9134770e05683b9f46be21bc43601891d138fced33c9f18c58f4b9c58eab378505e66927e6ce86ed6078799b7f0c8a39ce284363afec0a9cd199f5336e8c0f125112bf1cad2a92937ebae467286fd3548effd4de1c928a801ed72eb2ed05d41afed2c386d051405bbf8d14331c861a7e550f0f787aca824a2816dfb02cd5ed129c022ee3b5827e1f3024351534cc4f9e248add0ef6b5a0a240b12d842aceedf19511b007747faafe556443f89504578090e3acfed6f68456bcb9940300e89859636477d7f341b929db802fbfb9a7611e3a3ccfef223d1efcef67bb0028ef4e39ab62a375cdc469a36c19120257798c30b28970049004d863700cd47422677268a649410d05d5aca290952a322474c158ab484d78d694be0369204cf6b46b9668d35405eaf5a1ab620afb4c64e603297b1c86c94f41a4ff501d0ccdfe2611a7e4f9df251d0695e965a62fbccbcf26a047fff86e87ca90bdb4eefd36140a1064bbc5ddffc9d169589bd353d3dcdced3c9ee881a5badb08709b468033a8afe7e5a301856a503753c781c664c75ff01cb20d1ba45e6af75bab148d8a3ec4a8a2ff2a615efcbb8b4ff264e82868e87b06ee4dc8fc8e9e1c6fc42ee780cdc7bd95c2c681f8e06235bd88b937568c44608919becbdc9965b4a99524a0109089107df0741fed324073eebbbbbee04dd3702db6ce24dc5b8bb72f74201a276f717a46e1b87b1d999bda9248850a0f8cab27118fe8975dfa43465d9546e1b7eacd404092a6b4054fe2f42d16cb86ce78b9c9b128f0c40b56c7c95456918fea19b29389599392b63a732c9c6e2f12e0b9201ddff4836bc0e77b3b1866c0ea177a73541b7c256353b11d4aa948c0fe195f154525ff4941eaafb1da53b284ac3f40fcd29f48b14958f65c8217288daffc9f81030784be52e06b9c815ec4cbf2c6273f0b6c011beef8c6ca916e7431aa6dd46e2d4fecf8d149139b2838ee918a1bf06140a45b0ef5202daffc1769e4ad319701b6c4d64d015829228f5faaf17890421694a7bcd9034a58b9a280cfab5511bc59db9f1d5caf0f5ba1ed37440926601213519ccfec216cb5645dac51efed474c0d674cc275d1756bab6ebbaaeeb9a521a5139320243c861fa49c3185139320223e338c7614e6ea30d994f9605cae38ba9cccc3a0ce1692c8e95f63a65ca822ed01353ea97d1d899ada99de127846a8aa980b9b8c0490c867079814f7797efefd79437a420f7ff362605b9e3e0cc4c3dd0b307a8cd309be71403b2acd76c31a2159558f9fe70ab41bcd919ebf9230e2fa02660bd860c90249f9d4aaa8244026a8f93442c4cc3f4f82af6380c50abe44d7b55ac4aa260929ab02429d4fed873fdb79182e6cd356f7cd58b79266f5ad591885d91bea50b6a3f495201b364c9eaae1f2c5931525b9101f2260055dedcc89be632b00151bb65b7d9908216c20d9a40d8dd857199c2ed392ddf87de64f03a934179b1d9aadd5df668b338f663985712c680d5b531683f8410328410465e8710420821c39501927a98996d9c3bc8c37501630c234689614481ddbabba3200c27d86c06383601630779b868d34d369e14069999a704ba7ae73576746260a196841647ff2402edb8393ab4918a3a9557a424a41dd81e6967a3736f3c5644e80e53eeeeee717677775f777737135254ac78a2abfbb3f3829dcb8a256aaa76107fca06d68022bcf0ed1301d46fa3ec1417eab754aad721d5fdf7e322d585fc3f3ee284a7fa11aaff042a41f5a74aa4808aa8fe0f34a5fa7b532851fd63a6a052fd65689a54ff1d45a8fe434517d5bf070e25a8fe39c0a0fa7ba055fb538516d5bf079b9b22d59f715ab53f4f8a5ab53f4388a2fafe58e1829dda3d063d7510e815f420dc100189138ad8e00761b420074b28b90c4ac8c1902934410c2b889a053908a37fae1bc19ac24fa27df9224e7c1925375caffd7e8f3da971eafcaf118bf919e7225f480d8973915de430f385d4d8402e94d8d46c8d12fef930f395dcd0419404a145314a6eb882f45f9d920fc9f515e028e8800a9bebfaabfb21fe28c1448d0f3fd874fff5f3270b681f39ccfc88c58c383009d8becc27143ec639388c4b632f3f08e9af17c2e3e2482fa426884bcbbfe1924fea82bca766153476a69aad99dddcdf997d9a43a402859db7ff60ccdcdb7d1ba046d8a8fbce334cc8ebedefc22b305a8411941f6a5530824b50fe2821f4ceb6e3e9ae09517e676fdeb8c54ab9eeee2bd9a173f0594a68c918533990b8e9816bbab4208e434beec0a5058fcc39a57487ded5b2a49412f27bb424ecc1bac718638c11faeadad12b6c955a18ebf7d7bb619b140e8b713435e5f35fd3ea61d2c000819e92338413e54911336bed7cc9c13dc03953524310e8550f3230c4548fc4d1703c64782023990757437b37344cf752c9f9223565479cc1ecb9d282ec3e60cd2b6766500da0dd19990e0396ecb86b7468f50644cc8f9324ba064e88f081139b1ff0643197a862db42e6a745a85caafce2c5c8484144addf36a9f05ba105faf649dda222a042205c3b00b99d7a80ba2a49c614415cd426aa8e44155180428a57ea522a423841006a7ffc620a016a2f81aefc3489c2293540ff0bdddd34b5d21f7d52bf959f292a344085f06918152ee9c126bbd795fabd20a07e376a4bed9f4a002106b53f0546ed9f20fcd4fe8101104a50bb2d2ae8a470ce981839a965594aa059dd1f288e78fa4b20d1688aaea488708872360ac59315645bf094a0d0e2084c09411a1447489074761a662b6dc11157163e180e8ccc241891aa286249b9a2d0e208c905d18ce2e80591c8322206904848e200091fc2894f8750c47b2f9d67035f4a114e82ff8fcf148afc4be1992c5ec4804159a8fbb30414474b6451bf37c21261d0808814473f5228b9111380ba3f48caa8b0ee8f144c3421dac1309e227e416dae00156b20d4e6b8ba5234c1456d2e01d505fefa0c21415d9f20a4509b73819d565115db9525171aea2704874be14491da5c4be54c0bba92fa56c50e08571dfddeefd21dc79106b4dd69903be9a448c1420a0d9a90228512b172ee34f8cbf10069d820ec7e6c75bfad523f776e6b2f6008d8be7c33702afcdddd088fb41724c60b9660138b76e66567c05895fb2a7e92f63806390c7c5413287c62881a6351905192a32540adea22157eec69d5fe3019aa2baf81df4add2f52a97005425ebf8f41be8a5d4988f214c187b06849abbc8b44d20942f108414f08090911050d4d8912d4da0efda24e4f9238d4e3ab6854e453a1b481d167e117390cbca191a83df8de45a1f620f501ed8f3cadf2aedf6b4161e558d4aa58e1c72fe047a356a52a7c99d3aa23bdda284636363640d4c08f54a0b8a97088bca990880995fa499c0a23cf0c76ea278d54f8dc9ea4fa0855f8d0880a7fbfd8a442a1566d93214451e1c7a156b96043dcd16498deb9b875846e85f0639256e9c0af3103471b82c9f8db7d701742f88b835fab025d2db0d9aaddf7e8ec871d842d847fe86e1460bb2be8bfdd36e4b8a903bacf8c045e5ed63a730c92e225a7654dd901bf32a0a4df658ed4dcdc40b043df19afd7b4e0bce637fff23199bbe6357dcc79d1581fe7b4ba7b798d4e29801042082184d0bd1b322fd3dd0714847143bf5fbd1093f104030929a594314218a594524a29a50c425a2fa594524a29a594525a5206017e319577b79bbb6c65677a4e4a5329b8db90959d99b12b0a2c0c7c08340c7c08030c0b58000e1c0318000000f065372c0ef834edc12f41a16c03a1c0f6e58b41bd1aa2c4e7ae8ceaf2d17e7d53f7378b290215ef7e79b1fe732337da197630b6555ba58f512504a24a284495df0d8b7b79f96fcd122222c121553ef64ed41d51953646befe2ed6c3f7ae8e8a9751e593b2ce8dda93bf033fe1da55dfbc6c9d2abbaf736427fde8b28134fc1560b9fcbef1951b398cfc54ca8d6eaa57fd8233f3979a0ed774ccabbbfe73a318f8d28d38c7f5f27d0a3be32fdfc358176357db6bff6d5f0b0b75fec782fc8db316663e89f3f5660bf34b2d130746ca2657e3afcbfdf29eef1ec3d7cb3d066938d8be14614aaa4d597bf3bfd40e1a2918162e5ce8f35d422697b507e1d2581373d6dec74f416805141d1c2bb02fc6e8233e8451beec7cc468452bc6ef193a426eeeee9d39abb9d8b23fb698fb699c3ff956bfe497dc26448552c686d6126c4f26d3b69d7edbb66ddbde74dab69369dbb66d336d26d366da28b7f21bc7d5643299b66ddbb66ddb4e9bc9743a6da793c9643a9d4ca69369336da68d9b6f42bd693b9db6a7ef6fc346e9e944b73f3d464f277a426da7cdb46dade9d860b6c27d5da9fb6ebfc2b13caae5b46262316d6599f1acb1cc303d663a6ddb76da36d3b6a1b8b6ac709d33638669db9ea64ddbb6994edb763299b66ddbb6b7341ddb763235caf4a895d3cac9d4f9d8def4a8eedbfea4cdb0bde9b16d333d4d9fb868dab687db531d915be9962a7894202857ae94503a0d2768f7b78fe92f1f7236b8bb5b7066346e4059a8632cf51262943e3ea9f1b5a1fa55fe4c6bbf34943e6a557bcce27898f587f7a8d737b74303614c7e2f7fcaf7313baecaee7d33d5f8a4f8754a29255cf9d52bd78d6b1dbcba6dd897b0cffe2bfd72d897b0f7512a71259c5267596f75d2fae52e19504dd3ba6d6612097273426f20489492a878a9fb53049d8a53b76e4502931e17a0c104f57730284dab5cfaabd7f8d6fc786192fb845409dbc3b2e69e6b0fe5ea5a0c5cd74d08baff2fa4aefb60e581bd4a15ccdad9a54f488519d78f715fb7293e480f84fb4a3e4a3f7fb3e29c5fe2e2fc1f5c4941fc91748432eaf73c9e4af57fe9989f19e8c48c26eb8f9c0ff940b8c6eba18febe3dfd899f9fe3876c67a7fcce27ec0bfb86983f531be65bd84b3bda9e988eb3d79630942a215237494ba55a855ec46acb8c8216f8ec6e116fafd978738d6747051e3700ede16fa9b368eb393daeeeece3e0bd3efce3fbb825915f587ca28bb8c138242ad82dd76f65f572c488dbf9b83a7700bfe58f785a007f679ea6f65cb39b66e93d666f0f1d5364f21bdb74f8d7d329e523db60b3ad25e6d4de32ccccecc1a57b05fc3a0fa631d17fdd0c6718edb25b9035f5cc4596d0f762cc418e4752f7d3f706f7c45b1189f9e545450457d4e54513c5451a8d3f3101ba138eee88f3da5bc276210994ea747991e55049b3ab399f97f2bf2a6ba8a65158d3c52c1b0d5744c2850d314a0d37b8a0635edbc50dd179f4800d5c5285d04a2c1437d00e14a8387fa383d10aea8a781033f722a190d1c645293213efc14ea5145280a25053742a1bac8a43d9f5a0c16aafb7460a38a7a2a646a3a505dca098d455d246acfffb388e214ab68674e278eabe585bf0d26d3e96411b5caf4fe25cc743a994ea7ae862850d47f91a8ba51dd191437494ee8ca9f229556a1de3f1eed8ce9fd3113c7358eb1333fd808f533dedf06d30ceea4cd807a5317350d9b61e26eb4e7a6199c7cd3c7a1f6fc511c0f5c4d5d0ded9db8ad510885e222188bc36871408112c1a86e453d9665344c15755514ea79575b837ad674a07ee3beaedba93d54d74f378ee521477f35d4d374145a79ffe813af8b248de8178dba3a0b2c548b76ce5a44ad6a797f6b4aab4eef2c276e6b0b072bcbb3d6c2d2e9e0d5d363278e56cc94c156a17ebf8d50a847f9a31e73e6768fa595953f715c53d8cfe03aa73d7fd650d148daf86a6ba6a9fb527fea3ecfaa2b9d4f69cf9f0614f4f42bef46ad9af14ee430fea41ada67535a6555b7886674d1a83d7f8ba8f46e3d819e3a1fa83ffd4af7a1def4a78f812bc619ea043ba845a36fa57ede3946353ea9feb373a2d10e71ff656768ca326a7182f9631e5d69b781697869cfc68ca954730f511bc231b027adb04fb55149b465f82abf6797755e7b730af47b1e7e6c951fc3b8cc6360d871030e3af43004c7c8ce129f2742256e8892b6587e775f57493f6d78696fc5a353a01e7f0719b6ce97812bec9a919e7f9090a4b60dfdd8b746830f95d4dd4b7b3c482418c1e0dab03dff60cf85c5e19ae53bc375dbdb3996e04bee85f67ca81076318b63bba1dfd717a30b09e6d2e282b07eee5abfd57a082deb97eb8ee37e9ab6e23707bb5f77a12e03ea3edb30511103b670018bba308bd303ce6120ec143828b130fed0d7a8ba3f7756d783eace1deb6c36b4ffd321abd810ba55479e20c8680a2836b4eecf155390a88040ef80dac38770a59630928665dc56d2757dff0bf74121db9ee5223bdade4ab148cc59f13901b62fcbbbd09b37923821b2c4870816f5db285f4c6d2743982c64cc21dcc99ce362ef12af65daf65c62d0ea041a02aa0b34a453a755039ab330fc3ddc4b2cd38ea1bf428d1dca0945d575328449a5699ac6894522518c82d99082c69f32c4a71d6c18a7bde21ad2ecd63f3557da6324d7c7ab830d136756630cfdf4b3a183ee60cd42500827fc8e12c299419733ebd93f5c9451b9ba3f5ca0a07631441540dd9f2d8a6abf106c865406d415828d4e17424149845af5357701d4358d0473f145f5a028ed44adda1f2e802a4fa9fc30a8f21605fdfceba020bef92890fffa354fd1624ed08ff2a8b643229f1f0b6a8fa3b4470225fbf25d68e6c0f4e2a83aacac14f1333333ffc73a3753e040a9cc58e854d6591c53a03b13b9e722bd92cff0a3340ce77490070539d13af4710faa7b543d08064d1d6c5f3c1e75dfff47fcaf87ba3cd078c896655996d5fd901fbb6fef0282fee0aedbee47fc8fe7c3f8fced4eee7ec80ec9fcd8c118dabbf308b49e856be1ad126b4d876ce1826061618131fe1504faad516dbaa261b2f1fd2bdfcf636750df5f4bc57e17c3fe7d95ea66f7d196da52bf67e15256e65afcd67420a161faf95cea22b075763fe67fa5544b8a1341cbcfe8be59677ce9a1a6834709b8a6c6d76869e18208f243959a962722a4a6a523e2f235ba5d98afd4fd98cf7f7a1a9ff11c929647b59c3ae690d87817ee8720b64acd0d8d1a1b9d10a9af91aab14452359e48ea6d3c1197aee589d8e8520eb3eff2342e5d8d69e26e6453a3dd6f89bb8f476df9ee4ba51e6be158525c102c1f44480d0b1744cb071152d3f22d2dcf1ca9fba624fd673e0ba5f6b3c897175763d9446b2c9bb2f6b883b0bd09db9b93a6776441347f7f8286d4a963da54e66e471644ed6d7db9d11e5b42563abb42e51cd2a6ee0ba9f995d4ae8af4dffc0b9b5c363f9b19336733fb2bcbb2ec4951d39149807faaf8bfebb18c8315bbb8ebadeb693a55b3cccabaefea30eb5ac11aebb2b419e6b32579f0a893089a4387437bf2e912b4ff5ba2b8026c07f6a161dffaae5e315efab3467a35e3734eabbe87afe6a43495fa174a59bca4bda8d35e3cd23011872493ce14fd94f731de0ac5a46a4cd5eac5d4e853d3c361e21341b9a7639ef6e2d32528ffc73cf108296880ba3f5374b045090aa0829a5501c21b757fa66851a9138e6871c1670a51dccc2929a84e570650f7a78ba24aaafb4344543ffa31c000dd5fe9cc5064a68ce71c23c5dddd9da116eeeeeedc5cfb99c8ddddddb9a5a49cd7076af1123f2ac1dddd9bc8dddd5b0b7777776e227777e777e796e2eeeececdae04cf8301061b2f5318b1840e3686803810cfc21b074b56e032329247278809c9230548b74d67017b485289c5ca0a0e3b69c29088731971840a23293133623c6f8887584465e0f09015c2a0f8204748ca101b41191421041b4949c5d450e4999167a55540e0fac02c483e913f0a9058231659ccb2d8267033c10f17dba47366141540a9fc52da9b1d461d5e869c3bdb8526601853fb617785bb10e60d60fd5873bd9a3710776682da40a061fa9f0c6d55680e329d8c8c8ccc94faedcd8eeee721fa65fa61e01cfa0757a948e077ebeeee5e3c827c8ce510f202bd926918f92b9550bf05aa511a46befc6f9bf8ca7af92048a24a7641954c44956c822ab70a69ce8bd2994a753bbc73b3434ae92c7d81a2c897e11ee9822a7f87164faafc1a606815aa55fba345922a9f93f48a6b24b6cd5dfa465099887b2a01e3b94750ac3959331aef6b90b2a4f2bfd02bae41adb8268bd5093374d820161696de75c185468d16ee13c22384e7f49f0e1b248447080f0b0b0bcbb3bcf5980d1b7e351e00789a66e158de46044057c3ba807a966e1d263e9401f5158b0d1bcfc26223f52c2e3452445a9e488d1a2d1f9fc657b8ef37e8c47d3a6c904b0d2e4524d52284878565069c33380ab3dda02a3ffe42ba7209a16d12c2f6653ae0e66b300760bf9f0d5132fd598bcf31a331b31105bd9eabd4cf7ad2f78eabfb313fab4382fda004be92869ccbacb04a2921f709a91db02a10aff085d41f5ca54a952a6f8445ec870fed43f28392f94a305ecdd274740cd63b841042e85f2291fe47d6f140a3525246ca1e3e89bacc68a9917a2234fa59fc377bd28ef52f7d3c6aa99b97f694fb7854aa3d3627a5a9d437aaebc7b84a353d46ea3e5849f033ce2bec0adb7fce2ecb485ffafeacfb484f7990381e75b518b84a25659d411cb0fbfab1c6fe87f55f0f55eb78a0513309ccfac3fa0ff820bdf63e48cfeddef8bafb61fd077fc6633c60f7c37af8d8d70f9b9b7577613ed263a4ee47d62111c2e55d66b87442a46a88b4fc8c1a349522c2727a1aa80f0839692f03dbd45d1ca6eed3ba7e0cfb1a1c0d2ee530fe298e484b17849484123a3882055154a153b31de53e1e15fb391ffbc5d65741866c9528b49082186458e10a556a667c105c7363d51011520331d27f6b3a48dd0cf37b3ae46cb5f21a97717485d4ad70930414be0b0da4ef2775fdb34e1b78e07a752e33cc6abd0e56e5c1ebec2ca12fa2d04d8d31b604a4ec7e6bda04e3875c10f023fcadf09921e7dd2e84990fe6f29304b457496a502a954aa552a964838dbe20131f3371597bd99f38da5e06dbcbb40fd6ad2b69d90909eb999f44a2c187ca2f3b48205c9df3c7be1fc219d34fb3ede6b39bcf6e3e3095a2b4bbf935f2fc1b7371c4273141ade79ac5e4c0819d6161ceebe3c797d13e6b4f7b1347dbd3607b5ae9276c595beec0759b57d5bacccaaa9401eb207ffcddcdeca39fdffa56b5c541c8cc1bfeb3c5dd3983ded16835e382ce198dec1439c4680111ff06a59a14f48bda44299a4afd7b5e4c8c8c4505fde24e44224229258e058316c4a5344553838d956df23720a510e2a0461c741bb1c6dda4d2d429a531f20821c6b8a9973963b828b91f1c353965ceee93ccbbcccc5146beaea0f1af2ba8114afaae59994aa5aeeb88e58322ae2b9ef48429764e8c9da30314e5888f919e273bbcbb393939399cc3394073523a314f88faef720ed7ccd8e518d9192576657deba898b0baced92ae41cb6591c40e020a942d47e1c1c86d36a3c02d1b6123a4c34c1c3399073f688856967258038a773765a1593b40ae6e4e44869d28eeceedcb98f957c2023d4aa9473ced91e94cf75e508a197646a5aa9eb8a385c2c92138de830e19155c418659447f108c8f3de2dcbb22c8f4632c628b985070a431d65a9a755328925301ef9eabf7864e47107059beab555a59e129356b58e515d35114a3d13ca21918c6b8ccd515ac22d1c5957a04b38c76684afd21208af9f2830a98ce1f4b4aa757680f5db74b69d281ca9fd5b92de76e490aa63d3d98e4c3944dac43238239c2346321647bf6f466a3315276c2a56467b2d6de211152780a8dc6155d031dc697686b198420b82b24fdaeb2ca8f65b41d01d60853433718cc5d1f20444a8fd2b494045ed5f5ec52a304cffb74188475c50d247a33ed22a77da4644bf524f8d47a51e2ff9f84ad37a4a3d380ed33f27a55438ad270afdb49eda40edf5507b5c6222042df9947a30a1da4f7be8970101f92a96118f32a07814817c85613c47d887f160516aff50abb6623c56603c4d24c1fd48a042e330f323f758f7e7094be4ce925ecdd89f2f96d4ce80726a7bd013aaa89fd4a9adf384a28e9c013d6955270161943262ebeede41663935f92f533ac2fab44603c4f1553c6a98fe39319c8e98131446a32a81f5997db4c234038a4737d81047ddc4a1316a41a5910bf5b0ac1c232f40603a73521908ac6430a45ee6b4a040617b1e638c91351d14093aa5d429da58407d244bc9ccccccccccd2a7539f9ec7c4380634e77f0f32822ae949f2594a29e5f498181fac87f67cd5355be3e3b2335b630e1b6915e9fbab979c3fcadfb8127759eccc92f417d7437bcda4c8364594e912da437998bea5a9e463bf9bc39f44395e18fec82d002abfa451e234ee9bd5fa52d546b5fee2be00d4097b10b2333c501f3687ec7808b233cef93367d52d3d4dfbe3b0335d8fd08f6f64e49b1bcb2a7151c7617cb22e8d61e2d9ee69d24586e89d66d239bd3b76cc09f49fd3cc3a3b47a4fab1ce0e1ba020dc848d0d51cd0fd9098c6aac4f7511db383be3be9adf4cd46e258e703ef2e123afa117d08f5d17f3a53137e7eccc7603ede7ed0c0d33c831c3b6d05f636749417b7a98b4eae3a37ad329aff39e35d4db85bb31e88bf5df35a080f2d8d14be8c742dcb338fab9070bd39f4a994c423c6b0fd15ef73c6bb28b813f461c17d0af6f6c70f11bed7996931dd4af735e883131323fa0dcd1f40c0bd3efd3b345edc7d1df37564eab8cb4cafba66f622c62e239a9406ed1e6e001203af04df72fcc01c25ead420e83907ffa8a03b3b9eb826e515d987e9f09a5359ac5d14f93a0df16c1325ae5454539c4286d24cfc927c6e8d11fbbaea01e638c5106ad57d7efe6e3abab9bddd6454cab42b12ad4e5aa59fde6ce68b50095bbcda73d18d0a8c4aa624f7bf107476a7f14b51f06ed0c7ca902257646bef544ed7f1293f67eb02a5214ebf517a3c08c50c19701e109eb25c74f62d2aa08c47a51ec10ff0f33c282f2535d89daff6146b8cee2d881ebf740f8c511e405fdb62a556e3eb57ff3e920cfbacde2f825ff7ff2211535f4627a6ce0851b40433290d7f376777727105f95806b94c8d095bb7d2a03fa79b18789e77945601576373ef15e88a994fb6e2aa0bb38fc8be4448662d06bafab47ab7a001758debd3020ecb32f719be37a1e0450f7b1151e66c5ba0bb80dd53499d6eb5f21affd1ad855e9b56f1a3d768686b76378515b6747c6f990957efb96d1baaecbbb4ad9f6a5acf45bf6da57207badab40e9b76ec7b4f1617bcdf4f4fb314b7657ac338b0c1f94dc40dff43e68bf7d7f0f5ff940dff42efc376caffd0da6a7cf9a0b7713d85efb0a6c5d054c1ded64b2a31e3f90c94adf8f65dcd6c8d094b8adc9385f6d9a0b8f204a6ec8bef441b6aede50ea8268dda698fb05c0c2aae27ff1c8242d89bd64fd0ad5a2565daf9abb3d5a45baa66544a73d263e36a4d64c36b5dfb2588889faa655bb9a445378888f7a082eb2fedf573d1ca67f4e4affa5a0f2b3848ac1ec7dd531319e979adc0959d66b9551d57a2c1ea9fcd65babf2b772ecb610bb2f1e515725a5b4acc9fc9ce3f28f3db866655147ec2663b1ab1fc0036abf500a0cea8500761e802aa0768edafbb33328a0bf03d78f79aceea3951641bf3deaa18707305e762fd99002670bcf8bda60d416a35a292fe897e216a61f867118b0f33409fab1902c925fb44ab2100bcd197162919cc56144c764b369f1844f504c8c0c0e3ac0f042904f8c89e1d72a33c7743b81c8094238adc56efbe7739759736a37044180518df5d38ba3fac5785184a69b609d7298b6a8e0757f7640e5e57a69da31b4c30323348c5dd0cfabdd95394d078d01fd627c9ac4c4c4c4a04bc9e6135331eea77ec70d2f3664e2c65475a9fdbf335dfb27b58ce818638caf73c35aecb6bf357a847e29984aa5a4c42992b3f9c82b567c36e6b4aa23503c127d624f7c1277e2128901b5949de9b4b7757fa3019d316767b48d468ad48e455a25634e7b3a54a014094ada212569558c3931c7b2224e9f5ca8142d7775450d11cd00000000c314002028100c07842291503c9ee8baf20314800c879846724e9949e324c9711432c618428c21c010024004406088860800b17ccc0f9967cba0b8be26a7e1c0c86b0fd9938b95c77bf289c01d1f623c61996d1ef4fea49764f0c2b049a02c78c15122aa34838ea6fb615429d635e75ed5753030ad8a59a4522b24a1fc86b48a399eaa3259231cf1db1c037c5c098829761b2745f8b61669be1b81f9ce0d544cc9e14f5d5b951e3b710f0377732bf956fd6d112bab45646c179e17ce52a5430a3a7de3841c2611ee1522d009c0392dc4a1455c9182403be85fdadb3feeb9984c549b26d5936a64a49d66fb547d5bac0cde18864044ab5dc0f2258cf8904ba549b2c13aaa2144bde86bb6ad78e66be379cea874e7a047bd9d8a43f0c8c9e519ac44135c0027dfea9142627dba5acf79b5e18b799febb6c8b00605e2a14a11e3f405dd2af6b6609de284bec7c70a72c4ee1dd0f7d860e59527b06900eb8ecd3f20f861088d0403c989203be1d83c85002544600e2282e2cf2bf4599e08e52dd7ace1e439b111b626ce1aa66ec44d4cb26b08aabc113b09709cf6fd771ba079477abca084b366c60e30d088cbd37519797e135874099aca06606bc1981535ce5f51fa48cc1e3f54012338cdb386b26b40f39258bf1144a2858f610aaf72ccc9bfa6554bca2085132280ea71dc89270da279cf75e80449a3df6acc2490a3aea297685ca49e02591bd55858a925ad400c494066d90aeace08eb5ee1340bed2466250de91e0de74e31e16b1f9467b96f546403bf022885fcf45489a23d9064264666db57839b06a8a8454567f251bcb9350915f729dda1ba650e64326fa9a3b300a53f98cba9c7fbf4b66d5bf35fc8ce6e19897e1f56fe21a04ff62cce5ae1e479c8a7fa9b414eec877caa37b39e8b9eff3b94babeea8bd5cf31d3777be35f059ba0dc24bf162ee526580046374471fe4598d4d27ab380795a483a2b8ba28ed21f96c2cc1a55e31a2566e9ff039519c85fd74e42cff227758992ea2666a51085dce7f1ca77eac16eb6380fde72f0d2f9e691420ddc45d044370c9ca8d340169e243fedd3b3acee9ebfbeffa4cefd9e3cb5990f222d0c39b5bbcf7f9ca87fe6f46c322097562792396e65acbdbc8e2242dcca334d8f898be7a46d20e507ef68c2929764d131420910f6c39a49b7863815f751eca0a4d0ac89112d0b17af00a13209abe222b52081e0a2ef6188a4dbd248ea4e709dadd62fa4c94409bb40ca18bcc4c4f0249566d533082ec88d350de8a0b911a28198cf0f20ba2e92251d43dcaee39509ee1564d3d3d7bd8bad806308b75caecab81ca765c31302d0c1a46b5120f834356bc20f39c566da9d60c952f5b46855fefce142063de20b3dcdc0e11809807e580c08a6089f413f49e37b1c1f7bcd2a13285bcc66899605e9387fb122c7da28d00daaf81a12397c3e8548f19a99bb688d2639b7bc4f041523529b67f51193dfd3cca7aa3cf4f691efa6035273a27eee200755a4f836e293297925f15a3bcce3c587bca7bb0d650d30f01a7b42285181ca1add2dca15a84613b725820b38e55b9deda862d133f3f21f8b4a9556d9d2d044b231a11c0975c950cb282205223eb9e5dff27ccf4092effd8939f3efc8d8fca201c0fbe737fea62f1b7508f9fb24ba5a35c10325d3a33e94ce1047055881d124e5346a9ec4f6401dd7d1d403dc263cf4216bd062ec6c884eccf37edc5dfc86146067c428c238abf8a95773a9a1eee70feb69c9ee0204efa4c530ea1b75f082c02d35de47378dc6d749eadfb2525b8924bff3f26b21b892a1914fd58a6a0b9ea50a176b99d4a8fe98b34659819fcf0717104a09b9471b79da8ff47cf62071f22fb9e0d48ee3ed3384c6706f3ab80a9ed9743bdeecb79c35dc3fcc3eb68cf30ebdf6b0f77fdf412ec373328faceab7c57372f979471a2b547f4d8dbd354285f19a107f861ac3f95cf34f5adf871dc007d7a0997d7003a16d089b1a13da9542da07e4bb60ee95949310c912408a61a6c7a04a86f83f8ba5fdc0e82cae08bc3aacb7003db90565b3f73dc7d0e4d3eb58c030434dbf779a495f76f11054e1a36ddfce5e47eb422530f6f42bf0220717305c463cf0996255f804c0ca8347c01ffde4ad09c390d9808388a013147b6d3602b010b9fa36fde7178d53d402ce629b5917fca351d5b31e7e781a4c93948bdd9e16c0967a760cbec54b493e592e9238d0516f36085f1c7a88c254034a9cf7690f392b806ad9d6fc2d1e128ebd841a6f561514aadafe45ef2bc2400b9b660deecbc9aa3d0878c35cb7fda47af1a45e1a0e2ec9c58445bb11caa2c3d4851ed6538ea0bc7cf7238ac087ea1b9a40cbac12f236e974a4dc206ce913d6e2cf9901a79342a923c6ae6d2e062a313f911005055d6a8ba66c445c2e481cc2375219a27af6204a57018ec54b261e8aa7f1fa2ae02a62c0fe02fac7cf4d52205e3dc2f07be122cd970129ee21d2e8077152355343494965df6f41d8036403afbb1967458427cbe18a1746508958886ef51f0ae89de02580e9099a0fb1e9fe407a8c843dcc9369f904a9fb6472e8ca3656094997161db81acc5e66b6927ba19151ed81248416bd0b5fd2fb599a8f14ca338205ee1f740e37605128ee92de9086b683d9fd58873188a7de7fdd3e383f45fb1a0aa8a33be72bad2dee9d35207d2ecd3e106efb5a5acf19e2f4297ca435e90c80eff09e5b7586b81ec1e522e6b99094ed5e1502d25cef9e7ba82cef57119b695f1f08fd5abb7146cd4b109d1aba77484478228af9f14675066c806adb3056c483b2453b1bf237b85abf5f2c3110acee2862bd587ca3af1b9a59c6e3cfec2b8d084c2bf2817b4e660ec9e1cbd3966352e6102bb307ca019bd57c41d772026a4ef90698eae68626419788ca2d2844858415ba6f299bd41128f3245b12b336607b8bd33c76bca2e42528096515df5d19508ad0fa08ba9e4b016539e8fb9c43a1905f3f7e12aac3c76b11814120181f910405a5c42830050aa69830854da9a78da4e017684ee3867a671d65a64b12d435ce64bae0438291fa2979396aa20e25403eaed0db19296cea109943a216623ad490120a1c15dfc5654d06236968dd61c249d5e5b4e0a873ab7e82f9f870cab78d1bb9d53efc1b5619209ad7b93067864c9364b40cf39befbf90cbbc00824d840a56d6a4aefcc0ada183a8e0ca05646f5c8eaf080c0f0da7f3c8a6af7124f7994b8556cb0850c10275aa985987c5ced5a8b74f96e6bfdf2450602de0666496885da3e680d5750a10f74bbee1693c7f716044c205f199a72443299f066114d7f62c830204b398f4c03da6046a822eca590588c31db72722364c570421bd24105b3ed499f9c0d8d69292c9452c1704479d4baa2876197baff7d21b64e4ad00487da538965519a52ca802e88176146d263a5438643ccff0a80a2f0cf615db68e4e21933189bcf55e11c83ed288bc251790471db734fe1f731de1c8a72fcf3c924a62b0b9fb2a23a53dfcabedaf75a3526ad81ab0ea922e5452462053a3450a61ac0823b838a1c4365edca803ec5f8b6dd649b8ef01fbb6d5656461ddcd5e2125686921a7659aef58650f775854bdb160c2dee40ba213cf9cffdf14df2291b6f0c2a975e5ad5cfd82f5d73a4cbc24f5f41c74a107a189e47d27a7d642e80f4c5ac95e132e18c4e1250468d62870538e4ac45407177c5a41623a5fa286e47406f39496e758557ecd947195d65df20e38e6733d3a3245dd2edda78c21189fb29011ce98a341be0cf96353c578f163e7cecb88ff410cd1ee203dd1501a878c8220ebcaa0f878ccf2d4cd3f4a9163a6aa1924bba8c159106e7551ea60b4f5e140ccfb0e3c9edd651fecc938b958e56593e75d5c51c0dc1a518e4260c8209d06d36cfec897aaba997c73e7591892d47f5e860ef2610d8db9e17a51203949a53665eaf41d0ddf7e9061ff6056826c2d0368164ce49e5d67f72740ee19f5a466ca92cccab9372b8c226d129d4e25dcc8dbec0d4f4d5880345858de2850c3a730ca38062e0a61c1bb460c9cbaaf911ee77c4cec6f2c53d5d8707ae8d91f187150bd53156f4050f83096f9c059edc76d00866a5c744224b325eda14414a984c93bc9d2c1613f42ff221b9e6b3860135afe8090bf0729b4ab13b098ba7158ce125d115fa3218a6052b032ef019dbec1453fc2b9dd043e068e3ede390c4d73bff797e7dcdecedd68a4729e0fe0e177348b058622f01a98a8cc83881c34e3d869185cb30fa2e92d35c94a2426209fe9a0a5b1a445094a47e9ec316dfe7cfdb79e72a29ac9263eb30b9d1d77bdf2b5cbd422a33149eca1a7c0a8202022ebd9b643916632e02eee5b1aa6327b9655f556742a7857ee0d7af5943fa182751e1302ac968a9e8724e1ce8a647fd6c15b343b3a1611705e608f98757bd3789e28a375a31aeb0b3b0ed8ad77e3962274928d6f024f53b8c5df2b86613f9fdbad45297b11dfdf446f74a9715bc0e4825162cad1a10460978ad8f10d967fa0bc252ce823b27159c6558495ca83b5a77de993d5ecc65dd4dbd9c148ce59928c77fadcddf20245e928dc18ad601f3acc2d09f3d09f44970784fa57fd384016c4c724cc2c11f5f17fc09fa9f5e3dc7ab5a7bff27c2133d0403f9a61285273a479b17cdaf777da764cc13d3449827292410a662b1e1d9b414021c9376ef9482b44ab7638c31f8570b1e7cabf5ffc333046030452bef14ee37b64208ecc74ba4caf225d1fad206b527622943aaf9a04f2def4ad4846ccc812cf63ca12a9f0270b25bd7d17d853004cf3a1081c3523432845071e391290a0394c4987c74c9111084f6bbdaf3726a21d6df44b08dda93c1fca8be79677284148a84b8a00999c6d0e90ec244f71e795f6d48458feb83b10fd4630cd5e35d24c9199868602ece493eee1d543e91f3d8c9d2eb9e758f744e644fce3c1a4de0d8a2109ff037460d1deb4145a519f2c208bd8098a5030626c2d81126e5fc2b723fcc7d3a76673992e67b59a13e987a48ee0c06180416b74110f4e6e5278315f105c5f333ddc77ca79b365903ca7cf37292da84ae82d293838b21f88a8292ee968142714f408d9aa322c5ad56a8132ecb70e0ddbe642a402e927934dc5f0613482e30b9d305ba8b7d8bab7800504d03a119469977ea098f7e7816592d1849ed7266be4f2b6142348bdef6769252f4d9019e7f506a6527d0ca013597b690b4002626169fed8b821207efe7b0a0c5103406ca89e0c278e8a6b82f349ee544bfe4cb63b261cf1d62ae02dab1c320d2eda3536a1491bb7ab824a2eb03ca83ae7272fb48c11240f47401febf019d9ebf072a2705ee336146bba59037c42e6949d36a513c826cf17e24379dc914696353b83066dcdd73e773e3b7b80aea870124ebf24282802d57aa72d621a7b5726510ceb4e5da00eecd41071e673fe67b97acf2441c3cd76da925565886864737221a835187150f9345ceda9ccab5b07b72527d3697866253556f5399f94eda646362c8aa73df4cf37db1ba5007eda2627ac7bc5b8befdf1009c4245094b58883f9f7536d2d2d3f705ec6eafb764aa685324a401be1e601ba42a419d5501fb08604eea6126aa8c163d794a783866362e4d11da94a10dd8927cf403443c64b44809fef3ca0bdd9405aa60bb30a24249d07ccfa472d7ba1f7b494cab8ae534e2c1a3b53feed70415243811b08898dcffb6874f4333f6e6a6a0b641221a130ad8df904496b1e428614041d33771d3781113125dc88ad01c2559c8c16d294364187dbed67776fcdcaed54053425e00bfffb081b209453bb53ed843034755fd54deccc71d548d6b95d751fbe1fa62de5a38b6701314a51c92aea30a687e972fb39fc33296235db329018e4b6042b98e4cedc574d6bd22da47cbdb765d694238eef90e8ad219afa0aa7054994b49bd7fb1986b22e781c6381c3faf094c99e657a807b097f9a49798b9f59613f9698cdfbe9202f960827971fc20c799e4ca5961ce9b4314f8014cfb1cb27bd7b9affcb9a63cf62dcf432599856ee02ccd17e3701b684f9bcbb586557598a98cc7e0893ac4020ea799850dc92ccf60fe477b1b0c1cc8be9e3ac04f49bc227e3dc89a39d2350911bbe41bf44c6fd814299f480ac425e24553db356e3eccaaf0fa10aa159d1e24abf090a443753ec2122dd3cd9d616ac70c719e961f821ebcd711c50eec740c721aa3f8d87d87d6db366e177ab35b510f1c5b306ebaa5dce93dd33cf95c084dac60463198a434bec8f4a3c4a23dea6737aed603b34a6e2bca036166fde038d7a5d3231dc7774fb81827c53a5dbdfda11487717797e05898614a36bb80eef56f659bbf879d56cae529b384f132170dcf1a0534cb4585364b3f1ef795690eaa1e911792b258a13990463e95d2b22a420723cfd29bc748d605cecff4457d67c522cf1d7f059a88148b61358624413a20008ab739aaf9572eb91d495497d26a1bfa583bbd278baf98cac2ac7535022998847274160131c6557817e96fa5e52fe2f35952fd9de1269625e67f9009e6f86950a76e4ed9d1a3b7d603d0496d05824d2527cbe0b69fb2077bd58d4021875711eb0a0a33dda7cfd53ec294ab282054cd8a1251a96298b2e0fc1b643c48d64022fe03c263f0c16b8094fd17ad6ae4abbbf4ff2693f21fe77df2b72bd8f2d7f30b5281574ef7b12e64fd7b6da2a258cc1c362075507407c5f21c1573b6a5c0a82503ac792b808f1b2d3adb0dde3fcc0b267de96a8d047ec87cbc9b7ed657c404706c0f6de1b57d8c33c69bdd663a4dc09d443bd98d0c7904f28301cfde4d6995c21815840aae1525afa77016501a952b0eb2f941012a1db281e70a63316237e10e97423da274395607e5cfa520c0ff04ae212fab54ffbd760b22896d32966a77b6d474732e9be3eef0189e590e4a78473ce594a8b4bcfaed672b86d32e7f8ed6fc963f388d6e6bdabc203af47651b93ccd50cc1c5802bea15948bd406eab1f8e94fac32c62befa6bad9bb012c8efd2f0f9f10fcc1960e59a275c28309c14a39cfe44a3a79f997b84269d773c5a0674ae5b51213e1a42dd877ecef1bed3bdd946001ead852c199b29da16928ba7a960576a5552d2099a141c65075ed3445ded0cb270b5c0feac302121b89d47b110077654fe3f2a2fd3cb92cc9f8629914d6af4b0c0251504097ac601fdc97aa1e4ac02f0788c70bf5f8af32c0c55e89383ad3e6e7f9d942c43275e0fb92e8ca2c4e180d981c66b02e15df431ea1f93b1113d7701e5463641e5a79281d1e22873107159539d52209020c1f7b24151685440513d60a9e1983a2e408c391832f6a44830471bc5927c1c55c587407235c0f0da71f269b96a7c6ba682b52383f510c8fe062f67caa8d5c7bd769785a829fc12baf50a4f4a9f821e5acbb6a1da07001d58af82a05961419f630f9b3c1a2dd5885f15253a4ec7d39187fc78d5f303a76aa266cd406295b07ea469ebab34ea2d0f07427f05250e6d1d1ec9d7b56756b4dc3228fb5f481e4cb6c4efe526c32f4b724ef5693211340aceda38b162b36fcaefe05ed459d9a167940ac846d7ae16f2a5460c6c774853361f15d8732295ce78f4e41fbd8a6f5847c06f2ed53de8d5c7251f341505dd29f5c029664eb3c166316573d3703f49dadaeac2d3a532e7f194b804201361c82f305760b532f1f9ef26811c9af5331fed375f3e4c8cfad9199841fff44c283185a92435bc605b8960f114c8351059d1bc83956b9e3c324d60b524d790a24ce6eb7f8a36bc6d9906038d0cbb418fa83edef296971b4c4dd46912e93c6517af20ee257b08fda16747cc7449a9a8bea6174172e97fcb7b4053551e4ac22a59d865b6e112f99f9caa9deb4332b6360a354b0ca5aa9985b567050bfc718bd3fe166308919ae5004d89cdc73e102c4635dc0681dfb8ff0c5c816a2eafb1a923fc127d837b681d81a4fc793dc6baeb940451111025b17b926acba316e62991ee8a12aafd8d225658243f30c33bb84ff9ff64c3805fe0da3dff9e3b79ecfe40b70ca0c2ae209ab21bdf7214c686c899f8e8cefa37a9c0235f2aa411c0048bec4562807a8916fa2be1b1196dc95fc74e0b261ad9b38f509e909694e5652b509daff710f6d6349961955a983eae79cec951042e36c555dfa4d73f6433d0df31c5ed09a2a9a141a9c5347abbf374be0936fb1f169873ef3ee6637052002a4938bf33a11fe0d91b7c8c7daf5c883c82c814e569d4aeb78a73975f62a74a7c1249b3d3daa282bee803177756a53cec1fcf9182a29fd34969e6331e0cf485771f22ec7139815c4194355f574da0e354e8bd9d6541e17831bb1e11dff88b3ff6ef8eab99633d17d24dde4865368947a558188875beb9988ff8a6af5dd05d6f520ffcfedd91424cc58d961f344342e8a48a20744938898a4072481af1ba524dbd5d679a3adc242d69177f766f5f02108ef1c3dac87e0dab76f329ad90b87e71c9933d716da22d6a339fce8eb6c1f16262160695ed2496f40ff7000e2f6ceb25596c86c3fee678e25e6daf2b7de055653490313172c3c0717f557046b018975bc7486c912a10c61dd304d69d53dc48da231e4b88e977d0e79fccff97faebb251ed103c6a92224ddf6899d6a2dc0e05295633981abced6825aed486f3097809c670582a161413d5866eb683472e5c5da90e75c91b9667b760285228588ca7abd24df50a6821039454a0ef2eab1af8747892a120363653a97c02819f65b5950b76beb962313d632ea365b7c0e7f65f25d9861584b5a291c1fe671a8d4d0d76ba0e2032dfeb3c0b38b7278e41d1478160529385f0176050d5de23b852a9cc1a3fbfb8d5380c6fc75f3c148ae38c472795124369527263c1c3e6df7e6dd8bb8527974a4fb312b1440c800a4eea9dd3d0c3672a987d8a3bd54dd82bbc5c74cffd2971a12892f69ee9cbe4698503fdca3e26733e6458422af15996d04462afde56f0f0af1f9841aec59e0d1f9d9b9e30cda1d5bc014b0deb27ade65ccdfd30269fbb4e721e19db4fc33c0a7b5469b7c7e339feba4d3f3c51a78e8323cf8d997243164df14d5625c75fc43645c59ca1127511930b880a4f293c2f832c6d177d62a926441bf1dbef7242bc0b34814acc12798da92b9aee9ce1da3505942683177e188deb43d89e65e9f587489b4dcac1b1b0c9185f4599a1b05a5f70fdfb335e58c4dd2a5765fae76c32851aefd9710d9e824e382341a8a9c430f8cc6a388ca9fb75ee9567388af2032d28600e104ff2665311ce50ebe244d59a3573c54c11dbd1c9de04883c4ae297eae32fd18ea73c9c59d4af1a0305eeb0fcc160d97162a76e4d4dc8092669a68b107858bfba5d36f90953b0d6b10ce8946c7ea1be7b3c2398b2c0b8bfb8f49bd51eb8afa5c75d97d1a8087da1c78d2dc6e30b421ecedab340b106a836d7d3c1067da3e2dc7b750388e5434c5132d56ee84c0b94a95d4375ce2e3a13381acfb6f8825e3cd23dc0d82759cfd178f4d843dae67856927a83fd0e2c407baef24c182d4647f02ed006911aa2bcdd6a321412a96407ee4a86336bae35f0373dc370a180b808f8c99cc02e5a496d1c2cd4365e39afcfd531837eb02951e990eeeaabda4c3c52a5e6e0c6c370c302ee0cd33a5955b43fcf77147066350a24d914c49f9fc9f872162986074d1d86ace84754bc0fc24840f91bf9d41df303024be5f4d32d6a9e02581f78ef44663ef1a6355d952ab85b6e1465c7b63f260859ae64cab8180b7915560870a0867ae8b96a2110c68ac81fa2439788b028361d29e66dfb419eda4131ac43fd593acb446141ebbbd47115f1c7f89e6784f4ac0de895ef1065a027730eae6345499df691883ded22f2734ec5c959bfd3b82071f63840b350e5a0462dc80a2bd0276ae6c068a11e89d8336e241424975b2768162f0eb780a5f94570efdf0cdc5a0988959fffcd91ac55156880790e49a39c842593116fd78d791a7c3af75bf8c01ad218afa532d4201a1a201cbdeb0befd71f694091ae2bf805179c3d8b22e36b683b17567037de6b7ad2add1164bd8298ae215a464c13ee298cf394f294583e6439b01eecdff897e2439662a52032ed17cc6af3877e1eb94aa2483c5e47723a1d318213c18cabe76bcbb0007042385105b7e3f10d9322710c1c39861c8a02a854ba734de937edb258dfd0034c6aadbe738b343b6a091b56a482bb2c74fd088bc80e0b724f4e1330d3936886d8c07d9c43660ece87e3c868c7dcbfbff0a454308e62aed81e584a65267d7440d1d1f739b10445612541c4ab5eefed763e7af49b7c2962caafe9154af66ff9315af944b24ba9ad515717c18497aef37774cd7c64bead74b71207990f0ac2c9d926e3946609f4a15fd9cfba2f379e015a07f353e0496976c74b2827bc30fcdbe2dade037ec4f62545e00e097a6da6c701bd929d348c479b89125e042a162b63e8b2c05adbcc4f1302a5675efcd096ded89541937dab2b2b9bdf231033ce128a546e53a7d6998fecd39aad764ed7657cd84e49286db8afbc200c2bb90c924ecbc9709a029b9ef49ae9c67f766db5f5541035640d9cdc35d859df802e9fce09d06bcd0d959ef13f85892d64b5de631515f5383c8f9269599eea585bc285eaf60a573ec8d4b46ea4dfdb05a2a90db3a29d3ec5352c9bb83853ccc3a4ad0b1ac07799ad28f44ed09b80007bdd12a5a2510c6f43a770db4c09a1d39bbcc454090e9aea45b380d0396592ac302ffa896fcd2b02e7dac5d1438bc6e3db333911f56ea470593cd544ade9f4ac498c05f794daf6ffa608d355a3e67bd99e14fddd306a4d137de15518e310d2fefa5e8539c1d855c2732e5263f5ea9ad3909e708513ce371c63942831b1d2f4dd7c7e16ac624b63cace52e80950a1019c35b546252d0a634fc0abd8e6d41a8a2a69f2ca64f0bc24528c06ae5fee21dea282210eb304a22f6de292dc02b877e76e4d3b34661dbd3473778cedc47c52433ba6de899fdeeb9a25a88b911cec169d6d39bad65438d18f758c614d1f088f42b841095a525dae3f3528ff183bbd03aacf7437621b5e10f2a926b7aa464c3295a6b2843094ab02055efd3a71659989efae1f7650dbf3503d1dcf6590eb764b3d5f02ea2e98acc180deb4410c697734f202e21740ef69d70b370bc016746039b81bdb92c6e06a5c81e52493b32aa58e56aa779a54134ef3eb17a3c899778006660d1737d43cb3d34764120fbe60104f04ec1195f8362902bea9c6151230cc8886a4ee46a2c62487d79e80b653a3115b465471d3b4f8440a1180907d13f4bd3886f8afa57612f94eab263e672580066a1c4fabdcb6aebe1ebd4524e8d970020c5339eac7f7efd15bfbf73ddfe450f8abf0a58aeceada566466bd33b818a8f53a5fd8752a431022a82b9072bd95271abecf484b92a915ce743df17932aa4e5fcdbff88d9f0638737fb1611be62094b449057c733c881d8a07da35c73a934eefbb253670a50965889266a63493c140880ad04a80b5c9302ee713a9d1b111ef08868d1d91ccf74170b9c8ce67fdd6f3f979850da128bc82702e207ea58dd95f868eff3739bb89cf042770184f0523d5eabd62569e79891e1f5bdf48ecb41abc8aa7448b79fa9cdb0905b0a9c3b11a75d0a53b90006939c0951d977d369e1f24b9fe167a32e3b3c995378dba8295597660b918eb7d2211ca144b52bbe707a377f642c865541f9087275604c984c5e51a9ec1588245a444f5cef04ea9783b4eae87f94b997618b798e66e1f4274cfdf001f92d67bb3e657597658794c8146604b5a344c66b8c9083510c407d9f176ddbe118e393b5aa030b7188e86dd670cd03fa281f46894aa7bf18e58d7764f66be224e620f805dfe60829d1aa40337961d71639e30a42c14dcb38e0ae0a8525b111d893a42cafa7635804f8f58ac18fec6c27805b57064c814d6049f131edcc53218f2d9c849021eba9937de3310a559d1f699d422f73f0c307a9e456eca1e6cc6b178689464973244980032746dfd3be597676a23e87959b9ca4bc63f1862bcad00cfedccd0303f905aeddff1a852867abd56a87bfd0098d24ffdc53f429576502579cfa64c02dfb462a3b4cac8d09e846d2247eb420868273d1db010789f2cfb8d5a60b45dc375e8263a743c01dd4ce07a89e2a932f62167e598caae4e7cc2a4af7fdf5a046cd862c370e0e45a34150eddf866e952242154049a157a236a81117e96ff1bb934fd844f476aea63fd489ac6368aac61386a32bf1b93b677747297de39d8a8a0064c37bd1d20a0e5b12e636b907200054f770f79c893928d87e8d8f5b0b5e638e3daeb4d32e154724c6bb6c0f51b011490304cb3605d36f09d99c687c8314d89425a9b49e0d4aa9bf9598608dc46836741d14288f3578635573dec86578e5b9c53cd51b6f6863efda32ffaa8e502cb50e53533fa52ecb7680ac8cf05197c5058011b1070ddfab89f6050b9d347fbb0d2ef3b8ffa5b15df77bbd28838fd58cc06a8eb48568c8a1ce4d36ae4a18a2b8903cf2b0539da51af7fcafe43ae24e51380eb23671c7f3da2c20bdff8c5cab43037670127b2276b9f5a40e20a436d2cf689fcbe101a446ea0758b5d34bc6c171d48c3461b93079dacf1d1b3239c31ac3a8c498e509ebe8292c46fcbe65f854173aefcf9f80bb396d003fab070f84ed8f77d961899d253bec0bf5b2417ad18b53650504f65caa22bcc8689d684e91776fca21e2c75bcae304163b122d7e1db28be63d3a1926f1adc9c33c4f9f2c6b0704ab392260597962eb4f7ed55cece468128eb7cf3986173cd3e26f2d73e90e86b54e2dba47f745d90e81cab13d9e618a3f6b971245624a65c5ff76a85a48863ae08f5ae1786625363820b64ee965f401f6283fdfe79171d4022c0ec79c9fc361b36d74203ac3eb1e8f29d06cfb1bcf0f7becdb1207948aa345d440813038a78aa542fcf2a732b2ff15f52ae0bdf86f9d076112f034295f6c8569e5aec8351d7a3241897486e2f8b508788f456acf97f11599b1b0c8d0447e62a511b9beecbb0257c3141d5c09ec03de390f91288d76facf4f070b717c410b80f2307bfa0da23bdf93bf0a9b130851f8821ad9f7441adb16201e091538ffd4bb513e588dd0161562e3b7db52973152632ef09589b583a0893cbd31e800376cea51e4af14304033b8ddfb7230f9444b97d783b36bfdcc0c4750098fe214081d7242617c1dad4c9acf92a5f1f3c36ebf8439dabd8aa20d58f17881f47c2be7e65c4fb47942315c41539a2a4006a9f8a3692f0c5db9a7a242f2e9afbfb45e8f608f910e4bbb8740182d439a9998f6d29bf88061a8d1aa7c943c327723b81a92c845eb99c44e839b59a42dc996bad9aaef3d57de0f99a34f456626cd2ba11a1113763cfcd83ffce717b3fee6b8f5a09e4c8351b7a0e4714065ea79599a4f061ee8ecd921e8efb10b26fc0d45c7cd6aba18986416cd1b2c2c2961a0ede91c36bc596da3641ceba8a29a45012632011fe0978934c42dbe978f7392ec0c6c3d919fc405fe3352e52d7622445a5b452c76d18e5c5e8b6906f103c6feb89b2045d3cdaf754654e3f70bda90cc998c5f0d9c752046603ab815a6f26348aae07f33b206ee133a036c62d7b58157b3ece579c90347c4098d47f8a47ae16f06a3c0048dd9a628e05bfb9fb8887478cf59f80b980c518011460de2f8d002a82014bbf0a039e1ffc290c2b40ea03f5ec70ae72109662b587c9061776b794ad294eca26e36231811aa3c2ff4b9f9f38aad3f085cce1fe6084987c969422c45f8b62aa9795de5868c0bb7387848b49ca687b47270880932d92eb5b4ab3b3b0dc885313f8888ecb84270b2281ef972582274c607223dbd36ded39077e8825a87964f1c03d748fe86568b20e6b541f279a4aaf120ffd63f4a6062ace4ecb2d53566d307e02d29544252a2260a59ed904a075019a3cb4f2dbb9d278bf0925625e02bbb5d6dfb9d2a6070893c1fe147285a12c577233215852e261124fcbecbee148e068cf72d119a928c199ec5cad3267b6e6cb7d75f383099f7134c32bb144618b0ca42d45232297a00670cad44a28eb54a2b03a8bcc545f7c606ffb867fcbbb88025cc40ea4194510e51490107aa370b880008e9e10379634e5383afd0f95aa6b39a669edbd9ced6de2ffd8028503a7bf655416f1dfd5a1991179a86c9ed0819769d9c8461407ff30cde9e8d355a72edd56472a99211a3b3e7fe5da6c47541c59fbe45061115b8b852a344cb67013ca01c77d3930c48ecd7f7d07d843407e3d848ba0bfa6fb90c024f5a174a3a997cd100c825116d48ea261c9fb5060c3869659939df3c38805dde198881907fc93ac04350a561f85f67899b6e678d7b9351e2939d0d583410bb137d4cc6cd8676aef4b571b610c3d5e694c2d3840911e4f4579952905af2d7343e35a971be2629f7b624fd7106431b1f435cad4ab243cb286f9f11fdd15c0a484c86782d8e7cc3bf124a9d091cb9d6ffcbdc469edf47adc628f9e5045ba98bd36eea77f37e57248afca48cf29944fb507f05ab4619ed015ee08a099ab673f295dd2c20784d2873318a400d94a01b90e8b3df2efb5b976e762099a7dc718508a6886f8dd0cdb11d877bed7e3bba9e5f6ee30f7b8834502165b77c7aabe3a1d816e507ebd5d1e0e6a59044d6d3f5448d1bbae19f589c7629382b557bb69a1ea3e33f61f90c0a3f4ed3009c29aca9c0f6f2fe9e2b4cb3cc49354b4731127b876015671861ffa7aa75c5c6a8a95822381f7595c44284c67d5f33008b56740ac2e9495440edde5a131ea943d11f0579bc7cade23134201731673a67e5c74bcf7b8bddeedcaf17a6d54b2c5ce689db3f6b422158c7bd1389fcc429c8296b7e50b11860b7fbaea0c62d963c46b2b1899868d6d1090cf2ac6fe695556283362ff6e089452f51aaea286dc5890d6182ab339263a137ef7e3e32db2c57ef1aea83b5d28207137245f8046b4871f79cf8df7c8e9be15567021d1db792513d6353fb23c57229b410254e4fe38a2dc6b701c77069530f4e1191c9788e69fb0a1df9e6817dc799db85e260c82468ae9da8489e46e98bc09a24063bc5c8b37c67ec1f335c4895b8ae8d7212952294a5ff48b0cf1ba51d8200dfb8896c1f64fbd27339a5f0f7a8660fc387f6cc05d5d762b7a2f7233d98593daf08e727dc6a4f516286d77b50010e166b6b0801cbe6e5b7457b0bdac1dc561f74b843aed6c5cde3e8dc94076a875e99466437205d7352ead681b214894f908709fed3c0e3ffb22f00c846e7420a7bda94ab89f1ea044df8e05ae36a1fb44513534660d4c031fbeedbbcff06c8126b641fa229d0d0271f000b3880515c33f60b6092f007127ac5d256fa630a40b0161a147b111ebcfba9b5bc3afc972b7d0cd9a5e6cabdb8a3357285a57ec1ab7a84de505bcc43f30a552ce5810231b7aded1705292434267eebe9e85b30da8ab801e97859a7261a0e472465e71212fddbeeba1c041e085827d508eb9cfb9fa429cbfcd84cb433bbe7810e4215836d8318447ecc7afe27ebc24fe8ee276358049c023db93dc601d1cba57069c64c067c0a28a42d776235254224e42b2a53128b2a8bf7313deb96bd69e739d1841d4968451e9f3dddae05f53dd3f9a0aa1deb7f87e8571e971c1e8e98e0410de1f8c9132d972d17cc0cf6ae08d682ce89a5832e9e9036191a94f1754c3c12d59b3c68439305849aba37ee9420bd97ccc11c23b1f18b83b6aab05697b160e4e21b847f59378e49bb1b7c1e4be265bb922f967d1288548a907754d8c89cf1064ad2338049fd001e19285a33a879a8d745e5497555fa4d1622af4aed22e688dff218903371b7810a0ba8bfa1f2d2717a400a6b757ca728a2851773a13797944aaf0031f8997ec42033bc4b780dd0c0581b27b52a659326ad720cdebe04242b27ce08334a43c94f7f4ff067205c8222fb3799ae27faba382ae9fe289d5775a4486ab00921ceb5a53e39b19d9631f5a7de5ac7f045f84c100b85ee3d5b0a7635d7941b26bcaa85509af3fa3886aa3dc69bb1eb88c970c1c94a28c07934aaa7557740907876f57151e48cab9c9b64b6b7512c38edc205e453940d33d25b3f62906007bee8cb36aa510de30be8783a8127e324b6f5e66d56cd63f73806cb374e7bb877c89739d0e5360a1e3ee8bb171d607c769d61b467c9f5536448927b41eccf2018dbd9c8ef86bb7b2333d94d47b7d6f8f9951128cc872d68d8c7e5c1a6a4b676b915991fedb9081d7485ac1126314ccf62f823e13b3a4c900d10a4dc201a39c946ff0e7132d70ea2736cecdf74b03591e7aa008520df9baf5d4120e74b1104955b269aeb4130c8343e4bed22ec0382fb131b6a37031ead37750743aaadd01c6d79dd7299b461f3e1a6b923e08ee07d64f719cc9b1b192a2167427041a5aa52c211ae43f4b45048b851bbfe18f03d9c4544803e32a7dd2769da07d8b0d90555be6c911632fd1ea6c6873a65099e964593fe6b00a371c6aeab5c94c9cdf609bf2289f03667aee9aabead8ff6e1fe8a66dfa840f01b8cb964e5676dfd95369edd327b2e805da6aceb5812772a029e25d4c7a290d32c6b5e8d8ef5651d826497ab3acc6cbde8cb78738d10821902007a505d98de595f0b55fe4cf485aa8ea2486b2e51c828a479a569ed4b12a20705f2962d3d099892cd114033c1fb915a1740f3361190a34ee0be065e64d3a784a3b15b9b59ed2383bdf8394bcc9d6eab2130d7a76d3152ca65dd90530b6c04afbbe558a88e923ee5fbb4f51e288021bb9cfe5c53af138e2bb27240e122c40405612212a070b2314ff742b76a8e0f647425230d3ac6cc51d8d82c52a323361df1053a3e80c068aeb00acea9a671123967fd0110a560dd2c5de5aed0d667096bd5faa37587f242704b174e7b662fda19cd56dbe88127c2e04c6a221223cca8942773245ae8f342d784625c9069c89e925a5829cfba4a4b557d2d756ef141f005a1da1e98be23fb1e391c6d960c43c5464ad33504dae59e79496a9a4039ac0b23dc9113e1d0b5ca089f5f06563da99a2f9e6d3bef8d75e08770ded20c286de10b2a1950dba9ec0e0ad41bd653da208cd2aa3b5f501a064d6a02c07183b31fd264886601f5a536bc82ee844ee548f926a139dbd7adac6860213b4b7bbbd6ba908f5b6bc6c4542d8eadafe05b54078a7079c289b9987ba89501b4fd5cfe96bbc2d5dec73672c95ac13ea47593695e6139451658817ecf44cdac817e7ce3a31889d3d1cc2b125f8b51c68c8125be1a691ac72ce2ab5d5699f99887e877af6a57f7a2fd5adc3f881a630d889d5b30fb89223fc23234f3477f7ccee0e3adcc4f773b433a607a8e8c5d003b3f72d6d1dc54681c19e2aa5c5081b4b804d75a9a1eac1e7db0b4567df0f167e5e31539f318ec8de689d5dc691621eb4ae5f9564713b12c0e24de8d70a40de0380e26295240d9fe22ae2d06a41df61a07e9e4367fe0ac55e41b79dbe9e8a63189fc4547b7426277ed2cfc75a46c07a299e110bdeb427301e204890a1b0897865e111c6c7e2ba1409044ebf7fee8a71fe45b77739e8cab61ad21090f9c15778d296bd45e98f56b923e3e675ac2570e2a2722a163232041105f4a78ccea93408b6a25cdb6aef06a9f88a4694ae8b64212e94bb94099268d4b8ad9e1e153b8946f766b899808f5bbc1f59abf7c5072707418262985e20f31cefb9ee014814c488344fec60b0c30fd2c4566939c329b5b6eeb8a82b1f4d5f114976967a332a0385cccac9991d3aa7fd6952e397696151f1a750cb6f57ef216f663873c8a2db156b9486638dd635600cd28d94afce246df662bd21fb5c25a01ed3e71bb1171e6b7114a4852c5fc25090b0c006ea9c085187937ca5f7abf6d3cee441db4407815ed05f7a916a2cdbb485e4d054919c5bc9a0988c629676d82ccfc4ee6722607f2270019f652fec3fa24e54c8f90869199473f0c1d5a2eb518ea85fdcefdb168da1a0849701907d0e0719b3de1144f93eb05973d307fec839f1027d8d84fb9bbfbe919231042a4407ab3025e3c61049398d3ec5a52b5bf2f01f2de47aadbf81291d3f4f4cde23d25036aeb7f83f501d4a8dee04ed3405c0da50ad6ddfafd2f89c9e601b860eeeb5f967eb135db03ac72385c65700141c15a35daadf7230c2a6afa1f95ca2d1b4c5b4a541d14f3913453c6440a268c0fc90b1a4fe8bbce02c511be5e6c7dbfbd131611d0c54b1527d22eca9a7055f1f2bcea27b0f95c2f48ebbb8a7796b4c40fafaab464e7859159d9f677860cff17fea32bfe0685357cebfb1dc841bd3b26797394b9ed3b6f0512a00c00f7b4f8352259cb1ada34d1727ce3d84db4f9b459d7cb601ed363929703d4dc3b7c5c78162e02db6523003e514d8d4784054a8bc78a5e0efe68f76bd48df97d20e93d44f05ff450355fa77093fd6c6f477e82df5817e16958317a57a62db32299042f1a97c77b455e5a0086f8888c0eb67713ce7e5db41dedc7eb57087bbb16539db5da0099d64ad426b0ff426b441f63bb896472b92a439d033da7a5122f73f8cb839d772c200bbdee6bd17540d1ac3dbc9e04c9e95e2747ce7eedea4011aa14b7bcf419d8a61895f519485ab5da3abc5019656df58a329e0bf12fbf7ee52fbf1b21c16c9dbd5e073ecb797986b7b8d7369b60a1b78e0216097995fcc487e9db10323f614a0b9333248af3bdf04e11a28a3ba536dd0c92f681947c5a1be2a8886d8905eab3f0fdf0763798e4da943e8b21e57ba9fb0f8100d5280dc0b5b060a9bf0a7c2565266729821b2b98f0c0be1b2ffb8d915ba0dce7534760d9160ddd741fc60dcb4a2db7da283a1b3847feabe321d81bd21d8696bb64f4d9d46b88ba9bc35a0f02e2fdaa36e5a4be00e82a46e14af8df92057a54d64b02244ab5cdd279847026c5a51fdaf879ba46124b8c88ae7b1cd61b098a0c1d60dae71dbf099a17baed38258d30f4ec699fcbfe2c884f274cbf7954a62629cf47f158b468d3b1c8e5a1741e580ab47977490141d184127354622e06874647256c3bc163c6ea784f26097c16c4137410872c04b864bb0e8a16d976f56b087a56261bbf71f077aace11fd99186ff899326eb55b627d856994986f1f9bcc6b0ecbdd8918bbe05a141725684d7325a14e00fdb711f5fb76898eff4944b100dc24c6a0e8146a16b7ce193a16da5ed9fb3a860ce019a754668364aff6c1d3ebe5b80a4f268e8020e560f991e7c127d9263da67335b42df3d30cf704f8993245efccfb5984f1487d62a6ca1ea7f7849ef021a598dcf0c332781377707dcb4c93613f01cad4dead88541302cea278624dee64ec7f9e62c7681ee94d944daf84a40e9ac4c101c22990507e91fd8c55cc213863bbdc194ec3d9faeddfd86c747d0e4c69dba52c916642031d2557ba2762c74c75d501c119fb6b6cdca601df9442f68057f3dff54bc7027f4bd8bdbfb8830af6f1a33777e172df7f2f3ef584e83b63052e48522d2f88f47139acbd861456f3dc35ff2116f9b68af3e2eafc42e7b40c6257f64fe88e8c0e2a58f88a1785d8809757eee2809f20fec9bd1b03772f1f83beaa41d6b71c21e858c309edcb0ae6090998ac54ba3201c223b08c3e8b486fe53fa048805ae0c3081dce8e54f14405c09af9e37987956c7ee213ca79f8119b7e40be65daf9eeb082780fbb8b2f88195d615d5cea189bfb185e7512a67d41994602ba82b26d7c68e977e58901b244fe328a0ce3c6819aad34ecff9b79e9fa4674a4a65889d0300f192b83cbf0c56f11a5519717210f3156b3c02848131f95eab089305393272a1f241b68fe2388b9157bd764c8ed02d850c196cd346f4136e5a0f48bed71f571a9a6be42b7cbed7f12f3b3321ef341d36cdd967e7f154afc492b9a28b5d5c62c92e7f62b08786153dae17e89f168828d2439b497ad429335b90b7e4a511aa097b48c4e04223e4d13f46945bf1ec999baade5819031d8bb5668462431a78ca0d984a3e2fbf8845246e660d0abd257ce781e41e607970e2a494e268c74bfd54ca2b624418886947c475682ef6bec919d888f736fa00d801c96cd02ed5ca958d641c6c65973563723b59499446e529109517a10b9e5fd8314e65a2655042c561e99bb7d648747c71bec9a203c2e4c6b2cf23a7874952009cf1c5bb2f2e28ee533ad538c93b3802b44e893999a04907fee0f92d2434e129ba3ade199471583584475016e16ddabff99e8fb060fee9d4d170b23dec43ba6dbeec87b9320d345d452ac2819da708172474ae3a155c680827e5b0790f9216deb0879ba987815b2fa71382a2a4dbf7beaeb75dba7c47c2a21c3a38e0362473e9f329a633bfcd323a137658c4f15fe0f12ca7522b508d723ef5ce2269b5a8befc4259560e598be33823c0892dac76de57ce98643c704d972b2db600297c01a977ce19282add97f5e1bc17a7342feddefdda36d77a20d04d04b03bfcee96929d42b608e559f84ce62c5e9331089765ae20807fe4b3d62ab0bf51afab9597e6a06c249a1ce0e41e50221ab1d4536400259ec2b4829f6568640d84726892ce659ba4c49ebd0f49be29fc35b278a58e1ac38081266e7359968704a46cbeae109f0d650b4ab84f45492bdf5ca2bb2e65e5f9b43095e27d660e5be88eb440710cd57ef3eb8197b9772b86e7cb784a1a5a68ebb4a51cc2093893321895c01105f045e3764a69b4696d60dac6882025d361e0a5e5ea30889dc4e0af4e5772b35a8790678e2e0794fea5664a944d3fa1286ca410d10b52cfa2e8db93e4882312194a9c163974addf1d6ed2e48b0f1efffe84e8bc4030f3c4e5e4c585c12ac4399b6d07234f1c5606fe7490160f92ca8b855ffa30764cd6998673507dde658db6413813592bdc8099b5ec770c16ad7ef74f4b00cce4f86b0c4b099bd572dda07a33b295e75f9f02de820d193112952cd1f4c62598b35473cdc78baaec8cc711a32676ec3221e6af9201d604268772173c0c625b0ee0a25f5e2632102400e0245057eabd4324c2f3971a273ce1843db922c2c85901c1de2fa58ebf946e52070278df1b3e42f02d44fa5fafef9aaabab05478cae829cd9fb7f54634a7d0ec770a813ee4a1bc28ad5e62532de7c4b83be82de8ce4ba46b26a54e47ad09afe9f1a06aa7c1f10a4d1cff0a6418e4eb13678ecc70c709b89f90bb2c6e27cd2dcf64c8e12ef45c4b04984740d2e80870af83e5f4376d77f571a440256c58ba6aecabac39b952736f6c85282376625e363de9cea4a533c0eec5947339876408ac4d8f690e431f9b5e8a580b5753b89e18d0d6b4ee8e3495d7a9e96a7f1ef1e3a6e9dac08ed0bd6705d819ef06a5dae0fee289e803c81e5703f4ca08cc924c22e5594a3a8bcd75abe18987a37b27fd97e27884342411e70ce484a616de42130060c6009fb76eb36d7b6d0a59d02d806bd92bd7a67372418aa3a917805a9317b92f2ded97af972cfc6a589b5f93d7c6571dbff36a2de5beba357730880c0ad6c6832e3573f092cdd88a4f6e2a226783fcd62b7332c6c9d2b0e8211b5671d9f62b96b11a997abba67d927ebf623f75b1042196e11db611a54a52b880d4b481ee4ee518a8c800b3b44412521bf1e49f3282495ecd07a46a078d9ac8b4a21bb362db64431ab05c08db50c958117d25e8437c0155fd5d8d3a14f32ac0499cdf6c33702c6474c992f423f9a087ba651cf6f98314a96ae9425fa09478215e8c5e24afbc90cbe243028e3604c07891561a3fd6c27e75098e7e35ec4804ff7b063e91b97a2392f627a35c5693142975b25049dffdc7e80a27a231376992c688e95863c78c3d01adafe1c69195b67c025b7e3c9abd5dbdc117f183be1aa34f6568e1552c9301871155105f91042c6fc2f0aa5e38862b2ab5fad8cc732d383cfae3829a7adb0ab24975502e41987777d446e911f7041747ec0a453a1040f23314fb688010cdebf511e9903630421121f62615829a3ec29a69c5d66bcd8d86aa6a834d6c3808912c2743004e72a0610148bcc376647178693a6c14470e9b25654d81601a8fcaef384720bb4cbfc704f009e3eab7560823d4f9506b003fd413cc154c71d645326e95f0402d1676ad3a9c645b8476e1c4e4b5d85c239cc31de41022f6ae103d46a6ad46506f997d7f0ff48f56cbb6bfec8cfe16ce8be2a60a5ee37b3b6e35df95f9129aeec1865241c13f82416d7b39c3339ffab11c94d9a242c6039dd518e426b5d913a190d07018e82618e44a6131fd8d63ad05e0adb51475e0bac8e5cbe291e20282a9f6e94b331868f938153017144fdef0e4195148f1543fb52c4a660a9a963b35200fa6c65fd4e8ffebc53ed7da8c5288bc300d1fe53c7a4405e1821272c4917ddefbc3162e982d0ebe2fd682cf3ad29be479e82a604e88d76c8f4ffd74706ac7a4a32700b6ede0d20e0e7e22f66c1ed362dbdb61b9aa9193faa8038c0c47318447f2ec51ca11fdf48b2fc9390b4c66b7eb3d06cdf0ae6bdbb820e14e6b84fa66626be7e0af283aa213aab32deef1805d3b2371a1f821364739714a31a5a32d9603818d3d48cf69da03fc466dd950a2cf1497cd733039c1e57315d4d699fde4012b56fbda27f7f9ea7dd23b7149f12df1d42ea0eaf4f877463809e9db0a066308f73a72e953321c076522569ad40e1d2f1af8be49b3dfc144d0dac1c51ae1c5bd8dc44311134f4953a95b63c013bc80658e98e254e460dec36b00f33c08cde55a43558939fce7eef859b65b21ea37a89c0e269ec5fbf2e87dbfb5b6c6ded68dca787761ace2fb26070c457d4bf6c9aa8963adbeb8c7b243c812cf4a7404b8b8d72457f664059ff84038f5e4dade6dfd267d9b405581098643f06e5dfb510f30f04a6309bf0f1891219b4b0ede52204e837fbc60c3ffc2abdeb5b38606a480630e598d0765363a26c6558948c1b38e9b8906b4e3d2cc248a596be25c8fd2f018eb38b2b27dc0cca1f700a62b2456d65520c6dafbebca29e0d14476f1f5b18149abd96b6635ac8bfca5e432078dffe29654822e5ffa96319bfb63b614a499e38c3178cbe1bccc2a4b18c3711addae90e25aba8f78117af000d92c0626c6b90aabe201e84c3ab74e91d2ead099c18b298264011c66942ad1a4ae3b3be93cbde472042d359c176d50ccae3d50c0b5f0bec2382496cb92de3d7865c75447d80e95b216456b6c3cc0422310c50370927b007d61a2b9e9b6aeee2dd15a87ba89970f2418e27fd5b311c94cc01b686c729206ed3c8a505df915ebc75d48a296a03a811ba80e3147d6bb4e9267da5deccbf3aa5f51d03bc594863361e8f9ce657f74bc614ee6b407cdd9cb5b2bc7b17353c95a8d678e47ec357005ac8e0bc69a9940de226d2ad3292059459558caeaee0ca6367574b594725a39c3f865317076b874c7e409d66a174b65f501b31a6cc76579ba4546b329710c0bda932e98f69709eb447ea8fe81bab1b3e426fff088c09a2df7f520255bd865852a6cc295f316bbd5c06493381bf74896b4456870b82edb706fe6e2c0b1aae7135d4e9caef83be5521020709138905dcded85e626acae32a55192bca69394a002bede0167784687afcc4368a4ba4a2d92b2ba80aff1b90ccd494a521a1c33fdc183a1ed5b5abf4195e5b080dcd01800995caba400751a70aac271121ab3b8f46b8efc8336b933c26fbc790c5431954295c44f3c8ef5d123929667f94aeb81150c7f5eb8c9a1245e37d951de5c5c5a4616009dcbb33c2da3b97268447f5a383b870b42db94b59e0212d5852c22a96bbced81d01e28e97ae4876d279c8cb0daf4a72c4c41ba0cdfe7a9f18483a4d156ffbd72e7436b3e0bd51c4fbc0962ee9c967ebd1349b581d5193bbd7e577847404ff62cceb2c2c97f88a7fa9b899c988778ea6f669e8bdeff3b94babeea8c559f63d357bbe22f2f2013f2b110f1d5687f4c72ad6a0e9018238ca5e1df69ffc1274a220cce87b56636485a0f04cb1183ff0063670b95a1329ad781670a8b79438fb2cf97f33ff87165f6e1b231caaa758c2a71f4896236ea40d46bb605eaa86d6a428641191a4364fdde0cdd92b220885e1ec60632f4d65f3e24a37cee3440e68443b5825b4ed775fc5d55a84cb489ed4f19ecb6bd38d5cde25c9cca6b70de027cf9a9807d6d7c3d3a2ebd81fe86c8ad2760a545b379d65c36a2b76407883bb96adca93217ea40ab7f14da70eed36b46aa8c5b093205f9eb2b4d4ace365cae28eb1f24962773cd9e930360d0dd7aece338a452b52073a24a77b5bd2db94531951201a66c7d8c77b565671461b36d9b1ae96d0a3c8ba46d7a8da49089718d0d3d7c874b371e2e0eefc301ed7ca444486cce42e56e23b81584a0907bc8a46c76462fe4ad96fc3ccd6a4b39304138894638e01e78c81800843b053aadb22ddd3c19570b409201a822fd2c100a8d350d41f51491a3b194d0c316f1b848d03a5c5e8198731092f1c82f186846506b4c39904083647ab5ccd6ea94b99ddc0b11ee987d9db126d16ee371146554ceefae8466a882b1f1de7fdda19c126e668ef2ad1336435b48197614dfc14eff163436b37c49af453befbeb44e9a7fd9468dd5aaf11536111d1b46e1926aae942884e1b35faa425d942ec92869b8222da44f91b3bb73381a49b4da501f7dec344e8d1eb597bffe1e72f8dde246a93783a41ede408ef08ab951bf13f05a52a990492f1efe883d19c89ef08aeafbd6d335fed1f5fc7edcc6a3a1fc2796f726ae40da0039d62898056cef920b93c74efc95d38863626da853a4cea66b08df7f8ed8b66e6b77053781ee03e256a5c29391e33343b8cfa7cc07b41dc3b8df5ceb7c82efb68e75b9c67c8f96d5093b0702f353b08559bd51be695ec67a071c77c6cf9235de9c39e5405a7edb97916b66860d9e0f9fbbb2ab2fc411f1b05bc2adf7593630eba25b5a2af414f164723902f501d2bea332c537f91680c6caeb795751d2f2d28163f45985b831133bcc7a6f2f92227d8853242e3985780977c527e70ef4df4030d5d268705e97d47a6eb0828990df05c829916939c0bd6ca354593396801ca419f4a83e53123d7c547143910b7fc80294a407345c58178bc0e91425dd0d44442712b7923e19b5f8b0aad4385b39e8175bcec0855b6ab26b99f46adf21007ae6ad8792385ff1c0b4cd72c2d04e243a40e61a2d38bc4ce3f924d42ed7c4cd108adbd8e3b8fb881a9de57ca7040e756c24d91a658c9503da92e93f63827810dad8121ab8ce0af46a9022d4ed4f14bb849e0ee85d260f444ab580777e3d7f444a5279f021bf4888dbdb160dea3541cbb721a18dc2466933dc614ed41a96c72fdca3ad1d143b3892bc034713c938b1e3061f9d75f7b646a32fe8eadc150000012bc6bf7897f25bc2c89c13ca12880214854807b7b0d12a8938ec5ab5d675c57a2ade33ea25c49646a48fa82ba6500c93d21b11675a1176d83a5574060fe89ecd4625340945d1187f3b09fc0ae827fcaa79bee429cc647858675cce4324cecb731a144a8ec411ee604cc8838620a94f2f9008bece558658b542064e0cdd5fd723f0ba45395fedcab11e6db556172de3c4e30242b4f8e0f7ffecdfcaf09fda1d6ec309a83680ef985c4a5800a1d2fc3f64ef662da80aa5127343c9512309e23d77add5018c4ae34bcce408d36d84b2e53e511f037abc46d2c0cafe651514cd097776912d6528e81a0dd982c004fdabec5bf00f1b2506309e46bf086e06275eaf77edbafe9569a1c38d7d78ab841a1eca1adae80d7f2f4f13e2d75af367a0b42fc389c3f3039654441e581942a10768a2a734fcbd21a3fdc7c3df0e6cc8dd9892329d3f474138576485dae14cad49f4b85b16e1cfaf95e13488a69673b1f822bb8d5d6132b184a6e105381d635c347661455f8dcb631869e7f65a06f1bd52327bd40942e15309f68d84befa937bf564278fc37572d32b326de17cdead88392d2764aeb44fdb3ace15129b23c0a74a7708dcf644cf55e6bd505f863b034008b8952a89b19be79e875b76e8b9f838fb9ba81e7a48904d321433bc7b1e689b9e0fa6f688d01808bb3f2d10dc450515e4ef4586c0813f5589ca22acebb42509953f05e6123c512446a59ac5a619065e277862a86d89f2fadf4bca34608271e1d45b16406207f9bd67556b4a682af0710df9bdfa98e7f872be15490a956ca465a142570073ee82c20def557b4c7b3e4838d2e41f36e30c382600e83f0c534da690dc4976150f620e8b615527c47b7776cd41183eb6c8310f55944cdf6ece7eaee5004dae560d948ef452b0608c93233b47e76b946716ca8896612d957e077a68d5d789e6ef9dc07cd5aaedb1696a6a7cfac6060f0d3ba1cd6db17772e5b5c25618c4c9639f668d50aa60f674d720b45b6b9e20eeb84d349c1c5f261e47d5c268f884f86d474d6f35a9a3b0f6207c368dc6252fbb65b3642bfae10789da99e4e853b2f65ff373ba0ed0ab872e5c5dc5486f41c4cdf85aba02ed744ff238ae360b57d09fdf02f4d4ee47866372644127f6e9c7c276764fd238ac164b57d4971f0a5a3b5f8d5a75496ce5d136d0561fb3441f08ba63c459756626a319c2ac769eb0e8e7d39eda085053d0436166c4cf278689704bf0218f244c03cc2443c563c6bed6638a890fc28b5787de0bd3ac2e437c367e2e70a82382cf7c67c5db7072f917183a5b8e38b6e71c29817fb30447022890973aa2a15f26d2570c0d424bf4cdbf3c4c1ce880a4dfe6ffd536de8499d4a0a8fc13676d321028099914ca51c2d03b05b712337aa885258361c01bd868b58c9394a8b9b7c0358ecc8bcea2c73870f38cd4a9ff37f04eb25a9d1505b7fc85fec78c3aef616521501804bf77813960f4db413ce2e391c4cb17632870017450ef6ad5b46e0d0213b1f3992d73a8a52e6d244334f434a38d6ea5b828a761c31b04591c5eb6f5b44dbc27a6e23fbb594d24ba515f1e3d68cabf72231e8c95a1f2458c5eb1d70f518576a3bab31538833b11288cb51e00d244cb4da4da151f684552759c36398da9fecd5933caad53e46fd0b2a33b406dbbbb39228a9d48ffb03852c2f964a69f65b816bf2cc29e2e04e7b26dae414f447849c21c2a5b5a18ef24e3958f4013e3b049af077ddd807e3a6a6599370258608b507b9467904c9665e291caf202cb491c68df26f44754a0d91d72350b6e3d7df039b7106f83bc82f026a022c8856700e0a3dd409171a47d472be6f85d521d0d27815b3d42201352dd23c60dea15b095dfd01392883ee388d6c6ad6f22e7d413d344131d41da6f599945be9103119d3342538c2da5480f53e00f2c46edaff94fac624b97b864d7c61280a0f6d5f3759cb763d28d2d9a4b64fc4fca0fc6d50097d308cfcfeaa4a5c9d8bc3ffb40686425f029174f0c5d3a433e5574a14393f6f1939d605352f4a93909821d67c69a78b129b1e6fbcdbfa355b65524a3971b51e08f4cf0dd259bd8a889401cefdc0aa7dee89a74cab788df677f36b50eb1f9d514998e42b5c2a652561f2bc023ecc0aae7be052d2a4ea550ebdbcf307691123ab9ac64399049a8de5c3d21839dccd6bc0a792e11b71174370236493f0df41bab0acc13991286e3c69c6284792c799d9b3258bf7189204c6b702fad6ce96d7543648f3870a3897cd586c52e4761731e2bdb8683019db49c0ec7af625414be599cf34425663a068b7fa7e227168c051a995502d3de8c70e4a3f944e01c369070e7e3e5d6b936d3c4dbfbfd411ec1e72b178c30b9e6c1829cf6c7a03ff316c4e12481e2d3d55a65d1c7b4ef5fd5da45c9840eab368db9a1d62c10e2d13f1cb9ee006a77889d925e80ca411953b0b2eb5da479fe9ea031af428ad7980fdc641e88a31b111d7f8788f76cf8045b623bf69bbf68da0ee4240bd771d9b8cc958e12bb5d37805b86d005a88661b500ac61402d00eb485ceb0901343a032a5bca765b30dc11a703190b57b53a0ce6fa53e5e5bee68c02ab3e7b2512719a52cfe280be93b59273545a72986599c080d4eb39c380705f9c739e77f8dea5117ec10c42bcba8a5375bd33fed81ba80295d603fa51486fb2f7965b4a29534a0197076e0729071703ecc30f7c0136c9af95b7c0b14b35f30149fd22c64823ad957e371741f4c7c67eaf426c582b9d5936461528179be816658388784431d18fa511c14471f46c6ff4fa76cf80417f2817dc794684fee4419e11a2b73e4aba1f07bd5b72bd833938411de8e70481402050cff5d929b9dec11c24b212a9ac576160bb1b91ca419137ea88d878ea6ca20b2aca1f09c1fe0d5d502e2897171da14f211feeb7afc2280af609edc384eb9f298927d0a75056f4134f22102c95ba20d813256a30b9fe3598b82974c1d9c2951f8eee0f045d685c6a4458b0ef829a33d0920bca4d21c8a7566b47a37f102c9544a9984f012e2789dd5c918b65e8f51719e166c1c8002e2789c52e8f8b7a54229428d8b063857c321f2de473fd41a21d4f9484543c8994d030fea231ae4fe1fa17d7455ab8f70e91cbc1276c18f209f98494380242d18ec8e5a0d3dcb0636551b022253847cce6bb9c040b4c4429142536ec5856e08cf1ea58abdbb1e249e472b1b0a0040b53c4e326d0bc9c13861697037922210e039a9f28656b903136e86089a2b02c33bafea2d70db27043114c8789859acb49c668b95c4e3286cf15b9e249948a302e7265de312452827380ae08250c2b72f9a3806143518a95640c55922bf4e45441c905c0e51c2aa42ee72091103ff14c153c3757e46272fd453b2e82b989ab68821151cff56f2109c28f06a23b5487b6a88b22b9feb426487777a31cf47a3baf67e20cc8880d413cae9debdd55ca087239c8afeba09c9b72d0855c0dd43da163c51388491021ddab3661bbf93c4c1f2e96074020b3c2be6af0841b8a6013a03d2c09c9c0b698f0badd4d3c8178bce7e6fa7736f1d4d9dc1c075de77a0ba4aa367685ba01e1a4ae3f4be4ba410b442e207c70d0d9c7b6c08622973f8d895c2257f7cf6d171b185c3029a594523e318d1e4f2486f1af60e7841d5161259d5956595180711557a41bd28bd4433a42725d7f9211528bc443c221e55cff2857562b2b5f59adac5c6e375c59cd8e42c618a38c1a16563eb7b262195fa51871d033c0da58516cac94554a13cbd2df97e5067afb5b317251eaca8a653a1b3fb0c1b291f38971fdbf1fef07d7df63d5f8410d1db0a9b26a20b94e038ceb4fc38765fa493ab8fe241c92147c9a29d28a89eb13057c4a594598c9829516d894550d29d8241ae235562cc3895e50c3c8154141e3c532dab7ac5866fb1327ae93562c33df3717682c96e9dfa4703d6595628465a610ce31059b660a18f44f59cdd44cb914a455465a8986b829c5c6c117b029058a94151429b12adc9595135efd141bf9fe2950c8552c5ce99a58ed862babeb95c61256b7458a9458cb6a65455a51eda3f1ca7ea65866ceaf5e44710e29515c709db990c296e21c42b61fcce0a62e758d2595d890b4bafe35706a2071d37cd28ab422adb24c3504dc5ac68a8b514697f2c54728bf516b2ca3ddcd5c2a954aa5582a81e068646d977c4aa20f47a5d2c997e14418cf5811c6a7beb8e05306639817cb7c2cd33783c2f5cfbae053e6ca5c61f88fcb4d61d6bafe61a6e3e3a630c3b96e0ab3d5f5f7277e6ee44ccaf5276e587b52ae1337ac4b629cb4e947e3679e100900a3f70ececaa3e3a0534a698b725dc332eef429bd71507429cd329a514a29a59f640648ee002e27a1a2757b037547a58ecf061d7abc28102db73f7339f8ca5cd777b2d72a7ea1ad2baede7c2c0e10fdc99f7c1d6089cf3306e0c2cf8ce879c68e5ef4e4e92bc2f8d39583f52605967e5857b71aa9373be8673a3e9cc38f60c35a5b3a2e4780cdbafaeaba162283e74f91cd554510255056154196b88983b003d5f5efeadc71e2b1cd5adc4b2fece112316fd7237eaa33fe15c9ca4db42b0b74f29c57e4e4b9a65346592b11079d7e585f4b622aa6a182c010e4fa579f28e9ca4d6125723dac2d236eaa47dce4426aab48ddb1617dd55a635f8797dcc43e88b8897ef2c18e013e633fae89a7af267e15e6a0eb8835d72b0f1636cc60d7bb27fb71535337c5506e7aedb8c9e5266f205aeecb154b10b9add37213cf1013d2c26637ec1a1f505ad8ec9565f55579a830e4fa57989b46d75fabd184f8e905567bc44865b0baa4c660543872430d75438523dc500be273fdb3b0ae6ecfaab403cb0ed2fa8a27caaaad97ebf5aa3118caa7e6facff5cf70e249f4fe192b5bc593e80bd9312c75d4ed584d3c098061fceb0f6aaea829d557e7d32971d3cc62f665446c585fd507477d5d7fb087eef8691e711887e9968e9b5ca6f9b3a7878767674747c77372261224376c1b9bfaaaaf5a6f1cec5f1919a1401e031659206149165974c1c510701046165984114626856c959436ad1d22ac21383aab66958a59c7037a60198fa592118d8412a640cd1ca1b1e03543db0966b972a4034b03296e019c7976cc212facdf9061bdf2664117d79b6019fcbd55397687d9363fe249f34f5569c44d51a552cdc92de12e7671bb5ea8203c1ddbf9a18129b9fe5c5dae964da90482239fb131220efa4ae56096c92fbb19fdfaedd5aeddcd953b7be6715d90ec766833ebdaddb53bab2f29a5557ee609116b880b2af241bc0ddb5ac9679bb061bb6e6ebcda051bbf6fa0df2e07bdba833b9ee32d6739f81feb4d91edb9d809d13565dbd552d832222b371971537c97abdb611ad4e2ae1512742be0eecc0afe5e90e0c6d85d7b576ba5747e911569c26ecffd48d3a66ae5a0919b2399103e32cad404f26eb19092a6ac40e5112bc448a594727e943be04020909be229fb92d7284deea7d20ee6e1010e96ec0d2cc8e0c4c183fc521c8dc007dcd83f224cc60000b76958226597b021019d526c91c4064f743183264accd0d51232a03f588206597c1f616a40109df0c50a6e1cfd4b0d2637c5e7865faa71d5e544dd3f343bcb961f597090a879e5e50e8746a12e0be42621587fce6e61fd434ec2fa2381c65533aeba1e9b9834a3d964c9214626199d4be6fca61858b4c32c73cc5541a4a185b40cfeb1e3113b06f88cf69cf68a33f3597290dfdfdf0ff23aacd5f5eb56abaaca8eda7a4cd3d0392ec4f319ae827c88a738c3ce6ab95e7746ef5c7739a8d3ca691afa0aee2154213d54647bee1cd033db67c41133dae737f10a2d0500b919185d22b8c98d1f0502a25908c11fd22f22de22b58d0032937df5369085f3f32dcbb24702c84cf621a1fdf67d42f0fbf471a3967d49648f44ad59f61589ac3e12ccfdf5b31186f91e2181cc1790cbe8201d80ccef5bf26f1362a38c35e8cc8f273953e486af84286e18c3841b324b83c10dd9e5451737e4d79ce10516377eca287e299e803ca14410929005124ca184d44cfc1ef1548117094c5084248a58c1c44cccc0cb49bc2872512e27f122053ce06e6e4a29a52198cd8360f7d05ea32cf3f372afbd3f6704ea87831c43fd883025b08dfa118da841ac3581a5f34796d950e7aae0146d4a9972ffa8d5fd6390717e1dc5130396f0b018eae76387f6db871cdbc08f6e41838039c0a6387fae4870354fc65903cb9c837ecf0086f1f711c411a03dbd309cc38608ad3860c518b3988d4623e67a90849060bdb9d8597767dd31fb58b9bb6528c6af66a010889981a6ea6604f25a332cc028860ded88657c87edc6166474341ad51abb1e4c9eb36fd49792d64e734c0cf32cd58059e11c0cfa976274d810b3e26e4ec13233f7f4c0572ac912186cba925cc103b33b1cfc763b643eb76374dc242915c12a12aab5a3d13f08964a42aa1dbd7d50f4335b73f6f0f18386071dd867728f4adb677ab0cc0b778e92e0f6c08bd1a41b728b5bdec7b7e1bfcf97ad1ea21f284437b3565114f68461ae7b61ed1aed8d5f77d73ea4d62aa25518d2df846429fba5d603d0b066f82d4b3f5fbfcfd29fcff40cff540da9b5dac898165a7c5a68a1058f1625e879d9c20848d8620b1e7c91451649086389192c66e6549c0dd7e2763822dc100e87d3e156dc91ebcfb44529a5b4a77866e69ae0d364a99ea3c1754e8aeb9c1377f3d97c6c16d7371fee33627b2033da17dafa85f5b71f6ee618da7c1cf499101876fbed9b2c9fadc55b2b6e2dd636597ddade00575c7f518b65e8778a53cd1c8719754dec3627eb091b72aac9a93895ec50568aa1712acba92ea7e2545936831552c1139ef0841ee0c00ad11150df5f8bed5ddddddddddddcd6ddab55f76fdcf7f700084c20b485dd425bd8d00d7b35819605f58ab342ab5557c70a384b64d9b66ddbe6f5cd7860fd7b05ead58a655e9a066cda9a154fdd87be7bd406daba1dd973bf7d7bdbc6711bb77942446edbb6eae0f6dc757f680b2bba61afb62af08038fc4b55d0f1462264f3012446cf9d3ef800e12627725d0c9eeba06e0709c65a432250680bcbddb0b34a433f9c6041df3dd7a5dcb47d3a38e80d60e9ef3e1f11c61b30453f4798ee3d161f3dd301d18778107d2cc4f6f5b90f7d35c28440946ef6dc4ce609513f0472c3fe84f861730129d2fd04dc549ffbd083be05b04c117607a6a1df5f0796d93ef4fde83e1f9dd01656bb61afb855afdac88d9b46af5301504796a4c0cee956bb9a676b9e62fa70d31044d4db2f4437b91bf7dcc70ef68f5511f56e1f4b731e4b7f2dc595b1e21c26b061a756ecf2c1839bb2e7981bb4148661fc3987ff8ae250246ed27ad520d09711b18d03fab05717f4855dad40209b9410d5901c075b3a2e075d9c8f4ec0d2ef8d0aab815fb2392686b963bbc4930118c6ff07ad1b5871436ec98e5e0d9ce3000ce3af738350854f7fb5c6b48ccf39a0b0f1fbc398989839fbc5edc3d6cc3c79e278f911e872944ac984ab5d2b57eeee089ab4d2ba39ad5ba51288005fce4277d997801f6f6aab6ae6484423a094d266e65a9dc1582ac556c7c4989898181da1efbefb8c38000d6b26f44066421b13a30ad1b801b8221c19b6aa6d3c9794524ae7f5d1aa19d82132edebe4531011c65f030c7a1ad8de3f88789a0ce3df6363a5347b970ed626d821e4f5ef1ee2a0eb52d81a140de86b220ee3350b3847132c838a7354256cb53ab00f88f1a1a273c8e69d169ae05a31f6e05139c8f7eb5a2ba54d388e638efb39778ee3388e7b8eb5b90486712ee60ddde5bef9eafb381f00be0731b049b624cb8e21fa7de70e9268f54d1937713819379c38ad71dbff8340de4c4d2153c53986d838888473b072600eb6f6c3444cb682b9b2d9e804a2149d1cf31b1566846a36ff60b62927283254be94910c10fcb736bbfc732915d913149452e90404ed176331fe30e285d5dbd08461a47d3614d79ff6efd811e7f8800d4121c74e34d5cdac183ffdb839d19b08e3fdb4890df96098f925fe31df6704bbd3b9c5ac1a93b1fca68c855dc3de9d080536e41a198bfda0acce455dc0a0d6ca959f65b8a585c420773cdcd9b57da11c580efe1b15b66fc86e186fe211d7de27111528129944a611ed9b11e7c369138f38e8d626c6f9f4c378b30aa714577b99ad588673d05eca901d94d912b8ad06dc7663fd39f7e852327fdc31c6edc67677b711bd018e5fc2108c356f7c99e32e9dd70e4cf2dca8f95c8f1f8b6bd56aede871f868546bfc19e7ffdd428f0a5817871b57be1cd49868b119a02746232dc6c3baadc586b0b69e1a232e6e890a09cb38cd4aa7fb09096119df7460c311d70f554b83c3afc55a11c6bfd56ab55a7de54b867078e412a944f6f0f8978dd2c68f654e07f9b26e38aaade9b0cc12ad3503f4021b6aad988cc91ee9e3a6506b5d3785201e9d0b6b8d6ae88166a5d33f42709c0745a41595a458e608cb7869869f5aad1d8d5c63e2a0bbb490001b4a004c83960596c19fdfb558cbca979b785886c64d7ce52b9eb45fd9585595af987cc99716932fd9e23e838f3efbc2e36facffa41ed8f9451047a2c2b214216ff642886ef6d10fb5d8f5cfbe22fab2e4d0777edff9fd107fca2fc684889b18247fdce4517af30c85602b3720b0b90c84cb391fe0b9dc7663fb55e58f9b96f8a94a2692090d4d9020b7854c21f7e7cec0ded41bbf6ae32015761be2a6a60faaae5584d1b961bfbcbf4824acaebae3a7ed26c2b84982e2cd76134f31debce2291e4172fde5176f6a18b63f6635f145cff671fbb841c1f667d996bd6759c671918bed5e4310c7f6d9735bf6dcb6719fc5df9ee3366edb70e8104936b0344302852eb877ee9d7b7fee0b5babb5dedac925ddd8f9f4c178aa957ee1e8725b37d7931707b58d7e8965fae9b3002efdd9ed3041b4c3c19ffb401cd8e1e0debccd7145f4e53e1cd2fd4936d8e24533c510cddefc32d4a55fd857b2e460af7c7b04ea1251a5c737eca13441dbcafeec76943847f65d1336cdf528959329a5a1f0882b6538c36d196ed7e4f0b901a3a172db4777fb5956d01702e1694ed8fec99190581e0d844aaf6b3a96fe6e6820b7dbab7193f4e1ea6f6f8e3ec4bc1e3fe61297b8e4d525378bb9d94b2f2c952aa8697cc4185def923a393b244b3653a734f4241ad86ce51271c4ed4ffe38987d5f1dce91a8b0fd38dc84c341f90efebba22b7a6169730e3a7378b9f3eb9e48c244e76eff57e37edb364dfbf0448b8930da77c7c48e73d0d6cfc5c4b08c5fed21e08301f85435ed354dd342eeb99af6ed951cd44007b5b086e0d53ec65fd3be46ed396a1a173b1e7fb7adbfb7edeb0f11acd0c11633b440b1cccae5f8912347fe81fdf4ed176e444d0f5ca6fc09d14d424983c8c5ed8f30ced1345aee8c7e9619373ee9c6d740ee8dee8c8ef3b95a433c51da104e4e9a55ad6a363fce8a2998bc91936635ab363fce8aa90893936634b3f971564c4d3aa9cd8fb3e4946df323a3bb8dbbb3cb03b6dddd99b942619bacc0b0695185666b8f72d2ac6a1b07ea42227b8222234565e5851169064b0b0a668392372c3348a3175668d470a1115336d3055b51499181325dd7ffc4e55b9c651353275614eade6349d19f0ec46dde3723f5b3d5cf06a99f7f46ff5753365e40b01b6a37b01b56ae767382d26e644bcbf28d15186a6c289524387e899379d28f1c63d4989f3a617677f7373f7bae524a50944110f1c38846f96923c2613c08e9447c4118696b848341fc20c2060d9b52e86134b2967d0797fbc324627a08e67c9fee737e3f383361fba3d349635f4166313a3333c8ccfca204cb1fd282e5ff19ff59267ba60ad48dcfc9e77eb96a1ae447552d430c58a63fba02ced115e56aa16c0caa54ab457df5e20dca531126fe7fea7aaf6ebcc2869e6ac59b78aa2f57371187cad58def1d037ca66aa9b9d252551561e26ba9f85a6a0879c3dabadacb5255d3a029c132ac80653414708ef85a8a7330c1c6afaaf885eca3baf1e3fb122ce01308056c9a1fdf9960934c81427bd9e7a6a12f4f4f32106ef872639c41693be0b2e797d0bb2eace8b92e0ad663e1a7575e1e5e9e6b502765d7850d4b5e77b78343f9139f9ddbb1cb49beb0b9dcecbab0a3efa2c05282a5c4eb721928f3fcce8e43273d78c0974bfa170f868f63d8f0afbcf1b2bf77dac527f05f3eac57e5994f31a8a8905e3cd27bc7c3cbc3f0f275e5253f4b7d50bd2facbcf02bcf3528b4f785e77e017c18bec6733cc5f0345a1efc183c183c66987f8e6b90e7b5ee7bff792190fb7dd6edf838ee6ee8cb71cf832ff7b5ca0bbffee6715ed801d6e5b7f1dc01b9d523625e1b1f6d19bc672ff4d6f55e47fc3c1d0e7a9f0defd577791da47cf771d0050b1e7838c2868d85a31cf532e51b0b96e12b9fe5bfc717887579fe7470f03dbe2e2eefe2f970b055f1241986f4a04bfa1a5f58532e89f42d9f0cd96bbdbeec20295eeeba21d8b05ddaab3c6b39f00ffcf539f6bce3d14d2eb77d2c3df86ecf83eff6b55461ff6a1fb92fe42fa2eff6321ec88ddf3497f41ae93b791df1c5e3991b1ebfe0857e57bcd055bc146f0829a3692e3b78e260089ae12398e2271d35ca94cb5fc83f42b0edeaaeb061e35cd9aa28e50ff9b57ef2b91a587e1db13edbd048fcc5e399ea79ffaecceb4bdbf52f107603d9871dbbf45132583c31674fe313e427a36f3b1d805cfb2899cd44f124c61e50beb06fb01f0e07b3ffe1ebb20f81687d4a43317e30a761ee3e7afd41c041fa7d45ef5da5a1c681350e0f123785fcc3ca490981c5531023213a62ca107d3be5261e314c7c0aa236f6401f022ebfe9bc86158de21a646d1d6ddaf76019bfdc03f1c34df1b9c7813302b884cb3df389e3985cae724bb8a0e4b292cb49b880ba5c77f5fb657b61894a6fcab4d64ffe70a07a92e2207d4ec244c90d632ef7f363dc14da1a38933ff73d38e6513c4950e54431ee9d7b3bfacad9f3f73d3a7bee53dcf4c2d11dd468159ac5d3ab8c5e5216109b543e74940fe9e5d06594cb2b33b8d8b17882e19fc6733cdd78d2734c79186e781a871435bb1d241594969f2e3f293f7fc6288ad2701ecbb28e3513076716737066a4277dc79a899b687ccb13ebe0bfbc783453c80fc1cfbc3c47c353798e515ad8e531a60666710ebbe20c25cd888ffcc06d6b9f1c54cdcd5ee5391068ce96ecc9aa8e74c91df9923c12267b6a2b87d57532cb5454a4fcc0ec7b699ff6c93ed92476551ee56916bb1d19334a8b8b8c14f9328548afc88d7ff16a7ee6868eee4c9a547efef4824d28dff2e104c3e5c329853b4d291fce2bdc49a26122fd7c1b545050b7bfc5a526c54bddfe1b9e90ecb3a4a7e1c52ee95b725bfe843c04e2a54545652e40e551be22fab67c381c0455be170727084492819d1b102c2769e273394913d8e53a504bd93b644739994ad91ff6759119b7949f757056503db1f19c83524d6b4384b58f0f3791a2cb4d2e2e1e5f1b5e8a83ff32f8dadcf934beb092be58caf7127561cd60f6289e64b0bfc5ab0cf6bb782006fb657896c1fe142f85c1fe176fc430fd5c37d31862ce91fd9d272007ffe33bcf13eba090222f8f9a2e51d68e46ff20d8ddcf51af6e42394d5884992f5b5e3ea8bb1d35fe3f96e99f6f834d2e3f57acccca33afbc8b0cf233ef86f7e2c916afa565a70acd6ef88ec51c376557b67861cbd36f1bff3cd7fbbf5c68c23a36ba615d2ef91d932e99aa91f23b4a103038a508244abec0539209af91277094fc80d3d4e4824f121561e6d7809112e34e55162eadb9930691a86c3472d0fec00e3e0da988fd2facb70b415064b85c94ba28a594ba6cb88e406dd878fa2fc3fb859f4a96502fdaf022cbc1e949eafdf03f445f172e30b9f233e9dd80e1c379f9252a9e60f822ec1bddf8502f1f8ca76560f0fb088ba78c613e6619be9fb1effb220f8fbf5eec2d3038bf09f3340d1d6b19e64f266227b873fadca905ce313f8c5adc2989b8e9467a805149d42871a7a79ab8473eef4369c4fbef698a8a444994a49135b1a5b40e4ecfbe7fc8beffd8411befb2432a6233216efa9f9fa9e2e9e5479fb95cdec617d6f92f5e44e230f33f2fb61c9cef795107457637d02715b1a1e5f1c3c8c1f944f44df981f638088ba7f69121effcd9333dca664affbd88e3e0247dc82c0fe2359ed338385de66b5fcc71704a548471949497f111a6f2f3994e1acf92cd7f1a1cf7e1844d189d347e3e0d7232c3ce98f1cc336a7892c693350e4edac1e2e9eb84d1f824cac1f9e18485120546bfcf7b7f6cd8ece9b07e4b8bc797c5e33bc31ba2495e389a3ff242d00b5e385af186c8ee1032c50b536e3861370545a2eeb45f5bd9d914f664bd3263b9388f2347ba9febd515657555573cf18ccb555dae39e4ca8eac8833e4469c78ea72aa0ba7ba62abbaa2eb0a914aaaab63551715366c588dbd03ebf153c3e284c176dc945ddfe1895f75b9ba411d23df4cc6f81cbbe55f19bb9fda85cca93a3b353033ca86ccbadf63c6c713d7ec1bc91d2d5558d9378b4fa9bc33b27e742468858d2f4b978709620ec3d74f80aa1eb091b3ef306657826cd61c4355d2b734bec724ba4702d481ea779fc4f648689ba67df749708fc4c66ddb779f44e891e042dd73a00e34c57c695d7e7086cb49b600bb610d9cb7797d625f7adc9f9473ce29a79492a9d72b38e79717909bb4831d17dbf902f1ee23703ec4d3fc7e57f1cf0de517a5f6b2471c8c3837de708e185511a65b80bcf2930ebaea86b2c5803833bf7913615260ddc64d44dcb472138559a16a24295b7637fc8ddd4f27e97eb5ddf165741bf43bb716985c7f8903cc75e5ffe5442d290138e1681922670c720c83e35d45068e97a41e58f9fdfe5d72a941a385650669f4c28a4a8a0c94132b0a75206ed332156474faa0da70043759071fac38c2128841a79a81b8b099672cc38e85f6b200c7ecd231b2923592a607c642128744556cc98eebc68807f11a9f9e1c56dbf41026b19077ee0ca5fe6efee6ef16c5980d4b3cfa3adfe026684a1965e49a72f46cf29ff8702c6de41026b1d7ce919b988a4194f8b47288b88da398f0bc708eb4904efd00c13a3db6176edb8195cd1d43fd99141cc72f0e52806b90e3b8eca16651941d0f6666e61a98bb9999a315dc88b95300902b9f3b098e5f628cd96539f252b86bc92507834814571cf1aca98d83f3a65faf3af9c125504afc5cede512a9ab916e9fdcd62e4b7c79e76d9b08139d87a8444d56563d0b991a110000202000b314000030140a874302a150302215d5cd0714800c848c4a74541ec9d320885114648c31c818431000c41000818119c11407043406eded9961672cdbc2f55f085e63545d2677c4b4e5a3e9a743afef616495b0219b15ab2d20c50063a02b6b4d831545b1a2a6fc6a6e3dbb26d570b39b8d022faed469e2c2f949a9dad15042f8dd539423b18a12f23833acf499fc3fac2878e82a5088823e37c95bcac7c5b012887a512660a03cef89558e98f16a03cf1f8d37302f174133088b509f30bef2e038610b28efcb369affb1716e4974ccb50ea980a8e740567dcde06691be5757ffa41f27af3117684896fcdee53295a2222e7fe593cd3dc06442f45ebe1ea1728c37b7a10716c65e0501984e4ab0769aa4b81840be9b07ab4aa8bafd426bde0e743c1121254e2992f4f510c2a856a04002dc936955081dec5dca0f5f50383ce438edb031749f3314662df49bd8250481334aebda532401861044b66149fb3c3357d802357e14bb057f1168cb8c748fd41331f46e4bf182034fee7b78c6fdecae67bcac568385551da1cfdbfa8f439b3c0c50b4e0ab9737144ccbf6a8d124ab50305f3a008dd99d36f06b75c9d93e96dc44306058a5a15411069095ea599836fa31f26625885ce3ae62add7e85a3987504c3269c60ec2915373a84003af09ba4e7082b097ed7677669fc43354af58408a18096ca91f35adfe8b77e0001004d20d9a4753a58a6409b0c5b8a62334a551347081c74ce7e8fec120157ee755046e2bbe916ab91df40bdf47a7c2b4726b82d8283d8dc238301ac2d2b2e507aae19cc283134484aba03415a0441ff010ec56fe89e07e955e26abdec507acd1d31e88c80d90d686ad62caff3f0bd49d5e5d19c18076bee4d98e7ee29201ffbdacf5c6e99d938267961d5c56739c064ce5babc8c10663f5502b2691cb9586001aab51d913df7cf0dc74646a7edf5d412deda11e65c05d6d806185ef54fc32ae358adeeccc6fff642f5056e1774c58e0251ba52a8c8d1c874daeda0135534d199817fa6422252884cc489e863b25e38c9a8d343abf613d462deaffdaad07ca4a2aea204c5009ef94fb6324a916bcf469d1318c88788b653088a9c030c581ea2397ca2fb67ef2cc6d2ece8fcea8a5a700332a14ef4311232b8c0f19c1ac111f157fb9f7b053880f52cbbdb7426929a8fbebd3f80a4550559db31343d6b1b89ccb95868aeea10df8360f02b69492c608a866ef491940c9d8bb5a1205893758d26059a2b54f46e43ec62277cf72d0e5ac143588424c76413d63ef2e2b37bd60052f1346b083ac067fe294d8877c42e4e589780febfa4385268d2d3ae0d6e5d53ef1ed009815a3f0687a282135c0216d9a0435840118683e38b9d46b058f6bdde4c746e4c433b9a1c4a78dc952648f24939773c8bb8afa0ba2e9346d987d2738fc8e6a5c5663e1a004916e338c52a27b0e075ede1d6c3d4361b6643b6c2326180a2810f845681381e08dd7f67d99ab92b8b2100739f3afd40c13185350fe2fcd73e2521b152ab805a98076e3ec99d096d86dfe698dbf306612af032778b98a48137c1ac85b87326033d6d659ed3f5a046515dbb40c92e8565989c88402a77e10c8005a5f9d47560dfb821b34620175089fbb9ba1f09db1161cd0b935571160badb421a67728050a1448b5c563aac4b95f9ad29622989724cc27f71388a07bc2c3ee717232298810fb88ab36dcca94d580b62ddbe2464af22938933c4ba49ffb7867fd4b82358a32b4237b47002389f72d50561e0edcb2aafae1e9bd0e835aa9fcdb513eef959b42f84646d882122ec944d1f75e2aadf38b32dfbe453ca48023902d901eec5f39ed6f5fea7d9578855597b68bd109f2112b011aac5a32556e9938eee1b4a9dc7e47b0fbafcad0fe077a9da08a0ef56f3c73aa5f0cb2bd8efafdfdd49846ebd9620e9cd02ab1248d033e8e7eb95632c45384f584633bfd56ff83be35aba0b2e5d40391881e4a64b5c67e98a07bd6a25f92e69c52584aa72c11f86b3fd698232c5269256f91c4c99990893bca5bbd6a698238027a8319e68817cca9b2bfdc974143118800206fc91055c4033f08398b4a8e0793d6476d8bc163ade125cd74ec40f4d4e1856eb47e1054373883e3055aeb714ef0226a904620fd2832148b01f33fe047065c42e96ff14214ee85036acba0aa2f1490d2f94e3da8d20b0b505236d7042dd64dbb3890c6ca832af6395d54aec14331cfa84ba5168151bdf40b42c94a38282b41ed2786868211e8ccd244be4fc65ac440ab8aaf2c983ad2f511fd23e0814f1a46d2c9021d5e450fa982547bf84f2e3417c46766ae816e8eb6f100a2e761670a50e976d8b81df84f6adf87bc817e8cfcbcb58cf514cec07b27f98dace801bb694c6ac53b3503a0150c21ada1091ee98b7f10325a241dd20942a070fa5a85133281f7a0dec5ba3fd1aa7fac323b9b1624783d42862ccfbdc8ee3c18e7506c4521f313ba1a1a154242d363a42d321724dc62dc661f284385ae7aa85b70660bba0449cb7f2cd2e0a0d21a27a598a95053e9a1bdf9cec38214503bc347026d5c515391f95d27ef4460da500df7858fe9db6a5c13f50ae618cd655d40fa6068ee21c6b71b5cb9505e3d384dfc1c9b333e5770a62ac6f43a0d7d31e6193b1bb316ab1d509dfa3493fbc92b389c38344a8670e0fb9d6140ee021a052fa4185925835b8fbfc9d9cd6b9b4488e6b3a648032e74a7ca34896d61bce8ebbbb21ccc322df7b659fe21867c0c796c46e4e2c91f08b7a85c017f139dd20515a5de51b27351e08eb1eaeb4d7d670c62afbc3c95ee24531e57fadc6871a01b77febf1444d66050ae3203a2471b296a91df344d37759e4140d0e526d1c9546943d54c79b248390e0de13d361c221e60e2b8acf4399caea85f820c5522f6809ed4e98c105e89a1f582809e16a600a2a3aa179ac9d51cc31daea19a50563a08fbd14b56cc9e1702ba813a01e3dd5cd596cd529a5b386220049b640894109695744359e8871b42dddd21d75d0159f56e2469d7294c00993b7ce212d944877f3d987077580e5788fdce91e82afe0e48a998f3b9e648efeb4f20b0a1e4a071a38791ae4ea620983c8627cfb11f40d87cf2ac421d04afca866fbed1dd302748c453af3f92ec062d2a7fe7496921285af26d931df04aa586704a49d43817a857e44ea091e9c20445e46b4c2c4608564082df79ea00e49b1acca3d5d792893c379db0d8a8cddefbf57a7ff4b8c915ec45be261c1859f02ed960ce815a24ca0e32cba3db626420c7e9edd4f9819241be94ce6385f8658c62874e2619bbf7efd8b782ef1e94ce3c2ef84f429ce524489d15b9efce82fb8772e08acef51098a4fe4917baba3fddece788146e6f4f6eceed19dd6fae615f33a5558667a51c426d5bf358e754b1dd690ab52ea43c10b497ca9c3dc2f22e66978070aaecc9e21c310710b200d152936565f4b3e383716957b391e76a27c0eeee8587b9a64c7b23a73c678aa51367e43082bcca6d444b2b66ef33d040477d1f517b1664818e1de3e3673e6c5ba63b947271f4ed8399ba43fa78cb6beb2b150afbcf5629afa4232cc09045ab236a21a89fc1ecc5a95ac94c28f0ce8d5158bb7b964b62a9ebc93947f47cb6a862c4718db8d827c432fe9b0f7e46c70fd96e5090aabb5fef6949c599c7f320a10719b4613cc4ac33872e1bade10145f235ab4c90dec183fe9c4e0246ea8b60d4fb0f82cfc0028071a6c95c4b619203dc8c2b7907ce34f3421c0131ce7ab81699a7eb20d1e5862da882df14442772a4318c375d5012f5a11e7b68b5a06081b359ebb0917789ba3146cddcc608edc183cfd10bd5804fdb1394205b0e7b2e0add3a9f089e6a2829a6ea736becfb4717e5bab3c3a27b93f713ac72356ea25aac3fda5e3a43d4e8da4755ab17d250f1abae9764c3e01a6b115eb14437a6153c2a2b6130d8ddd40f982a89d59eee7b171c885dbad877cd4c8766b98c0b1d17de41c51296869f2119520ac80c4f4a19613a8683f017bd578773f7c24064704a935cd2633e7edc2820890f14f087002f03c091e1dd925d8de8622823974b2af2694f8e2b4772220e76c2bb2ccfb651f9e7d0345e4466162cdf60072fd04e5567c8fd40f91faf4b1bd00f08b85507f7597aea321b66c93bd895bdc8e22edce8dc473eeefc049a7734037a5c2f532a81997a1db7a00e5c6cdc5d03139c72f6936bcdcf3030e4c88ac2f348a2f080268f2dda1d0c6b9e8e223acd64a4bd8c737f8ddc3c391932d2099999f59a6091ee76f5d0a2a807cd1b70e47970e8d018b4f135da877aa6490b86a70ebd0ed012e19beaea67898401367369222c918b528b24d004ea0898a5a8e210dc9ab76a6cafa3dd7481f484412fcedad294cfae11b972c8fcb6e5743311d4c3031e2486e9b99756ab432efa4c0aea99d5eaf88bc3b204f7c7aa43988f4d2903b85369091e0969d2c9c6b6d9566c83bc02b7c0257c5ffd857b50c411a38a09f90209c668ec6c129ec4eb09294f5986e158ef05897089e8210b55574744fc6d7988076862707431a2ba274f67332673f312d03e838a23063abfdb3c122c7a392eaae6cf4c52c6779b023b8aa1735807581c00c3771b1d1ba49390d465d4c2b74fcfcb3b30567aa8b7d47a42562181f329c1b04ad123cee07ee7bc54376ce94b5463279960f829f0c05656b38f5319bce7ea440c1494b1ddb674986eccff0350b759794cd86d2a1db87f50ef5c1128bd09d6ab804e8d471393f3afdfce61321685a130bc0d903e2137abb01e2216d34ecce53a5b5647b24b1282df09cfa1d914504f82cc744f4c5c0d26db347d038ad610eeaf0332a1114e3d36c98922eeda6f7672a31a7eb8f8edb04b5c1544f555ee55631b199fe049c76fe40266a24b2c9b7bab33bf1b34944ec51d1543ea49e0ee038c824580526dcc4b08ac500dfcce75d85431b26c4e36539bfe5d64865d704cc99cf1c3631dbd7993f59e104354846143d0326ba2ac0ce993f3b409438ac9017e588676bba9f982717a0e77e842c53f691255a2ac12a9671afcf38282b397d6a9e6aeed4454936b98bb9ee68c896a2d89cb1b6ccb29dea1d4870810eaefbed44f5e739ed6d69cb96761e15ce23264143c11a6d5a2ea702eff80c54545b02475069cd6016c9b49635748b700acdc44b4a2704b354c96af1902f7b3da2c4748e1d498a14a8c24e432cb02422c2c0c698819d24792c171ccd8baca2b70e3f452ab8abac2d900ec83fc7b2f056aa993bddbb408dd0c34cd765d0aae89c2eb51721d145c87a2eba1f45a285c0f45d74b01dbf9d6b3b82e289daaca912564f681a1bba91f722752770a853da66c20876af994349becc6e97a166fd11bf3144049d98870d1c8a45ea44e6dea4ab9807909a84d87a43512287220030c0d4393d255791c144f7b318aec65f466c545188dbf41d5c633715439209692a9ec4969682e0b95508b04215e51595ba664e04cd8e35fb2f7443542bfe7bac503150699c7a7637a61b6092f8cfca165beba7496d202a995151d563da8e0aad65525cb96b1425dacd7672084ffc2a72cb4a120474d601d9f6255f7c5247cc00a3eb0faf68509fa80153e602d1fb22afbc3647cc22a9fb12af6a7497c14580d3e19e7a3dbf585c8dc9a89d0951f0a0891e101b0a7c0e773c7a756187c2b99c7ed083368e01e727af7a3d341c43fa5f5f94cd651b3a069b87de1e98799eafbc88a3229bd4a938cf98c588e3aadb8cf20f4cd09fc4f42ead66544c1ea7c8419a66f266c4af26648212e47cb440c07465c07218e43e1139689780e82980e8218960f9f3948621c0031c8a1fce4a398654d2c5f66cf276db915d95c43085dc60142b07c67d75822c2038de3217fb9750c2d41dce4eea1549e641511433d33bc231fb72617758a82ec6b35053deb5abfac69b710261513e97f61820bb5a7517f4863180125e67bf32e135541e60739d5daf3e2693dca0ef4ab694328703845550a0b667d82c49fa056a00644bd9396edf3e313b3963bc391a22a1815ddbacb28e01e86af3b47291373e555a0209bb396d843bae22b37a1e90a7789f7729a513c2c9b4d3110b4f7a1bf92519e32cb44619d58dbb2f806938009ae3af9bed6e38402fae0035f63c467f1f36b5ce2b2b8d37aeac54335acbf1f954614c957fcaafa59077c58f7efd50a94cff75343188e490e49b151c15d9f9531b7f391982ac45d4190026230d6ced54c44afe2b7f276512bf969990be5f4495cc17ba465d50749a08266a24d69d6e3bb7ab5b9b9bdf4ac6c4947c7eac6b7a8b194a1a11ef92ee65c05906824f765e00a91d0ff46f6d0e56ef31d290dfc2405e8378fcdd901a20723060fe0b7dccbd93e4d982e42ea724b385aa83537f409b95a379ea4c8a6b9361e0882ddd6dd61aa844ee6049e8f2f1a3c78aab632890830671d8b628cc0f1bd532a395885f44ed570f8956fbdc90c391e2e4598281fd47c6b533770de563968ef12010f001d6bfea28fddc41f48781888cd17f94655b94dc1ad7191449275928350c82fd7f81988f9e9c9f689fe6125bdfe858b8ca264f743d9947ea93a5403cfb461625c07a74186463734c33990c17fc9606d3400c39874187cb67232a4bcfe33d177c3951d803fbecb6062b2381f7d50261691e4bf30973da2299ab8c8a113cf80f85c0e5d1a32687d5445b40891154b37ecab18d1a5df67a76e9b21d14e746140245b23274cc0d4916cfe76a49b296902f238101acaa8120c96e02fc8e9c7c61e3a37f103830c40082e6ac58c3406de8477c42394c10db95c731454cb8b834cfa27b6d9258c95bb5ad14cbafee3246fb7fa33e923ecfd31aaaacff9b6b57f3e33f94f77b2a251d17805d19eb52d3470a36097aaaf482650ed88888b1b580f77edbedbc177affe0e6264e2f918983e46c758adf55348f6e342eaacc0bf9f0110aafe80f1e4b752df267578d157f8aa06c820c381634c53966a08ac33f1c43a38827c88cc347c29aed4e140efc21d2834e8d53d49c97b34efaff39e0c7a0ff4bc833c5ea267af50ea6b638168e47fb6844c302bddca395cf43f9fa460f8f969be427c68889ca63d7f085cf0e49d8cc00a52c01ed7cb4a5d2c00462a0ca8bc616c5af01a60c9e20a2240cc01cb60b6ae1a2a59199f302298431de04076a49a687834f304cd4ba520eec844318fdb22a91aef4900a3b5e68ca9c9518d3a3d3581b2068a563c7b6f1cbe525f7c4f55a909dc1b865db0020dd1bfa0020dadb57fee08c215a1880a63b328344f643d3e7cee862af51a501a8ab64a14e292ef24f68670fdb790fc3ae020e63965c1dcd42cdbc7e9be2b687dfdd5b3d2abf8b8c0118d7262aa1dce064cde835dee2c4cfc28343df22af75c6cc27655cbe7c6e46ade0a5c6a567aaa60a72f68563676e63ad9ea47b8f10983ab55fe34468f48022ff2f1cee306320424e3e9db16402d218ad97eb55797dc880b74b67b1c3c7715c9309e4bd4b13a1dc3ce3f8b58056c45f7efddcd00090681b57a14f70c446eba84a8d6876e202bcbfe152b6caee48f2922977ad616a29e176cb0df4209af4b3492be23eaa258f72d7d4d9f300063e419622272565e24b7c71ca9718a92fdf419dfa554fb643da6ac730c24b327e671ea400f6ce1c04f6d25d4914cc559e476ca0285f368d7b4e9bcda0690ef67a0baba5e0931e8fa70ca6dc2535f3c23e6b373587bc5e6683e9e835218a7efac062a99ebe123d698d542d0865b031a3bce8d1cbb8beb1c6b67768a86183adb1429e610b16ae631b55dfb2752eb5edd3147accd3c1cf363fd9c0e2ef2c149f7a92c60a79b9a042dc85386837a2e132c33b76742652ef2a0806a597b6dd72878d025b0a8685482b01910d5ddf83d1c41dda9a5a224c585da56adf36f78827000400bd3b89051a2169f7904f8cc9657a9547a640270682550c14642c2f16ab0308a4b8ff002a0b0fdf47ac4b2fadde43f584935567878b845028885db97f5e687a57329972a989cc1f8003a31dd5f590aa283558e2ccd9c52e8a18379443044285a65d86befed087131d82a328c49b7e835f2b9b99c73249f0ff3012bf91c7cb84b269f775059be46c528edbf9a4abd99227e82deb63cca54b112b2280eb95dc3ccfca1a05cea561132713b707704dc48811e62d6d0445e21d86c2d1b0244e0f47ad330d8da19498ecf4666879808456cc6a9839be2f5879117041df885da9835d2e8a06a36b2b7349866e6ef28a5bc398083dbd441ca76fcf6488a34200969bd5a73ba0d5d5cfa1b61023388f31ae9993283ee39b99f764a3b807cb41eb4222d2e17a72173038ae4508bccde1674d2f3e1d8efce301c723375fe1d2de96005cb470c08713aa8b419fb6b4417ea0f117b317f90bd3b26a5ccec22f4e2c1c48a734124e345b8590a756262f8c8bd2c00b24abbf626869a6691948288295e5e068b4e22a310fa163fbc96101b5370c040a4d89ab44e69ffcad926463c62d9c386f4deef6c71ceb016e779faaad7c4b31c50fd02f10d2f2c2e36a164b6f7d169758ac02116b3ee22e75ad409afe745b5d769a19e64aefeab0ec60bc1742a55245e33ae056dea7ca7f723935c8c080b50ca11ef8ce9a63cd9e04932749125a19f7094efbd7807ee76d4c4a176da52f10ffb881e832983e2b8613ae4c330adf3928e10881f8fc3d024806d863f45251622a948b9a0369fe445d075c50dcfc73fb4cbc85255dead047b645fd0b7422d08a93f145ae6fea5ff0238792fd4f5f0af189788c46477f8532531929528b89ceb0d95c57a08dcf915d0566913ac61ba30a3193d8206e119ea838e496efb63908c1e714254117fc7a1295c6c22e58b3a7718db101d8bae13287acca5dc130b1fabe5ee198c144693320f108cc67c73031352037ee836c9e402f8a0b887d7d83ec0261050691c350998b2ba8eca2185f4efc784b105225c5f0294aaae322b5beadf26d2f62130c9f48db8aa4d007c1a9eeca79fda43d2228e33d9aa4cd351be9681d90053534fb14797e4bf6e83de58373c829ae0e25b77f100d44ca14aea6ec0cb30224ca9622def1244629f609e4f8693cf0129d6fa79e85d9b199121cf44452c87cb26c099ed107bcc79d3875b873dddc309e145480e36a88f2eb6ff256bf823b28cfcc7616679652d5bc5d8df627485618774b9c5787963c5282472ae2270185477af513e20056e390a0fd9087ade41a36268ecfacb8ebb0a42c0eca9e486483e66275f42c12cbf4ef64617c3be5c57b4ff2c34c4bbf767809c79b850b2906e28ac5c69b0ddef10ec974c6ce693f03c3455df8289b53119f5e25a25e1c60aa40c24e2fe8c3b2f258b8b5fc02b077b031053c015697ec239fe71b5e0c53527d6f49b30224f21b0cd30fc480f9d1eb332847c1eee69156ade0e71ccbe1845447012538b5114b01b890511f65b8b54ada51825620cd166c8d0d6a953764ffe2c3fc6f063b01feb700aab4ad629af7dd1da503580f403254b44d18cd13193fe446138666d2f3f2d56da2275983914e42a815b32d65cd339ecc7e991301ecc24edf821e2b34ce6d9059c6384380ec54ef388225507a82de2dca0f7b76872fdf144d08722f70cc40e3dce24a4baef1ec55bda29b054e68d7dec5888f2ecb69ed7c76c85244a2e812b8b5b577c09308ef84f6ddeaeae3de210054db6b9933d99961d2b0f8573292a92e771abba36209bc6623acf224062b8997ca75c7fd75d9232047ce2ef56cdcf30742bea482c98912324f3e11d84a653fa88514a7aa2c18ab29f4f5faa7b07336d273518f02601ace2fb2c4672b0d5db343d55ee31eed006b78ce746e72ff76b82fd4f2ede743af6cacef6fc0fe5b12f68e946567e8e069b015c34537eea9f83209527742da4318ad97dd067598c0ba72f0dbfef1cf8cec90a7c6768f9f314f1ee82d7705d3a0f11b41ec90b454029cc52b327023347f1e124007908ed1ae852395e0e86dbbc6f8752e1f6ebd087ac9f0b9ab65852a5907ed890bc62b928f308b53c424ecf1994427f4f149ae83195f0c034f0b86c4fdc9cc6491ed27bea761b7a128272b4f2e0d34913a24074becc6276ef5cde841488f682a2433a483012854a43a296453ef2cb9d1f0249eb88931228ee367a1af1854df937dc44d85a790f884da557fb247d0c7118d839ca250469ee66de5730abbac480e2b3d4f60d6ab3b450d050c702bd39df38c5b494e71db9f15e86e653cce548a79241d8a9d69eda6e02e4d83e8330cd208ee7dc20fd1618ae6ec76fa56c6d15e0c0314aae362ac1617ce6c890dbd5b0227ace4e5f0103875124b5ab002ee25823e9eeb307474403ebd42b60e01989a4565a33c0333b3c8ff62f96041caac0c567549099b5068854d251fc44d342e9da41c5047f742c3d5e315fc5e95ec502afbb811ea3318561d2074a6de5605089da17781460170afbe8a390dffe56855813f1587e8e7266b6d0269ce6f8ed4d490e143328d0a8f220a8861a415d2280622921946500316cdf8cbf35872dd37c1999dcf8ab634cfb396c3cae9783f79a6d1bcd013b700e980f785c3bb0eec51ce0ba0d48c21b5243d991005ca6bf4a48db60f1db299d03f780f0c0393b90b87f886117808d149a5b8d2f2788c890d328b503340706fbc04a53973c661bf9fe8df6f43d341f769b2efb01dc6c7442db6876c0241fa0442284c73693efefa31a1733f9199a094d7dfce5a5d14f9aff56d89922fc2d3fea72d6b9bf35ac8313f408885a80361ecffd20c7ef554efb796613d8265058e4f108b570e926f96dbf7d6d690e0d7460d037a2d88ca4dc4625a8e06c8eef49902b102d09fe1b3eb4a441811bb25b2094059719017c4c4027caa03e02ae3b6abb0205c611e72acc19b990d967b0a04d31109084bb8cc9ca9fb9d1992d04713bf0df81e7fad12f3f26091a642da78c86eb29d07f053811e07be51f139b3f88f0124d0a4ca846c449d59cff323aea622f2ef354743ad8a38f7305458e7f7181072c34f6720f33230a650d2d4beb29dc589208bef31322f3b07ebe12d22ea0107ea2bd78ccd0ecf4a9e5f8b8071dc3a3cd00527ef520491baffdbc0c868628d9692f59266ad189c40a488bb871801c5ac8a0ea341f4f0279df3bf03ffaa26e2ea516965d9827af798e1493340c86cc424d39893b970bc4fe822a6a1a5892e32018b1b6180c00bf7efe062361fcdde47a854ada3c9a90be19cbf605db185b8d33bfd0db47fbef971b936a8b2fd64fb526a2742381347e996a300bb8789fa6780d993297618937fa73a86a5d248f4a913357fbdeb2540aaa48e8958a8fe5473f01c90a99cedad3cb152117311d9f430b41d09d4df9854cb93b790eed3adeff3367c2d4cdfed6ec78ccb8027a09ff287ebeddfee34c6e2a5020ad58f4c317c95d2077d34b834defb3addd0c240ba2396001d126f51ada88b0c8d763cb2f3c3c2b4dbec4d5066ba8c788a028c772a48cc30fd76a8f6acea4fe684a8e38a05060cc1431e51fc9652972d6d6a0f0aca281a7d784ec81e95d3743a6f0bdbd068c11a9fad21205b4094bd541df29d3d0bdb75e1c51100cdc3180c5bcd0a6b5f42754f70298d3d7abe5e3e927e556a812ddab86941add5444ef3e98ec046349d391b690714f0c8b9888ad7095293236ab07f264be3845a68bc84c0cf52815ebdad7a74d4a6c3d000a6f8623f677bd724c1ed828a8994a106670bc8353bb45c71d053dfc8e521f554df76a1602d5065ec5401f19708afbd838015c6b037da48c8cc31139b5c689b26722210d29db79651bb3418d3ad4d0c5e23c8e8042313628ae15d2523b54740950424150db2722962f19f9cc8447d304fa9813a3a410024744f8e4a389c5d7548bd2af5b3ad045efaa59c1875bb13aef87d6e87a5c126c850e411d6e89e1521afc184df93c533998c5ddce1337c802a8824ef9dc2ff20b83c2f21bf350e0d6dd8b4124eb5c9ebb1c62cac843d04a21408cf97dcfb12d004bf63031e8c89363fa28a4981bba9fc3db2557d611df56085cebe6762a32364ec81ee1b1e9db234076b5c556e4f2666e2681f7848d0778bc8b90f9b9fab49354373ced78241a44ca3fe6247f88c3b19587434370d985bb91ecbc73f4eb0aa10052c945ae471e3a47d9a71cd43a58f250f781f0554a09f501779cc264d17a8c19bd829fd3e324bdaa23419a29c648f0c71185d0e5cdfa319e652922826269a18053feb514d061f60e8a43ffeee0923e79a080a2664f20b12e4341afabca931b1e90c0ca6a743c8b282a6afef2dda4429e9de3a833772a68398dbf26e1102ac611e5516084526c6292ab2aa7ede942bfeeaf336b1a0c6369d29d7fa274eeb15bf848c1993ab481e7c0ce3e7f814401286644dae84a65170a425de57713301b42374dedb63abadd3609c9f5b0004a58303175acd150a8f5a1e522e7646de2b8736cadee0ee86cb192ee558e6873ad0b8f30c05db6b05800caf9b126c914a74177350de2eaaa295362d9a6691f28c4438bff691c49df3c0d89ce0b321f23a280f7e9c6941e9903ad1c4649c362bbc9943bcacdb440f2a81393c6b1318196df5a20dcfe69d069165afa652074348352a2118b7a84ebc083fe5ca7113730036879cba6a92283f01b94c9af1831df12269e637a5391121f39d4ebd3de91acd1bc0fc6a870281c4fd4fe2174890b4c8cb4e6d4ab365f5512eeda3873e9005f95f959812d6c1c1a75dd5aa88c4144e3b0923b9ff29cd48e5895ea886d027f2fc3a11bc23f67fe6d32f61caa40530680c4e2e37f5256b58222595dca0e9be778dcead2feb1ca04dad5356fec78bd28b86c17c969d362858ead55920967542ebb1ddcf240ab43d26180b0e4efcd9bbf772a83df0cfb8499161f2128e978de819c1d91371605a6506a4e181e069e441397c699eecc93da51dd1ab6c9177d3961cd4107f07f651138e87e043a27240c87531976edb63452b81dd938a8acaecefe243e3f36e4085a554d53e57e173a56a22c9bcb7c0b9bb567b587a48cf2fe226a01e7e0e5ce891c5ad5a1ff523d993eb9cd3c95d6b830a91df04c68e9f4bcf52cf81f5b311199cecd79518eea2d06de4d8fe29e93830209e28dcaa98adaabcb190e226cf65b09e05de57be350ed4455df41773e479e01189bd19b378aef19ddf0eec47827b7a9795b853b905c83ba662840f2a16ac62e95b617ea6590cd3624da14858016d67527fb63bb4fa535aa6e075d1a41843fdf71528657a24ae98a917cea2659f1785067f933c2514856591298cc3ba3f48ff27509fc0ace38940fa7317e90c89eed9c3448f95813d45e6b4fab87d45ce92fa7772964ec411aa5282d24350d52db51054c9fdd5386262c646e09228db9c30f62229a6032f5f8d8d97bc0c787ba845fc8fe6157a47c1b3e205b969b3e57f517e4dcadba64d36e3f6be507eb70bd800055dcbab57b10f1386b41b43db52024961ad9cbdb684403db851872386a252078cd2e24573e360fd3baab65731eee0e581ae7351d9c5116ad5d7665cead4a93348c23efde181ece76827b0a39ea620f1481e7cf8d1dc0f6ac0597d20bc23b168e4b391413bb146a34cc49315cec649598f09533b257dfac60e5ecc236210b103471c6e4815baeb93f8bf2b8a0fb80cbc5eb1a362d215ff48baa1c9487c589bb501cd511929fbe1c9c0c6e2b73fe79956233ad3da3ca0627c56a9d92305644017f0d8fc1b31382aae58a57c016ba01a1e38cf2c4503a6b2e942705a8ea397e4991b400f45065bccda6485b1c9c43f15436fbfa12fde40c80fcae03369b935e3392a6a6eb99068f46b60cef8a253ac213f9c081ea8e1ed120710fc2a065471ad58a53c5cf63c80de0ce66e39af5ba3e3b8f41742e083ab5109e9032021cfc60a1d784f0f4960e02c4a0395dba75a4d45509cc30e93fb78e522340b8675de7cdf9e3283a79081696b9a9661219f0c6fa4d291084c60889bb0ce224fd59dbc2abf9ae926b5c2472284652116233ffa0b2a0d0f80caae9b957db145a1be45a4be9fd1b6d4421d4143a1bd262c809e3a6a484fce97d63cd3c968e9edfa3c49df2813e7a52002be118d2c53a08f2018522085d158d7f9c585631d5a6fd60d0249664b058e0e393a980adbd06a625e05188473ab32498423ba8b07777b61dae512be9465f6b635d863b968d115eebf45b2447399f401598ec555d2960b16feff0aab494805c980064e6f7c22eb3346c8d641738ba0f5f6b280ef38b1be910c59421d167584d952ebe5d4d4827663668386d6f2022ca7a6311e9028e3dfa0877380036e0ee76b29e265aca2c8197a0d2980c9fd2735f0a84cab17f320775fa35e06aeb066ac9534a7e75ec5ecbd0fec1b6ef22f0b39b851b7bd92bdc61259e67b39598e5b5a0edcefc4a90ae2d1391b574e5ffd26ccb6cd86926ad84c82e6cbf3a620467dd993149f06056ea2595c0e37bda73dfa9d7066f9164bd06f41bc1cdcf917d9b72bc4945a707d216204e70bcb75ebaa2064edee54c36a28bd61aec02fbe6444e11061da6062b9a94ceb24f6fc5adbb7748116ad86c732dbfe046a507394d80c82aefd037b92dc01706ede09e1f8524c217335798c2e11d6072aa8e21d1d5e8668c52c6cfc920f38cd98da6c3a8f1293e762170d6829daa05c30b624f0ddd3cbbfc08bbcaa54f9bcd88c51fded6e38f48460c9d311c7854a24cfbc96b718b5d92461f658a7cdf0e8d6da11a0e3bd9462a9b2a375736cbfb3aa55476428727c154d88705e3e07f3750e0a9a84d97ea61388ce6808c2179305c72657a285b206c77b15abe6174c9e52860c42efa94db13c6517e63bda2f245957d98aae8f55f75c0842ada47a9ac35005de343134472f1d9cf03cbe496db3ab23e9852e2b62ce13ebeeacd830428457cb6151eb58920a7e2f5b762d82fb17f842953ba26180015b005158f18dd4e5668da762f37a7c319a32dab24efbf1a4132a40edc5ec221548d0908332253d22410df5bb66f2fc5dc7638c18227e787f05e34063e90d1b6f5b652a522de042a98b2cfe776f9df05c8a6100ee4be76273df0d288c1375375960ddd9e74da6ddddea9acdffaa2dca88ac475b483f1df152510b9e5e8d282423d4c96a1fab17a75df0d80f45b616683a547f315d159867e4e956c2e54ed1f4213bfb135a6eccd6303947f12582a5e04ffe1552137d642e0cbc4026457aadb9796bae02153ac11c7d0894ce3a73bb3521c2b2e8e576e6418eb7b231656a2ae3f39b869e4ee1d625d3594607f875cc498e52c9997b712bcc5a24d08dc6b16472a3b04ee38c4225fcc9604d7824fca462c248d0cd4d8402c14c582c3604035f33c18ad40594ae98e08046ba0b5aff2c062854c3be0ea7cc7d922c49baecc4ff903dceeb0d244dd031b8bbd6784037fa4d4d031f636eaa07492389506cb916c419e4036704d792fbfa415774c6078cdaa71ba51eaa8b55060eeca590fe7895b333eebd1ce1362c643e0f1818b1f0b2517068f150cbf19829b9f703444c5483f1aec9d5ce108baca591510be3ab3f79b1f05eed842121eb6bd06d0b6051661b299e6a7837cd22788904c87d409e893dac5de06d23cc6b013a3740505a70d558925a11c2f59a39ee615637984b7c13e1f7ec31b098767391fd1158a1945206f7ca76da0132e31e5338bb318e8be548325a19aa17960d32ffc02e3575ce87a22a8d98f0a548e2ca9139925f945ca01029e16d7fa5e6bee4787400ea4059925a2920c428c18025cf879a93824c69409a425929619584d2fa0c65e44859fb6552b2caf8ff864f20ac9175a4bf06c6f3cc9efb2d4679f3a479de955990d726104c648605833e3048a203ada80ce96b144fc63b6890c833e077822b5f4b9da4f29f25a27b07745d9c4464390fb0a7f3e24a678e089bc20ff12005079879e8a412645b55a5b0e06581a0a1b194b4f9599960e4ac642f15ad43cd2f2ddf4edecbffbae0b0392f14e1eb4e4be5a1cf73ef88480413e15be62fabb22aad8ab5de45858d9b78b5dcda1bae2b9e6e02bc3d944b1ce4cbf800a083e24dbfdeb6893c6db7b0f43ead8e016506b0ff938420d3f025b3404631753ef8f7785aca97182d9e3c8120372c4e022b8b10388e59f8eed5bc4eb1ae660abd61bdba4c97e53a640f8d8468b60856105c9b12a75ab26244a24503a1b47c41d56d901428bede51dc3559eacc01a3a069bf905c233a15f4867308092c5b253d32b68f62b7da215fa0fb0cff44409bb002b79702da9a7940b79cdf817c73170a959bc286238a23850e0d53774e4945484b3abdad9c9f1390a8d548e393bff4d1e12fbae63bcec088b96888144a38f219540b03b30153d5ac9709ce08db48cb0528f1de879a9dcd0977acb6dffada844f8aedea104526957daafd0b4a15ab4e13b5a2dd51fd06cd87fb0c22709ec3f44993304bab543f364dc571cef177f2ecebd709bc1c725133e584c8f85514f70b2356eaab89782bfd81b8fd8285d0da63b197495c45ec637ada7aedb28eb1d98de6eebd5afdedac4eebb0cdc6c8bfedd34e95832d6c3d27a235a65411a7fec3b175e0e045d835559880968b3e19ce485b0163b9686129ed4ab1072beef84ed332eace744942112831dc214dd565e027312196921050b17f872a703101672b981680e6e96e865841c05b5c9e3f267da68c8b3a5e72f93423fc35d81807755c7ed76b4c18705b78e7bd36bef93e58132eca1ce0c99d3bfaf7790c170db63c077871e39f2a7a0afa20331927ca31f24511b3364682a5aa126e3498ba9049dfaf166ecc30447b5310e09023fcbf9efb3722e4e8b413117ef530513eaae00a1ba96d80fb5540b0e2515873ec7a51c2eb81b3d6c22eb32247082036ac905315bc2a12b81410e6ec4e8d1c7406d0b905fdc24f741f512029bc8dde3061575c395c0c4fcd739c47e0ca7aa8e604d422c5af2963145e46337075590cfda9b6c00a2b98abbf7a7faa504183fea80a0ba43da26c1b66bfe3bd96a889817f472421bd7db85ff8f0d3f44d01cd005178a73823a5163cc6c4e8e39d504859d493c9f418125671b25302c76635112a8a5fa9a46e80b63124374b2d30a0a0335a9927e12bdbd098815b7aee0dfd04d56f4ca9f85ae1e4b9643b02ebd5546377698e5974c4478d8bd900fb766a8247dbc859f304ab978942a4f36524924d243b2fa9493eb5ef7818a477a0a7646df242f7b6158056e8d100cebd42e4cc9622005dda609cc29dc94aca96867859bedfdb76514bacd5625738d5f9cf13f5301fe66229dc2ffa22a02b800590eb1c7671749615c96f2c28514f24b78081a11657c791345a160e2b87f0f32af7104a70279763b1dc5ad8390380c2a0f5b0cb5351ca4cf577c73611bc32ba0e1d7d16f8b1cd457964c5c02badbde8400423dd4464473519da425bf27154bf4054ba7331b7c4a790e2ea90e85540b9b24cc2c2d1a3873433170573d46ce4373de099550e5851d7610fbb2cd16be886f7c258529e005f48cca9c497cfde7a788a99fd19c612154ab9943e4a6c9a6a2cffc4a25528b9bd6c78add660c70c043bff1851bb6d96fe21784b5bcb536939cf2ed3936df74d896a5a932fb1983e6626851545720c4a947e6c4efec3904eeb871a7dd82e2e97e979a29ff0ca793c067f6fa3d1a2e9e4fb92082ce694cb02c429e463301b64584e631fa17012be34f991564acefb19abfb6e88ae5377a572e4cb8ff7db4b2d0d84c90173e183f846bf8a427e539d56c1753e184cdad5da72e75e30d37617bc80fad890322a534d6a57b5d97ebfb0d517f0a56a9be18ee32e1cf21329cb513040bd5f7ec04e554ef26106ac2fe0dcfffd8150212d55becc089d28b6fa7e5ed3575568aa4be8656fc91bf3d74d0c907011970d5a1b5bb7b0d98236fbcced3ae38edadce2c833e1edfa04a6b1a5486d49380e6fc1a86e44935a971e3f51ac63a86fffd1f90666a69dcf7eb5f630bb78513f32c8937c74d58f593f20b0cda9bd538eeb70c2f6ba14a8a805352c493c300eb0ad4d7acccac382fa0652fc77820f294e1d1bebd97fb79d45f34fb8ec9b0d4bfdddc36a08f7146fdf8425b9b543093718db31ee7635fc4220ac939cdf781621bbee2554ab7eb2a802679cfe22cdfd3ffd85a2a427422e42930ba9ddb1b588fb989efb182a3876df1661a408a84f848fd561efd0129aeddd17856e674a5a2642206e27658653b43b27000814484869ad7acc3d6bc33bcb42ca53d2cd9a528c52f5a10aea254d90aa4eaaa8ab2004322b3a9250365e6101d64855e9d736d887a3dbe9f4ddde0195f5d63557cfc78a2330b4cb4231bb56ce44e236a47f693dd054c2bf36c4631e192120c24ef37948938a64863fd4324699a7553fd765a5fd31e0212106ddf3f5475230bd21b842762fbdb96d0159477e42cf4a6cfd759a374ca7e93fdf74698bbe266f46f47974d3404380044355064b4e859564e634b5300d8b70cfb3b8150b41fed501a6d5773910edb59fdf19cbd0229682cdb9a71ebaffdee7cfdc3255d4b374c348bec202afdc0239e77af85726ea76475c2b1745a50289010f459af825b0e739df0ba241345c2827166226abf9ef2b6dad2f27c47e2a46839a55b9b73791538609949fe7c14166c93d416a126c1026e5249a5ddbb9089362e7f6d965a349f655a264bde3f1c79ef6946ca36cbd7ce3cd739b39c84374beb3d3c005cc491571d2289c93603437600b2e18a6a7cce67db8a24b7560a05244dfe3f44f450f2f897f776081e493bed5c188994944a800ae436f725450cc099e294924a489a0c61071759b3a3b2fe422e2cd74b45d3581dc7cd7fdeb5e229eb74579a234b896449593fb2c8dcd9160e498368d0b810183272d2980a610c6c8b758f983a2c01a3e5508010b39f02b4bbc5f14a8b70035cffd7978377f4145b20b85f262742d047fdf6adba13e62d56135d652aa764c595809f9c54411ff6f5355802893d5f0592a21497687a2720dd69468a81f2413d4de71547017226f99c403961b60c4b6054547fda8982e9027ff49a2d0312e875c2dcfa53d41fca604cea230c17308559e81cc8e99c294200b56789c4dd08130fb8489a391e047f66692231b1237aaae16101278f8f87ec4058bd5df7c8dd4c9556cb56f9185ed3a7492d138cc5b4b1a7d4477be304a8ac7c3045e9ab8c09d478a1108fcb953aa209f8212b6d33968422ea6ff03408a68e0520f0e59b8f86016c94df4c97e0d067213c2b90e8b15ffec62f6b0d49f53a588478aa82e3a670825f1614426d80f72b4507b2e5410a7a309787c39460b195f9a91a0c8bb9445d48f0c827ba0624681df8bc14dda459937bd4a2e373ff27840f09d84ad7b08a78af5ca66345ffc268e01fc951e29bd3aa9c21a9bb7fef23c8f0affaa467475ceaf2831082a267157137cffbb1f6806a391b05489fe4825eef04e1fbad24f213b83f3c531158745a714eae6c20e3369aad620aaa0a88ec96e88a50046b969d09277b923988fa4458a4d326dd628113ac818fc02ef581fb07440b57f898aae5ea8e7c04240e8b83ac3808fa38fafdc9107822d579167604e3e83154ac2ef9f1ab741dcd91e2d026ec74d4932b69f7daf4d9b84762cfcb5274769cc42785d829c4425834af50fa241eb3c530ccdbe13337e0001ce46ebbcc3e1fab620e1692bd917bf102ac553b9bee40a67db008ff8ab32a87beec0738a176d8012a90a3ca6ca019452c6f84aba30efad4c38eeef5b5a2dcc6e8020e371b8c4461575645d9d0088138b88e7636e6bded09d395ea6f01c67b766b9303607e76668fba11288edbb64464bba9f1b976e701cfcd42bdd648057f0dcaea07c5e5b7058c90556467d6f154302cc3debc190387eaf02f1c9d198f582d5bf7272232423c55b5844387c0ce44e6a14438204092bc8143f7ed477fe16349b54dec254c2337113177f3aff5a0a9330adaf4b1df4df7e063b1efcc293fdeab8d267f6e08afbe94a32dc5983592cc7263ecdc39ff9a772d5daf802bc3f6e6108cb244c5d7048eafa81944a84bf53ca5d80aa3c868dc5280914ed5d7cee13fe9b218aaac06deca61437516d16aafbc5960524e4306e3c63ebb2da76da381b1045ef48aa0f8ce85c9ecdf8dc5c762f53d03fce05bd4cd57c6a07fd76ab8a3c0cb222f4a37c41a43978f72c3e520404325c90e37d49d0010e0dafab3a2203a94ee56013d5d3e26e9c0bf10a72ed3e662b78e52d2b26e16f83316e3d4e3b7a8a246c0d65c1063a6e5455feaa9ed558c787fb877f9f8028875255f1b61faf1aa9a2368a1a30b265438c1fe4f94486173e8bdee9203f3a1145a6e8918b2ca75f73bf94db4fb7044adf74b354ca0cffc2dd0400f71b2ca687e4777245304ab80ee2eeb073b8ee100a69fcd0c0e14b107c1180bba3fdb6972365c058fd9d4d6ccd69623368407d4278b6102866bce8ab1dc91dcb885629349c1c3c69ddb1742ba15d77ad2b51a1de5f564c8b84a1a4d12b1f5725f05e010aa222d792258c92a4cf9c4fa077804b61ee7cb82824d2de91f8cd7fa35f3f3073a0f165967002fec21fe72370a271f6854634b220610fb17c4808258ae24c438216aa6dc3a9a87cdb07f29edc443cfac95d220749363b8c7d3cae7e86a1b622fc7ece8f546d1e9fa30095b48de9b9ffd09bd8913e76d7233def6a859de0982ef28b487a68e3d62b2ad05ec336962d90847b612f94cfb938495b3ca8d89b575d5b4a35a7349bd6d1ab26a162281f1480cdfbdefe07d636b7c6ac6f6f4fa8cc3f5ce111680637ed5f3d16338012d183cab5ef85437f40d1ff5eb7be8433587e1a710940b86dd19a5808840870460bed53266adaf48d112967eefb72c0640bf74f61baca8e0ff5c70539d52ef29e40e15ecf9793314103080bf18b7a6f6fbdc22689ed58d52b4226fdfcdc222f9efad3ceb381c24cce8b292b5e7811974dafc2c2beb05c81202d2252b7b70bd6ad061d3149dc9d7327e318aa2a8cbae8a63613293d16d5ab62965975a500683174ff33115739f0b135797906d8384b71c07a041eee92894dc21f2b8230412112d263411bf5f1aaaa1f47bb875df650c6bea08af4fba42ec97945d2dc118b896cd2d3ff6cd881c392d31adb4e873e6d988b2772d7f446bc9ad3f7dcb79d5eb21f4a034e11566dd1ae39838890bf786f32d8c518182a8d353e1d014f1149def4fafff4733850df5dcd87020beae4f8b5c92504259f6ce552516dd10fe60b137308ecc8d44680a04ec9b01848129302322d9cd23e7e656cb31eaa3742dcca25c9d71250636e589ff9b278ea22792da2ec92c449a035f389c909e21beb2c4c835ad656b3bbd339eff6601485fceba7a44e1ab3acb29029cf9d5e901db656265af9c83240a1d4b03bc18a43d565bf1b672c807929a599e26759ed806ecd28310afcf01633d35668cf7f300fcf6494d220e9200fd95fc0a8487405e59b80fcad19ec37fc98997cefcfe9a295b0f8453d46cbb7dfb4e725e663ade9927838179a9e517f46f5ff52cc45108063430c8742da13175ae10dcc48309433441d6724ce66392e98640a7d4334ebc0a34df7232679c5458be06904c59d4f4c455194000ae36f428d18f2fe740f0ae65117312190b7ec7de98feff874e5aeb741baf59fd4e03749137234ad993d5abb39030ce4289bedb5f0e575a1b185efd56a170e54d88d3d4528aabfdee628995e2c98d6e890d1303c4f70245cdbd4058bd341675aeddbd376424e3b562b62af62750945a0a51a74ec7a39e5c4af0e126f304a93c166c4803f04bfa858091589f817453dc496d84294346bee7b8f20f0fe6052dd401b157db1cfb8031d3e6053197fa98e77a0c7a83a7282e8da149fa002e43d6f735e62b70f925ffe56894bc27e813915ca1e9f5fffa7a6f001874c0e2731d50868b42dbc544e0834015cb4db968a428b047de33947bd7456978a5d0eb5ee72c35c31c1e7d834098b4a0d299351332a09a3abb5e9a332726772e01b2a157f4c990e664e13168a235df7957215d278d18d4aae9626d032e065d9b69945279e89583b3fc4a7aeee4c515c16c6f33bcfc27e541890e60e7e4a07864ee4459c153e5e0ee521b8922429b6ee318659a6822d6c15ab93647ef6528b2d39426e69192809ed4990596f4543d683d060ff6bafc5943566b58e588b49e9f997180b4f34d98fab8157cc56b6b5d602466d03a1d20174df8652c18dde6e23f8b5f85eaa6232e1456770d822f48a154b9245e46af4c135877f0a308806b92ce8318d43d846fb112dace76a4fce1af98082478ee2f37fa7e8fd5d2979323307fab7f73e362d6bbc38079313f61aa29f95b136d290619b2f838264d1a9c7f2a37252466031a36f9564dc353ebd6ad0e02cf2904bf649ba4458e0b8c7665e318a40e37f6bfaa4c2ba4e97a3dec6c6a63f9e2dea3e2fe6ffef885899fa48d5ded5880316b5c680011a19f0905e848d3c1a2f7cb580e53e0ef76ca998c392474f9b884cfe06a575a5b0b82b41fb23e05aa6bf7ecfa90ddfb1e386da4516a2c492558a1e500e7d3273c2f89cd9c580bae340168fc3d2bb0db0421cdf430fd747b7af7a28a896519e96f83009d664191987122205e226f4f01e8fb4791d02826ebbaf8d7d52034e5c06f2b44636bcfa2ce1ebca0ecb0958b1f873a7ab4fb16b03315e5409303e02c0159f09b9992e2e9eb49f92cfb9bd69624f4d7242ca9a55445236704507d2488056d0baffb48e02251460f8f3fe9310eb1ee449a0fb88f0acbea44957e20984f0db5b3196a14753188972884932dbd0d9ca818d0d5cd97c49589a3866bebb1922cc3432b2e0ef38700a55ca270c6a7faa568a62cb3a86fbc24c435368cc7fe03ce09f246c6c3404fdff5b63ff1e684ff8fa25da28ea6492dd0f40361aef671df2b1cbfab9a5c88ee81d864b9da0536cb54796d57cfa19c3a2c97f87bc1548874137fe17f02f4ed82eec2aa30be330157ca52494ae9f842fcc0b8bdac94899071593ed2ef63790805465c285a80a371439a4d1cf5ae5f7b6ffd3f195dc7c1320f0838a501f9d24f0d3b6eeed28b28b49b50597290f6f9becff35d0815882a98bcfedb688ec02029a60bc56f1fbedc0e53df529a85f85b96a8a511f1f0fd58fa9b5ca771056b7608dec0b73866169cb07ae1961b325fbda6ec6c53a0a611f7adf3fc77f0d6664b1c346919437f59c59186b6be84ec9880c66e4425f8edead9e10a2cc61f10fe042b2ecae62de33e2d9169cd74700e3664a8c09e3e73a841de9cc40853f8b4a63c5c76035708c508ab1a472188f1fe9b0eca79763290e081af4d9183fd10825f80a3bb64f264fbef105ad356edc13107ca3338302e33de192e514420102bea1f98a23014783e6cca524409065a104cf1a7c1b4c356322aea69263fe751967273968758815821c9f00da61abd3afd100a44a147cd976a4f75eeb16b0b18ffe230424d92c00151babca5807f1b5db812e049bcbeb99b9f9e6d1ac44655b2aab55b26b059e68aefa4854e75e74e6c2144199aca45243824a4e79e570c1d96ae6385c5bcf99e17d8b8767b1dbb47d100651d282cd8433e6f4c318496ceebbd43da27ad4df30ecb619b08341a579637a003a4f8a375eec4fa00dba6356365306356c2bc2bcf3187be9c2fa9bfb3d1971d4ee0f06d234e9855150623a868268cd25f1ce12321aba050388818891faacccc47d338222e87c34180adf0ae3f870b54fff0f07d3159540d800b119ea2d35ddfbf22c1f4cad28cf3a361cfa035e108248cfaea9bbe387be5ce7f5f6d371b47491300a1adabdb3666e613e8a9938238d61fbfd3f18b13b8e9904c50cde4f2db8e2a811a214026acb34b28596377a811b79f48f610b77410f341e654dae3da2865d0bb46a56967e309a30573f9bc0ce3fa727fabf04f407cf4cb11baf5d6fb1d230ab40e1536d3583257d9c0234db6d75d0fbd1576d6d3e0ef8e190346b0d8951a91fd444a60cd5c02ee090c98a9632d08120cf443a62ef7147d4023cababfc69c28d9cbda0d4925eadffb28c2a066c1832919c1189fd72ee8192387a855e5b72eca4e1b190403b1c87893204a7d302d54bc81e66cf7171dd116ecb181d540c2eec0a0fc6c2c222dd804c0a70c4b0656db3d5d114c499081158d28aa52c9eae7cc560c22796dcff491afaa0b80a501e928b6cdb19e0886db36f682bcc2e6135710732a9ad8138c9975fa70d84e743a6be3fe2bbd46f9cd550c11257444db2e2aeb8910e0a9be913a909681cb6c54e7e9fe67eb12143678c98ea158ff10d81f0e639e2a93a03449392e0d466df8729f82eba816f72b1759723c633f6cac141b963a88b0683623326f85dfc7baacccf70e179f5465f8625c68d85b1cba54621a39d1af33908e2435553d5b1254f82a7bd6db3061b74c59e8a10d705e5a4dffbd125a837e3f9b5fc488c683f0800a3120f8f219ebc1097b524baf58523bf33c7813dae5186df7c25211b35440e238cf4ef69227a36995251d83cb955eb5370393ea05716dcf41f2f0b6824c240a6f7ed9deade66142276e352ce12cab40cf289ea50e0b40cab5db7aaf289da799b5e9c8ef0f852709e5c73cf1369dfe6ee7d96b4a0f97ed85c6fae88d5f5976ea1f936415818abeab1f1e2ba84370e2af95d29d97c52934a488d0c9c27b58773afa4bac7a9238ae52303a37f68d6ed3286b34700cf6a49610cd6a176ecf1fcfd2a9379dcad741fc898b3f30b8a33ec9db6f1654ab4aac8b40b75c1714b98c64d0ea7189f965d654be73c97e0bab99bf8e95a6664e92c9f93c07fb602d4ada04cc1d4c768a597b3c3d3e0262fb514b6b69ec3fd78f1fe44a98d26c6c21d531da2681e79f0c7d8b2b397f4af3ecd74d7e8b1b809c819aef7d47ffe37033c5be6fb4f767e8f6b1ce4672af0969982eaa3902cf3c2387ba236a2bb9cbaca95371be3c2aac1d527060dcb00427f644b66e55425dcb023f7051f49205c3cbacafd422b1e28fc483586a6ad10a7540149d63aea3baa3dd13996ec707b0c176f0f18a01efee82ab51d5a92691ad4e88412c30af400cdd2a8771b58d91f18423d518e4828ba11d2f133b60bb97a9515ef285516554e140cb250108f7c8410d36106fa6f054f3808cc0c2936ebfd4a54d232573a2090b8f7c1f24c0f6d129fb0f856c628878aaeb1f428395fc14e3afe67f2f52edcfbdcef4d11f261a1f63c9c1070edea5d4c19aaa3fce6824172aedc428b0e4f37d7d4ed8c289b75da8bf6e36e6a3e8a25a9f1cf0f1c363e7851f463d88810ae819b0252632c229f8d3698c1873bdb5d8ab4469e5c724e8057c4696d5ca46b1236ec87013959e2c25255a8ae32995187e4cb9a855048d036fcca157ec3aa4228b244f06ad68a109268dbad6cf590e6631d77f313de72d51dea2877f8ef7e6e389fed2839223a69c332bbe548be0b39668bf1d08dcdd891532ba185f5570b5b97376354e61a5f57468a8ba1e27e5aab5f567e77677b8c370a4218f2d22b364af7e1c74a1597aff31088a51f6b11b65562db8d4e6a9a307680aab503541499c8ff3a3df41352c126709675fcf6705cc9d69351b738602b64ae957235182c637b02036a63cb2b68fe702a3a45d0f922819983cdb657b6d93bd76f97160bf5fcc7171895ed07b47e05a352729d8104f282e85cb980682eeaef1a45205361646a78c4f638adc230939417f4b88998187ea3bd6331fbe2694a606c63c4cb46d748c51d372b81b81a7272e39e41f223b4f29c993875967711d96ac91be8eb57a83e6f3e9af28e13f5c94387a2ac79244cb54123d9293dc695f4c1729cb811932512c8de440103f6ee575b4ceda7c3934b9452c2a827585627452f4e951351e7c393c55345dc7c3b329af5e393b273dce71ca37703d8a3d9919534520935a4210f989ed89703ee5e2cf13f95c33752270f55904d0b586ab18e28f910006c1cbbbe9f71cd9e62355f86076257225822925d1265247d894814f0d6c6fdd4df4976a36b4d71414b2192327a63e6e8121d98eb3886ab85ce948c629f803e3df9fa0085346c623289121ad29704a8c1c63b9bc207100aa25df6825282a95993c9da0d6a8b6c6d1fde90409b79c5d4e71f47d4803d60315aa6ec6addccea5ab6d26c87a66cf012096ca51419d09258aee663907248f206acdb80bbcfe6052e41ffc580f7a8bb8b4be3319886a79c98061d128974cac21321e7e8e96822fbdc262823bc044aec29d60420c1a68f865a6bb02f81414f7bd145ca8ae5c13f0a799b690af9bd36470a45217f8b2234e967c5a3d1f1b3144f41668774717fc915dd18e107c4fec67a066483719a806fa3ee04c67c8d578294d70a50d76a02fa283d3e28d83141ec2354ec5ff8805cb5235290a10e6dbd6637729aa52d234ce33536fed6f873eb07b54ed55e191b8833088c20ad0c1d7d1867f082bdb486b9ab9c2be406b777addd93ce208143ee872aad4d539299c0ed7a259888ba4229997987308228010381f37262b8f71938a7134d865ff5e16cd9e218922e461d8b16bb6d1da2df672a2a237fab6de253f31d34f2edc2c7b4f5c2ed86e9d66466c13a056af2db12888029f7c61ea0c012c1b6d25aa9ee4ce02ba485a715b501c55a503583340223e78272d28e7f34ef624a4202331006e0be003dd3281ae505e08028536f0ef4e41701cb54087d203290b94497fa6a045e4f16b3613f58dec2951717effa1ba97533d3bb5a3932f09915bee2db794322529030c074807d10628ee73c441c51f2820d8aebcfd888217e34566f81c5580edc71e0f4686b71f65fa145371261551a95853a44d2b94783111e786cf0e86a107a342489f628780cf3ea4132282edbb4f9b52bc7d0ff262224f8ccfae046cdf7b1eccbf7dcfe9535ce1cfaee32aab6283171385607cf61ba41e0c8ab7ef3cfa245107f8ec3d7ca070b07d47b5e9e4edfb075e8ca431c0670701b6ef340f2665d527992ac0e71e9249f98c509b50a8f06224ce8bcf6d85a0076382a74fb28bf9dc3d9d10fbad6a93c9db6f245e8ce481f9dc41c0f67be7c194de7edff449da6073ec89b7df2b783152e8e573b700db6f9b07437afbbda34f1375fadc34a8e661bf65da340ac38b9934a6cf7089220fa604a84f3355c36718945aa58684b48964092f66e2b8b0f3edec08f019ee743c5d0fb67ec48b993c03f80c7180edc31f0f66e4edc39a3ecd95003e439b1b5bdf3e0cc18b99422e9fe108b07d683f883e59a8169f5f1114dc61ff87365d6fdf022fc6a2812de407e0f3cb02b6efc383b96f7f873e592d9f9f0f108bcf8f08d87e8d1763e1b0e8930580cf2e5ed8d7a14dd8dba7f160e2dbe7da247a1a3ecf80ed3b0bcbe78bedf6d9b1fd152fc6e2597930fdd67e6c137dfbf0c55842b0857c6b7f8595617570a45a4cc590c2813195e7069cce4f3585802ed5a53a1e18537162f060592b8e35d61885604cad30a21096d8ea00a8156a85a2813198900168b0ec0a90ea525d0a07c6603c2f70b04cc574a92ed5f1c0180c0766cb8d6136484c4a211883d1bc48217cad4ea8156a85a2813197908926e5a7abab21d5a5ba140e8cb9785ce0747eba5204e8525daae3813117ce0078b0fcb9f2d38512c05ca1e64afe148231178dcb1442f989ae5aa056a8158a06c650a100d0a4fc44bb9654aa4be1c018cac302a7f3134d01a04b7529f9160f8ca13890061e2cdf5af989a29c453ecb96e9b556b54708c6501ad802e545364b08af44d416515c44cdb079112cbf6518ad80aacab312c3b66dda06557545852845ad2a6a8a5a71b0fc18deaa5454a551b1a1526ca84a83e56f28b29395107682590cd3522a0a86a1c04e30dbf160f96f023349e17c2e5d0c07cb57295d273014466302439960288ba1301a2c5f05898e5642a4955d8d5642587e8a128ba4e32175f6ea3a1e2c3f654e4fe1a452291c2c1f6544e21c652ed44553572579a12e1a2c1fc5112e5d09ad562b212cbf5e282eb43d58f634273b9ecebb8e07cbafd8499456d59ca4299c52eada70b0fcab35aea2525b20144569600cb6822de4974a2814a634d802a93d3ed80ac6d423bc16f2e5aad4d59c9a84967f02eb6ef49345e1d7a66c5371a6b5c61102d95995a4da64fd49c6cbb740ac8edd71771da7a938bfd6ae39f923adf6549f949faa9066912f8465aa0ec13255bbd722b1eede8aca155579d41aa87a2aec6daa0de0ae533b67915f2add6b43e9bb0e965f479a48b31ed7dda2bf765d9b80657794663bb8d4a6da643723663e868c977f72c4cd46c878ebad871b10d1fe68d3932c999c3615db6dca59a41465dbd71fd8d2a04a8606799aa5a735e8038540ab93f213544115b429df32e79bf3e041ed7afae43ace52759c0754f9c9fe6816f9120896726ed68e50301a76804877ade8eaa6f42b9ab2226d9b5c6dda0c48ffb648229148d7f5b1360ef659ae563c6afa86d2be691cfa51eb1bfaf4baae97df385a78a71f9ca4f50f7eead48d24c27d7f7a828f85f4f2913ecb22a4cf254dfa3c69e4fc975ad05eb64d9bfaa954e21281a5f6797a00fb98353db0e4f11cc4017e9c017f5a1d86c017d4e8b6d21c095aa4cf484372258914e1623240d092b627a18bfebffde5ef70319148442f6c45daa1010e78a66b3389c1849a98fc4563d84818bdb7b46a27d2260baf2c2d5b71471667a24c94993313356b64914933794c99b903d3a06155aea631ba23daa6dd153541e3eafaa7711ba7395296c2f20633e2a634275fe551cc3fc5f0f2638d4d9b505e7ebca16993ed81e5e7e8034b14963ce64854a1f461ac28a51b8d1baeede51009847db4497bf9d68d9fb697bfa24486fafa1834af2395a743e386c6e91b3f750d8c4486529a53d1340f6a4ea8594a9fdf0a484eff684ef68dfcef1a227d43e525b14ba66819e214b95279b9e251d3e3e4e4e4df3bf9a8a534a7b2959a93f2e95da1f82c57284a58224322d1aa4d96c890287b0b85969dc8d56a6561abd50e7204c36a1a9557e66097a2b92fd4b7923b85e7573af2a38f0f816aef6893e7e079ef0673ee43adadfb36c3fffedddc7ad7624e9b2c20100af34b54782d4025f0fc67c5ccb5872deb47da1bd1e27c4aefadf5fd905513ff12124b83401e6984f4b96f4a7f4ba41117356e4d6bcec7465c300cc77af71e6aad10e57fbf5a1626e310154fec8942868c543b3a2211bc378328540ff7e14fa7352369104873f35de67fa97427cc696e3e46846bbda49f7ba6712e0cf2f9243fbf79748ff6f1a387406dba3f1f4e149eef736eb16ff07c126d072067995fb71a6c9b235b07198d92cfcfe7afbff160e693c027adc0f047eee8b1c0177d49c3cceb936879062c7a9296bf84457fb57cb1080828c36ea514cd8717fcb677e1e64fece6663893e3f2aa737bd79499f1b60c61387d7ff17b7f0fe6fcc032e3a8ee0fb6fbfc0177b4e901cd49eebf5492c2cdfef067dae4d0ebfff39cd7427e6eb9e12cf2a2b4f4299f3304cc915a8ec31967914f6974aa510d0849370eceb4ec99e922c3a5089eef13f2c898d3ce683ce79cd3e7a4f4de52a9e36b89315ec98e067ee0cce1c7dd90d747be0dcadc9236b9ce852427c8000637c618638c52c61a39e79c724a29a57c2a295f4a29a59c539ea0c36f870815aea3b7f2fa716c538c1af081df8e067ae0b6f0bd53c630246188c2c559ae18bfb7a7c26270637631651adfe56347af59c2cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf129c3a848f05aeb650df6887081ef8ed1041836b6725213a3aa74bc75976e20bfce8166282e8ca06fc60e2a5e3274a5730e6aad1b974746ae88ad698dc135c44563cb8a464cbf106c71d788844dab20361d514807c3a20f8de2d7b0d268245a22d77876f82a09393c2c1d90cf6f1c22a086808c630d8035b404b0cad8228cd5142a7d299b2c605bb74ca094ae455035bb89faea01a68e1f8b2e2f85750bcb8807de268751802cf8f53c67f38c71dec510705eff4e280cfd1050df81c67c080cff1881d9af4fdaec43be1b0f13912b180cfd1030af81c43a043930479273893c3676f42023ebb146a7cf62bd0f8ec447a1eccb5c13bc1140e9f3d07333ebb0f647c7621dcf023dfef1f7827e84382189f1d052e80d1222abc53cbb4160cf0b99570225ef4088977ea9b22c07cee204d78c9be3b18983eb70d3a072eda86e19d7aa88b18c0e7fe4093c0a5b1770885007c86546861f195fb0c7b601168f80c91803bc0fdf088777295b3f8ca8330c070053004efe42bfa7dc5008b7861c0fdb880fb2df03ce5f30b4ad15de39da28e0f0f66bef5289fdf4e0170d7d0823bffc9c88915ef14571ecc3b5d41fde2d4015ba60dd818f072e9d8d8325dc096af0274d8b20abe6a72d8324dc0966f8d99ab06fbd3d8b28ad3150e5ba633b67c65a4fc6fd8b20aa62a046c99c6d8f2c5d007c696559cda1c60cbd4005bbe0590f17fb165156b2866cb1466cbd7869b21ecffd2f9c9ea4e5ba6a62ddf1abaf377b16515ff1ef2937543802dd3016cf90aa0876eb0bfcb9655dc6ab1651a802ddf161b7f165b56993e00d832a561cb9745e583fd3957d119b64caf0c5bbe2b56b6ac126bfc34679c45c7fd63d8b24a69db72e96a5bbe5f4355b64c6f8a2d97fc53b6ace232c7af203f49942dab94506cb9744fb67c73b07f29d2135ba6d7c496afc9e65fb265954a9ae14b37f6883d482e9deb0997cfd55d2a1ff22112ad31e95e35170eaed47573d9788ff78cac2e105c3397cc502af55a6063d514807c3aa7719ad702a94d0f7252374141af053616698d6b36444b40517486caececbc962e0b41403e6dd336af0536aed84d10747252458a544bc652815563a1ac191f1fad31a635aed4c70bab20a01f3fae9411543a3910f55ab49e73661a316d66cd4409f9f05a2ca025865641345e0b6c3c7394d0a974f20a5e792d50bb825e8b53019ba90146c48d12d85f0bd8319fdbdf38be9dd7f392a5748ddd6d6dc4ad1b2ae1f65f412f380b00c37f1d26e33a2bec04c0f0f3f50397d742b3924ff7f2e2fac1c9afa094190c1573e9c016feb906fcde4590b3f8e9c51ce0b1e8c01837c11e040c33681330c4c32739410c803886d0938424924822892492482289249248a2a7a7a7a727489020418204091224489020417a7a7a7a7a80e0e08bdbb3e69cd2f67facbbaf39dadc0edeee5b7479fd4218c1860dbbdb4b34e08e1c6c11fd71d6e3e0472933d7011fd83348298425b810461610421c5c941912eee0a08e3c04ee8de2cc02d2c01923c487abb88a6e5b4efff6f6e601dba39c16bdb09a59d1e8461d5c49242526264e944e50a0a4a450a1f275cb2c901a2bb06d13fc95ecc591e8df977c6e47ef2db98db3bc15e4811676b5a7552a55112258de2a04f3c1cd35956ad38f3ecda8dd9c73c5cf883369f839e764f9c933ffe79c53e5a7d0dc7ece39b59f9266a6fc9c73a2fcc4992a7ece3953fce499a59f73ce133f85268a9f73ce939f93669af839e72cf989334d7e4e28846792fc9c735e3f1f1e311ffe9873f64f8b2688392d30477efe0f3e3c18ece79cf36bcc39a90b3c75a0f160eecfe7da447fce49ef149af6e714fda434b3fe7c122b63662ac3e7cba57c15c3f3744242945ed4aae2a056a815aad2e0a4ba549712e2e9525daae311c270502bd40a85d1e0a4ba549712e2e9525daae311ba702c1ad40ab5425d3438a92ed5a584788456509c88533bd47f090d4860597133c8b0625bd99af42af5ab4aad239bd56a7d959b8204941494918a9aa213ea523a944e543ac1934aa52c8a139cd289cc04124ae66ab5aa2656ec844ab60e2399578aa7ae521744c285bafa1a01025aad562b12c530ac07eb84ae6e76b1eb919175533ca9d44c453a2d90e624ce08355151d6fe6181fcc899217d703b3f79778a013ab8dfbfcac0c5dc40b9817203c9b8f3c49bf7c9ae42f90c8b9512eff16cdb36baadac68a08a23db566c8d195862ac5f6d9b78cb872249be26b61e62b2358bddb24d867ea658b5f65bf4d8c5304c84fd08135d1856c230ec5f300cc330158661d80a6b03cb300c1b619f6536db36ec57ac0dcc6e99bec665aec5af9a74b9dc82171011286b99190f68dfc2229b9aef34673da964bda7721c05af85f552731f6ed35c8fd762fda5794d0fe92015604b88070d1120f7eec138befc725739be9ca54df5af872fc655b085f5d7257a1d238ceb76d917f8651bb0b523fbd78e46cfa7b30fa3edbf88c1f66d78f65f1e4cf69ccb73a5b7d65a3bfacddab0236bed6da03659a3cff747234dc5d6b87894c17bf568eba11b37eeeeeeeeee14220d4773d68e14a601bf9d1d3b706dc9a0d6d5dd5bd27e6bc3bb5b3e20da323dc42573c9a00c974f371c2ab606dc7a78411d0528642e734b5700596c53b7d64380825c1577747dabd4e3f28834d87a0f03f6d67b910793fd09764bb4a98788c0959065ddcfded36f9f5a0f7bee96290e15fd76460e020011212482adef7f449ab3dedb0880690f765d775df52fecaa29fe22824d19d49cd2928a7b15150b88e276dfdeabb036e2b7a7b0394420efba96b9b7e42d033bd85d5b7dc97c4a805282b0f5796585adcf2c86b0f5d9854be7f1eaebba2836e3c2e8735c749159efc2d65881614f733ab82eb2a9c19986321a8ed7627d9440047131055e8bf513782daca7253ff9d0400d94527ab841d4095bc33758037974479f188ce1a14df11ba8814a1d84ad066a16eb9d62b481eaf67a4890095b636e60083e65d87c92f662b8e638d22cbb5e1ecc8b7938db707277ef5cd5f7453ee9b30b49c9e73739f1fe36bc98873d06fb9fd05cd52cd69bd05eb39868af4bb4d724da6b967b9d581bd70bd5e87aff2ccaaeb23eb3ef9b095b43b40901f168cba2cffefa92b571bddd8480d8ca0dd49dbc806ed796657fd9172262fa3a4698feccb62dfbe0da5582eb3fe48558369ccb73a5bf256abdebb8676f626dbc601d3a2fb4151a3ea07ef8c022363b1d4493eaf1a1d8836465cc2fb136e8666b6ca08d7f9eef323b50cd593f626b4cd18b8b5bcf592aac0a373710ac5fa1f530c0246b837edb401ff06644e4f65e204e833c604de62a958a7ef6b93fdb20ca6e225ba33efd5a3558a3411e1a8684f5385e8b8cd53b66b217d65b169411f2febd7f3971c1cd1015a3f3bc16eb5d7315156e4301e8c1d0b7fe4f4e464630eda71ad66d656aa36e596e686b60dfcfe2806d39aab5411e0d51f4ad9a4a9b52d883c34f2faacee781e80e1d6c6bd8ef4d083883bee8dbf6534da40501b1dd2a606d9ab35cbc96feaa615aae01f70b6b63b50c61e043cb2f3630959203adac657a47cfc86073a0df3f73bddea2b7f40de45a0f1a862171dd7a5751eba9c521c7cd9ab338f496a36e3d34677d1010635b059ab39ee26813f6d657a08736c1ae39eb5d50b8046cc11e68e3271774e7f2942ceb61e7a7d856a79456defa6aca30f9aec527693388df9a105407c4f45dfcd4439ac57acb22a263fd73eb69b065f5f710cbfaab866f77cb9ab3626a0e513b889c278481094c880113567244e1f8f01f7eff0fec8fe1e0c6187d6896f8cfce90985ef49ff4d15c3f0ce8f63b90ee1a21a59ecbe3f11d070f26057ec48be91eb045a43f7aa8843390814747fa730f79ce83f18f5f3dbeb50ab0a2e7a9ccd6803fa7c43e37c8a239df62ebf0dec9538f257ece155d8563f7e0e6e87ffc706e9bad6f5e6f140c77c86ddae4a34fa236cd7fa6d6e91cec6345e2c1643a4676cb360cd70cbf836c0df8edbe6aa11eea22cdd243d60a366c070252e2e61ec2407f12bd03f99066f1d47391dfeb25ffe71efdc2cdd140cd4521cdb54fdcd1a6dc3e38c69907f3e2eb08a988c0e0e6f669216d7a40fdfa6d9d133ba7c473771c0806d2dc0adc5f61cc71078edf714773d1815e4b7c2ddc1cfe41c0e8369d83e3bb4c9b72f4c38f45dab4e3c1581fdf8b7830d8d7c7a696eb9661b5727f07d91add58136eee148e36387e074520ed3ad973d09bff682efa909eff2ba594cc7f747417f22ba594d83ee2b74d740b95dab13488baa2ff782dd18174f780317ec46be142bea7c48363dcc131e2e0b5c4cf9d021c1d08b729fbcf8fef400f060a0fa63f7a50ff7c9f5601fd107e77f398f08a150211718d1de18b52045142521e3f72ffa5d2bd310ee98e55d4dd16ca4420627cb738484c9b8b31fa77e0765140bfbf9874cc8781c4b572e8c8e111f54bd42d36d78197977effbfd868683a6834248adc66c8194360199d469bdec97b97054f0144abc6af1076d6d15dca2d12c131ca2c6e2e566c683debbdb8b381d4fcf93466493ea5f7cea759d765bc975da0816a25c6faa86b367b15c7b8b9d4803ebc60bfc00bce01ff6db9befd5a3d4f250299cbe630f271e4e343ab80918f4ffa112d3617738ed10701314a0e2bd8be7decddc64fd481c41b2cff3d18205bf66105dfa76f227a97f994de2bdfcc33e0fa511b799296e3d3217864cb2b303a5e6d8461ecf15ae88ff0d54443227c35db63f1d5b25486af569da6e2ab614118bedab573e1abd1b6a1f86a56110b5f6dfa5c4dfe90f86a115fcd7d782df461340dc7f7da565ecbd5e0c32f36873b476c03eebf2c2cee9725ee8e706b10c67af2664c7d4b2028094ae86eef97ed36600b51227d8ba0768a90c10f085fd0c119ce7c21855dd2173443697c23f4af87330f0666cdd1871e78384a14297df8a1b9eeee255cf93cf0e00ca421b826701a0ce10cf4ad873892d29c8c0f67e2d4749823a5e6766008652e9f1e2285e77baf037ec6009eff1e4cb6e9784b6023489f678eecb9e69eb5d65abbc9b7810bf17b59a6e9c8b44dea3004ceb6f758e4b965f266737ea6e5f9d9c3f079b76cd3613dbc4071cb14da06bc18a2a79848241a899c625f479a68341a8946196d2b63e44764ec70b70ddccfc01031eed76967e8804be022e0ec7ff2e0ece3f5a2c72ed18f445a965834dabeb92c3fceb22d870ef8d9fe0e77bb5fc41031ee5604c98f6c9b0ef8d94bcc88fb24a46de624c6dd3c70fffe94f56a1b804bc49881ffbd5a0fced21fb7f75aee86436b02ee8f2cb8f901fdc8bd3f52c41df9228ab85fc41db9a216fd58c10a58b8f75a924ea5c37114e32eaf9ec55a3fab6f5fe49efd8884c54c52f955be95f233ecdd62b5d60a6fc4a8578ee3388eb302a594529ad9ab6299bd2a7661d876c3d68851af1cc77196cb382b9ca01849898909ec04356192955812ecaf2cb3b5d65a6badb5565aebbf5affa56badb5d65aabadb6d66a6d96bddd6eac581b75e361cbd8e3c0208e304257752ec4711cc7715784115ae932be4b7f9b437cf71cf529a594d2cf1c0f385c467bd5af97afb0f52e0417b224f7428c7ae53a8ee3382b504a29a5f6298655d90bfcb20d38cb46d993b2d1c827fbd7d9c3e8d3eb176dba3e8bc1d9dbf032fb5996655996655946cab22c23dd8c748374335a29a515c70dacc364948e452cfa38e632fcfbabc6e9a83ab9dda011070f8e09d15a2f4b29b502bd28a5d55652f61846cab0ea9a73f4a2f47a8cce8bbae698e3388ee3aeab52ad717c3856214a297d95d28dc64a7dac06653080693778c011010854eefaa9029d4a87e37caecf9db950342de3ffdcbed8f0425a79f9e7fad3d64d08783df6f5945dfead39e656a8b5d282274c9894904029258e3641d8e379787930d8c37f41024ba00934014fc0d24308bf74c284490909941794524a91fcfa39fb6aebf632517d297bc01a200e7c8c194497998dca2d623d281522e2fa3a46b8bedb796113c3300c7bc1300cc330cc5ed8b418865deeeeeeeeeeeeeeee5e67b00dd264a81b3e3e3e3e3eb36233d87cc938ee390eda642251ada24afabe312289ea065e0b11afc58c8db3dc3467717f697d29373833cabe7ecd348882343e375e8bd5320f06eb1b6c7d13f1609e8fd672cfbc1b3e4132744608c3b08afda3d7b545ac521ab30da220cd4c9b301a148661377c7c7c7c28966518866938b28d87cc5e5aa5194633eca29816ff9a3687c79246ecda78d84e8cb8d6dfe00107ad18ad188d5a7c9296e91aaca75a1010e7f0586a9c9f7a48c7e9bc3cb63d68a1d4d0b0fcac312004e612fcf693154b383e8e57b8f1dfbf9f76802dfca95e8c3b3ce0c13ceaa5d79221ce436029b7f75662741d6c7da534e59fca53aa421fa32a3df409ae9cc57ae86f35832d08bf519c944e9830297912d2c377b90fe1bf8071030d1d7668d394f1f40edbda8094d217cdc1959f6280f0073fc5b041d4b65167a11b44a97814158f12bf033c7009bf1d0e14c13566293495778dfe6bda47cd887fa9c59f9aacdaf559f622cdfe7d9236f2241ae94b349237d14ade8466f22734135fd24efc89567a14dac9b786e251b4fe941913abf809a6527c2e614d83449ac5527998f27febe1509bfc6fca962f45d1541e62ec0a17a6f8dc40b0f5b97780533e370ac5035b5f536810abd074fc80f2291fad0d158ff2aee251be76962207158ff2303a058a2604c4291e12696b07b68268501e46aba00011e3f760f5a7682f36d75c0a4de2144d067d140d12b11e85068b682dd39cf525eb4f683da3354d73d69b68ad3589d635dd43ebabb58fbe691cad53cd599fe53490e6ac9f5aebf44e73aad79aa7bb6783abf79ceb83adf8348b56d4717d86356a8f62d785c58b4a29bf876e7c307d4bb27073fb5c202860eb5b88f4f611d2a69783842b8743de33ae73d22545ea5bf94ac37a15e0a14fa47f1d8b95b62c210e805fc078373c937429c08be9c78d53638555bfd639bbc3d85bec33ec4594da1fdd7e87f645337ec7ef48bf075f6faf17ed60faee9ffd0cc18a7ea3029b3da804ec980a831eaa9911000000001316000030100e868442b144cdc248ef3914001078884a7058194964711044214c19631421840003000000406040a638009f001e7779b6919068760b89c4dd60303ee562dbc6093aa7dd54965ee0ec2dad11e4b572a4634f12e481fd32b06c42d0110aa56923aa49ce425b1a360f1f748f03cdc1d5635171ed21831fab1b219117c1a23348af743e5fdb67096c026b9244030d3b0c428b4afb3a95f6dace7268a7907af10fdbd3616386b0cb44c45606012d58f356fffee4ca1b5ebd9e7fb18a8a4fc19f1fb135fb22ed424955f4b009078d1c5b226978322162abe3978c96d69cc9aaa896d399c9e13134f293b7f82684ac46cf1c7155ebf051f6501a8de34f1eeba8696beb81bc929f69d106813a62af72800a4cf45ee4fd195126196d68f97f6674e74f98bfe787877a5798b8bb5761188b591e99c90571b43fb9572569f770c74bc9080747bbd4e1bdac42d8fd2939e217f5446651faf5d6fbbd617543dd70562cdb99b88a1b3fe9b1c791c0f80779ccd8f47a3c900b2424c2dfc3a929704e082419e80a595ad4015d494c486b64fa090cb57ee66d2179e5da0e45ad412c7016ac1ad7ed12d0d71e828d46f2cc87c66a4e6a523fc93fdcb1b5183a2f58581ae28d20eaae7e0c129848c6479c099c3e6b79a13f34862bef1866bc7a6d996bf2ecbeee32d7eeb15109fc49e4a13223503e2f9657921d00fc57d0dc7e2af0dd14c816fee2bceb7e708a26802ca8405707ce54698bb5e20285621835091d20465b005f3983e076da3b22a09943940069ecf39a3bc8ed5bbe0158768c6650e10e625a30e52626fe1494fd0eab6c12ad0a6f25ba6d86c63dbfc80a01d7c229a62d140f9404b0fa183fc22ae30410ea0d3c94f33a6d6b315c8982ea06eba377b1b6aa18a549c08bdc77cba1398551364287dd691af1e217412d65dce38425a41f6296f8e6473dfb4d313b5198adec8dc4a126a24251dc6a86b7b3784cc019614d3b1104dffa5ecf23e18c1a3c12b2d16b9c6e82ee04bf0b804da0b58653423dd304bdd3641ee027e7a4a11d387eb1f2cabd87de910c06bb0398f984837924432e2251b99fd739339f4acd7b27c9a53e66bc7724d38ea74481f03e3be3e6432a7bc6d003310baca8b7be7c500d22a19b0ecd6830db88c76d00aea0f3991a32201af16893a4571f1cd54b324e1175322263a230b471263a119432ae3018776b4b6673f7324286a65caba10d895a42a27a85b6422c0dab7cb67bbdcb055425095aaebc495d80a4975f6a615da9cbb150691230619884d57040385766fc0043952559e6855b18d465f369a669062885ce38ec0cbb131dc9d8ec02fc6dc0be11315e5427aecea4788925b3eb5615144914577912d9272a25ad64af6421620fda91e0b0f3efb6d58c7fb62e90df3814cc7db95d0850e977a90128910d372b71733d0d4895957053ab06eefb2df8017a21ce2186dcd22c02539caaf6bc4c03290e4a509aaef7a615b1b8b1015b1d4a3d2a4c6a47ada6d2c5eacc612a4124f3f40862c22731e84a2275603566249be8108d3e2fac9eb77a7daceb6d213c94bf25addf8b333555e234ce73b3244bfdc9e3ef421233d6757f11465c1dcbd64c920726618c4f4465b88ea7464eb8e8a110c9fa524ae510bde5c5cd24dc6d3f5e9b9924abbafbc1dff74ce29ec3879de1ee0060c8efca8eae33492859697d33d34134502a0c52289ed1312a70c4b38655acb24566a3e1a96297bab78862de26116bfb15988115671b9b8e7631964c4216c911d316075d17a5b050700350338511022304d0665a02ab45ce8c024d4a89de896dbdc41f6f8b2f7aa2c24c1213024df6473852afdf8fa4e3f0ac6ceb4e144711e7a828f10e43ff3dcdb6ca6b93ac526308d4265ca04c0495b8f7a316b9f2b9cc4b28b08c4334297a47e334ddb498c0b443884c0ee8af02259ed9a32cdb241f21a99a0eef999a62cca044e9c02659dec0c5d6a1c7be1b902b8507592e4938a4e9697385aecb09a434f9cd3aee8a09a028992df8b1df882523ea3a93748f841274c6be916e2654b48f5192442fd5f040e602814901ff8b2687629c7248b32311497697b76306e6916a047b77ad766b28fa7a1904e18043c0b118f0dec409da122c90b9847142900f15aa5ccfd9c421740a6625c8608820f638cc42c788d4f57acb729ebc40e27852e9b0447a2811a0fd05428f9075073f4221203ce8c46e1520c31413019d1ad1d3ada807298c7f47fecc0e6878dff6a48da3205c9d665eb106b1fe753474e00b7f18e9a2527790e4265a94bc74e081c32814388905dd81a28eb8cafe9c8b5becf05d4e44a26dbe21254fa99d4549e9b7ec2846dafc9b2e106761d45b8851ce0582858ae5f087e7a8681809008a8aeca15540814e981aeca796a1d8b575cf31028ba9a1069e5cb71311694de42d268ac06107be198781e013cb10c4918a9573e211c07d31f5faefed6c534a8547c375a4220a990029194829e7daf7e00e49d4903ccb1763312396ea09d939f5ae5612cf17e806a507acdbb129d324d63d363cab063290556aa175b3b669a9f0af493519885b9873d7836a5e9bb0e3a68f3821e9cdeaf3848f773edc4748fba495f222ff7f5ad39e7686e710141f48efa8a2ffa2ef21340dabfffa8dc69a8203dc7c7b141ecbbe6b6d20840826285488568f8986d263e5e7ab9ad9d53e18d22a03d1dd389b339078ac071ba2845e12421d6c58d33eab8669a2e2d24cf366516f69ab78f074268593ee09aedb984a83710b00f1f8b0cc9573e09abae54493c69482b6e37d64f737c89d3b83e695788a60d757c176c4a7daf01477697350b24bc9133af198ab23ea4e50366f0de01a58d140ea78174d87bf49c02195d2325265251b9b0375072e1640ed4f3ebab1d3a7d1c16f1fd0a1e977aaca32e20443ede465d50278c7f43611c57eb29d67ae03e3104e26a06a7220353790fc6c88ee00a2b484ac8e07df0f08c36d8e5427619933815217287b5f31ce5be36a430e9837babb540f0e46b8380a8d0f24cd82d229237d91e94d95a9977411a937abce30da41dfab9d4da3c9bc1b0b86a06db1dafcdf9bfeaf4b071fc7f0b892dda0d4f8e98f44ad8d0f8a50e10ed0d2aeac6c536cd32743b0aab1b617482d03567b4a24730dbe0d787cdf030137c786418b3714f85952806e11dd581328afce996b84de489f4be3765aee380aca3cef0f08653537715bb439a5ce67cfe7b3409ab3fab374d6f5a2b20b5c883a7478ea6424f37beff476a53684bc7276ae11915060c2d4529ff5552cc23ca3e9663d4a212958f0ae277b28ec6b755e42b532f57e19b949c5fbd671e9e9a959637187cc14455310c93eba01276f54b6162d76ca14899701cf67168af327bc80cdee2a1bc8d1bc271ecd6592021db940845289748ba8f589ec958ad22adfc6220c31d8ca1a410d4a16251915966b15b5c9b92c9169d1c0471bd7bc28bc4f229eb647d72091979e16d8959884f9611161a5ca7aa45337952359410617e6d86b58da14e6d9c8388d1c87d3d89ffc8a3475b52a6f5598cc93576983c6325004d9042c43147782daedc5456d2a9ef211e234827afd69fa21847d3b6b7e075977cb4039eddb5ae62036decbc025e5e631f964478e3cead867f232a2e0802b7f8b28d7b2f2e3e811767397c3e183973732506bd3cf5f80c478c839bcbb27cf94b75f44a9c5663107a752133c1cfcc786b3d6cdc37bd36f914433e1471952e9085b1a59c10242be80aa69ee47f7388e1fd6ec62382855d91ccc6dd70a937dc76261c1219efdf46b19f17963978eb57351cb248b70b0d8464513e43e8ebaa22f12889c9140e0cf45886ca82ccd07c356c426309a36f3d86f101708f7ef3c0a61d82bcc4983caf65ef982cb8ea58c49e3b63295eadd753fde333c609ed2b2769602b15fad3c8dbed15b088a09d1af10d5a14ad5ec52e007fc79fde4bef2cf3ca5669d92ba6db267a7aade21ab7e8114bd1408b03770e34cc1cea04988b579928b86f927f1802243a3fe4a634f2d1fe9947c33367cac2dd7e879d490e7fdb5f37d4df58bbf45cfcd11fb674ae31ceea07276f29178cc50aed8445c89227a839c173d6287c2b58d9d08cb7b4c6992305679bb4af83fd82a2eaf2a908ee010403d72fb7e44f31f6ad651f45a420db449f5dea8460392164d4e09020a24aa3ffc0841a745b905e8d723838849378c4b9842fc225950731fd090941007fc42a1bc84ac0527c5a1fea24ec8b786d004ea687335c7aaefe590a78df6dca954616e699c0b2277d2eab72aa65b4163bd5c420034f32fde5c1e3691ecc48e78e5d9134aa1230266d6c026174d8811918ea1deb82c7b128ebb8e85339238ecbb05d45963ac2cce94f964746c1f2361cf9dab184d5576fce728a34b74406540b9fd272e49536f0f7e35d119830afd00b618a2f2a8b1fb6b5c78d616c0bee5b6cb3c10c81b68c83aad9f6293cc2a57f479c24d5ce41e6d99ff08a558ebe344877238cb106353ff5cf5f88f8f0afee216edfe296170fdc7614bb1abcc28c9fd9e24334ab3ec159a203d1651bd695f76749e2b2a9e8039e21b6e2d87680b02dc6ea545c17400fd6f08a68dd3e1edbd283197d9aa12d264499cf4e9447f5018529a41a7d0b49dc1aeed5830ba5c4a9a701351aebac2436657ebea5e0c43bf58dd43a1072455df10fb43162b1d3084891c521fb02862536aa0b6901370ffdee1cf0c870b29837dd99bc9ae555b960a42c8817e280f8a3c7a0509cb3cffca51761f152fbc95c97a1218551620a2f346c0c8ed7d213220da75c935ec3e2e767ba8611ee685878ebfcdffdb37731c5ec3e991c7f9d5f84e2222926433e53c3d6ccd7148fd389999651c1764c58d66a82fd48928626ac1c28b22a58a22ef15e08495cefd6f84aebf4b18eecb81bcf92c05954ed4208d8e4ab950995d82daf41876d864db25a8959386ae1a21ba7e9c55bd27f6126c874bbba0e95516c261b70cc0a9d990c5265dce956972d396531a39934669fbf25ab2f99c3948330b100f9e87daa33b4dfa373982211083c8f98df4e59ff9513af110fc8098c7d76ed7b9f8e09da7be93b64258b7e3f4b3e757e2117853b17c10f06b14d73fa0acbfd8f5a0d31dd8b523b1410f1c3b16f9273f80ef071dc0fe9024bb0124a606b656d9e78fc87d22a20a3e5236fd951f591cb2b45c9935557b94ff7ad5e004a8c3dc88906ad5b6b8a9db48515a330e114cd8b8ccf5123d81956f0b2e6d65f93c20d24fbcad5a07dafeae9fab102ce62a8d91ab60132acfb52a00bca64b4d1637cb6d82ad962eaa5fe2b52055f04aa95dbf381f219886d4f484db23f35876d07fb4d39f8d54dbc0ce18986f6a3e87baac3b4a6aa4f55b81407f613a9876e791d0aae5d1b5ffda3b011d48d25e26744ef7d1ee2cba70f77b1d1241e407371de76c18a844661a66119658b46fdc65c1af15f5fcc93a80d1da5a210601353e9b77d67871082b094a971dfdbebf6a533cca4c184bf4f2a8613dfb56ed8bf2523c43af3f0e327615e0f085dd01134d2203967699919511621203302979f39458e8842459a95f85fe784a9fdc124d9573ebe38132d3d1784c90d9f4624cf7b95136661fb96befbbae33f8957e8cdd3798cb6e426101d50f5a41d95a7716d1e8238a00a7d85aad9de8a861b109973a09939e27025c13e5b68a8914a52691e56c404a3d895921aa18a1c7ca69826bb03d84547735513c05c2a33eaa0ada3fa117042a103d14cb5324fa2cb724ba442057305c81e823df9940dcd764bdd056b90a569c487074c7415ca9c2b946fb06b70302fc1c0452c8f2d3257e06dd0c1ca0e19413c3e828d341d02c9e641fc61cd0f096fb5431847ed286e5b42188349b53c3f1f191def77a0fa2fafec2dbdebed89303558466d92ec0a9c810f07186b507e0c7659c1d3ddbe95363c4db0237db98357483bd955f26b3b212083cfca87d59692f8663ecabba17e392ad0175af8fcf17e3113b5f1e06d0698fe0030b6eb360d58bcfe669a9d91f966825d3b9415801cfb5034a4dcb0e67409f08e0e039d22cbfe400a1bf912c8a84f2ca03590d7f45ff9371e1a0b564839936891a5bc3d7c8ae810e5123eb556e2c9e4f2745b801363901982cb412952ff2abd0b8e0efa52e7251a2d0a438efe0ce798cc37d267d63f1ca541e456a3cec4bea4524e234e36155615c2393cd80ed8500f29750c5e5ca1c716eff16e2db4f300512c013ec3b67d494133c02edf0f16467313d9671a7467c7380ce87ceb0c0cf0a27c8b2108fb0322a08328b6f90e2f33b5afb50fbce78f76f1a130065eb70b598988a3cf0bd25594ed8938411c9741eda477ef5b4df0d2f9c6338d58c070775a65f6ea4f6d686e3a0df4d83915e437e9f9f1cd3710e8d00f81d55880f6d2d0ed703dff28b601dc48e5b47c94a3085794666cb41dd1f4ef036516d188af4df0614c91edd2014e290a0624b1849660520631b2c0d42b38c33a9497bc473b56bcac1efc98d2cc5bd198513e9bf75b6df4fec5955376801b7f1b6da1eceb2492ab0f593ada5eafa58c753d807dde5ab6b23aa0892eb0f46e5a6a04ace2b9a37088a123dfc0f287a2fd26f48574c64dc020d24aa72cdc35d3bb84ed270527b6e3355d5408df9b99d195a30e985000e786814fab750005cc3e6437ea45b8f4602191db702374a201d02b3b13036a0a6e274c0b1ef0ac8224ec644649cd36ace598cd72c3710909105cbc0622c5be05be57c023376ebac087dd4f7647ec70b7b9e0580590baf160366263c35a7ea638bf6479f9729da9c2f485a00aa7add3d3d18372469a27116f1c0cd3d17c8b5a3d9387dafc47b30f4d88db68a9e238b6981182cc5f87c7bebfae586d93e529476ad76fe0a297ab080659bc2c04acbdbf1c5a7594f0703645e472082c8f95380701c8211c08006c0989ec32f5e00cf022b7fb55c5b7bf399161760986843a161dc70bf51d50f65bee384c652bdf5a16c9a168c16746aeb5fc952913f827bbd5d441d044e466219a82be6508426472753128d961b0f8fccbce9421d1bea7cfa5f9c0dd496c06905fc7027e040354a7143df8340a658c151a7704ef97559aff683c3d4a30c5ec395722c119a7a66b594ee1f696aa97436b1c4e16e614e1e197a0aad08564b740b2d36887a82d0fc353dcccd0504fad718c8e4bc8581d66d48cb5bcd2cd09a0544b1028a8cc9ec4e59f5091897301651b10d95d6cc164f9f45d683507217baae842ece7d82e1a1a00d1b16187340937e81ae4a008b992ee9a7b1b84a2b9a6bf7431e367c0464094ee91b2cec116ba91bbd6cf00030e9055f5e70a70b4ef882dfcefae3de15d1ee63ff2371822643284b1944832080196437f03aa35b466b14bc6b51a80784d3c2c4cfc0b92a03539e12ba8566278d0bc20ee786328fa90544c7056e19114087114056ce1e7b0aa87c6056cf3736944ad9f545d5932e199443d42bc3aee1480ab438f00a936a4c3e90a1fdd42e0e182162c44b69e423c0facc86906c81234183503ca541ab3d7b7a6238ae29f1ac0116e80967ee51ba79b89c516c5638ec307f3cf110e004ef4d2f6913e8045e78e9bb23154a80cedf74f8382f1fab8496c227af1d3f4b788eb056e4385cc9a9c326df106420d5daefc1d28468439fc1cb5329f38a49691726f0b4e45f582116444ca580a154b3f921fe91fa06f062b5b947a3b8656e9715f8e6583207fa98e3b2f52684b36e78fc55610619b7b5ca008ebc2dc3169141c26b50d369117077c667d46e421c21554515e2a3ce7ce34435d847dcad15c01682eb4010d2ac13a43e9436f8ce18a8a53910e705decd952caffa74a6fa91c367f45a7c7512df4494fcaa87c9e2a66dd496962b19447d4b32ead53393a2a499cba3e1dcc3ec8d31cf4758e82df5107447ab7670fa284b62335150a9146608344daaeb9ac8c41c0817e823059c87cd43356cdf515da544db467506a39f951ce9dd44842183c4c143e99c1df01cbc67f1731e207b661fbb0f46facc8559b68836ff4125f338174b2846fcd99fd55b09248d57a968ddb8a6f6058fd4da0f0547075521ef0798649d78c7ac400ec341f48fbd8db9b13ff6d73dc712f23f0754b148d91bb18122776e7da549e0b82c92fee4c3e67bdae0310029d9d539a3f2204d35519c13171cd5359eca0ce8e00b15a3e650816914b1003bd0d07d228bbe3c26eb2694000259872734306b707ef4128cb6355bf339b43e630ca3f7bb5da5b6b9e296ddc59961744b521b90f4bc3aea6c91d004182955fe8de4928e81d51572649f4754866592837429bc7173034f24329861723c15704e0a6ad47f69762fdcc1d214889b29e540dd0b1d457448e56c16d2781feb88c78e60528a803b7fb34dc13cc158cd51afcead52f254fa4dd32965d7dc25fef135234a908e91d03fa17ed28e6c56ed2da44d3ef247ac7cf4a38369e18a39c4f23c5fcaadc780d6ba81d8739c13556a910288bf991f6abfe51c0616a7880fc4701f00c40efe5193e5412e10dd474a0635d7f0f3b4a7b207b77e1258d1592af8a28c25588325ff88ad082091a7dc1555afe2035046c956781aa00157fcfe5bfbe3c5f01e88f7ee923877b23ae2215d8c51f1960a13553f2508705d9680f73a52c975b35284ddb1732efc4e9e211737fce91b9a5e010cba0685390292d5979f7f0618e62da8a0b280b00cbb611f1a167c2f18afe28aa8de8c48872fd6e5ce4ef426587bdf54445742075627728864142c796904b27940dd11f8380732ee52a1c9a91bc4c38ab6b94c748d6d661571f657b25e7c854b73a43f2407f376ab492e9966a066ed30f3c54e0fddcd3ee0b5f17f07c972f9111dcdbb063e6b14c2b474473622042bd9b1499d75b6fe4d65ab4a89c2c404dc824731e44afa32b22e8ec3aee9fc2339140e4b5657979920aaa98b0c4b04b37d0d80dc415d282fc4339471e24c5414038d840db3d23f70a5f60047af83689ed369b00cb2c5ce05e28f6adaf1c353af53ef338e3e2b5a68acef55803106df961aa649dd7b3b41d8a4dd058da12f6a38c43df69117ac06ee54bdf23afba8fe2e357f25b16f8c4d5791fd895db7b1ff98d9092aa1575d68b5be753c24a10174befecde8189b786c776467373a9712a73149b4f4eecb9a35e7cad75c5ddc7a495c930406780d83cada9015c659c58659bf0590440d614fe15aa91008ad9111bce8757c050060e1b289ff6a4f95774987cb2f82266da31d1bead31d1fc3e800346aaf6b35adbac33d07c535dc9cce6c061e5d63a9ed8ff6a08bce73c79ef4a99a41c87cce1fe2ef48ee3dd5b35d583e7c559c625af5bea820ceea5bc27dd98bb33a4e351f727521f23a23f2e2112a5406743c5ddd147f397aa06054a932baf618eb9e772aa22d461f4a4b6c6ccfe0d37bb19e8ebbaef6228029e79ca45c7d5ba43dd95ef69c1e443d09e9117aa3b7a3af9e8c108e5464be19cf04a7a582149a035a55b5b078a1ba9fbacde9e495491432bf22d8cbe4f444a86f3a3d51b954ae9223c853ca55f403d241b98a6e204444a27d042774b2ff8c65018df64ba2d1c4988b87cb09ce13e8de3e85dc97a807c6aa955e8a69b124f860a5cbb9611e49676ab5a4d2cbd04dc9df5cbb8e8ee9a9287802d78e374d644ac49330f7891248c342708e7f557b30cead8147844349c83d18d2b417d313e23f83aee135787120349003987a19d6309bd6400afb4c11710d305c3c00341cf9eaac371018a911412a39cc113b221b3f8735fb3e72526748a2eb41b10def097c3ca6f86b4d20d2b4518983020284dfa781da6eac4405a664a638455dc2186127be19e726192b7d111180f10b8a34507b81789b934a302c3394dbd1638c362c4540a238cd86289583ad48febda3ab87c2cd4c004110cd4bc5baeb6d418dbdfa4958507a1f90dbf0aac7dd30c415fa6ac52823abe3a6c5fdbc2c91dba2f9a8b18799cfb12e11262c86b2bace48ded5c6ba43348ebca23aa0ebf07c56c6a8652a366bcee4831ab154b8bde9a0a7575c193dfa8748c8f07b22c73479c57eae956b148f5b8d73a23f6dd5c86e713e3eb5e4771b50fb3083c5053a939d5fe2e19f095bdbe17b476e91ac0145870b2b56d1ae256fc9115c8bda8a900822438452ab5a17f8d508a4804655651fcb653dd8f76ad0284541ef95c7cb4809b976870834bce643683c0a60936ed975a53a53389b1dfb51ff1c22909ffccd7b4684416d550c5311f1b2c32fce0daf36dab0c058b4e4b08418df82704bd3862a5fb1af5b102883e8310b5e4d34749bdf939fd5db1e29a2d3d1d5a2e370e6654da3d2f64f272c96429299c0879415b2d4093de1849cfdd4511db0401d7e26856fec38125dabf21327393fd00570611b454324a6e8316a29297b889079cb313122e4acc2578a94d33f906c93afc367a3eac94ea8bf6a87f61ea4a7d345fc3ddde6cd9fd619b60c3ca303919c2a261474c6e1b5b20833a94c2b97bec2a684e6c7cd4420eb773ab5e666368981086d3f62c82bdc8b0092c0001860d7d7adca50f2d985e95e8ddfcc1b657c810160dd8df55f7171b26778fe5b77e712898e065834d6901708246cbedfa9ea0c89cc201b42ffc14e0f18604039da3a557f6384fd7532299902d399625a691e862d51da3d5c1be6487dfc5811fd83da53b80047e0dedc5d9f5dcb8f34205b56f01d4262ad49cc2eb5e318cdad8b36cb2e9bfe196f677c1df75cd224d2453086e47b09ebe736430bc8387d11552865fbc1bf16c2f02d7d3b175890b64bbf09421f3f842ea0dd0f1138671b60d6254dfb35e16d763fb4a44f6fd13437b4dec0b32ec0f340b847f10585091c87a63ef2a5f3bf083cc6fdf97bbe60773838c136060c1e2ba81507775c2d95436433c630aeee3b8936c3219ff2163db6ad9499969357ef54300c1bbce780a40790cf890cdc6508ee046cee004f810c7db82487f59b3d3fa99b4ea7a036bea1f453fa80f9fff1a5b59910e8fb72d0182b6fe4b69e36ab4c43f681a3af5a3017a881aa70550d01532c9f1febbe87febd0969891772667cec26ff8ae2bb7b68fa28c5a23033e434ee808b8410a1ed8f9b9f81e3b4c712395e69f33afc2691e5d13511513715dbfbf85aaf52182fc57ee6f37a05b08baf4c17ca56de90d566468275d048d8e5bd7d417b70316598f09be841bdca4876e17ec00485191def3230cf13b76896af4b863105559fd262db46034f3db35746906319324ba91f4930de76c570559fe73d28f6c371358466bb248bd8da057140acb8e1811e8b2f8b7f82c805f3171cca692fedb330a4ca7a9167b1613f08028d09f04d1086492a1a99a0aaa2b2ec13112a645cb9096b823e208b81dc3ecf2251e4ed15800a66c7477951c4e3043607a3e90aca6f57f225cdd93cf626867a47a812ef4873133cf340d39b2534f93459bca290df3a4687b2677acc07667b16691ef25ede4d7aabd137dab36fe99d02b675aea3440691d68e4251ee1b152c5bc4c63aac182a6b5e1b59faf834c009b50df64ddf58563c8c5e18642cd1cf154d5e6b2c732b15ca4504b65dfb34dfd8a836aa6c3c04cc1a7141bbd62068de00287b9b6569e5a42a03fcb7a0a7823dad3f712fbe6e721363f3d97f384605fef15158585bafe8412b085f9e0e26c282a696e25ad211825c9395c46c4434176ea264698a03fb1adc32836834a7eba82acda8a28d25c61536d85056b3e0c8626ed2eb3f5f2bf5ae1f7bec4076c7ce1bb326f0b23f3d129976a8adff28ef2e94b477373dd25946a8fc78014fb045e45e71830f372502121cd27c487c7e26c4124d45329a832a059847d58661e79e273a4c504ebbc8a51aa481da5d26eb79be0fdba71457a049a63671faced14adf3edd05bfadbde67792cb6cd609e5d2f6e9e6294c6dcbabb11f21852abce48e665baa8618fd3a3b1a051dbe04373ae72a27012285aa6efaef9f98c8231b20de203ecaa0c114a34a2703e0bff59f2d9d35b55a1cc2f3cd077acf269b17917431c26f4cc2edf8700e5ab8950f9d812f161a1cd7dd1bd5b81cff03ffd46bc298b68993f5e8e3e9142fdffd081e844f65847b0b0ee4f714b52e9b6578b13629e243c53f047e4fa583ad13637e1bb76d0e6cbfa72e3648d30ee2fe932c9ded005fd401d26c2a0e7c09b5654830356e73ec674c376d70b3c5c2a7c895d7e3aa2f3a5f404c02c5a1688a94d9948956c1b32fd23d9e374c8b3f5a1761341785ad90aae0528d666724e70f000670da5389c647d2208957fd4c4e712e9f633f921d6ac04bce603ef27b2a3ae3908a7d2aaaee696cd0a3700f738262170f9a84aad426cea2f8d27c6f53776393bdfc4115d2013601d0d34614a51c67f9c49f8ad48872b6b029da3f4d83ed97094684bee123a13ae20b92c589302692378c137308986734a7ae1ca23275aa48ab8297fe99cc6ef4e8482dc05886df39efc7f5cdd24d1bc2f6a96b1985e6ec1c6275a06baa237da6d9ad2ab63009fd8e792c6c480ff3b8bd4e4198a8107a53a33816c37e2a4a3f2bdef42ff7342890a3f88a85f266a87ce429e4f50c3327559db4a6256d59fc598572980a46545fbf0abafe820abf1ff2a36e4468c33ef94386bfcca5eba1b1a0093fa5e0e919f6a0f184c4763a8d2da8679b79e8be05a7701f3a24cb1b5a69a0134eb03cd1b3762e8fffce8681ea5d30e308862245219def0b077c23d53a8acaee56a5f69bdb3bd74fb82aa7702731e591198b6d2232c13ff929e48d5d88343d9c2f1142c5e526de647a9119d3ce63eaf9b107cd7a6ee2b8b3d913620efe2aa409569c683f5d6ee85a43573af4d5d8949a5e89351112a88678df99118f25dd9ed4c417d952bc0a7d0316efd2fdc05e734e1e1e1de02de606203d5e0228068e0ee036ce1d900e571a3006430fe806ee268a93bfd17c6837b41fed0ded477fa1fdd06ff43fb41bfd436f43f3d16ae8bea7de758663a35fc4e17ccb55b440d76d04e9424e7114ecf621b753ba172136ee5cb0df94c99928442e6844fbc8225416a24e6bdd8001b7db59ef544cfed2c2c75f03d6ef3a3c17f47d84bed0d27f4ec0db563e3a770c6bd29aa4c61d9b7b1bb08fe611196ad49d8e2fe2e9398057eefa6db2fc5d0b3c21a8b8800032c561536b43b7b42b3fa809260e66d22287878352ce0f37891a4f395b5c786b9ddaea5a81c5d9dc66abd2744578aa79b7d5d3b3951214a12d33d7d60181ebb0526c5bd134b6db2e1257abc8d7ef4aad6a116dee078ad6482dc48dfd7880442d9c0443ca00034e2b620edf89303f6bff50b2a655b8f9328034a3b4961bfe57c992561a9ab301438fd604893d7e9b7cdafe53baa2b5e450185885d82b8c8b2bb4b073f99e84b959ff49a9052d149a0d0891f428f7f8ace2c6fe3e54c02e52b3e924798f0700b54cb9cd3a3c733f4fdbde3f2604532feeb4c19cb8602466e1f063a29e9d7565a5960981b6c95d7b8ca8d828a25a03aaf1dac558834239446db87f6049b86f6375b7941b5ebcbe860da63a338a629f07b9aa8a02c407429804b5dd52eb19dcc9392e5b426a95b4e762aca6f1ba260987228485b4af606a455f2b17a8c74f2cbefda54651c0df1e6e4669864d895ac87113cda3eb2c2ccedf1448c2c5162357f89b3d386d8898ca842b672db23920c83b74dc8b6265b7e690e0585cd33e0b2db534bff9366d3f0ba0b0c52b01ec6d93fc458ced37d3f7a754ff0929edd71a4a17dc8464850e027d63d1614fa474517fbc809885b7598b6cbfafac2e747d708e172ce98bb4c95fd317094def3b0cbd1f8ce330b05f60685f23bd5a9e3c064ab624cb8cfb1f220b8c4b0bc3d97ca92434c49570dd6a74dc136961d4f989011c8f1a31a11a668ed96884b1217af3abed13d0d9712e8e31061d907a201dc97ee5d7927084bef1d4b532bcb2b9dce691508e9469daef28e6b12bacdbf296243c311876e1621b5185b0c378822b4c12f6e3fa21257e892dd00122fc92509b87c1724e69e46aba997276ca540bf45401b875bbd0e7e1af87127edca9cc00e443e6f79dce13039e842be49e06b36e61c4dca41e4247e62df3fb0d0d4cb6840b86296fcd104389224881862ec123093186e3d80de0bcc6a92fd670be10b5ef9d41978576406b7a7c34ebd052a8f0158b69258a7afadc41f520d629d8e73e9ee19af1e0a5abe499bcef2f9a03506e8ebafca8e626b30aab9b5e31ccc486e88aec9bed75f8f64dd2d9d1153814617588677eedb1721e2ef5d8a1ef5fba49a11bcf58dbcaeb078db2e723ba8bcb06c9a5f7b75c2b6da09e5d202117f4431a23b0f1c41730ec49a6b745178cd7347c47bab7179dbb3847468da9e375cb789e3de86cb0e9e19eaf4443fb38a433bf21b889346e127585acf594c0310eaf90614fd2be3d7ed75a9bbc5420613146057141f7d72de41ca0d456f44acf55e73f15d387666a58d763434e4f61edab621d3ba79b6d8334ea13417dbff1ee86116b2d90b66cce9f90658272cbe596348b494d8ea95310879c97883654cb44b264ea2ad50d8e5a873c9589a4a7c43d0248f130165e1ae71a9893d307c7dcea74cbc6b60459c4a607d232e3b80dee182338ecdae8698dd4029cac73a7d9ff327ef4d88faaf730a88d647083dea37a8cdcc4ec54f73f864cde87574192ea8dfbc924c1f27fc87ab843d9d08274f36770958fd4bb3c366fd326fd5892af52a676e46d3b64401b3acac5f8435be72d15619eedb9ec1f377b522ce93d1762e2a0c6a032af1bc834f73817763699999fb7957d67d53066c1e54dc3d0711e57f8792497fbe70078f0d8cbd7703c4f9fcc0f1bec06ac203a4e37da4491c3c7561fcba6f757509e12657a9f0fe353d0172db7f221cc192afe11aa2baea6fff3101ee73771e7e87c8c1054cf27bddb1a68f4e4f214287bc60506bb6f25796171d7c40b6afc5f8167910ffc362faab91c68bd729227ce7ec4be3d536c4aa7ebe0bb14c531b2893a80ca59de840770abe97562da09fd0b60cc9d419b2dd9cb137afcec605da9c7dc0e32cc6ab595ca18c543f8cdb11c5647f83c5264a738232ab26d70251f856d2747585e156aa2986ffba9a30177c2460eeac447bd493f4251a042752d76e160944dd7886498e773787dc760dd53e6bcce37cf5fd11c14bddd4935ff4d4e7931fbd0e07b2a30cfe452452af6f28faf2f1373ef729c149978445414ce3270f9bb27daa7804debadf19af0c822cfc6f94bda5906894de42ea9bf81259769a17a2812b688b913197709b1338dcb3c104a2ced452b4904540c4db5282582f49f6f1f943981c220c38c4367e1c4ef4280272abb89ced7502de2f2f441979846db045ad9255143d2606b10fb04bd2649abbe2000559e961ae726e9bef62b1b85d8463768d67fdebea7f0b23c7530480dc2bd7749098244e75a988f042e258c7e3ee0e64834afcf625610fb28bdb9a6ff69899fe9a6906ea4d8853723e80ac58ebc51883e32f6c40d0af56edb9bb35ee0f6b2d48be59377f3e6e7fe92ee2bbd14fb4777e9f6777f41f72bb98c95dfcdbfbd12ea1559af400e7d5a3151ce41f5c709d5f71531a3a79e2b416d9e325708fa22096725df84c244c527f9be2a466cdd2e43980afcaf944d46c02e819d21ac3ff0c89c08047f46658cce3c2ec578411ba32a74352029fa3bbdb894c4cc6ddb852e16f1d2803eaf239d781fa13a979bdaf38ea165d3fcc419489252cf4e0712db4ca744071f912b1ea7ae1654f112364f1721ca007fd377d605a3b6b58cf0ceb1dccc245a19452c7efe0ae5d85837d9fb0e18d41458cb4ca004e110e7c82a83546a743b01a9e1daf1f1a8a9131dc7b9f88a97ff00797807cdc238120f9376460a53cabc56d3b284f66d6459c09662ed0361de5d5a4c66efcbbc44a19f4f86d512549df93e61ca36606bab9e9fd6f2eef15366e6b4e26a7fea145264cf7e0166ef3832c151f32bfae30c49c11f5dff0a92e818842cec4b64b90b3b892554962c9beedeb39d55fa5a7953b482ad9f2406ccc7a26f81cc873f5eaa5964d66f86eddc3514ada30f1bbfc84618b996ce048b3cf049e048d5bbd755978531fc2f097fa2309f2865526e52248266f0f1d2c53140c0684445af8fa9ab39516d0f9efe43329840e9e9b92ac470b2b0fa20f1d967df3ef3e9cb77be7df2d997cfe6a3c6fdd925b21cc6d8f8f6d557dfbef2e9c3573e7df3917d98f521079f99171920a9180ed195918e3b6ce60399442b899bd10a058d9006d06f091b149ee184599bbd8f866ccce77d630123de2855b6bcf6420609bc3e4ea0815a94532fcdc0f25e1d74ce7cc63e533a0c2910347c63a728c4c36e6c60fb6bebe5d14334202c3aa49e06a80ffb95089c060ce06ec006fb37fccc52fbad88669c196244023c1d2aba4d5ae20b0d45e80208c1776eec78e8b6250ab4c282263b1462c991dbc5aab1ebcc32c82ab1df232b4d58bc4c16797580b074c33cf44afffde9b698b8faaa5b847ed67f16d59015b7807ee17f92e8b50a9017137d4e323f2630c321a5794ec63feadaf828d19c21c6ce86f6fbca72dfc651ce6ef99f39397f4933765c6f4eda3f5e942593f23527891fcbc8de2c9af1e1d0ac517fa849a6251ac99cac3f1e1fc3d76866c30ab346fda100991634ee72b2fc786e0c5fd0100843cb1af587ca3119d1d0cac9fae3ca1db1973562cc6acaacf9f7604ca23cf9649afc44276699d1382886c986fefb42713bc111c96ef59f7d38cf8b2287896630a3e287069cb9f160d88a5c88bf3f88673ff64176f6fff8c27d85babe998fa952673a33590ca3451debe76a33aee3c2daae98cc44a121881b6b861b9862e61cfb9bc56edad38c4145ab486d86f52ae98ac65a0de0864c522970792e73d9fbb708ea6c64e790014417839bc5572ee70c3b69b083018d330e6b8987eef3b4ddf15c39f113043aecde811d651aeb29698e4ffb504c0fe3d13d8c7da6b044d5818d73bdc45fe3a94547f4faae7b7ee13641dd7c85720dbd2fa98fd11a015b5b8e3a2dafc8d9000f05f1423fc4cb7f2915050178bc23b788d72a446dbd502c1fdbc6b2410b55f96fcdc36c88ddd3e9b716b3d54ee221e37cba3972cc2fdc4f923f4dc3262ee6bfef93bbcc71780f1f80b72645b1ce733eeedc677ec1fd3809184d52c5d148572c9eb16434cdb2778ffb82b76ace90b298c8f3be368faf590eee114038aae12e9619ced791bbcd2fdc8fdf05a3c9c2b8ce9f3e37c737c7e11e0e1f7e4d2e636b7c675ca6712eb3dd8f268c5287340e6c6bf13ddbe71c737b1096b9b5b08de12d2262cf5ee727db4fde4aa486711c8d39c762dfb3dcb2a4268522dd01a2b88e6bec7e83f94174c72f922d29f2f6fae9c6cee71934b9640347c04672b3272d741c8b3cd08b8ad913e5b5637656ef16428444d39238778b8f3f40aca36a8f6f1ad999bdb5305c7e12610be62704cdcfbd5db2ac992ef6401aac1ffeaef0818fde1fbf2f34201edbd3bd45ab10b20f5fe5184abf2f43e9d085d2c69b24fc9a9e593d6120fe0178eced4984508c6830257cf47c27c8637470902cc77e468e09c6fb816ff53afcfe300178ec4ff7d2c8f8c3974506bbb847837285e8a87a5c0ac981c320c3361e2fd9e9a0b56be214a2540355718fb4cff6a95ebc4e8ca8387e32090193b4a31a56b7f107b040c6ab9c05c03443afff1a2f5bdc59b731c4de379653cb79e3fe4e3cfded7866c5c45fccb7e45659c5f3f4121883a7c8b03759a45e396087bd58cce182c693006ea9a8481a7bf498ed12f1f58c1ad95b3fb16363aa662bd799ade697d669edaedee348a1c8fd60dd83392be97789fb9e3fc2200cbbdbb7f22487fe98a2b30a1e4cddba769153a515dd45f190c3db9d4ab30be6e436ad5c78e287f616e3df225081aeedd1bd38fcd9bd78d501caa2550f1fce6b6ddc50ca612d7302ad1714f003b189c20a4cddc3d702b910a8d361f56a9891a2dcf8c1086aa41795857be95a90c1b83f27216a7826fd0078107f52893e9a1cb334f0c8ed2228c4a86aac9698d1bfe203353daaf487fe6aa02d4498973ecf8acbc4c6351f8ce5716362c0a2f0f4937668ffa672a5af257f80d99194e7c1f578bfb398c995a906cceebbc1c707b838d994995b66503616193d0d560f6d8d45169e9398b8dde22d50c98ce897243ae4f4b99c6586242f76cb484a29b54f4cc797d703035fe1801bcc40a676f1fb21996edc1dfd2946f122ed9dacf6b88a7778e2551237fd378fbbe848a4dc3b414cd09d7df2f2ef83067d32617f66683b4d1c002ffae112a1eb4d5ada90cea364bed8a2f4a0d0312476c07b0e7fa5fb4b37acd6fee77398c8ccb10273f41d6b53b489f785c046a3ef33106bcb0ebdc8419feb4aec7d9fb96102a614284667011854bc971f98ffc1bd42809afec8f7d738ca562c9be6f7c702b9850d178c3d972cc080e6ee02d4f5dff71ba3505d3720f43c521953d4742a38ee3fdea7180572d441d27127074c5cfa479731b0a75b56e31518a68172991ff30e5da09b92ff4e0e5010227f241bc1f24637b15abb3fee6135125ee133dfd1ac2e58ef667d296482bd76608807b21b0c8c9e8b2ca28c92be0f9fe5f129385ed21fee2986da8b1e2260da6ae5269c13208423ec3507472842464766c844c521bd95e9f7c1f5e77db5f395a0f1b289bde39a785e5e967deef61f35bddcabc0df4a28a10fd43a153590bf88e12fef76a882aba99b76091478d6b2c2028e1fa00ffa389f9a85577d9da592d41c956812d729ef482496a6bd24f5bd1b8826e2ee109dd1ffd367beb2e7a4cfdbe9647b57defb5dceea91d2ed9b7c7fd0786c24486c29450794e9e75d5f4490d3d6d52052e81034d509e2c1bd0cc95ad88c879918af0bc632966449a16c33b2113fb426ba09bb5f393cd406052041bb68476943cec2b0498aad8ef4e36518b59d59b2e63d716dc6cfb0a6c52479d8dcba39fad75be86196c3f987fc2082ca3e96a4ad63f65a0950fe6cc03dc6d0bd5fb12946ccb9e3d1a432df3999acc9cbac6b04ff421ed920af19db8e1aa940701d8740a69303af968f16a23cffe6680cf48b5e3ce2038fc1a25a8e748b4b542a87ce41ba932a247b2ad87aa343a05820fec59f00fdd1dbdd525108045aae03630f5120442d2fc8621bbe20162ba8da4a0836d644bab88b2bc0f213e57e21d1afb45752fe601a89ed744e04060c9945a3be2c53d66679f46f3cba8a9963ee234da598f3ac8e0294639545efa629330f9dba68a6fae01ac373fee03c83975e6530c2a7baa42375a34716583da9ddf556b89050eb3284e6d033136bedc51d809027d059c6c057ae89598d608a36d7c5653e8b14fc078cc4c23caae4ff6378b392613024d50056d77c817a7d8c5a080f8d7002ba60634c4573028012b6f70af1459051d1f34d698f3650285863e38801776cb3890e8d34013792265fa1ccb14f7f42d1f2ef1825563d2348bb85c682aba6539f59c3fe50350eb8edd5eacca5d2ebf2cc8e09ddd6b4742b329fde4f1b2a1fdd0ace22d5c6f3de88c335cad0bb726b75af123870576eee0b354331229e2fcdc41ee9833545a3c959df5a20ae48c947b576b3bf95b6563e00c834103cdc535ed89060e38409976f34a28271329a9f3ecb9c836a8c542bd71b578064777fab8fb49d81ec33066ff5edcad1a76ddcbbe1311bc591b28cdce4c5a7b32c85f3f9a3ed8b080557faa28798eb60cb88a72b8c6a96a7f226e52479852d22288cbfcf5c6825bfc30ed3865dc82bbd990a20d57ab689039c243dae8cd834450560ac703593e41c8711f810ca9f3d2a92853878386b3bba7c32bdc72ef3bd01312dcb794b388fa0a8afcab83c49cd9079fa3ca15bd9661bb3977841cf97b0d2680591a1f6faa6c0776c36a23a2a36a40385c2535751c9d2801d469432fbe565956ec044519152d6b29e7e42e319c335cf0a5c04d120ebcc99f3f465e4e5b5fe885195759c3a626307482b7da5c9fb40c3593f60e20da1c750dc1265c63c4507b72195e8eb45d498067644eb1f015520ddbb9fa46ce8e8cfa08eac0657aba4ecf244d535f2ac748c838652e95b5b91c2facbb172e22a365dbc4e2889b2a8b1cb550eb7c9253d6c2b6aa36f750a3ab8ba2861f1cd28b58edb7c0b0f5d8ba3e9de887537c7f09b6be83ea03cc3775a7634957076b43c1aea6cc62bc7961ba2c1c032559976f401f365492a3dfcec1011cfbc73aaa77a935dc334d89386a22ff3d15967c6325c68711469cc061c798a4064a78d7cd7cea28231d499ee6934a86615826d07a391d3d51f1a508e7823e411bbd9d420d87d09e79bb15f830980600152cadc78d509eae715454e32c045b1984171b51c5db95acd27d44613cc4412fa57ff5c140414296b29e449a20134885c382e9289cccbd3ee92e247dcc45747d80c733cefcf5d4a7615e86ce7566bcde6b6e794b35fe00f350c1c32a3174474e9072239374b077864a8cf879f436b5a282748af15e83b2263535a9d20adb349c878507f299510673ad3dc43e0c201cc66e4203171d0383b32ada5f98e7c88759aa0bd8d5bf503d5265d421bfbff41615f435134da99c4b2a254af0cb1df276e98f7c494dbcfcacaf888508ecf18cd5e717da850b2695ed679b6ee56fbf2ac55d5039c4c3297797a31a32373d2562e77c0d7e616179ddc2bf378d84b152ff5bb3310c877ec2310b4b2328364df4fed3788c443071acd527601159926d79329f9e37166446537719b9f4ab7363bda3f1a57afb09e6204586aa0dc8f581dc0457bba53df2f11a13735d7b198603b95ec0cb9d578ca0350ac209e2b551fc06f8415fa87d65a77145ccdd63864bd8697f22a4c89e096ebc43e092b2af51dfadf8d08783d7b5cda812a6ac7f7cce0aa6af3993d7520e2275ab52b4c201a1146425c64b349da2ed54462f0234f2d8482be59fa9448e82d9294d444518f0397dadf3a34a3261deb93deb6645f758e709b6333cbdfbf318c45120fdce8802132fbcfa65dda8390f09e93ed4c49927c950a1e0cb16be16657c1cbed9e0ed74cc144126d5f81189556edd95d4a21476dd9da9f6ee944b0f548d5ce1d6cfb25e31821738ee8e08344e7d3b3eb7780d28e39685665d144666b586a915733789fb305b2895c870cc8633004a08fd319a663800e0d4e177608f35f989e246395b3cdacba121883f1d81102a82b0657ffea965f2c0aa80a9354d6a2f162b05d31217d6ecd6796e06d123eebca7a1858672f126c2931c16331edf12f6b49c12d17c1dea1d884ff2ade1d48991735f82f85898021b8f157c26c0f03820e5cc06362030404bccf752d189b1192b21eb8ed730377e01a18eae0a129812126febcd8c60de9ac4c2d03d6d8185e332583701aaa7182415d091d53201670e42ef011ad3872bb9c329a2bb296f0925ccf771b0e2273c5d11ce79e9752354b949a17e53bdde5f2b21e8a4709c0b7cc8f4dbe39e6a6a815a7bf8d04b7142c1866f10fa7deed2b9aeb24f5280060adde25a481016cc395ece64a0b7ccd342dbf1d83ee7425e4058146d0fdbbe7449abc745b7eb3e4b3084d3f9ed4573e574a5745a04fbfaa9268ad3d7ae34988b96ab9ce81e2d27a1262f4089391f99a320ba669068facc48d120da6498d25459c742e745afa6eb6ced413f47c84b4c045ca98e523f5295d4b933d40a463970f03f7e8cd3c60df57c55d17c2cec4c1d65de4e224d68478945a77f42e2ac3ee16877ca3cce6061a1ddc4cc8a033a43e2f0546990d9ff1c1106b618fdf8b717f5d2b5f1b0073b3643bfa2e63e4857e59ce9b096f976594b898eb3b677c14d6572942dcf7d56849870f95666af433a23798f29d2612b17d730ee86006ad0c70f41b7ec5443a1449c444233322a13dfbc6396012438f036ada636f9b3df36bb66a05bf9904f0baa2483e1677ba07ca6e405f618d45baed874a512fad775199596329140b82814fb31595622bee5841667362727217c2e243414fbe5e5166b524558131d973b52257551dbd9b496c7db00bdceee61063874289fb052bec43450f629d2657d707352a0c1b1c932682d7151035caf50c4bb0ce679b411fbe46393cf5b495351f176f1a71e2c3034e8981acaac8eff9e9d1882dcc7db16c490b584d1984c90c8ba30b3f959fcbc774366382993185caf5f39ffb0ecd00daf98564a6f3108ebbc8ee90d63dcc40d40783245d3053157f6dc63ade921c5a74ba03e40d034a47a2735c4016d6a8033927a77fd91b8f09160a88508166d7b40a61891e23a042050f0b2bfa7959312c91d5218f9137770b1582d6266df1869b3b7427d01d198b89e07df400497cf8ce815dbfd55b72d3bf9ebaef5b229becbd9bc8bda54c49ca030704073307b90b7b897c91714ea8ef57c80fc86312c6f32ab957a3366509fc0ae67c610ef85d983376083c2028019ac1df01663094ff619ae987c327a45e03f8387cb060e8a03b08b691b9b2acdb12fd0b06b6c4ff70671077cb887ca9b0860206eb9bb662072224b9be0c7c7099df841e6b53d726f06bb71cf3f8bc835d4b916b1b993018ac63d74f8e852cd5efdbba5a58265c2f727d97428f20c4fc46bed4af1f8eef5588dcfa85dfccf3c9cc093dd6a2f452f78e7980efdf81becfb3c8f513fa4d8b75ba82b819fc6e5523ad164d905cdfa712f2458794c5aa7c1203926b4afb9429d5d379d648182ec4d109839879b37866a72f4fd7e09ddd392f82b5906e4de72ad7110d675999a122921123258402fa5cd0f3791dd7b13f7bf66823678bbb8389fc73b8f31de658f0ca3b66791ad8bd0f87965beccc4cd374a9b67cf779d4bac53b80d8def3efdca9bb7b34700bc78454c58276ab1a999906de0144f7e140e3e973349e6a349e6ab50ec9b548ae2d4d69da64c79634ac67b67bb6d76aa6b8330d3c8bb4c882e70a9eae7964be4478d6c888816792693395e0196bf1a645d9c573094e93399b4e66ce7cd228dcd6f3164e9693eb6f3b95d34e74b4d8434e8bdd5edbcdda4deb6c5bc76e5a9d4026ab552dab4d2d09236db0b653d57ef7dbb69bb59bd6d9b68edd3447ad740c1174b145175b8073d6b0dfb483fe485df3a1fe8ce2f677f34610647f85a80a59a728803cd9f86af0dcf511ea614a24d71f6d4898ede57788b8c92e64594304106b7b889016eb8d18505e865ece78b9f292f492e5a569e44d8ac2cdc44c51144551140a7fda54e34f2edd6a23edea23fdea9a09a4456e76671eefad6d02615e0dfd3895ccd8ca8ff386c4328fe4f0557eb42af8f361ab6cf8b3e5ff2e9b97c7f871dea4fc38b190f1a21759215d047f6a7c7d0aa44f2e346dd284d0fbb589fb176eb409f42a6f1562b1b468834296a79485be88b2e4a028fed408559e3ecb93e8b3d0a6fbf46dbc404dded347409b509e3e0d6d0a3dfd1bda3463e5e9e7d026d2d3d7a14d349efe0eada34dff9482445f3f1c2888522a4a3dcbbb608af21209b3fc0a26fd0cbcf2213ce35170e83d8cf21de630f81fe6fedeef60cf6fdbab60ed43acf23570f81f5cc362ec82698f2ed56f954c06aa99a2462d5f3fa6434cc4e55530111efc34532959a761cfc1da77f0f635b0ca7b70e72ff6fc87ef73f87b1073df61d062d0a360ef43180563fb2b78c693f0cabb609f7909ff289aa91adf82ff3f58e547b8e569e0d163fc79164ce34998e56b6077c1eea44b15d443d708c31087a3883e084baca345fa2d988716e98ff00e2dd2a7c182736891feca0c7c438bf4439806148c8098185aa40fe21b2fd86041243dcb07abdc2ed1a79f7602f397d77c28885290d540208d826c8f56895ec6579894af3f919821984948d367b260129924c8f5e787822805590d04d228c86e22bc027aed412f03af801ee4b05cdf7a1290bfec7b8d84017d7d47224f14d526fb9504b9aa1c0bb722fb0e727dcf833c0f02bd8d816790b9f35daab608fa4843d14e9cc0aa52f00e20b2fdfa298047fd6a00695f0da0f74c219e07fdfc70b0d6d30977cc6c3daa5642c2d8af2f413ff66a07983ddfc1d73e0864ed8364ee19ee2f40613b9100cd3be62c7754d2a4f54a521ca60d1ff49488265966213211493eaf7d9efa58655296353e5ab9b35e0c2c33c808099c509d20d71741ae1286c70e30777e071099fb11f4f7bb6b412f6500812ae8fb6bbfb7f72365d7e2825efb18786610963905074173e7bd06f4db670308047ada898010b967f683e88cf569e8281ab693ed7b8100b94f33c8f57b562b01e469a60c2091803e9baa7e0b49f90c670a147e56e1c3d17d1e37bb328f3deb5945224f53ce9a49935aa282c5b422d7a7b5ce219f9756f1a01dcff6a047516ead5354a7833d1dfc75b0d7c15de63ab8d3c1b683b70ed662b58369eefcd0b14f67ee402fdcbc15a21d482459be9406c872dbb68d0052f6e7c3d1a17828289d94a9e6ecd1e2c75ed6bb215967eea40301018db4081aa254a4b8a3cfc6de620b0973ede9d65c92915cbf87b09a89aa6a1328c4fb5a6bcf66b32b12a17c3cc96296353e94e44eb694937a38265c8a42a92ecce605ab3fb616b9829e4a275daa3f9fd81e17c8a4e9d24cc47999e80ab1436e11d1ec48ae3162bc0ef9f2f90f9e34b024335b9de4fa9a4de692793395bc44f15fd4b3fc09678a8bfbf97a86db4913eeac3d3c5f9f162161fcebf7122408225513063fe2ae285a2cc8d559443e36520ad0fea37db6cf67eba06ca10f316c614caf7c7e5bf93c7dd077dd07e3d4e751330e2e19f4910f902715be3e0f3a24cce76b1d69e4943c4ad99747299b34f2a53e08cf940ae1fc802cd507400aab57e34c4591ab8441f911f49eefa80bae87843bf30cfe3ceea37ce738f409c729048443ffc1e34cf1a8799ca95038532d92320ade014406bd6b713fbffd3853342f9f993f5866d7a1e4064b48220c19fb0ed8be135ec0891cec6fe18a7480b58009689aa0646cb822c31c9db71d3c67bc94c2d6031788b08716ef09ee6823cf39e78c2ccd9ffebd62438b0f72a586cffe9f3dd4028ad80a9004a982083632a30c7568717e8739720e39da244dda118e200213b29c5a6f51e8a4ed3c8fd25e71fd7da43ddd93a195ee4210a84075dd89a2286b8c0092e7dbd041479fb656cd8f26b6a604799436ddaac6082379943795fa040000a6470ab1885198ba3c3d0c3f15e1bd8fceeb3aaff33e6cc7769ed779dce73dd779dd73f45ff07087398c377777af2f9d6216d8752280b427f556d2cd4f80cc5e8b93a3b9eedfa1c275f01310fe0290a7eefddf4fa06fef4ebd002e1e777fea2e04f7dcec3c58039eb78010329eef30053c6327a4de7b1e0ff6bc0f21643c2111cf6f9e9f5a2502fe07864574efc3f3baeebdce47f7e0fbf83cef03fc3cfeb9e772be6d0d4827a9b8397610803c7d4ffffdf479fa220b36e858001759a24fe9d319ba898536cdf7bed364f805ccac693f7a2f01cf44be0f53e07aef9ef75c0cbe27d47efe46e47ee7e6c85bf879f01316f1bde7f3f8f8a4e77d7cff791fe07d1f1ff0df4f3794526a6fa345f99a27e924c9e7ecee04482bbce89ace1ebc44a764326589be0e3350651e3453a924d3af39686e43bed09653877ca13c38e181f093fcc107fa109030b04c17da431b12c633fdaf92854e4a4775a6340e3421f1a039d4a29673e70b2d5ef9a23deda6276a52bbb93a786072c79bb54fa97cd0fe0708481876982e4818fb9a48d3aea66978c6c87698305c91e7e7c47a6a43c8f3474984ac6d73aac8e0d6a7dacfd5105ca716b1bd0f6dd3b4e7ecfbd8ecd679cbbded74fc393ba5f5523b95f343dbddfde5d7dedd7313827685816c0a456e8a14d9de9f7bedb9cdb76eabdb7b5b751d6d9b64cdabd770fbeec3c1c36df3cd6de46813d5c35cb5d84a24172829cef9a760142c25578439b3de95732665920b7310896438de2be773610ef6436a91fb1a762c6c9b16fda96c868e6fe8a4e7c89727d755bd366d38f4d5d548980f8984f180efe9f0087a42cafa64a62ce9d15611fcd9f32f66e6b83087cbb9a2173d27cb3cc74fd4e5e288705d6d82f92914ce09f3e9036db5388bb448599e4359394f664eba499eaf82824b59b4086d110925e953287c922ff11b9f4a92b4e8dfb93f19a9903cbf3d47be4c1fb476b5e9087db5c9f3817b6f93a44d281324cce7f90f8f9ef00b3f057023f7eee270e7cded09f6d791cf9547e7d173be903033cf7730e689cabc849301fa832291274ae6272a852ccd9f62cef2ac82e650970aaebba86c7eedd1a6d15d5946970859e599c97d4c73ae361dd15c89c75a9c5e459e9ee4499fe67b4e9bb67f92882527274fd90e73f224114ba83d25f3dbc6c75eb991398f4c2078be44d9c764ab1e92a44dd2c96faf719cf63bc0ac85d539ee67e6421ffcb9700299b3e944e2cdab6f3e7da25aa49c02b8d79cd35cf3ea79e118830ef2c5bfb9ef6601d316e70c2353c7f239dc5916e6ece76c3a993913861738cffb98e6f0f61fce816f6851aa90b7cdeb7efefce99953040a477b45cf85e3cb09c3fd8eec8108bbc812f757ee20732f03731fc30099fb140270df2b3fc5f8094e2e06f6f0b7c87d0ae62a97c32b49be70e128442bf432bb06426f012164429f2314869ec35a18c28ec70aa0b27f8c7358c3282f3f064819143cce16e4f99bd56490f1a7f8a5ac295007000c4a679e3479d3e44f940572e06ec8a384c99a18b27c1b5206f48056bc9ecffbb89f0b7a1e9cef09455c5c26927e5f484339e99cd46b71865a1c6ff6df6ebaf0a28b2ebce8a28b2ebc78c213b678e5fa5d7b64f7205f2a8e99e9cba6b23df2635a8654cef68c17c8f274a5489a402f7f07794279617c71a191e2317cb2769e84f9f8cbef3e3c2d9ef983bb255fea7fd833a5d4dd41f01d047d89df4c58cba64dfdfc38abc8dc8703f8143693b4c9e66947bb4e426b2161b8dea34f28f7c38dc256520f08e441c9913092a6dae4f9fe781feeec5802367b5e067236f51441c248e03a161206bf12c673c1effed37dc0e762703dded8b22fb8f0781110227b9e8855d1adb15b63b768cafc667098cb6cbcf879e91d9e4fc4aac0c11452cc3a514ab772b73cbbc7037e3878de6df0783c9e3d3c7b00b10eaab907d67df73fa18af6200db4390ce6de851fd80dc799845cbfdd434d821eb6fcd48397eabb5216cbeec334c7f0dc1db6a229d7b744acbbcab7895dd26119baf7a75307f20507d20528c0a76df250f0c441220359fe3c48f3d4010ea40b497a8908890cfa480d2e1de7bae384f9963373726eb754527063577498c3e44bfd199ee7d48574a9fe9022b91a7125a40bf53dd855f2c57b094e90cc4496ea7bca87f8a23d1f8e9abfb06572c23cd6269a6b8cf6f8272227dd6ad29c121aa7823f36930c86a00f07f05d4697481bc0903e68631eb67a74234f478b1602b3882172fdfa75aae44bfd98f660cfddd6b63d2306021c1883b93fbfaae409e5ab95309f9f29a8dc6978ca74a523b5fec0bd4aafcdbedbbf4bdcb1e4caf64bae2396a341e9863b52ba22cf522ccf9ad24c9ea30a57e4a9422c4f2aae689d46385e620d41d2e4199b71c40cd78c579edff292305f6e81e5efc79624dc8fa4d88cd40cd58c559e2945e4f9dc4bc270797e0a4ac2a0c07c7e4c99c9738b128e2cd99f2f4b4b902792aae4846c4baa15507984e3a7124e29d62692aa3404692205a9a3128e9f546024559b54624d0a224d2a4390a22de1681fd32b449454f97bfb28b8468e97ac0acc4fa4192fc5da54830ba9320458ae1b187df0687e38b67cc31a33f9627f45033704bb6f2b2b8f251c92ca85991848d17e0927975c2d70916d0b39d956554752f969e5ea224a31b0ac15a8aa72bd619d912f355cb1a1fef7328f3fd456aeff7d8f0b621e3b661036134119c1296cfe40335606f41d08f77002fc464dba34c3ce1be17c328c9ab468b358694129a74d384dda04befdd2acf4fd7cfb2a5950eb1d691a70355d1279f4a8c8f63bcf73779ffe9d7bb8dacd2ea41cf6beb63af6b927a4e9aab8d64b69ba41648fda1a7d08db9230dcf398b9fbabeab77f83a846952cba1694c8f6c7102c5b169864fb2349c5028e7cb125952cb2fd894b38f2c57e7b610b33985cee79cc91f542daea274ad9da4e5843255fec8f239c6c4b38d97e01525cb768abecbf49a90179ea843f74c94da366c49c2f65e74922f71d2f84802cf93bca51201877bc71439fac68e6a445af39dd71f679d8418716fd453f75e10dcd85379474421a5af428dc3a9b692b0acebcfc79b257279574f38059855c33704709cb34f8a9c1262e0d120694ebdf90c34f2ca8ee78e3460c7dbad2faa95ffbeb1a90d1de869ffcb591b6e51b369c838616eb2c896eda169d0129a84cbf9bb3bb9b36716f00c9f4eb17f25491c82b648d499818992ac91449a694522aca022625a53366c670cc8d16db33c3151a13dee81bc5155d17d1eedf6a8d698ddeb4486fb448e9e7823b6f8cb386312dd2bfd1226d19d94d28eacd8a0b6e7d4b6fccd0c1b5b11afbc4a6ec8ab25aceedaf610acaeba2d6efeeeeeedaed92a5d6ae9b477aabfb64086202372412b9bc5adc2ef59e066ad41a721c2ae4da55cf5abdd32bfd62f3a89673479a679d52f318e1fdf07e783fbc1fde0fef87f7c3fbe1fdf07e783fbc1fe04bd2f882cd8e1946a7baba2e75471b1bcd1d6db8ec493ddb9c5c4d8b352d72b0914bc2d5b4a871af16b56e6eb6d32571c71112b7ded7dee5e50273b1f19394d11ec452e6835d5ad503f10a11f0efd3ef34528e97b477418184e9522061b8073129a709a03d7541650d0c49b30a853bbab046d22c6b2db1d0ac6271471796cbcf01f46fe8c2f292f66368766deefc512c34fbe4512c8a3b8e5823d6a8357a62e482656dc4ca1a67f31ad9b47deee525ed391796bfc5e090ebe2f2534bcc85e5d2b2b92eb096d811b7f3c01d555679c4c468c8871bcc428ae012f0882f0b8b41997ce96fae25e6e127932f5aea8e9c0c4cc917ed8330802fb2f603c87101f6c152a673d1dea5489bfabdc585459f703d8f2ef7754717960b6bc2d043b4b236cadec24cc28cb21d6529dfdddd2790fd66fb12ff2066f73e19bcabbdf7c9e0b5a8d99769ef682bbcac07aefc5165355a6591b51f695491b5a761f344d67e6461226bcfb29230dbabacc026ee0a2e3fcdd79ec7cc2e2c09735b8a90b5ef3a5e104631daa2a11988e3c2fa3a0fdc11c4c95a45c99796a13fc4449a48da8770248c35919c2045edc750933c8a2991b50fa9248c7f68c6246b0fc29130df8fa07dd2aca52039e148878995c243c346c2f86b3f5aa9ac326d693e7af1eeb43796aec8da8fa358d6441464edc7d04c64c99751658563943d2cc5e48bf633985c54fe7e6c8965cddf5a97e7c3d1923dc4c95a87b5e7b0c6c9b2f6dccb4ffeda1ec7cc5b28ca17ed7178b62111f0c15024d2dca5488bdac7b4edc07569b9b05ad4feb6eefcd185f5820d8d994ecaf8ffc0fbc1f43c2b244e9b3a779336d17799a5d316c126aebf56843c552b24135971244c977dc9a81d91ddfda5ac5cc4e44934562b72a845779cb9e26d37b835cc41438b1ec51d2b0e6cde10a7498bfec13813dcb17a0deb0c67acf22b4e9d856ef01522447ea2c14b6e330b0cee58712a4e9b9ab449dbdee7a6bdaf6c2f33b542da5457da10ad880c3c6a68436d9229a930a66cce9e5886db9c586e9bd4b46fd165f345c39c2e6d704729e3a16532dab425dfbb36a148515ad36d91caaf4da21651a46985245fe8af882e52a44fe9f44f0bbf453abb767f1096569f2ffd696def9794c8cccb6c2f3e0ba4189b1aeb7e90baee47ad5da26fbbb81e9a654a4999be683a49ea6274a022363bb298b981f186b6bdd3771e383dc2a437602aedae6a377032d3bc582ca6830eb1584c87582cc60d318bf1936f5608b693736fdce8dc1c9f1889e2838efb3a4ab85e6b273b76d32ae7497587a4d89edc51e2cc740f1ca40026337fa6be0709d34b7e45c3914171c73923eb61866a37b846886425dc1ee6f7cc94b1df8388037ce7a5cccc945991e18a03fc26f47e9615f42d5fa67ca19acbdddd3dd47949ba778c6f8daadc53b24b81942e6305d5ece4d1dd1d0cfb1dd3eed4f6a605e1cef75a434a4ff673c2b796525e17dcf9deb7823bdf4271e753771eac6aadb55677afdae649cef3649b64a59d5aabd72bea63036fa5b5d65e51296a5ab51f90dd90704354a300dd42295e5112a6bef760f65d5dcdc6409712a3d65a434a81a8fd5c0a3a104a8a8a772710cda8b47f26e1cedae944934e20e68c09c44a051609b753595dd60c9b884e92bafb3891bd16ec783ceffdd411751da5b2012d6343adfbcc3ab9fbb1d41de4a17859ab00953394563a1d85a8a81ed42e34bf1e548e098a9bb8e3d3f9543a45c10724c3516484bcee0437a5b3d33aad1677524abf8be1f547679d32bc09a8cc8f4ec04fb54865cdaf48bf7be8ff7d32782766e44e9127bb0ed71a25f156909815d7dab8ae28cb9a202e87e2c6c8b2264809dc06413ad0515c4f963541504e8325bce0aaf8604ae186b2ac596206dec412447a043725cb9a25906062091f34f7cb99b12b230b27eead028c0ba28113b92845da07f70a69275c9b658d12345307f7cbb246890da0545e9440c5854b713b59d6a87054b210cc4a30e7ab4649eea7362f584d8bfd72af74455333cc4c693ab4d3f19e1d9ad234995dd2997d33b48ce35a9e919adcffbd3cae1966831e88faf483785094508f149a92e23d531cd57259eae5c51d698a0ca7d6d3d2ab6675ab5dfd9abd60363199b7506d8342a150a88ec9706639b97f6bb55aad560b8542a1502895cebba0506896d3a8994ebd5eafd7ebf54aa552a954ca65ad5eb55aad568bd52dd7ab2b756fb5bce52d6f79eb138a2142794dd8b49931d94cbd5eafd72b954aa5522997cd721ad5339df2d7ebf57abd52a9542a957299cb62c800e59455cd158b07fa7abd5ea9f94aa552a9d4844d9b1993517fbd5eafd72b954aa552a9192b343cfc59e1c899bd715f22588be2bf4874ef54b166abe7ebf57af54b1a23efdab037562b1e44d1e2dc99e851d746a3b33aa374e674d6e2755e5c30b3c06eafbce4a72a6eb7bb91fb6dfc546daa4d157d15b387a3f8e1f872b579c2a764e9b1f65e91487edd13eefcb669d397e577b623bba900267492348656b9692ea7f21227a44fd239559baa11ae0837c44f154897fa698468b98675463b92a59fea8c28f7ad40faf4b19971e115f2b1a9342df913eb71678f72f52c3b30dd27a81a3d38c8fd1e9884a9332572bfd7a44f9f954b186f13fdc0685e405c5f8fd693dc1f96e7e463d34e31ac898b3547f9b3f253dfb096b49ab872bf723ff9d0b06d60eccb6f0943e753594e9f3375ebd36f8691caf3d9e03c82b0b9e58bf6da942f1b063ab3db6367ad4f5d3da8dbd7d91312c6bf7e6c72addf4afa04ae60b95670e5c4d5a4952bc8ca355475521461936736981317cbb5812b3f6d375dea5fc26ad272927b7bd223779dc9dd5ab8c5ea4cfb055ad29e1e5a81b4b0d7de1b435a11892a7ca0b8542948000108480a57080923fcf844f14241a24912178444184040197c9230e287272472cdaefd00906f06319089233c18cc785ad081eea5fa5e46c4a0151303d7d5c18fce9199ce0a7ba4c5198103db14389d2d3a20ab49420a3e5a1950c5cc606609246260f02a321312d160c64bb21a31624a3b5f7e33d029864c51e466800646d8c45011eb92bca210e0d42c6b40b0c58f66e61140106b1bdc962c6b40208513f7b3ac01811260dc5114905c1523f4e07eaa0072b71ccc255c192e68215c30cb9a0f0c89c1a559d67c6085800fa86a6878f024509635469420d32c6b687290c7b731826ea5062da84c7f82ab16291872dec8fcd43d7d10076c02ce4027601337c4449ab81f3284c3814c297744a6b41fbc429e40952cc5244c4aa62408224f200c66821cbbd172ee08c2626012f0d5227d70e525fa1c068b7430683168047481475aa43504592dd25781425aa4609216a9bb833620ac45fa200c8481b04cb5154d03e9833735997e99fe9db9347d9a4cd8804bda246b903092a92ad31f412739994e0e1c91c78bcaf402c9740471327dad9a469026d3559b4610060369daf47476912914f2080e510077c4a46fc1587f378305c9fd817b65ee955b765a70678c6011327d59c381551e350d5b501d1494beb02ca3592bcd636934575dfbcb39e71452552d82b9736f7695f5dfd6f51f6bac43b9bfde743d525db09964ce9c14940be924695491a55ef2a5672d3271edfce5ae769db2d2ba792aabc57e3077d4bbaf5b3b9079741e39d7846105b97f56ce4531f7029bb82e0983929b7ed7245deaef0a6bb17b065dc9a1bd165a60cad4b0be10329c1451c834dc3277847b71aed9f53c722e1559f5412749630152d93ef89d7b5deaf6fb0ca3dc79f7eebbd16b95ef7d4c733305955740e5cebd0ecb4c3b5f18d772ac164b455ab4cf6a955425212dda9752cad2ab45cb795f1877fbc2b85a09a7c4449e463fae3093ed0a4364fb297191ed8fb6b050b8a330b20d5b3690ed7b985cedb58fb964c9bebd313f955825562c5b708a6cbf059584e9bcbd2a0d8986af65d92fb1da54c47e4b966bad25ae8683e5fac9b55443a150280402815754963ca9c0bc1e215d5e5f1c179bb8a8c4cd1476410c95a21900000000b314000028140c8844a391581c8f035d991f14800d7ea23a745a9d8ac31cca611443c8106308000000006000464646a2008e230e90ce6020521e1d441c93c903feaad4344104290cef06c190a646f319881fd14c2dc2e9caa4b93db06fae30edab91a898486329efdec880476fe1125c0087021f9dc874e9e6f8ab7ae148bcdd9c8c6b18dc06c4b898744767b21ab7def8dc6e6bf3618889e137e17dcf78fd55e8179e05ab6fdb249a4a5cfa3eadb4e130697f00e3c4473339f8fc7f9312a3da34539a40a112c4375360dff72369a28b69db7e4bf814423b5479409f066dfb9752506029770c63270d95336882337a18bff87cca26838d4a841a4fadb7cf76b1f748aaf220e060ceea770735d64cc904850d1481f4f93765786a993125ca9d5b1776a6a31f4a1f31a6370ee79a50269377a6a5d8fbc89d2e08a3e5f238accca0d4cf074741c58a433f05082c90f2f2e50b32b9b511799f650549acc4f710de5c247c904d6ef30e6f47575b20476ba5240ff82c1445a83ba451a47931a94978a757107bb3a56addcdf61d7e0182010dd010d2b3f4f463850cd24a5c4a66284e3843d17808109cac53a9efb6333528f499fde171936494727be68cb41539f76b5b1b70108daa7b8d9d93a3b9c4a04a12393b4ededdd73a898aaf5b264067a8710a36f33e33806a5f385fc4464c97d02440b60ce6091dd05bbaed214cc364665351e4ceeda7efa411e5aeab06661826c1fa1c205e428518580b60527d451ec8427692f330eaaf03fce2099824d559caadb8f3e03895f27a30441f869b970880dc6ef3afa37a7fce7417a1132f866602b06327079b91f84fd9a7bdd6e26f382acbe7ca588917a986047d7ae81494d358e39c4ab84eabbbd27f8cfd516dc7aeba0322c409d1192dd59d54b1d2a70ea22ca2fbfc40eb853d38c91d12604a66d5ab0e527efdf9462ab44a1f74c9fa3f4ebee12ee8be985e4dc1beaec038c93a8098e8855d64b76d194a81189d4ab90a4ecf97ec1584b9765c677b4f940cdcd79416801f509680f1ad0112c050331567f6d49128b7c1295f8bca227946a0916b9453d0f14071a323fca47b936deb7db13418b902e804f2aadc9c63b4a02ca3107d738daab30586d21e7238d929c8f1cf2db205d2d4d30ffd60658262223c35046679887f49a0ed565b708a100c1936d75ef27940e097981fe5a51a037b8cbb2c4a89713f0685f583ac79fa824d70a00eb604e448cf8cffdda095c4c65f237648162809504cc43212068617975a88fc4a449be0f44898acce7f9580fa472fb7152b7b3318005965c87c4098009c2c57f08dfd02dd6ed7aec128a425f040b00a0615f5f9328989017de7675b99e07977fc12c4240971f90af7c54ae228cb0f0f7eb516442ad8fed156d5fda77164b5e7cfb55d1058602f4e111f365a72d7abc78b19c1489f1992e8bd2d87aa739cc5b0a573f9aaa3849fdaf465ee455e7c6247c1270dff67c57295958f4ec227b822de5ffa531c8a8d336cd93f6e745a23274bc6e00f20823fd192e334c4930da59ca17d3ab3b93a772d59c1a36a700f568854d83378c3d4b24336ac446eb3fe43a7575ae5a8e5e53b8abf3181548245d5240949c9559f36afd0c8c0b6e9e706e23fd99833453b6222a98b1d40d3a79a02d52830d804d11963cc148f20b46419506ff4b80c963c2d2fcb490734b2eb0b5a8d632245d02d11a033855593b4c2112c3302b5b53ef9d610ebd5b4d1792f096cb3e29c4ec5b9d447a0d225b793e88e6f54533843dff004cc0a2e7a0f280bffd0e4fd1688c419e632c64a87f636bddef489aac92439d3abf3a72d60c5d384817ea119341441f6ab11915af458a693a8a5cd0ff08302e786f7700283de518bee06c819faadf450d93839f2b3bbd45202263414d795757195afe0d82d66497f2f3ae801d90922722fa17534b6789424a31278e89e6a566c44cc3ebf8a7a1b70b9117606449f416b1dbcc6a1231a347ec8667b7630352160f5657aec34028a22b54eb20d3aed0efa515c24003b6f47509d123c42423f6a28cff1c3672ec83429fdc6b00bf6355558f1bc48c482456f69f22a29c88e26b9f3f11aa722b4283b5c06f605b076ff80b937f6c7190c460a6c4403101f552eac0e310f251b1e49bb0b70f1492093c739e0bc7163112440422f70eed93aa429e7b32b0b334c244cf3dc791d3df4c170bcbc029144b9222f38db9a1edaa9508713de03b4ad9a72701125722656a290a57260cbc19a4caf3e7321d8fa078061ff5cbc32ddae6cbbf69a01f224d6daf02e504ed9c5622572a547a39791a72142805e68ad2af350c2a8288681af8e7e5e74276ba6f344db09b99dd0eb8b046f938d3ddf9da64b3770cdabeaa8d4c3c6434047eefe5323711ca184a14e29e26a82a8957d6dfe0292fe0c0cb65a9d815e1f729c1aee13a6e7d019641073b3a62531f923cd31d456fe33fd8a8ae7a1829222a624006af15e837873abc8fb4186f85de4d48533ae0fa508012814448d0ec819fcc734d6240d03739a43df2082e81c22226a462f007c89092127c0c4163084e654330d4a500830042a0bf827d1edf30c3a95e32d0d8ee9e46a84a143472f509cbcd8028a41ee44951c8a61a40e82a5f746eb43c529388f71b869a4fa55825228814adb09b87d82388a87b06944ea1abdc91e75c441bc9041ffa6c43f6898401a595a64f662b67960f8e12b29a606ecd695875f19124eb691aff3cd7a1a98925116813185a5341944e1054af1302607731fbff6dab30c4a491a5b377557d09ce368d2c04d3a2451eb4c55158630f42d241b11e7b06112905b3a98c6067da399630fbcc7f779019dc5d027f111456e53c17660ece88e8d48a8cd7e42f4839141638f88812ad00a94099467ed7bb5683898886b8b1dd06f68abfd2ee7e4ae6b7204a08ab116703c7792737d6805050081c5f64ac125624d63c1695eb98a9c0c524dad006349830998bc3592151c852555528b26b53e02cc5fc48248c875dc9687317f9347104521d02100fc24c524fbdfe889354ef01aa51f4aa544a5289546f143ed7433c05da5e885715ba953ac10f18693a71877993c26ce9d7000ce4e99e87c8dbed825d694286269c62194c373db7e88460af1555d6071cbb9a90813f76131a622097ac9800c070b6f0808424ec0c5bc8864477ce162c4c8d5389d9597f8739542d00e7ab30777813c96bbb3f093bc4dc3f1745d1b81a421c7a5c55d407872f8ca9d4f8d902e6c2ddc25269973e38dd40fb5d3cc829b8da41fa5511225aa9cdbcbed1983e9c4b6bfd9dfcb2086178ab038a5432877a8c9211942a112f99d41b85b066cc39f7cf9344b4fe83c6c0d8fbd7d000b9b34fc78c27c4e4674dee4ef4d2bd20460a9707dc7f92963880024b1022f1fe965ee6bc7b816156a45b769e1bcfa182f3e80c66db3b92463da73eeb1252e882da7813f715d19a9eeb6a8cc4eafb0a38ab40313c3f62330275f8e4e1f945229982045769f417a12a5661bc4814c00d655f88a5aa5fa9c5778fbf7ce0e863b98f53500bb925238af8be885f809e71d7c0c1d9872d02d3c7072394dedc4adac939f957e8327f2b9531ef230c1c261e43f45926390c8fe5818321ee30bfc1827006744eafcd46f929f6e6385709a4956934737030036e51988884c0ffe1e0d0a8a502bc109d01444c0967da791c5649aa9baaec639c2994d0e0dbda74ea8c64264415057458b0cc9c5a8b51ee5c134172f17a1fe56b24e1895f12122c0bf6661c864f7c0d84d985a6c280f38b7efb6d3b87acb4e513449ed4434344c67b236d184480bdd122481a2c81915389d6314282eb2a59a0e24d0b11d52a05e1ac45eb5d83b551467a51774137a430a46e4bfd4266832f9961218e02a2d120a11b040928126e82826bfe69eaa02b61fef94270e8524aa66a39738e5108c92c327ae188250fe1f1cad5a49c60b0ba61d465c100cf44eacc187a740ce7ed9481753b1a1a653e6cc6de1bdcb5502e48db947479b7dcc85c17f02bbbca4c69b59bf4e3b9341e0f0752880951c1827cd66195e9fb72c978eb5f2e24b05eb9c6efb313551f23d5b4d382c396e33514e023973380fe00ddfa0c91510038a1e0321e0c3efbe9a59b72099d0890397b27f1dce72416586e1171f697b6a8b9aaaa0f0c3cfe0a7acd95b75feb4a81b74fde2fef17b0acd7c92a5d7ac6fd4626bd70d01677cee8c2258e408dd038225ea477c163d2dbf5abbd9264b7e0a51b1570de4e376d2b26c2167cf2321494b9b4da83a65b9facf032283fefe8085df5a19f686ef8af4ac04d08d667515f10cee084bd7a9ae9fa44a581318f18de98bf123eebecef3935bac1bf57eb3b3407ebae625b392f798bfbe361511f671c735c1355b0b690e65744e98d7455954f7c976bc2a998b25c426b4c7f6751bff1fadd42545452e60d5af31d961e6ec9195c429cf7557cceaec3baf028ccf36778d97f06ae447649bfa3087631e4ead15ae67b4e322619135caa87b84fe37014852952f98818c2e0779091dea0dc8646dc249fdc36adc66931b05ed02254743e8015c7972f30fbf2ed4ab972561b67938f8b2d8a170497169d3baf8fa18bbae56b105522c207a7720f0dd38bf3f05e6e8bde71b40bbb66a0e704a7e81925dec0b2f3f84a34e1110b3cdd0199c63788e229315651bb419ce7b47b95612cb3b2e3b4507873aefeeb4e880a16111c12e69b4d0b45aeb415fdba13c30bfc937550ac00ba59ded28d8ddbda3e66dc60667706ef7af59c3987d9d28ce174d7bf694baa8a85306c69f908694d6a17ccb25ba56065a46f161658dbacaa43cc40b2888cb840b1c1a9a4c8177b6ac57ba6e1a58dd589828e9e99a344ca7037586abb98e4e3259fe612d8ed4beae3846c589fee0414b6461b7d332f193dc8860bf9962ec2d7f7431ab7a031d6dd649602a516f5da061c71ea15a89e23aa1b8465b10d575863a8ab22cd23564e07c5c41b846a3e1bc898272e134528fa491053fe1d538bc7c1c250f79c45a11e30a42b8b6ad88754d438e88b59451ddf227c62454ca9addf1fb27c6e7054351729423626572267d49285d2f6b115ce38839aad3b35255be4b197c99fe30908bdab84815ec980fa8cabd786fe9c00f9dcc5dbcacb49195aad6fecdeaa2ea16bfda62f20e6a0a9aea463adee5f3ac49d874c3d9effdfe5c44b56f0f3bfb1586730f99ec661baeb7d8d330bca494e396ad5bb982357d0ffd2e38bae872d13844230dad4057eecbe9dead92a6538ef391ad8359a3d457852521e8f71bf1b8a8f1e311ae5b75a871db94f3c9731e08d18a37323e8208e0cc5558e0c31cb11256a021666f728daf56e30a4e6b8404ff6656806f39a1f0cfb175d031d61f9945490e3e6305b2a649a551789e2602251e11935bb6f2079ce1afbc8bd36dc58982d4a6a403bd5c6fe37f89ce19a220c98e83c0795c6a2fa1abb386250935c0c9e9f7059e274f14dc88426ed0ceee526fd2c001cf225b341b5470e4add53c10b64710dd36154293034693d582a26a5bef609ab43c73249126e98253e9d68d3c0259946dca76d06722582a8950bb2b45daddacf44862482c05ce45050eed91172038488aa9089a3a0d7f72c3e8e02ecab4ad6a50ec9a48a8269ffa90e187f2cfd600e8baf272d8a49a27b211f8ca31168901aedf9af40f7defc54a5f4aeab6e9508071e3624050d016ad6528c1e36d38ab2bd3dc4a0c81d9bb16411c62625fb78bc25d0398c7aa9bd83582fd2846adea736077a31844d283c25ba703d94c95d9ad08a8b5873540dbd1597aae301c846cc4f48087e3d6923a60e8f2a68e129a3dd4e23318fc58104f260176b1c970d8d62a4932d8de76c7dbf09f146ef382a8572e0df2d586869a29d39ef8538a0d529b4b6856c59e80f64c0f8d6ffe981e950927313fa2f799052d8ee7c8485f4683d00e8dac7cc93a0b020ac1cf3cfef3b04ace0ae434bbaa5023d8c2718dc7b54c25060325dc2664d07b9f4ac23e06d234a4e99db4be8b420dc1cadf969a7b9910befd36e957a1be84fc30858500fd9d933584a82a0f91a2284b78001cb8c0f7364fe1775766029ed08b6e5c49389b5663e79a96479f3b2ccb53f3242850202e3ff0bbd7b7e02dbf672167bbbf62ffbc3f9b6acdc75abd7084167cb2ee581fc9553b5cadd91e0ffed827e9ad0b8755d1caa0e11b7f1d069b6c9a96af168cd7d2051c03e4df00444f96151b1eae20450d3e9cae26add55672ce0ba12e6d2714787d951cab24422210148daa88e491bb6abb1bc04d728404e26c790f24a9e137193c975d4328f81abe3718a2f17da21b108195c3e3906c28cba8e4bb3674639074746f0bcd7d65342eaa0db1bce5c6ed6e24a75b4ef4971b7d857e02f30b6cef97468b86887489fc21290a5f4a998435a6ade4c7a19c77d058c3d4cbbb9d0edcff524f783617291acd6d516fb5def11f5c62d62508d3614dbcd3d7fe4eba3b78041b0142198a1c1231f67139477a23feae85468a60255ee1d618dcc5c6999094b5d44c3521d86bd9ac5070e09ee24be58c7ade5fa667902382dc19dc401fdbcb2b05f3aade384838f5b962226af4c4524a886cf6b4ba04475e5de13685ca35cf8287f98145d5acc4ff290ab64d7295fabef27843a91e2868abe8c1d02d9053f14c42442319fcc7395a082b8b5f58b950b1483b2e221e1a39956fe1d87757ae5bdd65cd4ca5963b36770e78ce001f2f00842767f562d158d00fc7e240a649c4e134c389d609884c97a7b74493cdb272ac9d6c2abf464d479ab8caa1f487d27f686d1de0d55de6751b0ec59cf47df6e07ab0d8fb6bc958360b80e885e523c6a4a4c11993b8456c67e41e2180f6e7cb3bda9bfe1aa2d3baed49edd1e00c146ec8e43eb266cd0148f65d01fa833d8c40b5dc3ee751e722aea563fa9a7b852708b4a0e6be0ecdef6d82dc71dfee344a19b892d2cda8038d3861b29259ed6d7aa03b3c05902c3f10de60439c2142c80615fc5593b0134a06a0d3cdcdf2fed9b2885579aa12760ce58f24243c1825062600685a262e48b5c19156ec82378cd2eba9c8bca64397b5fac263ae24ca60cddf5c7b4521c353ac0d69efc9835b4b47296fb592a0b94449ac6c3f495a560a1b830c4b9fad6690b856d859e613b22a708359d58b5703ea2a2cf58997e86bdf703ef434c3ea71ad111a41600b339f8a4751f1a16e7d5085e80a448dddeb3b62fbcd9d00bf1671c7a408c7a3aadbb1bf169b54bc0f6008b088c92ce58f346992c00827d9436fae1f61906f2c8e54cb076a1ce1766f5382a8127a621a6acb888972d316ecc3dde466f64fe93fe1aa9fafe35eab6d8ecf47720124627f37788e31e858b3f173224e720a6daee8f98a70bac8ba30f734bc7b1a444af0ab5f513ee14395535cb5215338e8999d68068cfac4fbd55496048c8eeffdfe19d687eddf53aa1ebab027971ee86b5c018ac5058449d90178c0a05722497321b2cc23d5bd238fb5dd0187813218ebf5cc5671d5f90f6318a61996f456246741a9f9096995c562835bd24a8da832bce38b7807ca0fbcce10cc481114714b28a228152587dc77011abf1289f4513e92428a4c74ef8c33b0ffd86f42016f9ec21eeb56c0ce6d6682c16ab57422fb92e9f08e5b687160d95002b790983c59ce506b9109505c7addb8e66c6f98f8b3cd3021bb12a6a33a03236d18dee2294c79497ee576dc1d1809b3c0229590309c33c59c2157511744a015918e9bac307fcd09f66e298fdca410f6987a3813fed3ee3b0e12886e86f647e06530a737a4dd40ef3014cd80ed6024a55bd54ebf4682ace04d87c3bbc1c86495744431bfe85da491b40f7aa63f6923e5c398f085a2661d533b520549639c35a9744428972e57b822c3c7b05c734b7dbf078d6971121a91b4fbfabf5d99ebcc7ba455526b61874c4a58e0a750dbe57a05366d0a0dd0980c9727bb475b020bb39224e66f58560b7fb2b79bfce3afcd9a358c93e31f01dbbc8844c8a0c32ae97a879ecef5b8d62b3bff266b2d2fe2c44384e0edbc1fc57a3aded5d1de12ed7363157af34b332b531e9c22a9bedc3ebc52f870af45e999f588e207db08f3bb12fdabb210fc6162658649845d8b7173dab6b41c4d050514c8443d1a239284ca53c8be57a1f23e6ae66c20a2c262a0fa38e5edece3c8b4d1918920b40f39d02615752c8051a378437c12be4257018fc9c1a6edc63fc6cc73f00ebdc416f8c2b9d4eb552412b658923286f37c422153fc121de577d20789225b6a1689ef2b677d6284213ae1d0ecff991552a68c484e6c9ba7cb80193f8ce8ae6b9c7dd5cc8195287a311e2931c17f535ff247cdf3a012ff9919003148454af80186e5aa791917053d363c83f83db6d73ed23047daff3b01d6532c38c26919aa7df85c40bc6bf03c0e9c769e6ba9c4c5d4196e2697181653861a204f076b5e2a465b52c41d131c8d5d48183bc61dd0ade2d51d272f8536146d1a381b5ca665622a4be173793d3d716162489b507bd5a200bbb8182e2937bf1517d4d3c5e8056db3e40585e71d19a6ee0d5b5d40649c0f0ac107559d5f0a75ffff2fa410738e86a8f24118f0a81cd73e95f84989854bd8c1bbf090ad77946885423352ce235c6254ef03a6865d6587f45c6ca746da201a7a5394fdc35c13bedc33bad1c1adc20af3b2dc49f24d848ca47599f332ee470fc87ca261f3c065a669b77c9db2a6147ece1ea2c7fd45d6eecea5a238711bf907b1d4c59ad480fda2080b91f85950a88b6c8cc3fd78e4a4aadf1e8047c40f4c60e12ee71ef040299e7c1238c185a23cb4d33d36dbf769da539225bff3406d52f63c28efec221f2a24f68950aa046f88b27795c52f68a5b7617d4c922f9ba467be435caad5dac023742d8090003e5b34dc13949d31f1224e95978a412757cd8c62d2acb78181cdad58a69a8395f18a30d80337d259bbbd3cbca6b35233360b7af55acbba99afbb1e422a8ab277d78f99cd1238804506b27811eab3f54dabc40d120bc934278c76ea5dbb9f857ea473c897413d8d06031c1792c10f80965898198d42019b8ba9363c1709e6e46c2c971f99bf37f890381c2dda2a2a3084bc1548dfdb10f19434896fb4687e7823eb78e73a7b0dbd064bd86ed6001f7fc4b592026460dc54ec27a262d581668e1e6bc4f61ea0d633fa7d5b18388645ef179078fcf5fc626058295c7389754d0330cde02af825d604420f5ac8ca70cc9ee37d129f72cac7a6de9928e281aefd075a3b05fb24d34d4daaae49d49b5b0907f4c989f1f9f35d547e7fb80108bd272c84e1cc4ba05a4f36bd5c8e761457cfc9919df30f07fc33e3e97a67080f17c3ed7791f72ad96dc27dbbab85d8645794e5cbcedaf66fe57045d2c11ae768939f1db9c93f6c762a69e9fa445a86da198a1504bd555bf9e929b88b33079dd4d1f78189eca1cf9895f84d4384af44b088ae6b30bc1229227918846ea86f6faf06aa55d5c1c0bf4972f9152b256f039c64046a9802f4fa6791453cade72c5f04fb960ccff958955c9a2b212b41027462998efb9cd58c1db31aa2b35c801d89a871f43a5ca64a182b168a19870586f650c97d947e62024d9692df0b0d08278e87b6a2e56608f7e5f241b27ef0ff7f29b3e620fe8b7432abfef3ab7d39e90eacfb8340a483da27a772daff7e802cf7eb8e836b49b7cef93fa4ad19d7d6a80cd2a955d5059926c4b6ca7c9a8a40d0dfa3f3f6f96cfefd9445941ad75184aa15f0c83b441a916bbf10725d5ff8f7d7a1793787bea983c4bdd87f6975b0d29453e71c581a3fbe367f47cd3ef1dadea01117b5cffd0409abf01bdb50b320eaab51e812367fa7ad4c9d36eb3d081c613f115cdaf9161b63b6ad745b23365db5d7db4f351ee948991ab88fe7b5be007f014d3887d24f26360cd2efb526adc5f93e39f2b38430e71badf8d03ba4bbf455e780300fe59b48b300124ddcda6af5607baa5c41d305c5d10a8311ed83790a21d77a04422fa4506408c9c39dd5df6cd20fbeed885b995c05e37d720c013a0c045bdab2367d18749d876575218a56bd4f25a0344f367a9ab3a2f6bfce068486be507da59448be9ad1d96c84656062f0c10865ab5c8963d67d485251142448003bdb1ad945b0522b4a94325087e26e2ac2fc9b040b5fdf088938d7cb7a10e8cb218a66a1a60a2ceb0229f26147e97fd5260ddbc14a408665f19f9204a1e2cf1391726ecd19a9d201e623a371dad33a8a8cf4708b4965a6858dd115c37d9742caf80df68dab0a696024967a0f87e6f0450f54cdaa43327453b0404ac6ec0f37e35fb9ed195e3f56da36aab131b1c5208325816f8a80056f33b4be158030f897b2d58915f152fd651eac9683cd8f009724df13237ef13b8e82691bb7adfd30107cbc610a9413e59f985020cd6e5da27768d17a9d2e1b43a9a8fae41cfee410541a6d05caa5c2974e246978a6d686019906c1827cb404bc5605ef1c6b5cf3a231424d1c0154e1f51eed506608dc4e2d889b912a06abd97c07e0c1de5185b26b389e18af081d137dc2387f933e52c23ed933e51dcbd0cc0e4ebe0ab1b47a051f5838fab25d122077f2697f77991b0d60eaa0cd6cd3ae0b04d9989ee89a1bb1d98b6c803224fc21a01e9e582ebc509fccd1299b131938623311965f3daaa159b188bc1537497b1468bd9ce74eddc7c94d286473781a43deca05ec5c7b0e7453aec7d114d2e01746870a3616c56d3968b676b5ebb01aac684e30c7815d726aa0e5cbbafc3de7e40ee6d27c6493e0bf5b7936ab606cb6869fc307b74aa950eb5664cfbad2f66f7fcbc79844b85f360ef66a10bd21526cdef17e2d172cf4d1d1afb3e984b95b63db7e9b44f52f8822a15ee3a693d4e5ef304855f04e1731bf11bd1a30b7c106e11af65524e8b246c9a0e7cc680b97b8fd2618ea63e218bc597d114c041d244c1d753ed8f35204f5668a35f7b48da16ceb5423ec72138c6d421a1cd2837d62a08a0950017198111e7b5d29d1d4cca4f325b719453c9e0d545c5d7eb1f87a0ce303b883922722bb75125f714570b0377bd11c2db27df21182cd04151fbf7597b9f373c17b2b745fe3b0013d1c73c2ebc139ff6d8f1c09a8798e1c57687395454fffa46cbc3509e5d874b7b2cae3dbe5f7426510c60c1cb09ecf1fcb438baa535d0c29521d80d2265ece2bbc61b1bba0d46a95ce6a16bd0ecc17626d7416f531ecbae816311257b18c83877da3a774d29fca11eaad8733b9925145b0fcf44f489d2c4d7e18347972884fe1ad6bdca69205490dc9474d77fb287a4feafd1c5562e3679c2a8f8df537557188a13b55ef2739558aaf66a4921206a355bb5a7a484c1cccce531426db314bfd0f6f76df1328d46af63af546cca640554d0cd888b2c686e15333df5b9b34ff69f0bd8377ab64deb26e39ba62b4ccba07b29c295adb4ff1c09f534886f994541ea0564b48aa4abdf142ea5cf2301f231cc55bcab621bb3454bd9bb54f7fadb5049ba678de3a17f5dd7bf575c6cd2f1b83bba569f289d678a20fbd3963b7bf9ec7f8840cffcedc136c9272075027d0aeffcdce4ad52707680e31d594aedd1dd8f215075879289ba2a5c5b11a07062a65531ac05f9598f3248bc81b9214380cb2c1a9fde6f8e1454dd73e06c2fb4fdc6f6b9c3db26192bb794d3bc9446f26ae01702ce8fd518b2bce03c0fa2ace70a659cd12f8c76e7eeb8bf13c14cb39cad95e0053b06dd06e6aaf44185a307294f5f29e6de5dd3dfcd6f8020a4ec637f1f5661102bb9d58925e01e3b819b6fcff59ec242c35b28d777f21643a2be1d0f6a7e9b6a3253fd2d12d86c4b1c8c672d981629bf3f994aaaa9e8162014ad1fa486efcc599c199a4c32385f37cd008abaf06e08548141f84fd34d9fc746b36da67e5fe7cfb6748eccd60413fe72cffcd313252cafbe9e152f5e06fe15edff3150a09ebfd41f7d6ed53091a5b8daed35a477b4b9fdaf9f8e33810849e9840a7356a434c8714b3e5e9eaaa5c862e16b8a3020a01dcb005531e6545042e55347fa7c6ba89e650c4540057c76b44b52ceaa5e9b8f9c01110ac5143a967936e43bc31dbea1992147d47bc14ead730422778c327667408d88dfe716270b297a65fa0d20289d851657bf20f0e950293e26e63592d65040ed5d25c4a6419c1c1e047c192e470d0f5374dc7a466c53ce2108e35cc2d4a76dfa0f58934be86e6ac1cadac65428d7e00820bec1580f747955cd4128a461f63c101636a5fb90ffcd2e84b7fa8b6db2ed847ab07f38b69c79042db78a9fb748a1f468c421f3767dc6dc2e24761eb54c465d6f61b03153584adda01a4410b4271d195ba95ca308490747a8af3f0b65a140ee4c680b55313c4da4614142c3972774e3e9a2ee7a7454346283c99a9bdc462830f089d24a06fb0ec2bb682673b790503ad55c1f8567af4644a90ab8c7c01c2331886dc8e855f447846dc2a42dc0af90b4ce32e34dc58b46548738143196c9ea1989bd41eb871a6a3f6f0acf5c20e5429d4a21d78148e4ed797b4087b5ae5aa95cf984a441849db6a202c5c44b4d867d4a34ae786a04cceb87eedf57fecf008ae9b7e2a6cf0711a21dcb7dceca51f825b41d357d53e77a9e82cf00b1f8f09adc5a7a1fcda6ab059a36e5016f2f2c0838f7d5feaeafa0070e1370edc97dacf6d37388e5db6352d6a674c6f986c2a2776c921ef7f0cf0e361c467c99343491d2987289ae3aac6592d357ba3960863b2b8e4214dc83d4a90708a5b522e4bf62c32ea51f58c0779151059281a736c223c82bf14034c96b06b186cbb7c0774d74aab4e701fe5ed3738a7566013ad07f2ee2b71a80c7ce611629120b52534137817c816f8c862e11dcbf2a636732b972db591eed4d48e65f9cb80627cdbce9a74996db5c0d1fca86cb514f04392a2d06f239a131fcb7289e894e0f63e9f2a35935f66356711a4af9a62b7cd6dae2341e2906454c944ea6c94eadd16c1b38e8c0b81278661163896908792b4b8e4732a7c375c67c92769c2704f9c3106f4a31b16f3a49045057bf4f9c6d7cbc313c0449f13df05d0ffc33a62d7544df4b085859570cdc488803bd6cbe4ab705025fb15a3cfabd1d3317c18ecd7bb30819b4949bd498a688ce29fa0c554ece8772f1f0fcc62fa4e50df6b698f141b64ddfe42f3c700a50a7689ded93111f299456ddf00c0e09f8df1a038c9172821b9c8acc3bad85e609e1e1049205592fc4f349e3440925a005be4ae1383d870ab09dc360973908d895f1c17ea394088a2c8631ac73493a93d891792f6bf8dec7396ff8a2acfac5090249d1641208212f2790a4d7637d9f410d0246c2cfa798181a32d145883ba888737e70dd12000c2eec936ddc4d2162742e2f3fe0ed32bab9a4a2201c631f39c116845d366344496db8f3486ddfb61d5264e9cb15142460b52db613ba538d0c642eef8f6677438dcf6d20f5d72eb7d203ad406160fa5c1eb899a9a02c135f7c58caf8a13516dab27e3217c15a334acea9672e986fd04c1170283e03f9c4b0ecd4e574cafc02b1514b2cd979988b71e9e7d19e11f226ce9ca5d0f982feb57d980948f37feb05be71f800d87a6fc69d950a18de7caef42455ad4bd0d8de0117bf5b1d0a8db06b942324a845236b478577b47d9ddd5a6c11e7e43f1ab825d9287d36e0de1a99d8f1f5a5346067a942e9b961fcee3dded8277ac71a80dfa58216f80cfd5d04a50cf878c6cbafc1af8f954a1d304c6d5d06ecda07de0bb7c8b58d8d1a65f162a043eaa0a61ff595a225420fa04dc328375151ab45d54eae6f7ababb56723e4e272c2eae3332c4cfbe86e11ee02adce34aa903a418aa2e23c78366f283ee6c85579efb9e170c6fcbcdb81fe8fb86cfaa6900cd2145fbb77523e8f32d47a23809c701ac1eb32354c98ed48e53b2c80109cda3a35a9f0a6d249d84ff9e8a6d2aac6a77c57f2538e529da9971e895da8b6fb268065ff3b3e0fc92cafc2b886f7d9ed0f05179910fcb603aa0274df2cce2b492c1f4a1c0aa41d44ffb74c100197a9af77073f0d59cbd3d4f0805f65c5749302273a7940036d50b023debcc316f8d2d800df7402763610fc1381b618c4c8de65d8583d4ea9ea590e9d0153d44b4404a3f0ae96c14389d0d48cc428bc921a0223763e858537baabfade6a1b38c5e351043aef2cb7f9f751423b6e224d77ffd78bdd20c2b458a4f5c849fe59e4515cb530ac96b461f327ca247d5deee7987f9077d9bf9bcc0ecdafb15e7c073506e13c721e69c4b3207f4545e67e608a867acc31bc2b9c938a69bde9c9c158a343c5e30222f8def07a8d33a4e0be742c5486d315f702f2347ec200af763949c6089f87b4baaa9ea83332e44d7dc6b599625d3a652fa62d4d180e64652948be4205f4a281ff487936a8246a11699b2ae68e6ed1d253f85933240f8a7053a5d4051bbe2138d68d0eabb7338a2e0abfde78c64d75e67470825bb27551c655d87d722c342b332de28f00a37094c78b17bb1a8f0fdc7f78d9b5e7d582419a242245a974e26153cff53fde3424ff6e1056343abcde689f3b53b34536a525a2da5a76477fd9b919cfe330e561c6d92d66e66dac5231c959921d460f96dab3ffdf0a5145af066124976f5628a91fb049c7bfdadb85eb5b6422f5f146470127f1991c56b10391ff69f29edc5a861110bae08f635205ce835dbe1ce711ee01332dafe9e63f9f493b93cc910412b7b611365a00000788ce2ec126ec4d9bb7232fc00252ef25f0b9a3686fb22171c00c38f2aa7c907abc8a9a77794fa0d756499923a25ab38f90148401369f4935a8b17d96578b310db4294674d12f02facaeb053a3dcbf4eed7d0478bff6ad9dff0fe545cbbfe8e88d622a1f9ddab81f76e39bcc449d58f3aa6951e49a98b289319eb19131de88dac9b3cd1ed9ce744129e071a32b2642cce090226a3d9650fd4b815511687f7511b3156d9ca20d118f534248aa64eb7c645032685f1339deef5d7fe7463247b576caf4e4d8f6021849545b643308ba10262cc78e5b393fada3ab3fd0e5a4986f79b362c28b9e8374150ef87ff05c3a6932da5660f06670bd79aa219880a181b02b29628a59d1037d5d206036f3573efe682407ff66dac20f7e1b4c9f2981b1ded0564ca58f78bdcd8b1ea42c189b281e98dcb35517829bd034493c2d06ffa59c38ea5d7364f04bc398d31ae6ff21c3da31d47ab643168b814209e6e9f94c9c14cc5136d1c621777e4c21acf51c78c205e80d34f53d22f63790c8ce9b952cf9ae617a01502bd31a275fcfcd35dc65692b0fcc67b450b6190e5f7bf05d7551c5a2ecef26e32e73a401a2f8673cb33084d379f450f554ec58ed5415fd699ab73425095234684d46e0646280089194a896e5c3a70923c231cca511f3b58316c98f490674af4029eb82f07f57cbc85e889a363b8794e3941c172a4e1e37b494ece6c6854364fc89ab96cf38d6481ef0cea14dcf115800e48dbb755ce3af2a128f87c1b7cb9435191ee6b8809604b88b026747c362f1552e6b0f070f3184e2e7ae34326f07ca72826b2ac22a719da5058c88692b8522069c5c51e3a4e9fe54c0b0c3c18edd6b7f39b204936dd9358bf36e5d74bffd27bdcb487732695cedcc340a2edb57c17c9af639b217e9857afc2e0abf7d49efd1665c4c5f0ca7b24d730d521e81f490edd71d8731d100b4bb1b8b7b3ba25703cfd1e31fb7992fc9e792cebe7292b9731273812ab35746f65b9080fe46426b744d648700568a5df7cfb056ef323e042f3cbf60b9718cf7f1895ecac3bcf902eeadce5674c1ae72c991a1874af63d7a781a2b11c9f452b1eb2868c8bae02a54a66fc439ab74888adf1e1c6fbdbed2498b84530cd020be646c0f5c61807f1305ce3d3c143340148cb992062720f14a6882e9cb9823ca44b673818069dbf2d318cab1860c71c853a374b723fce54413cb4fcb6ed07a292550c5eba930631453bbe87c499cbd2ef9419e75a92b1b71b31eb1ba742ca7a03934e187feb064b40657b839aa5a24a38e34d82c9012a9578a5c91d4fcb3821d2582ad63e00b2cd7fa5c1ae00971984d7e5db2491df72532fd7686950010fa219ee429b9451ad89d14524751873585697753d552d3673476305584ca4e3f9124b42db1fdc561926d24b21f8b42f06be15d338e73bcde73743ee7dae52e5e8342bd710dfcfc4112937c4abb9868330836b20a8118eb10542a7c67e8f1cbe7cdf9ead8619d110bb12a1482bc82afc28bd5622c3cc7b2b9a8a0410d7b0b7d6cd9870b9e0e834e69d4d68871c1d0bd203cef68d60402f9d74db945889da956a8e774cab9fc077bb93a2f3a35f01d4694c862145f401bb6fe3d67da2531cb1b92ae7009a69873c13d8bb48b4394539ab35976f0e75c00adc2e926174640c8de713760de911442f55ec88019152e55fefd49ef26a3acb099906c945a7a6dadd85e95be029a886c8c20138f663bb1eccb458022e9866e87bc1e20b0cc4a420e8fda6f45049a77ca5be0794c635d89c191da40ca1bbab6cfb1e2e81a8dbb235def862f5bdb86d2da249f9f687668fdf7066a6c59b4f2279cbebb58579e199324f92cb5bef3eb69b33008b6d00d776431a924551451e34bbb3d5a61c64937d7b9342d2cf612f2ac39b207e3728a655a05eec22880d9f7c135ed214cc7813d763435764e0d53549f9a831122088b64fc240c94988e61911dd6c84866fd94bde36e0ab6b4811ef5b432a7e28e9ab018ae9b51564ba0451403ce1a5bccccd9d27c84ae3f539f2577a9b5d376a2ca1a5528d9a76fba0edfc2b52462161c825788ffe4a5cb0e9993acfeae5abb43319be9ac2cc04ae0d2b409512503b1011e8c59eefb775937ba3176e09dc48441160e49a0f125a303cccbf237f0b3a6715a72cad3e207d9092ea15256146fc8bf05203b1c2ec27a39731a549069c4570eee188cebc60e9ac62caa52ab1040698d6e96ae1595c3ae6c8262d7540ad7cbe180a3e71cbf655a0c6dc924bf6ecf70dea7bb9c1f03a6de2ba53a34f0cd1bfbbfba19fa5985cd09db1d5eddddfcc8900919f419086944e99485cbd97223c4553c1159c560509002e273b7506c6dccc8369a313e5cdbf97917d317acb913915db2c5707406d44c9e8f0dee39e07bc544a9524d2e853bc8daf51272b59de194079a92d9bac510626c5d6090e42478c32c11f84c26cfaa74ad2db88649ff76c4f7dcb3debc544442694a59c54247c3c231aa1254a5a213ea50b32349de4c79810e84e86cecdccccb215f2962363a4f056cdb5cc42cbbded5fb24468c6b5fddedb89eb7fb489855976283420a16b5d48a6d5999d56e593970b8c44a7b1e10348967116297a1d1f13e5a42f13056d4a1c769cf882262ae872f8beab98f9f3d90ba5e8ab46fa4af5aa32f4838bf96041df86e873efe4c3a1976ca2574cea67a38c7f7224c079018ff2c68494587abf71a64909fc52824fe630874b699a9db4590431cc70a3e6537a3a9853059e46cc48712998b65f56a01b28b58c944668403952bf1d0183792820f96e08745a95d0455544514e74e17742ae0afabe767d690d3f878f55f436857dbd24f62d85b14ffaec047d779e427de71e1f5109a17fa9c26a4d17bcbc6ad08f786e9c46673293032feccd282ed1c4df4004e57983d495e8c870426185c368483810b4483901852089f3f49c6efba0de5716c99c6b52bbac87c449f100c0a6ad99fcca34b5c517c67f8be356cc92698b53b0f21729c4c0f56e9eef7c762315b83a940b6ffa0404729b4d5eea3c1632b4e44b945b6682ee733d60a676879770384905d409efad35958ad5ff4471d1b0a8707d57975b3a405ad6d3ffcfc96f6264b018d9857413de0594ea87f4ebd66daf22365184fe0912fd81f7073638c143a9fcb4797c8eb55cdd471ddda561725135bbde313415d93f692501427b178755eba6dda8580c9838f51b61c95a92d08f28275f4b5777890af53ad99330c43094f7348695391be43c32bf5a931231a5f59ccee8aa9c3a71758bda41996f119e968d2188b077ede61a8426ca0ba182ddee62d1c1e46317550598e626e2d3b6dea31bb9a4ed744101ec2b876ed12190b126762d8097668e9d0fda490d00a0120b417966d1a4f33bfc33a87ebf7b47ac1509614aa8221101ff50b41db0c5d27b9f5360fee143f97b0317f9912083512e919b5f186581a2a49c2ab06cb40b45d9f3f5c15a18b8545be7b6722aa2b3d06a2fd0d3264389f86e178dbe99af929b8a2bd7e9bb130220e5dc557439b42435b0cf3c7adb635581a154db92050ceb981239d5669da3cb211de265a5ae41fac769f7fb337328e17b6bff0b2fb7b69131c97fce76ab745b3da7581464800c8b696b036865fb90325c77acca8f1424bbf58f3c444ba9e5095d222be25e634b5ad81025fd061d9d5280308f2b112cf68fd160fa8dc1fd25d619967ec8c608902703ceb52c72266f4072c4715389409e63ce9652dcffd0acb625c290edf817e2debd0c9280d9b28297501656b2a149a5485c17320a85c077b9e1102c0730bb4587b0599b252ea9851ce5e22dcdb83e33241062110c8db5e5aa902b4a883f56ef316d67fee4d43e17562ba806843b18a4db8d00f1b6576b3e42988e5c6946b8e237b433a7a1676b9882dec4682459bba5e651283bbf5126e0d3b7cab5f3660efbe9e9e04e7f875f54849c4386976e51e481370ffdd1c65489ae1f91caac187b728ae638e29d792b807825d618ae06dc3115c05e479a1c56242186597635f634e20afc3a52965bba2eb1ef713c4a710ce29eedbd1112ba14ff3a5761673a6ec5ac3830126dfe3330a0e55b41171f38fdc7f7b676eb3446b77ad6cd5bd318c184ca40eba1c912a3a5a0ba7dc3053c54773f3d12bbe771f955ff039211fa089621c928e97d4255dffd8d41b067f72cc8131e1e29510cff514c5a804904cff5d38fc97054726ebb3d4db9cbf786a4af3508a1293348cd88dc07e60b8ca4a6b84bf797e749d765271535b0314a9fcb24c675afebfe0b780a7d21c289e780614cc5b27a6ee2cbfc458dd2656a89710f239bebff8640a803c5ed8d1d4cd593cbc42560d307762f29fa8b73e8b9d9399cf225dd89b8b12002c8ca74b91f854893b5895310a64db4a329c42ee7dd5a8511d270f53bd6cf609def4417a458854c4ef4be94015f1d3a6833fae48486d2199cffa30dac850700cdaa8562094c105205bb12682509e4032f86bbfb28517e4189f592f69b1159c8b7626236e18204de631b5f972003a26935ea96d5c1846ae26ac7be0ffc1e1ae5da913fc5ed21c087dd1ec4627ea060a014f37e945dd14758007e7c80574c2709cfa6a680b05eeb483737fb9bd22e205da26d981b0315204eab4ac6d778065ab6b6b51c9db9ae18edfce56ac9a49e75f87dd68b6aa5662142df3fb40b5a0f694ec09063fe33f0bad444f839af9b8bf40c64d77fc8eed11f3fdb1dc4d5a62bdd4a739da9da60267485baee1f7955721d3f22e04c75c6da9fd5057150cb3c302c382d0d5c3225c723fd06f1c6a0520fe65af175cc105b7d3a04a926c001e4c514d7a645c08e17ba81271cd11293501470870cdac8b99c61248fb4bab51a3aec6bf146a8ad9446b4bf8133afb55ec4c94636cf003abbbe068c0b48d7f978be878574d980db794d81b63c4b9b8f51aca96aa083c681fc3310e88556d0c9cd92707df9919a952ad664703f519b355065c289b567efa774443674da995ec9227525ce341f8eb2ab450c0d573298372ce82ffdade06650db26bb6c19850f2c4a3d92eef09a24b2a2a35225082890613582b2efb6508e69018ffec0451468d88e0ec62833369477f6046bb7ff7d961f746264a7896559412165122fea73ba2a004adba7da7a15ee622c0062fee00a2cd3964146ecd9a936a5f4c1a7d0d417958ff3c1e718e8d89fbd585a725121315dfa451fc6c47ad322851684c38282d1e3411c01acc95aa6373c8e9625480049952cecaea5614d1c9fb5ee125d1801f39f1c56b0336b0ce33d124811eff14b4b8446b58729bcab57b4c04bc5d87b7b5d4ddd150886f498f88348ec235c91c6f0a54860cee2fbdcb7c9563bae00ebe4c817560423ba57ed5a9885ef349a4870f98cbf609788f55d342c6db085422d9d6e1ad0a3e40834e1d9d1b108d20108eadfa93367d0c656510fb6c45b063d43622de85acefac3871f08cb1b78d230c307689bc0f8de5141082312ae82492f59d1dd346085b3cead51c62aadf4f8fe6173be0e997f4e7558b5ae6ed17bff30eed57362c4452916bda7075251ca29f682abd8d6ea471063776ca24817abb741f4a5f08b3e1aaaa851a1dcbd52cae896c3d772fd7d92815ce28b54d9c424e0a4ac731db9fed2f9cb46301cdc84bdb624827b8ac59142428f3807e9c1d3460c2a58bc6114f1cd066c451068386e2c1eaac181877e28dbc167a761a1c622f1e41a7d99df94651c518e19c53eb47960dbf292eafcba9914701b3f93e2b0a2493ff81a2091c75b2bf04f7273c94b701287495f71f1c4f00265345309fb9dc4b05023da5ca5828760c44b6e30e850f0ccbf0db252d68a950258acb18c01605ed79cb43ab05214a484c4d39de770c7fbf3f1fff186ffbf9bfe7f2ef39c32e539a3833c1258aa9186686fd00050a829b2c18cc2518e2db6b6ea8808054f00aa83d6ab882d614c8e38f1c4087c6e89881b7935ff49e45aa63bae9759eb2c2e64dccfb6f272627e025f21d10a2e014d4dcafe8657bcca45b0f9cb1145968c8b574f0a38cf1b8f5310c0a134ea499281d04ac849a8b02fa727e710439c84518b7b3294748c248717169cb5d30f81a02857e6a6c959f1deb18a72d8d5500d766cca7c2e19a149ead1a15a82e0066490df6209aad8418f09212d614e855c8565c545b61d10d3b5f47f8cc000432a7bc07208460619c7060407540c4fdcbf7f7d39770b1e07da21e64730e4a30cf91d98974f059990250dabf90bd86f39fc8813ebc9ca774c089a74ff8513aed3f790a347c0c6da6d5c5048d30aef05dcf9fa47ccc8ee88564c7ae8d3f9e96b6f26a4377f9794f2fdc922de9b9ea1af8f551a89351550dfee11cef17de002a1a574d76b49bba1f4940ae5063a552bf47935f9ca8086347045a783a63c6e6e8d2261faf6c22545e269de44ca522456692c4f9875c3de7cc607764871e141238ce5ed82c4b0c5419893e4ab99488c59a8a80ee644a994cd767d3c6499e0b7b58acc244cf59b5b1d7ee4e0730b35609e725a8902619731c0d14b03a75a899dedbd0a99eed306a40237b7398444abf976a568f3df8acb2bec31fe2ea52d90f5b2f23c45329f80e35c21a0340ce340b8c2a9faa798161753a826c6285083399d5aef2a097e1c20e7c80d6fd0f987eb734040f99995e00bcc94e234fdbceaf2e179eb37c144c51006374535a5de9ff15b6daf162b345242b972029d38de8dc5c4ea3f4ca50671db2cbad34337e9b4debe9836d1f37b3a617c336f17151270ec9f1a5d754c009f0f7a59041eeaa17352d8bc123316ac448c34157f0634a5b21a3a5ee8a4da4541cca2b0860fb14f630d792b26fe64c0375a5a7844b0ebc6685fe9e6c8026a9e67e990cbe980cddc73c0312edf4997b610c02f872c02fcb92e01dac7accc78a5242e09144db70fc8811d83eb9aa416d6ff63b323969c6c136c64a63576aeb557169d76478c72536393fabd7436811bcf8011b25bfc74924c2acd324625a4248319b8fafc10deea41e0d08c1c5ea3afd13c23816587c04995d3f12827637712f6db675ef613fc90c2fc9e48fa94841b3ddc00e83159c104b1fa7b587609fd92ada2ea8711bcd71037ac81caefd7bce0ea8300a0602023117c669e16c1af67196cb0d66037bdfeef1d67f077f4a0235d3d79f89f64e530fbc9d90bb49571df5fce58535819405bc91ad8147310c053fb92f1dbcec6e409afb14c2d0140f5e6ef0094f9ad5f9ae4a96fd6d4d103033706715c5d7791992ee78020a6f99d6bc0e483e8ea7b8b6822ee59e9b995c838de362b43fd3070e560266ec9e588eee1c58627647b1fd1c3031ab8700adb70cfcddf693c84ab22b35acb0071f80cd60455dd500b8d5226ec822ba3fe2a4ae08193eb250bfd91ca9b88a3832a8b73c653547ae5c09d0989ab23f57c00562f83ebd1055d7aec008733ad2dddc342d5ec4c345f6b45b9277852777b98e7a8088854f6d4c6e78012d9b77042b2884dd25c6cdb2e8ba36f3352ce9cdec6dbd307c18c7b3cad973f086a883e6b2d498b4d08cff18615d70cea070f42d56a33a15db2029348dcd558f1c790262bdd65e1536c07e07731a99c4ccb9af0655c2421964b7ba7963d6ef4305d4a2240161128d9ae9a1bee44284534f95bedfd16c6daeec4e14156b25a338a345a4026458379c46e8f1443ffb61ea579d3c3bc33e03a69218ba91eca20bcc0058f79f92569697ab89121ece12bd5cbf4cebd25dd019765773a73c5fdcca0a83c402c2a20833843efc9371b2ca11be868e1120a86f848816fa5ccaf1291a4afa5de8fe98ec79a07e090382eac1fce011c518def1bd2b84b719966105db38c36e5159174b0ad2b183f133df8de4174c764915ca409ede38f73a3329fc301cb60dc3dead68224bfa3136ee13cb8a700c9c9bb558f7f1fa92a19ec019a2d9d363f4d684954a4a1b862953b4220304cd0b81db9e5d4458ee6cbe914b9730b54164a0caa0c20d55c9f5b67a999b27b711ed60610fadd74bd0e2bd20fd32d5e30a0708cf3861e96eb3e2e415aec7eaaa7fe973066cd59f32da6769b2ad9e7905f9236d74bc8686aa37906a19385ec7087ffbac65ff70976ba2fc28b425c3b22c864b8a97b1c715fc92fb22cb6b24dde4654e750d373e05f71b4ad4071bd09f9f4eea704ba5c4cb8a8e907838b004bf44145248383041678794d129c70243cce5310f9df0e3dc8672b6f46e7b9c0669d9a6ef1f352d79c965a681fc18c55c44689d5e70879e065c9e19888b57404c7621847a016a0b1fe112b5386b1cd5ab807d1d129c5bb2d21b5e83ecff03f648dd00ed2063b47b53a29380c096d983c0c46e4ca8c2ef4799fdf3b2f451255712c35f255eaee43dbd2668e3ec860e05983490f881d33b001506656614946b18f5a2e21800e309b5ae3654bc521951209c64a7be81d8c38b97dfd9a96f7ab3b77a429a5ed873b0bf768ed9f9df8385ec0ccc8b3315e3057cc5659350fb3f991640c6f3b932299bcf553005c69d40fbd89080176414beca79521231e51c61221d4c9d0de5797e1fccdc34403cd308d4451716d8bb500ac626bd4e51723212cc53ca34832935d2a84c38fc808803127f29b298c10621160c25324b0f71dc01b4f40da0c390ef80ae8b86be10b9d3d9185b5d35cc39b0d6ffcf75d540490de466c25841a149a27c3eb351e3615cb87f6d145c62fbc9d4963282bedc73c6d99179b7c19299c558ac12f86749fffb38725500a35990492a138ee781763ff0294775af3ca3d6db4486110e6c03e85ee266475861b5505a215506a11176fa955d5bcbaac060e6451cfc0d97c6850ec3869ebf473b116410726670f95227ce8d199f421a4f8fca0e675dffbc3d570a804de4781042c49205877004134e81a8378b25108213128300fdb661d5918e2002566777708ca30780bd07412a1d67c14bb3d95687d183586e4ed9df979d0035d9530d21172b87933f4d95120319fb0feb19060d48009c79b2ff9ad6a091ce4a8672099ac445b0d704cd94ec9aa1c87b90b14b9233615641f450d25831647a9bcc63adb3bd9c2ea21b895ba59b4ce466b25097b4aff3616bd741aef7179b463610db8ce36fb13aa44e1a784ee845ca957c1aa22ff1432d9d26ea80e324a15416e1fe340fe46513938e70e4aa588db3366dfa99fba3fbe0160b1b1ab4d629dd284852434cc1ffd012f6686f359f996fe62c80b4ce903d359f6ec2e2350e3d068591fe3f1247c293497321a5158b98f24588c6ae35c9f59491c0f0e1f671d6ff5482f1d1fca1e1cfe8821827f5c06a67f64f1ae88c210b1bee1230bf6c8338b32431d3b5fe2a2677db0002281ebbdde8817323fa0a5e121ce6c0776f15b0e9fa52106b0a117aa8a3bb97ef5110ed63b612ba2b341700aaca8ccda5cf5825e12f4e33a2fd7405bf858eb36f9259e6eafcb5920a0e296fb5a453be8ad4ac32bd12c86a0478bf62926802b86bc6de03d3c2291abdebec840c6be41b211ab4cc33e520489a6056e1f74103d17dcaa077a321b5670e2f03f3e9423803c61b2cd4614c1f17da4100c3cbf047b573eda641f395e09ff3d3d76d880d628e95dde4d8f6a83059beed8205435ac8200700ab3e9389b841567bae15ad88c41ee5e3c815a3d49498d57a44a5d0d7ef8eceeb94ef4db5264ec5a6a86978331739a935b20b036cf35768f03ed32e216e90191eb409c92340eeaff77b4d2518dbe447621d5f4efdff99171be145a5c22968583868f6b69f96461eeef29dae47c62be7f6f4e7093eeffb8e4306831bbc35b4d05628cca458d041fad7d7499cb4de37632e10556d55f397342e07a7b1f3dfd06c323eca9d134be5cce55ddeb2530c2456eff3885de0d4161ca9422f0545a6247dbc55b01e59c44195fd1ecf6fce7ef120365dacd70a5b2b876594b9d14e028294d947c729614e469d8fc20c9ca74afe5332487e556a268898dfdd30260d2bcdbbcd9c8c3a92e7ddc58c26c0ff6fa676417035cd9b6a5d2d031a67bbe14ab599e44909b83b40a464b728fb7f93d2a1bf6bd26c887317cc77b27ff4ba5ed563c4fcf152a649a3b3261da9cfb464fd1507fff897d2acb5f097be5d10a66decd554e9436fcb43065cac339fe35a378cdc2e1a99b07642703da721280562058524d07c9096756d83c8a4239e266992a28648caf17263f8179061c09819eb659003201a9eab328f0a358e3664f94e6feffffd05836cb54fb8a3ad390bfb1892ed0e2564c7b4c70088a5ddfeeddd6f6de52a62453080831089607402e8edf1fd65cccc0f787422e16f1fde1908b18f8feb0c8c50b7cffccca450b7cff4c8f8b15f8fe19968b14f8fe191f1727f0fd332d1725f0fd332e1789f8fe99978b11f8fe19988b1070f101df3f33737188ef9fa1b9e880ef9f01725188ef9fa9cd08cd0ccd149d56a79ed3c9e7d43ab94e2f177bf8fe13ec143bcd4e27a053ed24741a3a15d1ac687a68687c685a6178e47b273a55f8fd342f1a184d8c664643a301a2a9d108d10cd114b9287e7fcdaaa6a78655e353d3aa71d5bc6a6035b19a590dad06c8451b762afbfd3535175df8fe1a211701f0fd35432eda7c7f4d918ba8efffb172f1c7f7ffe871b1e6fb7fb05ca4f9fe1f3e2e9ebeff47cbc599efffe172d1c7b7f778779977cfe1c5c2f8f7f822aa169f97d90f2fdf2364c2736328a67a794fbef7592d90f80dd8d015be4258180b67212d040a6ba150381416cdac667a6658333e33ad19d7cc6b0636139b99cdd08498a9cd08cd0ccd14ad7a583e2dd70b169bd1806a424345342b9a1e1a168d0f4dcb6d685e34309a18cd8c8646034453a311a219a229aa59d5f4d4b06a7c6a5a35ae9a570dac265633aba1d5d46a846a866a8a7eac7ef4fc60fdf0f9d1b2dd33c730fa1a24f00cfd3eec1121be0911ac543e3eb43d9d0a8990c6550344699446815c7ce1fbe61bc87790c7f986e103f0fd1bcbc518be65f8feade5e20cdfbfb95c4c7d8b42be69f8cef9aee1db86efdf6a2e0ae0fb37211707f04d80efdf8a5c1cf2fddccac5fbfd5c8f8baaef027cdff0fd5ccb459d6f1cbe73f89d988b3a7c3f3773d1002eeee0220f35170fe02202be7b7091888b09f8f6e1fb3b968b0af8fecec7c51fbebf6bb9b880efef5c2e02f1fdddcb45067c7f07733188efef622e36e0fbbb998b34343e342c9a1e9ad5a9e83474123ad54e4027da69768a9d60a7d7c9756a9d7c4eac53cf6935533433342334539b01729b19dacc6c263633f39a71cdb4667c6658333d33ab301c0a85c25a0814d2c259180bc357c8a30c21acc98761d8806d79db72846dd1806de1b12d46d896d1b664c0b614615b30605b2e605b2c605b2a605b28605d26605d24605d88b02e11b02e10b02eae075897d710d605e600eb1213c2bacc1a605d68415817200658971a10d6456801d665e807eb52a400bb63e583ddd19300bb8345c4eef0e9c1ee6821c0ee701dc0ee78f16077c076b03b6206b03b663ad81d3b76470e76070e76878edd7183dd51006b5259d3b5a6cf9a7caca945006b720dc09a5e02b026980dd614abc19a6639d644833509b126d19a52d6348335c9605f62b02f01b02f30d8171cfb12c4be00b12f37f6e505fbe2827d01807db1b12f35b7e947d9971ff6a5c6be14b94d3f8de571b23c662c0f1e21e99963f0de5405cfd06fa7181cc338c1b82f3ee019faf965c637fd3d2c95b134369aae184d588c138c3b86ae2946e8fac1d9a08e322e99260d93692203ab42f53bcab8a895b2c5f5728af917fb626b08c217b111c7c6c6c6684aedf1e3e53674b25179b61257a3fc5fe6c7ce7bbc4cd7d52aaf9296969f4609c1e35f42981f5ebec7f778f9222a6fc651fde2505a8d870faae3dcb63f5efe6259d5e00f24154c0d10df7035a8638b4fe8e3a2ccfbf8b1ebd1e2d3e273fb2bcb459930f4d1753dc2d0f512b26eff6ca3f21d431749b2abf8c7d8ce590563d96d66e85a9154210c09750c5dfe625965b2ace28c0003048ab8f4025c1ebbc8958b428505536c4c361a9080524a2901a0b821d4441b48e830a880a950e1248aed091544d890e0846ca5d14ac2cd7159d69a715d4c93cb8e63ef9e7bd975bfb1cbae3399b8706ee1f4e98151e5773e83fe4ca48d1b6d9c74d2a8e3b62fa4d7a47694d9398e63661e72d1dbb66fd9f10de98734736fe29cee2bc1d17b9649a3705ce2724b803a74970ba7128dea264036261274e83250ec324cbee4aaa60450092fabe0f169e41abb4837aeebf89f77dca687044144b62c32cd4646803c232c43d8ce3052baee58c06ebd2cc3c2558239e79c2c7cf320163a2c74328ce9c9f7da7a1cc49f411d5cfaebe83057ab11a35c823a7ce7ebd096aed2df5347de194e26b1ec04c5ee103c3e3569d4f63120c11ab5915e8d22411d49afbb35e9457f9bdbf3889955df7cf3cd49b12be813e419b54733173d2745d1295aeb54d7559f2f4408ca4455a321d451084d0aa174e8c382575550f99973c38d933fab3a17e7835ab0548144b50273ce90e39ffdcc1d27654d883929b770c6b2eb36d9b68da00e11a1390e0e0e8eb731e79c4fc453322653691222c2a269c62c84bbe6c66111a776dc0513a1d1da87bcbbfbb773ad2c5733f8ce8ea5dbbdd7a514b4e9e734c9a0763ca52b555840352122cd5dd7ddddc5702478858dce0d0b1dce95729374523adb0ad52fcb7e842085da97653f4f380d2030144aa612136a196e0201e0c8000a12444105294d4ca0dac0a86d5070826edbb66d67acbc4848e85318d4b0821320149c7850b001926ef25334bf1f2b6c2a4fb4c182328ef0a095c69f602ecb7e8e70b7cbb29f33eef8381d1c422e4b2356947c904145151c15452598d554b7bab9cf1377fc2db270b9c7f5976161c6757f93976457105df0b26c8b2ad0adbbe56f3fae1eb49f9629081546877b92e30b56823a1c16eaf8d7e9f53fa971fd519da2b92eca262b2452aebba05cdfa88cb94b3ca653d251a87fc3b4e9c063cea9a13975cf84f6657cf48881e1f162dae1c2ecded25dd29183a5aea8809f471a75dc46a7b76466fea1a2230eafb96817e78fdddddd75774b7627b44bcb16efd274968e4a272b470583aafc4999a9cf486ab9b36c9503c1f0b85001dd3d0aeaf07fde07d280446177da11e7f20375bcebd40c3d77d2080ca2ddcae4aa07ddd18dfe142f9430545568b2d8922d96a4a0d6cbb22d7ee846e956a48a234150ecc0c80ae268828adac0d110420773254780367c9ca8261ae8a0967a5c96d1e00597745946039f3bd67f524d2c973b1f624c01aae66f9506c40586cc5582db4f4d473e58182c7ce72c75fd758bdb5a20a96e4ce1daebdf5d1117bc208b214c110512de70a20661cc489e1975acdd18320d1c9881c5097290c6cfaa61347881b28adb3f3b35737b3445d77d4ae050c12c8b2856d0ca420915435988918496051090a8a688657104964f165180428a57166c94408582a22c8a5852c5f2711bee62d023854a8a21b7e1eeeb4ad6ea7759f633c50957f4b471c515fdbaa28b367245196e03329a00440613b6f0fa4b8489886b442869c1955f44a748578a5e8c47ae624a5c77943d2f254fee28930c4d69a28ed275a50965227ac5c182d665245c76628513497bc00318ac5426598374a34e79e5cb30bbf285746a74e513c1d3e268c53218c4aea4bdceb83020ba234be1919f5cf9d3dbe43623a89d13b554ab6361073938799f952a8e8ceafe09f1bd27610417c2e0b03df7498c927b1088efd993e09efe68f4feaad19cbfcd0d0402040286f4de832153064921077446a14e172661049d8ed3b56fb1832de48036b803f723520fa41f718ecaf3c69151d96366e6da4f7afe2e1cbfff3a9544f7db7ba3cfd6466d25591dbbeb3dd7b9c88454756e437ad2875aa82ea4533f412038b652c100317fe557c21054153b57d77b151fe633215530e0affce681210774be50c70b93308214761d17abf299366a9a8295952b6a4fe59773520a521ac2788883ca1a52324bc9524ac9cc2cc3dec16496cccccccccccc2c99437e29a5dc014ab2e4154c6f834928aa3f75771ab694393eddd91d8c52fdc1245407c1e8c24eb2f39d51e0b9fe6c47fed2ed920c6a7fbe02451dbffa7d3521228d239f70594a139a0997bb5bce12ccda0fda8f1a9ad3ccf5b6cf6d68edf5bacfed5f99eb913cef73dbe37adfe736e67ae0e716e67a2a9f5b1ed75ba99f5bd3f55872945a4a2d2e3b4c2f3030313d7cfc7fe1e776a3d73b7d6ee7f5686a6c6a503fd0283d4ef7382a21cb20643a89e3e7be5c76b2855608723ccbb3242047b87215134586747d724b97652f805d09ea106179ae05553edfd029be2a2afde104c3ce298bd5f11e0f8a83ca37c709d5a9fa2ddf2fc4459767d9dec5a2de6d4a61732f70dd98cbb2174091e3658e90891ccf6e23c311fc117bfc8dacca8f9e64c7f955abf20cfacacacae7c0772584dd952f72a51d5fc58e72943fb2de7f2ab6c8052d12572a41af17ca306490d10ff1d137f703cbeb0899c8f12c447284ef365d67fd59feca7716cb2ada4a7351be98ddd18ffca54c064297653200bab4cb321990e006e1e2c73d0e4309c245264420b108fa4248c5647b11481d14c18a958a8911dc6fdf4fc40fa3ffe8e58f4ad0911582c3a4fa8f7ec451826af1fdb45a804380b6e7551fa52b3fe78a65b6b1016de78d5ecad0a911e9fd19943e7adf41268e38e2b8231c221ad541a471b95088dddca8230315411b19caed97ce8333a451fd3f744aa5e776d795ea5877e4275dd2e97600433217f8dcc62162c9ae20925d41f45786e4042d9f4e4fc198e46d31fa05d91a89e1f1698481769b4ba386b5532bdfef499dfa2070ef9e70574223bce7ebf5b00c87154f58c9ebcd1f56d43174fd7071c1a87ef0995332aefa35409cf3b5f8d070ef96f432ae3622c34573d6473474f5f7adae7f0edad1ef168ed4081d8d2018ba3c9e35c25f5ed3f7b03309758c7175ef992ced2e835d486921ec52200aa551ed44fd1edf1ed4237ce1fbd18fdeef94ba72afac52cc7dc8bc8ae7c31ef1b1e33d1f3e7cecb0324b7c5815958c3d22f3929171f9b02b2a9cdb03c7e5dba5e565663ee6b749b9128395db593a823a863d7c8463748a9483dff93c7c38e7e30103bfdc33a778b456fe65c639cee30a261fced9ded552fa91c7153ca685070c9c470bd4f1238f2d74b024cb8f3cb6b8397eb3342ebe89711c19d7adaccfea60f14d97627c430222d52c49c892d46854d348ab95211a6d686885b6a206e7c8db3fab50473faed05cec2833bbfd2d76acb76447d701561607640e96d0357a8b0f3572c7169fb193711997cc129537aa4c93462961ffa51553c218d22b31a863485add91d2c2259df2bb813f42033c468c1928020317b0400528300109101101083c60080708d180201800c4027e50800f0920d203020ec0c30e06d06127071c746e2880ea864308300001d850430e0d42c4d40c32c4100018708200b979c1ca20e102006c7c5aae17ec47ccc50e7cff8f998b1ef8fed0c539fe3df2b8c26d1e57e0203476e64fd6c7ffb0345f634f6f637f3ccad6bc0bd6e60160518f8405c0cb5817deadcaed803d22e3c9581faa4fe5f52763415595b12a2a0fd823d5a767e8f74065ada8bc982531af185716ea18e37a7b4489e7c06fc026f147d80d3c8f3de23560ff47cbf346580d7c1176fc0c5823fe02b688c780cdc057c05ee02d6031f013b015780a580b3c1176022f014b81878025e2236025f0435808fc036c045e083bc43bc03ee083b0427c03ac031e081bc433c036e07bd899ffc102f10bb00c781fec0faf00bb8027627df80458053c022c91efc126e079b008f803d81ede009687dfc11ee077ac01be03d6c7eb6077781ceccee76075f81b2c0eaf63737895bde10b60753eb4aabfb6004f001bfe107b5f0096003f003be46bb002781bec009e065bc3e7581b5eb434bc109bf33358f15356c8c7606778196cea61b0317c00ac0c1fc4c2f03836007f63833c108bf3d6defc0b16c82361edcbd8172616ea18e38a71b9d8e3fb635e31b04e7985f50cfd49d8fa729b7ec5b8625c314b42978b1bf8fef015c25c3ce2fbc3988b1af8fe70e622cff78734178df8fe305d12db21e98ef474ac46f9c05ea655b72a2da9a3f77a3501572f3402a2f0f8348235afb277b22b49b4018c24289c74e60673a02fe5b6f546aaa6da712412c916517992eb48a4f7b6cf1651c9e724d77deddb4ea37e43fdb66d6347db98773a2587d016e7702f651552f64cbecb2331744b69e1a5b4e87995f793c4513a7b4257b4412dbcf7b6cfb345540c6eafeae813ea2b4a39aefbb4207d678ba83cf0235998f9ac2aa2f22c8cf49ef8c02aefa525e23dc9c2f893be884a5a9c9ea1dfed0fde9384f830ad83f273bddb3f5a21697154fb49721b045263e8b61677ec8a6ed79cfcd8e08ea3233e2508d4a91184020675aa9bb83d41289d8a92ea02b0943b8409574a2923cdae2cd5ae64669e49714bac2bc71c4cb83247ed4ac915805355703eaed71f68e40c8fd6812be99b9dcdf7e86c56464837ba6dde795e371a798ecfb3303f78fffd1732e1859ddbc82fa2f2be6f7377777003c139e7749fd3dde7f469bfcfedecda664a3048766556bf19a8439f346ad6d166970625a8679cc31d5047f38ee6eef66b99ded2d2d2d2925b4824b016840973ce39e21b9eb3e31b0e856e14ad2640dda97ba468c30c2fd8f0f83d8e0195edde6d4c28c731e9ba6e34a294524a3f8f524a2908aaa8544a29a5254a698c49878e5249967474b2a5fb799a14bb4674112a4116e8d08315b03194852b8a15391823084734a9c2118af022128202073945e0020a0f9a60218692243c09a316049bd10381278c14cc645f14ad618331808a68d083042f07befd2225900b01d49152d62e354af685901bc199516f727f7f3703e76b9b86f9c261526743a37ae84d51fd3f97350ccf9399fef5c64db7f249f249a3f97da4cffbc0397e3a2b2aa0bbfbec6a8e39e79c639d3a3eb72550c7ed686ae17671912e54a5e6d0e1f29540b9a3861423c5482cf05cca9eddcdcfdddf3d6479cba4db06eafcb80fc7aa946e73ebe6d7baf239ae54aaa65aedbaeedb5c3131a6171a71f75e7f0dea74f2495ef749e9ee2e59524a77777777e9d2634929dddddddda54b29dddddddda5cb5a59587248777777f79fd265c83fc4db8e3cdbebbecc1bde1452cab652498b34c49448228f5c675d7f9e1f2a89e8d40daebc3b51845cecde9f871d3847bebf0e5cc3f6fe3b9cd3ee2fc4c52e44e20659c3166680834c23f826092e827360ae3f129c339f301216c137b22a7fbbcdd31689327c87b9f1a544c21d2ec245efbdbbb00b67655d9ee1a4c031dd46cda210125d65fa2acb11700f0bdf34c7f16c2bdfa871c7189917417734c5f0c7d255cee16b622b3c1e3880e1415d19e22c67244a299d2fda4265e8c3c7ab7559e6c513182ecbba605d0e48da1992a4a41a6969714ebf735fa2c9df6c8338b8dc91646485c637de8fd4c8ca8a6f483c6a95b3251aad45a2ad9c71bdb6ae7fd7d2ba2e8d5c971746871e617668b9f3bb3b8e45ee6a93e138bdb8f2473b449d9852d41354f9b363e6be0dccc21d9999b9fb3999d9755c237cbafb646666eefb974952e5b304afc0ee6117854927654d8a444a23bc3129a593521ace39c5a493ba31e91493524a279d534c15d2a80a8f9959b664fb9cf3a373a2208a2adf03bbae0b87786c8817a173b17b1f4da3c9393af449dec7dd574b3ca5cee9bcc1ee6c96878ffec7a8af1b7d226e68d4a4027490692330d6a8928f784bcb8a73fc9be6ab2273d48d3a20f0ca0ac76d1cb76d5bd7bd3143d9978a60d4f99c6934e1f169e45ab7719ce5e2f632dc66446014bfb75cdc62fe04a736da1a0cc7eddf622e6e406ed39b50a33622706a9b02506c0dd6c16d87b1df8045ae391f1edc666d4260dd0672d1cd38c26d2087b914ea6ae5d7e1af9c5d67bd530af526d43db73558a41b1ca016266fb4712a1eb6ecac16dcd2613d0ee35adc14888888888888888888888888888888888888888888888888888888888888888888888888e65bc1eb46dd88c335c98a0d758be6c18133724db26243ddf2e0c019b92659b1210f0e0f0e0f0e9cd8a4936b92359d6b707477370e1cddddddc1ecf0ddfeee8e1db8fde3eea12369d426c37777ca73d6ba32fd89cba23fc1365dc7f9138cea2c702af49986ee3f7dba74779f2418b5dec337fc9e53ca734e76fa1c52ca048d0a5532abb0ba1dd7b9a909ac68c3dddddde51a2e4bb677777777a75b28a7505dae739cbb4bd1c61ad2c5c5e9aaa5f4586b1d2b0dbbe6c2722b464deb540fe740912dbfd5b8520a91e18e3b435a4bb221c1d98ea0a6bc1ab7db9334aa4767b55c5a0375e8ebbef9745e1a55b274b9bee386b68131a3599ea4c5ed67f3f162f319b58086d029a750ead8ac6675924fae58ae3f77ab09189b4bb5705dfa25195c4affd429bea6196861064377acbfc5136c7c9f154f58d1460ec9f24477446c649228ea281c54bf5e2c7963cadf12ff9874a3d1649e22aaa85fd7c6ab6bb08cdac508eac842b28b2290e8827366a9f2340a091f2128212fc42424844e7665481e5a44a5461b86746af4fc37eccc8df4425adc897941b63c94cca312f3763f1a3dd73b1a3ddb24f85bd21f171e8a8daec1910a6a49b6641975942d2c8cd4918b24163c9258700ec734ca746254f73b2e2e81ba5d105e833bf8e57e091e7de1c845435cda51269678a216fd27472990cccc93528962979452bee1a6e0e54c917bff8ec5ed3dacee9b6df7144b672a2553db4d77774abdf09a3223e195e526a1a85fa3022698a529d7f4a7ed8d3b3e8e0ebe2b793700fc7c6635d552ad4b682648e14eb66061e1fc0d5abc1107157c88a0021e389164065c12304a6085ada8045310630953e288020b1f38093a49eb04a5ebeee4064e5870bdcb322741f848204e55c90955fe28c3e5cee5103a56741105106600451a2b3fd24fc0dc90022382a9319348648f8442229982e71b95e0be9e0f8a0f4918a3087479680f0d2c1a90d0d043c3096860d1c0f24625dabb0e7647298334b9ed61c8204d65f7352d226587138ceef3a2aa14d539594e5b6a147f5ed4d1c4301c5e5761993ae5612c0aefa52d7259f2e479e41ba6df935c975d96419afd79037598d26e4a7f486f019041d8caf7248d92b48827613ae5b3bc736ac193d496e03975008c5047067241ad0a3e313333bb337d670e479e4f864619a18e1dca24637e4aa742c2aeb73269a951fd813ac6dcbe25194608bbd3ce225414d4f1a53cf594cd85c792467d660961a4f724cf76dd245aab7537f539e766e553ba49e948c625da0430403021a5f052794f7a27a48a8910df935eaa421820432a26800ca93aee8dface3ac363961f880113c375592686cfbdb92c0b43e85616ee5a8e46a32f7297b89d1d658c932a0ba376b922b7ad127eb9504a3b4a24e3127732d7ae02291b24a34ac9b5a7c6ccc548efc713ea8e56a42907fa75a9c97576ee807367ccac8e9ef4dc8f401d8e0379287247ef791f773beffb1adc01673e377a1eddd3397f8775e19bf9d2966490f99be5f992c32f87914e174ea7e1178ee444e2832a654f6629e7c6ffb951e9cae4e74aa55aedbaaf73c5c4f09bdce7f2e74695eff5d7dff3af7c6eac803534b951c76feeb827aa0c2b4b8ed0db9b25cb8fa1d26536f4b9e06bb5bed6f67c1a597a9f0beab66ddb36b76fcb43a3dcf37e5aef6bdfc9440d2719c47f86e30736961cffb52a372a071bb55b6ff75eb76c57c9f13247c87cc3729235dc80eaee4ad881271007e7c14db5763c5b6514c14d826ffc49b33a7fe4d9c7b38de704b343bddcd7cbf9f644a9d4f249eb02eab07c199248d0e291ed9d78d51632a1cf743aa5d4bbdb89253fd785cbb2357ed29ecb4ddb1541d2a8d95df7fc908c4a7093fef8f55c6f9f3d7c50c820fef47300e783de811cf8ce3007be1e72d26fc0bd13afe242269bcb22ee489fc7d41bddbe9f2a7f88d7d5386ff395ee9cbb8be04e6959f7199c52064172e54f97cf600f7d024b879eb42855fc2de145588d924970b79f9fe7141e9f2cc783735d722fbf7bb747e05c2e1c712ef76cf983f93eef512ffc0e912086d8624e9020b9e1f324f8de370ad529ee7bf4a0ad6dc3bd643be2426a3ba652f4e067cae51efcb0725cee010ba67051147359c6c508ee929fcb322e5a3a2ecb96f45cd992594cc6647547efc5b22545d78b7932273050e3b2131848b9a274d282315230e5fe65274986aeb77284097d275e05e4f93482abdbff43a37a76f5070e9ade9c3b9e0d406cd7d333f4975c75f5ea1f29a594524aea79d39bdef4e6ec1f6f25b0466d636caeadc9e66a5407cdcca021250cc7b0f6c9bf9256a7646496f8f011d4a3c74f4c0c141818190f1e519abcbc2831999eecd821c5c5658c961624a5d28f0e1d5072e448c2c2b2a4d6262b2b414077274876411df087f4b7a48e1c1127c4a9714ba69f9d1273769513626ee8965151efb91ad54b622419e9456ad24d6ac2a48ede6bc4f9d4b8ede352c324a50675e741b93d7a4f6e8f9eeb76d79eecb6e7ead4e8f92c19492c25a426a4216f8c298dea55a3fe84d37d3ca6cbdd67e2d114493a3285e6688c3982098d6052eaf7601a75bee7f17c4a5c96df6528b7a350697eda71e4536b547b526ebf47f3a000b14d00f920409e8300010204083310205ed06d8fe641a1b16317bbfd2a4bea2c09532e2949a7466e8cdb2e543872413e9d621913daed5fdd71ebf15e36c81a522ccee11e56758a2fabf8927a3887893eda48c99dd2e2541d19fd78e1d83d91dd5192d17b3189dd9bcb3226acebe0f750eee947efd51de914ede91445d229173af5c237b7e7d13cb7486275349009f5e689348abfe625a873136e5ba83fe4c72da16013eacd0be15c3a37e10b2e58120b00e168b209598efacfdad8489b90396442823e340f28dbffc38e1cabb163f7e4f6d3d8b16b72fb4f763596ac4fa3ba05d4a92ec2e53b6377d0000a0a42a3d6a98672f98676078d1a1a52d09002eb5413e1f2b576270a6c8c31669dea215cbe6f77a2cc9e3c6975aacfb87c65ec4e94961225ae4e35edf2f56177a2b8962c01ea549b71f9f6b03b518082827c3ad542b87c63ec4e149f9f1f5aa73a08972f8cdd8942830225d6a97e72f9f2b03b516232599457a71a0897ef8bdd89f28ad2244a9356a7fa0797afc9ee04b594289975aa7d70f9eeb03b41b3274f6a9dead9e5eb6277826a52a4c03ad53db87c5bec4e106c8c317a3ad54e2edf92dd09ea4182c4a7535dc6e5abc3ee04f9fcfcd03ad5b2cb3787dd09a24181c2ea54f3e0f265b13b41ac24495c9d6a322edf6a77825c4b96bc3ad53bb87c57ec4ed0ab4913a04e75ecf255b13b414041413b41b14eb50e2e5fd0ee04c582649c03ee04c9f886ef902ec3044deec8f56c435b11b7bad4e54d661ecf7b69c7ef7adecfc96a5423a95197924e0a958663cf7a5c5fd4958b5e54d46aefe58523cff57e5acf8349c92f7be0b0eba1b65bcd1f3b0f66794ab26b424340d264a2af693dd8fc26b51fd6ad3a357a0fecfbe62ff4602f93c7ee12d6299e3d2e7e4b9a67cfedafe85bd26237a5bf968b9d3c5274254bb286bce78eddea08a9352aa22bc9069c40a884ac37763dc914a2111900080008007315000020100a0704628140208e5435d73e14000b789a4a7048198b634110e43008a218c620040c008018600c02c8304353260022f6bc1cbff12752177aa43623b73d4270595ecae83cd1726bf84757828de109fae3cd6b64b4f95bdac172afeef25a32829c0c5660bdad01bb2a82753351f29433d2196e0acc97285067e04d56d79d358452ca357e921c1bf52701c33d250b7ebbee6ba84760dd9ccefdd799c053be78f8108124fd1246e8d9ebac0463dd9914edf63a4cfb6d0868f5a99c8ffe6fe20b153b23b1c72c772edafc68af040c644fe9ab5682d6d71dda2bea4f1b378e9786910c6957070fa51a896abf0edef4bb4a6b5d5b8d236631177dbdb255d394fbce2d424420d5d50849aa5afbccd911219b6aa5fcc899790834e96f1099ac025558cfe7c12a50b54e1f0dc37ae6437783549f0925231ba7105b8ddf061f07e68f3ca88e1617bbd78af13f8afae3d21f5420727cf96d302d8dbd8af00ca2928bd82816dfa18d1b306e3a1ac421622ef673c8a2e20b5e80181d6ade18633d58c8be2edcd01583b1aea96d4bc317e933cddab1ecf03b0404227488ed2f7711980e43c3505cf212c86e17f95c3ba12c285f4fe4ea56bfe44eb8e00567cba913d7a83f2309de4b948f0e0bfdf30775f7665131d9c4c0d521a4512c7c4010d11532d9185325c7a4ae6aabb3c20f7b62614a833014a9c29e93b6b20ad27e8370e85441e74082f7fb48a2d0f044cebf86497b22121702f4cd10157d87452eb4cad97f7d3405643c0a36ea7250e23582f41dee93a82272a0dabe473cec2378c2a143f9ad40afdeba9fcb91ec29c81923acc3c701b06059e4f107e333e61a42fd45fc33ef9d16bcffe5fdff2ecc0b78d3e31f6d5a4e47e286cbcde953fde50099a1d2ccfa0b2be6c8fd5124fe5c43c8e70596c68dc9fdc9b284654e8a30eb7694863881246342d20c1ef8e4f1ee8c5d202f6d4c8f009e936f6eb1e2c73491225e68d4b091710448103109c6a1f12d0b9fafdd84e51f5040052134f4b1e9ab0836cb58e83a14fe193f963a55169b646f94ec20cf7f004cbe874ee8dfc3cf7894da5c1b69995c8234f98899b907a357266c510341570ab910f07441672fe20a6247bc7f93ec3d5581fde8d14a8d005c419962fbd0c42a6b6f3e7c46746dc4cd55c2553fd5b2d472e596981d58be2120f82320e3087d1cf6fe5cdcb4b13d7adce06784cc29aebfceb933945a304ed5f3fd2a16f727e90763bcfe9b6e002acc370743892c5929a8f7a4b07a26326d09a7cdde92dd66deeb099259d98c6fd2aa3974fe43d1263ddf080c0240442acf8a8c68b77fbed294769f09219dd1291f1be5a2f9c56d6ad2ad5650cae1631fdde452949c79faa5235abde114381d71bc85be059a4420ed1e92957045f284ec1f8dbc61aeb26125b8326756ed2f5619a9551144db7bd5d19ba3103af16e6658ab42153963de07d1ec18ff3300d465fe025c013465f04ff084379f07a16bc04ca1d3881d3590954b0a3b4dea638fb185dbae30c8f0f0d839e71a263f989154c8a162754675a670c650c485d9cb0a3de376b77e2639b07be46cd4976d9530bed94b7818362522a9bc8d4425eba791214a121e83e24c82874bdc1a6c4904806225434ca8dae69046e2d617c94ef4515511cc9af2b8d4fe6fe06364c1eb7c38a04f7a2432354cb99433842d4bfbbb333d8788bd5bfbf3779154529b99171dd3dc0d9b3c72ea00d1925dae2d857b5e826451fb18a83a458c60f3b5205717d0a013d40bb996257dad2ab0ea1ee5b8c8ca35f0452d390ea7fff8af1ee2cdb7a5fbd7a370babe98189b36bc5df8bb5a73a42ec0c58ce1cb0c07cceb3a7d6208315558a569731e076ea261e333d5f3799ab3311337f1539abdec72f47d0a748030c78359a00c8da1536d1ea099a9ab54017faaa8292820c97306ec63bdd6c470c9b632639d039d2c9e02900fc476e02e854046d466b4f36f62ded599afbe74161a64c261467364f93ea8582ce45b9383a82b8670c0bcbd1c4b91d3efb22ef7f46a088a4a4b77101f51a1a01917306bbaafb8060002e50323a041964e97e415cbbbfb7312405ed281ceb15678d23e8f964f0a92be1caf2428dcf9421e526fa7b07ee8d1bbcb4141e7d16cfed5c79975a737dd16306929af90a8043f49d4f3f21858964eb0b1696b36ee96019b11ac7900c956533c2a3aed143c8886e2f44512b640f70bdc27715c827e939d9d10d3c1c15e7c290c14f8301e2c3d50641dfc5312f9ac0e7d3d4f713c1f0695cd67c11f00eb07c6ad06702fc34d78199daff51c5f13716f6e715d640bd2d460c0f7f46a7b8ca6393428e0aa6abd1c6293ec5fadd9fcdf32a9a0d0fed8c3c927671ab0b51bdfed4dccd7ce263a01c02a6b3ab167771eec099081fdb2b133f40e3bf33f7f8bb7efbd788e5e59ac7f61894a54edca4afb0aee95aa0031c73139534bc132e151c0e47a862f661d6297accf4eba38f82bf554e5839d9e84fc9b9f3235d5ca1e7c6291e8c2ee2bf1c88122aef5471b6df94672d865ec7a609c514b9ad4520653aabdea8e929e689a6f5d0a31f2f92ea0e69bf17e03da7c1cef5782ca17e3fc36287c6bdc2f839a8fc6f84bd0f0cdd8bf01353ee4b1e0ef05b508a32c5a40bfbea82844e4358aa03022d72b12e5885e5b112923c27545a70851e91aaf2814235e88da2fd6817df3974c9f6ab74499ba40d4ef4b7b3d7a32451d8dcacd34d6c7075c184a77c5eebacad4d4a5e461a13d1a06e0ec079e3db4be8ac235fccc5871baf8051cbae41d3d1df388dc8239c3d83233c7841b1111b1f5f65734c3110e66b0c85f9d557f1b761def57347488f227d8cccdbe4d26b256e711ecd3b4a89008ffa7244cd49c9e9213c056fb46d4d156c49bca491e793660d626856c76ec98bb3b28a96fc5cd8b8ca4dbc2a75ca03f1189bee5c221da6331cf05b6cfdefcfc1a69063a081192f0d2a837f442a5490ffd944ad65b453a8925435259be9b19903e8a6b9f8873672389a02508fa16f62c57a4354ec22c64d7dcc072e5aaebff9623c9bf2b60ff2790f21ecd2eb08f92c1937678052d0e9803bcef244a893696aadeb0b10105db9b47e63e9cee2a1fec2d81461009f77703d99ce3166dc4cb92d5b0fed068bc873ec12cf7e428aa7760f6536e154244b2ea2d1376aaf65fcefcdf51f897453dbff65fe868a675288a19e1ccbc7181821036a49ad0b1e573cb04a75bde6dc11a2e15eb5df3c191c0a16c544d2081b81e3d19d4264b9bfeff91691e1ce5a85d9da9d514e7a0892b75d3942a74c8605c763f4d5e62b006d851b3d33d3ad55608ab97f013adbec43ae1a3f44df0a2afabf2f735ef7f15a484d79d67b7e118ce1100077fcab3be464bed6bfd2f04216c3f0099a3e5bed805aae64937f4f08e47d05037d134cfb1c33d7cc50659f698a7bef4efa61b5ad33a8b89996b215216ee666deeae40db14f61b439bfddb9db4100f12685a18d8848ad09f76f87eecb55727bd800dd9b6c9cf5b402e8744843ddcd3a68e96ed6c66844803a50e0193c526afceabcc14c040d5934e5cb3553b878aab114c0416be450fa3b7f17c72a98f226909c06af8eb1393b34385be6568ebce082cf34ddeb5158c5e1a56c2128bf04d870da76e7d0280816f08b9d2427ec6174b6bc3d2b24fe391a548c67fea7964b521757f15a3005e0ab2ff7aacf477b91ae9205300468d061bc1f137970855faae974a9f301edcfd12ec0d093cc046715a3af5df6fb37f215d52477170d954e801f1ec63ee612c80749ab45b55c11e60186b04b9810402417db14481e552111992be1b8716f6adbd170dfe53c5f18fe91714b78a680c742d5fb517cb7247a71f9282cefcf75cc8fb5a29de817b0f5d0efe2cf95061a980c29f4ebdcb3d024e4df0b6b08d5b28019e289634a99bf85d87fbe6a252371d320a6d7d6889a529b4c9d2240c6daed9876a02c1d4e1b19b15afd0c680677950889d4d074c001536188229a5ffb868b2bc5f3836521270db06a507dbc9c31e78bdf1daeb3a6f847b9dfe81106bd632315ad30e0ce089f22e088d2c91ab3fdb0def6941fa1f87f87b87f77b57a9c41d873b0f03af7c7d3039d56c64a037bc91241e5b5422dd4279e2b19e6ccb7dccbe7a60ab361a871b97879fcde4dcf0c6b4131613c5b5930c5e982d47a8e2320168cad7cec052964b270bf756f90ef6785febebe584d4e0fb840c6d1e58fb6cd879128213332c2ce5b532acf08ab7d6204155089ec740bb4b6bdda4b614e24ecd6a4ff05e320d3adbd650d6e25d1a1276282e8923207d928528c89b8c611cbcf0b2fd9bbe8a1660e4968b4479cffbf594e7cf44c4bc29a06513f62a3d0396057586ea011ccd4294277536139528aca53f18ad770b5553697000a4cfe2f944c15fbc16dffd181ee3f21f5f50176be663c045385a13c07a7e8e06806e9d0b011de229286072eb477b01b9fc191b60323caf07f00e8e2302ddc68925003a3d4f0ae06ececb02adcd1930603a3fef0c606fce73038dc1893a30b2f78c826a5352f5e203cac93cfb19c442f75c667bc6c49aa004e381338c7eb01ec08590b0483aa2c5361a9de330e685412a3f31391d0ae843d44680cb1ff5033649ae07f3e92972fc00bd1d6de4e0ad4eaccc530b4b3249e7bf142af67e1dc361ecddc54886ca196e514e00219b11e6822ab5044e4f538883330147fa5d061796ed66338df7093e62755ea2b400a04897b14868e0b3e250d63845e4a58e9ae7ee6e7cf3e955630932209295f0f1c75f18c20beeafd307fa623a397d90c457e47302164d32cbbceff81ddb93111095ba7a93da9b2874ff725ddfaf44350fdf4c962c88eca40919aef636cc17fc756e291ccdc067005a0140d4148715345d56fb62fe3f6d1f5f26d4396999bc5301e90f38cdd4c983b8c58dcf95fc0e54930325f69a2d5f3201010d370c5226cbd8f1ffa8fd862d1765f2ac53ae6160452a8579b4173732106572efd027f0ac6d86c5c04874a3b92d8549a35285e2399192b424440f2db7564f9d4d8eebc6ce7880cd22a4fd81d22aaf5bfcdfc6bb2a806d76ea8803ef1407d125ee082c81faa1d32dd9f5935b03e55cfe5e1eb136b7c0bf40f45aa96e1ceacd6b658ccc1e9b3ba7d70f3fe28ef168f722d84835b75f4edb38039d1f9fa00bbc4e8b4885b2b26f9c3a65110f5243a7b5add2cb1edc2769f7e170605ee9d0599d50966030121da76c77e31d81e5ba18c41a8b8d74ab85a5b41195018efab65a43af449e0e4398e3988a50894128d5f07781fc1297b84cae009631236cb3dbf95fcf5379028671ba7f283ea3df8cb2745b8d0929865a9e91c5e0ce2816e40a468637ecca686cb91b0005e60cdb58c5be6040ebe497b90a9a8b56b506140f3ab8bc7d0b3ada7d508eb40b6853c365db80dc2d4e40d3a847e48e811ec2533d20d264f0bc4aa40e4515d22b6bc57041cb9a5b089ba9789f7887792f825653dd97b9a6413273314927421230cf0c8cfa56c7fa138e618d3b25fa34778d44247133f30db95f4bf933620d67869d322306f88c78c39920e7ccc4003f33d2f0cc7fa8ea07eeee4ca916334c60cf881d3b73d6c28c33c033e2c7ce94b4317306f4ccc8b13327adc44ce5f4210669324298556e44486dbf7e411439c0f38db806da858a4ef0d6f060b35e66674ee4dd99edfa403842b3b4a134cce22b5cf4531165024beaed6806a6ce850d83e010c476d04ebf0b530f00adafef4d7f7fec591da811ff1807c4953590233882da7a73cdc386dd34e2fc5b9092fdabd860ace2800c169a73130a9457b184b9f905f98f06a20112822f745900032d959a1d14bed30d6608712a3cf87be6542b2e8a5684da70800ac2c18a09c21159e80b7a5c5579b2985c2f6f0d759b436cada8856d6ee76299b3215b7f9e3c11988e06192a62364c46e4ba314e81afd7372167748f95a2905a8f0bb100209e0725935dcc9f9ebd7e532c32f9048b00dd6c63a906352ba1b77c9c42c1852c1304fb7513e83e2d4c7348a019f3854b80f4b8df30c58aa7f4a0bce59ceebbbc5f423b240973edaeca54781f6c9620a58cd3042fb8acc5c2e2dddfe5a009b0e8a5a6218302e37e841a5cd036621d6f1128e024e0123aab3ccbe0ced9c74a0ff3db9258f34c77e4b8885a206294321c3de8b70f646a95c15204df203f3263f2ecddd7a0ecd29ed746e503f67fadff19a7c0d5746259f4c83070bb0bc85fad63b9c09b95d3acbea17f01d7ac416f0936a1d5a18f9e8a7d6e4047780ef047b708b3a472087a1dfda407e8237f0a9de28a6bcfa18e9b28c1dc29b27108defc47beb024b84ba02cffcf7ed0c4091abe657d30edeb378d42369dd1c40ea48ce45250d06cd93eb5ffd64467f0843cc76573137f6ceff412d4ce8116dae0e926b02e42c58caf3ee6b9f0c9dca32ed1d768ffe5a450f3668f4f55fd24995294d887af7a21a8b153c8bc66d59040105c3a78cf1db2c15cb87a1635ae865c8d4efc85ab3cd7c7c402bf3fef49e76a5cdeaaff1e019dc739d4b4571d26bb2712437622cc9442fbc74341c12d48f6eaf5be831ab3c810ac13ba5bef1b3a2eaf6017f456906857f747cac2683752c493bf0ebad19116a0c736fd475c039b513f043865369c6d38d42229341cc19356a0fd8638825ee6eba4ebf183127f1be82bf8e757f1af293f3595330940401f79c7880819b6d819f61ec23df8d5a1a5af5a784b1c388ec9f8e1a98e5e2268b33fe4f7f6f7eddb155c246bd5bb0bcd82705014ecc762570624861a742d1f5c06dd0b47457fa69da826804bad756ebe54459c453c965c365fea70d75366920b912b191263c5b0014dfa22d6ea03e8ec26f8a522af4f9832825a3124c9435a4d57ff4a41d168ae0492fff52a3ba497c0cf861fad8c2df24e93a4bd0d46038c0ac9ce595eccaa8367f1f8270a7d2a2fe410b427859e2a33d544f7f0b6a2f7f5cf94beefb8aa93d5f386792ab2ee71965c27df5f9a7b6e5a1580ee4c146611fa9f37127c7e610cada7b5139435e787d7d4cfbcd0f1d65f15babf5f7fde82e4b6e78a0ba37eb501941942efba8261fd075a67d74fd8617704d34699ae88b28070743634c7d50194f838e3c691ef51644b16d61c7a27fcfc279436e409e9894f7fee65192cad5e6109d1f1ab34b686ba826758171b5403273f5a6d358885c056ee418b65c8f82a3d1d3293d061c05a6f386b51bc2c0c2f32f4b976e26c316e6f4a3d6f03a9f03da7633a93deaa906259ed45bc5541bfcec4e77e9f41cb2333386403e8f0a08690e77072d5b33f52212db7239c7a98e0cfbec652f20f76ba1a2b0caf5b6568f85edb7c1a18a4ed6597b15e2308e32012654eda6006b280521d581869695f4185376e3af3fc19af75d36bd28ffef27a716f6c7a3e69842821ea4bb8c94ae1f5761186536339cecddb87d55ebbd7eede410cf3276ad19fb319ee24c664438ec53ac5ff7ea535d2ec042eafe783a4a0327a6524de5abfa5b21d42791a7de65d7c7d853b61e935771bf3903f679f295b98aafc598ecde32bb330877c308e2215176d9d6fca5f9a8b6c0041f540cc7ec925ff761854511cebda42178e07c8477fcccadd3234aa72397bf468ba78c3991c93e248dfff503e018297e5ab9a81e3722a4afa6c5897484364c87e85d29b00189bf4e9980b80bcc7e866060e5debb5f4d414da75c75470d9784d272431ed008d0d19441087ac4de0408360f546df71c59b7c14ebae2b47bea32d87099a9a9c3d84d876eb8a4bcf330a593b966008df0305f91af33918812c5b47d09f8b0c4b2cf5ac897c7723f394642d108e48e4641c3c7cdc12fb2762d8b361fc0ccc5c8690a77b52c0ca804820c9fee06305d8dbb7aa34f55a3423ef02a27f3c5a8021ce3c29e26c6bd0bf7930e861a93d3504f5f828661e3b20b51ae5be06853bab2f1f77d4b668e88fd6dac7f17f5492b309fac76b6de658ebd394dd862fc7384371c606d9747e655cd4db1775a6626c0d27d9dea0fa68e46edcbdde1474f381ee77aedd899bd657430ce2af23146dddcc3fdca4b0c11fda79bea81543cf219fa635bd305fe9f3d9038e3b96ad39f07b0883ba7e0a632c34bd846ae9ff8c576944956d76dc8af4e948d3f20379a3950fc8e16a1aa9e686c12035bd765167b29a07d2b9b03bd45799140425f5fcba401d34ab7078a8363db655aa4d12a455dd2691307bb2f5b8492746554dbe73eb2feb6ece1b1bb06439992beaf2b6bca8c2dd3b58b0921e847d2cf3f953c7874588c0c16fd97b061dc83ce40c93064bb64fbe3346fdd1f73838d2367ba0e928c4d4a44ee09959bf200d86f98c61cd85326011bf4fabf69409d568eb59acf05c7c9294f9588b18568813624e9c98f19ba15af6f8fa9c7be3ef9cbb6e57d14745c68a4d731e772b161cd8163fa97dc2dc0aec15ced96b06670a701d0ef7e129807ac0058e792def87b23582a58bdbc77749d97d2c3eb9714f957be0904dbab6d632146c26e1a1b519d5861956e5b4d1f08d5eba89967bcf72623855f1c9be1c29ac01176804899359d5b608000518c5556ab74e6f8ce8a1c93e9ee781f05632914fd0be2ed4797176f7f66b41b0eac32cd5550d34609544b36255ee015353daca301e4d70e859aaaed7c0a4c6da3c1ca8f290baa17a15730f33705098727e834d27ccb40bd7b8a0e1ac7ee9596672fb7321fe16b4cc0fe71db39ad7b27aa3a049eba7e0974bca1f3476e5950a155624c4049b788310333b4b52ecaa00043af655f7c4af1c08eea3fd785c04a95acba2c9975dd4d0a56eb29a6cbb18d88117232cdab75f7e6dabc7d2140bb352e51cde421dc9200228af321555748ddd9b03f0facd297e3abeff79c7a5f0c651ee99c2d762a3a40b219a8c77518c5070879c17444736eb824d55b8a3b06bacde020d062f2a6021fa2909c566806beda3492394723b258151a907aad0b5f1990f7313918a7867b299ddeca9d21d9558788cf9e5ca9e390661fea57813417067ce44b18d9cca36274ed859e27596fa43f89cc72ea0de0b2c13d8d4c41e9c355476519b556d27c27d1e4b772b3b03c06083b3202efa8eca58c81e53a3060631a6a21a132de43c8a5c044d44fd6aa47e7cab2a4892e2ab7ae66dd12962d1e70976763ac6af0063cd6a5508c39395d2f21907be538e5bb5af2a1a4d20a0ddf0a6376b189f0f51e81f590d52f553017cebbe1ea379a225fb912380753e63d4f3bec1f82226bd90ad6a02a1def25617f40dc07062eb0b0b567228374ac5078c3587a92d83f247497a83e437b77b28087756cce2ceadeda5e9b8bf52c5c93d8f524be5ab71c0ffba40cd19d9925acc8d6d45ccf5ac34b0ac19487eb14c465bf8bca7b1b501d47b445a2360e786eb465da47775b19bbe9009135e03f7bae64ee31ab215435dc2546c52a2885e480a998a3553425441778d20f11d8a223dfb40c72730a14f6f3760c5dce231e08a0fd4139730763ff16e91fd24f72e5361a31f4d43487c0f27086124288bbe2fd00a0323002062acf4db0036a5d7c0974c5f75d340abc0dbeab28cf4547551c5a0f12fcda0243977eb49b540ea4b3558775844bb52c973a3f98aa790c58880c6dfd46e1831e7679280aee66f79205826851bbcef33c049bd1df762415eb60b00b290615a6a0be09eb78f1d46817fc316ad261ed8029dd4241750ddf2b18aca20d6802e4470cd30a26a4845db23dbaed97531174ea124db070c71aa9bb86d9545353e79041c19bc699b14d2e6e3abaf534e7ed2fd75efd0687791b8f118dd730d88219fc46cd278472df487ac3dd09a39615f23ea996fc0175963f33637f8a491480be639653c86322106da8dc79a62847425d2978cfd6b73bda90395a067adfa28cb039d34a6ba1b6dcdac30046a9d57582e5c2ac238e42bee69237b09666c64f980e69106f582163beefdeb481fa604209a032d24add941f08113872975e507a1c2afe7765662b036da193261527ec65f228955c23ea2ab0a59c5b579d063c8c3e96499267d04c27e06874ef8b9cdd17e6a48766ea1f9d98a3dbeee6fbea4d71f54747763016a6980d0b544b0adf660435646e502a5ca13e886c20a3eceaf540b29a2bd592150f5100ffcc93d0c0f209c2d7fa703e28db03940148318124327b56a7d1a1afeb9f9243badf66e94ce035acfc7f0cd5acecac50baea030ab869cf0f11860a972ff0635731b6f5489f82467f9ec114acdad506b4cab2d3a2955f305b5c94d6a15ecaffeb4911f5ad18e811018931146972480c008648e233c69a779e2be12950bdfe1444de150475fa8f1a7805c791fdd9f61ed605fe2e99fe07fa3a176fc2ce8333f1f2002f274f560d948199085a738903b753846c86856e23fa9981f3302246d0a0598ad82b589b9e45d08cd5284cceb3028eb290aceb8077a019262f1d99611cb553fd93e358e6f5f06fbe8630245694a8515478349e0223a27ae6d096148dc86d98ce9a4ba8b3fa34188124fdac55858e98fa186a07c23c9301317cbdaa261249e631e2ba572e6de1ae5a700dc21b6b7e90422ac37e04318ac9b616d9dd42548482f6e770f940faa2145126236b8a2ad690299ed6257f5f894fce70389432f15b1a60c68676772d496b7238e16d875d505a3685805ca2db5c4471613b25361dcc74426bdc73f5279fa8f23a7fa94c04724f0d95653991e04de23ee3ffd217e0f1b86f60b06aa1420a67349647834ab3fa6fafe676d50aabd13fa7e3904e82855d8894e235c850f95987c89643e297e7136145d4cd741d3e936073e77dc80abfe54b059ff994479cbbf07aabf3aa6f147a62a61f2191a63242d40734c7000ccc8cbb952c46c5c3343dd0a17f579673bd669aebd77ddf1293617a4bd743f884f6c3578d9fa805c745a7555c4a38988229689d140705946c5788854d9b70166cd0bca1403ce17000b5adb70ef97c486711dca4ae77e868c9ba7eb30b847c34d08e4f938cb2f50f2619a5b78fd1042e0351353616b1c71213a035e3dafe768057399ce7705e1f6ac57f1e1a8d90084283a2c23c1b977c199b07787e458871b79a589fd8d450547dbe17f4b6dc6a1259b6aa9bfea798042211c6793a77571f1432037c4bc061a07a8e42b7fcd8dc517bef25ce2ac005c6f0960fb9653b2ae3edc92846975f9d3c01b6788067411647925e92fbdff7a9a845e3037ff85e34e1f0e483601813ee91aeeef8ebc1dc1a33282e12ee1503107b74966720d18a9adb7573f4aaa1c11534bd8e375b243ec8b6aebafd89f76bc1258c576a2f747bd31dd9ee0863a4839d55b045412915584a330c4c6ac0a2808b48308c8ce88c181d98ced1a863af89b88f38a18d1be86af29e72b29d012794d66ba27c83304d7d5c30739d636d77fadeea3fb2471d39267885dc90f996e9e67885db8ca4013bb2ceb2b6227c4e709789191b08061b344a95be2a13004870b97fced707686b86159003884beeaea168da566c3cf5411eab9326ac56e4f7571b5f1e7dd688a51bf07ebe26e2c4873e2bebaf8927a2491aa3a745a039a57b18686ae78ef47addc24eeb8e9847bca685dabd89aa6328b8175cf9d25daba005fd415d7a045ac5dbf548bc94f3b46c8b2a8e473755f4b0a942e005c02e313b69fd132468ed59d11ba8812f3eec0eb4015fcf22f72a1e9f6bb5cfbc9d205b110caed0d6635eb55eef15dbf636e982503be9851fa965b81a12ef037ddabf2d4ef1e0207bdce909c9d6ffd36e2a5420a318a412ccc02f4038992cc3689c53e5fc3d28270ba99f75ccc7c052f704d74c3136a87f017bad377767851f7b2c7f0b4161b839aba7ae4d689bc1a9f8e5c505275c41af6d045ff7bcd2b3bcfdd1914b3eec3aa4f14e1d90e9aeaf244f1c0511ba8d7456616fc1db84753758343d02c1d124287b7283ff82ae8cc2ba0dc4fa5a06fa712b06e842def1c0d94ee6c05a4db5ccac50ddfe4574d37ad02e53e95667d43a9f9337420e9e7d52adcf8d653f5cd548aeac69a7aefab405dd762a9a41be4c6d8b3cc46fa6afe25b46fad8b886729266875a869c68053afb2d107e6044709d6e74b866e0fb98930a55b223eeb5041ad9f38f22898aa2bdda2309822b97c042ee0072ce99c2ddd42082a0c89c49c5fdea096e4c5cc6e906f41bd0f6bf5e253d82598d8cc26b437cab08d4c1601f4dcf3e8b28f28b73014ebc95c98694d5e8e8a603a09a72a7d6c662b722911c9084a82580243fa0188827f9e6569baa54731c7fe370d2eca0808a2d04690b29694438d86ef8497624897fa28101ea6be960d05712a23bc489f275ddcd9a46e3b417656b6c1f44a9a9dbdf243ae82426069038b23e65192ffd9d3b5cb1d4629a4cba912060898db5b1c02bd7bd20c28b8c37c368621c0327095df2dd67b459a564c84bd83a0f898406d4770c9182b4d4aa17e4396c14682b1b552f449fa474515a50b4b164030caff0a4d67324fe8528cf802b0101c526e8596641d1389e409c002dbd3153eb905c9198a05e1a5fceedbaaa27375a93f78b58c0983217ae2533208e865badecb3f3f6290ac5ad11ea9676084ae1cdc6e7be26c6b43f0d2df602ec880218c769f5954f4093f215dab94d16627a0e20e682e9c9a572090eb8e09330bc2e01651e521c06f4910602dcf04070593dc45812d14581e0e0394c819efe01096ab6d80fbf2eb05e44731e60763b07b6dbea07c0e026fef353879c1696adc8e251779c87501747d17c9f228f19ffbe791c42956025ddb8d83491439f633debf1084ac0515510008e8d9fecb00c0ea6981286b890d43bc9b020c585641ca58542c210a3267e04149e6bc13e3e0046a79f679613823d6220d6ba69ca3855ca78998098943318444c25f53801dbed9f8a343bd59c5b55924f2a6fdf75e9855f4d40763e50a2b29669417734a52a03d1fe5bd80bb721d79bc290fa2b52d227e4aac9c0576e905fc9c428cccf6965f6a15ac2ff4810e274f30a6423241e4e31b5f6d88f06d135a909189fd3a45ea22b3a614a15345d6b552842e26c2e3f2d14d649f2a83e5f8b729c33c9580b05bff20340b84dc4dfea311db926089a4a15e279435889f117f112d21022be8053095c95e3380b72119fdb5571c2216e9d8142a7c212b78fe35adeb724959de4e2821a9dd4baea9015784837f68828a1e65635f2305d042fc3fb0014071a501b91f497e232a9035888a4b1c7fab4113a8fdb57855af676255caa0f0e220c26ec84bbbdea5495399d4ebbfcb1bf9b0f846eb3d255bd29310a3c63c31222b70f15514f1f1f7bfc08259d5542270017a0dce17496658d9245d5fa19227f0c04872467e5e1d6c4ae4203f134a1044036569222772640175318369c12ad0a5c8dc5700b42cc16a45fe0c6b9c2d4fa00a5de2451cd88a1f881451951f85f4820abfa21d252a8661a234038891dc3401a454efe40c3a475c8824a7ba93f19d9c2bcd36b1ee27142024f71dfd107fa42c9ffedcb869bcf4126a3fc9ae02019ec288a07e43b23904fb19e481fab5dcc818daae2566d31b28a876958c411111a58fdd256695631223a77fea95f45f216a431e3915603fccf8fd7700e1a233dcfd10dbfa60b0b65d20a08c075fc9f5eb8f90a3e3fc4990a92cb7633fb15f8c1a11b683f7b346ef877cbdf0172c31571650af0d6cf204b2bf142ce0fc3518c3f172e364209d6ff49d5b4b699540114480040d631f9d2e8930f89b26ae1b83223d9adf8930fc06136d1434e358d0c0f239ff77012ce3d035b46c0c7ffcc06dd08e130a61e72240150c6fc8bc9dd28b1b1fa9837b3072af7f3304fa4f0ad3bdfd622efdb5b505f583ef48bb8fdac04febf59539e43ac2398d7f615109e57581b877b5a4ea802ba87d5bd58412a4a8b7c0c7256b57079412ffeb240d2859a795f70681d6dc56f610203be5eba6faa867262e1a9b61df613a5b4bb031d3b7a4758fca17375a8e7918a4a9f127a00801ed78df98f82492ac9cfe80509517fa1c72cfda252b18264f1a63084ed062deaccb83ef5a6faf2be4bcb75b6695dbf86fb3ead978c035cf1db25dab44cd2b58a8780e501235897f00292b65f7d49f3c9ac7c63a9d4ee5c006daf9d9f97e080f25f011612f9f03637edd50e7e1b26e441f6ac4fd3360d94caae4eb540029f1561bd88ace2187a00e862ab50461cba9c8a11d3d8ea4d09883ddcc708c7720da403ed8f38826a515a4a7dfaf2bd3c413f63e7a56d9aa4e2543b57cba29761329054c9aefe0890178ab19d284df2dfc7b021aa4ace363cbfb0024d0144c160875e8d2492464f49b419558d144d51be529f3d6a3146dc1ae9ece67d914e5f3998d8f447d0462d56a7c7a75b858397fdc1124fb675ae48d910aa453692d0ae15d686dc53cd842dfb8a1858011e23039a9d2a6913bcfc562f69d877d63cd432af40d1a0eef1b5cd9929cfe94d1c12d2f019d6c3d20bb6e40de4c28ba40e8bdce77964036a38c5b4f2f50de82b59484b30577d9865904b884d640af5f40163c05d65f071c4334cc13ccd925f00322f9c268eca046760f3c32c2ccd7a64679b8ffb028675690ab0ed05a72d907a1db81e752ee76a4082611761aa6a3a490700659588d96ecb9e6bd7d5a6838c01afc8e42c19635707df8080bb36c9c3eab64225bd954e5eba9f97d6deeec58810dcc3db3b364bdec25df1e0837bcdcf3445a31961b676783e82706797375cb12b4477fad0be564cca013da8b9f5d0edc3f9a65658070af85e23b82e0efe03ffc04414f53ddaec5caad7484024cb1d620a2bce3132ec44d0dca77e39e81f727e6b7ab3943bc6bb1a6b51b1ecd9359348934b9d67c16b428f0e126fb24bd6854d7da093ca62b1d0636309710a93ad5376046a8c16c1dd1417e10b8e9d0d5fc72171985fe7af915eede448582a97e8368d574907b022c1eccc582e54496d669b3324556ed2935181bd5cc52b2a243724a533d04293f7da46fe367d1fe03b2a0750e5b01a7d4700eecc3df0f1f05d0afda7c8b1cc29a16adc87c94653d6aad7f084bf1145bf1324cf937b2abd997793ea891fc41a588d6d219f2261d3b0991f6954709a6c5dae97ca4c3a28cdeb8ef2d18b4c553b8249bcc1a08fde0f2b0ec5e0e30967b6656ba549c0bd37db0ddd6defaf3c539d6eb838b788732eefb00e9eee9275095619a4de9786f3ef80e9718aa0bde583b5aff4e2b537e5533360365a895403907116049bc6e8d76ef146d728073f232ae402e905f616300d8c80eb60593f7513cd478a062619f6296da3f03623b5907e2624841f3d6f0b8ea5f9efed2f04ef480fcc3a1e306de81b08c3d8d5c07bf195020011c75d00354edb02d24062b823c3a9bc7fe689625b65ca456c3c7b69854d0e585bcd6c25a2d2774dd0a82d0ec0bd5bcac4cbefcb5cd67d96a8081d4f4c07f35abb61b83b08483aba54551578f7a077da027151608c24429063f82054c512314ba2bfa210074c1693cb5e114f1e35ba9a593b78a2377ac4f01f9070e1fe5b5e69c122bfc95208756e415b7579ec04cf82919f2abe8b6f02931476897224415abc8d0b98da5f53bcf6f2f834a27099fd03780185a84c7bfab8611706f75bf69af1144f35b8d86d7d4e248fe9431fdad51ea65e35e57c7b3949f323ebabe8e80c2b3125b20c74e42956ef7d856cb089a64013a019bb41bdada94bcb77cdb702a7158a91d81ed090fb0e0b23ace38778a8b856500598c23918ef83b98ef5c15e0e08e8e687e1c1c30bcbfe8867caff21fc25701e1287d3faef7a13d0071b014ff5a2472b02b2c022ecc9386c09b87a5a1640ac261906cf93e36ed13bab56398a913287553c62d375f97083cde3b87394e2d915e7d99c7e5239b9974075da2905689595965bb04cc8561074d506cfeaa2d90ad112497bccc332488bf9a07f42c3709a0daa838a61002ed92a56014b2bee5b0c6c1a64c9cab73ad661927a77c87bcd6733960377a7995d68c4152657b75029c912dd57971c74a1b5a66d41ddb9a034076fd840878aa113d06eaad84cc0782afe477ea2b0b64a3c07a72e7acbd89b1ac3a3272c013b318a7f72bc1385f4c000b1c419a8e4300493ddaba8c55b372338d1423368227f6145b516bbd7cdfac218977c620197b98c47a0f39e116056678ac5741cb13d342be114c34cdeab99d4ee74fcc7b7c3de6765b93e93c2ad99688eedfa4abe232d954fe340cfdd8c116b8a9470ca327e53f1a77a2dd2dc74da7ecf47654752d2a2a77018c4759606ebbdf574cc8db3f98ae6bb7c45b88337408c91ca6246cfacd3aecd625a98886f39f1a06c7851c6ee6af881ba7b7fae98c220cfae2934c45de8a5d216675d3ca17a88eb81eae19585cd5e46c8fc358060d322bf028b40c8baf6bdca14e4ac2f6cca0afe52ec262083705e28d2ff4844ab5ff5e8f0d8249ad9ec58f22f1f55cb44fd938e424c31e470e0096265aeede9da89677c4d30267e0c3a7da45e0a6b5dc5d927a1acb462ab576e9bc2ec6e5c1eca7c73c70861b279ba0f648f25ac65358de0cb4baa139e68e93a4e2998a056041a7a2d3c572b4dbcd0e4b900734f2046c6de7be9a912ebfccd5591f77cb46022d10908c3308c4b810e8c0e11abc0c8dcc93637d657e3ce21dc75e3bf1e89b8fc187686d001a2519f571f67c958065411ad4c713043fabd26eda780803d2764c1c4e629573f95aeea8ac8dcf67d9c9c3ad0fd7af529c6bb9b09f7f9aa5962bfd8768b97f91baa5754d4b1a6d3310ad6070a75d14492a2dc5f599578eeda03eac1f76b437f4168e508cebcdd7a7e295bb7c634e1372b21e976bcc77c468226b65e2731ca96de4e50128ed7233439093886ba5c02ad2a53dc96b9752ad5e8f191cb63d28c644e5809e008db48360b93bb687d79502ff9278b36943a1b713de376419a9a7132099f420587b4653c984c22a4388a66f7578fd070836c235360c8a04da04d2b3f3402707a5681de38f7362580e03c1635f4de17a7ff4ade1bec9af650672110b0fc6507787ab5a3614499fbd80b4b8021dca110f649c01e792a6f2f18cfcfffa8b2b343fc70ac4ad1320e51adbd8feb442f061ae11e2ec7caa5b9da296cbfc91fba1c306b280e0c7826975aeecc4d6eb401564dfe5ee7bf2967f530bc597736421603019ecd29616d711bb78b6463dd9c5439bfcc1a6c65362b9aedd623c65a3e45b5e3c25acd7ff76a9584b53ff99be1fd7d9cfc3978aaa761f475ae969bda21fe811fc9c5d308da4625ba6b5b711ab980abb665fbca0dc665210bccfafe3664bf97408779c2fd399cbe4ebe5d7f9154958380b417dd18c1bb659b1f1e4cc2f6df9527a6ddb60f9fbe49b8cb30896647a66c1edf731bfe822f445b0f2bea267b39df70a466fa8378dcc30a69209bbe481e24e83d0a6b30178e20bb9a4785024480635d0237a393075b7cf890b60526e20d9fb29e9b56c5ba7c89ccb1506ac5ab072dec806c1325a700c0c3d1db1c70ecd1eb7786a8c3ecaf92107a48e148b01e0c68fd1dee68a839ae73846363db00fe058f68d73412e4a996e6b03d91efe58e156ae75df195cb752c5e8005e66ae0de5c0a5eb955eba1555f0086e81604dc2516c6be45541df938c44b0f9075ca35899edd226a10edf2ba08c2f32ccfc67884c447bd77b9caa9cf6f37997328401138ad0f990e887ba8d485deda71a88e1bd378ed82bba32758b593de82c36d5931363cb6162b03c950ae76da9facbd236146c3664d54f00dbf80373b6e17a36a9956dc79f8d4b8366395948e00f21c70450b77e5a5ea2bc22b1d45583eca444eeccc78934c8f582604047fe7666aa9b836a47e11812e0b19e874afd900dfd6011665f7271033a03fb58ec03f73c80433f508dc2b9d2d9834314d5a40891f1a0cf063b2fc6d4ac82ef7527335de033e61b516341775279850e7214c6084ff70e9268140a19e9f71a13dd98f804726149e716592078ab6256e2a8eb1e1cf4dfca9116983e0c708f16e83f5053be8a9c847789ec16c66ffdd01a918930b8cd59f5a0a2f822e194d017dbd6d8235933e4854716a28e9e7a1c16d9074a801017748c90fe289ebf9fa31c70327074a4a569909e4e8ea9c706f39d789efb2bdcbcb2dde2c0e774e64113fe4d4e8e8d69207ce790a3556ba90d4e1afb71a4cc105c35d38412453f34de3df659284fe497d3e4dfadb6c52517e01fbb3d99f685470495f85e904d6bf3aa11c86b2cdb7b4da9f26a00ad64d1f31ee3e7e64372d53ce7fe5610b2880a3b93f1ff52862baea3faedac5810f7d567a0602c56fc3d0c21ad5ef673a711ec6339bee4af4da2cfa5b817a090e24c3076318f48fe6f13207f7b5a9639944aba054e14afa44117cf390c54ce367154748c0cd94eae6c809b34f86b6c49645fda49a3b0f4e96c020693b21f21f907159cb0d505e4bb5a2cd607a967269c61458959b1a39e7979805af402c47cd7e441b03fcac68d22e19dfb15d9c379710df255204d33b173d3c5ce40b303510920976f57431d826ec21efcdcb71d1075dbff8b1ee5f0215dae3fe7484a47e221a62b73a5e40fc4c98cf793bca4bbe615f5230379e018df8d6b4815fc3928126d6372a86c62518caf39c7dd40fd656a5a91f359da96a4bc72d7c506879ea3b008618ac08fdf7f700165727a2350e69644e8da265413e698e4d81ec1db4cb8a3feeb4d823b0bcc51a4b372b5899308596220a659b0d5c484671d7f525ddadf94e3504ae042bf207ad8e1f099f46a7f222b65a67b81c35cca4207738e1bb3b23dcc14c253d47f723e7b176f86400663fd096ca41e57f531e77671e1e0f42b34d308b1d24e5775b821712a28f16eadfc711f300635fc088da54ae24d3c31c6873a5589507a7876d159ed6eb356e8d41f0f624c3fdd12515d0409ecd00f2f2187a64a8f63d1becc232ab15df552c8a4870e26e8fcc7a8594a7ea71cfc8b147f5164973436f3e03153ffb6266b32a98e45833403550e0bd181dc18bae03326d876c36a899e329621ba5d293b26795764d9e92a200c64388c1647aea48d452de1f37b7c9809c2eda58244e7d73a2123d8971461be1ee220b6869082c6f1889b44dcb07fc1bf9d4605b68dec33fbc4f48f1389058e00a7219e67ce1efa51bf61922cd050f10bdb7f1cda062ac405b3f0d877fd39d1b57884c5078ddb0ef998e60e3ef91a1fad65d1936fb4e4ebecc96802707f68da8251c678cf7d50dcafff368163e1b3e5ae0d23b1606077d639a5464878a873aa5b30bd32b9b5ecff6e8bcf2908e7c68a57dd9bf9878b8b9466cfe8373e20ddff15353cdb1e593dbcbf5a74f546e67a415404b36affbfc74e3949016e2ba12adbb47c09f83ab0a7131572f2956e29a5a4c24a427d062059aa74fb5852a41dbef34682bf2020525f2eac5118d4201305f83e7c86ef186c7608659d3c93c560b2a16bee6aceb98e1b4a2f868a77384b3a32bc734c498dd72fc05464717b47885e9e15fe20997860b9ee589d055c8ff5172c219f79ce2342a54f6a0f702eb632e1fbf2845144c3526e980708a62771eb8eee376defd2a0941744de8b09b8567e7a53e5af77a426f791f100e419e5d482d1364cd7bcaf72880904d2bb01be311de5dfcd238630daf633efa0931ae6f8bce5153888656b7cc5967e8af45e5aa00bc61d4ae26e1c90c149456f01e18e20a0a5223e1abffac9b54ad0d25da47baab132075df84e09bae5a6a09eae8f810cad515564692a774539d2f30b6a4ad792b794fc978eb2a9c809a1e16fe827493d2eb5fb16e524d78d4faa7d4833d12bc64fbd7e574b8656bca2d447eb245789c12439860aef7ae42ca89cebf9a41c9155c3bb627e538bc4a570a6924fb342e428834755fc5a11c2d5c04d095f5d81340570bffa2a95cf4375586af19b5825110c58b469e838dff17f0498126456ee2ee682ab58151aadb818c5a2a9f866b97d2144d7d0f997f9180c56f1a6b528ffc0da309797647a1f60ca355d29d7412057a174909da9a0d43281112d315f7e41f382c5edb367117f54e38d21d93170234225d57d32de69441fb927aaf23fde2b79e519f197a4a2ff0e8b20bf9ce760c6a678df30dbc9ed7347d44c8e553940888663268726783a8485fde2809c7d466f0d5e0ba72b5491ef8ae9a5ebb1aec6758df9ffc582d4bb2c74d2f61111683114ac172dbcd5a7487ce7cfeec49dbd4e6c9360d93871fddcc21656534ef4f7058026663d71f47bcab0492a8fdc0f15b95fe281aefc83f649ab7ac53e3ed54470a6360fd6cc371ac1674e61356ab34a62998a05552ca6395de3484180036fc9981a70bd506478c3afd6e766bed4fc94bd747b9f1e34c28178b72a5a0a462cfaffed7c4951760c31fb7be72e9fa2061b871ff356e809a786367fb8bb1fcf9f90cc9914c58ced2f39b58c8453637f753e557c943db6eea7a7fa18d484d24351f375e1799c669368efecce0c1af8d8dd02f0b353c46768db5e09b11400c690d9c3fd702df34fec4841d407230744d7326d0bc25bf52654e63306aee07cb7412b04b939f01180619afee5ec1d41a7037faa3fb8c76491c9c2cf5f244b66df68f7e934ea7d505117e8bfcd03c80229abd2e982136bf54d72d3619276c368981ee8561d3347be836b059cdab9f89ac48155f9123b4f9def89e713345442ca802271cd86417c36d3a9dbe765b6fc2f2f233a329df0c0289385419394fa589b8bd01b41216161267d802f92618a30173dff0aea501af8d3e891106b1538282a3c27cf4f5bfe4bdf3691e5c39fc5443825cadf90616d169adcfa93d7cd9b291d9519598741b7e8a311f1fae38251a74c06363c97d8d2aadd13ac59cf407cb5bb6f551e43fffe82fdf82c19e3ffb765558f1a636aac8ff6e66521c6dc19dd7773527a5e1fd453a2693a0dd4b49123760b118489293ad1c76a5805c8ac9698fad26ba315d4e418fa122205e2e80cda748541a6c1959eeee559b4edc41abbb061821a207d2205be825b516fba9925c6e8af9eb21e8be21452f7d00d425acd07eddeb569c6574a51a08cf8198855cc48cb86a0120fb4ac5009cbd0883ca897e8e5adc2dca01a4bd0d83a8d3f828a0118b5fb266ebaa5462189dd9e965a54001bfc63be31a110813cd436c19676d8738bf0a6a19d449471fa94e01ca4632283e136961928443e37ab3c2369ca77b9c9287d017af21b10bc6c1f2b3779aec62434ef47423ffd4b98496a1138032968ccb54cbc384179b35a29ed1ebce6c9cf17c84f6bd8f77d1c3f7e291bf42e91535508e1b922403e827ed403f775ae45d3907c54f22a879dc9f5818318cd610c6643d594a46f4d5b6fc800a2a97d543198b298cedc97286c2453e74b574f6b338f745ac1c678ded403f176a9eff35213d430531b1fb24bc23b5bb4d50d5e88f12767f973cb067931d5726c5c282db75f2579802e5d8c0abbeb8d6d2def38efe3d62af2133f8fdf570275f60e4bba187b29864f89cd20267dcceca8c68a28f84672133ffda9c0c37382c194c64829a66e0edb4882377bee1beb28d56406acdfe001f70b1d9f33c6cb61b496d2685f9a60a053b6fbeeb1f4140d64d0e17a8c74c3b33b05541274f4638fc556b427f09a7eaab85fed5690e17c001155a9b70498226fd2462346d825f34794239b50718268de66427d7f2121a18843af46dbe0def3992c3d6af00052f7bb5e1ee662eff90bff25fe02ad5f14e883e8344bd6ef399718f61d434c53a1a7d9a3c8838347b5d3c1530c4cc29534a66a20cb018ae186622219bef3ad6c48af250f7dc2eab581089623680681328ff2f1146522e4d597946bcfcca8f045ec678d43d0fb66434f64989efd49fb0a79dc207f7f1d39ca6b100b03b5e633210a8059588bc8964840bb3b4a060f4faa198f12b2d18db4433f07d0c5145c6009eef34d0bbff963ca1c5a79fe995188f778f19ddb0230247a73234cba5e4d282bf9291cfe7a5004c42d8d0762ffb42160c286e49f0b19575fafdfff825e7d2c48a57e391e8803d8ce1292dd69c5450820a61170950553e04dacbe037f27d7b877ee4c066e6fae5e0991f4c3d4e010a60a2c1594d8544337c910d3452d441b0d691f86585fc17d78e92d3d07147a1e7a2ef4d4e9b52252fb5e5be1e222be71edca01067b95888047cc96a3e9bb35500735d8faf3509d5ed14c0c041c3edb1578c063c68af88e368822fa24380304a79ecdab978c7c637c54921927ebf5e6a8338dc26ddbf5352ef46620b72a0c2710c62b072d76fa6e518f5ff1d3b12cd53b20a298984197050f8b55e88026de10c0c3603454d2c265809f1144ae101115901126958179fcf16eaa41769831071eb39d3b36c8cbca5015a30ec1486e0ee40898e6b6254aec556dd1099930a7c0d85b5e12bf976fa176151acb1ca0d328ac659b685012702f29c690eee9c9ac0d92150b1176a613910999e2ea2dc7cc1d5d8f127c47a012a033e83f0da5e8a925a63b53ed5e49692dee7bf2d2307581f7b5c2922a5b69cb1726f5cb5204f491f2fc4bbb8990acb6b4430419f967adaad2f4ffaea7030c1123c6a817002dd11321452c1d66c5e4c4b0803901fbb7924cfb00fea1cabbe7454b98527a9d98b0f5bd8a8ebf3f36e52685a7431b8120887b7b671aa243a5920caa146304294a9ace20ed806b6da78b4e6d3fc2225cce2d134d3e3d436f2b52dbd1d305954e9064f0e886ecb7c9a88e6d8797ce2efb83f9516ee3c0ca207bcb1e0c0bd887f39aa4c44ede104c22c132ffa3a3607ebd1f40156f08e83f0054e9c46ec5c807ab812c5a7708de2ae115a1a2c20ce018a9442a045d3205a94ad1d9039d2014024c468fbb63873dea36329966a0f2f4e082b5d8e7e6b80ab9fee0a76c935af1fc7ee3d68d00863d81842ee247aad77105b6cc27f7cfc03c7169dcc6354bb8e33cce5279054d03ab2f83c6d94cd351224a00b1d9f3663234f46a78a7407eb11ec5521124be3d8513ce4214ada4a85b8017c72d4f16d9b94d541e277e1afbde4e93c3e7246bf324d1b7525037c8e70c7bc26f759ddc97449f15b5936c408c62e6c801048e232f7c4ce7277019c199c3e8c69b2c99d3fd0871782307cddb19664912e702e650d7d9414b56e70ef539fa665b654178d84c59bc80dfa4fb4f9828333bf3328707c1656b3c32c09c5b8bc9e88498efb448dc1b38d0b3f903be35dbe00cdc761061bbd13861bf5e70e9dbc2c3d243f80fdc204527cbbb0b257890b3dcc268e1675082a7c0da8b18245fe617887debf0628d309caec5dd753001a0ee5446af74f595692768afd13f59fc74d44ca2a0c48baf9ba3733ff2e4b4bd016abc24fda0835242cc69c884a0a4c91442540e53050e8a8357388a994383fb42a84a052e8e781eb2f88f07c4822dac9f08f2d5aafee072f93803255475f23c35f55149c141ee032cadced7065bc41260e500ac8a743c006d5c2fc83f1296e05866ca9cbff4c1cf06d8822cbf3f7056101f278f0241b5d088f487d8fb598a348376eca00b1d90bc688382ac2916548587c477009d9a59fc322d92c48e96d0d346679d7fc819233323fbc0e56b4a0a7a229c9f931d48e2c0cc131aa8212bb9823913914f8a5b4a0b719128404a99ec156ba6bcb5ae878ea100761b889c2541edafa0412b81f92cae542b1931cab071a4b1614a6a8e70358cc8b06bc03178cbb7d9009204a939cc8ebdb11c1e0cfa3ad463fef1483899f69f2d67de2cf7716b14ab837cade5a129720dc950b9c2af668b44677229d615209d0c5cd4b1c839574406b0c6597db63890a3cc553d547c6cee8fe1a5ad1f8093eb6aa92c78e85edd37bbf1e12a3d96c852e2db06b0c3fdcdc9c01bd372570059f61c61dde7779b3d70fff0585b20d299d3b1f87eab2bd55636dc28dbe45daee80cfa18f6308d966c81301f3991987cd84ff4012131e138b7d3f6fb8fe87008365b54d66980da82a8deb08a9934c4ad3e916358c188da5ecf1fc0544b91c75e20f89839464048ad29fb438830fadd7cdccffbf6ddbf5c6e7549fd4f3e5eacb2f2ee93300fb8e979b6e8801e9dc16165c9389bef693169746e1531865af949a4a1b5db889fc789cd40f28224c54f5c2e8a15cc2e7633df1e2b5cb32cc2bd26efb45c5008b2fc280a6a31fabbd4a427f67ef9931a819e3e4bde048ee049254a7af6356a0158388826d3a3348ba83f12ac49e83b1595ec3ad5e3da4257b43129fd0c9731c64fe9fccd9e82bf52e078dc171eec8d2ef13b3ee5f3f9cae7fb94cef72bbdef29bbbe87728d0c0042ee912f4156b5fa616ef4c4eff82abdcf513ebfaf7cfea7e47c5ff9fb9f92eb7be5c77fcadfe79eb23f107f8852dec169f3110b53d7fee06c7b6a270d27a0bdabdebf6f98ad8108319fb95da3483a9532572f6b231a3bdaa4a86012dfaeb41326ccb74152a657f1197828dbee470df8e69db07cd1206dc5ddd65a4f9611f0ba50704c7caef9510d01810c95a4226a0f86c06970170a0afa3533b1ca475df3257260d995edf12053c0aa3bab12155d09dd98283330517100ddbc4097ff18a05bbd03bf8376ad359b1135d1edd40a55272cf7d94988e050b2e03fe66dec32a5d66b02de2420e9566ed23447b5333891e2f4c668f96de1059a12411377244fa94125011bd7ea2c33d43f555fe6ae7c6d351d87a9d7b871724649314d14dae506681a6061c9aedaf7fe02280a4e2cc5bf210d3d0b06246895e3d1363f097c336a1c4b22807599858637985700e8e7c117224cf235d5d478fe217b9e295b42ef090b0e2b77f07b2c31dec11c84de0d796612c4c07c42f69cb1c90bf2e8b02c545ae8ee128fd0d62b2c6b5f6ceba1459131dfd03c00bc1a8215e4d69e658d360e7f0941f81d6d761fab6224cc3865d2d8ada475bfe19df20c454d57ea796da622b87ec9433b5a29eb1a873130e486033a6286795a30ceba4a079a17ed98da12247a787b85b70dd10724d0a4d1a462a380992b0d76e048b60cab0f81caaae3e8222b8859a9c0700800846110447d77fe3806502ddd51b013b8a67aa8aaf62d031daee07af9c9de7b6fb9b79429c914a7078a072d075ff4764e977e7dd2078b920916824c9104526b4afbf4f66e98ca98941155ba28a1c34bd932cc195bfcb4d80449dfd20a0f443f2dc9ad23b7e0c2e537894bd24f04812533777377ea4bfd9054672984594a7971e8cfd9179ef048d82fccc313fefa7a64589be5d7231ff34ea1bf137a8aa83645d8a5b34dfbb2f7fbc4124cdf180c6ab8503d3a29a8c0ac900b69ef9c10bfb0d6d5ca1d047574168ae7439d1472e881a250ab13866ab850504bf8c04950f1fc45ad292a052931f9e8b2aa5e497cf6c81f56458d4418a0d74c93cac320bb8edf7c5c20d3b7d863e2a6a9514708e105355c262d0ce147080b84c83e46010627c0a59ae050d490dbe3189c0066c61022dc51da7fda0f53d41294d21392d30f12901211922b814b3a45daa374b57221dd4f354f090797f75c7f7dabaa828a55d1bd09cc9a579ab60aa72b5f9e7d29c0acead129e98a98a2a42a4df8c9b3e49865b35f58b10ff78414d073f5a7abe2b486f1310b308a26bc482124851829b8f2bd5300a816f3764322cb4085acc86c98e08a2cc69c28849e37345a4a29a56cc92c1e4a62e450473101d4ea4b071b0c3dd1a260d8a0cc1605c39c73cea1213a0445c2e00409b678511d1e29e3755d2e7bd64dcef951c902338f11e79c733a0771190c50d21ac605df2ec7782205dfc1d39f1758041048001484124d2ba062a59d2c410433f315467255d47cc8230b1adf2e97207262e83bc909167c273d914483208f3123e8620c2b9868ead26aa0259ae8ee6e9e0f3924329e5dd22c569efdf2d9418834d6c8810c2c579ab091a5933e230e15cf4e9192b0c4e0d9650d41784e092f5c77b764d60658989e9ddd4340020dad77642b9e8083678e08ec4a1a4ede06202c2e3479c2e244861732c292830e58a6047d0d47aba3f99ba44568486785f135af6bf696aafd262d81c60f4baca105e8e84a12950f5d87d7a853d4e824f446a99002fbb38338bb338207cfbefbc1731733490736877d84def1400d5d3c892d3ca7b0392c3fba3b91fbcab63c7c4b1d51e7af4fa00a512f8fad662e43923ee49f9fcc85c18e518d4343bdbef8991077e24e64f1883bd917c970fc82be7de30efdda5347d4fe25f24dd89c7612afd4e96c346777f7f48c7ea8181db50319191d31cb84cde91b28e24f7f4be21b6d4e7b1429450c56236a187fe20fb3da2310b3fcdb3906ae54ea9025f208a512a3da673ba5a15db68731eadbe32e0d2f693080f94012d513305e7ca04b4440a9d0ad243cdf60b2a8e13e41a950676c923321d188e968b548d18899993d53a3ae886211e581c6220612d27dcd581445d064546e89d26aa4f3ab138d7aa752da46341353c368840df14e0c621ca01e82f27d91e19d1ec6515a62727afa714549242e0bad2ba4d58840f0d1430dca7316c5b3674ab387b9c312adea864ddfedd38a3a06999f666572c8cfaa2db21283d0ac0f96455ad13fbf94d3fd67fc342524a4242422dce5b3da98448dc32eebf48b7e21ad983356975e7af1a98caf3188085c54b03ef645e0d2c5e6ec9452f4f2faa427b525ca05cf92f8fd404444e1464528cc8acf1e7fd8e38ddf2782288aad097077110ce2a565344c84e3a28633ee4e193521a128b424c6e8d1e78724c6c8f243cd885d33625d2c70d2e505ff9c2caa21129a403c81e60c319c428420e610a41d88253f11b8342db841fa13818bd3fad8ff1c7dd1ac04ea9a6b9f0a9a53f769f9b09712a386b4d5be32e0010c3006895332187d84c5898e41f144899fdf56f931eb08e3c54fabb94720e148ca473f12697e629215281f7d63b742282b563e5ca8135cf1e19259c06c30e9a3c785e2a347ef115d8418a4fdc783f04d94849cf8992844b36cf952c4d7fc6ef922f4dacfffd2badd2ad21856ef1bfbb722a2ca6f089b1266ca942953a6353d5c792bb430fd721530bf3e9b085c4e9d7e2b605fed29362dee8ecc214716db02767397d9e4b2a22fb540b44019cf7e81ddd152f0e1aaf1ec210d071687fdf27a36879958fa85e2378909a0df6217bf139caa12176631f1d33650393aaa72148f3e3ec5a30f823e00fa40e83f40fa00e803210e6221167a4662a11e820c05110a12244810a20f12442808910f11e8490413c13c0f4530114c0f5d5027d4cdd0097542df2175429d500fd9970c8b8c29637a0d2863ea410e49212525998392d2cb2829a4a414a9442349248924d14ba5684424897cd82465268b397b927b63c730ce322cc3bad9f38ed14ac7d9dd53ca9976e9492ee8392bcfcc0ee8eee6ab876d7950211a8814c16ca9868b0422459ecde9ef83f5d1de1fd838ed21839b93755143708703c362d0e8956c22c982c998b22f19161953c634b4719daf6237a49394eb76c1cd3b8df3329a6d5ab669d9365dcb2826b5d8666cf2fac2242a55ca57c66e48cad97b30283bfec0a21a7aaa4bf9163b22b163ee88c4e794a779e76dde0b686eebcc85708ccf69fc65dce52551c9263629a5d44dc52c6e15995bb1c2d84df8c6206154ec9748a415efc89f9f9f9fa29604235b2b7949fc96dd10b940b699bae63b8c4a7f8904c105526473dadb7176870111a75769b505cd76f9067f84cde985ea8592bddd51a6429f966330df9cf531255d6c772986794a9a52cc993233e674550c3a0f06416e4b5d5fef30ab2384903214032665c448a2356170c11617309cdf242b2cf8d46fd2095ef8b0fa0f4569dcd058fa0947058fa8b4baa2c50940e0dceaa7af1a3f5df24efc99ae0a4954cf39c5f145813a39fcf272f80da21a6e540a3333333774a8cb6075956783c3557ec33bcf0687772ea7951a6ed496c26683a3e99d6d4de76abc65b0c67778a1cfeff0d80dd9e15b1bd1e19a13d1e19a0a4f7df342ffcdbb6d7c3bda3dfc363535be79427a87c7c3e0741d2030888109306be5d32950011d3a7ce5853ebfbae1d443425d876fcd514f87afb4229a6f4e44fb3e9fcf6a7c3b22493ea48e25f9f67ae6d77c06883e74bc0e17d22b6f0406757c2430387378a16ac990ce8da8fcc627db861715aeba196f89fc14f54b8cd2ef97dfa43068fcc65c479d04c6baa8f24ba59f0e88d5006634a346fbbc4fe9b79a937a9619d11c73221a0a8eb9cfbbe6b1d38edd10ea0cce8d4a4105a0181485f6336f1fbb965421d85ac3302965c4a254b218b62d8d0c7593c280f9f07564632354252c85ded13cf3f607ccefaea1d8d71836b7c6506d967e7e5a36d8776473cddb8a2f5d927e5ae12ad51148385282a7c3832dd570957a46882ae5eabb9579dbc2a2a861e5992fb6502ec5c9766700e00ac8b70136a77d6969a19ed832df3cbcb1a1beff92e55f36d7f6e04d67a3a23a0f76a6eacf831df3d25bf4172e928e1cc1b63c5261d4f91b73f4ad549fb1893a3fae87d08863cc14b53d7ef9334665b0dd1863ec346ad49921d82db7bb7957763783717773b031a494524ab9524a2925ed28a5e48c6a6a4c8dbe4c63438d21cf4c15354a29a59c317072c6755d9793339c384a94dc0b7a5543b3768ee2581c5eed4e54f2e7e2431ccfcea4e4459db339ca149595c4218c961fc24cd1210c943020e8c1417f1e6014a0c61932b98c163c790b96885c0826075ba0e43cc660fad075e69815ad2bb992ab95ebf0e8441e1941a9a3e3c40c33335319f3bc7a66660e554bdf4f3c7c3b0056dd125b68f62b801822f8768f9a6005358e45185cbe9d834af35c6586e71dcfccccbc41013ee4c20801185bbe5d83ba049377d30d91208011039824bedda61e31e110c382307e07e52553c58894181410a066c5eceb459923199c10030325a316df7034c4cccccc021b707454e9d2e500bf68c1b7e3e886f44a091d54dd1019c400df5f1ce1851adf7ec306062ee8020594266364b02109a1ca1d51bb19bc20a28b8d216a74e71139d58d1a0978765a9d9878f69517373c3b8db3b0454a14348a7a3003a906249868aa1702ac145d28f1ec3360f4208513615c2082c916424a34916353365e7543002dba00e2d9ebca419d15283d7bc783435217647878010620a6a0e1680633ddddcd71e16509f0610f0f9acc5081142bf0e1d9b7e9cab36f3a64b4b00230a06c21850c5a3d43953456dddd1a93cd0d17ab0f7fa8400b325b7cd9c20c2e52f0ec3a4d4268f1c3b3673ccccc5fd4303333dd2d4cdf8e3133b3ea9999992f1e26caec6384166518910652143d74d1e296e199999919480a3ee4be553fb25062ba218ba1efd5561c1324753154df408bed0a143cbb64a7363c6361f4ec9e859367671067893138a0c26c962e48cf5d78f9e1d957343cbb835fd22840944aa9a604f6c35386a5860b0827ba1434a1302b9a7c90ad22a4cb8a313c744b0446b3cb0d4d58b502424a0b0823c6d90f69edb2c3502b88a52e37b47e301a434a556714c160c2e90926a27a4081132b2800c28a151044a86a64196c1a75220eecb2a5c438582ea0821a2ac98aa1242b86428921c13c760d900c7ed1483be6d243d2547e3645a24b27125dd22f6c47c1e7314f7a7bdb0c720e5289c82d77f51bea5c47c02360af560b729291267712a00fb1586c4104831b96420003171d4485c9169b3e54dd80f0210f2a90602ab078ae2289e7a56d8a122f5cf5ca40981dc4703203142f5ad0ba6248e2b26549cac28a5361f43d74aa8ac76f12154153a4f1617549c6360514ab07a5d4318a61d431ea48302aa9378d74a32f8314c324b738dc5ce4dc952ba594f3baae29a1dcb071c718a58cbb4b7b803cfc866319f905b556963eac7c70f0c1cb0c45148da004472d95184b528c2fd7755d57d21446244d01c307e03789cb174d644b4d66bb6951ce6e488c9e7d51521a23a591b2804d4abd18a5f4cb9b31d218e3754d193fc6de29e594bdc5469915a30e8f8398d3dd997526d6ebab110c2beecae5dd9d5f7b4eb7676eec8dbb1b7dc60ffc9c92a76cbbbbbbbb71f7851a77bb9b36c61877e76ff801ef393f2e4b32e8fbd9fcfc267637eeee6edcdd7da269127597ceec16661f29834eeceec4664fd991e01366925de0aba38c335e916758866d65e571f4d520666420cc1cd78ca55f987df4db39a992377271d6657bfb4ed9e204296a1da38ca1b237c7d8fd3127d5f59622f1e3c39ef9589669ee9365cec2afd3eb9a8e7d1b7d649701a28fcbb199c2efcc7c7a88c1a904cbbca77e797345b9da3c5e7ef3862d82bee265e61f0c367fab0383242a25956a83ac87d2a3947e451f41e4e49f46e2239932fad8287b7ad9e62cdd1c2f7a38321cd74e3d62f2e9271dfbb6a737ca97524ac961a40c933c974695517292ce9944f558c47aa4055199bd9d32fbfc912b25c73278c5cbdc2ddb65f7b52c76297b0269414c6666665ece82030e98c5c5189d97be05398ee36c9047947730a10662266649c78ec87c216644312962e81762458c71133333b3cf23325288524822109ab2c510a151d40961489c261499851921ac8a2fecfd4230b69471621c608fa0ba4969fc7cb882fa90ae6ec01e36472edf2f817f5a99d7dec1fc72ea3169c2d3ba1c88b6b2eca37ef5090710e3f71bc246ba0a8bd4eac0e51dc0244b36bb4b9736fb1dc15c7edb38b30a4789f9283034d44d1ab39434e6e7d9f7c728edc4960c969efda604fe69613d04f65d2ea42f6fee22e9e1971f0afdeb377e3b231dfc7e437440b264735fbcbb65cab4ae214268b5cba6cd977779097f97291376778f912d53e6777bf8f7578b11d1f7f40ae09ab2fb8b29d4376e8bdce64dd9b8dc376934c0516fc9e2ccd91e8bd097ad8b9b7239f59614913fdb8571d4b37940e79c9bd07d9c9bb0375254251b95f93ebd4fcba7c5be794c36af4cb49b2b55c9467d4ffff46ded7a707958e3027cbe5b9bb72dcd0b57cf535e9d91036c584bbfb8d949a79b370505be7a76b7ec52d987023f4629365510059b8e794ba6cb12b22f2e8e2c42bd2952ca28a5c43c1380a628e179243dfdd4c1f76965be4d26993799a284e77bda83e94cc4e759b2f0d2c88dbf7cc3b8d839a063d7535060acbbe94cd10f056621fa602c49c02b9f48f9e94df9a28cb98fc831d89d03549073859746a62b3d21fa769fef8e88cfcbae018c51cc378a518f31c6103dc65864cef82db97c4c2ed2df2e250a7cc54e613e5d62599fdbc64cafbee4d579d7cdcb27cbb6ac2553e7cffcea86b06f9b4bce85f0b6b1b07da1cf6bceac6531f3d96210839237cf3ccdf7af2bc964e6c974a98b9c185d98bb58e08a2b78f264e6e6e666962cb999254b6e66c9929b59b264ee3002d1299ec8752f73ce39e79c73ce39e79c73ce39e79c73ce39e79c73ce39a95c27622afd8c9a4abb249bb68d73ce39efee6eda4dd9d37cbda65a6354d3b6204debac334a31acbbb56e8db6532fe33009a77a29bf30022d985de262d7c4fc854956425c768a08c4befcf14e31cb78f172c5153116c156ac7e9993acc4fc7a64301460ffc234c2fed0d9c00534fd650e7bb06fe7fd98ad28e2a76f22f974f1133f79b4a23d4975f40b9370f189b6bdf6755a374413c25a8a26f5e4c9f684e3aa4b4d4b79044aa568b7d14ca7dd179f601d912ee5f1490cb29fc2ba21a92d729d57196c1583ab19aff3946f5737242584535efc2e05cedbdfb2f904e84990952f6a0c0a0aea99786d4197c8054d18b755ef24d1bb30629d03b68f5facb246d568ea863aa17c214cb9ed8a741ff57cc6354fd2788c34a9ea9cdbb0517da3f9c2787546b4af5facd211a98ef9b6b1caec86c42d729587075e7ead51a5b3a0f49a0be92ed409e5cf68e52856893e58b2a8c420474f8f79d18b1a8fbed02776462b59dbc91973c6e8e40c39844ee496bb37abe5a8aa554a19394a65635c3b0f97bb7465f3eec64c6691b4b1c476ca66d6819999a5d08298524a2977836e0e9e3b76939e7377775bd8a44f1923effc760a29e5eeeeb619bcccccdcccccacc52665738c5d3672749ab3a5f00805c7d1059b7415e3b06ffcea1645070c66896b851432456810891162fe61244060c5cfe64811430424bfcc887b85262030426230323ff3c39638e0f6e69fcb8526116c3dbde3ee789391598811708cd31db10b8c1aaec0e9ac80892d9021744e219897bba45c975e92cb282e2bed98572a3be7ec5ced18246d3647f2dd40516d8a68deeef3d10bb99ea79b47334e722b198735662cb244c752c3aa39e6600f9e1b902b3fcd3929a5d4fb72e9f3d2eb997f7d57f4d172bbdec8916333b1c5dfd5e6f21732d3f317b2d3f374a276ebf40ee7f2552becd2bc9b5d90bd71a4cb0df354abe9f3ec71e6f9fce5f5cca79f90c6245d90a5945386cd03d3a8e3ee76fb6e77f7eea7c445e90c7b9acedd5dba12cc6297a45e1881e293e863fae552fa3c989dbb2be76c597dd8284fb7941e992b067db4727dd7855dd775b1cf39e575496f4e223a2738187897b4e212b708f1257eac9d030d548dbe34bb1dbbc3e8ded9ed2f94dedef63aaf0759ecec48b9debed95cee3101a22dea99631e106d61bed433af094f0b9b36d77704f3fd126a8b5ed7fc86a02ea4298d13ce6479e5178a26803efa364333469dbf503411b4a018ca60099c233302bc44a40d8a8cfc4d3a52e32362d39068c688e1a36f6ad38298712ba3976988dbdcd404068c98ee5e6a2762af1131c6488233628c118933aa8811887562d0d9f9c13a35e87c69a2ae7299e1a48b326078322e32c63cf79b440619ec658b930d8aeeee8dded77657237c90e10518621ce28c187138e32746252ac7bdaa2a190c59f8175620449b8a9a8c9a58908d2180674fc92691b1e587802184964d0430fad5d6b6c4c5d26ef8e300cfde269131f4db2da0fefcfcfceec536d7b5ba69baf1d347288177544f68c1e527e5f979196961c6878b24f4c416229891270e3f873e5415e95d2729c5b63c361bcf9c7ad98d534a5d082f7779c6cd289bcea5ab7ce238a27265aabf128e11c860f238bf4962983e859ede47bf111d47dc1c137a876fdfc091e3068e1c33335e5353934acdccf826a46b3c1a9ff1aaebf036ea8833333a6e7821cd513d1078a206de8d57a7541beadb383b3efa1d31a171a653a071a6cd1706344fdf1e7a45443a78fe36252b35ba57a4460d699e689e9825c5d040312b8a5992868c8d1f1b406b238859546888595098456d14d98862a30866d9c8cf337a8f0a83ed15e145f1a478450cb6cf7444b017c00d951a5f4a4813d01dcd130f35cc01a514d23c7d6f1a54e328318bb5a88f4adfdbe615056049011b7c0c41c8e7e89153001f3a0418000ed88107063880007e2080b5c313001e1f000048101012f0292004217f4d9935c7d536ae4be9c8c19e03ea3b07540e34c87c7b8e2866adbe5d47918e2278872594830cb3564b1334be3d1d4142df397ca883e81b49cb0b22f85047946f1d3fdf7e4de915795198d53e7c0b60e9064723acf0322773dddd577477fdc21b249899c36e2634a7e70e76dc24b149f9e81a5293605937160462593bae67d78a34a3dec15ce9c68ea3e72a38c7b3efe889bf2131185af9e8461f1d939f8d0430bf3c0214f3cbe9a73d7df44f73fae81a53efac807d3625f8e5d8a731354ef4b4a5c69973cea21965fbddb9f901e28b36ad4ca4a934bf4cd91a13b3426de99b98d550b425a1deb1290153c12fdf16e63eade8db99807d9bd0b73929b12d8f9b5f6c1a2d101cbf3e8fae9f05c2c4c9eed059c3efdc0188d7f9ecd3903647cbb2382da503203e9c473b5cb3869f4ce6d1918d13955545aaa879340375798d940d4915757d610d09c6f870ab91b239ed335115a926a98a16c82a7bda9c76a3233903c5ac700b67e6110e2066853a3368cca369e5872a4a45867762eba87d43daf133c3d89647d801d4f7f56944dc75d8c530cbf2e10c94eff6f0464acbb74b4f47d4e614f14be487379466a0dc5062b0ddc689ca1ede50baf9ed13da9c769b2c35fc9ebe574c1d102d90586334bf27a6ef0e88767851d9430dbe270d9e36305a20dcb76f40e5138a3546cc0a575fbe2866853546cfc4acf07bd2008a59e18aa986caf7f489593569e0a40198ef4903a76f5f7d997f436983ef00aa8c6d79d834a9458dd318510d69ec0102b322576f1cbca28b40c2d29b22176a38b9e78b2f7addfc50c35954847483430d67d154e272396bbaa4328f988594c42c5e2213160887e3dbeb0456bf432562563883269110b3426a44b91bdf3e8ba2349d41f39790e0ba0502816d4da41aeabce6f435d7d134cd7f30a8f1e8302879b8aa569ba649d7b4ef4797aaf399c772d35c6e13cca49bcf6b5e485f0b356c4ea72dd9bb27b430014a42280929fb8100d4a45b2e60ad291bf80172a165841617a044bf9cfe5eecb1bbfaf2ab277f48f892d9513f92fe1863e434e42f33333737c3103d885f97b515f04208bc30e124071310d1ea1e90c0b2310d400b3e3cabf1ec71a505045f3c6f99917288ab3bfa45549b6e3b43d517110bea616035b03a0b44821e6c109e1eae0c966210fe3c581fde1e5e5d7c73341a7e9870941b28aa212e6881c4cd895d46cb1828818c139592acf050d129e28ff44c8114137ae7f276cc318fa7c12b0b9d621753ec9a58bd3e6f1c3235dca7f05aba7e2ea08be85aba98c00e7d9c26b350b81e495d01ec8e23f9c418427d1b77e3c6dd2bce3955577bf494741929d74fe09dda727f7e886214ba225064c260139b65b37c96678fb2bb63645ea46f10d4d1e1e18948989979126dcdedc68db55d994d6666c97c5dd8dca572b7bb05979b99b9b5dd652fa4bb5c489fdbb4ac4b652ea0204a149542892ee0018718aa8d5f2d3cb840c69830671c51b55f2d3b88e1d405af51e9af961db2602715fbd5b2c3d20e4a444cd28a186a7cf1a2060bb8a861c61435f59bb4460b57eaf69bb48650d31a3d3ca843cb5f2d39cc400cd531a2e12886238aa4d0a1c80b273f2db0e19390a22588cc0daa959153e32ca5018747c2498b0c5166f82396861069d1e1474b0e6574ca88d1a20313967dc08601817dc0b5c27101948c521abaa2b06447605a506901a2cc4a0b1062fc8d5f2d407cf1a24cd36fd21a509f82dfa43582f82a8da05efa6a4102e939b0fa30859f9f9fef597dc8fd76bfedb193987cccb16fbfab3f24edfc5b847f1ef187a4bd1f8994acc568e937505f09071f3d74293eaf9e2d9b07120c615c0fd62981c64e1aada2a89b65e60b4177f979b03bd2a93d10188c4e5de7d439751eae36a773212c8d7a87417766bf564a4cba9c73767727659cccbe507ed77599fb7429df244d492a697f8ace7cb6c5ce48ea3b2f32f39d8a3f5c81bf487fcafbe36ffdd1ebba6f199c538300ac3c13621cf62cfb4c665e16829a39fd56d34267faae738e776e78e7aad90de9a07ecba86cb323225f765fe8f39d77d7f9d50de9d488f2d187dfa419a0f1b3ebbe95cb51a6420f7c9675528e8eaacb94cba3974e33ef6490f28ce83397633297693c7d7de99b065cb7e9e06a8c2a8e1b3974dca0a99587f47aacb81a23ea3ee65b6a46c94cca3b1adf979e793399a7ba22326b0e2911b39050afcece420bc4860391ae64867a36bcf8335d03a4d7ea524aaf2e846d78fb1f8d573d24d4488a7ef2db7670639ef350c5503c1e621c46a34666079339bb1ca36bc00ee95d369f53d715e93cf34d7a2bef26bbbc03210ab34229a5300b89f4ccb9eb8cc41048f95403529e79273bcfa451e3a01a74e6bdb32d5a57bc399911553ae6947ae7586764e6af1980f90df39bc4d518d5303e929ef8483aef1cf3cde36a8ea8988735aef67d33a562b0e3e654b8c2d34f7a1736550c76be711c9793a9ee5b0633a690858e7c48bf49c35e85ce18a7bf09a14ba824ce562539090dcd0800009000e314000018100a09840281382c1ed465c17c14800c778c3e7a583498c7b2188761100541c8186388318618600891191a9a220400ec21f0b2476929381f6babed1c109f0adbffc4101366501c27f194756892c6691ff69d606ca20d2dc2389aca3542b0338b61420e859fdd42a4f08609ff460341b4c6c38e324d3f0d428912ecef54fff7c852aaef7fe841a7031d31296af7feabcd23411ccad62e334128e3dfeee18cba02318469c8875e75e57371cf7bc16eb83fbd1be0f8633306758c087667b1101546fa0c4a87e50de3670f71f06a8f6fc9e13f9185b5c8625732e4afd823af0355135f79868588fd7c5671b3f79b4a28e932b42ab1de71e15582addd077f845f6317a023bbbe22d3bccf95387e48d52fdb10fb133275011ea85e684486267c3d319649e48b8880285e27e788b271255c58b362f0252e55059fd429217963abf9ab01287b338634668d3eec5e613eb3795f99b7b859629cd99dc66057b1dd8512af01c68e41dd2e4692ee23e88a109e7bdc04f208574a5efa0c0b9bf80094145c2108f6c1eedac45d8546f18c31b0c13c0f3effb364c7753eb007e60e63d9a6b87557500949537050cbe3e3140087f7d5e03143ea899278d76529b1f01a4f26564a101f82518e83d0f233826ef96bc61488c4ad93e81d25f7f7432866d337366b6e38f3aac4bd1ab7c3d2702e946ee4765e56169f6596baae0dec988025a1f7ffea9313002df29ac6c6896f53922722bb686c9c0b7e67091e07593d9a06280b7d411999e4892c6a4d00b2058801cf2d6f3117cd80453052c8b264711940ec088e5dc562cbebd00ba68e57139db50f309b6f08fc2507395e093e382c298aa41a0eb6930b1e3b55fff87486b92877088834334d3e26229e85d0018da9dafbe17872c44881ad970d302204f433c29757ecf4d8813229910018ef4223c573e62ebc28b4d01d2cea843df87ae07c1f82f34e73c2fbf0b4bea72d1c30784f041c6e06cf5ed61a8bbf6e81a79dea865be74b717be95fd9833e23245da1ed4c8b02d1087381d4a510d8f79799aeae9e51f2405d8db61ea70faaac4dcf287c7677e95146442590ee9f9acfa8432a0f71042ff0bbbdb3382f8a8e99e726d6023c4e6c398d7381d78f1a25e82672517e49eef4a95979d372de5cf9572554f56c1b2fdebd6bc28e4698022db3258a120035eabc728041a396406070031192c063404fb03c88b32dc8a14a672f63cca8bb0f1ed4c68570b6e587bd3c0c08ca081166336c85163c09826d1faac111b587ec5d184cf81c364775a915a7a5da96559750fd0bd71770c28184faa26b4789b84d0082cc16be2a0e81173b8702b5e0f739eb2f35cd26ae838438dbc3c4f55a1293aab378cb590c5bb7b6402ddd3dd096039d0fd47cbfd6bfd7b12936b5835d9f6606c3752f0c0e9e47d71cc8f15cc60588957b709e8981944f27368471ae56a796ce07173c008eb50788ec43e9c3dcc8da83bdb025c7adb2b714276069a2468be34f01b49988adbaefde025f392c8136338e2490bb8dd2300a5c1899357285ed4243b0bd6381086e4e1241cd833a74fdd36eedbbf056c1ef75c38e0cbd3ac0a3501e1e64f82f316d1ca8bf1f145c6fce7b44c14f7f100ff5338edcc0c6bb765cf35e75e34202b0f15e6aa943efa000ada30b4e45576f22e5dba58fbda7f9e94491fd8b71a36c8e76cd23e8a15c8b3f716c8a3aba6d1af6c8bc08250389e07ba6aac10162e888f1b994b57fb87f97a250fcce0d8f2dc303fbda70c54f509450f767aaed0d44703355aaba20d94cdbf06ba347528578a37b26d5a4b4a4d8e6844c19491ffd9837662198963746fd68407a467aab76b36cfe1fb1a88dbe9d85cd07c90df5004d12ac6d3b354430e62d2a575f8409235b60b857d7ab25ef653057aa5bc3a9b9a642978993da99d37109d44e114a20800f0b9d8ff2f9374f32a1e0f85391cce6d03bc46fb822c30758c33dae4b95f007d99c6baccbc7a4668c9d3b20d838489e6056682ac01c23db3c585b0ad4fe8c1af76bcb8edb74684a25f16a4298a96a9b8a2f4ca37f31a17ba5c322a9c992cc802d85bc719d526c45638c22b98c08260f9dbd31c4623d0688216795a34b4351db03c7b8754ec0683454251d830fa70ac23ed0adf17979b37ca85a13069ea3f6495d11cd20f2a72d47a2c4a6aaa7926aa31db48cc862a1c7403d77f5f16332aafad1a1e6a37f1cf456c3fd26f23b29755681b7a7d4e24f1124a1445284da7f88047ce46852fc06e8b4da8d1201c194c80e23d5d0a7add95a626840059343a8b156f035c44858c1f0ec1b5ca5915b9165e9ec0add8e456579627e2fa4807369807e8dc4b00a46c522e222e40a6d6d01e3e324d598e2d0068a5ca38e0435ba33a7fd767719d41b623a516e17ffcf558b7f051513d6370c498fc70b2bd22017af2b50ee27f42d16b0e3f1a8db201522804365f49643233af101903f573b927ed207cd4295fcb7f9f85a2972c6fa9cb97f870880efcfb9b9e02fd40e3a000b03d914d9ab77f9118a26e8db18aabe98f3e5f2a3d72241892e76f49f110c1627e71a637c401150848fc832f6216b0fa84a3f96291029829a03e95f95a4090f23a8fa3154acd8ef0b074521fe2cdf72a317e9411be09d358f662da682d0e16a6e58919d560b8471ff27061528ff74a47dc3f9000890d5f46e928d2afeb59587a3280cf52be721ab5e0aafd3e27b7abfb9034878c07c166d06f049a1c1e0498c0be8681675e0502b25f4619af9887e32805ac721d950228eff9507beda6a4b8c783bb96471ff251aaf74992a4d8f9bd2bc048206a542cde9b1d502c3f7cb0713b7086e6fa4337a4dbe25dcc79b5e8e77d683f75ecc1e893aa91e091818a9f714ecf5d1a3dc168395fad560cc8822edb39f420363b644b027e94d90f771cb96c520cba45c8f71453038260f6260637b0809ce69674cb45cd9632f7ccb3b9b0128907b41d375c7cf74114859984668caf12e2eb67563de1c8ac28b201966c29d171e96167407bbc2175705aafacac2e05f5cb87c5b0aa0ea99928d9918c99862a45a01575bba30731b7c9fb2d1b1de650623225f722d5ae543794c47310c20f77164864b3dad82192ef3fccbb5f59e955c78cc3016d2c5e242a172a91909995938b70e79021410cab93497833aaabfed25e03f91c91fb3c8c12daf8877c464d1679ca5478bcd5315d481b05ea31fdab32f58d19c711b6cb17e7a1e2922f5010d2a43c4844a463c1839a6deead13a8826877ec4f0507a2003c53ea0194eb2a4a9d8ac46c459e4756ce1d3b23f064ca2871263540310136d641dd8ca4520891c1713104f896a111b85ded1539c2b65a98d93cd8fd119f44a8b71946cd8944d4a1052e2404ebf6fc4009148a371fbdd007453f0503ad6daf6cade826cdf8f3b2dbb75f8068614818dc949f97c85a3ae3ffb0c2ca3197350805cb552ce6ff6e81db1602a5d056c81bd215881fd5a6bcd7c59b978ee8133929d27438d3f5c38f5494ab6106a71276d5f3c5262b015e7e796c65877f2a3a18646e9bf8908f774b03af5711c27f9272e9cfa14cb282c0ce8682b7bea3e027e464c25700270d5b7561efbd594b9eba7a4bc6b3004fd99ed94dc56d0d36f9c56cba8f458f4d63f54268a793d9e82a900e083a4f95effdc6b78a8255c384f54c35d92286b2bd3ecbd8ae2c2e8956a4627a00c0c2060049837a3e8816805e68d2aedc01fac0154e5373c9a83225b21be5452a69efd06889614a427f1c27f5ecb70db79aabdc2efc885214005fdfb413a6db8a90c72ae1c126c4ca8f91ee00e9430acb97b400709c21e0f1636ba032bf09db720fdabf4ca4d3195c54a301e961cb3975d8cd4708cfca570a97d30f2858a59160e23bf8c255fee8b3a4b29b70a16f29a2c01fe0b97b0804b061cd3a655211f9de06f328699d72796e5bf940f813339ae2c7eaea859c47e920c7d7f5e5f4ce644d56f2a5c86a7d3e73772921b422f91c9c64ce8543f6e85d09c9c98ddf8297ed892ccd5c9847ac26398f0e0317b6c39b94f37ea2a347f987226d29fdc3ea0f76f87f095994773fae0261e55af56207d346dd8c3ab3a0dfe90459558cbbff8f86b5ceb076dd6a8ff69b31948aa8122e2d8daeab2fbf8f4ff3ecdb1e70e8b2243dde82d1a5210a3809d799eba23d5637bdb793b4550f53c905221e8d442e68e34281419b5dbfe246d21487cfd971b3fd0b33936d575d5ed3d7b1787dacabe7d9bd91801009e96542687a5a3a31f95f664f795a9126bd42b1630d1487608433f7aeedb26e84418929bad2a75bb6a0d0af4204ffb5f671d0dfb48a1c959a71371f433bb2c79977b65557a70f17450fc82e0e9cc21e5d99c35b1c53ed200208c7770468e52c1a6aeb4ca3063e270a8dd2d161a404a873f201e46d4900c60d37a9cff1aca9ec91e98708ea5fd6d950f611d7e486c9df10cd20176459511efb90fabadcb3cf481920e704589ab4887df46d2811afb0bce78c24200b8ae02009a21ada81dc3400b27655ae3cffab904b45d78f93bbabd14a9f13ff741a0aa26ed4549d6fce55319b5bece9fcac7a91e37fc722262a1c065086f053d207af47b87cb79e068b000e8d9515ed13c32af4ee46485686a48bfdc1f5405b131c42d70628bb46259aa8faec3629fe3df969cc16801d635e82fd15c6f9a764765449755144a16e974013cda765f2592326dffa2387e19765a41f9d3e52233c9886c5b2f3bca933b2ab3af151450a3946a5524d586850ce838b743f8c3a245e78d37e44f71f901dcc79e300ec3d07c34b0f5c9930d7105d5d49282f03333ae5da1efc77ffd118a56cb1ded80b2555a2f3b08b67cd5abd7e83dda1c6c026c7bff21ee2c0f9807e7ede8ff3f910a18e920cca0c0c651f7142f904e260d3b321d41d74c0a781a5dd0400da40350c3c04bdb8b32305ddc23eab5a46b42432c2f025bd1739e1f2aa9cc9e2dcd700ec3a72ec469b6ce4d58e8a46cf60a4dad66576e288d3f9c38a0fc7a31c1143c64664a8efc98e22dcb2c2640e89defbd3c3c3b9e08b88828d9aa5fa6529bfa72a1b30fcca40294c96f0b75a4651a043a67ef429b302658c9f35739a4b817896a22dc50a9247f25525ba0651eaff47dbcc53ed8d4c22654e79d2879739d544a9de42f7a2243922b26b25cefe15038bc630619901925140461209655da6cf7cbe30e5926be3ea9af7ade7398abb00e613b61792547dba9a1999030f25601f1a51517fd3bba0e71ef1d90fc0380a428ec71f7a35305ff014992f8a1506427553bc1c8a4b567465bf22f9f6f7aa3228ef0f634ef9a4df963863390cd840ee38f9c078dbdaf7e3be5b83d0b793e527ed2e5dbc5b01a1f6a81cb1b8709cc17bd7cf9014100437894fdabb1e1d5aa297f50ddf10325548f9e1f5b55d0359bce92ffd2bd43e77089f82ce49c8b6603c713338b73fb7de0e65c58b0e2dc17b7ca40e8ff217cc00b9fa3997e282f954d431566a24246cc5e1b50bddd0661d27f129de6987c37701ba3aecf0c3845b95fbda99c11a499c117114b18a0efc899fb6e3b733cea608d39a9254499988f65964819af13fc9483778f9c78f365924d26d8f28597cd25bb36cb802a581aa54299e82e96c449a9f7984bfa25131db290d13a2b4cad8377c14d2aadb5915d37e49f8d3630d3242676deee09326b8828170c6641206840eb045e142e5fccdfd016498c19307b1452a4b9f6d01a4905b97e780dab9bf62af452da64187caa7dfe498c7088d37f4a40fbbf617e16125136f0c8bc4cd897b1c5470d5addfc6aa04a21883f0f62d66c71220614d08f463fd7e4e5329e628aad2e420e9fc0021a20b1721b14d4ae714f825a17d4d16250e5fe052dd4bd57156b23569b0977cb5d243936a6e6bb6678d7af8a42a8641704c8529c457a700135b2f31794e29753c3e5059ae5586d6c9744c9948a28bd92d51cdc3634131e41ff0392d62b1e55cb91f2ad7b56f0ce2e697060e92a2b9041a6bb983b37ef12c725baabc5a1579d1939f7d9be97a723f12b5713faf77cd05d480fa7d1312ff9ee14ec8d9dbf0a6291dfb33dd6b2ecd44dfc740597c1348e351e9533f2c4116a2a8390c384b83c9eaf22ab3de56e5dc6df606f570458d8698acd12418e4c03d4e5825d58cf0f73380b19873c011e62e9ace8b26155ac1e30d95d546232f1a6f3f2d5c6497003390f7701f220d2c031940f6565df8c65004b99c5fad399acd974e2fe58723a014121ea5106d2c49eea1ceca7df369b1fcd7951cb8fb2c509462d8a6f092e20dc6b767809c2b384972acbd866c020fe598380722a5c261210ccdd6611651726afe65ad7d45519da1251d0dc5fd3cf3b84e02e8b7ea5a81be3782c8244530a14bc4e884bf8a83f64251d036f6729fd3d04508a0d2bafc9002d724dc8e7d01b9992edf295db999e1f54bf08dc443228319032ace733db909db508a001db8670bd3062d4ed133250a373f6df40193f3ce1d95a1177b384dd6e34a610654a82fe549b428eb28ca1d3f9e2a4e039cd1c3e011347f4248cfaa4a19e60b9809c6a462f027c8c86aa00c64796cef8e8d105c7b7d228ad8bb97792c8d9d98902f6b4b3530218585cfbc4b0b618b7fe6857b29bb3706af40ba7b773c411374f00e92d33635c9eada1c54c08b1b8f683add6ea7214dacf51865bbf6f749263fb8afa7630631a0f853a864710accb27401411d0993a16a77c2d8a96577446656fd1b81c4131dbf62092b080471b9d999df5fb16e8add1c79044400adc1f37245d84811acd3c3e01803e388d81c3d5f05b532596d6fdb63c2683161ae320cb768a69d896ce499b460caa694e38b3e7c0950f8c3d748ffc2004aa581195641c987a082b47815b2411d3dc8865d4adc4f20d10716e2087124afdf963b62428294adabcf1e42a6c5617c2bc614785060f6dd14e7c430d105085830c4ab71a129fe022b85c39a222e3a023037b422e2621ff19a018f8288c72f4c29b93f1b464f5e62bb2ce2ad68ecdd7159a9150474324c5da871e99c3502f03456052ff7fe643e56997f45b8aa82e74c1b8b997dbbdf8348ccff40a57b658c2e970709b1c3202786b58f9fdb8d4fd12c4396941740c21c0d55e59d5be047ebb4db8a75ba843a77ef7bcc686ca000fe9eda4fbd30e20aefb4b4640b2e723d43e717059883dc575704d2506fb2aef71b8434783254176881b9ba837ca1ccef25a4623e1eae716fb7fb408d8fab4a172352281298d659818c804fd523cec3a2460149cae9e827883dec6ca0bc85d419f6281a0261b3fa3c9562871c719543ec6ade090a0f00e51526f871508dfcc7cc9b2ff61fcd934c77a811b936914a51b4b51be90b33007c9efbe9b137899428180cfde8543a60f395b80797bbca7bfcc341ed48023a8881aa5ef2474a3c0257b7eb18a544318bbb2563530c466301fe6797251d8ec893b4eb8adb7ed3eb2a27d5ff2344567035e0998204bc03747c5c131ce0428822fb16e85fd311ce8b223522449e57cc2762def0af2a01f24ad24b1f551212e2a3ea79efb1dbf06fda61d3438ed9a854b00dd1e568395452aecc8e50bbde08bc93c720e634a69e1782470196fb6560517873675f17fcb9a0e31e028005bfa5404e9ce20c79dae709ab138d62443e03f2a5f9c4bd4c4858b4ecee1ab953789ca671ba4fc263823ba1a237a6356f8bf5d9f13a71840061f7b0c34fac39bff2ac380666551297e03461b812615ac03c911bc8ca24ccac0f0acb3b50e62b7c242092b7fbf1ec29c9694e40517ea7fce63a1d70009b3fff2c303192e570010c1031baf2b0184118554a45e944b1db01bd9c78671b0a1c4e0135d4025d2a92b036689eecc268ffa2b64946499937f85250da23af8291e39a3ba152a117147f8930657d263667d4f5b8db82a1fc5245f259ed35ecfd5b31225c37e16ffa1decac10e9419cdf16f6636f167609510f78af48cb2416cda2a9f01778139fba4b4745b677650030bb473d9da5e74e8d31f849a07ccad9f92fc31831035ad931bea88198c827d046c67adbe0f9d3b8c39806c57e4b093e015008e54d072e13b9a7acd8da340b2fdb0b56445010b49e68a40fd77b338ab03999e8e354b3545225a19ed358277b8b79f04ea1cfd66fee64a0509897abc2a74875f2013b5c652e44cf9eed9d0e2bc3082392ddb6b77b49b67dd4c03ad226b27eb95742478479245b6b3057ef5371ce1a00e7aa720a8a09b41cf6d372782737092d2c9f9e26aa1c49979d46acbbe1c04f5f238d9874622664ef717fe335ce385c650c69d83d3f281bfa37ee070db5ac0530f9cb6b1703b3535d4b670880ac93ba34513c836eca40a8624cf214117497f6f6df02db7fcb0892e0fe4d83181f87dcc2e28e5b4a9334209683fbce6b0b2d30cce0bbc8ba5e2283f090c4f29de7caf8a7f764bb0ad6c9025d44023066449f31418ee532d28733377b49cf3409700cfe77c196283b1d346dc6c5ba641d3a0b23985d051c987094176b5b9c5b77e1cc064ca4ebae0e45ff1ba8d7487a35f0949de9bbbcca33a19a962f67c208c10b93ce7c980db7a9956826e3763c8e24140d19e90d6775158065bb3ead3d6f7cd4e37eca9b3d86544bc9149a711fef6af791162d338afa1f6ac8dc9de2d7931b976cb777c5c7f388a5acb242fd14e59fb446dec2bcfc1bdc4940d92b572d5fd626c77047a67796a6f3a38c56676efff87691f9eb269c9dc2f4e4a7ebf6eb76d2e5ec5bfd76955cc997b20930f59ea5911b9832a60e97b2760d1fb462c39382b9dd5d6a1394f525bcb5a90722599b279c92b8d4a672da581c033f54094c913210ed2a316606e549bc732a4f20afda991ae7b3b47b62d34d76cceb1db42fe5274752de9be8984a0292971af54fa64ef93db0b3892336d947b5a0e2b1f42208e32f238bd18a5c7996f91265680f4d32546eb6937477ad5090a0e000353c1326935feb0972c3b9fe077218bd77269ab35a90fee35a2be321674c3b3b9e05e28794980349716120f36b3712b05047b427b80edede5a6b52029e43fb8286cb51afe579b58b6d198a5861a3e92d6040455e96eec49ab796b3a6836db28eb08097b7600a503cae61bf7adc948b1f10df2088826ca3531a812265c740d69afc7ed3348bd748b4a0905ce7d324d0d54fe4e28670f220a011b3a879875398a34fe5ed1507c903b96902d963da06937573ba913717ac0ea1a208ed42c0cefe9bf21bc9b6845ed6e9b33498190fbedd482ac4c54cd969c29b83e02234b322916fcaaa9455b6dab5bfe66717385940015afa7946c81e017672ea0c5278fba6acce38eadd6c148f92cf1b88597d15cc6e8fff57ffebb3367e260392982487b0b33c28e94cf43d19bea46d17767f1df6534dfb7cbd538fc60eee00f72dc5559e0b794378a913f232861252cb2e0d8f709a378cb4fe68cf49e8e33cac290594e94980f7dd88f617966080bba0e512d6efe51529fa5d3478622378a7dce5ee191cdc98248bd5c3c8677f01b1184c60d6068f6a55e100e5905390b7f60d7da798703702485d73d35136050831378b139c4dca2907532cab4799f0bd28b0e574619783fd4d79b81491c82b30d11cfd1eb7003a5d74a2679683fd3f7e34b3eaf0461d0029fe78a2f1e7e68a291fd46cc3959cae55cfe6d5e20008deeadef5f62e0e0611fb0dd92a5e56db19e6d23a52c43c78313e7705add1301e6e7ec9120e1280fc55eaea3d06b30c8feb8f309554aa7d879035592d7a0b4e0337bec76fc103e562bb376cab3b0abf677107e4edbbf3e021be21f739ead44800169a9d27bc5303be1fe104d9f6672db502c830ef329b13fa193990efdb339142a2f0038ff487a98c4f21f8bcb83a42b60c616d58751006d2e8a82a2813f3a7c25555d5005fb0310267b2506b34476a37a50748f8663ddfb981f92af6561b132932f1113daf35e117b5855985936af2bf54d5b05a57b27d9c26791fce8d3aa7a5270822dbeedadf028aa5d8842058b32f95e44ad2dc24500684c756f6e48575a7e1890d8914c34ee4e61bd540cedc60257b4d41967cfe0084ad09aba546b33a206f4502a06a40d0e949bcef9a8bc809ad026ba18d73f729ef6adb16685b35822d5f60e29760f067285bae908aac48ddc811c2050106d866f57890d03dd5e68c69860a99579e8b7393f1a14bc6a192892ea2c2e176e8faa12f47fa9c91931eb9ab19555f7b480b75a6579150a3e5425dd2e7974d3b2b6a0020a2ddeba36e31789c5ae88cc2821816e4b4679d33fa21b24f7634efc7fab4b21728af7b595df86a53082b06d5cf2ab89317bf68a289f9f225aec93eb55eea38c3311642bae68957b59b572218205a12ee61aeecdaebcf41b3d5bf3ee4a9307d68e19f6c9c2fc92dce38a1ada4b98e7fd1a77aee9000f3360820660cfeb08cb2d581facd0ccc10285e47d0968ffd8cd6847abfcf11e9cede882b47dc1aa759bf2d4222aa5b5967a5e2a27f5401d963f722a09f887e41ca51d21525bbda2b7cb8e522b6499b462c3af1cdb8a4d96e005a6750b071e8e5436cc74db2d30606d40dff8a6192e029bebcbe0ff90eeb86e72a6396515f986d60556c9bb94692f1dd24a3d3cfb4524ecaa5b84c9ddbb4cd289bc88add8359ec81850736a21014d0820349b1d858d71038adc9ceaeaefa5806f912336323ee023407cc4d89568c7893ce36afe89a2f29feccaa7c73bd97d036450aa27ea3784d225b765ad957ca917af0ad4fa533ddc08e0a4821ff1a7740d5af256b58fe8c051b01d8d24bdae5eab315d3d8670201d161f3c4fe66443b70e9a76be198b8982b23000a84206306721675ac2f60915aaf51658c5faa209a5ae847931b274a420bc9443b00c84e816cd89cc50ba6e67a338bc49812820b4dc05ca762e76653429421b2c127f37c2909d43c0a6eaf6b593ea4d29015ce3e1ebe4fceac4933253df4d1f7c3954bce87c17750f72fbd8613fc8aa6778b3450aa4164a508478cce1caeb27c51a6db74d15ad11db0052379297524d860cffa3d040404e29efb49c6d2f404b9447dd4d39ced8e3d870b7c3db072d00ee29a4bca3b44bd2fa27b524a3ae9324af75bc630c7f5f7210cf751dee1070084850eec80c9410d72c7b2bf8a50c7cb360dfd05bcad3c704a5882c3338f401c3c800e96f7a2feea74df1d50e497ecb9e6c66734e81b4146674e8f87239711f1b2d7076a65a745ccd92420a30cfb5f3bb7d3d9a63cc10041167b7fb9c5fff72924ba576671f77ccb1815b74d9562c38d7142e02534aaad67a0f4b7eb61dea84b3c23bd0028d89dea2a58065fd847a9b306cb6c00b161de2ad5d71daaf625192e8f80ee696a6d115b23b2c092e6bb602b7119a137434035e3b61cb09403227fb180f22f650f3f8211c96cd148053d36787b484f0b21c570725d149efae5756f8572c2d7069631c2d3d49d77c1f3526f0f47f032f73abffbe335548cb058c1db281f630258cdd2adf61eedaee4ca0ca6a119abd832200da0740e27a2c44c368a04f7051afa8ea2f0cb1e868e0a3cecf892b849af378d01b0d202696070ee967aa2527184920a5568214fa47806ac02dc1d943da1c754044cf105b3d9d193836554a957e9765a66f553e49b435e12042ce81a7839966e330b30bdbad2a4836e3356ca827b0c06b727a6fdb9e1395dd8bfb667f737237e45b9d7480a49c147e2396572ea5686219a7388b6e9871c5c955c1c22d1e56659007132e839cc4b3ed7aa196e921e0a176af5de89612dd4a36f62d9e474112d85bce87383a1ea91eaf0ff82bbc85faa982e859855b296ca6038add18456ac6d3a624fc7fcfab9a6bd62395876ef115142ed7a9161b86e739d1eef112d3e5fe4ad3f04bf5f563f6d52063e15517460635442e45ee84bb24afcfab64622c369f1839a907c9fa406af080394a783e915cb620eb21cb7b2492f61dce168ba2d57d2df5a131b92d3d24fb99748dc522a4714ff52725594f867e37b01ba3cef04ac390b0e0a4b39b96efa9d5c59843fb1fff0f3c6234800d017342bfb24d08b121214d8666a15306e5d4842ae6b3bbe25b4459858f275e2cf8ce6deea34414a389f2323a34f19be20f66dbc59f16d4d6b68ea18080b210967d5acdca485c49d0822aef1117de0b82896f763f9b31a86a1a9d0bf4d1eddc3081d58bb16f2dd57451e94e3eb8985b348d384c664fc7930b258553643cb8ce370dae9f758c7cf58161e36226f3b1eadf33f91897a2182eb0dfd61fb7a436ea55ef6e3900fe31e8f58bafd055bcf08358d6e54e57bde926856479dd388ab01d16881529cd3abd9e09499b7db1e2ad361110d67f6e96083c5605927b993295d93cc9ead0462e51a4ee4ec0bb0c7edd1da7aca1e7afb285a7652c9b9c56604c1927d7cbf85f84f2ea499d8bc5d772be54b7a6ac871469efa12a44663ecc0ac0b00e006e29dec4b09964f387443a9f11c768ed70c50689a4ebc08c89f0f9d2077d0f387df7308c0826ba340c1691993118d9aa5a48c328158ccc860ab9464006eb1a0471692744bf88defef05dc0a56dcb68f4ed368a8d099726a41827fa8e2568377aeba5137e4b7705615f0555fee39d4738ad7157d291f1374f23649725f2de60543814b71daf479f9c9c0d83b4fb0ba6f63efcb578d740a936e5f18f95d7b1b9d9a131d2c8278e1d3a90fe1cbc153b810a62c1b7f4b96e94eccafe79fd341d1e95c3b7a7f2f0ad050ba5d6d7eb97f9dfbd3c30cf4b3b8aa8ab1ef22ddcfcb13342db098dd2e1ccf1981f2a20a79c843bcc3cefe586079e7a85e7f0f7033f8fb74f82e847cfbb23421457ed9bdd0526d96051ac6ea3162530d4e9f37055af6cc87837e7ba8a68ca8dd051f4ccdc5fc186c749c02a80f04e8bec6a3d2d82699f1650e4e15544addc7abec12ce72aa5746225f2ce3f82db138ad5001040d05ada8fd3dec07e1aa77ee539a8d483a13d96f7ba41699bf45bec83cface1c8cb9c725025f2b7482ec695e2dedcb2b2db6a45822e3062c4b4d14aaec70d411f6ccb385894f8dab248997bf8fbbdba2561272c463e7a1d41999ba3cc2f6b1977812187d918cc2efd03850016e87d2ccf372bcc9027b3fc29383103c907f028c4f5423e714579f27384e6f1c02feb0051f8314c868a59165452f6f2b502b93dccb095adcbdff38cc847e82adbb220c51b0c23aff2e0e55211d60181efbfcc65a92549df27a4acf6dfe37f907de452cdbdfbaaca4a64beed3885f96b9c89f7d0a443629b8d6f29857ab0c8cc897d26df277b05f92970f09bdc4078900856585d3727fab35d086cb74fc433cf9a4a895a40880cf012f09d93b7cf43ffb1cba11894efec58c2746a972af997bd00c45722c88fc88d411721e2b514667a923dd1c93617c4220117b43485ac8564302f4fb91e5ebbc1c7769b22944e9777afaff645603f192c6e886de19a94816ca03dea7d407bcccd66acb94e8ef36c5210ecd6ca0add0d9993a1a06775f3a775b2f2f1c329b30c5c13e1472759888059a5c84a6e0f8870ad42d1038abfa21de3ade6c678d84c9a32f9c314e5d7e1854fc2bbb2bd49888326060c163933cbf581bbba580bd2efc302d11df317ece32a1325b08c3b34ab9aca95ff1d01b8f0c6a2a4685c666c78238de7ee145660f3d49cb27b5f7283396c149d05f499cc9cb39df6ff7cc57f0659a99ad430e6e9e17a01b10cd64b8369abda67f0420363a0919140ad652b296b9359c597861cf14f5d0155f9d1467ce882de98ad6937e93d9da2526ddb2f53d8ea05ceaeb4b0564e7441d1e87ef783fe4a72e15d5d72e6a04dcee4fab6e53fa3fcc760c21661864d9f23ca5104456b58867ec8dee4cf3937a9db72da6d9eab045f81f2fd60b8f8589cfeb1be2da881236ab5d591f884c17956fab558a7c4ae83fb7b4bc65d68699a0dd25e2e7d3f21e81bef388ba46fe3130a37b1ab9d77f2c06c3f7599b56cef387ce60afac1ca7f0e14dcca2c886d0db01ba4339b0de6ba4a857706a0563a097d85c4780857903c9f7d16e79dbdd09254c467071de5c3af89ccfa69a2ba2a2c51fd5801f3ca673934dc6961f8f4ec0ee37b00e4a044f20483ff8767aee4e999cb9541949c224bb212f126699624007457206652d12e65bf8e56ec3f7a72fcd69a6112b6df9d0532263c03c3c4ef78ec02572031c4b1032799f13563d9d1bd819c3bfc7385d4da84301ac468dad06ebe32aa1d98a6ec63c5bf9dd03393cc4f621e6bad62f2081a27bdcd8a074f8b279c1a5b634e1b24695e7a902c2afc55bce9bf000baea7f37d2830f54d97d736cd6d8356fda8cc0f1981e983220e9c42f189de72033a01e901a1923d4528ae2570055ef1dc0f091d32377c9180445e001dc92f16ed611a3ed83f7de04b8fa3518bcd343deb26060cf5ce08f3bea502283a0b192fa336696a6fe259c993a3d1c88a4c3f02743ccaed1e2ec28b67c9350728ee0196c49d4540e230ffe10365e7bf45c8dbe19d936f1ef286be16cce0d17b9f66c4ab627a1cafa82f32f0d70d57e11926704e6825d88cf7f361dacaf230a71891cbdfdeab77e6d4b7a15d266de110bf034259f573af4385e4066f4255927d8b8045323ec706fc59019b843cb1eb174a968d4449f4819e46e15ef1af8a4142eebab895f94909aeffecb037c0b77f983138e4ecfe27992010603aa10e3b41de5c536b848021ac3565dd163d2baf70c1754dcecb90c8a2359b49db8267ec6b843da597cf499a3f66e5dcfa39e62d75efb0b977659be75495200d830220cd6c44a9218c49730c9b296942f83ed001346c8d314544eeea351d108cf889685a5918d3714c0de2eed519927d2a72067069191ba934e83cc928393a40f0460e958868f5bf4c296e85b8f2e7d6454ac4db9508da2856228fa7d265866711e0a543498546baa78ed122542b07b621d7a35f5634908f48b35d211b2599b08f20de7139d90a8d18aea23ded5c2b25b197ff1b4428bc0321eec11e55b59254ea13a5b91ba276748c93c2b6849e88eba9dbddadf301b3b5bb21f0d36d60ce3eac059a334168753bd7b801588958efc7bc9034dff0f650010e76f75dc9ee6d1f41b253ad7226166fb99dac8fa1ab996d9098007013c0d9c577a1903d98afa593311d2189c279246336882807f2c6d4c1dcd8382de0063c7cad2b5c094aff7a1eb6a8f725aee48a075a060e50069e2a29190da7a4bda6cb2a0d005f860437a044cc284951768faec00df84dc6f1433d758434d80ae4a45a108c2b4eb8be9d528297ff40a2e388ec01493a941d5b08f4a9c0707271585914bc3b500ab05c307cc65756f4ff1492a1c90960ef068814bea8bb1ac8eb9e95091b76cc9757258ca4465c430a31bb65fe6d8ee2ed5f613fee0d08a20930f88430b3c82011f59c2fdb9bb255f6f77ba4e6ece883733301826beb4d438116201f1bac1485f18333f303f3488f819af8ed5630b007729346ef0bde247076872c46983ab22a95256affaa458f40949728ecf7429185ff0cb3f90fcbf019cdfbb78285e9a4cbfd796dfe258c6df20602aa17b16f5e7edb4122a263b96b09265915fb809f5fb505f4d506130435255b73f34e6ba05c84b9aba9b7c0e43bd6bfe5b63fb80d710815b979da999035dcc738adaa964a8b809e715bde6246c18b376c1347f84eaa5079d93d62f023d3776c8a44415c4940aefa5a28f30971691554bf90bc89870862c7fe492b02f6fd6fa32ddc00e95d1d3c968c0f295cb8102656f172dc364a9cd395e8885fac88da1a88109bca204bed92850b51107580e4eaa4018f50bb695d5d09062ca320619d2a5dbd082557520013e69af6751da65299fa41b47061ec07fef14b0b1534e4835367d9c809f28d8455567f543da829f8cd1aaff6eb91e30c1445bf209ee99d865783df3bba7feb7ea634974ab14abc0c85861b7dbf90a283a3d00143292094f2f1bf612f94c4932b735e80e8b1cb2105f829c7a98a0c7dbadd83bf4fdd23f045df27c3cbf9e7e97671f06a172043c0aadc1ac846a56ba8e8c89ba6de71417a30de0c8d7aa1d6fa13fb878b8dd3f5ec1672749d88dc563586bb6275d253b54fab30b810b68698d1cdbbe8fb54789261091f4484ee9e3663972c00c8b24a6b6949071f8c45a2ba7b7e29120545c60529ce31a4156ca1b50ba654f0e1801af43ec1295f0817087a5588945a609e0d0552d29aa521718fc5ae77b163c64016e8ab4d2760a6dfa22316b4844a9b3e6e93fa8c3d8d8c2fcf1cd3c11c5bcecf820429b42c1ded516756ab4fbc8b2ba200cfdd873cdce1f9d8eebe1cd53e1995446ab413b96e1bdbcd828110c15105e0e7c3970aa76f93a8b78c2ebb00c0eb05227508e109f0ff47ae50d6c5f6815c1084786a3c18f4bb359bb54d9b8556a7cb5acc8a7b5af70f77c885e6d97a160229db4b505aac19fc65d5218766720881c54a23067027472fbc4d75f187d9d996533acabd3caada6e52c3701bf1ca76c0ab3989f826214a4dd861592910986a84ddbc3fd85465fa924bbe4cecd2948b4277861b0e111bc9c5ebb1c0efc925a01d7a4d8cc00c4fb3ffb871552e52a158556a63900261d842e960c595073876066026cca1aad024a060f43a10141457e295a834d02e058fc303548545b4c4620836f00ad50fc9fba6c4d170fb15f890108db2249e08d2338a9fb15099584909eddb11626b9b5bb97bf741cf3311c65a97630d2e1a7fc8dcff0be32893dcbc56ca71db575ff69923ba6a6a8140ed513e1b73475e2480b02b110e33cbfa483d9a62c835103c0f60cb12c1872bcb06d04a1501a232360600c2ded961faae7e4ed30a5e24b5c3d6e228150ed4f8d38c4c1b498ff27def4f88be0452c5d1fe1ce51c1288f063a46df73f06b323684534fba3d1901e74666a1dd863bb6335dfc0237c3aaca7544029c9436bf141da3c27d59dc57ade87973bfc9885658b9d96fe2ff169877f74068089e52bb6180f81835ca7b170fab64a8517a5a02090064a294f15bd5c085ff016ae74cff7395705e9d5f67b36f108df3fd1f6bd3d7bc57e78edff12adfac36a19bcfa33e7aa794711fa5038c6f43104ec78135714bed4d834c4990ec4b453a0f6082a2cbca26adcdd5df684cd4859cbba7ef986c0eef4d2898213f2b70fb01bfae00a7d0c0051b4dfe25766702e9d2e82c7f02b1f4f3b4a857572536654988a9b481881512216c8d029337834d1109e0e61e0dc2382dc067865f9761b48251c268de02d0f0a70441fc9af0d2f197275b2b2147d172143d210fb3abfe0e961c0023854c0df0b005bd17a949f9e8ff8b5b64ab9bc9f84c7856cdb39d1aab681e5f729c30bcd19257308ac0e4bbdac212fa8a7677f6465e44538d43c19b63e046fdd9952cb75fd5c6f46462d19791f4074b0d0cf16ce1a59ba9b6ae56916b8130bee1f17b4a2b3d7558c4cd4c369f5359da9ff42a6f64d9d41cf85b4be90bdd76363f9ac0a9c4e9a363236dbf697444fff02e5cc04b46cbdf3b351914601e0ca5e6d2895bc812311cc3b7a973b153a358e1c91ab03dcf5ef3a7a8c0ef1e9515ffd7b9dfe19cbaa671442599aa944df55dc06220d3d2b86b8f45e83968092a4053d1b5af07b7a81db3db7556f27f8fb4989348803a06759294098d820550a47e2ed41028ed1a493e08cd6e09fd6428a5a82857ef2acc9c13d50c1ae05504e48f8420df5f86c1d246c59a07f86d3e3054c85e257e329e73a6524568be55c8d5cec0f4a78c60a90a969939ba79adb916337c309e9bce857c9a7f39c2425ce0ee57ca91e1bc9c69862660190e2c908c4090d30d03a0c685626d269526b52f5c7a6b1db1f738e78f1fd5f0383a70bf0e5ff1fff1ff2b33c00ba93766059394aee6e71af43ec11ee3273d43d080396ef8746d1ba0a1d212a5268078bd9cd5a6fdee0a98e52a6d62593edaec6dddb6e6d721396db07ccd52c55a418790aae673d6c072fb6eb2fe6358a5150f70c69ec0e9c51741e9dc275e47453f8c8e045d7a0ac072285bb59fcb17ba39a6d83e0772958e41ad52c6a990c21057e56ed2e9e2a0fd8286b01d5e87e6271f92002136b592f4e9b163e74c805096bd35add227729a9b8237c27c35f8099af1325936433235c23546b2943cf1acc2ae9ea155cead3abfddcb18dd3db1e19418ba7ed437a4a2315707bf3f1f1e6a040cd5990cf14a8091dcf4c9fe43474b3c5f4c9f316ac76d8aa013881648106fd67f4a2999fe9d92cfad5f394d4043da6a4fd58ff88ac52f82a750eefd6345989db7f368eaecc53caea4c416e19f873c8417dd4d4919dfd118d6895e8cc95b291336d902bfd59a54f72126e3478fe5374e43991a8d2f5fa27ed3082732d4bd9a751252cffe04df2776092052dbff51a49c7d6176495deb1787e1c4157022f6d1ca03c3f3d83b643039c3373b88fa207bae798e1a07e0422c9d8877207c6606178f13606eeb9485c28741d54b1f5b9a6ff41f7502345fb04856d9004865c2f6b7408c96375a08519b729bbb9083696e924fb382ce5015f8812c473cfc3319af42979ba55403479e32ceefa02269fa199979a6bfd083ba07fcf3e2c6cc5ee022e6cb91d81fe1a9e88097bf23c79e180330f0b4c0ad1d0ae329de5df12824e87a5f04475b337a649b8c95c949faf38e6f0bad45f4511ccbd27e6762b6a8b73cfef3d11b6f4b2b9a82e9d24fdc91afd000afc93f4fc95b8f8453186c289736283274cebfbc26de7923952d9ffe805b4214404b5df2cb64006f78f5d6a7bd0af8bd70094c08e7a133d00fe1e9365e08093d50ab91079edcdb23b55000240cbd3101791a75d69c00e7387807c7d4e5f05e0ccff15a59fd4dca69959a28071f6d45c4d688f47eb8f9a10d983475ced98134f055701f2276852e6731ae7a2fa7e5168b0169ea6c9e70c98401ffd62146c845fed7ac49582fcfb2a0ea0dea159c543baa0f7cf39b73e734baa3ad4d79b9f50f73952dd16555e2f6d87d60f5b1ac28be7bcbe8694e80c4995e1d0042c70faa97d51a64566cddc77e03c655042dd91dbb33039cedae4f85087c11516732e0253439d14cdcd63e88ac681533a3f62ca8cb82afd623735e9eadc6a2c168fee647f40691c860619b2be566e8f1b2a61d80dfcb86904ff5161912e7823019826c7d1b81cb2359ccb679cea5ecb426310058ea61653e6e9bb251951c0faf7d11364c37252849e52f6ca13ad6d3941ff90facb7303923feaf662dd6c57e2dd15b676966e15ea83af431fc6ddf0c54e735ed66ac50ae01d14ab611515c842bbf8c8b853050356d81cea4aaaac94a8eac16025b14cfb29e7ccdfab645429e84459d24ddd68a668d96fc9ac5dfb83738c4a0700e0691386c9e943bd2964f38738cd0e86823d4de8436ce3ba055dca1d8b42e6e52120a2686fe327c6aa93ae0e01cdef43db18c329691da937ebfcefb0fa263c56354b29f36c5f54641434908cf58a94d63c08c662a079fbaf0a12ac844475246de067b9d10c663dbb86950a004f7052647a7ad67a8bb5c5773f139e6bd3e14067ac167ab6f932788d9a59af64c41499db18bd5db69738da839e02805597ddd8770e26f9fb7688125d41a16800887092bbb9e0786b1e181943df4bfd77692d34c368f383c2da9f91529eebfc94c5473ab72a51b2ac95b0bb7f7167492a2f0b255e7b3258f0517c96036998ea64c581340c55470e27d3ae4f0c866aafbc39af5443f695532effb53a2ed7d0ac78009635f5e87f9047ebfd042e6fc219352a23676b4833f0a686f2f2cce8ce7758cfaf9161e48aac5ada33d1216332b1bd82ab44ccc5790155393c547de04eb803becc29a326c75940f3b0aa4bff71a11357fa7fc0fb0be8e3b73564eb9584ae6b7ef798c01028180312b47a75d31825262937530d9c4b4acce3280aafd52a7e98dd9c0752f9461b63220ecbaa37bca367fad478ffb88d6d15457e6dce2abca04bf35bac2aa771d797f82c412701f5b129fd799ad9d865e834ef42de4de31632b76e74379106f016b94115324edee0fa165a9fd0cc097d5fd424b5c87d5b7ad364d514e8a7acfcaa49cc9587374fbc121d61c04da311aa772db5bc19e94612e23446a4dc2203604ebbf23082cc7d0543772324231ba83c5e50f0bf2030c13a5172b15cfebcf6eef8ae4024b8089abc9a04e91aba2e1b4e34799d03f17cd0e7cf90ed866e7963ad743171ac0c2471c300d7561fc8b3270b5adf36e2377c04258ad8881bfa6d5d5791dccdf076e687879ea9f04c2fa963207e3fd14a607439b5e7af463269f8fabad5e0f28b61054a3ac63e7c9f181193fb3d38ef8f0d8482ed3378312e72115b9e7c145fa5b2d11fbf7d141d8c2c4fbd78cdbdfb8e82f8c5f8d76845c5a83a534bcc91e10a4e545d4486e0bab549a9a27d5058ba8e8553e1dfcdd7c81a65a50c111162a61203318340eede410d2f5aa933722b4672c10b04350ff29ac4be74b87a58b385a87cd04f7b70b50d1635f159832f17d0724788d59f1a77c32ddacef4d699c9e36194fb2112a0cb2cd61afeb48649647cbe32d8fb69741e123f36df36fba2dcc509d13ece972e8eb16b9b8f821db753c70a45e65b21336a41237a78d1da819cb8ad6028765c6f796604f96ee1067582ffc0cea82ddb9531d317550f19fe717a573056d69ca17166122af24b8a6e1e74923b0437a1c75cc62970356bd8c707a8a71c6711d4e6f9e6ef90106da7ce49542d7aac0f29f52ad26a3eba0f24514eacea5b23f566acbe8a2fd6b3e22b23e9bf474a93c25be3bca995a74980210210397338c78a186d473de7813f246ab4848747c2bf3dcb393a9e87bb68fae9e13b8caf974464aaf0b2f337691cca9742824508ef82dba73af45ab4ba1c1c5e8e9c489f661978d2e99fcf7386dcc7afcf638bda3c44fcfb5e29193e73fe841548e326261e7289e593edd014764edbc254e76e01c056f1453b93fdf5d980d7d1cad2033ee08c4639d923eca4adee51855b433317e2e5d3a883b9811079d58005b67727a4dfdbdbe7315dc6f65a64b5f2150d868240edb1ba9062f40e950fa9437664593816c093b69bf3039ef944aca30433730ccd50e2f10f90c2078a3ec29e2c5b1d205709ad158f9b33a407f711790878d9a1102e1eadc52812522254e1593c20e893463132b7205d19f70596b0b9482fa8b67278ad57f08b89999bf5f5c96ee5090999bd40919242b06cb4cb82128387926f971e96b7ddc85ed031ec6eafc9ba2b27ce21e4f5d052500f3a6ea743e4eb6ecefa92335938a46bcb970fd1a96a400c99083b8c86c1c6939cf03284e37ecdcaeb753a11d021f80c1a10a5a80660b3b20522a5807fcccf3a9ca8cdb0493ebc2b5360f5254a23b92daa32142506c8aaa575e901528f8e06f05ae60facdce33f30aaa676debdbe667530bebcdaa2f2a594bc90042071bc9317549d782fa5685de18ddc013462dae8054704724fef2233c417c61f2b1f174cf93678f4992d4cc8f508688d25280a5b320770006dae896237b4d700a1e691bb2a90527f8918c812205f32e93363a2d5c7b9a17b4fd8df6f37b5c2d6e2ba10812300b9809b52d5d3b26adbbf69ea366b0fc116c421dc49a79bacfd0c462f0d460e1fd96e3103d6c6fb263fd57611d85cef32bbe213775b87fe2d8006e111a767cb46fb19f483bbf4cf5c6cccfaa862f342e86ba206d5ce9deea7ed0c3a9bcadca03018b7a1e776cfa676e65cb19f9ba70320ee3615aff2f1f6bfd07456536af90cec5303b9be891ed4659edf57ee4b29a5de47edc00591038e16e074f50d789e1b29970a821d8544cf0c12b0772267ca9e36ae897845ffc9623eaff516ed3df96b98ed6d6968dfc14e6856a9089c5c04168962ad171ea74ca7028f6ce851286e1cd582e35c9720a5ecf76ba3f75c8a4b07a500bee84930959e5016fce40e45ad1e97672bf7966685fe233138c749c0b2559f1de9a6842252e65dbb1bf44780f80c6fd02bc3546f2215cbde21364a8b6f7a2d65102269a8c11727f06f1200b8fe099bb2e7c4936fa3199251f71a4f087fdf75da25de1d5627428182066f4a626e511d689fdcce891fb7609edaa83191085d56a7242bf9418dce6b8005f15f96e80a767b92d2801d16df6a5bbc9c2d89d3527817176d82877efa4888236b7e16c8a3c24d98b9aeed84c036b79c0717511cc4b1ca476d2d28a67bdfb2dce9a651bcd6240b7deedc752bf5fa60c8c08ae8af9802fb1d8445f5b98ae0e09223dc8bfa9802c0544fc269647707a42d48158aa6a6e749ad94b47a83da2b63f2ed7e986452d2fbefa97b7b3a73f7fe600816fa1044f170362e901b06a16bf784c38d967b4402c48358a7d2a3c666fee936c7183e12b15eb100fd669e7c003e1fb77d3280060019caa7753b5dbd2d5d60ef3e5e1e93c24bebf4d4fba41424483a714bc0c6d9a22aff504a5cdc93050e8d830e482d167aaa6a6345e8d22aae921444f602cfbf4831eea2d2d81a762337ad64b95ad8c82c1cc37802f51f68c4bb4e112ebad9fa7b0b103b432ad10bbf5f0a7128f22457888287892d557fd984817fa2aa95d7280066aaa22a9ae18e68b7bfe1a6b3bb7e3e5b42bc46fa1b58a9eb54cbfce52357bf89544346d01636afdc6c4ec22386b106ba4d0c85daa710bcdfe57f25fd36f616d6dab806a2175b1b4485d6b073d54171d5189aa6c09678fa251a520399af07996cf2236f2ede5e166ab24b7a0893c4bef807f6c8f14cfceb860b51e8bd8a5b7c9890854b2c54e0319c7cce3971c9465d649bc674b14ce39c8ebbbaf73da6b2e78ffb9fc86ae5a8a1305bb345668d4fc94a699a66c0665035b74b3f00eceaa22ee90c7cd44a820a04ecad16bc8eeb9c486015a00035a0ce2055333d00665c4d85f97efcaa7cf5fa5e62295d3483c36abba2f9a9cb0c819877ba5b297af86c16657c8f7b97986a3808b1a2e28ec9fc63620aeedafb03c234a8c72963e77c380e69db5364e489e682895bfd0b9d8fcf45affc2a114bd54f67b96ea192c2577ffa4adfb1055229cce8072ea1cbb970c5740438a28b753ce2d288fad14edd4cee31d30a1b15588cbc202af50081f7d1ebeb0e575647d4326f6975f97eb3205dd2ca3c5da14ff0ac759a5e625697edfa0c908384bdf029c85df1d901f6dd38516d6947b71cf569b75c7a3805462db900928b2e1dc98c524261758017e4ed9ee006f2edd755de270165a937e01a9ecbc3b9c1d89a8cbff945bdbee95503748b409949d11ada2f0816901ae547abf1f17916f7f8603400993d3e30fc9fc8cb25687e6a4b83a46b4bf0a79b1a38996a3c0e40578ea0a96da134cc7c592c11786fa4da4f00e48f6f4a3d4ca57e34f464e49265c45d445d1fb5aec1b6e6f78e1619c3ebfaf0601c34d884b044ea7e9435056ccf4142a5f37cdd057234d3e2cf73e38865785dfc364945b64045630724e158208e51bbc72caf8978a6c7f04da387a1f1bd551ef83e54ed61bbb93424ed8e444ea8846ccefc41721fda74cabb9415460b181a101659fdefee4a773345a4fd13365d4dd63c0930adc38b103fa604981b350ef40e002027b719581abee3304a9502e7aab62287c5911d89acd0386ffa9735f86748eb23ebcb86df39b58055ba004d8be543de11c8ce3f34bd33552db7de0aa59aa6d3b694c4e66701ef9991bfade5038d5045209ac6f1c8f32f8cec4a78a064b931ec5162e4b6c258981bf4e46d4f8c6b980f7bc38102f02e51a514daf8224124cdf57cb487298510c7c5af7ba65669a6f6ed73362d74943289d028638a0f59f06c9cd99066ea2f8373c8211d72eb18910cc9882ce5b164a73fa4a23d802245a1302b04219a4905c1942f247ed384e38f805969220c579a80c095d7bdf4a829f8226ca7769d3b764c2d326c90cd0cf4d1b3192be0169727acbd1428f0639a60492f3ff9ae22a1a4f973971a3f5624495efebffb4a96e037b7774fddd76d5f177235ebdd561d3df5dc6c21b23053cb02a61ec17a09f7d6b13bcd1a2c0b168fbba6b8dfa71178f2538ff93f7a6ee503213f6777c795e36e3dbdaa238a7a8795a6415966e408d3bae7edbff9055fccf5b8eb9eb8e3fd8273d5b67d5ee60788b9767e387798d3bc6c3bd08af64a9e9ddad38a3a978f19d5cd927882624c9555fbd166c012ee76fd92832256a6ea6db69b0da2d1c4716022a07773703b2148ba67abb6497ef3cc46aec542e45d86bb296cbb3039072fdc31baaa9fe25c91f66d15b3932f5c6e8b8c1cc8e84f07e89e06771f7b42df4efb1c096e267604fb0718cdccca62069eb6d5adef69a6962d3661a77d578eb7cc3c6dd1193f711b40abbf58a9b397cadb335720ec1dae7697a575a8ef7f469ade21b8ac433e77164e1686f9eb91a217aedbcfa4f21cb8859af6f7f5068df5469062b0043fabc635c387ba4ac609086ef75b7dac1e9e5c4be4c71f6e1b850ebcfb9a11b446ceb9287d101131dd8efd05e5dd8950831aff93dad92d7b07f2ac2f76bbb72375c1316877200623c3c1964b468ddc63e66a4fa39c1510e5330b73bb5037e0553bf10f1d9858fa8861533e2b34101e08f9adca771f489ed371ef0af122d21d258276b1b71e7fc97a891035aa8bd778c3e0cd0e22d18830487a82a89c42f576c50d21443319a9f6c2c17f81aa6964f0976e3b0be1cc0afe11767a24ba89fcee71ce698196140e405431536734dd7df0cc209ba294bb0735b200563db69d82541aadaaea28a8350f117007d5f268430d323d6400155583175f95223311f5e8db6817e2e6cbacfb7783a92a02013688a75e97a1895226140fee3ef8ed4cd795261f4be37a0127d41cbf1881e5cda05c27e3d1b89bb158df7a3a149275d7f78566dd7daddd11073f43f05ba8d1345e6b642e3ff16752efa2c747d057dcdc4041f2c1c7711c05a45be4beb95ac56d55c57a1105531308a29f9a1c2b2f47571d70f41d4ab8192e70070961874576ec020a6b25e66cc1ea05bb8ae95f1a81abd1433815c7894b67a56ede139083ce94fe71924c7bf321a3397140eabbe72e5d369f94dd0c697df96d9a7ef60175f321cc9d4bedf692d5eb83a7f54f04a8d53248842f54e1c7a18926eb1deab56ed106e55ad7c529f0bdf845669a9508f7d755aa0ffc821449626036de353b2d6e2b046dc05678e82bca6c1e33b5d4e1a45edb9a339fc2ce3042d3ebe13a05ebc334c11355447058b13bb04a454064e096b448ac24aa7a1d532fc4e303fceac31e556a037d686d977d2769ce6409542b0508575c4da93e14caabcc6f4aa94b552e9bd0c2a05218ea6021d098bc10c68a85888652b48fad5bdb88acb3f4b225a4524ac0d9c529f51c62e53cbecaeeecfed85693d53a5e6dc207e6cc1b4af74635db04c8f99e456dfb4d55b9466ef6bc54731f9e6c9ed2970ea33dbac294c9d599842f0d0384f8475466b249dcce37abeda6e7bdde9dd3074802de22541f4ae9c349418f63c8ce6c86d2585b698f8ffb7020711b2e354028a5144d58e20f155e7ce0c2e78ba13d109e208087fcee19c9259c81df01c6ed802751b9c484bb7344b629d714a489f5b68dbb6a4f35008fc53448c4a98657b21bb5cb579e1918d1f2a34dcc0b4d158be1e946cbc16079e6cfcb949e710fd604e7fc2264563940723a7e95aa356a2c107cb6612784e25e039f4dcd07155cdc55be07b519c3087c368e275d591eafcdbea7e6404a636f4200e612ee651e0bb20d78d6fe30f2fa6f08b048eb67708dfb778e4f41ecbb3a89a45f94c4ec6d812c50bec87652e5420a74c35142ebba381d440b2d3efbf72b4ca1c8d3699a0018efb19aca8c7859537c755cfb8c9fb8c2c9cd6392e8fee601c0a90ef5a9b56bb4f07af83413e1ebb917662b9313fbf86822ac301b47184bae68db7b51df352853231e73960071bddab7330a4926b9eb1ae95dbe46924d60a2b6cd95f8ce413123b2ad7488890f1a07e1b31f368ca8f1428eb87640f45caa70042fba128a88ade7abec1613603b99c8f1055a18554e4b942aed94cbf141079595fed78a40fd577e55d87203b9cd12900601d17abea6de10370d73bf62e8e48a23f28a3dc5641013964b1fdeda941131f93eff0044642401f02413a79104a6598cc1289a786d1ebdb908aa19f1af25830b769da773cfe952177119dedbaacb211c27ab3df9e803d1215602c5506bdd5b34f97c05bd8b72ea8c6f3ba1788a401d37f1aef544a743592f28a497342225ce5af1ab117e2e3acddf7aad690c1d63fdb5b62dd1ce30607e15e3a1a1d44f14524363f21918de3d151afa8027c5daca7e002dfc6c843e60c2816249033824dd9e086138477544cfc6225cb63ff56c2a18656e73db57bf6703567c25780166ffda172e25d39a49f01dbc275db192b75685eb3f6ba540f9c2ba1dc198cdc3e670583aea161120ef11c9321df689b721047bd61e6fd32adf4424b231343c76715f392849ddfbcc913b1e19b2c828afe00cb15de46e3d4265b29ae4e5550976b2b4be07111acbc684ba7a065ce847941f29f69aeb42ebaa1aa0552ec06102b57695b3e3258c415cc9276c5fc1ae8b7061cf4e211b29f19ace5d9073e1c517258e8f64542117a24af92ae66b2359b525851f19c9cb272493dd9076664d250b52815dae419e7e0ff4cf3a9e36523f809115cdaa7ef4f5d92c4bbb0dca5c99d5bc84d2240e6cf94cca12c51cbf10a554b10732708a4e569e1ae3141af89292d2ce455e70c5c6012de25ea58dba6937ba5e2516140664bce3c20991863bec90165c14d3280d345ccc5b433dcc374898b1df85688d5283f69487a78e3bcc6fa1f203d3adadd882838974fc524b25e3b308b63d4c67822795064d867798580d44e2d9c37b0ac3f1c215fabe6a303946716131a5513556b4c23d4cedc99ed5ea153b09c269a5c4d0964d598ad614b752b8aafd3459a90d35f214d725d27a15335800e28381a78f1a1e6bd79cc1af6253ab9acca0358fc8c61b675ea6a38b1fbbddb4f7a8bfd5c684d8bcdbd61f155c41bffd355b7ed90085f61e9d8fd0d9197cc1ed667cd5315cc967b91d5b08f6e53ed2e69dc391f782d20c870ec957e9c87ee3ace30211fa762aa3d67529b78fd0d29d0760f861ceb4971e011f6dfd41320aa005cfb6f6b6d74c89a01ac0b8ef76e95142cb55049ee0be3cc9476a45824fecc478d1e6ba584d167483dd4d35e858953362e2b7cb85b99fcd57ddc2aa005ed28bc729eba6911517ed913551aa96eae75174f1d97480ece9a217e1b9ef342bb5d533385cc7833157628fbf35b12f72ca0c76fd0523bbc3233b9b613fa8b88577583d1d2e9686611fb9fcc4bf2064be4ea8dedee40c8143585e825093d7f7cac56b1e303e254d639b1e7bb0f2a12462a4a74d0bfcd4eb44e22e70700f4a63cc948e059f529cb868b473f37c63f2c45015407d2c370e6a57ad6a97f2c5657e8d72202f2a4fb3c2f8f57f42104414331300a6139c8884bcacc66b349c02ba35d4642e9d77235815e732d04e479491ad0b9a0b929a3f225785dc9ee81102b3929de4beea2f20deee81848e49de69c76e25d8a558d794448ac5f2724fb59f5d9013ddf7964115a8571760c8d0a9349a6d4a20f901c64639e82ba0469938d7a637db42e8b5daeaebe149be176c44bab9044699c729c44727c86571c1668cba05b7b5d6550be05af5f162ff20c982384a3b20dd34ee7de3761413fa26642cf41d778f395e8fedc70c5464243619c87589cb8a3a216877b5b24245796aff18707522b0273451238b9af08a891e02ad610fcd9c071f534097171c3775c2aab62fc6b28fcbde31e3e94462a71aa106951e12cd447783dea45fee7ef38f99179121258ecb04d1b2aaceec1692ba5ba87f214832fbbbe2a8267a583129d7c488950ef4d1f0a911e6d73cb5025082e32e22a9965bf5865b7c7b7b40a20029c70c79ff18b07422b79ca3b4fcf5285800c890eee9900c2284c87c05c8e5ee8ddba754d419dde2ee769016c51e73ec90f68f7f4f4fe439b16f3af05159f62c420631212c5f097239f7c6f5290ff5463770573bb814a571ef1bef964e24d64d730d709a182bd18de725e829f24adebb6b466622d631dda25beee1a26cc57dfadeb81cea89db742052beec56a42c6251fff947b331fe6b880ca17fee41a6e9449eb621f78e57af8ea86102df9d682258c85aa297c437ac530e512342f1212fdd5bd2036a98780d4064d380f45bc7db8e7a4f37ebd883eb5411fed55a4d53eb6df5ed9020463bb86f6c8b2eb1dbe35b5eabc316728ca7acc65519860dc627dc4a0a6ff966b8fd188e0215c20673b71450c2fb9506f3a2f2b4e6e1ef92fbb52e66938863f5f5b6a429569f590ff3400bb3682ec021edf3571818e5929200ef607c5fd91126504eab632cf04e7463afb87412183dbac82a642b83e5181043b739bedcc390781319d201b0bc9597e8e3b2f0a1964ffdd0e50cfdf73899ac4dda1568a959ab320661a219b550b36a2b85311696fc10eaf526e8519e95c2b1141e51274c0770598904506520ab70a73649188097b153a063745cf5066db5023ac39924b84af06473cf04181f2ef16f29daa66a24c2591665e5ea1943690a007cbae20a6c35c5690835845ef29c91834f1179de2bdc882513794e5011d9888267bffdfe50d283c8f42eea1ab393a1c99ff712a0307d9caef453162d91e4b74f53121f689f7e8257948283bcede76e3607f700b0c8451e73d410eb04040f8ea9a677a9c984d753e038464fc59b2e837aef60addff7a0bc9cd93fa84ad19e6b20a87ed73a26776c37a6e5845f5fde00c0f817cd3edce63cd4117cd6c0be7ec4a64547affe743ec13e7510026c366b944da0d260302e49f03b2157c8381bb218931bfaf55de3a21844f750ce39282c5e41e854c3bc8b0332e33cc69f01bb0a8cb32086b8a54250e78f386a98f108ce9331d1ccc57a062cb83041f966efb179f4b41b37ff73c7b35438622aadc311c695109520e1441225ff8b8995798deaad30ffa4a59a8f4ddc1c99458dd9a7bc92646d37f43a9535b0c0a6d1e7b1de3c0273554e0ccea95b84450d4228dce3854e2835ab7c06857b8a329d61a230d4f7699b23474340202a35e3b99d6f478856dc3dbff0819b77479c53d1bb0707ba0208c80d4f59334e8f041e2e3d84b8a14e3e680d350a3d3955a50f4611ecba079290635957ec7b52656071c6cfbaf209975cac1965ee47c89c0e0c0043f2e4a2ddec3a2c0ed831868d488977b15623a55716d61bd6d93c937d1d975b43595c3d08dd0d80372ef2cffa1f93e9a171c1264a4f973c6b90f3c76f11ecfd67747cacb20552258f0ac40768f83059b968bfe0c4e5e8bb122099beef125060c7c844880747d8fbb4c3c946f9052781984ce1ceb62a9a47c6c64e4d33a1e028e08b693195203f95a68001de2cfa5c8a0a79e0d0b90489d1fae7b95faf3f63b31af1e0de80d10c218af5e6ad0ab8198786a8125296a88fa00a358a96de25e84256268d20c7c51dfd66b7d713699ee15e429862354e014042256d369f527aeed79122cabf8b0529d7ce8a389bdf4b7d9a9f66cd62957b256c88a23fe46f5bee3350fdd094232a3910481e00a55c43b22cc1c0747ed73920d78f3659fd8a071fb82ed39a7f8f2ed0d86b174b0a775a89aed990627114e629b2ab95fb170cd5a97aa6c8f53e22867fe78dca147319adb960773bcaa5b7236f5180c1de1882ebaf43fc963aafc3dc71fb00576f27ea934db83382fe3bf9a62e9bac917020fd7786cdf5bb32b93c6289d947544ea6924da1638c8e9960f5ecb48c282e44a9f14c4333893b888860e099f49c9d838edc359ed252f73edaa2c84ee518bbe6cc4289c801c40704dae916935a309ad9a8036d017d95b81b7534825bf2d2eb59e7172b99af1215d352945a7b55d4f985a604e02d693b8187001706eb32008b85bfee0d409597f7ea7b5b741153d7f101e64cc00f7bc9101e6b3e07a234b27709915b4a995292015309ff0801094ee9f6a4c1e9ee350dce50c7aca9b973de50b145972cbed0e5ba68f1c3165d4202c4e8eece3e41f1f3f93e2d3fd5188f9452de78dd4012f27844375a104ff4862be4051bb6ecb4ecb45469943ffd192b4f7d9efe0cd68c239dda9efe8c9946cd9869903efdcd9b71a44ff43fde8c959fe86bde0cd70c240dd28e8df219ab06a9ec6f06ab41dab2d352a541fae534f84d6990ba7f6a3ed997d32095f275682fe7a5d2066925cb4ff23fd2468be2e052fa9bb672050f0e403597b63cf522463facf4378da4852b5c5a82f222563f2469e1d28883b6ec406931f9c04a01d4441cf44d3db01febc6723c5ff87205ebd2f07b89451c547e78c31577b05cda4fdf468e8d2902a8893b4a97bec7ab2db0393237608d0abf9c8fd5a8f086cbc6ab51e1c7faa6dc70d1bf81a4bf23365af46dcc748a55375c97da685dfa9f8ca77a46f06071477ddab27369a57109f002c140869beb4fc5865ca5ab820d1987715ab264ae9dec24576e4e93a0eb41ea0b69946b9e902035b0f25bce8f46360d31ebac5ba89ba1d9cde9df6d32efd5d5ae76ef5f3d914e87be50540589be5ecd132fe641d13c9836bd9a395f44454465a6b5c07a349a269279ca7b45ca491af72e06f4f9783697f78a32bc62b8893b463de2275a7953cc3959bc9877e345f1a4740a064db451c2149e6a559050b49a8005e268265a4d11cc26c1e2783827d41ee340b1fc954a20884bc73821d0a7a9482681205e0a7d58ea55cb34abf3787ad532b5e31a4923e12a8cf38cf395ab5c5f49c9612a8d9af14e5dc9f49146d5994642776815aa43673211cc26c1e2c040709b6d3adbce36db749c3bc21dd9622f5bec65a3b2cdb69b0d6793b2e56cb28dca36db74b62adc8a93e18e805eee4e677447ca1ef2324ec4e14f659bcbe394914b3627a9459a21b91a4591344a6a24181352934699a4dca2d496974846a9b74571ba49b9fe2d48d8502413edacb0568eb45666a69cf2b6b741f17fd228f9d2ab2db030d968c61380b5d8c0868c335f9203b1c0f27475ecc913282e1d309432b7e7bd3c184a861bbf6e1ab7f176b3dd3488339a79ca7b39e94b5ffa8a6c241f0d3a10979d32e7dca66cc661a971e167c7596efcb094ed29f194489efcfd91244362792f98a7a4478a71e2c877921053323a01f49434e8a30b850dbd9707bbfedb36e292b03d4cb388c37faee20f3d68dcfe2a67a31be530fa078c3efaa987fc968cbe8b69a9a2ca92d1cb6fe5b3679c734e6e01851cb8f2670db28d1f7ad8b83d6c5cd985381b6bd04211cd2026ba81b5d7dfe248712344e14a9a52db927d988ec540841808091bf35ef28be14605d6f472350a49a7b8d1e81be9f4cd75ea042b5a89563dead117db98e5e7bd746c68493252e53fda71ef158b512072117281651c2a9d6a4d08eb83bce168d694e50a89567ac40e94c48e6671070ba926eee04ab50536243d11c558b6416914b39417295689a40c11b751e9dfc216066e8870ab0215e20edea81077c446fd0814031b8e66235289542ac55045f7198e69670556ca10bb1ef3530d13ff50062664a0b93238d9e8145ad61f4b242379238f93d1c5d09f1ecfa0c1d1b85c77413774a5a723920d61c3d18c04f314d71a1b2bdde06481e53d8ffabc16ba42ac4184c303883bfa5db087955e7cec62603c4c8b565584c3358894f000fc59beb02f0c6f058ab762713cb55263bfb0c64432d08773fd3fde0a92065da4239a354865e529914809d7208a421c80ffea3fd16a757d0a11878b946cb73f916c93c286229ceb0f13e14811f916639cb8a3df29e3344af3d4e612c136570906b3b11d1b338964225983fd8d5c53b436b5176bb6980b2c6d2ef0869b89337531fc5bdc5ab619dcb602cbdfdded99e40c1658fed1935e7e4cc24a7ed2681571cc9f3438ad468d2ec6f2c77d5dcce76b373d49c416c413442a3b1e9ac70b6b5cfa9b17962efd90c7c970831199390de2b80a2cbfe51adecb53d2366e7fdecb654b5f473adda73e354be914e91bedf4943b9ad92876f4e107e77a30cffb6378de2b06db3c2eb634b191716a136c389ad53bf2fa412f1b461c5783fe5f17b32169d01f0000e8623c1ff6cb1b430c5d8ce765d86cd8e862badf22e304c023802ee6c68d2ec6d3830b79ec1a605282edaa46a77755a3b36a7486b8de6edc9841f4337431768256b2c8826a539b9352a1543c9e4ffd7c3c559bb47360e716e23a39b710d7897e0b71dd0ac80b8988dea5c8c670aadc183302cecd71630cc78aeba9116915cac1e5e862badf401c773db6efafa506769b82260404cb32c06a5c598a5b8c877643df64c53c72fdb55fe3bcb04658d2bcd06eb1500626b4ff8c669f7ed32cee78c51da3ebffe97ad0c9da620d76251df1dea275595a2497a764fc4609259d92e9565bf840b4da62e5a956f9d7f698348a75e49d4f658d0a45b22da6042b9f6adcd3e7ba184e24932024ac01646c25b0fc24130f1aa39fd1fd0bade9157198a48e52c5698fbbd153a38f343ff23c98d744c45149bd9757e3bd3c1aefe529f1601e8dd7c473e229f19878308fc66be2c47b6dbf7da88b916fbb6679ea8bd476b3e1d8d8622024768bc51d9cf79ab23315b1b918c7236343c6097d7f1659cc494325c9590aa9b5cd48ab485ac934aa7b7f12abf3463aa32adf68a741d2aa411912ab1bcda4b0fd9366737ddb4bc230c9bfedf22dc5818eb01bcb53261d621431ed50fad18fbe204c4b485ffad1973eaa628cbcd18e9f666d00df7236d9e59fefb56792cf2b93fc7060216e7f1eac4107b16ce8bdbc977bb0464591482492bd48068a64e188c48160609b9aa46c3997590ac913cdda00fe23ef01ad12c9b4b0a2558b4ca3e4164b89607ef2274d92ccf588b3c3e84b5bb061c4e16e2892b5ac5a44304f89642d3f14c9463b394c15e91bcd4c60e70799800cce029df25e1da9e8dc70341be9f4c9fb1bcdb8b02195b1a965d7db74d0d828130f1ad7f48a38fce5b571e36f3b5c5f26f9f1b8db01a81544b26d07570317638af4f1871053a44f3413ed18e1fa6f36d8d0c57c98b7e70e0a16f4dd136c48657183d222996927ee58798af441444d44d045d375c3d18c45f2465e741809406243efe5bde28e4e046b11ec3a7dc28a609fdfde2362d2232e5cffdcd16c948598da5cf70bd73fd4c53468c6868ce33f9a798aca46333a922f3bc8ab09583fec76e495e53e5c69b91a15eb87e69ca1919556832b332fb87ea666b2c2a4c18f87df95232259a3bc3f5b031b8a641d725eb87264a5759d88f9bae168d6b2e5b7a4249790e86cdab3fb5b32fa78ab5ca73a944a835efabc17e91b792fd9f5efac273d2f1b402fb0a148d681c186015e1d46d2f0223f8c3957018d8a3ec042e6bacaa35cbfed7d0c19db1ffe9319119689f5889db92123f952c9da7f89373f23d881d650f0e94f7b5210599312ca34c9d7666cc84eb6296a368e714a57d8edb9e3747638ee0b59093f61d7e7dbf3946236e4e49c56844176ad08434ec31a359bc99df2e327ad96483a15553031a7268c393535b55a5b2afd83edea9bd9852bc428d46a6da9f40fca2f04db75270c9cdc1a6eb4412273650d4e2a77be676571e4738ea7402738383737311d3a5e5e9c9dbc90b8c313127138f55c9ed877719981aed8a24bd8ad3be387910995d9ddb54dd378db1ec699dba8b36ab5f55539bbfdfc96df3ede8f8cca6c87ab747bec6a1009bf2effa6c1748b892d6ed3679db3d6dfeaacb36a9a36a5bb00c7c605311b17d4508d0adbaf39c17a3e7611f0bc9663611aa6e76fdea685594d086c5871b0ddf5983caa56bf70ce7e2258ade713ddddedddcdb5bbbbdbbbdb6fc441e59cddddeddd4d5b879fa2edfe423adddd3f7777777bbbbb7d748cdd35babd1b65bb7be56ecf7cfee89457760dee6eef5293183f1b9ad2bddd654b1963d4d17dc1b3b0fc119c54892aabac52a3b26a746251659573ca8a4595556a747241568d4e2ce8d4aaa453e3c2a4746a58c84a27165556c9052ec88a4595556a747241568d4e2cf845086eb74beaf98f17e3297a78b81e1cecf5ac5c4a39239d9519042c25cd9c936af2b5e2417601ee67d7a32f7dea40224eb5212211c0eac6cb29d6c048c0b883fecac503f082744b80c8f942f27a315db9388afc5c5a77b186e6619d0772eff12c790f46878e5abb987afd3d1fdee15afd8f1abf3cd6c02b1e407f5cd26da186a768909f34afb806c6411c403fc36ee7e00bfbfae784fa7bd75ed1a9925b770bc58f345694b835c6a05c7e215136bb619c451ded4396615695cb2b70e26a54549aba21771170e7d72adca9021a445401ae7c37c04c154fb99429ccd8d63d42cdb52d2eaa94f2a5ac5283538529c44640052c54d25f5742f1842be50a40b041fe6f901fc64c143566a2dc7eca85cdcc912bad605df88a1b722950c195d22605545c69bd4ab63366125576e08426b2e842042a47a28a24aa689d1136aaf823c3b8d2e5060f71431a6c884faebc618c22e5ca304e8954ae8c3a376ec832574a29955cc94caee4263712e74a1f5cf9d5961e7cd9e2cad701e3038809a470e50711e2822bff023c28b9f23b50021aac5a336039e14a1b1340e1ca67d7ab0505f6baf2045fb8d206053657d6748bc60db8d0d5c88d92c1881a7421d840dd875cd5fef3fcd9366d033dc7759ced4adc57c488aafa4982752e11126402f26384dbab7810fddbbb1784133af46f5f10fe3faf94dbb64d5ae78ca7094ecfc3f4ac73ce5a1fa6ab67f6e64e581999fadacb7c806c2d0dca2042fc24dfe3f1e027b973df2a61a3aaa3f71c424a66081daafaacaa8a37b0aaaa228005aaaa0e55fd307443cb76e7be251e4adb536bd55eb4af881115e8271817987571f194f7cb9904e536ad7aa8901e224a3ea594522a29a5dc531ae44337fa7998e6bc8d7ea807a37a3e34fa2126f4c5a54f57ae104a29fd172b7187e4964c5a8d9a29ff25203f01bf9425263a09aea97ea2dc77ff7ea2dc51aeb3496ce8ed87961041e41622a2e6db974f631b71e987fd624aabf538e4d16fa6a1f47900e229966db3faf9c26a59e6b57ac83296691f10d012f60a71876b5267197d9fedb1414b422c3fd1d057c4888a577ea22e3fd19f5e9106e9771ebffc449ff34232b021cb2efda6cf541a45c31aacd3a8305661599128dfbd46dc319fbea845db53821bfa4318d626b1feb5b6770e1e4f143e7eeaaa3965a25b1671e4258382f541b245970d1485edce94037dff1de69bbe3d530efe9bff66daa17ffbf638130f36f570fbc66b52b96762ce33a936af1a8c9fb4f7782f7ed29e3d20d54f5a3581ad9f900635ab84e5d7be2171d6dd336895db2496bef61a882918f1c42fa48788627d0562caf3120c573eb7623cc51ca2aa56e085785ec6b841e28e18a518058fb7c58e0d5ae2d981559eaf881155c94ff245be7b21256c28614c00888c7fbfbfb42b8f6db5d35e7bd01784133a749f89bffba8d23e08137f2620a07f405481be7bd01744112776e8be20b4073de833f17bde882a08530ea0ef5e07d077cfdf7d459ce04f87ee3d5f91edbb2fc23de88da8a22aaaeac7f8d0c303a2caf33ec4d007e279fed04755f54caae955072f882907d06bbf03e8b5ee833031e877e83ef405a17da61c3e5fdfc4df0e9fafa61d3cafbde7b5ef7e5ac0dbbc7ff160dc559d175551e5d1fc02426a8ec7886c990396b69dbda659e2e048ab26ca68d537312436353128363956b0ac5c75ecba7b943ef9bfd010b98f399e23b7ef1b4f715fec93e7fdfb7cd64f427bc3bee16a9d2db484041b7a8ecb5b316f4cd0739d3ecdb2b09286f9f272bd6fa4dbf03a9a603d54d8b06f62cdf462dff40d6bc53da188d09c52b26466240dfa0ce8091b7d90a19422054aa77cc58a72bdfde67aada5d23ff8e26c274f66fa52d2c91486a3602e59462352f264f9e486f2b603348f1155b040e6c62a9898a982099924b31b6d92b86e8d1b6d62b073aba79886c64649ce0d998606a7869f58c1862d73cf91b4c8df040526a3cd94ac12c039323509eca65668da460924ed0e6b54e82d67d2283f62497d249daadfef2d3f49fa7dec849bb4ac651f107c63a8f4ac5155588d32f9d7526ee7340e15d96ba36495801bb27497d069a42c715c8311a641fad50b417d8f7bfd78651123aa0aa47e3588d59d757a37c01995063b641a19f7cda16954934639695477aca534d83d651ac186356c9c96795381718b90a9b2abe422101d91a01cf52227a9276bec5a9d9d466463b384b564d5b2d16689d8ad29818d364b1c991fef1232b75f5a227488982273a34d13b01bde68d3c40a6e113a5ba847bcf2e534523bfa85305a2e578a462a1702d1577acb4b82991b6d9ab8b9d1a60927973b1c5ec2a06f0488beb2148d4491c624dab0a4f477ec28fb5f7e4858bdbc8c52ca180861dde50d5b74f95861e5546dd185ffa594374958fee8ff430f1a3d685cff9c75002501250125012501250125012501250125012501250125e9ee6e8e99bb298d6c69b3604159b00fc2428d2e402f2b92b939b618638c6f84f987e9eeeeee36783c221d771e209ea68e886356ff524ba73eef729aeff1ac7b37e80cccc55ab9247cdbb60e14e1d5c7c371bd6a14cf667d17d3df8a79c52deeb7f7e799bb5166cfe779ed79560f73778c92888c32ca2861b0b42dc3eaae570dba911dd8b05b9f1f1d0082b906dd79c52c9eed3428032ac2869107203ad028fed7a6841b38b1fdfc71868d99993bd0df2897521af1f81cc5f6b4a7ff90f69c8e8273f96794db3e39768ee5a41ad5aae7233f1f6ffe54cf6763fe6c5c0792209037839a378e39ee744234cc176eeb40ec85dde4f2876838f62c33efe8b44caf74767466b127516e9ec49ed4b09217cfb08b5bad13a7cc29426868a641c7e56e6ee6666eee66eee6e6666ee6e66ee66e6e6ee6666eee66eee6e6666ee6e66ee66e6e6ee6666eee66eee6e6666ee6e66ee66e66666666666e66eee6e6666ee6e66e668e5f9ce109e865638cee39e79c2e7da367b468c5b460dd188bb2736f8c45a172632c8a943b6f8c45d1e27637c6a2c42ed712076c6620538a013b07c1a68999e812e6985dfa5b9cb173abdc193a0dcaa8c86633a4349833434a8374c6944b3f8b2ca23408e5de5c4ae34983f4f4a27de9cf8835a89d5a336a4e33979e5c973e89a29d28a29d258668c24c76dcbf192cf9335a3746fb4d7a9b11a670c525bba7d528f6820b4b3fde6833c4eace1bd2a809575c37a755a35a8990249372e9d378d229a9a23094dcf074e4b49a51737d8872e98cd8a53bbc0862c68b8f2a9bc569e5a996999f58395476c315178805365c719d565ceb86530624480c377e8c1a292b2ea90a576039643b74e5499a6802c594690f4487209b9d79caa44391f9d9d91b51494fb4f2938846d3887c6a444c1aa42c62b52772229aa2a641faf5db13356954143111d1889a50cbadb838d7c74e8976fc44bf6b6f65b6c2b2331e36ae6867734d86e9054a3c06dcca4a4bb4e3a91c37a21d5ea29be52ee59c946a5aad4e786650123303cc33c3ebf3d9368eeb64ba2ee6c492397272c556c4013a12736a753de43db1421ce865b70f753c44f7d40a4000661aa4ad2ee6b384d51ec64fae285a59717f4dd334ed3443049c71219969909e5a0dbe780103064b177362354845be22ca91e32b2bce6ab10c342cd68ac873e4342acc7193634aa398090b894482f182445a119148244b0a8148a48e2403e8b45a61cd6fc5884afefc8a9c587ea2dd813eac31368b40a107ee691571d0d78ab0462efd8d94e3c6533972e4b8b9f44b1d0f1b37474d0b6ccda5e16925f2fc69f5e1c10df96a4fc3090d270dd21fc0751a348dd2be7e4aa349a3f883d160d22827362eada29526b58e60c63959a981e29233829b4b7f05e629a9a22fe24aa3e6e38a38e2f524588db2475a8dfacc9ce89f90506f0f880e0dd29968b5f2414ab9344883f4b46245894e5cc4a4535545dfce7c6bd91a5193cf17da9d4bdfe6c8726e3865b04b7a790a74118cbee849a362855d0ad2dc90e4443473a9e87569dc9cd417d81761cc0112c4dd6d64aac820cd6c5e20e3f6bad6b29cd9cd4e139772130ac50d671577cf577b5d6ef7435ea60f4487203e3c359f3ee8d1a3fb8b2fecd734afb60cd7f34dd9a4d220fdeacd5983f42375d9fe15178d9a06e98aebd215d70a12ba5dfa2bb195289df2e4ac2899b9f4b46a72e98a934b576a2e5d8172e90aecd2af5a9f568d0a69d49c64a846a3a651e194695346a72cc7aceb02e0606b6fe9395b74a9344ccc64366e692f1b18eb32cbcc9cd795a12d98106e4883b708ec8d4c099c9d1bb85826b381cb062c3660dd1feaed21140358143951e8d0908d8a727eff2ef85845009c24f1240a58144f6ed0763935273649c854a1647563154a88b8f1230fcfd5aed7835780e375f38d7a69c2e4b22c1471f40c52ca77fe86f0fb8d77fa674bfefc0de19777083f8c52830d850d43a12e821452803efe06f2a2aa763fe70cfdfca9ea2d7641fc39ad87faa1ec1eb07dbfec80f4578455fd204faaa206f25c15bb086c527e219197cbef7998ee8ec7479326edb77e0ee4b52af499b4e73eaa603a7611f0ef4cda0724fa69ce49697b131ae88006511544f7ced476dc05f17c7d1db82f227f2bc2aafa9d9dc2522a83f097ff89dd0e9ecfc4f533f107a4bee75915bb1de4734c876095ffe659f7d0efad1456fbc27ff110d0800734a0e209273752f104ec2ae1462a9cb0e26a1f6d2cbe49d5b1ed15b633e097e3176195f65e3db14bc9ad9fa20724b22cf8560aeb5f8c600f4e36af199750e45c6fc2ba2e00f9dcb94b77e92ebf21d2dda5bb7c7f59efd6dadd5ccebb4d7937ea77d39aafe7030a8d444fb16c020d11074bc9d2dddd67d54c931ffc960659c62867c85dcbc5386b832597e52fa1c07694097c032b29ff1248e0400183e2090c9a19176984af6e6e7fdc116f8ca1f4d65dfad43a6e7de957ac5cf41457e9936c0dc9ed76a9f26a257df27ccda45f35f2d592a6514d66c9a7afae9c4f6cf2a39473ca66e11003100dba03b9f3397604a2087f7e2b5d6196b260b7f744d7a234aabb188d6a5b0c3f69d0b9662bcdb4adca1a37da5cc90a36e41a4d3648a7e0528c9f0693d830ce580431f5e2a0cd6304a25342fc2413773c0f2f9e6211c49387be90995c23745fc84a5cbfd9be9061703d765905d7bf7e6c84b34cc4e13cd42d58f95ab06c4dfdf109176e4cfd552ec2901b18b6e812c618638c316ea01b1b6d8e98a243a3a2a6bd0e4d7b4da3da0d4dc8478f9af69aa669df1f71680faac26a9a276109263eee8861c629ed9476beb06a7387b5e329a6413ccdc7c18a7b7045c431614bec84cde79d5aad2d9558b3d209634dfad1d73cde8938e67fbc606bbdc1165d6e3438e701eebce2345fbe900b10b100af80e8700356d053158802780550fb847057b7b0fcd463cddddcdddd9371c2433e72e99ceeeeeeaef12a89e5cebfda85f587791f14c6470cac2ba041ea6386edf9807162e7c71bc61a145f1f0ad0ba18ad6380012ec77079064b4cc13c8cb8a39f1986be0cf785918bcbab9813f22ae25c1af2aa7ecc3311077d5e8188d0d2f629a5db94cb1e7d496d8eb8b9b173aed199ddddddccfdb93438a90cfadd1030a2fafcc61c7fdfa49f0b909a09e8e0baf37998308d62fa35efa739690ef134ff0897093f5ffb3e2037bccac2165dbe566b4bb19b48839286693c858178922fa594af84122b630e8da79899b9c52fab16f878c132bd428ae4e9ca7892b546c1faf7bfd8d0a9a8923647481c294056d81c5173e5ffdd420db2c23233337f34784471761f106c01850b1f3517f061736060c86ed9924a2aa99c31eb5384a7b360eae4fa47f762f7e3f978fc0836e416cc5bad96a7e5f13ead176e79cab65aadcf57fde4ade28f5aad5e28659c756075a178b4b021b72a939a16d31b13d830586e005f1662db3e443017ba65cffe823b1329e968d093d0b28b39051bc6588eec6ed4d3041bd3364f10b8d618f5413dcd07e8c353b1d8c7a208ac29095b7377f3e76eceb5e7f2e88f38e24f7a378da3f36e95d33c5cdd3e9c67e33ebe753c3650bd120794524a76699152527727d59b8a1657b46c77a38d1653f8115ad4c052aac5924b2975b9d4857ea04c8d97c0866eb4d1c2b585b537da68c1baa0162b18364e9420a9f0c251b103ae268a2642d051f18318382042088e0a27bcc0010b449003264da298c12c0433a0a2092a6cc0fa5a503f27075d8e14a597249774a34dce111c22148104144588000c76866c89103a6661dc58051152341756c68d5510f1e241844b070c5924e16fb4d1810deebcd1260a8e0c162fb07881f42209e945921749727832ed546b8a99c81f694f7ffeba1be58b0d9d42dd7039d0a969799086c9a811743f5a3a9dfe52da9eae6e8fbbcf1a7fd63ed6d2572f81da175dfcc38299d3b96e0dd788835ffe6c35caf919e4ca91fb413973a412482f92a0c00639d8810c162fb078812d8cd9255d7f1806b4e4dc788d200727f09e0cf3777fe27a77614ca4a4a16910f409a301931bbe8d711d069b3739d74fc04537a8146de9a594923bfe92a79cabb5a5ab2367eb8f2f62ae88df90a00a1355910fc42db6e8812ab6013eb0d2050994b43077943d44124dac54edf1f5400ead9adf3e039c1b6d688e7c37dacc40765ffc5d4620f3b9ebe1a014d8eaa1cd0166f9c30f7431128991ebbafd41c8aefcba856be058d356d8a24b1867cc3c97443f3161a31424ad925f48a45dd7bfea3962e3b5118711ec6c76cf37c20337f9fb0073e71b69ff78874c771a4fe3f6d3488004dd8e35ee16b738675ff7b80b217ac591a3834c1ebf5f7a26ef587363177793dc04552cb6f650ad7a3e5c4888b04a90ec1c06f5eba1c6ad3ceced8167b7f6c039b7720d3ce5268446a5fb4b5929d7f1f01bfa7fded3fd98efb16b40a55fe8bf753cb6afdd8ff9b57570376f88e7e3fd78433c9f8976026efd7a48c0ad2cdb25e887be1ba0b7be46bf1ff3f31441cb4203620a8c3e7088a839803b5f0031a523cc71e77747ac0f4f959a60c3d2ed7ee2403fe736c979c77d9670b6c1eee676cd96950eac3bc129cc34364228f1d982cd0d6395c854878ef9371ad535801af1ea1cd03c280dff7e9e3faf3d77311ed0f32d61bd8afb6ef4697efd6c83933e5f2c6c186377469c3baf56021b6d9e904d7afb9932bd629ba297347cd00725fa100d77e5431d77c5fbe4bfd858abdcec7ef8dd3ed935a06f8ddd038cbc8046882caca00a27b458822ac6d3c6d5ffbcf6c2e30be3d58b44b81bfa4a0d7e3eab9100b46d9d2723b8fd16c1edf371abcfeff14a0dc2b02b3ca5d0313eb3a6c5d88de2da4ba9ea5fe839c2768f4ed3e6ac1faff649b355fba2155bff94314a7f193dcf5187d5de1b55bfb9f7bce6d5777f29995f6808e472d7d39efa7288fcfec2974be4e56a2febfdc1c8d5be5f56d93f67ec1a07ff7e30d23580bee40b04df21b141ff213e41febde7bfc62b3904022bbfa50a5b5b5b7409690ee378aa5955b4326928f42ca167193d0b0caea1499cfff49ff5e7fc5017e6877ea3c1919e8544fa18a3d1932a3f817323116eb47162cadd6c7cc703f440805c045d469fe7bdf8182c2c1faad96a743f3814a2d1e1c0f2a18f9d0bcbfc9100388e3bba07be21d297483f92517a920c8f6f8dd1e8597e9b818b30edfdd3983143869df33f73cee9c528753c406f7f0b00d72c4f954a94d22fc9968e654a9ff4a16c1d61fe4da39a1de03f6f68148a43ea7ef8cf7ff11be0fb22c6bf78fa840e09fd7cdafde0da80fa1746874368f42ca497a718a7be3c1555d55251c7a3ef286cb92111ee967e54fa70be8c1f329f1477989ebe3c41dcc1f2f43716193f59dec4f224d2b3fcd6d3636179d2c3b4697ea5ef21744b1fd6cb7259be547a8e3b98633c6143f7f3316a6043d98a01b3a15c5d96df5e622c593de1e4fa97bef4dcf1b01fbb1e432669caf8c218a46f488c273dfd10e9411d0e31481f0bcb778703cb8f5e86172fe959bc0df02581be30c6832ecbcfaec710d203c177f431e4ea52c96a14e95b35aaf485a4df9e8ebe21a41f3d7dd0e8bb0e07d2a8001cc71d3c86801e08befe34c658e2e9787017319cb021ef5cfad2f5b2b53d1dc2ef79fa1dd7e1c0b1c1ad9de33641b1c1d1e7cdee6384f17d18c38c5b596eed76843ee46ead47d8fa9a0cdaf2f361c0f80b2f5e9017ef8ac701c173d5a81dae425fb3a325fac142dedc8938e4d397a76617e249fe09ae7cd0179688b8920a415f57b2bdf25b3c39d327b97d12896c35285bbe6449f92c05677e52caade5b2fd7ca10572eb4f4a298d5e3dee32cd29b55725e43f3f2044e861b8f3bbce1ff487876175c30f0871671777fbc0e560baaf773f8c78175d5c186f23eec78b43b48fb77a43b4cff483fe7cfac9e7eb61dff9d50643fce13681e869a743848706e77bccb6ddae76beec62427f8088f27ff1a08f3105b217f431de603f2c5dd0f3eb27f7aa331e1ac5f7028d72224034c8c3ca5331c655fc42fa9fd760bc39900e1fd803625ef9f140ef02f746770b909f19cb37cc750b2b7f93948dc059c49f367e373bcf4ba3a6d53eb0c11713d81b2fd5635874d2a0565b6bb0f9c6ad7f37f3c268ba98d95285255dffd8e140bacca4c1c94adc5f2cb9eeda8525dd68e304922b7ffbd0862b0d70258e2b63b872c6e5970c0970ba5114bd4e3e219ee64f8ed2a7f973fb42b6c200f346a33d25e298ef2022d850878a51d1c609d69d1f04f419fb86950f5deeb4eff37578ea455df992e8bbb19f8e1b2a767eb7b666d982e5e4f88b7ce376ff0e62cfaff34e193f6a709f929b53d6e0430fdcc56d8f13db570e911bbf04827de037c5db6d84fd177efa376868540f1f7817f08423eef07cf7c0b7bec7f3f96064752b0f98ec5cfaa546511b26472e7d977e41bdb8347629c8826e3f6873eee3993e1fef10cfd7df3cd3e7fb71c3adef03ccf57c261c6eb8fd375c8f9fd61d6cdd1c638cf1e327d22eeed831b2c6cc517e6b1f4fa5f2e3f10d4e83fc7944845cc0029c93334586840f059474c45b024b0fdeb85ea76cf10183fa11a4e8a8b44d1566450c198d00000008008314002028100c888462c160301ea99ae23b14000e859e4678589b49c32087710a1963002100100300006000044606db00717a79d06bc7bd4a04f2404a6cf04f531b43d1829a4cac527b03fe8c9c34712b7ece8f9860f8a20ea117f96dab79d61aff747f86413a8c25862cc5283099a6ef92b67ae92b03c81bf22b1d795ac2c3439188306b89df4c6258eb0edf37373e8c667a4598735f0c606c5c390dabc33bfa0fe9d63ed948b52b313e54be141298b682660d57f0f0644bd58de6ecf5175ec57badc26c8a18519b086069215125de3959be84388f37b5397050dca6094b692d9ba4b4d076fcd7004f5799132de5e17eb29d9e8ac60c7910a1148be09e4579b84cca06e421390ea83ad44c82c91441e6acfa0b17ab47ee74d65f498ba1840702ecc065e20281224e7bda082791bf3e2a724acacd089ff6854667330ff69655fb5c6472f402839c321e2b21ce18687a7131e8af0b891c09795c1857b862c351d436af2c1d1750ea565745c778311099ccd1007cec36837462f9ef6f69712719fa5926546157c7bcf1c3010fc4c0e0c37891b6e706a9700b7f6c00c8fba607daba9181708e39a093396eb5b397f16a2f9ad1bac475cf509aea3f1a54bc4828bff147becb7be31626d636e398a359a569c3737fd8169dfc4479dbb9c732ec4aa37bb78f17ed6454af29005ac19fb6bf819186c3ec0f76d6e47c0abc36b33472f13a792fd1ee0a258d5f7a48ed4a6fa8d7cfcd2d149157bffdd218a0af1ad94fa4195974542ac58177f8b2ad76d7a9861acd6a802e1814819a30dbac8dac55ae5429ad71c5970ce930e2a817e10fc99155dd9cd8c5a6890315ae7743eacadd217ad7460cf785d536749ab8af2e2284ae6e88699d6e756c456d26a7f916012972a9c01a7701a5a0e9d552475bc8c345c2af969061a995d71a3df8aeadb5e45c3e4bcaf4790d30dc49488d144093fbdea23bff2d3e0aaf01b34b5ac109c4086d543983e93d4780ab57afdd84b5d39daf006fbeb07f69aff4aa2eb887276fdd10f66f25b68a72941da9ce263879d0fd2ef899462e310b4e3807d211672125520a2efb60117448778ec4be842253991abeb21b50804a1dfbca446ce2f094da3a7b2ff70b7e6f98cf35b8da3c5a07b803d97d092686205bee286f8326d9e96f3cd701f929eaa897a4fc084a0bac77ac9647cffe567162884b3d9a1c87879b0af455f1a66446eda17bbeaaa4e95b80aa688ef5acd04e53c3d9266c310543fce054b8a3387a67fab079467614b9c63ffcdc293b8a607740b2b889cf3a066c098b9bbfd093c29d2bf6ba1fc700d00308099e24ae45a6d509c8ca3591a11d3fd88ceb3af0deec0687bd1ab8131dbfebeaccca7a480544afa01c4c29fdc8ee4e171c3899b95084d377c19e3c626eda5bedb6ed327d0230b58904e15f4d0d7485dce74cc094d595659eedec314f4019f20eb891e09617ac897502cbb4de6be35457e9b348d73e61fcba93e5c931eeac4b2d6b498a989c9a2b4daef092e2e552b77a8a0508882fc67f2f0a2ca15b90ee488cb199e8dff828eb787797590fc6b50cc041eb8b78466210000c366b458ab9c45554b4ffa73e0515bd4f1b99a423e7ea8ed144feea3a8256fdef43b34c2f7a7b743181897822a2dee10643aa55076bd52724e481b9a16c900786492d9603b80bfc86be41e068c458d18d209ef4411e38907ed03f041fec746b28ced82119863037624fde21fbdd440f8ff7a5a5c779d7f18d9ec5f12021d473a3babc307c67d20008c67d868f39229f14acf52617d0d06dde2d0b84404192269db5c509c3d7c1e869dc2d97148b073c2bd6a928276225d174f1b0ef6840062f708ae964e8599f80e19e15ee86540348e06158291920eb6f6a2d3e019f72141c0f0db84b6a2978fa2f99d9bdb922481a551a7e1a4aefd3f4fb3cf14274f9dc71cd2e140a3f30c52661915d6fed62e5c2d8999d308687054817feb9cf8521ee55c01cfb5c5d51178ab4fb76c5bf40d2cfd699e09a49d90a059d0c7172cd98ad18f4f727c0752b144c43b016617f5e7b34e42797c432da50750f79171b1ab6d9561b6863fd884c942746ec8758954d70323b5315d01aa1b65920964884f63f38ee7122b26ec295fc5a51d3fbcad708c714556899c8de9e69a14533a73bf4e21cc952f48a72054273ca0c330b949f7ef444a882f2187e4d391af6fd74dd7073219ee71381807d227ccb46287c9feda297abe5c50e04a6ed546ac7a7f37feabd384920a749866f56d6fc2147f94dd0b20f63be10a6ea697497b07563683f07f75adbf01d8a5c42ead8589ea9d7fb9869249d05e5a3b20e70d3281068065a1b00cc0c909c97df169ccbc8dc1d75828c4f680ec4502a3232e45236754aaccb7fae09300b73e598dd699570c3b555b206cc25f35514dbdd8c45e0f5ca71a687f78508a1fe81c15f4ec0744e231d0fba12f834803fa97a5eb86bdeb6eaae85ec41169c1499f2b43b15956d3ff40e30969aad407e280c46d1f4863fca7ffbce5e50fd187c8c7435f66dd428ecbaf9bb4254c63fba47596e0821929ec9d29f47776c9274572d50508fa94192a50c1be6f452d986f29b30d664f597394809a55b6ae2bd39f79f97b5a192fecd0b185a43f778fb9be3a98028db575061905170600891161782784ea975fd48fbfc69d2140f2573371f7d348f7086b567e6409ab2356f45d5b9c396ed848362a32846d286b19344ce5fec4743cbe08219d3448e89ef1ac651058225b0ad4e00b8e8ca81592da51a415fd825e47dd16636fdbd35e651f8220c9fc17d965ac744d932e70b733ca8c12022cb56d4b1940f69d728a24b50ef14f335a91803e63c7a4d3a73f02d17c11f63dcef84d37526b9c12fbab01019255bca36d791e94c64ba1209e01e34a8e3153cce519e20487f0359388ce572626ca9971aace5b38559c718a400e8a5e88115a8f8583ae32fa8266377de5f8f8f70fbbf81d8100bc14fb1b33c4f64eaa46d5b97ec05eec50011d74b740d9bfedce02271e9f594d2a82de0631cd89b4cb6c2d44f1a39fbcaffa91311ecf11b6d5268bce86660410668ba7cc1ab419106ce8ac2874e390716f981754888b1d3890a14ef9957bda34f80ecc563272d98adb900337e5e7fadfbc11093b1817252c87d9866dc0cc86f390422f185debe15447c6427626216ea940347058b15ab17ab9290580362d754148da5fa8c47f5abb5aa5451f4394cec4e502781b4d0436144d9876b426b4de3fb0df1802bc9e357526911d1415af911d29a7b83fb09ca4b7c157d4c0b17229ebf3ef02944c45708102d3004032b8750676b12539f164289314782d4fa8d44185b3f892065af8d68bb87e01549b7d6784d8bdb444d2280e02bf193678f2aa598779c8793fb996a64f16cb57f45b6c50dd08eb97f0a70e90a38fab2fc6957ef43b7d41bebc0a51962fe2be6450fc7586e08b267c5e9e843fc7d4f36125b5d3dda6b9f178780817a02b6f798e6f3c5b6c91608fc275589eeafb1e5e75e8e051c43f966406ee6542452993dd28ef93edadb95a013fb4f46e33949a2efa563db2267aa89859b2b764da60148e04de5c5b302f3a2fa4e743075f597f762ca12b8e67fab321c9eca9db282359a700bbde14593feb5507c5c2e6a245cbefd2168e3571a19af75ad3c33c1d7eecbb68f477e93d4b83875acff96d37226d505108f5429510ad9835faaf7e9e824cf49c218a317e3900e0a110b34b4e7b5759165fb1be5dcb7fcfe33ed7386283f81fbfc53a92cb2a5c5e13bdbadd2392abae3f2fd142c0a5c8fa199b201dfa1cac58bdb8383ddd1958fd9708ad486719d19ab3d662c62e98af1d1410e40c88fd655819fd43c5f0dfdf2d12835b6d0475d9948684d28f17446508a91c03640ed1d5a19c68f373cf4142efd7df082fb95f6511c307c56ebd2a1c9301c8fb8401bb5bc62acf5c27513a035ae37224a6d497ae27bab044c6590985e474d4b31d72cb5b8ac0c725d3e0af5a3dc834c582f7ca27e5c9c73b68702effb3d9ea96c6ba794815c7391a62d722c990f1d7407c0bc5ab7684252713ab24c15ee81e3fe26aed8942826286a50347e351f3fb09f18addd0a914d7c5872ca1270c9bc1b67f52b18dd571f785de22ae1a81e90b8c8b60f4866754109df4c5ab8ae44da64bc50624446a3532e4fe6708386d000c2e55295e8ec93c6e67a38c35e4d042028d89e3911fa70576adc797a1cc50a2eaabae78a1a643f26c44585cbec67b2109fcb8eb4b0037fcf40a891924e3bb1d7a08687ce635dba31e1354b503a3704ef98026b464370b54b7ac5e2181fb13e5fc626c4b5493caa960e3eb2c58a6d1aee0e4f1476a9bcbfbd048264d80c370e5788985606632d29e235f84de69315a2f5666832b9492730c542ba548c5c2c6a11a82f73f724d93e49b2fe14eaf984889f36e8a550dc8d623e1483aef260023f5df3214e2a2572ac59e8c4976ec6e1c5ed10579d9931fa1e18e1e63af31bc4f4a2cfbe67d4cb8b5d268f6d55e81ff8cd4e36da9908810aab7647cc001237fbe47de0ecedc7818f74d44c45d55f1c54b71f27febfc2196c04d3b168d58ccdfe9721af1197ce46c6aaa74b401741c2904c2e8a4057b297656b9137caecefcc590b8356f8225f24f1fc726e96e2ee985d5af83eb4f1ae73c13261c0323888a1856cf3192e9bb47979eb49b9a11cee7881a31854d4bbb4611f071ba65978427e12b1d0a94920002b960c0992a18d2a43f25b240510bf459b4b00f9487615860bfcb0eb79cab63631213c1559d943f8a8d4b0ecdddbfef462543283054205b1a3ab4b8c623e4688a71b65d9b3747cac40fa7381f2fa6c090a016e329eb7ed961fa21ebc2d2259f2b277bbe62613faad7d270b10491da7723082f62799dee038aa08c929b0681578d43b1f897b8786bdf58f3b01cd63c264fff68f6c9dd4882c10259f938ecea0537df56a36e0297d2af854564c3ac7350d9c77d6d1998959142b5f42a919ae21ea65f84430a02acd71936bc260332af1acca57f5740a147976f0ba9f674e0d92b8c480cd912835976aa667d394c575c8f6013a6eff3bfe9fca59fcb102661df7f23a547744dbf0e018b896e827f5d765e6554c1a4273c149fa7922dbd60f0cd24adb18d2cff70dd58e2365acb85cbfa4a33fdab14029b167edbbb1576bccbee83d10183549811ec3d30ce497d910745914166a34c37fcf604450d46c9b3815101c2477016afe80c2e838b0c6463f25a281ea3f0e5ef66bbe0206ecce6caa8a7e83a6bcf2d034f0720630359c99bec9f516da37cb886741f3642f9df2751637887a534bedfcd8d8ff59c2683f0eda017b6f202deafb1b9fff3c3e2bbfb3be3858cc9958fa75da5533f4de294be216a677d1e76459f869a2e639712655f36528c96ca291c01999f3615af0f9b069b151a530a02323d99da449ca21fced214387995060c011d5f8db6b2860476f1c278195f803f7fe4f67d9d3a89ba333197550341c1bad8e03671a5019524ca8223616af2e9c009846edb61ce9b74aa811db0d614c8815e2befae489db987a98b300e3d20446487e1996368ec5c32adb5e8b452ac827fa2434c3a49c440b5f42ca349a745a8ed3cc2c17bd06d5085e016b997d91ef411d24b8f95d606601d9809a60c08471f13b7a9d8ad70ba8094888e44eabf5556235421acf7840e6cbf5d437ca7a717d1d5ebf8b9c15b9cfd6f6512649df4be711545b2d1c738dc3e2481478b2fa8a69d1dcd9976dacf87ac29b65ff1edd26b7ab0362d5f24c05d1be6db7a7bb32ad84082b8dfabf86d952cfe7824ae25d4607b4f688b5c5fb1e3e8cfd7d2ea8226c17a041bc2ac866e1604be24c9e94fffdef592e87dc5a4963ba0ef3dac178ff03e1db447f5b0b85affcf9896fa9b87644bf2f600e4dd8d63e9cd4131d0f79f07bcc2e6de6c9cd63c22cb8c35d11e623c48da295bce9eeedaa32b45b3f8300bfc66c737e4b428d0df5340af21e68a82c27319d6c09cd737da886aa991b68f6c2f9cf26cb4b51eb12b27abb498ac35fd0e4ada4cadf87587bbc4ecdd44f8a86f85f576834fa9de67219940bb581bb03fc9a221597bf44aedbe01927a5012debf71c0eda99bf09593d6ce6ad131a7dc3d36b6a2f4ba286ef33416fd7eb2c9d51ed63d353c3db281055d66a6f6aac030bac403d90e1b7de1715f41d74da738849dfaad29b0d487ce74a452bd8130f493367219bdceff00d4862013b8646d2474a3510204fa5ffb3f90d2017a1610070ce968f5e320d189beef8f4d1426e9f6e93a5d863ede0daf5cc27c6470b81cb310f2dce6172c6d7d75daeeb8b34d6743db72e1f73b65cf2bdd8608f2d7eb7d8b8b3151dffe484562527b283c8ed49f9acc8c0fa681628be06fae93c7921bfdb9fee462438fca5ead64142e636104ee679e3733d5adad2d268b04e4afa302328ef518c4ec68194824651070b814f76bc9e8b322f2fcf6a59333725f35804f4cbcbd89564566a6bacd8ab680cb9339a79350c5984ac088a1a67d41931cec7fa84bec8bb5a95ec66e083862271c62299a9da4fb7cc9abe6faa38f66577799f9615eeb608c1d218f569e4b205d355cb338afd3e8ef2f731c6f9287b8efa3e3320ff1c449c040c5570f67e0444cdc3a0c11430c744f105c3d1ae38d2f045117c19ee3928eeadb3c7ab8445a0bd084cc5e4c03200284fd2f2c9ea6c598b4e6cf7368424a4a1e7ef3f856ca267da9a0e7d1ed02d0d4c3fafc43db1449f7d67bd11dccc5f2c76ab12bc4e95bdf1e4fde6e95c4a8f40ebf777904100ded8140c9e6e1271df2cb85c77dedb8e3bdfc98aec7501b0bcf52d807500f49c2a6bd0b1b503eac085d88ce6c47801070f4d442ec821c80dd42f141bd6b4d358c47b9b31c659297591af1832fe8596cda850e533fdc09d2906001f79cd1a362269be1b1c36ce32d0c0282e8984cdfa6a7982f11c6e4d20f7f0c9e3dfffa864324ef544f5b59cf8c2a6b30ed216bf6807a03bfb79e38a2c2081cfdbcb9225c7bf29109a992b7e5f4d8ea4c6c45cb1c7abe186c42e6b158d80c91c9b542ba9d1f78a93c8f3588379be208dcc16d9c82341b476bec0c2e8ca4819622f9480b70cccd5e26c60e8d3b53eca8ccee42c7e903bbe1c05bacf3df0d6d939e08cca405f66a4ea399fb5dcac265b06298fcdfc20273976ef74714de4ce8e9a1ee7feef484866367c7b09f22a49da19d55c602190cf5491b6acc570dd30c3bc037a7eb9e938101b2413f25e5162a7bce5b3dbb3d22d10a19a2274f0f1e763f3587089a58b044002bb818b5912c8c00be049d960ff0d6235c955592284a333fb5b85550b9d3b126fdd64b5ad6a35f63b4e65d15702cbaef129d1e6e7845235c589d6bd79165b51060c5c2425ee881f1335832154c3282b113a148283fb6c90193d3480a2343d8455a64d343d58a54ef069c8b751487a10582ecd1abeb91426223dfca4bce26fb2c03de9e10750432d0038a2d1bdb74e8881931ef625afdb58f5f49339f688325e3198f4070e484b8786009a59a9386d8df28210520856c52a4213aa4c9c1ce09554a8e373961af925ce750d30951c9f253ef3fb6d838581849a87531ac3ecad81677993539c4019d17e810618765191ef73566e08fb6560916f77fb1176db7eea0ad19815d1a293ae6469a8c2445f1821e97ad0c61bed248c802fc06e854069746d4b61597e5ebe520af9f4acd6aaa0ae0cb8085344d082762fb9b696165cba19162de218e9a6c2a008a21b9a456081a5c1e1baffd36f08e4891db57d4fff53a645e05a6a9be91d993a489a478a8f321df4252f09d59475fe09863bd15be5138f01083e2f6c1851c044f69a447a624bc20b37c7998b13e30fc94fe1e45ee7d6f5fe8320279954a0ab24a20319ebe4a5efa7ca97c6c07539a0beafa7cb426ba08ef806a4ceb438b4e5d0245b6e655cc982d073db9c4b3ff1c948107744bb4996073211f530e59d93b167241e3d8e9b3311745c2b1b63432dee642699b56eb77be8af5c24fba21063b21db520b94a0635d2e49d4ec701d5f2ac2c5f71e8520d99ff5619220f6ac3f75abda189a8854a99f6d80caee362beb6fba3da2c33d1ba9af915ca4d1ca62a152d76e3b1026f6d6566baa98cf4e1b8e1d724c9ed23768a3cac25e7d408ad8af2ac6e7382908f405fecf3aff245689d09605570e221428cffaa8553b00d709a2b91db9e7aa382b7483d886a880da7609cc40f89b65d623649e322ec76b358872a57a122676c503d414ded9bc345ab9dcbb7429d685a3bf47575acc5f2e84a285024eba222ce0d41515022a3b1ac9e18f79838c9c846be214165bd991289c923668604d5d73746d7a0bee0005886973a60b059c75945b2c9f2e541d4827c48a58a7980429dae03eb45f23b906af977e9e37d5daf25cc9a06a80115529c4222421c46d3450ec549bb4fa725deb166efef6b60c580faa16a0a1fd712dbff27853429a4d340da477ee71122705eb8e2a98ed717aef8f8d53bdf04e77160767bfe4d87403f59ab6d8e24a486df9a4a0eecf6cd7762abf95a300a70ffba88c5ea22e23f6c7fd0fffae73f2eb30c424a13202a386b01268fb8a7d148a2f32719e3174510a7361b53af4f29d5902e186e643cd31898f5c52f9a9e7532b2a452b3c7b390f7ffcc335bfdaa6e4d1e2362289c55dd69444aaf31e733fa42b108761b04ae29700a29202ef487bf2a9bce12b6a55a27fdc6fedb5b5cb869c19fcadd4be8dcdb5188e97c18eb2eadf45aa943d898fd06573db382bf6a3e74a054fc7d517a497a6e1d785b30769d2b64475410f488f32a220618b40f09b60488e092e1bc6bb544e8d46b7f977f69f71afad68db8f042723bed1e39dddcaac54e4c4625fb4d7cee7ef13512d7687db0509fb3c0bbf5d1ce7857211eda327123af1a0d5f742b41f6fb2984069af717c361366b902ae3549f6a42804a7cf552d5551b9514f9e1f800dbf5c1fe8564eeac924c4bdc485b5da7a10d210b1c09d8cad079434b43a4342960e0a3478de1f6a700bbe44a82544b12ed1b5a5491cacc59f49b1a43f6e634a4ab66135dfa3e4aefd050c842e3d9014c1a5018bf12633a5af55c56d17ff2583776f9da4f542e4946e665b5f07946a854e49a96a21a0c889118432dc4b28ba4612c79714d6b0bcc0783ec6f4981a686ddd9fe657f5671e5ea1f6a7016777dcc64350f2d6714094470a50bc906caa4bda2be4a482c34fdb2aacc55214a7493c489ff5a41497a171f83c76e9598809b0a369412ff00453def12e50b1d6ec113fca37aa6c3c02aad4950de4a2e68dace5f3e9e9a17debae1d5884ba32e83e0be41be828e4cc04d1b373034eb7dd115fd9935a03817c862fa2db93c3927136f015665d5ad448861e1eaa86564f222ee00ccb5cef8e530bb64ecd74033b91b20d20c2dedefa466f2c9acbcc3b2adc703db39ca90a9da25b868486c3f086dcccbdad120ea583551c2c51b287e40b083915bf9003a401e38cad3e41ae037f2d00ab0b4dcb2ea3a57ddb508ca463eaa7326ccc668775c19a9de3c2a080138d06282b16ee380388703d01dfb1a9ac97cbf73a8445ba45beca401cc9a0aab4e2674f7cdc5faca1399c48b444156821bc1dbeeff41caca868a9307667b3efebfbe5e3627eb6c5b0c2ab0f56b8f41c30abc1049e0b02536e15b38b64245132bc38a23470b6c742e4b1a12a9e6846960915c56461c61ee006610297d98808efb85b281ac141e6d8ebffc655b7eed2cb172e02418958c59015657b42a08ff14740402196ae2183fbc2ced132d9aa832319c81fc55694ff408400b7ce01d7f1666ef8820c67da8d53bab0de1370930d66dc4579700fc1754a5c771f8162f28eb9430dd0d2c6f99c906019fde483955f3c012599ed034a3edf2c28becc77a78742c924986d73fc6fab1f6e1d406b1d37d51116091a688406a684b06fa178e3ef9209c4c6a0918dbdff5c33f0f0bc1cd0173b73f274be41c30ae3dd8bf3d36d004b9f820e6e84f2f97d746143201b5446f86468f6b4dc2aa383bf0b1fe6c5c1f05c0d8ff90ae923e8dbc73603efc18701bfaec888ca13bb15f591e92e5875432c2221833b69d0ebff2e6c2413873b0fd343c774d3e2bc06ab6c784c530274caa792543771135318e622af41141d5c74dd989a40331ef7545d1b3f9e2355dcdad7c40d6ffefa414bdd05ef32f4fa9c7d9ec6264f45469495c77340ba77b628b58edc3b82e84a9191f1545abf99d5e58a4c17ffca2799c6f9130bd5d09a1a5030581fea6a42fd1f72db33ed5a1ab01620d8e53e776fc03e767bf430282ccc103ddb2f362e2dd9f394cc3a958f6d0a6f2754ec421b009b6c12458e41a53599942896ef2b8901741ce62347be4369b8485d3173c13812b354d7ca1bcf23faa629fe6bea7be97d8c71404685d3cf671526a2fe88da00f3c50248bd6269ac4f4a59088506d4506383173281efbe0a1aa862e815a4e1a8f2f21f6cd40d7f060f11fa0eda8e60691e17aa108f1991e43e97aa3f7b1a431ffca8f91bd6eb7bb46770357a9e10b5a97fe3ea5462df32fc643a8c11887aa117118ea32938b1949316383225ed464c0c23f40737c804f5c2a380361a10fd8673a68314c8a06240e29b3135dd6c3e198a99af8188410e9c67ddadb2351beeb991ae405ce3bb2e698daabac24c20557b68b8244eccd4c39ddaa13d8ed2d1c3293ba338b06fb8e68ebfd12f42c2b11f0d9494488195c539bb4d58a4381f4d9e752ad56f2508a034e63c381beae8a7816970902f8ecb4a15745064169f18c8b40353f2da2e970d6aeb2d57da45ef7fee6ca048ae96185604603a437f5977c4efd726d7ce73d62da63a58d650f3045d7f879c95f40221115837e4ac14740fba1de54b3f89a22b5fa32fb39fad7d5f20a15d78fa0afcc2acc7417e6b8fbfa9586324c4e402d135bb05ac3e263405b48fb766dc88461fa3e7201548b6040856336eb53a1e757798dabcf3f544ac6bb2c7b1cf42e7dd30ab70c12e90646a332885eb6f313b23d14db54166a3c6167a0a091fd9569ed2370de6f51ba336def382e4679377fe95517d0f0327a189696dbc1614f30405fcce56d3491b30e5d740e7a07816abdb2794204943e54069b49b987cba8c429475409fabfa64da29c2ca1f3badc67f7ce6e90a701b06f2338b4372c1dcc5582123580ee56941963c34f7663d3f3b64ce940fd4a9d5dd04583bf144617d3db87fd227c0703e160f89514a985d3ecc14983b16320ed64f068d6c9ec19b77f9bac901748ee955d2c73e86feefb976af81d11079325b7913ee7da5ce8dc7324d45d52aa400f00e13590206ed80fbd0348d01ed745f8c261ff578537003a6c54a130c9068cb134c6326e772da34c66f7c2de869ef516824d46f2081a1750d0c6dedbffe6b8bce53c74031fac560dcaea95cf467dac9559d17710cbaabfc5a45be60d374577605821141eae0080e97f880d100647039f9d63727fbca2385a15f478792e255ef083079fe3d0129b30647129fcecf92cc9eb429e297c146f94cd60a439a6308b20756305dc93f0f24fabbb0fa2c1c407b2165422e8b0ab3ff6b16e1d2a023fdcbb7ece9547d0e0dfea2b98004e7492983957ae289f27ec6907068a1b9172d421f5a40de6c8f9593d431e7bb50f4a03780dbedb0bf1a51cdce0dafe107e9fc2d8f75499164db19bcf3b2be1e9949b0e2b5c60709a3075449bad36f2d728b8a5d7a3654b9c6203cd868c7f5fa69ab0adbcb239377ed71d5449f8fa5cfdedf98c034ad45204b878df44c5912ce360758bac6921dda1c06e217095f9049eb9580e2cc3960c461f37484d782863002dab7fb4584006a962b81b17e9da712d56cb958e50f7a71164a544e46479750f6b5be73687d22ec2d8866d97ae91e242b7aba75abb2ff0ea15e404325296d8714e2c018227a2153e26ae85ea83e46d0528151de8b550f5f4dcbf0b4ffb0e489a1d81c3883985753fa3f465e56c9ad0309987ce6b905e689ce85963a33ec0712f9ec0821c8f747065f8f84979373e51bf363343d07d658a6e4f38c45d3647fd3d21f4d77f6fd41e4236b46c77c27d44d8861f02bfe9d9e92de1853a98761b901d2fa2e13f86938c61734ca9a5c1189b6588e9dcb501fd38746e55de2d3423e48301deaf845fb835a79abb69b9c2f6e1272a44671e9e929d8a364c409d41e7691c894619e0da27372f0092843df9610641876c67f394f1017c4534280012a65a14d8113b1ed9fe5eee98427b8afe7cd97bbda5fff77034729b26d9e320019101c8f6c9a0e0ce9335aa503d3d31b4c8f66b83022269cbaf18d75e9121bdd4bc9b485bec9c71b62b135cdebeab595608b49f24866bab91c61b99c0014dd63ed13d0320061e0416fd59da0ac954d6165c10918ad53c969abb68570d85183fe5b1704d81a36a8fc55e1d638144383c5034892e1f1fd7fbfa952c72745b1b8c52636433defd9d87767de94a5684109ebf25cfebbd56bb1a3a03e030dcd43a5960600ffee23ce9437ecc9b755d34c5f492402509898dedf98d6ea5b4ff03d94f38f4401fa0ce38b6c715b9f7ac118212c57ac5a0eb6f5b64ab2645045def01e3897eb3c8d066f3eec3e0b81e38c8a0f5c1152915fd6ae329c2001035d627e886085216a26a406f71ca6d640f7a45bfed7f44f21e8d585eafe57177c8bd0cc440b867c80c25c83b87d53bc25a75bdb8be8e44d8035b5e3130f180e08a737545a108eda75c1ba49b9131f4951b9bbd2529bba4c866d432a5425540470c263004f18272dd65fcd0fedc6e54c3f4963e9e89eeda09762c532f571d71080e969e1db75c79b685aa65f52defa56a12fe9b680ec5457dab5e9b0f8a4e384215554ec0534426ad733313fa91a7b3d9c1398eca62fb712559105f81e8a13354f4e402fa4c595fa55d07c45cf555487603bd41b38e95a8da7e54f2a9d91d1c6f941e377f0b6da04ec1d85221600b065b22073224e6825cc56f3ebac4c9f403c2dc24556879692d2e3602446110ca9c1d421a3adc17db2c38a43aa67cb920d84c5bba83b317628fd70a7df25435c48740015bd2ffd89678b9e318b11aa0e3089f4820212019905cd91f4bd3e88d48111545b52d95cc4e22baf2e2aad111ca2a6cfc9961f63d85f514cf6e7e1ddb7d31e86232f12af51757c1b80cf0495222c3fee069413b052b61ad4a90c92ef102dd7603a22f7de0602751b20893bd112fa87ec2ccda9f1e7167460d4ebbadba4689d29d2da2b45be8eb118bc7a44d7f9bf47eb4e6ab7d9a41cf68ec3843516ecb821b7260a9ce122e031ded2dcf3b95eba7e150223d8ac562b1c2dc98e7e099a1940abbd2e0188b84d9c719e38b5b9bdda173fa8f735c8036045b1b0a29ce138cc81fe35b195c831f24354f651b9128b0703042f89a04bd718ad1ff865622ec443814ebfd4c62a1c30732696bcbf7dff77ff563380ab09178fa1eef205a92f3e890eb44d7b2124fb40c0442dfd0a5751589dddbef2e2925e4fe44a6f9d84beb9262166cc744a43b410c8acf9041c0c925cb61aebf980edda2c8a908b3ead2850fb9fec8df187af33bf08ea22578fa8e6ff2ff5f7d23cbc6e643a19c6b540555066b54466471f1241a507241db97084a96850277210a0028b0137d09536765352dfb2db79222ccfa6e855b8a62975749bd008e0d6400d164519519fa281584ccda302d08165d498564df46a4daa7d87ea33b78386a90d666b20f67134a8de9959a700c023908a0bf62175aee16c308941fb542170eca38e82b97c7865f51dd1e1861b36dde92601a4723bbe1c5ff5a64221710f709304968eb4e060ab1650f6926fe26104445f3d4199227bd35bd4f007984cdc2f00c8959c8ba8c9b5e39e08a12c1c9c7c39f92cc388f22e49b6606ac2a44ca0c8f7a0dde3b92abaf666660cf85396e2636286a16ec7d37991bd360f6c2d1edb77d64754f34ac00747076ecce7d4ce3a1ef2d9f9e316602f21c9a4a6b949628dcb58787f463c8b209c33041a807cc0f28d3b9e9a3b6ffe1d7b41463773f28690a01079a0bb878a9b115ffd280820d016842792acf475400cbe098711ecec890b5a7529b39221d29418095fc466d19f9391d38ab9f9f0921cff4f0cc34397b948c8d18534fc845028b6c22a82ec24d12193280b4b87fb31826a60fe2cfee57bdcf6888e33e11aab03a0514ca83da230820b077201a0e6a6874578980c5a68a282816388606cc384f149042fd198941cc4e0d3ae7faff2cc3eceb237a925c6aac709a1a7294ee8dac80e2464aa6c99df2e2ecb066383e1a96ef80d596bdb00646505a6b24fe9a4b9db0743e48a0de3e5766a26c631cb2b0f2b576e61dc6490e6e33f65153174bdf00439fec8676997a04ecefd392e1de382930f6b7043ad12a9966c5463e16ac9754c320506cd98c963b7192d0ea5f969066d88b92691a7593a24c8e769ecc6cade9d105b538f88801ad9b5852a788b39ad11f812135db34256bae283071a1e0cb12f555344016f93c682cbab9879b020e92449561cdfae3a76b220022905f15f46c5611d47dadb75a7ebdb69e4e81c27e437d499ad45103952f93aea4ad9e2394ee79ec10753cafe11a4242b303029e0846402074e1cbca2d4432b3eb23b05464ba0be3b0951b2848d556184082c9f81200eb318252934a57a231ca8278710fcb8f5ab7ecbbd28a60074a86f7cb4420673bfb15c812a9545513e5aa317d3c8550da6e30d8a7ab6258fc44da820a83e8fff7cba1d412d250ab700842b29c2f6d85c047ec05b560099ed2122c877179389d528109ec5d558b40564c0c36f6b668dce120b0ce762ec1816df091e749cb89c078a1945bac9af5601725d931fff75bd8b23223bb540151b41362b8a876571c0aace4b03291bcedbfb4699ffeece424b6c319844351151a29b43caa9274ec4f291f9cc2155fa489b7da82ce245fe47b6978dcea995902ca5ad85dc2cf733503a61b1401f6de6ceaf63104e1f7b44306903757e6daa0a1339a5d533fe83154505e8587f0fc38470cd2d2a2d0971e3b61c296e260d67b58eac32c7751a8e535fa6b4e8de8329256859da5daf6063a5805b8299cd48101b1b143c4cec36ab2911dae5468f5e07f6a4969568fc2ea57b8c9920c3bb828a01372f75b2d7443128831f89d46cb49367a019b1e260f548f39d14f5190b7095391a35e2f98e532cfe4b1ed787860008f5f1b92e9e980292cfbf228473469ee5510be367badadb335c24eba59b1f5c804e93a9f7dabd62a03f7c0c40bedd64c5eadf4e5a6f777b132aae8969ef9f4bc3c6ad13843beaf74384938ad5ebba29f60ca14596a56e53d32652660ffab63b5137b77c469ae1048267a4c49bafba6e65c86f4d807ea54a7fff61bb1c25dfee462faeedd39b7ace01ed7a6ca361d974ed9002d7ecaee5f6b65e4b3c89714eec845ac33fa58e4c8175ec9b54a014ab7a960fd2e372e32f4bf2014ee78db32d2e5e7541f9612ead550986ca7aa398594f3f1b136b13d614c73ab8a9b010cc39b9120028b8c197ac92fac7834668770c4ac2b6fe22d01d4ffe6756628a8cb7e6d50cef41cd32e2075e3b2e320d9fdcdb3024643248c01eff8907bff0357eafd00664faa6ccb3043c382c61e896ed1c4a034a3cf9936ec98adce8288749f6f06d82768b5d3b365774f74645b991a91ec4b7f16546ab837f326dd786fa8b9dd67378833d8b6fd8e44cc45ab274e3f805e6da2a1c4ba88708944ebf390acf7588fd1847451b2f6afe7542ba0ac4f650bfa34812029c5998b3ebca56337f2c30e19d4c07481db2248c8d4f88009d2ceeeca02537d43a3c6dccd8476b72dec091480eec7fb4c52d9aaa8fd71974c8581e4a10ea19210955f7e21b1d55827c83a6a6f51cc01780d0bf9f30b5ad2a7307f17b408f1791606b389c6f04187258ae331c47834f1bd5cb862f7d4ffa57472961fbc1dc8f53312201dad4220d0a0696b7397e5d525b616ba838a49cee8950250d42016d182318fe3b135e14461e23fcf4c687ec46049c6dc9401c8c9335aafeae0abc609bdf7666ce1a41e781e464d627bcfd8c83f7440135c33b11d799bd2c10711a30758b7ccd8931eb4f8c59bc04c2dba16960eff9571849d76cbdde44e3fffbe2217f7f48e21391e25fc3bd10874e731b65d3c0e95d430f2c4257175579547fa338e75499e76aac42194c801a05948044d43f713b807d8837451453c900b28d4329a076a9d635b73f43cf71f661b99626c2acc5465f7ebc5eee506c05d19904371fd9f8874937935b3e7e86f75bdf62a692ba644fc50dbfd0bef6309b2d83adf85030850bd55b45d773b9b0103fc3bec055c424b16bb9a5339fa0be8c3de1bcee6d18915420bae3ebc1686d9a7376a35f90609bf9238ed244a91885e337086c0efb7c4de0c4badfbc94c1cac74c3aedce64103e2e6da744a18dbd51627d9a4d676fda110cd94d7e1e3d3b67b36eb44cde41ce0bc42f793737b042ec78264bdf06a0227eb58391dad42903a4506471072b7a719ba802b3dede46a8a2f90c7a10bcd2921bafb34796d4c4c115f7402ab00abe324e13c0beec57e8ce7cdf9093404b78a0b6c0681ab328933c5c1ba8cf20ef3e122f1f9f83722de9fa5de6b1d9d64bbb11cd7188490e5166811ab86ab7ec353cc8b4db255dce84cef5482334305d3626c767e60a3a3c73035486249cb723474e313fa73572a0425cd909a40813832ad589b2a1b49c4623717368c532944ad042929327e013e68ad7c3d4ae82b0c032a34968fcdab1ddc6d6dd50999254ee15427b2f7ef4df2dcd90e48b7bfc314c251992169f7cc43646c4c6878d9f2d93cbfe45a12a75be4444f778b1ef6c90c98047871426982779a1521c98add64f050cbe3890958ed2d53f4136c8accbc3d7e9fddb206df917b423bee71c2c239fd5eca4c09e9f3157527792b97f321034c9c30c52781850b88887d72d7667c061eeb7db07979b7aaee72019a4487e504eed229fe677792fc4783bc977a405d98912dba119682947af4e6fcdfd85a546438bfbc27fec0dee7b4a5a385ebf07547cd73552161b6a0dfea60d9d8983a88ef1a22d5ed08f64f96024c410bf32295fbf1a59f073a71655e033801acb2251f6db25cd85c9d2fd796a249907bc7270eda4454c31316fb3975339ee5d91f34375177e071725272f2425cb11560785be6b54f400ffd2af96804a06a468f70f596e39d89c7abeb7c0f2e8b2c99085c91238e163681acc1b9dc71b0cf1c93f9312ccb333099a917ef2fdbb6be6d877da3884cebee924317b042e30b785f2d218dc8934dc26fc88aea25eb650162f67b0ff56168d9c9350b4293719618ca229b07c03144e5e29756ce168f65d00348697773a44c2f503c72070ea5d96546b1cb8079c47b59a00c12297dcc3758e4981cc2d9135f4d83308caedc48a1713deb08beadc0e86c829cf32ba773630eec70c89690726099ca380d6c572fbb372a14c3c82f7e169e4dcb1523badf97492996b834acb9fd234166185c1a16e1a12fbb4eb4a1c75b28174c35f384970a5b593c4919564a533fea0d2539298e1ec74c771c19aecadd7301d9aecaec5ceef0ae6b3ecdfacd2886bd7fd2c1ff66f06b65b137c31c0c16a4f1f4b0c85cdfc20696a5bf1cd9149e5294bb72e0cc2539ff15f8f55b6c8a4d8e8e30a63bf791d6a41f68632d6b63a0db8385519e0b2e26f46a52513bdabcc78f5d6feb538ae4e592c1878c5e09dbff69ccbfe202a6bbd3dc918c266395c3f4d6b2dc09f89d4c67a6abcc0bfefec666c7d6dd502d0bb7b81702db0ec0f4159c286859e0a24889cf089c13f5d63c2661ae51ad23e31ea4a19c69162c3186de6e0c7dcc9e2cba4d57cece27176662bc320340a2dbe9d0761b7f19b652990cf44adf64ff2ac3d32ef7802d2159f1cfc021bf3e0aa46dd9823403f0f65249563627fd9f6ef5760a10a916506802d5c2c6ecf1731ec8fd16c18a7585b0d6f41c061ccc54977968b7ea923de7f5641eb5a330d33356911156a586c736d08b0329b4928dbd1877f530b33e1e7097c05f66c6e7592e12c6450e9d03cf56e272826c5d3d5f9bc1153e5bfa392f708a2bccf45e469c48c49c57671f1338f02f0c9804046d076df9c256656112f9bd101603d5fc3fa3a1c0022f2be34e4f22df6d79c13fac30fa167e4de7b7eda2b59b12adfccc99dad401b807a8dbd1b550f1c4911027d0780d7b40e71cbf48296fe4008e9038b4ea1887e0bdd7a27c463dbedda5690ace959dd839299f9c56f7cf41781372e24425aab3ddbd9d06ed4a4af96fdc948eb7d0be1e6d7afd124d82bfdaf61445195253c67fe22cd3e8edd5ef33434ca30ffc61d3dd13ae8ffb2a8e97c6a41ccbc0f253191e420bf3982f267d1f70f347bf4c2cf50462a7d303f071f34f07aeb3ab01968466af8c1697539569a413fca4652dbb5da2fcec288f6cfec7a6c8e8d95632c25d73c074d861749ef3e727d3062680108e22efcc2890631f92c40032f9375c9a66b749be65131d45eb5c1cfd1a21aebdf3d8b10605288ec4e04c1e7ecbd52671f0d1006be3195d3fbf02e8c0854dca80b716a6c1f665c26ec848fa535ee174dc386cdef40f18ab1910e4ae03184836fef8f65111e4d15ce0aa04a3ba05f24013ad4067b4ced54732f49ce7008b325aaf5b13280a9818dfc8366cc9620edecd1bfe957e41fb8c2a2e76b5d086a41818f0ded9e265274806da0fd51a46b1ad0e40c0ff88524c9e6c1f935c82f01e02a466065680b5d14b148ca2fc18edf4c5b5a40517ea2dab2bd77e2d8360e1ea8003f864aed89127c046906f6edd6a24a46a3611f101edfc2992ab3309eb2e851c715e7d1acaa3f7cc79dd1ff558bb67e2eb37bdc75af16d3e0156734aee0f1d85866f5508d42bab6d0f124544691f1047cce69501014d4fe388e944cc72e8f6897b88bd8f46af81747ead7506c3c02576a18973d53a66c03997750fd69e1cdbe0083b33ca7c11b87ea40f5b60ee895dc41b4bc68022048d9939a93564f1f196b4f63b324f7b3e5835b1fdf875208d4786e23f4cfc051edc4ee4c9e951d697105726083f1bb89b78916723bf046f50a5786198003215c79abb8f895425b4bca8b4bb63121614d108bf89788d9df7fdc2202cb4a82228edad0cfeb837611dd91936c663b4e5218689803a925fdd5d1df0929e088bd90edd0bc0ac492cc58fef28639a5e17083db853a593ddb4befc03d6184b19822fd0afeeb7c9251862760dfd84fbd8c7dfb072718898278ca5c64a3ecd72643640971eec6ba5a11b11b481bc9de74e1065621dc6d34f102f3c64af0221aa7371ad5a9e574e8557a2439f8710d2ccfa048ceb2b19f5c234f992e0029ab13d75764f30ed0ed7b509333857a0c08ffe301db350ccb28c1a3b5b39fa1203684b412cea27dec5ea81901f3493c100be0a0ea39e97dc737f27de91aefa42daa3062126b766c0a75416a9b8f18c4bd9ea726f2c8c4d70f97eeceffeda01a3a7599c25b322e810a12d585a20a402518c0542567d568e27ed6f4c95106e7bbcd7566947fb82051a1d00830230bd7866c3b6a3b39b0b6640a420b56cf3dfbfa7637c337ef8953ff783a0eb1bbab3179dfd4fdc12231e76c98145f8ab7638e6ccd68be8eb598dea1a6d15f4f1963bc3415140a7e1845da564068daa1435cdfade09b72ae532ef7d425019aba0816a5ed7c503bcda72f806663d8d0a84de4fb3e9afa61a45beb99e67546e41f90fb4551a0a663f61622d4fa986f2972026928589b73f3f806986db5084efa750c0c30932735675f4a083cb37f2fe4bb43155c9cfb49591a93b5978e4c9b75dc3722ebf0de462a54785b9b65843b5b3ea77f75563a5f08291b2a5e447461cef7c0bd8097785becbaea515c1aed86427c92dd8686a2595bbe77155b4b194773c01e9a6475d17f262b35b5c0520e140b2d60a25eb0c46146e8279da817431a0ecc6aa4963b62c8fae9d494ce4a20584278b98757b1230ac0d45a52cd90d4a1045e7817042dd7fc6cd1dcc922c91011e7cdb638bb0cf3432ee1a5dca7a6e5338017af3ee386e26f8b5c3f5df35af5a9ce400df75065c736880035cccd8740e3b34dfda2f153e70ea80c9a12827f6f92802726439ee23ca32212960a30cac17d31b50a765cc30c1e9a3ae95c41115a6dad9d164b7ef7b7fc61e2838c0bff50bbef4ca88263b814cbae1757f425fec41f16cfe92e6f8f2e12bae6841e7f52095b2b4b60d22d91734b686d95dc2f216339bf5381957be3c06abc2f1bdc25fabc4553c4a0b5df00860477cd7066d82adce46b64d268c9804174d812286a1ad94534f08f449a1cb7a039097e3764093e022af0d61bc7819379364fb94227201a2f2576efaab731650b8f3ea593f72fd4cec7195d3584f5c9922585dae0ff0fd6fc480cf45889251848c95901f71d1bf2e701f3eaeda90aee77d475c247fdaa49f24528b2a222e4a80bbdbe960436a1f4420b0774917755d0e8c6d199da27b760d2e19cee6c47b157ffb934c76b52762347cd0173aa748d7242cc2eff80778f990d343dd3a2bd28f9e8cedfff80e51751bb68b194b66c5e4d5700cdc54781af06bf14f25a6a7e47cf1c42337f397aecfecc586201c8f9f01ee529e06ee3909ae9b040fe41557b24840f51d19adca84e95931c8b20aa537ada1980116562ea7f4b40d72398c93e540ee5d187018214444764e820c9c5c0ce5673e5071b263c963b0480a2d2652559e429dc810f272d8982e745f1c54aaa311b28fa3f676381e6c11db00871a3f498dcffc8b829b0bd06f15a03f047ed90103ef30edb90e851eca672fe338ac2b513a88586ba4b708a12da1132836e916a85370299d62397717e4f84882e5324ab33c52abb999ff31281733d0063feb38fbd31b6991d50897c4349b723b9494243e01c69aca7f323a4efacad0fd5407fa682b17ddeaee73f2f010c63c582571a2ca33111cb249548ad6cab3b2a21dab69f9f860f69dcd954b9224d94c980199f706b6c09a2da476843b79830c2dbd3ffedd05ac323695daa8e35af652e698903cd5f15468beec7867150f63c44e83a6595ebb45029bee364b00eb38a926e402b602a89d200cb93bd11b5992b90fdd2cb30a8f73fe0c839a8f0f4eb0a7edb075440bf79c6ea579d96cd491ddb5a31fb707cec1fee7b4e59adf8650ee615eb7602188cb189ca2605faeee594af7c069e99419b96c7909eacdbe6917b8b64b6e38d71b9cb6c43d153b5cd900a4744496ca6a156029a345794db44fd2ee7d7ab084d7de17f002a71eabb2d297ba9c179f4178831fd0b6a4fb4c1d448608974c389bac7d5dff69a8089fc68b3bb9daee14738ceee55425795e758d6bbd461f15315ee05278fe22509773f8739d6cfab32b0bcf3a6422973ec2b5fcd61e2213469c4fdcabbaf4c60ae92718368df39b4db2c65b692fbd891207a69ea33a99ef2a69a04e1dffac2f04fbec66aa5f2c100358b1a1604d90589ca973b3233bdb19cf492dd150236f6162eac056b056ae628b965d8db91aa343396ffae39fdc8cc72f2ab5a588e99798b8e16260b1e0095790174123ac79759bdd035abb1e28cbb235de17fd3101393bab876aeb436d79e41c29a4fda47289ffa24c60fdb6da8b1727bc7b1ed941eca38f6d1b23a548b62a35baa693a528f8074a7c903c890c458ef3a1c1a58c25a0cf8a76c7b5e78b613fbd9cac24bb7f6e32513f611c7fa60e5e042cd4537fe45ea18f741127883ce9c0f805d86655e8d354f0a9f79561e0f80e261403558d371dfaafbd7ac5e6774b9274abac68f0ce4fde1ddab9406511679141b5eea020093aa7023d65aa8588b2ffc035ca5dc38039f75026de894a0106d5744f48d265720b9065e0a758f2fe7b528f6b350af1043b41c9b6a824d84a7b5e6809d093fc8093e920ce6381e901973d24d658cdf0b2d30616e5ba0a6892a0a11919ed6be8244c76c65501ab5d4ce3a8a79b0de3a991bb7fbf5f2bb444bae84a493b902931879b182e12dbf7c0da04287877aa4f878ee43c8125f15954292b8eccf3dc7abd66d0ea6dbc684442b9551c0642c090b89192f7045b329f91fb1b347d0f8d93337ad4339d67093e652441ab92589f81062bf7e0a5aeea70895b7f299628427518f80c78b9879f3fc866e79e37ed5a297d5f115a293d7aadd1fd4f057f52ac102456aad3a86b3ec294ce6b1f54e7ce7c059fe7f0d16a005ec66157936a1db00323616eb2a1767fa2bd9d378639d0ad45ec5a0cebc9835bb6aae412912da2e4a997f2b689785af7bea73aa217b62dfe664042302a1fbcc9023527cead1b78614f419b1392f7371b9cdea014a67dc6541bca4f379ba850c38d9c1d89a67b865f998c29362a052bf4928f917e4c01ac7695c02f2b38fd39e741f6656477760bb4bc61b3e803a231011c426206680fdf28ef6fa1f6ccfd260de1ebdf515c64d82081e8242f3d1b7135fa8d3230e8153d9cb7a0799f0005a6fbec28f503b4d087b8794f5c32d39b378736e6720e8a4cef4ba16940fe80e75326d43b345e8f13265ab1e6530e0530a726cbe30f1b721e7537e72296d594caf5271bcc98f084111f3b49680a0bc80074726ff8cea36ca15278d8157e072174422a06cb78710fa72f9139d75b2c39e71b3fb0dec835f91d30357f98c201eaf34f2f9e623a0bbacd195d5b7138d909de3250e11d945bab45e37c396e4c4877cce81a1470cb21ab200d7ae655144582c2051cd180032bd8d69bedddd60eb7b6703874a3e4ce8675645820153041c57811d4b49024eca3f84fc7e63d11ddd9e10a5023b0d99139981daeabfcdb3a6da028c14357cc60e69699e3cc4546b7d274cfcf412366b6cc4721c6ed91805fdbe53442ef887ee4808d7601349df42a618221995df9ce55880cffaf50d47634c631902221cf9773f61080d480415c9e5421154f439b262688b9a8694d856fe26530c446bc5896e4e3c7a21e6690a141b0171f898d1ca1a82db84f028cd343c2d3a2dac6aef92ef9de93e4949aa4264b6196765370af0e2c288c07df84bc3729c0137a5d7f544c2271522585c88a094ab8fbe32947d4f7c3244bc2c5731049934f3223fa51d6d6c5b27a422292c833efd9cc68bb5d3fdaca317e9eb158665d9c8369d8732652e530a28f19e748567788292d19ead0c2e220e50203400413463b230a61bdb264224dfdde28f62beecc96e3a8d4a47e63a16862ad80d3f6f02ab62260027bb61f083e69293cb048c5cc9a2eaba72fab560e290842a73ecdc333fa28c1d997bcab6266a47df08997ed8de17f1bd80ca59573db63bfc05dd84202c7949340e13cd23c2ea19a2f7cd291d5c06f633ab9925e45a46b758a36e1d2fa68527967499a2b7c91f9832c6ed0085610e8baa7413f744d7c400c086286f479e745daff03f738226424fd60d61d260ef57ce9af90d9d379d5ad499bfd7572a9aca104df3a19193fe0549e476847dcbc7da7d9ea4075648a69649d4086bfe2779b38f44d9d5ba7ad5b1ae95e69a62d79144ea8d9be07a5e2b374096b9159988707222e63902d9b58d42c1805073c3aa7ce551e2bd7dc50d559b85886494decad104c56b2bc5550b02a92bc7c057f6f8ff0192d2d2dbb386758bab22f2863260d78a641ddfbbc62cb04898bbc62e244d1f3028cff34b7d52f5824e69d857702cc09e7e97b1b9f15a2a395b86374b5c8c92a2c6250b8f9bc394d98a310459fe898a8175b8bb9575b7983aa63f37b2b7d55822e191fbc495a743bab411a46a735b91ce163d3abf3eacf65132baf5905b8d7825e38e6dd112dcb3458608e3faefd4479566d3916617a62cb7ce7e5f8ef522f4264d44e91a333acb574f06e6c7d4e3e2be4241f28f28a9659374dd041c661d77217c4349bf9dfb6c5068a17c51db16f5b1407ac6e406d36d09b7e33d1a7134ac75105c9c404346006da32cf21441789462dd69dd390b5c4931489cfa0f77b439c72a00a685f83b5f08ace2bcd82b426fc659735f67f4709e74eda7ade558bcbc1adc3f252f7dc0e6437b93f813995350c8f2c93b169756825c8cdf416e6cd341bd4c711bc8186ddc4e55630f04c3f365e4708607e6b615600e96b2fe0e61c1c51df2121dfd5ccdbec359e344de90d9d51fe5e13b8273ac5c2c4ab6a1a34d587141154ebe4e54cfb20e64d7f29229a8b2f21d7c48f3bf55aeae7f96a3984df20d5e25cbd7a045e18c7608920b10c1237ed147a7be297ce6ed869c050709d1065050713a68bca86883f71275f66079a78c6863aedef9deb0bfd17b43235e14437a255aba60288ab63b3805a44e812181890734b3c606844075238b5afdecd20101281a8a4b42317cb782901e7b26bcad1d7bb0bf93fd2de52c18555ace66053175bd19aacf81c422092302b837b084698f4387c213b0f2cdadbeaa9b91733b917561cdc750c8cd18c548fba55078eac53e12ba426bf0b7c173ac379472082c3df4f9a695ac683c943487c951936da05c30bc92dd0f4e5062d40cabd3778da5d26394236347d5ea4e3b6d74138eca0ca160a1b8378eb9fbda3a698c391107d4a8024c756bc15c821bd8ab0a895f0d18019db60f96c4310d62daef2c40ad47b62727e25d4149717a3d077605d5c1aa09395418e7ca512efbd8d37518b81c5e17f77a607b487aa0233370d16402cfe47f1f617d0ca71608b836c15544c992d5eee3841877242d1005069046d7055980fd4d949f58b200e0be8ab0ee8750c61f7a1a6707b12f49ecb233678ad562fdfeea7376b870e88094be2daf3ed2bd1db9bd6d08bfd8c55e587d303e62e68d8bf5702000e88bedee846b0dada7a66c5a037766a9ab5b5224da740a951c5c522ea82a8c9c64786b9c07c0f342e228942fdbfd4176c6598f2da1e20ad73f11f8af7016593243098a14f5bdc0276ec65f306286b7fd8078f960bfeb33db6f3ed95eec922bcd8f65caefd7ed509ab84e27b70714dc0a837672a35e79f110ccd2e22aaa6f0d18c506875134c92502ea0e3e4298d0b37c2307613b56f7579f1e19168fd25a637d288510f351c3ceaa05171f404b1279619b2b626e051172f303b6f123395d67f9dc6fe66314ab1892fe5c80437a8b04dac440ed247a8415d2aab4381bc458a482877f73b41bfdd1270d6f5605641a49ac40936269bf8d8a580d4de6230456ff1e67df66404bbb440470c787385c4ee3ab6bda230299160104017944c5adcd73fad0701ca01fb97a0c2d4b82ace9920ce1fc63c159856255e02f98f1b28589359053056381f8591ca04f011107ba25b863f65b92d34da6e5a1b4d8eb207b513efd461558b19d7c88a0a77066cdbb3e050d9bd6ee4d2b9d52ba55549fb3d2fdee92108596033413a7e648e986c3d9b5a289d3740cbe875090a1ba765ca3b024f3be5ac70cf9375c2210a908cac4b0b24dc3fa1fb76b0438bd070608b459403eaf02de375213c57e89b375ebca39e35b59b828e65a2680ad704f968836c54d2ea60f00f9fec1f097700a45f1b4532de0a8645a093edbd57f50251811f42176a7f1fb5457b52b01bc21ae3f4ea39a1ede9c7155d577b7a3f9bf2f7aa3f3e96c378fed78224f82ef98db36752c4939e524aa3eddb7cffe2bee1adcfd5db144adc06ab3f2b054ce4f87862274074a2d8149ea8602e90007f1ee56ec359629a3f7faa49adf5181df050256c8e0ccb93cd9a6cde18edde0d83de96012e9fdd651e0f699d7a159f450cb4a6ef00cd1500110847ab9c3a0bad55f30bb212e28866186e88a71f9e79ec8612de750a3033d99e3993a177a678680c385c79109a9ca98d5cc4c7206d234b4214a4f193c7385b887da3f66e105c62f429c9194f9be75e48b2e8e17d3acf847b0aa4bee22def200a3c558c18659cb60bcdb29b190a89a34254183e52e77b865117c0860deb9103841d43bc5c00e9a53ae8186cb337744752f5e019a45b446f8e8e6c7ab00ef05948f676f1d2846766534892e7473c059d3f18b243dcdb3a5d280135f3831fad9cd69b090443fe7a39e7018f03d1da1f0bf57a02c8631d72ea1d5e8439f1de1a562903d40976a51bb4a63bf4a68dec2f3ac53a155c99aa4638ec692787003129e7bc7c10d867897b3b37c928f3d722330c5e51e7485ba73e1849ee2e48a853d248121be6848a4784208a48a27466a531226165aca4505f94f70f1ad3fbbf5714890451ca2998a2e40c8e2dc7a8798af2bf787a109175da9a02271a119128ec70ecc9ad0ea790e4de4be84ff64e419183bb1b66e31ea20307115acad93473920a22ee95038d83f55148a42adb2f498d4c66bf54be8ea8cc4a5330737806a57ddef2914a24176f01321e988470d8d34cdeafb3c7376045f7aeb66e3484ddc342113cc866a8966d4f339af2a8b25358f05625790fbe130ec19526a262de232aec68155b446dfb4238e723a6f0cc1fff3810bf68aa4b033b068d902387479b49f1a27276e8e866ebbb08d9a5fca2ae7fd94fdd66d1d443f5f98986153d2dbd3b78e1c8d797daa84e3d70192c585ec3069f59ec638322f94ae302621e4243be50fb965289b1bd052b140c0319304a1826fe2d4c533c0697507af35bcfa8772d939d10f4e35899c8b61846265ba23174185c6ae81828e95c3bfbb219497225a1ab25fdd62c530cd10b0cebdabd5f5a8c00063243d401b17a00224c347f404bde756a83e6e0ce1810777ce40bd0469663ffe0ff31e3e5d807bd4fd77c279fedd9b89d1e593ded161891254b8c5e4c3149708b711f51723c0c7c0e79bae8cc6b6341b55797c404c0797cfa8f1f05ea504783ea0972abe39f45f45f8df0acc73001154f2b65917d4adce9bf021b3f4930c787c57355ce0de628043fa0bf171ff02c7a0a823db91cb38dc8bdae6fe2fc12057f3196a90c13437fedf2c1a08b5fe1477c176b6e9520f72d0fe3e4d4fbe4cf2b0e316ed9c6cbd345d8f007af27617839f843e5d4b5360d3e8b4258b15cb4ad12acbf3f644d60438081d914e171bfa334014f71e2a50d82f7f71035e6719741c13b5287033adf63ce262c826a345e0472a686cc841c43e40ad09eb522faa686c9c24cdb6da1a73f7a7e8e355cf0c31c33477131c0cc8c60222a0397ef401ca4fbe5b285aacfb7ff516657b655377d9bf4b2d8b694c11a0284e8ffc6b66a379fbe4269619a50c36a62133676a66fdef4cdb30886d06fcd3322c5ac8a15f8d85a4461f1b3bee4e2eb2b864d9674f6a1f93264bcf7452dff26f2232cede3d012ab43396bbeec4d51c6747497d647ec99349ae14fd282dc9b67b2fe57baea2c50156bff1ab11712911e99a1a8790374d4f2791e0152356c52fa8f68aaad2179b806ae771b1a495469a95a74b8b7a723cdef03971cbd0e947de8aea1554e17e6700d03e81ad0780d3cb945cc63d4cbfdab145ce062b762dbe15f08191a804b4f85f4d55183d48b007dd6dd8b536cbceb3b73cec55136d0598ecefa19c1e1af65841b4a171107e8e11aa10df5a23a59622874d8d0008796a03c9722df3ca5b8acb421468031453239854bc2066bd4400232d47d3f3970bcdf81734f9234416e030459f3cd31f4bdd9766687c0ba727307d8e22ff3af6a504c440dd0018e83180a4c7a39aa03d55b104ebf4ed94cfb310cf8c3cbe90f89b7b171a20eb4837fe52e74c0d53f703939d0bbde39d58d12a48da49b77b7f86096cc6f122f1ca284c45f537c4877491ca6a0f9565033a8ef067264e59136bea4327205dcbb82e6f1d27344849ecbd92fdd9635424086d7a5c7ff868b2e0682e393f7d6ccc136cc008fc6b93fd7132c0f39ff30e78be3c4e1166075cbc1a91d00b69183728d0f00ea35ec4e7f8ae3daf352eef300b0fcb8ec432fd3c250401ce0b14ec36aec4347599bc657cae1f4f75b3075c84513f2bfbfe7b55f6739d8d625980d339631ea3fc015e12466f675913184d3c1ccf5b4d43ff88aaf73ab6240d3ff6f67423e7e5274eda312df50cd59c3f34b2ce1dfbcdd13554afc84b8a92970d2560875c8a2c7d815e055745f958db82be0ad95bc64787ff987bd0c4157907e5ea1fe039b834f4281730b8626ab2bbca3f00140ca7fce2d82d0dfe26a88b9451c6a4cd1a687c1cf6c775cc78aec1316e8489b0e6db4071b92a45e13a99b6cfa2c9f772a6823765f44a989f287eb1b9cad1f4183c00b1385f7ddd906e6b59267e819c0217e1d962354a70c519f7c2f49a35329fda1e6300024f31695a87918c69dcec413b8eae0ebdcccfaecf2deddd4f933a0b5c6f13dc6883fef215438f5b151b0e82bb250dd5854a20cdb6f73c13bc8064b46fe4e9c32de992dfdf7e9daa49ba5da4cda95135832b75d0e02a4b73de07bcc86e011aa407e11f2dbb82e7b0a017e98a83ddd45c8d00bd4f44d0ae22a5ec6f8db2d33749b487b6710fe14e095b005a9ff39957b69d8ce99c2b2a49cdd76b437e280160a2ded7e6080c143eb84ef6a95787363ae6e37400d57d2dc5aa8faec9aac1713b242db62c1037a0d525902ed873a6038a0f6381fb305bbcb5be6af9364507e115a2428d119720a13e4fa5df98526e7aff00de3dc1a92c6dd90b6c4a211410f7197b0a29b2b815433912ba33a37b206102831fd1a6d7893ee97e084e61193bedace83a4ed34d608ba8c0141d3a2526f0686a3871b13d3402138e2add203aacc89f3d520d9393e224d142cd45c1d983937409190ed5dafdb22934455a1f22c16ba57c4690a9885faedf39de1d140225f43baecf5752a05fabedafb937f11b2eb544949925ca33142ec7792f5b09c1570196392eea0c449c1099059e7fd3979feeced783b4bc1e8ad745767b0f9b312733e0fe239f7de2b78d060ce6ca5db3d1027b5d64dda2e070ab2a47b9a9fd73e0e7a049846d80d3fb1e772f57e88034771d38524906937a88dae47b68ef9f01f388a4e2c09a2c6bc4c99d6e737e74b382d5ef588e167f94b58c45596ba0438f98a807d8d39be17b86380f1d062380faedd5a624731f91e87a3f51f2aa17435a3bf49c8d904ce79e8f2017ebcf21d1de479fd83631cbeec57c9c3586097fada92cbb0beddcacc13cc33d42d6a451053cdcc6bb70280b56130bc522d7f9f3137de266c91708641da84287780aec62ec15221635428e4690bb36de8c40629c0d9888bcfc3b0d022365692f958322775fb7bd444c6d656e2ff4479910f246b3ae0302416e8c2b72479172a0013bf734858014a12cf4834a340b80450f2f441763310a53edcb0664633c4dffe78716332cc3aad05e0023a088c32ea6191908b9b0d228471cbca33d8057b3048d5737fd1f56cfde77ac713e70c38200dda81cebd02d29b0524360f401bc0099ddea7e31c0630f449b9f476cb8e9312042a6295a1605da6539865e551d60f73a1936029c42b4b2fb4fcd2e0aae636fbf84554482814e072d5fb06c9ad041aada3e51e52249b38761c22e8e39e642b8e5430e19d9ac4868a3f65e34eb9d2b21c55c045a7244c40c5dd75bb1db459654ab3db910e5f764efebb577e4f2f37bd66b567b3fe601fbf3b25ca6a7e759be5346e0a218b4c6b5c31e31eb4efacbb5a0810bdd41860fa00803439a830e8956820af80ba71e346c78ec03db03a9c69146013444c64d76142b72de49f328bc30357c829796b15d33f1251e14a10a00f416dcce6fb171286ecb093ad6421d548b71c4a2ca5abce2f51a1ed74ed0d4a888750736c28c6aa21adcff9b2398711383a225bf88c960522afa45f2e0581dfee7642670f12d2250fd80291c3899aa052c0294af82a742a82b2bc60a9e2eed6cf2c998b41487e36f6be74476510d33a2e875055b20c86cf10c48729054da3c1236a70c65b1556269fe1431ea9a7d390f596c71044f4decf1ad7647a74bbc5e78784461684a02be1bcc10b55c9d47f396b3fbd4cf644c24d62ca61337591b7811db209810349819b68dffe605a90c81b999c0c7337022d70a88138e0ac549b1c3178499452c29d2bd8662eed0f4afc497cf5dda3a7c4f30e076fad0dfb42381fc7fd4a59aeafb3414bbe23e05ef35689b3f73da7e63d0274e7c362ddee81373cd2c73cb147cbb25aa54b1572a3603ac0691c4dbe7735124906782690add6321f7837fe321461b6b9cd7475d60ec3a8b1d710dd39db0f94533112659813a3b41a84b9829b9c21255878eaa29602652e0a4e11f650d03abc08da98379f093bb3830c4ab06df69bd00ae8ee76c72bf28146848d96508008576b10a29694166f26580aaeb39867cff1f5e6eec2efc714f05793aebfff40ebf8b0672c7b7aed28792dabe4581799ee1b9a271990962f052e37baa16df0a2abc37759282957ba4e3d012922541db8c3048fae818e7c41096da27b32d6ab5e939d5548ac791671af1ca5a1cc1a1016243f91d39544e2c59ea97c62ec3fb3c0f064e6204d6e394c9e563fa05411e2d6e739b94a470051dd22acc3ad054398eb9da2675b2358fb80fe5815a6f755b284628d935306d0b81a9e17b49b06189c0a96ed6e609c67590d83a55bd4d4da88fe6a835b811284e2494225aa36a329869189e060b2521753fd744cdbd792e18a9ab9858e17980876ba75baf94af8c53266821c00a7522bbcf0bf20ddb9d852d131a14d3d52a906f839b23f92f875ad298261ea18de2067db76bf3841c1021242141039811d4e33403133a2df5eb52c5dcbd608703f52107fae5140fdf658c05932347dd2ce1efe4b74af4d018e5f66ee4cf5fe4fc0874e5be2f5aa273e4457ecb547458df356d8d77b9b864b054f3323c2937789a758b4775940c87b4c146ecccd79393f0a616b7f63c8492f6f9ecbe4c66d43842a31666b10f74734e71e8b28d5ade03c02dc2f575bd562002199c2e3485d780ecf0d458abeb24d88d004b4c46b0dd77ed5a34747041d9c045b2260a7f710fe17e7124b8b30cb67e0921c36289474cce15a633883aecc6b770f9a7133caf08025211fa655d52a5b384e846e27f4434d52481d0a89b0656d456e681a018ae40ee5fd0ef50c520a68c9db2d37ba5b9aec66c55c080bf58c633863cf3f8714c82d5c25078f1eb4c12adcba7fbc50e9d3f4a2aff2cb53a820ab050e9d63b67783447b24a69330bd7dac487a330cbf617efe64c178ff84f388292078c8331fb3ded30d43042686bce03fbb5c99d73ef9feec66fda3a81239b04b64243021e7d091a6db1741f0d77202282573b7ccc726fd6c5b4683a31b889d15a6e428b119134fba8afb0701bfed124a90b340ee7ba7a3e640ef90c81e0994131afc627cf591de8ebf483ae060b0690264df494793054c0b17ff8ba59a46c1ea21cc62440ddd1d505c00146743ca0e527abaf3060b9c441bf0d0bd16980a5bbae4b17db0910ed52f2999fa59d5598022f3b9bfc9944fff932fcb2cec4cd9460ee6e6748ec422d08635b1662b83a27725faed47c7b04b74ea67b455075a14dad2d5719c7dddbec8941b88aa846f32d382df4f578dd4e9fb41cdefe220e787a1ec19f238bfc7702470c56d63e30247016930035cc4984a501c94481e60cfb273a83ab9534033843203d063fca7904530d72c29148755912a39a683478bcd0151060963f5c2428ab201a03df98db8a55483faa4dc97ec89107aeb53037e53f2763195c1ea31f9e3f211730ebb1709f322f6c7142c5c0924608340dbfd45a977bb8239844a889f246ee269107d79fe40bc734ad0f2a39cf103ac5d979b511f6a1b850afbbe2318e6b667fa3d39a1b5332a1556f2cad3aaefa3039736cd883ca36988d1de17894410411acb44219a1cf63b1c357a1187162ef53102740d6d6843eea24069691b6a3ae091e105c1fd82602f4b2b19dd3bf4f7aefbe5b6fcd4c50756f76aa94868690c8751cd8d313107f79e3aeb45db2c49b5f279c2332c43a743c64c45065d2231921ab47c5d8d07c74bace70667fb9653a8b180f9d9da2d0b76fe49e60225a74aa07b368ff9e254c1c9d461c51564dc44818e192e4e06b015e21cbaca9267f6603d1622b8c1fdd941677873461bb1667250a9b666165e87596e00877b4eb82f64966a0a2dc09227b8d712ed993dd817fa67381c7048ffef4e6dec964650470a09af0c693104936f66b9c6c6c57edf46c0b71a82b516209c23af5ce5ff191b0da94383783de2c50b315ebf058adf6e42c169826ad72788ed73be709ac99fff5632e6906389ca219272f10c9ef4c8c034a35b82d0bffbecd5867c0a283ce992ced5f0c217ac4b7070bec2c09c45caa6782a485109cac09a3556f3968838941fb23ec318d78be8ed4e643f7f068b67dcb558e2da3a57a36e96bd0406545c576288c167c5eb9a359ebe094a380a5de7b4850874d051ab371ac85e7cd0c3b46698595b783402c87d176e1fc7b8c6d8b908150f95ffe976250e92bd05857c06a0b3b4b6a48d872450e0a1c8b5d8d71378b463d7294bce0a836b298ac410e496888486733a29ed06c57d483137ad96c992164ec0b835e9f348dba61e4ebaaa8d44cf0e6b1ae093e0ec5695b94003468144546133bc356c591c7fe6eef48d5c0b61f83892a4127d851f60b5a9f6618be4c4be4c4c882fa4e9e225e2411dea6d38007bfaaa6aad23e2d20beef1434d528e8b32eb3f61d3983a5a18a2492448a7bce4e01ed88f4615bb2c7c23089fa8ec806b252b16a7ba80ff0038a320be16444e1697fa0c3f187ccffb4ee7e3c10d7c6868b35642ec5b12108923a03432bb8d1a39bd65ad99402341219c1782f595b018990e5ac46d87e29c7bca286f002b19b0f0845e7f2d41a7eab83f233ed6ed98a74ddba55e700cc53ab46f18f17bb93425041a2ed8b6bfaa467fe2ccfacd93d9ff634ab9c1620b81cfc9bc04dae204170b16d128b0fe778f15249b37f94814846be2176435e37d03d2b97423ef20e56b7783dd02dc31f84dec2752e0339e7a392b34e2a2636d5a92f8b10fe3f53e0ae8f8e8235ce73a9b52fe0703c6bea30a064830511fc2658dfe45e295d2f6087d1aa01a1c26031b84157042de8248b66b8988506e6eaa3b26471848b561d60a43bf87a0048263f31470813677831c09751e8b5a89d0ca679baea44171a3e0a21123904d998fa46cfd145848f44683e4885fc7672fb042c42c9b649eaa8bd2df34dc5ed231d16abe11936fd3b29d0c61cc51c8c2cc56a1fccba2ccdcb44c9f405215b9b1121e02fef2108b0833b5a463f3ab2b0616ff934312e51206d8e9b205265b11514ea36b2d57c9137eb539c7134bd27319cecf9727662ada18af056bcf1f6653e465e53bce7ce328468323404e36e71bea81c9c42dacb795c63d41c3f69233672909f2ca1c95f1b59288951b91874a12b63e2aabf95de87893c8a56561f2775c78034aa05a875a20d2324e07a91b1a16d63ed926ac4fc13b87f3d8b1ac2b8e88f58ca60bde7b8019ddcd84ed8a65dbc54c1ec0e4ba333b3c00882acc3d80f381e6ce3cb9d47f7f9557b3959acba248ec433fe8626fd8480891dd6dcbbda54c29c935086d0852082fef16d616bf1a64067356802bee2590b7ea16d286bf67645c7e2d40de92afd9655a35aa4696d262ac5187fc6d5cac6fa490134a2ebfd7d337a7cb51bac54d8ebc237d23856cf043f3bd604c137202883b7a40b22034eeb8e335dacbb5113a331f4f7ef40d730d2e3f3331721466e3f2f338ad5cfe9122f1e99b91cb72f9b90a71f9f9ab1012a79f6920af48a22c72cb8e3b4aa2d8112547cceec84d4a45a56a54892ad0e5e7b28c5c8dab5d7e8a643bda90288dfe4c2b7d33d990387507bbaa5d7e22afa75b24b90dd3ee1b76641a1312a79b5b6d58ee06aa5a6c51550389434920c1b824f0255474b8e25e86c0815ff34b489c8d04d38df8eb159e00f71bec7a4882edfd55e02e778624d8c2950a7c2596bb3df75b480289e572cfbd875824964b4189e54e3087d8a2b862ed088add9ef5cdca6582bd52a8892ceee8babcca39a1c3d156a309f8f58a62b878524ad9fdccccccddcfb265bb4fba9d4e6ad8b17e9d34d58825130f29a52783902d594ac9cfdd31049743c949296fb03c4a2f375837a92089acdced9b66c8a2aea462031877d5fd659aea9aa06a0516fceaac1eb9123ce79c9973da1759aeab024b3f037a76453b704553e08ac680a79c5681f26553f375e6ecc161ce9c73ce39a7cf39e79c734ba19e522ae37da7266aa27ea652a9ef4f79def3c87c69bac012b8eaf09b5b71dc36b7c4eee4ee9c386823e81bf9041a5cee7cd9375c66357c3f5b82e0b6964fa4c1e5cedf497de977525f0a799cf4a7c215ed70a7be17f2a0be56273af665c0214e86c478ef3d0c380415ae5648bdf7ab0e7752e18aa2bef4ab1dd4977e45c318d88210905f40f6f1e69b4e75d28ebaeb5a05026a260553f24000635e057e3f03ca3c0ac4f12998926751dcf4058a7537ec9cd47d73c959ea643ee66338fe2bcd3c9117ea63defb9d182fa6d6eb5faa5592414fe0215b18f00285972736e6bf975207f7a587f98ae353cfd3bd0c8e97a6958ee7cdfc6cb1799c6ce1cef733210f8e2f1c02f3a9e7910963c252ed4a30a91015c662a7f90308c358b6f54b0d4c6821490808443ab410927024a99266928078161402587a10c0ef55a0e97180303ff3727a19fb31a81040f9c231a3e32da61119e91809c971b9529094a48214084992f14c5ffa18cc7f329e1793fa30e4711213f2c0fc57fa4a257e8162a743b19433ad74bcaf807c79a1573f2e954c5ffa60aa29880a7ce957938ec779a0101f5ca853d47d4ea760ba3a5287cba2d27bcfc2f7312f4d3a32323120ffb450df86ae7456fd9ecc7bbf23f35e873b38de7b2fe4b16ec33d8e27f2aade92796e48cc7f5ff2bed4ad569899a9cfe3fdcc8ecce30879625e26946ec385de977ec72b79315f58823181a93016437decf431d37b1fb36ffa7e409eb9cd090c1292c4f5498b276b46147399b19e36eaa2a67550cf6cd85b185aeb79263046be4a2dfbc96926f2561bf53891b7e4aba87b66d8304e72c38edd1333fdcbe774f778eb855fba6e494b9aab48f7744f1be92e32c3eee99e067ca37d37b9b0eacf0b42df051aaedafbf926bcbf4ba7851174ab04f3fe42b6dc1c6f79ff305781a78f953ea6c7bd439d2f5cf57f4fe4e57dbfd3fd17f238e9e739853121fb84dcd33de16b03ad14dba63f05768fb762a44db7cb974ef739ed41dee3edce4546d74b44201fb94d0c6424b7298289eed64f2d283b1f6f79a6f7e7206f9ddef98767fc6299cf0f5053fba77f79d3f75ee93b6f59fff4cc6dfc4f60d3dcc6df8244d7768ff8ddf3a8d99523c0f011d93a45449fd036cddf32386050a9179fed65c0d3c75414587a3bb91477733e836c1fab7f9adc73f6f4727a1bf2d43f3d4ff7db665f38ce9eb002f7dbef70bf853c4e68b8b3fd29e47909b7d78999fef3bed47de57edb6ae9e3927a7c7c187931f038caf5e728fcc2317301a964e4918c7d7eb8c701762f03963e06b40f9342995e6875798b81663417edc791f81e383afa80077e1c49af56e5a8dacf7dcc7e877a79bdc25414f7f5fb6bf730218ffdee794acf3d9117f7d6f35ad5c3fd8e2e1797d03dd761de82a97f8162fb8eaed50adc97de47a7631bfc5191581f3a3ab1faa8efc021a8ef9e038738d97e488581a996fb9d8a0a4370354be0d782901e9f9aece787ad474cfbc4d8a9520322c45b323f8218c63d2c631f1ce0cbcb80dcc7ace609dcbeafa0e9a56927a771c4c06c3fbcc54134a41f48407ce8d43848ade642102035766145bf02f205f35d107e79fb31ee51dfe18a765db8ea4f39d139bd3f6b7bff9cfa5c77bff3f2dd77873bdca7421e5428431e1b4ab7912fee14c662b5fb975088dbb88d3310c3d834db80d4b8c8bb06e06706566ab1e3c98876995cfe0030e99be63fcdc08eaa95bc4994716578a2f5cdaabf2fff89e8f4c43d9d80aefcbab063bd7c320ac08f8db518843d72fded111f3fbc8563e41f2bb27e74f10c581f07c87d0c587a19b07b18f0fb14e8a140d34bd30c285f3840f98a01e54b06942f18f9922f2fc7fd81ae7f87b6c7c260aa13dae6058a9dd78509b3fc1ee7861d5f472571fa312075f8980aa17447697433c036fe63c9e5c280d4e1c31a61f943b05558aed55a954a14592c972bc86a0b32bfe7f7f74d900ac8572c56fa3ac3d516eac0d8f7a759cd473d91979fc2d50c572bd4b7bf536dc8e364863bdca3429eeeb91f45d795790e8c7918d0fe0944fd2908eb01d992f287c4e1ae3ff7780bf5fe5e5d92617f64d96a85fa32bf535f26e471b23d8ffdfa5bb8c37d4cc8837aee731ac6047c69a803f35e0ae49769a5635fde1d144c188bbd7cecfb58e9ebc74c1ff33ed6fd6b4ef0071036812c731b97492fece3a34a4711996d4ae2ad58ca977fa54c82008d4e0d960e026a11775a5822ab0052eaa8c18eb20889d66812ac481609f1e136feb6da9a0e163bb2ae8b5d98d79fe686a9ac4559ade2014f7dfa869f3269f714e45df9cff79f482d3291953bafcc232c3ca69116769c46957b266df8895c66182079cf3c1c1b080805f636cb126af71df6cf4c5293b0815a6417ea078101764bbf712ebc60bd69e2d1d42401a9838491af538fb9fd4367578e008347a4d40f4883df7b9a163becaebbf3baeebabbaf95ab5ce56a0df9082b89f2848b242e6aa3aabb9fee02080aa1a4db85236b54cd80bac07247eee9e2cae9093b72cf898a75e1057bbd882124095c8395425b44b9a30335b946461e85db82cb1d1d480a6db1c5833c8a941e73b74da1f39e66c87aef4d530a7e3defa5d451df0b5544d8fe12f5265f09a4e91b2e9cd9917b6487ea71e534c5726fbdb07f2b7f274d29f0ed7cc80db52341fb5c1174bfbdd775e13804e976df2fd781a40efe93146b42ea59c15fa6b005efc03a728f3f07bec0a17ae440d6a2bc32bb2a1f16ba0274995fecfc5ef7d2e4d5fa1e33b9df7fe1d8cf976f7d14bafb1ccf690e247247eaa16c51ba112afe24bf0406ccf29903b5c8a3039d68f6eb983646186104228608823109599edddd2d6bb195c05aac5272b5c2bc043b0439ae613aec58d8b006f9568eab5eadd5e33cfa32f41892c401254e5fb79bfdb69eb7a0fb00683f680224857ea0e54aa11f3cb9fe6e44dfacb877c065c0f5ef9a2301598fd1bca503e404ec05f344de8a797f0f06641a0cb86201e6633e26e421f253c405f6820999466d0a55645329eb0590fd00e62fff14ca1619f51ccdac3496bee99f09ccdbdcb5bf70df5921ece8488e747a6e4b52dfd8f7afa0c75ab4a15ff9d167462d228d3ee3b877cfe2b5d93365de8a4d5813494c26dd8ad1284caeff6cd22df1c7b7f48d147a23a9b9592ca86f467726aebf47e91bafc1041c48e2b8155287bf876ec58ba40ecf5283f59a23b568013b2ff7f44a9a912f2ebd928a2cc6e1e8c21e0e6b18c311ceb691d2ddf42770a4f990c669c338829a2bdf144adaf77c2471e8cbf742b66427511dbb3b4dd21c49ea7032a48dbf1220a07c8e7847ece8b3a3eb336fc999d7ea3f1b5dd78158d71d49bcfed7c53b3ad25b47f22c27d422b64798333ad2f5b749d0fcc85d1ec1c86cafb478b2a6d63ba5eb27f71bf882c4a852499c0580205b3856b0a4b09932b9cd153491d865424e0b2f746b8676820e9054568c8e6416a2d1c6d0d4d8184a9b4fccf764ac7bd1f02f27fcb2632e33cc656e6e70e6b2ea7237a72eafe88a7eccdd4a974bdd274d2f3b52c7fc0b481df31b345da6463433cbf29b1c6a448fe603e8158ac4eaf10079a382146958757a741115e40d77953b0c2be78665b9e6cbad6f25ce0a52c7fcf928d9aa00dbcc9fe217777271e78f20481df33f2e6c075219b3c4814dbef377646047ba05c2cf0664324b8c36dbbe99df9d3477f606ebded8a84b97527af3c3c24d3cb0e0b86eebb69d16e9735f2af3fea7c9a5b496c6af7ed7c6a838a4956532598b4cf0a531d786ebf107830b230370c52fa19822e84a28a690e16ee08a4312ee0d686f30a3831bc42ff754a8713dfa6db4bb0de17074b7f085be41b86b8279b9f73629e087c5f5eab781a9dba084e2063bb85ef74171032d2bff986f034b7705d7f33690666629906d89bc61d8467ffbd9826e780629d21f3726976e404028f734cf206fb80629d2a745b886ede9f6260ec31a4a4484644d2f6d7a0972ba497c24145520b9cc32a9e37e6f625d9d158a7e44dd5116c9a21c2c89c349a40efaf40f205b7c03dbd0a7a14cc5e1c83fa0d8660b47dee152d665d9c785156554b66d7493511a7db95596b1122a73e933adb5fae11dd0ca6d634d8e4b9f6ea12f478985379a958157b6ee94db24fdb60d8aeaca9f261ef2a5d339a97be5da29c8f33ab37bf7e550448bb34b2fa28589161fb414d152440b17d1c21c4ee9ce0497aba79d3c3d76b4d8df26568bfdac49b926368728d26dfbb135bf719446c5d51963bfafba90da9de33934e94d152e4f9e29677348524a19b6bbbb7bbbfb74d9dd3d96dfa59ca3ca8b62f95bd61f74ffdc29b1d49a93b0a0e28e0dbbddb1eee923b795dc367a1214012ab234310415405c644bdc9189c4b82317b1952206ea6e33babbbb5b47321c11030c189151d01dd9c78a26b849d7884445484104962656a421f46a25eee82ab2a159ee400746909421850624aabc3a892ab4b8dd3fd65861c6bc42873baf08e3ceff23ae942514e0969e33f1285d95b7fa48c80aa1dbf1e86826d44c1cd851f5002455da465ab922626165716d691bf900245cda465e5558e4c6ad5fbf6fc6f9aaa7f9517555453ef3615bd39a06c62d00cc0eecd845475384c160324cb07aab8faa00823d1bb0c466795ffd73bbf6c2436559e49a5c7b0a19952e3410a1e50c27af867284142f1284b08a18aebfaaa690a83e3b93eac10d4c3cdca6941842064786b1a042e8fac7a8a40a056c48f1c61049a630a2c393275174779b8a54f18731f170ebeeced6741d0232c8628d1e18d9e10d365e8ec47524f7cfba0b80c68a3bd62ce08e397698d02f475985c889db3ffb6b142cb8fd56158511b7ffa580dd7e510a2b6e3fcb65e4b6d01439b82d546576fbad2c4aa28c12df9c2691ecfabf5422a0d8e10030c41af80cd5705b68e88adbff220d42505871fb4d261eedbad636142aaa1aec285e9eaf16c284ebef0d215403cded2fd927426cfcd96eca135194e103cec4a36d1a54ac0ce0f66f314ba9c4aeffac3198f24568bf20335eec677bca935bb36365fe1c527c8073bb8640a4aa342b476045b4232431d4683dc021061f2932f010a39221a96d24ac6de49da1a76de41dadca871d603d17261392b204929c2eadb252342bfd60a3db467b0d8bba524889a03bbe50140e64bf2b8594b0c2444889232b4af0804a900c0e847db95228c808cd6e570a05c510d483152015165adcf15946684f5c29447bc29fe34a215a8f57742b90e45e25da97ae6a6465ab8158b2558d74648bd22460e44e7bb4c857a7452ebab51e85d5a8083b76a0cbe55e86cba1faa507ebd1854f0eb603d2395fe2373256e221317df064cda358c63ac89618aa66d0fd528a3edcce913aa45896fee3c3b24de6326f19fb33c7f99c1eb2333b3bb3f4979be424273929597a385b9cbff90ee2ac5d36cd2ab2ac4525dc93f26c581786cbc59ab4cf8c2f2ed76a2666d6e284659865ecb3858c98cb958db8dc31075deebaaee676396eb7e3765aa6dcaeebdea2b182dbbd0a8d2e6ef79fc611b77b718b91db3d6bcb95db7d35f1e86a65d5deb8dc6f9b0d3f94d25c71c79a1d97527ac610979ec1c6a53d20baf445faacda0e669821e54d857d5e33e6b8358b10d75fe559c6b8fea2194cf0408cebdf2c1aed765cbb483206908a5519a672ddddff3ccb5883073f77fea712e1499037e79cde0c921464f44046ad0c2224246a104248b2cec4a32dd2183a40c0edafdf932e4c3c7c0c99a37ad3d00f3fbcc4fc69973b7fced96fdbd463afdc39c29d4dec5869c428a23f2849be39e79c7e65042eee98a30077dcd1002c4061c4c210420c30cab8fdd2563b4455b1aac771dc15f6bb52e80bdab5555a505ffc1a5108a8f405173a705218756fbfd072439da105340a240e8c243bcc17bf46248a111d2152b2a9ec1751c4adcac6a88892e8bf05e3099217bf461c9a4dfb6050c181a598b9101859288922488dda290c16d752d8d4954251f80cdb5d2914a50bd6220a961f2b73a550943344b852a889254f60c1e2f93daf97ce3927ade6c513dd37e3c73f2ce626fe31f3fff8f8fc70e5c6b063c324037a9e05d2841ed60bd50054d8535f56084b9dc8e73f5d61ffc5fbaf63dd73a467903839dc1860dd44f5b862f4776cd985dc754aaec73e7e1a6b38aac251e5c3a5bb5e6d58adb08ef1cce5ef969cf273e40ba04e62d24fba6552df3497bef19ed8f523b52d7d534d9c17c27cfa0883cd5cb8848e41923083d4c177642e9763b5d6dad5ae76b5d61a76acf9b7d00076b7d09bc29fa510a89ffc28d0c10a4a95d421654e9280a20a14dc4c14322d88263916376fff8e1907c05a62e19cd63723ffdc27faa67ffcc7bdde205c97bb75f7db94d2d5e214cbbab37f6319ecdfeead5555ece56e8f9bb4d80be828585247f75b29ac874fbab8a36515753224c14cd422bf0db263edc2af6df839946dd361fdd911b2f8a7c879984e29a5343539e44fcaccfc514a671593b3a51a9a98b975a96bd3ee40497ba33133f04c38b0fc638cfdea3c92a9d1103c2444eeab39553432d75ba9a31a2ed7dd7dcaf98d31d7251629c1a751c5d8af52777729e7fca68d51c3fe690db08bf99e289f8fe6cfe72f240e0d5b0622eb3f7960295dc37a38ca233be7d1fc5aad85a966296c8a74e79cb4a483ed772b1b6fa017b538bf9b6f8bb0db53fa35a421a5f4ce4be5579c17f58d17b4e77393869369379d3d7b4af9f45b5ae91ab25ed76d552d8eb69ba34d7ba34dbba9bc65b1b62eb64be2c93f4db1abca3cf97d86ef56d26897dff20a866a6022014f1a61815d39a4c488dbe10b7d4fa0ba2fa88830bb6044edf273615867d236fcb98facb94f4f59e3a73858e93edfa1ac510a036b535d60bf9a95ff69b1f23d2ff22a5ec4ef42bce5d55a15ffd4faab1daf7bcf7dee38593b9dcb6d587ea8150a72a806262b16bc6ec50237a4ca17fafabb498599dbdffeaa1504666effcced17c1f6fdf4b77005810e51d04335cc5c07e59011da6d10c84ce9391686745f7dac76ba1e352cfd58ed54e64286b9cd1676943549f35add81276b4698a3dbefcdd9ec99796b1691366d83db33c9ed375d86756ccefac6c39ea1dbd3605fa6b749b76bb727114ccc28b6b2a617b75f8e539630812409fd63c70de87e9c5fdc7ec90c9862947e82b2825f0bd1535fa537813df6557a6f3699b3c96d3f67f349ff0cea9bd39d59bac54ecc28b1db0feb89e5f67c6ea30deb7136e99b55cc65b0fef5fb4b478279191287c39641eae8ef9e267d333faefb0de4a7a057f04b415e17a4d4b19aefc99d52e989bc3a30d6fdb7c128d0ed39bb5e80fe052ba0bf0369f857b7e3852bfeef4da57ff9d2bf84d26d60b7571caed0afea35b7e92237e2048c2e468d4bf0ef9f44781ab2d535481b2fb1580630c00823ac5630307774249c177e22248e87466e7f73d83d4c427f05606e43867558d11d59740d3be97c3283c2396bb1ad1376a5ba342d7acb9174bc555556bc638bd791faab0dfd55c3fe6926768431f299893ac058269edc619d98fd34f176f7769f5d2abd572a954ade61ff7c45a8ec888c1ee99b9e7907796b1a55b7aa69f4fd17f27ce16ae77bd313799d9ec82bf5445e2fbfda81f1c2d56ae7e589bc504fe40513127975388a3deb20b7a9df4a85fef9335c4dc91ef6ec5542b67f54cd2bd388bbc2362d06f52fe16ae7e54f7f0a794eff62026152f66dc863df14ae764c2ff332210f036105d0cbf4445e68d85174b1a8d8fe9195d3e30cabe34389fd01b68086ed3f828cdb4f5ae4f7598bdca2db52e8eedf1b3f2d5279efd934f270ae66974aa54e8a12d3142947889822a5895237857604e40532ec285b088f18769449a8d40d49dc0084373b12820b33163b32ec64dfab45497c2043e4e5812bff9727f22acd52a92b152df911aa41a99bbcf3bde9c56743fcc0c18618ea39e2854d8128906545ac09e431fdf72f20cfcb7bb3c87f70c27f30fa698264f94f2003ade005641ac84158ecc841b4565b0287395b82064455d0b0231371b335685064a50776e4221d34277e92a0c1e84a187664a31a8e74331eb2d0278eb4e08922b5232c67d8918f8250b499ec065ed1941c8c31250731a42c5aecc84840231c51f9e1e76787ef880a50142a30d852db32861db9b6061355d11a4abad625cb8c8d2235c8e024e67264474eeadad112536cb425bce0c27482fd38ec89202bb427a0f8acfce5134aa4a104d622bfcced1818f603db03fbdbc28eddb3be794274f93ba86f7064e9968a1644bb6c54a5a8c7366a2cdd6ed437fcf38acbfa86b7cb3e2d3255628fec539924b2f2e2f6ef7c2f47df4c8e565a7b7047c8b02ce39e16e723b1f673bcc5729b69439657697d814e06b9a760108902e78980fbad7ad273b95a34f66938be306feae97b29d0c54a62533fb26e0aa9d0d5e214826605f2f06bb5a2114d9e2d09cbb016a76d815d3d4f9a9f00f819809fef2d117e3ef7489cf9f2bdfcf7acbe898199f3653ef5144cd114a55446e653a9d45370b43725937a1c60102913ba5221abc519d3435e1abe302fcc57930a0ee8d2a5cb044e31e0bc30e04a854e04a7ef589879115e9a5850fd8740dc66823c217c0f1e105ec76d668eb5c1a60210ae587010de5fbe0010ae58e817e145088784c082f1b123a3a484d1c1a668c2da368fe2e47da92327b12bf05bf4583b5c93025c972e5db4dcbab1fa468a2dcecf0182005614cc5b431170e176ed11578116e4b6b044767c3bbb7204184a44601ad583e782855df95c172bbf666e7212a156b384c98ed83c42a26868c916cc9f7771fdfb7e5b05ea90fadc0fd99ebe735fc3badaa135ac00bf36509ada4a1df25d081cccb834e3211fd9656905367447793469433e62dc5166b9e112f8f2d3eca8c9e1a292a44a57b90cf31e0670e5d0122472e8c18778f099245c39c4c3929bba7228872377b4b7979cbebe41c1bc2278206ec39ff4034947d2e60fc9f2c60f49fc404312b1d70c596ec34637a71b1c595cdc51b5c51d45a33bbab4b8a324cae28ed2080756ee28b1f841c914337a3022c41a2fc6e2721b6d0039d183315c60c49317bbe00a173c448143111fbc5a90f2c30f48a038e30ba1979c92c50e8ab8e244075704f1e2d7f11691266cf83083284ddc40450c5efc3fbc45c44796450e50a8449182cb8b1f88b788e0008410d2164b72b0850d5e0cbb39ad86959f225d9c809245183d5c214692082e48425ffc9affd1064810f9708413468cf1daac08e204e5053478d1145f6367777cd65644c5dbb66d49361a92148e8644546449b5ddd00b8ebc2b875e40bba82b875e40c65125626405555c5144066d34c1c40e3a9c9a4605df1123ebcfa1dc416697b0760887d9954338fc70b972e88626b787b76892dbf07c164b14ff6baa19d29adbb04b9a7bce09fc3d80f0742b351bba81b925f52997b17cb769cd5bb4459f456b5f592c4e14c37053d94993bc259dd6c64d6655cc4f93faa693688d26f5d32de3bc340956eb9bfeefc52fc1a9841d290c269f7360475aa3491b6c239238dfe5dfaa9480248eeaf29792240ecd2237a39bc37f425fa140fc5c7e9ac567df54180ce69582a08136a573968e92d4e86c5312596527fc155d2fc0ad675c0f80cff5179598a08e8b6407d7c37b641b92c9e0fa7ba58f36a593bb16d0bae9ec511eb9ee524a261edccbfc920905ee4eca8239dad93075c8062ed72dad094167bf4bb9cede2d31a3200c1c0cac1c9214bd9cacf8895c0ed72003090612b80025bd642b60fca47f1494666471c2e7c57d74fbca85306cbf852a9f208f93ed7960a03f9fdb421886c010c2e6cf906ea100fe120362b32734643e01ad440b625629fb2547b9bf7ef79ef85d48636338fc8ab0fdd47be98131866ddfb3932f252d9e8056a20551a2519f163d0545e346849d9fe3b5fe04a912caa4452a6bd19ffe18b12395cd77daa4451f6f51a09f168db0e3936e79fff44ea62d8ff64496684184935dca29bf512f2911b62765a44b417a3dfed2b85eb3cb9e2f361394435bb85c0a76974d3c4c3e7664b176b898094bc35aa52cc293356337bbfedeecfc259b7667fb489c25b2d5b486c1ec2380e60c3b0abb74d2dc559cfbb8c568cf75ff4bc35983b9c08eb376dd9f7bd6e696a4bee16e7685e78d9e4481c84581aae4cbd0b7f7cd3b5a294729dd28a5b46edbe6a19c379c88fc884ef739db6e74cae935de74fa07a055edeededededeed277477cb539239a7cf39a7cf397dceed4729a5f449ff45564d70da83e51f41cdf50e3f362cbf3b0d5628f00dc25ddcf97da3dca4936b92c6e46260adadd9009d6d78ecb2c5103e65adb5d6b7e756b52aa9f2af7247dbf0ecdfe1f21bb4b400460d5c67296ea18ca2bb67f069afbb9b065b4a40e352840f96a001547bd9206ec75ceee548a3008e33e1722f81b81cc70dcd7074b9981297fb6fc1e5b81550b9dc100d4bb8ed270ea89052d61892618aa118a05c2a69deb25f4c8d50171aaebf55d9707d08e6c56529969f2f3f570508aa317f4063a03180b4bbbd372b839fabc5ed27cfd90da809b981349bede7f2dee536db6f2edadef6837d1e48a92b751d2704bb62d471251f3f3626b60964ab3374c0edf7b834259523212e466cf54b933f6a03d86fd3c79b33fda95f7afb6e20a090167dde86633dbd842fb4e8817c55de6218fc10773be26ecf425adcbe43202dce366c15bb97a6526982d20401de4283186e0d4720462c90be61d187071f893382c4f1bbf1d718b0138672b7f75a47b2497b60cc1f3393ed9917f0c3432ce0226becc355b697371099e56ebf6dd2e885ed9989cd0677e418cda60402b42930e5087ca8685cbed16d73b931c2ddfeeb1ba6cd20a90104834986e5608165892df664c38ef247f1d61c6dd3bfd336fd34aa16ab2c6a1daf462cf730cc12e10351c5ac246454d20d1c6a68f0400b1facf8bcda89294931a46212c77d50c49d3fe9106d68b162f08bb04ac01d6b92d4b8fdb3dba0e1761b40dc6ec3095114592c9628b29ab348f2a1bb356acdc18f0f4d830b9a30b791958d299068f961830b1cd060c30c26b5a4a42239a071b4e50daf884f62c65e740b6cd7850c16c795424dccf049cc78a085165a489c1472c08c2185d8885dd79148eeca72fd4df86e13b28813c38eef2fb248b8fe3a64093344c1f87116965e1f2d7a16b65ef9dc3454d1c44861c79f3b3a1cee44617908082ed7df65440b2d6416b6fb250beb2e136e66ee0bdd2aa1e884357eac64b9d46713e0d2fef128049038f3ef0c5fc0bdcb07fd8d7e9538399d6c5d69439f521d2e7479447614615048769351f395532c3fcbdcc443be9361f9e7f4a05839e70c6873ce195eca0196304c18dc279592caa794524aa9a42e039ed4a8e48c16863d0d15a2190100802000d314003028100c0704428148281c9466c97614000c7c984c80549609e324887118062162100100180300010032223434a3006a49d24a09e5875e96b9a9420a4d1bf61d2b220c8854e6651b430124cb0e3a7c5dcf6cae9cbb239d0e1af20c1f0efe7080cb55eba54558738288d4f77de865b66aa3b4d77ab1ca41a0d1ec71bdb329c8c4355016a1e71d6309418398721f5d80b6b7adec8ed27a8aeac522a901636c59ca4374ecb5d9065b595221cd40925be9b8492d53c70e390ce3546b85d8bf77baf66900eab53b46105a26db4c0ee06d4c1c0293cb83a3a5a355d50e5933b6c66ac8ac7cc663e869d11a863b7caff5f2e4820237642dbb5e3edc8cba2a9faf37325cfe00d95753b48aabf3049c19b6a0714b21c4f6922bec122213c1186a785789856df21294cebc86faddd84d1fcbc4a2ccb22929bc0b413145a4f03c111b0fc4694b41e91cb96262628ffb59469fe56d0109003eb5809ba141816fc66992a6082b425ed2dadd5f2e5a39e5425945d49e49dcef3addcca2ee8fcd7786f66841ab889b90c855909637aab729796b84f20ff35ac88689b4f4951320c5fb25d506c94a0c91b4be59b62f5148db256944edbbb02c025d405956082389f51a0f412d3b817dc51df1b868795e91b80703afb80ea2ce1c6927d77cc5d91087fbc2e485a6ba8b19a1e351458749b71c8201ba8e1b0edce7d99f7a2a791be5c11464374df03a7b1aa53d5588315b3047b033a72175737a0c308be2fab2111ddd48d8a91879166c8dfb13291c0032161657004d5e9b8883f4db015a2319a117cb68d6595abe54ac2799515c19b2f5aad084e5824b5c1190e1c0e2774186ee93b418436875abc8f6aaeba2315087a0a7fff1f058abdac2234eb1862d70c8255d431c27665936c734f10b50791a86c330032e2530a1f0c2b4cbf09aef303b514928ab314ee0fa6c331f78f7b5d3ced8169808646d4f592c9b2ddd441f6eba692c9dc7eea9e0f148a95c2b498afb8aee713d5e4c7dcbf4d79793913e850695f2e30f6ace7a4e296d5bb26c1e5eb974c9a95ff66adb885bf5ada242d37c6168df53628647dc1e5948dc7010df002bcecffc16110b9fb52fdbcc35f0538f315080a61b75e87160bfee3183d00e22c18e49adc0b6e83b57f4c680059572dce6c6cfd1ab42635233421bdffe9237c3eec9b5e112f433fff60d44b2407c3febf2e53aedf6dda709409abba0db222a337d10784de393b629bc1ef0043f852f20845b771e0219c67f9041053008e55ba7b98f3bf27be6513f61c50753c32f020fc89f877a3c0929e4931e89f23890430e6fafc71a7d76d39e4b4b6fc9bbea84bc55be361be112a5158c84b5c3b18f0865d9911152049e557d13966e76a4153ba33dc2bc58ea8a68f48824a16107120ceba6072b6939a104996529f7f42d424499fad1f90b1fa7cbb0b5f1458987c3a655fdbd97b00d8931c54e4c9d2aef409d82aee804be4d789b65b37005e52140a1d8aafca1075c31101ad7eb5bab909eb8750a7a2d497935dccea7c74f4ac70defa75ebebc1cc70c1f928e98c009687831ab41ee611a394b8cbc45c04290ad17b5863e1502ffa6e35c8ff6e9078d643986d1d1075e5fc650a5f14b1f7c32bea6b240e50a7b661a9a1ac8322c24d08310016c26d8fdeed0984bf7b2d2bc8849344b10d9bd54f9d5a6109d93ce7cafcd0e8b160900cc65da47d2f1458ca7e83b344057d5c89276aec1d150dce459c3d389e1fb8721ea327e6ac02b32506bfadc4b7cf72e600c8325d6ff338456b8f3408b301c1408e8fb8b26a463c709f00c73ecc1f2f3b17d1b2f631868d8d78c2fb4a4e6b056df8f601a0919e9bd0f462069405693c7a34127d8ee3425440cf2a9190aba13a1bb82048201ab41775e16e88234541caa70d5409dd6baf619b416706d10108fd94cefdfda0d598f25d50f1c2800acc96e1295ec54a374407d36e9771524c25de09fdaa7b9ba7848789f317d15b706fd2abc5d847983a90aab741cf23e7dbca5e41019411848a737105a9ec31748ca7dd01dcd26e0ec2d200fd6892f12fbbbfb6231a1bd9d380feed28014ff05856003b8adc18d6c341e8ced8ca2ba98bb08395a4991f4625e7244282649f19ebf9c7cca4d8f645e9f065f683ce83d4feaf19f01e8e439167e1afadc497179fcba9782051059aad07c1ea0eb8e1436e931dc92b5988c49f9c39362f276d2fda8decc1a7ee97e1b5fb8526120ebbaca18bd8f22a00c7a950a4025788af509ec792478204be7d4a10417e99928923f8ddc17c78dcdc9a5de85d367af293273693a08364037d907bbcfb93dd7502b061082a5c1a67a4294c0c18995052da8613e056c9fc10afe5c359cdd8358b1f8aaaf59cce79d50e4306a88ee6ce235f59c0bc44ce8be234dc318c6e98f7f37bb21f5718c2f0c0ae805b4afcb77f0b97efe6799bb3258435ee48a0cc2bd955bcefd70803d79e6dc51c3d4074f45d8d8bbb83a9973b7f6e2342ce50e83427aafac33fe90ba60eb949abd1a0f39301d6ab9d3070792ff9c1da3c01f6e11879aa95315d241f4998264b11c41a03b5f16150eb93c90f3755aaae826786d4132c605d3820c88474aa79b8cb245a4bce1cea202e177c5024556af3b780b79452ab904345ad36f1f3534b04772d53d8368df7b782045ff72ede5178848e78b3764028a087936c22e6b813602b59128b75cb7b16277e76e7ef6da3ee0ca628d52ea7c3ca6e561103151b599c504dbbd05110319645c08f441c1a8b3b2354bdc99231983c908cd3c9d74896f05d77bd58b85126eb6fb470c6d42776f3b8f35ef9867b15664d880689bca3e329b479a6bb3e55637100b72dfc6b0dfeb6d941ec9c411e0476a1a8df0ce29f419023603d2751cf6c1bb3e37d3fcd4c0b80ca319a7d34b00a8255f67672c04dcd1ad06140faa76ef130c8b16f6a1349a746b94864510ee2dec79c6b47a2eee2d3ac7c780a24dc107c006f07fb35c63f9b099f9fb18ea5751a041b2c079df904538060ee0138e2bc487f8a44916df6fb140da3985f458429c9dde5f9978c3b39f6095d5a98ee918479882bd130285ea6f893b59f79e08b420226a12fef81970bda7eb464b104bc45b40a9768f6288b592073f25b4473362a9c22e219f43bfa6a191fc91eb0a4951ac75d5cb1328928ae74314c7d2ea4b895e6f195ccc41ec6838f11c4b2e517da1857f4587901e190ddd8d333703f2578a32a62923b9064503b6e062d38da5b948464a01d1e471ea34206e3881d633883414241f8758c5a0c10b6b5b8a67bcd0d8a164d1883e72369d01a6906446f69b378a02b46ed701fbcf20ba6511b29a49e845d01c49a51269ecf0ca202ace3a32b70802194834b06e3b7205d508165e33bec099a19dc927c11c1f00b1f4877f5547a0074380aa659f584e3e97246b3d5a489de0764d4b5d5b384954c978835366d7991acea2b7bcc32396dcb2ae8e270b9a80408909fee81e72732fab0e42897e68e5402013adb132add98e58a49a8cf5d6a294c28a9610575d7dc7b3a180d878c4f5567cdb8d6e24dc4fe19445d5fd94072c48917a1b888850135fac234585babc3366a159854b8061759a7a26e3b8eff3597e5e256af521c12c56f9ad879ffaa4772aa46f8e22ec30b1a17978791aeacb409b3873776e8f13fa281482f3a4c483f597b6edaf2ff2375fc871ca7f42445b15f739e3b31bd07846a59f1f8d35526ffac8c6721d5519248d284f1fbceff992cd8e7a9c4b8d0bb121b38835af8c6b5f182acc3be40754e5334f1fb0a2d5912eeb9bf1b4e28d90ab008aee414b4d84e7cab695b8f3d03d1ec878ed0945145611d5496682dfe9365410ca865c0262addaffd808d0db3e011532b7a747a7afda5ed03751d621c2ec5666f10a6cf06d2fb8cbf0b24d58b01777db7db1c898a9f88537d9f1c7ec572fa7bf9b0fe34489912a64cf17dda0c728609c1b2cecd85308741e90806fd0cab439bd0ca53963d269fc080579072d7a123faaa53e7c34f79bc66219b06bef21aac319452a1ef113306a379f89d020d0a0ec1900f6d02bbf15057cc05f047b5ec10428ad84e97f8dc1f777ce6495a71fad09d1bb029eae16e16e861cdbbf0c37c5729e48244c529bdd8ed66111fc71076ab73e843587b204e747befff8f6be0f9ce720c07abc9f221a1760a5676a49459ac15c11ad63a30448318920bc8ff58cb1769635613329389e0815327eebc7ff1e6f40aec012d12b49ec67734328f6c1dfa36d7dc86e6247d01d88a4c2ce021243a7b868e4ef6dfabab5b722018beeadd463cb26303ff0a9cacf72954a7983894f0b13ba58cecb8ffc4671ef83b3ebec87d6cd80959a9564cd9b91d5d775a3384717e6b2d3f8271702435b7a1b189bb3244d412d345516fb121f730b38a71f0ef0be470b6db57e1b1a13d748dc55de9cff683c001b98012c7cd2314be96cf48774ee2ca133d7bb56026301e978f3b68fd704148cd6cfda16b5d490311d6a913bf9e394f64428a8e282a18c0f59bcea263408613f68c28561664e0913499cc0254a1a33bba5c485bdd5a40e55b599f2c7b0c81a1b5fcb6bb81db82cc71882bb74df427cb5934332b9667f6c12adc1287c47fbfbdcb373ae020789a5224d8d820bee93b1497c2fc1cd2b1ef875515a392795ebaacdd42413e966e7616d32a2d9f9db9609c8273d188388dce1f7765051b05f32be0b77451669422580d672421c8cf17ee42f27823edeff874918f02cd0dc6773bc15198a88480cf2c2615c4f884b4375f0053917f3d266fea95be76881d35e4c67b3027e8c98d6548bf6871ad9c25c68b915ed508f6955ee97d39aef24c403a4db1a75ccb57effa21564da594c850922f5a7488a37342b58c162de4e2bf305c42e93d1ce449f6e96c354a2c936fcae0de9f253333331a0682f98a9a3f4fcdd7d9ad441f16c8a83785bde342c431d6e982c131f87ca7802ce1b0039036e5157fa26aec699f7655819c57d59a931910c5818900d9b5d34f55a61184dd55034d33366e8e9da35815919985bf86b9d97c9fc25d5cb125fd1d017eb5d4e65f956c618d4913134da136220d279564e0686f5d21705b128b86f898dc6b84f9f1b1fa167b8f51eb87d74c0e7498391f007f1521eca3c6f4018a70596842ece684c0d3ea98c0dd6ad920217020bed64cb4ea5b85cd8a8322588785dfcb1c45d1276fab4afb5ce7441a521b5731631121e43d9e3925e3d12ad355e14a073ec2b572012cada0a4e9c76e1190ab593c09e5b8a437cdc030e234b1148dc260db7ef44d16f278d3233cff7377738b6b93ffd601a98d61d798ee39489a7667e0d1de58084e040bd61e06e46d2c66469caf330a07f3f487196fc6e13577e60d8dbfbcce95b25ec25f6a828bdd9e88a2b253fb909440fa37b78c50aff8d69ad45eb20d2f42c4d5d961d43d482a82fb58248caad9f90e5054d95b9041c59b6b52ab819cbfe628bf34fe7308f1c60ed282fd7012f2c256906d23ac0c6ecc1ca7d057b267715c0a9c7145bdf954ffbd54159af9ca081c81c4b100f17d98512b6e5b857918793bc32ec58b4a52e1eb97c6808343808dfc5140fa7701c8ba64d1e6e62568932212aa1a9b4ecbb9bee148e4882d4a5a8d1c610a0d595d42a2dd3dde5dd4af1401dd506ece7a3157ac2c10a59461e1b506afeecb4877415d7a3a15df7bf39c51dd92ef0b4b248837c2d8a9bf7d611b5752e7bb740473d5a628d64afac6fdb2518b51c374a6700c4349bc22b3b53f2a84d187ca646c47908f6ef81d04da82acabb82557b1e35d830b8a1c37e8a61c90357d3979cb02882ee1c3bd4850851a22c42895ae912fd09bee1bd632174c256d9355f37b9fd94ac44757eff351ea521e48343222af386578c4c521cfd4ce716b6ff11b932a66d84602a594b619f7e3755097faa2a808b3797490a135c7740856ce3f2fbe8b9fda3bf8e4453e263e3a21cecbd674afaed246d22e723290493633a78a6f0d5890c5d3a7de7103da6c51f358c17d00f53da9b619030153b68dd4e1a75454497597c553c56b8c774f783d6686c6e78ef32a4b52b9cecf76275831dfb3e31e6ccf498e114e04a7f73c6e3ba369a3ce948d9f28e92deaee53081a7c9cc77623286dc7402a218f5bd4cd39a5f7eb31165505de3a5e7f8bdc9b65980e6c80f514007487353812fca0bcf7643c725b1aeaff121f7f6586504e0f89133625d99027817e811db7af59600b85003520d8134994fa80f415355923e47a420ec75a14eb98fc09c7904b41d3294d0583765659f36000bd1e4aa4c9b43461ad8d74a4d8392f92a42712a2519382f91a06c2a71f18f8cb3fb497c1f30f90a95d2155250c55f22428a6da50ead3e8328d7a7c106c7b997d68335cf559e0e316615890416742f20574f68972915772681eff28a185c574b5a1499e11ebfc911c9e5e44608cb0ee89d80f84881164cf3ac55b721de9e59e6a6f793cfdd6ff91515a1453f607d9b58d56053fb115a894047b8052b29daab9a2de5ddebe9ef31ed2a7fb62cf68c7ea9f93bdd154be0e832d81c7c845e74068a51412f0cf81357365cb18952c4558a713fe16a718c9ae7f2a9fb08e41fa26132bafdafd77e43410340fae188fe8bafa95b02104f8f3a859b31d4aaed17f926bef966da9f7be067efa70174d3576848bf463f9b847c3279bc2bc79828464333843b417642a3bdd8e50a8894418fc2bb84d505d2c771a4038104b0b35f3f219e8934a00f13b27e07941c45c4f4b72b5b3a8b37c7fdcee0da29c93dbe976e7509075cf90d28d3d9be8191520ae7c49b56419b34014a37f8ccbaffe010a823a1c44085f181b27fc5c36ce6d8fbcf84291cbd3f5753abfdfac1605ad11418836a5db74cb1f64dc774645aa2e80110bd591336cd5d3fa9088af76a8beea86c7beecf1bbef853128d92f29f67b28d690ee0f18c1c4bc931b6744b8c53e244914f5acc95d35165148fc4489488c710ce7db58511b2262ccd38846dac657fde39b3a5ca310c7fd57044f4551b42d52d4d090930360bc61a337053e7afae74974013f7a3fd3500a027f52246a45052b25e479f44cdc42e89eb06e23875012dcca4d517f0d7dd2023c8b9666e47c643cf569aa475ebd115a19e990171e93ef85782f906486c402251a2f7aaead80faf3f59e510026ca64403ee6017701260dcd173cc6fe05114cbb39ee85218a23486ae24a3b71ccc22fffb14a7d8b73ceaf8a7742d122472143405685379c52ba949aff9e4a3276183a600b4fbe36ee3b32b8d9bfdd636b894fc3a40d98f09ae14be288a302532910bde5a6556c70ffacd8e9d08cce3174f20655676cccd4c595207a6228c751635507087ec0020fd312e1298a257974636dca914e1697aaee7201aca8cdb605e793b1431ea302fb038c24dfdf980c33b794416fc57789517cb20b642dd1b1fdd4de3cc581fe093102d4dfddaf3cd08eb710e08814aaa078bf0e490a8c315d6768419a3ffb73ca0dd0c8d795c70940e77adc725180cdb351293bde6f91d7f7e328e9fec608e54c2c4694f151624040abe13317b89429f27553a2293d1a10eff20093302e965ac749ff0d6a08c1ef4c94eaab378d77087cbe0bbd67197add8142f937b1937b7d0e61a784129276854590734ba1d8ee139f767d7fd038a5a9b7bb98b733fdb4adff519f6a843fa1c8439cc1d66e2a558b9a0dbf1104bb5dcf195db1806d66a109c085fa6b0e79627401d25458db0f7ae9179ebf6e05abe00a51242069411c33c19f129b6172a0d0184726e7297cfb8ece9e7912f0188a763830ebe3e9860e4a567a39ea118b10c89ebe282efbad49c58538b01e8a339c18e3e3db4829ee5a0c3f955846052e82927490140f0312894168c7213bac4cee6dc8d0b6478ccdca4086aba53bc0d579ed6b998d62f6df0c730c30fd8fc13aba0d606b48ad1d55e5046e6ba09252379b14a96bab3a28699e2892fdd12d8b890b7289ea8200d31f18d2f898181ef1b86a0cb2876bfea134f616663bf5325a213b69b3c7f7e71d9f8650b9e1ab2e351004821567fd878bd3bd184aaa4c15293f72683649e8866496488b8531be7c6f0810563a7285a744404352a94bbaf1044796c8faf53dcba1bc007751cde97f81838fef67905aa302b5e79a8961175595616d0292f3a451775314977f6c986cfdb160f4da559066c2746fe5b3b88feddceeba21fe0b0b3cae484746410006bbd485120c08b2b636f2595c909a50745d860cd2edfba7dddfcd6048baf459feafda4365780df1b4682378aee995385f1dcac79c5277b691dbb3d76058e1a5b237b1f8f5ca0876a061b6f7c86a8ebf32bead4a74eacb9de75a9ae11ea5dbfcbf3db725550916e2c845ea43d490dcc9baeb23ec9d0db0656dc6701f4b71739c1fd88d70000221b09023a8f00f6a5e975e4f3547ad132056c7d8a1d5672a8afbde412ef3a510755d04c7df16ef8be4989eca9271837af6fae164751efe70c50de7d43e270304500e3152af6db807abf7b2c8150e9d5e0baca3a55688dfe658ac8533e09d0d58d85ef5c5b850c3e6d60d28ab27243bc1e15520d25a9da6760f13a3ef1544a866fce43aaf32c4cadc1923c11a765d091804265ea12463d30da55956b11f0db2318e8fe05e2952a540637c04352888f55aec8f893ebc9dd306efff2c7dec4464503983886beb8a572f51e8fc66ab9b586b25db53baf71408fe99332e0deec31e3644b3758ec90808f0861d8034a4584ba8c5e67f76ff686b8c203c55c242c2369e9671741d76d663fa61af2be2ed046f40db2e4aa9dd958d8e8cb2f7afd2c9cebd241330815a7268e4254d676d3c5db5575fd0fbfdd2744736fc3436df7e1d1e9eaa399a4891632824fc957bfd9c10669c3bfd676182f519d919fe507bfc428d8fe60dde7466a0f587560c8dc4140cc61ab9c9937555c8cb301863018c3978d17055268b29da1eb20b4dc1450ae972cec300bdbaebddc3278d650855e1d8dd0b6d8610310434c0419ec46358b06d4d5cc08328d63d6ac84db707a5bd86ea269e6f94d132da82b58f859e8225783834561209a8709b6aa5a27018a0a3d34dbcb1bdce30d6977e2789d971ff2542a73c6c760362db0c81d1ea95e8ee7315598d542f6971c3cf416cf5474a1e27c8425ed0f62de301d4e9ede8028f5258fae8d0117e8e4668a9e8721f70a28d648a898adb442cbb72e054745a1b3e556f8f7e81ddab1d5a5183b4da94678eff234a2880164ee9d431ac2bde463483bc8e4f23cb49daef111300b2fc5ec3034d9e14c86adcd107e1bc0de7fcc5d4b93c820ebd15b475df795c89bd226db911a7a8af47c39c3fc74a19cd90afecfb3599b7c467081c35be855faabf57ab325176859cc549d994ca015826df03b65fcfe329fb345fcc546564430dd26690104db4e18f5af0f27c2c12ec9e00e84743a4c6035c5eb92294ebc1f6c23acedcf0d5ebc63d60c2b1fcb06652ed0174d1d04b690f06e54307451a2bcebfd380c7d7c067971ce82f6fb6dcf83bd8b75b56b28cf75d9d366a7e3180498fb3d8e0a19549915fdacb49b2d9668080c66a39938ec03b216287e6257264b5cbcd3b06d239922715ef4f27854d50267c6917941595475356390aea8a599d12335eb0748786cc185fe1517e8b3b2ed7d3c21f1c29b04fe6ea517529f24ad21640778f7a9eab3f0fea616cf42840a4afed4cf206e282bd20669b34bbb3ffb734b8cd15b99e7f2156514c10cdd68393bda353656aeccd4cc25ecbfa7846d93544c706100d99e608c893446a539f0e6f67af09ab86516877add7c2c6c30c71bac4b350e15aa223706179a00512a03894d0971d5e9aeeca87cb2ff352c69b419f4b6089fe2d52e03b9bcca29155acac9ecd608b874bb5c9e1cdf0929859b093aa4973a13a854f42d13591de83466cb14b8ce78610481e36a127350f229aa1dcc6c51c69cae2608403839db39dca81beaf2ef539b04fe4fdaa6d51b032cfed26d54d1ad41a0a90a96d8953a8a6d2db73eca24d58a6ad0d3a2c8031a5417b948fce5e9a62e7744ebfd21406fb1312c9372a2ca91d37f708862fd165d74bd07c7c9cae4cb0426ef0beb4192ed1d6219a463dc892a0071dfe6c288ad01954148857972529d3c90579e656c796a34d11e8c3c0e14849060a1006cb591d63f5f892dea79795462dc7b9dd2b6f1932e075cf067ea587e2a258e2a783bd35962578c676dca10c898ca9845e25ca59379dc51947e52d33782edfa0a965b88259afa3371b84e6850b3ba2a0dd91c09dd8c008c147d16786a3ccc5560831aaa5a0a323ea6edd9c7cc7948365665802daa0c4b5c3c32d49c78f7ff21a873d23fd540cb76c6c39f03c0fb053321a59b06f068d5e36031612f562e1864ac1147f81ec9d17182c63f59808b9880bbedd0726289f5242c6cae2831364e7d06dc0670a83cfb3b169104b5a895647c24b5ae35f568c05c70e862080135834daf55a70b0cce98f9e86b1ece88aa107cd6cbbe19454c328013bae1907a917138253abab253a960f325375aa1b7ba0148f25b2f028ebeacdac7346d41794dde2bb9681fcd158519714818a40516a0c25bff78133f49409e647df1a0299d635c222608a51e01e63307d57ac446adbd19ea799c8433f87f643db3656d9b8c341500242c2151c5824d86002bfb1e27c81c3d59b4d5007516ff7efe404a4b0e372055c1c4963c5025e2920a790cd75cfc11032d8a8390c03f995e6c0616086c7d609dd5b3cf82082958984f113567d2ebe441a3683d5b6dc051b8659c355ed81dcaca1ca33bb0519e079ebeb3f148e7798f7452d299916aabb973dcd10ff05bcaf0406a06c941460110dbf1ff20bc2a5f11014cf3a7a542b11297cbb5a24d7065ffae2776e7c4f46f30e3cce31a4288a1bdb9542eec807dcd457e7384d24684d88a321270a8dd86c2e824eba0f3ba65c0901322821f0a86b3c7ac7acfaebbbcd22d415cf114bab55b0e63649710b9d79e72ce40e3d2d9a523111fd1bbab04ce0287c6fb0990ffdbef20909bf613b55cf50055bd88c506219b85ee33ddcac408376fa9a06ab1419e35481131adcab03fd74b9781ba6b2deba5fd8e256de8db69bc3cdd6ba759e6777a421790a7cf20e3b6756acb47dc18a15606801428840f21d9add54fdf5f11dde5bde80836ffedf4bb3e07d4690394d8ef25cb2c845270b0362e8eef27c11c045ef48a343452163f202ba66c8b17047ad2d5b0a5e0d639fc2a591251057719180aa7b2301f79e4078ca93f4bef6d643e5c2335ce6ea3e073f7b81f6e9edbe5f60c97b1bd9030d6e618387bc9edf2768ac8dfa92878ccfd3e91b9d3342dbb80862d194187daae658d75967baf56f1692373eb058d73116c0204524c46832a3a51d300c01fec3b6fa87be570a0e7ed31126e24d65b2dd247170ffedd7f482389a4600b9ef59ba68f26a277df03ef4d91e0954d22e5a8f7d6a97d34c029ab2eb64504f52d577d9c5032e0a08199f513fe14ee108a5abdae2e70f2ef43d658b98df723bf46a8e98fbbd7f31eefda40c634f914a3134204c0016128da1faf0581edbd66b3580ca6e9d8b517b5b778614edc8db84636cc4a975601aafd69dc5ba6621750c9d6a9cdbb00a3198c77a527737d32c63a36160ce53aaf19e05f40b41274f3934f0d1a6740419fc2f118570e8138e31238052d9fc21a7ebc3e5a37ee8598c813af7a8bb7f349360886c1fe53640235381b5ad1342044242fdc103f1ca505ce1f9c5c2062a183c8c40b1debf95736cd05165a5ca58a44fd8a5bfcca4b920c5d71cb8de5eb0070527f0ba69bb5c7724e9cb84aa7a8dde15e671f459e8e4472442120a1644889407d1005b4a302cce5821895423c6aa782ee7b96dfcb6cf568ba0b5956ce70850b7276d7340a83be54a29d7b6c60e016009fdbe3d9ad14c3eb9cb0230e2f0c18b74bfd91f3791aa65f88fddf492ec835e001a4a68f7882351c4058f76e9bd14e67ed0bb64da3ab2f91053840413b322e42b604af8435dc59d4e413547ec7ad091184e7e0c45672bc6d7ee08bc665575101d5cd92cbbaee30cab7a6e34598089d2cee829adccb1ff1fbe4a8929d23c237e61ed34c90398bc9ff8f42a5588962b9e61198d1a288df7901e2e6f37aa6979bf5de7efd239a21c58a1c7d8c6653f245738643107799d10095c8e6ff2f47d6e2db1bc87b498c52de49aac05868a6f87d7136cfd499e2df012997f3955464197219c39748f21068df950ff58756cdf3eb3aaf8ec612adbc2ac1c9f418ab27555c5a7663212cf9dea09caf728f71ab430cc2c556ac81d3dc4e649af93429e5c092aaed48315e6320c2874c250b5317835e51ff94d169dddc86728902f3deaa4822753556b4e1c9515052765f29317b0d659c82017fac9c8c3d6da0efb78187641b8b0e111e5112781822d1c2254d02d347c9d5754f7a53c00498806a998cc819381226a18b383932c778186fa22b8335d25e24ab8a862b93ac340ea42cfe8fa2a23628037e83ac484594c36841fe7aca72bdea8430efcecb8a983a3a2d99ba348f764a57c6ef2c24c876ec25e39c552f217a93aaadfd869512a9c47c06b8c371ab88f8d2ba72841cc6afb77d68f97138ac87cb4b19bf6b6a5edc10bbd1a99e9b866e11256d6fd4311ded2646946452d24fb14e48ce65a56286053a6e66f0d34ce6429a30b4066926bbcd8c75a7a02b9740f517eb7c0d11a1bb4a2595c0fcc598e96deebd1ca340f52902f5d9f02d2965b9a8691932e238a158b885d8244631421cd6e5d942924c646f15bf1c91d7b4d132336d717657b37a4f4969bbcf4101a7ce734f99ce25e3ceecbdae66964fead001abdfd241045e45c6c5b7859ae4701029f329014300b69f5a35a814a9fae448df2cda6aa4345e22167f012f017ef2b4840118a19b24dded57ab0db3a3561f9b62995ddef211a4da568ef532de2a79e666369c446d67081ef22df077ce14a123ccb37149a1569cbe9a756ac9dec917122681d79aa467a42f5cf273c74208c9c45a8119fd425ced7669ff1e3b1c633013d7775984fe7392a2dbb85c32e018f601cc97ebfcb29c98e07f3a257ad4dee3f80e993a2dcc8ebef62ebc6ccd8d9aaea892ced84ff5c97ecaa6595710a7b34fdf8a072322ccc4cba74187f302a0313ac4eeb6e1022269d67fdef04c441161e33bfb32cc20fd03eadf1f4f336e71438546446ec05b48d53990e7e535c4600206234ba9bb96d5610d05ab0018c68fef7bf22fcc62470a38b8d223f251ff3d9445cbc79507ccae53e84ba125d22474a9782c298f5ed73e42da99c5d33998e3d42146a443f185a0a83c64d459005d2d1a702fbe5df4550ad701b409c53d7f1382435c78a658f5d9a3ccb2170aa13da506d9af4b4c1c72ce5f7c6d02a5c043aa6746b2ac8658b81a12dfe6b1a49eae6772ebcf2a22064ee83882151f6a948d76c5836a27c64ab76a27d42b863213b6eb51bc6ab38bf6ca370bd4ecc82bc9edfe1b0ef70cc7cb778f8d3676f60fcc0ff60346fe4e541dbc5756f814b691215ac49204cbc3869b728887ba54754dc38371bddb90cba9c5e632cc2620103753ed7ac1788cac51a1c5cc55483001fb026ad868b6f3104ccb61bc95095453584b85c061abc97402451c16464df3d663af556b335b5f77d453431a236278eccbea0a49c0b9f64608001d4b501157ab43033bb90945484fa18d78abaeba36200b398da070fc1406a78709c30275e84d1deb33a3a104adc73200cbd694385a6497108a35641bc4b2d8055e497ca2dfd1e3778c9b70e8ae246507e8c62298042b7b03ce86940f618231763a589d149c1dff05fd96ce21da2116256b8f33e2de0dd6a49fc265d6a9d207499016ca6bd07683331685405d3077fc2e6c3420015f94fe3260f8b1b67ece083fd4de11b07b882f4d2946b7d994a53b8ecd2ba91333e106808c2f4fe5c88c59db8c223e6876c6d1878221e49ca6e2ba04d8b67549811b7620f4fa2fff5e5c852c1992feb88a3abb891af35988042bfdd86c6c17b3d18082252ccd8b0a2624aa1888081c5a09fea17f896e8caf2e13dd11300ac23b0312e845fd20b292811d2458e9e56b528b1c2f4917f41d86253d7158c6aca3a2bc4b5de3d5c9c80386a507195761ff0c636a01d7ffb38ab3ca69b5a05710fa20007843f11b054cc6c2ff9ff956812ab02f76945326cdfd470f978360998b221ac5e2736a7cf45e6dba774f20543e131dd1317df1d49de047b952122f12ba567dece9b705d1de1c6746ea92d18dc303c42c92358b2abe44429424a997a2e80f1e719de2f033da8ffc6aac96d2fa81a8ec5f78b2bf34d746cb3d727a656dd124c28bac8b1ba7124889efd562cf00d9a608a8d0ab04ec46fe83196d0ace26f554d86ef45726da394f099c0c8563bfc0c37519e6c79d25dfe578c4e35369ac71031e6e881b0c8eac4a8a2ff2b279e75700642f6e7c0963731495a002f540f469688d36e96ba58b70ef0ef4be43a28bb2de62c6669e59bd2acf02177d8cd9bf48b2e7ff33a92d6dc57a935a356d652281a26efc372e517b742d2deb07d55ff5d65a6c14124d092dd063b4bbc934bba4727d205232a1793d5aa1686ed48dcb45da0d31b28ed5d6266167f71f18de2bad2f443f4cdc9431ca4c30802e8b29afd80c6061d99ef2855b26b23ade968ff2c1538476273cd34adf5a98922f78b8bcb6f74cc9139903b13206fe566a3bc25420df18b0653ddee6a124b2e3bda30c2e210d522c14fd6d07f996345358edaef4e3b50845d57109151e118d99e275fa0fafb1f04d7ca243606ba1373a9912756d3edb205a236d426565a2ac2c1bea64c9e412685a1090b503f58b1dd946d54daaac76ec74c9c9b871e58e2044a04f75e97663d64aeb714d5365b563a74b4ec68d2b77043694ea21f25d8ec8320daa2d75aa403319ea12752356dc10968db531df33372847fe6d2a5cb12995abab2f699aac3d246e20a8fab1908547827e9c2e992204a607c6c307c375599ba18323bffa26ecf067b5267a414eda7c7fd7ce51e1e9e3a6959ecf112a47612776712f866309115a90600cd3cfeb581bcefd08372870c69939d1e49dfcf5f35647023247b226fa292d7c95be19903c72c23e90ee3cbd5917fdf0c6e03249cbfba3b09330252965ec034698ccf88e906665bf64480d8b0953069d16cb8581431579cf898db6ff1568c5da5e3cdb31636db757d1322f4627dd309135a88ed1d2eacc7a5047c51ca8578b9b50c3836e25448b8166af80506270c4217690c2cfbcecc025bd8f5d93d3862af0b43d0f3602e41b4905e6a187a6ebcfc3984943ac788a65d4a9605ba8e765a8693f2865499ad009616774607ffe31a86152cb77b4393c221754111fda029d097252bccf982c99533964a7c939c1e3c4d30afcf96efbb1c477fe4017c5c77fe7018f391bc5bebb484f29bc1873d869bfa1f143ea0a5a93783f1a63582781de66ae557b1a242687505cd582c7cf4696f0850782a44954f142e863747d0b5139c26cec8a342e6e63ac49cb52550515eba54ae65a228d89afec983ef4805d280b75a9be0a2a9aa47fef8558defb907e6700b799a2c7a5d9c3e044ea35df5464f0759160b2a79f47be0486647cf4fa6739c50894a998b2de6cc0c740a92c0d6fb63190cfb37b1642bfa38a82bb5eecc8c12a8e71809734b09bd173f6ae05e5dd66eee0e7914317769c095e1913c78f4d94b2e0372da27220088d92d6f12b2fcf561dda22d366b608a9168ba32d16f0370a494c3156a29b0ea0fa2dd6966ede432164b78b65a51412859caf0165c2f2f474fac3baec774033d67f5b8b103d05906934507930f8080b7ace89258e47118ad684a5406ab0315154f38b8f634f609fafcce7a4b6d304415b02539d51c25001b59bdacd439a116cf8a4ff3e28e036d6ed25f1f5f4ccf3b6f3976d670df5b9ab3b99a7a837e1d950a0a79701d871fcdf4960849bed9363ff9d009726703d18d22ad705086ee5503b85cf5ed469ae6ca5be275ea1a381bf7a193e853631732abfa0f049bae3b1d06303427cc7ee0599b2070ad5ed66c8a5b0c46c7d560f7e6b2291a4f39f832be131ea599ed8c34195f129658be1e5ab6fe75d201f522d91a73fd590dfc4718bb503fe50e2e322c219bfdc72b4a21223e9a233241d582a126968ee1125bb938868866f1af422f80214e882c48d3cb019cbe515264a4848c8bd2a5d5e46e207d72e1ff083d4ece33f6ac887e28d8be79fbdb06035c95b826c200034c191ae248e94f36b1f5253e9ae9433040d570818df4602d461a3186813fc6058ba4c8f3401b394dd1eb84e3bcee1b090f790e5c913c92e8f9b45d18a3224e6f6989330466c9a6bc58aa739cdc19e57b09c4a4a09a360e8e34f1c77671b71a382a1ff726e5303cc2865952d8851724a0da20bdef5c874e26d32740533775951fe42bb36efa0872e52d659548871d67f834af8451c6aa5fb1c6b791c702d036490dffb12a85b91fb5e14f5c237cbdeb0ef62a8c0ef9f469bc45450e2ab5a70f328b1b3afd694a824ea87ee9bfc3066747ca5a228536b8c3245c90c167d12815dd2d1a8b2bfb9d8d5e1f3ed606693d2affeebc37f770900227b8cb32ebcffbc9145db05200592c194ba40171b220f335b8765708e5e2c93389de47f836ad23642273bd405bf715fa37ba27d3a5708423ebce103c53d3fa2a1ccb89c8695b701a1ad096e6abcfeadf989fd964a2bbf4657aeafcf32084474057af9cb18a2f769e07cde2aca037985d9a202024128921917d9f7278b861699cad0a8e3d24df620c35c0885ac11b9b4900f745ab2057f592b24389869288bdd4ed72219579c51ac8f792fd97a9ee7f4ac3d3e06cc67eafa14744704b975236583673b43406fc39fd77b47e2cb5bda79b0fa3056de9c5c448b7fdc79f3d1f3cca7eca9e7e9c62f045a02f68550d3d861b703878bad0cacb528d9d82fb111dbd1960dfbc45b0dcf6401460aa55301356963d95270b2c8fc25b4c5be8162ed08c003f44a6434801b421cc4060e8d7276656dc670cef7347e6f3c5ac498cda2735a850275c8cec97a5a854cc94a1b765ef3bcf55f0cfa9d5bd4a921f86cf56210bde967de01362df7d7f4472e0635e243069e4ed5f447186ebc9ef98df37c081875f262d00ecb1389904988fee9810521195d25434f5cbf9e43df8eb04abe3a2869517eadae40141ff391e0af0826b04499cc6549c5f30ec45862baddc4559a9408b45b349567b503fddb48a1e8fe40f88e721b6718538ec0b4393084bcb895eff59fc8387e1c4baebc0e70204db0b2fc3b6280b5612f0626d554ec39cf036a10059583bd82768db71a8c4a93861e6c89e4a897af24790ee0434bcccd9c566b45dcb53eed95e6bea707d19b10655a7419440c368a8f96dbb0e702cd39a0ad63b70f01de51caf1a8ff11b324eaee9a9f4412b85c2bf24ba430f501ac93a0b923e4c2c2e73a141d23aa0e346ae4e4d040c35a0faadaa9b0ae79cf914e1a6e6abc5ab7fcb54a8fe55276a555ede50232d0b12d942d926e8acaa82990f5f961718772430878723cb6e5028e607d5fbace6684b5da4aa386520f56f4a54d05e035c988742e4dda8928490bbf78bfa50078b277e02d78ce01dff0cb6ba860b09471d776a7f18fa6f80469a76e30f336a3eff424354bfe04a3d5406ae952298d69885a0a224f4a9c0d80c289c748aab83259c23dd1e8df7de10c168011691d60fb16e2f16da096a2c2899f064b70fa732bce340589c53ce83e23fc7c109988b28e34f44346b6879d44ae196504ba27e41ff6440ce1939f4860e8aa9fd79c65f2665e22cbf4100c2bd3932fc1d8a2093a4019312027535fafbdeabb4c3749ac60a596389dcd9d960175fe130289ad89389c845bff40b85031177087da19bc01081b1a370543167a2b86776ea11772d16b6dcd51ec240588507eaee5db18ff1b72b88b232a764498dbbeffa33466002b49fe1448d564d0fa16023e5c43da3fe8f6adb57cd3d74c682922a886ce749ff59d1c2725a3dcaea658f140ab7aaf124ba52b2b5dac93af12a3312a5e4055b2d9ea6a5c2b3617ea5111bd7521624d66c3ddc56896a20092666dce2baeb0a3511e1e19013b275dea7bdf38f7f380a5808776e16a258146977fc880145dbc3f25e830bf292d80d4636b80a97a98d5efee894061e83053dbfc68c23556f56c7a28988af566a7abee9ce0ce5f59c3e05666fa9fa0856f5b0d90f9a005d295b4b307e840b05aff764481f2562a8056408944aae1ced81a2a608245188f100690ae231d9594481c4c1fd69c5d3631af392017af1b717dadc6997910b8516dac8813f9c1adbc68d8ebdf33de8f235091732f8e5bc857d87c37977d55c0e06888e4d2db52fa06960405b1790251a43f31339cddb084b1d3a8fd6f9db384132694a1d595386a756f0032c4666b9ad32715709215aaa390f927e6d2feee77d3c3a5c599dde4aa6ed4984fa0b6fce7ac74c01766717ba15ff2da874f4e9211e8520ab3cb758d0214b3039eb7f27d9f00439086e14878882c2049cc67106e04006e136208020165329c1378a5be4b53a0494ea254c5920407af25811d6ca08c852eba0979dd81a89c49fbdf508bef806df9bb01697a3a54147b530e6495b18f4c420c06d11658c740c931c71be018fe81731b446c30af6a86b2ebab25cc5b1b720ce910eefc6bb97585c60b80215c4ecf1b42237161563ff5f3e085e53c9b158a87e69d47a867193aea926a8cc41f35443412c74aaaadff00aceb09231e591676c8d8f2538d340b3b43d547832ed0e94a46bfbeaa125bea63ba3fc4a52c13def9abc50cc3f930f612c2737292633a9a11421dc04f23ce5cb721a4f1917c0ae80214ebc054c4d82c2868ae3d85b7b2884c238431ab7735d00f2aa0718cfcf83ae94b2555ef0d61eab89eabb8bac91b11ad349430101bf088f854810291ae27897b7067823e39fc439efa9a29d64ae9122e1d8d5db5a8a373903de01ec59f5a41cb2fc7e42037dac1ce3a14edd29cbad51e14c3f3fac2d98af37968dbec0dd89e267843920234a192a6f34350a271db09f54b6eceed6a46a6f6af24c02e29dff0740666a948ca8a81255308efb487e346a890506cb7cc342a2747e28178efc6147079b84cb763ca9636591e82197ac34b84f41b9f22446b4cad725a61f8141979696da6726cc7d4b5586ff68b75bd00500a3a076779c13e04f204d3991e4a38a3170a07cf3aad80cb276f7c1c4ab1c075c353c60fd803559324e8d7cf6d4dc05a574a71191b2437950813303c11315559a36eccd431518f3b8990540109047e4234fa08aa78c2339b2b430f05b16af818b1b7d290b92b6a6bbd984c8fa3fccdef4272e2476c12bcf2b75d7c6712ff6ea12b143f5f7342272107a827da768c5e0e56d13b1dd0d0b28b049421018683203fe07991d1f3a7f6f1d727fc17a34aeeee4bc02a276c6be9c243381a59d3472552e8e4a37794825f63ef2895341e1b21c8ca382750fc4e66f1ca2b40649a99d1b85a4c3c8a82dace15f0a2d3882b5258f99cf6fcc4260f19775c935d02d6e5cc5cea4021029b11b63cbc2bb605d3e17f9d13d5497efcdc449d368bdcf007dcfb164537f5a9c99f66a9f2d09266eac6c54e0f82b64c424896add2d32ef98fdf26b7a2bb934b69fd3001b43d0e435aa736dcba86d765719d56cbac09c5759a3d1337c11c9429e461426b218aeeda954bd21097b41e7edb17dc136b901ff5a54a0134dda4f6715b7b52b8cbc2a7fac4f4c433c6681b8535838ccdc92606b609acd3154e45c949d7e3d8ba592a59a12038939409a6a3b2dd868281f50fa28c6c353864d1592398f6375412dcada4c21cde38c0addb6fe7b7019d2189400640c8ff9677e319e99e643bbe7e77aeaa169982ddf41456d62bcca7003697f4cec0dde8a785e44805d4610ca42ae3814314a5965cd553fb21424d5ed06cdfb3a36ff278349d1740ab2d49c7a762d4899cb09af04a5da9afa15d2a1bed42cd22162aae34b1e08a2f124f9ca9fbd4134b7e4c9260e9597f781df921e3904d870c0c1488d77e9f313a7bcba54b19938d1dd275661a1f55a03e65706217aaab838868340cbde41a268da5cfe20172b9c1bcb06453d357b220632f6d44bd3a54e16f3b2036a824feddf80ceaffcf62f710b50f368d9fceb643b2004fc0b7422d7e8d6564ab303ee2d2af0902df0523f39818f5a8b345f1e0d7cc7f42be003c4afc57299cec29d591d38e5c0ccd57fc9b79916da9cf13814df1e8264d3b0a35edd6011a7a90f147894768dbaaba2e1da94a0e0bf7e3f59ae36d0686d3d7f599f1de590b6ec96c3b8ff9d34550e388fa7088757ff684df7a8758f7db2bb1c4654f9c4a7686a2ae7aeb4ab89aaadbcf7ed5763ab784b41028dadbe573e9d57e4917d713a43218ad96cbeecd41e8d424811eeb147bd42001fb7a55203ea1577011535701ff87d2d5dcda9e78c1c9354337b3307c3d74f68f4238e4cb809200166c3db6ba803de3fe64b0a5333c94b79d311d53bf4e5dcf877d12d3668ce81c15cae7fdd01d8708c91329d3497758d35b0f5ce578651f3d19824c8d67bd11a54e6ca31502f7194f0186dd18b38e78856cfbf86efbcfeef847bcd31301241c37124f97cf90435a0c05af30f3145239bfcfe4c7cecf6eb39faa7d303e716cfc5e80452dba5f4824ff2b63272029c5c2d9ec134a67c1220051296273b378d998a8371a5d72c9b858a31725011adae86459d1c11c5e827f1efbd352dfd77fbb6d34cf7993cc59d4ee40090c278ff5b3e987226d838283729496acfba464fe5d28aba4bdec4febe86c4672d86ac9efacd87fbc1654e6fdbaeff61e0a5d74f33ec8d173b06c75dec5ee5ce09c97f8192b659446089a8946d1b57d5a5fac464630576629915e8ed3dcb1152532da4f31d2f6cb2fd644ed10debb6fd809ea210a506f06f7d659f7ec03c248d5d9473bc140b9c4f767e8031268b6246d175469ca96b8c67a1be249abd846c1e3d7d1609231ba1012055de18669e88db1311b359e3f74f7a3cf3bc13bf11edbf6d1400c33283bb42c1c128434b3a2270c4d26ab20fcf0befe7b9686184b4a2b9e9c704af32f1742afd9ec8ca9b6624f8988a64af78c3bb46cf6fa6cd41ba2caff6fb05383d9d264400275ce99c79cd93e641c9846b4b2e670e48dc6baf225c3412784f0339bd940dac66a4db841abb38dcf635dba30f72de6b61a807962a03dab5c4425a897cdc651908248e75bfa5d11508b04590911cb27132ae9cb538e06a9c3979fcaf6fa96ec108ad98a0001412926080581bdc69ebf2d0b530e2484e3bf9616a8a98abfc3348b8147cbfd8f889200fb4d5132993e2f9df7acbb43700130df30b4a0f1e2dd9b6a1811bb22b085f0f7e173ba0cd9b30d513cd23e17d65df6dce706199ebf8411ac7be201b4f2944fceda7177c736dd7e21608236ffa7b1d74b229d1010d2e2f655ee120437e0c2ca4c0142a8209869e8fd8aa21ddcad63023766575d702c94e5609d843688dd07bffc884e263bfe74fa9a14c84c35bf45b24374e85a0168aa37ccf85dae61a3e64496c903d140cfedd1a0672de0c1d85a11f85bdc7c6bc7321030774c47ed708baadb0dcbf90b8d5925a1c480f2b7e4bbd8d2907b6167911b66985d6d7b38cefe77656072ab2556775853937527038453ec07470daf80e338b6857cd326c77f69e447f85b8aa3d5cc637f64965b615ae605f4c2843e162e9cbf73ef337f6c639a5ce1b542e2aae465f14e92e635b8d8d2b344fbc076cfdbb142f489d8da562c1ef7d6ebb03ceeaed07dff826e4a861cf29642fef5f105e48e0bf0f8a19b624c1052b8983a13f315f9e581a679f10fa1dfe952eb3a874d367f2ddd716f000e85913673d23175e24da7710b1ac4e94d1b1f72b426d84061d74b4cd70adf252c54b5c27c2856bed277b931322b439bb0296abc5e80af31017e3dfa8c1175e73fec872bee8de3fa513dbe2e4565b1635ecb232bd5c38804fe0d74f72e9e85c42a50bd54e3ee2f460d12a438b4e12c303abfda8f9ff29f2c207342fa2bb49721d652d71f9fd7e52c0fc25bdf2b9fb50d99a46e68c99845dc404d27cf0e6830d93a7acd9f11eb0689622b8adbb27fcb084f4156c7f4adc55570fb04214550c1b480118f5ec9aaed049f95f8e722a70e1fee0c6a5c8dd21024499539a11a32a870ce35f8e81f7681b035d6647bbb6565818de5943fabfa42e1652738a84e33001d4ed90efe0112d9ec2cd6f02db21c938eac60f81ecc840a974e21305c2b070646c220a439558af0f9217c59c3fe738c45459e694155ed8917b3ed2d7ad578798c39736c7481ccbdf3f8f910782394605e14f4bdd65e0398a462ec5c4587469f088f1683106f32c331635f91946c730d181d752d1f96621a2e83ae1803abb7d3393b2c7a0cc81d65bafaea84ff00540355cfe30c7bbe7cab3d3fa00b65f221b9a6adfaaff49406c679947d323e68649ae2847426953a7501357ffeeeb41b3277c56dda3fff92f6e7875e14d206fe52bab583435d5205b3fcd50c0afc16e0d5b7153ca5ecf6ad4857c54bc8f7b9cfc596ddcefe3df6dd3cc52e5bd4b9a6173fc245e9d23ac685752a18c87928204cfb6d4123aef3ff68c8487526948faf1b3978b67f10714e56c1888fa646991f4256932d9c9ad7daf41e94984266531f5092505c0474d1dc887c4582c39b27fef06674bd3d3abc59f46978f3dc256f86379702b856ebe6f8767bba25bd8762f92b4fe1a9c9950833b2042ac60003ada96917b40b5aed7c985d1bb4eaf77801bc7265ff5fd49b68cd4f07ffce3d231dc57ec1faa340d87d722a00db55bc6428e9fa5b5cbb5a9db391ac4aa5de941ccc994f1b0952f75eb16214d5e888c43a1dd7d6aec764605a1b0163f99ffa11f49be5bfd9fe38887f19ef75079eade0b65a7d447de5d63769d26cb4e24c440f4e9db4b1481c8bc71e75d55e46bfc8fcd1e48819cc01c4de18fc01fbb0bfc19636faf480c9063bfaad5d8cfcdc79bf423ecb41f4c37e6ba0e2941209166ddb1db304eb810a70714d66524fe49bb4ffcd048c3813cb2fc07034ebbe600e464902a1fc1351e3de7a2864b01f8b9c76f8f485267b7bc9ad842a05eb74e6757842c2f71b043936994d6827cdb5830e848995bf11180d28f4000e93bcbd2995d66748003fe8b1a084e85f20e482bc36cebcc24f8877e50fc4c68a2d039aa79c61c6912db31b506bb22142e1e0207add6d202dc91268d6c4532da305959c3d14e2eb6c423f36b468ca85c1e2d92d1079c10564b563da922a511bf0ec0a454d554134ef33091d115436e42856999fb9c28e43c68db38f5f0410c2d912cbd89309a5108915c4ed54304ddacaab05add9835f0535368d1927f452fb6772286945b2458ff1896fddcbeaa5d5c9ae220078cf4436cd69cfb545d236675fe25188d82e44552766c046997ef5f05a22d7d15fd3279fb10c635743a06789205ddef8b2b8a37a257959a4bb17bf2caf9baa3ccfc47926376909b809de9814b5eae3d13565f3cedc05358d648a5198a35ac2c081e53c44d1a7142d4dc154969dea4de9fecbcc67bac245b5753b6ca22dcea18d2568ad8075eec211c4511d8374f21ec121f5d9292a747f127ee456cbffdea020c168fd3bcfca563bfb8f0d409f098982503f3f3074db2c9f41249f8c4159d8f935af1a14f25d6d3f800c13d00f74b3be48e080610fe982067ca5ce914465ab670bdc779517db48320b9b09017f6960536091a8000b94026e4e9155f3e4d588025e2af9dfaa6a2254c560806a356988272fe449e67b7cc2616bd5d10324fe496560589b4d38856c9887d531b8ac14c48e0a53f54e586f1906a10aa764bf694ff585ca5687a2341c9690c2c516f64f84a7db1cbca590ddd7a0694bc634d2ecaa6756a716da873150c591cd33aa8d45780aff78b50e5000dceaa2ace8e9113c7a9b5d72fec63c3c7c2b4605010eb076428a209d612645de3529309210cde6d142c4949252930b216dd83bbc16b7e4640fd079f9858314ab96fbbd3588cdcb8b76799a2466010a85c3d0a4bf6c45e72d8bace70ee9d1a610cb88a1a1b88ae474faa1f70117f1039ad2fbc3420a7b50d0eaa4cd840976e92761f6bfba7f2e60008474492ae124fc359aadee1c31ce27759d55201f83822f87b8c323747e245b498ac47477dfb769a607bc0e46be0ef22c267da154e65465dbc07a37838c0c63a0f024995c633a399edc221b930835c67db20058a24d1679806ceffed8c83898e11dcfef8571c2bd60d3c27a6925056f56b06a805fd933e10ccc71341ba911878d03fe782475483c3cfb926c8fa8cf236a48711cac4a4c873103d7a0c9967a36c469ca44c12f6d0990b7241430256cb1b1b377845653ed8579ee64a00672df88c63220a04181b357795085c391dcef0a4ba75f1c3cf9bb22800459022e12744f4b61e42367e52ce0207ec5d6ca87b35279ef963effa3ed8e436dc2a0f90a690aeeaaa30ee44ff90d230709553ac4b31606cf1198ae21516ba84c460a68e370b892d6abe3d21f27d61454dd232bdc8bf14166e4b558bd1fe76dba97b3afe8cab119e43dfc601b8c03abe9f93d4269483a51e9e206ed0b76fa2a1e118c0b5225475cf05f5c246e5c8e44a1c7a0444f71c536ec1f5deb09fa0bdcbb6f7069a8ffae25a0a98c29972a1935fde518baebe353a670694b03ff6520c8b9103bdf1a781c0d3d1bcbcc79b9820bec64d02adf2ebb559a74229d95e3b995ce1f922086f0025dcb7e92ea9033176246537de8947e8a185340c355f98c10b0a363f076476e471675fd4d3d38e037fe4088101d7a387b0dea526f2979d45d8e0e67d467f52f2ab19cf0792daaa5bb7726de5d63821e6d041841566354b7142301f0869a084f406c8e622b51d6f3499185e87ed61f18eae44506a09d1ec35dd514393c6e163b857acb7119bd0519bd02eb4023ab319c47011e2ebedcb8176538ee48816b13928d65e6de3db676e6ea4359690df6b335b0ee7ac08232b98d3e5aa3cf576fc1b8feda8ad8c831d716b210683459e8049e1a1567cf31baa5aa0cd8e5be4e3c8e4df3dfc0425cf16496dba0b1046237cf7dba49102c4bbaa7cebc295bdd60f5f2784f1897e34dd4e333cf674b1cd55b9d3e313f19ed551a4bcc090d12e28dde0ed9030d7f250863c4fdd49fe3585fd417a7074622f8f24e0b84eb9ec89ea33bff012ee1b640c2fda3dda317b22f09b5e166c4ee2a6109642178bbace073867dd7946eaa6c2fb2730bd8f1e5b0919a17e4f6cb3a7c88d2a2715e0e3854a248378f6d0d01ac3f192936bdacbbfaf86ab91c03874bfdfcda69becc714cc4e8e02d790495b5f6f53a1ebee9e9f81126f4747c616d701f8df17d2a61c95e309f17b100204713d52484e262c2a1512ff8d7fb3a51381ea68695f4a5d1ac34047d2f5348425e6cd18a023fab3d9a9bf429c702674c508bdf1f797933abae37898cdb5f02107054f32d17679fd360c57ae4789432e05ade29db1a63bd6af8086df0f25254d4d2b3260f32db1ea26247a97e5f1a73042c00c2af929791bc980454a6631ad5241e0aec882896aad9f924cbfd1ef63621f8e07cd03726b0c1af08253266d844002d0d71263d6dce5b88cc098fd3c61eb16647d0663334f0ccd925482d63492f22794c2a23d23da0dfdf14676bd98274d538ee87b05ffbf1191bd8b37f1b502ca349d8a2aeab8dbf6c588b7df9ba6ee5147acddc68330c222b50626cf03b73a1936e93f0182ef57cf91ebc7270f84f9b8e4d2781e8c4d880c112ca6b02e51a11ca138a7bd702d268d8e42bd2549cc80965c6aa8e5987c649f91b546ece294cbdb5466b03a9aaa572bb189474a306190c431df962285e0e98d8da1263871c830786d30d66014cb17e5f9c410b9d50e19abc922126df64b44fbfafa9a55fda455f1558b6db06d5cc0a4f3c63f97f6198f30902b9ee72564f79c006c5de941ace858000b00f788212eecf59589e7a9a622717af157b291f9cc7a3efc23840214659403a9d428c69a7ce455fdc277f245ea391e368b51a98cf0d0e268c67d382da81837d3f4799b9cf5be02e1afcae6518983452a28ca34858c0bca67933a5f2fc127d756b0dd2e865c40395ec85c35cba80aee102edb1830a735b6f41ab1662e4dd5b03d6b8e1ecf1b655227a6ffa2b44b1c63ed8383ef149f1f4ef58b58a205761ab6a25763345e45274fee93f33951b28011b1f234af12892c921af9bb93f40fb38b535537df30daea8b3b7954e091fa41fc6cceb2c52501f303eed5c29f5bfa0609e69d24cb859086b662275c825085d7810c5f6624c9ba06c16a7c0a17ff1c0d5059628c43218b098bac392807c4fcb76ab20daa08a9335af518570ca2fdf00876034a2a81648d9b79f9371227345780f3d0ba465bb48f8a50bba1c7a63db8e156f90b37edb0e2c3085fe4825c6925f9a962b085960ee242bd7acfde1751334dc8a877e9f115d2a1ba2483c20c48087e4d20902375ba623b983a1c19b774cf6fd5ffd280624dc37c83f360bcc37d7a4ca1892d348f54a3322088ff67cec29f5f950c00ba7c794fd43d12f73d00ac38f306ba750d32577f74b960a41383d45f89675a684fbefe9a7ecad387410d76ae9e6f17bc4427c0bf862e94b5f91ec76412e74d280ff3c022b0da797868c00d08e8f069339b8351314570100670445b979a0dfbd92657e76c618b1f3baa8dcfed9608c74d903333c3b0bc8bbee996db50e9f2a22c389eb0dcfa0814b3f3babf40ec3e7a088a3d043c5ee3f5ff721386730445ebe4747c9e88286f5ff9a5e941ef2bb000a455501bba19fe735d3373e5cb970688021b84ca746ebcce4267e727542e6492ea764a4284e7c21c7a1154bb547c86dd58ea873f891a34e51b56f0a992a3ccbfa5acb3b5ad7f2df9ff6b9f2e5fee62e01b39f4d47e4ad73d2bdba1223def75bb9155e5cf0354a0e7d0cb3d242a37ba1c640b73ffdb620ec95696ee7cfc99928d8994fa2f8017175fa09e8c57334a7b631e1ea3f026eb457d25d922780279d07da0be597f891c9c7a9175c0a0c4965f314f0f5586f0199b1afb8606006afbd5e5af973bd7eb4b6492691599fb3a0ebe090c2c84f1195cab5964af7df13339fc558fe03f42ac0b7c2ac65c6b3775df838b68fadf41d757b71c82a0d0afb85792ed6e5e8d4e352a1b849f8a0579686af14fda476fb246501bd15c21bbed9b561c9d847ead42f18136b21f02b11fa4e01c9bbd4238ba9c88747804dde265a458929511fad9bdaa870a2006ee737240d5ecf08dcb4f53952922bd888417130643c03a3fc8aba17ff6eb7397cf9e4763a1de7139032a602f4f6deefd5a8a1c9ef1cab93d05a634589094389c930d341508a2df02a1db0aff298abf2348e53a2f7376598d45d3b52e6ce5085eef21429813533eb3a68f6c2800ad4b638d7f2fb4ed259149c038486a2616e1b905bb83347e266bc0a2bcdaeb465c793c7eb0174c8fa4db3cba4b203be3b88005504852ebb484e6de72339344af3d0e1341968711619ede4a55965a6b63ed59727b89ee34f36c8127a354f989465a4ef33e87ca5b7f849f6f95b746714cae28c5909610f1fe50df887899b06f45ae15278bce8ebb53d75ae4d567037313e69a18c5ef0c6ac5d5ebecb1a6ca9d644e00cd3d205f4071975c5a75ae7a7d49c82e4330432755165003f6940f1dc4769e652e3cc763619b8a9f9d0af08971ac4c584d1732ac535147f6de3b01b967380e92a4affb5f407d83ea32c3d9b9e66d1280f8142e24d857bc43fe8e4b9cc1bc237a6007fbc1f0ff48ee95fbddf748922bc4b4a0f392aa5d4dfe2f8893bd217c53412e6bd24cc8c1ace79a917de9024e0031abf428a5a3092b24a0774aa617e1b91213d28cad17924336a9311c1c8f70c4cd22b47045e65a70271c2fc5018567e3cf33e0a1359721d8e18c40e21ee26ff9bec0143b92dc90e8421a6848edc3e61396109a31149c8de9b6cb9a59429c9148c08a008af084c3f67337589ae281491c4a113605c3bf6a82ef59092be016a4d6fa2eea2b9ade91d95dc9882b25e4bcd39e7a494d22b9ed8620aad92447be89342af100ca5d3439756a644b1215ee194d4e82cba28827ae8bcdd2e855e374a81b01ef3a8972551e14b2f7a607c7bdfea04479ebdcf5f286a0a0d87e3d0d6b52dc6b8716fdf1e3711cb444cc4444c54d459ac4d34b22ca1be3979ad84d18ca68b384ab75ab5d54ae823968acd168227605e2b350ebb637aed851785aa0fb59dd25a572bf72eb10b121212121212121c1a1a1a824370e8058ac95dd241b34a57984fa983d695fbea88d2125397e88a42bba3c8a86f805ad1fba86f622b7a2345ef24f85b0f9822d215ad9d72da6058270fb2e009ede9ec8e01b62b5567ab7876cc6bb95dd41bd47d8c190d2d88fbd05f1fd237dcd2b1424dcf4cf711c1a8d117872a65b42a7d7a78027b3901d81dd073c0e6985eb39b764aa5ba55dfa0bc9c9e99ce51bad5aaad56d46379437a26077b8210fa98736beb0f756ed947c761cccb9a583507816d515f6e85cce722d5302a3caadf22e5b00d4324509604dacaac572bd579b08db3faa676ad7089e8312d9df64d0532e753e6ececfdb0671ea5dec2afa3e199e845f8d40a2ba0e4f21d63b72ec0c036fc51032fc00053bf158e24eac74222959676c7fce8d1736227a516801f3eb2784a164df49a15fc57c24724d80db01f54e85a503bfb76a99042af672043131831e39c724a0ca379950119c25a94a3c500bbfb06b6a0d1aaeb315dc33af82922ea0b30ec8e7e66eec17390455a496196115245c25e68d0a194d57ab54a67b9cc8470357d6b75e9ccf2a0333b4b764da8c354f697ebf9951a3d5a6550d78bd056662194e242d1d22fa7600f50760a7432e5173af4ef080b255ec085949bee197a43b18d3dc3321fad4cf1b5e92397cbc5a4b52ef3317e4e021bba7ba4d71e6afb07a4e6d7b1f5d9c3b311e83bdeb00e97611434ce3aa2aed333aad05626c69652ae1797392889da0d8181895dddec4526aa13d589fac9a1117e374775a27e957d865416c3c84008218410d2fcc0f13d274f0c5599c5109ea8d413d14909b3b8a8ae0f3df453d1d2facad9a7878359bca2592d51bf55d7309329455a8ef881094ac83798a87901480ec56116e7308b1d859cf839363407a762511286ebb5e40c2e3980f1c40e929ef8c28b126aad15935336520b38be554a3f072e925c192209d31e59b9a24675b435be37bbbd11ee921cea56a9189d4589d1103a94a194444329a535ac231d2924e950410eb0c856b522e4f40cd4302c070a27451f24012df5686372a2f43828e434a5b57609355cd41e9428c038e2c86b890d922061586c39651c8228d265aa5108b6608d186de286450b0b96388210c26ed8b1bb1bb61af5b56489ffbc9508829bb449bfbfb467588859ccd083aee9b1cf393d28c42c57d763467ec18520b6f9ea11261a4589553958909cc0c113b85f4f1151774708bb237e4bf15d05cce2834e40230db00de63ab816443ae6da9c3306b9942089b0c796fae6c237f00625fb0a22e9af1c01614592464a22a5b919326a52eff3d7c00b4098d59967ddaa67da574a56b0e0218986524a4b1822e8bf158d34903146116d8509841076c38eddddb08647b6654b0e1a7466b11015732618382d7b6173a4c888dbbccd14faf00d8cb3c3a0f217d92d0ccc82f17c501eb7791f0c3a791f3cc233eb7d9087c7a1625ea54c9106bd2dd5f614729885024e5ff1a012a6ef9ced733aac153684b23d1dcce21520dc97106b3c166dbbbbe1228959770f45c87ea134fa287b23db8baa905238f17032d3dde66c67d6bb2211881e2e8c59b01f54762d08faaeb3b74460548c1b514da4f743a4d5481b9822c491286ce8a0c3962d4cf0f36791b92589dc32c40c33892d425b74e0867e055a284184b444121bb43a8b1a900749d404c114cde092c39c73ce2b341d084929a534a32933830b217964860d6c88dee74068d1b890dbef0b082b804092e96e1684524a092504646bd2cd81a4e3285a901f1be407ffc2ddeef677b71b6e4435891fbd1f22adcdb102285c826c32df48600dea1791963d22f54d44ea5eadbe2378d41ecb30ea4721c7c2a92e12520b3cb3a27e1387a8f7d160de2723bd2b98237b38bced994f8693b61ab4202c4f090bf14acfb01bf50c47a266610594e3f0c6c54820e51c508bf37e384f79949340ca37ef67f394b73d138d863e02b0a5f97210802d9487d3659a9fbadd4ec9278fe252cf78675d1ca2b4d638d44b431d87881e63a3c2a3e83046473a74e94524a4e7d8dd64c298dba2ad0c16f33717e558587d7029fae79f45fd5652469de93cbd18fa40bfaa328c2ae3510ba1adccd6a1aae599238b46cb94a62c96e7d81007d7f0002619f06ebe2d84f04a951e236c69da7215a08e793f9d9400e659cf347b43c8ab427d22c070a890c28e5d05199ba119bb5b639d42075ac0947124d65585a9358629ca88c10896ca20628cd6c4a20335280d44a4aae042a36c43b767ba7d841be64f87dccef4393dc3a1f244afd3a52784031fd0cb989d08c33718d6c1f08c0f5374ffe86ffeee583fc6ecc0077ab9fa9f908be8f9f4b7f3c48e75071fb962d6c666231a659b15c518323364ee41a33793621b158a49323be73226312c4297589c5146e8b1dcbf1a1a14d8e6a391bfaf2563fc5753dd945276ea7d98d3cca8faefebb8f0d16747a17fbcc144fd366905d6f151e8fc5a1205550243e9a76bad9d2dd97559da1c7369ddd604d6c87c0db3a6438fd533d0bf392464844509299d4ca69377c9e943faa6f74ac7999302df680e63c4a4c4628c724e27a61fed8efd9945ad624af1733ea91273780406314b7a10df4c293c337d1a316b722ca8df1c9a43f387e99c6b9318e529d7686bcc8bc39aca07755f4c907ce69b6b736b52b96df3894fe752cdf17074f0c83cd37ca3b4c7467dcb9cba77facd53dd4fca69cf44c845605b5587caa28e79f4181618e50c5de52a4f869443df56749cf6a8c7a731d4dbd60e15f3a47f7ba4c2f4b6134b1c147d14c197bac4a4a48e51aa9215499c642e05201f2e3a4e6f2aa8df1ed9601293580ce6c529b72d6a2fd34f34a0abbc88355ee5a8203d30df5cd350beb17ff89722c62802cb6fce1971e46f3867db723ff6e8531eaa5339aac985fee80e75fd867f40601ee5eb2ef48bb7035de51aa773c355de87f21b5eca672a3a876aa36ade8ea3a13af828f8d3ceff867f34854239e57aa0b0d5633818d703dbc738dbbc1f9bd747a57cf86ff804f2aa1b9c639c0a2f1ccad7551d0fca0302f398d7d40e74cc6f7428c7e9da018189c13c1f9b7373ce39274cc7c3ce79733b9b73ae719b083bd4e93cec37fc637ff1f6f5e9f4a55b1df61baace3f3553a99437d72385eafc51aef2e9afa15428ca36289408421585e23a76981d76ce511d8dd1e15ce59cab5c53752fde07f42fa8eeeb71c355dd77c3f3b19b23e5bb3950aed2fca5abaeeaf653dd324b55bd189d946f8ef20de5619b77ea3e208e751fcc32a5e0a6820d4a7737d35537abd9611af3a8d6a575ebf6511e6cb350eab76a1c4ed374ca2da600f4537a5b022e5cb468b9e28a2953a0405161f1c597be2f1630794a1bae8cec403bd4a40acbe9acb3c7b33ebfe9995c20cb799ffbf60ef7dbbcc8b3be0f6117a3037d73e8db0ff8a76c6ad1e3598f1fabb0db06e4633f65de0764fb9353c7e9930e3fa45eedb8cdfb36f6930aeb1bcab554ac5eddb66e761f109f5307647b76ca33d4e35957817d3d9eeeeb3e94c3ad8b9d4d744edb3c7a86ea806c1d8fe6a76da3bf798ae3bc75aea3b183fe387dea787a7e3eba07c4e7f903ea6920fd9cf631d1d3615f5f6757a24d51a5d1d123cfb42f26e56504959fd37b19e104f2320a07e519f6866c682bf34188d337d25b01097895b6eaac1bc6183d86defeceb4677b845391a8dd903992400b809300b460d78db48c623395e2ee6ed6cc047e678486ec3025a594187876d811024101e109664c1b8b53ca19b1ee1333330b76fb535aeb6ab5cc98195ab61bb91ba646b9cd28753e8c52e5c328353e8c527be3d2a87046a9fcf0895f9f5166a4ddd8ee94bb72eb9e3015e6868e2865948d6d5aefeeeeeec6651d6cb3bb3bc2aa68a8d0a1ffd03ea6b1313bdab7c34fc90032cd53d215252424e8332fbb09fca9e3ec6308b87bd961e09bd3f1294fb1e3635b7a0bb6a5b7605b7acb9678dab2269c1a42084f9a7642631d6e292456274206030486ca19b19326671ca2719133f622edc629e1102aa7f78da0a4952841ead5aad69dde1e4fd33739bd330e8561534eef9336b5cfbab7300540076d653e86dc5102203275795e9a734ecc0df0944f425ec77bda5de03bc6e8410a02cc4dd093e945684b6b180db8a0f44277fd116be14aec50c0492187870e1d0dbb22abd6131f1898b48ed704e9530498469999e132c6365162372808d94bb6b134f793b6c1ddb1be9ab6a5321d7bc339c6751b06e429cc538c528a514a378ed6ac0e9508d9d6ad9ad49ef1018661189665aea15c877abc39a46319e51a36d531a4593dc419ebc26ddd42cc211c629f1e1f0d351c3aea1bb844eb6a846f043e499f06f8ee5878adeb9d91be71da83e075e863de777781e7381d87cba84c85ec3f229f79fcf54bc828b6a1190a84d4465320681995d13316c10ced1413816d01b54ede4f4d1023106afd10010105d3dbbb1d73acbd186f72f288b4ab7572a00722025f2045124aad939fbc2751fa6c5dd3df9e7e355dcf0fc3e6a4d8571c5615864184a46da82f6df01635c5032cb5febe9a70c1d4a4063c54eef7d5e4a8891111486d68abd85287c45831c6183fd6a7432b82e346d96677777777b7fb84a451b6a1bd4420106488146ba8500d6e11c5a9391be615223cbb74df5ae8411714fc8046941ca48cb1640c09a3d4cf1fa29054978950b003ac48d9d2860a5c261012030a5356bfa8d091787ea6b436f9b0c51736e80088334ed0ea3090c0a1bb9bbe20a91b01941c81e46a4167f54d74b95a4c943cd33d0dd1496de4c43a7619814b23dd81127d31317243dd811011af1520fd573d7221b79da82fbf2f14f0f09ffb58c1d16be8f5f1f7c5840c160c71611e6481195d7469615e4c04b685438abaad05249921a9b52dcc3b729432c68ea74f8e9159465e8c7da02d9118205a4f6276244f8c0ef4e97ae8c5fc80de936a6ac23ce9fbd1fb814994e0a0a84564a3c20852eb09bbfbfcece86f5f4d47e33ad2a503fd5ce35590f91ef81fd85e7a9fcf03d97e42a008590dc802d886d041156933f32085183df801102e2e39a061e386088a31c6486536332c8b3176370c1c6ed472066aa5a466a9e663091638609283273518b18325519c8ad4954dc418230a445dc808b2d274448c565cfa88c56da93290186162ec668a54aa00be00e30545d460a305556cd0410fe4532206e8f0248729a21c9d40098c2a3d6c8143105d6cb0450d72b0044bed618c16dc50832c3cc021888a1863b442250908299608b1c40f5a518b0da2c7d50ab6be15b3b8ae927e68a992c49325429441462b7ef1d15d004b50c9c33653c48551bf5a5732090b005b2ac30831daa872021c96064b5440250f9c095054a1a2c90a2a6db0e1c5921c52d3638c3156017cec5254d44690133182a0a18b25357ca41f638cb18ccaec2b3e025612769e9c208b264aa8a00a1fb4a2d2c72dd9d2487730f30eed7a28a5acd2576c03f372065cda28030823485f44d1925cbc94524a295df22e0e37925869a66559b6b03765f43055f4d0a51add9b72f270775344cc82f1068d62bdbb1bb320f30cb4edfe7c626c19658cdc2ea8f1e1f3f6e030ebb1bb796477c75fff81a7b1eaeef689dfc415c3026c49872de9096d2de931edf0637452df9efa2622e86623c2ea28df343f39855107ce94d6ba5a19618d04000fc6bbe1bd781f5579d5fb683c94d7488dc494791f126ca49ee2b1ea436d26368227b0d74c1c83dd01bd3683099ef0e27a5e622116da1c049fde4eac4d4cc1b2a64f10bc665af9900894ae6a0d61b532dabc78b444ebca63580801040fc1b7154227030d21f8ca7f565e0c0b20f8ca579e0c2b07c1b7f51382afbccaad10021008dd9339271324824444908808120de9d2a54b972e5d90b627b6483da4f5d0a987568ecd0fa1ebd1d03efafad67cc67372b83e75a853084f1ae47c6429f8dac933d7bec6e1ac8b272199c34e08fc2c8bdd28e8f5f4c7f8e8870e3ddf1cebf06997793cb4876e56dbbd0c6ab4fba8c3d34f6c864b03fd73005013bf4b037fbed93315baa7bf7550dbb93dc743eca737c5e5fa03fc34426b551795473a09ffc9fd231bd81d416abec93ad082e1d077bde90515c9d19a2e74a305817c4d0e56089a2a2eea078fe4e0a3ffacd79ef1c10f30080206454ad0355734620443d0b064895650911c2de842375aeb4145b885b910038418d0fa792201e83f2bf8cf139c9e8912980ebd1ff76a66f68c1ba46842861645747183d6b616a8072a4b2449e2c495176c69d5b8cbd58247d886048844086d77c7579372787a192311f9c5474f7e138b8e791f98de371d48bb80e9a5f781a50289f7fd7cf4ee960a12fcf49a508dc87fd05b3a10a01f7e7e600141471f582a44f0717a1f582d2fbd2422261060e589e84961f2387e5f528a7c939f7522a9a6a6a61f5a591317085bb8a0861db85c2dd8d34d4ddfc425001d56c08392203e30ac966fe2428095275c4216107434c4b5542069ad7f2278f9ed2b064cbc0ffc2634ac9656b6decf3a910f2411228b19d670b95ad473057dbc1ebb76e658408015279a585075b105116dd4d0d4d45ac7e16626b48e11428c4a59a59c3ca50ebf629684dc945976747b8db7b3a6b767d3e96cef5508bb838d704c4ccc019bb19374732c93a1adaf4c94bb037e09cc92def435fd519516f5e452328bba741dbbc3370775e95a577986ced010be6f563c435dfa6a9542d81dd4fbf715650dd8f4fb8a42e571308bc6603198b7af18d4f0fb8ac10cbfea899fc9cdb1bedc941ecf1e2121bbe89b23fa2f71c5b777e47a8604d13083eb7bbe10fc808da69f1e03d04f2f06e934888619be07367d43be77a8f70df9f6e83ea6e3740f6c7ac8e3f5fc3c141ae61ae47a68beb974da71bebbc3c7e9bfcd355fce07751efad1df57942e2f391f1d3bd7513f75f0352dcb9ceba0f765ecdab6fd38bd6bdd8683bab9e6271d9a2db7c39eb9dc60a7207a8d8c46a224bd741c7cc32dc983e50cda2e2fc30d683b551bb3605c283ac6184f6c457330cc7960519c3ce616e09bd8c2f60a8603760467f018ff4a8ac73019ac8bf62565e93ffabda8a0f20d24c2000bd778201a3132b2695fd51c6d01e044dd881e3660512030e44f6b677a761a1e46de3728f45c962071e58c2476288118ad0541d5aa57fd58cf3a584643cf4ec3a3b20ddf00bdedf76524f4d15bb9b4555951792b80b62a1a54f60de583f6fb8201122130183222c60d58ca38d2da4d83de4c99dba9f2e93f611a9665de97f9c933ac2eb320f72316f993633efd996346bcb53cc3c2f1d0fba637840df0911bb753153977f83edd322f8368574551a1ea553ffa301052c2e8d971ac3a551415fa7e0cdab2a6ed06d401d897124457bc92284ac5448750464f077a7b4fbc92500205e9f7c5098c1e0860ec61d42864c0c90f4db7e559af87884371f2fb8272e40ff0fb4242e95b9b33667a3ee04f9f1e5c9998024d6554dbbff628f6c7f65aaa699493bddd210f0e3ba1adeaa84291f2ebebd0a35a4aa5446d67ef21f25103da7277ecd81d7b3b24da2b1244df0ed38dc67f25380f7be465d6c61bf47dbdc08917997d80db74e1bba220ba94f1d7ab3dac9cb5757167a0f730e6a0053d816e027bf5a2fa9682faf9c4df15a633909af71acc8f68427d769f3f4b6f639650ddb7404ed1d1b3a740bdeb55fadd8db0a6678ba8305bb7db65ed42f71468968ae9fa582c9a12a447169b50c45b352cf69a086553ad82d6d414113d7b094199535f19a8847645bc0589d80476ae8d4ad40d95b00d1326cc824ca093d75e503fa8843d9554bf1a244d34cc7938cc8a465a370e01a27e955b52bf652a42b2316d4a2449211798569080962526289552a9700ca6a54ea24195439b23074b24423da3833b499ee192429b245dcc4a5aa4a567cf4941090f91899138894d60a74a4c51a1d720d5442566b1d7c4259c236a4a98d2ad2e3ab16822d30c2e5c69e188a367b700dd7068d923081de63ca9df5e6961db6582a3d905613e2b8cfbc4bab588b7566c023b8c41fdea3b0a490daa954de0f582c8f789dfb07a9f4ffcac04ab0a441cae71d61144cf4e53c2dc66dced086bc2751c718445c32308eb6ad80436817d865159417a481cd0e9f41ca408a30b1c39599a60ae35d763195b0c426f023359abf9adb085fcc1158e0a23d178b5600c1db22847070f2a911d070e29b3bb553231ab4b0a881f2a0bc2d40cea278b92aa2cd291c434059cf43113ec2ba934ea57c3f4ec3525c8246ac4aaa80546cf364026506098a8ae60188989d80812b11154c2529e8f20938e8b986806f563a2e7222276c22c864f8a8a889c1071511b1509f30f4c98c8c90fea47e936a920ad742879761e39292c96e9b1db6716e621b942920a3d8af342c7cf35cc4a6185169a2687fab158d3a361b842ad51bffa304c720bd7ab0541cffe13e42dea4866c3ee863de59c73cee96d11baa8a81f4d45513f9a861654c45bf19b496fc4261cb109ec5a52fd5849ca89da37d1a1111321b1cdc74a58c918cfce4ca2919448859d3c1b3d339192cdc1117ad1281a454f2a39f550bf6af4ec156626c519d4ad3032dbaafa50bf45cab951bf4a030db67808b338fac41f66b1c3e033e427002ba55a9f4c797618187c60108e67df18638c314a28e184134e082374c9d2fba0eb8759437ca0d40f2a2969e11b67a71b354283ad95493551e1100f7d50e808dd70401e506c547676fd0787bc5f49a4fc3a5b81a343c7131e9e9dc74e89be322c19d826b0a3aa54766e2d3a287d12f4ecdb0a070dcc93f622de92f11444f462dab7b5714c3b76838f257950d99738597a76af4e7e7836628de7163719ffc9b467516a71d097d8a608e97df86388df039bdec52c2d278b96d6e0c65c987e3f478b2e6cb33388e28adfcfc9a2856dda7b0662ba6cad250ed6c719a7cc50d841470db31a43f2c3365ff588f930d6b1bc65e6ec7a523f7db5dabc97d4d8421a6314d8867a7bce0a19cd4e5e4c4665c7ca82a8fbb125c336b1318c7760535353d357f7619f3fbbc6ed1f909a9f1e338fe0a5898d9362f41eae547b77d460139bd8cb17f5f3c7b04a23837985594d39d5f081032a2cb9c22c960ab38a31c62cde4594527a1370ce1e2f58d46ff57385c365586c237dcec520c4e04ca2588c27c7783067ff302f46078b1e0cb328a594524a29cdb21a25b428a5d71bd4cf5d86153b1c48754ef9c5164cde005dac2c6591f270b5f0a28e10970b16b4baba808ccc92f14afdea4b293bcaa0bd5851bfd41603d07eecc31ffcf0258b0a7d13d01bbda2b24399a680b632cbbd64a9317a94892a6471f232bf2f2c4753623a9f8cccda972a2a92166b542318a3d949731b5f969481eec2d6ad706840eb60366c57839d84b6329f4402a930513948f476168d37bb4ae09b9337b71337f827efc3d1dc4a8b351aa34d527e4a79ec7a88b81eeb242abd91fc4f1e9d4f5eccc9a5b73177f228758eeb388f5d2761596a2eae23434c8aa4205da13406dbb00c621bee829e6c5ec45b4f62e476a647eff35e730a9f71f0c3f796713b3dc5fb60bc4662d6675c9552bf3e624e8783fcd83f39aae3e7b41dde91e1b5cd7bf322b733bd9ee27d42e07f90761007479e1de31e001ba98acdd18d24172e941215fb0a66c910bd17283ac906896df691d0245e827809e285e9b5059417265e98883ea4008508ca10528e1841e4c3f6cbd0b2e6943d30b833a317d9891d7c384a1fce52b3038fc8232e8f57094d59f290a86655695c464ba2464182e8618d3da12c56c41c3616a374ea75e84f5696bc942ec3f23e2035ee2ea3050eff794d0ab495d96ee6c7e3776f686bfd8505172c8ebc1c8931768c5e833e3acccb8a093ebee0305f5998f1a7df57164b49af2b5dae1c791941dd5716575e5908bdb2487a5de1a1ca1afc92c38b119fee7e318205dbd699b933aa30fdd8871042086143f6cdc155945e55b4782aa83c57c1e2d779febeaa24fd0aa631c60beb3c82d7e1bfed049a2a8a7d5181e5c515b39e03807e5d0627ebdb7a3282162309ff4920f9c52fdb2f5e6adb51975dec64bb80a9453dd7528124fa9791f01a5cae02243c5bd1a9a2a0d17ae0331443bfb974ee628039fb99c7033d0be243bf679b5e73e67c6c7ecad9d73c10acbc3d7ddda2117d8342e837cf5cd36496ed449dcc37cd61a779d66ddedc0e75083ff632d7ba8f1ffa38d0845c06dce807f8e8f3f544d24fc75668e1688d3662a4e6a77419960b2f3c71441ec941cb182fa7b376977ae76c758593c2cb09a397122688cfc6a900c363ceeb3e53866d7a605310769fb98381c79c62ce8b79bb34ebf9c8e6697e1073eea887751f3bd04f9e0ff3f56fea605ecc0e3be6eccbdcb56b90dbd957385e4757fcece4cef01ff57d2961543598e9d43f199a9e6778eadab28b7a5887d3738687dc948bc6e326e59cafc3acd69dfa02fd0948d3b418ea99734d70f9e85c1a411f9d07a9694030ebf9e9d75c8bd9c15c460c85ed60288cba969d661773f27c4cf9e82787f291477ae66d59733e4ea7d3c9e391fe458f0148059ee9d1bfe99b97394e673fbff9ecbed85c643701b01594f222b085d35bd7b1a777328f87f3e81ce73d39d7bc18cd31ce8bd1bc1deab33b39c64329b64331bade375ddb3c269b5d4ce6f9907bc4e4a36b3c27d7a66f9bc69c0f4d47d3bc3df35621fa740d3e7c88aad171e2ad8726a4f4186a18756162e80c8e1a77d297797631d2e163be53159d846fc77c3be9bc73e74e0cfa4eb8581e76ec586746853e436f326ed2650f550f2a744d723e16cbc4582858f31cbdca2c1220d0847d036d556cd4a86aa3f211bfaf170a9e83f87d41d1e559bf2f2888747c6a60da0f042578fd3a54b551fb89dfd7145e3c9cf2fb9222c9d3fcbe905e90fb71aa81d2f7b8f04c49be8708ea3f1f2fb65805f19f0f51109a17fff9e4e085fc2f862c9238400c92fe8bc128e997ba5cdc36fd3af7a0f5c097d2cac307bc6cb0e41076313bd2ca479756fe8b01e8a3cb9e6d6a6a924b0fab1c7df7dd6bbc7137c2cb4e5a79c8fd100200e8f9f0b377c7c31e5d934d1fa303bdfd07f4f67cb4a742cbfbf04bef631702bf1de8bbefae7bf6d1be0d260fbd6f874dc4a9da52f7b5040f4f7f609e39edbecc794e4e5dfae6ed1aaa8b41a162744e3fbd9ed40b61ae8b4139fc1475d6892ed76b1ebf5f73ee9899fb8172ae4bf9d6a17c76bd715bb73e78b96dddfee0b98e5fc3e244f5c0a64f391bcfad841c51313b0b45ff072465b1fcecb89b9eea38b93cecb409eacbfd804e29655f1f103ab30e3b750dd569dd9661c66bbda1bae5a239aa8b017b21fc1c08025f7339c36bae4d4e6546d57c39550faae63e168b6c082343380780d27c8a8b86477535af6527678df3dd1c19e7dbf4fe936fa72d3bb9d605d9386efa76f2ec4473f2325fa7ddc2a992deb7b7621673109301c76d1bc7711cc7ad0cc786a69d4e9aa6699a764696519a650e3b55962ccb32a7bb23ab9007da3233c6cc9159d8e6c01c76aa2caa2c357ab63b7ab0633b96b45555a91fc552b37b7677cf6d73604ea90a4bdd97942e2f1d9b8e3111da8f7d196dbb2df22b66ddf0bb3952dbe64839772a2c15e59c6faeb90a4b3d79a6c292f26d77b0a79cdb1dfb29e754175a4a07730cebcc9da977e6d467379d9910f8edededf9538f873a96c1ac697753c7e99e1fa79c3165ca0ed9b78b69878ef3bb341fe610c37a603488cf06830b4f9dee4e71b9a8d3eef382f42c93cbf53e2f7ff26e9fe55480e1b3203d0d78de1ced3e93667307039ff9083d0d78b839a8b74bd38ec3d2fb0372c80e7da38751d1a46bb2a7ca31d7e00fb6bbeb58cfcfc39e7ee8a9a514767b8cd19e7eea09a90f24ba66f88fbd075b6386a61742bf8c277ad7ed63f67a8208c13e06a0875e8f9dceb307aef1311e752784277fd3bdafe7e723c47e9e3a77cccc3d3f0e6300fa756ef8ededf5fcbc0998a58136349516955910ee4b0a1408a167a06ab1dbee80bfed8e20f0886b6efbd4ee08025ddfd300577505a338a8240e1655392a15cd88000000005314002020140a878402a158341e52855dfb14800b8b9e44745698c9b32489611442c618430801040000008088cc8cc64100e84a32aaa98103b553366244dfb51e7ef1e67970766edebd30313ed43fa9fe8b7e96998759ea9a1e1db82bfcce61e5e2f3ace0e05753781e71a774045d99db22068412b4d29664c394c0b2b5e7517e6518d747f3754dc2a584585e9504056abeb17a5df4da963e364691bdfaeab9198d3b3e0c1c0d3b93b5adb5d1b3205b73a3cdd9cec23e62f940ae9676ab424b2007e4b172428cca0a1937516ba765fab19fe9592d29f4cadf8d92d3b537ab6a7d5af520e9e00b6f2a2c55eb9f997ed72573008295eb7ef22a41472e39421883223f6ba4ac792438706c494433e46882b6ef28e128d483246639f88921febab60ce586f97d7b2e8bf880937511bca7de728ef913928f4a958319395600dddb9e0cc92b0b43785671a0d550ffbdc6cfcdce48dbf4c0550c227f2914ea6d74fb29fe3f0890e43b67bafc0a416e8d71ae27b6a6faa2ca77e4f9b1efd60842daa0e51c3bb10a159ddd24e8221d3041473d7d6f3aa604b771d5e9c6bc35b6e56113da961989c2ccfcd98d3ac3091896b10f1d7b05575cef3728520511ea01f4662a266ee47457251b3b434aa426396315f22046cc17645081e3afc761d088a9be63109f9008cb9168923d536797e71882310d942149f0b9a6f421645effd689dc968086652f4160a984207d4de502dc81abdd3042edaa2c1b2902f1e45717c950e445e3d006834fb8933e597b0a6d75697308f104a9e1a2658900943cf16f5897476dbb6fcd5c630e413e6181fb0996559f6a7bc6d402c81d2c623862d8e85d45a470f155b6acacee4dd0925aa0dd2d3db9a0be34cd12a73826bf2e1bbd8ad166a4fe5bdbc00cd33089db341a6cda6c939946525186064e94497473be053353b8dc4294a19e417a765191bcc689ba2be9d7f95f8b7292e5fd7fe5023348e988a49998389c33a98a184408b6a3c98409a45496f62f8c0bdb5072e177ef84d896c97dc44784e852b38ec4578cca56b3a2c7527b269dbcdc1883120858ae2254d6a3abad43ee3bf707502da508ac18db6e9b00f1b4e63c10a6912c41123d4f67b586ef4d5cda1807a0117c5c7feca5c3de4bcc93569d1386908bb34d96b855003ae82000943f708ea7c177ba371df99787c28af8760b0cc9f06e15a49ed9471fb965e4e3298c0bb2b43a75e1d1d280f96314bbd31b1c2c6b90a47372aba592d01f65795768a02f6b45bd2feced2d24bc10c38b8e02a1cb2c6010d5aa2149c31a3bd2f4f9843cc0a15580d2d7669638fd059a2d051c6347a146200865f69a0ba0c0035128216380cd8447868b31e0874cd2189343fd53eb8d32b2d008f01ba632693c7f04d912343f884771d12ba76b0556ddb77ac2a2868d9fa4d5fb03788625a1ba18c7a078684635dee4163f2bd737d5dda06990c6017b48edb139481b738f7cec05322a39681c8a6316c9407517e42cd8650227a96fa286c9ff7421708ff9c2974fefda63121ad12052bb1db4e0be07b76907c6846ccb2c729b984c68e6c4e1a53d0a77a66252c923710c571d80941ae39f57c7367846385b7b878122b280ddf7939899b38ee848fd4d9154206ca6b684a593736a512c5aee8ccbf7a44e7212a82b1071dcf2c6ddfff100b572ea6bc21b241b31c49b2742b582badde494a8b09495c5fff73ef2308ea8a15224167f060d84a07dcf4e8f67c73a61c4d83395665d4df8c4ee7f6f71a6a267c9537a2625850de4ff5e827c6a525f7609d04a053dd60c3211165b13e9f7193beae530a0f0ea6f3a5c8550072ac7a822406740bc95db8b9548c2cfdbff6718d6b67913ecb364217363653e3e89d33dd450152b601f3c6d74e8a29f2bc88f6f786e7da9c6aa9b5ffc0f84d6957fd814bb1008cb2504c2c7b5696a43e1877d4b0097c9811b7c1b0bfe968808ac401105ba40ddd6cd183de2dcae957a62887cf71b391a4506c82a47b8ecc0a76b92d413697f6dfaf1cfb1ee4044442a202d58ec0b2f8b257d9cec387dec74c4791c405832f009346b6edd7a74a2b66eb3cda418f90b1fd55925213691922316fe489253262cf0093122dcf5fb916a68c8cfbdaec98a5dfe74ab9a2277b4e38cb55ad255c2894554aa8e2ecdafb67cb93b6f206862fa03fa4f6d9c9ccdf3ed999377d750a863b022532807c7b65afc82065efbee77e037a13fecb1170dfe989a1151a9d38292ec03d67656ccee3686785a920826930c98d4e642f4cadea3371fdd1b538213f89fbdbcc94d56dddf615d6cef72b651697a50bac3c52b9e2af585c776c849f54a77106bd244b8039bc42f2a49eb0faf7b4199637c4209005e86040010134217616e2e29a6dd5cbda4545cb0284df183656028552e9450f7502a80fc421eb870a1e96a2ec1fe9d449b369a2358a56069042e7736d5c9da03151d18125a33602bfe148fef1f5d593deb9e81655f2229431844b07b358889ad7b14e63d63e1c846767a3e529cdf264830a0bb623a993196fe3098053a2bee5d59c13646080bebac285ac8b0e329ea3613beeba6d7152be31a8ec8404fd4cd64cbb4437c496e7afc6a95f5e963295dadf1bf510e65a8e59e8a7a00b748613a93a71210a7d4c3066925f86945e20b74e5191f5f281b531c7a1504526a7446fe501fa1efd17aab89c02d6fc62152b7a84eba91f61b8ee9447e20fa06382c6f41d08b8df9776c2283a13348171f01283db2cbf1856779dc118ac34b3d190c735010aded84e96475ac4c420e0d6571ab0abec9ce733c37f48d9e1e95e25521043dc00aa18d838c23234645b18f2c28740bc92016ca47476be466a62a4328d70baa00866469ffbb60761108724944e4859091479d938088c8f8ab8dcbe9d4aa7797553be93a367c51c1f6ddf8ca2a6c9a8cfb98f1e813329b7b405c95b1aa45d2ba1e9b4e97c041582c48c73b16eadce47d422758a830095082ae124b410866d4fa9f66ccc747dbfc3e78682afb561c59845faf18c9cdf2f7d94961557a26e8afbb5b5eaef7681943d2483afa19cc60ddb74992c9076612dd3ad686a8f68ef1619df56f8adcde239ff9df512c993df6ae86ac3cdabdeb07cfeb5c23d773d198255ff24a219883cdb7b422d6fc94e866d61bbf3f5fe2ea1fb38e71ac8b058266b42f998c6dca58a8a74ccdcfc84030cca99e961a6b9d72d0ec30746c9ed96acde0cd121a318892e33cb914475b533b045578808a53b3c4d0f5590d8f324d08a6184a8b5601cce30515e66a6690fd7d6d3c3c5de4a10d35fd1e3ca4d0809426c120e65468315b31a29dc148e56535049e5b29862d8b0cff1fe6f16f459ac145e684bef3c1210b2c786f7592e0a5a753b8294a8d2748683973131f527a63514f205cf3e254c169d76f7351e1b6b8c03238317c817c6935296bee7dce0881d8a86a0cd478c5554dab5d83c1bc78c56ede16b2b737f4b99195193e8e5717f85cb54327423c811db07da6d84304d65442f323136f1a8e1d2d448c369c6d9a3fd0c40d655e9c15699e1728bb96d48378dc112749627744a18a0992f9bcabf14ad6891adbe148f201e97fb7ba1fc3e25218ae64632d71e2307de24c66638216afe765b8a3118e9391884241500a565544b2b8d8454c60244c825ecf052bca8b85b4541ec6e27b2382a3c1b15989f7e10d0dab9ccd881085099ee6f1f548f8f3c87de6a8e7496d88666195fb920692679add3760d9cad5c64817bb1e5d61e9a953e750d8336b5d3980357bf8e4f02f257568111528402515fc0dcb46cacf9f26509d3de374b97a28e1e6db1c6c69664ecf7572c68e95ea292d0824be983c48c7971ce4be7414f5a3a589df8f2f19eccb2a8e2bbd4e52a1f1d43905ef0280a060ee56e8037c3417d375a08c1a6491203ce78e0e1172a003167cc97de4ce5f13069a7f70b33be724dc6c4c10c70e08c26d2050e8e6a696f6d28714b47e921bc0df085cd807f233274e9913b7f221d7f3150b934d37597024832a1bb160b2fd6e1f3e26220e3986aa0596f1cb9d849e27d954d999e8631d61fed118620256191378c9d58e538ab6331ffac70c27d2df1f0d2cb5e9f3bc36a5b04479052ccd7f71bf159959efc3bc805edf14ac8a3545d86cc5ce5443e8cf3d68203fce9885ccc1cef0043d771d9be3233b14332bc88198d0c43d3678eee2aa5b1ffb0ca02087d2d3b8fdd831e6265b19dac1ebe28f540ffb22309ed91187b8abb95613aee45e30aa91bea11ea6174ac0e4c307dc020f5fa14e110eec0b1e915f2e10714e172451cf3d24887db21fcb3af9669099f23bb9cb2ea589fc391006ef0c0cb6f5648230f3728144da018d02c7de52da8c0b7872c7629a1427cd4f25cbd33377bc6f3bc6caafe91072e2d584293390cbc15685aa5e8476414589dbead67dfd34807ff43d7ca2d71a9cf3eba3188672bf1e31abf5490ec231dfae22c3749d0f023620f490c90d33a0818f2f96253797ee62c2e33c0efc9c8862030c608b4ad9f3934a792b150b4f79caa09257f88613fb9b85eb78149a33e016316975fd6dba1f3254df7853568bbad1c016ac599db8ed7648ed7558bdbcccec1d7171deaba578c201a5c28e10dcbe09c8bea096c63bffee0d7c491c9ee0e3aa32144632ceae91e7cc099bacb5813f11df6ab97032afea1b9ec030d04c60e4c69155c781e1c957c68d510740ec9131f1fc4346ef8ac4bef0799bfec202e5b3abed3b0bf96557334268e658a0e06a69864d6143a378477217a80a3d54b0d0dc952c773563670ad87d41bed7cc74cbec9d6a015693818433844eb0f900d4abe7b0ce38573c3a3eee5270ada3365600aa2515de6b8123efb3c49fdd0f91af6bcd87a40f4b03002d59e937d93fe0bb84cc1faadb137ade0adb1832046a29b57f4ecf50c3308e2520786d3e45c987dd3f961077051dc23e0cf179bd1ad604a811c30fc01ebc6f1a77f0e05423971c1fccf82fe74eb7c6359a3c14e046cb87ab394b354bca8db2de64d382ea0acd64078633d98e3a0d78358100626711a554750423f42c63f0f2c8192ee1d4522f8428eb95ec4b2456f3ec7c501747cfa4fd8ecc61266763ba3854721475f47e9817cc19a9fdafa4fe7298a03d484b25ac17f0b558bada259f23d8e2ca8bf34057bf5d7d332a8dd33059475950ea0b7e0760e8ff4febd9dee487ea8cbb0171c26fe1c3b37668984bba9a890508feb2828cabe370c2bc6d0c5bbe4578c62fade498118cac7a91c8367bf7cdc65fd714267e19c6c62d3e10062c8c254f8cf42bb729519e943fc894e3d499ff7a373f134dd4f88f314d10a1cb3d371aca34ec894ee984b1d7705f7a61b57b480b7ca0bb4bda2bc8035b62fccd755fcb9eafbcaafef262ce4b504ae7c43c119ee1e24f4c1b84c2a0853624134d503f4b4cefd4f0a0e716401aab50f4c9e05381c848718b1fcccc516ee684216cbfc293653d9eb17ce053e633f55e81f94d79ec4f6608607cdfd6f46d2a3b28a7325f2e4255a5cdf11c77eddc6e94abc9988aa45e89fae0de9325f013398e6eb74fd60207ae14ac96d2264b40f2269100e52a13f87cf91ebd19ca0fb5dbf7123f09b004292dbf182a563e2bf6d9eb11087008f787db8fd35cb9b60d63cc98d5c31982a7e4b4c1cded99eba0fde05a05094ba99320f3e9ffb7a03950882dd82820f7438bbbb079bdb1d149e0bc284f8374df8f56fed35c02cfeccde9925447cf1c5a88744f708531e4a90a72bce7f1c0f7c06e4eeece09008b7049a4daab46e25f50aa84fe007aafa75019ef2e4a289ac5a42ff6120ce96dc365c2987ae85447a2118da7ce7dcaa2e00f6e244c7b0ab7b12f17649d674dc4244b45ef930e0381dde337d2932e02a21a90dfe03a890be684bdd50dd8f435f48320c0b990a5861364b3ff218e16443bfb523fb6120d3278dc4ad9175815103efcf4839b0b323972b0b7f82a2a0304d3a7ffad6c37f04aaa7241c112fd0fa9da03e95b050aa266ba9512854dc015c0cc53f876ba7dbd005ad5ab04350c20ce57a673516ec8107ee3d86ec1fe58d812f933007e6d37a52cc0ad225ecb0d88d3cc1bdef4e16b5a70dffc9da5626b9aee728ec35f6dc5c3d684ae5a685207757e23f11f9a643847fd6cc9851293bfb5b0ea4d2472caf7e1ba65fdd301f67faa9487f99cfc18ec00e5a6ca6bcd7a6749166c5d086f848c32572644338ee0b2f8aec371b7c2ee2f538f04364c02e5b8e16b35e4b9bc77a8dbd68a0c02b35822c41734cf6c8c93c53dac2aad54b760c7bf63c6a83f5a7fd4b6ba04cb1567b88571d19ba4de08615286cd4402685f06234248bc8ad0d48001b3a7e19af70a6c5e3cd33b1b97d1062c1e1299a0033253959f2dea34aabec1eeb10c706afc05913e79ccbdf62d5215f5bd564ec010d97cf989c24993e2a97ddc66a3a50158c88d58f76c1359050244e91b7d08ba77487a40ea2fcc5e0f0cfcb29543bb95924352a059ad5b02a407d4be8b204d1273798d057b09f753df10951e2199678d2d659e36dc733c6084dcf8158bf1e71fc2b18fe86138021ada15a0a65ad37e2c57570b9f08a80b1bcbe58e373553bee94fff44a8af9f7ad860e2a825c847f7530fb7b2e7ec2bdf642b0596263ff0e52da967070759583ace26e6e5a7c36a182ee356fe7e25f0ba2ca90731224f3f5762118cad2fad8a56f8a459fd3a71dffb419082a188ef0821594294025493fc44c9088d77f8be9e0e931f69ddea1e87a5e3c2435e4304e754338f37ba87fb6af4bc4c346f5c5ce26e798fcf3c1b023e8e52be11c8aaa18e74d1b79aa215feb33559251fadcb910559fd10875f7151f8875dea4ed6a3fd723b07f0e9abea6411e61482f8317000b0ae5fbb78e2fc8cff9c0dd56c00ec3b087d70537cd6d502ec003531bdb17c7f28e5b71584edc2be6183bc3aa08d936999412aa2f755114d2e7fc6a698c6e59e9f150bedf24bdc4126f80078491cda1727e399331cf5a2412fdb5fd970e8ccc3a2c309c959f1115613cfd0d0a5aff00ffff33d5d18e720e98a68b597602d24b2feb4a71c78869795a524a3f65def70b6c2708fa571a0220c2177ac564564543267f37af202e7a10a98283686e44e05264a12648f937afb3e60794c8dcec37e299d6008af65465aac504ee68ada743b91da955c6c00a42b03e88ceeafd548a754d95b5977f0d47c1bc14cca4940936594767b75325eb285b48e8b2062d028ea2f1ceb70595a6896264f9c29a6bd758534ee631e6fbd658e4f3f2aaa0b7a99dc546cfbca58e952d1a46f1385d8807ea04a4ef8690aaec5a2e2dc3b42395f193106c0b03c7760e352a9ba85cd0ff902f963859d41814b44718e70d52c15233c492cda5f19ca8eab51f309625d31c07c27479692f05b46f897bfa5bc2275e3ca464ee2b704f979e97066c08f495ca7205f7d7245f0594098c67fec512d20a2e12f08ea4e5766871e8bb9015399fdc7292ea4910daf9aa5b7fed99441bcdee9365c52cd395a0801a8cefae81c67603cb7dbf25b08723d2309c6f1ff50803f169208324d4c2dc9fab1df4481df9882d979368e71a02e7d591322bc905b7288b2b1fca2e70b42cc1351fcbe131b7c6e566759af42309c74051cbd2097d3cb9de5a25ad580114791a01ae480e7c75365fde43b7ffb5a7d230a0fe6f30b966bc327bee9a0d7a55c94ee7e54d6c5928385ee9787f910ddfbc1cf08e8ad54b6dac3a58408ed923b542a338015b46f4e54808a82ea127ccc1a883a8d209d8ddc544d19d366277ae249d20eac6499fffa589168e6edf7e2310f482676ef9d5e41e4702a25b7c0086f60b5e627bd5a9149f57ddc9f475254ad408f67db0cbe8634fd080a57fc23ef055bba50db972792546e638b971a04246a3315c3774e2d8880b0e5a3e32a66786f64b567ee2e7fd3b1d008c5b89844460c468153b8fc56ab53048191a6aab8e30c162b28123274d2ed89e9a853a9164403e6265330db701a3a6e92f0060babee7aee8a4ec0683ccdeb0bdba9c4749a042d435de84ef4d71d3194c647c64c72cc9fef2949165c087721fc5367e89f07fefe38deec6b7194c3abacf793619b344ee92238c4a1bafebd188fb3acdc9df1d9642f24791fc10cbbb7246ff4fd28c46b586a1203e07ae9ad747967ec455baa0fd4e2dcd561ea76a1128f3ff575380a9aa1e6f757feb58b8e0fcd387d00f0b3c3b56beb1473f6737414c27c2cf6b8fb326119a5db381d0b730ec570bf2a514fd2fa3588236391166452236da5fa54a244773ef56a040ecb32431831b29e8327fb274126c72a97e9616f216305a507e26557f42fe1b8457961495b8100f45d40775779015ead4bc36512eef7b42e81528405378f30906bdd85a6c311569e6f32a96f6384c9ef297f1881cec15fe27f66d348bec919a0302944fd78af6295fe58f12129bae11891230a4afe01e7d5b75be621a2a00915394877b65b8f8934b2f49b8d7d05c1f4a693f8a53a1e8f6cfea45c81c796dd1ad6acfc4a8179a8505a31dafbdd8d4d9690f4494610af3e69bb3ef765cb9542cd290ae0229d0bdce7f703dc546c2661a3c9218d7040c6a159b6523eefb0a80b8fc16075b4325f84bfd8ce41219c5602849c700b722a865d3ee4b87f2d784ba43819d856dd1b3e41309ab0adb574453ec8fbfc7afe471b75b1324f600c1f54929fe4248d3ff25eb7894aa8542f09fdbf6d56a46bfa905bac5c3102f6a7575a31dd98d9f027a1c12f02e26ce76a6e0ae9341d4572231e3444e5b84e74b95b43af4657ffbdb6da43134980b309044220257c18f61b13497f5c107a07b56f275c46d618226259bb5d50d03154b44cea8d14f8979b0d33e512d4390d4414169bfdcdc75751006e6bec5ff3dd7818b3e47c8593117df83cbb73d9deb970280f4bd19940a417550cb631d17e3b8298a401165e64dfdc418300b8861e4c504712ef6ef24fa7ebb3b3513771f226eb4bf82bd371addf1be8e8094f94e1e93532242c9badca9b9b497cdba93a0581a3268a22318fc912731e765a64171de6b2be6acba8f9b0dc431089f6e18f9f0421098ba64febd2400a40add11728dcf003f3a7cc0013b942cb58ba10521294324762d2659b8247a33d680c261db398ba2fb8caa3828c2c59eedff94a7059679ff8ae28906cce642c5754c028bea041166f202d36090d59c42a16be6ba72439434a78c8384c4a5fa94da144843baefe4f9993830d737084a373463c4513285c92cde0039ce26389443a77fdb59755893bd6266bf2e0b928c0f697703bd1f47a2969469725612169313fdc081025418720201eb72a5ed4291bd9586ced4f950844b8087646019f6774c5d97862069e65243cf37f5476550fbd6cd263fdebc4e268d9b0673a42c5d97f96ac910e19871c44d725049e465bdb78b0092aa4a010c4bd99a1731f00f0108c4c5168c4a7913809828bda95c5c62956a368782e4166fe75a0cfbf18ae63268cb1f9012ef3f62b345af47a064df6545f917202b597b1b53f5c9a7ef8b330dc6fe6aadc8c4937566ea6b7fc7aaa86b106bc175f7ece8764fc0032193943f8ad9c840b0c9419526a80261688c1dd7a1b93f39b7b250f9c3810c27a964c9cd081e3bed16089359bec1a5583c5f2f61c9b026cd599ed8021cd2730320da8e97db4a75f61641bd3fce7bfad13fdc0a1e7175a6761397660440a6dfda4dee21fdd67593585f6e86918a9dd555ddc98069b6758549eae24311493375931892d07e8ab05f429cbd7b2c5ea4051af20b32fcd6642805b5cc9b318431b9d447c7af32b2c131f442a3b69affe3d3a651a7449af8ede6b0e60616d7eb2c31913d9cee7f22192149360ac77c0bbc8c6abb0ee96ef8cbaaac06befd9c57daf5061ee04111a78ab1d36d525046a3805100e51ab1429528a6b95ade04929b4219cd1d5d51e5d5c6a6e025444730c55c6664ca24ea08139eb667942b506c4e6cdb6003c2bd9779443a69bf1d6a5dde0b3e16cf6d8594859ec1930ee1aea5df535f38d4c6fca0029008e5212bb2d5f0e893c3a6511cd91172b2ea1faa07858e96a0f3bcb167e7fc3bc7b2f4b89944b2818c674a3e8eac176039cea1d0239ea4af7b9578844149df8c66898539e46bb12d98aefce63c39301e31a3ccc985e346d4baaa5d06553801266156bf45f2c5bbc970286a0c7df453611a359eaeac1926abd1f8c416ec08c63a4402b06dd5150ef5006d3634c912b7841ea92e0d6eeea03a0f4da5cc7c2a504ab8bb43ad942b7f6d147dba47165418a2353859073d6a2de9ca997f34edfae92358b644abe1d3775a0cdf47495c64aa113be9f6872ebc9211da3170282123441228a17519e6cd878a6f082dc0216fe42183287d6291e1f95ca6ec34a694f5693d5ab2d8b5549c6106c153f5736407ff5c64c39eb6f74ec5558f67b692b75893ccd6c5d25376d55e34095a7e166a75428f85338668acaf6fd73d85850d3a696e832f6da94436470efee2c3cb7ac14b97dc0abca12eb6e2182a889120ebcb03e1a24645125af601a4f7f50621a2a5fae08b02c4a008f1f82a4d8ec95fc23afc0e0b16c2f789094f0bd34ff960c0c722007dcfcc3ec7204e47ab2a689d620e3a06801ec993a8e5a8ab80d66e9abaf50dbc119d760915310ff7261c6112b3723e02d4b8e19fef229f03543ef057841f13cc46e50dc4ccf0bfdeb6bc9066593e59da9b0e532d7381d32946df200945c96686ad113cb92a4c5a3ba0e2a67792599e2e9e54e83e4d57210a8508dbdd007f874b2a4064310b5d38b3e625c93fdf20b56f7d6b514338439f6a59396f499af4c0384b41a19858812b9cdae03b744afc485b33d690998d14e6767a299c8619be31ee8139413d716a17887c5b5a217888b201aa4fdb9148eaed5f1f9949c2fb45185eca89e54efaff1035f038134390ed5e7a1f50ad2aa4beb21f8882b25f8be735c29fe73c3196e223ea684138c86b724f685827c3f3dd1b6e836a7481bee9b8038ce3d80099042f8a2254743678d2cb1d604728c372dd8beb5e44a4282b98cf44475d83dd04a9652036ac0da6656c8ab069eb74f9c9ba24ffd4773df6efd00bee7a29307700f0a4e8e257c75b095a5d823e3a33cad64c64fdf2fc6b4988cd6746f5c7d31b24ffdca4aa1d303e33a24236c345d50cda72aee7764fbf0ef8582f662e3e301c64269051b7388f8c5332637062a2bce4e06a1bb3bc911458bbb30961c279b4710264d7cdbc8a5deecc58f0311d6d67a3c7857253ebf245eacb75223ed3bd90bfef05bcb15f468afec1181476093f084b9f1cf057bdbd704bf5904807a89df121de9b14f6d568dfb822caff3df1b041f92f58c78b9c10242181a1c72eba9a2f3900c36ff8c078af84b81fcc331cc1238b4ed6253c6fc0b591ddb3d5f70b0ce02450521d1ddb0a5695a8bd33074a19e5b7585a16622fd600016514e12c200705d720149d30eb73f06a0fa9cfbf9433bfcc784bda04574a3e1af65006ccf82236141f70841e7df2d56a7ffc3bf410e986c5ca01bd31dce9cd823d6bbb5e12001b7938c7b9d6debd2bc4d11a1949e68c13e1ae37a71680529f13f642eeec084b0b4149b58a661aba9b9843a97715fd17575ad744f522b6bacb2d726437f0e2785fd8b2db11e7f2ed3383e61a0f2de68c6c56eea5d66151f14f8481972ce2c0b4f65550e49160251726075516d8916ac51016d1995009db07b00243f35daccbfc9a37dc38b4cc0bb970f5fadb10a09d4ef1200fabb60eb5bed97ef1c8a3b994941e36bdbc8e51799385935fa804efb7c35474ec7292f76268fc314f7e997e63c612ad9575d16fd02050228fd2598ee48c4cc46bcf85d867da29f84b9fde48b4e71329addf9292e76ea87a6cef0ef4cf9fa31cbfb80f06b838caaa84e959fa215b8261d71b5ee516b34fd38cc183d1af50501d66397afd1c353895ae89f92b64886d539658616e5f2516f00a3352dadc23244c3b36f5eb4197a98c2a5d4ff9b1adfc89b3f1cd7c64ae2747f81b3c5efc19d275af7b04da3d9176254d16fdfde1643349b91062134b56fff24b88fd9d21a1837edb9380d767f02481414e4245ae317f96cd5ffd08fbdd5bebc3442eada0057c6e6c5389fd20cf1fd11a029737e7778f18fe82671831eaed2fb65791ce69215dcbd788c72bb5cb78d9b8cc2530eba8bd7e2f49da57c000de463e61a0368a8cbe87f5718e23b0bb010d89884e400cef8232b751c2b90d4532d77a1c744fba931393ff73d04eca99cb6b217a8bdc3c7bd5a9733ae2762ef9237ddf8caba16a22ed23c9f207b8158511865a9b38b6b7400f1b87cd05fc7066c120a0c9ef247a10e107fe70ff830ff6539a8c007f7a4d4fc5c31e12395f3583db79cac676f2674791efb38559ae5233b1cf3cfe99ddd78306de9b312a02087636fd079543120c342429099eb1f734318f04bbbd449dcfbb2501021e95375f9214c33d59ba9f62b4a545b9d2d2392872a4c17d3322e27d8054c743cbb1e835742e1fd6f5536ce1304a184e449032e1419717d60764fb921572e62391c94530d722e5d9c4e763677b91cac152455b7b9ff24356befaee274fe5fc077d848f8ce1a98ee9e001805cf15dfbe92ea7118d4d33fa1a830d4595970d4214505e3eaab723ec2ce7a9c9947219465aa8065df2322ca0df2c8055a2dd536accd589b56a80fd61e7ff17dd46017656e61ee49fe3b5a5b9f9492205084a8f3f9b9897768dbdbf91a5a7a0c53f5fd5b29407bf0d3b9da7af0deeaee6d35a8eee6227871513f59610529d2c798965d90e334c7dac8edfab2381ec37ca0f490901c0a3e4eb8cc42803e4ddc3e7c6e5d211a73011fbb0068a9c6eb4ccafd3a8888bfa2c797c2a51cd776d2e7f464a8da628b054b92021782f451dfd20b4e0b3b6db05e5c46dde74cb30abd80c94bb430a4a2b3fd9343314c95291af9da77fe8b58db83b5acb169929ea414623902009286e15a7375e6db9824de69c3015e181e6a8759c0c448475727431cd8300f7f07ec730d7691284e94fda3524e6049fe91c0b8ba72bffd389ce0f48d4945b189cbd37fe656c75b9aaba25bce3bbdd7c3d3a84cf7ad036bc2b303f1b3bc1b38bd63ce892124a38bb06c72d971548c077262ccf36f500e39edfe21c348ed669f9dda4095d26a22f8dd36ba2f9f17dca958c52dcfb3bf6cb50caec643bcaab7b6ba5768c811179a2fea9f8bba1a982ed97b816e711ead67d728741b35b8bcce3b97713321167a93befb8b78f2c7be5c466337ed17b5d2a5c43d3fe5e451e3caad5f608a4f5c39d428cbd6ec4774dbc33f04391ec40002453eeb360ccbbd5127a89f215576606e363545e0051b1424f0672542837745edc4fcfdeaaac37f9ee275f255ba838a5aeedf377f153563fe7a4c79f14bead33b3b3239819cf0484896d47a5e1706d9eb6e707922ad38f59fc655ab506e5652b347e5db224a1f98b43ff7b150ded829616135862a9fdcf705665cc5f9105a090963d9a107700c807c42fb4980927b8386838e4465f10ad6cef943c4ad1b90066212d002aa952d23f6a4a49b8a34ac2562f09bc01cd59a666828cc801e68864dc42b92b093127568b6d64fba285bbc8dc413267b78aa83654daa8cf3507380886a0ed290b365d11bb9490505dc8127b0dabc26e2e283056c5f65bc733b3e02328387f9e8e8ee8b90d33c5394ffa9dd90c6687a29dc55d950ee8cebd95165d5132f3e5a9d948d3e58e046b99df408c0e999efc4f261f2848bedd4be391b96a0b791a9843a3b99ca228abba3c1d163b2c4384b519c8251a12e4ba85c7cb62918e44e64d6fa3b17489f67a2eee2bb241e60426adea5fb8b3bcd44d9558cf169d53d190b3f7b5e22b00582551260a304cfaab732999bac52b5452df427d01785087aac6ebcbb9c7fb87e4c9464bb0829893e6fc8f8b32c05b72a72031ac72d5ade803620a0773629dfad9f6bd1d5272161dbbe8231e27f20327fdeb2c038459e803fe0babc141bb8738737a4ca717a8ab5be8f28ce5022d8e7f8cc6f119d61a75dbf0cb0d701107fa35e16bd3aaa5328241a250c977f610cc3a33c719998c8423ba59803e653c1a80700b0859248090107b1de1008e698d37737df1b0bd6e2d5fa228c245c6128d38e7613d388c7b40478e93aa497fe57dad02a144d6568cf7600193700badb8d3985edb0aea22ca40adb109e89c03caa2be8c3b56642f4471bb3d6b444fb407ffb82817bd9cc37e859613234acdcd71cee8a12f1d8f85e72780c27e64b2bf017bb908b12711518a869e3a58cbfd77bcc30c38700ece387d647fc2ad6c44ab88712ef4ba34afcd9a79e2e4e8e1e7b461d9865ca2a40ddda4b9ad340d6075ca82c1d5b58ef7610a1c644349d0f78941e3b5549ea400e5ca43bc587dcfd108d4d97f2ae4da386d0247134f8573c8ae631ac3fb1c1e0e444ace36a202838fa7afdef3d8a90bee85017364fc1d4c64e3a5a83e73333cd7b348e02059b4f57770fd4609c08db70ed7f27ef6e377470e7b5825c05a94befd8a6cf8bc14b340b42937cb7b431c13ab590a16dce31e16f4b1282509bd2eebb5514a0c4f8af00ac2e65f8709323b9ecc889bfb6a4014108c8a5244054f9a40a032b409f0e1edb4a54d18e5c16a74f4073e576421a05029a9523ba41cc90c6f92b486efc29735fde8a50056763a66e8a9e994b03992e4d3e824aa368a538d1cf58934a184253122a60cdd1afc101a8a432a642770b0efd5c60133c19a88f0a8570fb0cd8516a90516b091e4837d5c45896ece703a0cdb3f7b51e420ed7fa15abcb887e192c957dcc87ebd0d1281689df7d9438930e851aa2a2472c6e03f388082df1e0c15364235ac699470822c1d99c4dbc11ed74a25c950eca2a916c32e860f5d602ac668867831ecf35bd97050f980c9f422e908a2dd84cc1779fc834be665094a1f182ce1468837b02913334d7b09aa8efa44a3943c72260680bd4646533f436628262b800bc1a0b6060bd63a7424921bedfdaba3b0b3da12e094e15d75744df07827de2d84ee50065f925162c03218fae078bae378b5d2f8309f5fff6b52205621aca6ea69766045b19b6496d5b2aa91c7cd2ff5405e7da8b84cd0e59ed97a572409c7b06b4fc6b3c242607988c79354a178fd620f5a68b5846c2e4d50eaca5ab963b6d9c637f761909e492a5bfdd3ae1922e0578adb55ec1c6292930aeb6300c28dd70e84b29d7c5fc977fcc26cc287c1aa7b1f3791ef026fa10fc656fbd39d36e4af27e036f1db9312cb779086bc3fd7d19a348e8e76f97f4143aad87f40554e94b0187012ab6ed78499e3cf09544927f00454e823067649166d586c69983cb7fde266e8f8f558920c8455c4bcb699283bde5009271069137df2fa69f8c11b681ac9458bc56d4771548297d510a75990e69bde250ec8ee25f158d6e1a23122e9458ab4e5e3a973fffd678829dfd01c5cf0dac94bcae27859b4790bf492993d164ea484676a2be121f011c44ca465233625ecf06e25cdcad5de049c9974079524e148fe52b350b4a7c47da50814c2ed32199aeb5314c230e94b5715dda226880b28d7dc5675fc106289720067dda862354c72b87c624de468f5cc873607b04c3ef62aa922d20ecc545b892b38adb1d2c8dd507d87dd8680c28fbc978314d8c2d0b07abd6a28c4a64c63055d240180686cbf4bda93bd5b326c038bf76c4807fce3c00e4fe49560ca7bcb4f1553f12f08f4d6c0bf90fee389cd47fe01b3183462811e2e330a3af1032b349f34161a9d4c6daceeca0ba391cf4d703385f44d6c3cea235fc5d64fecc17b0c1ca8647206f3631cfc3ef2940b60f81ff8efd8a464832186d91928d9821c966a3b1e553ae794bc6c3a0c5cbedf763ebc18f2037f2c221918d7176b17088a30c3f02f70945f09df9b1a6379b89d5219c21292216904c5b43bd28ac8e0c4a0814f885fc4151bc08bf1f1533c61e7f6f56b6e8a2ee4472c712e8af374e71820b1c21d0e3f915d75baef9f1d8c02227471160ac828b5561a5386ee69c3159f8ad93da1810d44b9c9b88f75ec1f83cca7ecd40a2714fa1d9a9e71f76d89c77eef6ae9224c2f256b9a2d1213088a0806423eda9eda3f7deb07ca5d4cbe13bb9065ff7c85703a7e2168cfb062d2c117f7fd9af8edbf8f92ec5af25ddc76f83b45b29a67bdd0118910b5289231b31bdd7010b42f982d17c4182b66d07f4de3685a83277ac851fb92fba8aadcc9294a49914f1219b3ceca24c38943c8b39c210d31b5d3822048f70ce3dc1b37bdab692053b94cea2ca27d0df783f5b10e17e01791a2f580a8c60b621d07e2bc8338c8db6a07c86a1ed569cc78cdcbae00d751eee846e13d948fcde9fe314ea84e92231f5417e2c959cc704eb23c42a0ca13e0c2e942aa266744762dcf3cbe1478ac54382ee85598e9a17e71366e2799611043d7d61442b2118d5b8b3b6f76db13e70730c51e2f86c0d08f59d77439f3fa9d85298632a4de8b6361c9bf0aaf9181e38c3639d86d113a3fb1b9a08e35d39776befcacaed55b18e549e3e03fba66e706ea6bd53b203d767380efd758a486e3f04050112ac8de3afe4cff2efcb0b936790a680dafedfc9724b9e1ccd22e50b2d76670085822807e238fd0a4ed5697fa48b5cef2274eb32e800684068ca49a2f114550868ebf387d25613675da6e192092aff13ea281af0f76a7272f8a19904249739a09c190891555fc51345a8104a161ee67090ccd214eee8e22af2db1ab00e24e2590a41b743e359cd6106b75cc1a86f3625048285c2093d2d1383e29309d7c4f734544d7318f840c5a0001ac5248e5290c19363b59c66b31790280bfe28df302113db93ac40ff08f92f93e0b3232911133bccfde853f653875374a4455161786642a242f322a9e3cac72fd0ca637ba947a9ec380af5d7cd5abfd8440133b88fd505a33ec15d11d60a0a81dae1622a7d18b766e89acc951940bbe808d2989bb28d0414c30c38a7515e764b833655a52b62251ee6eb695ab2b263f7bfc7edea80f07160a09464b8a43095a1312080467353c14f06847de07e8ac071699fafdb1737cf7c886c0afa365a69e124dfef95a76d7342421bf5dbd36f7673d25626dcd77c04e0756ac749d3c2b4aaad9070c4d16305b898cf6312872183f21f57b08013a99ba637d3e7ee9d8503957726d6c019b8170852503d8f716dbbdf341fa6478b44c44c58895de006de04820c0674b6d44beeda9fc4f971cf196cd0a45a3ced5cfa49908a2e968714025a3210bf91ac9505358e9234465842420115203ef140f6dfa97ab5eb72d7ee7f4dd8043108d27ff18f33a332cb5f0f81deb657deaaf7245ccff48fc31fffe439969503706f6b4b2fca8597dcd012995bc0ab7191cd46cddfd8ef6324576b6c1a7ec523d4029ff0329c53dadee0b9f080bf369b764e47d2fa5416ccc0ffc66ecdc5681c412008b341aa9903c891122464c3d928fb7e0c3dd9a8d8ce59f039fd6d47cb09bddff778c5e578f0c1f8520f4e4654e6fd8270cd9ffa7b8f5e6631501effb5e4a9520a5e1d4b2df26395bf155353f37bb7a13ff50632cc0712d1ac81620170540faeafa8506300998e895f912518ca08636a2083ebf4d6aa9a5b5aa30b7ee9e092c4801331aca1a08611c68040e351de08bd918b042a9de3d3a989780a2464b0b25506dd497524173efc1aca65a65fdf87712d99f4e5b9fdb1ff375a2d3ba2bfa8133517a14c866f00444b2a173c9db11821ed08194d24a80c0b8981f1d54d54e1b100ca8d6cdf1884850a13063f4f2465b2082d953cc01f979d4c0d1316484c263c646c68430aae0f784282db8043e7591b685f6d5ae11b28fa3c06bef2602513b4c85acf09bbd622be510b85d147b572e33e0ae1da2c760dd7c9630fdd0a0093b27675e98f9c9ab70db23dfa4f322f41cba9d26550ad0b4a3487a961feca722fade93344a34aec1552d7e13e997ba8eb041c93807522559a4385a676e08c338322572952d2c1168878f53044ee770a75878e6f648f3e458c34174f708da94baf3bf6c6b4fd6700e113b5119aeb64429afd1be91172fd80ef2486815107fc9dbeeb6bedaa3f02d155d544882602efff75b11590409153b493eaae71fe31765972bd9f890313a938656876ffc0334e17016c2808cc5444344fffd8cc973ee41ccce001af018f4d80393be931167b32c62452057ce0f9e3aa4b8f0b56019e272315656d81398e905bc5b7fea5dc5791a013a5b55e4aef098a6575de89634dc38e4c8833303cc3240f103baca85609b64073c34459c00256fc74cd3bfeb11a2e6a0915907381fbdadc9e1dd26867636997abae62e4292d25615d0f7553af77f6f0e148aef5eae9b95ce7ebddbae3501d9b8b1846fe427026e82c47de45cf81c93582720115c6ea46305253fd4ba0eed15d57d59d67c93745083bc116d9befaa4e4f7674b4256b21fa65741f14d506d04a4eaf12379a411d8c3cf6428ca712d4c19962cf27496400d94848febc4ae6661fb403a6d9071c95c35b0ff9b8ab3256e0d606df935905ecf00de1f401451eecea27e60c68cbf8d456cc7fe4691c642c09a483444ab843334a78882d86d01851284ec3d9c2b19355a19ade34c6c9a2cf064b21f752730cb31aa19a3db96c626be18ed05d68c437bcd3c12cf013295af1d86df778af51b66659d6da9e51855f442dc5549926da0dceb0f1794e3c668d4b14ffc622cc53c9db3be53a7937a750c56eb61826354e553753988f6f10cf0d12f5304c9e0a55b2d0a704b01c8fcb558aab3cfdf742fb07c739ae1ea91efd9e9a345388f94d70e61d75f902c851bd9e56e725cd3161d98203e0f02d27b2b45fd489870ea3ac4a4d06bf462fa6eed403f30231854c0177790c148653ae8c051bd6fb5d31c6270cb220344cecb897e6aeca8d16374223225bc3224ddc938abdd9222164c7d53eb1f52ff04ba9d74f5f5afb3b4735d497674624602651b9f7a218d015cf919d814ac8e2a55dffedf82cb76cc5563f4b51eac39442de03e28f9c4b50034d60ce19a87a4aebd43fe65b6822ec8caaf8bebd404c7a3df90572ab4f8c6e5028473c6545eeaf2856a1e5478188254a4553d9eafa4cffed7042368d83f9a974748f3443462102d920c041b1f589c0140da4449c371bdb3e83c42e9cf0cae98e6b6601d021090bd174cad9d230cf71b1b626068a293be94ddd21786fa53d6c41325976537188e50d83beea70056a49645a213a89b117e91a8b947805236d41fe8398c2dd775e70fa0c185826443b942bad5a6be3c9e203f4c79843556820c3a759b0bda4923dd7aa60bce3d94e59f35cbcd5b3bdff8a1adc898b5c7920a5cf4bee91f891dc321fdf5a001708d9468684dd8251ed1e3b29ad11fa5ab15aa73b144e8c4cbb69966b35ab27bba5b9dd2f7ac7d7629f7282c3f8e7f453068945d47d25516a21432d6a522482eb65db818cf57dee158b788fd7fa3de6b1fefa39be87fb3a3f71013963a093c5cf474ef0f936412b2438efbd08aecc9bfb2e4e9632b5ac79f750e6a843927489b82d4949c02fc8e7ed749a5cad6158540f98abb4107589bfd6798d626e2fb69f1bea0fe3d4cb61d89444ea0a5a93bafc184ba616bafd9917a5fc0bdb427988dd73c66f62d7b784af2b62fba4076ddec14f472ed8d563540a4753fed5adf53905d79eb00bb53b30fcccf29027825288244334f1ecfaccfbe9bc8137f53725d794d0a51fbab8f37edda8b9298a689491847a09a08658d4defa3fc6d1c95a79f19dbfa81e980b8b7610873bb0c8a98f6765248cafe36b419703a78a1496380c5100d79149125b5c5651454194ece08586fa010526c57b7149d361d20c0877af6ba4ae0864016ba85c037d453408fd9e8052ded94271645af574365570d3d0cf2a6e08a494b74919232c94a40eabdfb87e662b3e52d1419f7a02c6f7010e23c2795eceffffa8e211b883ddccf9e2d2ac59db7a6f55925349f724bd989dfdf5c385dfbe85afb7b93228a2277b90431177e94484f575764516ae385767adb0ec02e931de478e2fab29156486281f5ff54e23721376294d8ba5a17409d9c5fbe341ab6e47aa511505d6e9621a1c3ba50e47b05e311b21cdcec16348d08b8583cc5fcd0e5122f240328918803515888daa9275b0c90dbb3d51311cbd272cfc3381c3c9324cd6f85b6c436fc120814dab78269d9c6534137a129393d72e4b971d26d57dd39a4645134810668c1365704b5f6d0e46b5d639d61f27b01ad551cdea81f1663ff6603ae2be0372dd33b71cc2c43a314341d44595ee639d1b7ab8b7b7eec8d5d87639a4c086bf70106e9ad1d34c7928d49715fdc02dd7575c5f070491becb88898cab08e19c1d87b12e2f4b4223223a67b67d2374741b87f20f078ec16a4be1d5c0587816b6477a81163a51980bcd516f169369c370ef8ca100f60b5e75599af2f73a154447a23ceb14f5fecfaff4e5f5e1e5e1deb6b45c3332f9f3ce6a34e9f57a44712cc4612e9d3022453bf5fd4b1f46d4eb03792afbf766184ff78a4e35cd5e5cd862dbb29e5150f8f93563df92c499bb013cd5c4a4da2f2a263694bd471cc2b94a2deb31fbd491c1f60bda5e8c9471361c401a2d2ce15bd6615d381d6e732b0b7341015bf93ca70f46ea09c3c2e20c08ea7e7cef8a730684d23a26aa44db034a51b4582f81c246d37a4655b3f32047e76925053f8b2520847dadd7cef1937a0b89f8e24945b1612034688c4d1496a1d9249567fe98ba71c87a8cce1886ce557b462f327e45865815b5981c630a8563a83e069bf176aea990f66091934b142b2811030bab6b174cf7e4ab90bb8763742c9e49e16491f518f93681dbb5240e860ad69c6431303ff3725ca857a345e871c4753bbc547090a41a42e30a0e2241c76491bb32fca113ef92bfd8704ea7b6b509f9f2e9a5e29bbd95af57f560289e9b92839ac07b8983ca6551d0847667789c5ceaa48483817cc49afef9a2897135583f08ee8347068f1977e6c5bf1d8cfa6e7743bb865686af90040280aa6bb29488a222be216438d1a78bcd1b7d17012d3da2549968695a9b34e1a4cde39abb43965ef6f589a29676ca4a3434d051280e5e47b38c34fdf3a521ea46265210d5d301c11f8df3579e6d056690b211fd813d34c6e377758f281f681bf59fa60a0358936de579b711ac6085b826608abe087d46bfbfb6d6f8a75fe41447304dfa460ace157cdc4df706e6f4f39cd1c38a464c0ad4a9db69448ef1ac9c064ebd4773aa40c343f042923627e5a19ce39051282cebb844337013b742e30f6a133372449f4b6ead9435210cb0d8796c194d8832329eac26fe3d32b72f422ccc5c268ffc1ef4519a30e7cff88ef3d8fa6c173ef8dd93b9a7066441fe014e211a0d8f13dd39b01e3012d99961722132438c487a5f888246f1551687d68be18160f8f5cfd95b8f86b298048511060c6e66cd5f2b29641dc0b76afb0a88abc2d02691d955e24706293323b53034ccaa768422d27c26167fc21080125644e21c7857f0a4be2f76e314c5c58da5d416b0089d05952625ddbba528a704d4b827d2f7665446afede1fb6080cf8cec7df70e01a4617c0c5039405b8978a74fe087756b9da0430fbdfb1a99916312972203a8b5311a04f3ed7d9bd8c0310d4f38176625f2d3fdc250690c689c291f67f44ff6b794aa319a75a4d1f7d8cf589d70da014bfd789120edd1180ce8ef1eab87c7a0930c4de5feb08fdd81d2d57a91557a2cd979ef94ac8b0b88cb08e7345785605de9aab8d37c9e84bda0fe5b3bf82b2858f4d10feed4341b53405c045ca53247c6c64f67201001e29ede270246e2ead7f9aa593e2eceb5eef68cd77cadb0b773ab430def44395edd4350b9b80ac2e0f998045ca25fb6bdd53f8d752a9511bb1b76184d70786b0270868a9558426c8b35b0a883b789082bc9cd5f4a2c4557a75643bf37a0261df110d85a9ac6db82d1e48f9aacfd09cbc38847e35d67ad18d657ba9122ffd134bd1a4f437c1fb2dae8a07992b85e03a6bdb39f07b6971922663f560f4d96cdfbfd66730e409815e0c09765a3a1a6bf4445ba46a0556ea99c9c82e7b87308dec95e8983c837647e3e17bfb6c7452224cd4b7d5d4e7addfd9b6dcd1f62c2836394d4b204141c986867671281cfa0eab24c28ef5043f91b1995a363267dc7b5eb5c35cd32599378beca4fe125b08a1c6f8d09dfcc8a14d41f60a9513089d3af11a4384c8eb4460994f86dccd9c9ab1ea7b7f6e6bf032d3bf5933e2a8ecc3117f5c5af91b9212d76088846b18ecbb153dc909336d3cc915065f73b7170667637b243ec8bc028d0767c4d85617ca0127ad802c560f7057770ac39185a13dc33186bdd000befa42c52be2e39dd9aacbcadc002de88ff6c8293374098906a2e3e8205263eda433753f3cae97411bd4b4ebe88e7847662d2f6008f7225d6b82dcb69659b8f7747e4cf2efcabf403ec9d03329c1a3f2e4c06c1c1179057e24da1f95713515d2c6d4e521af280ee9e424bac00e8c83c735a6d73337c081f2d54f1a898d76a5a37851b738e08894179b3a5fbb62b5d834893a1b71b0803762fd88f042e5dd3416bc0efe71d5dba614ca90526828770eeb8f8d8801b2ac2891ee61c94cc6cdede7cc3389bd32d9ac078ef71f892909a50d1a24b290fb9a122acb981f0a7e654c50e52bbc0d9c214e67667b91688f97a595fa2b4025b1bbf485e08e222bef4c5a2b5a72e2f722226a7c0a4064261ee2b6be08ca9d377ad760869225b789bb10bbc60ced413cd442ec15146c58cb0fd80fc97a5e2c06e69c6a7f5b4b0d4c93a04c377545552886dee783c534bd71f97eee1d561f10565fabdc75960bca4cf8a390c25908d5ae9e3b2a90457b0449f3bc6c23fab2ca5b6b6aabec0ebde1e0db076095893f6fa6cb889a1b3d35fc449e749fb700d138418cff0de2632aa636cb21df0f49ccef5039a01f79cf3433154edf38a136258274c704b7cc6d747092dd779185898b6815c1b1434697ba220427efb2cd0b0c4308beeff11107d14c916c0427bb8d903cc5a7bba21bf28ec44865a8b915c88e284624788626452f7a382f93fd359b677cd7ae2292970889ec7882cf5c50dccfd0a78438e0ef498b657319de5bfb8807813121144d6519aba464621a9df54803b74c56de342d4df2318d0771962b349952d237a17dab7f01c6b6c0f528fec15a80d232c10514f84bb76ab94e321313ab54bebccfa56f0b6a2de5267b7962d45787cb43301c540644f263cf8cc52dfe0268682b88f02a0bbae9613331c68c68b02ebca5db5a0deadb9488c13dbf7b0ce82173ebaf83c16e3160c2506a5bb2b25b0da453043e065c1c9807daea04d1853970c1b02b335c6c8cf875e71068529d3b09c8bcd62a147d6ab7f8e19b09662f67f2a0cccdf56b2e22ab643753279d2d42575baf09c7a7216bde428303e0339fc2995a7689901f13f1c0dd6c20b920c8815c718ffeac314906e464b33ff91dd706304eef29dcb385afabe328e22177ffa8bb5732b0593c0c0ed1050349fa1ade4824b47800a9eb63863d631704cec78b0907e52b88e67a8e04f2f1896bef14a72133a7cbf21e4c91874b6cf6108c5dec291daf826ba9ea4e8cc99abbdb36b1e423bda3e9a2b827396248cd00016797f168850b48ccba87a8345e72c85ac3951fe9216236039c259c51d81c9aa0a534c4fad90d238799a396216ee8fd54c35c441956f3d93e108a339855eb8e7662b2a604beb236ba2eb4a44b9173fb4f613c440e2847afd1a5a1ee3ed8f817f31ab18f5e6554593d12bf93eda059cb31aab6852eebbd6c22ff67f615a04d30f7db6d64e087d52216fbc51559c7acf0e58b06e7faf09a822a9e7809f25871622908b7b9e3279792c3845f83701a4109bf5f04be27fa1fd98803346332127d7cba2137e4fa932cc29acaf9658e0825f27486c34496f45e0619958e0d1a67388090993dd2925b57ac0c8080e90cf9fe1205df624011938e9a1a6ba50e390c3a3a6c3793c7019678ab5bbf4ef8d24322264fa5e34a1888d32a3b56e68025beb7be8025920e9a0bdf7224d5132169e6fb63a02fa66ee10c703d0a259c8da12c4bc60020f9420fd347e0422d0b48501106fcc03d1968c8478c35e45a0b2c30441776032830a1a0dd00316539222cc303dd1f9171ce498a302c6f02c4f58950584650eb7e4831a099a24af1e4a9ac78487c538d8602f22bd11583d6bde90217efda965b13af417096844a6e16b6aea9465a092fb29f8a6355e869f48c27fb570388330b0579b1ab8cb9d397b5d258db3105ec3747072a4f7af7655812bd268d89964d423c599bc3e03228339bc0952cfa0772bdeda70ad8c42096bd6dbb226de27252a46d0692557893bfa032be8d17e8809bcc4a39f2265ac5d5acaf810ff047533e13f7b80c1abb3217dabebafd3b2241a6cf745cdc6f9dd73e1aeebd2f726cf74163d9e34c2dfbf37d2392b25b8e0740d21788efaabc0bde9ac980b76f980217a7b10539a79de1255b88848e64a20c05f500a9df3a31a9e9864210705bc036a41b40199068b51a206831326810567a3d88bc0c5325e31929e27063a602c48545fe790a6b837236b67ccb34976a58425eff5aa0e4d723f42f3ac56b8d23c45e68aebe8d489df7df6ee140934dcfe66bde34426694474acb9219786b110f74bf6d33cd19dab38794872b5a24dcf332deb8dac523a72f7b21d66063b508fbfaaefda9ff1a816fe21b2dac93549252dd0635eb1afdd885659880e0dcee17ed39bbae8be15d4f016a0315c8f45fdce6af8ad0b378eed3507da0cceb1e184c360440e16338cfa83dc3429ef57821ad5fdccce7d4237694b149fc4cf62a79845f8f286e4370ff2300f97746a93f0fb8f44d8ddc0022796394b19999856754dcf2c1f3470c6fa94ec45f592ff03b7fe48e93b54e1f39b15de38d4310c1dc81eb495e47aea0270f4f71c484a7e54279b256a42afac3f71dfd11ab73e456e6b18385bdadd0613bc0caae448b523f0db90d094a854dff3cf52874bab2ebde982e542abfb1896a7a95f4708f905257c21fcfd41ed1684dd8dc9a98692ac7a9c83622bb93c7773d743ab87db694c7158242ca37d2c1ca3701c2fdc51148e067b38fa2233818028335cd673adc23a0c2140e1a087d3a294d9bd1d7b87a251a10b4d845c5ed3489549a26af58a320dabb55bf8acd4c063c28a19a11a0d825985b2dfcaa49367434a66c07e0b678ce25ec4a9a44b103d074a38943dc5916ac14665fd69e7ff784809385d1ca0ca280ef78f2d71f00381007950dbe4914168af9b150ffdc795a64188764144249e0aba7ac4b1e459fc083cfb50c7cbd397054cc52e08513c4504aee3b82ab482bb6caf69463b3b0733396d873e8b92311e160e80e4ae8c9ae30c1fb3bd161831027e9ebe374844c34b58935cda24ba85b7a30f58432722d01e8852527f3c5552b7c620f47cff4e4fca9c58359f28d40670bdf059afe5f8c52158452211c792ae245208b0fc04328ea2eef4e24588ba020dbb9c627ea32606241758727f7fdd38cbb4ce085b4ebe9b8d98fc7a8f2ee2d622e07f423535e2e61dc85f2d810f67c698838949a6064ee4cdd64435b85488092d9a49c22ae33b122b789812f318d259aa41fdb47372e847211069cfaa962716497f6f7ff6cd290410e1b73f9594255919adf4e8dcc21d985752065f4b1543a55bc111c594667e1022ca447d62fae40851e1a24b10949c3b88f7dcc5706797c0befe29519945b39dfaad2e81c47ba4d662f8840dafeb3c22566968982ef8c53b86f18d31a19f988e8e34385fd89c96462aa11ab3d1440349aa47845953a02c708059a9cd905eba874ca48456df7643fc176387234a40ed1990405320bb7d35e3458cae9db30b41aa2953489b0e160a580b124824bcd8faa940e236ef4c224290eb1b9e309fb5c27162380e2545d372e58bba7e0e650d9534a71507ba59a986f54dc2d57b1bdc7e42c679a4cdd120eac6eccb81a8a741c991bb70a2322fa8731f3ac2f2a6586141c07d4e60bce44b075127826606b681edca2b4908639c29ff56535523be09a1aa2096134ad5e402d0a9443c572a3d31b9993dee02db7e015269f6ffc49426f7a28dcb9a0cbac83f957a0d9e1fe624626954185c1b66460a5cd73c62d61fb4bb7aa4607c912524c19d6797d2965a165ce652b6f56f5724111b2ec4a6126ddb993143dcd0eb14aae94f19907994899588e59637588ea5d24931ca5e18e092f65ee45e7a80c5eaf9fb8710fcf3bdbb9408755d45dc713c4cb7432d5b1eb9636c223492118ae5fece426f59bc08e50ed53a649043497d56c0fea470f6ff5f4872e27f9a8256488462620f49f6ce2515fd32820171461212e15e438f216f6a8f9e8788b8b058c53748e4fa861562be935768515c3601d9faaefc145066152ae5de70624782a9aed3a763dbb81ebba776230fbfb3e547f96fe020ea913c0e1080848335cf9d5972c89fa4d6c7109185e49757aa32b51028a28b71e21e50f0b2114d0afa4605af1f6f04f61664143b6e06be64717eadef223f326413ac86c94d2690255dfaf0a760beb3d4ebfbd82f5d3945f2cdf6f265f32fc3e7c3402964bb2d0030384d2d34a46e7e48a398c5ed783aa91fa254b291fdc8a879240710d03c5d7eb5466cc629b1e4e55a147cecd3e4c5b4af15d73aa34b412f43b59980db70538f5ba6246107b893957c41054411532d117c05bdaf0138f0f37d37aa0e6cdf02b4277da9f2e976b67acb82ed19b9021edc0c57944717c030179c63732e6e08bb5eb01a45c8e6fcac47cee7fa7c3fadfe971ff84d182d2066ac183d02cc0c7442f97892e4a1b1c987ddf779a2b39140e51a608c30b70fff4f9cc48d594ff037a1337cb249560081b103fadd503352b88cdf19e4388726b9f7668b5fed8f8d6fc4000dec8e5409e86119c0d616f6fda196ca16b66267e6c39ac17b6aaebc0355a8c28c54928ec919437bf5450860cdd96751aa6d9e8ccddda9ee9a3d793ea2ace9b14d0049d735442b892c8fd150c6d992c45d2fce892a9aca397decfc89da90dfddb99a824571246100fdee499ef0a9a2d60e8c675aa833c9c5bb9f586d1b1a6e0ade6d0efeaa9a33fad55cc270eba5bdc8db75dc3f1cce50457f63e573a70bc1ade44f2a369717404d8091f7626b4808a91f18469c51ade5fa2120ee89226ddd5728a289f1b6c3a47117a288bbc22268416128e305997a799d99b320ff242a0250203c9a15726d64160156734eaf37e0b1b8535404b6659bf17741b96cc002b2c4466aaa427ba6715db562b51564a0a007cc878eea1b02b9cc8fe26ca26d1a30c2304aeacac89658a3064882e2cea9f8487a861b1ada8a6d0bed196ae35401ddfacc5ac9b141bb9fc99a0aa0e6849413ec3c60c87f7561c43010d2823515c935cd0a15ea1b55834b1b8e1043b8f4b9d533d6c0d1775f6ae39b0b89c77404d20680608c64a4c8f96d5af1997ecb9f85bd00c533c4bea611b71c7ba946aa4724746bec269d6be6b2825a6d49b3bbca4ff16ab12e543d593dbb021a46a3fcb086483eede6a1d4384122f5fd94ce4de2c883d4513ce8212ecdd0db88e166b59946a1d4198959e872d6d1f029d8e4685477146a957a7c4e3c84413774dec4b58246163b227a1844c8f9ef0372c995eef42806ce21c89640cce7d5a48c3c76e608dcedc327646af69ffa61409b77cef7bb5552deef4325a20e89da192ae0d9a5005c90ca4ef79852086de7f1f2ea0f481b3887783d32985b60c59e105d11889da50619490a6689322308a52286ec9b2009452f63b281616537c2dfc6da774884212126639304088a50623b6c8cf337b41b8518aa844b2831fbfe2e7ec313e0d509f93475b3f10f51bf8e871d6deb63794c86e95803c9f2d3694f65b76d6abf8fb45003138dccba5554168763e635176ad8f999725bd3463a416d432d210accd6bd625b8d81fbbec52fb9a7ecd6563d71db5ee2db769c07fb9ff769463f528f464abaa25f3f8c9b6ab5bc4923dabd9d916017796978014027a7f57db9da70dc39fa633b0647a3a4ceaf86348f519fd5cb1609ea55b63e6fb6cecce131b371ea822a4debbfbd13024305ae0602aaaeb2a091914652c1d1b97fac7174fe2b16b3fc4ce4ccb7216ff499db59e04c90a0f4103935c2dacce139f0592074aaf632a829810640178e15073fad3c6827959665f68f8e4d323b5a23e316921419425aafe13fbd790e362c1635d6aa0dc75b103702a59d2916fc00f4a7b2796f6c2e63de1b2bec17d7d23b2f27a60c70efcb0070c24b9ef0f9ae2ac07c5c1e71d83fc62ad0af8dde74897b71ddec5125f3f72168b9c441d2a4a3de432f321a34f4d3c63e917f078df41d5bbc3f56719538555be69b3fc2c25404aee4856a0ab3c936a108ae71dd89861109f9dcba57926aa05e446a320905469fed05122a78ff9a15e44497f4b4e84827eeb7a2e4aee2468fd6711b1cfa66d6cd1670e37a4ddd94ccb2857681c3bc4ac28e6d94418eccea172777e552455df607f4359d03bc341577b7775dd92d0c4e5a88b005c23b9061e0987ae995d2afbf22b8a2cc5c8a13df0c142d6cc8ba8e01773d2f5d020f022d7fa85e33b8542f039fdec2898276b2db25d4493d17d390dc1115791ce2fb21fde3f9c1140b9a5b59185d6a63a6fb72a7f1c711bb28236c0af1da14167ae6085c243686b8277e207d677c6fa836c254c6cd27ce0b28f83ee090b76e76ead0ef984f6756286f8884cfdbeb4c2e5279f64eec8cb6fcc15119c29bbf37b40e7d368cde535bf59f1f0b377d501a9d72870a75c4d944deb01e2ffb71f8448a686f2c86fd707e754ebaaeba6235581f67a42165ef5dc5e87e26b1939df33bd9e3aa4a5fc8226141500bd2f35f3866e8413430158c0a89931924279458652aa389f7b18cb01ce4d1428afea4f261162b8a724180f7c72935e51294c5d53485a33e378656ec08b596eba1d568e74418ebd6b7bc6aae9b993a0849ff156cd172a6816b010c2dfe2167467c52446d81c58ab28ac74610a5b16cb82576370b8a30fdcc90be837cba17217163c44e55a8aaac26a625fac3064625f2a881e964b720f278d31c58851b2fe21123a09022905f470b6d328d3ffbd8178fd73d120bde3213c2b6a62644e602a5181569b8e9cbb1e468a72e924ec811d23410819ac497e12d0cb7a958831cfc373a82c0acd5375cd0cc92962c4114b188c59c04357ea31838a1cfbf9a3725237423c9b30f64e45a29a670a90f33294c64a35780f137f0fb52fd4a8b56d65b4a2cc1da8373470aedc20e160610beed19cc5e9b1bf604929966016050d5440704b7b24373eba894cce81223c360799e8e87aae12474d7b5623a7a19b45565acb1d671c15fd148ef4038fdf699d2b3b9ea9c08e3981e416e851f9468ced9c96564046c94a74921f0dfc2aa66890fcbe7919f32542b303b6215d865b45ce01c76ad4e0c4e1719c40318e0ebbd39d0aa8100f59230b7141805590878cd793616b8dfb35023a51d1d8f40c8edd3469c9caebc78c70521c75c21c8279cc83eba2f7ae443146dbcfb1c1cba900b532258430c1e84683717d00f6c3d1828e4da4184f657a5ce9a9c95230e86917e445794890e49e659d213144502b9aeb64749c4c1df1161e8eac281a9afe739e7203d25b4a032fee3a7fbee0104a602cc41191e89c55230747a6d099b2e9a96c62765c600c520f8a84b52c09d11e4dcf670ad31f560aa5d85a66ce70a4e2b99ee960ba941a50edb5247412e2a2c9bad5d61442a5e147ac53042be9a27a7630c188948368c455b91dafa0ccf0f315cc4ecad8e0b0d0701c7c5cb7c85e224c6505fac991c24087817da3eb748e4d1792b1c1a764517600c8e9c9f7876aecfa1cb2f06925e4f9f9dec433b8c006944ee3bbe0de67a640587dd6724fa1de1bd91b468468048b692b91ce081978ab0277f922fe3cc61fad7679d5533183efe330547c6690d5488e085c08f9451d987b4b3f6623271e350e0d4bf7dd2d1e60c3f1cf976233aa34f6665f44a89cd09c7b73d4e881a2a300644d663eee16aec47b5ff1e5b062cc692a8baeb661b15c1a3cd1440df9f4277cb6c5f9413ed911d9e31bfdc017e2388c27a223dd8323f51cc14d8fd1732684241eb654f6192d1789fdcf5f130b311e3c6ff1081184b1a472f158bfd7713386224ed3d964624ea7697c1d783b8abd2c048e741268711ff1198f31f93aaf2784bc79d348038b0fec2e442b7a54b2316b49adcbf41db8cdd0f76c0b2ba4268747137cea38ddf4c237ccf88ef11a3ec5a6e39e6fea59b13cb30b2681a18cab596541365ac8469237cab06c97f811d4290cb0705c1730fa66e21c5c57884a687026454d65c6205fcfb0d1dc934b59023fdf7453e0ffb5b094e8344e1a89781fa3c82850cbc312610b8d83d3a18d57941608ce9d01749332545f3761dab11418fa2b784dd99c6ede23bc306e6147cebca4fc15317c45e29cb8abc3f04d9981694f916406a2b9330986831a625cbeba1e092f619a11a872336395d23fa35b819953e21ddfc54f092de004851b78118a8e3c9628c7e00a94acbb34830455b87aaab222dba61cbea9e4d44a08762c6aba767aab1b86d54ac03cd52d52205e9a700769b7ad01b3f2c84eb79278e047a83a9d5d00ce2a1c253fedea7c7e901c504aa0ca97c4bd094efa09e6a16299652841c9484bfc120b037273e9a54a468af374c89150cd8c5784d2306f38c0dbf91160a597582d8f761e423ca7222033113f57c192c4d38d5fa690e8244f5132ed89dfa1519f39b4a6631690005417a054074cb0801881ebf4bd18a2f6e31ed3bb40e39612f5ae02d3d0900a875ec0b6f4b5ff3b1cc17a2947425c8b40a16517f6f8d59c9a382eaf64569f4cf1ef06ca2889a4484e59a1b33eb43f7a87d6f66cd04b2cb11031635af7f86656ac839c752a33f497563c5595ad8b6c2e95f93c38d58ca46d60386854ff8f8753bc8bb206a08d694ecd7acc6cb4dfd525d406bd1c88050a8aa25afc0f501cd71c66b5730fa527f1ce1243035ce18127f8e63cf0cf1ee095cae27605f20c75853c9ec9a800ee67917544ecf025115f3fbb4082c0a8dd0bfa10fea3ec7b52ec132f87d93e3a60af7ed747694f8c3314d2d26e1325567a2fee29196c21f3ac72ffb44b7ecf8bc445af11469c762a027a76c362b650e02e473833e2ec2bc3568112142b0fcf92bbef2cf73fe3b405f4d28a13a21acb0667e07b094a3133f18cba5b68ce6cc297e98d5d79595f365b354662d5eea1f109bade71fcac712106f8f8d7c7409b57b72d57346c4629f971664eb13fa3aff941afdb1cf67fe93b029b44d863c8d89e55bba5802673d1ad811b53323864780474396e5e8a2012eea5496390e8f8228e210f2e9bc4099c926cabfdc64a561147aa0a80ae4ae450c66fef64d086a7525dc975d95010ca0fa9d99559a7c663a54cdf1c057b43ecfbd399fc40e28337dfbb02c963a1641aaa9d4dc0b05570848b41dfe0ab77a333584bc8890105a3812c14b5647f7a0596064a10ad89e6026c534858d4938aa7f55cfca97da885ecc8469cefe55d0c4ed8df093e6a91610b0545346009c637dae105af59f68363b617fb013eca5968d7377632284fb560e813f8c38ec2eaca970f98d6db67c05d9d6c0c5b89a2012969fe76f91e57e07e0d608f7c6c087e5ef7ac38d5e9e67eb0b574955c8365223b232b7de64ab424708f5a42ea0f9d7dd07057cdec11c442396a10bb89312a16429718424619f3bcd2a7886bf580e22a0b7480a9d291fd618b33a99e1e427e050b36787cee51c111f5bee5e5a2b039ef4b0fbbcce7cf303b53cb87811d1537c7d679fed7b8619cf60f482b377b8de12b56f30c7fcc762b97538003cff7e1898242a65a453e56a3fc0d89fd4d449ed92b4848893aee45ed0b71eb90481fd33c2ad8932356cdd10a4e30d1ebf8c5d8927a6522f1edf48345485b8724fbad25aa9bc16a566a59a138d4c61cb2868c027fba9043c23fc844ef31913c945318ceb38154e6a0441559443ce2af8d107f7ac430870024f4f322f512e4e641999471fa1ca0986516a43008fae7e7b828b343a1f1a85c8cf97354ae6eb253cfc45cf501a9d033fd2bfd988100fe5c05019a5aa8f175a6ec902b988544289c327198382137962016e555b7e7a3804d7b56edc8047a33e7b0f2c65441fad1c80c4b412d4140b1bbea1245004523a966882eb1912dc0a9ef41741405dec67a09d0ad0dda336e1b4df2c8bb3956036602d2ab025f8eb442f1cee7b7d6031429f6a85e3ddf75aac855d701f484025aac51595d400cd24a07d7d6aa264511b9b597ae4057e1176d0482e3006f62c4ec1fa591612001b54aa8c992a4da0e58e6eef6e61e596527f60878c99f6ca2d9b9dd37558aeb4f7ab9a8d380992351fb7af9398ffede841291bd37217b6f996492293205e7056b0551c0ef6e8c4f061583769d9325cea5e50c5264159665943a15afdbef764dd6b80192edc1124bb5ade0717b27d88ab8f1d2a5658c018f1b86a5ebbe2430ee3db5d4eeb9adaeba6dabb5b719dcddb9544e05ad1ea6a94e4fa26917dab5c86d75e38e6dc7b6c27aab8165b46cf59eb7da9ccbc1c5bb6eeb4497d7ba6d75eb28ac7dd6e91b95e6d2b5b65c2dab9fbb3b753a3798ed60b0d94cb9eb105494525ae9b67175b5ac3a57aed4290ab8d0ca71f40575297dd1f79342bb749974636206266544e706e6a5cdd3c52d6b597753da4d9b9c4d7677336566e6d97101367657052a07bef8ea9cb35a3ae7b6ad3ae7aa37b91e5c60f0ad1e1d574d5d21bcb8711b6bb4dbc64c79c5d4683e0aacb5f673ba74b4312ff71cd364c072bdc97523d85d71efbc63db7157e794503ae52adadd29a5eeb452a74ac89c7271efe25ddc4bdfb69655af75dbb676f759c51b5de75d57dbab7be1c2c5a8762ee709d67a6bfda424b94cebf2744b5897a52e4697695dccdc1246eb22352fad5d7caac7024ff2240ad44a6e8502c9508a8af2a4284fe269a530458a14efbd9ed8b295528c53c2560ac3306ca5d05ba93bcadd7d157efd868181ec5d7d38ba9496b992d3adcf25d9247f3d71d50840937dc2a5b095c22ffba995b60fc5370cb0af3dd53ffd5d0df6caad0ffbb27bb875555b0a451886b0307c17ed713cb970866da595ba4a092ceb8b42a35b513c0ab21da98ed074c69aad9fce9a3f7ffed763c1cb980005f88795e2cbeebfb4f7f5cc401cfbcc7fcdf95d8a3bff75eefc14a3f79d331c7b9cbaf1236279b56df030ba9f2b292ca5a4a4566aa786eaa85eeaa7c6726bab36dd1ac3f36648d9923c894b8a41046cdd70295a3dc3ef25a6a6567a8f7eacefc6ae65acdfc61928dec6bcb3831410ddd64f9296717524a496d16cac65f5757ee74f3cfda424a0673a0155a569e74b7fb2b274e3499ee4525c49c759b02f5ba97b2739303788d1911db4aca2203937f2222e547cf7221464fd1f5d88fad4f7c0988e9323c5e8c0932051a06e427deab7ba4a5b89e9d01435ecc66e6aa6962db5ac95a84f45c122cbaebe0bca3396f3f2fcb646053bbfe7cb56ca799d6f256e81a5a3faa7e7ebc4b1170786f30cbed079176dc1786353a2405d542b45f59023b4acfece97ad74e24baeaa0102add64fa52a6da5f5fd6ab533c2c628295ad6329cd1c6bc652b85a3920deeca888a8a4a413a596badb5d6a74eb400748042530191d7d3cb074b4b01141c685366685345b422ccbc9ea880e81ab1e6729322882ebff3379dba5da9925326aad46de00bee5f6a2c14156c57cea83ba32859c26814b3bbbe96d59f533305b77f4acda82935a79c4e6d2b782fa715ad082e3f20390015114338894193664a903389c0eb8abf9ab093c5b744d41dc0659a981faee79f6fe197e0652010a88ffbd7d6d7a05e73bef46fbdac7f66d47fbd5eafd78b74d1af31f67acf35e62539406f140f509f560717944eee7cab7eeb7d2c3bf71d72088750d0eb2908a18ece2d790afcbfa065feb1eb0f989792fe4ebfacdbef8c433b3b0f1b3db0e3727d155fdcd9d9791d388276481d382f56b2c6bfc828b0777d949dbf69913863095388a9c951119109398286b84d500e59b413042379c05e8728c2602fc2c4d701fb9cd781b3f33a72704817d4a71fa7eb44b29dc2a8ff39f802ac4fbf1fe9f774f49f171ce7f52ff9fbd99de0ea2748bf7b91b1dd9796affb53ba7dadb40677fd9b45f92b988d7a5b46eb37c963e775c0766062ceebc0c9c1c1f91d1e3aaf2347270796f33b275e87ce899dd781edc0eaef3cec775e07ea96b1cbb42d4e3b309d1c1c9169491855776ff26a9c219e7ebe013426b4e480030bb433416e98817bd8e189922321128c5922021a1349b4333acc508858068520539cd6c08025c969088d7c0620677ed45892e58b101a4e00b304ed8c8e5bdaa7f28303274547cce8c0b464a98a0b2c413891ca42d5040b324420f411fa986939b183abae11e02ced7076959162cb2ced4862ddbd0c90d6501b35ae323e866e4eb03a818a1566a8d65a7b9031c2231366a8cd8b8c0940325b88dcddfd8909a9214e38386142490c649a7e90b96195b303d72524f2922c9961284b932e41602093838c9010d45a6b65336a5e402a8a8aa1c913a5315475cc19a336750c976dcc971d6d702ed3cc5059025ea69951e1bb3a790c162a30e19053773348d7cd18b91ebb2bf09dcbb4326cee77995666cc2dedf3f0026781d2c3d29212506569018530472c160ab9c7700801591285c70f2f3df8a02281199b181b2936b1865571814625f54a037ba1b1250c067ba5a96ad9ab8cedaaaa9719209eb7f462e2f5e475e675e6f5e4f524c9652246445c9c3211b9650745a32e986bc3299776daf3a5260acbecad82542fbc98789da1513dbdccd0c034d194488a227e8b1d8e07b2c096d7f2a87d10b4ad96ed3a16ab6f97f363b1baf7be9fd53df82ea8d7faae63b1480eec74ad9665756f7f46d712bf25b6ba6f91acc11245511445513c61bf652dd9df02c756abd56ab544b1e52d0f0767249a3263fbafffdb9ee5b11efcefc5f1fb09fa37f8bd7f64e9912c328af80c96300b9ad2df2d763f8e5ba3694a54da972ab77a01d373ebd6e1b8e9b0481255b42f4597695ed6d0bc807901d1de6cdf3ad6d7b230984e5718fb219104892077beede69c4d7396eae7ee5e379d20388eeb563949b0582cef635da621d1a6f5812008b66e361eaecf5a6b5daf5710f10bc33014715a2ae87c393939393a307fe1c4b7b3b3b37382c72583055f0ff862f67c4f0f08635a007a2818641a1252685e9a3ac537c7ef07efebb089304b60b0f090c38d932335c50e42f0603384871d4749628c6c1227ee354a982476c498d0e30818e6e90b1325e448069769470c71732ed38e68da76a830f86ee41c400c4984a0cc10060d19fef2e58a9227477620420491e7dc82fe772bcf063d6f1d37e84beb9cd503cb911506ade4023af0601643c60acb40348b0f5a84109aa2821f82fa610c848308d416a72134c860431041fdcf40385258926605587698d0c292a07e190349a00710528cb61061839aa04981e876b1809675cd9e6f640370cf0f8058cfb52a32b81a74ec0160065f78e173c081abc705070be0c0d5b36a56ade99f9e15e5fb85a3087d815e452cdf9bcff5ab1720cbc117b641b1b50a377091a55fd7bf7ee74b169712e0529f4bc74ba94f5703f47cb95dfa5d142d9c5b884fc992860697feac652c8c580a83768055f4f78c1e9818f4f38c374614e38ce1bf43962960ad43e69038e4346215fde2380212e2c4228a566c0244e004ea0535305ca1e100426584903205052b5a82c277fd178e3f6eff6b5cf1c2f50caedee53f57feb3ae2e576115ed4137eb1fbf3eab4c2badd56a07334627604209282d637eca0710a3a71f3d66e8a9e4c57a8c96cde6d16c89c71155b2741142e10baf816129082117804059e13146a4d01024898b1825ec24c504426b5c0042488707e0ea999d65d4c6067e6bdcb8ab6780df150ad2a9a96593a9653262fc30cda9a9e46207193448a8525873e50c0e100cf121071242504d943c087206cc1227453c518380205aca242121a2cc95596532fd943a4c55553c99b4dc9e555ac6dc651451507cc78d9331a0bf8d9455b00a5a7bb4e05c4a5f0845f3b432954411d892a13cb0808cb20b61e64c0c84e3484c102a2d34c920460541fdd38981be3037a05902491a286582fa271403e15062c4972b46517058c10f41fd338a812eb0e44996da910b26d021a89ff6744f198f63eeb376735f2b4752fa2e68cfe9d3371fe2087d10188829c9f3a5c3086cc953970ab90d9bb78f3b51f74ebfe9d88d1f13a03e37eee882c202809c41fd170ab6847110f7baa16723bb9fdd67c415301501b0e0320e03f1ff70ab1fd64f364073a37763e7dfa3b38fff8a142a6001b8ee5f52760a24fbaa576b8a5b3f356ad8884004be860d193c1fb0fee66f4812bc67f5db90c1f3c1cd73cf912480af6fd2f5dc7bae675006f8dc6b9cb9469e7e1c41dd7b7ef381f7ac6f5006f837ef323e1996bc2179e8b7a0beb1f3c8182b32aa71cc2fc1e2a8dd09e1717f351e4eb5a22d2111a1096a3eb408f14310351f4ff3eb6d1312fee05ef3513444864f966f903b89853ecc62a10f33fe19c0162e253124357505892a20e86104643a354421205146aa882f42476282ea95a9dae58715c7521b1a22b4f25dae150561c3666162510f3cdac244765a94838f4a5ad9b115b94044910f138a7e0cd58a885cbf5c2b3a9299a9ed0043543b018ae740db9bb536d4543361081c6228aa1151210a450080cb35221fb5a11514416b3992d4724829e371536f62c0eff52cc009588b96da0ea7fe698e5b701bb7d82ab7a8945bd0e6163db90503388eeb2639637bba6d3326b76db5ba53da3debd6fdd65d83bb3336fa1bc0719bf41484926a398cda30b5b9a10eb6fc8f59b1bbc1b29e21c0e29ed5bd4f06703fc97206c78d33b655d95de69c52c56236b8c76a30412ca4614643cc3d66e6f9c5e358b8c2569b9a6ee882edbee4291068b3940ccb3f714db76a00b4a27dea735d672d0cf63f6b1911528cb27a17dd4c7426b3b7254ad907bb16f83d73ef711cd9b58c2bbb6ec1e318c7711cc7711c0d2e031cc551fc17cc56700bef634039fcfefc9fc5797e7efe679163149c0f459bf3dd6f61af70cc19bf7db8678db29671235fd73f05c279d7f733c8728d769cb58cfb9b71c5025ac63d38723076d032eebd3106abe09eb9e77e72ddecb02b0bde56c97276c1ff98c912fc4963763330bb33be677d6439bbdf73e2f33f6b20924d72cbeceda73e3731f02d057ad9ef7f95dfdb0bda1216e3cee0bedb6c7b0a737653ea5ebf58f8c4321942b14cf2164ab1fcb505f6473d67d5d5f6d1afb556b61d7339c2a57c66e6715b7fbe536f500f99f89c33644229ede12a1053c17f9ba19318a55d0bc62af835105271f1eb388ef3cd2332bfee614b0e2ebf8f258beb1f26d9f9cc9d0e21930b5ab03d4ea9cb9642166870d3f5f0053b3f64c262049eb7c205b7905def65d4a77fbe6d9cb7bb9f210cb6b49676ac011ec812822c4797c60c4b072d6b59ea3357f382a32865e9bbb8e9680cb694b13c269ad2fd8e0fba79fa0be89fd2453feb7b5894068b06dce8610814a54b83a3ee8ab5226fb86932d42682ae3e47c9600dc482fa8863acbf48c68a5f6c39912652734d38320a4f93b66eb552cb54a294adcf818c50060b82054210d240dfe89feec892b1802f3652049f555845fd1ee9c89d01922865cb8954c32a550322f44f12fdfa134aff94ae010b17240d6eba1f5821082f5397064fddb98d7ebd0baaf65e70eb331317c4cb2f64f25de58eaca5083ea198525a39aeb5ce64b19e90491db965b57254bcdcad6015bccd7a8699991f267e4ce81017ac823560516b18c5ce771ab15b57c8624c389c32bff236c6f3d901d4a4738a403ba0316ba251773a4dd289054ff1944f5a43d7aeabbc824511eab68d3512206bf7c9b5d52cc86e562d1754e0ce1873cfa511bbcc2b58f4ccdadccd4df48777d3f929d370061b320967b0f38bf0bc56aecf33b8bed71e175b3cab60104227b57ad8c46912112c343547684d34d19a18425bc1118d0d5177d358a804ea072966686b96686b8c684d70a1ad495267e07f3822d0ee590ebe586dddddddb3c7c4a092cdecd36f3b8c8a81ce10444d0ed877ec3714b911112b5a8ba649141f9d7b5f1a26d26cb9afcbb4344f4dee55553cac98e6061e422106f0210c0a599658e9b2c586aaa5b00a88162a00a0943182882c637e18c26ba83aaa52210577a741d07c71a169a2885b41d37483468823b43446d2e4e0c19966d775676164d975ddb33fb1c771e0a7342ce2d5eb1133982d420931684eb0e2c353b01540fc2b20d6f373958bb27a8f670a6eab95e5ab516c1f510571ca8b99629425432728017344494d09162451892bd9c17d0cf5151e6a4b6a4b7a882c085163427482b804c5e59a92274a52b8a57d1a9decc432597e77bafbb3cf16a1383333f3a424152336119950f1301ef7d6dddd546cd3e9b59bce2db39d928e141393cc6662928aa6960298bad1dfb6c771bd0a3a60b6b993fc2606fd0e8a466cdff2bb1e573fd188f5ca2dbaefedb90634e00377bb3e637bdab70319e0b79bd4276dd54abae8a7cf130629035792fdc799db00cd6c635ee656536b2948dd1bafde6489e3ba830da80cf819eddc829dce362212e91fee9a8e3c9fc19e3fc17e15f8a42df6e8c9cccc350833736566a6cc3dba364ff7e279ddb86ed5d1233ae54a62915824165135133d9af2ba719bd7ad566f42e5d48bec7c168b264e793b07cfebc675ab8ea7e61113553781f2ba711dc744d54dbc6edcc644e575ab4c5e7d1e399d953cd51db61162151dd40c89d22d61174acc61b98604aa8684a986b474044a34c1720d49931a12540d0952ed48140fb1870dd9846c4236219b908dd82364239e10b209d98846a20f9187c843ecc15fce49760af01cc4207d2302b1fc747425561183876b2ccf2906b1fd5db774a4a866a44a14221e31333333d31ffc6da2917b157d783fb338c4ce6777177b74ab15108f63e2907d21352505c68b94d49aaa27a827a9a827a827a7d94da97b9ddd94bad710a87baddbc6d56de35694725db75ab158de8ac5f240ea7d1f08b65a37dfd76a2d59ab74bbd7ac69a32e5ab3a60aea492aea09eac9694a99493349923b917a4d1583011342a941971adc762616b39b52f73a9b52f75a37afdbc6715db7e2bad58ac5f2bc8fe57d1f08b65a3760ebe6c65a97eb157a18d29ee12b14451c9c1c10468e0e1dbd57d863c369d35b6ee05214d7ad88449c739beb1106341ca0893468d018f152a48d9a226c4ca82a628647d589cbb5224314090204454398c0a6fd32662ceb72ad88d32dff65308a30511fbe34e7728d480e446ab8e5cf946e607cb76d1b63b7ed68058308d28a4893bb11996244d55cc82c115b22b6c46cc8512c06c63df625f6251646c8901d428c7674976b4288b621424290c208c931a4c4111b22258ed40c29513b52e272976b475c8eb05cce72b916644d77224fa08edb87bfecb1edc3d5b64ffbb40f85a23dc578dc97dde3fe8e9d9220042b19905092c6cc8a9cf5da838fcfc71110589b73b906c4885bdaa755de24823aa58e05888551fb395d4a5fec0fa16ceb720d880d3520546ebd5c03d202125e19c52959c214fe293368d0e06f3203bf81d7f54f7773cece7f1e31837128f56595a3beece963ff45789d7775dbde46dd8dc7966dabfe934f90c312164260049b294882a81390a40b0322e4dacb3520396ef93331b35909ba6e068494171e6c90ca618448131e7a6c59f5404285a72c2b243b7c60fd38936406b3523b74406c5801798a726669051886f0c18685a61e4cc01e52803cf5f0d1ea81e4e96347d07e5809a5c8232f39865648226929c87728436b3c9828123ed57e0471bdcbb51fb5304bd21405dabc4caa6d42511f1236a1a8ad6aaa681e4da411928a661488fb201f9ffa6cef23cf074e42f71eb47dfd1b256cefcf91256ceffe374a20854ad89eabdf0fcb800a55755212cf07503c1f8ca443714a3ce616f366de7ceb6dc860fdeafbf59f8c1bdddb088024bc1e7c2fc8f5947ce1afcee5653e474571de73de5ddcebc1ee3df03dd02379fa57e484a23ef35f2338f274551fd5d1467dd07bfd8b24c105be3efc902481fbd77390f74dbe68f143d78b1ffefc46e2d91e4790f85e1d6df4cbb8f9d5d3b72183f5ada75fe3831bde7f7ff31fdc00df82325c32b87f7d0ca2ee5fdf77ff2279fc73924610723206770638a438ce0f479e8d9c56aab5b181790398a8a8346e3755a9636668000020080a4316000018100a8843e280388e24a22af90e14800b6b80426c503298064391480ec3200a8218884218844114640c4206198520a2ab00384cd46e0c59d7bafd9125bbc32a7a6caed40e18c6ad04599bda52527f09ca900bc53fe979a97f7671da1580f0a693c1d93b59201e84846789568bd6f38226ea3012680842569287cda5e2e0aacd80135f3fc88d9aa0d8bbb57d2da69cab0cdc362c14477331654405195e657767bfd46681f11d8da18c5811e6804ccfc5791710270de845c8e80e47777d841963158d4a05aebb8dd2e797b93b6419e49a94965e55941e62a3bd63da2c81183766590e2ceb1063b690323e666849a6f0b639d259b9a78dcfbe355e4612694d1612aa6090cb56589656ed1c5d16f196e7d71386296e126f5e7bf93d406aec85eda9ae53cc689a6cb1a9b2803fb50c0927331f2d9770c2bb04855879da0d3df7cecde6e7e24866f3951d7f377b17c7a6792d4d8fd247f2a328382c12d0698ea4cbea978357e2a799c9cbe56dbf481c47622979d1e27f319fce37ccd1a5d15ce6ff70e50074ed95b0b67a166829d1effd4c1156775bdf55e399ad99a5e1fc0aa9218f5893269fe6494c655425724ee15e6bbd2721d8e616af1da33227aa892dce973859e22c9f2cdfd55ed1f11019e9bdc8be1da05f74e8758386b6673bfbb34ee1c0f6602b59f789014b5b66f2fc6673d166920c0eb3c4ff83c877794e2f4f17c89e162fdde31ae53d74a8fe9e40e03bbab4367c0d6d89091aaea3d59fa06ea5408292f7a2066cea393a38846953026035d10fd087c8b2e1acfa512f58a65081b2a020179a394407bbfe366a88fd84f683f28942e51cae0a04544e96a2f142c5c91165d5e5c157a938bf4fc8d6c8193abe1c36cc2c678a49bf87e5a9d870fa2a88e88d8728c7e728f30182df2b3ac7175f3eaad8936e95c00a2e283b37fd1802b91c7d6ffa1d7623df858d3f48dd5e93fa00e143ac5c92f8db7f9f07773719e86778005eff4085aebdfc2d06e20de52e27348f72cf46f434348b250db126c94feaf35451755d61d9882bdc38801058f67aaba3400308622628a6ab0d08941e405029b2576719534f349166353c2e2aa575fd879c9e8f2328b211620ce8811243e4be959d899e4aef82cc0f9bc4ccb7874403e10f340729a8f1c0c2fc32f80865d1b39736cfbc4b5e84ac7aa039a3944564c4f3dae647697e59d7ed8674d67863fdee6e13547ab62f6d79a81e83fb0c80f454020023f02d5ab6233ded7d17805073f014775ae2232954c03ab625018c81b24e9c2e75438bb992a60afab28947d817a97c58bc98d45e4d7f1f4d0ba76b4f9a4eaebcf8204f2ff7a04cd0b79e721bf8bdd83693cf95b75c557e4a1c5e1783b45450206cbabf09327dc08c1c268995474c855cf3a91e51b213a7974a42e5eda45770b0647298d30f997390c4181f957d49b3ceb55984720a2277186f34f8f9b8713bdb1644338c919784c10d83d716ebc41987dd03a963d18297e20048c4cd1e4ec49532e83e2019d71dcf77a41e04ebeef7372c7068cee399433a721204a71f9d40589325840b856e445e2921cdab084a8e68031d154d4a7a36f8a76dae7c3f59776aa39f9caa431bd481d7b0303a998978c6cf3d0352da421be8c3be62234588eb31a5466803ba56eb7b044b09a3296803f5d76c07db9a2f425c01135f406b15fee5fd178027f0222901262775ff6ca0cd72473ec302184dfe154023f5b0aec169317f619e2cdb6d44cc5f76af5476649bcda171459ab5ecc74857b2d9260d1b18185767228ec6e76b6460ad5db18a48fa824906d8b321e9e867675c1ba6b492bedaacb94b4326f7f52cf60c707587344cfac2fcecd593601b57a84b3be9cb473101a373d8da6c8b924789eae87423c4370df9d3452bea7352faea303ad632813142f9651a5ae90bbd7a1ca4fa83cfb06a2153137460365c0df62a6a625c0cad79b4ffc35d51308b9806e0cc571c44b89a347b5c6b233e25b89f830bf802a9f6535093c6c6788fb407ba49e01b7ae2cbaecee6dc436ab543d41c7ec2ae9acae3f0c33b3dd59b3b6872dacb74a0fc8f43e2bf7a4b632e1df69ae91b0b3e7d7fd1650aecaa174553393dd54b6c46da1402076c9997196a244ec03128f6611f5111fea90ce9821155aed6a830cd8dcd8527db212ee19b8fddd63c51302452e0ebb1fab3ddbc5881fca00baa9db225885014d441d0736f98aa9002da76cf17d9815a56d482600ad6f298ed780d70d593f276033b4487683f1574e74b4d7e3d0624240baf86553391c1989d35c53ea5597a4624bd8e76f1850d9480423c377dba64a9ba63d62df2d86b8e0b0175721c630ad853c498cd261a694fa02e697074681b238e2900c4cc5ff66adec02ddac12af4b448fe04151f22239e5afec43f7c7647fa35914726b838ebf501edd254e93d17363e3bd45e5d7bca10981aa2ee5eaaecd3fb1401cd5d739d6236b3a1c2d25f8d08d3f4e31ad262f957851f4752bea7b3819cc0f392a95064d29e5bcb2ac8bad001aaaf3338aefe0d220f3cb322a553dec8207e327fe5520b071a2818b940eba6fbac12645d7f3373743a6305e31530de558cc906733e10b290373c9873c9759a5ccb93a8ae72d7692cb72bef58dae9fece3660d8e4bf62c2ba322ec9c43c1ca1e1ab616de9fec8823aadfad67a2ea2691e1d9b54c6fa1a12c0e632f903ec7b0252a7b3a0cb98bf6602d0ca2ec0dc28b396b641ffb2492a66eda1fbf80b60e7dd64c49e8a94497d81ecc81502300d55a9550e6c707bc92fef1d709e899b5eef00d09934b3ca299cf8eed004b8f99325dc9692c05eade0b207454ab69fa1605937eb66b919c617067da7bd25b03c6c206de15292a2e4492652d602817da3589079dd6d3fea01b51882b91c8cbc583b91fd8618519fd17d8e28742743356c9c82979db1409ae2d403466feecab779855de7769a07aeae260b7a007bcd38eb286346c552666b019666e09294889403bf65929a42736c83237b9c48a56415e23f47d5bf47a33a0f632fd3a76062fc68930159bc8d3de4ac2c4d6327bec50d19a56b7a4719771d3f677c984220e45518e2e38fb9275d0dd27a666d8fbd1d90df982096cd8bd7b122c751339d3cc09fbb28af31964e0f6029ed5af9be8007220ab40ede6854a2177f4c9c0ad5249e3758aa240a206f44b5b37ab413ca9094dd7285d2f1dd2c79c31c3b8245f6b30029f6e50e1981600001dc6e0214b5f9b7a43702620480c87e161045be572447704c18845ecec0a240127cac0888850da1cc310588ed4de3184c4c925efa9b861209fa25d7c7c474ab192e348afe4756cda4e72f79e9fcf47ab19a2907d1563b83c1d4d4fd8b428eb674019d2ef8284bcc72447606c7ce8ffa81fcd67975a4d944104c9f0e5a175093be2f9b1935298ab01927389fdaf42df140ecfba2915937a62ecc55bf5faea518c756c9544c2142500f7b2d3ec86cbe8eb3e7e5ee167c315266b49d4c87ebd35c8e7f3f81c9f1ba5e15b251cdb0a653b6d73ede674ea123bcc92b351615591cc0e131ae5fb518177f19b2f658925b084c2ba7ed31752c4d1ee7e79465da1e077ad691c917f919d9c683ab1d59797250fc19cfdb9d820f20beb597ee75b682fb9f37907d8c14e382697189998e903a605cc084103fa35f6dfee18336541bc49b7f283daabcb41f0ce56d6ac6bfabb9dc8564ccb66f5398d50a95e79c26d73779147969c66a61f38f54ee07724f8af5ced7b9c6fc9afe444f9b60e5e12b204340c149448115a7ed28fd2f7e622484074db35d8de113506560b95176f782df248d0e1f9f321adabb20b68d5180185635794352b8cc81a77220591b5a0ec82f7aa9748729dae54100ea9583517b5d28039d1f295e1153fce85c54ce198459791015977a0c5af36e34c207e2605b1393c4808de961f723e3237e980713e2960b089295ce8f4ee9b289fb37ac8dbb4eafc4cb06c87103246f354f3cc1468fa899ae6e16799fdb178467840a50bce51a618b76e312db602b6e096611160681641f76393bbf0644075c6507c55b8f8d890f07911d789d9b3c1c23148fb1c55e219b37f83ce3d1ee250d18ceb561741162c8890168515e77b5e768b70c03d0f383367852b292d4718c72f930ac3756564325e5f31d5582998815bd4a531f31aab136bace80b8a54e9272a953ae394fec1e36bf8e57f78a50a7477c139dee685cb012f11b5b6af744e2236f9905337e0c53f16e8224d66332359b1b330bde6ec67081ca7565125314e2a090dc90c44070b3ad736ea23931b4a3578c14e7f06ec9f615e26dd64eea1addd1c8bc3541cbafe1e8bedf0e1482f87e45579fe9a8041e356dfc35ce88f0572aa271c6dec498afdf52ba0febd25cf44505abbe1b2573cf08be97262914624a76b7bca7c4b43ecad43381b53911fce40285a8a95c707453a509e67b70ae1ca41e559ea6402fce09ee1705c6b4f932c9b43aaf3c04138c54e22418cf8c42f1101454b0396b556ac254c5554c56abe82b089b30631ce375bb0082c1bf96d65af40a02050f5c18176d19dbc858a59f89def2ea4abb3233901b0e7c2543e4005112d8b6f4ac8e9bf7faae29b0b46a2e138f1350b281d94bb52af7bb93fbd3f3935e51563c8c7f32141e7b27314b5e96a4b3294b30e9b7d56c81df2ecbc4fe9726194b73a0d583086c7f446f58a07e04aa256c27a044a3e9e79d2b2209664995250524dcf664a600e2b6daa74accf1f812cc773e65454cf8ae9537d07f1bed501da43519c1445f99d88b42dc9a9859fd91b86c92282b5e9e98ac44a221814a2c657742fd26329b005dbbbc2774bcb4b8445b9a71a8a586653d151a3995d1427f5cf3541463a87d267154a87d8d52032478692eded41d09ae9a0594a19afdcbc8432920034512630e67cf0817f6664e48e4743052abd3d31488f36fbaa31130cb78d488f3b26ffda4e950e79f5bd685c48421b3b00bccd11b49896401eef7bae27c7aec4e35aae5c144681f2e1a9efaa10ca291eb7ee617b481e10277bafe2621be681f5ce1e63e544750f9dd7ba5bdfbbc4422a6935019ee29b158d1af9a62134a9d01e8712c635127e4c5e18e4834d4ca6534eb614b7ef85d6bc097c27bf1582b73d44b2a9e4418b85dd9522eae4b04f744654be477835b10b873b25dcfe81ce23f469668992eda444a64d3b969c5e6b5ac601c1d2fb72e1e733673fd0d5e9242de9fe2c1bb84fb7abb04a07fd2e16e79d204166c453b84f2447c6a5942e3972b120f74f1a2c8460954541b1e29d8ee993925f31a0c6b995ea37ced7844147181ebe8833cad846ae8203a2254a8cafdfa375ae2f215d4b6ab0c6c5d533e8d1a7ede3025422849c3a329a48bbb2ae95be3c16de4466b45a95d6c674e6fd7cd40c3d274e517d73695feca5062b461e11cc0e75c45f52cf9514f36dfe2c15d6deb6182a2ea28c9e8d1ace29dfe6570c4e997a756532a01b93a8ede801219aa64562a4c7290bde2dfb0f0ba1fa811a14c1feb850a1c6ab0fe0a290f388a5b8599ad59012269658c1f3fedec4d8142d87106aafe849ccdbaba701c0746de0aac3e3278bdabc96c3449dbf66eef739d1636e0278cad77503a8db302a0fafa30456952889135b93079ea40f80281e1de2f9d493e7a0550af511a1504e5e6e6946c219d04f5f68fedbd3b399bc06119d38fc444dad1cd6f3030fcecedc30ee50f9d4d2d2756ec6b50727b535a009e4820834de501d20379c0bd3f3c11fc1e69320fe15ffb9e26c85e8bfa856d54fb6a1b7f5b19515f2e19ea6a7a069dbd61717b688ea2fd1b672460af140153ded6b670187edc021d99045c635358829012cdb9c999584d4f5798e74d625a26bc7f13a9c8adcc4621e94305a3f210a47f26cf4a64208e9208a133046ca412cce925c2f549fe26e716650d90f42c09dd056de0027e9c98e96fca30338c5209cb917a1801eb41df1c4911524702d027e7a545ebe45eae212ea5a74f64faae64b98167cae94113c5117bfaf2802bb32665bfda563ddf96fe98b2387fb14c592ba7024f3bde72b39d15e6efcd907b471765e2c237c035b8f162c7f465023fda43448423e06b9e4d7831b8a6ef4fda44e75418a13ee7ceff2c296493f0a888204b31da1020e8b32128ec0b1fa496c77702daa13801715a84cec2dde30941fd822ca37d87217ea4bd037ff8d5dfebc2e5ecfaca07e0d583158947f2f89419a4f2a953c51baae37cee8c99331d543fd7914da9e98fe244d86c2620a6656de56ada7443556221049e6f4771496fade1b2c7795176d088c8c4926212bf302a4f49baa8ca0562db91ea16fea6bcc6ff4e49080123fb034cbbc486b7d70dfa3201b6da3f8836c5af0856a5ff64615da1193d2897776ae7b8932778e26b7e5e8dea00ac31e659aaf2d94eb08ced06bfcb40f4f782dd06e0023742cd8ebcdf8b447ebdfd18122427b336feaaadd5f96af41f9e0fa876fb67aa15b397c196a2031a1ef36fc44e3da119c21a4fa5799361de3a4616b3ce1d0184e4209ab323c2680a87507fd54407897bbf3ee30171b5304da2d85afb61190561a8091535fab645d378a822a564146b96b04743ba1bc0b33a7ba04cafe044bf8f8cfe741468456bec8bb22542f26ddebe4d64abde541c8219c696385c6c64bc953864897f1017f4a994a71550c5e78ff98edf6a36da50751b1e97d8de941680372666f879fb303c26785aa5fedeed8cd202faad7231aa01b9a220096836551a27df3ac72dfab935132bec72f16912fa8c887c4a20890931085da64a17e2ff1d3ff55d53fa90d10018c648a29d963ff0ca107cfd69b93fc303783c1fe8c634468a27bde048bbfdfc50167211adf356d2909c0924adbc27ea4b8c36a54247ac9a1ee9b2ec1d7bc3794aa2d751f3f1155c633f37fc14c42cfbc5b2f3a9737f8deade13775bb6ac7ee2f5fc6fc2a40b8726b0f3e2977ff9180dddda0f25c1355ba33ef80fadd86663caf6c4f407074cfae27a048f85fb8e8d52c8e6e88e49cda5255c62f8450e2250b43244f27c4ab8e7441b7e4caecc801481e03e8de27519a1d24209f2c29188c273138ca6b3e49a040da8ba49c2f8bfc1540e3a6072c6224bb5ee5cb5ecfe30d52ff2a538103166f6e4252aef6a534da051489911ce182ace808366a53795503f94aa7d764433a92da219548f823f82f4473b8138fdd162293d6c7409bbbaef94bcdf25bdc398fb3f4b20313106ee0885f6f0f072a7f4aaeb2ae5cfafc72866f345e4643d7b27d007f624ac74d816f528d3235c7b5fc8a033fddc85872812474312e9d2bff1dc1a5aaf27ecbeb3e4caf6da736ab75ff46911f574bcdb5909c1560e135e922e52d16b35085fbe4813c11a8c3d07511c0e0fc86786d3fcb0262e8864c1e5ca0f91dab1d03faa8cb59fd7f1508c12804ea27f78d4f483687639aa4c6306ace295b9a4d3cf843af515dbcd8b77d18dddc58538ea811f7c12804944ca2914fccf8ff8de265104c341c8669b02d6137f63cc0441659a3ba08f0f970aa8341247aad80d88a99342be185f6c7924c62180bc01909b82b8050df128217832ba6d1b43774ef749c626594269c85950f35cfa7afb0586e5a12ea57f71018d2d2bfc9867938b6a39ca61f889f40838877d99b2e7f26ca3c564e250d083393446ed37517d1c6e204633900bb93a03cd69ec5a60b9984f425b35f95a24212eb963ffda87c81ffb51ae17578fd398639cfe85809d13bb7293edb6ee4b3804b0e015f443d0c0a490a9c99e2c9d5c33103ed070a616c3b88208b6e652289345a0c0b50fe48d95b0d3e0918feb7c7ebd1d8172fda8914631593a82702419a7a592ceeb26bdce9a1dbc21e63954845a617b3502cebd833d26989c230378a0c4e6ad29600f8228e05d53fbc414ec66636a36b3649fc131920ee5ad930cd0866e93a829c8d3ac7476a3dcab44f40e9cf1df38f252fb32f9bfbe78b789f2104d99190f28de5bd9129f322996f823becf90cf9e0f023cfc352198e44862b05ca9d8f7238c4234dcd8dc414c4d21a404c83d60204fb5601235e9d584c87fa4c68cbfd2041b172365a42989337402be68215064f85b0bd0071eda2ab6dac3753d8ea06a72ea7ad8a54fe982e413bd0201e87fefabe461fbedbeb6432ab755338f3cfd37d28750055ea640725fda3bae980a834604ed145d6b4e5b63d99c1c6b34de0880034c227ce464b05a1c44151ea97617e3bb6f1153b210c96a598fff8fba1fe2aaab0c97163c266b86e2afd14ced11e9d1afc6716e490a80cdec085bda03394acec554626e189c08761903561b021455a813083bd75ec18c368f0942548a8eaed97948841ee123e20d130c44196be749880219597f843d31682b6f89414405acb4abd385dffa251c413035e713051ee62174844273cac31aac4981a3b76fed0c99c661c7f33fb89d1daea387288bb75f4125c243ca03f5a7a0a9e70e912072f0448e97e5f4daac63e984a690f79f4245a16bf0a7a5fbe16236e3568ee6afb3637679451083d3da4cd5dc690d272ac9a0501e1df2aa787eb9643d052d81c658c9a3196bebd7177f549d5b9dc2213f0d2f6748119f945b49ca7f97c5c9a4fbbb5e818c5738e34430ef68cc1bb47436448d9519e1aed3523ce99e1a2120fde61a0063ecb1681c6ef2f6a816d4dc28f54a85a408cb87ce3b93b0989b078a00d5aff7c4845375545377399f22f95b3ea5511300e3a44deaa17aad751267c7f5b96ec661869d4cb0011d71133cb47074bde6803bfbf85f379d6634b4a4cea318ae11d19af9e918df5d7d3cbc0d899c4f1f905d1f00fe697d26ee71d9934d0c482f488634c12bb5834432d4bdf17d3526360244eca1e75c4681dbf405c8669a209424712b2af4f059344f717ada4f9582fa8c3b935c0ad4aeb70956d3d9480f35f6ffc2425f5ef0fe8c2dc324a658761883d74664dff514410450de6a06b34dfb8abb4844e86ddda99cc4854c35b0780774f9ef17451d1103754355c1ebb3966187b509b71767e8ebb33ea006cb4d3514487ba89b9c22633503a4db57df9895209d3db25f4208f50ca724911658a21d4568d4fdfff0223e0b5504272b9e6bfe2f23343ee8af2a74a43c0b6b93d862b8023106a3e2e523cc5979d5c0aba3b40d0605439a7c5a4d3ed39c3e54568fb3d31430e51a430ef41c20c1bf4555bb4090dfd1aa62561155fde2fe927eb72450ece3c61375912c3af25d11f751347df2125d5565ef036cb1ef9a744169b74cde2e4359ad3ab47434954a7c30b0cf25e6dfc866baaa4cb455f8e231dcf484d44ed821e3b372d33e9f864396a52c3601301d7d8f149235cb8e824702186b27a1e532a950637d6e01e583fc0b17637e4e4b38987c5dba2be4e75dc9aea5ac39781c244ee63de800414559450df592f209eddf32cf1dde85c503704bbc071b084bd214c7baf5826441fa254bd3619d6b4e6bb56c384a5fb70d4921038614fd33191640731728a74b6c40de020eac0e7d0fbf4501216b27b5fcdef6ec6a0a663d79799011bf59e82ff982a10e1675e48fc26228037c6ee469dde8dc2b32523047678c7bb0e1bb61470ca488c64048814b951460bff50463678bf929fe9770614c50ecd4f8a92d9fec968026ec24d8edd2e5bf74b416c67f249e6aa00f843b5ed008068cf14e5d1c8bf54cded3fbb805767e900eadbeda1da23611c81b5b7d90fa7bffd329e8165221778bc33297f6033ea41d3adbbd9fef942b1aae4702b0a1a0f76061a6ced92d8f25df1c15c89f67ac1601e72a38857fb20c37646956ac6677013c4136e5b128a354fb8a8d1fe4868d3f5d6062a9dc5df9d40fa39c00bc8c0930e1010e29e116d61b9d5a723ba0563660e00584de65095f18eaa394ad829c63fa240e1fea4798c336502772b8b99895bf0b097b11f88751ec5985224c576a27506ec6a96e49ba61ee21c625dc7ce33deecf177c0d67a726ca4188492a7e98ad1978e0e0f5ad9f7d6c08863955c40c3e93618f0654334de8109ae7ba23498c87e8829df2bbd59a2481895c0f5831b4d298ad4d2829831386c38d89579d408ce71aa8b838676c4875815d3b78a42e4c65ef915e72e8e291cbd5ef65d1b814ad8f574e3546dc9ab90a4030b585aeb8c436876b966e82c9ba0d73e1ccb45c8d875235cbeeedf4a6c7153404419ed83130fd9dc50946fc90f07418be0aee1b182ed57cd0eca3b4f473f0338df5c35e0be80bc49a9856ab206a38c6e221e329d98329a6cb0f4e64a23b0f904a72b24c9410bbdac7ae58c7956ef0951ed66600842c93d3648b880168f6a392ad33f2e830934bfa00e94172ad1f58621ece710937b4a83a131d4625cdd1976ca8f784664d0ec0b27f79fdb7000086b3227b14744fa449445a5c4f39942331311b74785e621c859f8109e31b518ef5260ea265d38422f0645126365a66f47f167c497c4b515b51e212bd44111ba2c332b0a01ce9e7ad18a72a3c73a1c3edd30c481a9dc330e9876e30b0ed419f6dd8214c600ef4522b6019cfb2f7a7d0a2ad673d3034f2114691140cf8cdb36c1037d454d2eaf562efef18fb25904ab91f7ba24ac3c9dcf115a410f62a4f17e834a0d3475bb098c642f49faba930f846bdcae3281528ea3f9c7d6a38edc7833835a0c3584276099bc811706ae6f26eb00b65f296294395723feee7e3d7ef5555cd4e2192e537da8f438d9e1b8d73904c904331da1871f04b995ed57746c0227e564a9233707b3650bbc232b831ff14acb515f4a8344cd48abd87ed2a740633dd474cf1aa26777c587ec813e490f4142fee26b2368186334e331de3b82c35085b24d31e5c51f970623b9ae91ca8541a928d62fcde38903bf5bfea6e7bf8fa4a8ec2f184f699a4b413081a4f8ec214fe69133fe265e643d6d07f1b684805d1d49210d742788848d96b4e3da0a8a5b0d55f96017180f96617af54df2a9c0e30bea63fe0bef953483175993d578ef6f0c54687742b249e25631ad67a307e1cd425a22cb5408ea72d286a705b2b9fa08b36aa409a51555e031791acbc6134f3c08e06ea74e70a5cb5d47f64a07073407771e182792a17eeac25d7de4ba0916b536d41fc9d888a596d617320b2368318a3d69037864d4d1c3867b8da5c9b435da1dda1b0aac539618b8d81105784a11cc69bb4cc34e0e553cb381313ee0189e97411cf182999ed041e0fdcf35a9606c77a4345c72fd500706bc45467c9c10911ab0beb063fb020ea632d2039c638bf180f7a3788c4011299d7f6bb12f02fb850045b20ad8e60a9f0d5ca5a48d95b358598b506a49125bd07d969414a5a0aa52f675994d48688588ac498e7f04534c96032aaa541503aa5d47a980844e269433987dfd031804b9ef5c223cefab1ff4017b82b64b42164e9928a6af8e1aa2535c51b876cbb6840dba2d6f8c22e01e821ad3b8c4e3d5b2982482e485d131b26df2ee67e2004c06134e6687acdfd4041bd181301333f5dfec4f55ccfcdc3cbf4af05d60ab564805130e5efba0c5c8451971b31d39f66030c1c7962a8f9b07494e8476b61e9054b73484057e1a6ea535830bf54429a5055b46ed8b5745285aa4fc400bc17d626a46e7d33f1035104b8865b9c5cdedd5f3c2642b476a0eb491a946e2035650492a9ff02fc871bceb620886daa1222aa948e7a8de66e28563feae31863166e0c33e6d19d5e8747f2080d6482b61a3cb0377c8ef1ba1b0692dbb6d9c9102ccb3017647f126fead8755d6afd00183fa6e55b392a819a8f6a9c831651ec12988a043be46707a84b78f92072a82240f9dfc8eda434910c035109e05cc27a093e80c48108af236617e48e0c9ee2125874d43d36651cdbcb97c1a4666f04cd8469cbc9fc7a0d31c8bcaf03e2c8f38c603ae58beb18d8a7003834c5fed31e76c70de8141158ece895968e0b5aa3f8055c412fca42087b0eac8d17182bd8e714beb71632385e8050f4d18b31df9f1339d962f3c51653fb82e81cffb29561da3ea1a848724b75ccbb52ea03eeca5e3c166bd04aeef155d8f663722fb079586c75836b9df7dc79757f82dcd557caeb9ef8d1cbd904ca58c6248cedcef3bbbbf29e1d4dfa5146d4c9bdf95b6e546d3043b66507839cb50b07ae66df97027740ab070fcda3015ee91beab8464a85564f2addeba0d5a6cdfb44a1eec46eff3c1b562c44b6ee30183925fce5aa5f0bf69fc372f63e5584d895d7fef3e9af14b2882d940d90fe35f193a201f3c601d8ff73d533bb155948cbbde86554e389d857f345c9d56ba1827a8af9a560a977640fff78fc8d4681d222302d0a40a3406911983605a255a0b4084c9b02d12a505a04a6cd1418a06dd58c48d5103b60fb07eae5ad069fdabfd6839eeabfd5c14ef7b7d5e053fbd77ad053fd9756ef60a7f603debdfe541a92cbe7a4bc9c76196e524710b292b63a9c830efe4cf60453ddf3c6146019a7d1ffab8537481316d7c13c4dd854644e6747d7d4ed39afe0ba353f1148c234b86e051bb17bf2f09bb770f5eb97e05485483a3b61f3374be87c507759461f0fd3dd9ea24eac4f18295862bad948ccb6aa7b5203bac9ec5775c35a73e3d65d9a5249f46aafa3756c115904a296f924c084a56ee8f78728c6ff5af71d55ab56ebcf277c0505d41cf670519a40426ebc5c0219c158a2ed8aba533c976371e534efc417b55d646532acb50e1e45a6beea232b5c8d467cb229c082839f41cbcca5ae872c052d9cd170f793f5bcacf97d49222dd8e5d0eeb3a5714091bf94d866af2f1766dc40de803c66aa198d6161893d691345ba9b8e06b86eab80ffe6198005a720b35416416a46c3c125cea8f87641ff0c4df8f085b3a9e3bec34d3834cc82bb66347cb765a8184f8439c010cec3f80b19425e66eac25cc1fa5e239c9fa1d992a7a1fa8fe65ee1611a00de10dab228839c746db558d6984066349a0f013e5e0a076843f7f0ee5f4899d12888869a3cd8a352337fc51e8956339aa5d24e412fbe1c0961cdbbc6b69cae8a2c2ec134e7d255c33abd01df53c83ee18d0c3a26d38c4302522dde4afd3db825464633c25449b864e2aea0d117e528cfc1ebfe7c8aeaab57f6d0a0762a773e8ba5aa255c4dd44343b95f4424144573354fcc4904b7ace4310b385ad7f229cfd9943282916dfae8c848784680cec5f085409dac8285c12027061cb289833890831c9ec31cec409303ee5594ac1850d500308a9554586e6485a7b6196afd4365e223abc83236156f892f1855cc2ead6282379543791f6793d291036028830cc1abdf851b1a7285791b4714a8b4f18eb6a51661dcf4130115ed8a3b7ca884ac02dfcf0d18d6721d42a0ad8d3fb689b2ae02e0b6bd3bdbce727e51b0dee61eda75998e2060d5ee6fd3be8497db6f55bf3a939122c619fe16cc94f2a14767d61e6bc2cdfb79dd5aba1581ea62c352b4bae8de90c36be90a16e33198caa0d0024bf482ac5252d39d3aa33bcdf7ea2e7a58042c6dd8acac3c1671914440a33db5309f053114f06bcc8692aea802397be7cf79043e346ff36917fcc5d1676dc1440b320ab2823a7fdb8af7ad993c7316d2149c7900b4377f09e8734e2ca04d30a5518eb9f6f219a56b421e3202a683d41be48510ad104797341683b420745cd4dfb1d59c8f3a995a872f6418a6a742cf1f0ee7897de661a19394c4c5836c8e07e4cc8af387bb14818389129f9aa63c2078456f219c732e34f23ec458d939f39f5fcf641d28dc5d25a9a78b42ccf1277ddda99f04d574c352d5ddd0391e6320293ba963bfc8f39aa0098e2011bca75542e34e733b98e282116c88a031aa58d480ea2a4a797e1869b6ec59c37d82ba33a0928bce2ce5d616b8c85fc11ea3cb18c45a6906b42f66c39b3a4de65564e312d990f7ddea484ea29ffdc1a727ac94f4b613f60773725a0a301372cf44678ef79c990a4b892a773d0f91ae33f9848f756fbc786ca48ea409b9b39370fccacf02392baf108171810ea6f29af1593c577470bd06eac13959efbcd58a746385a2b9a4a028894aff89107d36c84e473b15f0499068456debc4e84c3addb7a20e5cfdc31947a37d9981c3d2542560eb26f31144f6a28909cec6908e1fde488900fd5444585ab7461c235a015c864c4a033f274992202cca4292bb0e90929b73b824175dd007ea611104b74b7aaebeb93848c6c3f82a1ebf8cbe1abd040789b43570f88b34a5cc66697601a088931fcbcc38718c043b6dc99f9dc5c436776f5a59c480710fcc18e38f1ec39a539adcdd4526f4a4bd7baf52b02fa7cc1f49411e92621226271d19e6c1403126f2d80778f211b0fdb25cd6b8106153b2cf6d385ee51b66f7ceb13656c77acadcd343ba1b251c0724a4d052d2d200cb0f02365511eaf4c26fab21f0366fa939d7a70484b2782d77a3e6182630be3c82dd3f3404a2bce723f7456332b7dd77d89313d5b7939f0756a279a26394d1e0c8882cc482f8ba84cd48641af32deeb1325c3c93693558807075b9155819df173136c8c6db57a867a0130969da7bafde5bf0bab3493588ebda927f7b3d0b3fe490bdecc5f7b30a45408d0cb678c86e0a7daf04bd1c0cec0629b98ae1f5205f5a1f4c84e9078eec32bf8d95e083d03a4c1c93c2acb61425cb887fe6a14d952fb0de2d0fa1f14cb250d188da26a5fc668d8a72f4de9d236152f253dfeb6882b4b1618d628522b22b83efc35edbe7460a917117e4d4579384e24b0d4e93721429cecc27f3379b56f43485d8966f8abd9e04bacfe060543b6da6f4bab1cbc922e02f203bf7ec4ae43f0965ed1813a840832210bae96f686e6421fa83c16b218f2189da145266b36d84b58dea1769a7146bf7b33e84cf0278feb53743e0d6e9a688f27f0b8ab5ffe96269d8635affe2e4a2cbae9336b0fc515e7fbf1919a09fbc0ed0ddc9a0347c78d0a315da8ec8ebd089cdd6192f2b2ed8f54eb9dd0823fb0aab64891e0762a0cf48f59001e3fa75a3d250485bab5cbcb645aef14de32bb287123e87287834c5dd787bb1ab4111c2b1257df53bbdbc41798a0591f93a3caddf544d4f82dd92e7e4eccf468a0d7a245c26f180286d9663af7d30e4300aaaff050114628e5466a045da3cc2af3b836775507e35588371e788d296fcf2a1086996408e2c88bc4dfe2d37fbfb69ee2231ebaae55638eb6ddcedc3d24d869f2e6929dc6c85f56a225143c60d1a85185324cec5073c9690bc8f7bb7b46424a202a798207278a3d7b05ba8d18961d213689d7836e837a1dba42208abb70530bbb795f22765a3f43c2a480f5e7457b9002592b0595270abd73e059a288852f0a5203483306d13ddc2c1827381e9559f1d28a806228ff8f0773403fa6d521460d7aa9d85e5b0dbd1e3246377bb763a874fb455fa2ff1ba9894974f0276b162a5dee1c926f6e0866919fd7ee89bc318dd61b24584f0d1119cd3d6ae6d37e468a50d791b5717e5a229b7643b9c2b9dc98cef6321aaa5043158f52909376ca689f040d8ab81d8f3a0d6fe3849bd3c28bb86c3dcee38316fe6fbe9cead90afc74c1ae9a130fc636d5970e30a4d4b660e1d735132b18b7e8a7c95bde3aec210ab0c6312c4515499b2fa089c9f0ca2d85c2d77e95ef7d9e7c16a25846f02809977641b0fcf12f6d86d2ec28a7c018b4bbe03afcee1e2a80e3de1791a01c3080ee90760482654e23d9ffed0033d6a220d7880b5005c90faeb62c973469f1f7ef461f747acf3cae992b754921bf6e546effeadca0aafb22d1cdefeb01eeead0740e474bee26939326a408935719f9063690c03c63f3a12853487b86c419c9031f358217e13e0af01859eac93f882b71fbc893fdbe147269a9699b2f655c1a541475aea68cd6828771ca141f8bcea92893638f5c650d30c2b06e5379dde510839a715a558783509b2c029f90bd077198adc33080ef03a577ea6ee426736d0b08c09819b5c043e40d2305ce5c9c6368a90b08bbb660d5f25081695c31ea4883cff5bfd892a68225b0dd583b95d92fb8a54c2e0d6c35a57cb0f9338b8667e9014e9d069ee1c58a5b5b2b8471c583348ff985d69ab19b8d374eec02c5c08e64e651a3e819adbab98f004fedadaabdc3a06b8726e6f339d281fdc1dc68e4248b9aaf278320c3e6d6b9893cc1273a1af87485723c627624338e4052269d29432702f98e1c11ef19681158bf296ae6b5d163d2919ce6590961063b36d4b04ca238181154b767c91943f2a3893511a2244d5f3b7083928c9ac995ce22c21d6fd89059525d5a98771541d9d5825d389c38ec759f611f46940417d77af4c97cb5a7555d9ca9069e4a29e8899d31911838cfef603c6a42e6655188c404025343ed17e097dcf63b0ec9eb068cb2bebebafe9abc14efcdc385e0e540a13539ac4637041b044a035f26c12c093060f143eea032c52b3921e0937893810feb7522d757475007fe05baae2fcceb29cd436af3159ac1e8d579848680b2c2b6384a207083bfef6d1f4eab510f98b6b204d93c66e224ffb7328b48ba19dd94d93f7403ac7e16145e2181851b0532ae901f3d7c5cec19c27d804c35140713968dd4a31f7086e0a4f626bf7346bd01b608e7a942b7303f4d22006e456e37eb24720525cee70fbc3251e9eeb62dcdc15f16c65b683f03cdfa1f78c274cca73069808578724e34e063dc1e6a29bbd0b38a7658e46e9cb74e01ec836aef121a624c36fdef4eafda4c6444ac2d327b57481f38d5feff5066edf69e3891e85a6e57a8879e50db8ba88e80a6f43b62c08da564696ba30e4045683bd78642b29129b7e01bf24143f13d9728848f6947af7220c1d59c7665d8f5c754bdf2c687702da3a4893e8aa43fca3a490a6a85bb124599df75e992b636a57a67eda11e9fb4def6c1a293be3a9b048d6367c0c80fc264404ccb7fd8484870fb823305a5d4ecca0ac5b7d4c227aeb5d74765dff6a93c9775e43064d623958ca9b9443e77787e06284e2b3f699ff71aac7ef9875ac06e7a2552c0cbda2a54d415948824b04afc23cd267951a69925a6e372cad3f714e25d9b3e7025991ef24cdc8c1af9941ebf9ea2e626414607c796141498c3a41ba764fc99d23435557044c03c014606cfba55abd2c3080ef95ff5d05d12fa505b015a287f7b0b5ef04677ccad90532137a533b880a313fe058ea93036b0211224a0feb23d73d35244b72da9b212a219139b9a6bff776b9107be96b1f914906273e7b07f07abb7185028dd1329358d781acef92994ba220878bad9a58e00acb404a5d7edd12b3c6088a305dba42c9b00f6f2b27bfced10184c1268a9b8a00231cc2058ab3b74cef76ee63112f9b48a8f00e9a09a9744fe3866a2de774bb80afd90b23a9d2b216fe7e73880fd915a1b36fa7af6417794995c3068fc8deec741c617a5038e240634461e40d3ba410af7eda16750373b7c38e16d7255ed383467d0fd5fc6dcd0c3a15c869a5a5d96c5e9df405c19b6bcdc963f94c5d7132f6f70aa923e1463cf9c65610cedce8040c57f329a46eb5e91b1b1818ec241afdd6f9945619ec764e583e3998420ca05b74425d4ee639c1ce696e9b1f6f3a85fbdf92a2bcd6911bfc6d3951e13c31a67946331e42811ae4d0d3c4100f819782864d1e07444be5cb1652aa4c7a50ec56d19723cf96eeecb13ecaeae3e30fafe98c9f221b71cb56d48bd62fc67421090cafcb8176980bc8812f8bad887a66ddfe0fb33316090cc2353bb0f9382e5c225107606462ff54d213d7633b222f8e1a8eda2d9bceac899a2cde00c09f515cc83e7f0d9d9b3373a693e845a0eef5eb9cace0037b59a05d92623b30c7d0ad05bcd04e96f15c667b3b2601d6a7524810bf6f5ddb7ae5a786c38954ee6321cc745ee5d0129e62419beaa82b3ea429770688ba071950d765c1cbca0a433682c0b9f0eb68ea6bf4dc66e6711fe84c4d55aae4c1afcdf3a87f9440e915e93f5f11248b0b65a96859fa6dcc338e40e56ddbce3f2afa8c9a405500f62c225d0896b33b5f65a11693e72110821d55542fd85db6601ec26ec188e1ef34e66edf0b62c948ea6cd62177fcf3d324e414d4f04a13ce2caf1b1ab98d82ca565ff5bf81403ea01565c214cb7ac78a902544dde490066e8d358b4f19d8929c1c29b6aae46e4167bac2f0df3d94c9569eac52ec1a037c6fa21744e8eb524652a8606ed2fc6f3f412c518a51437e3c99cd23e2cdab2cbb712ff6b4b7edb32b56d7186fdc512ce991f1e62052063eafc7c357b61efc4b1eeb66e399f1c6050568b7818a2976b4ed3b72cb028134c64b72d727ba658bc2a06234ef0ec467c75ce860aaa403a4a6c3dec5459b9fdb98bc7285e0adbc9ca1a78ee4353504f489ca8e8e10d64cbda324313976c0a722c68875621c6c6bc564ff641148afa5124697bd79e4903181717605f64c7494c0b3b0b09425c5ad7429a2d619f13e126e6871075f38e4d9e1a304c1f2e85615f1d95e45595dc92ae21151f277acd633ab6b7e26d45b62d565f1db29851b9ba125453ade0355112b404dae7592c8e06a3481fb120c898031942eea6806273941425048a6998391eacc7f855273ebcd7c7004e1bc1ba5f62600e424ca477223fc5615f1145753f87efe3e79f1c44e492692e90b865c1fdf895ae26bf9da36bcb58a6d55114f7295fa70ba18455839f6c74ea96ac8d1eb76c2ffa2d952fffdc1e9268d4189f39b1470becc349853302fdda49728a22a622bb94a37be3b362cc3dd0d3f6e9c454b30a5a112849768567460609734a62fc4f00756ea905d76d1c00a80e5b1bb7a85f492381b4d6d3fc7158e250a09432d2c74e60cbd0c597ada5eb783c35bec1ea47d4606133d51833281ff542dd555d6bedbdbc43c4a307c1f0b1fc43dfd3926a2ae2d0bfba00c2edf857f1289836679268c7d17fc80ee8cc8a1173502c823788255e956a1c440bd0b8fa38abd3bc3841fa940ddc67b3936a348f16153207b1617a1cf2b768a1a276002d1bb960690c4aed914a7de260c9101201aa2cf32a8c702d8863f7f9797e469b3e70bcb925d72a10e6aa66102a064bf873011a57e35ecef96641131bbbd72f7de0ca80481338b2351780426aa1e80935147d85c4e347649e7b6aecc1d4d21aa62adb4eaeaac8879b432445109656b4d846212235d6bb8a39881bada511ae2b223228570207bb6cd7105c16dcb3bc5dbf3952ddc73501f67756abcb320fdbad11112c543d81adc36903ae4f6c9220ed53c78e4d149c265069cf68854a2314a60c06bd9f6846fa0277d77587120525e885f2979393f315e9a4cae402904fc93816016f14c276509a9494b43c6862d9083c2b45c5d8b1629464280527e0e2777ae09af368cc7320bb44847e07c6063eb612fc32226ec87d511c950a0adbd3e53bac7088e561f1a8f0ccabea2a261115b70afea027c3bbaeb9e23ad143b1a02b343c69d4d7217dee1bc35bca6edd3ca19cc828ff895ba68aee5c60e8d4b46cd8873f0a941c8671ecef72e70244df6cab5d534a8f2b0e3f2a85ad0326c552b2f69d27833c07ac05eeb7d18fc1ff20098522b45b21327e45f1081aa28eba6b062a9984252dd38e024e3528ba65088c6bf63c8fcd4b9ce9d7331a5cf881cb36722b189792196b16bc18f0905de4fcadfa356d8965b587385b9a95ef18e9584139261ed8246505e249e275e83964d6bb47b559e83566157cc261b71baf1626d4592c44c023eceb504287604428a3b4f2ed0b43abf27bf95ba909d28210772a263dabeaf135ba1d888af4cd70160853ec0fed236e9bd3d1aa0f5e9439a957a6c2326a2cc045afd40dde0bb275f3e72c11f04436ebf0a3d3c52e02018772243239b4dcec346ee3c21b685f7e7627130190bbee0883f111786b18f9457aeb5a3726ffe5c5108fcacea81e6f7862f7371bc07da83960222075c470a13d8a2a7674824ac8e80c8f541e266cdc691a32fc90519123ff3c49d5c66f97313331d47a5328fddfa09602509863444ccc897cfb9ce3b4e90aea7545475eff3d2b11e9665fbbac6a1dd68b94b9dc5fc59cfbe8210d4cc9f7d8040bc29b69c21963927e01c0756217e5a1a4eb313a612e34d7d5a69f281eb1047babea5d13a6e092c082791cdd39565e875c37cf95751e91b879b6be7b036a9291595b4d34726075f8f60edb7ba00eeb9c12da8620bbd3134dcec23b75c4407b28674258e3e0c9d4122eb62f38f692566d1698cfe26045c4c1f203ff008d47eb7618a155a04684e428e091b346be101120de4a7415b3478d32e6509da11a7b4865e741ae2bb17a68923d48658558be86c3069659f19dd89ca9f07e8b10ff38611d84a21d896056d4f7b803ebefe8e1acf8ab1c265bf95ffda69b2cdb2bc0f79570e3568cb8e689f10331dfc65f80b7698dd4b53534b65bf90beb56a61c2db6b949b7a8d15f5596cd859029507372af86a2e1e47891eca92040f0b09b66e392ba40d0225120139de519c9c3a67d20cdf37578848da37ff11217fd09235d3924898febb9b19088d6a92ec9dd91193624a229e84d0deea31f785d11328216674950eb20d3abb85a93d03a3fe31378984a93542ea0e6193f2ce61c9f47ffbc7e920642b644aa8e895120133082b6001420894e31fbb7e7b4df4e2ef716d5a1c6cc7d76cabd7bdc41528105553d5cd0030cce23b8ec48413d137fe4194f0456d173477dc52c04b67cbbe883077a941f45481dc3e8bfd1b46096a374810e662c1f653a82ce7307ff6dd403bad546e9f8dcbb395a83cc730293c47e9344b57cd0d883903859b084189bd9730c30c2ea099f92088f1d970e6e76029cff2b90a29c72e7a62fdb637a53d56928797a026d4d457b47a56d1ca5f10b2781d312f4ae423c3c049d5045202f94c869b8bcb856aa552a27300e7620270ed7b4a33e986f5c197e2972c3a99805ae8dd2b8c4ee8f0be833504f5bfb4e1713c93c68b33c198090da93d26868b1d8ab0ec2bd06b6551ded6625a441f735492ddd30142a58aaee55f8f750ffd150795afc7626fdc7a2006a28321be4dde644ac3c650ca6867debed146d6618c65872ddbbd49edfa1aa3439920451f28e26da147013dbcf4018a5ef1465c404cca4d1bbaba2fc55db04ecd56cdd64ea2a31d81b4352d2b4bd52dd5dbf6a572d5079168fdec08eb9742bfe2d331e4a31c03f61d99279a41e3c2fb3ae2b558780fe0b5b45e6e364b1d24b906cc8d280234b196483689eceedeb40335041e045f04f962fdc272bef09bb677e95dd65ed05f2f68fad52ffca69f745ea7f3ab574f04e91efda0f8923fc29e9d47fffa5f6752ad7ecdb9f1f0a217397e2ffb5ab5e74515eba0b8b10e8a3bd3b556afd73d9f9ac7f4f7a90effe93ffd88df985ff5f4527f7af99d299d6f9ddad681e7f8fa306d39328ce936d56ece29edd39cdfe8a3baeac3dd74ed5fbf26fdb2dcce3ab81d493d512f28badc58bfe675aa03bb172479ec6f4fdf91f88dfbd48349ec4df780c94172fb7b4172e3a79f7d4e90dcf74d14fb289a73ce39e7083e748ab986a4ad6d7f7f23178eec0c368cb5a0b4632d18c5a6bc89b57065e3adb5d9ce82365291d3c0743275f1e3fbe079b1ca12632dcbb2ec658237cb34cdc5fbcbfdd2de74dd0b8a3caed65e94ee4134584a29a35743fb679e7ca965a6e57b41516e4f6a4beb90d0081bd8d43d11e884b3bdfa41f1a5f3236cd97972d38f4b7e83be9d6eb65781481ed9534fea6c9d36bb9241938df02419663b040382cbab8e7def87f5d7f99fe8d92410248dcf18b5e9ce73a1336d7afbd507cf0bede5d58ed6c158077dc9632ee94c4aefc557fb3a8fda7858171aa537bda3bd2c57ba48aefcbd171a45ff94e9ed37a7f96afa2e34d5f2573b52502e7fd3b61cd668638d564dca9752c79b4b1d50997aaeb34f4fef5dfde8ed482f823b7bcec982366eea6b481a20b4a9b1611b6fc7a568b448eae99e6b67996759bfe86b9fbd37b5c9c66f78be6d8ef65c352818179a192f7a74a83ae817d5ec67da677ab2c93a2f286ed73cf7edd707418aa4317772ce59ceeceb8f195b7befc70ccfb56d50dcda96ea565086ffdd3ad0fe95edc643dbda7b92a4e102c2f09f4e06469e3f66ecec51dabbd9d79f6cfc86a6bd206db689d67d3bb829a5d7eac9c60f50e9ca9f0a866e3401970bccbdae1d5c3bb8a4308942254c11528e8ec4a0d41045cac4e0823da318b9a2f67cc2d99188f8d837286ea06859754e444a296fd500063be2a8f46bfc2a9fca0c437e10fff82a12729452ce0f3265340245caf6320b59b6e398ff5cf69c176a2a41863625920f1822ca2a12f29d1007d28b7e10aa3580c17614d0ab4da6fbd794dd87f0830c41fd9c8c34fe94523e9c4186e25f7f68d2f79afe9afe9afe5ed35fd35f9389be35cdf970cb26fd204399571cfe52879c0c724a29a564e1db525ec9d930c6829088c3d011269ad0c046891a2bcae0a0638ea6dc232c4a2c3d2a81e9c884eca8487ef2e6f464496bb161ec488aac0817c39855124a29a54faaf03c0993e48912ad8615c40e1715141d26392b18d956201a82e5ca7a64c376b161ec688ca6c6370e4b1186d127e2d8f1902b2cbbd7ccf3e9269fba7ec55f49ad43fed096b1e3d1f1435b763c22962ff972c697dcf4988513374e927032705b9c187132847257e6e6a4034670b819b2f7315a714a6de6eb38e411a3a56df481941dc7705eb207d15c40fefce460c8d501b15543f6fee584c0105783af58ac2c73b25cae17ee7559b162c58a9519d7deb7f7decf4cf8b3b75d662d0b6734cb3217ac2e6a4df3efd32e03acfdb25f7138ddf535ae4c86b1457545b25a11b1cab12a6eb6dd30868548ec8a1b2c4a62d11527b6b7da7792d9327665cc9672d28f41727251646f4584e44c62578e368c59d1b213b061cc4a914de94522fbdbab5f7b41920691e74f7db9359942a50f7af8f01bbea915a23dffca101846d45fa880ed3d0b9ed58ae19ae1e54ded3d4d144a4ad9c258eb6cdd19dd9b8b2debbfb0197eb85d1cb39bcd6da5d6c5ad75fe84a6652e4d96cf4191e79bea8d2fa58d319b3d06f69ddbaf76fd7bba1d47b3dbfd58ed1aadd541b34e96c431f280e57346640f82f140d2c8d2d68772bea3a01d451f29d1077fccb19d30fc542a954aa572ce5ace39eb1b5ba9d752a9eef4a8d49f724efdc94fa7134cfd4ff4a71bd0dddeaa1deb53dd67edf564ed71fea8cee16b2fa772e7cdd8f971d4b40ec696f65be70dededd4f9a734d4ff440837aa0b8afba4fd8fc45a8da21d7f29c3f71c85ec81b63a726672148a30e27b8e7f63cb2f94a14d91a1c4493085b12a6fbf6218370f7e36d4417c4b20f3ed7710820e530840fccca6ff23e396efb966bdec177ba8049b3e103cb3a9b69e7f90a17dffdad71eef74f4753afad837d9b560b2edf3ec906fdfc5db1caba71d7c6e668f7adf78dc2cdbc6908e72ac5e76aaa7dde931dc80646c3c2c7ea9bd21bc7560bfc5dfaec5a7ba17fed4a33a0f3fea733a9ed5c3adf333ffec7856bff3709b5cbca9e3d981dfc5e377a179561a6868e73ccf8e9dcfbff3f9f3c3ed83218ee3c8d77fb175707fa7cb799d2ee7559db7fd7dae7ba51e6edf78d816dac37faf64bdee678deabcfbf5d4bd8636d6f6afe6019a943ece3a99b5c9ee07d59d7d08190f47b3a506c2c186f701435eb6d410c6b86fb708ccb77303e21b686e10caf04e335c7072dc3056a5cdf687ff801814beeca4969e100f10fcfd1323842d38a529e6d8c7bdd2faf051743b56cee66c713e647fcfe54a02fa7024b2e3e0156af66f189342654a99edda303625caaea2b40bb0610c2987ed464b2ea594527bdcd49e6bb713ee36b783c0dd31a08cf84116933110a31a1f92c68c30e04f78d1b4cabc528c35a6ec321218b2a287b5c7daf863441fd45356f449ddcff47334ae88ec41a50fa28f174437f73adcd3ef91b3f354fb9ccf79fa1ee8742bae7b21b2f6706f3cb457e9e81b5bd447a5b5d8e280c8706bdce77430b6763aed539d86d2fed469b7f3f0cbbf9af6f0d76cb58626274e22d9a3c961f6192074ff9126d36337c90e08c4dad465c0b5bd0ff6cbf42ffbd7a43dd746bdd3c83452ad54f71d97444675598338fe35bdf5561b636df22dce2a2b0210d142112bdf805c4a29a5942ecffca8917314a6841f357e08a23388ce68e68718638c510649332f448890208a419c38716af61e3e753d1b4aaeb318bbaed3ffd6f7e17f4d3fc2f6ce93bbe2bfd77dbeac2f03954e19bd8cf9f9f129b40141d0e533934215375c4260c21327d67cd9115dc4d8d0040b538448d3040d669e4822a5892e492c79b2fab22b9723d50a2ed50aae2627a48941cc902f0a11402c41e6c4c2ce6088d920021b94d850a4490fdf1a2744c22c817284e60c172cf286312e52708162ce3955297c8410f6009b13b8012651a0c9192523592cc645cb1625551325b88051156dd1b20569c992d816a2580d2aa83e30b73019a24a92b3616c8b0a5b4ed041091224b0d290a48508d511a844864d155ebaa4817d6668505aa22a12a3c1cdae1bc66860b3841115111511974b25c4758118222d463bdb30a6454c0c5cb28c5111c5a034244e143374c0fe5de1f75a5b9a30447dec84907a6818c7c79fe91ea7975ac83fea9c250cfbf67b62f34d5a3e8e3bafa3fa9d57bd10520fcefde7f7f09ff3fd33dd63b5d21f6821a41e3aef5ac8b5a375ecbb8612864a0b69a19730ec73dab4759a1642c2580b216599ee81fa9316f22209c33eeafd5d6b5a080409c37e7c8c75d4422e44c2b08f75517cd742510b091142eaa1bd6ba10b4818f6b517fafc108743342d1ee2b0390f71f8ffc8169d10520ffc395ac871e0477daa13417bd3e74e04a41e9a16c1a8274caedaaf4818f67b62598b2084240188839ab408f4b5f82e43920c4a9bbe04208efa2cab5f8e1a92d1b690451659b2d40d6359a8dc0d63598ef286b12c39449c6304ea3869a65b89688021bd81bbc9b2dceae3ad13d6885d907f941d100e6274089bf8f022eca316514a67d19c45d48be89c718e669b4d8db814e4d986c26254b2c45c4061c65c9a6c625998c4603832dbcc361c175beedbd33a4e2967ef695b732fb823b2163788cfada8e65bdb5e02f1373dd479beb3a7f6efd03675b0ccce3a48e514d6faf8fceea7fe95577f08c9044d787dc60db2ff2cebae84c13931df1d4acb159183eecc5e7e0cfff952fe4a88ec0fe97b575fe9fa66a0648528b5519337e0096df9208cc9be835cdbb5e3628bbe101a39ce29bb9e959aecbd522c83e18cac79e0eeeefe3344d6fe47ca1a5b834af7c61f0760edad56ff2daa3dd7a6d33ffea8b123e728cc375d3b132532e76db2b75ac5d56a75a592b15fe5cf8e7ead376eefecc3ad5aafbe5f535fad45232fbcd9f36b7dfb3aa00ddf5edfca7007fc9ca00d8736dcb32feb337fb61c403cceeca15f1fb7e8eeb3fe7670f7449fbab4e9f3ecb85f9f7b9af3b5f3ee7bf54ff676f755efddaf2f28d9f42d16381bffcdf9dbe5ef893e55bbbcf42fde34d6b6010dedd4f7449ff973fbd9f1e47c8b87dbc4bdaaf3ea4beef1739a27e77976b4d87ebb2f5f27f5391dd0d04e699dee762f94d69aaef5356823c8bdf75e7b41d8d7de0bec7bedfcfa38ab2f37a0baa3fefc0965d01c3aa00c7fb847f0212ede21775ecd94fd9c530b9a306972803dea70a297a3739aa63e9d5efbc9423ddc4e287aa2f444a10c7f8d4b833b3837dd80ee5bf939ea9cfa076b478f961334214f2ea178414d7e947d6f6e586acff680c9a8cf7ecb911f6ea8ec01dc281d2477c0add33a53bed6522967bc4328974adc7bef0dac1d2a3858c5129f0b26c40b4cac143b20718411951fe20c218109489c70302a5f0a1f54d2600e878701c06012ae0526f91229e8e15bc167016463c2978295f95a58a1c18a6fcbb0244ec4c467441361a019d81043d67c18c0aaa8014c083e2f015601ab32a508163d54f9818e2049122762be0ef6c577f8a00f6e94d8f00eac19c19700d8149f9aaf85cf00302fea81b9142b3e00c0e07c10cc093ea46f07a6037331f08a34377c26f8bc042c180c2207147c2a1cf151d887e48bf3050096826fcb9723c3b6602898c7de48017130c11c862c20141f38810f4a3817a883d11468c27c4b1f0d1730193e173e1f05080076f4f1a8606dca7c453cf15df1043a41840314cc7c59602cb80d513e349f9ff0a5f96e6c006301b033df99158c518106d5ca77e44c60f14125ba7c1a6602ffa10858950f0a11e753e34478f94e3011c0215c8a183e203e2f4200d80c2a3e27c10ff794430a2028c104244c8688c06889d10b58ecab71009891af003027de04de50e1130ee6c81b32396c71a288112adcf0396183c3b7822d7d12f686872f068c8a249660f9943e103ccc8f7cf1270a282e9ce952c607129ae43044911112300706c07c06272ecc498046f894232011eea6890f896fcc77418561984301e553c1e7818f0c105348141306b1f87a78ebd4566badb5d65a8b421a2373ce5c6d0adbda31dbda67d93ce743fd5f629d28e090c6c8131d3e04c050f091f9b2c800e62b04f1c12f9e9415418608082078d832460c3da1c8e7c4a3806daeec5891ed54f1a9d6a8d6a4a88871c7083d6a67a2c9d2f65c316012f4a909b12647a8090ebd5cf5eaa6b0e415fda73ae6d314b2bf4bf9f429109a1fa6abaea84c90a34f36c2dd1d42c881ed7bd61dbab8cae16974b56ae5f83c555fbd92aa20f21a3c800c2716405e45f7a803907d019895e1acb36a426400640a01ad4da826776f3090efc720c3798105b8271321b9063825464a29654b0545cfb35a3cd9e557e0172e62ec8b980867cfd5a2c8b552f7250c59348860cc406ad0697d8f524a554b59ca28bffaab962aadd47f683bca1a56ac9d18e16aa5d303abf20c5a9f4a9a6717828c71cbabb94c8494d9f936b344481e6dd53c32b6c8444893bec6306e40c3a7cec9d21b80216bfe7d95103995ed132151d6cd90b5da94b2628b7e4f6ca9a0c82bf72e04dff3e7947246942b12c140be4f3c966a2a2bd9bb9bcad885e09b3ed573ca2d1321650f95a04ffd4ccb4c1ddd1f81c09aea4b8e1f7fc85dd31bc6924ad8d0020ce14d7980c49bd882494ab66f55d2abbc64ef6bcc37db7dc6f62452469fecdd3da7841b160ca38fd4f1612c8968c33dbb21e915a8c2daa73ff4d5dda9b096d2b74ebf83b887aac71430ce709a60968990a8563df1454ae907f0fe0b970d635fa81860c3d80d7062c496fc566ca9b064af1583c2a8a3c4be28edd8c1d80d70a2dc242818c8b7cdd06220df354b55ec86a50d63494b7bc686b1a41836109ae10f9e990849c6bc38b1636019337c58b16722a4287f85612642827f82a92ae6c7a18d51a86ec37777d73e776c40f1e30e0becf9b2f3b48e2e6e3ab61c33c25039fa54181f46a923524a5f53678f61c8f21e7e972cefbfba60b157b1e55d6a297b31f2b264fb67a8638c72c6bc5c8979498a52a8a6c8974ba60d9168a8144db7753d0a15d10800400100c314000020100806c5228150281ccf15c63d14000a868c3c744c954723711cc6400cc3300c822000800000022008820008006114638a1f539420858f7061137e724068bd07c5b86e9365c4a555ba9ab9ae67da5e431047e159ec6631e7a173f8106088720f89e7256462a23adef307266d16531e5c7317b69eb49d4f6e8ff8cde30f2a983d6e6b6688d478306bc743a786e701ec87721e1440a815e2629a4746a7a2a967b6e1f6605910c77af778d32cb87b16eea420f650b60588f810a980288b8647d56efbc1e2cfd3e91c3f243dc4142f1e648712420f51c307712024e3593c3a870d42441066d1787cda2cd03def9d09c2164473212eb278f234b14330a8c422583ef5c7fe5adc70808c932287676eb3f0e01170c51f708eb888eb81a04181e042643f78f9c10781911052883d1ed02c883c4bed2e163d62ef6663f62cb65321e7a9bea5d0e5e1360e10ae3da860e151b6792584593a8f67370b78cfeaba8b1d8fcb964e88b2d27a44ea7ad63d6adb2c9e3c98dd7ce63c7668ba1e84426006b102b147a4ce67bdc7dd26e70f2a683debb41a88f043ac88787c9d4441f844f44ca259a879dcb834435cdcf048e554d4f62cdb2cbe7a047317461ea772762a7ade36f383cd87e63e5864f3946b2ab479786d20208810ad1fe536a53ca8d8f7c4dae6426cf1f006c1830805218648db834b0fd221f410b6219a037191dd53def5d4f6f06c0079b050ecc9c45da4f190cd41d1dc23d3701f92f560f1edc1968be2db33a641f460e1c4e3eed20462c5c653dddd16c2f1bf9e8f737c00bbe21e4c21e21f2c43a816420adc1e9dbb1e02130af180bbe33ffc0962459ea7136ef1681e6b9b6fe34e57e1530750569ec916f581fb60ad0f16df9e6039e4b87b543df050e25010b820b621be3f84efc3a81e2c19f1037df04b57c6fb7a9c7090b1990fb122c833de8611844fe61eb1370b674fb693e3211b4437047e20a680787cd72e02a1e702cfa9a3f90171105254f608a659c8f7ec9d5e0f413ea41cc48a82a7272e8a741ef79ac9436a47205a808c46611074b5784a6a49f980d1e09c3cf8c69cadc59ce1a0be6b0f4365360b8e475d8ef14f0fe006e2070b674fee9d4f268f60350b79cf8ed3f310fc87f2071442ddc0965a8a07e83d5a23cc94c1203f4c0ac34c971c04b286792ade2cc43d4a753e153d75df2cc034ba071f305d8043fcd3ea5972b358e961744c20b410c9057181e5599ef3d9f6f47617795051ec31b5497d105f4b00d956c251a3cfb119a3751f0521d941f9a86ca9f9a0c2dfd35d734224cd83142d1ea5358a0ff57fb081d0ed03bb077b85b8f8f784db6d438747830e0a318f6abb82070b394f129a0a688f159b37102bf8793cce9f432aa26295dd53d33cd6ee26c4ff2120502a8b39a3cf0a37c2830a791e481ba086272d84a6f3b00f0012cb5906987ec4c45e6a26d78b131436e0a6afbf1882b17a0dd48ad7eee1ca33e41942f11823dd507112a7aad26320ea708013946265e0edeef8ba9f1e30b5cf5344d6e17bbc66a2b5a598f985c7104015e4c9d58240beae743e8e227dc856fc09d6e4548e4ef7855f00aa1248b8ab1212d50a182bf8cb48b688b1963edc7c935dea6c8d39fec6be83a024e7538a8754cd82866759a727178f62ce27718faa73e1830a388f841b0a22b943d1dbc06323ff83d30f4e592f9fce4131c9b46c1c9ddcdf767c0b004ab7e93f84fbb9d0bde379721830a59da7bbce184efd17749e4f297fed4e0a2198ecdd1084faab4292ee33f123a1873ec23be2625b130d41c638d866019091ef7bcce487dcf7f901ced961cee82fef0351de98e27a9599258c42b3a8777c854acd267899fc039709107046bd8aab7262be74f4d1d42be38cd3d59ba8f61540914744c91c58030f407ae15875646df56291ff3c57ce6cbd9dfb01977403cb099291438736c61d3543a66a88a3507b9634be8fffe0ef701aae3b942ba6ccffbb0bdcdd71228d753e71188446c673e64299b8c624a9cad405e7c731ae49bdbca6ca058750eaad3317949432d51a41c98506d1f91a3baff9fcce47bcf010b1eb5e1cbce219b3f3da170e8639ed4e5b48c2bb0ec0e35b0035c6b0cb58d75e9281d246ce746d9504dcf028cbbe0383b24c0acdd6469b4ded7b3dac8d30f56f6f73503d56041958e210ca43defaf16366fb54bee507fae841ce1bdc3092a1b56bacebd2eff9740f4dc732a055f094ef1197f2c23a66d12ae89c2c00651d2a388b4bd183500704f0d11a19e284ae7905f558b1fe0fe5eae5441a8c4c557139c6e03014b74e2b252c92ad5d73a03b18f38f73a92517b6aa87742efd76699646703153fbdf844cac2022101bbacad63bbcfa0bc5a46c6b0850a53ac6b6aa4b9180c46f7d0951317c8fa21667c16a808c9b0e746b9c779bef8db548579c3892a44c60a0ac1de7f321dc6bf24c27d77cc775d5873812a0ccb101312a41bdd3c3d02e1f5acb29a10f3469edeb7ac332d6935c2a676e96ef2091360c8252245755ed54204b5b6775d149bb56f9f45cff5bdc1395cf8271682a79f60129014b994aa3a1e536c206f90075b4ea239414912069476fbe8e7a2eaea89940f44b600e5c14468225991ff7021c0d3762977ff37c11e506b09dc4b3e8cf31d324934b9c2f9ca8beb00d6f4b8b44f25f99e29bb7e5f580a3ee70e8a31663d4a110ff389e079d64f9f0b5862a14c2e6e497c42bebdfe8ff2c7330c3af61fd240910808ea07bf3023bd604b84ecd9d87f8902555c64c5f8af971a42b72d3503cb1e399a24cdb34cb2a1f5872986c2c936cd62d92efce2e082e111df371ed5199b076dbf9d02032f1fe4e86720b0ae31bc6866bfa8a571c21455c13731b8b4740c432cf55a2b17391986f09cebc5a5cb08298e6b9a4ed3eada4e562331b69dd05922c1aad0ccea1d50be17431409277b4de47f56468acd7b0ef0e17da6ec827ce9c2c14b6dfa5430a89391d9a050683cb64abea2d2ed898563c1cb72478c258f575768577fc4f868c6db18237b7c13baca926f5a5694c4aa272367eb5ee11ec99ca7a6ed0de312ba4fc21ddc941b07e90de2cfaf8566bd55a1e3715a2f921cebc2efc229a730850f858e79b424bc12ad968fe4d08d2601104cfd6f9828ca65fadd374af163aefe6aa8762751f60672e32296c2e149410fb258969c5a0798b71bc36915418c496fec044c188e7486924d9a0312a2bd66a331d48d8306ae8ee72c215364be625185089393a434dcdd23fd3ca613cbdc645dd32d7409aabce0d011c7191aa8b3c4803717dbd8d681085e4e481cb61025487957eb4361ffee98bce05a381f1adb022906764318c49099a78870a72c536be07677ddc6bd0a09d5f2fc0c38db46b16a0e221de584f3d71264d037310a7ea09425ac918299fc3a7b22cc0091d70539b62afa8b5e9bcd5e8fc50b6bc1821b443d1946b69c85d542aeb6dcb0fc22593ea5019c4ec0d098f9215967ddc6992e17f680bae536ec2d4d633a3f4c9a00d13a971b965533b74209172f4c8e8d5f53f167d5ec222500818f9a82792a9feb51de26a7a05200a842653151f4179349d9b59aa618b6aa50805114dfbf3efcc362e3ed95f785dd6bc2125ed51bd9f8275e5a7219de9df88733326fee47c1fac8e6b314d13e968da6182e27daf0d8ea0295c837a1b035ba3c92fd9d0b1c8a95f330ff5e760b8280daf5e2b83a6cf9eb6cc7e99b53e1c9ebffc0361e1035a0310f6f5d67e14f401e50ae971cfd48233260b5bddf56b00e86ac34151e0cf3be457bdb07a3d04fd5200437fb360f70c225ff7d3de43945d925cdb60dd8ed70cb266c3416c175c9c4267cde735ec11dc648e279b664cb8672cd7abdf6f5070a39a7994f37655fda583c660b8a1fde2928c7b054ff9335852721d63df21794318e86d02561bd091185438c0f832abc4534d07376dabb4f301031c9f2dd52ec92c79bf47e30158a8f17c516ef4235290e611d3abce3447eb73780d8a8c11c427e8c2c5bda466d6b65361cd2ea22c348f4037b84614becf76f42c1bf278c623bd765de486f0604adef822a13d5471ee900ea62c7b27d515a68af281612d8534941da195b65fe86641a8c7924cd3f657b87684183deb8ef364f7659d02d746d78605b5df358fe8ef68279e17fe50acb549fa273682d7af54d062bcf563ccc8484f4a49e912280c3c7fb47f43931541cc1acaa8fb92269a11f9958c22a119da71e3fb1d78d2564765fd124848e70bb06a5174c1939a23a349545bb9a0a0581e70d9227b173d14eec742fd9324442d431815d266a45b51c0ec39d1d48c38139abda9825ed6cf807c2ef789cbb04175163a91c951aefc86232048b3f9e4de45dd2b39b3ebd92b15be3598ff2ee7fa3ccf6cb75174ed171cc62139940318cfc49ba6fef319deee2e433b6b925c5f496bf638a418f3476490a9017161156156ca563ec83213ebf94e922908791241d6e84d42934a0cae598429304394c0307e731763f67e9321766b74dcffd573d599de541860772e65b42c16e84e2bd87682badf8ed18700a91876911dd0c88918815b689a16572e1d16c4034bc029f91985bd7f4dd0a3a3f6a14c3d9742b9116e14259e084064d83644af22d084e51a27d816f6a3dc32877ca655946a9edd4b14bdb876fafb93191f0abbba2f9e71a3ed86fb6000d9f17e95860929bdd3ded459307aedddb02619debcf1fbe8f3168b059b8d98b6020f1921fa31f5386380e5f6b0686b29c57c187e32adcded4cf5ee33f7e71290c1a6e7fe656f877977c3655560435a6d9f144853628dcef3edb1865d44fdb7f6fe430371bb225062d63f3adce005a6f407383f20661ca29f56b89838d56aa33b976c204539c6b9df205935e3a0b71aaec490da19bf855e796bdd4000857e0eec9b31e142e7f44eb0e91510e0dbb4925ad22dd9cafcf29c1253fc13ce36d38635b6a74b06684dbb6b70c3c971410c05fbb0467afa68ac797eef47e4d646fe447583cc7e1ae9a44505caa59300517146ad5461c874f6540e8882077e7d83c7f45d8f4da7b7c06f778b969233e62c96d7bb71e315e7963c0db710c30ebd515840f91419778c69528731cf65dc78f81d44ec4b2e38fcee968833123a1265f6684037b1524ea3247c68ed581d2a9ac165f8ea1bf31356c1c05356be8428acc948ddeef82a2f64f2fc17db7e16c34db0456aea01ac322313a22cf9807dd2d9655ce310691718e533e6a303b8eb9b60e3eac0c41bfaa8f24832a51f7da20a14b79f0b98b7a1a8a77765228031b8e71549e7ca6c17a9243707cfb43368ca9ec344d554b47010ed0b8aed3be1c66e09f0cd218207500265f9315c2bae8a62e2a0d08b5fc373df484e8b1ad6c5b8ac261040525dd750aa22be3e02934328beb4bb1cd8cb1e18efc24c139279b5ea942248e145d999e121afff6186e4aea4e1a67ce60ea18b879430a19401b2ccf21bf312a28b77f1fc17c5b040338f165205b786862411ecbb855f466ae5269d95ae2d998d4ea95371f30179f820b9f8d9e84a67979ae4837b140b2f5dda920b6727d2f31004eb662d5026fd265ee34d28b34062f11e4fcc87775815358ca26b28b5c8df561f0a9cfff89019bbf0d4d255e7612710e4c690b634f22d08328f6aaeaa56ae42f47dc674a8696cf01b747ecbc0ec672e0ae2d414607abb77967ee4904d7f6b9c8b3a7ed16cd8ff37f916c99a9a9d08994157d5548f9e9b261f93f499d316f661ec908989c05348499ebcf06184288430a0c3761dc6950cf3a2e1cb8f0db2fdab246699a597e837d5587acf6dc84a85ef6612157bcc12c3573a6d2253511314400f88856ddce7aa217104a0fbc5ef83333d1b46060bc53f5fe28120ff3b51f9efa400ad0253c67604671c52929212a088efb7f0359eb9de0e01ce3402244335c9d87886d964032529de57e50268c4f406aa39ec6ebf7f1ea165408ad4b6c33fc608d345221ad36655b723ec3581d4110fbb45312bcefbfcdeceb97515d2e3218f32630e8fd975d0f7d8650310405bef0da332cb93cc1b3cd9de99b491479662e54746c1bfede5a7d88ae809bca21397d6c825222d1e44c21c8ec0aec650c634bc2f0d8c1429c861e1230b9d704835f203584702c122611776ad0390f40b2d1458276c621242e785528930a508a3c2b91d2545d582d474f9be5ae060b7f855855935587f94390e1222968d05174a411178a25b5b2ab20ec01a922781a823f2bd0638bb8175edde472dbad2c076d94f2344c728d1afdf721c503cd45be07c7d4ee66992ce77b68cf19d11c0dfe8066a30571a51f054b31916f5bea6b0c5116105efc6e860371f55c3248d6c8293221e9394663d2b18afe0538767d9658f040bcdaec862e876a4da830d0e604f062952c53f8a05a751853c87f1a62f4415c10d2aab08a48cebd883abd6c543fa5b94298c38e19d059a261d7a1e47fa69b9d1760a5742e8799fe9f13e106eace4debb59424310066864eaaf495b97ef51003ca05c43f725b87522efe9626650e1816e773f0fbc43cab1c4916f6986322929203388069699af807dfe16a1dfda9babd7481a48477e9bb8699811d3a884455900bf18617625f39745b08870c0a5173a6d88099174f58c44f4a3d18b0a6b0722ed2f45ec1267d16ee7711da9e4af04ca66221c729ffd4ed3d7abcaba25c7a6bf4cd277789bb02a0c74ea83e1cef614ecce4a7820904512f10816ac2c27a178457b4b3f10b3e36406747039cb07765fd020ae495bf5504b0371588c5c7470805e107df25cecfac05f9cea71ebb8b454ccfa5b960ac8de3868b3a4b28b23f3476771c4c74b08f86c8d404dae01325470a13e4589d3875cc0d4b863076de4c88081b7a9c1ef812eb108cddf55056df1cdf43f99c93d52bd2497752a1af49ba939895dfff8f8f4267b69e26c51191bc4d66c651e53517610529ae257c4136feb531ee19d3db0daad5fb8b80d91905f177ce2025cc9c497cf36de36e7603e6ac8a882eda0bee283f802f971acdb0580f3bcb955b41c63945c7d7d099445acf1f02b3994c72a9dfac106d845c9ff1516878e7b761e92e73bac2975cecf9b93500d0e08db8c88f2089dea11cf131529e5aaab05ba5199551ecdbd407134f7a5315066ea26c9731d2e5b98493e400eb5218ecbaa453d29cfef8c730810fdb85600949779da0d7b812866bfc8110e1941c8163dbe54da7b70e5c144e4b61b1c3df0f5af35a42a776a7e5c56489b23d2656cd0b1b87bb61c6f057994d2fcc047aaa61afc9702d7213bc57a013cb3cc9476d026456425a17cbc7ba031b0d16463ae162842496949503b9c1aaee0df95af4f57566f22a8f4568b910b11b516fa042c88a26ed94437b3ea09750f6334c821380ae0368cd743113a0f7311e6278d7828f201b8a5fb772e565ba2aad6681bc1fc026d47562a6f1002cd3099e957c4356ccbc49a014859974b6de0c61a75522a6df747d9a96ec96d27b0f2c1028ed56e9a332ab513a447de48773c849906e145686558fa22958a6669c7b8831b574d486a1da2bbe7d40c484d3fd4052fdf33bd100f07b130530c3485c74f2a9c0c45e6bff2bab44affc795866d34090db58475464bd446afc5daa873c1220e56be438d30e8466ef5ea8e62a01505d847a22f7a386d1306348b6cc8c6ac5594107795ec80a2ff22f961a0db016b6cd6cc7a7ec2ec56172a16383eb78e52ba96a2956e4438d888fdccae1dede98280b0fbc8504dc11c05db38751195904f53ec4ab5748d5cc7a53be06ec1f6352011270a568d28d8708f03b2f913ebb1804407160ce6efb0ff1ed250c55f4dc64aa76dab4433c7de9c4f62df2ee6d8c7edea01129a4246666a2433250b60ec78ace3cfe4d7ce6b7e2fc7e4c6ab82f4bfe0da1369d4458b39ee3bfe47e655b86e9501c64e5219ee4bf037a0c6058c2c016dda66a41a4f16bdcc3fac0d02b77a43b373acd9b6c4989209ffe5ca38e49a8b521c7b6e67de6126c2a85e3d2fd2cc347e322e339460e8e26f7ffe6d0b960a4bee7748fac33a2f07f2afc72d2ead2bdb7a52866a09639fdd4d6faeb52fa7edb0d705f5a5a6135d367a3dab441f25062912629c4c6fd6ff076da99ca1962e086f264da024a5fa8f6db05712b314bc3546367fbcee3372b9671f3fba6791a71fbc9bb5ed33db147ab99157129753381814dde845eddc70e3349830c43dba8af5969a3520e644d3a002ae6a3ad4d2c46bcc18794d6710014216c498f0904856053197840970c3eae32dd9abbf4570c5589084599caf737b353938746d39534bcc3ae0ecd5abd868237e7e6bcc598c99f4606ce5141b5ce9b0a1326609142613ed424dfb6577b53ac84f0cdd04391b809574d118a1af532c02dc676797783f627297fb945d1e1dba56172aac196f8eab1533de350856060de9024b0dc14847c33c388b6034b8c11673c3e83058e3ff24f88b33ecdf759648d804576bdbcbe798c51d3f328efe21f982e08df1a1841e528b30de2c6c1f03d76615d7803ca3773420ef24f8af4432a4682567c14f33ec95076163be662b2d1cdac93e6f921ad250031e1164257d9bc3581b3661ff1a3cdd80c59ab9de9995876ed0e56d749cc8c2f4aa1b35db1579c6e66cd8b865fcfd1103f06e7a768fa0bc5f3688974a4cc0583f0ac7d655ccb6c5dbc0a7f5500c0e24ea2257378ae0164d243c9e95957b49652e25d0a91a576c89789ef2849788e0eb8671d34b3ee5e0daf0ea368dfee1f1ebe259553b19c2b5aca8de1a79d97212cf9c9c727071e0bdc551a2a28695a7b020f99e60d63407ea20e6a4d4d2c6b3e6e0603ffe630403bf680ac7709342a6e7bd887314214afd0d49476e6ee77ea5ff432d73392379fc0b9899b3e4f87ae54d41870e4638c5f0405da89964074f54a18d53417e9fcd77e29488f02ef21af4c97a3a498eb49b374ce70debbc16025353b4ab847f133fc3caec293daf0b8ccf270648303927de43e8fb522f6137d06db75b1a65061e14ebaebe9228b58ccac3efeee03e67f87f20560479e12b9de2938b2f0c2f11915559439057815ebabcfc7461b78c7dd01738512b0a3fb91ed6963cc32aa0e72c57642f9233b12ea760c843bd8c1450c47c2db0a6673d02ac0dd60ee08aadf510145287db4564f8c31bab73822a4e9613adfe17a0c6f9c585a1444367066771f2bfb06508bbc6fb039b2bbc5aae55782f466d70e2b574feddd91f43b0f811330b2062b9db98fa17398018ec721cd5ac009ad9eee5421fabdcfa9ac2d42f0a9f3cac14e41f8360fc84b51e97c126b239e22ef3b0e9bca7292e78a7f56513f5b79827c4978e338d53113b02c2486b953e2041fd781bc2f1a6956237076f45056248c868ce2df2bfc6fdfe4513e940bcd62ff73047f334570325088c4521d642adc5ede8a7239a51d2a30ba379b11fc858afb81a7889eb46b2bf4a918e264c639a9841269025d3efb80424ba764b41e1405b8588c64d1824fbff30a3b2ffad50800f8c2f69c8cb5823bbc6a5de65ff8133fd7c428b91e46bbe5f24bc1dd2b9ae1791aaf487f346fd41390ec323fd59222b65107d0674f0165f015df9c03fa2e57c85d7b8d55f90e5379b8c7010529ffae747fbfa082eb761baf97a2e2268aaf90c3424017c224837106b10e49110f2a5d2f99048994b64336bb2846af60e5c877f52a8d6e5ec95dc107ee2ba1a9296fefe95e8acf0b152d5a0b75c65d5564d0416b50741f0ec8051e508189983042c192bb4f6b50a7290787c09946cd91d538c3c0aa72b8dc37bf39e61cd2d002d4a831ac10b1d450016a7e61ecba16ad0d49afa71661cb9c726a85443eebb5026d951aa056193fe8ca0c27ad14c7dee50b55c14fe08984872157680875b318f2d33030290e3429d5950658242170651337d16e94b11fd348332ac2bc1d5a156dcdf9c091f86c1f483a34a47596f676f92b7a330df8f262380185e661e15bf6c255d46327ece19b54888b127ab71a837804a5b3deb3c6c7683790b565e5f7e33c5703b06904bcfef336dd49a6d8f663e9dc3bd6ebb689816d7187d6ad0df2a76df86bdc4e08dea2fa22607c16d1ad42ff9c1a8e54cb43e925c287c4b75c0c857fbf619f33318158ae0ec8c72680afc043eac86769304d1ce2227e9a7e093f3bc0b1fd12e7c3ab6c90d6473b37d2f87d62a10480754915bef7ebc1466f1031a2024a54f2dacabb34fb17e25ea5be741ec515afb1f1680b257aac75665765c58e04d9ebaedec83fc73c0c37f94899d3863b99d2e0d17a931d5e30d9117be7a943d711795208625b871013a9b3bfd098825dc08270626b03863e62f8afbd07715aa5e3661336d8afcb5a5d76df7746abe7564667885bcd9d406cd16b5a9d4959ada4d66a58bb03cf72acbdaa6be6ba6ebd3a67ec6758e5071d9e82c243a52a01eadc27ef616e0fb14b5a2ca9967e888c12a9649b4fbad378e1c34a6b2f224621beaa4e22dd28596ab2951dc69fac1fc7b1bf78117cce218265e202471e5eac66bcc9a4e179e9468d14eafc9476889298a6567e7ca9c5d5fc25113316a39f1e8bfcb8d7a7759a34e1d76294b12df3a2b53e567e0c6074756a595475ea5a0aa0370498096f8cdc1fa62c178990bfceea4f34b0f77a5c9d0b66ecbc551251d26980c23107d743ca11a1d0335dd1837e9aef858ff4fbf7b6cb11f3ed7ae502d264361639320cf24377002cb90de0d24235777572bae9682f5e554b8501234dd49308bad5dc8b844cb964dc016c9abee43bb41e9391d5a6982d44bbc18514f91d0fbbeb5a7fea52673e67611e3def88c4bda27752b27aee9c033dadc6404b2d3914bae4cf442ddb8c0ae35bb3206f49d48228b12f237505cb8119d3ee9f35f4d6005c636d953f7c203cdf2d033c36643db01e87c573a7c8e81a10e7a8766e738453907bf5f826c3f355a49884ce68102b3e6bab6a36c6bd47310e45300cf1689385cb4a46025ca25bff20c93c54cf36103935ac20335fbb5937cbc3073344078d38e5ac743a7e23cc44b36a9d5e3858935e088ddd52a3c7d7459f6d4562fb541bb3b7fe1d9c4be2a07e26cf505b011921c5cca74519ff033e9decf3df85d2ec518a654549776251c528db56f204125c76cb12c30f1e6046652b58b37f826495e7bed21d57504cccb43ef90fb2fe6c2c1823ae2ab06641107122fc3c60e11f8c90e43210c748bb2c1d5aae455e48607a2d72f10bf8be0bc1efad2c9ce63362ff1c948fa37d1d0212cb25bb1d14616317ecc4bc93a04bac6fb4c72b71a67949fda8804ca17363cc9f6bfbd033c4e86ff5a2526867e22d17a55a26090ee1e1352fd8cadb3fc8fcbada8b016e02813fc665c30dcc3f1a8d588ff49e0c50a1a07706a5bd92110531ddc00ec0438433498188a77e40352cb8a70961178bc404de808eb6b33cc6739190cf61eec6c9e92e168b6ef65e769e57193056d607f88d7f93375a718cf73943af6aaccfd88159c128dd3cac2ba6039c8e407156bf9f0a9a19e16500e20f5c6e47b16c0b0979d4b850c4d3920d8a7d3cb39083bef23f2d76ce871b28106174eed3b693906a66c016eec3d3e6f4019d334ca160a2842f65a03d0d9bdcab94d1bfe003bc4686d3c7e054756c1f56d56db8bd95e90a2798736e1ef3d7ff9b275e45b686a1d81e0b8067b55dc3315513a7a9bf18e514f99136b4ccd45c6b9cc16f4032b1f5a2621e937dbc8757e6b2c4e6d057acd9363808ee792d210939434c333332c1307df9f3e7f3cb187957565a214021618b7f5926ee1a21227cc3772bd6b1f5c612d7b62c9c0d3c0fe8963a3a18a3423c629fe338d1d5632e0576769955e5e02997782a11f703b1860f9f9a3f1ea5d81cde3ea1e0b8807ed7469acc4e59498884bdd52056751949810342c656e9cf113b76a966ccd79f9193f0c0d5db3e1d186fff07dc2b64dd8ed464b41157ed25dc6bb0250cec30a6be76c9cfc769e2eaa524a53efa7f5702cadc9067a67d26f00cc70cff120554d50b34327d58493f6a276cbf498ae496ee862e4adf4e874058a65dc94a3ad8116833fa0f85086752d80344f564f8d0f0ee64f129a692a4e0b3f145a4841d374ff386e79245a5b06e629035900e979ef46c5f5a926d7832bf3fae2d2982603639633d248f57e74a1fa8987c1ba5b3c50754f204ede12bcad6674898638a94221b98682a86372c56d623d4b58137f9afc3892b0445117d36be10ac8a25762fd4dc0b4834f2a06535336ba6a9378bca7a70401fe83b769bc77a77ef57c7abf3e2f8ffe23aea0ec044d304a41061e285f9314e915518699cfad3918dc1d92b844bcbda992a7837c6e7da881c99658926fe490da7c421f3b013dfe9654d682d3f3e12a8d5270d1939d40b17c62a650ceb02ae5245111683a30269a8eb8c11de965134242af48a728a72c41963f4e4d661255b8b64a2aea124a57e9ed8d4a31ec5170ab138d1e0cec2c035a7ad48b98c475f5cc6091d49fdc8687a80a8f36312b8e6e241738bbc36ab902cf2b9f0c1067523b83bbc81f60aecceb0a7612f16cea55a79deb0fba8079660981de1e32ac2af310b21de663f6165137a7670403a40354886a20a0c3fd32678019274017ca2143adf3aefaa53071ca1ece46d7ad649207f4a3c98b6c60e0180bd31200edcd427a462aee8f51bed337058c70329bfdf55c4b037fbe1088dd9091c8dc27644fd6720148d57a5bd4a4dd60de045717b7a36dd14ca46326a4667392e5626b2dad4f05a352a3cb6b1ec987def50987484b03259bad1acdc8f997bd8dcdce7bbafde0863bdcceb9c02b5758d4ebf71eb19a764de3e30eff37112e8e22d512a23735fa0f647715a43a7d2fec08bf0a954c84ef776648ae2aa8083a2fb885cfd1c8ccba8edf181cc006e8deee4a25f0862f35cde9bdbbc7f988390bdb07b3d71f94af5194f892d8e65396205493cbb55fe729258f633453fbb1b231d368c9e94285636a06f3ed1fbbd4c96af2d4b69880f50487c5d44850396c7e5185bb6bcf7a36ea838b64788055c59f83a9545122e1af4ad8bb1bdcde92ec16e71d16089ea580b3f26701e2d61875b746f4346e554410dd13f410a075b1600a0fb3e16a952074c549002997f0f814fb6b85e32816b4a3cb0779ded4f57af2795bebe0ed081e7d87936fe2e91d68451652f326c43d9a7654f14ccd100af2aa7280e46a0cffd56ad0f3c1a9b5999dcc3bef8835c068c6dca9ecaf73228dc216a6d05a68a9fa6afca01cc0bc9b31d05204a49f3daac94391a0cf11914c8c6a958d859337e1a9abb03f2fec580ae65d3fbe15a957addb42d336b8075950cd0818416b51f3ff0418683699623964ece94c81a083d77ab91664d77525afcd65e28f594d0797f1bbb4c3555b172cd11cdb6d7c72ad2de5d07a353ab2cc1a12a0c8d9170bed44862bfbe59d287d83f1719076b4a3f7f631479f21eed053f85dc27ba559464973319ce831713ef34eb5fcca60430c7d2bc2909eee50f5526edc5917355c030eb6de5dbe23b399eadc629a5a859e1e29db9ee1b6cefbebc859aa15191900ad89b696b5ffcfee17f9bce79f80255461966b50b36c98607f1af1ecc45bbeb51a863fc1410398c3edfd7d174865126afed7ea04a8038b64c59bb8112a6e9a82dc20163e4e89998ed7b807af4b8cf5a3120a5b65c22815d77846ce9ffd4005b3510108979399b58d5354168647646d341360174d0d93cabea8ea2775d46add3ee46a380269b4ce6951b8369f3f7733486c35ea19a115f024621d63e2cfe59c5e95ae8937f43a3e8e9dd1af50a3bdd5578412c8d98525e96813b7f95a3199f1a892939c3699c644c8938147eaa0ec96069f7fb84a18d01ef49a3961ec85a4cbf9e24075eb99027b7ab13c4abc728d99020120070651e6238a357231472367aedba6206323c5f55d81fc7bc57e48e3420541644d1feda6e6c1116748415e9d5ad7c04a1e60e1f765afce0d6523501dbbb86ffdcf2d39be6efb2c7539783f1922ef30f84b6491e0863fdc5f1c04117f18c4ce9b80236fa9b53db32c0554d9f17491b0594ef7f34c2a92f414209122450c94667e2a28b2efc03e59ed92b9083bf570eba65368b239c123ee01530662006d4f0c5ce44b907a7da50df630223f498b10b122204e510e5117e0b4013c83fd7f5b79ddb343c3df216f58f7488d205e249e033cd6016a518a831cd8b00ae4c866125d23d30cf2e0f29feb918381c65c582a5e87046690f4762a5aec1d996d0b189e9f420233cc6ccbad94c3ba8178979295b7769092ed905223e1fb6b7fdab611165a78050e7a7c702abbb3f1d115e09dfa1095b9bea1713d7595f1c1a113e0f6c8f8603946aa4e16418d2d9a98b1d8a81a45a562a2853f80ed586eee46f5aedf7f83036e13636ccb5bd97165ad9376361d629aaecaa05f8569355de509bfb52c4bc9c10a88020e8efe2de7da90c6c1e6aa632c4849150e69942e6d5bce299700f2ab9715a6a06972807aca14f93768b5920bea2067f008d1b2e19407aef6162e6a60d16867a649b6267e5041e48b5b6cfd12eac03883f4bb3be8a5c40a15a2d57640d351177b18a96c91e573f048fa5af325a21c830688fdd00e0c7423852c56c48e81c46557fd6707e409cf9ebbdbfbc54fe8fbfc10e9b2a517a7e2aa738006ef5c0cfa516901fc56a76bf31f00328047f6c2815da0dbb329267c069727191812f4bf3d00947c01d16833e860589a3046b98bb900486a02da0aa2f6d02db7dac08e2b177ea337a176a3e7abcb90792a4474f4cab9534bc9637b505b9d64d1de08856fc21f7d11d6ba263cbe48f0d50cf5e4eed6f66ed758551594ec95ec7edd9bcfeb5eb00bf29d0dde73591a419861ee039c4f649c245aefe8b39c269fdaa1dedb04dedd1bbb94fac7d0a972ebc5647eb8786b3c605a46aadb082ecbb2fe7a6f4ce63345853250b71171304ca8be2129829773cd76fa31997ae782f8fb9e70fe8d804e42fe169dfff0be823574d96d1c907b92e1da04349609848e014c6aa3c5fd8fcd4c37949dba21963d4446d19806720c3ce44ad7280390cc6fe20441310af1181bf2744793cb185545a52d80c768375559274b2769e731a8ecd78e97dfa699a3c9a5c03e7e639ef205c1581555a917a4a9f7dd07f0abf9a1e7e0be0e159f6d26c193c10512e19662360543834e911d3a1c98c6620089817a5d72959cf5d5989c5f178ef694179517f98b09fe0bde6caeb1b2c0345c1e52617f1158fc179476efd61817393e573642da67836cbd3e4b426322d0a4e9cb2925cb65317964dc8983e62862334491d523b236293a8278919022b3cb32e6b3ae6a3021d2754f842e33c4cf223eb336937ba8a331986d258476a79ddc89349f489a9ad54409ab9292222009de2093998cec36fc83400364484a3f462e2e839d45bf6537850ef604853e50386075679128423c39ade3111a10bef4256cd4cfd5a8fef6249e98c2fdfab7a21a2474a0736690ea3908c18661f3c3da72e1204f398d61bcbabbd35cc703d2e0c3e80d70902d076d259d15c405cfe0571b7ddae4072fb64c2af7ee75bdfad32a6d0f85319434c409cf6d14fc3474031b039009c9ea367d975b79fa621c1642cbfa2ab18b4a590b425204e47a2e0c1b4941e48e0e7194a85c0b2f29a0a75871369ca2cd98eea318e2834807744173eb96521d0b2bca7635238d9da0a0fe8c414839889f874a1a336a38611ce60242ab2c0ca4df69336adbca262b9edfe16a5767b6e03b65efadc7831c1cedcb9073ef36a86ec2e6686e3c67b442f2b46bf604bad5961bc67978ff3319a88a62e748509a89815201869a7163062c1d0a328b51c7d6e5244107e9410cbf71141ddfe7a02481ebed1c4851484346a13e1d133a0780e1ce4d3748cbceba4915a28620a3c70730d4e0c8985cc860fc3c8b61ae2fe37e34855d52d082b8f25a43c6902971637820727540710c9a9cbf0518e47030451d56ece01f1c9a9e0090eb8d2c73c019030e77916b25166beb3b929484a80c156fd99b06d000e62f87f3823168630e7561b03ea7a53c95dd3e48955f69ae9603d9cae1359735967cf810946d8d594fdd8643632903e536a2cbcfe77ca36b1b1974faa77891a2d89277e20b5af00b4f6d960fb24a1208c39aa3bb6ca242150cdb7e0ef1c0025e58d6dc45d5b0ff4f05835ef6c54751c74df577ee6fef71c3b4812aef1ea3025cb1032a6ce67d5c400ec29236ffcf6a2bb2b3ca515edfdde2defca42bb84bf1bb1ffb33979f2636cffc05bd19de778f62de66c67b770707079fd03c069a0ee4315072ecb09dbd8e54bea81158e09b1d1e2d2045f41091b445f677b7944422bbbb37b70c640848075f07302bfd5ccfb08c046f36ca473e508c236d08a1eb3c5f9783de82abe1e2cc30786f3e82f96857564d368207a831c66ff1375ca76fde66b66c560ee36b568beb1ca6a367a35a6b7eda5a9665d9e5b211f4ec2809ee4c5f8232e93a2cc272d6dbddb66ce4b00ea8babb3bd499de2e978d6a6ca949ebebb05db7added88afecb371b410d6036aab5e6a39ddd7b6f367a6a0171a0561036d1719ffc75bff75ed28f3ffc8e28e67ee483b0fbd3c222a58fcadbe9d8769defada49490c893eceb07434aed6316a41a849ac575bef16bae73aeb3d63efe4e6249b91cfcf733082124a2ee37e71aab971c5e5d167dd6ea33fa91b5ba99c6d52cc6afb7adb51816590d16e9588cf1ad346f69b8cf56ab5c078be0ed814537ebc1977aa981b80986f51881cd0691dc27677f75f6cb9fbfbe28ec5143a369d7ddfdbe7eecd3dcebdf5bfd625c0435f0aff7ed732bae730cdb75ceeafedd9cdc9ccefdf8e4b2f915cfaf386977d45f843d3dd63a67f698086a003fc347b346ee67bec3ece96b5f2bd761d8a66f6bfd5ae151a5b57a8db13e9caf77ef116144229bafe1e29c3930914e4c635887613bd3b9460dab268b31b6789b7963b3aa9189eb802a248a5f399b165cacc19946a6ddd7db735eb9ef6b4e9f9868d72c23ae747e5d4904a5122b262559683998b3cddfe15d047b00d53debbedf01d5ec21bc3a6ece5cae1c2ecaafeca9941f932ea875e75f653a70ae4fccee2213eb259d27731d50ddf557dcc3b8086a007151966518b66fadb5e222b9e41a62b2f166bd3f91d90bd82f4a0aa82d0552145ca438b2b59dbd1f6d8d85ff3d8f8510c21f0be184b673fc927b35e94f09b3f816eeb9b3df3efcfec2ff58af69d9bb94d2df61d23bcf5e3ff545d8d257eed93b0c6ae09f3952f670c5fd645f69de5f864359f3345ce7bb7e0dd7b91f698e7b59957ea3c20d3988307ab4ebeef01d06aded72aec17ac96116fd1e2d1dbed6720dff1fc87530cb39f0f6e720ea4d3acb9fb696d52ccb6c68dbfae39f2fb97ad197111d763a3668df76fa86eb892ee27770679fff4518361cf697dbfe919f7d956ff3e7d49ed8b633fcda7772d3ec7fb0fd9b3d0778dbd2086a905dce8d280dbaa194524ae946f000b3c64a8c514b145a96087a01490ba6d041aacc992733e492275cb67cd2450b55144d42082184104208250771a439daead75aeef1c0872fd7a836fb456981da5a76738d1839ea6563d2125a4ca541ee599f513e8ccf3ec8cd282d49568831c6317a9ee0868c96455a23685921055a84eca82c5fb248c1c2db52e8c9202aa0019bee514016293bee179505ca76a90044182752984891a4354511570a56700591e5e804597e18314305a645854b4bc815149270b910c54542ac8a1ecedc906486960f47c8b4e01ac28422b09470d3022c3da2ae20a2828a2c2d26aaa430258a10537c7061716a99510112277009b9f00452abc815202d16ae8ce06a010b97942e5d9eb8b962891618d102828816ec898b053ab8bcd070e3850906185a4229b458e04410d790134327187363451451b4ca54451de1322ae2e9879b2c9abcb0a4850214b87c20e2329274534513427e68c2474baa4cebca9711b620391143c28584944b4b940a3c606143eb49494b8b1157092cb8aca81ad25aaa22ba99e24c12615a424ce192010b154a8891c22408139e5c2ac0c18914fc88018bd2095c9828baf9c284095a348871f56801112d3a58719a7a3284d20a9a72704dd1d4820249abea85255000620958154b08b97ec862852a8680c24503132d22545a2fb0c00754931d5c46d4e04a9281842525159658316af1608584961464a6bcb88890c2a5431348542d134069c58020727263868992243114a15ac115a6ca51902a3f7630d30498960f2e2e2757ae2421260a0a623754f470c30d2e2666801d6931b5e0cac184224a94d0eaa1440f970d57fca062862cae23fa56696dd1774acb6808d794272e303b34b1a49544925614232e282db89e38214812405a4392103a618cab8a97a12d445c3952e28829ad150cd10ae2890b861d5c5c96b47a48d2cac1080f2db89e9ce00412405a312021e4921a93c44beb862dae1eae984089d60a535c4086b8b1e2890a767065591245122b46925a681971c21254405c3b50092931c6062fad315baeb872034689569329ad3043e0f0e4068b1dbe2c693149e25a62c465420b474ea8e108202d274708b5aa8c711d7981624b0bcc951494702d4d996108284f56b0830b4b8448d20262c455d582abe9042f5480e04045a895c598960c5e5c4c5b905c6959a1440ba62831c4094facece0a2b2444892169411d7112d6c39a10420ae226df78b3242a808322880194245abe809170b5537679068219992b2bb9e2c43ecee5d354c41edaec77b7caa498c3dce15a04c18a32943536025b0f68b9a828214262a65898f2925079894f2032c4a8902b34294e547b65f94142ed60995514aa9208060a9a9224d6a8912b29b2ebae5a45d5db4d311e5a2c4e6942192dba0f49b51c894208504989421246421b3d2eeb446f4a8cdb420340c5f5253524bc418a39c525fa2a49ea094d26a8fa2a20c65f8de7b332d0a5394251dc5294a2cca14168bc5d23a0a972858a290d91b097b731e1b9bb7b1b9919c94242943b42a52477e4825816521a570d85498503e26d4152353cffbe4cc841a1a8173616171c062c2a82750512ba8b2a1205b2d68282d25b1d694aefb4541f1e177a0e0004586dd7d8f0cab305386a2a6c03426ba24871f70142956a464814e689b529414128ccceeec97fda2a0608982c20494a9bbadd49128a9241b10207a7acaf46c1b196bb79d1d971929776209969040c3932c59b2289af192c468a3c2139a2efa7138401049196113da8b71f5f957ff76b68edf1a0fbe8d2eb2aab3b3f3baaff99d0eec1aa3b91f1aa3b8f6dcf5053c3bdb37b8b3c1233d68d084006c407bdbfd63c411f543d2fe8823a4e1c7f86cd09eff0f4c9aa27e807247b2d3e3ba4207de9133fae96b8ef5d21eafb6addd4ab54d4f4c42736c29844118844969d8eab88f5f2a5168ee5c13a5d25f4a4923a5d48daa04c569a17741ee4735bae46895dfa94b850386dda0c1f7de7befbdf79e8f94d1e39933f03df8de63bd0de41b6ef85e4613d3648c1230fa458951daf53331b0fa569b33d3d06f6b97bdcd352af793fdd8ec6bb759fa9a7bc3793ef76bdc7cbbf136fbb8d6d7a0ff646f69c6e81785c513164d5aec2ccc7edb1723eef8f7c96ddd0704dfd7be18ef3dfa7f41668302f4bc410daeef986fbc996b646fb91c1bf0fad6b20deb5bb31bc09dbdf6824ffbbe9659986dc01e3db67d6bc3bee56452e6447b8ee5e39eb4711b42773d3d11c6ff0645fbcfc73d1731c61dcb68cfc110b15fd4972aadfda2be406df71fd7e1798ba2fd9fd0b66ddbc604133bda7bcd8f6fbe362bbab31be2d7db167b8c0efd09ed39fd2ae5fde9a56abf282f52db00fb457939b22dfec2e40bd2d6229eaf559ca7dc31cf1bd4561cb48cfd472dae34e80b49c6898067cce04ff306fef486cfbf786e2d62faf2af367cfbf3f04017b465f8bb36b71390868d789311b3fbba34eee5eae3fb38fb9773d09d3dd8d90eeffbaa56e6fbe65f86bc74d99ae3ad7bb1ddc7408185d4d622ce68de60aba2b1ac785b0b82dcdd96a3bee867cfd20d29670384861c7ef82c162b9eac10da1aebdda94be589a66d32aeb36fdfbbf9a02d0cec9fbddeeef45b986d689cf549ebb6021d9fbeb42f7d5fdab10f3ada9755205501eb40021dbc3ddf4e6dc2e7ab19dd57b54b6c7736aacbd3267580d0d6be561dfa2ac25dbd873aa1c5183f564a6b377f2617a7d09e575c040fb0dff77b9739f77f2ed0ad419bbea4c55b72b8e8452370d1a5b2f7befc2b83f6dc3568d7970ebc2977a9cc200a21161e2433de2b6df5aaf1f6eaf1bf3c01297fc5c95fadbec6db2b2e27fb9fd5d3cf381d20748e8dd5d35f711fb4b5bf32a20c0fdaf7a563dbd6fdc95790061d8b26d811122c4e0c9b3842a227717c4dc344b888c98f384f7c98a483c64518a6431375414b82f261cd47ce536b7c92f169cf3aa30be9537b6598cb88d239981477500c81331261d3bc83f668e513ad4ab2cf61bbe4092a4684d414d586837ed24ffa49dbf0041523426a8aca7db44815a9621527ad6d369ddfe1d996dce9a4b5cda6f33b3c3668b8b5cda6f33b3cd928233d69296df34f50fa291b65987e4ada9d3f697fc29af6b4659bce465539c020e4ee6b9a63982167a3750df835f8b8420e3bcf0d717b1b13fd737f6aefd4043e41b90f25024ab98f563f7e8cc55824a26a725f195142254c4d90c97d94c0a6ad863bb71cb4fdb7bb8d4973bc6d7bc77de484dfc1dde1227800c81d4545c1b43be80463eed341a6bdb4e3ebf090d9b1c58e51510c6ddbe97233c7dc9c60bb73a7089d76748a30205374daf1072dcb38e8742f17b9ce56a628855138aac1443535f868d6d4d43c26aac1493535353535180689740d24d29846d71a1a8c8b70112e9a62a8a8da70c87e515310f1996b915fe7d735bf56fa11616748e5ce35dfcff5817c5b4d6f86b36ed142b768a15f46d4f981fc67a5695ab478ad59fa59b9458b97e134abd72d58ac4c59b6c5731da4a161cd1afdcf3557535bacf4d7d4e8973472cbcfe2b2afbf7a652378807c43db19d7d1bf39fe5667695d58d2f37536d25a7f8669ad334c6b9d8f1ca67f63659c595ac7b2f2968db25136ca4615891628ed02ec174545974b7fbafaf245d87066ae9bacc7ac6cff029d58fd9bc5cc6265162bbf8c98b37ffd6879c5627dce383fce58dc8eb8599d08fb07bef62fe7d03ebf0c67e1cf8f3916877fb5e230b75a752208eaf48e3032c759fce2a4e5ba7d549934655886655846da369a2687b9a6c1ab8c31c6eeee34347fe3345b8d679c8d367d9dc418e3b591c6f7f8b3230419e15f7c71d2cffcb761e62efd658438e4a55cbe6c04ec17c5e5698a26770a25530cdd0b54ef773a30ebfa63fd2caff1e35c0733ec5dceb8c5e71a9a5fe9c03b7bd62a638d03aa3be3ae6f9ac66d97a67c9461f9281f35e95553d2d3553725b5f8fb3636fbda6affe6f5dcc5dd746c5b5fd86adb1cb66dd9281b65a3a61a9776a5f4bd3af9e253281d5b691fffec0861db7f7bfea630faaf931bc83bc8bdf85b9e7602f68bda02e3d2c485686b31db2d623601f68bda22b535c714dbb03effed1161c0a3c71cde175ce0abf75af3d57247f6f50b6ffdcf691ebf38177ac57136e334ad0bfad1e46719771f46cbfdc0af95bba1edc975f0658c4bda691619d1a58a23709f9cfd4645814dc77bef8df8de186f5c5d2a50838ba3cdca66d639b93a679df15e2cd7efd4ad52dd9fca7c1cf3af5faa4d9592605574e1f088deac669702999476a95cf71baeb32db81aee4edd7ba92ed5bd54e001327f0ec3697cd66f55afef55ad1bcee1a592655946b4b51863bc542a7caf0e6ff72a05a57a34f9d6e4fa052197ed97cac3a2e361b9f32f15df36891d0605bc4aea78581e169b9dbff32eda79f253c03e2c5e75a95c2a59965daa7d6badf5528939593c3fe5a3a7a5caa4599fcdfcf9e111d10e5376efbd56bb376b166723cf3ccb471bce39393b27179b97fbc9ae43e8015f6700f6ac0f816dffed9ffaf3ef2bc772371eb0677d67f6cb34098ed103620a272c50f922454b940e4ab218d10d43623f5ed878bfd80f1362444ab11f4c361ca399c39e73e29410dfc67e0cd95bec4709677080c47c50c57c74511203a28453e44efec3260ace8f2a38100a0e09d1fda573b15e9e8bb73b16072460792edea65c379fe2f8d0aefd3eb0e13f695d1bbe1d4f8233c2c643005b0441fb08f99b165de9847e75ad6fadbd3077007bdcb5fa0e7b9dc4365bcee946724e871dbdfada716e47fad38ee4994177ef69fb1e37f2d78e4ed55401efa84067c0036d849e8476a71eac4d949bf946b6e1fb3b05e5a572a9dc07fe8baf10e0739e1e34e80e3231b9cbf8da96cc3cbb99d1cffd3d7f21007a31e0c7877a71818701fcf7daf1ed07dd41a919efb5b73d0efb732a300c5681445218e3224c848b300c37515a428afd911438312969721f1b0c8920112ed29b5729c54898da06d82f3614b5638f5d7f3ef94fdb747853ae83506cf86e64fe6436ca47cf977667ab765393eea0d30cf83006fdc1874eb0097c729f771eeb366fc79723a7b3137b486d1c1368191b7ada4f8b9eff76f7305e171b9ff950ba3f3d9ee7c3c1d093c7f37617f7ab6769e868bfd8508fedc37e31a126fe5f6013d824e6c58062f6d39bbcc08b012ff030c0ce13a38c32461921d28b0191f6fb23cd5f899052062fd3c06f9ba2a196f1ed2d2340692c7ff81acc1b14fafd56a521ccc5c02e5f9c07569844e53c559cc7feb6843ea2d25088712eee33b7283484493c3dce03313542cf39a1d21685863106f8246c029d6093769e5a391bf9f4ed6bee899d87621de7d9a664f0a2a70132e8dbcf79e0d7973af07e39159fbea947c47e2f85c57c6d5268fad5c638e79c336ad9b5f6da2bb4b86dd1f2e76bda66739ded3ad97b764ae9b362cc791573ad974a8cf7dae870b3a2c78bf676b6277a74ec91f5b595b1d9ac9c58ffb675bad7711f8c3fe74c639fc6eab7411b685f9ad75bb1f05ee1af38bfb48935fcaaf65a58f3f5714dac9952dcdd8336dc9452c9e5c87f3bfe94d2a394324af727adf78b0dc13048570c6d4f68dcfd66857edfd9383f83d7e33c0fce785cc7b3dfffcf2864ce39a73b76f7e73c21e8c73a07ffdb8e1d3b7eec1863c7733ee9cf7ebedece4f5f86af56abd5b3de026d8c85b5ca38bf8236d678368549af52f83af605cb97a83058f68b02c3654b305536b521d4e7baf7c1fe299f74dc53b4e7ba8a588f2aca92af49295b163db55ab55a6bb5afbdeed72a69bd19b8cfbbf75eac15107fd21c2a89b459e68bb67975e03cf0be071cf800e65be3edecb50b2187eb6b32d3b8f1fabdd65ecb592c45cfcb6d52740733831739fef0bf2059e95100941276e03cce011327254c5a6909e98806128530021b020e7870010c74c0818c0824a1a3ac91abf9ab10f60acbd5ea31c678e54faf8ac69964507952c08a35575246c9751f6c89a406cf1a29a364c98852466471da5de06d1557f2e7ab931b471925123abe8c08028df834e66b71da7b67a6a141c8e5d4781b7239acff81acaf407b3ec6acd78bf95f9ef3a503efcce1f8c22f191149cdcb57cc346ab808b80bb732a83cd5ac409bff76623da4363462bf2833488e99d09d8d31c6bbe9701effc079a69c8788186ef2c4a4493bc2a49454617008f6f8eca98e0f746c1c5042776f4e7b33d63169cc9ff74ece613bc629a584704228b357126ca2e11dd0c031fb0d8bb63f907b21c95bc706e4dbfe1052cc316a1e44176ead8dd1460fb4bb80d9431b71c0b81da1a10734e0d3b0167640757fe0c1c60307f0572bcedd05d769ffeac1948e312772d366cb3828a0c9d7f6ba4015cd992d8bfeee35fb1201dc1b12babec97a5b5fb2d6f9f9b591d1f3b527ed7d12efe93e2f5bfdfc2dcb5ef31cfd3facafcfe2eaebbf1fb4f3ab03da59bfde5b9de9c4acb53d18ca30176e57f47bf0bd07ef85f741682d7cf642c8c9f7af7b1fc26ae73f776b39eb6eb56addedbbf0df6b3b4203edcebeed6ca63d6d371bcb6d5386f34c05609f6fedfdee69700082dc1b0fbaebe95e6ccf9ee862becdbea001b66619f4b88f85776b558eb0de7645d3c775ef753c8aa7c59b101aeee7f43577cd39e8a613530ae907bb83af63db6e660866c8d1d72a86afb775a4931e6d4db8bb95ad898d422c5b4c771069c7df96d094a3f452d5163a1d9b1ff95135017cfe684028b56deb80efaffaef059fbf18e78c73c639e39cd1edcd345eadb656bbe1fbf9b262587df4c597f78aa6f94b8b31461aa3c797479aa10cf75adfdd29b5b87a8df3b9d328ed7b5af584985894163251503845414134866aabf294045f48b4a72fa29fa17dd2cc322e1f4d0138b9127711ff1e711e2598d4447702d8f1bbc72e00cb83e69e222c8a2afbb55f54144e5b63e5fcd220f69c390ccb34ecc320be5582412227ba63ed783756bdf7e69cbfc6db39ffcc3f3fcf5f3d05dada2a630dbf82b6f6aa9693be244fd8cee80b36335a62b1d9741e3ba7fdeab5f94856cf7a516b6d8db7319793ff077f7dcc056d7f75783b507ebd9776fd2523aea4bbf0cf3c12d917e0f4d09d8531c37c615f86437cef6759a65f7f7e751bdcac872ffdaaf1b67ecf1c44cd45adf5d7785b7339abffd14f7f15408a441a5518f5408118292d4daa44452188a211248c6070257a985042589ea02105467a28828930491811813f8e6431c488fc9e09068671424288981052424d481439633483c081c8842b42e420868a8c0f505431542525c80b08f1638a1cb2c8a082148e289244042795215b902233f828421b80c214145b86a678d1c18813285181cc952d45aca061ca07158f420b112b544a2c711465069df203121148b444996c05669082e587092838a1420a113372042216746062e28910172824518888f1016f684249280c112846a69841af9820849011d884c88f291ca6ca10c18354112641600850411c7962041915846c31001952e1d2924f20481246b420440e4e9ea01089a11e49618811b445132aa4a04cac8a99a122a8966250126204d67a04b66b25d2b51ee9b16b159a1a5ad29bb6d19ac8074a9d362d82029e3046300153855094120ba6822cc91b22504230f454c943f43cbff34f247fe7f53b2087129e96f8c147165033ea83dab512fd7fcfe5a1035a8aa8614c192233ec30833e01e2b48890135164e9c7120c2c0c51451555676af831c491268c88f8d31412c2889348a48890113b340822381005e9c0c4981f66ca14c10405028a2009e23232830f18a2701283911dac0c298acd6004c916285ea8724491a8084491213fa6868c48292314c0080bce70b1a14715d10f44a68696a6449d81fd500609144e50456251080f106668f0c134441527cca84f762562c3aebbfaf02352c9000a494cd9618528534a984157602406a2a50ba8d0013395d4c40a23aa78e28a15f902e4022e3068529340307c8101cb140c50fb7d45daf0dfd2d086dfc1fdbacb6347dd3a0f83f7e0c3d14177bfdf7dba4de7f5769df2a55f5dfd17c551ffe9c7d94420b9e5cfbbe54f8d661c9c949c8df338dc4fcbf970ee9c73c08feef37aa0322cb2bf57647fab138452706abfbfa0c3f6da3a6fb47139997139e73edec0b7761ee8dbf30d1bb65a2c2c86156ad7ba2ba713d3f5e194f5ad8dcad99c4aa3fa8e4c362989098bd8ae6fe3cff9b405bdf4dab4b82d6a3aa96f3024c27de27edfca1bc0a75dad843534f6c7fe7c1a9d6d58cedab7336e03df75be7c630d6f3b3d0de0e0021ee818c1d0911213d7cc98095fbb61ffb15f7fe27c03be4065b30dabb76d83729273095f9c2bf8c44ab24c5c38b25f4c29a6a4f4feb2d4b67f3d73e6cc97ed1cbc6d0397eddf056da80423b3fdb597fdc67bf83beaf607da51370ef8ddddf5e3fc0d9fbe3bf7fc3d845974d96fbf167a6896661e5ff6a7ded9f195fd7cddf852defd7ee24b1022d7d19f74bee2b49193f645163caa17303290af1b21a41f33b00fef6b67539c8781bfad701b4184e141fcd7c36032d1f133d8de00397b9cc7795ebcddf578c0810f62087adce7c5787bca298f788056da980a55fbc55220134b414a62d9bf5f2c096a6b12d7495f527e9dc08bc91783e2095d5ab8b33588e90f7df903d8d96f274a236863940f83fb7467cfece5abe20ddc56f9f4abb4f4ebdbd1417b70b330b402962ddf5798daf2e70a5f26862fb835c7e1f20502d08e1a9fc78ebaf1c360661cfe72661cf35f11ee69730ef96e63becb87ffa43e65c1973829d0f17fe6d7a0a57df950a3afecef6b076b7fc67ddd128a69daf1e3d2d1864f7becb78398ec00ec174b42da4070c78790420861b5f5c20b2437a654cb3428a5ff30c85f5f19ddd9557bfab236dbbc01fcf8eae6e521b909a1fd8e7e7d9971d0a7b4fec06e661b90521abfbe80dc8bfd76b0367c18ecb72c486dedbba07d9ff6db5a55d3d27efb1da1d065f5ddd534b6d1b217feac6918bf9dbd7a75da67d9ed286bf3901b3f90dc73c33adb9c2cccddd5e797b51947f61a0737cb520ac28e10ecfc3ce453fb2b08e9afa8cc38b2f65973ed5734344d7b0f03bc7ad99d9dbddeaf72ce5e661cf7b5d7b297d5b847279ddc7be13c2f83496df8484ffb6deaaf6e6a2cedc50bda90cb360640df8fff7b6963003fb01341d0f6d74dceb9175bb4f831a4a6cded1743826df8dac1f281174e68ffc2a72ffbd7eeec17ee43a7267f42187d9c4066c7d82f7642920a5d628000bfab5fe97b318068c5b9213e95f83df9e26110a5467d095ff0cca6be03da780fbfc6e37278c8ec211783b6cc39e63f8e478ee56cd41ffa137d044aafbbcc39ab2c5b79cc37e8e31a2fb818660320b8ebe320d127342d6df9f2dec8a0dc20273f0f69fffd0ed67edc0e8823e37840cf39e43f8e078c9cb5f3c68ea5dc0be7e19ef08f0ee18efbb97d31e612f951be9cf467471d4774f9e231215481169f36fd3ab5b4e34b3047dbff0ee9b163eca88bc6b2cfd9afb9c6cd3e6707dcef79c80d7f072be7a05fb92ee6980f391ef1fdbbf920d8d05b04febbe6d8887f3f723fdccf1561bffb1dece0b679076b8be03d0cba1b738ec8c92b7940b8736cd48f0f0437e5e48fef80db665026d1e45729f9367654b5ed531c634fcfecd903d89053c005383de89e1d2a0044d141cc1de364c08e2f76dcd1be385f0e081d4fe9369c939dde4f27a6e100ecfbaba32fdfbefd982bd7390f488bd09efbecb0fe9207dc91b31b98616a1bada70c52480d9bb55f4c489330306831214331a316708cc0900959808aa525a822320cb1d28310241b13a22484f3c2cd7e31231f9bee1733eaf11c6993c0051754e001850e8cb0450a0b445780798287205171bf5810283331d891189026382a047121a3608439e70c52d402043d3c9962ea6949114b33a693333288d00f2ff8093c85068b907c294410263706731204078558101df66abf5810251a0bb4e7d6f16cb28206a008e99224aa8916f4b0434f0f4e0a3d4838483edd7f1c532074887e2f718468f96fe21763ee1061fbdbfb62dc979f5f8c1aa4b1a804ce564631643424010009a3150000280c0a868342c158308c9274b61d14800c7fa044744e974da420874118639031c618420831c400030440886caa0058956e60dc687ccef5e20280ab452f25787b747e97d7e6a747c374e0b440ffed039c2161819fad1bdc34bf5008b524040c6b078a1b826bb73164c6b104e25a5de1a1182a8559e0dddfaf4635b0da881b6c1aa897558ed8be3d22a7067dd110bdd451755cae55d36d890827c00c6ea2242af0b7b735c123c28e02c7d4b5ddf56edd702fd1ece0093063a91724ee3759ce6ba3e0a0fe1bfcc67812f4550eafad8d9bd4061dee4f034047be4a4c161e736547869f287bbefd7f5337a706a10fa0b529665954a8554ad07bd63e5a75afe02a32bfb65ea32983894160d59e4ba7af69906bcdb40462adae7041c9815502d7cd7c191f5499dda49a9537ef246d5f94925b52a0748a59429e1c0d6ad5ce4db1aa403c8299c12f217e631ae28412748b44bc896817d15c087369e9980aed45fd57479cb76ab99d79bb1dd0029bf4be2040c315221117c01b97c5fa765bb4b870f7ba2cd2b75bcd227e37a11612a08b80d0699fbef3bb66035afba84113f58dd2105a62c5c1ee03faf456cbada54b28b4d72c790204ca154c7ffa4d800d3e1b71ebbe443a42b2de73236b557cec969f099bf4cf711c82d9a630d899e46d9d518457539145ab1d1c839246a7e2dc15e4957eadd0c38132a1b0c0fb2b7e85d39a3bfd410ab937f819b6d9803e3829dfc53289ab67789f9adb51a5db31361d14f87a6fbfcf1fcb5c70d8058441027fb67163ec88ee6916c3af972b27178205f7edc3339a6e98adb6f8329b92c30bd6593c6cb3ed79a21a60e48af20d89bbf8a0bf7486ad6e600179953c55e67d0d3e603aadcdf20112e93400de01234c903aadc1d99e8640c07a5e338b6823137ce4aad0e156acca640e50582ac699740041226b0031f4de8144047e31258fd58b840c81b8ac964c58d2eb3e7be3424b9c585187424d5704ee2a0589355af1637630af50a872db3fda6e0efcce5e2df7167dcc62da5cd15aeb46c30d9a9e5c3e82e78b24d286eabdcb7494cef81ce62a14a2d549750cd5aa61b7e06713ae430fa77418d89f26336f01c1529f007a26ac139e8cce3e50237bb00c6fc14c9cece42d644bf62924d25072eeb11699a5eb237f3d5503b1ad955ceab1354a1bd5304ab46ab57463775509fadd77ef49bf9db1edb3230eb39f7353a73803ad855838951ecf4da26fd83941779ef3126c7d3a0005fc945979da91d92874c346110887285b428eb1a124372085b14657560318281452908c9b7a7735ba6393df2365916504ec6b5c49e86fb9aa06828e36cf1647aba68b9cba398cac3c63cec3ecb950292f2b163402b709550f882c3caf490b7674fd093e135cf596ca8c9d5cbd8c2607d49e73dc94e8eeaa8133a20319cb0b71f36c78cfa407a9ec64e4e4444a2eacc009b1f6a07f93e5396a07485c38c36447752b852aee692c9ebbe35e9c751e48fd2be5718b5d07999a04060d02cf0dc624b42f40b18527e653844de88cc60bef14d43d532a08fe05503afbb664a716ce0863e46cf888c01a8684b4915c3956e408bbd1d36baa98ba1ba0c04344f259b944b27aab6493d2b767044911b9e857669ade255632bb7d23d0db64bc2db77e3dc7a6f2e657008fbbc16da395a6cf2150e332a1608a6ce1d8848ada39b3d1289611c90a690e57de879b1e7e379899991a857afbdba1b80790bbeaa3198114d0ecaed30d2890bc705f096a23deeede2e709fd0925f858a9dc395295b54b15378c14e05c1b4145d53d47725d07c61ae8b028d00eb97edf118dd020a24d9135799dd4a99d418c9c28f0d19b3c52aa7672d671a7d23133a9c27a187e66550ad73850656b60fdbb3d1d82c766ee14ac1f2bbfbe371695202f49dfe72bf79be1143e5f6e3fe30b4c997029872021e79dd61e3c002667125ed1f4c23e74a18322d4eca52499a4e144d81f8a0a59f79345d58a5833ef06bc5e4755e6ec68c7e38b328a2c27c934d46c0257b473225995c6318df4883aeb062e82ab2e1950238f25ee93fa0958d65c17ddb51d2949034919fd191bf0a2f9a973225fc231b4b4292fe396098672fbb9a28ade439c007ad6387ba682663e63bc802e6384b8774d8b6243a885be794abd5908993efd73b6fa6f0804459df118d6023b4e40015b185a1a7a840ee26aebfa0825bffcb807db2eb76d83bf66f6868dc229602b9b9d3f3f33eddd365653b5fb3db27c4b34934d31f8a048c2d4d36c4da5cbb464e9928ad4f902718f298f2a8e1b15d6fbea358fdbc46e51c7bca6629ef44eb35fd58c634d34a89df296d723988bbdda5a1ab24827f02aa5788dd994b249b4e12dfe4852814ebfb3e859406f594cd0d89c98c4a06b911a76a82ac155133bdd97d29ab73f27433263811e660d9b4b457af8f54214b12692896ac49158c520d560f13d41a696224398430ba0a92b34234a80a5190cb88037d5d60a7b44ead44325c3e1125c8dce2902cc1780ef560f05c179095d1896db3cd0c88ce25dca3a0f70b2dae5ba6df399c38ecd43955dd6213a75cab25f152cc5ae8f8a71249196b068e7e4af7290690020faa38774130905b3449a066ebbdd03d5495b0679d8b8c94b1a364e9cc789988101c4469cbf84a114c38f7208acc2b4a41c9ea76e14dd47a862c7331f4d12350a70b188e4a1733e48266b1462323bc3cf1e601135a46d29dab548d9036bfeb8a51d2b89654a31c14d150237c7556b9c18906e4be54a13675c47239bd6c3ca7e6e52d808c5ec53648ee6d3a210174fa4518d09ca4f9872b2b7d222d0544809fb41cbd1f4fee37a27990d41df48fb91b0f735a09a465091571a04c0a2ec530ec93338e851898dad3510c4d12d0500c0f4a40a5999d3f2ccd03080e08667d220421d5600363b0aeb85482313ceaad93a35df8e0c2ce4245728307c08d370433207858a1c502394631545fcb8ba83e55c58b20459b6e61a543461a9b16022d32c3351103b282b11c889896ab23d7b5f3ded6f7b897d3c1d0fe53f100bace5ae87c6fc18c6b79fb0d0fa0d6d490178fafeafe0fa08428ce4478205ec50aa7cebb8f53476f2f01af821d4a12b5a3e794cd772792cefa3aa6ba88ebbf030a8d452a53db41e3bc5b9a6ccbd2454243f7889fd82625be31a904a101080c449f14d13a6fa3b1bb05263cd3d5378035a598598ed0d525e25424c8090a53154f2869d01967aada06d19c3441c31f4e42c16c2cccfbd1232ab50b04cca1767712ff67de96be262a9e85c7c8fcc26e536082c8c7e6c6331aa261b7595767105e4d0554edbfb196f3b75133b73c0058a3da77ab52ff994cb0013f9cb4dc343c06d6fc84ee0cf7aa88c836c6f1d65164080a8b5259ed7f9900901212e588b0b50efb852c852ad98678149a901d0ed498f46743ffb3813d9c7eb62084b91bb18c218bb0d7566f8e5fe82a7672f0c277be1549adedd74d4c0fd90683643872c55bc7caa8b063d2db8d0384581897c153de1de9908093e8b9a52a589fc2da8569c22e2b0fbd422705e181e4f182e03a2c347fbc5544a4566e4fc5bde6af7b6dffa661d5f196e9127394e9bce629837f26d32b18e244ceacdbced37fca6dd043eff31fa9c6c43150b9dc3397a927588c0acbc410d15a4ab6673dc583f9eefa14ccb7e06085c47cd2388920b44c84e118d936f22c998aa02a2eda228a01beaee6c045834465d3abdaf60a586aacb2ec8ea2522068cc8f254abedda11ae283d2a3265cf07292eb3433e508d040199686bc7bfaa85f6ce7829a0f5cac53f8e42a3ea0d49436a170d6683dc325318b78590be8a6e8f334b715b05ced5c838a9379287ad38d485a27babe17052a5c5d632b913c44471ee7a0f842cfc4c3c1267c1bc65978a02857056237cf739fc956900bfcd81d257c48cf5b4577157a0d284854680c0b4980b89d117088fccc477b765d422d386c3ba87960d9e4b73849e131b358dc537ba6a9ebefb91be58e67a6f43110a7808e07996c19067ced2d5c552667f687c33438fe37c5b7a4741d535ace6609f0ea466711929d32fb2c9351733ece0210b0402bac10d554cac085e57094f44b7d70a9561f52f21658d394570ecd56d5ba6bcde8aa6741ef2f28a88a40178ff17f9f79ce3ca963804a3714b4a16ce751e8d8fffd975ed01dfef1eeff0121384c7a3df04935774828b7517123c75fd573337aeaf1b7fb70a6e282dd06a33cf058a0d9afac0998dba55084fc5488920cb0730fba12dc8512952e9117ab0c0948c97e550c46e48c3ebd69450c4944c296eff9cb3a6b310d2c2538ac7c02a087b59799b2ced59719ed903777a8600342cda457c4a8f5a937b14299d0d8ca0308db154a6290a4bbb30db8d1ce56fcfb24701602a93756c8f11ec744475d92d4b4632991033e80841907cb0d2dff3e25d34ed62a40abdbc1048183f78e7dfbf9ae64e463984570e6036a488b071bb0e64c762c010877eb820afe0f3d9b46405fd15c99acb400a4c55be9734e46dd4963459bae8ed79a1289741555b8d9533a13a919072b150421dae7259aa2ca5fa4e83375b121299ec39e25059cfc938310b7cb282debf72b65f723761850f9f6157e494ff1a35b6bdf1c8760587172cd5f44b597eccf610688741eb1c61b5b06f50c29c55040fda745275418d5db0141bf461f3c544633a401f568ccc38d671efe99cda168a629a076069a8a72522da245554862c01750304f15d8b909fc1900570a8d11405cea55e149b30bd8b00fcf1fbab76d4bcf63ee02af1b00cf2aa0710b07c8ee0503f121a9ff9abb3aa662b1a3f0c00cd13da776338960077998dc33237cfde6b999930d418b6960ec5eab18f638546014e5c8ed3e69e3f47467002e6c20f3c81b322619f0e6d7091a125a588c384822e127a6f992cd0d77ad8dc04ab49889b3c4df6004ea0f7bc5295b0d0875968822c791c6f107d25a8e2ef98a0ffc4b91793d07921f7c4be8f8d7e5577f6dae34ec76f39a48dd458c77d6de70185093eed081f63bd3c59f065e2c2526d154b23e2f2456d8304a70e6bf6f716b1a3e32602c9026f9df2f956f073d3f1e5ea070c126af09e25af1387b84a861747475b4a6c3f8624c8033f92570d8b0b2c81393ec3d3df809a19daa8c12be6271c220c60a1d568a73a7ec074082f1109e3738d268607e3e12f070efb72f408032e446944cdbc1cbae6dc6d974bc25c25f717eb261c410bf4e160fc0219d3ec911c4741b719710a90bd70bf894cb3ba8c9c27d1710ba7be864bed4a6904d80fc3792e6170a8a1f8a44064a7ab223834f05c70e6827f82f150c11247613e4b2bc651d4c608053e2451d18008e3114dd45ca0b81110b36cf7d0fff1d4fd60cef8110bde7d8b11cd4e9426b62c431e18d09f3012abc615e7583c18186bba0c16c0065a642d2d85130bea98ee28b0f23b8785805f670195ec0d8a374303fc15a10666d90acc4b035bb8dc3b26dd79dab4224afa8f81366d020fe379eea71a9977946538072c1241ba36d7e310157d93735fab7be7c4307b9591e1ef400ed496e75d82c231a411ffcf1bd4a5159b76d2551eb768199324d18c0d52c428ac7534e0a6877140f86566b5f0c377d7cabc2ed4f3777e9b1387be23230535dd1d1024042bd71b73a08feaaa1295b17300f9ee0ca9eb1658c04235cd2f27189802ab64044571eadd00bdd03b00f0fb3b51449b3c0790a73932c6f450926ceddff3293fb5df662fec7bc90623438b9871ba550c709b53cda4c55560e12d27e85347c04fc497d3ac2b0e914590fbe41fd85b09d4bf30a7b2800c13cb0d1ff503b6b884514221baed6283889351d3b802cd7c929fa4b2d9fd619f24286d4039335a65b384a93ed31a92d4cf53c5a8bf5387c795d33ebc151b93b957e7609006e40a299430dadb01442b59f6c0e41afa9150b63980da41761f5dc426128d7f7f83a4daa8d1947fe194e292e906de95cecea4a369b3f580f5ab3721b157a65aa679193319612ee44f4f977263acab35ce30c16016ed491b62e185e55190ba992a8290e51ee1b99cd5361d8465762d9b62abb2ca7e45e5d24b29eb1ca0137a5f31bee7befe642828f7727d6391c8410b1b9e97c6b5c2294ff7f878bcb7120232ff54a0b6d60bfd857c5e9f7cffecec29b209647d87b5650a6a5454dda3254f724aa044bdd7d790031bbe95272130c21373b84334569a273916a0f30ec3bdcae228519214fba8120b421dbaf4d19f3e1d5cf29308dab0899454c85919fef530e400ec95bd5836137d3b3cd7071b66fafac11ddc850b1a5e3ec737f74fad0529125f00c7cf2f3c9ecc7e7b0418b08d1906670be587d59a84b7e589b4856ba4a32f29d2a6ece3832be0fc4a80adc0f02f3e397f05454d020a098051fa8992959865839f3662e3c00c5aee55dc3c10f777c2b1dbc63a5c57d151bbfb3fef89eb80df24f9f56f10d0009ca73eafe4a359f1954802040e321df43c0a9e50fc77d7b0b2be025b814bf3086292748ca53f3b190dee6c74332af3e832583c72b685bf6a3a54f1c7c73da534ac18c7abe2c35d66c708c71ebca3049754bb06c9a4124f60d42a8718606a21d45d5e18b115aaac492d6ac4724676feab6d69bfa07ac1af847536e52361c7586e7a7b843f5dd1de15ce588c137aee4dc34bc023653d98f1d581df8aae5d40907260a8daa6ef79c27cd1fc8cb291d6b436d4d15a60e0d1e6890fcb3449297724d154cbb035235ed451111340afdd8d1e5afbc942d4bd922009fe29cd85c789b5859eeadf3afade76d90ebf4328749890a393802adc0d4dd2790fecf01dffa7588a60edbb78e8336572aa0f5933c85cdbe154b220105a34c1679485c04ad4a53935eb0151f2154f4c30b0fd6939d48ba816c146295ae851509e6d5b02328687fbbf339791ababfa5c8e22f0d70d9942e12ef481400493f7493eb39a41b819c2734414b06eef342a6cfa5134ba14747e41a0e6c3d4989d7bf7a4787f916fcad84b45e8fc1c4b62ec8ad9f014cf3b867308f0e32233871e1eb06d7aa1be5c5aacc6e2bfda515c7de6216d1e66e53ac84ad05dcc18a4ddd1e841462718b6dd4700853f54d1bfc4c12b84ccfcbdb0ae36eeb85c26c5f867b53afdbaec5575b4c4b76b71d1c480f6969f4a642ee03b41542f4c65e93bfd53851d2f062577d50eea821cbdced9598903e2e4db4618e74e2376d11780f131781939199e09bfee11c4dea1a50fccd383fc1ae95df5a89bc84508686348c1ccf26e046118c925a6a98d813c4ec7c58695908fb1c1e61b943af5806543698ff2b0cdd5dd8d8e0f41db4e9d8de50d55361079d7c2a0789b8d6b559b78dab5a975baf406cd404435a76b15169428e44aaec9c10b27c3183a0c2f99fb3d416b183b066fad0c7fbbff4c6258fb6e9656ddff6d96c8e89c2e74ff29b8b55e8166e2146ccea18be68ab9404508074a56e9f0bbef7c3ff6692a9c5a686be3f4ec7c3aed88c8ce9f5c7b956699ea2d47e3197e4a09e0bfae95839960ef7fbcdff10de65d9181113db54139e02417e5f476669bac8b776197db6a13862db9ceeed26114d37133ae6f5ccb74cb71fbf9ea777355f5f1c28a059084895018519f6b85e66902d02ddd2fdbb0c4c8f99ec186735c17a0f83da4d9a6e03081a2202c5a7a4b47ec8b0690e5d3d1eeb8d5d56ec8c7f533fa576ef04b0ae9bd5ca308fcba943f915599bc753679dd907559abdc570c59431df14941e7e3233771df532850b85a33b4838434c1546881d54f0b8fc65ecc513c00157e7f225d207d0c0582cc8a8c460fc0daa3e911bcebbfcdfa3143c3a76f53b5c57449d123ac55a4e42bc87964143de8f5204c7803c1f6b848ac8f10e104b8f1765b4f857281dc2e9c887360695663f179403657dc5e7514a8192a4bfdbacef125e9850911424410c89595d492ecda3ba3486fcd1359ec47b4c486dff23f3593b68e916ff00c9b6a26fddb1eb4697966eb4e0328a1242dd9803adbc69cbae1be3f701bb6e8533ce7e85b2fe4bcb2202d6c87af1e40a2905cf86f53e2c7f8a19c5983a6517598341c9631bb0833175a47124a3fdcfa9a3e13a0514ea0d661238e817a2b1efc297ddf40e1acf7c8d9640f2188401f8ad13273fd27b158ab55cfa083203d4099036d41b9b8b55a88ac6b2147f972d689590e72a600e9e1390b06348af2a2578509f4cdb6ac081af4c30b32cbca56d2c277256fa784d339fbca5007385db6445af62b53e38733aa62185ef48c56802ac3a5eb7512406a47a26269c05756c23347c656671d19d685f13161a20470003bb3dc64d05e0b96a79da1a3cfbba0b6a4b7da518ad992a20d7c7d3808f9a4a973d89249d4c7f8f4f0b56008c7031d9d66dd03a20e147d39c7d81f8cc33daf7b0d8a99f07cadd35e58fa735f64b7655500978216b8aafbeb4043591ed24c2b835dd69b36027e1f170bdfd53670284d1c1ac8e563969017292e58aab825ee0d5d1d8c6ddae5e7b4e632c70e11e0a234a67f555fac13ba99e021bb7a204c9c64a7b72f01389273967b46e6a00b8be9879947ebd918b434ace168e8abf4413c7c05bf0974265f148499dfb0df3b5d344c443f10f66770cbe7cd649bd458cfad983be20a8e06db665548c355bcd572cf136ed371c5d64e5584aaf75e138a233658f62f3f9973b722e267021d9b114ef53ae264ff53df21131499d07a5353fc6b4e08a3a8432083008341db94c40349a844035d26883e8c05c45b5355ec84590d88e2c80160857d8539dc2aca3579e306b71c74a74b0dd50b9659f0a0669cd9d7b91ea5139070a3f71d185090b2951329799d61fbe93d1f717ef4b97134df6b8340315e9e53efef62379eeaa68e5e7b5efa463c65caf5c5e65a0c381406c8a2096c90d95eabc61ad8fbdaa3ef52c331c2c3c5a6367f51ffd7f82d3dfbae828d5ec9997f2baebf8a384ace8cc08b209402edc913e546b7dea618196d6aafc11b94cde2ad877a9723f90215e01bf6b3523e103741baeb6443e1f5887c5ef96b4928f81410a83064b85fad32338ef29504a6ce5081614f19d03c6aac212f6a4dca2a3a24bafe7c9110b2d1d302b30fb2a52a6971acaefaa07536fb3e314afb5dcba0c160f51866dba919515a3b782684c9bb266c5665604f578d40314701d1a4233cc98853e2a18f5f15eceb167e61210b9fe83a176ac2f0022a39b31f370ace4543a3718ad10c0b2deb6ee09cfe0c22268adf21f11a995639cc2031f4014467a597686f6d2526d0200fab7868a7d1cfbc4425cb4bd0511380d13136fe24248603205a707ee9ce6de3b54a6c01c671fe9485d0168cdb111d9a00ddc0bcbc0daab4c2300afe7430b4b305024a2132c7b6da32d1fbba2e07818e1d87897ab9e0a829da0c03d1a1d8f4dfb5a4cac983ed038d4652d151c950db4bd1fe7f8b1212685f96fce4ba27ca077938e95a69b669f830c04767ecc810b9a2ea15f74eb2f2afa8de932225833349915a4df85b8383f009d56dc5200fff05b64d19c15593a4c2dc91c0cd898254dbe2b3b178862d7564daf513f0fde0568f12e05a2dc5ad65a607523abfbd131bb583f246d9eb1a5613e919bcf092f3e588396c9cc9ffee38a44e882f1d97d61191a9b68c768ade5645bd03f1044a789dca43909643a2a0ac6f775021de277feafa94440b1301fd29986b91d4a91c0e8e79154d2071e8213218054a950f7522fa2b0542b755b94b7746b7a2ae1574b306a79603f2b0bec8dbde3d611b4ed27e415ca335c11d4c2885c7f3b9d721c83e8bf7c53f9b75615b958a3df93682c5b1c1ad8e918f42539b92172389742f008faf2b9a8244a099a17642ba7b3e5f6b42d8bed1ce88d878a4c7937d98be22ee1e2cc6d7990bd40ae33cce6f3270450ab68bbf020546562433100ecc17692e674e900ec57e8978ea2b1d8dd89efeb8f1b1319780ea35ed7223ec6b5d0b53e1396428517cd115599997800da3d46e83e197a54bd8eea404ee41fd617d89fc868f025747b6cba84f5a7a41ac50f2ead04fd3449e05c92d1daf0fdaa97274b54c5eb01ed4a5747c2e8f989bc3f81d4c7a3682829b4a633d8a0357d4452cdcdea2028986f391df27587aacaea9760e536fbcbac239da7d92e9b133bb68344c658d92bef58e56072cdd4ec2c1631df5a3113753e101756e9202ec98fbf06f0faf5249a038093ac8310c80230050a32528dd2fea21dd1f43426c6643f1f5cb1b7d8de3a032e078462ecec15bf84392dd290b07c45b52c44f9c0b86174e8cefb2819c9f8233fe8324a3045e0c3b8535684107db229bfd3a0130fe227eb48aa6c4b2eb17d52188f5e1140c7b222578ab779d4ad0695086f5db9341beccf93ce4a25cc9882adc19550c958a60920e24b5ab2c3921bbda5ee01afc9562f35eab8a8e87f59e9f9052b4ab098bc770ea1dd4ce91bfa376169d50cb4862fdbb00a7285ad2fc6ba025669a9a3e26862c17b3b775a4bd7899e3a673fc0722f34d43f7d83ae3bf460b7f469f61a4b764974dde522382d90b1d41d5823cf04ed62fe640c91e354b132525c9e8e8977d1a8a875bada7a02ca03b8872260e64b2ed45cccef0d43df3f314647c21d2ae0f0b5b732b95ac79b263fd6962f65074280db9a60ed92fc12b1bb1ba6f4a3f8e24ef6304f43ef4170225bb7d4712d7202162aeecbd6566a7a214ec734375ce36023de13644a25c96abe53ad804beaade4522acadaf67ee40437e4595c5de10760f865c07652774679946fa78a8292753f5801fa3e0e05caf140f2346d72b4cd078af9f828bcf58c7ec76abb90ecb566136b6aafa20e98d08355879e0b27d88726e82998ae223ae28828c5e887e83ebf666a792bccfafa246b97c93deca6229d0f3ffe55ebdc2c9166c5a5208e4fb415229d40f59be519ee28dd3f30afd1f32b4e2257249b804f05f0c07c79e2db8ee17a07dc5224e4d866728e696770804b958f577ec75ff9158649e4ae3d89044a23fae4050f06a912fe37146cc7f2aa3124ef4ac13d9fd17037bcf96312e625a71bfb054c4669b0c37a68b748565c73ad02395d8de420c67a4340dea1a399057844ea36437dbd8c6e1cb3303054a3c23b3043e35bd11b02f06c9b7187605e7b4f82fd408359053461557ff71dbe34c7ab05fe836e32c28b5055eb47180399dc06cb0c12154d27d6a4c9b47c6a8205743e613a36b8d4e3807a1ee4aef9d4b9e8229efab9e914ec37715165299ea48bd29accfaa585ccb8b2564c1167ed833f9667b1a72fd1d48f0443b62f53f039c27bd6f54be3e25e2140280b3d7dfb025cb7ba608f934184365f84688a78e90c59515059de9c65f8ef7be8c87515c3961e8a7b734d1d69502c78c3347fbab1a34131050cbf5f047fb5b202357d9a8d13d8871ca60b6f9358c164030c804bf3bdb8e11746706723c9cf705960e7f2fdefae1f00eacf95c0963f70d6f427c5c77817d234f9610e0be0eca2316293ba85ad9b16daaa7cccebdfe63a9aee710abd835dfc23795b1b5d31b5499a0686414c5ba122b9f2590a88ae0cacb9bf46d4eb6cc125c00235191b579781b51086d62f1bda4e1305ae53d0cf0245dc8899dac4c880c24626b211648675dee3cfe1bd3c844630594113df491bd510c4bc63c230abd718980265d5a2abdab1f624954d6709d3054c95d35d8278bace5a070a9b0d09108ae2a01dcc3a15d635be66dab78f29738eb42f4f8a26d9fe739d8802b41204ec1f9a6be72cf85683f4fa0e6ebad003a764ac5dd70583e458eba2146d0554a01e0527d01422186590539389198f327a08f6143b36323fbabb4d7d8d2792e4161679cc2779bdfeb6b06417fd5173687bfa02ff802b72ae049605579ad7987fce8b2b1bfbb5e14636b8367e2b51d65976e99218405058c74ce7f299a07cf12c9e213ef333c94a5de311f72b73af4c285d3ab383f76ae3d1b2cc7f43b5c5679e77abfe8f9a1f3eddbcd858af4766995b3db9809782fac44b5da880c0c2e2d00056b81f61172d2338ae4a33bcc1c305f2b59f6312ec237c48733eb72135360c8725216be5e6468fd65dd18cecebb12690f000cb6b6dd6d33f273b01ae434d808d2cb22fa922ebe16b026ea119b8d758100773a8897b95a701c6bd28599003f59676d775734ed5c04f67a40d418a30124c8484fdd7614dd2612f2c946ce3e22233987554bb746d4249e4e926ee64380db68ac38fef31972530ae0970e7e2604d83d036be6b597e3767839aecf42ed007fbd2c91201f3cb3233aa4133f253488856c54c21542fee5611e353d26c261cb9456da002a0c5b0e7b593050e6427cca3c3a0359f70307bbbf481151aeb981fa983ca364dc5a7e58401c55251b2debb464931e5af9b05256f6741fba55fb2472230ac177aa1157d7a9b40b60da8d06b80af78ce324142344122acc4a8ad8d5948cf32b1a062c97d14bda015fa7caeea08021663180d025c702eacb37cd5a42943460e2d3449daaf9e512a1019e86dda4e3da95e9dcf5ad0c5f0d0d331e2d39dcac57a10f284ea0da4d1e4b987bc9b6a609c287f4f738422df9f188f5a9022395496f2a220a79f3406a8b2382871475dbcb63df5e39e162430a5f0a452b37632732b21a8ccbe2a972ebdc3d0e84c7aea5600d98307dcb76536750dbd2431a1398251da4966f1a73469e9cb1907d2d52152b669344f3b65e0eb3091f0b219f4fc861545cbbee44dc32d839e1e330f7017880adf4bf2958756b048c05ea0fa5a841a94531cb37df5eb2388ce5f084cfbb76c0d49d62b6fd0b49384f468e7c7be1849ce1f4d67ec02e6ea3f9e7e22c8255e839c276ea84b2b1a55716e261c41570d2215b61524c078486d5bde254d88fab74a87d533ee2c711952c317543c8438e4d5feb3b8dd331728c84f7dc43a9449aeb55737b40946a591d143be4a0267f6a0cbdab5db8288cec4d20f88842cfca51bb10c6b6b154914710ae3d864e860414e297e18193f73eec2508a89fa149ec48b6af1b3c8e27a58c794efb82911f460971b58ec97119ca0aef28c4e392f6c96ec9cd7384d1943d3166228ceab996ca18512a1c859fd7d4cdc81cf8f5dc0604971ea42d250a374a068dbe06d106a871b78e426c4140e3424c8b6505d4a54cff694ef9f9a90cf8b94787cb661b760fa1262967e06e8b1a01e2b0c8994fcdaa45097d505f16551a8b52560c2a642108a575c854140121a747d5ffcaad61c11aa3d85a54ddcfaacd0f45cdc32aee64f3c1410e8761458f75bfb7e6346ce5e6c73bf360481ffa7f243300373e75dec154698921d6d4e69d172eca2457c027a1c7754b68b27dbf6590df20af3961a419cbb5c56d6911c1969246cd726a5dd8a6d4e2d782c94ac5e0e522ac27db67af68bc6ba0acc3f3370067282d4ca635e2af39965035600f98f2f85bc932d628e4d31fd5fd9252bd008b3590d56706010992218dbb84e430001ca35481ae92b6a653899fe8ce03356a8eb4581c8e3fef1c5223df7e8b294517d40bb92dc09c69449c033b1fff064a2bdd2c1ee943b7ece5ca748b7750ea0b3d507e24944cc6785c83c50290aca49e399261e3bf4eddbbe9feed74ec9a88690b4e093eef5d276061ea022fcf07a0508a9ba53d6a19cbc9512690a082d2d765430f70c8f3984c782db718f199636d0a0fb4492c4632eb6792f20fa529694cd0b2ce9c3f91467922962151f19e165142dc076fe41ed42c84201735734b6c4a05e5a8c1a735a25328cb5d50a47bfdd82e5c3be89921e4568a6decf75e615af3c47977acc8ce543bbecea56dcc50cefc296a1628d01221b624d766f0b8f9b50fabf42a05748757a7d75bafa0a2c4bafaeabf9d2c4e2531c9b6c6d7a7bea89d5a1b7140d91051e4eb5db9f22cbee01bca8f77252c4419cc7a1bdd1f784d7ac77bf14a9d44b73cd14c3f71acc93ea0339baa94a897dae5d174ed07b415d36bda80f5a4027e20022db71d3c119ac666f484dda0d77ccadf4c1f620fe5361df7eafae2cc45408fb690da5ba6a86b016fb1249f7d1b3c6c585bd7382d0b9487270054fbed0f046e3e5cc438e91fc1aca4217164207b8fe207e0bdf0b59ae38928db967bcb6e4c2a445ab65e598a64cf47c42d8c3c69511028518916ba753210194cf6a9ca89bdb64247e77a3c6d0ba8283c002b000c0d8bbd6df76542a20cf62d78612c0141d977eaa7c5cb9bc723c3fa52b42fd99537dae2ded6fe4b40e455064ae8d12d1168f90e62d4434e9606213a2e193bf488fe8e65a53ebd23bb0cb4f2c7ead2075979361b26061801dc6b97bb2a011604af9856705f072b05b664a4f75043c9c931cb0284c4b7d1792aac7389615d129aed11e479655f1207667cb6f88032bd5ce14604819e51e4d2815c837aa85c8bb45f177a6835ee2d9660eb35e82e6d29da22673e0d943b10f1c4a5fb6e24762077c03d4fe09ea60d56b538aa9f0a4fb601200278ac8ebd9bdcd46a9c88fcd7189a2fd38df6d8b1ef4947ecff7e1dc6a1f1f8ffb3c6d6683ac40005c473b8b265e4a84e98615b1cb9c9c612adcee42a0f36c7bc7af54d8aef7ad59a65b41fea9a30576b9ded1e037be58be0a64126251c3ed87af261214be9a4261cdda81fb5805734f49fec7b78c4abd0eb2682e02b7de03ddfc9bebadd1bd75a79f39398c52e4c1d6357ccb02fc0974310dd952773ddfbb474eff14d9197946f7c7a631aed6e6812052f74b5dda2c674ec9f82fb60ca0be357904b7e4cede59c3fc375b200782dd782c9b93cd373fa563b3446194914007998f0bac245022ce422613265c63dc07ba289f867c1d0225c86d804493a26abbf2e9658094eae697b24a3073ca28487f9bd7e0713cd142319dfaa581ee237a0cea5b1ba548791e06b1f6728d31de1a0cb6a3511970f5480ee3e90f12bf20b12554e2168d1d7421cc11a5d01f88f46f6c278d28bfe99b28968254247c7212de088bc15d2e5c0d1c1f3fef7b40a4c225a042a19f9f7be014efc227b38c1f90e8da99ca393b1a421212edec3990adfc863602cf7bdae2414c3a7f244cfae60888232d08ea08d4a8b9696aac14da4edfbb468f852d4ec46ec27ff9a9b27ccb085908eeb961dae9cba3ea75b23d3dbfdb5c1cdd9c38c78e6bae5e2dde31a12762f809ffdd0dd4b2932575d66cda7d68b41f8c6764c4863b617eaa324834ca8599a34eb0e8abe7f55f5c787fb74ef42f57c0681dbb39aca260bdd23bb156d0dbd2d16a28bd3facecba2eea2465445113762b4ebdb786775c6c872eb013a45f609b23468210eac6d8a92d58db6bb9d8127acc7245f09c4c288de4476dca56109175aa6a9c06d2a8a56c2f877c7651f033fe6f38ecccc3e51f2c979752ca7a905c9d3bde1f3bcc92642f4561bc958c3ecf38152aa3231f9ce7d3efbcb5524a3edcf75da4e0b7efa0a5c5842956357967460f77976a5d4c651868369b44827d6b98b8f048afdab7ff18c07753a49defd422d9d14a80dc86a14d10779b1d91ad33e8b31d6fc20ceb85e6ac70f38a007729850e47e6658fa31893e296a8b85148e3241b4b92b1d4a169e3536d9ea1741d6b8e7769c281be26d0f1c49e011c9db7f7dadfd8cca85f3492034ce458bcd3ac18d4019b3b7101ca9765c79f14b901868c2020b26ceb95bebd30b922711072b6b7bcb3c508fa0dfb7e91c85ed6343fc1371cad72263cf2ea9c43b0e07b3cc32b7947f696d5a973de5d964db3702c2549ded7e84b715031bc4293c5ba4013891c75f5413256ebbd1621840ebae00ce1e197c269e7df3c941dd27b33cfcaaf10316ca27e7c9f33f73cb1a94c02846583cdbd06c17b1a3553c6e47ba2b2936761c3d9587059358907f738ba5d14d71345784189b2b178340eaeee4e5b20c25c23eb75e42547c599835ba8fddd54358ba73c12658da85936fc052f4c9f86c6e0139f896ac5e46538443d32904dec99093512f7650f1149205af00bc05abb6b17d23e076d10cb013799c0ad3a6eec6746b50137c3a01f44985be1158fb573daaa5eac9d58436ff3d48341ea3c585137923d81bc4d9ae770c46570776703997a772de630a7009112b4c8d7159b3b0e0b9fed47a7e937a219c5119b879509a7a7980c71c1a21b3dcaf4a8289a2546bfb64417ae25e4b8d23c9d45d6117a4602d54403570d4a1f5ce524f05da730182490c4a4f8eaa55414b25b8f8ddfd9074b6ba23598793d8f67c70040412e3bd295a3a98b500b8a682a3565e188bcc6fe20a1003ed3635c083c528877904f3dcc72b448b61deaac5de552d57368b56862cb39cd0a0192995b2b599a0d36a7065c16af8f072a5f8fb429e0081ad12dfd1a19b4002dbe70688c2e2fd7b6b3d145464ae94f729a491783bc1c158c9562d2d09548b1b34a6dd7b71ffa035841ee85dc5ae2ab1a94ef22d14136b0a4e1567481cf1cce39ef128838906d25a2801d6b74016353fb25194b9dc002be8f2c05f8574cd59161f468fd92cfd17e3a6675bfebb03ea8ec4f8d727ddf0658c2a096d0899789bccac1c2d13d93078947bf2aef40b1af1480242bfb98cd7219de66b30e3124140c467ea989cdad6a1517db37f208801842d98f9ff6c6faf2110da7b9c8db5e3c62ee3f205a5b4ed1b3db07bbc79fd669d85e65e85bd45231735dcde3aca8bfa99815bec953e06fa6448f27c2ad29e9ad43039a0ea6fb21ecddb0ac6a9384345fef28998b7b2c34e2c2dcf07580086fa91751893b825e1bb7df32c4fa83a962d69fd374486561ceb9192c5fa61c1a9b6e759248720cf0d3af2e295a1d58ba465531b5831d8a1b914a8c1ed0e25cda2d4bc2066b8f350ecacd463329f3e8c0714b7a2f330e82a0dbc9a7b4f2bc87dba1ccc0a73f92599135af1d76750479508ceb74be7fec7fe9ba4dd8e1772b4893afbef0b71829bc39cb4c5bb8a76c4ec6346f026b80ab4791d9c56a95d607982ee5837c481218ab86b0b6238c34eff0522f4487b6d1bc403bd1c37c0acc42cbf98fa361464c7207c45858a0f74064a580ed9aa8613ae488a8bc1f401130a531c85be80acdfa0e190d068cd7202eaa148ef1c9dbfec336cb8ae3575c1a063e1b56c3a1ef1fc0d29cfe267bc7a54eb642188676766c2568087cf429d3be54c459a49c9e20a2fc5e1c0dee52635715b696e65a7a3b62a93c1cda05b73cbdbd7a0918fc3cdd21334656818ca1fb5f3341b80bcedc3a16f77f66f0ee4aa30c4aff149fa3197a43d4b5c30e3d1d11bde10956feae925bb5283a5ecaf7b0506830bcdcd1b5eeee50f61d28542cd4614abc20a7962dfb42cb6bfaf11b26e4ee5103eb7080e9eccaa4244239436c6824498f4b99702b160e5fff77ada3d68f4fb41a7470e312131f72ce901070563ba1fe9f282e5303601e5623155f2481da5a1a17d91c70f02571eb659d1713abd45923b041ceed76ad0fc6285888f99c6e34a90666230684863bb18634a72d2d6d2d2bcf4109774dcc4977fa0c2bc66ca51acb16abce184b2c666a0c4a492d6eb5d350b574541c0644970d75772d077ccda11bbfe6dcb9878b4f8757a6ca13d69d1901c8d9329490134e9d40fb23d749ab3538411196292730fcc110655cbeeaa3ded9851a3d10d3d9b1ffe0d2e092110b4c4d548a9c19fdb245b41ead35b46b41a9edefb40191482830c92e94e348a07f218d14a5f1d5824bf42875114bd9265756003375a3ef953b7631e80652c7a9b266950996bb8e4c8ac66991ad40752e3ee247b54f7edcf565e12d221fdaafe5e152a041060b93c9d4c384936c0ed39d078afc4b5e268cbcc34d18c0de0c59afa8bffb9fe1c4fb962bcd9fa2ce80f68604f5f4da2cd7d1bba56c55a53fbbd7420084362e957a5d70f697ecc88d114f9d04c86d26c65ba121fb33b1abe5807eca71965093c04d9e576080029cfec09e47f95a3df29d30725fce274a9c5493250e2832a2b77d9b620671e5f7e5e90dea87544f888d689d620202accee9324a1c8f68088570d0dcf743a5f8dffaabe6d18bfb07da6ad4a6a60a9e1db60319257fa198c8a1875d41b169ee8af9c0140d1c98712991ba356a92046ead585b87dab195fa681490227ce9c028ee3b4b840514c038b0bfb4e078c98288afd862095ceac265cc2f4a8ffe7437d50dd6b80d24adc286ce7a84a2960106e56ec64dfb4bda0ebacf46f2f4bcf7bd925607599d2003f86fc1001ef862ff1d1df947682c35a0af309395d8c61799ed4708ae99ed6866745ee3e0d598646b311819385145cef1361585ae41fe08faa5cca47ca9f3ed03cbd04dabae0ffdb5ce00e938c5cccaadc4dec13a52756c9a0ffa657c60dc5c5bc14626bea2ade2f981b0fdda1aaf1442586911b7248340575fdb25b0ab32047b003f6841c704fb7229d7c24082ede377dc021e8e5d81c497c6401fa423bea20eb6be231819e4b374466f80caa3af5bfe55613dc1d83aec5fcb6bbeb50e6ba41f03c0c60485d5b749611e0d2e4ff64ff10e0863a19da84be9a70e5e72bdadb5ac931f62b1b5f02c40cd0eefa39794d656b851aaac32c233a1ed84ac31eec33b97a8f3b17374df3ca94b52af0604008fd05708b9292027965cdb7dfd711a14ed4df15834d940a44f27a69302013ea10a47babbb0162c2493e6a21092bc41bc4725823dc16c69da7f6d93077ff6b1337a36969e6386dddba2d0f5b335ab6ef2e9107db995260411e0bf329c544f0ceaf304eede12892337c8607ed5773c9df97dae307698c8fe9976edb6899e799d1491866e4a9132a9c1b8cae9325b64a65355a2aa9c4a01f8494402c7af4b6f3327f58e23ca78d712b3c06b92c5f8e29ad57da4498137360ac6e2ee6b20bc81f400c45b3ba2e816b4b51f420d3a043876b88299cbc54b5ecd2003dcbf4e95d7932c89a0dbdf445a59c9de5ddf571901c566997fcb6f98f3f8ed05b7024bf944d566d9d2e54d78ee53dcd9e0c6ede698d9073d4411c7c262b5a57ba8e06f7d638dd7ad07a532a1958640a715c480c24b481a10f7b0347b7c33b6d0128b05303a41dde49b7da8aa25e6faaec261d9fa77826790d1a532570c085ac04142a14410c9a57e500622a1cde80686100ddcd48c581f769a1b1f4fc29f123cc2d37ab48cd00c0a7fa16521a6bce57610852438a5a41b5c74c0bb46c31134ca53143dbc8560ccf814b402b2c03298b8b4eb0cf97769878e13aea57f64f33f5ae4be83c9343df6309c642fdd18b0ec5f64fb3ba9f8cd71113fa415b917b9d3521b85372a60eb5c443a9498400d83780e8a21e0160aab1b603e3e8167f6d52648e48398843804df3ffbff7399d81cfb2fdfc0edb81d6b536670affb83b38bec67e088076e6dcaf5551e7a4489ba4ef976b95f39bd45dae8eb2007fd6bf1d67573add61ed93626755342d4c1a44055056d021d6e239e9f3dc54f83be10403a70b6b8753b45bfabc71cdb5389e525f68cefe0e014f250b6b93c271fa4918b45721a491f3e1c6f3c5c0c3f4a951a6a22734475fd3486326d73d9571339a117349d433c49af19157d1247751e471e5595a24d91bc437bb8cd34c00ad737fc1dbf3fa5fbc7e0740dce264654be5013a265e4b49081b832a9de77643fcfe3af5358a3a99d7924b6233111d490632b71125828360bcc49c140ccc5dfa4ca4a0e6b90018092b58631af0c1c08a4e302e36661ad5c933555572c6efbf23237177d69af8cbcf445682f05bf6ee248523a99d785ea4044c8c85eb04c3c7da68a0751005fd40b46a16d4fe82f5d97aa57b7052b6ce60519242984d7aee7bf5f86c04fd7e409d65fb9d001d7d99aa036d31c239d15053a83d9b4614800e1d7456811c54530e0fa7c31a549b89694fe5c93818bb4e3e0014b73f0bbb23ec711a941f2187fc2c38e6fa032699d1a03e30ed35a3f90d89be464947c2229c39480334b229f6470007ef50f88e3e954337406c4cc9710642dd079f699fa89e03fce75349c27d87a77592d8c8046b8701349d9d102c3d79cd9bc7201051b042228089e7c58ce5e8fe1e90deedf6ea5c94299b4c4c71bf938c785c6bfe2514fc366b7fe082c230d6fcc66cb18617d552c8ce9257a415cb42211fad918c7e526312efdce8c3b7e9dda8fa9c6d6883d139a9064c857b6f72005f6a5c8f78ce1ac0a83d749628175aab1c50260fa232db9538e695a47c2b15268de29bcd233587214c1c5e96ef1b1d809812ca4bcaf02cb05d0d0cc5838db9f3ec3b558be6264b68e92787f1d762ac150db1d0f7791cac942664084673a77a427aa94333302eac0ed11b248fd6874e988f9f5f5691c1337de4358fad0dbead55607a6c33e332d51e9e23595180047ed7d8ae52bab5aa12992ecfeea93d90ad07d17dc3839117f79c498e1f44c99e3e225f4b341170aac0c633a45ebd07259ed25382a070ca47c744da457988fc1153643aedd081af0a34df731e1df4e92f075f661d0a49a12eb77bc8ffb2100f4a9f531ee130e23567f85ca52983901840b1957c405b2ef82dce2e208d76e35743418be58416ed084ce21e68b2aeffae948c5a71713c0a688e1c0d4a9d34e25488248a24868cdeaaa8333d0c048434eb6565cfab7369faa0d92de2a83684ac3023b39b18053742e479410284088ccf83ad016cc2e49b7207dc90331850cf754915f4343061884a585c9b0182f5cd390b16ac098714d3afd90378b7f59d1451c252130f6f80eb51ae5b8c7eea1174a34c5323d1a6a7d056a75c73a3954f9c4ca3db5505385f6bbfbcf040b6260a3f135ee62fabb62f1bc0b05041aa536e9d7123d5f24d8530e538b0e8f925a02c54000d66b34ef7f94b7b8983682ad135fc33076adcb3e7cd612272b14618b7ea3b5550418de4ec9e3cada5ebbf9b23ab0c32363754814ba99b8e5eb8b57d1ff423a382a4d3c76f27fed77f7b2a84ccad3de1bb5922044e1a207433040f5102ae247e1a7d6b52b0b261da426df64a2b4b75e6f1ccc35c74983a54280c87b3b1914920103c404e32a06a2ca79315b1e22ccde9ea64bfb64f01f7243894e5d5194186d3ccb091a8ce0128a584332c28d5ad1bff2952d10a974e134c8c758f491f00d979768e6fcaf01cfc04a8feace6325f1e2ca716e165d10426676a2af3cc6ed67e83fe6a88628378b7ffdbab527db6ff5b88fa0cdf6a82e62e44677cd6068f14f9e7551103e02da444b84f172efa15f18b4871cf06ec0c4c9a1c9db18307ab0d2b0a56c71cb9475c1eb308235699308ee7e0abeb017db96663a55b602bc1635d80afcdb9de3d8f568a3a037e44ed9466c6d331ae3469a842bdf36819f80f4ffbad664592898b5dd1fb0cbfea8017080410c9575e0c25fb3c4c06029e526fbb6bbeb989d9d2ee761d6011e6936241f82246ada35ba4e8c1cfee829632a947be7d1a06188f16db35f45266480f2f6efe6eaaf90e2c50e40ef607d447031f1c4823c96fb01e7a52585afdbd6db16e756609bf3a8d33e08f497b5a780087aa6338d09f43ef37a6284d3bf28c5360a5c9b72280a039fc95d75aa2cc6ad31ae8ec4156e7a8e45a1b9c2c8bd006cf9b144a6dc873af687c5fd9d9c3d2665b2cb2a01e1da87379d538231c62048a95c0253ea30884b939b0802a815998b973fec783120b4fc6d359e08511ff5bfc8ea456b0068e0e4b7388924c8b59a247a6f5ab60baba0568f3c4cfd029b434af48ab3d9822836da8600e3c3856d1a4df27a7e84f4d49ffaae15567c30287adef92d518f3a8d72d231c51a607c812d79526fbea80236443e81295bf3eb2ae737c99898ffac4e9e90228b4b64351695c73682816f368b16d36c74761688f19f05e4f374c71d517eede16555b2a33dcaed7096d81c5f6f05c1985908ac4271588b6bb091478e843240ab77890b8ef887a3462c4b4f63941141536408f1ae0aa749d732173c9edee1b17665bf51b606a5171dce2d1115784998c1e430ddb86bd4f33a29d550ff3daf7e04cc4261e13fe676951fef2f2725eba5feb9e4e7d2e17f32bca7d436f47f4589faf0ead5cf16071e384c3f4757733308794e749d668d01283967416866edf1bcc501fd2a89ed6a8866ee43461393f0a5a579232185594749b415c6718557c7ada3d4f39d7e803e212e3efa1306581d12411bf633b092c1d8a902304b6b1c6c555f8e48219e68cd39b69c6d7232714938e7297288afd38c588024dc37feba27ae070b566fa58e2436b4cecc01bd3e05d6b91012d8c64901b4e433e852b68e77e06633dae4d981c59150001cdbeb91b94c403887a30939b769ec7cbc266ce1bac41a86f353ef4d964625eed3d15682c72050fea57d0bfb1e7226510a18d4ebfacdf90395e5b78dc05809766df5793b157405fc066397969ee40fcf8b4d08fdb8b8f89087b7b5f81c07d6778430df7e63c8c1d9b1a27cd9d1315c141b017c2dfc800c0c4ed194f9f46e10bea5188d25415ab2c2ce02a29662579a30e53dd908ae8dae45938f1cf1a257809dfb8426f5fd6b4e83c6da0d70a60943492424120ce6baa86fb511de84e978a43044267703ffdba5f99889b9ab254358342a305c656e574740d93833a49b79ded793b720d623104e9fcb3f2696d6dbe2d981e2f3dbb1df784f1cb98e4e3100b490d2b413c7c69cf6851ffca3f28134a9babbc509fef9738f8bfed3e535dbedc607ea0294aa8c207c12b0f3d1e72bea6d385f10be94cc8a8b96bc0c8cebc69cd16ee24314daf4079678944bbb12867e1b03f921d4b88ffc28c5e3e7b631fd23289e050ae6b50279b90790a5b830142388a72659e8953882020ff3dc6d46e65c16f0b397c55c5a035da1d08115f63a55466a1493e317e88be2f4c2189db688c37895aed10bc75045596299e65c92c4a8bbd22b5d74cdbd17e1ebb345a2f91ec29428f115ef9d244c45610a067477117b60e4410d7907bbfd8fdf145c3ae83429c00df2e62c9aca7d282c21cb424cbc86431804a29457b63b0d223e8c3884ee05861ac5ce23d84cb102a48914696a115999ac9b3de3dbf8b56a72c881ddb8f790a3cfbc0d7afce47d7d38b6dbfece5dd70ed12cd81845bfb3a7329001ac4584ab5788c22c833a0f5d7ae3a31eeb0cc246fa76911cd2fc8990584f6635cfad8c4ef831c1b04d89c181939fd5128fd627be407ef1cc8fc7d4f97b845b8042e0a7f8b4cef2c87373c8689bf8f74570b94509e60c1dfea64d69aaff3aa90fbb72aa6ab203283f72626d6c9114718d4e297c96767591611128d12c9281047522e50f498c209303b19640da673aea6082c6df8d9a8fdd5246a00d2a15c8dafdeb1b067ef31bb3f084beb02286b75b70e1131f7d570142241ae28c7cfa1ba7977c4208d02b8cf97b8eed1ae452635d92253f81e37f8097f698141a0645ebf7a526bf452ee84c07b575c4c51c7e748579ed3d478a9fefdabef598b6222dfc7debd8589e30681cd5ac9930687e7199ecedbe72d8ffb2b41d1405fb5b61262567ee0edb5a1b2bb69246d2d22e89f4051d1cf29d6a237c456749e40307e78a8ca9f65732d77168f59133436ecccf1d8350b55beb1c97d09b4c9b80c0ead0d384b0506526f8c40ff3456364dd1ee10bd59bddc51a89676002b3e90730dc6c54e6b1648869bd569676a15c03754439e7cfec75c1a7674c1ee014c766cf8ecc3368024e17a56a03b56923edbb8f8afe18be705d8321b0830915466cd0df8d7cdc288a98437f51294896746d4f1e08a27b831155e5345143d4df5b5e03f37ed514d7ea5080461790429a587811494217c26729c1d53d4a22b7c3693c439b6efbcb42171a77a80b639438da0800545c4b518b5cd1c7ee1ab77e08be63b61cac396cc6c3088d2f164148a8a78f91bf2de3dae84d4985fc7b4ddd706115d77fa188adda61827e9e0974cc0a24529b2a032b1c72b60580b6ae7cfa709a91a644cdc057d437061532402c601028e9faa5c44da5f2878983691fc02937130826d4569cdf5b405dce0470846f52323c9a3bea78dad4b0a1b5ae1e05371f81250f963afbfb08eb41e16e4981f609406cd8bd578e0fe128351c51956db83f4466a085a88a99f596d5eb0d8d4c57cde1aa3f489c22572d9261b024ea7be5df6e42fd595c0ff146c865dbf888c72ac9bfe8503e6c4f47c08a87db980ed1554c703602464ac8a303e198b6f95e3c23d17a718237e78db4347b918eefcd4b2a55c4da365064695120951020d7a6b0b5c5449202c2ee3d91ac035774e57096e2b56e2831fb77b390a16dafd51daec6c40c0dd210f14309edd1a10cd83f15cb5fa4e213baadf4848967ff6a9ce97d503883d4a303b591f2b149a2d539ee5cc69c783549757be7be9a962f4864caa6d8295c311800931c53e85c222e3279055e0a22ef732cce0f44dfd0e40eeabd1d859e3b351f0075e92f269f3425d1beabc9adfa57910b687eea16ad20e3b32d4eaa368d3c01a5fb408108322d21e053e80f25acf3c4cf301f20868503eaad73805ee9b607a6d709e6759f984a83226bb0c15720832e3eb36ad088c1f8840a0d1083181bc0130a906f32714bed0167d53e452f870f716bb8213cabec020803a2cbc32a690616c5428202a78c8985843dcdd97214745fcf8f0226c42b8d5129bb68ae0095d2e2f70e7c025d67948f9f84438e0f8bfb76b057b83fac774468c804d811e1016e65dc2ee9a3faedaa362f20b42344ae1f581f4724517d19a53c0b1f109534473ab9e79f3f24925b5895034bda6f8e7477326a3afdc974e80ebce78f87f70e475f037e3b7b8cc3864a48254923553b65d64c051582058171ca5a7d35f412b6be872c0b8a4acae8386b740711412ea86cc2e7d399606d20fdf0544cbeae6d8dfeceb7a0b87f0335f7925aaeec9f5813393c9b138c666b0cdf54b9b7f4349c0dd23bd46b02132b6ee7acbac61fd44f0fd669e3890f7b811178db9286b769dc4de16bba63c21fbd6e0a4e8790133fe42c22fbf449a2c30f5ee348a62665f5595a3c8fe5d9408f73503dbcd22da63a801b5b8b6f8b798bad81bd290fe1665fa1fa386f0f41d83ed7e453c1df6e4b0724fa163ee5d1a2c2b0041930bed8a89a997300445520f38e9bca0d2dc9a1e4f77d871fc3f57d67374a62cda7c4d0b75477452118a9b240085dcc3e0f0ca2a241989b3b8dd9957423d160badf9d162c7a6def77bcbd0242d15e2392f8532335534d9fbebf7fd4dd7c6a24d8d9f2c35a96f9258e1be8f8e8b2741206ee1562144610e39534f58893bea1af153b4987494efc9afe39ebf73ff5a6902636f43ed9b5c6e03f46aa1875fc43f1d17e43ecc0d4389a9722750623b6c90dd834509f7fd1a58e42c47fc37c848863d1581ba815593fbeac3244c73242c06e810b55e9a733d47a1a7e6a07f467a14341e2e9008950cc14e22d1a73cff5e597e8bc5925384a841cbee470a0fc773836167ac99ac876371122eb23909ba4caed2519fcc762e2f227e39e90c2169477ce435f3bc453947981b61e87f69cf80f3cfd074b46033571b8e7484512d4f6fe33599c8206c6ea49396572689d81833d0cd5f8d85ea1fd334485c3301c7fadc09f44776cafe8d66083ed6d54afb0c77f261831e04858769632ada1678c271228ed89f036859c2af0c6efef13a01201f2b5d2dc12763e47a9e8d2c7b990caf5f9356a05a1002958042b7a5cdb7b7107fecb483337b1d84681a4a12838c4f68702cbf7a5249cb13885271c926c3c41945260af0e4908dfa2e387e0d8e23e03a767a2bbe6160ec1fa6c9cda0529457e921c4289b21d451acfa7af0a8599510f652e377291c94a7464d5340d982b0e85ddcd5ebcecf33ecdc12f24731af75a795a6862843215f58d37c6c80e02c99a24ce0d023524aaa0f07b8ab211e9a198408392f6740aad7e07253de860e2082a3628252d1e7f4cf9d5de6149095d0bcf9d829b53895749fc3eaf5f7f0f5a162841f43e520a5af114b458533dc52e04d647f9861a45482eff6a577f9f7376d1a98d64e572be1091ce145928ee548cf2ab4d752c726460ff0daade17b97c2e91ef9d718986d02677b45b50ee6bf95ac6123d97383395c1fbf20bfad7887f25a80fbefa7d289da6c9c056cdeca6e24b763cce894cee0bda816f6df989f9b173bfff706694346b830ebe15c0d1a910c553041929e9819d82e01f271b4ca8c481eb3305c70e10d6a02188be4bc0b99e6d18b2d0f70c0f8930dd4d43fff0365d0400b4b280e5e938abff4661efba48725c3e571a514edb92a74b3a1b0b4b44a808fe802870d0d5fcf84e27f6fc8c7e6bc1d742100ac893a17fd17dbde95e2c82152842709fade47c47da89f8be8e2c6a4b5a47c6b10c07b86d14362fa7128c33be0bc9b339f45c22baec05d1e925ef37c428c54369bb797c718ba0de36a0657ae56edf92dca98d04e16b24f9aac0caca438308ae23bd569ced72c424a0316d0f8b1509eff2334cf899b31aea64d0200e2066333a9b8a80edf8eeab22fd0bdbf30cbe98f84024047e96a8fe3105ac4a640b8ceb648ad7398050f348975c5fe951d0bc2db834df01a00b458f3de0ba4940a993d8f52b54bb76cd9169babeb959d9f26e8e197a0297d98b35f5bb04d40632ff213e271f6069212b97f8618ce5f215c112127688a5abb34d4aa09d452f805b0d4bffe4d598a187b526588698969670f7d43fc60a79bdf2cbd8276edbcb528018bfb4c89bd19426015ae0ab45d1b52b585a2a06cdb6368b652b60e938c2ce79344ff2cef1c6f646cea1b223ab4be40c3b3e99171d55ff3f1e11a4ecbf04a40099302b853f3505ce79f63c9e4d659ba2c9712147e995c908db5899f44a6ac6b3968ec1d1e66ac8113737f1fab807b79a95db646cddb4ff908bcd90e155f53fbbe32c98ffa6003c6bb6342dcd4604c3dff9e195d40f041e51643b7eef36f443e6e4c867da88e450762bdfbd98b3fb4c86db8c73b7a386c7ba7c6171d1bdc3b12e3aa39f82922b434802ba951037b195695b4d49e1b31c479f1679b44da3d8476122a8729dfdbc771b7720ff95ff2bc2d3255c7ed0b6124b935212868b1c80d43f4898102de3ec12227ad36b039a0bc73886dbff0b4e1dd5fbd2a4850b2b5401b20d0845ad7d4602cd4b0fb8b033834d2695a2fcda1d848fe40285a2085218ca92c2d9d09a0ba3b7c0a47b0bc3019e25d37bd865e35fbdb4ae7f1dcb3bf5958e6ea3490ca1d5ea21e0a0e579bb2462a606187bc6bd6b0f9d8c833308c945f8fe37000fd898c567e9ce82520d8b670e312b04d52f0126fa782684964128bf8e25d3539ab92e824e762c8ea014d0c5f50284278bbabf685d831b4a25836bdaa19aa28f42bf4312fad31b3fe9a5432454bfad8464d79a220eb7201c71704e1dbbf37ddc90cc4467f6de2743c02f68dbcdedc80780f090fce404bf70cc4f3075c4da5779f112b650348df88054a881c6ac61d4c58879a81b63b930a92888943f8f09ebc7ac41e82275916dbff987e4cfcf9e0a207ea4adf433b9747924c7acd8818b4db2ce8adeedf91f745333be9c9022ffbafd81c22a271d0884c5c8406a44b1ca801c721d0c37b2a040d2698aa0b11f51435291f3ee8355ca0a3ce17951f14f97ee1420fc0987f10f80baf1279c1913f08049cddb3dfc0946778a5ee55f4532c35b4e59810e5c15bc92919f302689923af3a530aefc0495e0d8414cf0c3027051323c8b693ef861b9171a21c60ad7219b0de2b777031d2d1909e779aee709b62bfd4f930f0ebde7e269cb10f15293861a517c7634eaf095e8e4a010d0a559866bb9a115aeb5d1b23df5b80dadc07ff78bbe16a6de4a8bb9c96dd45222f9691dad32089a3baa5fd2e3cd02f708f5dfbf16ad704485893e0401cfe41d9f5b8fde1708b764b9dde8937c10218bfe7a7ce26d55a197fec0b8cc122056011fce12f494a0e580f12bba8bc4b383621566f277472378cb703f261682568b769a30d127a5647f4424abe1fd6e95bd1b0c8152b66e050a87c23d36d3a757087a93fc4dd14b58b8c3f5a3bb8ee8f6eed93ec8355068f2d8edd51c429a055041de5d1e9ccaee8e9e69e51911d3cacb21f1c8978045e6e91147f8b1680e00123efa6d43833ebf308307a3ea80a157228c885ff219535ef270b9585c21018603c31e061582cf235a159213e8a74c27fbba6d1b0d15be0097b01c727acc3590e96a125aef25614cffa125211b2c953fe4ed2e8948544084fa2d82083f05d15cbd9875538eb5c21abb7123ff3e6b1fd7bc6ff468cc3fbafb29a8d9000ca8021571bed6ae66ac35813dc1b4ebf78fbed67b573ed5d66d141ae4d50a5177467a224345a5687e31a41e2b179a7bbf372d6eb5e83ebee9263bf75fa2bbd35aa22156713578bebcab2632057a949bcee59d23d9e469d13180b3f28fc2700d99a5300aeb7226fa041963e1cf61eb2d6a20921fe53b3e8065b45f5d2c16d52036b5413c54b9615716aebf07ee577565a3064a65019d69d7cce451cfbebe8317d403f1c3349f09234ab4cdaff2b9c3205c82f0a4240c715e313c89f93bc1670838915b2f97b73e744029521bfd9a318adb9576d25d290a3ffb804c8b4eec73a1a32dc140adc3b8352f5323200fa604496f6815cf19ddc60315e95cf131416445e09e71838d105e5e6467bf374ca3151acc10bdf28c1f4aaa996794bdce4094ef6666a65f62649e80b3408bceb856092f1e7724915e8137af0ab4116b0d55b044f28939a3be786b660470cdc43037455eff53e1810a1e20cb47476660b1b87b0649545573ada15512ddb6d4e9922b1533a05dc5e87c9384fd9434806a5b1912c1d3314b5279d9e55e506253f3795e9bf31b0694418acc33e9ea731071b9045c1c404568afdb9e9634b22ed85a2160e9321eee1a8d6cabef6cd2dd4f154030c97c9637f79e0792271f68e972d02b239ad549e1a0d8695b058088788793e61ae15ae4b67861c8f1bb9ec398a22008d241143042375e896993773f3c0b60dc2398f9ed09ada86a401f495a5df9ceb5ffd26fea8dab0b79d57be335e951c64c749f5d59b9c8d7be17bf418dc90dde6f6d8637aaae3167f696d026f538219c18a0afb0e7f666e9afd46d7db0bfd8dee2114f98a49fb14dff5afabd7fed441b63ce64eb8e8befc1d7e68df20288bac52db24efb5b38d62f9255d7bd94ecbfa9f1cd0ce67c3d412b46b0d3d2148df98185207529ad7b6f6a2c332faf786f7a90af049f768e320ee7dac4b61b3595d1ace1fb1ade0653879251e12997646bb215f5d6731419d48b264ec5afa4fbb6f46d5aa7d7516eca527419983ee55acd27ab79da35e97acbb86596587dded598bd4a57ac1a278dae8cd7f5f7d246b3f657cef3fe6a3463a6d9db79e66e257e1454aeb3c51e35a929d050742819159e3255ed2ffb93ed6495523f8dbdd24dadf71c458edb262fd5bb795dbc6d8f9717cb6b30e6096a84dc4ce57a91b14f6810d8ae5ae7b549dae4b297f9041acd38d572cbdf6c1e3293b5efc9d354465db3acd3cd64b195fb465a1e839fb020a85ca6f61b953c424381e6ea70daed25bea16637ce351e9fc1633479283114de261e23a1c0586824585d1ce7db5ed05cc6b24657eef3f669fa1cb1a5f9e2e5a8e2bbd647f01af78a4720f3d313d82b79f5c1d1ea26684769d8521992d041e4e8f245e371dcc0fa6fc08a50807677f977c3cd8e1905ededdbe28e7454b9b4387529ecc312b9ed96b2293bdd9c6bf48bde18ed74532c34b74f6ca0c225dc09ec6895d342d8eaaa0c056a7403945cd5f61fac42f84036cf2b6617da5fb01255be1961a2612a55c7799b428a77e2766366e1bbd6da563dff9a0d2fd08d7b722fe07e97080828f60c75a337879aabc444a0bec4271e93304c16b0eb894f201a4bb22af72d36c480fbd21c152456ed966069c8b91a236c54ea7a8f5db18038484286390fe962b3e27138c86e28809fc72ff320fbec63849bcdc3a3d87307968e1d31f60c590649618849588bd6a24330ac3fabc6e83f435ccfe4c92fb79764d5e17f7114f46fae82a17e5e782a8e26c8f96b390b9f75f68b63f5d2daeeb497362dc3f16a79485bdd99e3fadf7e20ee1d6f9ca2d51f80a4214d9e7aad6aeffe0649144bad7fe9dab6c09be4ec97ed29c6eabd724925fdb75a63400142b238f67c558210cbb77e6958a07053270c3d90ab57179d3229a64d9e48e7fa3c6121de0e45c6b8ed1dbc84f67b6dc5725d5254daaf5d4df0058a9b40adef361d4ca70be3d068a6f7afeb2bdfb0b1d632e563b5865a90d3efc739dc31bb5ccbd91c0f26a7ca3b0e4b316ebcba9acc4c001cb44b6a050e7f972f9a46288b6571f3c76fa41b4171b864e22c2ff39d10f8d8aeb03d21ce4ba8c487d43f32340000fb26a42075abfddf009d002a510a30619948ee431122394f68fea79475f7f0f103dc9f7dc760b902e61298c6734e9885150a17faf0eed7fc1cb81caba74e43fe29c9e9aed9af569ff3fe3fd40ef48eb5626938b34b36b56bf79cb53058e101fdc65789c0a3d374127e9677dd6bca82a249f8e00020b9684e6ce94e417a74183b9c6a3f07238a6a24e74835ba28f07c3ede57e05c19735b9e7ffc6997745544f197d1bc8a9c03777d5d629fa91c23c15b42a49084c47380243e227d1985a35a7fc510968ca31dae5904915c720f292f7019b34d5f060e7f22a3ae1794f12de2eed64e4fe4b47fbddc9e11528c539298fc97819560b2c4f68f39cfc3d66dcd9457afa15d9343205eca96559e99c8b3671abb2e4c6c1bdec6ccec4bbf014b4eab71cac3d90c569a0a66ff8870d054d741a3126620ffc4e187db762fc92a8469cbe81853e5a69acf44c2ccc56c84caaaea426b544b1417e2986395cec5accfcb0e3410211a34e482c84faad8d29a341e9e28d4eedf57cd569d50116b499eb0e8f59696f0b9a706c9b2208b9fb14be8d33d844ee5f2204c8532e0c1cb754b50dc18ec8a5365507e30d4da5361164fc3ba61f8be71ac122b0713354dae71070bf56116346dc6303a1dfdabf38cbabcc7f8381bbe7a5b34fedeb2a6cd0e1be4d350605fc4d620815f570a0b35e06359bea2385fcd67221e2321a2f80147c44b6d8c435bd94b469c1d6995a14c51a31622854b97d0648cb745baa1b7914d7c29fa07a7097d9f06115a1521a545ac934416cc6c7a5df178de0dcae655ff83e63b4c4ce4118de308cb2efd5f554e60399d22dbc7201a837eb48956b0f8e85d5bf299e4bc01848cc213046755421b31255b82278821c03a2329611f6726421f42ef5b8d6f8c1c440103dc08360cc6869a1664f93e19532291fa6d0eb0c3b83645694c3b878477ecc97833a2fb17fd45a5352f6e387be7ae27b25bf767d132d0ab86ebbaf2803553fd88960578f9f31cee0131ba8a877911079884819423f52e5350abf12332ae67f1fd266293064c2a93eb29ba26d226a8fa6a5009f4b3026aceb95e6050901d710e47d6ba854efec14995ae1ee7fa3cbca4c31e5b99f60143190bfeb2838bec5efa5f08f384db0760118f3f55af72551c6da0a39edb430ce0181a2508a5b100b43f7c44678d5ca2f8e93021a0c07fabdffe777f6f91bd456e29a5943206060c06b105f7de8b6ac1877b5235be1e353549dc1e363e3a7e66703aaaccd864d4d022b09179c4a001c144605c8b7b88616a1bdb01b3a9d6a29a7c34be1bea33c6e3865e43e923ff9471a15a6e5f52bf608efd1acc61735ab19f83b3e69064800c6a9f7fdf4b73fb77efbd74850e750de6d89f418dbfbe8157675aaf9777e74012c8f1ad63d169daecaea7698fb5f05ba1c1dd2de8750ed47cc5b4b7daeb690f7e1c073390419a16de51d755838966a0219d3aad9d39f41eae1e45f4b4d649acf3ae87927eeab1828c839de281521e3bf020f28310fd74efc598474fce596f3ca2703d6a708e9d7a69ba47941e34d87cd810f381d37dd87451f798a2b9988f1ed6da7b392154d3b49c99701fb66ddb38cefa88e2c389f723c7ba623ea6807efce0ede88fce0953dfc67cbcf831feb0f9b1a49fea0a04027d1f0f273f860809d9a91ff54747950b92814522d0341e19c80e223dc476c0b69db4346148136647d9434ebe19db31db3104a9b48389ae32e26aee9812e341a3c84ef588e9f0d1e1a4cf980e26bdcf980eb2cf988e57176faf3a7474dcd0a94e9f3fbf62400044e410841830c6181391430e740e3db8b8073244d13a339e157ca89eefe7bbc1477e3a3d8f42f719d369d2c58fb1319d034a134a69ad35b11c52eebd17631cb37c9373d65aa7474c87049ae3b8bd7560311d241da7604ca7a79fea6ab3c1d6aa237460e04086941b3e9aacb84ffacd41418d8fe48362c1e7832f470e8c24aec783c60caf2ff535ada3a1aeab596564e80cc65496a8d231609f76fa52ea16009d76ac54b77fc18e05cf13a63ea5dc82df4c89128061cfba593347ac2b12843d653bf8b42eea188e1702c80963c22b8b090820b1b0a0e8338663d6c5125e9870696151a550a71553893412853e90d7f1cd6d59c3b90473565a5f3012857cb0e9cf580e1a28a5b5c67094b11c26c8e9a7baa2f596a0a200e4757c739bfeae0c3120720440bac0477286f0d84c7272c0c018e328b11c323ad7672c472bc7d6543c52316a80aa810d88f004558423504bdca08bffcdc84117bfd4a8039492aff619d361073ca8f97f145b9f311d7c5083030d574e9f5d7d13aaaac725801020288211362f1834588189c8e146e7102307193ac6a9285a8725bdeb33a683912e7e7f6dec9e3a339df844f999d2e7575995c9d13dbe9d13920a8b61d2e757d74f9d61814ee9b3d6cc2a8d7a339f96145667e838522623ed19a993d18746e9f329496fea0c256d20690e497b903b24923e7594efe734a5a6d360a1ca68efe47b4e4c26acd7013c8a13cb47aa757f95d16ac78b79766024cf4ece7a07d6eb6f24b737e71c142d141fce3bcf96200bc527744318d31c9778716ebe2f7473737a7dd1758d70ee0dc65b0c96a2e113ef68442a9962bdfe0a8ceaaa2fbe18db4af1de255eda268a6b7afd15dc3a61d4fd49dd54ca569a32993a167bc5eb55569bd459ad52e8a9eef4faa8575dd98e86aa7258300b8bad9405e3afb22a53ea1604754a29a5b4ba3e0d6f3a6bd75e958a5757759525f8f5b2d47659fe9465599658d32d2d5a6bad35a93fcb699b2ecb9fb22ccb922461244992a4de7667c204b7a0a86fdbb66d9b4faf63eeb82d7fcab2e4ca72234918499224e61d283402416ec1512f498ee3388e6341735bfe94bcb465599230929396244970cf663eb3d96c360b8948a653eac4098e5d314e7ac5b2fed32b9eb2e9b22ccb92849124496ae3388eb399cf6c369bcd5eaf9dd7ebf57aadf0140ddf29c5e2f2e1083c262626465cb150ced9388ee3488e244992242d29a525a56549694943176e17edacd4fafb4ea7175775b5fa3f9dbeef643fdbfbc23921ecfab00b845d1e7675dcacac32db4f599625deec485e18e892de25bb4bda4b72ba9277bc37dd1ded1db93b6e77d477ec5dcf2196d5d5acca683eddccceb8d936d31a7f51d7abcaec1dd1beb6d7ebb5432cb32d5b536730e7241616142806505b345dc721960da1b94c5aedc55a76b95d044a4ab7189a4d95c183244200c30b6e68cc6e78b08b19abb1048610ecc7dc26d506326010e16245071e354a4ad8c4a00811b32a2f70113b3268229c2cb12ab0b12e88f001c35ce08fc9336ce0f810810d1e6e7650a9818d9f19aeaabd3041ea090c4be8f8f84182270139047991738ec1072d2da0268c25a2f333a464ed70ea985283222061a768f47b32e407633ca4ec18e36b87f4401ba28322500c6a223c448480413ac5880c41c4e706112110598207064f0d3c3af004e1f18127089e2178a0f014a1488d2237140952842cd282224d4650e40734187161c406233b469418618191205041f0122d60d8800532b8e0494f1044d8991a1ff9c5af055aa573fb6b07b9c7a13e670579df20bd3eaa167ea4a9001bbd82fb9cadb5964e9bbd1c5c8877e615dcfa0635308339b850770cd2cd72da9c34c4b96b608abacaa0ed7bdbdbd49c277ea06b9ddabef7e4d5133f50c1cada3686db2c0e3b6f63a0df70776d4e8ce7540159d547b2eb5780fefc1a86b3b7a07445165374550f1c6cf81d7471d5ad1024ba8d09fb8c09890931d2c5ef99a07020244a17a2040d8450196233e406a5c490130061c88f2843900c5932a4c91019082a90aa990109c7d7fc53f5824e167cb58a17e339356dcea97a7d73e2a01855c40e0c5dfcca1d183b35ddd4674cc858c39e2844d1cc4fad8d4c75316ba60cb5166b13dfc0239ecd6aa96b8f6f8c15cff00ccff00cdbd4d594c178c433175326cf982bfb36dbd495cda37db1aff5f79d4e9f33b96daa0c7e61e21978d66d4da7f685b9a25a7f5f1ef398b5a764ec1d4eb70ff2d98ceea6db54998e86b9faf928279f8fcb2377438f9c30f6533af842211008040281c6f0beb4c5333b13f2a92ff69d689f2fcae9a7acba8867226824bbfd1a9ad9f844d0788178e45491df5a1b9b8e069f3a336b374e15f8ed736bfb7db1bbe976caff9ca27c3e95cba1064e98da23da177a4ac9475fab945a4f6cd1eb8bc64f466a496a496a496a496a496a496a496a496a496a496a496a490a084a9fc51d474c92a014102c52407c62ad6549922920b4d640b065a4ea728d442419a2e3f8cd3903797d7eea878f565995e9eaeda19546b3a60dbbfeae20cdc7397eeb004b22b1b07cf7de171ac4b2214fc13e91443b9ad9efd49b77bfa3092f147a2d6799b4da8bc33a532bf8445d37a73b1696d2a9e26a166abf99395faefef4d5b4b576bb978584c3cf9e7e45c3bb3b1698b334f4eafcc39e73ce396b4f6dd223ab785eac652deb6dea8ddbdce61d9d74f2d97920eecdf9a009cef9a1595d7535ff47ca4f098bc17a64b0188ca43774ac3fe5f481c24209d5ce12fac43193d66aedbd98566befc558bb58d372d67acb7adb386e6fce6dcebbcef3409482e8474322d12495a669858e48255389d2b0ca08a0c3c6523e2104d101940f08b9cf5890257a6c4a35cd66cfda537dba7d3bb3d73ebe55a7e654d7c59a5642b7dabd9aee589adf6dfad0cbe1b036bfbcf3401704b29582f80581be8f5f3004da5fa86389ec8f46fcda2789f80537a96391f8b55fcae9f6f7ca89a32a0a752d4549f9a935b5f5f353c6603d32188ca43834c7456fe8f8534e1f1f2dc5a5d1ae58028b6a1d8b4e0de68de336c739d7f1dd791ee8e34021916824e2246e543299564cfc84e250285b290ac55750a9942ac5595ab896165b694b0b57b5b8b89870e10f7220682b05358a11462081047e4100acee6a652b5d85fc3b9a0b9ee858b4ff0551ec137c848e453b2561934082ad94044d47d0b4a729752dacb27e4391fe7c6a01fb8a3962cf5a73aab55a3b22b9f7826e8727a7bada41081fd70a693244de38da3790483a4aa32426d9cacbc9e9351a8d4624d20eafd48b8aca93c1f2e1b4783a2e7c08901f5a380b0b0b4b4b0b102620a7600c089410089513a21b201d50f013274e9c40810248931d12ba2000c029c8430c569cf2708397529f311e920800772100548d019c74360138fd4f899d4af213fbe113fb71c4ac23d8a1e606093b8400c60842ec700379e3c40b66089fc80077d8018ddf4108314cb464b8c888a1659c81e586192a1d37a9243750321aa7979319565e485c53bff7de3bc477fb8cbd88f0a2429231c3086714e9cc101a42e303f2830c101026313c205040d001a15203bf6163eb5083dbd978084206cd430c6ae41bc488f190440d415cd0b8416a88c006d1c1a9414819689015d8c482d0a0e33e63416040c29204d86b696a86cf884ffcf7d1234656c1c70941c9c007d827fe0b1f958f886ff6e11f44dc1d2ff852ad8fc907836f052ffe1f851ea28b1f637776b0d188ccc03fc488f110e2de2afb216b77d6ee95ba60cf4aedb457279b803cc2d34476a43c0285e3b8bd91b43a24385b0f766a8969ed4c12ebe23d55d94774349524639218eeab883d91187b929f4eff43cd1e707ad099f667579ab487561258929d24407ae041f74004cbd8a920f03a519432d94a28a5b522b141e244ab76465bc45083ec87924711391c5981b556c7f60442ccb0dfe9237d1fc655098c287ad4670cc98f24396eacb5d65a5a7f1663adb596beb514451129246628aac5af225248d4a0d56bcba6e6666cd9d4e016e5d9c1304ce217e6c13bf855311e716e725c23cecd584af929a74b2767e7e5d2c97159aeed94c1933e391c34f4a97f522594f4992bcc077d6af6060e7d3e9d295c3cd3322e3586827deaaa629a11e746cbd15cdaa8e16837dab877e69c73ce39e75723619b26d3621aacaeaa46e65c935b5aa949d17eb452772c53b79fc59e9c73ce39e75c6b1797b3d3ebef17d7c9a9abeada38e79c73ceb9acaeeabc2e9d1c1797653cfbf4fa5d9e79b949eea9ab9a7572f48e7e6997d6d139bc63997a4dabaee69ca1e65b975d4dafefb5405a8afed125cbd4b7dfb36e3dbdbedd645b6c83d555dd48cef9c91a7169e6a2954cd2399cabaeaa0bb78bdc287238dc4d5d558ec48df6a53ee566dc8c9b71336ec6cdb81937722337a2f0466edf773afd7323377e276ea49c05531576d2cab22c698837d2ce68d7466ee446726dcbe88853ba4a9df255f29432994c2693510baa409465ea59bb5ed3a52eed4cfebed3e95f5c75aa618df7e5f4cfcc29a5ae6b419692e2106d6aea3ae79c73b6376b9776d9192ee3daa5b5eb6a9776715aa69c86b552fb74287e99beb86d4a29d537cb643299acb4604bcf2b34674b29dd3acbb22ccbb2ace4b2be9ca629dfc88c2da735bd71a835ccf5b96998cbb86cb64b7cbfa60c6638b8912ab1911556dee855bb8ce815c53107ce8ee213a41d8313d31eba98baf53a6ea9c6711997512ea35cf6d5b5ea9cd6d6b39de53ab4206ebc39ebfc5efe8ee7d06e9aa6f19fd686b9d365c61ab7a1385be032f51df2bdb51d62cbb3acd72de4ad09b3c35bbd4e6bf74bd71ceed77eadbab85fbd7e76d97ab3eb66d7cdae9b5d3714ab2cbb4a3b535d3ae5abe429c932465afa548a6e7d36a7f171463b43635af63539516dd4c65e1fcfe8e3b8665467565ff4a1e8f29b524eadb769d999184d7eb1538b9a4cf786a6deda404c83e173c10f8ef8415509420f3e185f0cbe1c7c475ab123321ca99932172d2b398a76a642c1745b2aad9ea801170d5feb891b30b1b94d5f4fe4c0873e90d7614fec00785a31954823cd133d10be09971616552a7be2074e84e17da1a04fe9ed41b1ac02f7550b2875fcba8b14898e1f77a91c7c5a0a07734eba699c6ca21049a8a74f5d5345eae9d372aa503dfd4a4e152c4fdf8e5345cbd3b7b3a9c2e5f5d38fdbbcf3409bc6d1b97701ed6cc2b880f75b40d2b380a5954f89961e8275fb2de07d16b01482b1f0174537ba7df0be0a34dd50752f8a8ce8f6efaf888c48798f024f9f1a0141811eb55da7ac6ba5b2957e02539830f45740ea02693961e897c04a92403b4e18fad314fa0b72b20963452f52ae356152477ce2768df2768d445826722e00813874ea03b12ab13474fb64bb40b2a942efedc2a4160bdd2868a12cb3aab2a98b2ac5cd061365b7f83b4abfebc2a7f51bc05fe8f8f38bf805ef35612cd792815a13c6884f2491645345f798c6d4477d7b3155a65c13a6e44acd3e3155727513aea902a74a4c6aa54c1bc4a54a318543b7af4932ae255e202613e595d1425966b6aaac4dd98bb2a7f03555acf419ce176edd17933deb9ebfeb9c112863529870420a0f60d2e3e4be481fd797525aeb0f6e4c0a134e488149cf8cf4b9eea5c0c5380213884d32450c12295dfc0850808509fc681e93c28413500ca084871999d991f471bdf5e0440a4225594e242e89939492e5b479c042844eff5960094599d2f7cbe61cc5045746665d9cb397a962f6d5541133428585232d2baab15345541c1d94523a448af561f3da41bb195bc7791fc9f10de25f17f24473ce39e79c7386287d111d4d12ad3f527e4a580cd62383c560241dabc5738a2554b1844e31add5e28b359df54643f7e636e71d0df5bcaea3f16868481412896ca52253c71aad9c50a6504733ea58b47f9bc44b1d8bee692a994cb652d3e9afc6985a4facc0bdd7ee5073f7de6eb1b51dcd4acf1d0bcd6d39e7cce57c73ce396f3a6b0c8a1608b51d65689475aeeacfc73645fafccba322d39ff3f73604fc0217ab2e9d8bd9194f0ac806bfe8955e6947386c43f04afb32729565af6f82551319e57d4e4eaaa927144d4c4653ca2a837faacc955265ac86f3e542ae7258e6952059e9fd7852bc29563655ccbed2356d2a9398489b3ba48b9306bd8f7bdc95822e9d1bed8c47ce97fa5a7ffa458fd4b4173db205b57aa4a81c911ed9eb9b6e4c6395b12372448ec81139224764af3f1ac146b12aa3591b131963dfb71ba03f69acf5ac66e72c46adad345e101dbf40ae1afbdec9e22952d817eaa5a8a05eedd767d9fae1d7f98586436d5f42bd7eadb86389543468aa1a9f783ba957d50c5fa9d7af5577618acab7d1ba4dcd79f65527dcb7cfbab5b6e8b6da2a7b83f0abdb8e46eb3cddaa5ef8f6d35dabb576df7beffe8d390731c6186f4dd3344ddbaa181ff7791b679ab463995da58cba44ada58ab175dd6fee0455172ea0d4b7d6dfa2a3c07f7b167ff509b3a9f877afdabe45efc20bf090c6850bc58dc625876228da3a35a79b10950d950d950d950d950d950d950d950d950d950d950d950dfa3434da933d5188a51795a934c43a2b4f718c29f322a6d1e963574829a5e206649dfb977da9645d550cc45cd58de2d79c2b4dc3a205f0ab6b1e7cf7ef0a680237e598ac32ff18881873b5aaaf4229c67ca90f9ac17cd11e843b1629d4bc30fd8b95df98567b27f64ca8a59f2ba0cafee95bac30812a1baa1c60fa955fc1f42b6f7f25ec800f1baeb0f2a7b003a85ff90e9c4a2790762c54303eccd24a610bb44a2fd94c1576445f14023501cdecccca57fe73ca9c98abfadfcf2903f27e25ebb5db10db58122896707afd11289a0885622986eda05004cda0d7f740110445c4a0b2e4123720eb16c02ffcb2aef992718c7922639d9e7f0b45ddf3af80789c2f3967158ecfbe3d61f64b7b50d243e945aa1b08d1886dba5eb9b9aa4fbfd70fbd9f8f694c3cce19fe13c79807a01fba80814fc433fa7cd06867bc10cf46175aa055acfdbd2fcfc1b9d1ce4cebdafbe78a4d3fe7fd86d6868f389d1640b4316674fa9886d08c526a77e51974e9784e6ebcf7af4782c6904f9da93db9d24a2badb02e72d008ba01e15499fbf5735865a271abfac8abab7ed8c809735fa5e413391c3c8a9b179b2a665e1017a7df8f4d98fba9275f15399c0b72d960e3986a29ed4eb8ab957d61ddaff5decaea50e0b5db36dba9b082ed58f4d6f957357e226f7151a8f76b7827cc84992c52bf8fef65897a7eed5f6cdf0a5ba835ee58a1908674c2ccef58f759b3df3085de6e77029735900add0a394c11a6b02f5b77e77dda3160f6bba9905f83400ea77dd162fa7c3a69f5ee37e05e80b57bfdeb8158f4ef6f5bc7e2fd3ece1aa727e7d9afd267c7001cd6dbe2d6ed62cfabbff9acd967c89282187d634f6cd15bc8fd3e0a2dd02a2015e68a9a17ddf37fb19f7bdaadd0d1e7e1fc15f6d8e7b3b47e9fa5f59fb54a0d5952f051d64acf5f4f3d5b8bbaf7a67a7e8c31566150d3344dcb1d8ba5e79c73ceb9a567150c9f785fb35959aa60d8ba05947afecd6927e8f0b5b06b14b610b742dcba008d4bcf4fe3923590dac7345aadd26f886d26cc7c6ca3f50fdc16ba6e19e016905ee7055d7a0a7606b7e64b7dadbfefe4c357012bda17b10d35ddb8166e71ad1a969e6cb5fab90350d0854cf1ce1ffd6dfbad850fb4baf61ce8825659c1fdd6342d7bd9becc02d89aad3a61766bf3aba0c3957db12ff35b74dab12a0af7ebb3eed7bd7b7d6b43157eed039cc8a894ce76f62464330300001d3317400020140c0a44922cc9812c4d73ed14000c5e74426454381aca84a15896e3300a83308818620c410020428c31c81461011a0dbae69e79f17659752ec7cbbef4c72eca575b70c437faa021233300faaa6b7f52e26b4ebca99421522625938182ba4aa00cd2bf81d20fb0102d98bc9a735b57c1db113660cab6072ed6ed89ed836dd7f22e8a511a0065d91527dacad612db98b3522fd06a21e35df8b550f09f2fb2e2ea4d7dd04941b3e8b49b50d72a2f2e0a3bc4305cb85e26b18f84128bfc0606052389661e32304e7cf44acf930e56665cea1833fe98e6335934b241b9ded17e4fa7b021f43b6fc7c1ca4a452f562d930dd9d6bb657def1e6c304c8ad0ddbb65c7700989ac4ea28ee2ba56d345f9b7c76e50d77479c227277cd48e1b3b47a8b26145d5851b6aa5f92971caf2228265595ba9ff512a476ef35125a31844815cd2cffb48fe38fb951f9eaae5c48518a8452d149b8a68709149eba610db86c7c096060c0bd4d8c2988a77c4eee4ec8a6f9f67547d4976c67975eeef214dff2bed7a47218eb150e5f1abd474641613eb7216006f63f15d0090420c61b7228f59b4ef09ef3fafda0470cd9ab3e490e3d4eec2ad2795cf1eb2c8185aac1755992af582469cd22d959efccdeb83e61eb819b182ea6b0d9f8d392d019e451c37ae1aa32588644bae0ee0329425e2113292c82c680356600a9c5cc5b3aec12eaa2c9abc80b380a862fece822af268cdc27bdfdb7554c3a01d19705eadc875b3a9830c49a7f02ba701a2bb6562116a00c6c05905520c7ee02002a820f21d1424b525bc9714198590b9538df67143c99c0398e208828616dd0757568755e0d6a10144956b6710edd23bc27df7e4360bd04fc892f44f146a67b6f10a85d99f7eb45c0753b78c7a70369a382385b1c358c3a8b27a20fcd404513f4b1fa50855a0bcd26ffa5960ba4b2952ce9971eb318a3a4dae57b91ac2b32e5f926fb7ce2a48c01b1025ae0f0f32922a8f553a3f8a57071e900803f8a78ee0d5f383544d4cad282d8e2fcaaea7f108dd238d74e2bf5621707c8b991331b3963d6328786861835f3f3a4ca491494e12528f115ec10534e690a41b5d9f1e93daecd423896ebd46f9c44d360b6df87f9a375e19d8995e72f87cdc2fd1da178399599d01f41b79aa831039337c2b4c18947f3d089e4e35120f2a10afb10e3bd8021166e11b00efaa86317b2232529c518376b54bd423b3d0e29e6b498ef217c10824080a9dfbaf361f59dc2a64c4f191a2e1b9039a48f105b95a9fd735becda31175abe956f87bf06f4f8e60c70ae6c2900d275b2f4ffd52cd802991bfa75fd8125c876950e4c4016bfb4fbc52b97ac98e06d417457612fab0bbc9e57b2cae25dd16a3ee3a2e8c1ba1d701db8960ac537e84132a03d613427ffcac5f76ab55c71c748145ec1851856557b9232fec0edb5c4d53e1e9152022b4830b3101d1b262612f2f33ae9ed11610ed447666530a79f9cc8ddca2e10e6e242fa80c17bbf53d807a59a36c1389e031d0d7de34af9d582280d30a14827e5b440c79cbf2a83f9a25031bf8c0a220c4c73233eec5a043c6931d9aa45a2536ca36021192dc042257845e3f112b84fd2d194616be80890a1854d4197771d0ab1c008fc0bf7b4e262f870dc3de3ce8bfb652277a77c2981d8cd7041abac6fee1d5e3b631b151fbcab687ad60a25dca8d7b0e32a5fb6e1e1245f58463198723a3c0bdc271e80933e3b353fdce93aecd20e9b873b5d4ec444c4b0f41465b05a53f2418f38a9fdceec2f6630230ae743b6ae486c40147907a275c4f7367db99010d9971943c282e17754e0174926cbb6bc2add4401136485df48ace8f3e0db15cdab00216192d122e70e9f6e1606a721d73d3c4a537417f81fdc54c4cd911976e2815cca2f9894b5b464206824b990a329640a964413d72a9b22fc1d4cc379ab8944c69bc3ae15215e474604a4a14d37a73cd819921580d5a23b810ea3f444152557d328f8b47f7bc90df67cfeed284fce02c3c14ab3adfc9ea7f41346ebbaf4a3db14580823ac15ded7e2d270f6c908a9e47835179bc8aef33190ba27a7100e43d808402e97c49c0703430ab60dec1aaaf56e8ee0772898ee82f2a2c0e16115a43140742da93838b1aad3f046f179aea094b2b356b1f420dd46f5558ec0678a67c37729c4e4425331bf19d51c4986b9e7643be7cd3cab1a33980d09a5c566f9b54d10cbcce3def8aec993a00c1740401833fb5424cdc45e4916c5ddbb1ef1147b48c0f7b94d68218a0c4e8c2ee51a0bf573f7d28dc8fbfb952448232999c3f0cc8adccd6da1283f920436e8ea28ee9b80d35c86e05eb7e592cbafda465dd242e7528295946d559e78cec0f10d39065360bf1098ccd543c779e9346ce7633ba5232e9cb3fefefe7d94b9c6e33e7dd6c7bffd2d7ee7edc3c1965463b84fdf2b673eeb8b4d434470e966cbcfe9edc0c38d64f38ce44c7529a5700f812d7aec9e667aa00416638885809beee962d408b8f6dbb7bd8b7e8668b425deb60c1994ca6e54d0ddecab02138395f5b66dba3345722342a3f8739fc01d781ae1ce2ad38cd7e3c9d8c3848f11c5607af42e4a8868d43f130343a3a8eeb9dd2934482082965960f65b3d4cbeb8467f4a3eb2557c7173d1c430ec83d9f7ffeaf223c059d15cdcb2c487a634fca4e8e1f706b6a7371883d51f731d3c58b2db7c5e00a46bf980d3f324862e8b2c505108ecf90c02a5ab994d03c6e67ab0fab40c6ee682511c81311540874387764700b5329ce713460d7addf12bf2a2f93ec73b4d5a19ec17465774117f4aa163d1fe27767b7a4b7c0c63584e7278d8a9fe6c32948588d2f35aec7d4385f5981befcbaaaf74022d211b60f5f933d52d45b9ede86cf881b4bc4501f5dd73f48595694421f22d564cf5a61dba0fedeca329550dc2e40ceebebb5cecc575a6bcb364e765c9fe5719b5b846e8212e1a8f0c9064442888fcaf596062503d714784cbcf225efedac0f5a2b2292658f159e5e3fc76aa6947b74a36283398505eaca6a63bfcf201c007449fd6480a4149205728cc29a7ced86aef03bac486be23ceb425122b9ff138e2a376e71b8fab1a2adcab8035c35c9fe836dc9c5d85849f2139278875a8b71a10ff8324bccfac05c509b1a303d5337fccc8d93f307fc16fa4c2c05fa6f5c91157d251f4d4a190f4d701a76e518d010497cef93fc287ed88c7a452b9ec4706a11b7417ce83a2251713f07d71800af7e8b16400ea1bc39d974a80e65415900d7a07a2fbfb43c5dff49a971e37e10174c3736aa5675bf639682c6645c9a6d8c10b5150e8d2cd0657e492e148d71ee4914fb444be878f9a6da89963002ab1768a281d4c9203462a2bda41d8b74ce40b544937c1836a6058c04abd5ed74200050bb337877b8ab65af950460312818401f57cc23fe13ee1e5ab920e5a87e6c4ed3db5248b4cb490a85a2870fdb7360200e1dd38df6225b0a8cadaf82251b4fd1f40441406e298877edab0e40f51fc2d3efd25f75fc957e968eb954b33769c304d695c8629ccee482df5964215d27a4f8c2c122015eab7f9778e222a7363b08cd13d8abf61c81308ff3d9e18afa9f3c3e08f7219998c2488cf85ec0e2446a7ecbd13b2d9d292619a1d0dc1bc7c91288dfd5788be62b75fc62ad1a616668af3a1099c87b6fde597a4f2605fd24af64f8ab190e13d918e49f819964ec6a792d32c460c55a6aa0886c3fb04d5b20cd122b50f100e4aba3d19ee8f1128c52cdbdd51326f2be693e81b05f870724f3db9258a5fb478a394cd2232620c05ea204f7d7811e69ece95410d637bb72732a7fa1f8850c0f110a51206f07921c8a4d9575e6f280c37d001b67e8e48160aca07b1267e1a88058dccbb58cebae1e5e03ee31d2df3f012a777127d64eb73d7c14c983ac287819d84f493cbf9a459cfc7bc21c18613bde8bc1b64584225d4c7711c5d85d89e9a4b9192c5c27af24f01f32f5beac27afe0b8fa178439aa84092cd4dac53aacf795a6a45ca8a42e6155354b697acff3f6e3bbab524107c5b6c3eccd66024a3f0556b59c19f372d8a9a8737a99e63a4948c60189f9c1cc31850147f088fd1c789d512ecf0dac36ceeb5c9606f76904d042feba387cf65011e00044381e60281a27e6c433914c61149f6ff0a71ad5675ccb7ffa7f2a56ce67d0eb057217f95fab2fb1868335e55542a4f0a11792de9fb3eeeb990a42b74488b0f7048185c3d5bc2625c7acf2ee61807a5f22b4c95ea70577d5895036b68b46a3c97168015cc38a994cd9f1f322168dbde31f2673e39e30f1a648edefd8198f0a242085e91a0e907c9977d5ffc1604c02e997dfa47c8ee45f12788739c45d9323e1e10c5aa99e483a9f256b45aa0b32cdf4b0bea58cdc64e6926371c9861ba8f5e03f8c42b2b6f121bac12b76332e6034ccb3034ad119180c7e87233a04acac4c316f363eab40e2fda9a04b12e98992cd5dd101efef6c6c29064c242e8e2dc61b18cb62cd100ca98bf418e47da956856da8f09cb55269c508776f2c2c7d7d62b794ab7c2399e279033129b9040e4dc437d27352871e645b0753fa8961f9322a6be3c2c5c6687e4588e4eb803046f28114b683fd241ea0ae15e7e5c2c5fe17feb36f8cd27bf1a2d8facfb559bc3158737806698970c8e9ca794ead76593db244571d3a01624737af9811c5de9bc9c07229ed08fa6053d0e8bf2ceed265eaf4d0067ae37202b861bc0214da145737b234e18c5e8dd04f26144a30549f7117d0346fb39dcc7611d0ae9c70fa54bbb81b8483cac0fdc8f412d6627c4c5073c68e03edaf66dbe7c63595480b3ff9cbdf9aa2f53aae0c31dc6a15e3bca8105d7e8738a74610fb2c91974c3234967dde2cfbf7ef93042d6452e701f4280ee5d8412fd7ef1c3b59211f0ba0ccff95e0d9032e07cacad072f13c357b08f371c674d8224ae59fb20930169724c00b6887ec52a86c2a08ceb9a9d7e0aade88382adb61227dd5d64658060bb08c50cf97256263d979b1f23531fc235460c40bf2a2de78324cfdaea05d35d926233d5f39e19de063221af990b62e4a648a4c5769810fb12493e61b38097d1895b52f1b16809dfd3be67c18bbc61bc8fcb6d1408e8406f2d088859bd9e184f735e3869cb1840091233aa7a4d398fd944a5d1208a17f96033a7274c1a137eaa865666739a47b63a78c39581654829d7068ac241e1e1d3c534a8565c709dab1de78822d46c52cd0b63a030f710be8488280350db081cd44f1bc5cf7191a04a0f7e87402d351cfa14f95195ca19bf870be6f8d0cb0f102f67ed07fd4d4d617eae65bd1274b93ac40c2e61d0ec4a3b6483c3cabfc49dc314f46030a59362cec515243c903aaa0db89d34ce12b6284afc923be15cbd50b2018ce57c02a840953cff4f0025f5611e9337c6d19364569b1f0e0f5d332048a807a34ca37f921afd7031902335c670b0449c2739e511d5da37ba3dad2d00739eadd90454d02f1c73eedbbd7e537d7fcde8db1b693a6d0a9c95858eafef0770a972040233e65431b6440a40dc45a87c5315cefe3da1df4914ba20af44c6009b09b4e5807e22af4a203d1de716d252ae34688ddbc4658298c1e0bada913f060037415d87777439b9c8f0ed097ab1c30ffbc8045c0de9b27f11d76c510d4e848f4c33a29c3ad51859d4846abee7eb134931efd02c5381edc815a35aec21bf60446b90ff890c182262767edc32722ec3704a936ebd173f063a0111f8258c5dda7d4869a3966e59ab90e3f3c8d89921c7bde724219cea2844bbc6e84c3c940b000dfb5799a92c42387acddd361ee0e4f62fd2eed26e1832548a9f94bf729c7610581b63e89e7a3907f30cc66698876dd3321e5c0abfe363db16dbc20663e2fe186e1206fd5d32141fc9f2856b34d61982bff58febcb14357dc0420e218a0072788cbe7ee3598ba18d3307ef42fbec79cd16ee838988ccc9f636032497a7e6bc1353a6f158ac285142cc3b49d9bb224580c28f83f81e0ff0a8e91c23e65dc17d128f7b951de106d1cf391f18a88c33dfca9a4b752016f5632aa1f826b0c210ade6fc654fb74ee2f33a73ec7810e81cf5b98b41fd099fb419740145b1ec187b00f45d1f012d0775ec76a01e353ecc20fc381deb5ab1fe4770dcf448e809b99f9c73402b884931e63bbc86bf447371eaaac3f5ae3e512dbc01b227e9e796702146b4b3f433be046fbc31cdc31b368b3ac7d7e7eee527ca7fbbfb2075cc5e143f83e16e659c2328470717bae1c2f4e7bfade4b4e429ecd8438e21f04d32c85d2dffccca2bcf1742ca29eec2961182e9d1b0e3a2906cbb8174afc9eca1f737bc600abbc221ea425c10651478628ec5bc3210cd2a44242dbb43abb746a2bc4376bca964e0530b9063bd0e0293591b764181e5a5fce998cbb07a06403ea070ee32405d16f729ef3b2e0c34fccda1323f50fe2fe2d9bc19186d51023da40eb72b054bbc59efada3ea724682e10aee5e6d23c0fdfb4f77cdc0274c6d59935951b6cdbc68d0e3cd8d75e35611ea02adebe5c9c71688726b7eda7cc3b8e6ae83604035d8e6cf2b55dd9c449c4be5254df3f81d12832466ddf9e1e338be7002aa6bfb67d26b020bd9929c3227344ceec1b44f099a4f75a6fb79b852c28c34cb9cd671276a03beb6023bab825139859af07e1bf11f90724e4ef610939e9331fdbd161273e4a0a14915c05d4e143a1b89c163e17352ff1fb04572bad38b0556078adfbfaf54a7675b7e42783afcae549c8b588181462a078270cd7119a60aa828884133ce832070d281fe09cfb4056c4fd83ed9621b758d4c32e1a50f22d768239f9403badcd6a225b71c1840bdf002000c0778b0e4d35c28fca82f090eb82b8417aa67bd099dda7ba07e08a92640492e79d599c27de90a76f1cef47b2895beeb9a1b247615415b9783e3971c9bf17b7ea676975f90dd0ce24f6ff0e79ba8161d2eae9cbb03736c1b395be5d1d013f2e54b9d69ab1fc2865f27d30e72202131ff84025a1212c815e8f9411dbaf0eddaf50424ead474e39ed7f4c8c55a862f48f173b3c68e8ab9903ee59c49f3e78cc7a828c16a3ec83887209a31f06865282351a12617362d3de7cc3278a2a0442013a68fc01ee18dbf8c385a2118bccc03cb08d924f075c8c75ed1e353733ef149fce4e0d258f717d195410746931311afd48a6c30819f79d933ff176ea646356a59b17de0f6212706f33ca73c27e34328bd9b667e8b96de9a745753270bf459755a7f8ce814c728d055b827d0de80578a0278bbe6db8a46472239b791cc930ad3d341985092bfffdd5d1bcb497525335daf81a0af42605c4db6da0e7c58a6507b355fd74c54e1bd1152fce2368518e0023761e5c5f16b3f8c5c8c3d0edbdd1f6977618d2c529f6f400bac0d8ff46ac7ad380a271a24dcbb3655ef640e3d65581b942d85b39d822479a0dbe3072a2a61369e4facb2e382a3fba49370ce991c39405a15fb9f620a355580aafb95ce91584b1ec2da49eeb68e6ad7d451d97069f0a67eff0791fada3d1ca0273ad47214f9e900aebce0512fa52e6ab516db086b2fcf5fc54f963eb89b46c3c11623caef5841a7a366c4848cd3e854bd977716a067c71ba68a8d2c625dc7b35a7b167599ca9b7e89d900c06371b4580b4fe5fd2e235935754ff5ee2401576629b0686ba032e8ff22ad88425d65b9ce9cac2295cd1473dd63b4e1c6cc4fe659e0f9c12654b1b33e66532b66e572aaac9059c39e958f623fb942f2576cef77c62290d23aaee67cde8ca7cca5034f9a9e3a24647623862abe4c8743969fdf7280cb54968166f57e310b49c917bf7795a88250d84c6b605dc730e4c60411843596198e2182a8c7fa86446c70bd9baf37d2aa7502fb8c3e656a0e88e148cfcba88a047f0d985d6c3349dbfe54b27814ba1979f615760e9e50fc174a3f41a0df5b318f27119d7910e0c71b7912731b311c2b56b390c9310dc9583eb9985fef88ecde85c812f5fbb29164373ef9c9b4731b6bfd2012cff7d987c63cc2489c4c643404b37962df6e67eeca5dbfbbf2202a6c95e2482228917fa7526b8f6a64f238c9a30c0ee9f74cad9f5108bff3887f5e36907d503112942fc25341e9cb9531c8461b2df82308e8372cad97d86642580efc95f793a9b155f720123f801f90d30665196a46dce95212d999fccc82c6791743786afe19af472988a21b419a891f4a2e71e9e7de86136d091eab27743b2067f2d3df9bc1cb25a21f3569b7dd90c9fa1a4f1902e396b7230bf37d2358526c93d0313be479e52dd054e6afa7272c8034c6d9516bdb29fed6b94e2db9e0a6756dd6346f2c7401adac4bcaefe11af9c3383614e9065e5534b8f90a5ecad1381fa212d8101ec12dee331e97536cc6526bc004a091cb49230f31f09184c3802d05ef82b816fbe7e53e03c13646eb329204eba985052b7d10bf4e676b29a5017fa6327cc3313b2b44905f484c302b6d607df016e58d0c5f8f766d4a2e7a028d050b50d6dcc7912a274a4cb54325dd1229eeb41956542e97fd15d6914634ae3b29e04468e7ea2302a28419eef458e5125c2266319e0ceccc4ec34719f7b861a845c205fc668eee06d84029c67d19b2e9a1d8c362d2e09cef7993b67d8530eb2c21d77916b7f528caf91f0035ea340191bbf3f178a46319a11d65265b61e9d5fa7657a55dcd29c2291920dfff1ab1a8509590da597ab61e5a180bb329336182ae74935dc198e4abe20519f7f3855dd6c6a63c5e362d97d724e1df406e92a26ef82a5ceb688e3462342d4b09b2198b67fd0e0ba0e46599c37224dde9fa2a0ec2f36d68525f5d3d8471183a55e013dd85cb44f9e5595223d851d682e9a8e16387a52a8930351a34208280ae78ce290f4d441e071467326265a6275fd89ca6ab7b9a1e596f5695774138391c550e3bbd54d8d43a6bf381189cdb6cd051f83a41127c295553f6ffb972a9bbefec3b502b3d905ee14552a8ef4d383d4f26ce50067bb6b49dfa07077826e4a3335908d961b8837026aab2c0643dc607f26c6797d33d8a0dc8d6b67105ce2250f62cf33ed30a6f6b23df08132d1d0c42f5d5c3958b103a6ded41e4e58421ff98aef1f93e4ceb546753e0113582f1abaa84b577b305074b849c2a8d4105e0834653514e7e868eaa8d3bbb270bf0a079674a2e50f2c3fc2cdc8bf9e96159794aee662ab8d5e894a39ed6d15a86d9e1710477e7e11c894773946beb4aefc9c08f9c75d9c9d08c62d6a1982577420a24d75f6255d08c5ce56d0f9d6d8d99c7fc07428c925d009f5b14ffce237355e1cf35ad726385ff71980582196fcef11c1056f2928d0b9381eaf1b9647456246f804e7fc95c91670a4f7477cb08e1fb74b7658ef1bccaec04b4e1cac3ce1c238b4cb2416143afa50e87a8942f77f143affa4d0558a355690266a58c1abde240ce418ec54f455b60d2b79da417da1dc87f7e3394ab82c5041d7f3c951f48ba0d34777bec011f45c28e517d9e165cc2c0b9c8dfdaf96eff8171ef67ea9065832dd3caa691333461f7fdf71a87874c61bd3b7f03b5222d55b650fd6e76f3ac597b3a108c702f427081ef7f3b70c3dc5929eac1c97f0a74b4eae80bf95ca9748e690f80b14f5b362a90352ec4e0f782a49d2968779657cf228d5e13af10f79a142b1e7118be0667067c35a801c50602230e1a2af4c2f631fa98acee89933747321c5e18978a450eb3b396e6e94c4172816f5658a5d5affc62612b7d9a211a199a0a67134dc7789e74d7dbba781781152d5e04a22dca1873d83e9ba14ff3f6059ff3a77e0cc760b1bfdfe0f4c3fbd1f6410eb071460cd29601f063164abb2808ea13aa7ac81cc13da58769093d9f21777b432b7d9452b79b03e3adaec28ca5753a558dd98c320097e156abf19b5c1ea9e8d0dfae2c48a771fc925045ee101ea203b23fdf86c5f3c3606b543cc6ac35a4d6884fce3cd5aed6610382365a3136e10aac12cd9209cc6f9183b132b964123595d32bdca46ec27f8bc253b307b988898be5c09dc465f82bffa3d9f67cfeb63544db0ead7d8b3d333aa9f99f47ffef356188ebf9fcaf78279d9f3f01f19175698f49f4ed1fde02b4d02725ebe7419df37a37c008b235985c10c9b20dec48bfe45e9daf888a3e2bb11f92de6a1e4984d6d46be78dfc5a17f9bc9dc4291ed1477ae0ad7842f0c6ff65bb81e39002afa6d7d92b01e2eaad713d38e9001eff708505901c398803e9394f127b4a3741917e2e0aa3d89620ae53b2f4790138f1edba7ddc725cfd36f20128866dc0cc4bf516854f3b25eeb72db808e321353da753b772bfb1b6d28361c2100d14e2019a442faef1240c5dbeeb5cab7f2b9e9d859413355ee36f819814737d2c62b85e6e6011ef667a144c93c581c79694417b32192a00061b3c782aeda620b32f6ab9f7dc472886d5fc3f9eb934d82b9d65bb7364f166fedbc785c87dbd8976b6a44aca66623e7573cb44c22e1d7a5f24b259b576aaaa6dafcaaea1348b43e7e431f34259f3a2d026c8e0d15313eee9bd5f55caef64196d4b3584837a574c6cb45aa07776b0ed1875468c9ac72cbf2116c237ec02515216f734a0bda1b8a56c70e939b33c9949e07ae1dcdd6cb011e09cb6d61b16da1470013fb4564a894b0c9913d493dd84acf0d0f19e04f9a202c8abd2f4f4e267b4cdedd8588dc646bbf89052353577a01a98f4e085abc18d2e15fd5f236758595416fa558d93c44f794df224b8b1c29e2b006ba1bcfa4b1c884586ff01fd9a554baab2122afc1ff0231ccb71b9e6e34b2d5017636b47eefe7cd6ef3fc429bf16c31d3679de4fc2c7806ab08c50bfe10a439bd591822fdd6a12614fa6f076f249f36b242b73074da4f17db0b7b9b28657ac028551fd57183f6a93e3b0cd16217811bd7f936b2c79dad926e8155295786061781235d8c267ca7c660e9eb8f7478d2f2078050cb99fed4f0f85655103ec48fbc2ecf379325e28264fca779b2ed834e84887e203580e92b5ac973330926ae27da7718bfeb0d83022e1ffca5aca645218b5610c17be9e4c9092299eb42aa37130fe0b635b825d330cfeaaeb19408d4161bd75fe10c0ed9e9a545c05615f460aa017347c84b2f7c3eca142846f2aabfb2302dccbfdf08a11e78d98d09fb6242176f017a8ca3080b610529978ae906e8d52d2c015fb09877dad2288798074ab2ed2d7d024cc0f223a2198d2fcd25d8bd3d3b1b52f853de801cc0740273b95e11ed0d3d2e627a75f40d4b3082dab9d6b0cc5e50f6fdc004baa3f5474dc02db8be5a343d149bb0f83c826317fab687fee6f09cd45d42596bba713d8918cd012ed633ce508e3188d8c6dc31fde0dedfa1170b08162db6df9c6bab88d6f82cf26e5cae9f3071e3e2fd881afda67048f5982e0fe78f9f7643e778c4b68fdb2113242fcffe951bc73261cc603fcf68338e16b9b728591fa2117b658291371a718650c331a127a1ac7cfb5da8ca7d6baad8fddf2a17bfd2ea755f0cd5579fcbbac46f652deac154a89aa0fb7faadc18e8564bf8da256ff1b629db58e3ef1d25067397c85e034618b4bdc5a92f421d64796ee01300d019f401fbdd8b927f39a936b77af225f3ff194fc84e3ffc1c9394d3849080319073b6fda40da2bc1392c1c5bb5e69678bcd5007322b16f4a8cd9bf1224412b3e45cb5fa6991c3239a999d68987c6245baeccab33129b63072fd630f243a6752dd2a1eff245bee4f26c6ffbd52bd8ee2d815e4a65aafb7e3731523c6a97ecb437d8af15e24533e34c2d4ea43055df3fc00a6a4beb46829c1ca4c784fa9427a8d592ff8006cb19ef95ad94167ddb0257739346285de4929ce21d7e66a17be567fbfd346b15d4fce5f0338adb5fe52c6a97df852e84371cb19c505949cc9a6e137771cd4b5d086eefc114ffafa31162abc4178fe6332ea39b1bab2602736bc68fc813305926c806c20d8d5779a42b17bfa9d0a10860df9f2c541d0711957b462f67e2fc34646343a103c548290b9b9ba145f0ac3bfb2f3ac2535682b2e836e720aa2ff62e3fc9194cec2127f92e1c894e3e037d9ff4c2e25549d81045316dc6ef8db6cfff6829aaf3be6b9b653b18c64fbaac676a6211c85483a4f347e856c39fbbfefdca1dd652c3468ab653f93c58f29fc1ac4ca6c8ca4ca0f20ebe56739542ca47910ef27e642d3b70b8a63cf83e44bd89a89632f4b46c60b127b90027d2242ff314574a1a6d21c778ee72846e09ae369df6b2535ad741fdd0bfd85a631b1957e44ef0f20749e0315a1a35f90ed3374327a319763e8b0ee60cede64cac13196e84af4b972fde5b143b662ded540b70ebd2fcd5f4075df76f66a22f61272ec8f5764374809bdc7ac4781d2243e37cd536097728a7d20e6b91243e0de242b43e14770dc9ca6b82279da21b24cc135c551a0983f39fdbb079b275f22bf242c09ef1f52cfa7e06cc305dad8968a8a0943241fc4b97eb6209048e9cd866ccf8d8a7f148a130956e96fb8279e1ead2cd5754d57e90068366cd5156af6ce2077b41b9d50de9c627cbaf59d50214975a279d6d2d50c659f2444ad1dfafe8b85f22e2326f1f936795d94317433a67da5de7b19e41e37672a6e29bbf65d6e4e2995a71889cc2654e602a02d4019d08d3c9acaddc33da6714162648a0af68f67342e267c89ea37e41355194907073e6f5b674f11e292886a8fae67f14a9187a290b1b72569f8923129f8c3d288dba2a91785e14c5d15784d5e4ae14b2f8fe8dc1c36615c68a951d9c2e4b94ec182fc4a5efed5eccbd1747a7408272b77fcc172387d26cac98b00cdfbb08e2acf80cc91153d3f72f308174009af66ff676d6ecb6761e6fd9984915228ef455fe01340627a15417a6ae704600222db61d1fc0790408c964c43674794b66ecdaecdc257c818ad6c25267fd9052b64a21f37c135c111f4adfa2fa766c5a3878217422bf3ea6e9e15f3671f891a1f08ef6cd04400e1a4090c1ce1bda68c0ba71d9cb358f38939996d226810245239650523807c19c40d804e539f8f1f2e20d682285d8a052b77ec788d9026ce3b995b931fff8f58866d8dce7ec432b35ede1ad1ce254e68b2c85e0ab7d5c0a0f379821dd878b7b09e826ccc02b2c2100aaed94374667ce6f7588be9b2937b91cbdb2cc9f636e3327d36c959926dde4c1d82648498104fa228de436463a47e9ea415a53bdbe7c885a654456611440362df69dcd32bb465111c449f6fd482d680f8706b3a112078a6b2d16f0bf9a15c6b241d47ca24061921d44df47cf8f96278fcb9378d73740052322863f6c2d41ccdfc8d6e50fba6244a9fd011d2d2f25ad44c982d5deafd312958c94ce4a98f6a2c0385aa0fbc249ca014655b67d761c6d7ac3961e17bfce9065ea5b3a16c60cb8eea681fc9da89b9c6d1d4307b40c6c4194ff4cd21b9feee56b823b9268b17d316e3a3c66955eff83b1c545d26a0d4efd6599d41711f7ca9a95865630544e63033338f0ecb83a7259e54e2d30c5184e2669cbbf466b16e1d37dfcefd1962d6fd59151761c1bfd71f79fe0ba9f0df7289d6cbfb3e7c13ab184b0adc018e426f674ca454173d2bbe2e70262a7891204fa0f4b14f129d1e9319ec5eaed50dadaa4648fac596f12ba07903ac18bf11e3db8e720b20e4701c4c7bb17913eff9ee036d0dccddaa00d7e18e22c587b993e258050fd585a3708276bd07bde4a00ea3ecf1da1277ebe072807a84f42e0199ffc1e51e2b40ee866cb207f35420afa11b89fad9ef806212a86fa22c224606998716d3c8e442c25e05d67759630733196d83d665b9d3e1faa43a130399196260d047d36474861e8c04415536c34ecf1092ba02ab4f8d969b79727859c100d2e7bffca0d9648d290ee01ff2bf8a440fcd0a8cf80ce6977a1bab36bb5a982886a59d10ea8eb2dfe6e0b959cc83ef35b744a9ba1406f22d3fd96b2a38f3420d0b80c19a38da06fba5db64f4d61654b10f809b37ff90b7155a649d679c7e1764284a70b4a0d85ac13cd9527c0b01a8ff3eaf294828c4e70398f480ca6a6e3d07b57106a6dd2e5446f5b807acc4bd3ce6ce6e128efe90528ad1516ac457b69f2b2e0e52a10392048fc2fe02c79f2bba9bd16f2dbb5b33ae09efc273b541db74a70b34ca4db844a5e959a2258c7d52ff7ca807e3048a4a3cbe92a073d4ba55895d643a64265d4925fc9bf4d808ceaf51dd4b0725fe0b8ff1e6e1bec914ae14ecbb99ab538d775520772a4fab287716c6cde0edab76e32c46ae410aba69d1e4098bbb83883a60338209cc8cd61b0b293bc0eb5884facadfdf70c1432e41bc0d0507c26e090f1d36b7b4d5c19d7f1427102ebe89c612627ef0e965ce8f4e16609edbae4ec5d4fe2bebab944ee265b5201f346dc5f4bf3ec1e747365a0f6f15492a66cccfeb0acb3850453e01b10bc038206b31b313f529658aea1b77f3365a107ab0ab9f4de8b1f90ea203fa919c3137ac8b25fa2870468db1af80d946803fe17fdac6d490c366f83a952956f6d5b538ed3b364d02e5d81496d8811a69e6b2644ff9b73e8c74159ba581708405237fd3123c88d3bc84d85805e32470072dd5c0e5ef5cf603ae7bd3ca91b80467b5c8862f67eb351d1afbe3949a948fcf808ea53b1aba846bd422a40d4e0f28b2e93f387f723257f62cd0607da296b48f8d8e0281b37eb9dfeae466a08dde99f2c0e8660ca0642403fdc1161732ff2b7200dd8b39a763f8839c96212f119b9222632573325af1ef3250c590458416d79a3be361f1b8f60df0c6366f8fcd505f714d2cc69f6b8fbfecc3d4a6edc8c09407eaa9a9cb1d2dfc03d0090e18c49249393f75a7c3817e5ad52586ed79d7ee468655515bc964a6d27dd08e7ea379aa5bede7e372bba94fb7e9a5d4568dbb5d7e70e489e6722911b2ef4ff21afccf23514bc2e9eca970ab04c0ed8b33db1f42875d27c664df46dfcb0b077fd8dcbf890d48df1424e9dca6bce83426242656ff94ae11ee394b59df48ba747911cd3dbf88e5357c01536a00486491692b07482fd179da6933302c8950e61eb67e83286fc7f68a9acad7d222309d0111aaca31388c8d6487b05c00f05a1cedc7f8af399d65f3c99e1bb4d8fa8e9c710210a081c5d401a95377aa6130fe0d683509ee04245c38e38e0687e8577150060e40c44bcfe21fa0012d826cdef82ed8e6a5cd7497b0e4569a3b7f2b0716fe81be286777232634aa0c48a3b6895cff1ad089b8b8d00a8d69aa0811d7b2f73911752435762d86dd698671b2a000b87001b5c60fceab5123451c4085f0b69a6be16fc918808d40bc10ea5989f5940ac5d776b4bcbba9c46b31054958610924fcb0891a921fad900785edfb2fd67b2b87a3e15dc3615907628af5ee707ab130039511c8032eff1522d3c5a6e43046eb5ca16874068a55e25dc848232e670374e0e31ee83816e41238a6d920bb3737683b3a09b975259e00e0a4003ddd3608882f7c11258e285a717d00ea9f921907773727c259d80ea26161a615acf9f7b807aa3f416e19709488b67c34c97ea6c2da3f2897cc48e1d27105fe7768009c83f4ff31242b654ab4658491711548281993ae3b16d4b8c4d7ab3f9ae9472e106a25b59030d6d0f672cafdb90a0e25a062d937d531d31ad43307a04513b1ebcd41264c1704a173749a357379719fe414cf16c9a1e827d219113f5ba24f8521b9771aec2629ecbdc8b86da87656df56cc45b53a606a82dd89c654dc19b9620e8e6145712bb1fb7f7c5652b0161b3a2dda86ef34d8174839560ec030a93f0ba2e76dc9b9f779b2b570a69cd12b4889de27837d28b72d38aafeedc7cbddc5969016a7677cec7508651183a6d85d0db25bf088f282a07cf3cd932fea8ec8831e8fb98ab828e3f5f753ebcb072a87b7e8f9e24a7c88a10405b9c39cf676b6d46e171a407e182c7e55dc2d882247052f1f2adae0d409d44cb327403bcf425f265e34650129795a81fe4a007a7a638307673454dcf7c62ba65bdb050ae3cf909bcb07a5cbd5642a7cb3370b7d467ab38ed1e462c93748a2188c557b31f84a80f06995e90f1cf48ae7adc40704e975faafd89eb61467b940ea010110da6f00e7b5a64180a58bbea514ea924068a52191ac73dc8778e85ceeff5e158aaa3d41889eab6f9d73b123a89190b92b1d0f96b024e9021bd561a244e172d43a452dc26c59eee86eb7438409d3dfe2fa3e2e97b918dcf5ef2e089acea27b0dcfca9649a5c413572ce9871d1fe549d8185fef092336204dad872215ef0d81b676d3d0f2dca370a990bb055943fca14490289d221ebe400baf331be1aa061efa48d044278dc1aab38cb5f513028e2a853a33065f6546de0af9f44666caea35fbfe19608c30ca14fc0efd9eb1473c61481beb2f33b302fd49d423038c19ea85c4f933265e602f89f164ce5ca05e1ae3c99cf8a05e2ade97519ba1b949651d4064aa0cf54b6c9d339b832703515e999cca9d81aea1b2e5f4ab9f44cd8154552cab44875bedc1dd5b6f06cf5c644ddecd4d96bbcc1a6edbdb56ce2d83d2db76d3ceb9642bbcbb1b5cf6266bf8f63759a6aa55ff356e76ceea9df3ce8ce58ddc489f9d53ed3424ccb28cff35843a26e133eca4352bef2aabd2dbd89b00fe44b7745c4258edfd43124a597533543ef9741f5e10f64a365bfa245c4926c23bbd8d2d6dd22b7f5ad02cffd59535da1a4a3039c3f6e1ffa1eac0834e7ae1152c94aea0b798c15c165ce621e4f7f7db8cf7be5453fe5bba0af87aaa085aec7fb585bc446dee919d5275c76def0af691267ade97c527ed73d148c8fe3f3c57c063fe7fab173ae26edb069f7acc46fbaac53a84f34128319ca489b10b96e16c383d6b458197c20fde18d3fef87d7c79b29ceaf7f3905d09d0900b75c4fbdc6727860ab2acb21e6df4d5aa1fa148cb36393d546a276da1ac8590899280fc94a0b3f4b784ec0d6d57589faa2b86d4d43b88fc10e2c8fc20f334ffdb233d5056d742b9a20b1f51062ba3c9c3bd5bfe9280986fc005736efd9d799b35ddbb1b3c7729637a763758e62d866f336e0396ec8ca5b4655fbd0090693e3b1f8a0c84e430330a50c845c88659292afadcf156122b2d0e4b98a6e921bf50a5e24188fad95418ddfd76b0977f2617910e7a9486189094744234691356e7c4579cdf0006ead460350a4e83f403a60e467958d20500543c5478dd2e93aa9542bf4d0bf0c64ad61f588404fb1ef818edd9f5d020a5c4ac10830131894df952a339d236068e28dba4a2936fe418782065c8519f5ecfcfe9743f07d2101246266f8591a71217cbea7b0ba807220931a6496fc8d94f914297f15509cbbc79b45a423d7f120430d44cb0d43112a73909b53d1f993b16ee114e9a5dadd0b7cbd7d77a0621441e32c8a51cdd780c0492af02d36a392197b34da3f98c790000e83b4ce820dc07902df5fe401b47bda0a40a50dacd87d6d1379e273ceef5ea61c55e4ae7d50f9f9de8d647984d6a308b4a7f740dec529abba0a5bc94c687ff33ad6433da905588a3c48a8d0d04de3b9658dc42e6f0573d3b8f559582518389beac34b6df1c18164828d64f8db3e5025c01cbb411fc3e6a922717890220be8286974b36fc3d2e185be6d4e0c7ba28d18350ebaca62393587a155780abd6be87c32f6e1e17ba6b61641cb61e6760512865f1a2c32d5dd993c1415fa38839a6d7fc28edbc98b9522cfc528931a1f79df63625bad143dacc77b6d8043989c590ada2b14adc8aacd693a1d061deec02483c50a7249c50ab47005031a3d7077991c014ef20bd717cb94e67a3cb5c3f4629c446059523445661bd67b2406d06ba1a28c8d3994dd760d5cfb03c3fad6cae453ce4da1bc9f9895d06dd95039f6bbb4c7634fe8f9cdfe238071b892dac6b5c23381c8f20c59854d20536b2aaeefa249f564fabf9a602a9d41dc2fcef31ac5ab934cfd8c6ee674a1bf32c6e32130fd70ec54779799e8a16eb44ba2299f0710e5475682dc97001f0ea9984e5561902dff8a49bfc3a41b16a7b6d7f2c51b3f96d2c8b56ed5f219478982ab12824d4677ed5d807ebb140d22dfc7e0ba7ae1cdc17c6c7caf0a19fcd94cab439bfdd49791ae4c1a33c9c1c576cf43aa93f84ea1d0aae4a8a523c6128af737f076a8ae1b9767b5471310f7d457ef50b79c2533894dec063988af309cb96118cecfc333c0e51db0e46913b9859bbd0928fabdb5515ebea1935f6f68000d21d6620bf32f557d9038af9ec038bb6549fb1b3edb2f60642778d3d038add1f1babbffff69c1c5a69efcdf4690948765561c2d346c77111f0054266324422d1a5be518cbb59613230f09f4f75b79cfdf7cb727e443cc40d8903dc9153703cc3d5d58b169b40d1257d0cb915f908624761c539bac4ad944018665ca66e0e7f28093d0d540a0e31480531fd8c533349f621e6e1d410d1578a5a336a134d8d538bc866f2680c744581d7a05acedd93284a85ab85547ca1fa53fec0a4d85e94b93f455a37e83e2b18376549c9ee1a81ba169c98bd52ab9717c4e610d62f7ace0610d20450e57a42e1de7c770e6f54b6994cb8f8cd258de56cb3155cc2795e8818f162d2c56a12150c39fe0dd7dae44ac174ecace1f6146251b90bd861051d38dd2935704a8218688848b7835942950c39993dde21216ac6e25bf31bf2910bcc3e79aaee751ef4e7cfa3d46707b2f96814e84721dbb3849c735e11a9b1347a9b011a403fcabc67954603433ca96ab412dd63474d1f2ed97f6d576388c8e7129a8c1b40c1d92a031dee22c6cd5685a15d6efdffc31663ff11bd641a6ee499a5c609f15e0740c106c82b580b3adb616564de2f9642f39b7caa92da00dc183c63cc2be5ece095b26dc31454ca6016c26028641d3ddff373dc253c833285f49f089c780bb15e992c9079340757b5035a6ee3609a475dd0b02c1c1f9b61a09b2d2445799fa21b28436f5268c89ed4bc8096ed25cc1988af914758d7dd52e25fc63486d3e868706589418c4572f15e50dec6f6535e58bf79b049cee705beea23e5dbdd96322baf91262c595578bf0cc2b05b530731ecd721bb867327b112ef91f3c33785cec30ee8ef7b1eac3bfa811c7a73dfacc87b195a5d12af43a989dcab10ea917a179aba645e6d9ea464457e5e43d1157948bdc55055fd4dc98b00b136f97e6ee851398c7c5a0f4f58ca18e2d04a1d7cc7b2f4cd54895c1ca7be85dfde32a1aa4a1bdb7ad3b913b8987addf434466762433eb8c564040197f8199ddd70dc61f5dced430d827e73d2c3dfad6370baac4f28a48d4dde6bf882bcab069d40cca0d1546cab50670a76332743b09b26e26c2b96e0aebff22a5eb87fa368befd2af57185d9af12f4918da4b750d422ed2d60408cd6da374c47dc6ee615aeed45631cd9e81d9bcae435ecf2f18264e2f0f72063666a66ad9733916c4bb4b9ecb1af9ac83e668e52e38f1b544f165340545595b64a571002e82703431f7fdcf5e6ef366bc6b9070e4d5fc1173fb72cf457baec27f440f4f17cd9e473420504636f8367fa1c02ecf40ccc7f922f2272b4dd4a966ab7f4df1eed2c60025edc0c55fd293be1edb31065c80912ee955731d2709b481396904f2bc291fa7c5a69d799b200d45b2810ff0eca974fba153779cbce85b67885dd171472b65348095908707b2d730ec2ea390839df0705a4713a3112edc73fe105888326d56ab37123b119bda02350bdc7a4640953734ba79789d7ae0508ff17f51f9a95cd398fe909f4b8393eed1d25de995ebaf30607084ab1955ded2114d466c77c5005bde0bfb629c863f160c15ed7fd462efef558fee13ec6910f704dea32a666365bca16abde86d2f10885ad227bf6403a207e495c948d6b3ed9975e0a8b04dfa5f00247fceb91f2cd261190303bca2ada4de10804158d4f16fa1de261c85a8bce0e8c85c8d4ed6c5f848670d9d9c053000bd56efd10a9f719315b7d312caba6ab1aa4d2d18584399ff5cd110f38f3416e053bc9f652025626e40ced80bf4255637ec793260b5cd778025cda4cf00d29bf2cbb501fab5a3c1093008c46a73f5d03d9de46f3e011bf762061d5d2ad00354f018c852401ea69f6945f6f92045dd7baa1ddc31cf1437f113dab424cc6acbb4340792dd232cf674cc202820417117091415d61634e9e48b2d8c537b3b65204c85ba29bfb95d19933b4b285917899c1de5b6afbd032c8d1d73c8ef0e61e6e29be4efbc2048814eee165fb532c9696e65bcc6fc78c7ceb51a555cca41eea888727050b56612cf6e3bdf37f76c2b36b746e0cfacdd6eb0844a9e402426aa17a646da5d4da49feb7fce2c37292141682c9ff5863d41bfe68da3b00cf5011e89a9378c542c7c32472c501229ffb7d718a3a6ff70670003086685e63ac8a70bb66e0464434901cbbad964d18b8cf0345a0ea88b49734ab14308642d4f934817917216f4a87769f97a3a043450e66c551d342b22d10696b9160cff41dc8f2f4604350249033a66a44bcc7883964a0766cd99c1b8e47a1366b150caf197760a91206c3d7677c447a71accaebbf385543e0e28bdfb96414a8e1efdf0de37c44ac2d6079d0da014cd99baa34a6420aaedfc48732f9f76f2f33c9f009d8db30afff7a01a2951970a316c2e83c29820da6dc02fb0f34973e13c74780ca3f378e702ebdc5e81c11c943a66673d0ec19b5a2fba2e7014b99b706a7a78cc7c4ea08214acafb03586fe0e53a2d66838b9a2f3ad51e6110d1850ab051a6a8fe8cb5ad6c74b508675659e26be192b3ae5ef65c0cd1fe8bc962ca3b1c8f34a6e490dcfcb1088f9890f4b16662258d61264060f51a393ab1a9176c51ab17dadbf481b76bb59e014e6d21c3a980910c6d6ad3a180ce1eaf2d5c42ff7406756e4fce2cca8778332ed8f36a1880d3e2ac6ae6c856a8c3a09ab36fcede2ae07c134aad8eef599b99594dc6e028067e4f16bac3cb77b1fac5d6118988c0b728046e655edb8ab98f97060fdb665e624459dc9858c52252ae7faff50914a94c03b1754ba11a6ab1c171f8b164fe2c7df11e488bb65e46b36369318d8e10d7ec32c52d5a7845d3e7fceff99450f9d5a937adec82878c2a26da36825458a0e9ffde70e8feb2b2c68081685b4ee6a0bfa6c25dfe8d776511824b8a5b5f000e2aa1b4ac7221de7a7e37f70330d2c600f1e5fef51e99fe7c962fe7d52ce7e2f31ff9d1cc08a186890a3f7b794d6bb3c135daf939e5bdf5efcdb67631ce570028692a05ab576169b4705dfa773d472d87ae8c01e1fa8e31d43998898dcce76ed3bb77987142eeae1963fda672c27a71fd5ac6926d84844d15a2d0e6a0050cfd31ccbd610310e55a066c826270b736032e7051dbb678a531c6c910d6612307c31e461decbe91809d163c61c7fb02099cc04ab33798d1d62e6adb649397d7b46a26dcdc1b927271cec2ccf890ffc5ecf3ab9a66d2bb7fa7926de006db4c796f9eeb23017b031078248707d33f7f86414594cc9bf023016a0ecc0fe8cc76b82d66962b6a93b7d02a6b19d12ea568e006df93e19489dcd198d3994cea630014ed3799ad66ac348caa94daf762c83f9437e4b642d0fef222562226278d05cc0d46d3295049b1abf2bdda5ede566c2fa1e678e046091da62ee011accb6e1830b859e0980cec4c9bc076e9a908fd89619103022a90900814061b2c555b591e95541a2662413055db6dd094213c51c1ed6698891498da4acdb60d13fc9a466f5cf9e1afb9913d9a4f300db102863298f90bf8add3c400b29994241c6a338b04a812bad24ff3a8d7aa84d6880eb8e841570bef98965b8573f137a8fcd9660579766ab1d7ee6067ddb956d72d3731827efaf7b7fd989c1be7cc12344cf99609e7f34a0a2e85740bec526d54c730a0de28037dc0821ffa3b146a6dee23878bea4d525e1500f512f0e1d6cedbf5a4ce5cad9410c6f1fb778a23737a3314f19db8b8e90e5ea2311e34bbc8d9f683657586e8b678414574084e654341cecc2c03e3ddfae21549341bf8b181cfc10b80c64c95984b4bbecc3bcb40bf922d25ebc22824a490d60b92cc7a094865956853694adc2f1e34fea8eeda2c31f4aaad98178fd46f03ba1f5001948ce1825dcc8d22563f7ef0194d11cb3965547a7da8dfaa1a9f96ddd69b1d5c22ed2f9afcb0db0df47160f45c56b57127ba5130bd97586dd08b5614ccede5b6362b34abdeb8f8d18dd7aef1278a8f3762d4c1448a6019a8900c857ae91992b6c6aa59426395e2c5f835bd50d5386c9dc359dd85b201742f77f92e1e69fca1b10d7825ae5c3e76689bec6ba2ed47fc4197c0ddd34c8aa3169930111a003889fd14c086c5fa197925c16fa322b385feb6a8cfc39713560b6a0b9f7788d95b1a2516c24df7c5b60e2b01720554171be4876d807781e2f85cfc4194e0919f3c906dff895a91ae911cb17dd66b6fb5fe8f5da2787e92dea6a83cd22bcec383f8d759e5b3adb75e08c40637970dc3e9348deea42cffc583c61f22b915ab89156697cb8d862b35ab1eba8c64239344103f63826b71b5319db8806e99c0016aefa01e06a8e7a58a46374d5b8f5764b6641d527114a207ca3430b7975b6d568a5614ccede5b6362b34abdeb8c89368bcc084fdba8f3df79e8c9a2c2b806903b1ea05bd1cbe4f327b1394124a0ea23029bd05beada2f91763a124a500a50bbdfa106ed4c0e9c202ac44032a5006755d5094554d1ba0dd506fc6a7ba58b18ce2fba28a8f733a8254adc0b0af56ec932491f628ee9a9234e261fd0ebb980908e84886c2258410022036fa5879e0bfa2b15374953601eb11f87fa3642519b0681661f5f1768925929248647777ef580711073007262653cacb6bfd095930fcd9e3c0fe3ecdb08dcd95978cd7cf1c965e27049d97f9f5b32dc6acb3eeed45e3f56bd57aa4a33be5d8f652798d188cf50773ce39e79c73ced9cd69619c73ce7befbd570a0109e1f89d4234a54242b5562124d65a2ba4e4de7baf10131d1db992ab9e9e564b881643934193614e914824ba775e0d880ce777b024df84c242065c912b9884d165175ce090e360cc1608210c1852066c1100c73b74551b79e4aeb530f03583e0898284243265208bf9f447d7a288f76ae7bf0bfd597b22576209268e50a10a4df83861852b3c01c54f8d42a6860ed8700387076e40e5f8000866420059a44bdc9606b2c87789560490457eadb5fe902bf287604450909004e03db27444967c64a9f6f470d973043805203d1f604109a28022091d95c61e008922881024c870c5f4b42c3940081c4418710322827044006a76e4a094520a84c5871835416319c822bf844f59d4daad01a5b9422bdd1ae0c25ca19fedbdb6928268132c4ad06b0fb2a0fd9279d5eef612b1cd85d2c7ae966d1867135982af6d2f2588a9b6b5eda5041f52edf1f6422964c95bb6699f350d37803ed61ec3db83407bd3b4911334cc0562143c3efda185eb828c8e11ae1f473874f58088ab0746eebd2326885690c57d131dc822d394756be07420cbac35d48a75b822f87c0cc4ea7531a2e051762f48c8b98c7a1c7ee9ae310631bdc23abbd71ab884528677fbdd0bf7b3fb9063bd7b217bbcabccdedd0b227ea594525e990c259c1302590151f1501117101d406e54199e55c4404db0d7323e8cf0638c31c618638c31c618638c31c618638c31c618638c31c6187f4609ea305c7e8c8c0548a207352493a7b6453ffe9cd95ec9977c9f2008d1983570d277f9848aeff248f75d22218da87c44f914df2987bf3b86a9ec8e691676d79d0a4d4af1547cca6fef460fa4ef5898ad396766c123fdc8b33cc5a5495ff22a3e679b8b0a8ca482b4bdbae291c5cdc8a39c0578803e55dde4242f45c586b2d479904baec28390a5247216bc17a0dec5ee48fb057bdf0b4ae9bc941f8dbccbb79792c233f9134fc447249736f992474131313129f15ac0562b7b146fb6bcf9c39b2ecf763d74c9e3f74ce4eac42be15d0fed4f3c92d689178a29cdbb138fe35d0fadffc403f1ae8789c99f781b1745930d65a964dbcd85e4e3d6629278f3698749b4005fa0d9679f7df6d96a4d1a9365e39c737b41fad06304986da9c8900a325cd153c870597fe4435360b2384cfcce06ba57518bdbc752d274c2e5635ca6339ce52ccb40bf25a12307e58d358777b6239f39f6aa0373016e2e9ba885615a05fb1612eb992d10eb89df5540ab4cd5b797cbb15d72d3ddd0bd4467c5e597e860a9c96a7159c223854cc6c4362df75a730ffa0c1a2da123e7382f724904d34c88f02c7e06eaf3075d15e1d84bba3ae97ca03bb6379045acbfd5d7eae7fab87e86575105057b9de3c1e58fbb43dcc1157f54561032a5b27a14b2c4d8834689cf5a2710464aac5831eaa174450d76609304156c006208337021013cd0418e9c235778810d2e20037aa0a0e3430e3cb44260673ee7d947bbd30c83394ae9cfbd3bcc8fbd38610b0e9f4f72935f88bc5b80d7981c06f4a2873090fcdc273fb537f9b97bc9630f839f3ef6eaf340c5f19ff0001543ffdc9dc6fcfa12a3d8f29e1bfe0568cffdc47bfbcd9b2f849ebef6fa0c3a306c3f77c7fd7cfcd4ebb8cf4f3b6ebfc09f3f3f7efd19cffc1646e4dad30f6d924bd38d378cf6dc8639794fdbf4e485f8271b8a768dc9499e3ede7dd3925d6372908ce8751af8c45ef6e21663722c01cebddd626c30f4edf3e34d65a9d7981cb43b07f89c3cef6d73bbd3af31f1e4f3e59c51d073faf8c0b9c9c0d953afcf30cadaebfae3f682e39edb1cdc5e74e8398ffee6cd90fe6ddb5e6f3b8301c7c8367e01866cc6c741f070fcf329eddaa31a00bde5f931fe197478e843dbe3369a9f72df41fb62fc32e4e9f51974ba1af4fc0d3f0d79771a387ef85d8b3cf320c75e56819e0c40175442d1811f1ea7062287a20350f0f8a296287244c0a18340e5084207efdf824fcba7a54410a81758d81ae2039ad371425b251871e388d6075a3b5a3db46ad0ca6905e183083e92e0e3081f4bf8b8424ba675c3c70d3c307dec00258bf80022c4061f3ee05dff10ac8f1b364c1f37481fa9948f9507a6407db07cb8a00691e78dec061f291f2b1c104208a1a651e210baa8cc967baf54b11e95db8b00b847aa7bd62923ac14443b8e448672095d05ad397401710408205c314629813002441108598e80d240d04268206e6083052207ab9c79d7313fdce009403a20644812a2606b58011128b582118dfd1ca177b0ca09020431a708a5263949f0ae7f02a94ad04074e6d095634465a5a05510057d7182680fe81ee81c558eff15393ac8cfdc8b284db4520b2dd0186b8ca5b9f22f99bbe042b59b8ca1ce7fc9bcbe643e37065962cc248c12b2b8cccf9ccbcaf61279d6e08c1983e8d74a27764339f932318cee2e867cfa2f7253cae7c314a43473317252bec41871631bdb91cfbd7790927631289d3464fa99a37476b6c61ceca575e259a3bd32ce4bb19a599c69ce53c65c338b6fc6b49b312ddb30e80328ede2d425c6af5be3cc159ae9960ae75e241a9d672456c369dec169de81d3cc03a739bc63ae6dbfafd6c92bacab296765551c4ef308aa8eb1c171ff719f8ef643e9fff457c3c54aa2f587d2ffcde80f06c485386e7b12ee49b690267992ad7e27093d365b4c3eb4af7e923721f91292d056b3bf14a5512314eaa3f9683e9a8fe61ee1d2e171018188a6dbb66d97da6da334fb8daba1e728e5fe94a2fdb403f7210f06f49023e1b8ed43dc872e3049381ae242dba85f0ae29e7bcdd13fd99c6ceeae2c28e49c737275abbf7d34dcb67da8edbf998d036d1bf7df0c57b36ddf428236eeb9dd3950e8411cf7daab415b76502889428d50a88fe6a3f9683e9ad46d41113bf00170e8d2f1d9ec9c73826eadf5a576529d54279b6800fc58d370d470d470d4fe94922da6861fa4691a7e90f620a94990b641784aed374f937fb239d99c6c4e36956571a0d9f9a1be996fe6a25020540d2de79c77aff1231290bd6999f376c7bb06bddf87a5f2b4f3ce396f8c8d7b4a9d6aee69077aaa39edb8f75ad70f5c40f87181d00308339b66826519efdd63ee3dd9a0e897b5428ae72f854dec4be12fa55fee7e3fcb1b959f7b0cdbaf7d686b2090e6b21a945f2dcb9b4645f18be967d9a43fe347f3d17c34a94dda1afca2f2a48a5ac3e2c329ab9427557652f1f92e8e000e5d3ea8f901ce0f523ccfcdf503192e000e5d3ed8e1596a71d34c7e5616c6fdde6cf778b239d940b13dfdcaaa3d2a4ecdb1f6e4ca2715cf18b3b692a4b598cd1fe5574c72d2db7a83a203b7d33e84d65a1269c3409ff42d6474b96fbdca3a31d1727b515976774d2b2bc6c62975aaa1a71db207832149ca532affa9269f766412e96433ea48ddee92e7938a5b4d49a8093da1b0a2208beee9c6f1056c779735d0a37cca29254dd8db3fd558294faa932a931e63294425291fb232db5eeccbd0b87d9d4a7938511e4e9046efc945492de4a986dbaf9db7fdc8cb1fff7ad8a778289e973aa564a9e2d75c999f6277ec64774cb44d764741096d153e7772d62aaab66ab5b5722fb717cbf16bb6e814d651546646712eb3380cfdcae277531991dbddfdfc3535bfa4514a5c85e3a0ea67bf7915b5bde487d1e82643e3f94bb3a5e61082cfa971f8fc934d3ce5934d3440fdec4fa9795271cc5a6b4f36a21687008819c5144ce4708d937ccb0737780238740d19c25d4376b88838e21ac2c397e299aba0b75fedd71dd2b4aa3b48537efbf5a6a2668bc997bcc55ef6f8e3ad39e6166383860ff549ecdbb17930dad3c023c645fb1bf69be43e1a98edb5a83dc9ee926fffa5b8fd18b726bf471b23ccf6da5b6b6f8c0d0cc3be1dbc5fbb517e1ff7af865fec4b7d1b86edfea5f8fd1a92cf96f9d863bbd7a0d8f78b4d0cc342dafeb68f5e7fbbbbaf3960b0f63f9434e1c7fe9b8927cbe597fa521c7f96496cb127c1b9c4839304db3d6ed8770e070cb3f6b1d6e279ab76b3946f9eb51a96853cd0739ef6f17ee661ea651f4a966e11eaf7d8e14ebd9126fd2a1c0e5847fd18b3ef2d2d3c5cc62ddbbe7ff3b56d7971bb6faf41f14720db86b1f82f0a6e30608fafb41fe3ee320b7770e0b5fe776b50be3df7bd65876bbba22aea4d3c3857b41ab465875f8dfec037d086ea5c0fafffd1c493b6bffc1f2ae72fc5b1cdacb53672f861262b90143d913b13cc19e75cad28a5b3d65aa7b5d6da79efbd377a1d122612e64ccd946cf5f4c4555c75082312f47c88d12d035964f46037276908975c3e8c19b2650a91c3e54329e5ca089b4b882bcc486d0d9724e0dd04be80743d4899821035e80881438810581e048942909e204c04e111a4479022d00722c8610948b021a2d584110429626483ce3c80f4c8394a0419c110417208b2023b0a0190201c8810204500d90192042046801cf1bf628922f3468c110559d0898d6024f011fc44be9167720d9752e2972c75426029f9d48b314ea87dc8b5d206481313ade9df174ab3c77e46f65886dd8d61746e5290bd29110c9b955639271de9444abb97baad0d19aea8f6b17b73bef7de69312274c7f8c910bae31e06f4f9b94d0aa2413b4359dae226e5f673ceed29a574fb5c3590576bad75fb6c359067adb5d66e9faf06f23a1dad7da6235775d5d3d36ac5d4fd0e5ff7efb63b1d8dfdfd6ce33ee3fc1db75fd0f8b67dde187f0c8f01fafc2fa0cdbaf9e106da1de8b9eff2c7706ecb00da2f447cb332fc7ede2f441c6fa9d327abdbd0e13466d6114745e80de18a9e5b94d627b9b4555916c0127df873255b6c6aaee48026bb92a5946cc93ceb035c49ada4c9de48cb0268b2318025fa94453fd7550ca08942a8007b43ff469a26ca077bc32908eeee73a2f6140177799544644b2d2257e8172962c40812481ca1b4cf1ba8b9eb4e2784eef666d4ed4dee8290d2627c9d2e88eed8567fd25a6bab5553296bad6db5eebdf76ad3c3300c9b9e8ecee6d20dd15dae7a7a5aad988aa90e5fbd85212ea420fa65caa0208b0c2f4472479ae8eb14e91886611816e9963a58892c2b9e81cd15696212b5b6012bd68bebe123b8077ef42cafabd98225eee996d0bdb2700fc6812cf22bc6015c913b2a45a00c8183e0b2e6ac642a0ba216dfc6289c52271b27642868fabd4480166494af801630302c7b98b964d1621209990823dce3d045c4877af8d97ad3f54ceebb1d135a7bf9d8eb158531bb2515aa0e490a5407b2789c9c96eac715b40eaacecc912b4ad278715a3fd487fa96c8342a12d6f27052b5843033c445841cd710565f8a240211e65245a1125c4225648f3b32d78f71e615749163f5348e8b0ce394389c0e64916fc283a35add1f3835bad7d5ea5e9d2b9052a4142985d13bb1b982daa979f7c5b0ac678b6808b8225f0786c3dc5d77dd42e9ba85164f551df0be0e1c70d041071ebda6200bec7eb636a7a00b0a2395a04dd573caf21c2795149b555ffbd656eb616d7b31ebf642d3b65a5bd105bc9b14024db50ab2885cf305591112e85e738acb2c7e26eab9321bed60c61965b8134c20438c9174439c9174439c9174439c9174439c9174439cf7de4bba21926ee8e921dda0e3434c4639ef8f67c00d1c1a0eed6b6aaee4d2dc628070a5e6802b546b144639b76d6bbb7b611fce39e7cffa5aae1ee8b5cf9aa6695a7e08d2be7a96571c69ea95c5359ebb0ab7b6b2e6ca8ed5bcfc953531765933bfcc8ff367f9b1fcf77bddb17ccb5f71a449db3dfedc5ed0cfbbe2c852fcbcaf576bcecb42a1aaaf0e097d7924c2e517a99d154838905f5f524841f1f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3935fd35ef4ba7bd560f2d75a9feeddb3e6410e52654c9f33714f7ff793c76028a1db8b9eee6ef2982c4d2e7ffdecd99c3f05fd92d0539d5f6214200acabfbdfe9937e82d25f9fa21afcfc00303e8e9ee74f53afddad74eef17f9b57f2dd3aefdcddb936c924bdbcf1b667bbd6152fcde291ebe8c5b8c141b9eec1a939774d1a626bbc6e4dcd72ff13a0d9c6a9f3f674fcb346b0a7aed3347bfc2a06d2a4b35bec6cc959256a0e90bcd8ff157fc79d4ab8a8742311cf4f4435abfde1a85c5495e6f245ee8413fea28a00fed5e551cb4b1b661f067bc7ba634e7a7d5eb28d5037d556920f2d04baee53c030f277992dd69c0c8430faada570ff4214f6b4f7290d7b9ad7939bfc6d33da129dd5ed407e1dc6978f184d6b28a6f1bf7b0057038cc80ce0c3c7ace0f18e1041e55f303461851594698448810214284cb32c4bcbb26b8ae09d20a8420048e7bbdb7bd51dd35a129e5842084ae099726ba2664483251903a40aae1458c8277affd8cfcf871442ab1a963acb5da7fa1bba27645f118e5a4d55eac7342cb9f4e640ca33efd97ba6bdd178851c470897dfd174c45dd1df6d977f56378b665c0f60b1575431639e326e7a494d65aabb5d6da7befbdb7f3d1f2e7ebd5d3e3a3337d51c1ad0a4ebdae7da042109e28e2c53307e786d100f654c34fa91be4c975559894d65aadb5f6de7b6f15b2b9bb2a6c2f30ea9631ecae329b4a39af4ece1a2b6b5ee8418f437731841ef43342f8413f43e3e73e474a65c5a6d52f906b7f3718906bbbbe1663db4c68bc7bf6127f8b49437e8b692b9c33079f4f038dc17232a187d5e3a462b158ac53cdc9c608cf4b966a12ac2458ac1e383860962a5249f1d3efa39f792d2f4c77457ddf8777b8e178855358c56b37858afabeeffbbeeffbbe6f0a5a7e9da9298c5595c82c560f1c1613b21374afae8cca285746b932ca65249b52b9469a6cde9157d294f34dbec93c9c52279b277cb28ccf135986c7e5e31aa24364a7c82b774cc82a8fcbc7354487c84e919711976b880e919d22af93cd694746f9b8b2cac73564e7898cca33ae8c3ad99c522e168be53ad964560622c315b4eee031827e7b14ad9b8031c658f7043d1fc356b8ae3a23344cf635631c9c835bd2f4439a2c1e8275a429633f7f67a70886fa68eac63cc8d28d2cb1f00d6649d38d190eab6b42fcecfbba232abe3142476c879bcac3c4f968be1a6edf45045e619734757c5357377c3ec62e2266f87c5c57f8a3a91f6af5d1ec8f0ff2b61ee35d7d34f8a5e5d82c08a46d191fea9b49d9ed356f8b315a5b6be5360988a62cfed1fcf0795c6baeccac7daf3ff069513f5f93b0696d5dc9d2dc814fcc8b2f37120edd31151e9fe274fa43c470200b15100f6481fd7ced093c7ef698fde8d95edf6e1e280e6499cfb9301c3ea38d7d6bfd7a81c9edb79056931a0d6cee98a061ee576e2bbf7f5251cda4d2cc92255b7b701b6316e32975efcf2de3de7bb39f5e16efbd11a390d33fa9a4a9fee71ce9a8d5c36da49462d845baa1addd24979e36367dfab5ae302898f03ad9f4f0f89c54469038f23ad9e4ac74cf2acb35cf2b9e54324ea953cd2975b239a94ea9930d76aa39a54e362715764a9d6c4229d6c926bf42a9532a7ec633a37b7dbd727e0c215284c8eb75529d6c705a2e9d9d9316f6a1c369113a45f4e0396a5d13340cf695d39734c52f5587485324e222a940f73cc3e99354a03be6994274f873e81ae206bf31a6c754978bc9c764d0cda5d6da624acf6258861f0af24af3c5eb558f72f8d1e4abc1d9922bae3b7e34355096e2cbcd8564d38e755d8291e4974b1589aaa88aaac8d35ce2d5482bddb58c5e7992570f7208ec19ba864f159f0f90a5a9656456d28402ed8a5a0af4bb88b626c32ad124d9111dfaf939bf66e6a9358a76ada26824f3c8d2fcfcd264a469669d01b2341f0239a4a0ec151acaf36080e2cd45f4f8d5234dd5088f341d91261f6992bb7a9a0e1d0169923fdf021298408d0d4419ca611045484119e5534e224acaa3fc8c944741f994944fd93652b40c47411672b6a4701bf71b4acaa3886aa4498412cd8852d294c2ea30614116f22d8f9691a6d0cfd737a449f4f3354acfe41c3af8cc2f1e3eeba7d4ddc580f2293f03e553b68d1eeadb48799419231b283faaa28fdb8b4a117298b020cbccdff34bcb78fa8646cdc892d452cce875f251bc2e06b967a4fce867748ff2dda3fc4df1505c37e4f5181eaa0fb790482412795dfe7d121bc3492e8cb917204bf32b0f64999fe2d51ef8d2282db3842ec9ad6529bec6b8ee9a6b14aea7fece1b7928a1d093889ee44bbcbbb9947c9e1bd531a1eb87ee7d9148e499884c48fe927c8b594212fa1632b4b15e5139563387a6654c7ee0f33339efa6504a5be902e68e48aa1802a1fc88437bee716c0f7a0ef4803d07b4e7de6e0fea62d09efb19da737bc6f6a00de78a95d8d3083dd20edd356cf78e098d5f3e86bda59f79311cbb2dae2a5da87cda44862b7a475ad5a0610159a2ad131d7ac29226c933942da396eee1ebced3e4ca08c36016ed88aa7612c2b91dfae49d104e08278413c209e1e49d13d18e68475444f412f1889010f5887c267475bd6bbdb0d1f14a2c42164c5a6f022cbb2370f2e3c425b704ac8bcebbe7d1772871d4fde867743f1a7d47ea9e54a589498aef938b1e9ebc88aabc8aee873475f8ea70baae254d294f497ef40a9db04e7a9ce09ce448137e2ada5902ef211cfbddc7b8907677318cbefb19a3ef547eb4678cbefb6edb50f1a30d27c977d1cee8055968c977e873c23ae9e19de0c8127dec9de4c8129d910137545ec567d2091e307a16fe01dd9338d0c30c154f7a0ea8ecce3e0b3f7a169e032a7637770c2cfce83bbb67b0b047dd8cef9eb4b34cf332d5503cfb70d3e69cdf4f5815653ffbed710cdeb2084c09c4ccf23269870e7d664116590a9ea4f86973a6f3c26dbd5e511d13da7eb7377c061f6d3deda717c32528d33228417d062e471ef729bc3ef9c9ee35c715b17a5d95785d93787db4044e3f847116c57956464696e80d59a2dfe100aed0d7a103071c749072431ae86865a84569a4558d27ac0e07b2b09906da992bf4a5bdc93bf341bb63d8b6bbe632ef6495bc83034effdadde1904077e8b3011b3228f9d44a6f44ca418fbefb3e8112fd6ed48d6a74cf3b273bd2248bbca489070969eac93ed877b931593291a50925a4588c1464edd6b804e0ece95e27f2919052ade0cc24f5435e867273d93e574d6e2ff821c4b964c3398364d71488dacd65d35abff43a26b4fcfad1eb33f850eee1169f7a313c72da83bcdee2e25a7ecdcbea0c3abdb22a4e652da125a6513836b137f160c5bcfd02c9cc2747e7d7346a46a7a4a9866365199434cdc455d63eff0ced737e2dc6c59d9e8d8f77e77ee0589025db3da7b28c976f64549e91a52ca393f14e943d51febc14c3b0aff17a31bcceac59433269f58009c0e8d0a5a12b46928a64021d35797dd0f43efe1817d8dd5d0cd9e39f913dde367ab86f23db312eaa0c4823d01dba4823d0fd1f3001180b80c10069eab0086d419a263595624fad82cc7aea0ae4048c9ccc6cc95ede3cf6312e3ab8b78d1ee0dbc03edb70aec4dd5b5e3330ded0058cbb57528ec63efb9ef5cc16e8423e7703b4822ce2673dd27424f3c99e70a2eac0bb3b4807ea0468055964d6931dc97cb2276449667a65255d41ae1f630a397b7a68b5af170b9c9262408ac10b22183386c7592f10120f120f120f120f120f120f120f120f120f120f120f120f1e788001e9a6071e52509a9072d076742d7c4196c9f1e03c9005fd69654a8ee073ce121ec832391c3ee38c5407b2cceb552b5ba3158f9f47241c342eb916c6c1381807fb149fd9525173257e2aa552ad5612d405a1b923525690452b45071ebf7347c494156489d8a487c71fc5ec0559e2ef395ad11ba880cc80091549875a493a9c5227153fb94ea9934a4eeb7da869739d1f4ade5a6fadb5d62f95035686711c8655ec6b94917bcbce47b365d983344c638ee33eff08d318b739aeae76f0ea4d0a6acb0e958fb1bf9bcb47130d203ff3b4867d7273c1308d9402fda5ac900c576499166f81439790142f024ebd9b8ccc638c5edc64d05a238fbdb22476b2c959c35e3fa5409d06c89e6cb697cd25d656fd214bd5655ffedd5c6e8c2414e8932a6eaf53a3c0bd58be4f2af931d3ab4ae8aea2a94016707a96774b68cb7b8c98a0ad8717159c33e6bc9a9a2bf77e943163e8a2b6b09c38ea0479d0c588948365f00d8c92a699ec06b290af3d5165ea0d1770b64889f1ded9632fbfdc76cf78643790a5aeb8b67b45d51bb254ff7a30db4e7df8bfc42878cef93bf5f05b2ca58d9dfae0542627145966071ae300beb011cc8391c07287cb22e0103088528e34d11a9f4ea8544eb47639ebd4cc000000004315002030140e07442281402c8d2541d41d14000b8d8e4864509b08035a9203290821070c32c410000000022033421a8100f24870c83a800ce3eae86d3d0f7e390d2ba27ca400b8423a61000c8de64282ffbb893e3c2e61384c521daa958ad762ef023a760035ee6e39162cbdbe5e07e3830192e56b9228429631375c2928c2f5aec630675f3eb28457664c49972935545dc4f73ca61f6e2d2333caaa7c9cee6880d1ef7d0b88423b35555004fb30243118aaef5406eae46b7a7c6a805c54cf8b2336074397cbfb201bb70946777f8b5d418f128d27837e0ad2232fc41d7137a5d7e2f0e1574c6de0f9548f3e9a67616c3cfd6ebd5c6b82f4dda89c9295ada9bb354e186451fce7e8018882bc3d8e129b52f8acc03d36de6aeeb783e8b51da540418174223181182135704c3d8a416cdd7ae95d74bb486ae45bd027f49c46694294a01d3dc3570458ee48a112d9e166876cd677ab10523ea293884a22e35b51ab9a2c38b33d25ea6819d3611e512ae38d7e31cf37f0b5a2b8c46212455f501071332e66a61bcfd85c03f94fe2817adcdc607d1388873e67eb71f3712c12dbf20c8a8570219e3b1d21bbcab5b31b16591c6b41bff53aee49c2df445b0c1cb7b33b0d111331534f108e935c07cb8c4087e0fe6113123043b8d575f58015a120a29a8dad9842e3d7d50c248db05cb884f10ac07441f7849877d2e850804359b43478c2f9721381b81fdba86620673f88e2e924d8d363c8a551f34666b08eeeb219d929a175d43cacfc4b7436dff678cbe3e5826f77a24826e1536fd751bd99b7d309744be385b6403a8f1bfcfa4264c14597bd5832ae3872c19ee0cd6423e441765ee69ce84fe5c81ecdee23e2355363e61ed13e42bf890127b4b4504d792a93b623f443e46d9f9233b5e2c8fb20228dc10634fe8689f170add37b479b1042b35e8cc596cbda64a5a215a86ac4aac89d883d86ee0ee72d095ae5d44d071384b43dfb095d4660b9aa2eba053565c727126ac5b33888651881aca877ed593b6bef7c4e93648308953e22556d0d33d51867fcf94bf6c8109b0a063fe9d984d929b07cfe32fdfcf10169c057c1164da5b3ef0c86368904ab48fb82f6d47f83390ee4db0a2c9507aa01a321bde00658d61150df1862e3a0a017ced37bbc442529290640034c341a2f0fe93a6fa431413150faac9e5a625c2ebd53d38e9adbc83757e7b35c10a45327e308d0b69094b7e86f97398c7111ccd5325d93b88f3dce36583e94e8601a0b7eef98906c60ef1c6a683649de971a3fff4f80c42574e4477009b206b43dc50cd71f0aa1d9c8e41b8645479213f74d4631ee1561216b1da8628f5cdaccd041a6b7753c1b7446f423201273ca12fa21e9191060403f47585c157d1ea07d3612856411d26cfa4e3806d4509a03d39e488c0763ea84f6c3d000203e0c8a9f2c239801515f84976d78424cba8251294bc322345c0339706c643c37c9d6ec4f708d98316a21e2680c1430491f4cd17097f2e535989f392f41573f2b5cc6140b6e4be674bd452cb99087ec87ec4341ae264f8002353cb2ba4b202ef904baca3d4bb7c10a3b57df78c368ba28b890380805b2a93668a931ec6f3312deca0aece055e5242a763085c4809fa1ef6f63d4823ea2ecce0a8874aebb52702598074bd2f446840ccdec9bf23b6cb455d1866113caa03129d28641a880062903acf1e3f0cc81a9df509ae138374b896fde35ff4d788db138ca5364874ceb285c75ac54ef4dfe24104a3be822729c3e2b13b407471ea50a8373dbb039c47241f17720dbd16c4f6f2b095a5fb8852e17b035ad69ebea0e9062e841ad311884b1f81a01b6b59d1661eeefe1abc83037a7d22e1009c6c5d52941f0f19eea1f02f36f1437e45f0905f6d42adb5e18d08b1397a7217e252d6e399dc02cab38f047d4b7e21915c9b9ae530e196cf567cbf62b8fe6511e01399e76ea8050f268285c30b674abec4a5d59fa3bde556cd9f950435c920a9bb5801afb382b3016fab87cf94db842c3b86d963cdca97ea50818fd9f461e3693274594ac2b8c8ee317dd1fe4124619f19b15e9409839f7f0257bdcb87abc9c3ffd380578ea43d9366936ea4f2828c91f87211dea219bbc57e2a9a9815c74e7d1104fc22f8869a2959d86c773fd7442e2c206c433ea7c55add4bcf309e202a0f8330809f4261ae00aaeca4e5fa101d2fa6844093cd682dfb368f64d7d00f0be59615965b49091c553ce8f91bc1143825470f973e600f1a95abd2793898d1949c2530fc42d91804e63113813b4c43a02b148809cb34a1b87b3008d90e8edb9c1aa317104fed0311a13fb4dcc8d5ac1ac062a573782227839503295a711511325533462ee68f423a9f45bfdfd333438d7ea2b68ddb6db82859a6afffba9e6b36e29a9be63203faca6c4d312d999bc9bf0204addbf7c45cb6c7cf5e35364ceda9231016be3fee620ae10e4bae2889469a37d0648d0ed44e3dcd69d5bc1ac42300766972cd11b46fe04f665d5f99186da0f10d6c1a8ea21b2b5b07e71a6bf3df408e253de73659207340bb5893e63caa4ab020c11ba27ab59715583d3e977520766de65c70e8d83f39c167cd44fc50bed8fce38feb7c84ec0a840af48ae22959392bb1a3f872274e55fc84a9750c271049d8bfb3cf80365da4f2445c93b702f5ea42cd44a455ebbe098d64ca9ad0ed6ed2d7cd87f0bf70c4ec049495e5a29f5449a299b0658bc3b49fe6ee41e75f44f63670b61c71f20aaaab8a710a1ff46baa4b4d8b601c860d8075350f244c7e02d09e4fed013a5d093e3495d1b9da0e13840fb6653ebf99eec24f4570bebc7136e17f33105c1574c08d4b3755f7fd997a3db24f4d3115b034095e8b3dc88ac781b382aeae234efa9913da93a5babf1b44c7d58c93f7634314cc2995401fb996d8d60e8833fb692b295a77b3269224e052e7b02da755afcaa738be2f301331c677ed22f7f5ba21cf60d7d7d107cea5410082f43c60cf358efe78f4cd09bdc2b82812e44af024db2d0b4f17fb4e46edfab60363203583cc640616ccce6edf9d75df8a6dad824ee0d9b66130b691a10168ef34154e8558c4bf98b9a0b6cda58cf3c4d8e1411b441d13d40589bb236b40ba714116e50d33d2719d3637ddad84c8b2c061f3ebb40c8c549a06ed9f0702a72e2b6c41913180b29b1631109fd080851b54872e157ec01224ebf765a5bcd37aca0cff4dd50b7f9afe164b3679a7130dc61d0e4c35a33a46b7604c939679d58b664da91cce0f8d7185b8d30d0812a8343b7751db2b78bca6108a6ebe9b6929bb580d969d492848eb92327a1b953ca9e7f25899830bf9d5f0921205ebbcf0a4d9ef83d0b1d9c647d7977ce94fe976357f9b21c811971d2ad1b916815321841ff58e110f42fd51262c27b98a8aaf6906172543e61fe423e118869054190ed5efda12b7996c69bd735850150dbbe9fd88ded80e55eac5cc3bb6a1afeaf86e3aee8153dc551525c7451b2751e5ab9c3d85d8ee01f93caa6e33cb63146719b3a77cf216e1d1782012eecb8595c5cf8930eec710d163e760c4d4909cfd1b13c9707f813c73435ebb0b4565514351f48eda35e603af62ecd45df959a2454bbd5152b6de39592426db67e04ee0a4d238ddb077040257dab12748fe5177ca428117cd0a3f2d921a817c12c352b42a79a3e18ac7c200aaab9751fb72f83dbdf49db92a910fb829d91fa085f2f2b812a04674eda97632b36404d1c227f62f0abc10f8e4c885d39f000051488eea7188610c0b44a51e86002f3a7679abc0fd1538cde2c7b3bc3c92fac772bf1f9d99e1f45c77bd1c450b4eeed7b83f2ef8b307180a8fc45905b2fb83b59f1a28f2ced05ad6365a5097f7fa2bc82b109639f21567e17d8e39899b9fcf26775f07d52481d46b12d2f519729dd0ee0076b191f0b044e5d3ea6b29324cba9cc6127cece6eaa50675bb767785bf88952a1a75c8c6123872ffea352203efc93a3960f733b589e8854333c0acd993ae2e3c93b72bba0e8d3976c7d716d5cd93f90ca54ecfa095020061ff600af0d3841301502f0033f876d9482f80120721a4d38c3ff4359c7306738851e83a9ce37c1f3fd1bfcfc49b420d38169fb617c6bd5be7c4d593deb014f734ee20929c7ab4a8221cffed113a41a6ef870ea84f621d031f4caa287f35b572105e9884106ecc8c8af4a873442c8339ebf39732a5f536e796d183afcc65a3d10d6700a088b23396b8b92b53129ec0841f9ea69cb13789d21cfef98a8069df3f65cc59a671a3c17d3177380c775f8da6a5576532af04b7d5c89fdf5a4405f1ba525069a86bbd6d6d0d50fe077726dfc4045a5098693950e899e5805a6815a2f5b025c1560a127e6b8033540c5e027b18ea225d113b161e8e09bbdc15b118f48acab48c9f4446c743af0e66feec899ea37e28801ab6b8c9e408ec488db4f767bc1d3acd5a44580b8c56e6082053d03dcc7139699c899aec9dcfa069749695ed20e03f2bf447539556039363029559f4fc50d33a85554b8721a14648f04395389bf2b9a0322f5a2a2b13ffdd0e0c74064c207cb78832e8814c0f5f4ce188f3af689734591a12ab82a156ebd8006d21b504128f3c728b332890c2082073cbe9153bb82460f08bcb9818dd462bf5cda3f6dee01c4be6fc7ed3ec84e8fc228b5fdda3de1a6587af42a5da2f325b2e00d7417d5cbbcbb815209bb65672718f1ded6533e76ad53205005901011627b612b025d21cd526dc7b8332f2ae1a06b1a992fb9eb1ac977cb968ccc3d91d90acf995f34e83372a751cf46a6aa3426ddb637627116cdfe8bfb2f19918dfe6a423536ce4b27bdeef9ce6a9b5e5c7c4f4a6ad9617f701dd911f92841c74d25fb20d6013f56cf28665bdfdc859defef172667ebccf0bac099081ed5b408f1b0da070591a8433693935dab7e0206e42c6ce02ecd6e65ac5b8897aeb3e76f73f1358594a09012b0dd19ef22bd41f8675933cf4835ea5bae942facdbf2c061e61c9b9f6420e6f9af2514a30ed9b5cbb43f6dcd813bc9ec7c0336ab3a76a330c05e560c4d2984c216d779940480a0412be82955504802fb02d9ec6d3428add1fe533c219f2471ba88213c0e122bd645fd4e9b9ae0995d68cf42d4e43079fa74f364eba71e88f053469c4cda7eb017c478226aa5f91ea89406fb5ab109f92817e3905b020243556df1f8c5494231391f4d160edaaa1e2dd3780a8cd75a65bea95edc71536cb6692c61c1506fe99ee99678230d82aabcb9350fac6f20b5b05bf994ea7706aeddb48cb869367a13aa390ee4bb8f8185e43f2dd4252202c77d15ad38e05683cf597ad0914519d895c8363fb28b6449bac0c85191df6a0ed7da7116388b0eb138ebea52a6c59f95e37fb76298214478f65bc4f99cc9c1478a607931e799595e08c6e7fb424393b06409aa90a225407a1d6d7e3ab4f332da04a26be6112172ef3e33ed18d662f24a9003306bd7b4fcb0a8c3a866964bd2d2b0f8572f9e0c81b2f83849c547d8577cb7539b2b74d560fe294f87ce818d989f5db96e4a6206e3e12a2ccc3ceb24d3adfb095c7d4e418de8e6ea0c0e234ef8d98646774c6b314410231113353bb473c03539465e4e689f818e485acee9758f13e960a204269908a7197d4d88081af678a42ebeb424354c6426318a0e850f042a49788b1aed07550fbbec05f6721e3ff7169c12e1fa6652a8e31c9079b09dff8b9cfd74cab9ab8f56957fb6db283954c42e51aa730ff493baee4ddc40ac34ca160c488c92f8cc3bc2434947544b5f74dc27d43d705bafc0ab5dbabb2711befbdd7051cf6012c1d9a6feb6fa8750fbf484893292de7e3ed34eac260d79b247db4d09ee28ecc502f02d0fcfbfa32f1d83850d736596db528a2861516ac44efaf31304c147863096875c7d6e9139e23e1beed013e8c942e4f2c8938ec65e964a85918eec632765833cfbe4e18947dc03c7a529c821c7970b70a87b9d3fc5b0be66b8d1b0ff6f2381a8714c91cf68d4f3b120203aa46d2736613a48f8a2a71bf1b8ff4e60f87e12b6e98e4be4ed62db28927d8449216ebc5f8a47441188a9f3be74fcf4a37b3b121e19efd2e3736c36bbc3d4bcb079bc213d8e14f4629101878819b4d013434a1e7f2a3cb863109dc3f9cb649e504b399819075afef27975a68c926ef972bfce2f448c2fdad88fc0a8700dd995b4e62d86ef6bb80c6b1cb0dd1c2a5186b6632eeb920afb3a797cf8cac9e759147926ca6513b2a04c9418fa89f2fc2ce205c3722c336119166fa279d10ac5f59529d4725a91f4ed0b102745c55de0ca88663a8a42316a2131795a9b00006fed79125fbdb1105458f5ff6020b753f886e705bc356e5f2cf3acd33c4e8523dbcfd0a7114f450b1c19defabd038ce47187ff9724f7dea9f7905815bdfa489abe786b334d7b533eead5ee2982867d39a088dadc913a226aebf2420cbcf94a460cbb9673dc7ee4254c1b8ffd7136ed113450d0f03ce4e96ba5e5c14c525d82e73508ed07c8ad2e122130dca15cf2302d4d021bfb66ad43f99cf72cff69d69d5f32cb62ab4df271534f53270b49d57d9614808e60b0e6338512779a4282aa9cae392888d421f748960d71df8ea546b9872f7530e8403fe722d69f258a9322ff13801372ddda838e845f88970d76871c5f1e9b38c4263582b657c978732d58fff0856ccfebdaa331c195075783fe1e3ec4042b43158c599342f23e87eb60f483748f3b20b95d18732fedeb8b29ca0cb7bf1ad61e637119021439516aeaf0383d8537e621b758417299b424233f2131939bff467b37e109954e36e8e1f9a6203e9c48dc41a46311fce3d4307434cab8f5220d4e413fe3275cb10dd5fdb9bca2279ffadc36d72b6727811f78b1d5a4e2b6a4ca0f83d713c49b621f8770447b4c40eaa4019f564bedcb164bd250556f3f2db40bd60657966490a0e346231e4b970ec12f0927f436453096006eb32f5a588b3f34c89dc110900113d3216e27ae658916290aa23a74c86bd9edacc79e8ae93e2ecb403e9cd7e63932488b944c701f7b7f90236693fdfd7d62c8cb49f2a8080a8886f93455b7c9837cba29aef606f8e3f2baaeab0909372272bd52ebec7ea5bd5102d3a6f6c69e37b90249f04ace36ae69115da976a3032b41b35123a989f42e159689c96540b752376153e0d7d2f02528da091e5280122d837121a32b054e5d59bb3667a95a01b8d37f73d47aa997d31b08f51047f90ea9bfba9e8a28ce5c4c3b308e062a0b92120aebe8b443d6382f83421a2613bfd8db48fecf9060c313c3619bf7ddb4dff44db0cfeda870031e5b50707e01e21cf8bf3bfefbfcdb0218b4f96ec9e8def78ba8e5ca5a94eb8a1ea64a6c45bf42944f7bfe7c8b8e3a99f8627f23fb3f3b825835082536aeb1390d135c355ce3c4b299fe4f601697cb6efe680a38b8b7b81ba8c096a9c7ca44ecddea909b68a56d7a018e1aed574eef09ed44f4ddfec9404c19e362cbb6ec6f479148cd880eb81946f1b50a0b7e7bbd154f20895d85bfbdde8e49289c7a803fc74b7cfc650845323e2a40871d228aac00f0043eedb2496b331981153a218349572d14bac6cba0328604e0d04301734559ee9036712ba7e11a96e85b41c4b4b8c346ba4d04a1b0d02502136b5902a04803b950fa313de0d026b6a5539d0206aa3014dbbd12473bd5af89dbb74251bac3adef63baa08a39d4bd5b897aa70ac58ed11580bea2208a0d985ce82a5e0df99dfdfa3ee06054136ad2bbbbc10f1b065695ad263959c9f51d29fe019e6ff6ee021b936a42585d25ee71c0e3c9babe6126ad0bd714b46bb74691eff21abeeefd0caf6a59f995f10a9e04ee2166c0ea84c6b360eb50197abb33c843a6af6d90aa83f932fd06810b1cb35c3b2cf791e16e8bb301c348cfbf052c218c891139b92e20d4704a085085f0074f9adc99220f79d36f1e2066dcc7dfafa00f25b117584bd38028a35a3b589c28f38ceb6c430351c35d138e63609510d15d7f20945b556697a0a333f660eff6c41e9252483f6793a6b45d8dbf8d5f47ceb225552702dd99e18179381d5695854d485b11337f1e09f492f946c60d846ebbf54a5e2c80f976424acfe5bb978682f4563b260c7e242e0c9c1950b9e95b3eccfc689f9e985cf53b95b7c959838d779baecda6ea7f51b7f404d6b8332ca425dfad1ba7f4bec83198d24572127fd59953363d05617d26bd2fc37f08607db82f9800ce3db769b7437c9ed51efcdc880801b97bb98a005595d0c29e70672c761c5fa31cec122dd8408d3862994072229dd0e5cc6869052e81ae0997c462af0d5ea93017f56fa5c4689626bd075fa54fa4cbc0d4dc2d863289708624173c114a68dc6835928fa2ebbc024a9c775d0cabbcbc24e9d6be1ba3460eb1183ca5375a71129d54f8c0d89f82f508d3b5c9cd9b1623f04907d76e0deae22327b38e1f390059f542a6cd4650fc3518ebe053e7b3f6a71cb20c80dde4df45d51868ff281f91a69e463dad4aa79ef48fe475ead6481f97f5d8c3785058a781c00edd1af9807f73c72f3509962691e49426dd15c5ac91d64a9b57445c412819f882fde81968f0846defef61f4473669bc41f07154a3416d4d04eed4e3cd93353e3448e5025c8acbd6d45c80b2e01ce1e1b52f8086aa41e2cd31cb148edb8205457cb89fef6d4a50a6b5cec237fbbd8ccd9483c174feca8af6f80b22e3b3c6828e049114aeeee01b7c2c109a811259b9c95976cb43c9f1ec13d36a04e1385d2253fb8ce0983fa6dd54933dfc19070ba48b33e44afc47e904ed14bb0d666d510551faad28462455377df3ba0b68d4c132dbbe20c2d62ae1e14ba1e75c3ea2742b32a902e2d1145b25cb4a0005f66021834680da4450c50700e9019f93c023bf2d609f4a723234811bd3125c3114422c497d3247a4f2b605f6cc85dcea86de4dce8d1f4a3b4138341af070a4727857054572c99cef8700188d37f2088072e1fa4b8029c7175b50319f729208d8df47785b67aa00db3a00a7dbd331ac87ea51e1b8e50540c2a9407826fc3c51d9bfcfaf1c4001a356eed516604ba15caaf47a5770cb587ab7a446b3d475b06876ea8a12386e75cd8202df8733946b0f302a52148cac9744c9da62b8a2af351ae6927c72e69bcdf442eb65ff269f8b869525a6e79f129ac5bfd38cedadb6af9d1c94beca6d4c17c3d3304727eb344ca06131cd262ce848d364166998a091751a26b0a4d1641a16d230c9721a26c482934ba38facd4dcbf2b18de6dd20d4a764e8343cd53baa8311f9a66798670113279d567fe14f46ba1ca55b034fa3303f5d30e8e0a8282be5d99dc8ec4c50b1486d15e2601c84579a25a721a0bccb70656f7e9182378bd203f6b2fb382c82522b417abbd4c7fc53507335a26c6b1e36b24d866dacb14d2644f006b6ad8cb8c0c94a17c50020df243692fb3732a49398f9a1c848dc3feadecfd1d6985ee7a3da999650971d109087b997a12492f1e3e104077c0874d622f63b8c1b1a574c141e0ca4c1eb7a680031bf29543947792a17fff94e05d6671a640d469abdcd5873463493b882bfe3642881707ba4524ae5e32dd549cc970196704c49ef056ce12fe9a9f52cef4103d870c53f81425c697435ae01e2e7c35a9ef356c05b497c157c05fcb8fb37910440e4b5153d12309f0f00eda6d2f73c79c337f43e52b39d4e939620ebf10ec8261a69501d071dabacc368df877985fb36974eb75971d2d6086adf3c2f332c6bec24e89b40495ae83eeb0838cf2aa5ce89c7fc95cc1bb36238cb9d498975954443a5458137c12ad109c64f96f96ce088d38eedb4ec300e59470213e2fa32fa1194b76301bbb6296da7f8f791953f10a5f0a69593b5dcef1e665b030e924a8841f278caa2acf705c22129df180abfc5a6194365f6434c530fb26c3a69335cccb5cc330c76b9e3a5907119b6fa76b788ef72ec0af51afa9afbc11116da9220e1410df33a7676150ca7a720936b6fef6219e612e508536397f617b0e84cc3aaf042d92782058bccb072ca615feb692b1141618c69f9749b1c2ff04785a28ea89b79c25c648019f92b12e93f573f5d5df77daee4de6f2c4e749391024abf9c2c92a1b2b03e2416e736465bc0f675556ee89820fc6dd945f22b89691967db79895d76456309afa4d56e7e559e106acdbcfa66070e39c6805989a6f9956fc0e4435e95b2c540e183255a45afebd595c34bb9a5a99a337842541970b6cbfe5a05b0e40106bad646c476c4594d8cdb495e6468c5b516f79b25b5ce00aa349f38d65c5ff8adcafa29cd3732840e04031237a685911715bc4d4e93d1193cfa23076a3a7b0132c4492c63f56e11c8eb6626784cd9dc81114d1beb902d6863bcc6f3628a25b1545e88eb8c5a8f137d81f19e15ca38c55c8bddaa5c3c2c5fdaa3f7d7be5176711ee61db2e1941fdf84258459bd2f1f9b7c3e1abf0a295bd78b0fd5e7010d51c15e1feb06d921b295edf1455e9c94c664ac8eb8b9f348df4de51bf46c157e16a05fc5acb35e3ce1120f286087db21777ecac39419ad264fa50dfb666c8d0993e4a7e7d24104aea75c66b43783b0855a8f1443ab08da9b36130e299307736e429400a085f805734e448e4a80b8b73202102ca6568177f887b653b317992319ee090e914557c2383b530aee5a1bd6c75f0d6c6b4465a247c880cb626a037da905c75bf7a0a266258c8a75a26075210fce8407635193459c561ce5ac401fc608b65f15c306065218866295e5135818406adc84e78ea59f163ed25a1e566a2482348414ccf88b962f0c521b21dedfcf65d210a6da3ef6fddbee3e67957df08539dd19b13dc3f7837f97ff507c6943ffb051fa6883e437218bbb9d81f4e4e37cefdd4673b7be29e458ece7038dcbb22ec0f98f758bd07e5582f30fb9d8e01b6485e2465c5c85f92f71c586c42f71d25ef1113a2def41aec95bc843728bad23291dfb9e4b9193c214133ecd269b762f21cef28281bc86cefb189a6012994e8793bab503479a349d0044da7f0953b72d20ca397463988a6bac9eb0a9331e65ca872317db9e308fa558322d46a1463808a657133939b54e8f3ed3c290e5fbbca0ad7f58b4294b7352b4419b27ba2269d707a24da8707ace94608aa961fed202d3f2e9ef4b965995a057ca8f59e4be345c995e2d11de7583b7b76fd805eb20a540ec087cb42d0a5a18b4d90e8e2eb7490bcb230d3084173ce5a53985810ac7e023ba5392edba452fa89d602b14569e206f32f0bc017c8de6524d7b306cfb87cffaa10bdc2ad63a45df6f1c2930c604fc06c59d410ed5256d17c97996f201b6ef6651f4f999bc60632fad1e9db0db11f0d6c3b204f31d61cc843f48520c5f28b1cf0273089cb55e18490004c81a741687567bf450ba780a8535ce26f3ee56da039e58f9a5bee20f40c439e842ddbdc5fd67bf54f0bbbb75a70dfd3ea58a5c95ff7bb87fcae14fd2f31b2cf5b424870a20317666cf57632c657318a71423c91f727a635de52151cf7772f12fe9d62dc2d2f88ef6ef98e6bc9a41080421f832967f189e07b0781924208f2ba3e194c7525b1f861f9b0fb0672a6cc1e7a6d252efff31574bcef1ae08bc6374da29090ab7607e3cf8c17e1aec9b68b4a259e2fbe128560805003a6db79291dba057dd22a80c3313cfb196e83c05da7937906847211bba8e54e741acb88332e7654829c2672a158a72f2e13f1475b87f8658020ce40a31410f3bb665ea4e8d4847d27a6da53ef8ef98dcdd30fa4269b72c438e5fc6587d7603e356792a856366fc0b20e6375c46cdf3d38a6c4980f0b30245e9075448f2864a61f40ea9ae240bee4818a60ec37e21a23f4b11930607ec9b085393f312e2be860ff1fab67f201e8714a00ece9e89d4de27784dd7169c720a21e178bb6ff5738344c35c032c89b2c1c728f033837675bb994d91df1e1b4574847ca57c165e1b4e459182c2f72f6c9983865bb4228993b8652d48555abc1b368e6e80239e7f55d0d86a376c815127337f347ecb7bfecea3f0d68bf4092df5b78577c8207d7542d667c9a09931b1d86a83e3ecc1ff62c30dee643b46c8500687bd2cad45a21839f63c38df0d946f2f9c1971c06cb172f7106907805125566894b44557823ae9b011bdbab19fee5e3c6e11ce737a27da640b6028e3f8232bafb3654714b945813d4916f4d755d3e25e03bc8d9f36d01f8de8e01cab9045e632e686687281512865faad6351c10a557cc6eabcfd02cc9ba4467e3391a05c0920d94be484aa04685b4dd5d59544844b2e2ca0ea1ad5b4d2a0c8fc11f1df93661f615f444622141cd9b2170467a5cbe912a3e75bb8fab0a20064b45f7756a6f034234187563b6bb2d577b29db808ad40a9502ec1bac79c593b649792ed2b940e89810b791233839e0ff1a5b7ab21c56f8e4048e5304cde8470e1eeb0308aefc213f8c4d0ec43612b8ca3d0949d51f57cd58df209b85049961637c3b18bc6d0471e3431908bdae7e298e4047fcc8b963bb0df8ba5b78697236655fcc4d1258c205bb676570e94f0ed0c4c6973df7ff7d40c452026ae9009d6aed236da9cf10c0da9e37ba9f67cf705b7d3c7134d9e65ffee261a69212d702e6ebfc32579134bb10ad63b5705bba50873f4a4bb519d253f1e849d3f8e74bf96f25ace1bac47aa0afccc85fddc879502c1396e30f5306168e85bd5d16b094fff41e338685b2b46df447c2d2baba22bcd3bd93f1a758283cd5c5b6948ac2e499baa56814a406c3daa5430a864133e14d7781fda4bf2bc5ab03ed965a54ed2481943fc52a0346e5043cc170a53bdfeea92ac95940badc4dcc5c5bd906cd9f4e46a4919eed01d2151c50072a02d51bb787fe933ca5cdbeff6c647db5a0f6f470b35a2e6fe258778c450c92c5bb303af1ecfefb80bffe894dba2287804adece5706f3bd8da6a67de8992dd404683ffe61715b70e696bc2e0be19c2c06af88569932fe70ec687e382009503882b5c68f8dc3ab3fda7619e69aa37daae006066adc7e763cc5f0498461df1eaf1da5fa14a4c2a5e42cff5fdfc3beef50e3828f7d62710e2811b2b583c122451ab92c07ab2f341eb5494b68451afc823b213e4c9462e97aa7cf2f10a75af5de44b3ba2bccc18803d675e2570be0ebce1292aa800a89839cf67582267998ea57f73e09b70228bf8f3cc9a2db9ad1f520c4734f6b6e901e259e4fce4cc64c0f321b5dd86e4c28a1709f0306583812cf0c07fc137d7515e95a95f32051771641a8f8b8e946335b992668dc5fd02a7a06d9cfc44f9696e702a7d014646fb7a7b3f1eb35e49339bea7443902a36f066690bc8c352c949c3c54f21f1730cbe2e904228cc7d66d067ae7be4cf1d928f00eb9cc1e6d4d334bdae4345c25735491b20a6b8694491038b1d9815ebb90e00851115b987fc4823d2761281ceaac42b15232a513cecd56c450b05c7ec0c746bcca005eeb4d05b164a3e3c639188657058ba535445fa4e84d9c759f73764d2e47ead9860f6c91c2e2bc741ad61b0b366d22c547b1a6ce230dc6e4754af9009de310c611084baacd0e66989fca25e9a9b2714895d19209c0488300dd6d2e21a79437523e1cfcd5dd421df05e95fae3953fe3222fa11ee3a38320909fe44b072dd525161a8488e6ce59819c65361899b058fd11e0038eba548aa1206e0d10ed77aca49c3facad615bc108871ae13dae2e45d8a31eb47ba8bafc3748f2dab22c9965d656d9cb36e56cf40821d9e23923e89d968a48ea17354e21085e3de4a8460c8828c2a5632a20049f4272da22e636ac4abf5975f5eafb4b344b4f59ea9070b3cdd01e4f42857306d8929f046b3654064554c5dbe928d2e4a63e6dcc0d7d3ccb267df36c8553163fa3981852f6f5804bc22c581a97ddde395f864f386f91ec8608bd82ba979d5bc2106c7d8be35bf06ccce21bf1bb31b5df0fc5c462f896f0d453b184a2ed86794ee4ae338b9f0a3a572310066a40210204a96643255b03b1a29fd0904224ed2140bdabed7456de88b95fdbd4a06da65875a11bff4a068474d2ed6f304efb23645b98e71ee16260fc0e7b570c3b0d6e39148d812da645055751fbbecc57d82f5fe6e5b7284692c9318cadab108495a01f0f07faba2dc9f64b713b51a1b2512c92951bd9af78f4808b152bb9e89a826c5e056c43e4e03bc684028d763c6c60d2598ffb35371b08384cc9615245616febe8d1f0e7011d260352dafe16b5b837a02376afdf411f207023f7d19a23c02b8717d0c1ad2ee1242d165244bb181631e4e0551f0837e7f4c860a89d2fc0fd5f41a0b715a0ad34830ba2e51014420718215ae3d9df6156b441ddcfec5030d14b192dbb6facb02558a63846b692ee5e91c171c25e927fd644aff5a3725355fd0d2381251c864612f19b56b73e5d08f306537f0d3b652c717dc001848b9da20f38c223ecde262d8274f077c2f61ce03fb9a9df1c00c0ece437e028b9b77836e3a782334ebb23ee9413d23c1c938f42c542db34e018ad5eeb510ca7729013f81d0ba305f88ce26e6f007bd07a5f21efc484b32a8ba76b98e40264e0bb6c3c314ca457d4e137c61bedeeb5aea062051c191eef31027c85aaf5fbf7a268b67412ae70bed65e1c918e6a9a03b8ebdcc2c157600465831605cd608d8be9f6249407480de003294a070dcb7a9f43a7e9230d46552025b0997d3f88eab21ad070dcc65998e540cce0719eff415f6264d8440bc66797579dd9bb7ef96dfa446160ee4f69f4046aa859bfbbe9c27a37fbcce37caa3f2b8e825885c5cff8effae9dbf4d12a2b1c19652da3181b821d1efa3c75f05491d7b82ce038e04505f0f8f33fa58c86d269420753b843ff6ee59c259cbea10dd0124b7594473e0edd4e86c79f8723c4558dc9d9382a02c781cfd4dff31d8e52569545d6440128d47cda336ec29c4a3d76796ba20d5df761c9443ad2a0d1b10dee0f1d7a1f9bdc67e1e20816461bd8558d7b80d88d7d367fab10cfbca25ce2855e27b380dd0f297a29e2142c1d0e97bd0d8c34cce68dad20c79dd5b1a9cc5b28c8ecc708bbd9def7e0f4a1c636229a106e8d66a6e1d2e210972f7c63c16d0348090b02f191f771ee755c916f7c77c8f0777e48dc78f552671e45eea24ae762fa3cff8cf9f06700f954a1912e03bb557039502f00b4bf432ae8ec78b78a2514acb5935805f0a29b12c1422d03cb20f9a26047ed12cb95391c14645c7bbc6aec54842eb6e6071403e316c1d308587e6c86121625c7544285df1406c2f29e631543e4073c41c68aaf74cc0d395c0fd21db9d2a3b1861c77be3227d333f10cf6a7bf62814549c7015eb5818bf04b8bd8903e7e5772428e50a4294c92eca612728c1ee64a0ddeec6b54b2d2724a0c7f6ee2003277aa7c841c6686347aa42a53c16cf1d416e2aa55506361469e3bb0903043727f8109fefa31beedd767e0192ee412606ebd1996fac58d10460ef70bc48a26ea89c72b0460865e04dcdef4ab763bdd7070b182464e98f19cc58b92958675e0d2fb6324ee26aebcc6847866465870976c249116f53c98d1f8ef19c12e3499ca08f7f873789932256e1096ad9ae94f75f266a9bafec1a3a41b4a0a949978289befd67f25683a3ed65935fed7b823ad88272abdd793f5a592d0e5caad0e8603223edf4e1c7284145d742a920107d8893835b10021df40025b8afccc79ce3f210b274145ea3c279ee3b2c418fbd16a3b3c47b330bf1b65cbbea95d2a3c47fd0aadb3bcb2a7a06556c70e0a6c1cc0e515e56ba0a9fdef1cd87fb492bc0c8010d8d144d497cc1c1bed103a110d3bb273be956a22266e98f88d90739637e0c4a1866a0024f5da04c6162ed1fc137e72de860405e81ef99d708a6b3edaf1281dba010647953e8a0b9d6b78e94514c2f2f94b07ce782e4a85c9604aef884684f77d9f5e1e8fef8fb017962e90d25096f41a222dd1a3b14c496debe099b437b05f1e0eee060eb78f1211d04aa51c611b81af462959dc36aef1d5de0481e9ed424d0409491da0e052f8cb7ce9591c47c22ad69523e602ced89bfa48d96539fd45581438dd115d07aa42bdc05e2d0fe03e5dda21ab37cde094755db6f5852f452c3e054d7c038823c3a68f10c09aff05d4ef6b145407a03247ca1562c64b42928a25f91c7406249105307962b5c49ec181f4da456bd61af165aa5d10e5944933a9768088302ed22ab9d1ec174d96c9c3d7a743560dc6acb167b160ab3cf82b17ef72613a8823c10f966145c71d72845006e0ca50542f4315203d97e93812cbecb4fd89e38889101abe8cd21619b256bda7ec84b81c2ae784e9bf151357c30e85074e2ccb003a2d5b99368e3ce4195fe470bfd10164fffd85830dae84244aa3b50e5bb2b307261a74b0d159708a250947fcb5ebeed1cf3d7f2deec37bc1e64480b8b79743885e9e38faea15aa061cf1a1ebcb907d2bf51f913051b67bab6d2007181ca2e09ffde0adfab4e56e6fa5b916326459ca963f5f793fc3d220dd3ce1cfda6a984ee8719792c9486d21421ddd260b7cdf3c5b031cc2090c595c18c84441b75263710a84fd42a05b0b56449ffa1bf7381427f69a75a1f2cea5ac1129464778421f98cc9240d1425edeea2d7d0d013dfaef6e9a6fd98868dcbadbdf450b9aedab8f916b66d57d3b41ad8de75b23ff938ed84d0eaa665787b800450603a8b5a6e59c4d8ccf3c0657dee1612a584f702c80861f67a57a67ffb7cab12a1520ec2d41b4b74eada2ac881a235fc2a5ea2b1f9422d945cf459a5a3cb8d119df56c5d02910010a0bfa13ab9e4bae9a75253bb7af30c22b96497908957746104982edd0137ae413910e39788cd839910e31427a4116e123ddc7c8166d10e3975a32dc8fb6cc29b2332aaaa889c3b7f14271b0fbcb1c04dd53023b717e97e494f2a9e5f08e096edf993347f2ff0f9152ce6c43a4d459554ec72761b38f7a7372dd2d80d2d8a9d73bb3c69f217bd6c61d949b6b35bffb9dc58b75068b0707dc6f37ee7207ac491bf057cea94ead82f7c167aec719463e2e18f978f5a892c60e91e951da2d9eaa7900a7b13501d1cf27b2d1c466ea967ab04a2f257d16ac43ea130f2c560fd54cd084370d7e88fcf204d66a20c7424ad5f2ba007ceb6826c21235adb51f85c4faefc0173151689aff883f9fc31ebd2fc5efeaf5db4267ec83ab80804cce1933a13013228f6e217e8add79db589b570001998ce85673a1998780be7ae8642db5330d4db58999ab142a6bc91200b09f6533bbc9b41bd3a230a5e1821809eb77613847347d7fe52446c639a37c5ca44d5cd8f18bcc24db7249dda7d488655f41cb688fb541e4599ed1878f93dbe858c9e017594eabedab8989e85c30b106e40cff524b1f43c6373c261e5587f7cc7370a8aa8245e19b173bb8be31c12d0a65adf5517c968484e347ab10e0eb51a0ac5e9a2e082d37f874daaf40fedd4833ca334cea0eb1868763eadd0eae8aa2c4a34b0ae6e871252291585d7e2ef11d3e0aef58447b2bf3117981db2292e1df34a159e631575f4942585d8c0df4bae8f90de0725e07dfbee3ce33b7ea5a81d93d64afc5e9276a846bda1ee44e176871aea1fc3ccdfdf9a0902f469330c3fda8bc3e1835464127c5f6c3ea597b8a9d4a86cee83a3f6741117893a3a9742e9b54b72f7f017979134640735672ad5cf68e05ab3935fcd7f4a68478531d53684857e80c2738a5e9a91cdc725252a30f04b03bedc69eae2da6887dfd38eab537ce2f01b1ed68a28ec61365df5de976970983e55c4a9bbaf0a06f371f691a8f0e76c7ba4f8ac82889cd262a7baf6a753598b15999466957799af6b86d6c6976662c3648623aa3ea4061baf5ae3e6b3022367405f8a773c5789f3b38e459bec2b8d4c78dfa11d9dbb642c824905e3f88817adc48c4468b18a67671550bf9adb1c4cfc55c282c12ed9b09e4af2083e81e91a4959eb746c5019b087690eb7bd6b05ee9cb3c928da52121245de083cc8fe66823ed3d89d9fa11d7923d7fa6ea4a182a79367bf2fe279370d7453c2a0d24663d5f8eba74afa994656e50909cba6a11bde747773d4541043fa0c7c159702d5d65c16b1fd0eb5b73fa717676958971b102610d779d4ecea07eadd23cb8f11e00ae78bfb323c565cdf14640931e30ee67c4368c1ab7eaef3a3865d8c303066d9882b3241554fffd70a3553023b39638bdd881fc55cca09ea55736c518d4dfd519bc9f018d290348835f06eea85984fba211a6a4b11134f4117d0e848f44afbc675e6af1cdda3dac026adb973a49d379380744767f1d4369001e5d68e39c962b4d4d67025c5eaca270d7879f0b4245f5029f28523e0dc628c7f03da68ba20fab0468a1d2c386206cf8b9724bfffffa11274e9d5daf0589c42ae187f46861241e43b83f524a051bd94c585cff5716ab637291e910c5a28735643a52b56b6cb9431bd104a360f164aa9f4434f54b444df935a7fe3af1e13b22e42d801b48167a3ca76c205901eb86927d51ca1212e0a648b074c9682fbf74a9d169d565071d66423aead2a339176875f98c5bd85abb4b9773ced3419ab11ec3e2cfb40b97f6e35b76a29bcdda27099a8df880b1150b0e361e82a2669379033fbff953bfd6963243308b788dd010a0b132b54c93e424d1dad11a3645a86fe3ff1beb5c197a23416bf173ad14ed848712f78782ea43e63ed89ee05e6b110497c6415bba43afda65d8ebcdb309af509ede742ec0d3330a068eaf2023192f02dc3f44b7d3e290156d3910481f112a3f9b6ca4017881633d34d6a13ca35d812f1700bfcccf2f2e21a6fc31d2e88c26a6d9b9bf44207197fca3c34fae97f1a662d0d7f0c4efd298c330ce2c77c248904178df04694c3a930b91a8367fab83f27f9028a87772417b4c6259c4a09534793b12cb1f71fd9c35b9c606e1e6971c997fe6515a7d37ac75c3847fc8f88d8f50ac6ce228283264c9273455f420f201ddb6e408f2d475f710e7cddfa84088430e0c83ba3ad4bbaf3db17a0b02c4f6f91dcdc9f67a4f40cb7e64ba646dc6de0297bcd01b8512301046fe2258d882618ff39c8ef3a73f5cb8ffb002322d528b7c48a563391c5a91fbfa9aeb881f953673cab3eb69bd66496fc194ac6963d5e40715c07813aeba28080aae1989076424e028984d07eb70ba2bcd1b3ac71a07176ec03f2097c4f11833af49e87ac39419ab4db4aa1bd74095901b3bf22f20f914bef8230769eb0c2be2870b0a0a4625dfc7623e246aa5a821586eb8d390a2c2a99f7147456b3729a468ef435e6a405a948e41889022f9ad7dd1a0f498183d825d3348d9150f9a0ee3eee5831909522cef64c26eba4db4cef52e2290b03b65a6f0d685732d482aea397e5a58121fbebfea84ae7551f932b9d95f0cd18f28b8714047a20870de5dafef6aefe265d31bc7119456aa1cf76bdfd6b2da47da0847554ceecc3030a6c33b5997528e4fe7c9036780cc754cdb3b52e5a86fa9135d61f0940ee36db9c9d665e0893ddcfe71d03d3f0b7d1109ef9ddeee35c7cd58f83fc1f882acc38a99aa90a8e163c779f1cb938eb8eff2a7075df85825d28d768f66eb87cf6937a86a1babb5ea021d269775edc4fd3a5f8fd928d2decf81de734bff9ce5e5ed2a7dace1b698e2038a9b182ab947a7f147032bcf6fbb4f378be307a235167d9d46054a944c4f550a13b689b2ea3c60aaad88559f682c336fd11c70764609624da5abea892c1954a07d3a4c5121f2c8e95131eda5726af65e83410f544dc550ad2b2d70226c56b1e31af684533ce63267a067b03a5fa9a883d524ede9f098c2c5fea28ced50b81349c8b1b775cb7baea4f2880f6a2597ec912b3b9a8956ee96713866a23183f33ec0373049d4afbb78ead371e14f13640f285c837dd68b3c59b370031ac462dacf62c8c697ce1b426ddd2e7189018bfd68f8fc2ca91817906249abc98e745a41638e10ca4b0336767465c56932b4f6e401c80f3bb90f3c87b6b6cf0be098c19591eb09ae2dd5a27080b4b8471d4f7d7414767d5f87de5285061c8603990f85cdce0f51b08c1ed412eddc06a5280d039bae723e730a5d2a305be9661224d3073d7fd081cee19a4299979cb8b0e0e628788fd865d1141438349929dff5f1012a2384907b32180e20e5c4d4d08dbf4b53c7db27f7823b92f66fae137c38093ef536db7caf7a693bfa85e70cd0eca1ed54583e92c7dfeabeb24cb86a8a9b15e755897bbf4f4ab2a5ea728c759d7bc981f32ea74c343583f9f033190758343afd1d42cb03a29728ebf210faa338463232298361d9fa35c7d13357de3de897f241376a9fd90efca06201298930f577b1c2197db9444e83b9ade5f202183de8a9bbdfa75e5b8777a682e2b3d4cb1f141aadc6562fdc1da148567a5615be6950b19cf8cefa69b5f53a3cf5b38e5c83b537a81211919366f4cac28d94412d1fcd81592d72196ff8e460adc6a2681a46f9e208b256c7fad159ac9943e74fd2b27a6a46c8ac6d316cb82079b8f9a4ca5ab4151da9539b332d423bb25d8e08eff1b37250f0f498adbd572619b78299a253b088f3e5a88b77050062c10ad1decae70ed0285e09f4308a01ad4aced9f61a53d17be70f792b6ad475d535487a5be8284ff5c39951687d0411ab96bfb8e073c875ea45d904673894b7602de62109dc33b7960471cf6da48e100613b515011222f8e598d01c21d2d7191dee29a7011627d378cdab2a94e7fdb4e71324f498cb0bbf3f0370949f0ed09a465a62f4f64f767d88543cca617adc8a4e874c586afbe9348b5951e0a8cf84bda5d5e920dedd6658b2f2fb3a2d776cd070e740f58dc94e8b196853ec21edd113d8b19d966ae0b49bb0a1a95a6f2067773a40dd3656f183f31681567326804ac809ad797c57c8d9bcef327aa297c9d72a308a7ff608a1dc35e6c2938df38d8d3db4b5fb16ea773a601b86c8eb425a87a0342ae111defa84a0a0fde144355eecfa7323b7e71cc353004eae3f48ff01bd90419c04c99e2217a1803d1933a6a71114d451aea169a08b8fd2c5f462a2a8512e5513b28f348381fa1f0fa731e6227221d24853d7d0431af2550f228902cac41237f5195bf50ec6a063d6bc5c8476b302a042d74b812d4b316d95f582dba8697b009e4f12ec231f35948856d609cd21c2923e7c6c41b8eccda152f5936119cc956669746a714fbe1d0261b73cb6ec27470d19e62993f3cb90479430d41b6c48da15a4976981ea4c6ac9a4ee990e74457f837f182140d127be12bab170f4e48204df8c36798acadb4b0dbc841a3f1c0923ab831479da02b9ba70bc6e83b45a785e6e4352858fb54c462d5c2f5a27a11a466fed93822a2af09bb7e0246b6fff73179354f231b039a224853d22cc520189364c1e2b67b149149fb94d28b66b5e6e04513271532bc9be8ce92a6446b89dfcc71c9ed328d188af2a531e18efd9aa28e8c92001639d53792163c96a0a125ca822a7d563100a302cdbf6551b1070aff09b91dcadf57c02f1f50ce88517412d4e06c4b4470d1cda4ad539ca7c0cefb7fb178df9056464285b2cf75bbf3894068fca9d17e2cbbb47941efad78832a31fa6476afddbcfd5dce1587d60b1297e49068304baebbc60fe8a8dc6f33af8c6ee5e764b3a13e3ce71715c1a23452e82346ce0219263fd1f43103f8b34cfe29debc2bdcd31330cdafdebb852a31e4c0d0019e6e05e36ef255ca65eeef9f0878090019727db1e9570304c109870d9b18e92c79ac16d1defb87edd95789167ae10522d2bdce3accb115ded55c96a0be802ead0492a7bf8346a4fa116e56725a1b9d216f8ed3db0e6fac942894b6cf13bbc493e157def8770f197e3eda5de62afbaac6b9c605fa188aed34240f6c3b9fee357c384aa0d00ac4ed4ba3865f608eaf283d5ddfe500e28f04085f748d669a64abd8f0ba0b2295f17d7f7e0d2ad8a894e45322b636f283d8c1f0c7f21be6905e5124ca5b5b91abaff7a485e533eef37c47eaddbbfad1c1de7a2fdfcb3bd47d538f6cd9707999c9a129be54a9ca062453f403ce1893671408ac4747ed5767f7c2ad3c476482732d927e65a8f959d2a3a8f7dd26111ac212af1f7e0d7b3165504ef6320310e6f822d10d72252d5676e9f75a439c8017c4a78b394d85f1ddbf15fcf8cc7433162806c2ee48812123f090a8d1d831db465c69e1a4cfd15417c65df6668004f0e892d685406d9187be9ccad45ab218c5c5320f0153a36a25e463d55ce82055e2ca70208d40643a0475621c1215388b4f2d29d88a93d7a6a1128e0c98223a8161e1f4a936ce9fdf13131694d33fb0b86f7ecd224e0ab9c7fb8b450102bb0d8dec9f9317c4afd1607cb4fa4162e72ccd868303a6a6778548d2217a4a43dca935a45d310d05b863cdd475a148821b568a76bf2861b7d9cf92b6a6f1d23ac125993dccbbe119c7fc821ad84cbf9bd57386cf7ae49ff97e6a741bcb5564409f8a89540d5451068e3e2c93997dab8c150b78e80b3e5f48ba4810a02c6d661342a70b1e53dd56caba6523b515e2c3193a9f72d2843d2cc26226385a6cfdd65f0768bbf0dd1bfc7db16b56a83761979bb852dd6a1b14cde6d51426b682e23ef5b30ab84991741702b80d579dadb648d53d72b328f4d228ed19649da107be1ad17d3fdf181af095f7d41f07005ed01423efe0379c088d493824680e09f1364f66dd08e89706f6cf1460dae0bd863025de417a48872d16786e8014f0516c6c9ef0093e101e60d1aee21bb16de53ba5ebfcfca9e450df4cf1657ed50d9262a2e875e0e8138ae0b6a969febfe487810d6a758ede6b4ddf262828f57908e230795e7055157b34d408ef1af9b1881450005b7f12799bc487cc0408201e408e57516425d3fe057a2d650190e9e964e7b03d31c8c706904ed297a79c08c46659165305b9e1f3effc9fa171fb0a7313652630c06cb9a775166c067ccc79370b627452bd4f669b90786eee4ebc0c1072b87acb20a14bab70d2a6dfa3ddcfa2e9dc9f016c746133b06e8f7a04c64d807961490e51f4de8a1aa228a31196f27f4ad3392495fc18538d00021c412749fd724d61a6f1c63332ea8651ce8e085bed6850dedff8643bea03864d376565856b6b815ceffee3e1e90ffaa81aad988922e8b5b5fcef4ec39b4148592126cae194b66c27edd421946a614ac9482a08eddf2399ac610430c902192002741cc33f5491770fef460aa971815d5e4ea706213aec1591ca89e9f694729ed600d300fccba63dee126b69543ae57f9962e3645502cb6808ebf36d495001a4c7824b8db67115aa3647c4ffa2a57753f443a0d604437bca7def36849c85b5a1b2deac569dd83a3b0e2c66e32fcfd0453f19ddfef417b1a298fe82293dbf8f1923e6007e9a02f113cd11cc7a2218493dbe509c8c7a715a16f012822bb82429f3061b98d57a07e3268f413ea21e5d99b4fe812fed56d89b041d92e420efec1bbef51cdc1321a1de1b4ce29aa1ed64822d52320e0a4318079ddf74230f929db67e39b29287131ef256dc4d600ddf9e6bb5907ed4bac1478374bef38907970b9a8a57f85daa3a7c9e6d330613405a5bf87608ef744c8a7c0ca83035607c6fd1c50df41d35c1d3c40ab01bb14c3012065e9feb86b8c74873fecaffbd7092f85f5e5c57e1cde2b72a60dede0227da67f62ab9d0045b3a3d01281e6f09856066a59a3353d371ce52a45a1a4890244cde40096d26f933d38004c5df5b7e25fa11b8dddc4a30187b18ea2a6ca84d34cf61ff5ec60668111581534c633f08b8f37fa16faf56428eb6259556fb582b456c5be7506ce5a3d19ec43f6cc5697e419304da8bdfa372daf8fcc0089f421d5ffc0681c1fc37718de9081ff5f3204b34bc3e84aad09f7fa759bd9c0d29037c99560b9a307710a8a29b251a53e62a417157c9c71c0c1d468cca51d03b9f51c5763bcb05e2e52f19372814a33f43da085d85cd7ea4abde2357e5d5a614e32484a1d497353bd2b8dfcb3653a9633d87648660bd10409d33eb27b6e51adb2b8d459805dc74daff73431062f4b056efcde442bfc159ba713e5e6ec848112bd8453d1f57b6422e7844dfb9eb9ee4032317795eb0e9251a13dabc55c80d370c48bea8088d31f68136bc7e1ddbc21f5e2dccea4898267ecae494da99762c3deb384824294b4f8d9ba7bdf17f5d619bd3add91879e60aececdd2da236491cd84e55ddea3b01d3ecce9e06ca793c3383cf163bd533fb890f8abed9a51d3bad1cc9699fd23487bb84caf4c888510e5f1232d790568839a976cce9695d29e86480e60e9f98ca2e7eac26855a179978fbb5cf9d35c09d89f5a6597c1535b801f1dd83667784a1a5b271743419a3ea8fe7a89bb6e1d8693ca1750d3474c77f1756d3baa819560204783b10c951b0a0d2ad6db23bb5809897879bd2e1798d806971d3d1c61a94effb7736ad7bf1fe1168d32a08216d1be6d9e184b51079b1a5ac70c68dc42104869bdc0e416137da1e88eb8055893955aab9fa0d364b855ab6352d6a2b56a54369c303100ebd30c5e0a028abeed97dc501498b34e5b24ce0249995a32c9dacda26a2d225d06bf62a10cf67763ce3767213e59fe39ddc168b22bb046ccf2de7aa668868aa81fd484c546097e12a4c4c70907dbec9599b08e1d9062a53898883aeedd7a98b8f248f055f9ffe45a43de8d0d236c89c19a054211121c260e47b32bbf085a5fe7afc5fef6146f8e71d22f376993604824baf867ddbe2c1dd491fa5f41b49736227031f9bad0caf6f15c3613a0e938eb4a15b9469ecc02c549c2b7908a95959af747a6d725bfbc605788184358c4243cd16245205586359970e9175e5179c3d077d52a7b8581729e0f7d17b7cf193591ae27ef3bbb1517fde9df1ce5543431123a7a45fdf2273b6ab44ce076ffd4ced7f8661a886d45f7afa32be6401b1e9c0e68d8d5174191126cc89d415fb7ccb6a8764e7ad21b52e09511afdbfd064750a86de6f16899dbe80a630d2c2b21749204726c68dd1d1a264a8ff9887f42a0cbf6e798b3f831b2520bafab3e514452fc99a12883addf3f06a30f574a8204016da12fd00fb524ec79ab247f9ddd857fd41bb62a52e15a85a552303f237c065af18d9299de9d34f8ccef424e667a86cb5d26e54068ce60057935041d37ef90279d8e77db9df238923d465ec9a451d4ad49c94d34b5d1af52132cd2879c86b6e0e09d88fdd4c79b983a7e3f1dc0c1bde04551a3a0431aa401ef23dc6923902f87880dad4aa23dc399b735c5a2863f92d8e69d9b4a883b27931221111cb0f8e28f1c9cc08baa1042d406010aa894399a829327f94bb9d98d1a420ea7f812453cb1086a0dde1e60349ecfea9b8ce464125a4c5a2f2b3f5fae54ea2def977477ae7243a5a3c1afb73608bb4b64607d14ff50a059048660d53ec71d55f072aba0b830999048b057f8954a76e46eb4a1fb01629185eca4bd7ea4c4da27cda8a786c6a7745d28c732164981e8fc8b49d9fc41d244ae594ddc6e828bddbd6ec452ebfa72ea25def11e02dd39ab30614a72954b298e1143bf409f9b3952253b51d242a786fbe655fafee859a783c1491f22eb4798579129390d7aa5e51b861c467c19a62bb1086b44ed4798618aceace778bac4921b7d81041bb386aebd5c8bdf2bf163aaf4566278f0f17a6b276c0ccf355ff130e0ffd58da2adada8b65c36bf529d2cdaca694b798dbddb2b42e8fd6f8eb4179747b55db8e841e78f3fa309beb4cf5bc21d23d35ff2c3ce498b46854c40fe60ed3e2526e7642659e33f8db99c91b027f46d76bd14a327efabd85ca9b8c230f0f381000ae12c7bd02b6a0437d85cc7285ef0b49f17a4cf0eb735ac8f32b846944e3c91f947528d6e8651be710c6743587c25ef141092798b32cb5425730cb944c2cbcfb98bca1b1133486e205cc5d53a20d27fc59ddf9de35ceb405a8485508c624650e059e3bf40bae7e85e570ef5da31bdac6cd3a9fa64f117fbce10abd343ef777f58b2c7cadfc673f5ca79d597e2afe3d222b2ccf31e0b34fe67e6ddf8f517ef22870fed5a915874a342d498d548cbee214c7a037d90c3de8300e49c62b3500b049354f0f3c3bfe561dbb68fb0d8d548495a28b41fae62cc153aa194046dbec7806e1156dd7893aae5aef4a5c9be3baa29da92fffea35869d5c7ed8665a1748bc2721ed9860e65e32d63df71482eab890b4ea8e5950011395829faf2449e66d66c2bf166501544aa8659c317d6b9ab137e202ba0f5088554a4f36bd576282eab261ece086ca3221459138e492e42412fdd72417af58a65ba479bc5acc5bd1a929254ed9164b43b80259037c4e2f9182e3aadc959428f6e2ca0081da2f4054b5d44ba784c06190e81170367788166092957c4e647ff4f981638e5ae11410498b11d2ac0e0c2206112b81dfebe057f79e0b80d9544e6285492b3640d80d1b533a71aa0e11c6c2922cf59005bfcb0c0e667b255d9aa31a3d8c8f9ef612d13213c9616e0c67f5f7d25aa13efe8f97a652c86129978d1e3ce6d7b0b9ea2087098d1dc8dc0e02f3a7c5cfff8578eaea64f754e61df41bf774e44721580858a74b45cdc6c262d31078396401efd00d2d66608e59d245db467c8fcfc8761ebe238cf998f312319e2ff9f3d575c7e22100ecff7304a1ab5979232d06d015d5906b1e82dad6fcc7dcbe66e4d0fce011d81a766b700605e014fc38140f5d4060f9458fe618503509006ff174073a43c0e853cfd24f99c2b8a5e5a7a8dd26e481088790e135235d029b952c62c040b23b7ff709d4112bc52c94f9652a38b51515852bb24b386a8277b05915a90bf1e0370e873c4a2a02d218e8e0b94b9879ef06905a3a34d0c6dc4ccd549446ba11acf9c1008087ddcee77926d8c048a146fd12ed2b770b494d4f02d384928caca3569725ba305965adde2b4b011f74ffd4248c1ad411ff53ade707ea707b70861a94717d13e7863e6533ff67deb462c91340f6390f29c1db16edd386183064cd9ee5100252252a7d300dca921181b2b7cb059efee3a128e21706847c496155cc2aa7e16ef3d621825dd1e6e37bba2518d846dc18d01f8996565f622519bf2074c0c388e08628e81e8b33f81a4a17d5a3cea374dda3b4707f15c4115734f38adac72d9af245d8af7081faeda8bb0b3086b8487243941b9741c00366bf85203b027b1063ac55946642c9209f1149602ef2b815d044c90050e6a85eb11561058aa4c3a74016796193ab7fe616ff8f5f757ff0ccbf5c765a54221db0636feade2fa9212b4a564dd526e514b4248da9bc84725d8b208e308b55fc72d0922c24314828611fb1c61d45627c05ae4de6e018408d93b051f11bb10a611b5b446b17fc2b93e05692c56e27991bc5e51362cf1d0eb15e585a20dda8269d5fb57eb31eae15311d350b4446a39fc1998290d437972df862576f2c47f161564a5bb9d3cf16ecadaec19975188829a74fbcff2fdb03e14edeb509450ac892ca7ac55b2335a952d12c509023d0048aabb39850ca1250408429ce8aef653362cf1749c8ff6f5bbf19f65212904d941772be956102dddfd4a633a5d2d46c1276d5842d1ac28665c698e284eda14f83310539a6e05290ae202d206101a0079019030802400c80dddbd23e430743c3c3c393c3d4ec3278a13fcfca9689e54f47ee831ebaed3e1dcf8677a695e74e45f9b5ca7c3e1fc1bbeeb74383d374dae3324e430741e9437621af5656b9f3e17c5094ec7b59f721b9638d79fe59268284cba2f24f4a5943f029f09beff758a4338592c6f84c06782bd2121f09978d956efda9837858f327e190d314871a537573d994b72862752b6f67a9f67c650787c42283e3f4e24a87452f561f539c050d3ebf57a8d6055502924880f52983482523d560475aba74cea564f4e164b9cafd7c26e3cd38ca3ba4a5443b77878449ce9f8b45a5a295197a9877f6db5331a9eb39c6ef1a4b0e3811db1a13cf13c777c7428e8a874974bebe1b59e239265e89366ea39f7a9beca2a9db3aba1f3a10386ad987ede4fcdfcf92cd3a9996be124ea964e4c4749ce1072b43494279e9313d26ac9f26136e778ce9df86d9803e628e5e4e4fa38ba9533030d3f5a30979316b34868480287f5a15a340069284f727eb8f1430a284f3c630b7a8e93271dc625266dc61e7ec65f4af9fb4d7ec4ece816ce173851e0283594277e9444fbeab7b4323a5aeb78d2a6877396a45b373118d2ad1b296ea27cb8d1509e78d51c3d479c6506a7e764b1c4e1e79785a5dfcff3afcc31edbae5e38aeece47141f26743511cfd90a6660c00c524e9e74a34fbfd6419ae76873392b0bdd9a210619c668284f6495d626e94e9e7438df084a85f5a13e97558acbfa39666feabc4f73fc9fa4bb57e8960c52c890bba13cc999e13973274fc879b3d739d2298250323cf9744b069f31a020062a31dc74f7e13c7ef29c30c9736ebebf659ed3659552cd99d732568633191d897ca2388d3e9fb5f41af4e8160c1d8041cc79519ca4e784d49d3ce94471823ea930adf3061860d87a3ca087548f189b0a74f7926ed97cdd0de58987d4739c3ce9c20fdf5a99d744d884d94b3aa6f5a9eee73aeb7d2a2b737196752e79173e49da1bd64418c5d892feb38c4b7b5f566788934bfb23cd36fbb5f492e1fc3bbd52bfa965548769a573fcb026e2d252aabfa4d7608ec12992f7e9e712e68fbd76bf94e2e167f0c9976ed9d4e06a7477cc7a6dd21cd31c3c69e15fdad32dbfa2bbbbfa0ff3a79a33c7515ee5dedddd8fc54a183849ec31eb53e0147d6272ceee3b7957a9e3d8db7d476ffc4b8ca9c593e67f77baf5c2190fd6bf1ffbbbd4ad17b2747787a7087ee836cfc03a75fe1a75b78f6ebdf075773f8b348683ba175ab93e16ea960b5d74be4f55e9f7f174cb852c1d9e1adddaec78ce94bae542d0b5311aa3b97e48bdbad02d175add9dacd26b634ddd8dd4ad16b6e8c2cf7fc92faa05265a40ea70c29f65fc97ac7a7f58a69dacfb9bfa5454d642eb2b1defe70ffd61d847148f2dbabb3b5c4ec773e6b570fe15a767ea0f568a9d3aa65ea45b3caa6a6963feb09967582d89ff5e0bfa1375b753b7787857ad0d31a5790d4714e78d579af56cebfd4a63a18bee6e0ab422be8f4b17459af1c5e5041fe6e1675beb04a7402bd6d27f16c5025597ff47cfb65e9b27cdb4867492e18d12aab2454343a2388d9e5eaf21198d556b846b508ea74709098da0141da9d2d010ce8dd0084a0d8da09450931194f2f929878886946816cba5f0990855d9a28c3f5441062a64e970a66eb38775d29f659ba730d10e2bbabba95b3b7468756b07530a6e74f797e20f31acc45e13f39dfe349b1dbfacce19b86424e5b53aef94fd755c7aedbeac5ad16dfd4b4b29ff944200ba5b48b752b84147b75228eaeea76ea1a04677385f4b9225f6cf75baf061f482f8439755fa30c73466ef2ce709d25a8ea305fd61778a25e853146dfee9160a3014604ef8c1094e9c4034d3ad13804c300348b74cd8d2dd5da61eb3fee3478b7f10a996da5c13f1a4d57e645b7f387e1b3aa633b18c61fc20586227f21792a826a6eec339566b6bf83f35f3387d2c475a35c79f658c5fa4b35ced6772fc9ca7e34cbdd2877d5573b44c5d4d1427cd779235b15abfd66be2e717c9d1821e82fec9f0f8f9fd59fe19cd6535acd4c3ffb03ed57b25ea3cc773c459a73f92eebea15b259c20a65b2584a004b2841d78cec05b924b465239b53a3d463d47e7b31dffea7453985ecff3615e9ba328529a576b7f963da7ce59a6d78e1e4bf2cefbfcdad84c56dafa6eb393a5e7e4e816094274f7ec16093732748b84956b4b7f588a60a598d218cdb6faf4f04edab5b19895d1bf4f65b1ff2cdf8fe13a6f5477c374cbd5d3dd50dd6ac9a0bbbd5bad0d74f754b75a50ad5777c3baa5630c1d3f7437d82d1d2f74b70dddcaa1821c5474b754b77238757754b770b871d42d1c58745e9be40ca4339a759b2b7de974feb0da5cf2ee3f56b3d9c3c7a5d7c0faf796a0ff2c8f9fa9677c69ac3ecc6d769dcee7274c02893eafd363d689fcf5d5eea4208d7d7dd8e73add4d8f94cdee61fd0f07a7eb6e9c3c27d7bfd3e9c647eaf387794d142748c95a7651a44dbc9be5aacfd51ef9ebcbf8c3cf75ba2523a912fcaaf7b04edabc61cc9213fcaf8ea7d79f9a5914674ef8b52c67d9c39052d94b62eaf83fe6d7c63cd3918ade7de367ea79ffb12f66fdda0c3e957ff8a3fee11c1d53ff90e26a3dd71f6b93f4ff245da57366b3fb686fcc717e8ca7ff68b1e76bc9173faabb99ba85e34877abd02d1c3e5a387c74b74eb76adae86e26ddaa91a2bb7b1136310ddde66b3d4756a958ced887feb3287f7dde0856790fabcdf1739d2e5bfbe40ff38ccb257f7d95cae8b59feb7438a563ea997c109c5e275869c61ffaccf5c1bf9eb11dfd67d963d46799d23cfcd082f5f39ce59fe51baf96e2fb54be6424e51f9bd8a7e787e26638a5eef6ba550343e729a354f34b7152f9f7d5327d3ebd5aff706ec87969b57cbdaaa5996cfa3c7c519ce0068ba17d755952a53ec9c9293254c471aa427a9363aff47ae5998c3edda61c7b2577f7fa6407af0aa9f7b2f0bd2970deec40e0c2032e14b8526428f6a20b1045843cd7d2824e83d717bd3c93d1eb85a25d55a144b398bc889171e8458a38ce4d7db1032f5ee2f1a117ba592828a15b3155f487b67a2d93e377f78f6ec55475fbeb430bfa8bb03903e7df5a7af8f7737d7f89b3decf951211801ed789898fbd48119f752f0b7f4a773be9164c168d6ff7a1ad3bff37c37670b534832f8a16dcf989853e4133d603e4f33383c4603d41c02140427a80fc00f9c07ac009c680262c28c6c33377c08ccbbb8343549211911391910b795548fd15be4867ec3ec6b3fbf512e7782d53f8599c483fd25ccbeb91b06bef45f26219daa59785f416855f694da2b5304f56e92d432fa493f4fe635ed824cf64f4695eae4fe25abedcee8e597b9d70381fe9f5fa6b412fdb704e8996f448583824043e93a1a052087c263e3fa50b026cac26cd3b9d70a57306ce3b498f84e1703e92cf4f592dcd145bd2fb7c2d39522f577d9de18914cecff88bbc8c1f36c31369dee934c373e685f3674c53a0158beec3c6b27a53a015615e9e2c21669e475fa7d2e799a18e7ebc34562d889f96d4ea5cb2362aa4e2a4aa49e18bf3a9f64ac08ff24f24ac26e1af530987b5b4b05c36e579bfbe8c8a3ef8374fb19697aca517fe7d2a2a7ee8653c454f9cd9e65ac61f8ad6abd4c3237e7a737def7e6d8a7fbdf0c33b697f6b19d6af54f6b02c96f89f66609e24a6474c2f9b18ffd283d5d630e9eb540aa9f7758a1fda2559a579de279b408a6751779bd0dd1de8ee26dde2bcf1ed429196309eeea7f3d1b1b14a755e9c20def9f109027f082c1c32c44708087e8fce68c10e56ce3295d56ec654f677c7caee0477c4095a71e7e27227fc2aa3184fcfb6fa2c4fa7fbe17ca44ab375aa2e9981798e982e656b9f5e36afcd5043e19324bd19bf463c6942dd8da33b2668334aa15b9bd7dd27746bd3d2dd998a24f62fcfafbbb76e6d45dd8d42b7b69cee26a15b1b55d58795ba38a9ecf8b708be5d68c71df0a9701cd31baf2fba903fcc43b1b433ec38dd2dd3cd85ddbda35b1b0bdf2e8f31aeafbdf7bd4e0fbfde32fff56a699eb9fef8223952cf74deecb24a739ee3b5319fdc4b77f3e8565775b7ab5b9d4477d3ac18bb4f65bd962938c909e2db814fe5d1e6dd012fde01ad28ce9dda9d1746c5ee7659b1ba9b3372450515a8400d32296c5105ce05bca0e214830d44c5be0092831a11c98dcd0d82c02881d6b5c1041a4ca21052c804f5c079a2078c125418a25b91f828062351b000400131298871c11834bd85152b44bd8a9101169ade1183c386739a6d2bc2518507ce637a5829aaa97119981996cfe0b0e1aeb0bcc6379b2a32be713238bc072b364118295af98ccd152c5bd1ca833052c462390e8f5af9b615d1d8e0c0e133348e652b9ab952734317c95ca9711cbed95499f14da647152ba2667cf32a34ce15cdd0d8e06021098cbf4cc1f498a2c6f94b8f296a2b371283c3a68b686caed0788ccd151c1e8417cdf886a38795d5952a3cac7ca68795d5152c5e84c3573872c06153858795d3f4b0b272ee061c512be7b8191b2c5bd18ccbd860d98a649cc6e64a10468a661ccb5644e3343537b01c87e7b0ba22d3a487221c3daa7895991a9b2a34453336415821c5088f0db4a4f41b442f3da6a6a8713e458de52c5fb17003cb398f5a39711e63e3c4f2c6e1e42bee0503459b0d162cac2b58583d8288590151a1c203e72be761739653b182ca152c5ee4e2417891155132eee23cc4f88c770f2a4178914b0f2a3cbcf84c0f2c5eb472991e3cc4f47071981e3cbc6ceed263e5ed3cbc6c9586c71631cd830b1e1d68ad705c9c07095a2c77a12917671d5929a16916c739c7ead75601168bc5f26ddbb6a92d4a8c6f3da4d05089b2b90d3dbc388b0a15e72e79e52e7e64e5b272a162430f4431de63ca65caa587142a44323da6629c731767f55845e17c83b1998a61b156ab156bc562b158ab55fb8643890ece9b1a40d32bce8686c6a55d7adcccf2971e549cbfb80bcb46ca0ea229ae4713cdf490420569238a91b22292e91185e55b0f295488605e7ce52b9ba9f656a283888bd9382d6878788086660b620be20a162ba418d93c08560f2ba418215a796fd14407912c449268972692858812449870f9808dcb16ab2cadb37917dccde62ccca0b5f90a2e60ac805cb66c588cd136ed2bcec6250bae3dcb4a082ee8a2055910b9f8102c323e44c6dbb96e98971887e9215886bcc86c1ccc8ac5c2a2755828a3c539162e58ac805cb07038eded1d0334c60a68f3e6baddc5379724b81b9722b830a18c13ca78a2070c8c14ad8d68f55246bf24b125892438212e2b226c65b0ca681c10614b194f74d14347190c68456975d105e73a6630d345129c239d80861adca6650b0556442e3da250178fe9118524e266449caf10654a19445c8f282b24ee66731e0a6845d99ce06eaab89b242bee66732a4a339bb7cc8b96558c6fbe51605b697191a122251585068c1930886468bc20da1cc666052425a74d4a017dc3b98b102d64d3c2dd60a971ce8589178e63712c560f169410713d58e0bc0722e768ba00434b8bf318b81b1a3056389bd3d86c2eb502a229638543e3456f0aa02901d1e6db1944db16345db4cec6c51003d1c6e389d68c1aadb3398f245a9b4779d982686bee460d196e86091dcd7571e4c505c625c645c6a5cac54547100f05040955c9b4609a8d9766a35faa78d9b2e5654b172f55341a31dd458c90cb4bcccb964dcbf6c2da02f3b2650b11c769e15a672ca015c59585e31c05265e62666ab6319aeb112566d58ae9f1d223ca0b515e7065198388f323abcd9585a68c1e2830d13a1c0f0270393131313131354374d1822aba6841132d28e2841bd70e2bdc4d538c8c095b092ee7fc08091ea5b7206ab55e8eac5aadf626c9f4290352b4d2a44ca03240764375f7d82d0c08a1bb65646466b0131f6dc6a5918c8ccc0c0610d07d345bbfafc76970fce9d07c0a9c30c79836c19e1f0abf08d6309351246ba3c20f8942b129fc9fb824dde2f09fa4420319e84b234b0feb7bf6515eb2372a909266782279e3e7a4dacd158905bc689f9f10dfeebe3782559e0536264c846fb773adce0856ed8c60d54e50104c08181bb203030261130603d203ce9f9e190ec1afd7b5155052019ef65758e994e7f8ebb5c4c847f59b88020bbafbe5794c4d49504f489878486a207a6a8a82f2bc1709ba1b4ab720800309cc98b6b4a0f1f7f99da40e3982553b78076f29c016da16215b76babf8fcabfafc93b9c1f3f7c06523f028b34b41c80069e3782559e53b5f46577ce8c26040c2076c7baa71541687cbbfb99ee7c29e5430f7caafcb8889087746419b18a9a25b4a39b15d4ac9d66d95851035211578146ffb55596e4795a34a78506262045d31a3045f7d88aa057e59f953227ad159bc8cc747f67f822e89e671299992e533c61d3ffcec0fa3117e7a4ea4d8719b6ee6d691b92a3846e1d74b3c001355df5dd1d051195d2197b9a691592d595212727e8d1be6e417a4bc28034ba1b8a7b917c5e9f48407723408b13ddddc4d7dd07e86e03743713ddbd44772bd1dd05e8161555b4a8d042809a01743712dd9da5bb8fe86e01748b8a272d2a9c8ce8ee2258dd44743705ba5b4ab7a6e0628a1ba6c802df6ee75a708a25ba3b866e4d81bbbbc37ffd490b62af147c2acf9b9a4f7bbdc22731f84cc29f9adf84a7a7ebd1019f4a14e758974091239da2511549941f0ae9a1702992b7840a6b19fba75a5924ab34142dd2e72a244f617d10ffd17cd1485629b6a21111395ea4a7fa649311ed99c8f1226570861f3e51131faa1194da4a90428d0ed7272d9df7480239ba5b031668057477956e49d1d38d6f977f077be17fa533708e3a3bf8a968a623bda42833536db54d5e89a09890b6d6577b84896c584285b55712d2b084eaee59b7a2b04177cbc8c8cc7432323233e1679c1d7cedbdaf83773068439d4ae7b86369d761d0863b3b2f4ce63cbb81e2c47f1625232333134516dd8d67eda7bcfcb896362c711445babb3967b94e7a27957fb54651a2388dbaf0a53811afdda74262c312aafb072d5a40e1c4f83969b4b9ce9993e74141797c7c7e68f3294caafab04e9ac5727cbdf0ed6054b4618977763e8cfdc48082767ea610203c3c3306fbfff1010224a6f379de8c6125dec1b9b43b99ca74b494dd6eab03c0091a0cfd38ab900d4ba8a7a7270b5ad036391a41297204a5a0a08c483ac39e0325746d12519c46e2347abd665e2f0b7ad8ab1f8674e651727a247ebd62e2e3211b96d8c76766a8276906878f3dcfc3a5588e2538f47a0d815484954e244964a3c25adaa2d72b06c7d3e72d8984e62de7108ee7f8fc9437deb5516698c434752d2d7fb5e1fe084a651a25d749bbb6d2d1fb3c2fe8553afe38eb8fb37aa38dd5a4b0d2a9fc5320cdf83f86abe688e44558698fc24a953c59cb9e5735c7aa395e4befe79a94b11dbd3cbdaa3986d41bc1aa244f456543d5d29a24043e131f2aa111947abd7ea8c297328695ce999147001749720ea08c6e004c74e10f20684ec773002d2224c6804d1d24aa1a679c298cceec259108eaee30b54c59cec88245775ba62c06c882d4b5bc6e33a561ea4e302bc2c823d4e8aee5c57646fd082cba0b7fca87163c628a94552ad219cd8996ccf09c791f0a8005023842004e0430c4881c18e14538af8c2c7342a24cd26c44018c30d27d7646fb269933966138499abf9cef3fe67dfe1f230aab8555cdb108308ab0d29d08c381dd7858c3a79a339c791355440a446c414415226ebabbef739b3f6c54e9d2e7e18f23f530acb6a8061a7d5db5fe54f345effe6808371ae63550d6ad217618828710637477fe345baf2c7ccf93a8fb5bca66323a93555a6b79318d257538f8c663569c1f5221b47487afcd53142de838374e452fac16e685d413e2060b1bdd58c6c0824537a658b47c89ef3b61a96a2c4e5dc592aa26799d780916cf5f3b4a722cdd798634ac1374dac7dcdaa8009cd1dd0100220048dd1d762b08336ea6efb539e6393305cbf0ef9741f410c477f7772b88eefe3cd2def0fe2cdf3246da1be6d80440140070ea50b433fc7796417b49276dc6ee318baf3ce9d6951fae0475775ed51c3d7204ab3205a94856bd87a395f95359d8f4eec712cfb1562710460021f4830d7e88e287f107a5ee9a7caed3794d1c4129728edff7fac259f4b9ce92911436ea960f32a0ddf2a1f42186eeeebeda043ff4bc9a383547eff1987522efaa95d94bfafd8c67ec3ecd8a4ed4fd0c9c229d5493c456b0e8c63e72a0ac2cb11264a54777c7bad54316fd79ddccf3e8cb2f6ff84a711ef9cb753afa242eb1cd1e8a36c7acf730eb41051e76d0dd4658fc9a4bbb5369e7b46424857f2cf13f0dcdf0449ae1390b1f97d7defb797ab93ee661d6dd9d38cb90523d0f47a6ac5739a3ca960e46b14fa7a52724af4455aababb4b965e89aa7c5d95235dc5715925a6bba99441658beeeec25944a5aafbb3139527b3e8f5029feaf50a33f6486c73387fb6c3cd148a1d4f71c3698a1853ac7447c7d9146f4a4c7777352a3ebf6831cc7a6dd69dac16d4e1d26df6199eb35a4c775745c5b5310be555566aa8f218cd78284cc238333c913ce7867644e5032a045039a1cae98ec8e98889e8a9861aecfb726c5e30fc9a15c90f3de7c13a33aef4c35847e7f3efc3168bf33e957559a5e1e3d2f3c224ea95587079249fd1dd7df9a5143c7396eeeefc61116c8177c04e380973b78bcbc4cddd5d6df2d717e6fa54483a5cdea78a597f7d9febbc70579b9feb745fd37f8ef1245f94d50729d57da8a1212121f0994851a3fbfa53512c858aee4c27cd31953293c233a348229058745fed73ec21f935e9fd758a3603764696985eeb98ce281b6463ba73f74a6b1754b6cebac311679eb11bff6651754727abf4f19c8d63d4603e3dfca5b14a07e73f56a9cd37db1f2d1e837ac4d14d453338bd3cbd90fe7bb1a69ab8a3362546f7ced493a99728178862447777e21c69a5a33f4c3645c7b24ac3520469ace2dcbff1fb39d31156e23c67b9c8bbaf5374eb5856e985554b71cc56d922cfa37d9d791e25bd5ef7c912cf3c432fd34a8786923c274a48c8861ae8166d44add09b190a663fcc8268a51e4beaa8dc5eeb9586759616366760fe98db7c2d084e4c7d7a2d46ef3391794036ca5288b511a322e6f46c74932c6d2dcf99e4b33cdecf5e694d04e7256d2e6ff6896947b3758a7a7e5c5a1cbc76e7cd1476a7d7ea0c61612dc15a9bf3669cad2dfa29fe87eeeef31aac36973afc6399c589f4415d7e4c4335ba3b31dca216155ae97019252ae4117ac60f0b45eb987a14980538c309c33bc33a33d6a9b6e2e92118d4853f858ab0b0521a6ccbf7398c00feb23b45b7366a083fad9a4bafd7d0509250f8d76628fcd4c3f53dfc60b5f7ef8730da7cf2a650ec5159d2ab9ae3ccf3289c8f14ce9fb95b32929a40ba5b32929aaeaf8cb695668f3e2ce8c704c55f5ff6914bbea087f9a89f77d853a3bbddeb4204875eaf2821f09978b4af9e10f845b0961eb3d3698627d250ae3fdaa5d72b8a66ab0e0fd0a1091d8ca00cc103502600050645e7c9184fb8e8befcd8bb2f8675cefcbd6a3fffa9995faf25213dfa3c666fbc67c479d8971f2aaa367dd332ddf897ebdf9fd5a4ef0b2dbdef349623ad74e9abc1fc61e438337e58f651f19c4d7190d64926f97dd21facf63dfc294b55e98f340f0d85499e03e5394c482fbb330f31790e9290d35f324c82c2659967c69ef77f63a3bd319b9fb4dac9164ea884363bf9c9a18ceeee9eac6571569aa4ab167cec42ba958396ee0e07ffe730ebee8e742b07ef70aea55473f6304c47bf3686c3183836df780885c3143848757787b1156f2e2b7559a53947487209a3613ba3f9a411e1c063edab5b5267b414152d4e4c6fce546ad62f96e1cf404ce54452479a866e49c5e0aab9e4e1e3f0c759999a8cd1ddb49d265474d3199326b4d6f94b16fddf9847fb2a5a0bf3685f5faf28266a20800901981ce9ae36c5fb54762c319e9e4b18784b8bb3b577d6746b8903963c59f2438c281fa268885a41a5008a0ba80bc5c213174fe3534e370cee5dc697621ff77139ff4e51d1332e6d709c2f6fbe71f27fca3fd779679993f17cd1f3acfa5cbb4ff58ef3589cb19b1c3c675e1f7bf3456b75ba18252908d575607ecfc139f87eadce1a8cfc4b7e2d6d2d27fce936cabbfbb01c9cef4bfadd38fe3c67197b2fc2a6e735b1da09e6fa3770e0062b3710714ac3890aa72bdd7dd9dafb39a6389ff7e3bcb1efc6738e5f4bfb4a2f692f494ec7f992c4996dd4e73fcb168b531469177e1ed6793f8bd32986a6359a70d0944417da59fe110671ccb3cea9cb607933f65797eba479696bfe23cd320c1902c5c984620a82e9bb1ba85b4c1d0b96ac2c2d2dad94b6282540298bd291d20b4a4480a45b4a7e50c2440909368411a45b3638d1dd8d45476e6beddaf147afd475ba29cfb6babb38c3707acdf9f0fc714e5d4bf3efa9a8383df27fcafbc25a8a33e3f2e8be4c466fc6612d63fee4d1be7ad5be5eb467aa4dee2e8a34f630a721761df7ae9669954f5c9b34f1f3ea04bdbf25aeffb98efbeba92bbdaa8a38fc99935ca77b2897792ec94aef9336479c20cdf4829e6dc5b9fe58caee3c729deeda0cceef1327cd9566451fddfdfe6f92cffffb1bf3909652a868c3cc06a1eea29a9a9ebc0683d569d43d089bb0254fb85a3cff4e8156e9ffc6c2fb1fab3fc5de9807623a3e58a7388beed358d253ddc7ff14d22124a12a5b34cb982a654c456f8649f9a1c20fede8d9b096f60e85499e0355cbf4da592e8966723cc7e8f59a6458e79579b54cc559692cd371b4e09010f84cf083757af8b3a542daa2bbc3b59ff2913af691a95bec394f45c5c75e7b25485a3a27e90c239196092908530a5a8c2766426ad57eea2966ed256b7052832719429227924c493203922f904c4182d439f8c95af6da4f55ea38333c33f61baf8919fc4b71ec9d75fe5813c559e2f2c6c7cfb886f1df309c8e7d1c2539b5e0c31e0a3f1d5d71944477df74eb483ceae9ee19ba754463240223021881463c8a6ad0ddf72bada9f64a3e7f85f43ee99fe96d023b729d0fd75e49ae7aa6cf73be585398c424e77be170fe13eca88ac66e7048bdda4fbd5eb8f64a5eafa8cf89bcfb707a8c5ca7cb555f69aea567f063b1cf3eaecd73b4e0c370769b2751f7e1da4f7df8a6f653f83194386b54edda3cc33a476c6335c9c62abdf6def7667822bd5e51333c674548fd243967b5a9e82624cbd757d4ddf32f48445406396931748b680b5196f64ad4dd45dd22fa21d2ad236c7477c7e4da6b8d4471821409386fae4a72448bec96a4bd3f45a7da6aa45b47a4ba1b2da8536d753c67340f430ad212eac88e86d53782c5e3f917fc906645f167512d23491871ea9e961fe63fceea3f8b0222a414450abbef547b25435f8a93c987161caabd92da4f0d396068090cdd1af2298286774636f45cda221928a2a5fbc3e9c1e95611b1bb331d7feacef1afeb54fb5373492806424308591122bbdba65b424d4245447c406401448ae84e14cb9863fa377f13ef6af7a972c2fa64f7e1801f5ab0c7753a9ca7a2b83aa6af1788e9f87a59ea91f8732c8a13bcf10f07eaa6e9f397cd3daee3e5c75e9de0e7b1aa0feafb3eb4e02ccbea8bfe197dfef76734ff70a09c0637ba69fa5ca7fbd0824e7b222bbc4af0c2d2dddde72996a038c1794b10bc1fd6d271eda760252edde66cedd3f56fe23f7efcf8d155d1d85f12e73b33f63c67798ae27c0575b7ff2c36d4ad216a7477e4fc99631fb9fe58eda554f5bd26c2c6c79808f64d5e36498f596fa15b43ba6851a44a8648d1dd8d9fe94321198a022969f3e339737a3c6724be3f96b85a70e67934f30cf1cd014e5c5eeb7083f617cecdcb734171c305658cee86f2048adbfce4a65b1469cc231f632f97f6b1278a74caab31e18602edbae140bb6ec068d70d0cda75438476e194d02e1c15da85a3834209353dd3dd2281d62e128c68170952b48b840bb48b0412b48b0416b48b041cb48b041fb48b0436da55424c0c0c09355a6cd12d2dbee8961633e8961638e8961640e8ee9a1250d8414bbb76c0a25d3b90a05d3bb8a05d3bf0a05d54647ca8a0c20a2e9840860add2243866e91a1d42d32bc6e9151d52d3294e8161911e8161924e8161964748b0c36ba550609dd2a63a75b652c75ab0c1dba55c6edee9a1472c8b8a41c699714a57649c9a15d52a4b44b0a10ed928244bba43ca05d52ae6897142eda25650526d4b4b040d22d2c96ba85c5ec161663b7b0a8750b8b20ba858512ddad2305124e7025e169571223ed4a6243bb92cc762589d2ae2454da95e488762591e2258517a6b4eb0520daf58210ed7a418976bd604577d794b082eb8b6ad7f7b5ebb3edfa7e68d7f744bb3e0c74b7cb4c4d8e191c2e24d0dcd02e1926ed9281b54b466c974c0fed9221a25d320568970c14ed929940bb64b668970c09da25a38276c9d0a05d3269b44bc608ed9ae1da35b342bb6672da3503a45d334672e0a8a19991e92e8104574b478c1752313238d882c5121a6023033dc80c5d99693ac3bfda28ce065713026c56746f556c0e18c006ccd011e9bc4ec43a6c2c2fe8b8243d9b2bf542aaa56ea47e79a14867e0ebc3d11db68b8909f876ae25653cbdb982e3fc9bb13fbdb97b636153810a9c1b7cbb1f2a57141bdd6ddb15d54337be9d0fd5eb45b60b8a89137cb40b4acae582e281e38cee9e81798e4e5b0d9eaa7822c013d99fdf5fc2f564e4f57abd02700315546cab1b82bafb862dc993e29444b7d3c7d138c5506b3aa3fb05aea6aaeedea8d81ab0c3c5d4457d8cdff39ede0c446b179391ef612758aaa2f3974db5f48b969cf0d7125e9a4d28ae251abadb8a502254f879d29b27f94ff9a1b055cab83c0a9f66c38a44098a921874b7121faae65237d28cdfabf527adcd3c1d4fe74305c5e4ddd4df982c674261ef6a62b5f8fb70f9dd9965d58af3731c8bd90fe7fdd182b92cf2eeabe23e34e439d77384a084463a8322e79217f1276b3bb8bbaddff7217118dc664c8eb3ea3b9c692da3704d7a2a2a1291ff4a644c6495ce3f7201e70349053a0d1711306e60b0712131a11b5f7182b65bec1680104745f4743d3ae2741d21b98e84a8a8521ab9d1fe7a6a7a7a42e23636363bda657401230b1839e1324aa2ef7b77079722794bece5782e23d28b1429d2bde560d463c4a3fd65e966435114454ab88aa874671a7e919322a4a222aea21d38de8dfb2bc75f33afd47574370eed22aaa2bb63888ababbabcd5bce5b4ed7911d5c477068b096377b8e577b7f0aa654f7c323b88820691e2356ba69a6782c8ad3db969022035b888cd4f1a4d1180ded4884de6c69d56f0268ec35b1dee94f6561491f5aa6a2a3a737cac33a5f2fd8585ea3de7c701569e17b3fd32180d041084bdbfb53446ff2c2e212a281e747079f5a9d8e7fbcd39d5c449ce8f6d7bce59cb79caf23803d9d4ff7a3037e68419d215756606273810843c839bae00c5750113f38c06680250a90812424179006687600c48373f3c3c48749f7758a5ac2f95ea488df125c4d9c9b29eb61dae160a782e3790ebe99818ae7783598e775b8d224e19d20a647444980c400c8d7fdb5e1ebf539f93e8f59d089bcfb6a8ffced1468452a7b5a97e78cb6c4ffd23aef30e8986a620feb9c560c61763e9eb479ed0c93b362c7b029ce8c3d27e7c230cdf9319d653afe8cfc8e8e1e3e94ef73325aa8cf31c5e1b535c93b1153eb95c82fcd503e4cf17da7cf498ccec0f91eb30fab16747fb905f18350901c3519bd5e9e283ecd0914273953c7caf05351199177a1f834369396c82a25c95a51f84e325a646d1451b64c50d93259a6b02e71dd2875b78d910f7be2d7fcb2af63629d9e8ad6ff7acd99de3ba9cfc00952dd87f224a89ad0d729e6fa778b19583697c26a1daed61f366f49e4d726711146717dec93864b5cbf3eb633d02f2ef3bc9324a787f692fee3c7a47d91779834428fbce3810987820d160ac030460bd98e504198233f344d815609cf3c8f68c01105e989ab47015c3d8268f02f4c7ab216557b2576e2cfabf6bbf345d0717ed90cbcf3b1d7eeac1426c226b6187b267f0a7c2aff984df20efb788c6b3fe5e197f85a3a7b98cb2a7d0ad2d1560b7e14f60e5f1babbd92f008d75e89656272bd70a4bbb3bd4e2e1e136829601b02cc09dc0a2cbc24a047cf85155a70a3050db47085e7853f8582b37e122e1e2ae8ae1403fdfcf4505cc3b9eabd79cb99af5d1a2dd457cb14c544093997fe6f54918b474ce7c73628c20a4c6c4b74370f39331e69c6b59ff2320cbe0101b142a7e052e10b0cd5dd13f861f3c18a6b871b3d741b1b0fdd1dd39b946b074f774fb952e8c0ce0fd50e7831145353529411d3121b3c29a2256fa3d2bdedd0bd4de9de6a1bad7ba3da72f786bbb7dbbd49e9dec8eecd766fb57b1bb7a9ee2d4af746bbb759f726ebde625bd8bd81dbdcbc0dcae6a47bcb81b54935d5e7e5c75f37920b05a9ee62d6a8dbc885424ecff0140ae707b94ed8d23b9fe75623d51d86444cb4a73d93cb0436da3f6fb1356122ce4cc5129373f4ba2970c26a3fcbfe7d8e6b12ef3208e573f2b09ad8e1a9e45d4e2dd35a8ea3056f7230ed93581b952d130e93882c53f8d9325ddb85af97cb45e536fb14af8ddd2761dd4bae1615dd983a0dd556ef7eb654427a3a1e1d1d9776b508d0dd38ed6a4581c1f374da5759a51349035c5431829e80eb25470cbac0788a46efa48108d8e0010b70c2e57245bb72acc0cb8fc36a615e0dcc8fa797ebe74abd199e4848f722996a4242ce4b73e1b081bfc879696eb3119e4ef83fc9ad4b9ea06e10e94c4292f346e19f9a518fef87b5f0692d9c4b727d2822178d105c34b9cb9af739ac8f5d334d4bfe96f5a1c21761b32e49ca96a996c911c93fe170164159a6906695f0146895b265cabf942d13fe4f922d135e529346b0ca0beb6397cc0cddfdd22e19cff8431446b0caf33edbea7a21d2fed271b94cb95c965c2e352e17177c3b10d37107c474ac6ad70a0dbc33033fd732bd93dcf13caf483a91f06f19fbd0a76b05c60a8c6e7fbdd1ddcd556eaeb4e8f0e7173fac492f0cf0a1f3d2a493557b69fea385f20ec34aec33b0ce5bf492859225085a8f858fcb17272eac486897d0a5896631110420e0dc789876b59ff26c566fb096340b09d04ff7e61303a354ab33b4dd5b4ff7c6b3ed746f1d4e15ae2ea37bbed39ea99f70b514958a4c32e06aa5ee49fb746f449b4e376bc3d9d2db0a74c045b7dee011da5aa7ad56acc1fcaf0e1c105339cf0f6dfd5eaf0f656093ee8d86eeed8716478c1004b13b006a24d1dd6d842b4670eac6095f0737c6687c3b7204abe658999055ba15204bb5b44a119868225b83e758a6ad6aba956db53b0c9cc6a10d345a6d4060ce3c8f7476701b3bba2b9db2e9b896d78954cda5d72bca87bc6a8e4430a3fd25042244800855fe753a8eacd23a6f3630886084084de5feda5cc00613ddfe029f8a0db1db5fdd1b114340c110ae1882136ce8b0e1021b280cc108dd3bfe0a1f975d919016790d21d61a82549197876184358ab0061afd370eb50605d670a2bb49a3ee8e8110ce1002098470c51a6b0875db845e13a1d620a1fdfecd35e808816c7fe1fbf9c77927298a36e614861062ba7129e5f190500df645109cd8094268c316a215841df8763ae14b212245b4f47a011152facfb228fa781a116ca96296487ea8fbd932f198adc13cd471aca4443496f8f52261f3e62a247fcb2c8ad3e8f502e9fdfab225e4fcd90b7c1257e5a8d70b2be1030bf8c0097ff91045f4017c80e4839ceeb6b1a1317caba2c027a1a6c09f1975cbd20842396eab6e238d2b3c0d265a280da1c6b71bc1aa3476b4bf42eacd3b49a61e64d18446e3c118dd84073b74b7e7e5e96159f5f0edd0e0020d2aedafaf53f41c1d0f538732cbb409a6b3a8d70b562239e9ee9b6e1cba8546ab7f3a9f9e8e47a7d2ec85cdf09ced000da48db5d1a8a07b8a9446000cced8b283afeb33c1d47490bb33497ef876d8bb4f8234ff68c5b683629a27aed35e708e4ee4ab9a630c2ee43855738c6147ca8d481ff41d97f2f5962eb6a52d07afc17c5b825bf5c682eecea15b3928a1bb3bf0435be9cd69f4a01b06dd313863072c7c7a33109f8e470716ea3cbd796ba17be3b1b1d0b91cc3dfcec04113bedd2cd33b773069433a9dfe93544b3b6c3349c1498e5424c7f9b42f7c3c614e8e254c9663a1bcc3f7e9cf68dff739111c1a9c88ff701afc3fe6d11b2fe224cd5e7e91080e49f30d284ed02be29e5fbc3689efecd09c8ccbfb7d9f773598e7e09034dff8148a756ae29d221dabbdb14f9ce3ad96cafe7aad96a4d9279e1966dd66ffa8becf2fb5b60749b38bb3cc9752f5f0cfa5cfa62f53b11c89bc065dd2140ae5d485d38ab5498a73a4495d48bd06ef4251240a69cc3a3997bcb3d5478b432babb4739c0f572bced977ad6c8a31ff3cc3b10c5faf1a382f68c70ff18e5fea3f66d1a777f72b6d7a4db44c5fa752d2cbee54b2360a27dda75fa752ad28fc4f328baa4949ff50f971c8960927d5398bc2d72e8dd74645754b0667b4bf64800515edaf289c1732c861b70c5a32382283d74fa1b8b3d93d064674770c70447ded3e9505313dfad8845a5a03064374b7ce1114395ea4fa4a484491e888f64cd8e7670992f8547b2534cb14264ddd39decfb309395e248c3fa4971c41a90fad91d37d27b096b65622225c7b25617834f33c924d27ebf422496f948d0a97e0a7f7a9487e925cf52f9bb24a27d58bff849d329e4a1f5a232647a194f128e3a9941faa064a599a4ae4084a4d81562c32cad822652b421925c9f8c5eec136c34603c185052fc0b70beb4f811326b43d114348a906aee869b615ba7b0ac544b038a926c6b79be139abe5ebb50213daf334ea15d10a685361dbd18d69f65e0bbb254824fc70fe9d659debe3693e6150a182234ee253bd1269a3c438428ff626d1d119bd189da56004ed79fa97b5eaebebe5b55200450aacb4bf3c4f9c2f6b3f75d3ab03a420c7fd4af3bcfc18df0edfa7f74ed8eb358255289809c38d30d0082305ed2fd0cbf1fc8573fc45c3bf463f35a376701854fe0a43060c31c2078302feb2d91d6330a0c018d2b9cd0ee5f245eb8b2d7a636dab8ddb447182dd5be73a694f45656fe0ff18eeee2374b711dce8ee22fc386b77b741043686308255ddbd8610ba3b081908dd3d811ff8a0bbd5e8ee347ac003234a6065099e5424022969414adaa8fc501fda25fc9f243f147e11363f5ba62553a055ba569cf83e15ad4bee7cd1a8deb2e8a77df0a28aaad799b79c5e5cc1e27cecf3a924f217c924dd1d96504f4ff765b3cea51ca333a8119432ca5548e62d89e62d896cac2639ada0bb55204677a7a0bb51d078dee9b4852008314475f716821a7477579180136ca0f1440846c0b4c4173b62a50217495ea4104194143574e8eead250507d0d866e06e46a0421b02f088a8ddbdd5800924a6c400830d18ba7b83820634b07812811636e8ee2d059956c680521b61743707a345ac0f6a40001d74f74645140d702a41035d0075f76664004e9ab20881802cba7b2362072fe05c17a1077437a784c4880d88f041c410ba7b75c21160f4600926b2404177bf1ca0006c6c62bc8e70a4bb3733848004153796a8015077b39af8600c3023411432ba7b1303e603822746488901aebd92150142f0a4bbc300a35b0c670b40e00010000102b25b6707ef8c60d5eb855fafebc1ca99072b673a2030a16dfefeccab686c48c7433ac95a3a1ed2f17c2d59f5fe32f257d35153d4193135f0f11fa168c9097631f19574b70edd92c095ad6c7da086c6b7abdd5c7f879c23185d83715f7051d5ade3e1fb140a47d562345ba68a24d787caf5a19284b3289c45229d493c20d5655b978ca42abd16876eb148e4dd175efc7d3e2995875f136be41c696d668c7f16e5e183749cb5168295c83becf39657b41656cb5467da4aa913f96a3d4f77ef70909f204184d8ea347b658ebfcfbfa9a66fde3aab384b29ffa0a5650f6bccea54bb1326dd271f86f394fd95c9a64379581fca468da054388bb4c0d2cd45a0d5bd227b15a557517c74afa0ac8854e85e1dc9828deef6d79291948ed392919453735278129960af6490c5ab93552a52ec5da53e85e2570d4c494c4f444dc811949ae19934c313e9f5aa761c2de88563a5d3eb25832090e47cbdbc8943f0c3ff0b054810214066603359bba0cf4f88b31571b622141021650c723c929caf9747e2213d4182f85c0c83587707f9f42c8941c00b8ae87ec11ab34c69af9747e22617a400df2e5358904f8f87ef93e2cf7c7eca209f9ed205df64d4cd3d71d22dde8b04b4a248d4020ab85ac0638c261aea8a6b0c202cc8fd2ce8a2bb27b953cb3948e1fb19974f2e7becb34cf47a757338c070593c5690868d0b132e45ace048055c88a194022d8404f1414a8113cd002b34e8186ee52908eaee2a9e20509045a596f4506000271faad76b68862792900cd7a6f821cd86a2b5a07767de5856309c0063c717547c21009f9ff20b16a0609f2758ad5198f47ab17002a7e4f46a9ebadf280a1350697c3bf043194cb0a3db045b09cae86e2f22e4fefa3ecf789254e11c0288124891600c1230d1cdddc0393591a0e5c3a412f530a13dd308a2bcb881cb0b26babbcbf865b2123f59cb8fe78cc90b9eeea2013c1e8fe7c384c7e3f17a98e07f12452210d3a5ff242f412e1154d1dd1ff30fd7d2a39aaa22bd3ab59f02eae980743c3a322b724b2e115c1141958dd524359124891ecf9953d4eb750508d0a0443eef5aef9b615a69cc8bf0e56ae092b4acd29ba13238499f9f7208e3297af7c9aa390a35793c61433e3fa550d51cc519f501db5d9b4ef871b04c2e2ea4b823467a479c2f0f3475d7759ef38b587caa97f8542f7aafeebf4970fd299b716d3afdc73c5c9b24c653043b30d58d6f37c37336c373b64516ddf9da19766bf3ebf17daabfce151102da2208df2e24c2812ebaf1edaa773f536f7c12ef804fe5e24015dd3d010e0ce9b07e59e9e8431ed69fcd9b6125766d20025a00753fd2d09050b543deebf5f4668fc49e0c8f33cf10c9e7a77465000c512c9358a6fbb3dc34f33c3a9a6af2f92985f494a2b5b08c69d57b581cc2f11c2caa9c718133f0bd40d50fe110e1f8fc94a094d193328616f80aa4c0550121570576a4e1ba424b4e0e5138ff299cff94ad08f55328544d22c78b6484841c2f52374703f703a7dbf3a078b0801260a0022351e4c0065e50d102212727bcf4105381195705be40c2353085ab40b0000f00d4000b19740040c900365970f8140001575ca1f3831d4aec38810a1a70c4030aa286282283176e8609e448e00ad7162c3819bab918381b0e866eae878d2b0245b8222015be0bdd5c0b1c8f22acd14d81d35ecb340304c22e3f46528300cb8a2abadb06bbacd8d133cfa32ab2546142773f408cb0fecba693eb012d74732ba8d0dc8eae322ace9f42712e6d6d2a199922866e35ac7c0d33c234ab5945b686d1b2852eae0da6756c2e286c39b6181f1650af9260b900c3c5c4b8b056dbd629705d73bdddc032b2350c1197d6f1b2f5b66d2e2e40381aaeb76d5b7148db06b371dbb67a99c26ddc06c3a1f0b46d2f1b4c731b8e6ec5bdbcdcccf8c6e23856968db56ddccc26046e9369978dc5ad7edba270dbc6c52ce158e036ee85c56d3be0b6ed85db6ed852d8b61517c385cb0a26c786c2b66d1b37843b2166b52160e3b6176edbb895b771ac1919205ccd3614b3b9c4b02ab2c1701cab6735c3711b8e0e21db0eac1e9a242b27ae59cd2d6063ad6e582edcb66a97026c34d89aeb56abd55b6fac8ddb7ab0c5703fb68d73e1b8d5b6fd6c3b5bcc56c3711cf762b4f9e03816b7f1ac3a1a156266d87090b002b7c4e6c2a9b0b1b6d5d69c13e7331bab39fad2fe6d46acda868bad8f84805b6d2f1b0b66c3b1ad98e0b898d76a0b5a6d1cc772ae46e66673d936181e56cf0b3c1b37f312c36ddbb6c16cdb6be3b817ac5e36198eb5a2da7a70e5b6ad7436191a6e8b81d9b8239c0b9c0b5c0bab5ef5a6637be1b80d07abb562712a701cb7bd6cacd82613c346e3c26d2e5b0e2016b824181a196e83c5d4c070db0d5bccb6adb88db5216d2d7043381e1c0d07c3b96cab8ddbb8edb5b5c0d17030ac6de5b2da36a06db5dd6c325bcdb66d443617b89915cc16c3dab86d7b6ddb0b0a9c091b8bdb5c58db108e665b712e6cab15c7b138d63684e3b615b8994d668b6171dbb6bdb616b81998d5c68a616ddb06e4db8e1f31422b1a5cb6d526b3b1766c32322f1a272cb8b0c1c0da38ee8583f9ad75020f0dd2b6711bb76d9b4ec334d939f4b0a981430fda7180e20c3070b031038d26930610583283323acac6050d0545180f35bfe82728b240c0938d6dba018a286a384d204794a0700108489307cf102876ec0c99391e0034031c3100d9cc6c4266b01941c8f7460284f811bafb8ae082ce4705975306036c8ef3fca0414b4e1a2f7c5ef382a740426b29014a7f2e48b4b380682e057cbb972b333290c00a8c0c8c0c2b478c101899550b35513e30f588b97999890962d5e8d858352f1e8bb6c2b172b1c600e200565e72703032ac1c1c2d0441c0ca0c939a909593c3070e080b2e4b58db8b9007ac14513a7201c1b166584a3843b072831f7e80e1c3e6f272bd70c4078eb5c24a87dc6c865c685081959797179cae9ca0a30800ab1a7c08801515649ad4985063c2942427903178660d2b4259a6866f002d1899150e9729961045f810c3caf1d2c2a6e3c7071c4421f363055762d858220747e372c4053384a5e49d6cf9a104979b99243333bc3c61fd8019f20306a0a8e107071c81428be70a0e5069880f58a129634d0081c347c7c684c78a088c0a427c988119f232139363059454c3aa8599246b58998149c2011583c40292243332483550a11006aca4c0ca1132f3f22a01c7cb0c0d921e3a30c0ca4c0c920b3022acb8ac5a2edbcb0d2f332e445e7e0c15d194323e62905e666054c0712413038b4926051378ccb0020a3f626850f234830f33311dcc0f8e1fa02427981a16cc0a2eaf9510991a960f3f02230333c3da7151c20a3ab2b9b0b0b27141814726065c0d41426447cc0c0a32403e1831d10089b961c5c08ae1c501567ee4601db9d0e0e2824c0c2c1e3a7a562dfc60a5dbd956b1950e6be5b2430f1d08b0015b23000130b6d81201074831440f55aaf054ecc14f87273948315902e5a46403d22be8e76606196070560840f0461a68e0c0c8900c3d565001468b094a3005036e4062e4d5c20935342f1fc8220356503185140a80420b0296dcf8d8e99a384014d41b6e040196431a3de080675d033882c68688ccc0508144162099168cd1002a5e4384a46002cd4c0c0c0f162e6081271f3631d99094044902042044004828238816118080037a68c20448c80e13586180010426434584c8c0bc4820880c4c200a250840c40e4f2420014734310d11f151b31561d506c7064b0def0177060b07dc0c5ccad85cc0b1805b818c0a6ac4e0c2e0bee0b2e024b08a0037c58ab2c5b0bd10d3820b0f1c2a702970276c26b84a702181736d2d560e8ec66586938989e160605c38d6b6dab697c6a163c5c26a03565846586129bdfcf00d46083eb41860c5c5a506660617f8c082a28795428d140f7819c20a4b490685191e3b80b02283032b87950b34f9a52626494cd0cbcc8ac88e1917125889c1c28a094f7c90015a21e0073564587179c38a4bcd0a2bb052937b6cc08acc8e1c1c0c11971d9724b09c40a3c2123fb08ab0a2c34687cd4ac7b513b3c3f5c60f2e34c404c108ad74ac8462a4b0b25aead9799979a9c2ca8ae66505560e4dcf6a63d5b0726692b8d00083c3cb0a2f332f516a4ca8314166870c0a3038ac8cf0c3cb0aab2d3fb87461458628acd13d195a60bd6a74bcb858db4a6765c472aa49e185836902c3020c93cb0939b6179a950bab66b55a712b9855cc4a6686076b05b30486041d4e332e9817986d05c302c2da616d312aac58f041e605970758c951850fae17160b31473fb0c8f8a187e7fdc61170d08231c200c38b2e4a191412599014192902646b1a3dd8f1d1d21103e3248726a6374e20060a5e38828789258e1c800c167c21020e5c200253ec74332851e623f015820fd480810ac40041057ae041872739483531d590e405175240210b0df4100108f050c56b8187ad2fe420430652462b6f1c61086b3c7192020a2e168820041de0c0052c208123042084a7030e4d9a9892be3841084ca00513482f70c1172200010736c00029880000103e5083052ae0c006b298c0152b1f262171e150c3066690e105083490812b1a8084111f7a3a3c71d224090991178e0bc71727f002014d2071e5431d6c484a8284c82b070e56dbc08c2f4e3082106820035748a0010310c0152836241521f20202d28343828bd56fd8c00c198cc08b1080400319904003068084008cb842030fca13233b9d1b455052a223470c7864298208a9263c51184144adca0a99375647e08ce05204ae8d9807b01cc035809b62f3e17a563c5b47a3b3a261e528bcc0f1d858805961a5c2b68395c286824c092490b06ab174d4e468e158a146051a1e332e1998981718eee5c5c565b5add033507c5de925773eb420ad250c1440a078d172042d637c7ee3446a77ce19e8530b03b444a12589ee8f8a18c78b08f94d1121d7126ac1a13bd76050baae739284f4b2024fb70b911e2e3e9e10e37ece93dcb9f909249ea082f3840e4f20b5e799a7e3273e016b24c00cbf36766709b802dfeecec0f1657c9099d2fde5cddddc0ca7a34b801287026702a763b3410fe9f121bfb7047f0c191234046888902141860019f233c46748cf109e21438282828082840405090212f413e413d413c413340428080808480850102020403f403e403d403c4043840409011222444810214084fc08f111d2238447c8902041418082080912240890203f417c82f404e10932044810102020428004010204c80f101f203d4078800cf909fa01fa11f213e407c8cfcf8fcf4fcf0fcfcf109f201f201f213e417c80f8fcf8f8f8f4f8f0f80ce909ea01ea11d213a40748cf4f8f4f4f4f0f4fcf109e201e201e213c417880f0fcf0f8f0f4f0f0f054f13c025a65ddc9630c8a93999c9b999b2a5ec57770cf99c999d9c1ddddbbb912ba3912ba3917a7c38912f88b8aef0727a89c089d50f27dfe9ac9f93e7fe5d88bee331f8ee7d88b375f9122456cf0732d1d4e9ce084099ee3c387e749eb24d1e87e35e145130d68c7f4cba56bef4552d4c495eeae6b224a13603711d4382e24e43d37ee00d7016070802d77aad23bc3b4afeb004bdd7d2d6c76732edd1cab9b5bad8480038ee3b6373623746f6e746f4570c26500210304194000ddfec2a5759b3d7cbb1e1d2f22e4dd5b1bdd1b11ba37361a533f5a756f2c267898d8d11d2ec146b7b7040cba1b8b74e60fbdffd8125d74db585d624b7727b144ee6e5cfba9277d7fea5a9a178bd9258e2c71d378899ac64a04a15b0918b4a74409669ee1cc3f2a718513ddad4411ad4455e3a7472811831235dd1d7ad98ab8004328000c6cf6d0859c26b61a4c6892a4b7190ac0ea6ea09e8e47275b7bdb38c2b6861082d06da8d0032034047ee00335b6347ad03d67554808b0340013f400a454bdcc054a989e9248712111019b106372dea8a2f0a792885f369dea549a791ee1584dc2384b159d254b16b1bd56c25e2fbc4424fb88315c4714a0bb7f160aa008dd7dcb9066c5184865560949782df84fb93e1592fbf7a778d5d611ac32a20d3bf33c2a22462b62887016155143440f88b082080674378d089ceebe7f3f871f51da354496114f1a3863d53221326306edb241b7cb0644dd9d423791fed12fd46047bb6ab0d3ae1af8d0ae1a64d1ae1abca05d66b8b4cb0c1ada65860ded3263b6cb0c2ced32a303edba0152bb6e30db7503266e808176d90007edba418e76dde006e8049925ed0a8249f7f64577c76c5cc0ac58249613495629cdf567ce0f95ce0856e9504dd98e8eebbc301662060b1bfeaad6fd052be70c8b969ec2a294f3226c2241f2542d93386156ac4156ed6df27a05202700ac6e57100ff097ac520f66c5227c3b990b005274b791aeeb8cf84bc7af1d4129ef876ac948caa1c0ac583482524eb613746f2628c1f60112746f22184108bcd844d0bd85a07bfb0008bab70f74673c959a667822d5a4703ed252f875c9959c06820d207a00c40a80c042c8dd6d06820820720082c88b0cf9fd9c1fe679d2a0aae65287c599b18fbfd4da19cec199e6e0bf3e4a5bf3183805ceabc4bb70fe2cff38999cba4fe7bb641ebd5227ef3e9c1b9bcfc519523c65ad92ab871d3c88dd4c8ea9f3d0060f3d70f1b045b78b072d3fc466513c0875f3d0eaaeb245952caa24a0bbfbdad8fc0fffebf8cbc62af50e8f3fcbd9daa70d0b1d0c008574ed10b583936b079ef6d7dfe9b467729b1d5898c2c6141e927e0a85f2a7399e589c454adce7e729101f9e1e3a6316a422ac243d84e1bf13d441a2446404f55328eeaae69293ff4a6c14eeea9c91d7bacdb6b4349713c433b01c1d4face3f8ef675a69ec437b65977e376773d634893caaa3fe1fde26eff03b9177b09f9ae30433cc6916c59c0f7f8e339df9f7e1506c0a1faa26b9a43429469309e8eea176915f7552c85fa2756242f2a17abdec19dd6d45603960b5e4f8cb5675b7fdac52fbcbce689e637f747bf876f73339c3e9d540572deb97e78ce6d50986600245b8c62074f774dfae8c5be019c588a55bc7a8d485148663ac81114b70f486f851d11d9718437717e21a8cb1e4c848109efe42071e3340d9f143912c45ae2733a801288ae886e971e8f09f5e14a992251f5aa312ca15054a9420501406dded1414040aeaf1b49966eb947762ee91e7786d92a02018f700a748fe0d0a0205e5e1fba8a109eca88bd9199e48e1df38f93f35bad21468c50ecfe0decdc8d9f7d7c66ac6b9f1c7e24ce2dde7f3537edf8fb37e195bd156bd05414ad618fd70725eafa89b6f863f6631ad7306e297d597893a7926a3a26390664c414a1209fdc4f97be33e33a6a27f435142e3fc1bb33ab9b4b656d922ef742af5c9c43a614abbb944e25d0e9277df07e51df681c939deb877f865367b2e4971e2e0cf3598577ae336cabba3a41f2713f82454928dc2e13f1368a38c8eaa65b2f773a8964914a70b7d72bbb71a2e6678ce7268999c707941d4685ee8f29a784e2eaf06cfc7e3f176ba49eb3832dcf8cb771c4706f71c19fc455acf91c16fdc5f390e25a900a8c4f028d7c1a205194334032000000000e310003038281a0d872362d9a0c24db50114000266c46a9a501bcab3308a31858c31c41000000000000000303310004a1258a65ae1fed656b92aa8fa7122590a3c8212b538e3c31596bb447c8664475bc7ed782249f5a68e05e76d66774d9cccb486ee38ff5359e6e36035c9f30919d01b2c4e0fa3de2438222b1b7e828ddafd2ba4ba0a81ca1112e797fc76118335a2575d9cdf0af84799e148751d368dc35f349e26e2ac7015aee966c83fba18828f9edf0104aefaa901023ba4cbaaa8718689eade6759c374e4eb597e04589bcf17667eecd586eafb8e4adadc92fc008990125a09072b2626d56d69efad456207deea495f5e3d5a8ede3d31fa74d80d23f6d4cf8516c40fedebde3decac7d149e23c293bfd56a36421f60e743d93272e53a4567fa7601c8dd45cb51b68b439923871a362e55d0bcd496f021b44eff2390a67ac10c34b9d397b5436e3b6a2557f0def6c14a078cd9decdfc330d84bf0583760fe8fbb44bd8ce495206085cdcc9b860dcbd2f99c045a8377e146b452179c9e08deacd5e3c9107625165aa07d1f24b025e77bd908345623fecde3f4139dce2c66423c225742b25ccbbd3dcf8a1f45e2cd16575a0ce2779da716d8ace5976b2e4cba11c4c8daacb7aaed68ed799852be7dac30c25e716e681d831ae6f9c2e98e07e6701134d2b9034f988e62a49edc5e342833bc53da718121f24244c57a417fea14333491133cda33534676baa9b9b63ca3e408e97eb71d93a807b378fd5352bfdf79bfa0e3f63fcb949f96dc94cb19da940b34d7a11e5d2fa516d0460f9b0bfb4d979b9939e2550b000e26021c77b059d667fdd1977e73704757046fe0dc5f795b78b5107691e6de409f60f95f77c565606f0a677d136e1c064c05a68fd3f83cc80f00fcd327ccfe0f6b790a7d876bb9c7fd08f479ca113aeb87f0cb07ddc85fb3dfe316d3b5570c858fea0bfb4ee496ff6f877c9b4ef0ce29db76ac6634334926f0ddbef4539b15010aea6158312df37adf287f73455ced4ace65580982dcc4c083447d90c33a0a73ee8f87002854c46a8be12a319f0756e98cf8a6e1b66522d243dc6bb780645ae3861a1e4a2f0fd2d577207c4ca2841e31b3d44b6ebaf55a7dbc2b77d52ccf3eb75595cf58e938d967f3c816c2aff4c503f76a48dd0f1e412be1d3bbc51a14f2b95c6213bf8fc30fe2bc7bab310017f8ec6558e054892fa3f4e8e76c11423d155d351511b1e09fba87c0f1af03218dad1e938e48b46dca6240702986aaf87f1e6ed677dfbfd6f02596d13d7b08cca6414f0fadb9996715529aa3ee41f0b8022df34bc90ced572de973a3a93169e2af9c00a7bdea762b3527ac60e1bbf6e151d9fb222282f3efab2e26217f1992bd565085ce91a2dec2179045bf06159c213314d4d3918d7bbffef312207804c18adc2bf75c951b5043d043a48c15ab972363bd82a52b5af6ba57e56227374f5dfde9b243990f8451b6e9ae17b1db5cdc4abaac8c5c5b26de5a0a37b60486c97d6106b546f14264f63ccfa8fe59ad2bb4a7d8dc5d507a10f45b5f5611210ab671725bdd12c384a92e0f7ead3937324a860586cf61410b93ccdb0598d5ad92313807e41685ed7b8fef46aa6c4a3353a1e05fc2f2ed547e2a5918c6e620463fa334cc16b0ef4d83f1bc4e2c54727404f10b62fc9cb10b4d6947bf6d6bf8adc9bb2971f0b2f8bab7437127656b0d3910346eeb2e8d1e89f07fd532e5747e91aff87aab643054219cdb7c44a6fe21eaee98f86eb2c1a59d25979a4868dd9867d396fd39675650a782cbcd5763cbd2ff26db5beef635cc6afb6b7141fea7cc94a91adbf42da21ff3a1b8ac1818233c9ab973a62d913f1b2c8c7e632e136518b9e52ee60762b68d91b926b5c02884d44a566ed714f6e31d3a0defa549fbe09c55ec3c242715b8016031e325ba164b38e2ab3c39086f29e2fdcb17e61f779f88439faf111d5aaa5598c27cdca7beb35a57159a53ba32db3b8ec3154bc50ec7ddc3b921f87e7695ca2fd4957e41033aa76d24e41ca126f72620152073bc4bd5b8b7d52bba935fd2dca770aeb7f90028754cbbadce48d9e902f184e984233a1b02ec1d548a5ca2c2c2a6a5724551f80411426b37e346ea35e0f20e1d1d825be9a4e055f0624dad4a042f51d075a978b279ca72a519ee7c9cb06f69e0e37008dd5fdf497dfb82af085f3f9df588fbf81cb5b0e02d55ea7546a1431a6ee7ecae2c70c2504f49b84380f8b887811fae7a4e262888768642d056b599a8dc4c9984d4505da0d1f3af4312e5d5eb36230413ffc2f49f51ef39101a2ca2b622f320b7a9e8ef7ced64ef2b41470e7c91c4ba1a55ab216035f417d6d18004d66b89e0a0198583cc9cbb1acbda48972c675043266900a0660db6e3f1fde9e747250328aed91360ce921984b78e81f9e8754da1d1abfd6a48d40b8400b10ccf6690facac4f3af023e0343b6eaf18bd84000fa779abde680550b00b5698292415aeb4b1ef2b1a39e4848ef9ce9c55be7af319d379e91f7e881600bec124f408bb827cf6347ca09384bbb51843edc530f8ce9b3151ff93ebf353d6b320e3a6f9fecc71907ad28d01e7eeefb4b8224a2a57ff9d7f9afafc717c0726cb03284121fb2f04513806742f6e82706fb6d643bcc5e8319d61898d5b151260b6b52ade976a3f62456f96ac9c6480809a8d681d7bc0fea10870cabd18d54b24889eede32dca9f1e143fb5c4dcd1d85a73920e743e08cb80d0ac6bc4ce834b168d1369bf5b717e81853aa5d77b05f6d5b108048c09104b17e0bab907f856788c4f1fe5a8f9d866652aeb1b9ce72ce5eb2ffa19f8955e6088a43a5125d6f00f969a5e44e09938c906f18c898b211edafbf8d8773edc637219d5cdfb7d0e0e737f58e1f56b05cb4f58fb5b37b4f45d86cff5e762a016fd2ca918c13bf2adcd191be108e61a4e791c44d437b990b3fc429002f237c1e20fda79021d05a01687a5a34986c75aba78371e6f37435cc713c7b43e9ea3a8764958bf5fb3493c1864a46f5708037131502ccd5767cdb0f5983749c8c4e74e6299c758508306b65c2bdb622d276903f1fd44736cecbcb82f2e3c6922daa41765612e3c8083123c63fec79813586ed9071736623805c65d467d066ce55e4a469ebe7ad3480e16e0f5fb37fc9dbc7dafbe5ed6db9a38e600edfe6f73301d27de01f0b6d320b2a4a5051d45a02e5204eec6b70aec865e1b97860ee9889d578da46fafb431f7115c9db85e3b1ea6558cc5cb00204f028b93929a38d6bccb6ef3a3a37dfef28318d79d63bffeda9950c4f721babb6f38f44adf96e3019a33db8146aeb3a589499e5432e0d2e2670add37ecbe32f71e740ebc4e360fafd0797cfbfbf36860f5237ff5faa0f21ff46d2e22fb30ee000f798bcd04fd6717fe46e1c06d5ad0bd8d12e6e2901e93998cac6c386de8bf650dfb93b5e3a32d8f3a1e36f4d5b11be7a57c06301a0f3dba88513efb4b4dfcfb77a8fe31acfaa0fa08d14364be9b0a1ecf5aa9df76010e2f6d8aa1cfe3a400fa05a530f657880f7bcefa4380b4b770d9945858c0cbbcb0555daf54df8e79c170f4b31a86e10b92fa48f6cb72c389aab71dbf92c20e33677e40b8ebb590c170f355956d9e16721553db3d0263ec6d29ca297df2e4a69abbaf1cba25a51992ab06315468ba32a8687f81adb1794d18f600e6ae567d619e56cff603a22de8548cd732c4eaa49485562f69ba7754703624ad0445aee788b83f07afd5769d1e4a06eb296061cdba35073616df1e9e0bcbd3fe8f66797d034b8e79f7b36eda3f382e34b0709182d63f8a321f3a7aa62e2db69e48f0073bd7607effeba7c4f13422881c60fd6993b478721f9ad26488dde4e308e5e7a1acd826b4f14473566dd203b1dd93b5cc71d1c7f6d9a5e7b32fa5a317e27519fa569485fe8d4f7f432759f7d98302a3eb696ff278e653db13cb1675909b5794a703ecfed0f839bcff3a1175869b777f5d90bcd33ca7482a1f7481d5302229249ae6fc8cd12fdeaffad9ef18090f33bfb0771faa7fd657ce7de87ebc481fcb52c5cfe7315c03212634e78de87952a8bb4d84da82071e9072440dba4b3c701886c98e4bf24a6bfb7c91fa18721eeecab10dfcb6316088afcda1c50b769b17b16399d0e9a71641e780511f381a71954fd4841190b05156780e415a78c5eb381fcd34128fb6183f6e6332e25ecb21a77af403a8c0381bbe9249df3439932d449b5c9bc418351f0f0d9e150d07e31d28d01e8981e2afe390e4f1f1a446a268b062f0ae4093837e9f1f4cf45d4fa3fa0158f0e8d4a41b1bbec2f1153f79ea7df68d41548fc083373e3ce38c302b4effbc457ebb0b2da8d580f7ce3ff872d59b51970583342dd5cb2aeca9e46aac96b4132f2d4b41f3d73dad96ae484a129f7d738f3c3b7c13234147cec35566ddfb51e28fbbee35a99079adf0193444c65a3f3829901c1d9089119f6b2b4f9b0bd837b326eda45826fe576f50f41960aab72cdae75231030cb82e7113685734f64cd7430df605c93aa07b76139c35509e6c2526eddb9be6f74e56d3884902c71fe28b86a73f92825964a786683f90eeee947b7cdb52df56ef88b2ef26a1b81fda42046a845e8da533b18dc5d1066976feaa51e93bf1dfdf2d0c903722ed2887c26f4fc5333ce25c5dde53549223976941478cf84e18fd41397f5b08f163d07ddb09db07e32ed9af13b4fff35b8fc2a0a40c41d8bf0006b7b9d5e83958dc4ee762467ad71ae47131cafe6715f44252aa95b63304c2d27524a9339d085769547ddddef7d1acd1bed0b37e64a448d70c2ae4dd8cccb928202eabf96306b2aea929c82eccc55978af5f95d4684d21e292a92ca5945e791ccc6a782c56f711384d64e57a7c72acf24291e7570de231b755aded5184a89b99186a0f1dfba225ee0a5a3114557aad479a056dee4113aa28b12db33248e233c7a40e1da4f0146aa9a76882c2307bd41dee7a85fe9c52c1892b817e8e7a059a4c00d21eb45e3b9a854aadd54e4672e09c4453ff7c6a5293d7c2cb98702d8e5b77c4aa499f83569215482c838f9f6773bb6dfbfb1fe6795d7453632a67d1cc5e0da4ef73793ebc7e0024be421782c713381cf9cacc82bb65214833784a8bbcc9e013509ca426e96ec1957d3bb86920a570d92d3451d0ae1372bf6cba1a5d7d37d927f0935f9a609842af5e4df726eaf7eaf5b400f96a30a0a9285b7005a7006303c43b34cb36ed78f3df647693f712328b30b603e4f1b7c853e60e666b73637179aed678d2aad01c0dffcbf978321709d711f4d76c35f1cab61ca2a7435193857219e4ddebadb8a47882ec11752da14f3a1cfc0687ea18566725e68a25b45a50e75cc270799aa9c14965fa3da6bea0e540f47ccfe27c062b72b88b3df8a7e45cc9244f382163e62b354930d389dad06980bfdb9d6fb2c2bc9c486abfd3c84047d8e09ec0f5f2a921cf9d0f7c76ccba18db66fc5d745557a309ceb50543882af0ca783a10a93171bbd64fef5f420cb1f4ef9248fc30ca0abb9ac184831920e7102fd843c2f01e5fdefed39a1704a1ea08b5bd723dc1bd5fc0bc1b835d17bbf4876012e32e6f5b28c5429de2fb7cdc72f3e2532d917ccdee16223f4dfcbe85e51eec10a8075e04dd4b48d90607afb54c7c41807c194d3e541022ef104e16ada1db3eaeab3f65f01d7f5520e106fc344c9a95a7f44bb79aa3cddf6ce36ecaa3878c5a02d42b6ae0cd8613284c2760caa97221d55e07a5307f0e27c483f30462c20389a4dc2827df90fb9ef9f09afd2f8f18d1f8bf0575968ce2001e3d919237974009d8c9128f91408de8f9b401c547e0708aa1a6ac9446106f7934424c3fdcc84f156eccd8433752145a96b72fb63cbc2479678891ecb6fb47e61c739e4fe62311b2c69f053ffdf86b4c82ddcb11203580276c1eb4504016139d59905d27b5acc5ea17299cf7c87ecc0f91606abf8aa2211b2e3a0a0a3e857fd479751ea95b31f0ee6f34fd8eca0956a7aef6668cd660227d603c6d09172eb5c3c20e3202e880fe3aa04d582d275306c8add9bb95ac3cf50bc5d61df88f8f581f648d23e00950b25a26e1e644f539005d2287b3e1634fc67e54cbc6c180239db7e79bab9baf16afbfe438650e5ae29696cf3fab9275a04bcc3d1002f3a3cc9426c378d1d017db34336391215b8439735d4500ccdc21a23fe6dff469bd6c311c0768ce9dea2869b20e6cffe4f7017e3d29176c60e0654a4a3b001b70888e8e1be3aa579030c2119f813f7dc1bf1e3d707fc269ce9eff2f2c9ad1cdba6ad35ab72974a2a7b1340285458005c68daf33e0cba1c6a1aad06c376e20621b5d2ded619b4b278ae49a82b88ccd2a760f0c404ca0f307ca5a8052da0ec88b757b80c8c74fcae636cdd86df2889a78426d138a937f19a2fba1740fcb7cf143f1a8580807ac3fead17ef433b15c6bdf5ee54691fcd2164ddb4da264b50c05181bece3ed7fd472e64f8a081703a6eaa4f633c24e64c9931f4a0384f97fc48ad40d7aec7d2e55f57cf0806b4651a5623adf15ebfa447c382ec181ed654390a9dcd893de46f410f397da6bb1be7f45056be80066e96a520da4f0c8dd79c74661288df174ef82c0b1fcc9843fa63c1139572617e8bf756c8d24497e3910fc1e9c40f41e3c7ea0549d86e28bbc0d5e0a76dbe0fc9f05e382623aad788beada56ce601b8c1abd689f662ae95560862a9e424b7f2447c0c39ceca047fa31701f8c0ce50cf73d750c4a50b0d42a3abc300c6eb47681074a14207927d04cf8d7f499c4c577ee9d88c158ca87d45d45d2ef4017ef84c68f2dda0c74d211f496f33df24e1f2d89994673ba252dec361f55c15f5b99a74890c0b5ed3d2f1d586f7acf21bb1ca746e73d16b94f3a227298cb309db343ef5733d44bd8adcc7aeabbb089312fd76c28f124ef80e6590f9f8824f87575c265f614e3590934c349d2838c58bf5b3dd1f5c214a31283c798a1088ae8330e506a98535f19220049879799ab2f8e507c48f9920b356d8aa700e75639ae2ba0b326ce06fbc1ecc4afc9bc94a13fb832d45426c8b909c7bc08afbc1bbb26fdf78f031e06f52bf335ebb35ceb6db57214db6ca8bfa028077e935c048bb17a41f2bf5fefec156a7a32ebdea15bfab21fa2d6038269d37c19a6abe6245b946ca51203f2bb7cde40cc174ab44b279f142363e0ecbc88205814fb9361ea09fb1961c4e3c207e8ca85e4a1f74595b26f1b6521d6389fcff05f4318983167dfb8b8fd47197c3bb81a93de2074123332951346dffb9632630610bc109f390a83e3c3343954a73829239b5a1a2148bc7975044dc27945a4781cf0022a2438fa7beffef1ba0578c11fc6311e3e3f15b8754351a3475a6db93a2fe40791d2ae9fb8d5f0cd9c6c895365caa72f6b8e3f3f84588dc225408a0116a01c32760693d54d81832a1f821d1ff9470920ba879ea126ebf29e8e950c6c24fbcf373b6fc9d6c9305f32aaf14743734dc32e9c927c49fc5c2467288f6c0b0e03540a084f5bdcf0d7a9b702d327f9b6f23f6f91645c6b4d2d10622a0756c6e1191ec6981b653db063dcac0f0d85558b40a6ab732a01082430974516ef704a8ba86f88c9114f080c3944424f676b00a1ea8c933ecdeb7eaeca67c751275993bfeb6ed55d08f8b5124be225075ceab64781417c7d1c4974a54e019914a1bc0e2cb7b411928cc469e2c76b0505d53ad43149d58e58dbac06ab342c803e484d4c7d5876e91f1f1ac6a04387c44c48f1480238b9c67e7b8c4824e6350dc9cde09e59d12e583a5d460b4af37968537049490a55ffdb21de4b7cd16b1875a3c380731abcf08dc6f77b41906c918a91e9cdc7b6b5cee5df835c9aa5e01c3a8cc687b74bced277916a53de521d051bd9eee7979bedc92dcd02f5f37c3f1d9f1750f9a0609719d105bba4fef047e3e608c9f248cc63f0c015790772c5d826842963557593d6f190627a7a0ae3e7115659e67d3645b47677804ce52f5f35e6a5181ef5dd2fc293d07da4a05b34d19e9282c96e2edd203d3badac7ef0f9e47b77ba243f92c121257af9296452c67b54b69830ce31bc0e0185242818563c21445064140a7570c64c7e4f0378515ce828e6584a6909ff3320c6596f47a4249672bdb443f341a8098c5fe7a8bc59cf964ae59db3c97fca25a9226f4cb81a3e863319ef0dbf09f12fdefabf0ba3d72e15812ff8c03d0e83007c40171f083b96a00917fb132690b533ae2f463e5634a68b726457c7983fc8c45e946cb7c93e71c0846c410d0ae389dc345e683777f7011a984502fe309ddd8b20f92e38b74f6aa1bf1125bb5fc493eeb9163e5275060224ab267003bc89ce8717e6e46760df35d97e6450a6da7e8d4baee93f4c40f5d9484b50fdc57a75ffc6f3c79dfaa8f45bc02f1789b562547805a49e8bf29196d44f93589a26d8e4e7fa3f003160aed360b9d5229f5bc81b3f388d4327f45454a889072d9527026b38d4a8e4e0b81e873b80367c476c9f0459a319b9443ef5121ea77552cc98172044fe97d8e3853b81823d1b570171bc5f26f81ef28e7c36760a12fc3756dde0ddc98554cba682889784dbb495b5e8fe4dbb292c3840275e052b8df1a134d464e8aba11c95463a3408988c0687dae6c3872ee67eff3fdcbedba7920c2564a6f988017145cb542d5e8dff767f51798d6f9a2ca41e51ccb45806e069172624564cdde45fc2fa5b0217918cccd863982ed6dc6a999a8fa0140dcb0d409205a1afbe034b568a520e49a838cecaa87bcae147c3c8f728ed440b730af11dab346c8c9759c3e9d21f416bbb2216f66a8f66a988b293cf747f0effb54b50de0219435a3e5da1dfe4a6279810fae1f06f12f97bd2e413a20fdb039fe88e784aca7268ed7d60cb00fb5cc745139e29cd6c9df3a7deec9470239a9caefb43666c40e087755ab2f3ae02c273a0f32329da955cb81318b73ed598abd7ed51e797cdef33c033b37fffc14ba7c1873c75c8317412c251911bf0389e105c473e66f4de34711c340bb9e30ca7bb735225425f2a5d1cf183e80bd222bb1aa346eb07da10d82327e4850c691df2a7559e0bc8740f23ea0dcbd286f756d052af27e8d88b272e1828a264a332e6d798a768d222e82a212a581a6e98ccf930c41914d2b49db1baf2cfc68b6926b0d3662bba857696128ecf6b4c8dbe3b6ba19eb177f9b016b9954dcc536d20b36ada01481658956574eb5ac4f45c00a671dbfd00b7b30a12d83ddbea27468f964ab9eaba902193eda9203164c3e6e12d6b6216467c1e92e63d361ee31e75b68ae9b75295ecc0581e81889cadb782058d4ec2ee83f1466fb3313fc240a010039045093e8b09a8ab20547397f47cf04c39b9c11f269be59c7b911dddcbe9d5714f54d8e6c48ebce88696587330c540bcde665f538930b2a1c1090991a072170cda2ce0995d2f643435643181036fa8f3d86690f4452e56f096543d48ac1db1bf09316e48d6d4ef614ce6da39ce9415b0eb95731b88cd9e6c50d75a151971fd787a7a0ab667dbae18745cdf2505c4ce7dd71de432f614c7f5af75c1ed48b67c062ed4bdf7808bbf6c5bb4f6fbbc4667efcd2b7795c5b98b5d50e4fbf2598e9fb03dd99ee9f0443a1bd00243be667a9316d3fadf79eaa3f0e885288b89aacc71d0cfc4c7c83e4fa6cdd715fa1f36c0f55062eaedde3583fc8b452acc2c31283139112ae19ed9c524cbbf582360ff405b9fe2f36a38ce47873a039611b29871fe87b2f95c9c828dc937bb5d355925a2509c24e537e10799d8bfe1f0486bd7d04173f6902bf53086dbe0cbb6672c22aeff3bd986feb064ff887cdf297efc868eba833d67bbf9d15ee97a53d99201a18005f6b788abdb631ce43971ef6d9a83e77a1ae07d5a4ab2cdb3a2154ad0044c2dcde562c1f53caa66cd5c8bfc9b5a1aec2bc7b52517f463c508bafc5f14f784b9d7d4deececd76f63244cbb499f84b3dc31b585298839d1ad84b9fae73ce8f7b32be1f2bdd97c5b0d42eb9924ae807d198ccfb94986d682da4cf159e367ff38f6e5c896cb5f6bedb6227f041a48700a654d1c7a71091f15c239a030461f355fe9b9fa2a43ed704322898646d1dbc58b1676a5738ed952d072dbfc19473c5955b9edbae66e621c9af2715516d908504b448b358c9060cd0b527c13074278275f4ef06817e413a726e333705f94c060dd7c5b60e833ca5dfd53c92c5d9626ee93d0ca556a0c51b7b42864ecbf2621e43c20d419d07d91fb08179e1d92d487a7ec0acfe1177fab2d89d62c719927bdf69c8297c83d46b902932b9b3b08092f211cc8e48555d505dcb8fb40279da7af25d36ec0362a9a2bf5758b840d7b75ad31da4c9ce700c79f652ef3fc11691f1cb85cd5cc862f276fddd6cddda9c2acb1fac4db6d9f91cef800c3cb66674b6c574298c86517e9dda37a708b5626d7cb3f0b902d5b79659598d08e991f474a2f408bc71ec2efa9c8d353a61963438ba57e01819f861e102cc04def7824ce28fcc9bb362118d23e7da605b1a7142f68e9ef9e6f07e39ec6f7cd408ff77a5379fe85edecc851a7fe4e5437c8762928fbace3feb7dedf961c5c1858dc91635025cec7521803e3529b8474fa910b2fa2163d635442d00d20f08da5a4eb716d89b67e348ce0ad62c299b3a3e7cd05fbc153b887decfd2c278dd3a3474dc25537d79ea2dd2d89a5a0fe79dd6bd4760a5cff3882f8ccb4a265cf850e4e04e0a9ba86998e1fbe74e6c76139968baa21a4405e85e30e8082574b156b8e129dfc40a11c42f57978f4a6cecc52b7d0d36203d5fbf3e0d341f2be0b0a16aad93f882f7491044518e251c2f3e11936b6cd04f98de91b8af3e4b85c2105c028f45bc7289ba193d9063a91f01c6a51b4094235c2730983cf749476e6cde6ec2c589f960aa3f8ee24f18eb3919e6390ffac207ea3e5c5a6b17ae2b840c265481af94d72221f95f1400bc0b1b962607fec34c43e8cf582dc2a4a82de61f8f2de2cf872bf1d27d09647d67dfcf7666dd758449b22a20cf00671c1c7e5a5a678688cf9d10bbf071c573253f91b8594a6cf840424b85445f193c82c94e6f47f78d91552b3e824c5de53cce4f807f36411f3b3b1d195216f9148825151690f386cf75bad108dddcbf86f47cab83ab5652bc35d0cbf3214d8c45616ec8c6474360addfe01b33fb4eb97f085d95fd006be1a0987686e0b1fcd6c961b5f233e033ebe5d6d3ade8a5ed4df5aa18dfff697b3c0d441413449894f7751f54bf7a0623923f6aa9129523c73b99699697b1347fc09c50d72e1ad006cb796ceade633fdf0b3d7fad50240f1ef15396c369f259cd74c9675ef83cee0fbfab9bf56fb5ceec56fa43789ed9f24f45a37caaa398de349f7500fcbcd353913795234299374f16c1fed17feafcd0ba717af25fb93af79036856f170ee18e13771cfcb019c7b1b91263fc6ede3e0b7203dffb62192135d1c0074ac9ba4ab1126b8271a880444771a4d1c9243030e029a7c636e327df4249a1b37b98c43c06269fc720bfde292617f315ef78b6ec67f32f034b9fdb3a12fc5f6d3977e4662e8af6941c71eb0d474321a7663ac6c3f37fe2ceb183383ab0c5701771b99678fd7d6ba7da593b783990f95af84d1ca6cb95d0f9d764a9be731d518fcdeaca1dd1a5f49f352f13e7172f0d273b40f77d2ca8b47eacfdd9d1c27125f661239ff1e254804a95ae757ef9c85dc4dd3928ebec8e9824f565a41d14d783d61184f199230d64ef95d27b15dd5a14c0b4db15b8a6df7352c6b782c5dc57147538ee7fb2af9096e553fca00ae5c33734d9a36e3e2c0ac7bbbd5600b5762aac6ae395ef9139fc2d3890a02c66b85658087388f3b2399299a7cda76bec22742ab01055ed1e8388f632f39fdfbaf80eebf8ac1b136fec7aa02eebb05ebb331f0e01e34259d293a7104724c8c7828b12635d1cb3ac0585ac0ecb4a6aa69152cb2feae0a43f79b731e73a79bf6daf6772989873db3083794faff695a140a1daf7fd09ad41c5f0a3dcd689b802ffcdb4db0227745180c5f6c6d9418092ab70d9f875a51757e3a6edae7c6cd56f75909750fae1ef8c771e02370e5173f6c1f019175908769b76853c703a9635c26c8885da3aa49eb02b99327d8627eb8e2e4729095375cd52fd4360f5c5ca9fc5ae1da3864439a76c9ef433a51e854221a7aa746bcef38912b41872815d610e5ba10e918777a84b6703c4860e512167a55d5355e2ab84a0d41b312927c31df6cf048069a96552a72611db810911b2321bd20d11c0d1f8f25c8e899c582c1dc8a9291c3f055010676264e46c27b24833ab8a6b8afb297c2d9111379c8ac34757aa912e0c13319c1f5d53a9fd5704db5a05ed18a90cced579fbc87c3e04c125e5ea79638486aadfc6baf71cd5fb8ac0a21245843b95a753a5c6c8b2cd1c0bd489cf0e42340d19bbc997ec9d38deee799e3e7bda8dba8751587b67deec40f6f361bfe290c841107368bff267f57a0e6ec87119b4de23f622e855f923b7298be61f9632cde9143252d7f46441aae9e41869f784bcb78a50c909a0a2dd498264462f7846d37cd1c6fb0ff3810175a8331aa0003730f2309bbd18b6b51e4f458a641c68dd39abba7a1abec334b48e3109bf424401aa850dff99c37db87ca6e995384ec0a1707d1db82d91dd7e7f3481fabc50b45032bad4e84a27e26f5331febb74a71454615823215dfed37e99bc301540468d8057b82e0eec7d919775770f4eee54cb9c140fa0e6e52e0d020e1b9a8565a041f32d519ef34f41b7ce9dac62153235b3f040bd2a5f2269b2295ea8e9c435bdeb3420c56a81a1f5eb4b2caadad246ba70dae5c9ebc0f6b5e3d52a49cfa012831fb8bc013b912bc372d9b2dda211dd7e7cddba0b93dce3252097378b623267eb22eea9c492b5195fa6c4b2b24a03b7618a9a44b1ee017bbd64c747ecc672289141f46fbcbccb7132b89eca23add6375857936b7e8d1b8bb27ac63b24cea7be5be61bb802a28a982a7f7e8975829d39313bbbcd60915ddc5364c72eac7274c9471f869b40be292d903d0b1c0f573a087b11f281baeffb89eeed3107b86f05eba940bf256a3b6d97937a3e1d0135a5ecced4b1eca5a5c650ac5867efea45a565f51150a3ba256dab0c35713435ba74634d0642f4463cf00ae09978a37d9ca77384fe56c8fa9fbda312b8e47393c11800f79e9e67ec01fbe2fdfda3b3f79edc13bf7b7215481bc17883f26ff0c2c3832a36c348a4b0d82e82d5fcd1692e6c0a47a6acbb5cb95e6d796a8efda32b5bc43c250d28f3777335fb78f4c0bf4b4ef82b0cf76fc951f4b039906bf8a4ffffae0ca805c55b31b1f6927e7ce88903c323ba5771e261d519c09a0cc3285927ed814ba62d0d85455603445995100fa27ffc8cd17b73a82329c322351e0459c460ad8a890c5b7343c89bb3a286b715b205eb7d131cd2852e13db7531d258b87ccc72e823bd1f42faeeff35840230ee7173eb30c61fe812dcf6429aa1df1e63d7825ce60e47586043d0db7ff2bf198d92b017123744c9ee5243d3593addcd07e81fcd2a4fcf9a50cc1483f00c87fc4c401ff3dd77ff61179d383374e28abb6afe392b8989dd27870fd6fcdf3d4ff6ef48c18919dd539ab00782a6141980740e381636d9f7fb65cf7b5c0941efbbf0cbe3018b415bca5f9aec59d187f92137b3e88482d8560fc1229637402b1285b9f543945f9933f16041e926a6a7d5bdbb16b2c3368f9ffd82d10d728631c0c39e9c8c723f732af660c5eb1234889230a1bfe00a272966b10c744d81af07230df97d6cfb7eb7f520326385e6f3106a1a58e4cf72d7c4199c8ebbd2dd844420722ba73526bc23acdde2cde7fde4e3d74580b00bc320aefb7cb248599aa8f0028d19b1ef8ca811132b0625167e4568dd4e2725c2bcb8a80633d4b06b9cacd68576bec2f8ff83093f49a153e9862832bdbeb5e19bc6049309b7f65e37f14eac75ef52e627d93b02950c7b66e61ecd47fcdeca6780f6764ac54f12560c77f5d8f44f325f7cf84baff2fe71b8df3e8727e430368790eebc8350f7838aac0ce88a66f719ad31a4d38710d4d73d39df2e08bbafa8dd17f1c6da7fc54eb6151b2b288a08621d7b3bfdcb9b34fa29c5fca6446f3f11219a5868793e7cb95f333c355ffceec65826f970241b1a243674872c814558d36ab1e88a2497543bc3097a4787f815d53c644db2bdd666e398d8fb60837808c83cd4b21bd7047a777dc4572f713d571b532fbc157582304a16cfb182c218960d9bb0ab61915a6948858b269de959123d86245310c9d026888fa471f8f1a7920c593ee5154171cfcec67cd311d3a969f31c44c76ce78f3c492487e0014c4b9205c65bb44e3df5e74af32fa3dee324eb2a50849c831baf085246dde094df04e16b248c3b42e53f9b56553e1d939579fe889d7c81b9fb19920352ecc4f72c43bfb917ab98598f5ffcb2186827269e9a6250d3c1db83d4329367a80901244440e565b5d367c6aff9813251e8f21be50c8c78033c044f4a58fc9411c2d468d4641ba41916944a0a0967c63a542b7a9141b131e78f49afd28e2b3f5c4c9cb681a199f9e45c69da8530cb66fa9c611a2cf6374009b1238c51faa8978bebb3412c0120325d7a6d94cbe44e1932e79390b5a8c27cc766d5ec86a78fc034a2a9d6e43c31f5f0d7bfc3a777967f5071923d6f3c6e6ca0f774f753b8acfecda3d54e15108b74fac5b28e13b10b49b52ab29b6e45db67073160c4c04b87bbe9a92d2b1d612d870a53e8c1fef9bbc38868f2dc7f3b30e663003a90b9c9d5871169904934f394af82ef3b3ad22813f97975d8162a6e9beef15d52436f694164eeed05836ba3b86684ac203598a67b0a9c081be8a530b89da8b077ad6e760713f5228a12b62cc6c8efa95965d236e30a9412f97525795635a7ad9b2d5ca157f907cbbb0d3f0339dd75b79f3bd9272ca0c1ae4180ea83eddd490d8a248c9dcbcbd84328284abfe162ec49a903af9e61ddef46f416c0769f319b762c2976ff426448dc4a08360ea7f63f393c8c54996c63af9a2557b61bed7e243475f49d6b020daf72cd596f158ce4fae517b821e2810c61a6561e0c67c58a48c1e8a2d65f3a42be4b4884c8ad35a5298215d9c78c37399908f914228283f4de9ff03a47ef7c7d66a162d85ae853920d20abbfbb0e7649166aeb51ffc17798e7b8f5cf75a94756a30b5532275d5768d8dc3700847844e707acf2163b18d161d77d90929e2ac1643425a3da39fea0d211ee4f52ff74e0b602783a8559cbe16e73b65c900cbf688a4d452fc87a1e1b36811636e5586a37e3ace6f32714970e4cc67d86a50fd5a20c39e22b19346d520461a466d6b4fa52b2fba29bb24fe6cc4a2de31c8dfbd6f79988d34736553dc2ff14339ec63858cbfa7f693ab5001e40846172fcfb6059c8fdd3dea8f080804b27ca2849dfd63c9781572cd82c09b40f067adcbb41755a8f6599d419a844059cea8e6f8fda0d1e597a2c52942db7c6c59efc33ef3287cccf2fb8746b4905f7f40c964f656119dee42d168e7505edaf543eec29f1a07927085bd231cb20b6f45f3bb6f4d702e8db76e7478edfef609a7e7bc6fb36556effb5dd0ea68232782ed5d006707fa11e6bbfdd7729bfa8406e7335b693e3a4e50ffcaef90b3858384cd85b0e03697a254ecc4bda7ade8afb2b2605d7bd99f4f1e9165745d6af945d7891d3f9fbf26ce664e13082c7bf7975c01b17ce3d29fd889e2b2cad1ffc6319e825c8a020fb11bb63f5a6d38f5eba0f30853ac0769339f56b04d38ce676a926e0dfefead2cf7c68e6831d5f93cb9ad12f6c6af902dc8b469c16ce59e8d0be835efbe4da22f0fadeeb0f63e2a763f70f09554fe4275d69faa030ae4674dff352d8455007438e58e6749bb712d6728091107d87423ddd6d2a6002ae14dd4247b9e53a6c763b02609c026687de250d051c63e28227e2702da225a32a9e7e0db499f51a367792e6d3603c2db04ebcbe4bec7ed197869ce4deca40bf5d232b54f6763d88053ffd30d85723dec5a3bbd7e6fe3accb283b267141dce8fc5c01f6c66ac5b49001c3c7a5623ae8774402e2ae8c25860b9c3e8fc957f0b876ce8fbb415d6fbde3c296e37bcd124fc73ab907a02e62ee00c10c59c4dfd50dde373372c1050dc93fc502be87ee0a4816ca209fbe7f72ff94b875ce7bc6f1cf23742fe9b58b0abccec3d1f033a3704b820d1657eae2e88db7badd8b7d3e3aa0a8ea294ddd5fd84b49c19628bd74156365d47964bc6e6688ff78b4798049bb425ea6d1867adc613eb3d95778a57fb6b31bbc842fa238596cef0393fd28818e20660698407dfb1bfe2ef5b9c63bdf51b0caab9aac0ba0f0ef4ac6bef12ec63dab7d70f15ed9f22fe27ee31facd064900a2f3344826dd7a17463dc0792addde71725ecae8b373745ab61f48ce160017a64710434695c4178795fdd6a836dd1bd7eaa3bd479a941d08a2a4b02ec1ccf75b49804087fd8cd17e3286098e4b3ab4281e7e4a4c2e0747e95b3d7b19d9e4acf5aaa40c9a2e96122e3683fae7f6716b7cdfc8fdc87662d023b8a847fff44d02d437eaa9da79c2f34c25fe4b8c3fcc454601190fbe8aff704e71492bc22f1c8a46d38bf079d4d7d9115da029598006533adaaa4d5012b44559cdd23ad52b5280ea763ace5bec179897f26e4bbe487a15384d6e597d5e2af5bbc5340895b2a9da29f5bb34bb148d38ce5adce1a64ecc1e175c7e711aa1bb2616b2a052edfb267e95ac5b78751e9dac6b54497d739d44ae546b58306326e5c1cbb4ad03443fdbe01b9c2a47a63ed38a5ba7faa248b75596034a1fe14b541b3c10491e3c7c2fac09b3f87f4bf73524fdeb815e2afe5fbaebda600d808f669b3c3d48da24bbf20bc4b4cabba180df386185462d937904fabb724df40424f1bf5dc0f73ea1a83ba2825127908b40d41b699a40011423011ad3fdff80e82b178bf78d68892762482af564bab8694c0f11dfcb3b56d8527fca1bee0fc5fbe4f84ecbeec2f0728f76fc32acc1ee8ce4e28d0be2cd118ff92565b48c7e1efe1e2c7c2e2777b3c8c26379e47cf0533cfe8cd1a9762070b996b31515b5cef7c7883e306a82d24f15d8d158e425465647633d2d56df429d0fe4bbe021becf627ede6173c37b3c599ffc5ff91a1c898805d5e85c3615ab3d1fde84703c37b9622b53c9d661626de44a7f307387be77a61c8744dd466217c45e1e44f24f438e53ae73b5707de9feef0d546780c38c389369993d70021c58c01e2b8cc09d97cd3d7b47cb26687c0cbee2c98bfee08d49283021af06752023f4f523dfe901a1d3509916f3fe31ae2ae21767e0d11a4631702f67c25361afcbeb01368da6b02ea98bcb2433706cf9bcc5f0b4d50300a5d343da6f4276e37e4ca57d71ef41cbefa9940b34e5435192a9b4ddce937ff9125511b7ed760b81cc256cbeb2443709307ff55e03127921cc1692a85eb4d0e32a727cd7e4c762c2701bdca85ac3840b3a19139f997dfc5c5570e5fbcb6299d64c537addf23121772e8f46e18de100569f268978f5704c7032465adff57af5d35db80644a465670416c586a65e696de798406aa3ac1999ab0bd814d41917c3cb9363ad738787ce6425a8245882ce430f5e3a3d97c6a065423eec70f644364dc53fac7747b027af5bf860860ad3f49ec37f4b5e166abb2a6648db6a52bbf0d7812b85f56ede61373e6123631692235c96af8e3f6a1568c7e4bb5b2a27f7c7d63e1f91078b85bbc235b156fa637aba45c4e8b7bd1f78fba9a00f98f37732428e0d88626558eb23e628da1f5cf766625daa75602ce83e6d5d53951f6191863e704c6bc26a5d31ac759cb4875d6818df37c48611f0e03c8d90907092bcbc8e3d6a49282dee176808614e099e589ef788c82f53a14ac55ee8cd60b38df2296395467b4b11cc4d4365504b71e9f4018b5bfe44018b3f403953356d01d1eaaa720a89a2f0a8e866e6a402369586b00fa8aed914153d87700e1c9269d6e40e701888c4e3611d92f6f407c5651e60438e1e20eea0f09442cdda2721025ac47135e35ac25aea5508e1e6d408d8704416992d3fff1c6cf2c75d1c34120910b5214bfaec8e310d3606855225ac6de33ae44ab80d301b7650a4e57950dab7fab2c04cf29323ceaa55aa1d1b71b15c2161ebfa5bce88bbb62a8e8f0a2008d95cbafd2f58b13f6b53ee0f5f8774226406fde8b9f2035a9260398059ec2a4afc67ad42a43a03939bf0d533afe4537fb3982063bbd117b1869a537541b6146faa08c5b4acd8f42d364ede60fec7ecf381c54cdf20d941a8f7d3dce9af9b6fc655b4788b191f18456af233ef58683a49fd26880af91b5a71d5ac4b5a58a57941101e8bbb6782d2ce1756463f1161f38accde6ced09505c191d3192ea96959ba1d0cad1b791b07436f7c4a7edd7d41eb94a4d1bc88cdd5a005b6e34f2977944a31b2d166352996544fd5500a10bfb71ad848f29d7becb2e264e7d5c8d69b407604fda8f62c976745788a9590241ac7e7b6a78990c3061978adc607554338bcc9fa96ca7ad94b8b38556e1ac0c7b0b374612940d6be83e71bb44099bb9f473c17489ec19dffa2bd79c97be167037ca18b96e7cb82496cba90652b57e9f89a45091269746590cb054f406fc8fdf6a1681baa54e6e113e4e10ceb49d8b4addad784ca4f3d303a89e7ea8e4bbe0d544d6d9c4896980818e0350d3433287b2408a67356825f8e31f864be8df246643e351b1849b2423b9ab5f1a29ce692a4c2d5041770e81f2c69ece00eec55d599f8ca1f05e284d7cc2b905049836ad71a02ee020680025e4091f689623bbbc06a26d87afba09dc54ab46cbfccd44dc26258741da5c524a1c4c35f32254a82923ef500b14471c844da25b15968b5a327d8d0524b0860dd55163c0b168020216cf1658025e8e36a2821e67431f95ea9531ce7ac7d219b5a9905a628a209e693c28b511ab98d790b835867206e565d2475fad2886006654611f6fa2950a4e22c98f311290b9b357993774ec1e999473c3ca9674f34d7194733fbca5c9a91b3ec5dcb1c1f310ec48c74ee8975074cf7f34ab49feda228e10e8cfb927a2c20b70843618b71c3f39b265da821546908daf1357c680051364f6fb59b1ab8aa6f51bfc909114fb119e3c3e9f7bfa056051b651c2e4eec061e9f48ead5f7edf62bb4da28d489e477ae9a964454929d2b9b9a98c356e2411af3bee2ccc0cce9e3def257bd98dc942a61d5cf20fee5ebf6a9518ca230bbaa48818b098e211d2732383f6386feee8fd193b8fa1eeab98ceb218fd02f9ade5ccfdab6d294356f8762a08d2e8935e2aa124fa4d66f3f47165f35f69b030918313cc0fb5327f28d3551b9e4ef341adbc064a241c33642b071499cff9380b5a53d098cd453360985a84d51f8720a04901bce62a73cc97eea468c95681cd9f09c75f107b97787d0a21f9b076021ae7b0f4a8dfc29b8db2ed7cbf45410d0a2438e789fef09a4b707f80f523ea689d13c4ee01a72208ea974c811bebaf3951e928ce22cdd1dc42933630067771df34dcd52b58037a8ce7b6d151252951df35a66e89feb1ba988e9f7b71f0fa2b3899242509a5e01dc4f01942589614b7dee21b1a42d5d78faff21fc785cf785648ed9ce752a1f7096db6c7da2facf57f4b25ecb257174d34f74dbd82b84e334b8c05878e5427fc6835f550e61869423ea253cf233b4385f228dea20fb93c0cd370dfaac5df3036797d21af38e2514d90ef0d7eeceee4df4c2432506c7e1c730978a079b1f57c8563f13460a802337aa37ec0f38a2ffd72a36e1251e99febfb2d6ba6392d8398dfd3bd974776f731e4e064f5c79cb2246a38b97b17fa7fddeb8b042f8bc9e7d24a1ab807cc32f51062afafb560caa39f7cfb22d10d58d0a6a6b48eabfce3fc4792a5ac6c53993a07931a1517d4fcaee1a8c326671853493728f336175432f74a5e7d7bf285abdbd1075863f8a969bd6ae388a59185a17a0b726c87a828cde6859cf19a610b1f37ca1fbdc08b00350a4ef49a8e1507d4e749c29c1b580abce411a5a80d663901598777223f2d0069a3104ab6edbe6db6f127a72cecb7102a759ce2ffa3d042ebfbc287015eafff100095d586a4fe9a57164c9d0404c240ec5b7fd2170a0553fcf8cbda0ea4bbeabf0fffbb9d608f8f6035ba32da635991ea3233709b764937425a34893bb89cbea9940fdddea0c006e0692613b8934cc7951c7d08f4d83c9b9a72f05767c788076432f653df342832690cb98ec03d532754710d792bb03fc41f48b48e0f38efa0c2cc33343ea13dbb40e05d44cb7e777fdea8ec6977c3939ee07cf32a389f7f01b4b8d391b0d54712e032bb2abea96152b3e0900ecf977c0532266096360ab566956bbca81492914319582fe7d893d72470c9a31e6093728143ae30392366815f9c43747da68a5f781dabcddceb1594dd636726dd9bf7dfc7353fbcf6039106bcacc930503c598c3e198eeaca833b99cfa000b0e5f70e924f31a4b9b06fd21a4579a5579e599b17eabac0ed9490e6a21511724c39a7e668d062d2742f041e32572d491b719a2b0a0f3f50e7b79bfa4b566941fd1f5efead09283bce3d7a696e2748a4a6a148b8616dd26227a238496a1eb8d5da8116e7a3a9deebcbb3f91ce7e69cb6fe39497ddbd1e73e51e7a3de9cdf5aca1f64b1925ca7b5af52de85bbc8c83cba41fd9bd358488467313b5af30abd9a7a102ebc69ff007c1343fe0b92f0ed219520f942b18101e22280f4a2cb4be20ab801e683b07566b28947461ea255685468d6be8da8bd749ef31e8f72f5d482ab35b0e3e2ed85df5da3c06e21ed149295054cdd983efbdcae5aeb5dd8cd29082eb76e5ace2160cb2ec66af26cf8f57be14f2db909fffa2857f33eb4f49c485d5bcfe8794efcae8d5287542077043597a7c2ac88baf77916b64058364d1883a10b35081ebd75bf589f56df211bbaed5238a52a31a81bf97a70a02241162b3f188c9cc46fd8812bfb38fa212ddc2e7e0f0f3236c3340ebd7f3d22e3c59381c7f283bfc22fa185db96dd0b2a8548560a4463556d8d4347e42e264e03d1dad082416af612f782742340a053443879453449bbc22500c100e07c53e1010c96b7bc310c5407b827c6fd9306c401e8a340c12a816937ad8ded72ce0257aa2123e4cacd16998df3798d3804ab7bff5a8f4c4dacc76fb794cf8a71105833ef35805c7913a50dd78372a61f79d163b7e98e511dbcb5aa347c80b04773be5d1ac2b0fb9b46c496bd01feab63f44c9731b34655a26e81dbb857a323db801872330dd39b064c7a6187f0d6f1a804de549e6336bbc137efa75d29946a678a447ea8f69bd4c0371ab392b77c45114616b5c8d5132ecba0d2b3bd6debb9c60c60dd72cfcdcabc3bd52df44380c692def3003b041224be775e2f25954a8531b8e02f9c6d7a23df1370dfaae590555f7452258ccecbd471ebfd322b0c27e07605573424fc0b3d857e2d4463cc2c398e3549bc89a99f6358ca97f2e9258fd6e8cd8e66dd3c9132220b1dd214dd74b74c6e3299c6547486c8bf75eae3013c60975f547ade016bf628eaa6625736f1816284bca08dbf8deba2e5aa7973bcdaa599510b2afa7a4a09069686a75cfc97490dd159ba6bec4ba574fbcd45a533103c99a632f6baf0d84613bd31fa3d542bd6aafe273d07808721ec4c5a938b5f3b30697e3f979fbcb76cfae5181d66824a83d560cd5c98d4584725bcb2ac53cf01e407f7f646a3f267b0bbb94aeaf791f357854965e3a574b16807ffbc9ee17936e7576dd025cfbc125759864657e6c4d9ac330efd23f308b7112167c3c899ba9d169ba2cf84e395006a872d7b5a628c49529ac1028255b3a7ed3cd2f697a3afa92676182ef59b2222618554f16432116068b7e7dde2a6e1cfa291dbdf8989647868b9b14419049700d8dcdaf867c794387e4dcb1e272f9f49b8251d3e7552417ef0fd5807f7ef38720c5161ba1dd3a187c903f6ea0ae50c7a700d4ab9b3834c9c7aaa7ea78d758df7d8e562d5ac16b0695ae5563a3b6329d41dbb81af17587f00333f6cb27faf3554c300c5a5914930d934b3b5b79341d246f4cf1a65f67405b3df413a7f5bc475473214fc5eeceae7a918a3dc6a53e7b55315d5598d9b0a9479d56aa143516223ee3a052a7c711618af67547680fea3c278432973a37a8fc56e12b695aa1828ef8bdb6be00f89d787558b4e9597546212ecb2a6d72239a9463c93ec5eee27759e1a19be9f2cfaec8e54c625a9777a7f9589a9175293c05cbbcc6ad416412d6586e89d4e9c89e74e28103620a2b087ea3af1cf515077727cfd44ff9fbba9b50672a3e4ad96dc749a6ec8ac7be298f94b90e9942feff41fee050af15ca978a4e7ca7c21b5af31f7da83014af797d4d303b99641783ad43166a2b2446ac234ee4aa30d54fff9f9471862bbdbcf87323492da19a71bb3e82093341be508b92f2924329a33a34910a034c9cc05ab53e55b33dc7425793d8e6631917fecc28d34e1dee20f233b03c69f518f6d27f4f614a661ac04e2e0ef83ca521b17e12a5aca8dca0e0dc3409a5b6c993f037a460443717762d9ab06cbaa0fe07283c0c0b4863226a8f520fce244be3c6a3297d10b9c3fcf696ed231d79f232e10a7183d5cd804c153b68b4189f9de665f3b9c9467647631fe7e3a97ef31e6769a6324056393420bb3c6c13217bf4bd34187238019b6897e3c81a6b47ef7c031a7b7d884717f18d0dda1b99510f5b7586d8562b40cf1a671acdf209469fc303957b8f16a5ab8d95ec968feb227226060fb504bd75254d60a027d23c5f50b11691351b6476c1bb2636a8982ae17ffd594bf1f2bcb7065ae6d5c0ae89268971d84fa5f7dcadd865b813a2528a88a70bdaf347cab3ccd25123c221b5b195c5fba1c53b2cdf57f8c7aae4ce3c313f5563fdf7e42e6ab7c3dcf894614c9aa7fa3cb3addd1636c8aa49a082a7d2033d0b1781ebea0f386899f592a36dff1a1ca453d041f94f64d58ec403d0921a3ffff117a727dfb9f124a67f06aa82575c3acdbf619a409461367fdda167fdf9b753dcf2d567242bc743f7fcdf5ace48065972302fd9b8eb36d9b00f804ce5b8b994b65d72ce2ca8e77de8a174fbbc15be42856d2b3c3c1b0858c71e1f616f0d565e86ba28c3adfb108dd52546ac5a6ab90942daf4000247d8eec984d99bae444c488c2341a1a84e05a9f82cfd6d3d706eaa314d4cc675255c1f873d10b2f1999f3071f3dd384e7003dc12e429f027be1b3eb574edf60f18d8d93f0536071b86d3fc29cfb1c0ed6064a63ca4f76cc5c93a1b7a6817d25ca82dac442bdd0ab4a497e6289968d76c18d3a9da7c909eb8244eaa7bcd3a9c8ad4876ff292007c76f1975721600343ba831f1175ad02929a390eed0fe3ddf3c40b28a3f485d3a2c7d452629542518d9b270f000252d9428f1c593fe22cc984936ab67f36fbb0a775d51f59d01e8b604fb7d582ba41cd7125ac875f14fc8f2384c33f196f8f0a6a4c5b35f1e12aba801021a1052539fa40ca0e8a378c8d5aa9f5ba22628179ecc701d44430e751b0f47890c5295d2913e0dd8f9134aef04b44da6603b4758d1e4da7b87db5d1680756669fd0c4238d73f3ee62a9e2649a5bf68b0b10c468bf968e7700fbb558f5607956ff34161b22898b03e57b6488c75b1f047f5c87752e3a3c8d36cfd2d46940292c1d47953f257c321e912ef897c730cfffcf7dbbdc5711335c8386f280330c7ce23013ef3bb48220cf97d6253e87626ff8e07b74943571d6a973436a47a8a0cd47826779419d8f1fdd4507871fb00d596026c508b3dfd0f8618c63308fca03b76d0378972b127df97e2c892837186822239c6f719036d9e761dc6d99b01cf86446a7d2d474ef085e74254e589065a59805c2e8042c17568a75f7ec3d949ca3369ad779248d45a9fab63c59330b7c6524b734f6354756583c378741ea65c6f661e4f76d5ff8acb47546e6d80af278f2b8ac20dac53ce8fc22588aab7aa7cd6610ca6edec0c5e4f41ff75cb1c58864f5f593c591806a2e98a1376f1ce68fa028e163e4fa13dc4c53977f01a7c2bd10b2601ac6498fe699bc31dfefc3af7aa4f0b145362b95b718bf0b06e57db346899a53097c4f90f8539b20d0483ed48ec2297183787f30c5e08a78ad1eb31ecabc4dd54f289a97ef806249a3e5c0a4ccbaefffde76cd69135309e42bc310ceb1a703a0df8b8776f5bef09d32cc58c4be8e5462234fe51aa2921685b4a8a35cde03a37ea865770a075c79a1175091748e5247b8005aa179f4f4c282c46208f754e32a989603f6cf0c2112143ff5d9c98cd7b8438df162206040dc7fa236a4d7fcee86dd9f2d91adbab205f9f56c028dbff65ddc45464b9aecb1315917fd07aa402cb46ad9260f8a65e2284c6c5cc28d5f0b791a70cc053ed3d288af8377a15d681a5b3d4fdab8f81932b1b2aed73ec4aac5b16b57fd4cb603038f3b1bb1529fa9f303fe71714d74d559a60941f8bdeb5a135449e0ce8ebf17128ce72367f9cbb048245c49b82c696d96eb984072976608961efe098cbd092c465d8ec12da1cc87dc002e7d7109b47a7ae25953ce78ea0fe630371da2154d643487cd183856fcc6f4efcc13e2e3a91ab84491cd7890f465653c61f09f88f91da25dfa443bb7d0d47e326122fa4b2ec5d013fb80e3b4872f9ccf137b8fc6c58c1a023591065f24e4617dcf7b5f3ddfa40b24297c71149473766cc7d30fc04a4bfabf4d4a33ed232cc2e7bc65e16116e9f3cd760c15ee0d571954c3449c5af7dd0dae273e4bd50a7f8e1d3b381f2baeddd3ac8f7e89e9d5fe75d538205cdc08fd3c194c6276c2f488ff739e4878f72445ccb5091a3142f60a59e38665a7a1ceb3f1c7bff0cf047b6f7bdcc66aace8f3bc47e25b0d4f3fc3b8f995fd1aff93079019b7dbd6d03f69620d420c9f541f9e93de3db5d6123e1591dd6d0e4b7c2fe729f1cdf3940e31b8465d2212b419d4efd3c476a3793d1d7eab55bc6a43f7b513f83046f9ab9efad3a403de765b29c99d3e66bcab5924451f023e3e4e0de3850ec04c3f7da647186a72950b9a7c4b84122a9dfd358c64cd06a813988b5be5d71454b8abb8d415d73796bfe873f6f8c65c7bbe9af21b60a72452716d14b67fcbff2fb26dedf31eea88fd09c9b48ce5788e2372249b298a22f39052f19c1f4390de2b49b4dca4df450d84da966fdb39aaafd2fe630555a4e216b4d9000becb8499da87db867665a01564dddbca5d7913668672ca526cd3fcbdf7d76c72e93d7c5ed03d08e3abea7a06f15e83de08244dc4f52ffd39592f631e599612ef83e9f48fe3601e3f5a63d897ebeb92f711ab311bee64a9cb9eb1154f078f580c96331679eba5253eb7180b8dd2d59958952a7163c3ba42c12400593dee7f192b9c27aa559866a070a6af2b3375af3eb08caddcf23351c4c6c9b987bac5e88656fa8c868b1b3b80e8f43174e3809109dd880abed5b63cffdab5927d417f93a3c9095268d72412f662c1c00c9a357e21ede9e2ad2889cbcb6b2a19f8ced00c9cd34a841d5db0d1b9398b5a055f34e22fc9138390782ad01ab2bfd208511bf8a4c6bcded921d00f28db6687a131730720b3865d9215ebdbce37a4bd3c4f0d44b3ab7341dbda301072dac7293d54aa59827a30b719ed3aaba611b31ec4601c3f7bc55ad042bd2ff863eb1374930fdb0120c6f4c7dd722af182493d3ce87968ce58e5cc68abfb691d343b6b4bf926043060b5c16ab458213521b2a88586be3670c7a82ed617782cca56682793be9cc02b48c1a24e6183c0e21f58b3c1a44312231d12ae9ec3ad3c6020728f92818c79e206e7583012053a7650ce57c836bd52cf1c19c2d0882ef102e676c091df51f8f8d8b5aaf680f06b3135236b8bd2ddc77645af084037c5caa4c4c1cc9bd1a9af192964810b4b3cb78df6621b29798737df05d27876452b69e82785b5999ed098ae6dc58ce30c66606ae7e5caea7f65022e7767865f1d27cf816d7fd7b623ff40fdfab4913e614362cda63135fb9124243854ef65281264f23e390e9ff1de2e22448a53362ec4e983c1729c0538ab83373804879e8a3a479ec40e4ee939729bff5ad83730a5773a84a83407d79c403082a69ec826e502585835a442c51737eae9084e17473aab8c52d346b4c6bc5a155fe978d8b2641e6a694782e44aa68fc5b3e94965e41c6673b3f7a97018549b7b018011a136e8ddbd99af677c5798c4f0f8fdaf92c896991b2ef76e36b75a20dfa8236e79b7073fe6343000394822ecd0f39e9e86e4f6902d3508761a283f7c486100f6b065537099e38ff8e8c3bc67cac1fb0279a6b4ed0b31df53c081f79e01d1d874a51c23fe626cf5fa6ca09c6f314aa223393cd842e4a17e64aa0b58a675433c02da79aa18c573e3ae9fb226d81d4958f1ae931537df44227939f017718c0864b8dbfceb76e03b847754cab646ee8dc76985adf5bcc259657c1b27f8b93fdd6dd834a1d877c81d308743a9e080ddc2759201bdc4a4b04626f45ba465a255c10510c954c3768c4bca894a5ed8815e602afac554a4fc859c9d1706b010113188eda3cd9e11d133280746e9dd87d7f845c7fdc96bfbef7852324ea16f472da5affab71943ea61ffe9c05561852b23fafaa1e4febaf206f7fc4f04e27a32e5d6156a73ff423c72949c65963035bfc702b6e2b7ddbce9116cfa79d08f216c5b6901e92a9b8bc138d81f78d7698f2398b426cacc89a3e11a636a0d2e09ba67f4f15d15bdebee2dbda501ec70d37ca5db2dcb11e073ff480e9d50171488995e46e65a014e7ef223925518eca9b4af239deefa98ffcfcf55b6551700c8007c371b23f81bce8f700bf26ef12bde59ef5768fbd66e3acd6bf8646465e5d1fc94fbf81a7fa6a4a8aa128d901f8620231ff89c174289abaa51466f30e4065a6be8c6e15e7d1583e01e78e48683de11416199ee6021e0961d91709a37c9ac4b8d3940b3ff676f83030f2182b135820e3cd3a40c06b89c10a8d622347961cce941b91893a1327308f5b6ca2760012a3957901336e6a4a853eabc3498c17b09f4e09e8bd98e297cd9279162da51608552f2d2162d1fcc022daaa4f4adda9ed8bc8f47e2edfd6e2fca90bc9ab5d23377f3d0ac40e4846cf9d889d5289644cd94e6ae23216cf59f29a8e2a2e07fd24de6b6514cd97750539a960b712e93cfb33cccf7f45860a9308e7659a90578960d690f6a5256c01567f6e7e31961f6ce79837e35fa23101544b9d40a7ea2e88bca180c33add2fdda685f89ad7fc18f558768ebd97192064b9d54b5e7da1b256064b9df8304356c10d62251ac95cf5ee30118d7dc694009409472b1e7598a59cea89395513e97032c2062bfa38979464a51f18ed961ce5b52f307455f75c0b5ae5c8a0d813c5ca7adbbca9bc5bc13ae573b9bcf5eedccb32703c56b0e889742cd06114987a37fad8de4f6782c14a7976e23e36410af7d84c4c42e156da96c5f53eab8782e4f5a87f45de36d579c27ef434028ceb9ab23036023744abbe1fc2108c1eb7f0e08d32e1b0b5e9b99e2b94874d7c213e883ef5e67daa17a821af25e564fefd75f9003d390492193b734548edb4841ed27221129da0dfd343e9d3b525ee37768da966d74549908f6fb78851a26fe594839f1224ba87ab3ca7d500b7278fffa2aa18dba8972d4878385d57f480d6dcd4fc5ecee98fab82c48eb0fdabbd1ca8175f5e118500403b5ac7b3c3ff1ae04cb81eb196286194321243a4063b25ac96d3990060a8582309a389c8f8272ca13ecb6d7358f4e1ac96501cad925261342e86b5464ed9e9d7b817f3b8005e382603e59648a83aea694e22a6122a0ede7441a0ceaeebf0d86785119debacba6bf634cb2bee174c8f85f45bfc5b35fe7d961d8ad4eb007037d4b4c83bb8cd1aa9fc19e718c075f74d0622d9c4c9e0bb5d0c2a459c4ebdf787d40b81e0a1e216e71db8de8707cbebee401d8f9d722f45bdc8c081b1ae91929a54ad99a88bbc4d2cdb31d38bfff7aee2b9f396ce16b8721cf95ddd73aedd64e0db0fb29c5427659fbe29aa1fb05bc41044f33dd369a9bbb7a4b134f1e8876096371f8031c089e02f788d74bab043517e921a8b123f8cad3d20d0ee575f38eccb05ddee368c46b87cc6a0eec07be4244078338d308efa1ea34bd9de0341efe9ea4e4ff5bcc7edfb37dfef540389ad557d3e03318d716d8f7ed9fb7074e1c601c21a78b48df32b941f6dd000eeeacf88488da287980380e9b61df9d3b6f483874156ac90d2601ef3b8d0cb6a877970918c185ade6eda0b984dc74600290f10af74a1619f891bf40c0a7abdd04c279b0223a34caee25fe0de0229e5ef37150c2e877a468b11deb816f001b849ad021a635947c48f761d320c090ca8aa72e938f028043b4d32de615f1472040e87cd29e428376f2316831d1be6f862b2598e0cde0f1298906248325b661177208240df3bc911387cd495ed4c1f0b881f929f65775f6e3c83b0000815be116ea553c60ce9029a9278a1047090c5ad12c9cfd5722278ea8bf969de478bcb5a0095bf39a477fe55e3f7b34cec6d72653f5ec7080cd1d023dc883a701149df4ab1f1307ea889eef64a654f696258795a55420a7e43e16c0171aea9a117706de0c960cb061760843bc8ca372aefa490513d15a0c7c7deef70fadb405ecba1b2c3c1d1d3c5ca0e7e0a92fbab6fdd537d87d368f4087146022fce61fd263e61f8779b281fd25c5dc55da20990c6b3137f57156fa372c83e3c0aafcddd17d4a8e3cfc233bcd3b2db43cc3970102e6805ee0652355105275ac3c0eba26f259a683b3283b805b9b8cb3b1c2d8b3a42bb9d5465b8dbee180badd26c515e77053a36d21440c011ba0931fa89bd3052698ebbe4bee39feb707d4ccd1c88367e7b6a122bc3da71b8902d29989d6deecdd6ab1cddc32f661f3e831c5fdeb30f49241c4af2c0dc46205469eccbef67557500cdb4efd0e097e914d7ecab567b5b3ef409d87b88b6dc9881225c0cfa3069bf7e620e24e099e1eb2fcff3acaae477af9affef4f499cf5eb7cf7f7ab24c663863303e8e8504b4e11292602c7a4dd8340d93c3cf9b7ce9dc753e9d8a1ed92fc38a56a2bd45340baf701e38c2c5fdfdec30f5071103a77efaf0faac08cbd471c0db334bdd134fd90932dc59f3afd4bfa4ebf4d6bfed32fd767ea97e132f4e4baa87dc2df5692442e07b52cbef9a73d11c7ce8226fa8992784591c431be580c83ed240c214662265fc28c4baaa11ada9944da37b68e13a760bd6f33d6a3d0cea7e1061c66490f37c4a26d8b6c391716dd847952a42a4e6ec2b68eeeeda913080f29c18f703aa378f1f824afeb95059fbec00d785bd9737e5f08ea06cd593cfe8b434dcd1b7dce08cf8aca495002f0404450ea1a8779d177766802058f5543bd0865bb43f47d936eac89d41f605b364b17607852cc9a83f2cc12aa2ab7a92725dc776637eac5992c6eb9c42579da095d7b2dbb750747ef417851ca5133bb72c80bfb878e2a3e39af9e8d62c6be202d00592b18c44806c13b944cd7cb14fe1d450d1be0bb309e271e4446ad37a6e03d35616cb7bbfcea08347c10233b47abdd23066fa0dff50d8cc34ba55c71a7ac4b45d62443a82b68f7b10161e9b52bfb1f7b1298cae63158ba8d817f1e105418f04f4a4d833a39b911ac5292fd4a09f502e7fa596397a6b395750ed46658f2272e3be9dc4467cc74fe6937c8dbaa6c5e1d714ed0ee4e209b99c0d93177ff80c016f0ea2be70d4011139764187267de6b973fad135865c07f41741dbae9a097870bc8bb2b3e718de3831dc803d68c5f7797cc3213c406a6a2bb1d673ebb1ac02f25146920e266edf6365d6362fb1d11b7ad280cab3135d945f125341754caa05544350c89674058c229ceef75eab7978fa786710cb44fc127736179008e03705254e80acc01986490732437593607dadaf25a93a661da2b2158ce68e07279c677eeedb68bdfb7789c416c113eb9581c0220f1706d4532bea0e0151a327ef352cd573930a85af2635f4ffac82f8af9cba07bf27d60e5e9634db266237c82333231f1657f2153a8a7c6e3b417ea8c758f8eaf05b96588d1d3f4551aee0a6ec9e95151109e7029d3be7ce0ca31345564cb3d369f5ffc140af23f9e7b9a70b13d619f9e9ca98e8521d2a2128a06bfe8e11195291eb0a01ee42adf94f98674cdf46299ca86885d89c652be99092c72fc6de1d746f1e459d2e1e1176c6f7d9e8e7099edafe562a215b9e17aa7dcd34963ce20b1091b0ec5b5a41e7c2dae3c03a1ae3447f52c2439222ae764b26b42007c9f22d80b8772ffa437523147a2dd14d249a396e28ecd35023a53c8fe08db0b1a29b126b3b52b9f584385992666bb12129054a2a2a4cc62f55a13bc6f248337659f7d8c2dc8ae603453e851ecfc29c57bad68ab0d22b16dc22f28291d67c5c70cd1f1c398b3fd5e591b4dba953b631d8d8c3fcb43d201f6953919d55eb7904b4fa506410824921c43e23ae9b564c7934220cd6220523e5ba1f624518cf0289d8c6892587b1eea9d314c8f861f4d549fe35fb7988cb6d8a63c3e16b9bfe7fb807fa9456075a2bf37d351f73f4f4de6d9e67baa79bbe24982517e3fe936b3e607de35ffe98f827209421e31aad2eb5b2f9f5a5efaa97300906f1610b2ab2a18544443d4a965d9e69eeafdc5db36b1c59b1b2c2b7d5aafa7126d6a7cd8367b9bdc23d6299cff4c26ad0ff504f0175844687c0a71620d5bae28ca63382cd631e3be0087f1bc7bdf3f610b9e9dd375f1ec204c4b845710d854b58e66b455ecca7544afb86cdd1cd492e5784bd4102f24596196397e683f7d21ab018066f5e2c4d0ce654bba84eb7729b6c29076e9b5a900892220fba6b722de7ae6ffa3f4c1e0751f70fac51dd58f60b21f4e188bb25cd9e027951ef2d796e015579f444b89384644b2383ebcc5a418f7700fa751d5806a833d4d641c0f0075e9c4bc828d31923e26cb36103a2afbbe967743b880e8f88eb4536e9fd9882b63f6835469ed0656ab86fc335f86298ffce793f429fe92df6c3d10b8cf595c15aa78d050bbf685268fc1b33a939ce3289bd0bac499530c3382b742482be7544881e8069e8b9301621e4ea33bb1c25fffda97bb516b9985d4129a6ba7d3a377a326ada8dd09ca6a55f88ef188cfc5ce652d3d831f741c4397cce1d9f76c00b43db59de68e53031bc088b2ff34fef2facb1575736cbfb74eb832dcd03118768e4dc0a5e0ffe2fc6d55421598b2840d79fd304a638c531371dd2d8ad8e674528c0eaeae678561881924e6a4b9cbc74374a5b6e5fa4dee4c3c4af5b8bad8acdb263696a91ce5d534bea8c523697cc8923c885d1bec45c69c87eac855097848792f327e95164ff4fde3f13097d0bf018aa382dcc2c344ae5a537155d2ee1f9e15507af3700e281159f16c785571f5be05b99c47451803de32a942799547a071435de616b7779e2ed7bdbd8209dd91c0779c002ab24061610795290cf18a390f839239e3f6dd8291d621e3c356b554e3fff36048ce7780a1eb5ac2dbefa6af625b80accc3e45b4ae370f50aaea458dee878c01b13316091f4d51daaeb99f50f3206d09fa98d82b91ed44e2f6c3edd13dbd29f600584887ae71a0479eb0d5b3f8af98b4a907ad742dff3386a9ef162e72bf3cee2f00e71fb6634ce7df1c3001d3f72eee0368621d23c7b858dbbf9847efcd71c7d18b970e3b4f2d47a7985914e523480974baf4301c47bdf19d8de8151dc4a85e26fe024c07fce863478a02c61eed7ffff865b89c3ce478194ee90a77cd01ec201334e9f81c77bb2cac8394ff8870dd5296d8999f94155176bff8a5b965eb34ae40cc4a5c1819c48fa612f3640f7fcff5fa1e6ea30a49ed5dbb8502e50d5c504788b2b60b2398bd23b3759d922e4e98bc9edb304116bcc10ab7a3fef6828ade783c3601efce59bd3311945bdfb502a31ffb8fd932d1bafa0f5de377048d86e29eeec4391e1aa6ce2e9db037bc41ffd8d1e897078c8f9f182a9021429a36fe62a9c9ba18d4226b536ae49f301489ba75fa3f58e1a205c39160a4464a315067b0a52e721e0aedaffc4b6c4a8228aaf1a539d98173d164fe142d3813b875db9e70e03c4f2181ce66481972d1414cdfa09c82bb43efc536ab6fdd21b80501a08c4bbed74584ac41de5f2d6067d35ef959f995eaecd3e5ac69ee77eeae20ce5dd3cfe0853592947c440605c9ef0b9acd7973878baba569de3582d83a33136e8e8e1fd9cb24f2e5bfd802e4cfd23ad807fcf7c63a51d7526f95e91463ffb18e005a387adc60a13ef5778ba34ec8925e8ed3ffbe310d1b4461b351b4c141d14d1222db2c253b03b190cb23a04217f156c4e647432009a28e3775679fd74ced55bec35723ff04c50f6d692c170e54f76e716dc1fe4aad5789894277a1df2636b1bbebad92dc23b61362155167a381de70de8707d1b50fbdb4aced8406f44d4033c520199157346ed71326d76b30188f143819947488d738cceccc487a6d1e038a7d86565bccc8edf7b6b3938ed15f80d735b5e8007e6c44d966ee237240dc21a5197eaa44d92ff72b03eba0b6389d6539ff9499a0ccfafc2551e29b0fdf4705c4078f1e268d5966d75f95fe2e0456f1fba49aac440a681ccc883a55e5c19ef34871784db70a5560a54298e76e7b06745cda8863b3f676c15bb6613a7c915c2034af3fb09296624f774c04ef722e02f3ec8a2364d0d9fb20567a4f61d9335282821110be8936b829f53d2e6e3508300fe28a3644caa3224f47339b9e7f31f36fbfbd4c3a7be00e3d32f9ee6fc32836da0041918add57bdcf05e4e8080610d70e2a1e8a20a802c03ad910f099678e745e525ee7bf1540dba755454b6597c9d6a75a90a02c2bb327ee7ed4ff3b7aaefbe50e9157259e7bd77d7df8b4be0b171f7e60fcc9d81cbd6072d22c592c988749a2daea53f98a3dd8f7dde95e4c755d7a99f5c84a05fc923511e5393c06ff2dac0bbf237bc4e4328c029e0d93efe6565df99ed23e2f082c4586539c2ec5c5ec4d4f0492744dbd3714d30bd45b6b3334917ece6a30c80b545ef35931d1e7fc3b4fc26a27eed764bbb65b2c62dce814e3f2614d2a875c9affb8ff76397ed06720e2accdb3baf244928eb1a589db95d5ea94b24e6f1999e19ae6377dc9199af089e69c0e9489a59efaf617c20505c6e8fc9ee03a6ed90c9e4e8628cf7be9811411afaef14a58f02a262b550e492a45b1823ee4e8cb1df808caf822fc97ab434070dd1d0b12f344dd01789394745eb40302107efa54886c39998cdc599429dff7491a2a993f2707cf24bc4cb81a1220fa83eb75cfff8cc0673db93141c58cfc986877a913b7f988f17f9563ae9913b4ce33f4c74eca3135f417bf9f436e84962e36cc0c509fd5ef7fde12e62b35e66dc4dac93ce56a1488e21a0b89886f87b8a778f6065a94067eed84e65719f9567614bc13da7b5f5b9eeb386f90d214092500167ee0ec7e8b7d719cf29ec547a130ce3ff94202eb77e11866699b0d7d9399b1d571938528b182b160cf85d798b9df06270bc24f691ed4738c94b68fc3b1fafa5790e5358397bf086ae51aee074905607ee78ccb53835edb97037cdb4a9f7241de0eb293d1610e1d1b55b00782b5b7befef625e7f10ef7cf2ae87681e80472df3295ab0675253a3c8f36b1bb22bfd8d7b04acaf76bb20e38ec6dc779cf5491ee0c2c1263ecc247ee16c69fc1908a646e369c40b4ebf12b258006b6156e564a2279d11f08f704ea837d944b7d42350bb35109f0fd681698697682733dbc8e205e5e49fb12f2bf7de4c6dc238a7c45d76a9c9c517b07c4c8e20b4ab6b1567a55e10525b69c36dcde8fca80c734cfcb8e8eef67d13ab4885d5b53c89584effcd40d3f4a20fb5c2c42dca73d60a56f2f278b87d8cf0eca31df28a0414728f38df8039cab41d2cd2471de220d8815a4cae114d759621ca99b7877c354ec44e1fa87f81defeb2f5002a684a8957369dcb7ed84d0e6e8d81a79f5969f7974998212cec03dd6b6b2bfe508d6a860e8740ed7f5dfb51fa4d0ea63bab8c2d12ca465a1885e8212225f6125c65cf826c6033c052ef9240db05cc9fd7266902412e1a456d948117611e43761b880c1be5e54186ced75a863a01ca7c0983d082e1bf4010f00ed952923b8d3a07b0112b3fb27afbd520bf53c78bc664b86bdba554390bf3a29683cd3f316869d8e0812b78c0dead748e92f43e2ed1127d4dcfefc9c3eb3539dfa4d18340bcf6268423c2bc2757cbf30ba37a8db62bca57866a6354e810a6fb850d65d14ef2c9c9ef3e45d36c79d31872338dc56b0febaf48e083c3fe7ebac7786db2500640acf0546c4a4b022e2e7f53705324d2d7ddd2ab03ea4133507c192938deac4b9278199a404e3e34ac35609f9338833e934dc31896799447d88032f43871a2ff4f040292bb874004a8ac36278b1eecdfde8f0f7fb0dea7fe8637e9470bbad00384baa9f87ef02ce1355e89546107598d78bf60b23fa9bd5a1335c2ac7abf39a8309fffebc52dbc77fe3ac0be30aca9cc4c063c4d1ce27d4d32be430c4c922db60d6a8c7641458229f58613fb109d803e0c2560b6828d00aea5fc3de827725607a14f1d055dd251131914b23fca8826cfccc64929ac81658f8e0570aff2335d6c43f77264e0820e8053516d17343a26173f8a14e3fe87a26a1a18d395aeee80b9971828022d97773a500e3c0c53b4734a47dddec72b6f180d4967bc473a3dd37e0396b8ffb1a53f8606b195bae7661401a5a881a743cf8ef59a075637327c97891a1a17d3774c6b75f616ff3c6f803e63c3fd5ccf4573361a3bf9df9d1bbecc730b90f82048fd96079131f5ddea17c21db6e7f3b7b436f815aa2dcfcc8012e99f656681ce33fead2dfd914ec390429940ddc71c0326385d0f955f9826eaf72de18f2a3f9a8a6493df9d868f437c5fd39141b6e9398bbe0890fcd799319c8de0c5b2a377cb1dc860526ffb60469624c0dad187e3affd2b43fc06ab59fd58b511d1d55b97dc212c7ae59b5a1562310b372992a2fbd9581afaf7c915fe5da55ec136698f5e395466512deca25ac1fafeb37792e5e2defc5b975ef7bf370fba64661f4b43dd260b5573cd62e1854d587106157858cf90423c529e997309da2285540d2cb01d7b5b883b9d7c6a73c14c39d78647f957e33fbacdd5a8edfcc7d3f36e3269c8fce1f0aa2c702506c21c059e80207f40f99abb320ccdb75ffc509f34763fbc1d6a04e524e68dbd0471fcc488ee8d2216ef1feaf4321f0cdd08c705df2bc6beb16cdc1d2571ff45f17b143c859c832076a4bb5705042a54eebbc5d3eac00c5b063c8c97c4f7871edd7512756806a59761fadf09d0dc2325abfb147719ab31e942c8e6115ca0ec4ccbfced57c82f08103e4130b5198722743c11b5a658a21a768a21e6508e4b9d1627a3de02315ad3364dfe8f0a0ea3b5d2ae1a5d87d6dd0d9101b1c553ab2888826c0bccde7535efa7d7756411da3a12ff0ed1e5aebc8b2261b3b470d6c5e900a2c084865b4c8bd7aed517f80e76bf08b975c41b124fcfc6e86c21ebcfd270da0103616874a8a9d406f5e036c939eedcf817ef31eb361863c5f8de0e42be05e4585b563787055bd299bf31a193701c18d1a0eb9301f14dcda9ed33e2613a98b31be60da8b9ad9042b59ddc1c1c41418724eb5ac9ddde86d9ef2534aaef0f5a1ddb77a3bea87d949cacc971c542f5698ae1b57f3127e784227ad879273a99aae8399ba50950f579227b2ec2f5c23197645955eaa3cbb104fa80cc09c38314c6f783c8c22417551407bafb60ae35d4abdbdbe6b32ee48695ed8ac46e9aee54d17a507ad83df2c53ac0f7d4163445b4819e40fb923540000516bd211e5ca55ff262fa51d635dcc23c27fdb4c7014e4e06dfd5d3d9218dd2c3d7e91e00dd1e5204a203055c279835905eaa87aceb3966a0f8e65227e70a77368afffa441e7e5fe50e9d2da2b5f010e6cee3f52c40c9d16b0dcc09cf2941fb71b084f588c84d58a4b19ac42bce31223e3ac8f395ecdc6ec821f727fec50118820f3e860c1dc5c783139589e8cc3e00d7f74043c3327308bf2e1afdafdcfdd0ca34a76eff71583c6994e6ff82d504b914a6a69f09ef6b94112f142c6afb6375ab6dbb8e36589e5f0a779cd72d5df7bb12d15165e6e88fd9f1f6efa0abacd8df27ae021561accac2ab45f624a248386c4cccf6d951d802ff96d0835421a36b05407ea9fea1de994d4550078ba3d0c044190c87056160a98b14f87b298b71e30bf9d378f0e9b6581afe3dba208b9da52f1525b83b8cbe8d532e6e5af41d6bfc471e8b7ea413ae676b7da23af550b9d07504342fbc5e6b639e7cc97587ed920647b222a5b82a16c90134b4e51bea6c8691df182afbc613f3e269fc053e30c350469f9586e72a976deb817bd605df989bd28195ecfe243a2433cb85aff7bceed38284a47a8d153e5d2eccef5f101524aae564f8609dd9c9333416cb377632473814398d54c48802de72f5b74c9aab19e8bc09fe89bbf17a2566361c7b4c6112767697bacb084fd7b2437fd0309e5ead51fba5e833de354e72e0e1226841c000ffea771160335ca52412012ecdb608a4b124503b8a037843bd05f71398fb965e1e9ed0dcf030b8dd67abfbff3c622162c97d36d93e2898f49f8dbbd37673317367bd1e32f7b20c55e51596b2929f6c1338511f5e149c93db7bfba9a6c8bc0c0fabe08582a7474a74e52eb7f2d2eb93b22358e4797b40c27400b354efe4fba63db6d531f298aba6f9b6e55a8405933d2d18f08edffa25e83e28b08bef93002c94fc28172002ca6fbcea451a864a243bfe5d940591e24b5754a8759620ca3aad6d4afd88c87721e2cc8a97d1289fe38a89a44d0062c03b3b15eaffb5d09d869cb8d19a60ffab6024195ee84caca0686373c32345dc1a04fc23318133f55284d5d95299231b450daa6a950d4c9543b4298279624ae51aecc3428ff8fbcd4e3983af02d1806d7a9ab2c4dca3e4b0db55926da73b4533f4145ffbeb04cfb1f9f8ee5cc24370eeb04fdda5a29393b2300c3e1dbb7a6917729f4eddf10f7674e4ef040114b19ead03ee1f124d19c3da030979a2d7aca08c526df30719feddf121b573dd23d2880db8b9b0d409e8c32ec89e564e19aba9bbd5553f6d9152679e4b4e3956c6b588561527d45a35391a7868d4edc2c6fd546e214347a896da2ae1dd16487e40789abe3ad2861f4b37c98e7275820756da386b0bb23abea32283faf3da7ffe06a71b365c0abf781f814e0dfdedcadbc5951a000f3b151c01af04ea12d4377351761df7759a03c46bf19023598e62696900a29cd6b26dc51a575f3fac6430a24f96de4cfe48416612df77dde00020bc485dd38892339c87628eddc5bad472ff3fd25da31fa5414d12710f72db9afacc448ca3cba05f89cf9015b14d3351719cb6db51063a22b49c9aa5244e8f209af9bff2884ac508605d0c7e3b112d7192ffba5b073b4568b97d731522683306701eaa0be0eab7fe313769d4a5cc6c40a0a62206af1e8b2c7de4d2e997f8fbf3487431f0bdeab302a9df0721d0784a2b9c905010c80409c3517d785ba1eed50217fb21b65b6b911b40c7846c2dd23072aea7c2bf13c2cc955d5f91c0ccc0d3cbce56c688d4223ee7ec9800de00474f110b4e38c617bdbae4431e6700331c25089cdd4b34c3cae8e424ddb87588f31a27ca36ff913d809b317e642ee5ca2fc3122777003d3bb11a851171bc1a4e123df2f813b1c84912ae89bfc5cd3796827b805e5644c9ed323dee8aa123b6c415f71b40775d175744ff57ab4ba300c45c54b45e960f6c900ab5572e4751803e395242acbabb8de239f58bb82d13fa04272b0e80fc84d8a3ea6e4fdd6177d1b1f27828472673dd2fda6183bd59c2f4c60674348e5d840a0b36cc6097ee3b4fbc237948b6edb4d0cae735741e50fad031266ba30e68d4c2661feb8744c2827ab297302ac709cf0c28fbe6b07550fbdaf9f70ebb2c7eab754f9b16ef86588bee8e53cdd6fe3154f720dc34240cc68f017da6af0af99bd51c1b9b6977c681a71ef47fdfe0208c52340b9e400387708e570cba31ad368001edfbd3c8f817cd67b1d158115bbb9800f0d450352ba0c21df5819d9f2bdf67ec8bbd9f300e3729d7e11005fa9e4bc0c6df2123f4695da1bb2f84cc28d861439b9d74d24551b1142e029560a9ffec296305e9c8b4d0ae9527c4bb02bfe8d63c1d29539a28dbecd283ee27f4c1830e7712b09e29e92402a29891057e10e7d824e733f849006d191086b071bda629a6835133c363e51087ad6262a22057de8c2403ae22c5270e3410b8a44907fcffffffffffffff5f3e10bb37f8660fad4dcb94a47c02f587fe533dbaf5c330a524a54c49c21257b8637d33b388042b10ed0cef0de7a4f58518328649e5d0ac6ba79f6b1ff48d2c0e8d627732a9b3aeab0987a6515a5da78e9b7e6f68789731cdcbfff5b3dcd0b46d8f16f9ae4f7fdc8666b3b713f639efd15d6c688e17229ee77f4e676b68b21be7b7677f54436e3534da525d75ab22a6f46968d0fd4129b53dcd9a8ed1d0ac1f237ae4bfc4c56768f8284776d4aaf6a8ba6668bc4fb5f6ed67b1b696a171961821568ab5d915191a3f9f4793fe1d2746636814a9b4a8f152ca9b1f1543e349f5cf3acbba216a6168ba35ef86e90de92a303448a1f31d6debf4507ea1c1c68cd1f35254ac5079a1c1fed4989ff61666eb42f39ceeb07de16a55ce85266926cbb63a2d5fcb690bcd2b9456bac6527975d342b3faf4a87b6fbe1a4a280b0d2a4e6d5743a5c8dbb0d0a0456655ccd921a37585469536e6ed126ffbb542d38abe7142c5985061151a96f4507a65aad8d9935468122b578dad86ccf4fc141a3ddc0ccfbb426fee526852fac6e37b8e324b2b0a8d42ab699d55efab5a43a1e9948dce41e85061524f683a35f59d74d4add5894e68d02995fb8d13526c75131ae4f94b35b448f33c33a16988e997f3d3d3265d42b39cbdcfb75247f4a984a67375aa37dac693f092d074f3a5ef8749e52324346d7d5bbaeb8becd08fd0b8f7ead23d2c31646c84e6b7192bbc7e45be2d42a3fafcda72543e97784ef4543ec584fd1c267cc9c464af071c266784418486e162a74e1fb45a3afe101a66e66871a3f4bcd2a7ca0bfaf1230d855b893084d01c5eb7166addd62fe43bd1fb677131b97b20417ca0bb44109acdd44d6d3bcdb871eb13bd39e458d5092034a8499b335c452855fa13bd39e43069fd2926e8dc7041c29047fca0b955dbc952ee62ebda7cd0b86a85baab19feb6ef1e342afdb4839db859779707cdc9db3e4cb7fda83a1aa4e16baa2b7f118f37ab945679c1a930705147c3ce3a4d3fe838f72c3ed1fb38fcd30a1dcda3e25dcf0e52ed7cfa895e1c2a2872b03858fec7a11c73348edcefb85d1953e7d6899e6a2f0d4a299d47bfac192b5b277a29fd2e2d2672a4bc2c1f6a94c4a182c2efd2a095ada1a764a99af9b73469bd4a7e86a99dc5ed2c0d1e3edafcf4ba1af31d34e76053eecfac3ab55c401a3fe4868829efb62979a5c13f46d610d1d9e4532acd9f6d4b7da9d6e76df9a3e1cb94eaa447b848179ee8c5a162a2eee3f0a65f0d374a7894b8a0844789cbcb1a990ccbcbc1d23f5a8f4c269361c1397c5f5141e92ec40b29cd31c4aacd6eb1e34a884d6eb5204773147a95941bcb4fb516ab1e70982c1d34ec10be42c6d8527ed03922a034efbbbe3b151e75cc53550f384c7270d2ac4c7aab09193b7acb4c0609713497a7b1e653aabefa596b14638b353badde522df5cda1857850ab6d6afd2d6fd4ba56a921aec34c9759b37bf2ac4bbf648d1d546335b8fcccf3b0272be76b3ede83499357a944872a39f64a67cccf05396810375c2de5b2df41c489c960d2a474c40e626bf162e8bf9f05ec051c348dddba162a3cd538d739c5851b34c9113b5fb3be45ebaca791c9647ac061d26cd09c57cde8d4f54a86d41b6ad0dcba54eb7b97fe4a9ee068fe1fe531edc496394a3468be61638eab31365d95de6896e61d5fcc12a35d3c8383c8981062b42a116eca6cdd78215ed5f6122a72a3694d214da98eca4b8f0e083268944fb55cec2b353e0a65322db8269748f0d1ac5aec572b6b87d4728d41f3c708d77b3bcda3f2da68d23974be1df59cf4e8c3a059be536ebea6b2d7616c34edb0234fea0f29d3532f4008f1494cbe5b74a9993a427ebf183adcdca349baffaa5b4b4b9dbdd63f0e49b046c3922646b752f2b49cd721821acd294a4ab31d66c99a638b2ec1050d2a52281b35ec764cd76d115ad0a84b8b147762bde69f5685904683cce7305e7f0b175b0bf22ef0010b1a64c6ee7ba58b5d3a27ad4912d068d2372166878cd399e2cc690f384cfc8c86d1a976aa354c8fcab369b657d72663c4e5f93ed05871514923c3c272067b2031c8644a7ca091c9b09f2393d1bc1e709884f1861534298f2fa4eaab7dd6f1440f4810172ef181464989a797921e252b5f4a7c94acf452d2569a4a269302e4074a6a4b0a901f2840e0d1bc36d6eb38516adb963ad10bf272dcb5047939f02e0566347ecc91f3428c7d6bfb6534673184be51395377524ff4e6d0121f68949c51e2438d921637f492c9b91e7098ac4005cd72e6e9bd787e7bef6990824635e26b42edba31c49c062868146aabe4464839edd113340899b96a3ecda9d55d0d1334ce487136f3d13eacad12b02274d025aea653874a6de6c71c292999668f72bedd5f88e954b98004cd61aa7b7dba23feb65ac6f1b27e05994c467bc061120737cec8fae0f274682de4d656588d6d702554c7944a98e998e42975ece748439b6eed5222ea46da8b77a26782a75c7eb454aab9568a8c1953aec74b4ff45c585605a951a7197fd9d23c69bd3ad133d1450d6adddba971267688b113bd3dcde6aca4946e3baa9d6c9e277a74acb0c471880d424b1d645785da7aa5277a2c2e2dd72c6cda586b5bd91a259fe8b9fc682c83d3286632bf624d193ada133d576993153f541a8ca0f17e74b835f1ec33d64ef44e5a5e80a8324a7894f828f1a146097b37e8e836f834f580c3448d4cb3dc7c3ad3fbef3686277a2c7dc24ccebba0b0cc209371f9d13299675961337079f96172520f384c66208246ad27e594582dd5523b27ba2f2567b45152e2438d1213151445161720f92c2b0cf580c3e4042168d2f95ea9d7d97c95923ad1f357014173b2b1a69c9fbcdb3674a2d7e2ff2d262e1f47ba121f68b474c9c19792672c2f2b31682393f9b1e22acd92e9121f6a949820ee018749184af88049cb0b8b8949043ce06fa2127ea0032cedc2010e40600311d0801cac574acaca074a2290810a6000021720a30316c04005244081091c0624d05c5e2270267f6262c25a507e4c00024851e00175acd0e1520107a884643460f14cf0e5e89465d227643020cf0238a00074595919c3fb593a90801020200e0e1ce05a3e608053000f10800303c00c08c0440301c01f2bcce4594c4c4e0e951008fb1605c00973e965d201314c4c32b0a38efe61019233594931894305258e3856522030f2a3022267f22ccd8465c5a52710424618676262e252c763003301474000118108e37fb4ca080410710b020c00a3884f88a20ccc15ac50052a4c410a5180c21398b0042524010947304211883004210401083ff0410f7810848e395e5c5a5876006445e547484a881c3a58980424420a980424c217221051c200308ae08426cac0842015128000068309a3092050050613878a4bb798a4740b4ba6452402180c060022101803043618c3181f6884c803441c60d2000f78a1640c0f0c600c0d58610c0de4608c1233f060c9988c9101398c91812f605a3c0d44ab6eada4982182803130c08003881820e4162205b8000bc620c30bfe03f06f09a25206b27ccb0bcb037989c10ff646082b4404908232839494323cc414188c4800fc5f9092520606230280160c46440c959786c188ec7094345af12ecfc2cac06044483e65a5872d648146302b22a22e48b3bc42240483c10cd22c2c65b4603021c100060683c159fca215184cc82b7c11031f2d28c060302fc08c118143377eb03af25ddee553529a8a0c52525ecef894d52b3d3c658505cf039418d4d16bb4342bc06042780164854545063f503a85c7d7d16bb4fc9fb1d2a35959f101a4597cb0075247f33fba471d4d4aff0a567ac8c156d458e9e1af22834f59bdd2a314bfd2236417981053e80283e969a020958b202f070613828b8341de0521b7b045b3bc0b52d0f01494131e4152545e80c184d4c285a581603021b4701496971436309890593c435971a385e5d78f5f4365e50c97967e355cca5801b2c2c2864a9ff8789695353c0d1459b0bc1c282a2b6b603021a6c03429cd50544ed8fbf83950e27835521a85a1f84b0b7410c40c0c26e415184c48296281c1c8c1b272461033fa47b7bcb8c055dea5e567d0c60c18ca8f97e659564e5a9a870aca0a734131038309810506830979852b78fc606fa084b42225e5a5070613c20a0c266415184c882a5211820a7f1f798a10537c4003648ca100068ca180048ca1000260424a410a0ca6e5599e05f706be916fa037d21bea0d7d63dfc0394840821fac8e16cc394840029cc35778ac20bd067b3750b0d254d230017b37585654507efc8f5641c18f1595f71f2b2a2d2d2d9e823203149880bd1b2871a8bc9ca1f2d25cddbab0341b417cc50c179606e26904f115335080024c1360cac0a5456585071921d817132cdecbbe047939907a7114cc97311090301b300303042514001384039cbc220c5884c18930fc10c61f0c6088114e2c0183c1a48119c3006f84840cc2022948c2180590420000b082310ab080304276817e410097428c31002708c20061008317bce084246092b004231ce1082c287029000683b2460a5e05858c1220191a2043e5530e1927b800192a9f9202c0461961941146026c71025cc4c103180ce60d180083195b90c20730184c14306c60dc484104c610a311984f590bc5fb59907a19438c10cc61420213202d63ec48c5183b3631c60e4578800c1284800c12fc0f141793f62c1df041c70a8f967d61ef460b0a90325a5080741c2a29407ea0903c620c92c5a081823146ece0873146d068795f511943e4102d3e5c3e06638808608c10160c17b060863854509460843076f02c738c817104a60c7900f22e2d72b4904186fb78202f58e911c6ef8065a58520000108400004a0d26604716141f9973212100c04860400c305f30b1f8cc117bdc06034d0035fb00083c194a429f4c20c2642f0410f78e10b97766909c14322789172070ca62501bb600383c18cc10e25ba30030653872edec0605672e1065d040043860a0a1975b84a0b4b026ce18404d8e28d04d4c20b188c4ab842878f97a353cc48e98fc1b3b0d12cdf2c4d4a29a594104208218410cacccccccc4444444444bcbbbbbbbb3b78f0e0c183070f1e3c789099999999797777777757555555555529a594524aa994524a29a594104208218410cacccccccc4444444444bcbbbbbb3be79c73ce39e798999999997777777777555555555595524a29a5944a29a594524a092184104208a1cccccccc4c44444444c4bbbbbbbb3bc7ab2aa1c45be3471a181a24601566c06030cdf223602832586179388298b1d2e35156e0292f2b33a06325e5cd78977e161ecf8315963342cac0f2272e6d060613428736567ab484cc01830991030613120795151419b411a4d58043c81b30188c1bbac559d3a0b8a4bcacc1a38565a5474bcbb7a15206cb0b632b2a65a0cc81b282567921e359fa517cb974cbcb22e30c7f153a1a480b1929fd2d2a2f64a8b407e85869f96f413a880b4a0aca6a95349ee5c5e5a5b1bcb82c324e5c585016194d864a46a5fb57a790d1d2749491697997159512c481d24246081bd680c1a4f4cb0e48210b0c26440d184c481a309810346012400a459ce155567a60302165f81f2b31c06042c880c1848c0183091143187cdca081238d1898aca059c10b78f4684cda78411b6d34268d1a3258c10bd63079a38c35ca507939567cec0b0a7ebc4b1a71aca4a0605fd278159438541a1ea3f881f140073061102085250c3588c2074196494b4b03097142135c545a05e5070a0b6b4171327ebca8fc8f96a6838c1516c4a182e2c2b2b2ca2023f364b088622404e5048369c16042e208692bf0675961616952daa5cf6028292b7aea7857e15152e2438d924ca605cfe4f0f620228986d9c2f3ebc591681af2f5eae7aaba95a7a751c2a32406253c4a7a6432ea9cc98940a26167eae0797514e7f5b3d14619256ca85182d48bc8231a67b4d27752c908b1b5239af5ff67fd4e713b7f97d2253ed428c964708e4ce607ab834d0ee7c01fac8e448248239a554ad92b5b2d75f6c21317143a18d12464f68baaf32cd2c6269765105944a396b75764b5b90d979de8398a499065729065c525064da645e54d80b49851c2a384054d26e352c76732af8272c2fa87099016114534ca3d2d74f2945aeb78221ac765ac1da4ac8920a241942badfa4bd6147113394493db5225e59799ccdb440cd11c55bf7ca93ee920b44da4100d2a6faf4b7335b76a132144e3abb5bc57da5072d2263288a61f513bbe87b59592361141342a9b615ba8c9d6a536914034e77ad0c2bb6387596a22806818e725fbe176a8106a227f681aa37407bf314d07fd8bf8a139ad3f1d74902ea410bf481f9adca6a919b11b43a82fc28786b12394c919d9ba4f2fb287e6702b6d0cdd674b782fa28746a1bef3a9d787d59d17c94393f637217dd785cdda45f0d02463b6da79e3c518b78bdca1e1b54e3abd44b8adea227668d84aa7354f2b694aa55ca40ecdfbd9c37ad61d1f4b2e4287c68fe26bc7095d2d45179943e37dad4bb1b6cb57e82272685ab6f38628f1f612ba481c9a4566d4ca7a74659f8bc0a1b95b8c3efff8ece271913734e99a4aa550a6f3f5c644dcd0f85e6b4cfbb493a7c644dad0a4bf86365762979d1a136143c3dab9b36eb9c294f099c81a9ac53eadb2b61e2152c544d4d07862e322968dd8e1642269689252e88e5d373d499389a0a1416ca9a37cb4a94e25133943c3780b9b8fa162f86d8998a171d5ed199ea7f35e6d8994a1592c7b1513bb644cb5254286e6a8a52e554327adfb5f22636898a59f7699edba8d2d1131349e89dbaecc4b89a95e22616814cb961843fdff077b8980a161a81c153abfca0879897ca169e7e8a4fee784bc778978a139ac879ee9606e7a5d225d68be57b6e453dca5489708179a4f9454753f4a8eaf96c8169a45cccee985e8fc795a225a68d461eb6dc9edd662698964a141958ea357f6dc6be512c142a3b6e51ecf45ab7e72895ca161db504bb8ab1ef9c9256285861152dd14674ada8d4ba40a0dde23c6da11b1fbe012a142738e42881a429e0ba15b225368d03384bfd43d2f42b744a4d03496da59cbcf3763ec2c91283427bb1d3fc751322e6f1128344cb795f2d6b62c256f912734ca8ea6f647353e8a598b38a1417d16d2637d52da632dd284a6173b84ceb95696ba5b8409cdfa9d362647dad46b8b2ca1698ca5c4cbd6e142d7165142a37f9e9bea697dcd528b24a1f13beda064ddb221862d8284e64fb5830edb94e9075be4088bb926f6099d1631427390393badbe6dddcf2245685c651f5fa7afb5e767112234d7f02ca7bd5cbbfc2c3284260f37b796acca1b3a8b08a151a86bfd619712525d1c8c467d3353ab9d4b99ba19188d3adceeecab43c9dcfc8b8625869421b6a4946db32f1ad6f658229534e5dae65e34fbecdcaa55fc9fb29917cd41cb91f269284f9f79174d331e3667e7f89833eba2698a176aa5c75a7d53ce4593aca15fdb0d1db3a58c8be6f4b5745a35bd4593cbe8a4e6b79ced52b668923b524a8f6a66e6a916cdadd2dd3cb95ab79568d1ec62e5d4ed3429d6d02c1aa47f2ef977624e45b268f29e25857b786f21e25834cbd5a536a62b5a448645b316ed66e21e5e878e5fd1e06a9ce8bef3a4e7b12b9adc6d681bf3a3cadbe15634ea96b9a385f215f2c3ac68fc98972dc412faf9e15534b792fe3af47e9cf9aa68d63742ee4c8f8e9aa7a241db961fb1d584788e8ac6fb39cfafd546b6d8299aa6fa30cd7594afb596291ac4a3703d537e53bc4ad19cb60e437b2ca953b848d1a8f27bd3e386eb648fa251e82c5fedc5705fb1289a83ce62aded97526c1b8a86315a0c135a0ce169bba068105a76c5ab0ba544693fd1206e96526173c4aea1f544d316c354844c29bd46db89e6ee56273baae8a86839d1b047ea96dfd7699e6837d1a43e8b560fa7f6a9b99a6874fb513bfb660dd967a261db9efa107263c58f89a6976ee3eaba5b88fa124d6a5fab6d9de5cfb22dd1fc61fbbd955ef51a57a2d186ed29ddb9b4ed4b89a6d5ee42d5d4612c914ea2f196daf6afa318e3a324d13063febb2e33df1945a269aa4c9ba975f6d22148347eae5c111e274799fa88e615a3c46ca9734a9d544734ad907f15fda5bb446d44d35072be1e474c6ea78c68de8f727f7ce5aaf5e9221afc86994d9d3faafea8221adf758469d94ae8d8d1443499ed383b6d212adc8688060faaab749ab35dfe8768ce427898f09b4fb3374483ddd241aa4cb5f4fc4234cd384f156b4d55f984681a2aa69a3543a74ffe201a46aba92e7affab664134b9cdbb3b75912dc58168b22f61aaa49ecf9001d1b8fbb6564409a1bffd4393e9ce26a243abda523f347d7e0e63b244e54afbd0a463b5f05a9d2376ca87e6747abb46d4f6cc92da43838db5f7f9e56fde49e9a1d97552766b0bf774239587c6d3a63c6ab5a6471d5278686e25773fc384d4375477681a4f1e2b5ae9ac944ed9a1c17c3e89eb3067e81c5587e6f0674a74c40df9353a3487d569d8687526543e8726253ddefcf1974acce4d060fa498fa89952e73bc5a16185ff978dd939993ac1a169499dc59672296cb8e90d0d9f76965ea1d669992637340b25452bd149a90dcdf1630a51f5a9bf636243b38cbaceb0394bcc4e5a4393d8aad9faae748d9a1a9ab5cd2a9da5bc16ca9686a6e54988d9f718657b3434feb7309dd1f791ff0c0829740d17a73743b394356dc48b78b1fb3234b75c9d5d8d2d233e8c0c0d3b5608353c5fb6878da14955ba9479fb93972b86c6d96fa56f0b9dd92d0a43a3bcb629f2cd4c291381a1593dd7945971ee6a445f68fa5cbeb344ebf030222f34898fe6762bdae689a80b0d5be8affdb0dca37c880bcd29c53e19d1a12d3487d8c9ec74b2f5d6b4d024434717c35467f75b161ad55e2d3c896957aa85852635d60d51d79b25b4aed020b5de071fd90fa26585266563db94e99ee2ad2a349d30752b7ca642d3502ad2c67fe99cf3141ad5ae795d420b93429542b3db8a91a5b4161ed48c42f3bc8bb999b6fe7534a1d09c7674d43db1f3ad2a439ed09c6407a52fe6ddaa94214e68d0b526638aaf511bca902634fd4c7d0fef37a59f19c28466179da1968f907fca0c594283fa8cd62d2f2a42cc102534481342e950ebee3bcc90243477afad59a3b68efd3204090dae6ea52a5d7abc7419728466e5d2c610e2c6baa1cb102334dc2ead679f86dde832a4088d224c2a3d3f716378194284a61375e6bafddce31f328466b5f5afe7dab3a6b3102134ee284f6a6fca0f190b46d3b0912f2164e78a17309ac67cebac4bc713e6fa45c332ada6d3bcd1170d4aa88edcb5d9f669ec4573d82ef50a5d22b633f2a2393f7becee199e45c65d34ccf0f0d2618ba96d51174dba73d376d6c7912be6a251e40891596ba4582ae2a2396c663edcbd12b3c45b348de770bb53fd8b37d1160d72ba1fe6e81c6699588b063156875b2e3f564ca445d310e2d656aba6424c9c45f39a7011fdf94d691165d1a8e7937a9db366481163d19cd6ce41bbe7202c9adc65dd74ef204b79f015cd2795abbd266abbf0a02b1a55c93c175bf78ca5d68a66cfb2e3f6761c1d1b2b9ac6ea5a996265a7aeada259cab3b9a1e769c95f15cd263bdcd94dfda6f4a9685affdf3aa91d6c073d2a1ab69c756263c95a433f4573e835ed375a743d6e8a06939d6e9b9242f98d95a2f1d312ddf1835a4b67a468b421fb4c557c84c746d1bc9e7f840ebbb4ce2d51340defaca74429f57b87a261ac8d1ed7595bed09140d7ab6aab731dd279a3c98da417dac3155749e68d8d16f7a4ecff539e83ad1ac5384506bb62e8fe571a2e16eaa27f5c9db44c3beb6754288b821e369a2e9952b615b8e5e2d759789c63b71628fd8eaad1b261a6cb9ccbd1d53e8ed976854db514cd9627dd6334b340b7997bdc26775d8956892b1c6162d1e443f4c8906a1f48bf6bf5bd3b69368fc2c579fd8e96fcf54120d5ac8541e23f75ea79168127accdca35629be8244937c0bdb9ffbb7c6ea110dba46b88c37b5b43439a2518f8feeda37e384a9118deb4a958b506244c35c35d656a78d5bd1221ad6f7b9f7aba13fab88c61bb2fcc3ddbcb14c44739f0d1f1d64e58b8988e6db59ec0eaff6c4c54334c7f6587a63e6eafc19a2e9d6d431f4c8d5723c278c42342ccfb13d95b2f1b774277a2b2e4a7bc061b21206219a86d86aebf2f1305bd7133d35833006d1f8f9678cd4f714216d41349edab93a9d7cbdaea94034d79fc8898aa9ff960988467331869cc8cf3556cc64329937520f384c4cc2f843b350725b6dbca7574ae487e6ba1d47dcea64cb84f2442f4fa111461f9a6bdeaa0f2a56f6c5e7439367f1d5bb42ef97d4f7d0ec26e5a94ee24b295dd24383122d95886ed7d1525c5131c943a3c75d73b546d44b2d3c34abe7ebb0e5ed36d569776856ef6af6c71a35e6b243b318fa86cdf41cc5e97c1d9ab5b72ce9598b3e37391d9a656c5c8b991ff75e7368569e2ebda1be44989cd039133790cca159a8fa903f6bcc280f311b48e4d0a4c5acd75ab5e7442f0e8dea65ea3095c9bb39d1895ecb1d81040ecd52ec4b9d3a4c35734b07595a32994b4890bca1c1ce3bbd7aabad422b4ff45e8e76414c5404891b1a54e44c39a3e2aa552c0d246de084d90ef6272df18146a281840dcd713e755019db6e26446b6432990c620f384c42a040b28626af512177eeedb41ea9a1612ae9b5a693c78b71b9a8346b371683b0b8a87c02d23fd284240d4d6f2a736c75772803123434cb19afe63d4a216b745c417286c655db399d548b47d5cdd028e3a3abd4aec4575eab202943b3b787f9f8528b2574cd64d0999cda0b0509191a67beee987cf2a8933493c964de28e151b246098f12377eb8b4bce8c0cbf83fc3dfe5e360691f6716246368dccf9f7c4dea4efb3e71aca8c16420114393dc4b255fa931bfc6380c0d5bcd15eac39eab8c080c246068d63ab6b7128fc286f95f6812634e687db2c5dc9761e085462db56bddb164f5ea5c179ae64f4a1df4add805122e34671be2b6ea9cc610717281640b0d2b964eb7d4bfaa399f13bd964f612a2f2626aed208151148b4d0243bed6e442d65ab55277a7b253ed0500949b2e0781afb57b94b2b418285a6b923c285ceb8fcf731ff407285e6dbc9f4fd9cf4442f4f354162854633252f4a6795bff19fe8dd5982a40a8d9e6c8cdd5bca46cc469050a141dca4eb92bf96f850a344b5132453680e62d78650ae1ff35e1e990c2948a4d0207677b6d51ab64ecb277ae85e50e2438d12974c06251e8f92d37c0a90171f256ca85182ca112451685ee539e647b49fba0b85e6f417196243474da573a2f73c40f9169606c27897ee090d3a8f18624ae764428b9dd030b59a6aabd2d9156b3c51a59ca409cd9f3fc7d4d83b6bbd4c0109131a4495dc29b13ea8ed1a2dc9129ae7c41652e7d7254b0dd91b990c0a0b1b253c4a9c4789e28144094d6edbf677850e6ba83909cdda5fdbe84e42dc4cd3895eae9514339e750a1b2c2f2f28e151c2f22e2f2b6dac951433322d6ff292c9e48104092aada66b79da860ad321394293d02364edc573b61f19a1c9cbd4b9966152449f2e244568d09ef549cfba456dcc89c0ac14b55e5babaed2428164084dfa323d98fcded7518b44080da6773fbfcdaab94783d1b0d53e5ce694cffd0a1829713a47f51d1e949c9d241617202c23bf6892d7b66fc4ff69ad947ca1dcec4d2f55156b5f2f1a6cdf8e2b4a0cbd7ba11d4678a1123b2bb55deea2c955aec88e129fcc96a35d902ed8a99fb572b942ec72c18b1a75724bfcc81bc385b2a4bc592b3b3cfdb7d84efb7a5073aaa39a2d9ab5dad9dabed56ad1d873b795f451f918a145837c09757bfc832c91611dbd46098f12951794f0287115141794f028f99794c60bf22c5fe2438d9273a90f23b368a84fb174e89935a2238b57ebaf7c4aa1c3541d144662a158a14c65e55d857a0a61faf9f973529b8e1e3c34d005253c4aee531690fe61728e65c5a5390c498cc0a269d489eadc1a9de8ede0b1c4071a253b68d8c86480fc602d994c2693477bc061b2465ed1a82e26a610b92e4a8b277a26790ddeaa188cb8a251e9fc5cda9550e7e279c3482b9a85d62eb50a3d437dd4133d4e3718614583cb39efd0ae2a5ba9595cea684a78f86732990c43d964c3c82a9a8554d75178bccea94408e130a28a462dbc85aed7ca83bcd089deeaa5a2f9555fd7706dafeb93277a2d2b40120c23a868d86afbf37b4a15ea4d277acf0204bf30728aa67953bff2e3d344279de8a9ac6c19464cd1b45c46e8475142d53e65327726a7b0071c2661d061a414cdb7839e71535f799b5c0b23a46812ea5ae47d7abb95d251348ab919ff75db96898fca6144144d439898cc556a33466c24144d76dee333a40e5b2c9f0b23a0687cdf57dd337614a1fb271ad452ffd5e2a6546fa6ac34e4d27cce138dbea76665a41663a45bc2a38447890f354a32192028272d67a4130d628aa8f0f8e2f5ef8d134dcba5db3ced9ff6add8269a7e947017275cd78d5713cd49f5eb67bd895143958986ad2f4b747225539b12130d43acb93aa52cddf15ea25187b025a4ce22ea9396680ef9f0612ab1b3e91c56a2d96698bb490f4b541796959673cf50525ad2084628d130f7b3b9d83ae7da3b262e1f875e890f345c1e8d4c66124d6b8ad57a4e8e68b1f1899e9244731a3dba8412b7259480a0d081828c44a2f984a7eadc713ad1a3e3559e2521d1243bf68f8f8710634b859147348c547afb4d67644d4961c4110d3366ea9f6db5df62e844af110da3f34cf1266bc694f2133d4634a7791cdf19cfb97c1795c6288c2ca2b9839ec893bfafc5aa262edff22c8a689672c6f2a88349e562894e184944a3c98a7b1dea4c9777be0511cd299ee58b15f59ed6d641268c1ca251958a1551fe2de4aebc841143349efabc31cb6e6fa710cd2e4aed526a5a84bb16211a667e7892a673766d4b07d11c96d85108216ffe6b2c88e6f03ab1e47b5aa73cdd4034fab95063eecde57bfe440f104d77b66c671d62e3c650452161e40fcd2e63a82542f968b552277e683c9dcf3c6afbace6dac808237d680efea75a7576d5b7b52d7c6890e141db7a1d557a5a0b4acabba09cd061e2f271eca1e9a36db166c516d95d47f4d02047e9ec0f9b2beb75f2d0fc65befac56ba8d82b3c34ea3bdb497498327de2133d24c2c81d9ad599d8695596f2ecae13bd2384113b34a7b186eb51adfff5d60b2525a59b0aca09c1481d1a5fecb3bd79f377eb3cd17379f96182c218c2081d9a5db418e69d75d8fcd989de7293963ed752c6ee1c9a6deaf8a0b3ed7bcc288726e9fd694a79392f557da2f7e3958e913834dc58ad9f555dad31ba133d3834d91ab5d4d8f7dc3fe989de1c236f68f6d131dbd59e1b9a3faba126c4d4cdd8fe446fdbd02c4cea3729fdb698149ee8b97c1cc9a3840566ac60390b4a789498b1821e7098b48cb0a1c1fea558b1d6b2a9ed5f4373bd7095d79d75b299a9a169688f4f21ae9f639cd2d0a8d47598ceb2b510a273a846d0d0e4b57e236e2c756aad9da1697cf6a9e52de23c8c4ef4da25e53ddda3b0b89c113334ad1652bb776badfbfb9dc9a953ed018749187c18294383485dd5f175e9b96af509ea0187090e46c8d0e46d33b41c1d22d4f247c6d02837d55d7aedb6d5592a28325871514923f580c364062362d8a5bb8a9a1a312d6d7fc29ac7a3b0f84869b6a24626c3a331c39f3590180479171c1201c5481856d16126e54c4a0f296a5e4aa4c8f59b6b9ee620ef82939666010f3356b0862a538c80a14188971b97f5e9d61add179aa64e73dbc98656db1d37329997353299ccf23b1617205718f142b3def4fc1c725bce4c65c52425a519339517a89c91c964322dbb2d4056c268c248171a7c4da48dd462ad8e1b171a86160fb76a2cf52b565b689a324fdf5bbe2969a733da28e90187091a235a685c5d57353f683f39337d309285268ffdbab245074f17169a4b9d124a47b6cc98d4151af6abe8ec99ba745c35208c58a169d42dadead65f85262d7574107d6b57a731151a6cc51af2e1c59ecd7c0a4d3aa850e169ead83a9b149ae66a25c5149d8314b68d42834ede22a65b2a9df3ab072350689a33b5cf9a714a858a4f68f2eca9f566db6c931e6b1d234e68166a5a775c4e9cd2594d68d6616dcfcee57a769ac784a64fea6527adf339a5c90a234b68b41962bf2a9762d7554a6892b35a997cd562bddc49689ca1e6dee8542bd5474283ee2b134b756bd91f8fd0f425f666c51269a7e61123348b101f75566eeb883c5284663f354674e5e4c8db23446850bab6fe2845fce8ac73a298dc181942d316f559db478e7e302284268fba662344c7f6dbe7fa402418cde16c448b13b35e0afd0ff646528208301a3ea7fef652626de537fc459388ab1bfddbb2be6b3c10f14593945da9e294e8dc14447ad128efa5b808751dc4ca8be612f36dbfdc8e1da713d945c374f9af57eac99df111d145b31cef15d3e695e9acb96856fbc595b0bb53ae4c5c347deab86dbe739e62768bc60f3ad45d0ca1ffab75da28e151726050c2a3e4b051c2861a259b02e4078ac9a70079713151b66852e62ee4e82065cab6b9a0a8a0348ba3b403915a348856a9d6a73526e7b9121f6a9424ca21428be670eaf75f52a821427ea2174465323c4a80f41a778ef5c2b883c82c1ac696dfe1e47a6c99d7109145a3cb1873a6986c33a90b4462d134c7b3f21c7e7a7afd444304160d9fb4ea346d3d48d762277a7945107945a38bcf5fed518ce99b277a77798d882b1a64cd6c9d2a751823446e45838e6a9c8c1de35b6e87e320c28ae659d3bb773ad4c39ec9989c5a45b3889e4f1bf2afd474a682882a9a7667113bceaf2e315c277a9fe228262a2b9a86ca0b3299163956564ed4214452d19c738b4ff5aa6aacec4ff482b0b8dce96d0f384c5420828aa6f5781d64b71059b79de8b9faf12e696432253ed02829a3c4871a5e464a4aff884126938906915334adaf7f29a6fbb984365920628a46a12a74eb0a1f2d9e2d61438d12ad8148299a54483d42d8da496b5b93a2e1c37416c3eda6f6584f74930d4446d1e4e9ad6c5faba14c4c4ff482b0b86cfe58613923088b8f4c06cd20228a86d57a757f0ce5715c8bd90b22a16870f55e9dc627f57d51174440d1e4fae1a30e367e3dbe9f684e3a6a6debae526d519fe86532253ed428a963c58c4cc6bf8e9585760e114f349e4d5ff11c6b224ab8dc89e677f1e243a888f7ac7551f93938d12c46ca970bf13ad153977a886ca26967a48a8dd16e7a57eaa220a289a67fd5f961685b6a4da1828248269ac4923564d98d59fbd530d1bcee614e2df5bd6a8b41098f4c2693c964140b229768d441ba183a4fbe4afd9de805592698b2da5f4506994c2693c9643299cc8abf9c18442cd1e42666d4d452ccd5732342a4124db34a844df5524a34dfabadf5c55653aaf59ce82994851099447318d3d57579d452148868d22ed438b1a5091dfa9982188768eea866c7955aa8473db6cbcb0f93202c2e8668d65929a14edb8ca83dfa979476232521885188c6537bd7fe4fbd0e3b219ae4549c69756288f5323888318846a1a6f2f570dfe2769a209ad47e165d1d6a46ca59023102d1bcd2a3897439f5aa76e94ce6553ac504250d4e3688018806711bf55fc25569fdffd0345e4adf88def21ca5128ae18746d5b7e663086562a9d9895e8b494b9006723048b3a15246903588d18726a1a37ed95f5b8ce12b3e34de07a58514366b2919fab813630f4d63d7a79eada76f88dc0531f4d0e4a52e568a29ea85d8f3d0ac4bdf9673aa4e8ba9f1d0b4a3d466ee7a943011dfa1e9834aefbc72d5562ad9a1c9744c9f35865a2236ac43b3aeeba4d7ed44fda743a3ccdb2aff6ebcfcd61c1a94129d65f477b2a5741e253c3688187268585b940bf55a76f6bae2d0a4c3f4dbee13c3a1618a5aeb5f87d8351f552288f186a6a9745a5a7cfadcbafa8b186e680eaab6b6d8f5b62f4caa458c3634adc8471b3aaabd101b1b1ae6497b254ec7d4d8d1891eab408c3568ffd2c5f5ac997a931a1ac5f92b17abfc6b4a511abab143d5abfbd52ac5b262c2f22a741c6c62a0a151ad9d9e530815dedad36b811867b8634e851417a542c4ea6c428c3164e88c4e5a2b0331ccd0b4671f32d5d2ae765ad528f1a146907781192b284373d459be3a35c7f4ea2e06197ef71d21eed63e86e6da27d276b8095f958ba1d984c897fe69af545a2b0ccda94eb7f4153ae70e6b3034d7dc57b66e6e5b8cfd85e6527b4d0c55f2ffb4eb85a6a9b7a3eb20dd2e34e9dbbf51ea7667d9592e34d90e2de4fd736c7bba85e67ccbf4aa55ea3ce793161ac57fa6981fe655cc9485a6132adf27a50e524b11161ac68787f9e249a452a12b34dbee94f7b4cfd55d6985a635a657c67d56159adf7510623e9c7efe910a4d273d28d151ac9aaf368506fdeb69afb6e8514327850619b3d377b2f936fb281c3fdedd63aece891ef311c48042c35023c4f47cf95abac9623ca1414e8a7aed31d46ba739a159558bf1a8d5d38faa6234a151c438359bd50c5c1e0d952206139a4fb8f87da9ed55e56d098de3a6b58e735a4a68ee34f29ec3dbd865da2434cbbfdd793563e9741509cd3a2e953a91a3a2644768da2326b6f872e51ea58cd0b41ee5ad4e357b554c318ad0ac85ea09a5c4edd62f13a15989f4acd389adb5a11a42a39c21d5d077911842683c19fa53087dbade96c1689a51a985d251e90ab10446a3b8a957ffec2eb1f6fda2598ae778a2be45d58bbe68903e6fde6a62ea45c329a5a66fcfe76ea99378d134cd66b91ab7e4e9dbd94583ccd662b7ab4b112fa4ba68d241290f63ca6e78efb968d2ba6caa89cdb775ea295c347cdcf87e6173bf5ced168dfb1e85ab2df7fd94ca160d4b78eb7c0fabd334af164d62f46a39ef67dbf4db2ecfa248b08316cd5294275dbba2b679d489ea193b66d1ac3b94b85242dcc9519de8dda960872c1aeff354dbf6b0c5ab3d16cdb9a3d8ce6928312e068b26bd667a3baa584a7a68c270ec7845f32a1b5ab54d4f2bd5ee8a261d53747fabfb646bab158d3ae72c2e6e2a74cbd00e5634a94d3ba93e3a799fda2a9a45a84ee15985bead5baa6892624665e7ac747ac8a968124a8b52ba86dedf1a77a0a249c6558a2da63c1b32768ac67fe9ebc2b392abbf3245b32b37a5c456cb9cc18e5234275ba9955a2d746d7391a2f173989a2f5bcac70b768ca269a592a16445cb11fb124573d8b9b5964ddbedf63ad16b3945d9118adc018a4fecf044d3da5ffa94eca43ac9ef3b3ad1ec2aaa73ee60a3b57fce496107279af4bfc8923b52f69d7c134d37e375548a5b2d4bd744f3a793fe5187a931de9189a62d66b7f3a48950ea8589a6e1724ae7d9fe599f2ed1ace6213f8d696ff9594b34ad7a7167a25c8968a94a34db1abb547ccf76e924251ae4a7729b2f3bb6d0c11d9368124a8ae1eb7d5b695b9344c3f86b5beab73cdded23d1b46c68dd23d5103711128d1fa6f8dfd977eb86fd88cbb46087231a54ea91993655d456423de03051d9d188e6da1536c5cf9c88f932a259c5b61b6abcab2a9d17d1a46e8955733f53aae84e117628a2f1c37d92265e9988e6e0a926d3b5981dd648b1137620a261b498adc6792b21c5ec108daa46c728213a4dbd19a259bcf99fed12dafff38568b429b5c856e2a3db9013a249766d17abe265424dadc9e510760ca2495e5f08fdcf265e8709a2698cccb7890f72ddc4dc1188e6f3371fef1a29bf8600d120474e5ceca4ea5bec3f34abd7b52bdd463cd8e187e60eebc4d61bca6bd9541f1a4666e8d4fa9ea3c4898e1d7c6818f15a9dd2b94b906572d2f202845d5e80b8bcbcc08c1d7b68bc8fc267cd5d76c998b9430f0dffe2566a35112a962b0f8de7fa74b58e69071e9a63ecf93c52678d1b3b30ecb843f39f8b993a6e2825c36587e6d33a4c6b7b7d1355d7a1c1a46e71627c9a52ca76071d9a3feb0e7a960a1f39af0b3be6d028942c79fbf6b4f8abc9a149a64e53662a1e6c763be2d0a8374c0d19a5cdd4773e5ce50e383822d373986e1576bca1e1f473ecb257bb476c3734eccbb6f79d3162e8dbf0ec3ceb2f527d454fc88626addea58912d38e355c6671b0430d3bd28018a53dcae954e59dee4043a38aafc973537f2a43699c3371c38e33348a5ba3c487cea767eb30ed3043f38fb78e2bc66bdde1e2512283121e2569b874ca19998ccabbb8744a9bc28e32346c532dd7db560ca16b6468f47493d96a4d2c1bf33134fba9165bf4eeb77689a1f9b6bf88abd6f39b79189afb85d242bd7ffc6e0743c35ab1a6c465ee97e85f68107a4b78d48f5329655e68bc3921eed9e40d25b5bad0e0b56245de4eaf5b65066107179ab57a1bf57262e67ed6169ad3b2b5f4dbb0531f590bcdad7b969c88193184360b0d9ebfa6e778a55a6c2c34bfaa4ff71d66959aafd034648735c492f52a27b542b3d6695ed5847499af2a34ccda4aa1d3e4874885062155cbb1bd36a5a7a7d034940e51b6f5ecf62c8526d5a7f3d6b510325e158566ff10e23bacf123e504854653b2f694fe5be7624f6850cbf587adfedf3c8a9cd0f8e75a97db966aa7994d681e9d2f5d479b9ea68d09cdb7a69491fda144ec71090dabcde3499debfdf4a78466b1f4ca1a5daf336f496834715d1d75c9fd131e243487546bf8ad9b8cd39d23342d25e58ff22826950e1ba169868f58bbaf3dbd6d2a841d45687c21cd4dd44c2bf77407119a4ccad62ef674ada572a9e355501aa5770ca161ceed5c22b7d656e7ce600674ec1042b39a9edf71b427bd21142065047139a30d14209d61f90549301acdf3bf47b5dd7ed92b37cc306159692629ec1d48cb1ee4061260342b31c6d5983ade164afc45d3ce3e1e74955453b1fba2e1eec4c8e8306ee7d2f5a2c94baa1ced6ebb7b563590f0a251d5d4a773ee6eb154e90a24bb685073528c3ee925d6551e24ba681a62b5ce426fcbced97e40928be6f4af85abe9a4d4fc5a144870d1a8b67da9cf396bb5ed160dfea152ecb076c850d9a2596788b7b49ddf5baa45a396d3a6d5faa7b1859e16cd69eb101eae6bbd52d92c9afbb45a1d3d9fac375b160d7b7adf216b47553fc7a241dff7a9f697f594824583d71653a79571a993f6158de21f6d4ed7da75bb2b9aa3ad569f642cb13ad68a6653774f3a77cea16c56349cb8a87ba1d7a316e92a1a4fea2e295a3e6bdb49aa68ceeb4ae8d3e2d43d2d15cdaaa6ddd0596cc7bba86816a2e7334dedc732d1291ad5bef69558d96248a5291a45fabe4ca1b62cbf95a2498c534bdd94cd37252445b354536ca85ca1b5fe378a26b59e5db92a316a4945d1a4c5f6abe99a2e43e947aba0121f68dc310249281ad65c29961697ba735a110f140d62b716faddf3a9eb6b0a249f68ae1a2ab47a8fb594cff2d2b292c24c165352143dd1fc2daebd3efa88d0f1133d4447b7010c924e34ac1aa1c4848e997ae7133d96202c2ee9509ac587154838d17c62ad1163bc4bc3e4d160924d344a2f35f4fd9ea9af3693d92d9068a259d4a79d86e8d14a9bee99ca8a4ac685470b8f202c6eac81f9921940194832d1a4d3d44a6bd73fe6e362a2d945cedcd55833f5d4279ad289e4128d52ad3973942751f942339058022bc12f24946834d367429a10d9751fb1b80069836412ac5929cd5327357432992693f9c10a0b1249206aeb9c6cbd105adc1b89bfb388e8e061a4f44ef44a5c5f4a7ea09cb464e62859fa5272100b09245ee5a1224fb6cb6ed7e5650d9533121b248f60a4e820428af32465454cd58e52c9f3936a2c9de8a5a434432a67601a248e68d2422d5719bb1bd1f03752a738f93774589e33394634dea9d269ab4ce9b376248b6852b1a2745cbb21e6121f6894005961594126936901b2e2031245348eaa1442f45ff795545652786432afb292c2039244349894b1d139bfb8946a3de030c901092296236be94f7fbd9d4c8760988b903362febd18211d9018a259dece4b37a9a01cf20d480ad16caa93986e9b177e734234eb273fa9226eab55ae4134b9e8907aba86bd0e6b4134a779ba32314baa99a240346a2185daa9e7b76e2901d160a29eefc48d57299e3f9c956b53f345dce9288390f8a1e1432a9d46a4d82ec4b2720e7140d287cbd441c20774ce5a3b77c8fe5142997640b28726756a4a1bb65dc9c793440f0d3b7dfc0ebb323a2ecf3d90e4a1e943acfdf9c66ba594961e48f0d09cc6a81f21cfe40b9ddea1e165eee9503fbb03891d1ac68a54f3d5de3a34ce2d1d2db7335ccd6c03123a3401915fa8844e0a15711c0c858120880110844cad1605b31400203020180f4683d134d1b4e90314800340545ca432281e14c822814818108401613020100cc3200803210c03411005ab24748f0018c71e4670c790eed24b1fb48aaa1a8e1f3cd090877c1a100c3dfbf503705f9e6dc341a64406d43a71909887b6f5c682ca2941074a15a5ce31d139bc22973002545540e6dd5163512b1ed9786adb4301d8fcfbc12396f764ded133d31af749400fad43080f4a8b573dd02bb3e3030f42c8c23dcf373609fb14b6fe876a81f2d81e74686841223dc84374112845e848ed67a78481cf359745eff5d54f81ebb57cbb048205fa283723f5d1efe08bc051611da2e5be72ea98e23930c73456c0d074c4e3209112483a02076f7e506c2c19cebd05e483559af7dd6d40d51cbf8c5919ce0f0fb0bd48663d31200fcecd25da915dd549f0a5fc7e7c31de9eb445d4e0208cc55b22e5c56c458f46ccbe4ce01a595fbc15ddc51190a63d123b4a633f6a7e80721f01125a230303f107233cb002a0c6a7ec04bcbdd00bdc63dac32775c92da95ed25ac32a8206f09cb17114030fdceda98170467ed2b72009c32345011773793328843812b5bdfa448ec210116f804d842c5187b5e97e737df537ae6691931ffb4a456b73c8da48c2bd5e901fd53dcfba553cdfcea696e6c460c106805d8d92bf1f2f40d762689c2980d18703a877681f2a0a4a70d4451478d025ae5e4cb2f7287774549430d405286e9426143a5058448bc3cd5c68a1531654fca5dcac0cb1ed76a01561197884818c500ebf9ba642caeac5364e6ccc4d47d99fc1089eae784cf8761b2a7c1c9a5f668bb6318de360bd90d5a0bafab6e251cb509a8fc28e13a1f13e5b0495b60bb85db828c62706b6ea2fa6960872c9740bef32d92451b1d65002d803331a4047b7df2b8df91415347d0784f900bed44c5c4cd5e57e9c80acea22be1f5ff5231ab8c83ef07a34daffd1b85cf0f39484b1e4e5a185e4410582e5ed58118cc889ec2280d7cf8807ce743b509667b469f46c661a439b94c2d5fe8a780c98b012592298e29131d7bbf66bd8debffe0b88c8a6e573bbd8ec0e4b114e003c147b57127c1118f2ea0bf29fc2a0abcec126679de0b420e8075a9700951f8001021b30c7aea3ba6a58667aa6e0e7c037db9d230302b742e7282692154e77d753c9c19b9c45b3f65b2a9a61e4f585019870c7f608627a7f0bb2b728c3c2880d7f88ab091a4a9a4d24ee9aa12bbdc351d30b3065da20b39e9ee63e984808f81776f5d6458c9bd82e6525abf2ec58291a83d12e4e14c5894ebdecb6f9ad0667afd8fa40551b7c25811cd4c9a408a78e2b24ad145c14ef1c8fd2f99a5f6d484c23d2ad60480d2f0eb046b714b11326325775881b91cab5c7a433b808d1118d42cf272f5fb9e75d6aaf0d7f169388552586bce7cb70918a949cf1f2a412693889a78280df1373de2cd1a7f6e43f8ff05fb99201c9d31bc4690d5b0c0614cc4a16d0ca5153dc09161288d8e103c8fd350dfce83961097db2f9d4082f6d5082d41216a83f5d0e527b1b2eedc304816fab3309a32c60271180023fa020925c737eba0f9bdd005e52202d947e9c36d1eeb204ed5082c6f8876222692fc3d83e3184a708cf2fbe32b4b0625688f80bd3dade7d699bb3c87a98a614848d27e83343cee06fc0c752540c14a2dd9a00fa20f034cb0889433337ddfc2b9543c28e07aac0dccf6ab776dfd8688258f1467f16779100c31ccf9032e20206384726edf817acd7845ac1a865e03129b81afa9a02c6bc92640c3bb09863a102eeaca0057cd0dd4dbd63e06caf08c3be10ed1c1ed8cb9314053788d197148989d9eb9ad63d6eb0d510a5563ea370d80e6e4388e3981c5b7a2c234541fe337aa4d4eed36907a373f3240e98619d2ab840db461573e7481090d4b4d856556fa56a7a7654c9265dda0c714658f1b0548eeb861996a0d401c3197af0fe64f7dbbf0767275a7fe51dee1e747a4e9a7e83234af723c8f53860e8c880523f819746d2a547a21d7bbc48674f74b37baa63d08bd387d5b88cee79ca7bd97a1d3dcbe14509add1e3a8597b2d6f57005de6db820bec436dbd367817ffb611be02c9fcb12008a7518b302f1044cf201fab41bc1e4dbf9c40113d213ebc183c249f377893778ec6ff28554b7faa214538929bf6a52502f917322dec470ccd94460fa9a3515c2b31fc7742d63ad44e9847d34f5993aba4f2191721a60eedc236d83e2dee9cf4332798f8d503e7c4198135e24082e6861b7cf314883e2c606649431f3ec95010fd0210a41f1ad37307aca193e9e1936046e81f72bbeedfa5ddf12c4a6a1d7b3772b385800d32d9f7af8065739c5f98d90bb5feb6531fe091864aea7905d1636a506b99a0632727c559f9b16cdabe4c44f7fb8a0a1a21fc7c86d17d94d67e7ddff97ed9885fa270b8c2958fdd268f46fbacd4a1eccfa5360fe0e218c1484a80564ebfa93f647b15526bf515763b10305d61c5ad05965e649599f7a3fadd2ad1bbe88cbf7b3f098b6e002da739eeff3799bb4c4d1b89a74d172f3d874e64d2c0d46d4273120c65f109cf546b692e1404d3504e56a6b8a1349af99ca246059aac3981f77441aa5df07e6b260141fa11efd493ad87e2560882f9294467ce2d1283227f8f5ac12d87ef4008089c5cbe257683ee87770bd7ed7aeacc61ac9dd87d7d8aacf607ff5ac6929d5f215aeae5a4c64112160c3de2d3dee43a5c750437c9c1b3873411faa85441f527eb2f7a4ca871d2089457769d5380c14e3175365813bd6743bbb6e117a9a2c16596a4c2617337b5474caa260cccb7f985b0d03b6970dfa743e942267bbffd8be83ba746b1a964a766c7c1de36241d390f2696541f2551ea070d4c18193f0b85e9864061940883712387f6d50d1a01f1b54e47fa71dc5482bf15a1e15a8414fb7953156d7a2c8155250d03d2aca6a8e9ead0f7bc251647846ae92c8799b96db1a797aade3bbe4c54d641fc464aa92e7574f5b560bdea20a782332aea674833d8b8525990853d5d1b03a21f78ad9634838df2c44a80ac0e1d9d7ae790fb6df0b29a43cd9eb4cb41718f4f39a566240e0e9940737249d65d224de27b4c6d27ce051c6095f47ff694f086cec30642819f15238693c7e29f6f65f6389e7e2216c67d305157922e1e431f392580d203402df241aa04b0f5b88811fc8403d3abffdad202db7ec59c8382fd0198a51960083c93bcdf07c13944a1d785c86bd178001c1a2a4198a377fe73b8a1b1fdbcad2c130424b22edad3c40724cbb4c9a56d4923c89a6523eb2eabb1c70a62a10210c5b3b8871b113369ecf7e9bbac61b5abe4a38b65a87d83492e55898825aa06bc8703df1bd38535cfbafa7c895d2adaa8efbf480eb69231a92a32c363bc14a2a64884be8b9fa4ecfa5407979336b99661a238e14e676d5e2277ebca3ec0bcbb55da751cd489fe539e703675f4a7edc7ffae6cbaff4c74feda80053d3c7ec0edb491cfe4aa57d349c45442c955fe39cc9904e06d89014f2551285c525aa1ac58ac5302707744164ea189084883d748e6f5df8c2188c33df501df67468dcf5005ea5535659ec3ece5c257fd773bc2807e8de748355cbfc5b19d2f12d376c4bf561351b81663226595df2224a786cf3226e448a726938fef6628a6eea4c6a1c6996627bad48e3ba9ec7cf8c7496966d40af2e70645165a0af2cf8ce886622377cf1a2e4bdeec9007a831a7a52e5fc6baf3488c4c01b27740ea63e223abd6663feb02602a1e18ce1a244afaa56962a6959278f94e86d436fb763f2acb73717ad938e52f9de2d3cccbe553e5867093d1972e31add23d455a651e89ecafbd3554af60fc2766015e437de15fa1973dd102187a310f2bce2171e699de3831795d75cd6200b2f7d8b99a0be0870bae49cc21628a1c8f03a4ec6afcbe73d9cda0c8828f27cddaa158e1b7b2e6809e2e741f388bbdf0ddcf64fbd203e440b9b96a0677b1c53373e3eada6e1512c28680d1b61bdf6f05d8d15ad9332e73b5cde53cbb6135b5945828ea5a999c0ccf1713f1f52191b35bee472e6e4b676c172f4e2c467ec27427e87d424fc7496cdf4d8a3537e0bd9f33ffee1e486b58e79d3ee91231e9986f8074566080fd510c3106291bc85931ae3d34412cfbb6ac6f7ae49ee646ba463e9956335621dce5e93f05cb734956eb91ada35e5b63f086c3a27233b6d700e4b1b3a1cf96352c1c7564178239297d92d82c5d1384390cd58e3c54ad042273a941e9b08dc12edf5605814e0f014d7372e2c22dfb546b99eb4a3b90f97680eb83dee27dc585e3fdefa340e14b5839b00ac75dccaa299b5965a4b4b080845a6c6483bdc14b83df437b828649b3c4de650c43975bacc262c17d8724bf44a61ee4f37764bd82cbbcd48964d71bf2153776157b70241a25763a93ab63cdec06c34d9342c4375cd8a50f94c1981816888cab43794246b16cae129d3080f4f9ba6205d51232006199fd038d2514c257811dff569d51f85c96dca32d87932b6130a0899b3ec6dbe0dfff95068d443f33fc0c8230ba22fbe5ba0ab0437a3444c527368ca444171c6a055b8c23e56ffb29f2b4d347bdbd880997f3103d8c0470ee00421588f938140876f0571780a47a51852d8f9ddc989fc50266fb6334082066845573de490231fac8dc5eb44907b73de5528f147e386eaadd63c2321d0eab51d4bfa1aad91a94ae6364a41d223418b1bc9d4ae078b7280915e202c3889e933e5a479ca5e376da80dd0d1b5e83611d78284598518e632eb8b1d5e8f7207a1301e0e650833d65fa64b87daa72ebcfd1dd45a93af6d3266b021f199843d241221fcd17d46ddecc9d458b00248dcea895bf3d7e769135bbfca201626323b166b433d42314bfd6aaa1e1b2ea6ddc7a81420d9a5228d29af619d7f50e03d8184ede7e41710f418b8bc24fe644375da5c4d7d99f5608fdc327f8af3ac518a7d1360c1b93a4080ea5190e6edcde1019b4cbd266539784dce06cc4b91ca42411aac9870bf0f47af134095855a950cb61fe85811b32029cde562b9541ce0962c05fafb074fa06608c8623df6f0a8617ad0c097d4d0d3025b15153b1b11ef0bad389c70d10be48d133da692c233de24ae16698ac57a589e08f4f49273da52f47548556e81a496715dc68aa2778d6c7979880c53445094d42dbe11f4b08724520e7e50bb4da220a461eed50bdf038a9c10e1e7ec290844c4d89819c23c928ce4d56feaa0c70afcea2c4255977aeff8897e3eecb9730e4b40054a0f75eed020932b1c6b03988cef707e65fef0192899cb0d7fa736daf5cdb1e12b7dd675c85f5be0acfdb03c4568cfa4698fd515255d67f0105646b4a7643bcaac8d801d0b92660b3228c925b791eb351e7b5c17956e4fe9bb42b41d64bc8ae8ddaea1f2b457670a9e0c7084459baaab6f473565a9754d0112021359df84ea85cc94f4e08f03aeaa157608a1bffb613617d639395f3d8ea9e1729c0e86b3ef0f98285a303e4474784c496ca8851c1e4500813449dd589d2578c4a49f3329d82af02a54be2b736a68c6646ba31e98e8848205135885fc8581179f1009e1e29136a1d69a2c2d377782e4aa48336fb098341066b3702b9b7d8c4064a68d87de482e1a63f6fceeee1325693c25d15125474c59ea6d19b417a021c698bb486e16235cd780e9a6f40f4eb769d543e49d08aa01e04ba1cce65d0793624172414164c0488bc2aebc22068f54f5c58223d6b7e5f01868e98b6f548d20ebf9a799fdd0364cd86b7f19225abdd3407798af49ba8c55f2bce9b70ad40a87816b588702101a6f7e4406f187d28cb68ad94cc50e172deb040b489026431e09727d89179d5820c3acbed2f139b9dfec96d266a656b00ebf2d95527b79bc30baafcc516fb1dbeb577b1e609de1f0d23c58b0e54834aac5b8251ab4285b24b298e3c322fca3be65579983fc142569347680cce7877312848ada376597a6ffecf4b7892eb537a7eedb8f64b8b672dbfa14a83f2fb380e11e8c5dc29ed555daee9b6d63190b38c345b87251d4d49d59fe8507af408bac9a4b84f085069d20a7da68afb56a5fcdcd7be654d16d1c557598e8c4321b3b5b9824d58d2a6b52852ed76370831c1f91dcf8ac8359dece5278849eeba42df21ce5b20dfcb96d7ec14578948f37be46bac93500ec9b78b82f455928f7f349360a557c0e89d058578e85d37226354d21a0ec2b10936aa210479a48d1a7a011f2fce7857deca58e98eb80adb9a7f0def8d61654a83241a422ec1c00d521e61fe42c64e2463f9dbc46217d2123a491264f4cd2d4ea1901c39114581509c026e74e4018b34297bb75289f80ea4d637fe7191a05f32eac527706f7c630186d6f8f156485433c9c08cf21db67d51aa04e14b8874096118c5d08dd5c8ad1f23db160c5d9f8b722a1701100c905080c2f4451e7e5a891eb83cfe382987fc98875c599611ba1ceeae04ffe05de95de61b57adf2e893f04c7959911d0c24cb803358d3bb189a6a2a5c9947f1cd8a8a1c6b0b7131b869dea1e4b905aa5c92d612e54384ca3d021021e6c6a3fa8cfcd709a2d0dec52fff6d5e3917e92154cb59ce7c5691e53c0e48fc3501fd93615743b9cc99abcb0daf4c070aed760a093c04c8440bcf463cd8e0c2722c10a8f95bc8cb6dd7e0b729bf4e5aa2ada456a5044d89092a66b029c9c30941177c98a3ef1ad7b08de27f5370bcd7c9b9b192579b21596b5bbf63a54a37ece23f4d2d2c477bde18fa3974b9dda3e520bfc121d4cced09dd34a5ef06b56d3d3b96bc6ed60d1582554f6fec15d5757fedee1fc0ef4d5c57d4c82f52128bbd778d661946556a3b982ea568acbfc165b20313b9463d9e0a97bf205a6fd99dd9ab44547ed486a2dd2c1e0e1e16de73125619130b2908e3ec4d298d801b96e23a9017e5839b4454bcb011cc0cf01bb8b8a70a3260b02d9f412305cece6f2e2c9907e37976e1f811e9641fdf5eac2389a51602f87dc4a21f31a21d0d0fd0517584a5b002323eeeb68c47aa9656c6e03c0c4cad37d8c06850af8d2948e6b3a929d172ad8989725222699d1ddb5d1a380dc078b7052a97d2d263d9b3167fe8e96a7bbea99455d57563771e989d56458a321a344cea97a2d4ce09b2c728c2be3f1f968e95a367edde6a0fdb9d4c570356d89fdf001f27d69817804819e4a6c587e69c16370469cbb4af546853d5dd044894543a6329f3164c06371791477260b9914c66248149a892a8e485438c32f0745a06453da338f438493a94b460880fde51b8f4e7829239ec8c727a90ab41dd4ee84bb53c007c41f1d534880b3335ddc04fa0d9dcd4131cf998c44474a88fe69ded30cdce3760cc2e8cc25b02bc576b1103c1145145d41a16657bb826456cf5785b29a2c1f5bc82f645aab96aa098c7091f6fc826488e4e984ad564bb876ae7d28da1f7110836926e80035c8a06bd4468b0047709466131a59aa16144d5c3d9b4b2e8ea25256e514074495a900201ed32dc5f94e59db4c5f40cd07c3faa96dbdb10f237b3734232df47629c86a214ee87299412d6a15d83568d3ce9edbce6a2d8b14684d10696fd7d575a96c33bb3231d825bb5f07c8006e347a7ed4e510c6bc94cc65825112f70aba5c35dd0ecb66d77b440286d49f685e758eba6169a0f28618a0a1b2bf439685f19c4985c5ce890e158f30f6c7d81886cdc9951a46be0b0192058bc8c19d580588272bb3122da4395357a3304c168669a1787a877258a47e60dcd12f3d48aaf0611839e4ddcd5e2ca52c85359173eae81edfa4f73db927414c6f3f925906f86f2669b88e66517a418462438b29bd06fe0d629e6192e45a99de236bb2b4f0c84c02fd2f843298265588d7cdad21e303256388acc09df6f364b2a651a39cacba0421f4686c132bbf894e574e208b917bde9d0381a8b1f0567ec5872e53f36e1ed9faf1bf4f127863f42a5872c1b6e25e0208928b4554e4b08a30f0675bb6bb82004027cfa887937abb6835f7fa1e3b734aa56c94038d1279065bf7a3da7db53c9cb32803c6d4e3b12381a9a246e649fae618e624aa59fdc042a3cfafad44ca0f4a73b2f4ab66b186c36d40b7f20d46d3135ad7b80928cdf6cc406f0a9cc9620b2ba654a0fae8507bba6e73f41642e49a0cb0f5c9cbc073b05acff1347c4f7e61c6d05eb012c71e601d3cdabb61ba8e550e24ab154a57abf51dd3f3a1612221c061177ee8c37be0ddfc543d0ff81ab0744fe00ef119e25f3b73feb6e64691f2c424e550a60fb2b24a446a7dac88268c80d1b2840c2d0573ed7f9edcc671978cf8069511b45e509b27d55ea903124aa28fbacb5b37bc10c7e6957ae4c77d85377060b8e38b1e8f2c0a4c495f01c0004a17ca6c7d01e1f8e2e3cc6f99d123d8583a0337662e6ff204ea6316ed0c369200ceea19b98217d2407c8d80dd54937160678a00687413db82933d047e0b08cba413b7523c0a007d7a030d023373103f8380e95a137b4136c240cf7a01a08437a701364988fc541337a0374e24687a11ea82161a0076c5a86f2886e949da61936064379528d05022638c243a81392ca103c124ab0a51269b73b933ca35e94f3cec13d0e439d62c91c21106062220a14ddab78003b9987dba37af05e4927e34019235122f4484d810802e95e681cd623e5e23961cff02876681eb50764518403a925389240d01448397b4a0fbd47e98038ac97cba1e7e41e8987ec80bc666691e88822012548e2a2f415cc33ed41191031a0aa64baa2e7fef02871e29c60158787d2c538cb0ee2734d0c9d72bb9edda3e8d2984d022438c243a891b216bd85b150e85d4c8f336773d4bd94ce1a5c2bc79cef28dde5656609498e200eecf01ca4613fc5066a3c1cc8e11af4265a4c1102017e2c8eab76e55fa7c5f029cd920bc1a79ca48af0883441110064a66a848644bda54b03a905919e88fd42f6229ec80ef3787b480fbb27e8621c574fcae1e7e81e277e1f99b2fe76e990ba521e2b16bac3e15b4ec613767170919eae47cdc139f21ea40371ad1e25a79e83ee465ff0d789e4ee593698404a7a500fd34cf1e7905cfe72f85ea42f119e8d110837aa0dfa4eaf189d9688580b4a2ff8bad4e0578aa4b0f0aae6ebf016eac08758a88b269035d3db60d9bd44001794626fa7af96bb9800a71953ecee17c8d1daa8d6a4dc857e4dbd266bcd88ca24f605a55091a74cda9959622a273952a4c4af6949199531e12e80cb58d566fa944e0b50f892eba2d768d294224a60968152b4a9b4a20466252c4e97ea42d39253e682b64c97324519353b680b75859b5506ba3e0a7257dbdc4c04290f14abce565a9984b4f25774ded69aa901c21204732c2f6818971977536ffedc66a0ccc2f7d2041d00cd69ac3bb5e747c7843b4eaf2b2f306ccb7daae670936a9e6180338177950e88a2df59cef3b86325696aa9233e1c53a78fb65ff4c1e90238c672d3147d1a3e323d91b9859cfd21f3598d934948e61b70ebd5ebb8b4b04226551e7155cc5e5215beab8a281feec5bb86f39f580abf0cc3dd5526be93943e1d2343d7025d1d7145e7cc6adf58f8268715e4c2519160a809d36e17d7dab71f1929fc2f2bf47f16f82f0afe070afc3705f93fa820f2bfc23d2b65769f5f32ec4e1a2a496a6ed244e104c3fef0847f592707238efc34bac0bd062ff552cdad642a27fc25659d44587c7fc445178472255a48ac0bf85b691b0a5db65fd9aff0a28fcaf0ac878efa4d1779aa279778845bbe69cbb9dd614e20bac9db813adf58ac7a16a37b5ab0c5e3f43fe71bc51267338b3e369b40dd181488ca8edaea2ed4fdc08e8e510a20585ac6a45dce827cf0c1d52aba30f978d1a284fda380e41ba61d03c2f68ee9fe2a3cc7f5bed70e73daff39d49b6a1cc84e69419d90f837719c6459535f53dd19180af34d81267ea6cc0687cd436256ffefd211d06a3605471a4aa748fca03168b90748e1574083c3c2e8360f83e3add23fa205dabef7c688d4cefd88979fcd200631a0dbe4794c160c4ba0878056e35dd114f5ea4a0d891b1819a998bbe9374f3b5de1b14bab51432747e55aed408472ee11347f5857fcfea23fe46c6a850b9e792f16f14b128d2e13fabab45a42fc640d15717974a4168f56ae70a11ffc3f9a6f472561c492d18e5386c2e887c91e157164b68b8031439010c14e1285aeb9938e47138d0c2277ba3d81492bcc445977b39e8013c65940afe7966af6f4b12770fef1cc66e0a15e0ca737d85e47f1e6f03c7aa893aa57d134fb33b719d16be5bfd35e59542ae463333622816f66929ad5ab07de0e9aef6b75ac604046839760be1093a0242edd12d05c675ec38c4f00876499f0ecb232340722e989f8880d078c258718e8ee2582f26b36c0a360075f9d09da7bb03e4f640350385ab3c6164aee53ba608a193c18cc77117c0b5064e538ff8d1436114c305a417857560e1f1d0d499b2dc223d49a731380859b5420b8f2326ec7ffd2776b14520a1f6720c399a5a5f9775c639f0b1648c21664b7968da606d0835ae904eb7f2cb8e2e39c5cc61506c2067a477dc60db8338d35f8a5a2d64d5b81891e97de1916141d7850dbcb0a7a33d0bd161e47eac9762adf72a1a432e2473c8d63f1e6947918663add0f6090ef5147eef1b0c326377a649e01bd14bfe620b6b1e33b76a8a02a6ebe83de695943308b8a788acd338cbe7a521671f82fa2419b8283a4c28bce24d4743bdebc18f144f7fbf0afa12d1ee549697f1b18629ce0c4d3d43738a3cf49781e0050af012ab111d8c141c19da5db646003645fe7e7b57ecb660ad38d81a1100bfc09c0c09b40221c2e32b6ca8c7432f6e09a17aab0349b97ff64b3a13aaa48af34877a5d7956baa7132d5ce201e635695b7dad9cb56a7a42cb510eba4bfe60e8fb6116b3402b7bcf4d65afaae9bc605587f19865b9d567c331533ddaa97ac9a0ced0d8aa07d850b2b1abd1328ad871ca0b3e66c088a3b9889bf72daf84f06d9a1a99c49b03f371d0ccc4a6f6570c7a5b40c85b6b63452171b0febe55be6b256aaebc8a9476a705013accce50e08e117177bbbb480ca6388912d05d3a9f43f45db3018a3de9c2181d0fdc6d6cf11c050a194a091b0905198a440d89051985448d89820c8584a684c20c4582a6c44286029998c66692196e033d7ca4fb5eed594d76a7b4c5538bed7fd0a6a65c743138edc3a2b04fc1f69ac2cd1084c92c06076c709cad6acaf5e3668616ba6393004b056427a5754737f4561de49b8686218de9621d38de4ee2c3b642c14a2435b63ef1746b9072a11639f5607849b84583f0afff0466ff3e7ccb2fcfd65516a3c0c5390024c2b0ac470560f99aee24df361bce2bc0bf2eef1c50ac91ac27e4eb1c80e963be36c3a74b19564344dfa4773b1c148ef7b4b7e04d1fb1e5f4a27909a37fccd8add1b4aee0d239925fe4333138d3f7f0b16a4a7921e29e131af3b86d235f03f3b5e122aec8983407e59068a0ed2ed98310b595ffcb40c99a9bd72e13d05c30aef074e24c3ffb269000c03c0eeaf17f58c03479a024f0c0f6f56d3db5dda6b3d6096c8cf12fa98b65a9f1aaec130455df908377090bec771a6c66e09bcabe37960e627f9531d57b8d2b05a51712604481913d3852cb5430932a5f978863c25958e13f6d206c722eebe148ac973d721c39ffcbf0ad5e9e9230c1a3a05b10c1c0e1bfe5c3ccee13f3fe4fa9545106bb23d36e3557f8f4f742500416adce2386b1a05dde61d14df9e9cfc7ef1e14fe29839161073cb152bea52b88409cebe7c2ddd27cc771c7ccfbe49ab7897c254f0a8bccd1c8b14a9cd4fd336daf1765d73e7eca7bc737d4fefea406f6c48e4ef3f3980dcea7360a24bfe07931fd7c315b926fb2bfe0be755d03edfab00989acca377596b2119338c0b5cd00de52abb9f51ea8ca5d9d7400cad5a790eb1eb4e51e0296d109b5716e10df02a2cc5185a3460baf44f7863f251c0a7e49e26a7f11613739852a7650bfbcd5cf44b09883137a736030e181511e5ab7d92849237ef9ec32853f97d17cdc3212e92f782c9018b7d7b033cbef6a5a752ed77385da624d1d95719c09f307fd12f2c370ad6a531eb5b12fb18881f329c0d532878a966495c0beb33dd426cd6c706673d9597d66b81e69926fa13e3684a40786fb819993fdfa9511a95b288e406e0ba99ddf75814ff89f25b4bf64a3c10b198e7f91e21449d62c747479260a2355dcf7ad89d800e2ee3ac4d4b54ac3e5c2030382f55b9705aa3c6943b5eef963052a5af766ed6c179abc29416e03212eaa1e0e24853a541619d86c42418dfeded0229b1c3af70fb29043f1df693d557caf8546fefadd93b7b22f345cdc3e7008efc9518686db36ee6c5bda34cd101dd5d0ce1684e2c8e04019cc0cb603473a4c70b33683e74c7e3811bf983c340e1c02b4ab4e431fddffaeeaf333981c7aa48df50ec73bd5487f9222945d1749e24e33fca03c25e69350876f06dfe78295e3dce8d2e24d523de41e82f55060a37140bef6c2dc1225c4fccff95969d7d72459d5fc9908dbd68f2bd0a774e6c6e87881a8c8db930f03912e54fcc93ee45a4cfd85f4df93eb6f6fd99cdf8322cdd0cba4692f1485b3fc08f70f1e0e4971fae35bc60e6c76d5d6c5541e038b1748feff354e2d38290ca6b2d3dec8e4b76d2c326c75bb1dad489bd02d5286600e47d08be9a951360b2e776850c79c75e68ec6f3c6aaca696ef67df33b7490d496f983a255756315144f2aff5660741ae7e68ed772a461f6ac6a6f9dae57ad1f05c6d6ccd8594f120ffe31287426340add1fdf31f351496a9551413e034593b8f71e5768a00b494d527c30f734c36243ee03436eeb290e47e0f7584396c9b94abb1e9e8b16045f86017a0e224bdf84e2d1ec80b0e14b27e44ba29199e281d24b5edffd011ecc77be7eb7cabcb2b24ff6ca6a7ecc34ca93b5bb8c13f4e4241f2062afda83eb045bcf59767d1371d6a65ee2dea83d31c0a8adbb1fb9de464adc6bf1706121f139243bff61c0a1e34202a61777f048b734131c880ebac12fbfd06d99c6726305deaf3c30a5501949dc56eaff9a1efdd95d7b8aeca63f04fdab772e80f6e6e72080dc383ae65718b21e299780918e41fe497c31fa8f7b3c52d080cb04a617db6e0b9fa482b3a2f175ee6bce59152baa730be0b6d3066205d14aa4087927cbea80f4bf1fd9f53f0c4b47be469f21b1cf2c60cfff68c794c924bdbd18826f0051c19448b4d3e4678372adb90dfd25295967e419ff89ab18e79c0e56c639f48a4e49e169f3bab387d0e3c083c5e0feaa6dc9d187f3af0f0f1451f2f721d32c1abdd576520a65ec0e6b1d09e048d27d7bec47027a3dc47d761bdc5c67e55d976f661096310a8cbca70e4bd0a60f4e399eee73f1dc929af64d5ee495dd85b057dc42e06ebc409846e15ac56262d7b85d6d6587a2807cdefcd9680c47604bd6091f850987bdb6b00dd8fda31d996e7efd7c700b0901c4557d7eeebc1f3821f9cce264a398e35f5ac211dc62a0f2efa120debe8d2ae604b78705e139e0cc20fefb4b3703ef3750be089ec2fbd585de8f988140ea8dc039742a0be4906454aebbda54f2e4b5a7397ce3d0fd9a7076f50a21fdbc426d60fd064d2faf5fdaeeac72c85c26234e7181299685f1ef65d87b710b4a231d5ba2c778b1948ae9c159441ebdabe6ba63c9e6bd614b335b6d9aa192ccde364d71405b7c8905dd1dae891b2e05a828d3d5146e161f485d23810b8af72e601fcd6aaf4cce9d04185abd04d1f4f1cc7d2fa3dc9ad6789db8b06adc8a6a0b78f66f2d9720659a9c2e65fc05e133057afe4c1732920e3a083ae6b7fc8649f575d15b275503038f542770f3f496a4b1bef55781b4ec4f937a6d242e7f0c23fdc425dbba2bb72dca60311a71629a7a9a7d072b50264588e1c20a517d684ead354421d03b5485d7f75dd36ee7b9cf4aeb3dfc02495cdda71d3ba20f9311c624068003c38fee488bb833575a41fc44abf144793b12f09beb84f0465a38ced1e1ec8fd8c6a61b1f3bea169d67a4386b3ff0a21613f31f8c45cec1a385da41a153ad732a3f6edef4bce747fb5634ea1b0cf4ed2797742b5bd8b303ce95e338c60d1fc879f36ffa89e23748cd9d90a398701300b3c427732f05afb142fb6b7f7b9db80ea239cf5aa48f35fbc460bd9737bd30177d27aff771dc6b7a7cdc31fcb307857f1b42c03cfec849d2994c6aab3a8d65f47ac35776514c07f061fc297ebf5f7affd7d837d93c15fc4e47b151f829f37df9735192d28baea173a80670c394cafa56a6fa474eeb2b989ce885f40d8c9221245abf32ff5eaa4917d8bfaf5bf2932c9ea464001f32da26adfbe14078dea6b5056bfa882da78be6a558fd63c66c8dd3be829bce91c6a2978dc199be861f3f8dafa3129efa3aaf68c71a8fd711af02e0779542dcf0f5443e71ca39c4103d52e42683a7b2108eb98b399e0f3bbb0094ce7a8c41fc9fd034bcb18b70c577e821a29186a4f4b49036a012a774f4a094143013636464888d1a91114364a02a5a16a868a3aea98e8a4e0270f324778cc898311a314446a6c8a8211a31454786c888111b31464686d8a8111931446386e888111933462386c8c81419354423a6e8c81019316223c6c8c8101b3522238668cc101d31221fddf92e6fb764969b20db8c69d336db2dd8185d13d79a31d534a5f6c06675b986aa52834a89464d49a34a49434d6943a54443a5ac41b544a3a2ac5155a2a1a2d4a452aaa152d2a45ad25051d2502bd158516a502bd5a82869509569a82a69a89469ac9434a89434559436a04ea3945c13e90ab9f2d18de36aa34bc6358bae060fe251dc46e09c84f288ec122fc1e7bb7cb491b5886ce70f72d8bead922c324ad14d651447a92db89778140e2f0d513bcfbe8a55d6e172b1b8f9b961f61045ebab554bd637b8cbf7f17bef62d88cf21235936f2a3ed0134eb5cb7057502321cd988f5d148de285cf8d9ee092e13e33e03be026d362a3aefd132b4f9c540c5af3da01376e542a9633635588fbfbf1e0daaef87ccc6fe6c6abe1c49cce7dd9f912d21f081bf9aa7a14a9358d364efa8f76173ef218b21aeead37849768c62fd304c4ce512408171749b07118512ae336c452728787ddc46d1594e511b47b6d41bf181abde65a78b045b40c637cafb07bfadbf5669ad1331a7a77972e571b93104416a682f1238df1730abf98c03c107eab5e392252ad0b94d2d4d5309ff01443ccd5b8219cfc3898c594249c0173a7b2d32dbbcf079ec36f2d4cac210f2a538b0bc0d2bba2ba1831aa24aa01c3c62c138469f682da08abb10d7a18736244943ded0256b080d8e7baca4302380281b687b558efb619368c709f23cc39cd8f82e8503b1f653d202dcd9dbe295a558da37679dd0ab6f3383850e55dc4b33986642324ab31a3a99e193dc83167833e9f16fda0040fd42cdca1cdb4f4b2ddd8835a922a1b4205d0a689f43fca527ee736021865ba87cf8b69e9cbf14b424b1b4dbee25c4d2f70b0f444844c822a4624c87026c7ea7b28167afdd38a411c045ad0f4abe6b5c0fc944c665dd82c78fd201f3d97abc9a9aa99cd5bbec1d7f1d68977ddcf7d157c4901f85b3d26c0c67972aaafb5a0be8610759f64d3d9d30138a64f025ce3ec9ad375eeda65bd2029b40ada5ea9e3947479ab996fd004672bf696c709d913a46f62a79e860c0a7f0ef4d335de7de54739314a558cfab52dc43202e47be598d714bde4107f89f72e90e248e0b296b053253cfce7c330667e606f66b590deecbdd163bca6a7d8fb5e32be996599253167a0dd26ec054c6f6995fea8655992b20db313b53b38b9940ee61ab4e202feb9042a0c3550b4960efcffffffffffffff8fd244686bd9ef2f5392b2a61591126b4929c994528a743820001000000000000000202222c41f0c02090c170c0b0c5becc1643a247921c66c26fe39baa0408efed163d8420fe6b33cd6bea78336bdf2d0bad211812e6c910783ca1d4f3e288df0eb6fc04e8c568105b6c083a3f3a2fbeddc3cb45085e18009e4e0220704acaab0c51d4c9dee3792c8ee748f71095bd8c11c45fe7c10c9a3ad4550d8a20ec6945157977a3cfc29eda8e2872de86090379feeb52eb7c8f4ecb0c51c4ca3c387f233df8f0feea825c416723027e923e455c89f4c7a8caa7c94c1618b3898d4cb4f8aa4f0252f0c07e36d7ef018699fe42819c0001d3a7c6cf106a3ba57049d3836a74e6e3089a9acff13a73618b4b8084922cef8ca890de66032bb635932f517b406939fbcd98c4b72923b6a3047086f274d64f9c86d1a4c5e72757dbd4727ada2c1a0d69f75ea84c8b9e8198c29c24276fe94ce4b3583d9545f9fd2749f13296530c91519c9e693ad9f4706435262ab4f8e1853790c066f0f992357e6455b6230cce9842bffc26056ed6022bff7e3ab028361ee529affd42b6f7ec1a44aa8fb18ca62e44740b085170cb27b274982124bc2d405d39d4e62f76d417cff5c3079dccfd051f62d182cdaddfce9a4823c212d98b458ca956eb162b959305afcc8a7d4f9f2a45830482d1d8b2d75732a573046b44b0d592167e78e150c3f5f61173fc41bbf0aa6ec174c352f8cce592a98ec43f8766d9d54750aa68c8f93bd74be2aafa5601e9d2cc42fcea99da2601a4b193b4925fdf6612818f44ecfe811a523c7fa04c366ce7f89c41e9d2f4e30a5f7795ed3fd4967130ca77c26e999f48a21134cd52ade79bcebae5b82b16fff848a97afd74a2598931c555a240879f161120c3ac1c37eb44a4ce59060ee8fe5e1737f2cad1fc1fcf12323b26d4630859df095345611ccf2f7b91ee5228241ce442a91629cd0f12198226c5ad07fe679ae104c95f54c07d9c92358648b2018ad557362f9bef53f50bbe06f0b2098b2cbac499cf907062176467ddcff4f9dfa1f5d0fd8c2075aa6cac60493ec25615b7b235bf4c014d1b4bbf8967a522169d88207c64bbafb84503276cddf80077a5c40033a708b1d18b584fcee68a6683f3918efc37274f1001d6334043c1046173a749cc08b044618a8942d74609e1d61a7ad7492a8a61c98a3790ede262388f0c1c00b1fdf630716186044c02ab0050ecca73dc48c08b57949f43d90025bdcc05c2905bb53297ce5fee2eb74172d680d94b5a07b1c5b20043b26b0850d4a2d61b19273747e98a38b07e4f0a24717950419b53069be29ed901523da4e0b73e75c91be7448b1f0ccc29cbae5d963254b77280bc39b1a9daaff218eae7868f90ef6818c58987330dd7bae5fb2ed630e64c0c27cff932cdfc2f456765e610e11a3e342f6ae3058eddd8909b9897e91d10a930afa63679f9583387968a5e0dfc70e309ec78f1d160219ac30859988b4bc5b0b1e0cab62ab307b9aaac975478f3076b4a07ba8c294266be50fe1fb61d74f5559a5013252619e207e62c8656c299df7a24717580019a8300425825bd6085fe15d9e818c5318438654f5eed71041640ae38c58c926a4b5677f61fcd8510a938ea4cbd7e3c5e90b18450ac3950c13dd4b93729830172940fd63033d1a5046610a425ba8505de915c51d68a454148614654384f959ec80d15f885195a38b07bc8761011d32426190617a3fc4962de98e307e1806acae24200314e6cee946f9470e717579686d8e2e1ef05ef4e8422d10821d2a90f10983a98c7c590c997561199e30e9a9d4baedb9d89d4e984ee81cf15349f0893127cc1e5288ae3a69e949f681dc8439d6ca3b2975f71e154d98d39d70b32b55b284ac8bf3808c4c98e7c6534a389f15a5420cc840960eaaa23b549bfe12e8021996e0e4e536dd735b39ce436b8c82289051094ee54fc152a88788d80f1f391ca0811c6b1f904189a2e9e753b773c9a72a750619933056fe9a7c3aad5ebc5e126689ee153d89cce89423612e61bda3f387f7ad17122699a9264b4d93f108c367899267f1ad217747184fadfbb9bbd5a7da5246230c263e64dbc6d404198c30858e9e2348ca49e79c8b30292529c7a57f8a30fde8e01d614f2da85322cc363aa493747f7a4a2c031126b12a351d26238730ea594a3db2645dd25f1c6418c29c32747a0b7f0939c70a196414c238a223899276d967db4208b3c58b8ea273490fe19641c81004b636f1476b1e5a2de81eff630c31541006ca2dc80884c9c4e6cdc44a223c90010853cea94787ad10e2fdfc83417b749892b9b6162e6c90e10783960769eaa3ed3a731f4c4aadc95342ef259955a541061f0caaf5463e598ab463d983215df987eca972d6577a30ac964cbe8f97112a98077387dcd7fe99f8f8919664e0c130f641896897be834146465facdfaaa4199340861dccff412d6dd6aedcf475307be82c4aa9ca39f92930c8a083d1737bc8cd074f72467330a88e7ad63f23b276922107f35e884e592f280ec65b137baf24f408b9dac1c1fca7da63e992fb89d21b8c9e3c68f7ce311e44fe61e0850f93e106435ef95037e2c243ab0b0ae4e0c2cc64b4c1a0477a3ef59f6383e1cc247f7213eba2a20c780758ed283ec85883d994c9ff6ea848dfabc1944c049d2dba9d46c564a4c11425e5522288cf1a55cb4083e9ce3d45fc988d561315649cc120e48775ca3e9e935da220c30c8668b9e37e9809292459190ce6397dc6e54206b3c7307d9f5354f590c33b051963306955aaecb19ae35b8bc1a4f32b5d9d8e7c275d45c80883c944cc43c9133d9d476030c5f794204cff05930a7bcd13394a38e1f182296fcc688b746b9f2e18462d5cbea7f7e439174c7ad4c5ddea6c0b26a1ae2b37cb3fc84d1a21430ba6dc5f4224e50a1ed4aa2508195930c976b0962c21a7bb601732b0603c4bf791d7cc52c298011957305c5e24f54f63f254ce18492920c30a86f49f391aaa5288e92932aa60ce0a72ec83fcfc924c55195430fa276dfb930b9ba1a71d0e46ef3803e3021cb8400e2e722c800b4b195330e7aff07229c8b7a519cb18a98231c0b81f2a4832a4609eb82563469d0e72291e5a581bd0a1e3bf18230c1e3e4a46148c22aa948ebc5ca253100fad2ffaea07188f7a3c069454046440c16c35e66b1d6f2ea4d2130c2e974e6ac8fea03ae40483fa129654a99b60501ff25509152c4ccc4ca8ae547abf1751ba0a838c25987765bb834a752b9f0c2598642f7704a9ff016424c1d47775e91dde420e1b09e608218af2cf1d65613a82aa1f4bc45a66873820c308e6ac60a5528ba93eb38b60904fcbcdd311a16c2582d9aaa2882482aaed55866010d253f420528460b6f41062e95c42fc9a413057901f7dbce7fc43060453f2349fdcf574e7ab1f18aeece3a4c976a32d3e309db20a69b154357444460f4c95425d479a24db4d3b7efc09b01e208307c64e79547ed83ae51db40383af2757b1f8b468b30e0c1224b8a80bca64f3cd81f952bf62a987ab4999063270609c1417bc7dc526dde906c6fe136b79ab61417c193630e56d4eb2f83f51d76b6150a72b5f6fd2c27c1d45ed47521647df5998fd36547bb794cc8564618e7f22273d6a7eed736261ecb6ce312d419cb40e2ccc75bf9eb5cfc944f015e632151ea9c7930a49ec0af3842442389d52d80f6d2b1c934f9fd4575cad9215e68c34723ce54a3a865661f2ac1a953f4aca3b125518b75754bddcaa481aa5a274100015069d2bf97b9e3193f9398529b7e4c85fedfee1318f1810c014c64f7ee13572ea9c4a5e0aa457d049b7e7fc713b29cc973c9bbfc6a57eedef6314e6a8efdfa2c5aefb1485f973bef1a4d4edc8974261d2493e88c9e5e4f97f5018fff4ea88542ea7843e61bccb6f59f96641c9c713c68b783aaf2b27136d3b6152b9634e54e4701da29c302813b35f56694caeb9098367d56c7ca74779356136e121cffb526cb364c2a4a183049d4ac44b121b430c4c387ea7e2fb7e09e345089b273c5e626e09739d8a31e955af84c133e227b71c4409e36ebec4512158d88a266138b97212f383a6762c097386bef029f7ec5d682361dec8394d547d8f1f5b4898726f47cb50217dbaf411c6f99422c7a9926b5f728449a55f9d2d936b32d1469863559820bc7ad75f46183f26f78bf96f8bb42cc260dea696ce53184b4a453c22bfc42a7122d07e233a840e1b2622ccd9c4248beaac58d23f847dc1a298e5a5d60dd1ac7eecb1be1004af969093162546680961d6339542458aa79db2419833b5624cd7273fcf04618cf8c12f7ad2ee1d2b10cebd7aaa0bb59f0b200c29e699befd3197b880007f209c72895939f5a6290c04f083692f9d105912d4a71cf6a1eedd915ad5f3d00ae7fb94ee1fcf83414727ddab3ba9e55478307dcfaf65adbf305bb983d192dafb77aead17e10e2bd0b083216fae7b1a1547be8666a051077366c8fbd22b67fa4c63a0410793c58f26ab9fb48d4acec178f94125f5fbf1de4459a0210773d2d193645fa42a21e30bd0888339f5c7740fd9534759c51a40030e26d349af7bd63911840e8d0c34de603629e6f55ba64507dfcb0d0675f6e7f3f5222eb13618a47b4774f31bf523d1a1839740830d4611e94423e6285d527c038d3598ccea3ebff64e1ae9abc1a075fe6c24e8ec8db4b181461a0c36334186ee130de61095a56584f4ab129a1c5ce838832988f853928288194ca2436a4921226f86476a4715a55106e3b56675527244830ce61eedfb97e2a564cadf917ca0310683f89bff5127c162e479685989d13d3ca043c7ee8086184c1b629d69aa84cef1941fd00883797d2c7adcd32977950b048106184c6abc76278ed24281c6174c4a3cfa9892f792a1f28221fce86cdee7b4ab9c2e940e24d0e042e948018d2d18f269778972910934b4609668a92b6ab759305e585491b5e6a9fb724fa08105b36fc44a5b1ff28bfa2de0051a57308748b1b81c618296489221d0b08279e2e5096d42984a9b106854c1fc793e63d4e477bd8d0615cc5a91429e143f29ed09a2310573db7bf67435e1fbe2625230b99e4c492bc931f0078d289854a5f0b127c46728090f2db31e34a0602a11969eca5efd12866f8241e309c68cb979b724eba28d5ca08386134c27e2f4464499a4e5eb1f3e920b349a603635fdd0d2aa94c4cb434b8c307ef8c01eb6051a4c30d59bfa16911e2ba8022ffa0b64a6051a4b30e9fd206ded92107a9ec30ad05082390451919024bb88706240035ce4c0c2458e1d2307062890c38a0968248106128c138258380d1d635455681c818611b408067b1b4d1799a03ea778685d40870e30c2200279db5464eac3c78ff7e1a3abb0406308468d5cfa3dc9503a4751173484608895fe6df3771dcf2e3b018d20143d724a96686152a4981c0e6800c1fc225e6f26ee851c45a4d64640e307c66a0b16497e3ba4c555a0e103b3bf675f2eed78feff08038ce2a20b0a1481460fccc1e3db6d97ed9a52a2c103a307115424ef1153a61268ecc02474105a27f9f98a2d78308e1c5b20043b0c0d1d9883299dd9a9f47869e5726034697593ceb332a08103b3e8c82167b4898d0f8d1b188436a5e742083222a86240c306a624e6b293f2ab8a6cb760462d0c3aa6df6fd797b7a96861f0cead6d1621b3307916895bc28434b9932ccc695b945aa9a9cfdf53e0bde8d1c58f19b130dfd8d97d52cadac73166c0c2a442f81c32f711fffb579864ef5dbdb8573221628110ec0063862bcc27cbd6c37d8e3265f24893c08c5698c7839948f62356982ce229190f397fca41ab309fae5afb1a4b156651513752448dc89c53617ae8c8395d825061ee0839e8c8c9729b883cb45e10468f1f3ede9502760a43b2b822b4bd4c8a1e738117894d61d27e2a16ee156f455f8a8256f36f719314e6586f9dae735bf58236c0c3474300edc7fb188591adcf724893ec3d4414067d51df57f663bbf7a130bba54ffa2397f604ed1761ec500ccc0085552ba3b6ce3de9cd9f30e8d415319268452d390fad1e6180e1c5056678e288bd9b9743524b4add892e881f4969b42d3f831306716a6172def85988f098b189f4551023a2dcea46af89f674c8ed91b5d2bd3261f0f2dbea0ec145b28b896b62cbe5fb582f61fc206f6a415a4a114e96305aa8dc31f7c278520b0fad84c172a7f7f653f75333254c27679d54864a934fc27059d9b5fb926b972909a3e7ac96f3cc29494ab3c248983ce89549a99d839b1812e68e574a4848595e4f7f844188b4a5befcf7cc5288596086230c162a05b9b9a712ede4a1958d309b0eb9b27c4c903f59469893564818613d42646711a6760bf2b47f99297915617cb7ece53a39276d61224cf27a743c214c4418f746c74fa974f2adcb671cc210fb92fe1a8d1375bb47183b1e0c2fbe00c30b84c00c4318e4edbb87e4bad5396046218c9e2ec7c90b12b7e56206210c2fe1fc6737f27778076138657943b28bebc4490a660802d57fe766999577185f94198130c8c58ff9091f2fe469158119803075a568a1e3681f25fe3f9877c4ab625c2cdf8ab2482d60861f4ce9fbe7fa374a379215c8c1458e2e6030a30fe6efb8ca081e29cbad1000c50c3e987445bcdfdaa5bc153ac18c3d18c5940ae55d421e5a5f7cd1cae38718ef7a305c888fbc48931979309aa90ff9435ed05f8cc1750230bc48011b60061e4c2a2307f57b97f52346abe0b2ca1d4cfa2b7d9712d926b3d9c114ac735410fbd3495533ea60ea7f4b5751e7629bc6436b7bfc0f2f5067d02167cc61861ccc5a396b8997944672639811076377d0cb155256795167c0c1ec92f38752ca6f25a56e0b33de60fcd71b51325d726c871c61861b8ced975208422e7495dec3b0c08c3698554689b8a69692aa6583d143a5ce77b9b5c32a6b306aea08ffdb486663a9c134124345cfef21240fd3609226bdfe6e25968aea0e31c6d8918230c2f8422d0339b8e0c2821968304baa7dedd2f39cdb9dc1204fc7529683853495c4436b86198ce1c1a25b4bea524ac943df8b1e3f4a1a04700d33ca60502e622968e54942725a10c68e307e5cbd8761017c0f030cdc1964305dd5d57f05bbf41909c18c313c9773c510ebbd62a118103977234208dfdabf0c6684218f936c5e2154a947c180bc2c324fa8b1f81e643998f185d37cdaabd4d11e39c5c73e0fd488d4d68f3154c033bc60942d934942757e112a35a30b66ff90ef2a82cb05c3683b3d4f49a58821ced882e1ecd63cec5f08c9453b5c8bcd0c2d18d343b25ec9bfda129330230b86116d975f647cd384b06088974b37e2e5b4a0b43e7cf01961c615cc292b2fa9d74fbf6d6240a9da516733ac602c79212fda45b7b95530fc8539935dfaf99ecfa082514db2e412c2623d4c664cc1942d64cb5e6af647da3cb428c087195230f7e4784a29f9f2d0225681195130c86abb30115bc3f4050ac63319212dc79f139223b787194f3048aab3902bf68356cbfb77d4cd70827172a4d42251d4ac844d305af6ae27ed9644268909e62b5f8dd75695f87dce58c2936cde2ff22535f3f0d11058eb194a30e648ca4155ccd57d20c04930e9882d774f194ad96501370309866439e7e09d9d83f4a42398edd22cc9c75fad3b19c1f0be9ea6efa7e39fa908a66c89a7ba5ad192e88960fe0ff1c2c4c5d0b1fb2198f65ffc2f485e0826b1b35f7b661ed22908060f739f74ee87650f0473c82d7651ff4377e8072639213f7d5a1493a90f0c923ea759e4f2adb007868fe149c64ede08f1c01c9e7368115e6196f31d982adf5e9b3cb5934f3a3047d07341acfff3b51c1844efabbf4ac8f3e2c0ac6e71cf2c04cdb881f184a4b90a6ded16cfb08179d443103a478514dd530bf35b4e6a42829f577968618a71ba15cbc74d8a6716c689dd72e9e15c5c3bb23089603e4a9dd0896f762ccc25b224b5f3d3f21d16a6ca9d64e991941fe4af30f78afe882234cf3cae30486a17253f4d7908732b0c566917fe4a2d3dcbac30e7fc6d1131cbb398bc0a738fd23631f4b643c2aa30c75516a13454bce5371526931472a689cffadea2c21823a382b29238c9db5318ad3a462a13f9d34ea630e9a06d94865b0a5345acf83029e49e28294cc2af634bc6e910c15118b2670d993f15563c1585a94549ac4f217e7969284c3df9949a0b6a494da030643d0f2a8e48aba5435ed03d7a74aa608b4f186342cc9724d573fac513464b2de6b9d5b4b22f9d30e9787dd6a75b4ae40b27cca3da72c871f73dd86513a60bb1f5a62dae989e9a3079ef5e76d0127cb49909537acb73212795d4041313e65035fa921ad1f9585ec22043435fcaa152ef474b988212a3c3695de97fb112268bd19d827213d94e4709732e91954724ad68f74dc27442a86a8705a1937c9230a79b4ef210dd9fe38b84f1d2847ac92374763d48982babbf87ee24fbeb1eb18523cc964ec77d92f47256234ca795f95d935b2fe41861485aa9ace65d7bd54598a4e99db419426a8798228c621756a7c487514f220c5924fb44ef9cd3418439a71cb592b4ea10a6b83db6fdbf2130b768d1cab4652ead4dfc628b4298c462686df7e4217f4298b2f36ba6a7ec41e88330d9554ace88be118404610c11eb1eefa9f306c260ed9f5288cb90e30184e1c64daa8f4af1a0fe832929b77822abe513d90f86393b216ce343f0601f4c25d977d24e080fadad2ffa2a035bf0c19cd7626fc9c512b73a021b10630cff06f88b3186bf7b21c96e11aabeea409892a4cf95c27d99970c08a387fdfacfa9ec808d3f18e7e3db999e117152d80fc6512b41d59fd28e90b5d1075398de53e236964a5e1b7c30885cf75c2a555ea98f8d3da80d3d707da2e9357b5b29f721860fcc43edb08107a39c8af569215a529f7407f36b956c086d32b2e67630dbe7957cb724d359540793ae11a363a6c7310bd1c170d967d474ce44987a0ec61017d6f4cfe4dc2339985c453da6a9e4af4fc6c12cda3b3fd22d870a271c4c6ea2d3be43aa4f267c83d1724b529c921b8c274cfd2aa90efae2d706b3be658a8696ef7431361844947a902a59e6ada4031b6b30a74bd515b265ddb4bc810d3598478d7a88182e3968cf38b09106f3564bca3fd34b7a2a34983de49b901e623b8c08d7c0c619ccbfb9f771eece54fccd600ad94dbb29191dd6eadac04619cc95fa5d5216b38e9892c118a632b2bb9ece578c0836c6600ecb96a6c23d6c5b2e068375ce4f579ff27ff684c16c27534de4b7486c0b180c29d94ad00a53fb4bd9f88269440a4a9bae3c29d2c80b0693d9cb49cf249124dbe88221e8d3b92a42481b03c0680ae05920043b04c0031b5c30965f690d35ef0b36b660b6f84bd331a284d88ebb2ed8d08239a88e3bf92b5c5229f3d0ba828d2c184bcb46dcc7a460030b86b73d1521238e7e4f47c1c6158c35ff93ecb5c27bb06105c35b5aadf5effa3979158c112e5f571cd111ff52c1746194704bb2d61d6c4cc154ef9244a52c6a44dca460ca9d63c288643a5de48e8d2898927da55f4890cbbe8b1b6c40c16ca962a9758ffb2109b5c1c613cca2a39998e71017d725c286130cafa124774932f1b77274f1801a848d2618f47a7256e4b4f37c79c106130c2aebf396241f021b4b3067b5701be25ffa4d65430926ab2fb125f2f9ec5406071b4930874bb4f291905227892a6c20c16cc983becaa72adcb54730ca0819da1f4f6eb6564e61c30866cd097a2c28d3e16ec74ed82882e932237da64f4eca430483d0718b223957c94a1a82314fc623850be2eb7e21187d7de4e71fa525ea41308fe7ff5c8b1772e10682f1f497f7f787e07dffc0944e9947b20c6556a90f0cf7ffa5f4b989aad90393940ffb51279ef55578600e3ae8abc85de7ced60e4c6a29b21ba29eb6441260430786fc25324d2d89f853ca812189c5f270e791431c074613263c999459b7cf0dcc95533f48089e8288bd0d1b989388e9d74125131ded5a98821c1711b2292dcc173e3e632605152a9d85b9d3e64908cafc52d80e0d356461cac92d59529d42895cc6c238f23f4b4c5de888f70c356061128daff18c0d91ecbdc2747f21f8e5b8bb5d21355c617ebf14b176737bd96e8539da5c9c52e22ee5cbd56005aec22025fd8e92da6fad630d5518fd629e50322b5ce42017c8c1450e62811c5ce42015c8c1450e42811c5ce420355261ec94e63ea79c15cc54cc891aa8309dc4cea7972fcd5d763151e314862d5117d47a3e1d3f4a440d53940e52a31446519e8485cb5022b2355d440d52983e94480c4b4945cee5086a8cc220ff743edd51ac4c0737504314060f2af9fc64a51437b3136a84c2d8ad233c9a8e6fb7c80f35406152a94285e8f727cc3d238450db1242f6747ac2202905c95e4955feba1306533febfad71c696e066a70c21427c95219999750631326375b5f0f8f1644eea0260c417cb0f3a81afa3acd436b47187e2ba89109a307f1a02fa50e8dab7968ed08c3338c1a983076e970952d992e97a44b98822993913d755dcc6f0983851a2f8dd851d4d74a98e3252d1d77534d878d12a69d302a6dc4348dbc9d1a6a4cc238e9e255565216c77c2cd4908429779afc9744867512f9682fbe58c00ef6448d489827e424928ddfa42c491e5ae97becf8d1e359b09030799824ea4da4ec11e6c83dee2647bda5be3bb40b351c61d0ca15614689daf945cb0a351a71253f4f0b2a5c8f8c38c40b35f1c36a267a8be8dd57d5b47fce3f114594725415bb2f11a990aa4a7b88502cd353d8ff1085899ff99fc2a8f01f43e47d25b372514d5d0874c364f6bba82c5912c20fbbbb11e635dc710230bc7881935a409a8f1a83308857909c277a9fe993200c9f71a376b6235523100659b14d29e521b4e41220cc2329d9087d3b0fadabf2c3c79fc00b87408d3f183dc9e7acd7c9a427bf861f0cf2438e5fbe776e8a3c748c1d7f35fa606a893f496da808419438f0450235f8604e7d2912846759630f268db8a5a4a907d3bd5dea1c467f7b97f2605041c542a98e24d9e478307d0e4aa98f91d3bba23b186c6459b724353a2b6c07936d6c7dc841ef8509a983c1d25fba588ce5ad4f07738585dcf13f6ebdef3918c4645d0b2a6639982ec75badd23befd6d5888329cd27a145298b58a10207539c754991b7fe428d371875b647b4fc93a8bde8d0e1e328a1861b4c6adcf256e6a98a9e1ca3461bcca3848b6aa76442ae285550830d869ca5a56657164d6a54a8b10653ba0dedea295ff6fdd460d02952c652a7a4c1204987cfc983d6aacba141df1271ce822829aa710653fa17dbcee5318371eb23c89972cb60b015d5d1a1cffcfa440653e56c5a3a764ce8f0180c2baaa2f5f54e344737a82106d3a5093a554c8eee12660c5020c78f0e83d9c24248ebbd81c19c845ed39e17e3a179841a5f30e41c63464c701731a04387116a7821e5797499d04a6bc1645564a8d105b56387d2bee173c1102496659bf42476f9168c9e62d9996fe4104cad854376a73bfb4bf9beb42c98d305616274f47fb1140b55e30aa5c30a26d5b1eb7c474948f252053e5356b256cacb7c4549b2278960badc22d4a082d92bf2fce4b97851b329983fa5f797381a5f9efa1380d11a10420d29983abaffd789b41e4e1205539c9febbf514a95447dbce027b041a80105e347f30f2afc4fdacd0ed0a1438c56810e1d359e900214c617e7460d2718429edcfaa726c9a90c6b34c1543a4e99fd67cb113213cc299cfe976012215a5ff658564309e648e24ee229ab245efe512309a6dd52254109a1a3e85e3590604e3f9652c3741aeba41a47308cf0fce822549660790d2398c3943cbd78b18b2554a308261549a9ce69259e85d42082c9c5c35625e9fd4ec21a4330a7fa5fb7e8f1bed52404c3c66a4c90e272322c542308a5e3d40082d1ce7b4cc5532a7f8a357e60aac959412ca74f9e92357c70ecee94535918199f7bfc10430a357a605017df279f9ef9d4411e6a8a821a3cb843e57c715311cbdbc13bd6313ba88935511ad4d04171418d1c88510307a66c8f1c793fb40bf8418d1b18f4798610f149c408196bd8c032959044899f6a61526d219cd887f34e39b4307d8b94749f2f7928ed2ccc5f29a9fb791031f2938539477db43e6eac592a16e693eb109f4c0e0ba397c66caca577af30dd785df0d3ce0fba55dd4580862b921eccf572fe051aad3056b2ccbdf83b2b0c7f15aa553b82aae8e1a145631566bff0b7e6f91e3e3f63c1aac298a1efd2451116fd3ea9307bd5e9ba1211a97562870a9375a8a99e9eec5fb1198d5318eb924ec943b6b7a417331aa630871a954f6eecc24a4a611ecb6184ec6adddae4a4408314e630757fc93d66466314e68ed9d117f7840add9ad1108529e51443e8493e312fc78c46284c99dbe152bc6edbf3663440610e796742dfaad2e5cc687cc2a41dcb72ca17b2165c331a9e309eb7c7f95f4ea576e7a1e56596011a9d20a94a965482a809343861b8966d5b99d196ed4d98fd45ab4f142d9684ac09f36d89139f92b6952866c2f02974592abd38359f0e1d582a402ec0020d4c98e4cb78773e8d147fbf84d1840e8993c2a3e87747f9d0b38461de45e6d4e95c258c992a736b55126f4b37d0a0443257497b27cf6ba0310983eeb4086bb92a95bc2561d0b1f3ed2676eb7838122649eae2fa76c8e1d4dec08e2a489824dabe48fbd3262ff608b3e7e748c8a5bc52cec411a6cf351f7354bc202906038d46988457b23c22e5f8acce0853dab6dc8e307eec782d15305a80c622cc239e72f1d1445ed02ac2f46a3997fc9c589c9817341261bafad04988b06c723444182e49af546d9e7f6ff1d0caea8202398859398d4318d645296dfb383be91bc23c9e6657475dcc948846218ca7e38d105751b4854d8310860b57415b9d059b5cd31884b183c91e51713ae48a82307f325713f39a8796d1088469b44b082b4ac7497e03c29423929022973a4eb834fe404a26c3744e896dfdf811060b780234fc600e793de269554c9b8f1d8d3e18b74e88d46a1f7fdfe5a1d58207a30a8c30bcf0e1e30d41830f9ddf965c0e41630fc64a9782cabda4603aab071a7a309dddce019bc011086375be09c2e2e5f4541c8030a8a94f1ad9911582b0e0f8030e3f18b4e55c7d129f2462185e10cb3e98736c52b2244c9f0e3e0f2d3e1894f47ccff9606501c71e4c4125996bf9afb7a8911760b4189738f460ca214b563b21c3d7f338f2f0fa876fd3bb923bc2432b056184c163c77fe15e98e901071e8cfb5a5ae5fd29089df2d04a1c773004131fcff9f6a2ec45d9020e3b18d7945e7b0af2e27b9c0b1e3fbcf0808f2fbe58400e2e727420071739b8c881a4120b38ea608a1d3b9f78132a8fd938e860ee94d7741c952dd5e870ccc19ce358debc32eb969d87d68502871c0c23cfe47dd0b4d57d75e8f0cfc1450e1ee847e188836962a54913bf4211e080834159c95b093e417b2adf609ec915ab457b4605cf0d06194ad693de65eaa8b80d06d36954591cd3fa79ac020e3698f5ee5324693bd1641fc0b106c37d2eb7eff7c997fa0570a8c1b8ee6f1d3dc56930c44f7fdd71394ea8af1801071aee0cacba8c59f96b031c6630f676a54e2eb2e33dc943abf4f821068e3298e33f47672df19083c943cb8a0ce6f289ee92f2eaeee9c760baec6841f69e5998470c260f9f45857db174931406f3ed78fbc689892c81c17479b9c3f75daea4e62f983bf642afb576b78d5e308c8e5e9eec635de04526679aa8b985e0f23d29f7eebd09511318cf824f22e0e08231e5b774db27b568150f2d1f5a3b1c2d0066c0b10543dcb0ff8d943c3f88f5f0f1c38b2fe0d082d97f634e46ee20546a5930eea458d9977416cbd233e0c0824168a410af48974cda573004892d419f4d2e11210e2b986452874a37429b028e2a182eeed4f87cf01cdc5275051c5430bcc90b1df9c29d88f0053fbcc0038e2998420aa3bd7b443a79f30e6270c0210573b797b650ea1d4c7ba2606cd912dbf6fafa161d01071412c96582889254c602f3c1f504d3bf5e9e7e13fa20030e2798cfcb249bf768fb7013cc6dc244b057bd70cb61825975e24dcc30fb9415c7128c6db2344ee71a49a2027028c1acaa9fa14b9cb0a0454930bc6aa8acb997bc9308120c49e9b14b713f8271c4e81479e2295cba4630cb9792f536d1502a5804a378d4906e7af31b311c4430afc52a4b5bf3ecb09c00c7104cee979428bda767f4a1031c42307da914fa93427648bebac0e8d001801de0088279532d8a8b100f7000c154fe963db4ee9e109f17e0f881e972ee0b69ebf2b1190e1f18278ea8c41c3da1e41c5d50e0878f3030c0e387171ec0d103538d4afa3016ac1ae0e00141b887705d591203c70ecc7f21e9ec974efae752a1000e1d18dcfd3474597ea7c8171c39e0628498267227f49c827f1f555fe0c0816926b589ad6f15bb51318e1b1827c8d5a95a87ac52e1a15506c06103e38fde7aaff4ff29be3cb4c6b8510ba3a8a9f825935289d87868ed00c38b13fc51417f8f1f1b58c10d5a98b4bba588e59cd5646916e6903fddbe62fa4f88b230ef68675519c98d58982e46a77c57e19d5f040be3c958efa09a57223daf30c7fb1ecf904917ae30ff5a5fb0bb54bb176a40870ed4e3462b4c3a459193aad4b845f0062b0cfa2ce877de5925f1f801c621e0c62accfd27c2786c0bb2df21b50eb8a18af77cdcd253773752b1375071e314374c81be197dd97451252e32cf0a374a611e11bf20ba43a43098cc52ea82a6a4d1d95198d383daf7cbe58628ac043742613825a9c4a2f7e7704982c2a0ce4479c8122e2995a9007d80dc27c80d4f984c6427513d4f3137e4a1652cb00adce88421cdbe28f9d7f710373861d4dcaa34b9384b92db8471e77264a96fd3679b268ca3d5745bab4a9f4a4c0e3732613a1129287f7933a14a4c9837d46289ec2de3a69df5e1c625cc5521858ef99de52b5c9630e68e7a8f5479c4ea540953c9b7dbfb5c5a41d3cbc30d4a18e762b5c40791f393d024cc7d997ad2f38787960a7a9413dc9084313c848e5c2657940445c220728cbf5c32ebb02a0f2d30c6e8210642c29cf2e5cc8a1c7c84b163ef5ac4d80aa9adb207a3bf3874c311e6bcd43941eefc241d6a8459b4edeacab47fcce70e371861083ae4ef590b51bd2a371661d2a1bf1ee5fdc24f754311063b9ba0e9e32a62d1449874e74e9f438520ea53fde206228c225b9f63554d7ecfaaed8d4394d2c68e9df9824fc18e33dc308469bca4694fd2f4c23b7cbce053b0238c1f3bf805370a61aa105dbdd408c9a2478430eea7393913c7362c83307eb8b11326e5c2adb225083b85651b6d3a57e97718146e04c2bca2729e902bfd95e7e306200c93c4a4d17ad192befcc1b093b446bc89a62ecf3d6ef8210737fad0c849c94f6afe85173c10a93c62850fa6d8e9bddd395cd27979282afb1b7b30ffc4ce4f4179486bb78f5223b8a107538ced7753177256a5f3603869123ce8cfa36adec30d3c98f2a5a82c3eb31224ae37ee60b438bd3fc9c24292af1d0c7abb15f4e55cb64e7530c9c4d8f2cff9e154420793e7abba9823962f7d73307b788b3fe24675e30edc9083d9bba429a5c765a4e8821b71308652b1ed52ab3cb48270030e867dd36e413b84879606da7e70e30d66d7731777316bcd0d26715742769df2d1561537da609cbfef77cfcb7f9905000737d8604c59cbd31e4c4810b3d81acc579644540b22e7932d0036b8a10653d851f93de64e32578ba5c194da479965734fde17c70b34867f0fad2ebe385e9c008c31920e1d358b1b6830fbe8d8eb9dac5e46050e37ce60c8a5239ea7860a752f1766308f38e9ed1523bfbe2e8369c6ee4d8f4f0653a820da4f88aca4463e06b324cbed693fe6e56a31984f54323d3971295f895a7c613007efd87e4a7a300d37c060aabfcd76d3cf7dc1e839beef4c8a1fd64230dcf082d19384bc2a32d205839eb0e517be6b74ccb860aade4e4975fecefab50563687a78c96551826df26e68c16e64c1d815d664ef3b744be80616cac78d2b9815ec46150c228b5cd21da2a794743cb448f9e006158cf3d5b3b2150fad2a37a6600cf5a3e48ea74e88190f2d07e37da0140cdeb5aa113ca98e75230c5020c70e1f5c704172004fb81105e3aae7453df370490f85c00d281852aaed98321397d3e3a1c51cb8f10483eca518da1d5fdfdf33860f2718d4e80b3adf4216251f637c21468f317c20066e34c134e2a183a9982d413b5ed0e38731c1f469e184e7f2d991a0173d7e8c15ec08e3c7120c492cb36394cd432bed86120c5fdd6982e90d3ba51e430c2666379260323dc923d77a07ed96c3700309e65a13526cc27878b8be70e308c68e9ddda35a2f5392cc831b4630efaf6fccbbfa995cbbc7186d811b45308ffc9490ddad93badfc1f02255750f30bc70800e1ddd638c2682e9eff358be7ae43cb6176e0cc1a09282d9ee86321381e1058f1d0f032f7c70136e08c114247e07f5c9a3e4f575e840c28d2020227d10c93b8909714725226e00c19c4f5c072b1dc45b528270e307e64e963ec792c70701c20d1f709d346488cd7c490f1695744ae282bef5899c1a6ef0400bf974678b33cd93d7706307a70ae592522e8d5a07565232f2eb599b974a0ebe3c72f1a24725a5180e0829a74a172265b871033cb5522ad78895e55d417dca5b6e687ab8610373a4583b2ea9e47afc550b731ec9c9a398704d1be5e02202b4281db330e8cd7ff4b17c604316a6ce12f9f631e3b3cc21d888854124f1756d6d9e4c070b634c981341a508512222041baf305e945339f121c9cb88d870854185bc973284522b8cf676b9e73de928e6af95f5c0062b4cf127f5fb4af4e52aadc224362de24d50a6ed3e5518f743fced47482a95a7c2906eb46a2bc4ed4841a8308df0604a4ddb4e544a878e1fa8c550010f6c9cc29cf19e233c8e1ad52553986eb55228d3a14bdd5f0ae3e5b22dd3b1233d7d4861d0ee921627a79476e9284c71ede53da8246ae41485496ffefd778d7b743114a6bc91f1b95c038579e62d7b50af1b11ff274c6b61912b76ef0953ca9552af9f8ace8877c2f4134b858b1693556c4e18dde267dda7f0a5abdd8451e2297d2a5a134e4f4d98726765d5259689ed2bbc9710db0eab63e213797625749ecff91dc7362e61d2eebc9ec4c52d61c85d722768f70f298575e898818d4a182de4ec5a22ff54f6a7842966f6f9aec8995e7e12a6a4245c6775bee62f09f3e724928a3f972174381286142b3bc456b37e0943c2103d565ece9c6727f711e64f89591e62e37bb28e30fde6d66f87ca766336c21463dd744af91861f42b19a62cc4fb092dc2203e2bc644cdb128170b6c28c29c53decd5f8aa5bce38930643353f1aa15c29b106150e9fd73def574933d8730dc8a4a5a627886786c0873685fe859901f9ec4b3510863e609d5c86b9f62458430f99b49902d6e1a4acd432b8c1f604420d9188439966a9e9cfbe42f7a4198637e1e8f53a8147126d348240c850281400c0231403cae00131308001834220cc68201896034941f1480034e3832483e36222820160a8622e138180e05428190200808848161188ea15892079a14f501c6a2f519398c78796186fd2b2c3e7f007a467d0b940f2b021ad7558c038d5427f5243e62f8995900774ee2ca7050d677bf8c9c906668c6a1714616f173a00d2b8f40a95785f23bb8941e696a4aba5558ba746aa1d5a979722babdc14861332299aab9a2f7c494beadba88fedabcefc6d8836338b8a8ac668c92cb21648aba8692ccca993d8961b6c8e911f0179e031b390ae523d2e379e87b6119fbf7d561b01fa10ded6f3feb170ab79afd10d9ef11a6ed8ce89e2574b971712efa61c3ab6cff3c52bafe198e349cc1b8918d5dde356dc023a695ba06ad9c1d811bae004b58b39d41cdd585bc8bd086ea0739340c7bf7c9c4175464534134a00f18756293610741a96f0ecbb93f282e294a0153b854e2cd1aa973b470fcf9533dcc432901be6026a556e5b571817cdee946812a1ffe7b19089523a3af971b8e4e9009f8299f6e8592f2fc841a655b3e1dce6f1f75d6712b1270012639129a85867adb5e7dbda1e800a7f70bea32b2afc82f09de67555a47d6bcb09058a63dd245e63a9c483dde4e2a1e7166d4891d183351c3dc6b62dc07a107e67bbe57099571ea32375d818a93fa065aa52011d07f194e0d827ebc100998a706140bbf03a1ff48a8f7a9d1fef5520f4321fdacbf171934d808ad120e023194d94bebdede1b4bbf31ab898d069fd55ed0c2077b6f9ee35c3b029c9618406bacda6e3c94837af848a3faf6434008aeac9b96799e5997a64aebca3c880cb808f4361854c2e2f8efdc1e0f9b649b6c253fd0dc7a4a4e53724eede8067958c9d3e25227248f2b4c9a8fac49bb6ab103c36778d402a2e08205c1d5413b88fdaa2d28ca74ead38b212be1050db2c7fe15c0b684ae142216a05a1a7ae86e657116abd3b4d283acb782a5f279da9bbbcda85877eb057a772e97ed9510e2fd2b93ab74cf4a26072e355f5851417df145c3c2a21075034b7606f3710da2c22a3636aaf8e35091bde86e4a2b1417d8062f22a0dc13f7bbf0cd20079d7e137348cb74e03d9618cee4bb7b8df0923d36dc415d1889380a59bd3009c17d5001aece633dd64ddcbdbce1aa646305b483d9c0d1b77a835e30aa6cb81e50318b3c4d873d031a690f970232c79530b05ddbd521eca2e83866508f2faface52a927892ed8d8095e4c11c98747203dcb19d122981e404ff967f5ff064bf9611c4811690758e9c65862806612d9208248a61e7f875875b41c26213adf60d26c876f4659b381d209640215890e1b0e4c497606167da13e093233d6a7c082f284ff4dcd8bac671465167c1ed2180d1b4372241ec9ec763a901863cb72c6e3c8c0b1df05b6c968b45e8b1ec64208fe4867e09997377c90cfa248f105537183a71060783e2d165a8f2df0a07627deb687a3f8ad7acc3be1a05346e55e842cd32f04ecfe5836cc26a9ecf10c320f77dd2bedb86e80d50c1d1302934064f219f4d363f94d46911c3bba80199b99322e7846808a599d3a232a0347025e6c5220f0445f45d291c9ffa092049e01bb1d82060eb88ec741a57103388679dfe6ded55ea7fab8fe64d2eed799526153fa7423cbb3360bd853c1132f620ce410e36301685cbc6510a5e744c05a5111c990a68f51f8e1c94db7b54998d9b2c56cbd39e3135e87145e3df3f8d312c1d472c07dad9752b94280a785c80a0799b1f314166f54f760e15dd34f49036a04c2fe1371c52ebb294013aaaa033e69686b9f33927d1c3b2fab922236e055d3fff42eb2aa9531ddd2e4ca8fe0e142397195e977593f154b7050d7e3201087e0e85abd68934267ae0888928a1908c8815caa2d2b97610f900a64e4445ef524306dffb982ed475cc9844c8160660ccf114a179feb8e8e151a506a73b706cf7406a53d8030a3f82b0a49c272885091adb1e9e72b8a9dc964093d105d19077c4d6a033f297954408ddb2981862dc409bb0dc80fadbbaeed1ff563620081abccad6ec715efe4eb1dfb64a23b3667859d0b98f90489e84d769d5395d49bcbe4e2f2bbeb12ead259c6d99c69cd4576614ba4e9bfa40118b20c05ede01996f101d8ef3979de0612368521b4bc5e5654c8afd73dcbc09de96573d6272c85a97ca2b2215a1486693579f7e8d3c1c83be880a4bf7008e0ced6bb4aeec2eb0c16ccc0d2b5633ff2b90ee9c59329fbfd7ffa6f5f8e7f52a86c300782f9d9cdaf96a043ae6101cf5c2a15632c54ae923aeb76552ad4ae9e9ce784a85766a799d8b11b443aada2a1da736a3d1c464157f60ba7c8eab410c190a9db7a8ce92b68808217647b9827dc3d6eba98f472eed73307c7d062f649768fcbdb1e0dce21ee2dfa4d5e2066b67d9a6d0fb64261eaf59298a2079c0152dd0088e766cf807550eb286b53c6282a95ea650ab5477ff809d8cb06bdef8080e0074a3c8441bdf74ce87f482100c8b57fe367ceeae49abc1f55a300f65c189e201f75c5fe642102d46fc83d81a82132c532f1d82d8d33635f944906d1f1947e969ca4c4d3721440ae373617c2750376611c1152699c4042c2f46d641d1985c7088c8c69408299d2d2d8b50c498d3edf31c27b3ee66cebfe4330222d9f9f339f8eb243a98bdfb868cd0525e272cb64efa92e4b565d9471db5523e82e4e144a75ecc7cccd9833ea54172c024437f1177dfb0ac20098c4362283155b7faf23c3b2000e7217b2da8078e5bdf311a160b611b94614d652e62ee0c0ed54c7a7eeed36c1bb95e08a59f2f74c449fb26310e3167fa861ff6a14421f87dd6b59f23955f603c4074a9db9cc07220af0cdb56013be214839105b8314040268a4e00ba412af21b23dc8b9b485688486e6885dff4762bbc6a120c04c1e4d8350be5807b420290eda2bd83d19624091676f758109261684e5bb3e5d0039c4cdb2d3bc074b3604983f9b43b8714ec081a80ea54cd1384010044eaa8a233f344b0700025981705cb7763a5584606e146a2fd01eb9a6d1e5d1dc27a02fbfe02f24208bc72ee84d599008bace6e9aa1b95352def3da04981a77c8956aac9939a78282ab601f4b40a42a7db3183440ffd3703001964a33df5b59ff1df0ea30f1b1f03a590557a4691d067d0c7665bec0895511c5fad4194ad5c594688b05129c6be2d872877ff26b1ebc7be0bcd69c9a06c867b2f63dafddf2d6b911b0d32d2d917551873332493351910839f7bcedeb9f63a41e299de4e275801e1a070a1d3613498e34d72312a3612f77233a4a7fb589a5adaee36fdb7be0b80d17b09fa595d564302518b68c6d62f57e7e318de3d5441d12c5c0ea02eb67b0cd09c2d13fd3b81c1ea41121cea34990b227ca065e88c8e12e9f223eaa731235797cce0a882b563d4bd194cd34dd87b5cb5a50c04ab6ebe381bf116180e505f93e31dbcce7d9eef2a7b9dd8dd0255a29c3ea1cad640d1387b8c63a923b2020744a7d00d21c8b0dcc1a1550328f285f81f976a3a35b479ce37087442f438b760d8d52bfb1ba5df3767b7c367ea07076cc81ed9c0ac3f5c708463733c800929be84f0d4194f9776ec27014a560a6907e79089a2a996a8e005d02b54ad34d87587f9dce654a7e744fd39439d526bcabd19a609bade44262e1ec029b56ec39277882bd714565b1ce843869bbc13c1b9332d7632688a5ee085d0a909d96f306ff9349210fb9aa52fa5d3bc7d21e3da23af29b2c34fdbe3b695cf942b763d49527f576af05d81ea2eaa28ae66937c442c62c83d6f6d0476eccdcec164a25e6ccc31b48e006ef92075615d2e5718cdd3df4244533920e3e2122827cb6098771ed8f8b8c7d51c6ec4766b3a964203ef1cc90f0a8e8a57d68e463990acad455221ac690ee8589403ff2c2153868a178c89439857c19b62cc99091f4b9f766759ca4dd9eacf4466bf22a8e8b4340e7d044d54971d1cb0c1db4e00219e83f50ccb63f1171870bbd694c3ca837a0fcf12dc7139597b0b082f94046ce53fe1b7f82a265fb5a43e91f1aa64f4368a17d27c3be27503bcd5cec03a67991367a3458ffc8f71b13fb5e290d85686c001ca3e0fa56a99217ec00858f0c35703657404400db5f3b5206749d4072394c0b884e32828ddd358272b7ea161eae03af361e2bf786cf4a459888d4af907544e046e3aa973c80d9ca5a434fba5035008c4c958f21c825b68cd057954538ba4d20d67f2c17d9bd7cb9efc8e5793942418e45efd937cc7a556119854dac110e2ddecbf3c3d1201ef5e6c8ba4cbc10730fb3521726ac57018301031d58aa82e648766b4049be4f5bab40868e4199b560ceb3340d5b85037f49e07dc939f320052e6d6cd283d2089b0b3d7d66eebb15e3bd50413f302f45ca704359c02ffc92e6d441404d61656e406dce4e0072be89558d38d4dd9455ee9ab5666fc2971ca9a0ee72905ed607cb81a791c263cd9bfa451958e446a9776aa3e42c1b5f2cb15ab44f26e8688069c860591adb8089b01a831451703f37c311c76357e868f0ef9ccaf236004d3f9c43ab6a07b9895e51b9ec2c7248b85a9cc63a80b189d1f2a3807b350846a85c958764aa67541bf24a7a8069cadaee7e571b292dcc80c7b4ec12276c91ea37a635808325821f04a903f50ea2d33cc868e74a0cabb201f5a16503c86a0039619f105dbe608941ec405fc15345881026ed054040d41a9ac97e6f796c0eb990117bb03326f39c5d6f95f85cbab4471b0dfcdeb5ccf5fb8233e4d71a2413c76fca2694063c9629c149690642416a8432729bd6087527bb2824211e40aa40ba422e11485df6505bebf8c41c149ee91b96c6da85186a256e2e50ae906b0ffa21613952a552e294f1b5f076274485f4772e0ebe5b2ca381c69ccdce54d46829b407ab7d3485ac26617a08ad59a28ec44c27c1f214843434b98338761d2073d2b50cc9a0864b2860f49d56a92f1064f9f3bbdc6fe62a3397172899d10a74c2873cde3f259230d57a4be8cada11e48e8ab66cf5f94fa33409c5fc1f8f6a252d4083d0ff66b1c692e9f794e6a617d316586df3ef6863a7d41aa040407dd8ce20a43287af36cf7625ed400b8d1db14f0e7bda32418aa03c8c6b714cb4c2665ea00d3ee17ad218f5a64fc1aebd835b3944f43294c760ec59a971d6b5e9956269d470d73692b137797401f4eda22552bc11d83f5641a2de431637da6b7a09f83332c2cfd55d4f8748bc39931fc6bb7a40b746605bbe7439c2e82589135d54e4f387e212f39432a856f24ee8881200673e124dccb10eccc28f3622f257cb70eb8d6c28e45c1e4425ab09ae90c7c5bdb6b99d2050a8eb16b72fe096f52ba86019e7c0e041fee1738907c0549dab4e352f598d1f747223e45f0e7b133a0ff8d5c33b946e1c3b503a4401cf3e39defc84c02add5f908698d729d173a98854d630480ef451581907eb5833a549ceaf4ab5f662ce4ff6d581cf3bb200651993af6fc125d44b415e4b159c3c24797a13aa8264aa96e7eea360486a8f904503c2b413aafb5051971ceca39bd6a9dc25f00662e7d39520e12e33e029f2b936fcdeb76e79f211be94076c687ea3dcd4a91790bd556d8159117de70ada5f96f54b4b133fad902aa136a8574584b9d6b62346018d85a460e6823850af809adf4a3aece520612c4cf0bff3666bb92aab50515b74e03ead83ea6e1733e5e51365346ca80295886a75bc921cbc901165a2b0bc8581cc02b1c12503d902a698fc37fe3542c6f5db9b052d79b5baaa9910bd0dd3b93045c0ee6634d041be23a2e4ba5e62aaceec833d3b0399afeda153c888ea2404fa1f9f5a08152c1582386b503d87c57560bc5929a424daefd06d3d51f984b9dbb8a3305ef50a890c582e6a013d91e171cf283f0cb7e3c3e4c95ca688a00ce755cb8e15a39a63f8518df1748cfb58329a74b48a9f813441517cddfdd8586113656c94363ae4474b9b36c5af7b77c00df0e1d9a8940df9aa007fa063af51d68a472afd31d6fb15d574fc675bdf2ad4cb34814bbf36ef99070369a8513a470cf507fa88d85c330740bf2868560439aabc8d8b13a4efcc9fd0e1a85e8a064c961c8cf1f5880c1c65fa581f14191d87dc43af7eaf79f3723e6030e6ac9af9b4be0881592c0692c3cb17cabf0eae3e2ad15bef69688f4c717be1d70602857c1639ed4740ac7cfb0febcf90b7989556e93e1778c82a0f189a92237d7f5bb00d7aa803339424740c619d185ba3d2d6cfe72d3fcdbb2473d3214dfc18a32f6237a6172a2ba329030a93e6338d8bcd949933f1ae8a81f340af9b06d5a193a8abd0e2d42d2fc1e12d39b7d4414aa90b6dc467c02835e0320eef37feb9ae39e53003c08445b2295742c64a924042a1ef1f326628e9bd6150b92e96997bfe356495f9931c72edd79df8abf8eb55e91e22862de1058541936a0ad4c4f3365fdae44a9b59ddd9e467ac0c3293858712fbb58013d129230234e1b226afdc3d176fd56039ec97ebbac14a44fae56c90dad8f93b1fe318c10e23f38c2d3dc2badd5e1d8c5be4ae6c3dbd6c3023c7559e4b61b58ea5241bfc96fd111d6ed237b8b4c82d4d662a25707f9bfa1b6050ada6d4f7de28ec53063c520072fb28615ac1d1abb600724213eb012e2a07805922ba6f49c6216b0d507ac230aeab3eea6fad66885edfc15f4ea4a67edd55d3923fcbbd4cb0ad8a3c661b5909d462edb7c827b3db005347987606f6edf86d1cd6f7a0657846cec2cad9ec923c920596fdacb9973909e75c9554084f1666b48f6c70a115a4d8ccf8b1079d51683c890510c349012f0cd04ef7ef3500987bc5d2ea1c23d7dfe6a7f9db770629550f5fc9089064c52cc72e70bbeeec9cda1428b4d5a7ee5afa2d8a28add8e2552269ddfc634ddb685363aaad163d669d69eb0f71c4861c435849c5c899d840c21e3369fba5dadfaf7688678f6c7145124290f436ec8977049213b5d46c7b7fe9b4de7565600b1ffa452b3c581d3f8965f52b6d7a51b39d30fa089ea8c1f442950cb50ded094d059451e21725d1c7a4bf37e5876360780b475768197f0226066ac608e60da49d3018e190d729b12069001bd5cc21b3780bf481bb6b4ab2dc3d461c996d02c942692d9b6dcc4bf707dc55c7967aee310a4248af4904b3922f9c72d6af2c070f2bbc304b81cea7ce26902905285e6b242b92cdae67b2a7de1e856d40363248abcd83f3401e713717c68a7cc59b1e18b6e4e87971b58096fccb2a0cf3be02225633f353f177e339595ac25913ccb8f4d36b0714ab4379273521d00079cdad895ebbc9028e5a0af09bf1270f0b107dc67033db1f383848679e7f909138bcd068dcca8ff1186939817a556144e85f6611325f17152f13ee1602bd530017523227ff21d8cdc1b22f561d79524b1683de58fe7995641b713369c98826fbcbb5dcf926b0ff514378f5bc910d5fe092c708b85813c5b0b580d7a494ab269f8550ed780fd1ff4e2b40051da6020906b1dca60c49aa6dc00584f7e38f600860856173e1e102f76a9dad8f9204bf318ecc8f73324a61864de13e16e1916c91240632fc941cf721bb06a74450f0399d82f036bd6c17a1b4d5b5551d0a306286ad6d08928b7e04d076ecf82bc946c7e4e68447f6d83380d11b1a70c7036e47992aef952411b9d918c46a8f6ea2baec4a7126ddbaede4daa5512fe28c945ff874f96e419dda5ff8cf9121f64034629012a17377f072bc8e6703b6ee4cf7839d77cff5cc1324ad1d51f907388d409d491c7c790874ece362c909cf5a09eb643b047a459bc523d03752edb2ee8b6afc64698e660d7f95d8b667c9e8e8ec90d456c6641eac26f4957fc6f4d08dd0a9f9dcfa25d205b1b62a308b682cfbbbaadc0616a63b380194db67221ffaf194da3d19094971a7d5f7512dfb99c3c169d728cc073f00a5548070f9607d4194c8e9c1e3faa87b710ca97c62906004e9fcf70b668d311d7076e312c89291e49f54320f5c855d6ff88ae78d3a6c3100031817236c3b8fa20fb96ae91bfaa96488e087bdda62b2cdadd4a805c41e77be0b0d0cf4545d0208ba1979f0e3570ccbd8562dcadebfd7848687115613b553a28652d85f5d58974d0d569bff5d3da4608107e15b344abcacfe9308149833a955f4e691fac9225e06271af96af3d0972514a0dc50b4d6ed3ecaf65e9556399b62ef29a3ec459ee686efc4d4ddf82abf38c481b4f40389206c0be26e56a0fb8e9607fa70c39f468919334c465a40af198d1921aff582c3e9066add5fd57f7966bc0ef934c310334589d5b5c0b6161684a21ed08408e80a363d614f89c3eda2dcb7ad95809ca0f3cb085eded98718da407797b9f8bd530f7d680639e1e7d7c8b20319fea5fba1707e3d9d52bff6795104343aceb442c7a3c449ec20127a8ba4ccc1847d36221683bbc5e3e2a5ba6d87c93b506c4f6bd87d048576ad89b1ea8b241f82387ee7bd612f970acc85a1e9e309288c223580306aaf8a886095cf5b014b4bb833ac896acfb55f5962f378786cd2f878f86a1aa761f4e18dce6d7b08d2436107a6228b2d899156669f8526afbb4424275e33dc0e5ab79945cc1ac63595185e6ce0f213a42877d21e77430cc600b99fef2ae1af29ede59350104ca85049763698f9d2caadc5c2d29bc9b4a60ba7455238c1915c89d99b73a7c5514a3b2401d4aa426b603abfc2003db129fb15a7e422f436d16e3698e8b934ff45cff62b38f8244395765811144b9ee45eb878b1d92fa3a3de4249b022bac18bda8e1beca7a35fff2b8ca18985446b70c72784a822b2a28c4446921f259b4b77286419066c01f3c1fc5a820c059c1911855c5188f8610268b644e0e23c508545ccc3f0ec027221d2d157f21109280ebe52fa04f8fb7bd0515cccb03331cbd530f4fe1ab46d4db8be9bff99959b806841e6cce217d3abc6dc509685a025e6596a89a68e61910609120bbb94401f82223ebf72de42dc8264d09f793e7e4a564ea7da27091a83126811195b7991da117ff524e46abbf33811be055af00cc1cc873df9ba7c57a818304c5d624b67fc15d788f26049de2a010084d62a9b1e45b09bf3468c558c74181a55919139b33c73a26d073ec37be0d7893da7285a174340d5188167d5d3ea02d0f86f19664cf4e9f6fdb9acb79672605e597e8bf485d1b8a4bcb1a4012ace813133a4cb8a79f73055e36e623aee1050638489ae582268bddbdb1d09d692fc03c80ba4ebe1d7bbf43a1645708723f875d236833b2bb0091e9ce19c3f5c1ddc284699937a8fc52246081cd3280271796d7b8131b8f22b45e03cb059b26b65ad861ffd5b0e8dd73429edd04a3d7cf900471e44bafe85752717900e6fb21e2aa409d215d0cb9e601f429480708783d08e682d8d6a4472ec9e22eddc55321845c79e5f85b182ac869905ae3612032485c5207222bc410a937e831b9d139b128020ca00ef10dbfaa188fb9b2ba4ca4d29a344cf7f501b8766e0ffd9ea9608faa2014d50b3f90f2679d322d28e4dae827c9038d593a6fb8fdbdadff89625f9b08e6dd83b77e50619255ca22892ee13b30fa452dc36703c0672c0f03b42554a3a4b24cb693872c2b3a191c64eb802c270f39a24e0cbbb52760c34c5f760a25ada119485d05e0143025dbf6ae72cda802d6586965fa14811b1ff9dfe7aa6099dbed3d52e30b4d0a45f89cc85e37e14b29a3451b0d322a255f3ee42e8ab42ae1f0f7e4c4b75ec38073e7e9f40fb45b100e7ec1344c52f4094fd58b934764e7184fd6454d2cf11d2cb427c3097726a9b8ff1534ca5b864e0f1094b9fe3a5a4d474a197807c828571b7efdb2471351b52464828c81259e6441cfe0081868fbd2be03a5b68ee970e0d04c3c066660997cb3dbc5f4d9df1bf9d8f92267c05fbe77e428cb21fd4a496a16f5db1dfd4419f27b16768c5ace075bb1b1ccd0ef3129def9413308a47bffcb9e803a06095f3ec1e8180f3a2205f70633501295ae5edb84835f637ed5e27fb1a409fae135ecf230855e9ebd44d41b2dd1c7d9dcca4041a8ab1debfa670389a68f12042e7bd24b2c987ee51f6542bdc2503865e7862c48520d8422f24790e57432b27a48e801d41c63769967141a164b0f2e14ba6b185f0584a9e9bc35c289443a0019d4a20e543211699cba0809bb2e121d83efad3c75cdc6466f6d7d7df8b58d0e400fb392712cdff2f2345683ab8a196f6ec3c6268c954767857c30a5a022a4add22a3e86deae3a3334b4cfed0203362c16112f26532e656b64a06a054ab5f66ad95291dd992146d2ad17a4d54bd2e7911de2d9d5872c2e1ce51e2d27bd5efbbda96a1f35a06c98d4572ef7e0ee2148ec5d34e9fd30cecbefd8bae04feb20759e8b371b997184d705d16b021a837fef13f886446a77500f43d30499040271006facf55a69807fbcf42f5db934aa8c5cda5e3d9f54e4ba1934f014fdc7b97639f39e69dbaf5eded8c9707755492dad4c7e4fb093d9276bc60d448ae4b496d5ca1fbaecfd9b34d5487400fb19a943653be394d9863a99bd0624938490331cdeedc69d02422f50b78775b12812cfd1e5b0190ce0b05489aa5ed55a24238d5fc195b8ab69988b7665b0561e9ee1e221a428c13e41ae9bd2a2a816b3c48f92f54bce8a696ef0c614d635720e2b04f6e194dc304587d3924de5257b248b276fdc75c94f65fb6cde572537c4cc6ae22dc0935699981c82c0313c9f9b38f7fa1d06aeaca90a35c16501313940b0ec26b086ae78ceaa622da0bbcf2acd53bc47742eec94c127181f7d7c2525681f6003bd17e3d94282a48b03631784cf5e286b46a04d5ddf98b771a36311a809f8e61c634932f543ba94c13351b4c255e31ded150fec8570c03c387fce3aa88af3c6d1614205babfcb3e202d24e7bab24b1c61c142245bd291b3cb91fb265c8db76b02e72410e9918d9552252ae44c1325cfd75af25516d1451a7979a0107877be6d86a4c0cbb477570b385f26a11ad30c0ec25d593075229f71c01eb6b1fb05a9d9fa95abf55bc201050f21505d3373c092c856182b3b2683859637edc2a37612d6802b1dbdbe954a9867f1f7ca853f224ec5271af32641641804879f12969b47ca5018314bacbe5c7c766012d6b381267f8a99e540e1dfae35859b2f929bb57fae2a0b33c8fe559a801bce717163979e6893e119c595b393d9a7af9912c7344c16578013e4153757cc5bd7961ae97c393ed461b87a8df6529624dfa178424341baad881cf3a538c359e092bc3238cf1c09aa1e6b2618b49fe188e45bccad7904d6ac71fcbedbb7b5e30a2831fffe5486a51b14bf234af6853e6fb7676fe28410308687dfd688567b31e8ebaf058b41eb50bbb41ade014336179446b4a64c825e092be164c64bb83192286a0154d7be8b031a994db818a4a2289930a47fc138e603f5c1c3d6ccbaf45a50c67a8927466e12ac9db5aa9070a87bb64764c5da533d44b0485a14a7fb34ada2929ae8b248ab5ca8b3b5f4eabac061b825506375619965a0c6649e5658cc5194101e65cc73a303919f7dc8952ba717479310c2b0223ef2d1ac5b904d81505a85bc43849b0b2749882cf99f1f35472dec36902ce2720d74b1496907486e85c399908b70a1ee2063eeea2efab3cc25033e3c602104b20905af43321e2ad6e0f3988728d1021cee45985da080daf4685280eb64f01938209ba9b0ce41fedb06cc7c38afc1f678b18ab03b40fb1e3f6a0bcc6e9aec80857b9ccb7a0e44cc2eed5687304c9f6701f17690e6799fd3e24ede9368427b35673a4e4f2af439eba8efb17347c7b8890ba80ac1c1f0e75ee6217565490512ecdb46b495168c06a375f53a1c19c3f06969e20abb1d0dd1cb05b2b8cf582b064c779630e7ce86a761d0bd8c5581dc646b3161f3a67ad22134ed3f28a8352a58c1499d58661ae6e437c1db441ee6f2fb47fd1ceb92294ec198dc9cbf1dc39cf27faca9ff02596b610069dd2548d7b5ea26a49c8f06e161c02100cf9771d24aa5c2b9678ca16d93ae9d4b1991ad3b7e51d47c5a6204f7f4ec0f82d1631d770f1fc8eeae7875ffb725fbac188d2594ab98c2e07830d01131d9c30f64de216507cd1c7e9391a9bf05b059728d181cbc081363a573ae9cc039ec3200cf49f42ea739d4138bcba7359f85f234690e2882addcb5f17f0c4c9af923ee792a3e1a6f8b9d63fdf93304664f8de0a8511264590ebe0d6002f21567f9702190195e0b89e5b305d3493e5197223fc008e2bb7e77f1a012b8250e042ce8d6bc84fe12cb8bafdc93ddd11a6287a914a3e0a750cf980c3f2951c7ae9061b0c0ba4704f708938b4aca37591fd67113356e817e5fb01f01cdc7d7994dea21f4dafe834e78d63dc4de1adf234fd89cee5d5d051cd0462361408e3b72b281bdf5be084898b62a6267226fdca86ac44800a48bcef7743b327c06a8e089e644bfca0fb44a3c8c01c033201391a6f10f037885d38aa102e2e5ce86368e3c4620888e9690017fc31de6db63af1ad7f987aa3703ee240ba57fa54ab3cd014c3301b357d8f2f502e87234d7b0e0424b4cbafd5bce856d41ed1b654b115916d826f2f337596d5afd2ac59fe1e1fa2217eaad65e181c3ade97cd99799612dcee7d8406e97f505d7861c468075d4c40ba8cae028a5c80f50fa722e586bfcc7fc369c735a7d128041ef69adf3410c075342848f09a8193176330cf79d0aee0c7f8e82653ee31a7fe159fd566cfd4c31f74c60308b16c378e2877720d8702802dc651a1869f48bafa41f4f00377d91fff74b8be07403b73cda08f788f7579feb2c2b7115a7597853ab2ab6adeb3cea58adea3affbf58619ca8b782411d5d3ea6594bd6a2f027b438d951b69c1609540effc53544f9d0c066f3805ec2b7647f13cd8aa87814b94a7b8de0081aa860c342a547a1c9a1bd3ce29af8fe3ee2303b33477261eb19c7c691f4e875a0b177c4d08992d86762dfcbd007766e970d329c1f7a64033ec6b9b5b9d6bd7add45972fe72e438a5dc391c0d9e9ee1c11c7761214a5e09b6f7232ff80996850655dd2a522c75f9c992138183c84394d15da0dc1c997d2dd3712c716ad9932a6e4c43740a62c152f77ba28e3bd3189d8e58bb54a7263ddb81c44ba6921811384d1404afac4e8b82a986bb8a35c9c0980cfaf6629be05354c3049632240c98a4dea67e6da2ed6d3a3cec35f3e13c2866c429c3438b22e26743019e41c3f9e2bf018c5f657774a38b7e10ad415c71c6b68b00b015dbc23e9079fc396b93363df87f1f21255c518f2de74e46a6cbe506edff1ea4e9bf83adf86ea5f81cd926af73dfefdf926c4b1f4fe93d2e2bdc81840fb4753ceeb2c825da988b208524e805632a4ae09eb91867496a7910a4fc0f3e5ab0a807d137a07d518744d59bd08f9c64e941a8d2741a6b801017c5bf9508aeed2e7f7e74712773c192e71759a5058daf0a20e0f4d5105c615d9345f721fc371885e710fff258859bf3c46e103f0c8a2e9a8ca6c83020747985200b1ce1c9ca9822a18b4122a5d49d1005b4bd9111b66e5231ffe8c055b0d8aeae083d5437d00fe4b6d24d656042d86afb8a29b709a9c39236c532237731ab5b7c6b33f0092c6116d262cfadde1d592ef684527efa3d3c9660559c56f1b08975d9b6ccb3686370d3901b357b9ed50b3fa562602a6415ed91b61c1757b677be2c7ec40c36513218879d100a979be29a535883e93bdfb358f6afe3cd3fa6595afb8b8e865f58028e4cf7761ad289d6a96974e0461099c5265ad8b38cf866068459a9d856b3bdae102a3d200e35e50d09c64a000bf55e39e0d3d873549fd75166fe6d278494bf19070dbc26ce7d04ffc1719a3f000a14a732c33ad5fdb74748bb183b15f43f9b562996eaec0dbda70facef0fe0676274ec9121d913742d47807838bbcafdc981602b7c858970e454fefd33e3f889058a36cf6cd9ac60e91adfdd731e8dec1d1642c49ea28c682ee7b6c5dc26f7bfbce3e53f6d9ef185f97de64ee004c4546140f3955a6710f9dfb2324c09eadae806da625dd3e077e8061bbf1852e434527ecf84d9ed6a91200ed468265448cba43776e39ce05b144bfc8b9aafabaa650157c26b00a8bc52add26e360618072a6ea8d70d4c9a42403b84f4d9c02b48e4d4d75e44f76fb4572b5a8924fcae9e449311c16238133925eb1dc3484057209a606753f5ad0909f963d36712f19b4c2ff2ca74ab425dca4149fee51d52638bd179d594690bec195d248df118bd0e5722808af1eaa82b1eb7dcad864c3affb88d82b876438450286ffc60dae416e1530d4c66755e205cb8018acd40b98d03c28130c904fa7c064585b640133c85d812a185336ad03365aff4dc51d04bca15ff7e5ec6f1e7a3a09e9587bd32da6db5aecfa58c4867f12b679a68c3ee9463a596a2c1a26d00b7d3d42123135389c834fc397748e22eb1cae4d4b967d086a1370121afd121c11947bfd73557a31d9d0b0665be04562b1baff7d84cec6ebc38662915d88a446c8481c5ed6161645977d741dbe6ba2ff5d731b2226e6216ac956e18d8abde4285e35744d3179458a021b9e5d63e3aef0f699fd900034869f83b8f2043e89481dcbf6a06c0363525700494a5ecef1d13103b58401a8c151ede63cf5cba4b1d12a394e1e5eea6cc8570d58ec34ce52aae51406957dcc3442d1e848ed3b4623277569a4a3c425b0c3dacd3c2eacb1b71ea01657c965295ed274d247100a7cef25acf460e35e98074190fad49eda7fd0a66008bb09debf6588f6ce330cff38d6b188087c2bd2021588838cec44756699cc45bbaaf49daf36e0a6144b5e46b75a1e77b4a9fb2afa55b9ef2544c485500b6487b927681f4ab81fb79bd1eaacfee7b017ddc9d8449fe2c4df4e0d6fd74b8253ac216c7d5c98848ad4c6da53b8c1d4914d2a6d287c6b7aaa37871701d592be3ef88a45578f4fa87009054337a5f7aba69a9add5cbd0ca9ebfa9bfd0e54dc199354cd591d3c6cd7528882fa9696ff20cc63f26f13fc3b197f0e7aeea78b64885272f1b402beed550e800418294f71b4779bf5554c874eddc5b86c25f20bd163b97bd983bd7c0fa788b3dfddd02fb60715d1b98d67c46599a934bfbb05482ea93bd31f69fc3884260bd35e89c750f59314ffd687015bba4c8f9be740e0bcbdff595e6d39a088dcb483c7132e3b3a2c41b1060889686afb58174cd00dab557508fbba2fd7326e75b3d7ebf055e56833970fe303988f099508efc28302842a13e052101e0b80a00435f392a7101cc280638029dd0d1111a3e9233041813608942b20b09e3784ff4c0cf087b15abc0e2fbf050b8e141d3664b6aaa975e0ec6616f065a47901684d3cc2163507a7031762ba3eda4e5bb2f911c93102b231981df4f20960e752ea1bb42ca18e5a32950d5d3ac0694b2486b0042aae2a4ea4625d6268ec5e5ebea5da4c0114b59ad46a11e69eda202b1468de880c0339ab0e8ed73148bd3cfc24f01bd09980972fd1780ac86b215d1bf7e139304cd827a9241b2ce9831ba6b8ce730c7d8c6dcc49071e3becfa9767c8e678d410b9af97355c4fcd8f27a5a640318d504f8f85cac08e70ec0d0e19b14341f0642268d0c5dde98541847cec8be859ee8de34ee3959c7f8ff66965d5a045f60303264b86d391d6825d608dee0001bf8c987949876a5cdea68cdfa0948bdb027056bdb54738ac457e68ae9e12d00ae15659a9c5dc3055afebccf6f2042255627583237ce64ae15bb87967a310797a8bd1d8b0ea2af40fe129f3c013c1d031e9045480e3540b0a6d0013c0c3c0c3c0c3c0c5c7536dffa5afbf85afb32c94d060328570e91524a29a5943c5dcfffef2bac5922fdb89d60df01b8d70e220e120eaa7dfa5e075b2efb2063077a400408652df9c3437ba61326ae821e3ffe0565f418418e1c39729061461921bf28a91d599ed6e194b43b437c51ec13df84ff7079a344ef4541c6dfcf744d6249b2f4e351f023080accf8471020c88bc2dff6781c212263a48ce7c1e6a347a216460a38701fb28b92fef6091e5ddb3d85548c105d144b26699b774509a2a71f8f7ef4b80b84e4a29c4cc99f43eb68dc871917650b9927b7c43a25590695f19981905b1447f9a888f53be2b6289f52627a1cf1e4c1c2329ec7c8a906426a51b4fdec31f5d42a95fd303a125a14e77478f5d14107ed263ad8d67e0401328bd266350d6f9fb36a92e8e011203bce5c168531912509c26c7d67d4c1a88c27e375f8303fc6503be39058144f0c5fd3237b93a9820081454147f6dc3cbcfa8a8230c1eac3678792724b57943fb47d8ea7f4181dc4561464d8cff41373e97dfb9415e5ce3fefbe1172a49a405651f2f6befe7c2f41358223236398711eeda9a2a07a714a5232a6830d191f98232415e5249ffb8bf87ac90d1e2aca299ae2b5aa1b3beb3ad8808cf44069fa2308103c4541ac44c6262d1de3634c5152f3eb9d3edfb9c51e528a629dacf0cfee9b2d7421a4286c12cd4fb9ae8c1a8ea25ca7848d90a5cf84d1340819094551da1cfa32b4da63cdfa31c623e3e3ecc7070962c8f8d16303de21a1f864588d887bd867668c042123f50642409129993bcc2cccef1dc935232de4139527fbf168824c075b88278ab3a159372819d484589d28c9e8239424c937e531a4834d5160d641c8484881104e1493e416faf24267f670246d13a54c1bbac9947479d2e9c89420470e203f7e8c104d143eec37779c641966a065a2f499c6946a5cd97e8c1963fcc080eb085e30d282104c9c5fda29337facd2d120e412e524c9a8485d0d27bb4d20c4120671dbf9d6677e1e414825ca194f3b76d0d4655b8e0069a34479cb939275e44994be63fd68d4bc31ffa6834d21102289b27ab869f54e4522512332960d89529eeca4fdf45eed731f64ecc0904714b3e9bebdfcdb112541aa8e96eb2487995448238adea722931c93e825cbc98e324c0972e4e891cad83112c288d29796937e639af025c9224a9fc39d86a83a791f3a78544439dec4cd5d33c4c62582188424a22c4289a33b98b618f172e4e0c1e39311bc60c405218828f5b8565acb9c9cafe732309023c71965989043943ea8d53521aef1b91d3f72a00c0831445648214a56aa9320e5cf444fa703e4811f2184c04b63d6c636d4adeacae498d94e4a9fdaf977f8f81d3e7a241b384118f623880f31840ca2f0aba97dfb3e89568d04420451f03539b67f90a3f2203bd2488f20231e080944395a674e3b52c3067d1eb380104094444d62706dddd3b1d23f943cd7b86e585ee6fc506cb913ccf47dd0a793fa50a93ce93bfa766d0721d4c34d10c2873c3b45d326c1e4a01e7b40f95b491f7ed53e08f5d0c335fab47a34eb4e10928782ea38aa041d7d90b16304fd0fa3034873081efe127feaec4fb44a772908b943c174897651c2e73023cd410f1e3c8c0e206c1b6207e6c4b05755b6996e0f327afcf0618782903a1446632cef9c33c99d355621742896e7581946891e7df23818e911046d0e25cf7e9a27747808598f243b82982040ce2c440e85d71393febdaf83ad3300e4839c7174042f18b99038b49539b9f989591bd7c1962347081cd8d6b54c9d7b2f07216f38811b4ed0860a61c30e1f18b09035b0400d277040481a121082869104849ca1472ac3033c78f410438c078498a101216518d9e10303090821c32765f4286364870f0c7c52468f03848c010121620072c6db40012161d8e103033fde063f7ab080040a0801c3c89bf16698a08c1e3bd08f318649c10342be00c40b0908e9420142b8306280902d848468c106490f1e3742b22012828500845ca14688154676f8c080f96106066e8454a160ff3934489bf524b33ad87a943172e7215428a8bfff2033f6ee29ad0e2ef311bc60240221532846b7fb12fcdd7c452152287f89d29d674fde54734814ca25c9aeee5df7ffa5040ac564428fc649f3d965f384c2e6b251ab394e288870f3b10dcae3c5d88462ad8c8fb9ca8472978f88273f3107cf9650cc647667adbf0e1ef911c447f5f8b1214ae0a412f49d1a5faf2c0c31c2383463032708e3f0109284c2c6a4c2834c9adb84db4b084142b9d49ea9d2a349a89584902394d4a6ca5232fe7d5ec8084513e799d9731b5284f248bb93e4d493f3ae2342c96a9318d38cb4d7d72e6408e570b28cc79c124e65fca2102284e2b907f5eb99369a3b288404a1b0664aaa0cb109014239e5a5de096fda2d55441abf28ea8f3049aa9a81f0a0e18b92506277b2eaa917e5984faa8c3a5a2d76bd3bd0e04561b3c77df17eed40631745318f1557a5a7dd73ba28967abafccad1bff97a1a68e4a21c231aea63f43393a33470512e133e64dea8656738d20884c62d0a52739bcef15593c9a911207e4174502c880e7e0488d9a2f4354a9fb2d1754a5f8b72ba170df7cff1b9a145f1e48534bd1326a6a75994459ae99fd3d8eb709245318b66508d2757dde76351cc66235fe53decc48745c1e784d9bed20df9a15794bb7f477d6c13579494fc9fd8a9ac3d666f4549f2f38b4d67b3a298e55d4eab7e8ad9781505dd3b193d72d3ed5d55143ef73f5e73fc9837a9287aa5989cc9dab9754445b104fb34266c788a72589aace979c2b97ea628beea499fc4fa33d973a3518a729e3a41c896983c428806290a3a8490494ebda97a0d8d519474d04992a284f909cd588086284aa579e4899fd7953385a22449d273ab869fce290245713c773825d3bac712fd4449129f3c9d09f1b77ba2a0434dc9661ed74f4350d0e844f947abe95327d6bf361d6c3b6870a2984dc9d5249320e222db44f1d53c77d6a07a9d952a6868a224ea097b1fda34058d4c94b4fb79d0d4d472f3395ea581896290a3aa63a8d635d5250aa3fde336ea8312ef6149d0b04425cad7aa495c9fd2a995fd4801236850a26025893249e718861861fc6fa0470a120e34265116fd246e08a1497a3691444166936f3f3d8d3e31fb3064208d48946a738ee341d490286e9e5ece8ce611a5b036396d7a53b2d9ec88921276d6c24abcd0db1a519a3bdbdd64a145c830a260ba43986cf7ffa44c8bc853c9922335bfc9194514e7e3fa6adba6e69c24a29c314d6b493f393e5f4454e268c9703a8ceab90ef1e892fa3fe97adc1f0d51eada20afe5468b30994294248f25e4974c72de3809515211e557e2e98f3af9411493cc993ff66a2a258782e8a4118892786ab6cf7793ff0b8882f85ccd74d61f8c9b9478dac3d74b26f143fa33b7c91334bd8c923e6c82109eb4492735a4880ff99a6ef8de18d53de41d547dd4207fd703324ff6f02c4f1ecec3a984f3132c9326133c54727286fa77d82ded644e5ae2d88cec7075f579272ba5c23a1c575a6ed69a63b3478792f6cfd983e59c92433a87c7e4a0be04d34caf961c52925a569b85b5e75c1c92e4bee764577127dd703079c9fae1bdf469d3bfc19149892f7292ce70a51bca6ea63a32747c028d361475e3f7743e17b91d67366cf206cf915ab206affd8365c6d5500e6f93ae269f864cbd9594af36254e101a8aa272f4276d910eb63ae34110861861fcb0f661c8403d434989571d773766889598a16c93b379b669cf67cb50d0e973bd234c12255528a04186720abd6d629f5607aba00c129c21193bbc0634c6503ad14eaad03822f23a0ad0104331c8ddf598af3386ea0a136884a19c4f895d52cc35ed361d3cda020d3014ec2441c67fd198748849e30b05d3b9af33951423dde485c2270df723af6e626acbb0a3d18584dd6899f111b53dd21fd0e042a9e4a04f6cfadb123637d20399a5e0d0d842d974af75de2eb19a4b8c2fd0d04279354c909a6fb7dadd2c6832886ff64a071b1b0bc2484108c240dc010d2c9447bdbbaface84f2756051a5728f58ce9d64d9d95020d2b946468ff8df953b3499f2a147feea3c6e6e4a184860a2531a5e47b7e279d4a3685626fb0d3257c091a64ea051a5228ff28d750d1dd156844a19c35c99fa36cccb9dda20185f2dec9f29b5f76477c46683c01bbd2d8ce8c99f3b0de99c49ee7ce55d17042d935cf84f97c55ddd1193f82f80c6834a124eeb6fed4989e0906349850d2e92b367fc814ab5b1829e08006dc0c349650de9ca1f3263d269c749786122ae962ef36d826061a4928a767d2f8ab3dc9f33c62677da0818492d0ec229b4b64b24f9d25681ca11844f796101d0e842146181b08430c0d88d1041a46286afb7712eff7cabb9350a05184c28b0e9df33cd98ecf3ffe0cc3c36910a124e9e997ac26dc7e85348650d03bed31b27f6ed38910caa9fc3f9996ab6c111f176804a12073f0123e8f9538a6a6018462583b39ece90bf3c7f330c374e00d60fca29cfdd2539f6de94f932f4ac2bb4ce79cab4e8d75b0a5200c318e191d684080d18b72525a54c9871b13d3880960f0a220838f9293593bbcd43ad83a0818bb28af96ced334d1a4d2c9d34541a9ca49933ccd9acc80918b52069904f5a03d682a1d1e407e60e02c29e30c2029013070514cca4d5d346eb078138c5b3818b638306a513cd9d489f7142aee01e95182325ad82c0aba57832675a19545316d89acd2eefeeea95814949fbe10ea049d1f755894ac4b694cb9b19bca1cb90318af28e7572bdd6d25d33cab030c571443d34b79cc79a21db7a254828b792ce1d921305851dc68eb1adb2a3c3d6715a53e49f7efe44927ea070c55946284d23741f5a928493a0751ab38796ca42360a0a29459e4cec987093da55394529334355a3be76d638af2e5a893bd93982f6f2b45f184e6b8499c4f2ea35e1bc0204541cc56bb283d3289761a45b9dadaee9360cad333828c9cf123c89a000c512c4aa3499ab1444351ec93e7c49a0f3f9a732000031465f7caae8c615927e7e800c6270a27a63aef7cf67f4aec89b29d0e2274909b533ed589f22849989bc991effb79303851cabcda326b93c963b4897297ec9b2e596487de780cc0d044b15a3608f3f0373a9899287fe60db2b3c7ed9c8e063030517e13e68395ec5ea2583d2e1a931271994b33806189827c9f11677a9d94772a515aadb52e71d5372ad7c1c61d008312e5ed93b4fd6c5a0d623289e2be8d36934f575989e960d40018922869ca8bd36aa34894ac3b577c29d122e5a3830d12a51026b98d90a9a233bf07301e511c351142737c3ea78707301c51f2dfdc18ce7b3580d1886296fca074775f3d857ab829c0604469acda44bbcd227b4d74b0f507ba9ccb67adab5d77d0c618caf2fa2786ccb93bdc440ca5396df2e77d71fd20b51186d229d98498cf26c55564030c655fffae38a165fa5a1b5f28962969eafe3a86d7a00d2f144f676c4631a99d7b75a1eaf6ea5a3bd3d777f36c3519a427cdbd1a1b5c2896b4cd541d5457e36d630be56b5bf5d9eb7427c936b450923cfd8e1e1d93b0496c64a15c57922821e63a84d06d60a1d42708bddefc31a7aaae5034d5abf137a73655cd3052c001337c94e18122d8b04229c694da69f3fcd3b58d2adcb97a57e9dd5a726f993d87930d2af069eeb1f76e9e3b1ab69d8d2914ec6c839254e6932429fac086140afe717233224dd235f7c046140a9e84926b44941ceb046d40a118546bfcdd68eaf3af53b0f18462f013cf3ba6be1d061b4e28092dd2aab38d8c60a309c5cf9c93248e14a13bfe4db0c184d2273313757479106ab3847266f393e35ac8041b4a28a589f641693bb143466d24a118ad3549a735886803092559b2e9ce66e308c5adcea2f44b6484526d5475df9c63a308c50fa7466af97c8dfa2c608308e59e133ee893261a4a6d6308e593523ef58369923f2b84622731998950796b82ca4610f8ced6f39ccfd6add7b0d4517b5f61bab5b70184a2e99bf693f1464cfe77357e512a69841ef3bdd0bb9f20403e8809410d5f143d89ba116969f1e1ce408d5e14d4c92a6d552ee273c90bde72ed3bc6526b57d53c73f896899fa7214fbb28993e49899327ba286719ef20ecae5c145f6d838d4cea2f931617a65d59acdabdd6ff7f0e4b137b84b8b728c99c34a9f7d059735f58a8618b92f8566fe71ca73afe558b725a4ddd7a52498b7267979d24e3cae745b328e7b0784d82f664510eb552923a194394d8c4a264e23cef53932c9f5a58f0a1966e7a3a73258ddc479b5f517ef3bf8daf9de4f48f183c0c116ab8a21893ce9e744b3f58a7ad2846bb784d9e54cd9a9415a5cd51337afed64966b20abcd5533cdc524dd47d8fabfa66d9aa28be271bcf9c4cd852515453a22b4d7083500315c5921337c9dcb6b1733db2c38719791f23232378c1488e1aa72898acbc933d49acd2243c927ea086290a23f33b425c4fbc453ad8c6e8c1033b50a31465cd8e254d3c792ae63052c08130c6e811025270e762b6a66de59ae26dfde9e4add2129b34c6183d42e0a3c70872e418a3070ffc11c4478d519476d3e8f7b9e98ba8841aa2289776cf41e7dc77259f80181d25c8918347ec8c1aa1289d55674fb939a5f230830ce461860872e4d01164c70f9323478e1c3f6a80a29c4ace41b7484f4ddaeb60db1a9f285b9ee0267912ae1a4b9e286f14552354f6e3675ea313c5134a0e9d4f9e70a2984bc97662f2cad31ab38982c9f93953be9588ff3551d0399f204fc59ca4eba4a5502313853b414f5be68eac7c5a0313e5986433e1e33a895fe21a9728a60dafef195ff5edd4e167895267e7c692e3677b95b85e332f6f533ce698667abda9e490b183478e1c35285192c3e836e9f762afd21a932827496e27a983be8ff149a2a4c43331e8e4d176bd8f44594698d6300fb2447f1aa80189e2c6d028eabf47947396fdb928fd95dd1c5154fbdd5a3bd1333c6c444179384f4ad4a4bba3c508e5e53d6bce3af34b4c74eacd9e1c4335165152615d2b1af4d566aaab504311854f5b6de7f107627888e156a8918892789327ef7d7ebb3f39c39420478e26d44044593d86aa3d0fe27d926a1c8213d9acd5135bd37dcdac33393658be27916b18a23c622ce3b7c504c80e32b210651531a1a3efb1f24e6e508310a54ddf1bdc3db4566310e53969fd41c482484b12c46f499e06a2246892348f58b1104dd5004439e99b4e72d021c4270935fe5052d95c62b0d9d4af6e0d3f947489a6f7e54cbe51a73e94d4c9b0cf1c7352bb960f25b3da3c4ad548371dda43b97dcc2ead753d949350b5a99468cc1a637928099ff583a9342d4a8cf050d87e3ba533d5eb6f77872e3b6e67eef42cab4b9f888f27c345678792c8f1b0dfafa635b735ea507011715ad776db734c87d27b7e4a3bc9f7eb338782edbefba5a818519a1c4ae9eab13f68a546ab8a50230ee59834cb427bb693dffe8f123ca1061c4af2ee7af814ed7d9c918228d47843e19458769bba947423fb3823056704393794f33b08fd0aef31afdb505a1b69926f920e430d3614641833759ad3668d0ffcd1a30442a8b186626b07bd1a3da9114295b602316aa8a19c395b54fed788c8a9461a8a71cb24e16e234e526eb2a1061aca4947467591ee19ab8a7186921cd38b6caad2709023471a0e30cd508cf3ebac79728e49496b94a1243d7a124b289dd7f417d72043d14e95e7969d98535e8d31944f507be7e124d94eb4108fdfb1811c3980ec19414e0c35c450da2fbbf494e272529d23478e1c67043923c899a146180a329759a7114a867e150c652b0bf9ec536b7ca1a05378bcff36d5f042a636470fd1cad4e842e1654b0921636f871a5c28072da332aea9eef8921c6a6ca170f399e4244c1c93458c871a5a2849b132134266dae7910f35b2508c322fa784d2e7c14e5828fa8693ab1bd1536258e30ac52023b654c9e24918d90d35ac50def0d4a132a8f6b5be46154af96579a1f1438572ea2c1ae4dc48fd0f03a9318562101bab394bd0ca0daa2185929fa7075d4d1285b257c921f4492d75e2040a25258b87be9dd3573d3fa12c9feda4d3ac3aa1a446e7f42841fcafef4d28f6be08f73cd9cdf56742e1f96215eef55d192a5b25bb79f3a4359650d27a57ef5c2efb5f76a186124aeab6a66f99fb246552861a49289d896b7afaca78e23e861a48287fc9b9eafc3b4c3afd166a1ca1a4faf2cf32a9129ea6166a18a17499b3b64975ea72826a14a124cba9c91b4463c5794428e58c1425f3c86a0ca11cb4c9204bd23d6a6d53430825b1171b9d63be8d3d0a42d9d3a62769aeac9390d70042d93edd4ab7067f51cc9ef2a21e76733fe68b5b4fc4e3eccb73357436bbc4124f92ede3ec45c13a3e7abfd7c9f8c88600031920410838b02b10e145f1459e072dd9a533b722bb286f8a358d266af64516d145c9bb4bdce041915c9454643a41346a27a51a115c143b28712f9a31b710b1454988ca3ef7d3afaab1482d0a278618d5e826c8911f115a94d744d3ffa0bcd6244f641605df1c6fef9a41dcc322b22849e599a4cde56910b6482c4a92b0994c899b4404169beca7aed8655896b0179bebb49a38b1c82b4a3a8a6e3465a2f8cfc90722ae487baebc1c3946ac1322ad288956680751e21a1aff6158041156943a06b5394e9f876d9019e931460b4164158517fdd22ee6e1212023237eaa289edcb79d5aa743241525c965cd74fe112a0a42959df4a6e323a8ee14652be13597f86eea93ea603345a9d466379363b092252e4579e36374cf27b36f57f923880f142145399ef2f313fd348a527ebd27934c1a0d22248a92c996d93e4567b68642518ec1f7b37dfe8f513fa028bc0927e8e85ca638cd278ab29a7da45ba9c7917ba2941a6c94951ee5bde14e14f64f7edb0a9313a55e5355f725353dba9b28868e874d5a35dcc3d5443928a536eaf5a69b8966a298eddc94f43998288586be26396c68e67989a27ea6bb93632c511c1de232b331bc6b5889d2cb69dafd690e271f258a9d04313ea7425f956c1225eddc57c2e5e9204e24514e92541e4d9f3ea9eb4814362693d4d656b9a74a0412e5de70f2ee8312b46d26f28892fc983bed696f8f1e114794d7e74e2651cdb74623d28892709b84df4e4222106144d1d4f8bfae2bb288c2ef69acf44f4af073e408f263e4c89123c7f216441451d2f5f50ea594c7946222ca9efac4854e7244105112e466adf36822872887ba073b9d476f3b6c228628659f3a49eebdd8cc26852875fa7832932094ca0d3110440851f0cf582aff64450651f4b7ccfb6492cce132558808a2f0f72a4ae8f196d1ad4820fc90165af3af49f9990820942d7d775517b17dbfd7249edd5d913f94ac9369294964123ec9e620e287c268f850a2271d7742d68754c738dfec2912e143b9d5c74caa07757a9f1144f6503ef9564ae37c7ecaa88772d8d2f8493e8d7703913c9464bf07d3fbe99e8411f640040fc5509f565976927bb57728c5ef95564f236f366e87c2e84d63fb5937a9491d4a4ac9b3a38489ce76ba0e361e3c76d8c03108227428069325f36492bd4de7db81c81c4a726cd11bc79368750910391493b0d97c4e9949f6771c8a9e641a319f4c506d62702857cfacb69c896d7dec0c913794547886ccaf1b7920e28692186972095be9e7412ed481481b4adaf309f7d023eab5eb21c286a2e8f4aee29e25b7d91acaa794b89576fcef4df58088a8a1f41fffd48c06d350d09a3127559f2756d63ad87e98e791341a0adb419618c694d2a7752743e40cc5cc1a4e89d87fc9138f6186f28a6dbdee5599d4b9ad814819ca799e756172d08f11203d74b0a5a5d940840c25dd21c2323c243286828bfda6f8e630cf256228c63a31a677d4ce1e5f2fa38048184ada2553dca4d1cc260806ec562be5cc62b5432cb62cf4846cfb75b00d41e40b85ab6f0fe349690d9317f1424969dfa0f4d68348178a7a92984f3e4f5207112e14c427a5acf6ba34a46b86c8160a32cd97eeec1d996346440bc52d3169d45d08a5633e0bc593d74ca82d9d3dc9712c9464aa321d6ed36ec47d85629049a9de2ae13a976b8552c8776a129d44e89645aa50f8fef64dc2c7dbb050840aca95ebab756e8cd68f9fd3438395660a65cfea7af71ecf4c9459109142699418338dbfc9be795b41240ac5d238f95866fbe5252250286e36d933eba2a39854e409c5f02432070da2d96452c4098bbde75a8ba568767ef024767cae838d05224d28dfc9d0f4983e3eab25c28482eef876a7ad4d2e2528b204d3285d4a9be791881216997bcd2c570dbdbd73cd5d6ef2d9273e20104942b1646e977529133a65224828fb65feb8b979cfaa9581c811dccaf332798d70a792b7d7bdc79334102942a932eb59a92fcd77a1138810a16cb28e105332bfc39a224328dbdec751cfa293b9688788100a73a2744bd21977bad4664482e0be28251e8fde52527b1213058f65e61fbd4431abc6bc47c465969628fa89901e2ad3086d254a629424aba84889b227eda6e1af9d445946569a9cd74aa214a7d47fea18c3c452240acab48508dfcf49fe9028e8a4c6a43449ee3ba14794e3a94bcf49e8fc337244b177add395a0f7d449234a61ea644db731321f4614335b3fa68f413b7716b19d8c8d228a9dab27e9b058cf9a4494f54fd04d62bc28d511510ca64b752961d5fe4394776be4fec6666d3644b1c4d4497b2cbd2772210a2a4b47477487f84a8892923c87d239c6adcb4114b38a9e31f313538c8228ac491936931888629e8e507bb127eb01a2187e629b66ec0f653969edc62df5434ac58850a9497d28df9d59e8aa66c9890fc5bc59b7f5419352fa3d946b43efe4ca2bd15e0fa5fe34da6f72de1244792867265972c7123c943e937492cb9de67eee50f8183de67327c94b76289c7a7528093a6e87bd9bd21c1d4a82ee9998323987e28ab9b7e9590ee50d9f31fb6d4dd9c6a1a04accf6591a4a87150ea51ea55e3a9db849d0e51b4a1d6cc4970e1b4c66e986b2dc6c99a9d998e5b7a158d26a791e9f0dc59426ea8c97d41aa13514939c95902656434992739ef4a374e80fa7a1e0b56a56ea4543d9ffd53fbd9e3cb9e2194a5e16a349bff7cb8a6628ac5bf99d32259e3eb10ca50a1b37318a9c0d1992a1bcb33b26958663280926a2a4289d97114331060fffe8dff7610a4359c3ac08f799bf180c2513cc3e6e8efa4dfe17ca7b15f23f73bc50148f93fbbde942e184a651928ce142e9cb4527311b84d0e92d94d6930ae5776ba1aca726e9f5344a3ee12c94fceacc7c64fa13652c14635de6a9d05ea12cf233697a92df3c5628c8f4aab249aced74150a32c91a4c56a5664fa9503e592f67a69d42b9b74d34496d470ac59ce25b69265128effc89d9e40c2ae7048592ec7f799b24bf13ff13cac9e4a0d2c3774271f5b4e6d8ef617350138a5aef59e999b73188092549c9d9bdc64b891a2da11833a9dcc6cb3d494709850de2da3509a5e43d4928c7fc959a1009052d934e8a1495df1da124d4a4fbe4266b2e638482061119ea2776eb4528ac6b78bd7053de39114a32e769f21f5af4432808fb354929f9df0409a124c3dd7732f14c49128452f95b670679257e2d002094b736fb4539853cf132d442269df9a2d872c2e53de83a99592f0a5b612137336fe8245e143d56d77be7ffbc41bb28ef29fdf9544f99215d1493aa2731a8925c9474b66eec33ae830e2e8a9bb398c96563759b5b947a84de289371d7765b94f39e70cd2e3167b3b52879385fdfd8de9ea745318fde064db11e6a9d4569749ff027d44fab2a8bb29bcc19254db32435160569c2df9b1cc2a25c3a356692b145ebf78a927fcc1853488d39ed8a925257b2c684119fb31bad6893741dd3fa646fb0a2e827e3c858fe9db8f08a70631545934f860e2a4e7834f91baa2859c898da16912789592a8a6e5f1a5b63f3262ba1a2185b72c24ee7f4fcec8d539463fcc9ace898b3be6d811ba628c7369dc44fbfa519bc1d3f8264298aaf1e73cca7e4bfa8cb468ad2e7c93efb5892ec1502328a92a4a3e8b7159d288aef1e5f3fa39a8927a72e14a50dbff52553846992048ab28a2ea94978dd5027fe445944741ab5275388b73d511ca59359099e84a9d98982d89339c99daae644d1e48cb1303957687313e512f9a267f34a125113057dbde2ef9ec944c1443706594df54cf906264ac2f59ddca55abd44499c9c5fafeb74fdb40e364b149392b6e45bc9df900e5ec74825fa5ed7b87f62debf7e8312799bd7c89ee759b77799dc984431b675fa32e1e4830c0f9c910120404c09529023c719c70b372451fcb5534a0ab976a434e2810d6c0088c9418e1c23772312e593242df3179e0eb65cf6c00d4814842a41644e9f27f59574b0f523ca226a7d3fb77a8e2886ddf71a4d75232ee3461463369d37689eb5f50d234a331bc7568468857e802ca270a12419364bfe290f15518c49db699bc79afa97888212d95c9726556c2e35228abf3147d5c4cc2e9d3f4439c6124c8ce96eeff73544d14b2ae94d46934294cb4ccdc4b9124e6ed98e1064f4e83132c68f911100dc1844b92a53c6f5fb587dbb0e36327af44005dc10042a63470eca3023e4462074f7183d2a101e3ff2a3c7880f4386190c6e0002d3dcacb0ccb355f5f4ec93a6f73aa68198fd4329349c641dde417bcc79f0d801821c39fc502a25ef8b528b11e1b60eb64ec18d3e14e3bb9992abf7b0b9c387a25ae5fc897d6298bb87b2c62c1f235be57d4e74b025a21b7a28dec5c9e9749864b9e7a19ca4b01f6166d2c19656821b78286a3a7311ad2b49d64a079bdfa120caea636b4dae8913b9dcb043a9e6f575344875b091b11fb85187b28b7abb92a26412b74ef9a34710e31db8418782095111b7b9a39e500437e6502ce147094a85f7891305321204480f1d2365fcb8b41e3b467c00b92187921e0deb414bf81c5abe118782124ef808cd682b7a73030ec53eb58fdf4986b9f974b00121a3c78f641ab8f1062df754656b7366cc4db764feaf78c30d2599fbb37fdf080ff7abe0461b0a22332833d119376eab83addb8c0d9c208c13dc60434134febf9b2e25a9cfaca124772aa19310f1fc9d5443d1b47b7eb20eed92848c1b6928c858aeb3b525a8d2e90d34143d4921e623db3ee94b851b6728894934b5c2b6549f243e7c181f3e0cde30434916a19352f239e7ce77190a1aa389dd194f6428c791f1e327a54dc6f68c616ff1d05611cf36edd97553d7365b622868e6a8d56d174a93347ab40ddc08437154d53535980c1094bcfee006180a4ae99cdf386b31aa7fa124ffd5485155923c4bbd504c5751e2dfe69efc71170a3a423b4cba8d339f03e106174ae3b9f5eef7744e4a76630ba538cfd18afb9ca2365a28867e87b2ebdc8d2c14639364daa49a49f74958288f89b6b0188d665772857218d91c83daf9183369855227bd103a8e0c42ba78a30a25ff9c9aa4bbcb7f0972106e50a12c5a4d8e416fc9dc69fb3f7a2443b83185929ce039e6605ddeafdd904241fb55bb4567df52a251287c3a9d3adde45048f646cbbb4ce55a5b3c4df24e7aff130a5abb25faf9271d5379a020478e203d78006923c20d27144fbcc4f5a079138a9a653f36af857cae985052dead5ea7369fa04b4b687674ae5d5b64d75ece549a2c7a3e4a28bcc979d408f3907d6d8e1c3972e4c861e6a67a3f80b0f96186e11b49282637a99ebced6b3d4642696b77eb745849a2ec4728ccb996ec1b5e256776c3087d887d55c69b8a89a66713ef1b45286586939f537f76d56bc30d229433345756863139cd98851b4328c9def018e3c909f59a2adc1042e94e4c93c46f1d11e16007420d789f3d8f63460fe439821b41282941a91813bc648dab6f00a1307ea2fc09b2de3ae62faa52abf4b65acf50c2c5456b7e744fe28be2c6951bd9bca525cb62d8e8454938c947a8dd79519239864fede31d73ebbb28876aecfe8f7126e4ed3e6ce8a264625b9acb895b576f9f99918bf2c546cdfb9e848b74b6dba4114aee1645117a7b4a64ce924a124b1bd8b04541959419748d6b9d7758031bb5289cf465720c25aed6c11e3d0e0f1bb428a8bbba07a1ab55c19f338c08ea82ec28634719668cfc39c3907146c693b1021bb32869b3316955d5f193b42c4a2766708f311b3b09828d5814e39db6d792ac4cefb4018b92658a698d3e7ff41829e3c77b80edc7efe811d87845d9c438f357f3911f625714f6a3fd0893a48ea2cc56946263f9f68c859b88e935f03ece48012b0aa6393d598aa938edaca26cfa64cee9ea94e841aa28ae78e7899b246eb63b15b99eba6557b9d5556c7dd092dca369b612ca12ece0e103053f8200715414bdc4bca643cd9b1cff5394bbf4e829bda17394db1425d30cba772c53ef88364a513049959c99924c38d9b5418aaf2a7c6b74ca4651369d44a6556b703de908624a9023478e3382181ba228cee6d85aed233378fc0f1fdc364251b891f9246d59bffa988e20a604a92388f1916704b9b4018a92d906a194d850075bd9f84469dd4f9b6a135e820d4f9432fcddf64b29257f3fe2c390c11db0d1896250824913d63153e6c7a39da09b13259d04f139e898be57a8830dc88e36203c760431a30236365138c94eaf28f9741aed68a27872c998ac336c23139fb0a161d54a305192c13e7410be9d45852e513a21c3ad7cd49628a83f19a2f9a41205ad59937c569bd7e450a2f8357a4549523c8962a912a73c7e85086949a2e81642e6a4e7c453491289a2ae5b5a8fe820512e0f26c7c599127465361ed1be698ed858cdeebd57965646b92fb5238ad971b36c652731fd37a29c94741d5c7e3c67c9da60447946ac2419ee5579af8d459404ad6fd53fc14d68491125d9bbfcfccd67ab631251729393e7959c464449b3492a6b36eb246964e3109ceab6da8b9e8d6b8589f66872ba7338d98e0d51ac13f4c8cfa5e111532b4459732e3176c7698310e5d6da117a948a2f31d483482cbdd4dc6c4356cf5c3b66d5d0b9eac08fcf418f1008a2f45ea64cde32abdc0e44b9e24ab587532a44c7793b7a9460cdcc06208a39f234dec91e4f96c9c61f0a613aa64b1f53fa166cf8a128aa5f746430e9ddbac3c139176cf4a19cb9f3c65f494a8cc91a830d3e143ecf6e9de4f61973d9d84349aabd31e175194c7b65f4e0a187d297f09a5de6c943b9ccb4868a0ec2437994aa66d0313556a76cdca1982646696f923a953aed505e334912bc4b5687a2d8c9a35465b834bda143616feb57545677553d87526a38dd417e954341c83f5342638aaeaae350dab4bec2019b93d7dc6a11b5306f3599b653f69d2e49d2df903466fd26c7f7dc5038f95373834cb6a1a0b94fe94cf7a649920321c3fc3025b039d86043c164d331a64129f5bbd460630de5283a961e5e549d12b3a186f295321d72d28c2757cb6ca461afd0af716e2b1b68288819ed1533d9632a491b67287d9f8e7a273663fed8061b662897243a5f6bb50799dd46194a1964e8a0839824a3f636c860955a590139cae8b103c88fc7c1164af59d63744e42002d94c4df9612ba3c367790005928f76cecd9ba888572d05bf2caf457289d9a29498c155ba1285a4d1ead331696e92a98ae65efa9d76a27b3accfe654333b158a3f6692e09f1f1d6cc93c0ff341802914839b2a175b3731c9e12910400a65cd789fc49c272310200aa50d37d6be19d642e45a2000144a3a7aba047842490ee9a145f5228013caa961c4c9f1a975aa2240138a22e49592846e72550d080198507a2bf1c326f5d0213e4b28298bcd5695a5839c93004a28e76beaa8e9f312552640124a55823439476acc512912d4aedb5bf7135bf3e2e3356f8e5010b712630444af4dad2bdf44636792732a3d32ccdb042842417d8b1619a1c35cfe91ba1ea90c0f201e3b7488e1250601885012c5e42449d031bc7d9c0043b8db5637d62d67c4abeabefd327b9600422846394964522e7b26bbbc2640100a9f5409df1b94080084828aea53d17a92ba93fe4551e54c63f343387c81be12296a73cc467ef4c85e94e237ec7f7b6ed0e7f1a29c447df2e0f1ee9390cd00c72ecaf562aad499b02e8a57527e925c378effe38394f1b9288ac618a366f60f22322e4a72f36ed0b8db27681be1b845f924dbae6a8bd338992d0a6a6b5f3e99fae0a845e9ce4a6a9e5c213c4d5a94c3f8c98ef92143c87716650fe3ad77f2d1111cb228c6efa75262d29a7fda58945db64c921baf0c70c0a2204fabab9f92ede9321d6caf7066dfc6b35d67f32d6b43a606b58e41cc84a280c315a53953b1ef5d9f59351cad488cbfebd8fc8f51468e1c45041cac28d98fd6a6f1d8e5225a4539ad4dde3f11ff70fd781d3930db030e55f4d69fb7639c8aa491fd12ea327ed81415059d214ccc1d99496cce294a3ab5849e485dd1ce1587298c7b7d95b3b91c4dd5bcd798376da3a414c50b79c2efe6838314259395e326e99a9d18846314c5b34f92a0e4524c795814b57e7a977bdbc9a955699abed1d7d7ffcce10845b17f93be12ddf94f058af2a99226e636fa8992c7a7dd18ca4d535e1c9e289b7fd8eeb53f41c486a3138cb55ade6ba8bc685a6da6af8aabdd4e4d130d3838515ecd3ba51f4a5b897c1325df4c620ed14e937b6aa274c28e97307a7a467b3251b2f8f1aabd4d279828e7b8f02a41b8021c97289b0ad9b761642c51d8e41b4f3c8df4dfb212c55423ef4b5a2f49afb653c04189c247cfb7b0d23bb6e5248a1d548b681ab59d4eeac707f1000e4994b7f64bc66c8dde6d3252c6f3b0eb008e4814bdc4357aa62cf16489063820510e7652dec893e151323ec88e9133ca3039f832467ef41831447b84d5b5b1a697ebb9b1b39b1d229e65745e8b7138a260995b2676f0924a72510c1c8d304354354fedde45c746bff3480ffff1931007234a1d949ff892741c8b289d303d2d25e38a2886acefa9e7ec0c424e44f94d8365ce4ed2e98e21a25442a8d995f02e310879a200c7210a9b39675b6c8b6bcae0304441a7fce849289d73d4288e4294bd4e4c92d45163d049c6c3ace028818310a552f95cc266cf2769aa83edc728c3fc305ee01844c93a6a9242c49356d7870f330451ca2e219360d95dba84efdec7192960038e4014845c91969aff613509204aa2fcf8895e727f68d732643e110e3f14fe53ea9a899d6476501f8a6573d965aed94de0e043b1a3680d23437ecce2d94339a85d97ed111b81430fe52a6155a3949b879220aa4dce2e27e72b0d071e4aca6544c91e993b94bb432771e4afd6c56687826b6efa18ab318973eb50d22245fd7e1cb9f9d5261c7428e6bbf28c414f83c93a87d2aaf688f468624de670c8a124bb8db9aee98e319ae250d816a91e47753814f3a6bce79c6fcb32f78692dfc953b2ef3987c670b8a124dc4916da3d9824fbc2d186d2ed49ca37ea95fecc1951020e3614a355dfabc7ccbfd55801c71a4a21fc641ca17e336ef02336485e47623c8c19372838d450ba8c3b213e447e92e49e8662f67811a3cf33556627703494cb94a039ee99b89ebbc27186921c17a162ee53f5a87f941c39cc8fdf81c30c05d5d94bdce99ce2f383812e4339092d4f9adc838e6fb8031c6428dda634f19c4c5daba80738c650f6204aaabc0f3d51e9085e3002031c62280953edbe6dd2c618533c0c8e30143629419a9453214b4fc9031c6028851e755295f97ef00be7fa6f90ef24cc8912fe08e20387174a2bba3a8f509bcf634e178a69a36abc4c4a8d6f0907178a99420831da4fa5c7ec16ce552526d37ba25a402f3dacdc4e742c353683072d6ed2290d8e2c14d427297d7c93a49f7c2c94aaf39e2c62629a6c325728c6f5cfd74a4fd2366e85922925b697858ca30a25e17772dc1e9f0ac5fd919ee4547392961c1c53288926493286d689965e38a4508c21333ccae7d9d4a6f4008e2894379d38b2bfcf0437792814fdf2e40f1d6412d4c99f50924b8f677c4eab3c2d0e27946b4b1a15132253368fa3092521dc4c4d83fa68d77c193bceba0007134a629e549d543e89db0cc7129c0b5713d7ee345a19942ed9c2a184f299cc67b2758ee2c1f33892500eea639295e8bb259be04042b154c61cfdd7e45cb763e03842956e753532377799263f3ae4c7549dc719388c50927be4546decfc004711caed59367d94d21c5414003103071110abe93fe7e5a46e087cfedb9231239349f7c021844e8b6b36495e93e4cd0d7004017db56aab105715dbaa7abd5c311945642ac88e1f2cc89103b10d7000e1de705a9dd44b06f08b82d076777192205f944563d0a57ceb45b9b3eb0799ee74a650f2a2249654254aec87f81ced5c30805d14943651f2e37e12d446ba28afc6911ef5e5e742938ba2673e112afac6c5b29fda7676765d1fefd9791e93243be7926400b72827cdf0e99d648bc25a9aa93ecdf764aa45d9940a2db1dad3fe6951d67e3d2b49dc244cd02c4a264c120d9f74de389145594cea8927cebd4a271605e141cdbb7b92593db028099e35c624d8f89ecc2bca353a1afc7357144c3c49fc98e35733de8a624e9f847ccd243adcac288bc992f57583f610a755144b9e26556206111d4daa282799a7f7ba4abb9529150553afd9849b2d5db2848a9209ad35a5b1748aa29bfe384aaab98c5a3245f9325e568e28318a954a515e9b0d3ffe69e20991a2e41993b8f7b9268e925114e375de64a26a429a88a27cb27fda8a3331772714054f4deaa70414e538a65affe95e73f389d29d5493f4aee7774f1437c79f4d999386dd899258790de336270acaa4d2609d6ea2649b94f7d57da74613c564a2cac878dfcf9928c9aba6ef151f1345d3db374af83cfee15f42ed1eef2d51703b497ce835f5f0be1285edfd36a143d693d853a22498127372737faef69328eee8bc4d5286d46c9244599390395afc7350279128e529e162c30e89c26752eb41c5b9fbfc8852db2875adb7a249eb8862504aecbb96ceff69234aa324a963caa0c3c91231a2b84926b1775a1fb7448b28dd0731763d2aa224b45d88889a1173224adbfedae271e4680f11e57ce2a7eebad5b20f51fef66cfd98d14365c81045d1fc181db5d4bb10052fb9676fdc7dd42744614e36f9314906514c927c7efdbb208aeea7bf438938b303510c2703a2d47a5f2fd62342c87f288edc52ba42f6434912bfbc24f93dfea40f852d6dcf6099be36c987f26bbc7433f750be0c15b277b6e418d44341acda4d305d928762f61525849636d72dc143d13a57c91d8ab1754b57c865a8c90e250d1b8f569f7468ea50cef85994c89e0e05a576d54d08cda19842658e696f749d20391474f3b7c589414925270ea5f0b2f62475e050526e7e7d2665936bde50ac534ad6ae6f5d3714c4ce79d6d84f1bca39fa6af2c86c286d87df17359ad4b86b28dae76b12b583284d8f1a8aeb3a26532931e84b4f1aca2b27c82446068f221e349443ba8f97a43e299d3b6728b78bf847abaa91a9638682dd9af0546f612b2a43499630daa762b3930c19f658951ee43c866295cceeb94b12e4d76228091a7ec408f3246c1d8692ff5629a964fdd03018ca4918cfd93e1b6412fd4249466d936fa25e28fa69f60cd32b4249174a27c5c670a198352669f4c22d14559448357552cdaf85922937412de53e4db2502af14451935f6d355828dfcceddacfc9abef0ac532b9844c5aee7356c60a85d7a4c49c9c64af4d158aee56bf9f4a5428e924c769ead0144a199bba94870f3e1b29146cbe4bccf3d6c9a4a350924d909bbf1e37970c85823e93bd4fbd4f28e83826991ca64e72d509c5f528daa48ea726a64d28061db7493861a99932a1fc5be641b5c90d652ea1282a83e793cb834ea3128af7b94af949288bde6849a1cbfb3b2494eae4a968d5b3123d4261373727ed79fc47334241e7d6104a30b1f0cb8b500c258e66927a22a084934dce984e86504edd8f498ceb26a78c100a1bcece72a3abba1e84d29ff02567da030042d9f34b38b1a75c2cfd45d177c3d97ed0bbf9f44541dec9d7fc1bb327d98ba27e7cf4b061377b9017ef8d3e310932d8bb28e5d9fac78ad26262ad8bf2076dcd11ef9796752e4a924713e593122eca22efd357589aa6e91625a18465c9e9d8c17d5b94478785e887a9aaa816c55c27a98f661e4ac9a145d94c30f7dc2aeaf43e8b6210428829e9c34dd46551ec187563a963515ccff5e92e4eb2b56151b22cc176e7571454f8c8cf86de24b32b8aa2be593ac656949349728b79ebef8bac28c74d73daa33509177915059973e8a0a1e38be75815e51332c7d6c4fba0394e4549850ceaef3c4645c933a52625da65b68e4f51f2d8d2490e2564ccc5a628c9b959ee73923dfe2f456947e820ee4446358814654f9df7e396dca2a351945a64248ac2cccab7a8d8fa982414c592e76b545c448a09288a57f2df4bd0270ade5a59da931c6d1e4f147e7d845092b727eb74a2289f499294dee0f1349c28e79ecdeacf31e8d437514c3751a77afbf1744d9453275592fb9c89627637058e83a8444ec5e2c1682c148604c2703014081e5f47003313000000101c108682d150382616c67d148003593c22463230221e1c1018160b8502613810060483a130100c0685c2a13020188cdb5295d603cb054c60548c0784f6397345e10bf91864179e38dbef2d58da42856dcd9ea57a73d4e80c2aa86d9d328280fbdd0b7b708d041d5df71eec76da3fab5abe9e45613bd4dd24a75127a7b8710dcf8fe7744892e6289db296f18b342ba9a637b3b1703bd23fc4ede7092cfc05c6e54ee63193261835cc49728bcdd448e3a5653a4b1d3088ec98e22fda517ad7f80b9c7b960d1a3750dadd9d3df8d503be34d5c5d2dcc74f63f434f29c0f46e353849df0017656ec65e9d30df0ccdea32cc178e77fb3a333266f23c9b994907c4889390fe6e48001859f89c0df5757c2a15a652573e9b8985ffd5c61a76f6d0d900f8e743232c176301f992d92489c788707940f79bb8481876965cc59f015c9fc2a947568e3be9f058baf0026df1e108be8c0faa6124042342fa51cd46c2654a0d319b6612fe175ed1eb503837c4d70570b256786337bba13f2a07eaadce9710ea1ccbe3a775c976ada286a9006199c7be6fc04d7767bbaefc726a1c9be22f7d4932f4ba423bb57b3e77b3c0ce3ac808f40d8d3de3da0e541ce80ce8a1b40cd2414f119dc587e9f9ba3cc0061620e9a96d92ede4f925b9a35a66f7b2c89b02df4af868a044f2818a8bb5c77b0a83dee9a3627c8fe68a462738bda98c65d3dc5d07200de6fbe26448f37f167959a25187029e197aa84988b31c3e6a30c04ca743cff0c58d7151e0b62f562a352d63271761dc5dae7725586bd9a7c8ee74ad5000641c547e032b7332bc9054acd42bbadd3c05d130a1a69659cf8d75f60784f3b88445377127bbda39ff9195eca8041a224325026209eb57d1bf251ea08e0654849bf4e8b3d47006b1b1517623c22505b1747c33418254420fbb1aed461891a267281e16fab5d720d0097309b934b31a8e801c4402087069983f52767331ac1958e93e3c267d19eaf0be92c434c5005b409c44260bf049aa01b0ecc126e09a3a054062258260f52d051afbc3cbcaa7dde100647046526b4b88ff836567e9195b1efa6b64333b3c12dbac33514521be0170b38ac5ea4aa86d1b8448dc868c80049c56b9bc07fcbed8aaf725927d0bd163bb8185b16dd4003259c428d1d32dcbebe03c2d2f1df069fc501f522985be8ad2c680213c56aa2d55b326529d7bbfb9f525739a1af8c9f6966d23fa9eabcec7e9e893c56a2bd07229574550ef4987d6179014d2844677de29e254a529f096aeedf460511efab751a0e142f6453cccf8112a9aa247f10122db2e6a8aa60b90d5e86600fe4a9c14d7ebd6d8276940b2c55a8e4654295122b6729cc1e2196aa9016481c9070a3a8ca5d82f17f709811fff44af5d02b6e56cdf3090ff16c5bf1764d9eca328254a37c32993b14f1686de8c8fa3a2672532eb7e31a10b9e680afee4127fe4455375925b1eccf17fcf8fd94af1dc95da2a778a8443647b725ea6874ca7be3429a368320fa59d7900ef85eaa4574fc71ffc8b8ac8852e1527ce95b4615b12b3ca46a6c9f33ddd8ac95b5d44685d2c885212c26aa3131166caf2c8cd09b0ae85505f150eecde26e9ebeaa96656f6be158a5503f1c23d1e8bbada6007a8e5596a696be729ed99cc67f3f2b6b5385df1af9d18966a8f642d0e1c84a8aeb725d2a14a1b00cbadf04313d796a5c9831088fe121552d7315d02585a78797c290f7eacb32204c64e1944de58bda0ed86d2dd1dd8b4026f52c937f081c7fe40e73b429e7a3d718e1ae4ece50f06af56f3208aa8e22bd0207545a74e9811e193494adaecde40824e3be7064762dbff8cbb39577e84bcc6a7961e3798ed3246c57a829883f20e9cde2f3540341078035a33be392278bf9ce6ca5b70bc72546204e9610d89117dc09709c87b66b2ef02d935776edc44076c48597feeed42426d0141ddbf88ab2994df92ca05b16d56456036d1377623267f43840f512052d630a23a1e758c76a83f936d169b23c638517413871530e6dfbed776e859b013deafd00167cefe00992c3530466710e21cfac2b111e8e169786636a0630e3374b2caba268b3580aba762eea38ae21dc1ab40664c5876ba656e1aee31ada063bc47131e5448ef2466a0458441be0bc34faad5970aa8ddf389edbc3ded4aa5d207e6c636512b07a4ca0abcba09fa71286cb5bd6fb305733f78594c6863776c291c3e0e3fb4e6d59c0839e9ebde149e2da2fb7571121eb5967b7ea5cdf3fef29a44ba52adda0e65aa6e8814314cce489691af69c2e59c7577be0094d531aae83d1ec12019ae686ced959da7074c903f0a985b6476984be61c283389ad39dd6cac2b209469c18c4a9829eb10425c1b8bcf78d2dbadb19e8d8dceba490fbda756185e9868edbdd15306f7d2f920d93b491081511307a25b1d2f5ea84e5c8462fcf4e555cdb9736fb2f8b5378001cb6b3eba07d0069f4dcbd436aafc4f5b02ac44e4d68ef17fd14c032f6e44fed56490ec8d579cbf03ee6e3c49339ed33ca70c15311f3392bfc1ed699abf4c6b6e7506063e4854815e2f4706abd832dbe1fd69684a4910a896fb5e276d85a27c63476795a5fe047cfcad28e11fd7092e60f674ef28bad8270e941eedb535a17090440ba08000081aa98643102cf865f7c327d89d07378c3126fa1f463fdb299bd88e57dfb757a0f7e9198db22c69be641581a527362a74e665c0f8d02a4d25ab514a16b863528367fc6efe83544c3daff50dff9f68b85a52a2a766cd32e12042a4d8442ef6693200702407449dac2e6009a1997c5ba128f1cf428bd19b70317c15bedc745cd535001ac2263f71c1dfd4cf4e6bfaeafd9f0e16c88f12433df04a551f123b35ff4b48f28190bd07b6abc79f733d71a3098c5006fd3eb7a545c09b7b3339b7f692403a7e346758eb1772505d4beca73f0b03613e90fd037eabec8144498cfd6241d8ea4b7e41e1a96dc680ac3c98b5a65a2afad8207ebd1f3d61ca087e36438985d4463defbcf9f2abc88577a4b35ba053bb3eabb01539007ccf0922441ad6a3d1ea8c116ba40a2952587c94172d8dfe68a1575e0a0c1397e436bad36f4c6a3cba4b7c4d970ce0e542ca2e16c6dee9e691c5600f02b3dcca96d3153912ebe48a899a20fa88b8274ed68ba56795717aa3be4d07b4c4fe92171d03041f328e54c67d69bd913711b6c6d89eac6be598e967be58b10a80861e9687fca82c7eec58d29b7f9d5cb2832039f11ed0c97c74938c80e5086bdd58460f0dbdfa21c23ec758c634403039811a8c49f23bdd7b25a1d8f824cc377cb51b241da53cb6811bc430699f1bcc345c8b342c3ee947266394d1191e8264b8e848fa07432631267190ca3792e4c5b901b7f4a7d5342132c53e286cc47022dd2088d13651f051ef6387f2b20e1cede43ed239cbfcb79db0e987da29c530047bd686b53e46a20f02dac2b5a664ef796138ab5f2186d03cd99756e9f9743c901f3099acfa76a28c649a506446260ca1028c43bada59408dbe4fa0710022f880b15295e5723b75a13a40858c0da3e07b7fc71bfab6d9b49e6bede56342cde64e79d47b799782a81d5202247025fe020c594cfd8bb6b0ae44d652e7604034dc85b23b8817fd3b7aad82071a056ba745affb326ca04847c864e185a3343b5a9af082ff5093738a2ec21a1d4c211ba64f6c1ce60764d93cfea225839998baa2919d027fe50051ed5e790fb1fd5dd840183dd00ff5923a23cd4802a50d429213fdba14b633fbfc1a4a804d5676a9d7957dc80186d5c6ebf1d753afe59ff985f31fe4ec2e728ad0d3c9383513244ce0eef74ce7f86c5b9e7bbfd811500d809aa6c5631f4af84dc6e89c339ab95727065bee6588eea276f86df69b0686390f690231c53eeb650e6df1158d355bb5bca6b1a26754d82b4a3d50a9190bc87e8196de44ab6dde5bbae0625212ee4d272c203bc8a0801ef7050b30e275cdd84df5dcbd66a2ba818e2d9ec818a31bfdf92c28083dfadab95963d4944262b795e8dd7a8855c2fa71767ae9996b03d854985a23adba0d9399231cdc1fc6fbd8a1a3a45ac13c3f11bc3fc0cca3f239bf5c72096840665c6b7590ec5c3192e46339460daf2ebe6e792c10cdb5bb5cf698c9c8194e6233a456a0d9016be74ee70ddf745bb6caf820bbcb3c14df9008a87fde04e77611e5af3ea1c5dfe7b0ab280af2b0da0ae4afa78861a05c36c02e8cc42aa826bac64aa4ea8464177d09f56faf311bece6ffee3c013140fa7ad8ba888e23af960ce34cf1d9e0fcdcd0a8b5bdf0390b57c9531843e261ca60fe4e9df97a27b069a6354d816ab5a4a8d95659593c3053a8b85c65c8f5fc6ac40fca13638b815175728905eb74a49575ef8c1392e81085e0974c230c6587c48d108b3530422d7056ca17fe9be29325be06450023c2081b950ff02c681bcba5584238267b17543f8d8b6c0be7cea95f7995e5528d67bf545cb0ab83692ad4dbbb84a0aaf4854022e64b07a3dda75b8e541020c5dd9ee09e64d017c578b1cf84253d60cc0292d5e6fe79a50613033a9f870e7db394249065548edb6de5b1fe2fb2605c4c3815e88d786d339c128808e18b5d9d2ed752aac942118122127bb5153a13a2301b080c72c03f5c92953d1bd8ae1da9359a1d162665bdcdf7cfa600172d0219a2fcb43711e71348e125a12167400ea1b631c213201c473b487fdea08dab0db5ebe4ded91ce8a6e8d0cc923c052d29f702219186008973bb2d487116d3b2086cd04b685cfc5e0303927ee26ba3580521cd312a2b73ae7bcb0a06458d2ed5cc4608cdab2a6010d95aa1b20143c1a2cf6494174412fc711ced275785ad3b64f1dd6548c0e31026cbbb0c156a4c9f20930ca7455a47078aa503fa58a59480d8254a9432c79201be7d433a0949953de30520b738f6c91aec6cc03644418a98662ab0e01212def4f64128a598ac16e08428e8532464660bc7a92cd908170543617062c3b476620692f12b627860c58bc984c8248b8e1bb893407a81564773a1ae494e1f11190450aea1e44814aa36e21e016a735733a9ad466ee4bfd2cac5c87c47ed2140006bed8ef47e15a100f344004b5cb23fe9d73dc59a1df17aa88f2c41aa732ba86427600d54304911359c9220e25302695cde96049b68e84ce4f9a1055cb75535a2961ec33d8a7728b1b3516129593f32f31c51d58bbdea7380b09490ca011949373afb67b15acaaeb3b6ffd701d769fb754e270e75c6b4d317ba1dc7774064482670aa671b295e260c1dd98ebd343be1916d7809791fe3778e23ab1f86bd22ca69552014c49ada4c9e4c00de074b260b4eff485dc48b02d7573ba486bda40b03502e441566a017a57a81976b7abcc53de6665831e5f5860701041b6a0e5fe6edd5ce47423e60af0ab05cb1553480c66a7e34aad39c1fbc1dcd82129e5ebb861b76898de449336ba6bfdbbb45a97de2687b9492e5cf3673de9d7c340c47907434c5fb1caa8fed036637abf78eac6e720b59185e4f6b0480908e6852a5ab6c5ae39d3872638f1af4b0c9a65809eec978e5a2e91b5971950ac72aaa5a8bc54fb61e5182d56adcb3163b869ba6210710b0116bcd4db5cb2071b5ce7684a168274b118a4c4d9b90e5d4544803501d8e871bb12b8a25dfdc1e920f7e014588c834d4386a0ff0e8a8f3806ccc8836a7194fd774d13c50475dffaf3a06b6fa0c47e9127f7c2ed15ab5773cc6403a0fd2e51a90163a73c6325db2458508acdc091c017d916fc29e3d500392f4e94cac927867007b3f3bee4070d7e78257e22d5be9282ba2f22b9aa6281240d56b0507b0b6480741b8e538da61249dde4726300809979a945b41146b730b2bdadd00c8d9e37b7e4882d55aad762348bbe76c58bb1211c5b648099c805bab360d8f81dc22ac09d57e8400b0333179185664f3ed22e84fa2c673a2b5b732948cfd2ba67d3f96d28a11da54f9282ee2a264fc55c4e4be603926e40cea5c6b853d5d5316c8986fa7c4ab571b00fbf8fa6c557fbcb9539d3e59a963eb07acf74279934d6514ae29300c61d395c25d6f9abe3cda2fb941f58d30b97882cef5a099c6bdd919970f0962a8441ab6425a44cd9c969d982e8d8626d5cb801cae00fc1c6a62e46c74ec7299352194620747dac03d50c70364570eb86e202a6dfd3ad683aa145bd3a27d143a7a9019cb7530cd1a6a4f5b3c5cbce1f0a985078ba130c23026012b01682cdd8ab350eeff95bb5f11cdae6311c840d4eb285e03ea79b0b099af3cb34edd89c2a246826e040d7c19997fe8e002424811b0b63026bc0ecc5abf22bad8e257d7c7baf7564b4856f899ccb8995283d19fa6162b8918c3410734e8df454b18d944548f410136136842f228abe2fa7a924167460d84963c2663cd66f525d92caa7c159a426d309fa71c454bcc99b05ae00ee33c0062d196caaf390a825aae77837f21d4441e8c39af007bc0ecfb8531ac56f537341028fb582cd2cde7f8942cdb48cf468b263a6beeebcdee6626bdbc423a12c24ebbdb50cc401b3b58e5eb52b63fd0f1629a8aa6aa87081c3e62b758b2249aa24a3bac632ad37ff9e7acf4315ad9a179c0d8b35573e77a07137eb401f7a13156e344834324ef3a6699ce28d9d9710d42fb158809f572aea3920a18e283697378fb04c9d6765a17a34bc1a420330269586a4b079a28100b4a9c9ed98882e987e1b55ff098b101159e2663a778c0af8fede0d33ad13ec78d52eb3801816f3afc7132358e7b7fa09c82e59ba89f997453c1c3b67e3b77f792f22e37e0a8de8b55f7056df7033343dca32fc95f7a62bd450b0393f2851dadc105fb1fc5c67da77ef6cfb3a056543933b6fd41c4c9d7eef1f821c3c88a03a9024faf3731db97c88ccb8b516cffe1357704139092a124055776435940ff9e1a04f2b24c0bad9edf1149d2964848b9baad0ee1c9026858f137227702b9023547a0180949c1d0f0dc7618617d12c383803a7a104d731be751cf50ea89a19b801886d4d88916b73c85ad16785b9959091f437de398426731992b523a4cd49ea274a3554296fbc909d004b6915c9506a80fb9a3e5080127a2abecd2a8454ffed3ad1543b48738fa08cbd73618d83b5a82e695c43c5b075ef9434d732de4392ad52b5488126fa473254ee765d61f39ae4da2d0165cf7b1c13cb0a15310b404f2aa383ad87ca319fd0c088b344eda9089d0e903e28d42abb6e943efa6446f3e700d24bea07954e8cd135e462dde134effd7c3951666469217831228d891001b738b095eb5ad25795114dde1a8a708a3c81a468ca88a41beb520895181589bd8b8e5411890d3ac5d7d933159fe9babb0c220c3e03c750cdb3819a87818fdf44e250274e456d691215b9294f002c6b84b2bdbee69d4ef9e228cc13192027716872134c32277d257260c90fe8a462f59eb9a09595bc9b23038dc0ea50cd589ec99385139e96b44c93a1c9963a7c4a3a92142300c91aa158c80e00238c34a71f27d08a6f4437b0a8fb119d4ce156fea6d62a62eea7634624ae14ff20f1e02850b16108a794cf17ed032c1f61b99ca1866349623ff3465c64641e845a513ddb27baa106c2683948eaa1446ff2211e45bd336fcbdcaad27ec92a099805512cc2b59f7d9f62be97f80cc92253185b43c65e1212118cc8c46e742d6ee50b29ed987b04b3408c0dd690be384fb99be7be6aba37c43f9290aac28650d0e6a4f508dcbede6cc92a75e79127126aa32c75242b4c97d67692db4d2f56ee202829501cbb1b9d6a82ca668684e2c231db61819998ab6c765fc6708e8231f76e5e9fa75b7279c5c2c4b3b52cf7b482faf2c711157dbbe358d0a5007714d5ba2954f44b40fade8df1d9b575e5c84b6f1c0d0998a8a79c547fdf17de0899cca7cc518cf139188c40d26f25b2905d683428168db889d1e01ee6a20db8e713a56594bb1cbeed42d37d9543786ba324f0e70cbe6cc6a191b8382ba785dd2777904097d87dc571ffd76d91d421c01e4d9cc4541a1ee54072d8ebf384ddf51d026a4d917aac523bca0065f2d9a94a7dbb6ee35180e58f44d82bd7c023eec65789ad7df23f81b84477b0826283398f7f164f7613bd187c877feddd9ba6d4a520a20990a02ba224bdb235e8382672bec92d713edb88c65532dcc52b794edf49d8d8cb0d6586d84be627caa05801fd1a7cf50e0fb16793606102a2e07d49314506e294f31facc52c31ae4aafe7e864e1f67c7836b0720a430edd61faab9b1403a9cfebdfff10aac1e10fcf122f5e867f195d098d6599af3186347d7b83e935e1f0301b7363a2fec3a5ad47260861df5f4da2c87f489d27cb658dd4d6798d85adac7a10a0301238204c966e185ad6c7547264df8c830e6062ea45049bd736eaeaac294d3daf9182457a6e4a8b9709d0a24259dc035a31a0810346bd3cae9f5f79649f70abcd6dca2907799c0ff13fd1085ba38dfbff7f1501f644b34c2e20b7ea27e5384eadfe3fc4f6b9a8425118eb982a329e1eea3138dccc583d9eb8877e4fb43b248d5fcbacab1b7b7558678bff0a099981aa74b521d488e02ab79a4bb80b5f0d92ad85a9e01d458ff21ca064faa182875ea5753196bd3388e1153cf0dc51f80dd903e8521b9a670bb4783b7813551b2699910adce52dde67c4e0d4d5ceda80197d6ae04f936f8fad80fd41e473f0d1ee48220c05d736d8d8880538e0469177a8807a0d937fc253192fbc2e518f289a35d1d276f136b66b126289e65017936a596b01187507abac4ad6b8d77ca992e5753db05fa1742d6448123a17976c6898702b2448f723c7267a66ab0c205e53d021fcd91b13f606b616833f2082d57990d70e11c4026239e2dc23af80750b1217fe2faac2a1657e987fc88d42db3da429735fdb8a11ce8927ef0821894ef4cef893730c49a214c03c4eca8766aa6db06df03d7af98c87386503e1c2461ebaf0caa814168b09e267a77008a239088d4c41e3c0958e168cd8b0bd97e2d7dfa9e14cc1ec60963e1734248dee4db0d0572515266c50420ed52b3107b362a58223229e33bb8e6f47e60a3d20f2e8757afe4adbe8299ac58f3ec3ca7155f93305d06c608f08304ee50e53013f23f1ce717e0f9c698d307801ccea2a40f502eda7e178770891f08b91fbd97c2398500c56856059995068ddb129642c4c8fb90084bc829e8080de5a96d3ba148b33e5f1f383573053b0fd25905d8251a6cc4ae3dddecd7d077164ba38285f05587b84a01090a45cd97db5f11b622f03721ae7e536ee8d77791551e13b2f170b4cf63c7a84f8e1c9e6a4679f9cd8116f52f688041ae4fc98068060a807b9deb995070897dcaf134f3e971dd98c71311636a9fd923472d99e1d7919e325675c9cfd003c4718170ba0e3477163bc9731ea15bf01776a2d72c31d9050772c14e706a49e58d225730306b6610b16bf17018d37107231e5f55c3229c81ad4c402eae4981547596bc7b6ed925c1e4383bfe9a47a754d31a4639f7c8c8ce2c12c645a95421c03cacccbd6b0c918c76e258e03fe30ebb0d8f43331fa16d4c55874a3a7d300a9189f0354c90f54d271b016e87dc360a7068bdbe4469850753908021b747f94c7f2d481a7f4ff5640f14c8701ab62e6697a7a24d199762b9f91931052edf014d4c6a44237cfe790810df13f124a7a905743621d2c8b7bb35b17a9b72b25e38a91f10255a49420a7c5164758bbde64138e5f5036ec9314fe4160744df16060c1a7043b3ca52f8dcbe6b59184a760a2da591d8410a3ec2d75349b255a200bd0abc33d34fa4a4ef5b2621293b5262c94e26d4c1aef7d6ac248c0217a5671017cf7160224f1d761c34b9f0c4cd4ecf64f0dd624d43ae31533f318451072620cb660f0ed7ad5467c8e23bc7bc2e7073177542cfd64d81d28b6aab35020efa3268a63217a239dc091f9455ae47a487cde2d9df56d1d4170b28e2ec89af2cc9b2655a75e0285165cdad94c35e3155309ce6036b3a4c7297b7f5f38b662310c4d033edabfa8b3087a39015dc25df6d508fbf619e17c2444c56fdb7ef20ded043ce60d4af863c49660cf123838ece9e74cf70084280864cf3878122ec6a6607ed6055fa13a54af3219979ec318c44e9496da351243400ffc07ebb89e0d27587328aa49fad8891cd4ecedbca5e17d8c25b63c2ba0104430c1fddec594bed3d1126b68f34836b96ac01426c6e53ba731587ccc53c8f2e01c6524bb44a15c9be20ac6fb8292fe63a0f46c2ccd2c64067d3e72e4395e43bb743e230e797491cff49bcd6b4fd90443305874705238e626448862f2d18da370b468d99094423afa6e443301ef7ab80bc9dce2e65fa1e410a5be8dd9d8fa96eb1f922485ad6987f30308cbd1b73a6940cfe861f6097eb8b71e77b20df91aed65cca2c941cf75b079ce1a08e3f0348229925f6c447abf2baf358dd0cfe8b7bc2c521ff9b593e141ab796834855d7f51daccd392a1f148e5ab0287cca014ef1e4b7872b2bd683ab31d2a93e3f311556235fe623a942234a94cb936364cc35fd2b582b8026450c5b8c2f86a75214b3a38b1010eeb9b05125e484a5038c7c0fea9444d98d0cdac0e8ae27cd85701f552627b75f0a966c63d39106b583c832e4c2058186214c45a17b8f3084270b382a4ac2626f73a7033b7e1927f51776d1cae845c1aadfc628cb6a02a70a1b38dde8ef69c1747f301ccc08a17c37315ec8b845d8d7c62703f1ae6f22da59cc659f30940b05e61d97b8905c2e394d314c6b2ac69b44ba1587e29a67ccca84cd582c348cf4ff7ed95d57a5f26376a8d869973038346e09921fd111532f4162e88d2d7afe389390b29a3293d2dd0da9f92610bb050aa5790967a053ac676c537ff86b2d01c3da489a1d917f4c2716c9276e5e095b40d9ea88ecf12ce4e0e797fa31c851aa5a436a32cffe85c1294ee0da8ab9c0d72b927b06a13c009f4c9e9d0c48b89b8bd7e1c34b1daebd214aaf20cb3c6ccb494d7c75a6e8c12850c7c3fe35073c3a22d1664e66c51183dfa1a506242091d188bc4f7f8a954542102e779f57c924669818179616f212763293ca7ad133c467ef5b443aaacd2a2e2139bfa2d2a683401873ec4356da588a6f976ed07e2cf4ae18df0b23e583f9cc67cab8dc4887c670c0698f6957c22929e1e1126580d804e0e9e6bd41d7460db7c130df0b4f82410a8b06bf07869fe6e89ac2c376d489f488fe5730c603454508e4a22484790b568eeed2e2865ffcb9e20b3195cd1f961c49b2f558c9870292bd978f5a75a77ea1d18a5b7f7170ea7d8aa5fad2ab4bf3c2c01329469508402624649e0c2f5b599a1612b8936b3c44efa48128cb0da2ab508c4d66ed129997c88efa1226b00fcb384ba1e2c91635f49337e04e339521b57a63a2df39704e3e516b0936a69453de0d4fcf2cbf401390caca759b283ce9546b3955a31f9bd14236d7872377fdad8ecce65d1b32275bf0d4c3ef3f47d90717b59f59c39cd8a25872634c96460c9edbd02cc0c6ab7e417dceaad3a0c9e340a1b6da0614cabb418aa5700839576fa625fe919f00395ca4fef86c7c7b055de446e7c860f2e563c76e9917ccd8933053b20f00e0796309853cddc82d341f776fc6cde1e44436d9f00b8cbc614ebbdc48500e9b9842567fe5adf2801f6e64f97e3c0e64dcadf2f325d613e617850d3591f2874245fa39422643c228565badc098c640a2047993c8f76113d883bccf2e34c58fa537c9843dc3fb3d6aec58aad70b3093316c416d8a967c0eb2eb10699b2f87b9b32c4e7458a94e962d1508a568f4ebece01cfbeb7b28acbd9463155961be79de601f1738cb1de129d10e6a21ab35841d555ad259a24226d7461c26b97e3535441ba34d19c499d703986880f28682fb99cb7bfb884bb826030566a11b60671f35a257fbc71aa5717f34a008c2e853db4c7c7944f585da294679852d517397af33ca36b0a2ff9f01b69ca701525e19be7eccf49247e0853c810ac762cbeddc7d3cc51b208b7a04d97b3e561ece9f44469747d7722cb5a17138211c535995f18ad252f818f82fa5e2d416de1f6fde3268e39b4fb89a28ad7b8af9990b1cb49677147592d490b9cf8a00a8d74510cb8ed09ada98b02bfbaf114edf376669a871bff3d8d628a6dcb0ed463d9005dcb36af96cc1b3d475188ef65111b906febdbbc7b65896d808b1448a7290f34deeccbe3cb6af8defa8c667089c65b62320123daf89ab940d3156d5fdd5c8fb8031c7b4acca012aa4a95eced7744848882e0cbfef5a39ca3c878de43e06942693e1d40ab73da48f683ddf5f34354547a85a882d0520cca4c6c4e5afe0921a2066089c24b7443e9199b72fa906849cc54f55ed22f865c622e61c375c0c5dc9470084f6eba62d5401e2ffd4f5e22b66999f61d00632493950906f7d4b0aae5df82567ce622fb2bd383f2e0bb691c3dbdfbac835e79f19eeb0dcb1b6f303587a3816e914f58be64025d81d1278837ff033329c0701833ab9d57bdda5f720792a107fff6a2f80902f263544254dcbdc3eb7351e76d2f762655c7ae8b30c8780be2ac2ff7dce6464f44f7c1f3606907229234e177b39bf6f6c53b9abafee94a4b179fba40cfdd73fef0b758d135b7dced05a37022b7ae3bb1ba3bde3d0bef2ebb7b6e4015b930e9d6f7bb7511f053bc4f784966097ccf79963b87d261880ccdc14b32cc54d0b9eea14ff2ebb82a0dcf4c345942ed9644daecaee4f780d53d8884654b5d4da2ae0623094eedee9189aa04202907f17c57979840f1c1aefc28f3464811a5e2c5c5086b060510ab4ff7124d9e41cb14e31b2bd011db226cfb14034cf2abd1134cc80ef1f1fc54673f054c7a9d9ee6fb0ac3b68108ac8cb59c6d63f9f21306b3c56529dc460c6a620ef72e8838ef8dc45aa1cf16ce323f230585ed8a9c7090a63a4fa0943ec4c4aaf76769f05806b4bd255640061f8068507050261547e2561a20cd680ba18d8e169b51f799c940be7a6dea6d2278d6bfd525f70397f4955c8c19ad34d905036042904042d6406368412a224feb310492e0dc1e2d60686f6afc2aa29b9ba14f0a3ba18de19709eed9f15c60f2193e855f724319298ed82b0832249300d32bc9bc045c670b478058bb23b0c861f763984aafa14d4df9f8273026951ea5a2193810b743badf459c94663a1dbf601b882de136264430014a90a1e3c7ea2eae8f20c36c40efa7b3b75a6a5218bcf5fb7e075a6d173e226cf6766ef39b920dfcd1cef0e53be293b63b1d9d00c37ccc76bf92c1b97bb7d3b5e3360458efc00873f78250071d5df87e351497de8f93aaed1c62358264eeda8f2360e19e6524c5dcc8970b4f23a65a6809e675f308d98aaaf2a82e330a2905cc15e5fde17a27d404b5c104dc32e1ce98e7f86738a9212331d79dec3dbb567e002f300b8503877c69258034849df17397ded4bce1edb7b6f51bc6e6aad1b03a33c954411d34bee200565f0c45a5be2b6c971a94316f28cbf90a6d6014c783133ed5c1516fc0c4638762caa51420ab1b435803e123adb0a7d179927b4fe401298dcfe468000874138290ff4366512262007e48002d848173e0a8adb00d0d0ccff1a0ce864429bdac1e0779eb0b1bfdb704ac5e2dd01f26bf6eb03c89567880152ed36224572f9b85f23e298465c7158e8a1a888f5a6ba831716ee662c9c0ab0a1d30a1455922f90db1ce86542b860bf3ae5078a84445b4441de5e47e55dbf632161cdd52605ebdf9b765b2e62d4b30a5b442e3660ec00e7089bb516a6d3efe91239f779d123112796a36f6844742a6a0709a075832b380049faa2e0904af1feb6ff50d482bcd449e44a4a190de608f44c081ad415421aea3b44c622dc05bc3da4dcb3ab257e63ac2169cf13624d2460fdda13bc7256e3287fb4a4b0c9ac8fdd0d1c7e141cbe6240d0698592c9c2a25a8a1510c0f87c10423f6e6bbb66e5875cf41dea3f88c81de1173bf7e9f8231879f6a9afa424e721ca4f17dcbac68124646a18e0c11a7247acfe9171e07fa5ed89d7db4c907ac22b127ccda14fb8945f787f4ea6a4c69f580a8a93796e04ecd14d7ae9516f9600ba81cd1e858c57c971064bcad9134cb2b94eaa438b8c6e8d1c5e20617f5f72154a5f44e515cd4c61bce684e38d2d58d9938a9d1a2e03c6741250282d19645adf095bc0f4fa8aa9591c51611dc3e53c02529e9f494c8a0b860dc42f24b85d7134b9ea50a72a68a0ae0bac20a8fb88192ee59c6998ce2b959bbec44805f35a419115458cc1ced294a17ba30392c61842716d16e027ba6700617b7ef8c11c23c7141d278b717d53bd922205ac3842ff070536ae0e6483611c9524d6a1239a23b84b9c198e4804dc8003f816feb6f5078ef10952aeabe5dfcba45d41f155a8cea52145458c5aa0ea4c0e05f39ff2cccb56897478ad6e5df441110490e7448cb231d9b5d5be9afb4739441b5010773b8a8578dca4483408a5f0862648c3dc2dc3e6ce97d398aeaadcab60c769ca58ccb13348cf9c3dcc9e401a408d017558ff4495c3d88d7f25aabd51205edbb4c7cd2837a2505024de3ce145426fe0d7fb45e64f402c79dbc0c4a0e0faf20009379cd4a64edcec883cbb90f3459a116f288f24b8fef6a15e14520eb9c388cf7612c0032dadc55b942837bdc080b65512daa7efa1da6d128c6ab3f0cf3475a4d2f985d25a059c591582bec0414df49b29db5e55a1f2a747483cd03fa0b2e0f5f44ee07357f413799789261bb617f2e18493cb0418c18866ebce99360b8a6375905bde93de807210c29860ae2ccb1e44a2123930f5f7ea46367a486af04d291a3e423b63481d7a87ff0393864f32c82215a0eff4054491e1171d2133b22904b0b3cd996013f0055f125491258fc96462c9a7fcf4ba01b5e8b4c5d46535807c3812ce9e9d4767b9e198f53f6efd3531cdaa6d85343b1dbead95dbadc18e517e626870bcac0f2a6d4ceec704417842ce79e4b841bb1742a10ba52aec00a80c741e3757502e182d0f7c31b8164b6b804e96a06dd5cf52a2ee3aae7563ca8eeea6c7e82f82156c29e43d692f90d159b7374f9550a48439f80565af1dbe565718fea436d4a2801112cd6ab1b27092a5b1885c959f5545abea5f07b699c2df23714e038a4acd721a2ffbb9ce7d5bfed0442ab39f6daac7c9040cace6e888e1753885591a4c48986a96682cb3917eaa75c8276cfc9d08815de897842945491cad19fd9e77157d2ec6d254f80da46c24f55e5959ca4f7d84d5c99049882115b479aa42276d13e256d03f1ec3615c87190336646c8cde1dfd7753a864e98ca3d104d8abe3a1c2735b2f35a18fd236aa5a3d5e518017ae6d94e3750b024e9f3ffffffffffffffffb73f03f57fcbaa6f2d4a59fb65da8944d5ef7a807af9a5945292292535adc8eed48146180210c7d90f0fcd04b804bb043930d8886a0511d51e5604c18129a88ee8ce2e29778a6e61cc0e3fa9593aa505912d4c26e8a8242f7ce7b4502d8ca32fcce65f88160613775626e6e9704966611a5992248bec9a51b92c4c52de0b4ab224562733164651f9203b5ea1920a2ccca9f925ff69e715263f694ef45eb35caae30a73b410bf22fc6e85717ff75450974fa974b3c294727e3f69292f5db657610cdd15a1c397aca6b62a0c9f3c4fa9b6b0cc512a0ca3b5bb247d720e9d46854157504ac8c896942a9fc2a0964d343997f2944d3685e14f3b09af914b618a562373e123c3362685419d65cd77d372e11f85a94fcb522ec93a25b4a230883613dc7cb4a130459f5b8bdba2fdbf0585c1aebbdeae4f78f9fa0993b8f112bd4b3c61b4973f5953564f693b61529742af8e494bc29c308d2cd5b7e6269c979b309ca4e414e646fda8144d186b9409da62c7bdd93261743ba5c4f48612e5524c18d743a7a0b7d2bde41206bd7d92fa5b3313479630c9c9d36739a92cfa5a09930795d6b994a026949430492a98a4353fa5982d2761cee1525a923f5b9f2449184c3ca9663929132a14099329492c415d7ee6af903028252c589e571e61bab85b26dd2d8e30ff49b29518a37fd408f305b153d9a45c7135238c5a1743fdf6d8d58b30a97cdecf29ddc3a98a30c55f117b233b7b4926c2e4f9979d4cf65c628588307adcedca265db6241dc25c42a992666135e4378449ae0acafc94a082c70b61de92a414d51f26d784307cf6a4b3a7a4648b77109f248ae59c94f43a04611272c2883ea9b33e5e47208ced96fd2cd72a3e781d803098bcdf2ddaf1f9afebf88349ca9e35397fadd25b871f8c9d46277f2fa5fae2d6d107a38a907695264ab4a475f0612d49f2a86aa3edc194dce7f4da45857cf46014f99fa7427930d9bf7fc9322b9e82d58107737a3225f907ad97628da30b1b30ca021d7730d58e651b79d28daa708d3383049fd810017f62a346c10e3b18d4cb829026d71828b83a987265b760e22bcf440a74d0a1b4faacb41d9f765dd17ecccfb5d4da310793fcd78a77d5d6bbfa8b37c1c7c7177f430ea63c3d6d82aebb78d566ad1d7130a95ffa24c90b71428dc8011280e0011e30c103d214d1018752aaa0f69682e5aab16e8d35134b8e8fddd8e90d06e9c94cb419d31adaec7083e1c28485d94ebdd0d106e3e757faeb3a134c996a78a0c6c7078ef71b5ed8c0c10683eea7afdb9e3a99710ed7603c659e35777fa4c85a6a74a8c15cea3b093725cc4aeb1d6930760e1ff9e5b26e227466c4a0030da6fc567dda2a7781a8e30c0671d2f66a5aac8b52fcbf683398925e7ed51eb598178db1d6050dc7e4c60874d05106831a71d55be9c6b4cc186b33f87b1588a1830ca6d015c5ce4c9e54aac73106e3abfa7dca0e93dae4c458cb917e4689d12106936be8242cc878d1ca6c7484c1143e946b5d8b095d79cae80083a99312daaa748fe58fe18d8e2f983aa83bc94e4ba9138cb41c1d5e306da7f4b5143bc274ca468e7619334e20828f8f62f633109251a3a30bc6ff9827ed725ce6ce1b7470c194265eb08f224abcd4b760f49c534990935544c41d5a3007937faae64d7ab2307764c1582664c74959d34fec3bb0603af973acd3a1730573561115de4411679d596173efaa32b3f4626a1645e856ee58a9c4f3245605b35a9838974fa869eb686083031f1f34b071e3860dc43be8a082f1a49ba59c7f8a9243018d16952585314fbd7fb41247a17d7b86cbd576b5c77b66d50553a1eea41721a2308d3a0b1e772c47694f284c232e94459384e7eb2008283e615263e22f25d9669e4697104f98fa724eff29492645afccf81b9d30eba7ff8a9ee54af42cb231830b183564c4c82183069c3068c895346aa93142c93000d9845a39b32d879798dc9593e4a6098367f595cb7f501bba7172c090811a8064c2303aeeb39a9c3e3d39709c19850993cef1aad6a22b077209b349258bc7ebea5cca4518104b184b12de74f2201f3f59953057b9df875c0e29614e523ac164359dbe5e9a8471cdc38d9849a1c47c499892641ba271712470f3e81e2a42050983f6399da6db7e84a9da040ff2a2234c694eca252559f600d20893b5e5b973b5a4b3fe3b4698835aa9d58f16bd362ec2ecf21fc75384c1bde4ee1d5dd2c929ba904498b4e7fbf5511fda468761314c90dc18419af127486a7861630310442c725e2f676f2b2ab3e5df5bcad28dccf77511904398a454fd418c969c32ad3b4398c2851df74e3ba410265952760a5b32e79e12c2e8e676691ea247251f3208c39a24b78d888230aa77b40ad7c1c273c80524101040e0073282fcc17aad39fd491a75e5dd00e207fca4916daf2fa40f06f90e9fda4609840f66ed183a27a5ef41f6602e13c2920a262607a207ce5c35e336cebd66ecc6e2f6bea46f06903c182f77ec4acc0bf9240f0382875665e4364d3353e5d2e99c961c2c873e3d668c85dce102103b986f3e7512aee259142da40e667f936221ceb6e3c5e960981d3b2988fb925abd39984c89ff9cf23b440ea6950bdb2a5a2a9f4a82c4c1a86b96f2587d14a15c3898df5e3e4ffdc59b4e7907903718566f4edeefa9684a47216e307fa8ad272b35f9d678006983394bf612f7923fa5b18f081036581f749e135eca5d83d9c2eac77559bb92e58d43023560ba4bd7a794dd7a1a0ca26f46e4e9a89ed92068c8cdd4d52e5cb7659a9b7b8f2ae1562f8f2067307cb4a484d99f8a0b2066305af2e416fc833cf9446530bcfeefe574e2daaa044206f3e5205b4cdef2929fc76052a37d3d1e34e3348688c1a86fd144fa6e8e12475b0348188c174dd2274c4c99bcbd0b08180caea17e57b25649dda7085a00e304902f98bf4fd07a32aff369442f205e30b9057513457b8a5a62e50b48178c557fbb26e7564f2504e142f24dac928fc5da93186bb702c81698b50ed5f373fbe1a40573ea3fa58352313c9664c1e415734c1ce963c1a8ad5d7a74ea573078aeb617136b2b98c6241d5feca29b7cb80a7ad6b8ac254d8fedb62a69491ee11e5f5d1840a8608aef31599d84a995ca14ccfb27f7eba9acea5a918251bde453a1ee954b08a3603cf1f54e8b1a14cc39ce86e5d7f9fc0483b61a0d4bca8238e190259bf006a40986535fb2bd6f564ff01c01c2049310a74b7f76ef7cae41966092847e3dcb7de97fa64194600a276246f498902498f357f07827c9a6764a4830dc8efb7c1c1dc1a46f525c6f7c50af18c1681e522d8c2839e73015c1ac323a071b5de28d4430c6a8efba8e52fddd0fc1a4334fceddf5d5878560d6b41f5df766bf571204733c11da843a6942f44030dce5ccadccca6ee90f4cabfe73153bf829a1fbc0a0fae4fc7b1c417a6032e5f317e6043de141101e98f483099526277377116407e6135bffdbc4835b164174b085322d2457588a2f240c7a544a3f25a5f826fadd230c32dba6041d3d098f9f3b47183bd48e59ec85b7cbdf35c29c66a14a08b1aa2bea648471d6d3c7b8694982c7298216c028416411f6918a30e60915c6fadff4f2788930e8d2654ab55cbc31f1106110f5112754ecc509fd0e611ccf155bdf4bcf8c8d6708c3de98dcc9e3df8a2ac12b847d1c218ca95eb93e6f26e860d4b05103060e19798330a7e55714154d9b247f2708535ebe6a575341977681305c05f7dd5ddf8ff7f10061f450529592e28df707ada2c9d85a18eb92d7f2d1f220c3cea43cbd88f8c124f65ef9e4545e0921d207939c75a73b07cf41590731c207f3872bb9b2f3af88e8ecc1ec3958aa2486a6589c64b089e8c1f871645ec9e1e46f74711f88e46105113c984b09233c58524a8d6877309d9af1f8bab61d0c16f43e3c7e3ccb35eb60d47093dc47ae5abaa509113a98c2fdd44627c152d49f83c1b35b44e97c729768cbc13ca7bd7979b471307cbffd9d56090783d27fae960455e40dba99c6c9aaccaadd89697625bfb05a8288ac98081137183eccd6e4bade30e9b7c13ed4236c30fb5cb2de9392246889770d26a992f8ff257f35184f4a4196ca2db5a1b3481a70537331ad1173bbcdd4226830a75cd62d9e44cf60de123cc4a2b7d696680693e5186fa6bd8a94c1f0e5a9e488d08efd6c840c863d1d4a9d9cd25fc25286c818cc77d2ec86b84a5391188c716a6a746cf912ec240ca66f533a844a3a184cda757445498b279e141c44be601262d55277f75c561bf182f1938a1e23c7bede928b23d20573565f532709251be18249f0cd107b674ae7186dc164e1d2d55aceab33fb225a30c9916ac95b4fad11c982e943c4e849b288b9e41f0cbb1944b060d0b94a6c4e52929a14bec815cceba574112b186458f83119179b1ec58b54a1a895c62abaa6855669c5c837f5aba7741ca182f14a6b9e78934fafda8c84c8144c616e372ec7ab52521129984e38c9e4b55c6d498723513025db4cd1fc52d2348582293b33a4f607234f30c75fe7ac56da7dd50f224e30d8dde97dd2a5ebecdc4813cceff1536787fa2b3339c204f3979da57d2e3df1cc8c2ca1a08812cc27c529a1a624c9e45125c1543bcae37dd43d331d120ca2845162a5ab8cc8110c777bf9835b122fa5ce8c88114ce2478449561f2d0731094cc0813343a408c68b9e2ce90f675174878508118c15547928c1b38b0cc1b42588144fdb7b4acc63ac71062242309678267e4a90be732119448260d2bb24a876b2731c9731830f87a5200204b355763dab4a4fe407262578ac94fde492ff5368d8b8e101ec42c407873d3d33f28332d20363a509b1bd4a4a4e1131c20393a835153f5fae0d4476601c15948ae835233a30fa9a5842d456bcf8d9480e4c9b66629fa0dd54504f0407a67613d7e4246af49a30e4162679af976e517c456683d8a24fa9e40ba416661deb4fdbb67f75265a98b4099e539263eac50e4166611eebedd1c93b76d09185c184d3e7c1d2f4e5edb1309f1c42092c4cd2df099e2fe7786a9757982de6e514eee49b38b97585e59e844af1f25e32af1587adb7dc578a6bb1d41631bbf7c9533065b1c27c15c6c6528696d3294280acc25469ea24f171559893ecdb7925e8a4c27c79a93ea26254dc953a94f6fd8b0590539853de2e29a72bbfff92290c4a3b49295ee3545fb414e6edec766d12489b80d904eeea1c90f6204e5527020ea8c18c1c31b890516302f5b1fa6110f01c38bcb8518000d4004d400100c881c30b13102000cfc5f1828b1a6706020480e3460252d081057800878c2e8e0202d00900e0c0813e08208093e3241f0508c0c971121b373e0e008001342001375e067e72e080016301000800030e60ac38f3ae0e33c6f299176734fe068c2f64243092b7818c19a72d470d1925f01804cac87123068e19306024c04310080306023c0251832e008132727c2123f9431734dc0f07f0e803cac891d8a0e1050c1809f0e083c98288f07e17f5b1d53d98564e70b7d01e3d1894f7869d7dec2a59a3f134563df26070d191db26d8a8b9ba701a4f43693c0dc45143468e1b3f434617346c787ae021c7e3a0f1340ce07107949163460c1c07068c0478d8c1246fdea64927874cd73dea6014b1944fba5eedac241e7430b8575f5abf246b29f939986329f1e24b28d93eb57230bf9a5d3ce250b2f1b42b79391e70306ae824cfda492de9471e6f309594462b08932495f2a181ebe10653e78fbba35715450563ac212f7058063cda80ce1f3f28398c5b540627078c19e7ac051e6c3088180ffb1baa3af529cd630d2639fba34b928331d6b6021e6a30a5b4bd26a898ee114a7028073cd2601245674d13c4ffa90e3f3e7008c1030dc597b53c6562a7dce30c36f030c395c13ec870ad6338317018ce030c7785ca655dba979d6dede85c5249269e7eabc4587b191c14d8f0f88251dd4efd72b78c32255e308a5b8fb78f55504914048f2e983e69f66abff8bb29f1e0824909a567743479fc6b6381c7168c27d2b2456f71cb51d5c2a2f55931bd6b564ff9e88d7713c4ee910583fcc99eaaf5ddb88e0716ccf771b2f33dbf9a24ee1c785ce1f0496a1d932b556e8542456bd3d2c557c5d57ca69ee5ad932f7854c1709d836ba79e50c19c644b313b94b833e314cc6fd2aeabaff86875a460ae5c9e4b7c1ad1ec2b0a663df973c8311f0a264bbf21272ea5028f2798e4b6ff441de17db99fe539c160ba72580a7fbf2709c9e0d104f37712af24ef4f15ecf66082f1c45db00ab3aa173d5d82c7128c1e6c54c7657dbe42237828c1e44149426e554efc94f548027a2001cf051e4730ddb8c7f44fb2af24b111ec051e45307eb59ddca3abe7e2c687e0e3e3091e44c8537fceccd7368d57e03104cf3aad644ba8fa3709a1ac8e97042541e8eaea2e6d78a5d02d3deba673cea13ce50184f5f881f94c4527a54e849b8b1e3ee8bcded2b344343f8e89631d4f4f25c6dad7b81998ee82867bf4c0245a177e540e83c18307e6d6d172ddf7bb73238f1dd8470d0f1d182d2e659b8c8d12d6f7c8817d78e0c03ef416678bfba8458416c6f22c263dcb9da4adcec2a07562da63c57afa5316f64123120b8585e1444f1b162fa556669157d8872becc3059156184e4c344c0e79841595588a5517ab2dd69cd2b3e079b7fe22b20a93877b497aeb8ca8c2d4df5ff949d653bb4b85f1c47ff5e92b820ab327134b6d07a15318b44e304b734fc414e6d1b72555e543f4f752182c9a3e53fa7d3f6c8c90c270f22de5a024c1844ba25198c24d4c2a21e74fb89f43c6f920220a83054b424789d4930453241486ad115baac2fddda423a0309e1aa5199653d9c51df984e9b3f7e32c684f26ab114f184f734476344148ff3fd20963bc55b9ea251d3bfa08274c2572a71df224d32a463661ce525efaa944e3eb8a68c2a04cd6df7811213f7432616e9354b4362915c18449f420972f27a14b20b48c1425689f6ec83824f8f8d044c4128995306585eb2476f696f88f12264177f6abe724b953bb9b84e104a5255c5787f5b8ee24613853274c3bf64e30ed2e1266ff589df428854aa853b75196c32808821808422086e56b920e8313503070401a8dc5e271891ee9fa1300418ae2e07030128d03e260481c08410cc5300c82200cc5200cc2300c637005d979bc62f63130b36589ba7ce7d9e5d1ffea47b4f9655e35ec945bab29af3e23582b974ffd70e05fedb2f3ab5a225fb162270aa868e2bd37c31c2663ce99616128361c10c6189d2c9370d89adec83512183e68126746eb68fb7ab4fc3dd619fc36c34b9af84f34e5c6cd4490ef0b0d8d962b530608cc16214b72459ae77cb9690d418b3d870919ac409a28199d9720a235191a58dba83f9f2814a7c9d460f19783e83e2b47e7ee75481c3a29ae359d27f4b108ead259242f3342155c8f4482da07897c9acf2540d73f748c109a440bb18b4f717de41812994799adfdc8571e7a9805ccab9d0c9a604511c0fdade1c95c583460d4fdf1b3d1f5cbd96a79686106babbaa2bd0f9cf706cf1db7a5165a52454a1d4447e8b82c6f816636e9328dba0cdee2f3e8722b7e62201b611b10e85a597eaf3a9d1cd36558b5fb84c70f68b38ba942b49f3549c6d58a16987a247bd7894ad1b29c3e12ac290baaf36dafc3fa79992f4421ab7c4cbee943ca64cc3af2e11c46aab63a5ee6988ace3f7eef0faa488c7c54d1debfa0f67776d11c8612f93b296d9cdf1132d9c1a0d733dfdabbd34ec0389553de28ed226bf53312ec50da6c6ae8823fa6ae1077f8bf3004658bae8a612404f33b1ca3f4c6d09d316252c3647101c3ee0f340a30945dd1a1fc8210ce8f7bbbebd23e01b60dd28f9e0eaccb0f072fb86561074ae4d73012a1cf81309b85d963591bbf0a274f40032fc270debd1d4eacfcd79528074251a0cd7173a53353b2bcd9e2a2128ffc4881001ed63ca6efb01b90ea5553e0031de199944c3492af3719a43026b5e368fa41d96daa1b22b493f722fb5247f09c930862f32d68e16c56136352b88da9196e46642207117e23ae64b48cbe1155c8b8ade35785ffae8b5707524cc19ec4c915f4ca13499fd526c93d2d342f832563717446e8979742c6b9911d6367a8eedd650d746167f409f2ec120945b1dad143da00af9b0437c00cba6140347c088cac92549894713fbd4ec03447e7dade80ab7a366242a71f4c27b826c3bf6412cd4d62f44fe1a9f142cb3df33358ad016ff86f3730885f12c108f6f0ffb769a2ea424e68ea41ecc8093fa76d880e81f0c240f551762285318bfd3b7836ecafdea967cbfe0bfd07a83293610602a056e0325df26732b78e44071415cb607a1109d3f336317c911e77cb475cc5712c75277430b6261843acb318c4150a8bb49c3e4b8018b791175ccc7d3d03595aa33028bd7af6af67e3b1d2713d1b3a56217e0e287ccec3f24031591178dc550848a1163e17781dc7186303b7654f184e4aa8de1aeec7f4b2f84c7b006149ca47ced69b453aee3c35d91d493f792e84277f872811c000e61df99834b9e0f6759468b2417e4ac1d52cccb9f596ea12b7cb9c0b7bb872a023a21434e2896f80a3b33f4fe1e8b40f03b0e7c20fb8cf64e32b32fab86b4cfd18c7426e65f3c139ea0a15191ab53df5ff07912530e052635f6b0d0308a1bd2f824c775096dd5905f506ca115a155807829cd8b7f5f66fc44c44b221308b1c8613534615acafad3d6631dc34cc9fc4a2086cfa2ba232e40732a4ec93fce6d1e0254078f22f2fa74a62cfaa69b13aefdc2fd0a4e9e2d2077d03ed255644f2ec34fbba5f0efc96502d2b6bf464833479a9fdefbb8c4ece33e20352e8710b667ef796e1fff5b8177278eb97c487c26ec80084a0381f3ba2c4a505ca52c56622b4230c2f54381107046f82993d725428c70d5799c44f5167b3b319a5a5f5e45be28fd574540e46878e433a6ca1021481e7e03275bacf10d0ae107a8058c408aa2f4ab58caafb1961880f794a7feb5bcb59931fdd16c4b6b612093b3993f0b41c1d4a2b175d9cb4aa568534065fe604fa673b61bea5622ab76ce0334e77c870a026a7d74eff068fff6b7d3ca28c462d69c665114f1c78abf040df6e4cef31bcee4e4bb9c62961e4b2a70b592acb5d152a26c9bab4e1168cb27fde9c174e9853fbc11a92bfdcfedd69b004b6fab98f70b397438080bcc61db579a24ff529af59c64735ec483cdf9cb304a5562910303b3226a71df9ff171369c1c6b0e110a7c9fe52a7c4909340aa065e1b96e21fa661c51c6e4464044a1b202756f2adc2bb366612925ca81d857a2e7a72ef57f72a7e5144ef4019d17eee8d98c0b5df9e75cef1db150720f755ecf95ea614b4bd2fa6262406ec2283314730081c43bd3a982b4c5fe03b5a205d41e8e0520127cb650df57e75725a9f12af4645f1f3f2def1571153997f8858cc67890a5fa3d0be27f15444984a1a6090e5c81f89083ccefce6356253eb3c675157faa8ccc1696cf0b2d52816d3568f0dfd8f5edc39f4afe85259e10129d3c86edacab29cf52a5c40f9c417a80c7c45782737bcc8b2e4524deb942c328035b52a22840cc104fa33fc2a0e9d4f1104df37d483a30a7dae084d405f424f7ac98b2dfbe00fba44bd0496e05f88ffc4519b28a3b7c7531c928d7a104357098b80f249f454b6426c2b291084a7fe1d2898f7edfc988684b098b8cdf473467a8adcf4ca7f279946c302238ddb39585d64aee16ccf01d34d52cfa30b3ea19c82295dd17b790d64ecd54b88300e7380b756d1c1dddec34175f91cce3c861a6a804941f2b4c8e1e123211dec5c105ad05cae072402ce47debb0969b7338a9593995990bdf2c56438241cb4d5719074096461cf2c02b6e9eb71502ea9378becd5f11b8fa4bf0b31306784665f13f69391be27e12062f1a0ab4e621791ebc9bb5f95763d1dfb940053910a9c51e792dc1bc71190ca7286ab62045d90449a4601286ff5391c076e8290bd93631e52618b641e0599ba6e9507cc5777b72fbe0c4889a1495758a33d0ce825294a36aca2c4493b2d1e510132480f4b2c21221e1a545f87e3f2aad3608d59f554c9713bf74e9cd2857bf4f0ef5121ffe7d8e34f5c0765139745447d23822236329d9dcbc3e313d522e612946a4ab0d65b5c81a3ea1188d6b61dde1da56d69203eb7d95dca060d02dd6ab89e336a984bef70176c5302f4b007f50982a7a37ff800d753b25674c14fe514f116847504991189561bc39425d2de0a353a43381211bcd401182508d64d5e99aa8cdb1960788ce4e73ea04e0d34cae4f904278436926015f1efda4fb6a4a6b7f24c6ccddecec9cb53eddf8adc55fb51f38a84fedfbfd402d241ed383e097338465cc006f9b8c2c54b83b5fb11e2ebc0fdbb6bca99dc3514a489bfea47b95a96dccae4532096855db5cfa9ba136cae012a03c74205446b79eb7bad806452a9a317fdd9e1c49ae80f7412241c6d2dfe5b05983808e511455ec09de62dbd40a957cf8062935b30013698af69884e1d6aea6b6b40325bdaaba115bd538301c7c67f19f2c79b05e1f265399aaf61e3dc2dcc106df34032dd935c2d3a44603779f8973bf1b08a0e1172420c532ec1e8e2a4997ec2ef58559c8391d837eedc5e1833e96be19c061cfa7975f27976df4dc4adc315e2c8455910e8752a6b0df326b0e51d4be038d0f808f53ba94fd3b5d7fb31d7fe5c1fa4cd08e68451d436497b12a34e2f08bb7191c7607a64871e03b70c11f4f95d6b2ae163d36d2edf20bfa14f19a3dc97e7d7f421a41b7083da1ed9ed973019202d6a3df08062e41100202578d21dbd233641079513bb2c1114ddb88eecccf278965965f11bf4292ca1bd89b68cb1096b11ea23d828c5226c54b2ac7b1dcad418c6e8e5dc0f8a66caaaa3020617f6cb970be5ad79723acb3e94c29a9e083745843c0c433374a610837bfb287c7e81f71092f85de62da004e7df15187f3dfe9170ba10f1d6368936e025758672b32f6e6f63aceb840bea38c14224b12b98ade25d6ce5a2a7dc4d7a9cdf15059682ea533112449b1ddf639b7c7ad38798e3029d1f85e8246b82f117fe920160938909ab37221eb4f221cc5d61dc85065dacb58970948602ee62d8d67b1568e90a882d8f302bb492d9e8d6f356255e938b9ee3b3b2690cb4a2fc684a85908520b6380459343d4bb13bd515d13713dc6d8620e230369694e03b945a01258811292adc93093fd5c9ce59e7bc2340d1850f46998ed94fa687d75dfb717e4b615ec8768e1ac8567dd566d87a3a60f401cc5dbd906ea176ce7663c050d0504d87ec4351f051414d51485b7a784dd251fc54ec61065b76a129ddbd725a465a4670b40b4bdae02b6207a49950094812e368cec46b1007e34ab8d25a957cda15e9a01c9740174c2252ab0c9fee3cc8ef5a63ab75e66f4c92582d6e045d3cd05b40084cab04435ba291a1798b49d53ca7bcff080ef3b72e0d0482795af2d5fcd75190d9f2a95f39e05592188011008bd8627b6fa2437d943024da2629f674a1453dbe14020fbf2c7776136dd083178a070459c198d58b3294c3312138d375657fc22e9e1f0ce3840f64d402c0e694381eb95901d33cb95a2670323761d7d94472360752625fb59167ef1236b07115464bc86cdc625e165b1c42665386302019c3d333d8ee701b3fbb382902ef6194c3629919599efa64016aeb24ff80be1cba9450e7cbd5ed909a2d50e83db096a94ce681a3954073e5a0649b7ad3e04eed4be2995516f199008ebe36ba6e45444061fb10084521211aeee0de2647a839c64739802987538a9e7c8c454a85d3b67c0a648f36700a81b5de56254b35e44bf95c19ca62017b2355c029e1d4eaa6524139e32ac8f6d02987d3331ce73d4401bc672686e31ad570f36c5c8bf611042c503690e31d14c4bc1193115f6d003daa0bc29ba08099bf21548124adc09d5ab4b7d8c7a0010155eb6ca7f75ef2950154da89680404e50084d806c45d63891aa6ce3412ff96eeb9336ca17d0d6f350f925f91bb262730b3255a91f3ab6235b124a42ab81e3ecd1e2efefd3163cf2798874b3dbe0fc7f898bd9c9a3ab9494bf8214c0cc6f90a339a43fa8c8cbf8310b0ccabc66323a5e8d9b3838663282b27df5ac041f764323d4b5fa8a5cf9e6027fe1f85d11b20c4a8bfda294453132a311026c49861a20c9d31abeb2b2a8538580f522820e86195d7aa7acc39213c42a1d64acbab3146e22b9f4f476898b18647dd9529243c95edbb07e1a695f73a9df83ef16772109a26a38fadd619d4a6a0c0f0932500e9d868a481c061f0765dc3919ab40b6d274b8ed680d93261225397dbfccfa33ab1aa60bc1fec8acb6b0d54af50632da13523e378cdc0838d282e6a2fbb091ccf009a8ff16136de1945afcba4b97455f8c3b28b1eac3ec6558d0ba13fa978598b01241ab0df3a92741c56e16b495080fba5ab33b2eea3d18fcab3cf8eaf7284a6fa7e005afceb79bd5f6edca8c1600c3687d6e2f9b801007b6be708055e1a941c3edc5c97755b8bf97e46489da9033c9217e20395d3c788ff57308cea45a11ed8ce4222a7641c1f5da012d892fb6009020606bc3a4b89552b6bd6263a724e398b49e31389445f4aeb814", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x10b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", + "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x10b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", + "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x52bc71c1eca5353749542dfdf0af97bf764f9c2f44e860cd485f1cd86400f649", + "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0x88fbb13c02428a6ba0e3c362f503d78c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x9ba1b78972885c5d3fc221d6771e8ba20f4cf0917788d791142ff6c1f216e7b3": "0x01", + "0x9ba1b78972885c5d3fc221d6771e8ba24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000100000000000000000", + "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3401bcd1e9f3885b9b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34": "0xb0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb381d03c816fe51e89926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227": "0x926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3ae9e7a6969af6726a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20": "0xa8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d6668b8260aeead3b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575": "0xb8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575", + "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500952b0337fcbf1d46175726180926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227": "0x926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195017c489719c28aa986175726180a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20": "0xa8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195026ed82a0e5bfb6c76175726180b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34": "0xb0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502ac2136394fc85866175726180b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575": "0xb8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x10b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x10b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", + "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", + "0xe81713b6b40972bbcd298d67597a495f0f4cf0917788d791142ff6c1f216e7b3": "0x01", + "0xe81713b6b40972bbcd298d67597a495f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xf7327be699d4ca1e710c5cb7cfa19d3c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + }, + "childrenDefault": {} + } + } +} \ No newline at end of file diff --git a/polkadot-parachain/src/chain_spec/bridge_hubs.rs b/polkadot-parachain/src/chain_spec/bridge_hubs.rs index f3c6dd1a989..ab3e44220cc 100644 --- a/polkadot-parachain/src/chain_spec/bridge_hubs.rs +++ b/polkadot-parachain/src/chain_spec/bridge_hubs.rs @@ -130,13 +130,10 @@ impl BridgeHubRuntimeType { Ok(Box::new(westend::BridgeHubChainSpec::from_json_bytes( &include_bytes!("../../../parachains/chain-specs/bridge-hub-westend.json")[..], )?)), - BridgeHubRuntimeType::Rococo => Ok(Box::new(rococo::live_config( - rococo::BRIDGE_HUB_ROCOCO, - "Rococo BridgeHub", - "rococo", - ParaId::new(1013), - |_| (), - ))), + BridgeHubRuntimeType::Rococo => + Ok(Box::new(rococo::BridgeHubChainSpec::from_json_bytes( + &include_bytes!("../../../parachains/chain-specs/bridge-hub-rococo.json")[..], + )?)), BridgeHubRuntimeType::RococoLocal => Ok(Box::new(rococo::local_config( rococo::BRIDGE_HUB_ROCOCO_LOCAL, "Rococo BridgeHub Local", @@ -151,12 +148,10 @@ impl BridgeHubRuntimeType { ParaId::new(1013), |_| (), ))), - BridgeHubRuntimeType::Wococo => Ok(Box::new(wococo::live_config( - wococo::BRIDGE_HUB_WOCOCO, - "Wococo BridgeHub", - "wococo", - ParaId::new(1014), - ))), + BridgeHubRuntimeType::Wococo => + Ok(Box::new(wococo::BridgeHubChainSpec::from_json_bytes( + &include_bytes!("../../../parachains/chain-specs/bridge-hub-wococo.json")[..], + )?)), BridgeHubRuntimeType::WococoLocal => Ok(Box::new(wococo::local_config( wococo::BRIDGE_HUB_WOCOCO_LOCAL, "Wococo BridgeHub Local", @@ -222,65 +217,6 @@ pub mod rococo { pub type RuntimeApi = bridge_hub_rococo_runtime::RuntimeApi; - pub fn live_config( - id: &str, - chain_name: &str, - relay_chain: &str, - para_id: ParaId, - modify_props: ModifyProperties, - ) -> BridgeHubChainSpec { - // Rococo defaults - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 42.into()); - properties.insert("tokenSymbol".into(), "ROC".into()); - properties.insert("tokenDecimals".into(), 12.into()); - modify_props(&mut properties); - - BridgeHubChainSpec::from_genesis( - // Name - chain_name, - // ID - super::ensure_id(id).expect("invalid id"), - ChainType::Live, - move || { - genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), - ), - ], - 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"), - ], - para_id, - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: relay_chain.to_string(), para_id: para_id.into() }, - ) - } - pub fn local_config( id: &str, chain_name: &str, @@ -403,17 +339,6 @@ pub mod wococo { properties.insert("tokenSymbol".into(), "WOOK".into()); }) } - - pub fn live_config( - id: &str, - chain_name: &str, - relay_chain: &str, - para_id: ParaId, - ) -> BridgeHubChainSpec { - rococo::live_config(id, chain_name, relay_chain, para_id, |properties| { - properties.insert("tokenSymbol".into(), "WOOK".into()); - }) - } } /// Sub-module for Kusama setup From cf4a6efbbd1a9f241ca9676ec3e3f1f52a0b4a77 Mon Sep 17 00:00:00 2001 From: Keith Yeung Date: Thu, 27 Apr 2023 18:48:22 +0800 Subject: [PATCH 148/339] Companion for paritytech/polkadot#7098 (#2469) * Companion for paritytech/polkadot#7098 * Fixes * Add missing benchmarked function * Fix typo * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 514 +++++++++--------- parachain-template/runtime/src/xcm_config.rs | 18 +- parachains/common/src/xcm_config.rs | 13 +- .../statemine/src/weights/pallet_xcm.rs | 9 + .../statemint/src/weights/pallet_xcm.rs | 9 + .../assets/westmint/src/weights/pallet_xcm.rs | 9 + .../src/weights/pallet_xcm.rs | 9 + .../src/weights/pallet_xcm.rs | 9 + .../src/weights/pallet_xcm.rs | 9 + .../src/weights/pallet_xcm.rs | 9 + 10 files changed, 337 insertions(+), 271 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6f37a2c3bcf..930a6969c8a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -584,7 +584,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "hash-db", "log", @@ -3456,7 +3456,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", ] @@ -3479,7 +3479,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-support-procedural", @@ -3504,7 +3504,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3551,7 +3551,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3562,7 +3562,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3579,7 +3579,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -3608,7 +3608,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-recursion", "futures", @@ -3626,7 +3626,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "bitflags", "environmental", @@ -3659,7 +3659,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "Inflector", "cfg-expr", @@ -3675,7 +3675,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3687,7 +3687,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "proc-macro2", "quote", @@ -3697,7 +3697,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "log", @@ -3715,7 +3715,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -3730,7 +3730,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "sp-api", @@ -3739,7 +3739,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "parity-scale-codec", @@ -4726,7 +4726,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bitvec", "frame-benchmarking", @@ -4824,7 +4824,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "frame-support", "polkadot-primitives", @@ -5678,7 +5678,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "futures", "log", @@ -5697,7 +5697,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "anyhow", "jsonrpsee", @@ -6196,7 +6196,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6235,7 +6235,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6250,7 +6250,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -6282,7 +6282,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -6296,7 +6296,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6320,7 +6320,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6340,7 +6340,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6355,7 +6355,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -6374,7 +6374,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6398,7 +6398,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6416,7 +6416,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6477,7 +6477,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "bitflags", "environmental", @@ -6507,7 +6507,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "bitflags", "parity-scale-codec", @@ -6520,7 +6520,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "proc-macro2", "quote", @@ -6530,7 +6530,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6547,7 +6547,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6565,7 +6565,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6588,7 +6588,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6601,7 +6601,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6619,7 +6619,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6637,7 +6637,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6660,7 +6660,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6676,7 +6676,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6696,7 +6696,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6713,7 +6713,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -6727,7 +6727,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6744,7 +6744,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6761,7 +6761,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6777,7 +6777,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6795,7 +6795,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "pallet-nfts", @@ -6806,7 +6806,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6822,7 +6822,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -6839,7 +6839,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6859,7 +6859,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6870,7 +6870,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -6887,7 +6887,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6911,7 +6911,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6928,7 +6928,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6943,7 +6943,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6961,7 +6961,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -6976,7 +6976,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6995,7 +6995,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -7012,7 +7012,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -7033,7 +7033,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -7049,7 +7049,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -7063,7 +7063,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7086,7 +7086,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7097,7 +7097,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "log", "sp-arithmetic", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "sp-api", @@ -7115,7 +7115,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -7132,7 +7132,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -7161,7 +7161,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -7179,7 +7179,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-support", "frame-system", @@ -7214,7 +7214,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7230,7 +7230,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7242,7 +7242,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -7259,7 +7259,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -7274,7 +7274,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -7290,7 +7290,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -7305,7 +7305,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-benchmarking", "frame-support", @@ -7320,7 +7320,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7341,7 +7341,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "frame-benchmarking", "frame-support", @@ -7890,7 +7890,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "futures", "polkadot-node-jaeger", @@ -7906,7 +7906,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7920,7 +7920,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "derive_more", "fatality", @@ -7943,7 +7943,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "fatality", "futures", @@ -7964,7 +7964,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "clap 4.2.3", "frame-benchmarking-cli", @@ -7993,7 +7993,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "async-trait", "frame-benchmarking", @@ -8036,7 +8036,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "always-assert", "bitvec", @@ -8058,7 +8058,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "parity-scale-codec", "scale-info", @@ -8070,7 +8070,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "derive_more", "fatality", @@ -8095,7 +8095,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8109,7 +8109,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "futures", "futures-timer", @@ -8129,7 +8129,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "always-assert", "async-trait", @@ -8152,7 +8152,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "futures", "parity-scale-codec", @@ -8170,7 +8170,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bitvec", "derive_more", @@ -8199,7 +8199,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bitvec", "futures", @@ -8220,7 +8220,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bitvec", "fatality", @@ -8239,7 +8239,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8254,7 +8254,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "async-trait", "futures", @@ -8274,7 +8274,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "futures", "polkadot-node-metrics", @@ -8289,7 +8289,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "futures", "futures-timer", @@ -8306,7 +8306,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "fatality", "futures", @@ -8325,7 +8325,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "async-trait", "futures", @@ -8342,7 +8342,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bitvec", "fatality", @@ -8360,7 +8360,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "always-assert", "futures", @@ -8387,7 +8387,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "futures", "polkadot-node-primitives", @@ -8403,7 +8403,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "assert_matches", "cpu-time", @@ -8432,7 +8432,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "futures", "lru 0.9.0", @@ -8447,7 +8447,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "lazy_static", "log", @@ -8465,7 +8465,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bs58", "futures", @@ -8484,7 +8484,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "async-trait", "derive_more", @@ -8506,7 +8506,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bounded-vec", "futures", @@ -8528,7 +8528,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8538,7 +8538,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "async-trait", "futures", @@ -8556,7 +8556,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "async-trait", "derive_more", @@ -8579,7 +8579,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "async-trait", "derive_more", @@ -8612,7 +8612,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "async-trait", "futures", @@ -8635,7 +8635,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bounded-collections", "derive_more", @@ -8733,7 +8733,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8751,7 +8751,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -8777,7 +8777,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8809,7 +8809,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bitvec", "frame-benchmarking", @@ -8903,7 +8903,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bitvec", "frame-benchmarking", @@ -8949,7 +8949,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "frame-support", "polkadot-primitives", @@ -8963,7 +8963,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bs58", "parity-scale-codec", @@ -8975,7 +8975,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bitflags", "bitvec", @@ -9019,7 +9019,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9129,7 +9129,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9150,7 +9150,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9160,7 +9160,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9185,7 +9185,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9246,7 +9246,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "frame-benchmarking", "frame-system", @@ -10002,7 +10002,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10088,7 +10088,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "frame-support", "polkadot-primitives", @@ -10335,7 +10335,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "log", "sp-core", @@ -10346,7 +10346,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "futures", @@ -10374,7 +10374,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "futures", "futures-timer", @@ -10397,7 +10397,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10412,7 +10412,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10431,7 +10431,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10442,7 +10442,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10482,7 +10482,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "fnv", "futures", @@ -10508,7 +10508,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "hash-db", "kvdb", @@ -10534,7 +10534,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "futures", @@ -10559,7 +10559,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "futures", @@ -10588,7 +10588,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "fork-tree", @@ -10624,7 +10624,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "futures", "jsonrpsee", @@ -10646,7 +10646,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10681,7 +10681,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "futures", "jsonrpsee", @@ -10700,7 +10700,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10713,7 +10713,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10753,7 +10753,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "finality-grandpa", "futures", @@ -10773,7 +10773,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "futures", @@ -10796,7 +10796,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10820,7 +10820,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10833,7 +10833,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "log", "sc-allocator", @@ -10846,7 +10846,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "anyhow", "cfg-if", @@ -10864,7 +10864,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "ansi_term", "futures", @@ -10880,7 +10880,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10895,7 +10895,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10940,7 +10940,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "cid", "futures", @@ -10960,7 +10960,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10988,7 +10988,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "ahash 0.8.2", "futures", @@ -11007,7 +11007,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11029,7 +11029,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11063,7 +11063,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11083,7 +11083,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11114,7 +11114,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "futures", "libp2p", @@ -11127,7 +11127,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11136,7 +11136,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "futures", "jsonrpsee", @@ -11166,7 +11166,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11185,7 +11185,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "http", "jsonrpsee", @@ -11200,7 +11200,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11226,7 +11226,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "directories", @@ -11292,7 +11292,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "log", "parity-scale-codec", @@ -11303,7 +11303,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "clap 4.2.3", "fs4", @@ -11319,7 +11319,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11338,7 +11338,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "futures", "libc", @@ -11357,7 +11357,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "chrono", "futures", @@ -11376,7 +11376,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "ansi_term", "atty", @@ -11407,7 +11407,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11418,7 +11418,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "futures", @@ -11445,7 +11445,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "futures", @@ -11459,7 +11459,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-channel", "futures", @@ -11940,7 +11940,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "enumn", "parity-scale-codec", @@ -12017,7 +12017,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "hash-db", "log", @@ -12037,7 +12037,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "Inflector", "blake2", @@ -12051,7 +12051,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "scale-info", @@ -12064,7 +12064,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "integer-sqrt", "num-traits", @@ -12078,7 +12078,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "scale-info", @@ -12091,7 +12091,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "sp-api", @@ -12103,7 +12103,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "futures", "log", @@ -12121,7 +12121,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "futures", @@ -12136,7 +12136,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "parity-scale-codec", @@ -12154,7 +12154,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "parity-scale-codec", @@ -12175,7 +12175,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12194,7 +12194,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "finality-grandpa", "log", @@ -12212,7 +12212,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "scale-info", @@ -12224,7 +12224,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12268,7 +12268,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "blake2b_simd", "byteorder", @@ -12282,7 +12282,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "proc-macro2", "quote", @@ -12293,7 +12293,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12302,7 +12302,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "proc-macro2", "quote", @@ -12312,7 +12312,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "environmental", "parity-scale-codec", @@ -12323,7 +12323,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12338,7 +12338,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "bytes", "ed25519", @@ -12364,7 +12364,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "lazy_static", "sp-core", @@ -12375,7 +12375,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "futures", "parity-scale-codec", @@ -12389,7 +12389,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12398,7 +12398,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12409,7 +12409,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12427,7 +12427,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "scale-info", @@ -12441,7 +12441,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "sp-api", "sp-core", @@ -12451,7 +12451,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "backtrace", "lazy_static", @@ -12461,7 +12461,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "rustc-hash", "serde", @@ -12471,7 +12471,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "either", "hash256-std-hasher", @@ -12493,7 +12493,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12511,7 +12511,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "Inflector", "proc-macro-crate", @@ -12523,7 +12523,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#471b49b09fd0d2a3057090ab0720f4e39faed5c5" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "serde", "serde_json", @@ -12532,7 +12532,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "scale-info", @@ -12546,7 +12546,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "scale-info", @@ -12558,7 +12558,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "hash-db", "log", @@ -12578,12 +12578,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12596,7 +12596,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "futures-timer", @@ -12611,7 +12611,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "sp-std", @@ -12623,7 +12623,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "sp-api", "sp-runtime", @@ -12632,7 +12632,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "log", @@ -12648,7 +12648,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12671,7 +12671,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12688,7 +12688,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12699,7 +12699,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12713,7 +12713,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "parity-scale-codec", "scale-info", @@ -13037,7 +13037,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "platforms 2.0.0", ] @@ -13045,7 +13045,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13064,7 +13064,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "hyper", "log", @@ -13076,7 +13076,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "jsonrpsee", @@ -13089,7 +13089,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "jsonrpsee", "log", @@ -13108,7 +13108,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13134,7 +13134,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13144,7 +13144,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13155,7 +13155,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "ansi_term", "build-helper", @@ -13282,7 +13282,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "frame-support", "polkadot-primitives", @@ -13659,7 +13659,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13670,7 +13670,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -13800,7 +13800,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#7ddfdfbdfab482866a9909ad4927dc2c9b77f8e2" +source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" dependencies = [ "async-trait", "clap 4.2.3", @@ -14734,7 +14734,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bitvec", "frame-benchmarking", @@ -14826,7 +14826,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "frame-support", "polkadot-primitives", @@ -15328,7 +15328,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "bounded-collections", "derivative", @@ -15344,7 +15344,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "frame-support", "frame-system", @@ -15365,7 +15365,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "environmental", "frame-benchmarking", @@ -15385,7 +15385,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#254c521db67ab9562eb2b0463cb2091211dde07c" +source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachain-template/runtime/src/xcm_config.rs b/parachain-template/runtime/src/xcm_config.rs index b82be7aebf0..bd395c83d38 100644 --- a/parachain-template/runtime/src/xcm_config.rs +++ b/parachain-template/runtime/src/xcm_config.rs @@ -5,20 +5,20 @@ use super::{ use core::{marker::PhantomData, ops::ControlFlow}; use frame_support::{ log, match_types, parameter_types, - traits::{ConstU32, Everything, Nothing}, + traits::{ConstU32, Everything, Nothing, ProcessMessageError}, weights::Weight, }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; use polkadot_parachain::primitives::Sibling; use polkadot_runtime_common::impls::ToAuthor; -use xcm::{latest::prelude::*, CreateMatcher, MatchXcm}; +use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, - CurrencyAdapter, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, NativeAsset, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - UsingComponents, WithComputedOrigin, + CreateMatcher, CurrencyAdapter, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, MatchXcm, + NativeAsset, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WithComputedOrigin, }; use xcm_executor::{traits::ShouldExecute, XcmExecutor}; @@ -108,7 +108,7 @@ where message: &mut [Instruction], max_weight: Weight, weight_credit: &mut Weight, - ) -> Result<(), ()> { + ) -> Result<(), ProcessMessageError> { Deny::should_execute(origin, message, max_weight, weight_credit)?; Allow::should_execute(origin, message, max_weight, weight_credit) } @@ -122,7 +122,7 @@ impl ShouldExecute for DenyReserveTransferToRelayChain { message: &mut [Instruction], _max_weight: Weight, _weight_credit: &mut Weight, - ) -> Result<(), ()> { + ) -> Result<(), ProcessMessageError> { message.matcher().match_next_inst_while( |_| true, |inst| match inst { @@ -136,7 +136,7 @@ impl ShouldExecute for DenyReserveTransferToRelayChain { TransferReserveAsset { dest: MultiLocation { parents: 1, interior: Here }, .. } => { - Err(()) // Deny + Err(ProcessMessageError::Unsupported) // Deny }, // An unexpected reserve transfer has arrived from the Relay Chain. Generally, // `IsReserve` should not allow this, but we just log it here. diff --git a/parachains/common/src/xcm_config.rs b/parachains/common/src/xcm_config.rs index d367fd4d1a1..61e6f389e6d 100644 --- a/parachains/common/src/xcm_config.rs +++ b/parachains/common/src/xcm_config.rs @@ -2,11 +2,14 @@ use crate::impls::AccountIdOf; use core::{marker::PhantomData, ops::ControlFlow}; use frame_support::{ log, - traits::{fungibles::Inspect, tokens::ConversionToAssetBalance, ContainsPair}, + traits::{ + fungibles::Inspect, tokens::ConversionToAssetBalance, ContainsPair, ProcessMessageError, + }, weights::Weight, }; use sp_runtime::traits::Get; -use xcm::{latest::prelude::*, CreateMatcher, MatchXcm}; +use xcm::latest::prelude::*; +use xcm_builder::{CreateMatcher, MatchXcm}; use xcm_executor::traits::ShouldExecute; //TODO: move DenyThenTry to polkadot's xcm module. @@ -27,7 +30,7 @@ where message: &mut [Instruction], max_weight: Weight, weight_credit: &mut Weight, - ) -> Result<(), ()> { + ) -> Result<(), ProcessMessageError> { Deny::should_execute(origin, message, max_weight, weight_credit)?; Allow::should_execute(origin, message, max_weight, weight_credit) } @@ -41,7 +44,7 @@ impl ShouldExecute for DenyReserveTransferToRelayChain { message: &mut [Instruction], _max_weight: Weight, _weight_credit: &mut Weight, - ) -> Result<(), ()> { + ) -> Result<(), ProcessMessageError> { message.matcher().match_next_inst_while( |_| true, |inst| match inst { @@ -55,7 +58,7 @@ impl ShouldExecute for DenyReserveTransferToRelayChain { TransferReserveAsset { dest: MultiLocation { parents: 1, interior: Here }, .. } => { - Err(()) // Deny + Err(ProcessMessageError::Unsupported) // Deny }, // An unexpected reserve transfer has arrived from the Relay Chain. Generally, diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs index 832a9af5f5e..e2ff9a974b5 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs @@ -171,6 +171,15 @@ impl pallet_xcm::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_092_000 picoseconds. + Weight::from_parts(3_217_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs index 26e19764b8a..32f1d1cd687 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs @@ -171,6 +171,15 @@ impl pallet_xcm::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_451_000 picoseconds. + Weight::from_parts(3_580_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs index 12b4dd66653..0d650e50929 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs @@ -169,6 +169,15 @@ impl pallet_xcm::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_144_000 picoseconds. + Weight::from_parts(3_225_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs index 6210755b2bd..df103d9266b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs @@ -170,6 +170,15 @@ impl pallet_xcm::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_073_000 picoseconds. + Weight::from_parts(3_178_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs index db01f989e76..05bfdc8339e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs @@ -170,6 +170,15 @@ impl pallet_xcm::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_994_000 picoseconds. + Weight::from_parts(3_160_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs index 6472867bfbc..23f4f1cb27b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs @@ -170,6 +170,15 @@ impl pallet_xcm::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_218_000 picoseconds. + Weight::from_parts(3_311_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs index 43fee0b52e6..43823d56560 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs @@ -170,6 +170,15 @@ impl pallet_xcm::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_994_000 picoseconds. + Weight::from_parts(3_125_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { From 9240ded7686e36d42363cbde834d68de27679bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 28 Apr 2023 09:45:44 +0200 Subject: [PATCH 149/339] level-monitor: Use prroper log target (#2493) * level-monitor: Use prroper log target * ".git/.scripts/commands/fmt/fmt.sh" --------- Co-authored-by: command-bot <> --- client/consensus/common/src/level_monitor.rs | 33 +++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/client/consensus/common/src/level_monitor.rs b/client/consensus/common/src/level_monitor.rs index 4f344b505a7..3576ced1858 100644 --- a/client/consensus/common/src/level_monitor.rs +++ b/client/consensus/common/src/level_monitor.rs @@ -22,6 +22,8 @@ use std::{ sync::Arc, }; +const LOG_TARGET: &'static str = "level-monitor"; + /// Value good enough to be used with parachains using the current backend implementation /// that ships with Substrate. This value may change in the future. pub const MAX_LEAVES_PER_LEVEL_SENSIBLE_DEFAULT: usize = 32; @@ -100,9 +102,10 @@ where let info = self.backend.blockchain().info(); log::debug!( - target: "parachain", + target: LOG_TARGET, "Restoring chain level monitor from last finalized block: {} {}", - info.finalized_number, info.finalized_hash + info.finalized_number, + info.finalized_hash ); self.lowest_level = info.finalized_number; @@ -124,7 +127,11 @@ where } } - log::debug!(target: "parachain", "Restored chain level monitor up to height {}", self.import_counter); + log::debug!( + target: LOG_TARGET, + "Restored chain level monitor up to height {}", + self.import_counter + ); } /// Check and enforce the limit bound at the given height. @@ -161,7 +168,7 @@ where let remove_count = level_len - self.level_limit + 1; log::debug!( - target: "parachain", + target: LOG_TARGET, "Detected leaves overflow at height {number}, removing {remove_count} obsolete blocks", ); @@ -224,9 +231,11 @@ where }), Err(err) => { log::warn!( - target: "parachain", + target: LOG_TARGET, "(Lookup) Unable getting route from {:?} to {:?}: {}", - blk_hash, leaf_hash, err, + blk_hash, + leaf_hash, + err, ); None }, @@ -243,7 +252,7 @@ where None => { // This should never happen log::error!( - target: "parachain", + target: LOG_TARGET, "Unable getting route to any leaf from {:?} (this is a bug)", blk_hash, ); @@ -294,9 +303,9 @@ where invalidated_leaves: &mut HashSet, ) { let mut remove_leaf = |number, hash| { - log::debug!(target: "parachain", "Removing block (@{}) {:?}", number, hash); + log::debug!(target: LOG_TARGET, "Removing block (@{}) {:?}", number, hash); if let Err(err) = self.backend.remove_leaf_block(hash) { - log::debug!(target: "parachain", "Remove not possible for {}: {}", hash, err); + log::debug!(target: LOG_TARGET, "Remove not possible for {}: {}", hash, err); return false } self.levels.get_mut(&number).map(|level| level.remove(&hash)); @@ -337,9 +346,11 @@ where }, Err(err) => { log::warn!( - target: "parachain", + target: LOG_TARGET, "(Removal) unable getting route from {:?} to {:?}: {}", - target_hash, leaf_hash, err, + target_hash, + leaf_hash, + err, ); }, _ => (), From ad86283c0e26c32a2e47dffd6123c4613b2806b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 30 Apr 2023 23:28:29 +0200 Subject: [PATCH 150/339] Bump ruby/setup-ruby from 1.147.0 to 1.148.0 (#2496) Bumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.147.0 to 1.148.0. - [Release notes](https://github.com/ruby/setup-ruby/releases) - [Commits](https://github.com/ruby/setup-ruby/compare/6cecb48364174b0952995175c55f9bf5527e6682...d2b39ad0b52eca07d23f3aa14fdf2a3fcc1f411c) --- updated-dependencies: - dependency-name: ruby/setup-ruby dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release-30_create-draft.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index 2ff64018252..a3b39806eec 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -126,7 +126,7 @@ jobs: path: cumulus ref: ${{ github.event.inputs.ref2 }} - - uses: ruby/setup-ruby@6cecb48364174b0952995175c55f9bf5527e6682 # v1.147.0 + - uses: ruby/setup-ruby@d2b39ad0b52eca07d23f3aa14fdf2a3fcc1f411c # v1.148.0 with: ruby-version: 3.0.0 @@ -253,7 +253,7 @@ jobs: - name: Download artifacts uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 - - uses: ruby/setup-ruby@6cecb48364174b0952995175c55f9bf5527e6682 # v1.147.0 + - uses: ruby/setup-ruby@d2b39ad0b52eca07d23f3aa14fdf2a3fcc1f411c # v1.148.0 with: ruby-version: 3.0.0 From 58926285a219b61fd3865ec4eeebdf87b9b66566 Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Mon, 1 May 2023 10:22:56 +0200 Subject: [PATCH 151/339] Skip av-store, make consensus task blocking (#2497) --- Cargo.lock | 561 +++++++++--------- .../src/collator_overseer.rs | 2 +- client/service/src/lib.rs | 4 +- 3 files changed, 284 insertions(+), 283 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 930a6969c8a..d425672430a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -584,7 +584,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "hash-db", "log", @@ -1604,18 +1604,18 @@ checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" [[package]] name = "cranelift-bforest" -version = "0.93.1" +version = "0.93.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7379abaacee0f14abf3204a7606118f0465785252169d186337bcb75030815a" +checksum = "2bc42ba2e232e5b20ff7dc299a812d53337dadce9a7e39a238e6a5cb82d2e57b" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.93.1" +version = "0.93.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9489fa336927df749631f1008007ced2871068544f40a202ce6d93fbf2366a7b" +checksum = "253531aca9b6f56103c9420369db3263e784df39aa1c90685a1f69cfbba0623e" dependencies = [ "arrayvec 0.7.2", "bumpalo", @@ -1634,33 +1634,33 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.93.1" +version = "0.93.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05bbb67da91ec721ed57cef2f7c5ef7728e1cd9bde9ffd3ef8601022e73e3239" +checksum = "72f2154365e2bff1b1b8537a7181591fdff50d8e27fa6e40d5c69c3bad0ca7c8" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.93.1" +version = "0.93.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418ecb2f36032f6665dc1a5e2060a143dbab41d83b784882e97710e890a7a16d" +checksum = "687e14e3f5775248930e0d5a84195abef8b829958e9794bf8d525104993612b4" [[package]] name = "cranelift-entity" -version = "0.93.1" +version = "0.93.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cf583f7b093f291005f9fb1323e2c37f6ee4c7909e39ce016b2e8360d461705" +checksum = "f42ea692c7b450ad18b8c9889661505d51c09ec4380cf1c2d278dbb2da22cae1" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.93.1" +version = "0.93.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b66bf9e916f57fbbd0f7703ec6286f4624866bf45000111627c70d272c8dda1" +checksum = "8483c2db6f45fe9ace984e5adc5d058102227e4c62e5aa2054e16b0275fd3a6e" dependencies = [ "cranelift-codegen", "log", @@ -1670,15 +1670,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.93.1" +version = "0.93.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "649782a39ce99798dd6b4029e2bb318a2fbeaade1b4fa25330763c10c65bc358" +checksum = "e9793158837678902446c411741d87b43f57dadfb944f2440db4287cda8cbd59" [[package]] name = "cranelift-native" -version = "0.93.1" +version = "0.93.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "937e021e089c51f9749d09e7ad1c4f255c2f8686cb8c3df63a34b3ec9921bc41" +checksum = "72668c7755f2b880665cb422c8ad2d56db58a88b9bebfef0b73edc2277c13c49" dependencies = [ "cranelift-codegen", "libc", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.93.1" +version = "0.93.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d850cf6775477747c9dfda9ae23355dd70512ffebc70cf82b85a5b111ae668b5" +checksum = "3852ce4b088b44ac4e29459573943009a70d1b192c8d77ef949b4e814f656fc1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -3456,7 +3456,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", ] @@ -3479,7 +3479,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "frame-support-procedural", @@ -3504,7 +3504,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3551,7 +3551,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3562,7 +3562,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3579,7 +3579,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "frame-system", @@ -3608,7 +3608,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-recursion", "futures", @@ -3626,7 +3626,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "bitflags", "environmental", @@ -3659,7 +3659,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "Inflector", "cfg-expr", @@ -3675,7 +3675,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3687,7 +3687,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "proc-macro2", "quote", @@ -3697,7 +3697,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "log", @@ -3715,7 +3715,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -3730,7 +3730,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "sp-api", @@ -3739,7 +3739,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "parity-scale-codec", @@ -4726,7 +4726,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bitvec", "frame-benchmarking", @@ -4824,7 +4824,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "frame-support", "polkadot-primitives", @@ -5678,7 +5678,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "futures", "log", @@ -5697,7 +5697,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "anyhow", "jsonrpsee", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "frame-system", @@ -6282,7 +6282,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "frame-system", @@ -6296,7 +6296,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6320,7 +6320,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6340,7 +6340,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6355,7 +6355,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "frame-system", @@ -6374,7 +6374,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6398,7 +6398,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6416,7 +6416,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6530,7 +6530,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6547,7 +6547,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6565,7 +6565,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6588,7 +6588,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6601,7 +6601,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6619,7 +6619,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6637,7 +6637,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6660,7 +6660,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6676,7 +6676,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6696,7 +6696,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6727,7 +6727,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6744,7 +6744,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6761,7 +6761,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6806,7 +6806,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6822,7 +6822,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "frame-system", @@ -6839,7 +6839,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6859,7 +6859,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6870,7 +6870,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "frame-system", @@ -6887,7 +6887,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6911,7 +6911,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6928,7 +6928,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6943,7 +6943,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6961,7 +6961,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -6976,7 +6976,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6995,7 +6995,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7012,7 +7012,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "frame-system", @@ -7033,7 +7033,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7049,7 +7049,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "frame-system", @@ -7063,7 +7063,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7086,7 +7086,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7097,7 +7097,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "log", "sp-arithmetic", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "sp-api", @@ -7115,7 +7115,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7132,7 +7132,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "frame-system", @@ -7161,7 +7161,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7179,7 +7179,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-support", "frame-system", @@ -7214,7 +7214,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7230,7 +7230,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7242,7 +7242,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7274,7 +7274,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7290,7 +7290,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7305,7 +7305,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-benchmarking", "frame-support", @@ -7320,7 +7320,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7341,7 +7341,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7890,7 +7890,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "futures", "polkadot-node-jaeger", @@ -7906,7 +7906,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7920,7 +7920,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "derive_more", "fatality", @@ -7943,7 +7943,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "fatality", "futures", @@ -7964,7 +7964,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "clap 4.2.3", "frame-benchmarking-cli", @@ -7993,7 +7993,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "async-trait", "frame-benchmarking", @@ -8036,7 +8036,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "always-assert", "bitvec", @@ -8058,7 +8058,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "parity-scale-codec", "scale-info", @@ -8070,7 +8070,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "derive_more", "fatality", @@ -8095,7 +8095,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8109,7 +8109,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "futures", "futures-timer", @@ -8129,7 +8129,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "always-assert", "async-trait", @@ -8152,7 +8152,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "futures", "parity-scale-codec", @@ -8170,7 +8170,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bitvec", "derive_more", @@ -8199,7 +8199,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bitvec", "futures", @@ -8220,7 +8220,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bitvec", "fatality", @@ -8239,7 +8239,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8254,7 +8254,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "async-trait", "futures", @@ -8274,7 +8274,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "futures", "polkadot-node-metrics", @@ -8289,7 +8289,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "futures", "futures-timer", @@ -8306,7 +8306,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "fatality", "futures", @@ -8325,7 +8325,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "async-trait", "futures", @@ -8342,7 +8342,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bitvec", "fatality", @@ -8360,7 +8360,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "always-assert", "futures", @@ -8387,7 +8387,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "futures", "polkadot-node-primitives", @@ -8403,7 +8403,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "assert_matches", "cpu-time", @@ -8432,7 +8432,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "futures", "lru 0.9.0", @@ -8447,7 +8447,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "lazy_static", "log", @@ -8465,7 +8465,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bs58", "futures", @@ -8484,7 +8484,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "async-trait", "derive_more", @@ -8506,7 +8506,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bounded-vec", "futures", @@ -8528,7 +8528,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8538,7 +8538,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "async-trait", "futures", @@ -8556,7 +8556,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "async-trait", "derive_more", @@ -8579,7 +8579,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "async-trait", "derive_more", @@ -8612,7 +8612,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "async-trait", "futures", @@ -8635,7 +8635,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bounded-collections", "derive_more", @@ -8733,7 +8733,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8751,7 +8751,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -8777,7 +8777,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8809,7 +8809,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bitvec", "frame-benchmarking", @@ -8903,7 +8903,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bitvec", "frame-benchmarking", @@ -8949,7 +8949,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "frame-support", "polkadot-primitives", @@ -8963,7 +8963,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bs58", "parity-scale-codec", @@ -8975,7 +8975,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bitflags", "bitvec", @@ -9019,7 +9019,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9129,7 +9129,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9150,7 +9150,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9160,7 +9160,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9185,7 +9185,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9246,7 +9246,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "frame-benchmarking", "frame-system", @@ -10002,7 +10002,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10088,7 +10088,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "frame-support", "polkadot-primitives", @@ -10335,7 +10335,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "log", "sp-core", @@ -10346,7 +10346,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "futures", @@ -10374,7 +10374,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "futures", "futures-timer", @@ -10397,7 +10397,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10412,7 +10412,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10431,7 +10431,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10442,7 +10442,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10482,7 +10482,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "fnv", "futures", @@ -10508,7 +10508,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "hash-db", "kvdb", @@ -10534,7 +10534,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "futures", @@ -10588,7 +10588,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "fork-tree", @@ -10624,7 +10624,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "futures", "jsonrpsee", @@ -10646,7 +10646,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10681,7 +10681,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "futures", "jsonrpsee", @@ -10700,7 +10700,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10713,7 +10713,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10753,7 +10753,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "finality-grandpa", "futures", @@ -10773,7 +10773,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "futures", @@ -10796,7 +10796,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10820,7 +10820,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10833,7 +10833,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "log", "sc-allocator", @@ -10846,7 +10846,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "anyhow", "cfg-if", @@ -10864,7 +10864,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "ansi_term", "futures", @@ -10880,7 +10880,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10895,7 +10895,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10940,7 +10940,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "cid", "futures", @@ -10960,7 +10960,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10988,7 +10988,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "ahash 0.8.2", "futures", @@ -11007,7 +11007,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11029,7 +11029,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11063,7 +11063,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11083,7 +11083,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11114,7 +11114,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "futures", "libp2p", @@ -11127,7 +11127,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11136,7 +11136,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "futures", "jsonrpsee", @@ -11166,7 +11166,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11185,7 +11185,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "http", "jsonrpsee", @@ -11200,7 +11200,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11226,7 +11226,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "directories", @@ -11292,7 +11292,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "log", "parity-scale-codec", @@ -11303,7 +11303,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "clap 4.2.3", "fs4", @@ -11319,7 +11319,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11338,7 +11338,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "futures", "libc", @@ -11357,7 +11357,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "chrono", "futures", @@ -11376,7 +11376,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "ansi_term", "atty", @@ -11407,7 +11407,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11418,7 +11418,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "futures", @@ -11445,7 +11445,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "futures", @@ -11459,7 +11459,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-channel", "futures", @@ -11940,7 +11940,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "enumn", "parity-scale-codec", @@ -12017,7 +12017,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "hash-db", "log", @@ -12037,7 +12037,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "Inflector", "blake2", @@ -12051,7 +12051,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "scale-info", @@ -12064,7 +12064,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "integer-sqrt", "num-traits", @@ -12078,7 +12078,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "scale-info", @@ -12091,7 +12091,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "sp-api", @@ -12103,7 +12103,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "futures", "log", @@ -12121,7 +12121,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "futures", @@ -12136,7 +12136,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "parity-scale-codec", @@ -12154,7 +12154,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "parity-scale-codec", @@ -12175,7 +12175,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12194,7 +12194,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "finality-grandpa", "log", @@ -12212,7 +12212,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "scale-info", @@ -12224,7 +12224,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12268,7 +12268,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "blake2b_simd", "byteorder", @@ -12282,7 +12282,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "proc-macro2", "quote", @@ -12293,7 +12293,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12302,7 +12302,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "proc-macro2", "quote", @@ -12312,7 +12312,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "environmental", "parity-scale-codec", @@ -12323,7 +12323,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12338,7 +12338,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "bytes", "ed25519", @@ -12364,7 +12364,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "lazy_static", "sp-core", @@ -12375,7 +12375,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "futures", "parity-scale-codec", @@ -12389,7 +12389,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12398,7 +12398,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12409,7 +12409,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12427,7 +12427,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "scale-info", @@ -12441,7 +12441,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "sp-api", "sp-core", @@ -12451,7 +12451,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "backtrace", "lazy_static", @@ -12461,7 +12461,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "rustc-hash", "serde", @@ -12471,7 +12471,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "either", "hash256-std-hasher", @@ -12493,7 +12493,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12511,7 +12511,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "Inflector", "proc-macro-crate", @@ -12532,7 +12532,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "scale-info", @@ -12546,10 +12546,11 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "scale-info", + "serde", "sp-core", "sp-runtime", "sp-std", @@ -12558,7 +12559,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "hash-db", "log", @@ -12578,12 +12579,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12596,7 +12597,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "futures-timer", @@ -12611,7 +12612,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "sp-std", @@ -12623,7 +12624,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "sp-api", "sp-runtime", @@ -12632,7 +12633,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "log", @@ -12648,7 +12649,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12671,7 +12672,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12688,7 +12689,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12699,7 +12700,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12713,7 +12714,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "parity-scale-codec", "scale-info", @@ -13037,7 +13038,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "platforms 2.0.0", ] @@ -13045,7 +13046,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13064,7 +13065,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "hyper", "log", @@ -13076,7 +13077,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "jsonrpsee", @@ -13089,7 +13090,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "jsonrpsee", "log", @@ -13108,7 +13109,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13155,7 +13156,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "ansi_term", "build-helper", @@ -13282,7 +13283,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "frame-support", "polkadot-primitives", @@ -13659,7 +13660,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13670,7 +13671,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -13800,7 +13801,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", "clap 4.2.3", @@ -14294,9 +14295,9 @@ dependencies = [ [[package]] name = "wasmtime" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e89f9819523447330ffd70367ef4a18d8c832e24e8150fe054d1d912841632" +checksum = "76a222f5fa1e14b2cefc286f1b68494d7a965f4bf57ec04c59bb62673d639af6" dependencies = [ "anyhow", "bincode", @@ -14322,18 +14323,18 @@ dependencies = [ [[package]] name = "wasmtime-asm-macros" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd3a5e46c198032da934469f3a6e48649d1f9142438e4fd4617b68a35644b8a" +checksum = "4407a7246e7d2f3d8fb1cf0c72fda8dbafdb6dd34d555ae8bea0e5ae031089cc" dependencies = [ "cfg-if", ] [[package]] name = "wasmtime-cache" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b389ae9b678b9c3851091a4804f4182d688d27aff7abc9aa37fa7be37d8ecffa" +checksum = "5ceb3adf61d654be0be67fffdce42447b0880481348785be5fe40b5dd7663a4c" dependencies = [ "anyhow", "base64", @@ -14351,9 +14352,9 @@ dependencies = [ [[package]] name = "wasmtime-cranelift" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b2c92a08c0db6efffd88fdc97d7aa9c7c63b03edb0971dbca745469f820e8c" +checksum = "3c366bb8647e01fd08cb5589976284b00abfded5529b33d7e7f3f086c68304a4" dependencies = [ "anyhow", "cranelift-codegen", @@ -14372,9 +14373,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a6db9fc52985ba06ca601f2ff0ff1f526c5d724c7ac267b47326304b0c97883" +checksum = "47b8b50962eae38ee319f7b24900b7cf371f03eebdc17400c1dc8575fc10c9a7" dependencies = [ "anyhow", "cranelift-entity", @@ -14391,9 +14392,9 @@ dependencies = [ [[package]] name = "wasmtime-jit" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b77e3a52cd84d0f7f18554afa8060cfe564ccac61e3b0802d3fd4084772fa5f6" +checksum = "ffaed4f9a234ba5225d8e64eac7b4a5d13b994aeb37353cde2cbeb3febda9eaa" dependencies = [ "addr2line 0.17.0", "anyhow", @@ -14415,9 +14416,9 @@ dependencies = [ [[package]] name = "wasmtime-jit-debug" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0245e8a9347017c7185a72e215218a802ff561545c242953c11ba00fccc930f" +checksum = "eed41cbcbf74ce3ff6f1d07d1b707888166dc408d1a880f651268f4f7c9194b2" dependencies = [ "object 0.29.0", "once_cell", @@ -14426,9 +14427,9 @@ dependencies = [ [[package]] name = "wasmtime-jit-icache-coherence" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67d412e9340ab1c83867051d8d1d7c90aa8c9afc91da086088068e2734e25064" +checksum = "43a28ae1e648461bfdbb79db3efdaee1bca5b940872e4175390f465593a2e54c" dependencies = [ "cfg-if", "libc", @@ -14437,9 +14438,9 @@ dependencies = [ [[package]] name = "wasmtime-runtime" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d594e791b5fdd4dbaf8cf7ae62f2e4ff85018ce90f483ca6f42947688e48827d" +checksum = "e704b126e4252788ccfc3526d4d4511d4b23c521bf123e447ac726c14545217b" dependencies = [ "anyhow", "cc", @@ -14461,9 +14462,9 @@ dependencies = [ [[package]] name = "wasmtime-types" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6688d6f96d4dbc1f89fab626c56c1778936d122b5f4ae7a57c2eb42b8d982e2" +checksum = "83e5572c5727c1ee7e8f28717aaa8400e4d22dcbd714ea5457d85b5005206568" dependencies = [ "cranelift-entity", "serde", @@ -14734,7 +14735,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bitvec", "frame-benchmarking", @@ -14826,7 +14827,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "frame-support", "polkadot-primitives", @@ -15328,7 +15329,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "bounded-collections", "derivative", @@ -15344,7 +15345,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "frame-support", "frame-system", @@ -15365,7 +15366,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "environmental", "frame-benchmarking", @@ -15385,7 +15386,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#929936478a2ef63ad8718e3e8abc4c85a4a0fb50" +source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ "Inflector", "proc-macro2", diff --git a/client/relay-chain-minimal-node/src/collator_overseer.rs b/client/relay-chain-minimal-node/src/collator_overseer.rs index bd3dfa8e0f8..a2ad87fa758 100644 --- a/client/relay-chain-minimal-node/src/collator_overseer.rs +++ b/client/relay-chain-minimal-node/src/collator_overseer.rs @@ -99,7 +99,7 @@ fn build_overseer<'a>( let network_bridge_metrics: NetworkBridgeMetrics = Metrics::register(registry)?; let builder = Overseer::builder() .availability_distribution(DummySubsystem) - .availability_recovery(AvailabilityRecoverySubsystem::with_chunks_only( + .availability_recovery(AvailabilityRecoverySubsystem::with_availability_store_skip( available_data_req_receiver, Metrics::register(registry)?, )) diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index ec6fc5e3c30..894db91ba8f 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -125,7 +125,7 @@ where task_manager .spawn_essential_handle() - .spawn("cumulus-consensus", None, consensus); + .spawn_blocking("cumulus-consensus", None, consensus); let pov_recovery = PoVRecovery::new( recovery_handle, @@ -218,7 +218,7 @@ where task_manager .spawn_essential_handle() - .spawn("cumulus-consensus", None, consensus); + .spawn_blocking("cumulus-consensus", None, consensus); let pov_recovery = PoVRecovery::new( recovery_handle, From cd91e6be5f385fab6584842c5fc34514207ca1c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 May 2023 10:08:28 +0200 Subject: [PATCH 152/339] Bump scale-info from 2.5.0 to 2.6.0 (#2500) Bumps [scale-info](https://github.com/paritytech/scale-info) from 2.5.0 to 2.6.0. - [Release notes](https://github.com/paritytech/scale-info/releases) - [Changelog](https://github.com/paritytech/scale-info/blob/master/CHANGELOG.md) - [Commits](https://github.com/paritytech/scale-info/commits) --- updated-dependencies: - dependency-name: scale-info dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- pallets/aura-ext/Cargo.toml | 2 +- pallets/collator-selection/Cargo.toml | 2 +- pallets/dmp-queue/Cargo.toml | 2 +- pallets/parachain-system/Cargo.toml | 2 +- pallets/solo-to-para/Cargo.toml | 2 +- pallets/xcm/Cargo.toml | 2 +- pallets/xcmp-queue/Cargo.toml | 2 +- parachain-template/runtime/Cargo.toml | 2 +- parachains/common/Cargo.toml | 2 +- parachains/pallets/parachain-info/Cargo.toml | 2 +- parachains/pallets/ping/Cargo.toml | 2 +- parachains/runtimes/assets/common/Cargo.toml | 2 +- parachains/runtimes/assets/statemine/Cargo.toml | 2 +- parachains/runtimes/assets/statemint/Cargo.toml | 2 +- parachains/runtimes/assets/westmint/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- .../runtimes/collectives/collectives-polkadot/Cargo.toml | 2 +- parachains/runtimes/contracts/contracts-rococo/Cargo.toml | 2 +- parachains/runtimes/starters/seedling/Cargo.toml | 2 +- parachains/runtimes/starters/shell/Cargo.toml | 2 +- parachains/runtimes/testing/penpal/Cargo.toml | 2 +- parachains/runtimes/testing/rococo-parachain/Cargo.toml | 2 +- primitives/core/Cargo.toml | 2 +- primitives/parachain-inherent/Cargo.toml | 2 +- test/runtime/Cargo.toml | 2 +- 28 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d425672430a..68c748a30eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11473,9 +11473,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cfdffd972d76b22f3d7f81c8be34b2296afd3a25e0a547bd9abe340a4dbbe97" +checksum = "dfdef77228a4c05dc94211441595746732131ad7f6530c6c18f045da7b7ab937" dependencies = [ "bitvec", "cfg-if", @@ -11487,9 +11487,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61fa974aea2d63dd18a4ec3a49d59af9f34178c73a4f56d2f18205628d00681e" +checksum = "53012eae69e5aa5c14671942a5dd47de59d4cdcff8532a6dd0e081faf1119482" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/pallets/aura-ext/Cargo.toml b/pallets/aura-ext/Cargo.toml index 1db43697511..6c890eeceb0 100644 --- a/pallets/aura-ext/Cargo.toml +++ b/pallets/aura-ext/Cargo.toml @@ -7,7 +7,7 @@ description = "AURA consensus extension pallet for parachains" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/collator-selection/Cargo.toml b/pallets/collator-selection/Cargo.toml index 17bb6fe5579..837b0c0287c 100644 --- a/pallets/collator-selection/Cargo.toml +++ b/pallets/collator-selection/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] log = { version = "0.4.17", default-features = false } codec = { default-features = false, features = ["derive"], package = "parity-scale-codec", version = "3.0.0" } rand = { version = "0.8.5", features = ["std_rng"], default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/pallets/dmp-queue/Cargo.toml b/pallets/dmp-queue/Cargo.toml index 6d072adaede..81cb05d8af1 100644 --- a/pallets/dmp-queue/Cargo.toml +++ b/pallets/dmp-queue/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/parachain-system/Cargo.toml b/pallets/parachain-system/Cargo.toml index 107705901b9..3a67e2eef4c 100644 --- a/pallets/parachain-system/Cargo.toml +++ b/pallets/parachain-system/Cargo.toml @@ -11,7 +11,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = environmental = { version = "1.1.4", default-features = false } impl-trait-for-tuples = "0.2.1" log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/solo-to-para/Cargo.toml b/pallets/solo-to-para/Cargo.toml index d092fac6ea7..d4800733cee 100644 --- a/pallets/solo-to-para/Cargo.toml +++ b/pallets/solo-to-para/Cargo.toml @@ -7,7 +7,7 @@ description = "Adds functionality to migrate from a Solo to a Parachain" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/xcm/Cargo.toml b/pallets/xcm/Cargo.toml index 59a751dde09..841c862557a 100644 --- a/pallets/xcm/Cargo.toml +++ b/pallets/xcm/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/xcmp-queue/Cargo.toml b/pallets/xcmp-queue/Cargo.toml index ed5f199e1fe..62419f78a08 100644 --- a/pallets/xcmp-queue/Cargo.toml +++ b/pallets/xcmp-queue/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } log = { version = "0.4.17", default-features = false } rand_chacha = { version = "0.3.0", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachain-template/runtime/Cargo.toml b/parachain-template/runtime/Cargo.toml index ed56ee83e52..81a4cf811a8 100644 --- a/parachain-template/runtime/Cargo.toml +++ b/parachain-template/runtime/Cargo.toml @@ -18,7 +18,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Local diff --git a/parachains/common/Cargo.toml b/parachains/common/Cargo.toml index 5898ae3d9ba..bf16861894c 100644 --- a/parachains/common/Cargo.toml +++ b/parachains/common/Cargo.toml @@ -10,7 +10,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"], default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } diff --git a/parachains/pallets/parachain-info/Cargo.toml b/parachains/pallets/parachain-info/Cargo.toml index 3d706e35e8e..7ff346fe24b 100644 --- a/parachains/pallets/parachain-info/Cargo.toml +++ b/parachains/pallets/parachain-info/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/pallets/ping/Cargo.toml b/parachains/pallets/ping/Cargo.toml index 1dd218ccc79..b705a9a2f10 100644 --- a/parachains/pallets/ping/Cargo.toml +++ b/parachains/pallets/ping/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/assets/common/Cargo.toml b/parachains/runtimes/assets/common/Cargo.toml index 69f56a2405e..303b0bd9c64 100644 --- a/parachains/runtimes/assets/common/Cargo.toml +++ b/parachains/runtimes/assets/common/Cargo.toml @@ -7,7 +7,7 @@ description = "Assets common utilities" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } # Substrate diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index 8328106fade..c3231e23958 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -9,7 +9,7 @@ description = "Kusama variant of Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/assets/statemint/Cargo.toml b/parachains/runtimes/assets/statemint/Cargo.toml index a5d2841418a..837be9a2738 100644 --- a/parachains/runtimes/assets/statemint/Cargo.toml +++ b/parachains/runtimes/assets/statemint/Cargo.toml @@ -9,7 +9,7 @@ description = "Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/westmint/Cargo.toml index a63353adb4e..91b06660dfa 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/westmint/Cargo.toml @@ -9,7 +9,7 @@ description = "Westend variant of Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index e37527b8d6c..4f7338a8e81 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } serde = { version = "1.0.160", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 520907e9d7c..3b42507b1da 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } serde = { version = "1.0.160", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index cfd1894491b..d758e002cf0 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } serde = { version = "1.0.160", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml index 3f5c956d454..13fe985a63b 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml +++ b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml @@ -9,7 +9,7 @@ description = "Polkadot Collectives Parachain Runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index 10f222713f9..74186c0e53c 100644 --- a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -14,7 +14,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/starters/seedling/Cargo.toml b/parachains/runtimes/starters/seedling/Cargo.toml index 96ec9544009..0a9e05d4bb4 100644 --- a/parachains/runtimes/starters/seedling/Cargo.toml +++ b/parachains/runtimes/starters/seedling/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/starters/shell/Cargo.toml b/parachains/runtimes/starters/shell/Cargo.toml index a176e73906a..7332ff8d012 100644 --- a/parachains/runtimes/starters/shell/Cargo.toml +++ b/parachains/runtimes/starters/shell/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/testing/penpal/Cargo.toml b/parachains/runtimes/testing/penpal/Cargo.toml index 460e3b1d4b4..2886d799a4c 100644 --- a/parachains/runtimes/testing/penpal/Cargo.toml +++ b/parachains/runtimes/testing/penpal/Cargo.toml @@ -18,7 +18,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.16", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/testing/rococo-parachain/Cargo.toml b/parachains/runtimes/testing/rococo-parachain/Cargo.toml index ecf6acda9e3..9b3f993bb77 100644 --- a/parachains/runtimes/testing/rococo-parachain/Cargo.toml +++ b/parachains/runtimes/testing/rococo-parachain/Cargo.toml @@ -7,7 +7,7 @@ description = "Simple runtime used by the rococo parachain(s)" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } # Substrate frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index 8429cd0d0d3..b2adf290db1 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } # Substrate sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/primitives/parachain-inherent/Cargo.toml b/primitives/parachain-inherent/Cargo.toml index 2135802592b..ff7bfa8ae44 100644 --- a/primitives/parachain-inherent/Cargo.toml +++ b/primitives/parachain-inherent/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] async-trait = { version = "0.1.68", optional = true } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } tracing = { version = "0.1.37", optional = true } # Substrate diff --git a/test/runtime/Cargo.toml b/test/runtime/Cargo.toml index 619d01fce8d..cbba13e1a93 100644 --- a/test/runtime/Cargo.toml +++ b/test/runtime/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } From d904495ebb18aa04dab0e34595f736252314ffc3 Mon Sep 17 00:00:00 2001 From: Mira Ressel Date: Tue, 2 May 2023 19:55:29 +0200 Subject: [PATCH 153/339] Bump clap to 4.2.5 (#2505) --- Cargo.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 68c748a30eb..4603cc68d33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1261,9 +1261,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.2.3" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f9152d70e42172fdb87de2efd7327160beee37886027cf86f30a233d5b30b4" +checksum = "8a1f23fa97e1d1641371b51f35535cb26959b8e27ab50d167a8b996b5bada819" dependencies = [ "clap_builder", "clap_derive", @@ -1272,9 +1272,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.2.3" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e067b220911598876eb55d52725ddcc201ffe3f0904018195973bc5b012ea2ca" +checksum = "0fdc5d93c358224b4d6867ef1356d740de2303e9892edc06c5340daeccd96bab" dependencies = [ "anstream", "anstyle 1.0.0", @@ -1908,7 +1908,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.2.3", + "clap 4.2.5", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -2551,7 +2551,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.2.3", + "clap 4.2.5", "criterion", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -3509,7 +3509,7 @@ dependencies = [ "Inflector", "array-bytes 4.2.0", "chrono", - "clap 4.2.3", + "clap 4.2.5", "comfy-table", "frame-benchmarking", "frame-support", @@ -7372,7 +7372,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.2.3", + "clap 4.2.5", "color-print", "cumulus-client-cli", "cumulus-client-consensus-aura", @@ -7966,7 +7966,7 @@ name = "polkadot-cli" version = "0.9.41" source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" dependencies = [ - "clap 4.2.3", + "clap 4.2.5", "frame-benchmarking-cli", "futures", "log", @@ -8658,7 +8658,7 @@ dependencies = [ "bridge-hub-kusama-runtime", "bridge-hub-polkadot-runtime", "bridge-hub-rococo-runtime", - "clap 4.2.3", + "clap 4.2.5", "collectives-polkadot-runtime", "color-print", "contracts-rococo-runtime", @@ -10446,7 +10446,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec dependencies = [ "array-bytes 4.2.0", "chrono", - "clap 4.2.3", + "clap 4.2.5", "fdlimit", "futures", "libp2p", @@ -11305,7 +11305,7 @@ name = "sc-storage-monitor" version = "0.1.0" source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ - "clap 4.2.3", + "clap 4.2.5", "fs4", "futures", "log", @@ -13804,7 +13804,7 @@ version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" dependencies = [ "async-trait", - "clap 4.2.3", + "clap 4.2.5", "frame-remote-externalities", "frame-try-runtime", "hex", From 0004d0447775119b70b94876295bd5c9c3f515e6 Mon Sep 17 00:00:00 2001 From: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Date: Wed, 3 May 2023 14:10:46 +0200 Subject: [PATCH 154/339] [ci] Run gha fmt in docker (#2511) * [ci] Run gha fmt in docker * use cargo run instead action --- .github/workflows/fmt-check.yml | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/.github/workflows/fmt-check.yml b/.github/workflows/fmt-check.yml index 6c7a5f3f910..498e42527e3 100644 --- a/.github/workflows/fmt-check.yml +++ b/.github/workflows/fmt-check.yml @@ -13,28 +13,10 @@ jobs: matrix: os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} + container: + image: paritytech/ci-linux:production steps: - - name: Install Rust nightly toolchain - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f # v1.0.7 - with: - profile: minimal - toolchain: nightly - override: true - components: clippy, rustfmt - - - name: Cache Dependencies & Build Outputs - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Cargo fmt - uses: actions-rs/cargo@ae10961054e4aa8b4aa7dffede299aaf087aa33b # v1.0.3 - with: - command: fmt - args: --all -- --check + run: cargo +nightly fmt --all -- --check From 22c06e1868dc7a9e228fe8b03b7c293cf908f270 Mon Sep 17 00:00:00 2001 From: juangirini Date: Wed, 3 May 2023 16:13:54 +0200 Subject: [PATCH 155/339] Companion PR for add events to ContractResult (#2510) * contracts: adapt to new contracts api * update lockfile for {"substrate", "polkadot"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 514 +++++++++--------- .../contracts-rococo/src/contracts.rs | 4 +- .../contracts/contracts-rococo/src/lib.rs | 13 +- 3 files changed, 269 insertions(+), 262 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4603cc68d33..b1c04d04368 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -584,7 +584,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "hash-db", "log", @@ -3456,7 +3456,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", ] @@ -3479,7 +3479,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-support-procedural", @@ -3504,7 +3504,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3551,7 +3551,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3562,7 +3562,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3579,7 +3579,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -3608,7 +3608,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-recursion", "futures", @@ -3626,7 +3626,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "bitflags", "environmental", @@ -3659,7 +3659,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "Inflector", "cfg-expr", @@ -3675,7 +3675,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3687,7 +3687,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "proc-macro2", "quote", @@ -3697,7 +3697,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "log", @@ -3715,7 +3715,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -3730,7 +3730,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "sp-api", @@ -3739,7 +3739,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "parity-scale-codec", @@ -4726,7 +4726,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bitvec", "frame-benchmarking", @@ -4824,7 +4824,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "frame-support", "polkadot-primitives", @@ -5678,7 +5678,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "futures", "log", @@ -5697,7 +5697,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "anyhow", "jsonrpsee", @@ -6196,7 +6196,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6235,7 +6235,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6250,7 +6250,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -6282,7 +6282,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -6296,7 +6296,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6320,7 +6320,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6340,7 +6340,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6355,7 +6355,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -6374,7 +6374,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6398,7 +6398,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6416,7 +6416,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6477,7 +6477,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "bitflags", "environmental", @@ -6507,7 +6507,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "bitflags", "parity-scale-codec", @@ -6520,7 +6520,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "proc-macro2", "quote", @@ -6530,7 +6530,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6547,7 +6547,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6565,7 +6565,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6588,7 +6588,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6601,7 +6601,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6619,7 +6619,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6637,7 +6637,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6660,7 +6660,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6676,7 +6676,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6696,7 +6696,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6713,7 +6713,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -6727,7 +6727,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6744,7 +6744,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6761,7 +6761,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6777,7 +6777,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6795,7 +6795,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "pallet-nfts", @@ -6806,7 +6806,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6822,7 +6822,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -6839,7 +6839,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6859,7 +6859,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6870,7 +6870,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -6887,7 +6887,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6911,7 +6911,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6928,7 +6928,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6943,7 +6943,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6961,7 +6961,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -6976,7 +6976,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6995,7 +6995,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -7012,7 +7012,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -7033,7 +7033,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -7049,7 +7049,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -7063,7 +7063,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7086,7 +7086,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7097,7 +7097,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "log", "sp-arithmetic", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "sp-api", @@ -7115,7 +7115,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -7132,7 +7132,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -7161,7 +7161,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -7179,7 +7179,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-support", "frame-system", @@ -7214,7 +7214,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7230,7 +7230,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7242,7 +7242,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -7259,7 +7259,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -7274,7 +7274,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -7290,7 +7290,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -7305,7 +7305,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-benchmarking", "frame-support", @@ -7320,7 +7320,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7341,7 +7341,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "frame-benchmarking", "frame-support", @@ -7890,7 +7890,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "futures", "polkadot-node-jaeger", @@ -7906,7 +7906,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -7920,7 +7920,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "derive_more", "fatality", @@ -7943,7 +7943,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "fatality", "futures", @@ -7964,7 +7964,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "clap 4.2.5", "frame-benchmarking-cli", @@ -7993,7 +7993,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "async-trait", "frame-benchmarking", @@ -8036,7 +8036,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "always-assert", "bitvec", @@ -8058,7 +8058,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "parity-scale-codec", "scale-info", @@ -8070,7 +8070,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "derive_more", "fatality", @@ -8095,7 +8095,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8109,7 +8109,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "futures", "futures-timer", @@ -8129,7 +8129,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "always-assert", "async-trait", @@ -8152,7 +8152,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "futures", "parity-scale-codec", @@ -8170,7 +8170,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bitvec", "derive_more", @@ -8199,7 +8199,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bitvec", "futures", @@ -8220,7 +8220,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bitvec", "fatality", @@ -8239,7 +8239,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8254,7 +8254,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "async-trait", "futures", @@ -8274,7 +8274,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "futures", "polkadot-node-metrics", @@ -8289,7 +8289,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "futures", "futures-timer", @@ -8306,7 +8306,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "fatality", "futures", @@ -8325,7 +8325,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "async-trait", "futures", @@ -8342,7 +8342,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bitvec", "fatality", @@ -8360,7 +8360,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "always-assert", "futures", @@ -8387,7 +8387,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "futures", "polkadot-node-primitives", @@ -8403,7 +8403,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "assert_matches", "cpu-time", @@ -8432,7 +8432,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "futures", "lru 0.9.0", @@ -8447,7 +8447,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "lazy_static", "log", @@ -8465,7 +8465,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bs58", "futures", @@ -8484,7 +8484,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "async-trait", "derive_more", @@ -8506,7 +8506,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bounded-vec", "futures", @@ -8528,7 +8528,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8538,7 +8538,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "async-trait", "futures", @@ -8556,7 +8556,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "async-trait", "derive_more", @@ -8579,7 +8579,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "async-trait", "derive_more", @@ -8612,7 +8612,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "async-trait", "futures", @@ -8635,7 +8635,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bounded-collections", "derive_more", @@ -8733,7 +8733,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -8751,7 +8751,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -8777,7 +8777,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -8809,7 +8809,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bitvec", "frame-benchmarking", @@ -8903,7 +8903,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bitvec", "frame-benchmarking", @@ -8949,7 +8949,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "frame-support", "polkadot-primitives", @@ -8963,7 +8963,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bs58", "parity-scale-codec", @@ -8975,7 +8975,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bitflags", "bitvec", @@ -9019,7 +9019,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9129,7 +9129,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9150,7 +9150,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9160,7 +9160,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9185,7 +9185,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9246,7 +9246,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "frame-benchmarking", "frame-system", @@ -10002,7 +10002,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10088,7 +10088,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "frame-support", "polkadot-primitives", @@ -10335,7 +10335,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "log", "sp-core", @@ -10346,7 +10346,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "futures", @@ -10374,7 +10374,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "futures", "futures-timer", @@ -10397,7 +10397,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10412,7 +10412,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10431,7 +10431,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10442,7 +10442,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10482,7 +10482,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "fnv", "futures", @@ -10508,7 +10508,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "hash-db", "kvdb", @@ -10534,7 +10534,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "futures", @@ -10559,7 +10559,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "futures", @@ -10588,7 +10588,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "fork-tree", @@ -10624,7 +10624,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "futures", "jsonrpsee", @@ -10646,7 +10646,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10681,7 +10681,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "futures", "jsonrpsee", @@ -10700,7 +10700,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "fork-tree", "parity-scale-codec", @@ -10713,7 +10713,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -10753,7 +10753,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "finality-grandpa", "futures", @@ -10773,7 +10773,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "futures", @@ -10796,7 +10796,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -10820,7 +10820,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -10833,7 +10833,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "log", "sc-allocator", @@ -10846,7 +10846,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "anyhow", "cfg-if", @@ -10864,7 +10864,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "ansi_term", "futures", @@ -10880,7 +10880,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10895,7 +10895,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -10940,7 +10940,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "cid", "futures", @@ -10960,7 +10960,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -10988,7 +10988,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "ahash 0.8.2", "futures", @@ -11007,7 +11007,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11029,7 +11029,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11063,7 +11063,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11083,7 +11083,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11114,7 +11114,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "futures", "libp2p", @@ -11127,7 +11127,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11136,7 +11136,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "futures", "jsonrpsee", @@ -11166,7 +11166,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11185,7 +11185,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "http", "jsonrpsee", @@ -11200,7 +11200,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11226,7 +11226,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "directories", @@ -11292,7 +11292,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "log", "parity-scale-codec", @@ -11303,7 +11303,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "clap 4.2.5", "fs4", @@ -11319,7 +11319,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11338,7 +11338,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "futures", "libc", @@ -11357,7 +11357,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "chrono", "futures", @@ -11376,7 +11376,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "ansi_term", "atty", @@ -11407,7 +11407,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11418,7 +11418,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "futures", @@ -11445,7 +11445,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "futures", @@ -11459,7 +11459,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-channel", "futures", @@ -11940,7 +11940,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "enumn", "parity-scale-codec", @@ -12017,7 +12017,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "hash-db", "log", @@ -12037,7 +12037,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "Inflector", "blake2", @@ -12051,7 +12051,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "scale-info", @@ -12064,7 +12064,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "integer-sqrt", "num-traits", @@ -12078,7 +12078,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "scale-info", @@ -12091,7 +12091,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "sp-api", @@ -12103,7 +12103,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "futures", "log", @@ -12121,7 +12121,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "futures", @@ -12136,7 +12136,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "parity-scale-codec", @@ -12154,7 +12154,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "parity-scale-codec", @@ -12175,7 +12175,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12194,7 +12194,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "finality-grandpa", "log", @@ -12212,7 +12212,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "scale-info", @@ -12224,7 +12224,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12268,7 +12268,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "blake2b_simd", "byteorder", @@ -12282,7 +12282,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "proc-macro2", "quote", @@ -12293,7 +12293,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12302,7 +12302,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "proc-macro2", "quote", @@ -12312,7 +12312,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "environmental", "parity-scale-codec", @@ -12323,7 +12323,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12338,7 +12338,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "bytes", "ed25519", @@ -12364,7 +12364,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "lazy_static", "sp-core", @@ -12375,7 +12375,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "futures", "parity-scale-codec", @@ -12389,7 +12389,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12398,7 +12398,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12409,7 +12409,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12427,7 +12427,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "scale-info", @@ -12441,7 +12441,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "sp-api", "sp-core", @@ -12451,7 +12451,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "backtrace", "lazy_static", @@ -12461,7 +12461,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "rustc-hash", "serde", @@ -12471,7 +12471,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "either", "hash256-std-hasher", @@ -12493,7 +12493,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12511,7 +12511,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "Inflector", "proc-macro-crate", @@ -12523,7 +12523,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "serde", "serde_json", @@ -12532,7 +12532,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "scale-info", @@ -12546,7 +12546,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "scale-info", @@ -12559,7 +12559,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "hash-db", "log", @@ -12579,12 +12579,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12597,7 +12597,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "futures-timer", @@ -12612,7 +12612,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "sp-std", @@ -12624,7 +12624,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "sp-api", "sp-runtime", @@ -12633,7 +12633,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "log", @@ -12649,7 +12649,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "ahash 0.8.2", "hash-db", @@ -12672,7 +12672,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "impl-serde", "parity-scale-codec", @@ -12689,7 +12689,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -12700,7 +12700,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -12714,7 +12714,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "parity-scale-codec", "scale-info", @@ -13038,7 +13038,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "platforms 2.0.0", ] @@ -13046,7 +13046,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13065,7 +13065,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "hyper", "log", @@ -13077,7 +13077,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "jsonrpsee", @@ -13090,7 +13090,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "jsonrpsee", "log", @@ -13109,7 +13109,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13135,7 +13135,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13145,7 +13145,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d5d63e9b7f624de321032a033675387a73a66646" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13156,7 +13156,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "ansi_term", "build-helper", @@ -13283,7 +13283,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "frame-support", "polkadot-primitives", @@ -13660,7 +13660,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -13671,7 +13671,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -13801,7 +13801,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#74b2c92066ec3abcb612faa9272f246ae339fab3" +source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", "clap 4.2.5", @@ -14735,7 +14735,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bitvec", "frame-benchmarking", @@ -14827,7 +14827,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "frame-support", "polkadot-primitives", @@ -15329,7 +15329,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "bounded-collections", "derivative", @@ -15345,7 +15345,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "frame-support", "frame-system", @@ -15366,7 +15366,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "environmental", "frame-benchmarking", @@ -15386,7 +15386,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#1d8ccbffd1235d4d1d3a0bf02132d8ea9105078f" +source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs b/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs index f184dfd4ff8..8577dd64703 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs @@ -7,13 +7,13 @@ use frame_support::{ traits::{ConstBool, ConstU32, Nothing}, }; use pallet_contracts::{ - weights::SubstrateWeight, Config, DefaultAddressGenerator, Frame, Schedule, + weights::SubstrateWeight, Config, DebugInfo, DefaultAddressGenerator, Frame, Schedule, }; pub use parachains_common::AVERAGE_ON_INITIALIZE_RATIO; // Prints debug output of the `contracts` pallet to stdout if the node is // started with `-lruntime::contracts=debug`. -pub const CONTRACTS_DEBUG_OUTPUT: bool = true; +pub const CONTRACTS_DEBUG_OUTPUT: DebugInfo = DebugInfo::UnsafeDebug; parameter_types! { pub const DepositPerItem: Balance = deposit(1, 0); diff --git a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 819bb7ba537..adeee2b5229 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -99,6 +99,11 @@ pub type CheckedExtrinsic = generic::CheckedExtrinsic,); +type EventRecord = frame_system::EventRecord< + ::RuntimeEvent, + ::Hash, +>; + /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -532,7 +537,7 @@ impl_runtime_apis! { } } - impl pallet_contracts::ContractsApi for Runtime { + impl pallet_contracts::ContractsApi for Runtime { fn call( origin: AccountId, dest: AccountId, @@ -540,7 +545,7 @@ impl_runtime_apis! { gas_limit: Option, storage_deposit_limit: Option, input_data: Vec, - ) -> pallet_contracts_primitives::ContractExecResult { + ) -> pallet_contracts_primitives::ContractExecResult { let gas_limit = gas_limit.unwrap_or(RuntimeBlockWeights::get().max_block); Contracts::bare_call( origin, @@ -550,6 +555,7 @@ impl_runtime_apis! { storage_deposit_limit, input_data, contracts::CONTRACTS_DEBUG_OUTPUT, + pallet_contracts::CollectEvents::UnsafeCollect, pallet_contracts::Determinism::Enforced, ) } @@ -562,7 +568,7 @@ impl_runtime_apis! { code: pallet_contracts_primitives::Code, data: Vec, salt: Vec, - ) -> pallet_contracts_primitives::ContractInstantiateResult { + ) -> pallet_contracts_primitives::ContractInstantiateResult { let gas_limit = gas_limit.unwrap_or(RuntimeBlockWeights::get().max_block); Contracts::bare_instantiate( origin, @@ -573,6 +579,7 @@ impl_runtime_apis! { data, salt, contracts::CONTRACTS_DEBUG_OUTPUT, + pallet_contracts::CollectEvents::UnsafeCollect, ) } From 72256f66718135ae8605a83514fb847e0fc71a7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 May 2023 17:33:17 +0200 Subject: [PATCH 156/339] Bump tokio from 1.27.0 to 1.28.0 (#2508) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.27.0 to 1.28.0. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.27.0...tokio-1.28.0) --- updated-dependencies: - dependency-name: tokio dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- client/network/Cargo.toml | 2 +- client/pov-recovery/Cargo.toml | 2 +- client/relay-chain-minimal-node/Cargo.toml | 2 +- client/relay-chain-rpc-interface/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b1c04d04368..5de2f027051 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13463,9 +13463,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.27.0" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" dependencies = [ "autocfg", "bytes", @@ -13477,14 +13477,14 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index 4b7793d0cc4..f208d9919ce 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -31,7 +31,7 @@ cumulus-relay-chain-interface = { path = "../relay-chain-interface" } [dev-dependencies] portpicker = "0.1.1" -tokio = { version = "1.27.0", features = ["macros"] } +tokio = { version = "1.28.0", features = ["macros"] } url = "2.3.1" # Substrate diff --git a/client/pov-recovery/Cargo.toml b/client/pov-recovery/Cargo.toml index 542c79d3d78..4bdfc9d60aa 100644 --- a/client/pov-recovery/Cargo.toml +++ b/client/pov-recovery/Cargo.toml @@ -31,7 +31,7 @@ cumulus-relay-chain-interface = {path = "../relay-chain-interface"} async-trait = "0.1.68" [dev-dependencies] -tokio = { version = "1.27.0", features = ["macros"] } +tokio = { version = "1.28.0", features = ["macros"] } portpicker = "0.1.1" # Cumulus diff --git a/client/relay-chain-minimal-node/Cargo.toml b/client/relay-chain-minimal-node/Cargo.toml index ff8d8bc11d3..17ad78f3c85 100644 --- a/client/relay-chain-minimal-node/Cargo.toml +++ b/client/relay-chain-minimal-node/Cargo.toml @@ -42,4 +42,4 @@ lru = "0.9" tracing = "0.1.37" async-trait = "0.1.68" futures = "0.3.28" -tokio = { version = "1.27.0", features = ["macros"] } +tokio = { version = "1.28.0", features = ["macros"] } diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index 655c7c8e74c..6380abe066d 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -21,7 +21,7 @@ sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "mas sc-rpc-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } -tokio = { version = "1.27.0", features = ["sync"] } +tokio = { version = "1.28.0", features = ["sync"] } futures = "0.3.28" futures-timer = "3.0.2" diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index fafae12aedb..d2fe1baa99e 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -96,7 +96,7 @@ substrate-build-script-utils = { git = "https://github.com/paritytech/substrate" assert_cmd = "2.0" nix = { version = "0.26.1", features = ["signal"] } tempfile = "3.5.0" -tokio = { version = "1.27.0", features = ["macros", "time", "parking_lot"] } +tokio = { version = "1.28.0", features = ["macros", "time", "parking_lot"] } wait-timeout = "0.2" # purge_chain_works works with rococo-local and needs to allow this polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master", features = ["rococo-native"] } diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index f04632b3c20..f38a7aa6f5d 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -16,7 +16,7 @@ criterion = { version = "0.4.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" serde = { version = "1.0.160", features = ["derive"] } -tokio = { version = "1.27.0", features = ["macros"] } +tokio = { version = "1.28.0", features = ["macros"] } tracing = "0.1.37" url = "2.3.1" From ee82e3f55bac12fc2fe707321d8fc83d74004cfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 May 2023 21:25:27 +0000 Subject: [PATCH 157/339] Bump clap from 4.2.5 to 4.2.7 (#2516) Bumps [clap](https://github.com/clap-rs/clap) from 4.2.5 to 4.2.7. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v4.2.5...v4.2.7) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 26 +++++++++++++------------- client/cli/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5de2f027051..7b17274e8b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1261,9 +1261,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.2.5" +version = "4.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a1f23fa97e1d1641371b51f35535cb26959b8e27ab50d167a8b996b5bada819" +checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" dependencies = [ "clap_builder", "clap_derive", @@ -1272,9 +1272,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.2.5" +version = "4.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdc5d93c358224b4d6867ef1356d740de2303e9892edc06c5340daeccd96bab" +checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" dependencies = [ "anstream", "anstyle 1.0.0", @@ -1908,7 +1908,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.2.5", + "clap 4.2.7", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -2551,7 +2551,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.2.5", + "clap 4.2.7", "criterion", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -3509,7 +3509,7 @@ dependencies = [ "Inflector", "array-bytes 4.2.0", "chrono", - "clap 4.2.5", + "clap 4.2.7", "comfy-table", "frame-benchmarking", "frame-support", @@ -7372,7 +7372,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.2.5", + "clap 4.2.7", "color-print", "cumulus-client-cli", "cumulus-client-consensus-aura", @@ -7966,7 +7966,7 @@ name = "polkadot-cli" version = "0.9.41" source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" dependencies = [ - "clap 4.2.5", + "clap 4.2.7", "frame-benchmarking-cli", "futures", "log", @@ -8658,7 +8658,7 @@ dependencies = [ "bridge-hub-kusama-runtime", "bridge-hub-polkadot-runtime", "bridge-hub-rococo-runtime", - "clap 4.2.5", + "clap 4.2.7", "collectives-polkadot-runtime", "color-print", "contracts-rococo-runtime", @@ -10446,7 +10446,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222 dependencies = [ "array-bytes 4.2.0", "chrono", - "clap 4.2.5", + "clap 4.2.7", "fdlimit", "futures", "libp2p", @@ -11305,7 +11305,7 @@ name = "sc-storage-monitor" version = "0.1.0" source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ - "clap 4.2.5", + "clap 4.2.7", "fs4", "futures", "log", @@ -13804,7 +13804,7 @@ version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" dependencies = [ "async-trait", - "clap 4.2.5", + "clap 4.2.7", "frame-remote-externalities", "frame-try-runtime", "hex", diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index b6a8804a4a4..4aa1cfca298 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -clap = { version = "4.2.3", features = ["derive"] } +clap = { version = "4.2.7", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.3.1" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index 6b350d6ba0f..a1734127c11 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" build = "build.rs" [dependencies] -clap = { version = "4.2.3", features = ["derive"] } +clap = { version = "4.2.7", features = ["derive"] } log = "0.4.17" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.160", features = ["derive"] } diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index d2fe1baa99e..7dc9d6e27f0 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -12,7 +12,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.2.3", features = ["derive"] } +clap = { version = "4.2.7", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index f38a7aa6f5d..d36ae55688d 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -10,7 +10,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.2.3", features = ["derive"] } +clap = { version = "4.2.7", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.4.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } From 9e1afcafb580b77379bebb60bb823f05c9ef8a16 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 4 May 2023 08:36:58 +0200 Subject: [PATCH 158/339] Initial version of bridging pallets as git subtree (#2458) * Initial version of bridges pallet as subtree of https://github.com/paritytech/parity-bridges-common Added `Bridges subtree files` pr review rule * Squashed 'bridges/' content from commit d30927c08 git-subtree-dir: bridges git-subtree-split: d30927c089bd9e73092d1ec1a62895603cb277a3 * Updated REAMDE.md and BRIDGES.md (inspired by original https://github.com/paritytech/polkadot/blob/d22eb62fe40e55e15eb91d375f48cc540d83a47e/BRIDGES.md) * Squashed 'bridges/' changes from d30927c08..d3970944b d3970944b Small simplifications (#2050) git-subtree-dir: bridges git-subtree-split: d3970944b0cfc4ea5226225e1ca07dab234c3556 * Squashed 'bridges/' changes from d3970944b..2180797fb 2180797fb Removed CODEOWNERS (#2051) git-subtree-dir: bridges git-subtree-split: 2180797fbf8a990490c67853dcffd81bc8dd083c * Squashed 'bridges/' changes from 2180797fbf..4850aac8ce 4850aac8ce Removed relayer_account: &AccountId from MessageDispatch (#2080) 8c8adafd54 Revert "Fix max-size messages at test chains (#2064)" (#2077) c01a63efd8 Fixed off-by-one when confirming rewards in messages pallet (#2075) a298be96aa Update subxt dependencies (#2072) c0eef51eab Fix max-size messages at test chains (#2064) 3a658e3697 Messages relay fixes (#2073) 0022b5ab22 Slash relayers for invalid transactions (#2025) 198104007f Bump enumflags2 from 0.7.5 to 0.7.7 9229b257e5 [ci] Fix rules for docker build (#2069) 660d791390 [ci] Update buildah command and version (#2058) e4535c0ca4 fix the way latest_confirmed_nonce_at_source is "calculated" (#2067) dbc2d37590 select nothing if we have already selected nonces to submit or have submitted something (#2065) a7eedd21fe [relay-substrate-client] Bump jsonrpsee (#2066) 8875d5aeae Bump clap from 4.2.2 to 4.2.4 25f9cf55e2 Another use of RangeInclusiveExt::checked_len() (#2060) 4942c12a5f submit lane unblock transactions from relay (#2030) c0325d3c9c Test deployments fixes (#2057) fc7b9b7ed7 Use the new matrix server (#2056) 63bcb5c10b Fixed delivery alert rule (#2052) git-subtree-dir: bridges git-subtree-split: 4850aac8ce6c34e5ca6246b88cd14c873a879cba * Squashed 'bridges/' changes from 4850aac8ce..66aaf0dd23 66aaf0dd23 Nits (#2083) git-subtree-dir: bridges git-subtree-split: 66aaf0dd239dde40b64264061a77c921e2c82568 * Squashed 'bridges/' changes from 66aaf0dd23..557ecbcecc 557ecbcecc Fix sized messages (Follow-up on #2064) (#2103) 54f587a066 Add weight of refund extension post_dispatch to the weights of messages pallet (#2089) 5b1626f8c4 fix pallet param for nightly benchmarks check (#2099) ae44c6b7a1 Add millau specific messages weights (#2097) 6ad0bd1f1e Add integrity tests to rialto parachain runtiime (#2096) 6919556de5 Bump tokio from 1.27.0 to 1.28.0 58795fcb75 Bump clap from 4.2.4 to 4.2.5 01bf31085b Bump scale-info from 2.5.0 to 2.6.0 8fe383240d Bump anyhow from 1.0.70 to 1.0.71 8d94e82ad5 deployments: add new BEEFY metrics and alarms (#2090) e9a4749e7e Bump wasmtime from 6.0.1 to 6.0.2 9d9936c0d9 Bump wasmtime from 6.0.1 to 6.0.2 in /tools/runtime-codegen 5d77cd7bee Add more logs to relayer and message pallets (#2082) 75fbb9d3ef Update comment (#2081) 9904d09cf6 Benchmarks for new relayers pallet calls (#2040) git-subtree-dir: bridges git-subtree-split: 557ecbcecc585547b744a5ac9fb8d7f3b9de4521 * fmt * Squashed 'bridges/' changes from 557ecbcecc..04b3dda6aa 04b3dda6aa Remove from subtree (#2111) f8ff15e7e7 Add `MessagesPalletInstance` for integrity tests (#2107) 92ccef58e6 Use generated runtimes for BHR/BHW (#2106) b33e0a585b Fix comment (#2105) git-subtree-dir: bridges git-subtree-split: 04b3dda6aa38599e612ff637710b6d2cff275ef3 * ".git/.scripts/commands/fmt/fmt.sh" --------- Co-authored-by: parity-processbot <> --- .github/pr-custom-review.yml | 10 +- BRIDGES.md | 88 + Cargo.lock | 333 ++- Cargo.toml | 5 + bridges/.gitignore | 26 + bridges/CODE_OF_CONDUCT.md | 80 + bridges/LICENSE | 675 ++++++ bridges/README.md | 259 ++ bridges/SECURITY.md | 14 + bridges/bin/runtime-common/Cargo.toml | 92 + bridges/bin/runtime-common/src/integrity.rs | 361 +++ bridges/bin/runtime-common/src/lib.rs | 259 ++ bridges/bin/runtime-common/src/messages.rs | 779 ++++++ .../bin/runtime-common/src/messages_api.rs | 66 + .../src/messages_benchmarking.rs | 293 +++ .../runtime-common/src/messages_call_ext.rs | 644 +++++ .../runtime-common/src/messages_generation.rs | 119 + .../src/messages_xcm_extension.rs | 152 ++ bridges/bin/runtime-common/src/mock.rs | 424 ++++ .../src/parachains_benchmarking.rs | 88 + .../runtime-common/src/priority_calculator.rs | 201 ++ .../src/refund_relayer_extension.rs | 1730 +++++++++++++ bridges/docs/complex-relay.html | 85 + bridges/docs/grandpa-finality-relay.html | 47 + bridges/docs/high-level-overview.md | 181 ++ bridges/docs/messages-relay.html | 78 + bridges/docs/parachains-finality-relay.html | 55 + .../docs/polkadot-kusama-bridge-overview.md | 132 + bridges/docs/polkadot-kusama-bridge.html | 67 + bridges/modules/grandpa/Cargo.toml | 63 + bridges/modules/grandpa/README.md | 101 + bridges/modules/grandpa/src/benchmarking.rs | 141 ++ bridges/modules/grandpa/src/call_ext.rs | 311 +++ bridges/modules/grandpa/src/lib.rs | 1427 +++++++++++ bridges/modules/grandpa/src/mock.rs | 151 ++ bridges/modules/grandpa/src/storage_types.rs | 136 ++ bridges/modules/grandpa/src/weights.rs | 167 ++ bridges/modules/messages/Cargo.toml | 56 + bridges/modules/messages/README.md | 242 ++ bridges/modules/messages/src/benchmarking.rs | 460 ++++ bridges/modules/messages/src/inbound_lane.rs | 556 +++++ bridges/modules/messages/src/lib.rs | 2152 +++++++++++++++++ bridges/modules/messages/src/mock.rs | 503 ++++ bridges/modules/messages/src/outbound_lane.rs | 433 ++++ bridges/modules/messages/src/weights.rs | 525 ++++ bridges/modules/messages/src/weights_ext.rs | 487 ++++ bridges/modules/parachains/Cargo.toml | 60 + bridges/modules/parachains/README.md | 90 + .../modules/parachains/src/benchmarking.rs | 116 + bridges/modules/parachains/src/call_ext.rs | 243 ++ bridges/modules/parachains/src/lib.rs | 1609 ++++++++++++ bridges/modules/parachains/src/mock.rs | 349 +++ bridges/modules/parachains/src/weights.rs | 273 +++ bridges/modules/parachains/src/weights_ext.rs | 107 + bridges/modules/relayers/Cargo.toml | 59 + bridges/modules/relayers/README.md | 14 + bridges/modules/relayers/src/benchmarking.rs | 131 + bridges/modules/relayers/src/lib.rs | 880 +++++++ bridges/modules/relayers/src/mock.rs | 185 ++ .../modules/relayers/src/payment_adapter.rs | 158 ++ bridges/modules/relayers/src/stake_adapter.rs | 186 ++ bridges/modules/relayers/src/weights.rs | 259 ++ bridges/modules/relayers/src/weights_ext.rs | 49 + .../chain-bridge-hub-cumulus/Cargo.toml | 37 + .../chain-bridge-hub-cumulus/src/lib.rs | 216 ++ .../chain-bridge-hub-kusama/Cargo.toml | 31 + .../chain-bridge-hub-kusama/src/lib.rs | 84 + .../chain-bridge-hub-polkadot/Cargo.toml | 32 + .../chain-bridge-hub-polkadot/src/lib.rs | 75 + .../chain-bridge-hub-rococo/Cargo.toml | 31 + .../chain-bridge-hub-rococo/src/lib.rs | 82 + .../chain-bridge-hub-wococo/Cargo.toml | 32 + .../chain-bridge-hub-wococo/src/lib.rs | 72 + bridges/primitives/chain-kusama/Cargo.toml | 30 + bridges/primitives/chain-kusama/src/lib.rs | 65 + bridges/primitives/chain-polkadot/Cargo.toml | 30 + bridges/primitives/chain-polkadot/src/lib.rs | 65 + bridges/primitives/chain-rococo/Cargo.toml | 30 + bridges/primitives/chain-rococo/src/lib.rs | 76 + bridges/primitives/chain-wococo/Cargo.toml | 32 + bridges/primitives/chain-wococo/src/lib.rs | 65 + bridges/primitives/header-chain/Cargo.toml | 45 + .../header-chain/src/justification.rs | 390 +++ bridges/primitives/header-chain/src/lib.rs | 227 ++ .../header-chain/src/storage_keys.rs | 104 + .../tests/implementation_match.rs | 418 ++++ .../header-chain/tests/justification.rs | 280 +++ bridges/primitives/messages/Cargo.toml | 38 + bridges/primitives/messages/src/lib.rs | 484 ++++ .../primitives/messages/src/source_chain.rs | 211 ++ .../primitives/messages/src/storage_keys.rs | 128 + .../primitives/messages/src/target_chain.rs | 200 ++ bridges/primitives/parachains/Cargo.toml | 39 + bridges/primitives/parachains/src/lib.rs | 180 ++ bridges/primitives/polkadot-core/Cargo.toml | 45 + bridges/primitives/polkadot-core/src/lib.rs | 292 +++ .../polkadot-core/src/parachains.rs | 98 + bridges/primitives/relayers/Cargo.toml | 36 + bridges/primitives/relayers/src/lib.rs | 206 ++ .../primitives/relayers/src/registration.rs | 121 + bridges/primitives/runtime/Cargo.toml | 49 + bridges/primitives/runtime/src/chain.rs | 375 +++ bridges/primitives/runtime/src/extensions.rs | 144 ++ bridges/primitives/runtime/src/lib.rs | 573 +++++ bridges/primitives/runtime/src/messages.rs | 35 + .../primitives/runtime/src/storage_proof.rs | 272 +++ .../primitives/runtime/src/storage_types.rs | 90 + bridges/primitives/test-utils/Cargo.toml | 29 + bridges/primitives/test-utils/src/keyring.rs | 94 + bridges/primitives/test-utils/src/lib.rs | 302 +++ bridges/rustfmt.toml | 24 + bridges/scripts/verify-pallets-build.sh | 135 ++ client/network/src/lib.rs | 6 +- scripts/bridges_update_subtree.sh | 85 + 114 files changed, 26856 insertions(+), 6 deletions(-) create mode 100644 BRIDGES.md create mode 100644 bridges/.gitignore create mode 100644 bridges/CODE_OF_CONDUCT.md create mode 100644 bridges/LICENSE create mode 100644 bridges/README.md create mode 100644 bridges/SECURITY.md create mode 100644 bridges/bin/runtime-common/Cargo.toml create mode 100644 bridges/bin/runtime-common/src/integrity.rs create mode 100644 bridges/bin/runtime-common/src/lib.rs create mode 100644 bridges/bin/runtime-common/src/messages.rs create mode 100644 bridges/bin/runtime-common/src/messages_api.rs create mode 100644 bridges/bin/runtime-common/src/messages_benchmarking.rs create mode 100644 bridges/bin/runtime-common/src/messages_call_ext.rs create mode 100644 bridges/bin/runtime-common/src/messages_generation.rs create mode 100644 bridges/bin/runtime-common/src/messages_xcm_extension.rs create mode 100644 bridges/bin/runtime-common/src/mock.rs create mode 100644 bridges/bin/runtime-common/src/parachains_benchmarking.rs create mode 100644 bridges/bin/runtime-common/src/priority_calculator.rs create mode 100644 bridges/bin/runtime-common/src/refund_relayer_extension.rs create mode 100644 bridges/docs/complex-relay.html create mode 100644 bridges/docs/grandpa-finality-relay.html create mode 100644 bridges/docs/high-level-overview.md create mode 100644 bridges/docs/messages-relay.html create mode 100644 bridges/docs/parachains-finality-relay.html create mode 100644 bridges/docs/polkadot-kusama-bridge-overview.md create mode 100644 bridges/docs/polkadot-kusama-bridge.html create mode 100644 bridges/modules/grandpa/Cargo.toml create mode 100644 bridges/modules/grandpa/README.md create mode 100644 bridges/modules/grandpa/src/benchmarking.rs create mode 100644 bridges/modules/grandpa/src/call_ext.rs create mode 100644 bridges/modules/grandpa/src/lib.rs create mode 100644 bridges/modules/grandpa/src/mock.rs create mode 100644 bridges/modules/grandpa/src/storage_types.rs create mode 100644 bridges/modules/grandpa/src/weights.rs create mode 100644 bridges/modules/messages/Cargo.toml create mode 100644 bridges/modules/messages/README.md create mode 100644 bridges/modules/messages/src/benchmarking.rs create mode 100644 bridges/modules/messages/src/inbound_lane.rs create mode 100644 bridges/modules/messages/src/lib.rs create mode 100644 bridges/modules/messages/src/mock.rs create mode 100644 bridges/modules/messages/src/outbound_lane.rs create mode 100644 bridges/modules/messages/src/weights.rs create mode 100644 bridges/modules/messages/src/weights_ext.rs create mode 100644 bridges/modules/parachains/Cargo.toml create mode 100644 bridges/modules/parachains/README.md create mode 100644 bridges/modules/parachains/src/benchmarking.rs create mode 100644 bridges/modules/parachains/src/call_ext.rs create mode 100644 bridges/modules/parachains/src/lib.rs create mode 100644 bridges/modules/parachains/src/mock.rs create mode 100644 bridges/modules/parachains/src/weights.rs create mode 100644 bridges/modules/parachains/src/weights_ext.rs create mode 100644 bridges/modules/relayers/Cargo.toml create mode 100644 bridges/modules/relayers/README.md create mode 100644 bridges/modules/relayers/src/benchmarking.rs create mode 100644 bridges/modules/relayers/src/lib.rs create mode 100644 bridges/modules/relayers/src/mock.rs create mode 100644 bridges/modules/relayers/src/payment_adapter.rs create mode 100644 bridges/modules/relayers/src/stake_adapter.rs create mode 100644 bridges/modules/relayers/src/weights.rs create mode 100644 bridges/modules/relayers/src/weights_ext.rs create mode 100644 bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml create mode 100644 bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs create mode 100644 bridges/primitives/chain-bridge-hub-kusama/Cargo.toml create mode 100644 bridges/primitives/chain-bridge-hub-kusama/src/lib.rs create mode 100644 bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml create mode 100644 bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs create mode 100644 bridges/primitives/chain-bridge-hub-rococo/Cargo.toml create mode 100644 bridges/primitives/chain-bridge-hub-rococo/src/lib.rs create mode 100644 bridges/primitives/chain-bridge-hub-wococo/Cargo.toml create mode 100644 bridges/primitives/chain-bridge-hub-wococo/src/lib.rs create mode 100644 bridges/primitives/chain-kusama/Cargo.toml create mode 100644 bridges/primitives/chain-kusama/src/lib.rs create mode 100644 bridges/primitives/chain-polkadot/Cargo.toml create mode 100644 bridges/primitives/chain-polkadot/src/lib.rs create mode 100644 bridges/primitives/chain-rococo/Cargo.toml create mode 100644 bridges/primitives/chain-rococo/src/lib.rs create mode 100644 bridges/primitives/chain-wococo/Cargo.toml create mode 100644 bridges/primitives/chain-wococo/src/lib.rs create mode 100644 bridges/primitives/header-chain/Cargo.toml create mode 100644 bridges/primitives/header-chain/src/justification.rs create mode 100644 bridges/primitives/header-chain/src/lib.rs create mode 100644 bridges/primitives/header-chain/src/storage_keys.rs create mode 100644 bridges/primitives/header-chain/tests/implementation_match.rs create mode 100644 bridges/primitives/header-chain/tests/justification.rs create mode 100644 bridges/primitives/messages/Cargo.toml create mode 100644 bridges/primitives/messages/src/lib.rs create mode 100644 bridges/primitives/messages/src/source_chain.rs create mode 100644 bridges/primitives/messages/src/storage_keys.rs create mode 100644 bridges/primitives/messages/src/target_chain.rs create mode 100644 bridges/primitives/parachains/Cargo.toml create mode 100644 bridges/primitives/parachains/src/lib.rs create mode 100644 bridges/primitives/polkadot-core/Cargo.toml create mode 100644 bridges/primitives/polkadot-core/src/lib.rs create mode 100644 bridges/primitives/polkadot-core/src/parachains.rs create mode 100644 bridges/primitives/relayers/Cargo.toml create mode 100644 bridges/primitives/relayers/src/lib.rs create mode 100644 bridges/primitives/relayers/src/registration.rs create mode 100644 bridges/primitives/runtime/Cargo.toml create mode 100644 bridges/primitives/runtime/src/chain.rs create mode 100644 bridges/primitives/runtime/src/extensions.rs create mode 100644 bridges/primitives/runtime/src/lib.rs create mode 100644 bridges/primitives/runtime/src/messages.rs create mode 100644 bridges/primitives/runtime/src/storage_proof.rs create mode 100644 bridges/primitives/runtime/src/storage_types.rs create mode 100644 bridges/primitives/test-utils/Cargo.toml create mode 100644 bridges/primitives/test-utils/src/keyring.rs create mode 100644 bridges/primitives/test-utils/src/lib.rs create mode 100644 bridges/rustfmt.toml create mode 100755 bridges/scripts/verify-pallets-build.sh create mode 100755 scripts/bridges_update_subtree.sh diff --git a/.github/pr-custom-review.yml b/.github/pr-custom-review.yml index f8c887c5f4a..b833d3a01aa 100644 --- a/.github/pr-custom-review.yml +++ b/.github/pr-custom-review.yml @@ -19,12 +19,20 @@ rules: check_type: changed_files condition: include: .* - # excluding files from 'Runtime files' and 'CI files' rules + # excluding files from 'Runtime files' and 'CI files' rules and `Bridges subtree files` exclude: ^parachains/runtimes/assets/(statemine|statemint)/src/[^/]+\.rs$|^parachains/runtimes/bridge-hubs/(bridge-hub-kusama|bridge-hub-polkadot)/src/[^/]+\.rs$|^parachains/runtimes/collectives/collectives-polkadot/src/[^/]+\.rs$|^parachains/common/src/[^/]+\.rs$|^\.gitlab-ci\.yml|^scripts/ci/.*|^\.github/.* min_approvals: 2 teams: - core-devs + # if there are any changes in the bridges subtree (in case of backport changes back to bridges repo) + - name: Bridges subtree files + check_type: changed_files + condition: ^bridges/.* + min_approvals: 1 + teams: + - bridges-core + - name: CI files check_type: changed_files condition: diff --git a/BRIDGES.md b/BRIDGES.md new file mode 100644 index 00000000000..a9fff624cdc --- /dev/null +++ b/BRIDGES.md @@ -0,0 +1,88 @@ +# Using Parity Bridges Common dependency (`git subtree`). + +In `./bridges` sub-directory you can find a `git subtree` imported version of: +[parity-bridges-common](https://github.com/paritytech/parity-bridges-common/) repository. + +(For regular Cumulus contributor 1. is relevant) \ +(For Cumulus maintainer 1. and 2. are relevant) \ +(For Bridges team 1. and 2. and 3. are relevant) + +# 1. How to fix broken Bridges code? + +To fix Bridges code simply create a commit in current (`Cumulus`) repo. Best if +the commit is isolated to changes in `./bridges` sub-directory, because it makes +it easier to import that change back to upstream repo. + +(Any changes to `bridges` subtree require Bridges team approve and they should manage backport to Bridges repo) + + +# 2. How to pull latest Bridges code to the `bridges` subtree +(in practice) +``` +cd + +# this will update new git branches from bridges repo +# there could be unresolved conflicts, but dont worry, +# lots of them are caused because of removed unneeded files with patch step, +./scripts/bridges_update_subtree.sh fetch + +# so, after fetch and before solving conflicts just run patch, +# this will remove unneeded files and checks if subtree modules compiles +./scripts/bridges_update_subtree.sh patch + +# if there are conflicts, this could help, +# this removes locally deleted files at least (move changes to git stash for commit) +./scripts/bridges_update_subtree.sh merge + +# (optional) when conflicts resolved, you can check build again - should pass +# also important: this updates global Cargo.lock +./scripts/bridges_update_subtree.sh patch + +# add changes to the commit, first command `fetch` starts merge, +# so after all conflicts are solved and patch passes and compiles, +# then we need to finish merge with: +git merge --continue +```` + +# 3. How to pull latest Bridges code or contribute back? +(in theory) + +Note that it's totally fine to ping the **Bridges Team** to do that for you. The point +of adding the code as `git subtree` is to **reduce maintenance cost** for Cumulus/Polkadot +developers. + +If you still would like to either update the code to match latest code from the repo +or create an upstream PR read below. The following commands should be run in the +current (`polkadot`) repo. + +1. Add Bridges repo as a local remote: +``` +$ git remote add -f bridges git@github.com:paritytech/parity-bridges-common.git +``` + +If you plan to contribute back, consider forking the repository on Github and adding +your personal fork as a remote as well. +``` +$ git remote add -f my-bridges git@github.com:tomusdrw/parity-bridges-common.git +``` + +2. To update Bridges: +``` +$ git fetch bridges master +$ git subtree pull --prefix=bridges bridges master --squash +```` + +We use `--squash` to avoid adding individual commits and rather squashing them +all into one. + +3. Clean unneeded files here: +``` +./bridges/scripts/verify-pallets-build.sh --ignore-git-state --no-revert +``` + +4. Contributing back to Bridges (creating upstream PR) +``` +$ git subtree push --prefix=bridges my-bridges master +``` +This command will push changes to your personal fork of Bridges repo, from where +you can simply create a PR to the main repo. diff --git a/Cargo.lock b/Cargo.lock index 7b17274e8b2..390402ce88a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -758,6 +758,125 @@ dependencies = [ "thiserror", ] +[[package]] +name = "bp-header-chain" +version = "0.1.0" +dependencies = [ + "bp-runtime", + "bp-test-utils", + "finality-grandpa", + "frame-support", + "hex", + "hex-literal 0.4.1", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "bp-messages" +version = "0.1.0" +dependencies = [ + "bp-runtime", + "frame-support", + "hex", + "hex-literal 0.4.1", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-std", +] + +[[package]] +name = "bp-parachains" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "bp-polkadot-core" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-runtime", + "frame-support", + "frame-system", + "hex", + "parity-scale-codec", + "parity-util-mem", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "bp-relayers" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-runtime", + "frame-support", + "hex", + "hex-literal 0.4.1", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "bp-runtime" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "hash-db", + "hex-literal 0.4.1", + "impl-trait-for-tuples", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "trie-db", +] + +[[package]] +name = "bp-test-utils" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "ed25519-dalek", + "finality-grandpa", + "parity-scale-codec", + "sp-application-crypto", + "sp-consensus-grandpa", + "sp-runtime", + "sp-std", +] + [[package]] name = "bridge-hub-kusama-runtime" version = "0.1.0" @@ -954,6 +1073,43 @@ dependencies = [ "asset-test-utils", ] +[[package]] +name = "bridge-runtime-common" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-relayers", + "bp-runtime", + "bp-test-utils", + "frame-support", + "frame-system", + "hash-db", + "log", + "pallet-balances", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-bridge-relayers", + "pallet-transaction-payment", + "pallet-utility", + "pallet-xcm", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-trie", + "static_assertions", + "xcm", + "xcm-builder", + "xcm-executor", +] + [[package]] name = "bs58" version = "0.4.0" @@ -3223,6 +3379,33 @@ dependencies = [ "libc", ] +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-rlp", + "impl-serde", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-rlp", + "impl-serde", + "primitive-types", + "uint", +] + [[package]] name = "event-listener" version = "2.5.1" @@ -4389,6 +4572,15 @@ dependencies = [ "parity-scale-codec", ] +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + [[package]] name = "impl-serde" version = "0.4.0" @@ -6413,6 +6605,94 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-bridge-grandpa" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-runtime", + "bp-test-utils", + "finality-grandpa", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-trie", +] + +[[package]] +name = "pallet-bridge-messages" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-runtime", + "bp-test-utils", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "num-traits", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-bridge-parachains" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-parachains", + "bp-polkadot-core", + "bp-runtime", + "bp-test-utils", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-bridge-grandpa", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-trie", +] + +[[package]] +name = "pallet-bridge-relayers" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-relayers", + "bp-runtime", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "pallet-bridge-messages", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" @@ -7557,6 +7837,35 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" +[[package]] +name = "parity-util-mem" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d32c34f4f5ca7f9196001c0aba5a1f9a5a12382c8944b8b0f90233282d1e8f8" +dependencies = [ + "cfg-if", + "ethereum-types", + "hashbrown 0.12.3", + "impl-trait-for-tuples", + "lru 0.8.1", + "parity-util-mem-derive", + "parking_lot 0.12.1", + "primitive-types", + "smallvec", + "winapi", +] + +[[package]] +name = "parity-util-mem-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" +dependencies = [ + "proc-macro2", + "syn 1.0.109", + "synstructure", +] + [[package]] name = "parity-wasm" version = "0.45.0" @@ -9408,6 +9717,7 @@ checksum = "5cfd65aea0c5fa0bfcc7c9e7ca828c921ef778f43d325325ec84bda371bfa75a" dependencies = [ "fixed-hash", "impl-codec", + "impl-rlp", "impl-serde", "scale-info", "uint", @@ -9941,6 +10251,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + [[package]] name = "rocksdb" version = "0.20.1" @@ -13436,6 +13756,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -13726,9 +14055,9 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.27.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d75c77ea43f2ad8ea9d9c58de49dfc9c3995bdef32b503df7883ff054e7f1" +checksum = "767abe6ffed88a1889671a102c2861ae742726f52e0a5a425b92c9fbfa7e9c85" dependencies = [ "hash-db", "hashbrown 0.13.2", diff --git a/Cargo.toml b/Cargo.toml index cdcf4730f72..4ceb8d5c04a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,11 @@ resolver = "2" members = [ + "bridges/bin/runtime-common", + "bridges/modules/grandpa", + "bridges/modules/messages", + "bridges/modules/parachains", + "bridges/modules/relayers", "client/cli", "client/consensus/aura", "client/consensus/common", diff --git a/bridges/.gitignore b/bridges/.gitignore new file mode 100644 index 00000000000..5d10cfa41a4 --- /dev/null +++ b/bridges/.gitignore @@ -0,0 +1,26 @@ +**/target/ +**/.env +**/.env2 +**/rust-toolchain +hfuzz_target +hfuzz_workspace +**/Cargo.lock + +**/*.rs.bk + +*.o +*.so +*.rlib +*.dll +.gdb_history + +*.exe + +.DS_Store + +.cargo +.idea +.vscode +*.iml +*.swp +*.swo diff --git a/bridges/CODE_OF_CONDUCT.md b/bridges/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..70541fb72fa --- /dev/null +++ b/bridges/CODE_OF_CONDUCT.md @@ -0,0 +1,80 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers +pledge to making participation in our project and our community a harassment-free experience for +everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity +and expression, level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit + permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +### Facilitation, Not Strongarming + +We recognise that this software is merely a tool for users to create and maintain their blockchain +of preference. We see that blockchains are naturally community platforms with users being the +ultimate decision makers. We assert that good software will maximise user agency by facilitate +user-expression on the network. As such: + +- This project will strive to give users as much choice as is both reasonable and possible over what + protocol they adhere to; but +- use of the project's technical forums, commenting systems, pull requests and issue trackers as a + means to express individual protocol preferences is forbidden. + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are +expected to take appropriate and fair corrective action in response to any instances of unacceptable +behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, +code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or +to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is +representing the project or its community. Examples of representing a project or community include +using an official project e-mail address, posting via an official social media account, or acting as +an appointed representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting +the project team at admin@parity.io. All complaints will be reviewed and investigated and will +result in a response that is deemed necessary and appropriate to the circumstances. The project team +is obligated to maintain confidentiality with regard to the reporter of an incident. Further +details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face +temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at +https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/bridges/LICENSE b/bridges/LICENSE new file mode 100644 index 00000000000..733c072369c --- /dev/null +++ b/bridges/LICENSE @@ -0,0 +1,675 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/bridges/README.md b/bridges/README.md new file mode 100644 index 00000000000..aab6007d2cd --- /dev/null +++ b/bridges/README.md @@ -0,0 +1,259 @@ +# Parity Bridges Common + +This is a collection of components for building bridges. + +These components include Substrate pallets for syncing headers, passing arbitrary messages, as well +as libraries for building relayers to provide cross-chain communication capabilities. + +Three bridge nodes are also available. The nodes can be used to run test networks which bridge other +Substrate chains. + +🚧 The bridges are currently under construction - a hardhat is recommended beyond this point 🚧 + +## Contents + +- [Installation](#installation) +- [High-Level Architecture](#high-level-architecture) +- [Project Layout](#project-layout) +- [Running the Bridge](#running-the-bridge) +- [How to send a message](#how-to-send-a-message) +- [Community](#community) + +## Installation + +To get up and running you need both stable and nightly Rust. Rust nightly is used to build the Web +Assembly (WASM) runtime for the node. You can configure the WASM support as so: + +```bash +rustup install nightly +rustup target add wasm32-unknown-unknown --toolchain nightly +``` + +Once this is configured you can build and test the repo as follows: + +``` +git clone https://github.com/paritytech/parity-bridges-common.git +cd parity-bridges-common +cargo build --all +cargo test --all +``` + +Also you can build the repo with +[Parity CI Docker image](https://github.com/paritytech/scripts/tree/master/dockerfiles/bridges-ci): + +```bash +docker pull paritytech/bridges-ci:production +mkdir ~/cache +chown 1000:1000 ~/cache #processes in the container runs as "nonroot" user with UID 1000 +docker run --rm -it -w /shellhere/parity-bridges-common \ + -v /home/$(whoami)/cache/:/cache/ \ + -v "$(pwd)":/shellhere/parity-bridges-common \ + -e CARGO_HOME=/cache/cargo/ \ + -e SCCACHE_DIR=/cache/sccache/ \ + -e CARGO_TARGET_DIR=/cache/target/ paritytech/bridges-ci:production cargo build --all +#artifacts can be found in ~/cache/target +``` + +If you want to reproduce other steps of CI process you can use the following +[guide](https://github.com/paritytech/scripts#reproduce-ci-locally). + +If you need more information about setting up your development environment [Substrate's +Installation page](https://docs.substrate.io/main-docs/install/) is a good +resource. + +## High-Level Architecture + +This repo has support for bridging foreign chains together using a combination of Substrate pallets +and external processes called relayers. A bridge chain is one that is able to follow the consensus +of a foreign chain independently. For example, consider the case below where we want to bridge two +Substrate based chains. + +``` ++---------------+ +---------------+ +| | | | +| Rialto | | Millau | +| | | | ++-------+-------+ +-------+-------+ + ^ ^ + | +---------------+ | + | | | | + +-----> | Bridge Relay | <-------+ + | | + +---------------+ +``` + +The Millau chain must be able to accept Rialto headers and verify their integrity. It does this by +using a runtime module designed to track GRANDPA finality. Since two blockchains can't interact +directly they need an external service, called a relayer, to communicate. The relayer will subscribe +to new Rialto headers via RPC and submit them to the Millau chain for verification. + +Take a look at [Bridge High Level Documentation](./docs/high-level-overview.md) for more in-depth +description of the bridge interaction. + +## Project Layout + +Here's an overview of how the project is laid out. The main bits are the `bin`, which is the actual +"blockchain", the `modules` which are used to build the blockchain's logic (a.k.a the runtime) and +the `relays` which are used to pass messages between chains. + +``` +├── bin // Node and Runtime for the various Substrate chains +│ └── ... +├── deployments // Useful tools for deploying test networks +│ └── ... +├── modules // Substrate Runtime Modules (a.k.a Pallets) +│ ├── beefy // On-Chain BEEFY Light Client (in progress) +│ ├── grandpa // On-Chain GRANDPA Light Client +│ ├── messages // Cross Chain Message Passing +│ ├── parachains // On-Chain Parachains Light Client +│ ├── relayers // Relayer rewards registry +│ └── ... +├── primitives // Code shared between modules, runtimes, and relays +│ └── ... +├── relays // Application for sending finality proofs and messages between chains +│ └── ... +└── scripts // Useful development and maintenance scripts +``` + +## Running the Bridge + +To run the Bridge you need to be able to connect the bridge relay node to the RPC interface of nodes +on each side of the bridge (source and target chain). + +There are 2 ways to run the bridge, described below: + +- building & running from source: with this option, you'll be able to run the bridge between two standalone +chains that are running GRANDPA finality gadget to achieve finality; + +- running a Docker Compose setup: this is a recommended option, where you'll see bridges with parachains, +complex relays and more. + +### Using the Source + +First you'll need to build the bridge nodes and relay. This can be done as follows: + +```bash +# In `parity-bridges-common` folder +cargo build -p rialto-bridge-node +cargo build -p millau-bridge-node +cargo build -p substrate-relay +``` + +### Running a Dev network + +We will launch a dev network to demonstrate how to relay a message between two Substrate based +chains (named Rialto and Millau). + +To do this we will need two nodes, two relayers which will relay headers, and two relayers which +will relay messages. + +#### Running from local scripts + +To run a simple dev network you can use the scripts located in the +[`deployments/local-scripts` folder](./deployments/local-scripts). + +First, we must run the two Substrate nodes. + +```bash +# In `parity-bridges-common` folder +./deployments/local-scripts/run-rialto-node.sh +./deployments/local-scripts/run-millau-node.sh +``` + +After the nodes are up we can run the header relayers. + +```bash +./deployments/local-scripts/relay-millau-to-rialto.sh +./deployments/local-scripts/relay-rialto-to-millau.sh +``` + +At this point you should see the relayer submitting headers from the Millau Substrate chain to the +Rialto Substrate chain. + +``` +# Header Relayer Logs +[Millau_to_Rialto_Sync] [date] DEBUG bridge Going to submit finality proof of Millau header #147 to Rialto +[...] [date] INFO bridge Synced 147 of 147 headers +[...] [date] DEBUG bridge Going to submit finality proof of Millau header #148 to Rialto +[...] [date] INFO bridge Synced 148 of 149 headers +``` + +Finally, we can run the message relayers. + +```bash +./deployments/local-scripts/relay-messages-millau-to-rialto.sh +./deployments/local-scripts/relay-messages-rialto-to-millau.sh +``` + +You will also see the message lane relayers listening for new messages. + +``` +# Message Relayer Logs +[Millau_to_Rialto_MessageLane_00000000] [date] DEBUG bridge Asking Millau::ReceivingConfirmationsDelivery about best message nonces +[...] [date] INFO bridge Synced Some(2) of Some(3) nonces in Millau::MessagesDelivery -> Rialto::MessagesDelivery race +[...] [date] DEBUG bridge Asking Millau::MessagesDelivery about message nonces +[...] [date] DEBUG bridge Received best nonces from Millau::ReceivingConfirmationsDelivery: TargetClientNonces { latest_nonce: 0, nonces_data: () } +[...] [date] DEBUG bridge Asking Millau::ReceivingConfirmationsDelivery about finalized message nonces +[...] [date] DEBUG bridge Received finalized nonces from Millau::ReceivingConfirmationsDelivery: TargetClientNonces { latest_nonce: 0, nonces_data: () } +[...] [date] DEBUG bridge Received nonces from Millau::MessagesDelivery: SourceClientNonces { new_nonces: {}, confirmed_nonce: Some(0) } +[...] [date] DEBUG bridge Asking Millau node about its state +[...] [date] DEBUG bridge Received state from Millau node: ClientState { best_self: HeaderId(1593, 0xacac***), best_finalized_self: HeaderId(1590, 0x0be81d...), best_finalized_peer_at_best_self: HeaderId(0, 0xdcdd89...) } +``` + +To send a message see the ["How to send a message" section](#how-to-send-a-message). + +### How to send a message + +In this section we'll show you how to quickly send a bridge message. The message is just an encoded XCM +`Trap(43)` message. + +```bash +# In `parity-bridges-common` folder +./scripts/send-message-from-millau-rialto.sh +``` + +After sending a message you will see the following logs showing a message was successfully sent: + +``` +INFO bridge Sending message to Rialto. Size: 11. +TRACE bridge Sent transaction to Millau node: 0x5e68... +``` + +And at the Rialto node logs you'll something like this: + +``` +... runtime::bridge-messages: Received messages: total=1, valid=1. Weight used: Weight(ref_time: 1215065371, proof_size: 48559)/Weight(ref_time: 1215065371, proof_size: 54703). +``` + +It means that the message has been delivered and dispatched. Message may be dispatched with an +error, though - the goal of our test bridge is to ensure that messages are successfully delivered +and all involved components are working. + +## Full Network Docker Compose Setup + +For a more sophisticated deployment which includes bidirectional header sync, message passing, +monitoring dashboards, etc. see the [Deployments README](./deployments/README.md). + +You should note that you can find images for all the bridge components published on +[Docker Hub](https://hub.docker.com/u/paritytech). + +To run a Rialto node for example, you can use the following command: + +```bash +docker run -p 30333:30333 -p 9933:9933 -p 9944:9944 \ + -it paritytech/rialto-bridge-node --dev --tmp \ + --rpc-cors=all --unsafe-rpc-external --unsafe-ws-external +``` + +## Community + +Main hangout for the community is [Element](https://element.io/) (formerly Riot). Element is a chat +server like, for example, Discord. Most discussions around Polkadot and Substrate happen +in various Element "rooms" (channels). So, joining Element might be a good idea, anyway. + +If you are interested in information exchange and development of Polkadot related bridges please +feel free to join the [Polkadot Bridges](https://app.element.io/#/room/#bridges:web3.foundation) +Element channel. + +The [Substrate Technical](https://app.element.io/#/room/#substrate-technical:matrix.org) Element +channel is most suited for discussions regarding Substrate itself. diff --git a/bridges/SECURITY.md b/bridges/SECURITY.md new file mode 100644 index 00000000000..65f2f3bff05 --- /dev/null +++ b/bridges/SECURITY.md @@ -0,0 +1,14 @@ +# Security Policy + +Thanks for helping make the Parity ecosystem more secure. Security is one of our first priorities. + +## Reporting a vulnerability + +If you find something that can be treated as a security vulnerability, please do not use the issue tracker or discuss it in the public forum as it can cause more damage, rather than giving real help to the ecosystem. + +Security vulnerabilities should be reported by the [contact form](https://security-submission.parity.io/). + +If you think that your report might be eligible for the Bug Bounty Program, please mark this during the submission. Please check up-to-date [Parity Bug Bounty Program rules](https://www.parity.io/bug-bounty) to find out the information about our Bug Bounty Program. + +**Warning**: This is an unified SECURITY.md file for Paritytech GitHub Organization. The presence of this file does not mean that this repository is covered by the Bug Bounty program. Please always check the Bug Bounty Program scope for information. + diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml new file mode 100644 index 00000000000..039e323b9b7 --- /dev/null +++ b/bridges/bin/runtime-common/Cargo.toml @@ -0,0 +1,92 @@ +[package] +name = "bridge-runtime-common" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +repository = "https://github.com/paritytech/parity-bridges-common/" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +hash-db = { version = "0.16.0", default-features = false } +log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +static_assertions = { version = "1.1", optional = true } + +# Bridge dependencies + +bp-header-chain = { path = "../../primitives/header-chain", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } +bp-parachains = { path = "../../primitives/parachains", default-features = false } +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-relayers = { path = "../../primitives/relayers", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +pallet-bridge-grandpa = { path = "../../modules/grandpa", default-features = false } +pallet-bridge-messages = { path = "../../modules/messages", default-features = false } +pallet-bridge-parachains = { path = "../../modules/parachains", default-features = false } +pallet-bridge-relayers = { path = "../../modules/relayers", default-features = false } + +# Substrate dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +# Polkadot dependencies +pallet-xcm = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } +xcm = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } +xcm-builder = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } +xcm-executor = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } + +[dev-dependencies] +bp-test-utils = { path = "../../primitives/test-utils" } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-messages/std", + "bp-parachains/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "frame-system/std", + "hash-db/std", + "log/std", + "pallet-bridge-grandpa/std", + "pallet-bridge-messages/std", + "pallet-bridge-parachains/std", + "pallet-bridge-relayers/std", + "pallet-transaction-payment/std", + "pallet-utility/std", + "pallet-xcm/std", + "scale-info/std", + "sp-api/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "sp-trie/std", + "xcm/std", + "xcm-builder/std", + "xcm-executor/std", +] +runtime-benchmarks = [ + "pallet-bridge-grandpa/runtime-benchmarks", + "pallet-bridge-messages/runtime-benchmarks", + "pallet-bridge-parachains/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", +] +integrity-test = [ + "static_assertions", +] diff --git a/bridges/bin/runtime-common/src/integrity.rs b/bridges/bin/runtime-common/src/integrity.rs new file mode 100644 index 00000000000..aa698b0b95e --- /dev/null +++ b/bridges/bin/runtime-common/src/integrity.rs @@ -0,0 +1,361 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Integrity tests for chain constants and pallets configuration. +//! +//! Most of the tests in this module assume that the bridge is using standard (see `crate::messages` +//! module for details) configuration. + +use crate::{messages, messages::MessageBridge}; + +use bp_messages::{InboundLaneData, MessageNonce}; +use bp_runtime::{Chain, ChainId}; +use codec::Encode; +use frame_support::{storage::generator::StorageValue, traits::Get, weights::Weight}; +use frame_system::limits; +use pallet_bridge_messages::WeightInfoExt as _; +use sp_runtime::traits::SignedExtension; + +/// Macro that ensures that the runtime configuration and chain primitives crate are sharing +/// the same types (index, block number, hash, hasher, account id and header). +#[macro_export] +macro_rules! assert_chain_types( + ( runtime: $r:path, this_chain: $this:path ) => { + { + // if one of asserts fail, then either bridge isn't configured properly (or alternatively - non-standard + // configuration is used), or something has broke existing configuration (meaning that all bridged chains + // and relays will stop functioning) + use frame_system::Config as SystemConfig; + use static_assertions::assert_type_eq_all; + + assert_type_eq_all!(<$r as SystemConfig>::Index, bp_runtime::IndexOf<$this>); + assert_type_eq_all!(<$r as SystemConfig>::BlockNumber, bp_runtime::BlockNumberOf<$this>); + assert_type_eq_all!(<$r as SystemConfig>::Hash, bp_runtime::HashOf<$this>); + assert_type_eq_all!(<$r as SystemConfig>::Hashing, bp_runtime::HasherOf<$this>); + assert_type_eq_all!(<$r as SystemConfig>::AccountId, bp_runtime::AccountIdOf<$this>); + assert_type_eq_all!(<$r as SystemConfig>::Header, bp_runtime::HeaderOf<$this>); + } + } +); + +/// Macro that ensures that the bridge GRANDPA pallet is configured properly to bridge with given +/// chain. +#[macro_export] +macro_rules! assert_bridge_grandpa_pallet_types( + ( runtime: $r:path, with_bridged_chain_grandpa_instance: $i:path, bridged_chain: $bridged:path ) => { + { + // if one of asserts fail, then either bridge isn't configured properly (or alternatively - non-standard + // configuration is used), or something has broke existing configuration (meaning that all bridged chains + // and relays will stop functioning) + use pallet_bridge_grandpa::Config as GrandpaConfig; + use static_assertions::assert_type_eq_all; + + assert_type_eq_all!(<$r as GrandpaConfig<$i>>::BridgedChain, $bridged); + } + } +); + +/// Macro that ensures that the bridge messages pallet is configured properly to bridge using given +/// configuration. +#[macro_export] +macro_rules! assert_bridge_messages_pallet_types( + ( + runtime: $r:path, + with_bridged_chain_messages_instance: $i:path, + bridge: $bridge:path + ) => { + { + // if one of asserts fail, then either bridge isn't configured properly (or alternatively - non-standard + // configuration is used), or something has broke existing configuration (meaning that all bridged chains + // and relays will stop functioning) + use $crate::messages::{ + source::{FromThisChainMessagePayload, TargetHeaderChainAdapter}, + target::{FromBridgedChainMessagePayload, SourceHeaderChainAdapter}, + AccountIdOf, BalanceOf, BridgedChain, ThisChain, + }; + use pallet_bridge_messages::Config as MessagesConfig; + use static_assertions::assert_type_eq_all; + + assert_type_eq_all!(<$r as MessagesConfig<$i>>::OutboundPayload, FromThisChainMessagePayload); + + assert_type_eq_all!(<$r as MessagesConfig<$i>>::InboundRelayer, AccountIdOf>); + + assert_type_eq_all!(<$r as MessagesConfig<$i>>::TargetHeaderChain, TargetHeaderChainAdapter<$bridge>); + assert_type_eq_all!(<$r as MessagesConfig<$i>>::SourceHeaderChain, SourceHeaderChainAdapter<$bridge>); + } + } +); + +/// Macro that combines four other macro calls - `assert_chain_types`, `assert_bridge_types`, +/// `assert_bridge_grandpa_pallet_types` and `assert_bridge_messages_pallet_types`. It may be used +/// at the chain that is implementing complete standard messages bridge (i.e. with bridge GRANDPA +/// and messages pallets deployed). +#[macro_export] +macro_rules! assert_complete_bridge_types( + ( + runtime: $r:path, + with_bridged_chain_grandpa_instance: $gi:path, + with_bridged_chain_messages_instance: $mi:path, + bridge: $bridge:path, + this_chain: $this:path, + bridged_chain: $bridged:path, + ) => { + $crate::assert_chain_types!(runtime: $r, this_chain: $this); + $crate::assert_bridge_grandpa_pallet_types!( + runtime: $r, + with_bridged_chain_grandpa_instance: $gi, + bridged_chain: $bridged + ); + $crate::assert_bridge_messages_pallet_types!( + runtime: $r, + with_bridged_chain_messages_instance: $mi, + bridge: $bridge + ); + } +); + +/// Parameters for asserting chain-related constants. +#[derive(Debug)] +pub struct AssertChainConstants { + /// Block length limits of the chain. + pub block_length: limits::BlockLength, + /// Block weight limits of the chain. + pub block_weights: limits::BlockWeights, +} + +/// Test that our hardcoded, chain-related constants, are matching chain runtime configuration. +/// +/// In particular, this test ensures that: +/// +/// 1) block weight limits are matching; +/// 2) block size limits are matching. +pub fn assert_chain_constants(params: AssertChainConstants) +where + R: frame_system::Config, +{ + // we don't check runtime version here, because in our case we'll be building relay from one + // repo and runtime will live in another repo, along with outdated relay version. To avoid + // unneeded commits, let's not raise an error in case of version mismatch. + + // if one of following assert fails, it means that we may need to upgrade bridged chain and + // relay to use updated constants. If constants are now smaller than before, it may lead to + // undeliverable messages. + + // `BlockLength` struct is not implementing `PartialEq`, so we compare encoded values here. + assert_eq!( + R::BlockLength::get().encode(), + params.block_length.encode(), + "BlockLength from runtime ({:?}) differ from hardcoded: {:?}", + R::BlockLength::get(), + params.block_length, + ); + // `BlockWeights` struct is not implementing `PartialEq`, so we compare encoded values here + assert_eq!( + R::BlockWeights::get().encode(), + params.block_weights.encode(), + "BlockWeights from runtime ({:?}) differ from hardcoded: {:?}", + R::BlockWeights::get(), + params.block_weights, + ); +} + +/// Test that the constants, used in GRANDPA pallet configuration are valid. +pub fn assert_bridge_grandpa_pallet_constants() +where + R: pallet_bridge_grandpa::Config, + GI: 'static, +{ + assert!( + R::HeadersToKeep::get() > 0, + "HeadersToKeep ({}) must be larger than zero", + R::HeadersToKeep::get(), + ); +} + +/// Parameters for asserting messages pallet constants. +#[derive(Debug)] +pub struct AssertBridgeMessagesPalletConstants { + /// Maximal number of unrewarded relayer entries in a confirmation transaction at the bridged + /// chain. + pub max_unrewarded_relayers_in_bridged_confirmation_tx: MessageNonce, + /// Maximal number of unconfirmed messages in a confirmation transaction at the bridged chain. + pub max_unconfirmed_messages_in_bridged_confirmation_tx: MessageNonce, + /// Identifier of the bridged chain. + pub bridged_chain_id: ChainId, +} + +/// Test that the constants, used in messages pallet configuration are valid. +pub fn assert_bridge_messages_pallet_constants(params: AssertBridgeMessagesPalletConstants) +where + R: pallet_bridge_messages::Config, + MI: 'static, +{ + assert!( + !R::ActiveOutboundLanes::get().is_empty(), + "ActiveOutboundLanes ({:?}) must not be empty", + R::ActiveOutboundLanes::get(), + ); + assert!( + R::MaxUnrewardedRelayerEntriesAtInboundLane::get() <= params.max_unrewarded_relayers_in_bridged_confirmation_tx, + "MaxUnrewardedRelayerEntriesAtInboundLane ({}) must be <= than the hardcoded value for bridged chain: {}", + R::MaxUnrewardedRelayerEntriesAtInboundLane::get(), + params.max_unrewarded_relayers_in_bridged_confirmation_tx, + ); + assert!( + R::MaxUnconfirmedMessagesAtInboundLane::get() <= params.max_unconfirmed_messages_in_bridged_confirmation_tx, + "MaxUnrewardedRelayerEntriesAtInboundLane ({}) must be <= than the hardcoded value for bridged chain: {}", + R::MaxUnconfirmedMessagesAtInboundLane::get(), + params.max_unconfirmed_messages_in_bridged_confirmation_tx, + ); + assert_eq!(R::BridgedChainId::get(), params.bridged_chain_id); +} + +/// Parameters for asserting bridge pallet names. +#[derive(Debug)] +pub struct AssertBridgePalletNames<'a> { + /// Name of the messages pallet, deployed at the bridged chain and used to bridge with this + /// chain. + pub with_this_chain_messages_pallet_name: &'a str, + /// Name of the GRANDPA pallet, deployed at this chain and used to bridge with the bridged + /// chain. + pub with_bridged_chain_grandpa_pallet_name: &'a str, + /// Name of the messages pallet, deployed at this chain and used to bridge with the bridged + /// chain. + pub with_bridged_chain_messages_pallet_name: &'a str, +} + +/// Tests that bridge pallet names used in `construct_runtime!()` macro call are matching constants +/// from chain primitives crates. +pub fn assert_bridge_pallet_names(params: AssertBridgePalletNames) +where + B: MessageBridge, + R: pallet_bridge_grandpa::Config + pallet_bridge_messages::Config, + GI: 'static, + MI: 'static, +{ + assert_eq!(B::BRIDGED_MESSAGES_PALLET_NAME, params.with_this_chain_messages_pallet_name); + assert_eq!( + pallet_bridge_grandpa::PalletOwner::::storage_value_final_key().to_vec(), + bp_runtime::storage_value_key(params.with_bridged_chain_grandpa_pallet_name, "PalletOwner",).0, + ); + assert_eq!( + pallet_bridge_messages::PalletOwner::::storage_value_final_key().to_vec(), + bp_runtime::storage_value_key( + params.with_bridged_chain_messages_pallet_name, + "PalletOwner", + ) + .0, + ); +} + +/// Parameters for asserting complete standard messages bridge. +#[derive(Debug)] +pub struct AssertCompleteBridgeConstants<'a> { + /// Parameters to assert this chain constants. + pub this_chain_constants: AssertChainConstants, + /// Parameters to assert messages pallet constants. + pub messages_pallet_constants: AssertBridgeMessagesPalletConstants, + /// Parameters to assert pallet names constants. + pub pallet_names: AssertBridgePalletNames<'a>, +} + +/// All bridge-related constants tests for the complete standard messages bridge (i.e. with bridge +/// GRANDPA and messages pallets deployed). +pub fn assert_complete_bridge_constants(params: AssertCompleteBridgeConstants) +where + R: frame_system::Config + + pallet_bridge_grandpa::Config + + pallet_bridge_messages::Config, + GI: 'static, + MI: 'static, + B: MessageBridge, +{ + assert_chain_constants::(params.this_chain_constants); + assert_bridge_grandpa_pallet_constants::(); + assert_bridge_messages_pallet_constants::(params.messages_pallet_constants); + assert_bridge_pallet_names::(params.pallet_names); +} + +/// Check that the message lane weights are correct. +pub fn check_message_lane_weights< + C: Chain, + T: frame_system::Config + pallet_bridge_messages::Config, + MessagesPalletInstance: 'static, +>( + bridged_chain_extra_storage_proof_size: u32, + this_chain_max_unrewarded_relayers: MessageNonce, + this_chain_max_unconfirmed_messages: MessageNonce, + // whether `RefundBridgedParachainMessages` extension is deployed at runtime and is used for + // refunding this bridge transactions? + // + // in other words: pass true for all known production chains + runtime_includes_refund_extension: bool, +) { + type Weights = >::WeightInfo; + + // check basic weight assumptions + pallet_bridge_messages::ensure_weights_are_correct::>(); + + // check that weights allow us to receive messages + let max_incoming_message_proof_size = bridged_chain_extra_storage_proof_size + .saturating_add(messages::target::maximal_incoming_message_size(C::max_extrinsic_size())); + pallet_bridge_messages::ensure_able_to_receive_message::>( + C::max_extrinsic_size(), + C::max_extrinsic_weight(), + max_incoming_message_proof_size, + messages::target::maximal_incoming_message_dispatch_weight(C::max_extrinsic_weight()), + ); + + // check that weights allow us to receive delivery confirmations + let max_incoming_inbound_lane_data_proof_size = + InboundLaneData::<()>::encoded_size_hint_u32(this_chain_max_unrewarded_relayers as _); + pallet_bridge_messages::ensure_able_to_receive_confirmation::>( + C::max_extrinsic_size(), + C::max_extrinsic_weight(), + max_incoming_inbound_lane_data_proof_size, + this_chain_max_unrewarded_relayers, + this_chain_max_unconfirmed_messages, + ); + + // check that extra weights of delivery/confirmation transactions include the weight + // of `RefundBridgedParachainMessages` operations. This signed extension assumes the worst case + // (i.e. slashing if delivery transaction was invalid) and refunds some weight if + // assumption was wrong (i.e. if we did refund instead of slashing). This check + // ensures the extension will not refund weight when it doesn't need to (i.e. if pallet + // weights do not account weights of refund extension). + if runtime_includes_refund_extension { + assert_ne!( + Weights::::receive_messages_proof_overhead_from_runtime(), + Weight::zero() + ); + assert_ne!( + Weights::::receive_messages_delivery_proof_overhead_from_runtime(), + Weight::zero() + ); + } +} + +/// Check that the `AdditionalSigned` type of a wrapped runtime is the same as the one of the +/// corresponding actual runtime. +/// +/// This method doesn't perform any `assert`. If the condition is not true it will generate a +/// compile-time error. +pub fn check_additional_signed() +where + SignedExt: SignedExtension, + IndirectSignedExt: SignedExtension, +{ +} diff --git a/bridges/bin/runtime-common/src/lib.rs b/bridges/bin/runtime-common/src/lib.rs new file mode 100644 index 00000000000..12b096492cd --- /dev/null +++ b/bridges/bin/runtime-common/src/lib.rs @@ -0,0 +1,259 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Common types/functions that may be used by runtimes of all bridged chains. + +#![cfg_attr(not(feature = "std"), no_std)] + +use crate::messages_call_ext::MessagesCallSubType; +use pallet_bridge_grandpa::CallSubType as GrandpaCallSubType; +use pallet_bridge_parachains::CallSubType as ParachainsCallSubtype; +use sp_runtime::transaction_validity::TransactionValidity; +use xcm::v3::NetworkId; + +pub mod messages; +pub mod messages_api; +pub mod messages_benchmarking; +pub mod messages_call_ext; +pub mod messages_xcm_extension; +pub mod parachains_benchmarking; +pub mod priority_calculator; +pub mod refund_relayer_extension; + +mod messages_generation; +mod mock; + +#[cfg(feature = "integrity-test")] +pub mod integrity; + +const LOG_TARGET_BRIDGE_DISPATCH: &str = "runtime::bridge-dispatch"; + +/// A duplication of the `FilterCall` trait. +/// +/// We need this trait in order to be able to implement it for the messages pallet, +/// since the implementation is done outside of the pallet crate. +pub trait BridgeRuntimeFilterCall { + /// Checks if a runtime call is valid. + fn validate(call: &Call) -> TransactionValidity; +} + +impl BridgeRuntimeFilterCall for pallet_bridge_grandpa::Pallet +where + T: pallet_bridge_grandpa::Config, + T::RuntimeCall: GrandpaCallSubType, +{ + fn validate(call: &T::RuntimeCall) -> TransactionValidity { + GrandpaCallSubType::::check_obsolete_submit_finality_proof(call) + } +} + +impl BridgeRuntimeFilterCall + for pallet_bridge_parachains::Pallet +where + T: pallet_bridge_parachains::Config, + T::RuntimeCall: ParachainsCallSubtype, +{ + fn validate(call: &T::RuntimeCall) -> TransactionValidity { + ParachainsCallSubtype::::check_obsolete_submit_parachain_heads(call) + } +} + +impl, I: 'static> BridgeRuntimeFilterCall + for pallet_bridge_messages::Pallet +where + T::RuntimeCall: MessagesCallSubType, +{ + /// Validate messages in order to avoid "mining" messages delivery and delivery confirmation + /// transactions, that are delivering outdated messages/confirmations. Without this validation, + /// even honest relayers may lose their funds if there are multiple relays running and + /// submitting the same messages/confirmations. + fn validate(call: &T::RuntimeCall) -> TransactionValidity { + call.check_obsolete_call() + } +} + +/// Declares a runtime-specific `BridgeRejectObsoleteHeadersAndMessages` signed extension. +/// +/// ## Example +/// +/// ```nocompile +/// generate_bridge_reject_obsolete_headers_and_messages!{ +/// Call, AccountId +/// BridgeRialtoGrandpa, BridgeWestendGrandpa, +/// BridgeRialtoParachains +/// } +/// ``` +/// +/// The goal of this extension is to avoid "mining" transactions that provide outdated bridged +/// headers and messages. Without that extension, even honest relayers may lose their funds if +/// there are multiple relays running and submitting the same information. +#[macro_export] +macro_rules! generate_bridge_reject_obsolete_headers_and_messages { + ($call:ty, $account_id:ty, $($filter_call:ty),*) => { + #[derive(Clone, codec::Decode, Default, codec::Encode, Eq, PartialEq, frame_support::RuntimeDebug, scale_info::TypeInfo)] + pub struct BridgeRejectObsoleteHeadersAndMessages; + impl sp_runtime::traits::SignedExtension for BridgeRejectObsoleteHeadersAndMessages { + const IDENTIFIER: &'static str = "BridgeRejectObsoleteHeadersAndMessages"; + type AccountId = $account_id; + type Call = $call; + type AdditionalSigned = (); + type Pre = (); + + fn additional_signed(&self) -> sp_std::result::Result< + (), + sp_runtime::transaction_validity::TransactionValidityError, + > { + Ok(()) + } + + fn validate( + &self, + _who: &Self::AccountId, + call: &Self::Call, + _info: &sp_runtime::traits::DispatchInfoOf, + _len: usize, + ) -> sp_runtime::transaction_validity::TransactionValidity { + let valid = sp_runtime::transaction_validity::ValidTransaction::default(); + $( + let valid = valid + .combine_with(<$filter_call as $crate::BridgeRuntimeFilterCall<$call>>::validate(call)?); + )* + Ok(valid) + } + + fn pre_dispatch( + self, + who: &Self::AccountId, + call: &Self::Call, + info: &sp_runtime::traits::DispatchInfoOf, + len: usize, + ) -> Result { + self.validate(who, call, info, len).map(drop) + } + } + }; +} + +/// A mapping over `NetworkId`. +/// Since `NetworkId` doesn't include `Millau`, `Rialto` and `RialtoParachain`, we create some +/// synthetic associations between these chains and `NetworkId` chains. +pub enum CustomNetworkId { + /// The Millau network ID, associated with Kusama. + Millau, + /// The Rialto network ID, associated with Polkadot. + Rialto, + /// The RialtoParachain network ID, associated with Westend. + RialtoParachain, +} + +impl TryFrom for CustomNetworkId { + type Error = (); + + fn try_from(chain: bp_runtime::ChainId) -> Result { + Ok(match chain { + bp_runtime::MILLAU_CHAIN_ID => Self::Millau, + bp_runtime::RIALTO_CHAIN_ID => Self::Rialto, + bp_runtime::RIALTO_PARACHAIN_CHAIN_ID => Self::RialtoParachain, + _ => return Err(()), + }) + } +} + +impl CustomNetworkId { + /// Converts self to XCM' network id. + pub const fn as_network_id(&self) -> NetworkId { + match *self { + CustomNetworkId::Millau => NetworkId::Kusama, + CustomNetworkId::Rialto => NetworkId::Polkadot, + CustomNetworkId::RialtoParachain => NetworkId::Westend, + } + } +} + +#[cfg(test)] +mod tests { + use crate::BridgeRuntimeFilterCall; + use frame_support::{assert_err, assert_ok}; + use sp_runtime::{ + traits::SignedExtension, + transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, + }; + + pub struct MockCall { + data: u32, + } + + impl sp_runtime::traits::Dispatchable for MockCall { + type RuntimeOrigin = (); + type Config = (); + type Info = (); + type PostInfo = (); + + fn dispatch( + self, + _origin: Self::RuntimeOrigin, + ) -> sp_runtime::DispatchResultWithInfo { + unimplemented!() + } + } + + struct FirstFilterCall; + impl BridgeRuntimeFilterCall for FirstFilterCall { + fn validate(call: &MockCall) -> TransactionValidity { + if call.data <= 1 { + return InvalidTransaction::Custom(1).into() + } + + Ok(ValidTransaction { priority: 1, ..Default::default() }) + } + } + + struct SecondFilterCall; + impl BridgeRuntimeFilterCall for SecondFilterCall { + fn validate(call: &MockCall) -> TransactionValidity { + if call.data <= 2 { + return InvalidTransaction::Custom(2).into() + } + + Ok(ValidTransaction { priority: 2, ..Default::default() }) + } + } + + #[test] + fn test() { + generate_bridge_reject_obsolete_headers_and_messages!( + MockCall, + (), + FirstFilterCall, + SecondFilterCall + ); + + assert_err!( + BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 1 }, &(), 0), + InvalidTransaction::Custom(1) + ); + + assert_err!( + BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 2 }, &(), 0), + InvalidTransaction::Custom(2) + ); + + assert_ok!( + BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 3 }, &(), 0), + ValidTransaction { priority: 3, ..Default::default() } + ) + } +} diff --git a/bridges/bin/runtime-common/src/messages.rs b/bridges/bin/runtime-common/src/messages.rs new file mode 100644 index 00000000000..6f6b1959577 --- /dev/null +++ b/bridges/bin/runtime-common/src/messages.rs @@ -0,0 +1,779 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Types that allow runtime to act as a source/target endpoint of message lanes. +//! +//! Messages are assumed to be encoded `Call`s of the target chain. Call-dispatch +//! pallet is used to dispatch incoming messages. Message identified by a tuple +//! of to elements - message lane id and message nonce. + +pub use bp_runtime::{RangeInclusiveExt, UnderlyingChainOf, UnderlyingChainProvider}; + +use bp_header_chain::{HeaderChain, HeaderChainError}; +use bp_messages::{ + source_chain::{LaneMessageVerifier, TargetHeaderChain}, + target_chain::{ProvedLaneMessages, ProvedMessages, SourceHeaderChain}, + InboundLaneData, LaneId, Message, MessageKey, MessageNonce, MessagePayload, OutboundLaneData, +}; +use bp_runtime::{Chain, RawStorageProof, Size, StorageProofChecker, StorageProofError}; +use codec::{Decode, Encode}; +use frame_support::{traits::Get, weights::Weight, RuntimeDebug}; +use hash_db::Hasher; +use scale_info::TypeInfo; +use sp_std::{convert::TryFrom, fmt::Debug, marker::PhantomData, vec::Vec}; + +/// Bidirectional message bridge. +pub trait MessageBridge { + /// Name of the paired messages pallet instance at the Bridged chain. + /// + /// Should be the name that is used in the `construct_runtime!()` macro. + const BRIDGED_MESSAGES_PALLET_NAME: &'static str; + + /// This chain in context of message bridge. + type ThisChain: ThisChainWithMessages; + /// Bridged chain in context of message bridge. + type BridgedChain: BridgedChainWithMessages; + /// Bridged header chain. + type BridgedHeaderChain: HeaderChain>; +} + +/// This chain that has `pallet-bridge-messages` module. +pub trait ThisChainWithMessages: UnderlyingChainProvider { + /// Call origin on the chain. + type RuntimeOrigin; +} + +/// Bridged chain that has `pallet-bridge-messages` module. +pub trait BridgedChainWithMessages: UnderlyingChainProvider {} + +/// This chain in context of message bridge. +pub type ThisChain = ::ThisChain; +/// Bridged chain in context of message bridge. +pub type BridgedChain = ::BridgedChain; +/// Hash used on the chain. +pub type HashOf = bp_runtime::HashOf<::Chain>; +/// Hasher used on the chain. +pub type HasherOf = bp_runtime::HasherOf>; +/// Account id used on the chain. +pub type AccountIdOf = bp_runtime::AccountIdOf>; +/// Type of balances that is used on the chain. +pub type BalanceOf = bp_runtime::BalanceOf>; +/// Type of origin that is used on the chain. +pub type OriginOf = ::RuntimeOrigin; + +/// Error that happens during message verification. +#[derive(Debug, PartialEq, Eq)] +pub enum Error { + /// The message proof is empty. + EmptyMessageProof, + /// Error returned by the bridged header chain. + HeaderChain(HeaderChainError), + /// Error returned while reading/decoding inbound lane data from the storage proof. + InboundLaneStorage(StorageProofError), + /// The declared message weight is incorrect. + InvalidMessageWeight, + /// Declared messages count doesn't match actual value. + MessagesCountMismatch, + /// Error returned while reading/decoding message data from the storage proof. + MessageStorage(StorageProofError), + /// The message is too large. + MessageTooLarge, + /// Error returned while reading/decoding outbound lane data from the storage proof. + OutboundLaneStorage(StorageProofError), + /// Storage proof related error. + StorageProof(StorageProofError), +} + +/// Sub-module that is declaring types required for processing This -> Bridged chain messages. +pub mod source { + use super::*; + + /// Message payload for This -> Bridged chain messages. + pub type FromThisChainMessagePayload = crate::messages_xcm_extension::XcmAsPlainPayload; + + /// Maximal size of outbound message payload. + pub struct FromThisChainMaximalOutboundPayloadSize(PhantomData); + + impl Get for FromThisChainMaximalOutboundPayloadSize { + fn get() -> u32 { + maximal_message_size::() + } + } + + /// Messages delivery proof from bridged chain: + /// + /// - hash of finalized header; + /// - storage proof of inbound lane state; + /// - lane id. + #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] + pub struct FromBridgedChainMessagesDeliveryProof { + /// Hash of the bridge header the proof is for. + pub bridged_header_hash: BridgedHeaderHash, + /// Storage trie proof generated for [`Self::bridged_header_hash`]. + pub storage_proof: RawStorageProof, + /// Lane id of which messages were delivered and the proof is for. + pub lane: LaneId, + } + + impl Size for FromBridgedChainMessagesDeliveryProof { + fn size(&self) -> u32 { + u32::try_from( + self.storage_proof + .iter() + .fold(0usize, |sum, node| sum.saturating_add(node.len())), + ) + .unwrap_or(u32::MAX) + } + } + + /// 'Parsed' message delivery proof - inbound lane id and its state. + pub type ParsedMessagesDeliveryProofFromBridgedChain = + (LaneId, InboundLaneData>>); + + /// Message verifier that is doing all basic checks. + /// + /// This verifier assumes following: + /// + /// - all message lanes are equivalent, so all checks are the same; + /// + /// Following checks are made: + /// + /// - message is rejected if its lane is currently blocked; + /// - message is rejected if there are too many pending (undelivered) messages at the outbound + /// lane; + /// - check that the sender has rights to dispatch the call on target chain using provided + /// dispatch origin; + /// - check that the sender has paid enough funds for both message delivery and dispatch. + #[derive(RuntimeDebug)] + pub struct FromThisChainMessageVerifier(PhantomData); + + impl LaneMessageVerifier>, FromThisChainMessagePayload> + for FromThisChainMessageVerifier + where + B: MessageBridge, + // matches requirements from the `frame_system::Config::Origin` + OriginOf>: Clone + + Into>>, OriginOf>>>, + AccountIdOf>: PartialEq + Clone, + { + type Error = &'static str; + + fn verify_message( + _submitter: &OriginOf>, + _lane: &LaneId, + _lane_outbound_data: &OutboundLaneData, + _payload: &FromThisChainMessagePayload, + ) -> Result<(), Self::Error> { + // IMPORTANT: any error that is returned here is fatal for the bridge, because + // this code is executed at the bridge hub and message sender actually lives + // at some sibling parachain. So we are failing **after** the message has been + // sent and we can't report it back to sender (unless error report mechanism is + // embedded into message and its dispatcher). + + Ok(()) + } + } + + /// Return maximal message size of This -> Bridged chain message. + pub fn maximal_message_size() -> u32 { + super::target::maximal_incoming_message_size( + UnderlyingChainOf::>::max_extrinsic_size(), + ) + } + + /// `TargetHeaderChain` implementation that is using default types and perform default checks. + pub struct TargetHeaderChainAdapter(PhantomData); + + impl TargetHeaderChain>> + for TargetHeaderChainAdapter + { + type Error = Error; + type MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof>>; + + fn verify_message(payload: &FromThisChainMessagePayload) -> Result<(), Self::Error> { + verify_chain_message::(payload) + } + + fn verify_messages_delivery_proof( + proof: Self::MessagesDeliveryProof, + ) -> Result<(LaneId, InboundLaneData>>), Self::Error> { + verify_messages_delivery_proof::(proof) + } + } + + /// Do basic Bridged-chain specific verification of This -> Bridged chain message. + /// + /// Ok result from this function means that the delivery transaction with this message + /// may be 'mined' by the target chain. But the lane may have its own checks (e.g. fee + /// check) that would reject message (see `FromThisChainMessageVerifier`). + pub fn verify_chain_message( + payload: &FromThisChainMessagePayload, + ) -> Result<(), Error> { + // IMPORTANT: any error that is returned here is fatal for the bridge, because + // this code is executed at the bridge hub and message sender actually lives + // at some sibling parachain. So we are failing **after** the message has been + // sent and we can't report it back to sender (unless error report mechanism is + // embedded into message and its dispatcher). + + // apart from maximal message size check (see below), we should also check the message + // dispatch weight here. But we assume that the bridged chain will just push the message + // to some queue (XCMP, UMP, DMP), so the weight is constant and fits the block. + + // The maximal size of extrinsic at Substrate-based chain depends on the + // `frame_system::Config::MaximumBlockLength` and + // `frame_system::Config::AvailableBlockRatio` constants. This check is here to be sure that + // the lane won't stuck because message is too large to fit into delivery transaction. + // + // **IMPORTANT NOTE**: the delivery transaction contains storage proof of the message, not + // the message itself. The proof is always larger than the message. But unless chain state + // is enormously large, it should be several dozens/hundreds of bytes. The delivery + // transaction also contains signatures and signed extensions. Because of this, we reserve + // 1/3 of the the maximal extrinsic weight for this data. + if payload.len() > maximal_message_size::() as usize { + return Err(Error::MessageTooLarge) + } + + Ok(()) + } + + /// Verify proof of This -> Bridged chain messages delivery. + /// + /// This function is used when Bridged chain is directly using GRANDPA finality. For Bridged + /// parachains, please use the `verify_messages_delivery_proof_from_parachain`. + pub fn verify_messages_delivery_proof( + proof: FromBridgedChainMessagesDeliveryProof>>, + ) -> Result, Error> { + let FromBridgedChainMessagesDeliveryProof { bridged_header_hash, storage_proof, lane } = + proof; + B::BridgedHeaderChain::parse_finalized_storage_proof( + bridged_header_hash, + storage_proof, + |mut storage| { + // Messages delivery proof is just proof of single storage key read => any error + // is fatal. + let storage_inbound_lane_data_key = + bp_messages::storage_keys::inbound_lane_data_key( + B::BRIDGED_MESSAGES_PALLET_NAME, + &lane, + ); + let inbound_lane_data = storage + .read_and_decode_mandatory_value(storage_inbound_lane_data_key.0.as_ref()) + .map_err(Error::InboundLaneStorage)?; + + // check that the storage proof doesn't have any untouched trie nodes + storage.ensure_no_unused_nodes().map_err(Error::StorageProof)?; + + Ok((lane, inbound_lane_data)) + }, + ) + .map_err(Error::HeaderChain)? + } +} + +/// Sub-module that is declaring types required for processing Bridged -> This chain messages. +pub mod target { + use super::*; + + /// Decoded Bridged -> This message payload. + pub type FromBridgedChainMessagePayload = crate::messages_xcm_extension::XcmAsPlainPayload; + + /// Messages proof from bridged chain: + /// + /// - hash of finalized header; + /// - storage proof of messages and (optionally) outbound lane state; + /// - lane id; + /// - nonces (inclusive range) of messages which are included in this proof. + #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] + pub struct FromBridgedChainMessagesProof { + /// Hash of the finalized bridged header the proof is for. + pub bridged_header_hash: BridgedHeaderHash, + /// A storage trie proof of messages being delivered. + pub storage_proof: RawStorageProof, + /// Messages in this proof are sent over this lane. + pub lane: LaneId, + /// Nonce of the first message being delivered. + pub nonces_start: MessageNonce, + /// Nonce of the last message being delivered. + pub nonces_end: MessageNonce, + } + + impl Size for FromBridgedChainMessagesProof { + fn size(&self) -> u32 { + u32::try_from( + self.storage_proof + .iter() + .fold(0usize, |sum, node| sum.saturating_add(node.len())), + ) + .unwrap_or(u32::MAX) + } + } + + /// Return maximal dispatch weight of the message we're able to receive. + pub fn maximal_incoming_message_dispatch_weight(maximal_extrinsic_weight: Weight) -> Weight { + maximal_extrinsic_weight / 2 + } + + /// Return maximal message size given maximal extrinsic size. + pub fn maximal_incoming_message_size(maximal_extrinsic_size: u32) -> u32 { + maximal_extrinsic_size / 3 * 2 + } + + /// `SourceHeaderChain` implementation that is using default types and perform default checks. + pub struct SourceHeaderChainAdapter(PhantomData); + + impl SourceHeaderChain for SourceHeaderChainAdapter { + type Error = Error; + type MessagesProof = FromBridgedChainMessagesProof>>; + + fn verify_messages_proof( + proof: Self::MessagesProof, + messages_count: u32, + ) -> Result, Self::Error> { + verify_messages_proof::(proof, messages_count) + } + } + + /// Verify proof of Bridged -> This chain messages. + /// + /// This function is used when Bridged chain is directly using GRANDPA finality. For Bridged + /// parachains, please use the `verify_messages_proof_from_parachain`. + /// + /// The `messages_count` argument verification (sane limits) is supposed to be made + /// outside of this function. This function only verifies that the proof declares exactly + /// `messages_count` messages. + pub fn verify_messages_proof( + proof: FromBridgedChainMessagesProof>>, + messages_count: u32, + ) -> Result, Error> { + let FromBridgedChainMessagesProof { + bridged_header_hash, + storage_proof, + lane, + nonces_start, + nonces_end, + } = proof; + let nonces_range = nonces_start..=nonces_end; + + B::BridgedHeaderChain::parse_finalized_storage_proof( + bridged_header_hash, + storage_proof, + |storage| { + let mut parser = + StorageProofCheckerAdapter::<_, B> { storage, _dummy: Default::default() }; + + // receiving proofs where end < begin is ok (if proof includes outbound lane state) + let messages_in_the_proof = nonces_range.checked_len().unwrap_or(0); + if messages_in_the_proof != MessageNonce::from(messages_count) { + return Err(Error::MessagesCountMismatch) + } + + // Read messages first. All messages that are claimed to be in the proof must + // be in the proof. So any error in `read_value`, or even missing value is fatal. + // + // Mind that we allow proofs with no messages if outbound lane state is proved. + let mut messages = Vec::with_capacity(messages_in_the_proof as _); + for nonce in nonces_range { + let message_key = MessageKey { lane_id: lane, nonce }; + let message_payload = parser.read_and_decode_message_payload(&message_key)?; + messages.push(Message { key: message_key, payload: message_payload }); + } + + // Now let's check if proof contains outbound lane state proof. It is optional, so + // we simply ignore `read_value` errors and missing value. + let proved_lane_messages = ProvedLaneMessages { + lane_state: parser.read_and_decode_outbound_lane_data(&lane)?, + messages, + }; + + // Now we may actually check if the proof is empty or not. + if proved_lane_messages.lane_state.is_none() && + proved_lane_messages.messages.is_empty() + { + return Err(Error::EmptyMessageProof) + } + + // check that the storage proof doesn't have any untouched trie nodes + parser.storage.ensure_no_unused_nodes().map_err(Error::StorageProof)?; + + // We only support single lane messages in this generated_schema + let mut proved_messages = ProvedMessages::new(); + proved_messages.insert(lane, proved_lane_messages); + + Ok(proved_messages) + }, + ) + .map_err(Error::HeaderChain)? + } + + struct StorageProofCheckerAdapter { + storage: StorageProofChecker, + _dummy: sp_std::marker::PhantomData, + } + + impl StorageProofCheckerAdapter { + fn read_and_decode_outbound_lane_data( + &mut self, + lane_id: &LaneId, + ) -> Result, Error> { + let storage_outbound_lane_data_key = bp_messages::storage_keys::outbound_lane_data_key( + B::BRIDGED_MESSAGES_PALLET_NAME, + lane_id, + ); + + self.storage + .read_and_decode_opt_value(storage_outbound_lane_data_key.0.as_ref()) + .map_err(Error::OutboundLaneStorage) + } + + fn read_and_decode_message_payload( + &mut self, + message_key: &MessageKey, + ) -> Result { + let storage_message_key = bp_messages::storage_keys::message_key( + B::BRIDGED_MESSAGES_PALLET_NAME, + &message_key.lane_id, + message_key.nonce, + ); + self.storage + .read_and_decode_mandatory_value(storage_message_key.0.as_ref()) + .map_err(Error::MessageStorage) + } + } +} + +/// The `BridgeMessagesCall` used by a chain. +pub type BridgeMessagesCallOf = bp_messages::BridgeMessagesCall< + bp_runtime::AccountIdOf, + target::FromBridgedChainMessagesProof>, + source::FromBridgedChainMessagesDeliveryProof>, +>; + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + messages_generation::{ + encode_all_messages, encode_lane_data, prepare_messages_storage_proof, + }, + mock::*, + }; + use bp_header_chain::StoredHeaderDataBuilder; + use bp_runtime::HeaderId; + use codec::Encode; + use sp_core::H256; + use sp_runtime::traits::Header as _; + + #[test] + fn verify_chain_message_rejects_message_with_too_large_declared_weight() { + assert!(source::verify_chain_message::(&vec![ + 42; + BRIDGED_CHAIN_MAX_EXTRINSIC_WEIGHT - + 1 + ]) + .is_err()); + } + + #[test] + fn verify_chain_message_rejects_message_too_large_message() { + assert!(source::verify_chain_message::(&vec![ + 0; + source::maximal_message_size::() + as usize + 1 + ],) + .is_err()); + } + + #[test] + fn verify_chain_message_accepts_maximal_message() { + assert_eq!( + source::verify_chain_message::(&vec![ + 0; + source::maximal_message_size::() + as _ + ],), + Ok(()), + ); + } + + fn using_messages_proof( + nonces_end: MessageNonce, + outbound_lane_data: Option, + encode_message: impl Fn(MessageNonce, &MessagePayload) -> Option>, + encode_outbound_lane_data: impl Fn(&OutboundLaneData) -> Vec, + test: impl Fn(target::FromBridgedChainMessagesProof) -> R, + ) -> R { + let (state_root, storage_proof) = prepare_messages_storage_proof::( + TEST_LANE_ID, + 1..=nonces_end, + outbound_lane_data, + bp_runtime::StorageProofSize::Minimal(0), + vec![42], + encode_message, + encode_outbound_lane_data, + ); + + sp_io::TestExternalities::new(Default::default()).execute_with(move || { + let bridged_header = BridgedChainHeader::new( + 0, + Default::default(), + state_root, + Default::default(), + Default::default(), + ); + let bridged_header_hash = bridged_header.hash(); + + pallet_bridge_grandpa::BestFinalized::::put(HeaderId( + 0, + bridged_header_hash, + )); + pallet_bridge_grandpa::ImportedHeaders::::insert( + bridged_header_hash, + bridged_header.build(), + ); + test(target::FromBridgedChainMessagesProof { + bridged_header_hash, + storage_proof, + lane: TEST_LANE_ID, + nonces_start: 1, + nonces_end, + }) + }) + } + + #[test] + fn messages_proof_is_rejected_if_declared_less_than_actual_number_of_messages() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { + target::verify_messages_proof::(proof, 5) + }), + Err(Error::MessagesCountMismatch), + ); + } + + #[test] + fn messages_proof_is_rejected_if_declared_more_than_actual_number_of_messages() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { + target::verify_messages_proof::(proof, 15) + }), + Err(Error::MessagesCountMismatch), + ); + } + + #[test] + fn message_proof_is_rejected_if_header_is_missing_from_the_chain() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { + let bridged_header_hash = + pallet_bridge_grandpa::BestFinalized::::get().unwrap().1; + pallet_bridge_grandpa::ImportedHeaders::::remove(bridged_header_hash); + target::verify_messages_proof::(proof, 10) + }), + Err(Error::HeaderChain(HeaderChainError::UnknownHeader)), + ); + } + + #[test] + fn message_proof_is_rejected_if_header_state_root_mismatches() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { + let bridged_header_hash = + pallet_bridge_grandpa::BestFinalized::::get().unwrap().1; + pallet_bridge_grandpa::ImportedHeaders::::insert( + bridged_header_hash, + BridgedChainHeader::new( + 0, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ) + .build(), + ); + target::verify_messages_proof::(proof, 10) + }), + Err(Error::HeaderChain(HeaderChainError::StorageProof( + StorageProofError::StorageRootMismatch + ))), + ); + } + + #[test] + fn message_proof_is_rejected_if_it_has_duplicate_trie_nodes() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |mut proof| { + let node = proof.storage_proof.pop().unwrap(); + proof.storage_proof.push(node.clone()); + proof.storage_proof.push(node); + target::verify_messages_proof::(proof, 10) + },), + Err(Error::HeaderChain(HeaderChainError::StorageProof( + StorageProofError::DuplicateNodesInProof + ))), + ); + } + + #[test] + fn message_proof_is_rejected_if_it_has_unused_trie_nodes() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |mut proof| { + proof.storage_proof.push(vec![42]); + target::verify_messages_proof::(proof, 10) + },), + Err(Error::StorageProof(StorageProofError::UnusedNodesInTheProof)), + ); + } + + #[test] + fn message_proof_is_rejected_if_required_message_is_missing() { + matches!( + using_messages_proof( + 10, + None, + |n, m| if n != 5 { Some(m.encode()) } else { None }, + encode_lane_data, + |proof| target::verify_messages_proof::(proof, 10) + ), + Err(Error::MessageStorage(StorageProofError::StorageValueEmpty)), + ); + } + + #[test] + fn message_proof_is_rejected_if_message_decode_fails() { + matches!( + using_messages_proof( + 10, + None, + |n, m| { + let mut m = m.encode(); + if n == 5 { + m = vec![42] + } + Some(m) + }, + encode_lane_data, + |proof| target::verify_messages_proof::(proof, 10), + ), + Err(Error::MessageStorage(StorageProofError::StorageValueDecodeFailed(_))), + ); + } + + #[test] + fn message_proof_is_rejected_if_outbound_lane_state_decode_fails() { + matches!( + using_messages_proof( + 10, + Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + encode_all_messages, + |d| { + let mut d = d.encode(); + d.truncate(1); + d + }, + |proof| target::verify_messages_proof::(proof, 10), + ), + Err(Error::OutboundLaneStorage(StorageProofError::StorageValueDecodeFailed(_))), + ); + } + + #[test] + fn message_proof_is_rejected_if_it_is_empty() { + assert_eq!( + using_messages_proof(0, None, encode_all_messages, encode_lane_data, |proof| { + target::verify_messages_proof::(proof, 0) + },), + Err(Error::EmptyMessageProof), + ); + } + + #[test] + fn non_empty_message_proof_without_messages_is_accepted() { + assert_eq!( + using_messages_proof( + 0, + Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + encode_all_messages, + encode_lane_data, + |proof| target::verify_messages_proof::(proof, 0), + ), + Ok(vec![( + TEST_LANE_ID, + ProvedLaneMessages { + lane_state: Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + messages: Vec::new(), + }, + )] + .into_iter() + .collect()), + ); + } + + #[test] + fn non_empty_message_proof_is_accepted() { + assert_eq!( + using_messages_proof( + 1, + Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + encode_all_messages, + encode_lane_data, + |proof| target::verify_messages_proof::(proof, 1), + ), + Ok(vec![( + TEST_LANE_ID, + ProvedLaneMessages { + lane_state: Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + messages: vec![Message { + key: MessageKey { lane_id: TEST_LANE_ID, nonce: 1 }, + payload: vec![42], + }], + }, + )] + .into_iter() + .collect()), + ); + } + + #[test] + fn verify_messages_proof_does_not_panic_if_messages_count_mismatches() { + assert_eq!( + using_messages_proof(1, None, encode_all_messages, encode_lane_data, |mut proof| { + proof.nonces_end = u64::MAX; + target::verify_messages_proof::(proof, u32::MAX) + },), + Err(Error::MessagesCountMismatch), + ); + } +} diff --git a/bridges/bin/runtime-common/src/messages_api.rs b/bridges/bin/runtime-common/src/messages_api.rs new file mode 100644 index 00000000000..199e062fe98 --- /dev/null +++ b/bridges/bin/runtime-common/src/messages_api.rs @@ -0,0 +1,66 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Helpers for implementing various message-related runtime API mthods. + +use bp_messages::{ + InboundMessageDetails, LaneId, MessageNonce, MessagePayload, OutboundMessageDetails, +}; +use sp_std::vec::Vec; + +/// Implementation of the `To*OutboundLaneApi::message_details`. +pub fn outbound_message_details( + lane: LaneId, + begin: MessageNonce, + end: MessageNonce, +) -> Vec +where + Runtime: pallet_bridge_messages::Config, + MessagesPalletInstance: 'static, +{ + (begin..=end) + .filter_map(|nonce| { + let message_data = + pallet_bridge_messages::Pallet::::outbound_message_data(lane, nonce)?; + Some(OutboundMessageDetails { + nonce, + // dispatch message weight is always zero at the source chain, since we're paying for + // dispatch at the target chain + dispatch_weight: frame_support::weights::Weight::zero(), + size: message_data.len() as _, + }) + }) + .collect() +} + +/// Implementation of the `To*InboundLaneApi::message_details`. +pub fn inbound_message_details( + lane: LaneId, + messages: Vec<(MessagePayload, OutboundMessageDetails)>, +) -> Vec +where + Runtime: pallet_bridge_messages::Config, + MessagesPalletInstance: 'static, +{ + messages + .into_iter() + .map(|(payload, details)| { + pallet_bridge_messages::Pallet::::inbound_message_data( + lane, payload, details, + ) + }) + .collect() +} diff --git a/bridges/bin/runtime-common/src/messages_benchmarking.rs b/bridges/bin/runtime-common/src/messages_benchmarking.rs new file mode 100644 index 00000000000..b067523c305 --- /dev/null +++ b/bridges/bin/runtime-common/src/messages_benchmarking.rs @@ -0,0 +1,293 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Everything required to run benchmarks of messages module, based on +//! `bridge_runtime_common::messages` implementation. + +#![cfg(feature = "runtime-benchmarks")] + +use crate::{ + messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, + AccountIdOf, BridgedChain, HashOf, HasherOf, MessageBridge, ThisChain, + }, + messages_generation::{ + encode_all_messages, encode_lane_data, grow_trie_leaf_value, prepare_messages_storage_proof, + }, +}; + +use bp_messages::storage_keys; +use bp_polkadot_core::parachains::ParaHash; +use bp_runtime::{ + record_all_trie_keys, Chain, Parachain, RawStorageProof, StorageProofSize, UnderlyingChainOf, +}; +use codec::Encode; +use frame_support::weights::Weight; +use pallet_bridge_messages::benchmarking::{MessageDeliveryProofParams, MessageProofParams}; +use sp_runtime::traits::{Header, Zero}; +use sp_std::prelude::*; +use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; +use xcm::v3::prelude::*; + +/// Prepare inbound bridge message according to given message proof parameters. +fn prepare_inbound_message( + params: &MessageProofParams, + destination: InteriorMultiLocation, +) -> Vec { + // we only care about **this** message size when message proof needs to be `Minimal` + let expected_size = match params.size { + StorageProofSize::Minimal(size) => size as usize, + _ => 0, + }; + + // if we don't need a correct message, then we may just return some random blob + if !params.is_successful_dispatch_expected { + return vec![0u8; expected_size] + } + + // else let's prepare successful message. For XCM bridge hubs, it is the message that + // will be pushed further to some XCM queue (XCMP/UMP) + let location = xcm::VersionedInteriorMultiLocation::V3(destination); + let location_encoded_size = location.encoded_size(); + + // we don't need to be super-precise with `expected_size` here + let xcm_size = expected_size.saturating_sub(location_encoded_size); + let xcm = xcm::VersionedXcm::<()>::V3(vec![Instruction::ClearOrigin; xcm_size].into()); + + // this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor + // or public fields, so just tuple + // (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed + // to the storage) + (location, xcm).encode().encode() +} + +/// Prepare proof of messages for the `receive_messages_proof` call. +/// +/// In addition to returning valid messages proof, environment is prepared to verify this message +/// proof. +/// +/// This method is intended to be used when benchmarking pallet, linked to the chain that +/// uses GRANDPA finality. For parachains, please use the `prepare_message_proof_from_parachain` +/// function. +pub fn prepare_message_proof_from_grandpa_chain( + params: MessageProofParams, + message_destination: InteriorMultiLocation, +) -> (FromBridgedChainMessagesProof>>, Weight) +where + R: pallet_bridge_grandpa::Config>>, + FI: 'static, + B: MessageBridge, +{ + // prepare storage proof + let (state_root, storage_proof) = prepare_messages_storage_proof::( + params.lane, + params.message_nonces.clone(), + params.outbound_lane_data.clone(), + params.size, + prepare_inbound_message(¶ms, message_destination), + encode_all_messages, + encode_lane_data, + ); + + // update runtime storage + let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::(state_root); + + ( + FromBridgedChainMessagesProof { + bridged_header_hash, + storage_proof, + lane: params.lane, + nonces_start: *params.message_nonces.start(), + nonces_end: *params.message_nonces.end(), + }, + Weight::MAX / 1000, + ) +} + +/// Prepare proof of messages for the `receive_messages_proof` call. +/// +/// In addition to returning valid messages proof, environment is prepared to verify this message +/// proof. +/// +/// This method is intended to be used when benchmarking pallet, linked to the chain that +/// uses parachain finality. For GRANDPA chains, please use the +/// `prepare_message_proof_from_grandpa_chain` function. +pub fn prepare_message_proof_from_parachain( + params: MessageProofParams, + message_destination: InteriorMultiLocation, +) -> (FromBridgedChainMessagesProof>>, Weight) +where + R: pallet_bridge_parachains::Config, + PI: 'static, + B: MessageBridge, + UnderlyingChainOf>: Chain + Parachain, +{ + // prepare storage proof + let (state_root, storage_proof) = prepare_messages_storage_proof::( + params.lane, + params.message_nonces.clone(), + params.outbound_lane_data.clone(), + params.size, + prepare_inbound_message(¶ms, message_destination), + encode_all_messages, + encode_lane_data, + ); + + // update runtime storage + let (_, bridged_header_hash) = + insert_header_to_parachains_pallet::>>(state_root); + + ( + FromBridgedChainMessagesProof { + bridged_header_hash, + storage_proof, + lane: params.lane, + nonces_start: *params.message_nonces.start(), + nonces_end: *params.message_nonces.end(), + }, + Weight::MAX / 1000, + ) +} + +/// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call. +/// +/// This method is intended to be used when benchmarking pallet, linked to the chain that +/// uses GRANDPA finality. For parachains, please use the +/// `prepare_message_delivery_proof_from_parachain` function. +pub fn prepare_message_delivery_proof_from_grandpa_chain( + params: MessageDeliveryProofParams>>, +) -> FromBridgedChainMessagesDeliveryProof>> +where + R: pallet_bridge_grandpa::Config>>, + FI: 'static, + B: MessageBridge, +{ + // prepare storage proof + let lane = params.lane; + let (state_root, storage_proof) = prepare_message_delivery_proof::(params); + + // update runtime storage + let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::(state_root); + + FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: bridged_header_hash.into(), + storage_proof, + lane, + } +} + +/// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call. +/// +/// This method is intended to be used when benchmarking pallet, linked to the chain that +/// uses parachain finality. For GRANDPA chains, please use the +/// `prepare_message_delivery_proof_from_grandpa_chain` function. +pub fn prepare_message_delivery_proof_from_parachain( + params: MessageDeliveryProofParams>>, +) -> FromBridgedChainMessagesDeliveryProof>> +where + R: pallet_bridge_parachains::Config, + PI: 'static, + B: MessageBridge, + UnderlyingChainOf>: Chain + Parachain, +{ + // prepare storage proof + let lane = params.lane; + let (state_root, storage_proof) = prepare_message_delivery_proof::(params); + + // update runtime storage + let (_, bridged_header_hash) = + insert_header_to_parachains_pallet::>>(state_root); + + FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: bridged_header_hash.into(), + storage_proof, + lane, + } +} + +/// Prepare in-memory message delivery proof, without inserting anything to the runtime storage. +fn prepare_message_delivery_proof( + params: MessageDeliveryProofParams>>, +) -> (HashOf>, RawStorageProof) +where + B: MessageBridge, +{ + // prepare Bridged chain storage with inbound lane state + let storage_key = + storage_keys::inbound_lane_data_key(B::BRIDGED_MESSAGES_PALLET_NAME, ¶ms.lane).0; + let mut root = Default::default(); + let mut mdb = MemoryDB::default(); + { + let mut trie = + TrieDBMutBuilderV1::>>::new(&mut mdb, &mut root).build(); + let inbound_lane_data = + grow_trie_leaf_value(params.inbound_lane_data.encode(), params.size); + trie.insert(&storage_key, &inbound_lane_data) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in benchmarks"); + } + + // generate storage proof to be delivered to This chain + let storage_proof = record_all_trie_keys::>>, _>(&mdb, &root) + .map_err(|_| "record_all_trie_keys has failed") + .expect("record_all_trie_keys should not fail in benchmarks"); + + (root, storage_proof) +} + +/// Insert header to the bridge GRANDPA pallet. +pub(crate) fn insert_header_to_grandpa_pallet( + state_root: bp_runtime::HashOf, +) -> (bp_runtime::BlockNumberOf, bp_runtime::HashOf) +where + R: pallet_bridge_grandpa::Config, + GI: 'static, + R::BridgedChain: bp_runtime::Chain, +{ + let bridged_block_number = Zero::zero(); + let bridged_header = bp_runtime::HeaderOf::::new( + bridged_block_number, + Default::default(), + state_root, + Default::default(), + Default::default(), + ); + let bridged_header_hash = bridged_header.hash(); + pallet_bridge_grandpa::initialize_for_benchmarks::(bridged_header); + (bridged_block_number, bridged_header_hash) +} + +/// Insert header to the bridge parachains pallet. +pub(crate) fn insert_header_to_parachains_pallet( + state_root: bp_runtime::HashOf, +) -> (bp_runtime::BlockNumberOf, bp_runtime::HashOf) +where + R: pallet_bridge_parachains::Config, + PI: 'static, + PC: Chain + Parachain, +{ + let bridged_block_number = Zero::zero(); + let bridged_header = bp_runtime::HeaderOf::::new( + bridged_block_number, + Default::default(), + state_root, + Default::default(), + Default::default(), + ); + let bridged_header_hash = bridged_header.hash(); + pallet_bridge_parachains::initialize_for_benchmarks::(bridged_header); + (bridged_block_number, bridged_header_hash) +} diff --git a/bridges/bin/runtime-common/src/messages_call_ext.rs b/bridges/bin/runtime-common/src/messages_call_ext.rs new file mode 100644 index 00000000000..3f48ce583f9 --- /dev/null +++ b/bridges/bin/runtime-common/src/messages_call_ext.rs @@ -0,0 +1,644 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +use crate::messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, +}; +use bp_messages::{InboundLaneData, LaneId, MessageNonce}; +use frame_support::{ + dispatch::CallableCallFor, + traits::{Get, IsSubType}, + RuntimeDebug, +}; +use pallet_bridge_messages::{Config, Pallet}; +use sp_runtime::transaction_validity::TransactionValidity; +use sp_std::ops::RangeInclusive; + +/// Generic info about a messages delivery/confirmation proof. +#[derive(PartialEq, RuntimeDebug)] +pub struct BaseMessagesProofInfo { + /// Message lane, used by the call. + pub lane_id: LaneId, + /// Nonces of messages, included in the call. + /// + /// For delivery transaction, it is nonces of bundled messages. For confirmation + /// transaction, it is nonces that are to be confirmed during the call. + pub bundled_range: RangeInclusive, + /// Nonce of the best message, stored by this chain before the call is dispatched. + /// + /// For delivery transaction, it is the nonce of best delivered message before the call. + /// For confirmation transaction, it is the nonce of best confirmed message before the call. + pub best_stored_nonce: MessageNonce, +} + +impl BaseMessagesProofInfo { + /// Returns true if `bundled_range` continues the `0..=best_stored_nonce` range. + fn appends_to_stored_nonce(&self) -> bool { + *self.bundled_range.start() == self.best_stored_nonce + 1 + } +} + +/// Occupation state of the unrewarded relayers vector. +#[derive(PartialEq, RuntimeDebug)] +#[cfg_attr(test, derive(Default))] +pub struct UnrewardedRelayerOccupation { + /// The number of remaining unoccupied entries for new relayers. + pub free_relayer_slots: MessageNonce, + /// The number of messages that we are ready to accept. + pub free_message_slots: MessageNonce, +} + +/// Info about a `ReceiveMessagesProof` call which tries to update a single lane. +#[derive(PartialEq, RuntimeDebug)] +pub struct ReceiveMessagesProofInfo { + /// Base messages proof info + pub base: BaseMessagesProofInfo, + /// State of unrewarded relayers vector. + pub unrewarded_relayers: UnrewardedRelayerOccupation, +} + +impl ReceiveMessagesProofInfo { + /// Returns true if: + /// + /// - either inbound lane is ready to accept bundled messages; + /// + /// - or there are no bundled messages, but the inbound lane is blocked by too many unconfirmed + /// messages and/or unrewarded relayers. + fn is_obsolete(&self) -> bool { + // transactions with zero bundled nonces are not allowed, unless they're message + // delivery transactions, which brings reward confirmations required to unblock + // the lane + if self.base.bundled_range.is_empty() { + let empty_transactions_allowed = + // we allow empty transactions when we can't accept delivery from new relayers + self.unrewarded_relayers.free_relayer_slots == 0 || + // or if we can't accept new messages at all + self.unrewarded_relayers.free_message_slots == 0; + + return !empty_transactions_allowed + } + + // otherwise we require bundled messages to continue stored range + !self.base.appends_to_stored_nonce() + } +} + +/// Info about a `ReceiveMessagesDeliveryProof` call which tries to update a single lane. +#[derive(PartialEq, RuntimeDebug)] +pub struct ReceiveMessagesDeliveryProofInfo(pub BaseMessagesProofInfo); + +impl ReceiveMessagesDeliveryProofInfo { + /// Returns true if outbound lane is ready to accept confirmations of bundled messages. + fn is_obsolete(&self) -> bool { + self.0.bundled_range.is_empty() || !self.0.appends_to_stored_nonce() + } +} + +/// Info about a `ReceiveMessagesProof` or a `ReceiveMessagesDeliveryProof` call +/// which tries to update a single lane. +#[derive(PartialEq, RuntimeDebug)] +pub enum CallInfo { + ReceiveMessagesProof(ReceiveMessagesProofInfo), + ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo), +} + +impl CallInfo { + /// Returns range of messages, bundled with the call. + pub fn bundled_messages(&self) -> RangeInclusive { + match *self { + Self::ReceiveMessagesProof(ref info) => info.base.bundled_range.clone(), + Self::ReceiveMessagesDeliveryProof(ref info) => info.0.bundled_range.clone(), + } + } +} + +/// Helper struct that provides methods for working with a call supported by `CallInfo`. +pub struct CallHelper, I: 'static> { + pub _phantom_data: sp_std::marker::PhantomData<(T, I)>, +} + +impl, I: 'static> CallHelper { + /// Returns true if: + /// + /// - call is `receive_messages_proof` and all messages have been delivered; + /// + /// - call is `receive_messages_delivery_proof` and all messages confirmations have been + /// received. + pub fn was_successful(info: &CallInfo) -> bool { + match info { + CallInfo::ReceiveMessagesProof(info) => { + let inbound_lane_data = + pallet_bridge_messages::InboundLanes::::get(info.base.lane_id); + if info.base.bundled_range.is_empty() { + let post_occupation = + unrewarded_relayers_occupation::(&inbound_lane_data); + // we don't care about `free_relayer_slots` here - it is checked in + // `is_obsolete` and every relayer has delivered at least one message, + // so if relayer slots are released, then message slots are also + // released + return post_occupation.free_message_slots > + info.unrewarded_relayers.free_message_slots + } + + inbound_lane_data.last_delivered_nonce() == *info.base.bundled_range.end() + }, + CallInfo::ReceiveMessagesDeliveryProof(info) => { + let outbound_lane_data = + pallet_bridge_messages::OutboundLanes::::get(info.0.lane_id); + outbound_lane_data.latest_received_nonce == *info.0.bundled_range.end() + }, + } + } +} + +/// Trait representing a call that is a sub type of `pallet_bridge_messages::Call`. +pub trait MessagesCallSubType, I: 'static>: + IsSubType, T>> +{ + /// Create a new instance of `ReceiveMessagesProofInfo` from a `ReceiveMessagesProof` call. + fn receive_messages_proof_info(&self) -> Option; + + /// Create a new instance of `ReceiveMessagesDeliveryProofInfo` from + /// a `ReceiveMessagesDeliveryProof` call. + fn receive_messages_delivery_proof_info(&self) -> Option; + + /// Create a new instance of `CallInfo` from a `ReceiveMessagesProof` + /// or a `ReceiveMessagesDeliveryProof` call. + fn call_info(&self) -> Option; + + /// Create a new instance of `CallInfo` from a `ReceiveMessagesProof` + /// or a `ReceiveMessagesDeliveryProof` call, if the call is for the provided lane. + fn call_info_for(&self, lane_id: LaneId) -> Option; + + /// Check that a `ReceiveMessagesProof` or a `ReceiveMessagesDeliveryProof` call is trying + /// to deliver/confirm at least some messages that are better than the ones we know of. + fn check_obsolete_call(&self) -> TransactionValidity; +} + +impl< + BridgedHeaderHash, + SourceHeaderChain: bp_messages::target_chain::SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof, + >, + TargetHeaderChain: bp_messages::source_chain::TargetHeaderChain< + >::OutboundPayload, + ::AccountId, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof, + >, + Call: IsSubType, T>>, + T: frame_system::Config + + Config, + I: 'static, + > MessagesCallSubType for T::RuntimeCall +{ + fn receive_messages_proof_info(&self) -> Option { + if let Some(pallet_bridge_messages::Call::::receive_messages_proof { + ref proof, + .. + }) = self.is_sub_type() + { + let inbound_lane_data = pallet_bridge_messages::InboundLanes::::get(proof.lane); + + return Some(ReceiveMessagesProofInfo { + base: BaseMessagesProofInfo { + lane_id: proof.lane, + // we want all messages in this range to be new for us. Otherwise transaction + // will be considered obsolete. + bundled_range: proof.nonces_start..=proof.nonces_end, + best_stored_nonce: inbound_lane_data.last_delivered_nonce(), + }, + unrewarded_relayers: unrewarded_relayers_occupation::(&inbound_lane_data), + }) + } + + None + } + + fn receive_messages_delivery_proof_info(&self) -> Option { + if let Some(pallet_bridge_messages::Call::::receive_messages_delivery_proof { + ref proof, + ref relayers_state, + .. + }) = self.is_sub_type() + { + let outbound_lane_data = pallet_bridge_messages::OutboundLanes::::get(proof.lane); + + return Some(ReceiveMessagesDeliveryProofInfo(BaseMessagesProofInfo { + lane_id: proof.lane, + // there's a time frame between message delivery, message confirmation and reward + // confirmation. Because of that, we can't assume that our state has been confirmed + // to the bridged chain. So we are accepting any proof that brings new + // confirmations. + bundled_range: outbound_lane_data.latest_received_nonce + 1..= + relayers_state.last_delivered_nonce, + best_stored_nonce: outbound_lane_data.latest_received_nonce, + })) + } + + None + } + + fn call_info(&self) -> Option { + if let Some(info) = self.receive_messages_proof_info() { + return Some(CallInfo::ReceiveMessagesProof(info)) + } + + if let Some(info) = self.receive_messages_delivery_proof_info() { + return Some(CallInfo::ReceiveMessagesDeliveryProof(info)) + } + + None + } + + fn call_info_for(&self, lane_id: LaneId) -> Option { + self.call_info().filter(|info| { + let actual_lane_id = match info { + CallInfo::ReceiveMessagesProof(info) => info.base.lane_id, + CallInfo::ReceiveMessagesDeliveryProof(info) => info.0.lane_id, + }; + actual_lane_id == lane_id + }) + } + + fn check_obsolete_call(&self) -> TransactionValidity { + match self.call_info() { + Some(CallInfo::ReceiveMessagesProof(proof_info)) if proof_info.is_obsolete() => { + log::trace!( + target: pallet_bridge_messages::LOG_TARGET, + "Rejecting obsolete messages delivery transaction: {:?}", + proof_info + ); + + return sp_runtime::transaction_validity::InvalidTransaction::Stale.into() + }, + Some(CallInfo::ReceiveMessagesDeliveryProof(proof_info)) + if proof_info.is_obsolete() => + { + log::trace!( + target: pallet_bridge_messages::LOG_TARGET, + "Rejecting obsolete messages confirmation transaction: {:?}", + proof_info, + ); + + return sp_runtime::transaction_validity::InvalidTransaction::Stale.into() + }, + _ => {}, + } + + Ok(sp_runtime::transaction_validity::ValidTransaction::default()) + } +} + +/// Returns occupation state of unrewarded relayers vector. +fn unrewarded_relayers_occupation, I: 'static>( + inbound_lane_data: &InboundLaneData, +) -> UnrewardedRelayerOccupation { + UnrewardedRelayerOccupation { + free_relayer_slots: T::MaxUnrewardedRelayerEntriesAtInboundLane::get() + .saturating_sub(inbound_lane_data.relayers.len() as MessageNonce), + free_message_slots: { + let unconfirmed_messages = inbound_lane_data + .last_delivered_nonce() + .saturating_sub(inbound_lane_data.last_confirmed_nonce); + T::MaxUnconfirmedMessagesAtInboundLane::get().saturating_sub(unconfirmed_messages) + }, + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, + }, + messages_call_ext::MessagesCallSubType, + mock::{ + MaxUnconfirmedMessagesAtInboundLane, MaxUnrewardedRelayerEntriesAtInboundLane, + TestRuntime, ThisChainRuntimeCall, + }, + }; + use bp_messages::{DeliveredMessages, UnrewardedRelayer, UnrewardedRelayersState}; + use sp_std::ops::RangeInclusive; + + fn fill_unrewarded_relayers() { + let mut inbound_lane_state = + pallet_bridge_messages::InboundLanes::::get(LaneId([0, 0, 0, 0])); + for n in 0..MaxUnrewardedRelayerEntriesAtInboundLane::get() { + inbound_lane_state.relayers.push_back(UnrewardedRelayer { + relayer: Default::default(), + messages: DeliveredMessages { begin: n + 1, end: n + 1 }, + }); + } + pallet_bridge_messages::InboundLanes::::insert( + LaneId([0, 0, 0, 0]), + inbound_lane_state, + ); + } + + fn fill_unrewarded_messages() { + let mut inbound_lane_state = + pallet_bridge_messages::InboundLanes::::get(LaneId([0, 0, 0, 0])); + inbound_lane_state.relayers.push_back(UnrewardedRelayer { + relayer: Default::default(), + messages: DeliveredMessages { + begin: 1, + end: MaxUnconfirmedMessagesAtInboundLane::get(), + }, + }); + pallet_bridge_messages::InboundLanes::::insert( + LaneId([0, 0, 0, 0]), + inbound_lane_state, + ); + } + + fn deliver_message_10() { + pallet_bridge_messages::InboundLanes::::insert( + LaneId([0, 0, 0, 0]), + bp_messages::InboundLaneData { relayers: Default::default(), last_confirmed_nonce: 10 }, + ); + } + + fn validate_message_delivery( + nonces_start: bp_messages::MessageNonce, + nonces_end: bp_messages::MessageNonce, + ) -> bool { + ThisChainRuntimeCall::BridgeMessages( + pallet_bridge_messages::Call::::receive_messages_proof { + relayer_id_at_bridged_chain: 42, + messages_count: nonces_end.checked_sub(nonces_start).map(|x| x + 1).unwrap_or(0) + as u32, + dispatch_weight: frame_support::weights::Weight::zero(), + proof: FromBridgedChainMessagesProof { + bridged_header_hash: Default::default(), + storage_proof: vec![], + lane: LaneId([0, 0, 0, 0]), + nonces_start, + nonces_end, + }, + }, + ) + .check_obsolete_call() + .is_ok() + } + + #[test] + fn extension_rejects_obsolete_messages() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + // when current best delivered is message#10 and we're trying to deliver messages 8..=9 + // => tx is rejected + deliver_message_10(); + assert!(!validate_message_delivery(8, 9)); + }); + } + + #[test] + fn extension_rejects_same_message() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + // when current best delivered is message#10 and we're trying to import messages 10..=10 + // => tx is rejected + deliver_message_10(); + assert!(!validate_message_delivery(8, 10)); + }); + } + + #[test] + fn extension_rejects_call_with_some_obsolete_messages() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + // when current best delivered is message#10 and we're trying to deliver messages + // 10..=15 => tx is rejected + deliver_message_10(); + assert!(!validate_message_delivery(10, 15)); + }); + } + + #[test] + fn extension_rejects_call_with_future_messages() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + // when current best delivered is message#10 and we're trying to deliver messages + // 13..=15 => tx is rejected + deliver_message_10(); + assert!(!validate_message_delivery(13, 15)); + }); + } + + #[test] + fn extension_rejects_empty_delivery_with_rewards_confirmations_if_there_are_free_relayer_and_message_slots( + ) { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + deliver_message_10(); + assert!(!validate_message_delivery(10, 9)); + }); + } + + #[test] + fn extension_accepts_empty_delivery_with_rewards_confirmations_if_there_are_no_free_relayer_slots( + ) { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + deliver_message_10(); + fill_unrewarded_relayers(); + assert!(validate_message_delivery(10, 9)); + }); + } + + #[test] + fn extension_accepts_empty_delivery_with_rewards_confirmations_if_there_are_no_free_message_slots( + ) { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + fill_unrewarded_messages(); + assert!(validate_message_delivery( + MaxUnconfirmedMessagesAtInboundLane::get(), + MaxUnconfirmedMessagesAtInboundLane::get() - 1 + )); + }); + } + + #[test] + fn extension_accepts_new_messages() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + // when current best delivered is message#10 and we're trying to deliver message 11..=15 + // => tx is accepted + deliver_message_10(); + assert!(validate_message_delivery(11, 15)); + }); + } + + fn confirm_message_10() { + pallet_bridge_messages::OutboundLanes::::insert( + LaneId([0, 0, 0, 0]), + bp_messages::OutboundLaneData { + oldest_unpruned_nonce: 0, + latest_received_nonce: 10, + latest_generated_nonce: 10, + }, + ); + } + + fn validate_message_confirmation(last_delivered_nonce: bp_messages::MessageNonce) -> bool { + ThisChainRuntimeCall::BridgeMessages( + pallet_bridge_messages::Call::::receive_messages_delivery_proof { + proof: FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: Default::default(), + storage_proof: Vec::new(), + lane: LaneId([0, 0, 0, 0]), + }, + relayers_state: UnrewardedRelayersState { + last_delivered_nonce, + ..Default::default() + }, + }, + ) + .check_obsolete_call() + .is_ok() + } + + #[test] + fn extension_rejects_obsolete_confirmations() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + // when current best confirmed is message#10 and we're trying to confirm message#5 => tx + // is rejected + confirm_message_10(); + assert!(!validate_message_confirmation(5)); + }); + } + + #[test] + fn extension_rejects_same_confirmation() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + // when current best confirmed is message#10 and we're trying to confirm message#10 => + // tx is rejected + confirm_message_10(); + assert!(!validate_message_confirmation(10)); + }); + } + + #[test] + fn extension_rejects_empty_confirmation_even_if_there_are_no_free_unrewarded_entries() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + confirm_message_10(); + fill_unrewarded_relayers(); + assert!(!validate_message_confirmation(10)); + }); + } + + #[test] + fn extension_accepts_new_confirmation() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + // when current best confirmed is message#10 and we're trying to confirm message#15 => + // tx is accepted + confirm_message_10(); + assert!(validate_message_confirmation(15)); + }); + } + + fn was_message_delivery_successful( + bundled_range: RangeInclusive, + is_empty: bool, + ) -> bool { + CallHelper::::was_successful(&CallInfo::ReceiveMessagesProof( + ReceiveMessagesProofInfo { + base: BaseMessagesProofInfo { + lane_id: LaneId([0, 0, 0, 0]), + bundled_range, + best_stored_nonce: 0, // doesn't matter for `was_successful` + }, + unrewarded_relayers: UnrewardedRelayerOccupation { + free_relayer_slots: 0, // doesn't matter for `was_successful` + free_message_slots: if is_empty { + 0 + } else { + MaxUnconfirmedMessagesAtInboundLane::get() + }, + }, + }, + )) + } + + #[test] + #[allow(clippy::reversed_empty_ranges)] + fn was_successful_returns_false_for_failed_reward_confirmation_transaction() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + fill_unrewarded_messages(); + assert!(!was_message_delivery_successful(10..=9, true)); + }); + } + + #[test] + #[allow(clippy::reversed_empty_ranges)] + fn was_successful_returns_true_for_successful_reward_confirmation_transaction() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + assert!(was_message_delivery_successful(10..=9, true)); + }); + } + + #[test] + fn was_successful_returns_false_for_failed_delivery() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + deliver_message_10(); + assert!(!was_message_delivery_successful(10..=12, false)); + }); + } + + #[test] + fn was_successful_returns_false_for_partially_successful_delivery() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + deliver_message_10(); + assert!(!was_message_delivery_successful(9..=12, false)); + }); + } + + #[test] + fn was_successful_returns_true_for_successful_delivery() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + deliver_message_10(); + assert!(was_message_delivery_successful(9..=10, false)); + }); + } + + fn was_message_confirmation_successful(bundled_range: RangeInclusive) -> bool { + CallHelper::::was_successful(&CallInfo::ReceiveMessagesDeliveryProof( + ReceiveMessagesDeliveryProofInfo(BaseMessagesProofInfo { + lane_id: LaneId([0, 0, 0, 0]), + bundled_range, + best_stored_nonce: 0, // doesn't matter for `was_successful` + }), + )) + } + + #[test] + fn was_successful_returns_false_for_failed_confirmation() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + confirm_message_10(); + assert!(!was_message_confirmation_successful(10..=12)); + }); + } + + #[test] + fn was_successful_returns_false_for_partially_successful_confirmation() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + confirm_message_10(); + assert!(!was_message_confirmation_successful(9..=12)); + }); + } + + #[test] + fn was_successful_returns_true_for_successful_confirmation() { + sp_io::TestExternalities::new(Default::default()).execute_with(|| { + confirm_message_10(); + assert!(was_message_confirmation_successful(9..=10)); + }); + } +} diff --git a/bridges/bin/runtime-common/src/messages_generation.rs b/bridges/bin/runtime-common/src/messages_generation.rs new file mode 100644 index 00000000000..29a869a5c87 --- /dev/null +++ b/bridges/bin/runtime-common/src/messages_generation.rs @@ -0,0 +1,119 @@ +// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Helpers for generating message storage proofs, that are used by tests and by benchmarks. + +#![cfg(any(feature = "runtime-benchmarks", test))] + +use crate::messages::{BridgedChain, HashOf, HasherOf, MessageBridge}; + +use bp_messages::{ + storage_keys, LaneId, MessageKey, MessageNonce, MessagePayload, OutboundLaneData, +}; +use bp_runtime::{record_all_trie_keys, RawStorageProof, StorageProofSize}; +use codec::Encode; +use sp_std::{ops::RangeInclusive, prelude::*}; +use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; + +/// Simple and correct message data encode function. +pub(crate) fn encode_all_messages(_: MessageNonce, m: &MessagePayload) -> Option> { + Some(m.encode()) +} + +/// Simple and correct outbound lane data encode function. +pub(crate) fn encode_lane_data(d: &OutboundLaneData) -> Vec { + d.encode() +} + +/// Prepare storage proof of given messages. +/// +/// Returns state trie root and nodes with prepared messages. +pub(crate) fn prepare_messages_storage_proof( + lane: LaneId, + message_nonces: RangeInclusive, + outbound_lane_data: Option, + size: StorageProofSize, + message_payload: MessagePayload, + encode_message: impl Fn(MessageNonce, &MessagePayload) -> Option>, + encode_outbound_lane_data: impl Fn(&OutboundLaneData) -> Vec, +) -> (HashOf>, RawStorageProof) +where + B: MessageBridge, + HashOf>: Copy + Default, +{ + // prepare Bridged chain storage with messages and (optionally) outbound lane state + let message_count = message_nonces.end().saturating_sub(*message_nonces.start()) + 1; + let mut storage_keys = Vec::with_capacity(message_count as usize + 1); + let mut root = Default::default(); + let mut mdb = MemoryDB::default(); + { + let mut trie = + TrieDBMutBuilderV1::>>::new(&mut mdb, &mut root).build(); + + // insert messages + for (i, nonce) in message_nonces.into_iter().enumerate() { + let message_key = MessageKey { lane_id: lane, nonce }; + let message_payload = match encode_message(nonce, &message_payload) { + Some(message_payload) => + if i == 0 { + grow_trie_leaf_value(message_payload, size) + } else { + message_payload + }, + None => continue, + }; + let storage_key = storage_keys::message_key( + B::BRIDGED_MESSAGES_PALLET_NAME, + &message_key.lane_id, + message_key.nonce, + ) + .0; + trie.insert(&storage_key, &message_payload) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in benchmarks"); + storage_keys.push(storage_key); + } + + // insert outbound lane state + if let Some(outbound_lane_data) = outbound_lane_data.as_ref().map(encode_outbound_lane_data) + { + let storage_key = + storage_keys::outbound_lane_data_key(B::BRIDGED_MESSAGES_PALLET_NAME, &lane).0; + trie.insert(&storage_key, &outbound_lane_data) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in benchmarks"); + storage_keys.push(storage_key); + } + } + + // generate storage proof to be delivered to This chain + let storage_proof = record_all_trie_keys::>>, _>(&mdb, &root) + .map_err(|_| "record_all_trie_keys has failed") + .expect("record_all_trie_keys should not fail in benchmarks"); + (root, storage_proof) +} + +/// Add extra data to the trie leaf value so that it'll be of given size. +pub fn grow_trie_leaf_value(mut value: Vec, size: StorageProofSize) -> Vec { + match size { + StorageProofSize::Minimal(_) => (), + StorageProofSize::HasLargeLeaf(size) if size as usize > value.len() => { + value.extend(sp_std::iter::repeat(42u8).take(size as usize - value.len())); + }, + StorageProofSize::HasLargeLeaf(_) => (), + } + value +} diff --git a/bridges/bin/runtime-common/src/messages_xcm_extension.rs b/bridges/bin/runtime-common/src/messages_xcm_extension.rs new file mode 100644 index 00000000000..96fdf1d5018 --- /dev/null +++ b/bridges/bin/runtime-common/src/messages_xcm_extension.rs @@ -0,0 +1,152 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Module provides utilities for easier XCM handling, e.g: +//! `XcmExecutor` -> `MessageSender` -> `OutboundMessageQueue` +//! | +//! `Relayer` +//! | +//! `XcmRouter` <- `MessageDispatch` <- `InboundMessageQueue` + +use bp_messages::{ + source_chain::MessagesBridge, + target_chain::{DispatchMessage, MessageDispatch}, + LaneId, +}; +use bp_runtime::messages::MessageDispatchResult; +use codec::{Decode, Encode}; +use frame_support::{dispatch::Weight, CloneNoBound, EqNoBound, PartialEqNoBound}; +use pallet_bridge_messages::WeightInfoExt as MessagesPalletWeights; +use scale_info::TypeInfo; +use sp_runtime::SaturatedConversion; +use xcm_builder::{DispatchBlob, DispatchBlobError, HaulBlob, HaulBlobError}; + +/// Plain "XCM" payload, which we transfer through bridge +pub type XcmAsPlainPayload = sp_std::prelude::Vec; + +/// Message dispatch result type for single message +#[derive(CloneNoBound, EqNoBound, PartialEqNoBound, Encode, Decode, Debug, TypeInfo)] +pub enum XcmBlobMessageDispatchResult { + InvalidPayload, + Dispatched, + NotDispatched(#[codec(skip)] Option), +} + +/// [`XcmBlobMessageDispatch`] is responsible for dispatching received messages +pub struct XcmBlobMessageDispatch { + _marker: sp_std::marker::PhantomData<(DispatchBlob, Weights)>, +} + +impl MessageDispatch + for XcmBlobMessageDispatch +{ + type DispatchPayload = XcmAsPlainPayload; + type DispatchLevelResult = XcmBlobMessageDispatchResult; + + fn dispatch_weight(message: &mut DispatchMessage) -> Weight { + match message.data.payload { + Ok(ref payload) => { + let payload_size = payload.encoded_size().saturated_into(); + Weights::message_dispatch_weight(payload_size) + }, + Err(_) => Weight::zero(), + } + } + + fn dispatch( + message: DispatchMessage, + ) -> MessageDispatchResult { + let payload = match message.data.payload { + Ok(payload) => payload, + Err(e) => { + log::error!( + target: crate::LOG_TARGET_BRIDGE_DISPATCH, + "[XcmBlobMessageDispatch] payload error: {:?} - message_nonce: {:?}", + e, + message.key.nonce + ); + return MessageDispatchResult { + unspent_weight: Weight::zero(), + dispatch_level_result: XcmBlobMessageDispatchResult::InvalidPayload, + } + }, + }; + let dispatch_level_result = match BlobDispatcher::dispatch_blob(payload) { + Ok(_) => { + log::debug!( + target: crate::LOG_TARGET_BRIDGE_DISPATCH, + "[XcmBlobMessageDispatch] DispatchBlob::dispatch_blob was ok - message_nonce: {:?}", + message.key.nonce + ); + XcmBlobMessageDispatchResult::Dispatched + }, + Err(e) => { + log::error!( + target: crate::LOG_TARGET_BRIDGE_DISPATCH, + "[XcmBlobMessageDispatch] DispatchBlob::dispatch_blob failed, error: {:?} - message_nonce: {:?}", + e, message.key.nonce + ); + XcmBlobMessageDispatchResult::NotDispatched(Some(e)) + }, + }; + MessageDispatchResult { unspent_weight: Weight::zero(), dispatch_level_result } + } +} + +/// [`XcmBlobHauler`] is responsible for sending messages to the bridge "point-to-point link" from +/// one side, where on the other it can be dispatched by [`XcmBlobMessageDispatch`]. +pub trait XcmBlobHauler { + /// Runtime message sender adapter. + type MessageSender: MessagesBridge; + + /// Runtime message sender origin, which is used by [`Self::MessageSender`]. + type MessageSenderOrigin; + /// Our location within the Consensus Universe. + fn message_sender_origin() -> Self::MessageSenderOrigin; + + /// Return message lane (as "point-to-point link") used to deliver XCM messages. + fn xcm_lane() -> LaneId; +} + +/// XCM bridge adapter which connects [`XcmBlobHauler`] with [`XcmBlobHauler::MessageSender`] and +/// makes sure that XCM blob is sent to the [`pallet_bridge_messages`] queue to be relayed. +pub struct XcmBlobHaulerAdapter(sp_std::marker::PhantomData); +impl> HaulBlob + for XcmBlobHaulerAdapter +{ + fn haul_blob(blob: sp_std::prelude::Vec) -> Result<(), HaulBlobError> { + let lane = H::xcm_lane(); + H::MessageSender::send_message(H::message_sender_origin(), lane, blob) + .map(|artifacts| (lane, artifacts.nonce).using_encoded(sp_io::hashing::blake2_256)) + .map(|result| { + log::info!( + target: crate::LOG_TARGET_BRIDGE_DISPATCH, + "haul_blob result - ok: {:?} on lane: {:?}", + result, + lane + ) + }) + .map_err(|error| { + log::error!( + target: crate::LOG_TARGET_BRIDGE_DISPATCH, + "haul_blob result - error: {:?} on lane: {:?}", + error, + lane + ); + HaulBlobError::Transport("MessageSenderError") + }) + } +} diff --git a/bridges/bin/runtime-common/src/mock.rs b/bridges/bin/runtime-common/src/mock.rs new file mode 100644 index 00000000000..c1767199676 --- /dev/null +++ b/bridges/bin/runtime-common/src/mock.rs @@ -0,0 +1,424 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! A mock runtime for testing different stuff in the crate. We've been using Millau +//! runtime for that before, but it has two drawbacks: +//! +//! - circular dependencies between this crate and Millau runtime; +//! +//! - we can't use (e.g. as git subtree or by copying) this crate in repo without Millau. + +#![cfg(test)] + +use crate::messages::{ + source::{ + FromThisChainMaximalOutboundPayloadSize, FromThisChainMessagePayload, + FromThisChainMessageVerifier, TargetHeaderChainAdapter, + }, + target::{FromBridgedChainMessagePayload, SourceHeaderChainAdapter}, + BridgedChainWithMessages, HashOf, MessageBridge, ThisChainWithMessages, +}; + +use bp_header_chain::{ChainWithGrandpa, HeaderChain}; +use bp_messages::{target_chain::ForbidInboundMessages, LaneId, MessageNonce}; +use bp_parachains::SingleParaStoredHeaderDataBuilder; +use bp_relayers::PayRewardFromAccount; +use bp_runtime::{Chain, ChainId, Parachain, UnderlyingChainProvider}; +use codec::{Decode, Encode}; +use frame_support::{ + parameter_types, + weights::{ConstantMultiplier, IdentityFee, RuntimeDbWeight, Weight}, +}; +use pallet_transaction_payment::Multiplier; +use sp_runtime::{ + testing::H256, + traits::{BlakeTwo256, ConstU32, ConstU64, ConstU8, IdentityLookup}, + FixedPointNumber, Perquintill, +}; + +/// Account identifier at `ThisChain`. +pub type ThisChainAccountId = u64; +/// Balance at `ThisChain`. +pub type ThisChainBalance = u64; +/// Block number at `ThisChain`. +pub type ThisChainBlockNumber = u32; +/// Hash at `ThisChain`. +pub type ThisChainHash = H256; +/// Hasher at `ThisChain`. +pub type ThisChainHasher = BlakeTwo256; +/// Runtime call at `ThisChain`. +pub type ThisChainRuntimeCall = RuntimeCall; +/// Runtime call origin at `ThisChain`. +pub type ThisChainCallOrigin = RuntimeOrigin; +/// Header of `ThisChain`. +pub type ThisChainHeader = sp_runtime::generic::Header; +/// Block of `ThisChain`. +pub type ThisChainBlock = frame_system::mocking::MockBlock; +/// Unchecked extrinsic of `ThisChain`. +pub type ThisChainUncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; + +/// Account identifier at the `BridgedChain`. +pub type BridgedChainAccountId = u128; +/// Balance at the `BridgedChain`. +pub type BridgedChainBalance = u128; +/// Block number at the `BridgedChain`. +pub type BridgedChainBlockNumber = u32; +/// Hash at the `BridgedChain`. +pub type BridgedChainHash = H256; +/// Hasher at the `BridgedChain`. +pub type BridgedChainHasher = BlakeTwo256; +/// Header of the `BridgedChain`. +pub type BridgedChainHeader = + sp_runtime::generic::Header; + +/// Rewards payment procedure. +pub type TestPaymentProcedure = PayRewardFromAccount; +/// Stake that we are using in tests. +pub type TestStake = ConstU64<5_000>; +/// Stake and slash mechanism to use in tests. +pub type TestStakeAndSlash = pallet_bridge_relayers::StakeAndSlashNamed< + ThisChainAccountId, + ThisChainBlockNumber, + Balances, + ReserveId, + TestStake, + ConstU32<8>, +>; + +/// Message lane used in tests. +pub const TEST_LANE_ID: LaneId = LaneId([0, 0, 0, 0]); +/// Bridged chain id used in tests. +pub const TEST_BRIDGED_CHAIN_ID: ChainId = *b"brdg"; +/// Maximal extrinsic weight at the `BridgedChain`. +pub const BRIDGED_CHAIN_MAX_EXTRINSIC_WEIGHT: usize = 2048; +/// Maximal extrinsic size at the `BridgedChain`. +pub const BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE: u32 = 1024; + +frame_support::construct_runtime! { + pub enum TestRuntime where + Block = ThisChainBlock, + NodeBlock = ThisChainBlock, + UncheckedExtrinsic = ThisChainUncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Utility: pallet_utility, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event}, + BridgeRelayers: pallet_bridge_relayers::{Pallet, Call, Storage, Event}, + BridgeGrandpa: pallet_bridge_grandpa::{Pallet, Call, Storage, Event}, + BridgeParachains: pallet_bridge_parachains::{Pallet, Call, Storage, Event}, + BridgeMessages: pallet_bridge_messages::{Pallet, Call, Storage, Event, Config}, + } +} + +crate::generate_bridge_reject_obsolete_headers_and_messages! { + ThisChainRuntimeCall, ThisChainAccountId, + BridgeGrandpa, BridgeParachains, BridgeMessages +} + +parameter_types! { + pub const ActiveOutboundLanes: &'static [LaneId] = &[TEST_LANE_ID]; + pub const BridgedChainId: ChainId = TEST_BRIDGED_CHAIN_ID; + pub const BridgedParasPalletName: &'static str = "Paras"; + pub const ExistentialDeposit: ThisChainBalance = 500; + pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { read: 1, write: 2 }; + pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); + pub const TransactionBaseFee: ThisChainBalance = 0; + pub const TransactionByteFee: ThisChainBalance = 1; + pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(3, 100_000); + pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 1_000_000u128); + pub MaximumMultiplier: Multiplier = sp_runtime::traits::Bounded::max_value(); + pub const MaxUnrewardedRelayerEntriesAtInboundLane: MessageNonce = 16; + pub const MaxUnconfirmedMessagesAtInboundLane: MessageNonce = 1_000; + pub const ReserveId: [u8; 8] = *b"brdgrlrs"; +} + +impl frame_system::Config for TestRuntime { + type RuntimeOrigin = RuntimeOrigin; + type Index = u64; + type RuntimeCall = RuntimeCall; + type BlockNumber = ThisChainBlockNumber; + type Hash = ThisChainHash; + type Hashing = ThisChainHasher; + type AccountId = ThisChainAccountId; + type Lookup = IdentityLookup; + type Header = ThisChainHeader; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU32<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type BaseCallFilter = frame_support::traits::Everything; + type SystemWeightInfo = (); + type BlockWeights = (); + type BlockLength = (); + type DbWeight = DbWeight; + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +impl pallet_utility::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type PalletsOrigin = OriginCaller; + type WeightInfo = (); +} + +impl pallet_balances::Config for TestRuntime { + type Balance = ThisChainBalance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxLocks = ConstU32<50>; + type MaxReserves = ConstU32<50>; + type ReserveIdentifier = [u8; 8]; + type HoldIdentifier = (); + type FreezeIdentifier = (); + type MaxHolds = ConstU32<0>; + type MaxFreezes = ConstU32<0>; +} + +impl pallet_transaction_payment::Config for TestRuntime { + type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; + type OperationalFeeMultiplier = ConstU8<5>; + type WeightToFee = IdentityFee; + type LengthToFee = ConstantMultiplier; + type FeeMultiplierUpdate = pallet_transaction_payment::TargetedFeeAdjustment< + TestRuntime, + TargetBlockFullness, + AdjustmentVariable, + MinimumMultiplier, + MaximumMultiplier, + >; + type RuntimeEvent = RuntimeEvent; +} + +impl pallet_bridge_grandpa::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = BridgedUnderlyingChain; + type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; + type HeadersToKeep = ConstU32<8>; + type WeightInfo = pallet_bridge_grandpa::weights::BridgeWeight; +} + +impl pallet_bridge_parachains::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgesGrandpaPalletInstance = (); + type ParasPalletName = BridgedParasPalletName; + type ParaStoredHeaderDataBuilder = + SingleParaStoredHeaderDataBuilder; + type HeadsToKeep = ConstU32<8>; + type MaxParaHeadDataSize = ConstU32<1024>; + type WeightInfo = pallet_bridge_parachains::weights::BridgeWeight; +} + +impl pallet_bridge_messages::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = pallet_bridge_messages::weights::BridgeWeight; + type ActiveOutboundLanes = ActiveOutboundLanes; + type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; + type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; + + type MaximalOutboundPayloadSize = FromThisChainMaximalOutboundPayloadSize; + type OutboundPayload = FromThisChainMessagePayload; + + type InboundPayload = FromBridgedChainMessagePayload; + type InboundRelayer = BridgedChainAccountId; + type DeliveryPayments = (); + + type TargetHeaderChain = TargetHeaderChainAdapter; + type LaneMessageVerifier = FromThisChainMessageVerifier; + type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter< + TestRuntime, + (), + ConstU64<100_000>, + >; + + type SourceHeaderChain = SourceHeaderChainAdapter; + type MessageDispatch = ForbidInboundMessages<(), FromBridgedChainMessagePayload>; + type BridgedChainId = BridgedChainId; +} + +impl pallet_bridge_relayers::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type Reward = ThisChainBalance; + type PaymentProcedure = TestPaymentProcedure; + type StakeAndSlash = TestStakeAndSlash; + type WeightInfo = (); +} + +/// Bridge that is deployed on `ThisChain` and allows sending/receiving messages to/from +/// `BridgedChain`. +#[derive(Debug, PartialEq, Eq)] +pub struct OnThisChainBridge; + +impl MessageBridge for OnThisChainBridge { + const BRIDGED_MESSAGES_PALLET_NAME: &'static str = ""; + + type ThisChain = ThisChain; + type BridgedChain = BridgedChain; + type BridgedHeaderChain = pallet_bridge_grandpa::GrandpaChainHeaders; +} + +/// Bridge that is deployed on `BridgedChain` and allows sending/receiving messages to/from +/// `ThisChain`. +#[derive(Debug, PartialEq, Eq)] +pub struct OnBridgedChainBridge; + +impl MessageBridge for OnBridgedChainBridge { + const BRIDGED_MESSAGES_PALLET_NAME: &'static str = ""; + + type ThisChain = BridgedChain; + type BridgedChain = ThisChain; + type BridgedHeaderChain = ThisHeaderChain; +} + +/// Dummy implementation of `HeaderChain` for `ThisChain` at the `BridgedChain`. +pub struct ThisHeaderChain; + +impl HeaderChain for ThisHeaderChain { + fn finalized_header_state_root(_hash: HashOf) -> Option> { + unreachable!() + } +} + +/// Call origin at `BridgedChain`. +#[derive(Clone, Debug)] +pub struct BridgedChainOrigin; + +impl From + for Result, BridgedChainOrigin> +{ + fn from( + _origin: BridgedChainOrigin, + ) -> Result, BridgedChainOrigin> { + unreachable!() + } +} + +/// Underlying chain of `ThisChain`. +pub struct ThisUnderlyingChain; + +impl Chain for ThisUnderlyingChain { + type BlockNumber = ThisChainBlockNumber; + type Hash = ThisChainHash; + type Hasher = ThisChainHasher; + type Header = ThisChainHeader; + type AccountId = ThisChainAccountId; + type Balance = ThisChainBalance; + type Index = u32; + type Signature = sp_runtime::MultiSignature; + + fn max_extrinsic_size() -> u32 { + BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE + } + + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +/// The chain where we are in tests. +pub struct ThisChain; + +impl UnderlyingChainProvider for ThisChain { + type Chain = ThisUnderlyingChain; +} + +impl ThisChainWithMessages for ThisChain { + type RuntimeOrigin = ThisChainCallOrigin; +} + +impl BridgedChainWithMessages for ThisChain {} + +/// Underlying chain of `BridgedChain`. +pub struct BridgedUnderlyingChain; +/// Some parachain under `BridgedChain` consensus. +pub struct BridgedUnderlyingParachain; +/// Runtime call of the `BridgedChain`. +#[derive(Decode, Encode)] +pub struct BridgedChainCall; + +impl Chain for BridgedUnderlyingChain { + type BlockNumber = BridgedChainBlockNumber; + type Hash = BridgedChainHash; + type Hasher = BridgedChainHasher; + type Header = BridgedChainHeader; + type AccountId = BridgedChainAccountId; + type Balance = BridgedChainBalance; + type Index = u32; + type Signature = sp_runtime::MultiSignature; + + fn max_extrinsic_size() -> u32 { + BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl ChainWithGrandpa for BridgedUnderlyingChain { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; + const MAX_AUTHORITIES_COUNT: u32 = 16; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const MAX_HEADER_SIZE: u32 = 256; + const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = 64; +} + +impl Chain for BridgedUnderlyingParachain { + type BlockNumber = BridgedChainBlockNumber; + type Hash = BridgedChainHash; + type Hasher = BridgedChainHasher; + type Header = BridgedChainHeader; + type AccountId = BridgedChainAccountId; + type Balance = BridgedChainBalance; + type Index = u32; + type Signature = sp_runtime::MultiSignature; + + fn max_extrinsic_size() -> u32 { + BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl Parachain for BridgedUnderlyingParachain { + const PARACHAIN_ID: u32 = 42; +} + +/// The other, bridged chain, used in tests. +pub struct BridgedChain; + +impl UnderlyingChainProvider for BridgedChain { + type Chain = BridgedUnderlyingChain; +} + +impl ThisChainWithMessages for BridgedChain { + type RuntimeOrigin = BridgedChainOrigin; +} + +impl BridgedChainWithMessages for BridgedChain {} + +/// Run test within test externalities. +pub fn run_test(test: impl FnOnce()) { + sp_io::TestExternalities::new(Default::default()).execute_with(test) +} diff --git a/bridges/bin/runtime-common/src/parachains_benchmarking.rs b/bridges/bin/runtime-common/src/parachains_benchmarking.rs new file mode 100644 index 00000000000..aad53673c3a --- /dev/null +++ b/bridges/bin/runtime-common/src/parachains_benchmarking.rs @@ -0,0 +1,88 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Everything required to run benchmarks of parachains finality module. + +#![cfg(feature = "runtime-benchmarks")] + +use crate::{ + messages_benchmarking::insert_header_to_grandpa_pallet, + messages_generation::grow_trie_leaf_value, +}; + +use bp_parachains::parachain_head_storage_key_at_source; +use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; +use bp_runtime::{record_all_trie_keys, StorageProofSize}; +use codec::Encode; +use frame_support::traits::Get; +use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber}; +use sp_std::prelude::*; +use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; + +/// Prepare proof of messages for the `receive_messages_proof` call. +/// +/// In addition to returning valid messages proof, environment is prepared to verify this message +/// proof. +pub fn prepare_parachain_heads_proof( + parachains: &[ParaId], + parachain_head_size: u32, + size: StorageProofSize, +) -> (RelayBlockNumber, RelayBlockHash, ParaHeadsProof, Vec<(ParaId, ParaHash)>) +where + R: pallet_bridge_parachains::Config + + pallet_bridge_grandpa::Config, + PI: 'static, + >::BridgedChain: + bp_runtime::Chain, +{ + let parachain_head = ParaHead(vec![0u8; parachain_head_size as usize]); + + // insert all heads to the trie + let mut parachain_heads = Vec::with_capacity(parachains.len()); + let mut storage_keys = Vec::with_capacity(parachains.len()); + let mut state_root = Default::default(); + let mut mdb = MemoryDB::default(); + { + let mut trie = + TrieDBMutBuilderV1::::new(&mut mdb, &mut state_root).build(); + + // insert parachain heads + for (i, parachain) in parachains.into_iter().enumerate() { + let storage_key = + parachain_head_storage_key_at_source(R::ParasPalletName::get(), *parachain); + let leaf_data = if i == 0 { + grow_trie_leaf_value(parachain_head.encode(), size) + } else { + parachain_head.encode() + }; + trie.insert(&storage_key.0, &leaf_data) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in benchmarks"); + storage_keys.push(storage_key); + parachain_heads.push((*parachain, parachain_head.hash())) + } + } + + // generate heads storage proof + let proof = record_all_trie_keys::, _>(&mdb, &state_root) + .map_err(|_| "record_all_trie_keys has failed") + .expect("record_all_trie_keys should not fail in benchmarks"); + + let (relay_block_number, relay_block_hash) = + insert_header_to_grandpa_pallet::(state_root); + + (relay_block_number, relay_block_hash, ParaHeadsProof(proof), parachain_heads) +} diff --git a/bridges/bin/runtime-common/src/priority_calculator.rs b/bridges/bin/runtime-common/src/priority_calculator.rs new file mode 100644 index 00000000000..590de05fb1c --- /dev/null +++ b/bridges/bin/runtime-common/src/priority_calculator.rs @@ -0,0 +1,201 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Bridge transaction priority calculator. +//! +//! We want to prioritize message delivery transactions with more messages over +//! transactions with less messages. That's because we reject delivery transactions +//! if it contains already delivered message. And if some transaction delivers +//! single message with nonce `N`, then the transaction with nonces `N..=N+100` will +//! be rejected. This can lower bridge throughput down to one message per block. + +use bp_messages::MessageNonce; +use frame_support::traits::Get; +use sp_runtime::transaction_validity::TransactionPriority; + +// reexport everything from `integrity_tests` module +pub use integrity_tests::*; + +/// Compute priority boost for message delivery transaction that delivers +/// given number of messages. +pub fn compute_priority_boost( + messages: MessageNonce, +) -> TransactionPriority +where + PriorityBoostPerMessage: Get, +{ + // we don't want any boost for transaction with single message => minus one + PriorityBoostPerMessage::get().saturating_mul(messages - 1) +} + +#[cfg(not(feature = "integrity-test"))] +mod integrity_tests {} + +#[cfg(feature = "integrity-test")] +mod integrity_tests { + use super::compute_priority_boost; + + use bp_messages::MessageNonce; + use bp_runtime::PreComputedSize; + use frame_support::{ + dispatch::{DispatchClass, DispatchInfo, Dispatchable, Pays, PostDispatchInfo}, + traits::Get, + }; + use pallet_bridge_messages::WeightInfoExt; + use pallet_transaction_payment::OnChargeTransaction; + use sp_runtime::{ + traits::{UniqueSaturatedInto, Zero}, + transaction_validity::TransactionPriority, + FixedPointOperand, SaturatedConversion, Saturating, + }; + + type BalanceOf = + <::OnChargeTransaction as OnChargeTransaction< + T, + >>::Balance; + + /// Ensures that the value of `PriorityBoostPerMessage` matches the value of + /// `tip_boost_per_message`. + /// + /// We want two transactions, `TX1` with `N` messages and `TX2` with `N+1` messages, have almost + /// the same priority if we'll add `tip_boost_per_message` tip to the `TX1`. We want to be sure + /// that if we add plain `PriorityBoostPerMessage` priority to `TX1`, the priority will be close + /// to `TX2` as well. + pub fn ensure_priority_boost_is_sane( + tip_boost_per_message: BalanceOf, + ) where + Runtime: + pallet_transaction_payment::Config + pallet_bridge_messages::Config, + MessagesInstance: 'static, + PriorityBoostPerMessage: Get, + Runtime::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + FixedPointOperand, + { + let priority_boost_per_message = PriorityBoostPerMessage::get(); + let maximal_messages_in_delivery_transaction = + Runtime::MaxUnconfirmedMessagesAtInboundLane::get(); + for messages in 1..=maximal_messages_in_delivery_transaction { + let base_priority = estimate_message_delivery_transaction_priority::< + Runtime, + MessagesInstance, + >(messages, Zero::zero()); + let priority_boost = compute_priority_boost::(messages); + let priority_with_boost = base_priority + priority_boost; + + let tip = tip_boost_per_message.saturating_mul((messages - 1).unique_saturated_into()); + let priority_with_tip = + estimate_message_delivery_transaction_priority::(1, tip); + + const ERROR_MARGIN: TransactionPriority = 5; // 5% + if priority_with_boost.abs_diff(priority_with_tip).saturating_mul(100) / + priority_with_tip > + ERROR_MARGIN + { + panic!( + "The PriorityBoostPerMessage value ({}) must be fixed to: {}", + priority_boost_per_message, + compute_priority_boost_per_message::( + tip_boost_per_message + ), + ); + } + } + } + + /// Compute priority boost that we give to message delivery transaction for additional message. + #[cfg(feature = "integrity-test")] + fn compute_priority_boost_per_message( + tip_boost_per_message: BalanceOf, + ) -> TransactionPriority + where + Runtime: + pallet_transaction_payment::Config + pallet_bridge_messages::Config, + MessagesInstance: 'static, + Runtime::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + FixedPointOperand, + { + // esimate priority of transaction that delivers one message and has large tip + let maximal_messages_in_delivery_transaction = + Runtime::MaxUnconfirmedMessagesAtInboundLane::get(); + let small_with_tip_priority = + estimate_message_delivery_transaction_priority::( + 1, + tip_boost_per_message + .saturating_mul(maximal_messages_in_delivery_transaction.saturated_into()), + ); + // estimate priority of transaction that delivers maximal number of messages, but has no tip + let large_without_tip_priority = estimate_message_delivery_transaction_priority::< + Runtime, + MessagesInstance, + >(maximal_messages_in_delivery_transaction, Zero::zero()); + + small_with_tip_priority + .saturating_sub(large_without_tip_priority) + .saturating_div(maximal_messages_in_delivery_transaction - 1) + } + + /// Estimate message delivery transaction priority. + #[cfg(feature = "integrity-test")] + fn estimate_message_delivery_transaction_priority( + messages: MessageNonce, + tip: BalanceOf, + ) -> TransactionPriority + where + Runtime: + pallet_transaction_payment::Config + pallet_bridge_messages::Config, + MessagesInstance: 'static, + Runtime::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + FixedPointOperand, + { + // just an estimation of extra transaction bytes that are added to every transaction + // (including signature, signed extensions extra and etc + in our case it includes + // all call arguments extept the proof itself) + let base_tx_size = 512; + // let's say we are relaying similar small messages and for every message we add more trie + // nodes to the proof (x0.5 because we expect some nodes to be reused) + let estimated_message_size = 512; + // let's say all our messages have the same dispatch weight + let estimated_message_dispatch_weight = + Runtime::WeightInfo::message_dispatch_weight(estimated_message_size); + // messages proof argument size is (for every message) messages size + some additional + // trie nodes. Some of them are reused by different messages, so let's take 2/3 of default + // "overhead" constant + let messages_proof_size = Runtime::WeightInfo::expected_extra_storage_proof_size() + .saturating_mul(2) + .saturating_div(3) + .saturating_add(estimated_message_size) + .saturating_mul(messages as _); + + // finally we are able to estimate transaction size and weight + let transaction_size = base_tx_size.saturating_add(messages_proof_size); + let transaction_weight = Runtime::WeightInfo::receive_messages_proof_weight( + &PreComputedSize(transaction_size as _), + messages as _, + estimated_message_dispatch_weight.saturating_mul(messages), + ); + + pallet_transaction_payment::ChargeTransactionPayment::::get_priority( + &DispatchInfo { + weight: transaction_weight, + class: DispatchClass::Normal, + pays_fee: Pays::Yes, + }, + transaction_size as _, + tip, + Zero::zero(), + ) + } +} diff --git a/bridges/bin/runtime-common/src/refund_relayer_extension.rs b/bridges/bin/runtime-common/src/refund_relayer_extension.rs new file mode 100644 index 00000000000..00ea70aa04e --- /dev/null +++ b/bridges/bin/runtime-common/src/refund_relayer_extension.rs @@ -0,0 +1,1730 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Signed extension that refunds relayer if he has delivered some new messages. +//! It also refunds transaction cost if the transaction is an `utility.batchAll()` +//! with calls that are: delivering new messsage and all necessary underlying headers +//! (parachain or relay chain). + +use crate::messages_call_ext::{ + CallHelper as MessagesCallHelper, CallInfo as MessagesCallInfo, MessagesCallSubType, +}; +use bp_messages::{LaneId, MessageNonce}; +use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; +use bp_runtime::{RangeInclusiveExt, StaticStrProvider}; +use codec::{Decode, Encode}; +use frame_support::{ + dispatch::{CallableCallFor, DispatchInfo, Dispatchable, PostDispatchInfo}, + traits::IsSubType, + weights::Weight, + CloneNoBound, DefaultNoBound, EqNoBound, PartialEqNoBound, RuntimeDebug, RuntimeDebugNoBound, +}; +use pallet_bridge_grandpa::{ + CallSubType as GrandpaCallSubType, SubmitFinalityProofHelper, SubmitFinalityProofInfo, +}; +use pallet_bridge_messages::Config as MessagesConfig; +use pallet_bridge_parachains::{ + BoundedBridgeGrandpaConfig, CallSubType as ParachainsCallSubType, Config as ParachainsConfig, + RelayBlockNumber, SubmitParachainHeadsHelper, SubmitParachainHeadsInfo, +}; +use pallet_bridge_relayers::{ + Config as RelayersConfig, Pallet as RelayersPallet, WeightInfoExt as _, +}; +use pallet_transaction_payment::{Config as TransactionPaymentConfig, OnChargeTransaction}; +use pallet_utility::{Call as UtilityCall, Config as UtilityConfig, Pallet as UtilityPallet}; +use scale_info::TypeInfo; +use sp_runtime::{ + traits::{DispatchInfoOf, Get, PostDispatchInfoOf, SignedExtension, Zero}, + transaction_validity::{ + TransactionPriority, TransactionValidity, TransactionValidityError, ValidTransactionBuilder, + }, + DispatchResult, FixedPointOperand, +}; +use sp_std::{marker::PhantomData, vec, vec::Vec}; + +type AccountIdOf = ::AccountId; +// without this typedef rustfmt fails with internal err +type BalanceOf = + <::OnChargeTransaction as OnChargeTransaction>::Balance; +type CallOf = ::RuntimeCall; + +/// Trait identifying a bridged parachain. A relayer might be refunded for delivering messages +/// coming from this parachain. +pub trait RefundableParachainId { + /// The instance of the bridge parachains pallet. + type Instance; + /// The parachain Id. + type Id: Get; +} + +/// Default implementation of `RefundableParachainId`. +pub struct RefundableParachain(PhantomData<(Instance, Id)>); + +impl RefundableParachainId for RefundableParachain +where + Id: Get, +{ + type Instance = Instance; + type Id = Id; +} + +/// Trait identifying a bridged messages lane. A relayer might be refunded for delivering messages +/// coming from this lane. +pub trait RefundableMessagesLaneId { + /// The instance of the bridge messages pallet. + type Instance; + /// The messages lane id. + type Id: Get; +} + +/// Default implementation of `RefundableMessagesLaneId`. +pub struct RefundableMessagesLane(PhantomData<(Instance, Id)>); + +impl RefundableMessagesLaneId for RefundableMessagesLane +where + Id: Get, +{ + type Instance = Instance; + type Id = Id; +} + +/// Refund calculator. +pub trait RefundCalculator { + // The underlying integer type in which the refund is calculated. + type Balance; + + /// Compute refund for given transaction. + fn compute_refund( + info: &DispatchInfo, + post_info: &PostDispatchInfo, + len: usize, + tip: Self::Balance, + ) -> Self::Balance; +} + +/// `RefundCalculator` implementation which refunds the actual transaction fee. +pub struct ActualFeeRefund(PhantomData); + +impl RefundCalculator for ActualFeeRefund +where + R: TransactionPaymentConfig, + CallOf: Dispatchable, + BalanceOf: FixedPointOperand, +{ + type Balance = BalanceOf; + + fn compute_refund( + info: &DispatchInfo, + post_info: &PostDispatchInfo, + len: usize, + tip: BalanceOf, + ) -> BalanceOf { + pallet_transaction_payment::Pallet::::compute_actual_fee(len as _, info, post_info, tip) + } +} + +/// Data that is crafted in `pre_dispatch` method and used at `post_dispatch`. +#[cfg_attr(test, derive(Debug, PartialEq))] +pub struct PreDispatchData { + /// Transaction submitter (relayer) account. + relayer: AccountId, + /// Type of the call. + call_info: CallInfo, +} + +/// Type of the call that the extension recognizes. +#[derive(RuntimeDebugNoBound, PartialEq)] +pub enum CallInfo { + /// Relay chain finality + parachain finality + message delivery/confirmation calls. + AllFinalityAndMsgs( + SubmitFinalityProofInfo, + SubmitParachainHeadsInfo, + MessagesCallInfo, + ), + /// Parachain finality + message delivery/confirmation calls. + ParachainFinalityAndMsgs(SubmitParachainHeadsInfo, MessagesCallInfo), + /// Standalone message delivery/confirmation call. + Msgs(MessagesCallInfo), +} + +impl CallInfo { + /// Returns true if call is a message delivery call (with optional finality calls). + fn is_receive_messages_proof_call(&self) -> bool { + match self.messages_call_info() { + MessagesCallInfo::ReceiveMessagesProof(_) => true, + MessagesCallInfo::ReceiveMessagesDeliveryProof(_) => false, + } + } + + /// Returns the pre-dispatch `finality_target` sent to the `SubmitFinalityProof` call. + fn submit_finality_proof_info(&self) -> Option> { + match *self { + Self::AllFinalityAndMsgs(info, _, _) => Some(info), + _ => None, + } + } + + /// Returns the pre-dispatch `SubmitParachainHeadsInfo`. + fn submit_parachain_heads_info(&self) -> Option<&SubmitParachainHeadsInfo> { + match self { + Self::AllFinalityAndMsgs(_, info, _) => Some(info), + Self::ParachainFinalityAndMsgs(info, _) => Some(info), + _ => None, + } + } + + /// Returns the pre-dispatch `ReceiveMessagesProofInfo`. + fn messages_call_info(&self) -> &MessagesCallInfo { + match self { + Self::AllFinalityAndMsgs(_, _, info) => info, + Self::ParachainFinalityAndMsgs(_, info) => info, + Self::Msgs(info) => info, + } + } +} + +/// The actions on relayer account that need to be performed because of his actions. +#[derive(RuntimeDebug, PartialEq)] +enum RelayerAccountAction { + /// Do nothing with relayer account. + None, + /// Reward the relayer. + Reward(AccountId, RewardsAccountParams, Reward), + /// Slash the relayer. + Slash(AccountId, RewardsAccountParams), +} + +/// Signed extension that refunds a relayer for new messages coming from a parachain. +/// +/// Also refunds relayer for successful finality delivery if it comes in batch (`utility.batchAll`) +/// with message delivery transaction. Batch may deliver either both relay chain header and +/// parachain head, or just parachain head. Corresponding headers must be used in messages +/// proof verification. +/// +/// Extension does not refund transaction tip due to security reasons. +#[derive( + DefaultNoBound, + CloneNoBound, + Decode, + Encode, + EqNoBound, + PartialEqNoBound, + RuntimeDebugNoBound, + TypeInfo, +)] +#[scale_info(skip_type_params(Runtime, Para, Msgs, Refund, Priority, Id))] +pub struct RefundBridgedParachainMessages( + PhantomData<( + // runtime with `frame-utility`, `pallet-bridge-grandpa`, `pallet-bridge-parachains`, + // `pallet-bridge-messages` and `pallet-bridge-relayers` pallets deployed + Runtime, + // implementation of `RefundableParachainId` trait, which specifies the instance of + // the used `pallet-bridge-parachains` pallet and the bridged parachain id + Para, + // implementation of `RefundableMessagesLaneId` trait, which specifies the instance of + // the used `pallet-bridge-messages` pallet and the lane within this pallet + Msgs, + // implementation of the `RefundCalculator` trait, that is used to compute refund that + // we give to relayer for his transaction + Refund, + // getter for per-message `TransactionPriority` boost that we give to message + // delivery transactions + Priority, + // the runtime-unique identifier of this signed extension + Id, + )>, +); + +impl + RefundBridgedParachainMessages +where + Self: 'static + Send + Sync, + Runtime: UtilityConfig> + + BoundedBridgeGrandpaConfig + + ParachainsConfig + + MessagesConfig + + RelayersConfig, + Para: RefundableParachainId, + Msgs: RefundableMessagesLaneId, + Refund: RefundCalculator, + Priority: Get, + Id: StaticStrProvider, + CallOf: Dispatchable + + IsSubType, Runtime>> + + GrandpaCallSubType + + ParachainsCallSubType + + MessagesCallSubType, +{ + fn expand_call<'a>(&self, call: &'a CallOf) -> Vec<&'a CallOf> { + match call.is_sub_type() { + Some(UtilityCall::::batch_all { ref calls }) if calls.len() <= 3 => + calls.iter().collect(), + Some(_) => vec![], + None => vec![call], + } + } + + fn parse_and_check_for_obsolete_call( + &self, + call: &CallOf, + ) -> Result, TransactionValidityError> { + let calls = self.expand_call(call); + let total_calls = calls.len(); + let mut calls = calls.into_iter().map(Self::check_obsolete_call).rev(); + + let msgs_call = calls.next().transpose()?.and_then(|c| c.call_info_for(Msgs::Id::get())); + let para_finality_call = calls + .next() + .transpose()? + .and_then(|c| c.submit_parachain_heads_info_for(Para::Id::get())); + let relay_finality_call = + calls.next().transpose()?.and_then(|c| c.submit_finality_proof_info()); + + Ok(match (total_calls, relay_finality_call, para_finality_call, msgs_call) { + (3, Some(relay_finality_call), Some(para_finality_call), Some(msgs_call)) => Some( + CallInfo::AllFinalityAndMsgs(relay_finality_call, para_finality_call, msgs_call), + ), + (2, None, Some(para_finality_call), Some(msgs_call)) => + Some(CallInfo::ParachainFinalityAndMsgs(para_finality_call, msgs_call)), + (1, None, None, Some(msgs_call)) => Some(CallInfo::Msgs(msgs_call)), + _ => None, + }) + } + + fn check_obsolete_call( + call: &CallOf, + ) -> Result<&CallOf, TransactionValidityError> { + call.check_obsolete_submit_finality_proof()?; + call.check_obsolete_submit_parachain_heads()?; + call.check_obsolete_call()?; + Ok(call) + } + + /// Given post-dispatch information, analyze the outcome of relayer call and return + /// actions that need to be performed on relayer account. + fn analyze_call_result( + pre: Option>>, + info: &DispatchInfo, + post_info: &PostDispatchInfo, + len: usize, + result: &DispatchResult, + ) -> RelayerAccountAction, Runtime::Reward> { + let mut extra_weight = Weight::zero(); + let mut extra_size = 0; + + // We don't refund anything for transactions that we don't support. + let (relayer, call_info) = match pre { + Some(Some(pre)) => (pre.relayer, pre.call_info), + _ => return RelayerAccountAction::None, + }; + + // now we know that the relayer either needs to be rewarded, or slashed + // => let's prepare the correspondent account that pays reward/receives slashed amount + let reward_account_params = RewardsAccountParams::new( + Msgs::Id::get(), + Runtime::BridgedChainId::get(), + if call_info.is_receive_messages_proof_call() { + RewardsAccountOwner::ThisChain + } else { + RewardsAccountOwner::BridgedChain + }, + ); + + // prepare return value for the case if the call has failed or it has not caused + // expected side effects (e.g. not all messages have been accepted) + // + // we are not checking if relayer is registered here - it happens during the slash attempt + // + // there are couple of edge cases here: + // + // - when the relayer becomes registered during message dispatch: this is unlikely + relayer + // should be ready for slashing after registration; + // + // - when relayer is registered after `validate` is called and priority is not boosted: + // relayer should be ready for slashing after registration. + let may_slash_relayer = + Self::bundled_messages_for_priority_boost(Some(&call_info)).is_some(); + let slash_relayer_if_delivery_result = may_slash_relayer + .then(|| RelayerAccountAction::Slash(relayer.clone(), reward_account_params)) + .unwrap_or(RelayerAccountAction::None); + + // We don't refund anything if the transaction has failed. + if let Err(e) = result { + log::trace!( + target: "runtime::bridge", + "{} from parachain {} via {:?}: relayer {:?} has submitted invalid messages transaction: {:?}", + Self::IDENTIFIER, + Para::Id::get(), + Msgs::Id::get(), + relayer, + e, + ); + return slash_relayer_if_delivery_result + } + + // check if relay chain state has been updated + if let Some(finality_proof_info) = call_info.submit_finality_proof_info() { + if !SubmitFinalityProofHelper::::was_successful( + finality_proof_info.block_number, + ) { + // we only refund relayer if all calls have updated chain state + log::trace!( + target: "runtime::bridge", + "{} from parachain {} via {:?}: relayer {:?} has submitted invalid relay chain finality proof", + Self::IDENTIFIER, + Para::Id::get(), + Msgs::Id::get(), + relayer, + ); + return slash_relayer_if_delivery_result; + } + + // there's a conflict between how bridge GRANDPA pallet works and a `utility.batchAll` + // transaction. If relay chain header is mandatory, the GRANDPA pallet returns + // `Pays::No`, because such transaction is mandatory for operating the bridge. But + // `utility.batchAll` transaction always requires payment. But in both cases we'll + // refund relayer - either explicitly here, or using `Pays::No` if he's choosing + // to submit dedicated transaction. + + // submitter has means to include extra weight/bytes in the `submit_finality_proof` + // call, so let's subtract extra weight/size to avoid refunding for this extra stuff + extra_weight = finality_proof_info.extra_weight; + extra_size = finality_proof_info.extra_size; + } + + // check if parachain state has been updated + if let Some(para_proof_info) = call_info.submit_parachain_heads_info() { + if !SubmitParachainHeadsHelper::::was_successful( + para_proof_info, + ) { + // we only refund relayer if all calls have updated chain state + log::trace!( + target: "runtime::bridge", + "{} from parachain {} via {:?}: relayer {:?} has submitted invalid parachain finality proof", + Self::IDENTIFIER, + Para::Id::get(), + Msgs::Id::get(), + relayer, + ); + return slash_relayer_if_delivery_result + } + } + + // Check if the `ReceiveMessagesProof` call delivered at least some of the messages that + // it contained. If this happens, we consider the transaction "helpful" and refund it. + let msgs_call_info = call_info.messages_call_info(); + if !MessagesCallHelper::::was_successful(msgs_call_info) { + log::trace!( + target: "runtime::bridge", + "{} from parachain {} via {:?}: relayer {:?} has submitted invalid messages call", + Self::IDENTIFIER, + Para::Id::get(), + Msgs::Id::get(), + relayer, + ); + return slash_relayer_if_delivery_result + } + + // regarding the tip - refund that happens here (at this side of the bridge) isn't the whole + // relayer compensation. He'll receive some amount at the other side of the bridge. It shall + // (in theory) cover the tip there. Otherwise, if we'll be compensating tip here, some + // malicious relayer may use huge tips, effectively depleting account that pay rewards. The + // cost of this attack is nothing. Hence we use zero as tip here. + let tip = Zero::zero(); + + // decrease post-dispatch weight/size using extra weight/size that we know now + let post_info_len = len.saturating_sub(extra_size as usize); + let mut post_info_weight = + post_info.actual_weight.unwrap_or(info.weight).saturating_sub(extra_weight); + + // let's also replace the weight of slashing relayer with the weight of rewarding relayer + if call_info.is_receive_messages_proof_call() { + post_info_weight = post_info_weight.saturating_sub( + ::WeightInfo::extra_weight_of_successful_receive_messages_proof_call(), + ); + } + + // compute the relayer refund + let mut post_info = *post_info; + post_info.actual_weight = Some(post_info_weight); + let refund = Refund::compute_refund(info, &post_info, post_info_len, tip); + + // we can finally reward relayer + RelayerAccountAction::Reward(relayer, reward_account_params, refund) + } + + /// Returns number of bundled messages `Some(_)`, if the given call info is a: + /// + /// - message delivery transaction; + /// + /// - with reasonable bundled messages that may be accepted by the messages pallet. + /// + /// This function is used to check whether the transaction priority should be + /// virtually boosted. The relayer registration (we only boost priority for registered + /// relayer transactions) must be checked outside. + fn bundled_messages_for_priority_boost(call_info: Option<&CallInfo>) -> Option { + // we only boost priority of message delivery transactions + let parsed_call = match call_info { + Some(parsed_call) if parsed_call.is_receive_messages_proof_call() => parsed_call, + _ => return None, + }; + + // compute total number of messages in transaction + let bundled_messages = + parsed_call.messages_call_info().bundled_messages().checked_len().unwrap_or(0); + + // a quick check to avoid invalid high-priority transactions + if bundled_messages > Runtime::MaxUnconfirmedMessagesAtInboundLane::get() { + return None + } + + Some(bundled_messages) + } +} + +impl SignedExtension + for RefundBridgedParachainMessages +where + Self: 'static + Send + Sync, + Runtime: UtilityConfig> + + BoundedBridgeGrandpaConfig + + ParachainsConfig + + MessagesConfig + + RelayersConfig, + Para: RefundableParachainId, + Msgs: RefundableMessagesLaneId, + Refund: RefundCalculator, + Priority: Get, + Id: StaticStrProvider, + CallOf: Dispatchable + + IsSubType, Runtime>> + + GrandpaCallSubType + + ParachainsCallSubType + + MessagesCallSubType, +{ + const IDENTIFIER: &'static str = Id::STR; + type AccountId = Runtime::AccountId; + type Call = CallOf; + type AdditionalSigned = (); + type Pre = Option>; + + fn additional_signed(&self) -> Result<(), TransactionValidityError> { + Ok(()) + } + + fn validate( + &self, + who: &Self::AccountId, + call: &Self::Call, + _info: &DispatchInfoOf, + _len: usize, + ) -> TransactionValidity { + // this is the only relevant line of code for the `pre_dispatch` + // + // we're not calling `validate` from `pre_dispatch` directly because of performance + // reasons, so if you're adding some code that may fail here, please check if it needs + // to be added to the `pre_dispatch` as well + let parsed_call = self.parse_and_check_for_obsolete_call(call)?; + + // the following code just plays with transaction priority and never returns an error + + // we only boost priority of presumably correct message delivery transactions + let bundled_messages = match Self::bundled_messages_for_priority_boost(parsed_call.as_ref()) + { + Some(bundled_messages) => bundled_messages, + None => return Ok(Default::default()), + }; + + // we only boost priority if relayer has staked required balance + if !RelayersPallet::::is_registration_active(who) { + return Ok(Default::default()) + } + + // compute priority boost + let priority_boost = + crate::priority_calculator::compute_priority_boost::(bundled_messages); + let valid_transaction = ValidTransactionBuilder::default().priority(priority_boost); + + log::trace!( + target: "runtime::bridge", + "{} from parachain {} via {:?} has boosted priority of message delivery transaction \ + of relayer {:?}: {} messages -> {} priority", + Self::IDENTIFIER, + Para::Id::get(), + Msgs::Id::get(), + who, + bundled_messages, + priority_boost, + ); + + valid_transaction.build() + } + + fn pre_dispatch( + self, + who: &Self::AccountId, + call: &Self::Call, + _info: &DispatchInfoOf, + _len: usize, + ) -> Result { + // this is a relevant piece of `validate` that we need here (in `pre_dispatch`) + let parsed_call = self.parse_and_check_for_obsolete_call(call)?; + + Ok(parsed_call.map(|call_info| { + log::trace!( + target: "runtime::bridge", + "{} from parachain {} via {:?} parsed bridge transaction in pre-dispatch: {:?}", + Self::IDENTIFIER, + Para::Id::get(), + Msgs::Id::get(), + call_info, + ); + PreDispatchData { relayer: who.clone(), call_info } + })) + } + + fn post_dispatch( + pre: Option, + info: &DispatchInfoOf, + post_info: &PostDispatchInfoOf, + len: usize, + result: &DispatchResult, + ) -> Result<(), TransactionValidityError> { + let call_result = Self::analyze_call_result(pre, info, post_info, len, result); + + match call_result { + RelayerAccountAction::None => (), + RelayerAccountAction::Reward(relayer, reward_account, reward) => { + RelayersPallet::::register_relayer_reward( + reward_account, + &relayer, + reward, + ); + + log::trace!( + target: "runtime::bridge", + "{} from parachain {} via {:?} has registered reward: {:?} for {:?}", + Self::IDENTIFIER, + Para::Id::get(), + Msgs::Id::get(), + reward, + relayer, + ); + }, + RelayerAccountAction::Slash(relayer, slash_account) => + RelayersPallet::::slash_and_deregister(&relayer, slash_account), + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, + }, + messages_call_ext::{ + BaseMessagesProofInfo, ReceiveMessagesDeliveryProofInfo, ReceiveMessagesProofInfo, + UnrewardedRelayerOccupation, + }, + mock::*, + }; + use bp_messages::{InboundLaneData, MessageNonce, OutboundLaneData, UnrewardedRelayersState}; + use bp_parachains::{BestParaHeadHash, ParaInfo}; + use bp_polkadot_core::parachains::{ParaHeadsProof, ParaId}; + use bp_runtime::HeaderId; + use bp_test_utils::{make_default_justification, test_keyring}; + use frame_support::{ + assert_storage_noop, parameter_types, + traits::{fungible::Mutate, ReservableCurrency}, + weights::Weight, + }; + use pallet_bridge_grandpa::{Call as GrandpaCall, StoredAuthoritySet}; + use pallet_bridge_messages::Call as MessagesCall; + use pallet_bridge_parachains::{Call as ParachainsCall, RelayBlockHash}; + use sp_runtime::{ + traits::{ConstU64, Header as HeaderT}, + transaction_validity::{InvalidTransaction, ValidTransaction}, + DispatchError, + }; + + parameter_types! { + TestParachain: u32 = 1000; + pub TestLaneId: LaneId = TEST_LANE_ID; + pub MsgProofsRewardsAccount: RewardsAccountParams = RewardsAccountParams::new( + TEST_LANE_ID, + TEST_BRIDGED_CHAIN_ID, + RewardsAccountOwner::ThisChain, + ); + pub MsgDeliveryProofsRewardsAccount: RewardsAccountParams = RewardsAccountParams::new( + TEST_LANE_ID, + TEST_BRIDGED_CHAIN_ID, + RewardsAccountOwner::BridgedChain, + ); + } + + bp_runtime::generate_static_str_provider!(TestExtension); + type TestExtension = RefundBridgedParachainMessages< + TestRuntime, + RefundableParachain<(), TestParachain>, + RefundableMessagesLane<(), TestLaneId>, + ActualFeeRefund, + ConstU64<1>, + StrTestExtension, + >; + + fn initial_balance_of_relayer_account_at_this_chain() -> ThisChainBalance { + let test_stake: ThisChainBalance = TestStake::get(); + ExistentialDeposit::get().saturating_add(test_stake * 100) + } + + // in tests, the following accounts are equal (because of how `into_sub_account_truncating` + // works) + + fn delivery_rewards_account() -> ThisChainAccountId { + TestPaymentProcedure::rewards_account(MsgProofsRewardsAccount::get()) + } + + fn confirmation_rewards_account() -> ThisChainAccountId { + TestPaymentProcedure::rewards_account(MsgDeliveryProofsRewardsAccount::get()) + } + + fn relayer_account_at_this_chain() -> ThisChainAccountId { + 0 + } + + fn relayer_account_at_bridged_chain() -> BridgedChainAccountId { + 0 + } + + fn initialize_environment( + best_relay_header_number: RelayBlockNumber, + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) { + let authorities = test_keyring().into_iter().map(|(a, w)| (a.into(), w)).collect(); + let best_relay_header = HeaderId(best_relay_header_number, RelayBlockHash::default()); + pallet_bridge_grandpa::CurrentAuthoritySet::::put( + StoredAuthoritySet::try_new(authorities, 0).unwrap(), + ); + pallet_bridge_grandpa::BestFinalized::::put(best_relay_header); + + let para_id = ParaId(TestParachain::get()); + let para_info = ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: parachain_head_at_relay_header_number, + head_hash: [parachain_head_at_relay_header_number as u8; 32].into(), + }, + next_imported_hash_position: 0, + }; + pallet_bridge_parachains::ParasInfo::::insert(para_id, para_info); + + let lane_id = TestLaneId::get(); + let in_lane_data = + InboundLaneData { last_confirmed_nonce: best_message, ..Default::default() }; + pallet_bridge_messages::InboundLanes::::insert(lane_id, in_lane_data); + + let out_lane_data = + OutboundLaneData { latest_received_nonce: best_message, ..Default::default() }; + pallet_bridge_messages::OutboundLanes::::insert(lane_id, out_lane_data); + + Balances::mint_into(&delivery_rewards_account(), ExistentialDeposit::get()).unwrap(); + Balances::mint_into(&confirmation_rewards_account(), ExistentialDeposit::get()).unwrap(); + Balances::mint_into( + &relayer_account_at_this_chain(), + initial_balance_of_relayer_account_at_this_chain(), + ) + .unwrap(); + } + + fn submit_relay_header_call(relay_header_number: RelayBlockNumber) -> RuntimeCall { + let relay_header = BridgedChainHeader::new( + relay_header_number, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ); + let relay_justification = make_default_justification(&relay_header); + + RuntimeCall::BridgeGrandpa(GrandpaCall::submit_finality_proof { + finality_target: Box::new(relay_header), + justification: relay_justification, + }) + } + + fn submit_parachain_head_call( + parachain_head_at_relay_header_number: RelayBlockNumber, + ) -> RuntimeCall { + RuntimeCall::BridgeParachains(ParachainsCall::submit_parachain_heads { + at_relay_block: (parachain_head_at_relay_header_number, RelayBlockHash::default()), + parachains: vec![( + ParaId(TestParachain::get()), + [parachain_head_at_relay_header_number as u8; 32].into(), + )], + parachain_heads_proof: ParaHeadsProof(vec![]), + }) + } + + fn message_delivery_call(best_message: MessageNonce) -> RuntimeCall { + RuntimeCall::BridgeMessages(MessagesCall::receive_messages_proof { + relayer_id_at_bridged_chain: relayer_account_at_bridged_chain(), + proof: FromBridgedChainMessagesProof { + bridged_header_hash: Default::default(), + storage_proof: vec![], + lane: TestLaneId::get(), + nonces_start: pallet_bridge_messages::InboundLanes::::get( + TEST_LANE_ID, + ) + .last_delivered_nonce() + + 1, + nonces_end: best_message, + }, + messages_count: 1, + dispatch_weight: Weight::zero(), + }) + } + + fn message_confirmation_call(best_message: MessageNonce) -> RuntimeCall { + RuntimeCall::BridgeMessages(MessagesCall::receive_messages_delivery_proof { + proof: FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: Default::default(), + storage_proof: vec![], + lane: TestLaneId::get(), + }, + relayers_state: UnrewardedRelayersState { + last_delivered_nonce: best_message, + ..Default::default() + }, + }) + } + + fn parachain_finality_and_delivery_batch_call( + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_parachain_head_call(parachain_head_at_relay_header_number), + message_delivery_call(best_message), + ], + }) + } + + fn parachain_finality_and_confirmation_batch_call( + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_parachain_head_call(parachain_head_at_relay_header_number), + message_confirmation_call(best_message), + ], + }) + } + + fn all_finality_and_delivery_batch_call( + relay_header_number: RelayBlockNumber, + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_relay_header_call(relay_header_number), + submit_parachain_head_call(parachain_head_at_relay_header_number), + message_delivery_call(best_message), + ], + }) + } + + fn all_finality_and_confirmation_batch_call( + relay_header_number: RelayBlockNumber, + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_relay_header_call(relay_header_number), + submit_parachain_head_call(parachain_head_at_relay_header_number), + message_confirmation_call(best_message), + ], + }) + } + + fn all_finality_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::AllFinalityAndMsgs( + SubmitFinalityProofInfo { + block_number: 200, + extra_weight: Weight::zero(), + extra_size: 0, + }, + SubmitParachainHeadsInfo { + at_relay_block_number: 200, + para_id: ParaId(TestParachain::get()), + para_head_hash: [200u8; 32].into(), + }, + MessagesCallInfo::ReceiveMessagesProof(ReceiveMessagesProofInfo { + base: BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + unrewarded_relayers: UnrewardedRelayerOccupation { + free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), + free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), + }, + }), + ), + } + } + + fn all_finality_confirmation_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::AllFinalityAndMsgs( + SubmitFinalityProofInfo { + block_number: 200, + extra_weight: Weight::zero(), + extra_size: 0, + }, + SubmitParachainHeadsInfo { + at_relay_block_number: 200, + para_id: ParaId(TestParachain::get()), + para_head_hash: [200u8; 32].into(), + }, + MessagesCallInfo::ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo( + BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + )), + ), + } + } + + fn parachain_finality_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::ParachainFinalityAndMsgs( + SubmitParachainHeadsInfo { + at_relay_block_number: 200, + para_id: ParaId(TestParachain::get()), + para_head_hash: [200u8; 32].into(), + }, + MessagesCallInfo::ReceiveMessagesProof(ReceiveMessagesProofInfo { + base: BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + unrewarded_relayers: UnrewardedRelayerOccupation { + free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), + free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), + }, + }), + ), + } + } + + fn parachain_finality_confirmation_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::ParachainFinalityAndMsgs( + SubmitParachainHeadsInfo { + at_relay_block_number: 200, + para_id: ParaId(TestParachain::get()), + para_head_hash: [200u8; 32].into(), + }, + MessagesCallInfo::ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo( + BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + )), + ), + } + } + + fn delivery_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::Msgs(MessagesCallInfo::ReceiveMessagesProof( + ReceiveMessagesProofInfo { + base: BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + unrewarded_relayers: UnrewardedRelayerOccupation { + free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), + free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), + }, + }, + )), + } + } + + fn confirmation_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::Msgs(MessagesCallInfo::ReceiveMessagesDeliveryProof( + ReceiveMessagesDeliveryProofInfo(BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }), + )), + } + } + + fn set_bundled_range_end( + mut pre_dispatch_data: PreDispatchData, + end: MessageNonce, + ) -> PreDispatchData { + let msg_info = match pre_dispatch_data.call_info { + CallInfo::AllFinalityAndMsgs(_, _, ref mut info) => info, + CallInfo::ParachainFinalityAndMsgs(_, ref mut info) => info, + CallInfo::Msgs(ref mut info) => info, + }; + + if let MessagesCallInfo::ReceiveMessagesProof(ref mut msg_info) = msg_info { + msg_info.base.bundled_range = *msg_info.base.bundled_range.start()..=end + } + + pre_dispatch_data + } + + fn run_validate(call: RuntimeCall) -> TransactionValidity { + let extension: TestExtension = RefundBridgedParachainMessages(PhantomData); + extension.validate(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) + } + + fn run_validate_ignore_priority(call: RuntimeCall) -> TransactionValidity { + run_validate(call).map(|mut tx| { + tx.priority = 0; + tx + }) + } + + fn run_pre_dispatch( + call: RuntimeCall, + ) -> Result>, TransactionValidityError> { + let extension: TestExtension = RefundBridgedParachainMessages(PhantomData); + extension.pre_dispatch(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) + } + + fn dispatch_info() -> DispatchInfo { + DispatchInfo { + weight: Weight::from_parts( + frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND, + 0, + ), + class: frame_support::dispatch::DispatchClass::Normal, + pays_fee: frame_support::dispatch::Pays::Yes, + } + } + + fn post_dispatch_info() -> PostDispatchInfo { + PostDispatchInfo { actual_weight: None, pays_fee: frame_support::dispatch::Pays::Yes } + } + + fn run_post_dispatch( + pre_dispatch_data: Option>, + dispatch_result: DispatchResult, + ) { + let post_dispatch_result = TestExtension::post_dispatch( + Some(pre_dispatch_data), + &dispatch_info(), + &post_dispatch_info(), + 1024, + &dispatch_result, + ); + assert_eq!(post_dispatch_result, Ok(())); + } + + fn expected_delivery_reward() -> ThisChainBalance { + let mut post_dispatch_info = post_dispatch_info(); + let extra_weight = ::WeightInfo::extra_weight_of_successful_receive_messages_proof_call(); + post_dispatch_info.actual_weight = + Some(dispatch_info().weight.saturating_sub(extra_weight)); + pallet_transaction_payment::Pallet::::compute_actual_fee( + 1024, + &dispatch_info(), + &post_dispatch_info, + Zero::zero(), + ) + } + + fn expected_confirmation_reward() -> ThisChainBalance { + pallet_transaction_payment::Pallet::::compute_actual_fee( + 1024, + &dispatch_info(), + &post_dispatch_info(), + Zero::zero(), + ) + } + + #[test] + fn validate_doesnt_boost_transaction_priority_if_relayer_is_not_registered() { + run_test(|| { + initialize_environment(100, 100, 100); + Balances::set_balance(&relayer_account_at_this_chain(), ExistentialDeposit::get()); + + // message delivery is failing + assert_eq!(run_validate(message_delivery_call(200)), Ok(Default::default()),); + assert_eq!( + run_validate(parachain_finality_and_delivery_batch_call(200, 200)), + Ok(Default::default()), + ); + assert_eq!( + run_validate(all_finality_and_delivery_batch_call(200, 200, 200)), + Ok(Default::default()), + ); + // message confirmation validation is passing + assert_eq!( + run_validate_ignore_priority(message_confirmation_call(200)), + Ok(Default::default()), + ); + assert_eq!( + run_validate_ignore_priority(parachain_finality_and_confirmation_batch_call( + 200, 200 + )), + Ok(Default::default()), + ); + assert_eq!( + run_validate_ignore_priority(all_finality_and_confirmation_batch_call( + 200, 200, 200 + )), + Ok(Default::default()), + ); + }); + } + + #[test] + fn validate_boosts_priority_of_message_delivery_transactons() { + run_test(|| { + initialize_environment(100, 100, 100); + + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + + let priority_of_100_messages_delivery = + run_validate(message_delivery_call(200)).unwrap().priority; + let priority_of_200_messages_delivery = + run_validate(message_delivery_call(300)).unwrap().priority; + assert!( + priority_of_200_messages_delivery > priority_of_100_messages_delivery, + "Invalid priorities: {} for 200 messages vs {} for 100 messages", + priority_of_200_messages_delivery, + priority_of_100_messages_delivery, + ); + + let priority_of_100_messages_confirmation = + run_validate(message_confirmation_call(200)).unwrap().priority; + let priority_of_200_messages_confirmation = + run_validate(message_confirmation_call(300)).unwrap().priority; + assert_eq!( + priority_of_100_messages_confirmation, + priority_of_200_messages_confirmation + ); + }); + } + + #[test] + fn validate_does_not_boost_priority_of_message_delivery_transactons_with_too_many_messages() { + run_test(|| { + initialize_environment(100, 100, 100); + + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + + let priority_of_max_messages_delivery = run_validate(message_delivery_call( + 100 + MaxUnconfirmedMessagesAtInboundLane::get(), + )) + .unwrap() + .priority; + let priority_of_more_than_max_messages_delivery = run_validate(message_delivery_call( + 100 + MaxUnconfirmedMessagesAtInboundLane::get() + 1, + )) + .unwrap() + .priority; + + assert!( + priority_of_max_messages_delivery > priority_of_more_than_max_messages_delivery, + "Invalid priorities: {} for MAX messages vs {} for MAX+1 messages", + priority_of_max_messages_delivery, + priority_of_more_than_max_messages_delivery, + ); + }); + } + + #[test] + fn validate_allows_non_obsolete_transactions() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_validate_ignore_priority(message_delivery_call(200)), + Ok(ValidTransaction::default()), + ); + assert_eq!( + run_validate_ignore_priority(message_confirmation_call(200)), + Ok(ValidTransaction::default()), + ); + + assert_eq!( + run_validate_ignore_priority(parachain_finality_and_delivery_batch_call(200, 200)), + Ok(ValidTransaction::default()), + ); + assert_eq!( + run_validate_ignore_priority(parachain_finality_and_confirmation_batch_call( + 200, 200 + )), + Ok(ValidTransaction::default()), + ); + + assert_eq!( + run_validate_ignore_priority(all_finality_and_delivery_batch_call(200, 200, 200)), + Ok(ValidTransaction::default()), + ); + assert_eq!( + run_validate_ignore_priority(all_finality_and_confirmation_batch_call( + 200, 200, 200 + )), + Ok(ValidTransaction::default()), + ); + }); + } + + #[test] + fn ext_rejects_batch_with_obsolete_relay_chain_header() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call(100, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_validate(all_finality_and_delivery_batch_call(100, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + }); + } + + #[test] + fn ext_rejects_batch_with_obsolete_parachain_head() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call(101, 100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_validate(all_finality_and_delivery_batch_call(101, 100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_pre_dispatch(parachain_finality_and_delivery_batch_call(100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_validate(parachain_finality_and_delivery_batch_call(100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + }); + } + + #[test] + fn ext_rejects_batch_with_obsolete_messages() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_validate(all_finality_and_delivery_batch_call(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_validate(all_finality_and_confirmation_batch_call(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_pre_dispatch(parachain_finality_and_delivery_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_pre_dispatch(parachain_finality_and_confirmation_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_validate(parachain_finality_and_delivery_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_validate(parachain_finality_and_confirmation_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + }); + } + + #[test] + fn pre_dispatch_parses_batch_with_relay_chain_and_parachain_headers() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 200)), + Ok(Some(all_finality_pre_dispatch_data())), + ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 200)), + Ok(Some(all_finality_confirmation_pre_dispatch_data())), + ); + }); + } + + #[test] + fn pre_dispatch_parses_batch_with_parachain_header() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(parachain_finality_and_delivery_batch_call(200, 200)), + Ok(Some(parachain_finality_pre_dispatch_data())), + ); + assert_eq!( + run_pre_dispatch(parachain_finality_and_confirmation_batch_call(200, 200)), + Ok(Some(parachain_finality_confirmation_pre_dispatch_data())), + ); + }); + } + + #[test] + fn pre_dispatch_fails_to_parse_batch_with_multiple_parachain_headers() { + run_test(|| { + initialize_environment(100, 100, 100); + + let call = RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + RuntimeCall::BridgeParachains(ParachainsCall::submit_parachain_heads { + at_relay_block: (100, RelayBlockHash::default()), + parachains: vec![ + (ParaId(TestParachain::get()), [1u8; 32].into()), + (ParaId(TestParachain::get() + 1), [1u8; 32].into()), + ], + parachain_heads_proof: ParaHeadsProof(vec![]), + }), + message_delivery_call(200), + ], + }); + + assert_eq!(run_pre_dispatch(call), Ok(None),); + }); + } + + #[test] + fn pre_dispatch_parses_message_transaction() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(message_delivery_call(200)), + Ok(Some(delivery_pre_dispatch_data())), + ); + assert_eq!( + run_pre_dispatch(message_confirmation_call(200)), + Ok(Some(confirmation_pre_dispatch_data())), + ); + }); + } + + #[test] + fn post_dispatch_ignores_unknown_transaction() { + run_test(|| { + assert_storage_noop!(run_post_dispatch(None, Ok(()))); + }); + } + + #[test] + fn post_dispatch_ignores_failed_transaction() { + run_test(|| { + assert_storage_noop!(run_post_dispatch( + Some(all_finality_pre_dispatch_data()), + Err(DispatchError::BadOrigin) + )); + }); + } + + #[test] + fn post_dispatch_ignores_transaction_that_has_not_updated_relay_chain_state() { + run_test(|| { + initialize_environment(100, 200, 200); + + assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); + }); + } + + #[test] + fn post_dispatch_ignores_transaction_that_has_not_updated_parachain_state() { + run_test(|| { + initialize_environment(200, 100, 200); + + assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); + assert_storage_noop!(run_post_dispatch( + Some(parachain_finality_pre_dispatch_data()), + Ok(()) + )); + }); + } + + #[test] + fn post_dispatch_ignores_transaction_that_has_not_delivered_any_messages() { + run_test(|| { + initialize_environment(200, 200, 100); + + assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); + assert_storage_noop!(run_post_dispatch( + Some(parachain_finality_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(()))); + + assert_storage_noop!(run_post_dispatch( + Some(all_finality_confirmation_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch( + Some(parachain_finality_confirmation_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(()))); + }); + } + + #[test] + fn post_dispatch_ignores_transaction_that_has_not_delivered_all_messages() { + run_test(|| { + initialize_environment(200, 200, 150); + + assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); + assert_storage_noop!(run_post_dispatch( + Some(parachain_finality_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(()))); + + assert_storage_noop!(run_post_dispatch( + Some(all_finality_confirmation_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch( + Some(parachain_finality_confirmation_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(()))); + }); + } + + #[test] + fn post_dispatch_refunds_relayer_in_all_finality_batch_with_extra_weight() { + run_test(|| { + initialize_environment(200, 200, 200); + + let mut dispatch_info = dispatch_info(); + dispatch_info.weight = Weight::from_parts( + frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND * 2, + 0, + ); + + // without any size/weight refund: we expect regular reward + let pre_dispatch_data = all_finality_pre_dispatch_data(); + let regular_reward = expected_delivery_reward(); + run_post_dispatch(Some(pre_dispatch_data), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + Some(regular_reward), + ); + + // now repeat the same with size+weight refund: we expect smaller reward + let mut pre_dispatch_data = all_finality_pre_dispatch_data(); + match pre_dispatch_data.call_info { + CallInfo::AllFinalityAndMsgs(ref mut info, ..) => { + info.extra_weight.set_ref_time( + frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND, + ); + info.extra_size = 32; + }, + _ => unreachable!(), + } + run_post_dispatch(Some(pre_dispatch_data), Ok(())); + let reward_after_two_calls = RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get(), + ) + .unwrap(); + assert!( + reward_after_two_calls < 2 * regular_reward, + "{} must be < 2 * {}", + reward_after_two_calls, + 2 * regular_reward, + ); + }); + } + + #[test] + fn post_dispatch_refunds_relayer_in_all_finality_batch() { + run_test(|| { + initialize_environment(200, 200, 200); + + run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + Some(expected_delivery_reward()), + ); + + run_post_dispatch(Some(all_finality_confirmation_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgDeliveryProofsRewardsAccount::get() + ), + Some(expected_confirmation_reward()), + ); + }); + } + + #[test] + fn post_dispatch_refunds_relayer_in_parachain_finality_batch() { + run_test(|| { + initialize_environment(200, 200, 200); + + run_post_dispatch(Some(parachain_finality_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + Some(expected_delivery_reward()), + ); + + run_post_dispatch(Some(parachain_finality_confirmation_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgDeliveryProofsRewardsAccount::get() + ), + Some(expected_confirmation_reward()), + ); + }); + } + + #[test] + fn post_dispatch_refunds_relayer_in_message_transaction() { + run_test(|| { + initialize_environment(200, 200, 200); + + run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + Some(expected_delivery_reward()), + ); + + run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgDeliveryProofsRewardsAccount::get() + ), + Some(expected_confirmation_reward()), + ); + }); + } + + #[test] + fn post_dispatch_slashing_relayer_stake() { + run_test(|| { + initialize_environment(200, 200, 100); + + let delivery_rewards_account_balance = + Balances::free_balance(delivery_rewards_account()); + + let test_stake: ThisChainBalance = TestStake::get(); + Balances::set_balance( + &relayer_account_at_this_chain(), + ExistentialDeposit::get() + test_stake * 10, + ); + + // slashing works for message delivery calls + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), 0); + assert_eq!( + delivery_rewards_account_balance + test_stake, + Balances::free_balance(delivery_rewards_account()) + ); + + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + run_post_dispatch(Some(parachain_finality_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), 0); + assert_eq!( + delivery_rewards_account_balance + test_stake * 2, + Balances::free_balance(delivery_rewards_account()) + ); + + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), 0); + assert_eq!( + delivery_rewards_account_balance + test_stake * 3, + Balances::free_balance(delivery_rewards_account()) + ); + + // reserve doesn't work for message confirmation calls + let confirmation_rewards_account_balance = + Balances::free_balance(confirmation_rewards_account()); + + Balances::reserve(&relayer_account_at_this_chain(), test_stake).unwrap(); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + + assert_eq!( + confirmation_rewards_account_balance, + Balances::free_balance(confirmation_rewards_account()) + ); + run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + + run_post_dispatch(Some(parachain_finality_confirmation_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + + run_post_dispatch(Some(all_finality_confirmation_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + + // check that unreserve has happened, not slashing + assert_eq!( + delivery_rewards_account_balance + test_stake * 3, + Balances::free_balance(delivery_rewards_account()) + ); + assert_eq!( + confirmation_rewards_account_balance, + Balances::free_balance(confirmation_rewards_account()) + ); + }); + } + + fn run_analyze_call_result( + pre_dispatch_data: PreDispatchData, + dispatch_result: DispatchResult, + ) -> RelayerAccountAction { + TestExtension::analyze_call_result( + Some(Some(pre_dispatch_data)), + &dispatch_info(), + &post_dispatch_info(), + 1024, + &dispatch_result, + ) + } + + #[test] + fn analyze_call_result_shall_not_slash_for_transactions_with_too_many_messages() { + run_test(|| { + initialize_environment(100, 100, 100); + + // the `analyze_call_result` should return slash if number of bundled messages is + // within reasonable limits + assert_eq!( + run_analyze_call_result(all_finality_pre_dispatch_data(), Ok(())), + RelayerAccountAction::Slash( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + ); + assert_eq!( + run_analyze_call_result(parachain_finality_pre_dispatch_data(), Ok(())), + RelayerAccountAction::Slash( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + ); + assert_eq!( + run_analyze_call_result(delivery_pre_dispatch_data(), Ok(())), + RelayerAccountAction::Slash( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + ); + + // the `analyze_call_result` should not return slash if number of bundled messages is + // larger than the + assert_eq!( + run_analyze_call_result( + set_bundled_range_end(all_finality_pre_dispatch_data(), 1_000_000), + Ok(()) + ), + RelayerAccountAction::None, + ); + assert_eq!( + run_analyze_call_result( + set_bundled_range_end(parachain_finality_pre_dispatch_data(), 1_000_000), + Ok(()) + ), + RelayerAccountAction::None, + ); + assert_eq!( + run_analyze_call_result( + set_bundled_range_end(delivery_pre_dispatch_data(), 1_000_000), + Ok(()) + ), + RelayerAccountAction::None, + ); + }); + } +} diff --git a/bridges/docs/complex-relay.html b/bridges/docs/complex-relay.html new file mode 100644 index 00000000000..21524bfd049 --- /dev/null +++ b/bridges/docs/complex-relay.html @@ -0,0 +1,85 @@ + + + + + + Complex Relay + + +

Complex Relay

+

+ Both Source Chain and Target Chains have Bridge Messages pallets deployed. They also have required + finality pallets deployed - we don't care about finality type here - they can be either Bridge GRANDPA, + or Bridge Parachains finality pallets, or any combination of those.
+

+

+ There are 4-6 relayer subprocesses inside the Complex Relayer. They include two message relayers, + serving the lane in both directions and 2-4 Complex Relayers (depending on the finality type of Source + and Target Chains).
+

+

+ The following diagram shows the way the complex relayer serves the lane in single direction. Everything + below may be applied to the opposite direction if you'll swap the Source and Target Chains. +

+
+ sequenceDiagram + participant Source Chain + participant Complex Relayer + participant Target Chain + + Note right of Source Chain: Finalized: 480, Target Finalized: 50, Sent Messages: 42, Confirmed Messages: 42 + Note left of Target Chain: Finalized: 60, Source Finalized: 420, Received Messages: 42 + + Source Chain ->> Source Chain: someone Sends Message 43 + Source Chain ->> Source Chain: Import and Finalize Block 481 + + Source Chain ->> Complex Relayer: notes new outbound message 43 at Source Chain Block 481 + Note right of Complex Relayer: can't deliver message 43, Source Chain Block 481 is not relayed + Complex Relayer ->> Complex Relayer: asks on-demand Finality Relayer to relay Source Chain Block 481 + + Source Chain ->> Complex Relayer: Read Finality Proof of Block 481 + Complex Relayer ->> Target Chain: Submit Finality Proof of Block 481 + Target Chain ->> Target Chain: Import and Finalize Block 61 + Note left of Target Chain: Finalized: 61, Source Finalized: 481, Received Messages: 42 + + Source Chain ->> Complex Relayer: Read Proof of Message 43 at Block 481 + Complex Relayer ->> Target Chain: Submit Proof of Message 43 at Block 481 + Target Chain ->> Target Chain: Import and Finalize Block 62 + Note left of Target Chain: Finalized: 62, Source Finalized: 481, Received Messages: { rewarded: 42, messages-relayer-account: [43] } + + Target Chain ->> Complex Relayer: notes new unrewarded relayer at Target Chain Block 62 + Note right of Complex Relayer: can't relay delivery confirmations because Target Chain Block 62 is not relayed + Complex Relayer ->> Complex Relayer: asks on-demand Finality Relayer to relay Target Chain Block 62 + + Target Chain ->> Complex Relayer: Read Finality Proof of Block 62 + Complex Relayer ->> Source Chain: Submit Finality Proof of Block 62 + Source Chain ->> Source Chain: Import and Finalize Block 482 + Note right of Source Chain: Finalized: 482, Target Finalized: 62, Confirmed Messages: 42 + + Target Chain ->> Complex Relayer: Read Proof of Message 43 Delivery at Block 62 + Complex Relayer ->> Source Chain: Submit Proof of Message 43 Delivery at Block 612 + Source Chain ->> Source Chain: rewards messages-relayer-account for delivering message [43] + Source Chain ->> Source Chain: prune delivered message 43 from runtime storage + Note right of Source Chain: Finalized: 482, Target Finalized: 61, Confirmed Messages: 43 + + Source Chain ->> Source Chain: someone Sends Message 44 + Source Chain ->> Source Chain: Import and Finalize Block 483 + + Source Chain ->> Complex Relayer: notes new outbound message 44 at Source Chain Block 483 and new confirmed message 43 + Note right of Complex Relayer: can't deliver message 44, Source Chain Block 483 is not relayed + Complex Relayer ->> Complex Relayer: asks on-demand Finality Relayer to relay Source Chain Block 483 + + Source Chain ->> Complex Relayer: Read Finality Proof of Block 483 + Complex Relayer ->> Target Chain: Submit Finality Proof of Block 483 + Target Chain ->> Target Chain: Import and Finalize Block 63 + Note left of Target Chain: Finalized: 63, Source Finalized: 483, Received Messages: { rewarded: 42, messages-relayer-account: [43] } + + Source Chain ->> Complex Relayer: Read Proof of Message 44 and Proof of Message 43 reward at Block 483 + Complex Relayer ->> Target Chain: Submit Proof of Message 44 and Proof of Message 43 reward at Block 483 + Target Chain ->> Target Chain: Import and Finalize Block 64 + Note left of Target Chain: Finalized: 64, Source Finalized: 483, Received Messages: { rewarded: 43, messages-relayer-account: [44] }--> +
+ + + + diff --git a/bridges/docs/grandpa-finality-relay.html b/bridges/docs/grandpa-finality-relay.html new file mode 100644 index 00000000000..4136621b1a4 --- /dev/null +++ b/bridges/docs/grandpa-finality-relay.html @@ -0,0 +1,47 @@ + + + + + + GRANDPA Finality Relay + + +

GRANDPA Finality Relay

+

+ Source Chain is running GRANDPA Finality Gadget. Bridge GRANDPA finality pallet is deployed at + Target Chain runtime. Relayer is configured to relay Source Chain finality to Target Chain. +

+
+ sequenceDiagram + participant Source Chain + participant Relayer + participant Target Chain + Note left of Source Chain: Best: 500, Finalized: 480, Authorities Set Index: 42 + Note right of Target Chain: Uninitialized + + Source Chain ->> Relayer: Read Initialization Data + Relayer ->> Target Chain: Initialize Bridge GRANDPA Finality Pallet + Note right of Target Chain: Finalized: 480, Authorities Set Index: 42 + + Source Chain ->> Source Chain: Import Block 501 + Source Chain ->> Source Chain: Import Block 502 + Source Chain ->> Source Chain: Finalize Block 495 + Source Chain ->> Relayer: Read Finality Proof of Block 495 + Relayer ->> Target Chain: Finality Proof of Block 495 + Note right of Target Chain: Finalized: 495, Authorities Set Index: 42 + + Source Chain ->> Source Chain: Import Block 503 that changes Authorities Set to 43 + Source Chain ->> Source Chain: Finalize Block 500 + Note left of Relayer: Relayer Misses Finality Notification for Block 500 + + Source Chain ->> Source Chain: Import Block 504 + Source Chain ->> Source Chain: Finalize Mandatory Block 503 + Source Chain ->> Source Chain: Finalize Block 504 + Source Chain ->> Relayer: Read Finality Proof of Mandatory Block 503 + Relayer ->> Target Chain: Finality Proof of Block 503 + Note right of Target Chain: Finalized: 503, Authorities Set Index: 43 +
+ + + + diff --git a/bridges/docs/high-level-overview.md b/bridges/docs/high-level-overview.md new file mode 100644 index 00000000000..449224124af --- /dev/null +++ b/bridges/docs/high-level-overview.md @@ -0,0 +1,181 @@ +# High-Level Bridge Documentation + +This document gives a brief, abstract description of main components that may be found in this repository. +If you want to see how we're using them to build Rococo <> Wococo (Kusama <> Polkadot) bridge, please +refer to the [Polkadot <> Kusama Bridge](./polkadot-kusama-bridge-overview.md). + +## Purpose + +This repo contains all components required to build a trustless connection between standalone Substrate chains, +that are using GRANDPA finality, their parachains or any combination of those. On top of this connection, we +offer a messaging pallet that provides means to organize messages exchange. + +On top of that layered infrastructure, anyone may build their own bridge applications - e.g. [XCM messaging](./polkadot-kusama-bridge-overview.md), +[encoded calls messaging](https://github.com/paritytech/parity-bridges-common/releases/tag/encoded-calls-messaging) and so on. + +## Terminology + +Even though we support (and require) two-way bridging, the documentation will generally talk about +a one-sided interaction. That's to say, we will only talk about syncing finality proofs and messages +from a _source_ chain to a _target_ chain. This is because the two-sided interaction is really just the +one-sided interaction with the source and target chains switched. + +The bridge has both on-chain (pallets) and offchain (relayers) components. + +## On-chain components + +On-chain bridge components are pallets that are deployed at the chain runtime. Finality pallets require +deployment at the target chain, while messages pallet needs to be deployed at both, source +and target chains. + +### Bridge GRANDPA Finality Pallet + +A GRANDPA light client of the source chain built into the target chain's runtime. It provides a "source of truth" +about the source chain headers which have been finalized. This is useful for higher level applications. + +The pallet tracks current GRANDPA authorities set and only accepts finality proofs (GRANDPA justifications), +generated by the current authorities set. The GRANDPA protocol itself requires current authorities set to +generate explicit justification for the header that enacts next authorities set. Such headers and their finality +proofs are called mandatory in the pallet and relayer pays no fee for such headers submission. + +The pallet does not require all headers to be imported or provided. The relayer itself chooses which headers +he wants to submit (with the exception of mandatory headers). + +More: [pallet level documentation and code](../modules/grandpa/). + +### Bridge Parachains Finality Pallet + +Parachains are not supposed to have their own finality, so we can't use bridge GRANDPA pallet to verify their +finality proofs. Instead, they rely on their relay chain finality. The parachain header is considered final, +when it is accepted by the [`paras` pallet](https://github.com/paritytech/polkadot/tree/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras) +at its relay chain. Obviously, the relay chain block, where it is accepted, must also be finalized by the relay +chain GRANDPA gadget. + +That said, the bridge parachains pallet accepts storage proof of one or several parachain heads, inserted to the +[`Heads`](https://github.com/paritytech/polkadot/blob/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras/mod.rs#L642) +map of the [`paras` pallet](https://github.com/paritytech/polkadot/tree/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras). +To verify this storage proof, the pallet uses relay chain header, imported earlier by the bridge GRANDPA pallet. + +The pallet may track multiple parachains at once and those parachains may use different primitives. So the +parachain header decoding never happens at the pallet level. For maintaining the headers order, the pallet +uses relay chain header number. + +More: [pallet level documentation and code](../modules/parachains/). + +### Bridge Messages Pallet + +The pallet is responsible for queuing messages at the source chain and receiving the messages proofs at the +target chain. The messages are sent to the particular _lane_, where they are guaranteed to be received in the +same order they are sent. The pallet supports many lanes. + +The lane has two ends. Outbound lane end is storing number of messages that have been sent and the number of +messages that have been received. Inbound lane end stores the number of messages that have been received and +also a map that maps messages to relayers that have delivered those messages to the target chain. + +The pallet has three main entrypoints: +- the `send_message` may be used by the other runtime pallets to send the messages; +- the `receive_messages_proof` is responsible for parsing the messages proof and handing messages over to the +dispatch code; +- the `receive_messages_delivery_proof` is responsible for parsing the messages delivery proof and rewarding +relayers that have delivered the message. + +Many things are abstracted by the pallet: +- the message itself may mean anything, the pallet doesn't care about its content; +- the message dispatch happens during delivery, but it is decoupled from the pallet code; +- the messages proof and messages delivery proof are verified outside of the pallet; +- the relayers incentivization scheme is defined outside of the pallet. + +Outside of the messaging pallet, we have a set of adapters, where messages and delivery proofs are regular +storage proofs. The proofs are generated at the bridged chain and require bridged chain finality. So messages +pallet, in this case, depends on one of the finality pallets. The messages are XCM messages and we are using +XCM executor to dispatch them on receival. You may find more info in [Polkadot <> Kusama Bridge](./polkadot-kusama-bridge-overview.md) +document. + +More: [pallet level documentation and code](../modules/messages/). + +### Bridge Relayers Pallet + +The pallet is quite simple. It just registers relayer rewards and has an entrypoint to collect them. When +the rewards are registered and the reward amount is configured outside of the pallet. + +More: [pallet level documentation and code](../modules/relayers/). + +## Offchain Components + +Offchain bridge components are separate processes, called relayers. Relayers are connected both to the +source chain and target chain nodes. Relayers are reading state of the source chain, compare it to the +state of the target chain and, if state at target chain needs to be updated, submits target chain +transaction. + +### GRANDPA Finality Relay + +The task of relay is to submit source chain GRANDPA justifications and their corresponding headers to +the Bridge GRANDPA Finality Pallet, deployed at the target chain. For that, the relay subscribes to +the source chain GRANDPA justifications stream and submits every new justification it sees to the +target chain GRANDPA light client. In addition, relay is searching for mandatory headers and +submits their justifications - without that the pallet will be unable to move forward. + +More: [GRANDPA Finality Relay Sequence Diagram](./grandpa-finality-relay.html), [pallet level documentation and code](../relays/finality/). + +### Parachains Finality Relay + +The relay connects to the source _relay_ chain and the target chain nodes. It doesn't need to connect to the +tracked parachain nodes. The relay looks at the [`Heads`](https://github.com/paritytech/polkadot/blob/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras/mod.rs#L642) +map of the [`paras` pallet](https://github.com/paritytech/polkadot/tree/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras) +in source chain, and compares the value with the best parachain head, stored in the bridge parachains pallet at +the target chain. If new parachain head appears at the relay chain block `B`, the relay process **waits** +until header `B` or one of its ancestors appears at the target chain. Once it is available, the storage +proof of the map entry is generated and is submitted to the target chain. + +As its on-chain component (which requires bridge GRANDPA pallet to be deployed nearby), the parachains +finality relay requires GRANDPA finality relay to be running in parallel. Without it, the header `B` or +any of its children's finality at source won't be relayed at target, and target chain +won't be able to verify generated storage proof. + +More: [Parachains Finality Relay Sequence Diagram](./parachains-finality-relay.html), [code](../relays/parachains/). + +### Messages Relay + +Messages relay is actually two relays that are running in a single process: messages delivery relay and +delivery confirmation relay. Even though they are more complex and have many caveats, the overall algorithm +is the same as in other relays. + +Message delivery relay connects to the source chain and looks at the outbound lane end, waiting until new +messages are queued there. Once they appear at the source block `B`, the relay start waiting for the block +`B` or its descendant appear at the target chain. Then the messages storage proof is generated and submitted +to the bridge messages pallet at the target chain. In addition, the transaction may include the storage proof +of the outbound lane state - that proves that relayer rewards have been paid and this data (map of relay +accounts to the delivered messages) may be pruned from the inbound lane state at the target chain. + +Delivery confirmation relay connects to the target chain and starts watching the inbound lane end. When new +messages are delivered to the target chain, the corresponding _source chain account_ is inserted to the +map in the inbound lane data. Relay detects that, say, at the target chain block `B` and waits until that +block or its descendant appears at the source chain. Once that happens, the relay crafts a storage proof of +that data and sends it to the messages pallet, deployed at the source chain. + +As you can see, the messages relay also requires finality relay to be operating in parallel. Since messages +relay submits transactions to both source and target chains, it requires both _source-to-target_ and +_target-to-source_ finality relays. They can be GRANDPA finality relays or GRANDPA+parachains finality relays, +depending on the type of connected chain. + +More: [Messages Relay Sequence Diagram](./messages-relay.html), [pallet level documentation and code](../relays/messages/). + +### Complex Relay + +Every relay transaction has its cost. The only transaction, that is "free" to relayer is when the mandatory +GRANDPA header is submitted. The relay that feeds the bridge with every relay chain and/or parachain head it +sees, will have to pay a (quite large) cost. And if no messages are sent through the bridge, that is just +waste of money. + +We have a special relay mode, called _complex relay_, where relay mostly sleeps and only submits transactions +that are required for the messages/confirmations delivery. This mode starts two message relays (in both +directions). All required finality relays are also started in a special _on-demand_ mode. In this mode they +do not submit any headers without special request. As always, the only exception is when GRANDPA finality +relay sees the mandatory header - it is submitted without such request. + +The message relays are watching their lanes and when, at some block `B`, they see new messages/confirmations +to be delivered, they are asking on-demand relays to relay this block `B`. On-demand relays does that and +then message relay may perform its job. If on-demand relay is a parachain finality relay, it also runs its +own on-demand GRANDPA relay, which is used to relay required relay chain headers. + +More: [Complex Relay Sequence Diagram](./complex-relay.html), [code](../relays/bin-substrate/src/cli/relay_headers_and_messages/). diff --git a/bridges/docs/messages-relay.html b/bridges/docs/messages-relay.html new file mode 100644 index 00000000000..c4dab9901e0 --- /dev/null +++ b/bridges/docs/messages-relay.html @@ -0,0 +1,78 @@ + + + + + + Messages Relay + + +

Messages Relay

+

+ Both Source Chain and Target Chains have Bridge Messages pallets deployed. They also have required + finality pallets deployed - we don't care about finality type here - they can be either Bridge GRANDPA, + or Bridge Parachains finality pallets, or any combination of those. +

+

+ Finality Relayer represents two actual relayers - one relays Source Chain Finality to Target Chain. + And another one relays Target Chain Finality to Source Chain. +

+
+ sequenceDiagram + participant Source Chain + participant Finality Relayer + participant Messages Relayer + participant Target Chain + + Note right of Source Chain: Finalized: 480, Target Finalized: 50, Sent Messages: 42, Confirmed Messages: 42 + Note left of Target Chain: Finalized: 60, Source Finalized: 420, Received Messages: 42 + + Source Chain ->> Source Chain: someone Sends Message 43 + Source Chain ->> Source Chain: Import and Finalize Block 481 + + Source Chain ->> Messages Relayer: notes new outbound message 43 at Source Chain Block 481 + Note right of Messages Relayer: can't deliver message 43, Source Chain Block 481 is not relayed + + Source Chain ->> Finality Relayer: Read Finality Proof of Block 481 + Finality Relayer ->> Target Chain: Submit Finality Proof of Block 481 + Target Chain ->> Target Chain: Import and Finalize Block 61 + Note left of Target Chain: Finalized: 61, Source Finalized: 481, Received Messages: 42 + + Source Chain ->> Messages Relayer: Read Proof of Message 43 at Block 481 + Messages Relayer ->> Target Chain: Submit Proof of Message 43 at Block 481 + Target Chain ->> Target Chain: Import and Finalize Block 62 + Note left of Target Chain: Finalized: 62, Source Finalized: 481, Received Messages: { rewarded: 42, messages-relayer-account: [43] } + + Target Chain ->> Messages Relayer: notes new unrewarded relayer at Target Chain Block 62 + Note right of Messages Relayer: can't relay delivery confirmations because Target Chain Block 62 is not relayed + + Target Chain ->> Finality Relayer: Read Finality Proof of Block 62 + Finality Relayer ->> Source Chain: Submit Finality Proof of Block 62 + Source Chain ->> Source Chain: Import and Finalize Block 482 + Note right of Source Chain: Finalized: 482, Target Finalized: 62, Confirmed Messages: 42 + + Target Chain ->> Messages Relayer: Read Proof of Message 43 Delivery at Block 62 + Messages Relayer ->> Source Chain: Submit Proof of Message 43 Delivery at Block 612 + Source Chain ->> Source Chain: rewards messages-relayer-account for delivering message [43] + Source Chain ->> Source Chain: prune delivered message 43 from runtime storage + Note right of Source Chain: Finalized: 482, Target Finalized: 61, Confirmed Messages: 43 + + Source Chain ->> Source Chain: someone Sends Message 44 + Source Chain ->> Source Chain: Import and Finalize Block 483 + + Source Chain ->> Messages Relayer: notes new outbound message 44 at Source Chain Block 483 and new confirmed message 43 + Note right of Messages Relayer: can't deliver message 44, Source Chain Block 483 is not relayed + + Source Chain ->> Finality Relayer: Read Finality Proof of Block 483 + Finality Relayer ->> Target Chain: Submit Finality Proof of Block 483 + Target Chain ->> Target Chain: Import and Finalize Block 63 + Note left of Target Chain: Finalized: 63, Source Finalized: 483, Received Messages: { rewarded: 42, messages-relayer-account: [43] } + + Source Chain ->> Messages Relayer: Read Proof of Message 44 and Proof of Message 43 reward at Block 483 + Messages Relayer ->> Target Chain: Submit Proof of Message 44 and Proof of Message 43 reward at Block 483 + Target Chain ->> Target Chain: Import and Finalize Block 64 + Note left of Target Chain: Finalized: 64, Source Finalized: 483, Received Messages: { rewarded: 43, messages-relayer-account: [44] } +
+ + + + diff --git a/bridges/docs/parachains-finality-relay.html b/bridges/docs/parachains-finality-relay.html new file mode 100644 index 00000000000..4fc1392b87d --- /dev/null +++ b/bridges/docs/parachains-finality-relay.html @@ -0,0 +1,55 @@ + + + + + + Parachains Finality Relay + + +

Parachains Finality Relay

+

+ Source Relay Chain is running GRANDPA Finality Gadget. Source Parachain is a parachain of the Source + Relay Chain. Bridge GRANDPA finality pallet is deployed at Target Chain runtime and is "connected" + to the Source Relay Chain. Bridge Parachains finality pallet is deployed at Target Chain and is + configured to track the Source Parachain. GRANDPA Relayer is configured to relay Source Relay Chain + finality to Target Chain. Parachains Relayer is configured to relay Source Parachain headers finality + to Target Chain. +

+
+ sequenceDiagram + participant Source Parachain + participant Source Relay Chain + participant GRANDPA Relayer + participant Parachains Relayer + participant Target Chain + + Note left of Source Parachain: Best: 125 + Note left of Source Relay Chain: Finalized: 500, Best Parachain at Finalized: 120 + Note right of Target Chain: Best Relay: 480, Best Parachain: 110 + + Source Parachain ->> Source Parachain: Import Block 126 + Source Parachain ->> Source Relay Chain: Receives the Parachain block 126 + + Source Relay Chain ->> Source Relay Chain: Import block 501 + Source Relay Chain ->> Source Relay Chain: Finalize block 501 + Note left of Source Relay Chain: Finalized: 501, Best Parachain at Finalized: 126 + + Source Relay Chain ->> Parachains Relayer: notes new Source Parachain Block 126 + Note left of Parachains Relayer: can't relay Source Parachain Block 126, because it requires at least Source Relay Block 501 at Target Chain + + Source Relay Chain ->> Source Relay Chain: Import block 502 + Source Relay Chain ->> Source Relay Chain: Finalize block 502 + + Source Relay Chain ->> GRANDPA Relayer: read GRANDPA Finality Proof of Block 502 + GRANDPA Relayer ->> Target Chain: submit GRANDPA Finality Proof of Block 502 + Note right of Target Chain: Best Relay: 502, Best Parachain: 110 + + Target Chain ->> Parachains Relayer: notes finalized Source Relay Block 502 at Target Chain + Source Relay Chain ->> Parachains Relayer: read Parachain Finality Proof at Relay Block 502 + Parachains Relayer ->> Target Chain: submit Parachain Finality Proof at Relay Block 502 + Note right of Target Chain: Best Relay: 502, Best Parachain: 126 +
+ + + + diff --git a/bridges/docs/polkadot-kusama-bridge-overview.md b/bridges/docs/polkadot-kusama-bridge-overview.md new file mode 100644 index 00000000000..9f407b6ba00 --- /dev/null +++ b/bridges/docs/polkadot-kusama-bridge-overview.md @@ -0,0 +1,132 @@ +# Polkadot <> Kusama Bridge Overview + +This document describes how we use all components, described in the [High-Level Bridge Documentation](./high-level-overview.md), +to build the XCM bridge between Kusama and Polkadot. In this case, our components merely work as a XCM transport +(like XCMP/UMP/HRMP), between chains that are not a part of the same consensus system. + +The overall architecture may be seen in [this diagram](./polkadot-kusama-bridge.html). + +## Bridge Hubs + +All operations at relay chain are expensive. Ideally all non-mandatory transactions must happen on parachains. +That's why we are planning to have two parachains - Polkadot Bridge Hub under Polkadot consensus and Kusama +Bridge Hub under Kusama consensus. + +The Bridge Hub will have all required bridge pallets in its runtime. We hope that later, other teams will be able to +use our bridge hubs too and have their pallets there. + +The Bridge Hub will use the base token of the ecosystem - KSM at Kusama Bridge Hub and DOT at Polkadot Bridge Hub. +The runtime will have minimal set of non-bridge pallets, so there's not much you can do directly on bridge hubs. + +## Connecting Parachains + +You won't be able to directly use bridge hub transactions to send XCM messages over the bridge. Instead, you'll need +to use other parachains transactions, which will use HRMP to deliver messages to the Bridge Hub. The Bridge Hub will +just queue these messages in its outbound lane, which is dedicated to deliver messages between two parachains. + +Our first planned bridge will connect the Polkadot' Statemint and Kusama' Statemine. Bridge between those two +parachains would allow Statemint accounts to hold wrapped KSM tokens and Statemine accounts to hold wrapped DOT +tokens. + +For that bridge (pair of parachains under different consensus systems) we'll be using the lane 00000000. Later, +when other parachains will join the bridge, they will be using other lanes for their messages. + +## Running Relayers + +We are planning to run our own complex relayer for the lane 00000000. The relayer will relay Kusama/Polkadot GRANDPA +justifications to the bridge hubs at the other side. It'll also relay finalized Kusama Bridge Hub and Polkadot Bridge +Hub heads. This will only happen when messages will be queued at hubs. So most of time relayer will be idle. + +There's no any active relayer sets, or something like that. Anyone may start its own relayer and relay queued messages. +We are not against that and, as always, appreciate any community efforts. Of course, running relayer has the cost. +Apart from paying for the CPU and network, the relayer pays for transactions at both sides of the bridge. We have +a mechanism for rewarding relayers. + +### Compensating the Cost of Message Delivery Transactions + +One part of our rewarding scheme is that the cost of message delivery, for honest relayer, is zero. The honest relayer +is the relayer, which is following our rules: + +- we do not reward relayers for submitting GRANDPA finality transactions. The only exception is submitting mandatory + headers (headers which are changing the GRANDPA authorities set) - the cost of such transaction is zero. The relayer + will pay the full cost for submitting all other headers; + +- we do not reward relayers for submitting parachain finality transactions. The relayer will pay the full cost for + submitting parachain finality transactions; + +- we compensate the cost of message delivery transactions that have actually delivered the messages. So if your + transaction has claimed to deliver messages `[42, 43, 44]`, but, because of some reasons, has actually delivered + messages `[42, 43]`, the transaction will be free for relayer. If it has not delivered any messages, then + the relayer pays the full cost of the transaction; + +- we compensate the cost of message delivery and all required finality calls, if they are part of the same + [`frame_utility::batch_all`](https://github.com/paritytech/substrate/blob/891d6a5c870ab88521183facafc811a203bb6541/frame/utility/src/lib.rs#L326) + transaction. Of course, the calls inside the batch must be linked - e.g. the submitted parachain head must be used + to prove messages. Relay header must be used to prove parachain head finality. If one of calls fails, or if they + are not linked together, the relayer pays the full transaction cost. + +Please keep in mind that the fee of "zero-cost" transactions is still withdrawn from the relayer account. But the +compensation is registered in the `pallet_bridge_relayers::RelayerRewards` map at the target bridge hub. The relayer +may later claim all its rewards later, using the `pallet_bridge_relayers::claim_rewards` call. + +*A side note*: why we don't simply set the cost of useful transactions to zero? That's because the bridge has its cost. +If we won't take any fees, it would mean that the sender is not obliged to pay for its messages. And Bridge Hub +collators (and, maybe, "treasury") are not receiving any payment for including transactions. More about this later, +in the [Who is Rewarding Relayers](#who-is-rewarding-relayers) section. + +### Message Delivery Confirmation Rewards + +In addition to the "zero-cost" message delivery transactions, the relayer is also rewarded for: + +- delivering every message. The reward is registered during delivery confirmation transaction at the Source Bridge + Hub.; + +- submitting delivery confirmation transaction. The relayer may submit delivery confirmation that e.g. confirms + delivery of four messages, of which the only one (or zero) messages is actually delivered by this relayer. It + receives some fee for confirming messages, delivered by other relayers. + +Both rewards may be claimed using the `pallet_bridge_relayers::claim_rewards` call at the Source Bridge Hub. + +### Who is Rewarding Relayers + +Obviously, there should be someone who is paying relayer rewards. We want bridge transactions to have a cost, so we +can't use fees for rewards. Instead, the parachains using the bridge, use sovereign accounts on both sides +of the bridge to cover relayer rewards. + +Bridged Parachains will have sovereign accounts at bridge hubs. For example, the Statemine (Kusama Parachain) will +have an account at the Polkadot Bridge Hub. The Statemint (Polkadot Parachain) will have an account at the Kusama +Bridge Hub. The sovereign accounts are used as a source of funds when the relayer is calling the +`pallet_bridge_relayers::claim_rewards`. + +Since messages lane is only used by the pair of parachains, there's no collision between different bridges. E.g. +Statemine will only reward relayers that are delivering messages from Statemine. The Statemine sovereign account +is not used to cover rewards of bridging with some other Polkadot Parachain. + +### Multiple Relayers and Rewards + +Our goal is to incentivize running honest relayers. But we have no relayers sets, so at any time anyone may submit +message delivery transaction, hoping that the cost of this transaction will be compensated. So what if some message is +currently queued and two relayers are submitting two identical message delivery transactions at once? Without any +special means, the cost of first included transaction will be compensated and the cost of the other one won't. A honest, +but unlucky relayer will lose some money. In addition, we'll waste some portion of block size and weight, which +may be used by other useful transactions. + +To solve the problem, we have two signed extensions ([generate_bridge_reject_obsolete_headers_and_messages! {}](../bin/runtime-common/src/lib.rs) +and [RefundRelayerForMessagesFromParachain](../bin/runtime-common/src/refund_relayer_extension.rs)), that are +preventing bridge transactions with obsolete data from including into the block. We are rejecting following +transactions: + +- transactions, that are submitting the GRANDPA justification for the best finalized header, or one of its ancestors; + +- transactions, that are submitting the proof of the current best parachain head, or one of its ancestors; + +- transactions, that are delivering already delivered messages. If at least one of messages is not yet delivered, + the transaction is not rejected; + +- transactions, that are confirming delivery of already confirmed messages. If at least one of confirmations is new, + the transaction is not rejected; + +- [`frame_utility::batch_all`](https://github.com/paritytech/substrate/blob/891d6a5c870ab88521183facafc811a203bb6541/frame/utility/src/lib.rs#L326) + transactions, that have both finality and message delivery calls. All restrictions from the + [Compensating the Cost of Message Delivery Transactions](#compensating-the-cost-of-message-delivery-transactions) + are applied. diff --git a/bridges/docs/polkadot-kusama-bridge.html b/bridges/docs/polkadot-kusama-bridge.html new file mode 100644 index 00000000000..dcbae0e7b17 --- /dev/null +++ b/bridges/docs/polkadot-kusama-bridge.html @@ -0,0 +1,67 @@ + + + + + + Polkadot <> Kusama Bridge + + +

Polkadot <> Kusama Bridge

+

+ Our bridge connects two parachains - Kusama Bridge Hub and Polkadot Bridge Hub. Messages that + are sent over bridge have XCM format and we are using existing architecture to dispatch them. + Since both Polkadot, Kusama and their parachains already have means to exchange XCM messages + within the same consensus system (HRMP, VMP, ...), it means that we are able to connect all those + chains with our bridge. +

+

+ In our architecture, the lane that is used to relay messages over the bridge is determined by + the XCM source and destinations. So e.g. bridge between Statemint and Statemine (and opposite direction) + will use the lane 00000000, bridge between some other Polkadot Parachain and some other Kusama Parachain + will use the lane 00000001 and so on. +

+
+ flowchart LR + subgraph Polkadot Consensus + polkadot(((Polkadot))) + statemint(((Statemint))) + polkadot_bh(((Polkadot Bridge Hub))) + + polkadot---statemint + polkadot---polkadot_bh + + statemint-->|Send Message Using HRMP|polkadot_bh + + polkadot_bh-->|Send Message Using HRMP|statemint + statemint-->|Dispatch the Message|statemint + end + subgraph Kusama Consensus + kusama_bh(((Kusama Bridge Hub))) + statemine(((Statemine))) + kusama(((Kusama))) + + kusama---statemine + kusama---kusama_bh + + kusama_bh-->|Send Message Using HRMP|statemine + statemine-->|Dispatch the Message|statemine + + statemine-->|Send Message Using HRMP|kusama_bh + end + + polkadot_bh<===>|Message is relayed to the Bridged Chain using lane 00000000|kusama_bh + + linkStyle 2 stroke:red + linkStyle 7 stroke:red + linkStyle 8 stroke:red + + linkStyle 3 stroke:green + linkStyle 4 stroke:green + linkStyle 9 stroke:green +
+ + + \ No newline at end of file diff --git a/bridges/modules/grandpa/Cargo.toml b/bridges/modules/grandpa/Cargo.toml new file mode 100644 index 00000000000..9b97b518fc5 --- /dev/null +++ b/bridges/modules/grandpa/Cargo.toml @@ -0,0 +1,63 @@ +[package] +name = "pallet-bridge-grandpa" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +finality-grandpa = { version = "0.16.2", default-features = false } +log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } + +# Bridge Dependencies + +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-header-chain = { path = "../../primitives/header-chain", default-features = false } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +# Optional Benchmarking Dependencies +bp-test-utils = { path = "../../primitives/test-utils", default-features = false, optional = true } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } + +[dev-dependencies] +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-runtime/std", + "bp-test-utils/std", + "codec/std", + "finality-grandpa/std", + "frame-support/std", + "frame-system/std", + "frame-benchmarking/std", + "log/std", + "scale-info/std", + "sp-consensus-grandpa/std", + "sp-runtime/std", + "sp-std/std", + "sp-trie/std", +] +runtime-benchmarks = [ + "bp-test-utils", + "frame-benchmarking/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", +] diff --git a/bridges/modules/grandpa/README.md b/bridges/modules/grandpa/README.md new file mode 100644 index 00000000000..27b4d2389c4 --- /dev/null +++ b/bridges/modules/grandpa/README.md @@ -0,0 +1,101 @@ +# Bridge GRANDPA Pallet + +The bridge GRANDPA pallet is a light client for the GRANDPA finality gadget, running at the bridged chain. +It may import headers and their GRANDPA finality proofs (justifications) of the bridged chain. Imported +headers then may be used to verify storage proofs by other pallets. This makes the bridge GRANDPA pallet +a basic pallet of all bridges with Substrate-based chains. It is used by all bridge types (bridge between +standalone chains, between parachains and any combination of those) and is used by other bridge pallets. +It is used by the parachains light client (bridge parachains pallet) and by messages pallet. + +## A Brief Introduction into GRANDPA Finality + +You can find detailed information on GRANDPA, by exploring its [repository](https://github.com/paritytech/finality-grandpa). +Here is the minimal reqiuired GRANDPA information to understand how pallet works. + +Any Substrate chain may use different block authorship algorithms (like BABE or Aura) to determine block producers and +generate blocks. This has nothing common with finality, though - the task of block authorship is to coordinate +blocks generation. Any block may be reverted (if there's a fork) if it is not finalized. The finality solution +for (standalone) Substrate-based chains is the GRANDPA finality gadget. If some block is finalized by the gadget, it +can't be reverted. + +In GRANDPA, there are validators, identified by their public keys. They select some generated block and produce +signatures on this block hash. If there are enough (more than `2 / 3 * N`, where `N` is number of validators) +signatures, then the block is considered finalized. The set of signatures for the block is called justification. +Anyone who knows the public keys of validators is able to verify GRANDPA justification and that it is generated +for provided header. + +There are two main things in GRANDPA that help building light clients: + +- there's no need to import all headers of the bridged chain. Light client may import finalized headers or just + some of finalized headders that it consider useful. While the validators set stays the same, the client may + import any header that is finalized by this set; + +- when validators set changes, the GRANDPA gadget adds next set to the header. So light client doesn't need to + verify storage proofs when this happens - it only needs to look at the header and see if it changes the set. + Once set is changed, all following justifications are generated by the new set. Header that is changing the + set is called "mandatory" in the pallet. As the name says, the light client need to import all such headers + to be able to operate properly. + +## Pallet Operations + +The main entrypoint of the pallet is the `submit_finality_proof` call. It has two arguments - the finalized +headers and associated GRANDPA justification. The call simply verifies the justification using current +validators set and checks if header is better than the previous best header. If both checks are passed, the +header (only its useful fields) is inserted into the runtime storage and may be used by other pallets to verify +storage proofs. + +The submitter pays regular fee for submitting all headers, except for the mandatory header. Since it is +required for the pallet operations, submitting such header is free. So if you're ok with session-length +lags (meaning that there's exactly 1 mandatory header per session), the cost of pallet calls is zero. + +When the pallet sees mandatory header, it updates the validators set with the set from the header. All +following justifications (until next mandatory header) must be generated by this new set. + +## Pallet Initialization + +As the previous section states, there are two things that are mandatory for pallet operations: best finalized +header and the current validators set. Without it the pallet can't import any headers. But how to provide +initial values for these fields? There are two options. + +First option, while it is easier, doesn't work in all cases. It is to start chain with initial header and +validators set specified in the chain specification. This won't work, however, if we want to add bridge +to already started chain. + +For the latter case we have the `initialize` call. It accepts the initial header and initial validators set. +The call may be called by the governance, root or by the pallet owner (if it is set). + +## Non-Essential Functionality + +There may be a special account in every runtime where the bridge GRANDPA module is deployed. This +account, named 'module owner', is like a module-level sudo account - he's able to halt and +resume all module operations without requiring runtime upgrade. Calls that are related to this +account are: + +- `fn set_owner()`: current module owner may call it to transfer "ownership" to another account; + +- `fn set_operating_mode()`: the module owner (or sudo account) may call this function to stop all + module operations. After this call, all finality proofs will be rejected until further `set_operating_mode` call'. + This call may be used when something extraordinary happens with the bridge; + +- `fn initialize()`: module owner may call this function to initialize the bridge. + +If pallet owner is not defined, the governance may be used to make those calls. + +## Signed Extension to Reject Obsolete Headers + +It'd be better for anyone (for chain and for submitters) to reject all transactions that are submitting +already known headers to the pallet. This way, we leave block space to other useful transactions and +we don't charge concurrent submitters for their honest actions. + +To deal with that, we have a [signed extension](./src/call_ext) that may be added to the runtime. +It does exactly what is required - rejects all transactions with already known headers. The submitter +pays nothing for such transactions - they're simply removed from the transaction pool, when the block +is built. + +You may also take a look at the [`generate_bridge_reject_obsolete_headers_and_messages`](../../bin/runtime-common/src/lib.rs) +macro that bundles several similar signed extensions in a single one. + +## GRANDPA Finality Relay + +We have an offchain actor, who is watching for GRANDPA justifications and submits them to the bridged chain. +It is the finality relay - you may look at the [crate level documentation and the code](../../relays/finality/). diff --git a/bridges/modules/grandpa/src/benchmarking.rs b/bridges/modules/grandpa/src/benchmarking.rs new file mode 100644 index 00000000000..aa222d6e4de --- /dev/null +++ b/bridges/modules/grandpa/src/benchmarking.rs @@ -0,0 +1,141 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Benchmarks for the GRANDPA Pallet. +//! +//! The main dispatchable for the GRANDPA pallet is `submit_finality_proof`, so these benchmarks are +//! based around that. There are to main factors which affect finality proof verification: +//! +//! 1. The number of `votes-ancestries` in the justification +//! 2. The number of `pre-commits` in the justification +//! +//! Vote ancestries are the headers between (`finality_target`, `head_of_chain`], where +//! `header_of_chain` is a descendant of `finality_target`. +//! +//! Pre-commits are messages which are signed by validators at the head of the chain they think is +//! the best. +//! +//! Consider the following: +//! +//! / B <- C' +//! A <- B <- C +//! +//! The common ancestor of both forks is block A, so this is what GRANDPA will finalize. In order to +//! verify this we will have vote ancestries of `[B, C, B', C']` and pre-commits `[C, C']`. +//! +//! Note that the worst case scenario here would be a justification where each validator has it's +//! own fork which is `SESSION_LENGTH` blocks long. + +use crate::*; + +use bp_header_chain::justification::required_justification_precommits; +use bp_runtime::BasicOperatingMode; +use bp_test_utils::{ + accounts, make_justification_for_header, JustificationGeneratorParams, TEST_GRANDPA_ROUND, + TEST_GRANDPA_SET_ID, +}; +use frame_benchmarking::{benchmarks_instance_pallet, whitelisted_caller}; +use frame_system::RawOrigin; +use sp_consensus_grandpa::AuthorityId; +use sp_runtime::traits::{One, Zero}; +use sp_std::vec::Vec; + +/// The maximum number of vote ancestries to include in a justification. +/// +/// In practice this would be limited by the session length (number of blocks a single authority set +/// can produce) of a given chain. +const MAX_VOTE_ANCESTRIES: u32 = 1000; + +// `1..MAX_VOTE_ANCESTRIES` is too large && benchmarks are running for almost 40m (steps=50, +// repeat=20) on a decent laptop, which is too much. Since we're building linear function here, +// let's just select some limited subrange for benchmarking. +const MAX_VOTE_ANCESTRIES_RANGE_BEGIN: u32 = MAX_VOTE_ANCESTRIES / 20; +const MAX_VOTE_ANCESTRIES_RANGE_END: u32 = + MAX_VOTE_ANCESTRIES_RANGE_BEGIN + MAX_VOTE_ANCESTRIES_RANGE_BEGIN; + +// the same with validators - if there are too much validators, let's run benchmarks on subrange +fn precommits_range_end, I: 'static>() -> u32 { + let max_bridged_authorities = T::BridgedChain::MAX_AUTHORITIES_COUNT; + if max_bridged_authorities > 128 { + sp_std::cmp::max(128, max_bridged_authorities / 5) + } else { + max_bridged_authorities + }; + required_justification_precommits(max_bridged_authorities) +} + +/// Prepare header and its justification to submit using `submit_finality_proof`. +fn prepare_benchmark_data, I: 'static>( + precommits: u32, + ancestors: u32, +) -> (BridgedHeader, GrandpaJustification>) { + // going from precommits to total authorities count + let total_authorities_count = (3 * precommits - 1) / 2; + + let authority_list = accounts(total_authorities_count as u16) + .iter() + .map(|id| (AuthorityId::from(*id), 1)) + .collect::>(); + + let genesis_header: BridgedHeader = bp_test_utils::test_header(Zero::zero()); + let genesis_hash = genesis_header.hash(); + let init_data = InitializationData { + header: Box::new(genesis_header), + authority_list, + set_id: TEST_GRANDPA_SET_ID, + operating_mode: BasicOperatingMode::Normal, + }; + + bootstrap_bridge::(init_data); + assert!(>::contains_key(genesis_hash)); + + let header: BridgedHeader = bp_test_utils::test_header(One::one()); + let params = JustificationGeneratorParams { + header: header.clone(), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: accounts(precommits as u16).iter().map(|k| (*k, 1)).collect::>(), + ancestors, + forks: 1, + }; + let justification = make_justification_for_header(params); + (header, justification) +} + +benchmarks_instance_pallet! { + // This is the "gold standard" benchmark for this extrinsic, and it's what should be used to + // annotate the weight in the pallet. + submit_finality_proof { + let p in 1 .. precommits_range_end::(); + let v in MAX_VOTE_ANCESTRIES_RANGE_BEGIN..MAX_VOTE_ANCESTRIES_RANGE_END; + let caller: T::AccountId = whitelisted_caller(); + let (header, justification) = prepare_benchmark_data::(p, v); + }: submit_finality_proof(RawOrigin::Signed(caller), Box::new(header), justification) + verify { + let genesis_header: BridgedHeader = bp_test_utils::test_header(Zero::zero()); + let header: BridgedHeader = bp_test_utils::test_header(One::one()); + let expected_hash = header.hash(); + + // check that the header#1 has been inserted + assert_eq!(>::get().unwrap().1, expected_hash); + assert!(>::contains_key(expected_hash)); + + // check that the header#0 has been pruned + assert!(!>::contains_key(genesis_header.hash())); + } + + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) +} diff --git a/bridges/modules/grandpa/src/call_ext.rs b/bridges/modules/grandpa/src/call_ext.rs new file mode 100644 index 00000000000..b57aebb1ac1 --- /dev/null +++ b/bridges/modules/grandpa/src/call_ext.rs @@ -0,0 +1,311 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +use crate::{weights::WeightInfo, BridgedBlockNumber, BridgedHeader, Config, Error, Pallet}; +use bp_header_chain::{justification::GrandpaJustification, ChainWithGrandpa}; +use bp_runtime::BlockNumberOf; +use codec::Encode; +use frame_support::{dispatch::CallableCallFor, traits::IsSubType, weights::Weight, RuntimeDebug}; +use sp_runtime::{ + traits::{Header, Zero}, + transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, + SaturatedConversion, +}; + +/// Info about a `SubmitParachainHeads` call which tries to update a single parachain. +#[derive(Copy, Clone, PartialEq, RuntimeDebug)] +pub struct SubmitFinalityProofInfo { + /// Number of the finality target. + pub block_number: N, + /// Extra weight that we assume is included in the call. + /// + /// We have some assumptions about headers and justifications of the bridged chain. + /// We know that if our assumptions are correct, then the call must not have the + /// weight above some limit. The fee paid for weight above that limit, is never refunded. + pub extra_weight: Weight, + /// Extra size (in bytes) that we assume are included in the call. + /// + /// We have some assumptions about headers and justifications of the bridged chain. + /// We know that if our assumptions are correct, then the call must not have the + /// weight above some limit. The fee paid for bytes above that limit, is never refunded. + pub extra_size: u32, +} + +impl SubmitFinalityProofInfo { + /// Returns `true` if call size/weight is below our estimations for regular calls. + pub fn fits_limits(&self) -> bool { + self.extra_weight.is_zero() && self.extra_size.is_zero() + } +} + +/// Helper struct that provides methods for working with the `SubmitFinalityProof` call. +pub struct SubmitFinalityProofHelper, I: 'static> { + _phantom_data: sp_std::marker::PhantomData<(T, I)>, +} + +impl, I: 'static> SubmitFinalityProofHelper { + /// Check that the GRANDPA head provided by the `SubmitFinalityProof` is better than the best + /// one we know. + pub fn check_obsolete( + finality_target: BlockNumberOf, + ) -> Result<(), Error> { + let best_finalized = crate::BestFinalized::::get().ok_or_else(|| { + log::trace!( + target: crate::LOG_TARGET, + "Cannot finalize header {:?} because pallet is not yet initialized", + finality_target, + ); + >::NotInitialized + })?; + + if best_finalized.number() >= finality_target { + log::trace!( + target: crate::LOG_TARGET, + "Cannot finalize obsolete header: bundled {:?}, best {:?}", + finality_target, + best_finalized, + ); + + return Err(Error::::OldHeader) + } + + Ok(()) + } + + /// Check if the `SubmitFinalityProof` was successfully executed. + pub fn was_successful(finality_target: BlockNumberOf) -> bool { + match crate::BestFinalized::::get() { + Some(best_finalized) => best_finalized.number() == finality_target, + None => false, + } + } +} + +/// Trait representing a call that is a sub type of this pallet's call. +pub trait CallSubType, I: 'static>: + IsSubType, T>> +{ + /// Extract finality proof info from a runtime call. + fn submit_finality_proof_info( + &self, + ) -> Option>> { + if let Some(crate::Call::::submit_finality_proof { finality_target, justification }) = + self.is_sub_type() + { + return Some(submit_finality_proof_info_from_args::( + finality_target, + justification, + )) + } + + None + } + + /// Validate Grandpa headers in order to avoid "mining" transactions that provide outdated + /// bridged chain headers. Without this validation, even honest relayers may lose their funds + /// if there are multiple relays running and submitting the same information. + fn check_obsolete_submit_finality_proof(&self) -> TransactionValidity + where + Self: Sized, + { + let finality_target = match self.submit_finality_proof_info() { + Some(finality_proof) => finality_proof, + _ => return Ok(ValidTransaction::default()), + }; + + match SubmitFinalityProofHelper::::check_obsolete(finality_target.block_number) { + Ok(_) => Ok(ValidTransaction::default()), + Err(Error::::OldHeader) => InvalidTransaction::Stale.into(), + Err(_) => InvalidTransaction::Call.into(), + } + } +} + +impl, I: 'static> CallSubType for T::RuntimeCall where + T::RuntimeCall: IsSubType, T>> +{ +} + +/// Extract finality proof info from the submitted header and justification. +pub(crate) fn submit_finality_proof_info_from_args, I: 'static>( + finality_target: &BridgedHeader, + justification: &GrandpaJustification>, +) -> SubmitFinalityProofInfo> { + let block_number = *finality_target.number(); + + // the `submit_finality_proof` call will reject justifications with invalid, duplicate, + // unknown and extra signatures. It'll also reject justifications with less than necessary + // signatures. So we do not care about extra weight because of additional signatures here. + let precommits_len = justification.commit.precommits.len().saturated_into(); + let required_precommits = precommits_len; + + // We do care about extra weight because of more-than-expected headers in the votes + // ancestries. But we have problems computing extra weight for additional headers (weight of + // additional header is too small, so that our benchmarks aren't detecting that). So if there + // are more than expected headers in votes ancestries, we will treat the whole call weight + // as an extra weight. + let votes_ancestries_len = justification.votes_ancestries.len().saturated_into(); + let extra_weight = + if votes_ancestries_len > T::BridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY { + T::WeightInfo::submit_finality_proof(precommits_len, votes_ancestries_len) + } else { + Weight::zero() + }; + + // we can estimate extra call size easily, without any additional significant overhead + let actual_call_size: u32 = finality_target + .encoded_size() + .saturating_add(justification.encoded_size()) + .saturated_into(); + let max_expected_call_size = max_expected_call_size::(required_precommits); + let extra_size = actual_call_size.saturating_sub(max_expected_call_size); + + SubmitFinalityProofInfo { block_number, extra_weight, extra_size } +} + +/// Returns maximal expected size of `submit_finality_proof` call arguments. +fn max_expected_call_size, I: 'static>(required_precommits: u32) -> u32 { + let max_expected_justification_size = + GrandpaJustification::max_reasonable_size::(required_precommits); + + // call arguments are header and justification + T::BridgedChain::MAX_HEADER_SIZE.saturating_add(max_expected_justification_size) +} + +#[cfg(test)] +mod tests { + use crate::{ + call_ext::CallSubType, + mock::{run_test, test_header, RuntimeCall, TestBridgedChain, TestNumber, TestRuntime}, + BestFinalized, Config, WeightInfo, + }; + use bp_header_chain::ChainWithGrandpa; + use bp_runtime::HeaderId; + use bp_test_utils::{ + make_default_justification, make_justification_for_header, JustificationGeneratorParams, + }; + use frame_support::weights::Weight; + use sp_runtime::{testing::DigestItem, traits::Header as _, SaturatedConversion}; + + fn validate_block_submit(num: TestNumber) -> bool { + let bridge_grandpa_call = crate::Call::::submit_finality_proof { + finality_target: Box::new(test_header(num)), + justification: make_default_justification(&test_header(num)), + }; + RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( + bridge_grandpa_call, + )) + .is_ok() + } + + fn sync_to_header_10() { + let header10_hash = sp_core::H256::default(); + BestFinalized::::put(HeaderId(10, header10_hash)); + } + + #[test] + fn extension_rejects_obsolete_header() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#5 => tx is + // rejected + sync_to_header_10(); + assert!(!validate_block_submit(5)); + }); + } + + #[test] + fn extension_rejects_same_header() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#10 => tx is + // rejected + sync_to_header_10(); + assert!(!validate_block_submit(10)); + }); + } + + #[test] + fn extension_accepts_new_header() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#15 => tx is + // accepted + sync_to_header_10(); + assert!(validate_block_submit(15)); + }); + } + + #[test] + fn extension_returns_correct_extra_size_if_call_arguments_are_too_large() { + // when call arguments are below our limit => no refund + let small_finality_target = test_header(1); + let justification_params = JustificationGeneratorParams { + header: small_finality_target.clone(), + ..Default::default() + }; + let small_justification = make_justification_for_header(justification_params); + let small_call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + finality_target: Box::new(small_finality_target), + justification: small_justification, + }); + assert_eq!(small_call.submit_finality_proof_info().unwrap().extra_size, 0); + + // when call arguments are too large => partial refund + let mut large_finality_target = test_header(1); + large_finality_target + .digest_mut() + .push(DigestItem::Other(vec![42u8; 1024 * 1024])); + let justification_params = JustificationGeneratorParams { + header: large_finality_target.clone(), + ..Default::default() + }; + let large_justification = make_justification_for_header(justification_params); + let large_call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + finality_target: Box::new(large_finality_target), + justification: large_justification, + }); + assert_ne!(large_call.submit_finality_proof_info().unwrap().extra_size, 0); + } + + #[test] + fn extension_returns_correct_extra_weight_if_there_are_too_many_headers_in_votes_ancestry() { + let finality_target = test_header(1); + let mut justification_params = JustificationGeneratorParams { + header: finality_target.clone(), + ancestors: TestBridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY, + ..Default::default() + }; + + // when there are `REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY` headers => no refund + let justification = make_justification_for_header(justification_params.clone()); + let call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + finality_target: Box::new(finality_target.clone()), + justification, + }); + assert_eq!(call.submit_finality_proof_info().unwrap().extra_weight, Weight::zero()); + + // when there are `REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY + 1` headers => full refund + justification_params.ancestors += 1; + let justification = make_justification_for_header(justification_params); + let call_weight = ::WeightInfo::submit_finality_proof( + justification.commit.precommits.len().saturated_into(), + justification.votes_ancestries.len().saturated_into(), + ); + let call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + finality_target: Box::new(finality_target), + justification, + }); + assert_eq!(call.submit_finality_proof_info().unwrap().extra_weight, call_weight); + } +} diff --git a/bridges/modules/grandpa/src/lib.rs b/bridges/modules/grandpa/src/lib.rs new file mode 100644 index 00000000000..329e4c21136 --- /dev/null +++ b/bridges/modules/grandpa/src/lib.rs @@ -0,0 +1,1427 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Substrate GRANDPA Pallet +//! +//! This pallet is an on-chain GRANDPA light client for Substrate based chains. +//! +//! This pallet achieves this by trustlessly verifying GRANDPA finality proofs on-chain. Once +//! verified, finalized headers are stored in the pallet, thereby creating a sparse header chain. +//! This sparse header chain can be used as a source of truth for other higher-level applications. +//! +//! The pallet is responsible for tracking GRANDPA validator set hand-offs. We only import headers +//! with justifications signed by the current validator set we know of. The header is inspected for +//! a `ScheduledChanges` digest item, which is then used to update to next validator set. +//! +//! Since this pallet only tracks finalized headers it does not deal with forks. Forks can only +//! occur if the GRANDPA validator set on the bridged chain is either colluding or there is a severe +//! bug causing resulting in an equivocation. Such events are outside the scope of this pallet. +//! Shall the fork occur on the bridged chain governance intervention will be required to +//! re-initialize the bridge and track the right fork. + +#![cfg_attr(not(feature = "std"), no_std)] +// Runtime-generated enums +#![allow(clippy::large_enum_variant)] + +pub use storage_types::StoredAuthoritySet; + +use bp_header_chain::{ + justification::GrandpaJustification, ChainWithGrandpa, HeaderChain, InitializationData, + StoredHeaderData, StoredHeaderDataBuilder, +}; +use bp_runtime::{BlockNumberOf, HashOf, HasherOf, HeaderId, HeaderOf, OwnedBridgeModule}; +use finality_grandpa::voter_set::VoterSet; +use frame_support::{dispatch::PostDispatchInfo, ensure}; +use sp_consensus_grandpa::{ConsensusLog, GRANDPA_ENGINE_ID}; +use sp_runtime::{ + traits::{Header as HeaderT, Zero}, + SaturatedConversion, +}; +use sp_std::{boxed::Box, convert::TryInto}; + +mod call_ext; +#[cfg(test)] +mod mock; +mod storage_types; + +/// Module, containing weights for this pallet. +pub mod weights; + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; + +// Re-export in crate namespace for `construct_runtime!` +pub use call_ext::*; +pub use pallet::*; +pub use weights::WeightInfo; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-grandpa"; + +/// Bridged chain from the pallet configuration. +pub type BridgedChain = >::BridgedChain; +/// Block number of the bridged chain. +pub type BridgedBlockNumber = BlockNumberOf<>::BridgedChain>; +/// Block hash of the bridged chain. +pub type BridgedBlockHash = HashOf<>::BridgedChain>; +/// Block id of the bridged chain. +pub type BridgedBlockId = HeaderId, BridgedBlockNumber>; +/// Hasher of the bridged chain. +pub type BridgedBlockHasher = HasherOf<>::BridgedChain>; +/// Header of the bridged chain. +pub type BridgedHeader = HeaderOf<>::BridgedChain>; +/// Header data of the bridged chain that is stored at this chain by this pallet. +pub type BridgedStoredHeaderData = + StoredHeaderData, BridgedBlockHash>; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use bp_runtime::BasicOperatingMode; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + /// The overarching event type. + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + + /// The chain we are bridging to here. + type BridgedChain: ChainWithGrandpa; + + /// Maximal number of "free" mandatory header transactions per block. + /// + /// To be able to track the bridged chain, the pallet requires all headers that are + /// changing GRANDPA authorities set at the bridged chain (we call them mandatory). + /// So it is a common good deed to submit mandatory headers to the pallet. However, if the + /// bridged chain gets compromised, its validators may generate as many mandatory headers + /// as they want. And they may fill the whole block (at this chain) for free. This constants + /// limits number of calls that we may refund in a single block. All calls above this + /// limit are accepted, but are not refunded. + #[pallet::constant] + type MaxFreeMandatoryHeadersPerBlock: Get; + + /// Maximal number of finalized headers to keep in the storage. + /// + /// The setting is there to prevent growing the on-chain state indefinitely. Note + /// the setting does not relate to block numbers - we will simply keep as much items + /// in the storage, so it doesn't guarantee any fixed timeframe for finality headers. + /// + /// Incautious change of this constant may lead to orphan entries in the runtime storage. + #[pallet::constant] + type HeadersToKeep: Get; + + /// Weights gathered through benchmarking. + type WeightInfo: WeightInfo; + } + + #[pallet::pallet] + pub struct Pallet(PhantomData<(T, I)>); + + #[pallet::hooks] + impl, I: 'static> Hooks> for Pallet { + fn on_initialize(_n: BlockNumberFor) -> Weight { + FreeMandatoryHeadersRemaining::::put(T::MaxFreeMandatoryHeadersPerBlock::get()); + Weight::zero() + } + + fn on_finalize(_n: BlockNumberFor) { + FreeMandatoryHeadersRemaining::::kill(); + } + } + + impl, I: 'static> OwnedBridgeModule for Pallet { + const LOG_TARGET: &'static str = LOG_TARGET; + type OwnerStorage = PalletOwner; + type OperatingMode = BasicOperatingMode; + type OperatingModeStorage = PalletOperatingMode; + } + + #[pallet::call] + impl, I: 'static> Pallet { + /// Verify a target header is finalized according to the given finality proof. + /// + /// It will use the underlying storage pallet to fetch information about the current + /// authorities and best finalized header in order to verify that the header is finalized. + /// + /// If successful in verification, it will write the target header to the underlying storage + /// pallet. + /// + /// The call fails if: + /// + /// - the pallet is halted; + /// + /// - the pallet knows better header than the `finality_target`; + /// + /// - verification is not optimized or invalid; + /// + /// - header contains forced authorities set change or change with non-zero delay. + #[pallet::call_index(0)] + #[pallet::weight(::submit_finality_proof( + justification.commit.precommits.len().saturated_into(), + justification.votes_ancestries.len().saturated_into(), + ))] + pub fn submit_finality_proof( + _origin: OriginFor, + finality_target: Box>, + justification: GrandpaJustification>, + ) -> DispatchResultWithPostInfo { + Self::ensure_not_halted().map_err(Error::::BridgeModule)?; + + let (hash, number) = (finality_target.hash(), *finality_target.number()); + log::trace!( + target: LOG_TARGET, + "Going to try and finalize header {:?}", + finality_target + ); + + SubmitFinalityProofHelper::::check_obsolete(number)?; + + let authority_set = >::get(); + let unused_proof_size = authority_set.unused_proof_size(); + let set_id = authority_set.set_id; + verify_justification::(&justification, hash, number, authority_set.into())?; + + let is_authorities_change_enacted = + try_enact_authority_change::(&finality_target, set_id)?; + let may_refund_call_fee = is_authorities_change_enacted && + // if we have seen too many mandatory headers in this block, we don't want to refund + Self::free_mandatory_headers_remaining() > 0 && + // if arguments out of expected bounds, we don't want to refund + submit_finality_proof_info_from_args::(&finality_target, &justification) + .fits_limits(); + if may_refund_call_fee { + FreeMandatoryHeadersRemaining::::mutate(|count| { + *count = count.saturating_sub(1) + }); + } + insert_header::(*finality_target, hash); + log::info!( + target: LOG_TARGET, + "Successfully imported finalized header with hash {:?}!", + hash + ); + + // mandatory header is a header that changes authorities set. The pallet can't go + // further without importing this header. So every bridge MUST import mandatory headers. + // + // We don't want to charge extra costs for mandatory operations. So relayer is not + // paying fee for mandatory headers import transactions. + // + // If size/weight of the call is exceeds our estimated limits, the relayer still needs + // to pay for the transaction. + let pays_fee = if may_refund_call_fee { Pays::No } else { Pays::Yes }; + + // the proof size component of the call weight assumes that there are + // `MaxBridgedAuthorities` in the `CurrentAuthoritySet` (we use `MaxEncodedLen` + // estimation). But if their number is lower, then we may "refund" some `proof_size`, + // making proof smaller and leaving block space to other useful transactions + let pre_dispatch_weight = T::WeightInfo::submit_finality_proof( + justification.commit.precommits.len().saturated_into(), + justification.votes_ancestries.len().saturated_into(), + ); + let actual_weight = pre_dispatch_weight + .set_proof_size(pre_dispatch_weight.proof_size().saturating_sub(unused_proof_size)); + + Self::deposit_event(Event::UpdatedBestFinalizedHeader { number, hash }); + + Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee }) + } + + /// Bootstrap the bridge pallet with an initial header and authority set from which to sync. + /// + /// The initial configuration provided does not need to be the genesis header of the bridged + /// chain, it can be any arbitrary header. You can also provide the next scheduled set + /// change if it is already know. + /// + /// This function is only allowed to be called from a trusted origin and writes to storage + /// with practically no checks in terms of the validity of the data. It is important that + /// you ensure that valid data is being passed in. + #[pallet::call_index(1)] + #[pallet::weight((T::DbWeight::get().reads_writes(2, 5), DispatchClass::Operational))] + pub fn initialize( + origin: OriginFor, + init_data: super::InitializationData>, + ) -> DispatchResultWithPostInfo { + Self::ensure_owner_or_root(origin)?; + + let init_allowed = !>::exists(); + ensure!(init_allowed, >::AlreadyInitialized); + initialize_bridge::(init_data.clone())?; + + log::info!( + target: LOG_TARGET, + "Pallet has been initialized with the following parameters: {:?}", + init_data + ); + + Ok(().into()) + } + + /// Change `PalletOwner`. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(2)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { + >::set_owner(origin, new_owner) + } + + /// Halt or resume all pallet operations. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(3)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + operating_mode: BasicOperatingMode, + ) -> DispatchResult { + >::set_operating_mode(origin, operating_mode) + } + } + + /// Number mandatory headers that we may accept in the current block for free (returning + /// `Pays::No`). + /// + /// If the `FreeMandatoryHeadersRemaining` hits zero, all following mandatory headers in the + /// current block are accepted with fee (`Pays::Yes` is returned). + /// + /// The `FreeMandatoryHeadersRemaining` is an ephemeral value that is set to + /// `MaxFreeMandatoryHeadersPerBlock` at each block initialization and is killed on block + /// finalization. So it never ends up in the storage trie. + #[pallet::storage] + #[pallet::whitelist_storage] + #[pallet::getter(fn free_mandatory_headers_remaining)] + pub(super) type FreeMandatoryHeadersRemaining, I: 'static = ()> = + StorageValue<_, u32, ValueQuery>; + + /// Hash of the header used to bootstrap the pallet. + #[pallet::storage] + pub(super) type InitialHash, I: 'static = ()> = + StorageValue<_, BridgedBlockHash, ValueQuery>; + + /// Hash of the best finalized header. + #[pallet::storage] + #[pallet::getter(fn best_finalized)] + pub type BestFinalized, I: 'static = ()> = + StorageValue<_, BridgedBlockId, OptionQuery>; + + /// A ring buffer of imported hashes. Ordered by the insertion time. + #[pallet::storage] + pub(super) type ImportedHashes, I: 'static = ()> = StorageMap< + Hasher = Identity, + Key = u32, + Value = BridgedBlockHash, + QueryKind = OptionQuery, + OnEmpty = GetDefault, + MaxValues = MaybeHeadersToKeep, + >; + + /// Current ring buffer position. + #[pallet::storage] + pub(super) type ImportedHashesPointer, I: 'static = ()> = + StorageValue<_, u32, ValueQuery>; + + /// Relevant fields of imported headers. + #[pallet::storage] + pub type ImportedHeaders, I: 'static = ()> = StorageMap< + Hasher = Identity, + Key = BridgedBlockHash, + Value = BridgedStoredHeaderData, + QueryKind = OptionQuery, + OnEmpty = GetDefault, + MaxValues = MaybeHeadersToKeep, + >; + + /// The current GRANDPA Authority set. + #[pallet::storage] + pub type CurrentAuthoritySet, I: 'static = ()> = + StorageValue<_, StoredAuthoritySet, ValueQuery>; + + /// Optional pallet owner. + /// + /// Pallet owner has a right to halt all pallet operations and then resume it. If it is + /// `None`, then there are no direct ways to halt/resume pallet operations, but other + /// runtime methods may still be used to do that (i.e. democracy::referendum to update halt + /// flag directly or call the `halt_operations`). + #[pallet::storage] + pub type PalletOwner, I: 'static = ()> = + StorageValue<_, T::AccountId, OptionQuery>; + + /// The current operating mode of the pallet. + /// + /// Depending on the mode either all, or no transactions will be allowed. + #[pallet::storage] + pub type PalletOperatingMode, I: 'static = ()> = + StorageValue<_, BasicOperatingMode, ValueQuery>; + + #[pallet::genesis_config] + pub struct GenesisConfig, I: 'static = ()> { + /// Optional module owner account. + pub owner: Option, + /// Optional module initialization data. + pub init_data: Option>>, + } + + #[cfg(feature = "std")] + impl, I: 'static> Default for GenesisConfig { + fn default() -> Self { + Self { owner: None, init_data: None } + } + } + + #[pallet::genesis_build] + impl, I: 'static> GenesisBuild for GenesisConfig { + fn build(&self) { + if let Some(ref owner) = self.owner { + >::put(owner); + } + + if let Some(init_data) = self.init_data.clone() { + initialize_bridge::(init_data).expect("genesis config is correct; qed"); + } else { + // Since the bridge hasn't been initialized we shouldn't allow anyone to perform + // transactions. + >::put(BasicOperatingMode::Halted); + } + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event, I: 'static = ()> { + /// Best finalized chain header has been updated to the header with given number and hash. + UpdatedBestFinalizedHeader { + number: BridgedBlockNumber, + hash: BridgedBlockHash, + }, + } + + #[pallet::error] + pub enum Error { + /// The given justification is invalid for the given header. + InvalidJustification, + /// The authority set from the underlying header chain is invalid. + InvalidAuthoritySet, + /// The header being imported is older than the best finalized header known to the pallet. + OldHeader, + /// The scheduled authority set change found in the header is unsupported by the pallet. + /// + /// This is the case for non-standard (e.g forced) authority set changes. + UnsupportedScheduledChange, + /// The pallet is not yet initialized. + NotInitialized, + /// The pallet has already been initialized. + AlreadyInitialized, + /// Too many authorities in the set. + TooManyAuthoritiesInSet, + /// Error generated by the `OwnedBridgeModule` trait. + BridgeModule(bp_runtime::OwnedBridgeModuleError), + } + + /// Check the given header for a GRANDPA scheduled authority set change. If a change + /// is found it will be enacted immediately. + /// + /// This function does not support forced changes, or scheduled changes with delays + /// since these types of changes are indicative of abnormal behavior from GRANDPA. + /// + /// Returned value will indicate if a change was enacted or not. + pub(crate) fn try_enact_authority_change, I: 'static>( + header: &BridgedHeader, + current_set_id: sp_consensus_grandpa::SetId, + ) -> Result { + let mut change_enacted = false; + + // We don't support forced changes - at that point governance intervention is required. + ensure!( + super::find_forced_change(header).is_none(), + >::UnsupportedScheduledChange + ); + + if let Some(change) = super::find_scheduled_change(header) { + // GRANDPA only includes a `delay` for forced changes, so this isn't valid. + ensure!(change.delay == Zero::zero(), >::UnsupportedScheduledChange); + + // TODO [#788]: Stop manually increasing the `set_id` here. + let next_authorities = StoredAuthoritySet:: { + authorities: change + .next_authorities + .try_into() + .map_err(|_| Error::::TooManyAuthoritiesInSet)?, + set_id: current_set_id + 1, + }; + + // Since our header schedules a change and we know the delay is 0, it must also enact + // the change. + >::put(&next_authorities); + change_enacted = true; + + log::info!( + target: LOG_TARGET, + "Transitioned from authority set {} to {}! New authorities are: {:?}", + current_set_id, + current_set_id + 1, + next_authorities, + ); + }; + + Ok(change_enacted) + } + + /// Verify a GRANDPA justification (finality proof) for a given header. + /// + /// Will use the GRANDPA current authorities known to the pallet. + /// + /// If successful it returns the decoded GRANDPA justification so we can refund any weight which + /// was overcharged in the initial call. + pub(crate) fn verify_justification, I: 'static>( + justification: &GrandpaJustification>, + hash: BridgedBlockHash, + number: BridgedBlockNumber, + authority_set: bp_header_chain::AuthoritySet, + ) -> Result<(), sp_runtime::DispatchError> { + use bp_header_chain::justification::verify_justification; + + let voter_set = + VoterSet::new(authority_set.authorities).ok_or(>::InvalidAuthoritySet)?; + let set_id = authority_set.set_id; + + Ok(verify_justification::>( + (hash, number), + set_id, + &voter_set, + justification, + ) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "Received invalid justification for {:?}: {:?}", + hash, + e, + ); + >::InvalidJustification + })?) + } + + /// Import a previously verified header to the storage. + /// + /// Note this function solely takes care of updating the storage and pruning old entries, + /// but does not verify the validity of such import. + pub(crate) fn insert_header, I: 'static>( + header: BridgedHeader, + hash: BridgedBlockHash, + ) { + let index = >::get(); + let pruning = >::try_get(index); + >::put(HeaderId(*header.number(), hash)); + >::insert(hash, header.build()); + >::insert(index, hash); + + // Update ring buffer pointer and remove old header. + >::put((index + 1) % T::HeadersToKeep::get()); + if let Ok(hash) = pruning { + log::debug!(target: LOG_TARGET, "Pruning old header: {:?}.", hash); + >::remove(hash); + } + } + + /// Since this writes to storage with no real checks this should only be used in functions that + /// were called by a trusted origin. + pub(crate) fn initialize_bridge, I: 'static>( + init_params: super::InitializationData>, + ) -> Result<(), Error> { + let super::InitializationData { header, authority_list, set_id, operating_mode } = + init_params; + let authority_set_length = authority_list.len(); + let authority_set = StoredAuthoritySet::::try_new(authority_list, set_id) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "Failed to initialize bridge. Number of authorities in the set {} is larger than the configured value {}", + authority_set_length, + T::BridgedChain::MAX_AUTHORITIES_COUNT, + ); + + e + })?; + let initial_hash = header.hash(); + + >::put(initial_hash); + >::put(0); + insert_header::(*header, initial_hash); + + >::put(authority_set); + + >::put(operating_mode); + + Ok(()) + } + + /// Adapter for using `Config::HeadersToKeep` as `MaxValues` bound in our storage maps. + pub struct MaybeHeadersToKeep(PhantomData<(T, I)>); + + // this implementation is required to use the struct as `MaxValues` + impl, I: 'static> Get> for MaybeHeadersToKeep { + fn get() -> Option { + Some(T::HeadersToKeep::get()) + } + } + + /// Initialize pallet so that it is ready for inserting new header. + /// + /// The function makes sure that the new insertion will cause the pruning of some old header. + /// + /// Returns parent header for the new header. + #[cfg(feature = "runtime-benchmarks")] + pub(crate) fn bootstrap_bridge, I: 'static>( + init_params: super::InitializationData>, + ) -> BridgedHeader { + let start_header = init_params.header.clone(); + initialize_bridge::(init_params).expect("benchmarks are correct"); + + // the most obvious way to cause pruning during next insertion would be to insert + // `HeadersToKeep` headers. But it'll make our benchmarks slow. So we will just play with + // our pruning ring-buffer. + assert_eq!(ImportedHashesPointer::::get(), 1); + ImportedHashesPointer::::put(0); + + *start_header + } +} + +impl, I: 'static> Pallet { + /// Get the best finalized block number. + pub fn best_finalized_number() -> Option> { + BestFinalized::::get().map(|id| id.number()) + } +} + +/// Bridge GRANDPA pallet as header chain. +pub type GrandpaChainHeaders = Pallet; + +impl, I: 'static> HeaderChain> for GrandpaChainHeaders { + fn finalized_header_state_root( + header_hash: HashOf>, + ) -> Option>> { + ImportedHeaders::::get(header_hash).map(|h| h.state_root) + } +} + +pub(crate) fn find_scheduled_change( + header: &H, +) -> Option> { + use sp_runtime::generic::OpaqueDigestItemId; + + let id = OpaqueDigestItemId::Consensus(&GRANDPA_ENGINE_ID); + + let filter_log = |log: ConsensusLog| match log { + ConsensusLog::ScheduledChange(change) => Some(change), + _ => None, + }; + + // find the first consensus digest with the right ID which converts to + // the right kind of consensus log. + header.digest().convert_first(|l| l.try_to(id).and_then(filter_log)) +} + +/// Checks the given header for a consensus digest signaling a **forced** scheduled change and +/// extracts it. +pub(crate) fn find_forced_change( + header: &H, +) -> Option<(H::Number, sp_consensus_grandpa::ScheduledChange)> { + use sp_runtime::generic::OpaqueDigestItemId; + + let id = OpaqueDigestItemId::Consensus(&GRANDPA_ENGINE_ID); + + let filter_log = |log: ConsensusLog| match log { + ConsensusLog::ForcedChange(delay, change) => Some((delay, change)), + _ => None, + }; + + // find the first consensus digest with the right ID which converts to + // the right kind of consensus log. + header.digest().convert_first(|l| l.try_to(id).and_then(filter_log)) +} + +/// (Re)initialize bridge with given header for using it in `pallet-bridge-messages` benchmarks. +#[cfg(feature = "runtime-benchmarks")] +pub fn initialize_for_benchmarks, I: 'static>(header: BridgedHeader) { + initialize_bridge::(InitializationData { + header: Box::new(header), + authority_list: sp_std::vec::Vec::new(), /* we don't verify any proofs in external + * benchmarks */ + set_id: 0, + operating_mode: bp_runtime::BasicOperatingMode::Normal, + }) + .expect("only used from benchmarks; benchmarks are correct; qed"); +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::{ + run_test, test_header, RuntimeEvent as TestEvent, RuntimeOrigin, System, TestBridgedChain, + TestHeader, TestNumber, TestRuntime, MAX_BRIDGED_AUTHORITIES, + }; + use bp_header_chain::BridgeGrandpaCall; + use bp_runtime::BasicOperatingMode; + use bp_test_utils::{ + authority_list, generate_owned_bridge_module_tests, make_default_justification, + make_justification_for_header, JustificationGeneratorParams, ALICE, BOB, + }; + use codec::Encode; + use frame_support::{ + assert_err, assert_noop, assert_ok, + dispatch::{Pays, PostDispatchInfo}, + storage::generator::StorageValue, + }; + use frame_system::{EventRecord, Phase}; + use sp_core::Get; + use sp_runtime::{Digest, DigestItem, DispatchError}; + + fn initialize_substrate_bridge() { + System::set_block_number(1); + System::reset_events(); + + assert_ok!(init_with_origin(RuntimeOrigin::root())); + } + + fn init_with_origin( + origin: RuntimeOrigin, + ) -> Result< + InitializationData, + sp_runtime::DispatchErrorWithPostInfo, + > { + let genesis = test_header(0); + + let init_data = InitializationData { + header: Box::new(genesis), + authority_list: authority_list(), + set_id: 1, + operating_mode: BasicOperatingMode::Normal, + }; + + Pallet::::initialize(origin, init_data.clone()).map(|_| init_data) + } + + fn submit_finality_proof(header: u8) -> frame_support::dispatch::DispatchResultWithPostInfo { + let header = test_header(header.into()); + let justification = make_default_justification(&header); + + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ) + } + + fn submit_finality_proof_with_set_id( + header: u8, + set_id: u64, + ) -> frame_support::dispatch::DispatchResultWithPostInfo { + let header = test_header(header.into()); + let justification = make_justification_for_header(JustificationGeneratorParams { + header: header.clone(), + set_id, + ..Default::default() + }); + + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ) + } + + fn submit_mandatory_finality_proof( + number: u8, + set_id: u64, + ) -> frame_support::dispatch::DispatchResultWithPostInfo { + let mut header = test_header(number.into()); + // to ease tests that are using `submit_mandatory_finality_proof`, we'll be using the + // same set for all sessions + let consensus_log = + ConsensusLog::::ScheduledChange(sp_consensus_grandpa::ScheduledChange { + next_authorities: authority_list(), + delay: 0, + }); + header.digest = + Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] }; + let justification = make_justification_for_header(JustificationGeneratorParams { + header: header.clone(), + set_id, + ..Default::default() + }); + + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ) + } + + fn next_block() { + use frame_support::traits::OnInitialize; + + let current_number = frame_system::Pallet::::block_number(); + frame_system::Pallet::::set_block_number(current_number + 1); + let _ = Pallet::::on_initialize(current_number); + } + + fn change_log(delay: u64) -> Digest { + let consensus_log = + ConsensusLog::::ScheduledChange(sp_consensus_grandpa::ScheduledChange { + next_authorities: vec![(ALICE.into(), 1), (BOB.into(), 1)], + delay, + }); + + Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] } + } + + fn forced_change_log(delay: u64) -> Digest { + let consensus_log = ConsensusLog::::ForcedChange( + delay, + sp_consensus_grandpa::ScheduledChange { + next_authorities: vec![(ALICE.into(), 1), (BOB.into(), 1)], + delay, + }, + ); + + Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] } + } + + fn many_authorities_log() -> Digest { + let consensus_log = + ConsensusLog::::ScheduledChange(sp_consensus_grandpa::ScheduledChange { + next_authorities: std::iter::repeat((ALICE.into(), 1)) + .take(MAX_BRIDGED_AUTHORITIES as usize + 1) + .collect(), + delay: 0, + }); + + Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] } + } + + #[test] + fn init_root_or_owner_origin_can_initialize_pallet() { + run_test(|| { + assert_noop!(init_with_origin(RuntimeOrigin::signed(1)), DispatchError::BadOrigin); + assert_ok!(init_with_origin(RuntimeOrigin::root())); + + // Reset storage so we can initialize the pallet again + BestFinalized::::kill(); + PalletOwner::::put(2); + assert_ok!(init_with_origin(RuntimeOrigin::signed(2))); + }) + } + + #[test] + fn init_storage_entries_are_correctly_initialized() { + run_test(|| { + assert_eq!(BestFinalized::::get(), None,); + assert_eq!(Pallet::::best_finalized(), None); + assert_eq!(PalletOperatingMode::::try_get(), Err(())); + + let init_data = init_with_origin(RuntimeOrigin::root()).unwrap(); + + assert!(>::contains_key(init_data.header.hash())); + assert_eq!(BestFinalized::::get().unwrap().1, init_data.header.hash()); + assert_eq!( + CurrentAuthoritySet::::get().authorities, + init_data.authority_list + ); + assert_eq!( + PalletOperatingMode::::try_get(), + Ok(BasicOperatingMode::Normal) + ); + }) + } + + #[test] + fn init_can_only_initialize_pallet_once() { + run_test(|| { + initialize_substrate_bridge(); + assert_noop!( + init_with_origin(RuntimeOrigin::root()), + >::AlreadyInitialized + ); + }) + } + + #[test] + fn init_fails_if_there_are_too_many_authorities_in_the_set() { + run_test(|| { + let genesis = test_header(0); + let init_data = InitializationData { + header: Box::new(genesis), + authority_list: std::iter::repeat(authority_list().remove(0)) + .take(MAX_BRIDGED_AUTHORITIES as usize + 1) + .collect(), + set_id: 1, + operating_mode: BasicOperatingMode::Normal, + }; + + assert_noop!( + Pallet::::initialize(RuntimeOrigin::root(), init_data), + Error::::TooManyAuthoritiesInSet, + ); + }); + } + + #[test] + fn pallet_rejects_transactions_if_halted() { + run_test(|| { + initialize_substrate_bridge(); + + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::root(), + BasicOperatingMode::Halted + )); + assert_noop!( + submit_finality_proof(1), + Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted) + ); + + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::root(), + BasicOperatingMode::Normal + )); + assert_ok!(submit_finality_proof(1)); + }) + } + + #[test] + fn pallet_rejects_header_if_not_initialized_yet() { + run_test(|| { + assert_noop!(submit_finality_proof(1), Error::::NotInitialized); + }); + } + + #[test] + fn succesfully_imports_header_with_valid_finality() { + run_test(|| { + initialize_substrate_bridge(); + + let header_number = 1; + let header = test_header(header_number.into()); + let justification = make_default_justification(&header); + + let pre_dispatch_weight = ::WeightInfo::submit_finality_proof( + justification.commit.precommits.len().try_into().unwrap_or(u32::MAX), + justification.votes_ancestries.len().try_into().unwrap_or(u32::MAX), + ); + + let result = submit_finality_proof(header_number); + assert_ok!(result); + assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); + // our test config assumes 2048 max authorities and we are just using couple + let pre_dispatch_proof_size = pre_dispatch_weight.proof_size(); + let actual_proof_size = result.unwrap().actual_weight.unwrap().proof_size(); + assert!(actual_proof_size > 0); + assert!( + actual_proof_size < pre_dispatch_proof_size, + "Actual proof size {actual_proof_size} must be less than the pre-dispatch {pre_dispatch_proof_size}", + ); + + let header = test_header(1); + assert_eq!(>::get().unwrap().1, header.hash()); + assert!(>::contains_key(header.hash())); + + assert_eq!( + System::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Grandpa(Event::UpdatedBestFinalizedHeader { + number: *header.number(), + hash: header.hash(), + }), + topics: vec![], + }], + ); + }) + } + + #[test] + fn rejects_justification_that_skips_authority_set_transition() { + run_test(|| { + initialize_substrate_bridge(); + + let header = test_header(1); + + let params = + JustificationGeneratorParams:: { set_id: 2, ..Default::default() }; + let justification = make_justification_for_header(params); + + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ), + >::InvalidJustification + ); + }) + } + + #[test] + fn does_not_import_header_with_invalid_finality_proof() { + run_test(|| { + initialize_substrate_bridge(); + + let header = test_header(1); + let mut justification = make_default_justification(&header); + justification.round = 42; + + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ), + >::InvalidJustification + ); + }) + } + + #[test] + fn disallows_invalid_authority_set() { + run_test(|| { + let genesis = test_header(0); + + let invalid_authority_list = vec![(ALICE.into(), u64::MAX), (BOB.into(), u64::MAX)]; + let init_data = InitializationData { + header: Box::new(genesis), + authority_list: invalid_authority_list, + set_id: 1, + operating_mode: BasicOperatingMode::Normal, + }; + + assert_ok!(Pallet::::initialize(RuntimeOrigin::root(), init_data)); + + let header = test_header(1); + let justification = make_default_justification(&header); + + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ), + >::InvalidAuthoritySet + ); + }) + } + + #[test] + fn importing_header_ensures_that_chain_is_extended() { + run_test(|| { + initialize_substrate_bridge(); + + assert_ok!(submit_finality_proof(4)); + assert_err!(submit_finality_proof(3), Error::::OldHeader); + assert_ok!(submit_finality_proof(5)); + }) + } + + #[test] + fn importing_header_enacts_new_authority_set() { + run_test(|| { + initialize_substrate_bridge(); + + let next_set_id = 2; + let next_authorities = vec![(ALICE.into(), 1), (BOB.into(), 1)]; + + // Need to update the header digest to indicate that our header signals an authority set + // change. The change will be enacted when we import our header. + let mut header = test_header(2); + header.digest = change_log(0); + + // Create a valid justification for the header + let justification = make_default_justification(&header); + + // Let's import our test header + let result = Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header.clone()), + justification, + ); + assert_ok!(result); + assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::No); + + // Make sure that our header is the best finalized + assert_eq!(>::get().unwrap().1, header.hash()); + assert!(>::contains_key(header.hash())); + + // Make sure that the authority set actually changed upon importing our header + assert_eq!( + >::get(), + StoredAuthoritySet::::try_new(next_authorities, next_set_id) + .unwrap(), + ); + }) + } + + #[test] + fn relayer_pays_tx_fee_when_submitting_huge_mandatory_header() { + run_test(|| { + initialize_substrate_bridge(); + + // let's prepare a huge authorities change header, which is definitely above size limits + let mut header = test_header(2); + header.digest = change_log(0); + header.digest.push(DigestItem::Other(vec![42u8; 1024 * 1024])); + let justification = make_default_justification(&header); + + // without large digest item ^^^ the relayer would have paid zero transaction fee + // (`Pays::No`) + let result = Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header.clone()), + justification, + ); + assert_ok!(result); + assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); + + // Make sure that our header is the best finalized + assert_eq!(>::get().unwrap().1, header.hash()); + assert!(>::contains_key(header.hash())); + }) + } + + #[test] + fn relayer_pays_tx_fee_when_submitting_justification_with_long_ancestry_votes() { + run_test(|| { + initialize_substrate_bridge(); + + // let's prepare a huge authorities change header, which is definitely above weight + // limits + let mut header = test_header(2); + header.digest = change_log(0); + let justification = make_justification_for_header(JustificationGeneratorParams { + header: header.clone(), + ancestors: TestBridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY + 1, + ..Default::default() + }); + + // without many headers in votes ancestries ^^^ the relayer would have paid zero + // transaction fee (`Pays::No`) + let result = Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header.clone()), + justification, + ); + assert_ok!(result); + assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); + + // Make sure that our header is the best finalized + assert_eq!(>::get().unwrap().1, header.hash()); + assert!(>::contains_key(header.hash())); + }) + } + + #[test] + fn importing_header_rejects_header_with_scheduled_change_delay() { + run_test(|| { + initialize_substrate_bridge(); + + // Need to update the header digest to indicate that our header signals an authority set + // change. However, the change doesn't happen until the next block. + let mut header = test_header(2); + header.digest = change_log(1); + + // Create a valid justification for the header + let justification = make_default_justification(&header); + + // Should not be allowed to import this header + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification + ), + >::UnsupportedScheduledChange + ); + }) + } + + #[test] + fn importing_header_rejects_header_with_forced_changes() { + run_test(|| { + initialize_substrate_bridge(); + + // Need to update the header digest to indicate that it signals a forced authority set + // change. + let mut header = test_header(2); + header.digest = forced_change_log(0); + + // Create a valid justification for the header + let justification = make_default_justification(&header); + + // Should not be allowed to import this header + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification + ), + >::UnsupportedScheduledChange + ); + }) + } + + #[test] + fn importing_header_rejects_header_with_too_many_authorities() { + run_test(|| { + initialize_substrate_bridge(); + + // Need to update the header digest to indicate that our header signals an authority set + // change. However, the change doesn't happen until the next block. + let mut header = test_header(2); + header.digest = many_authorities_log(); + + // Create a valid justification for the header + let justification = make_default_justification(&header); + + // Should not be allowed to import this header + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification + ), + >::TooManyAuthoritiesInSet + ); + }); + } + + #[test] + fn parse_finalized_storage_proof_rejects_proof_on_unknown_header() { + run_test(|| { + assert_noop!( + Pallet::::parse_finalized_storage_proof( + Default::default(), + vec![], + |_| (), + ), + bp_header_chain::HeaderChainError::UnknownHeader, + ); + }); + } + + #[test] + fn parse_finalized_storage_accepts_valid_proof() { + run_test(|| { + let (state_root, storage_proof) = bp_runtime::craft_valid_storage_proof(); + + let mut header = test_header(2); + header.set_state_root(state_root); + + let hash = header.hash(); + >::put(HeaderId(2, hash)); + >::insert(hash, header.build()); + + assert_ok!( + Pallet::::parse_finalized_storage_proof(hash, storage_proof, |_| (),), + (), + ); + }); + } + + #[test] + fn rate_limiter_disallows_free_imports_once_limit_is_hit_in_single_block() { + run_test(|| { + initialize_substrate_bridge(); + + let result = submit_mandatory_finality_proof(1, 1); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(2, 2); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(3, 3); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + }) + } + + #[test] + fn rate_limiter_invalid_requests_do_not_count_towards_request_count() { + run_test(|| { + let submit_invalid_request = || { + let mut header = test_header(1); + header.digest = change_log(0); + let mut invalid_justification = make_default_justification(&header); + invalid_justification.round = 42; + + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + invalid_justification, + ) + }; + + initialize_substrate_bridge(); + + for _ in 0..::MaxFreeMandatoryHeadersPerBlock::get() + 1 { + assert_err!(submit_invalid_request(), >::InvalidJustification); + } + + // Can still submit free mandatory headers afterwards + let result = submit_mandatory_finality_proof(1, 1); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(2, 2); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(3, 3); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + }) + } + + #[test] + fn rate_limiter_allows_request_after_new_block_has_started() { + run_test(|| { + initialize_substrate_bridge(); + + let result = submit_mandatory_finality_proof(1, 1); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(2, 2); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(3, 3); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + + next_block(); + + let result = submit_mandatory_finality_proof(4, 4); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(5, 5); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(6, 6); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + }) + } + + #[test] + fn rate_limiter_ignores_non_mandatory_headers() { + run_test(|| { + initialize_substrate_bridge(); + + let result = submit_finality_proof(1); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + + let result = submit_mandatory_finality_proof(2, 1); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_finality_proof_with_set_id(3, 2); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + + let result = submit_mandatory_finality_proof(4, 2); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_finality_proof_with_set_id(5, 3); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + + let result = submit_mandatory_finality_proof(6, 3); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + }) + } + + #[test] + fn should_prune_headers_over_headers_to_keep_parameter() { + run_test(|| { + initialize_substrate_bridge(); + assert_ok!(submit_finality_proof(1)); + let first_header_hash = Pallet::::best_finalized().unwrap().hash(); + next_block(); + + assert_ok!(submit_finality_proof(2)); + next_block(); + assert_ok!(submit_finality_proof(3)); + next_block(); + assert_ok!(submit_finality_proof(4)); + next_block(); + assert_ok!(submit_finality_proof(5)); + next_block(); + + assert_ok!(submit_finality_proof(6)); + + assert!( + !ImportedHeaders::::contains_key(first_header_hash), + "First header should be pruned.", + ); + }) + } + + #[test] + fn storage_keys_computed_properly() { + assert_eq!( + PalletOperatingMode::::storage_value_final_key().to_vec(), + bp_header_chain::storage_keys::pallet_operating_mode_key("Grandpa").0, + ); + + assert_eq!( + CurrentAuthoritySet::::storage_value_final_key().to_vec(), + bp_header_chain::storage_keys::current_authority_set_key("Grandpa").0, + ); + + assert_eq!( + BestFinalized::::storage_value_final_key().to_vec(), + bp_header_chain::storage_keys::best_finalized_key("Grandpa").0, + ); + } + + #[test] + fn test_bridge_grandpa_call_is_correctly_defined() { + let header = test_header(0); + let init_data = InitializationData { + header: Box::new(header.clone()), + authority_list: authority_list(), + set_id: 1, + operating_mode: BasicOperatingMode::Normal, + }; + let justification = make_default_justification(&header); + + let direct_initialize_call = + Call::::initialize { init_data: init_data.clone() }; + let indirect_initialize_call = BridgeGrandpaCall::::initialize { init_data }; + assert_eq!(direct_initialize_call.encode(), indirect_initialize_call.encode()); + + let direct_submit_finality_proof_call = Call::::submit_finality_proof { + finality_target: Box::new(header.clone()), + justification: justification.clone(), + }; + let indirect_submit_finality_proof_call = + BridgeGrandpaCall::::submit_finality_proof { + finality_target: Box::new(header), + justification, + }; + assert_eq!( + direct_submit_finality_proof_call.encode(), + indirect_submit_finality_proof_call.encode() + ); + } + + generate_owned_bridge_module_tests!(BasicOperatingMode::Normal, BasicOperatingMode::Halted); + + #[test] + fn maybe_headers_to_keep_returns_correct_value() { + assert_eq!(MaybeHeadersToKeep::::get(), Some(mock::HeadersToKeep::get())); + } +} diff --git a/bridges/modules/grandpa/src/mock.rs b/bridges/modules/grandpa/src/mock.rs new file mode 100644 index 00000000000..0ebbc0bccbb --- /dev/null +++ b/bridges/modules/grandpa/src/mock.rs @@ -0,0 +1,151 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +// From construct_runtime macro +#![allow(clippy::from_over_into)] + +use bp_header_chain::ChainWithGrandpa; +use bp_runtime::Chain; +use frame_support::{ + construct_runtime, parameter_types, + traits::{ConstU32, ConstU64, Hooks}, + weights::Weight, +}; +use sp_core::sr25519::Signature; +use sp_runtime::{ + testing::{Header, H256}, + traits::{BlakeTwo256, IdentityLookup}, + Perbill, +}; + +pub type AccountId = u64; +pub type TestHeader = crate::BridgedHeader; +pub type TestNumber = crate::BridgedBlockNumber; + +type Block = frame_system::mocking::MockBlock; +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; + +pub const MAX_BRIDGED_AUTHORITIES: u32 = 5; + +use crate as grandpa; + +construct_runtime! { + pub enum TestRuntime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Grandpa: grandpa::{Pallet, Call, Event}, + } +} + +parameter_types! { + pub const MaximumBlockWeight: Weight = Weight::from_parts(1024, 0); + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); +} + +impl frame_system::Config for TestRuntime { + type RuntimeOrigin = RuntimeOrigin; + type Index = u64; + type RuntimeCall = RuntimeCall; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU64<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = (); + type OnNewAccount = (); + type OnKilledAccount = (); + type BaseCallFilter = frame_support::traits::Everything; + type SystemWeightInfo = (); + type DbWeight = (); + type BlockWeights = (); + type BlockLength = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +parameter_types! { + pub const MaxFreeMandatoryHeadersPerBlock: u32 = 2; + pub const HeadersToKeep: u32 = 5; + pub const SessionLength: u64 = 5; + pub const NumValidators: u32 = 5; +} + +impl grandpa::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = TestBridgedChain; + type MaxFreeMandatoryHeadersPerBlock = MaxFreeMandatoryHeadersPerBlock; + type HeadersToKeep = HeadersToKeep; + type WeightInfo = (); +} + +#[derive(Debug)] +pub struct TestBridgedChain; + +impl Chain for TestBridgedChain { + type BlockNumber = ::BlockNumber; + type Hash = ::Hash; + type Hasher = ::Hashing; + type Header = ::Header; + + type AccountId = AccountId; + type Balance = u64; + type Index = u64; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + unreachable!() + } + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl ChainWithGrandpa for TestBridgedChain { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; + const MAX_AUTHORITIES_COUNT: u32 = MAX_BRIDGED_AUTHORITIES; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const MAX_HEADER_SIZE: u32 = 256; + const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = 64; +} + +/// Return test externalities to use in tests. +pub fn new_test_ext() -> sp_io::TestExternalities { + sp_io::TestExternalities::new(Default::default()) +} + +/// Return test within default test externalities context. +pub fn run_test(test: impl FnOnce() -> T) -> T { + new_test_ext().execute_with(|| { + let _ = Grandpa::on_initialize(0); + test() + }) +} + +/// Return test header with given number. +pub fn test_header(num: TestNumber) -> TestHeader { + // We wrap the call to avoid explicit type annotations in our tests + bp_test_utils::test_header(num) +} diff --git a/bridges/modules/grandpa/src/storage_types.rs b/bridges/modules/grandpa/src/storage_types.rs new file mode 100644 index 00000000000..70448286335 --- /dev/null +++ b/bridges/modules/grandpa/src/storage_types.rs @@ -0,0 +1,136 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Wrappers for public types that are implementing `MaxEncodedLen` + +use crate::{Config, Error}; + +use bp_header_chain::{AuthoritySet, ChainWithGrandpa}; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::{traits::Get, BoundedVec, RuntimeDebugNoBound}; +use scale_info::TypeInfo; +use sp_consensus_grandpa::{AuthorityId, AuthorityList, AuthorityWeight, SetId}; +use sp_std::marker::PhantomData; + +/// A bounded list of Grandpa authorities with associated weights. +pub type StoredAuthorityList = + BoundedVec<(AuthorityId, AuthorityWeight), MaxBridgedAuthorities>; + +/// Adapter for using `T::BridgedChain::MAX_BRIDGED_AUTHORITIES` in `BoundedVec`. +pub struct StoredAuthorityListLimit(PhantomData<(T, I)>); + +impl, I: 'static> Get for StoredAuthorityListLimit { + fn get() -> u32 { + T::BridgedChain::MAX_AUTHORITIES_COUNT + } +} + +/// A bounded GRANDPA Authority List and ID. +#[derive(Clone, Decode, Encode, Eq, TypeInfo, MaxEncodedLen, RuntimeDebugNoBound)] +#[scale_info(skip_type_params(T, I))] +pub struct StoredAuthoritySet, I: 'static> { + /// List of GRANDPA authorities for the current round. + pub authorities: StoredAuthorityList>, + /// Monotonic identifier of the current GRANDPA authority set. + pub set_id: SetId, +} + +impl, I: 'static> StoredAuthoritySet { + /// Try to create a new bounded GRANDPA Authority Set from unbounded list. + /// + /// Returns error if number of authorities in the provided list is too large. + pub fn try_new(authorities: AuthorityList, set_id: SetId) -> Result> { + Ok(Self { + authorities: TryFrom::try_from(authorities) + .map_err(|_| Error::TooManyAuthoritiesInSet)?, + set_id, + }) + } + + /// Returns number of bytes that may be subtracted from the PoV component of + /// `submit_finality_proof` call, because the actual authorities set is smaller than the maximal + /// configured. + /// + /// Maximal authorities set size is configured by the `MaxBridgedAuthorities` constant from + /// the pallet configuration. The PoV of the call includes the size of maximal authorities + /// count. If the actual size is smaller, we may subtract extra bytes from this component. + pub fn unused_proof_size(&self) -> u64 { + // we can only safely estimate bytes that are occupied by the authority data itself. We have + // no means here to compute PoV bytes, occupied by extra trie nodes or extra bytes in the + // whole set encoding + let single_authority_max_encoded_len = + <(AuthorityId, AuthorityWeight)>::max_encoded_len() as u64; + let extra_authorities = + T::BridgedChain::MAX_AUTHORITIES_COUNT.saturating_sub(self.authorities.len() as _); + single_authority_max_encoded_len.saturating_mul(extra_authorities as u64) + } +} + +impl, I: 'static> PartialEq for StoredAuthoritySet { + fn eq(&self, other: &Self) -> bool { + self.set_id == other.set_id && self.authorities == other.authorities + } +} + +impl, I: 'static> Default for StoredAuthoritySet { + fn default() -> Self { + StoredAuthoritySet { authorities: BoundedVec::default(), set_id: 0 } + } +} + +impl, I: 'static> From> for AuthoritySet { + fn from(t: StoredAuthoritySet) -> Self { + AuthoritySet { authorities: t.authorities.into(), set_id: t.set_id } + } +} + +#[cfg(test)] +mod tests { + use crate::mock::{TestRuntime, MAX_BRIDGED_AUTHORITIES}; + use bp_test_utils::authority_list; + + type StoredAuthoritySet = super::StoredAuthoritySet; + + #[test] + fn unused_proof_size_works() { + let authority_entry = authority_list().pop().unwrap(); + + // when we have exactly `MaxBridgedAuthorities` authorities + assert_eq!( + StoredAuthoritySet::try_new( + vec![authority_entry.clone(); MAX_BRIDGED_AUTHORITIES as usize], + 0, + ) + .unwrap() + .unused_proof_size(), + 0, + ); + + // when we have less than `MaxBridgedAuthorities` authorities + assert_eq!( + StoredAuthoritySet::try_new( + vec![authority_entry; MAX_BRIDGED_AUTHORITIES as usize - 1], + 0, + ) + .unwrap() + .unused_proof_size(), + 40, + ); + + // and we can't have more than `MaxBridgedAuthorities` authorities in the bounded vec, so + // no test for this case + } +} diff --git a/bridges/modules/grandpa/src/weights.rs b/bridges/modules/grandpa/src/weights.rs new file mode 100644 index 00000000000..4b94f7adfe7 --- /dev/null +++ b/bridges/modules/grandpa/src/weights.rs @@ -0,0 +1,167 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Autogenerated weights for pallet_bridge_grandpa +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-03-02, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/millau-bridge-node +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_bridge_grandpa +// --extrinsic=* +// --execution=wasm +// --wasm-execution=Compiled +// --heap-pages=4096 +// --output=./modules/grandpa/src/weights.rs +// --template=./.maintain/bridge-weight-template.hbs + +#![allow(clippy::all)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{ + traits::Get, + weights::{constants::RocksDbWeight, Weight}, +}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_bridge_grandpa. +pub trait WeightInfo { + fn submit_finality_proof(p: u32, v: u32) -> Weight; +} + +/// Weights for `pallet_bridge_grandpa` that are generated using one of the Bridge testnets. +/// +/// Those weights are test only and must never be used in production. +pub struct BridgeWeight(PhantomData); +impl WeightInfo for BridgeWeight { + /// Storage: BridgeRialtoGrandpa PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa RequestCount (r:1 w:1) + /// + /// Proof: BridgeRialtoGrandpa RequestCount (max_values: Some(1), max_size: Some(4), added: 499, + /// mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa BestFinalized (r:1 w:1) + /// + /// Proof: BridgeRialtoGrandpa BestFinalized (max_values: Some(1), max_size: Some(36), added: + /// 531, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa CurrentAuthoritySet (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa CurrentAuthoritySet (max_values: Some(1), max_size: Some(209), + /// added: 704, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHashesPointer (r:1 w:1) + /// + /// Proof: BridgeRialtoGrandpa ImportedHashesPointer (max_values: Some(1), max_size: Some(4), + /// added: 499, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHashes (r:1 w:1) + /// + /// Proof: BridgeRialtoGrandpa ImportedHashes (max_values: Some(14400), max_size: Some(36), + /// added: 2016, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:0 w:2) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// The range of component `p` is `[1, 4]`. + /// + /// The range of component `v` is `[50, 100]`. + fn submit_finality_proof(p: u32, v: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `394 + p * (60 ±0)` + // Estimated: `4745` + // Minimum execution time: 228_072 nanoseconds. + Weight::from_parts(57_853_228, 4745) + // Standard Error: 149_421 + .saturating_add(Weight::from_parts(36_708_702, 0).saturating_mul(p.into())) + // Standard Error: 10_625 + .saturating_add(Weight::from_parts(1_469_032, 0).saturating_mul(v.into())) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + /// Storage: BridgeRialtoGrandpa PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa RequestCount (r:1 w:1) + /// + /// Proof: BridgeRialtoGrandpa RequestCount (max_values: Some(1), max_size: Some(4), added: 499, + /// mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa BestFinalized (r:1 w:1) + /// + /// Proof: BridgeRialtoGrandpa BestFinalized (max_values: Some(1), max_size: Some(36), added: + /// 531, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa CurrentAuthoritySet (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa CurrentAuthoritySet (max_values: Some(1), max_size: Some(209), + /// added: 704, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHashesPointer (r:1 w:1) + /// + /// Proof: BridgeRialtoGrandpa ImportedHashesPointer (max_values: Some(1), max_size: Some(4), + /// added: 499, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHashes (r:1 w:1) + /// + /// Proof: BridgeRialtoGrandpa ImportedHashes (max_values: Some(14400), max_size: Some(36), + /// added: 2016, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:0 w:2) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// The range of component `p` is `[1, 4]`. + /// + /// The range of component `v` is `[50, 100]`. + fn submit_finality_proof(p: u32, v: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `394 + p * (60 ±0)` + // Estimated: `4745` + // Minimum execution time: 228_072 nanoseconds. + Weight::from_parts(57_853_228, 4745) + // Standard Error: 149_421 + .saturating_add(Weight::from_parts(36_708_702, 0).saturating_mul(p.into())) + // Standard Error: 10_625 + .saturating_add(Weight::from_parts(1_469_032, 0).saturating_mul(v.into())) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) + } +} diff --git a/bridges/modules/messages/Cargo.toml b/bridges/modules/messages/Cargo.toml new file mode 100644 index 00000000000..639ac9dc23c --- /dev/null +++ b/bridges/modules/messages/Cargo.toml @@ -0,0 +1,56 @@ +[package] +name = "pallet-bridge-messages" +description = "Module that allows bridged chains to exchange messages using lane concept." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +log = { version = "0.4.17", default-features = false } +num-traits = { version = "0.2", default-features = false } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } + +# Bridge dependencies + +bp-messages = { path = "../../primitives/messages", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } + +# Substrate Dependencies + +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[dev-dependencies] +bp-test-utils = { path = "../../primitives/test-utils" } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-messages/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "frame-system/std", + "frame-benchmarking/std", + "log/std", + "num-traits/std", + "scale-info/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", +] diff --git a/bridges/modules/messages/README.md b/bridges/modules/messages/README.md new file mode 100644 index 00000000000..b717db6ad62 --- /dev/null +++ b/bridges/modules/messages/README.md @@ -0,0 +1,242 @@ +# Bridge Messages Pallet + +The messages pallet is used to deliver messages from source chain to target chain. Message is +(almost) opaque to the module and the final goal is to hand message to the message dispatch +mechanism. + +## Contents + +- [Overview](#overview) +- [Message Workflow](#message-workflow) +- [Integrating Message Lane Module into Runtime](#integrating-messages-module-into-runtime) +- [Non-Essential Functionality](#non-essential-functionality) +- [Weights of Module Extrinsics](#weights-of-module-extrinsics) + +## Overview + +Message lane is an unidirectional channel, where messages are sent from source chain to the target +chain. At the same time, a single instance of messages module supports both outbound lanes and +inbound lanes. So the chain where the module is deployed (this chain), may act as a source chain for +outbound messages (heading to a bridged chain) and as a target chain for inbound messages (coming +from a bridged chain). + +Messages module supports multiple message lanes. Every message lane is identified with a 4-byte +identifier. Messages sent through the lane are assigned unique (for this lane) increasing integer +value that is known as nonce ("number that can only be used once"). Messages that are sent over the +same lane are guaranteed to be delivered to the target chain in the same order they're sent from +the source chain. In other words, message with nonce `N` will be delivered right before delivering a +message with nonce `N+1`. + +Single message lane may be seen as a transport channel for single application (onchain, offchain or +mixed). At the same time the module itself never dictates any lane or message rules. In the end, it +is the runtime developer who defines what message lane and message mean for this runtime. + +In our [Kusama<>Polkadot bridge](../../docs/polkadot-kusama-bridge-overview.md) we are using lane +as a channel of communication between two parachains of different relay chains. For example, lane +`[0, 0, 0, 0]` is used for Statemint <> Statemine communications. Other lanes may be used to bridge +another parachains. + +## Message Workflow + +The pallet is not intended to be used by end users and provides no public calls to send the message. +Instead, it provides runtime-internal method that allows other pallets (or other runtime code) to queue +outbound messages. + +The message "appears" when some runtime code calls the `send_message()` method of the pallet. +The submitter specifies the lane that they're willing to use and the message itself. If some fee must +be paid for sending the message, it must be paid outside of the pallet. If a message passes all checks +(that include, for example, message size check, disabled lane check, ...), the nonce is assigned and +the message is stored in the module storage. The message is in an "undelivered" state now. + +We assume that there are external, offchain actors, called relayers, that are submitting module +related transactions to both target and source chains. The pallet itself has no assumptions about +relayers incentivization scheme, but it has some callbacks for paying rewards. See +[Integrating Messages Module into runtime](#Integrating-Messages-Module-into-runtime) +for details. + +Eventually, some relayer would notice this message in the "undelivered" state and it would decide to +deliver this message. Relayer then crafts `receive_messages_proof()` transaction (aka delivery +transaction) for the messages module instance, deployed at the target chain. Relayer provides +its account id at the source chain, the proof of message (or several messages), the number of +messages in the transaction and their cumulative dispatch weight. Once a transaction is mined, the +message is considered "delivered". + +Once a message is delivered, the relayer may want to confirm delivery back to the source chain. +There are two reasons why it would want to do that. The first is that we intentionally limit number +of "delivered", but not yet "confirmed" messages at inbound lanes +(see [What about other Constants in the Messages Module Configuration Trait](#What-about-other-Constants-in-the-Messages-Module-Configuration-Trait) for explanation). +So at some point, the target chain may stop accepting new messages until relayers confirm some of +these. The second is that if the relayer wants to be rewarded for delivery, it must prove the fact +that it has actually delivered the message. And this proof may only be generated after the delivery +transaction is mined. So relayer crafts the `receive_messages_delivery_proof()` transaction (aka +confirmation transaction) for the messages module instance, deployed at the source chain. Once +this transaction is mined, the message is considered "confirmed". + +The "confirmed" state is the final state of the message. But there's one last thing related to the +message - the fact that it is now "confirmed" and reward has been paid to the relayer (or at least +callback for this has been called), must be confirmed to the target chain. Otherwise, we may reach +the limit of "unconfirmed" messages at the target chain and it will stop accepting new messages. So +relayer sometimes includes a nonce of the latest "confirmed" message in the next +`receive_messages_proof()` transaction, proving that some messages have been confirmed. + +## Integrating Messages Module into Runtime + +As it has been said above, the messages module supports both outbound and inbound message lanes. +So if we will integrate a module in some runtime, it may act as the source chain runtime for +outbound messages and as the target chain runtime for inbound messages. In this section, we'll +sometimes refer to the chain we're currently integrating with, as "this chain" and the other +chain as "bridged chain". + +Messages module doesn't simply accept transactions that are claiming that the bridged chain has +some updated data for us. Instead of this, the module assumes that the bridged chain is able to +prove that updated data in some way. The proof is abstracted from the module and may be of any kind. +In our Substrate-to-Substrate bridge we're using runtime storage proofs. Other bridges may use +transaction proofs, Substrate header digests or anything else that may be proved. + +**IMPORTANT NOTE**: everything below in this chapter describes details of the messages module +configuration. But if you're interested in well-probed and relatively easy integration of two +Substrate-based chains, you may want to look at the +[bridge-runtime-common](../../bin/runtime-common/) crate. This crate is providing a lot of +helpers for integration, which may be directly used from within your runtime. Then if you'll decide +to change something in this scheme, get back here for detailed information. + +### General Information + +The messages module supports instances. Every module instance is supposed to bridge this chain +and some bridged chain. To bridge with another chain, using another instance is suggested (this +isn't forced anywhere in the code, though). Keep in mind, that the pallet may be used to build +virtual channels between multiple chains, as we do in our [Polkadot <> Kusama bridge](../../docs/polkadot-kusama-bridge-overview.md). +There, the pallet actually bridges only two parachains - Kusama Bridge Hub and Polkadot +Bridge Hub. However, other Kusama and Polkadot parachains are able to send (XCM) messages to their +Bridge Hubs. The messages will be delivered to the other side of the bridge and routed to the proper +destination parachain within the bridged chain consensus. + +Message submitters may track message progress by inspecting module events. When Message is accepted, +the `MessageAccepted` event is emitted. The event contains both message lane identifier and nonce that +has been assigned to the message. When a message is delivered to the target chain, the `MessagesDelivered` +event is emitted from the `receive_messages_delivery_proof()` transaction. The `MessagesDelivered` contains +the message lane identifier and inclusive range of delivered message nonces. + +The pallet provides no means to get the result of message dispatch at the target chain. If that is +required, it must be done outside of the pallet. For example, XCM messages, when dispatched, have +special instructions to send some data back to the sender. Other dispatchers may use similar +mechanism for that. +### How to plug-in Messages Module to Send Messages to the Bridged Chain? + +The `pallet_bridge_messages::Config` trait has 3 main associated types that are used to work with +outbound messages. The `pallet_bridge_messages::Config::TargetHeaderChain` defines how we see the +bridged chain as the target for our outbound messages. It must be able to check that the bridged +chain may accept our message - like that the message has size below maximal possible transaction +size of the chain and so on. And when the relayer sends us a confirmation transaction, this +implementation must be able to parse and verify the proof of messages delivery. Normally, you would +reuse the same (configurable) type on all chains that are sending messages to the same bridged +chain. + +The `pallet_bridge_messages::Config::LaneMessageVerifier` defines a single callback to verify outbound +messages. The simplest callback may just accept all messages. But in this case you'll need to answer +many questions first. Who will pay for the delivery and confirmation transaction? Are we sure that +someone will ever deliver this message to the bridged chain? Are we sure that we don't bloat our +runtime storage by accepting this message? What if the message is improperly encoded or has some +fields set to invalid values? Answering all those (and similar) questions would lead to correct +implementation. + +There's another thing to consider when implementing type for use in +`pallet_bridge_messages::Config::LaneMessageVerifier`. It is whether we treat all message lanes +identically, or they'll have different sets of verification rules? For example, you may reserve +lane#1 for messages coming from some 'wrapped-token' pallet - then you may verify in your +implementation that the origin is associated with this pallet. Lane#2 may be reserved for 'system' +messages and you may charge zero fee for such messages. You may have some rate limiting for messages +sent over the lane#3. Or you may just verify the same rules set for all outbound messages - it is +all up to the `pallet_bridge_messages::Config::LaneMessageVerifier` implementation. + +The last type is the `pallet_bridge_messages::Config::DeliveryConfirmationPayments`. When confirmation +transaction is received, we call the `pay_reward()` method, passing the range of delivered messages. +You may use the [`pallet-bridge-relayers`](../relayers/) pallet and its +[`DeliveryConfirmationPaymentsAdapter`](../relayers/src/payment_adapter.rs) adapter as a possible +implementation. It allows you to pay fixed reward for relaying the message and some of its portion +for confirming delivery. + +### I have a Messages Module in my Runtime, but I Want to Reject all Outbound Messages. What shall I do? + +You should be looking at the `bp_messages::source_chain::ForbidOutboundMessages` structure +[`bp_messages::source_chain`](../../primitives/messages/src/source_chain.rs). It implements +all required traits and will simply reject all transactions, related to outbound messages. + +### How to plug-in Messages Module to Receive Messages from the Bridged Chain? + +The `pallet_bridge_messages::Config` trait has 2 main associated types that are used to work with +inbound messages. The `pallet_bridge_messages::Config::SourceHeaderChain` defines how we see the +bridged chain as the source of our inbound messages. When relayer sends us a delivery transaction, +this implementation must be able to parse and verify the proof of messages wrapped in this +transaction. Normally, you would reuse the same (configurable) type on all chains that are sending +messages to the same bridged chain. + +The `pallet_bridge_messages::Config::MessageDispatch` defines a way on how to dispatch delivered +messages. Apart from actually dispatching the message, the implementation must return the correct +dispatch weight of the message before dispatch is called. + +### I have a Messages Module in my Runtime, but I Want to Reject all Inbound Messages. What shall I do? + +You should be looking at the `bp_messages::target_chain::ForbidInboundMessages` structure from +the [`bp_messages::target_chain`](../../primitives/messages/src/target_chain.rs) module. It +implements all required traits and will simply reject all transactions, related to inbound messages. + +### What about other Constants in the Messages Module Configuration Trait? + +Two settings that are used to check messages in the `send_message()` function. The +`pallet_bridge_messages::Config::ActiveOutboundLanes` is an array of all message lanes, that +may be used to send messages. All messages sent using other lanes are rejected. All messages that have +size above `pallet_bridge_messages::Config::MaximalOutboundPayloadSize` will also be rejected. + +To be able to reward the relayer for delivering messages, we store a map of message nonces range => +identifier of the relayer that has delivered this range at the target chain runtime storage. If a +relayer delivers multiple consequent ranges, they're merged into single entry. So there may be more +than one entry for the same relayer. Eventually, this whole map must be delivered back to the source +chain to confirm delivery and pay rewards. So to make sure we are able to craft this confirmation +transaction, we need to: (1) keep the size of this map below a certain limit and (2) make sure that +the weight of processing this map is below a certain limit. Both size and processing weight mostly +depend on the number of entries. The number of entries is limited with the +`pallet_bridge_messages::ConfigMaxUnrewardedRelayerEntriesAtInboundLane` parameter. Processing weight +also depends on the total number of messages that are being confirmed, because every confirmed +message needs to be read. So there's another +`pallet_bridge_messages::Config::MaxUnconfirmedMessagesAtInboundLane` parameter for that. + +When choosing values for these parameters, you must also keep in mind that if proof in your scheme +is based on finality of headers (and it is the most obvious option for Substrate-based chains with +finality notion), then choosing too small values for these parameters may cause significant delays +in message delivery. That's because there are too many actors involved in this scheme: 1) authorities +that are finalizing headers of the target chain need to finalize header with non-empty map; 2) the +headers relayer then needs to submit this header and its finality proof to the source chain; 3) the +messages relayer must then send confirmation transaction (storage proof of this map) to the source +chain; 4) when the confirmation transaction will be mined at some header, source chain authorities +must finalize this header; 5) the headers relay then needs to submit this header and its finality +proof to the target chain; 6) only now the messages relayer may submit new messages from the source +to target chain and prune the entry from the map. + +Delivery transaction requires the relayer to provide both number of entries and total number of +messages in the map. This means that the module never charges an extra cost for delivering a map - +the relayer would need to pay exactly for the number of entries+messages it has delivered. So the +best guess for values of these parameters would be the pair that would occupy `N` percent of the +maximal transaction size and weight of the source chain. The `N` should be large enough to process +large maps, at the same time keeping reserve for future source chain upgrades. + +## Non-Essential Functionality + +There may be a special account in every runtime where the messages module is deployed. This +account, named 'module owner', is like a module-level sudo account - he's able to halt and +resume all module operations without requiring runtime upgrade. Calls that are related to this +account are: +- `fn set_owner()`: current module owner may call it to transfer "ownership" to another account; +- `fn halt_operations()`: the module owner (or sudo account) may call this function to stop all + module operations. After this call, all message-related transactions will be rejected until + further `resume_operations` call'. This call may be used when something extraordinary happens with + the bridge; +- `fn resume_operations()`: module owner may call this function to resume bridge operations. The + module will resume its regular operations after this call. + +If pallet owner is not defined, the governance may be used to make those calls. + +## Messages Relay + +We have an offchain actor, who is watching for new messages and submits them to the bridged chain. +It is the messages relay - you may look at the [crate level documentation and the code](../../relays/messages/). diff --git a/bridges/modules/messages/src/benchmarking.rs b/bridges/modules/messages/src/benchmarking.rs new file mode 100644 index 00000000000..aab8855a729 --- /dev/null +++ b/bridges/modules/messages/src/benchmarking.rs @@ -0,0 +1,460 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Messages pallet benchmarking. + +use crate::{ + inbound_lane::InboundLaneStorage, inbound_lane_storage, outbound_lane, + weights_ext::EXPECTED_DEFAULT_MESSAGE_LENGTH, Call, OutboundLanes, +}; + +use bp_messages::{ + source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, DeliveredMessages, + InboundLaneData, LaneId, MessageNonce, OutboundLaneData, UnrewardedRelayer, + UnrewardedRelayersState, +}; +use bp_runtime::StorageProofSize; +use codec::Decode; +use frame_benchmarking::{account, benchmarks_instance_pallet}; +use frame_support::weights::Weight; +use frame_system::RawOrigin; +use sp_runtime::traits::TrailingZeroInput; +use sp_std::{ops::RangeInclusive, prelude::*}; + +const SEED: u32 = 0; + +/// Pallet we're benchmarking here. +pub struct Pallet, I: 'static = ()>(crate::Pallet); + +/// Benchmark-specific message proof parameters. +#[derive(Debug)] +pub struct MessageProofParams { + /// Id of the lane. + pub lane: LaneId, + /// Range of messages to include in the proof. + pub message_nonces: RangeInclusive, + /// If `Some`, the proof needs to include this outbound lane data. + pub outbound_lane_data: Option, + /// If `true`, the caller expects that the proof will contain correct messages that will + /// be successfully dispatched. This is only called from the "optional" + /// `receive_single_message_proof_with_dispatch` benchmark. If you don't need it, just + /// return `true` from the `is_message_successfully_dispatched`. + pub is_successful_dispatch_expected: bool, + /// Proof size requirements. + pub size: StorageProofSize, +} + +/// Benchmark-specific message delivery proof parameters. +#[derive(Debug)] +pub struct MessageDeliveryProofParams { + /// Id of the lane. + pub lane: LaneId, + /// The proof needs to include this inbound lane data. + pub inbound_lane_data: InboundLaneData, + /// Proof size requirements. + pub size: StorageProofSize, +} + +/// Trait that must be implemented by runtime. +pub trait Config: crate::Config { + /// Lane id to use in benchmarks. + /// + /// By default, lane 00000000 is used. + fn bench_lane_id() -> LaneId { + LaneId([0, 0, 0, 0]) + } + + /// Return id of relayer account at the bridged chain. + /// + /// By default, zero account is returned. + fn bridged_relayer_id() -> Self::InboundRelayer { + Self::InboundRelayer::decode(&mut TrailingZeroInput::zeroes()).unwrap() + } + + /// Create given account and give it enough balance for test purposes. Used to create + /// relayer account at the target chain. Is strictly necessary when your rewards scheme + /// assumes that the relayer account must exist. + /// + /// Does nothing by default. + fn endow_account(_account: &Self::AccountId) {} + + /// Prepare messages proof to receive by the module. + fn prepare_message_proof( + params: MessageProofParams, + ) -> (::MessagesProof, Weight); + /// Prepare messages delivery proof to receive by the module. + fn prepare_message_delivery_proof( + params: MessageDeliveryProofParams, + ) -> >::MessagesDeliveryProof; + + /// Returns true if message has been successfully dispatched or not. + fn is_message_successfully_dispatched(_nonce: MessageNonce) -> bool { + true + } + + /// Returns true if given relayer has been rewarded for some of its actions. + fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool; +} + +benchmarks_instance_pallet! { + // + // Benchmarks that are used directly by the runtime calls weight formulae. + // + + // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: + // * proof does not include outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is dispatched (reminder: dispatch weight should be minimal); + // * message requires all heavy checks done by dispatcher. + // + // This is base benchmark for all other message delivery benchmarks. + receive_single_message_proof { + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=21, + outbound_lane_data: None, + is_successful_dispatch_expected: false, + size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) + verify { + assert_eq!( + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + 21, + ); + } + + // Benchmark `receive_messages_proof` extrinsic with two minimal-weight messages and following conditions: + // * proof does not include outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is dispatched (reminder: dispatch weight should be minimal); + // * message requires all heavy checks done by dispatcher. + // + // The weight of single message delivery could be approximated as + // `weight(receive_two_messages_proof) - weight(receive_single_message_proof)`. + // This won't be super-accurate if message has non-zero dispatch weight, but estimation should + // be close enough to real weight. + receive_two_messages_proof { + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=22, + outbound_lane_data: None, + is_successful_dispatch_expected: false, + size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 2, dispatch_weight) + verify { + assert_eq!( + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + 22, + ); + } + + // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: + // * proof includes outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is successfully dispatched (reminder: dispatch weight should be minimal); + // * message requires all heavy checks done by dispatcher. + // + // The weight of outbound lane state delivery would be + // `weight(receive_single_message_proof_with_outbound_lane_state) - weight(receive_single_message_proof)`. + // This won't be super-accurate if message has non-zero dispatch weight, but estimation should + // be close enough to real weight. + receive_single_message_proof_with_outbound_lane_state { + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=21, + outbound_lane_data: Some(OutboundLaneData { + oldest_unpruned_nonce: 21, + latest_received_nonce: 20, + latest_generated_nonce: 21, + }), + is_successful_dispatch_expected: false, + size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) + verify { + let lane_state = crate::InboundLanes::::get(&T::bench_lane_id()); + assert_eq!(lane_state.last_delivered_nonce(), 21); + assert_eq!(lane_state.last_confirmed_nonce, 20); + } + + // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: + // * the proof has large leaf with total size of approximately 1KB; + // * proof does not include outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is dispatched (reminder: dispatch weight should be minimal); + // * message requires all heavy checks done by dispatcher. + // + // With single KB of messages proof, the weight of the call is increased (roughly) by + // `(receive_single_message_proof_16KB - receive_single_message_proof_1_kb) / 15`. + receive_single_message_proof_1_kb { + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=21, + outbound_lane_data: None, + is_successful_dispatch_expected: false, + size: StorageProofSize::HasLargeLeaf(1024), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) + verify { + assert_eq!( + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + 21, + ); + } + + // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: + // * the proof has large leaf with total size of approximately 16KB; + // * proof does not include outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is dispatched (reminder: dispatch weight should be minimal); + // * message requires all heavy checks done by dispatcher. + // + // Size of proof grows because it contains extra trie nodes in it. + // + // With single KB of messages proof, the weight of the call is increased (roughly) by + // `(receive_single_message_proof_16KB - receive_single_message_proof) / 15`. + receive_single_message_proof_16_kb { + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=21, + outbound_lane_data: None, + is_successful_dispatch_expected: false, + size: StorageProofSize::HasLargeLeaf(16 * 1024), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) + verify { + assert_eq!( + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + 21, + ); + } + + // Benchmark `receive_messages_delivery_proof` extrinsic with following conditions: + // * single relayer is rewarded for relaying single message; + // * relayer account does not exist (in practice it needs to exist in production environment). + // + // This is base benchmark for all other confirmations delivery benchmarks. + receive_delivery_proof_for_single_message { + let relayer_id: T::AccountId = account("relayer", 0, SEED); + + // send message that we're going to confirm + send_regular_message::(); + + let relayers_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }; + let proof = T::prepare_message_delivery_proof(MessageDeliveryProofParams { + lane: T::bench_lane_id(), + inbound_lane_data: InboundLaneData { + relayers: vec![UnrewardedRelayer { + relayer: relayer_id.clone(), + messages: DeliveredMessages::new(1), + }].into_iter().collect(), + last_confirmed_nonce: 0, + }, + size: StorageProofSize::Minimal(0), + }); + }: receive_messages_delivery_proof(RawOrigin::Signed(relayer_id.clone()), proof, relayers_state) + verify { + assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 1); + assert!(T::is_relayer_rewarded(&relayer_id)); + } + + // Benchmark `receive_messages_delivery_proof` extrinsic with following conditions: + // * single relayer is rewarded for relaying two messages; + // * relayer account does not exist (in practice it needs to exist in production environment). + // + // Additional weight for paying single-message reward to the same relayer could be computed + // as `weight(receive_delivery_proof_for_two_messages_by_single_relayer) + // - weight(receive_delivery_proof_for_single_message)`. + receive_delivery_proof_for_two_messages_by_single_relayer { + let relayer_id: T::AccountId = account("relayer", 0, SEED); + + // send message that we're going to confirm + send_regular_message::(); + send_regular_message::(); + + let relayers_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 2, + total_messages: 2, + last_delivered_nonce: 2, + }; + let mut delivered_messages = DeliveredMessages::new(1); + delivered_messages.note_dispatched_message(); + let proof = T::prepare_message_delivery_proof(MessageDeliveryProofParams { + lane: T::bench_lane_id(), + inbound_lane_data: InboundLaneData { + relayers: vec![UnrewardedRelayer { + relayer: relayer_id.clone(), + messages: delivered_messages, + }].into_iter().collect(), + last_confirmed_nonce: 0, + }, + size: StorageProofSize::Minimal(0), + }); + }: receive_messages_delivery_proof(RawOrigin::Signed(relayer_id.clone()), proof, relayers_state) + verify { + assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 2); + assert!(T::is_relayer_rewarded(&relayer_id)); + } + + // Benchmark `receive_messages_delivery_proof` extrinsic with following conditions: + // * two relayers are rewarded for relaying single message each; + // * relayer account does not exist (in practice it needs to exist in production environment). + // + // Additional weight for paying reward to the next relayer could be computed + // as `weight(receive_delivery_proof_for_two_messages_by_two_relayers) + // - weight(receive_delivery_proof_for_two_messages_by_single_relayer)`. + receive_delivery_proof_for_two_messages_by_two_relayers { + let relayer1_id: T::AccountId = account("relayer1", 1, SEED); + let relayer2_id: T::AccountId = account("relayer2", 2, SEED); + + // send message that we're going to confirm + send_regular_message::(); + send_regular_message::(); + + let relayers_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + messages_in_oldest_entry: 1, + total_messages: 2, + last_delivered_nonce: 2, + }; + let proof = T::prepare_message_delivery_proof(MessageDeliveryProofParams { + lane: T::bench_lane_id(), + inbound_lane_data: InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: relayer1_id.clone(), + messages: DeliveredMessages::new(1), + }, + UnrewardedRelayer { + relayer: relayer2_id.clone(), + messages: DeliveredMessages::new(2), + }, + ].into_iter().collect(), + last_confirmed_nonce: 0, + }, + size: StorageProofSize::Minimal(0), + }); + }: receive_messages_delivery_proof(RawOrigin::Signed(relayer1_id.clone()), proof, relayers_state) + verify { + assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 2); + assert!(T::is_relayer_rewarded(&relayer1_id)); + assert!(T::is_relayer_rewarded(&relayer2_id)); + } + + // + // Benchmarks that the runtime developers may use for proper pallet configuration. + // + + // This benchmark is optional and may be used when runtime developer need a way to compute + // message dispatch weight. In this case, he needs to provide messages that can go the whole + // dispatch + // + // Benchmark `receive_messages_proof` extrinsic with single message and following conditions: + // + // * proof does not include outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is **SUCCESSFULLY** dispatched; + // * message requires all heavy checks done by dispatcher. + receive_single_message_proof_with_dispatch { + // maybe dispatch weight relies on the message size too? + let i in EXPECTED_DEFAULT_MESSAGE_LENGTH .. EXPECTED_DEFAULT_MESSAGE_LENGTH * 16; + + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=21, + outbound_lane_data: None, + is_successful_dispatch_expected: true, + size: StorageProofSize::Minimal(i), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) + verify { + assert_eq!( + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + 21, + ); + assert!(T::is_message_successfully_dispatched(21)); + } + + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) +} + +fn send_regular_message, I: 'static>() { + let mut outbound_lane = outbound_lane::(T::bench_lane_id()); + outbound_lane.send_message(vec![]); +} + +fn receive_messages, I: 'static>(nonce: MessageNonce) { + let mut inbound_lane_storage = inbound_lane_storage::(T::bench_lane_id()); + inbound_lane_storage.set_data(InboundLaneData { + relayers: vec![UnrewardedRelayer { + relayer: T::bridged_relayer_id(), + messages: DeliveredMessages::new(nonce), + }] + .into_iter() + .collect(), + last_confirmed_nonce: 0, + }); +} diff --git a/bridges/modules/messages/src/inbound_lane.rs b/bridges/modules/messages/src/inbound_lane.rs new file mode 100644 index 00000000000..5ec4444dbdf --- /dev/null +++ b/bridges/modules/messages/src/inbound_lane.rs @@ -0,0 +1,556 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Everything about incoming messages receival. + +use crate::Config; + +use bp_messages::{ + target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch}, + DeliveredMessages, InboundLaneData, LaneId, MessageKey, MessageNonce, OutboundLaneData, + ReceivalResult, UnrewardedRelayer, +}; +use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; +use frame_support::{traits::Get, RuntimeDebug}; +use scale_info::{Type, TypeInfo}; +use sp_std::prelude::PartialEq; + +/// Inbound lane storage. +pub trait InboundLaneStorage { + /// Id of relayer on source chain. + type Relayer: Clone + PartialEq; + + /// Lane id. + fn id(&self) -> LaneId; + /// Return maximal number of unrewarded relayer entries in inbound lane. + fn max_unrewarded_relayer_entries(&self) -> MessageNonce; + /// Return maximal number of unconfirmed messages in inbound lane. + fn max_unconfirmed_messages(&self) -> MessageNonce; + /// Get lane data from the storage. + fn data(&self) -> InboundLaneData; + /// Update lane data in the storage. + fn set_data(&mut self, data: InboundLaneData); +} + +/// Inbound lane data wrapper that implements `MaxEncodedLen`. +/// +/// We have already had `MaxEncodedLen`-like functionality before, but its usage has +/// been localized and we haven't been passing bounds (maximal count of unrewarded relayer entries, +/// maximal count of unconfirmed messages) everywhere. This wrapper allows us to avoid passing +/// these generic bounds all over the code. +/// +/// The encoding of this type matches encoding of the corresponding `MessageData`. +#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq)] +pub struct StoredInboundLaneData, I: 'static>(pub InboundLaneData); + +impl, I: 'static> sp_std::ops::Deref for StoredInboundLaneData { + type Target = InboundLaneData; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl, I: 'static> sp_std::ops::DerefMut for StoredInboundLaneData { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl, I: 'static> Default for StoredInboundLaneData { + fn default() -> Self { + StoredInboundLaneData(Default::default()) + } +} + +impl, I: 'static> From> + for InboundLaneData +{ + fn from(data: StoredInboundLaneData) -> Self { + data.0 + } +} + +impl, I: 'static> EncodeLike> + for InboundLaneData +{ +} + +impl, I: 'static> TypeInfo for StoredInboundLaneData { + type Identity = Self; + + fn type_info() -> Type { + InboundLaneData::::type_info() + } +} + +impl, I: 'static> MaxEncodedLen for StoredInboundLaneData { + fn max_encoded_len() -> usize { + InboundLaneData::::encoded_size_hint( + T::MaxUnrewardedRelayerEntriesAtInboundLane::get() as usize, + ) + .unwrap_or(usize::MAX) + } +} + +/// Inbound messages lane. +pub struct InboundLane { + storage: S, +} + +impl InboundLane { + /// Create new inbound lane backed by given storage. + pub fn new(storage: S) -> Self { + InboundLane { storage } + } + + /// Returns storage reference. + pub fn storage(&self) -> &S { + &self.storage + } + + /// Receive state of the corresponding outbound lane. + pub fn receive_state_update( + &mut self, + outbound_lane_data: OutboundLaneData, + ) -> Option { + let mut data = self.storage.data(); + let last_delivered_nonce = data.last_delivered_nonce(); + + if outbound_lane_data.latest_received_nonce > last_delivered_nonce { + // this is something that should never happen if proofs are correct + return None + } + if outbound_lane_data.latest_received_nonce <= data.last_confirmed_nonce { + return None + } + + let new_confirmed_nonce = outbound_lane_data.latest_received_nonce; + data.last_confirmed_nonce = new_confirmed_nonce; + // Firstly, remove all of the records where higher nonce <= new confirmed nonce + while data + .relayers + .front() + .map(|entry| entry.messages.end <= new_confirmed_nonce) + .unwrap_or(false) + { + data.relayers.pop_front(); + } + // Secondly, update the next record with lower nonce equal to new confirmed nonce if needed. + // Note: There will be max. 1 record to update as we don't allow messages from relayers to + // overlap. + match data.relayers.front_mut() { + Some(entry) if entry.messages.begin <= new_confirmed_nonce => { + entry.messages.begin = new_confirmed_nonce + 1; + }, + _ => {}, + } + + self.storage.set_data(data); + Some(outbound_lane_data.latest_received_nonce) + } + + /// Receive new message. + pub fn receive_message( + &mut self, + relayer_at_bridged_chain: &S::Relayer, + nonce: MessageNonce, + message_data: DispatchMessageData, + ) -> ReceivalResult { + let mut data = self.storage.data(); + let is_correct_message = nonce == data.last_delivered_nonce() + 1; + if !is_correct_message { + return ReceivalResult::InvalidNonce + } + + // if there are more unrewarded relayer entries than we may accept, reject this message + if data.relayers.len() as MessageNonce >= self.storage.max_unrewarded_relayer_entries() { + return ReceivalResult::TooManyUnrewardedRelayers + } + + // if there are more unconfirmed messages than we may accept, reject this message + let unconfirmed_messages_count = nonce.saturating_sub(data.last_confirmed_nonce); + if unconfirmed_messages_count > self.storage.max_unconfirmed_messages() { + return ReceivalResult::TooManyUnconfirmedMessages + } + + // then, dispatch message + let dispatch_result = Dispatch::dispatch(DispatchMessage { + key: MessageKey { lane_id: self.storage.id(), nonce }, + data: message_data, + }); + + // now let's update inbound lane storage + match data.relayers.back_mut() { + Some(entry) if entry.relayer == *relayer_at_bridged_chain => { + entry.messages.note_dispatched_message(); + }, + _ => { + data.relayers.push_back(UnrewardedRelayer { + relayer: relayer_at_bridged_chain.clone(), + messages: DeliveredMessages::new(nonce), + }); + }, + }; + self.storage.set_data(data); + + ReceivalResult::Dispatched(dispatch_result) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + inbound_lane, + mock::{ + dispatch_result, inbound_message_data, inbound_unrewarded_relayers_state, run_test, + unrewarded_relayer, TestMessageDispatch, TestRuntime, REGULAR_PAYLOAD, TEST_LANE_ID, + TEST_RELAYER_A, TEST_RELAYER_B, TEST_RELAYER_C, + }, + RuntimeInboundLaneStorage, + }; + use bp_messages::UnrewardedRelayersState; + + fn receive_regular_message( + lane: &mut InboundLane>, + nonce: MessageNonce, + ) { + assert_eq!( + lane.receive_message::( + &TEST_RELAYER_A, + nonce, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::Dispatched(dispatch_result(0)) + ); + } + + #[test] + fn receive_status_update_ignores_status_from_the_future() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + receive_regular_message(&mut lane, 1); + assert_eq!( + lane.receive_state_update(OutboundLaneData { + latest_received_nonce: 10, + ..Default::default() + }), + None, + ); + + assert_eq!(lane.storage.data().last_confirmed_nonce, 0); + }); + } + + #[test] + fn receive_status_update_ignores_obsolete_status() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + receive_regular_message(&mut lane, 1); + receive_regular_message(&mut lane, 2); + receive_regular_message(&mut lane, 3); + assert_eq!( + lane.receive_state_update(OutboundLaneData { + latest_received_nonce: 3, + ..Default::default() + }), + Some(3), + ); + assert_eq!(lane.storage.data().last_confirmed_nonce, 3); + + assert_eq!( + lane.receive_state_update(OutboundLaneData { + latest_received_nonce: 3, + ..Default::default() + }), + None, + ); + assert_eq!(lane.storage.data().last_confirmed_nonce, 3); + }); + } + + #[test] + fn receive_status_update_works() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + receive_regular_message(&mut lane, 1); + receive_regular_message(&mut lane, 2); + receive_regular_message(&mut lane, 3); + assert_eq!(lane.storage.data().last_confirmed_nonce, 0); + assert_eq!( + lane.storage.data().relayers, + vec![unrewarded_relayer(1, 3, TEST_RELAYER_A)] + ); + + assert_eq!( + lane.receive_state_update(OutboundLaneData { + latest_received_nonce: 2, + ..Default::default() + }), + Some(2), + ); + assert_eq!(lane.storage.data().last_confirmed_nonce, 2); + assert_eq!( + lane.storage.data().relayers, + vec![unrewarded_relayer(3, 3, TEST_RELAYER_A)] + ); + + assert_eq!( + lane.receive_state_update(OutboundLaneData { + latest_received_nonce: 3, + ..Default::default() + }), + Some(3), + ); + assert_eq!(lane.storage.data().last_confirmed_nonce, 3); + assert_eq!(lane.storage.data().relayers, vec![]); + }); + } + + #[test] + fn receive_status_update_works_with_batches_from_relayers() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + let mut seed_storage_data = lane.storage.data(); + // Prepare data + seed_storage_data.last_confirmed_nonce = 0; + seed_storage_data.relayers.push_back(unrewarded_relayer(1, 1, TEST_RELAYER_A)); + // Simulate messages batch (2, 3, 4) from relayer #2 + seed_storage_data.relayers.push_back(unrewarded_relayer(2, 4, TEST_RELAYER_B)); + seed_storage_data.relayers.push_back(unrewarded_relayer(5, 5, TEST_RELAYER_C)); + lane.storage.set_data(seed_storage_data); + // Check + assert_eq!( + lane.receive_state_update(OutboundLaneData { + latest_received_nonce: 3, + ..Default::default() + }), + Some(3), + ); + assert_eq!(lane.storage.data().last_confirmed_nonce, 3); + assert_eq!( + lane.storage.data().relayers, + vec![ + unrewarded_relayer(4, 4, TEST_RELAYER_B), + unrewarded_relayer(5, 5, TEST_RELAYER_C) + ] + ); + }); + } + + #[test] + fn fails_to_receive_message_with_incorrect_nonce() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + assert_eq!( + lane.receive_message::( + &TEST_RELAYER_A, + 10, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::InvalidNonce + ); + assert_eq!(lane.storage.data().last_delivered_nonce(), 0); + }); + } + + #[test] + fn fails_to_receive_messages_above_unrewarded_relayer_entries_limit_per_lane() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + let max_nonce = + ::MaxUnrewardedRelayerEntriesAtInboundLane::get(); + for current_nonce in 1..max_nonce + 1 { + assert_eq!( + lane.receive_message::( + &(TEST_RELAYER_A + current_nonce), + current_nonce, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::Dispatched(dispatch_result(0)) + ); + } + // Fails to dispatch new message from different than latest relayer. + assert_eq!( + lane.receive_message::( + &(TEST_RELAYER_A + max_nonce + 1), + max_nonce + 1, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::TooManyUnrewardedRelayers, + ); + // Fails to dispatch new messages from latest relayer. Prevents griefing attacks. + assert_eq!( + lane.receive_message::( + &(TEST_RELAYER_A + max_nonce), + max_nonce + 1, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::TooManyUnrewardedRelayers, + ); + }); + } + + #[test] + fn fails_to_receive_messages_above_unconfirmed_messages_limit_per_lane() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + let max_nonce = ::MaxUnconfirmedMessagesAtInboundLane::get(); + for current_nonce in 1..=max_nonce { + assert_eq!( + lane.receive_message::( + &TEST_RELAYER_A, + current_nonce, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::Dispatched(dispatch_result(0)) + ); + } + // Fails to dispatch new message from different than latest relayer. + assert_eq!( + lane.receive_message::( + &TEST_RELAYER_B, + max_nonce + 1, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::TooManyUnconfirmedMessages, + ); + // Fails to dispatch new messages from latest relayer. + assert_eq!( + lane.receive_message::( + &TEST_RELAYER_A, + max_nonce + 1, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::TooManyUnconfirmedMessages, + ); + }); + } + + #[test] + fn correctly_receives_following_messages_from_two_relayers_alternately() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + assert_eq!( + lane.receive_message::( + &TEST_RELAYER_A, + 1, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::Dispatched(dispatch_result(0)) + ); + assert_eq!( + lane.receive_message::( + &TEST_RELAYER_B, + 2, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::Dispatched(dispatch_result(0)) + ); + assert_eq!( + lane.receive_message::( + &TEST_RELAYER_A, + 3, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::Dispatched(dispatch_result(0)) + ); + assert_eq!( + lane.storage.data().relayers, + vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B), + unrewarded_relayer(3, 3, TEST_RELAYER_A) + ] + ); + }); + } + + #[test] + fn rejects_same_message_from_two_different_relayers() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + assert_eq!( + lane.receive_message::( + &TEST_RELAYER_A, + 1, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::Dispatched(dispatch_result(0)) + ); + assert_eq!( + lane.receive_message::( + &TEST_RELAYER_B, + 1, + inbound_message_data(REGULAR_PAYLOAD) + ), + ReceivalResult::InvalidNonce, + ); + }); + } + + #[test] + fn correct_message_is_processed_instantly() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + receive_regular_message(&mut lane, 1); + assert_eq!(lane.storage.data().last_delivered_nonce(), 1); + }); + } + + #[test] + fn unspent_weight_is_returned_by_receive_message() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + let mut payload = REGULAR_PAYLOAD; + *payload.dispatch_result.unspent_weight.ref_time_mut() = 1; + assert_eq!( + lane.receive_message::( + &TEST_RELAYER_A, + 1, + inbound_message_data(payload) + ), + ReceivalResult::Dispatched(dispatch_result(1)) + ); + }); + } + + #[test] + fn first_message_is_confirmed_correctly() { + run_test(|| { + let mut lane = inbound_lane::(TEST_LANE_ID); + receive_regular_message(&mut lane, 1); + receive_regular_message(&mut lane, 2); + assert_eq!( + lane.receive_state_update(OutboundLaneData { + latest_received_nonce: 1, + ..Default::default() + }), + Some(1), + ); + assert_eq!( + inbound_unrewarded_relayers_state(TEST_LANE_ID), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 2, + }, + ); + }); + } +} diff --git a/bridges/modules/messages/src/lib.rs b/bridges/modules/messages/src/lib.rs new file mode 100644 index 00000000000..045015b7751 --- /dev/null +++ b/bridges/modules/messages/src/lib.rs @@ -0,0 +1,2152 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Runtime module that allows sending and receiving messages using lane concept: +//! +//! 1) the message is sent using `send_message()` call; +//! 2) every outbound message is assigned nonce; +//! 3) the messages are stored in the storage; +//! 4) external component (relay) delivers messages to bridged chain; +//! 5) messages are processed in order (ordered by assigned nonce); +//! 6) relay may send proof-of-delivery back to this chain. +//! +//! Once message is sent, its progress can be tracked by looking at module events. +//! The assigned nonce is reported using `MessageAccepted` event. When message is +//! delivered to the the bridged chain, it is reported using `MessagesDelivered` event. +//! +//! **IMPORTANT NOTE**: after generating weights (custom `WeighInfo` implementation) for +//! your runtime (where this module is plugged to), please add test for these weights. +//! The test should call the `ensure_weights_are_correct` function from this module. +//! If this test fails with your weights, then either weights are computed incorrectly, +//! or some benchmarks assumptions are broken for your runtime. + +#![cfg_attr(not(feature = "std"), no_std)] +// Generated by `decl_event!` +#![allow(clippy::unused_unit)] + +pub use inbound_lane::StoredInboundLaneData; +pub use outbound_lane::StoredMessagePayload; +pub use weights::WeightInfo; +pub use weights_ext::{ + ensure_able_to_receive_confirmation, ensure_able_to_receive_message, + ensure_weights_are_correct, WeightInfoExt, EXPECTED_DEFAULT_MESSAGE_LENGTH, + EXTRA_STORAGE_PROOF_SIZE, +}; + +use crate::{ + inbound_lane::{InboundLane, InboundLaneStorage}, + outbound_lane::{OutboundLane, OutboundLaneStorage, ReceivalConfirmationResult}, +}; + +use bp_messages::{ + source_chain::{ + DeliveryConfirmationPayments, LaneMessageVerifier, SendMessageArtifacts, TargetHeaderChain, + }, + target_chain::{ + DeliveryPayments, DispatchMessage, MessageDispatch, ProvedLaneMessages, ProvedMessages, + SourceHeaderChain, + }, + total_unrewarded_messages, DeliveredMessages, InboundLaneData, InboundMessageDetails, LaneId, + MessageKey, MessageNonce, MessagePayload, MessagesOperatingMode, OutboundLaneData, + OutboundMessageDetails, UnrewardedRelayersState, +}; +use bp_runtime::{BasicOperatingMode, ChainId, OwnedBridgeModule, PreComputedSize, Size}; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::{dispatch::PostDispatchInfo, ensure, fail, traits::Get}; +use sp_runtime::traits::UniqueSaturatedFrom; +use sp_std::{cell::RefCell, marker::PhantomData, prelude::*}; + +mod inbound_lane; +mod outbound_lane; +mod weights_ext; + +pub mod weights; + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; + +#[cfg(test)] +mod mock; + +pub use pallet::*; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-messages"; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use bp_messages::{ReceivalResult, ReceivedMessages}; + use bp_runtime::RangeInclusiveExt; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + // General types + + /// The overarching event type. + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + /// Benchmarks results from runtime we're plugged into. + type WeightInfo: WeightInfoExt; + + /// Gets the chain id value from the instance. + #[pallet::constant] + type BridgedChainId: Get; + + /// Get all active outbound lanes that the message pallet is serving. + type ActiveOutboundLanes: Get<&'static [LaneId]>; + /// Maximal number of unrewarded relayer entries at inbound lane. Unrewarded means that the + /// relayer has delivered messages, but either confirmations haven't been delivered back to + /// the source chain, or we haven't received reward confirmations yet. + /// + /// This constant limits maximal number of entries in the `InboundLaneData::relayers`. Keep + /// in mind that the same relayer account may take several (non-consecutive) entries in this + /// set. + type MaxUnrewardedRelayerEntriesAtInboundLane: Get; + /// Maximal number of unconfirmed messages at inbound lane. Unconfirmed means that the + /// message has been delivered, but either confirmations haven't been delivered back to the + /// source chain, or we haven't received reward confirmations for these messages yet. + /// + /// This constant limits difference between last message from last entry of the + /// `InboundLaneData::relayers` and first message at the first entry. + /// + /// There is no point of making this parameter lesser than + /// MaxUnrewardedRelayerEntriesAtInboundLane, because then maximal number of relayer entries + /// will be limited by maximal number of messages. + /// + /// This value also represents maximal number of messages in single delivery transaction. + /// Transaction that is declaring more messages than this value, will be rejected. Even if + /// these messages are from different lanes. + type MaxUnconfirmedMessagesAtInboundLane: Get; + + /// Maximal encoded size of the outbound payload. + #[pallet::constant] + type MaximalOutboundPayloadSize: Get; + /// Payload type of outbound messages. This payload is dispatched on the bridged chain. + type OutboundPayload: Parameter + Size; + + /// Payload type of inbound messages. This payload is dispatched on this chain. + type InboundPayload: Decode; + /// Identifier of relayer that deliver messages to this chain. Relayer reward is paid on the + /// bridged chain. + type InboundRelayer: Parameter + MaxEncodedLen; + /// Delivery payments. + type DeliveryPayments: DeliveryPayments; + + // Types that are used by outbound_lane (on source chain). + + /// Target header chain. + type TargetHeaderChain: TargetHeaderChain; + /// Message payload verifier. + type LaneMessageVerifier: LaneMessageVerifier; + /// Delivery confirmation payments. + type DeliveryConfirmationPayments: DeliveryConfirmationPayments; + + // Types that are used by inbound_lane (on target chain). + + /// Source header chain, as it is represented on target chain. + type SourceHeaderChain: SourceHeaderChain; + /// Message dispatch. + type MessageDispatch: MessageDispatch; + } + + /// Shortcut to messages proof type for Config. + pub type MessagesProofOf = + <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof; + /// Shortcut to messages delivery proof type for Config. + pub type MessagesDeliveryProofOf = + <>::TargetHeaderChain as TargetHeaderChain< + >::OutboundPayload, + ::AccountId, + >>::MessagesDeliveryProof; + + #[pallet::pallet] + pub struct Pallet(PhantomData<(T, I)>); + + impl, I: 'static> OwnedBridgeModule for Pallet { + const LOG_TARGET: &'static str = LOG_TARGET; + type OwnerStorage = PalletOwner; + type OperatingMode = MessagesOperatingMode; + type OperatingModeStorage = PalletOperatingMode; + } + + #[pallet::hooks] + impl, I: 'static> Hooks> for Pallet + where + u32: TryFrom<::BlockNumber>, + { + fn on_idle(_block: T::BlockNumber, remaining_weight: Weight) -> Weight { + // we'll need at least to read outbound lane state, kill a message and update lane state + let db_weight = T::DbWeight::get(); + if !remaining_weight.all_gte(db_weight.reads_writes(1, 2)) { + return Weight::zero() + } + + // messages from lane with index `i` in `ActiveOutboundLanes` are pruned when + // `System::block_number() % lanes.len() == i`. Otherwise we need to read lane states on + // every block, wasting the whole `remaining_weight` for nothing and causing starvation + // of the last lane pruning + let active_lanes = T::ActiveOutboundLanes::get(); + let active_lanes_len = (active_lanes.len() as u32).into(); + let active_lane_index = u32::unique_saturated_from( + frame_system::Pallet::::block_number() % active_lanes_len, + ); + let active_lane_id = active_lanes[active_lane_index as usize]; + + // first db read - outbound lane state + let mut active_lane = outbound_lane::(active_lane_id); + let mut used_weight = db_weight.reads(1); + // and here we'll have writes + used_weight += active_lane.prune_messages(db_weight, remaining_weight - used_weight); + + // we already checked we have enough `remaining_weight` to cover this `used_weight` + used_weight + } + } + + #[pallet::call] + impl, I: 'static> Pallet { + /// Change `PalletOwner`. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(0)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { + >::set_owner(origin, new_owner) + } + + /// Halt or resume all/some pallet operations. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(1)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + operating_mode: MessagesOperatingMode, + ) -> DispatchResult { + >::set_operating_mode(origin, operating_mode) + } + + /// Receive messages proof from bridged chain. + /// + /// The weight of the call assumes that the transaction always brings outbound lane + /// state update. Because of that, the submitter (relayer) has no benefit of not including + /// this data in the transaction, so reward confirmations lags should be minimal. + /// + /// The call fails if: + /// + /// - the pallet is halted; + /// + /// - the call origin is not `Signed(_)`; + /// + /// - there are too many messages in the proof; + /// + /// - the proof verification procedure returns an error - e.g. because header used to craft + /// proof is not imported by the associated finality pallet; + /// + /// - the `dispatch_weight` argument is not sufficient to dispatch all bundled messages. + /// + /// The call may succeed, but some messages may not be delivered e.g. if they are not fit + /// into the unrewarded relayers vector. + #[pallet::call_index(2)] + #[pallet::weight(T::WeightInfo::receive_messages_proof_weight(proof, *messages_count, *dispatch_weight))] + pub fn receive_messages_proof( + origin: OriginFor, + relayer_id_at_bridged_chain: T::InboundRelayer, + proof: MessagesProofOf, + messages_count: u32, + dispatch_weight: Weight, + ) -> DispatchResultWithPostInfo { + Self::ensure_not_halted().map_err(Error::::BridgeModule)?; + let relayer_id_at_this_chain = ensure_signed(origin)?; + + // reject transactions that are declaring too many messages + ensure!( + MessageNonce::from(messages_count) <= T::MaxUnconfirmedMessagesAtInboundLane::get(), + Error::::TooManyMessagesInTheProof + ); + + // why do we need to know the weight of this (`receive_messages_proof`) call? Because + // we may want to return some funds for not-dispatching (or partially dispatching) some + // messages to the call origin (relayer). And this is done by returning actual weight + // from the call. But we only know dispatch weight of every messages. So to refund + // relayer because we have not dispatched Message, we need to: + // + // ActualWeight = DeclaredWeight - Message.DispatchWeight + // + // The DeclaredWeight is exactly what's computed here. Unfortunately it is impossible + // to get pre-computed value (and it has been already computed by the executive). + let declared_weight = T::WeightInfo::receive_messages_proof_weight( + &proof, + messages_count, + dispatch_weight, + ); + let mut actual_weight = declared_weight; + + // verify messages proof && convert proof into messages + let messages = verify_and_decode_messages_proof::< + T::SourceHeaderChain, + T::InboundPayload, + >(proof, messages_count) + .map_err(|err| { + log::trace!(target: LOG_TARGET, "Rejecting invalid messages proof: {:?}", err,); + + Error::::InvalidMessagesProof + })?; + + // dispatch messages and (optionally) update lane(s) state(s) + let mut total_messages = 0; + let mut valid_messages = 0; + let mut messages_received_status = Vec::with_capacity(messages.len()); + let mut dispatch_weight_left = dispatch_weight; + for (lane_id, lane_data) in messages { + let mut lane = inbound_lane::(lane_id); + + // subtract extra storage proof bytes from the actual PoV size - there may be + // less unrewarded relayers than the maximal configured value + let lane_extra_proof_size_bytes = lane.storage().extra_proof_size_bytes(); + actual_weight = actual_weight.set_proof_size( + actual_weight.proof_size().saturating_sub(lane_extra_proof_size_bytes), + ); + + if let Some(lane_state) = lane_data.lane_state { + let updated_latest_confirmed_nonce = lane.receive_state_update(lane_state); + if let Some(updated_latest_confirmed_nonce) = updated_latest_confirmed_nonce { + log::trace!( + target: LOG_TARGET, + "Received lane {:?} state update: latest_confirmed_nonce={}. Unrewarded relayers: {:?}", + lane_id, + updated_latest_confirmed_nonce, + UnrewardedRelayersState::from(&lane.storage().data()), + ); + } + } + + let mut lane_messages_received_status = + ReceivedMessages::new(lane_id, Vec::with_capacity(lane_data.messages.len())); + for mut message in lane_data.messages { + debug_assert_eq!(message.key.lane_id, lane_id); + total_messages += 1; + + // ensure that relayer has declared enough weight for dispatching next message + // on this lane. We can't dispatch lane messages out-of-order, so if declared + // weight is not enough, let's move to next lane + let message_dispatch_weight = T::MessageDispatch::dispatch_weight(&mut message); + if message_dispatch_weight.any_gt(dispatch_weight_left) { + log::trace!( + target: LOG_TARGET, + "Cannot dispatch any more messages on lane {:?}. Weight: declared={}, left={}", + lane_id, + message_dispatch_weight, + dispatch_weight_left, + ); + + fail!(Error::::InsufficientDispatchWeight); + } + + let receival_result = lane.receive_message::( + &relayer_id_at_bridged_chain, + message.key.nonce, + message.data, + ); + + // note that we're returning unspent weight to relayer even if message has been + // rejected by the lane. This allows relayers to submit spam transactions with + // e.g. the same set of already delivered messages over and over again, without + // losing funds for messages dispatch. But keep in mind that relayer pays base + // delivery transaction cost anyway. And base cost covers everything except + // dispatch, so we have a balance here. + let unspent_weight = match &receival_result { + ReceivalResult::Dispatched(dispatch_result) => { + valid_messages += 1; + dispatch_result.unspent_weight + }, + ReceivalResult::InvalidNonce | + ReceivalResult::TooManyUnrewardedRelayers | + ReceivalResult::TooManyUnconfirmedMessages => message_dispatch_weight, + }; + lane_messages_received_status.push(message.key.nonce, receival_result); + + let unspent_weight = unspent_weight.min(message_dispatch_weight); + dispatch_weight_left -= message_dispatch_weight - unspent_weight; + actual_weight = actual_weight.saturating_sub(unspent_weight); + } + + messages_received_status.push(lane_messages_received_status); + } + + // let's now deal with relayer payments + T::DeliveryPayments::pay_reward( + relayer_id_at_this_chain, + total_messages, + valid_messages, + actual_weight, + ); + + log::debug!( + target: LOG_TARGET, + "Received messages: total={}, valid={}. Weight used: {}/{}.", + total_messages, + valid_messages, + actual_weight, + declared_weight, + ); + + Self::deposit_event(Event::MessagesReceived(messages_received_status)); + + Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes }) + } + + /// Receive messages delivery proof from bridged chain. + #[pallet::call_index(3)] + #[pallet::weight(T::WeightInfo::receive_messages_delivery_proof_weight( + proof, + relayers_state, + ))] + pub fn receive_messages_delivery_proof( + origin: OriginFor, + proof: MessagesDeliveryProofOf, + mut relayers_state: UnrewardedRelayersState, + ) -> DispatchResultWithPostInfo { + Self::ensure_not_halted().map_err(Error::::BridgeModule)?; + + let proof_size = proof.size(); + let confirmation_relayer = ensure_signed(origin)?; + let (lane_id, lane_data) = T::TargetHeaderChain::verify_messages_delivery_proof(proof) + .map_err(|err| { + log::trace!( + target: LOG_TARGET, + "Rejecting invalid messages delivery proof: {:?}", + err, + ); + + Error::::InvalidMessagesDeliveryProof + })?; + + // verify that the relayer has declared correct `lane_data::relayers` state + // (we only care about total number of entries and messages, because this affects call + // weight) + ensure!( + total_unrewarded_messages(&lane_data.relayers).unwrap_or(MessageNonce::MAX) == + relayers_state.total_messages && + lane_data.relayers.len() as MessageNonce == + relayers_state.unrewarded_relayer_entries, + Error::::InvalidUnrewardedRelayersState + ); + // the `last_delivered_nonce` field may also be used by the signed extension. Even + // though providing wrong value isn't critical, let's also check it here. + ensure!( + lane_data.last_delivered_nonce() == relayers_state.last_delivered_nonce, + Error::::InvalidUnrewardedRelayersState + ); + + // mark messages as delivered + let mut lane = outbound_lane::(lane_id); + let last_delivered_nonce = lane_data.last_delivered_nonce(); + let confirmed_messages = match lane.confirm_delivery( + relayers_state.total_messages, + last_delivered_nonce, + &lane_data.relayers, + ) { + ReceivalConfirmationResult::ConfirmedMessages(confirmed_messages) => + Some(confirmed_messages), + ReceivalConfirmationResult::NoNewConfirmations => None, + ReceivalConfirmationResult::TryingToConfirmMoreMessagesThanExpected( + to_confirm_messages_count, + ) => { + log::trace!( + target: LOG_TARGET, + "Messages delivery proof contains too many messages to confirm: {} vs declared {}", + to_confirm_messages_count, + relayers_state.total_messages, + ); + + fail!(Error::::TryingToConfirmMoreMessagesThanExpected); + }, + error => { + log::trace!( + target: LOG_TARGET, + "Messages delivery proof contains invalid unrewarded relayers vec: {:?}", + error, + ); + + fail!(Error::::InvalidUnrewardedRelayers); + }, + }; + + if let Some(confirmed_messages) = confirmed_messages { + // emit 'delivered' event + let received_range = confirmed_messages.begin..=confirmed_messages.end; + Self::deposit_event(Event::MessagesDelivered { + lane_id, + messages: confirmed_messages, + }); + + // if some new messages have been confirmed, reward relayers + let actually_rewarded_relayers = T::DeliveryConfirmationPayments::pay_reward( + lane_id, + lane_data.relayers, + &confirmation_relayer, + &received_range, + ); + + // update relayers state with actual numbers to compute actual weight below + relayers_state.unrewarded_relayer_entries = sp_std::cmp::min( + relayers_state.unrewarded_relayer_entries, + actually_rewarded_relayers, + ); + relayers_state.total_messages = sp_std::cmp::min( + relayers_state.total_messages, + received_range.checked_len().unwrap_or(MessageNonce::MAX), + ); + }; + + log::trace!( + target: LOG_TARGET, + "Received messages delivery proof up to (and including) {} at lane {:?}", + last_delivered_nonce, + lane_id, + ); + + // because of lags, the inbound lane state (`lane_data`) may have entries for + // already rewarded relayers and messages (if all entries are duplicated, then + // this transaction must be filtered out by our signed extension) + let actual_weight = T::WeightInfo::receive_messages_delivery_proof_weight( + &PreComputedSize(proof_size as usize), + &relayers_state, + ); + + Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes }) + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event, I: 'static = ()> { + /// Message has been accepted and is waiting to be delivered. + MessageAccepted { lane_id: LaneId, nonce: MessageNonce }, + /// Messages have been received from the bridged chain. + MessagesReceived( + Vec::DispatchLevelResult>>, + ), + /// Messages in the inclusive range have been delivered to the bridged chain. + MessagesDelivered { lane_id: LaneId, messages: DeliveredMessages }, + } + + #[pallet::error] + pub enum Error { + /// Pallet is not in Normal operating mode. + NotOperatingNormally, + /// The outbound lane is inactive. + InactiveOutboundLane, + /// The message is too large to be sent over the bridge. + MessageIsTooLarge, + /// Message has been treated as invalid by chain verifier. + MessageRejectedByChainVerifier, + /// Message has been treated as invalid by lane verifier. + MessageRejectedByLaneVerifier, + /// Submitter has failed to pay fee for delivering and dispatching messages. + FailedToWithdrawMessageFee, + /// The transaction brings too many messages. + TooManyMessagesInTheProof, + /// Invalid messages has been submitted. + InvalidMessagesProof, + /// Invalid messages delivery proof has been submitted. + InvalidMessagesDeliveryProof, + /// The bridged chain has invalid `UnrewardedRelayers` in its storage (fatal for the lane). + InvalidUnrewardedRelayers, + /// The relayer has declared invalid unrewarded relayers state in the + /// `receive_messages_delivery_proof` call. + InvalidUnrewardedRelayersState, + /// The cumulative dispatch weight, passed by relayer is not enough to cover dispatch + /// of all bundled messages. + InsufficientDispatchWeight, + /// The message someone is trying to work with (i.e. increase fee) is not yet sent. + MessageIsNotYetSent, + /// The number of actually confirmed messages is going to be larger than the number of + /// messages in the proof. This may mean that this or bridged chain storage is corrupted. + TryingToConfirmMoreMessagesThanExpected, + /// Error generated by the `OwnedBridgeModule` trait. + BridgeModule(bp_runtime::OwnedBridgeModuleError), + } + + /// Optional pallet owner. + /// + /// Pallet owner has a right to halt all pallet operations and then resume it. If it is + /// `None`, then there are no direct ways to halt/resume pallet operations, but other + /// runtime methods may still be used to do that (i.e. democracy::referendum to update halt + /// flag directly or call the `halt_operations`). + #[pallet::storage] + #[pallet::getter(fn module_owner)] + pub type PalletOwner, I: 'static = ()> = StorageValue<_, T::AccountId>; + + /// The current operating mode of the pallet. + /// + /// Depending on the mode either all, some, or no transactions will be allowed. + #[pallet::storage] + #[pallet::getter(fn operating_mode)] + pub type PalletOperatingMode, I: 'static = ()> = + StorageValue<_, MessagesOperatingMode, ValueQuery>; + + /// Map of lane id => inbound lane data. + #[pallet::storage] + pub type InboundLanes, I: 'static = ()> = + StorageMap<_, Blake2_128Concat, LaneId, StoredInboundLaneData, ValueQuery>; + + /// Map of lane id => outbound lane data. + #[pallet::storage] + pub type OutboundLanes, I: 'static = ()> = StorageMap< + Hasher = Blake2_128Concat, + Key = LaneId, + Value = OutboundLaneData, + QueryKind = ValueQuery, + OnEmpty = GetDefault, + MaxValues = MaybeOutboundLanesCount, + >; + + /// All queued outbound messages. + #[pallet::storage] + pub type OutboundMessages, I: 'static = ()> = + StorageMap<_, Blake2_128Concat, MessageKey, StoredMessagePayload>; + + #[pallet::genesis_config] + pub struct GenesisConfig, I: 'static = ()> { + /// Initial pallet operating mode. + pub operating_mode: MessagesOperatingMode, + /// Initial pallet owner. + pub owner: Option, + /// Dummy marker. + pub phantom: sp_std::marker::PhantomData, + } + + #[cfg(feature = "std")] + impl, I: 'static> Default for GenesisConfig { + fn default() -> Self { + Self { + operating_mode: Default::default(), + owner: Default::default(), + phantom: Default::default(), + } + } + } + + #[pallet::genesis_build] + impl, I: 'static> GenesisBuild for GenesisConfig { + fn build(&self) { + PalletOperatingMode::::put(self.operating_mode); + if let Some(ref owner) = self.owner { + PalletOwner::::put(owner); + } + } + } + + impl, I: 'static> Pallet { + /// Get stored data of the outbound message with given nonce. + pub fn outbound_message_data(lane: LaneId, nonce: MessageNonce) -> Option { + OutboundMessages::::get(MessageKey { lane_id: lane, nonce }).map(Into::into) + } + + /// Prepare data, related to given inbound message. + pub fn inbound_message_data( + lane: LaneId, + payload: MessagePayload, + outbound_details: OutboundMessageDetails, + ) -> InboundMessageDetails { + let mut dispatch_message = DispatchMessage { + key: MessageKey { lane_id: lane, nonce: outbound_details.nonce }, + data: payload.into(), + }; + InboundMessageDetails { + dispatch_weight: T::MessageDispatch::dispatch_weight(&mut dispatch_message), + } + } + + /// Return inbound lane data. + pub fn inbound_lane_data(lane: LaneId) -> InboundLaneData { + InboundLanes::::get(lane).0 + } + } + + /// Get-parameter that returns number of active outbound lanes that the pallet maintains. + pub struct MaybeOutboundLanesCount(PhantomData<(T, I)>); + + impl, I: 'static> Get> for MaybeOutboundLanesCount { + fn get() -> Option { + Some(T::ActiveOutboundLanes::get().len() as u32) + } + } +} + +impl bp_messages::source_chain::MessagesBridge + for Pallet +where + T: Config, + I: 'static, +{ + type Error = sp_runtime::DispatchErrorWithPostInfo; + + fn send_message( + sender: T::RuntimeOrigin, + lane: LaneId, + message: T::OutboundPayload, + ) -> Result { + crate::send_message::(sender, lane, message) + } +} + +/// Function that actually sends message. +fn send_message, I: 'static>( + submitter: T::RuntimeOrigin, + lane_id: LaneId, + payload: T::OutboundPayload, +) -> sp_std::result::Result< + SendMessageArtifacts, + sp_runtime::DispatchErrorWithPostInfo, +> { + ensure_normal_operating_mode::()?; + + // let's check if outbound lane is active + ensure!(T::ActiveOutboundLanes::get().contains(&lane_id), Error::::InactiveOutboundLane,); + + // let's first check if message can be delivered to target chain + T::TargetHeaderChain::verify_message(&payload).map_err(|err| { + log::trace!( + target: LOG_TARGET, + "Message to lane {:?} is rejected by target chain: {:?}", + lane_id, + err, + ); + + Error::::MessageRejectedByChainVerifier + })?; + + // now let's enforce any additional lane rules + let mut lane = outbound_lane::(lane_id); + T::LaneMessageVerifier::verify_message(&submitter, &lane_id, &lane.data(), &payload).map_err( + |err| { + log::trace!( + target: LOG_TARGET, + "Message to lane {:?} is rejected by lane verifier: {:?}", + lane_id, + err, + ); + + Error::::MessageRejectedByLaneVerifier + }, + )?; + + // finally, save message in outbound storage and emit event + let encoded_payload = payload.encode(); + let encoded_payload_len = encoded_payload.len(); + ensure!( + encoded_payload_len <= T::MaximalOutboundPayloadSize::get() as usize, + Error::::MessageIsTooLarge + ); + let nonce = lane.send_message(encoded_payload); + + log::trace!( + target: LOG_TARGET, + "Accepted message {} to lane {:?}. Message size: {:?}", + nonce, + lane_id, + encoded_payload_len, + ); + + Pallet::::deposit_event(Event::MessageAccepted { lane_id, nonce }); + + Ok(SendMessageArtifacts { nonce }) +} + +/// Ensure that the pallet is in normal operational mode. +fn ensure_normal_operating_mode, I: 'static>() -> Result<(), Error> { + if PalletOperatingMode::::get() == + MessagesOperatingMode::Basic(BasicOperatingMode::Normal) + { + return Ok(()) + } + + Err(Error::::NotOperatingNormally) +} + +/// Creates new inbound lane object, backed by runtime storage. +fn inbound_lane, I: 'static>( + lane_id: LaneId, +) -> InboundLane> { + InboundLane::new(inbound_lane_storage::(lane_id)) +} + +/// Creates new runtime inbound lane storage. +fn inbound_lane_storage, I: 'static>( + lane_id: LaneId, +) -> RuntimeInboundLaneStorage { + RuntimeInboundLaneStorage { + lane_id, + cached_data: RefCell::new(None), + _phantom: Default::default(), + } +} + +/// Creates new outbound lane object, backed by runtime storage. +fn outbound_lane, I: 'static>( + lane_id: LaneId, +) -> OutboundLane> { + OutboundLane::new(RuntimeOutboundLaneStorage { lane_id, _phantom: Default::default() }) +} + +/// Runtime inbound lane storage. +struct RuntimeInboundLaneStorage, I: 'static = ()> { + lane_id: LaneId, + cached_data: RefCell>>, + _phantom: PhantomData, +} + +impl, I: 'static> RuntimeInboundLaneStorage { + /// Returns number of bytes that may be subtracted from the PoV component of + /// `receive_messages_proof` call, because the actual inbound lane state is smaller than the + /// maximal configured. + /// + /// Maximal inbound lane state set size is configured by the + /// `MaxUnrewardedRelayerEntriesAtInboundLane` constant from the pallet configuration. The PoV + /// of the call includes the maximal size of inbound lane state. If the actual size is smaller, + /// we may subtract extra bytes from this component. + pub fn extra_proof_size_bytes(&self) -> u64 { + let max_encoded_len = StoredInboundLaneData::::max_encoded_len(); + let relayers_count = self.data().relayers.len(); + let actual_encoded_len = + InboundLaneData::::encoded_size_hint(relayers_count) + .unwrap_or(usize::MAX); + max_encoded_len.saturating_sub(actual_encoded_len) as _ + } +} + +impl, I: 'static> InboundLaneStorage for RuntimeInboundLaneStorage { + type Relayer = T::InboundRelayer; + + fn id(&self) -> LaneId { + self.lane_id + } + + fn max_unrewarded_relayer_entries(&self) -> MessageNonce { + T::MaxUnrewardedRelayerEntriesAtInboundLane::get() + } + + fn max_unconfirmed_messages(&self) -> MessageNonce { + T::MaxUnconfirmedMessagesAtInboundLane::get() + } + + fn data(&self) -> InboundLaneData { + match self.cached_data.clone().into_inner() { + Some(data) => data, + None => { + let data: InboundLaneData = + InboundLanes::::get(self.lane_id).into(); + *self.cached_data.try_borrow_mut().expect( + "we're in the single-threaded environment;\ + we have no recursive borrows; qed", + ) = Some(data.clone()); + data + }, + } + } + + fn set_data(&mut self, data: InboundLaneData) { + *self.cached_data.try_borrow_mut().expect( + "we're in the single-threaded environment;\ + we have no recursive borrows; qed", + ) = Some(data.clone()); + InboundLanes::::insert(self.lane_id, StoredInboundLaneData::(data)) + } +} + +/// Runtime outbound lane storage. +struct RuntimeOutboundLaneStorage { + lane_id: LaneId, + _phantom: PhantomData<(T, I)>, +} + +impl, I: 'static> OutboundLaneStorage for RuntimeOutboundLaneStorage { + fn id(&self) -> LaneId { + self.lane_id + } + + fn data(&self) -> OutboundLaneData { + OutboundLanes::::get(self.lane_id) + } + + fn set_data(&mut self, data: OutboundLaneData) { + OutboundLanes::::insert(self.lane_id, data) + } + + #[cfg(test)] + fn message(&self, nonce: &MessageNonce) -> Option { + OutboundMessages::::get(MessageKey { lane_id: self.lane_id, nonce: *nonce }) + .map(Into::into) + } + + fn save_message(&mut self, nonce: MessageNonce, message_payload: MessagePayload) { + OutboundMessages::::insert( + MessageKey { lane_id: self.lane_id, nonce }, + StoredMessagePayload::::try_from(message_payload).expect( + "save_message is called after all checks in send_message; \ + send_message checks message size; \ + qed", + ), + ); + } + + fn remove_message(&mut self, nonce: &MessageNonce) { + OutboundMessages::::remove(MessageKey { lane_id: self.lane_id, nonce: *nonce }); + } +} + +/// Verify messages proof and return proved messages with decoded payload. +fn verify_and_decode_messages_proof( + proof: Chain::MessagesProof, + messages_count: u32, +) -> Result>, Chain::Error> { + // `receive_messages_proof` weight formula and `MaxUnconfirmedMessagesAtInboundLane` check + // guarantees that the `message_count` is sane and Vec may be allocated. + // (tx with too many messages will either be rejected from the pool, or will fail earlier) + Chain::verify_messages_proof(proof, messages_count).map(|messages_by_lane| { + messages_by_lane + .into_iter() + .map(|(lane, lane_data)| { + ( + lane, + ProvedLaneMessages { + lane_state: lane_data.lane_state, + messages: lane_data.messages.into_iter().map(Into::into).collect(), + }, + ) + }) + .collect() + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::{ + inbound_unrewarded_relayers_state, message, message_payload, run_test, unrewarded_relayer, + AccountId, DbWeight, RuntimeEvent as TestEvent, RuntimeOrigin, + TestDeliveryConfirmationPayments, TestDeliveryPayments, TestMessagesDeliveryProof, + TestMessagesProof, TestRelayer, TestRuntime, TestWeightInfo, MAX_OUTBOUND_PAYLOAD_SIZE, + PAYLOAD_REJECTED_BY_TARGET_CHAIN, REGULAR_PAYLOAD, TEST_LANE_ID, TEST_LANE_ID_2, + TEST_LANE_ID_3, TEST_RELAYER_A, TEST_RELAYER_B, + }; + use bp_messages::{BridgeMessagesCall, UnrewardedRelayer, UnrewardedRelayersState}; + use bp_test_utils::generate_owned_bridge_module_tests; + use frame_support::{ + assert_noop, assert_ok, + dispatch::Pays, + storage::generator::{StorageMap, StorageValue}, + traits::Hooks, + weights::Weight, + }; + use frame_system::{EventRecord, Pallet as System, Phase}; + use sp_runtime::DispatchError; + + fn get_ready_for_events() { + System::::set_block_number(1); + System::::reset_events(); + } + + fn send_regular_message() { + get_ready_for_events(); + + let message_nonce = + outbound_lane::(TEST_LANE_ID).data().latest_generated_nonce + 1; + send_message::(RuntimeOrigin::signed(1), TEST_LANE_ID, REGULAR_PAYLOAD) + .expect("send_message has failed"); + + // check event with assigned nonce + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Messages(Event::MessageAccepted { + lane_id: TEST_LANE_ID, + nonce: message_nonce + }), + topics: vec![], + }], + ); + } + + fn receive_messages_delivery_proof() { + System::::set_block_number(1); + System::::reset_events(); + + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![UnrewardedRelayer { + relayer: 0, + messages: DeliveredMessages::new(1), + }] + .into_iter() + .collect(), + }, + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + last_delivered_nonce: 1, + ..Default::default() + }, + )); + + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Messages(Event::MessagesDelivered { + lane_id: TEST_LANE_ID, + messages: DeliveredMessages::new(1), + }), + topics: vec![], + }], + ); + } + + #[test] + fn pallet_rejects_transactions_if_halted() { + run_test(|| { + // send message first to be able to check that delivery_proof fails later + send_regular_message(); + + PalletOperatingMode::::put(MessagesOperatingMode::Basic( + BasicOperatingMode::Halted, + )); + + assert_noop!( + send_message::( + RuntimeOrigin::signed(1), + TEST_LANE_ID, + REGULAR_PAYLOAD, + ), + Error::::NotOperatingNormally, + ); + + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![message(2, REGULAR_PAYLOAD)]).into(), + 1, + REGULAR_PAYLOAD.declared_weight, + ), + Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted), + ); + + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] + .into_iter() + .collect(), + }, + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + ), + Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted), + ); + }); + } + + #[test] + fn pallet_rejects_new_messages_in_rejecting_outbound_messages_operating_mode() { + run_test(|| { + // send message first to be able to check that delivery_proof fails later + send_regular_message(); + + PalletOperatingMode::::put( + MessagesOperatingMode::RejectingOutboundMessages, + ); + + assert_noop!( + send_message::( + RuntimeOrigin::signed(1), + TEST_LANE_ID, + REGULAR_PAYLOAD, + ), + Error::::NotOperatingNormally, + ); + + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), + 1, + REGULAR_PAYLOAD.declared_weight, + ),); + + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] + .into_iter() + .collect(), + }, + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + )); + }); + } + + #[test] + fn send_message_works() { + run_test(|| { + send_regular_message(); + }); + } + + #[test] + fn send_message_rejects_too_large_message() { + run_test(|| { + let mut message_payload = message_payload(1, 0); + // the payload isn't simply extra, so it'll definitely overflow + // `MAX_OUTBOUND_PAYLOAD_SIZE` if we add `MAX_OUTBOUND_PAYLOAD_SIZE` bytes to extra + message_payload + .extra + .extend_from_slice(&[0u8; MAX_OUTBOUND_PAYLOAD_SIZE as usize]); + assert_noop!( + send_message::( + RuntimeOrigin::signed(1), + TEST_LANE_ID, + message_payload.clone(), + ), + Error::::MessageIsTooLarge, + ); + + // let's check that we're able to send `MAX_OUTBOUND_PAYLOAD_SIZE` messages + while message_payload.encoded_size() as u32 > MAX_OUTBOUND_PAYLOAD_SIZE { + message_payload.extra.pop(); + } + assert_eq!(message_payload.encoded_size() as u32, MAX_OUTBOUND_PAYLOAD_SIZE); + assert_ok!(send_message::( + RuntimeOrigin::signed(1), + TEST_LANE_ID, + message_payload, + ),); + }) + } + + #[test] + fn chain_verifier_rejects_invalid_message_in_send_message() { + run_test(|| { + // messages with this payload are rejected by target chain verifier + assert_noop!( + send_message::( + RuntimeOrigin::signed(1), + TEST_LANE_ID, + PAYLOAD_REJECTED_BY_TARGET_CHAIN, + ), + Error::::MessageRejectedByChainVerifier, + ); + }); + } + + #[test] + fn lane_verifier_rejects_invalid_message_in_send_message() { + run_test(|| { + // messages with zero fee are rejected by lane verifier + let mut message = REGULAR_PAYLOAD; + message.reject_by_lane_verifier = true; + assert_noop!( + send_message::(RuntimeOrigin::signed(1), TEST_LANE_ID, message,), + Error::::MessageRejectedByLaneVerifier, + ); + }); + } + + #[test] + fn receive_messages_proof_works() { + run_test(|| { + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), + 1, + REGULAR_PAYLOAD.declared_weight, + )); + + assert_eq!(InboundLanes::::get(TEST_LANE_ID).0.last_delivered_nonce(), 1); + + assert!(TestDeliveryPayments::is_reward_paid(1)); + }); + } + + #[test] + fn receive_messages_proof_updates_confirmed_message_nonce() { + run_test(|| { + // say we have received 10 messages && last confirmed message is 8 + InboundLanes::::insert( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 8, + relayers: vec![ + unrewarded_relayer(9, 9, TEST_RELAYER_A), + unrewarded_relayer(10, 10, TEST_RELAYER_B), + ] + .into_iter() + .collect(), + }, + ); + assert_eq!( + inbound_unrewarded_relayers_state(TEST_LANE_ID), + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + messages_in_oldest_entry: 1, + total_messages: 2, + last_delivered_nonce: 10, + }, + ); + + // message proof includes outbound lane state with latest confirmed message updated to 9 + let mut message_proof: TestMessagesProof = + Ok(vec![message(11, REGULAR_PAYLOAD)]).into(); + message_proof.result.as_mut().unwrap()[0].1.lane_state = + Some(OutboundLaneData { latest_received_nonce: 9, ..Default::default() }); + + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + message_proof, + 1, + REGULAR_PAYLOAD.declared_weight, + )); + + assert_eq!( + InboundLanes::::get(TEST_LANE_ID).0, + InboundLaneData { + last_confirmed_nonce: 9, + relayers: vec![ + unrewarded_relayer(10, 10, TEST_RELAYER_B), + unrewarded_relayer(11, 11, TEST_RELAYER_A) + ] + .into_iter() + .collect(), + }, + ); + assert_eq!( + inbound_unrewarded_relayers_state(TEST_LANE_ID), + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + messages_in_oldest_entry: 1, + total_messages: 2, + last_delivered_nonce: 11, + }, + ); + }); + } + + #[test] + fn receive_messages_proof_does_not_accept_message_if_dispatch_weight_is_not_enough() { + run_test(|| { + let mut declared_weight = REGULAR_PAYLOAD.declared_weight; + *declared_weight.ref_time_mut() -= 1; + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), + 1, + declared_weight, + ), + Error::::InsufficientDispatchWeight + ); + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 0); + }); + } + + #[test] + fn receive_messages_proof_rejects_invalid_proof() { + run_test(|| { + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Err(()).into(), + 1, + Weight::zero(), + ), + Error::::InvalidMessagesProof, + ); + }); + } + + #[test] + fn receive_messages_proof_rejects_proof_with_too_many_messages() { + run_test(|| { + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), + u32::MAX, + Weight::zero(), + ), + Error::::TooManyMessagesInTheProof, + ); + }); + } + + #[test] + fn receive_messages_delivery_proof_works() { + run_test(|| { + send_regular_message(); + receive_messages_delivery_proof(); + + assert_eq!( + OutboundLanes::::get(TEST_LANE_ID).latest_received_nonce, + 1, + ); + }); + } + + #[test] + fn receive_messages_delivery_proof_rewards_relayers() { + run_test(|| { + assert_ok!(send_message::( + RuntimeOrigin::signed(1), + TEST_LANE_ID, + REGULAR_PAYLOAD, + )); + assert_ok!(send_message::( + RuntimeOrigin::signed(1), + TEST_LANE_ID, + REGULAR_PAYLOAD, + )); + + // this reports delivery of message 1 => reward is paid to TEST_RELAYER_A + let single_message_delivery_proof = TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)].into_iter().collect(), + ..Default::default() + }, + ))); + let single_message_delivery_proof_size = single_message_delivery_proof.size(); + let result = Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + single_message_delivery_proof, + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + last_delivered_nonce: 1, + ..Default::default() + }, + ); + assert_ok!(result); + assert_eq!( + result.unwrap().actual_weight.unwrap(), + TestWeightInfo::receive_messages_delivery_proof_weight( + &PreComputedSize(single_message_delivery_proof_size as _), + &UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + ..Default::default() + }, + ) + ); + assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1)); + assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1)); + + // this reports delivery of both message 1 and message 2 => reward is paid only to + // TEST_RELAYER_B + let two_messages_delivery_proof = TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B), + ] + .into_iter() + .collect(), + ..Default::default() + }, + ))); + let two_messages_delivery_proof_size = two_messages_delivery_proof.size(); + let result = Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + two_messages_delivery_proof, + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + total_messages: 2, + last_delivered_nonce: 2, + ..Default::default() + }, + ); + assert_ok!(result); + // even though the pre-dispatch weight was for two messages, the actual weight is + // for single message only + assert_eq!( + result.unwrap().actual_weight.unwrap(), + TestWeightInfo::receive_messages_delivery_proof_weight( + &PreComputedSize(two_messages_delivery_proof_size as _), + &UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + ..Default::default() + }, + ) + ); + assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1)); + assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1)); + }); + } + + #[test] + fn receive_messages_delivery_proof_rejects_invalid_proof() { + run_test(|| { + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Err(())), + Default::default(), + ), + Error::::InvalidMessagesDeliveryProof, + ); + }); + } + + #[test] + fn receive_messages_delivery_proof_rejects_proof_if_declared_relayers_state_is_invalid() { + run_test(|| { + // when number of relayers entries is invalid + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B) + ] + .into_iter() + .collect(), + ..Default::default() + } + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 2, + last_delivered_nonce: 2, + ..Default::default() + }, + ), + Error::::InvalidUnrewardedRelayersState, + ); + + // when number of messages is invalid + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B) + ] + .into_iter() + .collect(), + ..Default::default() + } + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + total_messages: 1, + last_delivered_nonce: 2, + ..Default::default() + }, + ), + Error::::InvalidUnrewardedRelayersState, + ); + + // when last delivered nonce is invalid + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B) + ] + .into_iter() + .collect(), + ..Default::default() + } + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + total_messages: 2, + last_delivered_nonce: 8, + ..Default::default() + }, + ), + Error::::InvalidUnrewardedRelayersState, + ); + }); + } + + #[test] + fn receive_messages_accepts_single_message_with_invalid_payload() { + run_test(|| { + let mut invalid_message = message(1, REGULAR_PAYLOAD); + invalid_message.payload = Vec::new(); + + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![invalid_message]).into(), + 1, + Weight::zero(), /* weight may be zero in this case (all messages are + * improperly encoded) */ + ),); + + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 1,); + }); + } + + #[test] + fn receive_messages_accepts_batch_with_message_with_invalid_payload() { + run_test(|| { + let mut invalid_message = message(2, REGULAR_PAYLOAD); + invalid_message.payload = Vec::new(); + + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok( + vec![message(1, REGULAR_PAYLOAD), invalid_message, message(3, REGULAR_PAYLOAD),] + ) + .into(), + 3, + REGULAR_PAYLOAD.declared_weight + REGULAR_PAYLOAD.declared_weight, + ),); + + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 3,); + }); + } + + #[test] + fn actual_dispatch_weight_does_not_overlow() { + run_test(|| { + let message1 = message(1, message_payload(0, u64::MAX / 2)); + let message2 = message(2, message_payload(0, u64::MAX / 2)); + let message3 = message(3, message_payload(0, u64::MAX / 2)); + + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + // this may cause overflow if source chain storage is invalid + Ok(vec![message1, message2, message3]).into(), + 3, + Weight::MAX, + ), + Error::::InsufficientDispatchWeight + ); + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 0); + }); + } + + #[test] + fn ref_time_refund_from_receive_messages_proof_works() { + run_test(|| { + fn submit_with_unspent_weight( + nonce: MessageNonce, + unspent_weight: u64, + ) -> (Weight, Weight) { + let mut payload = REGULAR_PAYLOAD; + *payload.dispatch_result.unspent_weight.ref_time_mut() = unspent_weight; + let proof = Ok(vec![message(nonce, payload)]).into(); + let messages_count = 1; + let pre_dispatch_weight = + ::WeightInfo::receive_messages_proof_weight( + &proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ); + let result = Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ) + .expect("delivery has failed"); + let post_dispatch_weight = + result.actual_weight.expect("receive_messages_proof always returns Some"); + + // message delivery transactions are never free + assert_eq!(result.pays_fee, Pays::Yes); + + (pre_dispatch_weight, post_dispatch_weight) + } + + // when dispatch is returning `unspent_weight < declared_weight` + let (pre, post) = submit_with_unspent_weight(1, 1); + assert_eq!(post.ref_time(), pre.ref_time() - 1); + + // when dispatch is returning `unspent_weight = declared_weight` + let (pre, post) = + submit_with_unspent_weight(2, REGULAR_PAYLOAD.declared_weight.ref_time()); + assert_eq!( + post.ref_time(), + pre.ref_time() - REGULAR_PAYLOAD.declared_weight.ref_time() + ); + + // when dispatch is returning `unspent_weight > declared_weight` + let (pre, post) = + submit_with_unspent_weight(3, REGULAR_PAYLOAD.declared_weight.ref_time() + 1); + assert_eq!( + post.ref_time(), + pre.ref_time() - REGULAR_PAYLOAD.declared_weight.ref_time() + ); + + // when there's no unspent weight + let (pre, post) = submit_with_unspent_weight(4, 0); + assert_eq!(post.ref_time(), pre.ref_time()); + + // when dispatch is returning `unspent_weight < declared_weight` + let (pre, post) = submit_with_unspent_weight(5, 1); + assert_eq!(post.ref_time(), pre.ref_time() - 1); + }); + } + + #[test] + fn proof_size_refund_from_receive_messages_proof_works() { + run_test(|| { + let max_entries = crate::mock::MaxUnrewardedRelayerEntriesAtInboundLane::get() as usize; + + // if there's maximal number of unrewarded relayer entries at the inbound lane, then + // `proof_size` is unchanged in post-dispatch weight + let proof: TestMessagesProof = Ok(vec![message(101, REGULAR_PAYLOAD)]).into(); + let messages_count = 1; + let pre_dispatch_weight = + ::WeightInfo::receive_messages_proof_weight( + &proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ); + InboundLanes::::insert( + TEST_LANE_ID, + StoredInboundLaneData(InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: 42, + messages: DeliveredMessages { begin: 0, end: 100 } + }; + max_entries + ] + .into_iter() + .collect(), + last_confirmed_nonce: 0, + }), + ); + let post_dispatch_weight = Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof.clone(), + messages_count, + REGULAR_PAYLOAD.declared_weight, + ) + .unwrap() + .actual_weight + .unwrap(); + assert_eq!(post_dispatch_weight.proof_size(), pre_dispatch_weight.proof_size()); + + // if count of unrewarded relayer entries is less than maximal, then some `proof_size` + // must be refunded + InboundLanes::::insert( + TEST_LANE_ID, + StoredInboundLaneData(InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: 42, + messages: DeliveredMessages { begin: 0, end: 100 } + }; + max_entries - 1 + ] + .into_iter() + .collect(), + last_confirmed_nonce: 0, + }), + ); + let post_dispatch_weight = Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ) + .unwrap() + .actual_weight + .unwrap(); + assert!( + post_dispatch_weight.proof_size() < pre_dispatch_weight.proof_size(), + "Expected post-dispatch PoV {} to be less than pre-dispatch PoV {}", + post_dispatch_weight.proof_size(), + pre_dispatch_weight.proof_size(), + ); + }); + } + + #[test] + fn messages_delivered_callbacks_are_called() { + run_test(|| { + send_regular_message(); + send_regular_message(); + send_regular_message(); + + // messages 1+2 are confirmed in 1 tx, message 3 in a separate tx + // dispatch of message 2 has failed + let mut delivered_messages_1_and_2 = DeliveredMessages::new(1); + delivered_messages_1_and_2.note_dispatched_message(); + let messages_1_and_2_proof = Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 0, + relayers: vec![UnrewardedRelayer { + relayer: 0, + messages: delivered_messages_1_and_2.clone(), + }] + .into_iter() + .collect(), + }, + )); + let delivered_message_3 = DeliveredMessages::new(3); + let messages_3_proof = Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 0, + relayers: vec![UnrewardedRelayer { relayer: 0, messages: delivered_message_3 }] + .into_iter() + .collect(), + }, + )); + + // first tx with messages 1+2 + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(messages_1_and_2_proof), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 2, + last_delivered_nonce: 2, + ..Default::default() + }, + )); + // second tx with message 3 + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(messages_3_proof), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + last_delivered_nonce: 3, + ..Default::default() + }, + )); + }); + } + + #[test] + fn receive_messages_delivery_proof_rejects_proof_if_trying_to_confirm_more_messages_than_expected( + ) { + run_test(|| { + // send message first to be able to check that delivery_proof fails later + send_regular_message(); + + // 1) InboundLaneData declares that the `last_confirmed_nonce` is 1; + // 2) InboundLaneData has no entries => `InboundLaneData::last_delivered_nonce()` + // returns `last_confirmed_nonce`; + // 3) it means that we're going to confirm delivery of messages 1..=1; + // 4) so the number of declared messages (see `UnrewardedRelayersState`) is `0` and + // numer of actually confirmed messages is `1`. + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { last_confirmed_nonce: 1, relayers: Default::default() }, + ))), + UnrewardedRelayersState { last_delivered_nonce: 1, ..Default::default() }, + ), + Error::::TryingToConfirmMoreMessagesThanExpected, + ); + }); + } + + #[test] + fn storage_keys_computed_properly() { + assert_eq!( + PalletOperatingMode::::storage_value_final_key().to_vec(), + bp_messages::storage_keys::operating_mode_key("Messages").0, + ); + + assert_eq!( + OutboundMessages::::storage_map_final_key(MessageKey { + lane_id: TEST_LANE_ID, + nonce: 42 + }), + bp_messages::storage_keys::message_key("Messages", &TEST_LANE_ID, 42).0, + ); + + assert_eq!( + OutboundLanes::::storage_map_final_key(TEST_LANE_ID), + bp_messages::storage_keys::outbound_lane_data_key("Messages", &TEST_LANE_ID).0, + ); + + assert_eq!( + InboundLanes::::storage_map_final_key(TEST_LANE_ID), + bp_messages::storage_keys::inbound_lane_data_key("Messages", &TEST_LANE_ID).0, + ); + } + + #[test] + fn inbound_message_details_works() { + run_test(|| { + assert_eq!( + Pallet::::inbound_message_data( + TEST_LANE_ID, + REGULAR_PAYLOAD.encode(), + OutboundMessageDetails { nonce: 0, dispatch_weight: Weight::zero(), size: 0 }, + ), + InboundMessageDetails { dispatch_weight: REGULAR_PAYLOAD.declared_weight }, + ); + }); + } + + #[test] + fn on_idle_callback_respects_remaining_weight() { + run_test(|| { + send_regular_message(); + send_regular_message(); + send_regular_message(); + send_regular_message(); + + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 4, + relayers: vec![unrewarded_relayer(1, 4, TEST_RELAYER_A)] + .into_iter() + .collect(), + }, + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 4, + total_messages: 4, + last_delivered_nonce: 4, + }, + )); + + // all 4 messages may be pruned now + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().latest_received_nonce, + 4 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 1 + ); + System::::set_block_number(2); + + // if passed wight is too low to do anything + let dbw = DbWeight::get(); + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(1, 1)), + Weight::zero(), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 1 + ); + + // if passed wight is enough to prune single message + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(1, 2)), + dbw.reads_writes(1, 2), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 2 + ); + + // if passed wight is enough to prune two more messages + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(1, 3)), + dbw.reads_writes(1, 3), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 4 + ); + + // if passed wight is enough to prune many messages + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(100, 100)), + dbw.reads_writes(1, 2), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 5 + ); + }); + } + + #[test] + fn on_idle_callback_is_rotating_lanes_to_prune() { + run_test(|| { + // send + receive confirmation for lane 1 + send_regular_message(); + receive_messages_delivery_proof(); + // send + receive confirmation for lane 2 + assert_ok!(send_message::( + RuntimeOrigin::signed(1), + TEST_LANE_ID_2, + REGULAR_PAYLOAD, + )); + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID_2, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] + .into_iter() + .collect(), + }, + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + )); + + // nothing is pruned yet + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().latest_received_nonce, + 1 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 1 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().latest_received_nonce, + 1 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, + 1 + ); + + // in block#2.on_idle lane messages of lane 1 are pruned + let dbw = DbWeight::get(); + System::::set_block_number(2); + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(100, 100)), + dbw.reads_writes(1, 2), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 2 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, + 1 + ); + + // in block#3.on_idle lane messages of lane 2 are pruned + System::::set_block_number(3); + + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(100, 100)), + dbw.reads_writes(1, 2), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 2 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, + 2 + ); + }); + } + + #[test] + fn outbound_message_from_unconfigured_lane_is_rejected() { + run_test(|| { + assert_noop!( + send_message::( + RuntimeOrigin::signed(1), + TEST_LANE_ID_3, + REGULAR_PAYLOAD, + ), + Error::::InactiveOutboundLane, + ); + }); + } + + #[test] + fn test_bridge_messages_call_is_correctly_defined() { + let account_id = 1; + let message_proof: TestMessagesProof = Ok(vec![message(1, REGULAR_PAYLOAD)]).into(); + let message_delivery_proof = TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![UnrewardedRelayer { + relayer: 0, + messages: DeliveredMessages::new(1), + }] + .into_iter() + .collect(), + }, + ))); + let unrewarded_relayer_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + last_delivered_nonce: 1, + ..Default::default() + }; + + let direct_receive_messages_proof_call = Call::::receive_messages_proof { + relayer_id_at_bridged_chain: account_id, + proof: message_proof.clone(), + messages_count: 1, + dispatch_weight: REGULAR_PAYLOAD.declared_weight, + }; + let indirect_receive_messages_proof_call = BridgeMessagesCall::< + AccountId, + TestMessagesProof, + TestMessagesDeliveryProof, + >::receive_messages_proof { + relayer_id_at_bridged_chain: account_id, + proof: message_proof, + messages_count: 1, + dispatch_weight: REGULAR_PAYLOAD.declared_weight, + }; + assert_eq!( + direct_receive_messages_proof_call.encode(), + indirect_receive_messages_proof_call.encode() + ); + + let direct_receive_messages_delivery_proof_call = + Call::::receive_messages_delivery_proof { + proof: message_delivery_proof.clone(), + relayers_state: unrewarded_relayer_state.clone(), + }; + let indirect_receive_messages_delivery_proof_call = BridgeMessagesCall::< + AccountId, + TestMessagesProof, + TestMessagesDeliveryProof, + >::receive_messages_delivery_proof { + proof: message_delivery_proof, + relayers_state: unrewarded_relayer_state, + }; + assert_eq!( + direct_receive_messages_delivery_proof_call.encode(), + indirect_receive_messages_delivery_proof_call.encode() + ); + } + + generate_owned_bridge_module_tests!( + MessagesOperatingMode::Basic(BasicOperatingMode::Normal), + MessagesOperatingMode::Basic(BasicOperatingMode::Halted) + ); + + #[test] + fn inbound_storage_extra_proof_size_bytes_works() { + fn relayer_entry() -> UnrewardedRelayer { + UnrewardedRelayer { relayer: 42u64, messages: DeliveredMessages { begin: 0, end: 100 } } + } + + fn storage(relayer_entries: usize) -> RuntimeInboundLaneStorage { + RuntimeInboundLaneStorage { + lane_id: Default::default(), + cached_data: RefCell::new(Some(InboundLaneData { + relayers: vec![relayer_entry(); relayer_entries].into_iter().collect(), + last_confirmed_nonce: 0, + })), + _phantom: Default::default(), + } + } + + let max_entries = crate::mock::MaxUnrewardedRelayerEntriesAtInboundLane::get() as usize; + + // when we have exactly `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers + assert_eq!(storage(max_entries).extra_proof_size_bytes(), 0); + + // when we have less than `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers + assert_eq!( + storage(max_entries - 1).extra_proof_size_bytes(), + relayer_entry().encode().len() as u64 + ); + assert_eq!( + storage(max_entries - 2).extra_proof_size_bytes(), + 2 * relayer_entry().encode().len() as u64 + ); + + // when we have more than `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers + // (shall not happen in practice) + assert_eq!(storage(max_entries + 1).extra_proof_size_bytes(), 0); + } + + #[test] + fn maybe_outbound_lanes_count_returns_correct_value() { + assert_eq!( + MaybeOutboundLanesCount::::get(), + Some(mock::ActiveOutboundLanes::get().len() as u32) + ); + } +} diff --git a/bridges/modules/messages/src/mock.rs b/bridges/modules/messages/src/mock.rs new file mode 100644 index 00000000000..2e45d5b601f --- /dev/null +++ b/bridges/modules/messages/src/mock.rs @@ -0,0 +1,503 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +// From construct_runtime macro +#![allow(clippy::from_over_into)] + +use crate::Config; + +use bp_messages::{ + calc_relayers_rewards, + source_chain::{DeliveryConfirmationPayments, LaneMessageVerifier, TargetHeaderChain}, + target_chain::{ + DeliveryPayments, DispatchMessage, DispatchMessageData, MessageDispatch, + ProvedLaneMessages, ProvedMessages, SourceHeaderChain, + }, + DeliveredMessages, InboundLaneData, LaneId, Message, MessageKey, MessageNonce, MessagePayload, + OutboundLaneData, UnrewardedRelayer, UnrewardedRelayersState, +}; +use bp_runtime::{messages::MessageDispatchResult, Size}; +use codec::{Decode, Encode}; +use frame_support::{ + parameter_types, + traits::ConstU64, + weights::{constants::RocksDbWeight, Weight}, +}; +use scale_info::TypeInfo; +use sp_core::H256; +use sp_runtime::{ + testing::Header as SubstrateHeader, + traits::{BlakeTwo256, ConstU32, IdentityLookup}, + Perbill, +}; +use std::{ + collections::{BTreeMap, VecDeque}, + ops::RangeInclusive, +}; + +pub type AccountId = u64; +pub type Balance = u64; +#[derive(Decode, Encode, Clone, Debug, PartialEq, Eq, TypeInfo)] +pub struct TestPayload { + /// Field that may be used to identify messages. + pub id: u64, + /// Reject this message by lane verifier? + pub reject_by_lane_verifier: bool, + /// Dispatch weight that is declared by the message sender. + pub declared_weight: Weight, + /// Message dispatch result. + /// + /// Note: in correct code `dispatch_result.unspent_weight` will always be <= `declared_weight`, + /// but for test purposes we'll be making it larger than `declared_weight` sometimes. + pub dispatch_result: MessageDispatchResult, + /// Extra bytes that affect payload size. + pub extra: Vec, +} +pub type TestMessageFee = u64; +pub type TestRelayer = u64; +pub type TestDispatchLevelResult = (); + +type Block = frame_system::mocking::MockBlock; +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; + +use crate as pallet_bridge_messages; + +frame_support::construct_runtime! { + pub enum TestRuntime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Call, Event}, + Messages: pallet_bridge_messages::{Pallet, Call, Event}, + } +} + +parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: Weight = Weight::from_parts(1024, 0); + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); +} + +pub type DbWeight = RocksDbWeight; + +impl frame_system::Config for TestRuntime { + type RuntimeOrigin = RuntimeOrigin; + type Index = u64; + type RuntimeCall = RuntimeCall; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = SubstrateHeader; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU64<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type BaseCallFilter = frame_support::traits::Everything; + type SystemWeightInfo = (); + type BlockWeights = (); + type BlockLength = (); + type DbWeight = DbWeight; + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +impl pallet_balances::Config for TestRuntime { + type MaxLocks = (); + type Balance = Balance; + type DustRemoval = (); + type RuntimeEvent = RuntimeEvent; + type ExistentialDeposit = ConstU64<1>; + type AccountStore = frame_system::Pallet; + type WeightInfo = (); + type MaxReserves = (); + type ReserveIdentifier = (); + type HoldIdentifier = (); + type FreezeIdentifier = (); + type MaxHolds = ConstU32<0>; + type MaxFreezes = ConstU32<0>; +} + +parameter_types! { + pub const MaxMessagesToPruneAtOnce: u64 = 10; + pub const MaxUnrewardedRelayerEntriesAtInboundLane: u64 = 16; + pub const MaxUnconfirmedMessagesAtInboundLane: u64 = 128; + pub const TestBridgedChainId: bp_runtime::ChainId = *b"test"; + pub const ActiveOutboundLanes: &'static [LaneId] = &[TEST_LANE_ID, TEST_LANE_ID_2]; +} + +/// weights of messages pallet calls we use in tests. +pub type TestWeightInfo = (); + +impl Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = TestWeightInfo; + type ActiveOutboundLanes = ActiveOutboundLanes; + type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; + type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; + + type MaximalOutboundPayloadSize = frame_support::traits::ConstU32; + type OutboundPayload = TestPayload; + + type InboundPayload = TestPayload; + type InboundRelayer = TestRelayer; + type DeliveryPayments = TestDeliveryPayments; + + type TargetHeaderChain = TestTargetHeaderChain; + type LaneMessageVerifier = TestLaneMessageVerifier; + type DeliveryConfirmationPayments = TestDeliveryConfirmationPayments; + + type SourceHeaderChain = TestSourceHeaderChain; + type MessageDispatch = TestMessageDispatch; + type BridgedChainId = TestBridgedChainId; +} + +#[cfg(feature = "runtime-benchmarks")] +impl crate::benchmarking::Config<()> for TestRuntime { + fn bench_lane_id() -> LaneId { + TEST_LANE_ID + } + + fn prepare_message_proof( + params: crate::benchmarking::MessageProofParams, + ) -> (TestMessagesProof, Weight) { + // in mock run we only care about benchmarks correctness, not the benchmark results + // => ignore size related arguments + let (messages, total_dispatch_weight) = + params.message_nonces.into_iter().map(|n| message(n, REGULAR_PAYLOAD)).fold( + (Vec::new(), Weight::zero()), + |(mut messages, total_dispatch_weight), message| { + let weight = REGULAR_PAYLOAD.declared_weight; + messages.push(message); + (messages, total_dispatch_weight.saturating_add(weight)) + }, + ); + let mut proof: TestMessagesProof = Ok(messages).into(); + proof.result.as_mut().unwrap().get_mut(0).unwrap().1.lane_state = params.outbound_lane_data; + (proof, total_dispatch_weight) + } + + fn prepare_message_delivery_proof( + params: crate::benchmarking::MessageDeliveryProofParams, + ) -> TestMessagesDeliveryProof { + // in mock run we only care about benchmarks correctness, not the benchmark results + // => ignore size related arguments + TestMessagesDeliveryProof(Ok((params.lane, params.inbound_lane_data))) + } + + fn is_relayer_rewarded(_relayer: &AccountId) -> bool { + true + } +} + +impl Size for TestPayload { + fn size(&self) -> u32 { + 16 + self.extra.len() as u32 + } +} + +/// Maximal outbound payload size. +pub const MAX_OUTBOUND_PAYLOAD_SIZE: u32 = 4096; + +/// Account that has balance to use in tests. +pub const ENDOWED_ACCOUNT: AccountId = 0xDEAD; + +/// Account id of test relayer. +pub const TEST_RELAYER_A: AccountId = 100; + +/// Account id of additional test relayer - B. +pub const TEST_RELAYER_B: AccountId = 101; + +/// Account id of additional test relayer - C. +pub const TEST_RELAYER_C: AccountId = 102; + +/// Error that is returned by all test implementations. +pub const TEST_ERROR: &str = "Test error"; + +/// Lane that we're using in tests. +pub const TEST_LANE_ID: LaneId = LaneId([0, 0, 0, 1]); + +/// Secondary lane that we're using in tests. +pub const TEST_LANE_ID_2: LaneId = LaneId([0, 0, 0, 2]); + +/// Inactive outbound lane. +pub const TEST_LANE_ID_3: LaneId = LaneId([0, 0, 0, 3]); + +/// Regular message payload. +pub const REGULAR_PAYLOAD: TestPayload = message_payload(0, 50); + +/// Payload that is rejected by `TestTargetHeaderChain`. +pub const PAYLOAD_REJECTED_BY_TARGET_CHAIN: TestPayload = message_payload(1, 50); + +/// Vec of proved messages, grouped by lane. +pub type MessagesByLaneVec = Vec<(LaneId, ProvedLaneMessages)>; + +/// Test messages proof. +#[derive(Debug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] +pub struct TestMessagesProof { + pub result: Result, +} + +impl Size for TestMessagesProof { + fn size(&self) -> u32 { + 0 + } +} + +impl From, ()>> for TestMessagesProof { + fn from(result: Result, ()>) -> Self { + Self { + result: result.map(|messages| { + let mut messages_by_lane: BTreeMap> = + BTreeMap::new(); + for message in messages { + messages_by_lane.entry(message.key.lane_id).or_default().messages.push(message); + } + messages_by_lane.into_iter().collect() + }), + } + } +} + +/// Messages delivery proof used in tests. +#[derive(Debug, Encode, Decode, Eq, Clone, PartialEq, TypeInfo)] +pub struct TestMessagesDeliveryProof(pub Result<(LaneId, InboundLaneData), ()>); + +impl Size for TestMessagesDeliveryProof { + fn size(&self) -> u32 { + 0 + } +} + +/// Target header chain that is used in tests. +#[derive(Debug, Default)] +pub struct TestTargetHeaderChain; + +impl TargetHeaderChain for TestTargetHeaderChain { + type Error = &'static str; + + type MessagesDeliveryProof = TestMessagesDeliveryProof; + + fn verify_message(payload: &TestPayload) -> Result<(), Self::Error> { + if *payload == PAYLOAD_REJECTED_BY_TARGET_CHAIN { + Err(TEST_ERROR) + } else { + Ok(()) + } + } + + fn verify_messages_delivery_proof( + proof: Self::MessagesDeliveryProof, + ) -> Result<(LaneId, InboundLaneData), Self::Error> { + proof.0.map_err(|_| TEST_ERROR) + } +} + +/// Lane message verifier that is used in tests. +#[derive(Debug, Default)] +pub struct TestLaneMessageVerifier; + +impl LaneMessageVerifier for TestLaneMessageVerifier { + type Error = &'static str; + + fn verify_message( + _submitter: &RuntimeOrigin, + _lane: &LaneId, + _lane_outbound_data: &OutboundLaneData, + payload: &TestPayload, + ) -> Result<(), Self::Error> { + if !payload.reject_by_lane_verifier { + Ok(()) + } else { + Err(TEST_ERROR) + } + } +} + +/// Reward payments at the target chain during delivery transaction. +#[derive(Debug, Default)] +pub struct TestDeliveryPayments; + +impl TestDeliveryPayments { + /// Returns true if given relayer has been rewarded with given balance. The reward-paid flag is + /// cleared after the call. + pub fn is_reward_paid(relayer: AccountId) -> bool { + let key = (b":delivery-relayer-reward:", relayer).encode(); + frame_support::storage::unhashed::take::(&key).is_some() + } +} + +impl DeliveryPayments for TestDeliveryPayments { + type Error = &'static str; + + fn pay_reward( + relayer: AccountId, + _total_messages: MessageNonce, + _valid_messages: MessageNonce, + _actual_weight: Weight, + ) { + let key = (b":delivery-relayer-reward:", relayer).encode(); + frame_support::storage::unhashed::put(&key, &true); + } +} + +/// Reward payments at the source chain during delivery confirmation transaction. +#[derive(Debug, Default)] +pub struct TestDeliveryConfirmationPayments; + +impl TestDeliveryConfirmationPayments { + /// Returns true if given relayer has been rewarded with given balance. The reward-paid flag is + /// cleared after the call. + pub fn is_reward_paid(relayer: AccountId, fee: TestMessageFee) -> bool { + let key = (b":relayer-reward:", relayer, fee).encode(); + frame_support::storage::unhashed::take::(&key).is_some() + } +} + +impl DeliveryConfirmationPayments for TestDeliveryConfirmationPayments { + type Error = &'static str; + + fn pay_reward( + _lane_id: LaneId, + messages_relayers: VecDeque>, + _confirmation_relayer: &AccountId, + received_range: &RangeInclusive, + ) -> MessageNonce { + let relayers_rewards = calc_relayers_rewards(messages_relayers, received_range); + let rewarded_relayers = relayers_rewards.len(); + for (relayer, reward) in &relayers_rewards { + let key = (b":relayer-reward:", relayer, reward).encode(); + frame_support::storage::unhashed::put(&key, &true); + } + + rewarded_relayers as _ + } +} + +/// Source header chain that is used in tests. +#[derive(Debug)] +pub struct TestSourceHeaderChain; + +impl SourceHeaderChain for TestSourceHeaderChain { + type Error = &'static str; + + type MessagesProof = TestMessagesProof; + + fn verify_messages_proof( + proof: Self::MessagesProof, + _messages_count: u32, + ) -> Result, Self::Error> { + proof.result.map(|proof| proof.into_iter().collect()).map_err(|_| TEST_ERROR) + } +} + +/// Source header chain that is used in tests. +#[derive(Debug)] +pub struct TestMessageDispatch; + +impl MessageDispatch for TestMessageDispatch { + type DispatchPayload = TestPayload; + type DispatchLevelResult = TestDispatchLevelResult; + + fn dispatch_weight(message: &mut DispatchMessage) -> Weight { + match message.data.payload.as_ref() { + Ok(payload) => payload.declared_weight, + Err(_) => Weight::zero(), + } + } + + fn dispatch( + message: DispatchMessage, + ) -> MessageDispatchResult { + match message.data.payload.as_ref() { + Ok(payload) => payload.dispatch_result.clone(), + Err(_) => dispatch_result(0), + } + } +} + +/// Return test lane message with given nonce and payload. +pub fn message(nonce: MessageNonce, payload: TestPayload) -> Message { + Message { key: MessageKey { lane_id: TEST_LANE_ID, nonce }, payload: payload.encode() } +} + +/// Return valid outbound message data, constructed from given payload. +pub fn outbound_message_data(payload: TestPayload) -> MessagePayload { + payload.encode() +} + +/// Return valid inbound (dispatch) message data, constructed from given payload. +pub fn inbound_message_data(payload: TestPayload) -> DispatchMessageData { + DispatchMessageData { payload: Ok(payload) } +} + +/// Constructs message payload using given arguments and zero unspent weight. +pub const fn message_payload(id: u64, declared_weight: u64) -> TestPayload { + TestPayload { + id, + reject_by_lane_verifier: false, + declared_weight: Weight::from_parts(declared_weight, 0), + dispatch_result: dispatch_result(0), + extra: Vec::new(), + } +} + +/// Returns message dispatch result with given unspent weight. +pub const fn dispatch_result( + unspent_weight: u64, +) -> MessageDispatchResult { + MessageDispatchResult { + unspent_weight: Weight::from_parts(unspent_weight, 0), + dispatch_level_result: (), + } +} + +/// Constructs unrewarded relayer entry from nonces range and relayer id. +pub fn unrewarded_relayer( + begin: MessageNonce, + end: MessageNonce, + relayer: TestRelayer, +) -> UnrewardedRelayer { + UnrewardedRelayer { relayer, messages: DeliveredMessages { begin, end } } +} + +/// Returns unrewarded relayers state at given lane. +pub fn inbound_unrewarded_relayers_state(lane: bp_messages::LaneId) -> UnrewardedRelayersState { + let inbound_lane_data = crate::InboundLanes::::get(lane).0; + UnrewardedRelayersState::from(&inbound_lane_data) +} + +/// Return test externalities to use in tests. +pub fn new_test_ext() -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + pallet_balances::GenesisConfig:: { balances: vec![(ENDOWED_ACCOUNT, 1_000_000)] } + .assimilate_storage(&mut t) + .unwrap(); + sp_io::TestExternalities::new(t) +} + +/// Run pallet test. +pub fn run_test(test: impl FnOnce() -> T) -> T { + new_test_ext().execute_with(test) +} diff --git a/bridges/modules/messages/src/outbound_lane.rs b/bridges/modules/messages/src/outbound_lane.rs new file mode 100644 index 00000000000..3d0d4de966a --- /dev/null +++ b/bridges/modules/messages/src/outbound_lane.rs @@ -0,0 +1,433 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Everything about outgoing messages sending. + +use crate::Config; + +use bp_messages::{ + DeliveredMessages, LaneId, MessageNonce, MessagePayload, OutboundLaneData, UnrewardedRelayer, +}; +use frame_support::{ + weights::{RuntimeDbWeight, Weight}, + BoundedVec, RuntimeDebug, +}; +use num_traits::Zero; +use sp_std::collections::vec_deque::VecDeque; + +/// Outbound lane storage. +pub trait OutboundLaneStorage { + /// Lane id. + fn id(&self) -> LaneId; + /// Get lane data from the storage. + fn data(&self) -> OutboundLaneData; + /// Update lane data in the storage. + fn set_data(&mut self, data: OutboundLaneData); + /// Returns saved outbound message payload. + #[cfg(test)] + fn message(&self, nonce: &MessageNonce) -> Option; + /// Save outbound message in the storage. + fn save_message(&mut self, nonce: MessageNonce, message_payload: MessagePayload); + /// Remove outbound message from the storage. + fn remove_message(&mut self, nonce: &MessageNonce); +} + +/// Outbound message data wrapper that implements `MaxEncodedLen`. +pub type StoredMessagePayload = BoundedVec>::MaximalOutboundPayloadSize>; + +/// Result of messages receival confirmation. +#[derive(RuntimeDebug, PartialEq, Eq)] +pub enum ReceivalConfirmationResult { + /// New messages have been confirmed by the confirmation transaction. + ConfirmedMessages(DeliveredMessages), + /// Confirmation transaction brings no new confirmation. This may be a result of relayer + /// error or several relayers running. + NoNewConfirmations, + /// Bridged chain is trying to confirm more messages than we have generated. May be a result + /// of invalid bridged chain storage. + FailedToConfirmFutureMessages, + /// The unrewarded relayers vec contains an empty entry. May be a result of invalid bridged + /// chain storage. + EmptyUnrewardedRelayerEntry, + /// The unrewarded relayers vec contains non-consecutive entries. May be a result of invalid + /// bridged chain storage. + NonConsecutiveUnrewardedRelayerEntries, + /// The chain has more messages that need to be confirmed than there is in the proof. + TryingToConfirmMoreMessagesThanExpected(MessageNonce), +} + +/// Outbound messages lane. +pub struct OutboundLane { + storage: S, +} + +impl OutboundLane { + /// Create new outbound lane backed by given storage. + pub fn new(storage: S) -> Self { + OutboundLane { storage } + } + + /// Get this lane data. + pub fn data(&self) -> OutboundLaneData { + self.storage.data() + } + + /// Send message over lane. + /// + /// Returns new message nonce. + pub fn send_message(&mut self, message_payload: MessagePayload) -> MessageNonce { + let mut data = self.storage.data(); + let nonce = data.latest_generated_nonce + 1; + data.latest_generated_nonce = nonce; + + self.storage.save_message(nonce, message_payload); + self.storage.set_data(data); + + nonce + } + + /// Confirm messages delivery. + pub fn confirm_delivery( + &mut self, + max_allowed_messages: MessageNonce, + latest_delivered_nonce: MessageNonce, + relayers: &VecDeque>, + ) -> ReceivalConfirmationResult { + let mut data = self.storage.data(); + if latest_delivered_nonce <= data.latest_received_nonce { + return ReceivalConfirmationResult::NoNewConfirmations + } + if latest_delivered_nonce > data.latest_generated_nonce { + return ReceivalConfirmationResult::FailedToConfirmFutureMessages + } + if latest_delivered_nonce - data.latest_received_nonce > max_allowed_messages { + // that the relayer has declared correct number of messages that the proof contains (it + // is checked outside of the function). But it may happen (but only if this/bridged + // chain storage is corrupted, though) that the actual number of confirmed messages if + // larger than declared. This would mean that 'reward loop' will take more time than the + // weight formula accounts, so we can't allow that. + return ReceivalConfirmationResult::TryingToConfirmMoreMessagesThanExpected( + latest_delivered_nonce - data.latest_received_nonce, + ) + } + + if let Err(e) = ensure_unrewarded_relayers_are_correct(latest_delivered_nonce, relayers) { + return e + } + + let prev_latest_received_nonce = data.latest_received_nonce; + data.latest_received_nonce = latest_delivered_nonce; + self.storage.set_data(data); + + ReceivalConfirmationResult::ConfirmedMessages(DeliveredMessages { + begin: prev_latest_received_nonce + 1, + end: latest_delivered_nonce, + }) + } + + /// Prune at most `max_messages_to_prune` already received messages. + /// + /// Returns weight, consumed by messages pruning and lane state update. + pub fn prune_messages( + &mut self, + db_weight: RuntimeDbWeight, + mut remaining_weight: Weight, + ) -> Weight { + let write_weight = db_weight.writes(1); + let two_writes_weight = write_weight + write_weight; + let mut spent_weight = Weight::zero(); + let mut data = self.storage.data(); + while remaining_weight.all_gte(two_writes_weight) && + data.oldest_unpruned_nonce <= data.latest_received_nonce + { + self.storage.remove_message(&data.oldest_unpruned_nonce); + + spent_weight += write_weight; + remaining_weight -= write_weight; + data.oldest_unpruned_nonce += 1; + } + + if !spent_weight.is_zero() { + spent_weight += write_weight; + self.storage.set_data(data); + } + + spent_weight + } +} + +/// Verifies unrewarded relayers vec. +/// +/// Returns `Err(_)` if unrewarded relayers vec contains invalid data, meaning that the bridged +/// chain has invalid runtime storage. +fn ensure_unrewarded_relayers_are_correct( + latest_received_nonce: MessageNonce, + relayers: &VecDeque>, +) -> Result<(), ReceivalConfirmationResult> { + let mut last_entry_end: Option = None; + for entry in relayers { + // unrewarded relayer entry must have at least 1 unconfirmed message + // (guaranteed by the `InboundLane::receive_message()`) + if entry.messages.end < entry.messages.begin { + return Err(ReceivalConfirmationResult::EmptyUnrewardedRelayerEntry) + } + // every entry must confirm range of messages that follows previous entry range + // (guaranteed by the `InboundLane::receive_message()`) + if let Some(last_entry_end) = last_entry_end { + let expected_entry_begin = last_entry_end.checked_add(1); + if expected_entry_begin != Some(entry.messages.begin) { + return Err(ReceivalConfirmationResult::NonConsecutiveUnrewardedRelayerEntries) + } + } + last_entry_end = Some(entry.messages.end); + // entry can't confirm messages larger than `inbound_lane_data.latest_received_nonce()` + // (guaranteed by the `InboundLane::receive_message()`) + if entry.messages.end > latest_received_nonce { + return Err(ReceivalConfirmationResult::FailedToConfirmFutureMessages) + } + } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + mock::{ + outbound_message_data, run_test, unrewarded_relayer, TestRelayer, TestRuntime, + REGULAR_PAYLOAD, TEST_LANE_ID, + }, + outbound_lane, + }; + use frame_support::weights::constants::RocksDbWeight; + use sp_std::ops::RangeInclusive; + + fn unrewarded_relayers( + nonces: RangeInclusive, + ) -> VecDeque> { + vec![unrewarded_relayer(*nonces.start(), *nonces.end(), 0)] + .into_iter() + .collect() + } + + fn delivered_messages(nonces: RangeInclusive) -> DeliveredMessages { + DeliveredMessages { begin: *nonces.start(), end: *nonces.end() } + } + + fn assert_3_messages_confirmation_fails( + latest_received_nonce: MessageNonce, + relayers: &VecDeque>, + ) -> ReceivalConfirmationResult { + run_test(|| { + let mut lane = outbound_lane::(TEST_LANE_ID); + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + assert_eq!(lane.storage.data().latest_generated_nonce, 3); + assert_eq!(lane.storage.data().latest_received_nonce, 0); + let result = lane.confirm_delivery(3, latest_received_nonce, relayers); + assert_eq!(lane.storage.data().latest_generated_nonce, 3); + assert_eq!(lane.storage.data().latest_received_nonce, 0); + result + }) + } + + #[test] + fn send_message_works() { + run_test(|| { + let mut lane = outbound_lane::(TEST_LANE_ID); + assert_eq!(lane.storage.data().latest_generated_nonce, 0); + assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 1); + assert!(lane.storage.message(&1).is_some()); + assert_eq!(lane.storage.data().latest_generated_nonce, 1); + }); + } + + #[test] + fn confirm_delivery_works() { + run_test(|| { + let mut lane = outbound_lane::(TEST_LANE_ID); + assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 1); + assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 2); + assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 3); + assert_eq!(lane.storage.data().latest_generated_nonce, 3); + assert_eq!(lane.storage.data().latest_received_nonce, 0); + assert_eq!( + lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), + ReceivalConfirmationResult::ConfirmedMessages(delivered_messages(1..=3)), + ); + assert_eq!(lane.storage.data().latest_generated_nonce, 3); + assert_eq!(lane.storage.data().latest_received_nonce, 3); + }); + } + + #[test] + fn confirm_delivery_rejects_nonce_lesser_than_latest_received() { + run_test(|| { + let mut lane = outbound_lane::(TEST_LANE_ID); + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + assert_eq!(lane.storage.data().latest_generated_nonce, 3); + assert_eq!(lane.storage.data().latest_received_nonce, 0); + assert_eq!( + lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), + ReceivalConfirmationResult::ConfirmedMessages(delivered_messages(1..=3)), + ); + assert_eq!( + lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), + ReceivalConfirmationResult::NoNewConfirmations, + ); + assert_eq!(lane.storage.data().latest_generated_nonce, 3); + assert_eq!(lane.storage.data().latest_received_nonce, 3); + + assert_eq!( + lane.confirm_delivery(1, 2, &unrewarded_relayers(1..=1)), + ReceivalConfirmationResult::NoNewConfirmations, + ); + assert_eq!(lane.storage.data().latest_generated_nonce, 3); + assert_eq!(lane.storage.data().latest_received_nonce, 3); + }); + } + + #[test] + fn confirm_delivery_rejects_nonce_larger_than_last_generated() { + assert_eq!( + assert_3_messages_confirmation_fails(10, &unrewarded_relayers(1..=10),), + ReceivalConfirmationResult::FailedToConfirmFutureMessages, + ); + } + + #[test] + fn confirm_delivery_fails_if_entry_confirms_future_messages() { + assert_eq!( + assert_3_messages_confirmation_fails( + 3, + &unrewarded_relayers(1..=1) + .into_iter() + .chain(unrewarded_relayers(2..=30).into_iter()) + .chain(unrewarded_relayers(3..=3).into_iter()) + .collect(), + ), + ReceivalConfirmationResult::FailedToConfirmFutureMessages, + ); + } + + #[test] + #[allow(clippy::reversed_empty_ranges)] + fn confirm_delivery_fails_if_entry_is_empty() { + assert_eq!( + assert_3_messages_confirmation_fails( + 3, + &unrewarded_relayers(1..=1) + .into_iter() + .chain(unrewarded_relayers(2..=1).into_iter()) + .chain(unrewarded_relayers(2..=3).into_iter()) + .collect(), + ), + ReceivalConfirmationResult::EmptyUnrewardedRelayerEntry, + ); + } + + #[test] + fn confirm_delivery_fails_if_entries_are_non_consecutive() { + assert_eq!( + assert_3_messages_confirmation_fails( + 3, + &unrewarded_relayers(1..=1) + .into_iter() + .chain(unrewarded_relayers(3..=3).into_iter()) + .chain(unrewarded_relayers(2..=2).into_iter()) + .collect(), + ), + ReceivalConfirmationResult::NonConsecutiveUnrewardedRelayerEntries, + ); + } + + #[test] + fn prune_messages_works() { + run_test(|| { + let mut lane = outbound_lane::(TEST_LANE_ID); + // when lane is empty, nothing is pruned + assert_eq!( + lane.prune_messages(RocksDbWeight::get(), RocksDbWeight::get().writes(101)), + Weight::zero() + ); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 1); + // when nothing is confirmed, nothing is pruned + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + assert!(lane.storage.message(&1).is_some()); + assert!(lane.storage.message(&2).is_some()); + assert!(lane.storage.message(&3).is_some()); + assert_eq!( + lane.prune_messages(RocksDbWeight::get(), RocksDbWeight::get().writes(101)), + Weight::zero() + ); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 1); + // after confirmation, some messages are received + assert_eq!( + lane.confirm_delivery(2, 2, &unrewarded_relayers(1..=2)), + ReceivalConfirmationResult::ConfirmedMessages(delivered_messages(1..=2)), + ); + assert_eq!( + lane.prune_messages(RocksDbWeight::get(), RocksDbWeight::get().writes(101)), + RocksDbWeight::get().writes(3), + ); + assert!(lane.storage.message(&1).is_none()); + assert!(lane.storage.message(&2).is_none()); + assert!(lane.storage.message(&3).is_some()); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 3); + // after last message is confirmed, everything is pruned + assert_eq!( + lane.confirm_delivery(1, 3, &unrewarded_relayers(3..=3)), + ReceivalConfirmationResult::ConfirmedMessages(delivered_messages(3..=3)), + ); + assert_eq!( + lane.prune_messages(RocksDbWeight::get(), RocksDbWeight::get().writes(101)), + RocksDbWeight::get().writes(2), + ); + assert!(lane.storage.message(&1).is_none()); + assert!(lane.storage.message(&2).is_none()); + assert!(lane.storage.message(&3).is_none()); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 4); + }); + } + + #[test] + fn confirm_delivery_detects_when_more_than_expected_messages_are_confirmed() { + run_test(|| { + let mut lane = outbound_lane::(TEST_LANE_ID); + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + assert_eq!( + lane.confirm_delivery(0, 3, &unrewarded_relayers(1..=3)), + ReceivalConfirmationResult::TryingToConfirmMoreMessagesThanExpected(3), + ); + assert_eq!( + lane.confirm_delivery(2, 3, &unrewarded_relayers(1..=3)), + ReceivalConfirmationResult::TryingToConfirmMoreMessagesThanExpected(3), + ); + assert_eq!( + lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), + ReceivalConfirmationResult::ConfirmedMessages(delivered_messages(1..=3)), + ); + }); + } +} diff --git a/bridges/modules/messages/src/weights.rs b/bridges/modules/messages/src/weights.rs new file mode 100644 index 00000000000..9880f1dd1ea --- /dev/null +++ b/bridges/modules/messages/src/weights.rs @@ -0,0 +1,525 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Autogenerated weights for RialtoMessages +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/millau-bridge-node +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=RialtoMessages +// --extrinsic=* +// --execution=wasm +// --wasm-execution=Compiled +// --heap-pages=4096 +// --output=./modules/messages/src/weights.rs +// --template=./.maintain/bridge-weight-template.hbs + +#![allow(clippy::all)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{ + traits::Get, + weights::{constants::RocksDbWeight, Weight}, +}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for RialtoMessages. +pub trait WeightInfo { + fn receive_single_message_proof() -> Weight; + fn receive_two_messages_proof() -> Weight; + fn receive_single_message_proof_with_outbound_lane_state() -> Weight; + fn receive_single_message_proof_1_kb() -> Weight; + fn receive_single_message_proof_16_kb() -> Weight; + fn receive_delivery_proof_for_single_message() -> Weight; + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight; + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight; + fn receive_single_message_proof_with_dispatch(i: u32) -> Weight; +} + +/// Weights for `RialtoMessages` that are generated using one of the Bridge testnets. +/// +/// Those weights are test only and must never be used in production. +pub struct BridgeWeight(PhantomData); +impl WeightInfo for BridgeWeight { + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 52_321 nanoseconds. + Weight::from_parts(54_478_000, 57170) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_two_messages_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 64_597 nanoseconds. + Weight::from_parts(69_267_000, 57170) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_with_outbound_lane_state() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 64_079 nanoseconds. + Weight::from_parts(65_905_000, 57170) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_1_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 50_588 nanoseconds. + Weight::from_parts(53_544_000, 57170) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_16_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 78_269 nanoseconds. + Weight::from_parts(81_748_000, 57170) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_single_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `579` + // Estimated: `9584` + // Minimum execution time: 45_786 nanoseconds. + Weight::from_parts(47_382_000, 9584) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { + // Proof Size summary in bytes: + // Measured: `596` + // Estimated: `9584` + // Minimum execution time: 44_544 nanoseconds. + Weight::from_parts(45_451_000, 9584) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { + // Proof Size summary in bytes: + // Measured: `596` + // Estimated: `12124` + // Minimum execution time: 47_344 nanoseconds. + Weight::from_parts(48_311_000, 12124) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + /// + /// The range of component `i` is `[128, 2048]`. + fn receive_single_message_proof_with_dispatch(i: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 52_385 nanoseconds. + Weight::from_parts(54_919_468, 57170) + // Standard Error: 108 + .saturating_add(Weight::from_parts(3_286, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 52_321 nanoseconds. + Weight::from_parts(54_478_000, 57170) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_two_messages_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 64_597 nanoseconds. + Weight::from_parts(69_267_000, 57170) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_with_outbound_lane_state() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 64_079 nanoseconds. + Weight::from_parts(65_905_000, 57170) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_1_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 50_588 nanoseconds. + Weight::from_parts(53_544_000, 57170) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_16_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 78_269 nanoseconds. + Weight::from_parts(81_748_000, 57170) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_single_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `579` + // Estimated: `9584` + // Minimum execution time: 45_786 nanoseconds. + Weight::from_parts(47_382_000, 9584) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { + // Proof Size summary in bytes: + // Measured: `596` + // Estimated: `9584` + // Minimum execution time: 44_544 nanoseconds. + Weight::from_parts(45_451_000, 9584) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { + // Proof Size summary in bytes: + // Measured: `596` + // Estimated: `12124` + // Minimum execution time: 47_344 nanoseconds. + Weight::from_parts(48_311_000, 12124) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + /// + /// The range of component `i` is `[128, 2048]`. + fn receive_single_message_proof_with_dispatch(i: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 52_385 nanoseconds. + Weight::from_parts(54_919_468, 57170) + // Standard Error: 108 + .saturating_add(Weight::from_parts(3_286, 0).saturating_mul(i.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} diff --git a/bridges/modules/messages/src/weights_ext.rs b/bridges/modules/messages/src/weights_ext.rs new file mode 100644 index 00000000000..3aefd6be7ca --- /dev/null +++ b/bridges/modules/messages/src/weights_ext.rs @@ -0,0 +1,487 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Weight-related utilities. + +use crate::weights::WeightInfo; + +use bp_messages::{MessageNonce, UnrewardedRelayersState}; +use bp_runtime::{PreComputedSize, Size}; +use frame_support::weights::Weight; + +/// Size of the message being delivered in benchmarks. +pub const EXPECTED_DEFAULT_MESSAGE_LENGTH: u32 = 128; + +/// We assume that size of signed extensions on all our chains and size of all 'small' arguments of +/// calls we're checking here would fit 1KB. +const SIGNED_EXTENSIONS_SIZE: u32 = 1024; + +/// Number of extra bytes (excluding size of storage value itself) of storage proof, built at +/// Rialto chain. This mostly depends on number of entries (and their density) in the storage trie. +/// Some reserve is reserved to account future chain growth. +pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024; + +/// Ensure that weights from `WeightInfoExt` implementation are looking correct. +pub fn ensure_weights_are_correct() { + // all components of weight formulae must have zero `proof_size`, because the `proof_size` is + // benchmarked using `MaxEncodedLen` approach and there are no components that cause additional + // db reads + + // verify `receive_messages_proof` weight components + assert_ne!(W::receive_messages_proof_overhead().ref_time(), 0); + assert_ne!(W::receive_messages_proof_overhead().proof_size(), 0); + // W::receive_messages_proof_messages_overhead(1).ref_time() may be zero because: + // the message processing code (`InboundLane::receive_message`) is minimal and may not be + // accounted by our benchmarks + assert_eq!(W::receive_messages_proof_messages_overhead(1).proof_size(), 0); + // W::receive_messages_proof_outbound_lane_state_overhead().ref_time() may be zero because: + // the outbound lane state processing code (`InboundLane::receive_state_update`) is minimal and + // may not be accounted by our benchmarks + assert_eq!(W::receive_messages_proof_outbound_lane_state_overhead().proof_size(), 0); + assert_ne!(W::storage_proof_size_overhead(1).ref_time(), 0); + assert_eq!(W::storage_proof_size_overhead(1).proof_size(), 0); + + // verify `receive_messages_delivery_proof` weight components + assert_ne!(W::receive_messages_delivery_proof_overhead().ref_time(), 0); + assert_ne!(W::receive_messages_delivery_proof_overhead().proof_size(), 0); + // W::receive_messages_delivery_proof_messages_overhead(1).ref_time() may be zero because: + // there's no code that iterates over confirmed messages in confirmation transaction + assert_eq!(W::receive_messages_delivery_proof_messages_overhead(1).proof_size(), 0); + assert_ne!(W::receive_messages_delivery_proof_relayers_overhead(1).ref_time(), 0); + // W::receive_messages_delivery_proof_relayers_overhead(1).proof_size() is an exception + // it may or may not cause additional db reads, so proof size may vary + assert_ne!(W::storage_proof_size_overhead(1).ref_time(), 0); + assert_eq!(W::storage_proof_size_overhead(1).proof_size(), 0); + + // verify `receive_message_proof` weight + let receive_messages_proof_weight = + W::receive_messages_proof_weight(&PreComputedSize(1), 10, Weight::zero()); + assert_ne!(receive_messages_proof_weight.ref_time(), 0); + assert_ne!(receive_messages_proof_weight.proof_size(), 0); + messages_proof_size_does_not_affect_proof_size::(); + messages_count_does_not_affect_proof_size::(); + + // verify `receive_message_proof` weight + let receive_messages_delivery_proof_weight = W::receive_messages_delivery_proof_weight( + &PreComputedSize(1), + &UnrewardedRelayersState::default(), + ); + assert_ne!(receive_messages_delivery_proof_weight.ref_time(), 0); + assert_ne!(receive_messages_delivery_proof_weight.proof_size(), 0); + messages_delivery_proof_size_does_not_affect_proof_size::(); + total_messages_in_delivery_proof_does_not_affect_proof_size::(); +} + +/// Ensure that we're able to receive maximal (by-size and by-weight) message from other chain. +pub fn ensure_able_to_receive_message( + max_extrinsic_size: u32, + max_extrinsic_weight: Weight, + max_incoming_message_proof_size: u32, + max_incoming_message_dispatch_weight: Weight, +) { + // verify that we're able to receive proof of maximal-size message + let max_delivery_transaction_size = + max_incoming_message_proof_size.saturating_add(SIGNED_EXTENSIONS_SIZE); + assert!( + max_delivery_transaction_size <= max_extrinsic_size, + "Size of maximal message delivery transaction {max_incoming_message_proof_size} + {SIGNED_EXTENSIONS_SIZE} is larger than maximal possible transaction size {max_extrinsic_size}", + ); + + // verify that we're able to receive proof of maximal-size message with maximal dispatch weight + let max_delivery_transaction_dispatch_weight = W::receive_messages_proof_weight( + &PreComputedSize( + (max_incoming_message_proof_size + W::expected_extra_storage_proof_size()) as usize, + ), + 1, + max_incoming_message_dispatch_weight, + ); + assert!( + max_delivery_transaction_dispatch_weight.all_lte(max_extrinsic_weight), + "Weight of maximal message delivery transaction + {max_delivery_transaction_dispatch_weight} is larger than maximal possible transaction weight {max_extrinsic_weight}", + ); +} + +/// Ensure that we're able to receive maximal confirmation from other chain. +pub fn ensure_able_to_receive_confirmation( + max_extrinsic_size: u32, + max_extrinsic_weight: Weight, + max_inbound_lane_data_proof_size_from_peer_chain: u32, + max_unrewarded_relayer_entries_at_peer_inbound_lane: MessageNonce, + max_unconfirmed_messages_at_inbound_lane: MessageNonce, +) { + // verify that we're able to receive confirmation of maximal-size + let max_confirmation_transaction_size = + max_inbound_lane_data_proof_size_from_peer_chain.saturating_add(SIGNED_EXTENSIONS_SIZE); + assert!( + max_confirmation_transaction_size <= max_extrinsic_size, + "Size of maximal message delivery confirmation transaction {max_inbound_lane_data_proof_size_from_peer_chain} + {SIGNED_EXTENSIONS_SIZE} is larger than maximal possible transaction size {max_extrinsic_size}", + ); + + // verify that we're able to reward maximal number of relayers that have delivered maximal + // number of messages + let max_confirmation_transaction_dispatch_weight = W::receive_messages_delivery_proof_weight( + &PreComputedSize(max_inbound_lane_data_proof_size_from_peer_chain as usize), + &UnrewardedRelayersState { + unrewarded_relayer_entries: max_unrewarded_relayer_entries_at_peer_inbound_lane, + total_messages: max_unconfirmed_messages_at_inbound_lane, + ..Default::default() + }, + ); + assert!( + max_confirmation_transaction_dispatch_weight.all_lte(max_extrinsic_weight), + "Weight of maximal confirmation transaction {max_confirmation_transaction_dispatch_weight} is larger than maximal possible transaction weight {max_extrinsic_weight}", + ); +} + +/// Panics if `proof_size` of message delivery call depends on the message proof size. +fn messages_proof_size_does_not_affect_proof_size() { + let dispatch_weight = Weight::zero(); + let weight_when_proof_size_is_8k = + W::receive_messages_proof_weight(&PreComputedSize(8 * 1024), 1, dispatch_weight); + let weight_when_proof_size_is_16k = + W::receive_messages_proof_weight(&PreComputedSize(16 * 1024), 1, dispatch_weight); + + ensure_weight_components_are_not_zero(weight_when_proof_size_is_8k); + ensure_weight_components_are_not_zero(weight_when_proof_size_is_16k); + ensure_proof_size_is_the_same( + weight_when_proof_size_is_8k, + weight_when_proof_size_is_16k, + "Messages proof size does not affect values that we read from our storage", + ); +} + +/// Panics if `proof_size` of message delivery call depends on the messages count. +/// +/// In practice, it will depend on the messages count, because most probably every +/// message will read something from db during dispatch. But this must be accounted +/// by the `dispatch_weight`. +fn messages_count_does_not_affect_proof_size() { + let messages_proof_size = PreComputedSize(8 * 1024); + let dispatch_weight = Weight::zero(); + let weight_of_one_incoming_message = + W::receive_messages_proof_weight(&messages_proof_size, 1, dispatch_weight); + let weight_of_two_incoming_messages = + W::receive_messages_proof_weight(&messages_proof_size, 2, dispatch_weight); + + ensure_weight_components_are_not_zero(weight_of_one_incoming_message); + ensure_weight_components_are_not_zero(weight_of_two_incoming_messages); + ensure_proof_size_is_the_same( + weight_of_one_incoming_message, + weight_of_two_incoming_messages, + "Number of same-lane incoming messages does not affect values that we read from our storage", + ); +} + +/// Panics if `proof_size` of delivery confirmation call depends on the delivery proof size. +fn messages_delivery_proof_size_does_not_affect_proof_size() { + let relayers_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }; + let weight_when_proof_size_is_8k = + W::receive_messages_delivery_proof_weight(&PreComputedSize(8 * 1024), &relayers_state); + let weight_when_proof_size_is_16k = + W::receive_messages_delivery_proof_weight(&PreComputedSize(16 * 1024), &relayers_state); + + ensure_weight_components_are_not_zero(weight_when_proof_size_is_8k); + ensure_weight_components_are_not_zero(weight_when_proof_size_is_16k); + ensure_proof_size_is_the_same( + weight_when_proof_size_is_8k, + weight_when_proof_size_is_16k, + "Messages delivery proof size does not affect values that we read from our storage", + ); +} + +/// Panics if `proof_size` of delivery confirmation call depends on the number of confirmed +/// messages. +fn total_messages_in_delivery_proof_does_not_affect_proof_size() { + let proof_size = PreComputedSize(8 * 1024); + let weight_when_1k_messages_confirmed = W::receive_messages_delivery_proof_weight( + &proof_size, + &UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1024, + last_delivered_nonce: 1, + }, + ); + let weight_when_2k_messages_confirmed = W::receive_messages_delivery_proof_weight( + &proof_size, + &UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 2048, + last_delivered_nonce: 1, + }, + ); + + ensure_weight_components_are_not_zero(weight_when_1k_messages_confirmed); + ensure_weight_components_are_not_zero(weight_when_2k_messages_confirmed); + ensure_proof_size_is_the_same( + weight_when_1k_messages_confirmed, + weight_when_2k_messages_confirmed, + "More messages in delivery proof does not affect values that we read from our storage", + ); +} + +/// Panics if either Weight' `proof_size` or `ref_time` are zero. +fn ensure_weight_components_are_not_zero(weight: Weight) { + assert_ne!(weight.ref_time(), 0); + assert_ne!(weight.proof_size(), 0); +} + +/// Panics if `proof_size` of `weight1` is not equal to `proof_size` of `weight2`. +fn ensure_proof_size_is_the_same(weight1: Weight, weight2: Weight, msg: &str) { + assert_eq!( + weight1.proof_size(), + weight2.proof_size(), + "{msg}: {} must be equal to {}", + weight1.proof_size(), + weight2.proof_size(), + ); +} + +/// Extended weight info. +pub trait WeightInfoExt: WeightInfo { + /// Size of proof that is already included in the single message delivery weight. + /// + /// The message submitter (at source chain) has already covered this cost. But there are two + /// factors that may increase proof size: (1) the message size may be larger than predefined + /// and (2) relayer may add extra trie nodes to the proof. So if proof size is larger than + /// this value, we're going to charge relayer for that. + fn expected_extra_storage_proof_size() -> u32; + + // Our configuration assumes that the runtime has special signed extensions used to: + // + // 1) reject obsolete delivery and confirmation transactions; + // + // 2) refund transaction cost to relayer and register his rewards. + // + // The checks in (1) are trivial, so its computation weight may be ignored. And we only touch + // storage values that are read during the call. So we may ignore the weight of this check. + // + // However, during (2) we read and update storage values of other pallets + // (`pallet-bridge-relayers` and balances/assets pallet). So we need to add this weight to the + // weight of our call. Hence two following methods. + + /// Extra weight that is added to the `receive_messages_proof` call weight by signed extensions + /// that are declared at runtime level. + fn receive_messages_proof_overhead_from_runtime() -> Weight; + + /// Extra weight that is added to the `receive_messages_delivery_proof` call weight by signed + /// extensions that are declared at runtime level. + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight; + + // Functions that are directly mapped to extrinsics weights. + + /// Weight of message delivery extrinsic. + fn receive_messages_proof_weight( + proof: &impl Size, + messages_count: u32, + dispatch_weight: Weight, + ) -> Weight { + // basic components of extrinsic weight + let transaction_overhead = Self::receive_messages_proof_overhead(); + let transaction_overhead_from_runtime = + Self::receive_messages_proof_overhead_from_runtime(); + let outbound_state_delivery_weight = + Self::receive_messages_proof_outbound_lane_state_overhead(); + let messages_delivery_weight = + Self::receive_messages_proof_messages_overhead(MessageNonce::from(messages_count)); + let messages_dispatch_weight = dispatch_weight; + + // proof size overhead weight + let expected_proof_size = EXPECTED_DEFAULT_MESSAGE_LENGTH + .saturating_mul(messages_count.saturating_sub(1)) + .saturating_add(Self::expected_extra_storage_proof_size()); + let actual_proof_size = proof.size(); + let proof_size_overhead = Self::storage_proof_size_overhead( + actual_proof_size.saturating_sub(expected_proof_size), + ); + + transaction_overhead + .saturating_add(transaction_overhead_from_runtime) + .saturating_add(outbound_state_delivery_weight) + .saturating_add(messages_delivery_weight) + .saturating_add(messages_dispatch_weight) + .saturating_add(proof_size_overhead) + } + + /// Weight of confirmation delivery extrinsic. + fn receive_messages_delivery_proof_weight( + proof: &impl Size, + relayers_state: &UnrewardedRelayersState, + ) -> Weight { + // basic components of extrinsic weight + let transaction_overhead = Self::receive_messages_delivery_proof_overhead(); + let transaction_overhead_from_runtime = + Self::receive_messages_delivery_proof_overhead_from_runtime(); + let messages_overhead = + Self::receive_messages_delivery_proof_messages_overhead(relayers_state.total_messages); + let relayers_overhead = Self::receive_messages_delivery_proof_relayers_overhead( + relayers_state.unrewarded_relayer_entries, + ); + + // proof size overhead weight + let expected_proof_size = Self::expected_extra_storage_proof_size(); + let actual_proof_size = proof.size(); + let proof_size_overhead = Self::storage_proof_size_overhead( + actual_proof_size.saturating_sub(expected_proof_size), + ); + + transaction_overhead + .saturating_add(transaction_overhead_from_runtime) + .saturating_add(messages_overhead) + .saturating_add(relayers_overhead) + .saturating_add(proof_size_overhead) + } + + // Functions that are used by extrinsics weights formulas. + + /// Returns weight overhead of message delivery transaction (`receive_messages_proof`). + fn receive_messages_proof_overhead() -> Weight { + let weight_of_two_messages_and_two_tx_overheads = + Self::receive_single_message_proof().saturating_mul(2); + let weight_of_two_messages_and_single_tx_overhead = Self::receive_two_messages_proof(); + weight_of_two_messages_and_two_tx_overheads + .saturating_sub(weight_of_two_messages_and_single_tx_overhead) + } + + /// Returns weight that needs to be accounted when receiving given a number of messages with + /// message delivery transaction (`receive_messages_proof`). + fn receive_messages_proof_messages_overhead(messages: MessageNonce) -> Weight { + let weight_of_two_messages_and_single_tx_overhead = Self::receive_two_messages_proof(); + let weight_of_single_message_and_single_tx_overhead = Self::receive_single_message_proof(); + weight_of_two_messages_and_single_tx_overhead + .saturating_sub(weight_of_single_message_and_single_tx_overhead) + .saturating_mul(messages as _) + } + + /// Returns weight that needs to be accounted when message delivery transaction + /// (`receive_messages_proof`) is carrying outbound lane state proof. + fn receive_messages_proof_outbound_lane_state_overhead() -> Weight { + let weight_of_single_message_and_lane_state = + Self::receive_single_message_proof_with_outbound_lane_state(); + let weight_of_single_message = Self::receive_single_message_proof(); + weight_of_single_message_and_lane_state.saturating_sub(weight_of_single_message) + } + + /// Returns weight overhead of delivery confirmation transaction + /// (`receive_messages_delivery_proof`). + fn receive_messages_delivery_proof_overhead() -> Weight { + let weight_of_two_messages_and_two_tx_overheads = + Self::receive_delivery_proof_for_single_message().saturating_mul(2); + let weight_of_two_messages_and_single_tx_overhead = + Self::receive_delivery_proof_for_two_messages_by_single_relayer(); + weight_of_two_messages_and_two_tx_overheads + .saturating_sub(weight_of_two_messages_and_single_tx_overhead) + } + + /// Returns weight that needs to be accounted when receiving confirmations for given a number of + /// messages with delivery confirmation transaction (`receive_messages_delivery_proof`). + fn receive_messages_delivery_proof_messages_overhead(messages: MessageNonce) -> Weight { + let weight_of_two_messages = + Self::receive_delivery_proof_for_two_messages_by_single_relayer(); + let weight_of_single_message = Self::receive_delivery_proof_for_single_message(); + weight_of_two_messages + .saturating_sub(weight_of_single_message) + .saturating_mul(messages as _) + } + + /// Returns weight that needs to be accounted when receiving confirmations for given a number of + /// relayers entries with delivery confirmation transaction (`receive_messages_delivery_proof`). + fn receive_messages_delivery_proof_relayers_overhead(relayers: MessageNonce) -> Weight { + let weight_of_two_messages_by_two_relayers = + Self::receive_delivery_proof_for_two_messages_by_two_relayers(); + let weight_of_two_messages_by_single_relayer = + Self::receive_delivery_proof_for_two_messages_by_single_relayer(); + weight_of_two_messages_by_two_relayers + .saturating_sub(weight_of_two_messages_by_single_relayer) + .saturating_mul(relayers as _) + } + + /// Returns weight that needs to be accounted when storage proof of given size is received + /// (either in `receive_messages_proof` or `receive_messages_delivery_proof`). + /// + /// **IMPORTANT**: this overhead is already included in the 'base' transaction cost - e.g. proof + /// size depends on messages count or number of entries in the unrewarded relayers set. So this + /// shouldn't be added to cost of transaction, but instead should act as a minimal cost that the + /// relayer must pay when it relays proof of given size (even if cost based on other parameters + /// is less than that cost). + fn storage_proof_size_overhead(proof_size: u32) -> Weight { + let proof_size_in_bytes = proof_size; + let byte_weight = (Self::receive_single_message_proof_16_kb() - + Self::receive_single_message_proof_1_kb()) / + (15 * 1024); + proof_size_in_bytes * byte_weight + } + + // Functions that may be used by runtime developers. + + /// Returns dispatch weight of message of given size. + /// + /// This function would return correct value only if your runtime is configured to run + /// `receive_single_message_proof_with_dispatch` benchmark. See its requirements for + /// details. + fn message_dispatch_weight(message_size: u32) -> Weight { + // There may be a tiny overweight/underweight here, because we don't account how message + // size affects all steps before dispatch. But the effect should be small enough and we + // may ignore it. + Self::receive_single_message_proof_with_dispatch(message_size) + .saturating_sub(Self::receive_single_message_proof()) + } +} + +impl WeightInfoExt for () { + fn expected_extra_storage_proof_size() -> u32 { + EXTRA_STORAGE_PROOF_SIZE + } + + fn receive_messages_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } + + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } +} + +impl WeightInfoExt for crate::weights::BridgeWeight { + fn expected_extra_storage_proof_size() -> u32 { + EXTRA_STORAGE_PROOF_SIZE + } + + fn receive_messages_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } + + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{mock::TestRuntime, weights::BridgeWeight}; + + #[test] + fn ensure_default_weights_are_correct() { + ensure_weights_are_correct::>(); + } +} diff --git a/bridges/modules/parachains/Cargo.toml b/bridges/modules/parachains/Cargo.toml new file mode 100644 index 00000000000..d8c89b79991 --- /dev/null +++ b/bridges/modules/parachains/Cargo.toml @@ -0,0 +1,60 @@ +[package] +name = "pallet-bridge-parachains" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } + +# Bridge Dependencies + +bp-header-chain = { path = "../../primitives/header-chain", default-features = false } +bp-parachains = { path = "../../primitives/parachains", default-features = false } +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +pallet-bridge-grandpa = { path = "../grandpa", default-features = false } + +# Substrate Dependencies + +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[dev-dependencies] +bp-header-chain = { path = "../../primitives/header-chain" } +bp-test-utils = { path = "../../primitives/test-utils" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-parachains/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "frame-system/std", + "frame-benchmarking/std", + "log/std", + "pallet-bridge-grandpa/std", + "scale-info/std", + "sp-runtime/std", + "sp-std/std", + "sp-trie/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", +] diff --git a/bridges/modules/parachains/README.md b/bridges/modules/parachains/README.md new file mode 100644 index 00000000000..5982c65ad31 --- /dev/null +++ b/bridges/modules/parachains/README.md @@ -0,0 +1,90 @@ +# Bridge Parachains Pallet + +The bridge parachains pallet is a light client for one or several parachains of the bridged relay chain. +It serves as a source of finalized parachain headers and is used when you need to build a bridge with +a parachain. + +The pallet requires [bridge GRANDPA pallet](../grandpa/) to be deployed at the same chain - it is used +to verify storage proofs, generated at the bridged relay chain. + +## A Brief Introduction into Parachains Finality + +You can find detailed information on parachains finality in the [Polkadot](https://github.com/paritytech/polkadot) +and [Cumulus](https://github.com/paritytech/cumulus) repositories. This section gives a brief overview of how +the parachain finality works and how to build a light client for a parachain. + +The main thing there is that the parachain generates blocks on its own, but it can't achieve finality without +help of its relay chain. Instead, the parachain collators create a block and hand it over to the relay chain +validators. Validators validate the block and register the new parachain head in the +[`Heads` map](https://github.com/paritytech/polkadot/blob/88013730166ba90745ae7c9eb3e0c1be1513c7cc/runtime/parachains/src/paras/mod.rs#L645) +of the [`paras`](https://github.com/paritytech/polkadot/tree/master/runtime/parachains/src/paras) pallet, +deployed at the relay chain. Keep in mind that this pallet, deployed at a relay chain, is **NOT** a bridge pallet, +even though the names are similar. + +And what the bridge parachains pallet does, is simply verifying storage proofs of parachain heads within that +`Heads` map. It does that using relay chain header, that has been previously imported by the +[bridge GRANDPA pallet](../grandpa/). Once the proof is verified, the pallet knows that the given parachain +header has been finalized by the relay chain. The parachain header fields may then be used to verify storage +proofs, coming from the parachain. This allows the pallet to be used e.g. as a source of finality for the messages +pallet. + +## Pallet Operations + +The main entrypoint of the pallet is the `submit_parachain_heads` call. It has three arguments: + +- storage proof of parachain heads from the `Heads` map; + +- parachain identifiers and hashes of their heads from the storage proof; + +- the relay block, at which the storage proof has been generated. + +The pallet may track multiple parachains. And the parachains may use different primitives - one may use 128-bit block +numbers, other - 32-bit. To avoid extra decode operations, the pallet is using relay chain block number to order +parachain headers. Any finalized descendant of finalized relay block `RB`, which has parachain block `PB` in +its `Heads` map, is guaranteed to have either `PB`, or its descendant. So parachain block number grows with relay +block number. + +The pallet may reject parachain head if it already knows better (or the same) head. In addition, pallet rejects +heads of untracked parachains. + +The pallet doesn't track anything behind parachain heads. So it requires no initialization - it is ready to accept +headers right after deployment. + +## Non-Essential Functionality + +There may be a special account in every runtime where the bridge parachains module is deployed. This +account, named 'module owner', is like a module-level sudo account - he's able to halt and +resume all module operations without requiring runtime upgrade. Calls that are related to this +account are: + +- `fn set_owner()`: current module owner may call it to transfer "ownership" to another account; + +- `fn set_operating_mode()`: the module owner (or sudo account) may call this function to stop all + module operations. After this call, all finality proofs will be rejected until further `set_operating_mode` call'. + This call may be used when something extraordinary happens with the bridge. + +If pallet owner is not defined, the governance may be used to make those calls. + +## Signed Extension to Reject Obsolete Headers + +It'd be better for anyone (for chain and for submitters) to reject all transactions that are submitting +already known parachain heads to the pallet. This way, we leave block space to other useful transactions and +we don't charge concurrent submitters for their honest actions. + +To deal with that, we have a [signed extension](./src/call_ext) that may be added to the runtime. +It does exactly what is required - rejects all transactions with already known heads. The submitter +pays nothing for such transactions - they're simply removed from the transaction pool, when the block +is built. + +The signed extension, however, is a bit limited - it only works with transactions that provide single +parachain head. So it won't work with multiple parachain heads transactions. This fits our needs +for [Kusama <> Polkadot bridge](../../docs/polkadot-kusama-bridge-overview.md). If you need to deal +with other transaction formats, you may implement similar extension for your runtime. + +You may also take a look at the [`generate_bridge_reject_obsolete_headers_and_messages`](../../bin/runtime-common/src/lib.rs) +macro that bundles several similar signed extensions in a single one. + +## Parachains Finality Relay + +We have an offchain actor, who is watching for new parachain heads and submits them to the bridged chain. +It is the parachains relay - you may look at the [crate level documentation and the code](../../relays/parachains/). diff --git a/bridges/modules/parachains/src/benchmarking.rs b/bridges/modules/parachains/src/benchmarking.rs new file mode 100644 index 00000000000..59c4642cde9 --- /dev/null +++ b/bridges/modules/parachains/src/benchmarking.rs @@ -0,0 +1,116 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Parachains finality pallet benchmarking. + +use crate::{ + weights_ext::DEFAULT_PARACHAIN_HEAD_SIZE, Call, RelayBlockHash, RelayBlockHasher, + RelayBlockNumber, +}; + +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use bp_runtime::StorageProofSize; +use frame_benchmarking::{account, benchmarks_instance_pallet}; +use frame_system::RawOrigin; +use sp_std::prelude::*; + +/// Pallet we're benchmarking here. +pub struct Pallet, I: 'static = ()>(crate::Pallet); + +/// Trait that must be implemented by runtime to benchmark the parachains finality pallet. +pub trait Config: crate::Config { + /// Returns vector of supported parachains. + fn parachains() -> Vec; + /// Generate parachain heads proof and prepare environment for verifying this proof. + fn prepare_parachain_heads_proof( + parachains: &[ParaId], + parachain_head_size: u32, + proof_size: StorageProofSize, + ) -> (RelayBlockNumber, RelayBlockHash, ParaHeadsProof, Vec<(ParaId, ParaHash)>); +} + +benchmarks_instance_pallet! { + where_clause { + where + >::BridgedChain: + bp_runtime::Chain< + BlockNumber = RelayBlockNumber, + Hash = RelayBlockHash, + Hasher = RelayBlockHasher, + >, + } + + // Benchmark `submit_parachain_heads` extrinsic with different number of parachains. + submit_parachain_heads_with_n_parachains { + let p in 1..(T::parachains().len() + 1) as u32; + + let sender = account("sender", 0, 0); + let mut parachains = T::parachains(); + let _ = if p <= parachains.len() as u32 { + parachains.split_off(p as usize) + } else { + Default::default() + }; + log::trace!(target: crate::LOG_TARGET, "=== {:?}", parachains.len()); + let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( + ¶chains, + DEFAULT_PARACHAIN_HEAD_SIZE, + StorageProofSize::Minimal(0), + ); + let at_relay_block = (relay_block_number, relay_block_hash); + }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) + verify { + for parachain in parachains { + assert!(crate::Pallet::::best_parachain_head(parachain).is_some()); + } + } + + // Benchmark `submit_parachain_heads` extrinsic with 1kb proof size. + submit_parachain_heads_with_1kb_proof { + let sender = account("sender", 0, 0); + let parachains = vec![T::parachains()[0]]; + let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( + ¶chains, + DEFAULT_PARACHAIN_HEAD_SIZE, + StorageProofSize::HasLargeLeaf(1024), + ); + let at_relay_block = (relay_block_number, relay_block_hash); + }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) + verify { + for parachain in parachains { + assert!(crate::Pallet::::best_parachain_head(parachain).is_some()); + } + } + + // Benchmark `submit_parachain_heads` extrinsic with 16kb proof size. + submit_parachain_heads_with_16kb_proof { + let sender = account("sender", 0, 0); + let parachains = vec![T::parachains()[0]]; + let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( + ¶chains, + DEFAULT_PARACHAIN_HEAD_SIZE, + StorageProofSize::HasLargeLeaf(16 * 1024), + ); + let at_relay_block = (relay_block_number, relay_block_hash); + }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) + verify { + for parachain in parachains { + assert!(crate::Pallet::::best_parachain_head(parachain).is_some()); + } + } + + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) +} diff --git a/bridges/modules/parachains/src/call_ext.rs b/bridges/modules/parachains/src/call_ext.rs new file mode 100644 index 00000000000..ee3770146c2 --- /dev/null +++ b/bridges/modules/parachains/src/call_ext.rs @@ -0,0 +1,243 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +use crate::{Config, Pallet, RelayBlockNumber}; +use bp_parachains::BestParaHeadHash; +use bp_polkadot_core::parachains::{ParaHash, ParaId}; +use frame_support::{dispatch::CallableCallFor, traits::IsSubType, RuntimeDebug}; +use sp_runtime::transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}; + +/// Info about a `SubmitParachainHeads` call which tries to update a single parachain. +#[derive(PartialEq, RuntimeDebug)] +pub struct SubmitParachainHeadsInfo { + /// Number of the finalized relay block that has been used to prove parachain finality. + pub at_relay_block_number: RelayBlockNumber, + /// Parachain identifier. + pub para_id: ParaId, + /// Hash of the bundled parachain head. + pub para_head_hash: ParaHash, +} + +/// Helper struct that provides methods for working with the `SubmitParachainHeads` call. +pub struct SubmitParachainHeadsHelper, I: 'static> { + _phantom_data: sp_std::marker::PhantomData<(T, I)>, +} + +impl, I: 'static> SubmitParachainHeadsHelper { + /// Check if the para head provided by the `SubmitParachainHeads` is better than the best one + /// we know. + pub fn is_obsolete(update: &SubmitParachainHeadsInfo) -> bool { + let stored_best_head = match crate::ParasInfo::::get(update.para_id) { + Some(stored_best_head) => stored_best_head, + None => return false, + }; + + if stored_best_head.best_head_hash.at_relay_block_number >= update.at_relay_block_number { + log::trace!( + target: crate::LOG_TARGET, + "The parachain head can't be updated. The parachain head for {:?} \ + was already updated at better relay chain block {} >= {}.", + update.para_id, + stored_best_head.best_head_hash.at_relay_block_number, + update.at_relay_block_number + ); + return true + } + + if stored_best_head.best_head_hash.head_hash == update.para_head_hash { + log::trace!( + target: crate::LOG_TARGET, + "The parachain head can't be updated. The parachain head hash for {:?} \ + was already updated to {} at block {} < {}.", + update.para_id, + update.para_head_hash, + stored_best_head.best_head_hash.at_relay_block_number, + update.at_relay_block_number + ); + return true + } + + false + } + + /// Check if the `SubmitParachainHeads` was successfully executed. + pub fn was_successful(update: &SubmitParachainHeadsInfo) -> bool { + match crate::ParasInfo::::get(update.para_id) { + Some(stored_best_head) => + stored_best_head.best_head_hash == + BestParaHeadHash { + at_relay_block_number: update.at_relay_block_number, + head_hash: update.para_head_hash, + }, + None => false, + } + } +} + +/// Trait representing a call that is a sub type of this pallet's call. +pub trait CallSubType, I: 'static>: + IsSubType, T>> +{ + /// Create a new instance of `SubmitParachainHeadsInfo` from a `SubmitParachainHeads` call with + /// one single parachain entry. + fn one_entry_submit_parachain_heads_info(&self) -> Option { + if let Some(crate::Call::::submit_parachain_heads { + ref at_relay_block, + ref parachains, + .. + }) = self.is_sub_type() + { + if let &[(para_id, para_head_hash)] = parachains.as_slice() { + return Some(SubmitParachainHeadsInfo { + at_relay_block_number: at_relay_block.0, + para_id, + para_head_hash, + }) + } + } + + None + } + + /// Create a new instance of `SubmitParachainHeadsInfo` from a `SubmitParachainHeads` call with + /// one single parachain entry, if the entry is for the provided parachain id. + fn submit_parachain_heads_info_for(&self, para_id: u32) -> Option { + self.one_entry_submit_parachain_heads_info() + .filter(|update| update.para_id.0 == para_id) + } + + /// Validate parachain heads in order to avoid "mining" transactions that provide + /// outdated bridged parachain heads. Without this validation, even honest relayers + /// may lose their funds if there are multiple relays running and submitting the + /// same information. + /// + /// This validation only works with transactions that are updating single parachain + /// head. We can't use unbounded validation - it may take too long and either break + /// block production, or "eat" significant portion of block production time literally + /// for nothing. In addition, the single-parachain-head-per-transaction is how the + /// pallet will be used in our environment. + fn check_obsolete_submit_parachain_heads(&self) -> TransactionValidity + where + Self: Sized, + { + let update = match self.one_entry_submit_parachain_heads_info() { + Some(update) => update, + None => return Ok(ValidTransaction::default()), + }; + + if SubmitParachainHeadsHelper::::is_obsolete(&update) { + return InvalidTransaction::Stale.into() + } + + Ok(ValidTransaction::default()) + } +} + +impl CallSubType for T::RuntimeCall +where + T: Config, + T::RuntimeCall: IsSubType, T>>, +{ +} + +#[cfg(test)] +mod tests { + use crate::{ + mock::{run_test, RuntimeCall, TestRuntime}, + CallSubType, ParaInfo, ParasInfo, RelayBlockNumber, + }; + use bp_parachains::BestParaHeadHash; + use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; + + fn validate_submit_parachain_heads( + num: RelayBlockNumber, + parachains: Vec<(ParaId, ParaHash)>, + ) -> bool { + RuntimeCall::Parachains(crate::Call::::submit_parachain_heads { + at_relay_block: (num, Default::default()), + parachains, + parachain_heads_proof: ParaHeadsProof(Vec::new()), + }) + .check_obsolete_submit_parachain_heads() + .is_ok() + } + + fn sync_to_relay_header_10() { + ParasInfo::::insert( + ParaId(1), + ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 10, + head_hash: [1u8; 32].into(), + }, + next_imported_hash_position: 0, + }, + ); + } + + #[test] + fn extension_rejects_header_from_the_obsolete_relay_block() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#5 => tx is + // rejected + sync_to_relay_header_10(); + assert!(!validate_submit_parachain_heads(5, vec![(ParaId(1), [1u8; 32].into())])); + }); + } + + #[test] + fn extension_rejects_header_from_the_same_relay_block() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#10 => tx is + // rejected + sync_to_relay_header_10(); + assert!(!validate_submit_parachain_heads(10, vec![(ParaId(1), [1u8; 32].into())])); + }); + } + + #[test] + fn extension_rejects_header_from_new_relay_block_with_same_hash() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#10 => tx is + // rejected + sync_to_relay_header_10(); + assert!(!validate_submit_parachain_heads(20, vec![(ParaId(1), [1u8; 32].into())])); + }); + } + + #[test] + fn extension_accepts_new_header() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#15 => tx is + // accepted + sync_to_relay_header_10(); + assert!(validate_submit_parachain_heads(15, vec![(ParaId(1), [2u8; 32].into())])); + }); + } + + #[test] + fn extension_accepts_if_more_than_one_parachain_is_submitted() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#5, but another + // parachain head is also supplied => tx is accepted + sync_to_relay_header_10(); + assert!(validate_submit_parachain_heads( + 5, + vec![(ParaId(1), [1u8; 32].into()), (ParaId(2), [1u8; 32].into())] + )); + }); + } +} diff --git a/bridges/modules/parachains/src/lib.rs b/bridges/modules/parachains/src/lib.rs new file mode 100644 index 00000000000..6c89b09513c --- /dev/null +++ b/bridges/modules/parachains/src/lib.rs @@ -0,0 +1,1609 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Parachains finality module. +//! +//! This module needs to be deployed with GRANDPA module, which is syncing relay +//! chain blocks. The main entry point of this module is `submit_parachain_heads`, which +//! accepts storage proof of some parachain `Heads` entries from bridged relay chain. +//! It requires corresponding relay headers to be already synced. + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use weights::WeightInfo; +pub use weights_ext::WeightInfoExt; + +use bp_header_chain::{HeaderChain, HeaderChainError}; +use bp_parachains::{parachain_head_storage_key_at_source, ParaInfo, ParaStoredHeaderData}; +use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; +use bp_runtime::{Chain, HashOf, HeaderId, HeaderIdOf, Parachain, StorageProofError}; +use frame_support::dispatch::PostDispatchInfo; +use sp_std::{marker::PhantomData, vec::Vec}; + +#[cfg(feature = "runtime-benchmarks")] +use bp_parachains::ParaStoredHeaderDataBuilder; +#[cfg(feature = "runtime-benchmarks")] +use bp_runtime::HeaderOf; +#[cfg(feature = "runtime-benchmarks")] +use codec::Encode; + +// Re-export in crate namespace for `construct_runtime!`. +pub use call_ext::*; +pub use pallet::*; + +pub mod weights; +pub mod weights_ext; + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; + +mod call_ext; +#[cfg(test)] +mod mock; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-parachains"; + +/// Block hash of the bridged relay chain. +pub type RelayBlockHash = bp_polkadot_core::Hash; +/// Block number of the bridged relay chain. +pub type RelayBlockNumber = bp_polkadot_core::BlockNumber; +/// Hasher of the bridged relay chain. +pub type RelayBlockHasher = bp_polkadot_core::Hasher; + +/// Artifacts of the parachains head update. +struct UpdateParachainHeadArtifacts { + /// New best head of the parachain. + pub best_head: ParaInfo, + /// If `true`, some old parachain head has been pruned during update. + pub prune_happened: bool, +} + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use bp_parachains::{ + BestParaHeadHash, ImportedParaHeadsKeyProvider, ParaStoredHeaderDataBuilder, + ParasInfoKeyProvider, + }; + use bp_runtime::{ + BasicOperatingMode, BoundedStorageValue, OwnedBridgeModule, StorageDoubleMapKeyProvider, + StorageMapKeyProvider, + }; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + /// Stored parachain head data of given parachains pallet. + pub type StoredParaHeadDataOf = + BoundedStorageValue<>::MaxParaHeadDataSize, ParaStoredHeaderData>; + /// Weight info of the given parachains pallet. + pub type WeightInfoOf = >::WeightInfo; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event, I: 'static = ()> { + /// The caller has provided head of parachain that the pallet is not configured to track. + UntrackedParachainRejected { parachain: ParaId }, + /// The caller has declared that he has provided given parachain head, but it is missing + /// from the storage proof. + MissingParachainHead { parachain: ParaId }, + /// The caller has provided parachain head hash that is not matching the hash read from the + /// storage proof. + IncorrectParachainHeadHash { + parachain: ParaId, + parachain_head_hash: ParaHash, + actual_parachain_head_hash: ParaHash, + }, + /// The caller has provided obsolete parachain head, which is already known to the pallet. + RejectedObsoleteParachainHead { parachain: ParaId, parachain_head_hash: ParaHash }, + /// The caller has provided parachain head that exceeds the maximal configured head size. + RejectedLargeParachainHead { + parachain: ParaId, + parachain_head_hash: ParaHash, + parachain_head_size: u32, + }, + /// Parachain head has been updated. + UpdatedParachainHead { parachain: ParaId, parachain_head_hash: ParaHash }, + } + + #[pallet::error] + pub enum Error { + /// Relay chain block hash is unknown to us. + UnknownRelayChainBlock, + /// The number of stored relay block is different from what the relayer has provided. + InvalidRelayChainBlockNumber, + /// Error generated by a method defined in `bp-header-chain`. + HeaderChain(HeaderChainError), + /// Given parachain head is unknown. + UnknownParaHead, + /// The storage proof doesn't contains storage root. So it is invalid for given header. + StorageRootMismatch, + /// Failed to extract state root from given parachain head. + FailedToExtractStateRoot, + /// Error generated by the `OwnedBridgeModule` trait. + BridgeModule(bp_runtime::OwnedBridgeModuleError), + } + + /// Convenience trait for defining `BridgedChain` bounds. + pub trait BoundedBridgeGrandpaConfig: + pallet_bridge_grandpa::Config + { + type BridgedRelayChain: Chain< + BlockNumber = RelayBlockNumber, + Hash = RelayBlockHash, + Hasher = RelayBlockHasher, + >; + } + + impl BoundedBridgeGrandpaConfig for T + where + T: pallet_bridge_grandpa::Config, + T::BridgedChain: + Chain, + { + type BridgedRelayChain = T::BridgedChain; + } + + #[pallet::config] + #[pallet::disable_frame_system_supertrait_check] + pub trait Config: + BoundedBridgeGrandpaConfig + { + /// The overarching event type. + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + /// Benchmarks results from runtime we're plugged into. + type WeightInfo: WeightInfoExt; + + /// Instance of bridges GRANDPA pallet (within this runtime) that this pallet is linked to. + /// + /// The GRANDPA pallet instance must be configured to import headers of relay chain that + /// we're interested in. + type BridgesGrandpaPalletInstance: 'static; + + /// Name of the original `paras` pallet in the `construct_runtime!()` call at the bridged + /// chain. + /// + /// Please keep in mind that this should be the name of the `runtime_parachains::paras` + /// pallet from polkadot repository, not the `pallet-bridge-parachains`. + #[pallet::constant] + type ParasPalletName: Get<&'static str>; + + /// Parachain head data builder. + /// + /// We never store parachain heads here, since they may be too big (e.g. because of large + /// digest items). Instead we're using the same approach as `pallet-bridge-grandpa` + /// pallet - we are only storing `bp_messages::StoredHeaderData` (number and state root), + /// which is enough for our applications. However, we work with different parachains here + /// and they can use different primitives (for block numbers and hash). So we can't store + /// it directly. Instead, we're storing `bp_messages::StoredHeaderData` in SCALE-encoded + /// form, wrapping it into `bp_parachains::ParaStoredHeaderData`. + /// + /// This builder helps to convert from `HeadData` to `bp_parachains::ParaStoredHeaderData`. + type ParaStoredHeaderDataBuilder: ParaStoredHeaderDataBuilder; + + /// Maximal number of single parachain heads to keep in the storage. + /// + /// The setting is there to prevent growing the on-chain state indefinitely. Note + /// the setting does not relate to parachain block numbers - we will simply keep as much + /// items in the storage, so it doesn't guarantee any fixed timeframe for heads. + /// + /// Incautious change of this constant may lead to orphan entries in the runtime storage. + #[pallet::constant] + type HeadsToKeep: Get; + + /// Maximal size (in bytes) of the SCALE-encoded parachain head data + /// (`bp_parachains::ParaStoredHeaderData`). + /// + /// Keep in mind that the size of any tracked parachain header data must not exceed this + /// value. So if you're going to track multiple parachains, one of which is using large + /// hashes, you shall choose this maximal value. + /// + /// There's no mandatory headers in this pallet, so it can't stall if there's some header + /// that exceeds this bound. + #[pallet::constant] + type MaxParaHeadDataSize: Get; + } + + /// Optional pallet owner. + /// + /// Pallet owner has a right to halt all pallet operations and then resume them. If it is + /// `None`, then there are no direct ways to halt/resume pallet operations, but other + /// runtime methods may still be used to do that (i.e. democracy::referendum to update halt + /// flag directly or call the `halt_operations`). + #[pallet::storage] + pub type PalletOwner, I: 'static = ()> = + StorageValue<_, T::AccountId, OptionQuery>; + + /// The current operating mode of the pallet. + /// + /// Depending on the mode either all, or no transactions will be allowed. + #[pallet::storage] + pub type PalletOperatingMode, I: 'static = ()> = + StorageValue<_, BasicOperatingMode, ValueQuery>; + + /// Parachains info. + /// + /// Contains the following info: + /// - best parachain head hash + /// - the head of the `ImportedParaHashes` ring buffer + #[pallet::storage] + pub type ParasInfo, I: 'static = ()> = StorageMap< + Hasher = ::Hasher, + Key = ::Key, + Value = ::Value, + QueryKind = OptionQuery, + OnEmpty = GetDefault, + MaxValues = MaybeMaxParachains, + >; + + /// State roots of parachain heads which have been imported into the pallet. + #[pallet::storage] + pub type ImportedParaHeads, I: 'static = ()> = StorageDoubleMap< + Hasher1 = ::Hasher1, + Key1 = ::Key1, + Hasher2 = ::Hasher2, + Key2 = ::Key2, + Value = StoredParaHeadDataOf, + QueryKind = OptionQuery, + OnEmpty = GetDefault, + MaxValues = MaybeMaxTotalParachainHashes, + >; + + /// A ring buffer of imported parachain head hashes. Ordered by the insertion time. + #[pallet::storage] + pub(super) type ImportedParaHashes, I: 'static = ()> = StorageDoubleMap< + Hasher1 = Blake2_128Concat, + Key1 = ParaId, + Hasher2 = Twox64Concat, + Key2 = u32, + Value = ParaHash, + QueryKind = OptionQuery, + OnEmpty = GetDefault, + MaxValues = MaybeMaxTotalParachainHashes, + >; + + #[pallet::pallet] + pub struct Pallet(PhantomData<(T, I)>); + + impl, I: 'static> OwnedBridgeModule for Pallet { + const LOG_TARGET: &'static str = LOG_TARGET; + type OwnerStorage = PalletOwner; + type OperatingMode = BasicOperatingMode; + type OperatingModeStorage = PalletOperatingMode; + } + + #[pallet::call] + impl, I: 'static> Pallet { + /// Submit proof of one or several parachain heads. + /// + /// The proof is supposed to be proof of some `Heads` entries from the + /// `polkadot-runtime-parachains::paras` pallet instance, deployed at the bridged chain. + /// The proof is supposed to be crafted at the `relay_header_hash` that must already be + /// imported by corresponding GRANDPA pallet at this chain. + /// + /// The call fails if: + /// + /// - the pallet is halted; + /// + /// - the relay chain block `at_relay_block` is not imported by the associated bridge + /// GRANDPA pallet. + /// + /// The call may succeed, but some heads may not be updated e.g. because pallet knows + /// better head or it isn't tracked by the pallet. + #[pallet::call_index(0)] + #[pallet::weight(WeightInfoOf::::submit_parachain_heads_weight( + T::DbWeight::get(), + parachain_heads_proof, + parachains.len() as _, + ))] + pub fn submit_parachain_heads( + _origin: OriginFor, + at_relay_block: (RelayBlockNumber, RelayBlockHash), + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> DispatchResultWithPostInfo { + Self::ensure_not_halted().map_err(Error::::BridgeModule)?; + + // we'll need relay chain header to verify that parachains heads are always increasing. + let (relay_block_number, relay_block_hash) = at_relay_block; + let relay_block = pallet_bridge_grandpa::ImportedHeaders::< + T, + T::BridgesGrandpaPalletInstance, + >::get(relay_block_hash) + .ok_or(Error::::UnknownRelayChainBlock)?; + ensure!( + relay_block.number == relay_block_number, + Error::::InvalidRelayChainBlockNumber, + ); + + // now parse storage proof and read parachain heads + let mut actual_weight = WeightInfoOf::::submit_parachain_heads_weight( + T::DbWeight::get(), + ¶chain_heads_proof, + parachains.len() as _, + ); + + pallet_bridge_grandpa::Pallet::::parse_finalized_storage_proof( + relay_block_hash, + parachain_heads_proof.0, + move |mut storage| { + for (parachain, parachain_head_hash) in parachains { + let parachain_head = match Pallet::::read_parachain_head(&mut storage, parachain) { + Ok(Some(parachain_head)) => parachain_head, + Ok(None) => { + log::trace!( + target: LOG_TARGET, + "The head of parachain {:?} is None. {}", + parachain, + if ParasInfo::::contains_key(parachain) { + "Looks like it is not yet registered at the source relay chain" + } else { + "Looks like it has been deregistered from the source relay chain" + }, + ); + Self::deposit_event(Event::MissingParachainHead { parachain }); + continue; + }, + Err(e) => { + log::trace!( + target: LOG_TARGET, + "The read of head of parachain {:?} has failed: {:?}", + parachain, + e, + ); + Self::deposit_event(Event::MissingParachainHead { parachain }); + continue; + }, + }; + + // if relayer has specified invalid parachain head hash, ignore the head + // (this isn't strictly necessary, but better safe than sorry) + let actual_parachain_head_hash = parachain_head.hash(); + if parachain_head_hash != actual_parachain_head_hash { + log::trace!( + target: LOG_TARGET, + "The submitter has specified invalid parachain {:?} head hash: {:?} vs {:?}", + parachain, + parachain_head_hash, + actual_parachain_head_hash, + ); + Self::deposit_event(Event::IncorrectParachainHeadHash { + parachain, + parachain_head_hash, + actual_parachain_head_hash, + }); + continue; + } + + // convert from parachain head into stored parachain head data + let parachain_head_data = match T::ParaStoredHeaderDataBuilder::try_build( + parachain, + ¶chain_head, + ) { + Some(parachain_head_data) => parachain_head_data, + None => { + log::trace!( + target: LOG_TARGET, + "The head of parachain {:?} has been provided, but it is not tracked by the pallet", + parachain, + ); + Self::deposit_event(Event::UntrackedParachainRejected { parachain }); + continue; + }, + }; + + let update_result: Result<_, ()> = ParasInfo::::try_mutate(parachain, |stored_best_head| { + let artifacts = Pallet::::update_parachain_head( + parachain, + stored_best_head.take(), + relay_block_number, + parachain_head_data, + parachain_head_hash, + )?; + *stored_best_head = Some(artifacts.best_head); + Ok(artifacts.prune_happened) + }); + + // we're refunding weight if update has not happened and if pruning has not happened + let is_update_happened = matches!(update_result, Ok(_)); + if !is_update_happened { + actual_weight = actual_weight + .saturating_sub(WeightInfoOf::::parachain_head_storage_write_weight(T::DbWeight::get())); + } + let is_prune_happened = matches!(update_result, Ok(true)); + if !is_prune_happened { + actual_weight = actual_weight + .saturating_sub(WeightInfoOf::::parachain_head_pruning_weight(T::DbWeight::get())); + } + } + + // even though we may have accepted some parachain heads, we can't allow relayers to submit + // proof with unused trie nodes + // => treat this as an error + // + // (we can throw error here, because now all our calls are transactional) + storage.ensure_no_unused_nodes() + }, + ) + .and_then(|r| r.map_err(HeaderChainError::StorageProof)) + .map_err(|e| { + log::trace!(target: LOG_TARGET, "Parachain heads storage proof is invalid: {:?}", e); + Error::::HeaderChain(e) + })?; + + Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes }) + } + + /// Change `PalletOwner`. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(1)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { + >::set_owner(origin, new_owner) + } + + /// Halt or resume all pallet operations. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(2)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + operating_mode: BasicOperatingMode, + ) -> DispatchResult { + >::set_operating_mode(origin, operating_mode) + } + } + + impl, I: 'static> Pallet { + /// Get stored parachain info. + pub fn best_parachain_info(parachain: ParaId) -> Option { + ParasInfo::::get(parachain) + } + + /// Get best finalized head data of the given parachain. + pub fn best_parachain_head(parachain: ParaId) -> Option { + let best_para_head_hash = ParasInfo::::get(parachain)?.best_head_hash.head_hash; + ImportedParaHeads::::get(parachain, best_para_head_hash).map(|h| h.into_inner()) + } + + /// Get best finalized head hash of the given parachain. + pub fn best_parachain_head_hash(parachain: ParaId) -> Option { + Some(ParasInfo::::get(parachain)?.best_head_hash.head_hash) + } + + /// Get best finalized head id of the given parachain. + pub fn best_parachain_head_id + Parachain>( + ) -> Result>, codec::Error> { + let parachain = ParaId(C::PARACHAIN_ID); + let best_head_hash = match Self::best_parachain_head_hash(parachain) { + Some(best_head_hash) => best_head_hash, + None => return Ok(None), + }; + let encoded_head = match Self::parachain_head(parachain, best_head_hash) { + Some(encoded_head) => encoded_head, + None => return Ok(None), + }; + encoded_head + .decode_parachain_head_data::() + .map(|data| Some(HeaderId(data.number, best_head_hash))) + } + + /// Get parachain head data with given hash. + pub fn parachain_head(parachain: ParaId, hash: ParaHash) -> Option { + ImportedParaHeads::::get(parachain, hash).map(|h| h.into_inner()) + } + + /// Read parachain head from storage proof. + fn read_parachain_head( + storage: &mut bp_runtime::StorageProofChecker, + parachain: ParaId, + ) -> Result, StorageProofError> { + let parachain_head_key = + parachain_head_storage_key_at_source(T::ParasPalletName::get(), parachain); + storage.read_and_decode_value(parachain_head_key.0.as_ref()) + } + + /// Try to update parachain head. + pub(super) fn update_parachain_head( + parachain: ParaId, + stored_best_head: Option, + new_at_relay_block_number: RelayBlockNumber, + new_head_data: ParaStoredHeaderData, + new_head_hash: ParaHash, + ) -> Result { + // check if head has been already updated at better relay chain block. Without this + // check, we may import heads in random order + let update = SubmitParachainHeadsInfo { + at_relay_block_number: new_at_relay_block_number, + para_id: parachain, + para_head_hash: new_head_hash, + }; + if SubmitParachainHeadsHelper::::is_obsolete(&update) { + Self::deposit_event(Event::RejectedObsoleteParachainHead { + parachain, + parachain_head_hash: new_head_hash, + }); + return Err(()) + } + + // verify that the parachain head data size is <= `MaxParaHeadDataSize` + let updated_head_data = + match StoredParaHeadDataOf::::try_from_inner(new_head_data) { + Ok(updated_head_data) => updated_head_data, + Err(e) => { + log::trace!( + target: LOG_TARGET, + "The parachain head can't be updated. The parachain head data size \ + for {:?} is {}. It exceeds maximal configured size {}.", + parachain, + e.value_size, + e.maximal_size, + ); + + Self::deposit_event(Event::RejectedLargeParachainHead { + parachain, + parachain_head_hash: new_head_hash, + parachain_head_size: e.value_size as _, + }); + + return Err(()) + }, + }; + + let next_imported_hash_position = stored_best_head + .map_or(0, |stored_best_head| stored_best_head.next_imported_hash_position); + + // insert updated best parachain head + let head_hash_to_prune = + ImportedParaHashes::::try_get(parachain, next_imported_hash_position); + let updated_best_para_head = ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: new_at_relay_block_number, + head_hash: new_head_hash, + }, + next_imported_hash_position: (next_imported_hash_position + 1) % + T::HeadsToKeep::get(), + }; + ImportedParaHashes::::insert( + parachain, + next_imported_hash_position, + new_head_hash, + ); + ImportedParaHeads::::insert(parachain, new_head_hash, updated_head_data); + log::trace!( + target: LOG_TARGET, + "Updated head of parachain {:?} to {}", + parachain, + new_head_hash, + ); + + // remove old head + let prune_happened = head_hash_to_prune.is_ok(); + if let Ok(head_hash_to_prune) = head_hash_to_prune { + log::trace!( + target: LOG_TARGET, + "Pruning old head of parachain {:?}: {}", + parachain, + head_hash_to_prune, + ); + ImportedParaHeads::::remove(parachain, head_hash_to_prune); + } + Self::deposit_event(Event::UpdatedParachainHead { + parachain, + parachain_head_hash: new_head_hash, + }); + + Ok(UpdateParachainHeadArtifacts { best_head: updated_best_para_head, prune_happened }) + } + } + + #[pallet::genesis_config] + pub struct GenesisConfig, I: 'static = ()> { + /// Initial pallet operating mode. + pub operating_mode: BasicOperatingMode, + /// Initial pallet owner. + pub owner: Option, + /// Dummy marker. + pub phantom: sp_std::marker::PhantomData, + } + + #[cfg(feature = "std")] + impl, I: 'static> Default for GenesisConfig { + fn default() -> Self { + Self { + operating_mode: Default::default(), + owner: Default::default(), + phantom: Default::default(), + } + } + } + + #[pallet::genesis_build] + impl, I: 'static> GenesisBuild for GenesisConfig { + fn build(&self) { + PalletOperatingMode::::put(self.operating_mode); + if let Some(ref owner) = self.owner { + PalletOwner::::put(owner); + } + } + } + + /// Returns maximal number of parachains, supported by the pallet. + pub struct MaybeMaxParachains(PhantomData<(T, I)>); + + impl, I: 'static> Get> for MaybeMaxParachains { + fn get() -> Option { + Some(T::ParaStoredHeaderDataBuilder::supported_parachains()) + } + } + + /// Returns total number of all parachains hashes/heads, stored by the pallet. + pub struct MaybeMaxTotalParachainHashes(PhantomData<(T, I)>); + + impl, I: 'static> Get> for MaybeMaxTotalParachainHashes { + fn get() -> Option { + Some( + T::ParaStoredHeaderDataBuilder::supported_parachains() + .saturating_mul(T::HeadsToKeep::get()), + ) + } + } +} + +/// Single parachain header chain adapter. +pub struct ParachainHeaders(PhantomData<(T, I, C)>); + +impl, I: 'static, C: Parachain> HeaderChain + for ParachainHeaders +{ + fn finalized_header_state_root(hash: HashOf) -> Option> { + Pallet::::parachain_head(ParaId(C::PARACHAIN_ID), hash) + .and_then(|head| head.decode_parachain_head_data::().ok()) + .map(|h| h.state_root) + } +} + +/// (Re)initialize pallet with given header for using it in `pallet-bridge-messages` benchmarks. +#[cfg(feature = "runtime-benchmarks")] +pub fn initialize_for_benchmarks, I: 'static, PC: Parachain>( + header: HeaderOf, +) { + let parachain = ParaId(PC::PARACHAIN_ID); + let parachain_head = ParaHead(header.encode()); + let updated_head_data = T::ParaStoredHeaderDataBuilder::try_build(parachain, ¶chain_head) + .expect("failed to build stored parachain head in benchmarks"); + Pallet::::update_parachain_head( + parachain, + None, + 0, + updated_head_data, + parachain_head.hash(), + ) + .expect("failed to insert parachain head in benchmarks"); +} + +#[cfg(test)] +pub(crate) mod tests { + use super::*; + use crate::mock::{ + run_test, test_relay_header, BigParachainHeader, RegularParachainHasher, + RegularParachainHeader, RuntimeEvent as TestEvent, RuntimeOrigin, TestRuntime, + PARAS_PALLET_NAME, UNTRACKED_PARACHAIN_ID, + }; + use codec::Encode; + + use bp_parachains::{ + BestParaHeadHash, BridgeParachainCall, ImportedParaHeadsKeyProvider, ParasInfoKeyProvider, + }; + use bp_runtime::{ + record_all_trie_keys, BasicOperatingMode, OwnedBridgeModuleError, + StorageDoubleMapKeyProvider, StorageMapKeyProvider, + }; + use bp_test_utils::{ + authority_list, generate_owned_bridge_module_tests, make_default_justification, + }; + use frame_support::{ + assert_noop, assert_ok, + dispatch::DispatchResultWithPostInfo, + storage::generator::{StorageDoubleMap, StorageMap}, + traits::{Get, OnInitialize}, + weights::Weight, + }; + use frame_system::{EventRecord, Pallet as System, Phase}; + use sp_core::Hasher; + use sp_runtime::{traits::Header as HeaderT, DispatchError}; + use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; + + type BridgesGrandpaPalletInstance = pallet_bridge_grandpa::Instance1; + type WeightInfo = ::WeightInfo; + type DbWeight = ::DbWeight; + + pub(crate) fn initialize(state_root: RelayBlockHash) -> RelayBlockHash { + pallet_bridge_grandpa::Pallet::::initialize( + RuntimeOrigin::root(), + bp_header_chain::InitializationData { + header: Box::new(test_relay_header(0, state_root)), + authority_list: authority_list(), + set_id: 1, + operating_mode: BasicOperatingMode::Normal, + }, + ) + .unwrap(); + + System::::set_block_number(1); + System::::reset_events(); + + test_relay_header(0, state_root).hash() + } + + fn proceed(num: RelayBlockNumber, state_root: RelayBlockHash) -> ParaHash { + pallet_bridge_grandpa::Pallet::::on_initialize( + 0, + ); + + let header = test_relay_header(num, state_root); + let hash = header.hash(); + let justification = make_default_justification(&header); + assert_ok!( + pallet_bridge_grandpa::Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ) + ); + + hash + } + + pub(crate) fn prepare_parachain_heads_proof( + heads: Vec<(u32, ParaHead)>, + ) -> (RelayBlockHash, ParaHeadsProof, Vec<(ParaId, ParaHash)>) { + let mut parachains = Vec::with_capacity(heads.len()); + let mut root = Default::default(); + let mut mdb = MemoryDB::default(); + { + let mut trie = TrieDBMutBuilderV1::::new(&mut mdb, &mut root).build(); + for (parachain, head) in heads { + let storage_key = + parachain_head_storage_key_at_source(PARAS_PALLET_NAME, ParaId(parachain)); + trie.insert(&storage_key.0, &head.encode()) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in tests"); + parachains.push((ParaId(parachain), head.hash())); + } + } + + // generate storage proof to be delivered to This chain + let storage_proof = record_all_trie_keys::, _>(&mdb, &root) + .map_err(|_| "record_all_trie_keys has failed") + .expect("record_all_trie_keys should not fail in benchmarks"); + + (root, ParaHeadsProof(storage_proof), parachains) + } + + fn initial_best_head(parachain: u32) -> ParaInfo { + ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(parachain, 0).hash(), + }, + next_imported_hash_position: 1, + } + } + + pub(crate) fn head_data(parachain: u32, head_number: u32) -> ParaHead { + ParaHead( + RegularParachainHeader::new( + head_number as _, + Default::default(), + RegularParachainHasher::hash(&(parachain, head_number).encode()), + Default::default(), + Default::default(), + ) + .encode(), + ) + } + + fn stored_head_data(parachain: u32, head_number: u32) -> ParaStoredHeaderData { + ParaStoredHeaderData( + (head_number as u64, RegularParachainHasher::hash(&(parachain, head_number).encode())) + .encode(), + ) + } + + fn big_head_data(parachain: u32, head_number: u32) -> ParaHead { + ParaHead( + BigParachainHeader::new( + head_number as _, + Default::default(), + RegularParachainHasher::hash(&(parachain, head_number).encode()), + Default::default(), + Default::default(), + ) + .encode(), + ) + } + + fn big_stored_head_data(parachain: u32, head_number: u32) -> ParaStoredHeaderData { + ParaStoredHeaderData( + (head_number as u128, RegularParachainHasher::hash(&(parachain, head_number).encode())) + .encode(), + ) + } + + fn head_hash(parachain: u32, head_number: u32) -> ParaHash { + head_data(parachain, head_number).hash() + } + + fn import_parachain_1_head( + relay_chain_block: RelayBlockNumber, + relay_state_root: RelayBlockHash, + parachains: Vec<(ParaId, ParaHash)>, + proof: ParaHeadsProof, + ) -> DispatchResultWithPostInfo { + Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (relay_chain_block, test_relay_header(relay_chain_block, relay_state_root).hash()), + parachains, + proof, + ) + } + + fn weight_of_import_parachain_1_head(proof: &ParaHeadsProof, prune_expected: bool) -> Weight { + let db_weight = ::DbWeight::get(); + WeightInfoOf::::submit_parachain_heads_weight(db_weight, proof, 1) + .saturating_sub(if prune_expected { + Weight::zero() + } else { + WeightInfoOf::::parachain_head_pruning_weight(db_weight) + }) + } + + #[test] + fn submit_parachain_heads_checks_operating_mode() { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 0))]); + + run_test(|| { + initialize(state_root); + + // `submit_parachain_heads()` should fail when the pallet is halted. + PalletOperatingMode::::put(BasicOperatingMode::Halted); + assert_noop!( + Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains.clone(), + proof.clone(), + ), + Error::::BridgeModule(OwnedBridgeModuleError::Halted) + ); + + // `submit_parachain_heads()` should succeed now that the pallet is resumed. + PalletOperatingMode::::put(BasicOperatingMode::Normal); + assert_ok!(Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + ),); + }); + } + + #[test] + fn imports_initial_parachain_heads() { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 0)), (3, head_data(3, 10))]); + run_test(|| { + initialize(state_root); + + // we're trying to update heads of parachains 1, 2 and 3 + let expected_weight = + WeightInfo::submit_parachain_heads_weight(DbWeight::get(), &proof, 2); + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + ); + assert_ok!(result); + assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); + + // but only 1 and 2 are updated, because proof is missing head of parachain#2 + assert_eq!(ParasInfo::::get(ParaId(1)), Some(initial_best_head(1))); + assert_eq!(ParasInfo::::get(ParaId(2)), None); + assert_eq!( + ParasInfo::::get(ParaId(3)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(3, 10).hash() + }, + next_imported_hash_position: 1, + }) + ); + + assert_eq!( + ImportedParaHeads::::get( + ParaId(1), + initial_best_head(1).best_head_hash.head_hash + ) + .map(|h| h.into_inner()), + Some(stored_head_data(1, 0)) + ); + assert_eq!( + ImportedParaHeads::::get( + ParaId(2), + initial_best_head(2).best_head_hash.head_hash + ) + .map(|h| h.into_inner()), + None + ); + assert_eq!( + ImportedParaHeads::::get(ParaId(3), head_hash(3, 10)) + .map(|h| h.into_inner()), + Some(stored_head_data(3, 10)) + ); + + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(3), + parachain_head_hash: head_data(3, 10).hash(), + }), + topics: vec![], + } + ], + ); + }); + } + + #[test] + fn imports_parachain_heads_is_able_to_progress() { + let (state_root_5, proof_5, parachains_5) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 5))]); + let (state_root_10, proof_10, parachains_10) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 10))]); + run_test(|| { + // start with relay block #0 and import head#5 of parachain#1 + initialize(state_root_5); + assert_ok!(import_parachain_1_head(0, state_root_5, parachains_5, proof_5)); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(1, 5).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!( + ImportedParaHeads::::get(ParaId(1), head_data(1, 5).hash()) + .map(|h| h.into_inner()), + Some(stored_head_data(1, 5)) + ); + assert_eq!( + ImportedParaHeads::::get(ParaId(1), head_data(1, 10).hash()) + .map(|h| h.into_inner()), + None + ); + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + }], + ); + + // import head#10 of parachain#1 at relay block #1 + let relay_1_hash = proceed(1, state_root_10); + assert_ok!(import_parachain_1_head(1, state_root_10, parachains_10, proof_10)); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 1, + head_hash: head_data(1, 10).hash() + }, + next_imported_hash_position: 2, + }) + ); + assert_eq!( + ImportedParaHeads::::get(ParaId(1), head_data(1, 5).hash()) + .map(|h| h.into_inner()), + Some(stored_head_data(1, 5)) + ); + assert_eq!( + ImportedParaHeads::::get(ParaId(1), head_data(1, 10).hash()) + .map(|h| h.into_inner()), + Some(stored_head_data(1, 10)) + ); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Grandpa1( + pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { + number: 1, + hash: relay_1_hash, + } + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 10).hash(), + }), + topics: vec![], + } + ], + ); + }); + } + + #[test] + fn ignores_untracked_parachain() { + let (state_root, proof, parachains) = prepare_parachain_heads_proof(vec![ + (1, head_data(1, 5)), + (UNTRACKED_PARACHAIN_ID, head_data(1, 5)), + (2, head_data(1, 5)), + ]); + run_test(|| { + // start with relay block #0 and try to import head#5 of parachain#1 and untracked + // parachain + let expected_weight = + WeightInfo::submit_parachain_heads_weight(DbWeight::get(), &proof, 3) + .saturating_sub(WeightInfo::parachain_head_storage_write_weight( + DbWeight::get(), + )); + initialize(state_root); + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + ); + assert_ok!(result); + assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(1, 5).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!(ParasInfo::::get(ParaId(UNTRACKED_PARACHAIN_ID)), None,); + assert_eq!( + ParasInfo::::get(ParaId(2)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(1, 5).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UntrackedParachainRejected { + parachain: ParaId(UNTRACKED_PARACHAIN_ID), + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(2), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + } + ], + ); + }); + } + + #[test] + fn does_nothing_when_already_imported_this_head_at_previous_relay_header() { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 0))]); + run_test(|| { + // import head#0 of parachain#1 at relay block#0 + initialize(state_root); + assert_ok!(import_parachain_1_head(0, state_root, parachains.clone(), proof.clone())); + assert_eq!(ParasInfo::::get(ParaId(1)), Some(initial_best_head(1))); + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, + }), + topics: vec![], + }], + ); + + // try to import head#0 of parachain#1 at relay block#1 + // => call succeeds, but nothing is changed + let relay_1_hash = proceed(1, state_root); + assert_ok!(import_parachain_1_head(1, state_root, parachains, proof)); + assert_eq!(ParasInfo::::get(ParaId(1)), Some(initial_best_head(1))); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Grandpa1( + pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { + number: 1, + hash: relay_1_hash, + } + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::RejectedObsoleteParachainHead { + parachain: ParaId(1), + parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, + }), + topics: vec![], + } + ], + ); + }); + } + + #[test] + fn does_nothing_when_already_imported_head_at_better_relay_header() { + let (state_root_5, proof_5, parachains_5) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 5))]); + let (state_root_10, proof_10, parachains_10) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 10))]); + run_test(|| { + // start with relay block #0 + initialize(state_root_5); + + // head#10 of parachain#1 at relay block#1 + let relay_1_hash = proceed(1, state_root_10); + assert_ok!(import_parachain_1_head(1, state_root_10, parachains_10, proof_10)); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 1, + head_hash: head_data(1, 10).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Grandpa1( + pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { + number: 1, + hash: relay_1_hash, + } + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 10).hash(), + }), + topics: vec![], + } + ], + ); + + // now try to import head#5 at relay block#0 + // => nothing is changed, because better head has already been imported + assert_ok!(import_parachain_1_head(0, state_root_5, parachains_5, proof_5)); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 1, + head_hash: head_data(1, 10).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Grandpa1( + pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { + number: 1, + hash: relay_1_hash, + } + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 10).hash(), + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::RejectedObsoleteParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + } + ], + ); + }); + } + + #[test] + fn does_nothing_when_parachain_head_is_too_large() { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 5)), (4, big_head_data(1, 5))]); + run_test(|| { + // start with relay block #0 and try to import head#5 of parachain#1 and big parachain + initialize(state_root); + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + ); + assert_ok!(result); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(1, 5).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!(ParasInfo::::get(ParaId(4)), None); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::RejectedLargeParachainHead { + parachain: ParaId(4), + parachain_head_hash: big_head_data(1, 5).hash(), + parachain_head_size: big_stored_head_data(1, 5).encoded_size() as u32, + }), + topics: vec![], + }, + ], + ); + }); + } + + #[test] + fn prunes_old_heads() { + run_test(|| { + let heads_to_keep = crate::mock::HeadsToKeep::get(); + + // import exactly `HeadsToKeep` headers + for i in 0..heads_to_keep { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof(vec![(1, head_data(1, i))]); + if i == 0 { + initialize(state_root); + } else { + proceed(i, state_root); + } + + let expected_weight = weight_of_import_parachain_1_head(&proof, false); + let result = import_parachain_1_head(i, state_root, parachains, proof); + assert_ok!(result); + assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); + } + + // nothing is pruned yet + for i in 0..heads_to_keep { + assert!(ImportedParaHeads::::get(ParaId(1), head_data(1, i).hash()) + .is_some()); + } + + // import next relay chain header and next parachain head + let (state_root, proof, parachains) = + prepare_parachain_heads_proof(vec![(1, head_data(1, heads_to_keep))]); + proceed(heads_to_keep, state_root); + let expected_weight = weight_of_import_parachain_1_head(&proof, true); + let result = import_parachain_1_head(heads_to_keep, state_root, parachains, proof); + assert_ok!(result); + assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); + + // and the head#0 is pruned + assert!( + ImportedParaHeads::::get(ParaId(1), head_data(1, 0).hash()).is_none() + ); + for i in 1..=heads_to_keep { + assert!(ImportedParaHeads::::get(ParaId(1), head_data(1, i).hash()) + .is_some()); + } + }); + } + + #[test] + fn fails_on_unknown_relay_chain_block() { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 5))]); + run_test(|| { + // start with relay block #0 + initialize(state_root); + + // try to import head#5 of parachain#1 at unknown relay chain block #1 + assert_noop!( + import_parachain_1_head(1, state_root, parachains, proof), + Error::::UnknownRelayChainBlock + ); + }); + } + + #[test] + fn fails_on_invalid_storage_proof() { + let (_state_root, proof, parachains) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 5))]); + run_test(|| { + // start with relay block #0 + initialize(Default::default()); + + // try to import head#5 of parachain#1 at relay chain block #0 + assert_noop!( + import_parachain_1_head(0, Default::default(), parachains, proof), + Error::::HeaderChain(HeaderChainError::StorageProof( + StorageProofError::StorageRootMismatch + )) + ); + }); + } + + #[test] + fn is_not_rewriting_existing_head_if_failed_to_read_updated_head() { + let (state_root_5, proof_5, parachains_5) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 5))]); + let (state_root_10_at_20, proof_10_at_20, parachains_10_at_20) = + prepare_parachain_heads_proof(vec![(2, head_data(2, 10))]); + let (state_root_10_at_30, proof_10_at_30, parachains_10_at_30) = + prepare_parachain_heads_proof(vec![(1, head_data(1, 10))]); + run_test(|| { + // we've already imported head#5 of parachain#1 at relay block#10 + initialize(state_root_5); + import_parachain_1_head(0, state_root_5, parachains_5, proof_5).expect("ok"); + assert_eq!( + Pallet::::best_parachain_head(ParaId(1)), + Some(stored_head_data(1, 5)) + ); + + // then if someone is pretending to provide updated head#10 of parachain#1 at relay + // block#20, but fails to do that + // + // => we'll leave previous value + proceed(20, state_root_10_at_20); + assert_ok!(Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (20, test_relay_header(20, state_root_10_at_20).hash()), + parachains_10_at_20, + proof_10_at_20, + ),); + assert_eq!( + Pallet::::best_parachain_head(ParaId(1)), + Some(stored_head_data(1, 5)) + ); + + // then if someone is pretending to provide updated head#10 of parachain#1 at relay + // block#30, and actualy provides it + // + // => we'll update value + proceed(30, state_root_10_at_30); + assert_ok!(Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (30, test_relay_header(30, state_root_10_at_30).hash()), + parachains_10_at_30, + proof_10_at_30, + ),); + assert_eq!( + Pallet::::best_parachain_head(ParaId(1)), + Some(stored_head_data(1, 10)) + ); + }); + } + + #[test] + fn storage_keys_computed_properly() { + assert_eq!( + ParasInfo::::storage_map_final_key(ParaId(42)).to_vec(), + ParasInfoKeyProvider::final_key("Parachains", &ParaId(42)).0 + ); + + assert_eq!( + ImportedParaHeads::::storage_double_map_final_key( + ParaId(42), + ParaHash::from([21u8; 32]) + ) + .to_vec(), + ImportedParaHeadsKeyProvider::final_key( + "Parachains", + &ParaId(42), + &ParaHash::from([21u8; 32]) + ) + .0, + ); + } + + #[test] + fn ignores_parachain_head_if_it_is_missing_from_storage_proof() { + let (state_root, proof, _) = prepare_parachain_heads_proof(vec![]); + let parachains = vec![(ParaId(2), Default::default())]; + run_test(|| { + initialize(state_root); + assert_ok!(Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + )); + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::MissingParachainHead { + parachain: ParaId(2), + }), + topics: vec![], + }], + ); + }); + } + + #[test] + fn ignores_parachain_head_if_parachain_head_hash_is_wrong() { + let (state_root, proof, _) = prepare_parachain_heads_proof(vec![(1, head_data(1, 0))]); + let parachains = vec![(ParaId(1), head_data(1, 10).hash())]; + run_test(|| { + initialize(state_root); + assert_ok!(Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + )); + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::IncorrectParachainHeadHash { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 10).hash(), + actual_parachain_head_hash: head_data(1, 0).hash(), + }), + topics: vec![], + }], + ); + }); + } + + #[test] + fn test_bridge_parachain_call_is_correctly_defined() { + let (state_root, proof, _) = prepare_parachain_heads_proof(vec![(1, head_data(1, 0))]); + let parachains = vec![(ParaId(2), Default::default())]; + let relay_header_id = (0, test_relay_header(0, state_root).hash()); + + let direct_submit_parachain_heads_call = Call::::submit_parachain_heads { + at_relay_block: relay_header_id, + parachains: parachains.clone(), + parachain_heads_proof: proof.clone(), + }; + let indirect_submit_parachain_heads_call = BridgeParachainCall::submit_parachain_heads { + at_relay_block: relay_header_id, + parachains, + parachain_heads_proof: proof, + }; + assert_eq!( + direct_submit_parachain_heads_call.encode(), + indirect_submit_parachain_heads_call.encode() + ); + } + + generate_owned_bridge_module_tests!(BasicOperatingMode::Normal, BasicOperatingMode::Halted); + + #[test] + fn maybe_max_parachains_returns_correct_value() { + assert_eq!(MaybeMaxParachains::::get(), Some(mock::TOTAL_PARACHAINS)); + } + + #[test] + fn maybe_max_total_parachain_hashes_returns_correct_value() { + assert_eq!( + MaybeMaxTotalParachainHashes::::get(), + Some(mock::TOTAL_PARACHAINS * mock::HeadsToKeep::get()), + ); + } +} diff --git a/bridges/modules/parachains/src/mock.rs b/bridges/modules/parachains/src/mock.rs new file mode 100644 index 00000000000..3086adc1cc2 --- /dev/null +++ b/bridges/modules/parachains/src/mock.rs @@ -0,0 +1,349 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +use bp_header_chain::ChainWithGrandpa; +use bp_polkadot_core::parachains::ParaId; +use bp_runtime::{Chain, Parachain}; +use frame_support::{construct_runtime, parameter_types, traits::ConstU32, weights::Weight}; +use sp_runtime::{ + testing::{Header, H256}, + traits::{BlakeTwo256, Header as HeaderT, IdentityLookup}, + MultiSignature, Perbill, +}; + +use crate as pallet_bridge_parachains; + +pub type AccountId = u64; +pub type TestNumber = u64; + +pub type RelayBlockHeader = + sp_runtime::generic::Header; + +type Block = frame_system::mocking::MockBlock; +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; + +pub const PARAS_PALLET_NAME: &str = "Paras"; +pub const UNTRACKED_PARACHAIN_ID: u32 = 10; +// use exact expected encoded size: `vec_len_size + header_number_size + state_root_hash_size` +pub const MAXIMAL_PARACHAIN_HEAD_DATA_SIZE: u32 = 1 + 8 + 32; +// total parachains that we use in tests +pub const TOTAL_PARACHAINS: u32 = 4; + +pub type RegularParachainHeader = sp_runtime::testing::Header; +pub type RegularParachainHasher = BlakeTwo256; +pub type BigParachainHeader = sp_runtime::generic::Header; + +pub struct Parachain1; + +impl Chain for Parachain1 { + type BlockNumber = u64; + type Hash = H256; + type Hasher = RegularParachainHasher; + type Header = RegularParachainHeader; + type AccountId = u64; + type Balance = u64; + type Index = u64; + type Signature = MultiSignature; + + fn max_extrinsic_size() -> u32 { + 0 + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl Parachain for Parachain1 { + const PARACHAIN_ID: u32 = 1; +} + +pub struct Parachain2; + +impl Chain for Parachain2 { + type BlockNumber = u64; + type Hash = H256; + type Hasher = RegularParachainHasher; + type Header = RegularParachainHeader; + type AccountId = u64; + type Balance = u64; + type Index = u64; + type Signature = MultiSignature; + + fn max_extrinsic_size() -> u32 { + 0 + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl Parachain for Parachain2 { + const PARACHAIN_ID: u32 = 2; +} + +pub struct Parachain3; + +impl Chain for Parachain3 { + type BlockNumber = u64; + type Hash = H256; + type Hasher = RegularParachainHasher; + type Header = RegularParachainHeader; + type AccountId = u64; + type Balance = u64; + type Index = u64; + type Signature = MultiSignature; + + fn max_extrinsic_size() -> u32 { + 0 + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl Parachain for Parachain3 { + const PARACHAIN_ID: u32 = 3; +} + +// this parachain is using u128 as block number and stored head data size exceeds limit +pub struct BigParachain; + +impl Chain for BigParachain { + type BlockNumber = u128; + type Hash = H256; + type Hasher = RegularParachainHasher; + type Header = BigParachainHeader; + type AccountId = u64; + type Balance = u64; + type Index = u64; + type Signature = MultiSignature; + + fn max_extrinsic_size() -> u32 { + 0 + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl Parachain for BigParachain { + const PARACHAIN_ID: u32 = 4; +} + +construct_runtime! { + pub enum TestRuntime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Grandpa1: pallet_bridge_grandpa::::{Pallet, Event}, + Grandpa2: pallet_bridge_grandpa::::{Pallet, Event}, + Parachains: pallet_bridge_parachains::{Call, Pallet, Event}, + } +} + +parameter_types! { + pub const BlockHashCount: TestNumber = 250; + pub const MaximumBlockWeight: Weight = Weight::from_parts(1024, 0); + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); +} + +impl frame_system::Config for TestRuntime { + type RuntimeOrigin = RuntimeOrigin; + type Index = u64; + type RuntimeCall = RuntimeCall; + type BlockNumber = TestNumber; + type Hash = H256; + type Hashing = RegularParachainHasher; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = (); + type OnNewAccount = (); + type OnKilledAccount = (); + type BaseCallFilter = frame_support::traits::Everything; + type SystemWeightInfo = (); + type DbWeight = (); + type BlockWeights = (); + type BlockLength = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +parameter_types! { + pub const SessionLength: u64 = 5; + pub const NumValidators: u32 = 5; + pub const HeadersToKeep: u32 = 5; +} + +impl pallet_bridge_grandpa::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = TestBridgedChain; + type MaxFreeMandatoryHeadersPerBlock = ConstU32<2>; + type HeadersToKeep = HeadersToKeep; + type WeightInfo = (); +} + +impl pallet_bridge_grandpa::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = TestBridgedChain; + type MaxFreeMandatoryHeadersPerBlock = ConstU32<2>; + type HeadersToKeep = HeadersToKeep; + type WeightInfo = (); +} + +parameter_types! { + pub const HeadsToKeep: u32 = 4; + pub const ParasPalletName: &'static str = PARAS_PALLET_NAME; + pub GetTenFirstParachains: Vec = (0..10).map(ParaId).collect(); +} + +impl pallet_bridge_parachains::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = (); + type BridgesGrandpaPalletInstance = pallet_bridge_grandpa::Instance1; + type ParasPalletName = ParasPalletName; + type ParaStoredHeaderDataBuilder = (Parachain1, Parachain2, Parachain3, BigParachain); + type HeadsToKeep = HeadsToKeep; + type MaxParaHeadDataSize = ConstU32; +} + +#[cfg(feature = "runtime-benchmarks")] +impl pallet_bridge_parachains::benchmarking::Config<()> for TestRuntime { + fn parachains() -> Vec { + vec![ + ParaId(Parachain1::PARACHAIN_ID), + ParaId(Parachain2::PARACHAIN_ID), + ParaId(Parachain3::PARACHAIN_ID), + ] + } + + fn prepare_parachain_heads_proof( + parachains: &[ParaId], + _parachain_head_size: u32, + _proof_size: bp_runtime::StorageProofSize, + ) -> ( + crate::RelayBlockNumber, + crate::RelayBlockHash, + bp_polkadot_core::parachains::ParaHeadsProof, + Vec<(ParaId, bp_polkadot_core::parachains::ParaHash)>, + ) { + // in mock run we only care about benchmarks correctness, not the benchmark results + // => ignore size related arguments + let (state_root, proof, parachains) = crate::tests::prepare_parachain_heads_proof( + parachains.iter().map(|p| (p.0, crate::tests::head_data(p.0, 1))).collect(), + ); + let relay_genesis_hash = crate::tests::initialize(state_root); + (0, relay_genesis_hash, proof, parachains) + } +} + +#[derive(Debug)] +pub struct TestBridgedChain; + +impl Chain for TestBridgedChain { + type BlockNumber = crate::RelayBlockNumber; + type Hash = crate::RelayBlockHash; + type Hasher = crate::RelayBlockHasher; + type Header = RelayBlockHeader; + + type AccountId = AccountId; + type Balance = u32; + type Index = u32; + type Signature = sp_runtime::testing::TestSignature; + + fn max_extrinsic_size() -> u32 { + unreachable!() + } + + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl ChainWithGrandpa for TestBridgedChain { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; + const MAX_AUTHORITIES_COUNT: u32 = 16; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const MAX_HEADER_SIZE: u32 = 256; + const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = 64; +} + +#[derive(Debug)] +pub struct OtherBridgedChain; + +impl Chain for OtherBridgedChain { + type BlockNumber = u64; + type Hash = crate::RelayBlockHash; + type Hasher = crate::RelayBlockHasher; + type Header = sp_runtime::generic::Header; + + type AccountId = AccountId; + type Balance = u32; + type Index = u32; + type Signature = sp_runtime::testing::TestSignature; + + fn max_extrinsic_size() -> u32 { + unreachable!() + } + + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl ChainWithGrandpa for OtherBridgedChain { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; + const MAX_AUTHORITIES_COUNT: u32 = 16; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const MAX_HEADER_SIZE: u32 = 256; + const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = 64; +} + +/// Return test externalities to use in tests. +pub fn new_test_ext() -> sp_io::TestExternalities { + sp_io::TestExternalities::new(Default::default()) +} + +/// Run pallet test. +pub fn run_test(test: impl FnOnce() -> T) -> T { + new_test_ext().execute_with(|| { + System::set_block_number(1); + System::reset_events(); + test() + }) +} + +/// Return test relay chain header with given number. +pub fn test_relay_header( + num: crate::RelayBlockNumber, + state_root: crate::RelayBlockHash, +) -> RelayBlockHeader { + RelayBlockHeader::new( + num, + Default::default(), + state_root, + Default::default(), + Default::default(), + ) +} diff --git a/bridges/modules/parachains/src/weights.rs b/bridges/modules/parachains/src/weights.rs new file mode 100644 index 00000000000..1e81dba72fe --- /dev/null +++ b/bridges/modules/parachains/src/weights.rs @@ -0,0 +1,273 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Autogenerated weights for pallet_bridge_parachains +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-03-02, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/millau-bridge-node +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_bridge_parachains +// --extrinsic=* +// --execution=wasm +// --wasm-execution=Compiled +// --heap-pages=4096 +// --output=./modules/parachains/src/weights.rs +// --template=./.maintain/bridge-weight-template.hbs + +#![allow(clippy::all)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{ + traits::Get, + weights::{constants::RocksDbWeight, Weight}, +}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_bridge_parachains. +pub trait WeightInfo { + fn submit_parachain_heads_with_n_parachains(p: u32) -> Weight; + fn submit_parachain_heads_with_1kb_proof() -> Weight; + fn submit_parachain_heads_with_16kb_proof() -> Weight; +} + +/// Weights for `pallet_bridge_parachains` that are generated using one of the Bridge testnets. +/// +/// Those weights are test only and must never be used in production. +pub struct BridgeWeight(PhantomData); +impl WeightInfo for BridgeWeight { + /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + /// + /// The range of component `p` is `[1, 2]`. + fn submit_parachain_heads_with_n_parachains(p: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 36_701 nanoseconds. + Weight::from_parts(38_597_828, 4648) + // Standard Error: 190_859 + .saturating_add(Weight::from_parts(60_685, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + fn submit_parachain_heads_with_1kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 38_189 nanoseconds. + Weight::from_parts(39_252_000, 4648) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + fn submit_parachain_heads_with_16kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 62_868 nanoseconds. + Weight::from_parts(63_581_000, 4648) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + /// + /// The range of component `p` is `[1, 2]`. + fn submit_parachain_heads_with_n_parachains(p: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 36_701 nanoseconds. + Weight::from_parts(38_597_828, 4648) + // Standard Error: 190_859 + .saturating_add(Weight::from_parts(60_685, 0).saturating_mul(p.into())) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + fn submit_parachain_heads_with_1kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 38_189 nanoseconds. + Weight::from_parts(39_252_000, 4648) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + fn submit_parachain_heads_with_16kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 62_868 nanoseconds. + Weight::from_parts(63_581_000, 4648) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } +} diff --git a/bridges/modules/parachains/src/weights_ext.rs b/bridges/modules/parachains/src/weights_ext.rs new file mode 100644 index 00000000000..eecdfe90359 --- /dev/null +++ b/bridges/modules/parachains/src/weights_ext.rs @@ -0,0 +1,107 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Weight-related utilities. + +use crate::weights::{BridgeWeight, WeightInfo}; + +use bp_runtime::Size; +use frame_support::weights::{RuntimeDbWeight, Weight}; + +/// Size of the regular parachain head. +/// +/// It's not that we are expecting all parachain heads to share the same size or that we would +/// reject all heads that have larger/lesser size. It is about head size that we use in benchmarks. +/// Relayer would need to pay additional fee for extra bytes. +/// +/// 384 is a bit larger (1.3 times) than the size of the randomly chosen Polkadot block. +pub const DEFAULT_PARACHAIN_HEAD_SIZE: u32 = 384; + +/// Number of extra bytes (excluding size of storage value itself) of storage proof, built at +/// the Rialto chain. +pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024; + +/// Extended weight info. +pub trait WeightInfoExt: WeightInfo { + /// Storage proof overhead, that is included in every storage proof. + /// + /// The relayer would pay some extra fee for additional proof bytes, since they mean + /// more hashing operations. + fn expected_extra_storage_proof_size() -> u32; + + /// Weight of the parachain heads delivery extrinsic. + fn submit_parachain_heads_weight( + db_weight: RuntimeDbWeight, + proof: &impl Size, + parachains_count: u32, + ) -> Weight { + // weight of the `submit_parachain_heads` with exactly `parachains_count` parachain + // heads of the default size (`DEFAULT_PARACHAIN_HEAD_SIZE`) + let base_weight = Self::submit_parachain_heads_with_n_parachains(parachains_count); + + // overhead because of extra storage proof bytes + let expected_proof_size = parachains_count + .saturating_mul(DEFAULT_PARACHAIN_HEAD_SIZE) + .saturating_add(Self::expected_extra_storage_proof_size()); + let actual_proof_size = proof.size(); + let proof_size_overhead = Self::storage_proof_size_overhead( + actual_proof_size.saturating_sub(expected_proof_size), + ); + + // potential pruning weight (refunded if hasn't happened) + let pruning_weight = + Self::parachain_head_pruning_weight(db_weight).saturating_mul(parachains_count as u64); + + base_weight.saturating_add(proof_size_overhead).saturating_add(pruning_weight) + } + + /// Returns weight of single parachain head storage update. + /// + /// This weight only includes db write operations that happens if parachain head is actually + /// updated. All extra weights (weight of storage proof validation, additional checks, ...) is + /// not included. + fn parachain_head_storage_write_weight(db_weight: RuntimeDbWeight) -> Weight { + // it's just a couple of operations - we need to write the hash (`ImportedParaHashes`) and + // the head itself (`ImportedParaHeads`. Pruning is not included here + db_weight.writes(2) + } + + /// Returns weight of single parachain head pruning. + fn parachain_head_pruning_weight(db_weight: RuntimeDbWeight) -> Weight { + // it's just one write operation, we don't want any benchmarks for that + db_weight.writes(1) + } + + /// Returns weight that needs to be accounted when storage proof of given size is received. + fn storage_proof_size_overhead(extra_proof_bytes: u32) -> Weight { + let extra_byte_weight = (Self::submit_parachain_heads_with_16kb_proof() - + Self::submit_parachain_heads_with_1kb_proof()) / + (15 * 1024); + extra_byte_weight.saturating_mul(extra_proof_bytes as u64) + } +} + +impl WeightInfoExt for () { + fn expected_extra_storage_proof_size() -> u32 { + EXTRA_STORAGE_PROOF_SIZE + } +} + +impl WeightInfoExt for BridgeWeight { + fn expected_extra_storage_proof_size() -> u32 { + EXTRA_STORAGE_PROOF_SIZE + } +} diff --git a/bridges/modules/relayers/Cargo.toml b/bridges/modules/relayers/Cargo.toml new file mode 100644 index 00000000000..857d47cc65a --- /dev/null +++ b/bridges/modules/relayers/Cargo.toml @@ -0,0 +1,59 @@ +[package] +name = "pallet-bridge-relayers" +description = "Module used to store relayer rewards and coordinate relayers set." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } + +# Bridge dependencies + +bp-messages = { path = "../../primitives/messages", default-features = false } +bp-relayers = { path = "../../primitives/relayers", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +pallet-bridge-messages = { path = "../messages", default-features = false } + +# Substrate Dependencies + +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[dev-dependencies] +bp-runtime = { path = "../../primitives/runtime" } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-messages/std", + "bp-relayers/std", + "bp-runtime/std", + "codec/std", + "frame-benchmarking/std", + "frame-support/std", + "frame-system/std", + "log/std", + "scale-info/std", + "sp-arithmetic/std", + "sp-runtime/std", + "sp-std/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", +] diff --git a/bridges/modules/relayers/README.md b/bridges/modules/relayers/README.md new file mode 100644 index 00000000000..656200f4486 --- /dev/null +++ b/bridges/modules/relayers/README.md @@ -0,0 +1,14 @@ +# Bridge Relayers Pallet + +The pallet serves as a storage for pending bridge relayer rewards. Any runtime component may register reward +to some relayer for doing some useful job at some messages lane. Later, the relayer may claim its rewards +using the `claim_rewards` call. + +The reward payment procedure is abstracted from the pallet code. One of possible implementations, is the +[`PayLaneRewardFromAccount`](../../primitives/relayers/src/lib.rs), which just does a `Currency::transfer` +call to relayer account from the relayer-rewards account, determined by the message lane id. + +We have two examples of how this pallet is used in production. Rewards are registered at the target chain to +compensate fees of message delivery transactions (and linked finality delivery calls). At the source chain, rewards +are registered during delivery confirmation transactions. You may find more information about that in the +[Kusama <> Polkadot bridge](../../docs/polkadot-kusama-bridge-overview.md) documentation. diff --git a/bridges/modules/relayers/src/benchmarking.rs b/bridges/modules/relayers/src/benchmarking.rs new file mode 100644 index 00000000000..d66a11ff06d --- /dev/null +++ b/bridges/modules/relayers/src/benchmarking.rs @@ -0,0 +1,131 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Benchmarks for the relayers Pallet. + +#![cfg(feature = "runtime-benchmarks")] + +use crate::*; + +use bp_messages::LaneId; +use bp_relayers::RewardsAccountOwner; +use frame_benchmarking::{benchmarks, whitelisted_caller}; +use frame_system::RawOrigin; +use sp_runtime::traits::One; + +/// Reward amount that is (hopefully) is larger than existential deposit across all chains. +const REWARD_AMOUNT: u32 = u32::MAX; + +/// Pallet we're benchmarking here. +pub struct Pallet(crate::Pallet); + +/// Trait that must be implemented by runtime. +pub trait Config: crate::Config { + /// Prepare environment for paying given reward for serving given lane. + fn prepare_rewards_account(account_params: RewardsAccountParams, reward: Self::Reward); + /// Give enough balance to given account. + fn deposit_account(account: Self::AccountId, balance: Self::Reward); +} + +benchmarks! { + // Benchmark `claim_rewards` call. + claim_rewards { + let lane = LaneId([0, 0, 0, 0]); + let account_params = + RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); + let relayer: T::AccountId = whitelisted_caller(); + let reward = T::Reward::from(REWARD_AMOUNT); + + T::prepare_rewards_account(account_params, reward); + RelayerRewards::::insert(&relayer, account_params, reward); + }: _(RawOrigin::Signed(relayer), account_params) + verify { + // we can't check anything here, because `PaymentProcedure` is responsible for + // payment logic, so we assume that if call has succeeded, the procedure has + // also completed successfully + } + + // Benchmark `register` call. + register { + let relayer: T::AccountId = whitelisted_caller(); + let valid_till = frame_system::Pallet::::block_number() + .saturating_add(crate::Pallet::::required_registration_lease()) + .saturating_add(One::one()) + .saturating_add(One::one()); + + T::deposit_account(relayer.clone(), crate::Pallet::::required_stake()); + }: _(RawOrigin::Signed(relayer.clone()), valid_till) + verify { + assert!(crate::Pallet::::is_registration_active(&relayer)); + } + + // Benchmark `deregister` call. + deregister { + let relayer: T::AccountId = whitelisted_caller(); + let valid_till = frame_system::Pallet::::block_number() + .saturating_add(crate::Pallet::::required_registration_lease()) + .saturating_add(One::one()) + .saturating_add(One::one()); + T::deposit_account(relayer.clone(), crate::Pallet::::required_stake()); + crate::Pallet::::register(RawOrigin::Signed(relayer.clone()).into(), valid_till).unwrap(); + + frame_system::Pallet::::set_block_number(valid_till.saturating_add(One::one())); + }: _(RawOrigin::Signed(relayer.clone())) + verify { + assert!(!crate::Pallet::::is_registration_active(&relayer)); + } + + // Benchmark `slash_and_deregister` method of the pallet. We are adding this weight to + // the weight of message delivery call if `RefundBridgedParachainMessages` signed extension + // is deployed at runtime level. + slash_and_deregister { + // prepare and register relayer account + let relayer: T::AccountId = whitelisted_caller(); + let valid_till = frame_system::Pallet::::block_number() + .saturating_add(crate::Pallet::::required_registration_lease()) + .saturating_add(One::one()) + .saturating_add(One::one()); + T::deposit_account(relayer.clone(), crate::Pallet::::required_stake()); + crate::Pallet::::register(RawOrigin::Signed(relayer.clone()).into(), valid_till).unwrap(); + + // create slash destination account + let lane = LaneId([0, 0, 0, 0]); + let slash_destination = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); + T::prepare_rewards_account(slash_destination.clone(), Zero::zero()); + }: { + crate::Pallet::::slash_and_deregister(&relayer, slash_destination) + } + verify { + assert!(!crate::Pallet::::is_registration_active(&relayer)); + } + + // Benchmark `register_relayer_reward` method of the pallet. We are adding this weight to + // the weight of message delivery call if `RefundBridgedParachainMessages` signed extension + // is deployed at runtime level. + register_relayer_reward { + let lane = LaneId([0, 0, 0, 0]); + let relayer: T::AccountId = whitelisted_caller(); + let account_params = + RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); + }: { + crate::Pallet::::register_relayer_reward(account_params.clone(), &relayer, One::one()); + } + verify { + assert_eq!(RelayerRewards::::get(relayer, &account_params), Some(One::one())); + } + + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) +} diff --git a/bridges/modules/relayers/src/lib.rs b/bridges/modules/relayers/src/lib.rs new file mode 100644 index 00000000000..54b888cf29d --- /dev/null +++ b/bridges/modules/relayers/src/lib.rs @@ -0,0 +1,880 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Runtime module that is used to store relayer rewards and (in the future) to +//! coordinate relations between relayers. + +#![cfg_attr(not(feature = "std"), no_std)] +#![warn(missing_docs)] + +use bp_relayers::{ + PaymentProcedure, Registration, RelayerRewardsKeyProvider, RewardsAccountParams, StakeAndSlash, +}; +use bp_runtime::StorageDoubleMapKeyProvider; +use frame_support::fail; +use sp_arithmetic::traits::{AtLeast32BitUnsigned, Zero}; +use sp_runtime::{traits::CheckedSub, Saturating}; +use sp_std::marker::PhantomData; + +pub use pallet::*; +pub use payment_adapter::DeliveryConfirmationPaymentsAdapter; +pub use stake_adapter::StakeAndSlashNamed; +pub use weights::WeightInfo; +pub use weights_ext::WeightInfoExt; + +pub mod benchmarking; + +mod mock; +mod payment_adapter; +mod stake_adapter; +mod weights_ext; + +pub mod weights; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-relayers"; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + /// `RelayerRewardsKeyProvider` for given configuration. + type RelayerRewardsKeyProviderOf = + RelayerRewardsKeyProvider<::AccountId, ::Reward>; + + #[pallet::config] + pub trait Config: frame_system::Config { + /// The overarching event type. + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + /// Type of relayer reward. + type Reward: AtLeast32BitUnsigned + Copy + Parameter + MaxEncodedLen; + /// Pay rewards scheme. + type PaymentProcedure: PaymentProcedure; + /// Stake and slash scheme. + type StakeAndSlash: StakeAndSlash; + /// Pallet call weights. + type WeightInfo: WeightInfoExt; + } + + #[pallet::pallet] + pub struct Pallet(PhantomData); + + #[pallet::call] + impl Pallet { + /// Claim accumulated rewards. + #[pallet::call_index(0)] + #[pallet::weight(T::WeightInfo::claim_rewards())] + pub fn claim_rewards( + origin: OriginFor, + rewards_account_params: RewardsAccountParams, + ) -> DispatchResult { + let relayer = ensure_signed(origin)?; + + RelayerRewards::::try_mutate_exists( + &relayer, + rewards_account_params, + |maybe_reward| -> DispatchResult { + let reward = maybe_reward.take().ok_or(Error::::NoRewardForRelayer)?; + T::PaymentProcedure::pay_reward(&relayer, rewards_account_params, reward) + .map_err(|e| { + log::trace!( + target: LOG_TARGET, + "Failed to pay {:?} rewards to {:?}: {:?}", + rewards_account_params, + relayer, + e, + ); + Error::::FailedToPayReward + })?; + + Self::deposit_event(Event::::RewardPaid { + relayer: relayer.clone(), + rewards_account_params, + reward, + }); + Ok(()) + }, + ) + } + + /// Register relayer or update its registration. + /// + /// Registration allows relayer to get priority boost for its message delivery transactions. + #[pallet::call_index(1)] + #[pallet::weight(T::WeightInfo::register())] + pub fn register(origin: OriginFor, valid_till: T::BlockNumber) -> DispatchResult { + let relayer = ensure_signed(origin)?; + + // valid till must be larger than the current block number and the lease must be larger + // than the `RequiredRegistrationLease` + let lease = valid_till.saturating_sub(frame_system::Pallet::::block_number()); + ensure!( + lease > Pallet::::required_registration_lease(), + Error::::InvalidRegistrationLease + ); + + RegisteredRelayers::::try_mutate(&relayer, |maybe_registration| -> DispatchResult { + let mut registration = maybe_registration + .unwrap_or_else(|| Registration { valid_till, stake: Zero::zero() }); + + // new `valid_till` must be larger (or equal) than the old one + ensure!( + valid_till >= registration.valid_till, + Error::::CannotReduceRegistrationLease, + ); + registration.valid_till = valid_till; + + // regarding stake, there are three options: + // - if relayer stake is larger than required stake, we may do unreserve + // - if relayer stake equals to required stake, we do nothing + // - if relayer stake is smaller than required stake, we do additional reserve + let required_stake = Pallet::::required_stake(); + if let Some(to_unreserve) = registration.stake.checked_sub(&required_stake) { + Self::do_unreserve(&relayer, to_unreserve)?; + } else if let Some(to_reserve) = required_stake.checked_sub(®istration.stake) { + T::StakeAndSlash::reserve(&relayer, to_reserve).map_err(|e| { + log::trace!( + target: LOG_TARGET, + "Failed to reserve {:?} on relayer {:?} account: {:?}", + to_reserve, + relayer, + e, + ); + + Error::::FailedToReserve + })?; + } + registration.stake = required_stake; + + log::trace!(target: LOG_TARGET, "Successfully registered relayer: {:?}", relayer); + Self::deposit_event(Event::::RegistrationUpdated { + relayer: relayer.clone(), + registration, + }); + + *maybe_registration = Some(registration); + + Ok(()) + }) + } + + /// `Deregister` relayer. + /// + /// After this call, message delivery transactions of the relayer won't get any priority + /// boost. + #[pallet::call_index(2)] + #[pallet::weight(T::WeightInfo::deregister())] + pub fn deregister(origin: OriginFor) -> DispatchResult { + let relayer = ensure_signed(origin)?; + + RegisteredRelayers::::try_mutate(&relayer, |maybe_registration| -> DispatchResult { + let registration = match maybe_registration.take() { + Some(registration) => registration, + None => fail!(Error::::NotRegistered), + }; + + // we can't deregister until `valid_till + 1` + ensure!( + registration.valid_till < frame_system::Pallet::::block_number(), + Error::::RegistrationIsStillActive, + ); + + // if stake is non-zero, we should do unreserve + if !registration.stake.is_zero() { + Self::do_unreserve(&relayer, registration.stake)?; + } + + log::trace!(target: LOG_TARGET, "Successfully deregistered relayer: {:?}", relayer); + Self::deposit_event(Event::::Deregistered { relayer: relayer.clone() }); + + *maybe_registration = None; + + Ok(()) + }) + } + } + + impl Pallet { + /// Returns true if given relayer registration is active at current block. + /// + /// This call respects both `RequiredStake` and `RequiredRegistrationLease`, meaning that + /// it'll return false if registered stake is lower than required or if remaining lease + /// is less than `RequiredRegistrationLease`. + pub fn is_registration_active(relayer: &T::AccountId) -> bool { + let registration = match Self::registered_relayer(relayer) { + Some(registration) => registration, + None => return false, + }; + + // registration is inactive if relayer stake is less than required + if registration.stake < Self::required_stake() { + return false + } + + // registration is inactive if it ends soon + let remaining_lease = registration + .valid_till + .saturating_sub(frame_system::Pallet::::block_number()); + if remaining_lease <= Self::required_registration_lease() { + return false + } + + true + } + + /// Slash and `deregister` relayer. This function slashes all staked balance. + /// + /// It may fail inside, but error is swallowed and we only log it. + pub fn slash_and_deregister( + relayer: &T::AccountId, + slash_destination: RewardsAccountParams, + ) { + let registration = match RegisteredRelayers::::take(relayer) { + Some(registration) => registration, + None => { + log::trace!( + target: crate::LOG_TARGET, + "Cannot slash unregistered relayer {:?}", + relayer, + ); + + return + }, + }; + + match T::StakeAndSlash::repatriate_reserved( + relayer, + slash_destination, + registration.stake, + ) { + Ok(failed_to_slash) if failed_to_slash.is_zero() => { + log::trace!( + target: crate::LOG_TARGET, + "Relayer account {:?} has been slashed for {:?}. Funds were deposited to {:?}", + relayer, + registration.stake, + slash_destination, + ); + }, + Ok(failed_to_slash) => { + log::trace!( + target: crate::LOG_TARGET, + "Relayer account {:?} has been partially slashed for {:?}. Funds were deposited to {:?}. \ + Failed to slash: {:?}", + relayer, + registration.stake, + slash_destination, + failed_to_slash, + ); + }, + Err(e) => { + // TODO: document this. Where? + + // it may fail if there's no beneficiary account. For us it means that this + // account must exists before we'll deploy the bridge + log::debug!( + target: crate::LOG_TARGET, + "Failed to slash relayer account {:?}: {:?}. Maybe beneficiary account doesn't exist? \ + Beneficiary: {:?}, amount: {:?}, failed to slash: {:?}", + relayer, + e, + slash_destination, + registration.stake, + registration.stake, + ); + }, + } + } + + /// Register reward for given relayer. + pub fn register_relayer_reward( + rewards_account_params: RewardsAccountParams, + relayer: &T::AccountId, + reward: T::Reward, + ) { + if reward.is_zero() { + return + } + + RelayerRewards::::mutate( + relayer, + rewards_account_params, + |old_reward: &mut Option| { + let new_reward = old_reward.unwrap_or_else(Zero::zero).saturating_add(reward); + *old_reward = Some(new_reward); + + log::trace!( + target: crate::LOG_TARGET, + "Relayer {:?} can now claim reward for serving payer {:?}: {:?}", + relayer, + rewards_account_params, + new_reward, + ); + }, + ); + } + + /// Return required registration lease. + pub(crate) fn required_registration_lease() -> T::BlockNumber { + >::RequiredRegistrationLease::get() + } + + /// Return required stake. + pub(crate) fn required_stake() -> T::Reward { + >::RequiredStake::get() + } + + /// `Unreserve` given amount on relayer account. + fn do_unreserve(relayer: &T::AccountId, amount: T::Reward) -> DispatchResult { + let failed_to_unreserve = T::StakeAndSlash::unreserve(relayer, amount); + if !failed_to_unreserve.is_zero() { + log::trace!( + target: LOG_TARGET, + "Failed to unreserve {:?}/{:?} on relayer {:?} account", + failed_to_unreserve, + amount, + relayer, + ); + + fail!(Error::::FailedToUnreserve) + } + + Ok(()) + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + /// Reward has been paid to the relayer. + RewardPaid { + /// Relayer account that has been rewarded. + relayer: T::AccountId, + /// Relayer has received reward from this account. + rewards_account_params: RewardsAccountParams, + /// Reward amount. + reward: T::Reward, + }, + /// Relayer registration has been added or updated. + RegistrationUpdated { + /// Relayer account that has been registered. + relayer: T::AccountId, + /// Relayer registration. + registration: Registration, + }, + /// Relayer has been `deregistered`. + Deregistered { + /// Relayer account that has been `deregistered`. + relayer: T::AccountId, + }, + /// Relayer has been slashed and `deregistered`. + SlashedAndDeregistered { + /// Relayer account that has been `deregistered`. + relayer: T::AccountId, + /// Registration that was removed. + registration: Registration, + }, + } + + #[pallet::error] + pub enum Error { + /// No reward can be claimed by given relayer. + NoRewardForRelayer, + /// Reward payment procedure has failed. + FailedToPayReward, + /// The relayer has tried to register for past block or registration lease + /// is too short. + InvalidRegistrationLease, + /// New registration lease is less than the previous one. + CannotReduceRegistrationLease, + /// Failed to reserve enough funds on relayer account. + FailedToReserve, + /// Failed to `unreserve` enough funds on relayer account. + FailedToUnreserve, + /// Cannot `deregister` if not registered. + NotRegistered, + /// Failed to `deregister` relayer, because lease is still active. + RegistrationIsStillActive, + } + + /// Map of the relayer => accumulated reward. + #[pallet::storage] + #[pallet::getter(fn relayer_reward)] + pub type RelayerRewards = StorageDoubleMap< + _, + as StorageDoubleMapKeyProvider>::Hasher1, + as StorageDoubleMapKeyProvider>::Key1, + as StorageDoubleMapKeyProvider>::Hasher2, + as StorageDoubleMapKeyProvider>::Key2, + as StorageDoubleMapKeyProvider>::Value, + OptionQuery, + >; + + /// Relayers that have reserved some of their balance to get free priority boost + /// for their message delivery transactions. + /// + /// Other relayers may submit transactions as well, but they will have default + /// priority and will be rejected (without significant tip) in case if registered + /// relayer is present. + #[pallet::storage] + #[pallet::getter(fn registered_relayer)] + pub type RegisteredRelayers = StorageMap< + _, + Blake2_128Concat, + T::AccountId, + Registration, + OptionQuery, + >; +} + +#[cfg(test)] +mod tests { + use super::*; + use mock::{RuntimeEvent as TestEvent, *}; + + use crate::Event::RewardPaid; + use bp_messages::LaneId; + use bp_relayers::RewardsAccountOwner; + use frame_support::{ + assert_noop, assert_ok, + traits::fungible::{Inspect, Mutate}, + }; + use frame_system::{EventRecord, Pallet as System, Phase}; + use sp_runtime::DispatchError; + + fn get_ready_for_events() { + System::::set_block_number(1); + System::::reset_events(); + } + + #[test] + fn root_cant_claim_anything() { + run_test(|| { + assert_noop!( + Pallet::::claim_rewards( + RuntimeOrigin::root(), + TEST_REWARDS_ACCOUNT_PARAMS + ), + DispatchError::BadOrigin, + ); + }); + } + + #[test] + fn relayer_cant_claim_if_no_reward_exists() { + run_test(|| { + assert_noop!( + Pallet::::claim_rewards( + RuntimeOrigin::signed(REGULAR_RELAYER), + TEST_REWARDS_ACCOUNT_PARAMS + ), + Error::::NoRewardForRelayer, + ); + }); + } + + #[test] + fn relayer_cant_claim_if_payment_procedure_fails() { + run_test(|| { + RelayerRewards::::insert( + FAILING_RELAYER, + TEST_REWARDS_ACCOUNT_PARAMS, + 100, + ); + assert_noop!( + Pallet::::claim_rewards( + RuntimeOrigin::signed(FAILING_RELAYER), + TEST_REWARDS_ACCOUNT_PARAMS + ), + Error::::FailedToPayReward, + ); + }); + } + + #[test] + fn relayer_can_claim_reward() { + run_test(|| { + get_ready_for_events(); + + RelayerRewards::::insert( + REGULAR_RELAYER, + TEST_REWARDS_ACCOUNT_PARAMS, + 100, + ); + assert_ok!(Pallet::::claim_rewards( + RuntimeOrigin::signed(REGULAR_RELAYER), + TEST_REWARDS_ACCOUNT_PARAMS + )); + assert_eq!( + RelayerRewards::::get(REGULAR_RELAYER, TEST_REWARDS_ACCOUNT_PARAMS), + None + ); + + // Check if the `RewardPaid` event was emitted. + assert_eq!( + System::::events().last(), + Some(&EventRecord { + phase: Phase::Initialization, + event: TestEvent::Relayers(RewardPaid { + relayer: REGULAR_RELAYER, + rewards_account_params: TEST_REWARDS_ACCOUNT_PARAMS, + reward: 100 + }), + topics: vec![], + }), + ); + }); + } + + #[test] + fn pay_reward_from_account_actually_pays_reward() { + type Balances = pallet_balances::Pallet; + type PayLaneRewardFromAccount = bp_relayers::PayRewardFromAccount; + + run_test(|| { + let in_lane_0 = RewardsAccountParams::new( + LaneId([0, 0, 0, 0]), + *b"test", + RewardsAccountOwner::ThisChain, + ); + let out_lane_1 = RewardsAccountParams::new( + LaneId([0, 0, 0, 1]), + *b"test", + RewardsAccountOwner::BridgedChain, + ); + + let in_lane0_rewards_account = PayLaneRewardFromAccount::rewards_account(in_lane_0); + let out_lane1_rewards_account = PayLaneRewardFromAccount::rewards_account(out_lane_1); + + Balances::mint_into(&in_lane0_rewards_account, 100).unwrap(); + Balances::mint_into(&out_lane1_rewards_account, 100).unwrap(); + assert_eq!(Balances::balance(&in_lane0_rewards_account), 100); + assert_eq!(Balances::balance(&out_lane1_rewards_account), 100); + assert_eq!(Balances::balance(&1), 0); + + PayLaneRewardFromAccount::pay_reward(&1, in_lane_0, 100).unwrap(); + assert_eq!(Balances::balance(&in_lane0_rewards_account), 0); + assert_eq!(Balances::balance(&out_lane1_rewards_account), 100); + assert_eq!(Balances::balance(&1), 100); + + PayLaneRewardFromAccount::pay_reward(&1, out_lane_1, 100).unwrap(); + assert_eq!(Balances::balance(&in_lane0_rewards_account), 0); + assert_eq!(Balances::balance(&out_lane1_rewards_account), 0); + assert_eq!(Balances::balance(&1), 200); + }); + } + + #[test] + fn register_fails_if_valid_till_is_a_past_block() { + run_test(|| { + System::::set_block_number(100); + + assert_noop!( + Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 50), + Error::::InvalidRegistrationLease, + ); + }); + } + + #[test] + fn register_fails_if_valid_till_lease_is_less_than_required() { + run_test(|| { + System::::set_block_number(100); + + assert_noop!( + Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 99 + Lease::get() + ), + Error::::InvalidRegistrationLease, + ); + }); + } + + #[test] + fn register_works() { + run_test(|| { + get_ready_for_events(); + + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get()); + assert_eq!( + Pallet::::registered_relayer(REGISTER_RELAYER), + Some(Registration { valid_till: 150, stake: Stake::get() }), + ); + + assert_eq!( + System::::events().last(), + Some(&EventRecord { + phase: Phase::Initialization, + event: TestEvent::Relayers(Event::RegistrationUpdated { + relayer: REGISTER_RELAYER, + registration: Registration { valid_till: 150, stake: Stake::get() }, + }), + topics: vec![], + }), + ); + }); + } + + #[test] + fn register_fails_if_new_valid_till_is_lesser_than_previous() { + run_test(|| { + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + + assert_noop!( + Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 125), + Error::::CannotReduceRegistrationLease, + ); + }); + } + + #[test] + fn register_fails_if_it_cant_unreserve_some_balance_if_required_stake_decreases() { + run_test(|| { + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() + 1 }, + ); + + assert_noop!( + Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150), + Error::::FailedToUnreserve, + ); + }); + } + + #[test] + fn register_unreserves_some_balance_if_required_stake_decreases() { + run_test(|| { + get_ready_for_events(); + + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() + 1 }, + ); + TestStakeAndSlash::reserve(®ISTER_RELAYER, Stake::get() + 1).unwrap(); + assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get() + 1); + let free_balance = Balances::free_balance(REGISTER_RELAYER); + + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get()); + assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance + 1); + assert_eq!( + Pallet::::registered_relayer(REGISTER_RELAYER), + Some(Registration { valid_till: 150, stake: Stake::get() }), + ); + + assert_eq!( + System::::events().last(), + Some(&EventRecord { + phase: Phase::Initialization, + event: TestEvent::Relayers(Event::RegistrationUpdated { + relayer: REGISTER_RELAYER, + registration: Registration { valid_till: 150, stake: Stake::get() } + }), + topics: vec![], + }), + ); + }); + } + + #[test] + fn register_fails_if_it_cant_reserve_some_balance() { + run_test(|| { + Balances::set_balance(®ISTER_RELAYER, 0); + assert_noop!( + Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150), + Error::::FailedToReserve, + ); + }); + } + + #[test] + fn register_fails_if_it_cant_reserve_some_balance_if_required_stake_increases() { + run_test(|| { + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() - 1 }, + ); + Balances::set_balance(®ISTER_RELAYER, 0); + + assert_noop!( + Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150), + Error::::FailedToReserve, + ); + }); + } + + #[test] + fn register_reserves_some_balance_if_required_stake_increases() { + run_test(|| { + get_ready_for_events(); + + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() - 1 }, + ); + TestStakeAndSlash::reserve(®ISTER_RELAYER, Stake::get() - 1).unwrap(); + + let free_balance = Balances::free_balance(REGISTER_RELAYER); + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get()); + assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance - 1); + assert_eq!( + Pallet::::registered_relayer(REGISTER_RELAYER), + Some(Registration { valid_till: 150, stake: Stake::get() }), + ); + + assert_eq!( + System::::events().last(), + Some(&EventRecord { + phase: Phase::Initialization, + event: TestEvent::Relayers(Event::RegistrationUpdated { + relayer: REGISTER_RELAYER, + registration: Registration { valid_till: 150, stake: Stake::get() } + }), + topics: vec![], + }), + ); + }); + } + + #[test] + fn deregister_fails_if_not_registered() { + run_test(|| { + assert_noop!( + Pallet::::deregister(RuntimeOrigin::signed(REGISTER_RELAYER)), + Error::::NotRegistered, + ); + }); + } + + #[test] + fn deregister_fails_if_registration_is_still_active() { + run_test(|| { + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + + System::::set_block_number(100); + + assert_noop!( + Pallet::::deregister(RuntimeOrigin::signed(REGISTER_RELAYER)), + Error::::RegistrationIsStillActive, + ); + }); + } + + #[test] + fn deregister_works() { + run_test(|| { + get_ready_for_events(); + + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + + System::::set_block_number(151); + + let reserved_balance = Balances::reserved_balance(REGISTER_RELAYER); + let free_balance = Balances::free_balance(REGISTER_RELAYER); + assert_ok!(Pallet::::deregister(RuntimeOrigin::signed(REGISTER_RELAYER))); + assert_eq!( + Balances::reserved_balance(REGISTER_RELAYER), + reserved_balance - Stake::get() + ); + assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance + Stake::get()); + + assert_eq!( + System::::events().last(), + Some(&EventRecord { + phase: Phase::Initialization, + event: TestEvent::Relayers(Event::Deregistered { relayer: REGISTER_RELAYER }), + topics: vec![], + }), + ); + }); + } + + #[test] + fn is_registration_active_is_false_for_unregistered_relayer() { + run_test(|| { + assert!(!Pallet::::is_registration_active(®ISTER_RELAYER)); + }); + } + + #[test] + fn is_registration_active_is_false_when_stake_is_too_low() { + run_test(|| { + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() - 1 }, + ); + assert!(!Pallet::::is_registration_active(®ISTER_RELAYER)); + }); + } + + #[test] + fn is_registration_active_is_false_when_remaining_lease_is_too_low() { + run_test(|| { + System::::set_block_number(150 - Lease::get()); + + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() }, + ); + assert!(!Pallet::::is_registration_active(®ISTER_RELAYER)); + }); + } + + #[test] + fn is_registration_active_is_true_when_relayer_is_properly_registeered() { + run_test(|| { + System::::set_block_number(150 - Lease::get()); + + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 151, stake: Stake::get() }, + ); + assert!(Pallet::::is_registration_active(®ISTER_RELAYER)); + }); + } +} diff --git a/bridges/modules/relayers/src/mock.rs b/bridges/modules/relayers/src/mock.rs new file mode 100644 index 00000000000..69d8418a024 --- /dev/null +++ b/bridges/modules/relayers/src/mock.rs @@ -0,0 +1,185 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +#![cfg(test)] + +use crate as pallet_bridge_relayers; + +use bp_messages::LaneId; +use bp_relayers::{ + PayRewardFromAccount, PaymentProcedure, RewardsAccountOwner, RewardsAccountParams, +}; +use frame_support::{parameter_types, traits::fungible::Mutate, weights::RuntimeDbWeight}; +use sp_core::H256; +use sp_runtime::{ + testing::Header as SubstrateHeader, + traits::{BlakeTwo256, ConstU32, IdentityLookup}, +}; + +pub type AccountId = u64; +pub type Balance = u64; +pub type BlockNumber = u64; + +pub type TestStakeAndSlash = pallet_bridge_relayers::StakeAndSlashNamed< + AccountId, + BlockNumber, + Balances, + ReserveId, + Stake, + Lease, +>; + +type Block = frame_system::mocking::MockBlock; +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; + +frame_support::construct_runtime! { + pub enum TestRuntime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Event}, + Relayers: pallet_bridge_relayers::{Pallet, Call, Event}, + } +} + +parameter_types! { + pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { read: 1, write: 2 }; + pub const ExistentialDeposit: Balance = 1; + pub const ReserveId: [u8; 8] = *b"brdgrlrs"; + pub const Stake: Balance = 1_000; + pub const Lease: BlockNumber = 8; +} + +impl frame_system::Config for TestRuntime { + type RuntimeOrigin = RuntimeOrigin; + type Index = u64; + type RuntimeCall = RuntimeCall; + type BlockNumber = BlockNumber; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = SubstrateHeader; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = frame_support::traits::ConstU64<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type BaseCallFilter = frame_support::traits::Everything; + type SystemWeightInfo = (); + type BlockWeights = (); + type BlockLength = (); + type DbWeight = DbWeight; + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +impl pallet_balances::Config for TestRuntime { + type MaxLocks = (); + type Balance = Balance; + type DustRemoval = (); + type RuntimeEvent = RuntimeEvent; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = frame_system::Pallet; + type WeightInfo = (); + type MaxReserves = ConstU32<1>; + type ReserveIdentifier = [u8; 8]; + type HoldIdentifier = (); + type FreezeIdentifier = (); + type MaxHolds = ConstU32<0>; + type MaxFreezes = ConstU32<0>; +} + +impl pallet_bridge_relayers::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type Reward = Balance; + type PaymentProcedure = TestPaymentProcedure; + type StakeAndSlash = TestStakeAndSlash; + type WeightInfo = (); +} + +#[cfg(feature = "runtime-benchmarks")] +impl pallet_bridge_relayers::benchmarking::Config for TestRuntime { + fn prepare_rewards_account(account_params: RewardsAccountParams, reward: Balance) { + let rewards_account = + bp_relayers::PayRewardFromAccount::::rewards_account( + account_params, + ); + Self::deposit_account(rewards_account, reward); + } + + fn deposit_account(account: Self::AccountId, balance: Self::Reward) { + Balances::mint_into(&account, balance.saturating_add(ExistentialDeposit::get())).unwrap(); + } +} + +/// Message lane that we're using in tests. +pub const TEST_REWARDS_ACCOUNT_PARAMS: RewardsAccountParams = + RewardsAccountParams::new(LaneId([0, 0, 0, 0]), *b"test", RewardsAccountOwner::ThisChain); + +/// Regular relayer that may receive rewards. +pub const REGULAR_RELAYER: AccountId = 1; + +/// Relayer that can't receive rewards. +pub const FAILING_RELAYER: AccountId = 2; + +/// Relayer that is able to register. +pub const REGISTER_RELAYER: AccountId = 42; + +/// Payment procedure that rejects payments to the `FAILING_RELAYER`. +pub struct TestPaymentProcedure; + +impl TestPaymentProcedure { + pub fn rewards_account(params: RewardsAccountParams) -> AccountId { + PayRewardFromAccount::<(), AccountId>::rewards_account(params) + } +} + +impl PaymentProcedure for TestPaymentProcedure { + type Error = (); + + fn pay_reward( + relayer: &AccountId, + _lane_id: RewardsAccountParams, + _reward: Balance, + ) -> Result<(), Self::Error> { + match *relayer { + FAILING_RELAYER => Err(()), + _ => Ok(()), + } + } +} + +/// Return test externalities to use in tests. +pub fn new_test_ext() -> sp_io::TestExternalities { + let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + sp_io::TestExternalities::new(t) +} + +/// Run pallet test. +pub fn run_test(test: impl FnOnce() -> T) -> T { + new_test_ext().execute_with(|| { + Balances::mint_into(®ISTER_RELAYER, ExistentialDeposit::get() + 10 * Stake::get()) + .unwrap(); + + test() + }) +} diff --git a/bridges/modules/relayers/src/payment_adapter.rs b/bridges/modules/relayers/src/payment_adapter.rs new file mode 100644 index 00000000000..a9536cfc027 --- /dev/null +++ b/bridges/modules/relayers/src/payment_adapter.rs @@ -0,0 +1,158 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Code that allows relayers pallet to be used as a payment mechanism for the messages pallet. + +use crate::{Config, Pallet}; + +use bp_messages::{ + source_chain::{DeliveryConfirmationPayments, RelayersRewards}, + LaneId, MessageNonce, +}; +use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; +use frame_support::{sp_runtime::SaturatedConversion, traits::Get}; +use sp_arithmetic::traits::{Saturating, Zero}; +use sp_std::{collections::vec_deque::VecDeque, marker::PhantomData, ops::RangeInclusive}; + +/// Adapter that allows relayers pallet to be used as a delivery+dispatch payment mechanism +/// for the messages pallet. +pub struct DeliveryConfirmationPaymentsAdapter( + PhantomData<(T, MI, DeliveryReward)>, +); + +impl DeliveryConfirmationPayments + for DeliveryConfirmationPaymentsAdapter +where + T: Config + pallet_bridge_messages::Config, + MI: 'static, + DeliveryReward: Get, +{ + type Error = &'static str; + + fn pay_reward( + lane_id: LaneId, + messages_relayers: VecDeque>, + confirmation_relayer: &T::AccountId, + received_range: &RangeInclusive, + ) -> MessageNonce { + let relayers_rewards = + bp_messages::calc_relayers_rewards::(messages_relayers, received_range); + let rewarded_relayers = relayers_rewards.len(); + + register_relayers_rewards::( + confirmation_relayer, + relayers_rewards, + RewardsAccountParams::new( + lane_id, + T::BridgedChainId::get(), + RewardsAccountOwner::BridgedChain, + ), + DeliveryReward::get(), + ); + + rewarded_relayers as _ + } +} + +// Update rewards to given relayers, optionally rewarding confirmation relayer. +fn register_relayers_rewards( + confirmation_relayer: &T::AccountId, + relayers_rewards: RelayersRewards, + lane_id: RewardsAccountParams, + delivery_fee: T::Reward, +) { + // reward every relayer except `confirmation_relayer` + let mut confirmation_relayer_reward = T::Reward::zero(); + for (relayer, messages) in relayers_rewards { + // sane runtime configurations guarantee that the number of messages will be below + // `u32::MAX` + let relayer_reward = T::Reward::saturated_from(messages).saturating_mul(delivery_fee); + + if relayer != *confirmation_relayer { + Pallet::::register_relayer_reward(lane_id, &relayer, relayer_reward); + } else { + confirmation_relayer_reward = + confirmation_relayer_reward.saturating_add(relayer_reward); + } + } + + // finally - pay reward to confirmation relayer + Pallet::::register_relayer_reward( + lane_id, + confirmation_relayer, + confirmation_relayer_reward, + ); +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{mock::*, RelayerRewards}; + + const RELAYER_1: AccountId = 1; + const RELAYER_2: AccountId = 2; + const RELAYER_3: AccountId = 3; + + fn relayers_rewards() -> RelayersRewards { + vec![(RELAYER_1, 2), (RELAYER_2, 3)].into_iter().collect() + } + + #[test] + fn confirmation_relayer_is_rewarded_if_it_has_also_delivered_messages() { + run_test(|| { + register_relayers_rewards::( + &RELAYER_2, + relayers_rewards(), + TEST_REWARDS_ACCOUNT_PARAMS, + 50, + ); + + assert_eq!( + RelayerRewards::::get(RELAYER_1, TEST_REWARDS_ACCOUNT_PARAMS), + Some(100) + ); + assert_eq!( + RelayerRewards::::get(RELAYER_2, TEST_REWARDS_ACCOUNT_PARAMS), + Some(150) + ); + }); + } + + #[test] + fn confirmation_relayer_is_not_rewarded_if_it_has_not_delivered_any_messages() { + run_test(|| { + register_relayers_rewards::( + &RELAYER_3, + relayers_rewards(), + TEST_REWARDS_ACCOUNT_PARAMS, + 50, + ); + + assert_eq!( + RelayerRewards::::get(RELAYER_1, TEST_REWARDS_ACCOUNT_PARAMS), + Some(100) + ); + assert_eq!( + RelayerRewards::::get(RELAYER_2, TEST_REWARDS_ACCOUNT_PARAMS), + Some(150) + ); + assert_eq!( + RelayerRewards::::get(RELAYER_3, TEST_REWARDS_ACCOUNT_PARAMS), + None + ); + }); + } +} diff --git a/bridges/modules/relayers/src/stake_adapter.rs b/bridges/modules/relayers/src/stake_adapter.rs new file mode 100644 index 00000000000..055b6a111ec --- /dev/null +++ b/bridges/modules/relayers/src/stake_adapter.rs @@ -0,0 +1,186 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Code that allows `NamedReservableCurrency` to be used as a `StakeAndSlash` +//! mechanism of the relayers pallet. + +use bp_relayers::{PayRewardFromAccount, RewardsAccountParams, StakeAndSlash}; +use codec::Codec; +use frame_support::traits::{tokens::BalanceStatus, NamedReservableCurrency}; +use sp_runtime::{traits::Get, DispatchError, DispatchResult}; +use sp_std::{fmt::Debug, marker::PhantomData}; + +/// `StakeAndSlash` that works with `NamedReservableCurrency` and uses named +/// reservations. +/// +/// **WARNING**: this implementation assumes that the relayers pallet is configured to +/// use the [`bp_relayers::PayRewardFromAccount`] as its relayers payment scheme. +pub struct StakeAndSlashNamed( + PhantomData<(AccountId, BlockNumber, Currency, ReserveId, Stake, Lease)>, +); + +impl + StakeAndSlash + for StakeAndSlashNamed +where + AccountId: Codec + Debug, + Currency: NamedReservableCurrency, + ReserveId: Get, + Stake: Get, + Lease: Get, +{ + type RequiredStake = Stake; + type RequiredRegistrationLease = Lease; + + fn reserve(relayer: &AccountId, amount: Currency::Balance) -> DispatchResult { + Currency::reserve_named(&ReserveId::get(), relayer, amount) + } + + fn unreserve(relayer: &AccountId, amount: Currency::Balance) -> Currency::Balance { + Currency::unreserve_named(&ReserveId::get(), relayer, amount) + } + + fn repatriate_reserved( + relayer: &AccountId, + beneficiary: RewardsAccountParams, + amount: Currency::Balance, + ) -> Result { + let beneficiary_account = + PayRewardFromAccount::<(), AccountId>::rewards_account(beneficiary); + Currency::repatriate_reserved_named( + &ReserveId::get(), + relayer, + &beneficiary_account, + amount, + BalanceStatus::Free, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + + use frame_support::traits::fungible::Mutate; + + fn test_stake() -> Balance { + Stake::get() + } + + #[test] + fn reserve_works() { + run_test(|| { + assert!(TestStakeAndSlash::reserve(&1, test_stake()).is_err()); + assert_eq!(Balances::free_balance(1), 0); + assert_eq!(Balances::reserved_balance(1), 0); + + Balances::mint_into(&2, test_stake() - 1).unwrap(); + assert!(TestStakeAndSlash::reserve(&2, test_stake()).is_err()); + assert_eq!(Balances::free_balance(2), test_stake() - 1); + assert_eq!(Balances::reserved_balance(2), 0); + + Balances::mint_into(&3, test_stake() * 2).unwrap(); + assert_eq!(TestStakeAndSlash::reserve(&3, test_stake()), Ok(())); + assert_eq!(Balances::free_balance(3), test_stake()); + assert_eq!(Balances::reserved_balance(3), test_stake()); + }) + } + + #[test] + fn unreserve_works() { + run_test(|| { + assert_eq!(TestStakeAndSlash::unreserve(&1, test_stake()), test_stake()); + assert_eq!(Balances::free_balance(1), 0); + assert_eq!(Balances::reserved_balance(1), 0); + + Balances::mint_into(&2, test_stake() * 2).unwrap(); + TestStakeAndSlash::reserve(&2, test_stake() / 3).unwrap(); + assert_eq!( + TestStakeAndSlash::unreserve(&2, test_stake()), + test_stake() - test_stake() / 3 + ); + assert_eq!(Balances::free_balance(2), test_stake() * 2); + assert_eq!(Balances::reserved_balance(2), 0); + + Balances::mint_into(&3, test_stake() * 2).unwrap(); + TestStakeAndSlash::reserve(&3, test_stake()).unwrap(); + assert_eq!(TestStakeAndSlash::unreserve(&3, test_stake()), 0); + assert_eq!(Balances::free_balance(3), test_stake() * 2); + assert_eq!(Balances::reserved_balance(3), 0); + }) + } + + #[test] + fn repatriate_reserved_works() { + run_test(|| { + let beneficiary = TEST_REWARDS_ACCOUNT_PARAMS; + let beneficiary_account = TestPaymentProcedure::rewards_account(beneficiary); + + let mut expected_balance = ExistentialDeposit::get(); + Balances::mint_into(&beneficiary_account, expected_balance).unwrap(); + + assert_eq!( + TestStakeAndSlash::repatriate_reserved(&1, beneficiary, test_stake()), + Ok(test_stake()) + ); + assert_eq!(Balances::free_balance(1), 0); + assert_eq!(Balances::reserved_balance(1), 0); + assert_eq!(Balances::free_balance(beneficiary_account), expected_balance); + assert_eq!(Balances::reserved_balance(beneficiary_account), 0); + + expected_balance += test_stake() / 3; + Balances::mint_into(&2, test_stake() * 2).unwrap(); + TestStakeAndSlash::reserve(&2, test_stake() / 3).unwrap(); + assert_eq!( + TestStakeAndSlash::repatriate_reserved(&2, beneficiary, test_stake()), + Ok(test_stake() - test_stake() / 3) + ); + assert_eq!(Balances::free_balance(2), test_stake() * 2 - test_stake() / 3); + assert_eq!(Balances::reserved_balance(2), 0); + assert_eq!(Balances::free_balance(beneficiary_account), expected_balance); + assert_eq!(Balances::reserved_balance(beneficiary_account), 0); + + expected_balance += test_stake(); + Balances::mint_into(&3, test_stake() * 2).unwrap(); + TestStakeAndSlash::reserve(&3, test_stake()).unwrap(); + assert_eq!( + TestStakeAndSlash::repatriate_reserved(&3, beneficiary, test_stake()), + Ok(0) + ); + assert_eq!(Balances::free_balance(3), test_stake()); + assert_eq!(Balances::reserved_balance(3), 0); + assert_eq!(Balances::free_balance(beneficiary_account), expected_balance); + assert_eq!(Balances::reserved_balance(beneficiary_account), 0); + }) + } + + #[test] + fn repatriate_reserved_doesnt_work_when_beneficiary_account_is_missing() { + run_test(|| { + let beneficiary = TEST_REWARDS_ACCOUNT_PARAMS; + let beneficiary_account = TestPaymentProcedure::rewards_account(beneficiary); + + Balances::mint_into(&3, test_stake() * 2).unwrap(); + TestStakeAndSlash::reserve(&3, test_stake()).unwrap(); + assert!(TestStakeAndSlash::repatriate_reserved(&3, beneficiary, test_stake()).is_err()); + assert_eq!(Balances::free_balance(3), test_stake()); + assert_eq!(Balances::reserved_balance(3), test_stake()); + assert_eq!(Balances::free_balance(beneficiary_account), 0); + assert_eq!(Balances::reserved_balance(beneficiary_account), 0); + }); + } +} diff --git a/bridges/modules/relayers/src/weights.rs b/bridges/modules/relayers/src/weights.rs new file mode 100644 index 00000000000..1bc195a5424 --- /dev/null +++ b/bridges/modules/relayers/src/weights.rs @@ -0,0 +1,259 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Autogenerated weights for pallet_bridge_relayers +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-04-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/millau-bridge-node +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_bridge_relayers +// --extrinsic=* +// --execution=wasm +// --wasm-execution=Compiled +// --heap-pages=4096 +// --output=./modules/relayers/src/weights.rs +// --template=./.maintain/bridge-weight-template.hbs + +#![allow(clippy::all)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{ + traits::Get, + weights::{constants::RocksDbWeight, Weight}, +}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_bridge_relayers. +pub trait WeightInfo { + fn claim_rewards() -> Weight; + fn register() -> Weight; + fn deregister() -> Weight; + fn slash_and_deregister() -> Weight; + fn register_relayer_reward() -> Weight; +} + +/// Weights for `pallet_bridge_relayers` that are generated using one of the Bridge testnets. +/// +/// Those weights are test only and must never be used in production. +pub struct BridgeWeight(PhantomData); +impl WeightInfo for BridgeWeight { + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances TotalIssuance (r:1 w:0) + /// + /// Proof: Balances TotalIssuance (max_values: Some(1), max_size: Some(8), added: 503, mode: + /// MaxEncodedLen) + /// + /// Storage: System Account (r:1 w:1) + /// + /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: + /// MaxEncodedLen) + fn claim_rewards() -> Weight { + // Proof Size summary in bytes: + // Measured: `294` + // Estimated: `8592` + // Minimum execution time: 77_614 nanoseconds. + Weight::from_parts(79_987_000, 8592) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + fn register() -> Weight { + // Proof Size summary in bytes: + // Measured: `87` + // Estimated: `7843` + // Minimum execution time: 39_590 nanoseconds. + Weight::from_parts(40_546_000, 7843) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + fn deregister() -> Weight { + // Proof Size summary in bytes: + // Measured: `264` + // Estimated: `7843` + // Minimum execution time: 43_332 nanoseconds. + Weight::from_parts(45_087_000, 7843) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + /// + /// Storage: System Account (r:1 w:1) + /// + /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: + /// MaxEncodedLen) + fn slash_and_deregister() -> Weight { + // Proof Size summary in bytes: + // Measured: `380` + // Estimated: `11412` + // Minimum execution time: 42_358 nanoseconds. + Weight::from_parts(43_539_000, 11412) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn register_relayer_reward() -> Weight { + // Proof Size summary in bytes: + // Measured: `12` + // Estimated: `3530` + // Minimum execution time: 6_338 nanoseconds. + Weight::from_parts(6_526_000, 3530) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances TotalIssuance (r:1 w:0) + /// + /// Proof: Balances TotalIssuance (max_values: Some(1), max_size: Some(8), added: 503, mode: + /// MaxEncodedLen) + /// + /// Storage: System Account (r:1 w:1) + /// + /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: + /// MaxEncodedLen) + fn claim_rewards() -> Weight { + // Proof Size summary in bytes: + // Measured: `294` + // Estimated: `8592` + // Minimum execution time: 77_614 nanoseconds. + Weight::from_parts(79_987_000, 8592) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + fn register() -> Weight { + // Proof Size summary in bytes: + // Measured: `87` + // Estimated: `7843` + // Minimum execution time: 39_590 nanoseconds. + Weight::from_parts(40_546_000, 7843) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + fn deregister() -> Weight { + // Proof Size summary in bytes: + // Measured: `264` + // Estimated: `7843` + // Minimum execution time: 43_332 nanoseconds. + Weight::from_parts(45_087_000, 7843) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + /// + /// Storage: System Account (r:1 w:1) + /// + /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: + /// MaxEncodedLen) + fn slash_and_deregister() -> Weight { + // Proof Size summary in bytes: + // Measured: `380` + // Estimated: `11412` + // Minimum execution time: 42_358 nanoseconds. + Weight::from_parts(43_539_000, 11412) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn register_relayer_reward() -> Weight { + // Proof Size summary in bytes: + // Measured: `12` + // Estimated: `3530` + // Minimum execution time: 6_338 nanoseconds. + Weight::from_parts(6_526_000, 3530) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} diff --git a/bridges/modules/relayers/src/weights_ext.rs b/bridges/modules/relayers/src/weights_ext.rs new file mode 100644 index 00000000000..d459b0686bd --- /dev/null +++ b/bridges/modules/relayers/src/weights_ext.rs @@ -0,0 +1,49 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Weight-related utilities. + +use crate::weights::WeightInfo; + +use frame_support::pallet_prelude::Weight; + +/// Extended weight info. +pub trait WeightInfoExt: WeightInfo { + /// Returns weight, that needs to be added to the pre-dispatch weight of message delivery call, + /// if `RefundBridgedParachainMessages` signed extension is deployed at runtime level. + fn receive_messages_proof_overhead_from_runtime() -> Weight { + Self::slash_and_deregister().max(Self::register_relayer_reward()) + } + + /// Returns weight, that needs to be added to the pre-dispatch weight of message delivery + /// confirmation call, if `RefundBridgedParachainMessages` signed extension is deployed at + /// runtime level. + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { + Self::register_relayer_reward() + } + + /// Returns weight that we need to deduct from the message delivery call weight that has + /// completed successfully. + /// + /// Usually, the weight of `slash_and_deregister` is larger than the weight of the + /// `register_relayer_reward`. So if relayer has been rewarded, we want to deduct the difference + /// to get the actual post-dispatch weight. + fn extra_weight_of_successful_receive_messages_proof_call() -> Weight { + Self::slash_and_deregister().saturating_sub(Self::register_relayer_reward()) + } +} + +impl WeightInfoExt for T {} diff --git a/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml b/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml new file mode 100644 index 00000000000..2bbe3d029a3 --- /dev/null +++ b/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "bp-bridge-hub-cumulus" +description = "Primitives of BridgeHubRococo parachain runtime." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +# Bridge Dependencies + +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } + +# Substrate Based Dependencies + +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +# Polkadot Dependencies +polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-polkadot-core/std", + "bp-messages/std", + "bp-runtime/std", + "frame-system/std", + "frame-support/std", + "sp-api/std", + "sp-std/std", + "polkadot-primitives/std", +] diff --git a/bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs b/bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs new file mode 100644 index 00000000000..4c9f9e20468 --- /dev/null +++ b/bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs @@ -0,0 +1,216 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_polkadot_core::{ + AccountId, AccountInfoStorageMapKeyProvider, AccountPublic, Balance, BlockNumber, Hash, Hasher, + Hashing, Header, Index, Nonce, Perbill, Signature, SignedBlock, UncheckedExtrinsic, + EXTRA_STORAGE_PROOF_SIZE, TX_EXTRA_BYTES, +}; + +use bp_messages::*; +use bp_runtime::extensions::{ + BridgeRejectObsoleteHeadersAndMessages, ChargeTransactionPayment, CheckEra, CheckGenesis, + CheckNonZeroSender, CheckNonce, CheckSpecVersion, CheckTxVersion, CheckWeight, + GenericSignedExtension, RefundBridgedParachainMessagesSchema, +}; +use frame_support::{ + dispatch::DispatchClass, + parameter_types, + sp_runtime::{MultiAddress, MultiSigner}, + weights::constants, +}; +use frame_system::limits; +use sp_std::time::Duration; + +/// Average block interval in Cumulus-based parachains. +/// +/// Corresponds to the `MILLISECS_PER_BLOCK` from `parachains_common` crate. +pub const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_secs(12); + +/// All cumulus bridge hubs allow normal extrinsics to fill block up to 75 percent. +/// +/// This is a copy-paste from the cumulus repo's `parachains-common` crate. +pub const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); + +/// All cumulus bridge hubs chains allow for 0.5 seconds of compute with a 6-second average block +/// time. +/// +/// This is a copy-paste from the cumulus repo's `parachains-common` crate. +const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(constants::WEIGHT_REF_TIME_PER_SECOND, 0) + .saturating_div(2) + .set_proof_size(polkadot_primitives::v4::MAX_POV_SIZE as u64); + +/// All cumulus bridge hubs assume that about 5 percent of the block weight is consumed by +/// `on_initialize` handlers. This is used to limit the maximal weight of a single extrinsic. +/// +/// This is a copy-paste from the cumulus repo's `parachains-common` crate. +pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); + +parameter_types! { + pub BlockLength: limits::BlockLength = limits::BlockLength::max_with_normal_ratio( + 5 * 1024 * 1024, + NORMAL_DISPATCH_RATIO, + ); + + /// Importing a block with 0 Extrinsics. + pub const BlockExecutionWeight: Weight = Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS, 0) + .saturating_mul(5_000_000); + /// Executing a NO-OP `System::remarks` Extrinsic. + pub const ExtrinsicBaseWeight: Weight = Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS, 0) + .saturating_mul(125_000); + + pub BlockWeights: limits::BlockWeights = limits::BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have an extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT, + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); +} + +/// Public key of the chain account that may be used to verify signatures. +pub type AccountSigner = MultiSigner; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +// Note about selecting values of two following constants: +// +// Normal transactions have limit of 75% of 1/2 second weight for Cumulus parachains. Let's keep +// some reserve for the rest of stuff there => let's select values that fit in 50% of maximal limit. +// +// Using current constants, the limit would be: +// +// `75% * WEIGHT_REF_TIME_PER_SECOND * 1 / 2 * 50% = 0.75 * 1_000_000_000_000 / 2 * 0.5 = +// 187_500_000_000` +// +// According to (preliminary) weights of messages pallet, cost of additional message is zero and the +// cost of additional relayer is `8_000_000 + db read + db write`. Let's say we want no more than +// 4096 unconfirmed messages (no any scientific justification for that - it just looks large +// enough). And then we can't have more than 4096 relayers. E.g. for 1024 relayers is (using +// `RocksDbWeight`): +// +// `1024 * (8_000_000 + db read + db write) = 1024 * (8_000_000 + 25_000_000 + 100_000_000) = +// 136_192_000_000` +// +// So 1024 looks like good approximation for the number of relayers. If something is wrong in those +// assumptions, or something will change, it shall be caught by the +// `ensure_able_to_receive_confirmation` test. + +/// Maximal number of unrewarded relayer entries at inbound lane for Cumulus-based parachains. +pub const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 1024; + +/// Maximal number of unconfirmed messages at inbound lane for Cumulus-based parachains. +pub const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 4096; + +/// Extra signed extension data that is used by all bridge hubs. +pub type SignedExtra = ( + CheckNonZeroSender, + CheckSpecVersion, + CheckTxVersion, + CheckGenesis, + CheckEra, + CheckNonce, + CheckWeight, + ChargeTransactionPayment, + BridgeRejectObsoleteHeadersAndMessages, + RefundBridgedParachainMessagesSchema, +); + +/// Signed extension that is used by all bridge hubs. +pub type SignedExtension = GenericSignedExtension; + +/// Helper trait to define some extra methods on bridge hubs signed extension (and +/// overcome Rust limitations). +pub trait BridgeHubSignedExtension { + /// Create signed extension from its components. + fn from_params( + spec_version: u32, + transaction_version: u32, + era: bp_runtime::TransactionEra, + genesis_hash: Hash, + nonce: Index, + tip: Balance, + ) -> Self; + + /// Return transaction nonce. + fn nonce(&self) -> Index; + + /// Return transaction tip. + fn tip(&self) -> Balance; +} + +impl BridgeHubSignedExtension for SignedExtension { + /// Create signed extension from its components. + fn from_params( + spec_version: u32, + transaction_version: u32, + era: bp_runtime::TransactionEra, + genesis_hash: Hash, + nonce: Index, + tip: Balance, + ) -> Self { + GenericSignedExtension::new( + ( + (), // non-zero sender + (), // spec version + (), // tx version + (), // genesis + era.frame_era(), // era + nonce.into(), // nonce (compact encoding) + (), // Check weight + tip.into(), // transaction payment / tip (compact encoding) + (), // bridge reject obsolete headers and msgs + (), // bridge reward to relayer for message passing + ), + Some(( + (), + spec_version, + transaction_version, + genesis_hash, + era.signed_payload(genesis_hash), + (), + (), + (), + (), + (), + )), + ) + } + + /// Return transaction nonce. + fn nonce(&self) -> Index { + self.payload.5 .0 + } + + /// Return transaction tip. + fn tip(&self) -> Balance { + self.payload.7 .0 + } +} diff --git a/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml b/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml new file mode 100644 index 00000000000..6d4334eaa57 --- /dev/null +++ b/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "bp-bridge-hub-kusama" +description = "Primitives of BridgeHubRococo parachain runtime." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +# Bridge Dependencies + +bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-bridge-hub-cumulus/std", + "bp-messages/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", + "sp-std/std", +] diff --git a/bridges/primitives/chain-bridge-hub-kusama/src/lib.rs b/bridges/primitives/chain-bridge-hub-kusama/src/lib.rs new file mode 100644 index 00000000000..6ca2cd047fb --- /dev/null +++ b/bridges/primitives/chain-bridge-hub-kusama/src/lib.rs @@ -0,0 +1,84 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Module with configuration which reflects BridgeHubKusama runtime setup (AccountId, Headers, +//! Hashes...) + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_bridge_hub_cumulus::*; +use bp_messages::*; +use bp_runtime::{ + decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, +}; +use frame_support::{ + dispatch::DispatchClass, + sp_runtime::{MultiAddress, MultiSigner}, + RuntimeDebug, +}; +use sp_std::prelude::*; + +/// BridgeHubKusama parachain. +#[derive(RuntimeDebug)] +pub struct BridgeHubKusama; + +impl Chain for BridgeHubKusama { + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hasher = Hasher; + type Header = Header; + + type AccountId = AccountId; + type Balance = Balance; + type Index = Index; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + *BlockLength::get().max.get(DispatchClass::Normal) + } + + fn max_extrinsic_weight() -> Weight { + BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .unwrap_or(Weight::MAX) + } +} + +impl Parachain for BridgeHubKusama { + const PARACHAIN_ID: u32 = BRIDGE_HUB_KUSAMA_PARACHAIN_ID; +} + +/// Public key of the chain account that may be used to verify signatures. +pub type AccountSigner = MultiSigner; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Identifier of BridgeHubKusama in the Kusama relay chain. +pub const BRIDGE_HUB_KUSAMA_PARACHAIN_ID: u32 = 1002; + +/// Name of the With-BridgeHubKusama messages pallet instance that is deployed at bridged chains. +// TODO: check me (https://github.com/paritytech/parity-bridges-common/issues/1945) +pub const WITH_BRIDGE_HUB_KUSAMA_MESSAGES_PALLET_NAME: &str = "BridgeKusamaMessages"; + +/// Name of the With-BridgeHubKusama bridge-relayers pallet instance that is deployed at bridged +/// chains. +// TODO: check me (https://github.com/paritytech/parity-bridges-common/issues/1945) +pub const WITH_BRIDGE_HUB_KUSAMA_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; + +decl_bridge_finality_runtime_apis!(bridge_hub_kusama); +decl_bridge_messages_runtime_apis!(bridge_hub_kusama); diff --git a/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml b/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml new file mode 100644 index 00000000000..2a0ab3213c8 --- /dev/null +++ b/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "bp-bridge-hub-polkadot" +description = "Primitives of BridgeHubWococo parachain runtime." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-bridge-hub-cumulus/std", + "bp-runtime/std", + "bp-messages/std", + "frame-support/std", + "sp-api/std", + "sp-std/std", +] diff --git a/bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs b/bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs new file mode 100644 index 00000000000..646fb0a6e41 --- /dev/null +++ b/bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs @@ -0,0 +1,75 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Module with configuration which reflects BridgeHubPolkadot runtime setup +//! (AccountId, Headers, Hashes...) + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_bridge_hub_cumulus::*; +use bp_messages::*; +use bp_runtime::{ + decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, +}; +use frame_support::{dispatch::DispatchClass, RuntimeDebug}; +use sp_std::prelude::*; + +/// BridgeHubPolkadot parachain. +#[derive(RuntimeDebug)] +pub struct BridgeHubPolkadot; + +impl Chain for BridgeHubPolkadot { + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hasher = Hasher; + type Header = Header; + + type AccountId = AccountId; + type Balance = Balance; + type Index = Index; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + *BlockLength::get().max.get(DispatchClass::Normal) + } + + fn max_extrinsic_weight() -> Weight { + BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .unwrap_or(Weight::MAX) + } +} + +impl Parachain for BridgeHubPolkadot { + const PARACHAIN_ID: u32 = BRIDGE_HUB_POLKADOT_PARACHAIN_ID; +} + +/// Identifier of BridgeHubPolkadot in the Polkadot relay chain. +// TODO: check me (https://github.com/paritytech/parity-bridges-common/issues/1945) +pub const BRIDGE_HUB_POLKADOT_PARACHAIN_ID: u32 = 1002; + +/// Name of the With-BridgeHubPolkadot messages pallet instance that is deployed at bridged chains. +// TODO: check me (https://github.com/paritytech/parity-bridges-common/issues/1945) +pub const WITH_BRIDGE_HUB_POLKADOT_MESSAGES_PALLET_NAME: &str = "BridgePolkadotMessages"; + +/// Name of the With-BridgeHubPolkadot bridge-relayers pallet instance that is deployed at bridged +/// chains. +// TODO: check me (https://github.com/paritytech/parity-bridges-common/issues/1945) +pub const WITH_BRIDGE_HUB_POLKADOT_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; + +decl_bridge_finality_runtime_apis!(bridge_hub_polkadot); +decl_bridge_messages_runtime_apis!(bridge_hub_polkadot); diff --git a/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml b/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml new file mode 100644 index 00000000000..85c4225ab55 --- /dev/null +++ b/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "bp-bridge-hub-rococo" +description = "Primitives of BridgeHubRococo parachain runtime." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +# Bridge Dependencies + +bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-bridge-hub-cumulus/std", + "bp-messages/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", + "sp-std/std", +] diff --git a/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs b/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs new file mode 100644 index 00000000000..936e4d1beb7 --- /dev/null +++ b/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs @@ -0,0 +1,82 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Module with configuration which reflects BridgeHubRococo runtime setup (AccountId, Headers, +//! Hashes...) + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_bridge_hub_cumulus::*; +use bp_messages::*; +use bp_runtime::{ + decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, +}; +use frame_support::{ + dispatch::DispatchClass, + sp_runtime::{MultiAddress, MultiSigner}, + RuntimeDebug, +}; +use sp_std::prelude::*; + +/// BridgeHubRococo parachain. +#[derive(RuntimeDebug)] +pub struct BridgeHubRococo; + +impl Chain for BridgeHubRococo { + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hasher = Hasher; + type Header = Header; + + type AccountId = AccountId; + type Balance = Balance; + type Index = Index; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + *BlockLength::get().max.get(DispatchClass::Normal) + } + + fn max_extrinsic_weight() -> Weight { + BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .unwrap_or(Weight::MAX) + } +} + +impl Parachain for BridgeHubRococo { + const PARACHAIN_ID: u32 = BRIDGE_HUB_ROCOCO_PARACHAIN_ID; +} + +/// Public key of the chain account that may be used to verify signatures. +pub type AccountSigner = MultiSigner; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Identifier of BridgeHubRococo in the Rococo relay chain. +pub const BRIDGE_HUB_ROCOCO_PARACHAIN_ID: u32 = 1013; + +/// Name of the With-BridgeHubRococo messages pallet instance that is deployed at bridged chains. +pub const WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME: &str = "BridgeRococoMessages"; + +/// Name of the With-BridgeHubRococo bridge-relayers pallet instance that is deployed at bridged +/// chains. +pub const WITH_BRIDGE_HUB_ROCOCO_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; + +decl_bridge_finality_runtime_apis!(bridge_hub_rococo); +decl_bridge_messages_runtime_apis!(bridge_hub_rococo); diff --git a/bridges/primitives/chain-bridge-hub-wococo/Cargo.toml b/bridges/primitives/chain-bridge-hub-wococo/Cargo.toml new file mode 100644 index 00000000000..24ecdb7adbc --- /dev/null +++ b/bridges/primitives/chain-bridge-hub-wococo/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "bp-bridge-hub-wococo" +description = "Primitives of BridgeHubWococo parachain runtime." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-bridge-hub-cumulus/std", + "bp-runtime/std", + "bp-messages/std", + "frame-support/std", + "sp-api/std", + "sp-std/std", +] diff --git a/bridges/primitives/chain-bridge-hub-wococo/src/lib.rs b/bridges/primitives/chain-bridge-hub-wococo/src/lib.rs new file mode 100644 index 00000000000..00704995c5e --- /dev/null +++ b/bridges/primitives/chain-bridge-hub-wococo/src/lib.rs @@ -0,0 +1,72 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Module with configuration which reflects BridgeHubWococo runtime setup +//! (AccountId, Headers, Hashes...) + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_bridge_hub_cumulus::*; +use bp_messages::*; +use bp_runtime::{ + decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, +}; +use frame_support::{dispatch::DispatchClass, RuntimeDebug}; +use sp_std::prelude::*; + +/// BridgeHubWococo parachain. +#[derive(RuntimeDebug)] +pub struct BridgeHubWococo; + +impl Chain for BridgeHubWococo { + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hasher = Hasher; + type Header = Header; + + type AccountId = AccountId; + type Balance = Balance; + type Index = Index; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + *BlockLength::get().max.get(DispatchClass::Normal) + } + + fn max_extrinsic_weight() -> Weight { + BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .unwrap_or(Weight::MAX) + } +} + +impl Parachain for BridgeHubWococo { + const PARACHAIN_ID: u32 = BRIDGE_HUB_WOCOCO_PARACHAIN_ID; +} + +/// Identifier of BridgeHubWococo in the Wococo relay chain. +pub const BRIDGE_HUB_WOCOCO_PARACHAIN_ID: u32 = 1014; + +/// Name of the With-BridgeHubWococo messages pallet instance that is deployed at bridged chains. +pub const WITH_BRIDGE_HUB_WOCOCO_MESSAGES_PALLET_NAME: &str = "BridgeWococoMessages"; + +/// Name of the With-BridgeHubWococo bridge-relayers pallet instance that is deployed at bridged +/// chains. +pub const WITH_BRIDGE_HUB_WOCOCO_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; + +decl_bridge_finality_runtime_apis!(bridge_hub_wococo); +decl_bridge_messages_runtime_apis!(bridge_hub_wococo); diff --git a/bridges/primitives/chain-kusama/Cargo.toml b/bridges/primitives/chain-kusama/Cargo.toml new file mode 100644 index 00000000000..7f48ded1a37 --- /dev/null +++ b/bridges/primitives/chain-kusama/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "bp-kusama" +description = "Primitives of Kusama runtime." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-header-chain = { path = "../header-chain", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", +] diff --git a/bridges/primitives/chain-kusama/src/lib.rs b/bridges/primitives/chain-kusama/src/lib.rs new file mode 100644 index 00000000000..8e5aec8afda --- /dev/null +++ b/bridges/primitives/chain-kusama/src/lib.rs @@ -0,0 +1,65 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] +// RuntimeApi generated functions +#![allow(clippy::too_many_arguments)] + +pub use bp_polkadot_core::*; + +use bp_header_chain::ChainWithGrandpa; +use bp_runtime::{decl_bridge_finality_runtime_apis, Chain}; +use frame_support::weights::Weight; + +/// Kusama Chain +pub struct Kusama; + +impl Chain for Kusama { + type BlockNumber = ::BlockNumber; + type Hash = ::Hash; + type Hasher = ::Hasher; + type Header = ::Header; + + type AccountId = ::AccountId; + type Balance = ::Balance; + type Index = ::Index; + type Signature = ::Signature; + + fn max_extrinsic_size() -> u32 { + PolkadotLike::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + PolkadotLike::max_extrinsic_weight() + } +} + +impl ChainWithGrandpa for Kusama { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_KUSAMA_GRANDPA_PALLET_NAME; + const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const MAX_HEADER_SIZE: u32 = MAX_HEADER_SIZE; + const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = AVERAGE_HEADER_SIZE_IN_JUSTIFICATION; +} + +/// Name of the parachains pallet in the Kusama runtime. +pub const PARAS_PALLET_NAME: &str = "Paras"; + +/// Name of the With-Kusama GRANDPA pallet instance that is deployed at bridged chains. +pub const WITH_KUSAMA_GRANDPA_PALLET_NAME: &str = "BridgeKusamaGrandpa"; + +decl_bridge_finality_runtime_apis!(kusama); diff --git a/bridges/primitives/chain-polkadot/Cargo.toml b/bridges/primitives/chain-polkadot/Cargo.toml new file mode 100644 index 00000000000..def26bdda1c --- /dev/null +++ b/bridges/primitives/chain-polkadot/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "bp-polkadot" +description = "Primitives of Polkadot runtime." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-header-chain = { path = "../header-chain", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", +] diff --git a/bridges/primitives/chain-polkadot/src/lib.rs b/bridges/primitives/chain-polkadot/src/lib.rs new file mode 100644 index 00000000000..92995601698 --- /dev/null +++ b/bridges/primitives/chain-polkadot/src/lib.rs @@ -0,0 +1,65 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] +// RuntimeApi generated functions +#![allow(clippy::too_many_arguments)] + +pub use bp_polkadot_core::*; + +use bp_header_chain::ChainWithGrandpa; +use bp_runtime::{decl_bridge_finality_runtime_apis, Chain}; +use frame_support::weights::Weight; + +/// Polkadot Chain +pub struct Polkadot; + +impl Chain for Polkadot { + type BlockNumber = ::BlockNumber; + type Hash = ::Hash; + type Hasher = ::Hasher; + type Header = ::Header; + + type AccountId = ::AccountId; + type Balance = ::Balance; + type Index = ::Index; + type Signature = ::Signature; + + fn max_extrinsic_size() -> u32 { + PolkadotLike::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + PolkadotLike::max_extrinsic_weight() + } +} + +impl ChainWithGrandpa for Polkadot { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_POLKADOT_GRANDPA_PALLET_NAME; + const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const MAX_HEADER_SIZE: u32 = MAX_HEADER_SIZE; + const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = AVERAGE_HEADER_SIZE_IN_JUSTIFICATION; +} + +/// Name of the parachains pallet in the Polkadot runtime. +pub const PARAS_PALLET_NAME: &str = "Paras"; + +/// Name of the With-Polkadot GRANDPA pallet instance that is deployed at bridged chains. +pub const WITH_POLKADOT_GRANDPA_PALLET_NAME: &str = "BridgePolkadotGrandpa"; + +decl_bridge_finality_runtime_apis!(polkadot); diff --git a/bridges/primitives/chain-rococo/Cargo.toml b/bridges/primitives/chain-rococo/Cargo.toml new file mode 100644 index 00000000000..4e21bd38b7a --- /dev/null +++ b/bridges/primitives/chain-rococo/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "bp-rococo" +description = "Primitives of Rococo runtime." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-header-chain = { path = "../header-chain", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Based Dependencies + +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", +] diff --git a/bridges/primitives/chain-rococo/src/lib.rs b/bridges/primitives/chain-rococo/src/lib.rs new file mode 100644 index 00000000000..0cb0b1d41e6 --- /dev/null +++ b/bridges/primitives/chain-rococo/src/lib.rs @@ -0,0 +1,76 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] +// RuntimeApi generated functions +#![allow(clippy::too_many_arguments)] + +pub use bp_polkadot_core::*; + +use bp_header_chain::ChainWithGrandpa; +use bp_runtime::{decl_bridge_finality_runtime_apis, Chain}; +use frame_support::{parameter_types, weights::Weight}; + +/// Rococo Chain +pub struct Rococo; + +impl Chain for Rococo { + type BlockNumber = ::BlockNumber; + type Hash = ::Hash; + type Hasher = ::Hasher; + type Header = ::Header; + + type AccountId = ::AccountId; + type Balance = ::Balance; + type Index = ::Index; + type Signature = ::Signature; + + fn max_extrinsic_size() -> u32 { + PolkadotLike::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + PolkadotLike::max_extrinsic_weight() + } +} + +impl ChainWithGrandpa for Rococo { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_ROCOCO_GRANDPA_PALLET_NAME; + const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const MAX_HEADER_SIZE: u32 = MAX_HEADER_SIZE; + const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = AVERAGE_HEADER_SIZE_IN_JUSTIFICATION; +} + +parameter_types! { + pub const SS58Prefix: u8 = 42; +} + +/// Name of the parachains pallet in the Rococo runtime. +pub const PARAS_PALLET_NAME: &str = "Paras"; + +/// Name of the With-Rococo GRANDPA pallet instance that is deployed at bridged chains. +pub const WITH_ROCOCO_GRANDPA_PALLET_NAME: &str = "BridgeRococoGrandpa"; + +/// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Rococo +/// parachains. +/// +/// It includes the block number and state root, so it shall be near 40 bytes, but let's have some +/// reserve. +pub const MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE: u32 = 128; + +decl_bridge_finality_runtime_apis!(rococo); diff --git a/bridges/primitives/chain-wococo/Cargo.toml b/bridges/primitives/chain-wococo/Cargo.toml new file mode 100644 index 00000000000..25fd7b9fd94 --- /dev/null +++ b/bridges/primitives/chain-wococo/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "bp-wococo" +description = "Primitives of Wococo runtime." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-header-chain = { path = "../header-chain", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } +bp-rococo = { path = "../chain-rococo", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "bp-rococo/std", + "frame-support/std", + "sp-api/std", +] diff --git a/bridges/primitives/chain-wococo/src/lib.rs b/bridges/primitives/chain-wococo/src/lib.rs new file mode 100644 index 00000000000..2df019496ab --- /dev/null +++ b/bridges/primitives/chain-wococo/src/lib.rs @@ -0,0 +1,65 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] +// RuntimeApi generated functions +#![allow(clippy::too_many_arguments)] + +pub use bp_polkadot_core::*; +pub use bp_rococo::{ + SS58Prefix, MAX_AUTHORITIES_COUNT, MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE, PARAS_PALLET_NAME, +}; + +use bp_header_chain::ChainWithGrandpa; +use bp_runtime::{decl_bridge_finality_runtime_apis, Chain}; +use frame_support::weights::Weight; + +/// Wococo Chain +pub struct Wococo; + +impl Chain for Wococo { + type BlockNumber = ::BlockNumber; + type Hash = ::Hash; + type Hasher = ::Hasher; + type Header = ::Header; + + type AccountId = ::AccountId; + type Balance = ::Balance; + type Index = ::Index; + type Signature = ::Signature; + + fn max_extrinsic_size() -> u32 { + PolkadotLike::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + PolkadotLike::max_extrinsic_weight() + } +} + +impl ChainWithGrandpa for Wococo { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_WOCOCO_GRANDPA_PALLET_NAME; + const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const MAX_HEADER_SIZE: u32 = MAX_HEADER_SIZE; + const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = AVERAGE_HEADER_SIZE_IN_JUSTIFICATION; +} + +/// Name of the With-Wococo GRANDPA pallet instance that is deployed at bridged chains. +pub const WITH_WOCOCO_GRANDPA_PALLET_NAME: &str = "BridgeWococoGrandpa"; + +decl_bridge_finality_runtime_apis!(wococo); diff --git a/bridges/primitives/header-chain/Cargo.toml b/bridges/primitives/header-chain/Cargo.toml new file mode 100644 index 00000000000..e0349ebc9b9 --- /dev/null +++ b/bridges/primitives/header-chain/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "bp-header-chain" +description = "A common interface for describing what a bridge pallet should be able to do." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +finality-grandpa = { version = "0.16.2", default-features = false } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +serde = { version = "1.0", optional = true } + +# Bridge dependencies + +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[dev-dependencies] +bp-test-utils = { path = "../test-utils" } +hex = "0.4" +hex-literal = "0.4" + +[features] +default = ["std"] +std = [ + "bp-runtime/std", + "codec/std", + "finality-grandpa/std", + "serde/std", + "frame-support/std", + "scale-info/std", + "sp-core/std", + "sp-consensus-grandpa/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/bridges/primitives/header-chain/src/justification.rs b/bridges/primitives/header-chain/src/justification.rs new file mode 100644 index 00000000000..06ed782763d --- /dev/null +++ b/bridges/primitives/header-chain/src/justification.rs @@ -0,0 +1,390 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Pallet for checking GRANDPA Finality Proofs. +//! +//! Adapted copy of substrate/client/finality-grandpa/src/justification.rs. If origin +//! will ever be moved to the sp_consensus_grandpa, we should reuse that implementation. + +use crate::ChainWithGrandpa; + +use bp_runtime::{BlockNumberOf, Chain, HashOf}; +use codec::{Decode, Encode, MaxEncodedLen}; +use finality_grandpa::voter_set::VoterSet; +use frame_support::RuntimeDebug; +use scale_info::TypeInfo; +use sp_consensus_grandpa::{AuthorityId, AuthoritySignature, SetId}; +use sp_runtime::{traits::Header as HeaderT, SaturatedConversion}; +use sp_std::{ + collections::{btree_map::BTreeMap, btree_set::BTreeSet}, + prelude::*, +}; + +/// A GRANDPA Justification is a proof that a given header was finalized +/// at a certain height and with a certain set of authorities. +/// +/// This particular proof is used to prove that headers on a bridged chain +/// (so not our chain) have been finalized correctly. +#[derive(Encode, Decode, RuntimeDebug, Clone, PartialEq, Eq, TypeInfo)] +pub struct GrandpaJustification { + /// The round (voting period) this justification is valid for. + pub round: u64, + /// The set of votes for the chain which is to be finalized. + pub commit: + finality_grandpa::Commit, + /// A proof that the chain of blocks in the commit are related to each other. + pub votes_ancestries: Vec
, +} + +impl GrandpaJustification { + /// Returns reasonable size of justification using constants from the provided chain. + /// + /// An imprecise analogue of `MaxEncodedLen` implementation. We don't use it for + /// any precise calculations - that's just an estimation. + pub fn max_reasonable_size(required_precommits: u32) -> u32 + where + C: Chain
+ ChainWithGrandpa, + { + // we don't need precise results here - just estimations, so some details + // are removed from computations (e.g. bytes required to encode vector length) + + // structures in `finality_grandpa` crate are not implementing `MaxEncodedLength`, so + // here's our estimation for the `finality_grandpa::Commit` struct size + // + // precommit is: hash + number + // signed precommit is: precommit + signature (64b) + authority id + // commit is: hash + number + vec of signed precommits + let signed_precommit_size: u32 = BlockNumberOf::::max_encoded_len() + .saturating_add(HashOf::::max_encoded_len().saturated_into()) + .saturating_add(64) + .saturating_add(AuthorityId::max_encoded_len().saturated_into()) + .saturated_into(); + let max_expected_signed_commit_size = signed_precommit_size + .saturating_mul(required_precommits) + .saturating_add(BlockNumberOf::::max_encoded_len().saturated_into()) + .saturating_add(HashOf::::max_encoded_len().saturated_into()); + + // justification is a signed GRANDPA commit, `votes_ancestries` vector and round number + let max_expected_votes_ancestries_size = C::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY + .saturating_mul(C::AVERAGE_HEADER_SIZE_IN_JUSTIFICATION); + + 8u32.saturating_add(max_expected_signed_commit_size) + .saturating_add(max_expected_votes_ancestries_size) + } +} + +impl crate::FinalityProof for GrandpaJustification { + fn target_header_number(&self) -> H::Number { + self.commit.target_number + } +} + +/// Justification verification error. +#[derive(Eq, RuntimeDebug, PartialEq)] +pub enum Error { + /// Failed to decode justification. + JustificationDecode, + /// Justification is finalizing unexpected header. + InvalidJustificationTarget, + /// Justification contains redundant votes. + RedundantVotesInJustification, + /// Justification contains unknown authority precommit. + UnknownAuthorityVote, + /// Justification contains duplicate authority precommit. + DuplicateAuthorityVote, + /// The authority has provided an invalid signature. + InvalidAuthoritySignature, + /// The justification contains precommit for header that is not a descendant of the commit + /// header. + PrecommitIsNotCommitDescendant, + /// The cumulative weight of all votes in the justification is not enough to justify commit + /// header finalization. + TooLowCumulativeWeight, + /// The justification contains extra (unused) headers in its `votes_ancestries` field. + ExtraHeadersInVotesAncestries, +} + +/// Given GRANDPA authorities set size, return number of valid authorities votes that the +/// justification must have to be valid. +/// +/// This function assumes that all authorities have the same vote weight. +pub fn required_justification_precommits(authorities_set_length: u32) -> u32 { + authorities_set_length - authorities_set_length.saturating_sub(1) / 3 +} + +/// Decode justification target. +pub fn decode_justification_target( + raw_justification: &[u8], +) -> Result<(Header::Hash, Header::Number), Error> { + GrandpaJustification::
::decode(&mut &*raw_justification) + .map(|justification| (justification.commit.target_hash, justification.commit.target_number)) + .map_err(|_| Error::JustificationDecode) +} + +/// Verify and optimize given justification by removing unknown and duplicate votes. +pub fn verify_and_optimize_justification( + finalized_target: (Header::Hash, Header::Number), + authorities_set_id: SetId, + authorities_set: &VoterSet, + justification: GrandpaJustification
, +) -> Result, Error> +where + Header::Number: finality_grandpa::BlockNumberOps, +{ + let mut optimizer = OptimizationCallbacks(Vec::new()); + verify_justification_with_callbacks( + finalized_target, + authorities_set_id, + authorities_set, + &justification, + &mut optimizer, + )?; + Ok(optimizer.optimize(justification)) +} + +/// Verify that justification, that is generated by given authority set, finalizes given header. +pub fn verify_justification( + finalized_target: (Header::Hash, Header::Number), + authorities_set_id: SetId, + authorities_set: &VoterSet, + justification: &GrandpaJustification
, +) -> Result<(), Error> +where + Header::Number: finality_grandpa::BlockNumberOps, +{ + verify_justification_with_callbacks( + finalized_target, + authorities_set_id, + authorities_set, + justification, + &mut StrictVerificationCallbacks, + ) +} + +/// Verification callbacks. +trait VerificationCallbacks { + /// Called when we see a precommit from unknown authority. + fn on_unkown_authority(&mut self, precommit_idx: usize) -> Result<(), Error>; + /// Called when we see a precommit with duplicate vote from known authority. + fn on_duplicate_authority_vote(&mut self, precommit_idx: usize) -> Result<(), Error>; + /// Called when we see a precommit after we've collected enough votes from authorities. + fn on_redundant_authority_vote(&mut self, precommit_idx: usize) -> Result<(), Error>; +} + +/// Verification callbacks that reject all unknown, duplicate or redundant votes. +struct StrictVerificationCallbacks; + +impl VerificationCallbacks for StrictVerificationCallbacks { + fn on_unkown_authority(&mut self, _precommit_idx: usize) -> Result<(), Error> { + Err(Error::UnknownAuthorityVote) + } + + fn on_duplicate_authority_vote(&mut self, _precommit_idx: usize) -> Result<(), Error> { + Err(Error::DuplicateAuthorityVote) + } + + fn on_redundant_authority_vote(&mut self, _precommit_idx: usize) -> Result<(), Error> { + Err(Error::RedundantVotesInJustification) + } +} + +/// Verification callbacks for justification optimization. +struct OptimizationCallbacks(Vec); + +impl OptimizationCallbacks { + fn optimize( + self, + mut justification: GrandpaJustification
, + ) -> GrandpaJustification
{ + for invalid_precommit_idx in self.0.into_iter().rev() { + justification.commit.precommits.remove(invalid_precommit_idx); + } + justification + } +} + +impl VerificationCallbacks for OptimizationCallbacks { + fn on_unkown_authority(&mut self, precommit_idx: usize) -> Result<(), Error> { + self.0.push(precommit_idx); + Ok(()) + } + + fn on_duplicate_authority_vote(&mut self, precommit_idx: usize) -> Result<(), Error> { + self.0.push(precommit_idx); + Ok(()) + } + + fn on_redundant_authority_vote(&mut self, precommit_idx: usize) -> Result<(), Error> { + self.0.push(precommit_idx); + Ok(()) + } +} + +/// Verify that justification, that is generated by given authority set, finalizes given header. +fn verify_justification_with_callbacks( + finalized_target: (Header::Hash, Header::Number), + authorities_set_id: SetId, + authorities_set: &VoterSet, + justification: &GrandpaJustification
, + callbacks: &mut C, +) -> Result<(), Error> +where + Header::Number: finality_grandpa::BlockNumberOps, +{ + // ensure that it is justification for the expected header + if (justification.commit.target_hash, justification.commit.target_number) != finalized_target { + return Err(Error::InvalidJustificationTarget) + } + + let threshold = authorities_set.threshold().0.into(); + let mut chain = AncestryChain::new(&justification.votes_ancestries); + let mut signature_buffer = Vec::new(); + let mut votes = BTreeSet::new(); + let mut cumulative_weight = 0u64; + + for (precommit_idx, signed) in justification.commit.precommits.iter().enumerate() { + // if we have collected enough precommits, we probabably want to fail/remove extra + // precommits + if cumulative_weight >= threshold { + callbacks.on_redundant_authority_vote(precommit_idx)?; + continue + } + + // authority must be in the set + let authority_info = match authorities_set.get(&signed.id) { + Some(authority_info) => authority_info, + None => { + callbacks.on_unkown_authority(precommit_idx)?; + continue + }, + }; + + // check if authority has already voted in the same round. + // + // there's a lot of code in `validate_commit` and `import_precommit` functions inside + // `finality-grandpa` crate (mostly related to reporting equivocations). But the only thing + // that we care about is that only first vote from the authority is accepted + if !votes.insert(signed.id.clone()) { + callbacks.on_duplicate_authority_vote(precommit_idx)?; + continue + } + + // everything below this line can't just `continue`, because state is already altered + + // precommits aren't allowed for block lower than the target + if signed.precommit.target_number < justification.commit.target_number { + return Err(Error::PrecommitIsNotCommitDescendant) + } + // all precommits must be descendants of target block + chain = chain + .ensure_descendant(&justification.commit.target_hash, &signed.precommit.target_hash)?; + // since we know now that the precommit target is the descendant of the justification + // target, we may increase 'weight' of the justification target + // + // there's a lot of code in the `VoteGraph::insert` method inside `finality-grandpa` crate, + // but in the end it is only used to find GHOST, which we don't care about. The only thing + // that we care about is that the justification target has enough weight + cumulative_weight = cumulative_weight.checked_add(authority_info.weight().0.into()).expect( + "sum of weights of ALL authorities is expected not to overflow - this is guaranteed by\ + existence of VoterSet;\ + the order of loop conditions guarantees that we can account vote from same authority\ + multiple times;\ + thus we'll never overflow the u64::MAX;\ + qed", + ); + + // verify authority signature + if !sp_consensus_grandpa::check_message_signature_with_buffer( + &finality_grandpa::Message::Precommit(signed.precommit.clone()), + &signed.id, + &signed.signature, + justification.round, + authorities_set_id, + &mut signature_buffer, + ) { + return Err(Error::InvalidAuthoritySignature) + } + } + + // check that there are no extra headers in the justification + if !chain.unvisited.is_empty() { + return Err(Error::ExtraHeadersInVotesAncestries) + } + + // check that the cumulative weight of validators voted for the justification target (or one + // of its descendents) is larger than required threshold. + if cumulative_weight >= threshold { + Ok(()) + } else { + Err(Error::TooLowCumulativeWeight) + } +} + +/// Votes ancestries with useful methods. +#[derive(RuntimeDebug)] +pub struct AncestryChain { + /// Header hash => parent header hash mapping. + pub parents: BTreeMap, + /// Hashes of headers that were not visited by `is_ancestor` method. + pub unvisited: BTreeSet, +} + +impl AncestryChain
{ + /// Create new ancestry chain. + pub fn new(ancestry: &[Header]) -> AncestryChain
{ + let mut parents = BTreeMap::new(); + let mut unvisited = BTreeSet::new(); + for ancestor in ancestry { + let hash = ancestor.hash(); + let parent_hash = *ancestor.parent_hash(); + parents.insert(hash, parent_hash); + unvisited.insert(hash); + } + AncestryChain { parents, unvisited } + } + + /// Returns `Ok(_)` if `precommit_target` is a descendant of the `commit_target` block and + /// `Err(_)` otherwise. + pub fn ensure_descendant( + mut self, + commit_target: &Header::Hash, + precommit_target: &Header::Hash, + ) -> Result { + let mut current_hash = *precommit_target; + loop { + if current_hash == *commit_target { + break + } + + let is_visited_before = !self.unvisited.remove(¤t_hash); + current_hash = match self.parents.get(¤t_hash) { + Some(parent_hash) => { + if is_visited_before { + // `Some(parent_hash)` means that the `current_hash` is in the `parents` + // container `is_visited_before` means that it has been visited before in + // some of previous calls => since we assume that previous call has finished + // with `true`, this also will be finished with `true` + return Ok(self) + } + + *parent_hash + }, + None => return Err(Error::PrecommitIsNotCommitDescendant), + }; + } + Ok(self) + } +} diff --git a/bridges/primitives/header-chain/src/lib.rs b/bridges/primitives/header-chain/src/lib.rs new file mode 100644 index 00000000000..5e2bbad242e --- /dev/null +++ b/bridges/primitives/header-chain/src/lib.rs @@ -0,0 +1,227 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Defines traits which represent a common interface for Substrate pallets which want to +//! incorporate bridge functionality. + +#![cfg_attr(not(feature = "std"), no_std)] + +use bp_runtime::{ + BasicOperatingMode, Chain, HashOf, HasherOf, HeaderOf, RawStorageProof, StorageProofChecker, + StorageProofError, +}; +use codec::{Codec, Decode, Encode, EncodeLike, MaxEncodedLen}; +use core::{clone::Clone, cmp::Eq, default::Default, fmt::Debug}; +use frame_support::PalletError; +use scale_info::TypeInfo; +#[cfg(feature = "std")] +use serde::{Deserialize, Serialize}; +use sp_consensus_grandpa::{AuthorityList, ConsensusLog, SetId, GRANDPA_ENGINE_ID}; +use sp_runtime::{traits::Header as HeaderT, Digest, RuntimeDebug}; +use sp_std::boxed::Box; + +pub mod justification; +pub mod storage_keys; + +/// Header chain error. +#[derive(Clone, Decode, Encode, Eq, PartialEq, PalletError, Debug, TypeInfo)] +pub enum HeaderChainError { + /// Header with given hash is missing from the chain. + UnknownHeader, + /// Storage proof related error. + StorageProof(StorageProofError), +} + +/// Header data that we're storing on-chain. +/// +/// Even though we may store full header, our applications (XCM) only use couple of header +/// fields. Extracting those values makes on-chain storage and PoV smaller, which is good. +#[derive(Clone, Decode, Encode, Eq, MaxEncodedLen, PartialEq, RuntimeDebug, TypeInfo)] +pub struct StoredHeaderData { + /// Header number. + pub number: Number, + /// Header state root. + pub state_root: Hash, +} + +/// Stored header data builder. +pub trait StoredHeaderDataBuilder { + /// Build header data from self. + fn build(&self) -> StoredHeaderData; +} + +impl StoredHeaderDataBuilder for H { + fn build(&self) -> StoredHeaderData { + StoredHeaderData { number: *self.number(), state_root: *self.state_root() } + } +} + +/// Substrate header chain, abstracted from the way it is stored. +pub trait HeaderChain { + /// Returns state (storage) root of given finalized header. + fn finalized_header_state_root(header_hash: HashOf) -> Option>; + /// Parse storage proof using finalized header. + fn parse_finalized_storage_proof( + header_hash: HashOf, + storage_proof: RawStorageProof, + parse: impl FnOnce(StorageProofChecker>) -> R, + ) -> Result { + let state_root = Self::finalized_header_state_root(header_hash) + .ok_or(HeaderChainError::UnknownHeader)?; + let storage_proof_checker = bp_runtime::StorageProofChecker::new(state_root, storage_proof) + .map_err(HeaderChainError::StorageProof)?; + + Ok(parse(storage_proof_checker)) + } +} + +/// A type that can be used as a parameter in a dispatchable function. +/// +/// When using `decl_module` all arguments for call functions must implement this trait. +pub trait Parameter: Codec + EncodeLike + Clone + Eq + Debug + TypeInfo {} +impl Parameter for T where T: Codec + EncodeLike + Clone + Eq + Debug + TypeInfo {} + +/// A GRANDPA Authority List and ID. +#[derive(Default, Encode, Eq, Decode, RuntimeDebug, PartialEq, Clone, TypeInfo)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct AuthoritySet { + /// List of GRANDPA authorities for the current round. + pub authorities: AuthorityList, + /// Monotonic identifier of the current GRANDPA authority set. + pub set_id: SetId, +} + +impl AuthoritySet { + /// Create a new GRANDPA Authority Set. + pub fn new(authorities: AuthorityList, set_id: SetId) -> Self { + Self { authorities, set_id } + } +} + +/// Data required for initializing the GRANDPA bridge pallet. +/// +/// The bridge needs to know where to start its sync from, and this provides that initial context. +#[derive(Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, Clone, TypeInfo)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct InitializationData { + /// The header from which we should start syncing. + pub header: Box, + /// The initial authorities of the pallet. + pub authority_list: AuthorityList, + /// The ID of the initial authority set. + pub set_id: SetId, + /// Pallet operating mode. + pub operating_mode: BasicOperatingMode, +} + +/// Abstract finality proof that is justifying block finality. +pub trait FinalityProof: Clone + Send + Sync + Debug { + /// Return number of header that this proof is generated for. + fn target_header_number(&self) -> Number; +} + +/// A trait that provides helper methods for querying the consensus log. +pub trait ConsensusLogReader { + /// Returns true if digest contains item that schedules authorities set change. + fn schedules_authorities_change(digest: &Digest) -> bool; +} + +/// A struct that provides helper methods for querying the GRANDPA consensus log. +pub struct GrandpaConsensusLogReader(sp_std::marker::PhantomData); + +impl GrandpaConsensusLogReader { + pub fn find_authorities_change( + digest: &Digest, + ) -> Option> { + // find the first consensus digest with the right ID which converts to + // the right kind of consensus log. + digest + .convert_first(|log| log.consensus_try_to(&GRANDPA_ENGINE_ID)) + .and_then(|log| match log { + ConsensusLog::ScheduledChange(change) => Some(change), + _ => None, + }) + } +} + +impl ConsensusLogReader for GrandpaConsensusLogReader { + fn schedules_authorities_change(digest: &Digest) -> bool { + GrandpaConsensusLogReader::::find_authorities_change(digest).is_some() + } +} + +/// A minimized version of `pallet-bridge-grandpa::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum BridgeGrandpaCall { + /// `pallet-bridge-grandpa::Call::submit_finality_proof` + #[codec(index = 0)] + submit_finality_proof { + finality_target: Box
, + justification: justification::GrandpaJustification
, + }, + /// `pallet-bridge-grandpa::Call::initialize` + #[codec(index = 1)] + initialize { init_data: InitializationData
}, +} + +/// The `BridgeGrandpaCall` used by a chain. +pub type BridgeGrandpaCallOf = BridgeGrandpaCall>; + +/// Substrate-based chain that is using direct GRANDPA finality. +/// +/// Keep in mind that parachains are relying on relay chain GRANDPA, so they should not implement +/// this trait. +pub trait ChainWithGrandpa: Chain { + /// Name of the bridge GRANDPA pallet (used in `construct_runtime` macro call) that is deployed + /// at some other chain to bridge with this `ChainWithGrandpa`. + /// + /// We assume that all chains that are bridging with this `ChainWithGrandpa` are using + /// the same name. + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str; + + /// Max number of GRANDPA authorities at the chain. + /// + /// This is a strict constant. If bridged chain will have more authorities than that, + /// the GRANDPA bridge pallet may halt. + const MAX_AUTHORITIES_COUNT: u32; + + /// Max reasonable number of headers in `votes_ancestries` vector of the GRANDPA justification. + /// + /// This isn't a strict limit. The relay may submit justifications with more headers in its + /// ancestry and the pallet will accept such justification. The limit is only used to compute + /// maximal refund amount and submitting justifications which exceed the limit, may be costly + /// to submitter. + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32; + + /// Maximal size of the chain header. The header may be the header that enacts new GRANDPA + /// authorities set (so it has large digest inside). + /// + /// This isn't a strict limit. The relay may submit larger headers and the pallet will accept + /// the call. The limit is only used to compute maximal refund amount and doing calls which + /// exceed the limit, may be costly to submitter. + const MAX_HEADER_SIZE: u32; + + /// Average size of the chain header from justification ancestry. We don't expect to see there + /// headers that change GRANDPA authorities set (GRANDPA will probably be able to finalize at + /// least one additional header per session on non test chains), so this is average size of + /// headers that aren't changing the set. + /// + /// This isn't a strict limit. The relay may submit justifications with larger headers in its + /// ancestry and the pallet will accept the call. The limit is only used to compute maximal + /// refund amount and doing calls which exceed the limit, may be costly to submitter. + const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32; +} diff --git a/bridges/primitives/header-chain/src/storage_keys.rs b/bridges/primitives/header-chain/src/storage_keys.rs new file mode 100644 index 00000000000..c4dbe53bd9a --- /dev/null +++ b/bridges/primitives/header-chain/src/storage_keys.rs @@ -0,0 +1,104 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Storage keys of bridge GRANDPA pallet. + +/// Name of the `IsHalted` storage value. +pub const PALLET_OPERATING_MODE_VALUE_NAME: &str = "PalletOperatingMode"; +/// Name of the `BestFinalized` storage value. +pub const BEST_FINALIZED_VALUE_NAME: &str = "BestFinalized"; +/// Name of the `CurrentAuthoritySet` storage value. +pub const CURRENT_AUTHORITY_SET_VALUE_NAME: &str = "CurrentAuthoritySet"; + +use sp_core::storage::StorageKey; + +/// Storage key of the `PalletOperatingMode` variable in the runtime storage. +pub fn pallet_operating_mode_key(pallet_prefix: &str) -> StorageKey { + StorageKey( + bp_runtime::storage_value_final_key( + pallet_prefix.as_bytes(), + PALLET_OPERATING_MODE_VALUE_NAME.as_bytes(), + ) + .to_vec(), + ) +} + +/// Storage key of the `CurrentAuthoritySet` variable in the runtime storage. +pub fn current_authority_set_key(pallet_prefix: &str) -> StorageKey { + StorageKey( + bp_runtime::storage_value_final_key( + pallet_prefix.as_bytes(), + CURRENT_AUTHORITY_SET_VALUE_NAME.as_bytes(), + ) + .to_vec(), + ) +} + +/// Storage key of the best finalized header number and hash value in the runtime storage. +pub fn best_finalized_key(pallet_prefix: &str) -> StorageKey { + StorageKey( + bp_runtime::storage_value_final_key( + pallet_prefix.as_bytes(), + BEST_FINALIZED_VALUE_NAME.as_bytes(), + ) + .to_vec(), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use hex_literal::hex; + + #[test] + fn pallet_operating_mode_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // compatibility with previous pallet. + let storage_key = pallet_operating_mode_key("BridgeGrandpa").0; + assert_eq!( + storage_key, + hex!("0b06f475eddb98cf933a12262e0388de0f4cf0917788d791142ff6c1f216e7b3").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } + + #[test] + fn current_authority_set_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // compatibility with previous pallet. + let storage_key = current_authority_set_key("BridgeGrandpa").0; + assert_eq!( + storage_key, + hex!("0b06f475eddb98cf933a12262e0388de24a7b8b5717ea33346fa595a66ccbcb0").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } + + #[test] + fn best_finalized_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // compatibility with previous pallet. + let storage_key = best_finalized_key("BridgeGrandpa").0; + assert_eq!( + storage_key, + hex!("0b06f475eddb98cf933a12262e0388dea4ebafdd473c549fdb24c5c991c5591c").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } +} diff --git a/bridges/primitives/header-chain/tests/implementation_match.rs b/bridges/primitives/header-chain/tests/implementation_match.rs new file mode 100644 index 00000000000..c70683b173d --- /dev/null +++ b/bridges/primitives/header-chain/tests/implementation_match.rs @@ -0,0 +1,418 @@ +// Copyright 2020-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Tests inside this module are made to ensure that our custom justification verification +//! implementation works similar to the [`finality_grandpa::validate_commit`] and explicitly +//! show where we behave different. +//! +//! Some of tests in this module may partially duplicate tests from `justification.rs`, +//! but their purpose is different. + +use bp_header_chain::justification::{verify_justification, Error, GrandpaJustification}; +use bp_test_utils::{ + header_id, make_justification_for_header, signed_precommit, test_header, Account, + JustificationGeneratorParams, ALICE, BOB, CHARLIE, DAVE, EVE, FERDIE, TEST_GRANDPA_SET_ID, +}; +use finality_grandpa::voter_set::VoterSet; +use sp_consensus_grandpa::{AuthorityId, AuthorityWeight}; +use sp_runtime::traits::Header as HeaderT; + +type TestHeader = sp_runtime::testing::Header; +type TestHash = ::Hash; +type TestNumber = ::Number; + +/// Implementation of `finality_grandpa::Chain` that is used in tests. +struct AncestryChain(bp_header_chain::justification::AncestryChain); + +impl AncestryChain { + fn new(ancestry: &[TestHeader]) -> Self { + Self(bp_header_chain::justification::AncestryChain::new(ancestry)) + } +} + +impl finality_grandpa::Chain for AncestryChain { + fn ancestry( + &self, + base: TestHash, + block: TestHash, + ) -> Result, finality_grandpa::Error> { + let mut route = Vec::new(); + let mut current_hash = block; + loop { + if current_hash == base { + break + } + match self.0.parents.get(¤t_hash).cloned() { + Some(parent_hash) => { + current_hash = parent_hash; + route.push(current_hash); + }, + _ => return Err(finality_grandpa::Error::NotDescendent), + } + } + route.pop(); // remove the base + + Ok(route) + } +} + +/// Get a full set of accounts. +fn full_accounts_set() -> Vec<(Account, AuthorityWeight)> { + vec![(ALICE, 1), (BOB, 1), (CHARLIE, 1), (DAVE, 1), (EVE, 1)] +} + +/// Get a full set of GRANDPA authorities. +fn full_voter_set() -> VoterSet { + VoterSet::new(full_accounts_set().iter().map(|(id, w)| (AuthorityId::from(*id), *w))).unwrap() +} + +/// Get a minimal set of accounts. +fn minimal_accounts_set() -> Vec<(Account, AuthorityWeight)> { + // there are 5 accounts in the full set => we need 2/3 + 1 accounts, which results in 4 accounts + vec![(ALICE, 1), (BOB, 1), (CHARLIE, 1), (DAVE, 1)] +} + +/// Get a minimal subset of GRANDPA authorities that have enough cumulative vote weight to justify a +/// header finality. +pub fn minimal_voter_set() -> VoterSet { + VoterSet::new(minimal_accounts_set().iter().map(|(id, w)| (AuthorityId::from(*id), *w))) + .unwrap() +} + +/// Make a valid GRANDPA justification with sensible defaults. +pub fn make_default_justification(header: &TestHeader) -> GrandpaJustification { + make_justification_for_header(JustificationGeneratorParams { + header: header.clone(), + authorities: minimal_accounts_set(), + ..Default::default() + }) +} + +// the `finality_grandpa::validate_commit` function has two ways to report an unsuccessful +// commit validation: +// +// 1) to return `Err()` (which only may happen if `finality_grandpa::Chain` implementation +// returns an error); +// 2) to return `Ok(validation_result)` if `validation_result.is_valid()` is false. +// +// Our implementation would just return error in both cases. + +#[test] +fn same_result_when_precommit_target_has_lower_number_than_commit_target() { + let mut justification = make_default_justification(&test_header(1)); + // the number of header in precommit (0) is lower than number of header in commit (1) + justification.commit.precommits[0].precommit.target_number = 0; + + // our implementation returns an error + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &full_voter_set(), + &justification, + ), + Err(Error::PrecommitIsNotCommitDescendant), + ); + + // original implementation returns `Ok(validation_result)` + // with `validation_result.is_valid() == false`. + let result = finality_grandpa::validate_commit( + &justification.commit, + &full_voter_set(), + &AncestryChain::new(&justification.votes_ancestries), + ) + .unwrap(); + + assert!(!result.is_valid()); +} + +#[test] +fn same_result_when_precommit_target_is_not_descendant_of_commit_target() { + let not_descendant = test_header::(10); + let mut justification = make_default_justification(&test_header(1)); + // the route from header of commit (1) to header of precommit (10) is missing from + // the votes ancestries + justification.commit.precommits[0].precommit.target_number = *not_descendant.number(); + justification.commit.precommits[0].precommit.target_hash = not_descendant.hash(); + justification.votes_ancestries.push(not_descendant); + + // our implementation returns an error + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &full_voter_set(), + &justification, + ), + Err(Error::PrecommitIsNotCommitDescendant), + ); + + // original implementation returns `Ok(validation_result)` + // with `validation_result.is_valid() == false`. + let result = finality_grandpa::validate_commit( + &justification.commit, + &full_voter_set(), + &AncestryChain::new(&justification.votes_ancestries), + ) + .unwrap(); + + assert!(!result.is_valid()); +} + +#[test] +fn same_result_when_there_are_not_enough_cumulative_weight_to_finalize_commit_target() { + // just remove one authority from the minimal set and we shall not reach the threshold + let mut authorities_set = minimal_accounts_set(); + authorities_set.pop(); + let justification = make_justification_for_header(JustificationGeneratorParams { + header: test_header(1), + authorities: authorities_set, + ..Default::default() + }); + + // our implementation returns an error + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &full_voter_set(), + &justification, + ), + Err(Error::TooLowCumulativeWeight), + ); + // original implementation returns `Ok(validation_result)` + // with `validation_result.is_valid() == false`. + let result = finality_grandpa::validate_commit( + &justification.commit, + &full_voter_set(), + &AncestryChain::new(&justification.votes_ancestries), + ) + .unwrap(); + + assert!(!result.is_valid()); +} + +// tests below are our differences with the original implementation + +#[test] +fn different_result_when_justification_contains_duplicate_vote() { + let mut justification = make_justification_for_header(JustificationGeneratorParams { + header: test_header(1), + authorities: minimal_accounts_set(), + ancestors: 0, + ..Default::default() + }); + // the justification may contain exactly the same vote (i.e. same precommit and same signature) + // multiple times && it isn't treated as an error by original implementation + let last_precommit = justification.commit.precommits.pop().unwrap(); + justification.commit.precommits.push(justification.commit.precommits[0].clone()); + justification.commit.precommits.push(last_precommit); + + // our implementation fails + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &full_voter_set(), + &justification, + ), + Err(Error::DuplicateAuthorityVote), + ); + // original implementation returns `Ok(validation_result)` + // with `validation_result.is_valid() == true`. + let result = finality_grandpa::validate_commit( + &justification.commit, + &full_voter_set(), + &AncestryChain::new(&justification.votes_ancestries), + ) + .unwrap(); + + assert!(result.is_valid()); +} + +#[test] +fn different_results_when_authority_equivocates_once_in_a_round() { + let mut justification = make_justification_for_header(JustificationGeneratorParams { + header: test_header(1), + authorities: minimal_accounts_set(), + ancestors: 0, + ..Default::default() + }); + // the justification original implementation allows authority to submit two different + // votes in a single round, of which only first is 'accepted' + let last_precommit = justification.commit.precommits.pop().unwrap(); + justification.commit.precommits.push(signed_precommit::( + &ALICE, + header_id::(1), + justification.round, + TEST_GRANDPA_SET_ID, + )); + justification.commit.precommits.push(last_precommit); + + // our implementation fails + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &full_voter_set(), + &justification, + ), + Err(Error::DuplicateAuthorityVote), + ); + // original implementation returns `Ok(validation_result)` + // with `validation_result.is_valid() == true`. + let result = finality_grandpa::validate_commit( + &justification.commit, + &full_voter_set(), + &AncestryChain::new(&justification.votes_ancestries), + ) + .unwrap(); + + assert!(result.is_valid()); +} + +#[test] +fn different_results_when_authority_equivocates_twice_in_a_round() { + let mut justification = make_justification_for_header(JustificationGeneratorParams { + header: test_header(1), + authorities: minimal_accounts_set(), + ancestors: 0, + ..Default::default() + }); + // there's some code in the original implementation that should return an error when + // same authority submits more than two different votes in a single round: + // https://github.com/paritytech/finality-grandpa/blob/6aeea2d1159d0f418f0b86e70739f2130629ca09/src/lib.rs#L473 + // but there's also a code that prevents this from happening: + // https://github.com/paritytech/finality-grandpa/blob/6aeea2d1159d0f418f0b86e70739f2130629ca09/src/round.rs#L287 + // => so now we are also just ignoring all votes from the same authority, except the first one + let last_precommit = justification.commit.precommits.pop().unwrap(); + let prev_last_precommit = justification.commit.precommits.pop().unwrap(); + justification.commit.precommits.push(signed_precommit::( + &ALICE, + header_id::(1), + justification.round, + TEST_GRANDPA_SET_ID, + )); + justification.commit.precommits.push(signed_precommit::( + &ALICE, + header_id::(1), + justification.round, + TEST_GRANDPA_SET_ID, + )); + justification.commit.precommits.push(last_precommit); + justification.commit.precommits.push(prev_last_precommit); + + // our implementation fails + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &full_voter_set(), + &justification, + ), + Err(Error::DuplicateAuthorityVote), + ); + // original implementation returns `Ok(validation_result)` + // with `validation_result.is_valid() == true`. + let result = finality_grandpa::validate_commit( + &justification.commit, + &full_voter_set(), + &AncestryChain::new(&justification.votes_ancestries), + ) + .unwrap(); + + assert!(result.is_valid()); +} + +#[test] +fn different_results_when_there_are_more_than_enough_votes() { + let mut justification = make_justification_for_header(JustificationGeneratorParams { + header: test_header(1), + authorities: minimal_accounts_set(), + ancestors: 0, + ..Default::default() + }); + // the reference implementation just keep verifying signatures even if we have + // collected enough votes. We are not + justification.commit.precommits.push(signed_precommit::( + &EVE, + header_id::(1), + justification.round, + TEST_GRANDPA_SET_ID, + )); + + // our implementation fails + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &full_voter_set(), + &justification, + ), + Err(Error::RedundantVotesInJustification), + ); + // original implementation returns `Ok(validation_result)` + // with `validation_result.is_valid() == true`. + let result = finality_grandpa::validate_commit( + &justification.commit, + &full_voter_set(), + &AncestryChain::new(&justification.votes_ancestries), + ) + .unwrap(); + + assert!(result.is_valid()); +} + +#[test] +fn different_results_when_there_is_a_vote_of_unknown_authority() { + let mut justification = make_justification_for_header(JustificationGeneratorParams { + header: test_header(1), + authorities: minimal_accounts_set(), + ancestors: 0, + ..Default::default() + }); + // the reference implementation just keep verifying signatures even if we have + // collected enough votes. We are not + let last_precommit = justification.commit.precommits.pop().unwrap(); + justification.commit.precommits.push(signed_precommit::( + &FERDIE, + header_id::(1), + justification.round, + TEST_GRANDPA_SET_ID, + )); + justification.commit.precommits.push(last_precommit); + + // our implementation fails + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &full_voter_set(), + &justification, + ), + Err(Error::UnknownAuthorityVote), + ); + // original implementation returns `Ok(validation_result)` + // with `validation_result.is_valid() == true`. + let result = finality_grandpa::validate_commit( + &justification.commit, + &full_voter_set(), + &AncestryChain::new(&justification.votes_ancestries), + ) + .unwrap(); + + assert!(result.is_valid()); +} diff --git a/bridges/primitives/header-chain/tests/justification.rs b/bridges/primitives/header-chain/tests/justification.rs new file mode 100644 index 00000000000..3cd63b935d0 --- /dev/null +++ b/bridges/primitives/header-chain/tests/justification.rs @@ -0,0 +1,280 @@ +// Copyright 2020-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Tests for Grandpa Justification code. + +use bp_header_chain::justification::{ + required_justification_precommits, verify_and_optimize_justification, verify_justification, + Error, +}; +use bp_test_utils::*; + +type TestHeader = sp_runtime::testing::Header; + +#[test] +fn valid_justification_accepted() { + let authorities = vec![(ALICE, 1), (BOB, 1), (CHARLIE, 1)]; + let params = JustificationGeneratorParams { + header: test_header(1), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: authorities.clone(), + ancestors: 7, + forks: 3, + }; + + let justification = make_justification_for_header::(params.clone()); + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &voter_set(), + &justification, + ), + Ok(()), + ); + + assert_eq!(justification.commit.precommits.len(), authorities.len()); + assert_eq!(justification.votes_ancestries.len(), params.ancestors as usize); +} + +#[test] +fn valid_justification_accepted_with_single_fork() { + let params = JustificationGeneratorParams { + header: test_header(1), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: vec![(ALICE, 1), (BOB, 1), (CHARLIE, 1)], + ancestors: 5, + forks: 1, + }; + + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &voter_set(), + &make_justification_for_header::(params) + ), + Ok(()), + ); +} + +#[test] +fn valid_justification_accepted_with_arbitrary_number_of_authorities() { + use finality_grandpa::voter_set::VoterSet; + use sp_consensus_grandpa::AuthorityId; + + let n = 15; + let required_signatures = required_justification_precommits(n as _); + let authorities = accounts(n).iter().map(|k| (*k, 1)).collect::>(); + + let params = JustificationGeneratorParams { + header: test_header(1), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: authorities.clone().into_iter().take(required_signatures as _).collect(), + ancestors: n.into(), + forks: required_signatures, + }; + + let authorities = authorities + .iter() + .map(|(id, w)| (AuthorityId::from(*id), *w)) + .collect::>(); + let voter_set = VoterSet::new(authorities).unwrap(); + + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &voter_set, + &make_justification_for_header::(params) + ), + Ok(()), + ); +} + +#[test] +fn justification_with_invalid_target_rejected() { + assert_eq!( + verify_justification::( + header_id::(2), + TEST_GRANDPA_SET_ID, + &voter_set(), + &make_default_justification::(&test_header(1)), + ), + Err(Error::InvalidJustificationTarget), + ); +} + +#[test] +fn justification_with_invalid_commit_rejected() { + let mut justification = make_default_justification::(&test_header(1)); + justification.commit.precommits.clear(); + + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &voter_set(), + &justification, + ), + Err(Error::ExtraHeadersInVotesAncestries), + ); +} + +#[test] +fn justification_with_invalid_authority_signature_rejected() { + let mut justification = make_default_justification::(&test_header(1)); + justification.commit.precommits[0].signature = + sp_core::crypto::UncheckedFrom::unchecked_from([1u8; 64]); + + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &voter_set(), + &justification, + ), + Err(Error::InvalidAuthoritySignature), + ); +} + +#[test] +fn justification_with_invalid_precommit_ancestry() { + let mut justification = make_default_justification::(&test_header(1)); + justification.votes_ancestries.push(test_header(10)); + + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &voter_set(), + &justification, + ), + Err(Error::ExtraHeadersInVotesAncestries), + ); +} + +#[test] +fn justification_is_invalid_if_we_dont_meet_threshold() { + // Need at least three authorities to sign off or else the voter set threshold can't be reached + let authorities = vec![(ALICE, 1), (BOB, 1)]; + + let params = JustificationGeneratorParams { + header: test_header(1), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: authorities.clone(), + ancestors: 2 * authorities.len() as u32, + forks: 2, + }; + + assert_eq!( + verify_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &voter_set(), + &make_justification_for_header::(params) + ), + Err(Error::TooLowCumulativeWeight), + ); +} + +#[test] +fn optimizer_does_noting_with_minimal_justification() { + let justification = make_default_justification::(&test_header(1)); + + let num_precommits_before = justification.commit.precommits.len(); + let justification = verify_and_optimize_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &voter_set(), + justification, + ) + .unwrap(); + let num_precommits_after = justification.commit.precommits.len(); + + assert_eq!(num_precommits_before, num_precommits_after); +} + +#[test] +fn unknown_authority_votes_are_removed_by_optimizer() { + let mut justification = make_default_justification::(&test_header(1)); + justification.commit.precommits.push(signed_precommit::( + &bp_test_utils::Account(42), + header_id::(1), + justification.round, + TEST_GRANDPA_SET_ID, + )); + + let num_precommits_before = justification.commit.precommits.len(); + let justification = verify_and_optimize_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &voter_set(), + justification, + ) + .unwrap(); + let num_precommits_after = justification.commit.precommits.len(); + + assert_eq!(num_precommits_before - 1, num_precommits_after); +} + +#[test] +fn duplicate_authority_votes_are_removed_by_optimizer() { + let mut justification = make_default_justification::(&test_header(1)); + justification + .commit + .precommits + .push(justification.commit.precommits.first().cloned().unwrap()); + + let num_precommits_before = justification.commit.precommits.len(); + let justification = verify_and_optimize_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &voter_set(), + justification, + ) + .unwrap(); + let num_precommits_after = justification.commit.precommits.len(); + + assert_eq!(num_precommits_before - 1, num_precommits_after); +} + +#[test] +fn redundant_authority_votes_are_removed_by_optimizer() { + let mut justification = make_default_justification::(&test_header(1)); + justification.commit.precommits.push(signed_precommit::( + &EVE, + header_id::(1), + justification.round, + TEST_GRANDPA_SET_ID, + )); + + let num_precommits_before = justification.commit.precommits.len(); + let justification = verify_and_optimize_justification::( + header_id::(1), + TEST_GRANDPA_SET_ID, + &voter_set(), + justification, + ) + .unwrap(); + let num_precommits_after = justification.commit.precommits.len(); + + assert_eq!(num_precommits_before - 1, num_precommits_after); +} diff --git a/bridges/primitives/messages/Cargo.toml b/bridges/primitives/messages/Cargo.toml new file mode 100644 index 00000000000..32a89f6cf78 --- /dev/null +++ b/bridges/primitives/messages/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "bp-messages" +description = "Primitives of messages module." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive", "bit-vec"] } +scale-info = { version = "2.6.0", default-features = false, features = ["bit-vec", "derive"] } +serde = { version = "1.0", optional = true, features = ["derive"] } + +# Bridge dependencies + +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[dev-dependencies] +hex = "0.4" +hex-literal = "0.4" + +[features] +default = ["std"] +std = [ + "bp-runtime/std", + "codec/std", + "frame-support/std", + "scale-info/std", + "serde", + "sp-core/std", + "sp-std/std" +] diff --git a/bridges/primitives/messages/src/lib.rs b/bridges/primitives/messages/src/lib.rs new file mode 100644 index 00000000000..e485aa2f801 --- /dev/null +++ b/bridges/primitives/messages/src/lib.rs @@ -0,0 +1,484 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Primitives of messages module. + +#![cfg_attr(not(feature = "std"), no_std)] +// RuntimeApi generated functions +#![allow(clippy::too_many_arguments)] + +use bp_runtime::{BasicOperatingMode, OperatingMode, RangeInclusiveExt}; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::RuntimeDebug; +use scale_info::TypeInfo; +use source_chain::RelayersRewards; +use sp_core::TypeId; +use sp_std::{collections::vec_deque::VecDeque, ops::RangeInclusive, prelude::*}; + +pub mod source_chain; +pub mod storage_keys; +pub mod target_chain; + +use bp_runtime::messages::MessageDispatchResult; +// Weight is reexported to avoid additional frame-support dependencies in related crates. +pub use frame_support::weights::Weight; + +/// Messages pallet operating mode. +#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +pub enum MessagesOperatingMode { + /// Basic operating mode (Normal/Halted) + Basic(BasicOperatingMode), + /// The pallet is not accepting outbound messages. Inbound messages and receiving proofs + /// are still accepted. + /// + /// This mode may be used e.g. when bridged chain expects upgrade. Then to avoid dispatch + /// failures, the pallet owner may stop accepting new messages, while continuing to deliver + /// queued messages to the bridged chain. Once upgrade is completed, the mode may be switched + /// back to `Normal`. + RejectingOutboundMessages, +} + +impl Default for MessagesOperatingMode { + fn default() -> Self { + MessagesOperatingMode::Basic(BasicOperatingMode::Normal) + } +} + +impl OperatingMode for MessagesOperatingMode { + fn is_halted(&self) -> bool { + match self { + Self::Basic(operating_mode) => operating_mode.is_halted(), + _ => false, + } + } +} + +/// Lane id which implements `TypeId`. +#[derive( + Clone, Copy, Decode, Default, Encode, Eq, Ord, PartialOrd, PartialEq, TypeInfo, MaxEncodedLen, +)] +pub struct LaneId(pub [u8; 4]); + +impl core::fmt::Debug for LaneId { + fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { + self.0.fmt(fmt) + } +} + +impl AsRef<[u8]> for LaneId { + fn as_ref(&self) -> &[u8] { + &self.0 + } +} + +impl TypeId for LaneId { + const TYPE_ID: [u8; 4] = *b"blan"; +} + +/// Message nonce. Valid messages will never have 0 nonce. +pub type MessageNonce = u64; + +/// Message id as a tuple. +pub type BridgeMessageId = (LaneId, MessageNonce); + +/// Opaque message payload. We only decode this payload when it is dispatched. +pub type MessagePayload = Vec; + +/// Message key (unique message identifier) as it is stored in the storage. +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub struct MessageKey { + /// ID of the message lane. + pub lane_id: LaneId, + /// Message nonce. + pub nonce: MessageNonce, +} + +/// Message as it is stored in the storage. +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] +pub struct Message { + /// Message key. + pub key: MessageKey, + /// Message payload. + pub payload: MessagePayload, +} + +/// Inbound lane data. +#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct InboundLaneData { + /// Identifiers of relayers and messages that they have delivered to this lane (ordered by + /// message nonce). + /// + /// This serves as a helper storage item, to allow the source chain to easily pay rewards + /// to the relayers who successfully delivered messages to the target chain (inbound lane). + /// + /// It is guaranteed to have at most N entries, where N is configured at the module level. + /// If there are N entries in this vec, then: + /// 1) all incoming messages are rejected if they're missing corresponding + /// `proof-of(outbound-lane.state)`; 2) all incoming messages are rejected if + /// `proof-of(outbound-lane.state).last_delivered_nonce` is equal to + /// `self.last_confirmed_nonce`. Given what is said above, all nonces in this queue are in + /// range: `(self.last_confirmed_nonce; self.last_delivered_nonce()]`. + /// + /// When a relayer sends a single message, both of MessageNonces are the same. + /// When relayer sends messages in a batch, the first arg is the lowest nonce, second arg the + /// highest nonce. Multiple dispatches from the same relayer are allowed. + pub relayers: VecDeque>, + + /// Nonce of the last message that + /// a) has been delivered to the target (this) chain and + /// b) the delivery has been confirmed on the source chain + /// + /// that the target chain knows of. + /// + /// This value is updated indirectly when an `OutboundLane` state of the source + /// chain is received alongside with new messages delivery. + pub last_confirmed_nonce: MessageNonce, +} + +impl Default for InboundLaneData { + fn default() -> Self { + InboundLaneData { relayers: VecDeque::new(), last_confirmed_nonce: 0 } + } +} + +impl InboundLaneData { + /// Returns approximate size of the struct, given a number of entries in the `relayers` set and + /// size of each entry. + /// + /// Returns `None` if size overflows `usize` limits. + pub fn encoded_size_hint(relayers_entries: usize) -> Option + where + RelayerId: MaxEncodedLen, + { + relayers_entries + .checked_mul(UnrewardedRelayer::::max_encoded_len())? + .checked_add(MessageNonce::max_encoded_len()) + } + + /// Returns the approximate size of the struct as u32, given a number of entries in the + /// `relayers` set and the size of each entry. + /// + /// Returns `u32::MAX` if size overflows `u32` limits. + pub fn encoded_size_hint_u32(relayers_entries: usize) -> u32 + where + RelayerId: MaxEncodedLen, + { + Self::encoded_size_hint(relayers_entries) + .and_then(|x| u32::try_from(x).ok()) + .unwrap_or(u32::MAX) + } + + /// Nonce of the last message that has been delivered to this (target) chain. + pub fn last_delivered_nonce(&self) -> MessageNonce { + self.relayers + .back() + .map(|entry| entry.messages.end) + .unwrap_or(self.last_confirmed_nonce) + } +} + +/// Outbound message details, returned by runtime APIs. +#[derive(Clone, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct OutboundMessageDetails { + /// Nonce assigned to the message. + pub nonce: MessageNonce, + /// Message dispatch weight. + /// + /// Depending on messages pallet configuration, it may be declared by the message submitter, + /// computed automatically or just be zero if dispatch fee is paid at the target chain. + pub dispatch_weight: Weight, + /// Size of the encoded message. + pub size: u32, +} + +/// Inbound message details, returned by runtime APIs. +#[derive(Clone, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct InboundMessageDetails { + /// Computed message dispatch weight. + /// + /// Runtime API guarantees that it will match the value, returned by + /// `target_chain::MessageDispatch::dispatch_weight`. This means that if the runtime + /// has failed to decode the message, it will be zero - that's because `undecodable` + /// message cannot be dispatched. + pub dispatch_weight: Weight, +} + +/// Unrewarded relayer entry stored in the inbound lane data. +/// +/// This struct represents a continuous range of messages that have been delivered by the same +/// relayer and whose confirmations are still pending. +#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo, MaxEncodedLen)] +pub struct UnrewardedRelayer { + /// Identifier of the relayer. + pub relayer: RelayerId, + /// Messages range, delivered by this relayer. + pub messages: DeliveredMessages, +} + +/// Received messages with their dispatch result. +#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct ReceivedMessages { + /// Id of the lane which is receiving messages. + pub lane: LaneId, + /// Result of messages which we tried to dispatch + pub receive_results: Vec<(MessageNonce, ReceivalResult)>, +} + +impl ReceivedMessages { + pub fn new( + lane: LaneId, + receive_results: Vec<(MessageNonce, ReceivalResult)>, + ) -> Self { + ReceivedMessages { lane, receive_results } + } + + pub fn push(&mut self, message: MessageNonce, result: ReceivalResult) { + self.receive_results.push((message, result)); + } +} + +/// Result of single message receival. +#[derive(RuntimeDebug, Encode, Decode, PartialEq, Eq, Clone, TypeInfo)] +pub enum ReceivalResult { + /// Message has been received and dispatched. Note that we don't care whether dispatch has + /// been successful or not - in both case message falls into this category. + /// + /// The message dispatch result is also returned. + Dispatched(MessageDispatchResult), + /// Message has invalid nonce and lane has rejected to accept this message. + InvalidNonce, + /// There are too many unrewarded relayer entries at the lane. + TooManyUnrewardedRelayers, + /// There are too many unconfirmed messages at the lane. + TooManyUnconfirmedMessages, +} + +/// Delivered messages with their dispatch result. +#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo, MaxEncodedLen)] +pub struct DeliveredMessages { + /// Nonce of the first message that has been delivered (inclusive). + pub begin: MessageNonce, + /// Nonce of the last message that has been delivered (inclusive). + pub end: MessageNonce, +} + +impl DeliveredMessages { + /// Create new `DeliveredMessages` struct that confirms delivery of single nonce with given + /// dispatch result. + pub fn new(nonce: MessageNonce) -> Self { + DeliveredMessages { begin: nonce, end: nonce } + } + + /// Return total count of delivered messages. + pub fn total_messages(&self) -> MessageNonce { + (self.begin..=self.end).checked_len().unwrap_or(0) + } + + /// Note new dispatched message. + pub fn note_dispatched_message(&mut self) { + self.end += 1; + } + + /// Returns true if delivered messages contain message with given nonce. + pub fn contains_message(&self, nonce: MessageNonce) -> bool { + (self.begin..=self.end).contains(&nonce) + } +} + +/// Gist of `InboundLaneData::relayers` field used by runtime APIs. +#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct UnrewardedRelayersState { + /// Number of entries in the `InboundLaneData::relayers` set. + pub unrewarded_relayer_entries: MessageNonce, + /// Number of messages in the oldest entry of `InboundLaneData::relayers`. This is the + /// minimal number of reward proofs required to push out this entry from the set. + pub messages_in_oldest_entry: MessageNonce, + /// Total number of messages in the relayers vector. + pub total_messages: MessageNonce, + /// Nonce of the latest message that has been delivered to the target chain. + /// + /// This corresponds to the result of the `InboundLaneData::last_delivered_nonce` call + /// at the bridged chain. + pub last_delivered_nonce: MessageNonce, +} + +impl From<&InboundLaneData> for UnrewardedRelayersState { + fn from(lane: &InboundLaneData) -> UnrewardedRelayersState { + UnrewardedRelayersState { + unrewarded_relayer_entries: lane.relayers.len() as _, + messages_in_oldest_entry: lane + .relayers + .front() + .and_then(|entry| (entry.messages.begin..=entry.messages.end).checked_len()) + .unwrap_or(0), + total_messages: total_unrewarded_messages(&lane.relayers).unwrap_or(MessageNonce::MAX), + last_delivered_nonce: lane.last_delivered_nonce(), + } + } +} + +/// Outbound lane data. +#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo, MaxEncodedLen)] +pub struct OutboundLaneData { + /// Nonce of the oldest message that we haven't yet pruned. May point to not-yet-generated + /// message if all sent messages are already pruned. + pub oldest_unpruned_nonce: MessageNonce, + /// Nonce of the latest message, received by bridged chain. + pub latest_received_nonce: MessageNonce, + /// Nonce of the latest message, generated by us. + pub latest_generated_nonce: MessageNonce, +} + +impl Default for OutboundLaneData { + fn default() -> Self { + OutboundLaneData { + // it is 1 because we're pruning everything in [oldest_unpruned_nonce; + // latest_received_nonce] + oldest_unpruned_nonce: 1, + latest_received_nonce: 0, + latest_generated_nonce: 0, + } + } +} + +/// Returns total number of messages in the `InboundLaneData::relayers` vector. +/// +/// Returns `None` if there are more messages that `MessageNonce` may fit (i.e. `MessageNonce + 1`). +pub fn total_unrewarded_messages( + relayers: &VecDeque>, +) -> Option { + match (relayers.front(), relayers.back()) { + (Some(front), Some(back)) => { + if let Some(difference) = back.messages.end.checked_sub(front.messages.begin) { + difference.checked_add(1) + } else { + Some(0) + } + }, + _ => Some(0), + } +} + +/// Calculate the number of messages that the relayers have delivered. +pub fn calc_relayers_rewards( + messages_relayers: VecDeque>, + received_range: &RangeInclusive, +) -> RelayersRewards +where + AccountId: sp_std::cmp::Ord, +{ + // remember to reward relayers that have delivered messages + // this loop is bounded by `T::MaxUnrewardedRelayerEntriesAtInboundLane` on the bridged chain + let mut relayers_rewards = RelayersRewards::new(); + for entry in messages_relayers { + let nonce_begin = sp_std::cmp::max(entry.messages.begin, *received_range.start()); + let nonce_end = sp_std::cmp::min(entry.messages.end, *received_range.end()); + if nonce_end >= nonce_begin { + *relayers_rewards.entry(entry.relayer).or_default() += nonce_end - nonce_begin + 1; + } + } + relayers_rewards +} + +/// A minimized version of `pallet-bridge-messages::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum BridgeMessagesCall { + /// `pallet-bridge-messages::Call::receive_messages_proof` + #[codec(index = 2)] + receive_messages_proof { + relayer_id_at_bridged_chain: AccountId, + proof: MessagesProof, + messages_count: u32, + dispatch_weight: Weight, + }, + /// `pallet-bridge-messages::Call::receive_messages_delivery_proof` + #[codec(index = 3)] + receive_messages_delivery_proof { + proof: MessagesDeliveryProof, + relayers_state: UnrewardedRelayersState, + }, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn total_unrewarded_messages_does_not_overflow() { + assert_eq!( + total_unrewarded_messages( + &vec![ + UnrewardedRelayer { relayer: 1, messages: DeliveredMessages::new(0) }, + UnrewardedRelayer { + relayer: 2, + messages: DeliveredMessages::new(MessageNonce::MAX) + }, + ] + .into_iter() + .collect() + ), + None, + ); + } + + #[test] + fn inbound_lane_data_returns_correct_hint() { + let test_cases = vec![ + // single relayer, multiple messages + (1, 128u8), + // multiple relayers, single message per relayer + (128u8, 128u8), + // several messages per relayer + (13u8, 128u8), + ]; + for (relayer_entries, messages_count) in test_cases { + let expected_size = InboundLaneData::::encoded_size_hint(relayer_entries as _); + let actual_size = InboundLaneData { + relayers: (1u8..=relayer_entries) + .map(|i| UnrewardedRelayer { + relayer: i, + messages: DeliveredMessages::new(i as _), + }) + .collect(), + last_confirmed_nonce: messages_count as _, + } + .encode() + .len(); + let difference = (expected_size.unwrap() as f64 - actual_size as f64).abs(); + assert!( + difference / (std::cmp::min(actual_size, expected_size.unwrap()) as f64) < 0.1, + "Too large difference between actual ({actual_size}) and expected ({expected_size:?}) inbound lane data size. Test case: {relayer_entries}+{messages_count}", + ); + } + } + + #[test] + fn contains_result_works() { + let delivered_messages = DeliveredMessages { begin: 100, end: 150 }; + + assert!(!delivered_messages.contains_message(99)); + assert!(delivered_messages.contains_message(100)); + assert!(delivered_messages.contains_message(150)); + assert!(!delivered_messages.contains_message(151)); + } + + #[test] + fn lane_id_debug_format_matches_inner_array_format() { + assert_eq!(format!("{:?}", LaneId([0, 0, 0, 0])), format!("{:?}", [0, 0, 0, 0]),); + } +} diff --git a/bridges/primitives/messages/src/source_chain.rs b/bridges/primitives/messages/src/source_chain.rs new file mode 100644 index 00000000000..394a934171f --- /dev/null +++ b/bridges/primitives/messages/src/source_chain.rs @@ -0,0 +1,211 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Primitives of messages module, that are used on the source chain. + +use crate::{InboundLaneData, LaneId, MessageNonce, OutboundLaneData}; + +use crate::UnrewardedRelayer; +use bp_runtime::Size; +use frame_support::{Parameter, RuntimeDebug}; +use sp_std::{ + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + fmt::Debug, + ops::RangeInclusive, +}; + +/// Number of messages, delivered by relayers. +pub type RelayersRewards = BTreeMap; + +/// Target chain API. Used by source chain to verify target chain proofs. +/// +/// All implementations of this trait should only work with finalized data that +/// can't change. Wrong implementation may lead to invalid lane states (i.e. lane +/// that's stuck) and/or processing messages without paying fees. +/// +/// The `Payload` type here means the payload of the message that is sent from the +/// source chain to the target chain. The `AccountId` type here means the account +/// type used by the source chain. +pub trait TargetHeaderChain { + /// Error type. + type Error: Debug; + + /// Proof that messages have been received by target chain. + type MessagesDeliveryProof: Parameter + Size; + + /// Verify message payload before we accept it. + /// + /// **CAUTION**: this is very important function. Incorrect implementation may lead + /// to stuck lanes and/or relayers loses. + /// + /// The proper implementation must ensure that the delivery-transaction with this + /// payload would (at least) be accepted into target chain transaction pool AND + /// eventually will be successfully mined. The most obvious incorrect implementation + /// example would be implementation for BTC chain that accepts payloads larger than + /// 1MB. BTC nodes aren't accepting transactions that are larger than 1MB, so relayer + /// will be unable to craft valid transaction => this (and all subsequent) messages will + /// never be delivered. + fn verify_message(payload: &Payload) -> Result<(), Self::Error>; + + /// Verify messages delivery proof and return lane && nonce of the latest received message. + fn verify_messages_delivery_proof( + proof: Self::MessagesDeliveryProof, + ) -> Result<(LaneId, InboundLaneData), Self::Error>; +} + +/// Lane message verifier. +/// +/// Runtime developer may implement any additional validation logic over message-lane mechanism. +/// E.g. if lanes should have some security (e.g. you can only accept Lane1 messages from +/// Submitter1, Lane2 messages for those who has submitted first message to this lane, disable +/// Lane3 until some block, ...), then it may be built using this verifier. +/// +/// Any fee requirements should also be enforced here. +pub trait LaneMessageVerifier { + /// Error type. + type Error: Debug + Into<&'static str>; + + /// Verify message payload and return Ok(()) if message is valid and allowed to be sent over the + /// lane. + fn verify_message( + submitter: &SenderOrigin, + lane: &LaneId, + outbound_data: &OutboundLaneData, + payload: &Payload, + ) -> Result<(), Self::Error>; +} + +/// Manages payments that are happening at the source chain during delivery confirmation +/// transaction. +pub trait DeliveryConfirmationPayments { + /// Error type. + type Error: Debug + Into<&'static str>; + + /// Pay rewards for delivering messages to the given relayers. + /// + /// The implementation may also choose to pay reward to the `confirmation_relayer`, which is + /// a relayer that has submitted delivery confirmation transaction. + /// + /// Returns number of actually rewarded relayers. + fn pay_reward( + lane_id: LaneId, + messages_relayers: VecDeque>, + confirmation_relayer: &AccountId, + received_range: &RangeInclusive, + ) -> MessageNonce; +} + +impl DeliveryConfirmationPayments for () { + type Error = &'static str; + + fn pay_reward( + _lane_id: LaneId, + _messages_relayers: VecDeque>, + _confirmation_relayer: &AccountId, + _received_range: &RangeInclusive, + ) -> MessageNonce { + // this implementation is not rewarding relayers at all + 0 + } +} + +/// Send message artifacts. +#[derive(Eq, RuntimeDebug, PartialEq)] +pub struct SendMessageArtifacts { + /// Nonce of the message. + pub nonce: MessageNonce, +} + +/// Messages bridge API to be used from other pallets. +pub trait MessagesBridge { + /// Error type. + type Error: Debug; + + /// Send message over the bridge. + /// + /// Returns unique message nonce or error if send has failed. + fn send_message( + sender: SenderOrigin, + lane: LaneId, + message: Payload, + ) -> Result; +} + +/// Bridge that does nothing when message is being sent. +#[derive(Eq, RuntimeDebug, PartialEq)] +pub struct NoopMessagesBridge; + +impl MessagesBridge for NoopMessagesBridge { + type Error = &'static str; + + fn send_message( + _sender: SenderOrigin, + _lane: LaneId, + _message: Payload, + ) -> Result { + Ok(SendMessageArtifacts { nonce: 0 }) + } +} + +/// Structure that may be used in place of `TargetHeaderChain`, `LaneMessageVerifier` and +/// `MessageDeliveryAndDispatchPayment` on chains, where outbound messages are forbidden. +pub struct ForbidOutboundMessages; + +/// Error message that is used in `ForbidOutboundMessages` implementation. +const ALL_OUTBOUND_MESSAGES_REJECTED: &str = + "This chain is configured to reject all outbound messages"; + +impl TargetHeaderChain for ForbidOutboundMessages { + type Error = &'static str; + + type MessagesDeliveryProof = (); + + fn verify_message(_payload: &Payload) -> Result<(), Self::Error> { + Err(ALL_OUTBOUND_MESSAGES_REJECTED) + } + + fn verify_messages_delivery_proof( + _proof: Self::MessagesDeliveryProof, + ) -> Result<(LaneId, InboundLaneData), Self::Error> { + Err(ALL_OUTBOUND_MESSAGES_REJECTED) + } +} + +impl LaneMessageVerifier for ForbidOutboundMessages { + type Error = &'static str; + + fn verify_message( + _submitter: &SenderOrigin, + _lane: &LaneId, + _outbound_data: &OutboundLaneData, + _payload: &Payload, + ) -> Result<(), Self::Error> { + Err(ALL_OUTBOUND_MESSAGES_REJECTED) + } +} + +impl DeliveryConfirmationPayments for ForbidOutboundMessages { + type Error = &'static str; + + fn pay_reward( + _lane_id: LaneId, + _messages_relayers: VecDeque>, + _confirmation_relayer: &AccountId, + _received_range: &RangeInclusive, + ) -> MessageNonce { + 0 + } +} diff --git a/bridges/primitives/messages/src/storage_keys.rs b/bridges/primitives/messages/src/storage_keys.rs new file mode 100644 index 00000000000..4edf9828cfd --- /dev/null +++ b/bridges/primitives/messages/src/storage_keys.rs @@ -0,0 +1,128 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Storage keys of bridge messages pallet. + +/// Name of the `OPERATING_MODE_VALUE_NAME` storage value. +pub const OPERATING_MODE_VALUE_NAME: &str = "PalletOperatingMode"; +/// Name of the `OutboundMessages` storage map. +pub const OUTBOUND_MESSAGES_MAP_NAME: &str = "OutboundMessages"; +/// Name of the `OutboundLanes` storage map. +pub const OUTBOUND_LANES_MAP_NAME: &str = "OutboundLanes"; +/// Name of the `InboundLanes` storage map. +pub const INBOUND_LANES_MAP_NAME: &str = "InboundLanes"; + +use crate::{LaneId, MessageKey, MessageNonce}; + +use codec::Encode; +use frame_support::Blake2_128Concat; +use sp_core::storage::StorageKey; + +/// Storage key of the `PalletOperatingMode` value in the runtime storage. +pub fn operating_mode_key(pallet_prefix: &str) -> StorageKey { + StorageKey( + bp_runtime::storage_value_final_key( + pallet_prefix.as_bytes(), + OPERATING_MODE_VALUE_NAME.as_bytes(), + ) + .to_vec(), + ) +} + +/// Storage key of the outbound message in the runtime storage. +pub fn message_key(pallet_prefix: &str, lane: &LaneId, nonce: MessageNonce) -> StorageKey { + bp_runtime::storage_map_final_key::( + pallet_prefix, + OUTBOUND_MESSAGES_MAP_NAME, + &MessageKey { lane_id: *lane, nonce }.encode(), + ) +} + +/// Storage key of the outbound message lane state in the runtime storage. +pub fn outbound_lane_data_key(pallet_prefix: &str, lane: &LaneId) -> StorageKey { + bp_runtime::storage_map_final_key::( + pallet_prefix, + OUTBOUND_LANES_MAP_NAME, + &lane.encode(), + ) +} + +/// Storage key of the inbound message lane state in the runtime storage. +pub fn inbound_lane_data_key(pallet_prefix: &str, lane: &LaneId) -> StorageKey { + bp_runtime::storage_map_final_key::( + pallet_prefix, + INBOUND_LANES_MAP_NAME, + &lane.encode(), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use hex_literal::hex; + + #[test] + fn operating_mode_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is possibly + // breaking all existing message relays. + let storage_key = operating_mode_key("BridgeMessages").0; + assert_eq!( + storage_key, + hex!("dd16c784ebd3390a9bc0357c7511ed010f4cf0917788d791142ff6c1f216e7b3").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } + + #[test] + fn storage_message_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // all previously crafted messages proofs. + let storage_key = message_key("BridgeMessages", &LaneId(*b"test"), 42).0; + assert_eq!( + storage_key, + hex!("dd16c784ebd3390a9bc0357c7511ed018a395e6242c6813b196ca31ed0547ea79446af0e09063bd4a7874aef8a997cec746573742a00000000000000").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } + + #[test] + fn outbound_lane_data_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // all previously crafted outbound lane state proofs. + let storage_key = outbound_lane_data_key("BridgeMessages", &LaneId(*b"test")).0; + assert_eq!( + storage_key, + hex!("dd16c784ebd3390a9bc0357c7511ed0196c246acb9b55077390e3ca723a0ca1f44a8995dd50b6657a037a7839304535b74657374").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } + + #[test] + fn inbound_lane_data_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // all previously crafted inbound lane state proofs. + let storage_key = inbound_lane_data_key("BridgeMessages", &LaneId(*b"test")).0; + assert_eq!( + storage_key, + hex!("dd16c784ebd3390a9bc0357c7511ed01e5f83cf83f2127eb47afdc35d6e43fab44a8995dd50b6657a037a7839304535b74657374").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } +} diff --git a/bridges/primitives/messages/src/target_chain.rs b/bridges/primitives/messages/src/target_chain.rs new file mode 100644 index 00000000000..3c2e8cf0cb0 --- /dev/null +++ b/bridges/primitives/messages/src/target_chain.rs @@ -0,0 +1,200 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Primitives of messages module, that are used on the target chain. + +use crate::{LaneId, Message, MessageKey, MessageNonce, MessagePayload, OutboundLaneData}; + +use bp_runtime::{messages::MessageDispatchResult, Size}; +use codec::{Decode, Encode, Error as CodecError}; +use frame_support::{weights::Weight, Parameter, RuntimeDebug}; +use scale_info::TypeInfo; +use sp_std::{collections::btree_map::BTreeMap, fmt::Debug, marker::PhantomData, prelude::*}; + +/// Proved messages from the source chain. +pub type ProvedMessages = BTreeMap>; + +/// Proved messages from single lane of the source chain. +#[derive(RuntimeDebug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] +pub struct ProvedLaneMessages { + /// Optional outbound lane state. + pub lane_state: Option, + /// Messages sent through this lane. + pub messages: Vec, +} + +/// Message data with decoded dispatch payload. +#[derive(RuntimeDebug)] +pub struct DispatchMessageData { + /// Result of dispatch payload decoding. + pub payload: Result, +} + +/// Message with decoded dispatch payload. +#[derive(RuntimeDebug)] +pub struct DispatchMessage { + /// Message key. + pub key: MessageKey, + /// Message data with decoded dispatch payload. + pub data: DispatchMessageData, +} + +/// Source chain API. Used by target chain, to verify source chain proofs. +/// +/// All implementations of this trait should only work with finalized data that +/// can't change. Wrong implementation may lead to invalid lane states (i.e. lane +/// that's stuck) and/or processing messages without paying fees. +pub trait SourceHeaderChain { + /// Error type. + type Error: Debug; + + /// Proof that messages are sent from source chain. This may also include proof + /// of corresponding outbound lane states. + type MessagesProof: Parameter + Size; + + /// Verify messages proof and return proved messages. + /// + /// Returns error if either proof is incorrect, or the number of messages in the proof + /// is not matching the `messages_count`. + /// + /// Messages vector is required to be sorted by nonce within each lane. Out-of-order + /// messages will be rejected. + /// + /// The `messages_count` argument verification (sane limits) is supposed to be made + /// outside this function. This function only verifies that the proof declares exactly + /// `messages_count` messages. + fn verify_messages_proof( + proof: Self::MessagesProof, + messages_count: u32, + ) -> Result, Self::Error>; +} + +/// Called when inbound message is received. +pub trait MessageDispatch { + /// Decoded message payload type. Valid message may contain invalid payload. In this case + /// message is delivered, but dispatch fails. Therefore, two separate types of payload + /// (opaque `MessagePayload` used in delivery and this `DispatchPayload` used in dispatch). + type DispatchPayload: Decode; + + /// Fine-grained result of single message dispatch (for better diagnostic purposes) + type DispatchLevelResult: Clone + sp_std::fmt::Debug + Eq; + + /// Estimate dispatch weight. + /// + /// This function must return correct upper bound of dispatch weight. The return value + /// of this function is expected to match return value of the corresponding + /// `FromInboundLaneApi::message_details().dispatch_weight` call. + fn dispatch_weight(message: &mut DispatchMessage) -> Weight; + + /// Called when inbound message is received. + /// + /// It is up to the implementers of this trait to determine whether the message + /// is invalid (i.e. improperly encoded, has too large weight, ...) or not. + fn dispatch( + message: DispatchMessage, + ) -> MessageDispatchResult; +} + +/// Manages payments that are happening at the target chain during message delivery transaction. +pub trait DeliveryPayments { + /// Error type. + type Error: Debug + Into<&'static str>; + + /// Pay rewards for delivering messages to the given relayer. + /// + /// This method is called during message delivery transaction which has been submitted + /// by the `relayer`. The transaction brings `total_messages` messages but only + /// `valid_messages` have been accepted. The post-dispatch transaction weight is the + /// `actual_weight`. + fn pay_reward( + relayer: AccountId, + total_messages: MessageNonce, + valid_messages: MessageNonce, + actual_weight: Weight, + ); +} + +impl Default for ProvedLaneMessages { + fn default() -> Self { + ProvedLaneMessages { lane_state: None, messages: Vec::new() } + } +} + +impl From for DispatchMessage { + fn from(message: Message) -> Self { + DispatchMessage { key: message.key, data: message.payload.into() } + } +} + +impl From for DispatchMessageData { + fn from(payload: MessagePayload) -> Self { + DispatchMessageData { payload: DispatchPayload::decode(&mut &payload[..]) } + } +} + +impl DeliveryPayments for () { + type Error = &'static str; + + fn pay_reward( + _relayer: AccountId, + _total_messages: MessageNonce, + _valid_messages: MessageNonce, + _actual_weight: Weight, + ) { + // this implementation is not rewarding relayer at all + } +} + +/// Structure that may be used in place of `SourceHeaderChain` and `MessageDispatch` on chains, +/// where inbound messages are forbidden. +pub struct ForbidInboundMessages( + PhantomData<(MessagesProof, DispatchPayload)>, +); + +/// Error message that is used in `ForbidOutboundMessages` implementation. +const ALL_INBOUND_MESSAGES_REJECTED: &str = + "This chain is configured to reject all inbound messages"; + +impl SourceHeaderChain + for ForbidInboundMessages +{ + type Error = &'static str; + type MessagesProof = MessagesProof; + + fn verify_messages_proof( + _proof: Self::MessagesProof, + _messages_count: u32, + ) -> Result, Self::Error> { + Err(ALL_INBOUND_MESSAGES_REJECTED) + } +} + +impl MessageDispatch + for ForbidInboundMessages +{ + type DispatchPayload = DispatchPayload; + type DispatchLevelResult = (); + + fn dispatch_weight(_message: &mut DispatchMessage) -> Weight { + Weight::MAX + } + + fn dispatch( + _: DispatchMessage, + ) -> MessageDispatchResult { + MessageDispatchResult { unspent_weight: Weight::zero(), dispatch_level_result: () } + } +} diff --git a/bridges/primitives/parachains/Cargo.toml b/bridges/primitives/parachains/Cargo.toml new file mode 100644 index 00000000000..426597a2508 --- /dev/null +++ b/bridges/primitives/parachains/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "bp-parachains" +description = "Primitives of parachains module." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +impl-trait-for-tuples = "0.2" +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } + +# Bridge dependencies + +bp-header-chain = { path = "../header-chain", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "scale-info/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/bridges/primitives/parachains/src/lib.rs b/bridges/primitives/parachains/src/lib.rs new file mode 100644 index 00000000000..e619fc7b641 --- /dev/null +++ b/bridges/primitives/parachains/src/lib.rs @@ -0,0 +1,180 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Primitives of parachains module. + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_header_chain::StoredHeaderData; + +use bp_polkadot_core::{ + parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}, + BlockNumber as RelayBlockNumber, Hash as RelayBlockHash, +}; +use bp_runtime::{ + BlockNumberOf, Chain, HashOf, HeaderOf, Parachain, StorageDoubleMapKeyProvider, + StorageMapKeyProvider, +}; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::{Blake2_128Concat, RuntimeDebug, Twox64Concat}; +use scale_info::TypeInfo; +use sp_core::storage::StorageKey; +use sp_runtime::traits::Header as HeaderT; +use sp_std::{marker::PhantomData, prelude::*}; + +/// Best known parachain head hash. +#[derive(Clone, Decode, Encode, MaxEncodedLen, PartialEq, RuntimeDebug, TypeInfo)] +pub struct BestParaHeadHash { + /// Number of relay block where this head has been read. + /// + /// Parachain head is opaque to relay chain. So we can't simply decode it as a header of + /// parachains and call `block_number()` on it. Instead, we're using the fact that parachain + /// head is always built on top of previous head (because it is blockchain) and relay chain + /// always imports parachain heads in order. What it means for us is that at any given + /// **finalized** relay block `B`, head of parachain will be ancestor (or the same) of all + /// parachain heads available at descendants of `B`. + pub at_relay_block_number: RelayBlockNumber, + /// Hash of parachain head. + pub head_hash: ParaHash, +} + +/// Best known parachain head as it is stored in the runtime storage. +#[derive(Decode, Encode, MaxEncodedLen, PartialEq, RuntimeDebug, TypeInfo)] +pub struct ParaInfo { + /// Best known parachain head hash. + pub best_head_hash: BestParaHeadHash, + /// Current ring buffer position for this parachain. + pub next_imported_hash_position: u32, +} + +/// Returns runtime storage key of given parachain head at the source chain. +/// +/// The head is stored by the `paras` pallet in the `Heads` map. +pub fn parachain_head_storage_key_at_source( + paras_pallet_name: &str, + para_id: ParaId, +) -> StorageKey { + bp_runtime::storage_map_final_key::(paras_pallet_name, "Heads", ¶_id.encode()) +} + +/// Can be use to access the runtime storage key of the parachains info at the target chain. +/// +/// The info is stored by the `pallet-bridge-parachains` pallet in the `ParasInfo` map. +pub struct ParasInfoKeyProvider; +impl StorageMapKeyProvider for ParasInfoKeyProvider { + const MAP_NAME: &'static str = "ParasInfo"; + + type Hasher = Blake2_128Concat; + type Key = ParaId; + type Value = ParaInfo; +} + +/// Can be use to access the runtime storage key of the parachain head at the target chain. +/// +/// The head is stored by the `pallet-bridge-parachains` pallet in the `ImportedParaHeads` map. +pub struct ImportedParaHeadsKeyProvider; +impl StorageDoubleMapKeyProvider for ImportedParaHeadsKeyProvider { + const MAP_NAME: &'static str = "ImportedParaHeads"; + + type Hasher1 = Blake2_128Concat; + type Key1 = ParaId; + type Hasher2 = Blake2_128Concat; + type Key2 = ParaHash; + type Value = ParaStoredHeaderData; +} + +/// Stored data of the parachain head. It is encoded version of the +/// `bp_runtime::StoredHeaderData` structure. +/// +/// We do not know exact structure of the parachain head, so we always store encoded version +/// of the `bp_runtime::StoredHeaderData`. It is only decoded when we talk about specific parachain. +#[derive(Clone, Decode, Encode, PartialEq, RuntimeDebug, TypeInfo)] +pub struct ParaStoredHeaderData(pub Vec); + +impl ParaStoredHeaderData { + /// Decode stored parachain head data. + pub fn decode_parachain_head_data( + &self, + ) -> Result, HashOf>, codec::Error> { + StoredHeaderData::, HashOf>::decode(&mut &self.0[..]) + } +} + +/// Stored parachain head data builder. +pub trait ParaStoredHeaderDataBuilder { + /// Return number of parachains that are supported by this builder. + fn supported_parachains() -> u32; + + /// Try to build head data from encoded head of parachain with given id. + fn try_build(para_id: ParaId, para_head: &ParaHead) -> Option; +} + +/// Helper for using single parachain as `ParaStoredHeaderDataBuilder`. +pub struct SingleParaStoredHeaderDataBuilder(PhantomData); + +impl ParaStoredHeaderDataBuilder for SingleParaStoredHeaderDataBuilder { + fn supported_parachains() -> u32 { + 1 + } + + fn try_build(para_id: ParaId, para_head: &ParaHead) -> Option { + if para_id == ParaId(C::PARACHAIN_ID) { + let header = HeaderOf::::decode(&mut ¶_head.0[..]).ok()?; + return Some(ParaStoredHeaderData( + StoredHeaderData { number: *header.number(), state_root: *header.state_root() } + .encode(), + )) + } + None + } +} + +// Tries to build header data from each tuple member, short-circuiting on first successful one. +#[impl_trait_for_tuples::impl_for_tuples(1, 30)] +#[tuple_types_custom_trait_bound(Parachain)] +impl ParaStoredHeaderDataBuilder for C { + fn supported_parachains() -> u32 { + let mut result = 0; + for_tuples!( #( + result += SingleParaStoredHeaderDataBuilder::::supported_parachains(); + )* ); + result + } + + fn try_build(para_id: ParaId, para_head: &ParaHead) -> Option { + for_tuples!( #( + let maybe_para_head = SingleParaStoredHeaderDataBuilder::::try_build(para_id, para_head); + if let Some(maybe_para_head) = maybe_para_head { + return Some(maybe_para_head); + } + )* ); + + None + } +} + +/// A minimized version of `pallet-bridge-parachains::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum BridgeParachainCall { + /// `pallet-bridge-parachains::Call::submit_parachain_heads` + #[codec(index = 0)] + submit_parachain_heads { + at_relay_block: (RelayBlockNumber, RelayBlockHash), + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + }, +} diff --git a/bridges/primitives/polkadot-core/Cargo.toml b/bridges/primitives/polkadot-core/Cargo.toml new file mode 100644 index 00000000000..56c6de04d41 --- /dev/null +++ b/bridges/primitives/polkadot-core/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "bp-polkadot-core" +description = "Primitives of Polkadot-like runtime." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +parity-util-mem = { version = "0.12.0", optional = true } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +serde = { version = "1.0", optional = true, features = ["derive"] } + +# Bridge Dependencies + +bp-messages = { path = "../messages", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[dev-dependencies] +hex = "0.4" + +[features] +default = ["std"] +std = [ + "bp-messages/std", + "bp-runtime/std", + "frame-support/std", + "frame-system/std", + "codec/std", + "parity-util-mem", + "scale-info/std", + "serde", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/bridges/primitives/polkadot-core/src/lib.rs b/bridges/primitives/polkadot-core/src/lib.rs new file mode 100644 index 00000000000..3774d283fc4 --- /dev/null +++ b/bridges/primitives/polkadot-core/src/lib.rs @@ -0,0 +1,292 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] + +use bp_messages::MessageNonce; +use bp_runtime::{Chain, EncodedOrDecodedCall, StorageMapKeyProvider}; +use frame_support::{ + dispatch::DispatchClass, + parameter_types, + weights::{ + constants::{BlockExecutionWeight, WEIGHT_REF_TIME_PER_SECOND}, + Weight, + }, + Blake2_128Concat, RuntimeDebug, +}; +use frame_system::limits; +use sp_core::{storage::StorageKey, Hasher as HasherT}; +use sp_runtime::{ + generic, + traits::{BlakeTwo256, IdentifyAccount, Verify}, + MultiAddress, MultiSignature, OpaqueExtrinsic, +}; +use sp_std::prelude::Vec; + +// Re-export's to avoid extra substrate dependencies in chain-specific crates. +pub use frame_support::{weights::constants::ExtrinsicBaseWeight, Parameter}; +pub use sp_runtime::{traits::Convert, Perbill}; + +pub mod parachains; + +/// Maximal number of GRANDPA authorities at Polkadot-like chains. +/// +/// Ideally, we would set it to the value of `MaxAuthorities` constant from bridged runtime +/// configurations. But right now it is set to the `100_000`, which makes PoV size for +/// our bridge hub parachains huge. So let's stick to the real-world value here. +/// +/// Right now both Kusama and Polkadot aim to have around 1000 validators. Let's be safe here and +/// take a bit more here. +pub const MAX_AUTHORITIES_COUNT: u32 = 1_256; + +/// Reasonable number of headers in the `votes_ancestries` on Polkadot-like chains. +/// +/// See [`bp-header-chain::ChainWithGrandpa`] for more details. +/// +/// This value comes from recent (February, 2023) Kusama and Polkadot headers. There are no +/// justifications with any additional headers in votes ancestry, so reasonable headers may +/// be set to zero. But we assume that there may be small GRANDPA lags, so we're leaving some +/// reserve here. +pub const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 2; + +/// Approximate average header size in `votes_ancestries` field of justification on Polkadot-like +/// chains. +/// +/// See [`bp-header-chain::ChainWithGrandpa`] for more details. +/// +/// This value comes from recent (February, 2023) Kusama headers. Average is `336` there, but some +/// non-mandatory headers has size `40kb` (they contain the BABE epoch descriptor with all +/// authorities - just like our mandatory header). Since we assume `2` headers in justification +/// votes ancestry, let's set average header to `40kb / 2`. +pub const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = 20 * 1024; + +/// Approximate maximal header size on Polkadot-like chains. +/// +/// See [`bp-header-chain::ChainWithGrandpa`] for more details. +/// +/// This value comes from recent (February, 2023) Kusama headers. Maximal header is a mandatory +/// header. In its SCALE-encoded form it is `80348` bytes. Let's have some reserve here. +pub const MAX_HEADER_SIZE: u32 = 90_000; + +/// Number of extra bytes (excluding size of storage value itself) of storage proof, built at +/// Polkadot-like chain. This mostly depends on number of entries in the storage trie. +/// Some reserve is reserved to account future chain growth. +/// +/// To compute this value, we've synced Kusama chain blocks [0; 6545733] to see if there were +/// any significant changes of the storage proof size (NO): +/// +/// - at block 3072 the storage proof size overhead was 579 bytes; +/// - at block 2479616 it was 578 bytes; +/// - at block 4118528 it was 711 bytes; +/// - at block 6540800 it was 779 bytes. +/// +/// The number of storage entries at the block 6546170 was 351207 and number of trie nodes in +/// the storage proof was 5 (log(16, 351207) ~ 4.6). +/// +/// So the assumption is that the storage proof size overhead won't be larger than 1024 in the +/// nearest future. If it'll ever break this barrier, then we'll need to update this constant +/// at next runtime upgrade. +pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024; + +/// All Polkadot-like chains allow normal extrinsics to fill block up to 75 percent. +/// +/// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. +const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); + +/// All Polkadot-like chains allow 2 seconds of compute with a 6-second average block time. +/// +/// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. +pub const MAXIMUM_BLOCK_WEIGHT: Weight = + Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND.saturating_mul(2), u64::MAX); + +/// All Polkadot-like chains assume that an on-initialize consumes 1 percent of the weight on +/// average, hence a single extrinsic will not be allowed to consume more than +/// `AvailableBlockRatio - 1 percent`. +/// +/// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. +pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(1); + +parameter_types! { + /// All Polkadot-like chains have maximal block size set to 5MB. + /// + /// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. + pub BlockLength: limits::BlockLength = limits::BlockLength::max_with_normal_ratio( + 5 * 1024 * 1024, + NORMAL_DISPATCH_RATIO, + ); + /// All Polkadot-like chains have the same block weights. + /// + /// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. + pub BlockWeights: limits::BlockWeights = limits::BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have an extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT, + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); +} + +// TODO [#78] may need to be updated after https://github.com/paritytech/parity-bridges-common/issues/78 +/// Maximal number of messages in single delivery transaction. +pub const MAX_MESSAGES_IN_DELIVERY_TRANSACTION: MessageNonce = 128; + +/// Maximal number of bytes, included in the signed Polkadot-like transaction apart from the encoded +/// call itself. +/// +/// Can be computed by subtracting encoded call size from raw transaction size. +pub const TX_EXTRA_BYTES: u32 = 256; + +/// Re-export `time_units` to make usage easier. +pub use time_units::*; + +/// Human readable time units defined in terms of number of blocks. +pub mod time_units { + use super::BlockNumber; + + pub const MILLISECS_PER_BLOCK: u64 = 6000; + pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; + + pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); + pub const HOURS: BlockNumber = MINUTES * 60; + pub const DAYS: BlockNumber = HOURS * 24; +} + +/// Block number type used in Polkadot-like chains. +pub type BlockNumber = u32; + +/// Hash type used in Polkadot-like chains. +pub type Hash = ::Out; + +/// Account Index (a.k.a. nonce). +pub type Index = u32; + +/// Hashing type. +pub type Hashing = BlakeTwo256; + +/// The type of object that can produce hashes on Polkadot-like chains. +pub type Hasher = BlakeTwo256; + +/// The header type used by Polkadot-like chains. +pub type Header = generic::Header; + +/// Signature type used by Polkadot-like chains. +pub type Signature = MultiSignature; + +/// Public key of account on Polkadot-like chains. +pub type AccountPublic = ::Signer; + +/// Id of account on Polkadot-like chains. +pub type AccountId = ::AccountId; + +/// Address of account on Polkadot-like chains. +pub type AccountAddress = MultiAddress; + +/// Index of a transaction on the Polkadot-like chains. +pub type Nonce = u32; + +/// Block type of Polkadot-like chains. +pub type Block = generic::Block; + +/// Polkadot-like block signed with a Justification. +pub type SignedBlock = generic::SignedBlock; + +/// The balance of an account on Polkadot-like chain. +pub type Balance = u128; + +/// Unchecked Extrinsic type. +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic, Signature, SignedExt>; + +/// Account address, used by the Polkadot-like chain. +pub type Address = MultiAddress; + +/// Polkadot-like chain. +#[derive(RuntimeDebug)] +pub struct PolkadotLike; + +impl Chain for PolkadotLike { + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hasher = Hasher; + type Header = Header; + + type AccountId = AccountId; + type Balance = Balance; + type Index = Index; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + *BlockLength::get().max.get(DispatchClass::Normal) + } + + fn max_extrinsic_weight() -> Weight { + BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .unwrap_or(Weight::MAX) + } +} + +/// Provides a storage key for account data. +/// +/// We need to use this approach when we don't have access to the runtime. +/// The equivalent command to invoke in case full `Runtime` is known is this: +/// `let key = frame_system::Account::::storage_map_final_key(&account_id);` +pub struct AccountInfoStorageMapKeyProvider; + +impl StorageMapKeyProvider for AccountInfoStorageMapKeyProvider { + const MAP_NAME: &'static str = "Account"; + type Hasher = Blake2_128Concat; + type Key = AccountId; + // This should actually be `AccountInfo`, but we don't use this property in order to decode the + // data. So we use `Vec` as if we would work with encoded data. + type Value = Vec; +} + +impl AccountInfoStorageMapKeyProvider { + const PALLET_NAME: &'static str = "System"; + + pub fn final_key(id: &AccountId) -> StorageKey { + ::final_key(Self::PALLET_NAME, id) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn should_generate_storage_key() { + let acc = [ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, + ] + .into(); + let key = AccountInfoStorageMapKeyProvider::final_key(&acc); + assert_eq!(hex::encode(key), "26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92dccd599abfe1920a1cff8a7358231430102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20"); + } +} diff --git a/bridges/primitives/polkadot-core/src/parachains.rs b/bridges/primitives/polkadot-core/src/parachains.rs new file mode 100644 index 00000000000..0b410dff49f --- /dev/null +++ b/bridges/primitives/polkadot-core/src/parachains.rs @@ -0,0 +1,98 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Primitives of polkadot-like chains, that are related to parachains functionality. +//! +//! Even though this (bridges) repository references polkadot repository, we can't +//! reference polkadot crates from pallets. That's because bridges repository is +//! included in the polkadot repository and included pallets are used by polkadot +//! chains. Having pallets that are referencing polkadot, would mean that there may +//! be two versions of polkadot crates included in the runtime. Which is bad. + +use bp_runtime::{RawStorageProof, Size}; +use codec::{CompactAs, Decode, Encode, MaxEncodedLen}; +use frame_support::RuntimeDebug; +use scale_info::TypeInfo; +use sp_core::Hasher; +use sp_std::vec::Vec; + +#[cfg(feature = "std")] +use serde::{Deserialize, Serialize}; + +#[cfg(feature = "std")] +use parity_util_mem::MallocSizeOf; + +/// Parachain id. +/// +/// This is an equivalent of the `polkadot_parachain::Id`, which is a compact-encoded `u32`. +#[derive( + Clone, + CompactAs, + Copy, + Decode, + Default, + Encode, + Eq, + Hash, + MaxEncodedLen, + Ord, + PartialEq, + PartialOrd, + RuntimeDebug, + TypeInfo, +)] +pub struct ParaId(pub u32); + +impl From for ParaId { + fn from(id: u32) -> Self { + ParaId(id) + } +} + +/// Parachain head. +/// +/// This is an equivalent of the `polkadot_parachain::HeadData`. +/// +/// The parachain head means (at least in Cumulus) a SCALE-encoded parachain header. +#[derive( + PartialEq, Eq, Clone, PartialOrd, Ord, Encode, Decode, RuntimeDebug, TypeInfo, Default, +)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Hash, MallocSizeOf))] +pub struct ParaHead(pub Vec); + +impl ParaHead { + /// Returns the hash of this head data. + pub fn hash(&self) -> crate::Hash { + sp_runtime::traits::BlakeTwo256::hash(&self.0) + } +} + +/// Parachain head hash. +pub type ParaHash = crate::Hash; + +/// Parachain head hasher. +pub type ParaHasher = crate::Hasher; + +/// Raw storage proof of parachain heads, stored in polkadot-like chain runtime. +#[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] +pub struct ParaHeadsProof(pub RawStorageProof); + +impl Size for ParaHeadsProof { + fn size(&self) -> u32 { + u32::try_from(self.0.iter().fold(0usize, |sum, node| sum.saturating_add(node.len()))) + .unwrap_or(u32::MAX) + } +} diff --git a/bridges/primitives/relayers/Cargo.toml b/bridges/primitives/relayers/Cargo.toml new file mode 100644 index 00000000000..b84b0393adf --- /dev/null +++ b/bridges/primitives/relayers/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "bp-relayers" +description = "Primitives of relayers module." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive", "bit-vec"] } +scale-info = { version = "2.6.0", default-features = false, features = ["bit-vec", "derive"] } + +# Bridge Dependencies + +bp-messages = { path = "../messages", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[dev-dependencies] +hex = "0.4" +hex-literal = "0.4" + +[features] +default = ["std"] +std = [ + "bp-messages/std", + "bp-runtime/std", + "frame-support/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/bridges/primitives/relayers/src/lib.rs b/bridges/primitives/relayers/src/lib.rs new file mode 100644 index 00000000000..21f66a2ffa1 --- /dev/null +++ b/bridges/primitives/relayers/src/lib.rs @@ -0,0 +1,206 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Primitives of messages module. + +#![warn(missing_docs)] +#![cfg_attr(not(feature = "std"), no_std)] + +pub use registration::{Registration, StakeAndSlash}; + +use bp_messages::LaneId; +use bp_runtime::{ChainId, StorageDoubleMapKeyProvider}; +use frame_support::{traits::tokens::Preservation, Blake2_128Concat, Identity}; +use scale_info::TypeInfo; +use sp_runtime::{ + codec::{Codec, Decode, Encode, EncodeLike, MaxEncodedLen}, + traits::AccountIdConversion, + TypeId, +}; +use sp_std::{fmt::Debug, marker::PhantomData}; + +mod registration; + +/// The owner of the sovereign account that should pay the rewards. +/// +/// Each of the 2 final points connected by a bridge owns a sovereign account at each end of the +/// bridge. So here, at this end of the bridge there can be 2 sovereign accounts that pay rewards. +#[derive(Copy, Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen)] +pub enum RewardsAccountOwner { + /// The sovereign account of the final chain on this end of the bridge. + ThisChain, + /// The sovereign account of the final chain on the other end of the bridge. + BridgedChain, +} + +/// Structure used to identify the account that pays a reward to the relayer. +/// +/// A bridge connects 2 bridge ends. Each one is located on a separate relay chain. The bridge ends +/// can be the final destinations of the bridge, or they can be intermediary points +/// (e.g. a bridge hub) used to forward messages between pairs of parachains on the bridged relay +/// chains. A pair of such parachains is connected using a bridge lane. Each of the 2 final +/// destinations of a bridge lane must have a sovereign account at each end of the bridge and each +/// of the sovereign accounts will pay rewards for different operations. So we need multiple +/// parameters to identify the account that pays a reward to the relayer. +#[derive(Copy, Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen)] +pub struct RewardsAccountParams { + lane_id: LaneId, + bridged_chain_id: ChainId, + owner: RewardsAccountOwner, +} + +impl RewardsAccountParams { + /// Create a new instance of `RewardsAccountParams`. + pub const fn new( + lane_id: LaneId, + bridged_chain_id: ChainId, + owner: RewardsAccountOwner, + ) -> Self { + Self { lane_id, bridged_chain_id, owner } + } +} + +impl TypeId for RewardsAccountParams { + const TYPE_ID: [u8; 4] = *b"brap"; +} + +/// Reward payment procedure. +pub trait PaymentProcedure { + /// Error that may be returned by the procedure. + type Error: Debug; + + /// Pay reward to the relayer from the account with provided params. + fn pay_reward( + relayer: &Relayer, + rewards_account_params: RewardsAccountParams, + reward: Reward, + ) -> Result<(), Self::Error>; +} + +impl PaymentProcedure for () { + type Error = &'static str; + + fn pay_reward(_: &Relayer, _: RewardsAccountParams, _: Reward) -> Result<(), Self::Error> { + Ok(()) + } +} + +/// Reward payment procedure that does `balances::transfer` call from the account, derived from +/// given params. +pub struct PayRewardFromAccount(PhantomData<(T, Relayer)>); + +impl PayRewardFromAccount +where + Relayer: Decode + Encode, +{ + /// Return account that pays rewards based on the provided parameters. + pub fn rewards_account(params: RewardsAccountParams) -> Relayer { + params.into_sub_account_truncating(b"rewards-account") + } +} + +impl PaymentProcedure for PayRewardFromAccount +where + T: frame_support::traits::fungible::Mutate, + Relayer: Decode + Encode, +{ + type Error = sp_runtime::DispatchError; + + fn pay_reward( + relayer: &Relayer, + rewards_account_params: RewardsAccountParams, + reward: T::Balance, + ) -> Result<(), Self::Error> { + T::transfer( + &Self::rewards_account(rewards_account_params), + relayer, + reward, + Preservation::Expendable, + ) + .map(drop) + } +} + +/// Can be use to access the runtime storage key within the `RelayerRewards` map of the relayers +/// pallet. +pub struct RelayerRewardsKeyProvider(PhantomData<(AccountId, Reward)>); + +impl StorageDoubleMapKeyProvider for RelayerRewardsKeyProvider +where + AccountId: Codec + EncodeLike, + Reward: Codec + EncodeLike, +{ + const MAP_NAME: &'static str = "RelayerRewards"; + + type Hasher1 = Blake2_128Concat; + type Key1 = AccountId; + type Hasher2 = Identity; + type Key2 = RewardsAccountParams; + type Value = Reward; +} + +#[cfg(test)] +mod tests { + use super::*; + use bp_messages::LaneId; + use sp_runtime::testing::H256; + + #[test] + fn different_lanes_are_using_different_accounts() { + assert_eq!( + PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( + LaneId([0, 0, 0, 0]), + *b"test", + RewardsAccountOwner::ThisChain + )), + hex_literal::hex!("62726170000000007465737400726577617264732d6163636f756e7400000000") + .into(), + ); + + assert_eq!( + PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( + LaneId([0, 0, 0, 1]), + *b"test", + RewardsAccountOwner::ThisChain + )), + hex_literal::hex!("62726170000000017465737400726577617264732d6163636f756e7400000000") + .into(), + ); + } + + #[test] + fn different_directions_are_using_different_accounts() { + assert_eq!( + PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( + LaneId([0, 0, 0, 0]), + *b"test", + RewardsAccountOwner::ThisChain + )), + hex_literal::hex!("62726170000000007465737400726577617264732d6163636f756e7400000000") + .into(), + ); + + assert_eq!( + PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( + LaneId([0, 0, 0, 0]), + *b"test", + RewardsAccountOwner::BridgedChain + )), + hex_literal::hex!("62726170000000007465737401726577617264732d6163636f756e7400000000") + .into(), + ); + } +} diff --git a/bridges/primitives/relayers/src/registration.rs b/bridges/primitives/relayers/src/registration.rs new file mode 100644 index 00000000000..7ab20844bdf --- /dev/null +++ b/bridges/primitives/relayers/src/registration.rs @@ -0,0 +1,121 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Bridge relayers registration and slashing scheme. +//! +//! There is an option to add a refund-relayer signed extension that will compensate +//! relayer costs of the message delivery and confirmation transactions (as well as +//! required finality proofs). This extension boosts priority of message delivery +//! transactions, based on the number of bundled messages. So transaction with more +//! messages has larger priority than the transaction with less messages. +//! See `bridge_runtime_common::priority_calculator` for details; +//! +//! This encourages relayers to include more messages to their delivery transactions. +//! At the same time, we are not verifying storage proofs before boosting +//! priority. Instead, we simply trust relayer, when it says that transaction delivers +//! `N` messages. +//! +//! This allows relayers to submit transactions which declare large number of bundled +//! transactions to receive priority boost for free, potentially pushing actual delivery +//! transactions from the block (or even transaction queue). Such transactions are +//! not free, but their cost is relatively small. +//! +//! To alleviate that, we only boost transactions of relayers that have some stake +//! that guarantees that their transactions are valid. Such relayers get priority +//! for free, but they risk to lose their stake. + +use crate::RewardsAccountParams; + +use codec::{Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; +use sp_runtime::{ + traits::{Get, Zero}, + DispatchError, DispatchResult, +}; + +/// Relayer registration. +#[derive(Copy, Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen)] +pub struct Registration { + /// The last block number, where this registration is considered active. + /// + /// Relayer has an option to renew his registration (this may be done before it + /// is spoiled as well). Starting from block `valid_till + 1`, relayer may `deregister` + /// himself and get his stake back. + /// + /// Please keep in mind that priority boost stops working some blocks before the + /// registration ends (see [`StakeAndSlash::RequiredRegistrationLease`]). + pub valid_till: BlockNumber, + /// Active relayer stake, which is mapped to the relayer reserved balance. + /// + /// If `stake` is less than the [`StakeAndSlash::RequiredStake`], the registration + /// is considered inactive even if `valid_till + 1` is not yet reached. + pub stake: Balance, +} + +/// Relayer stake-and-slash mechanism. +pub trait StakeAndSlash { + /// The stake that the relayer must have to have its transactions boosted. + type RequiredStake: Get; + /// Required **remaining** registration lease to be able to get transaction priority boost. + /// + /// If the difference between registration's `valid_till` and the current block number + /// is less than the `RequiredRegistrationLease`, it becomes inactive and relayer transaction + /// won't get priority boost. This period exists, because priority is calculated when + /// transaction is placed to the queue (and it is reevaluated periodically) and then some time + /// may pass before transaction will be included into the block. + type RequiredRegistrationLease: Get; + + /// Reserve the given amount at relayer account. + fn reserve(relayer: &AccountId, amount: Balance) -> DispatchResult; + /// `Unreserve` the given amount from relayer account. + /// + /// Returns amount that we have failed to `unreserve`. + fn unreserve(relayer: &AccountId, amount: Balance) -> Balance; + /// Slash up to `amount` from reserved balance of account `relayer` and send funds to given + /// `beneficiary`. + /// + /// Returns `Ok(_)` with non-zero balance if we have failed to repatriate some portion of stake. + fn repatriate_reserved( + relayer: &AccountId, + beneficiary: RewardsAccountParams, + amount: Balance, + ) -> Result; +} + +impl StakeAndSlash for () +where + Balance: Default + Zero, + BlockNumber: Default, +{ + type RequiredStake = (); + type RequiredRegistrationLease = (); + + fn reserve(_relayer: &AccountId, _amount: Balance) -> DispatchResult { + Ok(()) + } + + fn unreserve(_relayer: &AccountId, _amount: Balance) -> Balance { + Zero::zero() + } + + fn repatriate_reserved( + _relayer: &AccountId, + _beneficiary: RewardsAccountParams, + _amount: Balance, + ) -> Result { + Ok(Zero::zero()) + } +} diff --git a/bridges/primitives/runtime/Cargo.toml b/bridges/primitives/runtime/Cargo.toml new file mode 100644 index 00000000000..694ff4e1aa6 --- /dev/null +++ b/bridges/primitives/runtime/Cargo.toml @@ -0,0 +1,49 @@ +[package] +name = "bp-runtime" +description = "Primitives that may be used at (bridges) runtime level." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +hash-db = { version = "0.16.0", default-features = false } +impl-trait-for-tuples = "0.2.2" +num-traits = { version = "0.2", default-features = false } +scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +serde = { version = "1.0", optional = true, features = ["derive"] } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +trie-db = { version = "0.27.1", default-features = false } + +[dev-dependencies] +hex-literal = "0.4" + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-support/std", + "frame-system/std", + "hash-db/std", + "num-traits/std", + "scale-info/std", + "serde", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "sp-state-machine/std", + "sp-trie/std", + "trie-db/std", +] diff --git a/bridges/primitives/runtime/src/chain.rs b/bridges/primitives/runtime/src/chain.rs new file mode 100644 index 00000000000..94b3a193c58 --- /dev/null +++ b/bridges/primitives/runtime/src/chain.rs @@ -0,0 +1,375 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +use crate::HeaderIdProvider; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::{weights::Weight, Parameter}; +use num_traits::{AsPrimitive, Bounded, CheckedSub, Saturating, SaturatingAdd, Zero}; +use sp_runtime::{ + traits::{ + AtLeast32Bit, AtLeast32BitUnsigned, Hash as HashT, Header as HeaderT, MaybeDisplay, + MaybeSerialize, MaybeSerializeDeserialize, Member, SimpleBitOps, Verify, + }, + FixedPointOperand, +}; +use sp_std::{convert::TryFrom, fmt::Debug, hash::Hash, str::FromStr, vec, vec::Vec}; + +/// Chain call, that is either SCALE-encoded, or decoded. +#[derive(Debug, Clone, PartialEq)] +pub enum EncodedOrDecodedCall { + /// The call that is SCALE-encoded. + /// + /// This variant is used when we the chain runtime is not bundled with the relay, but + /// we still need the represent call in some RPC calls or transactions. + Encoded(Vec), + /// The decoded call. + Decoded(ChainCall), +} + +impl EncodedOrDecodedCall { + /// Returns decoded call. + pub fn to_decoded(&self) -> Result { + match self { + Self::Encoded(ref encoded_call) => + ChainCall::decode(&mut &encoded_call[..]).map_err(Into::into), + Self::Decoded(ref decoded_call) => Ok(decoded_call.clone()), + } + } + + /// Converts self to decoded call. + pub fn into_decoded(self) -> Result { + match self { + Self::Encoded(encoded_call) => + ChainCall::decode(&mut &encoded_call[..]).map_err(Into::into), + Self::Decoded(decoded_call) => Ok(decoded_call), + } + } +} + +impl From for EncodedOrDecodedCall { + fn from(call: ChainCall) -> EncodedOrDecodedCall { + EncodedOrDecodedCall::Decoded(call) + } +} + +impl Decode for EncodedOrDecodedCall { + fn decode(input: &mut I) -> Result { + // having encoded version is better than decoded, because decoding isn't required + // everywhere and for mocked calls it may lead to **unneeded** errors + match input.remaining_len()? { + Some(remaining_len) => { + let mut encoded_call = vec![0u8; remaining_len]; + input.read(&mut encoded_call)?; + Ok(EncodedOrDecodedCall::Encoded(encoded_call)) + }, + None => Ok(EncodedOrDecodedCall::Decoded(ChainCall::decode(input)?)), + } + } +} + +impl Encode for EncodedOrDecodedCall { + fn encode(&self) -> Vec { + match *self { + Self::Encoded(ref encoded_call) => encoded_call.clone(), + Self::Decoded(ref decoded_call) => decoded_call.encode(), + } + } +} + +/// Minimal Substrate-based chain representation that may be used from no_std environment. +pub trait Chain: Send + Sync + 'static { + /// A type that fulfills the abstract idea of what a Substrate block number is. + // Constraits come from the associated Number type of `sp_runtime::traits::Header` + // See here for more info: + // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Number + // + // Note that the `AsPrimitive` trait is required by the GRANDPA justification + // verifier, and is not usually part of a Substrate Header's Number type. + type BlockNumber: Parameter + + Member + + MaybeSerializeDeserialize + + Hash + + Copy + + Default + + MaybeDisplay + + AtLeast32BitUnsigned + + FromStr + + AsPrimitive + + Default + + Saturating + + MaxEncodedLen; + + /// A type that fulfills the abstract idea of what a Substrate hash is. + // Constraits come from the associated Hash type of `sp_runtime::traits::Header` + // See here for more info: + // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Hash + type Hash: Parameter + + Member + + MaybeSerializeDeserialize + + Hash + + Ord + + Copy + + MaybeDisplay + + Default + + SimpleBitOps + + AsRef<[u8]> + + AsMut<[u8]> + + MaxEncodedLen; + + /// A type that fulfills the abstract idea of what a Substrate hasher (a type + /// that produces hashes) is. + // Constraits come from the associated Hashing type of `sp_runtime::traits::Header` + // See here for more info: + // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Hashing + type Hasher: HashT; + + /// A type that fulfills the abstract idea of what a Substrate header is. + // See here for more info: + // https://crates.parity.io/sp_runtime/traits/trait.Header.html + type Header: Parameter + + HeaderT + + HeaderIdProvider + + MaybeSerializeDeserialize; + + /// The user account identifier type for the runtime. + type AccountId: Parameter + + Member + + MaybeSerializeDeserialize + + Debug + + MaybeDisplay + + Ord + + MaxEncodedLen; + /// Balance of an account in native tokens. + /// + /// The chain may support multiple tokens, but this particular type is for token that is used + /// to pay for transaction dispatch, to reward different relayers (headers, messages), etc. + type Balance: AtLeast32BitUnsigned + + FixedPointOperand + + Parameter + + Member + + MaybeSerializeDeserialize + + Clone + + Copy + + Bounded + + CheckedSub + + PartialOrd + + SaturatingAdd + + Zero + + TryFrom + + MaxEncodedLen; + /// Index of a transaction used by the chain. + type Index: Parameter + + Member + + MaybeSerialize + + Debug + + Default + + MaybeDisplay + + MaybeSerializeDeserialize + + AtLeast32Bit + + Copy + + MaxEncodedLen; + /// Signature type, used on this chain. + type Signature: Parameter + Verify; + + /// Get the maximum size (in bytes) of a Normal extrinsic at this chain. + fn max_extrinsic_size() -> u32; + /// Get the maximum weight (compute time) that a Normal extrinsic at this chain can use. + fn max_extrinsic_weight() -> Weight; +} + +/// A trait that provides the type of the underlying chain. +pub trait UnderlyingChainProvider { + /// Underlying chain type. + type Chain: Chain; +} + +impl Chain for T +where + T: Send + Sync + 'static + UnderlyingChainProvider, +{ + type BlockNumber = ::BlockNumber; + type Hash = ::Hash; + type Hasher = ::Hasher; + type Header = ::Header; + type AccountId = ::AccountId; + type Balance = ::Balance; + type Index = ::Index; + type Signature = ::Signature; + + fn max_extrinsic_size() -> u32 { + ::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + ::max_extrinsic_weight() + } +} + +/// Minimal parachain representation that may be used from no_std environment. +pub trait Parachain: Chain { + /// Parachain identifier. + const PARACHAIN_ID: u32; +} + +impl Parachain for T +where + T: Chain + UnderlyingChainProvider, + ::Chain: Parachain, +{ + const PARACHAIN_ID: u32 = <::Chain as Parachain>::PARACHAIN_ID; +} + +/// Underlying chain type. +pub type UnderlyingChainOf = ::Chain; + +/// Block number used by the chain. +pub type BlockNumberOf = ::BlockNumber; + +/// Hash type used by the chain. +pub type HashOf = ::Hash; + +/// Hasher type used by the chain. +pub type HasherOf = ::Hasher; + +/// Header type used by the chain. +pub type HeaderOf = ::Header; + +/// Account id type used by the chain. +pub type AccountIdOf = ::AccountId; + +/// Balance type used by the chain. +pub type BalanceOf = ::Balance; + +/// Transaction index type used by the chain. +pub type IndexOf = ::Index; + +/// Signature type used by the chain. +pub type SignatureOf = ::Signature; + +/// Account public type used by the chain. +pub type AccountPublicOf = as Verify>::Signer; + +/// Transaction era used by the chain. +pub type TransactionEraOf = crate::TransactionEra, HashOf>; + +/// Convenience macro that declares bridge finality runtime apis and related constants for a chain. +/// This includes: +/// - chain-specific bridge runtime APIs: +/// - `FinalityApi` +/// - constants that are stringified names of runtime API methods: +/// - `BEST_FINALIZED__HEADER_METHOD` +/// The name of the chain has to be specified in snake case (e.g. `rialto_parachain`). +#[macro_export] +macro_rules! decl_bridge_finality_runtime_apis { + ($chain: ident) => { + bp_runtime::paste::item! { + mod [<$chain _finality_api>] { + use super::*; + + /// Name of the `FinalityApi::best_finalized` runtime method. + pub const []: &str = + stringify!([<$chain:camel FinalityApi_best_finalized>]); + + sp_api::decl_runtime_apis! { + /// API for querying information about the finalized chain headers. + /// + /// This API is implemented by runtimes that are receiving messages from this chain, not by this + /// chain's runtime itself. + pub trait [<$chain:camel FinalityApi>] { + /// Returns number and hash of the best finalized header known to the bridge module. + fn best_finalized() -> Option>; + } + } + } + + pub use [<$chain _finality_api>]::*; + } + }; +} + +/// Convenience macro that declares bridge messages runtime apis and related constants for a chain. +/// This includes: +/// - chain-specific bridge runtime APIs: +/// - `ToOutboundLaneApi` +/// - `FromInboundLaneApi` +/// - constants that are stringified names of runtime API methods: +/// - `FROM__MESSAGE_DETAILS_METHOD`, +/// The name of the chain has to be specified in snake case (e.g. `rialto_parachain`). +#[macro_export] +macro_rules! decl_bridge_messages_runtime_apis { + ($chain: ident) => { + bp_runtime::paste::item! { + mod [<$chain _messages_api>] { + use super::*; + + /// Name of the `ToOutboundLaneApi::message_details` runtime method. + pub const []: &str = + stringify!([]); + + /// Name of the `FromInboundLaneApi::message_details` runtime method. + pub const []: &str = + stringify!([]); + + sp_api::decl_runtime_apis! { + /// Outbound message lane API for messages that are sent to this chain. + /// + /// This API is implemented by runtimes that are receiving messages from this chain, not by this + /// chain's runtime itself. + pub trait [] { + /// Returns dispatch weight, encoded payload size and delivery+dispatch fee of all + /// messages in given inclusive range. + /// + /// If some (or all) messages are missing from the storage, they'll also will + /// be missing from the resulting vector. The vector is ordered by the nonce. + fn message_details( + lane: LaneId, + begin: MessageNonce, + end: MessageNonce, + ) -> Vec; + } + + /// Inbound message lane API for messages sent by this chain. + /// + /// This API is implemented by runtimes that are receiving messages from this chain, not by this + /// chain's runtime itself. + /// + /// Entries of the resulting vector are matching entries of the `messages` vector. Entries of the + /// `messages` vector may (and need to) be read using `ToOutboundLaneApi::message_details`. + pub trait [] { + /// Return details of given inbound messages. + fn message_details( + lane: LaneId, + messages: Vec<(MessagePayload, OutboundMessageDetails)>, + ) -> Vec; + } + } + } + + pub use [<$chain _messages_api>]::*; + } + }; +} + +/// Convenience macro that declares bridge finality runtime apis, bridge messages runtime apis +/// and related constants for a chain. +/// The name of the chain has to be specified in snake case (e.g. `rialto_parachain`). +#[macro_export] +macro_rules! decl_bridge_runtime_apis { + ($chain: ident) => { + bp_runtime::decl_bridge_finality_runtime_apis!($chain); + bp_runtime::decl_bridge_messages_runtime_apis!($chain); + }; +} diff --git a/bridges/primitives/runtime/src/extensions.rs b/bridges/primitives/runtime/src/extensions.rs new file mode 100644 index 00000000000..96ee9d1e6ec --- /dev/null +++ b/bridges/primitives/runtime/src/extensions.rs @@ -0,0 +1,144 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Primitives that may be used for creating signed extensions for indirect runtimes. + +use codec::{Compact, Decode, Encode}; +use impl_trait_for_tuples::impl_for_tuples; +use scale_info::{StaticTypeInfo, TypeInfo}; +use sp_runtime::{ + traits::{DispatchInfoOf, SignedExtension}, + transaction_validity::TransactionValidityError, +}; +use sp_std::{fmt::Debug, marker::PhantomData}; + +/// Trait that describes some properties of a `SignedExtension` that are needed in order to send a +/// transaction to the chain. +pub trait SignedExtensionSchema: Encode + Decode + Debug + Eq + Clone + StaticTypeInfo { + /// A type of the data encoded as part of the transaction. + type Payload: Encode + Decode + Debug + Eq + Clone + StaticTypeInfo; + /// Parameters which are part of the payload used to produce transaction signature, + /// but don't end up in the transaction itself (i.e. inherent part of the runtime). + type AdditionalSigned: Encode + Debug + Eq + Clone + StaticTypeInfo; +} + +// An implementation of `SignedExtensionSchema` using generic params. +#[derive(Encode, Decode, Clone, Debug, PartialEq, Eq, TypeInfo)] +pub struct GenericSignedExtensionSchema(PhantomData<(P, S)>); + +impl SignedExtensionSchema for GenericSignedExtensionSchema +where + P: Encode + Decode + Debug + Eq + Clone + StaticTypeInfo, + S: Encode + Debug + Eq + Clone + StaticTypeInfo, +{ + type Payload = P; + type AdditionalSigned = S; +} + +/// The `SignedExtensionSchema` for `frame_system::CheckNonZeroSender`. +pub type CheckNonZeroSender = GenericSignedExtensionSchema<(), ()>; + +/// The `SignedExtensionSchema` for `frame_system::CheckSpecVersion`. +pub type CheckSpecVersion = GenericSignedExtensionSchema<(), u32>; + +/// The `SignedExtensionSchema` for `frame_system::CheckTxVersion`. +pub type CheckTxVersion = GenericSignedExtensionSchema<(), u32>; + +/// The `SignedExtensionSchema` for `frame_system::CheckGenesis`. +pub type CheckGenesis = GenericSignedExtensionSchema<(), Hash>; + +/// The `SignedExtensionSchema` for `frame_system::CheckEra`. +pub type CheckEra = GenericSignedExtensionSchema; + +/// The `SignedExtensionSchema` for `frame_system::CheckNonce`. +pub type CheckNonce = GenericSignedExtensionSchema, ()>; + +/// The `SignedExtensionSchema` for `frame_system::CheckWeight`. +pub type CheckWeight = GenericSignedExtensionSchema<(), ()>; + +/// The `SignedExtensionSchema` for `pallet_transaction_payment::ChargeTransactionPayment`. +pub type ChargeTransactionPayment = GenericSignedExtensionSchema, ()>; + +/// The `SignedExtensionSchema` for `BridgeRejectObsoleteHeadersAndMessages`. +pub type BridgeRejectObsoleteHeadersAndMessages = GenericSignedExtensionSchema<(), ()>; + +/// The `SignedExtensionSchema` for `RefundBridgedParachainMessages`. +/// This schema is dedicated for `RefundBridgedParachainMessages` signed extension as +/// wildcard/placeholder, which relies on the scale encoding for `()` or `((), ())`, or `((), (), +/// ())` is the same. So runtime can contains any kind of tuple: +/// `(BridgeRefundBridgeHubRococoMessages)` +/// `(BridgeRefundBridgeHubRococoMessages, BridgeRefundBridgeHubWococoMessages)` +/// `(BridgeRefundParachainMessages1, ..., BridgeRefundParachainMessagesN)` +pub type RefundBridgedParachainMessagesSchema = GenericSignedExtensionSchema<(), ()>; + +#[impl_for_tuples(1, 12)] +impl SignedExtensionSchema for Tuple { + for_tuples!( type Payload = ( #( Tuple::Payload ),* ); ); + for_tuples!( type AdditionalSigned = ( #( Tuple::AdditionalSigned ),* ); ); +} + +/// A simplified version of signed extensions meant for producing signed transactions +/// and signed payloads in the client code. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +pub struct GenericSignedExtension { + pub payload: S::Payload, + #[codec(skip)] + // It may be set to `None` if extensions are decoded. We are never reconstructing transactions + // (and it makes no sense to do that) => decoded version of `SignedExtensions` is only used to + // read fields of the `payload`. And when resigning transaction, we're reconstructing + // `SignedExtensions` from the scratch. + additional_signed: Option, +} + +impl GenericSignedExtension { + pub fn new(payload: S::Payload, additional_signed: Option) -> Self { + Self { payload, additional_signed } + } +} + +impl SignedExtension for GenericSignedExtension +where + S: SignedExtensionSchema, + S::Payload: Send + Sync, + S::AdditionalSigned: Send + Sync, +{ + const IDENTIFIER: &'static str = "Not needed."; + type AccountId = (); + type Call = (); + type AdditionalSigned = S::AdditionalSigned; + type Pre = (); + + fn additional_signed(&self) -> Result { + // we shall not ever see this error in relay, because we are never signing decoded + // transactions. Instead we're constructing and signing new transactions. So the error code + // is kinda random here + self.additional_signed.clone().ok_or( + frame_support::unsigned::TransactionValidityError::Unknown( + frame_support::unsigned::UnknownTransaction::Custom(0xFF), + ), + ) + } + + fn pre_dispatch( + self, + _who: &Self::AccountId, + _call: &Self::Call, + _info: &DispatchInfoOf, + _len: usize, + ) -> Result { + Ok(()) + } +} diff --git a/bridges/primitives/runtime/src/lib.rs b/bridges/primitives/runtime/src/lib.rs new file mode 100644 index 00000000000..df77745bc02 --- /dev/null +++ b/bridges/primitives/runtime/src/lib.rs @@ -0,0 +1,573 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Primitives that may be used at (bridges) runtime level. + +#![cfg_attr(not(feature = "std"), no_std)] + +use codec::{Decode, Encode, FullCodec, MaxEncodedLen}; +use frame_support::{ + log, pallet_prelude::DispatchResult, weights::Weight, PalletError, RuntimeDebug, StorageHasher, + StorageValue, +}; +use frame_system::RawOrigin; +use scale_info::TypeInfo; +use sp_core::storage::StorageKey; +use sp_runtime::traits::{BadOrigin, Header as HeaderT, UniqueSaturatedInto}; +use sp_std::{convert::TryFrom, fmt::Debug, ops::RangeInclusive, vec, vec::Vec}; + +pub use chain::{ + AccountIdOf, AccountPublicOf, BalanceOf, BlockNumberOf, Chain, EncodedOrDecodedCall, HashOf, + HasherOf, HeaderOf, IndexOf, Parachain, SignatureOf, TransactionEraOf, UnderlyingChainOf, + UnderlyingChainProvider, +}; +pub use frame_support::storage::storage_prefix as storage_value_final_key; +use num_traits::{CheckedAdd, CheckedSub, One}; +pub use storage_proof::{ + record_all_keys as record_all_trie_keys, Error as StorageProofError, + ProofSize as StorageProofSize, RawStorageProof, StorageProofChecker, +}; +pub use storage_types::BoundedStorageValue; + +#[cfg(feature = "std")] +pub use storage_proof::craft_valid_storage_proof; + +pub mod extensions; +pub mod messages; + +mod chain; +mod storage_proof; +mod storage_types; + +// Re-export macro to aviod include paste dependency everywhere +pub use sp_runtime::paste; + +/// Use this when something must be shared among all instances. +pub const NO_INSTANCE_ID: ChainId = [0, 0, 0, 0]; + +/// Rialto chain id. +pub const RIALTO_CHAIN_ID: ChainId = *b"rlto"; + +/// RialtoParachain chain id. +pub const RIALTO_PARACHAIN_CHAIN_ID: ChainId = *b"rlpa"; + +/// Millau chain id. +pub const MILLAU_CHAIN_ID: ChainId = *b"mlau"; + +/// Polkadot chain id. +pub const POLKADOT_CHAIN_ID: ChainId = *b"pdot"; + +/// Kusama chain id. +pub const KUSAMA_CHAIN_ID: ChainId = *b"ksma"; + +/// Westend chain id. +pub const WESTEND_CHAIN_ID: ChainId = *b"wend"; + +/// Westend chain id. +pub const WESTMINT_CHAIN_ID: ChainId = *b"wmnt"; + +/// Rococo chain id. +pub const ROCOCO_CHAIN_ID: ChainId = *b"roco"; + +/// Wococo chain id. +pub const WOCOCO_CHAIN_ID: ChainId = *b"woco"; + +/// BridgeHubRococo chain id. +pub const BRIDGE_HUB_ROCOCO_CHAIN_ID: ChainId = *b"bhro"; + +/// BridgeHubWococo chain id. +pub const BRIDGE_HUB_WOCOCO_CHAIN_ID: ChainId = *b"bhwo"; + +/// BridgeHubKusama chain id. +pub const BRIDGE_HUB_KUSAMA_CHAIN_ID: ChainId = *b"bhks"; + +/// BridgeHubPolkadot chain id. +pub const BRIDGE_HUB_POLKADOT_CHAIN_ID: ChainId = *b"bhwo"; + +/// Generic header Id. +#[derive( + RuntimeDebug, + Default, + Clone, + Encode, + Decode, + Copy, + Eq, + Hash, + MaxEncodedLen, + PartialEq, + PartialOrd, + Ord, + TypeInfo, +)] +pub struct HeaderId(pub Number, pub Hash); + +impl HeaderId { + /// Return header number. + pub fn number(&self) -> Number { + self.0 + } + + /// Return header hash. + pub fn hash(&self) -> Hash { + self.1 + } +} + +/// Header id used by the chain. +pub type HeaderIdOf = HeaderId, BlockNumberOf>; + +/// Generic header id provider. +pub trait HeaderIdProvider { + // Get the header id. + fn id(&self) -> HeaderId; + + // Get the header id for the parent block. + fn parent_id(&self) -> Option>; +} + +impl HeaderIdProvider
for Header { + fn id(&self) -> HeaderId { + HeaderId(*self.number(), self.hash()) + } + + fn parent_id(&self) -> Option> { + self.number() + .checked_sub(&One::one()) + .map(|parent_number| HeaderId(parent_number, *self.parent_hash())) + } +} + +/// Unique identifier of the chain. +/// +/// In addition to its main function (identifying the chain), this type may also be used to +/// identify module instance. We have a bunch of pallets that may be used in different bridges. E.g. +/// messages pallet may be deployed twice in the same runtime to bridge ThisChain with Chain1 and +/// Chain2. Sometimes we need to be able to identify deployed instance dynamically. This type may be +/// used for that. +pub type ChainId = [u8; 4]; + +/// Anything that has size. +pub trait Size { + /// Return size of this object (in bytes). + fn size(&self) -> u32; +} + +impl Size for () { + fn size(&self) -> u32 { + 0 + } +} + +impl Size for Vec { + fn size(&self) -> u32 { + self.len() as _ + } +} + +/// Pre-computed size. +pub struct PreComputedSize(pub usize); + +impl Size for PreComputedSize { + fn size(&self) -> u32 { + u32::try_from(self.0).unwrap_or(u32::MAX) + } +} + +/// Era of specific transaction. +#[derive(RuntimeDebug, Clone, Copy, PartialEq)] +pub enum TransactionEra { + /// Transaction is immortal. + Immortal, + /// Transaction is valid for a given number of blocks, starting from given block. + Mortal(HeaderId, u32), +} + +impl, BlockHash: Copy> + TransactionEra +{ + /// Prepare transaction era, based on mortality period and current best block number. + pub fn new( + best_block_id: HeaderId, + mortality_period: Option, + ) -> Self { + mortality_period + .map(|mortality_period| TransactionEra::Mortal(best_block_id, mortality_period)) + .unwrap_or(TransactionEra::Immortal) + } + + /// Create new immortal transaction era. + pub fn immortal() -> Self { + TransactionEra::Immortal + } + + /// Returns mortality period if transaction is mortal. + pub fn mortality_period(&self) -> Option { + match *self { + TransactionEra::Immortal => None, + TransactionEra::Mortal(_, period) => Some(period), + } + } + + /// Returns era that is used by FRAME-based runtimes. + pub fn frame_era(&self) -> sp_runtime::generic::Era { + match *self { + TransactionEra::Immortal => sp_runtime::generic::Era::immortal(), + // `unique_saturated_into` is fine here - mortality `u64::MAX` is not something we + // expect to see on any chain + TransactionEra::Mortal(header_id, period) => + sp_runtime::generic::Era::mortal(period as _, header_id.0.unique_saturated_into()), + } + } + + /// Returns header hash that needs to be included in the signature payload. + pub fn signed_payload(&self, genesis_hash: BlockHash) -> BlockHash { + match *self { + TransactionEra::Immortal => genesis_hash, + TransactionEra::Mortal(header_id, _) => header_id.1, + } + } +} + +/// This is a copy of the +/// `frame_support::storage::generator::StorageMap::storage_map_final_key` for maps based +/// on selected hasher. +/// +/// We're using it because to call `storage_map_final_key` directly, we need access to the runtime +/// and pallet instance, which (sometimes) is impossible. +pub fn storage_map_final_key( + pallet_prefix: &str, + map_name: &str, + key: &[u8], +) -> StorageKey { + let key_hashed = H::hash(key); + let pallet_prefix_hashed = frame_support::Twox128::hash(pallet_prefix.as_bytes()); + let storage_prefix_hashed = frame_support::Twox128::hash(map_name.as_bytes()); + + let mut final_key = Vec::with_capacity( + pallet_prefix_hashed.len() + storage_prefix_hashed.len() + key_hashed.as_ref().len(), + ); + + final_key.extend_from_slice(&pallet_prefix_hashed[..]); + final_key.extend_from_slice(&storage_prefix_hashed[..]); + final_key.extend_from_slice(key_hashed.as_ref()); + + StorageKey(final_key) +} + +/// This is how a storage key of storage parameter (`parameter_types! { storage Param: bool = false; +/// }`) is computed. +/// +/// Copied from `frame_support::parameter_types` macro. +pub fn storage_parameter_key(parameter_name: &str) -> StorageKey { + let mut buffer = Vec::with_capacity(1 + parameter_name.len() + 1); + buffer.push(b':'); + buffer.extend_from_slice(parameter_name.as_bytes()); + buffer.push(b':'); + StorageKey(sp_io::hashing::twox_128(&buffer).to_vec()) +} + +/// This is how a storage key of storage value is computed. +/// +/// Copied from `frame_support::storage::storage_prefix`. +pub fn storage_value_key(pallet_prefix: &str, value_name: &str) -> StorageKey { + let pallet_hash = sp_io::hashing::twox_128(pallet_prefix.as_bytes()); + let storage_hash = sp_io::hashing::twox_128(value_name.as_bytes()); + + let mut final_key = vec![0u8; 32]; + final_key[..16].copy_from_slice(&pallet_hash); + final_key[16..].copy_from_slice(&storage_hash); + + StorageKey(final_key) +} + +/// Can be use to access the runtime storage key of a `StorageMap`. +pub trait StorageMapKeyProvider { + /// The name of the variable that holds the `StorageMap`. + const MAP_NAME: &'static str; + + /// The same as `StorageMap::Hasher1`. + type Hasher: StorageHasher; + /// The same as `StorageMap::Key1`. + type Key: FullCodec; + /// The same as `StorageMap::Value`. + type Value: FullCodec; + + /// This is a copy of the + /// `frame_support::storage::generator::StorageMap::storage_map_final_key`. + /// + /// We're using it because to call `storage_map_final_key` directly, we need access + /// to the runtime and pallet instance, which (sometimes) is impossible. + fn final_key(pallet_prefix: &str, key: &Self::Key) -> StorageKey { + storage_map_final_key::(pallet_prefix, Self::MAP_NAME, &key.encode()) + } +} + +/// Can be use to access the runtime storage key of a `StorageDoubleMap`. +pub trait StorageDoubleMapKeyProvider { + /// The name of the variable that holds the `StorageDoubleMap`. + const MAP_NAME: &'static str; + + /// The same as `StorageDoubleMap::Hasher1`. + type Hasher1: StorageHasher; + /// The same as `StorageDoubleMap::Key1`. + type Key1: FullCodec; + /// The same as `StorageDoubleMap::Hasher2`. + type Hasher2: StorageHasher; + /// The same as `StorageDoubleMap::Key2`. + type Key2: FullCodec; + /// The same as `StorageDoubleMap::Value`. + type Value: FullCodec; + + /// This is a copy of the + /// `frame_support::storage::generator::StorageDoubleMap::storage_double_map_final_key`. + /// + /// We're using it because to call `storage_double_map_final_key` directly, we need access + /// to the runtime and pallet instance, which (sometimes) is impossible. + fn final_key(pallet_prefix: &str, key1: &Self::Key1, key2: &Self::Key2) -> StorageKey { + let key1_hashed = Self::Hasher1::hash(&key1.encode()); + let key2_hashed = Self::Hasher2::hash(&key2.encode()); + let pallet_prefix_hashed = frame_support::Twox128::hash(pallet_prefix.as_bytes()); + let storage_prefix_hashed = frame_support::Twox128::hash(Self::MAP_NAME.as_bytes()); + + let mut final_key = Vec::with_capacity( + pallet_prefix_hashed.len() + + storage_prefix_hashed.len() + + key1_hashed.as_ref().len() + + key2_hashed.as_ref().len(), + ); + + final_key.extend_from_slice(&pallet_prefix_hashed[..]); + final_key.extend_from_slice(&storage_prefix_hashed[..]); + final_key.extend_from_slice(key1_hashed.as_ref()); + final_key.extend_from_slice(key2_hashed.as_ref()); + + StorageKey(final_key) + } +} + +/// Error generated by the `OwnedBridgeModule` trait. +#[derive(Encode, Decode, TypeInfo, PalletError)] +pub enum OwnedBridgeModuleError { + /// All pallet operations are halted. + Halted, +} + +/// Operating mode for a bridge module. +pub trait OperatingMode: Send + Copy + Debug + FullCodec { + // Returns true if the bridge module is halted. + fn is_halted(&self) -> bool; +} + +/// Basic operating modes for a bridges module (Normal/Halted). +#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +pub enum BasicOperatingMode { + /// Normal mode, when all operations are allowed. + Normal, + /// The pallet is halted. All operations (except operating mode change) are prohibited. + Halted, +} + +impl Default for BasicOperatingMode { + fn default() -> Self { + Self::Normal + } +} + +impl OperatingMode for BasicOperatingMode { + fn is_halted(&self) -> bool { + *self == BasicOperatingMode::Halted + } +} + +/// Bridge module that has owner and operating mode +pub trait OwnedBridgeModule { + /// The target that will be used when publishing logs related to this module. + const LOG_TARGET: &'static str; + + type OwnerStorage: StorageValue>; + type OperatingMode: OperatingMode; + type OperatingModeStorage: StorageValue; + + /// Check if the module is halted. + fn is_halted() -> bool { + Self::OperatingModeStorage::get().is_halted() + } + + /// Ensure that the origin is either root, or `PalletOwner`. + fn ensure_owner_or_root(origin: T::RuntimeOrigin) -> Result<(), BadOrigin> { + match origin.into() { + Ok(RawOrigin::Root) => Ok(()), + Ok(RawOrigin::Signed(ref signer)) + if Self::OwnerStorage::get().as_ref() == Some(signer) => + Ok(()), + _ => Err(BadOrigin), + } + } + + /// Ensure that the module is not halted. + fn ensure_not_halted() -> Result<(), OwnedBridgeModuleError> { + match Self::is_halted() { + true => Err(OwnedBridgeModuleError::Halted), + false => Ok(()), + } + } + + /// Change the owner of the module. + fn set_owner(origin: T::RuntimeOrigin, maybe_owner: Option) -> DispatchResult { + Self::ensure_owner_or_root(origin)?; + match maybe_owner { + Some(owner) => { + Self::OwnerStorage::put(&owner); + log::info!(target: Self::LOG_TARGET, "Setting pallet Owner to: {:?}", owner); + }, + None => { + Self::OwnerStorage::kill(); + log::info!(target: Self::LOG_TARGET, "Removed Owner of pallet."); + }, + } + + Ok(()) + } + + /// Halt or resume all/some module operations. + fn set_operating_mode( + origin: T::RuntimeOrigin, + operating_mode: Self::OperatingMode, + ) -> DispatchResult { + Self::ensure_owner_or_root(origin)?; + Self::OperatingModeStorage::put(operating_mode); + log::info!(target: Self::LOG_TARGET, "Setting operating mode to {:?}.", operating_mode); + Ok(()) + } +} + +/// All extra operations with weights that we need in bridges. +pub trait WeightExtraOps { + /// Checked division of individual components of two weights. + /// + /// Divides components and returns minimal division result. Returns `None` if one + /// of `other` weight components is zero. + fn min_components_checked_div(&self, other: Weight) -> Option; +} + +impl WeightExtraOps for Weight { + fn min_components_checked_div(&self, other: Weight) -> Option { + Some(sp_std::cmp::min( + self.ref_time().checked_div(other.ref_time())?, + self.proof_size().checked_div(other.proof_size())?, + )) + } +} + +/// Trait that provides a static `str`. +pub trait StaticStrProvider { + const STR: &'static str; +} + +#[macro_export] +macro_rules! generate_static_str_provider { + ($str:expr) => { + $crate::paste::item! { + pub struct []; + + impl $crate::StaticStrProvider for [] { + const STR: &'static str = stringify!($str); + } + } + }; +} + +#[derive(Encode, Decode, Clone, Eq, PartialEq, PalletError, TypeInfo)] +#[scale_info(skip_type_params(T))] +pub struct StrippableError { + _phantom_data: sp_std::marker::PhantomData, + #[codec(skip)] + #[cfg(feature = "std")] + message: String, +} + +impl From for StrippableError { + fn from(_err: T) -> Self { + Self { + _phantom_data: Default::default(), + #[cfg(feature = "std")] + message: format!("{:?}", _err), + } + } +} + +impl Debug for StrippableError { + #[cfg(feature = "std")] + fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + f.write_str(&self.message) + } + + #[cfg(not(feature = "std"))] + fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + f.write_str("Stripped error") + } +} + +/// A trait defining helper methods for `RangeInclusive` (start..=end) +pub trait RangeInclusiveExt { + /// Computes the length of the `RangeInclusive`, checking for underflow and overflow. + fn checked_len(&self) -> Option; +} + +impl RangeInclusiveExt for RangeInclusive +where + Idx: CheckedSub + CheckedAdd + One, +{ + fn checked_len(&self) -> Option { + self.end() + .checked_sub(self.start()) + .and_then(|len| len.checked_add(&Idx::one())) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn storage_parameter_key_works() { + assert_eq!( + storage_parameter_key("MillauToRialtoConversionRate"), + StorageKey(hex_literal::hex!("58942375551bb0af1682f72786b59d04").to_vec()), + ); + } + + #[test] + fn storage_value_key_works() { + assert_eq!( + storage_value_key("PalletTransactionPayment", "NextFeeMultiplier"), + StorageKey( + hex_literal::hex!( + "f0e954dfcca51a255ab12c60c789256a3f2edf3bdf381debe331ab7446addfdc" + ) + .to_vec() + ), + ); + } + + #[test] + fn generate_static_str_provider_works() { + generate_static_str_provider!(Test); + assert_eq!(StrTest::STR, "Test"); + } +} diff --git a/bridges/primitives/runtime/src/messages.rs b/bridges/primitives/runtime/src/messages.rs new file mode 100644 index 00000000000..9f7c8ab5ca4 --- /dev/null +++ b/bridges/primitives/runtime/src/messages.rs @@ -0,0 +1,35 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Primitives that may be used by different message delivery and dispatch mechanisms. + +use codec::{Decode, Encode}; +use frame_support::{weights::Weight, RuntimeDebug}; +use scale_info::TypeInfo; + +/// Message dispatch result. +#[derive(Encode, Decode, RuntimeDebug, Clone, PartialEq, Eq, TypeInfo)] +pub struct MessageDispatchResult { + /// Unspent dispatch weight. This weight that will be deducted from total delivery transaction + /// weight, thus reducing the transaction cost. This shall not be zero in (at least) two cases: + /// + /// 1) if message has been dispatched successfully, but post-dispatch weight is less than + /// the weight, declared by the message sender; + /// 2) if message has not been dispatched at all. + pub unspent_weight: Weight, + /// Fine-grained result of single message dispatch (for better diagnostic purposes) + pub dispatch_level_result: DispatchLevelResult, +} diff --git a/bridges/primitives/runtime/src/storage_proof.rs b/bridges/primitives/runtime/src/storage_proof.rs new file mode 100644 index 00000000000..09641376666 --- /dev/null +++ b/bridges/primitives/runtime/src/storage_proof.rs @@ -0,0 +1,272 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Logic for checking Substrate storage proofs. + +use crate::StrippableError; +use codec::{Decode, Encode}; +use frame_support::PalletError; +use hash_db::{HashDB, Hasher, EMPTY_PREFIX}; +use scale_info::TypeInfo; +use sp_std::{boxed::Box, collections::btree_set::BTreeSet, vec::Vec}; +use sp_trie::{ + read_trie_value, LayoutV1, MemoryDB, Recorder, StorageProof, Trie, TrieConfiguration, + TrieDBBuilder, TrieError, TrieHash, +}; + +/// Raw storage proof type (just raw trie nodes). +pub type RawStorageProof = Vec>; + +/// Storage proof size requirements. +/// +/// This is currently used by benchmarks when generating storage proofs. +#[derive(Clone, Copy, Debug)] +pub enum ProofSize { + /// The proof is expected to be minimal. If value size may be changed, then it is expected to + /// have given size. + Minimal(u32), + /// The proof is expected to have at least given size and grow by increasing value that is + /// stored in the trie. + HasLargeLeaf(u32), +} + +/// This struct is used to read storage values from a subset of a Merklized database. The "proof" +/// is a subset of the nodes in the Merkle structure of the database, so that it provides +/// authentication against a known Merkle root as well as the values in the +/// database themselves. +pub struct StorageProofChecker +where + H: Hasher, +{ + proof_nodes_count: usize, + root: H::Out, + db: MemoryDB, + recorder: Recorder>, +} + +impl StorageProofChecker +where + H: Hasher, +{ + /// Constructs a new storage proof checker. + /// + /// This returns an error if the given proof is invalid with respect to the given root. + pub fn new(root: H::Out, proof: RawStorageProof) -> Result { + // 1. we don't want extra items in the storage proof + // 2. `StorageProof` is storing all trie nodes in the `BTreeSet` + // + // => someone could simply add duplicate items to the proof and we won't be + // able to detect that by just using `StorageProof` + // + // => let's check it when we are converting our "raw proof" into `StorageProof` + let proof_nodes_count = proof.len(); + let proof = StorageProof::new(proof); + if proof_nodes_count != proof.iter_nodes().count() { + return Err(Error::DuplicateNodesInProof) + } + + let db = proof.into_memory_db(); + if !db.contains(&root, EMPTY_PREFIX) { + return Err(Error::StorageRootMismatch) + } + + let recorder = Recorder::default(); + let checker = StorageProofChecker { proof_nodes_count, root, db, recorder }; + Ok(checker) + } + + /// Returns error if the proof has some nodes that are left intact by previous `read_value` + /// calls. + pub fn ensure_no_unused_nodes(mut self) -> Result<(), Error> { + let visited_nodes = self + .recorder + .drain() + .into_iter() + .map(|record| record.data) + .collect::>(); + let visited_nodes_count = visited_nodes.len(); + if self.proof_nodes_count == visited_nodes_count { + Ok(()) + } else { + Err(Error::UnusedNodesInTheProof) + } + } + + /// Reads a value from the available subset of storage. If the value cannot be read due to an + /// incomplete or otherwise invalid proof, this function returns an error. + pub fn read_value(&mut self, key: &[u8]) -> Result>, Error> { + // LayoutV1 or LayoutV0 is identical for proof that only read values. + read_trie_value::, _>(&self.db, &self.root, key, Some(&mut self.recorder), None) + .map_err(|_| Error::StorageValueUnavailable) + } + + /// Reads and decodes a value from the available subset of storage. If the value cannot be read + /// due to an incomplete or otherwise invalid proof, this function returns an error. If value is + /// read, but decoding fails, this function returns an error. + pub fn read_and_decode_value(&mut self, key: &[u8]) -> Result, Error> { + self.read_value(key).and_then(|v| { + v.map(|v| T::decode(&mut &v[..]).map_err(|e| Error::StorageValueDecodeFailed(e.into()))) + .transpose() + }) + } + + /// Reads and decodes a value from the available subset of storage. If the value cannot be read + /// due to an incomplete or otherwise invalid proof, or if the value is `None`, this function + /// returns an error. If value is read, but decoding fails, this function returns an error. + pub fn read_and_decode_mandatory_value(&mut self, key: &[u8]) -> Result { + self.read_and_decode_value(key)?.ok_or(Error::StorageValueEmpty) + } + + /// Reads and decodes a value from the available subset of storage. If the value cannot be read + /// due to an incomplete or otherwise invalid proof, this function returns `Ok(None)`. + /// If value is read, but decoding fails, this function returns an error. + pub fn read_and_decode_opt_value(&mut self, key: &[u8]) -> Result, Error> { + match self.read_and_decode_value(key) { + Ok(outbound_lane_data) => Ok(outbound_lane_data), + Err(Error::StorageValueUnavailable) => Ok(None), + Err(e) => Err(e), + } + } +} + +/// Storage proof related errors. +#[derive(Encode, Decode, Clone, Eq, PartialEq, PalletError, Debug, TypeInfo)] +pub enum Error { + /// Duplicate trie nodes are found in the proof. + DuplicateNodesInProof, + /// Unused trie nodes are found in the proof. + UnusedNodesInTheProof, + /// Expected storage root is missing from the proof. + StorageRootMismatch, + /// Unable to reach expected storage value using provided trie nodes. + StorageValueUnavailable, + /// The storage value is `None`. + StorageValueEmpty, + /// Failed to decode storage value. + StorageValueDecodeFailed(StrippableError), +} + +/// Return valid storage proof and state root. +/// +/// NOTE: This should only be used for **testing**. +#[cfg(feature = "std")] +pub fn craft_valid_storage_proof() -> (sp_core::H256, RawStorageProof) { + use sp_state_machine::{backend::Backend, prove_read, InMemoryBackend}; + + let state_version = sp_runtime::StateVersion::default(); + + // construct storage proof + let backend = >::from(( + vec![ + (None, vec![(b"key1".to_vec(), Some(b"value1".to_vec()))]), + (None, vec![(b"key2".to_vec(), Some(b"value2".to_vec()))]), + (None, vec![(b"key3".to_vec(), Some(b"value3".to_vec()))]), + (None, vec![(b"key4".to_vec(), Some((42u64, 42u32, 42u16, 42u8).encode()))]), + // Value is too big to fit in a branch node + (None, vec![(b"key11".to_vec(), Some(vec![0u8; 32]))]), + ], + state_version, + )); + let root = backend.storage_root(std::iter::empty(), state_version).0; + let proof = + prove_read(backend, &[&b"key1"[..], &b"key2"[..], &b"key4"[..], &b"key22"[..]]).unwrap(); + + (root, proof.into_nodes().into_iter().collect()) +} + +/// Record all keys for a given root. +pub fn record_all_keys( + db: &DB, + root: &TrieHash, +) -> Result>> +where + DB: hash_db::HashDBRef, +{ + let mut recorder = Recorder::::new(); + let trie = TrieDBBuilder::::new(db, root).with_recorder(&mut recorder).build(); + for x in trie.iter()? { + let (key, _) = x?; + trie.get(&key)?; + } + + // recorder may record the same trie node multiple times and we don't want duplicate nodes + // in our proofs => let's deduplicate it by collecting to the BTreeSet first + Ok(recorder + .drain() + .into_iter() + .map(|n| n.data.to_vec()) + .collect::>() + .into_iter() + .collect()) +} + +#[cfg(test)] +pub mod tests { + use super::*; + use codec::Encode; + + #[test] + fn storage_proof_check() { + let (root, proof) = craft_valid_storage_proof(); + + // check proof in runtime + let mut checker = + >::new(root, proof.clone()).unwrap(); + assert_eq!(checker.read_value(b"key1"), Ok(Some(b"value1".to_vec()))); + assert_eq!(checker.read_value(b"key2"), Ok(Some(b"value2".to_vec()))); + assert_eq!(checker.read_value(b"key4"), Ok(Some((42u64, 42u32, 42u16, 42u8).encode()))); + assert_eq!(checker.read_value(b"key11111"), Err(Error::StorageValueUnavailable)); + assert_eq!(checker.read_value(b"key22"), Ok(None)); + assert_eq!(checker.read_and_decode_value(b"key4"), Ok(Some((42u64, 42u32, 42u16, 42u8))),); + assert!(matches!( + checker.read_and_decode_value::<[u8; 64]>(b"key4"), + Err(Error::StorageValueDecodeFailed(_)), + )); + + // checking proof against invalid commitment fails + assert_eq!( + >::new(sp_core::H256::random(), proof).err(), + Some(Error::StorageRootMismatch) + ); + } + + #[test] + fn proof_with_duplicate_items_is_rejected() { + let (root, mut proof) = craft_valid_storage_proof(); + proof.push(proof.first().unwrap().clone()); + + assert_eq!( + StorageProofChecker::::new(root, proof).map(drop), + Err(Error::DuplicateNodesInProof), + ); + } + + #[test] + fn proof_with_unused_items_is_rejected() { + let (root, proof) = craft_valid_storage_proof(); + + let mut checker = + StorageProofChecker::::new(root, proof.clone()).unwrap(); + checker.read_value(b"key1").unwrap(); + checker.read_value(b"key2").unwrap(); + checker.read_value(b"key4").unwrap(); + checker.read_value(b"key22").unwrap(); + assert_eq!(checker.ensure_no_unused_nodes(), Ok(())); + + let checker = StorageProofChecker::::new(root, proof).unwrap(); + assert_eq!(checker.ensure_no_unused_nodes(), Err(Error::UnusedNodesInTheProof)); + } +} diff --git a/bridges/primitives/runtime/src/storage_types.rs b/bridges/primitives/runtime/src/storage_types.rs new file mode 100644 index 00000000000..b37f779d00b --- /dev/null +++ b/bridges/primitives/runtime/src/storage_types.rs @@ -0,0 +1,90 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Wrapper for a runtime storage value that checks if value exceeds given maximum +//! during conversion. + +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::{traits::Get, RuntimeDebug}; +use scale_info::{Type, TypeInfo}; +use sp_std::{marker::PhantomData, ops::Deref}; + +/// Error that is returned when the value size exceeds maximal configured size. +#[derive(RuntimeDebug)] +pub struct MaximalSizeExceededError { + /// Size of the value. + pub value_size: usize, + /// Maximal configured size. + pub maximal_size: usize, +} + +/// A bounded runtime storage value. +#[derive(Clone, Decode, Encode, Eq, PartialEq)] +pub struct BoundedStorageValue { + value: V, + _phantom: PhantomData, +} + +impl sp_std::fmt::Debug for BoundedStorageValue { + fn fmt(&self, fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + self.value.fmt(fmt) + } +} + +impl, V: Encode> BoundedStorageValue { + /// Construct `BoundedStorageValue` from the underlying `value` with all required checks. + /// + /// Returns error if value size exceeds given bounds. + pub fn try_from_inner(value: V) -> Result { + // this conversion is heavy (since we do encoding here), so we may want to optimize it later + // (e.g. by introducing custom Encode implementation, and turning `BoundedStorageValue` into + // `enum BoundedStorageValue { Decoded(V), Encoded(Vec) }`) + let value_size = value.encoded_size(); + let maximal_size = B::get() as usize; + if value_size > maximal_size { + Err(MaximalSizeExceededError { value_size, maximal_size }) + } else { + Ok(BoundedStorageValue { value, _phantom: Default::default() }) + } + } + + /// Convert into the inner type + pub fn into_inner(self) -> V { + self.value + } +} + +impl Deref for BoundedStorageValue { + type Target = V; + + fn deref(&self) -> &Self::Target { + &self.value + } +} + +impl TypeInfo for BoundedStorageValue { + type Identity = Self; + + fn type_info() -> Type { + V::type_info() + } +} + +impl, V: Encode> MaxEncodedLen for BoundedStorageValue { + fn max_encoded_len() -> usize { + B::get() as usize + } +} diff --git a/bridges/primitives/test-utils/Cargo.toml b/bridges/primitives/test-utils/Cargo.toml new file mode 100644 index 00000000000..5ed835857d1 --- /dev/null +++ b/bridges/primitives/test-utils/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "bp-test-utils" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +bp-header-chain = { path = "../header-chain", default-features = false } +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +ed25519-dalek = { version = "1.0", default-features = false, features = ["u64_backend"] } +finality-grandpa = { version = "0.16.2", default-features = false } +sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "codec/std", + "ed25519-dalek/std", + "finality-grandpa/std", + "sp-application-crypto/std", + "sp-consensus-grandpa/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/bridges/primitives/test-utils/src/keyring.rs b/bridges/primitives/test-utils/src/keyring.rs new file mode 100644 index 00000000000..b1782109668 --- /dev/null +++ b/bridges/primitives/test-utils/src/keyring.rs @@ -0,0 +1,94 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Utilities for working with test accounts. + +use codec::Encode; +use ed25519_dalek::{Keypair, PublicKey, SecretKey, Signature}; +use finality_grandpa::voter_set::VoterSet; +use sp_consensus_grandpa::{AuthorityId, AuthorityList, AuthorityWeight}; +use sp_runtime::RuntimeDebug; +use sp_std::prelude::*; + +/// Set of test accounts with friendly names. +pub const ALICE: Account = Account(0); +pub const BOB: Account = Account(1); +pub const CHARLIE: Account = Account(2); +pub const DAVE: Account = Account(3); +pub const EVE: Account = Account(4); +pub const FERDIE: Account = Account(5); + +/// A test account which can be used to sign messages. +#[derive(RuntimeDebug, Clone, Copy)] +pub struct Account(pub u16); + +impl Account { + pub fn public(&self) -> PublicKey { + (&self.secret()).into() + } + + pub fn secret(&self) -> SecretKey { + let data = self.0.encode(); + let mut bytes = [0_u8; 32]; + bytes[0..data.len()].copy_from_slice(&data); + SecretKey::from_bytes(&bytes) + .expect("A static array of the correct length is a known good.") + } + + pub fn pair(&self) -> Keypair { + let mut pair: [u8; 64] = [0; 64]; + + let secret = self.secret(); + pair[..32].copy_from_slice(&secret.to_bytes()); + + let public = self.public(); + pair[32..].copy_from_slice(&public.to_bytes()); + + Keypair::from_bytes(&pair) + .expect("We expect the SecretKey to be good, so this must also be good.") + } + + pub fn sign(&self, msg: &[u8]) -> Signature { + use ed25519_dalek::Signer; + self.pair().sign(msg) + } +} + +impl From for AuthorityId { + fn from(p: Account) -> Self { + sp_application_crypto::UncheckedFrom::unchecked_from(p.public().to_bytes()) + } +} + +/// Get a valid set of voters for a Grandpa round. +pub fn voter_set() -> VoterSet { + VoterSet::new(authority_list()).unwrap() +} + +/// Convenience function to get a list of Grandpa authorities. +pub fn authority_list() -> AuthorityList { + test_keyring().iter().map(|(id, w)| (AuthorityId::from(*id), *w)).collect() +} + +/// Get the corresponding identities from the keyring for the "standard" authority set. +pub fn test_keyring() -> Vec<(Account, AuthorityWeight)> { + vec![(ALICE, 1), (BOB, 1), (CHARLIE, 1)] +} + +/// Get a list of "unique" accounts. +pub fn accounts(len: u16) -> Vec { + (0..len).map(Account).collect() +} diff --git a/bridges/primitives/test-utils/src/lib.rs b/bridges/primitives/test-utils/src/lib.rs new file mode 100644 index 00000000000..6bb4adbf450 --- /dev/null +++ b/bridges/primitives/test-utils/src/lib.rs @@ -0,0 +1,302 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +//! Utilities for testing runtime code. + +#![cfg_attr(not(feature = "std"), no_std)] + +use bp_header_chain::justification::{required_justification_precommits, GrandpaJustification}; +use codec::Encode; +use sp_consensus_grandpa::{AuthorityId, AuthoritySignature, AuthorityWeight, SetId}; +use sp_runtime::traits::{Header as HeaderT, One, Zero}; +use sp_std::prelude::*; + +// Re-export all our test account utilities +pub use keyring::*; + +mod keyring; + +pub const TEST_GRANDPA_ROUND: u64 = 1; +pub const TEST_GRANDPA_SET_ID: SetId = 1; + +/// Configuration parameters when generating test GRANDPA justifications. +#[derive(Clone)] +pub struct JustificationGeneratorParams { + /// The header which we want to finalize. + pub header: H, + /// The GRANDPA round number for the current authority set. + pub round: u64, + /// The current authority set ID. + pub set_id: SetId, + /// The current GRANDPA authority set. + /// + /// The size of the set will determine the number of pre-commits in our justification. + pub authorities: Vec<(Account, AuthorityWeight)>, + /// The total number of precommit ancestors in the `votes_ancestries` field our justification. + /// + /// These may be distributed among many forks. + pub ancestors: u32, + /// The number of forks. + /// + /// Useful for creating a "worst-case" scenario in which each authority is on its own fork. + pub forks: u32, +} + +impl Default for JustificationGeneratorParams { + fn default() -> Self { + let required_signatures = required_justification_precommits(test_keyring().len() as _); + Self { + header: test_header(One::one()), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: test_keyring().into_iter().take(required_signatures as _).collect(), + ancestors: 2, + forks: 1, + } + } +} + +/// Make a valid GRANDPA justification with sensible defaults +pub fn make_default_justification(header: &H) -> GrandpaJustification { + let params = JustificationGeneratorParams:: { header: header.clone(), ..Default::default() }; + + make_justification_for_header(params) +} + +/// Generate justifications in a way where we are able to tune the number of pre-commits +/// and vote ancestries which are included in the justification. +/// +/// This is useful for benchmarkings where we want to generate valid justifications with +/// a specific number of pre-commits (tuned with the number of "authorities") and/or a specific +/// number of vote ancestries (tuned with the "votes" parameter). +/// +/// Note: This needs at least three authorities or else the verifier will complain about +/// being given an invalid commit. +pub fn make_justification_for_header( + params: JustificationGeneratorParams, +) -> GrandpaJustification { + let JustificationGeneratorParams { header, round, set_id, authorities, mut ancestors, forks } = + params; + let (target_hash, target_number) = (header.hash(), *header.number()); + let mut votes_ancestries = vec![]; + let mut precommits = vec![]; + + assert!(forks != 0, "Need at least one fork to have a chain.."); + assert!( + forks as usize <= authorities.len(), + "If we have more forks than authorities we can't create valid pre-commits for all the forks." + ); + + // Roughly, how many vote ancestries do we want per fork + let target_depth = (ancestors + forks - 1) / forks; + + let mut unsigned_precommits = vec![]; + for i in 0..forks { + let depth = if ancestors >= target_depth { + ancestors -= target_depth; + target_depth + } else { + ancestors + }; + + // Note: Adding 1 to account for the target header + let chain = generate_chain(i, depth + 1, &header); + + // We don't include our finality target header in the vote ancestries + for child in &chain[1..] { + votes_ancestries.push(child.clone()); + } + + // The header we need to use when pre-commiting is the one at the highest height + // on our chain. + let precommit_candidate = chain.last().map(|h| (h.hash(), *h.number())).unwrap(); + unsigned_precommits.push(precommit_candidate); + } + + for (i, (id, _weight)) in authorities.iter().enumerate() { + // Assign authorities to sign pre-commits in a round-robin fashion + let target = unsigned_precommits[i % forks as usize]; + let precommit = signed_precommit::(id, target, round, set_id); + + precommits.push(precommit); + } + + GrandpaJustification { + round, + commit: finality_grandpa::Commit { target_hash, target_number, precommits }, + votes_ancestries, + } +} + +fn generate_chain(fork_id: u32, depth: u32, ancestor: &H) -> Vec { + let mut headers = vec![ancestor.clone()]; + + for i in 1..depth { + let parent = &headers[(i - 1) as usize]; + let (hash, num) = (parent.hash(), *parent.number()); + + let mut header = test_header::(num + One::one()); + header.set_parent_hash(hash); + + // Modifying the digest so headers at the same height but in different forks have different + // hashes + header.digest_mut().logs.push(sp_runtime::DigestItem::Other(fork_id.encode())); + + headers.push(header); + } + + headers +} + +/// Create signed precommit with given target. +pub fn signed_precommit( + signer: &Account, + target: (H::Hash, H::Number), + round: u64, + set_id: SetId, +) -> finality_grandpa::SignedPrecommit { + let precommit = finality_grandpa::Precommit { target_hash: target.0, target_number: target.1 }; + + let encoded = sp_consensus_grandpa::localized_payload( + round, + set_id, + &finality_grandpa::Message::Precommit(precommit.clone()), + ); + + let signature = signer.sign(&encoded); + let raw_signature: Vec = signature.to_bytes().into(); + + // Need to wrap our signature and id types that they match what our `SignedPrecommit` is + // expecting + let signature = AuthoritySignature::try_from(raw_signature).expect( + "We know our Keypair is good, + so our signature must also be good.", + ); + let id = (*signer).into(); + + finality_grandpa::SignedPrecommit { precommit, signature, id } +} + +/// Get a header for testing. +/// +/// The correct parent hash will be used if given a non-zero header. +pub fn test_header(number: H::Number) -> H { + let default = |num| { + H::new(num, Default::default(), Default::default(), Default::default(), Default::default()) + }; + + let mut header = default(number); + if number != Zero::zero() { + let parent_hash = default(number - One::one()).hash(); + header.set_parent_hash(parent_hash); + } + + header +} + +/// Convenience function for generating a Header ID at a given block number. +pub fn header_id(index: u8) -> (H::Hash, H::Number) { + (test_header::(index.into()).hash(), index.into()) +} + +#[macro_export] +/// Adds methods for testing the `set_owner()` and `set_operating_mode()` for a pallet. +/// Some values are hardcoded like: +/// - `run_test()` +/// - `Pallet::` +/// - `PalletOwner::` +/// - `PalletOperatingMode::` +/// While this is not ideal, all the pallets use the same names, so it works for the moment. +/// We can revisit this in the future if anything changes. +macro_rules! generate_owned_bridge_module_tests { + ($normal_operating_mode: expr, $halted_operating_mode: expr) => { + #[test] + fn test_set_owner() { + run_test(|| { + PalletOwner::::put(1); + + // The root should be able to change the owner. + assert_ok!(Pallet::::set_owner(RuntimeOrigin::root(), Some(2))); + assert_eq!(PalletOwner::::get(), Some(2)); + + // The owner should be able to change the owner. + assert_ok!(Pallet::::set_owner(RuntimeOrigin::signed(2), Some(3))); + assert_eq!(PalletOwner::::get(), Some(3)); + + // Other users shouldn't be able to change the owner. + assert_noop!( + Pallet::::set_owner(RuntimeOrigin::signed(1), Some(4)), + DispatchError::BadOrigin + ); + assert_eq!(PalletOwner::::get(), Some(3)); + }); + } + + #[test] + fn test_set_operating_mode() { + run_test(|| { + PalletOwner::::put(1); + PalletOperatingMode::::put($normal_operating_mode); + + // The root should be able to halt the pallet. + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::root(), + $halted_operating_mode + )); + assert_eq!(PalletOperatingMode::::get(), $halted_operating_mode); + // The root should be able to resume the pallet. + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::root(), + $normal_operating_mode + )); + assert_eq!(PalletOperatingMode::::get(), $normal_operating_mode); + + // The owner should be able to halt the pallet. + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::signed(1), + $halted_operating_mode + )); + assert_eq!(PalletOperatingMode::::get(), $halted_operating_mode); + // The owner should be able to resume the pallet. + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::signed(1), + $normal_operating_mode + )); + assert_eq!(PalletOperatingMode::::get(), $normal_operating_mode); + + // Other users shouldn't be able to halt the pallet. + assert_noop!( + Pallet::::set_operating_mode( + RuntimeOrigin::signed(2), + $halted_operating_mode + ), + DispatchError::BadOrigin + ); + assert_eq!(PalletOperatingMode::::get(), $normal_operating_mode); + // Other users shouldn't be able to resume the pallet. + PalletOperatingMode::::put($halted_operating_mode); + assert_noop!( + Pallet::::set_operating_mode( + RuntimeOrigin::signed(2), + $normal_operating_mode + ), + DispatchError::BadOrigin + ); + assert_eq!(PalletOperatingMode::::get(), $halted_operating_mode); + }); + } + }; +} diff --git a/bridges/rustfmt.toml b/bridges/rustfmt.toml new file mode 100644 index 00000000000..082150daf04 --- /dev/null +++ b/bridges/rustfmt.toml @@ -0,0 +1,24 @@ +# Basic +hard_tabs = true +max_width = 100 +use_small_heuristics = "Max" +# Imports +imports_granularity = "Crate" +reorder_imports = true +# Consistency +newline_style = "Unix" +# Format comments +comment_width = 100 +wrap_comments = true +# Misc +chain_width = 80 +spaces_around_ranges = false +binop_separator = "Back" +reorder_impl_items = false +match_arm_leading_pipes = "Preserve" +match_arm_blocks = false +match_block_trailing_comma = true +trailing_comma = "Vertical" +trailing_semicolon = false +use_field_init_shorthand = true + diff --git a/bridges/scripts/verify-pallets-build.sh b/bridges/scripts/verify-pallets-build.sh new file mode 100755 index 00000000000..dfee5341673 --- /dev/null +++ b/bridges/scripts/verify-pallets-build.sh @@ -0,0 +1,135 @@ +#!/bin/bash + +# A script to remove everything from bridges repository/subtree, except: +# +# - modules/grandpa; +# - modules/messages; +# - modules/parachains; +# - modules/relayers; +# - everything required from primitives folder. + +set -eux + +# show CLI help +function show_help() { + set +x + echo " " + echo Error: $1 + echo "Usage:" + echo " ./scripts/verify-pallets-build.sh Exit with code 0 if pallets code is well decoupled from the other code in the repo" + echo "Options:" + echo " --no-revert Leaves only runtime code on exit" + echo " --ignore-git-state Ignores git actual state" + exit 1 +} + +# parse CLI args +NO_REVERT= +IGNORE_GIT_STATE= +for i in "$@" +do + case $i in + --no-revert) + NO_REVERT=true + shift + ;; + --ignore-git-state) + IGNORE_GIT_STATE=true + shift + ;; + *) + show_help "Unknown option: $i" + ;; + esac +done + +# the script is able to work only on clean git copy, unless we want to ignore this check +[[ ! -z "${IGNORE_GIT_STATE}" ]] || [[ -z "$(git status --porcelain)" ]] || { echo >&2 "The git copy must be clean"; exit 1; } + +# let's avoid any restrictions on where this script can be called for - bridges repo may be +# plugged into any other repo folder. So the script (and other stuff that needs to be removed) +# may be located either in call dir, or one of it subdirs. +BRIDGES_FOLDER="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )/.." + +# let's leave repository/subtree in its original (clean) state if something fails below +function revert_to_clean_state { + [[ ! -z "${NO_REVERT}" ]] || { echo "Reverting to clean state..."; git checkout .; } +} +trap revert_to_clean_state EXIT + +# remove everything we think is not required for our needs +rm -rf $BRIDGES_FOLDER/.config +rm -rf $BRIDGES_FOLDER/.github +rm -rf $BRIDGES_FOLDER/.maintain +rm -rf $BRIDGES_FOLDER/bin/millau +rm -rf $BRIDGES_FOLDER/bin/rialto +rm -rf $BRIDGES_FOLDER/bin/rialto-parachain +rm -rf $BRIDGES_FOLDER/bin/.keep +rm -rf $BRIDGES_FOLDER/deployments +rm -f $BRIDGES_FOLDER/docs/dockerhub-* +rm -rf $BRIDGES_FOLDER/fuzz +rm -rf $BRIDGES_FOLDER/modules/beefy +rm -rf $BRIDGES_FOLDER/modules/shift-session-manager +rm -rf $BRIDGES_FOLDER/primitives/beefy +rm -rf $BRIDGES_FOLDER/primitives/chain-millau +rm -rf $BRIDGES_FOLDER/primitives/chain-rialto +rm -rf $BRIDGES_FOLDER/primitives/chain-rialto-parachain +rm -rf $BRIDGES_FOLDER/primitives/chain-westend +rm -rf $BRIDGES_FOLDER/relays +rm -rf $BRIDGES_FOLDER/scripts/add_license.sh +rm -rf $BRIDGES_FOLDER/scripts/build-containers.sh +rm -rf $BRIDGES_FOLDER/scripts/ci-cache.sh +rm -rf $BRIDGES_FOLDER/scripts/dump-logs.sh +rm -rf $BRIDGES_FOLDER/scripts/license_header +rm -rf $BRIDGES_FOLDER/scripts/regenerate_runtimes.sh +rm -rf $BRIDGES_FOLDER/scripts/send-message-from-millau-rialto.sh +rm -rf $BRIDGES_FOLDER/scripts/send-message-from-rialto-millau.sh +rm -rf $BRIDGES_FOLDER/scripts/update-weights.sh +rm -rf $BRIDGES_FOLDER/scripts/update-weights-setup.sh +rm -rf $BRIDGES_FOLDER/scripts/update_substrate.sh +rm -rf $BRIDGES_FOLDER/tools +rm -f $BRIDGES_FOLDER/.dockerignore +rm -f $BRIDGES_FOLDER/deny.toml +rm -f $BRIDGES_FOLDER/.gitlab-ci.yml +rm -f $BRIDGES_FOLDER/.editorconfig +rm -f $BRIDGES_FOLDER/Cargo.toml +rm -f $BRIDGES_FOLDER/ci.Dockerfile +rm -f $BRIDGES_FOLDER/CODEOWNERS +rm -f $BRIDGES_FOLDER/Dockerfile + +# let's fix Cargo.toml a bit (it'll be helpful if we are in the bridges repo) +if [[ ! -f "Cargo.toml" ]]; then + cat > Cargo.toml <<-CARGO_TOML + [workspace] + resolver = "2" + + members = [ + "bin/runtime-common", + "modules/*", + "primitives/*", + ] + CARGO_TOML +fi + +# let's test if everything we need compiles + +cargo check -p pallet-bridge-grandpa +cargo check -p pallet-bridge-grandpa --features runtime-benchmarks +cargo check -p pallet-bridge-grandpa --features try-runtime +cargo check -p pallet-bridge-messages +cargo check -p pallet-bridge-messages --features runtime-benchmarks +cargo check -p pallet-bridge-messages --features try-runtime +cargo check -p pallet-bridge-parachains +cargo check -p pallet-bridge-parachains --features runtime-benchmarks +cargo check -p pallet-bridge-parachains --features try-runtime +cargo check -p pallet-bridge-relayers +cargo check -p pallet-bridge-relayers --features runtime-benchmarks +cargo check -p pallet-bridge-relayers --features try-runtime +cargo check -p bridge-runtime-common +cargo check -p bridge-runtime-common --features runtime-benchmarks + +# we're removing lock file after all chechs are done. Otherwise we may use different +# Substrate/Polkadot/Cumulus commits and our checks will fail +rm -f $BRIDGES_FOLDER/Cargo.lock + +echo "OK" diff --git a/client/network/src/lib.rs b/client/network/src/lib.rs index 5a2043ab5f7..0c15ab3add5 100644 --- a/client/network/src/lib.rs +++ b/client/network/src/lib.rs @@ -303,9 +303,9 @@ where Ok(Validation::Success { is_new_best: true }) } else if block_number >= known_best_number { tracing::debug!( - target: LOG_TARGET, - "Validation failed because a justification is needed if the block at the top of the chain." - ); + target: LOG_TARGET, + "Validation failed because a justification is needed if the block at the top of the chain." + ); Ok(Validation::Failure { disconnect: false }) } else { diff --git a/scripts/bridges_update_subtree.sh b/scripts/bridges_update_subtree.sh new file mode 100755 index 00000000000..bd9161b601f --- /dev/null +++ b/scripts/bridges_update_subtree.sh @@ -0,0 +1,85 @@ +#!/bin/bash + +# A script to udpate bridges repo as subtree to Cumulus +# Usage: +# ./scripts/bridges_update_subtree.sh fetch +# ./scripts/bridges_update_subtree.sh patch +# ./scripts/bridges_update_subtree.sh merge + +set -e + +BRIDGES_BRANCH="${BRANCH:-master}" +BRIDGES_TARGET_DIR="${TARGET_DIR:-bridges}" + +function fetch() { + # the script is able to work only on clean git copy + [[ -z "$(git status --porcelain)" ]] || { + echo >&2 "The git copy must be clean (stash all your changes):"; + git status --porcelain + exit 1; + } + + local bridges_remote=$(git remote -v | grep "parity-bridges-common.git (fetch)" | head -n1 | awk '{print $1;}') + if [ -z "$bridges_remote" ]; then + echo "" + echo "Adding new remote: 'bridges' repo..." + echo "" + echo "... check your YubiKey ..." + git remote add -f bridges git@github.com:paritytech/parity-bridges-common.git + bridges_remote="bridges" + else + echo "" + echo "Fetching remote: '${bridges_remote}' repo..." + echo "" + echo "... check your YubiKey ..." + git fetch ${bridges_remote} --prune + fi + + echo "" + echo "Syncing/updating subtree with remote branch '${bridges_remote}/$BRIDGES_BRANCH' to target directory: '$BRIDGES_TARGET_DIR'" + echo "" + echo "... check your YubiKey ..." + git subtree pull --prefix=$BRIDGES_TARGET_DIR ${bridges_remote} $BRIDGES_BRANCH --squash +} + +function patch() { + echo "" + echo "Patching/removing unneeded stuff from subtree in target directory: '$BRIDGES_TARGET_DIR'" + $BRIDGES_TARGET_DIR/scripts/verify-pallets-build.sh --ignore-git-state --no-revert +} + +function merge() { + echo "" + echo "Merging stuff from subtree in target directory: '$BRIDGES_TARGET_DIR'" + + # stage all removed by patch: DU, MD, D, AD - only from subtree directory + git status -s | awk '$1 == "DU" || $1 == "D" || $1 == "MD" || $1 == "AD" {print $2}' | grep "^$BRIDGES_TARGET_DIR/" | xargs git rm -q --ignore-unmatch + + echo "" + echo "When all conflicts are resolved, do 'git merge --continue'" +} + +function amend() { + echo "" + echo "Amend stuff from subtree in target directory: '$BRIDGES_TARGET_DIR'" + git commit --amend -S -m "updating bridges subtree + remove extra folders" +} + +case "$1" in + fetch) + fetch + ;; + patch) + patch + ;; + merge) + merge + ;; + amend) + amend + ;; + all) + fetch + patch + ;; +esac \ No newline at end of file From aa1b87ce444b132bf0eec90af64f1b5a0136e1fe Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 4 May 2023 09:08:05 +0200 Subject: [PATCH 159/339] BridgeHub Rococo/Wococo runtimes (#2111) * Fixes * Fixes * Fixes * cargo fmt * Fixes * Fixes * Fixes * Fixes * Update BridgeHub runtime version * Fixes * Zombienet for bridge-hub setup * Fixes * Remove unused import * Fixes for gav-xcm-v3 (#1835) * Fix for FungiblesAdapter - trait changes: Contains -> AssetChecking * Fix for missing weight for `fn unpaid_execution()` * Used NonLocalMint for all NonZeroIssuance * Fix * Fixes * Fixes * Fixes * Fixes * Fixes * Fix tests * Fixes * Trying to fix sed expression? * Trying to fix sed expression? * Use the `relay-headers-and-messages` command (#1913) * Bridge hubs readme: fixes and additions * Use the relay-headers-and-messages command * cargo fmt * Fix README.md + zombienet * Parachain ID update of bridge-hub-wococo * Update bridge-hub-wococo chainspec * Squashed 'bridges/' content from commit 062554430 git-subtree-dir: bridges git-subtree-split: 0625544309ff299307f7e110f252f04eac383102 * Add SafeCallFilter * Add missing config items * Add TODO * Fixes (xcm Superuser + DispatchLevelResult) * Fix cargo * Change runtime version * Unit-tests for dispatch bridging messages and XCM routing on BridgeHubs + HRMP * Removed Sudo pallet * Use () as the PriceForParentDelivery * Fixes * Fixes * Fixes * Fixes * Update transact_origin to transact_origin_and_runtime_call * Add ReachableDest config item to XCM pallet * Add BridgeRejectObsoleteHeadersAndMessages to bridge hubs (#1972) * Update SafeCallFilter to allow remark_with_event in runtime benchmarks * cargo fmt * Update substrate * Fix worst_case_holding * Fix DMQ queue unit tests * Remove unused label * cargo fmt * Actually process incoming XCMs * Fixes * Fixes * Fixes * Fixes - return back Weightless * Simplify local run + readme * Added measured benchmarks for `pallet_xcm` (#1968) * Fix Fix Fix * Fix * Fixes for transact benchmark * Fixes add pallet_xcm to benchmarks * Revert remark_with_event * ".git/.scripts/bench-bot.sh" xcm statemine assets pallet_xcm_benchmarks::generic * Fixes * TMP * Fix for reserve_asset_deposited * ".git/.scripts/bench-bot.sh" pallet statemine assets pallet_xcm * Fix * ".git/.scripts/bench-bot.sh" pallet statemint assets pallet_xcm * Fix * ".git/.scripts/bench-bot.sh" pallet westmint assets pallet_xcm * Fix westmint * ".git/.scripts/bench-bot.sh" xcm statemine assets pallet_xcm_benchmarks::generic * Fix * ".git/.scripts/bench-bot.sh" xcm westmint assets pallet_xcm_benchmarks::generic * ".git/.scripts/bench-bot.sh" xcm statemint assets pallet_xcm_benchmarks::generic * ".git/.scripts/bench-bot.sh" pallet collectives-polkadot collectives pallet_xcm * Fix for collectives * ".git/.scripts/bench-bot.sh" pallet bridge-hub-kusama bridge-hubs pallet_xcm * ".git/.scripts/bench-bot.sh" pallet bridge-hub-rococo bridge-hubs pallet_xcm * Fixes for bridge-hubs * Fixes - return back Weightless * Fix - removed MigrateToTrackInactive for contracts-rococo Co-authored-by: command-bot <> * cargo fmt * Fix benchmarks * Bko gav xcm v3 (#1993) * Fix * ".git/.scripts/bench-bot.sh" xcm statemint assets pallet_xcm_benchmarks::fungible * ".git/.scripts/bench-bot.sh" xcm statemine assets pallet_xcm_benchmarks::fungible * ".git/.scripts/bench-bot.sh" xcm westmint assets pallet_xcm_benchmarks::fungible * ".git/.scripts/bench-bot.sh" xcm statemine assets pallet_xcm_benchmarks::generic * ".git/.scripts/bench-bot.sh" xcm statemint assets pallet_xcm_benchmarks::generic * ".git/.scripts/bench-bot.sh" xcm westmint assets pallet_xcm_benchmarks::generic * ".git/.scripts/bench-bot.sh" pallet statemine assets pallet_xcm * ".git/.scripts/bench-bot.sh" pallet westmint assets pallet_xcm * ".git/.scripts/bench-bot.sh" pallet statemint assets pallet_xcm * ".git/.scripts/bench-bot.sh" pallet collectives-polkadot collectives pallet_xcm * ".git/.scripts/bench-bot.sh" pallet bridge-hub-kusama bridge-hubs pallet_xcm * ".git/.scripts/bench-bot.sh" pallet bridge-hub-rococo bridge-hubs pallet_xcm Co-authored-by: command-bot <> * Change AllowUnpaidExecutionFrom to be explicit * Turn on more xcm logs for parachains * Added polkadot-parachain-mint binary instructions * xcm-v3 benchmarks, weights, fixes for bridge-hubs (#2035) * Dumy weights to get compile * Change UniversalLocation according to https://github.com/paritytech/polkadot/pull/4097 (Location Inversion Removed) * Fix bridge-hubs weights * ".git/.scripts/bench-bot.sh" pallet statemine assets pallet_xcm * ".git/.scripts/bench-bot.sh" pallet statemint assets pallet_xcm * ".git/.scripts/bench-bot.sh" pallet collectives-polkadot collectives pallet_xcm * ".git/.scripts/bench-bot.sh" pallet westmint assets pallet_xcm * ".git/.scripts/bench-bot.sh" xcm bridge-hub-kusama bridge-hubs pallet_xcm_benchmarks::generic * ".git/.scripts/bench-bot.sh" xcm bridge-hub-kusama bridge-hubs pallet_xcm_benchmarks::fungible * ".git/.scripts/bench-bot.sh" pallet bridge-hub-kusama bridge-hubs pallet_xcm * ".git/.scripts/bench-bot.sh" pallet bridge-hub-rococo bridge-hubs pallet_xcm * ".git/.scripts/bench-bot.sh" xcm bridge-hub-rococo bridge-hubs pallet_xcm_benchmarks::fungible * ".git/.scripts/bench-bot.sh" xcm bridge-hub-rococo bridge-hubs pallet_xcm_benchmarks::generic * Change NetworkId to Option Co-authored-by: command-bot <> Co-authored-by: Keith Yeung * remove shift session manager from bridge-hub-rococo (#2047) * remove shift session manager from bridge-hub-rococo * also remove from Cargo.toml * Add event for showing the hash of an UMP sent message (#1228) * Add UpwardMessageSent event in parachain-system * additional fixes * Message Id * Fix errors from merge * fmt * more fmt * Remove todo * more formatting * Fixes * Fixes * Fixes * Fixes * Updated README.md and scripts/bridges_rococo_wococo.sh for sending messages (local, live) * Allow explicit unpaid executions from the relay chains for system parachains (#2060) * Allow explicit unpaid executions from the relay chains for system parachains * Put origin-filtering barriers into WithComputedOrigin * Use ConstU32<8> * Small nits * formatting * cargo fmt * Align laneId to 00000001 * Allow receiving XCMs from any relay chain plurality * Fixes * Use Rococo/Wococo runtime APIs defined in bridge primitives (#2080) * Patched dependencies (polkadot, substrate) for xcm-v3 (compiles + tests work) * Replace serial_test and fix with thread_local * Very init of script for bumping bridges repo * Squashed 'bridges/' changes from 062554430..984749ba0 984749ba0 Define separate signed extension for BHR/BHW (#1776) 72b03d463 update Substrate/Polkadot/Cumulus deps to master (#1775) 3065c7903 Added crate-level docs for the parachains pallet (#1772) a0f41b2d8 added/updated pallet level docs to grandpa and messages pallets (#1771) 6d69d1f4d docs: add Security Policy doc (#1770) ff8c0f727 Fix cargo deny issues (#1769) 6fc931d07 Bump xcm-v3 + substrate (#1767) 5840197c3 Define method for checking message lane weights (#1766) 881af0219 increase MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX and MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX for RBH/WBH (#1765) 41d91e961 fixed receive_delivery_proof_for_two_messages_by_two_relayers (#1764) ac0cf7b78 Fix some cargo-deny issues (#1763) 6d9dc6367 `cargo machete` removed unused deps (#1761) c265b5430 Remove sp-version dependency from bin-substrate (#1758) 1327c9d97 Set `R/WococoBridgeHub` bundle runtime version (#1756) a3a2a06ae Expose relay version metric (#1750) 13f4a0164 Use indirect runtime calls for RialtoParachain (#1753) 9563f9eee fix nightly clippy again (#1752) 21b75b893 no-grafana-startup-delay option in run.sh (#1751) a5fe0dfc4 Remove TODO (#1749) 6c826a6c3 Deduplicate pallet call structs used for indirect runtime calls (#1744) e575269e5 fix nightly clippy (#1746) 209cba353 Update project level docs (#1734) b05cef5b4 Improve relayer initialization behaviour (#1743) c7b6bae9d Make debug display of LaneId compatible with its previous version (#1740) 221e4e80c Remove CliChain::KeyPair (#1741) 3d9d2907f Use TypedLaneId instead of LaneId (#1738) 6683b8136 Simplify read_client_state() (#1739) 3f7353b82 Expose metrics of on-demand relay chain headers sync from with-parachain complex relays (#1737) ab65d84e0 Handle `SIGTERM` for the docker containers + relay (#1735) b9050e90c Replace `BATCH_CALL_SUPPORTED` (#1733) c28b3ff66 Updated db weights and some experiments (#1732) 023689c6c Do not require new headers if lane is empty (#1725) bddf1fa19 remove messages pallet owner relay argument (#1728) ef55226c6 more traces + remove signer override (#1727) 4d50df6ed remove BatchDeliveryTransaction::new and BatchConfirmationTransaction::new to avoid expects (#1726) 15244e53e Batch transactions in complex relays (#1669) c209bb9ac fix pallet names at bridge hubs (#1722) 036e6696e tests (#1720) 3d56e2089 Check origin? (#1718) af9abbeb8 Remove SOURCE_PARACHAIN_PARA_ID (#1716) d1cb5d1a8 fix parachains benchmarks (#1717) 84bdf864b Changed docker image name for substrate-relay (#1714) 5698fb465 Remove WeightToFee (#1713) 9f4106bc1 Fix bridge hub rococo/wococo weights (#1712) 114b1502f Only store header state root (pallet-bridge-parachains) (#1701) 92e86f07b New relayer rewards scheme integration (#1652) 8649d12af Signed extension to refund relayer at the target chain (#1657) ec6bafaf0 DeliveryConfirmationPayments trait for paying relayer rewards at the source chain (#1653) fab2344f4 only store header state root (pallet-bridge-grandpa) (#1699) b5e916f64 fixed benchmarks of relayers pallet (#1700) 5cce3e86d fix clippy (#1698) f78e8867b removed MintReward and added PayLaneRewardFromAccount (#1693) 0c19db305 added version guards to RBH<>WBH GRANDPA finality (and complex) relay (#1697) c003b951d removed ESTIMATE_MESSAGE_FEE_METHOD (#1696) 4903b7929 refund_pay_dispatch_fee removed (#1695) 61c3b22ca Replace const parameters types (#1691) git-subtree-dir: bridges git-subtree-split: 984749ba021b5b8ec16f65cd1e50b234640d838b * Fixes after merge * Fixes * Use auto runtime version for local runs (#2113) * Squashed 'bridges/' changes from 984749ba0..fb3c5ef5d fb3c5ef5d Add integrity check for signed extensions (#1780) 3959628ff add try-runtime feature to pallets (#1779) be36ff00c Default impl for some methods in messages benchmarking pallet config (#1777) 68344e329 Relayer reward metric (#1742) 6b455597b Crate-level documentation on finality relays and relayers pallet (#1773) git-subtree-dir: bridges git-subtree-split: fb3c5ef5dae42553522c7eff37678de9bf4f6c67 * Fixed try-runtime * Fix cargo.lock * Fix BridgePalletIsNotInitialized (#2114) * Squashed 'bridges/' changes from fb3c5ef5d..e2e9fa7f9 e2e9fa7f9 Expose EXTRA_STORAGE_PROOF_SIZE in bp-bridge-hub-cumulus (#1788) ba85532b1 Removed unecesserry test + substrate/polkadot (#1787) git-subtree-dir: bridges git-subtree-split: e2e9fa7f94d2f105c1816402a9ae4b85bfc34145 * Fix cargo.toml * Squashed 'bridges/' changes from e2e9fa7f9..d5f95c14a d5f95c14a use wss to connect to the Rialto node in test deployments (#1809) 722d47b06 fix compilation a48732676 Bump sysinfo from 0.15.9 to 0.27.7 9a6e8bb1d Bump env_logger from 0.8.4 to 0.10.0 89c5e7981 Bump async-trait from 0.1.61 to 0.1.62 ddd0a5742 Bump fixed-hash from 0.7.0 to 0.8.0 e8b0b8192 Bump impl-serde from 0.3.2 to 0.4.0 c5227460f Bump jsonpath_lib from 0.2.6 to 0.3.0 9f4771d38 Bump parking_lot from 0.11.2 to 0.12.1 dab5d72ae Bump backoff from 0.2.1 to 0.4.0 d7dd3acce Bump strum from 0.21.0 to 0.24.1 c49799017 Bump tokio from 1.24.1 to 1.24.2 db614681e Bump clap from 4.1.0 to 4.1.1 3c155214d update ignored dependencies for dependabot (#1790) 4c791472c No wildcard patterns in Cargo.toml (#1789) 33632313d Remove chain-specific dependencies from crates that will be used in Cumulus (#1783) git-subtree-dir: bridges git-subtree-split: d5f95c14a2771d7ad51db95670d08a5d0da526a0 * Fix `send-remark-local` script because of new xcm-v3 * Refactor haul/dispatch xcm stuff * Add Rococo <> Wococo integrity tests (#1975) * Remove 1 integrity test In sync with https://github.com/paritytech/parity-bridges-common/pull/1816 * use TargetHeaderChainAdapter and SourceHeaderChainAdapter * Rococo <-> Wococo integrity tests * Add message lane weights tests * Add signed extension integrity test * Bridge benchmarks for bridge hub rococo/wococo (#2107) * fix benchmarks compilation and add bridges benchmarks (prototype) to RBH/WBH * post-merge fixes * remove duplicate "pallet-collator-selection/runtime-benchmarks" * ".git/.scripts/commands/bench/bench.sh" pallet bridge-hub-rococo bridge-hubs pallet_bridge_grandpa * ".git/.scripts/commands/bench/bench.sh" pallet bridge-hub-rococo bridge-hubs pallet_bridge_parachains * remove methods that are no longer required * fixed helpers used in bridge hub messages palelt benchmarks * unused imports * compilation * compilation * benchmarks-ci.sh * ".git/.scripts/commands/bench/bench.sh" pallet bridge-hub-rococo bridge-hubs pallet_bridge_messages * use generated weights in pallets configuration * add mod for new weights * impl WeightInfoExt Co-authored-by: command-bot <> * Ensure governance can call `initialize` with `xcm:Transact` bridge grandpa pallets * Just in case changed spec_version * Some scripts for enabling asset transfer on local statemine->westmint * script * Squashed 'bridges/' changes from d5f95c14a..b39cb0dea b39cb0dea MaxValues limit for storage maps in the pallet-bridge-grandpa (#1861) 11b3a611d fixed TODOs for weights v2 (#1860) 5a44f9fea Message delivery transaction is not free!!! (#1859) 59a42bd58 fixed BEEFY genesis (#1858) ab7c7ad0f Use parity-util-mem 0.12.0 (#1856) 8fd346e5a changed some tests for weights v2 (#1855) c438b9f74 Add separate Cargo.lock for `tools/runtime-codegen` (#1854) fc55a97d7 Fix `HeadersToKeep` and `MaxBridgedAuthorities` in Millau benchmarks (#1851) 72e64a3d7 Decrease number of GRANDPA authorities in Polkadot-like chains from 100_000 to 2_048 (#1852) d60a331ed Update Substrate/Polkadot/Cumulus dependencies + weights v2 (#1850) 61b229b65 Bump async-trait from 0.1.63 to 0.1.64 366333108 Bump serde_json from 1.0.91 to 1.0.92 (#1845) 4d917bb3a Bump trie-db from 0.24.0 to 0.25.0 8d919eac9 Bump anyhow from 1.0.68 to 1.0.69 ef9364dd0 Bump proc-macro2 from 1.0.49 to 1.0.51 9ddeebed5 Bump futures from 0.3.25 to 0.3.26 e02eb7573 connect using wss under flag condition (#1843) 99754a07f remove extra tracing on test deployments (#1842) bdb84cea6 Add tool for auto generating runtime code from metadata (#1812) 86662f263 fix bridge-runtime-common build (#1839) f656ac77d Change some macro names (#1837) 50f2980e9 Verify partial repo build on CI (#1832) f70f8231b fix bridge hubs blocks interval (#1836) ddbe5cddf [ci] change runners (#1833) 45a68ad39 Fix on demand parachains relay when no parachain head at target (#1834) 6dbce7258 Use GitLab env vars to get git commit (#1831) b1a8161e8 bump bridge hub versions (#1830) e909595e0 Use specific error for case when para head is missing from the bridge pallet (#1829) d517da8a2 Do not read parachain heads from ancient relay headers (#1827) 217bc72f5 Reconnect source client (#1826) 47bf5f693 Bump tokio from 1.24.2 to 1.25.0 6b307b48a Bump clap from 4.1.3 to 4.1.4 90bc29a17 Use named parameters for indirect calls (#1823) 986eeb556 Fix: typos (#1822) 450823b01 docs: fix broken link and minor nits (#1821) 3ed01ae31 do not call best_finalized_para_block_at_source for ancient block (#1819) 001956290 Functions to benchmark messages pallet with linked to parachain (#1817) e9b0a1c48 Remove InboundPayload check (#1816) 873ea4e40 Bump clap from 4.1.1 to 4.1.3 97eccaa8b also ignore the base xcm crate (#1798) 2d3dcd00b Update bundled runtime version for bridge hub r/wococo (#1814) 7167c0067 Bump bumpalo from 3.10.0 to 3.12.0 in /fuzz/storage-proof 067687520 Bump async-trait from 0.1.62 to 0.1.63 (#1811) git-subtree-dir: bridges git-subtree-split: b39cb0dea5751847ea73ab9946667003625eaf1a * Squashed 'bridges/' changes from b39cb0dea..4c4a7eae1 4c4a7eae1 Small stuff from Cumulus integration (#1865) git-subtree-dir: bridges git-subtree-split: 4c4a7eae1503aa63a84fb65d56d67599d362d645 * Squashed 'bridges/' changes from 4c4a7eae1..dcaec27aa dcaec27aa RefundRelayerForMessagesFromParachain improvements (#1879) 5457f0672 clippy fixes (#1880) 29e8a305c MaxValues for OutboundLanes map (#1871) 5219b56f8 More tests for message pallet weights (#1870) c4c0c7a1b Bump signal-hook from 0.3.14 to 0.3.15 0ff597b96 Bump serde_json from 1.0.92 to 1.0.93 1c5132eb1 Bump subxt from `20adb19` to `9e2acff` adb07816b update parachains relay doc (#1874) 972ef3133 Update README.md (#1872) 94648061b MaxValues for maps in parachain maps (#1868) 662267a6f "refund" proof size in GRANDPa pallet (#1863) git-subtree-dir: bridges git-subtree-split: dcaec27aaa6f41070fbdfbfd4fde2029697eb85f * Squashed 'bridges/' changes from dcaec27aa..91e66cfb9 91e66cfb9 Fix clippy issues (#1884) 0bd77f457 Reject storage proofs with unused nodes: begin (#1878) 77a3672f9 Refund extra proof bytes in message delivery transaction (#1864) git-subtree-dir: bridges git-subtree-split: 91e66cfb99c1a7b247e435515dd0f62b4058974e * Fix tests * Squashed 'bridges/' changes from 91e66cfb9..d39f563be d39f563be Make `weights::WeightInfo` pub (#1886) c67d06aa5 ChainWithGrandpa in primitives (#1885) git-subtree-dir: bridges git-subtree-split: d39f563bea57528c16763f458af3036842a0ea5f * Merge fix * Squashed 'bridges/' changes from d39f563be..78e3357c0 78e3357c0 RefundRelayerForMessagesFromParachain improvements (#1895) 131b17359 optimize justification before submit (#1887) 5bc279ebb use complex transactions on RBH/WBH bridge hubs (#1893) 8f0c09ab9 Bump clap from 4.1.4 to 4.1.6 66429b06a Bump sysinfo from 0.27.7 to 0.28.0 8b329ee8f Bump trie-db from 0.25.0 to 0.25.1 635cfccfd Bump time from 0.3.17 to 0.3.19 git-subtree-dir: bridges git-subtree-split: 78e3357c0387c95317b8c3e5c4d9316f3a9f3ef4 * Squashed 'bridges/' changes from 78e3357c0..5b5627e90 5b5627e90 Rewards refund for relaying BridgeHubRococo/BridgeHubWococo (#1894) git-subtree-dir: bridges git-subtree-split: 5b5627e9081640ed5691eb2891182843563fb99a * Rewards for relayers setup (#2194) * Rewards for relayers setup * ".git/.scripts/commands/bench/bench.sh" pallet bridge-hub-rococo bridge-hubs pallet_bridge_relayers * Setup weight for relayer * Setup `DeliveryConfirmationPayments` + `RefundRelayerForMessagesFromParachain` * No need to have more than one collator per parachain * Setup multi refund signed extensions * Rewards sign ext test * test * fixes --------- Co-authored-by: command-bot <> * Squashed 'bridges/' changes from 5b5627e90..3c15c3645 3c15c3645 get rid of ChainWithMessages::WeightInfo, because we can't have exact weights for "external chains" (#1899) 8ccaa0213 Wrap confirmation and finality transactions into batch_all in Millau -> RialtoParachain bridge (#1898) 9b7285edb Weight+size limits for bridge GRANDPA pallet calls (#1882) git-subtree-dir: bridges git-subtree-split: 3c15c36455f2ad944df6a492a8d82f7e0aaf7e9f * Squashed 'bridges/' changes from 3c15c3645..d05a98473 d05a98473 Refund messages confirmation tx (#1904) e2e8a7198 Relayers pallet: extend payment source id (#1907) cccf73b3f fix nightly clippy issues (#1915) a33a91e79 Bump tempfile from 3.3.0 to 3.4.0 1df768a2e Bump time from 0.3.17 to 0.3.20 cf17b424f Bump sysinfo from 0.28.0 to 0.28.1 0b6276b41 Bump jsonrpsee from 0.15.1 to 0.16.2 328dde02b Bump rand from 0.7.3 to 0.8.5 2f302a4b6 Bump trie-db from 0.25.1 to 0.26.0 b5d5d03ab CI add jobs to publish Docker images description to hub.docker.com (#1906) db5168f18 Do not stall on lost transaction (#1903) 2d83d6389 Fix init-bridge (#1900) git-subtree-dir: bridges git-subtree-split: d05a98473dc933cfed9e5f59023efa2ec811f03c * Rewards adjustments * Update RBH/WBH spec version * Squashed 'bridges/' changes from d05a98473..ce7cf9a49 ce7cf9a49 Removed deprecated `#[pallet::generate_store(pub(super) trait Store)]` according to latest Cumulus (#1964) 897b1c0b2 Bump substrate/polkadot/cumulus (#1962) 7b946da2d Backport xcm bridging extensions to the bridge repo (#1813) 88c1114ec Bump futures from 0.3.26 to 0.3.27 8668f73bf Bump serde from 1.0.152 to 1.0.155 3df8823e1 Bump subxt from `a7b45ef` to `d4545de` ef1b1bcd0 Some error improvements (#1956) 434c5e014 optimize justifications before they're included into complex transaction (#1949) 7bac365a6 Actually clone client data by reference when cloning the client (#1941) 764ddd4a8 remove lock file after checks are done (#1942) c18a758f8 Fix invalid messages relay delivery transactions (#1940) 8ad152b06 fix nightly benchmarks test (#1939) d451b4f84 Bump tokio from 1.25.0 to 1.26.0 8019c50aa Bump async-trait from 0.1.64 to 0.1.66 aa055fcee Bump serde_json from 1.0.93 to 1.0.94 ec2ef31c4 Bump subxt from `1c5faf3` to `a7b45ef` 20026366f Bump sysinfo from 0.28.1 to 0.28.2 fe246d1e3 Bump thiserror from 1.0.38 to 1.0.39 c95e0cf02 Fix deploy step in CI (#1931) 15b41c2dd Improve some relay errors readability (#1930) 792deae5e Added deploy Job (#1929) d86c3ce21 Reconnect on-demand clients from MessagesSource::reconnect and MessagesTarget::reconnect (#1927) 4161b51f0 get rid of obsolete weight functions (#1926) 9b3b00e0f cargo update -p clap@4.1.6 (#1925) 13ab28c37 Bump subxt from `9e2acff` to `1c5faf3` bb6171a05 Remove subxt dependency features (#1924) 66d200abb Verify with-parachain message benchmarks on CI (#1923) b6af2116f Update BHR and BHW spec version (#1922) d464e78d9 Fix benchmarks (#1919) 74574d53e fix master compilation (#1920) 1b373dff9 Fix multiple parachain headers submission for single message delivery (#1916) git-subtree-dir: bridges git-subtree-split: ce7cf9a4977fe614d35b6a7a84d5057e2c4ccaf5 * fixed npm install call (#2323) * New weights (#2315) * New weights * Fix compile benchmarks * Fix import * Fix all weights * Remove bridge_common_config replaced by bridges impl * Cargo.lock * fixed bridge pallets compilation * Cargo.lock * fix bridge pallets compilation after substrate+polkadot bump * BridgeHubs: XCM ExportMessage benchmark - just Rococo now * bench export_message() * include Bridge::haul_blob() weight in ExportMessage weight * fix import * more build fixes * Squashed 'bridges/' changes from ce7cf9a49..6343a7d37 6343a7d37 bump substrate+polkadot refs and fix builds (#1989) 8efc2b3cc Added receive_single_message_proof_with_dispatch benchmark (#1990) 6540f74dc Remove deprecated code from bridge-runtime-common (#1983) c4f368be3 minor cosmetic updates (#1985) bef11ac43 remove invalid weight, returned by send_message (#1984) 28cf5c957 Kusama <> Polkadot relay prototype (#1982) b195223d1 Bump serde from 1.0.156 to 1.0.157 70caa75d7 ignore binary-merkle-tree (#1980) 3dc640d30 Bump thiserror from 1.0.39 to 1.0.40 8a2729101 Bump subxt from `d4545de` to `ae63d3d` 40937e8a3 Bump clap from 4.1.8 to 4.1.11 d72394c4e Bump finality-grandpa from 0.16.1 to 0.16.2 54147603d Bump serde from 1.0.155 to 1.0.156 b513193e6 Bump anyhow from 1.0.69 to 1.0.70 20867abd9 Bump sysinfo from 0.28.2 to 0.28.3 4d9a45305 Bump async-trait from 0.1.66 to 0.1.67 8a88a7536 Bump trie-db from 0.26.0 to 0.27.1 0add06edd move signed extension stuff from prolkadot-core primitives to bridge-hub-cumulus-primitives (#1968) 7481ce6eb added UpdatedBestFinalizedHeader event to pallet-bridge-grandpa (#1967) 6787cd0cb RBH <> WBH dashboards and alerts (#1966) 036f7be76 enable relayer rewards metrics at bridge hubs (#1965) a3f07d5dd Fix invalid batch transaction (#1957) git-subtree-dir: bridges git-subtree-split: 6343a7d37c32191413be91afb537b8bc6c770285 * dispatch message weight for bridge messages (#2378) Co-authored-by: Svyatoslav Nikolsky * Fixes * Squashed 'bridges/' changes from 6343a7d37..c1d5990e8 c1d5990e8 Try check-rustdoc pipeline (#1782) git-subtree-dir: bridges git-subtree-split: c1d5990e840b8ee4981beb61a8099271ee629ae5 * Removed imports * Fix compile * fixed benchmarks compilation * fix rustdoc * Squashed 'bridges/' changes from c1d5990e8..ecddd4a31 ecddd4a31 Rust cargo doc for all features (#1995) e0997c14d Fix gitlab-check (#1994) 5284850ef Bump clap from 4.1.11 to 4.1.13 743cd60df Bump sysinfo from 0.28.3 to 0.28.4 dc322bae2 Bump async-trait from 0.1.67 to 0.1.68 git-subtree-dir: bridges git-subtree-split: ecddd4a315470d85135aafbdb96753af9b07b854 * Updated scripts for transfer assets * Cargo.lock * Script updates for `ping-via-bridge-from-statemine-rococo` * Added `transfer-asset-from-statemine-rococo` * Finished scripts * README.md * Compile fix + log xcm trace all * Initial version of bridges pallet as subtree of https://github.com/paritytech/parity-bridges-common Added `Bridges subtree files` pr review rule * Squashed 'bridges/' changes from ecddd4a31..d30927c08 d30927c08 Revert dispatch-results (#2048) fa454c3b4 Remove unneeded files (#2044) 956a2c687 Bump clap from 4.2.1 to 4.2.2 91951583a Bump serde_json from 1.0.95 to 1.0.96 fcf462051 Bump h2 from 0.3.16 to 0.3.17 in /tools/runtime-codegen b751fb24f Bump h2 from 0.3.16 to 0.3.17 0bf31ab78 update refs (#2041) a490ecbd3 Fix CI build (#2039) 01139ebbc Define `RangeInclusiveExt` (#2037) 2db2f3fe3 Impl review suggestions from #2021 (#2036) 36292760f fix build step on CI (#2034) 3a2311b7a refund extra weight in receive_messages_delivery_proof call (#2031) 77f1641d1 Boost message delivery transaction priority (#2023) c23c4e441 Reject delivery transactions with at least one obsolete message (#2021) 68ba699b7 Reintroduce msg dispatch status reporting (#2027) d1e852cc3 Bump hex-literal from 0.4.0 to 0.4.1 16f25d613 Relay node down alert (#2002) 4bb1a6406 only refund if all bundled messages have been delivered (#2019) b9acf52bc fail with InsufficientDispatchWeight if dispatch_weight doesn't cover weight of all bundled messages (#2018) e10097fe2 Remove unneeded error debug strings (#2017) f5e38f057 enable metrics on all validator nodes (#2016) c35f1a187 Bump scale-info from 2.4.0 to 2.5.0 04c56977c Bump clap from 4.1.13 to 4.2.1 481371f3c Bump hex-literal from 0.3.4 to 0.4.0 6b9c1400d Bump serde from 1.0.158 to 1.0.159 e71877a2e Bump futures from 0.3.27 to 0.3.28 c019f4faa Bump tempfile from 3.4.0 to 3.5.0 2e6e79ef6 Bump serde_json from 1.0.94 to 1.0.95 0698b1ff9 Bump tokio from 1.26.0 to 1.27.0 35b149830 fix test step on CI (#2003) 0c3acc858 cleanup removed lane traces (#2001) 8bf81749e bump BridgeHubRococo/BridgeHubWococo versions (#2000) e53bb7f36 MaxRequests -> MaxFreeMandatoryHeadersPerBlock in pallet-bridge-grandpa (#1997) dfcc09043 Run tests for `runtime-benchmarks` feature only (#1998) efcc8db17 Run benchmarks for mock runtimes (#1996) git-subtree-dir: bridges git-subtree-split: d30927c089bd9e73092d1ec1a62895603cb277a3 * Fixes * Squashed 'bridges/' content from commit d30927c08 git-subtree-dir: bridges git-subtree-split: d30927c089bd9e73092d1ec1a62895603cb277a3 * Updated REAMDE.md and BRIDGES.md (inspired by original https://github.com/paritytech/polkadot/blob/d22eb62fe40e55e15eb91d375f48cc540d83a47e/BRIDGES.md) * Squashed 'bridges/' changes from d30927c08..d3970944b d3970944b Small simplifications (#2050) git-subtree-dir: bridges git-subtree-split: d3970944b0cfc4ea5226225e1ca07dab234c3556 * Squashed 'bridges/' changes from d3970944b..2180797fb 2180797fb Removed CODEOWNERS (#2051) git-subtree-dir: bridges git-subtree-split: 2180797fbf8a990490c67853dcffd81bc8dd083c * Reused `teleports_for_native_asset_works` test to all bridge-hub runtime Extract runtime_para_id for test Fix test Typos Added helper for `execute_as_governance` * Added test case `initialize_bridge_by_governance_works` * Added test case `handle_export_message_from_system_parachain_to_outbound_queue_works` fix script Removed BridgeGrandpaRococoInstance * Added test-case `message_dispatch_routing_works` * Squashed 'bridges/' changes from 2180797fbf..4850aac8ce 4850aac8ce Removed relayer_account: &AccountId from MessageDispatch (#2080) 8c8adafd54 Revert "Fix max-size messages at test chains (#2064)" (#2077) c01a63efd8 Fixed off-by-one when confirming rewards in messages pallet (#2075) a298be96aa Update subxt dependencies (#2072) c0eef51eab Fix max-size messages at test chains (#2064) 3a658e3697 Messages relay fixes (#2073) 0022b5ab22 Slash relayers for invalid transactions (#2025) 198104007f Bump enumflags2 from 0.7.5 to 0.7.7 9229b257e5 [ci] Fix rules for docker build (#2069) 660d791390 [ci] Update buildah command and version (#2058) e4535c0ca4 fix the way latest_confirmed_nonce_at_source is "calculated" (#2067) dbc2d37590 select nothing if we have already selected nonces to submit or have submitted something (#2065) a7eedd21fe [relay-substrate-client] Bump jsonrpsee (#2066) 8875d5aeae Bump clap from 4.2.2 to 4.2.4 25f9cf55e2 Another use of RangeInclusiveExt::checked_len() (#2060) 4942c12a5f submit lane unblock transactions from relay (#2030) c0325d3c9c Test deployments fixes (#2057) fc7b9b7ed7 Use the new matrix server (#2056) 63bcb5c10b Fixed delivery alert rule (#2052) git-subtree-dir: bridges git-subtree-split: 4850aac8ce6c34e5ca6246b88cd14c873a879cba * Fmt * Squashed 'bridges/' changes from 4850aac8ce..66aaf0dd23 66aaf0dd23 Nits (#2083) git-subtree-dir: bridges git-subtree-split: 66aaf0dd239dde40b64264061a77c921e2c82568 * Cleaning * bridge-hub-rococo: minor fixes Signed-off-by: Adrian Catangiu * Squashed 'bridges/' changes from 66aaf0dd23..557ecbcecc 557ecbcecc Fix sized messages (Follow-up on #2064) (#2103) 54f587a066 Add weight of refund extension post_dispatch to the weights of messages pallet (#2089) 5b1626f8c4 fix pallet param for nightly benchmarks check (#2099) ae44c6b7a1 Add millau specific messages weights (#2097) 6ad0bd1f1e Add integrity tests to rialto parachain runtiime (#2096) 6919556de5 Bump tokio from 1.27.0 to 1.28.0 58795fcb75 Bump clap from 4.2.4 to 4.2.5 01bf31085b Bump scale-info from 2.5.0 to 2.6.0 8fe383240d Bump anyhow from 1.0.70 to 1.0.71 8d94e82ad5 deployments: add new BEEFY metrics and alarms (#2090) e9a4749e7e Bump wasmtime from 6.0.1 to 6.0.2 9d9936c0d9 Bump wasmtime from 6.0.1 to 6.0.2 in /tools/runtime-codegen 5d77cd7bee Add more logs to relayer and message pallets (#2082) 75fbb9d3ef Update comment (#2081) 9904d09cf6 Benchmarks for new relayers pallet calls (#2040) git-subtree-dir: bridges git-subtree-split: 557ecbcecc585547b744a5ac9fb8d7f3b9de4521 * fmt * Fix compile * Fix benchmark * Squashed 'bridges/' changes from 557ecbcecc..04b3dda6aa 04b3dda6aa Remove from subtree (#2111) f8ff15e7e7 Add `MessagesPalletInstance` for integrity tests (#2107) 92ccef58e6 Use generated runtimes for BHR/BHW (#2106) b33e0a585b Fix comment (#2105) git-subtree-dir: bridges git-subtree-split: 04b3dda6aa38599e612ff637710b6d2cff275ef3 * Fix * ".git/.scripts/commands/fmt/fmt.sh" * ".git/.scripts/commands/bench/bench.sh" pallet bridge-hub-rococo bridge-hubs pallet_bridge_grandpa * ".git/.scripts/commands/bench/bench.sh" pallet bridge-hub-rococo bridge-hubs pallet_bridge_parachains * ".git/.scripts/commands/bench/bench.sh" pallet bridge-hub-rococo bridge-hubs pallet_bridge_messages * ".git/.scripts/commands/bench/bench.sh" pallet bridge-hub-rococo bridge-hubs pallet_bridge_relayers --------- Signed-off-by: Adrian Catangiu Co-authored-by: Keith Yeung Co-authored-by: Anthony Lazam Co-authored-by: Serban Iorga Co-authored-by: Svyatoslav Nikolsky Co-authored-by: girazoki Co-authored-by: parity-processbot <> Co-authored-by: Serban Iorga Co-authored-by: acatangiu --- Cargo.lock | 118 +- pallets/parachain-system/src/lib.rs | 24 + parachains/chain-specs/bridge-hub-rococo.json | 2 +- parachains/chain-specs/bridge-hub-wococo.json | 2 +- .../runtimes/assets/test-utils/Cargo.toml | 2 + .../runtimes/assets/test-utils/src/lib.rs | 27 +- .../assets/test-utils/src/test_cases.rs | 6 +- parachains/runtimes/bridge-hubs/README.md | 231 +++- .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 44 +- .../src/bridge_hub_rococo_config.rs | 217 +++ .../src/bridge_hub_wococo_config.rs | 217 +++ .../bridge-hub-rococo/src/constants.rs | 1 + .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 605 ++++++-- .../bridge-hub-rococo/src/weights/mod.rs | 53 + ...et_bridge_grandpa_bridge_rococo_grandpa.rs | 80 ++ ...et_bridge_grandpa_bridge_wococo_grandpa.rs | 80 ++ ...ith_bridge_hub_rococo_messages_instance.rs | 232 ++++ ...ith_bridge_hub_wococo_messages_instance.rs | 232 ++++ ...untime_bridge_parachain_rococo_instance.rs | 114 ++ ...untime_bridge_parachain_wococo_instance.rs | 114 ++ .../src/weights/pallet_bridge_relayers.rs | 124 ++ .../bridge-hub-rococo/src/weights/xcm/mod.rs | 6 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 15 + .../bridge-hub-rococo/src/xcm_config.rs | 111 +- .../bridge-hub-rococo/tests/tests.rs | 227 ++- .../bridge-hubs/test-utils/Cargo.toml | 56 + .../bridge-hubs/test-utils/src/lib.rs | 1 + .../bridge-hubs/test-utils/src/test_cases.rs | 473 ++++++- .../src/chain_spec/bridge_hubs.rs | 51 +- scripts/bridges_rococo_wococo.sh | 673 +++++++++ scripts/bridges_update_subtree.sh | 2 +- scripts/generate_hex_encoded_call/index.js | 146 ++ .../package-lock.json | 1213 +++++++++++++++++ .../generate_hex_encoded_call/package.json | 11 + .../bridge_hub_rococo_local_network.toml | 104 ++ .../bridge_hub_wococo_local_network.toml | 104 ++ 36 files changed, 5557 insertions(+), 161 deletions(-) create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_rococo_config.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_wococo_config.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_rococo_grandpa.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_wococo_grandpa.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs create mode 100755 scripts/bridges_rococo_wococo.sh create mode 100644 scripts/generate_hex_encoded_call/index.js create mode 100644 scripts/generate_hex_encoded_call/package-lock.json create mode 100644 scripts/generate_hex_encoded_call/package.json create mode 100644 zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml create mode 100644 zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml diff --git a/Cargo.lock b/Cargo.lock index 390402ce88a..e8e2fab6596 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -384,6 +384,7 @@ name = "asset-test-utils" version = "1.0.0" dependencies = [ "assets-common", + "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", "cumulus-pallet-xcmp-queue", "cumulus-primitives-core", @@ -758,6 +759,44 @@ dependencies = [ "thiserror", ] +[[package]] +name = "bp-bridge-hub-cumulus" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "frame-system", + "polkadot-primitives", + "sp-api", + "sp-std", +] + +[[package]] +name = "bp-bridge-hub-rococo" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std", +] + +[[package]] +name = "bp-bridge-hub-wococo" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std", +] + [[package]] name = "bp-header-chain" version = "0.1.0" @@ -841,6 +880,17 @@ dependencies = [ "sp-std", ] +[[package]] +name = "bp-rococo" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", +] + [[package]] name = "bp-runtime" version = "0.1.0" @@ -877,6 +927,18 @@ dependencies = [ "sp-std", ] +[[package]] +name = "bp-wococo" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-rococo", + "bp-runtime", + "frame-support", + "sp-api", +] + [[package]] name = "bridge-hub-kusama-runtime" version = "0.1.0" @@ -1007,7 +1069,17 @@ dependencies = [ name = "bridge-hub-rococo-runtime" version = "0.1.0" dependencies = [ + "bp-bridge-hub-rococo", + "bp-bridge-hub-wococo", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-relayers", + "bp-rococo", + "bp-runtime", + "bp-wococo", "bridge-hub-test-utils", + "bridge-runtime-common", "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", @@ -1029,6 +1101,10 @@ dependencies = [ "pallet-aura", "pallet-authorship", "pallet-balances", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-bridge-relayers", "pallet-collator-selection", "pallet-multisig", "pallet-session", @@ -1060,6 +1136,7 @@ dependencies = [ "sp-std", "sp-transaction-pool", "sp-version", + "static_assertions", "substrate-wasm-builder", "xcm", "xcm-builder", @@ -1071,6 +1148,32 @@ name = "bridge-hub-test-utils" version = "0.1.0" dependencies = [ "asset-test-utils", + "bp-header-chain", + "bp-messages", + "bp-polkadot-core", + "bp-runtime", + "bp-test-utils", + "bridge-runtime-common", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcmp-queue", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-collator-selection", + "pallet-session", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parachain-info", + "parity-scale-codec", + "sp-io", + "sp-runtime", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -4318,6 +4421,15 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + [[package]] name = "hermit-abi" version = "0.3.1" @@ -6229,11 +6341,11 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi 0.2.6", "libc", ] diff --git a/pallets/parachain-system/src/lib.rs b/pallets/parachain-system/src/lib.rs index ac3b8648c65..4025368904b 100644 --- a/pallets/parachain-system/src/lib.rs +++ b/pallets/parachain-system/src/lib.rs @@ -1042,6 +1042,30 @@ impl Pallet { pub fn set_custom_validation_head_data(head_data: Vec) { CustomValidationHeadData::::put(head_data); } + + /// Open HRMP channel for using it in benchmarks. + /// + /// The caller assumes that the pallet will accept regular outbound message to the sibling + /// `target_parachain` after this call. No other assumptions are made. + #[cfg(feature = "runtime-benchmarks")] + pub fn open_outbound_hrmp_channel_for_benchmarks(target_parachain: ParaId) { + RelevantMessagingState::::put(MessagingStateSnapshot { + dmq_mqc_head: Default::default(), + relay_dispatch_queue_size: Default::default(), + ingress_channels: Default::default(), + egress_channels: vec![( + target_parachain, + cumulus_primitives_core::AbridgedHrmpChannel { + max_capacity: 10, + max_total_size: 10_000_000_u32, + max_message_size: 10_000_000_u32, + msg_count: 5, + total_size: 5_000_000_u32, + mqc_head: None, + }, + )], + }) + } } pub struct ParachainSetCode(sp_std::marker::PhantomData); diff --git a/parachains/chain-specs/bridge-hub-rococo.json b/parachains/chain-specs/bridge-hub-rococo.json index 999837a5a42..ff20d8fb482 100644 --- a/parachains/chain-specs/bridge-hub-rococo.json +++ b/parachains/chain-specs/bridge-hub-rococo.json @@ -82,4 +82,4 @@ "childrenDefault": {} } } -} \ No newline at end of file +} diff --git a/parachains/chain-specs/bridge-hub-wococo.json b/parachains/chain-specs/bridge-hub-wococo.json index 06837cc0d63..7024789b8cc 100644 --- a/parachains/chain-specs/bridge-hub-wococo.json +++ b/parachains/chain-specs/bridge-hub-wococo.json @@ -86,4 +86,4 @@ "childrenDefault": {} } } -} \ No newline at end of file +} diff --git a/parachains/runtimes/assets/test-utils/Cargo.toml b/parachains/runtimes/assets/test-utils/Cargo.toml index 2a9e70ce2dd..8a1ce0e6e3c 100644 --- a/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/parachains/runtimes/assets/test-utils/Cargo.toml @@ -23,6 +23,7 @@ sp-core = { git = "https://github.com/paritytech/substrate", default-features = # Cumulus cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } +cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } @@ -69,4 +70,5 @@ std = [ "xcm-executor/std", "pallet-xcm/std", "cumulus-pallet-xcmp-queue/std", + "cumulus-pallet-dmp-queue/std", ] diff --git a/parachains/runtimes/assets/test-utils/src/lib.rs b/parachains/runtimes/assets/test-utils/src/lib.rs index 06d6282e008..1e0b31f18a3 100644 --- a/parachains/runtimes/assets/test-utils/src/lib.rs +++ b/parachains/runtimes/assets/test-utils/src/lib.rs @@ -16,7 +16,7 @@ use sp_core::Encode; use sp_runtime::{Digest, DigestItem}; use xcm::{ latest::{MultiAsset, MultiLocation, XcmContext, XcmHash}, - prelude::{Concrete, Fungible, Outcome, XcmError, XcmVersion}, + prelude::*, }; use xcm_executor::{traits::TransactAsset, Assets}; @@ -252,6 +252,31 @@ impl Runt } } +impl + RuntimeHelper +{ + pub fn execute_as_governance(call: Vec, require_weight_at_most: Weight) -> Outcome { + // prepare xcm as governance will do + let xcm = Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + Transact { + origin_kind: OriginKind::Superuser, + require_weight_at_most, + call: call.into(), + }, + ]); + + // execute xcm as parent origin + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + <::XcmExecutor>::execute_xcm( + MultiLocation::parent(), + xcm, + hash, + Self::xcm_max_weight(XcmReceivedFrom::Parent), + ) + } +} + pub enum XcmReceivedFrom { Parent, Sibling, diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 3fd27940aea..954ff0d7589 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1096,7 +1096,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor additional_checks_before(); // execute XCM with Transacts to create/manage foreign assets by foreign governance - // prepapre data for xcm::Transact(create) + // prepare data for xcm::Transact(create) let foreign_asset_create = runtime_call_encode(pallet_assets::Call::< Runtime, ForeignAssetsPalletInstance, @@ -1106,7 +1106,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor admin: foreign_creator_as_account_id.clone().into(), min_balance: 1.into(), }); - // prepapre data for xcm::Transact(set_metadata) + // prepare data for xcm::Transact(set_metadata) let foreign_asset_set_metadata = runtime_call_encode(pallet_assets::Call::< Runtime, ForeignAssetsPalletInstance, @@ -1116,7 +1116,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor symbol: Vec::from(ASSET_SYMBOL), decimals: 12, }); - // prepapre data for xcm::Transact(set_team - change just freezer to Bob) + // prepare data for xcm::Transact(set_team - change just freezer to Bob) let foreign_asset_set_team = runtime_call_encode(pallet_assets::Call::< Runtime, ForeignAssetsPalletInstance, diff --git a/parachains/runtimes/bridge-hubs/README.md b/parachains/runtimes/bridge-hubs/README.md index 79e82f3497a..9b024769195 100644 --- a/parachains/runtimes/bridge-hubs/README.md +++ b/parachains/runtimes/bridge-hubs/README.md @@ -1,32 +1,228 @@ -# Bridge-hubs Parachain +- [Bridge-hub Parachains](#bridge-hub-parachains) + * [How to test locally Rococo <-> Wococo](#how-to-test-locally-rococo-----wococo) + + [Prepare/Build/Deploy](#prepare-build-deploy) + + [Run chains (Rococo + BridgeHub, Wococo + BridgeHub) with zombienet](#run-chains--rococo---bridgehub--wococo---bridgehub--with-zombienet) + + [Run relayers (Rococo, Wococo)](#run-relayers--rococo--wococo-) + - [Run with script (alternative 1)](#run-with-script--alternative-1-) + - [Run with binary (alternative 2)](#run-with-binary--alternative-2-) + + [Send messages](#send-messages) + - [Local zombienet run](#local-zombienet-run) + - [Live Rockmine2 to Wockmint](#live-rockmine2-to-wockmint) + * [How to test local BridgeHubKusama](#how-to-test-local-bridgehubkusama) + * [How to test local BridgeHubPolkadot](#how-to-test-local-bridgehubpolkadot) -Implementation of _BridgeHub_, a blockchain to support message passing between Substrate based chains like Polkadot and Kusama networks. +# Bridge-hub Parachains -_BridgeHub_ allows users to: - -- Passing arbitrary messages between different Substrate chains (Polkadot <-> Kusama). - -- Message passing is - -_BridgeHub_ is meant to be **_system parachain_** with main responsibilities: -- sync finality proofs between relay chains +_BridgeHub(s)_ are **_system parachains_** that will house trustless bridges from the local +ecosystem to others. +The current trustless bridges planned for the BridgeHub(s) are: +- `BridgeHubPolkadot` system parachain: + 1. Polkadot <-> Kusama bridge + 2. Polkadot <-> Ethereum bridge (Snowbridge) +- `BridgeHubKusama` system parachain: + 1. Kusama <-> Polkadot bridge + 2. Kusama <-> Ethereum bridge + The high-level responsibilities of each bridge living on BridgeHub: +- sync finality proofs between relay chains (or equivalent) - sync finality proofs between BridgeHub parachains - pass (XCM) messages between different BridgeHub parachains ![](./docs/bridge-hub-parachain-design.jpg "Basic deployment setup") -## How to try locally +## How to test locally Rococo <-> Wococo + +### Prepare/Build/Deploy +``` +# Prepare empty directory for testing +mkdir -p ~/local_bridge_testing/bin +mkdir -p ~/local_bridge_testing/logs + +# 1. Install zombienet +Go to: https://github.com/paritytech/zombienet/releases +Copy the apropriate binary (zombienet-linux) from the latest release to ~/local_bridge_testing/bin + +# 2. Build polkadot binary +git clone https://github.com/paritytech/polkadot.git +cd polkadot +cargo build --release +cp target/release/polkadot ~/local_bridge_testing/bin/polkadot + +# 3. Build cumulus polkadot-parachain binary +cd +# checkout desired branch or use master: +# git checkout -b bridge-hub-rococo-wococo --track origin/bridge-hub-rococo-wococo +git checkout -b master --track origin/master +cargo build --release --locked -p polkadot-parachain-bin +cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain +cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain-mint + +# 4. Build substrate-relay binary +git clone https://github.com/paritytech/parity-bridges-common.git +cd parity-bridges-common +cargo build --release -p substrate-relay +cp target/release/substrate-relay ~/local_bridge_testing/bin/substrate-relay + +# (Optional) 5. Build polkadot-parachain-mint binary with statemine/westmint for moving assets +cd +git checkout -b bko-transfer-asset-via-bridge --track origin/bko-transfer-asset-via-bridge +cargo build --release --locked -p polkadot-parachain-bin +cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain-mint +``` + +### Run chains (Rococo + BridgeHub, Wococo + BridgeHub) with zombienet + +``` +# Rococo + BridgeHubRococo + Rockmine (mirroring Kusama) +POLKADOT_BINARY_PATH=~/local_bridge_testing/bin/polkadot \ +POLKADOT_PARACHAIN_BINARY_PATH=~/local_bridge_testing/bin/polkadot-parachain \ +POLKADOT_PARACHAIN_BINARY_PATH_FOR_ROCKMINE=~/local_bridge_testing/bin/polkadot-parachain-mint \ + ~/local_bridge_testing/bin/zombienet-linux --provider native spawn ./zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml +``` + +``` +# Wococo + BridgeHubWococo + Wockmint (mirroring Polkadot) +POLKADOT_BINARY_PATH=~/local_bridge_testing/bin/polkadot \ +POLKADOT_PARACHAIN_BINARY_PATH=~/local_bridge_testing/bin/polkadot-parachain \ +POLKADOT_PARACHAIN_BINARY_PATH_FOR_WOCKMINT=~/local_bridge_testing/bin/polkadot-parachain-mint \ + ~/local_bridge_testing/bin/zombienet-linux --provider native spawn ./zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml +``` + +### Run relayers (Rococo, Wococo) + +**Accounts of BridgeHub parachains:** +- `Bob` is pallet owner of all bridge pallets + +#### Run with script (alternative 1) +``` +cd +./scripts/bridges_rococo_wococo.sh run-relay +``` + +#### Run with binary (alternative 2) +Need to wait for parachain activation (start producing blocks), then run: + +``` +# 1. Init bridges: + +# Rococo -> Wococo +RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + ~/local_bridge_testing/bin/substrate-relay init-bridge rococo-to-bridge-hub-wococo \ + --source-host localhost \ + --source-port 9942 \ + --source-version-mode Auto \ + --target-host localhost \ + --target-port 8945 \ + --target-version-mode Auto \ + --target-signer //Bob + +# Wococo -> Rococo +RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + ~/local_bridge_testing/bin/substrate-relay init-bridge wococo-to-bridge-hub-rococo \ + --source-host localhost \ + --source-port 9945 \ + --source-version-mode Auto \ + --target-host localhost \ + --target-port 8943 \ + --target-version-mode Auto \ + --target-signer //Bob + +# 2. Relay relay-chain headers, parachain headers and messages** +RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + ~/local_bridge_testing/bin/substrate-relay relay-headers-and-messages bridge-hub-rococo-bridge-hub-wococo \ + --rococo-host localhost \ + --rococo-port 9942 \ + --rococo-version-mode Auto \ + --bridge-hub-rococo-host localhost \ + --bridge-hub-rococo-port 8943 \ + --bridge-hub-rococo-version-mode Auto \ + --bridge-hub-rococo-signer //Charlie \ + --wococo-headers-to-bridge-hub-rococo-signer //Bob \ + --wococo-parachains-to-bridge-hub-rococo-signer //Bob \ + --bridge-hub-rococo-transactions-mortality 4 \ + --wococo-host localhost \ + --wococo-port 9945 \ + --wococo-version-mode Auto \ + --bridge-hub-wococo-host localhost \ + --bridge-hub-wococo-port 8945 \ + --bridge-hub-wococo-version-mode Auto \ + --bridge-hub-wococo-signer //Charlie \ + --rococo-headers-to-bridge-hub-wococo-signer //Bob \ + --rococo-parachains-to-bridge-hub-wococo-signer //Bob \ + --bridge-hub-wococo-transactions-mortality 4 \ + --lane 00000001 +``` + +**Check relay-chain headers relaying:** +- Rococo parachain: + - https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A8943#/chainstate + - Pallet: **bridgeWococoGrandpa** + - Keys: **bestFinalized()** +- Wococo parachain: + - https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A8945#/chainstate + - Pallet: **bridgeRococoGrandpa** + - Keys: **bestFinalized()** + +**Check parachain headers relaying:** +- Rococo parachain: + - https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A8943#/chainstate + - Pallet: **bridgeWococoParachain** + - Keys: **bestParaHeads()** +- Wococo parachain: + - https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A8945#/chainstate + - Pallet: **bridgeRococoParachain** + - Keys: **bestParaHeads()** + +### Send messages + +#### Local zombienet run + +1. allow bridge transfer on statemine/westmint (governance-like): + ``` + ./scripts/bridges_rococo_wococo.sh allow-transfers-local + ``` + +2. do (asset) transfer from statemine to westmint + ``` + ./scripts/bridges_rococo_wococo.sh transfer-asset-from-statemine-local + ``` + +3. do (ping) transfer from statemine to westmint + ``` + ./scripts/bridges_rococo_wococo.sh ping-via-bridge-from-statemine-local + ``` + +- open explorers: (see zombienets) + - Statemine (see events `xcmpQueue.XcmpMessageSent`, `bridgeTransfer.ReserveAssetsDeposited`, `bridgeTransfer.TransferInitiated`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:9910#/explorer + - BridgeHubRococo (see `bridgeWococoMessages.MessageAccepted`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:8943#/explorer + - BridgeHubWococo (see `bridgeRococoMessages.MessagesReceived`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:8945#/explorer + - Westmint (see `xcmpQueue.Success` for `transfer-asset` and `xcmpQueue.Fail` for `ping-via-bridge`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:9010#/explorer + - BridgeHubRococo (see `bridgeWococoMessages.MessagesDelivered`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:8943#/explorer + +#### Live Rockmine2 to Wockmint +- uses account seed on Live Rococo:Rockmine2 + ``` + cd + + ./scripts/bridges_rococo_wococo.sh transfer-asset-from-statemine-rococo + or + ./scripts/bridges_rococo_wococo.sh ping-via-bridge-from-statemine-rococo + ``` + +- open explorers: + - Rockmine2 (see events `xcmpQueue.XcmpMessageSent`, `bridgeTransfer.ReserveAssetsDeposited`, `bridgeTransfer.TransferInitiated`) https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io#/explorer + - BridgeHubRococo (see `bridgeWococoMessages.MessageAccepted`) https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-bridge-hub-rpc.polkadot.io#/explorer + - BridgeHubWococo (see `bridgeRococoMessages.MessagesReceived`) https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fwococo-bridge-hub-rpc.polkadot.io#/explorer + - Wockmint (see `xcmpQueue.Success` for `transfer-asset` and `xcmpQueue.Fail` for `ping-via-bridge`) https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fws-wococo-wockmint-collator-node-0.parity-testnet.parity.io#/explorer + - BridgeHubRococo (see `bridgeWococoMessages.MessagesDelivered`) + +## How to test local BridgeHubKusama ``` cd -cargo build --release -p polkadot-parachain@0.9.320 +cargo build --release -p polkadot-parachain-bin # script expect to have pre-built polkadot binary on the path: ../polkadot/target/release/polkadot # if using `kusama-local` / `polkadot-local`, build polkadot with `--features fast-runtime` -# BridgeHubRococo -zombienet-linux --provider native spawn ./zombienet/examples/bridge_hub_rococo_local_network.toml - -# or - # BridgeHubKusama zombienet-linux --provider native spawn ./zombienet/examples/bridge_hub_kusama_local_network.toml @@ -35,3 +231,6 @@ or # BridgeHubPolkadot zombienet-linux --provider native spawn ./zombienet/examples/bridge_hub_polkadot_local_network.toml ``` + +## How to test local BridgeHubPolkadot +TODO: from master diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index d758e002cf0..5722136abb0 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -71,14 +71,42 @@ pallet-collator-selection = { path = "../../../../pallets/collator-selection", d parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } parachains-common = { path = "../../../../parachains/common", default-features = false } +# Bridges +bp-bridge-hub-rococo = { path = "../../../../bridges/primitives/chain-bridge-hub-rococo", default-features = false } +bp-bridge-hub-wococo = { path = "../../../../bridges/primitives/chain-bridge-hub-wococo", default-features = false } +bp-messages = { path = "../../../../bridges/primitives/messages", default-features = false } +bp-parachains = { path = "../../../../bridges/primitives/parachains", default-features = false } +bp-polkadot-core = { path = "../../../../bridges/primitives/polkadot-core", default-features = false } +bp-relayers = { path = "../../../../bridges/primitives/relayers", default-features = false } +bp-runtime = { path = "../../../../bridges/primitives/runtime", default-features = false } +bp-rococo = { path = "../../../../bridges/primitives/chain-rococo", default-features = false } +bp-wococo = { path = "../../../../bridges/primitives/chain-wococo", default-features = false } +pallet-bridge-grandpa = { path = "../../../../bridges/modules/grandpa", default-features = false } +pallet-bridge-messages = { path = "../../../../bridges/modules/messages", default-features = false } +pallet-bridge-parachains = { path = "../../../../bridges/modules/parachains", default-features = false } +pallet-bridge-relayers = { path = "../../../../bridges/modules/relayers", default-features = false } +bridge-runtime-common = { path = "../../../../bridges/bin/runtime-common", default-features = false } + [dev-dependencies] +static_assertions = "1.1" bridge-hub-test-utils = { path = "../test-utils"} +bridge-runtime-common = { path = "../../../../bridges/bin/runtime-common", features = ["integrity-test"] } [features] default = [ "std", ] std = [ + "bp-bridge-hub-rococo/std", + "bp-bridge-hub-wococo/std", + "bp-messages/std", + "bp-parachains/std", + "bp-polkadot-core/std", + "bp-relayers/std", + "bp-runtime/std", + "bp-rococo/std", + "bp-wococo/std", + "bridge-runtime-common/std", "codec/std", "log/std", "scale-info/std", @@ -98,6 +126,10 @@ std = [ "pallet-aura/std", "pallet-authorship/std", "pallet-balances/std", + "pallet-bridge-grandpa/std", + "pallet-bridge-messages/std", + "pallet-bridge-parachains/std", + "pallet-bridge-relayers/std", "pallet-collator-selection/std", "pallet-multisig/std", "pallet-session/std", @@ -131,24 +163,34 @@ std = [ ] runtime-benchmarks = [ + "bridge-runtime-common/runtime-benchmarks", "frame-benchmarking/runtime-benchmarks", "frame-support/runtime-benchmarks", "frame-system-benchmarking/runtime-benchmarks", "frame-system/runtime-benchmarks", "pallet-balances/runtime-benchmarks", + "pallet-bridge-grandpa/runtime-benchmarks", + "pallet-bridge-messages/runtime-benchmarks", + "pallet-bridge-parachains/runtime-benchmarks", + "pallet-bridge-relayers/runtime-benchmarks", + "pallet-collator-selection/runtime-benchmarks", "pallet-multisig/runtime-benchmarks", + "cumulus-pallet-parachain-system/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-utility/runtime-benchmarks", "pallet-xcm/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "pallet-collator-selection/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", ] try-runtime = [ + "pallet-bridge-grandpa/try-runtime", + "pallet-bridge-messages/try-runtime", + "pallet-bridge-parachains/try-runtime", + "pallet-bridge-relayers/try-runtime", "cumulus-pallet-aura-ext/try-runtime", "cumulus-pallet-dmp-queue/try-runtime", "cumulus-pallet-parachain-system/try-runtime", diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_rococo_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_rococo_config.rs new file mode 100644 index 00000000000..bfa6f98ebae --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_rococo_config.rs @@ -0,0 +1,217 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Bridge definitions that are used on Rococo to bridge with Wococo. + +use crate::{ + BridgeParachainWococoInstance, ParachainInfo, Runtime, WithBridgeHubWococoMessagesInstance, + XcmRouter, +}; +use bp_messages::LaneId; +use bridge_runtime_common::{ + messages, + messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, + MessageBridge, ThisChainWithMessages, UnderlyingChainProvider, + }, + messages_xcm_extension::{XcmBlobHauler, XcmBlobHaulerAdapter}, + refund_relayer_extension::{ + ActualFeeRefund, RefundBridgedParachainMessages, RefundableMessagesLane, + RefundableParachain, + }, +}; +use frame_support::{parameter_types, RuntimeDebug}; +use xcm::{ + latest::prelude::*, + prelude::{InteriorMultiLocation, NetworkId}, +}; +use xcm_builder::{BridgeBlobDispatcher, HaulBlobExporter}; + +parameter_types! { + pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce = + bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; + pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = + bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; + pub const BridgeHubWococoChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_WOCOCO_CHAIN_ID; + pub BridgeHubRococoUniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(Rococo), Parachain(ParachainInfo::parachain_id().into())); + pub WococoGlobalConsensusNetwork: NetworkId = NetworkId::Wococo; + pub ActiveOutboundLanesToBridgeHubWococo: &'static [bp_messages::LaneId] = &[DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO]; + pub PriorityBoostPerMessage: u64 = 921_900_294; +} + +/// Proof of messages, coming from Wococo. +pub type FromWococoBridgeHubMessagesProof = + FromBridgedChainMessagesProof; +/// Messages delivery proof for Rococo Bridge Hub -> Wococo Bridge Hub messages. +pub type ToWococoBridgeHubMessagesDeliveryProof = + FromBridgedChainMessagesDeliveryProof; + +/// Dispatches received XCM messages from other bridge +pub type OnBridgeHubRococoBlobDispatcher = + BridgeBlobDispatcher; + +/// Export XCM messages to be relayed to the otherside +pub type ToBridgeHubWococoHaulBlobExporter = HaulBlobExporter< + XcmBlobHaulerAdapter, + WococoGlobalConsensusNetwork, + (), +>; +pub struct ToBridgeHubWococoXcmBlobHauler; +impl XcmBlobHauler for ToBridgeHubWococoXcmBlobHauler { + type MessageSender = + pallet_bridge_messages::Pallet; + + type MessageSenderOrigin = super::RuntimeOrigin; + + fn message_sender_origin() -> Self::MessageSenderOrigin { + pallet_xcm::Origin::from(MultiLocation::new(1, crate::xcm_config::UniversalLocation::get())) + .into() + } + + fn xcm_lane() -> LaneId { + DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO + } +} +pub const DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO: LaneId = LaneId([0, 0, 0, 1]); + +/// Messaging Bridge configuration for BridgeHubRococo -> BridgeHubWococo +pub struct WithBridgeHubWococoMessageBridge; +impl MessageBridge for WithBridgeHubWococoMessageBridge { + const BRIDGED_MESSAGES_PALLET_NAME: &'static str = + bp_bridge_hub_rococo::WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME; + type ThisChain = BridgeHubRococo; + type BridgedChain = BridgeHubWococo; + type BridgedHeaderChain = pallet_bridge_parachains::ParachainHeaders< + Runtime, + BridgeParachainWococoInstance, + bp_bridge_hub_wococo::BridgeHubWococo, + >; +} + +/// Message verifier for BridgeHubWococo messages sent from BridgeHubRococo +pub type ToBridgeHubWococoMessageVerifier = + messages::source::FromThisChainMessageVerifier; + +/// Maximal outbound payload size of BridgeHubRococo -> BridgeHubWococo messages. +pub type ToBridgeHubWococoMaximalOutboundPayloadSize = + messages::source::FromThisChainMaximalOutboundPayloadSize; + +/// BridgeHubWococo chain from message lane point of view. +#[derive(RuntimeDebug, Clone, Copy)] +pub struct BridgeHubWococo; + +impl UnderlyingChainProvider for BridgeHubWococo { + type Chain = bp_bridge_hub_wococo::BridgeHubWococo; +} + +impl messages::BridgedChainWithMessages for BridgeHubWococo {} + +/// BridgeHubRococo chain from message lane point of view. +#[derive(RuntimeDebug, Clone, Copy)] +pub struct BridgeHubRococo; + +impl UnderlyingChainProvider for BridgeHubRococo { + type Chain = bp_bridge_hub_rococo::BridgeHubRococo; +} + +impl ThisChainWithMessages for BridgeHubRococo { + type RuntimeOrigin = crate::RuntimeOrigin; +} + +/// Signed extension that refunds relayers that are delivering messages from the Wococo parachain. +pub type BridgeRefundBridgeHubWococoMessages = RefundBridgedParachainMessages< + Runtime, + RefundableParachain, + RefundableMessagesLane, + ActualFeeRefund, + PriorityBoostPerMessage, + StrBridgeRefundBridgeHubWococoMessages, +>; +bp_runtime::generate_static_str_provider!(BridgeRefundBridgeHubWococoMessages); + +parameter_types! { + pub const BridgeHubWococoMessagesLane: bp_messages::LaneId = DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO; + pub const BridgeHubWococoParachainId: u32 = { + use bp_runtime::Parachain; + BridgeHubWococo::PARACHAIN_ID + }; +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::BridgeGrandpaWococoInstance; + use bridge_runtime_common::{ + assert_complete_bridge_types, + integrity::{ + assert_complete_bridge_constants, check_message_lane_weights, + AssertBridgeMessagesPalletConstants, AssertBridgePalletNames, AssertChainConstants, + AssertCompleteBridgeConstants, + }, + }; + + #[test] + fn ensure_bridge_hub_rococo_message_lane_weights_are_correct() { + check_message_lane_weights::< + bp_bridge_hub_rococo::BridgeHubRococo, + Runtime, + WithBridgeHubWococoMessagesInstance, + >( + bp_bridge_hub_wococo::EXTRA_STORAGE_PROOF_SIZE, + bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, + true, + ); + } + + #[test] + fn ensure_bridge_integrity() { + assert_complete_bridge_types!( + runtime: Runtime, + with_bridged_chain_grandpa_instance: BridgeGrandpaWococoInstance, + with_bridged_chain_messages_instance: WithBridgeHubWococoMessagesInstance, + bridge: WithBridgeHubWococoMessageBridge, + this_chain: bp_rococo::Rococo, + bridged_chain: bp_wococo::Wococo, + ); + + assert_complete_bridge_constants::< + Runtime, + BridgeGrandpaWococoInstance, + WithBridgeHubWococoMessagesInstance, + WithBridgeHubWococoMessageBridge, + >(AssertCompleteBridgeConstants { + this_chain_constants: AssertChainConstants { + block_length: bp_bridge_hub_rococo::BlockLength::get(), + block_weights: bp_bridge_hub_rococo::BlockWeights::get(), + }, + messages_pallet_constants: AssertBridgeMessagesPalletConstants { + max_unrewarded_relayers_in_bridged_confirmation_tx: + bp_bridge_hub_wococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + max_unconfirmed_messages_in_bridged_confirmation_tx: + bp_bridge_hub_wococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, + bridged_chain_id: bp_runtime::BRIDGE_HUB_WOCOCO_CHAIN_ID, + }, + pallet_names: AssertBridgePalletNames { + with_this_chain_messages_pallet_name: + bp_bridge_hub_rococo::WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME, + with_bridged_chain_grandpa_pallet_name: bp_wococo::WITH_WOCOCO_GRANDPA_PALLET_NAME, + with_bridged_chain_messages_pallet_name: + bp_bridge_hub_wococo::WITH_BRIDGE_HUB_WOCOCO_MESSAGES_PALLET_NAME, + }, + }); + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_wococo_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_wococo_config.rs new file mode 100644 index 00000000000..2c9ec3c82bc --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_wococo_config.rs @@ -0,0 +1,217 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Bridge definitions that are used on Wococo to bridge with Rococo. + +use crate::{ + BridgeParachainRococoInstance, ParachainInfo, Runtime, WithBridgeHubRococoMessagesInstance, + XcmRouter, +}; +use bp_messages::LaneId; +use bridge_runtime_common::{ + messages, + messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, + MessageBridge, ThisChainWithMessages, UnderlyingChainProvider, + }, + messages_xcm_extension::{XcmBlobHauler, XcmBlobHaulerAdapter}, + refund_relayer_extension::{ + ActualFeeRefund, RefundBridgedParachainMessages, RefundableMessagesLane, + RefundableParachain, + }, +}; +use frame_support::{parameter_types, RuntimeDebug}; +use xcm::{ + latest::prelude::*, + prelude::{InteriorMultiLocation, NetworkId}, +}; +use xcm_builder::{BridgeBlobDispatcher, HaulBlobExporter}; + +parameter_types! { + pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce = + bp_bridge_hub_wococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; + pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = + bp_bridge_hub_wococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; + pub const BridgeHubRococoChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_ROCOCO_CHAIN_ID; + pub BridgeHubWococoUniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(Wococo), Parachain(ParachainInfo::parachain_id().into())); + pub RococoGlobalConsensusNetwork: NetworkId = NetworkId::Rococo; + pub ActiveOutboundLanesToBridgeHubRococo: &'static [bp_messages::LaneId] = &[DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO]; + pub PriorityBoostPerMessage: u64 = 921_900_294; +} + +/// Proof of messages, coming from Rococo. +pub type FromRococoBridgeHubMessagesProof = + FromBridgedChainMessagesProof; +/// Messages delivery proof for Rococo Bridge Hub -> Wococo Bridge Hub messages. +pub type ToRococoBridgeHubMessagesDeliveryProof = + FromBridgedChainMessagesDeliveryProof; + +/// Dispatches received XCM messages from other bridge +pub type OnBridgeHubWococoBlobDispatcher = + BridgeBlobDispatcher; + +/// Export XCM messages to be relayed to the otherside +pub type ToBridgeHubRococoHaulBlobExporter = HaulBlobExporter< + XcmBlobHaulerAdapter, + RococoGlobalConsensusNetwork, + (), +>; +pub struct ToBridgeHubRococoXcmBlobHauler; +impl XcmBlobHauler for ToBridgeHubRococoXcmBlobHauler { + type MessageSender = + pallet_bridge_messages::Pallet; + + type MessageSenderOrigin = super::RuntimeOrigin; + + fn message_sender_origin() -> super::RuntimeOrigin { + pallet_xcm::Origin::from(MultiLocation::new(1, crate::xcm_config::UniversalLocation::get())) + .into() + } + + fn xcm_lane() -> LaneId { + DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO + } +} +pub const DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO: LaneId = LaneId([0, 0, 0, 1]); + +/// Messaging Bridge configuration for BridgeHubWococo -> BridgeHubRococo +pub struct WithBridgeHubRococoMessageBridge; +impl MessageBridge for WithBridgeHubRococoMessageBridge { + const BRIDGED_MESSAGES_PALLET_NAME: &'static str = + bp_bridge_hub_wococo::WITH_BRIDGE_HUB_WOCOCO_MESSAGES_PALLET_NAME; + type ThisChain = BridgeHubWococo; + type BridgedChain = BridgeHubRococo; + type BridgedHeaderChain = pallet_bridge_parachains::ParachainHeaders< + Runtime, + BridgeParachainRococoInstance, + bp_bridge_hub_rococo::BridgeHubRococo, + >; +} + +/// Message verifier for BridgeHubRococo messages sent from BridgeHubWococo +pub type ToBridgeHubRococoMessageVerifier = + messages::source::FromThisChainMessageVerifier; + +/// Maximal outbound payload size of BridgeHubWococo -> BridgeHubRococo messages. +pub type ToBridgeHubRococoMaximalOutboundPayloadSize = + messages::source::FromThisChainMaximalOutboundPayloadSize; + +/// BridgeHubRococo chain from message lane point of view. +#[derive(RuntimeDebug, Clone, Copy)] +pub struct BridgeHubRococo; + +impl UnderlyingChainProvider for BridgeHubRococo { + type Chain = bp_bridge_hub_rococo::BridgeHubRococo; +} + +impl messages::BridgedChainWithMessages for BridgeHubRococo {} + +/// BridgeHubWococo chain from message lane point of view. +#[derive(RuntimeDebug, Clone, Copy)] +pub struct BridgeHubWococo; + +impl UnderlyingChainProvider for BridgeHubWococo { + type Chain = bp_bridge_hub_wococo::BridgeHubWococo; +} + +impl ThisChainWithMessages for BridgeHubWococo { + type RuntimeOrigin = crate::RuntimeOrigin; +} + +/// Signed extension that refunds relayers that are delivering messages from the Rococo parachain. +pub type BridgeRefundBridgeHubRococoMessages = RefundBridgedParachainMessages< + Runtime, + RefundableParachain, + RefundableMessagesLane, + ActualFeeRefund, + PriorityBoostPerMessage, + StrBridgeRefundBridgeHubRococoMessages, +>; +bp_runtime::generate_static_str_provider!(BridgeRefundBridgeHubRococoMessages); + +parameter_types! { + pub const BridgeHubRococoMessagesLane: bp_messages::LaneId = DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO; + pub const BridgeHubRococoParachainId: u32 = { + use bp_runtime::Parachain; + BridgeHubRococo::PARACHAIN_ID + }; +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::BridgeGrandpaRococoInstance; + use bridge_runtime_common::{ + assert_complete_bridge_types, + integrity::{ + assert_complete_bridge_constants, check_message_lane_weights, + AssertBridgeMessagesPalletConstants, AssertBridgePalletNames, AssertChainConstants, + AssertCompleteBridgeConstants, + }, + }; + + #[test] + fn ensure_bridge_hub_wococo_message_lane_weights_are_correct() { + check_message_lane_weights::< + bp_bridge_hub_wococo::BridgeHubWococo, + Runtime, + WithBridgeHubRococoMessagesInstance, + >( + bp_bridge_hub_rococo::EXTRA_STORAGE_PROOF_SIZE, + bp_bridge_hub_wococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + bp_bridge_hub_wococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, + true, + ); + } + + #[test] + fn ensure_bridge_integrity() { + assert_complete_bridge_types!( + runtime: Runtime, + with_bridged_chain_grandpa_instance: BridgeGrandpaRococoInstance, + with_bridged_chain_messages_instance: WithBridgeHubRococoMessagesInstance, + bridge: WithBridgeHubRococoMessageBridge, + this_chain: bp_wococo::Wococo, + bridged_chain: bp_rococo::Rococo, + ); + + assert_complete_bridge_constants::< + Runtime, + BridgeGrandpaRococoInstance, + WithBridgeHubRococoMessagesInstance, + WithBridgeHubRococoMessageBridge, + >(AssertCompleteBridgeConstants { + this_chain_constants: AssertChainConstants { + block_length: bp_bridge_hub_wococo::BlockLength::get(), + block_weights: bp_bridge_hub_wococo::BlockWeights::get(), + }, + messages_pallet_constants: AssertBridgeMessagesPalletConstants { + max_unrewarded_relayers_in_bridged_confirmation_tx: + bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + max_unconfirmed_messages_in_bridged_confirmation_tx: + bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, + bridged_chain_id: bp_runtime::BRIDGE_HUB_ROCOCO_CHAIN_ID, + }, + pallet_names: AssertBridgePalletNames { + with_this_chain_messages_pallet_name: + bp_bridge_hub_wococo::WITH_BRIDGE_HUB_WOCOCO_MESSAGES_PALLET_NAME, + with_bridged_chain_grandpa_pallet_name: bp_rococo::WITH_ROCOCO_GRANDPA_PALLET_NAME, + with_bridged_chain_messages_pallet_name: + bp_bridge_hub_rococo::WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME, + }, + }); + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/constants.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/constants.rs index 86cf8d6f7d3..ba80cd2b6da 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/constants.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/constants.rs @@ -22,6 +22,7 @@ pub mod currency { pub const UNITS: Balance = constants::currency::UNITS; pub const CENTS: Balance = constants::currency::CENTS; + pub const MILLICENTS: Balance = constants::currency::MILLICENTS; pub const fn deposit(items: u32, bytes: u32) -> Balance { // map to 1/100 of what the rococo relay chain charges diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 2e985546e02..21f02ce4765 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -22,12 +22,14 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +pub mod bridge_hub_rococo_config; +pub mod bridge_hub_wococo_config; pub mod constants; mod weights; pub mod xcm_config; +use constants::currency::*; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use smallvec::smallvec; use sp_api::impl_runtime_apis; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; use sp_runtime::{ @@ -42,17 +44,12 @@ use sp_std::prelude::*; use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use constants::currency::*; use frame_support::{ construct_runtime, dispatch::DispatchClass, - pallet_prelude::Weight, parameter_types, traits::{ConstU32, ConstU64, ConstU8, Everything}, - weights::{ - ConstantMultiplier, FeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients, - WeightToFeePolynomial, - }, + weights::{ConstantMultiplier, Weight}, PalletId, }; use frame_system::{ @@ -63,21 +60,40 @@ pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; pub use sp_runtime::{MultiAddress, Perbill, Permill}; use xcm_config::{XcmConfig, XcmOriginToTransactDispatchOrigin}; +use bp_parachains::SingleParaStoredHeaderDataBuilder; +use bp_runtime::HeaderId; + #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -// Polkadot imports use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; -// XCM Imports +use crate::{ + bridge_hub_rococo_config::{ + BridgeRefundBridgeHubWococoMessages, OnBridgeHubRococoBlobDispatcher, + WithBridgeHubWococoMessageBridge, + }, + bridge_hub_wococo_config::{ + BridgeRefundBridgeHubRococoMessages, OnBridgeHubWococoBlobDispatcher, + WithBridgeHubRococoMessageBridge, + }, + constants::fee::WeightToFee, + xcm_config::XcmRouter, +}; +use bridge_runtime_common::{ + messages::{source::TargetHeaderChainAdapter, target::SourceHeaderChainAdapter}, + messages_xcm_extension::{XcmAsPlainPayload, XcmBlobMessageDispatch}, +}; use parachains_common::{ impls::DealWithFees, opaque, AccountId, Balance, BlockNumber, Hash, Header, Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_executor::XcmExecutor; +pub const LOG_TARGET: &str = "runtime::bridge-hub"; + /// The address format for describing accounts. pub type Address = MultiAddress; @@ -100,6 +116,8 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, + BridgeRejectObsoleteHeadersAndMessages, + (BridgeRefundBridgeHubRococoMessages, BridgeRefundBridgeHubWococoMessages), ); /// Unchecked extrinsic type as expected by this runtime. @@ -118,64 +136,6 @@ pub type Executive = frame_executive::Executive< AllPalletsWithSystem, >; -/// 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, MAXIMUM_BLOCK_WEIGHT]` -/// - `[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. -pub struct WeightToFee; -impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } -} - -/// Maps the reference time component of `Weight` to a fee. -pub struct RefTimeToFee; -impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - let p = MILLIUNIT / 10; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } -} - -/// Maps the proof size component of `Weight` to a fee. -pub struct ProofSizeToFee; -impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1/10 MILLIUNIT. - let p = MILLIUNIT / 10; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } -} - impl_opaque_keys! { pub struct SessionKeys { pub aura: Aura, @@ -194,13 +154,6 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { state_version: 1, }; -// Unit = the base number of indivisible units for balances -pub const MILLIUNIT: Balance = 1_000_000_000; -pub const MICROUNIT: Balance = 1_000_000; - -/// The existential deposit. Set to 1/10 of the Connected Relay Chain. -pub const EXISTENTIAL_DEPOSIT: Balance = MILLIUNIT; - /// The version information used to identify this runtime when compiled natively. #[cfg(feature = "std")] pub fn native_version() -> NativeVersion { @@ -281,7 +234,7 @@ impl frame_system::Config for Runtime { type SS58Prefix = SS58Prefix; /// The action to take on a Runtime Upgrade type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = ConstU32<16>; + type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_timestamp::Config for Runtime { @@ -321,7 +274,7 @@ impl pallet_balances::Config for Runtime { parameter_types! { /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 10 * MICROUNIT; + pub const TransactionByteFee: Balance = 1 * MILLICENTS; } impl pallet_transaction_payment::Config for Runtime { @@ -443,6 +396,153 @@ impl pallet_utility::Config for Runtime { type WeightInfo = weights::pallet_utility::WeightInfo; } +// Add bridge pallets (GPA) + +/// Add GRANDPA bridge pallet to track Wococo relay chain on Rococo BridgeHub +pub type BridgeGrandpaWococoInstance = pallet_bridge_grandpa::Instance1; +impl pallet_bridge_grandpa::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = bp_wococo::Wococo; + type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; + type HeadersToKeep = RelayChainHeadersToKeep; + type WeightInfo = weights::pallet_bridge_grandpa_bridge_wococo_grandpa::WeightInfo; +} + +/// Add GRANDPA bridge pallet to track Rococo relay chain on Wococo BridgeHub +pub type BridgeGrandpaRococoInstance = pallet_bridge_grandpa::Instance2; +impl pallet_bridge_grandpa::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = bp_rococo::Rococo; + type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; + type HeadersToKeep = RelayChainHeadersToKeep; + type WeightInfo = weights::pallet_bridge_grandpa_bridge_rococo_grandpa::WeightInfo; +} + +parameter_types! { + pub const RelayChainHeadersToKeep: u32 = 1024; + pub const ParachainHeadsToKeep: u32 = 64; + pub const RelayerStakeLease: u32 = 8; + + pub const RococoBridgeParachainPalletName: &'static str = "Paras"; + pub const WococoBridgeParachainPalletName: &'static str = "Paras"; + pub const MaxRococoParaHeadDataSize: u32 = bp_rococo::MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE; + pub const MaxWococoParaHeadDataSize: u32 = bp_wococo::MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE; + + pub storage DeliveryRewardInBalance: u64 = 1_000_000; + pub storage RequiredStakeForStakeAndSlash: Balance = 1_000_000; + + pub const RelayerStakeReserveId: [u8; 8] = *b"brdgrlrs"; +} + +/// Add parachain bridge pallet to track Wococo bridge hub parachain +pub type BridgeParachainWococoInstance = pallet_bridge_parachains::Instance1; +impl pallet_bridge_parachains::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = weights::pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance::WeightInfo; + type BridgesGrandpaPalletInstance = BridgeGrandpaWococoInstance; + type ParasPalletName = WococoBridgeParachainPalletName; + type ParaStoredHeaderDataBuilder = + SingleParaStoredHeaderDataBuilder; + type HeadsToKeep = ParachainHeadsToKeep; + type MaxParaHeadDataSize = MaxWococoParaHeadDataSize; +} + +/// Add parachain bridge pallet to track Rococo bridge hub parachain +pub type BridgeParachainRococoInstance = pallet_bridge_parachains::Instance2; +impl pallet_bridge_parachains::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = weights::pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance::WeightInfo; + type BridgesGrandpaPalletInstance = BridgeGrandpaRococoInstance; + type ParasPalletName = RococoBridgeParachainPalletName; + type ParaStoredHeaderDataBuilder = + SingleParaStoredHeaderDataBuilder; + type HeadsToKeep = ParachainHeadsToKeep; + type MaxParaHeadDataSize = MaxRococoParaHeadDataSize; +} + +/// Add XCM messages support for BridgeHubRococo to support Rococo->Wococo XCM messages +pub type WithBridgeHubWococoMessagesInstance = pallet_bridge_messages::Instance1; +impl pallet_bridge_messages::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = weights::pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance::WeightInfo; + type BridgedChainId = bridge_hub_rococo_config::BridgeHubWococoChainId; + type ActiveOutboundLanes = bridge_hub_rococo_config::ActiveOutboundLanesToBridgeHubWococo; + type MaxUnrewardedRelayerEntriesAtInboundLane = + bridge_hub_rococo_config::MaxUnrewardedRelayerEntriesAtInboundLane; + type MaxUnconfirmedMessagesAtInboundLane = + bridge_hub_rococo_config::MaxUnconfirmedMessagesAtInboundLane; + + type MaximalOutboundPayloadSize = + bridge_hub_rococo_config::ToBridgeHubWococoMaximalOutboundPayloadSize; + type OutboundPayload = XcmAsPlainPayload; + + type InboundPayload = XcmAsPlainPayload; + type InboundRelayer = AccountId; + type DeliveryPayments = (); + + type TargetHeaderChain = TargetHeaderChainAdapter; + type LaneMessageVerifier = bridge_hub_rococo_config::ToBridgeHubWococoMessageVerifier; + type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter< + Runtime, + WithBridgeHubWococoMessagesInstance, + DeliveryRewardInBalance, + >; + + type SourceHeaderChain = SourceHeaderChainAdapter; + type MessageDispatch = + XcmBlobMessageDispatch; +} + +/// Add XCM messages support for BridgeHubWococo to support Wococo->Rococo XCM messages +pub type WithBridgeHubRococoMessagesInstance = pallet_bridge_messages::Instance2; +impl pallet_bridge_messages::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = weights::pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance::WeightInfo; + type BridgedChainId = bridge_hub_wococo_config::BridgeHubRococoChainId; + type ActiveOutboundLanes = bridge_hub_wococo_config::ActiveOutboundLanesToBridgeHubRococo; + type MaxUnrewardedRelayerEntriesAtInboundLane = + bridge_hub_wococo_config::MaxUnrewardedRelayerEntriesAtInboundLane; + type MaxUnconfirmedMessagesAtInboundLane = + bridge_hub_wococo_config::MaxUnconfirmedMessagesAtInboundLane; + + type MaximalOutboundPayloadSize = + bridge_hub_wococo_config::ToBridgeHubRococoMaximalOutboundPayloadSize; + type OutboundPayload = XcmAsPlainPayload; + + type InboundPayload = XcmAsPlainPayload; + type InboundRelayer = AccountId; + type DeliveryPayments = (); + + type TargetHeaderChain = TargetHeaderChainAdapter; + type LaneMessageVerifier = bridge_hub_wococo_config::ToBridgeHubRococoMessageVerifier; + type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter< + Runtime, + WithBridgeHubRococoMessagesInstance, + DeliveryRewardInBalance, + >; + + type SourceHeaderChain = SourceHeaderChainAdapter; + type MessageDispatch = + XcmBlobMessageDispatch; +} + +/// Allows collect and claim rewards for relayers +impl pallet_bridge_relayers::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Reward = Balance; + type PaymentProcedure = + bp_relayers::PayRewardFromAccount, AccountId>; + type StakeAndSlash = pallet_bridge_relayers::StakeAndSlashNamed< + AccountId, + BlockNumber, + Balances, + RelayerStakeReserveId, + RequiredStakeForStakeAndSlash, + RelayerStakeLease, + >; + type WeightInfo = weights::pallet_bridge_relayers::WeightInfo; +} + // Create the runtime by composing the FRAME pallets that were previously configured. construct_runtime!( pub enum Runtime where @@ -477,10 +577,36 @@ construct_runtime!( // Handy utilities. Utility: pallet_utility::{Pallet, Call, Event} = 40, - Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, + Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 36, + + // Rococo and Wococo Bridge Hubs are sharing the runtime, so this runtime has two sets of + // bridge pallets. Both are deployed at both runtimes, but only one set is actually used + // at particular runtime. + + // With-Wococo bridge modules that are active (used) at Rococo Bridge Hub runtime. + BridgeWococoGrandpa: pallet_bridge_grandpa::::{Pallet, Call, Storage, Event, Config} = 41, + BridgeWococoParachain: pallet_bridge_parachains::::{Pallet, Call, Storage, Event} = 42, + BridgeWococoMessages: pallet_bridge_messages::::{Pallet, Call, Storage, Event, Config} = 46, + + // With-Rococo bridge modules that are active (used) at Wococo Bridge Hub runtime. + BridgeRococoGrandpa: pallet_bridge_grandpa::::{Pallet, Call, Storage, Event, Config} = 43, + BridgeRococoParachain: pallet_bridge_parachains::::{Pallet, Call, Storage, Event} = 44, + BridgeRococoMessages: pallet_bridge_messages::::{Pallet, Call, Storage, Event, Config} = 45, + + BridgeRelayers: pallet_bridge_relayers::{Pallet, Call, Storage, Event} = 47, } ); +bridge_runtime_common::generate_bridge_reject_obsolete_headers_and_messages! { + RuntimeCall, AccountId, + // Grandpa + BridgeRococoGrandpa, BridgeWococoGrandpa, + // Parachains + BridgeRococoParachain, BridgeWococoParachain, + // Messages + BridgeRococoMessages, BridgeWococoMessages +} + #[cfg(feature = "runtime-benchmarks")] #[macro_use] extern crate frame_benchmarking; @@ -501,6 +627,16 @@ mod benches { // NOTE: Make sure you point to the individual modules below. [pallet_xcm_benchmarks::fungible, XcmBalances] [pallet_xcm_benchmarks::generic, XcmGeneric] + // Bridge pallets at Rococo + [pallet_bridge_grandpa, BridgeWococoGrandpa] + [pallet_bridge_parachains, BridgeParachainsBench::] + [pallet_bridge_messages, BridgeMessagesBench::] + // Bridge pallets at Wococo + [pallet_bridge_grandpa, BridgeRococoGrandpa] + [pallet_bridge_parachains, BridgeParachainsBench::] + [pallet_bridge_messages, BridgeMessagesBench::] + // Bridge relayer pallets + [pallet_bridge_relayers, BridgeRelayersBench::] ); } @@ -625,6 +761,89 @@ impl_runtime_apis! { } } + impl bp_rococo::RococoFinalityApi for Runtime { + fn best_finalized() -> Option> { + BridgeRococoGrandpa::best_finalized() + } + } + + impl bp_wococo::WococoFinalityApi for Runtime { + fn best_finalized() -> Option> { + BridgeWococoGrandpa::best_finalized() + } + } + + + impl bp_bridge_hub_rococo::BridgeHubRococoFinalityApi for Runtime { + fn best_finalized() -> Option> { + BridgeRococoParachain::best_parachain_head_id::< + bp_bridge_hub_rococo::BridgeHubRococo + >().unwrap_or(None) + } + } + + impl bp_bridge_hub_wococo::BridgeHubWococoFinalityApi for Runtime { + fn best_finalized() -> Option> { + BridgeWococoParachain::best_parachain_head_id::< + bp_bridge_hub_wococo::BridgeHubWococo + >().unwrap_or(None) + } + } + + // This exposed by BridgeHubRococo + impl bp_bridge_hub_wococo::FromBridgeHubWococoInboundLaneApi for Runtime { + fn message_details( + lane: bp_messages::LaneId, + messages: Vec<(bp_messages::MessagePayload, bp_messages::OutboundMessageDetails)>, + ) -> Vec { + bridge_runtime_common::messages_api::inbound_message_details::< + Runtime, + WithBridgeHubWococoMessagesInstance, + >(lane, messages) + } + } + + // This exposed by BridgeHubRococo + impl bp_bridge_hub_wococo::ToBridgeHubWococoOutboundLaneApi for Runtime { + fn message_details( + lane: bp_messages::LaneId, + begin: bp_messages::MessageNonce, + end: bp_messages::MessageNonce, + ) -> Vec { + bridge_runtime_common::messages_api::outbound_message_details::< + Runtime, + WithBridgeHubWococoMessagesInstance, + >(lane, begin, end) + } + } + + // This is exposed by BridgeHubWococo + impl bp_bridge_hub_rococo::FromBridgeHubRococoInboundLaneApi for Runtime { + fn message_details( + lane: bp_messages::LaneId, + messages: Vec<(bp_messages::MessagePayload, bp_messages::OutboundMessageDetails)>, + ) -> Vec { + bridge_runtime_common::messages_api::inbound_message_details::< + Runtime, + WithBridgeHubRococoMessagesInstance, + >(lane, messages) + } + } + + // This is exposed by BridgeHubWococo + impl bp_bridge_hub_rococo::ToBridgeHubRococoOutboundLaneApi for Runtime { + fn message_details( + lane: bp_messages::LaneId, + begin: bp_messages::MessageNonce, + end: bp_messages::MessageNonce, + ) -> Vec { + bridge_runtime_common::messages_api::outbound_message_details::< + Runtime, + WithBridgeHubRococoMessagesInstance, + >(lane, begin, end) + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { @@ -661,6 +880,10 @@ impl_runtime_apis! { type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + use pallet_bridge_parachains::benchmarking::Pallet as BridgeParachainsBench; + use pallet_bridge_messages::benchmarking::Pallet as BridgeMessagesBench; + use pallet_bridge_relayers::benchmarking::Pallet as BridgeRelayersBench; + let mut list = Vec::::new(); list_benchmarks!(list, extra); @@ -758,13 +981,183 @@ impl_runtime_apis! { fn export_message_origin_and_destination( ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) + Ok((RelayLocation::get(), NetworkId::Wococo, X1(Parachain(100)))) } } type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + use bridge_runtime_common::messages_benchmarking::{prepare_message_delivery_proof_from_parachain, prepare_message_proof_from_parachain}; + use pallet_bridge_messages::benchmarking::{ + Config as BridgeMessagesConfig, + Pallet as BridgeMessagesBench, + MessageDeliveryProofParams, + MessageProofParams, + }; + + impl BridgeMessagesConfig for Runtime { + fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool { + let bench_lane_id = >::bench_lane_id(); + let bridged_chain_id = bp_runtime::BRIDGE_HUB_WOCOCO_CHAIN_ID; + pallet_bridge_relayers::Pallet::::relayer_reward( + relayer, + bp_relayers::RewardsAccountParams::new( + bench_lane_id, + bridged_chain_id, + bp_relayers::RewardsAccountOwner::BridgedChain + ) + ).is_some() + } + + fn prepare_message_proof( + params: MessageProofParams, + ) -> (bridge_hub_rococo_config::FromWococoBridgeHubMessagesProof, Weight) { + use cumulus_primitives_core::XcmpMessageSource; + assert!(XcmpQueue::take_outbound_messages(usize::MAX).is_empty()); + ParachainSystem::open_outbound_hrmp_channel_for_benchmarks(42.into()); + prepare_message_proof_from_parachain::< + Runtime, + BridgeGrandpaWococoInstance, + bridge_hub_rococo_config::WithBridgeHubWococoMessageBridge, + >(params, X2(GlobalConsensus(Rococo), Parachain(42))) + } + + fn prepare_message_delivery_proof( + params: MessageDeliveryProofParams, + ) -> bridge_hub_rococo_config::ToWococoBridgeHubMessagesDeliveryProof { + prepare_message_delivery_proof_from_parachain::< + Runtime, + BridgeGrandpaWococoInstance, + bridge_hub_rococo_config::WithBridgeHubWococoMessageBridge, + >(params) + } + + fn is_message_successfully_dispatched(_nonce: bp_messages::MessageNonce) -> bool { + use cumulus_primitives_core::XcmpMessageSource; + !XcmpQueue::take_outbound_messages(usize::MAX).is_empty() + } + } + + impl BridgeMessagesConfig for Runtime { + fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool { + let bench_lane_id = >::bench_lane_id(); + let bridged_chain_id = bp_runtime::BRIDGE_HUB_ROCOCO_CHAIN_ID; + pallet_bridge_relayers::Pallet::::relayer_reward( + relayer, + bp_relayers::RewardsAccountParams::new( + bench_lane_id, + bridged_chain_id, + bp_relayers::RewardsAccountOwner::BridgedChain + ) + ).is_some() + } + + fn prepare_message_proof( + params: MessageProofParams, + ) -> (bridge_hub_wococo_config::FromRococoBridgeHubMessagesProof, Weight) { + use cumulus_primitives_core::XcmpMessageSource; + assert!(XcmpQueue::take_outbound_messages(usize::MAX).is_empty()); + ParachainSystem::open_outbound_hrmp_channel_for_benchmarks(42.into()); + prepare_message_proof_from_parachain::< + Runtime, + BridgeGrandpaRococoInstance, + bridge_hub_wococo_config::WithBridgeHubRococoMessageBridge, + >(params, X2(GlobalConsensus(Wococo), Parachain(42))) + } + + fn prepare_message_delivery_proof( + params: MessageDeliveryProofParams, + ) -> bridge_hub_wococo_config::ToRococoBridgeHubMessagesDeliveryProof { + prepare_message_delivery_proof_from_parachain::< + Runtime, + BridgeGrandpaRococoInstance, + bridge_hub_wococo_config::WithBridgeHubRococoMessageBridge, + >(params) + } + + fn is_message_successfully_dispatched(_nonce: bp_messages::MessageNonce) -> bool { + use cumulus_primitives_core::XcmpMessageSource; + !XcmpQueue::take_outbound_messages(usize::MAX).is_empty() + } + } + + use bridge_runtime_common::parachains_benchmarking::prepare_parachain_heads_proof; + use pallet_bridge_parachains::benchmarking::{ + Config as BridgeParachainsConfig, + Pallet as BridgeParachainsBench, + }; + use pallet_bridge_relayers::benchmarking::{ + Pallet as BridgeRelayersBench, + Config as BridgeRelayersConfig, + }; + + impl BridgeParachainsConfig for Runtime { + fn parachains() -> Vec { + use bp_runtime::Parachain; + vec![bp_polkadot_core::parachains::ParaId(bp_bridge_hub_wococo::BridgeHubWococo::PARACHAIN_ID)] + } + + fn prepare_parachain_heads_proof( + parachains: &[bp_polkadot_core::parachains::ParaId], + parachain_head_size: u32, + proof_size: bp_runtime::StorageProofSize, + ) -> ( + pallet_bridge_parachains::RelayBlockNumber, + pallet_bridge_parachains::RelayBlockHash, + bp_polkadot_core::parachains::ParaHeadsProof, + Vec<(bp_polkadot_core::parachains::ParaId, bp_polkadot_core::parachains::ParaHash)>, + ) { + prepare_parachain_heads_proof::( + parachains, + parachain_head_size, + proof_size, + ) + } + } + + impl BridgeParachainsConfig for Runtime { + fn parachains() -> Vec { + use bp_runtime::Parachain; + vec![bp_polkadot_core::parachains::ParaId(bp_bridge_hub_rococo::BridgeHubRococo::PARACHAIN_ID)] + } + + fn prepare_parachain_heads_proof( + parachains: &[bp_polkadot_core::parachains::ParaId], + parachain_head_size: u32, + proof_size: bp_runtime::StorageProofSize, + ) -> ( + pallet_bridge_parachains::RelayBlockNumber, + pallet_bridge_parachains::RelayBlockHash, + bp_polkadot_core::parachains::ParaHeadsProof, + Vec<(bp_polkadot_core::parachains::ParaId, bp_polkadot_core::parachains::ParaHash)>, + ) { + prepare_parachain_heads_proof::( + parachains, + parachain_head_size, + proof_size, + ) + } + } + + impl BridgeRelayersConfig for Runtime { + fn prepare_rewards_account( + account_params: bp_relayers::RewardsAccountParams, + reward: Balance, + ) { + let rewards_account = bp_relayers::PayRewardFromAccount::< + Balances, + AccountId + >::rewards_account(account_params); + Self::deposit_account(rewards_account, reward); + } + + fn deposit_account(account: AccountId, balance: Balance) { + use frame_support::traits::fungible::Mutate; + Balances::mint_into(&account, balance.saturating_add(ExistentialDeposit::get())).unwrap(); + } + } + let whitelist: Vec = vec![ // Block Number hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), @@ -815,3 +1208,59 @@ cumulus_pallet_parachain_system::register_validate_block! { BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, CheckInherents = CheckInherents, } + +#[cfg(test)] +mod tests { + use super::*; + use bp_runtime::TransactionEra; + use bridge_hub_test_utils::test_header; + use codec::Encode; + + pub type TestBlockHeader = + sp_runtime::generic::Header; + + #[test] + fn ensure_signed_extension_definition_is_compatible_with_relay() { + let payload: SignedExtra = ( + frame_system::CheckNonZeroSender::new(), + frame_system::CheckSpecVersion::new(), + frame_system::CheckTxVersion::new(), + frame_system::CheckGenesis::new(), + frame_system::CheckEra::from(sp_runtime::generic::Era::Immortal), + frame_system::CheckNonce::from(10), + frame_system::CheckWeight::new(), + pallet_transaction_payment::ChargeTransactionPayment::from(10), + BridgeRejectObsoleteHeadersAndMessages {}, + ( + BridgeRefundBridgeHubRococoMessages::default(), + BridgeRefundBridgeHubWococoMessages::default(), + ), + ); + + { + use bp_bridge_hub_rococo::BridgeHubSignedExtension; + let bhr_indirect_payload = bp_bridge_hub_rococo::SignedExtension::from_params( + 10, + 10, + TransactionEra::Immortal, + test_header::(1).hash(), + 10, + 10, + ); + assert_eq!(payload.encode(), bhr_indirect_payload.encode()); + } + + { + use bp_bridge_hub_wococo::BridgeHubSignedExtension; + let bhw_indirect_payload = bp_bridge_hub_wococo::SignedExtension::from_params( + 10, + 10, + TransactionEra::Immortal, + test_header::(1).hash(), + 10, + 10, + ); + assert_eq!(payload.encode(), bhw_indirect_payload.encode()); + } + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs index d5722374def..286c8010f8a 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs @@ -22,6 +22,13 @@ pub mod cumulus_pallet_xcmp_queue; pub mod extrinsic_weights; pub mod frame_system; pub mod pallet_balances; +pub mod pallet_bridge_grandpa_bridge_rococo_grandpa; +pub mod pallet_bridge_grandpa_bridge_wococo_grandpa; +pub mod pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance; +pub mod pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance; +pub mod pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance; +pub mod pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance; +pub mod pallet_bridge_relayers; pub mod pallet_collator_selection; pub mod pallet_multisig; pub mod pallet_session; @@ -36,3 +43,49 @@ pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; + +use crate::Runtime; +use frame_support::weights::Weight; + +// import trait from dependency module +use ::pallet_bridge_relayers::WeightInfoExt as _; + +impl pallet_bridge_messages::WeightInfoExt for pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance::WeightInfo { + fn expected_extra_storage_proof_size() -> u32 { + bp_bridge_hub_rococo::EXTRA_STORAGE_PROOF_SIZE + } + + fn receive_messages_proof_overhead_from_runtime() -> Weight { + pallet_bridge_relayers::WeightInfo::::receive_messages_proof_overhead_from_runtime() + } + + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { + pallet_bridge_relayers::WeightInfo::::receive_messages_delivery_proof_overhead_from_runtime() + } +} + +impl pallet_bridge_messages::WeightInfoExt for pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance::WeightInfo { + fn expected_extra_storage_proof_size() -> u32 { + bp_bridge_hub_wococo::EXTRA_STORAGE_PROOF_SIZE + } + + fn receive_messages_proof_overhead_from_runtime() -> Weight { + pallet_bridge_relayers::WeightInfo::::receive_messages_proof_overhead_from_runtime() + } + + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { + pallet_bridge_relayers::WeightInfo::::receive_messages_delivery_proof_overhead_from_runtime() + } +} + +impl pallet_bridge_parachains::WeightInfoExt for pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance::WeightInfo { + fn expected_extra_storage_proof_size() -> u32 { + bp_bridge_hub_wococo::EXTRA_STORAGE_PROOF_SIZE + } +} + +impl pallet_bridge_parachains::WeightInfoExt for pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance::WeightInfo { + fn expected_extra_storage_proof_size() -> u32 { + bp_bridge_hub_rococo::EXTRA_STORAGE_PROOF_SIZE + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_rococo_grandpa.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_rococo_grandpa.rs new file mode 100644 index 00000000000..68e540adb7b --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_rococo_grandpa.rs @@ -0,0 +1,80 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_grandpa` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_grandpa +// --chain=bridge-hub-rococo-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_grandpa`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_grandpa::WeightInfo for WeightInfo { + /// Storage: BridgeRococoGrandpa PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoGrandpa PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa BestFinalized (r:1 w:1) + /// Proof: BridgeRococoGrandpa BestFinalized (max_values: Some(1), max_size: Some(36), added: 531, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa CurrentAuthoritySet (r:1 w:0) + /// Proof: BridgeRococoGrandpa CurrentAuthoritySet (max_values: Some(1), max_size: Some(50250), added: 50745, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa ImportedHashesPointer (r:1 w:1) + /// Proof: BridgeRococoGrandpa ImportedHashesPointer (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa ImportedHashes (r:1 w:1) + /// Proof: BridgeRococoGrandpa ImportedHashes (max_values: Some(1024), max_size: Some(36), added: 1521, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa ImportedHeaders (r:0 w:2) + /// Proof: BridgeRococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// The range of component `p` is `[1, 838]`. + /// The range of component `v` is `[50, 100]`. + /// The range of component `p` is `[1, 838]`. + /// The range of component `v` is `[50, 100]`. + fn submit_finality_proof(p: u32, _v: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `231 + p * (60 ±0)` + // Estimated: `51735` + // Minimum execution time: 224_590_000 picoseconds. + Weight::from_parts(225_581_000, 0) + .saturating_add(Weight::from_parts(0, 51735)) + // Standard Error: 5_887 + .saturating_add(Weight::from_parts(47_424_657, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(5)) + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_wococo_grandpa.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_wococo_grandpa.rs new file mode 100644 index 00000000000..1c3bfb2feef --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_wococo_grandpa.rs @@ -0,0 +1,80 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_grandpa` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_grandpa +// --chain=bridge-hub-rococo-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_grandpa`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_grandpa::WeightInfo for WeightInfo { + /// Storage: BridgeWococoGrandpa PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoGrandpa PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeWococoGrandpa BestFinalized (r:1 w:1) + /// Proof: BridgeWococoGrandpa BestFinalized (max_values: Some(1), max_size: Some(36), added: 531, mode: MaxEncodedLen) + /// Storage: BridgeWococoGrandpa CurrentAuthoritySet (r:1 w:0) + /// Proof: BridgeWococoGrandpa CurrentAuthoritySet (max_values: Some(1), max_size: Some(50250), added: 50745, mode: MaxEncodedLen) + /// Storage: BridgeWococoGrandpa ImportedHashesPointer (r:1 w:1) + /// Proof: BridgeWococoGrandpa ImportedHashesPointer (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeWococoGrandpa ImportedHashes (r:1 w:1) + /// Proof: BridgeWococoGrandpa ImportedHashes (max_values: Some(1024), max_size: Some(36), added: 1521, mode: MaxEncodedLen) + /// Storage: BridgeWococoGrandpa ImportedHeaders (r:0 w:2) + /// Proof: BridgeWococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// The range of component `p` is `[1, 838]`. + /// The range of component `v` is `[50, 100]`. + /// The range of component `p` is `[1, 838]`. + /// The range of component `v` is `[50, 100]`. + fn submit_finality_proof(p: u32, _v: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `268 + p * (60 ±0)` + // Estimated: `51735` + // Minimum execution time: 224_665_000 picoseconds. + Weight::from_parts(225_737_000, 0) + .saturating_add(Weight::from_parts(0, 51735)) + // Standard Error: 5_325 + .saturating_add(Weight::from_parts(47_412_944, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(5)) + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance.rs new file mode 100644 index 00000000000..47d1ec8d47c --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance.rs @@ -0,0 +1,232 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_messages` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_messages +// --chain=bridge-hub-rococo-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_messages`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_messages::WeightInfo for WeightInfo { + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn receive_single_message_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `52645` + // Minimum execution time: 42_364_000 picoseconds. + Weight::from_parts(43_780_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn receive_two_messages_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `52645` + // Minimum execution time: 54_010_000 picoseconds. + Weight::from_parts(66_691_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn receive_single_message_proof_with_outbound_lane_state() -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `52645` + // Minimum execution time: 48_066_000 picoseconds. + Weight::from_parts(48_635_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_1_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `335` + // Estimated: `52645` + // Minimum execution time: 40_997_000 picoseconds. + Weight::from_parts(41_710_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_16_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `335` + // Estimated: `52645` + // Minimum execution time: 67_556_000 picoseconds. + Weight::from_parts(68_573_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages OutboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) + /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn receive_delivery_proof_for_single_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `339` + // Estimated: `3804` + // Minimum execution time: 32_221_000 picoseconds. + Weight::from_parts(32_582_000, 0) + .saturating_add(Weight::from_parts(0, 3804)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages OutboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) + /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { + // Proof Size summary in bytes: + // Measured: `339` + // Estimated: `3804` + // Minimum execution time: 32_395_000 picoseconds. + Weight::from_parts(32_703_000, 0) + .saturating_add(Weight::from_parts(0, 3804)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages OutboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) + /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { + // Proof Size summary in bytes: + // Measured: `339` + // Estimated: `6086` + // Minimum execution time: 34_409_000 picoseconds. + Weight::from_parts(34_927_000, 0) + .saturating_add(Weight::from_parts(0, 6086)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) + /// The range of component `i` is `[128, 2048]`. + /// The range of component `i` is `[128, 2048]`. + fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `635` + // Estimated: `52645` + // Minimum execution time: 129_154_000 picoseconds. + Weight::from_parts(103_525_480, 0) + .saturating_add(Weight::from_parts(0, 52645)) + // Standard Error: 2_595 + .saturating_add(Weight::from_parts(536_761, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance.rs new file mode 100644 index 00000000000..0b2aceb489e --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance.rs @@ -0,0 +1,232 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_messages` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_messages +// --chain=bridge-hub-rococo-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_messages`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_messages::WeightInfo for WeightInfo { + /// Storage: BridgeWococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeWococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeWococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn receive_single_message_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `404` + // Estimated: `52645` + // Minimum execution time: 43_745_000 picoseconds. + Weight::from_parts(45_462_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeWococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeWococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeWococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn receive_two_messages_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `404` + // Estimated: `52645` + // Minimum execution time: 55_455_000 picoseconds. + Weight::from_parts(65_023_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeWococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeWococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeWococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn receive_single_message_proof_with_outbound_lane_state() -> Weight { + // Proof Size summary in bytes: + // Measured: `404` + // Estimated: `52645` + // Minimum execution time: 48_603_000 picoseconds. + Weight::from_parts(50_377_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeWococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeWococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeWococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_1_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `372` + // Estimated: `52645` + // Minimum execution time: 42_777_000 picoseconds. + Weight::from_parts(43_499_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeWococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeWococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeWococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_16_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `372` + // Estimated: `52645` + // Minimum execution time: 69_408_000 picoseconds. + Weight::from_parts(69_916_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeWococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeWococoMessages OutboundLanes (r:1 w:1) + /// Proof: BridgeWococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) + /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn receive_delivery_proof_for_single_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `376` + // Estimated: `3841` + // Minimum execution time: 33_122_000 picoseconds. + Weight::from_parts(34_379_000, 0) + .saturating_add(Weight::from_parts(0, 3841)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: BridgeWococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeWococoMessages OutboundLanes (r:1 w:1) + /// Proof: BridgeWococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) + /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { + // Proof Size summary in bytes: + // Measured: `376` + // Estimated: `3841` + // Minimum execution time: 33_049_000 picoseconds. + Weight::from_parts(33_747_000, 0) + .saturating_add(Weight::from_parts(0, 3841)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: BridgeWococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeWococoMessages OutboundLanes (r:1 w:1) + /// Proof: BridgeWococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) + /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { + // Proof Size summary in bytes: + // Measured: `376` + // Estimated: `6086` + // Minimum execution time: 35_578_000 picoseconds. + Weight::from_parts(36_007_000, 0) + .saturating_add(Weight::from_parts(0, 6086)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: BridgeWococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeWococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeWococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) + /// The range of component `i` is `[128, 2048]`. + /// The range of component `i` is `[128, 2048]`. + fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `672` + // Estimated: `52645` + // Minimum execution time: 130_070_000 picoseconds. + Weight::from_parts(104_597_637, 0) + .saturating_add(Weight::from_parts(0, 52645)) + // Standard Error: 2_607 + .saturating_add(Weight::from_parts(538_698, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance.rs new file mode 100644 index 00000000000..9e88bd08b7f --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance.rs @@ -0,0 +1,114 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_parachains` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_parachains +// --chain=bridge-hub-rococo-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_parachains`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_parachains::WeightInfo for WeightInfo { + /// Storage: BridgeRococoParachain PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa ImportedHeaders (r:1 w:0) + /// Proof: BridgeRococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ParasInfo (r:1 w:1) + /// Proof: BridgeRococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHashes (r:1 w:1) + /// Proof: BridgeRococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:0 w:1) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// The range of component `p` is `[1, 2]`. + /// The range of component `p` is `[1, 2]`. + fn submit_parachain_heads_with_n_parachains(_p: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `294` + // Estimated: `2543` + // Minimum execution time: 33_300_000 picoseconds. + Weight::from_parts(34_117_420, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: BridgeRococoParachain PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa ImportedHeaders (r:1 w:0) + /// Proof: BridgeRococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ParasInfo (r:1 w:1) + /// Proof: BridgeRococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHashes (r:1 w:1) + /// Proof: BridgeRococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:0 w:1) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + fn submit_parachain_heads_with_1kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `294` + // Estimated: `2543` + // Minimum execution time: 34_550_000 picoseconds. + Weight::from_parts(35_046_000, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: BridgeRococoParachain PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa ImportedHeaders (r:1 w:0) + /// Proof: BridgeRococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ParasInfo (r:1 w:1) + /// Proof: BridgeRococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHashes (r:1 w:1) + /// Proof: BridgeRococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:0 w:1) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + fn submit_parachain_heads_with_16kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `294` + // Estimated: `2543` + // Minimum execution time: 61_071_000 picoseconds. + Weight::from_parts(61_554_000, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance.rs new file mode 100644 index 00000000000..238fa8725d3 --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance.rs @@ -0,0 +1,114 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_parachains` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_parachains +// --chain=bridge-hub-rococo-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_parachains`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_parachains::WeightInfo for WeightInfo { + /// Storage: BridgeWococoParachain PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeWococoGrandpa ImportedHeaders (r:1 w:0) + /// Proof: BridgeWococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ParasInfo (r:1 w:1) + /// Proof: BridgeWococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHashes (r:1 w:1) + /// Proof: BridgeWococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:0 w:1) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// The range of component `p` is `[1, 2]`. + /// The range of component `p` is `[1, 2]`. + fn submit_parachain_heads_with_n_parachains(_p: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `2543` + // Minimum execution time: 34_469_000 picoseconds. + Weight::from_parts(35_382_374, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: BridgeWococoParachain PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeWococoGrandpa ImportedHeaders (r:1 w:0) + /// Proof: BridgeWococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ParasInfo (r:1 w:1) + /// Proof: BridgeWococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHashes (r:1 w:1) + /// Proof: BridgeWococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:0 w:1) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + fn submit_parachain_heads_with_1kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `2543` + // Minimum execution time: 35_690_000 picoseconds. + Weight::from_parts(36_400_000, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: BridgeWococoParachain PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeWococoGrandpa ImportedHeaders (r:1 w:0) + /// Proof: BridgeWococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ParasInfo (r:1 w:1) + /// Proof: BridgeWococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHashes (r:1 w:1) + /// Proof: BridgeWococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:0 w:1) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + fn submit_parachain_heads_with_16kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `2543` + // Minimum execution time: 62_242_000 picoseconds. + Weight::from_parts(62_690_000, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs new file mode 100644 index 00000000000..418f1326766 --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs @@ -0,0 +1,124 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_relayers` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_relayers +// --chain=bridge-hub-rococo-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_relayers`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_relayers::WeightInfo for WeightInfo { + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn claim_rewards() -> Weight { + // Proof Size summary in bytes: + // Measured: `207` + // Estimated: `3593` + // Minimum execution time: 53_286_000 picoseconds. + Weight::from_parts(53_905_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: unknown `0x1e8445dc201eeb8560e5579a5dd54655` (r:1 w:0) + /// Proof Skipped: unknown `0x1e8445dc201eeb8560e5579a5dd54655` (r:1 w:0) + /// Storage: Balances Reserves (r:1 w:1) + /// Proof: Balances Reserves (max_values: None, max_size: Some(1249), added: 3724, mode: MaxEncodedLen) + fn register() -> Weight { + // Proof Size summary in bytes: + // Measured: `61` + // Estimated: `4714` + // Minimum execution time: 29_145_000 picoseconds. + Weight::from_parts(29_698_000, 0) + .saturating_add(Weight::from_parts(0, 4714)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: Balances Reserves (r:1 w:1) + /// Proof: Balances Reserves (max_values: None, max_size: Some(1249), added: 3724, mode: MaxEncodedLen) + fn deregister() -> Weight { + // Proof Size summary in bytes: + // Measured: `160` + // Estimated: `4714` + // Minimum execution time: 30_298_000 picoseconds. + Weight::from_parts(30_754_000, 0) + .saturating_add(Weight::from_parts(0, 4714)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: Balances Reserves (r:1 w:1) + /// Proof: Balances Reserves (max_values: None, max_size: Some(1249), added: 3724, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn slash_and_deregister() -> Weight { + // Proof Size summary in bytes: + // Measured: `263` + // Estimated: `4714` + // Minimum execution time: 30_109_000 picoseconds. + Weight::from_parts(30_330_000, 0) + .saturating_add(Weight::from_parts(0, 4714)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn register_relayer_reward() -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `3538` + // Minimum execution time: 3_016_000 picoseconds. + Weight::from_parts(3_130_000, 0) + .saturating_add(Weight::from_parts(0, 3538)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs index b05c554580d..a0aaac56f5a 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs @@ -18,6 +18,7 @@ mod pallet_xcm_benchmarks_fungible; mod pallet_xcm_benchmarks_generic; use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use codec::Encode; use frame_support::weights::Weight; use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; @@ -217,8 +218,9 @@ impl XcmWeightInfo for BridgeHubRococoXcmWeight { fn universal_origin(_: &Junction) -> Weight { Weight::MAX } - fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { - Weight::MAX + fn export_message(_: &NetworkId, _: &Junctions, inner: &Xcm<()>) -> Weight { + let inner_encoded_len = inner.encode().len() as u32; + XcmGeneric::::export_message(inner_encoded_len) } fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { Weight::MAX diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 8572163a52b..0773dca274e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -338,6 +338,21 @@ impl WeightInfo { // Minimum execution time: 3_710_000 picoseconds. Weight::from_parts(3_820_000, 0) } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: BridgeWococoMessages PalletOperatingMode (r:1 w:0) + // Proof: BridgeWococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + // Storage: BridgeWococoMessages OutboundLanes (r:1 w:1) + // Proof: BridgeWococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) + // Storage: BridgeWococoMessages OutboundMessages (r:0 w:1) + // Proof: BridgeWococoMessages OutboundMessages (max_values: None, max_size: Some(2621472), added: 2623947, mode: MaxEncodedLen) + pub(crate) fn export_message(x: u32, ) -> Weight { + Weight::from_parts(31_677_716 as u64, 0) + // Standard Error: 4_158 + .saturating_add(Weight::from_parts(123_901, 0).saturating_mul(x as u64)) + .saturating_add(T::DbWeight::get().reads(3 as u64)) + .saturating_add(T::DbWeight::get().writes(2 as u64)) + } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index c629c18e0ca..91fd15136bb 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -15,8 +15,13 @@ // along with Cumulus. If not, see . use super::{ - AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, - Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, + AccountId, AllPalletsWithSystem, Balances, BridgeGrandpaRococoInstance, + BridgeGrandpaWococoInstance, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, + RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, +}; +use crate::{ + bridge_hub_rococo_config::ToBridgeHubWococoHaulBlobExporter, + bridge_hub_wococo_config::ToBridgeHubRococoHaulBlobExporter, }; use frame_support::{ match_types, parameter_types, @@ -29,27 +34,46 @@ use parachains_common::{ xcm_config::{ConcreteNativeAssetFrom, DenyReserveTransferToRelayChain, DenyThenTry}, }; use polkadot_parachain::primitives::Sibling; +use sp_core::Get; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, - WithComputedOrigin, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, + CurrencyAdapter, EnsureXcmOrigin, IsConcrete, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + UsingComponents, WeightInfoBounds, WithComputedOrigin, +}; +use xcm_executor::{ + traits::{ExportXcm, WithOriginFilter}, + XcmExecutor, }; -use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { pub const RelayLocation: MultiLocation = MultiLocation::parent(); - pub const RelayNetwork: Option = Some(NetworkId::Rococo); pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; } +pub struct RelayNetwork; +impl Get> for RelayNetwork { + fn get() -> Option { + Some(Self::get()) + } +} +impl Get for RelayNetwork { + fn get() -> NetworkId { + match u32::from(ParachainInfo::parachain_id()) { + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID => NetworkId::Rococo, + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID => NetworkId::Wococo, + para_id => unreachable!("Not supported for para_id: {}", para_id), + } + } +} + /// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. @@ -84,7 +108,7 @@ pub type XcmOriginToTransactDispatchOrigin = ( // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for // foreign chains who want to have a local sovereign account on this chain which they control. SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when // recognized. RelayChainAsNative, // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when @@ -148,7 +172,19 @@ impl Contains for SafeCallFilter { RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | - RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) => true, + RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | + RuntimeCall::BridgeRococoGrandpa(pallet_bridge_grandpa::Call::< + Runtime, + BridgeGrandpaRococoInstance, + >::initialize { + .. + }) | + RuntimeCall::BridgeWococoGrandpa(pallet_bridge_grandpa::Call::< + Runtime, + BridgeGrandpaWococoInstance, + >::initialize { + .. + }) => true, _ => false, } } @@ -173,6 +209,9 @@ pub type Barrier = DenyThenTry< UniversalLocation, ConstU32<8>, >, + // TODO:check-parameter - (https://github.com/paritytech/parity-bridges-common/issues/2084) + // remove this and extend `AllowExplicitUnpaidExecutionFrom` with "or SystemParachains" once merged https://github.com/paritytech/polkadot/pull/7005 + AllowUnpaidExecutionFrom, ), >; @@ -205,7 +244,7 @@ impl xcm_executor::Config for XcmConfig { type AssetLocker = (); type AssetExchanger = (); type FeeManager = (); - type MessageExporter = (); + type MessageExporter = BridgeHubRococoOrBridgeHubWococoSwitchExporter; type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; @@ -231,12 +270,11 @@ parameter_types! { impl pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; + type XcmRouter = XcmRouter; // We want to disallow users sending (arbitrary) XCMs from this chain. type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; // We support local origins dispatching XCM executions in principle... type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports are allowed. type XcmExecuteFilter = Nothing; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; @@ -266,3 +304,46 @@ impl cumulus_pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; } + +/// Hacky switch implementation, because we have just one runtime for Rococo and Wococo BridgeHub, so it means we have just one XcmConfig +pub struct BridgeHubRococoOrBridgeHubWococoSwitchExporter; +impl ExportXcm for BridgeHubRococoOrBridgeHubWococoSwitchExporter { + type Ticket = (NetworkId, (sp_std::prelude::Vec, XcmHash)); + + fn validate( + network: NetworkId, + channel: u32, + universal_source: &mut Option, + destination: &mut Option, + message: &mut Option>, + ) -> SendResult { + match network { + Rococo => ToBridgeHubRococoHaulBlobExporter::validate( + network, + channel, + universal_source, + destination, + message, + ) + .map(|result| ((Rococo, result.0), result.1)), + Wococo => ToBridgeHubWococoHaulBlobExporter::validate( + network, + channel, + universal_source, + destination, + message, + ) + .map(|result| ((Wococo, result.0), result.1)), + _ => unimplemented!("Unsupported network: {:?}", network), + } + } + + fn deliver(ticket: Self::Ticket) -> Result { + let (network, ticket) = ticket; + match network { + Rococo => ToBridgeHubRococoHaulBlobExporter::deliver(ticket), + Wococo => ToBridgeHubWococoHaulBlobExporter::deliver(ticket), + _ => unimplemented!("Unsupported network: {:?}", network), + } + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index bf899b567d8..a31171ba609 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -15,10 +15,20 @@ // along with Cumulus. If not, see . pub use bridge_hub_rococo_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, - ParachainSystem, PolkadotXcm, Runtime, RuntimeEvent, SessionKeys, + constants::fee::WeightToFee, + xcm_config::{RelayNetwork, XcmConfig, XcmRouter}, + Balances, BridgeGrandpaRococoInstance, BridgeGrandpaWococoInstance, BridgeWococoMessages, + ExistentialDeposit, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, + SessionKeys, }; -use codec::Decode; +use codec::{Decode, Encode}; +use xcm::latest::prelude::*; + +use bridge_hub_rococo_runtime::{ + bridge_hub_rococo_config, bridge_hub_wococo_config, WithBridgeHubRococoMessagesInstance, + WithBridgeHubWococoMessagesInstance, +}; + use frame_support::parameter_types; use parachains_common::{AccountId, AuraId}; @@ -28,29 +38,188 @@ parameter_types! { pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } -bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - 1013 -); +mod bridge_hub_rococo_tests { + use super::*; + + bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( + Runtime, + XcmConfig, + CheckingAccount, + WeightToFee, + ParachainSystem, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID + ); + + bridge_hub_test_utils::include_initialize_bridge_by_governance_works!( + Runtime, + BridgeGrandpaWococoInstance, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::BridgeWococoGrandpa(call).encode()) + ); + + bridge_hub_test_utils::include_handle_export_message_from_system_parachain_to_outbound_queue_works!( + Runtime, + XcmConfig, + WithBridgeHubWococoMessagesInstance, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + 1000, + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeWococoMessages(event)) => Some(event), + _ => None, + } + }), + || ExportMessage { network: Wococo, destination: X1(Parachain(1234)), xcm: Xcm(vec![]) }, + bridge_hub_rococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO + ); + + bridge_hub_test_utils::include_message_dispatch_routing_works!( + Runtime, + XcmConfig, + ParachainSystem, + WithBridgeHubWococoMessagesInstance, + RelayNetwork, + bridge_hub_rococo_config::WococoGlobalConsensusNetwork, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + 1000, + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::ParachainSystem(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + bridge_hub_rococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO + ); +} + +mod bridge_hub_wococo_tests { + use super::*; + + bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( + Runtime, + XcmConfig, + CheckingAccount, + WeightToFee, + ParachainSystem, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID + ); + + bridge_hub_test_utils::include_initialize_bridge_by_governance_works!( + Runtime, + BridgeGrandpaRococoInstance, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::BridgeRococoGrandpa(call).encode()) + ); + + bridge_hub_test_utils::include_handle_export_message_from_system_parachain_to_outbound_queue_works!( + Runtime, + XcmConfig, + WithBridgeHubRococoMessagesInstance, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + 1000, + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeRococoMessages(event)) => Some(event), + _ => None, + } + }), + || ExportMessage { network: Rococo, destination: X1(Parachain(4321)), xcm: Xcm(vec![]) }, + bridge_hub_wococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO + ); + + bridge_hub_test_utils::include_message_dispatch_routing_works!( + Runtime, + XcmConfig, + ParachainSystem, + WithBridgeHubRococoMessagesInstance, + RelayNetwork, + bridge_hub_wococo_config::RococoGlobalConsensusNetwork, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + 1000, + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::ParachainSystem(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + bridge_hub_wococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO + ); +} diff --git a/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml index ccee28f82cf..096c777901a 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -6,12 +6,68 @@ edition = "2021" description = "Utils for BridgeHub testing" [dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } +log = { version = "0.4.17", default-features = false } + +# Substrate +frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } # Cumulus +cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } +pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } +cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } +parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } asset-test-utils = { path = "../../assets/test-utils"} +# Polkadot +pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +pallet-xcm-benchmarks = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false, optional = true } +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } + +# Bridges +bp-header-chain = { path = "../../../../bridges/primitives/header-chain", default-features = false } +bp-messages = { path = "../../../../bridges/primitives/messages", default-features = false } +bp-polkadot-core = { path = "../../../../bridges/primitives/polkadot-core", default-features = false } +bp-runtime = { path = "../../../../bridges/primitives/runtime", default-features = false } +bp-test-utils = { path = "../../../../bridges/primitives/test-utils", default-features = false } +pallet-bridge-grandpa = { path = "../../../../bridges/modules/grandpa", default-features = false } +pallet-bridge-messages = { path = "../../../../bridges/modules/messages", default-features = false } +bridge-runtime-common = { path = "../../../../bridges/bin/runtime-common", default-features = false } + [features] default = [ "std" ] std = [ + "codec/std", + "log/std", + "frame-support/std", + "frame-system/std", + "bp-messages/std", + "bp-polkadot-core/std", + "bp-header-chain/std", + "bp-runtime/std", + "bp-test-utils/std", + "bridge-runtime-common/std", + "pallet-bridge-grandpa/std", + "pallet-bridge-messages/std", + "parachain-info/std", + "cumulus-pallet-parachain-system/std", + "cumulus-pallet-xcmp-queue/std", + "pallet-xcm/std", + "sp-io/std", + "sp-runtime/std", + "xcm/std", + "xcm-builder/std", + "xcm-executor/std", "asset-test-utils/std", + "cumulus-pallet-dmp-queue/std", + "pallet-session/std", + "pallet-balances/std", ] diff --git a/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs b/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs index 882910b5fc0..b65b25c525d 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs @@ -14,5 +14,6 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . +pub use bp_test_utils::test_header; pub mod test_cases; pub use test_cases::CollatorSessionKeys; diff --git a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs index cdbeb65fab1..5cdc2af9968 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs +++ b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs @@ -16,5 +16,476 @@ //! Module contains predefined test-case scenarios for `Runtime` with bridging capabilities. +use codec::Encode; +use frame_support::{assert_ok, traits::Get}; +use xcm::latest::prelude::*; +use xcm_builder::DispatchBlobError; +use xcm_executor::XcmExecutor; + +// Lets re-use this stuff from assets (later we plan to move it outside of assets as `runtimes/test-utils`) +use asset_test_utils::{ + mock_open_hrmp_channel, AccountIdOf, ExtBuilder, RuntimeHelper, ValidatorIdOf, +}; + // Re-export test_cases from assets -pub use asset_test_utils::{include_teleports_for_native_asset_works, CollatorSessionKeys}; +pub use asset_test_utils::{ + include_teleports_for_native_asset_works, CollatorSessionKeys, XcmReceivedFrom, +}; +use bp_messages::{ + target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch}, + LaneId, MessageKey, OutboundLaneData, +}; +use bridge_runtime_common::messages_xcm_extension::{ + XcmAsPlainPayload, XcmBlobMessageDispatchResult, +}; + +/// Test-case makes sure that `Runtime` can process bridging initialize via governance-like call +pub fn initialize_bridge_by_governance_works( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + runtime_call_encode: Box< + dyn Fn(pallet_bridge_grandpa::Call) -> Vec, + >, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_dmp_queue::Config + + cumulus_pallet_parachain_system::Config + + pallet_bridge_grandpa::Config, + GrandpaPalletInstance: 'static, + ValidatorIdOf: From>, +{ + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_para_id(runtime_para_id.into()) + .with_tracing() + .build() + .execute_with(|| { + // check mode before + assert_eq!( + pallet_bridge_grandpa::PalletOperatingMode::::try_get(), + Err(()) + ); + + // encode `initialize` call + let initialize_call = runtime_call_encode(pallet_bridge_grandpa::Call::< + Runtime, + GrandpaPalletInstance, + >::initialize { + init_data: test_data::initialization_data::(12345), + }); + + // overestimate - check weight for `pallet_bridge_grandpa::Pallet::initialize()` call + let require_weight_at_most = + ::DbWeight::get().reads_writes(7, 7); + + // execute XCM with Transacts to initialize bridge as governance does + // prepare data for xcm::Transact(create) + assert_ok!(RuntimeHelper::::execute_as_governance( + initialize_call, + require_weight_at_most + ) + .ensure_complete()); + + // check mode after + assert_eq!( + pallet_bridge_grandpa::PalletOperatingMode::::try_get(), + Ok(bp_runtime::BasicOperatingMode::Normal) + ); + }) +} + +#[macro_export] +macro_rules! include_initialize_bridge_by_governance_works( + ( + $runtime:path, + $pallet_bridge_grandpa_instance:path, + $collator_session_key:expr, + $runtime_para_id:expr, + $runtime_call_encode:expr + ) => { + #[test] + fn initialize_bridge_by_governance_works() { + $crate::test_cases::initialize_bridge_by_governance_works::< + $runtime, + $pallet_bridge_grandpa_instance, + >( + $collator_session_key, + $runtime_para_id, + $runtime_call_encode + ) + } + } +); + +/// Test-case makes sure that `Runtime` can handle xcm `ExportMessage`: +/// Checks if received XCM messages is correctly added to the message outbound queue for delivery. +/// For SystemParachains we expect unpaid execution. +pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< + Runtime, + XcmConfig, + MessagesPalletInstance, +>( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + sibling_parachain_id: u32, + unwrap_pallet_bridge_messages_event: Box< + dyn Fn(Vec) -> Option>, + >, + export_message_instruction: fn() -> Instruction, + expected_lane_id: LaneId, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_dmp_queue::Config + + cumulus_pallet_parachain_system::Config + + pallet_bridge_messages::Config, + XcmConfig: xcm_executor::Config, + MessagesPalletInstance: 'static, + ValidatorIdOf: From>, +{ + assert_ne!(runtime_para_id, sibling_parachain_id); + let sibling_parachain_location = MultiLocation::new(1, Parachain(sibling_parachain_id)); + + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_para_id(runtime_para_id.into()) + .with_tracing() + .build() + .execute_with(|| { + // check queue before + assert_eq!( + pallet_bridge_messages::OutboundLanes::::try_get( + &expected_lane_id + ), + Err(()) + ); + + // prepare `ExportMessage` + let xcm = Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + export_message_instruction(), + ]); + + // execute XCM + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + assert_ok!(XcmExecutor::::execute_xcm( + sibling_parachain_location, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + ) + .ensure_complete()); + + // check queue after + assert_eq!( + pallet_bridge_messages::OutboundLanes::::try_get( + &expected_lane_id + ), + Ok(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 0, + latest_generated_nonce: 1, + }) + ); + + // check events + let mut events = >::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_messages_event(e.event.encode())); + assert!( + events.any(|e| matches!(e, pallet_bridge_messages::Event::MessageAccepted { .. })) + ); + }) +} + +#[macro_export] +macro_rules! include_handle_export_message_from_system_parachain_to_outbound_queue_works( + ( + $runtime:path, + $xcm_config:path, + $pallet_bridge_messages_instance:path, + $collator_session_key:expr, + $runtime_para_id:expr, + $sibling_parachain_id:expr, + $unwrap_pallet_bridge_messages_event:expr, + $export_message_instruction:expr, + $expected_lane_id:expr + ) => { + #[test] + fn handle_export_message_from_system_parachain_add_to_outbound_queue_works() { + $crate::test_cases::handle_export_message_from_system_parachain_to_outbound_queue_works::< + $runtime, + $xcm_config, + $pallet_bridge_messages_instance + >( + $collator_session_key, + $runtime_para_id, + $sibling_parachain_id, + $unwrap_pallet_bridge_messages_event, + $export_message_instruction, + $expected_lane_id + ) + } + } +); + +/// Test-case makes sure that Runtime can route XCM messages received in inbound queue, +/// We just test here `MessageDispatch` configuration. +/// We expect that runtime can route messages: +/// 1. to Parent (relay chain) +/// 2. to Sibling parachain +pub fn message_dispatch_routing_works< + Runtime, + XcmConfig, + HrmpChannelOpener, + MessagesPalletInstance, + RuntimeNetwork, + BridgedNetwork, +>( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + sibling_parachain_id: u32, + unwrap_cumulus_pallet_parachain_system_event: Box< + dyn Fn(Vec) -> Option>, + >, + unwrap_cumulus_pallet_xcmp_queue_event: Box< + dyn Fn(Vec) -> Option>, + >, + expected_lane_id: LaneId, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_dmp_queue::Config + + cumulus_pallet_parachain_system::Config + + cumulus_pallet_xcmp_queue::Config + + pallet_bridge_messages::Config, + XcmConfig: xcm_executor::Config, + MessagesPalletInstance: 'static, + ValidatorIdOf: From>, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + // MessageDispatcher: MessageDispatch, DispatchLevelResult = XcmBlobMessageDispatchResult, DispatchPayload = XcmAsPlainPayload>, + RuntimeNetwork: Get, + BridgedNetwork: Get, +{ + assert_ne!(runtime_para_id, sibling_parachain_id); + + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_safe_xcm_version(XCM_VERSION) + .with_para_id(runtime_para_id.into()) + .with_tracing() + .build() + .execute_with(|| { + // 1. this message is sent from other global consensus with destination of this Runtime relay chain (UMP) + let bridging_message = + test_data::simulate_message_exporter_on_bridged_chain::( + (RuntimeNetwork::get(), Here) + ); + let result = <>::MessageDispatch>::dispatch( + test_data::dispatch_message(expected_lane_id, 1, bridging_message) + ); + assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched)); + + // check events - UpwardMessageSent + let mut events = >::events() + .into_iter() + .filter_map(|e| unwrap_cumulus_pallet_parachain_system_event(e.event.encode())); + assert!( + events.any(|e| matches!(e, cumulus_pallet_parachain_system::Event::UpwardMessageSent { .. })) + ); + + // 2. this message is sent from other global consensus with destination of this Runtime sibling parachain (HRMP) + let bridging_message = + test_data::simulate_message_exporter_on_bridged_chain::( + (RuntimeNetwork::get(), X1(Parachain(sibling_parachain_id))), + ); + + // 2.1. WITHOUT opened hrmp channel -> RoutingError + let result = + <>::MessageDispatch>::dispatch( + DispatchMessage { + key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, + data: DispatchMessageData { payload: Ok(bridging_message.clone()) }, + } + ); + assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::NotDispatched(Some(DispatchBlobError::RoutingError)))); + + // check events - no XcmpMessageSent + assert_eq!(>::events() + .into_iter() + .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())) + .count(), 0); + + // 2.1. WITH hrmp channel -> Ok + mock_open_hrmp_channel::(runtime_para_id.into(), sibling_parachain_id.into()); + let result = <>::MessageDispatch>::dispatch( + DispatchMessage { + key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, + data: DispatchMessageData { payload: Ok(bridging_message) }, + } + ); + assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched)); + + // check events - XcmpMessageSent + let mut events = >::events() + .into_iter() + .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())); + assert!( + events.any(|e| matches!(e, cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. })) + ); + }) +} + +#[macro_export] +macro_rules! include_message_dispatch_routing_works( + ( + $runtime:path, + $xcm_config:path, + $hrmp_channel_opener:path, + $pallet_bridge_messages_instance:path, + $runtime_network:path, + $bridged_network:path, + $collator_session_key:expr, + $runtime_para_id:expr, + $sibling_parachain_id:expr, + $unwrap_cumulus_pallet_parachain_system_event:expr, + $unwrap_cumulus_pallet_xcmp_queue_event:expr, + $expected_lane_id:expr + ) => { + #[test] + fn message_dispatch_routing_works() { + $crate::test_cases::message_dispatch_routing_works::< + $runtime, + $xcm_config, + $hrmp_channel_opener, + $pallet_bridge_messages_instance, + $runtime_network, + $bridged_network + >( + $collator_session_key, + $runtime_para_id, + $sibling_parachain_id, + $unwrap_cumulus_pallet_parachain_system_event, + $unwrap_cumulus_pallet_xcmp_queue_event, + $expected_lane_id, + ) + } + } +); + +mod test_data { + use super::*; + use bp_messages::MessageNonce; + use xcm_builder::{HaulBlob, HaulBlobError, HaulBlobExporter}; + use xcm_executor::traits::{validate_export, ExportXcm}; + + /// Helper that creates InitializationData mock data, that can be used to initialize bridge GRANDPA pallet + pub(crate) fn initialization_data< + Runtime: pallet_bridge_grandpa::Config, + GrandpaPalletInstance: 'static, + >( + block_number: u32, + ) -> bp_header_chain::InitializationData< + pallet_bridge_grandpa::BridgedHeader, + > { + bp_header_chain::InitializationData { + header: Box::new(bp_test_utils::test_header(block_number.into())), + authority_list: Default::default(), + set_id: 6, + operating_mode: bp_runtime::BasicOperatingMode::Normal, + } + } + + /// Dummy xcm + pub(crate) fn dummy_xcm() -> Xcm<()> { + vec![Trap(42)].into() + } + + pub(crate) fn dispatch_message( + lane_id: LaneId, + nonce: MessageNonce, + payload: Vec, + ) -> DispatchMessage> { + DispatchMessage { + key: MessageKey { lane_id, nonce }, + data: DispatchMessageData { payload: Ok(payload) }, + } + } + + /// Macro used for simulate_export_message and capturing bytes + macro_rules! grab_haul_blob ( + ($name:ident, $grabbed_payload:ident) => { + std::thread_local! { + static $grabbed_payload: std::cell::RefCell>> = std::cell::RefCell::new(None); + } + + struct $name; + impl HaulBlob for $name { + fn haul_blob(blob: Vec) -> Result<(), HaulBlobError>{ + $grabbed_payload.with(|rm| *rm.borrow_mut() = Some(blob)); + Ok(()) + } + } + } + ); + + /// Simulates `HaulBlobExporter` and all its wrapping and captures generated plain bytes, + /// which are transfered over bridge. + pub(crate) fn simulate_message_exporter_on_bridged_chain< + SourceNetwork: Get, + DestinationNetwork: Get, + >( + (destination_network, destination_junctions): (NetworkId, Junctions), + ) -> Vec { + grab_haul_blob!(GrabbingHaulBlob, GRABBED_HAUL_BLOB_PAYLOAD); + + // lets pretend that some parachain on bridged chain exported the message + let universal_source_on_bridged_chain = + X2(GlobalConsensus(SourceNetwork::get()), Parachain(5678)); + let channel = 1_u32; + + // simulate XCM message export + let (ticket, fee) = + validate_export::>( + destination_network, + channel, + universal_source_on_bridged_chain, + destination_junctions, + dummy_xcm(), + ) + .expect("validate_export to pass"); + log::info!( + target: "simulate_message_exporter_on_bridged_chain", + "HaulBlobExporter::validate fee: {:?}", + fee + ); + let xcm_hash = + HaulBlobExporter::::deliver(ticket) + .expect("deliver to pass"); + log::info!( + target: "simulate_message_exporter_on_bridged_chain", + "HaulBlobExporter::deliver xcm_hash: {:?}", + xcm_hash + ); + + GRABBED_HAUL_BLOB_PAYLOAD.with(|r| r.take().expect("Encoded message should be here")) + } +} diff --git a/polkadot-parachain/src/chain_spec/bridge_hubs.rs b/polkadot-parachain/src/chain_spec/bridge_hubs.rs index ab3e44220cc..e11f7f6e53f 100644 --- a/polkadot-parachain/src/chain_spec/bridge_hubs.rs +++ b/polkadot-parachain/src/chain_spec/bridge_hubs.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright 2022 Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -14,10 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . +use crate::chain_spec::{get_account_id_from_seed, get_collator_keys_from_seed}; use cumulus_primitives_core::ParaId; use parachains_common::Balance as BridgeHubBalance; use sc_chain_spec::ChainSpec; use sc_cli::RuntimeVersion; +use sp_core::sr25519; use std::{path::PathBuf, str::FromStr}; /// Collects all supported BridgeHub configurations @@ -139,6 +141,7 @@ impl BridgeHubRuntimeType { "Rococo BridgeHub Local", "rococo-local", ParaId::new(1013), + Some("Bob".to_string()), |_| (), ))), BridgeHubRuntimeType::RococoDevelopment => Ok(Box::new(rococo::local_config( @@ -146,6 +149,7 @@ impl BridgeHubRuntimeType { "Rococo BridgeHub Development", "rococo-dev", ParaId::new(1013), + Some("Bob".to_string()), |_| (), ))), BridgeHubRuntimeType::Wococo => @@ -157,6 +161,7 @@ impl BridgeHubRuntimeType { "Wococo BridgeHub Local", "wococo-local", ParaId::new(1014), + Some("Bob".to_string()), ))), } } @@ -197,13 +202,12 @@ fn ensure_id(id: &str) -> Result<&str, String> { /// Sub-module for Rococo setup pub mod rococo { - use super::{BridgeHubBalance, ParaId}; - use crate::chain_spec::{ - get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION, - }; + use super::{get_account_id_from_seed, get_collator_keys_from_seed, sr25519, ParaId}; + use crate::chain_spec::{Extensions, SAFE_XCM_VERSION}; use parachains_common::{AccountId, AuraId}; use sc_chain_spec::ChainType; - use sp_core::sr25519; + + use super::BridgeHubBalance; pub(crate) const BRIDGE_HUB_ROCOCO: &str = "bridge-hub-rococo"; pub(crate) const BRIDGE_HUB_ROCOCO_LOCAL: &str = "bridge-hub-rococo-local"; @@ -222,6 +226,7 @@ pub mod rococo { chain_name: &str, relay_chain: &str, para_id: ParaId, + bridges_pallet_owner_seed: Option, modify_props: ModifyProperties, ) -> BridgeHubChainSpec { // Rococo defaults @@ -265,6 +270,9 @@ pub mod rococo { get_account_id_from_seed::("Ferdie//stash"), ], para_id, + bridges_pallet_owner_seed + .as_ref() + .map(|seed| get_account_id_from_seed::(&seed)), ) }, Vec::new(), @@ -280,6 +288,7 @@ pub mod rococo { invulnerables: Vec<(AccountId, AuraId)>, endowed_accounts: Vec, id: ParaId, + bridges_pallet_owner: Option, ) -> bridge_hub_rococo_runtime::GenesisConfig { bridge_hub_rococo_runtime::GenesisConfig { system: bridge_hub_rococo_runtime::SystemConfig { @@ -314,6 +323,22 @@ pub mod rococo { polkadot_xcm: bridge_hub_rococo_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), }, + bridge_wococo_grandpa: bridge_hub_rococo_runtime::BridgeWococoGrandpaConfig { + owner: bridges_pallet_owner.clone(), + ..Default::default() + }, + bridge_rococo_grandpa: bridge_hub_rococo_runtime::BridgeRococoGrandpaConfig { + owner: bridges_pallet_owner.clone(), + ..Default::default() + }, + bridge_rococo_messages: bridge_hub_rococo_runtime::BridgeRococoMessagesConfig { + owner: bridges_pallet_owner.clone(), + ..Default::default() + }, + bridge_wococo_messages: bridge_hub_rococo_runtime::BridgeWococoMessagesConfig { + owner: bridges_pallet_owner, + ..Default::default() + }, } } } @@ -334,10 +359,18 @@ pub mod wococo { chain_name: &str, relay_chain: &str, para_id: ParaId, + bridges_pallet_owner_seed: Option, ) -> BridgeHubChainSpec { - rococo::local_config(id, chain_name, relay_chain, para_id, |properties| { - properties.insert("tokenSymbol".into(), "WOOK".into()); - }) + rococo::local_config( + id, + chain_name, + relay_chain, + para_id, + bridges_pallet_owner_seed, + |properties| { + properties.insert("tokenSymbol".into(), "WOOK".into()); + }, + ) } } diff --git a/scripts/bridges_rococo_wococo.sh b/scripts/bridges_rococo_wococo.sh new file mode 100755 index 00000000000..fa79ab884ab --- /dev/null +++ b/scripts/bridges_rococo_wococo.sh @@ -0,0 +1,673 @@ +#!/bin/bash + +# Address: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# AccountId: [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] +STATEMINE_ACCOUNT_SEED_FOR_LOCAL="//Alice" +# Address: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# AccountId: [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] +WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL="5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" + +# Address: GegTpZJMyzkntLN7NJhRfHDk4GWukLbGSsag6PHrLSrCK4h +ROCKMINE2_ACCOUNT_SEED_FOR_ROCOCO="scatter feed race company oxygen trip extra elbow slot bundle auto canoe" + +# Adress: 5Ge7YcbctWCP1CccugzxWDn9hFnTxvTh3bL6PNy4ubNJmp7Y / H9jCvwVWsDJkrS4gPp1QB99qr4hmbGsVyAqn3F2PPaoWyU3 +# AccountId: [202, 107, 198, 135, 15, 25, 193, 165, 172, 73, 137, 218, 115, 177, 204, 0, 5, 155, 215, 86, 208, 51, 50, 130, 190, 110, 184, 143, 124, 50, 160, 20] +WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO="5Ge7YcbctWCP1CccugzxWDn9hFnTxvTh3bL6PNy4ubNJmp7Y" +WOCKMINT_ACCOUNT_SEED_FOR_WOCOCO="tone spirit magnet sunset cannon poverty forget lock river east blouse random" + +function address_to_account_id_bytes() { + local address=$1 + local output=$2 + echo "address_to_account_id_bytes - address: $address, output: $output" + if [ $address == "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" ]; then + jq --null-input '[212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]' > $output + elif [ $address == "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" ]; then + jq --null-input '[202, 107, 198, 135, 15, 25, 193, 165, 172, 73, 137, 218, 115, 177, 204, 0, 5, 155, 215, 86, 208, 51, 50, 130, 190, 110, 184, 143, 124, 50, 160, 20]' > $output + else + echo -n "Sorry, unknown address: $address - please, add bytes here or function for that!" + exit 1 + fi +} + +function ensure_binaries() { + if [[ ! -f ~/local_bridge_testing/bin/polkadot ]]; then + echo " Required polkadot binary '~/local_bridge_testing/bin/polkadot' does not exist!" + echo " You need to build it and copy to this location!" + echo " Please, check ./parachains/runtimes/bridge-hubs/README.md (Prepare/Build/Deploy)" + exit 1 + fi + if [[ ! -f ~/local_bridge_testing/bin/polkadot-parachain ]]; then + echo " Required polkadot-parachain binary '~/local_bridge_testing/bin/polkadot-parachain' does not exist!" + echo " You need to build it and copy to this location!" + echo " Please, check ./parachains/runtimes/bridge-hubs/README.md (Prepare/Build/Deploy)" + exit 1 + fi +} + +function ensure_relayer() { + if [[ ! -f ~/local_bridge_testing/bin/substrate-relay ]]; then + echo " Required substrate-relay binary '~/local_bridge_testing/bin/substrate-relay' does not exist!" + echo " You need to build it and copy to this location!" + echo " Please, check ./parachains/runtimes/bridge-hubs/README.md (Prepare/Build/Deploy)" + exit 1 + fi +} + +function ensure_polkadot_js_api() { + if ! which polkadot-js-api &> /dev/null; then + echo '' + echo 'Required command `polkadot-js-api` not in PATH, please, install, e.g.:' + echo "npm install -g @polkadot/api-cli@beta" + echo " or" + echo "yarn global add @polkadot/api-cli" + echo '' + exit 1 + fi + if ! which jq &> /dev/null; then + echo '' + echo 'Required command `jq` not in PATH, please, install, e.g.:' + echo "apt install -y jq" + echo '' + exit 1 + fi + generate_hex_encoded_call_data "check" "--" + local retVal=$? + if [ $retVal -ne 0 ]; then + echo "" + echo "" + echo "-------------------" + echo "Installing (nodejs) sub module: ./scripts/generate_hex_encoded_call" + pushd ./scripts/generate_hex_encoded_call + npm install + popd + fi +} + +function generate_hex_encoded_call_data() { + local type=$1 + local endpoint=$2 + local output=$3 + shift + shift + shift + echo "Input params: $@" + + node ./scripts/generate_hex_encoded_call "$type" "$endpoint" "$output" "$@" + local retVal=$? + + if [ $type != "check" ]; then + local hex_encoded_data=$(cat $output) + echo "Generated hex-encoded bytes to file '$output': $hex_encoded_data" + fi + + return $retVal +} + +function transfer_balance() { + local runtime_para_endpoint=$1 + local seed=$2 + local target_account=$3 + local amount=$4 + echo " calling transfer_balance:" + echo " runtime_para_endpoint: ${runtime_para_endpoint}" + echo " seed: ${seed}" + echo " target_account: ${target_account}" + echo " amount: ${amount}" + echo "--------------------------------------------------" + + polkadot-js-api \ + --ws "${runtime_para_endpoint}" \ + --seed "${seed?}" \ + tx.balances.transfer \ + "${target_account}" \ + "${amount}" +} + +function send_governance_transact() { + local relay_url=$1 + local relay_chain_seed=$2 + local para_id=$3 + local hex_encoded_data=$4 + local require_weight_at_most_ref_time=$5 + local require_weight_at_most_proof_size=$6 + echo " calling send_governance_transact:" + echo " relay_url: ${relay_url}" + echo " relay_chain_seed: ${relay_chain_seed}" + echo " para_id: ${para_id}" + echo " hex_encoded_data: ${hex_encoded_data}" + echo " require_weight_at_most_ref_time: ${require_weight_at_most_ref_time}" + echo " require_weight_at_most_proof_size: ${require_weight_at_most_proof_size}" + echo " params:" + + local dest=$(jq --null-input \ + --arg para_id "$para_id" \ + '{ "V3": { "parents": 0, "interior": { "X1": { "Parachain": $para_id } } } }') + + local message=$(jq --null-input \ + --argjson hex_encoded_data $hex_encoded_data \ + --arg require_weight_at_most_ref_time "$require_weight_at_most_ref_time" \ + --arg require_weight_at_most_proof_size "$require_weight_at_most_proof_size" \ + ' + { + "V3": [ + { + "UnpaidExecution": { + "weight_limit": "Unlimited" + } + }, + { + "Transact": { + "origin_kind": "Superuser", + "require_weight_at_most": { + "ref_time": $require_weight_at_most_ref_time, + "proof_size": $require_weight_at_most_proof_size, + }, + "call": { + "encoded": $hex_encoded_data + } + } + } + ] + } + ') + + echo "" + echo " dest:" + echo "${dest}" + echo "" + echo " message:" + echo "${message}" + echo "" + echo "--------------------------------------------------" + + polkadot-js-api \ + --ws "${relay_url?}" \ + --seed "${relay_chain_seed?}" \ + --sudo \ + tx.xcmPallet.send \ + "${dest}" \ + "${message}" +} + +function allow_assets_transfer_send() { + local relay_url=$1 + local relay_chain_seed=$2 + local runtime_para_id=$3 + local runtime_para_endpoint=$4 + local bridge_hub_para_id=$5 + local bridged_para_network=$6 + local bridged_para_para_id=$7 + echo " calling allow_assets_transfer_send:" + echo " relay_url: ${relay_url}" + echo " relay_chain_seed: ${relay_chain_seed}" + echo " runtime_para_id: ${runtime_para_id}" + echo " runtime_para_endpoint: ${runtime_para_endpoint}" + echo " bridge_hub_para_id: ${bridge_hub_para_id}" + echo " bridged_para_network: ${bridged_para_network}" + echo " bridged_para_para_id: ${bridged_para_para_id}" + echo " params:" + + # 1. generate data for Transact (add_exporter_config) + local bridge_config=$(jq --null-input \ + --arg bridge_hub_para_id "$bridge_hub_para_id" \ + --arg bridged_para_network "$bridged_para_network" \ + --arg bridged_para_para_id "$bridged_para_para_id" \ + ' + { + "bridgeLocation": { + "parents": 1, + "interior": { + "X1": { "Parachain": $bridge_hub_para_id } + } + }, + "allowedTargetLocation": { + "parents": 2, + "interior": { + "X2": [ + { + "GlobalConsensus": $bridged_para_network, + }, + { + "Parachain": $bridged_para_para_id + } + ] + } + }, + "maxTargetLocationFee": { + "id": { + "Concrete": { + "parents": 1, + "interior": "Here" + } + }, + "fun": { + "Fungible": 50000000000 + } + } + } + ' + ) + local tmp_output_file=$(mktemp) + generate_hex_encoded_call_data "add-exporter-config" "${runtime_para_endpoint}" "${tmp_output_file}" $bridged_para_network "$bridge_config" + local hex_encoded_data=$(cat $tmp_output_file) + + send_governance_transact "${relay_url}" "${relay_chain_seed}" "${runtime_para_id}" "${hex_encoded_data}" 200000000 12000 +} + +function force_create_foreign_asset() { + local relay_url=$1 + local relay_chain_seed=$2 + local runtime_para_id=$3 + local runtime_para_endpoint=$4 + local global_consensus=$5 + local asset_owner_account_id=$6 + echo " calling force_create_foreign_asset:" + echo " relay_url: ${relay_url}" + echo " relay_chain_seed: ${relay_chain_seed}" + echo " runtime_para_id: ${runtime_para_id}" + echo " runtime_para_endpoint: ${runtime_para_endpoint}" + echo " global_consensus: ${global_consensus}" + echo " asset_owner_account_id: ${asset_owner_account_id}" + echo " params:" + + # 1. generate data for Transact (ForeignAssets::force_create) + local asset_id=$(jq --null-input \ + --arg global_consensus "$global_consensus" \ + ' + { + "parents": 2, + "interior": { + "X1": { + "GlobalConsensus": $global_consensus, + } + } + } + ' + ) + local tmp_output_file=$(mktemp) + generate_hex_encoded_call_data "force-create-asset" "${runtime_para_endpoint}" "${tmp_output_file}" "$asset_id" "$asset_owner_account_id" false "1000" + local hex_encoded_data=$(cat $tmp_output_file) + + send_governance_transact "${relay_url}" "${relay_chain_seed}" "${runtime_para_id}" "${hex_encoded_data}" 200000000 12000 +} + +function allow_assets_transfer_receive() { + local relay_url=$1 + local relay_chain_seed=$2 + local runtime_para_id=$3 + local runtime_para_endpoint=$4 + local bridge_hub_para_id=$5 + local bridged_network=$6 + local bridged_para_id=$7 + echo " calling allow_assets_transfer_receive:" + echo " relay_url: ${relay_url}" + echo " relay_chain_seed: ${relay_chain_seed}" + echo " runtime_para_id: ${runtime_para_id}" + echo " runtime_para_endpoint: ${runtime_para_endpoint}" + echo " bridge_hub_para_id: ${bridge_hub_para_id}" + echo " bridged_network: ${bridged_network}" + echo " bridged_para_id: ${bridged_para_id}" + echo " params:" + + # 1. generate data for Transact (add_universal_alias) + local location=$(jq --null-input \ + --arg bridge_hub_para_id "$bridge_hub_para_id" \ + '{ "V3": { "parents": 1, "interior": { "X1": { "Parachain": $bridge_hub_para_id } } } }') + + local junction=$(jq --null-input \ + --arg bridged_network "$bridged_network" \ + '{ "GlobalConsensus": $bridged_network } ') + + local tmp_output_file=$(mktemp) + generate_hex_encoded_call_data "add-universal-alias" "${runtime_para_endpoint}" "${tmp_output_file}" "$location" "$junction" + local hex_encoded_data=$(cat $tmp_output_file) + + send_governance_transact "${relay_url}" "${relay_chain_seed}" "${runtime_para_id}" "${hex_encoded_data}" 200000000 12000 + + # 2. generate data for Transact (add_reserve_location) + local reserve_location=$(jq --null-input \ + --arg bridged_network "$bridged_network" \ + --arg bridged_para_id "$bridged_para_id" \ + '{ "V3": { + "parents": 2, + "interior": { + "X2": [ + { + "GlobalConsensus": $bridged_network, + }, + { + "Parachain": $bridged_para_id + } + ] + } + } }') + + local tmp_output_file=$(mktemp) + generate_hex_encoded_call_data "add-reserve-location" "${runtime_para_endpoint}" "${tmp_output_file}" "$reserve_location" + local hex_encoded_data=$(cat $tmp_output_file) + + send_governance_transact "${relay_url}" "${relay_chain_seed}" "${runtime_para_id}" "${hex_encoded_data}" 200000000 12000 +} + +function remove_assets_transfer_send() { + local relay_url=$1 + local relay_chain_seed=$2 + local runtime_para_id=$3 + local runtime_para_endpoint=$4 + local bridged_network=$5 + echo " calling remove_assets_transfer_send:" + echo " relay_url: ${relay_url}" + echo " relay_chain_seed: ${relay_chain_seed}" + echo " runtime_para_id: ${runtime_para_id}" + echo " runtime_para_endpoint: ${runtime_para_endpoint}" + echo " bridged_network: ${bridged_network}" + echo " params:" + + local tmp_output_file=$(mktemp) + generate_hex_encoded_call_data "remove-exporter-config" "${runtime_para_endpoint}" "${tmp_output_file}" $bridged_network + local hex_encoded_data=$(cat $tmp_output_file) + + send_governance_transact "${relay_url}" "${relay_chain_seed}" "${runtime_para_id}" "${hex_encoded_data}" 200000000 12000 +} + +# TODO: we need to fill sovereign account for bridge-hub, because, small ammouts does not match ExistentialDeposit, so no reserve pass +# SA for BH: MultiLocation { parents: 1, interior: X1(Parachain(1013)) } - 5Eg2fntRRwLinojmk3sh5xscp7F3S6Zzm5oDVtoLTALKiypR on Statemine + +function transfer_asset_via_bridge() { + local url=$1 + local seed=$2 + local target_account=$3 + echo " calling transfer_asset_via_bridge:" + echo " url: ${url}" + echo " seed: ${seed}" + echo " target_account: ${target_account}" + echo " params:" + + local assets=$(jq --null-input \ + ' + { + "V3": [ + { + "id": { + "Concrete": { + "parents": 1, + "interior": "Here" + } + }, + "fun": { + "Fungible": 100000000 + } + } + ] + } + ' + ) + + local tmp_output_file=$(mktemp) + address_to_account_id_bytes "$target_account" "${tmp_output_file}" + local hex_encoded_data=$(cat $tmp_output_file) + + local destination=$(jq --null-input \ + --argjson hex_encoded_data "$hex_encoded_data" \ + ' + { + "V3": { + "parents": 2, + "interior": { + "X3": [ + { + "GlobalConsensus": "Wococo" + }, + { + "Parachain": 1000 + }, + { + "AccountId32": { + "id": $hex_encoded_data + } + } + ] + } + } + } + ' + ) + + echo "" + echo " assets:" + echo "${assets}" + echo "" + echo " destination:" + echo "${destination}" + echo "" + echo "--------------------------------------------------" + + polkadot-js-api \ + --ws "${url?}" \ + --seed "${seed?}" \ + tx.bridgeTransfer.transferAssetViaBridge \ + "${assets}" \ + "${destination}" +} + +function ping_via_bridge() { + local url=$1 + local seed=$2 + local target_account=$3 + echo " calling ping_via_bridge:" + echo " url: ${url}" + echo " seed: ${seed}" + echo " target_account: ${target_account}" + echo " params:" + + local tmp_output_file=$(mktemp) + address_to_account_id_bytes "$target_account" "${tmp_output_file}" + local hex_encoded_data=$(cat $tmp_output_file) + + local destination=$(jq --null-input \ + --argjson hex_encoded_data "$hex_encoded_data" \ + ' + { + "V3": { + "parents": 2, + "interior": { + "X3": [ + { + "GlobalConsensus": "Wococo" + }, + { + "Parachain": 1000 + }, + { + "AccountId32": { + "id": $hex_encoded_data + } + } + ] + } + } + } + ' + ) + + echo "" + echo " destination:" + echo "${destination}" + echo "" + echo "--------------------------------------------------" + + polkadot-js-api \ + --ws "${url?}" \ + --seed "${seed?}" \ + tx.bridgeTransfer.pingViaBridge \ + "${destination}" +} + +function init_ro_wo() { + ensure_relayer + + RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + ~/local_bridge_testing/bin/substrate-relay init-bridge rococo-to-bridge-hub-wococo \ + --source-host localhost \ + --source-port 9942 \ + --source-version-mode Auto \ + --target-host localhost \ + --target-port 8945 \ + --target-version-mode Auto \ + --target-signer //Bob +} + +function init_wo_ro() { + ensure_relayer + + RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + ~/local_bridge_testing/bin/substrate-relay init-bridge wococo-to-bridge-hub-rococo \ + --source-host localhost \ + --source-port 9945 \ + --source-version-mode Auto \ + --target-host localhost \ + --target-port 8943 \ + --target-version-mode Auto \ + --target-signer //Bob +} + +function run_relay() { + ensure_relayer + + RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + ~/local_bridge_testing/bin/substrate-relay relay-headers-and-messages bridge-hub-rococo-bridge-hub-wococo \ + --rococo-host localhost \ + --rococo-port 9942 \ + --rococo-version-mode Auto \ + --bridge-hub-rococo-host localhost \ + --bridge-hub-rococo-port 8943 \ + --bridge-hub-rococo-version-mode Auto \ + --bridge-hub-rococo-signer //Charlie \ + --wococo-headers-to-bridge-hub-rococo-signer //Bob \ + --wococo-parachains-to-bridge-hub-rococo-signer //Bob \ + --bridge-hub-rococo-transactions-mortality 4 \ + --wococo-host localhost \ + --wococo-port 9945 \ + --wococo-version-mode Auto \ + --bridge-hub-wococo-host localhost \ + --bridge-hub-wococo-port 8945 \ + --bridge-hub-wococo-version-mode Auto \ + --bridge-hub-wococo-signer //Charlie \ + --rococo-headers-to-bridge-hub-wococo-signer //Bob \ + --rococo-parachains-to-bridge-hub-wococo-signer //Bob \ + --bridge-hub-wococo-transactions-mortality 4 \ + --lane 00000001 +} + +case "$1" in + run-relay) + init_ro_wo + init_wo_ro + run_relay + ;; + allow-transfers-local) + # this allows send transfers on statemine (by governance-like) + ./$0 "allow-transfer-on-statemine-local" + # this allows receive transfers on westmint (by governance-like) + ./$0 "allow-transfer-on-westmint-local" + ;; + allow-transfer-on-statemine-local) + ensure_polkadot_js_api + allow_assets_transfer_send \ + "ws://127.0.0.1:9942" \ + "//Alice" \ + 1000 \ + "ws://127.0.0.1:9910" \ + 1013 \ + "Wococo" 1000 + ;; + allow-transfer-on-westmint-local) + ensure_polkadot_js_api + allow_assets_transfer_receive \ + "ws://127.0.0.1:9945" \ + "//Alice" \ + 1000 \ + "ws://127.0.0.1:9010" \ + 1014 \ + "Rococo" \ + 1000 + # drip SovereignAccount for `MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1000)) }` => 5DHZvp523gmJWxg9UcLVbofyu5nZkPvATeP1ciYncpFpXtiG + # drip SovereignAccount for `MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1015)) }` => 5FS75NFUdEYhWHuV3y3ncjSG4PFdHfC5X7V6SEzc3rnCciwb + transfer_balance \ + "ws://127.0.0.1:9010" \ + "//Alice" \ + "5DHZvp523gmJWxg9UcLVbofyu5nZkPvATeP1ciYncpFpXtiG" \ + $((1000000000 + 50000000000 * 20)) # ExistentialDeposit + maxTargetLocationFee * 20 + # create foreign assets for native Statemine token (yes, Kusama, because we are using Statemine runtime on rococo) + force_create_foreign_asset \ + "ws://127.0.0.1:9945" \ + "//Alice" \ + 1000 \ + "ws://127.0.0.1:9010" \ + "Kusama" \ + "5DHZvp523gmJWxg9UcLVbofyu5nZkPvATeP1ciYncpFpXtiG" + ;; + remove-assets-transfer-from-statemine-local) + ensure_polkadot_js_api + remove_assets_transfer_send \ + "ws://127.0.0.1:9942" \ + "//Alice" \ + 1000 \ + "ws://127.0.0.1:9910" \ + "Wococo" + ;; + transfer-asset-from-statemine-local) + ensure_polkadot_js_api + transfer_asset_via_bridge \ + "ws://127.0.0.1:9910" \ + "$STATEMINE_ACCOUNT_SEED_FOR_LOCAL" \ + "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" + ;; + transfer-asset-from-statemine-rococo) + ensure_polkadot_js_api + transfer_asset_via_bridge \ + "wss://ws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io" \ + "$ROCKMINE2_ACCOUNT_SEED_FOR_ROCOCO" \ + "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" + ;; + ping-via-bridge-from-statemine-local) + ensure_polkadot_js_api + ping_via_bridge \ + "ws://127.0.0.1:9910" \ + "$STATEMINE_ACCOUNT_SEED_FOR_LOCAL" \ + "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" + ;; + ping-via-bridge-from-statemine-rococo) + ensure_polkadot_js_api + ping_via_bridge \ + "wss://ws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io" \ + "${ROCKMINE2_ACCOUNT_SEED_FOR_ROCOCO}" \ + "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" + ;; + drip) + transfer_balance \ + "ws://127.0.0.1:9010" \ + "//Alice" \ + "5DHZvp523gmJWxg9UcLVbofyu5nZkPvATeP1ciYncpFpXtiG" \ + $((1000000000 + 50000000000 * 20)) + ;; + stop) + pkill -f polkadot + pkill -f parachain + ;; + *) + echo "A command is require. Supported commands for: + Local (zombienet) run: + - run-relay + - allow-transfers-local + - allow-transfer-on-statemine-local + - allow-transfer-on-westmint-local + - remove-assets-transfer-from-statemine-local + - transfer-asset-from-statemine-local + - ping-via-bridge-from-statemine-local + Live Rococo/Wococo run: + - transfer-asset-from-statemine-rococo + - ping-via-bridge-from-statemine-rococo"; + exit 1 + ;; +esac diff --git a/scripts/bridges_update_subtree.sh b/scripts/bridges_update_subtree.sh index bd9161b601f..3928dc23213 100755 --- a/scripts/bridges_update_subtree.sh +++ b/scripts/bridges_update_subtree.sh @@ -82,4 +82,4 @@ case "$1" in fetch patch ;; -esac \ No newline at end of file +esac diff --git a/scripts/generate_hex_encoded_call/index.js b/scripts/generate_hex_encoded_call/index.js new file mode 100644 index 00000000000..b135622c335 --- /dev/null +++ b/scripts/generate_hex_encoded_call/index.js @@ -0,0 +1,146 @@ +const fs = require("fs"); +const { exit } = require("process"); +const { WsProvider, ApiPromise } = require("@polkadot/api"); +const util = require("@polkadot/util"); + +// connect to a substrate chain and return the api object +async function connect(endpoint, types = {}) { + const provider = new WsProvider(endpoint); + const api = await ApiPromise.create({ + provider, + types, + throwOnConnect: false, + }); + return api; +} + +function writeHexEncodedBytesToOutput(method, outputFile) { + console.log("Payload (hex): ", method.toHex()); + console.log("Payload (bytes): ", Array.from(method.toU8a())); + fs.writeFileSync(outputFile, JSON.stringify(Array.from(method.toU8a()))); +} + +function remarkWithEvent(endpoint, outputFile) { + console.log(`Generating remarkWithEvent from RPC endpoint: ${endpoint} to outputFile: ${outputFile}`); + connect(endpoint) + .then((api) => { + const call = api.tx.system.remarkWithEvent("Hello"); + writeHexEncodedBytesToOutput(call.method, outputFile); + exit(0); + }) + .catch((e) => { + console.error(e); + exit(1); + }); +} + +function addExporterConfig(endpoint, outputFile, bridgedNetwork, bridgeConfig) { + console.log(`Generating addExporterConfig from RPC endpoint: ${endpoint} to outputFile: ${outputFile} based on bridgedNetwork: ${bridgedNetwork}, bridgeConfig: ${bridgeConfig}`); + connect(endpoint) + .then((api) => { + const call = api.tx.bridgeTransfer.addExporterConfig(bridgedNetwork, JSON.parse(bridgeConfig)); + writeHexEncodedBytesToOutput(call.method, outputFile); + exit(0); + }) + .catch((e) => { + console.error(e); + exit(1); + }); +} + +function addUniversalAlias(endpoint, outputFile, location, junction) { + console.log(`Generating addUniversalAlias from RPC endpoint: ${endpoint} to outputFile: ${outputFile} based on location: ${location}, junction: ${junction}`); + connect(endpoint) + .then((api) => { + const call = api.tx.bridgeTransfer.addUniversalAlias(JSON.parse(location), JSON.parse(junction)); + writeHexEncodedBytesToOutput(call.method, outputFile); + exit(0); + }) + .catch((e) => { + console.error(e); + exit(1); + }); +} + +function addReserveLocation(endpoint, outputFile, reserve_location) { + console.log(`Generating addReserveLocation from RPC endpoint: ${endpoint} to outputFile: ${outputFile} based on reserve_location: ${reserve_location}`); + connect(endpoint) + .then((api) => { + const call = api.tx.bridgeTransfer.addReserveLocation(JSON.parse(reserve_location)); + writeHexEncodedBytesToOutput(call.method, outputFile); + exit(0); + }) + .catch((e) => { + console.error(e); + exit(1); + }); +} + +function removeExporterConfig(endpoint, outputFile, bridgedNetwork) { + console.log(`Generating removeExporterConfig from RPC endpoint: ${endpoint} to outputFile: ${outputFile} based on bridgedNetwork: ${bridgedNetwork}`); + connect(endpoint) + .then((api) => { + const call = api.tx.bridgeTransfer.removeExporterConfig(bridgedNetwork); + writeHexEncodedBytesToOutput(call.method, outputFile); + exit(0); + }) + .catch((e) => { + console.error(e); + exit(1); + }); +} + +function forceCreateAsset(endpoint, outputFile, assetId, assetOwnerAccountId, isSufficient, minBalance) { + console.log(`Generating forceCreateAsset from RPC endpoint: ${endpoint} to outputFile: ${outputFile} based on assetId: ${assetId}, assetOwnerAccountId: ${assetOwnerAccountId}, isSufficient: ${isSufficient}, minBalance: ${minBalance}`); + connect(endpoint) + .then((api) => { + const call = api.tx.foreignAssets.forceCreate(JSON.parse(assetId), assetOwnerAccountId, isSufficient, minBalance); + writeHexEncodedBytesToOutput(call.method, outputFile); + exit(0); + }) + .catch((e) => { + console.error(e); + exit(1); + }); +} + +if (!process.argv[2] || !process.argv[3]) { + console.log("usage: node ./script/generate_hex_encoded_call "); + exit(1); +} + +const type = process.argv[2]; +const rpcEnpoint = process.argv[3]; +const output = process.argv[4]; +const inputArgs = process.argv.slice(5, process.argv.length); +console.log(`Generating hex-encoded call data for:`); +console.log(` type: ${type}`); +console.log(` rpcEnpoint: ${rpcEnpoint}`); +console.log(` output: ${output}`); +console.log(` inputArgs: ${inputArgs}`); + +switch (type) { + case 'remark-with-event': + remarkWithEvent(rpcEnpoint, output); + break; + case 'add-exporter-config': + addExporterConfig(rpcEnpoint, output, inputArgs[0], inputArgs[1]); + break; + case 'remove-exporter-config': + removeExporterConfig(rpcEnpoint, output, inputArgs[0], inputArgs[1]); + break; + case 'add-universal-alias': + addUniversalAlias(rpcEnpoint, output, inputArgs[0], inputArgs[1]); + break; + case 'add-reserve-location': + addReserveLocation(rpcEnpoint, output, inputArgs[0]); + break; + case 'force-create-asset': + forceCreateAsset(rpcEnpoint, output, inputArgs[0], inputArgs[1], inputArgs[2], inputArgs[3]); + break; + case 'check': + console.log(`Checking nodejs installation, if you see this everything is ready!`); + break; + default: + console.log(`Sorry, we are out of ${type} - not yet supported!`); +} diff --git a/scripts/generate_hex_encoded_call/package-lock.json b/scripts/generate_hex_encoded_call/package-lock.json new file mode 100644 index 00000000000..3383265e779 --- /dev/null +++ b/scripts/generate_hex_encoded_call/package-lock.json @@ -0,0 +1,1213 @@ +{ + "name": "y", + "version": "y", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "y", + "version": "y", + "license": "MIT", + "dependencies": { + "@polkadot/api": "^6.5.2", + "@polkadot/util": "^7.6.1" + } + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.0.0.tgz", + "integrity": "sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg==" + }, + "node_modules/@noble/secp256k1": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.5.5.tgz", + "integrity": "sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@polkadot/api": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-6.12.1.tgz", + "integrity": "sha512-RVdTiA2WaEvproM3i6E9TKS1bfXpPd9Ly9lUG/kVLaspjKoIot9DJUDTl97TJ+7xr8LXGbXqm448Ud0hsEBV8Q==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "@polkadot/api-derive": "6.12.1", + "@polkadot/keyring": "^8.1.2", + "@polkadot/rpc-core": "6.12.1", + "@polkadot/rpc-provider": "6.12.1", + "@polkadot/types": "6.12.1", + "@polkadot/types-known": "6.12.1", + "@polkadot/util": "^8.1.2", + "@polkadot/util-crypto": "^8.1.2", + "eventemitter3": "^4.0.7", + "rxjs": "^7.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/api-derive": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-6.12.1.tgz", + "integrity": "sha512-5LOVlG5EBCT+ytY6aHmQ4RdEWZovZQqRoc6DLd5BLhkR7BFTHKSkLQW+89so8jd0zEtmSXBVPPnsrXS8joM35Q==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "@polkadot/api": "6.12.1", + "@polkadot/rpc-core": "6.12.1", + "@polkadot/types": "6.12.1", + "@polkadot/util": "^8.1.2", + "@polkadot/util-crypto": "^8.1.2", + "rxjs": "^7.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/api-derive/node_modules/@polkadot/util": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", + "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-bigint": "8.7.1", + "@polkadot/x-global": "8.7.1", + "@polkadot/x-textdecoder": "8.7.1", + "@polkadot/x-textencoder": "8.7.1", + "@types/bn.js": "^5.1.0", + "bn.js": "^5.2.0", + "ip-regex": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/api-derive/node_modules/@polkadot/x-textdecoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", + "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/api-derive/node_modules/@polkadot/x-textencoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", + "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/api-derive/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@polkadot/api-derive/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/@polkadot/api/node_modules/@polkadot/util": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", + "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-bigint": "8.7.1", + "@polkadot/x-global": "8.7.1", + "@polkadot/x-textdecoder": "8.7.1", + "@polkadot/x-textencoder": "8.7.1", + "@types/bn.js": "^5.1.0", + "bn.js": "^5.2.0", + "ip-regex": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/api/node_modules/@polkadot/x-textdecoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", + "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/api/node_modules/@polkadot/x-textencoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", + "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/api/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@polkadot/api/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/@polkadot/keyring": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-8.7.1.tgz", + "integrity": "sha512-t6ZgQVC+nQT7XwbWtEhkDpiAzxKVJw8Xd/gWdww6xIrawHu7jo3SGB4QNdPgkf8TvDHYAAJiupzVQYAlOIq3GA==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/util": "8.7.1", + "@polkadot/util-crypto": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "8.7.1", + "@polkadot/util-crypto": "8.7.1" + } + }, + "node_modules/@polkadot/keyring/node_modules/@polkadot/util": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", + "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-bigint": "8.7.1", + "@polkadot/x-global": "8.7.1", + "@polkadot/x-textdecoder": "8.7.1", + "@polkadot/x-textencoder": "8.7.1", + "@types/bn.js": "^5.1.0", + "bn.js": "^5.2.0", + "ip-regex": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/keyring/node_modules/@polkadot/x-textdecoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", + "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/keyring/node_modules/@polkadot/x-textencoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", + "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/keyring/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@polkadot/keyring/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/@polkadot/networks": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-8.7.1.tgz", + "integrity": "sha512-8xAmhDW0ry5EKcEjp6VTuwoTm0DdDo/zHsmx88P6sVL87gupuFsL+B6TrsYLl8GcaqxujwrOlKB+CKTUg7qFKg==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/util": "8.7.1", + "@substrate/ss58-registry": "^1.17.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/networks/node_modules/@polkadot/util": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", + "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-bigint": "8.7.1", + "@polkadot/x-global": "8.7.1", + "@polkadot/x-textdecoder": "8.7.1", + "@polkadot/x-textencoder": "8.7.1", + "@types/bn.js": "^5.1.0", + "bn.js": "^5.2.0", + "ip-regex": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/networks/node_modules/@polkadot/x-textdecoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", + "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/networks/node_modules/@polkadot/x-textencoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", + "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/networks/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@polkadot/networks/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/@polkadot/rpc-core": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-6.12.1.tgz", + "integrity": "sha512-Hb08D9zho3SB1UNlUCmG5q0gdgbOx25JKGLDfSYpD/wtD0Y1Sf2X5cfgtMoSYE3USWiRdCu4BxQkXTiRjPjzJg==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "@polkadot/rpc-provider": "6.12.1", + "@polkadot/types": "6.12.1", + "@polkadot/util": "^8.1.2", + "rxjs": "^7.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/rpc-core/node_modules/@polkadot/util": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", + "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-bigint": "8.7.1", + "@polkadot/x-global": "8.7.1", + "@polkadot/x-textdecoder": "8.7.1", + "@polkadot/x-textencoder": "8.7.1", + "@types/bn.js": "^5.1.0", + "bn.js": "^5.2.0", + "ip-regex": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/rpc-core/node_modules/@polkadot/x-textdecoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", + "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/rpc-core/node_modules/@polkadot/x-textencoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", + "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/rpc-core/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@polkadot/rpc-core/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/@polkadot/rpc-provider": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-6.12.1.tgz", + "integrity": "sha512-uUHD3fLTOeZYWJoc6DQlhz+MJR33rVelasV+OxFY2nSD9MSNXRwQh+9UKDQBnyxw5B4BZ2QaEGfucDeavXmVDw==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "@polkadot/types": "6.12.1", + "@polkadot/util": "^8.1.2", + "@polkadot/util-crypto": "^8.1.2", + "@polkadot/x-fetch": "^8.1.2", + "@polkadot/x-global": "^8.1.2", + "@polkadot/x-ws": "^8.1.2", + "eventemitter3": "^4.0.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/rpc-provider/node_modules/@polkadot/util": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", + "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-bigint": "8.7.1", + "@polkadot/x-global": "8.7.1", + "@polkadot/x-textdecoder": "8.7.1", + "@polkadot/x-textencoder": "8.7.1", + "@types/bn.js": "^5.1.0", + "bn.js": "^5.2.0", + "ip-regex": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/rpc-provider/node_modules/@polkadot/x-textdecoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", + "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/rpc-provider/node_modules/@polkadot/x-textencoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", + "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/rpc-provider/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@polkadot/rpc-provider/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/@polkadot/types": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-6.12.1.tgz", + "integrity": "sha512-O37cAGUL0xiXTuO3ySweVh0OuFUD6asrd0TfuzGsEp3jAISWdElEHV5QDiftWq8J9Vf8BMgTcP2QLFbmSusxqA==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "@polkadot/types-known": "6.12.1", + "@polkadot/util": "^8.1.2", + "@polkadot/util-crypto": "^8.1.2", + "rxjs": "^7.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/types-known": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-6.12.1.tgz", + "integrity": "sha512-Z8bHpPQy+mqUm0uR1tai6ra0bQIoPmgRcGFYUM+rJtW1kx/6kZLh10HAICjLpPeA1cwLRzaxHRDqH5MCU6OgXw==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "@polkadot/networks": "^8.1.2", + "@polkadot/types": "6.12.1", + "@polkadot/util": "^8.1.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/types-known/node_modules/@polkadot/util": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", + "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-bigint": "8.7.1", + "@polkadot/x-global": "8.7.1", + "@polkadot/x-textdecoder": "8.7.1", + "@polkadot/x-textencoder": "8.7.1", + "@types/bn.js": "^5.1.0", + "bn.js": "^5.2.0", + "ip-regex": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/types-known/node_modules/@polkadot/x-textdecoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", + "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/types-known/node_modules/@polkadot/x-textencoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", + "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/types-known/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@polkadot/types-known/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/@polkadot/types/node_modules/@polkadot/util": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", + "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-bigint": "8.7.1", + "@polkadot/x-global": "8.7.1", + "@polkadot/x-textdecoder": "8.7.1", + "@polkadot/x-textencoder": "8.7.1", + "@types/bn.js": "^5.1.0", + "bn.js": "^5.2.0", + "ip-regex": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/types/node_modules/@polkadot/x-textdecoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", + "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/types/node_modules/@polkadot/x-textencoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", + "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/types/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@polkadot/types/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/@polkadot/util": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-7.9.2.tgz", + "integrity": "sha512-6ABY6ErgkCsM4C6+X+AJSY4pBGwbKlHZmUtHftaiTvbaj4XuA4nTo3GU28jw8wY0Jh2cJZJvt6/BJ5GVkm5tBA==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "@polkadot/x-textdecoder": "7.9.2", + "@polkadot/x-textencoder": "7.9.2", + "@types/bn.js": "^4.11.6", + "bn.js": "^4.12.0", + "camelcase": "^6.2.1", + "ip-regex": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/util-crypto": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-8.7.1.tgz", + "integrity": "sha512-TaSuJ2aNrB5sYK7YXszkEv24nYJKRFqjF2OrggoMg6uYxUAECvTkldFnhtgeizMweRMxJIBu6bMHlSIutbWgjw==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@noble/hashes": "1.0.0", + "@noble/secp256k1": "1.5.5", + "@polkadot/networks": "8.7.1", + "@polkadot/util": "8.7.1", + "@polkadot/wasm-crypto": "^5.1.1", + "@polkadot/x-bigint": "8.7.1", + "@polkadot/x-randomvalues": "8.7.1", + "@scure/base": "1.0.0", + "ed2curve": "^0.3.0", + "tweetnacl": "^1.0.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "8.7.1" + } + }, + "node_modules/@polkadot/util-crypto/node_modules/@polkadot/util": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", + "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-bigint": "8.7.1", + "@polkadot/x-global": "8.7.1", + "@polkadot/x-textdecoder": "8.7.1", + "@polkadot/x-textencoder": "8.7.1", + "@types/bn.js": "^5.1.0", + "bn.js": "^5.2.0", + "ip-regex": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/util-crypto/node_modules/@polkadot/x-textdecoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", + "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/util-crypto/node_modules/@polkadot/x-textencoder": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", + "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/util-crypto/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@polkadot/util-crypto/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/@polkadot/wasm-crypto": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-5.1.1.tgz", + "integrity": "sha512-JCcAVfH8DhYuEyd4oX1ouByxhou0TvpErKn8kHjtzt7+tRoFi0nzWlmK4z49vszsV3JJgXxV81i10C0BYlwTcQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/wasm-crypto-asmjs": "^5.1.1", + "@polkadot/wasm-crypto-wasm": "^5.1.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-asmjs": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-5.1.1.tgz", + "integrity": "sha512-1WBwc2G3pZMKW1T01uXzKE30Sg22MXmF3RbbZiWWk3H2d/Er4jZQRpjumxO5YGWan+xOb7HQQdwnrUnrPgbDhg==", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-wasm": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-5.1.1.tgz", + "integrity": "sha512-F9PZ30J2S8vUNl2oY7Myow5Xsx5z5uNVpnNlJwlmY8IXBvyucvyQ4HSdhJsrbs4W1BfFc0mHghxgp0FbBCnf/Q==", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/x-bigint": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-8.7.1.tgz", + "integrity": "sha512-ClkhgdB/KqcAKk3zA6Qw8wBL6Wz67pYTPkrAtImpvoPJmR+l4RARauv+MH34JXMUNlNb3aUwqN6lq2Z1zN+mJg==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-fetch": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-8.7.1.tgz", + "integrity": "sha512-ygNparcalYFGbspXtdtZOHvNXZBkNgmNO+um9C0JYq74K5OY9/be93uyfJKJ8JcRJtOqBfVDsJpbiRkuJ1PRfg==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1", + "@types/node-fetch": "^2.6.1", + "node-fetch": "^2.6.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-global": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-8.7.1.tgz", + "integrity": "sha512-WOgUor16IihgNVdiTVGAWksYLUAlqjmODmIK1cuWrLOZtV1VBomWcb3obkO9sh5P6iWziAvCB/i+L0vnTN9ZCA==", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-randomvalues": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-8.7.1.tgz", + "integrity": "sha512-njt17MlfN6yNyNEti7fL12lr5qM6A1aSGkWKVuqzc7XwSBesifJuW4km5u6r2gwhXjH2eHDv9SoQ7WXu8vrrkg==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-textdecoder": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-7.9.2.tgz", + "integrity": "sha512-wfwbSHXPhrOAl12QvlIOGNkMH/N/h8PId2ytIjvM/8zPPFB5Il6DWSFLtVapOGEpIFjEWbd5t8Td4pHBVXIEbg==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "@polkadot/x-global": "7.9.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-textdecoder/node_modules/@polkadot/x-global": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-7.9.2.tgz", + "integrity": "sha512-JX5CrGWckHf1P9xKXq4vQCAuMUbL81l2hOWX7xeP8nv4caHEpmf5T1wD1iMdQBL5PFifo6Pg0V6/oZBB+bts7A==", + "dependencies": { + "@babel/runtime": "^7.16.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-textencoder": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-7.9.2.tgz", + "integrity": "sha512-A19wwYINuZwU2dUyQ/mMzB0ISjyfc4cISfL4zCMUAVgj7xVoXMYV2GfjNdMpA8Wsjch3su6pxLbtJ2wU03sRTQ==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "@polkadot/x-global": "7.9.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-textencoder/node_modules/@polkadot/x-global": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-7.9.2.tgz", + "integrity": "sha512-JX5CrGWckHf1P9xKXq4vQCAuMUbL81l2hOWX7xeP8nv4caHEpmf5T1wD1iMdQBL5PFifo6Pg0V6/oZBB+bts7A==", + "dependencies": { + "@babel/runtime": "^7.16.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-ws": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-8.7.1.tgz", + "integrity": "sha512-Mt0tcNzGXyKnN3DQ06alkv+JLtTfXWu6zSypFrrKHSQe3u79xMQ1nSicmpT3gWLhIa8YF+8CYJXMrqaXgCnDhw==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@polkadot/x-global": "8.7.1", + "@types/websocket": "^1.0.5", + "websocket": "^1.0.34" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@scure/base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.0.0.tgz", + "integrity": "sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@substrate/ss58-registry": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.38.0.tgz", + "integrity": "sha512-sHiVRWekGMRZAjPukN9/W166NM6D5wtHcK6RVyLy66kg3CHNZ1BXfpXcjOiXSwhbd7guQFDEwnOVaDrbk1XL1g==" + }, + "node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/websocket": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz", + "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ed2curve": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.3.0.tgz", + "integrity": "sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ==", + "dependencies": { + "tweetnacl": "1.x.x" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "engines": { + "node": ">=0.10.32" + } + } + } +} diff --git a/scripts/generate_hex_encoded_call/package.json b/scripts/generate_hex_encoded_call/package.json new file mode 100644 index 00000000000..1c68924db24 --- /dev/null +++ b/scripts/generate_hex_encoded_call/package.json @@ -0,0 +1,11 @@ +{ + "name": "y", + "version": "y", + "description": "create a scale hex-encoded call values from given message", + "main": "index.js", + "license": "MIT", + "dependencies": { + "@polkadot/api": "^6.5.2", + "@polkadot/util": "^7.6.1" + } +} diff --git a/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml b/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml new file mode 100644 index 00000000000..e5a8459a76a --- /dev/null +++ b/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml @@ -0,0 +1,104 @@ +[settings] +node_spawn_timeout = 240 + +[relaychain] +default_command = "{{POLKADOT_BINARY_PATH}}" +default_args = [ "-lparachain=debug,xcm=trace" ] +chain = "rococo-local" + + [[relaychain.nodes]] + name = "alice-validator" + validator = true + rpc_port = 9932 + ws_port = 9942 + extra_args = ["--no-mdns --bootnodes {{'bob-validator'|zombie('multiAddress')}}"] + + [[relaychain.nodes]] + name = "bob-validator" + validator = true + rpc_port = 9933 + ws_port = 9943 + extra_args = ["--no-mdns --bootnodes {{'alice-validator'|zombie('multiAddress')}}"] + + [[relaychain.nodes]] + name = "charlie-validator" + validator = true + rpc_port = 9934 + ws_port = 9944 + extra_args = ["--no-mdns --bootnodes {{'alice-validator'|zombie('multiAddress')}}"] + +[[parachains]] +id = 1013 +chain = "bridge-hub-rococo-local" +cumulus_based = true + + # run alice as parachain collator + [[parachains.collators]] + name = "alice-collator" + validator = true + command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" + rpc_port = 8933 + ws_port = 8943 + args = [ + "-lparachain=debug,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", + ] + extra_args = [ + "--force-authoring", "--no-mdns", "--bootnodes {{'bob-collator'|zombie('multiAddress')}}", + "-- --port 41333 --rpc-port 48933 --ws-port 48943 --no-mdns", "--bootnodes {{'alice-validator'|zombie('multiAddress')}}" + ] + + # run bob as parachain collator + [[parachains.collators]] + name = "bob-collator" + validator = true + command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" + rpc_port = 8934 + ws_port = 8944 + args = [ + "-lparachain=trace,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", + ] + extra_args = [ + "--force-authoring", "--no-mdns", "--bootnodes {{'alice-collator'|zombie('multiAddress')}}", + "-- --port 41334 --rpc-port 48934 --ws-port 48944 --no-mdns", "--bootnodes {{'bob-validator'|zombie('multiAddress')}}" + ] + +[[parachains]] +id = 1000 +chain = "statemine-local" +cumulus_based = true + + [[parachains.collators]] + name = "rockmine-collator1" + rpc_port = 9911 + ws_port = 9910 + command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ROCKMINE}}" + args = [ + "-lparachain=debug,xcm=trace", + ] + extra_args = [ + "--no-mdns", "--bootnodes {{'rockmine-collator2'|zombie('multiAddress')}}", + "-- --port 51333 --rpc-port 58933 --ws-port 58943 --no-mdns", "--bootnodes {{'alice-validator'|zombie('multiAddress')}}" + ] + + [[parachains.collators]] + name = "rockmine-collator2" + command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ROCKMINE}}" + args = [ + "-lparachain=debug,xcm=trace", + ] + extra_args = [ + "--no-mdns", "--bootnodes {{'rockmine-collator1'|zombie('multiAddress')}}", + "-- --port 51433 --rpc-port 58833 --ws-port 58843 --no-mdns", "--bootnodes {{'alice-validator'|zombie('multiAddress')}}" + ] + +[[hrmp_channels]] +sender = 1000 +recipient = 1013 +max_capacity = 4 +max_message_size = 524288 + +[[hrmp_channels]] +sender = 1013 +recipient = 1000 +max_capacity = 4 +max_message_size = 524288 diff --git a/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml b/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml new file mode 100644 index 00000000000..55a95eb85f7 --- /dev/null +++ b/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml @@ -0,0 +1,104 @@ +[settings] +node_spawn_timeout = 240 + +[relaychain] +default_command = "{{POLKADOT_BINARY_PATH}}" +default_args = [ "-lparachain=debug,xcm=trace" ] +chain = "wococo-local" + + [[relaychain.nodes]] + name = "alice-validator-wo" + validator = true + rpc_port = 9935 + ws_port = 9945 + extra_args = ["--no-mdns --bootnodes {{'bob-validator-wo'|zombie('multiAddress')}}"] + + [[relaychain.nodes]] + name = "bob-validator-wo" + validator = true + rpc_port = 9936 + ws_port = 9946 + extra_args = ["--no-mdns --bootnodes {{'alice-validator-wo'|zombie('multiAddress')}}"] + + [[relaychain.nodes]] + name = "charlie-validator-wo" + validator = true + rpc_port = 9937 + ws_port = 9947 + extra_args = ["--no-mdns --bootnodes {{'alice-validator-wo'|zombie('multiAddress')}}"] + +[[parachains]] +id = 1014 +chain = "bridge-hub-wococo-local" +cumulus_based = true + + # run alice as parachain collator + [[parachains.collators]] + name = "alice-collator-wo" + validator = true + command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" + rpc_port = 8935 + ws_port = 8945 + args = [ + "-lparachain=debug,runtime::mmr=info,substrate=info,runtime=info,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", + ] + extra_args = [ + "--force-authoring", "--no-mdns", "--bootnodes {{'bob-collator-wo'|zombie('multiAddress')}}", + "-- --port 41335 --rpc-port 48935 --ws-port 48945 --no-mdns", "--bootnodes {{'alice-validator-wo'|zombie('multiAddress')}}" + ] + + # run bob as parachain collator + [[parachains.collators]] + name = "bob-collator-wo" + validator = true + command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" + rpc_port = 8936 + ws_port = 8946 + args = [ + "-lparachain=trace,runtime::mmr=info,substrate=info,runtime=info,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", + ] + extra_args = [ + "--force-authoring", "--no-mdns", "--bootnodes {{'alice-collator-wo'|zombie('multiAddress')}}", + "-- --port 41336 --rpc-port 48936 --ws-port 48946 --no-mdns", "--bootnodes {{'bob-validator-wo'|zombie('multiAddress')}}" + ] + +[[parachains]] +id = 1000 +chain = "westmint-local" +cumulus_based = true + + [[parachains.collators]] + name = "wockmint-collator1" + rpc_port = 9011 + ws_port = 9010 + command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_WOCKMINT}}" + args = [ + "-lparachain=debug,xcm=trace", + ] + extra_args = [ + "--no-mdns", "--bootnodes {{'wockmint-collator2'|zombie('multiAddress')}}", + "-- --port 31333 --rpc-port 38933 --ws-port 38943 --no-mdns", "--bootnodes {{'alice-validator-wo'|zombie('multiAddress')}}" + ] + + [[parachains.collators]] + name = "wockmint-collator2" + command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_WOCKMINT}}" + args = [ + "-lparachain=debug,xcm=trace", + ] + extra_args = [ + "--no-mdns", "--bootnodes {{'wockmint-collator1'|zombie('multiAddress')}}", + "-- --port 31433 --rpc-port 38833 --ws-port 38843 --no-mdns", "--bootnodes {{'alice-validator-wo'|zombie('multiAddress')}}" + ] + +[[hrmp_channels]] +sender = 1000 +recipient = 1014 +max_capacity = 4 +max_message_size = 524288 + +[[hrmp_channels]] +sender = 1014 +recipient = 1000 +max_capacity = 4 +max_message_size = 524288 From 053f670b5ca5ee24a6347435f4a1c1340f52a4dd Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 4 May 2023 12:40:11 +0200 Subject: [PATCH 160/339] companion for #13384 (#2417) * companion for #13384 * update rpc cli * fix missed stuff * update parachain rpc commands * update polkadot and substrate deps * update substrate & polkadot --------- Co-authored-by: parity-processbot <> Co-authored-by: muharem --- Cargo.lock | 514 ++++++++++++------------- client/cli/src/lib.rs | 30 +- parachain-template/node/src/command.rs | 22 +- polkadot-parachain/src/command.rs | 22 +- polkadot-parachain/tests/common.rs | 6 +- test/service/src/cli.rs | 22 +- test/service/src/lib.rs | 20 +- 7 files changed, 290 insertions(+), 346 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e8e2fab6596..725a3675433 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,7 +585,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "hash-db", "log", @@ -3742,7 +3742,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", ] @@ -3765,7 +3765,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-support-procedural", @@ -3790,7 +3790,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3837,7 +3837,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3848,7 +3848,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3865,7 +3865,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -3894,7 +3894,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-recursion", "futures", @@ -3912,7 +3912,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "bitflags", "environmental", @@ -3945,7 +3945,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "Inflector", "cfg-expr", @@ -3961,7 +3961,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3973,7 +3973,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "proc-macro2", "quote", @@ -3983,7 +3983,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "log", @@ -4001,7 +4001,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -4016,7 +4016,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "sp-api", @@ -4025,7 +4025,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "parity-scale-codec", @@ -5030,7 +5030,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bitvec", "frame-benchmarking", @@ -5128,7 +5128,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "frame-support", "polkadot-primitives", @@ -5982,7 +5982,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "futures", "log", @@ -6001,7 +6001,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "anyhow", "jsonrpsee", @@ -6500,7 +6500,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6521,7 +6521,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6539,7 +6539,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6554,7 +6554,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -6570,7 +6570,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -6586,7 +6586,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -6600,7 +6600,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6624,7 +6624,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6644,7 +6644,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6659,7 +6659,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -6678,7 +6678,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6702,7 +6702,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6808,7 +6808,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6852,7 +6852,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6869,7 +6869,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "bitflags", "environmental", @@ -6899,7 +6899,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "bitflags", "parity-scale-codec", @@ -6912,7 +6912,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "proc-macro2", "quote", @@ -6922,7 +6922,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6939,7 +6939,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6957,7 +6957,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6980,7 +6980,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6993,7 +6993,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7011,7 +7011,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7029,7 +7029,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7052,7 +7052,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7068,7 +7068,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7088,7 +7088,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7105,7 +7105,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -7119,7 +7119,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7136,7 +7136,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7153,7 +7153,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7169,7 +7169,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7187,7 +7187,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "pallet-nfts", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7214,7 +7214,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7251,7 +7251,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7262,7 +7262,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -7279,7 +7279,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7320,7 +7320,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7335,7 +7335,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7368,7 +7368,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7387,7 +7387,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7404,7 +7404,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7441,7 +7441,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -7455,7 +7455,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7478,7 +7478,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7489,7 +7489,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "log", "sp-arithmetic", @@ -7498,7 +7498,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "sp-api", @@ -7507,7 +7507,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7524,7 +7524,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -7553,7 +7553,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7571,7 +7571,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7590,7 +7590,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-support", "frame-system", @@ -7606,7 +7606,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7622,7 +7622,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7634,7 +7634,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7651,7 +7651,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7666,7 +7666,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7682,7 +7682,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7697,7 +7697,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7712,7 +7712,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7733,7 +7733,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8311,7 +8311,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8327,7 +8327,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8341,7 +8341,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "derive_more", "fatality", @@ -8364,7 +8364,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "fatality", "futures", @@ -8385,7 +8385,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8414,7 +8414,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "async-trait", "frame-benchmarking", @@ -8457,7 +8457,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "always-assert", "bitvec", @@ -8479,7 +8479,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8491,7 +8491,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "derive_more", "fatality", @@ -8516,7 +8516,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8530,7 +8530,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "futures", "futures-timer", @@ -8550,7 +8550,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "always-assert", "async-trait", @@ -8573,7 +8573,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "futures", "parity-scale-codec", @@ -8591,7 +8591,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bitvec", "derive_more", @@ -8620,7 +8620,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bitvec", "futures", @@ -8641,7 +8641,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bitvec", "fatality", @@ -8660,7 +8660,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8675,7 +8675,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "async-trait", "futures", @@ -8695,7 +8695,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "futures", "polkadot-node-metrics", @@ -8710,7 +8710,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "futures", "futures-timer", @@ -8727,7 +8727,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "fatality", "futures", @@ -8746,7 +8746,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "async-trait", "futures", @@ -8763,7 +8763,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bitvec", "fatality", @@ -8781,7 +8781,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "always-assert", "futures", @@ -8808,7 +8808,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "futures", "polkadot-node-primitives", @@ -8824,7 +8824,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "assert_matches", "cpu-time", @@ -8853,7 +8853,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "futures", "lru 0.9.0", @@ -8868,7 +8868,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "lazy_static", "log", @@ -8886,7 +8886,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bs58", "futures", @@ -8905,7 +8905,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "async-trait", "derive_more", @@ -8927,7 +8927,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bounded-vec", "futures", @@ -8949,7 +8949,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8959,7 +8959,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "async-trait", "futures", @@ -8977,7 +8977,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "async-trait", "derive_more", @@ -9000,7 +9000,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "async-trait", "derive_more", @@ -9033,7 +9033,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "async-trait", "futures", @@ -9056,7 +9056,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bounded-collections", "derive_more", @@ -9154,7 +9154,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9172,7 +9172,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9198,7 +9198,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9230,7 +9230,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bitvec", "frame-benchmarking", @@ -9324,7 +9324,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bitvec", "frame-benchmarking", @@ -9370,7 +9370,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "frame-support", "polkadot-primitives", @@ -9384,7 +9384,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bs58", "parity-scale-codec", @@ -9396,7 +9396,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bitflags", "bitvec", @@ -9440,7 +9440,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9550,7 +9550,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9571,7 +9571,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9581,7 +9581,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9606,7 +9606,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9667,7 +9667,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "frame-benchmarking", "frame-system", @@ -10434,7 +10434,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10520,7 +10520,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "frame-support", "polkadot-primitives", @@ -10767,7 +10767,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "log", "sp-core", @@ -10778,7 +10778,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "futures", @@ -10806,7 +10806,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "futures", "futures-timer", @@ -10829,7 +10829,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10844,7 +10844,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10863,7 +10863,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10874,7 +10874,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10914,7 +10914,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "fnv", "futures", @@ -10940,7 +10940,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "hash-db", "kvdb", @@ -10966,7 +10966,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "futures", @@ -10991,7 +10991,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "futures", @@ -11020,7 +11020,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "fork-tree", @@ -11056,7 +11056,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "futures", "jsonrpsee", @@ -11078,7 +11078,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11113,7 +11113,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "futures", "jsonrpsee", @@ -11132,7 +11132,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11145,7 +11145,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11185,7 +11185,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "finality-grandpa", "futures", @@ -11205,7 +11205,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "futures", @@ -11228,7 +11228,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11252,7 +11252,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11265,7 +11265,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "log", "sc-allocator", @@ -11278,7 +11278,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "anyhow", "cfg-if", @@ -11296,7 +11296,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "ansi_term", "futures", @@ -11312,7 +11312,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11327,7 +11327,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11372,7 +11372,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "cid", "futures", @@ -11392,7 +11392,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11420,7 +11420,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "ahash 0.8.2", "futures", @@ -11439,7 +11439,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11461,7 +11461,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11495,7 +11495,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11515,7 +11515,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11546,7 +11546,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "futures", "libp2p", @@ -11559,7 +11559,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11568,7 +11568,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "futures", "jsonrpsee", @@ -11598,7 +11598,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11617,7 +11617,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "http", "jsonrpsee", @@ -11632,7 +11632,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11658,7 +11658,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "directories", @@ -11724,7 +11724,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "log", "parity-scale-codec", @@ -11735,7 +11735,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "clap 4.2.7", "fs4", @@ -11751,7 +11751,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11770,7 +11770,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "futures", "libc", @@ -11789,7 +11789,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "chrono", "futures", @@ -11808,7 +11808,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "ansi_term", "atty", @@ -11839,7 +11839,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11850,7 +11850,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "futures", @@ -11877,7 +11877,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "futures", @@ -11891,7 +11891,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-channel", "futures", @@ -12372,7 +12372,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "enumn", "parity-scale-codec", @@ -12449,7 +12449,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "hash-db", "log", @@ -12469,7 +12469,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "Inflector", "blake2", @@ -12483,7 +12483,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -12496,7 +12496,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "integer-sqrt", "num-traits", @@ -12510,7 +12510,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -12523,7 +12523,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "sp-api", @@ -12535,7 +12535,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "futures", "log", @@ -12553,7 +12553,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "futures", @@ -12568,7 +12568,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "parity-scale-codec", @@ -12586,7 +12586,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "parity-scale-codec", @@ -12607,7 +12607,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12626,7 +12626,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "finality-grandpa", "log", @@ -12644,7 +12644,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -12656,7 +12656,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12700,7 +12700,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "blake2b_simd", "byteorder", @@ -12714,7 +12714,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "proc-macro2", "quote", @@ -12725,7 +12725,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12734,7 +12734,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "proc-macro2", "quote", @@ -12744,7 +12744,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "environmental", "parity-scale-codec", @@ -12755,7 +12755,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12770,7 +12770,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "bytes", "ed25519", @@ -12796,7 +12796,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "lazy_static", "sp-core", @@ -12807,7 +12807,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "futures", "parity-scale-codec", @@ -12821,7 +12821,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12830,7 +12830,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12841,7 +12841,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12859,7 +12859,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -12873,7 +12873,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "sp-api", "sp-core", @@ -12883,7 +12883,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "backtrace", "lazy_static", @@ -12893,7 +12893,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "rustc-hash", "serde", @@ -12903,7 +12903,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "either", "hash256-std-hasher", @@ -12925,7 +12925,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12943,7 +12943,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "Inflector", "proc-macro-crate", @@ -12955,7 +12955,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "serde", "serde_json", @@ -12964,7 +12964,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -12978,7 +12978,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -12991,7 +12991,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "hash-db", "log", @@ -13011,12 +13011,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13029,7 +13029,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "futures-timer", @@ -13044,7 +13044,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "sp-std", @@ -13056,7 +13056,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "sp-api", "sp-runtime", @@ -13065,7 +13065,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "log", @@ -13081,7 +13081,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13104,7 +13104,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13121,7 +13121,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13132,7 +13132,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13146,7 +13146,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -13470,7 +13470,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "platforms 2.0.0", ] @@ -13478,7 +13478,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13497,7 +13497,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "hyper", "log", @@ -13509,7 +13509,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "jsonrpsee", @@ -13522,7 +13522,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "jsonrpsee", "log", @@ -13541,7 +13541,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13567,7 +13567,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13577,7 +13577,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13588,7 +13588,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "ansi_term", "build-helper", @@ -13715,7 +13715,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "frame-support", "polkadot-primitives", @@ -14101,7 +14101,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14112,7 +14112,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14242,7 +14242,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#44130d53f222a0efdd976e76e32460680637c5fe" +source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" dependencies = [ "async-trait", "clap 4.2.7", @@ -15176,7 +15176,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bitvec", "frame-benchmarking", @@ -15268,7 +15268,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "frame-support", "polkadot-primitives", @@ -15770,7 +15770,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "bounded-collections", "derivative", @@ -15786,7 +15786,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "frame-support", "frame-system", @@ -15807,7 +15807,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "environmental", "frame-benchmarking", @@ -15827,7 +15827,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#81456c83ae4736f51ae0ad63f9d7e1fa321ba076" +source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" dependencies = [ "Inflector", "proc-macro2", diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index edf11d72a0b..a4daa9ee506 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -387,50 +387,34 @@ impl sc_cli::CliConfiguration for NormalizedRunCmd { self.base.disable_grandpa() } - fn rpc_ws_max_connections(&self) -> sc_cli::Result> { - self.base.rpc_ws_max_connections() + fn rpc_max_connections(&self) -> sc_cli::Result { + self.base.rpc_max_connections() } fn rpc_cors(&self, is_dev: bool) -> sc_cli::Result>> { self.base.rpc_cors(is_dev) } - fn rpc_http(&self, default_listen_port: u16) -> sc_cli::Result> { - self.base.rpc_http(default_listen_port) - } - - fn rpc_ipc(&self) -> sc_cli::Result> { - self.base.rpc_ipc() - } - - fn rpc_ws(&self, default_listen_port: u16) -> sc_cli::Result> { - self.base.rpc_ws(default_listen_port) + fn rpc_addr(&self, default_listen_port: u16) -> sc_cli::Result> { + self.base.rpc_addr(default_listen_port) } fn rpc_methods(&self) -> sc_cli::Result { self.base.rpc_methods() } - fn rpc_max_payload(&self) -> sc_cli::Result> { - self.base.rpc_max_payload() - } - - fn rpc_max_request_size(&self) -> sc_cli::Result> { + fn rpc_max_request_size(&self) -> sc_cli::Result { Ok(self.base.rpc_max_request_size) } - fn rpc_max_response_size(&self) -> sc_cli::Result> { + fn rpc_max_response_size(&self) -> sc_cli::Result { Ok(self.base.rpc_max_response_size) } - fn rpc_max_subscriptions_per_connection(&self) -> sc_cli::Result> { + fn rpc_max_subscriptions_per_connection(&self) -> sc_cli::Result { Ok(self.base.rpc_max_subscriptions_per_connection) } - fn ws_max_out_buffer_capacity(&self) -> sc_cli::Result> { - self.base.ws_max_out_buffer_capacity() - } - fn transaction_pool(&self, is_dev: bool) -> sc_cli::Result { self.base.transaction_pool(is_dev) } diff --git a/parachain-template/node/src/command.rs b/parachain-template/node/src/command.rs index 36e5ab635ac..20ac62ec4a5 100644 --- a/parachain-template/node/src/command.rs +++ b/parachain-template/node/src/command.rs @@ -325,14 +325,10 @@ impl DefaultConfigurationValues for RelayChainCli { 30334 } - fn rpc_ws_listen_port() -> u16 { + fn rpc_listen_port() -> u16 { 9945 } - fn rpc_http_listen_port() -> u16 { - 9934 - } - fn prometheus_listen_port() -> u16 { 9616 } @@ -362,16 +358,8 @@ impl CliConfiguration for RelayChainCli { .or_else(|| self.base_path.clone().map(Into::into))) } - fn rpc_http(&self, default_listen_port: u16) -> Result> { - self.base.base.rpc_http(default_listen_port) - } - - fn rpc_ipc(&self) -> Result> { - self.base.base.rpc_ipc() - } - - fn rpc_ws(&self, default_listen_port: u16) -> Result> { - self.base.base.rpc_ws(default_listen_port) + fn rpc_addr(&self, default_listen_port: u16) -> Result> { + self.base.base.rpc_addr(default_listen_port) } fn prometheus_config( @@ -417,8 +405,8 @@ impl CliConfiguration for RelayChainCli { self.base.base.rpc_methods() } - fn rpc_ws_max_connections(&self) -> Result> { - self.base.base.rpc_ws_max_connections() + fn rpc_max_connections(&self) -> Result { + self.base.base.rpc_max_connections() } fn rpc_cors(&self, is_dev: bool) -> Result>> { diff --git a/polkadot-parachain/src/command.rs b/polkadot-parachain/src/command.rs index 4270677e0bf..52a742f1527 100644 --- a/polkadot-parachain/src/command.rs +++ b/polkadot-parachain/src/command.rs @@ -976,14 +976,10 @@ impl DefaultConfigurationValues for RelayChainCli { 30334 } - fn rpc_ws_listen_port() -> u16 { + fn rpc_listen_port() -> u16 { 9945 } - fn rpc_http_listen_port() -> u16 { - 9934 - } - fn prometheus_listen_port() -> u16 { 9616 } @@ -1013,16 +1009,8 @@ impl CliConfiguration for RelayChainCli { .or_else(|| self.base_path.clone().map(Into::into))) } - fn rpc_http(&self, default_listen_port: u16) -> Result> { - self.base.base.rpc_http(default_listen_port) - } - - fn rpc_ipc(&self) -> Result> { - self.base.base.rpc_ipc() - } - - fn rpc_ws(&self, default_listen_port: u16) -> Result> { - self.base.base.rpc_ws(default_listen_port) + fn rpc_addr(&self, default_listen_port: u16) -> Result> { + self.base.base.rpc_addr(default_listen_port) } fn prometheus_config( @@ -1068,8 +1056,8 @@ impl CliConfiguration for RelayChainCli { self.base.base.rpc_methods() } - fn rpc_ws_max_connections(&self) -> Result> { - self.base.base.rpc_ws_max_connections() + fn rpc_max_connections(&self) -> Result { + self.base.base.rpc_max_connections() } fn rpc_cors(&self, is_dev: bool) -> Result>> { diff --git a/polkadot-parachain/tests/common.rs b/polkadot-parachain/tests/common.rs index 1d3d710c83d..71b7fb42cd2 100644 --- a/polkadot-parachain/tests/common.rs +++ b/polkadot-parachain/tests/common.rs @@ -103,7 +103,7 @@ impl DerefMut for KillChildOnDrop { } } -/// Read the WS address from the output. +/// Read the RPC server address from the output. /// /// This is hack to get the actual bound sockaddr because /// substrate assigns a random port if the specified port was already bound. @@ -120,7 +120,7 @@ pub fn find_ws_url_from_output(read: impl Read + Send) -> (String, String) { data.push_str("\n"); // does the line contain our port (we expect this specific output from substrate). - let sock_addr = match line.split_once("Running JSON-RPC WS server: addr=") { + let sock_addr = match line.split_once("Running JSON-RPC server: addr=") { None => return None, Some((_, after)) => after.split_once(",").unwrap().0, }; @@ -129,7 +129,7 @@ pub fn find_ws_url_from_output(read: impl Read + Send) -> (String, String) { }) .unwrap_or_else(|| { eprintln!("Output:\n{}", data); - panic!("We should get a WebSocket address") + panic!("We should get an address") }); (ws_url, data) diff --git a/test/service/src/cli.rs b/test/service/src/cli.rs index 3cf99496576..6b46d9ccf50 100644 --- a/test/service/src/cli.rs +++ b/test/service/src/cli.rs @@ -146,16 +146,8 @@ impl CliConfiguration for RelayChainCli { .or_else(|| self.base_path.clone().map(Into::into))) } - fn rpc_http(&self, default_listen_port: u16) -> CliResult> { - self.base.base.rpc_http(default_listen_port) - } - - fn rpc_ipc(&self) -> CliResult> { - self.base.base.rpc_ipc() - } - - fn rpc_ws(&self, default_listen_port: u16) -> CliResult> { - self.base.base.rpc_ws(default_listen_port) + fn rpc_addr(&self, default_listen_port: u16) -> CliResult> { + self.base.base.rpc_addr(default_listen_port) } fn prometheus_config( @@ -204,8 +196,8 @@ impl CliConfiguration for RelayChainCli { self.base.base.rpc_methods() } - fn rpc_ws_max_connections(&self) -> CliResult> { - self.base.base.rpc_ws_max_connections() + fn rpc_max_connections(&self) -> CliResult { + self.base.base.rpc_max_connections() } fn rpc_cors(&self, is_dev: bool) -> CliResult>> { @@ -249,14 +241,10 @@ impl DefaultConfigurationValues for RelayChainCli { 30334 } - fn rpc_ws_listen_port() -> u16 { + fn rpc_listen_port() -> u16 { 9945 } - fn rpc_http_listen_port() -> u16 { - 9934 - } - fn prometheus_listen_port() -> u16 { 9616 } diff --git a/test/service/src/lib.rs b/test/service/src/lib.rs index 84d5636f9b1..58ef651bd47 100644 --- a/test/service/src/lib.rs +++ b/test/service/src/lib.rs @@ -745,18 +745,14 @@ pub fn node_config( offchain_worker: sc_client_api::ExecutionStrategy::NativeWhenPossible, other: sc_client_api::ExecutionStrategy::NativeWhenPossible, }, - rpc_http: None, - rpc_ws: None, - rpc_ipc: None, - rpc_ws_max_connections: None, + rpc_addr: None, + rpc_max_connections: Default::default(), rpc_cors: None, rpc_methods: Default::default(), - rpc_max_payload: None, - rpc_max_request_size: None, - rpc_max_response_size: None, + rpc_max_request_size: Default::default(), + rpc_max_response_size: Default::default(), rpc_id_provider: None, - rpc_max_subs_per_conn: None, - ws_max_out_buffer_capacity: None, + rpc_max_subs_per_conn: Default::default(), prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, @@ -871,7 +867,7 @@ pub fn run_relay_chain_validator_node( key: Sr25519Keyring, storage_update_func: impl Fn(), boot_nodes: Vec, - websocket_port: Option, + port: Option, ) -> polkadot_test_service::PolkadotTestNode { let mut config = polkadot_test_service::node_config( storage_update_func, @@ -881,8 +877,8 @@ pub fn run_relay_chain_validator_node( true, ); - if let Some(port) = websocket_port { - config.rpc_ws = Some(SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), port)); + if let Some(port) = port { + config.rpc_addr = Some(SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), port)); } polkadot_test_service::run_validator_node( From df68186063ded474e23bbfd52b28cc5c1e63081d Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 4 May 2023 13:34:43 +0200 Subject: [PATCH 161/339] Companion for #13701 (#2423) * Set data_path * fmt * Updated substrate and polkadot --- Cargo.lock | 534 +++++++++++++++-------------- parachain-template/node/src/cli.rs | 8 +- polkadot-parachain/src/cli.rs | 8 +- test/service/src/cli.rs | 8 +- test/service/src/lib.rs | 3 +- 5 files changed, 297 insertions(+), 264 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 725a3675433..89a17e254ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,7 +585,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "hash-db", "log", @@ -3742,7 +3742,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", ] @@ -3765,7 +3765,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-support-procedural", @@ -3790,7 +3790,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3837,7 +3837,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3848,7 +3848,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3865,7 +3865,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -3894,7 +3894,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-recursion", "futures", @@ -3912,7 +3912,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "bitflags", "environmental", @@ -3945,7 +3945,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "Inflector", "cfg-expr", @@ -3961,7 +3961,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3973,7 +3973,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "proc-macro2", "quote", @@ -3983,7 +3983,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "log", @@ -4001,7 +4001,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -4016,7 +4016,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "sp-api", @@ -4025,7 +4025,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "parity-scale-codec", @@ -5030,7 +5030,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bitvec", "frame-benchmarking", @@ -5128,7 +5128,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "frame-support", "polkadot-primitives", @@ -5982,7 +5982,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "futures", "log", @@ -6001,7 +6001,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "anyhow", "jsonrpsee", @@ -6500,7 +6500,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6521,7 +6521,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6539,7 +6539,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6554,7 +6554,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -6570,7 +6570,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -6586,7 +6586,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -6600,7 +6600,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6624,7 +6624,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6644,7 +6644,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6659,7 +6659,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -6678,7 +6678,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6702,7 +6702,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6808,7 +6808,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6852,7 +6852,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6869,7 +6869,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "bitflags", "environmental", @@ -6899,7 +6899,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "bitflags", "parity-scale-codec", @@ -6912,7 +6912,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "proc-macro2", "quote", @@ -6922,7 +6922,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6939,7 +6939,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6957,7 +6957,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6980,7 +6980,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6993,7 +6993,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7011,7 +7011,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7029,7 +7029,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7052,7 +7052,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7068,7 +7068,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7088,7 +7088,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7105,7 +7105,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -7119,7 +7119,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7136,7 +7136,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7153,7 +7153,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7169,7 +7169,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7187,7 +7187,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "pallet-nfts", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7214,7 +7214,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7251,7 +7251,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7262,7 +7262,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -7279,7 +7279,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7320,7 +7320,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7335,7 +7335,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7368,7 +7368,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7387,7 +7387,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7404,7 +7404,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7441,7 +7441,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -7455,7 +7455,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7478,7 +7478,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7489,7 +7489,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "log", "sp-arithmetic", @@ -7498,7 +7498,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7507,7 +7507,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7524,7 +7524,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -7553,7 +7553,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7571,7 +7571,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7590,7 +7590,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-support", "frame-system", @@ -7606,7 +7606,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7622,7 +7622,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7634,7 +7634,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7651,7 +7651,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7666,7 +7666,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7682,7 +7682,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7697,7 +7697,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7712,7 +7712,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7733,7 +7733,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -8311,7 +8311,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8327,7 +8327,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8341,7 +8341,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "derive_more", "fatality", @@ -8364,7 +8364,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "fatality", "futures", @@ -8385,7 +8385,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8414,7 +8414,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "async-trait", "frame-benchmarking", @@ -8457,7 +8457,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "always-assert", "bitvec", @@ -8479,7 +8479,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "parity-scale-codec", "scale-info", @@ -8491,7 +8491,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "derive_more", "fatality", @@ -8516,7 +8516,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8530,7 +8530,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "futures", "futures-timer", @@ -8550,7 +8550,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "always-assert", "async-trait", @@ -8573,7 +8573,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "futures", "parity-scale-codec", @@ -8591,7 +8591,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bitvec", "derive_more", @@ -8620,7 +8620,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bitvec", "futures", @@ -8641,7 +8641,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bitvec", "fatality", @@ -8660,7 +8660,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8675,7 +8675,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "async-trait", "futures", @@ -8695,7 +8695,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "futures", "polkadot-node-metrics", @@ -8710,7 +8710,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "futures", "futures-timer", @@ -8727,7 +8727,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "fatality", "futures", @@ -8746,7 +8746,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "async-trait", "futures", @@ -8763,7 +8763,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bitvec", "fatality", @@ -8781,7 +8781,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "always-assert", "futures", @@ -8808,7 +8808,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "futures", "polkadot-node-primitives", @@ -8824,7 +8824,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "assert_matches", "cpu-time", @@ -8853,7 +8853,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "futures", "lru 0.9.0", @@ -8868,7 +8868,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "lazy_static", "log", @@ -8886,7 +8886,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bs58", "futures", @@ -8905,7 +8905,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "async-trait", "derive_more", @@ -8927,7 +8927,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bounded-vec", "futures", @@ -8949,7 +8949,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8959,7 +8959,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "async-trait", "futures", @@ -8977,7 +8977,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "async-trait", "derive_more", @@ -9000,7 +9000,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "async-trait", "derive_more", @@ -9033,7 +9033,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "async-trait", "futures", @@ -9056,7 +9056,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bounded-collections", "derive_more", @@ -9154,7 +9154,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9172,7 +9172,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9198,7 +9198,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9230,7 +9230,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bitvec", "frame-benchmarking", @@ -9324,7 +9324,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bitvec", "frame-benchmarking", @@ -9370,7 +9370,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "frame-support", "polkadot-primitives", @@ -9384,7 +9384,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bs58", "parity-scale-codec", @@ -9396,7 +9396,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bitflags", "bitvec", @@ -9440,7 +9440,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9550,7 +9550,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9571,7 +9571,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9581,7 +9581,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9606,7 +9606,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9667,7 +9667,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "frame-benchmarking", "frame-system", @@ -10434,7 +10434,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10520,7 +10520,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "frame-support", "polkadot-primitives", @@ -10767,7 +10767,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "log", "sp-core", @@ -10778,7 +10778,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "futures", @@ -10806,7 +10806,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "futures", "futures-timer", @@ -10829,7 +10829,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10844,7 +10844,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10863,7 +10863,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10874,7 +10874,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10914,7 +10914,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "fnv", "futures", @@ -10933,6 +10933,7 @@ dependencies = [ "sp-keystore", "sp-runtime", "sp-state-machine", + "sp-statement-store", "sp-storage", "substrate-prometheus-endpoint", ] @@ -10940,7 +10941,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "hash-db", "kvdb", @@ -10966,7 +10967,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "futures", @@ -10991,7 +10992,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "futures", @@ -11020,7 +11021,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "fork-tree", @@ -11056,7 +11057,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "futures", "jsonrpsee", @@ -11078,7 +11079,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11113,7 +11114,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "futures", "jsonrpsee", @@ -11132,7 +11133,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11145,7 +11146,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11185,7 +11186,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "finality-grandpa", "futures", @@ -11205,7 +11206,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "futures", @@ -11228,7 +11229,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11252,7 +11253,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11265,7 +11266,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "log", "sc-allocator", @@ -11278,7 +11279,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "anyhow", "cfg-if", @@ -11296,7 +11297,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "ansi_term", "futures", @@ -11312,7 +11313,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11327,7 +11328,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11372,7 +11373,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "cid", "futures", @@ -11392,7 +11393,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11420,7 +11421,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "ahash 0.8.2", "futures", @@ -11439,7 +11440,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11461,7 +11462,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11495,7 +11496,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11515,7 +11516,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11546,7 +11547,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "futures", "libp2p", @@ -11559,7 +11560,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11568,7 +11569,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "futures", "jsonrpsee", @@ -11591,6 +11592,7 @@ dependencies = [ "sp-rpc", "sp-runtime", "sp-session", + "sp-statement-store", "sp-version", "tokio", ] @@ -11598,7 +11600,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11617,7 +11619,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "http", "jsonrpsee", @@ -11632,7 +11634,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11658,7 +11660,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "directories", @@ -11724,7 +11726,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "log", "parity-scale-codec", @@ -11735,7 +11737,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "clap 4.2.7", "fs4", @@ -11751,7 +11753,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11770,7 +11772,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "futures", "libc", @@ -11789,7 +11791,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "chrono", "futures", @@ -11808,7 +11810,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "ansi_term", "atty", @@ -11839,7 +11841,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11850,7 +11852,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "futures", @@ -11877,7 +11879,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "futures", @@ -11891,7 +11893,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-channel", "futures", @@ -12372,7 +12374,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "enumn", "parity-scale-codec", @@ -12449,7 +12451,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "hash-db", "log", @@ -12469,7 +12471,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "Inflector", "blake2", @@ -12483,7 +12485,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12496,7 +12498,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "integer-sqrt", "num-traits", @@ -12510,7 +12512,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12523,7 +12525,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "sp-api", @@ -12535,7 +12537,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "futures", "log", @@ -12553,7 +12555,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "futures", @@ -12568,7 +12570,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "parity-scale-codec", @@ -12586,7 +12588,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "parity-scale-codec", @@ -12607,7 +12609,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12626,7 +12628,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "finality-grandpa", "log", @@ -12644,7 +12646,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12656,7 +12658,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12700,7 +12702,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "blake2b_simd", "byteorder", @@ -12714,7 +12716,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "proc-macro2", "quote", @@ -12725,7 +12727,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12734,7 +12736,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "proc-macro2", "quote", @@ -12744,7 +12746,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "environmental", "parity-scale-codec", @@ -12755,7 +12757,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12770,7 +12772,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "bytes", "ed25519", @@ -12796,7 +12798,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "lazy_static", "sp-core", @@ -12807,7 +12809,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "futures", "parity-scale-codec", @@ -12821,7 +12823,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12830,7 +12832,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12841,7 +12843,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12859,7 +12861,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12873,7 +12875,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "sp-api", "sp-core", @@ -12883,7 +12885,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "backtrace", "lazy_static", @@ -12893,7 +12895,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "rustc-hash", "serde", @@ -12903,7 +12905,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "either", "hash256-std-hasher", @@ -12925,7 +12927,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12943,7 +12945,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "Inflector", "proc-macro-crate", @@ -12955,7 +12957,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "serde", "serde_json", @@ -12964,7 +12966,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12978,7 +12980,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12991,7 +12993,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "hash-db", "log", @@ -13008,15 +13010,33 @@ dependencies = [ "tracing", ] +[[package]] +name = "sp-statement-store" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +dependencies = [ + "log", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-externalities", + "sp-runtime", + "sp-runtime-interface", + "sp-std", + "thiserror", +] + [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13029,7 +13049,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "futures-timer", @@ -13044,7 +13064,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "sp-std", @@ -13056,7 +13076,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "sp-api", "sp-runtime", @@ -13065,7 +13085,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "log", @@ -13081,7 +13101,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13104,7 +13124,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13121,7 +13141,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13132,7 +13152,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13146,7 +13166,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -13470,7 +13490,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "platforms 2.0.0", ] @@ -13478,7 +13498,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13497,7 +13517,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "hyper", "log", @@ -13509,7 +13529,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "jsonrpsee", @@ -13522,7 +13542,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "jsonrpsee", "log", @@ -13541,7 +13561,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13567,7 +13587,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13577,7 +13597,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13588,7 +13608,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "ansi_term", "build-helper", @@ -13715,7 +13735,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "frame-support", "polkadot-primitives", @@ -14101,7 +14121,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14112,7 +14132,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14242,7 +14262,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#71d749c74e43c7a840c94fcbbdd2b0172a21d473" +source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" dependencies = [ "async-trait", "clap 4.2.7", @@ -15176,7 +15196,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bitvec", "frame-benchmarking", @@ -15268,7 +15288,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "frame-support", "polkadot-primitives", @@ -15770,7 +15790,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "bounded-collections", "derivative", @@ -15786,7 +15806,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "frame-support", "frame-system", @@ -15807,7 +15827,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "environmental", "frame-benchmarking", @@ -15827,7 +15847,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#9b48a891c0ef8a93d0c154e744e80f4a62dd284d" +source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachain-template/node/src/cli.rs b/parachain-template/node/src/cli.rs index 2e64a53e96a..b72579c86b9 100644 --- a/parachain-template/node/src/cli.rs +++ b/parachain-template/node/src/cli.rs @@ -105,7 +105,11 @@ impl RelayChainCli { ) -> Self { let extension = crate::chain_spec::Extensions::try_get(&*para_config.chain_spec); let chain_id = extension.map(|e| e.relay_chain.clone()); - let base_path = para_config.base_path.as_ref().map(|x| x.path().join("polkadot")); - Self { base_path, chain_id, base: clap::Parser::parse_from(relay_chain_args) } + let base_path = para_config.base_path.path().join("polkadot"); + Self { + base_path: Some(base_path), + chain_id, + base: clap::Parser::parse_from(relay_chain_args), + } } } diff --git a/polkadot-parachain/src/cli.rs b/polkadot-parachain/src/cli.rs index 682911abf75..790951fb3b1 100644 --- a/polkadot-parachain/src/cli.rs +++ b/polkadot-parachain/src/cli.rs @@ -122,7 +122,11 @@ impl RelayChainCli { ) -> Self { let extension = crate::chain_spec::Extensions::try_get(&*para_config.chain_spec); let chain_id = extension.map(|e| e.relay_chain.clone()); - let base_path = para_config.base_path.as_ref().map(|x| x.path().join("polkadot")); - Self { base_path, chain_id, base: clap::Parser::parse_from(relay_chain_args) } + let base_path = para_config.base_path.path().join("polkadot"); + Self { + base_path: Some(base_path), + chain_id, + base: clap::Parser::parse_from(relay_chain_args), + } } } diff --git a/test/service/src/cli.rs b/test/service/src/cli.rs index 6b46d9ccf50..0b7084e1abd 100644 --- a/test/service/src/cli.rs +++ b/test/service/src/cli.rs @@ -117,8 +117,12 @@ impl RelayChainCli { para_config: &sc_service::Configuration, relay_chain_args: impl Iterator, ) -> Self { - let base_path = para_config.base_path.as_ref().map(|x| x.path().join("polkadot")); - Self { base_path, chain_id: None, base: clap::Parser::parse_from(relay_chain_args) } + let base_path = para_config.base_path.path().join("polkadot"); + Self { + base_path: Some(base_path), + chain_id: None, + base: clap::Parser::parse_from(relay_chain_args), + } } } diff --git a/test/service/src/lib.rs b/test/service/src/lib.rs index 58ef651bd47..662f04487aa 100644 --- a/test/service/src/lib.rs +++ b/test/service/src/lib.rs @@ -764,7 +764,8 @@ pub fn node_config( tracing_receiver: Default::default(), max_runtime_instances: 8, announce_block: true, - base_path: Some(base_path), + data_path: root, + base_path, informant_output_format: Default::default(), wasm_runtime_overrides: None, runtime_cache_size: 2, From ab7ce3bcf81f305e265a773ca7571e81fb73a94d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 May 2023 21:30:01 +0000 Subject: [PATCH 162/339] Bump parity-scale-codec from 3.4.0 to 3.5.0 (#2523) Bumps [parity-scale-codec](https://github.com/paritytech/parity-scale-codec) from 3.4.0 to 3.5.0. - [Release notes](https://github.com/paritytech/parity-scale-codec/releases) - [Changelog](https://github.com/paritytech/parity-scale-codec/blob/master/CHANGELOG.md) - [Commits](https://github.com/paritytech/parity-scale-codec/compare/v3.4.0...parity-scale-codec-v3.5.0) --- updated-dependencies: - dependency-name: parity-scale-codec dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- client/relay-chain-interface/Cargo.toml | 2 +- client/relay-chain-rpc-interface/Cargo.toml | 2 +- pallets/session-benchmarking/Cargo.toml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 89a17e254ab..e23b26dd6e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7918,9 +7918,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637935964ff85a605d114591d4d2c13c5d1ba2806dae97cea6bf180238a749ac" +checksum = "5ddb756ca205bd108aee3c62c6d3c994e1df84a59b9d6d4a5ea42ee1fd5a9a28" dependencies = [ "arrayvec 0.7.2", "bitvec", diff --git a/client/relay-chain-interface/Cargo.toml b/client/relay-chain-interface/Cargo.toml index 421c9c9aa9c..c4ee9d2fb59 100644 --- a/client/relay-chain-interface/Cargo.toml +++ b/client/relay-chain-interface/Cargo.toml @@ -18,4 +18,4 @@ futures = "0.3.28" async-trait = "0.1.68" thiserror = "1.0.40" jsonrpsee-core = "0.16.2" -parity-scale-codec = "3.4.0" +parity-scale-codec = "3.5.0" diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index 6380abe066d..b23ef658f75 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -25,7 +25,7 @@ tokio = { version = "1.28.0", features = ["sync"] } futures = "0.3.28" futures-timer = "3.0.2" -parity-scale-codec = "3.4.0" +parity-scale-codec = "3.5.0" jsonrpsee = { version = "0.16.2", features = ["ws-client"] } tracing = "0.1.37" async-trait = "0.1.68" diff --git a/pallets/session-benchmarking/Cargo.toml b/pallets/session-benchmarking/Cargo.toml index 11f985633e0..111cbb85ee6 100644 --- a/pallets/session-benchmarking/Cargo.toml +++ b/pallets/session-benchmarking/Cargo.toml @@ -13,7 +13,7 @@ readme = "README.md" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -parity-scale-codec = { version = "3.4.0", default-features = false } +parity-scale-codec = { version = "3.5.0", default-features = false } sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } From 4e82c97a14e080856d6e51d2d17e713905d9e2b4 Mon Sep 17 00:00:00 2001 From: Muharem Ismailov Date: Fri, 5 May 2023 16:39:13 +0200 Subject: [PATCH 163/339] Companion: XCM remote lock config (#2463) * xcm remote lock config * rename * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 585 ++++++++++-------- parachain-template/runtime/src/xcm_config.rs | 2 + .../assets/statemine/src/xcm_config.rs | 2 + .../assets/statemint/src/xcm_config.rs | 2 + .../assets/westmint/src/xcm_config.rs | 2 + .../bridge-hub-kusama/src/xcm_config.rs | 2 + .../bridge-hub-polkadot/src/xcm_config.rs | 2 + .../bridge-hub-rococo/src/xcm_config.rs | 2 + .../collectives-polkadot/src/xcm_config.rs | 2 + .../contracts-rococo/src/xcm_config.rs | 2 + .../runtimes/testing/penpal/src/xcm_config.rs | 2 + .../testing/rococo-parachain/src/lib.rs | 2 + 12 files changed, 342 insertions(+), 265 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e23b26dd6e7..3bb509f77b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,7 +585,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "hash-db", "log", @@ -1715,6 +1715,19 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "console" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.42.0", +] + [[package]] name = "const-oid" version = "0.9.2" @@ -3375,6 +3388,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "enum-as-inner" version = "0.5.1" @@ -3742,7 +3761,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", ] @@ -3765,7 +3784,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-support-procedural", @@ -3790,7 +3809,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3837,7 +3856,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3848,7 +3867,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3865,7 +3884,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -3894,10 +3913,11 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-recursion", "futures", + "indicatif", "jsonrpsee", "log", "parity-scale-codec", @@ -3905,6 +3925,7 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", + "spinners", "substrate-rpc-client", "tokio", ] @@ -3912,7 +3933,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "bitflags", "environmental", @@ -3945,7 +3966,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "Inflector", "cfg-expr", @@ -3961,7 +3982,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3973,7 +3994,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "proc-macro2", "quote", @@ -3983,7 +4004,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "log", @@ -4001,7 +4022,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -4016,7 +4037,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "sp-api", @@ -4025,7 +4046,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "parity-scale-codec", @@ -4730,6 +4751,18 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" +[[package]] +name = "indicatif" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cef509aa9bc73864d6756f0d34d35504af3cf0844373afe9b8669a5b8005a729" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width", +] + [[package]] name = "instant" version = "0.1.12" @@ -5030,7 +5063,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bitvec", "frame-benchmarking", @@ -5128,7 +5161,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "frame-support", "polkadot-primitives", @@ -5982,7 +6015,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "futures", "log", @@ -6001,7 +6034,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "anyhow", "jsonrpsee", @@ -6349,6 +6382,12 @@ dependencies = [ "libc", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + [[package]] name = "object" version = "0.29.0" @@ -6500,7 +6539,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6521,7 +6560,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -6539,7 +6578,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -6554,7 +6593,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -6570,7 +6609,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -6586,7 +6625,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -6600,7 +6639,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -6624,7 +6663,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6644,7 +6683,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -6659,7 +6698,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -6678,7 +6717,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6702,7 +6741,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -6808,7 +6847,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -6852,7 +6891,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -6869,7 +6908,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "bitflags", "environmental", @@ -6899,7 +6938,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "bitflags", "parity-scale-codec", @@ -6912,7 +6951,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "proc-macro2", "quote", @@ -6922,7 +6961,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6939,7 +6978,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -6957,7 +6996,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6980,7 +7019,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6993,7 +7032,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7011,7 +7050,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7029,7 +7068,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7052,7 +7091,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7068,7 +7107,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7088,7 +7127,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7105,7 +7144,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -7119,7 +7158,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7136,7 +7175,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7153,7 +7192,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7169,7 +7208,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7187,7 +7226,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "pallet-nfts", @@ -7198,7 +7237,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7214,7 +7253,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -7231,7 +7270,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7251,7 +7290,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7262,7 +7301,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -7279,7 +7318,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7303,7 +7342,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7320,7 +7359,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7335,7 +7374,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7353,7 +7392,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7368,7 +7407,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7387,7 +7426,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7404,7 +7443,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -7425,7 +7464,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7441,7 +7480,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -7455,7 +7494,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7478,7 +7517,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7489,7 +7528,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "log", "sp-arithmetic", @@ -7498,7 +7537,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "sp-api", @@ -7507,7 +7546,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7524,7 +7563,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -7553,7 +7592,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7571,7 +7610,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7590,7 +7629,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-support", "frame-system", @@ -7606,7 +7645,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7622,7 +7661,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7634,7 +7673,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7651,7 +7690,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7666,7 +7705,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7682,7 +7721,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7697,7 +7736,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-benchmarking", "frame-support", @@ -7712,7 +7751,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7733,7 +7772,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "frame-benchmarking", "frame-support", @@ -8311,7 +8350,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8327,7 +8366,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8341,7 +8380,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "derive_more", "fatality", @@ -8364,7 +8403,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "fatality", "futures", @@ -8385,7 +8424,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8414,7 +8453,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "async-trait", "frame-benchmarking", @@ -8457,7 +8496,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "always-assert", "bitvec", @@ -8479,7 +8518,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "parity-scale-codec", "scale-info", @@ -8491,7 +8530,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "derive_more", "fatality", @@ -8516,7 +8555,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8530,7 +8569,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "futures", "futures-timer", @@ -8550,7 +8589,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "always-assert", "async-trait", @@ -8573,7 +8612,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "futures", "parity-scale-codec", @@ -8591,7 +8630,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bitvec", "derive_more", @@ -8620,7 +8659,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bitvec", "futures", @@ -8641,7 +8680,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bitvec", "fatality", @@ -8660,7 +8699,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8675,7 +8714,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "async-trait", "futures", @@ -8695,7 +8734,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "futures", "polkadot-node-metrics", @@ -8710,7 +8749,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "futures", "futures-timer", @@ -8727,7 +8766,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "fatality", "futures", @@ -8746,7 +8785,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "async-trait", "futures", @@ -8763,7 +8802,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bitvec", "fatality", @@ -8781,7 +8820,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "always-assert", "futures", @@ -8808,7 +8847,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "futures", "polkadot-node-primitives", @@ -8824,7 +8863,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "assert_matches", "cpu-time", @@ -8853,7 +8892,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "futures", "lru 0.9.0", @@ -8868,7 +8907,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "lazy_static", "log", @@ -8886,7 +8925,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bs58", "futures", @@ -8905,7 +8944,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "async-trait", "derive_more", @@ -8927,7 +8966,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bounded-vec", "futures", @@ -8949,7 +8988,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8959,7 +8998,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "async-trait", "futures", @@ -8977,7 +9016,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "async-trait", "derive_more", @@ -9000,7 +9039,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "async-trait", "derive_more", @@ -9033,7 +9072,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "async-trait", "futures", @@ -9056,7 +9095,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bounded-collections", "derive_more", @@ -9154,7 +9193,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9172,7 +9211,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9198,7 +9237,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9230,7 +9269,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bitvec", "frame-benchmarking", @@ -9324,7 +9363,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bitvec", "frame-benchmarking", @@ -9370,7 +9409,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "frame-support", "polkadot-primitives", @@ -9384,7 +9423,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bs58", "parity-scale-codec", @@ -9396,7 +9435,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bitflags", "bitvec", @@ -9440,7 +9479,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9550,7 +9589,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9571,7 +9610,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9581,7 +9620,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9606,7 +9645,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9667,7 +9706,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "frame-benchmarking", "frame-system", @@ -9764,6 +9803,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "portable-atomic" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26f6a7b87c2e435a3241addceeeff740ff8b7e76b74c13bf9acb17fa454ea00b" + [[package]] name = "portpicker" version = "0.1.1" @@ -10434,7 +10479,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10520,7 +10565,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "frame-support", "polkadot-primitives", @@ -10767,7 +10812,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "log", "sp-core", @@ -10778,7 +10823,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "futures", @@ -10806,7 +10851,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "futures", "futures-timer", @@ -10829,7 +10874,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10844,7 +10889,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10863,7 +10908,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10874,7 +10919,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10914,7 +10959,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "fnv", "futures", @@ -10941,7 +10986,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "hash-db", "kvdb", @@ -10967,7 +11012,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "futures", @@ -10992,7 +11037,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "futures", @@ -11021,7 +11066,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "fork-tree", @@ -11057,7 +11102,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "futures", "jsonrpsee", @@ -11079,7 +11124,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11114,7 +11159,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "futures", "jsonrpsee", @@ -11133,7 +11178,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11146,7 +11191,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11186,7 +11231,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "finality-grandpa", "futures", @@ -11206,7 +11251,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "futures", @@ -11229,7 +11274,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11253,7 +11298,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11266,7 +11311,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "log", "sc-allocator", @@ -11279,7 +11324,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "anyhow", "cfg-if", @@ -11297,7 +11342,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "ansi_term", "futures", @@ -11313,7 +11358,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11328,7 +11373,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11373,7 +11418,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "cid", "futures", @@ -11393,7 +11438,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11421,7 +11466,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "ahash 0.8.2", "futures", @@ -11440,7 +11485,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11462,7 +11507,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11496,7 +11541,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11516,7 +11561,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11547,7 +11592,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "futures", "libp2p", @@ -11560,7 +11605,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11569,7 +11614,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "futures", "jsonrpsee", @@ -11600,7 +11645,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11619,7 +11664,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "http", "jsonrpsee", @@ -11634,7 +11679,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11660,7 +11705,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "directories", @@ -11726,7 +11771,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "log", "parity-scale-codec", @@ -11737,7 +11782,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "clap 4.2.7", "fs4", @@ -11753,7 +11798,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11772,7 +11817,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "futures", "libc", @@ -11791,7 +11836,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "chrono", "futures", @@ -11810,7 +11855,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "ansi_term", "atty", @@ -11841,7 +11886,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11852,7 +11897,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "futures", @@ -11879,7 +11924,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "futures", @@ -11893,7 +11938,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-channel", "futures", @@ -12374,7 +12419,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "enumn", "parity-scale-codec", @@ -12451,7 +12496,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "hash-db", "log", @@ -12471,7 +12516,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "Inflector", "blake2", @@ -12485,7 +12530,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "scale-info", @@ -12498,7 +12543,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "integer-sqrt", "num-traits", @@ -12512,7 +12557,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "scale-info", @@ -12525,7 +12570,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "sp-api", @@ -12537,7 +12582,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "futures", "log", @@ -12555,7 +12600,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "futures", @@ -12570,7 +12615,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "parity-scale-codec", @@ -12588,7 +12633,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "parity-scale-codec", @@ -12609,7 +12654,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12628,7 +12673,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "finality-grandpa", "log", @@ -12646,7 +12691,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "scale-info", @@ -12658,7 +12703,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12702,7 +12747,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "blake2b_simd", "byteorder", @@ -12716,7 +12761,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "proc-macro2", "quote", @@ -12727,7 +12772,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12736,7 +12781,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "proc-macro2", "quote", @@ -12746,7 +12791,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "environmental", "parity-scale-codec", @@ -12757,7 +12802,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12772,7 +12817,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "bytes", "ed25519", @@ -12798,7 +12843,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "lazy_static", "sp-core", @@ -12809,7 +12854,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "futures", "parity-scale-codec", @@ -12823,7 +12868,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12832,7 +12877,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12843,7 +12888,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12861,7 +12906,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "scale-info", @@ -12875,7 +12920,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "sp-api", "sp-core", @@ -12885,7 +12930,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "backtrace", "lazy_static", @@ -12895,7 +12940,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "rustc-hash", "serde", @@ -12905,7 +12950,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "either", "hash256-std-hasher", @@ -12927,7 +12972,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12945,7 +12990,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "Inflector", "proc-macro-crate", @@ -12957,7 +13002,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "serde", "serde_json", @@ -12966,7 +13011,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "scale-info", @@ -12980,7 +13025,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "scale-info", @@ -12993,7 +13038,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "hash-db", "log", @@ -13013,7 +13058,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "log", "parity-scale-codec", @@ -13031,12 +13076,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13049,7 +13094,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "futures-timer", @@ -13064,7 +13109,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "sp-std", @@ -13076,7 +13121,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "sp-api", "sp-runtime", @@ -13085,7 +13130,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "log", @@ -13101,7 +13146,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13124,7 +13169,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13141,7 +13186,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13152,7 +13197,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13166,7 +13211,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "parity-scale-codec", "scale-info", @@ -13190,6 +13235,17 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" +[[package]] +name = "spinners" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08615eea740067d9899969bc2891c68a19c315cb1f66640af9a9ecb91b13bcab" +dependencies = [ + "lazy_static", + "maplit", + "strum", +] + [[package]] name = "spki" version = "0.6.0" @@ -13490,7 +13546,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "platforms 2.0.0", ] @@ -13498,7 +13554,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13517,7 +13573,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "hyper", "log", @@ -13529,7 +13585,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "jsonrpsee", @@ -13542,7 +13598,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "jsonrpsee", "log", @@ -13561,7 +13617,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13587,7 +13643,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13597,7 +13653,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13608,7 +13664,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "ansi_term", "build-helper", @@ -13735,7 +13791,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "frame-support", "polkadot-primitives", @@ -14121,7 +14177,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14132,7 +14188,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14262,7 +14318,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#82f783d902a11e4bf05a02acd07a70ba6d834d8c" +source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" dependencies = [ "async-trait", "clap 4.2.7", @@ -14617,9 +14673,9 @@ dependencies = [ [[package]] name = "wasm-opt" -version = "0.111.0" +version = "0.112.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a303793cbc01fb96551badfc7367db6007396bba6bac97936b3c8b6f7fdb41" +checksum = "87fef6d0d508f08334e0ab0e6877feb4c0ecb3956bcf2cb950699b22fedf3e9c" dependencies = [ "anyhow", "libc", @@ -14633,9 +14689,9 @@ dependencies = [ [[package]] name = "wasm-opt-cxx-sys" -version = "0.111.0" +version = "0.112.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c9deb56f8a9f2ec177b3bd642a8205621835944ed5da55f2388ef216aca5a4" +checksum = "bc816bbc1596c8f2e8127e137a760c798023ef3d378f2ae51f0f1840e2dfa445" dependencies = [ "anyhow", "cxx", @@ -14645,15 +14701,14 @@ dependencies = [ [[package]] name = "wasm-opt-sys" -version = "0.111.0" +version = "0.112.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4432e28b542738a9776cedf92e8a99d8991c7b4667ee2c7ccddfb479dd2856a7" +checksum = "40199e4f68ef1071b3c6d0bd8026a12b481865d4b9e49c156932ea9a6234dd14" dependencies = [ "anyhow", "cc", "cxx", "cxx-build", - "regex", ] [[package]] @@ -15196,7 +15251,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bitvec", "frame-benchmarking", @@ -15288,7 +15343,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "frame-support", "polkadot-primitives", @@ -15790,7 +15845,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "bounded-collections", "derivative", @@ -15806,7 +15861,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "frame-support", "frame-system", @@ -15827,7 +15882,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "environmental", "frame-benchmarking", @@ -15847,7 +15902,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#400b5a5c85e377edd454c854f722346e5d606b0f" +source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachain-template/runtime/src/xcm_config.rs b/parachain-template/runtime/src/xcm_config.rs index bd395c83d38..096359004d6 100644 --- a/parachain-template/runtime/src/xcm_config.rs +++ b/parachain-template/runtime/src/xcm_config.rs @@ -248,6 +248,8 @@ impl pallet_xcm::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] type ReachableDest = ReachableDest; type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 45f95ee07d4..eb99e2fb709 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -477,6 +477,8 @@ impl pallet_xcm::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] type ReachableDest = ReachableDest; type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index 9d31bc0da60..19fb96c3027 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -373,6 +373,8 @@ impl pallet_xcm::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] type ReachableDest = ReachableDest; type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index d9987a627ae..a834180bd29 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -470,6 +470,8 @@ impl pallet_xcm::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] type ReachableDest = ReachableDest; type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs index 7b395a4d4e3..0e3ce655349 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs @@ -261,6 +261,8 @@ impl pallet_xcm::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] type ReachableDest = ReachableDest; type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs index d063fda2c13..3cd79a8324b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs @@ -264,6 +264,8 @@ impl pallet_xcm::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] type ReachableDest = ReachableDest; type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index 91fd15136bb..cd915a99313 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -298,6 +298,8 @@ impl pallet_xcm::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] type ReachableDest = ReachableDest; type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index b2b93d88ffe..7749877a52f 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -294,6 +294,8 @@ impl pallet_xcm::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] type ReachableDest = ReachableDest; type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs index 1b42819b423..e79d06b1aa1 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs @@ -213,6 +213,8 @@ impl pallet_xcm::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] type ReachableDest = ReachableDest; type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/testing/penpal/src/xcm_config.rs b/parachains/runtimes/testing/penpal/src/xcm_config.rs index 89cfc2ced65..89236aa93a9 100644 --- a/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -339,6 +339,8 @@ impl pallet_xcm::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] type ReachableDest = ReachableDest; type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 1a26290f2a3..0147c28335c 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -470,6 +470,8 @@ impl pallet_xcm::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] type ReachableDest = ReachableDest; type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); } impl cumulus_pallet_xcm::Config for Runtime { From 1bddaae927201eb2809d788d1b57ba2942d95865 Mon Sep 17 00:00:00 2001 From: Artyom Bakhtin Date: Fri, 5 May 2023 15:58:28 +0100 Subject: [PATCH 164/339] Update DNS names of Rococo Contracts bootnodes (#2524) --- parachains/chain-specs/contracts-rococo.json | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/parachains/chain-specs/contracts-rococo.json b/parachains/chain-specs/contracts-rococo.json index a74ab22e05d..09108e9c099 100644 --- a/parachains/chain-specs/contracts-rococo.json +++ b/parachains/chain-specs/contracts-rococo.json @@ -3,11 +3,16 @@ "id": "contracts-rococo", "chainType": "Live", "bootNodes": [ - "/dns/contracts-collator-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWKg3Rpxcr9oJ8n6khoxpGKWztCZydtUZk2cojHqnfLrpj", - "/dns/contracts-collator-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWPEXYrz8tHU3nDtPoPw4V7ou5dzMEWSTuUj7vaWiYVAVh", - "/dns/contracts-collator-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWEVU8AFNary4nP4qEnEcwJaRuy59Wefekzdu9pKbnVEhk", - "/dns/contracts-collator-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWP6pV3ZmcXzGDjv8ZMgA6nZxfAKDxSz4VNiLx6vVCQgJX" + "/dns/rococo-contracts-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWKg3Rpxcr9oJ8n6khoxpGKWztCZydtUZk2cojHqnfLrpj", + "/dns/rococo-contracts-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWPEXYrz8tHU3nDtPoPw4V7ou5dzMEWSTuUj7vaWiYVAVh", + "/dns/rococo-contracts-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWEVU8AFNary4nP4qEnEcwJaRuy59Wefekzdu9pKbnVEhk", + "/dns/rococo-contracts-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWP6pV3ZmcXzGDjv8ZMgA6nZxfAKDxSz4VNiLx6vVCQgJX", + "/dns/rococo-contracts-collator-node-0.polkadot.io/tcp/443/wss/p2p/12D3KooWKg3Rpxcr9oJ8n6khoxpGKWztCZydtUZk2cojHqnfLrpj", + "/dns/rococo-contracts-collator-node-1.polkadot.io/tcp/443/wss/p2p/12D3KooWPEXYrz8tHU3nDtPoPw4V7ou5dzMEWSTuUj7vaWiYVAVh", + "/dns/rococo-contracts-collator-node-2.polkadot.io/tcp/443/wss/p2p/12D3KooWEVU8AFNary4nP4qEnEcwJaRuy59Wefekzdu9pKbnVEhk", + "/dns/rococo-contracts-collator-node-3.polkadot.io/tcp/443/wss/p2p/12D3KooWP6pV3ZmcXzGDjv8ZMgA6nZxfAKDxSz4VNiLx6vVCQgJX" ], + "telemetryEndpoints": null, "protocolId": null, "properties": { @@ -80,4 +85,4 @@ "childrenDefault": {} } } -} \ No newline at end of file +} From 0d04b8b47d3da27b385080f93f41179a72c0d2f0 Mon Sep 17 00:00:00 2001 From: Javier Viola Date: Fri, 5 May 2023 19:53:16 -0300 Subject: [PATCH 165/339] bump zombienet version (#2525) * bump zombienet version * fix para registration args --- .gitlab-ci.yml | 2 +- zombienet/tests/register-para.js | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7166ace649f..93471823d26 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: CI_IMAGE: "paritytech/ci-linux:production" DOCKER_OS: "debian:stretch" ARCH: "x86_64" - ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.43" + ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.50" BUILDAH_IMAGE: "quay.io/buildah/stable:v1.29" BUILDAH_COMMAND: "buildah --storage-driver overlay2" diff --git a/zombienet/tests/register-para.js b/zombienet/tests/register-para.js index c080904aefe..a8fbab94673 100644 --- a/zombienet/tests/register-para.js +++ b/zombienet/tests/register-para.js @@ -3,7 +3,18 @@ async function run(nodeName, networkInfo, args) { const para = networkInfo.paras[paraIdStr]; const relayNode = networkInfo.relay[0]; - await zombie.registerParachain(parseInt(paraIdStr,10),para.wasmPath, para.statePath, relayNode.wsUri, "//Alice", true); + const registerParachainOptions = { + id: parseInt(paraIdStr,10), + wasmPath: para.wasmPath, + statePath: para.statePath, + apiUrl: relayNode.wsUri, + onboardAsParachain: true, + seed: "//Alice", + finalization: true + }; + + + await zombie.registerParachain(registerParachainOptions); } module.exports = { run } From 4dc50c8d89498fc24208e6c2c395ea9b47bdd0db Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Sat, 6 May 2023 07:58:25 +0200 Subject: [PATCH 166/339] Make zombienet tests required (#2527) Co-authored-by: parity-processbot <> --- scripts/ci/gitlab/pipeline/zombienet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci/gitlab/pipeline/zombienet.yml b/scripts/ci/gitlab/pipeline/zombienet.yml index d76531b19e7..d5ab3e13d42 100644 --- a/scripts/ci/gitlab/pipeline/zombienet.yml +++ b/scripts/ci/gitlab/pipeline/zombienet.yml @@ -35,7 +35,7 @@ expire_in: 2 days paths: - ./zombienet-logs - allow_failure: true + allow_failure: false retry: 2 tags: - zombienet-polkadot-integration-test From c312f0b9a67c58c049dfb3b5a12e464b977c5005 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Sat, 6 May 2023 08:01:03 +0200 Subject: [PATCH 167/339] Fix Clippy (#2522) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Import Clippy config from Polkadot Signed-off-by: Oliver Tale-Yazdi * Auto clippy fix Signed-off-by: Oliver Tale-Yazdi * No tabs in comments Signed-off-by: Oliver Tale-Yazdi * Prefer matches Signed-off-by: Oliver Tale-Yazdi * Dont drop references Signed-off-by: Oliver Tale-Yazdi * Trivial Signed-off-by: Oliver Tale-Yazdi * Refactor Signed-off-by: Oliver Tale-Yazdi * fmt Signed-off-by: Oliver Tale-Yazdi * add clippy to ci * Clippy reborrow Signed-off-by: Oliver Tale-Yazdi * Update client/pov-recovery/src/lib.rs Co-authored-by: Bastian Köcher * Update client/pov-recovery/src/lib.rs Co-authored-by: Bastian Köcher * Partially revert 'Prefer matches' Using matches! instead of match does give less compiler checks as per review from @chevdor. Partially reverts 8c0609677f3ea040f77fffd5be6facf7c3fec95c Signed-off-by: Oliver Tale-Yazdi * Update .cargo/config.toml Co-authored-by: Chevdor * Revert revert 💩 Should be fine to use matches! macro since it is an explicit whitelist, not wildcard matching. --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: alvicsam Co-authored-by: Bastian Köcher Co-authored-by: Chevdor Co-authored-by: parity-processbot <> --- .cargo/config.toml | 32 ++ .../src/messages_benchmarking.rs | 12 +- .../src/parachains_benchmarking.rs | 2 +- bridges/modules/messages/src/benchmarking.rs | 12 +- bridges/modules/messages/src/mock.rs | 2 +- bridges/modules/relayers/src/benchmarking.rs | 6 +- client/cli/src/lib.rs | 4 +- client/collator/src/lib.rs | 30 +- client/consensus/aura/src/import_queue.rs | 4 +- client/consensus/common/src/level_monitor.rs | 2 +- .../common/src/parachain_consensus.rs | 10 +- client/consensus/common/src/tests.rs | 10 +- client/consensus/relay-chain/src/lib.rs | 4 +- client/network/src/tests.rs | 6 +- client/pov-recovery/src/lib.rs | 8 +- .../src/lib.rs | 6 +- .../src/collator_overseer.rs | 4 +- client/service/src/lib.rs | 2 +- .../collator-selection/src/benchmarking.rs | 6 +- pallets/collator-selection/src/lib.rs | 8 +- pallets/collator-selection/src/mock.rs | 10 +- pallets/collator-selection/src/tests.rs | 16 +- pallets/collator-selection/src/weights.rs | 94 +++--- pallets/dmp-queue/src/lib.rs | 28 +- pallets/dmp-queue/src/migration.rs | 2 +- pallets/parachain-system/src/lib.rs | 41 ++- pallets/parachain-system/src/tests.rs | 19 +- .../src/validate_block/tests.rs | 10 +- pallets/xcmp-queue/src/lib.rs | 2 +- pallets/xcmp-queue/src/migration.rs | 2 +- pallets/xcmp-queue/src/mock.rs | 2 +- pallets/xcmp-queue/src/tests.rs | 12 +- pallets/xcmp-queue/src/weights.rs | 24 +- parachain-template/node/src/command.rs | 6 +- parachain-template/runtime/src/lib.rs | 4 +- parachains/common/src/impls.rs | 1 - parachains/pallets/parachain-info/src/lib.rs | 2 +- .../assets/common/src/foreign_creators.rs | 4 +- .../runtimes/assets/common/src/matching.rs | 17 +- .../runtimes/assets/statemine/src/lib.rs | 11 +- .../assets/statemine/src/weights/xcm/mod.rs | 9 +- .../assets/statemine/src/xcm_config.rs | 277 +++++++++-------- .../runtimes/assets/statemine/tests/tests.rs | 27 +- .../runtimes/assets/statemint/src/lib.rs | 9 +- .../assets/statemint/src/weights/xcm/mod.rs | 9 +- .../assets/statemint/src/xcm_config.rs | 151 +++++----- .../runtimes/assets/statemint/tests/tests.rs | 23 +- .../runtimes/assets/test-utils/src/lib.rs | 23 +- .../assets/test-utils/src/test_cases.rs | 26 +- .../runtimes/assets/westmint/src/lib.rs | 9 +- .../assets/westmint/src/weights/xcm/mod.rs | 9 +- .../assets/westmint/src/xcm_config.rs | 282 +++++++++--------- .../runtimes/assets/westmint/tests/tests.rs | 27 +- .../bridge-hubs/bridge-hub-kusama/src/lib.rs | 8 +- .../bridge-hub-kusama/src/weights/xcm/mod.rs | 9 +- .../bridge-hub-kusama/src/xcm_config.rs | 42 ++- .../bridge-hub-polkadot/src/lib.rs | 8 +- .../src/weights/xcm/mod.rs | 11 +- .../bridge-hub-polkadot/src/xcm_config.rs | 42 ++- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 8 +- .../bridge-hub-rococo/src/weights/xcm/mod.rs | 9 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 6 +- .../bridge-hub-rococo/src/xcm_config.rs | 62 ++-- .../bridge-hubs/test-utils/src/test_cases.rs | 8 +- .../src/fellowship/migration.rs | 4 +- .../src/fellowship/tracks.rs | 30 +- .../collectives-polkadot/src/impls.rs | 9 +- .../collectives-polkadot/src/lib.rs | 6 +- .../collectives-polkadot/src/xcm_config.rs | 92 +++--- .../contracts/contracts-rococo/src/lib.rs | 2 +- parachains/runtimes/starters/shell/src/lib.rs | 2 +- parachains/runtimes/testing/penpal/src/lib.rs | 2 +- .../runtimes/testing/penpal/src/xcm_config.rs | 8 +- .../testing/rococo-parachain/src/lib.rs | 14 +- .../src/chain_spec/bridge_hubs.rs | 2 +- polkadot-parachain/src/command.rs | 16 +- polkadot-parachain/src/rpc.rs | 2 +- polkadot-parachain/src/service.rs | 4 +- .../tests/benchmark_storage_works.rs | 4 +- polkadot-parachain/tests/common.rs | 4 +- polkadot-parachain/tests/purge_chain_works.rs | 2 +- .../parachain-inherent/src/client_side.rs | 25 +- primitives/parachain-inherent/src/mock.rs | 4 +- primitives/timestamp/src/lib.rs | 4 +- primitives/utility/src/lib.rs | 22 +- scripts/ci/gitlab/pipeline/test.yml | 8 + test/client/src/block_builder.rs | 6 +- test/client/src/lib.rs | 1 - test/relay-sproof-builder/src/lib.rs | 2 +- .../service/benches/transaction_throughput.rs | 22 +- test/service/src/chain_spec.rs | 3 +- test/service/src/lib.rs | 8 +- 92 files changed, 911 insertions(+), 968 deletions(-) create mode 100644 .cargo/config.toml diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 00000000000..66b28b3485d --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,32 @@ +# +# An auto defined `clippy` feature was introduced, +# but it was found to clash with user defined features, +# so was renamed to `cargo-clippy`. +# +# If you want standard clippy run: +# RUSTFLAGS= cargo clippy +[target.'cfg(feature = "cargo-clippy")'] +rustflags = [ + "-Aclippy::all", + "-Dclippy::correctness", + "-Aclippy::if-same-then-else", + "-Aclippy::clone-double-ref", + "-Dclippy::complexity", + "-Aclippy::zero-prefixed-literal", # 00_1000_000 + "-Aclippy::type_complexity", # raison d'etre + "-Aclippy::nonminimal-bool", # maybe + "-Aclippy::borrowed-box", # Reasonable to fix this one + "-Aclippy::too-many-arguments", # (Turning this on would lead to) + "-Aclippy::unnecessary_cast", # Types may change + "-Aclippy::identity-op", # One case where we do 0 + + "-Aclippy::useless_conversion", # Types may change + "-Aclippy::unit_arg", # styalistic. + "-Aclippy::option-map-unit-fn", # styalistic + "-Aclippy::bind_instead_of_map", # styalistic + "-Aclippy::erasing_op", # E.g. 0 * DOLLARS + "-Aclippy::eq_op", # In tests we test equality. + "-Aclippy::while_immutable_condition", # false positives + "-Aclippy::needless_option_as_deref", # false positives + "-Aclippy::derivable_impls", # false positives + "-Aclippy::stable_sort_primitive", # prefer stable sort +] diff --git a/bridges/bin/runtime-common/src/messages_benchmarking.rs b/bridges/bin/runtime-common/src/messages_benchmarking.rs index b067523c305..9d90f12ed5c 100644 --- a/bridges/bin/runtime-common/src/messages_benchmarking.rs +++ b/bridges/bin/runtime-common/src/messages_benchmarking.rs @@ -182,11 +182,7 @@ where // update runtime storage let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::(state_root); - FromBridgedChainMessagesDeliveryProof { - bridged_header_hash: bridged_header_hash.into(), - storage_proof, - lane, - } + FromBridgedChainMessagesDeliveryProof { bridged_header_hash, storage_proof, lane } } /// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call. @@ -211,11 +207,7 @@ where let (_, bridged_header_hash) = insert_header_to_parachains_pallet::>>(state_root); - FromBridgedChainMessagesDeliveryProof { - bridged_header_hash: bridged_header_hash.into(), - storage_proof, - lane, - } + FromBridgedChainMessagesDeliveryProof { bridged_header_hash, storage_proof, lane } } /// Prepare in-memory message delivery proof, without inserting anything to the runtime storage. diff --git a/bridges/bin/runtime-common/src/parachains_benchmarking.rs b/bridges/bin/runtime-common/src/parachains_benchmarking.rs index aad53673c3a..8a9b8547fbf 100644 --- a/bridges/bin/runtime-common/src/parachains_benchmarking.rs +++ b/bridges/bin/runtime-common/src/parachains_benchmarking.rs @@ -60,7 +60,7 @@ where TrieDBMutBuilderV1::::new(&mut mdb, &mut state_root).build(); // insert parachain heads - for (i, parachain) in parachains.into_iter().enumerate() { + for (i, parachain) in parachains.iter().enumerate() { let storage_key = parachain_head_storage_key_at_source(R::ParasPalletName::get(), *parachain); let leaf_data = if i == 0 { diff --git a/bridges/modules/messages/src/benchmarking.rs b/bridges/modules/messages/src/benchmarking.rs index aab8855a729..7db3ae64352 100644 --- a/bridges/modules/messages/src/benchmarking.rs +++ b/bridges/modules/messages/src/benchmarking.rs @@ -139,7 +139,7 @@ benchmarks_instance_pallet! { }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) verify { assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + crate::InboundLanes::::get(T::bench_lane_id()).last_delivered_nonce(), 21, ); } @@ -172,7 +172,7 @@ benchmarks_instance_pallet! { }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 2, dispatch_weight) verify { assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + crate::InboundLanes::::get(T::bench_lane_id()).last_delivered_nonce(), 22, ); } @@ -208,7 +208,7 @@ benchmarks_instance_pallet! { }); }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) verify { - let lane_state = crate::InboundLanes::::get(&T::bench_lane_id()); + let lane_state = crate::InboundLanes::::get(T::bench_lane_id()); assert_eq!(lane_state.last_delivered_nonce(), 21); assert_eq!(lane_state.last_confirmed_nonce, 20); } @@ -240,7 +240,7 @@ benchmarks_instance_pallet! { }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) verify { assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + crate::InboundLanes::::get(T::bench_lane_id()).last_delivered_nonce(), 21, ); } @@ -274,7 +274,7 @@ benchmarks_instance_pallet! { }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) verify { assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + crate::InboundLanes::::get(T::bench_lane_id()).last_delivered_nonce(), 21, ); } @@ -432,7 +432,7 @@ benchmarks_instance_pallet! { }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) verify { assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + crate::InboundLanes::::get(T::bench_lane_id()).last_delivered_nonce(), 21, ); assert!(T::is_message_successfully_dispatched(21)); diff --git a/bridges/modules/messages/src/mock.rs b/bridges/modules/messages/src/mock.rs index 2e45d5b601f..7aab79ae4a9 100644 --- a/bridges/modules/messages/src/mock.rs +++ b/bridges/modules/messages/src/mock.rs @@ -185,7 +185,7 @@ impl crate::benchmarking::Config<()> for TestRuntime { // in mock run we only care about benchmarks correctness, not the benchmark results // => ignore size related arguments let (messages, total_dispatch_weight) = - params.message_nonces.into_iter().map(|n| message(n, REGULAR_PAYLOAD)).fold( + params.message_nonces.map(|n| message(n, REGULAR_PAYLOAD)).fold( (Vec::new(), Weight::zero()), |(mut messages, total_dispatch_weight), message| { let weight = REGULAR_PAYLOAD.declared_weight; diff --git a/bridges/modules/relayers/src/benchmarking.rs b/bridges/modules/relayers/src/benchmarking.rs index d66a11ff06d..dfdecad31af 100644 --- a/bridges/modules/relayers/src/benchmarking.rs +++ b/bridges/modules/relayers/src/benchmarking.rs @@ -104,7 +104,7 @@ benchmarks! { // create slash destination account let lane = LaneId([0, 0, 0, 0]); let slash_destination = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); - T::prepare_rewards_account(slash_destination.clone(), Zero::zero()); + T::prepare_rewards_account(slash_destination, Zero::zero()); }: { crate::Pallet::::slash_and_deregister(&relayer, slash_destination) } @@ -121,10 +121,10 @@ benchmarks! { let account_params = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); }: { - crate::Pallet::::register_relayer_reward(account_params.clone(), &relayer, One::one()); + crate::Pallet::::register_relayer_reward(account_params, &relayer, One::one()); } verify { - assert_eq!(RelayerRewards::::get(relayer, &account_params), Some(One::one())); + assert_eq!(RelayerRewards::::get(relayer, account_params), Some(One::one())); } impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index a4daa9ee506..d77db6baedf 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -93,7 +93,7 @@ impl PurgeChainCmd { io::stdin().read_line(&mut input)?; let input = input.trim(); - match input.chars().nth(0) { + match input.chars().next() { Some('y') | Some('Y') => {}, _ => { println!("Aborted"); @@ -103,7 +103,7 @@ impl PurgeChainCmd { } for db_path in &db_paths { - match fs::remove_dir_all(&db_path) { + match fs::remove_dir_all(db_path) { Ok(_) => { println!("{:?} removed.", &db_path); }, diff --git a/client/collator/src/lib.rs b/client/collator/src/lib.rs index a931201f6cc..9e3b4953c0a 100644 --- a/client/collator/src/lib.rs +++ b/client/collator/src/lib.rs @@ -270,16 +270,14 @@ where let (header, extrinsics) = candidate.block.deconstruct(); - let compact_proof = match candidate - .proof - .into_compact_proof::>(last_head.state_root().clone()) - { - Ok(proof) => proof, - Err(e) => { - tracing::error!(target: "cumulus-collator", "Failed to compact proof: {:?}", e); - return None - }, - }; + let compact_proof = + match candidate.proof.into_compact_proof::>(*last_head.state_root()) { + Ok(proof) => proof, + Err(e) => { + tracing::error!(target: "cumulus-collator", "Failed to compact proof: {:?}", e); + return None + }, + }; // Create the parachain block data for the validators. let b = ParachainBlockData::::new(header, extrinsics, compact_proof); @@ -451,7 +449,7 @@ mod tests { .build() .expect("Builds overseer"); - spawner.spawn("overseer", None, overseer.run().then(|_| async { () }).boxed()); + spawner.spawn("overseer", None, overseer.run().then(|_| async {}).boxed()); let collator_start = start_collator(StartCollatorParams { runtime_api: client.clone(), @@ -461,7 +459,7 @@ mod tests { spawner, para_id, key: CollatorPair::generate().0, - parachain_consensus: Box::new(DummyParachainConsensus { client: client.clone() }), + parachain_consensus: Box::new(DummyParachainConsensus { client }), }); block_on(collator_start); @@ -469,12 +467,10 @@ mod tests { .0 .expect("message should be send by `start_collator` above."); - let config = match msg { - CollationGenerationMessage::Initialize(config) => config, - }; + let CollationGenerationMessage::Initialize(config) = msg; - let mut validation_data = PersistedValidationData::default(); - validation_data.parent_head = header.encode().into(); + let validation_data = + PersistedValidationData { parent_head: header.encode().into(), ..Default::default() }; let relay_parent = Default::default(); let collation = block_on((config.collator)(relay_parent, &validation_data)) diff --git a/client/consensus/aura/src/import_queue.rs b/client/consensus/aura/src/import_queue.rs index 862abfb349a..725e841881c 100644 --- a/client/consensus/aura/src/import_queue.rs +++ b/client/consensus/aura/src/import_queue.rs @@ -51,7 +51,7 @@ pub struct ImportQueueParams<'a, I, C, CIDP, S> { } /// Start an import queue for the Aura consensus algorithm. -pub fn import_queue<'a, P, Block, I, C, S, CIDP>( +pub fn import_queue( ImportQueueParams { block_import, client, @@ -59,7 +59,7 @@ pub fn import_queue<'a, P, Block, I, C, S, CIDP>( spawner, registry, telemetry, - }: ImportQueueParams<'a, I, C, CIDP, S>, + }: ImportQueueParams<'_, I, C, CIDP, S>, ) -> Result, sp_consensus::Error> where Block: BlockT, diff --git a/client/consensus/common/src/level_monitor.rs b/client/consensus/common/src/level_monitor.rs index 3576ced1858..ebdfaaf26ca 100644 --- a/client/consensus/common/src/level_monitor.rs +++ b/client/consensus/common/src/level_monitor.rs @@ -22,7 +22,7 @@ use std::{ sync::Arc, }; -const LOG_TARGET: &'static str = "level-monitor"; +const LOG_TARGET: &str = "level-monitor"; /// Value good enough to be used with parachains using the current backend implementation /// that ships with Substrate. This value may change in the future. diff --git a/client/consensus/common/src/parachain_consensus.rs b/client/consensus/common/src/parachain_consensus.rs index 734f682d25b..78f4e45cd81 100644 --- a/client/consensus/common/src/parachain_consensus.rs +++ b/client/consensus/common/src/parachain_consensus.rs @@ -325,7 +325,6 @@ async fn handle_new_block_imported( match parachain.block_status(unset_hash) { Ok(BlockStatus::InChainWithState) => { - drop(unset_best_header); let unset_best_header = unset_best_header_opt .take() .expect("We checked above that the value is set; qed"); @@ -433,8 +432,11 @@ async fn handle_new_best_parachain_head( } } -async fn import_block_as_new_best(hash: Block::Hash, header: Block::Header, parachain: &P) -where +async fn import_block_as_new_best( + hash: Block::Hash, + header: Block::Header, + mut parachain: &P, +) where Block: BlockT, P: UsageProvider + Send + Sync + BlockBackend, for<'a> &'a P: BlockImport, @@ -456,7 +458,7 @@ where block_import_params.fork_choice = Some(ForkChoiceStrategy::Custom(true)); block_import_params.import_existing = true; - if let Err(err) = (&*parachain).import_block(block_import_params).await { + if let Err(err) = parachain.import_block(block_import_params).await { tracing::warn!( target: LOG_TARGET, block_hash = ?hash, diff --git a/client/consensus/common/src/tests.rs b/client/consensus/common/src/tests.rs index 23516d96388..f1bc4d42b8a 100644 --- a/client/consensus/common/src/tests.rs +++ b/client/consensus/common/src/tests.rs @@ -337,7 +337,7 @@ fn follow_new_best_with_dummy_recovery_works() { Some(recovery_chan_tx), ); - let block = build_block(&*client.clone(), None, None); + let block = build_block(&*client, None, None); let block_clone = block.clone(); let client_clone = client.clone(); @@ -547,7 +547,6 @@ fn do_not_set_best_block_to_older_block() { let client = Arc::new(TestClientBuilder::with_backend(backend).build()); let blocks = (0..NUM_BLOCKS) - .into_iter() .map(|_| build_and_import_block(client.clone(), true)) .collect::>(); @@ -559,7 +558,6 @@ fn do_not_set_best_block_to_older_block() { let consensus = run_parachain_consensus(100.into(), client.clone(), relay_chain, Arc::new(|_, _| {}), None); - let client2 = client.clone(); let work = async move { new_best_heads_sender .unbounded_send(blocks[NUM_BLOCKS - 2].header().clone()) @@ -579,7 +577,7 @@ fn do_not_set_best_block_to_older_block() { }); // Build and import a new best block. - build_and_import_block(client2.clone(), true); + build_and_import_block(client, true); } #[test] @@ -607,7 +605,6 @@ fn prune_blocks_on_level_overflow() { let id0 = block0.header.hash(); let blocks1 = (0..LEVEL_LIMIT) - .into_iter() .map(|i| { build_and_import_block_ext( &*client, @@ -622,7 +619,6 @@ fn prune_blocks_on_level_overflow() { let id10 = blocks1[0].header.hash(); let blocks2 = (0..2) - .into_iter() .map(|i| { build_and_import_block_ext( &*client, @@ -720,7 +716,6 @@ fn restore_limit_monitor() { let id00 = block00.header.hash(); let blocks1 = (0..LEVEL_LIMIT + 1) - .into_iter() .map(|i| { build_and_import_block_ext( &*client, @@ -735,7 +730,6 @@ fn restore_limit_monitor() { let id10 = blocks1[0].header.hash(); let _ = (0..LEVEL_LIMIT) - .into_iter() .map(|i| { build_and_import_block_ext( &*client, diff --git a/client/consensus/relay-chain/src/lib.rs b/client/consensus/relay-chain/src/lib.rs index a31a9ec8b2a..529b78c1319 100644 --- a/client/consensus/relay-chain/src/lib.rs +++ b/client/consensus/relay-chain/src/lib.rs @@ -161,7 +161,7 @@ where relay_parent: PHash, validation_data: &PersistedValidationData, ) -> Option> { - let proposer_future = self.proposer_factory.lock().init(&parent); + let proposer_future = self.proposer_factory.lock().init(parent); let proposer = proposer_future .await @@ -171,7 +171,7 @@ where .ok()?; let inherent_data = - self.inherent_data(parent.hash(), &validation_data, relay_parent).await?; + self.inherent_data(parent.hash(), validation_data, relay_parent).await?; let Proposal { block, storage_changes, proof } = proposer .propose( diff --git a/client/network/src/tests.rs b/client/network/src/tests.rs index eefb88f2f7b..08127fe390a 100644 --- a/client/network/src/tests.rs +++ b/client/network/src/tests.rs @@ -129,7 +129,7 @@ impl RelayChainInterface for DummyRelayChainInterface { para_id: 0u32.into(), relay_parent: PHash::random(), collator: CollatorPair::generate().0.public(), - persisted_validation_data_hash: PHash::random().into(), + persisted_validation_data_hash: PHash::random(), pov_hash: PHash::random(), erasure_root: PHash::random(), signature: sp_core::sr25519::Signature([0u8; 64]).into(), @@ -293,7 +293,7 @@ async fn make_gossip_message_and_header( para_id: 0u32.into(), relay_parent, collator: CollatorPair::generate().0.public(), - persisted_validation_data_hash: PHash::random().into(), + persisted_validation_data_hash: PHash::random(), pov_hash: PHash::random(), erasure_root: PHash::random(), signature: sp_core::sr25519::Signature([0u8; 64]).into(), @@ -484,7 +484,7 @@ async fn check_statement_seconded() { para_id: 0u32.into(), relay_parent: PHash::random(), collator: CollatorPair::generate().0.public(), - persisted_validation_data_hash: PHash::random().into(), + persisted_validation_data_hash: PHash::random(), pov_hash: PHash::random(), erasure_root: PHash::random(), signature: sp_core::sr25519::Signature([0u8; 64]).into(), diff --git a/client/pov-recovery/src/lib.rs b/client/pov-recovery/src/lib.rs index 7d92934c784..62f31b6c061 100644 --- a/client/pov-recovery/src/lib.rs +++ b/client/pov-recovery/src/lib.rs @@ -40,7 +40,7 @@ //! 4a. After it is recovered, we restore the block and import it. //! //! 4b. Since we are trying to recover pending candidates, availability is not guaranteed. If the block -//! PoV is not yet available, we retry. +//! PoV is not yet available, we retry. //! //! If we need to recover multiple PoV blocks (which should hopefully not happen in real life), we //! make sure that the blocks are imported in the correct order. @@ -190,7 +190,7 @@ impl RecoveryQueue { /// Get the next hash for block recovery. pub async fn next_recovery(&mut self) -> Block::Hash { loop { - if let Some(_) = self.signaling_queue.next().await { + if self.signaling_queue.next().await.is_some() { if let Some(hash) = self.recovery_queue.pop_front() { return hash } else { @@ -309,10 +309,10 @@ where /// Block is no longer waiting for recovery fn clear_waiting_recovery(&mut self, block_hash: &Block::Hash) { - self.candidates.get_mut(block_hash).map(|candidate| { + if let Some(candidate) = self.candidates.get_mut(block_hash) { // Prevents triggering an already enqueued recovery request candidate.waiting_recovery = false; - }); + } } /// Handle a finalized block with the given `block_number`. diff --git a/client/relay-chain-inprocess-interface/src/lib.rs b/client/relay-chain-inprocess-interface/src/lib.rs index f230a23bd25..c1e19bd20b6 100644 --- a/client/relay-chain-inprocess-interface/src/lib.rs +++ b/client/relay-chain-inprocess-interface/src/lib.rs @@ -241,7 +241,7 @@ where self.full_client .import_notification_stream() .filter_map(|notification| async move { - notification.is_new_best.then(|| notification.header) + notification.is_new_best.then_some(notification.header) }); Ok(Box::pin(notifications_stream)) } @@ -428,7 +428,7 @@ mod tests { ( client.clone(), block, - RelayChainInProcessInterface::new(client, backend.clone(), dummy_network, mock_handle), + RelayChainInProcessInterface::new(client, backend, dummy_network, mock_handle), ) } @@ -483,7 +483,7 @@ mod tests { let hash = block.hash(); let ext = construct_transfer_extrinsic( - &*client, + &client, sp_keyring::Sr25519Keyring::Alice, sp_keyring::Sr25519Keyring::Bob, 1000, diff --git a/client/relay-chain-minimal-node/src/collator_overseer.rs b/client/relay-chain-minimal-node/src/collator_overseer.rs index a2ad87fa758..b488db962f3 100644 --- a/client/relay-chain-minimal-node/src/collator_overseer.rs +++ b/client/relay-chain-minimal-node/src/collator_overseer.rs @@ -76,7 +76,7 @@ pub(crate) struct CollatorOverseerGenArgs<'a> { pub peer_set_protocol_names: PeerSetProtocolNames, } -fn build_overseer<'a>( +fn build_overseer( connector: OverseerConnector, CollatorOverseerGenArgs { runtime_client, @@ -90,7 +90,7 @@ fn build_overseer<'a>( collator_pair, req_protocol_names, peer_set_protocol_names, - }: CollatorOverseerGenArgs<'a>, + }: CollatorOverseerGenArgs<'_>, ) -> Result< (Overseer, Arc>, OverseerHandle), RelayChainError, diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 894db91ba8f..ac18cb39fcf 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -441,7 +441,7 @@ where ) .await .map_err(|e| format!("{e:?}"))? - .ok_or_else(|| "Could not find parachain head in relay chain")?; + .ok_or("Could not find parachain head in relay chain")?; let target_block = B::Header::decode(&mut &validation_data.parent_head.0[..]) .map_err(|e| format!("Failed to decode parachain head: {e}"))?; diff --git a/pallets/collator-selection/src/benchmarking.rs b/pallets/collator-selection/src/benchmarking.rs index 8a222511137..6b386f7d697 100644 --- a/pallets/collator-selection/src/benchmarking.rs +++ b/pallets/collator-selection/src/benchmarking.rs @@ -129,7 +129,7 @@ benchmarks! { T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; }: { assert_ok!( - >::set_desired_candidates(origin, max.clone()) + >::set_desired_candidates(origin, max) ); } verify { @@ -142,7 +142,7 @@ benchmarks! { T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; }: { assert_ok!( - >::set_candidacy_bond(origin, bond_amount.clone()) + >::set_candidacy_bond(origin, bond_amount) ); } verify { @@ -162,7 +162,7 @@ benchmarks! { let caller: T::AccountId = whitelisted_caller(); let bond: BalanceOf = T::Currency::minimum_balance() * 2u32.into(); - T::Currency::make_free_balance_be(&caller, bond.clone()); + T::Currency::make_free_balance_be(&caller, bond); >::set_keys( RawOrigin::Signed(caller.clone()).into(), diff --git a/pallets/collator-selection/src/lib.rs b/pallets/collator-selection/src/lib.rs index 3dba6846cc3..a727e21f0fd 100644 --- a/pallets/collator-selection/src/lib.rs +++ b/pallets/collator-selection/src/lib.rs @@ -238,8 +238,8 @@ pub mod pallet { "genesis desired_candidates are more than T::MaxCandidates", ); - >::put(&self.desired_candidates); - >::put(&self.candidacy_bond); + >::put(self.desired_candidates); + >::put(self.candidacy_bond); >::put(bounded_invulnerables); } } @@ -326,7 +326,7 @@ pub mod pallet { if max > T::MaxCandidates::get() { log::warn!("max > T::MaxCandidates; you might need to run benchmarks again"); } - >::put(&max); + >::put(max); Self::deposit_event(Event::NewDesiredCandidates { desired_candidates: max }); Ok(().into()) } @@ -339,7 +339,7 @@ pub mod pallet { bond: BalanceOf, ) -> DispatchResultWithPostInfo { T::UpdateOrigin::ensure_origin(origin)?; - >::put(&bond); + >::put(bond); Self::deposit_event(Event::NewCandidacyBond { bond_amount: bond }); Ok(().into()) } diff --git a/pallets/collator-selection/src/mock.rs b/pallets/collator-selection/src/mock.rs index ac776e3d216..5470e4037ec 100644 --- a/pallets/collator-selection/src/mock.rs +++ b/pallets/collator-selection/src/mock.rs @@ -152,12 +152,12 @@ pub struct TestSessionHandler; impl pallet_session::SessionHandler for TestSessionHandler { const KEY_TYPE_IDS: &'static [sp_runtime::KeyTypeId] = &[UintAuthorityId::ID]; fn on_genesis_session(keys: &[(u64, Ks)]) { - SessionHandlerCollators::set(keys.into_iter().map(|(a, _)| *a).collect::>()) + SessionHandlerCollators::set(keys.iter().map(|(a, _)| *a).collect::>()) } fn on_new_session(_: bool, keys: &[(u64, Ks)], _: &[(u64, Ks)]) { SessionChangeBlock::set(System::block_number()); dbg!(keys.len()); - SessionHandlerCollators::set(keys.into_iter().map(|(a, _)| *a).collect::>()) + SessionHandlerCollators::set(keys.iter().map(|(a, _)| *a).collect::>()) } fn on_before_session_ending() {} fn on_disabled(_: u32) {} @@ -195,11 +195,7 @@ parameter_types! { pub struct IsRegistered; impl ValidatorRegistration for IsRegistered { fn is_registered(id: &u64) -> bool { - if *id == 7u64 { - false - } else { - true - } + *id != 7u64 } } diff --git a/pallets/collator-selection/src/tests.rs b/pallets/collator-selection/src/tests.rs index 459b107ecc5..0ae3e3d5a18 100644 --- a/pallets/collator-selection/src/tests.rs +++ b/pallets/collator-selection/src/tests.rs @@ -45,7 +45,7 @@ fn it_should_set_invulnerables() { // cannot set with non-root. assert_noop!( - CollatorSelection::set_invulnerables(RuntimeOrigin::signed(1), new_set.clone()), + CollatorSelection::set_invulnerables(RuntimeOrigin::signed(1), new_set), BadOrigin ); @@ -54,7 +54,7 @@ fn it_should_set_invulnerables() { assert_noop!( CollatorSelection::set_invulnerables( RuntimeOrigin::signed(RootAccount::get()), - invulnerables.clone() + invulnerables ), Error::::ValidatorNotRegistered ); @@ -184,8 +184,8 @@ fn cannot_register_dupe_candidate() { #[test] fn cannot_register_as_candidate_if_poor() { new_test_ext().execute_with(|| { - assert_eq!(Balances::free_balance(&3), 100); - assert_eq!(Balances::free_balance(&33), 0); + assert_eq!(Balances::free_balance(3), 100); + assert_eq!(Balances::free_balance(33), 0); // works assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); @@ -208,14 +208,14 @@ fn register_as_candidate_works() { assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); // take two endowed, non-invulnerables accounts. - assert_eq!(Balances::free_balance(&3), 100); - assert_eq!(Balances::free_balance(&4), 100); + assert_eq!(Balances::free_balance(3), 100); + assert_eq!(Balances::free_balance(4), 100); assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); - assert_eq!(Balances::free_balance(&3), 90); - assert_eq!(Balances::free_balance(&4), 90); + assert_eq!(Balances::free_balance(3), 90); + assert_eq!(Balances::free_balance(4), 90); assert_eq!(CollatorSelection::candidates().len(), 2); }); diff --git a/pallets/collator-selection/src/weights.rs b/pallets/collator-selection/src/weights.rs index 32e816b5dbe..874cec8ae36 100644 --- a/pallets/collator-selection/src/weights.rs +++ b/pallets/collator-selection/src/weights.rs @@ -39,93 +39,91 @@ pub trait WeightInfo { pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { fn set_invulnerables(b: u32) -> Weight { - Weight::from_parts(18_563_000 as u64, 0) + Weight::from_parts(18_563_000_u64, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(68_000 as u64, 0).saturating_mul(b as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) + .saturating_add(Weight::from_parts(68_000_u64, 0).saturating_mul(b as u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } fn set_desired_candidates() -> Weight { - Weight::from_parts(16_363_000 as u64, 0).saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_parts(16_363_000_u64, 0).saturating_add(T::DbWeight::get().writes(1_u64)) } fn set_candidacy_bond() -> Weight { - Weight::from_parts(16_840_000 as u64, 0).saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_parts(16_840_000_u64, 0).saturating_add(T::DbWeight::get().writes(1_u64)) } fn register_as_candidate(c: u32) -> Weight { - Weight::from_parts(71_196_000 as u64, 0) + Weight::from_parts(71_196_000_u64, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(198_000 as u64, 0).saturating_mul(c as u64)) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(2 as u64)) + .saturating_add(Weight::from_parts(198_000_u64, 0).saturating_mul(c as u64)) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } fn leave_intent(c: u32) -> Weight { - Weight::from_parts(55_336_000 as u64, 0) + Weight::from_parts(55_336_000_u64, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(151_000 as u64, 0).saturating_mul(c as u64)) - .saturating_add(T::DbWeight::get().reads(1 as u64)) - .saturating_add(T::DbWeight::get().writes(2 as u64)) + .saturating_add(Weight::from_parts(151_000_u64, 0).saturating_mul(c as u64)) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } fn note_author() -> Weight { - Weight::from_parts(71_461_000 as u64, 0) - .saturating_add(T::DbWeight::get().reads(3 as u64)) - .saturating_add(T::DbWeight::get().writes(4 as u64)) + Weight::from_parts(71_461_000_u64, 0) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } fn new_session(r: u32, c: u32) -> Weight { - Weight::from_parts(0 as u64, 0) + Weight::from_parts(0_u64, 0) // Standard Error: 1_010_000 - .saturating_add(Weight::from_parts(109_961_000 as u64, 0).saturating_mul(r as u64)) + .saturating_add(Weight::from_parts(109_961_000_u64, 0).saturating_mul(r as u64)) // Standard Error: 1_010_000 - .saturating_add(Weight::from_parts(151_952_000 as u64, 0).saturating_mul(c as u64)) - .saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(r as u64))) - .saturating_add(T::DbWeight::get().reads((2 as u64).saturating_mul(c as u64))) - .saturating_add(T::DbWeight::get().writes((2 as u64).saturating_mul(r as u64))) - .saturating_add(T::DbWeight::get().writes((2 as u64).saturating_mul(c as u64))) + .saturating_add(Weight::from_parts(151_952_000_u64, 0).saturating_mul(c as u64)) + .saturating_add(T::DbWeight::get().reads(1_u64.saturating_mul(r as u64))) + .saturating_add(T::DbWeight::get().reads(2_u64.saturating_mul(c as u64))) + .saturating_add(T::DbWeight::get().writes(2_u64.saturating_mul(r as u64))) + .saturating_add(T::DbWeight::get().writes(2_u64.saturating_mul(c as u64))) } } // For backwards compatibility and tests impl WeightInfo for () { fn set_invulnerables(b: u32) -> Weight { - Weight::from_parts(18_563_000 as u64, 0) + Weight::from_parts(18_563_000_u64, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(68_000 as u64, 0).saturating_mul(b as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + .saturating_add(Weight::from_parts(68_000_u64, 0).saturating_mul(b as u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } fn set_desired_candidates() -> Weight { - Weight::from_parts(16_363_000 as u64, 0) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_parts(16_363_000_u64, 0).saturating_add(RocksDbWeight::get().writes(1_u64)) } fn set_candidacy_bond() -> Weight { - Weight::from_parts(16_840_000 as u64, 0) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_parts(16_840_000_u64, 0).saturating_add(RocksDbWeight::get().writes(1_u64)) } fn register_as_candidate(c: u32) -> Weight { - Weight::from_parts(71_196_000 as u64, 0) + Weight::from_parts(71_196_000_u64, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(198_000 as u64, 0).saturating_mul(c as u64)) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(2 as u64)) + .saturating_add(Weight::from_parts(198_000_u64, 0).saturating_mul(c as u64)) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } fn leave_intent(c: u32) -> Weight { - Weight::from_parts(55_336_000 as u64, 0) + Weight::from_parts(55_336_000_u64, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(151_000 as u64, 0).saturating_mul(c as u64)) - .saturating_add(RocksDbWeight::get().reads(1 as u64)) - .saturating_add(RocksDbWeight::get().writes(2 as u64)) + .saturating_add(Weight::from_parts(151_000_u64, 0).saturating_mul(c as u64)) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } fn note_author() -> Weight { - Weight::from_parts(71_461_000 as u64, 0) - .saturating_add(RocksDbWeight::get().reads(3 as u64)) - .saturating_add(RocksDbWeight::get().writes(4 as u64)) + Weight::from_parts(71_461_000_u64, 0) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } fn new_session(r: u32, c: u32) -> Weight { - Weight::from_parts(0 as u64, 0) + Weight::from_parts(0_u64, 0) // Standard Error: 1_010_000 - .saturating_add(Weight::from_parts(109_961_000 as u64, 0).saturating_mul(r as u64)) + .saturating_add(Weight::from_parts(109_961_000_u64, 0).saturating_mul(r as u64)) // Standard Error: 1_010_000 - .saturating_add(Weight::from_parts(151_952_000 as u64, 0).saturating_mul(c as u64)) - .saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(r as u64))) - .saturating_add(RocksDbWeight::get().reads((2 as u64).saturating_mul(c as u64))) - .saturating_add(RocksDbWeight::get().writes((2 as u64).saturating_mul(r as u64))) - .saturating_add(RocksDbWeight::get().writes((2 as u64).saturating_mul(c as u64))) + .saturating_add(Weight::from_parts(151_952_000_u64, 0).saturating_mul(c as u64)) + .saturating_add(RocksDbWeight::get().reads(1_u64.saturating_mul(r as u64))) + .saturating_add(RocksDbWeight::get().reads(2_u64.saturating_mul(c as u64))) + .saturating_add(RocksDbWeight::get().writes(2_u64.saturating_mul(r as u64))) + .saturating_add(RocksDbWeight::get().writes(2_u64.saturating_mul(c as u64))) } } diff --git a/pallets/dmp-queue/src/lib.rs b/pallets/dmp-queue/src/lib.rs index 3b0d54c7bdb..082fceaf14c 100644 --- a/pallets/dmp-queue/src/lib.rs +++ b/pallets/dmp-queue/src/lib.rs @@ -766,19 +766,19 @@ mod tests { new_test_ext().execute_with(|| { let enqueued = vec![msg(1000), msg(1001)]; enqueue(&enqueued); - let weight_used = handle_messages(&vec![msg(1002)], Weight::from_parts(1500, 1500)); + let weight_used = handle_messages(&[msg(1002)], Weight::from_parts(1500, 1500)); assert_eq!(weight_used, Weight::from_parts(1000, 1000)); assert_eq!(take_trace(), vec![msg_complete(1000), msg_limit_reached(1001),]); assert_eq!(pages_queued(), 2); assert_eq!(PageIndex::::get().begin_used, 0); - let weight_used = handle_messages(&vec![msg(1003)], Weight::from_parts(1500, 1500)); + let weight_used = handle_messages(&[msg(1003)], Weight::from_parts(1500, 1500)); assert_eq!(weight_used, Weight::from_parts(1001, 1001)); assert_eq!(take_trace(), vec![msg_complete(1001), msg_limit_reached(1002),]); assert_eq!(pages_queued(), 2); assert_eq!(PageIndex::::get().begin_used, 1); - let weight_used = handle_messages(&vec![msg(1004)], Weight::from_parts(1500, 1500)); + let weight_used = handle_messages(&[msg(1004)], Weight::from_parts(1500, 1500)); assert_eq!(weight_used, Weight::from_parts(1002, 1002)); assert_eq!(take_trace(), vec![msg_complete(1002), msg_limit_reached(1003),]); assert_eq!(pages_queued(), 2); @@ -877,9 +877,9 @@ mod tests { #[test] fn on_idle_should_service_queue() { new_test_ext().execute_with(|| { - enqueue(&vec![msg(1000), msg(1001)]); - enqueue(&vec![msg(1002), msg(1003)]); - enqueue(&vec![msg(1004), msg(1005)]); + enqueue(&[msg(1000), msg(1001)]); + enqueue(&[msg(1002), msg(1003)]); + enqueue(&[msg(1004), msg(1005)]); let weight_used = DmpQueue::on_idle(1, Weight::from_parts(6000, 6000)); assert_eq!(weight_used, Weight::from_parts(5010, 5010)); @@ -901,20 +901,17 @@ mod tests { #[test] fn handle_max_messages_per_block() { new_test_ext().execute_with(|| { - enqueue(&vec![msg(1000), msg(1001)]); - enqueue(&vec![msg(1002), msg(1003)]); - enqueue(&vec![msg(1004), msg(1005)]); - - let incoming = (0..MAX_MESSAGES_PER_BLOCK) - .into_iter() - .map(|i| msg(1006 + i as u64)) - .collect::>(); + enqueue(&[msg(1000), msg(1001)]); + enqueue(&[msg(1002), msg(1003)]); + enqueue(&[msg(1004), msg(1005)]); + + let incoming = + (0..MAX_MESSAGES_PER_BLOCK).map(|i| msg(1006 + i as u64)).collect::>(); handle_messages(&incoming, Weight::from_parts(25000, 25000)); assert_eq!( take_trace(), (0..MAX_MESSAGES_PER_BLOCK) - .into_iter() .map(|i| msg_complete(1000 + i as u64)) .collect::>(), ); @@ -924,7 +921,6 @@ mod tests { assert_eq!( take_trace(), (MAX_MESSAGES_PER_BLOCK..MAX_MESSAGES_PER_BLOCK + 6) - .into_iter() .map(|i| msg_complete(1000 + i as u64)) .collect::>(), ); diff --git a/pallets/dmp-queue/src/migration.rs b/pallets/dmp-queue/src/migration.rs index b360f5a7bd4..5e1d357e142 100644 --- a/pallets/dmp-queue/src/migration.rs +++ b/pallets/dmp-queue/src/migration.rs @@ -74,7 +74,7 @@ pub fn migrate_to_v1() -> Weight { } }; - if let Err(_) = Configuration::::translate(|pre| pre.map(translate)) { + if Configuration::::translate(|pre| pre.map(translate)).is_err() { log::error!( target: "dmp_queue", "unexpected error when performing translation of the QueueConfig type during storage upgrade to v2" diff --git a/pallets/parachain-system/src/lib.rs b/pallets/parachain-system/src/lib.rs index 4025368904b..36ef8d57195 100644 --- a/pallets/parachain-system/src/lib.rs +++ b/pallets/parachain-system/src/lib.rs @@ -473,10 +473,7 @@ pub mod pallet { check_version: bool, ) -> DispatchResult { ensure_root(origin)?; - AuthorizedUpgrade::::put(CodeUpgradeAuthorization { - code_hash: code_hash.clone(), - check_version, - }); + AuthorizedUpgrade::::put(CodeUpgradeAuthorization { code_hash, check_version }); Self::deposit_event(Event::UpgradeAuthorized { code_hash }); Ok(()) @@ -753,7 +750,7 @@ impl Pallet { let authorization = AuthorizedUpgrade::::get().ok_or(Error::::NothingAuthorized)?; // ensure that the actual hash matches the authorized hash - let actual_hash = T::Hashing::hash(&code[..]); + let actual_hash = T::Hashing::hash(code); ensure!(actual_hash == authorization.code_hash, Error::::Unauthorized); // check versions if required as part of the authorization @@ -941,10 +938,10 @@ impl Pallet { // `running_mqc_heads`. Otherwise, in a block where no messages were sent in a channel // it won't get into next block's `last_mqc_heads` and thus will be all zeros, which // would corrupt the message queue chain. - for &(ref sender, ref channel) in ingress_channels { + for (sender, channel) in ingress_channels { let cur_head = running_mqc_heads .entry(sender) - .or_insert_with(|| last_mqc_heads.get(&sender).cloned().unwrap_or_default()) + .or_insert_with(|| last_mqc_heads.get(sender).cloned().unwrap_or_default()) .head(); let target_head = channel.mqc_head.unwrap_or_default(); @@ -1090,22 +1087,20 @@ impl Pallet { // may change so that the message is no longer valid. // // However, changing this setting is expected to be rare. - match Self::host_configuration() { - Some(cfg) => - if message.len() > cfg.max_upward_message_size as usize { - return Err(MessageSendError::TooBig) - }, - None => { - // This storage field should carry over from the previous block. So if it's None - // then it must be that this is an edge-case where a message is attempted to be - // sent at the first block. - // - // Let's pass this message through. I think it's not unreasonable to expect that - // the message is not huge and it comes through, but if it doesn't it can be - // returned back to the sender. - // - // Thus fall through here. - }, + if let Some(cfg) = Self::host_configuration() { + if message.len() > cfg.max_upward_message_size as usize { + return Err(MessageSendError::TooBig) + } + } else { + // This storage field should carry over from the previous block. So if it's None + // then it must be that this is an edge-case where a message is attempted to be + // sent at the first block. + // + // Let's pass this message through. I think it's not unreasonable to expect that + // the message is not huge and it comes through, but if it doesn't it can be + // returned back to the sender. + // + // Thus fall through here. }; >::append(message.clone()); diff --git a/pallets/parachain-system/src/tests.rs b/pallets/parachain-system/src/tests.rs index 70e4c106bf2..a4b1c275b7a 100755 --- a/pallets/parachain-system/src/tests.rs +++ b/pallets/parachain-system/src/tests.rs @@ -304,7 +304,7 @@ impl BlockTests { // begin initialization System::reset_events(); - System::initialize(&n, &Default::default(), &Default::default()); + System::initialize(n, &Default::default(), &Default::default()); // now mess with the storage the way validate_block does let mut sproof_builder = RelayStateSproofBuilder::default(); @@ -357,10 +357,8 @@ impl BlockTests { ParachainSystem::on_finalize(*n); // did block execution set new validation code? - if NewValidationCode::::exists() { - if self.pending_upgrade.is_some() { - panic!("attempted to set validation code while upgrade was pending"); - } + if NewValidationCode::::exists() && self.pending_upgrade.is_some() { + panic!("attempted to set validation code while upgrade was pending"); } // clean up @@ -404,7 +402,7 @@ fn events() { let events = System::events(); assert_eq!( events[0].event, - RuntimeEvent::ParachainSystem(crate::Event::ValidationFunctionStored.into()) + RuntimeEvent::ParachainSystem(crate::Event::ValidationFunctionStored) ); }, ) @@ -415,10 +413,9 @@ fn events() { let events = System::events(); assert_eq!( events[0].event, - RuntimeEvent::ParachainSystem( - crate::Event::ValidationFunctionApplied { relay_chain_block_num: 1234 } - .into() - ) + RuntimeEvent::ParachainSystem(crate::Event::ValidationFunctionApplied { + relay_chain_block_num: 1234 + }) ); }, ); @@ -491,7 +488,7 @@ fn aborted_upgrade() { let events = System::events(); assert_eq!( events[0].event, - RuntimeEvent::ParachainSystem(crate::Event::ValidationFunctionDiscarded.into()) + RuntimeEvent::ParachainSystem(crate::Event::ValidationFunctionDiscarded) ); }, ); diff --git a/pallets/parachain-system/src/validate_block/tests.rs b/pallets/parachain-system/src/validate_block/tests.rs index 2c39188a085..4801b62e7b5 100644 --- a/pallets/parachain-system/src/validate_block/tests.rs +++ b/pallets/parachain-system/src/validate_block/tests.rs @@ -41,7 +41,7 @@ fn call_validate_block_encoded_header( relay_parent_number: 1, relay_parent_storage_root, }, - &WASM_BINARY.expect("You need to build the WASM binaries to run the tests!"), + WASM_BINARY.expect("You need to build the WASM binaries to run the tests!"), ) .map(|v| v.head_data.0) } @@ -191,7 +191,7 @@ fn validate_block_invalid_parent_hash() { .unwrap_err(); } else { let output = Command::new(env::current_exe().unwrap()) - .args(&["validate_block_invalid_parent_hash", "--", "--nocapture"]) + .args(["validate_block_invalid_parent_hash", "--", "--nocapture"]) .env("RUN_TEST", "1") .output() .expect("Runs the test"); @@ -213,7 +213,7 @@ fn validate_block_fails_on_invalid_validation_data() { call_validate_block(parent_head, block, Hash::random()).unwrap_err(); } else { let output = Command::new(env::current_exe().unwrap()) - .args(&["validate_block_fails_on_invalid_validation_data", "--", "--nocapture"]) + .args(["validate_block_fails_on_invalid_validation_data", "--", "--nocapture"]) .env("RUN_TEST", "1") .output() .expect("Runs the test"); @@ -242,7 +242,7 @@ fn check_inherent_fails_on_validate_block_as_expected() { .unwrap_err(); } else { let output = Command::new(env::current_exe().unwrap()) - .args(&["check_inherent_fails_on_validate_block_as_expected", "--", "--nocapture"]) + .args(["check_inherent_fails_on_validate_block_as_expected", "--", "--nocapture"]) .env("RUN_TEST", "1") .output() .expect("Runs the test"); @@ -276,7 +276,7 @@ fn check_inherents_are_unsigned_and_before_all_other_extrinsics() { .unwrap_err(); } else { let output = Command::new(env::current_exe().unwrap()) - .args(&[ + .args([ "check_inherents_are_unsigned_and_before_all_other_extrinsics", "--", "--nocapture", diff --git a/pallets/xcmp-queue/src/lib.rs b/pallets/xcmp-queue/src/lib.rs index df2b78ebc20..0dc76aa80a1 100644 --- a/pallets/xcmp-queue/src/lib.rs +++ b/pallets/xcmp-queue/src/lib.rs @@ -538,7 +538,7 @@ impl Pallet { return false } s.extend_from_slice(&data[..]); - return true + true }); if appended { Ok((details.last_index - details.first_index - 1) as u32) diff --git a/pallets/xcmp-queue/src/migration.rs b/pallets/xcmp-queue/src/migration.rs index f6ece1da1a8..fd1301b9491 100644 --- a/pallets/xcmp-queue/src/migration.rs +++ b/pallets/xcmp-queue/src/migration.rs @@ -94,7 +94,7 @@ pub fn migrate_to_v2() -> Weight { } }; - if let Err(_) = QueueConfig::::translate(|pre| pre.map(translate)) { + if QueueConfig::::translate(|pre| pre.map(translate)).is_err() { log::error!( target: super::LOG_TARGET, "unexpected error when performing translation of the QueueConfig type during storage upgrade to v2" diff --git a/pallets/xcmp-queue/src/mock.rs b/pallets/xcmp-queue/src/mock.rs index 0d7d6eda00b..2e70e65392a 100644 --- a/pallets/xcmp-queue/src/mock.rs +++ b/pallets/xcmp-queue/src/mock.rs @@ -120,7 +120,7 @@ impl cumulus_pallet_parachain_system::Config for Test { parameter_types! { pub const RelayChain: MultiLocation = MultiLocation::parent(); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(1u32.into())).into(); + pub UniversalLocation: InteriorMultiLocation = X1(Parachain(1u32)); pub UnitWeightCost: Weight = Weight::from_parts(1_000_000, 1024); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; diff --git a/pallets/xcmp-queue/src/tests.rs b/pallets/xcmp-queue/src/tests.rs index 952a2758f30..ad0fa906da3 100644 --- a/pallets/xcmp-queue/src/tests.rs +++ b/pallets/xcmp-queue/src/tests.rs @@ -23,7 +23,7 @@ use sp_runtime::traits::BadOrigin; fn one_message_does_not_panic() { new_test_ext().execute_with(|| { let message_format = XcmpMessageFormat::ConcatenatedVersionedXcm.encode(); - let messages = vec![(Default::default(), 1u32.into(), message_format.as_slice())]; + let messages = vec![(Default::default(), 1u32, message_format.as_slice())]; // This shouldn't cause a panic XcmpQueue::handle_xcmp_messages(messages.into_iter(), Weight::MAX); @@ -128,7 +128,7 @@ fn suspend_xcm_execution_works() { .encode(); let mut message_format = XcmpMessageFormat::ConcatenatedVersionedXcm.encode(); message_format.extend(xcm.clone()); - let messages = vec![(ParaId::from(999), 1u32.into(), message_format.as_slice())]; + let messages = vec![(ParaId::from(999), 1u32, message_format.as_slice())]; // This should have executed the incoming XCM, because it came from a system parachain XcmpQueue::handle_xcmp_messages(messages.into_iter(), Weight::MAX); @@ -136,7 +136,7 @@ fn suspend_xcm_execution_works() { let queued_xcm = InboundXcmpMessages::::get(ParaId::from(999), 1u32); assert!(queued_xcm.is_empty()); - let messages = vec![(ParaId::from(2000), 1u32.into(), message_format.as_slice())]; + let messages = vec![(ParaId::from(2000), 1u32, message_format.as_slice())]; // This shouldn't have executed the incoming XCM XcmpQueue::handle_xcmp_messages(messages.into_iter(), Weight::MAX); @@ -294,7 +294,7 @@ fn xcmp_queue_does_not_consume_dest_or_msg_on_not_applicable() { // XcmpQueue - check dest is really not applicable let dest = (Parent, Parent, Parent); - let mut dest_wrapper = Some(dest.clone().into()); + let mut dest_wrapper = Some(dest.into()); let mut msg_wrapper = Some(message.clone()); assert_eq!( Err(SendError::NotApplicable), @@ -302,7 +302,7 @@ fn xcmp_queue_does_not_consume_dest_or_msg_on_not_applicable() { ); // check wrapper were not consumed - assert_eq!(Some(dest.clone().into()), dest_wrapper.take()); + assert_eq!(Some(dest.into()), dest_wrapper.take()); assert_eq!(Some(message.clone()), msg_wrapper.take()); // another try with router chain with asserting sender @@ -322,7 +322,7 @@ fn xcmp_queue_consumes_dest_and_msg_on_ok_validate() { // XcmpQueue - check dest/msg is valid let dest = (Parent, X1(Parachain(5555))); - let mut dest_wrapper = Some(dest.clone().into()); + let mut dest_wrapper = Some(dest.into()); let mut msg_wrapper = Some(message.clone()); assert!(::validate(&mut dest_wrapper, &mut msg_wrapper).is_ok()); diff --git a/pallets/xcmp-queue/src/weights.rs b/pallets/xcmp-queue/src/weights.rs index b275982b003..cbb29ac3ae3 100644 --- a/pallets/xcmp-queue/src/weights.rs +++ b/pallets/xcmp-queue/src/weights.rs @@ -18,31 +18,31 @@ pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { // Storage: XcmpQueue QueueConfig (r:1 w:1) fn set_config_with_u32() -> Weight { - Weight::from_parts(2_717_000 as u64, 0) - .saturating_add(T::DbWeight::get().reads(1 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_parts(2_717_000_u64, 0) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: XcmpQueue QueueConfig (r:1 w:1) fn set_config_with_weight() -> Weight { - Weight::from_parts(2_717_000 as u64, 0) - .saturating_add(T::DbWeight::get().reads(1 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_parts(2_717_000_u64, 0) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } } impl WeightInfo for () { // Storage: XcmpQueue QueueConfig (r:1 w:1) fn set_config_with_u32() -> Weight { - Weight::from_parts(2_717_000 as u64, 0) - .saturating_add(RocksDbWeight::get().reads(1 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_parts(2_717_000_u64, 0) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: XcmpQueue QueueConfig (r:1 w:1) fn set_config_with_weight() -> Weight { - Weight::from_parts(2_717_000 as u64, 0) - .saturating_add(RocksDbWeight::get().reads(1 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_parts(2_717_000_u64, 0) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/parachain-template/node/src/command.rs b/parachain-template/node/src/command.rs index 20ac62ec4a5..c3e79ebe387 100644 --- a/parachain-template/node/src/command.rs +++ b/parachain-template/node/src/command.rs @@ -268,13 +268,13 @@ pub fn run() -> Result<()> { runner.run_node_until_exit(|config| async move { let hwbench = (!cli.no_hardware_benchmarks).then_some( config.database.path().map(|database_path| { - let _ = std::fs::create_dir_all(&database_path); + let _ = std::fs::create_dir_all(database_path); sc_sysinfo::gather_hwbench(Some(database_path)) })).flatten(); let para_id = chain_spec::Extensions::try_get(&*config.chain_spec) .map(|e| e.para_id) - .ok_or_else(|| "Could not find parachain ID in chain-spec.")?; + .ok_or("Could not find parachain ID in chain-spec.")?; let polkadot_cli = RelayChainCli::new( &config, @@ -301,7 +301,7 @@ pub fn run() -> Result<()> { info!("Parachain genesis state: {}", genesis_state); info!("Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); - if !collator_options.relay_chain_rpc_urls.is_empty() && cli.relay_chain_args.len() > 0 { + if !collator_options.relay_chain_rpc_urls.is_empty() && !cli.relay_chain_args.is_empty() { warn!("Detected relay chain node arguments together with --relay-chain-rpc-url. This command starts a minimal Polkadot node that only uses a network-related subset of all relay chain CLI options."); } diff --git a/parachain-template/runtime/src/lib.rs b/parachain-template/runtime/src/lib.rs index 61839e0a621..3c24b39d64d 100644 --- a/parachain-template/runtime/src/lib.rs +++ b/parachain-template/runtime/src/lib.rs @@ -686,13 +686,13 @@ impl_runtime_apis! { list_benchmarks!(list, extra); let storage_info = AllPalletsWithSystem::storage_info(); - return (list, storage_info) + (list, storage_info) } fn dispatch_benchmark( config: frame_benchmarking::BenchmarkConfig ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, TrackedStorageKey}; + use frame_benchmarking::{Benchmarking, BenchmarkBatch}; use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime {} diff --git a/parachains/common/src/impls.rs b/parachains/common/src/impls.rs index cc89a248e2e..d9998755212 100644 --- a/parachains/common/src/impls.rs +++ b/parachains/common/src/impls.rs @@ -278,7 +278,6 @@ mod tests { } let asset_location = SomeSiblingParachain::get() - .clone() .pushed_with_interior(GeneralIndex(42)) .expect("multilocation will only have 2 junctions; qed"); let asset = MultiAsset { id: Concrete(asset_location), fun: 1_000_000u128.into() }; diff --git a/parachains/pallets/parachain-info/src/lib.rs b/parachains/pallets/parachain-info/src/lib.rs index d61387aaeb6..93ef5bfcfeb 100644 --- a/parachains/pallets/parachain-info/src/lib.rs +++ b/parachains/pallets/parachain-info/src/lib.rs @@ -53,7 +53,7 @@ pub mod pallet { #[pallet::genesis_build] impl GenesisBuild for GenesisConfig { fn build(&self) { - >::put(&self.parachain_id); + >::put(self.parachain_id); } } diff --git a/parachains/runtimes/assets/common/src/foreign_creators.rs b/parachains/runtimes/assets/common/src/foreign_creators.rs index 3d7567409f6..dbdf4301d66 100644 --- a/parachains/runtimes/assets/common/src/foreign_creators.rs +++ b/parachains/runtimes/assets/common/src/foreign_creators.rs @@ -43,7 +43,7 @@ where asset_location: &MultiLocation, ) -> sp_std::result::Result { let origin_location = EnsureXcm::::try_origin(origin.clone())?; - if !IsForeign::contains(&asset_location, &origin_location) { + if !IsForeign::contains(asset_location, &origin_location) { return Err(origin) } AccountOf::convert(origin_location).map_err(|_| origin) @@ -51,6 +51,6 @@ where #[cfg(feature = "runtime-benchmarks")] fn try_successful_origin(a: &MultiLocation) -> Result { - Ok(pallet_xcm::Origin::Xcm(a.clone()).into()) + Ok(pallet_xcm::Origin::Xcm(*a).into()) } } diff --git a/parachains/runtimes/assets/common/src/matching.rs b/parachains/runtimes/assets/common/src/matching.rs index a5e030412b9..964f25cda35 100644 --- a/parachains/runtimes/assets/common/src/matching.rs +++ b/parachains/runtimes/assets/common/src/matching.rs @@ -42,10 +42,7 @@ impl> Contains for StartsWithExplicitGlobalConsensus { fn contains(t: &MultiLocation) -> bool { - match t.interior.global_consensus() { - Ok(requested_network) if requested_network.eq(&Network::get()) => true, - _ => false, - } + matches!(t.interior.global_consensus(), Ok(requested_network) if requested_network.eq(&Network::get())) } } @@ -61,7 +58,7 @@ impl> ContainsPair bool { log::trace!(target: "xcm::contains", "IsForeignConcreteAsset asset: {:?}, origin: {:?}", asset, origin); - matches!(asset.id, Concrete(ref id) if IsForeign::contains(id, &origin)) + matches!(asset.id, Concrete(ref id) if IsForeign::contains(id, origin)) } } @@ -73,18 +70,14 @@ impl> ContainsPair { fn contains(&a: &MultiLocation, b: &MultiLocation) -> bool { // `a` needs to be from `b` at least - if !a.starts_with(&b) { + if !a.starts_with(b) { return false } // here we check if sibling match a { - MultiLocation { parents: 1, interior } => match interior.first() { - Some(Parachain(sibling_para_id)) - if sibling_para_id.ne(&u32::from(SelfParaId::get())) => - true, - _ => false, - }, + MultiLocation { parents: 1, interior } => + matches!(interior.first(), Some(Parachain(sibling_para_id)) if sibling_para_id.ne(&u32::from(SelfParaId::get()))), _ => false, } } diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 961a9300a56..eacd865200b 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -213,7 +213,7 @@ impl pallet_balances::Config for Runtime { parameter_types! { /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 1 * MILLICENTS; + pub const TransactionByteFee: Balance = MILLICENTS; } impl pallet_transaction_payment::Config for Runtime { @@ -1026,7 +1026,7 @@ impl_runtime_apis! { list_benchmarks!(list, extra); let storage_info = AllPalletsWithSystem::storage_info(); - return (list, storage_info) + (list, storage_info) } fn dispatch_benchmark( @@ -1062,7 +1062,6 @@ impl_runtime_apis! { id: Concrete(GeneralIndex(i as u128).into()), fun: Fungible(fungibles_amount * i as u128), } - .into() }) .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) .chain((0..holding_non_fungibles).map(|i| MultiAsset { @@ -1082,7 +1081,7 @@ impl_runtime_apis! { parameter_types! { pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( KsmLocation::get(), - MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(KsmLocation::get()) }, + MultiAsset { fun: Fungible(UNITS), id: Concrete(KsmLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; @@ -1097,7 +1096,7 @@ impl_runtime_apis! { fn get_multi_asset() -> MultiAsset { MultiAsset { id: Concrete(KsmLocation::get()), - fun: Fungible(1 * UNITS), + fun: Fungible(UNITS), } } } @@ -1201,7 +1200,7 @@ cumulus_pallet_parachain_system::register_validate_block! { #[cfg(feature = "state-trie-version-1")] parameter_types! { // The deposit configuration for the singed migration. Specially if you want to allow any signed account to do the migration (see `SignedFilter`, these deposits should be high) - pub const MigrationSignedDepositPerItem: Balance = 1 * CENTS; + pub const MigrationSignedDepositPerItem: Balance = CENTS; pub const MigrationSignedDepositBase: Balance = 2_000 * CENTS; pub const MigrationMaxKeyLen: u32 = 512; } diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs index 877a54ba848..23322418d2a 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs @@ -33,8 +33,7 @@ const MAX_ASSETS: u64 = 100; impl WeighMultiAssets for MultiAssetFilter { fn weigh_multi_assets(&self, weight: Weight) -> Weight { match self { - Self::Definite(assets) => - weight.saturating_mul(assets.inner().into_iter().count() as u64), + Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { All => weight.saturating_mul(MAX_ASSETS), AllOf { fun, .. } => match fun { @@ -53,7 +52,7 @@ impl WeighMultiAssets for MultiAssetFilter { impl WeighMultiAssets for MultiAssets { fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().into_iter().count() as u64) + weight.saturating_mul(self.inner().iter().count() as u64) } } @@ -65,7 +64,7 @@ impl XcmWeightInfo for StatemineXcmWeight { // Currently there is no trusted reserve fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - Weight::from_parts(1_000_000_000 as u64, 0) + Weight::from_parts(1_000_000_000_u64, 0) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) @@ -123,7 +122,7 @@ impl XcmWeightInfo for StatemineXcmWeight { fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000 as u64, 0); + let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); hardcoded_weight.min(weight) } diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index eb99e2fb709..ac830e76408 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -197,151 +197,146 @@ impl Contains for SafeCallFilter { } } - match call { + matches!( + call, RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | - RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, - ) | - RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | - RuntimeCall::Assets( + RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection( + pallet_collator_selection::Call::set_desired_candidates { .. } | + pallet_collator_selection::Call::set_candidacy_bond { .. } | + pallet_collator_selection::Call::register_as_candidate { .. } | + pallet_collator_selection::Call::leave_intent { .. }, + ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::XcmpQueue(..) | + RuntimeCall::DmpQueue(..) | + RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | + RuntimeCall::Assets( + pallet_assets::Call::create { .. } | + pallet_assets::Call::force_create { .. } | + pallet_assets::Call::start_destroy { .. } | + pallet_assets::Call::destroy_accounts { .. } | + pallet_assets::Call::destroy_approvals { .. } | + pallet_assets::Call::finish_destroy { .. } | + pallet_assets::Call::mint { .. } | + pallet_assets::Call::burn { .. } | + pallet_assets::Call::transfer { .. } | + pallet_assets::Call::transfer_keep_alive { .. } | + pallet_assets::Call::force_transfer { .. } | + pallet_assets::Call::freeze { .. } | + pallet_assets::Call::thaw { .. } | + pallet_assets::Call::freeze_asset { .. } | + pallet_assets::Call::thaw_asset { .. } | + pallet_assets::Call::transfer_ownership { .. } | + pallet_assets::Call::set_team { .. } | + pallet_assets::Call::clear_metadata { .. } | + pallet_assets::Call::force_clear_metadata { .. } | + pallet_assets::Call::force_asset_status { .. } | + pallet_assets::Call::approve_transfer { .. } | + pallet_assets::Call::cancel_approval { .. } | + pallet_assets::Call::force_cancel_approval { .. } | + pallet_assets::Call::transfer_approved { .. } | + pallet_assets::Call::touch { .. } | + pallet_assets::Call::refund { .. }, + ) | RuntimeCall::ForeignAssets( pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::refund { .. }, - ) | - RuntimeCall::ForeignAssets( - pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::set_metadata { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::refund { .. }, - ) | - RuntimeCall::Nfts( + pallet_assets::Call::force_create { .. } | + pallet_assets::Call::start_destroy { .. } | + pallet_assets::Call::destroy_accounts { .. } | + pallet_assets::Call::destroy_approvals { .. } | + pallet_assets::Call::finish_destroy { .. } | + pallet_assets::Call::mint { .. } | + pallet_assets::Call::burn { .. } | + pallet_assets::Call::transfer { .. } | + pallet_assets::Call::transfer_keep_alive { .. } | + pallet_assets::Call::force_transfer { .. } | + pallet_assets::Call::freeze { .. } | + pallet_assets::Call::thaw { .. } | + pallet_assets::Call::freeze_asset { .. } | + pallet_assets::Call::thaw_asset { .. } | + pallet_assets::Call::transfer_ownership { .. } | + pallet_assets::Call::set_team { .. } | + pallet_assets::Call::set_metadata { .. } | + pallet_assets::Call::clear_metadata { .. } | + pallet_assets::Call::force_clear_metadata { .. } | + pallet_assets::Call::force_asset_status { .. } | + pallet_assets::Call::approve_transfer { .. } | + pallet_assets::Call::cancel_approval { .. } | + pallet_assets::Call::force_cancel_approval { .. } | + pallet_assets::Call::transfer_approved { .. } | + pallet_assets::Call::touch { .. } | + pallet_assets::Call::refund { .. }, + ) | RuntimeCall::Nfts( pallet_nfts::Call::create { .. } | - pallet_nfts::Call::force_create { .. } | - pallet_nfts::Call::destroy { .. } | - pallet_nfts::Call::mint { .. } | - pallet_nfts::Call::force_mint { .. } | - pallet_nfts::Call::burn { .. } | - pallet_nfts::Call::transfer { .. } | - pallet_nfts::Call::lock_item_transfer { .. } | - pallet_nfts::Call::unlock_item_transfer { .. } | - pallet_nfts::Call::lock_collection { .. } | - pallet_nfts::Call::transfer_ownership { .. } | - pallet_nfts::Call::set_team { .. } | - pallet_nfts::Call::force_collection_owner { .. } | - pallet_nfts::Call::force_collection_config { .. } | - pallet_nfts::Call::approve_transfer { .. } | - pallet_nfts::Call::cancel_approval { .. } | - pallet_nfts::Call::clear_all_transfer_approvals { .. } | - pallet_nfts::Call::lock_item_properties { .. } | - pallet_nfts::Call::set_attribute { .. } | - pallet_nfts::Call::force_set_attribute { .. } | - pallet_nfts::Call::clear_attribute { .. } | - pallet_nfts::Call::approve_item_attributes { .. } | - pallet_nfts::Call::cancel_item_attributes_approval { .. } | - pallet_nfts::Call::set_metadata { .. } | - pallet_nfts::Call::clear_metadata { .. } | - pallet_nfts::Call::set_collection_metadata { .. } | - pallet_nfts::Call::clear_collection_metadata { .. } | - pallet_nfts::Call::set_accept_ownership { .. } | - pallet_nfts::Call::set_collection_max_supply { .. } | - pallet_nfts::Call::update_mint_settings { .. } | - pallet_nfts::Call::set_price { .. } | - pallet_nfts::Call::buy_item { .. } | - pallet_nfts::Call::pay_tips { .. } | - pallet_nfts::Call::create_swap { .. } | - pallet_nfts::Call::cancel_swap { .. } | - pallet_nfts::Call::claim_swap { .. }, - ) | - RuntimeCall::Uniques( + pallet_nfts::Call::force_create { .. } | + pallet_nfts::Call::destroy { .. } | + pallet_nfts::Call::mint { .. } | + pallet_nfts::Call::force_mint { .. } | + pallet_nfts::Call::burn { .. } | + pallet_nfts::Call::transfer { .. } | + pallet_nfts::Call::lock_item_transfer { .. } | + pallet_nfts::Call::unlock_item_transfer { .. } | + pallet_nfts::Call::lock_collection { .. } | + pallet_nfts::Call::transfer_ownership { .. } | + pallet_nfts::Call::set_team { .. } | + pallet_nfts::Call::force_collection_owner { .. } | + pallet_nfts::Call::force_collection_config { .. } | + pallet_nfts::Call::approve_transfer { .. } | + pallet_nfts::Call::cancel_approval { .. } | + pallet_nfts::Call::clear_all_transfer_approvals { .. } | + pallet_nfts::Call::lock_item_properties { .. } | + pallet_nfts::Call::set_attribute { .. } | + pallet_nfts::Call::force_set_attribute { .. } | + pallet_nfts::Call::clear_attribute { .. } | + pallet_nfts::Call::approve_item_attributes { .. } | + pallet_nfts::Call::cancel_item_attributes_approval { .. } | + pallet_nfts::Call::set_metadata { .. } | + pallet_nfts::Call::clear_metadata { .. } | + pallet_nfts::Call::set_collection_metadata { .. } | + pallet_nfts::Call::clear_collection_metadata { .. } | + pallet_nfts::Call::set_accept_ownership { .. } | + pallet_nfts::Call::set_collection_max_supply { .. } | + pallet_nfts::Call::update_mint_settings { .. } | + pallet_nfts::Call::set_price { .. } | + pallet_nfts::Call::buy_item { .. } | + pallet_nfts::Call::pay_tips { .. } | + pallet_nfts::Call::create_swap { .. } | + pallet_nfts::Call::cancel_swap { .. } | + pallet_nfts::Call::claim_swap { .. }, + ) | RuntimeCall::Uniques( pallet_uniques::Call::create { .. } | - pallet_uniques::Call::force_create { .. } | - pallet_uniques::Call::destroy { .. } | - pallet_uniques::Call::mint { .. } | - pallet_uniques::Call::burn { .. } | - pallet_uniques::Call::transfer { .. } | - pallet_uniques::Call::freeze { .. } | - pallet_uniques::Call::thaw { .. } | - pallet_uniques::Call::freeze_collection { .. } | - pallet_uniques::Call::thaw_collection { .. } | - pallet_uniques::Call::transfer_ownership { .. } | - pallet_uniques::Call::set_team { .. } | - pallet_uniques::Call::approve_transfer { .. } | - pallet_uniques::Call::cancel_approval { .. } | - pallet_uniques::Call::force_item_status { .. } | - pallet_uniques::Call::set_attribute { .. } | - pallet_uniques::Call::clear_attribute { .. } | - pallet_uniques::Call::set_metadata { .. } | - pallet_uniques::Call::clear_metadata { .. } | - pallet_uniques::Call::set_collection_metadata { .. } | - pallet_uniques::Call::clear_collection_metadata { .. } | - pallet_uniques::Call::set_accept_ownership { .. } | - pallet_uniques::Call::set_collection_max_supply { .. } | - pallet_uniques::Call::set_price { .. } | - pallet_uniques::Call::buy_item { .. }, - ) => true, - _ => false, - } + pallet_uniques::Call::force_create { .. } | + pallet_uniques::Call::destroy { .. } | + pallet_uniques::Call::mint { .. } | + pallet_uniques::Call::burn { .. } | + pallet_uniques::Call::transfer { .. } | + pallet_uniques::Call::freeze { .. } | + pallet_uniques::Call::thaw { .. } | + pallet_uniques::Call::freeze_collection { .. } | + pallet_uniques::Call::thaw_collection { .. } | + pallet_uniques::Call::transfer_ownership { .. } | + pallet_uniques::Call::set_team { .. } | + pallet_uniques::Call::approve_transfer { .. } | + pallet_uniques::Call::cancel_approval { .. } | + pallet_uniques::Call::force_item_status { .. } | + pallet_uniques::Call::set_attribute { .. } | + pallet_uniques::Call::clear_attribute { .. } | + pallet_uniques::Call::set_metadata { .. } | + pallet_uniques::Call::clear_metadata { .. } | + pallet_uniques::Call::set_collection_metadata { .. } | + pallet_uniques::Call::clear_collection_metadata { .. } | + pallet_uniques::Call::set_accept_ownership { .. } | + pallet_uniques::Call::set_collection_max_supply { .. } | + pallet_uniques::Call::set_price { .. } | + pallet_uniques::Call::buy_item { .. } + ) + ) } } diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index b9001a35a99..57cd502857c 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -77,19 +77,16 @@ fn test_asset_xcm_trader() { // Lets pay with: asset_amount_needed + asset_amount_extra let asset_amount_extra = 100_u128; let asset: MultiAsset = - (asset_multilocation.clone(), asset_amount_needed + asset_amount_extra).into(); + (asset_multilocation, asset_amount_needed + asset_amount_extra).into(); let mut trader = ::Trader::new(); // Lets buy_weight and make sure buy_weight does not return an error - match trader.buy_weight(bought, asset.into()) { - Ok(unused_assets) => { - // Check whether a correct amount of unused assets is returned - assert_ok!(unused_assets - .ensure_contains(&(asset_multilocation, asset_amount_extra).into())); - }, - Err(e) => assert!(false, "Expected Ok(_). Got {:#?}", e), - } + let unused_assets = trader.buy_weight(bought, asset.into()).expect("Expected Ok"); + // Check whether a correct amount of unused assets is returned + assert_ok!( + unused_assets.ensure_contains(&(asset_multilocation, asset_amount_extra).into()) + ); // Drop trader drop(trader); @@ -150,7 +147,7 @@ fn test_asset_xcm_trader_with_refund() { // lets calculate amount needed let amount_bought = WeightToFee::weight_to_fee(&bought); - let asset: MultiAsset = (asset_multilocation.clone(), amount_bought).into(); + let asset: MultiAsset = (asset_multilocation, amount_bought).into(); // Make sure buy_weight does not return an error assert_ok!(trader.buy_weight(bought, asset.clone().into())); @@ -224,7 +221,7 @@ fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { "we are testing what happens when the amount does not exceed ED" ); - let asset: MultiAsset = (asset_multilocation.clone(), amount_bought).into(); + let asset: MultiAsset = (asset_multilocation, amount_bought).into(); // Buy weight should return an error assert_noop!(trader.buy_weight(bought, asset.into()), XcmError::TooExpensive); @@ -277,11 +274,11 @@ fn test_that_buying_ed_refund_does_not_refund() { // We know we will have to buy at least ED, so lets make sure first it will // fail with a payment of less than ED - let asset: MultiAsset = (asset_multilocation.clone(), amount_bought).into(); + let asset: MultiAsset = (asset_multilocation, amount_bought).into(); assert_noop!(trader.buy_weight(bought, asset.into()), XcmError::TooExpensive); // Now lets buy ED at least - let asset: MultiAsset = (asset_multilocation.clone(), ExistentialDeposit::get()).into(); + let asset: MultiAsset = (asset_multilocation, ExistentialDeposit::get()).into(); // Buy weight should work assert_ok!(trader.buy_weight(bought, asset.into())); @@ -416,7 +413,7 @@ fn test_assets_balances_api_works() { let foreign_asset_minimum_asset_balance = 3333333_u128; assert_ok!(ForeignAssets::force_create( RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation.clone().into(), + foreign_asset_id_multilocation, AccountId::from(SOME_ASSET_ADMIN).into(), false, foreign_asset_minimum_asset_balance @@ -425,7 +422,7 @@ fn test_assets_balances_api_works() { // We first mint enough asset for the account to exist for assets assert_ok!(ForeignAssets::mint( RuntimeHelper::::origin_of(AccountId::from(SOME_ASSET_ADMIN)), - foreign_asset_id_multilocation.clone().into(), + foreign_asset_id_multilocation, AccountId::from(ALICE).into(), 6 * foreign_asset_minimum_asset_balance )); diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index aa90ca7a157..b697a7902a7 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -223,7 +223,7 @@ impl pallet_balances::Config for Runtime { parameter_types! { /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 1 * MILLICENTS; + pub const TransactionByteFee: Balance = MILLICENTS; } impl pallet_transaction_payment::Config for Runtime { @@ -925,7 +925,7 @@ impl_runtime_apis! { list_benchmarks!(list, extra); let storage_info = AllPalletsWithSystem::storage_info(); - return (list, storage_info) + (list, storage_info) } fn dispatch_benchmark( @@ -960,7 +960,6 @@ impl_runtime_apis! { id: Concrete(GeneralIndex(i as u128).into()), fun: Fungible(fungibles_amount * i as u128), } - .into() }) .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) .chain((0..holding_non_fungibles).map(|i| MultiAsset { @@ -980,7 +979,7 @@ impl_runtime_apis! { parameter_types! { pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( DotLocation::get(), - MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(DotLocation::get()) }, + MultiAsset { fun: Fungible(UNITS), id: Concrete(DotLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; } @@ -994,7 +993,7 @@ impl_runtime_apis! { fn get_multi_asset() -> MultiAsset { MultiAsset { id: Concrete(DotLocation::get()), - fun: Fungible(1 * UNITS), + fun: Fungible(UNITS), } } } diff --git a/parachains/runtimes/assets/statemint/src/weights/xcm/mod.rs b/parachains/runtimes/assets/statemint/src/weights/xcm/mod.rs index 1b4a2bcfdd7..768f2b152cd 100644 --- a/parachains/runtimes/assets/statemint/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/statemint/src/weights/xcm/mod.rs @@ -33,8 +33,7 @@ const MAX_ASSETS: u64 = 100; impl WeighMultiAssets for MultiAssetFilter { fn weigh_multi_assets(&self, weight: Weight) -> Weight { match self { - Self::Definite(assets) => - weight.saturating_mul(assets.inner().into_iter().count() as u64), + Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { All => weight.saturating_mul(MAX_ASSETS), AllOf { fun, .. } => match fun { @@ -53,7 +52,7 @@ impl WeighMultiAssets for MultiAssetFilter { impl WeighMultiAssets for MultiAssets { fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().into_iter().count() as u64) + weight.saturating_mul(self.inner().iter().count() as u64) } } @@ -65,7 +64,7 @@ impl XcmWeightInfo for StatemintXcmWeight { // Currently there is no trusted reserve fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - Weight::from_parts(1_000_000_000 as u64, 0) + Weight::from_parts(1_000_000_000_u64, 0) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) @@ -123,7 +122,7 @@ impl XcmWeightInfo for StatemintXcmWeight { fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000 as u64, 0); + let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); hardcoded_weight.min(weight) } diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index 19fb96c3027..c12631dd414 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -166,85 +166,82 @@ impl Contains for SafeCallFilter { } } - match call { + matches!( + call, RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | - RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. }, - ) | - RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | - RuntimeCall::Assets( - pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::refund { .. }, - ) | - RuntimeCall::Uniques( + RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection( + pallet_collator_selection::Call::set_desired_candidates { .. } | + pallet_collator_selection::Call::set_candidacy_bond { .. } | + pallet_collator_selection::Call::register_as_candidate { .. } | + pallet_collator_selection::Call::leave_intent { .. } | + pallet_collator_selection::Call::set_invulnerables { .. }, + ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::XcmpQueue(..) | + RuntimeCall::DmpQueue(..) | + RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | + RuntimeCall::Assets( + pallet_assets::Call::create { .. } | + pallet_assets::Call::force_create { .. } | + pallet_assets::Call::start_destroy { .. } | + pallet_assets::Call::destroy_accounts { .. } | + pallet_assets::Call::destroy_approvals { .. } | + pallet_assets::Call::finish_destroy { .. } | + pallet_assets::Call::mint { .. } | + pallet_assets::Call::burn { .. } | + pallet_assets::Call::transfer { .. } | + pallet_assets::Call::transfer_keep_alive { .. } | + pallet_assets::Call::force_transfer { .. } | + pallet_assets::Call::freeze { .. } | + pallet_assets::Call::thaw { .. } | + pallet_assets::Call::freeze_asset { .. } | + pallet_assets::Call::thaw_asset { .. } | + pallet_assets::Call::transfer_ownership { .. } | + pallet_assets::Call::set_team { .. } | + pallet_assets::Call::clear_metadata { .. } | + pallet_assets::Call::force_clear_metadata { .. } | + pallet_assets::Call::force_asset_status { .. } | + pallet_assets::Call::approve_transfer { .. } | + pallet_assets::Call::cancel_approval { .. } | + pallet_assets::Call::force_cancel_approval { .. } | + pallet_assets::Call::transfer_approved { .. } | + pallet_assets::Call::touch { .. } | + pallet_assets::Call::refund { .. }, + ) | RuntimeCall::Uniques( pallet_uniques::Call::create { .. } | - pallet_uniques::Call::force_create { .. } | - pallet_uniques::Call::destroy { .. } | - pallet_uniques::Call::mint { .. } | - pallet_uniques::Call::burn { .. } | - pallet_uniques::Call::transfer { .. } | - pallet_uniques::Call::freeze { .. } | - pallet_uniques::Call::thaw { .. } | - pallet_uniques::Call::freeze_collection { .. } | - pallet_uniques::Call::thaw_collection { .. } | - pallet_uniques::Call::transfer_ownership { .. } | - pallet_uniques::Call::set_team { .. } | - pallet_uniques::Call::approve_transfer { .. } | - pallet_uniques::Call::cancel_approval { .. } | - pallet_uniques::Call::force_item_status { .. } | - pallet_uniques::Call::set_attribute { .. } | - pallet_uniques::Call::clear_attribute { .. } | - pallet_uniques::Call::set_metadata { .. } | - pallet_uniques::Call::clear_metadata { .. } | - pallet_uniques::Call::set_collection_metadata { .. } | - pallet_uniques::Call::clear_collection_metadata { .. } | - pallet_uniques::Call::set_accept_ownership { .. } | - pallet_uniques::Call::set_collection_max_supply { .. } | - pallet_uniques::Call::set_price { .. } | - pallet_uniques::Call::buy_item { .. }, - ) => true, - _ => false, - } + pallet_uniques::Call::force_create { .. } | + pallet_uniques::Call::destroy { .. } | + pallet_uniques::Call::mint { .. } | + pallet_uniques::Call::burn { .. } | + pallet_uniques::Call::transfer { .. } | + pallet_uniques::Call::freeze { .. } | + pallet_uniques::Call::thaw { .. } | + pallet_uniques::Call::freeze_collection { .. } | + pallet_uniques::Call::thaw_collection { .. } | + pallet_uniques::Call::transfer_ownership { .. } | + pallet_uniques::Call::set_team { .. } | + pallet_uniques::Call::approve_transfer { .. } | + pallet_uniques::Call::cancel_approval { .. } | + pallet_uniques::Call::force_item_status { .. } | + pallet_uniques::Call::set_attribute { .. } | + pallet_uniques::Call::clear_attribute { .. } | + pallet_uniques::Call::set_metadata { .. } | + pallet_uniques::Call::clear_metadata { .. } | + pallet_uniques::Call::set_collection_metadata { .. } | + pallet_uniques::Call::clear_collection_metadata { .. } | + pallet_uniques::Call::set_accept_ownership { .. } | + pallet_uniques::Call::set_collection_max_supply { .. } | + pallet_uniques::Call::set_price { .. } | + pallet_uniques::Call::buy_item { .. }, + ) + ) } } diff --git a/parachains/runtimes/assets/statemint/tests/tests.rs b/parachains/runtimes/assets/statemint/tests/tests.rs index 7bbed6bb54a..87242682b15 100644 --- a/parachains/runtimes/assets/statemint/tests/tests.rs +++ b/parachains/runtimes/assets/statemint/tests/tests.rs @@ -80,19 +80,16 @@ fn test_asset_xcm_trader() { // Lets pay with: asset_amount_needed + asset_amount_extra let asset_amount_extra = 100_u128; let asset: MultiAsset = - (asset_multilocation.clone(), asset_amount_needed + asset_amount_extra).into(); + (asset_multilocation, asset_amount_needed + asset_amount_extra).into(); let mut trader = ::Trader::new(); // Lets buy_weight and make sure buy_weight does not return an error - match trader.buy_weight(bought, asset.into()) { - Ok(unused_assets) => { - // Check whether a correct amount of unused assets is returned - assert_ok!(unused_assets - .ensure_contains(&(asset_multilocation, asset_amount_extra).into())); - }, - Err(e) => assert!(false, "Expected Ok(_). Got {:#?}", e), - } + let unused_assets = trader.buy_weight(bought, asset.into()).expect("Expected Ok"); + // Check whether a correct amount of unused assets is returned + assert_ok!( + unused_assets.ensure_contains(&(asset_multilocation, asset_amount_extra).into()) + ); // Drop trader drop(trader); @@ -156,7 +153,7 @@ fn test_asset_xcm_trader_with_refund() { // lets calculate amount needed let amount_bought = WeightToFee::weight_to_fee(&bought); - let asset: MultiAsset = (asset_multilocation.clone(), amount_bought).into(); + let asset: MultiAsset = (asset_multilocation, amount_bought).into(); // Make sure buy_weight does not return an error assert_ok!(trader.buy_weight(bought, asset.clone().into())); @@ -233,7 +230,7 @@ fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { "we are testing what happens when the amount does not exceed ED" ); - let asset: MultiAsset = (asset_multilocation.clone(), amount_bought).into(); + let asset: MultiAsset = (asset_multilocation, amount_bought).into(); // Buy weight should return an error assert_noop!(trader.buy_weight(bought, asset.into()), XcmError::TooExpensive); @@ -286,11 +283,11 @@ fn test_that_buying_ed_refund_does_not_refund() { // We know we will have to buy at least ED, so lets make sure first it will // fail with a payment of less than ED - let asset: MultiAsset = (asset_multilocation.clone(), amount_bought).into(); + let asset: MultiAsset = (asset_multilocation, amount_bought).into(); assert_noop!(trader.buy_weight(bought, asset.into()), XcmError::TooExpensive); // Now lets buy ED at least - let asset: MultiAsset = (asset_multilocation.clone(), ExistentialDeposit::get()).into(); + let asset: MultiAsset = (asset_multilocation, ExistentialDeposit::get()).into(); // Buy weight should work assert_ok!(trader.buy_weight(bought, asset.into())); diff --git a/parachains/runtimes/assets/test-utils/src/lib.rs b/parachains/runtimes/assets/test-utils/src/lib.rs index 1e0b31f18a3..4a67e661322 100644 --- a/parachains/runtimes/assets/test-utils/src/lib.rs +++ b/parachains/runtimes/assets/test-utils/src/lib.rs @@ -134,12 +134,12 @@ impl< .unwrap(); } - pallet_balances::GenesisConfig:: { balances: self.balances.into() } + pallet_balances::GenesisConfig:: { balances: self.balances } .assimilate_storage(&mut t) .unwrap(); pallet_collator_selection::GenesisConfig:: { - invulnerables: self.collators.clone().into(), + invulnerables: self.collators.clone(), candidacy_bond: Default::default(), desired_candidates: Default::default(), } @@ -303,11 +303,10 @@ impl RuntimeHelper .find_map(|e| match e { pallet_xcm::Event::Attempted(outcome) => Some(outcome), _ => None, - }); - match outcome { - Some(outcome) => assert_outcome(outcome), - None => assert!(false, "No `pallet_xcm::Event::Attempted(outcome)` event found!"), - } + }) + .expect("No `pallet_xcm::Event::Attempted(outcome)` event found!"); + + assert_outcome(outcome); } } @@ -362,8 +361,11 @@ pub fn mock_open_hrmp_channel< recipient: ParaId, ) { let n = 1_u32; - let mut sproof_builder = RelayStateSproofBuilder::default(); - sproof_builder.para_id = sender; + let mut sproof_builder = RelayStateSproofBuilder { + para_id: sender, + hrmp_egress_channel_index: Some(vec![recipient]), + ..Default::default() + }; sproof_builder.hrmp_channels.insert( HrmpChannelId { sender, recipient }, AbridgedHrmpChannel { @@ -375,7 +377,6 @@ pub fn mock_open_hrmp_channel< mqc_head: None, }, ); - sproof_builder.hrmp_egress_channel_index = Some(vec![recipient]); let (relay_parent_storage_root, relay_chain_state) = sproof_builder.into_state_root_and_proof(); let vfp = PersistedValidationData { @@ -388,7 +389,7 @@ pub fn mock_open_hrmp_channel< let inherent_data = { let mut inherent_data = InherentData::default(); let system_inherent_data = ParachainInherentData { - validation_data: vfp.clone(), + validation_data: vfp, relay_chain_state, downward_messages: Default::default(), horizontal_messages: Default::default(), diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 954ff0d7589..a599db82713 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -134,7 +134,7 @@ pub fn teleports_for_native_asset_works< BuyExecution { fees: MultiAsset { id: Concrete(native_asset_id), - fun: Fungible(buy_execution_fee_amount_eta.into()), + fun: Fungible(buy_execution_fee_amount_eta), }, weight_limit: Limited(Weight::from_parts(303531000, 65536)), }, @@ -190,7 +190,7 @@ pub fn teleports_for_native_asset_works< RuntimeHelper::::origin_of(target_account.clone()), dest, dest_beneficiary, - (native_asset_id, native_asset_to_teleport_away.clone().into()), + (native_asset_id, native_asset_to_teleport_away.into()), None, )); // check balances @@ -235,7 +235,7 @@ pub fn teleports_for_native_asset_works< RuntimeHelper::::origin_of(target_account.clone()), dest, dest_beneficiary, - (native_asset_id, native_asset_to_teleport_away.clone().into()), + (native_asset_id, native_asset_to_teleport_away.into()), Some((runtime_para_id, other_para_id)), )); @@ -366,7 +366,7 @@ pub fn teleports_for_foreign_assets_works< WeightToFee::weight_to_fee(&Weight::from_parts(90_000_000_000, 0)); let buy_execution_fee = MultiAsset { id: Concrete(MultiLocation::parent()), - fun: Fungible(buy_execution_fee_amount.into()), + fun: Fungible(buy_execution_fee_amount), }; let teleported_foreign_asset_amount = 10000000000000; @@ -376,7 +376,7 @@ pub fn teleports_for_foreign_assets_works< .with_session_keys(collator_session_keys.session_keys()) .with_balances(vec![ ( - foreign_creator_as_account_id.clone(), + foreign_creator_as_account_id, existential_deposit + (buy_execution_fee_amount * 2).into(), ), (target_account.clone(), existential_deposit), @@ -441,7 +441,7 @@ pub fn teleports_for_foreign_assets_works< BuyExecution { fees: MultiAsset { id: Concrete(MultiLocation::parent()), - fun: Fungible(buy_execution_fee_amount.into()), + fun: Fungible(buy_execution_fee_amount), }, weight_limit: Limited(Weight::from_parts(403531000, 65536)), }, @@ -536,7 +536,7 @@ pub fn teleports_for_foreign_assets_works< RuntimeHelper::::origin_of(target_account.clone()), dest, dest_beneficiary, - (foreign_asset_id_multilocation, asset_to_teleport_away.clone().into()), + (foreign_asset_id_multilocation, asset_to_teleport_away), Some((runtime_para_id, foreign_para_id)), )); @@ -788,7 +788,7 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< .execute_with(|| { // create some asset class let asset_minimum_asset_balance = 3333333_u128; - let asset_id_as_multilocation = AssetIdConverter::reverse_ref(&asset_id).unwrap(); + let asset_id_as_multilocation = AssetIdConverter::reverse_ref(asset_id).unwrap(); assert_ok!(>::force_create( RuntimeHelper::::root_origin(), asset_id.into(), @@ -869,7 +869,7 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< id: charlie_account.clone().into() }), }, - (asset_id_as_multilocation, 1 * asset_minimum_asset_balance), + (asset_id_as_multilocation, asset_minimum_asset_balance), ), XcmError::FailedToTransactAsset(Into::<&str>::into( sp_runtime::TokenError::CannotCreate @@ -890,7 +890,7 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< parents: 0, interior: X1(AccountId32 { network: None, id: bob_account.clone().into() }), }, - (asset_id_as_multilocation, 1 * asset_minimum_asset_balance), + (asset_id_as_multilocation, asset_minimum_asset_balance), ), Ok(_) )); @@ -908,7 +908,7 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< asset_id.into(), &bob_account ), - (1 * asset_minimum_asset_balance).into() + asset_minimum_asset_balance.into() ); assert_eq!( >::balance( @@ -1130,7 +1130,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor // lets simulate this was triggered by relay chain from local consensus sibling parachain let xcm = Xcm(vec![ WithdrawAsset(buy_execution_fee.clone().into()), - BuyExecution { fees: buy_execution_fee.clone().into(), weight_limit: Unlimited }, + BuyExecution { fees: buy_execution_fee.clone(), weight_limit: Unlimited }, Transact { origin_kind: OriginKind::Xcm, require_weight_at_most: Weight::from_parts(40_000_000_000, 8000), @@ -1247,7 +1247,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor }); let xcm = Xcm(vec![ WithdrawAsset(buy_execution_fee.clone().into()), - BuyExecution { fees: buy_execution_fee.clone().into(), weight_limit: Unlimited }, + BuyExecution { fees: buy_execution_fee.clone(), weight_limit: Unlimited }, Transact { origin_kind: OriginKind::Xcm, require_weight_at_most: Weight::from_parts(20_000_000_000, 8000), diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index c237c8dc5cf..d5ac6103d97 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -199,7 +199,7 @@ impl pallet_balances::Config for Runtime { parameter_types! { /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 1 * MILLICENTS; + pub const TransactionByteFee: Balance = MILLICENTS; } impl pallet_transaction_payment::Config for Runtime { @@ -1038,7 +1038,7 @@ impl_runtime_apis! { list_benchmarks!(list, extra); let storage_info = AllPalletsWithSystem::storage_info(); - return (list, storage_info) + (list, storage_info) } fn dispatch_benchmark( @@ -1073,7 +1073,6 @@ impl_runtime_apis! { id: Concrete(GeneralIndex(i as u128).into()), fun: Fungible(fungibles_amount * i as u128), } - .into() }) .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) .chain((0..holding_non_fungibles).map(|i| MultiAsset { @@ -1093,7 +1092,7 @@ impl_runtime_apis! { parameter_types! { pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( WestendLocation::get(), - MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(WestendLocation::get()) }, + MultiAsset { fun: Fungible(UNITS), id: Concrete(WestendLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; @@ -1108,7 +1107,7 @@ impl_runtime_apis! { fn get_multi_asset() -> MultiAsset { MultiAsset { id: Concrete(WestendLocation::get()), - fun: Fungible(1 * UNITS), + fun: Fungible(UNITS), } } } diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs b/parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs index 5daa3acbcce..8247f75d5dd 100644 --- a/parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs @@ -33,8 +33,7 @@ const MAX_ASSETS: u64 = 100; impl WeighMultiAssets for MultiAssetFilter { fn weigh_multi_assets(&self, weight: Weight) -> Weight { match self { - Self::Definite(assets) => - weight.saturating_mul(assets.inner().into_iter().count() as u64), + Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { All => weight.saturating_mul(MAX_ASSETS), AllOf { fun, .. } => match fun { @@ -53,7 +52,7 @@ impl WeighMultiAssets for MultiAssetFilter { impl WeighMultiAssets for MultiAssets { fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().into_iter().count() as u64) + weight.saturating_mul(self.inner().iter().count() as u64) } } @@ -65,7 +64,7 @@ impl XcmWeightInfo for WestmintXcmWeight { // Currently there is no trusted reserve fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - Weight::from_parts(1_000_000_000 as u64, 0) + Weight::from_parts(1_000_000_000_u64, 0) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) @@ -123,7 +122,7 @@ impl XcmWeightInfo for WestmintXcmWeight { fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000 as u64, 0); + let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); hardcoded_weight.min(weight) } diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index a834180bd29..53750a4a810 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -191,155 +191,149 @@ impl Contains for SafeCallFilter { } } - match call { + matches!( + call, RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | - RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, - ) | - RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Utility( - pallet_utility::Call::as_derivative { .. } | - pallet_utility::Call::batch { .. } | - pallet_utility::Call::batch_all { .. }, - ) | - RuntimeCall::Assets( + RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection( + pallet_collator_selection::Call::set_desired_candidates { .. } | + pallet_collator_selection::Call::set_candidacy_bond { .. } | + pallet_collator_selection::Call::register_as_candidate { .. } | + pallet_collator_selection::Call::leave_intent { .. }, + ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::XcmpQueue(..) | + RuntimeCall::DmpQueue(..) | + RuntimeCall::Utility( + pallet_utility::Call::as_derivative { .. } | + pallet_utility::Call::batch { .. } | + pallet_utility::Call::batch_all { .. }, + ) | RuntimeCall::Assets( pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::refund { .. }, - ) | - RuntimeCall::ForeignAssets( + pallet_assets::Call::force_create { .. } | + pallet_assets::Call::start_destroy { .. } | + pallet_assets::Call::destroy_accounts { .. } | + pallet_assets::Call::destroy_approvals { .. } | + pallet_assets::Call::finish_destroy { .. } | + pallet_assets::Call::mint { .. } | + pallet_assets::Call::burn { .. } | + pallet_assets::Call::transfer { .. } | + pallet_assets::Call::transfer_keep_alive { .. } | + pallet_assets::Call::force_transfer { .. } | + pallet_assets::Call::freeze { .. } | + pallet_assets::Call::thaw { .. } | + pallet_assets::Call::freeze_asset { .. } | + pallet_assets::Call::thaw_asset { .. } | + pallet_assets::Call::transfer_ownership { .. } | + pallet_assets::Call::set_team { .. } | + pallet_assets::Call::clear_metadata { .. } | + pallet_assets::Call::force_clear_metadata { .. } | + pallet_assets::Call::force_asset_status { .. } | + pallet_assets::Call::approve_transfer { .. } | + pallet_assets::Call::cancel_approval { .. } | + pallet_assets::Call::force_cancel_approval { .. } | + pallet_assets::Call::transfer_approved { .. } | + pallet_assets::Call::touch { .. } | + pallet_assets::Call::refund { .. }, + ) | RuntimeCall::ForeignAssets( pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::set_metadata { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::refund { .. }, - ) | - RuntimeCall::Nfts( + pallet_assets::Call::force_create { .. } | + pallet_assets::Call::start_destroy { .. } | + pallet_assets::Call::destroy_accounts { .. } | + pallet_assets::Call::destroy_approvals { .. } | + pallet_assets::Call::finish_destroy { .. } | + pallet_assets::Call::mint { .. } | + pallet_assets::Call::burn { .. } | + pallet_assets::Call::transfer { .. } | + pallet_assets::Call::transfer_keep_alive { .. } | + pallet_assets::Call::force_transfer { .. } | + pallet_assets::Call::freeze { .. } | + pallet_assets::Call::thaw { .. } | + pallet_assets::Call::freeze_asset { .. } | + pallet_assets::Call::thaw_asset { .. } | + pallet_assets::Call::transfer_ownership { .. } | + pallet_assets::Call::set_team { .. } | + pallet_assets::Call::set_metadata { .. } | + pallet_assets::Call::clear_metadata { .. } | + pallet_assets::Call::force_clear_metadata { .. } | + pallet_assets::Call::force_asset_status { .. } | + pallet_assets::Call::approve_transfer { .. } | + pallet_assets::Call::cancel_approval { .. } | + pallet_assets::Call::force_cancel_approval { .. } | + pallet_assets::Call::transfer_approved { .. } | + pallet_assets::Call::touch { .. } | + pallet_assets::Call::refund { .. }, + ) | RuntimeCall::Nfts( pallet_nfts::Call::create { .. } | - pallet_nfts::Call::force_create { .. } | - pallet_nfts::Call::destroy { .. } | - pallet_nfts::Call::mint { .. } | - pallet_nfts::Call::force_mint { .. } | - pallet_nfts::Call::burn { .. } | - pallet_nfts::Call::transfer { .. } | - pallet_nfts::Call::lock_item_transfer { .. } | - pallet_nfts::Call::unlock_item_transfer { .. } | - pallet_nfts::Call::lock_collection { .. } | - pallet_nfts::Call::transfer_ownership { .. } | - pallet_nfts::Call::set_team { .. } | - pallet_nfts::Call::force_collection_owner { .. } | - pallet_nfts::Call::force_collection_config { .. } | - pallet_nfts::Call::approve_transfer { .. } | - pallet_nfts::Call::cancel_approval { .. } | - pallet_nfts::Call::clear_all_transfer_approvals { .. } | - pallet_nfts::Call::lock_item_properties { .. } | - pallet_nfts::Call::set_attribute { .. } | - pallet_nfts::Call::force_set_attribute { .. } | - pallet_nfts::Call::clear_attribute { .. } | - pallet_nfts::Call::approve_item_attributes { .. } | - pallet_nfts::Call::cancel_item_attributes_approval { .. } | - pallet_nfts::Call::set_metadata { .. } | - pallet_nfts::Call::clear_metadata { .. } | - pallet_nfts::Call::set_collection_metadata { .. } | - pallet_nfts::Call::clear_collection_metadata { .. } | - pallet_nfts::Call::set_accept_ownership { .. } | - pallet_nfts::Call::set_collection_max_supply { .. } | - pallet_nfts::Call::update_mint_settings { .. } | - pallet_nfts::Call::set_price { .. } | - pallet_nfts::Call::buy_item { .. } | - pallet_nfts::Call::pay_tips { .. } | - pallet_nfts::Call::create_swap { .. } | - pallet_nfts::Call::cancel_swap { .. } | - pallet_nfts::Call::claim_swap { .. }, - ) | - RuntimeCall::Uniques( + pallet_nfts::Call::force_create { .. } | + pallet_nfts::Call::destroy { .. } | + pallet_nfts::Call::mint { .. } | + pallet_nfts::Call::force_mint { .. } | + pallet_nfts::Call::burn { .. } | + pallet_nfts::Call::transfer { .. } | + pallet_nfts::Call::lock_item_transfer { .. } | + pallet_nfts::Call::unlock_item_transfer { .. } | + pallet_nfts::Call::lock_collection { .. } | + pallet_nfts::Call::transfer_ownership { .. } | + pallet_nfts::Call::set_team { .. } | + pallet_nfts::Call::force_collection_owner { .. } | + pallet_nfts::Call::force_collection_config { .. } | + pallet_nfts::Call::approve_transfer { .. } | + pallet_nfts::Call::cancel_approval { .. } | + pallet_nfts::Call::clear_all_transfer_approvals { .. } | + pallet_nfts::Call::lock_item_properties { .. } | + pallet_nfts::Call::set_attribute { .. } | + pallet_nfts::Call::force_set_attribute { .. } | + pallet_nfts::Call::clear_attribute { .. } | + pallet_nfts::Call::approve_item_attributes { .. } | + pallet_nfts::Call::cancel_item_attributes_approval { .. } | + pallet_nfts::Call::set_metadata { .. } | + pallet_nfts::Call::clear_metadata { .. } | + pallet_nfts::Call::set_collection_metadata { .. } | + pallet_nfts::Call::clear_collection_metadata { .. } | + pallet_nfts::Call::set_accept_ownership { .. } | + pallet_nfts::Call::set_collection_max_supply { .. } | + pallet_nfts::Call::update_mint_settings { .. } | + pallet_nfts::Call::set_price { .. } | + pallet_nfts::Call::buy_item { .. } | + pallet_nfts::Call::pay_tips { .. } | + pallet_nfts::Call::create_swap { .. } | + pallet_nfts::Call::cancel_swap { .. } | + pallet_nfts::Call::claim_swap { .. }, + ) | RuntimeCall::Uniques( pallet_uniques::Call::create { .. } | - pallet_uniques::Call::force_create { .. } | - pallet_uniques::Call::destroy { .. } | - pallet_uniques::Call::mint { .. } | - pallet_uniques::Call::burn { .. } | - pallet_uniques::Call::transfer { .. } | - pallet_uniques::Call::freeze { .. } | - pallet_uniques::Call::thaw { .. } | - pallet_uniques::Call::freeze_collection { .. } | - pallet_uniques::Call::thaw_collection { .. } | - pallet_uniques::Call::transfer_ownership { .. } | - pallet_uniques::Call::set_team { .. } | - pallet_uniques::Call::approve_transfer { .. } | - pallet_uniques::Call::cancel_approval { .. } | - pallet_uniques::Call::force_item_status { .. } | - pallet_uniques::Call::set_attribute { .. } | - pallet_uniques::Call::clear_attribute { .. } | - pallet_uniques::Call::set_metadata { .. } | - pallet_uniques::Call::clear_metadata { .. } | - pallet_uniques::Call::set_collection_metadata { .. } | - pallet_uniques::Call::clear_collection_metadata { .. } | - pallet_uniques::Call::set_accept_ownership { .. } | - pallet_uniques::Call::set_collection_max_supply { .. } | - pallet_uniques::Call::set_price { .. } | - pallet_uniques::Call::buy_item { .. }, - ) => true, - _ => false, - } + pallet_uniques::Call::force_create { .. } | + pallet_uniques::Call::destroy { .. } | + pallet_uniques::Call::mint { .. } | + pallet_uniques::Call::burn { .. } | + pallet_uniques::Call::transfer { .. } | + pallet_uniques::Call::freeze { .. } | + pallet_uniques::Call::thaw { .. } | + pallet_uniques::Call::freeze_collection { .. } | + pallet_uniques::Call::thaw_collection { .. } | + pallet_uniques::Call::transfer_ownership { .. } | + pallet_uniques::Call::set_team { .. } | + pallet_uniques::Call::approve_transfer { .. } | + pallet_uniques::Call::cancel_approval { .. } | + pallet_uniques::Call::force_item_status { .. } | + pallet_uniques::Call::set_attribute { .. } | + pallet_uniques::Call::clear_attribute { .. } | + pallet_uniques::Call::set_metadata { .. } | + pallet_uniques::Call::clear_metadata { .. } | + pallet_uniques::Call::set_collection_metadata { .. } | + pallet_uniques::Call::clear_collection_metadata { .. } | + pallet_uniques::Call::set_accept_ownership { .. } | + pallet_uniques::Call::set_collection_max_supply { .. } | + pallet_uniques::Call::set_price { .. } | + pallet_uniques::Call::buy_item { .. }, + ) + ) } } diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 3ef09d14e52..740edc0c20b 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -84,19 +84,16 @@ fn test_asset_xcm_trader() { // Lets pay with: asset_amount_needed + asset_amount_extra let asset_amount_extra = 100_u128; let asset: MultiAsset = - (asset_multilocation.clone(), asset_amount_needed + asset_amount_extra).into(); + (asset_multilocation, asset_amount_needed + asset_amount_extra).into(); let mut trader = ::Trader::new(); // Lets buy_weight and make sure buy_weight does not return an error - match trader.buy_weight(bought, asset.into()) { - Ok(unused_assets) => { - // Check whether a correct amount of unused assets is returned - assert_ok!(unused_assets - .ensure_contains(&(asset_multilocation, asset_amount_extra).into())); - }, - Err(e) => assert!(false, "Expected Ok(_). Got {:#?}", e), - } + let unused_assets = trader.buy_weight(bought, asset.into()).expect("Expected Ok"); + // Check whether a correct amount of unused assets is returned + assert_ok!( + unused_assets.ensure_contains(&(asset_multilocation, asset_amount_extra).into()) + ); // Drop trader drop(trader); @@ -156,7 +153,7 @@ fn test_asset_xcm_trader_with_refund() { // lets calculate amount needed let amount_bought = WeightToFee::weight_to_fee(&bought); - let asset: MultiAsset = (asset_multilocation.clone(), amount_bought).into(); + let asset: MultiAsset = (asset_multilocation, amount_bought).into(); // Make sure buy_weight does not return an error assert_ok!(trader.buy_weight(bought, asset.clone().into())); @@ -230,7 +227,7 @@ fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { "we are testing what happens when the amount does not exceed ED" ); - let asset: MultiAsset = (asset_multilocation.clone(), amount_bought).into(); + let asset: MultiAsset = (asset_multilocation, amount_bought).into(); // Buy weight should return an error assert_noop!(trader.buy_weight(bought, asset.into()), XcmError::TooExpensive); @@ -282,11 +279,11 @@ fn test_that_buying_ed_refund_does_not_refund() { // We know we will have to buy at least ED, so lets make sure first it will // fail with a payment of less than ED - let asset: MultiAsset = (asset_multilocation.clone(), amount_bought).into(); + let asset: MultiAsset = (asset_multilocation, amount_bought).into(); assert_noop!(trader.buy_weight(bought, asset.into()), XcmError::TooExpensive); // Now lets buy ED at least - let asset: MultiAsset = (asset_multilocation.clone(), ExistentialDeposit::get()).into(); + let asset: MultiAsset = (asset_multilocation, ExistentialDeposit::get()).into(); // Buy weight should work assert_ok!(trader.buy_weight(bought, asset.into())); @@ -421,7 +418,7 @@ fn test_assets_balances_api_works() { let foreign_asset_minimum_asset_balance = 3333333_u128; assert_ok!(ForeignAssets::force_create( RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation.clone().into(), + foreign_asset_id_multilocation, AccountId::from(SOME_ASSET_ADMIN).into(), false, foreign_asset_minimum_asset_balance @@ -430,7 +427,7 @@ fn test_assets_balances_api_works() { // We first mint enough asset for the account to exist for assets assert_ok!(ForeignAssets::mint( RuntimeHelper::::origin_of(AccountId::from(SOME_ASSET_ADMIN)), - foreign_asset_id_multilocation.clone().into(), + foreign_asset_id_multilocation, AccountId::from(ALICE).into(), 6 * foreign_asset_minimum_asset_balance )); diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs index 952c3147306..ec9d9f09e41 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -254,7 +254,7 @@ impl pallet_balances::Config for Runtime { parameter_types! { /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 1 * MILLICENTS; + pub const TransactionByteFee: Balance = MILLICENTS; } impl pallet_transaction_payment::Config for Runtime { @@ -615,7 +615,7 @@ impl_runtime_apis! { list_benchmarks!(list, extra); let storage_info = AllPalletsWithSystem::storage_info(); - return (list, storage_info) + (list, storage_info) } fn dispatch_benchmark( @@ -653,7 +653,7 @@ impl_runtime_apis! { parameter_types! { pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( KsmRelayLocation::get(), - MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(KsmRelayLocation::get()) }, + MultiAsset { fun: Fungible(UNITS), id: Concrete(KsmRelayLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; } @@ -667,7 +667,7 @@ impl_runtime_apis! { fn get_multi_asset() -> MultiAsset { MultiAsset { id: Concrete(KsmRelayLocation::get()), - fun: Fungible(1 * UNITS), + fun: Fungible(UNITS), } } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/mod.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/mod.rs index 7cf23e0610b..9d11b07e54e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/mod.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/mod.rs @@ -33,8 +33,7 @@ const MAX_ASSETS: u64 = 100; impl WeighMultiAssets for MultiAssetFilter { fn weigh_multi_assets(&self, weight: Weight) -> Weight { match self { - Self::Definite(assets) => - weight.saturating_mul(assets.inner().into_iter().count() as u64), + Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { All => weight.saturating_mul(MAX_ASSETS), AllOf { fun, .. } => match fun { @@ -53,7 +52,7 @@ impl WeighMultiAssets for MultiAssetFilter { impl WeighMultiAssets for MultiAssets { fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().into_iter().count() as u64) + weight.saturating_mul(self.inner().iter().count() as u64) } } @@ -65,7 +64,7 @@ impl XcmWeightInfo for BridgeHubKusamaXcmWeight { // Currently there is no trusted reserve fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - Weight::from_parts(1_000_000_000 as u64, 0) + Weight::from_parts(1_000_000_000_u64, 0) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) @@ -123,7 +122,7 @@ impl XcmWeightInfo for BridgeHubKusamaXcmWeight { fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000 as u64, 0); + let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); hardcoded_weight.min(weight) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs index 0e3ce655349..f432a345b32 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs @@ -129,29 +129,27 @@ impl Contains for SafeCallFilter { } } - match call { + matches!( + call, RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | - RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, - ) | - RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) => true, - _ => false, - } + RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection( + pallet_collator_selection::Call::set_desired_candidates { .. } | + pallet_collator_selection::Call::set_candidacy_bond { .. } | + pallet_collator_selection::Call::register_as_candidate { .. } | + pallet_collator_selection::Call::leave_intent { .. }, + ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::XcmpQueue(..) | + RuntimeCall::DmpQueue(..) | + RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) + ) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs index dfc08b4c184..b701645ed17 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -254,7 +254,7 @@ impl pallet_balances::Config for Runtime { parameter_types! { /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 1 * MILLICENTS; + pub const TransactionByteFee: Balance = MILLICENTS; } impl pallet_transaction_payment::Config for Runtime { @@ -615,7 +615,7 @@ impl_runtime_apis! { list_benchmarks!(list, extra); let storage_info = AllPalletsWithSystem::storage_info(); - return (list, storage_info) + (list, storage_info) } fn dispatch_benchmark( @@ -653,7 +653,7 @@ impl_runtime_apis! { parameter_types! { pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( DotRelayLocation::get(), - MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(DotRelayLocation::get()) }, + MultiAsset { fun: Fungible(UNITS), id: Concrete(DotRelayLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; } @@ -667,7 +667,7 @@ impl_runtime_apis! { fn get_multi_asset() -> MultiAsset { MultiAsset { id: Concrete(DotRelayLocation::get()), - fun: Fungible(1 * UNITS), + fun: Fungible(UNITS), } } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/mod.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/mod.rs index e9b1c70bf6a..27bdb510ba0 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/mod.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/mod.rs @@ -33,8 +33,7 @@ const MAX_ASSETS: u64 = 100; impl WeighMultiAssets for MultiAssetFilter { fn weigh_multi_assets(&self, weight: Weight) -> Weight { match self { - Self::Definite(assets) => - weight.saturating_mul(assets.inner().into_iter().count() as u64), + Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { All => weight.saturating_mul(MAX_ASSETS), AllOf { fun, .. } => match fun { @@ -53,7 +52,7 @@ impl WeighMultiAssets for MultiAssetFilter { impl WeighMultiAssets for MultiAssets { fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().into_iter().count() as u64) + weight.saturating_mul(self.inner().iter().count() as u64) } } @@ -65,7 +64,7 @@ impl XcmWeightInfo for BridgeHubPolkadotXcmWeight { // Currently there is no trusted reserve fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - Weight::from_parts(1_000_000_000 as u64, 0) + Weight::from_parts(1_000_000_000_u64, 0) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) @@ -123,7 +122,7 @@ impl XcmWeightInfo for BridgeHubPolkadotXcmWeight { fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000 as u64, 0); + let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); hardcoded_weight.min(weight) } @@ -150,7 +149,7 @@ impl XcmWeightInfo for BridgeHubPolkadotXcmWeight { _xcm: &Xcm<()>, ) -> Weight { // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(200_000_000 as u64, 0); + let hardcoded_weight = Weight::from_parts(200_000_000_u64, 0); let weight = assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()); hardcoded_weight.min(weight) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs index 3cd79a8324b..22b7edffffb 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs @@ -132,29 +132,27 @@ impl Contains for SafeCallFilter { } } - match call { + matches!( + call, RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | - RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, - ) | - RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) => true, - _ => false, - } + RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection( + pallet_collator_selection::Call::set_desired_candidates { .. } | + pallet_collator_selection::Call::set_candidacy_bond { .. } | + pallet_collator_selection::Call::register_as_candidate { .. } | + pallet_collator_selection::Call::leave_intent { .. }, + ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::XcmpQueue(..) | + RuntimeCall::DmpQueue(..) | + RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) + ) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 21f02ce4765..15e34472fc6 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -274,7 +274,7 @@ impl pallet_balances::Config for Runtime { parameter_types! { /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 1 * MILLICENTS; + pub const TransactionByteFee: Balance = MILLICENTS; } impl pallet_transaction_payment::Config for Runtime { @@ -888,7 +888,7 @@ impl_runtime_apis! { list_benchmarks!(list, extra); let storage_info = AllPalletsWithSystem::storage_info(); - return (list, storage_info) + (list, storage_info) } fn dispatch_benchmark( @@ -926,7 +926,7 @@ impl_runtime_apis! { parameter_types! { pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( RelayLocation::get(), - MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(RelayLocation::get()) }, + MultiAsset { fun: Fungible(UNITS), id: Concrete(RelayLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; } @@ -940,7 +940,7 @@ impl_runtime_apis! { fn get_multi_asset() -> MultiAsset { MultiAsset { id: Concrete(RelayLocation::get()), - fun: Fungible(1 * UNITS), + fun: Fungible(UNITS), } } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs index a0aaac56f5a..9efbef18363 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs @@ -34,8 +34,7 @@ const MAX_ASSETS: u64 = 100; impl WeighMultiAssets for MultiAssetFilter { fn weigh_multi_assets(&self, weight: Weight) -> Weight { match self { - Self::Definite(assets) => - weight.saturating_mul(assets.inner().into_iter().count() as u64), + Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { All => weight.saturating_mul(MAX_ASSETS), AllOf { fun, .. } => match fun { @@ -54,7 +53,7 @@ impl WeighMultiAssets for MultiAssetFilter { impl WeighMultiAssets for MultiAssets { fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().into_iter().count() as u64) + weight.saturating_mul(self.inner().iter().count() as u64) } } @@ -66,7 +65,7 @@ impl XcmWeightInfo for BridgeHubRococoXcmWeight { // Currently there is no trusted reserve fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - Weight::from_parts(1_000_000_000 as u64, 0) + Weight::from_parts(1_000_000_000_u64, 0) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) @@ -124,7 +123,7 @@ impl XcmWeightInfo for BridgeHubRococoXcmWeight { fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000 as u64, 0); + let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); hardcoded_weight.min(weight) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 0773dca274e..fe5873f7e11 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -347,11 +347,11 @@ impl WeightInfo { // Storage: BridgeWococoMessages OutboundMessages (r:0 w:1) // Proof: BridgeWococoMessages OutboundMessages (max_values: None, max_size: Some(2621472), added: 2623947, mode: MaxEncodedLen) pub(crate) fn export_message(x: u32, ) -> Weight { - Weight::from_parts(31_677_716 as u64, 0) + Weight::from_parts(31_677_716_u64, 0) // Standard Error: 4_158 .saturating_add(Weight::from_parts(123_901, 0).saturating_mul(x as u64)) - .saturating_add(T::DbWeight::get().reads(3 as u64)) - .saturating_add(T::DbWeight::get().writes(2 as u64)) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index cd915a99313..945d0636ac7 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -152,41 +152,35 @@ impl Contains for SafeCallFilter { } } - match call { + matches!( + call, RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | - RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, - ) | - RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | - RuntimeCall::BridgeRococoGrandpa(pallet_bridge_grandpa::Call::< - Runtime, - BridgeGrandpaRococoInstance, - >::initialize { - .. - }) | - RuntimeCall::BridgeWococoGrandpa(pallet_bridge_grandpa::Call::< - Runtime, - BridgeGrandpaWococoInstance, - >::initialize { - .. - }) => true, - _ => false, - } + RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection( + pallet_collator_selection::Call::set_desired_candidates { .. } | + pallet_collator_selection::Call::set_candidacy_bond { .. } | + pallet_collator_selection::Call::register_as_candidate { .. } | + pallet_collator_selection::Call::leave_intent { .. }, + ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::XcmpQueue(..) | + RuntimeCall::DmpQueue(..) | + RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | + RuntimeCall::BridgeRococoGrandpa(pallet_bridge_grandpa::Call::< + Runtime, + BridgeGrandpaRococoInstance, + >::initialize { .. }) | + RuntimeCall::BridgeWococoGrandpa(pallet_bridge_grandpa::Call::< + Runtime, + BridgeGrandpaWococoInstance, + >::initialize { .. }) + ) } } diff --git a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs index 5cdc2af9968..5f419fe789f 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs +++ b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs @@ -166,7 +166,7 @@ pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< // check queue before assert_eq!( pallet_bridge_messages::OutboundLanes::::try_get( - &expected_lane_id + expected_lane_id ), Err(()) ); @@ -190,7 +190,7 @@ pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< // check queue after assert_eq!( pallet_bridge_messages::OutboundLanes::::try_get( - &expected_lane_id + expected_lane_id ), Ok(OutboundLaneData { oldest_unpruned_nonce: 1, @@ -243,8 +243,8 @@ macro_rules! include_handle_export_message_from_system_parachain_to_outbound_que /// Test-case makes sure that Runtime can route XCM messages received in inbound queue, /// We just test here `MessageDispatch` configuration. /// We expect that runtime can route messages: -/// 1. to Parent (relay chain) -/// 2. to Sibling parachain +/// 1. to Parent (relay chain) +/// 2. to Sibling parachain pub fn message_dispatch_routing_works< Runtime, XcmConfig, diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs index 5056abb2e22..71ad62f70b3 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs @@ -27,7 +27,7 @@ pub(crate) mod import_kusama_fellowship { #[cfg(feature = "try-runtime")] use sp_std::vec::Vec; - const TARGET: &'static str = "runtime::migration::import_fellowship"; + const TARGET: &str = "runtime::migration::import_fellowship"; parameter_types! { // The Fellowship addresses from Kusama state. @@ -250,7 +250,7 @@ pub mod tests { assert!(IdToIndex::::get(0, &who).is_some()); assert!(IdToIndex::::get(rank + 1, &who).is_none()); let index = IdToIndex::::get(rank, &who).unwrap(); - assert_eq!(IndexToId::::get(rank, &index).unwrap(), who); + assert_eq!(IndexToId::::get(rank, index).unwrap(), who); assert_eq!( Members::::get(&who).unwrap(), MemberRecord::new(rank) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/tracks.rs b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/tracks.rs index 5d75bde9e18..1f728279485 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/tracks.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/tracks.rs @@ -54,7 +54,7 @@ impl pallet_referenda::TracksInfo for TracksInfo { prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: 1 * MINUTES, + min_enactment_period: MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -76,7 +76,7 @@ impl pallet_referenda::TracksInfo for TracksInfo { prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: 1 * MINUTES, + min_enactment_period: MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -98,7 +98,7 @@ impl pallet_referenda::TracksInfo for TracksInfo { prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: 1 * MINUTES, + min_enactment_period: MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -120,7 +120,7 @@ impl pallet_referenda::TracksInfo for TracksInfo { prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: 1 * MINUTES, + min_enactment_period: MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -142,7 +142,7 @@ impl pallet_referenda::TracksInfo for TracksInfo { prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: 1 * MINUTES, + min_enactment_period: MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -160,11 +160,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { pallet_referenda::TrackInfo { name: "experts", max_deciding: 10, - decision_deposit: 1 * DOLLARS, + decision_deposit: DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: 1 * MINUTES, + min_enactment_period: MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -182,11 +182,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { pallet_referenda::TrackInfo { name: "senior experts", max_deciding: 10, - decision_deposit: 1 * DOLLARS, + decision_deposit: DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: 1 * MINUTES, + min_enactment_period: MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -204,11 +204,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { pallet_referenda::TrackInfo { name: "masters", max_deciding: 10, - decision_deposit: 1 * DOLLARS, + decision_deposit: DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: 1 * MINUTES, + min_enactment_period: MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -226,11 +226,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { pallet_referenda::TrackInfo { name: "senior masters", max_deciding: 10, - decision_deposit: 1 * DOLLARS, + decision_deposit: DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: 1 * MINUTES, + min_enactment_period: MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -248,11 +248,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { pallet_referenda::TrackInfo { name: "grand masters", max_deciding: 10, - decision_deposit: 1 * DOLLARS, + decision_deposit: DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: 1 * MINUTES, + min_enactment_period: MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/impls.rs b/parachains/runtimes/collectives/collectives-polkadot/src/impls.rs index f70fb30bff7..3b45d2824d9 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/impls.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/impls.rs @@ -59,7 +59,7 @@ where let pallet_acc: AccountIdOf = PalletAccount::get(); let treasury_acc: AccountIdOf = TreasuryAccount::get(); - >::resolve_creating(&pallet_acc.clone(), amount); + >::resolve_creating(&pallet_acc, amount); let result = >::teleport_assets( <::RuntimeOrigin>::signed(pallet_acc.into()), @@ -73,10 +73,9 @@ where 0, ); - match result { - Err(err) => log::warn!("Failed to teleport slashed assets: {:?}", err), - _ => (), - }; + if let Err(err) = result { + log::warn!("Failed to teleport slashed assets: {:?}", err); + } } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs index e0f95cb052b..b902e694a15 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs @@ -216,7 +216,7 @@ impl pallet_balances::Config for Runtime { parameter_types! { /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 1 * MILLICENTS; + pub const TransactionByteFee: Balance = MILLICENTS; } impl pallet_transaction_payment::Config for Runtime { @@ -843,7 +843,7 @@ impl_runtime_apis! { list_benchmarks!(list, extra); let storage_info = AllPalletsWithSystem::storage_info(); - return (list, storage_info) + (list, storage_info) } fn dispatch_benchmark( @@ -899,7 +899,7 @@ impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { .create_inherent_data() .expect("Could not create the timestamp inherent data"); - inherent_data.check_extrinsics(&block) + inherent_data.check_extrinsics(block) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index 7749877a52f..b54f6ede5f2 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -137,58 +137,54 @@ impl Contains for SafeCallFilter { } } - match call { + matches!( + call, RuntimeCall::System( frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | - RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, - ) | - RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | - RuntimeCall::Alliance( - // `init_members` accepts unbounded vecs as arguments, - // but the call can be initiated only by root origin. - pallet_alliance::Call::init_members { .. } | - pallet_alliance::Call::vote { .. } | - pallet_alliance::Call::disband { .. } | - pallet_alliance::Call::set_rule { .. } | - pallet_alliance::Call::announce { .. } | - pallet_alliance::Call::remove_announcement { .. } | - pallet_alliance::Call::join_alliance { .. } | - pallet_alliance::Call::nominate_ally { .. } | - pallet_alliance::Call::elevate_ally { .. } | - pallet_alliance::Call::give_retirement_notice { .. } | - pallet_alliance::Call::retire { .. } | - pallet_alliance::Call::kick_member { .. } | - pallet_alliance::Call::close { .. } | - pallet_alliance::Call::abdicate_fellow_status { .. }, - ) | - RuntimeCall::AllianceMotion( + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection( + pallet_collator_selection::Call::set_desired_candidates { .. } | + pallet_collator_selection::Call::set_candidacy_bond { .. } | + pallet_collator_selection::Call::register_as_candidate { .. } | + pallet_collator_selection::Call::leave_intent { .. }, + ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | + RuntimeCall::XcmpQueue(..) | + RuntimeCall::DmpQueue(..) | + RuntimeCall::Utility(pallet_utility::Call::as_derivative { .. }) | + RuntimeCall::Alliance( + // `init_members` accepts unbounded vecs as arguments, + // but the call can be initiated only by root origin. + pallet_alliance::Call::init_members { .. } | + pallet_alliance::Call::vote { .. } | + pallet_alliance::Call::disband { .. } | + pallet_alliance::Call::set_rule { .. } | + pallet_alliance::Call::announce { .. } | + pallet_alliance::Call::remove_announcement { .. } | + pallet_alliance::Call::join_alliance { .. } | + pallet_alliance::Call::nominate_ally { .. } | + pallet_alliance::Call::elevate_ally { .. } | + pallet_alliance::Call::give_retirement_notice { .. } | + pallet_alliance::Call::retire { .. } | + pallet_alliance::Call::kick_member { .. } | + pallet_alliance::Call::close { .. } | + pallet_alliance::Call::abdicate_fellow_status { .. }, + ) | RuntimeCall::AllianceMotion( pallet_collective::Call::vote { .. } | - pallet_collective::Call::disapprove_proposal { .. } | - pallet_collective::Call::close { .. }, - ) | - RuntimeCall::FellowshipCollective( + pallet_collective::Call::disapprove_proposal { .. } | + pallet_collective::Call::close { .. }, + ) | RuntimeCall::FellowshipCollective( pallet_ranked_collective::Call::add_member { .. } | - pallet_ranked_collective::Call::promote_member { .. } | - pallet_ranked_collective::Call::demote_member { .. } | - pallet_ranked_collective::Call::remove_member { .. }, - ) => true, - _ => false, - } + pallet_ranked_collective::Call::promote_member { .. } | + pallet_ranked_collective::Call::demote_member { .. } | + pallet_ranked_collective::Call::remove_member { .. }, + ) + ) } } diff --git a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index adeee2b5229..2718484fed6 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -639,7 +639,7 @@ impl_runtime_apis! { list_benchmarks!(list, extra); let storage_info = AllPalletsWithSystem::storage_info(); - return (list, storage_info) + (list, storage_info) } fn dispatch_benchmark( diff --git a/parachains/runtimes/starters/shell/src/lib.rs b/parachains/runtimes/starters/shell/src/lib.rs index a05a78863c4..fc87a26f8ee 100644 --- a/parachains/runtimes/starters/shell/src/lib.rs +++ b/parachains/runtimes/starters/shell/src/lib.rs @@ -222,7 +222,7 @@ impl sp_runtime::traits::SignedExtension for DisallowSigned { info: &DispatchInfoOf, len: usize, ) -> Result { - Ok(self.validate(who, call, info, len).map(|_| ())?) + self.validate(who, call, info, len).map(|_| ()) } fn validate( &self, diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index 7ade3bd2f63..5a5cb423d43 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -783,7 +783,7 @@ impl_runtime_apis! { list_benchmarks!(list, extra); let storage_info = AllPalletsWithSystem::storage_info(); - return (list, storage_info) + (list, storage_info) } fn dispatch_benchmark( diff --git a/parachains/runtimes/testing/penpal/src/xcm_config.rs b/parachains/runtimes/testing/penpal/src/xcm_config.rs index 89236aa93a9..849b0a690a9 100644 --- a/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -225,12 +225,12 @@ pub trait Reserve { // Takes the chain part of a MultiAsset impl Reserve for MultiAsset { fn reserve(&self) -> Option { - if let AssetId::Concrete(location) = self.id.clone() { + if let AssetId::Concrete(location) = self.id { let first_interior = location.first_interior(); let parents = location.parent_count(); - match (parents, first_interior.clone()) { - (0, Some(Parachain(id))) => Some(MultiLocation::new(0, X1(Parachain(id.clone())))), - (1, Some(Parachain(id))) => Some(MultiLocation::new(1, X1(Parachain(id.clone())))), + match (parents, first_interior) { + (0, Some(Parachain(id))) => Some(MultiLocation::new(0, X1(Parachain(*id)))), + (1, Some(Parachain(id))) => Some(MultiLocation::new(1, X1(Parachain(*id)))), (1, _) => Some(MultiLocation::parent()), _ => None, } diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 0147c28335c..4d539f050e1 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -219,10 +219,10 @@ impl pallet_timestamp::Config for Runtime { } parameter_types! { - pub const ExistentialDeposit: u128 = 1 * MILLIROC; - pub const TransferFee: u128 = 1 * MILLIROC; - pub const CreationFee: u128 = 1 * MILLIROC; - pub const TransactionByteFee: u128 = 1 * MICROROC; + pub const ExistentialDeposit: u128 = MILLIROC; + pub const TransferFee: u128 = MILLIROC; + pub const CreationFee: u128 = MILLIROC; + pub const TransactionByteFee: u128 = MICROROC; } impl pallet_balances::Config for Runtime { @@ -505,11 +505,11 @@ impl cumulus_ping::Config for Runtime { } parameter_types! { - pub const AssetDeposit: Balance = 1 * ROC; - pub const AssetAccountDeposit: Balance = 1 * ROC; + pub const AssetDeposit: Balance = ROC; + pub const AssetAccountDeposit: Balance = ROC; pub const ApprovalDeposit: Balance = 100 * MILLIROC; pub const AssetsStringLimit: u32 = 50; - pub const MetadataDepositBase: Balance = 1 * ROC; + pub const MetadataDepositBase: Balance = ROC; pub const MetadataDepositPerByte: Balance = 10 * MILLIROC; pub const UnitBody: BodyId = BodyId::Unit; } diff --git a/polkadot-parachain/src/chain_spec/bridge_hubs.rs b/polkadot-parachain/src/chain_spec/bridge_hubs.rs index e11f7f6e53f..e8f7d9d065d 100644 --- a/polkadot-parachain/src/chain_spec/bridge_hubs.rs +++ b/polkadot-parachain/src/chain_spec/bridge_hubs.rs @@ -272,7 +272,7 @@ pub mod rococo { para_id, bridges_pallet_owner_seed .as_ref() - .map(|seed| get_account_id_from_seed::(&seed)), + .map(|seed| get_account_id_from_seed::(seed)), ) }, Vec::new(), diff --git a/polkadot-parachain/src/command.rs b/polkadot-parachain/src/command.rs index 52a742f1527..32986b522ca 100644 --- a/polkadot-parachain/src/command.rs +++ b/polkadot-parachain/src/command.rs @@ -85,7 +85,7 @@ impl RuntimeResolver for PathBuf { } fn runtime(id: &str) -> Runtime { - let id = id.replace("_", "-"); + let id = id.replace('_', "-"); let (_, id, para_id) = extract_parachain_id(&id); if id.starts_with("shell") { @@ -240,7 +240,7 @@ fn load_spec(id: &str) -> std::result::Result, String> { Runtime::ContractsRococo => Box::new(chain_spec::contracts::ContractsRococoChainSpec::from_json_file(path)?), Runtime::BridgeHub(bridge_hub_runtime_type) => - bridge_hub_runtime_type.chain_spec_from_json_file(path.into())?, + bridge_hub_runtime_type.chain_spec_from_json_file(path)?, Runtime::Penpal(_para_id) => Box::new(chain_spec::penpal::PenpalChainSpec::from_json_file(path)?), Runtime::Default => Box::new( @@ -258,12 +258,10 @@ fn extract_parachain_id(id: &str) -> (&str, &str, Option) { const KUSAMA_TEST_PARA_PREFIX: &str = "penpal-kusama-"; const POLKADOT_TEST_PARA_PREFIX: &str = "penpal-polkadot-"; - let (norm_id, orig_id, para) = if id.starts_with(KUSAMA_TEST_PARA_PREFIX) { - let suffix = &id[KUSAMA_TEST_PARA_PREFIX.len()..]; + let (norm_id, orig_id, para) = if let Some(suffix) = id.strip_prefix(KUSAMA_TEST_PARA_PREFIX) { let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); (&id[..KUSAMA_TEST_PARA_PREFIX.len() - 1], id, Some(para_id)) - } else if id.starts_with(POLKADOT_TEST_PARA_PREFIX) { - let suffix = &id[POLKADOT_TEST_PARA_PREFIX.len()..]; + } else if let Some(suffix) = id.strip_prefix(POLKADOT_TEST_PARA_PREFIX) { let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); (&id[..POLKADOT_TEST_PARA_PREFIX.len() - 1], id, Some(para_id)) } else { @@ -813,13 +811,13 @@ pub fn run() -> Result<()> { runner.run_node_until_exit(|config| async move { let hwbench = (!cli.no_hardware_benchmarks).then_some( config.database.path().map(|database_path| { - let _ = std::fs::create_dir_all(&database_path); + let _ = std::fs::create_dir_all(database_path); sc_sysinfo::gather_hwbench(Some(database_path)) })).flatten(); let para_id = chain_spec::Extensions::try_get(&*config.chain_spec) .map(|e| e.para_id) - .ok_or_else(|| "Could not find parachain extension in chain-spec.")?; + .ok_or("Could not find parachain extension in chain-spec.")?; let polkadot_cli = RelayChainCli::new( &config, @@ -848,7 +846,7 @@ pub fn run() -> Result<()> { info!("Parachain genesis state: {}", genesis_state); info!("Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); - if !collator_options.relay_chain_rpc_urls.is_empty() && cli.relaychain_args.len() > 0 { + if !collator_options.relay_chain_rpc_urls.is_empty() && !cli.relaychain_args.is_empty() { warn!("Detected relay chain node arguments together with --relay-chain-rpc-url. This command starts a minimal Polkadot node that only uses a network-related subset of all relay chain CLI options."); } diff --git a/polkadot-parachain/src/rpc.rs b/polkadot-parachain/src/rpc.rs index 43752fd8d12..c2eeaf38608 100644 --- a/polkadot-parachain/src/rpc.rs +++ b/polkadot-parachain/src/rpc.rs @@ -70,7 +70,7 @@ where module.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?; module.merge(TransactionPayment::new(client.clone()).into_rpc())?; - module.merge(StateMigration::new(client.clone(), backend, deny_unsafe).into_rpc())?; + module.merge(StateMigration::new(client, backend, deny_unsafe).into_rpc())?; Ok(module) } diff --git a/polkadot-parachain/src/service.rs b/polkadot-parachain/src/service.rs index 803d0987844..c8370d070a6 100644 --- a/polkadot-parachain/src/service.rs +++ b/polkadot-parachain/src/service.rs @@ -858,7 +858,7 @@ where sc_client_api::StateBackendFor: sp_api::StateBackend, { cumulus_client_consensus_relay_chain::import_queue( - client.clone(), + client, block_import, |_, _| async { Ok(()) }, &task_manager.spawn_essential_handle(), @@ -1103,7 +1103,7 @@ where Box::new(RelayChainVerifier::new(client.clone(), |_, _| async { Ok(()) })) as Box<_>; let verifier = Verifier { - client: client.clone(), + client, relay_chain_verifier, aura_verifier: BuildOnAccess::Uninitialized(Some(Box::new(aura_verifier))), _phantom: PhantomData, diff --git a/polkadot-parachain/tests/benchmark_storage_works.rs b/polkadot-parachain/tests/benchmark_storage_works.rs index 916d65c0a1b..b1c05609217 100644 --- a/polkadot-parachain/tests/benchmark_storage_works.rs +++ b/polkadot-parachain/tests/benchmark_storage_works.rs @@ -8,7 +8,7 @@ use std::{ use tempfile::tempdir; /// The runtimes that this command supports. -static RUNTIMES: [&'static str; 3] = ["westmint", "statemine", "statemint"]; +static RUNTIMES: [&str; 3] = ["westmint", "statemine", "statemint"]; /// The `benchmark storage` command works for the dev runtimes. #[test] @@ -31,7 +31,7 @@ fn benchmark_storage_works() { /// Invoke the `benchmark storage` sub-command for the given database and runtime. fn benchmark_storage(db: &str, runtime: &str, base_path: &Path) -> ExitStatus { Command::new(cargo_bin("polkadot-parachain")) - .args(&["benchmark", "storage", "--chain", runtime]) + .args(["benchmark", "storage", "--chain", runtime]) .arg("--db") .arg(db) .arg("--weight-path") diff --git a/polkadot-parachain/tests/common.rs b/polkadot-parachain/tests/common.rs index 71b7fb42cd2..d8ecfe9bcbe 100644 --- a/polkadot-parachain/tests/common.rs +++ b/polkadot-parachain/tests/common.rs @@ -117,12 +117,12 @@ pub fn find_ws_url_from_output(read: impl Read + Send) -> (String, String) { line.expect("failed to obtain next line from stdout for WS address discovery"); data.push_str(&line); - data.push_str("\n"); + data.push('\n'); // does the line contain our port (we expect this specific output from substrate). let sock_addr = match line.split_once("Running JSON-RPC server: addr=") { None => return None, - Some((_, after)) => after.split_once(",").unwrap().0, + Some((_, after)) => after.split_once(',').unwrap().0, }; Some(format!("ws://{}", sock_addr)) diff --git a/polkadot-parachain/tests/purge_chain_works.rs b/polkadot-parachain/tests/purge_chain_works.rs index 34a51dcff84..2f4609273da 100644 --- a/polkadot-parachain/tests/purge_chain_works.rs +++ b/polkadot-parachain/tests/purge_chain_works.rs @@ -38,7 +38,7 @@ async fn purge_chain_works() { assert!(base_dir.path().join("polkadot/chains/dev/db/full").exists()); let status = Command::new(cargo_bin("polkadot-parachain")) - .args(&["purge-chain", "-d"]) + .args(["purge-chain", "-d"]) .arg(base_dir.path()) .arg("-y") .status() diff --git a/primitives/parachain-inherent/src/client_side.rs b/primitives/parachain-inherent/src/client_side.rs index 6f2cd5eb504..1a1506dcbbd 100644 --- a/primitives/parachain-inherent/src/client_side.rs +++ b/primitives/parachain-inherent/src/client_side.rs @@ -92,18 +92,19 @@ async fn collect_relay_storage_proof( .ok()? .unwrap_or_default(); - let mut relevant_keys = Vec::new(); - relevant_keys.push(relay_well_known_keys::CURRENT_BLOCK_RANDOMNESS.to_vec()); - relevant_keys.push(relay_well_known_keys::ONE_EPOCH_AGO_RANDOMNESS.to_vec()); - relevant_keys.push(relay_well_known_keys::TWO_EPOCHS_AGO_RANDOMNESS.to_vec()); - relevant_keys.push(relay_well_known_keys::CURRENT_SLOT.to_vec()); - relevant_keys.push(relay_well_known_keys::ACTIVE_CONFIG.to_vec()); - relevant_keys.push(relay_well_known_keys::dmq_mqc_head(para_id)); - relevant_keys.push(relay_well_known_keys::relay_dispatch_queue_size(para_id)); - relevant_keys.push(relay_well_known_keys::hrmp_ingress_channel_index(para_id)); - relevant_keys.push(relay_well_known_keys::hrmp_egress_channel_index(para_id)); - relevant_keys.push(relay_well_known_keys::upgrade_go_ahead_signal(para_id)); - relevant_keys.push(relay_well_known_keys::upgrade_restriction_signal(para_id)); + let mut relevant_keys = vec![ + relay_well_known_keys::CURRENT_BLOCK_RANDOMNESS.to_vec(), + relay_well_known_keys::ONE_EPOCH_AGO_RANDOMNESS.to_vec(), + relay_well_known_keys::TWO_EPOCHS_AGO_RANDOMNESS.to_vec(), + relay_well_known_keys::CURRENT_SLOT.to_vec(), + relay_well_known_keys::ACTIVE_CONFIG.to_vec(), + relay_well_known_keys::dmq_mqc_head(para_id), + relay_well_known_keys::relay_dispatch_queue_size(para_id), + relay_well_known_keys::hrmp_ingress_channel_index(para_id), + relay_well_known_keys::hrmp_egress_channel_index(para_id), + relay_well_known_keys::upgrade_go_ahead_signal(para_id), + relay_well_known_keys::upgrade_restriction_signal(para_id), + ]; relevant_keys.extend(ingress_channels.into_iter().map(|sender| { relay_well_known_keys::hrmp_channels(HrmpChannelId { sender, recipient: para_id }) })); diff --git a/primitives/parachain-inherent/src/mock.rs b/primitives/parachain-inherent/src/mock.rs index a26ee114ef7..00dff40800f 100644 --- a/primitives/parachain-inherent/src/mock.rs +++ b/primitives/parachain-inherent/src/mock.rs @@ -160,8 +160,8 @@ impl> InherentDataProvider self.relay_offset + self.relay_blocks_per_para_block * self.current_para_block; // Use the "sproof" (spoof proof) builder to build valid mock state root and proof. - let mut sproof_builder = RelayStateSproofBuilder::default(); - sproof_builder.para_id = self.xcm_config.para_id; + let mut sproof_builder = + RelayStateSproofBuilder { para_id: self.xcm_config.para_id, ..Default::default() }; // Process the downward messages and set up the correct head let mut downward_messages = Vec::new(); diff --git a/primitives/timestamp/src/lib.rs b/primitives/timestamp/src/lib.rs index ddc2fe340dd..932656d9b0f 100644 --- a/primitives/timestamp/src/lib.rs +++ b/primitives/timestamp/src/lib.rs @@ -99,7 +99,7 @@ mod tests { relay_parent_number: 1, relay_parent_storage_root, }, - &WASM_BINARY.expect("You need to build the WASM binaries to run the tests!"), + WASM_BINARY.expect("You need to build the WASM binaries to run the tests!"), ) .map(|v| Header::decode(&mut &v.head_data.0[..]).expect("Decodes `Header`.")) } @@ -175,7 +175,7 @@ mod tests { (slot_timestamp * 10, false), ] { let output = Command::new(env::current_exe().unwrap()) - .args(&["check_timestamp_inherent_works", "--", "--nocapture"]) + .args(["check_timestamp_inherent_works", "--", "--nocapture"]) .env("RUN_TEST", "1") .env("TIMESTAMP", timestamp.to_string()) .output() diff --git a/primitives/utility/src/lib.rs b/primitives/utility/src/lib.rs index d3a7c77aed2..e71eab178a8 100644 --- a/primitives/utility/src/lib.rs +++ b/primitives/utility/src/lib.rs @@ -163,7 +163,7 @@ impl< // Get the local asset id in which we can pay for fees let (local_asset_id, _) = - Matcher::matches_fungibles(&first).map_err(|_| XcmError::AssetNotFound)?; + Matcher::matches_fungibles(first).map_err(|_| XcmError::AssetNotFound)?; // Calculate how much we should charge in the asset_id for such amount of weight // Require at least a payment of minimum_balance @@ -181,7 +181,7 @@ impl< .map_err(|_| XcmError::Overflow)?; // Convert to the same kind of multiasset, with the required fungible balance - let required = first.id.clone().into_multiasset(asset_balance.into()); + let required = first.id.into_multiasset(asset_balance.into()); // Substract payment let unused = payment.checked_sub(required.clone()).map_err(|_| XcmError::TooExpensive)?; @@ -204,7 +204,7 @@ impl< { // Get the local asset id in which we can refund fees let (local_asset_id, outstanding_balance) = - Matcher::matches_fungibles(&(id.clone(), fun).into()).ok()?; + Matcher::matches_fungibles(&(id, fun).into()).ok()?; let minimum_balance = ConcreteAssets::minimum_balance(local_asset_id); @@ -233,8 +233,7 @@ impl< let asset_balance: u128 = asset_balance.saturated_into(); // Construct outstanding_concrete_asset with the same location id and substracted balance - let outstanding_concrete_asset: MultiAsset = - (id.clone(), outstanding_minus_substracted).into(); + let outstanding_concrete_asset: MultiAsset = (id, outstanding_minus_substracted).into(); // Substract from existing weight and balance weight_outstanding = weight_outstanding.saturating_sub(weight); @@ -365,7 +364,7 @@ mod tests { // ParentAsUmp - check dest is really not applicable let dest = (Parent, Parent, Parent); - let mut dest_wrapper = Some(dest.clone().into()); + let mut dest_wrapper = Some(dest.into()); let mut msg_wrapper = Some(message.clone()); assert_eq!( Err(SendError::NotApplicable), @@ -373,7 +372,7 @@ mod tests { ); // check wrapper were not consumed - assert_eq!(Some(dest.clone().into()), dest_wrapper.take()); + assert_eq!(Some(dest.into()), dest_wrapper.take()); assert_eq!(Some(message.clone()), msg_wrapper.take()); // another try with router chain with asserting sender @@ -393,7 +392,7 @@ mod tests { // ParentAsUmp - check dest/msg is valid let dest = (Parent, Here); - let mut dest_wrapper = Some(dest.clone().into()); + let mut dest_wrapper = Some(dest.into()); let mut msg_wrapper = Some(message.clone()); assert!( as SendXcm>::validate( &mut dest_wrapper, @@ -529,16 +528,13 @@ mod tests { // prepare test data let asset: MultiAsset = (Here, AMOUNT).into(); - let payment = Assets::from(asset.clone()); + let payment = Assets::from(asset); let weight_to_buy = Weight::from_parts(1_000, 1_000); // lets do first call (success) assert_ok!(trader.buy_weight(weight_to_buy, payment.clone())); // lets do second call (error) - assert_eq!( - trader.buy_weight(weight_to_buy, payment.clone()), - Err(XcmError::NotWithdrawable) - ); + assert_eq!(trader.buy_weight(weight_to_buy, payment), Err(XcmError::NotWithdrawable)); } } diff --git a/scripts/ci/gitlab/pipeline/test.yml b/scripts/ci/gitlab/pipeline/test.yml index 0ef51ae2e6d..a67c15eec6b 100644 --- a/scripts/ci/gitlab/pipeline/test.yml +++ b/scripts/ci/gitlab/pipeline/test.yml @@ -97,3 +97,11 @@ cargo-check-benches: artifacts: false script: - time cargo check --all --benches + +cargo-clippy: + stage: test + extends: + - .docker-env + - .common-refs + script: + - SKIP_WASM_BUILD=1 env -u RUSTFLAGS cargo clippy --locked --all-targets diff --git a/test/client/src/block_builder.rs b/test/client/src/block_builder.rs index 13b20df6be6..0c0c5c4e9c7 100644 --- a/test/client/src/block_builder.rs +++ b/test/client/src/block_builder.rs @@ -64,13 +64,13 @@ pub trait InitBlockBuilder { ) -> sc_block_builder::BlockBuilder; } -fn init_block_builder<'a>( - client: &'a Client, +fn init_block_builder( + client: &Client, at: Hash, validation_data: Option>, relay_sproof_builder: RelayStateSproofBuilder, timestamp: u64, -) -> BlockBuilder<'a, Block, Client, Backend> { +) -> BlockBuilder<'_, Block, Client, Backend> { let mut block_builder = client .new_block_at(at, Default::default(), true) .expect("Creates new block builder for test runtime"); diff --git a/test/client/src/lib.rs b/test/client/src/lib.rs index 4008dca350d..4027a056d55 100644 --- a/test/client/src/lib.rs +++ b/test/client/src/lib.rs @@ -199,5 +199,4 @@ pub fn validate_block( &validation_params.encode(), ) .map(|v| ValidationResult::decode(&mut &v[..]).expect("Decode `ValidationResult`.")) - .map_err(|err| err.into()) } diff --git a/test/relay-sproof-builder/src/lib.rs b/test/relay-sproof-builder/src/lib.rs index decc6ee3aa0..b5fc0c7f08f 100644 --- a/test/relay-sproof-builder/src/lib.rs +++ b/test/relay-sproof-builder/src/lib.rs @@ -171,7 +171,7 @@ impl RelayStateSproofBuilder { } } - let root = backend.root().clone(); + let root = *backend.root(); let proof = sp_state_machine::prove_read(backend, relevant_keys).expect("prove read"); (root, proof) } diff --git a/test/service/benches/transaction_throughput.rs b/test/service/benches/transaction_throughput.rs index 1c3f841fe23..48bf49487e6 100644 --- a/test/service/benches/transaction_throughput.rs +++ b/test/service/benches/transaction_throughput.rs @@ -46,7 +46,7 @@ fn create_account_extrinsics(client: &Client, accounts: &[sr25519::Pair]) -> Vec accounts .iter() .enumerate() - .map(|(i, a)| { + .flat_map(|(i, a)| { vec![ // Reset the nonce by removing any funds construct_extrinsic( @@ -54,7 +54,7 @@ fn create_account_extrinsics(client: &Client, accounts: &[sr25519::Pair]) -> Vec SudoCall::sudo { call: Box::new( BalancesCall::force_set_balance { - who: AccountId::from(a.public()).into(), + who: AccountId::from(a.public()), new_free: 0, } .into(), @@ -69,7 +69,7 @@ fn create_account_extrinsics(client: &Client, accounts: &[sr25519::Pair]) -> Vec SudoCall::sudo { call: Box::new( BalancesCall::force_set_balance { - who: AccountId::from(a.public()).into(), + who: AccountId::from(a.public()), new_free: 1_000_000_000_000 * ExistentialDeposit::get(), } .into(), @@ -80,7 +80,6 @@ fn create_account_extrinsics(client: &Client, accounts: &[sr25519::Pair]) -> Vec ), ] }) - .flatten() .map(OpaqueExtrinsic::from) .collect() } @@ -92,20 +91,19 @@ fn create_benchmark_extrinsics( ) -> Vec { accounts .iter() - .map(|account| { + .flat_map(|account| { (0..extrinsics_per_account).map(move |nonce| { construct_extrinsic( client, BalancesCall::transfer_allow_death { - dest: Bob.to_account_id().into(), - value: 1 * ExistentialDeposit::get(), + dest: Bob.to_account_id(), + value: ExistentialDeposit::get(), }, account.clone(), Some(nonce as u32), ) }) }) - .flatten() .map(OpaqueExtrinsic::from) .collect() } @@ -208,27 +206,27 @@ fn transaction_throughput_benchmarks(c: &mut Criterion) { |b| { b.iter_batched( || { - let prepare_extrinsics = create_account_extrinsics(&*dave.client, &accounts); + let prepare_extrinsics = create_account_extrinsics(&dave.client, &accounts); benchmark_handle.block_on(future::join_all( prepare_extrinsics.into_iter().map(|tx| { submit_tx_and_wait_for_inclusion( &dave.transaction_pool, tx, - &*dave.client, + &dave.client, true, ) }), )); - create_benchmark_extrinsics(&*dave.client, &accounts, extrinsics_per_account) + create_benchmark_extrinsics(&dave.client, &accounts, extrinsics_per_account) }, |extrinsics| { benchmark_handle.block_on(future::join_all(extrinsics.into_iter().map(|tx| { submit_tx_and_wait_for_inclusion( &dave.transaction_pool, tx, - &*dave.client, + &dave.client, false, ) }))); diff --git a/test/service/src/chain_spec.rs b/test/service/src/chain_spec.rs index e1399e97a36..5ae77084b6c 100644 --- a/test/service/src/chain_spec.rs +++ b/test/service/src/chain_spec.rs @@ -39,7 +39,7 @@ pub struct GenesisExt { impl sp_runtime::BuildStorage for GenesisExt { fn assimilate_storage(&self, storage: &mut sp_core::storage::Storage) -> Result<(), String> { sp_state_machine::BasicExternalities::execute_with_storage(storage, || { - sp_io::storage::set(cumulus_test_runtime::TEST_RUNTIME_UPGRADE_KEY, &vec![1, 2, 3, 4]); + sp_io::storage::set(cumulus_test_runtime::TEST_RUNTIME_UPGRADE_KEY, &[1, 2, 3, 4]); cumulus_test_runtime::ParachainId::set(&self.para_id); }); @@ -125,7 +125,6 @@ fn testnet_genesis( code: cumulus_test_runtime::WASM_BINARY .expect("WASM binary was not build, please build it!") .to_vec(), - ..Default::default() }, parachain_system: Default::default(), balances: cumulus_test_runtime::BalancesConfig { diff --git a/test/service/src/lib.rs b/test/service/src/lib.rs index 662f04487aa..b24e71936a0 100644 --- a/test/service/src/lib.rs +++ b/test/service/src/lib.rs @@ -630,7 +630,7 @@ impl TestNodeBuilder { let parachain_config = node_config( self.storage_update_func_parachain.unwrap_or_else(|| Box::new(|| ())), self.tokio_handle.clone(), - self.key.clone(), + self.key, self.parachain_nodes, self.parachain_nodes_exclusive, self.para_id, @@ -667,7 +667,7 @@ impl TestNodeBuilder { .await .expect("could not create Cumulus test service"); - let peer_id = network.local_peer_id().clone(); + let peer_id = network.local_peer_id(); let addr = MultiaddrWithPeerId { multiaddr, peer_id }; TestNode { task_manager, client, network, addr, rpc_handlers, transaction_pool } @@ -690,7 +690,7 @@ pub fn node_config( is_collator: bool, ) -> Result { let base_path = BasePath::new_temp_dir()?; - let root = base_path.path().join(format!("cumulus_test_service_{}", key.to_string())); + let root = base_path.path().join(format!("cumulus_test_service_{}", key)); let role = if is_collator { Role::Authority } else { Role::Full }; let key_seed = key.to_seed(); let mut spec = Box::new(chain_spec::get_chain_spec(para_id)); @@ -786,7 +786,7 @@ impl TestNode { function: impl Into, caller: Sr25519Keyring, ) -> Result { - let extrinsic = construct_extrinsic(&*self.client, function, caller.pair(), Some(0)); + let extrinsic = construct_extrinsic(&self.client, function, caller.pair(), Some(0)); self.rpc_handlers.send_transaction(extrinsic.into()).await } From 0aae05bfe3c7cdc49c9a2a1ed3df62da593221cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 May 2023 14:30:15 +0000 Subject: [PATCH 168/339] Bump serde from 1.0.160 to 1.0.162 (#2534) Bumps [serde](https://github.com/serde-rs/serde) from 1.0.160 to 1.0.162. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.160...1.0.162) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: parity-processbot <> --- Cargo.lock | 8 ++++---- client/relay-chain-rpc-interface/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3bb509f77b2..99c1a4e512c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12201,18 +12201,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6" dependencies = [ "proc-macro2", "quote", diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index b23ef658f75..962377874c1 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -31,5 +31,5 @@ tracing = "0.1.37" async-trait = "0.1.68" url = "2.3.1" serde_json = "1.0.96" -serde = "1.0.160" +serde = "1.0.162" lru = "0.9.0" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index a1734127c11..3ded5c15bf7 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -13,7 +13,7 @@ build = "build.rs" clap = { version = "4.2.7", features = ["derive"] } log = "0.4.17" codec = { package = "parity-scale-codec", version = "3.0.0" } -serde = { version = "1.0.160", features = ["derive"] } +serde = { version = "1.0.162", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } # Local diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index 4f7338a8e81..d8cce46eadd 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.160", optional = true, features = ["derive"] } +serde = { version = "1.0.162", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 3b42507b1da..0412e56112c 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.160", optional = true, features = ["derive"] } +serde = { version = "1.0.162", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 5722136abb0..adcc2c02813 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.160", optional = true, features = ["derive"] } +serde = { version = "1.0.162", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 7dc9d6e27f0..78f5fc83dab 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -17,7 +17,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" log = "0.4.17" -serde = { version = "1.0.160", features = ["derive"] } +serde = { version = "1.0.162", features = ["derive"] } # Local rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parachain" } diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index d36ae55688d..4f0fc627bad 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -15,7 +15,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.4.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" -serde = { version = "1.0.160", features = ["derive"] } +serde = { version = "1.0.162", features = ["derive"] } tokio = { version = "1.28.0", features = ["macros"] } tracing = "0.1.37" url = "2.3.1" From 8904a44b96ed11cb539d4216d8a792ee6ea64e1e Mon Sep 17 00:00:00 2001 From: Bulat Saifullin Date: Sun, 7 May 2023 20:45:52 +0100 Subject: [PATCH 169/339] Update westmint bootnodes (#2521) Co-authored-by: parity-processbot <> --- parachains/chain-specs/westmint.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/parachains/chain-specs/westmint.json b/parachains/chain-specs/westmint.json index 3516fbfaa56..a700e5ddd61 100644 --- a/parachains/chain-specs/westmint.json +++ b/parachains/chain-specs/westmint.json @@ -3,10 +3,10 @@ "id": "westmint", "chainType": "Live", "bootNodes": [ - "/ip4/35.204.21.205/tcp/30334/p2p/12D3KooWLjaXWhNTSiRVFbTJCKLRWt9XXHLGVnAFtxvnExKkVPqn", - "/ip4/34.141.171.170/tcp/30334/p2p/12D3KooWBNy2Jdrjv2P7sdfb1mzH1AGzwjip5rW4N2Ft1T3Hdq5c", - "/ip4/34.141.221.252/tcp/30334/p2p/12D3KooWC9YYdjQLwxTNVda6t4nmjAZG37gaRZLNi4Zuhr9xUveW", - "/ip4/34.90.92.174/tcp/30334/p2p/12D3KooWQcXpUyVqwC2zJkwECCC7ttLCUCLTjnbGxTVfhSgmH2sD", + "/dns/westend-westmint-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWJaAfPyiye7ZQBuHengTJJoMrcaz7Jj1UzHiKdNxA1Nkd", + "/dns/westend-westmint-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWGL3hpWycWyeqyL9gHNnmmsL474WkPZdqraBHu4L6fQrW", + "/dns/westend-westmint-collator-node-2.parity-testnet.parity.io./tcp/30333/p2p/12D3KooWBkKDWhHzu6Hhe492adEpVV7wzuaWGxUfEnr6g5JCr7Gr", + "/dns/westend-westmint-collator-node-3.parity-testnet.parity.io./tcp/30333/p2p/12D3KooWMGpzCmhD6np6eKqxL7AAunKn1dN86Dr7a9E2xgZ2rt6G", "/dns/boot.stake.plus/tcp/33333/p2p/12D3KooWNiB27rpXX7EYongoWWUeRKzLQxWGms6MQU2B9LX7Ztzo", "/dns/boot.stake.plus/tcp/33334/wss/p2p/12D3KooWNiB27rpXX7EYongoWWUeRKzLQxWGms6MQU2B9LX7Ztzo", "/dns/boot.metaspan.io/tcp/36052/p2p/12D3KooWBCqfNb6Y39DXTr4UBWXyjuS3hcZM1qTbHhDXxF6HkAJJ", @@ -49,4 +49,4 @@ "childrenDefault": {} } } -} \ No newline at end of file +} From 35a443d0c62abedd452343beebb0ce08a0d73123 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Sun, 7 May 2023 23:46:00 +0200 Subject: [PATCH 170/339] companion for #14088 (#2539) * companion for #14088 * update lockfile for {"substrate", "polkadot"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 516 ++++++++++++++++++++-------------------- test/service/src/lib.rs | 1 + 2 files changed, 259 insertions(+), 258 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 99c1a4e512c..5c5386ec04c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,7 +585,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "hash-db", "log", @@ -3761,7 +3761,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", ] @@ -3784,7 +3784,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-support-procedural", @@ -3809,7 +3809,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3856,7 +3856,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3867,7 +3867,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3884,7 +3884,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -3913,7 +3913,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-recursion", "futures", @@ -3933,7 +3933,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "bitflags", "environmental", @@ -3966,7 +3966,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "Inflector", "cfg-expr", @@ -3982,7 +3982,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3994,7 +3994,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "proc-macro2", "quote", @@ -4004,7 +4004,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "log", @@ -4022,7 +4022,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -4037,7 +4037,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "sp-api", @@ -4046,7 +4046,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "parity-scale-codec", @@ -5063,7 +5063,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bitvec", "frame-benchmarking", @@ -5161,7 +5161,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "frame-support", "polkadot-primitives", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "futures", "log", @@ -6034,7 +6034,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "anyhow", "jsonrpsee", @@ -6539,7 +6539,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6560,7 +6560,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -6578,7 +6578,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -6593,7 +6593,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -6609,7 +6609,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -6625,7 +6625,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -6639,7 +6639,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6683,7 +6683,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -6698,7 +6698,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -6717,7 +6717,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6741,7 +6741,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -6847,7 +6847,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -6891,7 +6891,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -6908,7 +6908,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "bitflags", "environmental", @@ -6938,7 +6938,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "bitflags", "parity-scale-codec", @@ -6951,7 +6951,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "proc-macro2", "quote", @@ -6961,7 +6961,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6978,7 +6978,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -6996,7 +6996,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7019,7 +7019,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7032,7 +7032,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7050,7 +7050,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7068,7 +7068,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7091,7 +7091,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7107,7 +7107,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7127,7 +7127,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7144,7 +7144,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -7158,7 +7158,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7175,7 +7175,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7192,7 +7192,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7208,7 +7208,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7226,7 +7226,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "pallet-nfts", @@ -7237,7 +7237,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -7270,7 +7270,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7290,7 +7290,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7301,7 +7301,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -7318,7 +7318,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7342,7 +7342,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7359,7 +7359,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7374,7 +7374,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7392,7 +7392,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7407,7 +7407,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7426,7 +7426,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7443,7 +7443,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -7464,7 +7464,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7480,7 +7480,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -7494,7 +7494,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7517,7 +7517,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7528,7 +7528,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "log", "sp-arithmetic", @@ -7537,7 +7537,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "sp-api", @@ -7546,7 +7546,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7563,7 +7563,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -7592,7 +7592,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7610,7 +7610,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7629,7 +7629,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-support", "frame-system", @@ -7645,7 +7645,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7661,7 +7661,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7673,7 +7673,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7690,7 +7690,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7705,7 +7705,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7721,7 +7721,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7736,7 +7736,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-benchmarking", "frame-support", @@ -7751,7 +7751,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7772,7 +7772,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "frame-benchmarking", "frame-support", @@ -8350,7 +8350,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8366,7 +8366,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8380,7 +8380,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "derive_more", "fatality", @@ -8403,7 +8403,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "fatality", "futures", @@ -8424,7 +8424,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8453,7 +8453,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "async-trait", "frame-benchmarking", @@ -8496,7 +8496,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "always-assert", "bitvec", @@ -8518,7 +8518,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "parity-scale-codec", "scale-info", @@ -8530,7 +8530,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "derive_more", "fatality", @@ -8555,7 +8555,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8569,7 +8569,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "futures", "futures-timer", @@ -8589,7 +8589,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "always-assert", "async-trait", @@ -8612,7 +8612,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "futures", "parity-scale-codec", @@ -8630,7 +8630,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bitvec", "derive_more", @@ -8659,7 +8659,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bitvec", "futures", @@ -8680,7 +8680,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bitvec", "fatality", @@ -8699,7 +8699,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8714,7 +8714,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "async-trait", "futures", @@ -8734,7 +8734,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "futures", "polkadot-node-metrics", @@ -8749,7 +8749,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "futures", "futures-timer", @@ -8766,7 +8766,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "fatality", "futures", @@ -8785,7 +8785,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "async-trait", "futures", @@ -8802,7 +8802,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bitvec", "fatality", @@ -8820,7 +8820,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "always-assert", "futures", @@ -8847,7 +8847,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "futures", "polkadot-node-primitives", @@ -8863,7 +8863,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "assert_matches", "cpu-time", @@ -8892,7 +8892,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "futures", "lru 0.9.0", @@ -8907,7 +8907,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "lazy_static", "log", @@ -8925,7 +8925,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bs58", "futures", @@ -8944,7 +8944,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "async-trait", "derive_more", @@ -8966,7 +8966,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bounded-vec", "futures", @@ -8988,7 +8988,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8998,7 +8998,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "async-trait", "futures", @@ -9016,7 +9016,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "async-trait", "derive_more", @@ -9039,7 +9039,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "async-trait", "derive_more", @@ -9072,7 +9072,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "async-trait", "futures", @@ -9095,7 +9095,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bounded-collections", "derive_more", @@ -9193,7 +9193,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9211,7 +9211,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9237,7 +9237,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9269,7 +9269,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bitvec", "frame-benchmarking", @@ -9363,7 +9363,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bitvec", "frame-benchmarking", @@ -9409,7 +9409,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "frame-support", "polkadot-primitives", @@ -9423,7 +9423,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bs58", "parity-scale-codec", @@ -9435,7 +9435,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bitflags", "bitvec", @@ -9479,7 +9479,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9589,7 +9589,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9610,7 +9610,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9620,7 +9620,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9645,7 +9645,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9706,7 +9706,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "frame-benchmarking", "frame-system", @@ -10479,7 +10479,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10565,7 +10565,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "frame-support", "polkadot-primitives", @@ -10812,7 +10812,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "log", "sp-core", @@ -10823,7 +10823,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "futures", @@ -10851,7 +10851,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "futures", "futures-timer", @@ -10874,7 +10874,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10889,7 +10889,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10908,7 +10908,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10919,7 +10919,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10959,7 +10959,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "fnv", "futures", @@ -10986,7 +10986,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "hash-db", "kvdb", @@ -11012,7 +11012,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "futures", @@ -11037,7 +11037,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "futures", @@ -11066,7 +11066,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "fork-tree", @@ -11102,7 +11102,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "futures", "jsonrpsee", @@ -11124,7 +11124,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11159,7 +11159,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "futures", "jsonrpsee", @@ -11178,7 +11178,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11191,7 +11191,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11231,7 +11231,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "finality-grandpa", "futures", @@ -11251,7 +11251,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "futures", @@ -11274,7 +11274,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11298,7 +11298,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11311,7 +11311,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "log", "sc-allocator", @@ -11324,7 +11324,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "anyhow", "cfg-if", @@ -11342,7 +11342,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "ansi_term", "futures", @@ -11358,7 +11358,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11373,7 +11373,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11418,7 +11418,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "cid", "futures", @@ -11438,7 +11438,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11466,7 +11466,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "ahash 0.8.2", "futures", @@ -11485,7 +11485,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11507,7 +11507,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11541,7 +11541,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11561,7 +11561,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11592,7 +11592,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "futures", "libp2p", @@ -11605,7 +11605,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11614,7 +11614,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "futures", "jsonrpsee", @@ -11645,7 +11645,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11664,7 +11664,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "http", "jsonrpsee", @@ -11679,7 +11679,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11705,7 +11705,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "directories", @@ -11771,7 +11771,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "log", "parity-scale-codec", @@ -11782,7 +11782,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "clap 4.2.7", "fs4", @@ -11798,7 +11798,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11817,7 +11817,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "futures", "libc", @@ -11836,7 +11836,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "chrono", "futures", @@ -11855,7 +11855,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "ansi_term", "atty", @@ -11886,7 +11886,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11897,7 +11897,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "futures", @@ -11924,7 +11924,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "futures", @@ -11938,7 +11938,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-channel", "futures", @@ -12419,7 +12419,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "enumn", "parity-scale-codec", @@ -12496,7 +12496,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "hash-db", "log", @@ -12516,7 +12516,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "Inflector", "blake2", @@ -12530,7 +12530,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "scale-info", @@ -12543,7 +12543,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "integer-sqrt", "num-traits", @@ -12557,7 +12557,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "scale-info", @@ -12570,7 +12570,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "sp-api", @@ -12582,7 +12582,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "futures", "log", @@ -12600,7 +12600,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "futures", @@ -12615,7 +12615,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "parity-scale-codec", @@ -12633,7 +12633,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "parity-scale-codec", @@ -12654,7 +12654,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12673,7 +12673,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "finality-grandpa", "log", @@ -12691,7 +12691,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "scale-info", @@ -12703,7 +12703,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12747,7 +12747,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "blake2b_simd", "byteorder", @@ -12761,7 +12761,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "proc-macro2", "quote", @@ -12772,7 +12772,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12781,7 +12781,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "proc-macro2", "quote", @@ -12791,7 +12791,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "environmental", "parity-scale-codec", @@ -12802,7 +12802,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12817,7 +12817,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "bytes", "ed25519", @@ -12843,7 +12843,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "lazy_static", "sp-core", @@ -12854,7 +12854,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "futures", "parity-scale-codec", @@ -12868,7 +12868,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12877,7 +12877,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12888,7 +12888,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12906,7 +12906,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "scale-info", @@ -12920,7 +12920,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "sp-api", "sp-core", @@ -12930,7 +12930,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "backtrace", "lazy_static", @@ -12940,7 +12940,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "rustc-hash", "serde", @@ -12950,7 +12950,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "either", "hash256-std-hasher", @@ -12972,7 +12972,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12990,7 +12990,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "Inflector", "proc-macro-crate", @@ -13002,7 +13002,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "serde", "serde_json", @@ -13011,7 +13011,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "scale-info", @@ -13025,7 +13025,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "scale-info", @@ -13038,7 +13038,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "hash-db", "log", @@ -13058,7 +13058,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "log", "parity-scale-codec", @@ -13076,12 +13076,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13094,7 +13094,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "futures-timer", @@ -13109,7 +13109,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "sp-std", @@ -13121,7 +13121,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "sp-api", "sp-runtime", @@ -13130,7 +13130,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "log", @@ -13146,7 +13146,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13169,7 +13169,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13186,7 +13186,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13197,7 +13197,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13211,7 +13211,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "parity-scale-codec", "scale-info", @@ -13546,7 +13546,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "platforms 2.0.0", ] @@ -13554,7 +13554,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13573,7 +13573,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "hyper", "log", @@ -13585,7 +13585,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "jsonrpsee", @@ -13598,7 +13598,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "jsonrpsee", "log", @@ -13617,7 +13617,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13643,7 +13643,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13653,7 +13653,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13664,7 +13664,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "ansi_term", "build-helper", @@ -13791,7 +13791,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "frame-support", "polkadot-primitives", @@ -14177,7 +14177,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14188,7 +14188,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14318,7 +14318,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc8a35079546efd12673294fc66b0143a1c5f468" +source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" dependencies = [ "async-trait", "clap 4.2.7", @@ -15251,7 +15251,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bitvec", "frame-benchmarking", @@ -15343,7 +15343,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "frame-support", "polkadot-primitives", @@ -15845,7 +15845,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "bounded-collections", "derivative", @@ -15861,7 +15861,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "frame-support", "frame-system", @@ -15882,7 +15882,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "environmental", "frame-benchmarking", @@ -15902,7 +15902,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#5e7103ddbade47af93d6b038cda88b89025a2073" +source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" dependencies = [ "Inflector", "proc-macro2", diff --git a/test/service/src/lib.rs b/test/service/src/lib.rs index b24e71936a0..5138a58bd80 100644 --- a/test/service/src/lib.rs +++ b/test/service/src/lib.rs @@ -753,6 +753,7 @@ pub fn node_config( rpc_max_response_size: Default::default(), rpc_id_provider: None, rpc_max_subs_per_conn: Default::default(), + rpc_port: 9945, prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, From c94d64cf27ac07a240ccaa6a9606c1d6405e3966 Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Mon, 8 May 2023 11:16:40 +0200 Subject: [PATCH 171/339] add set_invulnerables to SafeCallFilter (#2537) --- parachains/runtimes/assets/statemine/src/xcm_config.rs | 3 ++- parachains/runtimes/assets/westmint/src/xcm_config.rs | 3 ++- .../runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs | 3 ++- .../runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs | 3 ++- .../runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs | 3 ++- .../collectives/collectives-polkadot/src/xcm_config.rs | 3 ++- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index ac830e76408..76bc685fd9c 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -212,7 +212,8 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_desired_candidates { .. } | pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, + pallet_collator_selection::Call::leave_intent { .. } | + pallet_collator_selection::Call::set_invulnerables { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 53750a4a810..4b626fb8f30 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -206,7 +206,8 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_desired_candidates { .. } | pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, + pallet_collator_selection::Call::leave_intent { .. } | + pallet_collator_selection::Call::set_invulnerables { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs index f432a345b32..5957b2ebbae 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs @@ -144,7 +144,8 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_desired_candidates { .. } | pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, + pallet_collator_selection::Call::leave_intent { .. } | + pallet_collator_selection::Call::set_invulnerables { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs index 22b7edffffb..7b34b5e135b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs @@ -147,7 +147,8 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_desired_candidates { .. } | pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, + pallet_collator_selection::Call::leave_intent { .. } | + pallet_collator_selection::Call::set_invulnerables { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index 945d0636ac7..c8a4c42af0e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -167,7 +167,8 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_desired_candidates { .. } | pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, + pallet_collator_selection::Call::leave_intent { .. } | + pallet_collator_selection::Call::set_invulnerables { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index b54f6ede5f2..5bc781c6aae 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -151,7 +151,8 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_desired_candidates { .. } | pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. }, + pallet_collator_selection::Call::leave_intent { .. } | + pallet_collator_selection::Call::set_invulnerables { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | RuntimeCall::XcmpQueue(..) | From 6cba4b41a92d82ba50b7b588f8e73f9c6d96663f Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Mon, 8 May 2023 13:04:15 +0200 Subject: [PATCH 172/339] Substrate 13843 (Asset Freezing) Companion (#2437) * add migrations * fix pallet instancing in migration * migrate by instance * weights * remove migrations * update weights * update weights * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: muharem Co-authored-by: parity-processbot <> --- Cargo.lock | 382 +++++++++--------- .../statemine/src/weights/pallet_assets.rs | 69 ++++ .../statemint/src/weights/pallet_assets.rs | 69 ++++ .../westmint/src/weights/pallet_assets.rs | 69 ++++ 4 files changed, 398 insertions(+), 191 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c5386ec04c..d46e0c76000 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,7 +585,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "hash-db", "log", @@ -3761,7 +3761,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", ] @@ -3784,7 +3784,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-support-procedural", @@ -3809,7 +3809,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3856,7 +3856,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3867,7 +3867,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3884,7 +3884,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -3913,7 +3913,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-recursion", "futures", @@ -3933,7 +3933,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "bitflags", "environmental", @@ -3966,7 +3966,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "Inflector", "cfg-expr", @@ -3982,7 +3982,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3994,7 +3994,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "proc-macro2", "quote", @@ -4004,7 +4004,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "log", @@ -4022,7 +4022,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -4037,7 +4037,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "sp-api", @@ -4046,7 +4046,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "parity-scale-codec", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "futures", "log", @@ -6034,7 +6034,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "anyhow", "jsonrpsee", @@ -6539,7 +6539,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6560,7 +6560,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6578,7 +6578,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6593,7 +6593,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -6609,7 +6609,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -6625,7 +6625,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -6639,7 +6639,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6683,7 +6683,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6698,7 +6698,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -6717,7 +6717,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6741,7 +6741,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6847,7 +6847,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6891,7 +6891,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6908,7 +6908,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "bitflags", "environmental", @@ -6938,7 +6938,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "bitflags", "parity-scale-codec", @@ -6951,7 +6951,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "proc-macro2", "quote", @@ -6961,7 +6961,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6978,7 +6978,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6996,7 +6996,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7019,7 +7019,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7032,7 +7032,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7050,7 +7050,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7068,7 +7068,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7091,7 +7091,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7107,7 +7107,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7127,7 +7127,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7144,7 +7144,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -7158,7 +7158,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7175,7 +7175,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7192,7 +7192,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7208,7 +7208,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7226,7 +7226,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "pallet-nfts", @@ -7237,7 +7237,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -7270,7 +7270,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7290,7 +7290,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7301,7 +7301,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -7318,7 +7318,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7342,7 +7342,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7359,7 +7359,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7374,7 +7374,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7392,7 +7392,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7407,7 +7407,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7426,7 +7426,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7443,7 +7443,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -7464,7 +7464,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7480,7 +7480,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -7494,7 +7494,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7517,7 +7517,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7528,7 +7528,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "log", "sp-arithmetic", @@ -7537,7 +7537,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "sp-api", @@ -7546,7 +7546,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7563,7 +7563,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -7592,7 +7592,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7610,7 +7610,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7629,7 +7629,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-support", "frame-system", @@ -7645,7 +7645,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7661,7 +7661,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7673,7 +7673,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7690,7 +7690,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7705,7 +7705,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7721,7 +7721,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7736,7 +7736,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10812,7 +10812,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "log", "sp-core", @@ -10823,7 +10823,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "futures", @@ -10851,7 +10851,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "futures", "futures-timer", @@ -10874,7 +10874,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10889,7 +10889,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10908,7 +10908,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10919,7 +10919,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10959,7 +10959,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "fnv", "futures", @@ -10986,7 +10986,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "hash-db", "kvdb", @@ -11012,7 +11012,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "futures", @@ -11037,7 +11037,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "futures", @@ -11066,7 +11066,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "fork-tree", @@ -11102,7 +11102,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "futures", "jsonrpsee", @@ -11124,7 +11124,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11159,7 +11159,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "futures", "jsonrpsee", @@ -11178,7 +11178,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11191,7 +11191,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11231,7 +11231,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "finality-grandpa", "futures", @@ -11251,7 +11251,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "futures", @@ -11274,7 +11274,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11298,7 +11298,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11311,7 +11311,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "log", "sc-allocator", @@ -11324,7 +11324,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "anyhow", "cfg-if", @@ -11342,7 +11342,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "ansi_term", "futures", @@ -11358,7 +11358,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11373,7 +11373,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11418,7 +11418,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "cid", "futures", @@ -11438,7 +11438,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11466,7 +11466,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "ahash 0.8.2", "futures", @@ -11485,7 +11485,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11507,7 +11507,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11541,7 +11541,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11561,7 +11561,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11592,7 +11592,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "futures", "libp2p", @@ -11605,7 +11605,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11614,7 +11614,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "futures", "jsonrpsee", @@ -11645,7 +11645,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11664,7 +11664,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "http", "jsonrpsee", @@ -11679,7 +11679,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11705,7 +11705,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "directories", @@ -11771,7 +11771,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "log", "parity-scale-codec", @@ -11782,7 +11782,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "clap 4.2.7", "fs4", @@ -11798,7 +11798,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11817,7 +11817,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "futures", "libc", @@ -11836,7 +11836,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "chrono", "futures", @@ -11855,7 +11855,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "ansi_term", "atty", @@ -11886,7 +11886,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11897,7 +11897,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "futures", @@ -11924,7 +11924,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "futures", @@ -11938,7 +11938,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-channel", "futures", @@ -12496,7 +12496,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "hash-db", "log", @@ -12516,7 +12516,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "Inflector", "blake2", @@ -12530,7 +12530,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "scale-info", @@ -12543,7 +12543,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "integer-sqrt", "num-traits", @@ -12557,7 +12557,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "scale-info", @@ -12570,7 +12570,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "sp-api", @@ -12582,7 +12582,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "futures", "log", @@ -12600,7 +12600,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "futures", @@ -12615,7 +12615,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "parity-scale-codec", @@ -12633,7 +12633,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "parity-scale-codec", @@ -12654,7 +12654,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12673,7 +12673,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "finality-grandpa", "log", @@ -12691,7 +12691,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "scale-info", @@ -12703,7 +12703,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12747,7 +12747,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "blake2b_simd", "byteorder", @@ -12761,7 +12761,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "proc-macro2", "quote", @@ -12772,7 +12772,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12781,7 +12781,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "proc-macro2", "quote", @@ -12791,7 +12791,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "environmental", "parity-scale-codec", @@ -12802,7 +12802,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12817,7 +12817,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "bytes", "ed25519", @@ -12843,7 +12843,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "lazy_static", "sp-core", @@ -12854,7 +12854,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "futures", "parity-scale-codec", @@ -12868,7 +12868,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12877,7 +12877,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12888,7 +12888,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12906,7 +12906,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "scale-info", @@ -12920,7 +12920,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "sp-api", "sp-core", @@ -12930,7 +12930,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "backtrace", "lazy_static", @@ -12940,7 +12940,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "rustc-hash", "serde", @@ -12950,7 +12950,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "either", "hash256-std-hasher", @@ -12972,7 +12972,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12990,7 +12990,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "Inflector", "proc-macro-crate", @@ -13002,7 +13002,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "serde", "serde_json", @@ -13011,7 +13011,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "scale-info", @@ -13025,7 +13025,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "scale-info", @@ -13038,7 +13038,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "hash-db", "log", @@ -13058,7 +13058,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "log", "parity-scale-codec", @@ -13076,12 +13076,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13094,7 +13094,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "futures-timer", @@ -13109,7 +13109,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "sp-std", @@ -13121,7 +13121,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "sp-api", "sp-runtime", @@ -13130,7 +13130,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "log", @@ -13146,7 +13146,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13169,7 +13169,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13186,7 +13186,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13197,7 +13197,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13211,7 +13211,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "parity-scale-codec", "scale-info", @@ -13546,7 +13546,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "platforms 2.0.0", ] @@ -13554,7 +13554,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13573,7 +13573,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "hyper", "log", @@ -13585,7 +13585,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "jsonrpsee", @@ -13598,7 +13598,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "jsonrpsee", "log", @@ -13617,7 +13617,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13643,7 +13643,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13653,7 +13653,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13664,7 +13664,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "ansi_term", "build-helper", @@ -14318,7 +14318,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#529e24ab7762f6d225aa383902cd6886cff20989" +source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" dependencies = [ "async-trait", "clap 4.2.7", diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs index 94957ff84fa..29a01e5bb9a 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs @@ -441,4 +441,73 @@ impl pallet_assets::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn touch() -> Weight { + // Proof Size summary in bytes: + // Measured: `453` + // Estimated: `3675` + // Minimum execution time: 37_468_000 picoseconds. + Weight::from_parts(37_957_000, 3675) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + fn touch_other() -> Weight { + // Proof Size summary in bytes: + // Measured: `351` + // Estimated: `3675` + // Minimum execution time: 383_408_000 picoseconds. + Weight::from_parts(392_036_000, 3675) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn refund() -> Weight { + // Proof Size summary in bytes: + // Measured: `579` + // Estimated: `3675` + // Minimum execution time: 34_066_000 picoseconds. + Weight::from_parts(34_347_000, 3675) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + fn refund_other() -> Weight { + // Proof Size summary in bytes: + // Measured: `510` + // Estimated: `3675` + // Minimum execution time: 32_060_000 picoseconds. + Weight::from_parts(32_519_000, 3675) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: Assets Asset (r:1 w:0) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + fn block() -> Weight { + // Proof Size summary in bytes: + // Measured: `459` + // Estimated: `3675` + // Minimum execution time: 115_000_000 picoseconds. + Weight::from_parts(163_000_000, 3675) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs index 933dcb4d3af..d7f390194af 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs @@ -447,4 +447,73 @@ impl pallet_assets::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn touch() -> Weight { + // Proof Size summary in bytes: + // Measured: `453` + // Estimated: `3675` + // Minimum execution time: 37_468_000 picoseconds. + Weight::from_parts(37_957_000, 3675) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + fn touch_other() -> Weight { + // Proof Size summary in bytes: + // Measured: `351` + // Estimated: `3675` + // Minimum execution time: 383_408_000 picoseconds. + Weight::from_parts(392_036_000, 3675) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn refund() -> Weight { + // Proof Size summary in bytes: + // Measured: `579` + // Estimated: `3675` + // Minimum execution time: 34_066_000 picoseconds. + Weight::from_parts(34_347_000, 3675) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + fn refund_other() -> Weight { + // Proof Size summary in bytes: + // Measured: `510` + // Estimated: `3675` + // Minimum execution time: 32_060_000 picoseconds. + Weight::from_parts(32_519_000, 3675) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: Assets Asset (r:1 w:0) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + fn block() -> Weight { + // Proof Size summary in bytes: + // Measured: `459` + // Estimated: `3675` + // Minimum execution time: 115_000_000 picoseconds. + Weight::from_parts(163_000_000, 3675) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs index f08633cd2ba..75518b3ef41 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs @@ -443,4 +443,73 @@ impl pallet_assets::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn touch() -> Weight { + // Proof Size summary in bytes: + // Measured: `453` + // Estimated: `3675` + // Minimum execution time: 37_468_000 picoseconds. + Weight::from_parts(37_957_000, 3675) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + fn touch_other() -> Weight { + // Proof Size summary in bytes: + // Measured: `351` + // Estimated: `3675` + // Minimum execution time: 383_408_000 picoseconds. + Weight::from_parts(392_036_000, 3675) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn refund() -> Weight { + // Proof Size summary in bytes: + // Measured: `579` + // Estimated: `3675` + // Minimum execution time: 34_066_000 picoseconds. + Weight::from_parts(34_347_000, 3675) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + fn refund_other() -> Weight { + // Proof Size summary in bytes: + // Measured: `510` + // Estimated: `3675` + // Minimum execution time: 32_060_000 picoseconds. + Weight::from_parts(32_519_000, 3675) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: Assets Asset (r:1 w:0) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + fn block() -> Weight { + // Proof Size summary in bytes: + // Measured: `459` + // Estimated: `3675` + // Minimum execution time: 115_000_000 picoseconds. + Weight::from_parts(163_000_000, 3675) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } } From 97984e44bbb70c1da3a10d75893cda3bc4fd9111 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Mon, 8 May 2023 17:20:20 +0200 Subject: [PATCH 173/339] Prevent name clash with Substrate Pallet Template (#2536) * Remove cumulus template pallet Signed-off-by: Oliver Tale-Yazdi * Use substrate template pallet Signed-off-by: Oliver Tale-Yazdi * Update Cargo.lock Signed-off-by: Oliver Tale-Yazdi * Revert back to master Revert "Remove cumulus template pallet" This reverts commit a6d3566e52e9124c0e9823c12cacea557187c6b4. Revert "Use substrate template pallet" This reverts commit fbb8eea28dec5b75e13823762572d24bd9a4b88f. Revert "Update Cargo.lock" This reverts commit ee24cb81e5d91d6b8f7ef0c97d0f0fdbfe857c53. Signed-off-by: Oliver Tale-Yazdi * pallet-template -> pallet-parachain-template Signed-off-by: Oliver Tale-Yazdi * Update Cargo.lock Signed-off-by: Oliver Tale-Yazdi --------- Signed-off-by: Oliver Tale-Yazdi --- Cargo.lock | 32 +++++++++---------- .../pallets/template/Cargo.toml | 2 +- .../pallets/template/src/benchmarking.rs | 2 +- .../pallets/template/src/mock.rs | 5 ++- parachain-template/runtime/Cargo.toml | 8 ++--- parachain-template/runtime/src/lib.rs | 6 ++-- 6 files changed, 27 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d46e0c76000..9358d81a038 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7339,6 +7339,21 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-parachain-template" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", +] + [[package]] name = "pallet-preimage" version = "4.0.0-dev" @@ -7574,21 +7589,6 @@ dependencies = [ "sp-std", ] -[[package]] -name = "pallet-template" -version = "0.1.0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", -] - [[package]] name = "pallet-timestamp" version = "4.0.0-dev" @@ -7879,9 +7879,9 @@ dependencies = [ "pallet-authorship", "pallet-balances", "pallet-collator-selection", + "pallet-parachain-template", "pallet-session", "pallet-sudo", - "pallet-template", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", diff --git a/parachain-template/pallets/template/Cargo.toml b/parachain-template/pallets/template/Cargo.toml index ca574f6c8d5..f47d82c9798 100644 --- a/parachain-template/pallets/template/Cargo.toml +++ b/parachain-template/pallets/template/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "pallet-template" +name = "pallet-parachain-template" authors = ["Anonymous"] description = "FRAME pallet template for defining custom runtime logic." version = "0.1.0" diff --git a/parachain-template/pallets/template/src/benchmarking.rs b/parachain-template/pallets/template/src/benchmarking.rs index fea9e65969b..8bba2a09867 100644 --- a/parachain-template/pallets/template/src/benchmarking.rs +++ b/parachain-template/pallets/template/src/benchmarking.rs @@ -1,4 +1,4 @@ -//! Benchmarking setup for pallet-template +//! Benchmarking setup for pallet-parachain-template use super::*; diff --git a/parachain-template/pallets/template/src/mock.rs b/parachain-template/pallets/template/src/mock.rs index 4a7ebac0fa8..099c0af8acd 100644 --- a/parachain-template/pallets/template/src/mock.rs +++ b/parachain-template/pallets/template/src/mock.rs @@ -1,4 +1,3 @@ -use crate as pallet_template; use frame_support::{parameter_types, traits::Everything}; use frame_system as system; use sp_core::H256; @@ -18,7 +17,7 @@ frame_support::construct_runtime!( UncheckedExtrinsic = UncheckedExtrinsic, { System: frame_system::{Pallet, Call, Config, Storage, Event}, - TemplateModule: pallet_template::{Pallet, Call, Storage, Event}, + TemplateModule: crate::{Pallet, Call, Storage, Event}, } ); @@ -54,7 +53,7 @@ impl system::Config for Test { type MaxConsumers = frame_support::traits::ConstU32<16>; } -impl pallet_template::Config for Test { +impl crate::Config for Test { type RuntimeEvent = RuntimeEvent; } diff --git a/parachain-template/runtime/Cargo.toml b/parachain-template/runtime/Cargo.toml index 81a4cf811a8..fefaffb032c 100644 --- a/parachain-template/runtime/Cargo.toml +++ b/parachain-template/runtime/Cargo.toml @@ -22,7 +22,7 @@ scale-info = { version = "2.6.0", default-features = false, features = ["derive" smallvec = "1.10.0" # Local -pallet-template = { path = "../pallets/template", default-features = false } +pallet-parachain-template = { path = "../pallets/template", default-features = false } # Substrate frame-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } @@ -99,7 +99,7 @@ std = [ "pallet-collator-selection/std", "pallet-session/std", "pallet-sudo/std", - "pallet-template/std", + "pallet-parachain-template/std", "pallet-timestamp/std", "pallet-transaction-payment-rpc-runtime-api/std", "pallet-transaction-payment/std", @@ -132,7 +132,7 @@ runtime-benchmarks = [ "frame-system/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", - "pallet-template/runtime-benchmarks", + "pallet-parachain-template/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-xcm/runtime-benchmarks", "sp-runtime/runtime-benchmarks", @@ -156,7 +156,7 @@ try-runtime = [ "pallet-collator-selection/try-runtime", "pallet-session/try-runtime", "pallet-sudo/try-runtime", - "pallet-template/try-runtime", + "pallet-parachain-template/try-runtime", "pallet-timestamp/try-runtime", "pallet-transaction-payment/try-runtime", "pallet-xcm/try-runtime", diff --git a/parachain-template/runtime/src/lib.rs b/parachain-template/runtime/src/lib.rs index 3c24b39d64d..7a847fc5118 100644 --- a/parachain-template/runtime/src/lib.rs +++ b/parachain-template/runtime/src/lib.rs @@ -58,7 +58,7 @@ use xcm::latest::prelude::BodyId; use xcm_executor::XcmExecutor; /// Import the template pallet. -pub use pallet_template; +pub use pallet_parachain_template; /// Alias to 512-bit hash when used in the context of a transaction signature on the chain. pub type Signature = MultiSignature; @@ -457,7 +457,7 @@ impl pallet_collator_selection::Config for Runtime { } /// Configure the pallet template in pallets/template. -impl pallet_template::Config for Runtime { +impl pallet_parachain_template::Config for Runtime { type RuntimeEvent = RuntimeEvent; } @@ -492,7 +492,7 @@ construct_runtime!( DmpQueue: cumulus_pallet_dmp_queue = 33, // Template - TemplatePallet: pallet_template = 40, + TemplatePallet: pallet_parachain_template = 40, } ); From 1ab6b2f4f157d5a1fc6631dd59e2c20dfd936e12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 May 2023 09:49:56 +0000 Subject: [PATCH 174/339] Bump quote from 1.0.26 to 1.0.27 (#2548) Bumps [quote](https://github.com/dtolnay/quote) from 1.0.26 to 1.0.27. - [Release notes](https://github.com/dtolnay/quote/releases) - [Commits](https://github.com/dtolnay/quote/compare/1.0.26...1.0.27) --- updated-dependencies: - dependency-name: quote dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- pallets/parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9358d81a038..667e7d0eefa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10105,9 +10105,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" dependencies = [ "proc-macro2", ] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index 2eb35fe4f0b..d32fd096999 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -11,7 +11,7 @@ proc-macro = true [dependencies] syn = "2.0.15" proc-macro2 = "1.0.54" -quote = "1.0.26" +quote = "1.0.27" proc-macro-crate = "1.3.1" [features] From e623cf170826a531a8fb1b6b839e6a7ce56e9c62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 May 2023 09:50:48 +0000 Subject: [PATCH 175/339] Bump array-bytes from 6.0.0 to 6.1.0 (#2549) Bumps [array-bytes](https://github.com/hack-ink/array-bytes) from 6.0.0 to 6.1.0. - [Release notes](https://github.com/hack-ink/array-bytes/releases) - [Changelog](https://github.com/hack-ink/array-bytes/blob/main/CHANGELOG) - [Commits](https://github.com/hack-ink/array-bytes/compare/v6.0.0...v6.1.0) --- updated-dependencies: - dependency-name: array-bytes dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- client/relay-chain-minimal-node/Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 667e7d0eefa..a094272eb97 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -263,9 +263,9 @@ checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" [[package]] name = "array-bytes" -version = "6.0.0" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f72e9d6fac4bc80778ea470b20197b88d28c292bb7d60c3fb099280003cd19" +checksum = "d9b1c5a481ec30a5abd8dfbd94ab5cf1bb4e9a66be7f1b3b322f2f1170c200fd" [[package]] name = "arrayref" @@ -2674,7 +2674,7 @@ dependencies = [ name = "cumulus-relay-chain-minimal-node" version = "0.1.0" dependencies = [ - "array-bytes 6.0.0", + "array-bytes 6.1.0", "async-trait", "cumulus-primitives-core", "cumulus-relay-chain-interface", diff --git a/client/relay-chain-minimal-node/Cargo.toml b/client/relay-chain-minimal-node/Cargo.toml index 17ad78f3c85..e9552e382fb 100644 --- a/client/relay-chain-minimal-node/Cargo.toml +++ b/client/relay-chain-minimal-node/Cargo.toml @@ -37,7 +37,7 @@ cumulus-relay-chain-interface = { path = "../relay-chain-interface" } cumulus-relay-chain-rpc-interface = { path = "../relay-chain-rpc-interface" } cumulus-primitives-core = { path = "../../primitives/core" } -array-bytes = "6.0" +array-bytes = "6.1" lru = "0.9" tracing = "0.1.37" async-trait = "0.1.68" From 859604a8d175dfdccf540bf61401412159da1dd9 Mon Sep 17 00:00:00 2001 From: Muharem Ismailov Date: Wed, 10 May 2023 09:31:01 +0200 Subject: [PATCH 176/339] Collectives: xcm base weights (#2550) --- .../collectives-polkadot/src/xcm_config.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index 5bc781c6aae..3311b819c8f 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -101,8 +101,11 @@ pub type XcmOriginToTransactDispatchOrigin = ( ); parameter_types! { - // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. - pub UnitWeightCost: Weight = Weight::from_parts(1_000_000_000, 64 * 1024); + /// The amount of weight an XCM operation takes. This is a safe overestimate. + pub const BaseXcmWeight: Weight = Weight::from_parts(1_000_000_000, 1024); + /// A temporary weight value for each XCM instruction. + /// NOTE: This should be removed after we account for PoV weights. + pub const TempFixedXcmWeight: Weight = Weight::from_parts(1_000_000_000, 0); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; // Fellows pluralistic body. @@ -225,7 +228,7 @@ impl xcm_executor::Config for XcmConfig { type IsTeleporter = ConcreteNativeAssetFrom; type UniversalLocation = UniversalLocation; type Barrier = Barrier; - type Weigher = FixedWeightBounds; + type Weigher = FixedWeightBounds; type Trader = UsingComponents>; type ResponseHandler = PolkadotXcm; @@ -276,7 +279,7 @@ impl pallet_xcm::Config for Runtime { type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. - type Weigher = FixedWeightBounds; + type Weigher = FixedWeightBounds; type UniversalLocation = UniversalLocation; type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; From 94d56a7e858e48ab071bd8dd2a34932d8db85f14 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Thu, 11 May 2023 08:22:19 +0200 Subject: [PATCH 177/339] [Backport] weights from 9420 (#2562) * [benchmarks] Update weights for collectives (#2532) * [benchmarks] pr with weights * bump zombienet version (#2525) * bump zombienet version * fix para registration args --------- Co-authored-by: paritytech-ci Co-authored-by: Javier Viola * [benchmarks] Update weights for bridge-hubs (#2533) * [benchmarks] pr with weights * bump zombienet version (#2525) * bump zombienet version * fix para registration args --------- Co-authored-by: paritytech-ci Co-authored-by: Javier Viola * [benchmarks] Update weights for statemine/t (#2535) * [benchmarks] pr with weights * bump zombienet version (#2525) * bump zombienet version * fix para registration args --------- Co-authored-by: paritytech-ci Co-authored-by: Javier Viola --------- Co-authored-by: Paritytech CI <52199148+paritytech-ci@users.noreply.github.com> Co-authored-by: paritytech-ci Co-authored-by: Javier Viola --- .../src/weights/cumulus_pallet_xcmp_queue.rs | 13 +- .../statemine/src/weights/frame_system.rs | 49 +-- .../statemine/src/weights/pallet_balances.rs | 52 +-- .../src/weights/pallet_collator_selection.rs | 65 ++-- .../statemine/src/weights/pallet_multisig.rs | 75 ++-- .../statemine/src/weights/pallet_nfts.rs | 317 +++++++++-------- .../statemine/src/weights/pallet_proxy.rs | 117 +++---- .../statemine/src/weights/pallet_session.rs | 21 +- .../statemine/src/weights/pallet_timestamp.rs | 17 +- .../statemine/src/weights/pallet_uniques.rs | 201 +++++------ .../statemine/src/weights/pallet_utility.rs | 37 +- .../statemine/src/weights/pallet_xcm.rs | 87 ++--- .../xcm/pallet_xcm_benchmarks_fungible.rs | 36 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 130 +++---- .../src/weights/cumulus_pallet_xcmp_queue.rs | 13 +- .../statemint/src/weights/frame_system.rs | 47 +-- .../statemint/src/weights/pallet_assets.rs | 219 ++++++------ .../statemint/src/weights/pallet_balances.rs | 52 +-- .../src/weights/pallet_collator_selection.rs | 65 ++-- .../statemint/src/weights/pallet_multisig.rs | 75 ++-- .../statemint/src/weights/pallet_proxy.rs | 117 +++---- .../statemint/src/weights/pallet_session.rs | 21 +- .../statemint/src/weights/pallet_timestamp.rs | 17 +- .../statemint/src/weights/pallet_uniques.rs | 203 +++++------ .../statemint/src/weights/pallet_utility.rs | 37 +- .../statemint/src/weights/pallet_xcm.rs | 87 ++--- .../xcm/pallet_xcm_benchmarks_fungible.rs | 36 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 130 +++---- .../src/weights/cumulus_pallet_xcmp_queue.rs | 13 +- .../westmint/src/weights/frame_system.rs | 49 +-- .../westmint/src/weights/pallet_balances.rs | 52 +-- .../src/weights/pallet_collator_selection.rs | 65 ++-- .../westmint/src/weights/pallet_multisig.rs | 75 ++-- .../westmint/src/weights/pallet_nfts.rs | 313 ++++++++--------- .../westmint/src/weights/pallet_proxy.rs | 117 +++---- .../westmint/src/weights/pallet_session.rs | 21 +- .../westmint/src/weights/pallet_timestamp.rs | 17 +- .../westmint/src/weights/pallet_uniques.rs | 201 +++++------ .../westmint/src/weights/pallet_utility.rs | 37 +- .../assets/westmint/src/weights/pallet_xcm.rs | 91 ++--- .../xcm/pallet_xcm_benchmarks_fungible.rs | 36 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 130 +++---- .../src/weights/cumulus_pallet_xcmp_queue.rs | 15 +- .../src/weights/frame_system.rs | 47 +-- .../src/weights/pallet_balances.rs | 54 +-- .../src/weights/pallet_collator_selection.rs | 67 ++-- .../src/weights/pallet_multisig.rs | 77 ++--- .../src/weights/pallet_session.rs | 23 +- .../src/weights/pallet_timestamp.rs | 19 +- .../src/weights/pallet_utility.rs | 39 +-- .../src/weights/pallet_xcm.rs | 85 ++--- .../xcm/pallet_xcm_benchmarks_fungible.rs | 38 +-- .../xcm/pallet_xcm_benchmarks_generic.rs | 132 +++---- .../src/weights/cumulus_pallet_xcmp_queue.rs | 15 +- .../src/weights/frame_system.rs | 47 +-- .../src/weights/pallet_balances.rs | 54 +-- .../src/weights/pallet_collator_selection.rs | 67 ++-- .../src/weights/pallet_multisig.rs | 77 ++--- .../src/weights/pallet_session.rs | 23 +- .../src/weights/pallet_timestamp.rs | 19 +- .../src/weights/pallet_utility.rs | 39 +-- .../src/weights/pallet_xcm.rs | 85 ++--- .../xcm/pallet_xcm_benchmarks_fungible.rs | 38 +-- .../xcm/pallet_xcm_benchmarks_generic.rs | 132 +++---- .../src/weights/cumulus_pallet_xcmp_queue.rs | 15 +- .../src/weights/frame_system.rs | 47 +-- .../src/weights/pallet_balances.rs | 54 +-- .../src/weights/pallet_collator_selection.rs | 67 ++-- .../src/weights/pallet_multisig.rs | 77 ++--- .../src/weights/pallet_session.rs | 23 +- .../src/weights/pallet_timestamp.rs | 19 +- .../src/weights/pallet_utility.rs | 39 +-- .../src/weights/pallet_xcm.rs | 85 ++--- .../xcm/pallet_xcm_benchmarks_fungible.rs | 38 +-- .../xcm/pallet_xcm_benchmarks_generic.rs | 132 +++---- .../src/weights/cumulus_pallet_xcmp_queue.rs | 27 +- .../src/weights/frame_system.rs | 53 +-- .../src/weights/pallet_alliance.rs | 269 +++++++-------- .../src/weights/pallet_balances.rs | 54 +-- .../src/weights/pallet_collator_selection.rs | 67 ++-- .../src/weights/pallet_collective.rs | 201 +++++------ .../src/weights/pallet_multisig.rs | 91 ++--- .../src/weights/pallet_preimage.rs | 105 +++--- .../src/weights/pallet_proxy.rs | 119 +++---- .../src/weights/pallet_ranked_collective.rs | 126 ++++--- .../src/weights/pallet_referenda.rs | 323 +++++++++--------- .../src/weights/pallet_scheduler.rs | 135 ++++---- .../src/weights/pallet_session.rs | 23 +- .../src/weights/pallet_timestamp.rs | 19 +- .../src/weights/pallet_utility.rs | 39 +-- .../src/weights/pallet_xcm.rs | 125 +++---- 91 files changed, 3691 insertions(+), 3426 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs index 5cad45cc0b0..b19f8098775 100644 --- a/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_xcmp_queue`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_483_000 picoseconds. - Weight::from_parts(5_808_000, 0) + // Minimum execution time: 5_800_000 picoseconds. + Weight::from_parts(5_998_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_773_000 picoseconds. - Weight::from_parts(5_913_000, 0) + // Minimum execution time: 5_975_000 picoseconds. + Weight::from_parts(6_136_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/assets/statemine/src/weights/frame_system.rs b/parachains/runtimes/assets/statemine/src/weights/frame_system.rs index 4f0967e636d..c708b9f30f7 100644 --- a/parachains/runtimes/assets/statemine/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/statemine/src/weights/frame_system.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `frame_system`. pub struct WeightInfo(PhantomData); @@ -52,22 +53,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_146_000 picoseconds. - Weight::from_parts(2_194_000, 0) + // Minimum execution time: 2_296_000 picoseconds. + Weight::from_parts(2_354_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(368, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(365, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_732_000 picoseconds. - Weight::from_parts(8_001_000, 0) + // Minimum execution time: 7_949_000 picoseconds. + Weight::from_parts(8_091_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_403, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_397, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -77,8 +78,8 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 4_287_000 picoseconds. - Weight::from_parts(4_602_000, 0) + // Minimum execution time: 4_344_000 picoseconds. + Weight::from_parts(4_499_000, 0) .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -90,11 +91,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_319_000 picoseconds. - Weight::from_parts(2_401_000, 0) + // Minimum execution time: 2_562_000 picoseconds. + Weight::from_parts(2_599_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_933 - .saturating_add(Weight::from_parts(669_111, 0).saturating_mul(i.into())) + // Standard Error: 1_882 + .saturating_add(Weight::from_parts(660_746, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +105,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_381_000 picoseconds. - Weight::from_parts(2_405_000, 0) + // Minimum execution time: 2_423_000 picoseconds. + Weight::from_parts(2_466_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 779 - .saturating_add(Weight::from_parts(492_780, 0).saturating_mul(i.into())) + // Standard Error: 775 + .saturating_add(Weight::from_parts(486_467, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -117,12 +118,12 @@ impl frame_system::WeightInfo for WeightInfo { fn kill_prefix(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `84 + p * (69 ±0)` - // Estimated: `75 + p * (70 ±0)` - // Minimum execution time: 4_204_000 picoseconds. - Weight::from_parts(4_269_000, 0) - .saturating_add(Weight::from_parts(0, 75)) - // Standard Error: 1_101 - .saturating_add(Weight::from_parts(1_014_807, 0).saturating_mul(p.into())) + // Estimated: `77 + p * (70 ±0)` + // Minimum execution time: 4_216_000 picoseconds. + Weight::from_parts(4_281_000, 0) + .saturating_add(Weight::from_parts(0, 77)) + // Standard Error: 953 + .saturating_add(Weight::from_parts(1_023_931, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs index 2d3be9da403..3842783d98c 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_balances`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 34_132_000 picoseconds. - Weight::from_parts(34_669_000, 0) + // Minimum execution time: 54_579_000 picoseconds. + Weight::from_parts(55_271_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 25_052_000 picoseconds. - Weight::from_parts(25_681_000, 0) + // Minimum execution time: 41_342_000 picoseconds. + Weight::from_parts(41_759_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -77,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 15_072_000 picoseconds. - Weight::from_parts(15_451_000, 0) + // Minimum execution time: 16_403_000 picoseconds. + Weight::from_parts(16_651_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -89,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 18_416_000 picoseconds. - Weight::from_parts(18_742_000, 0) + // Minimum execution time: 23_225_000 picoseconds. + Weight::from_parts(23_577_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -101,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 36_626_000 picoseconds. - Weight::from_parts(37_176_000, 0) + // Minimum execution time: 56_084_000 picoseconds. + Weight::from_parts(56_374_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -113,25 +114,38 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 31_008_000 picoseconds. - Weight::from_parts(31_562_000, 0) + // Minimum execution time: 50_374_000 picoseconds. + Weight::from_parts(52_040_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - fn upgrade_accounts(_: u32) -> Weight { - Weight::from_parts(0, 0) - } fn force_unreserve() -> Weight { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 14_214_000 picoseconds. - Weight::from_parts(14_535_000, 0) + // Minimum execution time: 18_975_000 picoseconds. + Weight::from_parts(19_317_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: System Account (r:999 w:999) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 18_579_000 picoseconds. + Weight::from_parts(18_668_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 9_111 + .saturating_add(Weight::from_parts(14_381_916, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs index 6165f030031..b3a9fa52bd8 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_collator_selection`. pub struct WeightInfo(PhantomData); @@ -56,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` // Estimated: `1168 + b * (2554 ±0)` - // Minimum execution time: 15_415_000 picoseconds. - Weight::from_parts(15_521_960, 0) + // Minimum execution time: 15_571_000 picoseconds. + Weight::from_parts(15_554_982, 0) .saturating_add(Weight::from_parts(0, 1168)) - // Standard Error: 3_294 - .saturating_add(Weight::from_parts(2_582_035, 0).saturating_mul(b.into())) + // Standard Error: 2_818 + .saturating_add(Weight::from_parts(2_610_335, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_363_000 picoseconds. - Weight::from_parts(7_715_000, 0) + // Minimum execution time: 7_816_000 picoseconds. + Weight::from_parts(8_030_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_516_000 picoseconds. - Weight::from_parts(7_860_000, 0) + // Minimum execution time: 8_077_000 picoseconds. + Weight::from_parts(8_293_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,12 +104,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `1108 + c * (48 ±0)` - // Estimated: `61671 + c * (49 ±0)` - // Minimum execution time: 38_063_000 picoseconds. - Weight::from_parts(30_924_306, 0) - .saturating_add(Weight::from_parts(0, 61671)) - // Standard Error: 1_232 - .saturating_add(Weight::from_parts(106_039, 0).saturating_mul(c.into())) + // Estimated: `49487 + c * (49 ±0)` + // Minimum execution time: 43_072_000 picoseconds. + Weight::from_parts(35_712_990, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_261 + .saturating_add(Weight::from_parts(112_854, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -122,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `452 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 29_598_000 picoseconds. - Weight::from_parts(19_372_924, 0) + // Minimum execution time: 35_372_000 picoseconds. + Weight::from_parts(26_886_289, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_253 - .saturating_add(Weight::from_parts(106_394, 0).saturating_mul(c.into())) + // Standard Error: 1_388 + .saturating_add(Weight::from_parts(106_632, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -139,10 +140,10 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn note_author() -> Weight { // Proof Size summary in bytes: // Measured: `103` - // Estimated: `7729` - // Minimum execution time: 28_647_000 picoseconds. - Weight::from_parts(28_951_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `6196` + // Minimum execution time: 44_209_000 picoseconds. + Weight::from_parts(44_590_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +161,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22721 + r * (116 ±0) + c * (97 ±0)` - // Estimated: `56697 + c * (2520 ±0) + r * (2602 ±0)` - // Minimum execution time: 17_043_000 picoseconds. - Weight::from_parts(17_352_000, 0) - .saturating_add(Weight::from_parts(0, 56697)) - // Standard Error: 798_735 - .saturating_add(Weight::from_parts(28_961_284, 0).saturating_mul(c.into())) + // Measured: `22721 + c * (97 ±0) + r * (116 ±0)` + // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` + // Minimum execution time: 17_397_000 picoseconds. + Weight::from_parts(17_600_000, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 897_810 + .saturating_add(Weight::from_parts(31_873_549, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) } } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs index 2e5f4b322f0..2753cea0a8f 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_multisig`. pub struct WeightInfo(PhantomData); @@ -52,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_992_000 picoseconds. - Weight::from_parts(12_412_280, 0) + // Minimum execution time: 12_303_000 picoseconds. + Weight::from_parts(12_695_362, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3 - .saturating_add(Weight::from_parts(503, 0).saturating_mul(z.into())) + // Standard Error: 1 + .saturating_add(Weight::from_parts(557, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -66,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `262 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 37_343_000 picoseconds. - Weight::from_parts(31_041_082, 0) + // Minimum execution time: 42_467_000 picoseconds. + Weight::from_parts(36_773_932, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 579 - .saturating_add(Weight::from_parts(68_564, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_253, 0).saturating_mul(z.into())) + // Standard Error: 459 + .saturating_add(Weight::from_parts(63_612, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_269, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -84,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 27_702_000 picoseconds. - Weight::from_parts(22_324_758, 0) + // Minimum execution time: 28_843_000 picoseconds. + Weight::from_parts(23_142_157, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 382 - .saturating_add(Weight::from_parts(59_647, 0).saturating_mul(s.into())) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_199, 0).saturating_mul(z.into())) + // Standard Error: 229 + .saturating_add(Weight::from_parts(63_362, 0).saturating_mul(s.into())) + // Standard Error: 2 + .saturating_add(Weight::from_parts(1_241, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,14 +104,14 @@ impl pallet_multisig::WeightInfo for WeightInfo { fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `385 + s * (33 ±0)` - // Estimated: `10404` - // Minimum execution time: 42_944_000 picoseconds. - Weight::from_parts(35_467_441, 0) - .saturating_add(Weight::from_parts(0, 10404)) - // Standard Error: 600 - .saturating_add(Weight::from_parts(80_406, 0).saturating_mul(s.into())) + // Estimated: `6811` + // Minimum execution time: 48_265_000 picoseconds. + Weight::from_parts(40_503_415, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 528 + .saturating_add(Weight::from_parts(85_941, 0).saturating_mul(s.into())) // Standard Error: 5 - .saturating_add(Weight::from_parts(1_220, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_281, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -121,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 27_997_000 picoseconds. - Weight::from_parts(30_250_714, 0) + // Minimum execution time: 32_680_000 picoseconds. + Weight::from_parts(34_368_418, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 709 - .saturating_add(Weight::from_parts(67_226, 0).saturating_mul(s.into())) + // Standard Error: 558 + .saturating_add(Weight::from_parts(72_172, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -136,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 19_821_000 picoseconds. - Weight::from_parts(20_670_152, 0) + // Minimum execution time: 19_571_000 picoseconds. + Weight::from_parts(20_887_762, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 470 - .saturating_add(Weight::from_parts(65_289, 0).saturating_mul(s.into())) + // Standard Error: 858 + .saturating_add(Weight::from_parts(64_869, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -151,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 28_820_000 picoseconds. - Weight::from_parts(31_182_331, 0) + // Minimum execution time: 32_681_000 picoseconds. + Weight::from_parts(34_919_059, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 874 - .saturating_add(Weight::from_parts(68_617, 0).saturating_mul(s.into())) + // Standard Error: 613 + .saturating_add(Weight::from_parts(72_149, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs index 8c4425114b1..3655836b0a0 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_nfts` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_nfts`. pub struct WeightInfo(PhantomData); @@ -60,10 +61,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn create() -> Weight { // Proof Size summary in bytes: // Measured: `145` - // Estimated: `5038` - // Minimum execution time: 34_100_000 picoseconds. - Weight::from_parts(34_649_000, 0) - .saturating_add(Weight::from_parts(0, 5038)) + // Estimated: `3549` + // Minimum execution time: 39_589_000 picoseconds. + Weight::from_parts(40_305_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -80,10 +81,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `5038` - // Minimum execution time: 22_415_000 picoseconds. - Weight::from_parts(22_808_000, 0) - .saturating_add(Weight::from_parts(0, 5038)) + // Estimated: `3549` + // Minimum execution time: 23_945_000 picoseconds. + Weight::from_parts(24_351_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -106,17 +107,15 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// The range of component `m` is `[0, 1000]`. /// The range of component `c` is `[0, 1000]`. /// The range of component `a` is `[0, 1000]`. - fn destroy(m: u32, _c: u32, a: u32, ) -> Weight { + fn destroy(_m: u32, _c: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `32170 + a * (366 ±0)` - // Estimated: `2538829 + a * (2954 ±0)` - // Minimum execution time: 978_514_000 picoseconds. - Weight::from_parts(915_478_956, 0) - .saturating_add(Weight::from_parts(0, 2538829)) - // Standard Error: 4_368 - .saturating_add(Weight::from_parts(3_621, 0).saturating_mul(m.into())) - // Standard Error: 4_368 - .saturating_add(Weight::from_parts(5_742_436, 0).saturating_mul(a.into())) + // Estimated: `2523990 + a * (2954 ±0)` + // Minimum execution time: 992_533_000 picoseconds. + Weight::from_parts(941_813_359, 0) + .saturating_add(Weight::from_parts(0, 2523990)) + // Standard Error: 3_954 + .saturating_add(Weight::from_parts(5_784_754, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(1004)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(1005)) @@ -138,10 +137,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn mint() -> Weight { // Proof Size summary in bytes: // Measured: `421` - // Estimated: `18460` - // Minimum execution time: 44_509_000 picoseconds. - Weight::from_parts(45_090_000, 0) - .saturating_add(Weight::from_parts(0, 18460)) + // Estimated: `4326` + // Minimum execution time: 49_305_000 picoseconds. + Weight::from_parts(50_143_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,10 +159,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn force_mint() -> Weight { // Proof Size summary in bytes: // Measured: `421` - // Estimated: `18460` - // Minimum execution time: 43_761_000 picoseconds. - Weight::from_parts(44_304_000, 0) - .saturating_add(Weight::from_parts(0, 18460)) + // Estimated: `4326` + // Minimum execution time: 48_627_000 picoseconds. + Weight::from_parts(48_954_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -186,10 +185,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn burn() -> Weight { // Proof Size summary in bytes: // Measured: `530` - // Estimated: `15200` - // Minimum execution time: 45_215_000 picoseconds. - Weight::from_parts(46_367_000, 0) - .saturating_add(Weight::from_parts(0, 15200)) + // Estimated: `4326` + // Minimum execution time: 49_958_000 picoseconds. + Weight::from_parts(50_387_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(7)) } @@ -210,10 +209,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `559` - // Estimated: `14926` - // Minimum execution time: 35_381_000 picoseconds. - Weight::from_parts(35_896_000, 0) - .saturating_add(Weight::from_parts(0, 14926)) + // Estimated: `4326` + // Minimum execution time: 36_267_000 picoseconds. + Weight::from_parts(36_712_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -227,12 +226,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `729 + i * (108 ±0)` - // Estimated: `8077 + i * (3336 ±0)` - // Minimum execution time: 16_621_000 picoseconds. - Weight::from_parts(16_839_000, 0) - .saturating_add(Weight::from_parts(0, 8077)) - // Standard Error: 13_184 - .saturating_add(Weight::from_parts(13_274_447, 0).saturating_mul(i.into())) + // Estimated: `3549 + i * (3336 ±0)` + // Minimum execution time: 17_738_000 picoseconds. + Weight::from_parts(17_801_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) + // Standard Error: 13_596 + .saturating_add(Weight::from_parts(15_695_790, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) @@ -245,10 +244,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn lock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `401` - // Estimated: `7047` - // Minimum execution time: 20_314_000 picoseconds. - Weight::from_parts(20_726_000, 0) - .saturating_add(Weight::from_parts(0, 7047)) + // Estimated: `3534` + // Minimum execution time: 20_845_000 picoseconds. + Weight::from_parts(21_133_000, 0) + .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -259,10 +258,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn unlock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `401` - // Estimated: `7047` - // Minimum execution time: 20_178_000 picoseconds. - Weight::from_parts(20_565_000, 0) - .saturating_add(Weight::from_parts(0, 7047)) + // Estimated: `3534` + // Minimum execution time: 20_862_000 picoseconds. + Weight::from_parts(21_105_000, 0) + .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -273,10 +272,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn lock_collection() -> Weight { // Proof Size summary in bytes: // Measured: `306` - // Estimated: `7087` - // Minimum execution time: 17_142_000 picoseconds. - Weight::from_parts(18_191_000, 0) - .saturating_add(Weight::from_parts(0, 7087)) + // Estimated: `3549` + // Minimum execution time: 18_196_000 picoseconds. + Weight::from_parts(18_333_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -289,10 +288,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn transfer_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `354` - // Estimated: `7066` - // Minimum execution time: 22_902_000 picoseconds. - Weight::from_parts(23_495_000, 0) - .saturating_add(Weight::from_parts(0, 7066)) + // Estimated: `3549` + // Minimum execution time: 24_025_000 picoseconds. + Weight::from_parts(24_277_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -303,10 +302,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_team() -> Weight { // Proof Size summary in bytes: // Measured: `335` - // Estimated: `9627` - // Minimum execution time: 41_436_000 picoseconds. - Weight::from_parts(41_922_000, 0) - .saturating_add(Weight::from_parts(0, 9627)) + // Estimated: `6078` + // Minimum execution time: 40_974_000 picoseconds. + Weight::from_parts(41_706_000, 0) + .saturating_add(Weight::from_parts(0, 6078)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -318,8 +317,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `277` // Estimated: `3549` - // Minimum execution time: 19_015_000 picoseconds. - Weight::from_parts(19_490_000, 0) + // Minimum execution time: 19_044_000 picoseconds. + Weight::from_parts(19_465_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) @@ -332,8 +331,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `242` // Estimated: `3549` - // Minimum execution time: 15_532_000 picoseconds. - Weight::from_parts(15_827_000, 0) + // Minimum execution time: 15_591_000 picoseconds. + Weight::from_parts(15_858_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -345,10 +344,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn lock_item_properties() -> Weight { // Proof Size summary in bytes: // Measured: `401` - // Estimated: `7047` - // Minimum execution time: 21_022_000 picoseconds. - Weight::from_parts(21_289_000, 0) - .saturating_add(Weight::from_parts(0, 7047)) + // Estimated: `3534` + // Minimum execution time: 20_831_000 picoseconds. + Weight::from_parts(21_121_000, 0) + .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -365,10 +364,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `505` - // Estimated: `18078` - // Minimum execution time: 47_283_000 picoseconds. - Weight::from_parts(47_793_000, 0) - .saturating_add(Weight::from_parts(0, 18078)) + // Estimated: `3944` + // Minimum execution time: 50_650_000 picoseconds. + Weight::from_parts(51_315_000, 0) + .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -379,10 +378,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn force_set_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `310` - // Estimated: `7493` - // Minimum execution time: 27_462_000 picoseconds. - Weight::from_parts(27_798_000, 0) - .saturating_add(Weight::from_parts(0, 7493)) + // Estimated: `3944` + // Minimum execution time: 28_244_000 picoseconds. + Weight::from_parts(28_627_000, 0) + .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -397,10 +396,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn clear_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `949` - // Estimated: `14540` - // Minimum execution time: 44_392_000 picoseconds. - Weight::from_parts(44_956_000, 0) - .saturating_add(Weight::from_parts(0, 14540)) + // Estimated: `3944` + // Minimum execution time: 47_299_000 picoseconds. + Weight::from_parts(47_921_000, 0) + .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -411,10 +410,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn approve_item_attributes() -> Weight { // Proof Size summary in bytes: // Measured: `347` - // Estimated: `8792` - // Minimum execution time: 18_619_000 picoseconds. - Weight::from_parts(18_970_000, 0) - .saturating_add(Weight::from_parts(0, 8792)) + // Estimated: `4466` + // Minimum execution time: 19_400_000 picoseconds. + Weight::from_parts(19_601_000, 0) + .saturating_add(Weight::from_parts(0, 4466)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -430,12 +429,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn cancel_item_attributes_approval(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `726 + n * (398 ±0)` - // Estimated: `16329 + n * (2954 ±0)` - // Minimum execution time: 28_293_000 picoseconds. - Weight::from_parts(28_502_000, 0) - .saturating_add(Weight::from_parts(0, 16329)) - // Standard Error: 4_215 - .saturating_add(Weight::from_parts(5_601_603, 0).saturating_mul(n.into())) + // Estimated: `4466 + n * (2954 ±0)` + // Minimum execution time: 28_552_000 picoseconds. + Weight::from_parts(28_822_000, 0) + .saturating_add(Weight::from_parts(0, 4466)) + // Standard Error: 3_265 + .saturating_add(Weight::from_parts(5_570_824, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) @@ -455,10 +454,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `505` - // Estimated: `17946` - // Minimum execution time: 39_371_000 picoseconds. - Weight::from_parts(39_852_000, 0) - .saturating_add(Weight::from_parts(0, 17946)) + // Estimated: `3812` + // Minimum execution time: 42_425_000 picoseconds. + Weight::from_parts(42_883_000, 0) + .saturating_add(Weight::from_parts(0, 3812)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -473,10 +472,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn clear_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `815` - // Estimated: `14408` - // Minimum execution time: 37_535_000 picoseconds. - Weight::from_parts(38_894_000, 0) - .saturating_add(Weight::from_parts(0, 14408)) + // Estimated: `3812` + // Minimum execution time: 40_219_000 picoseconds. + Weight::from_parts(41_709_000, 0) + .saturating_add(Weight::from_parts(0, 3812)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -491,10 +490,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `364` - // Estimated: `14380` - // Minimum execution time: 35_608_000 picoseconds. - Weight::from_parts(35_741_000, 0) - .saturating_add(Weight::from_parts(0, 14380)) + // Estimated: `3759` + // Minimum execution time: 39_376_000 picoseconds. + Weight::from_parts(39_895_000, 0) + .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -509,10 +508,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `682` - // Estimated: `14380` - // Minimum execution time: 33_234_000 picoseconds. - Weight::from_parts(33_617_000, 0) - .saturating_add(Weight::from_parts(0, 14380)) + // Estimated: `3759` + // Minimum execution time: 38_414_000 picoseconds. + Weight::from_parts(38_627_000, 0) + .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -523,10 +522,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn approve_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `376` - // Estimated: `7864` - // Minimum execution time: 22_900_000 picoseconds. - Weight::from_parts(23_351_000, 0) - .saturating_add(Weight::from_parts(0, 7864)) + // Estimated: `4326` + // Minimum execution time: 22_896_000 picoseconds. + Weight::from_parts(23_137_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -536,8 +535,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `384` // Estimated: `4326` - // Minimum execution time: 20_413_000 picoseconds. - Weight::from_parts(20_622_000, 0) + // Minimum execution time: 20_602_000 picoseconds. + Weight::from_parts(20_869_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -548,8 +547,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `384` // Estimated: `4326` - // Minimum execution time: 19_132_000 picoseconds. - Weight::from_parts(19_443_000, 0) + // Minimum execution time: 19_415_000 picoseconds. + Weight::from_parts(19_594_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -560,8 +559,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3517` - // Minimum execution time: 16_661_000 picoseconds. - Weight::from_parts(16_925_000, 0) + // Minimum execution time: 16_784_000 picoseconds. + Weight::from_parts(17_133_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -573,10 +572,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: // Measured: `306` - // Estimated: `7087` - // Minimum execution time: 19_575_000 picoseconds. - Weight::from_parts(19_826_000, 0) - .saturating_add(Weight::from_parts(0, 7087)) + // Estimated: `3549` + // Minimum execution time: 20_391_000 picoseconds. + Weight::from_parts(20_710_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -587,10 +586,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn update_mint_settings() -> Weight { // Proof Size summary in bytes: // Measured: `289` - // Estimated: `7072` - // Minimum execution time: 19_749_000 picoseconds. - Weight::from_parts(19_902_000, 0) - .saturating_add(Weight::from_parts(0, 7072)) + // Estimated: `3538` + // Minimum execution time: 19_989_000 picoseconds. + Weight::from_parts(20_179_000, 0) + .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -605,10 +604,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_price() -> Weight { // Proof Size summary in bytes: // Measured: `484` - // Estimated: `11377` - // Minimum execution time: 23_970_000 picoseconds. - Weight::from_parts(24_589_000, 0) - .saturating_add(Weight::from_parts(0, 11377)) + // Estimated: `4326` + // Minimum execution time: 24_308_000 picoseconds. + Weight::from_parts(24_721_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -629,10 +628,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn buy_item() -> Weight { // Proof Size summary in bytes: // Measured: `671` - // Estimated: `18480` - // Minimum execution time: 43_929_000 picoseconds. - Weight::from_parts(44_364_000, 0) - .saturating_add(Weight::from_parts(0, 18480)) + // Estimated: `4326` + // Minimum execution time: 45_626_000 picoseconds. + Weight::from_parts(46_030_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -641,11 +640,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_611_000 picoseconds. - Weight::from_parts(4_292_527, 0) + // Minimum execution time: 2_654_000 picoseconds. + Weight::from_parts(4_301_940, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 9_304 - .saturating_add(Weight::from_parts(3_636_886, 0).saturating_mul(n.into())) + // Standard Error: 9_223 + .saturating_add(Weight::from_parts(3_945_966, 0).saturating_mul(n.into())) } /// Storage: Nfts Item (r:2 w:0) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) @@ -655,8 +654,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `460` // Estimated: `7662` - // Minimum execution time: 22_643_000 picoseconds. - Weight::from_parts(22_957_000, 0) + // Minimum execution time: 23_071_000 picoseconds. + Weight::from_parts(23_535_000, 0) .saturating_add(Weight::from_parts(0, 7662)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -668,10 +667,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn cancel_swap() -> Weight { // Proof Size summary in bytes: // Measured: `479` - // Estimated: `7862` - // Minimum execution time: 21_037_000 picoseconds. - Weight::from_parts(21_359_000, 0) - .saturating_add(Weight::from_parts(0, 7862)) + // Estimated: `4326` + // Minimum execution time: 21_554_000 picoseconds. + Weight::from_parts(21_941_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -692,10 +691,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn claim_swap() -> Weight { // Proof Size summary in bytes: // Measured: `800` - // Estimated: `24321` - // Minimum execution time: 72_434_000 picoseconds. - Weight::from_parts(73_184_000, 0) - .saturating_add(Weight::from_parts(0, 24321)) + // Estimated: `7662` + // Minimum execution time: 74_272_000 picoseconds. + Weight::from_parts(75_374_000, 0) + .saturating_add(Weight::from_parts(0, 7662)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(10)) } @@ -721,12 +720,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn mint_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `524` - // Estimated: `29399 + n * (2954 ±0)` - // Minimum execution time: 125_554_000 picoseconds. - Weight::from_parts(129_631_978, 0) - .saturating_add(Weight::from_parts(0, 29399)) - // Standard Error: 20_858 - .saturating_add(Weight::from_parts(26_871_088, 0).saturating_mul(n.into())) + // Estimated: `6078 + n * (2954 ±0)` + // Minimum execution time: 133_545_000 picoseconds. + Weight::from_parts(137_797_962, 0) + .saturating_add(Weight::from_parts(0, 6078)) + // Standard Error: 33_124 + .saturating_add(Weight::from_parts(29_785_862, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6)) @@ -749,12 +748,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_attributes_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `554` - // Estimated: `20462 + n * (2954 ±0)` - // Minimum execution time: 76_170_000 picoseconds. - Weight::from_parts(85_697_599, 0) - .saturating_add(Weight::from_parts(0, 20462)) - // Standard Error: 51_480 - .saturating_add(Weight::from_parts(26_398_485, 0).saturating_mul(n.into())) + // Estimated: `4466 + n * (2954 ±0)` + // Minimum execution time: 77_475_000 picoseconds. + Weight::from_parts(88_353_947, 0) + .saturating_add(Weight::from_parts(0, 4466)) + // Standard Error: 60_491 + .saturating_add(Weight::from_parts(29_507_037, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs index 9e97e9e982d..042af1203f5 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_proxy`. pub struct WeightInfo(PhantomData); @@ -54,11 +55,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 16_846_000 picoseconds. - Weight::from_parts(17_545_125, 0) + // Minimum execution time: 17_994_000 picoseconds. + Weight::from_parts(18_404_764, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_168 - .saturating_add(Weight::from_parts(38_590, 0).saturating_mul(p.into())) + // Standard Error: 931 + .saturating_add(Weight::from_parts(29_489, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -72,14 +73,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn proxy_announced(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `454 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `13997` - // Minimum execution time: 35_646_000 picoseconds. - Weight::from_parts(35_944_816, 0) - .saturating_add(Weight::from_parts(0, 13997)) - // Standard Error: 1_868 - .saturating_add(Weight::from_parts(137_815, 0).saturating_mul(a.into())) - // Standard Error: 1_930 - .saturating_add(Weight::from_parts(38_331, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 39_788_000 picoseconds. + Weight::from_parts(39_231_218, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_373 + .saturating_add(Weight::from_parts(144_577, 0).saturating_mul(a.into())) + // Standard Error: 1_418 + .saturating_add(Weight::from_parts(39_464, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -92,14 +93,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn remove_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` - // Estimated: `9291` - // Minimum execution time: 22_142_000 picoseconds. - Weight::from_parts(23_269_000, 0) - .saturating_add(Weight::from_parts(0, 9291)) - // Standard Error: 1_365 - .saturating_add(Weight::from_parts(140_747, 0).saturating_mul(a.into())) - // Standard Error: 1_411 - .saturating_add(Weight::from_parts(14_983, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 25_778_000 picoseconds. + Weight::from_parts(26_117_943, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_161 + .saturating_add(Weight::from_parts(143_478, 0).saturating_mul(a.into())) + // Standard Error: 1_200 + .saturating_add(Weight::from_parts(8_492, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -112,14 +113,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn reject_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` - // Estimated: `9291` - // Minimum execution time: 22_465_000 picoseconds. - Weight::from_parts(23_366_335, 0) - .saturating_add(Weight::from_parts(0, 9291)) - // Standard Error: 4_348 - .saturating_add(Weight::from_parts(149_266, 0).saturating_mul(a.into())) - // Standard Error: 4_492 - .saturating_add(Weight::from_parts(10_411, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 25_448_000 picoseconds. + Weight::from_parts(26_025_080, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_079 + .saturating_add(Weight::from_parts(146_383, 0).saturating_mul(a.into())) + // Standard Error: 1_115 + .saturating_add(Weight::from_parts(7_614, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -134,14 +135,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn announce(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `386 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `13997` - // Minimum execution time: 31_086_000 picoseconds. - Weight::from_parts(32_252_234, 0) - .saturating_add(Weight::from_parts(0, 13997)) - // Standard Error: 2_039 - .saturating_add(Weight::from_parts(131_541, 0).saturating_mul(a.into())) - // Standard Error: 2_107 - .saturating_add(Weight::from_parts(41_085, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 35_200_000 picoseconds. + Weight::from_parts(34_858_670, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_692 + .saturating_add(Weight::from_parts(148_578, 0).saturating_mul(a.into())) + // Standard Error: 1_748 + .saturating_add(Weight::from_parts(38_530, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -152,11 +153,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 24_040_000 picoseconds. - Weight::from_parts(24_914_869, 0) + // Minimum execution time: 26_373_000 picoseconds. + Weight::from_parts(27_005_379, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_025 - .saturating_add(Weight::from_parts(47_844, 0).saturating_mul(p.into())) + // Standard Error: 844 + .saturating_add(Weight::from_parts(58_125, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -167,11 +168,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_495_000 picoseconds. - Weight::from_parts(24_788_899, 0) + // Minimum execution time: 26_455_000 picoseconds. + Weight::from_parts(27_435_800, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_911 - .saturating_add(Weight::from_parts(68_917, 0).saturating_mul(p.into())) + // Standard Error: 1_489 + .saturating_add(Weight::from_parts(57_697, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -182,24 +183,26 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 19_269_000 picoseconds. - Weight::from_parts(20_040_655, 0) + // Minimum execution time: 23_169_000 picoseconds. + Weight::from_parts(23_866_116, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_327 - .saturating_add(Weight::from_parts(24_180, 0).saturating_mul(p.into())) + // Standard Error: 788 + .saturating_add(Weight::from_parts(25_795, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Proxy Proxies (r:1 w:1) /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) /// The range of component `p` is `[1, 31]`. - fn create_pure(_p: u32, ) -> Weight { + fn create_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `139` // Estimated: `4706` - // Minimum execution time: 25_926_000 picoseconds. - Weight::from_parts(26_963_808, 0) + // Minimum execution time: 28_172_000 picoseconds. + Weight::from_parts(28_972_303, 0) .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 934 + .saturating_add(Weight::from_parts(10_208, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -210,11 +213,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `164 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 19_961_000 picoseconds. - Weight::from_parts(20_928_300, 0) + // Minimum execution time: 24_193_000 picoseconds. + Weight::from_parts(25_184_514, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_576 - .saturating_add(Weight::from_parts(28_604, 0).saturating_mul(p.into())) + // Standard Error: 3_667 + .saturating_add(Weight::from_parts(17_503, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_session.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_session.rs index 06d41c6383a..f0f02ace1eb 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_session.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_session`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `270` - // Estimated: `7470` - // Minimum execution time: 17_273_000 picoseconds. - Weight::from_parts(17_562_000, 0) - .saturating_add(Weight::from_parts(0, 7470)) + // Estimated: `3735` + // Minimum execution time: 17_623_000 picoseconds. + Weight::from_parts(17_946_000, 0) + .saturating_add(Weight::from_parts(0, 3735)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +69,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `242` - // Estimated: `3949` - // Minimum execution time: 13_268_000 picoseconds. - Weight::from_parts(13_646_000, 0) - .saturating_add(Weight::from_parts(0, 3949)) + // Estimated: `3707` + // Minimum execution time: 13_059_000 picoseconds. + Weight::from_parts(13_341_000, 0) + .saturating_add(Weight::from_parts(0, 3707)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs index af27f018b00..8ddde440fdf 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_timestamp`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `86` - // Estimated: `2986` - // Minimum execution time: 9_234_000 picoseconds. - Weight::from_parts(9_578_000, 0) - .saturating_add(Weight::from_parts(0, 2986)) + // Estimated: `1493` + // Minimum execution time: 9_168_000 picoseconds. + Weight::from_parts(9_563_000, 0) + .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_193_000 picoseconds. - Weight::from_parts(3_306_000, 0) + // Minimum execution time: 3_146_000 picoseconds. + Weight::from_parts(3_238_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs index 44846163ff0..80c1adfe5e6 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_uniques` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_uniques`. pub struct WeightInfo(PhantomData); @@ -55,8 +56,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3643` - // Minimum execution time: 25_977_000 picoseconds. - Weight::from_parts(27_109_000, 0) + // Minimum execution time: 31_630_000 picoseconds. + Weight::from_parts(32_135_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -69,8 +70,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3643` - // Minimum execution time: 14_712_000 picoseconds. - Weight::from_parts(15_150_000, 0) + // Minimum execution time: 15_573_000 picoseconds. + Weight::from_parts(15_971_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -96,17 +97,17 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// The range of component `a` is `[0, 1000]`. fn destroy(n: u32, m: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `257 + n * (76 ±0) + m * (56 ±0) + a * (107 ±0)` - // Estimated: `9210 + n * (2597 ±0) + a * (2647 ±0) + m * (2662 ±0)` - // Minimum execution time: 2_367_187_000 picoseconds. - Weight::from_parts(2_382_789_000, 0) - .saturating_add(Weight::from_parts(0, 9210)) - // Standard Error: 24_652 - .saturating_add(Weight::from_parts(6_204_090, 0).saturating_mul(n.into())) - // Standard Error: 24_652 - .saturating_add(Weight::from_parts(246_468, 0).saturating_mul(m.into())) - // Standard Error: 24_652 - .saturating_add(Weight::from_parts(346_915, 0).saturating_mul(a.into())) + // Measured: `257 + a * (107 ±0) + m * (56 ±0) + n * (76 ±0)` + // Estimated: `3643 + a * (2647 ±0) + m * (2662 ±0) + n * (2597 ±0)` + // Minimum execution time: 2_397_568_000 picoseconds. + Weight::from_parts(2_408_280_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) + // Standard Error: 24_497 + .saturating_add(Weight::from_parts(6_425_310, 0).saturating_mul(n.into())) + // Standard Error: 24_497 + .saturating_add(Weight::from_parts(252_611, 0).saturating_mul(m.into())) + // Standard Error: 24_497 + .saturating_add(Weight::from_parts(313_131, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) @@ -115,9 +116,9 @@ impl pallet_uniques::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) .saturating_add(Weight::from_parts(0, 2647).saturating_mul(a.into())) .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) } /// Storage: Uniques Asset (r:1 w:1) /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) @@ -130,10 +131,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn mint() -> Weight { // Proof Size summary in bytes: // Measured: `282` - // Estimated: `10719` - // Minimum execution time: 31_948_000 picoseconds. - Weight::from_parts(32_314_000, 0) - .saturating_add(Weight::from_parts(0, 10719)) + // Estimated: `3643` + // Minimum execution time: 37_233_000 picoseconds. + Weight::from_parts(37_731_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -148,10 +149,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn burn() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 33_711_000 picoseconds. - Weight::from_parts(34_742_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 38_493_000 picoseconds. + Weight::from_parts(38_939_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -166,10 +167,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 26_609_000 picoseconds. - Weight::from_parts(27_130_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 28_125_000 picoseconds. + Weight::from_parts(28_354_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -181,12 +182,12 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `738 + i * (76 ±0)` - // Estimated: `4633 + i * (2597 ±0)` - // Minimum execution time: 15_463_000 picoseconds. - Weight::from_parts(15_625_000, 0) - .saturating_add(Weight::from_parts(0, 4633)) - // Standard Error: 12_996 - .saturating_add(Weight::from_parts(13_104_503, 0).saturating_mul(i.into())) + // Estimated: `3643 + i * (2597 ±0)` + // Minimum execution time: 16_016_000 picoseconds. + Weight::from_parts(16_298_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) + // Standard Error: 12_979 + .saturating_add(Weight::from_parts(15_665_767, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -200,10 +201,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn freeze() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 18_897_000 picoseconds. - Weight::from_parts(19_276_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 19_730_000 picoseconds. + Weight::from_parts(20_008_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -214,10 +215,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn thaw() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 18_883_000 picoseconds. - Weight::from_parts(19_526_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 19_683_000 picoseconds. + Weight::from_parts(20_096_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -227,8 +228,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 14_519_000 picoseconds. - Weight::from_parts(14_887_000, 0) + // Minimum execution time: 14_854_000 picoseconds. + Weight::from_parts(15_217_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -239,8 +240,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 14_172_000 picoseconds. - Weight::from_parts(14_395_000, 0) + // Minimum execution time: 14_659_000 picoseconds. + Weight::from_parts(15_072_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -254,10 +255,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn transfer_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `356` - // Estimated: `7160` - // Minimum execution time: 22_131_000 picoseconds. - Weight::from_parts(22_540_000, 0) - .saturating_add(Weight::from_parts(0, 7160)) + // Estimated: `3643` + // Minimum execution time: 23_412_000 picoseconds. + Weight::from_parts(23_634_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -267,8 +268,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 15_582_000 picoseconds. - Weight::from_parts(15_907_000, 0) + // Minimum execution time: 15_816_000 picoseconds. + Weight::from_parts(16_303_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -281,8 +282,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 17_915_000 picoseconds. - Weight::from_parts(18_190_000, 0) + // Minimum execution time: 18_056_000 picoseconds. + Weight::from_parts(18_315_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -296,10 +297,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `559` - // Estimated: `10932` - // Minimum execution time: 37_851_000 picoseconds. - Weight::from_parts(38_554_000, 0) - .saturating_add(Weight::from_parts(0, 10932)) + // Estimated: `3652` + // Minimum execution time: 41_560_000 picoseconds. + Weight::from_parts(41_962_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -312,10 +313,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn clear_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `756` - // Estimated: `10932` - // Minimum execution time: 37_289_000 picoseconds. - Weight::from_parts(37_807_000, 0) - .saturating_add(Weight::from_parts(0, 10932)) + // Estimated: `3652` + // Minimum execution time: 40_334_000 picoseconds. + Weight::from_parts(40_590_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -326,10 +327,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `348` - // Estimated: `7295` - // Minimum execution time: 28_825_000 picoseconds. - Weight::from_parts(29_277_000, 0) - .saturating_add(Weight::from_parts(0, 7295)) + // Estimated: `3652` + // Minimum execution time: 33_142_000 picoseconds. + Weight::from_parts(33_683_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -340,10 +341,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn clear_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `559` - // Estimated: `7295` - // Minimum execution time: 29_274_000 picoseconds. - Weight::from_parts(29_941_000, 0) - .saturating_add(Weight::from_parts(0, 7295)) + // Estimated: `3652` + // Minimum execution time: 32_918_000 picoseconds. + Weight::from_parts(33_270_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -354,10 +355,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `282` - // Estimated: `7275` - // Minimum execution time: 28_196_000 picoseconds. - Weight::from_parts(28_563_000, 0) - .saturating_add(Weight::from_parts(0, 7275)) + // Estimated: `3643` + // Minimum execution time: 33_736_000 picoseconds. + Weight::from_parts(34_148_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -368,10 +369,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `473` - // Estimated: `7275` - // Minimum execution time: 26_657_000 picoseconds. - Weight::from_parts(27_189_000, 0) - .saturating_add(Weight::from_parts(0, 7275)) + // Estimated: `3643` + // Minimum execution time: 31_648_000 picoseconds. + Weight::from_parts(32_074_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -382,10 +383,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn approve_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 21_135_000 picoseconds. - Weight::from_parts(21_445_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 21_429_000 picoseconds. + Weight::from_parts(21_830_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -396,10 +397,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn cancel_approval() -> Weight { // Proof Size summary in bytes: // Measured: `461` - // Estimated: `7230` - // Minimum execution time: 20_803_000 picoseconds. - Weight::from_parts(21_249_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 21_317_000 picoseconds. + Weight::from_parts(21_565_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -409,8 +410,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3517` - // Minimum execution time: 16_421_000 picoseconds. - Weight::from_parts(16_940_000, 0) + // Minimum execution time: 17_070_000 picoseconds. + Weight::from_parts(17_433_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -422,10 +423,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: // Measured: `282` - // Estimated: `7132` - // Minimum execution time: 17_792_000 picoseconds. - Weight::from_parts(18_087_000, 0) - .saturating_add(Weight::from_parts(0, 7132)) + // Estimated: `3643` + // Minimum execution time: 17_943_000 picoseconds. + Weight::from_parts(18_307_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -437,8 +438,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `259` // Estimated: `3587` - // Minimum execution time: 17_036_000 picoseconds. - Weight::from_parts(17_365_000, 0) + // Minimum execution time: 17_872_000 picoseconds. + Weight::from_parts(18_029_000, 0) .saturating_add(Weight::from_parts(0, 3587)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -454,10 +455,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn buy_item() -> Weight { // Proof Size summary in bytes: // Measured: `540` - // Estimated: `10784` - // Minimum execution time: 37_920_000 picoseconds. - Weight::from_parts(38_587_000, 0) - .saturating_add(Weight::from_parts(0, 10784)) + // Estimated: `3643` + // Minimum execution time: 39_380_000 picoseconds. + Weight::from_parts(40_347_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs index 25a8f1375d0..be360bb42b8 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_utility`. pub struct WeightInfo(PhantomData); @@ -52,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_113_000 picoseconds. - Weight::from_parts(38_041_346, 0) + // Minimum execution time: 7_460_000 picoseconds. + Weight::from_parts(8_335_963, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 4_785 - .saturating_add(Weight::from_parts(4_680_352, 0).saturating_mul(c.into())) + // Standard Error: 3_566 + .saturating_add(Weight::from_parts(6_080_076, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_441_000 picoseconds. - Weight::from_parts(5_594_000, 0) + // Minimum execution time: 6_272_000 picoseconds. + Weight::from_parts(6_403_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_203_000 picoseconds. - Weight::from_parts(18_311_542, 0) + // Minimum execution time: 7_570_000 picoseconds. + Weight::from_parts(18_080_572, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_281 - .saturating_add(Weight::from_parts(4_950_166, 0).saturating_mul(c.into())) + // Standard Error: 5_851 + .saturating_add(Weight::from_parts(6_351_469, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_631_000 picoseconds. - Weight::from_parts(9_881_000, 0) + // Minimum execution time: 10_413_000 picoseconds. + Weight::from_parts(10_584_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_146_000 picoseconds. - Weight::from_parts(22_172_240, 0) + // Minimum execution time: 7_470_000 picoseconds. + Weight::from_parts(4_574_861, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_023 - .saturating_add(Weight::from_parts(4_688_391, 0).saturating_mul(c.into())) + // Standard Error: 3_330 + .saturating_add(Weight::from_parts(6_093_390, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs index e2ff9a974b5..36672a02cd7 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); @@ -60,10 +61,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `9780` - // Minimum execution time: 28_004_000 picoseconds. - Weight::from_parts(28_341_000, 0) - .saturating_add(Weight::from_parts(0, 9780)) + // Estimated: `3540` + // Minimum execution time: 29_342_000 picoseconds. + Weight::from_parts(29_952_000, 0) + .saturating_add(Weight::from_parts(0, 3540)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 23_734_000 picoseconds. - Weight::from_parts(24_091_000, 0) + // Minimum execution time: 28_744_000 picoseconds. + Weight::from_parts(29_193_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -84,8 +85,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 19_172_000 picoseconds. - Weight::from_parts(19_439_000, 0) + // Minimum execution time: 21_757_000 picoseconds. + Weight::from_parts(22_088_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -105,8 +106,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_181_000 picoseconds. - Weight::from_parts(10_441_000, 0) + // Minimum execution time: 10_671_000 picoseconds. + Weight::from_parts(10_948_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -116,8 +117,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_092_000 picoseconds. - Weight::from_parts(3_217_000, 0) + // Minimum execution time: 3_132_000 picoseconds. + Weight::from_parts(3_374_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -140,10 +141,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `14955` - // Minimum execution time: 36_167_000 picoseconds. - Weight::from_parts(37_036_000, 0) - .saturating_add(Weight::from_parts(0, 14955)) + // Estimated: `3540` + // Minimum execution time: 33_780_000 picoseconds. + Weight::from_parts(34_531_000, 0) + .saturating_add(Weight::from_parts(0, 3540)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -164,19 +165,21 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `257` - // Estimated: `14669` - // Minimum execution time: 39_341_000 picoseconds. - Weight::from_parts(40_254_000, 0) - .saturating_add(Weight::from_parts(0, 14669)) + // Estimated: `3722` + // Minimum execution time: 35_215_000 picoseconds. + Weight::from_parts(35_685_000, 0) + .saturating_add(Weight::from_parts(0, 3722)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) + /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) fn force_suspension() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_092_000 picoseconds. - Weight::from_parts(3_217_000, 0) + // Minimum execution time: 3_252_000 picoseconds. + Weight::from_parts(3_392_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -186,8 +189,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `129` // Estimated: `11019` - // Minimum execution time: 20_159_000 picoseconds. - Weight::from_parts(20_621_000, 0) + // Minimum execution time: 17_330_000 picoseconds. + Weight::from_parts(17_730_000, 0) .saturating_add(Weight::from_parts(0, 11019)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -198,8 +201,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `133` // Estimated: `11023` - // Minimum execution time: 20_095_000 picoseconds. - Weight::from_parts(20_335_000, 0) + // Minimum execution time: 17_129_000 picoseconds. + Weight::from_parts(17_665_000, 0) .saturating_add(Weight::from_parts(0, 11023)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -210,8 +213,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `140` // Estimated: `13505` - // Minimum execution time: 20_826_000 picoseconds. - Weight::from_parts(21_160_000, 0) + // Minimum execution time: 18_220_000 picoseconds. + Weight::from_parts(18_764_000, 0) .saturating_add(Weight::from_parts(0, 13505)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -230,10 +233,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `142` - // Estimated: `16197` - // Minimum execution time: 38_595_000 picoseconds. - Weight::from_parts(39_178_000, 0) - .saturating_add(Weight::from_parts(0, 16197)) + // Estimated: `6082` + // Minimum execution time: 31_356_000 picoseconds. + Weight::from_parts(31_850_000, 0) + .saturating_add(Weight::from_parts(0, 6082)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -243,8 +246,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `172` // Estimated: `8587` - // Minimum execution time: 11_391_000 picoseconds. - Weight::from_parts(11_704_000, 0) + // Minimum execution time: 9_299_000 picoseconds. + Weight::from_parts(9_515_000, 0) .saturating_add(Weight::from_parts(0, 8587)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -254,8 +257,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `140` // Estimated: `11030` - // Minimum execution time: 22_506_000 picoseconds. - Weight::from_parts(23_076_000, 0) + // Minimum execution time: 17_472_000 picoseconds. + Weight::from_parts(18_170_000, 0) .saturating_add(Weight::from_parts(0, 11030)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -275,10 +278,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `146` - // Estimated: `21171` - // Minimum execution time: 47_662_000 picoseconds. - Weight::from_parts(48_167_000, 0) - .saturating_add(Weight::from_parts(0, 21171)) + // Estimated: `11036` + // Minimum execution time: 39_134_000 picoseconds. + Weight::from_parts(39_847_000, 0) + .saturating_add(Weight::from_parts(0, 11036)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index d93dd65746b..8f802fb4211 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 23_021_000 picoseconds. - Weight::from_parts(23_385_000, 3593) + // Minimum execution time: 27_006_000 picoseconds. + Weight::from_parts(27_426_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 33_451_000 picoseconds. - Weight::from_parts(33_779_000, 6196) + // Minimum execution time: 51_640_000 picoseconds. + Weight::from_parts(52_045_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -87,9 +87,9 @@ impl WeightInfo { pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `176` - // Estimated: `17970` - // Minimum execution time: 56_145_000 picoseconds. - Weight::from_parts(56_830_000, 17970) + // Estimated: `6196` + // Minimum execution time: 75_401_000 picoseconds. + Weight::from_parts(75_956_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_315_000 picoseconds. - Weight::from_parts(4_448_000, 0) + // Minimum execution time: 4_767_000 picoseconds. + Weight::from_parts(4_848_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 25_505_000 picoseconds. - Weight::from_parts(25_697_000, 3593) + // Minimum execution time: 29_115_000 picoseconds. + Weight::from_parts(29_369_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -128,9 +128,9 @@ impl WeightInfo { pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `14862` - // Minimum execution time: 50_620_000 picoseconds. - Weight::from_parts(50_926_000, 14862) + // Estimated: `3593` + // Minimum execution time: 54_197_000 picoseconds. + Weight::from_parts(54_906_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -149,9 +149,9 @@ impl WeightInfo { pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 31_700_000 picoseconds. - Weight::from_parts(32_178_000, 11269) + // Estimated: `3540` + // Minimum execution time: 33_366_000 picoseconds. + Weight::from_parts(33_874_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 058f23631dd..9bd3f11c969 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -63,9 +63,9 @@ impl WeightInfo { pub fn report_holding() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 367_337_000 picoseconds. - Weight::from_parts(368_530_000, 11269) + // Estimated: `3540` + // Minimum execution time: 473_259_000 picoseconds. + Weight::from_parts(474_680_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_121_000 picoseconds. - Weight::from_parts(4_318_000, 0) + // Minimum execution time: 4_502_000 picoseconds. + Weight::from_parts(4_557_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `69` // Estimated: `3534` - // Minimum execution time: 11_951_000 picoseconds. - Weight::from_parts(12_171_000, 3534) + // Minimum execution time: 11_743_000 picoseconds. + Weight::from_parts(12_010_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_626_000 picoseconds. - Weight::from_parts(13_891_000, 0) + // Minimum execution time: 15_514_000 picoseconds. + Weight::from_parts(15_798_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_276_000 picoseconds. - Weight::from_parts(4_444_000, 0) + // Minimum execution time: 4_760_000 picoseconds. + Weight::from_parts(4_935_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_969_000 picoseconds. - Weight::from_parts(3_090_000, 0) + // Minimum execution time: 3_093_000 picoseconds. + Weight::from_parts(3_170_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_148_000 picoseconds. - Weight::from_parts(3_252_000, 0) + // Minimum execution time: 3_160_000 picoseconds. + Weight::from_parts(3_324_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_027_000 picoseconds. - Weight::from_parts(3_081_000, 0) + // Minimum execution time: 3_076_000 picoseconds. + Weight::from_parts(3_135_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_863_000 picoseconds. - Weight::from_parts(3_934_000, 0) + // Minimum execution time: 4_245_000 picoseconds. + Weight::from_parts(4_344_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_013_000 picoseconds. - Weight::from_parts(3_115_000, 0) + // Minimum execution time: 3_093_000 picoseconds. + Weight::from_parts(3_170_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -150,9 +150,9 @@ impl WeightInfo { pub fn report_error() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 25_963_000 picoseconds. - Weight::from_parts(26_428_000, 11269) + // Estimated: `3540` + // Minimum execution time: 27_368_000 picoseconds. + Weight::from_parts(27_731_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `126` // Estimated: `3591` - // Minimum execution time: 16_492_000 picoseconds. - Weight::from_parts(16_930_000, 3591) + // Minimum execution time: 17_634_000 picoseconds. + Weight::from_parts(18_068_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_004_000 picoseconds. - Weight::from_parts(3_070_000, 0) + // Minimum execution time: 3_142_000 picoseconds. + Weight::from_parts(3_195_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -189,9 +189,9 @@ impl WeightInfo { pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `13320` - // Minimum execution time: 28_804_000 picoseconds. - Weight::from_parts(29_543_000, 13320) + // Estimated: `3540` + // Minimum execution time: 28_784_000 picoseconds. + Weight::from_parts(29_246_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_140_000 picoseconds. - Weight::from_parts(5_343_000, 0) + // Minimum execution time: 5_260_000 picoseconds. + Weight::from_parts(5_398_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -220,9 +220,9 @@ impl WeightInfo { pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 410_533_000 picoseconds. - Weight::from_parts(412_507_000, 11269) + // Estimated: `3540` + // Minimum execution time: 528_849_000 picoseconds. + Weight::from_parts(530_923_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 126_970_000 picoseconds. - Weight::from_parts(129_854_000, 0) + // Minimum execution time: 151_252_000 picoseconds. + Weight::from_parts(153_485_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_585_000 picoseconds. - Weight::from_parts(13_852_000, 0) + // Minimum execution time: 14_939_000 picoseconds. + Weight::from_parts(15_154_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_091_000 picoseconds. - Weight::from_parts(3_180_000, 0) + // Minimum execution time: 3_231_000 picoseconds. + Weight::from_parts(3_308_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_982_000 picoseconds. - Weight::from_parts(3_060_000, 0) + // Minimum execution time: 3_130_000 picoseconds. + Weight::from_parts(3_220_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_246_000 picoseconds. - Weight::from_parts(3_332_000, 0) + // Minimum execution time: 3_366_000 picoseconds. + Weight::from_parts(3_458_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -276,9 +276,9 @@ impl WeightInfo { pub fn query_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 29_939_000 picoseconds. - Weight::from_parts(30_426_000, 11269) + // Estimated: `3540` + // Minimum execution time: 31_212_000 picoseconds. + Weight::from_parts(31_656_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_477_000 picoseconds. - Weight::from_parts(5_585_000, 0) + // Minimum execution time: 5_766_000 picoseconds. + Weight::from_parts(5_968_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -304,9 +304,9 @@ impl WeightInfo { pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 26_349_000 picoseconds. - Weight::from_parts(26_957_000, 11269) + // Estimated: `3540` + // Minimum execution time: 27_754_000 picoseconds. + Weight::from_parts(28_064_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_087_000 picoseconds. - Weight::from_parts(3_137_000, 0) + // Minimum execution time: 3_169_000 picoseconds. + Weight::from_parts(3_269_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_047_000 picoseconds. - Weight::from_parts(3_111_000, 0) + // Minimum execution time: 3_106_000 picoseconds. + Weight::from_parts(3_184_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_018_000 picoseconds. - Weight::from_parts(3_082_000, 0) + // Minimum execution time: 3_105_000 picoseconds. + Weight::from_parts(3_160_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_051_000 picoseconds. - Weight::from_parts(3_090_000, 0) + // Minimum execution time: 3_105_000 picoseconds. + Weight::from_parts(3_194_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_140_000 picoseconds. - Weight::from_parts(3_274_000, 0) + // Minimum execution time: 3_321_000 picoseconds. + Weight::from_parts(3_412_000, 0) } } diff --git a/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs index 02bedfa2d6a..6b492b2c1e5 100644 --- a/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_xcmp_queue`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_634_000 picoseconds. - Weight::from_parts(5_845_000, 0) + // Minimum execution time: 5_499_000 picoseconds. + Weight::from_parts(5_677_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_684_000 picoseconds. - Weight::from_parts(5_823_000, 0) + // Minimum execution time: 5_747_000 picoseconds. + Weight::from_parts(5_911_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/assets/statemint/src/weights/frame_system.rs b/parachains/runtimes/assets/statemint/src/weights/frame_system.rs index 23a5e25cddb..c8672db59ad 100644 --- a/parachains/runtimes/assets/statemint/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/statemint/src/weights/frame_system.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `frame_system`. pub struct WeightInfo(PhantomData); @@ -52,22 +53,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_346_000 picoseconds. - Weight::from_parts(2_416_000, 0) + // Minimum execution time: 2_236_000 picoseconds. + Weight::from_parts(2_297_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(412, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(365, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_010_000 picoseconds. - Weight::from_parts(8_171_000, 0) + // Minimum execution time: 7_839_000 picoseconds. + Weight::from_parts(7_977_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 0 - .saturating_add(Weight::from_parts(1_448, 0).saturating_mul(b.into())) + // Standard Error: 1 + .saturating_add(Weight::from_parts(1_406, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -77,8 +78,8 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 4_684_000 picoseconds. - Weight::from_parts(4_872_000, 0) + // Minimum execution time: 4_494_000 picoseconds. + Weight::from_parts(4_824_000, 0) .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -90,11 +91,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_361_000 picoseconds. - Weight::from_parts(2_402_000, 0) + // Minimum execution time: 2_343_000 picoseconds. + Weight::from_parts(2_396_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_747 - .saturating_add(Weight::from_parts(682_536, 0).saturating_mul(i.into())) + // Standard Error: 2_074 + .saturating_add(Weight::from_parts(676_456, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +105,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_515_000 picoseconds. - Weight::from_parts(2_565_000, 0) + // Minimum execution time: 2_345_000 picoseconds. + Weight::from_parts(2_374_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 859 - .saturating_add(Weight::from_parts(501_791, 0).saturating_mul(i.into())) + // Standard Error: 758 + .saturating_add(Weight::from_parts(491_397, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -118,11 +119,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `81 + p * (69 ±0)` // Estimated: `72 + p * (70 ±0)` - // Minimum execution time: 4_524_000 picoseconds. - Weight::from_parts(4_626_000, 0) + // Minimum execution time: 4_203_000 picoseconds. + Weight::from_parts(4_292_000, 0) .saturating_add(Weight::from_parts(0, 72)) - // Standard Error: 1_004 - .saturating_add(Weight::from_parts(1_011_603, 0).saturating_mul(p.into())) + // Standard Error: 1_026 + .saturating_add(Weight::from_parts(1_011_943, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs index d7f390194af..cf9dae9dee3 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_assets` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_assets`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn create() -> Weight { // Proof Size summary in bytes: // Measured: `109` - // Estimated: `7268` - // Minimum execution time: 24_714_000 picoseconds. - Weight::from_parts(25_310_000, 0) - .saturating_add(Weight::from_parts(0, 7268)) + // Estimated: `3675` + // Minimum execution time: 28_211_000 picoseconds. + Weight::from_parts(28_668_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -67,8 +68,8 @@ impl pallet_assets::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `6` // Estimated: `3675` - // Minimum execution time: 12_820_000 picoseconds. - Weight::from_parts(13_118_000, 0) + // Minimum execution time: 11_781_000 picoseconds. + Weight::from_parts(12_065_000, 0) .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -79,8 +80,8 @@ impl pallet_assets::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `277` // Estimated: `3675` - // Minimum execution time: 15_292_000 picoseconds. - Weight::from_parts(15_715_000, 0) + // Minimum execution time: 14_330_000 picoseconds. + Weight::from_parts(14_502_000, 0) .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -95,17 +96,17 @@ impl pallet_assets::WeightInfo for WeightInfo { fn destroy_accounts(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + c * (208 ±0)` - // Estimated: `8232 + c * (5180 ±0)` - // Minimum execution time: 17_955_000 picoseconds. - Weight::from_parts(18_157_000, 0) - .saturating_add(Weight::from_parts(0, 8232)) - // Standard Error: 7_214 - .saturating_add(Weight::from_parts(12_316_605, 0).saturating_mul(c.into())) + // Estimated: `3675 + c * (2603 ±0)` + // Minimum execution time: 17_319_000 picoseconds. + Weight::from_parts(17_663_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) + // Standard Error: 7_032 + .saturating_add(Weight::from_parts(11_982_921, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 5180).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(c.into())) } /// Storage: Assets Asset (r:1 w:1) /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) @@ -115,12 +116,12 @@ impl pallet_assets::WeightInfo for WeightInfo { fn destroy_approvals(a: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `414 + a * (86 ±0)` - // Estimated: `7288 + a * (2623 ±0)` - // Minimum execution time: 18_626_000 picoseconds. - Weight::from_parts(18_760_000, 0) - .saturating_add(Weight::from_parts(0, 7288)) - // Standard Error: 4_382 - .saturating_add(Weight::from_parts(12_278_198, 0).saturating_mul(a.into())) + // Estimated: `3675 + a * (2623 ±0)` + // Minimum execution time: 18_296_000 picoseconds. + Weight::from_parts(18_465_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) + // Standard Error: 4_256 + .saturating_add(Weight::from_parts(14_090_852, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -134,10 +135,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn finish_destroy() -> Weight { // Proof Size summary in bytes: // Measured: `243` - // Estimated: `7280` - // Minimum execution time: 14_576_000 picoseconds. - Weight::from_parts(14_816_000, 0) - .saturating_add(Weight::from_parts(0, 7280)) + // Estimated: `3675` + // Minimum execution time: 14_265_000 picoseconds. + Weight::from_parts(14_527_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -148,10 +149,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn mint() -> Weight { // Proof Size summary in bytes: // Measured: `243` - // Estimated: `7242` - // Minimum execution time: 26_215_000 picoseconds. - Weight::from_parts(26_571_000, 0) - .saturating_add(Weight::from_parts(0, 7242)) + // Estimated: `3675` + // Minimum execution time: 25_227_000 picoseconds. + Weight::from_parts(25_846_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,10 +163,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn burn() -> Weight { // Proof Size summary in bytes: // Measured: `351` - // Estimated: `7242` - // Minimum execution time: 31_944_000 picoseconds. - Weight::from_parts(32_675_000, 0) - .saturating_add(Weight::from_parts(0, 7242)) + // Estimated: `3675` + // Minimum execution time: 31_131_000 picoseconds. + Weight::from_parts(31_792_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -178,10 +179,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `351` - // Estimated: `13412` - // Minimum execution time: 44_126_000 picoseconds. - Weight::from_parts(44_567_000, 0) - .saturating_add(Weight::from_parts(0, 13412)) + // Estimated: `6144` + // Minimum execution time: 43_177_000 picoseconds. + Weight::from_parts(43_498_000, 0) + .saturating_add(Weight::from_parts(0, 6144)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -194,10 +195,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: // Measured: `351` - // Estimated: `13412` - // Minimum execution time: 39_414_000 picoseconds. - Weight::from_parts(39_891_000, 0) - .saturating_add(Weight::from_parts(0, 13412)) + // Estimated: `6144` + // Minimum execution time: 37_702_000 picoseconds. + Weight::from_parts(38_413_000, 0) + .saturating_add(Weight::from_parts(0, 6144)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -210,10 +211,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn force_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `351` - // Estimated: `13412` - // Minimum execution time: 44_875_000 picoseconds. - Weight::from_parts(45_961_000, 0) - .saturating_add(Weight::from_parts(0, 13412)) + // Estimated: `6144` + // Minimum execution time: 43_061_000 picoseconds. + Weight::from_parts(43_657_000, 0) + .saturating_add(Weight::from_parts(0, 6144)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -224,10 +225,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn freeze() -> Weight { // Proof Size summary in bytes: // Measured: `351` - // Estimated: `7242` - // Minimum execution time: 18_388_000 picoseconds. - Weight::from_parts(18_718_000, 0) - .saturating_add(Weight::from_parts(0, 7242)) + // Estimated: `3675` + // Minimum execution time: 17_386_000 picoseconds. + Weight::from_parts(17_618_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -238,10 +239,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn thaw() -> Weight { // Proof Size summary in bytes: // Measured: `351` - // Estimated: `7242` - // Minimum execution time: 18_292_000 picoseconds. - Weight::from_parts(18_633_000, 0) - .saturating_add(Weight::from_parts(0, 7242)) + // Estimated: `3675` + // Minimum execution time: 17_180_000 picoseconds. + Weight::from_parts(17_458_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -251,8 +252,8 @@ impl pallet_assets::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `277` // Estimated: `3675` - // Minimum execution time: 14_604_000 picoseconds. - Weight::from_parts(14_980_000, 0) + // Minimum execution time: 13_802_000 picoseconds. + Weight::from_parts(14_110_000, 0) .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -263,8 +264,8 @@ impl pallet_assets::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `277` // Estimated: `3675` - // Minimum execution time: 14_008_000 picoseconds. - Weight::from_parts(14_428_000, 0) + // Minimum execution time: 13_903_000 picoseconds. + Weight::from_parts(14_158_000, 0) .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -276,10 +277,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn transfer_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `243` - // Estimated: `7280` - // Minimum execution time: 15_453_000 picoseconds. - Weight::from_parts(15_963_000, 0) - .saturating_add(Weight::from_parts(0, 7280)) + // Estimated: `3675` + // Minimum execution time: 15_371_000 picoseconds. + Weight::from_parts(15_651_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -289,8 +290,8 @@ impl pallet_assets::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `243` // Estimated: `3675` - // Minimum execution time: 14_515_000 picoseconds. - Weight::from_parts(14_835_000, 0) + // Minimum execution time: 14_229_000 picoseconds. + Weight::from_parts(14_440_000, 0) .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -301,17 +302,15 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) /// The range of component `n` is `[0, 50]`. /// The range of component `s` is `[0, 50]`. - fn set_metadata(n: u32, s: u32, ) -> Weight { + fn set_metadata(_n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `243` - // Estimated: `7280` - // Minimum execution time: 25_865_000 picoseconds. - Weight::from_parts(26_845_899, 0) - .saturating_add(Weight::from_parts(0, 7280)) - // Standard Error: 1_061 - .saturating_add(Weight::from_parts(4_438, 0).saturating_mul(n.into())) - // Standard Error: 1_061 - .saturating_add(Weight::from_parts(5_130, 0).saturating_mul(s.into())) + // Estimated: `3675` + // Minimum execution time: 29_075_000 picoseconds. + Weight::from_parts(29_848_037, 0) + .saturating_add(Weight::from_parts(0, 3675)) + // Standard Error: 404 + .saturating_add(Weight::from_parts(2_259, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -322,10 +321,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn clear_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `407` - // Estimated: `7280` - // Minimum execution time: 25_970_000 picoseconds. - Weight::from_parts(26_439_000, 0) - .saturating_add(Weight::from_parts(0, 7280)) + // Estimated: `3675` + // Minimum execution time: 29_204_000 picoseconds. + Weight::from_parts(29_542_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -335,17 +334,15 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) /// The range of component `n` is `[0, 50]`. /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(n: u32, s: u32, ) -> Weight { + fn force_set_metadata(_n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `82` - // Estimated: `7280` - // Minimum execution time: 14_101_000 picoseconds. - Weight::from_parts(14_786_155, 0) - .saturating_add(Weight::from_parts(0, 7280)) - // Standard Error: 383 - .saturating_add(Weight::from_parts(581, 0).saturating_mul(n.into())) - // Standard Error: 383 - .saturating_add(Weight::from_parts(4_514, 0).saturating_mul(s.into())) + // Estimated: `3675` + // Minimum execution time: 13_144_000 picoseconds. + Weight::from_parts(13_741_573, 0) + .saturating_add(Weight::from_parts(0, 3675)) + // Standard Error: 314 + .saturating_add(Weight::from_parts(2_146, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -356,10 +353,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn force_clear_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `407` - // Estimated: `7280` - // Minimum execution time: 26_563_000 picoseconds. - Weight::from_parts(26_733_000, 0) - .saturating_add(Weight::from_parts(0, 7280)) + // Estimated: `3675` + // Minimum execution time: 28_718_000 picoseconds. + Weight::from_parts(29_090_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -369,8 +366,8 @@ impl pallet_assets::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `243` // Estimated: `3675` - // Minimum execution time: 13_948_000 picoseconds. - Weight::from_parts(14_330_000, 0) + // Minimum execution time: 13_183_000 picoseconds. + Weight::from_parts(13_442_000, 0) .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -382,10 +379,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn approve_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `277` - // Estimated: `7288` - // Minimum execution time: 30_307_000 picoseconds. - Weight::from_parts(30_677_000, 0) - .saturating_add(Weight::from_parts(0, 7288)) + // Estimated: `3675` + // Minimum execution time: 32_260_000 picoseconds. + Weight::from_parts(32_739_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -400,10 +397,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn transfer_approved() -> Weight { // Proof Size summary in bytes: // Measured: `521` - // Estimated: `17025` - // Minimum execution time: 59_228_000 picoseconds. - Weight::from_parts(59_702_000, 0) - .saturating_add(Weight::from_parts(0, 17025)) + // Estimated: `6144` + // Minimum execution time: 61_085_000 picoseconds. + Weight::from_parts(61_779_000, 0) + .saturating_add(Weight::from_parts(0, 6144)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -414,10 +411,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn cancel_approval() -> Weight { // Proof Size summary in bytes: // Measured: `447` - // Estimated: `7288` - // Minimum execution time: 31_228_000 picoseconds. - Weight::from_parts(31_564_000, 0) - .saturating_add(Weight::from_parts(0, 7288)) + // Estimated: `3675` + // Minimum execution time: 34_236_000 picoseconds. + Weight::from_parts(34_692_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -428,10 +425,10 @@ impl pallet_assets::WeightInfo for WeightInfo { fn force_cancel_approval() -> Weight { // Proof Size summary in bytes: // Measured: `447` - // Estimated: `7288` - // Minimum execution time: 32_931_000 picoseconds. - Weight::from_parts(33_406_000, 0) - .saturating_add(Weight::from_parts(0, 7288)) + // Estimated: `3675` + // Minimum execution time: 34_765_000 picoseconds. + Weight::from_parts(35_364_000, 0) + .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -441,8 +438,8 @@ impl pallet_assets::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `243` // Estimated: `3675` - // Minimum execution time: 15_084_000 picoseconds. - Weight::from_parts(15_358_000, 0) + // Minimum execution time: 14_550_000 picoseconds. + Weight::from_parts(14_799_000, 0) .saturating_add(Weight::from_parts(0, 3675)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs index e81c1925649..631d8b00c34 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_balances`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 35_757_000 picoseconds. - Weight::from_parts(36_417_000, 0) + // Minimum execution time: 52_756_000 picoseconds. + Weight::from_parts(53_298_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 27_074_000 picoseconds. - Weight::from_parts(27_335_000, 0) + // Minimum execution time: 40_071_000 picoseconds. + Weight::from_parts(40_563_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -77,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 16_753_000 picoseconds. - Weight::from_parts(17_141_000, 0) + // Minimum execution time: 15_936_000 picoseconds. + Weight::from_parts(16_317_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -89,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 20_459_000 picoseconds. - Weight::from_parts(20_848_000, 0) + // Minimum execution time: 22_750_000 picoseconds. + Weight::from_parts(23_053_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -101,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 41_036_000 picoseconds. - Weight::from_parts(41_265_000, 0) + // Minimum execution time: 54_270_000 picoseconds. + Weight::from_parts(54_857_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -113,25 +114,38 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 35_925_000 picoseconds. - Weight::from_parts(36_511_000, 0) + // Minimum execution time: 49_155_000 picoseconds. + Weight::from_parts(49_567_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - fn upgrade_accounts(_: u32) -> Weight { - Weight::from_parts(0, 0) - } fn force_unreserve() -> Weight { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 16_377_000 picoseconds. - Weight::from_parts(16_722_000, 0) + // Minimum execution time: 18_651_000 picoseconds. + Weight::from_parts(19_007_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: System Account (r:999 w:999) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 18_523_000 picoseconds. + Weight::from_parts(18_943_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 11_771 + .saturating_add(Weight::from_parts(14_176_687, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs index e86fa5544d0..d18f3072c3d 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_collator_selection`. pub struct WeightInfo(PhantomData); @@ -56,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` // Estimated: `1168 + b * (2554 ±0)` - // Minimum execution time: 15_372_000 picoseconds. - Weight::from_parts(16_916_596, 0) + // Minimum execution time: 15_000_000 picoseconds. + Weight::from_parts(14_942_281, 0) .saturating_add(Weight::from_parts(0, 1168)) - // Standard Error: 3_537 - .saturating_add(Weight::from_parts(2_583_561, 0).saturating_mul(b.into())) + // Standard Error: 3_013 + .saturating_add(Weight::from_parts(2_673_944, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_637_000 picoseconds. - Weight::from_parts(7_821_000, 0) + // Minimum execution time: 7_341_000 picoseconds. + Weight::from_parts(7_608_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_838_000 picoseconds. - Weight::from_parts(8_092_000, 0) + // Minimum execution time: 7_710_000 picoseconds. + Weight::from_parts(7_973_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,12 +104,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `1108 + c * (48 ±0)` - // Estimated: `61671 + c * (49 ±0)` - // Minimum execution time: 37_630_000 picoseconds. - Weight::from_parts(30_551_625, 0) - .saturating_add(Weight::from_parts(0, 61671)) - // Standard Error: 1_282 - .saturating_add(Weight::from_parts(112_510, 0).saturating_mul(c.into())) + // Estimated: `49487 + c * (49 ±0)` + // Minimum execution time: 42_547_000 picoseconds. + Weight::from_parts(35_070_051, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_231 + .saturating_add(Weight::from_parts(105_769, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -122,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `452 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 29_525_000 picoseconds. - Weight::from_parts(19_433_082, 0) + // Minimum execution time: 33_828_000 picoseconds. + Weight::from_parts(23_360_256, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_290 - .saturating_add(Weight::from_parts(108_444, 0).saturating_mul(c.into())) + // Standard Error: 1_294 + .saturating_add(Weight::from_parts(106_027, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -139,10 +140,10 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn note_author() -> Weight { // Proof Size summary in bytes: // Measured: `103` - // Estimated: `7729` - // Minimum execution time: 29_428_000 picoseconds. - Weight::from_parts(29_752_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `6196` + // Minimum execution time: 43_367_000 picoseconds. + Weight::from_parts(44_039_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +161,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22721 + r * (116 ±0) + c * (97 ±0)` - // Estimated: `56697 + r * (2602 ±0) + c * (2520 ±0)` - // Minimum execution time: 17_105_000 picoseconds. - Weight::from_parts(17_304_000, 0) - .saturating_add(Weight::from_parts(0, 56697)) - // Standard Error: 839_957 - .saturating_add(Weight::from_parts(30_183_103, 0).saturating_mul(c.into())) + // Measured: `22721 + c * (97 ±0) + r * (116 ±0)` + // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` + // Minimum execution time: 17_277_000 picoseconds. + Weight::from_parts(17_657_000, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 855_404 + .saturating_add(Weight::from_parts(30_433_186, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) + .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) - .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs index 2a93d9e41c2..3f708111d83 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_multisig`. pub struct WeightInfo(PhantomData); @@ -52,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_445_000 picoseconds. - Weight::from_parts(12_887_726, 0) + // Minimum execution time: 11_556_000 picoseconds. + Weight::from_parts(11_977_075, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 1 - .saturating_add(Weight::from_parts(608, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(493, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -66,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `262 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 38_178_000 picoseconds. - Weight::from_parts(31_903_342, 0) + // Minimum execution time: 41_285_000 picoseconds. + Weight::from_parts(35_323_592, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 743 - .saturating_add(Weight::from_parts(67_484, 0).saturating_mul(s.into())) - // Standard Error: 7 - .saturating_add(Weight::from_parts(1_353, 0).saturating_mul(z.into())) + // Standard Error: 454 + .saturating_add(Weight::from_parts(64_841, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_195, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -84,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 28_095_000 picoseconds. - Weight::from_parts(22_610_540, 0) + // Minimum execution time: 27_217_000 picoseconds. + Weight::from_parts(21_829_864, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 571 - .saturating_add(Weight::from_parts(59_325, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_310, 0).saturating_mul(z.into())) + // Standard Error: 473 + .saturating_add(Weight::from_parts(59_818, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_179, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,14 +104,14 @@ impl pallet_multisig::WeightInfo for WeightInfo { fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `385 + s * (33 ±0)` - // Estimated: `10404` - // Minimum execution time: 43_571_000 picoseconds. - Weight::from_parts(35_747_616, 0) - .saturating_add(Weight::from_parts(0, 10404)) - // Standard Error: 555 - .saturating_add(Weight::from_parts(86_297, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_333, 0).saturating_mul(z.into())) + // Estimated: `6811` + // Minimum execution time: 46_235_000 picoseconds. + Weight::from_parts(38_643_321, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 484 + .saturating_add(Weight::from_parts(82_619, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_223, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -121,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 29_122_000 picoseconds. - Weight::from_parts(30_681_183, 0) + // Minimum execution time: 31_827_000 picoseconds. + Weight::from_parts(33_743_065, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 787 - .saturating_add(Weight::from_parts(69_464, 0).saturating_mul(s.into())) + // Standard Error: 669 + .saturating_add(Weight::from_parts(68_793, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -136,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 19_219_000 picoseconds. - Weight::from_parts(20_598_069, 0) + // Minimum execution time: 19_148_000 picoseconds. + Weight::from_parts(20_211_716, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 572 - .saturating_add(Weight::from_parts(66_940, 0).saturating_mul(s.into())) + // Standard Error: 376 + .saturating_add(Weight::from_parts(62_199, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -151,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 29_859_000 picoseconds. - Weight::from_parts(31_610_947, 0) + // Minimum execution time: 32_770_000 picoseconds. + Weight::from_parts(34_731_111, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 739 - .saturating_add(Weight::from_parts(70_349, 0).saturating_mul(s.into())) + // Standard Error: 761 + .saturating_add(Weight::from_parts(70_575, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs index 1471920ba2f..d6b2795b062 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_proxy`. pub struct WeightInfo(PhantomData); @@ -54,11 +55,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 17_484_000 picoseconds. - Weight::from_parts(17_998_669, 0) + // Minimum execution time: 16_736_000 picoseconds. + Weight::from_parts(17_180_115, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_091 - .saturating_add(Weight::from_parts(33_441, 0).saturating_mul(p.into())) + // Standard Error: 616 + .saturating_add(Weight::from_parts(29_847, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -72,14 +73,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn proxy_announced(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `454 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `13997` - // Minimum execution time: 35_828_000 picoseconds. - Weight::from_parts(36_241_110, 0) - .saturating_add(Weight::from_parts(0, 13997)) - // Standard Error: 2_219 - .saturating_add(Weight::from_parts(156_309, 0).saturating_mul(a.into())) - // Standard Error: 2_292 - .saturating_add(Weight::from_parts(32_167, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 38_677_000 picoseconds. + Weight::from_parts(38_332_966, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_354 + .saturating_add(Weight::from_parts(134_195, 0).saturating_mul(a.into())) + // Standard Error: 1_399 + .saturating_add(Weight::from_parts(37_946, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -92,14 +93,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn remove_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` - // Estimated: `9291` - // Minimum execution time: 22_512_000 picoseconds. - Weight::from_parts(23_254_777, 0) - .saturating_add(Weight::from_parts(0, 9291)) - // Standard Error: 1_318 - .saturating_add(Weight::from_parts(148_302, 0).saturating_mul(a.into())) - // Standard Error: 1_362 - .saturating_add(Weight::from_parts(13_945, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 25_593_000 picoseconds. + Weight::from_parts(26_236_639, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_160 + .saturating_add(Weight::from_parts(129_362, 0).saturating_mul(a.into())) + // Standard Error: 1_199 + .saturating_add(Weight::from_parts(8_687, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -112,14 +113,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn reject_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` - // Estimated: `9291` - // Minimum execution time: 22_528_000 picoseconds. - Weight::from_parts(23_510_728, 0) - .saturating_add(Weight::from_parts(0, 9291)) - // Standard Error: 1_393 - .saturating_add(Weight::from_parts(143_817, 0).saturating_mul(a.into())) - // Standard Error: 1_439 - .saturating_add(Weight::from_parts(9_334, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 25_596_000 picoseconds. + Weight::from_parts(25_854_867, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_372 + .saturating_add(Weight::from_parts(137_697, 0).saturating_mul(a.into())) + // Standard Error: 1_417 + .saturating_add(Weight::from_parts(14_082, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -134,14 +135,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn announce(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `386 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `13997` - // Minimum execution time: 31_233_000 picoseconds. - Weight::from_parts(32_142_917, 0) - .saturating_add(Weight::from_parts(0, 13997)) - // Standard Error: 1_888 - .saturating_add(Weight::from_parts(142_949, 0).saturating_mul(a.into())) - // Standard Error: 1_951 - .saturating_add(Weight::from_parts(46_737, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 35_255_000 picoseconds. + Weight::from_parts(34_659_291, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_072 + .saturating_add(Weight::from_parts(126_577, 0).saturating_mul(a.into())) + // Standard Error: 1_107 + .saturating_add(Weight::from_parts(41_124, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -152,11 +153,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 24_085_000 picoseconds. - Weight::from_parts(25_032_056, 0) + // Minimum execution time: 26_245_000 picoseconds. + Weight::from_parts(26_910_616, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_758 - .saturating_add(Weight::from_parts(52_203, 0).saturating_mul(p.into())) + // Standard Error: 1_107 + .saturating_add(Weight::from_parts(54_705, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -167,11 +168,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_678_000 picoseconds. - Weight::from_parts(24_981_101, 0) + // Minimum execution time: 26_080_000 picoseconds. + Weight::from_parts(27_081_618, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_874 - .saturating_add(Weight::from_parts(73_774, 0).saturating_mul(p.into())) + // Standard Error: 1_644 + .saturating_add(Weight::from_parts(53_919, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -182,11 +183,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 19_119_000 picoseconds. - Weight::from_parts(19_982_142, 0) + // Minimum execution time: 23_191_000 picoseconds. + Weight::from_parts(23_827_934, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_174 - .saturating_add(Weight::from_parts(26_182, 0).saturating_mul(p.into())) + // Standard Error: 1_078 + .saturating_add(Weight::from_parts(28_417, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -197,11 +198,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `139` // Estimated: `4706` - // Minimum execution time: 26_077_000 picoseconds. - Weight::from_parts(27_130_205, 0) + // Minimum execution time: 27_895_000 picoseconds. + Weight::from_parts(28_599_042, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_539 - .saturating_add(Weight::from_parts(1_625, 0).saturating_mul(p.into())) + // Standard Error: 953 + .saturating_add(Weight::from_parts(12_641, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -212,11 +213,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `164 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 20_178_000 picoseconds. - Weight::from_parts(21_090_914, 0) + // Minimum execution time: 24_395_000 picoseconds. + Weight::from_parts(24_924_060, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_488 - .saturating_add(Weight::from_parts(36_285, 0).saturating_mul(p.into())) + // Standard Error: 720 + .saturating_add(Weight::from_parts(27_470, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_session.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_session.rs index 87458dcd84b..5a44e8e80bf 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_session.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_session`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `270` - // Estimated: `7470` - // Minimum execution time: 17_008_000 picoseconds. - Weight::from_parts(17_288_000, 0) - .saturating_add(Weight::from_parts(0, 7470)) + // Estimated: `3735` + // Minimum execution time: 17_271_000 picoseconds. + Weight::from_parts(17_533_000, 0) + .saturating_add(Weight::from_parts(0, 3735)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +69,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `242` - // Estimated: `3949` - // Minimum execution time: 13_427_000 picoseconds. - Weight::from_parts(13_609_000, 0) - .saturating_add(Weight::from_parts(0, 3949)) + // Estimated: `3707` + // Minimum execution time: 13_077_000 picoseconds. + Weight::from_parts(13_283_000, 0) + .saturating_add(Weight::from_parts(0, 3707)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs index 75d47ae1fd6..361bb6245fc 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_timestamp`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `86` - // Estimated: `2986` - // Minimum execution time: 9_174_000 picoseconds. - Weight::from_parts(9_644_000, 0) - .saturating_add(Weight::from_parts(0, 2986)) + // Estimated: `1493` + // Minimum execution time: 9_418_000 picoseconds. + Weight::from_parts(9_665_000, 0) + .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_121_000 picoseconds. - Weight::from_parts(3_205_000, 0) + // Minimum execution time: 3_266_000 picoseconds. + Weight::from_parts(3_386_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs index 1c33a12ab3d..fe9d2d1399e 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_uniques` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_uniques`. pub struct WeightInfo(PhantomData); @@ -55,8 +56,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3643` - // Minimum execution time: 26_653_000 picoseconds. - Weight::from_parts(27_024_000, 0) + // Minimum execution time: 30_269_000 picoseconds. + Weight::from_parts(30_661_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -69,8 +70,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3643` - // Minimum execution time: 15_168_000 picoseconds. - Weight::from_parts(15_535_000, 0) + // Minimum execution time: 14_801_000 picoseconds. + Weight::from_parts(15_041_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -96,17 +97,17 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// The range of component `a` is `[0, 1000]`. fn destroy(n: u32, m: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `257 + n * (76 ±0) + m * (56 ±0) + a * (107 ±0)` - // Estimated: `9210 + n * (2597 ±0) + m * (2662 ±0) + a * (2647 ±0)` - // Minimum execution time: 2_365_108_000 picoseconds. - Weight::from_parts(2_380_000_000, 0) - .saturating_add(Weight::from_parts(0, 9210)) - // Standard Error: 24_588 - .saturating_add(Weight::from_parts(6_339_196, 0).saturating_mul(n.into())) - // Standard Error: 24_588 - .saturating_add(Weight::from_parts(265_876, 0).saturating_mul(m.into())) - // Standard Error: 24_588 - .saturating_add(Weight::from_parts(316_327, 0).saturating_mul(a.into())) + // Measured: `257 + a * (107 ±0) + m * (56 ±0) + n * (76 ±0)` + // Estimated: `3643 + a * (2647 ±0) + m * (2662 ±0) + n * (2597 ±0)` + // Minimum execution time: 2_439_268_000 picoseconds. + Weight::from_parts(2_450_670_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) + // Standard Error: 24_972 + .saturating_add(Weight::from_parts(6_281_799, 0).saturating_mul(n.into())) + // Standard Error: 24_972 + .saturating_add(Weight::from_parts(245_622, 0).saturating_mul(m.into())) + // Standard Error: 24_972 + .saturating_add(Weight::from_parts(345_135, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) @@ -115,9 +116,9 @@ impl pallet_uniques::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) - .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 2647).saturating_mul(a.into())) + .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) } /// Storage: Uniques Asset (r:1 w:1) /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) @@ -130,10 +131,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn mint() -> Weight { // Proof Size summary in bytes: // Measured: `282` - // Estimated: `10719` - // Minimum execution time: 32_891_000 picoseconds. - Weight::from_parts(33_169_000, 0) - .saturating_add(Weight::from_parts(0, 10719)) + // Estimated: `3643` + // Minimum execution time: 36_449_000 picoseconds. + Weight::from_parts(36_816_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -148,10 +149,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn burn() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 33_895_000 picoseconds. - Weight::from_parts(34_205_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 37_704_000 picoseconds. + Weight::from_parts(38_102_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -166,10 +167,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 27_841_000 picoseconds. - Weight::from_parts(28_213_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 26_986_000 picoseconds. + Weight::from_parts(27_427_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -181,12 +182,12 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `738 + i * (76 ±0)` - // Estimated: `4633 + i * (2597 ±0)` - // Minimum execution time: 16_054_000 picoseconds. - Weight::from_parts(16_331_000, 0) - .saturating_add(Weight::from_parts(0, 4633)) - // Standard Error: 12_166 - .saturating_add(Weight::from_parts(13_413_428, 0).saturating_mul(i.into())) + // Estimated: `3643 + i * (2597 ±0)` + // Minimum execution time: 15_664_000 picoseconds. + Weight::from_parts(15_788_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) + // Standard Error: 12_408 + .saturating_add(Weight::from_parts(15_388_354, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -200,10 +201,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn freeze() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 19_419_000 picoseconds. - Weight::from_parts(19_724_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 19_399_000 picoseconds. + Weight::from_parts(19_658_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -214,10 +215,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn thaw() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 20_053_000 picoseconds. - Weight::from_parts(23_080_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 19_300_000 picoseconds. + Weight::from_parts(19_511_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -227,8 +228,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 15_569_000 picoseconds. - Weight::from_parts(16_658_000, 0) + // Minimum execution time: 14_407_000 picoseconds. + Weight::from_parts(14_748_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -239,8 +240,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 15_350_000 picoseconds. - Weight::from_parts(15_771_000, 0) + // Minimum execution time: 14_376_000 picoseconds. + Weight::from_parts(14_785_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -254,10 +255,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn transfer_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `356` - // Estimated: `7160` - // Minimum execution time: 23_564_000 picoseconds. - Weight::from_parts(24_005_000, 0) - .saturating_add(Weight::from_parts(0, 7160)) + // Estimated: `3643` + // Minimum execution time: 22_832_000 picoseconds. + Weight::from_parts(23_065_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -267,8 +268,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 16_165_000 picoseconds. - Weight::from_parts(16_482_000, 0) + // Minimum execution time: 15_379_000 picoseconds. + Weight::from_parts(15_798_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -281,8 +282,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 18_377_000 picoseconds. - Weight::from_parts(19_060_000, 0) + // Minimum execution time: 17_345_000 picoseconds. + Weight::from_parts(17_747_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -296,10 +297,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `559` - // Estimated: `10932` - // Minimum execution time: 39_403_000 picoseconds. - Weight::from_parts(39_925_000, 0) - .saturating_add(Weight::from_parts(0, 10932)) + // Estimated: `3652` + // Minimum execution time: 40_047_000 picoseconds. + Weight::from_parts(40_494_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -312,10 +313,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn clear_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `756` - // Estimated: `10932` - // Minimum execution time: 36_786_000 picoseconds. - Weight::from_parts(37_558_000, 0) - .saturating_add(Weight::from_parts(0, 10932)) + // Estimated: `3652` + // Minimum execution time: 39_254_000 picoseconds. + Weight::from_parts(39_689_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -326,10 +327,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `348` - // Estimated: `7295` - // Minimum execution time: 30_327_000 picoseconds. - Weight::from_parts(30_769_000, 0) - .saturating_add(Weight::from_parts(0, 7295)) + // Estimated: `3652` + // Minimum execution time: 31_189_000 picoseconds. + Weight::from_parts(31_431_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -340,10 +341,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn clear_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `559` - // Estimated: `7295` - // Minimum execution time: 29_756_000 picoseconds. - Weight::from_parts(31_077_000, 0) - .saturating_add(Weight::from_parts(0, 7295)) + // Estimated: `3652` + // Minimum execution time: 31_868_000 picoseconds. + Weight::from_parts(32_476_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -354,10 +355,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `282` - // Estimated: `7275` - // Minimum execution time: 29_811_000 picoseconds. - Weight::from_parts(30_220_000, 0) - .saturating_add(Weight::from_parts(0, 7275)) + // Estimated: `3643` + // Minimum execution time: 32_587_000 picoseconds. + Weight::from_parts(32_913_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -368,10 +369,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `473` - // Estimated: `7275` - // Minimum execution time: 27_708_000 picoseconds. - Weight::from_parts(28_309_000, 0) - .saturating_add(Weight::from_parts(0, 7275)) + // Estimated: `3643` + // Minimum execution time: 30_951_000 picoseconds. + Weight::from_parts(31_269_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -382,10 +383,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn approve_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 21_525_000 picoseconds. - Weight::from_parts(21_784_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 20_550_000 picoseconds. + Weight::from_parts(20_880_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -396,10 +397,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn cancel_approval() -> Weight { // Proof Size summary in bytes: // Measured: `461` - // Estimated: `7230` - // Minimum execution time: 21_605_000 picoseconds. - Weight::from_parts(21_805_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 20_593_000 picoseconds. + Weight::from_parts(20_816_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -409,8 +410,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3517` - // Minimum execution time: 17_046_000 picoseconds. - Weight::from_parts(17_387_000, 0) + // Minimum execution time: 16_290_000 picoseconds. + Weight::from_parts(16_841_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -422,10 +423,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: // Measured: `282` - // Estimated: `7132` - // Minimum execution time: 18_453_000 picoseconds. - Weight::from_parts(18_716_000, 0) - .saturating_add(Weight::from_parts(0, 7132)) + // Estimated: `3643` + // Minimum execution time: 17_538_000 picoseconds. + Weight::from_parts(17_775_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -437,8 +438,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `259` // Estimated: `3587` - // Minimum execution time: 17_965_000 picoseconds. - Weight::from_parts(18_347_000, 0) + // Minimum execution time: 17_311_000 picoseconds. + Weight::from_parts(17_495_000, 0) .saturating_add(Weight::from_parts(0, 3587)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -454,10 +455,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn buy_item() -> Weight { // Proof Size summary in bytes: // Measured: `540` - // Estimated: `10784` - // Minimum execution time: 38_974_000 picoseconds. - Weight::from_parts(39_420_000, 0) - .saturating_add(Weight::from_parts(0, 10784)) + // Estimated: `3643` + // Minimum execution time: 37_556_000 picoseconds. + Weight::from_parts(38_050_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs index d14fdba6fad..585bb7d7807 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_utility`. pub struct WeightInfo(PhantomData); @@ -52,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_357_000 picoseconds. - Weight::from_parts(16_071_177, 0) + // Minimum execution time: 7_223_000 picoseconds. + Weight::from_parts(9_533_894, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_492 - .saturating_add(Weight::from_parts(5_041_311, 0).saturating_mul(c.into())) + // Standard Error: 1_912 + .saturating_add(Weight::from_parts(4_539_292, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_903_000 picoseconds. - Weight::from_parts(6_075_000, 0) + // Minimum execution time: 5_345_000 picoseconds. + Weight::from_parts(5_436_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_616_000 picoseconds. - Weight::from_parts(17_676_240, 0) + // Minimum execution time: 7_096_000 picoseconds. + Weight::from_parts(10_872_600, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_274 - .saturating_add(Weight::from_parts(5_358_895, 0).saturating_mul(c.into())) + // Standard Error: 2_654 + .saturating_add(Weight::from_parts(4_834_319, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_072_000 picoseconds. - Weight::from_parts(10_405_000, 0) + // Minimum execution time: 9_519_000 picoseconds. + Weight::from_parts(9_776_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_207_000 picoseconds. - Weight::from_parts(18_974_639, 0) + // Minimum execution time: 7_149_000 picoseconds. + Weight::from_parts(17_125_597, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_301 - .saturating_add(Weight::from_parts(5_025_161, 0).saturating_mul(c.into())) + // Standard Error: 3_120 + .saturating_add(Weight::from_parts(4_553_744, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs index 32f1d1cd687..a8e6dfaa951 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); @@ -60,10 +61,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `9595` - // Minimum execution time: 27_505_000 picoseconds. - Weight::from_parts(27_841_000, 0) - .saturating_add(Weight::from_parts(0, 9595)) + // Estimated: `3503` + // Minimum execution time: 26_503_000 picoseconds. + Weight::from_parts(26_786_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 27_156_000 picoseconds. - Weight::from_parts(27_641_000, 0) + // Minimum execution time: 25_005_000 picoseconds. + Weight::from_parts(25_355_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -84,8 +85,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 20_954_000 picoseconds. - Weight::from_parts(21_381_000, 0) + // Minimum execution time: 19_585_000 picoseconds. + Weight::from_parts(19_921_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -105,8 +106,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_560_000 picoseconds. - Weight::from_parts(10_752_000, 0) + // Minimum execution time: 9_923_000 picoseconds. + Weight::from_parts(10_123_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -116,8 +117,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_451_000 picoseconds. - Weight::from_parts(3_580_000, 0) + // Minimum execution time: 3_048_000 picoseconds. + Weight::from_parts(3_226_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -140,10 +141,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `14659` - // Minimum execution time: 33_607_000 picoseconds. - Weight::from_parts(33_917_000, 0) - .saturating_add(Weight::from_parts(0, 14659)) + // Estimated: `3503` + // Minimum execution time: 30_761_000 picoseconds. + Weight::from_parts(31_177_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -164,19 +165,21 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `220` - // Estimated: `14410` - // Minimum execution time: 35_300_000 picoseconds. - Weight::from_parts(35_783_000, 0) - .saturating_add(Weight::from_parts(0, 14410)) + // Estimated: `3685` + // Minimum execution time: 33_124_000 picoseconds. + Weight::from_parts(33_531_000, 0) + .saturating_add(Weight::from_parts(0, 3685)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) + /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) fn force_suspension() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_451_000 picoseconds. - Weight::from_parts(3_580_000, 0) + // Minimum execution time: 3_119_000 picoseconds. + Weight::from_parts(3_353_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -186,8 +189,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `95` // Estimated: `10985` - // Minimum execution time: 15_664_000 picoseconds. - Weight::from_parts(15_908_000, 0) + // Minimum execution time: 14_497_000 picoseconds. + Weight::from_parts(14_785_000, 0) .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -198,8 +201,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `99` // Estimated: `10989` - // Minimum execution time: 15_376_000 picoseconds. - Weight::from_parts(15_780_000, 0) + // Minimum execution time: 14_846_000 picoseconds. + Weight::from_parts(15_064_000, 0) .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -210,8 +213,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `13471` - // Minimum execution time: 15_898_000 picoseconds. - Weight::from_parts(16_159_000, 0) + // Minimum execution time: 15_346_000 picoseconds. + Weight::from_parts(15_580_000, 0) .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -230,10 +233,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `15981` - // Minimum execution time: 31_267_000 picoseconds. - Weight::from_parts(31_635_000, 0) - .saturating_add(Weight::from_parts(0, 15981)) + // Estimated: `6046` + // Minimum execution time: 29_631_000 picoseconds. + Weight::from_parts(30_224_000, 0) + .saturating_add(Weight::from_parts(0, 6046)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -243,8 +246,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `136` // Estimated: `8551` - // Minimum execution time: 8_659_000 picoseconds. - Weight::from_parts(8_983_000, 0) + // Minimum execution time: 8_203_000 picoseconds. + Weight::from_parts(8_380_000, 0) .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -254,8 +257,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `10996` - // Minimum execution time: 16_025_000 picoseconds. - Weight::from_parts(16_296_000, 0) + // Minimum execution time: 15_138_000 picoseconds. + Weight::from_parts(15_396_000, 0) .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -275,10 +278,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `112` - // Estimated: `20967` - // Minimum execution time: 37_654_000 picoseconds. - Weight::from_parts(38_144_000, 0) - .saturating_add(Weight::from_parts(0, 20967)) + // Estimated: `11002` + // Minimum execution time: 34_941_000 picoseconds. + Weight::from_parts(35_810_000, 0) + .saturating_add(Weight::from_parts(0, 11002)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 147a348b19d..d80e9ec335c 100644 --- a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 23_489_000 picoseconds. - Weight::from_parts(23_993_000, 3593) + // Minimum execution time: 25_798_000 picoseconds. + Weight::from_parts(26_063_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 32_933_000 picoseconds. - Weight::from_parts(33_445_000, 6196) + // Minimum execution time: 48_637_000 picoseconds. + Weight::from_parts(49_176_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -87,9 +87,9 @@ impl WeightInfo { pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `139` - // Estimated: `17785` - // Minimum execution time: 56_285_000 picoseconds. - Weight::from_parts(56_858_000, 17785) + // Estimated: `6196` + // Minimum execution time: 69_969_000 picoseconds. + Weight::from_parts(70_663_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_900_000 picoseconds. - Weight::from_parts(4_996_000, 0) + // Minimum execution time: 3_909_000 picoseconds. + Weight::from_parts(4_060_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 26_047_000 picoseconds. - Weight::from_parts(26_408_000, 3593) + // Minimum execution time: 26_306_000 picoseconds. + Weight::from_parts(26_822_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -128,9 +128,9 @@ impl WeightInfo { pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `14677` - // Minimum execution time: 48_997_000 picoseconds. - Weight::from_parts(49_605_000, 14677) + // Estimated: `3593` + // Minimum execution time: 48_829_000 picoseconds. + Weight::from_parts(49_277_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -149,9 +149,9 @@ impl WeightInfo { pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 31_114_000 picoseconds. - Weight::from_parts(31_825_000, 11084) + // Estimated: `3503` + // Minimum execution time: 28_753_000 picoseconds. + Weight::from_parts(29_256_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index ca264e8fa17..f38bec29144 100644 --- a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 @@ -63,9 +63,9 @@ impl WeightInfo { pub fn report_holding() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 452_120_000 picoseconds. - Weight::from_parts(453_246_000, 11084) + // Estimated: `3503` + // Minimum execution time: 360_004_000 picoseconds. + Weight::from_parts(361_533_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_323_000 picoseconds. - Weight::from_parts(4_409_000, 0) + // Minimum execution time: 4_029_000 picoseconds. + Weight::from_parts(4_132_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 12_046_000 picoseconds. - Weight::from_parts(12_316_000, 3497) + // Minimum execution time: 10_802_000 picoseconds. + Weight::from_parts(10_932_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 14_603_000 picoseconds. - Weight::from_parts(14_929_000, 0) + // Minimum execution time: 13_281_000 picoseconds. + Weight::from_parts(13_574_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_461_000 picoseconds. - Weight::from_parts(4_655_000, 0) + // Minimum execution time: 4_257_000 picoseconds. + Weight::from_parts(4_394_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_400_000 picoseconds. - Weight::from_parts(3_487_000, 0) + // Minimum execution time: 2_829_000 picoseconds. + Weight::from_parts(2_911_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_337_000 picoseconds. - Weight::from_parts(3_403_000, 0) + // Minimum execution time: 2_881_000 picoseconds. + Weight::from_parts(2_964_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_259_000 picoseconds. - Weight::from_parts(3_350_000, 0) + // Minimum execution time: 2_850_000 picoseconds. + Weight::from_parts(2_915_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_292_000 picoseconds. - Weight::from_parts(4_471_000, 0) + // Minimum execution time: 3_663_000 picoseconds. + Weight::from_parts(3_745_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_281_000 picoseconds. - Weight::from_parts(3_329_000, 0) + // Minimum execution time: 2_804_000 picoseconds. + Weight::from_parts(2_895_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -150,9 +150,9 @@ impl WeightInfo { pub fn report_error() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 26_054_000 picoseconds. - Weight::from_parts(26_386_000, 11084) + // Estimated: `3503` + // Minimum execution time: 24_558_000 picoseconds. + Weight::from_parts(24_983_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 16_413_000 picoseconds. - Weight::from_parts(16_590_000, 3555) + // Minimum execution time: 15_020_000 picoseconds. + Weight::from_parts(15_368_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_314_000 picoseconds. - Weight::from_parts(3_410_000, 0) + // Minimum execution time: 2_954_000 picoseconds. + Weight::from_parts(3_028_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -189,9 +189,9 @@ impl WeightInfo { pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `13098` - // Minimum execution time: 28_232_000 picoseconds. - Weight::from_parts(28_661_000, 13098) + // Estimated: `3503` + // Minimum execution time: 26_773_000 picoseconds. + Weight::from_parts(27_256_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_517_000 picoseconds. - Weight::from_parts(5_596_000, 0) + // Minimum execution time: 4_896_000 picoseconds. + Weight::from_parts(5_044_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -220,9 +220,9 @@ impl WeightInfo { pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 502_759_000 picoseconds. - Weight::from_parts(504_262_000, 11084) + // Estimated: `3503` + // Minimum execution time: 399_114_000 picoseconds. + Weight::from_parts(400_268_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 157_990_000 picoseconds. - Weight::from_parts(158_216_000, 0) + // Minimum execution time: 122_318_000 picoseconds. + Weight::from_parts(122_649_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 15_005_000 picoseconds. - Weight::from_parts(15_203_000, 0) + // Minimum execution time: 12_851_000 picoseconds. + Weight::from_parts(13_267_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_475_000 picoseconds. - Weight::from_parts(3_522_000, 0) + // Minimum execution time: 2_886_000 picoseconds. + Weight::from_parts(2_954_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_343_000 picoseconds. - Weight::from_parts(3_417_000, 0) + // Minimum execution time: 2_920_000 picoseconds. + Weight::from_parts(3_021_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_519_000 picoseconds. - Weight::from_parts(3_625_000, 0) + // Minimum execution time: 3_184_000 picoseconds. + Weight::from_parts(3_236_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -276,9 +276,9 @@ impl WeightInfo { pub fn query_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 29_760_000 picoseconds. - Weight::from_parts(30_340_000, 11084) + // Estimated: `3503` + // Minimum execution time: 27_230_000 picoseconds. + Weight::from_parts(27_825_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_732_000 picoseconds. - Weight::from_parts(5_858_000, 0) + // Minimum execution time: 5_273_000 picoseconds. + Weight::from_parts(5_359_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -304,9 +304,9 @@ impl WeightInfo { pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `11084` - // Minimum execution time: 26_440_000 picoseconds. - Weight::from_parts(26_870_000, 11084) + // Estimated: `3503` + // Minimum execution time: 24_714_000 picoseconds. + Weight::from_parts(25_082_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_334_000 picoseconds. - Weight::from_parts(3_408_000, 0) + // Minimum execution time: 2_817_000 picoseconds. + Weight::from_parts(2_880_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_263_000 picoseconds. - Weight::from_parts(3_380_000, 0) + // Minimum execution time: 2_775_000 picoseconds. + Weight::from_parts(2_847_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_338_000 picoseconds. - Weight::from_parts(3_388_000, 0) + // Minimum execution time: 2_806_000 picoseconds. + Weight::from_parts(2_869_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_286_000 picoseconds. - Weight::from_parts(3_384_000, 0) + // Minimum execution time: 2_881_000 picoseconds. + Weight::from_parts(2_964_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_494_000 picoseconds. - Weight::from_parts(3_563_000, 0) + // Minimum execution time: 2_985_000 picoseconds. + Weight::from_parts(3_087_000, 0) } } diff --git a/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs index b796e65485d..01d65b30b4a 100644 --- a/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_xcmp_queue`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_380_000 picoseconds. - Weight::from_parts(5_626_000, 0) + // Minimum execution time: 5_514_000 picoseconds. + Weight::from_parts(5_658_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_537_000 picoseconds. - Weight::from_parts(5_744_000, 0) + // Minimum execution time: 5_517_000 picoseconds. + Weight::from_parts(5_773_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/assets/westmint/src/weights/frame_system.rs b/parachains/runtimes/assets/westmint/src/weights/frame_system.rs index 9f0e1e43f56..faa5dc2f76c 100644 --- a/parachains/runtimes/assets/westmint/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/westmint/src/weights/frame_system.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `frame_system`. pub struct WeightInfo(PhantomData); @@ -52,22 +53,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_150_000 picoseconds. - Weight::from_parts(2_242_000, 0) + // Minimum execution time: 2_250_000 picoseconds. + Weight::from_parts(2_324_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(368, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(367, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_810_000 picoseconds. - Weight::from_parts(7_949_000, 0) + // Minimum execution time: 7_617_000 picoseconds. + Weight::from_parts(7_744_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_408, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_399, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -77,8 +78,8 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 4_446_000 picoseconds. - Weight::from_parts(4_769_000, 0) + // Minimum execution time: 4_491_000 picoseconds. + Weight::from_parts(4_652_000, 0) .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -90,11 +91,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_378_000 picoseconds. - Weight::from_parts(2_458_000, 0) + // Minimum execution time: 2_463_000 picoseconds. + Weight::from_parts(2_499_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_873 - .saturating_add(Weight::from_parts(680_971, 0).saturating_mul(i.into())) + // Standard Error: 1_952 + .saturating_add(Weight::from_parts(673_075, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +105,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_389_000 picoseconds. - Weight::from_parts(2_433_000, 0) + // Minimum execution time: 2_336_000 picoseconds. + Weight::from_parts(2_403_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 765 - .saturating_add(Weight::from_parts(502_307, 0).saturating_mul(i.into())) + // Standard Error: 792 + .saturating_add(Weight::from_parts(491_501, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -117,12 +118,12 @@ impl frame_system::WeightInfo for WeightInfo { fn kill_prefix(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `84 + p * (69 ±0)` - // Estimated: `75 + p * (70 ±0)` - // Minimum execution time: 4_077_000 picoseconds. - Weight::from_parts(4_196_000, 0) - .saturating_add(Weight::from_parts(0, 75)) - // Standard Error: 920 - .saturating_add(Weight::from_parts(1_004_901, 0).saturating_mul(p.into())) + // Estimated: `77 + p * (70 ±0)` + // Minimum execution time: 4_246_000 picoseconds. + Weight::from_parts(4_352_000, 0) + .saturating_add(Weight::from_parts(0, 77)) + // Standard Error: 1_010 + .saturating_add(Weight::from_parts(1_048_520, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs index acae356b1cb..865d674d6ce 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_balances`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 35_470_000 picoseconds. - Weight::from_parts(36_170_000, 0) + // Minimum execution time: 52_618_000 picoseconds. + Weight::from_parts(53_260_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 26_173_000 picoseconds. - Weight::from_parts(26_636_000, 0) + // Minimum execution time: 39_969_000 picoseconds. + Weight::from_parts(40_584_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -77,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 15_875_000 picoseconds. - Weight::from_parts(16_109_000, 0) + // Minimum execution time: 15_907_000 picoseconds. + Weight::from_parts(16_236_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -89,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 18_726_000 picoseconds. - Weight::from_parts(19_101_000, 0) + // Minimum execution time: 22_839_000 picoseconds. + Weight::from_parts(23_138_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -101,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 37_080_000 picoseconds. - Weight::from_parts(37_562_000, 0) + // Minimum execution time: 53_986_000 picoseconds. + Weight::from_parts(54_583_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -113,25 +114,38 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 32_468_000 picoseconds. - Weight::from_parts(32_858_000, 0) + // Minimum execution time: 48_496_000 picoseconds. + Weight::from_parts(49_111_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - fn upgrade_accounts(_: u32) -> Weight { - Weight::from_parts(0, 0) - } fn force_unreserve() -> Weight { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 14_725_000 picoseconds. - Weight::from_parts(14_926_000, 0) + // Minimum execution time: 18_457_000 picoseconds. + Weight::from_parts(18_719_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: System Account (r:999 w:999) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 18_243_000 picoseconds. + Weight::from_parts(18_314_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 10_135 + .saturating_add(Weight::from_parts(13_980_773, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs index eaabe14f8b1..5e7b72e9cd8 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_collator_selection`. pub struct WeightInfo(PhantomData); @@ -56,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` // Estimated: `1168 + b * (2554 ±0)` - // Minimum execution time: 15_458_000 picoseconds. - Weight::from_parts(16_243_295, 0) + // Minimum execution time: 14_583_000 picoseconds. + Weight::from_parts(14_662_374, 0) .saturating_add(Weight::from_parts(0, 1168)) - // Standard Error: 3_682 - .saturating_add(Weight::from_parts(2_601_545, 0).saturating_mul(b.into())) + // Standard Error: 2_862 + .saturating_add(Weight::from_parts(2_576_034, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_542_000 picoseconds. - Weight::from_parts(7_735_000, 0) + // Minimum execution time: 7_240_000 picoseconds. + Weight::from_parts(7_430_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_344_000 picoseconds. - Weight::from_parts(7_660_000, 0) + // Minimum execution time: 7_517_000 picoseconds. + Weight::from_parts(7_704_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,12 +104,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `1108 + c * (48 ±0)` - // Estimated: `61671 + c * (49 ±0)` - // Minimum execution time: 38_651_000 picoseconds. - Weight::from_parts(31_016_267, 0) - .saturating_add(Weight::from_parts(0, 61671)) - // Standard Error: 1_279 - .saturating_add(Weight::from_parts(106_148, 0).saturating_mul(c.into())) + // Estimated: `49487 + c * (49 ±0)` + // Minimum execution time: 42_001_000 picoseconds. + Weight::from_parts(34_741_590, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_220 + .saturating_add(Weight::from_parts(104_452, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -122,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `469 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 27_474_000 picoseconds. - Weight::from_parts(18_915_300, 0) + // Minimum execution time: 31_537_000 picoseconds. + Weight::from_parts(23_342_837, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_242 - .saturating_add(Weight::from_parts(107_733, 0).saturating_mul(c.into())) + // Standard Error: 1_210 + .saturating_add(Weight::from_parts(104_584, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -139,10 +140,10 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn note_author() -> Weight { // Proof Size summary in bytes: // Measured: `103` - // Estimated: `7729` - // Minimum execution time: 29_327_000 picoseconds. - Weight::from_parts(29_858_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `6196` + // Minimum execution time: 42_787_000 picoseconds. + Weight::from_parts(43_339_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +161,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22693 + r * (116 ±0) + c * (97 ±0)` - // Estimated: `56697 + r * (2603 ±0) + c * (2520 ±0)` - // Minimum execution time: 17_185_000 picoseconds. - Weight::from_parts(17_436_000, 0) - .saturating_add(Weight::from_parts(0, 56697)) - // Standard Error: 795_522 - .saturating_add(Weight::from_parts(28_877_010, 0).saturating_mul(c.into())) + // Measured: `22693 + c * (97 ±0) + r * (116 ±0)` + // Estimated: `49487 + c * (2519 ±0) + r * (2603 ±0)` + // Minimum execution time: 17_395_000 picoseconds. + Weight::from_parts(17_530_000, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 848_373 + .saturating_add(Weight::from_parts(30_252_593, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) + .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(r.into())) - .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs index b01f73c3007..a98f72512a0 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_multisig`. pub struct WeightInfo(PhantomData); @@ -52,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_071_000 picoseconds. - Weight::from_parts(12_418_308, 0) + // Minimum execution time: 11_856_000 picoseconds. + Weight::from_parts(12_334_994, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1 - .saturating_add(Weight::from_parts(495, 0).saturating_mul(z.into())) + // Standard Error: 2 + .saturating_add(Weight::from_parts(506, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -66,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `262 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 37_454_000 picoseconds. - Weight::from_parts(31_908_123, 0) + // Minimum execution time: 41_975_000 picoseconds. + Weight::from_parts(35_772_064, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 637 - .saturating_add(Weight::from_parts(62_530, 0).saturating_mul(s.into())) - // Standard Error: 6 - .saturating_add(Weight::from_parts(1_217, 0).saturating_mul(z.into())) + // Standard Error: 481 + .saturating_add(Weight::from_parts(67_985, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_213, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -84,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 27_665_000 picoseconds. - Weight::from_parts(21_985_439, 0) + // Minimum execution time: 28_065_000 picoseconds. + Weight::from_parts(22_550_479, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 509 - .saturating_add(Weight::from_parts(63_318, 0).saturating_mul(s.into())) - // Standard Error: 4 - .saturating_add(Weight::from_parts(1_187, 0).saturating_mul(z.into())) + // Standard Error: 333 + .saturating_add(Weight::from_parts(60_600, 0).saturating_mul(s.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_194, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,14 +104,14 @@ impl pallet_multisig::WeightInfo for WeightInfo { fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `385 + s * (33 ±0)` - // Estimated: `10404` - // Minimum execution time: 42_985_000 picoseconds. - Weight::from_parts(35_504_175, 0) - .saturating_add(Weight::from_parts(0, 10404)) - // Standard Error: 530 - .saturating_add(Weight::from_parts(80_153, 0).saturating_mul(s.into())) + // Estimated: `6811` + // Minimum execution time: 47_059_000 picoseconds. + Weight::from_parts(39_787_186, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 556 + .saturating_add(Weight::from_parts(82_920, 0).saturating_mul(s.into())) // Standard Error: 5 - .saturating_add(Weight::from_parts(1_215, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_236, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -121,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 28_498_000 picoseconds. - Weight::from_parts(30_376_601, 0) + // Minimum execution time: 31_979_000 picoseconds. + Weight::from_parts(33_915_067, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 785 - .saturating_add(Weight::from_parts(65_913, 0).saturating_mul(s.into())) + // Standard Error: 567 + .saturating_add(Weight::from_parts(72_232, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -136,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 19_047_000 picoseconds. - Weight::from_parts(20_338_502, 0) + // Minimum execution time: 19_301_000 picoseconds. + Weight::from_parts(20_450_461, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 544 - .saturating_add(Weight::from_parts(66_876, 0).saturating_mul(s.into())) + // Standard Error: 407 + .saturating_add(Weight::from_parts(63_650, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -151,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 29_085_000 picoseconds. - Weight::from_parts(31_283_618, 0) + // Minimum execution time: 32_846_000 picoseconds. + Weight::from_parts(34_842_187, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 985 - .saturating_add(Weight::from_parts(67_469, 0).saturating_mul(s.into())) + // Standard Error: 637 + .saturating_add(Weight::from_parts(71_046, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs index 904f7823041..437bbd74b77 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_nfts` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_nfts`. pub struct WeightInfo(PhantomData); @@ -60,10 +61,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn create() -> Weight { // Proof Size summary in bytes: // Measured: `145` - // Estimated: `5038` - // Minimum execution time: 34_344_000 picoseconds. - Weight::from_parts(35_251_000, 0) - .saturating_add(Weight::from_parts(0, 5038)) + // Estimated: `3549` + // Minimum execution time: 38_536_000 picoseconds. + Weight::from_parts(39_046_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -80,10 +81,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `5038` - // Minimum execution time: 22_704_000 picoseconds. - Weight::from_parts(23_146_000, 0) - .saturating_add(Weight::from_parts(0, 5038)) + // Estimated: `3549` + // Minimum execution time: 22_776_000 picoseconds. + Weight::from_parts(23_177_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -109,12 +110,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn destroy(_m: u32, _c: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `32170 + a * (366 ±0)` - // Estimated: `2538829 + a * (2954 ±0)` - // Minimum execution time: 976_206_000 picoseconds. - Weight::from_parts(924_770_064, 0) - .saturating_add(Weight::from_parts(0, 2538829)) - // Standard Error: 3_946 - .saturating_add(Weight::from_parts(5_708_229, 0).saturating_mul(a.into())) + // Estimated: `2523990 + a * (2954 ±0)` + // Minimum execution time: 989_671_000 picoseconds. + Weight::from_parts(935_494_331, 0) + .saturating_add(Weight::from_parts(0, 2523990)) + // Standard Error: 3_986 + .saturating_add(Weight::from_parts(5_721_724, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(1004)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(1005)) @@ -136,10 +137,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn mint() -> Weight { // Proof Size summary in bytes: // Measured: `421` - // Estimated: `18460` - // Minimum execution time: 44_592_000 picoseconds. - Weight::from_parts(45_181_000, 0) - .saturating_add(Weight::from_parts(0, 18460)) + // Estimated: `4326` + // Minimum execution time: 48_990_000 picoseconds. + Weight::from_parts(49_439_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -158,10 +159,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn force_mint() -> Weight { // Proof Size summary in bytes: // Measured: `421` - // Estimated: `18460` - // Minimum execution time: 43_304_000 picoseconds. - Weight::from_parts(43_977_000, 0) - .saturating_add(Weight::from_parts(0, 18460)) + // Estimated: `4326` + // Minimum execution time: 48_068_000 picoseconds. + Weight::from_parts(48_446_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -184,10 +185,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn burn() -> Weight { // Proof Size summary in bytes: // Measured: `530` - // Estimated: `15200` - // Minimum execution time: 45_744_000 picoseconds. - Weight::from_parts(46_056_000, 0) - .saturating_add(Weight::from_parts(0, 15200)) + // Estimated: `4326` + // Minimum execution time: 48_943_000 picoseconds. + Weight::from_parts(49_568_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(7)) } @@ -208,10 +209,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `559` - // Estimated: `14926` - // Minimum execution time: 35_663_000 picoseconds. - Weight::from_parts(36_865_000, 0) - .saturating_add(Weight::from_parts(0, 14926)) + // Estimated: `4326` + // Minimum execution time: 35_764_000 picoseconds. + Weight::from_parts(36_232_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -225,12 +226,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `729 + i * (108 ±0)` - // Estimated: `8077 + i * (3336 ±0)` - // Minimum execution time: 16_987_000 picoseconds. - Weight::from_parts(17_194_000, 0) - .saturating_add(Weight::from_parts(0, 8077)) - // Standard Error: 13_044 - .saturating_add(Weight::from_parts(13_324_147, 0).saturating_mul(i.into())) + // Estimated: `3549 + i * (3336 ±0)` + // Minimum execution time: 17_108_000 picoseconds. + Weight::from_parts(17_220_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) + // Standard Error: 14_557 + .saturating_add(Weight::from_parts(15_545_711, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) @@ -243,10 +244,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn lock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `401` - // Estimated: `7047` - // Minimum execution time: 20_345_000 picoseconds. - Weight::from_parts(20_739_000, 0) - .saturating_add(Weight::from_parts(0, 7047)) + // Estimated: `3534` + // Minimum execution time: 20_958_000 picoseconds. + Weight::from_parts(21_129_000, 0) + .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -257,10 +258,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn unlock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `401` - // Estimated: `7047` - // Minimum execution time: 20_167_000 picoseconds. - Weight::from_parts(20_580_000, 0) - .saturating_add(Weight::from_parts(0, 7047)) + // Estimated: `3534` + // Minimum execution time: 20_864_000 picoseconds. + Weight::from_parts(21_016_000, 0) + .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -271,10 +272,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn lock_collection() -> Weight { // Proof Size summary in bytes: // Measured: `306` - // Estimated: `7087` - // Minimum execution time: 17_831_000 picoseconds. - Weight::from_parts(18_174_000, 0) - .saturating_add(Weight::from_parts(0, 7087)) + // Estimated: `3549` + // Minimum execution time: 17_934_000 picoseconds. + Weight::from_parts(18_152_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -287,10 +288,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn transfer_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `354` - // Estimated: `7066` - // Minimum execution time: 23_763_000 picoseconds. - Weight::from_parts(24_226_000, 0) - .saturating_add(Weight::from_parts(0, 7066)) + // Estimated: `3549` + // Minimum execution time: 23_477_000 picoseconds. + Weight::from_parts(23_830_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -301,10 +302,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_team() -> Weight { // Proof Size summary in bytes: // Measured: `335` - // Estimated: `9627` - // Minimum execution time: 40_034_000 picoseconds. - Weight::from_parts(40_402_000, 0) - .saturating_add(Weight::from_parts(0, 9627)) + // Estimated: `6078` + // Minimum execution time: 40_775_000 picoseconds. + Weight::from_parts(41_159_000, 0) + .saturating_add(Weight::from_parts(0, 6078)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -316,8 +317,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `277` // Estimated: `3549` - // Minimum execution time: 18_648_000 picoseconds. - Weight::from_parts(18_968_000, 0) + // Minimum execution time: 18_569_000 picoseconds. + Weight::from_parts(18_844_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) @@ -330,8 +331,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `242` // Estimated: `3549` - // Minimum execution time: 15_282_000 picoseconds. - Weight::from_parts(15_923_000, 0) + // Minimum execution time: 15_395_000 picoseconds. + Weight::from_parts(15_554_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -343,10 +344,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn lock_item_properties() -> Weight { // Proof Size summary in bytes: // Measured: `401` - // Estimated: `7047` - // Minimum execution time: 20_060_000 picoseconds. - Weight::from_parts(20_326_000, 0) - .saturating_add(Weight::from_parts(0, 7047)) + // Estimated: `3534` + // Minimum execution time: 20_497_000 picoseconds. + Weight::from_parts(20_872_000, 0) + .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -363,10 +364,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `505` - // Estimated: `18078` - // Minimum execution time: 48_324_000 picoseconds. - Weight::from_parts(48_745_000, 0) - .saturating_add(Weight::from_parts(0, 18078)) + // Estimated: `3944` + // Minimum execution time: 49_930_000 picoseconds. + Weight::from_parts(50_200_000, 0) + .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -377,10 +378,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn force_set_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `310` - // Estimated: `7493` - // Minimum execution time: 27_935_000 picoseconds. - Weight::from_parts(28_241_000, 0) - .saturating_add(Weight::from_parts(0, 7493)) + // Estimated: `3944` + // Minimum execution time: 27_930_000 picoseconds. + Weight::from_parts(28_319_000, 0) + .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -395,10 +396,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn clear_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `949` - // Estimated: `14540` - // Minimum execution time: 44_972_000 picoseconds. - Weight::from_parts(45_618_000, 0) - .saturating_add(Weight::from_parts(0, 14540)) + // Estimated: `3944` + // Minimum execution time: 47_306_000 picoseconds. + Weight::from_parts(47_676_000, 0) + .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -409,10 +410,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn approve_item_attributes() -> Weight { // Proof Size summary in bytes: // Measured: `347` - // Estimated: `8792` - // Minimum execution time: 19_246_000 picoseconds. - Weight::from_parts(19_715_000, 0) - .saturating_add(Weight::from_parts(0, 8792)) + // Estimated: `4466` + // Minimum execution time: 18_749_000 picoseconds. + Weight::from_parts(19_080_000, 0) + .saturating_add(Weight::from_parts(0, 4466)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -428,12 +429,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn cancel_item_attributes_approval(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `726 + n * (398 ±0)` - // Estimated: `16329 + n * (2954 ±0)` - // Minimum execution time: 28_372_000 picoseconds. - Weight::from_parts(28_671_000, 0) - .saturating_add(Weight::from_parts(0, 16329)) - // Standard Error: 3_479 - .saturating_add(Weight::from_parts(5_527_336, 0).saturating_mul(n.into())) + // Estimated: `4466 + n * (2954 ±0)` + // Minimum execution time: 28_200_000 picoseconds. + Weight::from_parts(28_552_000, 0) + .saturating_add(Weight::from_parts(0, 4466)) + // Standard Error: 3_352 + .saturating_add(Weight::from_parts(5_584_045, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) @@ -453,10 +454,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `505` - // Estimated: `17946` - // Minimum execution time: 39_852_000 picoseconds. - Weight::from_parts(40_280_000, 0) - .saturating_add(Weight::from_parts(0, 17946)) + // Estimated: `3812` + // Minimum execution time: 41_646_000 picoseconds. + Weight::from_parts(42_171_000, 0) + .saturating_add(Weight::from_parts(0, 3812)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -471,10 +472,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn clear_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `815` - // Estimated: `14408` - // Minimum execution time: 36_829_000 picoseconds. - Weight::from_parts(37_513_000, 0) - .saturating_add(Weight::from_parts(0, 14408)) + // Estimated: `3812` + // Minimum execution time: 40_022_000 picoseconds. + Weight::from_parts(40_363_000, 0) + .saturating_add(Weight::from_parts(0, 3812)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -489,10 +490,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `364` - // Estimated: `14380` - // Minimum execution time: 35_398_000 picoseconds. - Weight::from_parts(35_809_000, 0) - .saturating_add(Weight::from_parts(0, 14380)) + // Estimated: `3759` + // Minimum execution time: 38_872_000 picoseconds. + Weight::from_parts(39_223_000, 0) + .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -507,10 +508,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `682` - // Estimated: `14380` - // Minimum execution time: 33_699_000 picoseconds. - Weight::from_parts(34_170_000, 0) - .saturating_add(Weight::from_parts(0, 14380)) + // Estimated: `3759` + // Minimum execution time: 37_582_000 picoseconds. + Weight::from_parts(38_305_000, 0) + .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -521,10 +522,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn approve_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `376` - // Estimated: `7864` - // Minimum execution time: 21_789_000 picoseconds. - Weight::from_parts(22_454_000, 0) - .saturating_add(Weight::from_parts(0, 7864)) + // Estimated: `4326` + // Minimum execution time: 22_551_000 picoseconds. + Weight::from_parts(22_984_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -534,8 +535,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `384` // Estimated: `4326` - // Minimum execution time: 19_532_000 picoseconds. - Weight::from_parts(19_761_000, 0) + // Minimum execution time: 19_879_000 picoseconds. + Weight::from_parts(20_310_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -546,8 +547,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `384` // Estimated: `4326` - // Minimum execution time: 18_620_000 picoseconds. - Weight::from_parts(19_014_000, 0) + // Minimum execution time: 18_958_000 picoseconds. + Weight::from_parts(19_247_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -558,8 +559,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3517` - // Minimum execution time: 16_491_000 picoseconds. - Weight::from_parts(16_888_000, 0) + // Minimum execution time: 16_432_000 picoseconds. + Weight::from_parts(16_762_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -571,10 +572,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: // Measured: `306` - // Estimated: `7087` - // Minimum execution time: 19_929_000 picoseconds. - Weight::from_parts(20_170_000, 0) - .saturating_add(Weight::from_parts(0, 7087)) + // Estimated: `3549` + // Minimum execution time: 19_950_000 picoseconds. + Weight::from_parts(20_169_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -585,10 +586,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn update_mint_settings() -> Weight { // Proof Size summary in bytes: // Measured: `289` - // Estimated: `7072` - // Minimum execution time: 19_500_000 picoseconds. - Weight::from_parts(19_839_000, 0) - .saturating_add(Weight::from_parts(0, 7072)) + // Estimated: `3538` + // Minimum execution time: 19_727_000 picoseconds. + Weight::from_parts(19_977_000, 0) + .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -603,10 +604,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_price() -> Weight { // Proof Size summary in bytes: // Measured: `484` - // Estimated: `11377` - // Minimum execution time: 24_542_000 picoseconds. - Weight::from_parts(24_916_000, 0) - .saturating_add(Weight::from_parts(0, 11377)) + // Estimated: `4326` + // Minimum execution time: 24_200_000 picoseconds. + Weight::from_parts(24_433_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -627,10 +628,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn buy_item() -> Weight { // Proof Size summary in bytes: // Measured: `671` - // Estimated: `18480` - // Minimum execution time: 44_311_000 picoseconds. - Weight::from_parts(45_789_000, 0) - .saturating_add(Weight::from_parts(0, 18480)) + // Estimated: `4326` + // Minimum execution time: 44_868_000 picoseconds. + Weight::from_parts(45_386_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -639,11 +640,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_523_000 picoseconds. - Weight::from_parts(4_349_031, 0) + // Minimum execution time: 2_573_000 picoseconds. + Weight::from_parts(4_309_077, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 10_427 - .saturating_add(Weight::from_parts(3_718_129, 0).saturating_mul(n.into())) + // Standard Error: 9_731 + .saturating_add(Weight::from_parts(3_668_159, 0).saturating_mul(n.into())) } /// Storage: Nfts Item (r:2 w:0) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) @@ -653,8 +654,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `460` // Estimated: `7662` - // Minimum execution time: 23_007_000 picoseconds. - Weight::from_parts(23_305_000, 0) + // Minimum execution time: 22_763_000 picoseconds. + Weight::from_parts(22_911_000, 0) .saturating_add(Weight::from_parts(0, 7662)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -666,10 +667,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn cancel_swap() -> Weight { // Proof Size summary in bytes: // Measured: `479` - // Estimated: `7862` - // Minimum execution time: 21_173_000 picoseconds. - Weight::from_parts(21_451_000, 0) - .saturating_add(Weight::from_parts(0, 7862)) + // Estimated: `4326` + // Minimum execution time: 21_393_000 picoseconds. + Weight::from_parts(21_656_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -690,10 +691,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn claim_swap() -> Weight { // Proof Size summary in bytes: // Measured: `800` - // Estimated: `24321` - // Minimum execution time: 72_213_000 picoseconds. - Weight::from_parts(73_029_000, 0) - .saturating_add(Weight::from_parts(0, 24321)) + // Estimated: `7662` + // Minimum execution time: 73_894_000 picoseconds. + Weight::from_parts(75_692_000, 0) + .saturating_add(Weight::from_parts(0, 7662)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(10)) } @@ -719,12 +720,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn mint_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `524` - // Estimated: `29399 + n * (2954 ±0)` - // Minimum execution time: 125_518_000 picoseconds. - Weight::from_parts(129_781_908, 0) - .saturating_add(Weight::from_parts(0, 29399)) - // Standard Error: 21_840 - .saturating_add(Weight::from_parts(26_756_136, 0).saturating_mul(n.into())) + // Estimated: `6078 + n * (2954 ±0)` + // Minimum execution time: 132_196_000 picoseconds. + Weight::from_parts(136_454_873, 0) + .saturating_add(Weight::from_parts(0, 6078)) + // Standard Error: 18_901 + .saturating_add(Weight::from_parts(29_375_812, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6)) @@ -747,12 +748,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { fn set_attributes_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `554` - // Estimated: `20462 + n * (2954 ±0)` - // Minimum execution time: 76_133_000 picoseconds. - Weight::from_parts(85_559_988, 0) - .saturating_add(Weight::from_parts(0, 20462)) - // Standard Error: 49_851 - .saturating_add(Weight::from_parts(26_551_215, 0).saturating_mul(n.into())) + // Estimated: `4466 + n * (2954 ±0)` + // Minimum execution time: 76_734_000 picoseconds. + Weight::from_parts(87_761_745, 0) + .saturating_add(Weight::from_parts(0, 4466)) + // Standard Error: 59_520 + .saturating_add(Weight::from_parts(28_979_367, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs index fa22bf7bf68..dbee1b7b3e2 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_proxy`. pub struct WeightInfo(PhantomData); @@ -54,11 +55,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 16_562_000 picoseconds. - Weight::from_parts(17_305_360, 0) + // Minimum execution time: 16_863_000 picoseconds. + Weight::from_parts(17_287_999, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_081 - .saturating_add(Weight::from_parts(37_267, 0).saturating_mul(p.into())) + // Standard Error: 841 + .saturating_add(Weight::from_parts(25_908, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -72,14 +73,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn proxy_announced(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `454 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `13997` - // Minimum execution time: 35_181_000 picoseconds. - Weight::from_parts(34_864_956, 0) - .saturating_add(Weight::from_parts(0, 13997)) - // Standard Error: 5_023 - .saturating_add(Weight::from_parts(158_916, 0).saturating_mul(a.into())) - // Standard Error: 5_189 - .saturating_add(Weight::from_parts(60_136, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 38_170_000 picoseconds. + Weight::from_parts(37_695_584, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_836 + .saturating_add(Weight::from_parts(146_800, 0).saturating_mul(a.into())) + // Standard Error: 1_897 + .saturating_add(Weight::from_parts(38_057, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -92,14 +93,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn remove_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` - // Estimated: `9291` - // Minimum execution time: 21_758_000 picoseconds. - Weight::from_parts(23_149_882, 0) - .saturating_add(Weight::from_parts(0, 9291)) - // Standard Error: 1_877 - .saturating_add(Weight::from_parts(145_269, 0).saturating_mul(a.into())) - // Standard Error: 1_940 - .saturating_add(Weight::from_parts(5_129, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 25_161_000 picoseconds. + Weight::from_parts(25_440_795, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_095 + .saturating_add(Weight::from_parts(135_319, 0).saturating_mul(a.into())) + // Standard Error: 1_131 + .saturating_add(Weight::from_parts(11_250, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -112,14 +113,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn reject_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` - // Estimated: `9291` - // Minimum execution time: 22_076_000 picoseconds. - Weight::from_parts(22_959_374, 0) - .saturating_add(Weight::from_parts(0, 9291)) - // Standard Error: 1_377 - .saturating_add(Weight::from_parts(146_462, 0).saturating_mul(a.into())) - // Standard Error: 1_423 - .saturating_add(Weight::from_parts(11_551, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 25_441_000 picoseconds. + Weight::from_parts(25_850_657, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_148 + .saturating_add(Weight::from_parts(127_981, 0).saturating_mul(a.into())) + // Standard Error: 1_186 + .saturating_add(Weight::from_parts(6_961, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -134,14 +135,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn announce(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `386 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `13997` - // Minimum execution time: 30_751_000 picoseconds. - Weight::from_parts(31_929_484, 0) - .saturating_add(Weight::from_parts(0, 13997)) - // Standard Error: 2_087 - .saturating_add(Weight::from_parts(147_703, 0).saturating_mul(a.into())) - // Standard Error: 2_156 - .saturating_add(Weight::from_parts(27_798, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 34_657_000 picoseconds. + Weight::from_parts(33_913_455, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_087 + .saturating_add(Weight::from_parts(128_175, 0).saturating_mul(a.into())) + // Standard Error: 1_123 + .saturating_add(Weight::from_parts(40_321, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -152,11 +153,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_700_000 picoseconds. - Weight::from_parts(24_509_575, 0) + // Minimum execution time: 25_575_000 picoseconds. + Weight::from_parts(26_235_398, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_699 - .saturating_add(Weight::from_parts(51_275, 0).saturating_mul(p.into())) + // Standard Error: 924 + .saturating_add(Weight::from_parts(51_662, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -167,11 +168,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_289_000 picoseconds. - Weight::from_parts(24_453_360, 0) + // Minimum execution time: 25_416_000 picoseconds. + Weight::from_parts(26_557_151, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_690 - .saturating_add(Weight::from_parts(62_718, 0).saturating_mul(p.into())) + // Standard Error: 1_447 + .saturating_add(Weight::from_parts(50_558, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -182,11 +183,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 18_877_000 picoseconds. - Weight::from_parts(19_780_042, 0) + // Minimum execution time: 22_606_000 picoseconds. + Weight::from_parts(23_262_867, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_171 - .saturating_add(Weight::from_parts(20_282, 0).saturating_mul(p.into())) + // Standard Error: 1_186 + .saturating_add(Weight::from_parts(26_393, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -197,11 +198,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `139` // Estimated: `4706` - // Minimum execution time: 25_354_000 picoseconds. - Weight::from_parts(26_362_285, 0) + // Minimum execution time: 27_288_000 picoseconds. + Weight::from_parts(27_957_909, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_459 - .saturating_add(Weight::from_parts(1_330, 0).saturating_mul(p.into())) + // Standard Error: 706 + .saturating_add(Weight::from_parts(8_841, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -212,11 +213,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `164 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 20_057_000 picoseconds. - Weight::from_parts(20_844_608, 0) + // Minimum execution time: 23_640_000 picoseconds. + Weight::from_parts(24_327_982, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_336 - .saturating_add(Weight::from_parts(27_855, 0).saturating_mul(p.into())) + // Standard Error: 828 + .saturating_add(Weight::from_parts(28_240, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_session.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_session.rs index bb4705ace09..b48ff8dd064 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_session.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_session`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `270` - // Estimated: `7470` - // Minimum execution time: 17_394_000 picoseconds. - Weight::from_parts(17_828_000, 0) - .saturating_add(Weight::from_parts(0, 7470)) + // Estimated: `3735` + // Minimum execution time: 17_308_000 picoseconds. + Weight::from_parts(17_624_000, 0) + .saturating_add(Weight::from_parts(0, 3735)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +69,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `242` - // Estimated: `3949` - // Minimum execution time: 13_334_000 picoseconds. - Weight::from_parts(13_634_000, 0) - .saturating_add(Weight::from_parts(0, 3949)) + // Estimated: `3707` + // Minimum execution time: 12_828_000 picoseconds. + Weight::from_parts(12_985_000, 0) + .saturating_add(Weight::from_parts(0, 3707)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs index 7475e81c9ad..c1a9be38dbd 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_timestamp`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `86` - // Estimated: `2986` - // Minimum execution time: 9_273_000 picoseconds. - Weight::from_parts(9_653_000, 0) - .saturating_add(Weight::from_parts(0, 2986)) + // Estimated: `1493` + // Minimum execution time: 9_150_000 picoseconds. + Weight::from_parts(9_474_000, 0) + .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_289_000 picoseconds. - Weight::from_parts(3_379_000, 0) + // Minimum execution time: 3_210_000 picoseconds. + Weight::from_parts(3_330_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs index c32eebdc908..d04f1800399 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_uniques` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_uniques`. pub struct WeightInfo(PhantomData); @@ -55,8 +56,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3643` - // Minimum execution time: 26_855_000 picoseconds. - Weight::from_parts(27_393_000, 0) + // Minimum execution time: 29_873_000 picoseconds. + Weight::from_parts(30_382_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -69,8 +70,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3643` - // Minimum execution time: 15_006_000 picoseconds. - Weight::from_parts(15_389_000, 0) + // Minimum execution time: 14_338_000 picoseconds. + Weight::from_parts(14_710_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -96,17 +97,17 @@ impl pallet_uniques::WeightInfo for WeightInfo { /// The range of component `a` is `[0, 1000]`. fn destroy(n: u32, m: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `257 + n * (76 ±0) + m * (56 ±0) + a * (107 ±0)` - // Estimated: `9210 + a * (2647 ±0) + n * (2597 ±0) + m * (2662 ±0)` - // Minimum execution time: 2_360_211_000 picoseconds. - Weight::from_parts(2_383_759_000, 0) - .saturating_add(Weight::from_parts(0, 9210)) - // Standard Error: 24_849 - .saturating_add(Weight::from_parts(6_304_424, 0).saturating_mul(n.into())) - // Standard Error: 24_849 - .saturating_add(Weight::from_parts(253_862, 0).saturating_mul(m.into())) - // Standard Error: 24_849 - .saturating_add(Weight::from_parts(324_295, 0).saturating_mul(a.into())) + // Measured: `257 + a * (107 ±0) + m * (56 ±0) + n * (76 ±0)` + // Estimated: `3643 + a * (2647 ±0) + m * (2662 ±0) + n * (2597 ±0)` + // Minimum execution time: 2_398_014_000 picoseconds. + Weight::from_parts(2_410_569_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) + // Standard Error: 24_769 + .saturating_add(Weight::from_parts(6_309_077, 0).saturating_mul(n.into())) + // Standard Error: 24_769 + .saturating_add(Weight::from_parts(257_995, 0).saturating_mul(m.into())) + // Standard Error: 24_769 + .saturating_add(Weight::from_parts(317_885, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) @@ -116,8 +117,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) .saturating_add(Weight::from_parts(0, 2647).saturating_mul(a.into())) - .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) } /// Storage: Uniques Asset (r:1 w:1) /// Proof: Uniques Asset (max_values: None, max_size: Some(122), added: 2597, mode: MaxEncodedLen) @@ -130,10 +131,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn mint() -> Weight { // Proof Size summary in bytes: // Measured: `282` - // Estimated: `10719` - // Minimum execution time: 33_245_000 picoseconds. - Weight::from_parts(33_516_000, 0) - .saturating_add(Weight::from_parts(0, 10719)) + // Estimated: `3643` + // Minimum execution time: 36_084_000 picoseconds. + Weight::from_parts(36_377_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -148,10 +149,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn burn() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 34_237_000 picoseconds. - Weight::from_parts(34_725_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 37_397_000 picoseconds. + Weight::from_parts(37_763_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -166,10 +167,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 27_588_000 picoseconds. - Weight::from_parts(27_994_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 27_423_000 picoseconds. + Weight::from_parts(27_666_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -181,12 +182,12 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `738 + i * (76 ±0)` - // Estimated: `4633 + i * (2597 ±0)` - // Minimum execution time: 15_958_000 picoseconds. - Weight::from_parts(16_175_000, 0) - .saturating_add(Weight::from_parts(0, 4633)) - // Standard Error: 12_904 - .saturating_add(Weight::from_parts(13_261_405, 0).saturating_mul(i.into())) + // Estimated: `3643 + i * (2597 ±0)` + // Minimum execution time: 15_215_000 picoseconds. + Weight::from_parts(15_450_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) + // Standard Error: 12_841 + .saturating_add(Weight::from_parts(15_164_179, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -200,10 +201,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn freeze() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 19_124_000 picoseconds. - Weight::from_parts(19_432_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 19_169_000 picoseconds. + Weight::from_parts(19_541_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -214,10 +215,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn thaw() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 19_725_000 picoseconds. - Weight::from_parts(19_903_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 18_941_000 picoseconds. + Weight::from_parts(19_336_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -227,8 +228,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 15_091_000 picoseconds. - Weight::from_parts(15_405_000, 0) + // Minimum execution time: 14_356_000 picoseconds. + Weight::from_parts(14_650_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -239,8 +240,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 14_440_000 picoseconds. - Weight::from_parts(14_836_000, 0) + // Minimum execution time: 14_303_000 picoseconds. + Weight::from_parts(14_504_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -254,10 +255,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn transfer_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `356` - // Estimated: `7160` - // Minimum execution time: 22_729_000 picoseconds. - Weight::from_parts(23_039_000, 0) - .saturating_add(Weight::from_parts(0, 7160)) + // Estimated: `3643` + // Minimum execution time: 22_663_000 picoseconds. + Weight::from_parts(23_053_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -267,8 +268,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 15_506_000 picoseconds. - Weight::from_parts(15_864_000, 0) + // Minimum execution time: 15_198_000 picoseconds. + Weight::from_parts(15_645_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -281,8 +282,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 18_244_000 picoseconds. - Weight::from_parts(18_591_000, 0) + // Minimum execution time: 17_381_000 picoseconds. + Weight::from_parts(17_588_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -296,10 +297,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `559` - // Estimated: `10932` - // Minimum execution time: 37_528_000 picoseconds. - Weight::from_parts(38_282_000, 0) - .saturating_add(Weight::from_parts(0, 10932)) + // Estimated: `3652` + // Minimum execution time: 39_838_000 picoseconds. + Weight::from_parts(40_387_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -312,10 +313,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn clear_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `756` - // Estimated: `10932` - // Minimum execution time: 36_654_000 picoseconds. - Weight::from_parts(36_947_000, 0) - .saturating_add(Weight::from_parts(0, 10932)) + // Estimated: `3652` + // Minimum execution time: 38_600_000 picoseconds. + Weight::from_parts(39_215_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -326,10 +327,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `348` - // Estimated: `7295` - // Minimum execution time: 29_703_000 picoseconds. - Weight::from_parts(30_032_000, 0) - .saturating_add(Weight::from_parts(0, 7295)) + // Estimated: `3652` + // Minimum execution time: 31_563_000 picoseconds. + Weight::from_parts(32_111_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -340,10 +341,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn clear_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `559` - // Estimated: `7295` - // Minimum execution time: 29_941_000 picoseconds. - Weight::from_parts(30_222_000, 0) - .saturating_add(Weight::from_parts(0, 7295)) + // Estimated: `3652` + // Minimum execution time: 31_525_000 picoseconds. + Weight::from_parts(31_904_000, 0) + .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -354,10 +355,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `282` - // Estimated: `7275` - // Minimum execution time: 28_466_000 picoseconds. - Weight::from_parts(29_037_000, 0) - .saturating_add(Weight::from_parts(0, 7275)) + // Estimated: `3643` + // Minimum execution time: 32_104_000 picoseconds. + Weight::from_parts(32_429_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -368,10 +369,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `473` - // Estimated: `7275` - // Minimum execution time: 27_072_000 picoseconds. - Weight::from_parts(27_514_000, 0) - .saturating_add(Weight::from_parts(0, 7275)) + // Estimated: `3643` + // Minimum execution time: 30_433_000 picoseconds. + Weight::from_parts(30_662_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -382,10 +383,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn approve_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `428` - // Estimated: `7230` - // Minimum execution time: 20_791_000 picoseconds. - Weight::from_parts(21_072_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 20_463_000 picoseconds. + Weight::from_parts(20_879_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -396,10 +397,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn cancel_approval() -> Weight { // Proof Size summary in bytes: // Measured: `461` - // Estimated: `7230` - // Minimum execution time: 20_467_000 picoseconds. - Weight::from_parts(20_842_000, 0) - .saturating_add(Weight::from_parts(0, 7230)) + // Estimated: `3643` + // Minimum execution time: 20_158_000 picoseconds. + Weight::from_parts(20_465_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -409,8 +410,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3517` - // Minimum execution time: 16_836_000 picoseconds. - Weight::from_parts(17_418_000, 0) + // Minimum execution time: 16_009_000 picoseconds. + Weight::from_parts(16_396_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -422,10 +423,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: // Measured: `282` - // Estimated: `7132` - // Minimum execution time: 17_721_000 picoseconds. - Weight::from_parts(18_109_000, 0) - .saturating_add(Weight::from_parts(0, 7132)) + // Estimated: `3643` + // Minimum execution time: 17_034_000 picoseconds. + Weight::from_parts(17_286_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -437,8 +438,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `259` // Estimated: `3587` - // Minimum execution time: 17_599_000 picoseconds. - Weight::from_parts(17_802_000, 0) + // Minimum execution time: 17_020_000 picoseconds. + Weight::from_parts(17_318_000, 0) .saturating_add(Weight::from_parts(0, 3587)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -454,10 +455,10 @@ impl pallet_uniques::WeightInfo for WeightInfo { fn buy_item() -> Weight { // Proof Size summary in bytes: // Measured: `540` - // Estimated: `10784` - // Minimum execution time: 38_642_000 picoseconds. - Weight::from_parts(39_168_000, 0) - .saturating_add(Weight::from_parts(0, 10784)) + // Estimated: `3643` + // Minimum execution time: 37_771_000 picoseconds. + Weight::from_parts(38_708_000, 0) + .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs index 76db89d9078..4dce4a9b391 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_utility`. pub struct WeightInfo(PhantomData); @@ -52,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_995_000 picoseconds. - Weight::from_parts(19_761_796, 0) + // Minimum execution time: 7_065_000 picoseconds. + Weight::from_parts(7_907_851, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_672 - .saturating_add(Weight::from_parts(4_682_116, 0).saturating_mul(c.into())) + // Standard Error: 2_515 + .saturating_add(Weight::from_parts(5_447_457, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_549_000 picoseconds. - Weight::from_parts(5_723_000, 0) + // Minimum execution time: 5_845_000 picoseconds. + Weight::from_parts(6_053_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_210_000 picoseconds. - Weight::from_parts(15_002_117, 0) + // Minimum execution time: 7_094_000 picoseconds. + Weight::from_parts(1_459_029, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_199 - .saturating_add(Weight::from_parts(4_917_852, 0).saturating_mul(c.into())) + // Standard Error: 4_016 + .saturating_add(Weight::from_parts(5_680_469, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_596_000 picoseconds. - Weight::from_parts(9_875_000, 0) + // Minimum execution time: 9_972_000 picoseconds. + Weight::from_parts(10_167_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_024_000 picoseconds. - Weight::from_parts(15_781_473, 0) + // Minimum execution time: 7_148_000 picoseconds. + Weight::from_parts(6_914_554, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_344 - .saturating_add(Weight::from_parts(4_665_530, 0).saturating_mul(c.into())) + // Standard Error: 3_605 + .saturating_add(Weight::from_parts(5_440_589, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs index 0d650e50929..aa43df9de84 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); @@ -60,10 +61,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `9780` - // Minimum execution time: 28_019_000 picoseconds. - Weight::from_parts(29_053_000, 0) - .saturating_add(Weight::from_parts(0, 9780)) + // Estimated: `3540` + // Minimum execution time: 30_683_000 picoseconds. + Weight::from_parts(31_228_000, 0) + .saturating_add(Weight::from_parts(0, 3540)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 24_127_000 picoseconds. - Weight::from_parts(24_609_000, 0) + // Minimum execution time: 29_299_000 picoseconds. + Weight::from_parts(29_857_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -84,8 +85,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 18_826_000 picoseconds. - Weight::from_parts(19_183_000, 0) + // Minimum execution time: 22_639_000 picoseconds. + Weight::from_parts(23_057_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -93,8 +94,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_865_000 picoseconds. - Weight::from_parts(10_129_000, 0) + // Minimum execution time: 11_623_000 picoseconds. + Weight::from_parts(11_996_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: PolkadotXcm SupportedVersion (r:0 w:1) @@ -103,8 +104,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_995_000 picoseconds. - Weight::from_parts(10_290_000, 0) + // Minimum execution time: 11_678_000 picoseconds. + Weight::from_parts(12_002_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -114,8 +115,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_144_000 picoseconds. - Weight::from_parts(3_225_000, 0) + // Minimum execution time: 3_702_000 picoseconds. + Weight::from_parts(3_927_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -138,10 +139,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `14955` - // Minimum execution time: 33_946_000 picoseconds. - Weight::from_parts(34_595_000, 0) - .saturating_add(Weight::from_parts(0, 14955)) + // Estimated: `3540` + // Minimum execution time: 37_617_000 picoseconds. + Weight::from_parts(38_443_000, 0) + .saturating_add(Weight::from_parts(0, 3540)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -162,19 +163,21 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `257` - // Estimated: `14669` - // Minimum execution time: 34_408_000 picoseconds. - Weight::from_parts(34_845_000, 0) - .saturating_add(Weight::from_parts(0, 14669)) + // Estimated: `3722` + // Minimum execution time: 39_333_000 picoseconds. + Weight::from_parts(40_174_000, 0) + .saturating_add(Weight::from_parts(0, 3722)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) + /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) fn force_suspension() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_144_000 picoseconds. - Weight::from_parts(3_225_000, 0) + // Minimum execution time: 3_857_000 picoseconds. + Weight::from_parts(4_158_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -184,8 +187,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `129` // Estimated: `11019` - // Minimum execution time: 17_219_000 picoseconds. - Weight::from_parts(17_552_000, 0) + // Minimum execution time: 17_929_000 picoseconds. + Weight::from_parts(18_175_000, 0) .saturating_add(Weight::from_parts(0, 11019)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -196,8 +199,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `133` // Estimated: `11023` - // Minimum execution time: 17_382_000 picoseconds. - Weight::from_parts(17_791_000, 0) + // Minimum execution time: 17_241_000 picoseconds. + Weight::from_parts(17_618_000, 0) .saturating_add(Weight::from_parts(0, 11023)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -208,8 +211,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `140` // Estimated: `13505` - // Minimum execution time: 18_051_000 picoseconds. - Weight::from_parts(18_643_000, 0) + // Minimum execution time: 18_013_000 picoseconds. + Weight::from_parts(18_485_000, 0) .saturating_add(Weight::from_parts(0, 13505)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -228,10 +231,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `142` - // Estimated: `16197` - // Minimum execution time: 33_113_000 picoseconds. - Weight::from_parts(34_048_000, 0) - .saturating_add(Weight::from_parts(0, 16197)) + // Estimated: `6082` + // Minimum execution time: 30_736_000 picoseconds. + Weight::from_parts(31_215_000, 0) + .saturating_add(Weight::from_parts(0, 6082)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -241,8 +244,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `172` // Estimated: `8587` - // Minimum execution time: 9_569_000 picoseconds. - Weight::from_parts(9_933_000, 0) + // Minimum execution time: 9_005_000 picoseconds. + Weight::from_parts(9_289_000, 0) .saturating_add(Weight::from_parts(0, 8587)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -252,8 +255,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `140` // Estimated: `11030` - // Minimum execution time: 19_098_000 picoseconds. - Weight::from_parts(19_550_000, 0) + // Minimum execution time: 17_506_000 picoseconds. + Weight::from_parts(17_811_000, 0) .saturating_add(Weight::from_parts(0, 11030)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -273,10 +276,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `146` - // Estimated: `21171` - // Minimum execution time: 40_365_000 picoseconds. - Weight::from_parts(41_092_000, 0) - .saturating_add(Weight::from_parts(0, 21171)) + // Estimated: `11036` + // Minimum execution time: 37_343_000 picoseconds. + Weight::from_parts(37_774_000, 0) + .saturating_add(Weight::from_parts(0, 11036)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 66f6bd713d5..ce142a079d2 100644 --- a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 22_591_000 picoseconds. - Weight::from_parts(23_052_000, 3593) + // Minimum execution time: 25_802_000 picoseconds. + Weight::from_parts(26_076_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 32_036_000 picoseconds. - Weight::from_parts(32_396_000, 6196) + // Minimum execution time: 48_092_000 picoseconds. + Weight::from_parts(48_397_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -87,9 +87,9 @@ impl WeightInfo { pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `176` - // Estimated: `17970` - // Minimum execution time: 58_331_000 picoseconds. - Weight::from_parts(59_048_000, 17970) + // Estimated: `6196` + // Minimum execution time: 70_237_000 picoseconds. + Weight::from_parts(70_692_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_474_000 picoseconds. - Weight::from_parts(4_577_000, 0) + // Minimum execution time: 4_045_000 picoseconds. + Weight::from_parts(4_135_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 28_611_000 picoseconds. - Weight::from_parts(28_992_000, 3593) + // Minimum execution time: 26_201_000 picoseconds. + Weight::from_parts(26_820_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -128,9 +128,9 @@ impl WeightInfo { pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `14862` - // Minimum execution time: 57_179_000 picoseconds. - Weight::from_parts(58_149_000, 14862) + // Estimated: `3593` + // Minimum execution time: 50_526_000 picoseconds. + Weight::from_parts(51_121_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -149,9 +149,9 @@ impl WeightInfo { pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 30_477_000 picoseconds. - Weight::from_parts(30_841_000, 11269) + // Estimated: `3540` + // Minimum execution time: 30_690_000 picoseconds. + Weight::from_parts(31_032_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 67c2b083f89..886874d6662 100644 --- a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -63,9 +63,9 @@ impl WeightInfo { pub fn report_holding() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 355_263_000 picoseconds. - Weight::from_parts(357_327_000, 11269) + // Estimated: `3540` + // Minimum execution time: 361_717_000 picoseconds. + Weight::from_parts(362_438_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_068_000 picoseconds. - Weight::from_parts(4_273_000, 0) + // Minimum execution time: 3_952_000 picoseconds. + Weight::from_parts(4_060_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `69` // Estimated: `3534` - // Minimum execution time: 11_279_000 picoseconds. - Weight::from_parts(11_626_000, 3534) + // Minimum execution time: 10_984_000 picoseconds. + Weight::from_parts(11_204_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_246_000 picoseconds. - Weight::from_parts(13_425_000, 0) + // Minimum execution time: 13_942_000 picoseconds. + Weight::from_parts(14_077_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_426_000 picoseconds. - Weight::from_parts(4_600_000, 0) + // Minimum execution time: 4_242_000 picoseconds. + Weight::from_parts(4_354_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_838_000 picoseconds. - Weight::from_parts(2_921_000, 0) + // Minimum execution time: 2_802_000 picoseconds. + Weight::from_parts(2_851_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_858_000 picoseconds. - Weight::from_parts(2_981_000, 0) + // Minimum execution time: 2_797_000 picoseconds. + Weight::from_parts(2_899_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_848_000 picoseconds. - Weight::from_parts(2_922_000, 0) + // Minimum execution time: 2_767_000 picoseconds. + Weight::from_parts(2_837_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_732_000 picoseconds. - Weight::from_parts(3_801_000, 0) + // Minimum execution time: 3_669_000 picoseconds. + Weight::from_parts(3_721_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_882_000 picoseconds. - Weight::from_parts(2_971_000, 0) + // Minimum execution time: 2_719_000 picoseconds. + Weight::from_parts(2_789_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -150,9 +150,9 @@ impl WeightInfo { pub fn report_error() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 25_538_000 picoseconds. - Weight::from_parts(25_964_000, 11269) + // Estimated: `3540` + // Minimum execution time: 25_261_000 picoseconds. + Weight::from_parts(25_779_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `126` // Estimated: `3591` - // Minimum execution time: 16_187_000 picoseconds. - Weight::from_parts(16_478_000, 3591) + // Minimum execution time: 16_124_000 picoseconds. + Weight::from_parts(16_394_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_804_000 picoseconds. - Weight::from_parts(2_874_000, 0) + // Minimum execution time: 2_757_000 picoseconds. + Weight::from_parts(2_847_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -189,9 +189,9 @@ impl WeightInfo { pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `13320` - // Minimum execution time: 28_208_000 picoseconds. - Weight::from_parts(28_512_000, 13320) + // Estimated: `3540` + // Minimum execution time: 27_522_000 picoseconds. + Weight::from_parts(27_997_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_021_000 picoseconds. - Weight::from_parts(5_128_000, 0) + // Minimum execution time: 4_975_000 picoseconds. + Weight::from_parts(5_129_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -220,9 +220,9 @@ impl WeightInfo { pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 403_561_000 picoseconds. - Weight::from_parts(404_798_000, 11269) + // Estimated: `3540` + // Minimum execution time: 398_886_000 picoseconds. + Weight::from_parts(400_023_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 122_646_000 picoseconds. - Weight::from_parts(123_057_000, 0) + // Minimum execution time: 120_499_000 picoseconds. + Weight::from_parts(120_883_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_916_000 picoseconds. - Weight::from_parts(14_178_000, 0) + // Minimum execution time: 13_140_000 picoseconds. + Weight::from_parts(13_404_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_025_000 picoseconds. - Weight::from_parts(3_083_000, 0) + // Minimum execution time: 2_861_000 picoseconds. + Weight::from_parts(2_920_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_879_000 picoseconds. - Weight::from_parts(2_947_000, 0) + // Minimum execution time: 2_791_000 picoseconds. + Weight::from_parts(2_843_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_067_000 picoseconds. - Weight::from_parts(3_129_000, 0) + // Minimum execution time: 2_992_000 picoseconds. + Weight::from_parts(3_057_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -276,9 +276,9 @@ impl WeightInfo { pub fn query_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 29_511_000 picoseconds. - Weight::from_parts(29_922_000, 11269) + // Estimated: `3540` + // Minimum execution time: 29_505_000 picoseconds. + Weight::from_parts(30_219_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_410_000 picoseconds. - Weight::from_parts(5_531_000, 0) + // Minimum execution time: 5_344_000 picoseconds. + Weight::from_parts(5_490_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -304,9 +304,9 @@ impl WeightInfo { pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `75` - // Estimated: `11269` - // Minimum execution time: 26_044_000 picoseconds. - Weight::from_parts(26_397_000, 11269) + // Estimated: `3540` + // Minimum execution time: 25_333_000 picoseconds. + Weight::from_parts(25_683_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_950_000 picoseconds. - Weight::from_parts(2_989_000, 0) + // Minimum execution time: 2_734_000 picoseconds. + Weight::from_parts(2_813_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_877_000 picoseconds. - Weight::from_parts(2_928_000, 0) + // Minimum execution time: 2_766_000 picoseconds. + Weight::from_parts(2_824_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_884_000 picoseconds. - Weight::from_parts(2_959_000, 0) + // Minimum execution time: 2_763_000 picoseconds. + Weight::from_parts(2_839_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_733_000 picoseconds. - Weight::from_parts(2_862_000, 0) + // Minimum execution time: 2_753_000 picoseconds. + Weight::from_parts(2_837_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_917_000 picoseconds. - Weight::from_parts(2_990_000, 0) + // Minimum execution time: 3_001_000 picoseconds. + Weight::from_parts(3_064_000, 0) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs index 4fa7848e6ff..caf5ce9f44e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_xcmp_queue`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_373_000 picoseconds. - Weight::from_parts(5_599_000, 0) + // Minimum execution time: 5_497_000 picoseconds. + Weight::from_parts(5_680_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_534_000 picoseconds. - Weight::from_parts(5_769_000, 0) + // Minimum execution time: 5_600_000 picoseconds. + Weight::from_parts(5_855_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs index 65925307177..e024fbf3a2c 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `frame_system`. pub struct WeightInfo(PhantomData); @@ -52,22 +53,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_314_000 picoseconds. - Weight::from_parts(2_371_000, 0) + // Minimum execution time: 2_356_000 picoseconds. + Weight::from_parts(1_100_689, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(369, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(412, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_667_000 picoseconds. - Weight::from_parts(7_755_000, 0) + // Minimum execution time: 7_879_000 picoseconds. + Weight::from_parts(8_041_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_414, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_451, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -77,8 +78,8 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 4_135_000 picoseconds. - Weight::from_parts(4_368_000, 0) + // Minimum execution time: 4_358_000 picoseconds. + Weight::from_parts(4_537_000, 0) .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -90,11 +91,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_351_000 picoseconds. - Weight::from_parts(2_396_000, 0) + // Minimum execution time: 2_373_000 picoseconds. + Weight::from_parts(2_395_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_912 - .saturating_add(Weight::from_parts(729_478, 0).saturating_mul(i.into())) + // Standard Error: 1_727 + .saturating_add(Weight::from_parts(690_266, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +105,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_417_000 picoseconds. - Weight::from_parts(2_546_000, 0) + // Minimum execution time: 2_513_000 picoseconds. + Weight::from_parts(2_540_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 842 - .saturating_add(Weight::from_parts(542_458, 0).saturating_mul(i.into())) + // Standard Error: 815 + .saturating_add(Weight::from_parts(505_090, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -118,11 +119,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `68 + p * (69 ±0)` // Estimated: `66 + p * (70 ±0)` - // Minimum execution time: 4_324_000 picoseconds. - Weight::from_parts(4_432_000, 0) + // Minimum execution time: 4_242_000 picoseconds. + Weight::from_parts(4_308_000, 0) .saturating_add(Weight::from_parts(0, 66)) - // Standard Error: 1_165 - .saturating_add(Weight::from_parts(1_070_662, 0).saturating_mul(p.into())) + // Standard Error: 1_130 + .saturating_add(Weight::from_parts(1_032_054, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs index 7ea0437075a..94ac23e26eb 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_balances`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 34_147_000 picoseconds. - Weight::from_parts(34_681_000, 0) + // Minimum execution time: 53_880_000 picoseconds. + Weight::from_parts(54_466_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 25_961_000 picoseconds. - Weight::from_parts(26_543_000, 0) + // Minimum execution time: 41_306_000 picoseconds. + Weight::from_parts(41_665_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -77,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 15_954_000 picoseconds. - Weight::from_parts(16_276_000, 0) + // Minimum execution time: 16_599_000 picoseconds. + Weight::from_parts(16_864_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -89,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 19_074_000 picoseconds. - Weight::from_parts(19_635_000, 0) + // Minimum execution time: 23_502_000 picoseconds. + Weight::from_parts(24_050_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -101,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 36_772_000 picoseconds. - Weight::from_parts(37_193_000, 0) + // Minimum execution time: 55_856_000 picoseconds. + Weight::from_parts(56_352_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -113,25 +114,38 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 32_430_000 picoseconds. - Weight::from_parts(32_766_000, 0) + // Minimum execution time: 49_975_000 picoseconds. + Weight::from_parts(50_428_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - fn upgrade_accounts(_: u32) -> Weight { - Weight::from_parts(0, 0) - } fn force_unreserve() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 15_239_000 picoseconds. - Weight::from_parts(15_620_000, 0) + // Minimum execution time: 19_123_000 picoseconds. + Weight::from_parts(19_504_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: System Account (r:999 w:999) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 18_190_000 picoseconds. + Weight::from_parts(18_547_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 10_152 + .saturating_add(Weight::from_parts(14_418_366, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs index 37d874e0b75..8a49dd2eb07 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_collator_selection`. pub struct WeightInfo(PhantomData); @@ -56,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `214 + b * (78 ±0)` // Estimated: `1203 + b * (2554 ±0)` - // Minimum execution time: 14_680_000 picoseconds. - Weight::from_parts(15_646_800, 0) + // Minimum execution time: 15_037_000 picoseconds. + Weight::from_parts(15_261_610, 0) .saturating_add(Weight::from_parts(0, 1203)) - // Standard Error: 4_021 - .saturating_add(Weight::from_parts(2_556_895, 0).saturating_mul(b.into())) + // Standard Error: 3_033 + .saturating_add(Weight::from_parts(2_590_070, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_979_000 picoseconds. - Weight::from_parts(7_322_000, 0) + // Minimum execution time: 7_317_000 picoseconds. + Weight::from_parts(7_493_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_328_000 picoseconds. - Weight::from_parts(7_524_000, 0) + // Minimum execution time: 7_580_000 picoseconds. + Weight::from_parts(7_821_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,12 +104,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `1104 + c * (48 ±0)` - // Estimated: `61672 + c * (49 ±0)` - // Minimum execution time: 37_388_000 picoseconds. - Weight::from_parts(30_491_072, 0) - .saturating_add(Weight::from_parts(0, 61672)) - // Standard Error: 1_155 - .saturating_add(Weight::from_parts(100_794, 0).saturating_mul(c.into())) + // Estimated: `49487 + c * (49 ±0)` + // Minimum execution time: 42_783_000 picoseconds. + Weight::from_parts(35_128_208, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_291 + .saturating_add(Weight::from_parts(109_890, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -122,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `428 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 29_110_000 picoseconds. - Weight::from_parts(19_158_409, 0) + // Minimum execution time: 34_135_000 picoseconds. + Weight::from_parts(23_714_718, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_269 - .saturating_add(Weight::from_parts(104_083, 0).saturating_mul(c.into())) + // Standard Error: 1_293 + .saturating_add(Weight::from_parts(108_542, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -139,10 +140,10 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn note_author() -> Weight { // Proof Size summary in bytes: // Measured: `155` - // Estimated: `7729` - // Minimum execution time: 29_086_000 picoseconds. - Weight::from_parts(29_931_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `6196` + // Minimum execution time: 44_345_000 picoseconds. + Weight::from_parts(44_853_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +161,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22815 + r * (116 ±0) + c * (97 ±0)` - // Estimated: `56697 + r * (2602 ±0) + c * (2520 ±0)` - // Minimum execution time: 16_710_000 picoseconds. - Weight::from_parts(16_907_000, 0) - .saturating_add(Weight::from_parts(0, 56697)) - // Standard Error: 800_677 - .saturating_add(Weight::from_parts(29_001_374, 0).saturating_mul(c.into())) + // Measured: `22815 + c * (97 ±0) + r * (116 ±0)` + // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` + // Minimum execution time: 16_932_000 picoseconds. + Weight::from_parts(17_022_000, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 901_942 + .saturating_add(Weight::from_parts(31_973_621, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) + .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) - .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs index 56d954f12a0..f6a3b504a67 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_multisig`. pub struct WeightInfo(PhantomData); @@ -52,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_068_000 picoseconds. - Weight::from_parts(12_319_883, 0) + // Minimum execution time: 11_985_000 picoseconds. + Weight::from_parts(12_506_234, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1 - .saturating_add(Weight::from_parts(493, 0).saturating_mul(z.into())) + // Standard Error: 2 + .saturating_add(Weight::from_parts(601, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -66,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 36_523_000 picoseconds. - Weight::from_parts(31_295_135, 0) + // Minimum execution time: 41_586_000 picoseconds. + Weight::from_parts(35_547_263, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 542 - .saturating_add(Weight::from_parts(60_423, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_200, 0).saturating_mul(z.into())) + // Standard Error: 376 + .saturating_add(Weight::from_parts(69_533, 0).saturating_mul(s.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_289, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -84,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 27_342_000 picoseconds. - Weight::from_parts(21_614_247, 0) + // Minimum execution time: 27_819_000 picoseconds. + Weight::from_parts(21_900_751, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 546 - .saturating_add(Weight::from_parts(57_563, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_202, 0).saturating_mul(z.into())) + // Standard Error: 292 + .saturating_add(Weight::from_parts(65_723, 0).saturating_mul(s.into())) + // Standard Error: 2 + .saturating_add(Weight::from_parts(1_301, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,14 +104,14 @@ impl pallet_multisig::WeightInfo for WeightInfo { fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `388 + s * (33 ±0)` - // Estimated: `10404` - // Minimum execution time: 41_465_000 picoseconds. - Weight::from_parts(34_511_085, 0) - .saturating_add(Weight::from_parts(0, 10404)) - // Standard Error: 467 - .saturating_add(Weight::from_parts(78_918, 0).saturating_mul(s.into())) + // Estimated: `6811` + // Minimum execution time: 46_840_000 picoseconds. + Weight::from_parts(39_004_058, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 490 + .saturating_add(Weight::from_parts(86_465, 0).saturating_mul(s.into())) // Standard Error: 4 - .saturating_add(Weight::from_parts(1_201, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_317, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -121,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 27_868_000 picoseconds. - Weight::from_parts(29_407_652, 0) + // Minimum execution time: 32_549_000 picoseconds. + Weight::from_parts(33_945_862, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 632 - .saturating_add(Weight::from_parts(69_333, 0).saturating_mul(s.into())) + // Standard Error: 599 + .saturating_add(Weight::from_parts(74_298, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -136,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 18_599_000 picoseconds. - Weight::from_parts(19_776_275, 0) + // Minimum execution time: 19_264_000 picoseconds. + Weight::from_parts(20_336_652, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 522 - .saturating_add(Weight::from_parts(64_680, 0).saturating_mul(s.into())) + // Standard Error: 420 + .saturating_add(Weight::from_parts(67_305, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -151,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 28_857_000 picoseconds. - Weight::from_parts(30_337_509, 0) + // Minimum execution time: 33_469_000 picoseconds. + Weight::from_parts(35_060_138, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 652 - .saturating_add(Weight::from_parts(67_443, 0).saturating_mul(s.into())) + // Standard Error: 575 + .saturating_add(Weight::from_parts(72_357, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs index bef2a83bc7c..653161034d9 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_session`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `297` - // Estimated: `7524` - // Minimum execution time: 17_925_000 picoseconds. - Weight::from_parts(18_292_000, 0) - .saturating_add(Weight::from_parts(0, 7524)) + // Estimated: `3762` + // Minimum execution time: 17_971_000 picoseconds. + Weight::from_parts(18_440_000, 0) + .saturating_add(Weight::from_parts(0, 3762)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +69,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `279` - // Estimated: `4023` - // Minimum execution time: 13_384_000 picoseconds. - Weight::from_parts(13_788_000, 0) - .saturating_add(Weight::from_parts(0, 4023)) + // Estimated: `3744` + // Minimum execution time: 13_516_000 picoseconds. + Weight::from_parts(13_855_000, 0) + .saturating_add(Weight::from_parts(0, 3744)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs index c6b5b01504f..a7e0a69ca71 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_timestamp`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `49` - // Estimated: `2986` - // Minimum execution time: 7_946_000 picoseconds. - Weight::from_parts(8_181_000, 0) - .saturating_add(Weight::from_parts(0, 2986)) + // Estimated: `1493` + // Minimum execution time: 7_754_000 picoseconds. + Weight::from_parts(7_961_000, 0) + .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_219_000 picoseconds. - Weight::from_parts(3_298_000, 0) + // Minimum execution time: 3_099_000 picoseconds. + Weight::from_parts(3_194_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs index 93eaff447ae..b9ab2ec61e5 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_utility`. pub struct WeightInfo(PhantomData); @@ -52,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_837_000 picoseconds. - Weight::from_parts(16_686_299, 0) + // Minimum execution time: 7_486_000 picoseconds. + Weight::from_parts(4_952_171, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_233 - .saturating_add(Weight::from_parts(4_587_331, 0).saturating_mul(c.into())) + // Standard Error: 2_744 + .saturating_add(Weight::from_parts(4_878_827, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_582_000 picoseconds. - Weight::from_parts(5_700_000, 0) + // Minimum execution time: 5_441_000 picoseconds. + Weight::from_parts(5_550_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_907_000 picoseconds. - Weight::from_parts(4_826_975, 0) + // Minimum execution time: 7_417_000 picoseconds. + Weight::from_parts(3_647_457, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_801 - .saturating_add(Weight::from_parts(4_836_457, 0).saturating_mul(c.into())) + // Standard Error: 3_303 + .saturating_add(Weight::from_parts(5_198_660, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_998_000 picoseconds. - Weight::from_parts(9_220_000, 0) + // Minimum execution time: 9_828_000 picoseconds. + Weight::from_parts(10_044_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_961_000 picoseconds. - Weight::from_parts(7_518_503, 0) + // Minimum execution time: 7_599_000 picoseconds. + Weight::from_parts(7_657_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_307 - .saturating_add(Weight::from_parts(4_649_665, 0).saturating_mul(c.into())) + // Standard Error: 1_773 + .saturating_add(Weight::from_parts(4_893_962, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs index df103d9266b..ec1fd4a40d3 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); @@ -60,10 +61,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `9595` - // Minimum execution time: 26_368_000 picoseconds. - Weight::from_parts(27_314_000, 0) - .saturating_add(Weight::from_parts(0, 9595)) + // Estimated: `3503` + // Minimum execution time: 27_316_000 picoseconds. + Weight::from_parts(27_658_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1489` - // Minimum execution time: 24_998_000 picoseconds. - Weight::from_parts(25_321_000, 0) + // Minimum execution time: 29_202_000 picoseconds. + Weight::from_parts(29_681_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -104,8 +105,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_733_000 picoseconds. - Weight::from_parts(10_002_000, 0) + // Minimum execution time: 10_266_000 picoseconds. + Weight::from_parts(10_449_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -115,8 +116,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_073_000 picoseconds. - Weight::from_parts(3_178_000, 0) + // Minimum execution time: 3_095_000 picoseconds. + Weight::from_parts(3_171_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -139,10 +140,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `14659` - // Minimum execution time: 31_313_000 picoseconds. - Weight::from_parts(31_916_000, 0) - .saturating_add(Weight::from_parts(0, 14659)) + // Estimated: `3503` + // Minimum execution time: 31_614_000 picoseconds. + Weight::from_parts(32_390_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -163,19 +164,21 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `220` - // Estimated: `14410` - // Minimum execution time: 32_721_000 picoseconds. - Weight::from_parts(33_013_000, 0) - .saturating_add(Weight::from_parts(0, 14410)) + // Estimated: `3685` + // Minimum execution time: 33_334_000 picoseconds. + Weight::from_parts(33_789_000, 0) + .saturating_add(Weight::from_parts(0, 3685)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) + /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) fn force_suspension() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_073_000 picoseconds. - Weight::from_parts(3_178_000, 0) + // Minimum execution time: 3_178_000 picoseconds. + Weight::from_parts(3_261_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -185,8 +188,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `95` // Estimated: `10985` - // Minimum execution time: 15_020_000 picoseconds. - Weight::from_parts(15_358_000, 0) + // Minimum execution time: 14_687_000 picoseconds. + Weight::from_parts(15_004_000, 0) .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -197,8 +200,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `99` // Estimated: `10989` - // Minimum execution time: 15_095_000 picoseconds. - Weight::from_parts(15_309_000, 0) + // Minimum execution time: 14_595_000 picoseconds. + Weight::from_parts(14_813_000, 0) .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -209,8 +212,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `13471` - // Minimum execution time: 15_809_000 picoseconds. - Weight::from_parts(16_139_000, 0) + // Minimum execution time: 14_926_000 picoseconds. + Weight::from_parts(15_337_000, 0) .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -229,10 +232,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `15981` - // Minimum execution time: 28_167_000 picoseconds. - Weight::from_parts(28_747_000, 0) - .saturating_add(Weight::from_parts(0, 15981)) + // Estimated: `6046` + // Minimum execution time: 28_680_000 picoseconds. + Weight::from_parts(29_159_000, 0) + .saturating_add(Weight::from_parts(0, 6046)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -242,8 +245,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `136` // Estimated: `8551` - // Minimum execution time: 8_484_000 picoseconds. - Weight::from_parts(8_776_000, 0) + // Minimum execution time: 8_124_000 picoseconds. + Weight::from_parts(8_299_000, 0) .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -253,8 +256,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `10996` - // Minimum execution time: 15_814_000 picoseconds. - Weight::from_parts(16_131_000, 0) + // Minimum execution time: 14_755_000 picoseconds. + Weight::from_parts(15_136_000, 0) .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -274,10 +277,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `112` - // Estimated: `20967` - // Minimum execution time: 34_500_000 picoseconds. - Weight::from_parts(34_978_000, 0) - .saturating_add(Weight::from_parts(0, 20967)) + // Estimated: `11002` + // Minimum execution time: 34_250_000 picoseconds. + Weight::from_parts(34_888_000, 0) + .saturating_add(Weight::from_parts(0, 11002)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 648e0c7368a..c15e866ce9f 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 19_924_000 picoseconds. - Weight::from_parts(20_322_000, 3593) + // Minimum execution time: 25_169_000 picoseconds. + Weight::from_parts(25_584_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `153` // Estimated: `6196` - // Minimum execution time: 32_669_000 picoseconds. - Weight::from_parts(33_313_000, 6196) + // Minimum execution time: 50_714_000 picoseconds. + Weight::from_parts(51_324_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -87,9 +87,9 @@ impl WeightInfo { pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `223` - // Estimated: `18205` - // Minimum execution time: 55_574_000 picoseconds. - Weight::from_parts(56_148_000, 18205) + // Estimated: `6196` + // Minimum execution time: 74_593_000 picoseconds. + Weight::from_parts(75_347_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_271_000 picoseconds. - Weight::from_parts(4_338_000, 0) + // Minimum execution time: 4_485_000 picoseconds. + Weight::from_parts(4_562_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `52` // Estimated: `3593` - // Minimum execution time: 23_972_000 picoseconds. - Weight::from_parts(24_305_000, 3593) + // Minimum execution time: 27_136_000 picoseconds. + Weight::from_parts(27_387_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -128,9 +128,9 @@ impl WeightInfo { pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `122` - // Estimated: `15097` - // Minimum execution time: 53_095_000 picoseconds. - Weight::from_parts(53_586_000, 15097) + // Estimated: `3593` + // Minimum execution time: 53_591_000 picoseconds. + Weight::from_parts(54_268_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -149,9 +149,9 @@ impl WeightInfo { pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 30_394_000 picoseconds. - Weight::from_parts(31_238_000, 11244) + // Estimated: `3535` + // Minimum execution time: 30_062_000 picoseconds. + Weight::from_parts(30_771_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 738940ca868..0b4b1174160 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: @@ -63,9 +63,9 @@ impl WeightInfo { pub fn report_holding() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 30_841_000 picoseconds. - Weight::from_parts(31_223_000, 11244) + // Estimated: `3535` + // Minimum execution time: 34_626_000 picoseconds. + Weight::from_parts(35_122_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_749_000 picoseconds. - Weight::from_parts(2_894_000, 0) + // Minimum execution time: 3_405_000 picoseconds. + Weight::from_parts(3_503_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 10_637_000 picoseconds. - Weight::from_parts(10_904_000, 3497) + // Minimum execution time: 11_296_000 picoseconds. + Weight::from_parts(11_550_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_587_000 picoseconds. - Weight::from_parts(12_882_000, 0) + // Minimum execution time: 13_932_000 picoseconds. + Weight::from_parts(14_220_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_088_000 picoseconds. - Weight::from_parts(3_165_000, 0) + // Minimum execution time: 3_640_000 picoseconds. + Weight::from_parts(3_732_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_748_000 picoseconds. - Weight::from_parts(2_868_000, 0) + // Minimum execution time: 3_195_000 picoseconds. + Weight::from_parts(3_298_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_897_000 picoseconds. - Weight::from_parts(2_970_000, 0) + // Minimum execution time: 3_217_000 picoseconds. + Weight::from_parts(3_304_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_793_000 picoseconds. - Weight::from_parts(2_883_000, 0) + // Minimum execution time: 3_237_000 picoseconds. + Weight::from_parts(3_273_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_690_000 picoseconds. - Weight::from_parts(3_745_000, 0) + // Minimum execution time: 4_292_000 picoseconds. + Weight::from_parts(4_373_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_760_000 picoseconds. - Weight::from_parts(2_807_000, 0) + // Minimum execution time: 3_198_000 picoseconds. + Weight::from_parts(3_271_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -150,9 +150,9 @@ impl WeightInfo { pub fn report_error() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 24_591_000 picoseconds. - Weight::from_parts(25_237_000, 11244) + // Estimated: `3535` + // Minimum execution time: 27_178_000 picoseconds. + Weight::from_parts(28_171_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 14_596_000 picoseconds. - Weight::from_parts(15_010_000, 3555) + // Minimum execution time: 16_146_000 picoseconds. + Weight::from_parts(16_496_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_770_000 picoseconds. - Weight::from_parts(2_860_000, 0) + // Minimum execution time: 3_189_000 picoseconds. + Weight::from_parts(3_298_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -189,9 +189,9 @@ impl WeightInfo { pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `13098` - // Minimum execution time: 25_644_000 picoseconds. - Weight::from_parts(26_269_000, 13098) + // Estimated: `3503` + // Minimum execution time: 27_844_000 picoseconds. + Weight::from_parts(28_113_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_969_000 picoseconds. - Weight::from_parts(5_167_000, 0) + // Minimum execution time: 5_563_000 picoseconds. + Weight::from_parts(5_718_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -220,9 +220,9 @@ impl WeightInfo { pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 27_894_000 picoseconds. - Weight::from_parts(28_294_000, 11244) + // Estimated: `3535` + // Minimum execution time: 30_296_000 picoseconds. + Weight::from_parts(30_843_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_595_000 picoseconds. - Weight::from_parts(4_709_000, 0) + // Minimum execution time: 5_340_000 picoseconds. + Weight::from_parts(5_390_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_957_000 picoseconds. - Weight::from_parts(3_035_000, 0) + // Minimum execution time: 3_312_000 picoseconds. + Weight::from_parts(3_411_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_091_000 picoseconds. - Weight::from_parts(3_197_000, 0) + // Minimum execution time: 3_294_000 picoseconds. + Weight::from_parts(3_374_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_953_000 picoseconds. - Weight::from_parts(3_036_000, 0) + // Minimum execution time: 3_197_000 picoseconds. + Weight::from_parts(3_261_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_275_000 picoseconds. - Weight::from_parts(3_382_000, 0) + // Minimum execution time: 3_465_000 picoseconds. + Weight::from_parts(3_541_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -276,9 +276,9 @@ impl WeightInfo { pub fn query_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 30_240_000 picoseconds. - Weight::from_parts(30_533_000, 11244) + // Estimated: `3535` + // Minimum execution time: 29_942_000 picoseconds. + Weight::from_parts(30_426_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_276_000 picoseconds. - Weight::from_parts(5_363_000, 0) + // Minimum execution time: 5_454_000 picoseconds. + Weight::from_parts(5_906_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -304,9 +304,9 @@ impl WeightInfo { pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 27_019_000 picoseconds. - Weight::from_parts(27_675_000, 11244) + // Estimated: `3535` + // Minimum execution time: 27_744_000 picoseconds. + Weight::from_parts(28_116_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_136_000 picoseconds. - Weight::from_parts(3_210_000, 0) + // Minimum execution time: 3_204_000 picoseconds. + Weight::from_parts(3_352_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_989_000 picoseconds. - Weight::from_parts(3_067_000, 0) + // Minimum execution time: 3_180_000 picoseconds. + Weight::from_parts(3_245_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_004_000 picoseconds. - Weight::from_parts(3_101_000, 0) + // Minimum execution time: 3_195_000 picoseconds. + Weight::from_parts(3_299_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_996_000 picoseconds. - Weight::from_parts(3_068_000, 0) + // Minimum execution time: 3_185_000 picoseconds. + Weight::from_parts(3_279_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_102_000 picoseconds. - Weight::from_parts(3_210_000, 0) + // Minimum execution time: 3_308_000 picoseconds. + Weight::from_parts(3_463_000, 0) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs index 77de70742ca..6a04ee76325 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_xcmp_queue`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_593_000 picoseconds. - Weight::from_parts(5_728_000, 0) + // Minimum execution time: 5_425_000 picoseconds. + Weight::from_parts(5_556_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_432_000 picoseconds. - Weight::from_parts(5_592_000, 0) + // Minimum execution time: 5_504_000 picoseconds. + Weight::from_parts(5_706_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs index 6560a1546a5..b678dde042e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `frame_system`. pub struct WeightInfo(PhantomData); @@ -52,22 +53,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_129_000 picoseconds. - Weight::from_parts(2_213_000, 0) + // Minimum execution time: 2_432_000 picoseconds. + Weight::from_parts(2_458_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(370, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(367, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_415_000 picoseconds. - Weight::from_parts(7_510_000, 0) + // Minimum execution time: 7_911_000 picoseconds. + Weight::from_parts(8_031_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_412, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_405, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -77,8 +78,8 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 4_227_000 picoseconds. - Weight::from_parts(4_495_000, 0) + // Minimum execution time: 4_304_000 picoseconds. + Weight::from_parts(4_553_000, 0) .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -90,11 +91,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_349_000 picoseconds. - Weight::from_parts(2_381_000, 0) + // Minimum execution time: 2_493_000 picoseconds. + Weight::from_parts(2_523_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_813 - .saturating_add(Weight::from_parts(685_377, 0).saturating_mul(i.into())) + // Standard Error: 1_594 + .saturating_add(Weight::from_parts(663_439, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +105,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_250_000 picoseconds. - Weight::from_parts(2_317_000, 0) + // Minimum execution time: 2_492_000 picoseconds. + Weight::from_parts(2_526_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 911 - .saturating_add(Weight::from_parts(494_503, 0).saturating_mul(i.into())) + // Standard Error: 784 + .saturating_add(Weight::from_parts(493_844, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -118,11 +119,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `68 + p * (69 ±0)` // Estimated: `66 + p * (70 ±0)` - // Minimum execution time: 4_239_000 picoseconds. - Weight::from_parts(4_380_000, 0) + // Minimum execution time: 4_200_000 picoseconds. + Weight::from_parts(4_288_000, 0) .saturating_add(Weight::from_parts(0, 66)) - // Standard Error: 1_255 - .saturating_add(Weight::from_parts(1_012_115, 0).saturating_mul(p.into())) + // Standard Error: 1_195 + .saturating_add(Weight::from_parts(1_021_563, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs index a6547ab46fb..bcfe953f358 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_balances`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 35_006_000 picoseconds. - Weight::from_parts(35_375_000, 0) + // Minimum execution time: 52_090_000 picoseconds. + Weight::from_parts(52_437_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 25_755_000 picoseconds. - Weight::from_parts(26_176_000, 0) + // Minimum execution time: 39_798_000 picoseconds. + Weight::from_parts(40_230_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -77,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 15_651_000 picoseconds. - Weight::from_parts(16_056_000, 0) + // Minimum execution time: 16_110_000 picoseconds. + Weight::from_parts(16_386_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -89,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 18_932_000 picoseconds. - Weight::from_parts(19_186_000, 0) + // Minimum execution time: 22_460_000 picoseconds. + Weight::from_parts(23_030_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -101,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 36_593_000 picoseconds. - Weight::from_parts(36_971_000, 0) + // Minimum execution time: 53_769_000 picoseconds. + Weight::from_parts(54_256_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -113,25 +114,38 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 31_795_000 picoseconds. - Weight::from_parts(32_237_000, 0) + // Minimum execution time: 48_582_000 picoseconds. + Weight::from_parts(49_294_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - fn upgrade_accounts(_: u32) -> Weight { - Weight::from_parts(0, 0) - } fn force_unreserve() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 15_120_000 picoseconds. - Weight::from_parts(15_360_000, 0) + // Minimum execution time: 19_364_000 picoseconds. + Weight::from_parts(19_571_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: System Account (r:999 w:999) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 17_815_000 picoseconds. + Weight::from_parts(17_974_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 10_230 + .saturating_add(Weight::from_parts(14_059_882, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs index 5c35eff5f53..cac72598bd3 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_collator_selection`. pub struct WeightInfo(PhantomData); @@ -56,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `214 + b * (78 ±0)` // Estimated: `1203 + b * (2554 ±0)` - // Minimum execution time: 14_444_000 picoseconds. - Weight::from_parts(15_006_377, 0) + // Minimum execution time: 14_646_000 picoseconds. + Weight::from_parts(15_408_953, 0) .saturating_add(Weight::from_parts(0, 1203)) - // Standard Error: 2_965 - .saturating_add(Weight::from_parts(2_598_095, 0).saturating_mul(b.into())) + // Standard Error: 3_120 + .saturating_add(Weight::from_parts(2_562_646, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_886_000 picoseconds. - Weight::from_parts(7_053_000, 0) + // Minimum execution time: 7_277_000 picoseconds. + Weight::from_parts(7_557_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_233_000 picoseconds. - Weight::from_parts(7_420_000, 0) + // Minimum execution time: 7_684_000 picoseconds. + Weight::from_parts(7_883_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,12 +104,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `1104 + c * (48 ±0)` - // Estimated: `61672 + c * (49 ±0)` - // Minimum execution time: 37_455_000 picoseconds. - Weight::from_parts(29_651_534, 0) - .saturating_add(Weight::from_parts(0, 61672)) - // Standard Error: 1_287 - .saturating_add(Weight::from_parts(103_531, 0).saturating_mul(c.into())) + // Estimated: `49487 + c * (49 ±0)` + // Minimum execution time: 42_488_000 picoseconds. + Weight::from_parts(34_515_606, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_249 + .saturating_add(Weight::from_parts(103_597, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -122,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `428 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 29_548_000 picoseconds. - Weight::from_parts(18_882_873, 0) + // Minimum execution time: 33_698_000 picoseconds. + Weight::from_parts(22_802_769, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_273 - .saturating_add(Weight::from_parts(105_000, 0).saturating_mul(c.into())) + // Standard Error: 1_317 + .saturating_add(Weight::from_parts(107_072, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -139,10 +140,10 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn note_author() -> Weight { // Proof Size summary in bytes: // Measured: `155` - // Estimated: `7729` - // Minimum execution time: 28_960_000 picoseconds. - Weight::from_parts(29_435_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `6196` + // Minimum execution time: 43_472_000 picoseconds. + Weight::from_parts(44_218_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +161,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22815 + r * (116 ±0) + c * (97 ±0)` - // Estimated: `56697 + c * (2520 ±0) + r * (2602 ±0)` - // Minimum execution time: 16_727_000 picoseconds. - Weight::from_parts(16_932_000, 0) - .saturating_add(Weight::from_parts(0, 56697)) - // Standard Error: 798_306 - .saturating_add(Weight::from_parts(28_951_019, 0).saturating_mul(c.into())) + // Measured: `22815 + c * (97 ±0) + r * (116 ±0)` + // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` + // Minimum execution time: 17_280_000 picoseconds. + Weight::from_parts(17_471_000, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 866_180 + .saturating_add(Weight::from_parts(30_755_948, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs index 9ab2d5a58a6..7e5c5efcf3f 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_multisig`. pub struct WeightInfo(PhantomData); @@ -52,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_761_000 picoseconds. - Weight::from_parts(12_373_119, 0) + // Minimum execution time: 11_575_000 picoseconds. + Weight::from_parts(12_064_176, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 3 - .saturating_add(Weight::from_parts(482, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(500, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -66,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 36_964_000 picoseconds. - Weight::from_parts(31_553_347, 0) + // Minimum execution time: 40_911_000 picoseconds. + Weight::from_parts(34_976_854, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 571 - .saturating_add(Weight::from_parts(62_042, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_178, 0).saturating_mul(z.into())) + // Standard Error: 418 + .saturating_add(Weight::from_parts(65_759, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_190, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -84,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 27_113_000 picoseconds. - Weight::from_parts(21_794_796, 0) + // Minimum execution time: 26_906_000 picoseconds. + Weight::from_parts(21_462_377, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 423 - .saturating_add(Weight::from_parts(59_156, 0).saturating_mul(s.into())) - // Standard Error: 4 - .saturating_add(Weight::from_parts(1_193, 0).saturating_mul(z.into())) + // Standard Error: 351 + .saturating_add(Weight::from_parts(59_241, 0).saturating_mul(s.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_204, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,14 +104,14 @@ impl pallet_multisig::WeightInfo for WeightInfo { fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `388 + s * (33 ±0)` - // Estimated: `10404` - // Minimum execution time: 41_979_000 picoseconds. - Weight::from_parts(34_970_639, 0) - .saturating_add(Weight::from_parts(0, 10404)) - // Standard Error: 481 - .saturating_add(Weight::from_parts(76_814, 0).saturating_mul(s.into())) - // Standard Error: 4 - .saturating_add(Weight::from_parts(1_191, 0).saturating_mul(z.into())) + // Estimated: `6811` + // Minimum execution time: 45_289_000 picoseconds. + Weight::from_parts(37_925_050, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 675 + .saturating_add(Weight::from_parts(81_154, 0).saturating_mul(s.into())) + // Standard Error: 6 + .saturating_add(Weight::from_parts(1_237, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -121,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 28_113_000 picoseconds. - Weight::from_parts(29_657_007, 0) + // Minimum execution time: 31_995_000 picoseconds. + Weight::from_parts(33_377_255, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 746 - .saturating_add(Weight::from_parts(67_176, 0).saturating_mul(s.into())) + // Standard Error: 571 + .saturating_add(Weight::from_parts(69_665, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -136,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 19_227_000 picoseconds. - Weight::from_parts(20_043_765, 0) + // Minimum execution time: 18_656_000 picoseconds. + Weight::from_parts(19_906_362, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_458 - .saturating_add(Weight::from_parts(70_065, 0).saturating_mul(s.into())) + // Standard Error: 431 + .saturating_add(Weight::from_parts(62_284, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -151,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 29_358_000 picoseconds. - Weight::from_parts(30_953_779, 0) + // Minimum execution time: 32_875_000 picoseconds. + Weight::from_parts(34_341_729, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 662 - .saturating_add(Weight::from_parts(62_100, 0).saturating_mul(s.into())) + // Standard Error: 924 + .saturating_add(Weight::from_parts(72_829, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs index cd7f40253b5..c97705a6794 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_session`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `297` - // Estimated: `7524` - // Minimum execution time: 17_305_000 picoseconds. - Weight::from_parts(17_673_000, 0) - .saturating_add(Weight::from_parts(0, 7524)) + // Estimated: `3762` + // Minimum execution time: 17_610_000 picoseconds. + Weight::from_parts(18_124_000, 0) + .saturating_add(Weight::from_parts(0, 3762)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +69,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `279` - // Estimated: `4023` - // Minimum execution time: 13_593_000 picoseconds. - Weight::from_parts(13_826_000, 0) - .saturating_add(Weight::from_parts(0, 4023)) + // Estimated: `3744` + // Minimum execution time: 13_143_000 picoseconds. + Weight::from_parts(13_552_000, 0) + .saturating_add(Weight::from_parts(0, 3744)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs index b22fe963f12..4b5d0156670 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_timestamp`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `49` - // Estimated: `2986` - // Minimum execution time: 7_665_000 picoseconds. - Weight::from_parts(7_892_000, 0) - .saturating_add(Weight::from_parts(0, 2986)) + // Estimated: `1493` + // Minimum execution time: 7_574_000 picoseconds. + Weight::from_parts(7_792_000, 0) + .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_226_000 picoseconds. - Weight::from_parts(3_339_000, 0) + // Minimum execution time: 3_081_000 picoseconds. + Weight::from_parts(3_148_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs index 34c36b874a1..816c705a772 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_utility`. pub struct WeightInfo(PhantomData); @@ -52,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_083_000 picoseconds. - Weight::from_parts(13_037_767, 0) + // Minimum execution time: 7_261_000 picoseconds. + Weight::from_parts(8_284_145, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_155 - .saturating_add(Weight::from_parts(4_503_244, 0).saturating_mul(c.into())) + // Standard Error: 3_294 + .saturating_add(Weight::from_parts(4_497_661, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_705_000 picoseconds. - Weight::from_parts(5_799_000, 0) + // Minimum execution time: 5_294_000 picoseconds. + Weight::from_parts(5_475_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_248_000 picoseconds. - Weight::from_parts(14_495_670, 0) + // Minimum execution time: 7_042_000 picoseconds. + Weight::from_parts(5_814_168, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_240 - .saturating_add(Weight::from_parts(4_790_508, 0).saturating_mul(c.into())) + // Standard Error: 2_914 + .saturating_add(Weight::from_parts(4_802_976, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_355_000 picoseconds. - Weight::from_parts(9_596_000, 0) + // Minimum execution time: 9_260_000 picoseconds. + Weight::from_parts(9_406_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_985_000 picoseconds. - Weight::from_parts(17_435_570, 0) + // Minimum execution time: 7_109_000 picoseconds. + Weight::from_parts(3_793_543, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_165 - .saturating_add(Weight::from_parts(4_492_577, 0).saturating_mul(c.into())) + // Standard Error: 2_940 + .saturating_add(Weight::from_parts(4_479_763, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs index 05bfdc8339e..fdbde818da9 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); @@ -60,10 +61,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `9595` - // Minimum execution time: 25_890_000 picoseconds. - Weight::from_parts(26_601_000, 0) - .saturating_add(Weight::from_parts(0, 9595)) + // Estimated: `3503` + // Minimum execution time: 25_921_000 picoseconds. + Weight::from_parts(26_233_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1489` - // Minimum execution time: 24_961_000 picoseconds. - Weight::from_parts(25_332_000, 0) + // Minimum execution time: 26_254_000 picoseconds. + Weight::from_parts(26_615_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -104,8 +105,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_662_000 picoseconds. - Weight::from_parts(9_844_000, 0) + // Minimum execution time: 9_756_000 picoseconds. + Weight::from_parts(9_989_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -115,8 +116,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_994_000 picoseconds. - Weight::from_parts(3_160_000, 0) + // Minimum execution time: 3_147_000 picoseconds. + Weight::from_parts(3_248_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -139,10 +140,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `14659` - // Minimum execution time: 31_632_000 picoseconds. - Weight::from_parts(31_919_000, 0) - .saturating_add(Weight::from_parts(0, 14659)) + // Estimated: `3503` + // Minimum execution time: 31_089_000 picoseconds. + Weight::from_parts(31_503_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -163,19 +164,21 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `220` - // Estimated: `14410` - // Minimum execution time: 32_570_000 picoseconds. - Weight::from_parts(33_292_000, 0) - .saturating_add(Weight::from_parts(0, 14410)) + // Estimated: `3685` + // Minimum execution time: 33_219_000 picoseconds. + Weight::from_parts(33_708_000, 0) + .saturating_add(Weight::from_parts(0, 3685)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) + /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) fn force_suspension() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_994_000 picoseconds. - Weight::from_parts(3_160_000, 0) + // Minimum execution time: 3_042_000 picoseconds. + Weight::from_parts(3_175_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -185,8 +188,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `95` // Estimated: `10985` - // Minimum execution time: 14_829_000 picoseconds. - Weight::from_parts(15_171_000, 0) + // Minimum execution time: 15_040_000 picoseconds. + Weight::from_parts(15_455_000, 0) .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -197,8 +200,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `99` // Estimated: `10989` - // Minimum execution time: 14_774_000 picoseconds. - Weight::from_parts(15_232_000, 0) + // Minimum execution time: 14_999_000 picoseconds. + Weight::from_parts(15_417_000, 0) .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -209,8 +212,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `13471` - // Minimum execution time: 15_289_000 picoseconds. - Weight::from_parts(15_543_000, 0) + // Minimum execution time: 15_694_000 picoseconds. + Weight::from_parts(15_916_000, 0) .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -229,10 +232,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `15981` - // Minimum execution time: 27_849_000 picoseconds. - Weight::from_parts(28_243_000, 0) - .saturating_add(Weight::from_parts(0, 15981)) + // Estimated: `6046` + // Minimum execution time: 28_164_000 picoseconds. + Weight::from_parts(28_489_000, 0) + .saturating_add(Weight::from_parts(0, 6046)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -242,8 +245,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `136` // Estimated: `8551` - // Minimum execution time: 8_260_000 picoseconds. - Weight::from_parts(8_477_000, 0) + // Minimum execution time: 8_273_000 picoseconds. + Weight::from_parts(8_471_000, 0) .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -253,8 +256,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `10996` - // Minimum execution time: 15_132_000 picoseconds. - Weight::from_parts(15_581_000, 0) + // Minimum execution time: 15_009_000 picoseconds. + Weight::from_parts(15_459_000, 0) .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -274,10 +277,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `112` - // Estimated: `20967` - // Minimum execution time: 34_016_000 picoseconds. - Weight::from_parts(34_627_000, 0) - .saturating_add(Weight::from_parts(0, 20967)) + // Estimated: `11002` + // Minimum execution time: 33_647_000 picoseconds. + Weight::from_parts(34_065_000, 0) + .saturating_add(Weight::from_parts(0, 11002)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 16110f554b2..e91a3d7f59f 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 20_647_000 picoseconds. - Weight::from_parts(20_978_000, 3593) + // Minimum execution time: 23_577_000 picoseconds. + Weight::from_parts(24_152_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `153` // Estimated: `6196` - // Minimum execution time: 32_995_000 picoseconds. - Weight::from_parts(33_365_000, 6196) + // Minimum execution time: 49_336_000 picoseconds. + Weight::from_parts(49_673_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -87,9 +87,9 @@ impl WeightInfo { pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `223` - // Estimated: `18205` - // Minimum execution time: 56_568_000 picoseconds. - Weight::from_parts(57_462_000, 18205) + // Estimated: `6196` + // Minimum execution time: 72_360_000 picoseconds. + Weight::from_parts(72_916_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_070_000 picoseconds. - Weight::from_parts(4_200_000, 0) + // Minimum execution time: 3_838_000 picoseconds. + Weight::from_parts(3_928_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `52` // Estimated: `3593` - // Minimum execution time: 24_036_000 picoseconds. - Weight::from_parts(24_587_000, 3593) + // Minimum execution time: 26_214_000 picoseconds. + Weight::from_parts(26_718_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -128,9 +128,9 @@ impl WeightInfo { pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `122` - // Estimated: `15097` - // Minimum execution time: 49_836_000 picoseconds. - Weight::from_parts(50_507_000, 15097) + // Estimated: `3593` + // Minimum execution time: 52_341_000 picoseconds. + Weight::from_parts(52_801_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -149,9 +149,9 @@ impl WeightInfo { pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 28_353_000 picoseconds. - Weight::from_parts(29_151_000, 11244) + // Estimated: `3535` + // Minimum execution time: 28_785_000 picoseconds. + Weight::from_parts(29_133_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index f8320dad59b..3cf25c1e8f8 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -63,9 +63,9 @@ impl WeightInfo { pub fn report_holding() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 30_983_000 picoseconds. - Weight::from_parts(31_396_000, 11244) + // Estimated: `3535` + // Minimum execution time: 31_194_000 picoseconds. + Weight::from_parts(31_563_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_966_000 picoseconds. - Weight::from_parts(3_066_000, 0) + // Minimum execution time: 2_905_000 picoseconds. + Weight::from_parts(3_006_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 11_159_000 picoseconds. - Weight::from_parts(11_390_000, 3497) + // Minimum execution time: 10_292_000 picoseconds. + Weight::from_parts(10_503_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_987_000 picoseconds. - Weight::from_parts(13_337_000, 0) + // Minimum execution time: 12_198_000 picoseconds. + Weight::from_parts(12_445_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_107_000 picoseconds. - Weight::from_parts(3_182_000, 0) + // Minimum execution time: 3_199_000 picoseconds. + Weight::from_parts(3_286_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_957_000 picoseconds. - Weight::from_parts(3_022_000, 0) + // Minimum execution time: 2_780_000 picoseconds. + Weight::from_parts(2_847_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_979_000 picoseconds. - Weight::from_parts(3_088_000, 0) + // Minimum execution time: 2_787_000 picoseconds. + Weight::from_parts(2_835_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_934_000 picoseconds. - Weight::from_parts(2_989_000, 0) + // Minimum execution time: 2_822_000 picoseconds. + Weight::from_parts(2_853_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_817_000 picoseconds. - Weight::from_parts(3_898_000, 0) + // Minimum execution time: 3_671_000 picoseconds. + Weight::from_parts(3_746_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_021_000 picoseconds. - Weight::from_parts(3_083_000, 0) + // Minimum execution time: 2_748_000 picoseconds. + Weight::from_parts(2_818_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -150,9 +150,9 @@ impl WeightInfo { pub fn report_error() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 25_036_000 picoseconds. - Weight::from_parts(25_379_000, 11244) + // Estimated: `3535` + // Minimum execution time: 24_294_000 picoseconds. + Weight::from_parts(24_640_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 15_074_000 picoseconds. - Weight::from_parts(15_310_000, 3555) + // Minimum execution time: 14_359_000 picoseconds. + Weight::from_parts(14_550_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_996_000 picoseconds. - Weight::from_parts(3_040_000, 0) + // Minimum execution time: 2_792_000 picoseconds. + Weight::from_parts(2_884_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -189,9 +189,9 @@ impl WeightInfo { pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `13098` - // Minimum execution time: 26_142_000 picoseconds. - Weight::from_parts(26_578_000, 13098) + // Estimated: `3503` + // Minimum execution time: 25_925_000 picoseconds. + Weight::from_parts(26_130_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_216_000 picoseconds. - Weight::from_parts(5_304_000, 0) + // Minimum execution time: 5_004_000 picoseconds. + Weight::from_parts(5_141_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -220,9 +220,9 @@ impl WeightInfo { pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 28_236_000 picoseconds. - Weight::from_parts(28_614_000, 11244) + // Estimated: `3535` + // Minimum execution time: 27_163_000 picoseconds. + Weight::from_parts(27_722_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_701_000 picoseconds. - Weight::from_parts(4_783_000, 0) + // Minimum execution time: 4_430_000 picoseconds. + Weight::from_parts(4_492_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_121_000 picoseconds. - Weight::from_parts(3_177_000, 0) + // Minimum execution time: 2_870_000 picoseconds. + Weight::from_parts(2_998_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_106_000 picoseconds. - Weight::from_parts(3_343_000, 0) + // Minimum execution time: 2_845_000 picoseconds. + Weight::from_parts(2_893_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_151_000 picoseconds. - Weight::from_parts(3_226_000, 0) + // Minimum execution time: 2_753_000 picoseconds. + Weight::from_parts(2_816_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_362_000 picoseconds. - Weight::from_parts(3_453_000, 0) + // Minimum execution time: 2_992_000 picoseconds. + Weight::from_parts(3_068_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -276,9 +276,9 @@ impl WeightInfo { pub fn query_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 30_472_000 picoseconds. - Weight::from_parts(30_906_000, 11244) + // Estimated: `3535` + // Minimum execution time: 27_324_000 picoseconds. + Weight::from_parts(27_656_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_383_000 picoseconds. - Weight::from_parts(5_496_000, 0) + // Minimum execution time: 4_830_000 picoseconds. + Weight::from_parts(4_903_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -304,9 +304,9 @@ impl WeightInfo { pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 26_946_000 picoseconds. - Weight::from_parts(27_774_000, 11244) + // Estimated: `3535` + // Minimum execution time: 24_428_000 picoseconds. + Weight::from_parts(24_732_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_192_000 picoseconds. - Weight::from_parts(3_262_000, 0) + // Minimum execution time: 2_779_000 picoseconds. + Weight::from_parts(2_822_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_129_000 picoseconds. - Weight::from_parts(3_199_000, 0) + // Minimum execution time: 2_789_000 picoseconds. + Weight::from_parts(2_873_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_156_000 picoseconds. - Weight::from_parts(3_202_000, 0) + // Minimum execution time: 2_819_000 picoseconds. + Weight::from_parts(2_904_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_114_000 picoseconds. - Weight::from_parts(3_208_000, 0) + // Minimum execution time: 2_788_000 picoseconds. + Weight::from_parts(2_887_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_315_000 picoseconds. - Weight::from_parts(3_374_000, 0) + // Minimum execution time: 3_006_000 picoseconds. + Weight::from_parts(3_078_000, 0) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs index 638e1354d91..41db3176f35 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_xcmp_queue`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_434_000 picoseconds. - Weight::from_parts(5_663_000, 0) + // Minimum execution time: 5_293_000 picoseconds. + Weight::from_parts(5_572_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_301_000 picoseconds. - Weight::from_parts(5_415_000, 0) + // Minimum execution time: 5_449_000 picoseconds. + Weight::from_parts(5_627_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs index ed5e6270415..bc032cff788 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `frame_system`. pub struct WeightInfo(PhantomData); @@ -52,22 +53,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_311_000 picoseconds. - Weight::from_parts(2_347_000, 0) + // Minimum execution time: 2_299_000 picoseconds. + Weight::from_parts(2_329_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(370, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(369, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_875_000 picoseconds. - Weight::from_parts(7_972_000, 0) + // Minimum execution time: 7_960_000 picoseconds. + Weight::from_parts(8_041_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_410, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_404, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -77,8 +78,8 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 4_309_000 picoseconds. - Weight::from_parts(4_457_000, 0) + // Minimum execution time: 4_340_000 picoseconds. + Weight::from_parts(4_506_000, 0) .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -90,11 +91,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_526_000 picoseconds. - Weight::from_parts(2_564_000, 0) + // Minimum execution time: 2_455_000 picoseconds. + Weight::from_parts(2_517_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_869 - .saturating_add(Weight::from_parts(678_765, 0).saturating_mul(i.into())) + // Standard Error: 1_927 + .saturating_add(Weight::from_parts(673_981, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +105,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_526_000 picoseconds. - Weight::from_parts(2_603_000, 0) + // Minimum execution time: 2_502_000 picoseconds. + Weight::from_parts(2_546_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 899 - .saturating_add(Weight::from_parts(497_948, 0).saturating_mul(i.into())) + // Standard Error: 839 + .saturating_add(Weight::from_parts(492_306, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -118,11 +119,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `68 + p * (69 ±0)` // Estimated: `66 + p * (70 ±0)` - // Minimum execution time: 4_280_000 picoseconds. - Weight::from_parts(4_398_000, 0) + // Minimum execution time: 4_106_000 picoseconds. + Weight::from_parts(4_196_000, 0) .saturating_add(Weight::from_parts(0, 66)) - // Standard Error: 1_108 - .saturating_add(Weight::from_parts(1_011_188, 0).saturating_mul(p.into())) + // Standard Error: 1_231 + .saturating_add(Weight::from_parts(1_030_791, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs index 5b57a5b7b4d..bba8bf0318e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_balances`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 35_746_000 picoseconds. - Weight::from_parts(36_167_000, 0) + // Minimum execution time: 54_781_000 picoseconds. + Weight::from_parts(55_287_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 26_301_000 picoseconds. - Weight::from_parts(26_847_000, 0) + // Minimum execution time: 41_473_000 picoseconds. + Weight::from_parts(41_749_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -77,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 16_073_000 picoseconds. - Weight::from_parts(16_292_000, 0) + // Minimum execution time: 16_997_000 picoseconds. + Weight::from_parts(17_207_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -89,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 19_589_000 picoseconds. - Weight::from_parts(20_034_000, 0) + // Minimum execution time: 23_998_000 picoseconds. + Weight::from_parts(24_245_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -101,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 37_416_000 picoseconds. - Weight::from_parts(37_894_000, 0) + // Minimum execution time: 56_390_000 picoseconds. + Weight::from_parts(56_963_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -113,25 +114,38 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 32_565_000 picoseconds. - Weight::from_parts(33_087_000, 0) + // Minimum execution time: 50_769_000 picoseconds. + Weight::from_parts(51_077_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - fn upgrade_accounts(_: u32) -> Weight { - Weight::from_parts(0, 0) - } fn force_unreserve() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 15_291_000 picoseconds. - Weight::from_parts(15_614_000, 0) + // Minimum execution time: 19_617_000 picoseconds. + Weight::from_parts(19_827_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: System Account (r:999 w:999) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 18_453_000 picoseconds. + Weight::from_parts(18_528_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 10_749 + .saturating_add(Weight::from_parts(14_321_237, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs index cf4ee2028f7..175d98504ad 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_collator_selection`. pub struct WeightInfo(PhantomData); @@ -56,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `214 + b * (78 ±0)` // Estimated: `1203 + b * (2554 ±0)` - // Minimum execution time: 14_833_000 picoseconds. - Weight::from_parts(15_349_415, 0) + // Minimum execution time: 15_056_000 picoseconds. + Weight::from_parts(15_300_844, 0) .saturating_add(Weight::from_parts(0, 1203)) - // Standard Error: 3_477 - .saturating_add(Weight::from_parts(2_639_530, 0).saturating_mul(b.into())) + // Standard Error: 2_903 + .saturating_add(Weight::from_parts(2_591_470, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_190_000 picoseconds. - Weight::from_parts(7_558_000, 0) + // Minimum execution time: 7_296_000 picoseconds. + Weight::from_parts(7_526_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_435_000 picoseconds. - Weight::from_parts(7_790_000, 0) + // Minimum execution time: 7_483_000 picoseconds. + Weight::from_parts(7_694_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,12 +104,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `1104 + c * (48 ±0)` - // Estimated: `61672 + c * (49 ±0)` - // Minimum execution time: 38_999_000 picoseconds. - Weight::from_parts(31_254_595, 0) - .saturating_add(Weight::from_parts(0, 61672)) - // Standard Error: 1_266 - .saturating_add(Weight::from_parts(108_612, 0).saturating_mul(c.into())) + // Estimated: `49487 + c * (49 ±0)` + // Minimum execution time: 42_882_000 picoseconds. + Weight::from_parts(34_865_364, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_292 + .saturating_add(Weight::from_parts(107_420, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -122,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `428 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 29_894_000 picoseconds. - Weight::from_parts(19_491_329, 0) + // Minimum execution time: 34_025_000 picoseconds. + Weight::from_parts(23_170_113, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_328 - .saturating_add(Weight::from_parts(109_217, 0).saturating_mul(c.into())) + // Standard Error: 1_333 + .saturating_add(Weight::from_parts(108_636, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -139,10 +140,10 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn note_author() -> Weight { // Proof Size summary in bytes: // Measured: `155` - // Estimated: `7729` - // Minimum execution time: 29_666_000 picoseconds. - Weight::from_parts(30_017_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `6196` + // Minimum execution time: 45_689_000 picoseconds. + Weight::from_parts(46_236_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +161,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22815 + r * (116 ±0) + c * (97 ±0)` - // Estimated: `56697 + r * (2602 ±0) + c * (2520 ±0)` - // Minimum execution time: 17_009_000 picoseconds. - Weight::from_parts(17_119_000, 0) - .saturating_add(Weight::from_parts(0, 56697)) - // Standard Error: 839_085 - .saturating_add(Weight::from_parts(30_312_617, 0).saturating_mul(c.into())) + // Measured: `22815 + c * (97 ±0) + r * (116 ±0)` + // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` + // Minimum execution time: 16_853_000 picoseconds. + Weight::from_parts(16_995_000, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 900_191 + .saturating_add(Weight::from_parts(31_884_166, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) + .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) - .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs index df58cf7952a..deda8024527 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_multisig`. pub struct WeightInfo(PhantomData); @@ -52,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_203_000 picoseconds. - Weight::from_parts(12_687_394, 0) + // Minimum execution time: 11_833_000 picoseconds. + Weight::from_parts(12_347_180, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2 - .saturating_add(Weight::from_parts(556, 0).saturating_mul(z.into())) + // Standard Error: 1 + .saturating_add(Weight::from_parts(554, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -66,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 37_793_000 picoseconds. - Weight::from_parts(32_841_866, 0) + // Minimum execution time: 41_899_000 picoseconds. + Weight::from_parts(35_770_287, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 973 - .saturating_add(Weight::from_parts(64_271, 0).saturating_mul(s.into())) - // Standard Error: 9 - .saturating_add(Weight::from_parts(1_189, 0).saturating_mul(z.into())) + // Standard Error: 542 + .saturating_add(Weight::from_parts(67_778, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_239, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -84,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 27_835_000 picoseconds. - Weight::from_parts(22_419_199, 0) + // Minimum execution time: 27_916_000 picoseconds. + Weight::from_parts(22_006_035, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 535 - .saturating_add(Weight::from_parts(59_729, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_259, 0).saturating_mul(z.into())) + // Standard Error: 311 + .saturating_add(Weight::from_parts(63_189, 0).saturating_mul(s.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_244, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,14 +104,14 @@ impl pallet_multisig::WeightInfo for WeightInfo { fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `388 + s * (33 ±0)` - // Estimated: `10404` - // Minimum execution time: 43_060_000 picoseconds. - Weight::from_parts(36_326_276, 0) - .saturating_add(Weight::from_parts(0, 10404)) - // Standard Error: 497 - .saturating_add(Weight::from_parts(76_443, 0).saturating_mul(s.into())) + // Estimated: `6811` + // Minimum execution time: 46_594_000 picoseconds. + Weight::from_parts(38_993_543, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 498 + .saturating_add(Weight::from_parts(84_584, 0).saturating_mul(s.into())) // Standard Error: 4 - .saturating_add(Weight::from_parts(1_257, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_271, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -121,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 29_242_000 picoseconds. - Weight::from_parts(30_673_516, 0) + // Minimum execution time: 32_894_000 picoseconds. + Weight::from_parts(33_904_403, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 651 - .saturating_add(Weight::from_parts(67_820, 0).saturating_mul(s.into())) + // Standard Error: 801 + .saturating_add(Weight::from_parts(76_776, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -136,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 19_344_000 picoseconds. - Weight::from_parts(20_956_909, 0) + // Minimum execution time: 19_290_000 picoseconds. + Weight::from_parts(20_348_418, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 781 - .saturating_add(Weight::from_parts(65_374, 0).saturating_mul(s.into())) + // Standard Error: 465 + .saturating_add(Weight::from_parts(66_913, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -151,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 30_222_000 picoseconds. - Weight::from_parts(31_457_558, 0) + // Minimum execution time: 33_275_000 picoseconds. + Weight::from_parts(34_932_596, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 648 - .saturating_add(Weight::from_parts(67_068, 0).saturating_mul(s.into())) + // Standard Error: 564 + .saturating_add(Weight::from_parts(71_231, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs index 67883fab331..fd1e6b2034b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_session`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `297` - // Estimated: `7524` - // Minimum execution time: 17_590_000 picoseconds. - Weight::from_parts(18_134_000, 0) - .saturating_add(Weight::from_parts(0, 7524)) + // Estimated: `3762` + // Minimum execution time: 17_753_000 picoseconds. + Weight::from_parts(18_269_000, 0) + .saturating_add(Weight::from_parts(0, 3762)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +69,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `279` - // Estimated: `4023` - // Minimum execution time: 13_479_000 picoseconds. - Weight::from_parts(13_956_000, 0) - .saturating_add(Weight::from_parts(0, 4023)) + // Estimated: `3744` + // Minimum execution time: 13_403_000 picoseconds. + Weight::from_parts(13_821_000, 0) + .saturating_add(Weight::from_parts(0, 3744)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs index 7be7f6691f0..4a40dc1c75d 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_timestamp`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `49` - // Estimated: `2986` - // Minimum execution time: 7_610_000 picoseconds. - Weight::from_parts(7_887_000, 0) - .saturating_add(Weight::from_parts(0, 2986)) + // Estimated: `1493` + // Minimum execution time: 7_595_000 picoseconds. + Weight::from_parts(7_831_000, 0) + .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_100_000 picoseconds. - Weight::from_parts(3_180_000, 0) + // Minimum execution time: 3_169_000 picoseconds. + Weight::from_parts(3_316_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs index 2420a70d1fb..ec43ac02ac1 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_utility`. pub struct WeightInfo(PhantomData); @@ -52,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_051_000 picoseconds. - Weight::from_parts(10_722_806, 0) + // Minimum execution time: 7_483_000 picoseconds. + Weight::from_parts(10_302_924, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 4_213 - .saturating_add(Weight::from_parts(4_992_366, 0).saturating_mul(c.into())) + // Standard Error: 2_285 + .saturating_add(Weight::from_parts(4_760_910, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_831_000 picoseconds. - Weight::from_parts(6_014_000, 0) + // Minimum execution time: 5_768_000 picoseconds. + Weight::from_parts(5_879_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_394_000 picoseconds. - Weight::from_parts(15_396_332, 0) + // Minimum execution time: 7_566_000 picoseconds. + Weight::from_parts(653_292, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_533 - .saturating_add(Weight::from_parts(5_302_383, 0).saturating_mul(c.into())) + // Standard Error: 2_989 + .saturating_add(Weight::from_parts(5_103_611, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_730_000 picoseconds. - Weight::from_parts(9_988_000, 0) + // Minimum execution time: 9_656_000 picoseconds. + Weight::from_parts(9_902_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_395_000 picoseconds. - Weight::from_parts(14_933_943, 0) + // Minimum execution time: 7_524_000 picoseconds. + Weight::from_parts(1_487_243, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_208 - .saturating_add(Weight::from_parts(4_963_051, 0).saturating_mul(c.into())) + // Standard Error: 3_565 + .saturating_add(Weight::from_parts(4_841_130, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs index 23f4f1cb27b..efaf8232a35 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); @@ -60,10 +61,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn send() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `9595` - // Minimum execution time: 27_429_000 picoseconds. - Weight::from_parts(28_626_000, 0) - .saturating_add(Weight::from_parts(0, 9595)) + // Estimated: `3503` + // Minimum execution time: 27_565_000 picoseconds. + Weight::from_parts(28_064_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1489` - // Minimum execution time: 27_626_000 picoseconds. - Weight::from_parts(28_561_000, 0) + // Minimum execution time: 29_361_000 picoseconds. + Weight::from_parts(29_771_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -104,8 +105,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_264_000 picoseconds. - Weight::from_parts(10_601_000, 0) + // Minimum execution time: 10_098_000 picoseconds. + Weight::from_parts(10_440_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -115,8 +116,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_218_000 picoseconds. - Weight::from_parts(3_311_000, 0) + // Minimum execution time: 3_142_000 picoseconds. + Weight::from_parts(3_262_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -139,10 +140,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `14659` - // Minimum execution time: 33_037_000 picoseconds. - Weight::from_parts(33_559_000, 0) - .saturating_add(Weight::from_parts(0, 14659)) + // Estimated: `3503` + // Minimum execution time: 32_356_000 picoseconds. + Weight::from_parts(32_859_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -163,19 +164,21 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `220` - // Estimated: `14410` - // Minimum execution time: 34_280_000 picoseconds. - Weight::from_parts(34_943_000, 0) - .saturating_add(Weight::from_parts(0, 14410)) + // Estimated: `3685` + // Minimum execution time: 33_773_000 picoseconds. + Weight::from_parts(34_410_000, 0) + .saturating_add(Weight::from_parts(0, 3685)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) + /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) fn force_suspension() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_218_000 picoseconds. - Weight::from_parts(3_311_000, 0) + // Minimum execution time: 3_127_000 picoseconds. + Weight::from_parts(3_240_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -185,8 +188,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `95` // Estimated: `10985` - // Minimum execution time: 15_106_000 picoseconds. - Weight::from_parts(15_383_000, 0) + // Minimum execution time: 14_941_000 picoseconds. + Weight::from_parts(15_378_000, 0) .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -197,8 +200,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `99` // Estimated: `10989` - // Minimum execution time: 15_129_000 picoseconds. - Weight::from_parts(15_489_000, 0) + // Minimum execution time: 14_750_000 picoseconds. + Weight::from_parts(14_903_000, 0) .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -209,8 +212,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `13471` - // Minimum execution time: 15_526_000 picoseconds. - Weight::from_parts(15_778_000, 0) + // Minimum execution time: 15_360_000 picoseconds. + Weight::from_parts(15_593_000, 0) .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -229,10 +232,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `15981` - // Minimum execution time: 29_457_000 picoseconds. - Weight::from_parts(29_970_000, 0) - .saturating_add(Weight::from_parts(0, 15981)) + // Estimated: `6046` + // Minimum execution time: 28_886_000 picoseconds. + Weight::from_parts(29_140_000, 0) + .saturating_add(Weight::from_parts(0, 6046)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -242,8 +245,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `136` // Estimated: `8551` - // Minimum execution time: 8_264_000 picoseconds. - Weight::from_parts(8_518_000, 0) + // Minimum execution time: 8_045_000 picoseconds. + Weight::from_parts(8_301_000, 0) .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -253,8 +256,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `10996` - // Minimum execution time: 15_633_000 picoseconds. - Weight::from_parts(16_006_000, 0) + // Minimum execution time: 14_763_000 picoseconds. + Weight::from_parts(15_186_000, 0) .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -274,10 +277,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: // Measured: `112` - // Estimated: `20967` - // Minimum execution time: 35_849_000 picoseconds. - Weight::from_parts(36_545_000, 0) - .saturating_add(Weight::from_parts(0, 20967)) + // Estimated: `11002` + // Minimum execution time: 34_652_000 picoseconds. + Weight::from_parts(34_888_000, 0) + .saturating_add(Weight::from_parts(0, 11002)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 731111e358e..ad69bf08427 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 21_045_000 picoseconds. - Weight::from_parts(21_781_000, 3593) + // Minimum execution time: 24_766_000 picoseconds. + Weight::from_parts(25_113_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `153` // Estimated: `6196` - // Minimum execution time: 33_123_000 picoseconds. - Weight::from_parts(33_378_000, 6196) + // Minimum execution time: 51_440_000 picoseconds. + Weight::from_parts(51_960_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -87,9 +87,9 @@ impl WeightInfo { pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `223` - // Estimated: `18205` - // Minimum execution time: 57_689_000 picoseconds. - Weight::from_parts(58_320_000, 18205) + // Estimated: `6196` + // Minimum execution time: 76_002_000 picoseconds. + Weight::from_parts(76_826_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_838_000 picoseconds. - Weight::from_parts(4_906_000, 0) + // Minimum execution time: 4_644_000 picoseconds. + Weight::from_parts(4_754_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `52` // Estimated: `3593` - // Minimum execution time: 25_197_000 picoseconds. - Weight::from_parts(25_562_000, 3593) + // Minimum execution time: 27_398_000 picoseconds. + Weight::from_parts(27_947_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -128,9 +128,9 @@ impl WeightInfo { pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: // Measured: `122` - // Estimated: `15097` - // Minimum execution time: 52_159_000 picoseconds. - Weight::from_parts(52_637_000, 15097) + // Estimated: `3593` + // Minimum execution time: 54_445_000 picoseconds. + Weight::from_parts(55_026_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -149,9 +149,9 @@ impl WeightInfo { pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 30_471_000 picoseconds. - Weight::from_parts(31_112_000, 11244) + // Estimated: `3535` + // Minimum execution time: 30_770_000 picoseconds. + Weight::from_parts(31_269_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index fe5873f7e11..0b06968e441 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -63,9 +63,9 @@ impl WeightInfo { pub fn report_holding() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 34_238_000 picoseconds. - Weight::from_parts(34_851_000, 11244) + // Estimated: `3535` + // Minimum execution time: 34_120_000 picoseconds. + Weight::from_parts(34_618_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_358_000 picoseconds. - Weight::from_parts(3_437_000, 0) + // Minimum execution time: 3_285_000 picoseconds. + Weight::from_parts(3_426_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 11_623_000 picoseconds. - Weight::from_parts(11_814_000, 3497) + // Minimum execution time: 11_025_000 picoseconds. + Weight::from_parts(11_293_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_934_000 picoseconds. - Weight::from_parts(14_111_000, 0) + // Minimum execution time: 13_451_000 picoseconds. + Weight::from_parts(13_625_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_562_000 picoseconds. - Weight::from_parts(3_689_000, 0) + // Minimum execution time: 3_578_000 picoseconds. + Weight::from_parts(3_639_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_280_000 picoseconds. - Weight::from_parts(3_345_000, 0) + // Minimum execution time: 3_123_000 picoseconds. + Weight::from_parts(3_190_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_243_000 picoseconds. - Weight::from_parts(3_335_000, 0) + // Minimum execution time: 3_176_000 picoseconds. + Weight::from_parts(3_223_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_280_000 picoseconds. - Weight::from_parts(3_347_000, 0) + // Minimum execution time: 3_142_000 picoseconds. + Weight::from_parts(3_200_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_270_000 picoseconds. - Weight::from_parts(4_358_000, 0) + // Minimum execution time: 4_308_000 picoseconds. + Weight::from_parts(4_392_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_245_000 picoseconds. - Weight::from_parts(3_320_000, 0) + // Minimum execution time: 3_114_000 picoseconds. + Weight::from_parts(3_189_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -150,9 +150,9 @@ impl WeightInfo { pub fn report_error() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 26_653_000 picoseconds. - Weight::from_parts(27_139_000, 11244) + // Estimated: `3535` + // Minimum execution time: 26_422_000 picoseconds. + Weight::from_parts(26_959_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 15_478_000 picoseconds. - Weight::from_parts(15_763_000, 3555) + // Minimum execution time: 15_625_000 picoseconds. + Weight::from_parts(15_828_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_237_000 picoseconds. - Weight::from_parts(3_314_000, 0) + // Minimum execution time: 3_187_000 picoseconds. + Weight::from_parts(3_238_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -189,9 +189,9 @@ impl WeightInfo { pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: // Measured: `38` - // Estimated: `13098` - // Minimum execution time: 29_098_000 picoseconds. - Weight::from_parts(29_368_000, 13098) + // Estimated: `3503` + // Minimum execution time: 27_154_000 picoseconds. + Weight::from_parts(27_761_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_253_000 picoseconds. - Weight::from_parts(6_467_000, 0) + // Minimum execution time: 5_268_000 picoseconds. + Weight::from_parts(5_412_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -220,9 +220,9 @@ impl WeightInfo { pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 35_061_000 picoseconds. - Weight::from_parts(35_510_000, 11244) + // Estimated: `3535` + // Minimum execution time: 30_515_000 picoseconds. + Weight::from_parts(31_095_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_154_000 picoseconds. - Weight::from_parts(6_266_000, 0) + // Minimum execution time: 5_148_000 picoseconds. + Weight::from_parts(5_224_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_009_000 picoseconds. - Weight::from_parts(4_088_000, 0) + // Minimum execution time: 3_220_000 picoseconds. + Weight::from_parts(3_312_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_873_000 picoseconds. - Weight::from_parts(3_996_000, 0) + // Minimum execution time: 3_226_000 picoseconds. + Weight::from_parts(3_309_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_759_000 picoseconds. - Weight::from_parts(3_820_000, 0) + // Minimum execution time: 3_095_000 picoseconds. + Weight::from_parts(3_177_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_985_000 picoseconds. - Weight::from_parts(4_132_000, 0) + // Minimum execution time: 3_349_000 picoseconds. + Weight::from_parts(3_447_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -276,9 +276,9 @@ impl WeightInfo { pub fn query_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 34_686_000 picoseconds. - Weight::from_parts(35_233_000, 11244) + // Estimated: `3535` + // Minimum execution time: 29_644_000 picoseconds. + Weight::from_parts(30_110_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_129_000 picoseconds. - Weight::from_parts(6_244_000, 0) + // Minimum execution time: 5_304_000 picoseconds. + Weight::from_parts(5_369_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -304,9 +304,9 @@ impl WeightInfo { pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `70` - // Estimated: `11244` - // Minimum execution time: 31_502_000 picoseconds. - Weight::from_parts(32_131_000, 11244) + // Estimated: `3535` + // Minimum execution time: 26_617_000 picoseconds. + Weight::from_parts(27_011_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,29 +314,29 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_747_000 picoseconds. - Weight::from_parts(3_832_000, 0) + // Minimum execution time: 3_133_000 picoseconds. + Weight::from_parts(3_229_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_825_000 picoseconds. - Weight::from_parts(3_857_000, 0) + // Minimum execution time: 3_110_000 picoseconds. + Weight::from_parts(3_203_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_777_000 picoseconds. - Weight::from_parts(3_868_000, 0) + // Minimum execution time: 3_138_000 picoseconds. + Weight::from_parts(3_201_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_710_000 picoseconds. - Weight::from_parts(3_820_000, 0) + // Minimum execution time: 3_116_000 picoseconds. + Weight::from_parts(3_187_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -357,7 +357,7 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_876_000 picoseconds. - Weight::from_parts(4_012_000, 0) + // Minimum execution time: 3_364_000 picoseconds. + Weight::from_parts(3_429_000, 0) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs index 0e7cf604304..6bbe4229967 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_xcmp_queue`. pub struct WeightInfo(PhantomData); @@ -51,11 +52,11 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn /// Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) fn set_config_with_u32() -> Weight { // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_477_000 picoseconds. - Weight::from_parts(5_623_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) + // Measured: `109` + // Estimated: `1594` + // Minimum execution time: 5_475_000 picoseconds. + Weight::from_parts(5_752_000, 0) + .saturating_add(Weight::from_parts(0, 1594)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -63,11 +64,11 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn /// Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) fn set_config_with_weight() -> Weight { // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_510_000 picoseconds. - Weight::from_parts(5_676_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) + // Measured: `109` + // Estimated: `1594` + // Minimum execution time: 5_467_000 picoseconds. + Weight::from_parts(5_652_000, 0) + .saturating_add(Weight::from_parts(0, 1594)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs index 7bd018bd341..3ed39207605 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `frame_system`. pub struct WeightInfo(PhantomData); @@ -52,22 +53,22 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_300_000 picoseconds. - Weight::from_parts(2_345_000, 0) + // Minimum execution time: 2_326_000 picoseconds. + Weight::from_parts(2_387_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(370, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(413, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_053_000 picoseconds. - Weight::from_parts(8_155_000, 0) + // Minimum execution time: 7_797_000 picoseconds. + Weight::from_parts(7_933_000, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_414, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_455, 0).saturating_mul(b.into())) } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -77,8 +78,8 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 4_456_000 picoseconds. - Weight::from_parts(4_609_000, 0) + // Minimum execution time: 4_428_000 picoseconds. + Weight::from_parts(4_614_000, 0) .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -90,11 +91,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_370_000 picoseconds. - Weight::from_parts(2_403_000, 0) + // Minimum execution time: 2_429_000 picoseconds. + Weight::from_parts(2_469_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_643 - .saturating_add(Weight::from_parts(676_881, 0).saturating_mul(i.into())) + // Standard Error: 1_872 + .saturating_add(Weight::from_parts(671_478, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -104,11 +105,11 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_342_000 picoseconds. - Weight::from_parts(2_394_000, 0) + // Minimum execution time: 2_415_000 picoseconds. + Weight::from_parts(2_487_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 917 - .saturating_add(Weight::from_parts(502_661, 0).saturating_mul(i.into())) + // Standard Error: 923 + .saturating_add(Weight::from_parts(493_312, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: Skipped Metadata (r:0 w:0) @@ -116,13 +117,13 @@ impl frame_system::WeightInfo for WeightInfo { /// The range of component `p` is `[0, 1000]`. fn kill_prefix(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `68 + p * (69 ±0)` - // Estimated: `69 + p * (70 ±0)` - // Minimum execution time: 4_461_000 picoseconds. - Weight::from_parts(4_561_000, 0) - .saturating_add(Weight::from_parts(0, 69)) - // Standard Error: 1_428 - .saturating_add(Weight::from_parts(1_016_381, 0).saturating_mul(p.into())) + // Measured: `82 + p * (69 ±0)` + // Estimated: `77 + p * (70 ±0)` + // Minimum execution time: 4_228_000 picoseconds. + Weight::from_parts(4_297_000, 0) + .saturating_add(Weight::from_parts(0, 77)) + // Standard Error: 1_145 + .saturating_add(Weight::from_parts(1_022_122, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs index f8bf9ca73dd..4ee8738d5af 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_alliance` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_alliance`. pub struct WeightInfo(PhantomData); @@ -63,20 +64,20 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `439 + m * (32 ±0) + p * (36 ±0)` - // Estimated: `14703 + m * (128 ±0) + p * (144 ±0)` - // Minimum execution time: 29_793_000 picoseconds. - Weight::from_parts(31_622_009, 0) - .saturating_add(Weight::from_parts(0, 14703)) - // Standard Error: 59 - .saturating_add(Weight::from_parts(194, 0).saturating_mul(b.into())) - // Standard Error: 626 - .saturating_add(Weight::from_parts(16_277, 0).saturating_mul(m.into())) - // Standard Error: 618 - .saturating_add(Weight::from_parts(115_342, 0).saturating_mul(p.into())) + // Estimated: `6676 + m * (32 ±0) + p * (36 ±0)` + // Minimum execution time: 30_492_000 picoseconds. + Weight::from_parts(33_119_713, 0) + .saturating_add(Weight::from_parts(0, 6676)) + // Standard Error: 60 + .saturating_add(Weight::from_parts(285, 0).saturating_mul(b.into())) + // Standard Error: 632 + .saturating_add(Weight::from_parts(10_988, 0).saturating_mul(m.into())) + // Standard Error: 624 + .saturating_add(Weight::from_parts(140_169, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(Weight::from_parts(0, 128).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 144).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } /// Storage: Alliance Members (r:1 w:0) /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) @@ -86,12 +87,12 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn vote(m: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `868 + m * (64 ±0)` - // Estimated: `11008 + m * (64 ±0)` - // Minimum execution time: 24_860_000 picoseconds. - Weight::from_parts(25_540_583, 0) - .saturating_add(Weight::from_parts(0, 11008)) - // Standard Error: 1_049 - .saturating_add(Weight::from_parts(44_450, 0).saturating_mul(m.into())) + // Estimated: `6676 + m * (64 ±0)` + // Minimum execution time: 25_442_000 picoseconds. + Weight::from_parts(26_215_947, 0) + .saturating_add(Weight::from_parts(0, 6676)) + // Standard Error: 410 + .saturating_add(Weight::from_parts(43_449, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) @@ -111,18 +112,18 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn close_early_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `312 + m * (96 ±0) + p * (36 ±0)` - // Estimated: `14519 + m * (388 ±0) + p * (144 ±0)` - // Minimum execution time: 35_120_000 picoseconds. - Weight::from_parts(33_274_472, 0) - .saturating_add(Weight::from_parts(0, 14519)) - // Standard Error: 1_030 - .saturating_add(Weight::from_parts(41_853, 0).saturating_mul(m.into())) - // Standard Error: 1_004 - .saturating_add(Weight::from_parts(111_626, 0).saturating_mul(p.into())) + // Estimated: `6676 + m * (97 ±0) + p * (36 ±0)` + // Minimum execution time: 35_991_000 picoseconds. + Weight::from_parts(34_605_748, 0) + .saturating_add(Weight::from_parts(0, 6676)) + // Standard Error: 598 + .saturating_add(Weight::from_parts(38_227, 0).saturating_mul(m.into())) + // Standard Error: 583 + .saturating_add(Weight::from_parts(119_512, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 388).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 144).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } /// Storage: Alliance Members (r:1 w:0) /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) @@ -140,18 +141,18 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn close_early_approved(_b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `762 + m * (96 ±0) + p * (41 ±0)` - // Estimated: `19732 + m * (388 ±0) + p * (160 ±0)` - // Minimum execution time: 47_135_000 picoseconds. - Weight::from_parts(42_191_348, 0) - .saturating_add(Weight::from_parts(0, 19732)) - // Standard Error: 4_449 - .saturating_add(Weight::from_parts(76_548, 0).saturating_mul(m.into())) - // Standard Error: 4_337 - .saturating_add(Weight::from_parts(143_406, 0).saturating_mul(p.into())) + // Estimated: `6676 + m * (97 ±0) + p * (40 ±0)` + // Minimum execution time: 48_168_000 picoseconds. + Weight::from_parts(48_554_161, 0) + .saturating_add(Weight::from_parts(0, 6676)) + // Standard Error: 1_770 + .saturating_add(Weight::from_parts(47_441, 0).saturating_mul(m.into())) + // Standard Error: 1_725 + .saturating_add(Weight::from_parts(119_704, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 388).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 160).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) } /// Storage: Alliance Members (r:1 w:0) /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) @@ -172,18 +173,18 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn close_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `518 + m * (96 ±0) + p * (41 ±0)` - // Estimated: `19135 + m * (509 ±0) + p * (203 ±0)` - // Minimum execution time: 45_329_000 picoseconds. - Weight::from_parts(46_859_108, 0) - .saturating_add(Weight::from_parts(0, 19135)) - // Standard Error: 3_831 - .saturating_add(Weight::from_parts(100_587, 0).saturating_mul(m.into())) - // Standard Error: 3_785 - .saturating_add(Weight::from_parts(134_469, 0).saturating_mul(p.into())) + // Estimated: `6676 + m * (109 ±0) + p * (43 ±0)` + // Minimum execution time: 47_356_000 picoseconds. + Weight::from_parts(48_308_769, 0) + .saturating_add(Weight::from_parts(0, 6676)) + // Standard Error: 3_712 + .saturating_add(Weight::from_parts(99_809, 0).saturating_mul(m.into())) + // Standard Error: 3_667 + .saturating_add(Weight::from_parts(136_999, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(Weight::from_parts(0, 509).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 203).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 109).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 43).saturating_mul(p.into())) } /// Storage: Alliance Members (r:1 w:0) /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) @@ -203,18 +204,18 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn close_approved(_b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `417 + m * (96 ±0) + p * (36 ±0)` - // Estimated: `16746 + m * (480 ±0) + p * (180 ±0)` - // Minimum execution time: 36_795_000 picoseconds. - Weight::from_parts(35_568_715, 0) - .saturating_add(Weight::from_parts(0, 16746)) - // Standard Error: 630 - .saturating_add(Weight::from_parts(42_253, 0).saturating_mul(m.into())) - // Standard Error: 607 - .saturating_add(Weight::from_parts(107_080, 0).saturating_mul(p.into())) + // Estimated: `6676 + m * (96 ±0) + p * (36 ±0)` + // Minimum execution time: 37_575_000 picoseconds. + Weight::from_parts(36_322_752, 0) + .saturating_add(Weight::from_parts(0, 6676)) + // Standard Error: 530 + .saturating_add(Weight::from_parts(38_879, 0).saturating_mul(m.into())) + // Standard Error: 511 + .saturating_add(Weight::from_parts(119_293, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 480).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 180).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 96).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } /// Storage: Alliance Members (r:2 w:2) /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) @@ -225,14 +226,14 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn init_members(m: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `12` - // Estimated: `13859` - // Minimum execution time: 30_057_000 picoseconds. - Weight::from_parts(19_584_887, 0) - .saturating_add(Weight::from_parts(0, 13859)) - // Standard Error: 657 - .saturating_add(Weight::from_parts(127_220, 0).saturating_mul(m.into())) - // Standard Error: 649 - .saturating_add(Weight::from_parts(111_719, 0).saturating_mul(z.into())) + // Estimated: `12362` + // Minimum execution time: 31_194_000 picoseconds. + Weight::from_parts(19_730_185, 0) + .saturating_add(Weight::from_parts(0, 12362)) + // Standard Error: 589 + .saturating_add(Weight::from_parts(141_552, 0).saturating_mul(m.into())) + // Standard Error: 582 + .saturating_add(Weight::from_parts(118_056, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -254,25 +255,25 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn disband(x: u32, y: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + x * (52 ±0) + y * (53 ±0) + z * (250 ±0)` - // Estimated: `35354 + x * (2590 ±0) + y * (2590 ±0) + z * (3104 ±1)` - // Minimum execution time: 257_465_000 picoseconds. - Weight::from_parts(258_993_000, 0) - .saturating_add(Weight::from_parts(0, 35354)) - // Standard Error: 22_094 - .saturating_add(Weight::from_parts(469_539, 0).saturating_mul(x.into())) - // Standard Error: 21_987 - .saturating_add(Weight::from_parts(478_507, 0).saturating_mul(y.into())) - // Standard Error: 43_935 - .saturating_add(Weight::from_parts(10_541_803, 0).saturating_mul(z.into())) + // Estimated: `12362 + x * (2539 ±0) + y * (2539 ±0) + z * (2603 ±1)` + // Minimum execution time: 262_149_000 picoseconds. + Weight::from_parts(263_057_000, 0) + .saturating_add(Weight::from_parts(0, 12362)) + // Standard Error: 21_165 + .saturating_add(Weight::from_parts(497_129, 0).saturating_mul(x.into())) + // Standard Error: 21_063 + .saturating_add(Weight::from_parts(478_945, 0).saturating_mul(y.into())) + // Standard Error: 42_088 + .saturating_add(Weight::from_parts(14_786_304, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(x.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(y.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(z.into()))) .saturating_add(T::DbWeight::get().writes(4)) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(z.into()))) - .saturating_add(Weight::from_parts(0, 2590).saturating_mul(x.into())) - .saturating_add(Weight::from_parts(0, 2590).saturating_mul(y.into())) - .saturating_add(Weight::from_parts(0, 3104).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(0, 2539).saturating_mul(x.into())) + .saturating_add(Weight::from_parts(0, 2539).saturating_mul(y.into())) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(z.into())) } /// Storage: Alliance Rule (r:0 w:1) /// Proof: Alliance Rule (max_values: Some(1), max_size: Some(87), added: 582, mode: MaxEncodedLen) @@ -280,8 +281,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_973_000 picoseconds. - Weight::from_parts(10_247_000, 0) + // Minimum execution time: 10_181_000 picoseconds. + Weight::from_parts(10_320_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -291,8 +292,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `76` // Estimated: `10187` - // Minimum execution time: 12_510_000 picoseconds. - Weight::from_parts(12_659_000, 0) + // Minimum execution time: 12_958_000 picoseconds. + Weight::from_parts(13_130_000, 0) .saturating_add(Weight::from_parts(0, 10187)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -303,8 +304,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `149` // Estimated: `10187` - // Minimum execution time: 13_365_000 picoseconds. - Weight::from_parts(13_575_000, 0) + // Minimum execution time: 13_987_000 picoseconds. + Weight::from_parts(14_205_000, 0) .saturating_add(Weight::from_parts(0, 10187)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -320,10 +321,10 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn join_alliance() -> Weight { // Proof Size summary in bytes: // Measured: `294` - // Estimated: `26328` - // Minimum execution time: 40_044_000 picoseconds. - Weight::from_parts(41_623_000, 0) - .saturating_add(Weight::from_parts(0, 26328)) + // Estimated: `18048` + // Minimum execution time: 44_585_000 picoseconds. + Weight::from_parts(45_153_000, 0) + .saturating_add(Weight::from_parts(0, 18048)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -334,10 +335,10 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn nominate_ally() -> Weight { // Proof Size summary in bytes: // Measured: `193` - // Estimated: `22735` - // Minimum execution time: 28_166_000 picoseconds. - Weight::from_parts(28_756_000, 0) - .saturating_add(Weight::from_parts(0, 22735)) + // Estimated: `18048` + // Minimum execution time: 28_059_000 picoseconds. + Weight::from_parts(28_305_000, 0) + .saturating_add(Weight::from_parts(0, 18048)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -352,10 +353,10 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn elevate_ally() -> Weight { // Proof Size summary in bytes: // Measured: `236` - // Estimated: `14555` - // Minimum execution time: 25_759_000 picoseconds. - Weight::from_parts(26_083_000, 0) - .saturating_add(Weight::from_parts(0, 14555)) + // Estimated: `12362` + // Minimum execution time: 26_197_000 picoseconds. + Weight::from_parts(26_655_000, 0) + .saturating_add(Weight::from_parts(0, 12362)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -372,10 +373,10 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn give_retirement_notice() -> Weight { // Proof Size summary in bytes: // Measured: `236` - // Estimated: `25927` - // Minimum execution time: 32_603_000 picoseconds. - Weight::from_parts(33_091_000, 0) - .saturating_add(Weight::from_parts(0, 25927)) + // Estimated: `23734` + // Minimum execution time: 33_606_000 picoseconds. + Weight::from_parts(33_898_000, 0) + .saturating_add(Weight::from_parts(0, 23734)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -390,10 +391,10 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn retire() -> Weight { // Proof Size summary in bytes: // Measured: `517` - // Estimated: `17315` - // Minimum execution time: 36_169_000 picoseconds. - Weight::from_parts(36_746_000, 0) - .saturating_add(Weight::from_parts(0, 17315)) + // Estimated: `6676` + // Minimum execution time: 39_968_000 picoseconds. + Weight::from_parts(40_586_000, 0) + .saturating_add(Weight::from_parts(0, 6676)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -423,11 +424,11 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) fn kick_member() -> Weight { // Proof Size summary in bytes: - // Measured: `622` - // Estimated: `45128` - // Minimum execution time: 127_845_000 picoseconds. - Weight::from_parts(129_248_000, 0) - .saturating_add(Weight::from_parts(0, 45128)) + // Measured: `643` + // Estimated: `18048` + // Minimum execution time: 145_826_000 picoseconds. + Weight::from_parts(149_620_000, 0) + .saturating_add(Weight::from_parts(0, 18048)) .saturating_add(T::DbWeight::get().reads(13)) .saturating_add(T::DbWeight::get().writes(8)) } @@ -440,14 +441,14 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn add_unscrupulous_items(n: u32, l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `76` - // Estimated: `31874` - // Minimum execution time: 8_183_000 picoseconds. - Weight::from_parts(8_256_000, 0) - .saturating_add(Weight::from_parts(0, 31874)) - // Standard Error: 2_929 - .saturating_add(Weight::from_parts(1_444_558, 0).saturating_mul(n.into())) - // Standard Error: 1_147 - .saturating_add(Weight::from_parts(68_146, 0).saturating_mul(l.into())) + // Estimated: `27187` + // Minimum execution time: 8_490_000 picoseconds. + Weight::from_parts(8_557_000, 0) + .saturating_add(Weight::from_parts(0, 27187)) + // Standard Error: 3_473 + .saturating_add(Weight::from_parts(1_473_071, 0).saturating_mul(n.into())) + // Standard Error: 1_360 + .saturating_add(Weight::from_parts(75_402, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -459,15 +460,15 @@ impl pallet_alliance::WeightInfo for WeightInfo { /// The range of component `l` is `[0, 255]`. fn remove_unscrupulous_items(n: u32, l: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + n * (289 ±0) + l * (100 ±0)` - // Estimated: `31874` - // Minimum execution time: 7_982_000 picoseconds. - Weight::from_parts(8_084_000, 0) - .saturating_add(Weight::from_parts(0, 31874)) - // Standard Error: 185_716 - .saturating_add(Weight::from_parts(16_937_748, 0).saturating_mul(n.into())) - // Standard Error: 72_734 - .saturating_add(Weight::from_parts(291_993, 0).saturating_mul(l.into())) + // Measured: `0 + l * (100 ±0) + n * (289 ±0)` + // Estimated: `27187` + // Minimum execution time: 8_394_000 picoseconds. + Weight::from_parts(8_467_000, 0) + .saturating_add(Weight::from_parts(0, 27187)) + // Standard Error: 199_845 + .saturating_add(Weight::from_parts(17_213_927, 0).saturating_mul(n.into())) + // Standard Error: 78_268 + .saturating_add(Weight::from_parts(427_473, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -482,10 +483,10 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn abdicate_fellow_status() -> Weight { // Proof Size summary in bytes: // Measured: `236` - // Estimated: `20241` - // Minimum execution time: 31_916_000 picoseconds. - Weight::from_parts(32_301_000, 0) - .saturating_add(Weight::from_parts(0, 20241)) + // Estimated: `18048` + // Minimum execution time: 32_255_000 picoseconds. + Weight::from_parts(32_787_000, 0) + .saturating_add(Weight::from_parts(0, 18048)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs index d36ba31bdb7..10b566b3f41 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_balances`. pub struct WeightInfo(PhantomData); @@ -53,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 35_300_000 picoseconds. - Weight::from_parts(35_618_000, 0) + // Minimum execution time: 53_490_000 picoseconds. + Weight::from_parts(54_270_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 26_091_000 picoseconds. - Weight::from_parts(26_666_000, 0) + // Minimum execution time: 40_895_000 picoseconds. + Weight::from_parts(41_541_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -77,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 15_271_000 picoseconds. - Weight::from_parts(15_835_000, 0) + // Minimum execution time: 16_009_000 picoseconds. + Weight::from_parts(16_345_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -89,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 18_684_000 picoseconds. - Weight::from_parts(19_146_000, 0) + // Minimum execution time: 22_757_000 picoseconds. + Weight::from_parts(23_225_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -101,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 36_588_000 picoseconds. - Weight::from_parts(37_315_000, 0) + // Minimum execution time: 55_122_000 picoseconds. + Weight::from_parts(55_729_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -113,25 +114,38 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 32_278_000 picoseconds. - Weight::from_parts(32_546_000, 0) + // Minimum execution time: 49_979_000 picoseconds. + Weight::from_parts(50_677_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - fn upgrade_accounts(_: u32) -> Weight { - Weight::from_parts(0, 0) - } fn force_unreserve() -> Weight { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 14_817_000 picoseconds. - Weight::from_parts(15_115_000, 0) + // Minimum execution time: 18_803_000 picoseconds. + Weight::from_parts(19_157_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: System Account (r:999 w:999) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 18_508_000 picoseconds. + Weight::from_parts(18_773_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 9_864 + .saturating_add(Weight::from_parts(14_451_484, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs index fb14fb9f956..3eee2a2014e 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_collator_selection`. pub struct WeightInfo(PhantomData); @@ -56,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` // Estimated: `1168 + b * (2554 ±0)` - // Minimum execution time: 14_884_000 picoseconds. - Weight::from_parts(14_947_157, 0) + // Minimum execution time: 15_467_000 picoseconds. + Weight::from_parts(15_103_183, 0) .saturating_add(Weight::from_parts(0, 1168)) - // Standard Error: 4_169 - .saturating_add(Weight::from_parts(2_615_559, 0).saturating_mul(b.into())) + // Standard Error: 2_853 + .saturating_add(Weight::from_parts(2_584_332, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -71,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_057_000 picoseconds. - Weight::from_parts(7_226_000, 0) + // Minimum execution time: 7_562_000 picoseconds. + Weight::from_parts(7_765_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_216_000 picoseconds. - Weight::from_parts(7_502_000, 0) + // Minimum execution time: 7_769_000 picoseconds. + Weight::from_parts(7_972_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -103,12 +104,12 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `1108 + c * (48 ±0)` - // Estimated: `61671 + c * (49 ±0)` - // Minimum execution time: 38_806_000 picoseconds. - Weight::from_parts(31_477_823, 0) - .saturating_add(Weight::from_parts(0, 61671)) - // Standard Error: 1_220 - .saturating_add(Weight::from_parts(108_369, 0).saturating_mul(c.into())) + // Estimated: `49487 + c * (49 ±0)` + // Minimum execution time: 42_430_000 picoseconds. + Weight::from_parts(35_423_103, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_209 + .saturating_add(Weight::from_parts(114_362, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -122,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `452 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 29_463_000 picoseconds. - Weight::from_parts(19_105_316, 0) + // Minimum execution time: 33_827_000 picoseconds. + Weight::from_parts(24_290_370, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_307 - .saturating_add(Weight::from_parts(106_299, 0).saturating_mul(c.into())) + // Standard Error: 1_249 + .saturating_add(Weight::from_parts(109_487, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -139,10 +140,10 @@ impl pallet_collator_selection::WeightInfo for WeightIn fn note_author() -> Weight { // Proof Size summary in bytes: // Measured: `103` - // Estimated: `7729` - // Minimum execution time: 28_319_000 picoseconds. - Weight::from_parts(28_880_000, 0) - .saturating_add(Weight::from_parts(0, 7729)) + // Estimated: `6196` + // Minimum execution time: 43_086_000 picoseconds. + Weight::from_parts(43_643_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -160,18 +161,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 1000]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22721 + r * (116 ±0) + c * (97 ±0)` - // Estimated: `56697 + r * (2602 ±0) + c * (2520 ±0)` - // Minimum execution time: 17_111_000 picoseconds. - Weight::from_parts(17_332_000, 0) - .saturating_add(Weight::from_parts(0, 56697)) - // Standard Error: 800_597 - .saturating_add(Weight::from_parts(29_089_719, 0).saturating_mul(c.into())) + // Measured: `22721 + c * (97 ±0) + r * (116 ±0)` + // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` + // Minimum execution time: 17_338_000 picoseconds. + Weight::from_parts(17_589_000, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 906_988 + .saturating_add(Weight::from_parts(32_054_748, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) + .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) - .saturating_add(Weight::from_parts(0, 2520).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs index 5e7f67bea35..c4a71ec894a 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_collective` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_collective`. pub struct WeightInfo(PhantomData); @@ -61,20 +62,20 @@ impl pallet_collective::WeightInfo for WeightInfo { fn set_members(m: u32, _n: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + m * (3232 ±0) + p * (3190 ±0)` - // Estimated: `18748 + m * (7799 ±23) + p * (10110 ±23)` - // Minimum execution time: 16_280_000 picoseconds. - Weight::from_parts(16_431_000, 0) - .saturating_add(Weight::from_parts(0, 18748)) - // Standard Error: 67_432 - .saturating_add(Weight::from_parts(5_382_109, 0).saturating_mul(m.into())) - // Standard Error: 67_432 - .saturating_add(Weight::from_parts(8_022_628, 0).saturating_mul(p.into())) + // Estimated: `15691 + m * (1967 ±23) + p * (4332 ±23)` + // Minimum execution time: 16_795_000 picoseconds. + Weight::from_parts(16_942_000, 0) + .saturating_add(Weight::from_parts(0, 15691)) + // Standard Error: 70_459 + .saturating_add(Weight::from_parts(5_607_397, 0).saturating_mul(m.into())) + // Standard Error: 70_459 + .saturating_add(Weight::from_parts(8_290_115, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) - .saturating_add(Weight::from_parts(0, 7799).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 10110).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 1967).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 4332).saturating_mul(p.into())) } /// Storage: AllianceMotion Members (r:1 w:0) /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) @@ -84,13 +85,13 @@ impl pallet_collective::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32 + m * (32 ±0)` // Estimated: `1518 + m * (32 ±0)` - // Minimum execution time: 15_340_000 picoseconds. - Weight::from_parts(14_971_140, 0) + // Minimum execution time: 15_803_000 picoseconds. + Weight::from_parts(15_071_031, 0) .saturating_add(Weight::from_parts(0, 1518)) - // Standard Error: 24 - .saturating_add(Weight::from_parts(1_237, 0).saturating_mul(b.into())) - // Standard Error: 252 - .saturating_add(Weight::from_parts(13_257, 0).saturating_mul(m.into())) + // Standard Error: 21 + .saturating_add(Weight::from_parts(1_253, 0).saturating_mul(b.into())) + // Standard Error: 219 + .saturating_add(Weight::from_parts(13_241, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) } @@ -103,16 +104,16 @@ impl pallet_collective::WeightInfo for WeightInfo { fn propose_execute(b: u32, m: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `32 + m * (32 ±0)` - // Estimated: `5016 + m * (64 ±0)` - // Minimum execution time: 18_083_000 picoseconds. - Weight::from_parts(17_322_823, 0) - .saturating_add(Weight::from_parts(0, 5016)) - // Standard Error: 26 - .saturating_add(Weight::from_parts(1_248, 0).saturating_mul(b.into())) - // Standard Error: 272 - .saturating_add(Weight::from_parts(22_423, 0).saturating_mul(m.into())) + // Estimated: `3498 + m * (32 ±0)` + // Minimum execution time: 18_645_000 picoseconds. + Weight::from_parts(17_717_343, 0) + .saturating_add(Weight::from_parts(0, 3498)) + // Standard Error: 21 + .saturating_add(Weight::from_parts(1_471, 0).saturating_mul(b.into())) + // Standard Error: 218 + .saturating_add(Weight::from_parts(22_238, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) } /// Storage: AllianceMotion Members (r:1 w:0) /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) @@ -130,20 +131,20 @@ impl pallet_collective::WeightInfo for WeightInfo { fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `322 + m * (32 ±0) + p * (36 ±0)` - // Estimated: `9165 + m * (165 ±0) + p * (180 ±0)` - // Minimum execution time: 24_019_000 picoseconds. - Weight::from_parts(26_316_662, 0) - .saturating_add(Weight::from_parts(0, 9165)) - // Standard Error: 77 - .saturating_add(Weight::from_parts(2_166, 0).saturating_mul(b.into())) - // Standard Error: 810 - .saturating_add(Weight::from_parts(20_438, 0).saturating_mul(m.into())) - // Standard Error: 799 - .saturating_add(Weight::from_parts(122_504, 0).saturating_mul(p.into())) + // Estimated: `3714 + m * (33 ±0) + p * (36 ±0)` + // Minimum execution time: 24_537_000 picoseconds. + Weight::from_parts(26_471_602, 0) + .saturating_add(Weight::from_parts(0, 3714)) + // Standard Error: 79 + .saturating_add(Weight::from_parts(2_604, 0).saturating_mul(b.into())) + // Standard Error: 829 + .saturating_add(Weight::from_parts(20_480, 0).saturating_mul(m.into())) + // Standard Error: 818 + .saturating_add(Weight::from_parts(133_262, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(Weight::from_parts(0, 165).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 180).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 33).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } /// Storage: AllianceMotion Members (r:1 w:0) /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) @@ -153,15 +154,15 @@ impl pallet_collective::WeightInfo for WeightInfo { fn vote(m: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `771 + m * (64 ±0)` - // Estimated: `6490 + m * (128 ±0)` - // Minimum execution time: 22_516_000 picoseconds. - Weight::from_parts(23_803_657, 0) - .saturating_add(Weight::from_parts(0, 6490)) - // Standard Error: 1_968 - .saturating_add(Weight::from_parts(38_988, 0).saturating_mul(m.into())) + // Estimated: `4235 + m * (64 ±0)` + // Minimum execution time: 23_195_000 picoseconds. + Weight::from_parts(23_635_543, 0) + .saturating_add(Weight::from_parts(0, 4235)) + // Standard Error: 399 + .saturating_add(Weight::from_parts(45_089, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 128).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } /// Storage: AllianceMotion Voting (r:1 w:1) /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) @@ -176,18 +177,18 @@ impl pallet_collective::WeightInfo for WeightInfo { fn close_early_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `360 + m * (64 ±0) + p * (36 ±0)` - // Estimated: `7795 + m * (260 ±0) + p * (144 ±0)` - // Minimum execution time: 26_841_000 picoseconds. - Weight::from_parts(28_166_692, 0) - .saturating_add(Weight::from_parts(0, 7795)) - // Standard Error: 657 - .saturating_add(Weight::from_parts(20_102, 0).saturating_mul(m.into())) - // Standard Error: 641 - .saturating_add(Weight::from_parts(113_841, 0).saturating_mul(p.into())) + // Estimated: `3805 + m * (65 ±0) + p * (36 ±0)` + // Minimum execution time: 27_925_000 picoseconds. + Weight::from_parts(29_021_838, 0) + .saturating_add(Weight::from_parts(0, 3805)) + // Standard Error: 582 + .saturating_add(Weight::from_parts(19_351, 0).saturating_mul(m.into())) + // Standard Error: 567 + .saturating_add(Weight::from_parts(120_374, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 260).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 144).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 65).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } /// Storage: AllianceMotion Voting (r:1 w:1) /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) @@ -203,21 +204,21 @@ impl pallet_collective::WeightInfo for WeightInfo { fn close_early_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `662 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` - // Estimated: `11956 + b * (4 ±0) + m * (264 ±0) + p * (160 ±0)` - // Minimum execution time: 38_310_000 picoseconds. - Weight::from_parts(40_050_347, 0) - .saturating_add(Weight::from_parts(0, 11956)) - // Standard Error: 84 - .saturating_add(Weight::from_parts(1_379, 0).saturating_mul(b.into())) - // Standard Error: 892 - .saturating_add(Weight::from_parts(13_153, 0).saturating_mul(m.into())) - // Standard Error: 870 - .saturating_add(Weight::from_parts(132_394, 0).saturating_mul(p.into())) + // Estimated: `3979 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` + // Minimum execution time: 39_972_000 picoseconds. + Weight::from_parts(40_831_166, 0) + .saturating_add(Weight::from_parts(0, 3979)) + // Standard Error: 78 + .saturating_add(Weight::from_parts(1_568, 0).saturating_mul(b.into())) + // Standard Error: 825 + .saturating_add(Weight::from_parts(16_454, 0).saturating_mul(m.into())) + // Standard Error: 804 + .saturating_add(Weight::from_parts(132_248, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 4).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 264).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 160).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 66).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) } /// Storage: AllianceMotion Voting (r:1 w:1) /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) @@ -234,18 +235,18 @@ impl pallet_collective::WeightInfo for WeightInfo { fn close_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `458 + m * (48 ±0) + p * (36 ±0)` - // Estimated: `10085 + m * (245 ±0) + p * (180 ±0)` - // Minimum execution time: 29_071_000 picoseconds. - Weight::from_parts(30_524_865, 0) - .saturating_add(Weight::from_parts(0, 10085)) - // Standard Error: 658 - .saturating_add(Weight::from_parts(18_125, 0).saturating_mul(m.into())) - // Standard Error: 641 - .saturating_add(Weight::from_parts(115_123, 0).saturating_mul(p.into())) + // Estimated: `3898 + m * (49 ±0) + p * (36 ±0)` + // Minimum execution time: 29_766_000 picoseconds. + Weight::from_parts(31_292_444, 0) + .saturating_add(Weight::from_parts(0, 3898)) + // Standard Error: 691 + .saturating_add(Weight::from_parts(19_285, 0).saturating_mul(m.into())) + // Standard Error: 674 + .saturating_add(Weight::from_parts(123_923, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 245).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 180).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 49).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } /// Storage: AllianceMotion Voting (r:1 w:1) /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) @@ -263,21 +264,21 @@ impl pallet_collective::WeightInfo for WeightInfo { fn close_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `682 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` - // Estimated: `14055 + b * (5 ±0) + m * (330 ±0) + p * (200 ±0)` - // Minimum execution time: 40_932_000 picoseconds. - Weight::from_parts(42_564_375, 0) - .saturating_add(Weight::from_parts(0, 14055)) - // Standard Error: 91 - .saturating_add(Weight::from_parts(1_354, 0).saturating_mul(b.into())) - // Standard Error: 962 - .saturating_add(Weight::from_parts(14_498, 0).saturating_mul(m.into())) - // Standard Error: 937 - .saturating_add(Weight::from_parts(133_672, 0).saturating_mul(p.into())) + // Estimated: `3999 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` + // Minimum execution time: 42_588_000 picoseconds. + Weight::from_parts(43_162_079, 0) + .saturating_add(Weight::from_parts(0, 3999)) + // Standard Error: 86 + .saturating_add(Weight::from_parts(1_451, 0).saturating_mul(b.into())) + // Standard Error: 914 + .saturating_add(Weight::from_parts(18_855, 0).saturating_mul(m.into())) + // Standard Error: 891 + .saturating_add(Weight::from_parts(136_799, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 5).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 330).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 200).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 66).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) } /// Storage: AllianceMotion Proposals (r:1 w:1) /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) @@ -289,14 +290,14 @@ impl pallet_collective::WeightInfo for WeightInfo { fn disapprove_proposal(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `189 + p * (32 ±0)` - // Estimated: `2052 + p * (96 ±0)` - // Minimum execution time: 14_577_000 picoseconds. - Weight::from_parts(17_078_204, 0) - .saturating_add(Weight::from_parts(0, 2052)) - // Standard Error: 1_851 - .saturating_add(Weight::from_parts(96_610, 0).saturating_mul(p.into())) + // Estimated: `1674 + p * (32 ±0)` + // Minimum execution time: 14_465_000 picoseconds. + Weight::from_parts(16_635_197, 0) + .saturating_add(Weight::from_parts(0, 1674)) + // Standard Error: 1_082 + .saturating_add(Weight::from_parts(117_250, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 96).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(0, 32).saturating_mul(p.into())) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs index 46e8b35ad17..92715ad62a9 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_multisig`. pub struct WeightInfo(PhantomData); @@ -52,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_874_000 picoseconds. - Weight::from_parts(12_338_482, 0) + // Minimum execution time: 12_207_000 picoseconds. + Weight::from_parts(12_624_117, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1 - .saturating_add(Weight::from_parts(501, 0).saturating_mul(z.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(596, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -64,15 +65,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `262 + s * (2 ±0)` + // Measured: `295 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 37_113_000 picoseconds. - Weight::from_parts(31_650_752, 0) + // Minimum execution time: 41_674_000 picoseconds. + Weight::from_parts(35_138_837, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 685 - .saturating_add(Weight::from_parts(60_611, 0).saturating_mul(s.into())) - // Standard Error: 6 - .saturating_add(Weight::from_parts(1_223, 0).saturating_mul(z.into())) + // Standard Error: 426 + .saturating_add(Weight::from_parts(70_175, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_321, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,15 +83,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_approve(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `282` + // Measured: `315` // Estimated: `6811` - // Minimum execution time: 27_063_000 picoseconds. - Weight::from_parts(21_745_286, 0) + // Minimum execution time: 28_196_000 picoseconds. + Weight::from_parts(22_060_677, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 540 - .saturating_add(Weight::from_parts(59_750, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_199, 0).saturating_mul(z.into())) + // Standard Error: 378 + .saturating_add(Weight::from_parts(71_806, 0).saturating_mul(s.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_256, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,15 +103,15 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `385 + s * (33 ±0)` - // Estimated: `10404` - // Minimum execution time: 41_635_000 picoseconds. - Weight::from_parts(35_205_750, 0) - .saturating_add(Weight::from_parts(0, 10404)) - // Standard Error: 614 - .saturating_add(Weight::from_parts(77_394, 0).saturating_mul(s.into())) - // Standard Error: 6 - .saturating_add(Weight::from_parts(1_194, 0).saturating_mul(z.into())) + // Measured: `418 + s * (33 ±0)` + // Estimated: `6811` + // Minimum execution time: 47_099_000 picoseconds. + Weight::from_parts(38_806_484, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 540 + .saturating_add(Weight::from_parts(88_311, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_354, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -119,13 +120,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `263 + s * (2 ±0)` + // Measured: `296 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 28_179_000 picoseconds. - Weight::from_parts(29_964_208, 0) + // Minimum execution time: 31_899_000 picoseconds. + Weight::from_parts(33_492_356, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 692 - .saturating_add(Weight::from_parts(67_380, 0).saturating_mul(s.into())) + // Standard Error: 684 + .saturating_add(Weight::from_parts(79_819, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -134,13 +135,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `282` + // Measured: `315` // Estimated: `6811` - // Minimum execution time: 18_604_000 picoseconds. - Weight::from_parts(20_059_859, 0) + // Minimum execution time: 19_002_000 picoseconds. + Weight::from_parts(20_275_891, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_469 - .saturating_add(Weight::from_parts(65_134, 0).saturating_mul(s.into())) + // Standard Error: 482 + .saturating_add(Weight::from_parts(68_692, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -149,13 +150,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `s` is `[2, 100]`. fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `454 + s * (1 ±0)` + // Measured: `487 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 28_438_000 picoseconds. - Weight::from_parts(30_815_747, 0) + // Minimum execution time: 32_841_000 picoseconds. + Weight::from_parts(34_782_386, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 774 - .saturating_add(Weight::from_parts(67_365, 0).saturating_mul(s.into())) + // Standard Error: 656 + .saturating_add(Weight::from_parts(73_853, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs index 706568a5ff6..7c8fab57ede 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs @@ -1,32 +1,49 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . //! Autogenerated weights for `pallet_preimage` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-06, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `cob`, CPU: `` -//! EXECUTION: Some(Native), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: -// ./target/debug/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet // --chain=collectives-polkadot-dev -// --steps=2 -// --repeat=1 +// --execution=wasm +// --wasm-execution=compiled // --pallet=pallet_preimage // --extrinsic=* -// --execution=native -// --wasm-execution=compiled -// --heap-pages=4096 -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_preimage`. pub struct WeightInfo(PhantomData); @@ -36,13 +53,15 @@ impl pallet_preimage::WeightInfo for WeightInfo { /// Storage: Preimage PreimageFor (r:0 w:1) /// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: MaxEncodedLen) /// The range of component `s` is `[0, 4194304]`. - fn note_preimage(_s: u32, ) -> Weight { + fn note_preimage(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `175` + // Measured: `143` // Estimated: `3556` - // Minimum execution time: 316_000_000 picoseconds. - Weight::from_parts(152_722_000_000, 0) + // Minimum execution time: 31_179_000 picoseconds. + Weight::from_parts(31_555_000, 0) .saturating_add(Weight::from_parts(0, 3556)) + // Standard Error: 4 + .saturating_add(Weight::from_parts(2_116, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -51,13 +70,15 @@ impl pallet_preimage::WeightInfo for WeightInfo { /// Storage: Preimage PreimageFor (r:0 w:1) /// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: MaxEncodedLen) /// The range of component `s` is `[0, 4194304]`. - fn note_requested_preimage(_s: u32, ) -> Weight { + fn note_requested_preimage(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3556` - // Minimum execution time: 147_000_000 picoseconds. - Weight::from_parts(152_365_000_000, 0) + // Minimum execution time: 16_210_000 picoseconds. + Weight::from_parts(16_377_000, 0) .saturating_add(Weight::from_parts(0, 3556)) + // Standard Error: 3 + .saturating_add(Weight::from_parts(2_089, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -66,13 +87,15 @@ impl pallet_preimage::WeightInfo for WeightInfo { /// Storage: Preimage PreimageFor (r:0 w:1) /// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: MaxEncodedLen) /// The range of component `s` is `[0, 4194304]`. - fn note_no_deposit_preimage(_s: u32, ) -> Weight { + fn note_no_deposit_preimage(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3556` - // Minimum execution time: 145_000_000 picoseconds. - Weight::from_parts(152_298_000_000, 0) + // Minimum execution time: 15_441_000 picoseconds. + Weight::from_parts(15_607_000, 0) .saturating_add(Weight::from_parts(0, 3556)) + // Standard Error: 1 + .saturating_add(Weight::from_parts(2_072, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -82,10 +105,10 @@ impl pallet_preimage::WeightInfo for WeightInfo { /// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: MaxEncodedLen) fn unnote_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `353` + // Measured: `289` // Estimated: `3556` - // Minimum execution time: 333_000_000 picoseconds. - Weight::from_parts(333_000_000, 0) + // Minimum execution time: 38_302_000 picoseconds. + Weight::from_parts(39_611_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -98,8 +121,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `144` // Estimated: `3556` - // Minimum execution time: 202_000_000 picoseconds. - Weight::from_parts(202_000_000, 0) + // Minimum execution time: 21_163_000 picoseconds. + Weight::from_parts(22_013_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -108,10 +131,10 @@ impl pallet_preimage::WeightInfo for WeightInfo { /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) fn request_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `220` + // Measured: `188` // Estimated: `3556` - // Minimum execution time: 189_000_000 picoseconds. - Weight::from_parts(189_000_000, 0) + // Minimum execution time: 20_543_000 picoseconds. + Weight::from_parts(21_576_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -122,8 +145,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `144` // Estimated: `3556` - // Minimum execution time: 137_000_000 picoseconds. - Weight::from_parts(137_000_000, 0) + // Minimum execution time: 11_317_000 picoseconds. + Weight::from_parts(11_834_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -134,8 +157,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3556` - // Minimum execution time: 140_000_000 picoseconds. - Weight::from_parts(140_000_000, 0) + // Minimum execution time: 13_495_000 picoseconds. + Weight::from_parts(13_897_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -146,8 +169,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3556` - // Minimum execution time: 109_000_000 picoseconds. - Weight::from_parts(109_000_000, 0) + // Minimum execution time: 8_208_000 picoseconds. + Weight::from_parts(8_472_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -160,8 +183,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `144` // Estimated: `3556` - // Minimum execution time: 208_000_000 picoseconds. - Weight::from_parts(208_000_000, 0) + // Minimum execution time: 19_788_000 picoseconds. + Weight::from_parts(20_692_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -172,8 +195,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3556` - // Minimum execution time: 117_000_000 picoseconds. - Weight::from_parts(117_000_000, 0) + // Minimum execution time: 7_792_000 picoseconds. + Weight::from_parts(8_113_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -184,8 +207,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3556` - // Minimum execution time: 107_000_000 picoseconds. - Weight::from_parts(107_000_000, 0) + // Minimum execution time: 7_869_000 picoseconds. + Weight::from_parts(8_164_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs index 5c168e89d47..c5cb4f2e713 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_proxy`. pub struct WeightInfo(PhantomData); @@ -54,11 +55,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 16_370_000 picoseconds. - Weight::from_parts(17_099_234, 0) + // Minimum execution time: 16_925_000 picoseconds. + Weight::from_parts(17_434_407, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_021 - .saturating_add(Weight::from_parts(27_747, 0).saturating_mul(p.into())) + // Standard Error: 725 + .saturating_add(Weight::from_parts(35_067, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -72,14 +73,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn proxy_announced(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `454 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `13997` - // Minimum execution time: 34_655_000 picoseconds. - Weight::from_parts(35_088_843, 0) - .saturating_add(Weight::from_parts(0, 13997)) - // Standard Error: 1_939 - .saturating_add(Weight::from_parts(146_356, 0).saturating_mul(a.into())) - // Standard Error: 2_004 - .saturating_add(Weight::from_parts(38_363, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 38_996_000 picoseconds. + Weight::from_parts(38_697_326, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_269 + .saturating_add(Weight::from_parts(143_716, 0).saturating_mul(a.into())) + // Standard Error: 1_312 + .saturating_add(Weight::from_parts(36_502, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -92,14 +93,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn remove_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` - // Estimated: `9291` - // Minimum execution time: 21_893_000 picoseconds. - Weight::from_parts(22_495_271, 0) - .saturating_add(Weight::from_parts(0, 9291)) - // Standard Error: 1_612 - .saturating_add(Weight::from_parts(149_480, 0).saturating_mul(a.into())) - // Standard Error: 1_665 - .saturating_add(Weight::from_parts(20_216, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 25_647_000 picoseconds. + Weight::from_parts(26_204_494, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_128 + .saturating_add(Weight::from_parts(137_913, 0).saturating_mul(a.into())) + // Standard Error: 1_166 + .saturating_add(Weight::from_parts(7_581, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -112,14 +113,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn reject_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` - // Estimated: `9291` - // Minimum execution time: 22_129_000 picoseconds. - Weight::from_parts(22_971_862, 0) - .saturating_add(Weight::from_parts(0, 9291)) - // Standard Error: 1_324 - .saturating_add(Weight::from_parts(139_140, 0).saturating_mul(a.into())) - // Standard Error: 1_368 - .saturating_add(Weight::from_parts(9_720, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 25_508_000 picoseconds. + Weight::from_parts(26_110_626, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_155 + .saturating_add(Weight::from_parts(139_682, 0).saturating_mul(a.into())) + // Standard Error: 1_193 + .saturating_add(Weight::from_parts(8_390, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -134,14 +135,14 @@ impl pallet_proxy::WeightInfo for WeightInfo { fn announce(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `386 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `13997` - // Minimum execution time: 30_496_000 picoseconds. - Weight::from_parts(31_777_493, 0) - .saturating_add(Weight::from_parts(0, 13997)) - // Standard Error: 2_153 - .saturating_add(Weight::from_parts(139_635, 0).saturating_mul(a.into())) - // Standard Error: 2_224 - .saturating_add(Weight::from_parts(36_392, 0).saturating_mul(p.into())) + // Estimated: `5698` + // Minimum execution time: 35_316_000 picoseconds. + Weight::from_parts(34_940_391, 0) + .saturating_add(Weight::from_parts(0, 5698)) + // Standard Error: 1_038 + .saturating_add(Weight::from_parts(143_848, 0).saturating_mul(a.into())) + // Standard Error: 1_072 + .saturating_add(Weight::from_parts(37_947, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -152,11 +153,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_465_000 picoseconds. - Weight::from_parts(24_342_756, 0) + // Minimum execution time: 26_890_000 picoseconds. + Weight::from_parts(27_454_486, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_559 - .saturating_add(Weight::from_parts(50_636, 0).saturating_mul(p.into())) + // Standard Error: 1_069 + .saturating_add(Weight::from_parts(50_270, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -167,11 +168,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_620_000 picoseconds. - Weight::from_parts(24_514_511, 0) + // Minimum execution time: 26_634_000 picoseconds. + Weight::from_parts(27_382_449, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_749 - .saturating_add(Weight::from_parts(47_870, 0).saturating_mul(p.into())) + // Standard Error: 1_573 + .saturating_add(Weight::from_parts(65_622, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -182,24 +183,26 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 18_506_000 picoseconds. - Weight::from_parts(19_463_396, 0) + // Minimum execution time: 23_582_000 picoseconds. + Weight::from_parts(23_977_985, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_241 - .saturating_add(Weight::from_parts(25_525, 0).saturating_mul(p.into())) + // Standard Error: 2_713 + .saturating_add(Weight::from_parts(44_551, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: Proxy Proxies (r:1 w:1) /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) /// The range of component `p` is `[1, 31]`. - fn create_pure(_p: u32, ) -> Weight { + fn create_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `139` // Estimated: `4706` - // Minimum execution time: 25_291_000 picoseconds. - Weight::from_parts(26_456_465, 0) + // Minimum execution time: 28_564_000 picoseconds. + Weight::from_parts(29_496_680, 0) .saturating_add(Weight::from_parts(0, 4706)) + // Standard Error: 5_045 + .saturating_add(Weight::from_parts(29_343, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -210,11 +213,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `164 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 19_931_000 picoseconds. - Weight::from_parts(20_842_319, 0) + // Minimum execution time: 24_932_000 picoseconds. + Weight::from_parts(25_952_091, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_467 - .saturating_add(Weight::from_parts(26_062, 0).saturating_mul(p.into())) + // Standard Error: 5_615 + .saturating_add(Weight::from_parts(22_027, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs index 4be551d4bd5..aed4994c49b 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs @@ -1,32 +1,49 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . //! Autogenerated weights for `pallet_ranked_collective` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-06, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `cob`, CPU: `` -//! EXECUTION: Some(Native), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: -// ./target/debug/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet // --chain=collectives-polkadot-dev -// --steps=2 -// --repeat=1 +// --execution=wasm +// --wasm-execution=compiled // --pallet=pallet_ranked_collective // --extrinsic=* -// --execution=native -// --wasm-execution=compiled -// --heap-pages=4096 -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_ranked_collective`. pub struct WeightInfo(PhantomData); @@ -42,10 +59,10 @@ impl pallet_ranked_collective::WeightInfo for WeightInf fn add_member() -> Weight { // Proof Size summary in bytes: // Measured: `109` - // Estimated: `6986` - // Minimum execution time: 129_000_000 picoseconds. - Weight::from_parts(129_000_000, 0) - .saturating_add(Weight::from_parts(0, 6986)) + // Estimated: `3507` + // Minimum execution time: 16_966_000 picoseconds. + Weight::from_parts(17_355_000, 0) + .saturating_add(Weight::from_parts(0, 3507)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -58,15 +75,20 @@ impl pallet_ranked_collective::WeightInfo for WeightInf /// Storage: FellowshipCollective IndexToId (r:11 w:11) /// Proof: FellowshipCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) /// The range of component `r` is `[0, 10]`. - fn remove_member(_r: u32, ) -> Weight { + fn remove_member(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `575 + r * (281 ±0)` - // Estimated: `89494` - // Minimum execution time: 325_000_000 picoseconds. - Weight::from_parts(1_695_000_000, 0) - .saturating_add(Weight::from_parts(0, 89494)) - .saturating_add(T::DbWeight::get().reads(34)) - .saturating_add(T::DbWeight::get().writes(34)) + // Measured: `584 + r * (281 ±0)` + // Estimated: `3519 + r * (2529 ±0)` + // Minimum execution time: 28_160_000 picoseconds. + Weight::from_parts(30_609_588, 0) + .saturating_add(Weight::from_parts(0, 3519)) + // Standard Error: 25_389 + .saturating_add(Weight::from_parts(11_728_844, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(r.into()))) + .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 2529).saturating_mul(r.into())) } /// Storage: FellowshipCollective Members (r:1 w:1) /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) @@ -77,13 +99,15 @@ impl pallet_ranked_collective::WeightInfo for WeightInf /// Storage: FellowshipCollective IdToIndex (r:0 w:1) /// Proof: FellowshipCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) /// The range of component `r` is `[0, 10]`. - fn promote_member(_r: u32, ) -> Weight { + fn promote_member(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `277 + r * (17 ±0)` - // Estimated: `6986` - // Minimum execution time: 206_000_000 picoseconds. - Weight::from_parts(450_000_000, 0) - .saturating_add(Weight::from_parts(0, 6986)) + // Measured: `281 + r * (17 ±0)` + // Estimated: `3507` + // Minimum execution time: 20_058_000 picoseconds. + Weight::from_parts(20_751_832, 0) + .saturating_add(Weight::from_parts(0, 3507)) + // Standard Error: 3_745 + .saturating_add(Weight::from_parts(359_667, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -96,13 +120,15 @@ impl pallet_ranked_collective::WeightInfo for WeightInf /// Storage: FellowshipCollective IndexToId (r:1 w:1) /// Proof: FellowshipCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) /// The range of component `r` is `[0, 10]`. - fn demote_member(_r: u32, ) -> Weight { + fn demote_member(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `575 + r * (71 ±0)` - // Estimated: `14024` - // Minimum execution time: 309_000_000 picoseconds. - Weight::from_parts(449_000_000, 0) - .saturating_add(Weight::from_parts(0, 14024)) + // Measured: `599 + r * (72 ±0)` + // Estimated: `3519` + // Minimum execution time: 27_806_000 picoseconds. + Weight::from_parts(30_225_170, 0) + .saturating_add(Weight::from_parts(0, 3519)) + // Standard Error: 16_870 + .saturating_add(Weight::from_parts(608_652, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -116,11 +142,11 @@ impl pallet_ranked_collective::WeightInfo for WeightInf /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn vote() -> Weight { // Proof Size summary in bytes: - // Measured: `665` - // Estimated: `328970` - // Minimum execution time: 536_000_000 picoseconds. - Weight::from_parts(536_000_000, 0) - .saturating_add(Weight::from_parts(0, 328970)) + // Measured: `633` + // Estimated: `317568` + // Minimum execution time: 48_000_000 picoseconds. + Weight::from_parts(48_520_000, 0) + .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -131,14 +157,18 @@ impl pallet_ranked_collective::WeightInfo for WeightInf /// Storage: FellowshipCollective Voting (r:100 w:100) /// Proof: FellowshipCollective Voting (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) /// The range of component `n` is `[0, 100]`. - fn cleanup_poll(_n: u32, ) -> Weight { + fn cleanup_poll(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `308 + n * (52 ±0)` - // Estimated: `262934` - // Minimum execution time: 246_000_000 picoseconds. - Weight::from_parts(1_572_000_000, 0) - .saturating_add(Weight::from_parts(0, 262934)) - .saturating_add(T::DbWeight::get().reads(102)) - .saturating_add(T::DbWeight::get().writes(100)) + // Measured: `467 + n * (50 ±0)` + // Estimated: `4365 + n * (2540 ±0)` + // Minimum execution time: 15_426_000 picoseconds. + Weight::from_parts(19_278_701, 0) + .saturating_add(Weight::from_parts(0, 4365)) + // Standard Error: 1_274 + .saturating_add(Weight::from_parts(916_410, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2540).saturating_mul(n.into())) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs index 471aa55a767..b70c3017a38 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs @@ -1,32 +1,49 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . //! Autogenerated weights for `pallet_referenda` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-06, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `cob`, CPU: `` -//! EXECUTION: Some(Native), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: -// ./target/debug/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet // --chain=collectives-polkadot-dev -// --steps=2 -// --repeat=1 +// --execution=wasm +// --wasm-execution=compiled // --pallet=pallet_referenda // --extrinsic=* -// --execution=native -// --wasm-execution=compiled -// --heap-pages=4096 -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_referenda`. pub struct WeightInfo(PhantomData); @@ -42,10 +59,10 @@ impl pallet_referenda::WeightInfo for WeightInfo { fn submit() -> Weight { // Proof Size summary in bytes: // Measured: `322` - // Estimated: `164275` - // Minimum execution time: 283_000_000 picoseconds. - Weight::from_parts(283_000_000, 0) - .saturating_add(Weight::from_parts(0, 164275)) + // Estimated: `159279` + // Minimum execution time: 29_980_000 picoseconds. + Weight::from_parts(30_415_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -55,11 +72,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn place_decision_deposit_preparing() -> Weight { // Proof Size summary in bytes: - // Measured: `430` - // Estimated: `321933` - // Minimum execution time: 472_000_000 picoseconds. - Weight::from_parts(472_000_000, 0) - .saturating_add(Weight::from_parts(0, 321933)) + // Measured: `366` + // Estimated: `317568` + // Minimum execution time: 54_782_000 picoseconds. + Weight::from_parts(55_250_000, 0) + .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -71,11 +88,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda TrackQueue (max_values: None, max_size: Some(812), added: 3287, mode: MaxEncodedLen) fn place_decision_deposit_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `1941` - // Estimated: `12121` - // Minimum execution time: 547_000_000 picoseconds. - Weight::from_parts(547_000_000, 0) - .saturating_add(Weight::from_parts(0, 12121)) + // Measured: `1845` + // Estimated: `4365` + // Minimum execution time: 68_580_000 picoseconds. + Weight::from_parts(69_745_000, 0) + .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -87,11 +104,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda TrackQueue (max_values: None, max_size: Some(812), added: 3287, mode: MaxEncodedLen) fn place_decision_deposit_not_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `1982` - // Estimated: `12121` - // Minimum execution time: 555_000_000 picoseconds. - Weight::from_parts(555_000_000, 0) - .saturating_add(Weight::from_parts(0, 12121)) + // Measured: `1886` + // Estimated: `4365` + // Minimum execution time: 66_900_000 picoseconds. + Weight::from_parts(69_144_000, 0) + .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -105,11 +122,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn place_decision_deposit_passing() -> Weight { // Proof Size summary in bytes: - // Measured: `833` - // Estimated: `328891` - // Minimum execution time: 871_000_000 picoseconds. - Weight::from_parts(871_000_000, 0) - .saturating_add(Weight::from_parts(0, 328891)) + // Measured: `769` + // Estimated: `317568` + // Minimum execution time: 125_600_000 picoseconds. + Weight::from_parts(129_568_000, 0) + .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -121,11 +138,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) fn place_decision_deposit_failing() -> Weight { // Proof Size summary in bytes: - // Measured: `643` - // Estimated: `11323` - // Minimum execution time: 460_000_000 picoseconds. - Weight::from_parts(460_000_000, 0) - .saturating_add(Weight::from_parts(0, 11323)) + // Measured: `579` + // Estimated: `4365` + // Minimum execution time: 47_058_000 picoseconds. + Weight::from_parts(47_629_000, 0) + .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -133,10 +150,10 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) fn refund_decision_deposit() -> Weight { // Proof Size summary in bytes: - // Measured: `381` + // Measured: `317` // Estimated: `4365` - // Minimum execution time: 281_000_000 picoseconds. - Weight::from_parts(281_000_000, 0) + // Minimum execution time: 32_565_000 picoseconds. + Weight::from_parts(32_857_000, 0) .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -145,10 +162,10 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) fn refund_submission_deposit() -> Weight { // Proof Size summary in bytes: - // Measured: `199` + // Measured: `167` // Estimated: `4365` - // Minimum execution time: 172_000_000 picoseconds. - Weight::from_parts(172_000_000, 0) + // Minimum execution time: 16_655_000 picoseconds. + Weight::from_parts(16_980_000, 0) .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -159,11 +176,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn cancel() -> Weight { // Proof Size summary in bytes: - // Measured: `343` - // Estimated: `321933` - // Minimum execution time: 334_000_000 picoseconds. - Weight::from_parts(334_000_000, 0) - .saturating_add(Weight::from_parts(0, 321933)) + // Measured: `311` + // Estimated: `317568` + // Minimum execution time: 39_979_000 picoseconds. + Weight::from_parts(40_199_000, 0) + .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -189,11 +206,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda MetadataOf (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) fn kill() -> Weight { // Proof Size summary in bytes: - // Measured: `581` - // Estimated: `342842` - // Minimum execution time: 1_580_000_000 picoseconds. - Weight::from_parts(1_580_000_000, 0) - .saturating_add(Weight::from_parts(0, 342842)) + // Measured: `517` + // Estimated: `317568` + // Minimum execution time: 158_717_000 picoseconds. + Weight::from_parts(159_336_000, 0) + .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(11)) .saturating_add(T::DbWeight::get().writes(6)) } @@ -204,10 +221,10 @@ impl pallet_referenda::WeightInfo for WeightInfo { fn one_fewer_deciding_queue_empty() -> Weight { // Proof Size summary in bytes: // Measured: `140` - // Estimated: `7756` - // Minimum execution time: 203_000_000 picoseconds. - Weight::from_parts(203_000_000, 0) - .saturating_add(Weight::from_parts(0, 7756)) + // Estimated: `4277` + // Minimum execution time: 11_107_000 picoseconds. + Weight::from_parts(11_302_000, 0) + .saturating_add(Weight::from_parts(0, 4277)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -221,11 +238,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn one_fewer_deciding_failing() -> Weight { // Proof Size summary in bytes: - // Measured: `3991` - // Estimated: `329689` - // Minimum execution time: 1_025_000_000 picoseconds. - Weight::from_parts(1_025_000_000, 0) - .saturating_add(Weight::from_parts(0, 329689)) + // Measured: `3896` + // Estimated: `317568` + // Minimum execution time: 237_949_000 picoseconds. + Weight::from_parts(240_956_000, 0) + .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -239,11 +256,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn one_fewer_deciding_passing() -> Weight { // Proof Size summary in bytes: - // Measured: `3991` - // Estimated: `329689` - // Minimum execution time: 1_076_000_000 picoseconds. - Weight::from_parts(1_076_000_000, 0) - .saturating_add(Weight::from_parts(0, 329689)) + // Measured: `3896` + // Estimated: `317568` + // Minimum execution time: 240_708_000 picoseconds. + Weight::from_parts(242_646_000, 0) + .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -255,11 +272,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_requeued_insertion() -> Weight { // Proof Size summary in bytes: - // Measured: `3589` - // Estimated: `167921` - // Minimum execution time: 621_000_000 picoseconds. - Weight::from_parts(621_000_000, 0) - .saturating_add(Weight::from_parts(0, 167921)) + // Measured: `3494` + // Estimated: `159279` + // Minimum execution time: 136_435_000 picoseconds. + Weight::from_parts(138_673_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -271,11 +288,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_requeued_slide() -> Weight { // Proof Size summary in bytes: - // Measured: `3542` - // Estimated: `167921` - // Minimum execution time: 643_000_000 picoseconds. - Weight::from_parts(643_000_000, 0) - .saturating_add(Weight::from_parts(0, 167921)) + // Measured: `3447` + // Estimated: `159279` + // Minimum execution time: 136_686_000 picoseconds. + Weight::from_parts(137_969_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -289,11 +306,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3528` - // Estimated: `171400` - // Minimum execution time: 704_000_000 picoseconds. - Weight::from_parts(704_000_000, 0) - .saturating_add(Weight::from_parts(0, 171400)) + // Measured: `3433` + // Estimated: `159279` + // Minimum execution time: 139_598_000 picoseconds. + Weight::from_parts(140_713_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -307,11 +324,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_not_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3583` - // Estimated: `171400` - // Minimum execution time: 695_000_000 picoseconds. - Weight::from_parts(695_000_000, 0) - .saturating_add(Weight::from_parts(0, 171400)) + // Measured: `3488` + // Estimated: `159279` + // Minimum execution time: 139_149_000 picoseconds. + Weight::from_parts(140_033_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -321,11 +338,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_no_deposit() -> Weight { // Proof Size summary in bytes: - // Measured: `295` - // Estimated: `163644` - // Minimum execution time: 259_000_000 picoseconds. - Weight::from_parts(259_000_000, 0) - .saturating_add(Weight::from_parts(0, 163644)) + // Measured: `263` + // Estimated: `159279` + // Minimum execution time: 27_153_000 picoseconds. + Weight::from_parts(27_344_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -335,11 +352,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_preparing() -> Weight { // Proof Size summary in bytes: - // Measured: `343` - // Estimated: `163644` - // Minimum execution time: 260_000_000 picoseconds. - Weight::from_parts(260_000_000, 0) - .saturating_add(Weight::from_parts(0, 163644)) + // Measured: `311` + // Estimated: `159279` + // Minimum execution time: 27_327_000 picoseconds. + Weight::from_parts(27_886_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -347,10 +364,10 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) fn nudge_referendum_timed_out() -> Weight { // Proof Size summary in bytes: - // Measured: `240` + // Measured: `208` // Estimated: `4365` - // Minimum execution time: 184_000_000 picoseconds. - Weight::from_parts(184_000_000, 0) + // Minimum execution time: 19_314_000 picoseconds. + Weight::from_parts(19_667_000, 0) .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -365,11 +382,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_begin_deciding_failing() -> Weight { // Proof Size summary in bytes: - // Measured: `611` - // Estimated: `170602` - // Minimum execution time: 445_000_000 picoseconds. - Weight::from_parts(445_000_000, 0) - .saturating_add(Weight::from_parts(0, 170602)) + // Measured: `579` + // Estimated: `159279` + // Minimum execution time: 39_377_000 picoseconds. + Weight::from_parts(39_742_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -383,11 +400,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_begin_deciding_passing() -> Weight { // Proof Size summary in bytes: - // Measured: `746` - // Estimated: `170602` - // Minimum execution time: 625_000_000 picoseconds. - Weight::from_parts(625_000_000, 0) - .saturating_add(Weight::from_parts(0, 170602)) + // Measured: `714` + // Estimated: `159279` + // Minimum execution time: 66_532_000 picoseconds. + Weight::from_parts(68_794_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -399,11 +416,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_begin_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `799` - // Estimated: `167123` - // Minimum execution time: 623_000_000 picoseconds. - Weight::from_parts(623_000_000, 0) - .saturating_add(Weight::from_parts(0, 167123)) + // Measured: `767` + // Estimated: `159279` + // Minimum execution time: 87_398_000 picoseconds. + Weight::from_parts(90_998_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -415,11 +432,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_end_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `782` - // Estimated: `167123` - // Minimum execution time: 580_000_000 picoseconds. - Weight::from_parts(580_000_000, 0) - .saturating_add(Weight::from_parts(0, 167123)) + // Measured: `750` + // Estimated: `159279` + // Minimum execution time: 87_401_000 picoseconds. + Weight::from_parts(90_985_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -431,11 +448,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_continue_not_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `799` - // Estimated: `167123` - // Minimum execution time: 595_000_000 picoseconds. - Weight::from_parts(595_000_000, 0) - .saturating_add(Weight::from_parts(0, 167123)) + // Measured: `767` + // Estimated: `159279` + // Minimum execution time: 82_591_000 picoseconds. + Weight::from_parts(86_670_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -447,11 +464,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_continue_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `803` - // Estimated: `167123` - // Minimum execution time: 556_000_000 picoseconds. - Weight::from_parts(556_000_000, 0) - .saturating_add(Weight::from_parts(0, 167123)) + // Measured: `771` + // Estimated: `159279` + // Minimum execution time: 55_759_000 picoseconds. + Weight::from_parts(58_177_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -465,11 +482,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) fn nudge_referendum_approved() -> Weight { // Proof Size summary in bytes: - // Measured: `803` - // Estimated: `328925` - // Minimum execution time: 704_000_000 picoseconds. - Weight::from_parts(704_000_000, 0) - .saturating_add(Weight::from_parts(0, 328925)) + // Measured: `771` + // Estimated: `317568` + // Minimum execution time: 99_521_000 picoseconds. + Weight::from_parts(106_553_000, 0) + .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -481,11 +498,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_rejected() -> Weight { // Proof Size summary in bytes: - // Measured: `799` - // Estimated: `167123` - // Minimum execution time: 615_000_000 picoseconds. - Weight::from_parts(615_000_000, 0) - .saturating_add(Weight::from_parts(0, 167123)) + // Measured: `767` + // Estimated: `159279` + // Minimum execution time: 87_381_000 picoseconds. + Weight::from_parts(91_501_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -497,11 +514,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda MetadataOf (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) fn set_some_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `384` - // Estimated: `7921` - // Minimum execution time: 262_000_000 picoseconds. - Weight::from_parts(262_000_000, 0) - .saturating_add(Weight::from_parts(0, 7921)) + // Measured: `352` + // Estimated: `4365` + // Minimum execution time: 22_378_000 picoseconds. + Weight::from_parts(22_631_000, 0) + .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -511,11 +528,11 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda MetadataOf (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `317` - // Estimated: `7882` - // Minimum execution time: 223_000_000 picoseconds. - Weight::from_parts(223_000_000, 0) - .saturating_add(Weight::from_parts(0, 7882)) + // Measured: `285` + // Estimated: `4365` + // Minimum execution time: 20_116_000 picoseconds. + Weight::from_parts(20_255_000, 0) + .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs index 3c0a5f5f2f2..f6f6954aca3 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs @@ -1,32 +1,49 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . //! Autogenerated weights for `pallet_scheduler` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `cob`, CPU: `` -//! EXECUTION: Some(Native), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: -// ./target/release/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet // --chain=collectives-polkadot-dev -// --steps=50 -// --repeat=20 +// --execution=wasm +// --wasm-execution=compiled // --pallet=pallet_scheduler // --extrinsic=* -// --execution=native -// --wasm-execution=compiled -// --heap-pages=4096 -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_scheduler`. pub struct WeightInfo(PhantomData); @@ -37,8 +54,8 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `31` // Estimated: `1489` - // Minimum execution time: 2_000_000 picoseconds. - Weight::from_parts(3_000_000, 0) + // Minimum execution time: 3_399_000 picoseconds. + Weight::from_parts(3_512_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -48,13 +65,13 @@ impl pallet_scheduler::WeightInfo for WeightInfo { /// The range of component `s` is `[0, 200]`. fn service_agenda_base(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `109 + s * (177 ±0)` + // Measured: `77 + s * (177 ±0)` // Estimated: `159279` - // Minimum execution time: 1_000_000 picoseconds. - Weight::from_parts(6_554_632, 0) + // Minimum execution time: 2_846_000 picoseconds. + Weight::from_parts(4_715_748, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 3_795 - .saturating_add(Weight::from_parts(293_040, 0).saturating_mul(s.into())) + // Standard Error: 2_743 + .saturating_add(Weight::from_parts(971_622, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -62,8 +79,8 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_000_000 picoseconds. - Weight::from_parts(2_000_000, 0) + // Minimum execution time: 5_940_000 picoseconds. + Weight::from_parts(6_087_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: Preimage PreimageFor (r:1 w:1) @@ -73,13 +90,13 @@ impl pallet_scheduler::WeightInfo for WeightInfo { /// The range of component `s` is `[128, 4194304]`. fn service_task_fetched(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `211 + s * (1 ±0)` - // Estimated: `7232 + s * (1 ±0)` - // Minimum execution time: 12_000_000 picoseconds. - Weight::from_parts(13_000_000, 0) - .saturating_add(Weight::from_parts(0, 7232)) - // Standard Error: 2 - .saturating_add(Weight::from_parts(506, 0).saturating_mul(s.into())) + // Measured: `179 + s * (1 ±0)` + // Estimated: `3644 + s * (1 ±0)` + // Minimum execution time: 20_238_000 picoseconds. + Weight::from_parts(20_509_000, 0) + .saturating_add(Weight::from_parts(0, 3644)) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_271, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into())) @@ -90,8 +107,8 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_000_000 picoseconds. - Weight::from_parts(3_000_000, 0) + // Minimum execution time: 7_274_000 picoseconds. + Weight::from_parts(7_466_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -99,24 +116,24 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_000_000 picoseconds. - Weight::from_parts(2_000_000, 0) + // Minimum execution time: 5_886_000 picoseconds. + Weight::from_parts(6_035_000, 0) .saturating_add(Weight::from_parts(0, 0)) } fn execute_dispatch_signed() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_000_000 picoseconds. - Weight::from_parts(1_000_000, 0) + // Minimum execution time: 2_994_000 picoseconds. + Weight::from_parts(3_101_000, 0) .saturating_add(Weight::from_parts(0, 0)) } fn execute_dispatch_unsigned() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_000_000 picoseconds. - Weight::from_parts(1_000_000, 0) + // Minimum execution time: 2_983_000 picoseconds. + Weight::from_parts(3_095_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: Scheduler Agenda (r:1 w:1) @@ -124,13 +141,13 @@ impl pallet_scheduler::WeightInfo for WeightInfo { /// The range of component `s` is `[0, 199]`. fn schedule(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `109 + s * (177 ±0)` + // Measured: `77 + s * (177 ±0)` // Estimated: `159279` - // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(10_397_360, 0) + // Minimum execution time: 12_851_000 picoseconds. + Weight::from_parts(14_995_788, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 12_609 - .saturating_add(Weight::from_parts(342_422, 0).saturating_mul(s.into())) + // Standard Error: 3_056 + .saturating_add(Weight::from_parts(980_018, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -141,13 +158,13 @@ impl pallet_scheduler::WeightInfo for WeightInfo { /// The range of component `s` is `[1, 200]`. fn cancel(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `109 + s * (177 ±0)` + // Measured: `77 + s * (177 ±0)` // Estimated: `159279` - // Minimum execution time: 9_000_000 picoseconds. - Weight::from_parts(24_399_340, 0) + // Minimum execution time: 17_805_000 picoseconds. + Weight::from_parts(16_078_257, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 17_555 - .saturating_add(Weight::from_parts(480_590, 0).saturating_mul(s.into())) + // Standard Error: 3_216 + .saturating_add(Weight::from_parts(1_767_117, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -158,13 +175,13 @@ impl pallet_scheduler::WeightInfo for WeightInfo { /// The range of component `s` is `[0, 199]`. fn schedule_named(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `500 + s * (179 ±0)` - // Estimated: `162792` - // Minimum execution time: 7_000_000 picoseconds. - Weight::from_parts(9_819_325, 0) - .saturating_add(Weight::from_parts(0, 162792)) - // Standard Error: 9_309 - .saturating_add(Weight::from_parts(365_629, 0).saturating_mul(s.into())) + // Measured: `468 + s * (179 ±0)` + // Estimated: `159279` + // Minimum execution time: 16_210_000 picoseconds. + Weight::from_parts(20_557_445, 0) + .saturating_add(Weight::from_parts(0, 159279)) + // Standard Error: 3_292 + .saturating_add(Weight::from_parts(992_281, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -175,13 +192,13 @@ impl pallet_scheduler::WeightInfo for WeightInfo { /// The range of component `s` is `[1, 200]`. fn cancel_named(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `541 + s * (179 ±0)` - // Estimated: `162792` - // Minimum execution time: 11_000_000 picoseconds. - Weight::from_parts(19_693_473, 0) - .saturating_add(Weight::from_parts(0, 162792)) - // Standard Error: 17_961 - .saturating_add(Weight::from_parts(559_993, 0).saturating_mul(s.into())) + // Measured: `509 + s * (179 ±0)` + // Estimated: `159279` + // Minimum execution time: 19_976_000 picoseconds. + Weight::from_parts(19_613_223, 0) + .saturating_add(Weight::from_parts(0, 159279)) + // Standard Error: 2_988 + .saturating_add(Weight::from_parts(1_765_202, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs index 5c5f61d40b2..cb307d61e54 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_session`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn set_keys() -> Weight { // Proof Size summary in bytes: // Measured: `270` - // Estimated: `7470` - // Minimum execution time: 17_635_000 picoseconds. - Weight::from_parts(17_997_000, 0) - .saturating_add(Weight::from_parts(0, 7470)) + // Estimated: `3735` + // Minimum execution time: 17_505_000 picoseconds. + Weight::from_parts(17_789_000, 0) + .saturating_add(Weight::from_parts(0, 3735)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -68,10 +69,10 @@ impl pallet_session::WeightInfo for WeightInfo { fn purge_keys() -> Weight { // Proof Size summary in bytes: // Measured: `242` - // Estimated: `3949` - // Minimum execution time: 12_878_000 picoseconds. - Weight::from_parts(13_245_000, 0) - .saturating_add(Weight::from_parts(0, 3949)) + // Estimated: `3707` + // Minimum execution time: 12_686_000 picoseconds. + Weight::from_parts(12_960_000, 0) + .saturating_add(Weight::from_parts(0, 3707)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs index 5d0636e87d1..5b3bd10d3f1 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_timestamp`. pub struct WeightInfo(PhantomData); @@ -54,10 +55,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { // Proof Size summary in bytes: // Measured: `49` - // Estimated: `2986` - // Minimum execution time: 7_660_000 picoseconds. - Weight::from_parts(7_967_000, 0) - .saturating_add(Weight::from_parts(0, 2986)) + // Estimated: `1493` + // Minimum execution time: 8_048_000 picoseconds. + Weight::from_parts(8_313_000, 0) + .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_258_000 picoseconds. - Weight::from_parts(3_348_000, 0) + // Minimum execution time: 3_226_000 picoseconds. + Weight::from_parts(3_341_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs index 5ff7d46c142..6bec697194f 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_utility`. pub struct WeightInfo(PhantomData); @@ -52,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_002_000 picoseconds. - Weight::from_parts(17_384_645, 0) + // Minimum execution time: 7_356_000 picoseconds. + Weight::from_parts(3_086_549, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_488 - .saturating_add(Weight::from_parts(4_736_077, 0).saturating_mul(c.into())) + // Standard Error: 3_625 + .saturating_add(Weight::from_parts(4_935_275, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_352_000 picoseconds. - Weight::from_parts(5_532_000, 0) + // Minimum execution time: 5_633_000 picoseconds. + Weight::from_parts(5_693_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -71,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_030_000 picoseconds. - Weight::from_parts(18_968_785, 0) + // Minimum execution time: 7_312_000 picoseconds. + Weight::from_parts(3_780_731, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_112 - .saturating_add(Weight::from_parts(4_960_336, 0).saturating_mul(c.into())) + // Standard Error: 6_353 + .saturating_add(Weight::from_parts(5_289_295, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_703_000 picoseconds. - Weight::from_parts(10_012_000, 0) + // Minimum execution time: 9_811_000 picoseconds. + Weight::from_parts(10_039_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -90,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_029_000 picoseconds. - Weight::from_parts(13_505_714, 0) + // Minimum execution time: 7_419_000 picoseconds. + Weight::from_parts(4_232_933, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_032 - .saturating_add(Weight::from_parts(4_709_262, 0).saturating_mul(c.into())) + // Standard Error: 3_419 + .saturating_add(Weight::from_parts(4_950_293, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs index 43823d56560..ce00a1db94a 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 // Executed Command: @@ -40,9 +40,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); @@ -59,11 +60,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn send() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `9595` - // Minimum execution time: 25_963_000 picoseconds. - Weight::from_parts(26_569_000, 0) - .saturating_add(Weight::from_parts(0, 9595)) + // Measured: `111` + // Estimated: `3576` + // Minimum execution time: 30_061_000 picoseconds. + Weight::from_parts(30_674_000, 0) + .saturating_add(Weight::from_parts(0, 3576)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1489` - // Minimum execution time: 26_187_000 picoseconds. - Weight::from_parts(26_643_000, 0) + // Minimum execution time: 30_473_000 picoseconds. + Weight::from_parts(30_869_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -104,8 +105,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_755_000 picoseconds. - Weight::from_parts(10_010_000, 0) + // Minimum execution time: 10_720_000 picoseconds. + Weight::from_parts(10_836_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -115,8 +116,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_994_000 picoseconds. - Weight::from_parts(3_125_000, 0) + // Minimum execution time: 3_284_000 picoseconds. + Weight::from_parts(3_349_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -138,11 +139,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `14659` - // Minimum execution time: 31_393_000 picoseconds. - Weight::from_parts(31_976_000, 0) - .saturating_add(Weight::from_parts(0, 14659)) + // Measured: `111` + // Estimated: `3576` + // Minimum execution time: 35_075_000 picoseconds. + Weight::from_parts(35_592_000, 0) + .saturating_add(Weight::from_parts(0, 3576)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -162,20 +163,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `220` - // Estimated: `14410` - // Minimum execution time: 34_048_000 picoseconds. - Weight::from_parts(35_696_000, 0) - .saturating_add(Weight::from_parts(0, 14410)) + // Measured: `294` + // Estimated: `3759` + // Minimum execution time: 35_814_000 picoseconds. + Weight::from_parts(36_242_000, 0) + .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) + /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) fn force_suspension() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_994_000 picoseconds. - Weight::from_parts(3_125_000, 0) + // Minimum execution time: 3_199_000 picoseconds. + Weight::from_parts(3_444_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -183,11 +186,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `10985` - // Minimum execution time: 16_432_000 picoseconds. - Weight::from_parts(16_898_000, 0) - .saturating_add(Weight::from_parts(0, 10985)) + // Measured: `129` + // Estimated: `11019` + // Minimum execution time: 16_207_000 picoseconds. + Weight::from_parts(16_419_000, 0) + .saturating_add(Weight::from_parts(0, 11019)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -195,11 +198,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `10989` - // Minimum execution time: 15_950_000 picoseconds. - Weight::from_parts(16_441_000, 0) - .saturating_add(Weight::from_parts(0, 10989)) + // Measured: `133` + // Estimated: `11023` + // Minimum execution time: 16_204_000 picoseconds. + Weight::from_parts(16_554_000, 0) + .saturating_add(Weight::from_parts(0, 11023)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -207,11 +210,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn already_notified_target() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `13471` - // Minimum execution time: 16_585_000 picoseconds. - Weight::from_parts(16_939_000, 0) - .saturating_add(Weight::from_parts(0, 13471)) + // Measured: `140` + // Estimated: `13505` + // Minimum execution time: 16_935_000 picoseconds. + Weight::from_parts(17_263_000, 0) + .saturating_add(Weight::from_parts(0, 13505)) .saturating_add(T::DbWeight::get().reads(5)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) @@ -228,11 +231,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn notify_current_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `15981` - // Minimum execution time: 30_278_000 picoseconds. - Weight::from_parts(30_676_000, 0) - .saturating_add(Weight::from_parts(0, 15981)) + // Measured: `178` + // Estimated: `6118` + // Minimum execution time: 31_462_000 picoseconds. + Weight::from_parts(32_095_000, 0) + .saturating_add(Weight::from_parts(0, 6118)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -240,22 +243,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: - // Measured: `136` - // Estimated: `8551` - // Minimum execution time: 8_923_000 picoseconds. - Weight::from_parts(9_257_000, 0) - .saturating_add(Weight::from_parts(0, 8551)) + // Measured: `172` + // Estimated: `8587` + // Minimum execution time: 8_664_000 picoseconds. + Weight::from_parts(8_835_000, 0) + .saturating_add(Weight::from_parts(0, 8587)) .saturating_add(T::DbWeight::get().reads(3)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10996` - // Minimum execution time: 16_897_000 picoseconds. - Weight::from_parts(17_998_000, 0) - .saturating_add(Weight::from_parts(0, 10996)) + // Measured: `140` + // Estimated: `11030` + // Minimum execution time: 15_999_000 picoseconds. + Weight::from_parts(16_305_000, 0) + .saturating_add(Weight::from_parts(0, 11030)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -273,11 +276,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `112` - // Estimated: `20967` - // Minimum execution time: 40_145_000 picoseconds. - Weight::from_parts(41_423_000, 0) - .saturating_add(Weight::from_parts(0, 20967)) + // Measured: `182` + // Estimated: `11072` + // Minimum execution time: 37_949_000 picoseconds. + Weight::from_parts(38_524_000, 0) + .saturating_add(Weight::from_parts(0, 11072)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } From 8ec0778fe386a272adb2c862cc554f880a28c858 Mon Sep 17 00:00:00 2001 From: Aaro Altonen <48052676+altonen@users.noreply.github.com> Date: Thu, 11 May 2023 15:00:42 +0300 Subject: [PATCH 178/339] Companion for paritytech/substrate#14080 (#2526) * Companion for paritytech/substrate#14080 * Update lockfile * Update Polkadot * Update Cargo.lock --- Cargo.lock | 550 +++++++++--------- client/relay-chain-minimal-node/src/lib.rs | 34 +- .../relay-chain-minimal-node/src/network.rs | 5 +- client/service/src/lib.rs | 3 + parachain-template/node/src/service.rs | 2 + polkadot-parachain/src/service.rs | 8 +- test/service/src/lib.rs | 6 +- 7 files changed, 320 insertions(+), 288 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a094272eb97..611153fdd8a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,7 +585,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "hash-db", "log", @@ -602,9 +602,9 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.64.0" +version = "0.65.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" +checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" dependencies = [ "bitflags", "cexpr", @@ -612,12 +612,13 @@ dependencies = [ "lazy_static", "lazycell", "peeking_take_while", + "prettyplease", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] @@ -1371,9 +1372,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.10.3" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db" +checksum = "c8790cf1286da485c72cf5fc7aeba308438800036ec67d89425924c4807268c9" dependencies = [ "smallvec", ] @@ -3761,7 +3762,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", ] @@ -3784,7 +3785,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-support-procedural", @@ -3809,7 +3810,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3856,7 +3857,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3867,7 +3868,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3884,7 +3885,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -3913,7 +3914,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-recursion", "futures", @@ -3933,7 +3934,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "bitflags", "environmental", @@ -3966,7 +3967,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "Inflector", "cfg-expr", @@ -3982,7 +3983,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3994,7 +3995,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "proc-macro2", "quote", @@ -4004,7 +4005,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "log", @@ -4022,7 +4023,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -4037,7 +4038,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "sp-api", @@ -4046,7 +4047,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "parity-scale-codec", @@ -5063,7 +5064,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bitvec", "frame-benchmarking", @@ -5161,7 +5162,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "frame-support", "polkadot-primitives", @@ -5193,9 +5194,9 @@ dependencies = [ [[package]] name = "kvdb-rocksdb" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7a749456510c45f795e8b04a6a3e0976d0139213ecbf465843830ad55e2217" +checksum = "b644c70b92285f66bfc2032922a79000ea30af7bc2ab31902992a5dcb9b434f6" dependencies = [ "kvdb", "num_cpus", @@ -5653,9 +5654,9 @@ dependencies = [ [[package]] name = "librocksdb-sys" -version = "0.10.0+7.9.2" +version = "0.11.0+8.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fe4d5874f5ff2bc616e55e8c6086d478fcda13faf9495768a4aa1c22042d30b" +checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e" dependencies = [ "bindgen", "bzip2-sys", @@ -6015,7 +6016,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "futures", "log", @@ -6034,7 +6035,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "anyhow", "jsonrpsee", @@ -6539,7 +6540,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6560,7 +6561,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -6578,7 +6579,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -6593,7 +6594,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -6609,7 +6610,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -6625,7 +6626,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -6639,7 +6640,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -6663,7 +6664,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6683,7 +6684,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -6698,7 +6699,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -6717,7 +6718,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6741,7 +6742,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -6847,7 +6848,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -6891,7 +6892,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -6908,7 +6909,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "bitflags", "environmental", @@ -6938,7 +6939,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "bitflags", "parity-scale-codec", @@ -6951,7 +6952,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "proc-macro2", "quote", @@ -6961,7 +6962,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6978,7 +6979,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -6996,7 +6997,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7019,7 +7020,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7032,7 +7033,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7050,7 +7051,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7068,7 +7069,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7091,7 +7092,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7107,7 +7108,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7127,7 +7128,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7144,7 +7145,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -7158,7 +7159,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7175,7 +7176,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7192,7 +7193,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7208,7 +7209,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7226,7 +7227,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "pallet-nfts", @@ -7237,7 +7238,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7253,7 +7254,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -7270,7 +7271,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7290,7 +7291,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7301,7 +7302,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -7318,7 +7319,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7357,7 +7358,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7374,7 +7375,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7389,7 +7390,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7407,7 +7408,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7422,7 +7423,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7441,7 +7442,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7458,7 +7459,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -7479,7 +7480,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7495,7 +7496,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -7509,7 +7510,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7532,7 +7533,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7543,7 +7544,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "log", "sp-arithmetic", @@ -7552,7 +7553,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "sp-api", @@ -7561,7 +7562,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7578,7 +7579,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -7592,7 +7593,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7610,7 +7611,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7629,7 +7630,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-support", "frame-system", @@ -7645,7 +7646,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7661,7 +7662,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7673,7 +7674,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7690,7 +7691,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7705,7 +7706,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7721,7 +7722,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7736,7 +7737,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-benchmarking", "frame-support", @@ -7751,7 +7752,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7772,7 +7773,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "frame-benchmarking", "frame-support", @@ -8350,7 +8351,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8366,7 +8367,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8380,7 +8381,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "derive_more", "fatality", @@ -8403,7 +8404,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "fatality", "futures", @@ -8424,7 +8425,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8453,7 +8454,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "async-trait", "frame-benchmarking", @@ -8496,7 +8497,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "always-assert", "bitvec", @@ -8518,7 +8519,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "parity-scale-codec", "scale-info", @@ -8530,7 +8531,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "derive_more", "fatality", @@ -8555,7 +8556,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8569,7 +8570,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "futures", "futures-timer", @@ -8589,7 +8590,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "always-assert", "async-trait", @@ -8612,7 +8613,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "futures", "parity-scale-codec", @@ -8630,7 +8631,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bitvec", "derive_more", @@ -8659,7 +8660,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bitvec", "futures", @@ -8680,7 +8681,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bitvec", "fatality", @@ -8699,7 +8700,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8714,7 +8715,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "async-trait", "futures", @@ -8734,7 +8735,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "futures", "polkadot-node-metrics", @@ -8749,7 +8750,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "futures", "futures-timer", @@ -8766,7 +8767,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "fatality", "futures", @@ -8785,7 +8786,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "async-trait", "futures", @@ -8802,7 +8803,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bitvec", "fatality", @@ -8820,7 +8821,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "always-assert", "futures", @@ -8847,7 +8848,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "futures", "polkadot-node-primitives", @@ -8863,7 +8864,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "assert_matches", "cpu-time", @@ -8892,7 +8893,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "futures", "lru 0.9.0", @@ -8907,7 +8908,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "lazy_static", "log", @@ -8925,7 +8926,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bs58", "futures", @@ -8944,7 +8945,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "async-trait", "derive_more", @@ -8966,7 +8967,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bounded-vec", "futures", @@ -8988,7 +8989,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8998,7 +8999,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "async-trait", "futures", @@ -9016,7 +9017,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "async-trait", "derive_more", @@ -9039,7 +9040,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "async-trait", "derive_more", @@ -9072,7 +9073,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "async-trait", "futures", @@ -9095,7 +9096,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bounded-collections", "derive_more", @@ -9193,7 +9194,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9211,7 +9212,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9237,7 +9238,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9269,7 +9270,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bitvec", "frame-benchmarking", @@ -9363,7 +9364,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bitvec", "frame-benchmarking", @@ -9409,7 +9410,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "frame-support", "polkadot-primitives", @@ -9423,7 +9424,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bs58", "parity-scale-codec", @@ -9435,7 +9436,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bitflags", "bitvec", @@ -9479,7 +9480,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9589,7 +9590,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9610,7 +9611,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9620,7 +9621,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9645,7 +9646,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9706,7 +9707,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "frame-benchmarking", "frame-system", @@ -9866,6 +9867,16 @@ dependencies = [ "termtree", ] +[[package]] +name = "prettyplease" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ceca8aaf45b5c46ec7ed39fff75f57290368c1846d33d24a122ca81416ab058" +dependencies = [ + "proc-macro2", + "syn 2.0.15", +] + [[package]] name = "primitive-types" version = "0.12.0" @@ -10420,9 +10431,9 @@ dependencies = [ [[package]] name = "rocksdb" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "015439787fce1e75d55f279078d33ff14b4af5d93d995e8838ee4631301c8a99" +checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe" dependencies = [ "libc", "librocksdb-sys", @@ -10479,7 +10490,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10565,7 +10576,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "frame-support", "polkadot-primitives", @@ -10812,7 +10823,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "log", "sp-core", @@ -10823,7 +10834,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "futures", @@ -10851,7 +10862,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "futures", "futures-timer", @@ -10874,7 +10885,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10889,7 +10900,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10908,7 +10919,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10919,7 +10930,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10959,7 +10970,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "fnv", "futures", @@ -10986,7 +10997,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "hash-db", "kvdb", @@ -11012,7 +11023,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "futures", @@ -11037,7 +11048,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "futures", @@ -11066,7 +11077,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "fork-tree", @@ -11102,7 +11113,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "futures", "jsonrpsee", @@ -11124,7 +11135,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11159,7 +11170,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "futures", "jsonrpsee", @@ -11178,7 +11189,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11191,7 +11202,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11231,7 +11242,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "finality-grandpa", "futures", @@ -11251,7 +11262,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "futures", @@ -11274,7 +11285,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11298,7 +11309,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11311,7 +11322,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "log", "sc-allocator", @@ -11324,7 +11335,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "anyhow", "cfg-if", @@ -11342,7 +11353,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "ansi_term", "futures", @@ -11358,10 +11369,9 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", - "async-trait", "parking_lot 0.12.1", "serde_json", "sp-application-crypto", @@ -11373,7 +11383,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11418,7 +11428,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "cid", "futures", @@ -11438,7 +11448,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11466,7 +11476,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "ahash 0.8.2", "futures", @@ -11485,7 +11495,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11507,7 +11517,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11541,7 +11551,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11561,7 +11571,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11592,7 +11602,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "futures", "libp2p", @@ -11605,7 +11615,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11614,7 +11624,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "futures", "jsonrpsee", @@ -11645,7 +11655,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11664,7 +11674,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "http", "jsonrpsee", @@ -11679,7 +11689,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11705,7 +11715,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "directories", @@ -11771,7 +11781,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "log", "parity-scale-codec", @@ -11782,7 +11792,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "clap 4.2.7", "fs4", @@ -11798,7 +11808,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11817,7 +11827,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "futures", "libc", @@ -11836,7 +11846,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "chrono", "futures", @@ -11855,7 +11865,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "ansi_term", "atty", @@ -11886,7 +11896,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11897,7 +11907,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "futures", @@ -11924,7 +11934,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "futures", @@ -11938,7 +11948,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-channel", "futures", @@ -12419,7 +12429,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "enumn", "parity-scale-codec", @@ -12496,7 +12506,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "hash-db", "log", @@ -12516,7 +12526,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "Inflector", "blake2", @@ -12530,7 +12540,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "scale-info", @@ -12543,7 +12553,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "integer-sqrt", "num-traits", @@ -12557,7 +12567,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "scale-info", @@ -12570,7 +12580,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "sp-api", @@ -12582,7 +12592,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "futures", "log", @@ -12600,7 +12610,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "futures", @@ -12615,7 +12625,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "parity-scale-codec", @@ -12633,7 +12643,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "parity-scale-codec", @@ -12654,7 +12664,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12673,7 +12683,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "finality-grandpa", "log", @@ -12691,7 +12701,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "scale-info", @@ -12703,7 +12713,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12747,7 +12757,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "blake2b_simd", "byteorder", @@ -12761,7 +12771,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "proc-macro2", "quote", @@ -12772,7 +12782,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12781,7 +12791,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "proc-macro2", "quote", @@ -12791,7 +12801,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "environmental", "parity-scale-codec", @@ -12802,7 +12812,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12817,7 +12827,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "bytes", "ed25519", @@ -12843,7 +12853,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "lazy_static", "sp-core", @@ -12854,7 +12864,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "futures", "parity-scale-codec", @@ -12868,7 +12878,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12877,7 +12887,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12888,7 +12898,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12906,7 +12916,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "scale-info", @@ -12920,7 +12930,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "sp-api", "sp-core", @@ -12930,7 +12940,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "backtrace", "lazy_static", @@ -12940,7 +12950,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "rustc-hash", "serde", @@ -12950,7 +12960,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "either", "hash256-std-hasher", @@ -12972,7 +12982,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -12990,7 +13000,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "Inflector", "proc-macro-crate", @@ -13002,7 +13012,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "serde", "serde_json", @@ -13011,7 +13021,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "scale-info", @@ -13025,7 +13035,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "scale-info", @@ -13038,7 +13048,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "hash-db", "log", @@ -13058,7 +13068,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "log", "parity-scale-codec", @@ -13076,12 +13086,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13094,7 +13104,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "futures-timer", @@ -13109,7 +13119,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "sp-std", @@ -13121,7 +13131,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "sp-api", "sp-runtime", @@ -13130,7 +13140,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "log", @@ -13146,7 +13156,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13169,7 +13179,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13186,7 +13196,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13197,7 +13207,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13211,7 +13221,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "parity-scale-codec", "scale-info", @@ -13546,7 +13556,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "platforms 2.0.0", ] @@ -13554,7 +13564,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13573,7 +13583,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "hyper", "log", @@ -13585,7 +13595,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "jsonrpsee", @@ -13598,7 +13608,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "jsonrpsee", "log", @@ -13617,7 +13627,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13643,7 +13653,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13653,7 +13663,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13664,7 +13674,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "ansi_term", "build-helper", @@ -13791,7 +13801,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "frame-support", "polkadot-primitives", @@ -14177,7 +14187,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14188,7 +14198,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14318,7 +14328,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#cf1fb8953c8aa2ca9bb2197fae40c31e10bcf45f" +source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" dependencies = [ "async-trait", "clap 4.2.7", @@ -15251,7 +15261,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bitvec", "frame-benchmarking", @@ -15343,7 +15353,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "frame-support", "polkadot-primitives", @@ -15845,7 +15855,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "bounded-collections", "derivative", @@ -15861,7 +15871,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "frame-support", "frame-system", @@ -15882,7 +15892,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "environmental", "frame-benchmarking", @@ -15902,7 +15912,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#eb8dee045a75db91b7f4cb6a187f0bdd5e92ab47" +source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" dependencies = [ "Inflector", "proc-macro2", diff --git a/client/relay-chain-minimal-node/src/lib.rs b/client/relay-chain-minimal-node/src/lib.rs index 102a8582745..6def072913b 100644 --- a/client/relay-chain-minimal-node/src/lib.rs +++ b/client/relay-chain-minimal-node/src/lib.rs @@ -29,7 +29,7 @@ use polkadot_node_subsystem_util::metrics::prometheus::Registry; use polkadot_primitives::CollatorPair; use sc_authority_discovery::Service as AuthorityDiscoveryService; -use sc_network::{Event, NetworkEventStream, NetworkService}; +use sc_network::{config::FullNetworkConfiguration, Event, NetworkEventStream, NetworkService}; use sc_service::{Configuration, TaskManager}; use sp_runtime::{app_crypto::Pair, traits::Block as BlockT}; @@ -119,11 +119,12 @@ pub async fn build_minimal_relay_chain_node( /// - AvailabilityDistribution #[sc_tracing::logging::prefix_logs_with("Relaychain")] async fn new_minimal_relay_chain( - mut config: Configuration, + config: Configuration, collator_pair: CollatorPair, relay_chain_rpc_client: Arc, ) -> Result { let role = config.role.clone(); + let mut net_config = sc_network::config::FullNetworkConfiguration::new(&config.network); let task_manager = { let registry = config.prometheus_config.as_ref().map(|cfg| &cfg.registry); @@ -141,22 +142,27 @@ async fn new_minimal_relay_chain( let peer_set_protocol_names = PeerSetProtocolNames::new(genesis_hash, config.chain_spec.fork_id()); let is_authority = if role.is_authority() { IsAuthority::Yes } else { IsAuthority::No }; - config - .network - .extra_sets - .extend(peer_sets_info(is_authority, &peer_set_protocol_names)); + + for config in peer_sets_info(is_authority, &peer_set_protocol_names) { + net_config.add_notification_protocol(config); + } let request_protocol_names = ReqProtocolNames::new(genesis_hash, config.chain_spec.fork_id()); let (collation_req_receiver, available_data_req_receiver) = - build_request_response_protocol_receivers(&request_protocol_names, &mut config); + build_request_response_protocol_receivers(&request_protocol_names, &mut net_config); let best_header = relay_chain_rpc_client .chain_get_header(None) .await? .ok_or_else(|| RelayChainError::RpcCallError("Unable to fetch best header".to_string()))?; - let (network, network_starter, sync_oracle) = - build_collator_network(&config, task_manager.spawn_handle(), genesis_hash, best_header) - .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; + let (network, network_starter, sync_oracle) = build_collator_network( + &config, + net_config, + task_manager.spawn_handle(), + genesis_hash, + best_header, + ) + .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; let authority_discovery_service = build_authority_discovery_service( &task_manager, @@ -190,18 +196,18 @@ async fn new_minimal_relay_chain( fn build_request_response_protocol_receivers( request_protocol_names: &ReqProtocolNames, - config: &mut Configuration, + config: &mut FullNetworkConfiguration, ) -> ( IncomingRequestReceiver, IncomingRequestReceiver, ) { let (collation_req_receiver, cfg) = IncomingRequest::get_config_receiver(request_protocol_names); - config.network.request_response_protocols.push(cfg); + config.add_request_response_protocol(cfg); let (available_data_req_receiver, cfg) = IncomingRequest::get_config_receiver(request_protocol_names); - config.network.request_response_protocols.push(cfg); + config.add_request_response_protocol(cfg); let cfg = Protocol::ChunkFetchingV1.get_outbound_only_config(request_protocol_names); - config.network.request_response_protocols.push(cfg); + config.add_request_response_protocol(cfg); (collation_req_receiver, available_data_req_receiver) } diff --git a/client/relay-chain-minimal-node/src/network.rs b/client/relay-chain-minimal-node/src/network.rs index 5225fa053cc..022e7e696b7 100644 --- a/client/relay-chain-minimal-node/src/network.rs +++ b/client/relay-chain-minimal-node/src/network.rs @@ -24,6 +24,7 @@ use sc_network::{ NetworkService, }; +use sc_network::config::FullNetworkConfiguration; use sc_network_common::{role::Roles, sync::message::BlockAnnouncesHandshake}; use sc_service::{error::Error, Configuration, NetworkStarter, SpawnTaskHandle}; use sc_utils::mpsc::tracing_unbounded; @@ -33,6 +34,7 @@ use std::{iter, sync::Arc}; /// Build the network service, the network status sinks and an RPC sender. pub(crate) fn build_collator_network( config: &Configuration, + network_config: FullNetworkConfiguration, spawn_handle: SpawnTaskHandle, genesis_hash: Hash, best_header: Header, @@ -61,12 +63,11 @@ pub(crate) fn build_collator_network( }) }, fork_id: None, - network_config: config.network.clone(), + network_config, genesis_hash, protocol_id, metrics_registry: config.prometheus_config.as_ref().map(|config| config.registry.clone()), block_announce_config, - request_response_protocol_configs: Vec::new(), tx, }; diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index ac18cb39fcf..42b9916d468 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -301,6 +301,7 @@ pub struct BuildNetworkParams< Client::Api: sp_transaction_pool::runtime_api::TaggedTransactionQueue, { pub parachain_config: &'a Configuration, + pub net_config: sc_network::config::FullNetworkConfiguration, pub client: Arc, pub transaction_pool: Arc>, pub para_id: ParaId, @@ -313,6 +314,7 @@ pub struct BuildNetworkParams< pub async fn build_network<'a, Block, Client, RCInterface, IQ>( BuildNetworkParams { parachain_config, + net_config, client, transaction_pool, para_id, @@ -364,6 +366,7 @@ where sc_service::build_network(sc_service::BuildNetworkParams { config: parachain_config, + net_config, client, transaction_pool, spawn_handle, diff --git a/parachain-template/node/src/service.rs b/parachain-template/node/src/service.rs index 4c9e1febf70..fb311a48b48 100644 --- a/parachain-template/node/src/service.rs +++ b/parachain-template/node/src/service.rs @@ -157,6 +157,7 @@ async fn start_node_impl( let params = new_partial(¶chain_config)?; let (block_import, mut telemetry, telemetry_worker_handle) = params.other; + let net_config = sc_network::config::FullNetworkConfiguration::new(¶chain_config.network); let client = params.client.clone(); let backend = params.backend.clone(); @@ -182,6 +183,7 @@ async fn start_node_impl( let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = build_network(BuildNetworkParams { parachain_config: ¶chain_config, + net_config, client: client.clone(), transaction_pool: transaction_pool.clone(), para_id, diff --git a/polkadot-parachain/src/service.rs b/polkadot-parachain/src/service.rs index c8370d070a6..71fe4d35b16 100644 --- a/polkadot-parachain/src/service.rs +++ b/polkadot-parachain/src/service.rs @@ -43,7 +43,7 @@ use sc_consensus::{ BlockImportParams, ImportQueue, }; use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; -use sc_network::NetworkBlock; +use sc_network::{config::FullNetworkConfiguration, NetworkBlock}; use sc_network_sync::SyncingService; use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; @@ -393,10 +393,12 @@ where let prometheus_registry = parachain_config.prometheus_registry().cloned(); let transaction_pool = params.transaction_pool.clone(); let import_queue_service = params.import_queue.service(); + let net_config = FullNetworkConfiguration::new(¶chain_config.network); let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = build_network(BuildNetworkParams { parachain_config: ¶chain_config, + net_config, client: client.clone(), transaction_pool: transaction_pool.clone(), para_id, @@ -582,10 +584,12 @@ where let prometheus_registry = parachain_config.prometheus_registry().cloned(); let transaction_pool = params.transaction_pool.clone(); let import_queue_service = params.import_queue.service(); + let net_config = FullNetworkConfiguration::new(¶chain_config.network); let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = build_network(BuildNetworkParams { parachain_config: ¶chain_config, + net_config, client: client.clone(), transaction_pool: transaction_pool.clone(), para_id, @@ -1355,10 +1359,12 @@ where let prometheus_registry = parachain_config.prometheus_registry().cloned(); let transaction_pool = params.transaction_pool.clone(); let import_queue_service = params.import_queue.service(); + let net_config = FullNetworkConfiguration::new(¶chain_config.network); let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = build_network(BuildNetworkParams { parachain_config: ¶chain_config, + net_config, client: client.clone(), transaction_pool: transaction_pool.clone(), para_id, diff --git a/test/service/src/lib.rs b/test/service/src/lib.rs index 5138a58bd80..c79c9554b01 100644 --- a/test/service/src/lib.rs +++ b/test/service/src/lib.rs @@ -54,7 +54,8 @@ use polkadot_service::ProvideRuntimeApi; use sc_client_api::execution_extensions::ExecutionStrategies; use sc_consensus::ImportQueue; use sc_network::{ - config::TransportConfig, multiaddr, NetworkBlock, NetworkService, NetworkStateInfo, + config::{FullNetworkConfiguration, TransportConfig}, + multiaddr, NetworkBlock, NetworkService, NetworkStateInfo, }; use sc_service::{ config::{ @@ -323,9 +324,12 @@ where .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; let import_queue_service = params.import_queue.service(); + let net_config = FullNetworkConfiguration::new(¶chain_config.network); + let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = build_network(BuildNetworkParams { parachain_config: ¶chain_config, + net_config, client: client.clone(), transaction_pool: transaction_pool.clone(), para_id, From cc4038c46cab9d1cdae60def06cf6025b2c26f5b Mon Sep 17 00:00:00 2001 From: Doordashcon Date: Thu, 11 May 2023 17:50:46 +0100 Subject: [PATCH 179/339] Substrate Companion (#2514) * pallet-sudo-weightinfo * revert * s * runtime-benchmarks * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 517 +++++++++--------- .../contracts/contracts-rococo/Cargo.toml | 1 + .../contracts/contracts-rococo/src/lib.rs | 2 + .../runtimes/starters/seedling/src/lib.rs | 1 + parachains/runtimes/testing/penpal/Cargo.toml | 1 + parachains/runtimes/testing/penpal/src/lib.rs | 2 + .../testing/rococo-parachain/src/lib.rs | 1 + test/runtime/src/lib.rs | 1 + 8 files changed, 268 insertions(+), 258 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 611153fdd8a..f702ccc7870 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,7 +585,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "hash-db", "log", @@ -3762,7 +3762,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", ] @@ -3785,7 +3785,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-support-procedural", @@ -3810,7 +3810,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3857,7 +3857,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3868,7 +3868,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3885,7 +3885,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-system", @@ -3914,7 +3914,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-recursion", "futures", @@ -3934,7 +3934,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "bitflags", "environmental", @@ -3967,7 +3967,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "Inflector", "cfg-expr", @@ -3983,7 +3983,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3995,7 +3995,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "proc-macro2", "quote", @@ -4005,7 +4005,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "log", @@ -4023,7 +4023,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -4038,7 +4038,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "sp-api", @@ -4047,7 +4047,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "parity-scale-codec", @@ -5064,7 +5064,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bitvec", "frame-benchmarking", @@ -5162,7 +5162,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "frame-support", "polkadot-primitives", @@ -6016,7 +6016,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "futures", "log", @@ -6035,7 +6035,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "anyhow", "jsonrpsee", @@ -6540,7 +6540,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6561,7 +6561,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -6579,7 +6579,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -6594,7 +6594,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-system", @@ -6610,7 +6610,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-system", @@ -6626,7 +6626,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-system", @@ -6640,7 +6640,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -6664,7 +6664,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6684,7 +6684,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -6699,7 +6699,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-system", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6742,7 +6742,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -6848,7 +6848,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -6892,7 +6892,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -6909,7 +6909,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "bitflags", "environmental", @@ -6939,7 +6939,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "bitflags", "parity-scale-codec", @@ -6952,7 +6952,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "proc-macro2", "quote", @@ -6962,7 +6962,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6979,7 +6979,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -6997,7 +6997,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7020,7 +7020,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7033,7 +7033,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7051,7 +7051,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7069,7 +7069,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7092,7 +7092,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7128,7 +7128,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7145,7 +7145,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-system", @@ -7159,7 +7159,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7176,7 +7176,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7193,7 +7193,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7209,7 +7209,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7227,7 +7227,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "pallet-nfts", @@ -7238,7 +7238,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7254,7 +7254,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-system", @@ -7271,7 +7271,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7291,7 +7291,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7302,7 +7302,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-system", @@ -7319,7 +7319,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7358,7 +7358,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7375,7 +7375,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7390,7 +7390,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7408,7 +7408,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7423,7 +7423,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7442,7 +7442,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7459,7 +7459,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-system", @@ -7480,7 +7480,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7496,7 +7496,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-system", @@ -7510,7 +7510,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7544,7 +7544,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "log", "sp-arithmetic", @@ -7553,7 +7553,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "sp-api", @@ -7562,7 +7562,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7579,8 +7579,9 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", @@ -7593,7 +7594,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7611,7 +7612,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7630,7 +7631,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-support", "frame-system", @@ -7646,7 +7647,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7662,7 +7663,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7674,7 +7675,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7691,7 +7692,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7706,7 +7707,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7722,7 +7723,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7737,7 +7738,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7752,7 +7753,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7773,7 +7774,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "frame-benchmarking", "frame-support", @@ -8351,7 +8352,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8367,7 +8368,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8381,7 +8382,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "derive_more", "fatality", @@ -8404,7 +8405,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "fatality", "futures", @@ -8425,7 +8426,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8454,7 +8455,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "async-trait", "frame-benchmarking", @@ -8497,7 +8498,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "always-assert", "bitvec", @@ -8519,7 +8520,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "parity-scale-codec", "scale-info", @@ -8531,7 +8532,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "derive_more", "fatality", @@ -8556,7 +8557,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8570,7 +8571,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "futures", "futures-timer", @@ -8590,7 +8591,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "always-assert", "async-trait", @@ -8613,7 +8614,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "futures", "parity-scale-codec", @@ -8631,7 +8632,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bitvec", "derive_more", @@ -8660,7 +8661,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bitvec", "futures", @@ -8681,7 +8682,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bitvec", "fatality", @@ -8700,7 +8701,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8715,7 +8716,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "async-trait", "futures", @@ -8735,7 +8736,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "futures", "polkadot-node-metrics", @@ -8750,7 +8751,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "futures", "futures-timer", @@ -8767,7 +8768,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "fatality", "futures", @@ -8786,7 +8787,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "async-trait", "futures", @@ -8803,7 +8804,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bitvec", "fatality", @@ -8821,7 +8822,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "always-assert", "futures", @@ -8848,7 +8849,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "futures", "polkadot-node-primitives", @@ -8864,7 +8865,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "assert_matches", "cpu-time", @@ -8893,7 +8894,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "futures", "lru 0.9.0", @@ -8908,7 +8909,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "lazy_static", "log", @@ -8926,7 +8927,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bs58", "futures", @@ -8945,7 +8946,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "async-trait", "derive_more", @@ -8967,7 +8968,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bounded-vec", "futures", @@ -8989,7 +8990,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -8999,7 +9000,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "async-trait", "futures", @@ -9017,7 +9018,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "async-trait", "derive_more", @@ -9040,7 +9041,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "async-trait", "derive_more", @@ -9073,7 +9074,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "async-trait", "futures", @@ -9096,7 +9097,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bounded-collections", "derive_more", @@ -9194,7 +9195,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9212,7 +9213,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9238,7 +9239,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9270,7 +9271,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bitvec", "frame-benchmarking", @@ -9364,7 +9365,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bitvec", "frame-benchmarking", @@ -9410,7 +9411,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "frame-support", "polkadot-primitives", @@ -9424,7 +9425,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bs58", "parity-scale-codec", @@ -9436,7 +9437,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bitflags", "bitvec", @@ -9480,7 +9481,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9590,7 +9591,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9611,7 +9612,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9621,7 +9622,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9646,7 +9647,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9707,7 +9708,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "frame-benchmarking", "frame-system", @@ -10490,7 +10491,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10576,7 +10577,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "frame-support", "polkadot-primitives", @@ -10823,7 +10824,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "log", "sp-core", @@ -10834,7 +10835,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "futures", @@ -10862,7 +10863,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "futures", "futures-timer", @@ -10885,7 +10886,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10900,7 +10901,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10919,7 +10920,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10930,7 +10931,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10970,7 +10971,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "fnv", "futures", @@ -10997,7 +10998,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "hash-db", "kvdb", @@ -11023,7 +11024,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "futures", @@ -11048,7 +11049,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "futures", @@ -11077,7 +11078,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "fork-tree", @@ -11113,7 +11114,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "futures", "jsonrpsee", @@ -11135,7 +11136,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11170,7 +11171,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "futures", "jsonrpsee", @@ -11189,7 +11190,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11202,7 +11203,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11242,7 +11243,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "finality-grandpa", "futures", @@ -11262,7 +11263,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "futures", @@ -11285,7 +11286,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11309,7 +11310,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11322,7 +11323,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "log", "sc-allocator", @@ -11335,7 +11336,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "anyhow", "cfg-if", @@ -11353,7 +11354,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "ansi_term", "futures", @@ -11369,7 +11370,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11383,7 +11384,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11428,7 +11429,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "cid", "futures", @@ -11448,7 +11449,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11476,7 +11477,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "ahash 0.8.2", "futures", @@ -11495,7 +11496,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11517,7 +11518,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11551,7 +11552,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11571,7 +11572,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11602,7 +11603,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "futures", "libp2p", @@ -11615,7 +11616,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11624,7 +11625,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "futures", "jsonrpsee", @@ -11655,7 +11656,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11674,7 +11675,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "http", "jsonrpsee", @@ -11689,7 +11690,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11715,7 +11716,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "directories", @@ -11781,7 +11782,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "log", "parity-scale-codec", @@ -11792,7 +11793,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "clap 4.2.7", "fs4", @@ -11808,7 +11809,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11827,7 +11828,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "futures", "libc", @@ -11846,7 +11847,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "chrono", "futures", @@ -11865,7 +11866,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "ansi_term", "atty", @@ -11896,7 +11897,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11907,7 +11908,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "futures", @@ -11934,7 +11935,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "futures", @@ -11948,7 +11949,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-channel", "futures", @@ -12429,7 +12430,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "enumn", "parity-scale-codec", @@ -12506,7 +12507,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "hash-db", "log", @@ -12526,7 +12527,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "Inflector", "blake2", @@ -12540,7 +12541,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "scale-info", @@ -12553,7 +12554,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "integer-sqrt", "num-traits", @@ -12567,7 +12568,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "scale-info", @@ -12580,7 +12581,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "sp-api", @@ -12592,7 +12593,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "futures", "log", @@ -12610,7 +12611,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "futures", @@ -12625,7 +12626,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "parity-scale-codec", @@ -12643,7 +12644,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "parity-scale-codec", @@ -12664,7 +12665,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12683,7 +12684,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "finality-grandpa", "log", @@ -12701,7 +12702,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "scale-info", @@ -12713,7 +12714,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12757,7 +12758,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "blake2b_simd", "byteorder", @@ -12771,7 +12772,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "proc-macro2", "quote", @@ -12782,7 +12783,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12791,7 +12792,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "proc-macro2", "quote", @@ -12801,7 +12802,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "environmental", "parity-scale-codec", @@ -12812,7 +12813,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12827,7 +12828,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "bytes", "ed25519", @@ -12853,7 +12854,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "lazy_static", "sp-core", @@ -12864,7 +12865,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "futures", "parity-scale-codec", @@ -12878,7 +12879,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12887,7 +12888,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12898,7 +12899,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12916,7 +12917,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "scale-info", @@ -12930,7 +12931,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "sp-api", "sp-core", @@ -12940,7 +12941,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "backtrace", "lazy_static", @@ -12950,7 +12951,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "rustc-hash", "serde", @@ -12960,7 +12961,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "either", "hash256-std-hasher", @@ -12982,7 +12983,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13000,7 +13001,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "Inflector", "proc-macro-crate", @@ -13012,7 +13013,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "serde", "serde_json", @@ -13021,7 +13022,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "scale-info", @@ -13035,7 +13036,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "scale-info", @@ -13048,7 +13049,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "hash-db", "log", @@ -13068,7 +13069,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "log", "parity-scale-codec", @@ -13086,12 +13087,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13104,7 +13105,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "futures-timer", @@ -13119,7 +13120,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "sp-std", @@ -13131,7 +13132,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "sp-api", "sp-runtime", @@ -13140,7 +13141,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "log", @@ -13156,7 +13157,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13179,7 +13180,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13196,7 +13197,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13207,7 +13208,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13221,7 +13222,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "parity-scale-codec", "scale-info", @@ -13556,7 +13557,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "platforms 2.0.0", ] @@ -13564,7 +13565,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13583,7 +13584,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "hyper", "log", @@ -13595,7 +13596,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "jsonrpsee", @@ -13608,7 +13609,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "jsonrpsee", "log", @@ -13627,7 +13628,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13653,7 +13654,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13663,7 +13664,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13674,7 +13675,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "ansi_term", "build-helper", @@ -13801,7 +13802,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "frame-support", "polkadot-primitives", @@ -14187,7 +14188,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14198,7 +14199,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14328,7 +14329,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0c696fc1ce7a60dbcf13f176b9d2dcb9492e6335" +source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" dependencies = [ "async-trait", "clap 4.2.7", @@ -15261,7 +15262,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bitvec", "frame-benchmarking", @@ -15353,7 +15354,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "frame-support", "polkadot-primitives", @@ -15855,7 +15856,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "bounded-collections", "derivative", @@ -15871,7 +15872,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "frame-support", "frame-system", @@ -15892,7 +15893,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "environmental", "frame-benchmarking", @@ -15912,7 +15913,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#de2d820e546159ab908ef0bc1eea1eb1e3edde67" +source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index 74186c0e53c..1bbf4b09294 100644 --- a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -142,6 +142,7 @@ runtime-benchmarks = [ "pallet-collator-selection/runtime-benchmarks", "pallet-contracts/runtime-benchmarks", "pallet-multisig/runtime-benchmarks", + "pallet-sudo/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-utility/runtime-benchmarks", "pallet-xcm/runtime-benchmarks", diff --git a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 2718484fed6..38d32895363 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -327,6 +327,7 @@ impl pallet_collator_selection::Config for Runtime { impl pallet_sudo::Config for Runtime { type RuntimeCall = RuntimeCall; type RuntimeEvent = RuntimeEvent; + type WeightInfo = pallet_sudo::weights::SubstrateWeight; } // Create the runtime by composing the FRAME pallets that were previously configured. @@ -386,6 +387,7 @@ mod benches { [pallet_multisig, Multisig] [pallet_session, SessionBench::] [pallet_utility, Utility] + [pallet_sudo, Sudo] [pallet_timestamp, Timestamp] [pallet_collator_selection, CollatorSelection] [pallet_contracts, Contracts] diff --git a/parachains/runtimes/starters/seedling/src/lib.rs b/parachains/runtimes/starters/seedling/src/lib.rs index 2861cac1fe4..361e1f0ff54 100644 --- a/parachains/runtimes/starters/seedling/src/lib.rs +++ b/parachains/runtimes/starters/seedling/src/lib.rs @@ -160,6 +160,7 @@ impl frame_system::Config for Runtime { impl pallet_sudo::Config for Runtime { type RuntimeCall = RuntimeCall; type RuntimeEvent = RuntimeEvent; + type WeightInfo = pallet_sudo::weights::SubstrateWeight; } impl cumulus_pallet_solo_to_para::Config for Runtime { diff --git a/parachains/runtimes/testing/penpal/Cargo.toml b/parachains/runtimes/testing/penpal/Cargo.toml index 2886d799a4c..a42bf488487 100644 --- a/parachains/runtimes/testing/penpal/Cargo.toml +++ b/parachains/runtimes/testing/penpal/Cargo.toml @@ -136,6 +136,7 @@ runtime-benchmarks = [ "pallet-assets/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", + "pallet-sudo/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-xcm/runtime-benchmarks", "sp-runtime/runtime-benchmarks", diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index 5a5cb423d43..0158f3b336f 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -547,6 +547,7 @@ impl pallet_asset_tx_payment::Config for Runtime { impl pallet_sudo::Config for Runtime { type RuntimeEvent = RuntimeEvent; type RuntimeCall = RuntimeCall; + type WeightInfo = pallet_sudo::weights::SubstrateWeight; } // Create the runtime by composing the FRAME pallets that were previously configured. @@ -599,6 +600,7 @@ mod benches { [frame_system, SystemBench::] [pallet_balances, Balances] [pallet_session, SessionBench::] + [pallet_sudo, Sudo] [pallet_timestamp, Timestamp] [pallet_collator_selection, CollatorSelection] [cumulus_pallet_xcmp_queue, XcmpQueue] diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 4d539f050e1..1b192972a1f 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -255,6 +255,7 @@ impl pallet_transaction_payment::Config for Runtime { impl pallet_sudo::Config for Runtime { type RuntimeCall = RuntimeCall; type RuntimeEvent = RuntimeEvent; + type WeightInfo = pallet_sudo::weights::SubstrateWeight; } parameter_types! { diff --git a/test/runtime/src/lib.rs b/test/runtime/src/lib.rs index 9d7e9f078da..23e5aa0e177 100644 --- a/test/runtime/src/lib.rs +++ b/test/runtime/src/lib.rs @@ -262,6 +262,7 @@ impl pallet_transaction_payment::Config for Runtime { impl pallet_sudo::Config for Runtime { type RuntimeCall = RuntimeCall; type RuntimeEvent = RuntimeEvent; + type WeightInfo = pallet_sudo::weights::SubstrateWeight; } impl cumulus_pallet_parachain_system::Config for Runtime { From 0ea1814c0c95705b2ef60e69287c1941d5976025 Mon Sep 17 00:00:00 2001 From: Falco Hirschenberger Date: Thu, 11 May 2023 20:27:33 +0200 Subject: [PATCH 180/339] companion PR for https://github.com/paritytech/substrate/pull/13373 (#2547) * companion PR for https://github.com/paritytech/substrate/pull/13373 * Add missing trait function * Fix template Signed-off-by: Oliver Tale-Yazdi * Add missing weight functions Signed-off-by: Oliver Tale-Yazdi * update lockfile for {"polkadot", "substrate"} --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: Falco Hirschenberger Co-authored-by: Oliver Tale-Yazdi Co-authored-by: parity-processbot <> --- Cargo.lock | 517 +++++++++--------- .../statemine/src/weights/frame_system.rs | 3 + .../statemint/src/weights/frame_system.rs | 3 + .../westmint/src/weights/frame_system.rs | 3 + .../src/weights/frame_system.rs | 3 + .../src/weights/frame_system.rs | 3 + .../src/weights/frame_system.rs | 3 + .../src/weights/frame_system.rs | 3 + 8 files changed, 280 insertions(+), 258 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f702ccc7870..8eb6208340b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,7 +585,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "hash-db", "log", @@ -3762,7 +3762,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", ] @@ -3785,7 +3785,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-support-procedural", @@ -3810,7 +3810,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3857,7 +3857,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3868,7 +3868,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3885,7 +3885,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-system", @@ -3914,7 +3914,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-recursion", "futures", @@ -3934,7 +3934,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "bitflags", "environmental", @@ -3967,7 +3967,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "Inflector", "cfg-expr", @@ -3983,7 +3983,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3995,7 +3995,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "proc-macro2", "quote", @@ -4005,8 +4005,9 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ + "cfg-if", "frame-support", "log", "parity-scale-codec", @@ -4023,7 +4024,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -4038,7 +4039,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "sp-api", @@ -4047,7 +4048,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "parity-scale-codec", @@ -5064,7 +5065,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bitvec", "frame-benchmarking", @@ -5162,7 +5163,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "frame-support", "polkadot-primitives", @@ -6016,7 +6017,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "futures", "log", @@ -6035,7 +6036,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "anyhow", "jsonrpsee", @@ -6540,7 +6541,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6561,7 +6562,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -6579,7 +6580,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -6594,7 +6595,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-system", @@ -6610,7 +6611,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-system", @@ -6626,7 +6627,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-system", @@ -6640,7 +6641,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -6664,7 +6665,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6684,7 +6685,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -6699,7 +6700,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-system", @@ -6718,7 +6719,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6742,7 +6743,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -6848,7 +6849,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -6892,7 +6893,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -6909,7 +6910,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "bitflags", "environmental", @@ -6939,7 +6940,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "bitflags", "parity-scale-codec", @@ -6952,7 +6953,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "proc-macro2", "quote", @@ -6962,7 +6963,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6979,7 +6980,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -6997,7 +6998,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7020,7 +7021,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7033,7 +7034,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7051,7 +7052,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7069,7 +7070,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7092,7 +7093,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7108,7 +7109,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7128,7 +7129,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7145,7 +7146,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-system", @@ -7159,7 +7160,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7176,7 +7177,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7193,7 +7194,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7209,7 +7210,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7227,7 +7228,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "pallet-nfts", @@ -7238,7 +7239,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7254,7 +7255,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-system", @@ -7271,7 +7272,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7291,7 +7292,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7302,7 +7303,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-system", @@ -7319,7 +7320,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7358,7 +7359,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7375,7 +7376,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7390,7 +7391,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7408,7 +7409,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7423,7 +7424,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7442,7 +7443,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7459,7 +7460,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-system", @@ -7480,7 +7481,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7496,7 +7497,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-system", @@ -7510,7 +7511,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7533,7 +7534,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7544,7 +7545,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "log", "sp-arithmetic", @@ -7553,7 +7554,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "sp-api", @@ -7562,7 +7563,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7579,7 +7580,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7594,7 +7595,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7612,7 +7613,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7631,7 +7632,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-support", "frame-system", @@ -7647,7 +7648,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7663,7 +7664,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7675,7 +7676,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7692,7 +7693,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7707,7 +7708,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7723,7 +7724,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7738,7 +7739,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-benchmarking", "frame-support", @@ -7753,7 +7754,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7774,7 +7775,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "frame-benchmarking", "frame-support", @@ -8352,7 +8353,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8368,7 +8369,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8382,7 +8383,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "derive_more", "fatality", @@ -8405,7 +8406,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "fatality", "futures", @@ -8426,7 +8427,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8455,7 +8456,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "async-trait", "frame-benchmarking", @@ -8498,7 +8499,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "always-assert", "bitvec", @@ -8520,7 +8521,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "parity-scale-codec", "scale-info", @@ -8532,7 +8533,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "derive_more", "fatality", @@ -8557,7 +8558,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8571,7 +8572,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "futures", "futures-timer", @@ -8591,7 +8592,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "always-assert", "async-trait", @@ -8614,7 +8615,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "futures", "parity-scale-codec", @@ -8632,7 +8633,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bitvec", "derive_more", @@ -8661,7 +8662,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bitvec", "futures", @@ -8682,7 +8683,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bitvec", "fatality", @@ -8701,7 +8702,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8716,7 +8717,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "async-trait", "futures", @@ -8736,7 +8737,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "futures", "polkadot-node-metrics", @@ -8751,7 +8752,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "futures", "futures-timer", @@ -8768,7 +8769,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "fatality", "futures", @@ -8787,7 +8788,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "async-trait", "futures", @@ -8804,7 +8805,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bitvec", "fatality", @@ -8822,7 +8823,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "always-assert", "futures", @@ -8849,7 +8850,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "futures", "polkadot-node-primitives", @@ -8865,7 +8866,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "assert_matches", "cpu-time", @@ -8894,7 +8895,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "futures", "lru 0.9.0", @@ -8909,7 +8910,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "lazy_static", "log", @@ -8927,7 +8928,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bs58", "futures", @@ -8946,7 +8947,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "async-trait", "derive_more", @@ -8968,7 +8969,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bounded-vec", "futures", @@ -8990,7 +8991,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9000,7 +9001,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "async-trait", "futures", @@ -9018,7 +9019,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "async-trait", "derive_more", @@ -9041,7 +9042,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "async-trait", "derive_more", @@ -9074,7 +9075,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "async-trait", "futures", @@ -9097,7 +9098,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bounded-collections", "derive_more", @@ -9195,7 +9196,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9213,7 +9214,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9239,7 +9240,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9271,7 +9272,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bitvec", "frame-benchmarking", @@ -9365,7 +9366,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bitvec", "frame-benchmarking", @@ -9411,7 +9412,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "frame-support", "polkadot-primitives", @@ -9425,7 +9426,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bs58", "parity-scale-codec", @@ -9437,7 +9438,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bitflags", "bitvec", @@ -9481,7 +9482,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9591,7 +9592,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9612,7 +9613,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9622,7 +9623,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9647,7 +9648,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9708,7 +9709,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "frame-benchmarking", "frame-system", @@ -10491,7 +10492,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10577,7 +10578,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "frame-support", "polkadot-primitives", @@ -10824,7 +10825,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "log", "sp-core", @@ -10835,7 +10836,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "futures", @@ -10863,7 +10864,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "futures", "futures-timer", @@ -10886,7 +10887,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10901,7 +10902,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10920,7 +10921,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10931,7 +10932,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -10971,7 +10972,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "fnv", "futures", @@ -10998,7 +10999,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "hash-db", "kvdb", @@ -11024,7 +11025,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "futures", @@ -11049,7 +11050,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "futures", @@ -11078,7 +11079,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "fork-tree", @@ -11114,7 +11115,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "futures", "jsonrpsee", @@ -11136,7 +11137,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11171,7 +11172,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "futures", "jsonrpsee", @@ -11190,7 +11191,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11203,7 +11204,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11243,7 +11244,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "finality-grandpa", "futures", @@ -11263,7 +11264,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "futures", @@ -11286,7 +11287,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11310,7 +11311,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11323,7 +11324,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "log", "sc-allocator", @@ -11336,7 +11337,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "anyhow", "cfg-if", @@ -11354,7 +11355,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "ansi_term", "futures", @@ -11370,7 +11371,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11384,7 +11385,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11429,7 +11430,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "cid", "futures", @@ -11449,7 +11450,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11477,7 +11478,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "ahash 0.8.2", "futures", @@ -11496,7 +11497,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11518,7 +11519,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11552,7 +11553,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11572,7 +11573,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11603,7 +11604,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "futures", "libp2p", @@ -11616,7 +11617,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11625,7 +11626,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "futures", "jsonrpsee", @@ -11656,7 +11657,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11675,7 +11676,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "http", "jsonrpsee", @@ -11690,7 +11691,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11716,7 +11717,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "directories", @@ -11782,7 +11783,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "log", "parity-scale-codec", @@ -11793,7 +11794,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "clap 4.2.7", "fs4", @@ -11809,7 +11810,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11828,7 +11829,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "futures", "libc", @@ -11847,7 +11848,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "chrono", "futures", @@ -11866,7 +11867,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "ansi_term", "atty", @@ -11897,7 +11898,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11908,7 +11909,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "futures", @@ -11935,7 +11936,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "futures", @@ -11949,7 +11950,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-channel", "futures", @@ -12430,7 +12431,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "enumn", "parity-scale-codec", @@ -12507,7 +12508,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "hash-db", "log", @@ -12527,7 +12528,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "Inflector", "blake2", @@ -12541,7 +12542,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "scale-info", @@ -12554,7 +12555,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "integer-sqrt", "num-traits", @@ -12568,7 +12569,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "scale-info", @@ -12581,7 +12582,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "sp-api", @@ -12593,7 +12594,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "futures", "log", @@ -12611,7 +12612,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "futures", @@ -12626,7 +12627,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "parity-scale-codec", @@ -12644,7 +12645,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "parity-scale-codec", @@ -12665,7 +12666,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12684,7 +12685,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "finality-grandpa", "log", @@ -12702,7 +12703,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "scale-info", @@ -12714,7 +12715,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12758,7 +12759,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "blake2b_simd", "byteorder", @@ -12772,7 +12773,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "proc-macro2", "quote", @@ -12783,7 +12784,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12792,7 +12793,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "proc-macro2", "quote", @@ -12802,7 +12803,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "environmental", "parity-scale-codec", @@ -12813,7 +12814,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12828,7 +12829,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "bytes", "ed25519", @@ -12854,7 +12855,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "lazy_static", "sp-core", @@ -12865,7 +12866,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "futures", "parity-scale-codec", @@ -12879,7 +12880,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12888,7 +12889,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12899,7 +12900,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12917,7 +12918,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "scale-info", @@ -12931,7 +12932,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "sp-api", "sp-core", @@ -12941,7 +12942,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "backtrace", "lazy_static", @@ -12951,7 +12952,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "rustc-hash", "serde", @@ -12961,7 +12962,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "either", "hash256-std-hasher", @@ -12983,7 +12984,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13001,7 +13002,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "Inflector", "proc-macro-crate", @@ -13013,7 +13014,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "serde", "serde_json", @@ -13022,7 +13023,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "scale-info", @@ -13036,7 +13037,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "scale-info", @@ -13049,7 +13050,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "hash-db", "log", @@ -13069,7 +13070,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "log", "parity-scale-codec", @@ -13087,12 +13088,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13105,7 +13106,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "futures-timer", @@ -13120,7 +13121,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "sp-std", @@ -13132,7 +13133,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "sp-api", "sp-runtime", @@ -13141,7 +13142,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "log", @@ -13157,7 +13158,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13180,7 +13181,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13197,7 +13198,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13208,7 +13209,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13222,7 +13223,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "parity-scale-codec", "scale-info", @@ -13557,7 +13558,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "platforms 2.0.0", ] @@ -13565,7 +13566,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13584,7 +13585,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "hyper", "log", @@ -13596,7 +13597,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "jsonrpsee", @@ -13609,7 +13610,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "jsonrpsee", "log", @@ -13628,7 +13629,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13654,7 +13655,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13664,7 +13665,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13675,7 +13676,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "ansi_term", "build-helper", @@ -13802,7 +13803,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "frame-support", "polkadot-primitives", @@ -14188,7 +14189,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14199,7 +14200,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14329,7 +14330,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#c09f0bc5e57fde3904da4600ff3ba23b1b00022e" +source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" dependencies = [ "async-trait", "clap 4.2.7", @@ -15262,7 +15263,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bitvec", "frame-benchmarking", @@ -15354,7 +15355,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "frame-support", "polkadot-primitives", @@ -15856,7 +15857,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "bounded-collections", "derivative", @@ -15872,7 +15873,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "frame-support", "frame-system", @@ -15893,7 +15894,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "environmental", "frame-benchmarking", @@ -15913,7 +15914,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#0d09701a06cb55bbbec6776be07d11e83ec3fadf" +source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachains/runtimes/assets/statemine/src/weights/frame_system.rs b/parachains/runtimes/assets/statemine/src/weights/frame_system.rs index c708b9f30f7..89098f48120 100644 --- a/parachains/runtimes/assets/statemine/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/statemine/src/weights/frame_system.rs @@ -70,6 +70,9 @@ impl frame_system::WeightInfo for WeightInfo { // Standard Error: 0 .saturating_add(Weight::from_parts(1_397, 0).saturating_mul(b.into())) } + fn set_code() -> Weight { + Weight::from_parts(1_000_000, 0) + } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) /// Storage: unknown `0x3a686561707061676573` (r:0 w:1) diff --git a/parachains/runtimes/assets/statemint/src/weights/frame_system.rs b/parachains/runtimes/assets/statemint/src/weights/frame_system.rs index c8672db59ad..9884d6d9c3d 100644 --- a/parachains/runtimes/assets/statemint/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/statemint/src/weights/frame_system.rs @@ -70,6 +70,9 @@ impl frame_system::WeightInfo for WeightInfo { // Standard Error: 1 .saturating_add(Weight::from_parts(1_406, 0).saturating_mul(b.into())) } + fn set_code() -> Weight { + Weight::from_parts(1_000_000, 0) + } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) /// Storage: unknown `0x3a686561707061676573` (r:0 w:1) diff --git a/parachains/runtimes/assets/westmint/src/weights/frame_system.rs b/parachains/runtimes/assets/westmint/src/weights/frame_system.rs index faa5dc2f76c..2515235087d 100644 --- a/parachains/runtimes/assets/westmint/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/westmint/src/weights/frame_system.rs @@ -84,6 +84,9 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } + fn set_code() -> Weight { + Weight::from_parts(1_000_000, 0) + } /// Storage: Skipped Metadata (r:0 w:0) /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[0, 1000]`. diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs index e024fbf3a2c..854a7b9ba5f 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs @@ -70,6 +70,9 @@ impl frame_system::WeightInfo for WeightInfo { // Standard Error: 0 .saturating_add(Weight::from_parts(1_451, 0).saturating_mul(b.into())) } + fn set_code() -> Weight { + Weight::from_parts(1_000_000, 0) + } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) /// Storage: unknown `0x3a686561707061676573` (r:0 w:1) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs index b678dde042e..7ca54d2e135 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs @@ -84,6 +84,9 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } + fn set_code() -> Weight { + Weight::from_parts(1_000_000, 0) + } /// Storage: Skipped Metadata (r:0 w:0) /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[0, 1000]`. diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs index bc032cff788..a7d6083d2a6 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs @@ -70,6 +70,9 @@ impl frame_system::WeightInfo for WeightInfo { // Standard Error: 0 .saturating_add(Weight::from_parts(1_404, 0).saturating_mul(b.into())) } + fn set_code() -> Weight { + Weight::from_parts(1_000_000, 0) + } /// Storage: System Digest (r:1 w:1) /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) /// Storage: unknown `0x3a686561707061676573` (r:0 w:1) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs index 3ed39207605..634757aa60b 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs @@ -84,6 +84,9 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } + fn set_code() -> Weight { + Weight::from_parts(1_000_000, 0) + } /// Storage: Skipped Metadata (r:0 w:0) /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[0, 1000]`. From 233e3a9b11e0827bf77ece9f2942b675ef10a79d Mon Sep 17 00:00:00 2001 From: Sasha Gryaznov Date: Thu, 11 May 2023 23:19:36 +0300 Subject: [PATCH 181/339] docs: fix build command and some broken links (#2567) --- README.md | 8 ++++---- .../runtimes/contracts/contracts-rococo/README.md | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index d1828eafce1..d8c8b204b72 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,7 @@ To run a Statemine or Westmint node (Statemint is not deployed, yet) you will ne `polkadot-parachain` binary: ```bash -cargo build --release --locked -p polkadot-parachain +cargo build --release --locked --bin polkadot-parachain ``` Once the executable is built, launch the parachain node via: @@ -189,7 +189,7 @@ CHAIN=westmint # or statemine ./target/release/polkadot-parachain --chain $CHAIN ``` -Refer to the [setup instructions](#local-setup) to run a local network for development. +Refer to the [setup instructions](#manual-setup) to run a local network for development. ## Contracts 📝 @@ -219,7 +219,7 @@ eventually be included by the relay chain for a parachain. To run a Rococo collator you will need to compile the following binary: ```bash -cargo build --release --locked -p polkadot-parachain +cargo build --release --locked --bin polkadot-parachain ``` Otherwise you can compile it with @@ -228,7 +228,7 @@ Otherwise you can compile it with ```bash docker run --rm -it -w /shellhere/cumulus \ -v $(pwd):/shellhere/cumulus \ - paritytech/ci-linux:production cargo build --release --locked -p polkadot-parachain + paritytech/ci-linux:production cargo build --release --locked --bin polkadot-parachain sudo chown -R $(id -u):$(id -g) target/ ``` diff --git a/parachains/runtimes/contracts/contracts-rococo/README.md b/parachains/runtimes/contracts/contracts-rococo/README.md index 973d84a14b8..e4f15ccf92d 100644 --- a/parachains/runtimes/contracts/contracts-rococo/README.md +++ b/parachains/runtimes/contracts/contracts-rococo/README.md @@ -45,7 +45,7 @@ To run a Contracts node that connects to Rococo you will need to compile the `polkadot-parachain` binary: ```bash -cargo build --release --locked -p polkadot-parachain +cargo build --release --locked --bin polkadot-parachain ``` Once the executable is built, launch the parachain node via: @@ -54,7 +54,7 @@ Once the executable is built, launch the parachain node via: ./target/release/polkadot-parachain --chain contracts-rococo ``` -Refer to the [setup instructions below](#local-setup) to run a local network for development. +Refer to the [setup instructions](https://github.com/paritytech/cumulus#manual-setup) to run a local network for development. ### Rococo Deployment @@ -70,8 +70,8 @@ Due to this you'll need `ROC` in order to deploy contracts on this parachain. As a first step, you should create an account. See [here](https://wiki.polkadot.network/docs/learn-account-generation) for a detailed guide. -As a second step, you have to get `ROC` testnet tokens through the [Rococo Faucet](https://wiki.polkadot.network/docs/learn-DOT#getting-rococo-tokens). -This is a chat room in which you need to write: +As a second step, you have to get `ROC` testnet tokens through the [Rococo Faucet](https://wiki.polkadot.network/docs/learn-DOT#obtaining-testnet-tokens). +This is a chat room in which you'd need to post the following message: ```bash !drip YOUR_SS_58_ADDRESS:1002 @@ -84,5 +84,5 @@ If everything worked out, the teleported `ROC` tokens will show up under [the "Accounts" tab](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-contracts-rpc.polkadot.io#/accounts). Once you have `ROC` you can deploy a contract as you would normally. -If you're unsure about this, our [guided tutorial](https://docs.substrate.io/tutorials/v3/ink-workshop/pt1/) +If you're unsure about this, our [guided tutorial](https://use.ink/getting-started/deploy-your-contract) will clarify that for you in no time. From b3da625193bf03a08f44655f69d0c67cf067e8bd Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Fri, 12 May 2023 10:44:15 +0200 Subject: [PATCH 182/339] Bump parity-db (#2559) --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8eb6208340b..2f653571768 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7940,9 +7940,9 @@ dependencies = [ [[package]] name = "parity-db" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00bfb81cf5c90a222db2fb7b3a7cbf8cc7f38dfb6647aca4d98edf8281f56ed5" +checksum = "bd4572a52711e2ccff02b4973ec7e4a5b5c23387ebbfbd6cd42b34755714cefc" dependencies = [ "blake2", "crc32fast", @@ -14397,7 +14397,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.6", - "rand 0.8.5", + "rand 0.7.3", "static_assertions", ] From c24dcd892446d5540755b039f36e521fc1e49d61 Mon Sep 17 00:00:00 2001 From: Anton Date: Fri, 12 May 2023 16:36:58 +0400 Subject: [PATCH 183/339] [Substrate Companion] Upgrade to libp2p 0.51.3 (#2429) * upgrade js-sys to 0.3.61 * update wasm-bindgen-futures * update zeroize * update either * update once_cell --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2f653571768..0911f013c4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3344,9 +3344,9 @@ dependencies = [ [[package]] name = "either" -version = "1.6.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "elliptic-curve" @@ -4892,9 +4892,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -6431,9 +6431,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "oorandom" @@ -14601,9 +14601,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -14611,13 +14611,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn 1.0.109", @@ -14626,9 +14626,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.28" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" dependencies = [ "cfg-if", "js-sys", @@ -14638,9 +14638,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -14648,9 +14648,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -14661,9 +14661,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasm-instrument" @@ -15947,9 +15947,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" dependencies = [ "zeroize_derive", ] From d4caecb7f1216ad30d2ea8b1448befee1b77bb92 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Fri, 12 May 2023 14:46:25 +0200 Subject: [PATCH 184/339] [Backport] version bumps from 9420 (#2561) * Bump crate versions * Bump spec_version to 9420 * Bump transaction_version (#2520) * bump trnsaction_version * revert transaction_version bump for all except the collectives * make cargo fmt happy again --- Cargo.lock | 2 +- parachains/runtimes/assets/statemine/src/lib.rs | 4 ++-- parachains/runtimes/assets/statemint/src/lib.rs | 2 +- parachains/runtimes/assets/westmint/src/lib.rs | 2 +- parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs | 2 +- .../runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs | 2 +- parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs | 2 +- .../runtimes/collectives/collectives-polkadot/src/lib.rs | 4 ++-- parachains/runtimes/contracts/contracts-rococo/src/lib.rs | 2 +- parachains/runtimes/starters/seedling/src/lib.rs | 2 +- parachains/runtimes/testing/penpal/src/lib.rs | 2 +- parachains/runtimes/testing/rococo-parachain/src/lib.rs | 2 +- polkadot-parachain/Cargo.toml | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0911f013c4f..552ef2bb432 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9114,7 +9114,7 @@ dependencies = [ [[package]] name = "polkadot-parachain-bin" -version = "0.9.400" +version = "0.9.420" dependencies = [ "assert_cmd", "async-trait", diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index eacd865200b..490da2d0b10 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -97,7 +97,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 13, @@ -110,7 +110,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 13, diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index b697a7902a7..8d2c3e317c6 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -120,7 +120,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemint"), impl_name: create_runtime_str!("statemint"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 13, diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index d5ac6103d97..83762145cf6 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -96,7 +96,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westmint"), impl_name: create_runtime_str!("westmint"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 13, diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs index ec9d9f09e41..15da2331e7d 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -128,7 +128,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-kusama"), impl_name: create_runtime_str!("bridge-hub-kusama"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 3, diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs index b701645ed17..3e29616a2c2 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -128,7 +128,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-polkadot"), impl_name: create_runtime_str!("bridge-hub-polkadot"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 2, diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 15e34472fc6..dc42ff8d699 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -147,7 +147,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-rococo"), impl_name: create_runtime_str!("bridge-hub-rococo"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 3, diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs index b902e694a15..5806e02c6a5 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs @@ -108,10 +108,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("collectives"), impl_name: create_runtime_str!("collectives"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 4, + transaction_version: 5, state_version: 0, }; diff --git a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 38d32895363..4266a4219e8 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -125,7 +125,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("contracts-rococo"), impl_name: create_runtime_str!("contracts-rococo"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, diff --git a/parachains/runtimes/starters/seedling/src/lib.rs b/parachains/runtimes/starters/seedling/src/lib.rs index 361e1f0ff54..e99ead3a9d6 100644 --- a/parachains/runtimes/starters/seedling/src/lib.rs +++ b/parachains/runtimes/starters/seedling/src/lib.rs @@ -67,7 +67,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("seedling"), impl_name: create_runtime_str!("seedling"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 2, diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index 0158f3b336f..8e06d986df7 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -224,7 +224,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("penpal-parachain"), impl_name: create_runtime_str!("penpal-parachain"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 1b192972a1f..efd60119105 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -101,7 +101,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("test-parachain"), impl_name: create_runtime_str!("test-parachain"), authoring_version: 1, - spec_version: 9400, + spec_version: 9420, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 78f5fc83dab..d872c7cdf6e 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain-bin" -version = "0.9.400" +version = "0.9.420" authors = ["Parity Technologies "] build = "build.rs" edition = "2021" From f7bed4b103c495186f3d8fd9bfa817cd74e9a7ce Mon Sep 17 00:00:00 2001 From: asynchronous rob Date: Sat, 13 May 2023 00:48:32 -0500 Subject: [PATCH 185/339] Relay-parent digest logs for parachains (#2552) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add digest item for relay-parent to primitives * add a relay-parent-storage-root digest as a workaround * more docs * deposit log in pallet-parachain-system * even more docs * fix duplicate imports after botched mertge * fix hyperlinks in docs * clean up match Co-authored-by: Bastian Köcher * improve docs * fix typo * add number to the digest item --------- Co-authored-by: Bastian Köcher --- pallets/parachain-system/src/lib.rs | 10 +++ pallets/parachain-system/src/tests.rs | 15 +++++ primitives/core/src/lib.rs | 90 ++++++++++++++++++++++++++- 3 files changed, 114 insertions(+), 1 deletion(-) diff --git a/pallets/parachain-system/src/lib.rs b/pallets/parachain-system/src/lib.rs index 36ef8d57195..b841820acfc 100644 --- a/pallets/parachain-system/src/lib.rs +++ b/pallets/parachain-system/src/lib.rs @@ -385,6 +385,16 @@ pub mod pallet { ) .expect("Invalid relay chain state proof"); + // Deposit a log indicating the relay-parent storage root. + // TODO: remove this in favor of the relay-parent's hash after + // https://github.com/paritytech/cumulus/issues/303 + frame_system::Pallet::::deposit_log( + cumulus_primitives_core::rpsr_digest::relay_parent_storage_root_item( + vfp.relay_parent_storage_root, + vfp.relay_parent_number, + ), + ); + // initialization logic: we know that this runs exactly once every block, // which means we can put the initialization logic here to remove the // sequencing problem. diff --git a/pallets/parachain-system/src/tests.rs b/pallets/parachain-system/src/tests.rs index a4b1c275b7a..cfbe834983c 100755 --- a/pallets/parachain-system/src/tests.rs +++ b/pallets/parachain-system/src/tests.rs @@ -1006,3 +1006,18 @@ fn upgrade_version_checks_should_work() { }); } } + +#[test] +fn deposits_relay_parent_storage_root() { + BlockTests::new().add_with_post_test( + 123, + || {}, + || { + let digest = System::digest(); + assert!(cumulus_primitives_core::rpsr_digest::extract_relay_parent_storage_root( + &digest + ) + .is_some()); + }, + ); +} diff --git a/primitives/core/src/lib.rs b/primitives/core/src/lib.rs index 52770cdf716..752e1aee474 100644 --- a/primitives/core/src/lib.rs +++ b/primitives/core/src/lib.rs @@ -21,7 +21,7 @@ use codec::{Decode, Encode}; use polkadot_parachain::primitives::HeadData; use scale_info::TypeInfo; -use sp_runtime::{traits::Block as BlockT, RuntimeDebug}; +use sp_runtime::RuntimeDebug; use sp_std::prelude::*; pub use polkadot_core_primitives::InboundDownwardMessage; @@ -33,6 +33,12 @@ pub use polkadot_primitives::{ AbridgedHostConfiguration, AbridgedHrmpChannel, PersistedValidationData, }; +pub use sp_runtime::{ + generic::{Digest, DigestItem}, + traits::Block as BlockT, + ConsensusEngineId, +}; + pub use xcm::latest::prelude::*; /// A module that re-exports relevant relay chain definitions. @@ -198,6 +204,88 @@ impl ParachainBlockData { } } +/// A consensus engine ID indicating that this is a Cumulus Parachain. +pub const CUMULUS_CONSENSUS_ID: ConsensusEngineId = *b"CMLS"; + +/// Consensus header digests for Cumulus parachains. +#[derive(Clone, RuntimeDebug, Decode, Encode, PartialEq)] +pub enum CumulusDigestItem { + /// A digest item indicating the relay-parent a parachain block was built against. + #[codec(index = 0)] + RelayParent(relay_chain::Hash), +} + +impl CumulusDigestItem { + /// Encode this as a Substrate [`DigestItem`]. + pub fn to_digest_item(&self) -> DigestItem { + DigestItem::Consensus(CUMULUS_CONSENSUS_ID, self.encode()) + } +} + +/// Extract the relay-parent from the provided header digest. Returns `None` if none were found. +/// +/// If there are multiple valid digests, this returns the value of the first one, although +/// well-behaving runtimes should not produce headers with more than one. +pub fn extract_relay_parent(digest: &Digest) -> Option { + digest.convert_first(|d| match d { + DigestItem::Consensus(id, val) if id == &CUMULUS_CONSENSUS_ID => + match CumulusDigestItem::decode(&mut &val[..]) { + Ok(CumulusDigestItem::RelayParent(hash)) => Some(hash), + _ => None, + }, + _ => None, + }) +} + +/// Utilities for handling the relay-parent storage root as a digest item. +/// +/// This is not intended to be part of the public API, as it is a workaround for +/// via +/// . +/// +/// Runtimes using the parachain-system pallet are expected to produce this digest item, +/// but will stop as soon as they are able to provide the relay-parent hash directly. +/// +/// The relay-chain storage root is, in practice, a unique identifier of a block +/// in the absence of equivocations (which are slashable). This assumes that the relay chain +/// uses BABE or SASSAFRAS, because the slot and the author's VRF randomness are both included +/// in the relay-chain storage root in both cases. +/// +/// Therefore, the relay-parent storage root is a suitable identifier of unique relay chain +/// blocks in low-value scenarios such as performance optimizations. +#[doc(hidden)] +pub mod rpsr_digest { + use super::{relay_chain, ConsensusEngineId, Decode, Digest, DigestItem, Encode}; + use codec::Compact; + + /// A consensus engine ID for relay-parent storage root digests. + pub const RPSR_CONSENSUS_ID: ConsensusEngineId = *b"RPSR"; + + /// Construct a digest item for relay-parent storage roots. + pub fn relay_parent_storage_root_item( + storage_root: relay_chain::Hash, + number: impl Into>, + ) -> DigestItem { + DigestItem::Consensus(RPSR_CONSENSUS_ID, (storage_root, number.into()).encode()) + } + + /// Extract the relay-parent storage root and number from the provided header digest. Returns `None` + /// if none were found. + pub fn extract_relay_parent_storage_root( + digest: &Digest, + ) -> Option<(relay_chain::Hash, relay_chain::BlockNumber)> { + digest.convert_first(|d| match d { + DigestItem::Consensus(id, val) if id == &RPSR_CONSENSUS_ID => { + let (h, n): (relay_chain::Hash, Compact) = + Decode::decode(&mut &val[..]).ok()?; + + Some((h, n.0)) + }, + _ => None, + }) + } +} + /// Information about a collation. /// /// This was used in version 1 of the [`CollectCollationInfo`] runtime api. From 89b7b06d2a3cc97616d2672958f3c137017eec0f Mon Sep 17 00:00:00 2001 From: asynchronous rob Date: Sun, 14 May 2023 14:56:05 -0500 Subject: [PATCH 186/339] Consensus utilities and rearchitecture for more dynamic collators (#2382) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * implement a proposer utility for consensus * tidy up deps of new proposer crate * implement a collator-service crate * rewrite cumulus-collator to use new service struct * implement a module for relay-chain-driven collators * adapt start_collator to use the new relay_chain_driven module * move collator-service to a public submodule * create an interface trait for the proposer * begin aura reimplementation * address review comments * update substrrate git ref * update polkadot-primitives refs * rough draft of aura collation using standalone fns * add a ServiceInterface * port aura reimpl to use new service trait * add an import queue utility crate * remove import queue crate in favor of module in common * implement new verification queue for aura * implement remaining behaviors * split 'collate' into smaller functions that could be pub * add telemetry * fix doc job? * Specify async-trait patch version Co-authored-by: Bastian Köcher * remove 'fn@' in doc string. Co-authored-by: Bastian Köcher * update variable names to be more readable * refactor proposer errors to anyhow/thiserror * remove manual span instrumentation Co-authored-by: Bastian Köcher * make slot_claim private * fix unused import * fmt * fmt * make clippy happy --------- Co-authored-by: Bastian Köcher --- Cargo.lock | 25 + Cargo.toml | 1 + client/collator/Cargo.toml | 4 +- client/collator/src/lib.rs | 363 +++++-------- client/collator/src/service.rs | 318 +++++++++++ client/consensus/aura/Cargo.toml | 11 + client/consensus/aura/src/lib.rs | 2 + client/consensus/aura/src/unstable_reimpl.rs | 529 +++++++++++++++++++ client/consensus/common/Cargo.toml | 2 + client/consensus/common/src/import_queue.rs | 77 +++ client/consensus/common/src/lib.rs | 2 + client/consensus/proposer/Cargo.toml | 20 + client/consensus/proposer/src/lib.rs | 137 +++++ 13 files changed, 1266 insertions(+), 225 deletions(-) create mode 100644 client/collator/src/service.rs create mode 100644 client/consensus/aura/src/unstable_reimpl.rs create mode 100644 client/consensus/common/src/import_queue.rs create mode 100644 client/consensus/proposer/Cargo.toml create mode 100644 client/consensus/proposer/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 552ef2bb432..d25c4e24344 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2225,10 +2225,17 @@ name = "cumulus-client-consensus-aura" version = "0.1.0" dependencies = [ "async-trait", + "cumulus-client-collator", "cumulus-client-consensus-common", + "cumulus-client-consensus-proposer", "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-relay-chain-interface", "futures", "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-overseer", + "polkadot-primitives", "sc-client-api", "sc-consensus", "sc-consensus-aura", @@ -2244,6 +2251,8 @@ dependencies = [ "sp-inherents", "sp-keystore", "sp-runtime", + "sp-state-machine", + "sp-timestamp", "substrate-prometheus-endpoint", "tracing", ] @@ -2268,12 +2277,28 @@ dependencies = [ "schnellru", "sp-blockchain", "sp-consensus", + "sp-core", "sp-runtime", "sp-tracing", "sp-trie", + "substrate-prometheus-endpoint", "tracing", ] +[[package]] +name = "cumulus-client-consensus-proposer" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "cumulus-primitives-parachain-inherent", + "sp-consensus", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "thiserror", +] + [[package]] name = "cumulus-client-consensus-relay-chain" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 4ceb8d5c04a..2e96126cfa6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ members = [ "client/cli", "client/consensus/aura", "client/consensus/common", + "client/consensus/proposer", "client/consensus/relay-chain", "client/network", "client/pov-recovery", diff --git a/client/collator/Cargo.toml b/client/collator/Cargo.toml index b8e05fd37c5..6b04a319dcc 100644 --- a/client/collator/Cargo.toml +++ b/client/collator/Cargo.toml @@ -5,15 +5,15 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] +parking_lot = "0.12.1" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } futures = "0.3.21" -parking_lot = "0.12.0" tracing = "0.1.25" # Substrate sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/client/collator/src/lib.rs b/client/collator/src/lib.rs index 9e3b4953c0a..aca40b2b342 100644 --- a/client/collator/src/lib.rs +++ b/client/collator/src/lib.rs @@ -16,50 +16,46 @@ //! Cumulus Collator implementation for Substrate. -use cumulus_client_network::WaitToAnnounce; use cumulus_primitives_core::{ - relay_chain::Hash as PHash, CollationInfo, CollectCollationInfo, ParachainBlockData, - PersistedValidationData, + relay_chain::Hash as PHash, CollectCollationInfo, PersistedValidationData, }; use sc_client_api::BlockBackend; -use sp_api::{ApiExt, ProvideRuntimeApi}; -use sp_consensus::BlockStatus; +use sp_api::ProvideRuntimeApi; use sp_core::traits::SpawnNamed; -use sp_runtime::traits::{Block as BlockT, HashFor, Header as HeaderT, Zero}; +use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; use cumulus_client_consensus_common::ParachainConsensus; -use polkadot_node_primitives::{ - BlockData, Collation, CollationGenerationConfig, CollationResult, MaybeCompressedPoV, PoV, -}; -use polkadot_node_subsystem::messages::{CollationGenerationMessage, CollatorProtocolMessage}; +use polkadot_node_primitives::{CollationResult, MaybeCompressedPoV}; use polkadot_overseer::Handle as OverseerHandle; use polkadot_primitives::{CollatorPair, Id as ParaId}; use codec::{Decode, Encode}; -use futures::{channel::oneshot, FutureExt}; -use parking_lot::Mutex; +use futures::prelude::*; use std::sync::Arc; -use tracing::Instrument; + +use crate::service::CollatorService; + +pub mod service; /// The logging target. const LOG_TARGET: &str = "cumulus-collator"; /// The implementation of the Cumulus `Collator`. +/// +/// Note that this implementation is soon to be deprecated and removed, and it is suggested to +/// directly use the [`CollatorService`] instead, so consensus engine implementations +/// live at the top level. pub struct Collator { - block_status: Arc, + service: CollatorService, parachain_consensus: Box>, - wait_to_announce: Arc>>, - runtime_api: Arc, } impl Clone for Collator { fn clone(&self) -> Self { - Self { - block_status: self.block_status.clone(), - wait_to_announce: self.wait_to_announce.clone(), + Collator { + service: self.service.clone(), parachain_consensus: self.parachain_consensus.clone(), - runtime_api: self.runtime_api.clone(), } } } @@ -73,159 +69,10 @@ where { /// Create a new instance. fn new( - block_status: Arc, - spawner: Arc, - announce_block: Arc>) + Send + Sync>, - runtime_api: Arc, + collator_service: CollatorService, parachain_consensus: Box>, ) -> Self { - let wait_to_announce = Arc::new(Mutex::new(WaitToAnnounce::new(spawner, announce_block))); - - Self { block_status, wait_to_announce, runtime_api, parachain_consensus } - } - - /// Checks the status of the given block hash in the Parachain. - /// - /// Returns `true` if the block could be found and is good to be build on. - fn check_block_status(&self, hash: Block::Hash, header: &Block::Header) -> bool { - match self.block_status.block_status(hash) { - Ok(BlockStatus::Queued) => { - tracing::debug!( - target: LOG_TARGET, - block_hash = ?hash, - "Skipping candidate production, because block is still queued for import.", - ); - false - }, - Ok(BlockStatus::InChainWithState) => true, - Ok(BlockStatus::InChainPruned) => { - tracing::error!( - target: LOG_TARGET, - "Skipping candidate production, because block `{:?}` is already pruned!", - hash, - ); - false - }, - Ok(BlockStatus::KnownBad) => { - tracing::error!( - target: LOG_TARGET, - block_hash = ?hash, - "Block is tagged as known bad and is included in the relay chain! Skipping candidate production!", - ); - false - }, - Ok(BlockStatus::Unknown) => { - if header.number().is_zero() { - tracing::error!( - target: LOG_TARGET, - block_hash = ?hash, - "Could not find the header of the genesis block in the database!", - ); - } else { - tracing::debug!( - target: LOG_TARGET, - block_hash = ?hash, - "Skipping candidate production, because block is unknown.", - ); - } - false - }, - Err(e) => { - tracing::error!( - target: LOG_TARGET, - block_hash = ?hash, - error = ?e, - "Failed to get block status.", - ); - false - }, - } - } - - /// Fetch the collation info from the runtime. - /// - /// Returns `Ok(Some(_))` on success, `Err(_)` on error or `Ok(None)` if the runtime api isn't implemented by the runtime. - fn fetch_collation_info( - &self, - block_hash: Block::Hash, - header: &Block::Header, - ) -> Result, sp_api::ApiError> { - let runtime_api = self.runtime_api.runtime_api(); - - let api_version = - match runtime_api.api_version::>(block_hash)? { - Some(version) => version, - None => { - tracing::error!( - target: LOG_TARGET, - "Could not fetch `CollectCollationInfo` runtime api version." - ); - return Ok(None) - }, - }; - - let collation_info = if api_version < 2 { - #[allow(deprecated)] - runtime_api - .collect_collation_info_before_version_2(block_hash)? - .into_latest(header.encode().into()) - } else { - runtime_api.collect_collation_info(block_hash, header)? - }; - - Ok(Some(collation_info)) - } - - fn build_collation( - &self, - block: ParachainBlockData, - block_hash: Block::Hash, - pov: PoV, - ) -> Option { - let collation_info = self - .fetch_collation_info(block_hash, block.header()) - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Failed to collect collation info.", - ) - }) - .ok() - .flatten()?; - - let upward_messages = collation_info - .upward_messages - .try_into() - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Number of upward messages should not be greater than `MAX_UPWARD_MESSAGE_NUM`", - ) - }) - .ok()?; - let horizontal_messages = collation_info - .horizontal_messages - .try_into() - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Number of horizontal messages should not be greater than `MAX_HORIZONTAL_MESSAGE_NUM`", - ) - }) - .ok()?; - - Some(Collation { - upward_messages, - new_validation_code: collation_info.new_validation_code, - processed_downward_messages: collation_info.processed_downward_messages, - horizontal_messages, - hrmp_watermark: collation_info.hrmp_watermark, - head_data: collation_info.head_data, - proof_of_validity: MaybeCompressedPoV::Compressed(pov), - }) + Self { service: collator_service, parachain_consensus } } async fn produce_candidate( @@ -252,7 +99,7 @@ where }; let last_head_hash = last_head.hash(); - if !self.check_block_status(last_head_hash, &last_head) { + if !self.service.check_block_status(last_head_hash, &last_head) { return None } @@ -268,19 +115,9 @@ where .produce_candidate(&last_head, relay_parent, &validation_data) .await?; - let (header, extrinsics) = candidate.block.deconstruct(); - - let compact_proof = - match candidate.proof.into_compact_proof::>(*last_head.state_root()) { - Ok(proof) => proof, - Err(e) => { - tracing::error!(target: "cumulus-collator", "Failed to compact proof: {:?}", e); - return None - }, - }; + let block_hash = candidate.block.header().hash(); - // Create the parachain block data for the validators. - let b = ParachainBlockData::::new(header, extrinsics, compact_proof); + let (collation, b) = self.service.build_collation(&last_head, block_hash, candidate)?; tracing::info!( target: LOG_TARGET, @@ -290,25 +127,109 @@ where b.storage_proof().encode().len() as f64 / 1024f64, ); - let pov = - polkadot_node_primitives::maybe_compress_pov(PoV { block_data: BlockData(b.encode()) }); + if let MaybeCompressedPoV::Compressed(ref pov) = collation.proof_of_validity { + tracing::info!( + target: LOG_TARGET, + "Compressed PoV size: {}kb", + pov.block_data.0.len() as f64 / 1024f64, + ); + } - tracing::info!( - target: LOG_TARGET, - "Compressed PoV size: {}kb", - pov.block_data.0.len() as f64 / 1024f64, - ); + let result_sender = self.service.announce_with_barrier(block_hash); - let block_hash = b.header().hash(); - let collation = self.build_collation(b, block_hash, pov)?; + tracing::info!(target: LOG_TARGET, ?block_hash, "Produced proof-of-validity candidate.",); - let (result_sender, signed_stmt_recv) = oneshot::channel(); + Some(CollationResult { collation, result_sender: Some(result_sender) }) + } +} - self.wait_to_announce.lock().wait_to_announce(block_hash, signed_stmt_recv); +/// Relay-chain-driven collators are those whose block production is driven purely +/// by new relay chain blocks and the most recently included parachain blocks +/// within them. +/// +/// This method of driving collators is not suited to anything but the most simple parachain +/// consensus mechanisms, and this module may soon be deprecated. +pub mod relay_chain_driven { + use futures::{ + channel::{mpsc, oneshot}, + prelude::*, + }; + use polkadot_node_primitives::{CollationGenerationConfig, CollationResult}; + use polkadot_node_subsystem::messages::{CollationGenerationMessage, CollatorProtocolMessage}; + use polkadot_overseer::Handle as OverseerHandle; + use polkadot_primitives::{CollatorPair, Id as ParaId}; - tracing::info!(target: LOG_TARGET, ?block_hash, "Produced proof-of-validity candidate.",); + use cumulus_primitives_core::{relay_chain::Hash as PHash, PersistedValidationData}; - Some(CollationResult { collation, result_sender: Some(result_sender) }) + /// A request to author a collation, based on the advancement of the relay chain. + /// + /// See the module docs for more info on relay-chain-driven collators. + pub struct CollationRequest { + relay_parent: PHash, + pvd: PersistedValidationData, + sender: oneshot::Sender>, + } + + impl CollationRequest { + /// Get the relay parent of the collation request. + pub fn relay_parent(&self) -> &PHash { + &self.relay_parent + } + + /// Get the [`PersistedValidationData`] for the request. + pub fn persisted_validation_data(&self) -> &PersistedValidationData { + &self.pvd + } + + /// Complete the request with a collation, if any. + pub fn complete(self, collation: Option) { + let _ = self.sender.send(collation); + } + } + + /// Initialize the collator with Polkadot's collation-generation + /// subsystem, returning a stream of collation requests to handle. + pub async fn init( + key: CollatorPair, + para_id: ParaId, + overseer_handle: OverseerHandle, + ) -> mpsc::Receiver { + let mut overseer_handle = overseer_handle; + + let (stream_tx, stream_rx) = mpsc::channel(0); + let config = CollationGenerationConfig { + key, + para_id, + collator: Box::new(move |relay_parent, validation_data| { + // Cloning the channel on each usage effectively makes the channel + // unbounded. The channel is actually bounded by the block production + // and consensus systems of Polkadot, which limits the amount of possible + // blocks. + let mut stream_tx = stream_tx.clone(); + let validation_data = validation_data.clone(); + Box::pin(async move { + let (this_tx, this_rx) = oneshot::channel(); + let request = + CollationRequest { relay_parent, pvd: validation_data, sender: this_tx }; + + if stream_tx.send(request).await.is_err() { + return None + } + + this_rx.await.ok().flatten() + }) + }), + }; + + overseer_handle + .send_msg(CollationGenerationMessage::Initialize(config), "StartCollator") + .await; + + overseer_handle + .send_msg(CollatorProtocolMessage::CollateOn(para_id), "StartCollator") + .await; + + stream_rx } } @@ -330,7 +251,7 @@ pub async fn start_collator( para_id, block_status, announce_block, - mut overseer_handle, + overseer_handle, spawner, key, parachain_consensus, @@ -343,34 +264,28 @@ pub async fn start_collator( RA: ProvideRuntimeApi + Send + Sync + 'static, RA::Api: CollectCollationInfo, { - let collator = Collator::new( - block_status, - Arc::new(spawner), - announce_block, - runtime_api, - parachain_consensus, - ); + let collator_service = + CollatorService::new(block_status, Arc::new(spawner.clone()), announce_block, runtime_api); - let span = tracing::Span::current(); - let config = CollationGenerationConfig { - key, - para_id, - collator: Box::new(move |relay_parent, validation_data| { - let collator = collator.clone(); - collator - .produce_candidate(relay_parent, validation_data.clone()) - .instrument(span.clone()) - .boxed() - }), - }; + let collator = Collator::new(collator_service, parachain_consensus); + + let mut request_stream = relay_chain_driven::init(key, para_id, overseer_handle).await; - overseer_handle - .send_msg(CollationGenerationMessage::Initialize(config), "StartCollator") - .await; + let collation_future = Box::pin(async move { + while let Some(request) = request_stream.next().await { + let collation = collator + .clone() + .produce_candidate( + *request.relay_parent(), + request.persisted_validation_data().clone(), + ) + .await; + + request.complete(collation); + } + }); - overseer_handle - .send_msg(CollatorProtocolMessage::CollateOn(para_id), "StartCollator") - .await; + spawner.spawn("cumulus-relay-driven-collator", None, collation_future); } #[cfg(test)] @@ -378,12 +293,14 @@ mod tests { use super::*; use async_trait::async_trait; use cumulus_client_consensus_common::ParachainCandidate; + use cumulus_primitives_core::ParachainBlockData; use cumulus_test_client::{ Client, ClientBlockImportExt, DefaultTestClientBuilderExt, InitBlockBuilder, TestClientBuilder, TestClientBuilderExt, }; use cumulus_test_runtime::{Block, Header}; use futures::{channel::mpsc, executor::block_on, StreamExt}; + use polkadot_node_subsystem::messages::CollationGenerationMessage; use polkadot_node_subsystem_test_helpers::ForwardSubsystem; use polkadot_overseer::{dummy::dummy_overseer_builder, HeadSupportsParachains}; use sp_consensus::BlockOrigin; diff --git a/client/collator/src/service.rs b/client/collator/src/service.rs new file mode 100644 index 00000000000..7724b0a68a6 --- /dev/null +++ b/client/collator/src/service.rs @@ -0,0 +1,318 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! The Cumulus [`CollatorService`] is a utility struct for performing common +//! operations used in parachain consensus/authoring. + +use cumulus_client_network::WaitToAnnounce; +use cumulus_primitives_core::{CollationInfo, CollectCollationInfo, ParachainBlockData}; + +use sc_client_api::BlockBackend; +use sp_api::{ApiExt, ProvideRuntimeApi}; +use sp_consensus::BlockStatus; +use sp_core::traits::SpawnNamed; +use sp_runtime::traits::{Block as BlockT, HashFor, Header as HeaderT, Zero}; + +use cumulus_client_consensus_common::ParachainCandidate; +use polkadot_node_primitives::{ + BlockData, Collation, CollationSecondedSignal, MaybeCompressedPoV, PoV, +}; + +use codec::Encode; +use futures::channel::oneshot; +use parking_lot::Mutex; +use std::sync::Arc; + +/// The logging target. +const LOG_TARGET: &str = "cumulus-collator"; + +/// Utility functions generally applicable to writing collators for Cumulus. +pub trait ServiceInterface { + /// Checks the status of the given block hash in the Parachain. + /// + /// Returns `true` if the block could be found and is good to be build on. + fn check_block_status(&self, hash: Block::Hash, header: &Block::Header) -> bool; + + /// Build a full [`Collation`] from a given [`ParachainCandidate`]. This requires + /// that the underlying block has been fully imported into the underlying client, + /// as implementations will fetch underlying runtime API data. + /// + /// This also returns the unencoded parachain block data, in case that is desired. + fn build_collation( + &self, + parent_header: &Block::Header, + block_hash: Block::Hash, + candidate: ParachainCandidate, + ) -> Option<(Collation, ParachainBlockData)>; + + /// Inform networking systems that the block should be announced after an appropriate + /// signal has been received. This returns the sending half of the signal. + fn announce_with_barrier( + &self, + block_hash: Block::Hash, + ) -> oneshot::Sender; +} + +/// The [`CollatorService`] provides common utilities for parachain consensus and authoring. +/// +/// This includes logic for checking the block status of arbitrary parachain headers +/// gathered from the relay chain state, creating full [`Collation`]s to be shared with validators, +/// and distributing new parachain blocks along the network. +pub struct CollatorService { + block_status: Arc, + wait_to_announce: Arc>>, + runtime_api: Arc, +} + +impl Clone for CollatorService { + fn clone(&self) -> Self { + Self { + block_status: self.block_status.clone(), + wait_to_announce: self.wait_to_announce.clone(), + runtime_api: self.runtime_api.clone(), + } + } +} + +impl CollatorService +where + Block: BlockT, + BS: BlockBackend, + RA: ProvideRuntimeApi, + RA::Api: CollectCollationInfo, +{ + /// Create a new instance. + pub fn new( + block_status: Arc, + spawner: Arc, + announce_block: Arc>) + Send + Sync>, + runtime_api: Arc, + ) -> Self { + let wait_to_announce = Arc::new(Mutex::new(WaitToAnnounce::new(spawner, announce_block))); + + Self { block_status, wait_to_announce, runtime_api } + } + + /// Checks the status of the given block hash in the Parachain. + /// + /// Returns `true` if the block could be found and is good to be build on. + pub fn check_block_status(&self, hash: Block::Hash, header: &Block::Header) -> bool { + match self.block_status.block_status(hash) { + Ok(BlockStatus::Queued) => { + tracing::debug!( + target: LOG_TARGET, + block_hash = ?hash, + "Skipping candidate production, because block is still queued for import.", + ); + false + }, + Ok(BlockStatus::InChainWithState) => true, + Ok(BlockStatus::InChainPruned) => { + tracing::error!( + target: LOG_TARGET, + "Skipping candidate production, because block `{:?}` is already pruned!", + hash, + ); + false + }, + Ok(BlockStatus::KnownBad) => { + tracing::error!( + target: LOG_TARGET, + block_hash = ?hash, + "Block is tagged as known bad and is included in the relay chain! Skipping candidate production!", + ); + false + }, + Ok(BlockStatus::Unknown) => { + if header.number().is_zero() { + tracing::error!( + target: LOG_TARGET, + block_hash = ?hash, + "Could not find the header of the genesis block in the database!", + ); + } else { + tracing::debug!( + target: LOG_TARGET, + block_hash = ?hash, + "Skipping candidate production, because block is unknown.", + ); + } + false + }, + Err(e) => { + tracing::error!( + target: LOG_TARGET, + block_hash = ?hash, + error = ?e, + "Failed to get block status.", + ); + false + }, + } + } + + /// Fetch the collation info from the runtime. + /// + /// Returns `Ok(Some(_))` on success, `Err(_)` on error or `Ok(None)` if the runtime api isn't implemented by the runtime. + pub fn fetch_collation_info( + &self, + block_hash: Block::Hash, + header: &Block::Header, + ) -> Result, sp_api::ApiError> { + let runtime_api = self.runtime_api.runtime_api(); + + let api_version = + match runtime_api.api_version::>(block_hash)? { + Some(version) => version, + None => { + tracing::error!( + target: LOG_TARGET, + "Could not fetch `CollectCollationInfo` runtime api version." + ); + return Ok(None) + }, + }; + + let collation_info = if api_version < 2 { + #[allow(deprecated)] + runtime_api + .collect_collation_info_before_version_2(block_hash)? + .into_latest(header.encode().into()) + } else { + runtime_api.collect_collation_info(block_hash, header)? + }; + + Ok(Some(collation_info)) + } + + /// Build a full [`Collation`] from a given [`ParachainCandidate`]. This requires + /// that the underlying block has been fully imported into the underlying client, + /// as it fetches underlying runtime API data. + /// + /// This also returns the unencoded parachain block data, in case that is desired. + pub fn build_collation( + &self, + parent_header: &Block::Header, + block_hash: Block::Hash, + candidate: ParachainCandidate, + ) -> Option<(Collation, ParachainBlockData)> { + let (header, extrinsics) = candidate.block.deconstruct(); + + let compact_proof = match candidate + .proof + .into_compact_proof::>(*parent_header.state_root()) + { + Ok(proof) => proof, + Err(e) => { + tracing::error!(target: "cumulus-collator", "Failed to compact proof: {:?}", e); + return None + }, + }; + + // Create the parachain block data for the validators. + let collation_info = self + .fetch_collation_info(block_hash, &header) + .map_err(|e| { + tracing::error!( + target: LOG_TARGET, + error = ?e, + "Failed to collect collation info.", + ) + }) + .ok() + .flatten()?; + + let block_data = ParachainBlockData::::new(header, extrinsics, compact_proof); + + let pov = polkadot_node_primitives::maybe_compress_pov(PoV { + block_data: BlockData(block_data.encode()), + }); + + let upward_messages = collation_info + .upward_messages + .try_into() + .map_err(|e| { + tracing::error!( + target: LOG_TARGET, + error = ?e, + "Number of upward messages should not be greater than `MAX_UPWARD_MESSAGE_NUM`", + ) + }) + .ok()?; + let horizontal_messages = collation_info + .horizontal_messages + .try_into() + .map_err(|e| { + tracing::error!( + target: LOG_TARGET, + error = ?e, + "Number of horizontal messages should not be greater than `MAX_HORIZONTAL_MESSAGE_NUM`", + ) + }) + .ok()?; + + let collation = Collation { + upward_messages, + new_validation_code: collation_info.new_validation_code, + processed_downward_messages: collation_info.processed_downward_messages, + horizontal_messages, + hrmp_watermark: collation_info.hrmp_watermark, + head_data: collation_info.head_data, + proof_of_validity: MaybeCompressedPoV::Compressed(pov), + }; + + Some((collation, block_data)) + } + + /// Inform the networking systems that the block should be announced after an appropriate + /// signal has been received. This returns the sending half of the signal. + pub fn announce_with_barrier( + &self, + block_hash: Block::Hash, + ) -> oneshot::Sender { + let (result_sender, signed_stmt_recv) = oneshot::channel(); + self.wait_to_announce.lock().wait_to_announce(block_hash, signed_stmt_recv); + result_sender + } +} + +impl ServiceInterface for CollatorService +where + Block: BlockT, + BS: BlockBackend, + RA: ProvideRuntimeApi, + RA::Api: CollectCollationInfo, +{ + fn check_block_status(&self, hash: Block::Hash, header: &Block::Header) -> bool { + CollatorService::check_block_status(self, hash, header) + } + + fn build_collation( + &self, + parent_header: &Block::Header, + block_hash: Block::Hash, + candidate: ParachainCandidate, + ) -> Option<(Collation, ParachainBlockData)> { + CollatorService::build_collation(self, parent_header, block_hash, candidate) + } + + fn announce_with_barrier( + &self, + block_hash: Block::Hash, + ) -> oneshot::Sender { + CollatorService::announce_with_barrier(self, block_hash) + } +} diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index f284391494f..114e2ebed5b 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -27,8 +27,19 @@ sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } # Cumulus cumulus-client-consensus-common = { path = "../common" } +cumulus-relay-chain-interface = { path = "../../relay-chain-interface" } +cumulus-client-consensus-proposer = { path = "../proposer" } cumulus-primitives-core = { path = "../../../primitives/core" } +cumulus-primitives-parachain-inherent = { path = "../../../primitives/parachain-inherent" } +cumulus-client-collator = { path = "../../collator" } + +# Polkadot +polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-node-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-overseer = { git = "https://github.com/paritytech/polkadot", branch = "master" } diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index b95b5ecf39d..416ae776da1 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -50,6 +50,8 @@ pub use import_queue::{build_verifier, import_queue, BuildVerifierParams, Import pub use sc_consensus_aura::{slot_duration, AuraVerifier, BuildAuraWorkerParams, SlotProportion}; pub use sc_consensus_slots::InherentDataProviderExt; +pub mod unstable_reimpl; + const LOG_TARGET: &str = "aura::cumulus"; /// The implementation of the AURA consensus for parachains. diff --git a/client/consensus/aura/src/unstable_reimpl.rs b/client/consensus/aura/src/unstable_reimpl.rs new file mode 100644 index 00000000000..f9602a363bf --- /dev/null +++ b/client/consensus/aura/src/unstable_reimpl.rs @@ -0,0 +1,529 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! The AuRa consensus algorithm for parachains. +//! +//! This extends the Substrate provided AuRa consensus implementation to make it compatible for +//! parachains. This provides the option to run a "bare" relay-chain driven Aura implementation, +//! but also exposes the core functionalities separately to be composed into more complex implementations. +//! +//! For more information about AuRa, the Substrate crate should be checked. + +use codec::{Decode, Encode}; +use cumulus_client_collator::service::ServiceInterface as CollatorServiceInterface; +use cumulus_client_consensus_common::{ParachainBlockImportMarker, ParachainCandidate}; +use cumulus_client_consensus_proposer::ProposerInterface; +use cumulus_primitives_core::{ + relay_chain::Hash as PHash, CollectCollationInfo, PersistedValidationData, +}; +use cumulus_primitives_parachain_inherent::ParachainInherentData; +use cumulus_relay_chain_interface::RelayChainInterface; + +use polkadot_node_primitives::{CollationResult, MaybeCompressedPoV}; +use polkadot_overseer::Handle as OverseerHandle; +use polkadot_primitives::{CollatorPair, Id as ParaId}; + +use futures::prelude::*; +use sc_client_api::{backend::AuxStore, BlockBackend, BlockOf}; +use sc_consensus::{ + import_queue::{BasicQueue, Verifier as VerifierT}, + BlockImport, BlockImportParams, ForkChoiceStrategy, StateAction, +}; +use sc_consensus_aura::standalone as aura_internal; +use sc_telemetry::{telemetry, TelemetryHandle, CONSENSUS_DEBUG, CONSENSUS_TRACE}; +use sp_api::ProvideRuntimeApi; +use sp_application_crypto::AppPublic; +use sp_block_builder::BlockBuilder as BlockBuilderApi; +use sp_blockchain::HeaderBackend; +use sp_consensus::{error::Error as ConsensusError, BlockOrigin, SyncOracle}; +use sp_consensus_aura::{AuraApi, Slot, SlotDuration}; +use sp_core::crypto::Pair; +use sp_inherents::{CreateInherentDataProviders, InherentData, InherentDataProvider}; +use sp_keystore::KeystorePtr; +use sp_runtime::{ + generic::Digest, + traits::{Block as BlockT, HashFor, Header as HeaderT, Member}, +}; +use sp_state_machine::StorageChanges; +use std::{convert::TryFrom, error::Error, fmt::Debug, hash::Hash, sync::Arc, time::Duration}; + +/// Parameters for [`run_bare_relay_driven`]. +pub struct Params { + pub create_inherent_data_providers: CIDP, + pub block_import: BI, + pub para_client: Arc, + pub relay_client: Arc, + pub sync_oracle: SO, + pub keystore: KeystorePtr, + pub key: CollatorPair, + pub para_id: ParaId, + pub overseer_handle: OverseerHandle, + pub slot_duration: SlotDuration, + pub proposer: Proposer, + pub collator_service: CS, +} + +/// Run bare Aura consensus as a relay-chain-driven collator. +pub async fn run_bare_relay_driven( + params: Params, +) where + Block: BlockT, + Client: ProvideRuntimeApi + + BlockOf + + AuxStore + + HeaderBackend + + BlockBackend + + Send + + Sync + + 'static, + Client::Api: AuraApi + CollectCollationInfo, + RClient: RelayChainInterface, + CIDP: CreateInherentDataProviders + 'static, + BI: BlockImport + ParachainBlockImportMarker + Send + Sync + 'static, + SO: SyncOracle + Send + Sync + Clone + 'static, + Proposer: ProposerInterface, + Proposer::Transaction: Sync, + CS: CollatorServiceInterface, + P: Pair + Send + Sync, + P::Public: AppPublic + Hash + Member + Encode + Decode, + P::Signature: TryFrom> + Hash + Member + Encode + Decode, +{ + let mut proposer = params.proposer; + let mut block_import = params.block_import; + + let mut collation_requests = cumulus_client_collator::relay_chain_driven::init( + params.key, + params.para_id, + params.overseer_handle, + ) + .await; + + while let Some(request) = collation_requests.next().await { + macro_rules! reject_with_error { + ($err:expr) => {{ + request.complete(None); + tracing::error!(target: crate::LOG_TARGET, err = ?{ $err }); + continue; + }}; + } + + let validation_data = request.persisted_validation_data(); + + let parent_header = match Block::Header::decode(&mut &validation_data.parent_head.0[..]) { + Ok(x) => x, + Err(e) => reject_with_error!(e), + }; + + let parent_hash = parent_header.hash(); + + if !params.collator_service.check_block_status(parent_hash, &parent_header) { + continue + } + + let claim = match claim_slot::<_, _, P>( + &*params.para_client, + parent_hash, + params.slot_duration, + ¶ms.keystore, + ) + .await + { + Ok(None) => continue, + Ok(Some(c)) => c, + Err(e) => reject_with_error!(e), + }; + + let (parachain_inherent_data, other_inherent_data) = match create_inherent_data( + *request.relay_parent(), + &validation_data, + parent_hash, + params.para_id, + ¶ms.relay_client, + ¶ms.create_inherent_data_providers, + ) + .await + { + Ok(x) => x, + Err(e) => reject_with_error!(e), + }; + + let proposal = match proposer + .propose( + &parent_header, + ¶chain_inherent_data, + other_inherent_data, + Digest { logs: vec![claim.pre_digest] }, + // TODO [https://github.com/paritytech/cumulus/issues/2439] + // We should call out to a pluggable interface that provides + // the proposal duration. + Duration::from_millis(500), + // Set the block limit to 50% of the maximum PoV size. + // + // TODO: If we got benchmarking that includes the proof size, + // we should be able to use the maximum pov size. + Some((validation_data.max_pov_size / 2) as usize), + ) + .await + { + Ok(p) => p, + Err(e) => reject_with_error!(e), + }; + + let sealed_importable = match seal::<_, _, P>( + proposal.block, + proposal.storage_changes, + &claim.author_pub, + ¶ms.keystore, + ) { + Ok(s) => s, + Err(e) => reject_with_error!(e), + }; + + let post_hash = sealed_importable.post_hash(); + let block = Block::new( + sealed_importable.post_header(), + sealed_importable + .body + .as_ref() + .expect("body always created with this `propose` fn; qed") + .clone(), + ); + + if let Err(e) = block_import.import_block(sealed_importable).await { + reject_with_error!(e); + } + + let response = if let Some((collation, b)) = params.collator_service.build_collation( + &parent_header, + post_hash, + ParachainCandidate { block, proof: proposal.proof }, + ) { + tracing::info!( + target: crate::LOG_TARGET, + "PoV size {{ header: {}kb, extrinsics: {}kb, storage_proof: {}kb }}", + b.header().encode().len() as f64 / 1024f64, + b.extrinsics().encode().len() as f64 / 1024f64, + b.storage_proof().encode().len() as f64 / 1024f64, + ); + + if let MaybeCompressedPoV::Compressed(ref pov) = collation.proof_of_validity { + tracing::info!( + target: crate::LOG_TARGET, + "Compressed PoV size: {}kb", + pov.block_data.0.len() as f64 / 1024f64, + ); + } + + let result_sender = params.collator_service.announce_with_barrier(post_hash); + Some(CollationResult { collation, result_sender: Some(result_sender) }) + } else { + None + }; + + request.complete(response); + } +} + +fn slot_now(slot_duration: SlotDuration) -> Slot { + let timestamp = sp_timestamp::InherentDataProvider::from_system_time().timestamp(); + Slot::from_timestamp(timestamp, slot_duration) +} + +/// A claim on an Aura slot. +struct SlotClaim { + author_pub: Pub, + pre_digest: sp_runtime::DigestItem, +} + +async fn claim_slot( + client: &C, + parent_hash: B::Hash, + slot_duration: SlotDuration, + keystore: &KeystorePtr, +) -> Result>, Box> +where + B: BlockT, + C: ProvideRuntimeApi + Send + Sync + 'static, + C::Api: AuraApi, + P: Pair, + P::Public: Encode + Decode, + P::Signature: Encode + Decode, +{ + // load authorities + let authorities = client.runtime_api().authorities(parent_hash).map_err(Box::new)?; + + // Determine the current slot. + let slot_now = slot_now(slot_duration); + + // Try to claim the slot locally. + let author_pub = { + let res = aura_internal::claim_slot::

(slot_now, &authorities, keystore).await; + match res { + Some(p) => p, + None => return Ok(None), + } + }; + + // Produce the pre-digest. + let pre_digest = aura_internal::pre_digest::

(slot_now); + + Ok(Some(SlotClaim { author_pub, pre_digest })) +} + +async fn create_inherent_data( + relay_parent: PHash, + validation_data: &PersistedValidationData, + parent_hash: B::Hash, + para_id: ParaId, + relay_chain_interface: &impl RelayChainInterface, + create_inherent_data_providers: &impl CreateInherentDataProviders, +) -> Result<(ParachainInherentData, InherentData), Box> { + let paras_inherent_data = ParachainInherentData::create_at( + relay_parent, + relay_chain_interface, + validation_data, + para_id, + ) + .await; + + let paras_inherent_data = match paras_inherent_data { + Some(p) => p, + None => + return Err(format!("Could not create paras inherent data at {:?}", relay_parent).into()), + }; + + let other_inherent_data = create_inherent_data_providers + .create_inherent_data_providers(parent_hash, ()) + .map_err(|e| e as Box) + .await? + .create_inherent_data() + .await + .map_err(Box::new)?; + + Ok((paras_inherent_data, other_inherent_data)) +} + +fn seal( + pre_sealed: B, + storage_changes: StorageChanges>, + author_pub: &P::Public, + keystore: &KeystorePtr, +) -> Result, Box> +where + P: Pair, + P::Signature: Encode + Decode + TryFrom>, + P::Public: AppPublic, +{ + let (pre_header, body) = pre_sealed.deconstruct(); + let pre_hash = pre_header.hash(); + let block_number = *pre_header.number(); + + // seal the block. + let block_import_params = { + let seal_digest = + aura_internal::seal::<_, P>(&pre_hash, &author_pub, keystore).map_err(Box::new)?; + let mut block_import_params = BlockImportParams::new(BlockOrigin::Own, pre_header); + block_import_params.post_digests.push(seal_digest); + block_import_params.body = Some(body.clone()); + block_import_params.state_action = + StateAction::ApplyChanges(sc_consensus::StorageChanges::Changes(storage_changes)); + block_import_params.fork_choice = Some(ForkChoiceStrategy::LongestChain); + block_import_params + }; + let post_hash = block_import_params.post_hash(); + + tracing::info!( + target: crate::LOG_TARGET, + "🔖 Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", + block_number, + post_hash, + pre_hash, + ); + + Ok(block_import_params) +} + +struct Verifier { + client: Arc, + create_inherent_data_providers: CIDP, + slot_duration: SlotDuration, + telemetry: Option, + _marker: std::marker::PhantomData<(Block, P)>, +} + +#[async_trait::async_trait] +impl VerifierT for Verifier +where + P: Pair, + P::Signature: Encode + Decode, + P::Public: Encode + Decode + PartialEq + Clone + Debug, + Block: BlockT, + Client: ProvideRuntimeApi + Send + Sync, + >::Api: BlockBuilderApi + AuraApi, + + CIDP: CreateInherentDataProviders, +{ + async fn verify( + &mut self, + mut block_params: BlockImportParams, + ) -> Result, String> { + // Skip checks that include execution, if being told so, or when importing only state. + // + // This is done for example when gap syncing and it is expected that the block after the gap + // was checked/chosen properly, e.g. by warp syncing to this block using a finality proof. + if block_params.state_action.skip_execution_checks() || block_params.with_state() { + return Ok(block_params) + } + + let post_hash = block_params.header.hash(); + let parent_hash = *block_params.header.parent_hash(); + + // check seal and update pre-hash/post-hash + { + let authorities = aura_internal::fetch_authorities(self.client.as_ref(), parent_hash) + .map_err(|e| { + format!("Could not fetch authorities at {:?}: {}", parent_hash, e) + })?; + + let slot_now = slot_now(self.slot_duration); + let res = aura_internal::check_header_slot_and_seal::( + slot_now, + block_params.header, + &authorities, + ); + + match res { + Ok((pre_header, _slot, seal_digest)) => { + telemetry!( + self.telemetry; + CONSENSUS_TRACE; + "aura.checked_and_importing"; + "pre_header" => ?pre_header, + ); + + block_params.header = pre_header; + block_params.post_digests.push(seal_digest); + block_params.fork_choice = Some(ForkChoiceStrategy::LongestChain); + block_params.post_hash = Some(post_hash); + }, + Err(aura_internal::SealVerificationError::Deferred(hdr, slot)) => { + telemetry!( + self.telemetry; + CONSENSUS_DEBUG; + "aura.header_too_far_in_future"; + "hash" => ?post_hash, + "a" => ?hdr, + "b" => ?slot, + ); + + return Err(format!( + "Rejecting block ({:?}) from future slot {:?}", + post_hash, slot + )) + }, + Err(e) => + return Err(format!( + "Rejecting block ({:?}) with invalid seal ({:?})", + post_hash, e + )), + } + } + + // check inherents. + if let Some(body) = block_params.body.clone() { + let block = Block::new(block_params.header.clone(), body); + let create_inherent_data_providers = self + .create_inherent_data_providers + .create_inherent_data_providers(parent_hash, ()) + .await + .map_err(|e| format!("Could not create inherent data {:?}", e))?; + + let inherent_data = create_inherent_data_providers + .create_inherent_data() + .await + .map_err(|e| format!("Could not create inherent data {:?}", e))?; + + let inherent_res = self + .client + .runtime_api() + .check_inherents_with_context( + parent_hash, + block_params.origin.into(), + block, + inherent_data, + ) + .map_err(|e| format!("Unable to check block inherents {:?}", e))?; + + if !inherent_res.ok() { + for (i, e) in inherent_res.into_errors() { + match create_inherent_data_providers.try_handle_error(&i, &e).await { + Some(res) => res.map_err(|e| format!("Inherent Error {:?}", e))?, + None => + return Err(format!( + "Unknown inherent error, source {:?}", + String::from_utf8_lossy(&i[..]) + )), + } + } + } + } + + Ok(block_params) + } +} + +/// Start an import queue for a Cumulus node which checks blocks' seals and inherent data. +/// +/// Pass in only inherent data providers which don't include aura or parachain consensus inherents, +/// e.g. things like timestamp and custom inherents for the runtime. +/// +/// The others are generated explicitly internally. +/// +/// This should only be used for runtimes where the runtime does not check all inherents and +/// seals in `execute_block` (see ) +pub fn fully_verifying_import_queue( + client: Arc, + block_import: I, + create_inherent_data_providers: CIDP, + slot_duration: SlotDuration, + spawner: &impl sp_core::traits::SpawnEssentialNamed, + registry: Option<&substrate_prometheus_endpoint::Registry>, + telemetry: Option, +) -> BasicQueue +where + P: Pair, + P::Signature: Encode + Decode, + P::Public: Encode + Decode + PartialEq + Clone + Debug, + I: BlockImport + + ParachainBlockImportMarker + + Send + + Sync + + 'static, + I::Transaction: Send, + Client: ProvideRuntimeApi + Send + Sync + 'static, + >::Api: BlockBuilderApi + AuraApi, + CIDP: CreateInherentDataProviders + 'static, +{ + let verifier = Verifier:: { + client, + create_inherent_data_providers, + slot_duration, + telemetry, + _marker: std::marker::PhantomData, + }; + + BasicQueue::new(verifier, Box::new(block_import), None, spawner, registry) +} diff --git a/client/consensus/common/Cargo.toml b/client/consensus/common/Cargo.toml index d0bc28171fb..02b36320062 100644 --- a/client/consensus/common/Cargo.toml +++ b/client/consensus/common/Cargo.toml @@ -18,8 +18,10 @@ sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "mas sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } +substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } # Polkadot polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } diff --git a/client/consensus/common/src/import_queue.rs b/client/consensus/common/src/import_queue.rs new file mode 100644 index 00000000000..948fe065c42 --- /dev/null +++ b/client/consensus/common/src/import_queue.rs @@ -0,0 +1,77 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! (unstable) Composable utilities for constructing import queues for parachains. +//! +//! Unlike standalone chains, parachains have the requirement that all consensus logic +//! must be checked within the runtime. This property means that work which is normally +//! done in the import queue per-block, such as checking signatures, quorums, and whether +//! inherent extrinsics were constructed faithfully do not need to be done, per se. +//! +//! It may seem that it would be beneficial for the client to do these checks regardless, +//! but in practice this means that clients would just reject blocks which are _valid_ according +//! to their Parachain Validation Function, which is the ultimate source of consensus truth. +//! +//! However, parachain runtimes expose two different access points for executing blocks +//! in full nodes versus executing those blocks in the parachain validation environment. +//! At the time of writing, the inherent and consensus checks in most Cumulus runtimes +//! are only performed during parachain validation, not full node block execution. +//! +//! See for details. + +use sp_consensus::error::Error as ConsensusError; +use sp_runtime::traits::Block as BlockT; + +use sc_consensus::{ + block_import::{BlockImport, BlockImportParams}, + import_queue::{BasicQueue, Verifier}, +}; + +use crate::ParachainBlockImportMarker; + +/// A [`Verifier`] for blocks which verifies absolutely nothing. +/// +/// This should only be used when the runtime is responsible for checking block seals and inherents. +pub struct VerifyNothing; + +#[async_trait::async_trait] +impl Verifier for VerifyNothing { + async fn verify( + &mut self, + params: BlockImportParams, + ) -> Result, String> { + Ok(params) + } +} + +/// An import queue which does no verification. +/// +/// This should only be used when the runtime is responsible for checking block seals and inherents. +pub fn verify_nothing_import_queue( + block_import: I, + spawner: &impl sp_core::traits::SpawnEssentialNamed, + registry: Option<&substrate_prometheus_endpoint::Registry>, +) -> BasicQueue +where + I: BlockImport + + ParachainBlockImportMarker + + Send + + Sync + + 'static, + I::Transaction: Send, +{ + BasicQueue::new(VerifyNothing, Box::new(block_import), None, spawner, registry) +} diff --git a/client/consensus/common/src/lib.rs b/client/consensus/common/src/lib.rs index 86a781adc01..b74829e191f 100644 --- a/client/consensus/common/src/lib.rs +++ b/client/consensus/common/src/lib.rs @@ -32,6 +32,8 @@ pub use parachain_consensus::run_parachain_consensus; use level_monitor::LevelMonitor; pub use level_monitor::{LevelLimit, MAX_LEAVES_PER_LEVEL_SENSIBLE_DEFAULT}; +pub mod import_queue; + /// The result of [`ParachainConsensus::produce_candidate`]. pub struct ParachainCandidate { /// The block that was built for this candidate. diff --git a/client/consensus/proposer/Cargo.toml b/client/consensus/proposer/Cargo.toml new file mode 100644 index 00000000000..7dff8d31950 --- /dev/null +++ b/client/consensus/proposer/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "cumulus-client-consensus-proposer" +description = "A Substrate `Proposer` for building parachain blocks" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" + +[dependencies] +anyhow = "1.0" +async-trait = "0.1.68" +thiserror = "1.0.40" + +# Substrate +sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } + +# Cumulus +cumulus-primitives-parachain-inherent = { path = "../../../primitives/parachain-inherent" } diff --git a/client/consensus/proposer/src/lib.rs b/client/consensus/proposer/src/lib.rs new file mode 100644 index 00000000000..514ad58da74 --- /dev/null +++ b/client/consensus/proposer/src/lib.rs @@ -0,0 +1,137 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! The Cumulus [`Proposer`] is a wrapper around a Substrate [`sp_consensus::Environment`] +//! for creating new parachain blocks. +//! +//! This utility is designed to be composed within any collator consensus algorithm. + +use async_trait::async_trait; + +use cumulus_primitives_parachain_inherent::ParachainInherentData; +use sp_consensus::{EnableProofRecording, Environment, Proposal, Proposer as SubstrateProposer}; +use sp_inherents::InherentData; +use sp_runtime::{traits::Block as BlockT, Digest}; +use sp_state_machine::StorageProof; + +use std::{fmt::Debug, time::Duration}; + +/// Errors that can occur when proposing a parachain block. +#[derive(thiserror::Error, Debug)] +#[error(transparent)] +pub struct Error { + inner: anyhow::Error, +} + +impl Error { + /// Create an error tied to the creation of a proposer. + pub fn proposer_creation(err: impl Into) -> Self { + Error { inner: err.into().context("Proposer Creation") } + } + + /// Create an error tied to the proposing logic itself. + pub fn proposing(err: impl Into) -> Self { + Error { inner: err.into().context("Proposing") } + } +} + +/// A type alias for easily referring to the type of a proposal produced by a specific +/// [`Proposer`]. +pub type ProposalOf = Proposal>::Transaction, StorageProof>; + +/// An interface for proposers. +#[async_trait] +pub trait ProposerInterface { + /// The underlying DB transaction type produced with the block proposal. + type Transaction: Default + Send + 'static; + + /// Propose a collation using the supplied `InherentData` and the provided + /// `ParachainInherentData`. + /// + /// Also specify any required inherent digests, the maximum proposal duration, + /// and the block size limit in bytes. See the documentation on [`sp_consensus::Proposer::propose`] + /// for more details on how to interpret these parameters. + /// + /// The `InherentData` and `Digest` are left deliberately general in order to accommodate + /// all possible collator selection algorithms or inherent creation mechanisms, + /// while the `ParachainInherentData` is made explicit so it will be constructed appropriately. + /// + /// If the `InherentData` passed into this function already has a `ParachainInherentData`, + /// this should throw an error. + async fn propose( + &mut self, + parent_header: &Block::Header, + paras_inherent_data: &ParachainInherentData, + other_inherent_data: InherentData, + inherent_digests: Digest, + max_duration: Duration, + block_size_limit: Option, + ) -> Result, Error>; +} + +/// A simple wrapper around a Substrate proposer for creating collations. +pub struct Proposer { + inner: T, + _marker: std::marker::PhantomData, +} + +impl Proposer { + /// Create a new Cumulus [`Proposer`]. + pub fn new(inner: T) -> Self { + Proposer { inner, _marker: std::marker::PhantomData } + } +} + +#[async_trait] +impl ProposerInterface for Proposer +where + B: sp_runtime::traits::Block, + T: Environment + Send, + T::Error: Send + Sync + 'static, + T::Proposer: SubstrateProposer, + >::Error: Send + Sync + 'static, +{ + type Transaction = <>::Proposer as SubstrateProposer>::Transaction; + + async fn propose( + &mut self, + parent_header: &B::Header, + paras_inherent_data: &ParachainInherentData, + other_inherent_data: InherentData, + inherent_digests: Digest, + max_duration: Duration, + block_size_limit: Option, + ) -> Result, Error> { + let proposer = self + .inner + .init(parent_header) + .await + .map_err(|e| Error::proposer_creation(anyhow::Error::new(e)))?; + + let mut inherent_data = other_inherent_data; + inherent_data + .put_data( + cumulus_primitives_parachain_inherent::INHERENT_IDENTIFIER, + ¶s_inherent_data, + ) + .map_err(|e| Error::proposing(anyhow::Error::new(e)))?; + + proposer + .propose(inherent_data, inherent_digests, max_duration, block_size_limit) + .await + .map_err(|e| Error::proposing(anyhow::Error::new(e)).into()) + } +} From 45bae90eb19663cedc5c52192a7a8eddf1227330 Mon Sep 17 00:00:00 2001 From: yjh Date: Mon, 15 May 2023 19:09:10 +0800 Subject: [PATCH 187/339] remove sp-serializer (#2574) * remove sp-serializer * improve * update lockfile for {"polkadot", "substrate"} * update lockfile for {"substrate", "polkadot"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 815 ++++++++++++++++-------------- polkadot-parachain/Cargo.toml | 2 +- polkadot-parachain/src/command.rs | 2 +- 3 files changed, 428 insertions(+), 391 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d25c4e24344..0f06c5125b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -352,12 +352,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "asn1_der" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22d1f4b888c298a027c99dc9048015fac177587de20fc30232a057dfbe24a21" - [[package]] name = "assert_cmd" version = "2.0.11" @@ -585,7 +579,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "hash-db", "log", @@ -1464,7 +1458,7 @@ checksum = "f6ed9c8b2d17acb8110c46f1da5bf4a696d745e1474a16db0cd2b49cd0249bf2" dependencies = [ "core2", "multibase", - "multihash", + "multihash 0.16.2", "serde", "unsigned-varint", ] @@ -3787,7 +3781,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", ] @@ -3810,7 +3804,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-support-procedural", @@ -3835,7 +3829,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3882,7 +3876,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3893,7 +3887,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3910,7 +3904,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-system", @@ -3939,7 +3933,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-recursion", "futures", @@ -3959,7 +3953,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "bitflags", "environmental", @@ -3992,7 +3986,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "Inflector", "cfg-expr", @@ -4008,7 +4002,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4020,7 +4014,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "proc-macro2", "quote", @@ -4030,7 +4024,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "cfg-if", "frame-support", @@ -4049,7 +4043,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -4064,7 +4058,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "sp-api", @@ -4073,7 +4067,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "parity-scale-codec", @@ -5090,7 +5084,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bitvec", "frame-benchmarking", @@ -5188,7 +5182,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "frame-support", "polkadot-primitives", @@ -5274,22 +5268,24 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" -version = "0.50.0" +version = "0.51.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e0a0d2f693675f49ded13c5d510c48b78069e23cbd9108d7ccd59f6dc568819" +checksum = "f210d259724eae82005b5c48078619b7745edb7b76de370b03f8ba59ea103097" dependencies = [ "bytes", "futures", "futures-timer", "getrandom 0.2.8", "instant", + "libp2p-allow-block-list", + "libp2p-connection-limits", "libp2p-core", "libp2p-dns", "libp2p-identify", + "libp2p-identity", "libp2p-kad", "libp2p-mdns", "libp2p-metrics", - "libp2p-mplex", "libp2p-noise", "libp2p-ping", "libp2p-quic", @@ -5301,50 +5297,66 @@ dependencies = [ "libp2p-websocket", "libp2p-yamux", "multiaddr", - "parking_lot 0.12.1", "pin-project", - "smallvec", +] + +[[package]] +name = "libp2p-allow-block-list" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510daa05efbc25184458db837f6f9a5143888f1caa742426d92e1833ddd38a50" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", +] + +[[package]] +name = "libp2p-connection-limits" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4caa33f1d26ed664c4fe2cca81a08c8e07d4c1c04f2f4ac7655c2dd85467fda0" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", ] [[package]] name = "libp2p-core" -version = "0.38.0" +version = "0.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a8fcd392ff67af6cc3f03b1426c41f7f26b6b9aff2dc632c1c56dd649e571f" +checksum = "3c1df63c0b582aa434fb09b2d86897fa2b419ffeccf934b36f87fcedc8e835c2" dependencies = [ - "asn1_der", - "bs58", - "ed25519-dalek", "either", "fnv", "futures", "futures-timer", "instant", + "libp2p-identity", "log", "multiaddr", - "multihash", + "multihash 0.17.0", "multistream-select", "once_cell", "parking_lot 0.12.1", "pin-project", - "prost", - "prost-build", + "quick-protobuf", "rand 0.8.5", "rw-stream-sink", - "sec1 0.3.0", - "sha2 0.10.2", "smallvec", "thiserror", "unsigned-varint", "void", - "zeroize", ] [[package]] name = "libp2p-dns" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e42a271c1b49f789b92f7fc87749fa79ce5c7bdc88cbdfacb818a4bca47fec5" +checksum = "146ff7034daae62077c415c2376b8057368042df6ab95f5432ad5e88568b1554" dependencies = [ "futures", "libp2p-core", @@ -5356,30 +5368,49 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.41.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c052d0026f4817b44869bfb6810f4e1112f43aec8553f2cb38881c524b563abf" +checksum = "5455f472243e63b9c497ff320ded0314254a9eb751799a39c283c6f20b793f3c" dependencies = [ "asynchronous-codec", + "either", "futures", "futures-timer", "libp2p-core", + "libp2p-identity", "libp2p-swarm", "log", - "lru 0.8.1", - "prost", - "prost-build", - "prost-codec", + "lru 0.10.0", + "quick-protobuf", + "quick-protobuf-codec", "smallvec", "thiserror", "void", ] +[[package]] +name = "libp2p-identity" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2d584751cecb2aabaa56106be6be91338a60a0f4e420cf2af639204f596fc1" +dependencies = [ + "bs58", + "ed25519-dalek", + "log", + "multiaddr", + "multihash 0.17.0", + "quick-protobuf", + "rand 0.8.5", + "sha2 0.10.2", + "thiserror", + "zeroize", +] + [[package]] name = "libp2p-kad" -version = "0.42.1" +version = "0.43.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2766dcd2be8c87d5e1f35487deb22d765f49c6ae1251b3633efe3b25698bd3d2" +checksum = "39d5ef876a2b2323d63c258e63c2f8e36f205fe5a11f0b3095d59635650790ff" dependencies = [ "arrayvec 0.7.2", "asynchronous-codec", @@ -5390,10 +5421,10 @@ dependencies = [ "futures-timer", "instant", "libp2p-core", + "libp2p-identity", "libp2p-swarm", "log", - "prost", - "prost-build", + "quick-protobuf", "rand 0.8.5", "sha2 0.10.2", "smallvec", @@ -5405,14 +5436,15 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.42.0" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f378264aade9872d6ccd315c0accc18be3a35d15fc1b9c36e5b6f983b62b5b" +checksum = "19983e1f949f979a928f2c603de1cf180cc0dc23e4ac93a62651ccb18341460b" dependencies = [ "data-encoding", "futures", "if-watch", "libp2p-core", + "libp2p-identity", "libp2p-swarm", "log", "rand 0.8.5", @@ -5425,9 +5457,9 @@ dependencies = [ [[package]] name = "libp2p-metrics" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad8a64f29da86005c86a4d2728b8a0719e9b192f4092b609fd8790acb9dec55" +checksum = "a42ec91e227d7d0dafa4ce88b333cdf5f277253873ab087555c92798db2ddd46" dependencies = [ "libp2p-core", "libp2p-identify", @@ -5437,38 +5469,20 @@ dependencies = [ "prometheus-client", ] -[[package]] -name = "libp2p-mplex" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03805b44107aa013e7cbbfa5627b31c36cbedfdfb00603c0311998882bc4bace" -dependencies = [ - "asynchronous-codec", - "bytes", - "futures", - "libp2p-core", - "log", - "nohash-hasher", - "parking_lot 0.12.1", - "rand 0.8.5", - "smallvec", - "unsigned-varint", -] - [[package]] name = "libp2p-noise" -version = "0.41.0" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a978cb57efe82e892ec6f348a536bfbd9fee677adbe5689d7a93ad3a9bffbf2e" +checksum = "9c3673da89d29936bc6435bafc638e2f184180d554ce844db65915113f86ec5e" dependencies = [ "bytes", "curve25519-dalek 3.2.0", "futures", "libp2p-core", + "libp2p-identity", "log", "once_cell", - "prost", - "prost-build", + "quick-protobuf", "rand 0.8.5", "sha2 0.10.2", "snow", @@ -5480,10 +5494,11 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.41.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929fcace45a112536e22b3dcfd4db538723ef9c3cb79f672b98be2cc8e25f37f" +checksum = "3e57759c19c28a73ef1eb3585ca410cefb72c1a709fcf6de1612a378e4219202" dependencies = [ + "either", "futures", "futures-timer", "instant", @@ -5496,15 +5511,16 @@ dependencies = [ [[package]] name = "libp2p-quic" -version = "0.7.0-alpha" +version = "0.7.0-alpha.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01e7c867e95c8130667b24409d236d37598270e6da69b3baf54213ba31ffca59" +checksum = "c6b26abd81cd2398382a1edfe739b539775be8a90fa6914f39b2ab49571ec735" dependencies = [ "bytes", "futures", "futures-timer", "if-watch", "libp2p-core", + "libp2p-identity", "libp2p-tls", "log", "parking_lot 0.12.1", @@ -5517,27 +5533,25 @@ dependencies = [ [[package]] name = "libp2p-request-response" -version = "0.23.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3236168796727bfcf4927f766393415361e2c644b08bedb6a6b13d957c9a4884" +checksum = "7ffdb374267d42dc5ed5bc53f6e601d4a64ac5964779c6e40bb9e4f14c1e30d5" dependencies = [ "async-trait", - "bytes", "futures", "instant", "libp2p-core", + "libp2p-identity", "libp2p-swarm", - "log", "rand 0.8.5", "smallvec", - "unsigned-varint", ] [[package]] name = "libp2p-swarm" -version = "0.41.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a35472fe3276b3855c00f1c032ea8413615e030256429ad5349cdf67c6e1a0" +checksum = "903b3d592d7694e56204d211f29d31bc004be99386644ba8731fc3e3ef27b296" dependencies = [ "either", "fnv", @@ -5545,21 +5559,20 @@ dependencies = [ "futures-timer", "instant", "libp2p-core", + "libp2p-identity", "libp2p-swarm-derive", "log", - "pin-project", "rand 0.8.5", "smallvec", - "thiserror", "tokio", "void", ] [[package]] name = "libp2p-swarm-derive" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d527d5827582abd44a6d80c07ff8b50b4ee238a8979e05998474179e79dc400" +checksum = "0fba456131824ab6acd4c7bf61e9c0f0a3014b5fc9868ccb8e10d344594cdc4f" dependencies = [ "heck", "quote", @@ -5568,9 +5581,9 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b257baf6df8f2df39678b86c578961d48cc8b68642a12f0f763f56c8e5858d" +checksum = "33d33698596d7722d85d3ab0c86c2c322254fce1241e91208e3679b4eb3026cf" dependencies = [ "futures", "futures-timer", @@ -5584,13 +5597,14 @@ dependencies = [ [[package]] name = "libp2p-tls" -version = "0.1.0-alpha" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7905ce0d040576634e8a3229a7587cc8beab83f79db6023800f1792895defa8" +checksum = "ff08d13d0dc66e5e9ba6279c1de417b84fa0d0adc3b03e5732928c180ec02781" dependencies = [ "futures", "futures-rustls", "libp2p-core", + "libp2p-identity", "rcgen 0.10.0", "ring", "rustls 0.20.7", @@ -5602,9 +5616,9 @@ dependencies = [ [[package]] name = "libp2p-wasm-ext" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb1a35299860e0d4b3c02a3e74e3b293ad35ae0cee8a056363b0c862d082069" +checksum = "77dff9d32353a5887adb86c8afc1de1a94d9e8c3bc6df8b2201d7cdf5c848f43" dependencies = [ "futures", "js-sys", @@ -5616,9 +5630,9 @@ dependencies = [ [[package]] name = "libp2p-webrtc" -version = "0.4.0-alpha" +version = "0.4.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb6cd86dd68cba72308ea05de1cebf3ba0ae6e187c40548167955d4e3970f6a" +checksum = "dba48592edbc2f60b4bc7c10d65445b0c3964c07df26fdf493b6880d33be36f8" dependencies = [ "async-trait", "asynchronous-codec", @@ -5628,12 +5642,12 @@ dependencies = [ "hex", "if-watch", "libp2p-core", + "libp2p-identity", "libp2p-noise", "log", - "multihash", - "prost", - "prost-build", - "prost-codec", + "multihash 0.17.0", + "quick-protobuf", + "quick-protobuf-codec", "rand 0.8.5", "rcgen 0.9.3", "serde", @@ -5647,9 +5661,9 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.40.0" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d705506030d5c0aaf2882437c70dab437605f21c5f9811978f694e6917a3b54" +checksum = "111273f7b3d3510524c752e8b7a5314b7f7a1fee7e68161c01a7d72cbb06db9f" dependencies = [ "either", "futures", @@ -5666,14 +5680,13 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.42.0" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f63594a0aa818642d9d4915c791945053877253f08a3626f13416b5cd928a29" +checksum = "4dcd21d950662700a385d4c6d68e2f5f54d778e97068cdd718522222ef513bda" dependencies = [ "futures", "libp2p-core", "log", - "parking_lot 0.12.1", "thiserror", "yamux", ] @@ -5839,6 +5852,15 @@ dependencies = [ "hashbrown 0.13.2", ] +[[package]] +name = "lru" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03f1160296536f10c833a82dca22267d5486734230d47bf00bf435885814ba1e" +dependencies = [ + "hashbrown 0.13.2", +] + [[package]] name = "lru-cache" version = "0.1.2" @@ -6042,7 +6064,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "futures", "log", @@ -6061,7 +6083,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "anyhow", "jsonrpsee", @@ -6103,15 +6125,16 @@ dependencies = [ [[package]] name = "multiaddr" -version = "0.16.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aebdb21e90f81d13ed01dc84123320838e53963c2ca94b60b305d3fa64f31e" +checksum = "2b36f567c7099511fa8612bbbb52dda2419ce0bdbacf31714e3a5ffdb766d3bd" dependencies = [ "arrayref", "byteorder", "data-encoding", + "log", "multibase", - "multihash", + "multihash 0.17.0", "percent-encoding", "serde", "static_assertions", @@ -6147,6 +6170,19 @@ dependencies = [ "unsigned-varint", ] +[[package]] +name = "multihash" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" +dependencies = [ + "core2", + "digest 0.10.6", + "multihash-derive", + "sha2 0.10.2", + "unsigned-varint", +] + [[package]] name = "multihash-derive" version = "0.8.0" @@ -6566,7 +6602,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6587,7 +6623,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -6605,7 +6641,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -6620,7 +6656,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-system", @@ -6636,7 +6672,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-system", @@ -6652,7 +6688,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-system", @@ -6666,7 +6702,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -6690,7 +6726,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6710,7 +6746,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -6725,7 +6761,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-system", @@ -6744,7 +6780,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6768,7 +6804,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -6874,7 +6910,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -6918,7 +6954,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -6935,7 +6971,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "bitflags", "environmental", @@ -6965,7 +7001,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "bitflags", "parity-scale-codec", @@ -6978,7 +7014,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "proc-macro2", "quote", @@ -6988,7 +7024,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7005,7 +7041,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7023,7 +7059,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7046,7 +7082,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7059,7 +7095,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7077,7 +7113,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7095,7 +7131,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7118,7 +7154,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7134,7 +7170,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7154,7 +7190,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7171,7 +7207,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-system", @@ -7185,7 +7221,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7202,7 +7238,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7219,7 +7255,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7235,7 +7271,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7253,7 +7289,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "pallet-nfts", @@ -7264,7 +7300,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7280,7 +7316,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-system", @@ -7297,7 +7333,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7317,7 +7353,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7328,7 +7364,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-system", @@ -7345,7 +7381,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7384,7 +7420,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7401,7 +7437,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7416,7 +7452,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7434,7 +7470,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7449,7 +7485,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7468,7 +7504,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7485,7 +7521,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-system", @@ -7506,7 +7542,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7522,7 +7558,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-system", @@ -7536,7 +7572,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7559,7 +7595,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7570,7 +7606,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "log", "sp-arithmetic", @@ -7579,7 +7615,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "sp-api", @@ -7588,7 +7624,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7605,7 +7641,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7620,7 +7656,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7638,7 +7674,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7657,7 +7693,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-support", "frame-system", @@ -7673,7 +7709,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7689,7 +7725,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7701,7 +7737,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7718,7 +7754,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7733,7 +7769,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7749,7 +7785,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7764,7 +7800,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-benchmarking", "frame-support", @@ -7779,7 +7815,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7800,7 +7836,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8378,7 +8414,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8394,7 +8430,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8408,7 +8444,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "derive_more", "fatality", @@ -8431,7 +8467,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "fatality", "futures", @@ -8452,7 +8488,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8481,7 +8517,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "async-trait", "frame-benchmarking", @@ -8524,7 +8560,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "always-assert", "bitvec", @@ -8546,7 +8582,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "parity-scale-codec", "scale-info", @@ -8558,7 +8594,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "derive_more", "fatality", @@ -8583,7 +8619,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8597,7 +8633,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "futures", "futures-timer", @@ -8617,7 +8653,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "always-assert", "async-trait", @@ -8640,7 +8676,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "futures", "parity-scale-codec", @@ -8658,7 +8694,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bitvec", "derive_more", @@ -8687,7 +8723,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bitvec", "futures", @@ -8708,7 +8744,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bitvec", "fatality", @@ -8727,7 +8763,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8742,7 +8778,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "async-trait", "futures", @@ -8762,7 +8798,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "futures", "polkadot-node-metrics", @@ -8777,7 +8813,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "futures", "futures-timer", @@ -8794,7 +8830,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "fatality", "futures", @@ -8813,7 +8849,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "async-trait", "futures", @@ -8830,7 +8866,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bitvec", "fatality", @@ -8848,7 +8884,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "always-assert", "futures", @@ -8875,7 +8911,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "futures", "polkadot-node-primitives", @@ -8891,7 +8927,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "assert_matches", "cpu-time", @@ -8920,7 +8956,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "futures", "lru 0.9.0", @@ -8935,7 +8971,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "lazy_static", "log", @@ -8953,7 +8989,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bs58", "futures", @@ -8972,7 +9008,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "async-trait", "derive_more", @@ -8994,7 +9030,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bounded-vec", "futures", @@ -9016,7 +9052,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9026,7 +9062,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "async-trait", "futures", @@ -9044,7 +9080,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "async-trait", "derive_more", @@ -9067,7 +9103,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "async-trait", "derive_more", @@ -9100,7 +9136,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "async-trait", "futures", @@ -9123,7 +9159,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bounded-collections", "derive_more", @@ -9190,6 +9226,7 @@ dependencies = [ "sc-transaction-pool-api", "seedling-runtime", "serde", + "serde_json", "shell-runtime", "sp-api", "sp-block-builder", @@ -9200,7 +9237,6 @@ dependencies = [ "sp-keystore", "sp-offchain", "sp-runtime", - "sp-serializer", "sp-session", "sp-timestamp", "sp-transaction-pool", @@ -9221,7 +9257,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9239,7 +9275,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9265,7 +9301,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9297,7 +9333,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bitvec", "frame-benchmarking", @@ -9391,7 +9427,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bitvec", "frame-benchmarking", @@ -9437,7 +9473,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "frame-support", "polkadot-primitives", @@ -9451,7 +9487,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bs58", "parity-scale-codec", @@ -9463,7 +9499,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bitflags", "bitvec", @@ -9507,7 +9543,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9617,7 +9653,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9638,7 +9674,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9648,7 +9684,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9673,7 +9709,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9734,7 +9770,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "frame-benchmarking", "frame-system", @@ -10004,21 +10040,21 @@ dependencies = [ [[package]] name = "prometheus-client" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83cd1b99916654a69008fd66b4f9397fbe08e6e51dfe23d4417acf5d3b8cb87c" +checksum = "5d6fa99d535dd930d1249e6c79cb3c2915f9172a540fe2b02a4c8f9ca954721e" dependencies = [ "dtoa", "itoa 1.0.4", "parking_lot 0.12.1", - "prometheus-client-derive-text-encode", + "prometheus-client-derive-encode", ] [[package]] -name = "prometheus-client-derive-text-encode" -version = "0.3.0" +name = "prometheus-client-derive-encode" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a455fbcb954c1a7decf3c586e860fd7889cddf4b8e164be736dbac95a953cd" +checksum = "72b6a5217beb0ad503ee7fa752d451c905113d70721b937126158f3106a48cc1" dependencies = [ "proc-macro2", "quote", @@ -10055,19 +10091,6 @@ dependencies = [ "which", ] -[[package]] -name = "prost-codec" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc34979ff898b6e141106178981ce2596c387ea6e62533facfc61a37fc879c0" -dependencies = [ - "asynchronous-codec", - "bytes", - "prost", - "thiserror", - "unsigned-varint", -] - [[package]] name = "prost-derive" version = "0.11.0" @@ -10112,6 +10135,28 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", +] + +[[package]] +name = "quick-protobuf-codec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1693116345026436eb2f10b677806169c1a1260c1c60eaaffe3fb5a29ae23d8b" +dependencies = [ + "asynchronous-codec", + "bytes", + "quick-protobuf", + "thiserror", + "unsigned-varint", +] + [[package]] name = "quicksink" version = "0.1.2" @@ -10517,7 +10562,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10603,7 +10648,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "frame-support", "polkadot-primitives", @@ -10850,7 +10895,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "log", "sp-core", @@ -10861,7 +10906,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "futures", @@ -10869,6 +10914,7 @@ dependencies = [ "ip_network", "libp2p", "log", + "multihash 0.17.0", "parity-scale-codec", "prost", "prost-build", @@ -10889,7 +10935,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "futures", "futures-timer", @@ -10912,7 +10958,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10927,7 +10973,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10946,7 +10992,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10957,14 +11003,14 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "chrono", "clap 4.2.7", "fdlimit", "futures", - "libp2p", + "libp2p-identity", "log", "names", "parity-scale-codec", @@ -10997,7 +11043,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "fnv", "futures", @@ -11024,7 +11070,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "hash-db", "kvdb", @@ -11050,12 +11096,12 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "futures", "futures-timer", - "libp2p", + "libp2p-identity", "log", "mockall", "parking_lot 0.12.1", @@ -11075,7 +11121,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "futures", @@ -11104,7 +11150,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "fork-tree", @@ -11140,7 +11186,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "futures", "jsonrpsee", @@ -11162,7 +11208,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11197,7 +11243,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "futures", "jsonrpsee", @@ -11216,7 +11262,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11229,7 +11275,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11269,7 +11315,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "finality-grandpa", "futures", @@ -11289,7 +11335,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "futures", @@ -11312,7 +11358,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11336,7 +11382,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11349,7 +11395,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "log", "sc-allocator", @@ -11362,7 +11408,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "anyhow", "cfg-if", @@ -11380,7 +11426,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "ansi_term", "futures", @@ -11396,7 +11442,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11410,7 +11456,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11455,11 +11501,11 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "cid", "futures", - "libp2p", + "libp2p-identity", "log", "prost", "prost-build", @@ -11475,7 +11521,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11483,7 +11529,7 @@ dependencies = [ "bytes", "futures", "futures-timer", - "libp2p", + "libp2p-identity", "parity-scale-codec", "prost-build", "sc-consensus", @@ -11503,7 +11549,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "ahash 0.8.2", "futures", @@ -11522,11 +11568,11 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "futures", - "libp2p", + "libp2p-identity", "log", "parity-scale-codec", "prost", @@ -11544,7 +11590,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11578,7 +11624,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11598,7 +11644,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11629,10 +11675,10 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "futures", - "libp2p", + "libp2p-identity", "log", "sc-utils", "serde_json", @@ -11642,7 +11688,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11651,7 +11697,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "futures", "jsonrpsee", @@ -11682,7 +11728,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11701,7 +11747,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "http", "jsonrpsee", @@ -11716,7 +11762,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11742,7 +11788,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "directories", @@ -11808,7 +11854,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "log", "parity-scale-codec", @@ -11819,7 +11865,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "clap 4.2.7", "fs4", @@ -11835,7 +11881,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11854,7 +11900,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "futures", "libc", @@ -11873,7 +11919,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "chrono", "futures", @@ -11892,7 +11938,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "ansi_term", "atty", @@ -11923,7 +11969,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11934,7 +11980,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "futures", @@ -11961,7 +12007,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "futures", @@ -11975,7 +12021,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-channel", "futures", @@ -12456,7 +12502,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "enumn", "parity-scale-codec", @@ -12533,7 +12579,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "hash-db", "log", @@ -12553,7 +12599,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "Inflector", "blake2", @@ -12567,7 +12613,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "scale-info", @@ -12580,7 +12626,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "integer-sqrt", "num-traits", @@ -12594,7 +12640,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "scale-info", @@ -12607,7 +12653,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "sp-api", @@ -12619,7 +12665,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "futures", "log", @@ -12637,7 +12683,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "futures", @@ -12652,7 +12698,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "parity-scale-codec", @@ -12670,7 +12716,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "parity-scale-codec", @@ -12691,7 +12737,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12710,7 +12756,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "finality-grandpa", "log", @@ -12728,7 +12774,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "scale-info", @@ -12740,7 +12786,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12784,7 +12830,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "blake2b_simd", "byteorder", @@ -12798,7 +12844,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "proc-macro2", "quote", @@ -12809,7 +12855,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12818,7 +12864,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "proc-macro2", "quote", @@ -12828,7 +12874,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "environmental", "parity-scale-codec", @@ -12839,7 +12885,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12854,7 +12900,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "bytes", "ed25519", @@ -12880,7 +12926,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "lazy_static", "sp-core", @@ -12891,7 +12937,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "futures", "parity-scale-codec", @@ -12905,7 +12951,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12914,7 +12960,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12925,7 +12971,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12943,7 +12989,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "scale-info", @@ -12957,7 +13003,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "sp-api", "sp-core", @@ -12967,7 +13013,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "backtrace", "lazy_static", @@ -12977,7 +13023,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "rustc-hash", "serde", @@ -12987,7 +13033,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "either", "hash256-std-hasher", @@ -13009,7 +13055,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13027,7 +13073,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "Inflector", "proc-macro-crate", @@ -13036,19 +13082,10 @@ dependencies = [ "syn 2.0.15", ] -[[package]] -name = "sp-serializer" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" -dependencies = [ - "serde", - "serde_json", -] - [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "scale-info", @@ -13062,7 +13099,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "scale-info", @@ -13075,7 +13112,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "hash-db", "log", @@ -13095,7 +13132,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "log", "parity-scale-codec", @@ -13113,12 +13150,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13131,7 +13168,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "futures-timer", @@ -13146,7 +13183,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "sp-std", @@ -13158,7 +13195,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "sp-api", "sp-runtime", @@ -13167,7 +13204,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "log", @@ -13183,7 +13220,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13206,7 +13243,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13223,7 +13260,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13234,7 +13271,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13248,7 +13285,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "parity-scale-codec", "scale-info", @@ -13583,7 +13620,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "platforms 2.0.0", ] @@ -13591,7 +13628,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13610,7 +13647,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "hyper", "log", @@ -13622,7 +13659,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "jsonrpsee", @@ -13635,7 +13672,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "jsonrpsee", "log", @@ -13654,7 +13691,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13680,7 +13717,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13690,7 +13727,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13701,7 +13738,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "ansi_term", "build-helper", @@ -13828,7 +13865,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "frame-support", "polkadot-primitives", @@ -14214,7 +14251,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14225,7 +14262,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14355,7 +14392,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e6a13b807a88d25aa1cd0d320edb9412c3692c67" +source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" dependencies = [ "async-trait", "clap 4.2.7", @@ -14422,7 +14459,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.6", - "rand 0.7.3", + "rand 0.8.5", "static_assertions", ] @@ -15288,7 +15325,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bitvec", "frame-benchmarking", @@ -15380,7 +15417,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "frame-support", "polkadot-primitives", @@ -15882,7 +15919,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "bounded-collections", "derivative", @@ -15898,7 +15935,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "frame-support", "frame-system", @@ -15919,7 +15956,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "environmental", "frame-benchmarking", @@ -15939,7 +15976,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d1868546506d7972f6f07c585ecaefedc41b75c3" +source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" dependencies = [ "Inflector", "proc-macro2", diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index d872c7cdf6e..48e08bdc94d 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -18,6 +18,7 @@ futures = "0.3.28" hex-literal = "0.4.1" log = "0.4.17" serde = { version = "1.0.162", features = ["derive"] } +serde_json = "1.0.96" # Local rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parachain" } @@ -64,7 +65,6 @@ sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "maste sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-sysinfo = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-serializer = { git = "https://github.com/paritytech/substrate", branch = "master" } substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } try-runtime-cli = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/polkadot-parachain/src/command.rs b/polkadot-parachain/src/command.rs index 32986b522ca..f7445e65645 100644 --- a/polkadot-parachain/src/command.rs +++ b/polkadot-parachain/src/command.rs @@ -77,7 +77,7 @@ impl RuntimeResolver for PathBuf { let file = std::fs::File::open(self).expect("Failed to open file"); let reader = std::io::BufReader::new(file); - let chain_spec: EmptyChainSpecWithId = sp_serializer::from_reader(reader) + let chain_spec: EmptyChainSpecWithId = serde_json::from_reader(reader) .expect("Failed to read 'json' file with ChainSpec configuration"); runtime(&chain_spec.id) From 77d8b5b911194b0cfbba0558cce00f90a1dc56a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 16:59:28 +0200 Subject: [PATCH 188/339] Bump serde from 1.0.162 to 1.0.163 (#2568) Bumps [serde](https://github.com/serde-rs/serde) from 1.0.162 to 1.0.163. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.162...v1.0.163) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- client/relay-chain-rpc-interface/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f06c5125b5..2177fd5c957 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12284,18 +12284,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.162" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.162" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index 962377874c1..55ffd3d0c72 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -31,5 +31,5 @@ tracing = "0.1.37" async-trait = "0.1.68" url = "2.3.1" serde_json = "1.0.96" -serde = "1.0.162" +serde = "1.0.163" lru = "0.9.0" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index 3ded5c15bf7..68bd9ac2579 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -13,7 +13,7 @@ build = "build.rs" clap = { version = "4.2.7", features = ["derive"] } log = "0.4.17" codec = { package = "parity-scale-codec", version = "3.0.0" } -serde = { version = "1.0.162", features = ["derive"] } +serde = { version = "1.0.163", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } # Local diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index d8cce46eadd..9498823e358 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.162", optional = true, features = ["derive"] } +serde = { version = "1.0.163", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 0412e56112c..3a5476b8f20 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.162", optional = true, features = ["derive"] } +serde = { version = "1.0.163", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index adcc2c02813..2ab55ae8ca4 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.162", optional = true, features = ["derive"] } +serde = { version = "1.0.163", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 48e08bdc94d..d1ef27e4424 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -17,7 +17,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" log = "0.4.17" -serde = { version = "1.0.162", features = ["derive"] } +serde = { version = "1.0.163", features = ["derive"] } serde_json = "1.0.96" # Local diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 4f0fc627bad..5e217b43deb 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -15,7 +15,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.4.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" -serde = { version = "1.0.162", features = ["derive"] } +serde = { version = "1.0.163", features = ["derive"] } tokio = { version = "1.28.0", features = ["macros"] } tracing = "0.1.37" url = "2.3.1" From a82d5afbd7ea477f4160408905c4e4835a1e5970 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 15:46:56 +0000 Subject: [PATCH 189/339] Bump tokio from 1.28.0 to 1.28.1 (#2564) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.28.0 to 1.28.1. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.28.0...tokio-1.28.1) --- updated-dependencies: - dependency-name: tokio dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- client/network/Cargo.toml | 2 +- client/pov-recovery/Cargo.toml | 2 +- client/relay-chain-minimal-node/Cargo.toml | 2 +- client/relay-chain-rpc-interface/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2177fd5c957..f4f181303b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14054,9 +14054,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.28.0" +version = "1.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" +checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" dependencies = [ "autocfg", "bytes", diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index f208d9919ce..68b6054cb70 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -31,7 +31,7 @@ cumulus-relay-chain-interface = { path = "../relay-chain-interface" } [dev-dependencies] portpicker = "0.1.1" -tokio = { version = "1.28.0", features = ["macros"] } +tokio = { version = "1.28.1", features = ["macros"] } url = "2.3.1" # Substrate diff --git a/client/pov-recovery/Cargo.toml b/client/pov-recovery/Cargo.toml index 4bdfc9d60aa..e5034da396e 100644 --- a/client/pov-recovery/Cargo.toml +++ b/client/pov-recovery/Cargo.toml @@ -31,7 +31,7 @@ cumulus-relay-chain-interface = {path = "../relay-chain-interface"} async-trait = "0.1.68" [dev-dependencies] -tokio = { version = "1.28.0", features = ["macros"] } +tokio = { version = "1.28.1", features = ["macros"] } portpicker = "0.1.1" # Cumulus diff --git a/client/relay-chain-minimal-node/Cargo.toml b/client/relay-chain-minimal-node/Cargo.toml index e9552e382fb..866408b2cbb 100644 --- a/client/relay-chain-minimal-node/Cargo.toml +++ b/client/relay-chain-minimal-node/Cargo.toml @@ -42,4 +42,4 @@ lru = "0.9" tracing = "0.1.37" async-trait = "0.1.68" futures = "0.3.28" -tokio = { version = "1.28.0", features = ["macros"] } +tokio = { version = "1.28.1", features = ["macros"] } diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index 55ffd3d0c72..a3a5629e4e1 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -21,7 +21,7 @@ sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "mas sc-rpc-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } -tokio = { version = "1.28.0", features = ["sync"] } +tokio = { version = "1.28.1", features = ["sync"] } futures = "0.3.28" futures-timer = "3.0.2" diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index d1ef27e4424..ce096c8ea43 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -96,7 +96,7 @@ substrate-build-script-utils = { git = "https://github.com/paritytech/substrate" assert_cmd = "2.0" nix = { version = "0.26.1", features = ["signal"] } tempfile = "3.5.0" -tokio = { version = "1.28.0", features = ["macros", "time", "parking_lot"] } +tokio = { version = "1.28.1", features = ["macros", "time", "parking_lot"] } wait-timeout = "0.2" # purge_chain_works works with rococo-local and needs to allow this polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master", features = ["rococo-native"] } diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 5e217b43deb..11214404d44 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -16,7 +16,7 @@ criterion = { version = "0.4.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" serde = { version = "1.0.163", features = ["derive"] } -tokio = { version = "1.28.0", features = ["macros"] } +tokio = { version = "1.28.1", features = ["macros"] } tracing = "0.1.37" url = "2.3.1" From 8a2c762a7f77f803c7f6e78f33bc31d48f04a8ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 21:47:59 +0000 Subject: [PATCH 190/339] Bump anyhow from 1.0.69 to 1.0.71 (#2584) Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.69 to 1.0.71. - [Release notes](https://github.com/dtolnay/anyhow/releases) - [Commits](https://github.com/dtolnay/anyhow/compare/1.0.69...1.0.71) --- updated-dependencies: - dependency-name: anyhow dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f4f181303b4..57b6bb6e33a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -236,9 +236,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.69" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "approx" From 02b7034434838c29da685158607878cb063340c4 Mon Sep 17 00:00:00 2001 From: Tsvetomir Dimitrov Date: Tue, 16 May 2023 16:31:23 +0300 Subject: [PATCH 191/339] Bump polkadot (#2585) * Bump polkadot * Another bump * Fix for `GrandpaJustification` + `Debug` --------- Co-authored-by: Branislav Kontur --- Cargo.lock | 495 +++++++++--------- .../header-chain/src/justification.rs | 20 +- 2 files changed, 267 insertions(+), 248 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 57b6bb6e33a..c60504c035e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -579,7 +579,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "hash-db", "log", @@ -3781,7 +3781,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", ] @@ -3804,7 +3804,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support", "frame-support-procedural", @@ -3829,7 +3829,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3876,7 +3876,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3887,7 +3887,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3904,7 +3904,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support", "frame-system", @@ -3933,7 +3933,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-recursion", "futures", @@ -3953,7 +3953,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "bitflags", "environmental", @@ -3972,6 +3972,7 @@ dependencies = [ "sp-arithmetic", "sp-core", "sp-core-hashing-proc-macro", + "sp-debug-derive", "sp-inherents", "sp-io", "sp-runtime", @@ -3986,7 +3987,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "Inflector", "cfg-expr", @@ -4002,7 +4003,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4014,7 +4015,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "proc-macro2", "quote", @@ -4024,7 +4025,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "cfg-if", "frame-support", @@ -4043,7 +4044,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4058,7 +4059,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "sp-api", @@ -4067,7 +4068,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support", "parity-scale-codec", @@ -5084,7 +5085,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bitvec", "frame-benchmarking", @@ -5182,7 +5183,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "frame-support", "polkadot-primitives", @@ -6064,7 +6065,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "futures", "log", @@ -6083,7 +6084,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "anyhow", "jsonrpsee", @@ -6672,7 +6673,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support", "frame-system", @@ -6688,7 +6689,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support", "frame-system", @@ -6702,7 +6703,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6726,7 +6727,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6746,7 +6747,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6761,7 +6762,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support", "frame-system", @@ -6780,7 +6781,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6804,7 +6805,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6910,7 +6911,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -6954,7 +6955,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7024,7 +7025,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7041,7 +7042,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7059,7 +7060,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7082,7 +7083,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7095,7 +7096,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7113,7 +7114,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7131,7 +7132,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7154,7 +7155,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7170,7 +7171,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7190,7 +7191,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7221,7 +7222,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7238,7 +7239,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7255,7 +7256,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7300,7 +7301,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7316,7 +7317,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support", "frame-system", @@ -7333,7 +7334,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7353,7 +7354,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7364,7 +7365,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support", "frame-system", @@ -7381,7 +7382,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7420,7 +7421,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7437,7 +7438,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7452,7 +7453,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7470,7 +7471,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7485,7 +7486,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7504,7 +7505,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7521,7 +7522,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support", "frame-system", @@ -7542,7 +7543,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7558,7 +7559,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support", "frame-system", @@ -7572,7 +7573,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7595,7 +7596,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7606,7 +7607,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "log", "sp-arithmetic", @@ -7615,7 +7616,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7624,7 +7625,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7641,7 +7642,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7656,7 +7657,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7674,7 +7675,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7693,7 +7694,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-support", "frame-system", @@ -7709,7 +7710,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7725,7 +7726,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7737,7 +7738,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7769,7 +7770,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7785,7 +7786,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7800,7 +7801,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-benchmarking", "frame-support", @@ -7815,7 +7816,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7836,7 +7837,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "frame-benchmarking", "frame-support", @@ -8001,9 +8002,9 @@ dependencies = [ [[package]] name = "parity-db" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd4572a52711e2ccff02b4973ec7e4a5b5c23387ebbfbd6cd42b34755714cefc" +checksum = "4890dcb9556136a4ec2b0c51fa4a08c8b733b829506af8fff2e853f3a065985b" dependencies = [ "blake2", "crc32fast", @@ -8414,7 +8415,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8430,7 +8431,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8444,7 +8445,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "derive_more", "fatality", @@ -8467,7 +8468,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "fatality", "futures", @@ -8488,7 +8489,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8517,7 +8518,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "async-trait", "frame-benchmarking", @@ -8560,7 +8561,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "always-assert", "bitvec", @@ -8582,7 +8583,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "parity-scale-codec", "scale-info", @@ -8594,7 +8595,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "derive_more", "fatality", @@ -8619,7 +8620,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8633,7 +8634,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "futures", "futures-timer", @@ -8653,7 +8654,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "always-assert", "async-trait", @@ -8676,7 +8677,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "futures", "parity-scale-codec", @@ -8694,7 +8695,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bitvec", "derive_more", @@ -8723,7 +8724,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bitvec", "futures", @@ -8744,7 +8745,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bitvec", "fatality", @@ -8763,7 +8764,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8778,7 +8779,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "async-trait", "futures", @@ -8798,7 +8799,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "futures", "polkadot-node-metrics", @@ -8813,7 +8814,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "futures", "futures-timer", @@ -8830,7 +8831,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "fatality", "futures", @@ -8849,7 +8850,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "async-trait", "futures", @@ -8866,7 +8867,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bitvec", "fatality", @@ -8884,7 +8885,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "always-assert", "futures", @@ -8911,7 +8912,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "futures", "polkadot-node-primitives", @@ -8927,7 +8928,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "assert_matches", "cpu-time", @@ -8956,7 +8957,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "futures", "lru 0.9.0", @@ -8971,7 +8972,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "lazy_static", "log", @@ -8989,7 +8990,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bs58", "futures", @@ -9008,7 +9009,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "async-trait", "derive_more", @@ -9030,7 +9031,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bounded-vec", "futures", @@ -9052,7 +9053,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9062,7 +9063,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "async-trait", "futures", @@ -9080,7 +9081,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "async-trait", "derive_more", @@ -9103,7 +9104,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "async-trait", "derive_more", @@ -9136,7 +9137,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "async-trait", "futures", @@ -9159,7 +9160,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bounded-collections", "derive_more", @@ -9257,7 +9258,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9275,7 +9276,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9301,7 +9302,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9333,7 +9334,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bitvec", "frame-benchmarking", @@ -9427,7 +9428,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bitvec", "frame-benchmarking", @@ -9473,7 +9474,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "frame-support", "polkadot-primitives", @@ -9487,7 +9488,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bs58", "parity-scale-codec", @@ -9499,7 +9500,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bitflags", "bitvec", @@ -9543,7 +9544,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9653,7 +9654,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9674,7 +9675,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9684,7 +9685,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9709,7 +9710,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9770,7 +9771,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "frame-benchmarking", "frame-system", @@ -10562,7 +10563,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10648,7 +10649,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "frame-support", "polkadot-primitives", @@ -10895,7 +10896,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "log", "sp-core", @@ -10906,7 +10907,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "futures", @@ -10935,7 +10936,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "futures", "futures-timer", @@ -10958,7 +10959,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -10973,7 +10974,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -10992,7 +10993,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11003,7 +11004,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11043,7 +11044,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "fnv", "futures", @@ -11070,7 +11071,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "hash-db", "kvdb", @@ -11096,7 +11097,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "futures", @@ -11150,7 +11151,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "fork-tree", @@ -11186,7 +11187,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "futures", "jsonrpsee", @@ -11208,7 +11209,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11243,7 +11244,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "futures", "jsonrpsee", @@ -11262,7 +11263,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11275,7 +11276,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11315,7 +11316,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "finality-grandpa", "futures", @@ -11335,7 +11336,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "futures", @@ -11358,7 +11359,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11382,7 +11383,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11395,7 +11396,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "log", "sc-allocator", @@ -11408,7 +11409,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "anyhow", "cfg-if", @@ -11426,7 +11427,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "ansi_term", "futures", @@ -11442,7 +11443,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11456,7 +11457,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11501,7 +11502,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "cid", "futures", @@ -11521,7 +11522,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11549,7 +11550,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "ahash 0.8.2", "futures", @@ -11568,7 +11569,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11590,7 +11591,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11624,7 +11625,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11644,7 +11645,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11675,7 +11676,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "futures", "libp2p-identity", @@ -11688,7 +11689,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11697,7 +11698,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "futures", "jsonrpsee", @@ -11728,7 +11729,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11747,7 +11748,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "http", "jsonrpsee", @@ -11762,7 +11763,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11788,7 +11789,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "directories", @@ -11854,7 +11855,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "log", "parity-scale-codec", @@ -11865,7 +11866,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "clap 4.2.7", "fs4", @@ -11881,7 +11882,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11900,7 +11901,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "futures", "libc", @@ -11919,7 +11920,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "chrono", "futures", @@ -11938,7 +11939,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "ansi_term", "atty", @@ -11969,7 +11970,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11980,7 +11981,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "futures", @@ -12007,7 +12008,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "futures", @@ -12021,7 +12022,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-channel", "futures", @@ -12502,7 +12503,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "enumn", "parity-scale-codec", @@ -12579,7 +12580,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "hash-db", "log", @@ -12599,7 +12600,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "Inflector", "blake2", @@ -12613,7 +12614,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12626,7 +12627,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "integer-sqrt", "num-traits", @@ -12640,7 +12641,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12653,7 +12654,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "sp-api", @@ -12665,7 +12666,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "futures", "log", @@ -12683,7 +12684,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "futures", @@ -12698,7 +12699,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "parity-scale-codec", @@ -12716,7 +12717,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "parity-scale-codec", @@ -12737,7 +12738,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12756,7 +12757,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "finality-grandpa", "log", @@ -12774,7 +12775,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "scale-info", @@ -12786,7 +12787,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12830,7 +12831,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "blake2b_simd", "byteorder", @@ -12844,7 +12845,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "proc-macro2", "quote", @@ -12855,7 +12856,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -12864,7 +12865,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "proc-macro2", "quote", @@ -12874,7 +12875,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "environmental", "parity-scale-codec", @@ -12885,7 +12886,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -12900,7 +12901,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "bytes", "ed25519", @@ -12926,7 +12927,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "lazy_static", "sp-core", @@ -12937,7 +12938,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "futures", "parity-scale-codec", @@ -12951,7 +12952,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -12960,7 +12961,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -12971,7 +12972,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -12989,7 +12990,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "scale-info", @@ -13003,7 +13004,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "sp-api", "sp-core", @@ -13013,7 +13014,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "backtrace", "lazy_static", @@ -13023,7 +13024,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "rustc-hash", "serde", @@ -13033,7 +13034,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "either", "hash256-std-hasher", @@ -13055,7 +13056,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13073,7 +13074,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "Inflector", "proc-macro-crate", @@ -13085,7 +13086,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "scale-info", @@ -13099,7 +13100,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "scale-info", @@ -13112,7 +13113,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "hash-db", "log", @@ -13132,7 +13133,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "log", "parity-scale-codec", @@ -13150,12 +13151,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13168,7 +13169,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "futures-timer", @@ -13183,7 +13184,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "sp-std", @@ -13195,7 +13196,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "sp-api", "sp-runtime", @@ -13204,7 +13205,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "log", @@ -13220,7 +13221,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13243,7 +13244,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13260,7 +13261,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13271,7 +13272,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13285,7 +13286,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "parity-scale-codec", "scale-info", @@ -13620,7 +13621,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "platforms 2.0.0", ] @@ -13628,7 +13629,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13647,7 +13648,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "hyper", "log", @@ -13659,7 +13660,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "jsonrpsee", @@ -13672,7 +13673,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "jsonrpsee", "log", @@ -13691,7 +13692,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13738,7 +13739,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "ansi_term", "build-helper", @@ -13865,7 +13866,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "frame-support", "polkadot-primitives", @@ -14176,9 +14177,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.3.5" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" +checksum = "5d1d42a9b3f3ec46ba828e8d376aec14592ea199f70a06a548587ecd1c4ab658" dependencies = [ "bitflags", "bytes", @@ -14251,7 +14252,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14262,7 +14263,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14392,7 +14393,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" dependencies = [ "async-trait", "clap 4.2.7", @@ -15325,7 +15326,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bitvec", "frame-benchmarking", @@ -15417,7 +15418,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "frame-support", "polkadot-primitives", @@ -15919,7 +15920,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "bounded-collections", "derivative", @@ -15935,7 +15936,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "frame-support", "frame-system", @@ -15956,7 +15957,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "environmental", "frame-benchmarking", @@ -15976,7 +15977,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#57ec016a97b0e67127bcdf24965ff6bfc16d4cd7" +source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" dependencies = [ "Inflector", "proc-macro2", diff --git a/bridges/primitives/header-chain/src/justification.rs b/bridges/primitives/header-chain/src/justification.rs index 06ed782763d..748f97b6a47 100644 --- a/bridges/primitives/header-chain/src/justification.rs +++ b/bridges/primitives/header-chain/src/justification.rs @@ -38,7 +38,7 @@ use sp_std::{ /// /// This particular proof is used to prove that headers on a bridged chain /// (so not our chain) have been finalized correctly. -#[derive(Encode, Decode, RuntimeDebug, Clone, PartialEq, Eq, TypeInfo)] +#[derive(Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] pub struct GrandpaJustification { /// The round (voting period) this justification is valid for. pub round: u64, @@ -49,6 +49,24 @@ pub struct GrandpaJustification { pub votes_ancestries: Vec

, } +impl sp_std::fmt::Debug for GrandpaJustification
{ + fn fmt(&self, fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + #[cfg(feature = "std")] + { + fmt.debug_struct("GrandpaJustification") + .field("round", &self.round) + .field("commit", &self.commit) + .field("votes_ancestries", &self.votes_ancestries) + .finish() + } + + #[cfg(not(feature = "std"))] + { + fmt.write_str("") + } + } +} + impl GrandpaJustification { /// Returns reasonable size of justification using constants from the provided chain. /// From c409dc1a816a8ea4331c7d5a19346268d335f276 Mon Sep 17 00:00:00 2001 From: Muharem Ismailov Date: Tue, 16 May 2023 17:03:26 +0200 Subject: [PATCH 192/339] Collectives integration tests xcm v3 (#2221) * Collectives integration tests xcm v3 * remove comment * review fixs --------- Co-authored-by: parity-processbot <> --- .../collectives/0_xcm/0_init.yml | 27 +++-- .../collectives/0_xcm/1_teleport.yml | 30 ++---- .../collectives/0_xcm/2_reserve.yml | 45 +------- .../1_alliance/1_init_alliance.yml | 100 +++++++++++++----- .../collectives/1_alliance/3_kick_member.yml | 44 ++++---- 5 files changed, 129 insertions(+), 117 deletions(-) diff --git a/parachains/integration-tests/collectives/0_xcm/0_init.yml b/parachains/integration-tests/collectives/0_xcm/0_init.yml index 8c03348025d..48a86f9136e 100644 --- a/parachains/integration-tests/collectives/0_xcm/0_init.yml +++ b/parachains/integration-tests/collectives/0_xcm/0_init.yml @@ -7,7 +7,7 @@ settings: wsPort: 9710 paraId: &cp_id 1001 variables: - xcm_version: &xcm_version '2' + xcm_version: &xcm_version '3' chains: accounts: alice_signer: &alice_signer //Alice @@ -62,13 +62,26 @@ tests: pallet: xcmPallet call: send args: [ - { v1: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination + { v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination { - v2: [ # message + v3: [ # message + { + UnpaidExecution: { + weightLimit: { + limited: { + refTime: 2200000000, # 2_200_000_000 + proofSize: 200000, # 200_000 + }, + } + } + }, { Transact: { - originType: Superuser, - requireWeightAtMost: 1000000000, # 1_000_000_000 + originKind: Superuser, + requireWeightAtMost: { + refTime: 200000000, # 200_000_000 + proofSize: 0, + }, call: $ap_force_xcm_version } } @@ -89,7 +102,5 @@ tests: - name: dmpQueue.ExecutedDownward chain: *collectives_parachain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # the weight must be static - value: 2,000,000,000 diff --git a/parachains/integration-tests/collectives/0_xcm/1_teleport.yml b/parachains/integration-tests/collectives/0_xcm/1_teleport.yml index cedd08438ad..2b1a6bba8f1 100644 --- a/parachains/integration-tests/collectives/0_xcm/1_teleport.yml +++ b/parachains/integration-tests/collectives/0_xcm/1_teleport.yml @@ -7,8 +7,6 @@ settings: wsPort: 9710 paraId: &cp_id 1001 variables: - weight_to_send_teleport: &weight_to_send_teleport 2,000,000,000 # must be same for both chains - weight_to_receive_teleport: &weight_to_receive_teleport 4,000,000,000 # must be same for both chains accounts: alice_signer: &acc_alice_signer //Alice alice_account32: &acc_alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' @@ -39,10 +37,10 @@ tests: pallet: xcmPallet call: teleportAssets args: [ - { v1: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination - { v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *acc_alice_acc32 }}}}}, # beneficiary + { v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination + { v3: { parents: 0, interior: { x1: { accountId32: { id: *acc_alice_acc32 }}}}}, # beneficiary { - v1: [ + v3: [ # { # # TODO use a separate Assets to pay a fee, to receive an exact amount of assets on beneficiary account. # # a call with two assets fails with an error right now. @@ -61,17 +59,13 @@ tests: - name: xcmPallet.Attempted chain: *relay_chain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # the weight must be static - value: *weight_to_send_teleport - name: dmpQueue.ExecutedDownward chain: *collectives_parachain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # the weight must be static - value: *weight_to_receive_teleport - queries: balance_rc_alice_2: chain: *relay_chain @@ -113,10 +107,10 @@ tests: pallet: polkadotXcm call: teleportAssets args: [ - { v1: { parents: 1, interior: { here: true }}}, # destination - { v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *acc_alice_acc32 }}}}}, # beneficiary + { v3: { parents: 1, interior: { here: true }}}, # destination + { v3: { parents: 0, interior: { x1: { accountId32: { id: *acc_alice_acc32 }}}}}, # beneficiary { - v1: [ + v3: [ { id: { concrete: { parents: 1, interior: { here: true }}}, fun: { fungible: 10000000000000 } # 10_000_000_000_000 @@ -136,10 +130,8 @@ tests: value: 10000000000000 - name: polkadotXcm.Attempted attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # the weight must be static - value: *weight_to_send_teleport - name: balances.Withdraw chain: *relay_chain attributes: @@ -149,10 +141,8 @@ tests: - name: ump.ExecutedUpward chain: *relay_chain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # the weight must be static - value: *weight_to_receive_teleport - queries: balance_rc_alice_3: chain: *relay_chain diff --git a/parachains/integration-tests/collectives/0_xcm/2_reserve.yml b/parachains/integration-tests/collectives/0_xcm/2_reserve.yml index 0af20ba7daa..ac42ca4a4b0 100644 --- a/parachains/integration-tests/collectives/0_xcm/2_reserve.yml +++ b/parachains/integration-tests/collectives/0_xcm/2_reserve.yml @@ -7,8 +7,6 @@ settings: wsPort: 9710 paraId: &cp_id 1001 variables: - xcm_version: &xcm_version '2' - weight_to_send_reserve: &weight_to_send_reserve 1,000,000,000 # must be same for both chains chains: accounts: alice_signer: &alice_signer //Alice @@ -26,10 +24,10 @@ tests: pallet: xcmPallet call: reserveTransferAssets args: [ - { v1: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination - { v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *alice_acc32 }}}}}, # beneficiary + { v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination + { v3: { parents: 0, interior: { x1: { accountId32: { id: *alice_acc32 }}}}}, # beneficiary { - v1: [ + v3: [ { id: { concrete: { 0, interior: { here: true }}}, fun: { fungible: 20000000000000 } # 20_000_000_000_000 @@ -42,43 +40,10 @@ tests: - name: xcmPallet.Attempted chain: *relay_chain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # the weight must be static - value: *weight_to_send_reserve - name: dmpQueue.ExecutedDownward chain: *collectives_parachain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Incomplete - # the weight must be static - value: [1000000000, UntrustedReserveLocation] - - - name: Reserve assets from Collectives Parachain to Relay Chain fails - actions: - - extrinsics: - - chain: *collectives_parachain - signer: *alice_signer - pallet: polkadotXcm - call: reserveTransferAssets - args: [ - { v1: { parents: 1, interior: { here: true }}}, # destination - { v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *alice_acc32 }}}}}, # beneficiary - { - v1: [ - { - id: { concrete: { parents: 1, interior: { here: true }}}, - fun: { fungible: 10000000000000 } # 10_000_000_000_000 - } - ] - }, # assets - 0, # feeAssetItem - ] - events: - - name: system.ExtrinsicFailed - attributes: - - type: SpRuntimeDispatchError - key: dispatchError - # TODO assert variant - # issue - https://github.com/paritytech/parachains-integration-tests/issues/59 - value: {"Module":{"index":"31","error":"0x02000000"}} diff --git a/parachains/integration-tests/collectives/1_alliance/1_init_alliance.yml b/parachains/integration-tests/collectives/1_alliance/1_init_alliance.yml index 2891d01ca02..8e9adbbeb47 100644 --- a/parachains/integration-tests/collectives/1_alliance/1_init_alliance.yml +++ b/parachains/integration-tests/collectives/1_alliance/1_init_alliance.yml @@ -81,13 +81,26 @@ tests: pallet: xcmPallet call: send args: [ - { v1: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination + { v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination { - v2: [ # message + v3: [ # message + { + UnpaidExecution: { + weightLimit: { + limited: { + refTime: 3000000000, # 3_000_000_000 + proofSize: 2000000, # 2_000_000 + }, + } + } + }, { Transact: { - originType: Superuser, - requireWeightAtMost: 1000000000, # 1_000_000_000 + originKind: Superuser, + requireWeightAtMost: { + refTime: 1000000000, # 1_000_000_000 + proofSize: 1000000, # 1_000_000 + }, call: $init_alliance_members } } @@ -105,10 +118,8 @@ tests: - name: dmpQueue.ExecutedDownward chain: *collectives_parachain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # we don't know how much weight will be spent for custom call within Transact operation - # value: skipping the assertion - name: Alliance init call fails. actions: @@ -119,13 +130,26 @@ tests: pallet: xcmPallet call: send args: [ - { v1: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination + { v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination { - v2: [ # message + v3: [ # message + { + UnpaidExecution: { + weightLimit: { + limited: { + refTime: 3000000000, # 3_000_000_000 + proofSize: 2000000, # 2_000_000 + }, + } + } + }, { Transact: { - originType: Superuser, - requireWeightAtMost: 1000000000, # 1_000_000_000 + originKind: Superuser, + requireWeightAtMost: { + refTime: 1000000000, # 1_000_000_000 + proofSize: 1000000, # 1_000_000 + }, call: $init_alliance_voting_members } } @@ -145,10 +169,8 @@ tests: - name: dmpQueue.ExecutedDownward chain: *collectives_parachain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # the call must fail, the weight spent is static - value: 2,000,000,000 - name: Alliance disbanded and initialized again. actions: @@ -159,13 +181,26 @@ tests: pallet: xcmPallet call: send args: [ - { v1: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination + { v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination { - v2: [ # message + v3: [ # message + { + UnpaidExecution: { + weightLimit: { + limited: { + refTime: 5000000000, # 3_000_000_000 + proofSize: 1000000, # 1_000_000 + }, + } + } + }, { Transact: { - originType: Superuser, - requireWeightAtMost: 100000000000, # 100_000_000_000 + originKind: Superuser, + requireWeightAtMost: { + refTime: 3000000000, # 3_000_000_000 + proofSize: 200000, # 200_000 + }, call: $disband } } @@ -193,10 +228,8 @@ tests: - name: dmpQueue.ExecutedDownward chain: *collectives_parachain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # we don't know how much weight will be spent for custom call within Transact operation - # value: skipping the assertion - name: Alliance initiated, founders and fellows are set. actions: - extrinsics: @@ -206,13 +239,26 @@ tests: pallet: xcmPallet call: send args: [ - { v1: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination + { v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination { - v2: [ # message + v3: [ # message + { + UnpaidExecution: { + weightLimit: { + limited: { + refTime: 3000000000, # 3_000_000_000 + proofSize: 2000000, # 2_000_000 + }, + } + } + }, { Transact: { - originType: Superuser, - requireWeightAtMost: 1000000000, # 1_000_000_000 + originKind: Superuser, + requireWeightAtMost: { + refTime: 1000000000, # 1_000_000_000 + proofSize: 1000000, # 1_000_000 + }, call: $init_alliance_members } } @@ -230,8 +276,6 @@ tests: - name: dmpQueue.ExecutedDownward chain: *collectives_parachain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # we don't know how much weight will be spent for custom call within Transact operation - # value: skipping the assertion diff --git a/parachains/integration-tests/collectives/1_alliance/3_kick_member.yml b/parachains/integration-tests/collectives/1_alliance/3_kick_member.yml index 6283bacfdb9..62c61787e21 100644 --- a/parachains/integration-tests/collectives/1_alliance/3_kick_member.yml +++ b/parachains/integration-tests/collectives/1_alliance/3_kick_member.yml @@ -8,9 +8,6 @@ settings: paraId: &cp_id 1001 variables: init_teleport_amount: &init_teleport_amount 20000000000000 # 20_000_000_000_000 - weight_to_send_teleport: &weight_to_send_teleport 2,000,000,000 # must be same for both chains - weight_to_receive_teleport: &weight_to_receive_teleport 4,000,000,000 # must be same for both chains - weight_to_receive_transact: &weight_to_receive_transact 3,000,000,000 # must be same for both chains accounts: alice_signer: &acc_alice_signer //Alice treasury_account32: &acc_treasury_acc32 '0x6d6f646c70792f74727372790000000000000000000000000000000000000000' @@ -36,34 +33,28 @@ tests: pallet: xcmPallet call: limitedTeleportAssets args: [ - { v1: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination - { v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *acc_alice_acc32 }}}}}, # beneficiary - { v1: [ { id: { concrete: { 0, interior: { here: true }}}, fun: { fungible: *init_teleport_amount }} ] }, # assets + { v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination + { v3: { parents: 0, interior: { x1: { accountId32: { id: *acc_alice_acc32 }}}}}, # beneficiary + { v3: [ { id: { concrete: { 0, interior: { here: true }}}, fun: { fungible: *init_teleport_amount }} ] }, # assets 0, # feeAssetItem { unlimited: true } # weightLimit ] events: - name: xcmPallet.Attempted attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - value: *weight_to_send_teleport - name: balances.Deposit chain: *collectives_parachain attributes: - type: AccountId32 key: who value: *acc_alice_ss58 - - type: u128 - key: amount - value: 20,000,000,000,000 - name: dmpQueue.ExecutedDownward chain: *collectives_parachain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # must be static - value: *weight_to_receive_teleport - name: Get the balances of the Relay Chain's treasury & Collectives parachain's future alliance member actions: - queries: @@ -129,13 +120,26 @@ tests: pallet: xcmPallet call: send args: [ - { v1: { parents: 0, interior: { x1: { parachain: *cp_id }}}}, # destination + { v3: { parents: 0, interior: { x1: { parachain: *cp_id }}}}, # destination { - v2: [ #message + v3: [ #message + { + UnpaidExecution: { + weightLimit: { + limited: { + refTime: 4000000000, # 4_000_000_000 + proofSize: 2000000, # 2_000_000 + }, + } + } + }, { Transact: { - originType: Superuser, - requireWeightAtMost: 2000000000, + originKind: Superuser, + requireWeightAtMost: { + refTime: 2000000000, # 2_000_000_000 + proofSize: 1000000, # 1_000_000 + }, call: $alliance_kick_member } } @@ -157,10 +161,8 @@ tests: - name: dmpQueue.ExecutedDownward chain: *collectives_parachain attributes: - - type: XcmV2TraitsOutcome + - type: XcmV3TraitsOutcome xcmOutcome: Complete - # must be static - value: *weight_to_receive_transact - queries: balance_rc_treasury_after: From e23be19cb7ae0240b39c41ecc809ead31384803a Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 17 May 2023 00:33:30 +0200 Subject: [PATCH 193/339] BridgeHubRococo/Wococo nits + updated subtree (#2572) * Nits (merge before separatelly) * Small cosmetics for Rococo/Wococo bridge local run * Squashed 'bridges/' changes from 04b3dda6aa..5fc377ab34 5fc377ab34 Support for kusama-polkadot relaying (#2128) 01f4b7f1ba Fix clippy warnings (#2127) 696ff1c368 BHK/P alignments (#2115) 2a66aa3248 Small fixes (#2126) 7810f1a988 Cosmetics (#2124) daf250f69c Remove some `expect()` statements (#2123) 1c5fba8274 temporarily remove balance guard (#2121) 3d0e547361 Propagate message receival confirmation errors (#2116) 1c33143f07 Propagate message verification errors (#2114) b075b00910 Bump time from 0.3.20 to 0.3.21 51a3a51618 Bump serde from 1.0.160 to 1.0.162 da88d044a6 Bump clap from 4.2.5 to 4.2.7 cdca322cd6 Bump sysinfo from 0.28.4 to 0.29.0 git-subtree-dir: bridges git-subtree-split: 5fc377ab34f7dfd3293099c5feec49255e827812 * Fix * Allow to change storage constants (DeliveryReward, RequiredStakeForStakeAndSlash) + tests * Clippy * New SA for RO/WO * Squashed 'bridges/' changes from 5fc377ab34..0f6091d481 0f6091d481 Bump polkadot/substrate (#2134) 9233f0a337 Bump tokio from 1.28.0 to 1.28.1 a29c1caa93 Bump serde from 1.0.162 to 1.0.163 git-subtree-dir: bridges git-subtree-split: 0f6091d48184ebb4f75cb3089befa6b92cf37335 --- Cargo.lock | 3 +- bridges/bin/runtime-common/Cargo.toml | 6 +- bridges/bin/runtime-common/src/messages.rs | 220 ++++++++---------- .../runtime-common/src/messages_call_ext.rs | 2 +- .../src/refund_relayer_extension.rs | 19 +- bridges/modules/grandpa/src/lib.rs | 10 +- bridges/modules/messages/src/benchmarking.rs | 9 +- bridges/modules/messages/src/inbound_lane.rs | 45 ++-- bridges/modules/messages/src/lib.rs | 198 +++++++--------- bridges/modules/messages/src/mock.rs | 27 +-- bridges/modules/messages/src/outbound_lane.rs | 156 ++++++------- bridges/modules/parachains/src/lib.rs | 207 ++++++++-------- .../chain-bridge-hub-kusama/src/lib.rs | 2 - .../chain-bridge-hub-polkadot/src/lib.rs | 3 - bridges/primitives/chain-kusama/src/lib.rs | 7 + bridges/primitives/chain-polkadot/src/lib.rs | 7 + .../header-chain/src/justification.rs | 1 + bridges/primitives/header-chain/src/lib.rs | 12 +- bridges/primitives/messages/Cargo.toml | 2 + bridges/primitives/messages/src/lib.rs | 108 +++++---- .../primitives/messages/src/source_chain.rs | 30 +-- .../primitives/messages/src/target_chain.rs | 16 +- .../polkadot-core/src/parachains.rs | 4 +- bridges/primitives/runtime/src/chain.rs | 8 + bridges/primitives/runtime/src/lib.rs | 20 +- bridges/scripts/verify-pallets-build.sh | 1 + parachain-template/runtime/src/xcm_config.rs | 2 +- .../assets/westmint/src/xcm_config.rs | 1 + parachains/runtimes/bridge-hubs/README.md | 21 +- .../src/bridge_hub_rococo_config.rs | 6 +- .../src/bridge_hub_wococo_config.rs | 6 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 2 - .../bridge-hub-rococo/src/weights/mod.rs | 4 +- .../bridge-hub-rococo/src/xcm_config.rs | 20 +- .../bridge-hub-rococo/tests/tests.rs | 66 +++++- .../bridge-hubs/test-utils/src/test_cases.rs | 102 +++++++- .../runtimes/testing/penpal/src/xcm_config.rs | 2 +- .../testing/rococo-parachain/src/lib.rs | 2 +- scripts/bridges_rococo_wococo.sh | 42 +++- .../bridge_hub_rococo_local_network.toml | 4 +- .../bridge_hub_wococo_local_network.toml | 4 +- 41 files changed, 779 insertions(+), 628 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c60504c035e..85caa4f97f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -815,6 +815,7 @@ dependencies = [ name = "bp-messages" version = "0.1.0" dependencies = [ + "bp-header-chain", "bp-runtime", "frame-support", "hex", @@ -1193,7 +1194,6 @@ dependencies = [ "pallet-bridge-relayers", "pallet-transaction-payment", "pallet-utility", - "pallet-xcm", "parity-scale-codec", "scale-info", "sp-api", @@ -1205,7 +1205,6 @@ dependencies = [ "static_assertions", "xcm", "xcm-builder", - "xcm-executor", ] [[package]] diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml index 039e323b9b7..08d102cc753 100644 --- a/bridges/bin/runtime-common/Cargo.toml +++ b/bridges/bin/runtime-common/Cargo.toml @@ -40,10 +40,8 @@ sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", d sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } # Polkadot dependencies -pallet-xcm = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } xcm = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } xcm-builder = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } -xcm-executor = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } [dev-dependencies] bp-test-utils = { path = "../../primitives/test-utils" } @@ -68,7 +66,6 @@ std = [ "pallet-bridge-relayers/std", "pallet-transaction-payment/std", "pallet-utility/std", - "pallet-xcm/std", "scale-info/std", "sp-api/std", "sp-core/std", @@ -78,13 +75,12 @@ std = [ "sp-trie/std", "xcm/std", "xcm-builder/std", - "xcm-executor/std", ] runtime-benchmarks = [ "pallet-bridge-grandpa/runtime-benchmarks", "pallet-bridge-messages/runtime-benchmarks", "pallet-bridge-parachains/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", + "pallet-bridge-relayers/runtime-benchmarks", "xcm-builder/runtime-benchmarks", ] integrity-test = [ diff --git a/bridges/bin/runtime-common/src/messages.rs b/bridges/bin/runtime-common/src/messages.rs index 6f6b1959577..e6c7deb98a2 100644 --- a/bridges/bin/runtime-common/src/messages.rs +++ b/bridges/bin/runtime-common/src/messages.rs @@ -22,18 +22,19 @@ pub use bp_runtime::{RangeInclusiveExt, UnderlyingChainOf, UnderlyingChainProvider}; -use bp_header_chain::{HeaderChain, HeaderChainError}; +use bp_header_chain::HeaderChain; use bp_messages::{ source_chain::{LaneMessageVerifier, TargetHeaderChain}, target_chain::{ProvedLaneMessages, ProvedMessages, SourceHeaderChain}, InboundLaneData, LaneId, Message, MessageKey, MessageNonce, MessagePayload, OutboundLaneData, + VerificationError, }; -use bp_runtime::{Chain, RawStorageProof, Size, StorageProofChecker, StorageProofError}; +use bp_runtime::{Chain, RawStorageProof, Size, StorageProofChecker}; use codec::{Decode, Encode}; use frame_support::{traits::Get, weights::Weight, RuntimeDebug}; use hash_db::Hasher; use scale_info::TypeInfo; -use sp_std::{convert::TryFrom, fmt::Debug, marker::PhantomData, vec::Vec}; +use sp_std::{convert::TryFrom, marker::PhantomData, vec::Vec}; /// Bidirectional message bridge. pub trait MessageBridge { @@ -74,29 +75,6 @@ pub type BalanceOf = bp_runtime::BalanceOf>; /// Type of origin that is used on the chain. pub type OriginOf = ::RuntimeOrigin; -/// Error that happens during message verification. -#[derive(Debug, PartialEq, Eq)] -pub enum Error { - /// The message proof is empty. - EmptyMessageProof, - /// Error returned by the bridged header chain. - HeaderChain(HeaderChainError), - /// Error returned while reading/decoding inbound lane data from the storage proof. - InboundLaneStorage(StorageProofError), - /// The declared message weight is incorrect. - InvalidMessageWeight, - /// Declared messages count doesn't match actual value. - MessagesCountMismatch, - /// Error returned while reading/decoding message data from the storage proof. - MessageStorage(StorageProofError), - /// The message is too large. - MessageTooLarge, - /// Error returned while reading/decoding outbound lane data from the storage proof. - OutboundLaneStorage(StorageProofError), - /// Storage proof related error. - StorageProof(StorageProofError), -} - /// Sub-module that is declaring types required for processing This -> Bridged chain messages. pub mod source { use super::*; @@ -169,14 +147,12 @@ pub mod source { + Into>>, OriginOf>>>, AccountIdOf>: PartialEq + Clone, { - type Error = &'static str; - fn verify_message( _submitter: &OriginOf>, _lane: &LaneId, _lane_outbound_data: &OutboundLaneData, _payload: &FromThisChainMessagePayload, - ) -> Result<(), Self::Error> { + ) -> Result<(), VerificationError> { // IMPORTANT: any error that is returned here is fatal for the bridge, because // this code is executed at the bridge hub and message sender actually lives // at some sibling parachain. So we are failing **after** the message has been @@ -200,16 +176,15 @@ pub mod source { impl TargetHeaderChain>> for TargetHeaderChainAdapter { - type Error = Error; type MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof>>; - fn verify_message(payload: &FromThisChainMessagePayload) -> Result<(), Self::Error> { + fn verify_message(payload: &FromThisChainMessagePayload) -> Result<(), VerificationError> { verify_chain_message::(payload) } fn verify_messages_delivery_proof( proof: Self::MessagesDeliveryProof, - ) -> Result<(LaneId, InboundLaneData>>), Self::Error> { + ) -> Result<(LaneId, InboundLaneData>>), VerificationError> { verify_messages_delivery_proof::(proof) } } @@ -221,7 +196,7 @@ pub mod source { /// check) that would reject message (see `FromThisChainMessageVerifier`). pub fn verify_chain_message( payload: &FromThisChainMessagePayload, - ) -> Result<(), Error> { + ) -> Result<(), VerificationError> { // IMPORTANT: any error that is returned here is fatal for the bridge, because // this code is executed at the bridge hub and message sender actually lives // at some sibling parachain. So we are failing **after** the message has been @@ -241,9 +216,9 @@ pub mod source { // the message itself. The proof is always larger than the message. But unless chain state // is enormously large, it should be several dozens/hundreds of bytes. The delivery // transaction also contains signatures and signed extensions. Because of this, we reserve - // 1/3 of the the maximal extrinsic weight for this data. + // 1/3 of the the maximal extrinsic size for this data. if payload.len() > maximal_message_size::() as usize { - return Err(Error::MessageTooLarge) + return Err(VerificationError::MessageTooLarge) } Ok(()) @@ -255,31 +230,26 @@ pub mod source { /// parachains, please use the `verify_messages_delivery_proof_from_parachain`. pub fn verify_messages_delivery_proof( proof: FromBridgedChainMessagesDeliveryProof>>, - ) -> Result, Error> { + ) -> Result, VerificationError> { let FromBridgedChainMessagesDeliveryProof { bridged_header_hash, storage_proof, lane } = proof; - B::BridgedHeaderChain::parse_finalized_storage_proof( - bridged_header_hash, - storage_proof, - |mut storage| { - // Messages delivery proof is just proof of single storage key read => any error - // is fatal. - let storage_inbound_lane_data_key = - bp_messages::storage_keys::inbound_lane_data_key( - B::BRIDGED_MESSAGES_PALLET_NAME, - &lane, - ); - let inbound_lane_data = storage - .read_and_decode_mandatory_value(storage_inbound_lane_data_key.0.as_ref()) - .map_err(Error::InboundLaneStorage)?; - - // check that the storage proof doesn't have any untouched trie nodes - storage.ensure_no_unused_nodes().map_err(Error::StorageProof)?; - - Ok((lane, inbound_lane_data)) - }, - ) - .map_err(Error::HeaderChain)? + let mut storage = + B::BridgedHeaderChain::storage_proof_checker(bridged_header_hash, storage_proof) + .map_err(VerificationError::HeaderChain)?; + // Messages delivery proof is just proof of single storage key read => any error + // is fatal. + let storage_inbound_lane_data_key = bp_messages::storage_keys::inbound_lane_data_key( + B::BRIDGED_MESSAGES_PALLET_NAME, + &lane, + ); + let inbound_lane_data = storage + .read_and_decode_mandatory_value(storage_inbound_lane_data_key.0.as_ref()) + .map_err(VerificationError::InboundLaneStorage)?; + + // check that the storage proof doesn't have any untouched trie nodes + storage.ensure_no_unused_nodes().map_err(VerificationError::StorageProof)?; + + Ok((lane, inbound_lane_data)) } } @@ -335,13 +305,12 @@ pub mod target { pub struct SourceHeaderChainAdapter(PhantomData); impl SourceHeaderChain for SourceHeaderChainAdapter { - type Error = Error; type MessagesProof = FromBridgedChainMessagesProof>>; fn verify_messages_proof( proof: Self::MessagesProof, messages_count: u32, - ) -> Result, Self::Error> { + ) -> Result, VerificationError> { verify_messages_proof::(proof, messages_count) } } @@ -357,7 +326,7 @@ pub mod target { pub fn verify_messages_proof( proof: FromBridgedChainMessagesProof>>, messages_count: u32, - ) -> Result, Error> { + ) -> Result, VerificationError> { let FromBridgedChainMessagesProof { bridged_header_hash, storage_proof, @@ -365,57 +334,52 @@ pub mod target { nonces_start, nonces_end, } = proof; + let storage = + B::BridgedHeaderChain::storage_proof_checker(bridged_header_hash, storage_proof) + .map_err(VerificationError::HeaderChain)?; + let mut parser = StorageProofCheckerAdapter::<_, B> { storage, _dummy: Default::default() }; let nonces_range = nonces_start..=nonces_end; - B::BridgedHeaderChain::parse_finalized_storage_proof( - bridged_header_hash, - storage_proof, - |storage| { - let mut parser = - StorageProofCheckerAdapter::<_, B> { storage, _dummy: Default::default() }; - - // receiving proofs where end < begin is ok (if proof includes outbound lane state) - let messages_in_the_proof = nonces_range.checked_len().unwrap_or(0); - if messages_in_the_proof != MessageNonce::from(messages_count) { - return Err(Error::MessagesCountMismatch) - } - - // Read messages first. All messages that are claimed to be in the proof must - // be in the proof. So any error in `read_value`, or even missing value is fatal. - // - // Mind that we allow proofs with no messages if outbound lane state is proved. - let mut messages = Vec::with_capacity(messages_in_the_proof as _); - for nonce in nonces_range { - let message_key = MessageKey { lane_id: lane, nonce }; - let message_payload = parser.read_and_decode_message_payload(&message_key)?; - messages.push(Message { key: message_key, payload: message_payload }); - } - - // Now let's check if proof contains outbound lane state proof. It is optional, so - // we simply ignore `read_value` errors and missing value. - let proved_lane_messages = ProvedLaneMessages { - lane_state: parser.read_and_decode_outbound_lane_data(&lane)?, - messages, - }; - - // Now we may actually check if the proof is empty or not. - if proved_lane_messages.lane_state.is_none() && - proved_lane_messages.messages.is_empty() - { - return Err(Error::EmptyMessageProof) - } - - // check that the storage proof doesn't have any untouched trie nodes - parser.storage.ensure_no_unused_nodes().map_err(Error::StorageProof)?; - - // We only support single lane messages in this generated_schema - let mut proved_messages = ProvedMessages::new(); - proved_messages.insert(lane, proved_lane_messages); - - Ok(proved_messages) - }, - ) - .map_err(Error::HeaderChain)? + // receiving proofs where end < begin is ok (if proof includes outbound lane state) + let messages_in_the_proof = nonces_range.checked_len().unwrap_or(0); + if messages_in_the_proof != MessageNonce::from(messages_count) { + return Err(VerificationError::MessagesCountMismatch) + } + + // Read messages first. All messages that are claimed to be in the proof must + // be in the proof. So any error in `read_value`, or even missing value is fatal. + // + // Mind that we allow proofs with no messages if outbound lane state is proved. + let mut messages = Vec::with_capacity(messages_in_the_proof as _); + for nonce in nonces_range { + let message_key = MessageKey { lane_id: lane, nonce }; + let message_payload = parser.read_and_decode_message_payload(&message_key)?; + messages.push(Message { key: message_key, payload: message_payload }); + } + + // Now let's check if proof contains outbound lane state proof. It is optional, so + // we simply ignore `read_value` errors and missing value. + let proved_lane_messages = ProvedLaneMessages { + lane_state: parser.read_and_decode_outbound_lane_data(&lane)?, + messages, + }; + + // Now we may actually check if the proof is empty or not. + if proved_lane_messages.lane_state.is_none() && proved_lane_messages.messages.is_empty() { + return Err(VerificationError::EmptyMessageProof) + } + + // check that the storage proof doesn't have any untouched trie nodes + parser + .storage + .ensure_no_unused_nodes() + .map_err(VerificationError::StorageProof)?; + + // We only support single lane messages in this generated_schema + let mut proved_messages = ProvedMessages::new(); + proved_messages.insert(lane, proved_lane_messages); + + Ok(proved_messages) } struct StorageProofCheckerAdapter { @@ -427,7 +391,7 @@ pub mod target { fn read_and_decode_outbound_lane_data( &mut self, lane_id: &LaneId, - ) -> Result, Error> { + ) -> Result, VerificationError> { let storage_outbound_lane_data_key = bp_messages::storage_keys::outbound_lane_data_key( B::BRIDGED_MESSAGES_PALLET_NAME, lane_id, @@ -435,13 +399,13 @@ pub mod target { self.storage .read_and_decode_opt_value(storage_outbound_lane_data_key.0.as_ref()) - .map_err(Error::OutboundLaneStorage) + .map_err(VerificationError::OutboundLaneStorage) } fn read_and_decode_message_payload( &mut self, message_key: &MessageKey, - ) -> Result { + ) -> Result { let storage_message_key = bp_messages::storage_keys::message_key( B::BRIDGED_MESSAGES_PALLET_NAME, &message_key.lane_id, @@ -449,7 +413,7 @@ pub mod target { ); self.storage .read_and_decode_mandatory_value(storage_message_key.0.as_ref()) - .map_err(Error::MessageStorage) + .map_err(VerificationError::MessageStorage) } } } @@ -470,8 +434,8 @@ mod tests { }, mock::*, }; - use bp_header_chain::StoredHeaderDataBuilder; - use bp_runtime::HeaderId; + use bp_header_chain::{HeaderChainError, StoredHeaderDataBuilder}; + use bp_runtime::{HeaderId, StorageProofError}; use codec::Encode; use sp_core::H256; use sp_runtime::traits::Header as _; @@ -559,7 +523,7 @@ mod tests { using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { target::verify_messages_proof::(proof, 5) }), - Err(Error::MessagesCountMismatch), + Err(VerificationError::MessagesCountMismatch), ); } @@ -569,7 +533,7 @@ mod tests { using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { target::verify_messages_proof::(proof, 15) }), - Err(Error::MessagesCountMismatch), + Err(VerificationError::MessagesCountMismatch), ); } @@ -582,7 +546,7 @@ mod tests { pallet_bridge_grandpa::ImportedHeaders::::remove(bridged_header_hash); target::verify_messages_proof::(proof, 10) }), - Err(Error::HeaderChain(HeaderChainError::UnknownHeader)), + Err(VerificationError::HeaderChain(HeaderChainError::UnknownHeader)), ); } @@ -605,7 +569,7 @@ mod tests { ); target::verify_messages_proof::(proof, 10) }), - Err(Error::HeaderChain(HeaderChainError::StorageProof( + Err(VerificationError::HeaderChain(HeaderChainError::StorageProof( StorageProofError::StorageRootMismatch ))), ); @@ -620,7 +584,7 @@ mod tests { proof.storage_proof.push(node); target::verify_messages_proof::(proof, 10) },), - Err(Error::HeaderChain(HeaderChainError::StorageProof( + Err(VerificationError::HeaderChain(HeaderChainError::StorageProof( StorageProofError::DuplicateNodesInProof ))), ); @@ -633,7 +597,7 @@ mod tests { proof.storage_proof.push(vec![42]); target::verify_messages_proof::(proof, 10) },), - Err(Error::StorageProof(StorageProofError::UnusedNodesInTheProof)), + Err(VerificationError::StorageProof(StorageProofError::UnusedNodesInTheProof)), ); } @@ -647,7 +611,7 @@ mod tests { encode_lane_data, |proof| target::verify_messages_proof::(proof, 10) ), - Err(Error::MessageStorage(StorageProofError::StorageValueEmpty)), + Err(VerificationError::MessageStorage(StorageProofError::StorageValueEmpty)), ); } @@ -667,7 +631,7 @@ mod tests { encode_lane_data, |proof| target::verify_messages_proof::(proof, 10), ), - Err(Error::MessageStorage(StorageProofError::StorageValueDecodeFailed(_))), + Err(VerificationError::MessageStorage(StorageProofError::StorageValueDecodeFailed(_))), ); } @@ -689,7 +653,9 @@ mod tests { }, |proof| target::verify_messages_proof::(proof, 10), ), - Err(Error::OutboundLaneStorage(StorageProofError::StorageValueDecodeFailed(_))), + Err(VerificationError::OutboundLaneStorage( + StorageProofError::StorageValueDecodeFailed(_) + )), ); } @@ -699,7 +665,7 @@ mod tests { using_messages_proof(0, None, encode_all_messages, encode_lane_data, |proof| { target::verify_messages_proof::(proof, 0) },), - Err(Error::EmptyMessageProof), + Err(VerificationError::EmptyMessageProof), ); } @@ -773,7 +739,7 @@ mod tests { proof.nonces_end = u64::MAX; target::verify_messages_proof::(proof, u32::MAX) },), - Err(Error::MessagesCountMismatch), + Err(VerificationError::MessagesCountMismatch), ); } } diff --git a/bridges/bin/runtime-common/src/messages_call_ext.rs b/bridges/bin/runtime-common/src/messages_call_ext.rs index 3f48ce583f9..8b4a50a0f30 100644 --- a/bridges/bin/runtime-common/src/messages_call_ext.rs +++ b/bridges/bin/runtime-common/src/messages_call_ext.rs @@ -47,7 +47,7 @@ pub struct BaseMessagesProofInfo { impl BaseMessagesProofInfo { /// Returns true if `bundled_range` continues the `0..=best_stored_nonce` range. fn appends_to_stored_nonce(&self) -> bool { - *self.bundled_range.start() == self.best_stored_nonce + 1 + Some(*self.bundled_range.start()) == self.best_stored_nonce.checked_add(1) } } diff --git a/bridges/bin/runtime-common/src/refund_relayer_extension.rs b/bridges/bin/runtime-common/src/refund_relayer_extension.rs index 00ea70aa04e..c5419837316 100644 --- a/bridges/bin/runtime-common/src/refund_relayer_extension.rs +++ b/bridges/bin/runtime-common/src/refund_relayer_extension.rs @@ -24,7 +24,7 @@ use crate::messages_call_ext::{ }; use bp_messages::{LaneId, MessageNonce}; use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; -use bp_runtime::{RangeInclusiveExt, StaticStrProvider}; +use bp_runtime::{Parachain, ParachainIdOf, RangeInclusiveExt, StaticStrProvider}; use codec::{Decode, Encode}; use frame_support::{ dispatch::{CallableCallFor, DispatchInfo, Dispatchable, PostDispatchInfo}, @@ -71,9 +71,9 @@ pub trait RefundableParachainId { } /// Default implementation of `RefundableParachainId`. -pub struct RefundableParachain(PhantomData<(Instance, Id)>); +pub struct DefaultRefundableParachainId(PhantomData<(Instance, Id)>); -impl RefundableParachainId for RefundableParachain +impl RefundableParachainId for DefaultRefundableParachainId where Id: Get, { @@ -81,6 +81,17 @@ where type Id = Id; } +/// Implementation of `RefundableParachainId` for `trait Parachain`. +pub struct RefundableParachain(PhantomData<(Instance, Para)>); + +impl RefundableParachainId for RefundableParachain +where + Para: Parachain, +{ + type Instance = Instance; + type Id = ParachainIdOf; +} + /// Trait identifying a bridged messages lane. A relayer might be refunded for delivering messages /// coming from this lane. pub trait RefundableMessagesLaneId { @@ -682,7 +693,7 @@ mod tests { bp_runtime::generate_static_str_provider!(TestExtension); type TestExtension = RefundBridgedParachainMessages< TestRuntime, - RefundableParachain<(), TestParachain>, + DefaultRefundableParachainId<(), TestParachain>, RefundableMessagesLane<(), TestLaneId>, ActualFeeRefund, ConstU64<1>, diff --git a/bridges/modules/grandpa/src/lib.rs b/bridges/modules/grandpa/src/lib.rs index 329e4c21136..50286512db8 100644 --- a/bridges/modules/grandpa/src/lib.rs +++ b/bridges/modules/grandpa/src/lib.rs @@ -1212,11 +1212,8 @@ mod tests { fn parse_finalized_storage_proof_rejects_proof_on_unknown_header() { run_test(|| { assert_noop!( - Pallet::::parse_finalized_storage_proof( - Default::default(), - vec![], - |_| (), - ), + Pallet::::storage_proof_checker(Default::default(), vec![],) + .map(|_| ()), bp_header_chain::HeaderChainError::UnknownHeader, ); }); @@ -1235,8 +1232,7 @@ mod tests { >::insert(hash, header.build()); assert_ok!( - Pallet::::parse_finalized_storage_proof(hash, storage_proof, |_| (),), - (), + Pallet::::storage_proof_checker(hash, storage_proof).map(|_| ()) ); }); } diff --git a/bridges/modules/messages/src/benchmarking.rs b/bridges/modules/messages/src/benchmarking.rs index 7db3ae64352..5a4d2de7000 100644 --- a/bridges/modules/messages/src/benchmarking.rs +++ b/bridges/modules/messages/src/benchmarking.rs @@ -17,8 +17,8 @@ //! Messages pallet benchmarking. use crate::{ - inbound_lane::InboundLaneStorage, inbound_lane_storage, outbound_lane, - weights_ext::EXPECTED_DEFAULT_MESSAGE_LENGTH, Call, OutboundLanes, + inbound_lane::InboundLaneStorage, outbound_lane, weights_ext::EXPECTED_DEFAULT_MESSAGE_LENGTH, + Call, OutboundLanes, RuntimeInboundLaneStorage, }; use bp_messages::{ @@ -443,11 +443,12 @@ benchmarks_instance_pallet! { fn send_regular_message, I: 'static>() { let mut outbound_lane = outbound_lane::(T::bench_lane_id()); - outbound_lane.send_message(vec![]); + outbound_lane.send_message(vec![]).expect("We craft valid messages"); } fn receive_messages, I: 'static>(nonce: MessageNonce) { - let mut inbound_lane_storage = inbound_lane_storage::(T::bench_lane_id()); + let mut inbound_lane_storage = + RuntimeInboundLaneStorage::::from_lane_id(T::bench_lane_id()); inbound_lane_storage.set_data(InboundLaneData { relayers: vec![UnrewardedRelayer { relayer: T::bridged_relayer_id(), diff --git a/bridges/modules/messages/src/inbound_lane.rs b/bridges/modules/messages/src/inbound_lane.rs index 5ec4444dbdf..b665b5516fc 100644 --- a/bridges/modules/messages/src/inbound_lane.rs +++ b/bridges/modules/messages/src/inbound_lane.rs @@ -40,7 +40,7 @@ pub trait InboundLaneStorage { /// Return maximal number of unconfirmed messages in inbound lane. fn max_unconfirmed_messages(&self) -> MessageNonce; /// Get lane data from the storage. - fn data(&self) -> InboundLaneData; + fn get_or_init_data(&mut self) -> InboundLaneData; /// Update lane data in the storage. fn set_data(&mut self, data: InboundLaneData); } @@ -117,9 +117,9 @@ impl InboundLane { InboundLane { storage } } - /// Returns storage reference. - pub fn storage(&self) -> &S { - &self.storage + /// Returns `mut` storage reference. + pub fn storage_mut(&mut self) -> &mut S { + &mut self.storage } /// Receive state of the corresponding outbound lane. @@ -127,7 +127,7 @@ impl InboundLane { &mut self, outbound_lane_data: OutboundLaneData, ) -> Option { - let mut data = self.storage.data(); + let mut data = self.storage.get_or_init_data(); let last_delivered_nonce = data.last_delivered_nonce(); if outbound_lane_data.latest_received_nonce > last_delivered_nonce { @@ -170,9 +170,8 @@ impl InboundLane { nonce: MessageNonce, message_data: DispatchMessageData, ) -> ReceivalResult { - let mut data = self.storage.data(); - let is_correct_message = nonce == data.last_delivered_nonce() + 1; - if !is_correct_message { + let mut data = self.storage.get_or_init_data(); + if Some(nonce) != data.last_delivered_nonce().checked_add(1) { return ReceivalResult::InvalidNonce } @@ -252,7 +251,7 @@ mod tests { None, ); - assert_eq!(lane.storage.data().last_confirmed_nonce, 0); + assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 0); }); } @@ -270,7 +269,7 @@ mod tests { }), Some(3), ); - assert_eq!(lane.storage.data().last_confirmed_nonce, 3); + assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 3); assert_eq!( lane.receive_state_update(OutboundLaneData { @@ -279,7 +278,7 @@ mod tests { }), None, ); - assert_eq!(lane.storage.data().last_confirmed_nonce, 3); + assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 3); }); } @@ -290,9 +289,9 @@ mod tests { receive_regular_message(&mut lane, 1); receive_regular_message(&mut lane, 2); receive_regular_message(&mut lane, 3); - assert_eq!(lane.storage.data().last_confirmed_nonce, 0); + assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 0); assert_eq!( - lane.storage.data().relayers, + lane.storage.get_or_init_data().relayers, vec![unrewarded_relayer(1, 3, TEST_RELAYER_A)] ); @@ -303,9 +302,9 @@ mod tests { }), Some(2), ); - assert_eq!(lane.storage.data().last_confirmed_nonce, 2); + assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 2); assert_eq!( - lane.storage.data().relayers, + lane.storage.get_or_init_data().relayers, vec![unrewarded_relayer(3, 3, TEST_RELAYER_A)] ); @@ -316,8 +315,8 @@ mod tests { }), Some(3), ); - assert_eq!(lane.storage.data().last_confirmed_nonce, 3); - assert_eq!(lane.storage.data().relayers, vec![]); + assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 3); + assert_eq!(lane.storage.get_or_init_data().relayers, vec![]); }); } @@ -325,7 +324,7 @@ mod tests { fn receive_status_update_works_with_batches_from_relayers() { run_test(|| { let mut lane = inbound_lane::(TEST_LANE_ID); - let mut seed_storage_data = lane.storage.data(); + let mut seed_storage_data = lane.storage.get_or_init_data(); // Prepare data seed_storage_data.last_confirmed_nonce = 0; seed_storage_data.relayers.push_back(unrewarded_relayer(1, 1, TEST_RELAYER_A)); @@ -341,9 +340,9 @@ mod tests { }), Some(3), ); - assert_eq!(lane.storage.data().last_confirmed_nonce, 3); + assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 3); assert_eq!( - lane.storage.data().relayers, + lane.storage.get_or_init_data().relayers, vec![ unrewarded_relayer(4, 4, TEST_RELAYER_B), unrewarded_relayer(5, 5, TEST_RELAYER_C) @@ -364,7 +363,7 @@ mod tests { ), ReceivalResult::InvalidNonce ); - assert_eq!(lane.storage.data().last_delivered_nonce(), 0); + assert_eq!(lane.storage.get_or_init_data().last_delivered_nonce(), 0); }); } @@ -470,7 +469,7 @@ mod tests { ReceivalResult::Dispatched(dispatch_result(0)) ); assert_eq!( - lane.storage.data().relayers, + lane.storage.get_or_init_data().relayers, vec![ unrewarded_relayer(1, 1, TEST_RELAYER_A), unrewarded_relayer(2, 2, TEST_RELAYER_B), @@ -508,7 +507,7 @@ mod tests { run_test(|| { let mut lane = inbound_lane::(TEST_LANE_ID); receive_regular_message(&mut lane, 1); - assert_eq!(lane.storage.data().last_delivered_nonce(), 1); + assert_eq!(lane.storage.get_or_init_data().last_delivered_nonce(), 1); }); } diff --git a/bridges/modules/messages/src/lib.rs b/bridges/modules/messages/src/lib.rs index 045015b7751..f04e86f3a8e 100644 --- a/bridges/modules/messages/src/lib.rs +++ b/bridges/modules/messages/src/lib.rs @@ -48,7 +48,7 @@ pub use weights_ext::{ use crate::{ inbound_lane::{InboundLane, InboundLaneStorage}, - outbound_lane::{OutboundLane, OutboundLaneStorage, ReceivalConfirmationResult}, + outbound_lane::{OutboundLane, OutboundLaneStorage, ReceivalConfirmationError}, }; use bp_messages::{ @@ -59,15 +59,15 @@ use bp_messages::{ DeliveryPayments, DispatchMessage, MessageDispatch, ProvedLaneMessages, ProvedMessages, SourceHeaderChain, }, - total_unrewarded_messages, DeliveredMessages, InboundLaneData, InboundMessageDetails, LaneId, - MessageKey, MessageNonce, MessagePayload, MessagesOperatingMode, OutboundLaneData, - OutboundMessageDetails, UnrewardedRelayersState, + DeliveredMessages, InboundLaneData, InboundMessageDetails, LaneId, MessageKey, MessageNonce, + MessagePayload, MessagesOperatingMode, OutboundLaneData, OutboundMessageDetails, + UnrewardedRelayersState, VerificationError, }; use bp_runtime::{BasicOperatingMode, ChainId, OwnedBridgeModule, PreComputedSize, Size}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{dispatch::PostDispatchInfo, ensure, fail, traits::Get}; use sp_runtime::traits::UniqueSaturatedFrom; -use sp_std::{cell::RefCell, marker::PhantomData, prelude::*}; +use sp_std::{marker::PhantomData, prelude::*}; mod inbound_lane; mod outbound_lane; @@ -319,7 +319,7 @@ pub mod pallet { // subtract extra storage proof bytes from the actual PoV size - there may be // less unrewarded relayers than the maximal configured value - let lane_extra_proof_size_bytes = lane.storage().extra_proof_size_bytes(); + let lane_extra_proof_size_bytes = lane.storage_mut().extra_proof_size_bytes(); actual_weight = actual_weight.set_proof_size( actual_weight.proof_size().saturating_sub(lane_extra_proof_size_bytes), ); @@ -332,7 +332,7 @@ pub mod pallet { "Received lane {:?} state update: latest_confirmed_nonce={}. Unrewarded relayers: {:?}", lane_id, updated_latest_confirmed_nonce, - UnrewardedRelayersState::from(&lane.storage().data()), + UnrewardedRelayersState::from(&lane.storage_mut().get_or_init_data()), ); } } @@ -437,57 +437,21 @@ pub mod pallet { Error::::InvalidMessagesDeliveryProof })?; - - // verify that the relayer has declared correct `lane_data::relayers` state - // (we only care about total number of entries and messages, because this affects call - // weight) ensure!( - total_unrewarded_messages(&lane_data.relayers).unwrap_or(MessageNonce::MAX) == - relayers_state.total_messages && - lane_data.relayers.len() as MessageNonce == - relayers_state.unrewarded_relayer_entries, - Error::::InvalidUnrewardedRelayersState - ); - // the `last_delivered_nonce` field may also be used by the signed extension. Even - // though providing wrong value isn't critical, let's also check it here. - ensure!( - lane_data.last_delivered_nonce() == relayers_state.last_delivered_nonce, + relayers_state.is_valid(&lane_data), Error::::InvalidUnrewardedRelayersState ); // mark messages as delivered let mut lane = outbound_lane::(lane_id); let last_delivered_nonce = lane_data.last_delivered_nonce(); - let confirmed_messages = match lane.confirm_delivery( - relayers_state.total_messages, - last_delivered_nonce, - &lane_data.relayers, - ) { - ReceivalConfirmationResult::ConfirmedMessages(confirmed_messages) => - Some(confirmed_messages), - ReceivalConfirmationResult::NoNewConfirmations => None, - ReceivalConfirmationResult::TryingToConfirmMoreMessagesThanExpected( - to_confirm_messages_count, - ) => { - log::trace!( - target: LOG_TARGET, - "Messages delivery proof contains too many messages to confirm: {} vs declared {}", - to_confirm_messages_count, - relayers_state.total_messages, - ); - - fail!(Error::::TryingToConfirmMoreMessagesThanExpected); - }, - error => { - log::trace!( - target: LOG_TARGET, - "Messages delivery proof contains invalid unrewarded relayers vec: {:?}", - error, - ); - - fail!(Error::::InvalidUnrewardedRelayers); - }, - }; + let confirmed_messages = lane + .confirm_delivery( + relayers_state.total_messages, + last_delivered_nonce, + &lane_data.relayers, + ) + .map_err(Error::::ReceivalConfirmation)?; if let Some(confirmed_messages) = confirmed_messages { // emit 'delivered' event @@ -554,12 +518,12 @@ pub mod pallet { NotOperatingNormally, /// The outbound lane is inactive. InactiveOutboundLane, - /// The message is too large to be sent over the bridge. - MessageIsTooLarge, /// Message has been treated as invalid by chain verifier. - MessageRejectedByChainVerifier, + MessageRejectedByChainVerifier(VerificationError), /// Message has been treated as invalid by lane verifier. - MessageRejectedByLaneVerifier, + MessageRejectedByLaneVerifier(VerificationError), + /// Message has been treated as invalid by the pallet logic. + MessageRejectedByPallet(VerificationError), /// Submitter has failed to pay fee for delivering and dispatching messages. FailedToWithdrawMessageFee, /// The transaction brings too many messages. @@ -568,8 +532,6 @@ pub mod pallet { InvalidMessagesProof, /// Invalid messages delivery proof has been submitted. InvalidMessagesDeliveryProof, - /// The bridged chain has invalid `UnrewardedRelayers` in its storage (fatal for the lane). - InvalidUnrewardedRelayers, /// The relayer has declared invalid unrewarded relayers state in the /// `receive_messages_delivery_proof` call. InvalidUnrewardedRelayersState, @@ -578,9 +540,8 @@ pub mod pallet { InsufficientDispatchWeight, /// The message someone is trying to work with (i.e. increase fee) is not yet sent. MessageIsNotYetSent, - /// The number of actually confirmed messages is going to be larger than the number of - /// messages in the proof. This may mean that this or bridged chain storage is corrupted. - TryingToConfirmMoreMessagesThanExpected, + /// Error confirming messages receival. + ReceivalConfirmation(ReceivalConfirmationError), /// Error generated by the `OwnedBridgeModule` trait. BridgeModule(bp_runtime::OwnedBridgeModuleError), } @@ -732,7 +693,7 @@ fn send_message, I: 'static>( err, ); - Error::::MessageRejectedByChainVerifier + Error::::MessageRejectedByChainVerifier(err) })?; // now let's enforce any additional lane rules @@ -746,18 +707,16 @@ fn send_message, I: 'static>( err, ); - Error::::MessageRejectedByLaneVerifier + Error::::MessageRejectedByLaneVerifier(err) }, )?; // finally, save message in outbound storage and emit event let encoded_payload = payload.encode(); let encoded_payload_len = encoded_payload.len(); - ensure!( - encoded_payload_len <= T::MaximalOutboundPayloadSize::get() as usize, - Error::::MessageIsTooLarge - ); - let nonce = lane.send_message(encoded_payload); + let nonce = lane + .send_message(encoded_payload) + .map_err(Error::::MessageRejectedByPallet)?; log::trace!( target: LOG_TARGET, @@ -787,18 +746,7 @@ fn ensure_normal_operating_mode, I: 'static>() -> Result<(), Error< fn inbound_lane, I: 'static>( lane_id: LaneId, ) -> InboundLane> { - InboundLane::new(inbound_lane_storage::(lane_id)) -} - -/// Creates new runtime inbound lane storage. -fn inbound_lane_storage, I: 'static>( - lane_id: LaneId, -) -> RuntimeInboundLaneStorage { - RuntimeInboundLaneStorage { - lane_id, - cached_data: RefCell::new(None), - _phantom: Default::default(), - } + InboundLane::new(RuntimeInboundLaneStorage::from_lane_id(lane_id)) } /// Creates new outbound lane object, backed by runtime storage. @@ -811,10 +759,17 @@ fn outbound_lane, I: 'static>( /// Runtime inbound lane storage. struct RuntimeInboundLaneStorage, I: 'static = ()> { lane_id: LaneId, - cached_data: RefCell>>, + cached_data: Option>, _phantom: PhantomData, } +impl, I: 'static> RuntimeInboundLaneStorage { + /// Creates new runtime inbound lane storage. + fn from_lane_id(lane_id: LaneId) -> RuntimeInboundLaneStorage { + RuntimeInboundLaneStorage { lane_id, cached_data: None, _phantom: Default::default() } + } +} + impl, I: 'static> RuntimeInboundLaneStorage { /// Returns number of bytes that may be subtracted from the PoV component of /// `receive_messages_proof` call, because the actual inbound lane state is smaller than the @@ -824,9 +779,9 @@ impl, I: 'static> RuntimeInboundLaneStorage { /// `MaxUnrewardedRelayerEntriesAtInboundLane` constant from the pallet configuration. The PoV /// of the call includes the maximal size of inbound lane state. If the actual size is smaller, /// we may subtract extra bytes from this component. - pub fn extra_proof_size_bytes(&self) -> u64 { + pub fn extra_proof_size_bytes(&mut self) -> u64 { let max_encoded_len = StoredInboundLaneData::::max_encoded_len(); - let relayers_count = self.data().relayers.len(); + let relayers_count = self.get_or_init_data().relayers.len(); let actual_encoded_len = InboundLaneData::::encoded_size_hint(relayers_count) .unwrap_or(usize::MAX); @@ -849,26 +804,20 @@ impl, I: 'static> InboundLaneStorage for RuntimeInboundLaneStorage< T::MaxUnconfirmedMessagesAtInboundLane::get() } - fn data(&self) -> InboundLaneData { - match self.cached_data.clone().into_inner() { - Some(data) => data, + fn get_or_init_data(&mut self) -> InboundLaneData { + match self.cached_data { + Some(ref data) => data.clone(), None => { let data: InboundLaneData = InboundLanes::::get(self.lane_id).into(); - *self.cached_data.try_borrow_mut().expect( - "we're in the single-threaded environment;\ - we have no recursive borrows; qed", - ) = Some(data.clone()); + self.cached_data = Some(data.clone()); data }, } } fn set_data(&mut self, data: InboundLaneData) { - *self.cached_data.try_borrow_mut().expect( - "we're in the single-threaded environment;\ - we have no recursive borrows; qed", - ) = Some(data.clone()); + self.cached_data = Some(data.clone()); InboundLanes::::insert(self.lane_id, StoredInboundLaneData::(data)) } } @@ -898,15 +847,17 @@ impl, I: 'static> OutboundLaneStorage for RuntimeOutboundLaneStorag .map(Into::into) } - fn save_message(&mut self, nonce: MessageNonce, message_payload: MessagePayload) { + fn save_message( + &mut self, + nonce: MessageNonce, + message_payload: MessagePayload, + ) -> Result<(), VerificationError> { OutboundMessages::::insert( MessageKey { lane_id: self.lane_id, nonce }, - StoredMessagePayload::::try_from(message_payload).expect( - "save_message is called after all checks in send_message; \ - send_message checks message size; \ - qed", - ), + StoredMessagePayload::::try_from(message_payload) + .map_err(|_| VerificationError::MessageTooLarge)?, ); + Ok(()) } fn remove_message(&mut self, nonce: &MessageNonce) { @@ -918,7 +869,7 @@ impl, I: 'static> OutboundLaneStorage for RuntimeOutboundLaneStorag fn verify_and_decode_messages_proof( proof: Chain::MessagesProof, messages_count: u32, -) -> Result>, Chain::Error> { +) -> Result>, VerificationError> { // `receive_messages_proof` weight formula and `MaxUnconfirmedMessagesAtInboundLane` check // guarantees that the `message_count` is sane and Vec may be allocated. // (tx with too many messages will either be rejected from the pool, or will fail earlier) @@ -941,13 +892,16 @@ fn verify_and_decode_messages_proof::MessageIsTooLarge, + Error::::MessageRejectedByPallet( + VerificationError::MessageTooLarge + ), ); // let's check that we're able to send `MAX_OUTBOUND_PAYLOAD_SIZE` messages @@ -1177,7 +1133,9 @@ mod tests { TEST_LANE_ID, PAYLOAD_REJECTED_BY_TARGET_CHAIN, ), - Error::::MessageRejectedByChainVerifier, + Error::::MessageRejectedByChainVerifier(VerificationError::Other( + mock::TEST_ERROR + )), ); }); } @@ -1190,7 +1148,9 @@ mod tests { message.reject_by_lane_verifier = true; assert_noop!( send_message::(RuntimeOrigin::signed(1), TEST_LANE_ID, message,), - Error::::MessageRejectedByLaneVerifier, + Error::::MessageRejectedByLaneVerifier(VerificationError::Other( + mock::TEST_ERROR + )), ); }); } @@ -1368,9 +1328,9 @@ mod tests { single_message_delivery_proof, UnrewardedRelayersState { unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, total_messages: 1, last_delivered_nonce: 1, - ..Default::default() }, ); assert_ok!(result); @@ -1408,9 +1368,9 @@ mod tests { two_messages_delivery_proof, UnrewardedRelayersState { unrewarded_relayer_entries: 2, + messages_in_oldest_entry: 1, total_messages: 2, last_delivered_nonce: 2, - ..Default::default() }, ); assert_ok!(result); @@ -1773,9 +1733,9 @@ mod tests { TestMessagesDeliveryProof(messages_1_and_2_proof), UnrewardedRelayersState { unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 2, total_messages: 2, last_delivered_nonce: 2, - ..Default::default() }, )); // second tx with message 3 @@ -1784,9 +1744,9 @@ mod tests { TestMessagesDeliveryProof(messages_3_proof), UnrewardedRelayersState { unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, total_messages: 1, last_delivered_nonce: 3, - ..Default::default() }, )); }); @@ -1814,7 +1774,9 @@ mod tests { ))), UnrewardedRelayersState { last_delivered_nonce: 1, ..Default::default() }, ), - Error::::TryingToConfirmMoreMessagesThanExpected, + Error::::ReceivalConfirmation( + ReceivalConfirmationError::TryingToConfirmMoreMessagesThanExpected + ), ); }); } @@ -2114,10 +2076,10 @@ mod tests { fn storage(relayer_entries: usize) -> RuntimeInboundLaneStorage { RuntimeInboundLaneStorage { lane_id: Default::default(), - cached_data: RefCell::new(Some(InboundLaneData { + cached_data: Some(InboundLaneData { relayers: vec![relayer_entry(); relayer_entries].into_iter().collect(), last_confirmed_nonce: 0, - })), + }), _phantom: Default::default(), } } diff --git a/bridges/modules/messages/src/mock.rs b/bridges/modules/messages/src/mock.rs index 7aab79ae4a9..fa3ce31f952 100644 --- a/bridges/modules/messages/src/mock.rs +++ b/bridges/modules/messages/src/mock.rs @@ -27,7 +27,7 @@ use bp_messages::{ ProvedLaneMessages, ProvedMessages, SourceHeaderChain, }, DeliveredMessages, InboundLaneData, LaneId, Message, MessageKey, MessageNonce, MessagePayload, - OutboundLaneData, UnrewardedRelayer, UnrewardedRelayersState, + OutboundLaneData, UnrewardedRelayer, UnrewardedRelayersState, VerificationError, }; use bp_runtime::{messages::MessageDispatchResult, Size}; use codec::{Decode, Encode}; @@ -295,13 +295,11 @@ impl Size for TestMessagesDeliveryProof { pub struct TestTargetHeaderChain; impl TargetHeaderChain for TestTargetHeaderChain { - type Error = &'static str; - type MessagesDeliveryProof = TestMessagesDeliveryProof; - fn verify_message(payload: &TestPayload) -> Result<(), Self::Error> { + fn verify_message(payload: &TestPayload) -> Result<(), VerificationError> { if *payload == PAYLOAD_REJECTED_BY_TARGET_CHAIN { - Err(TEST_ERROR) + Err(VerificationError::Other(TEST_ERROR)) } else { Ok(()) } @@ -309,8 +307,8 @@ impl TargetHeaderChain for TestTargetHeaderChain { fn verify_messages_delivery_proof( proof: Self::MessagesDeliveryProof, - ) -> Result<(LaneId, InboundLaneData), Self::Error> { - proof.0.map_err(|_| TEST_ERROR) + ) -> Result<(LaneId, InboundLaneData), VerificationError> { + proof.0.map_err(|_| VerificationError::Other(TEST_ERROR)) } } @@ -319,18 +317,16 @@ impl TargetHeaderChain for TestTargetHeaderChain { pub struct TestLaneMessageVerifier; impl LaneMessageVerifier for TestLaneMessageVerifier { - type Error = &'static str; - fn verify_message( _submitter: &RuntimeOrigin, _lane: &LaneId, _lane_outbound_data: &OutboundLaneData, payload: &TestPayload, - ) -> Result<(), Self::Error> { + ) -> Result<(), VerificationError> { if !payload.reject_by_lane_verifier { Ok(()) } else { - Err(TEST_ERROR) + Err(VerificationError::Other(TEST_ERROR)) } } } @@ -400,15 +396,16 @@ impl DeliveryConfirmationPayments for TestDeliveryConfirmationPayment pub struct TestSourceHeaderChain; impl SourceHeaderChain for TestSourceHeaderChain { - type Error = &'static str; - type MessagesProof = TestMessagesProof; fn verify_messages_proof( proof: Self::MessagesProof, _messages_count: u32, - ) -> Result, Self::Error> { - proof.result.map(|proof| proof.into_iter().collect()).map_err(|_| TEST_ERROR) + ) -> Result, VerificationError> { + proof + .result + .map(|proof| proof.into_iter().collect()) + .map_err(|_| VerificationError::Other(TEST_ERROR)) } } diff --git a/bridges/modules/messages/src/outbound_lane.rs b/bridges/modules/messages/src/outbound_lane.rs index 3d0d4de966a..0cf0c4ccb42 100644 --- a/bridges/modules/messages/src/outbound_lane.rs +++ b/bridges/modules/messages/src/outbound_lane.rs @@ -16,16 +16,19 @@ //! Everything about outgoing messages sending. -use crate::Config; +use crate::{Config, LOG_TARGET}; use bp_messages::{ DeliveredMessages, LaneId, MessageNonce, MessagePayload, OutboundLaneData, UnrewardedRelayer, + VerificationError, }; +use codec::{Decode, Encode}; use frame_support::{ weights::{RuntimeDbWeight, Weight}, - BoundedVec, RuntimeDebug, + BoundedVec, PalletError, RuntimeDebug, }; use num_traits::Zero; +use scale_info::TypeInfo; use sp_std::collections::vec_deque::VecDeque; /// Outbound lane storage. @@ -40,7 +43,11 @@ pub trait OutboundLaneStorage { #[cfg(test)] fn message(&self, nonce: &MessageNonce) -> Option; /// Save outbound message in the storage. - fn save_message(&mut self, nonce: MessageNonce, message_payload: MessagePayload); + fn save_message( + &mut self, + nonce: MessageNonce, + message_payload: MessagePayload, + ) -> Result<(), VerificationError>; /// Remove outbound message from the storage. fn remove_message(&mut self, nonce: &MessageNonce); } @@ -49,13 +56,8 @@ pub trait OutboundLaneStorage { pub type StoredMessagePayload = BoundedVec>::MaximalOutboundPayloadSize>; /// Result of messages receival confirmation. -#[derive(RuntimeDebug, PartialEq, Eq)] -pub enum ReceivalConfirmationResult { - /// New messages have been confirmed by the confirmation transaction. - ConfirmedMessages(DeliveredMessages), - /// Confirmation transaction brings no new confirmation. This may be a result of relayer - /// error or several relayers running. - NoNewConfirmations, +#[derive(Encode, Decode, RuntimeDebug, PartialEq, Eq, PalletError, TypeInfo)] +pub enum ReceivalConfirmationError { /// Bridged chain is trying to confirm more messages than we have generated. May be a result /// of invalid bridged chain storage. FailedToConfirmFutureMessages, @@ -66,7 +68,7 @@ pub enum ReceivalConfirmationResult { /// bridged chain storage. NonConsecutiveUnrewardedRelayerEntries, /// The chain has more messages that need to be confirmed than there is in the proof. - TryingToConfirmMoreMessagesThanExpected(MessageNonce), + TryingToConfirmMoreMessagesThanExpected, } /// Outbound messages lane. @@ -88,15 +90,18 @@ impl OutboundLane { /// Send message over lane. /// /// Returns new message nonce. - pub fn send_message(&mut self, message_payload: MessagePayload) -> MessageNonce { + pub fn send_message( + &mut self, + message_payload: MessagePayload, + ) -> Result { let mut data = self.storage.data(); let nonce = data.latest_generated_nonce + 1; data.latest_generated_nonce = nonce; - self.storage.save_message(nonce, message_payload); + self.storage.save_message(nonce, message_payload)?; self.storage.set_data(data); - nonce + Ok(nonce) } /// Confirm messages delivery. @@ -105,37 +110,39 @@ impl OutboundLane { max_allowed_messages: MessageNonce, latest_delivered_nonce: MessageNonce, relayers: &VecDeque>, - ) -> ReceivalConfirmationResult { + ) -> Result, ReceivalConfirmationError> { let mut data = self.storage.data(); - if latest_delivered_nonce <= data.latest_received_nonce { - return ReceivalConfirmationResult::NoNewConfirmations + let confirmed_messages = DeliveredMessages { + begin: data.latest_received_nonce.saturating_add(1), + end: latest_delivered_nonce, + }; + if confirmed_messages.total_messages() == 0 { + return Ok(None) } - if latest_delivered_nonce > data.latest_generated_nonce { - return ReceivalConfirmationResult::FailedToConfirmFutureMessages + if confirmed_messages.end > data.latest_generated_nonce { + return Err(ReceivalConfirmationError::FailedToConfirmFutureMessages) } - if latest_delivered_nonce - data.latest_received_nonce > max_allowed_messages { + if confirmed_messages.total_messages() > max_allowed_messages { // that the relayer has declared correct number of messages that the proof contains (it // is checked outside of the function). But it may happen (but only if this/bridged // chain storage is corrupted, though) that the actual number of confirmed messages if // larger than declared. This would mean that 'reward loop' will take more time than the // weight formula accounts, so we can't allow that. - return ReceivalConfirmationResult::TryingToConfirmMoreMessagesThanExpected( - latest_delivered_nonce - data.latest_received_nonce, - ) + log::trace!( + target: LOG_TARGET, + "Messages delivery proof contains too many messages to confirm: {} vs declared {}", + confirmed_messages.total_messages(), + max_allowed_messages, + ); + return Err(ReceivalConfirmationError::TryingToConfirmMoreMessagesThanExpected) } - if let Err(e) = ensure_unrewarded_relayers_are_correct(latest_delivered_nonce, relayers) { - return e - } + ensure_unrewarded_relayers_are_correct(confirmed_messages.end, relayers)?; - let prev_latest_received_nonce = data.latest_received_nonce; - data.latest_received_nonce = latest_delivered_nonce; + data.latest_received_nonce = confirmed_messages.end; self.storage.set_data(data); - ReceivalConfirmationResult::ConfirmedMessages(DeliveredMessages { - begin: prev_latest_received_nonce + 1, - end: latest_delivered_nonce, - }) + Ok(Some(confirmed_messages)) } /// Prune at most `max_messages_to_prune` already received messages. @@ -176,27 +183,24 @@ impl OutboundLane { fn ensure_unrewarded_relayers_are_correct( latest_received_nonce: MessageNonce, relayers: &VecDeque>, -) -> Result<(), ReceivalConfirmationResult> { - let mut last_entry_end: Option = None; +) -> Result<(), ReceivalConfirmationError> { + let mut expected_entry_begin = relayers.front().map(|entry| entry.messages.begin); for entry in relayers { // unrewarded relayer entry must have at least 1 unconfirmed message // (guaranteed by the `InboundLane::receive_message()`) if entry.messages.end < entry.messages.begin { - return Err(ReceivalConfirmationResult::EmptyUnrewardedRelayerEntry) + return Err(ReceivalConfirmationError::EmptyUnrewardedRelayerEntry) } // every entry must confirm range of messages that follows previous entry range // (guaranteed by the `InboundLane::receive_message()`) - if let Some(last_entry_end) = last_entry_end { - let expected_entry_begin = last_entry_end.checked_add(1); - if expected_entry_begin != Some(entry.messages.begin) { - return Err(ReceivalConfirmationResult::NonConsecutiveUnrewardedRelayerEntries) - } + if expected_entry_begin != Some(entry.messages.begin) { + return Err(ReceivalConfirmationError::NonConsecutiveUnrewardedRelayerEntries) } - last_entry_end = Some(entry.messages.end); + expected_entry_begin = entry.messages.end.checked_add(1); // entry can't confirm messages larger than `inbound_lane_data.latest_received_nonce()` // (guaranteed by the `InboundLane::receive_message()`) if entry.messages.end > latest_received_nonce { - return Err(ReceivalConfirmationResult::FailedToConfirmFutureMessages) + return Err(ReceivalConfirmationError::FailedToConfirmFutureMessages) } } @@ -213,7 +217,7 @@ mod tests { }, outbound_lane, }; - use frame_support::weights::constants::RocksDbWeight; + use frame_support::{assert_ok, weights::constants::RocksDbWeight}; use sp_std::ops::RangeInclusive; fn unrewarded_relayers( @@ -231,12 +235,12 @@ mod tests { fn assert_3_messages_confirmation_fails( latest_received_nonce: MessageNonce, relayers: &VecDeque>, - ) -> ReceivalConfirmationResult { + ) -> Result, ReceivalConfirmationError> { run_test(|| { let mut lane = outbound_lane::(TEST_LANE_ID); - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); assert_eq!(lane.storage.data().latest_generated_nonce, 3); assert_eq!(lane.storage.data().latest_received_nonce, 0); let result = lane.confirm_delivery(3, latest_received_nonce, relayers); @@ -251,7 +255,7 @@ mod tests { run_test(|| { let mut lane = outbound_lane::(TEST_LANE_ID); assert_eq!(lane.storage.data().latest_generated_nonce, 0); - assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 1); + assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), Ok(1)); assert!(lane.storage.message(&1).is_some()); assert_eq!(lane.storage.data().latest_generated_nonce, 1); }); @@ -261,14 +265,14 @@ mod tests { fn confirm_delivery_works() { run_test(|| { let mut lane = outbound_lane::(TEST_LANE_ID); - assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 1); - assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 2); - assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 3); + assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), Ok(1)); + assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), Ok(2)); + assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), Ok(3)); assert_eq!(lane.storage.data().latest_generated_nonce, 3); assert_eq!(lane.storage.data().latest_received_nonce, 0); assert_eq!( lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), - ReceivalConfirmationResult::ConfirmedMessages(delivered_messages(1..=3)), + Ok(Some(delivered_messages(1..=3))), ); assert_eq!(lane.storage.data().latest_generated_nonce, 3); assert_eq!(lane.storage.data().latest_received_nonce, 3); @@ -279,26 +283,20 @@ mod tests { fn confirm_delivery_rejects_nonce_lesser_than_latest_received() { run_test(|| { let mut lane = outbound_lane::(TEST_LANE_ID); - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); assert_eq!(lane.storage.data().latest_generated_nonce, 3); assert_eq!(lane.storage.data().latest_received_nonce, 0); assert_eq!( lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), - ReceivalConfirmationResult::ConfirmedMessages(delivered_messages(1..=3)), - ); - assert_eq!( - lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), - ReceivalConfirmationResult::NoNewConfirmations, + Ok(Some(delivered_messages(1..=3))), ); + assert_eq!(lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), Ok(None),); assert_eq!(lane.storage.data().latest_generated_nonce, 3); assert_eq!(lane.storage.data().latest_received_nonce, 3); - assert_eq!( - lane.confirm_delivery(1, 2, &unrewarded_relayers(1..=1)), - ReceivalConfirmationResult::NoNewConfirmations, - ); + assert_eq!(lane.confirm_delivery(1, 2, &unrewarded_relayers(1..=1)), Ok(None),); assert_eq!(lane.storage.data().latest_generated_nonce, 3); assert_eq!(lane.storage.data().latest_received_nonce, 3); }); @@ -308,7 +306,7 @@ mod tests { fn confirm_delivery_rejects_nonce_larger_than_last_generated() { assert_eq!( assert_3_messages_confirmation_fails(10, &unrewarded_relayers(1..=10),), - ReceivalConfirmationResult::FailedToConfirmFutureMessages, + Err(ReceivalConfirmationError::FailedToConfirmFutureMessages), ); } @@ -323,7 +321,7 @@ mod tests { .chain(unrewarded_relayers(3..=3).into_iter()) .collect(), ), - ReceivalConfirmationResult::FailedToConfirmFutureMessages, + Err(ReceivalConfirmationError::FailedToConfirmFutureMessages), ); } @@ -339,7 +337,7 @@ mod tests { .chain(unrewarded_relayers(2..=3).into_iter()) .collect(), ), - ReceivalConfirmationResult::EmptyUnrewardedRelayerEntry, + Err(ReceivalConfirmationError::EmptyUnrewardedRelayerEntry), ); } @@ -354,7 +352,7 @@ mod tests { .chain(unrewarded_relayers(2..=2).into_iter()) .collect(), ), - ReceivalConfirmationResult::NonConsecutiveUnrewardedRelayerEntries, + Err(ReceivalConfirmationError::NonConsecutiveUnrewardedRelayerEntries), ); } @@ -369,9 +367,9 @@ mod tests { ); assert_eq!(lane.storage.data().oldest_unpruned_nonce, 1); // when nothing is confirmed, nothing is pruned - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); assert!(lane.storage.message(&1).is_some()); assert!(lane.storage.message(&2).is_some()); assert!(lane.storage.message(&3).is_some()); @@ -383,7 +381,7 @@ mod tests { // after confirmation, some messages are received assert_eq!( lane.confirm_delivery(2, 2, &unrewarded_relayers(1..=2)), - ReceivalConfirmationResult::ConfirmedMessages(delivered_messages(1..=2)), + Ok(Some(delivered_messages(1..=2))), ); assert_eq!( lane.prune_messages(RocksDbWeight::get(), RocksDbWeight::get().writes(101)), @@ -396,7 +394,7 @@ mod tests { // after last message is confirmed, everything is pruned assert_eq!( lane.confirm_delivery(1, 3, &unrewarded_relayers(3..=3)), - ReceivalConfirmationResult::ConfirmedMessages(delivered_messages(3..=3)), + Ok(Some(delivered_messages(3..=3))), ); assert_eq!( lane.prune_messages(RocksDbWeight::get(), RocksDbWeight::get().writes(101)), @@ -413,20 +411,20 @@ mod tests { fn confirm_delivery_detects_when_more_than_expected_messages_are_confirmed() { run_test(|| { let mut lane = outbound_lane::(TEST_LANE_ID); - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); - lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); + assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD))); assert_eq!( lane.confirm_delivery(0, 3, &unrewarded_relayers(1..=3)), - ReceivalConfirmationResult::TryingToConfirmMoreMessagesThanExpected(3), + Err(ReceivalConfirmationError::TryingToConfirmMoreMessagesThanExpected), ); assert_eq!( lane.confirm_delivery(2, 3, &unrewarded_relayers(1..=3)), - ReceivalConfirmationResult::TryingToConfirmMoreMessagesThanExpected(3), + Err(ReceivalConfirmationError::TryingToConfirmMoreMessagesThanExpected), ); assert_eq!( lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), - ReceivalConfirmationResult::ConfirmedMessages(delivered_messages(1..=3)), + Ok(Some(delivered_messages(1..=3))), ); }); } diff --git a/bridges/modules/parachains/src/lib.rs b/bridges/modules/parachains/src/lib.rs index 6c89b09513c..5a393af7cc4 100644 --- a/bridges/modules/parachains/src/lib.rs +++ b/bridges/modules/parachains/src/lib.rs @@ -91,6 +91,8 @@ pub mod pallet { BoundedStorageValue<>::MaxParaHeadDataSize, ParaStoredHeaderData>; /// Weight info of the given parachains pallet. pub type WeightInfoOf = >::WeightInfo; + type GrandpaPalletOf = + pallet_bridge_grandpa::Pallet>::BridgesGrandpaPalletInstance>; #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] @@ -125,14 +127,8 @@ pub mod pallet { UnknownRelayChainBlock, /// The number of stored relay block is different from what the relayer has provided. InvalidRelayChainBlockNumber, - /// Error generated by a method defined in `bp-header-chain`. - HeaderChain(HeaderChainError), - /// Given parachain head is unknown. - UnknownParaHead, - /// The storage proof doesn't contains storage root. So it is invalid for given header. - StorageRootMismatch, - /// Failed to extract state root from given parachain head. - FailedToExtractStateRoot, + /// Parachain heads storage proof is invalid. + HeaderChainStorageProof(HeaderChainError), /// Error generated by the `OwnedBridgeModule` trait. BridgeModule(bp_runtime::OwnedBridgeModuleError), } @@ -337,112 +333,113 @@ pub mod pallet { parachains.len() as _, ); - pallet_bridge_grandpa::Pallet::::parse_finalized_storage_proof( + let mut storage = GrandpaPalletOf::::storage_proof_checker( relay_block_hash, parachain_heads_proof.0, - move |mut storage| { - for (parachain, parachain_head_hash) in parachains { - let parachain_head = match Pallet::::read_parachain_head(&mut storage, parachain) { - Ok(Some(parachain_head)) => parachain_head, - Ok(None) => { - log::trace!( - target: LOG_TARGET, - "The head of parachain {:?} is None. {}", - parachain, - if ParasInfo::::contains_key(parachain) { - "Looks like it is not yet registered at the source relay chain" - } else { - "Looks like it has been deregistered from the source relay chain" - }, - ); - Self::deposit_event(Event::MissingParachainHead { parachain }); - continue; - }, - Err(e) => { - log::trace!( - target: LOG_TARGET, - "The read of head of parachain {:?} has failed: {:?}", - parachain, - e, - ); - Self::deposit_event(Event::MissingParachainHead { parachain }); - continue; + ) + .map_err(Error::::HeaderChainStorageProof)?; + + for (parachain, parachain_head_hash) in parachains { + let parachain_head = match Self::read_parachain_head(&mut storage, parachain) { + Ok(Some(parachain_head)) => parachain_head, + Ok(None) => { + log::trace!( + target: LOG_TARGET, + "The head of parachain {:?} is None. {}", + parachain, + if ParasInfo::::contains_key(parachain) { + "Looks like it is not yet registered at the source relay chain" + } else { + "Looks like it has been deregistered from the source relay chain" }, - }; + ); + Self::deposit_event(Event::MissingParachainHead { parachain }); + continue + }, + Err(e) => { + log::trace!( + target: LOG_TARGET, + "The read of head of parachain {:?} has failed: {:?}", + parachain, + e, + ); + Self::deposit_event(Event::MissingParachainHead { parachain }); + continue + }, + }; - // if relayer has specified invalid parachain head hash, ignore the head - // (this isn't strictly necessary, but better safe than sorry) - let actual_parachain_head_hash = parachain_head.hash(); - if parachain_head_hash != actual_parachain_head_hash { + // if relayer has specified invalid parachain head hash, ignore the head + // (this isn't strictly necessary, but better safe than sorry) + let actual_parachain_head_hash = parachain_head.hash(); + if parachain_head_hash != actual_parachain_head_hash { + log::trace!( + target: LOG_TARGET, + "The submitter has specified invalid parachain {:?} head hash: \ + {:?} vs {:?}", + parachain, + parachain_head_hash, + actual_parachain_head_hash, + ); + Self::deposit_event(Event::IncorrectParachainHeadHash { + parachain, + parachain_head_hash, + actual_parachain_head_hash, + }); + continue + } + + // convert from parachain head into stored parachain head data + let parachain_head_data = + match T::ParaStoredHeaderDataBuilder::try_build(parachain, ¶chain_head) { + Some(parachain_head_data) => parachain_head_data, + None => { log::trace!( target: LOG_TARGET, - "The submitter has specified invalid parachain {:?} head hash: {:?} vs {:?}", + "The head of parachain {:?} has been provided, but it is not tracked by the pallet", parachain, - parachain_head_hash, - actual_parachain_head_hash, ); - Self::deposit_event(Event::IncorrectParachainHeadHash { - parachain, - parachain_head_hash, - actual_parachain_head_hash, - }); - continue; - } - - // convert from parachain head into stored parachain head data - let parachain_head_data = match T::ParaStoredHeaderDataBuilder::try_build( + Self::deposit_event(Event::UntrackedParachainRejected { parachain }); + continue + }, + }; + + let update_result: Result<_, ()> = + ParasInfo::::try_mutate(parachain, |stored_best_head| { + let artifacts = Pallet::::update_parachain_head( parachain, - ¶chain_head, - ) { - Some(parachain_head_data) => parachain_head_data, - None => { - log::trace!( - target: LOG_TARGET, - "The head of parachain {:?} has been provided, but it is not tracked by the pallet", - parachain, - ); - Self::deposit_event(Event::UntrackedParachainRejected { parachain }); - continue; - }, - }; - - let update_result: Result<_, ()> = ParasInfo::::try_mutate(parachain, |stored_best_head| { - let artifacts = Pallet::::update_parachain_head( - parachain, - stored_best_head.take(), - relay_block_number, - parachain_head_data, - parachain_head_hash, - )?; - *stored_best_head = Some(artifacts.best_head); - Ok(artifacts.prune_happened) - }); - - // we're refunding weight if update has not happened and if pruning has not happened - let is_update_happened = matches!(update_result, Ok(_)); - if !is_update_happened { - actual_weight = actual_weight - .saturating_sub(WeightInfoOf::::parachain_head_storage_write_weight(T::DbWeight::get())); - } - let is_prune_happened = matches!(update_result, Ok(true)); - if !is_prune_happened { - actual_weight = actual_weight - .saturating_sub(WeightInfoOf::::parachain_head_pruning_weight(T::DbWeight::get())); - } - } + stored_best_head.take(), + relay_block_number, + parachain_head_data, + parachain_head_hash, + )?; + *stored_best_head = Some(artifacts.best_head); + Ok(artifacts.prune_happened) + }); + + // we're refunding weight if update has not happened and if pruning has not happened + let is_update_happened = matches!(update_result, Ok(_)); + if !is_update_happened { + actual_weight = actual_weight.saturating_sub( + WeightInfoOf::::parachain_head_storage_write_weight( + T::DbWeight::get(), + ), + ); + } + let is_prune_happened = matches!(update_result, Ok(true)); + if !is_prune_happened { + actual_weight = actual_weight.saturating_sub( + WeightInfoOf::::parachain_head_pruning_weight(T::DbWeight::get()), + ); + } + } - // even though we may have accepted some parachain heads, we can't allow relayers to submit - // proof with unused trie nodes - // => treat this as an error - // - // (we can throw error here, because now all our calls are transactional) - storage.ensure_no_unused_nodes() - }, - ) - .and_then(|r| r.map_err(HeaderChainError::StorageProof)) - .map_err(|e| { - log::trace!(target: LOG_TARGET, "Parachain heads storage proof is invalid: {:?}", e); - Error::::HeaderChain(e) + // even though we may have accepted some parachain heads, we can't allow relayers to + // submit proof with unused trie nodes + // => treat this as an error + // + // (we can throw error here, because now all our calls are transactional) + storage.ensure_no_unused_nodes().map_err(|e| { + Error::::HeaderChainStorageProof(HeaderChainError::StorageProof(e)) })?; Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes }) @@ -1438,7 +1435,7 @@ pub(crate) mod tests { // try to import head#5 of parachain#1 at relay chain block #0 assert_noop!( import_parachain_1_head(0, Default::default(), parachains, proof), - Error::::HeaderChain(HeaderChainError::StorageProof( + Error::::HeaderChainStorageProof(HeaderChainError::StorageProof( StorageProofError::StorageRootMismatch )) ); diff --git a/bridges/primitives/chain-bridge-hub-kusama/src/lib.rs b/bridges/primitives/chain-bridge-hub-kusama/src/lib.rs index 6ca2cd047fb..00b6c8301e4 100644 --- a/bridges/primitives/chain-bridge-hub-kusama/src/lib.rs +++ b/bridges/primitives/chain-bridge-hub-kusama/src/lib.rs @@ -72,12 +72,10 @@ pub type Address = MultiAddress; pub const BRIDGE_HUB_KUSAMA_PARACHAIN_ID: u32 = 1002; /// Name of the With-BridgeHubKusama messages pallet instance that is deployed at bridged chains. -// TODO: check me (https://github.com/paritytech/parity-bridges-common/issues/1945) pub const WITH_BRIDGE_HUB_KUSAMA_MESSAGES_PALLET_NAME: &str = "BridgeKusamaMessages"; /// Name of the With-BridgeHubKusama bridge-relayers pallet instance that is deployed at bridged /// chains. -// TODO: check me (https://github.com/paritytech/parity-bridges-common/issues/1945) pub const WITH_BRIDGE_HUB_KUSAMA_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; decl_bridge_finality_runtime_apis!(bridge_hub_kusama); diff --git a/bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs b/bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs index 646fb0a6e41..8bd9167b618 100644 --- a/bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs +++ b/bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs @@ -59,16 +59,13 @@ impl Parachain for BridgeHubPolkadot { } /// Identifier of BridgeHubPolkadot in the Polkadot relay chain. -// TODO: check me (https://github.com/paritytech/parity-bridges-common/issues/1945) pub const BRIDGE_HUB_POLKADOT_PARACHAIN_ID: u32 = 1002; /// Name of the With-BridgeHubPolkadot messages pallet instance that is deployed at bridged chains. -// TODO: check me (https://github.com/paritytech/parity-bridges-common/issues/1945) pub const WITH_BRIDGE_HUB_POLKADOT_MESSAGES_PALLET_NAME: &str = "BridgePolkadotMessages"; /// Name of the With-BridgeHubPolkadot bridge-relayers pallet instance that is deployed at bridged /// chains. -// TODO: check me (https://github.com/paritytech/parity-bridges-common/issues/1945) pub const WITH_BRIDGE_HUB_POLKADOT_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; decl_bridge_finality_runtime_apis!(bridge_hub_polkadot); diff --git a/bridges/primitives/chain-kusama/src/lib.rs b/bridges/primitives/chain-kusama/src/lib.rs index 8e5aec8afda..5cef6ae0ee6 100644 --- a/bridges/primitives/chain-kusama/src/lib.rs +++ b/bridges/primitives/chain-kusama/src/lib.rs @@ -62,4 +62,11 @@ pub const PARAS_PALLET_NAME: &str = "Paras"; /// Name of the With-Kusama GRANDPA pallet instance that is deployed at bridged chains. pub const WITH_KUSAMA_GRANDPA_PALLET_NAME: &str = "BridgeKusamaGrandpa"; +/// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Polkadot +/// parachains. +/// +/// It includes the block number and state root, so it shall be near 40 bytes, but let's have some +/// reserve. +pub const MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE: u32 = 128; + decl_bridge_finality_runtime_apis!(kusama); diff --git a/bridges/primitives/chain-polkadot/src/lib.rs b/bridges/primitives/chain-polkadot/src/lib.rs index 92995601698..51d9f6f0233 100644 --- a/bridges/primitives/chain-polkadot/src/lib.rs +++ b/bridges/primitives/chain-polkadot/src/lib.rs @@ -62,4 +62,11 @@ pub const PARAS_PALLET_NAME: &str = "Paras"; /// Name of the With-Polkadot GRANDPA pallet instance that is deployed at bridged chains. pub const WITH_POLKADOT_GRANDPA_PALLET_NAME: &str = "BridgePolkadotGrandpa"; +/// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Polkadot +/// parachains. +/// +/// It includes the block number and state root, so it shall be near 40 bytes, but let's have some +/// reserve. +pub const MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE: u32 = 128; + decl_bridge_finality_runtime_apis!(polkadot); diff --git a/bridges/primitives/header-chain/src/justification.rs b/bridges/primitives/header-chain/src/justification.rs index 748f97b6a47..8433107fce2 100644 --- a/bridges/primitives/header-chain/src/justification.rs +++ b/bridges/primitives/header-chain/src/justification.rs @@ -49,6 +49,7 @@ pub struct GrandpaJustification { pub votes_ancestries: Vec
, } +// TODO: remove and use `RuntimeDebug` (https://github.com/paritytech/parity-bridges-common/issues/2136) impl sp_std::fmt::Debug for GrandpaJustification
{ fn fmt(&self, fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { #[cfg(feature = "std")] diff --git a/bridges/primitives/header-chain/src/lib.rs b/bridges/primitives/header-chain/src/lib.rs index 5e2bbad242e..5b278454728 100644 --- a/bridges/primitives/header-chain/src/lib.rs +++ b/bridges/primitives/header-chain/src/lib.rs @@ -73,18 +73,14 @@ impl StoredHeaderDataBuilder for H { pub trait HeaderChain { /// Returns state (storage) root of given finalized header. fn finalized_header_state_root(header_hash: HashOf) -> Option>; - /// Parse storage proof using finalized header. - fn parse_finalized_storage_proof( + /// Get storage proof checker using finalized header. + fn storage_proof_checker( header_hash: HashOf, storage_proof: RawStorageProof, - parse: impl FnOnce(StorageProofChecker>) -> R, - ) -> Result { + ) -> Result>, HeaderChainError> { let state_root = Self::finalized_header_state_root(header_hash) .ok_or(HeaderChainError::UnknownHeader)?; - let storage_proof_checker = bp_runtime::StorageProofChecker::new(state_root, storage_proof) - .map_err(HeaderChainError::StorageProof)?; - - Ok(parse(storage_proof_checker)) + StorageProofChecker::new(state_root, storage_proof).map_err(HeaderChainError::StorageProof) } } diff --git a/bridges/primitives/messages/Cargo.toml b/bridges/primitives/messages/Cargo.toml index 32a89f6cf78..cb35b4ae65b 100644 --- a/bridges/primitives/messages/Cargo.toml +++ b/bridges/primitives/messages/Cargo.toml @@ -14,6 +14,7 @@ serde = { version = "1.0", optional = true, features = ["derive"] } # Bridge dependencies bp-runtime = { path = "../runtime", default-features = false } +bp-header-chain = { path = "../header-chain", default-features = false } # Substrate Dependencies @@ -29,6 +30,7 @@ hex-literal = "0.4" default = ["std"] std = [ "bp-runtime/std", + "bp-header-chain/std", "codec/std", "frame-support/std", "scale-info/std", diff --git a/bridges/primitives/messages/src/lib.rs b/bridges/primitives/messages/src/lib.rs index e485aa2f801..8f6c9466109 100644 --- a/bridges/primitives/messages/src/lib.rs +++ b/bridges/primitives/messages/src/lib.rs @@ -20,9 +20,15 @@ // RuntimeApi generated functions #![allow(clippy::too_many_arguments)] -use bp_runtime::{BasicOperatingMode, OperatingMode, RangeInclusiveExt}; +use bp_header_chain::HeaderChainError; +use bp_runtime::{ + messages::MessageDispatchResult, BasicOperatingMode, OperatingMode, RangeInclusiveExt, + StorageProofError, +}; use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::RuntimeDebug; +use frame_support::{PalletError, RuntimeDebug}; +// Weight is reexported to avoid additional frame-support dependencies in related crates. +pub use frame_support::weights::Weight; use scale_info::TypeInfo; use source_chain::RelayersRewards; use sp_core::TypeId; @@ -32,10 +38,6 @@ pub mod source_chain; pub mod storage_keys; pub mod target_chain; -use bp_runtime::messages::MessageDispatchResult; -// Weight is reexported to avoid additional frame-support dependencies in related crates. -pub use frame_support::weights::Weight; - /// Messages pallet operating mode. #[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] #[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] @@ -189,6 +191,17 @@ impl InboundLaneData { .map(|entry| entry.messages.end) .unwrap_or(self.last_confirmed_nonce) } + + /// Returns the total number of messages in the `relayers` vector, + /// saturating in case of underflow or overflow. + pub fn total_unrewarded_messages(&self) -> MessageNonce { + let relayers = &self.relayers; + match (relayers.front(), relayers.back()) { + (Some(front), Some(back)) => + (front.messages.begin..=back.messages.end).saturating_len(), + _ => 0, + } + } } /// Outbound message details, returned by runtime APIs. @@ -285,7 +298,7 @@ impl DeliveredMessages { /// Return total count of delivered messages. pub fn total_messages(&self) -> MessageNonce { - (self.begin..=self.end).checked_len().unwrap_or(0) + (self.begin..=self.end).saturating_len() } /// Note new dispatched message. @@ -316,6 +329,13 @@ pub struct UnrewardedRelayersState { pub last_delivered_nonce: MessageNonce, } +impl UnrewardedRelayersState { + // Verify that the relayers state corresponds with the `InboundLaneData`. + pub fn is_valid(&self, lane_data: &InboundLaneData) -> bool { + self == &lane_data.into() + } +} + impl From<&InboundLaneData> for UnrewardedRelayersState { fn from(lane: &InboundLaneData) -> UnrewardedRelayersState { UnrewardedRelayersState { @@ -323,9 +343,9 @@ impl From<&InboundLaneData> for UnrewardedRelayersState { messages_in_oldest_entry: lane .relayers .front() - .and_then(|entry| (entry.messages.begin..=entry.messages.end).checked_len()) + .map(|entry| entry.messages.total_messages()) .unwrap_or(0), - total_messages: total_unrewarded_messages(&lane.relayers).unwrap_or(MessageNonce::MAX), + total_messages: lane.total_unrewarded_messages(), last_delivered_nonce: lane.last_delivered_nonce(), } } @@ -355,24 +375,6 @@ impl Default for OutboundLaneData { } } -/// Returns total number of messages in the `InboundLaneData::relayers` vector. -/// -/// Returns `None` if there are more messages that `MessageNonce` may fit (i.e. `MessageNonce + 1`). -pub fn total_unrewarded_messages( - relayers: &VecDeque>, -) -> Option { - match (relayers.front(), relayers.back()) { - (Some(front), Some(back)) => { - if let Some(difference) = back.messages.end.checked_sub(front.messages.begin) { - difference.checked_add(1) - } else { - Some(0) - } - }, - _ => Some(0), - } -} - /// Calculate the number of messages that the relayers have delivered. pub fn calc_relayers_rewards( messages_relayers: VecDeque>, @@ -414,26 +416,50 @@ pub enum BridgeMessagesCall { }, } +/// Error that happens during message verification. +#[derive(Encode, Decode, RuntimeDebug, PartialEq, Eq, PalletError, TypeInfo)] +pub enum VerificationError { + /// The message proof is empty. + EmptyMessageProof, + /// Error returned by the bridged header chain. + HeaderChain(HeaderChainError), + /// Error returned while reading/decoding inbound lane data from the storage proof. + InboundLaneStorage(StorageProofError), + /// The declared message weight is incorrect. + InvalidMessageWeight, + /// Declared messages count doesn't match actual value. + MessagesCountMismatch, + /// Error returned while reading/decoding message data from the storage proof. + MessageStorage(StorageProofError), + /// The message is too large. + MessageTooLarge, + /// Error returned while reading/decoding outbound lane data from the storage proof. + OutboundLaneStorage(StorageProofError), + /// Storage proof related error. + StorageProof(StorageProofError), + /// Custom error + Other(#[codec(skip)] &'static str), +} + #[cfg(test)] mod tests { use super::*; #[test] fn total_unrewarded_messages_does_not_overflow() { - assert_eq!( - total_unrewarded_messages( - &vec![ - UnrewardedRelayer { relayer: 1, messages: DeliveredMessages::new(0) }, - UnrewardedRelayer { - relayer: 2, - messages: DeliveredMessages::new(MessageNonce::MAX) - }, - ] - .into_iter() - .collect() - ), - None, - ); + let lane_data = InboundLaneData { + relayers: vec![ + UnrewardedRelayer { relayer: 1, messages: DeliveredMessages::new(0) }, + UnrewardedRelayer { + relayer: 2, + messages: DeliveredMessages::new(MessageNonce::MAX), + }, + ] + .into_iter() + .collect(), + last_confirmed_nonce: 0, + }; + assert_eq!(lane_data.total_unrewarded_messages(), MessageNonce::MAX); } #[test] diff --git a/bridges/primitives/messages/src/source_chain.rs b/bridges/primitives/messages/src/source_chain.rs index 394a934171f..f3c50b84a09 100644 --- a/bridges/primitives/messages/src/source_chain.rs +++ b/bridges/primitives/messages/src/source_chain.rs @@ -16,7 +16,7 @@ //! Primitives of messages module, that are used on the source chain. -use crate::{InboundLaneData, LaneId, MessageNonce, OutboundLaneData}; +use crate::{InboundLaneData, LaneId, MessageNonce, OutboundLaneData, VerificationError}; use crate::UnrewardedRelayer; use bp_runtime::Size; @@ -40,9 +40,6 @@ pub type RelayersRewards = BTreeMap; /// source chain to the target chain. The `AccountId` type here means the account /// type used by the source chain. pub trait TargetHeaderChain { - /// Error type. - type Error: Debug; - /// Proof that messages have been received by target chain. type MessagesDeliveryProof: Parameter + Size; @@ -58,12 +55,12 @@ pub trait TargetHeaderChain { /// 1MB. BTC nodes aren't accepting transactions that are larger than 1MB, so relayer /// will be unable to craft valid transaction => this (and all subsequent) messages will /// never be delivered. - fn verify_message(payload: &Payload) -> Result<(), Self::Error>; + fn verify_message(payload: &Payload) -> Result<(), VerificationError>; /// Verify messages delivery proof and return lane && nonce of the latest received message. fn verify_messages_delivery_proof( proof: Self::MessagesDeliveryProof, - ) -> Result<(LaneId, InboundLaneData), Self::Error>; + ) -> Result<(LaneId, InboundLaneData), VerificationError>; } /// Lane message verifier. @@ -75,9 +72,6 @@ pub trait TargetHeaderChain { /// /// Any fee requirements should also be enforced here. pub trait LaneMessageVerifier { - /// Error type. - type Error: Debug + Into<&'static str>; - /// Verify message payload and return Ok(()) if message is valid and allowed to be sent over the /// lane. fn verify_message( @@ -85,7 +79,7 @@ pub trait LaneMessageVerifier { lane: &LaneId, outbound_data: &OutboundLaneData, payload: &Payload, - ) -> Result<(), Self::Error>; + ) -> Result<(), VerificationError>; } /// Manages payments that are happening at the source chain during delivery confirmation @@ -169,31 +163,27 @@ const ALL_OUTBOUND_MESSAGES_REJECTED: &str = "This chain is configured to reject all outbound messages"; impl TargetHeaderChain for ForbidOutboundMessages { - type Error = &'static str; - type MessagesDeliveryProof = (); - fn verify_message(_payload: &Payload) -> Result<(), Self::Error> { - Err(ALL_OUTBOUND_MESSAGES_REJECTED) + fn verify_message(_payload: &Payload) -> Result<(), VerificationError> { + Err(VerificationError::Other(ALL_OUTBOUND_MESSAGES_REJECTED)) } fn verify_messages_delivery_proof( _proof: Self::MessagesDeliveryProof, - ) -> Result<(LaneId, InboundLaneData), Self::Error> { - Err(ALL_OUTBOUND_MESSAGES_REJECTED) + ) -> Result<(LaneId, InboundLaneData), VerificationError> { + Err(VerificationError::Other(ALL_OUTBOUND_MESSAGES_REJECTED)) } } impl LaneMessageVerifier for ForbidOutboundMessages { - type Error = &'static str; - fn verify_message( _submitter: &SenderOrigin, _lane: &LaneId, _outbound_data: &OutboundLaneData, _payload: &Payload, - ) -> Result<(), Self::Error> { - Err(ALL_OUTBOUND_MESSAGES_REJECTED) + ) -> Result<(), VerificationError> { + Err(VerificationError::Other(ALL_OUTBOUND_MESSAGES_REJECTED)) } } diff --git a/bridges/primitives/messages/src/target_chain.rs b/bridges/primitives/messages/src/target_chain.rs index 3c2e8cf0cb0..385bc4ac373 100644 --- a/bridges/primitives/messages/src/target_chain.rs +++ b/bridges/primitives/messages/src/target_chain.rs @@ -16,7 +16,9 @@ //! Primitives of messages module, that are used on the target chain. -use crate::{LaneId, Message, MessageKey, MessageNonce, MessagePayload, OutboundLaneData}; +use crate::{ + LaneId, Message, MessageKey, MessageNonce, MessagePayload, OutboundLaneData, VerificationError, +}; use bp_runtime::{messages::MessageDispatchResult, Size}; use codec::{Decode, Encode, Error as CodecError}; @@ -58,9 +60,6 @@ pub struct DispatchMessage { /// can't change. Wrong implementation may lead to invalid lane states (i.e. lane /// that's stuck) and/or processing messages without paying fees. pub trait SourceHeaderChain { - /// Error type. - type Error: Debug; - /// Proof that messages are sent from source chain. This may also include proof /// of corresponding outbound lane states. type MessagesProof: Parameter + Size; @@ -79,7 +78,7 @@ pub trait SourceHeaderChain { fn verify_messages_proof( proof: Self::MessagesProof, messages_count: u32, - ) -> Result, Self::Error>; + ) -> Result, VerificationError>; } /// Called when inbound message is received. @@ -164,21 +163,20 @@ pub struct ForbidInboundMessages( PhantomData<(MessagesProof, DispatchPayload)>, ); -/// Error message that is used in `ForbidOutboundMessages` implementation. +/// Error message that is used in `ForbidInboundMessages` implementation. const ALL_INBOUND_MESSAGES_REJECTED: &str = "This chain is configured to reject all inbound messages"; impl SourceHeaderChain for ForbidInboundMessages { - type Error = &'static str; type MessagesProof = MessagesProof; fn verify_messages_proof( _proof: Self::MessagesProof, _messages_count: u32, - ) -> Result, Self::Error> { - Err(ALL_INBOUND_MESSAGES_REJECTED) + ) -> Result, VerificationError> { + Err(VerificationError::Other(ALL_INBOUND_MESSAGES_REJECTED)) } } diff --git a/bridges/primitives/polkadot-core/src/parachains.rs b/bridges/primitives/polkadot-core/src/parachains.rs index 0b410dff49f..9cac3279c72 100644 --- a/bridges/primitives/polkadot-core/src/parachains.rs +++ b/bridges/primitives/polkadot-core/src/parachains.rs @@ -18,8 +18,8 @@ //! //! Even though this (bridges) repository references polkadot repository, we can't //! reference polkadot crates from pallets. That's because bridges repository is -//! included in the polkadot repository and included pallets are used by polkadot -//! chains. Having pallets that are referencing polkadot, would mean that there may +//! included in the Cumulus repository and included pallets are used by Cumulus +//! parachains. Having pallets that are referencing polkadot, would mean that there may //! be two versions of polkadot crates included in the runtime. Which is bad. use bp_runtime::{RawStorageProof, Size}; diff --git a/bridges/primitives/runtime/src/chain.rs b/bridges/primitives/runtime/src/chain.rs index 94b3a193c58..c79058cea90 100644 --- a/bridges/primitives/runtime/src/chain.rs +++ b/bridges/primitives/runtime/src/chain.rs @@ -232,6 +232,14 @@ where const PARACHAIN_ID: u32 = <::Chain as Parachain>::PARACHAIN_ID; } +/// Adapter for `Get` to access `PARACHAIN_ID` from `trait Parachain` +pub struct ParachainIdOf(sp_std::marker::PhantomData); +impl frame_support::traits::Get for ParachainIdOf { + fn get() -> u32 { + Para::PARACHAIN_ID + } +} + /// Underlying chain type. pub type UnderlyingChainOf = ::Chain; diff --git a/bridges/primitives/runtime/src/lib.rs b/bridges/primitives/runtime/src/lib.rs index df77745bc02..1922a2eb160 100644 --- a/bridges/primitives/runtime/src/lib.rs +++ b/bridges/primitives/runtime/src/lib.rs @@ -31,11 +31,11 @@ use sp_std::{convert::TryFrom, fmt::Debug, ops::RangeInclusive, vec, vec::Vec}; pub use chain::{ AccountIdOf, AccountPublicOf, BalanceOf, BlockNumberOf, Chain, EncodedOrDecodedCall, HashOf, - HasherOf, HeaderOf, IndexOf, Parachain, SignatureOf, TransactionEraOf, UnderlyingChainOf, - UnderlyingChainProvider, + HasherOf, HeaderOf, IndexOf, Parachain, ParachainIdOf, SignatureOf, TransactionEraOf, + UnderlyingChainOf, UnderlyingChainProvider, }; pub use frame_support::storage::storage_prefix as storage_value_final_key; -use num_traits::{CheckedAdd, CheckedSub, One}; +use num_traits::{CheckedAdd, CheckedSub, One, SaturatingAdd, Zero}; pub use storage_proof::{ record_all_keys as record_all_trie_keys, Error as StorageProofError, ProofSize as StorageProofSize, RawStorageProof, StorageProofChecker, @@ -95,7 +95,7 @@ pub const BRIDGE_HUB_WOCOCO_CHAIN_ID: ChainId = *b"bhwo"; pub const BRIDGE_HUB_KUSAMA_CHAIN_ID: ChainId = *b"bhks"; /// BridgeHubPolkadot chain id. -pub const BRIDGE_HUB_POLKADOT_CHAIN_ID: ChainId = *b"bhwo"; +pub const BRIDGE_HUB_POLKADOT_CHAIN_ID: ChainId = *b"bhpd"; /// Generic header Id. #[derive( @@ -527,17 +527,27 @@ impl Debug for StrippableError { pub trait RangeInclusiveExt { /// Computes the length of the `RangeInclusive`, checking for underflow and overflow. fn checked_len(&self) -> Option; + /// Computes the length of the `RangeInclusive`, saturating in case of underflow or overflow. + fn saturating_len(&self) -> Idx; } impl RangeInclusiveExt for RangeInclusive where - Idx: CheckedSub + CheckedAdd + One, + Idx: CheckedSub + CheckedAdd + SaturatingAdd + One + Zero, { fn checked_len(&self) -> Option { self.end() .checked_sub(self.start()) .and_then(|len| len.checked_add(&Idx::one())) } + + fn saturating_len(&self) -> Idx { + let len = match self.end().checked_sub(self.start()) { + Some(len) => len, + None => return Idx::zero(), + }; + len.saturating_add(&Idx::one()) + } } #[cfg(test)] diff --git a/bridges/scripts/verify-pallets-build.sh b/bridges/scripts/verify-pallets-build.sh index dfee5341673..2230d68a9c4 100755 --- a/bridges/scripts/verify-pallets-build.sh +++ b/bridges/scripts/verify-pallets-build.sh @@ -127,6 +127,7 @@ cargo check -p pallet-bridge-relayers --features runtime-benchmarks cargo check -p pallet-bridge-relayers --features try-runtime cargo check -p bridge-runtime-common cargo check -p bridge-runtime-common --features runtime-benchmarks +cargo check -p bridge-runtime-common --features integrity-test # we're removing lock file after all chechs are done. Otherwise we may use different # Substrate/Polkadot/Cumulus commits and our checks will fail diff --git a/parachain-template/runtime/src/xcm_config.rs b/parachain-template/runtime/src/xcm_config.rs index 096359004d6..775455cc622 100644 --- a/parachain-template/runtime/src/xcm_config.rs +++ b/parachain-template/runtime/src/xcm_config.rs @@ -63,7 +63,7 @@ pub type XcmOriginToTransactDispatchOrigin = ( // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for // foreign chains who want to have a local sovereign account on this chain which they control. SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when // recognized. RelayChainAsNative, // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 4b626fb8f30..c183d6c2676 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -174,6 +174,7 @@ match_types! { MultiLocation { parents: 1, interior: X1(Plurality { .. }) } }; } + /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly /// account for proof size weights. /// diff --git a/parachains/runtimes/bridge-hubs/README.md b/parachains/runtimes/bridge-hubs/README.md index 9b024769195..7e50c7be9f5 100644 --- a/parachains/runtimes/bridge-hubs/README.md +++ b/parachains/runtimes/bridge-hubs/README.md @@ -1,8 +1,8 @@ - [Bridge-hub Parachains](#bridge-hub-parachains) - * [How to test locally Rococo <-> Wococo](#how-to-test-locally-rococo-----wococo) - + [Prepare/Build/Deploy](#prepare-build-deploy) + * [Requirements for local run/testing](#requirements-for-local-run-testing) + * [How to test locally Rococo <-> Wococo bridge](#how-to-test-locally-rococo-----wococo-bridge) + [Run chains (Rococo + BridgeHub, Wococo + BridgeHub) with zombienet](#run-chains--rococo---bridgehub--wococo---bridgehub--with-zombienet) - + [Run relayers (Rococo, Wococo)](#run-relayers--rococo--wococo-) + + [Run relayer (BridgeHubRococo, BridgeHubWococo)](#run-relayer--bridgehubrococo--bridgehubwococo-) - [Run with script (alternative 1)](#run-with-script--alternative-1-) - [Run with binary (alternative 2)](#run-with-binary--alternative-2-) + [Send messages](#send-messages) @@ -29,9 +29,8 @@ The current trustless bridges planned for the BridgeHub(s) are: ![](./docs/bridge-hub-parachain-design.jpg "Basic deployment setup") -## How to test locally Rococo <-> Wococo +## Requirements for local run/testing -### Prepare/Build/Deploy ``` # Prepare empty directory for testing mkdir -p ~/local_bridge_testing/bin @@ -44,7 +43,13 @@ Copy the apropriate binary (zombienet-linux) from the latest release to ~/local_ # 2. Build polkadot binary git clone https://github.com/paritytech/polkadot.git cd polkadot -cargo build --release + +# if you want to test Kusama/Polkadot bridge, we need "sudo pallet + fast-runtime", +# so please, find the latest polkadot's repository branch `it/release-vX.Y.Z-fast-sudo` +# e.g: +# git checkout -b it/release-v0.9.42-fast-sudo --track origin/it/release-v0.9.42-fast-sudo + +cargo build --release --features fast-runtime cp target/release/polkadot ~/local_bridge_testing/bin/polkadot # 3. Build cumulus polkadot-parachain binary @@ -69,6 +74,8 @@ cargo build --release --locked -p polkadot-parachain-bin cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain-mint ``` +## How to test locally Rococo <-> Wococo bridge + ### Run chains (Rococo + BridgeHub, Wococo + BridgeHub) with zombienet ``` @@ -87,7 +94,7 @@ POLKADOT_PARACHAIN_BINARY_PATH_FOR_WOCKMINT=~/local_bridge_testing/bin/polkadot- ~/local_bridge_testing/bin/zombienet-linux --provider native spawn ./zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml ``` -### Run relayers (Rococo, Wococo) +### Run relayer (BridgeHubRococo, BridgeHubWococo) **Accounts of BridgeHub parachains:** - `Bob` is pallet owner of all bridge pallets diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_rococo_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_rococo_config.rs index bfa6f98ebae..8a85076e33e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_rococo_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_rococo_config.rs @@ -134,7 +134,7 @@ impl ThisChainWithMessages for BridgeHubRococo { /// Signed extension that refunds relayers that are delivering messages from the Wococo parachain. pub type BridgeRefundBridgeHubWococoMessages = RefundBridgedParachainMessages< Runtime, - RefundableParachain, + RefundableParachain, RefundableMessagesLane, ActualFeeRefund, PriorityBoostPerMessage, @@ -144,10 +144,6 @@ bp_runtime::generate_static_str_provider!(BridgeRefundBridgeHubWococoMessages); parameter_types! { pub const BridgeHubWococoMessagesLane: bp_messages::LaneId = DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO; - pub const BridgeHubWococoParachainId: u32 = { - use bp_runtime::Parachain; - BridgeHubWococo::PARACHAIN_ID - }; } #[cfg(test)] diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_wococo_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_wococo_config.rs index 2c9ec3c82bc..025486d43ca 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_wococo_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_wococo_config.rs @@ -134,7 +134,7 @@ impl ThisChainWithMessages for BridgeHubWococo { /// Signed extension that refunds relayers that are delivering messages from the Rococo parachain. pub type BridgeRefundBridgeHubRococoMessages = RefundBridgedParachainMessages< Runtime, - RefundableParachain, + RefundableParachain, RefundableMessagesLane, ActualFeeRefund, PriorityBoostPerMessage, @@ -144,10 +144,6 @@ bp_runtime::generate_static_str_provider!(BridgeRefundBridgeHubRococoMessages); parameter_types! { pub const BridgeHubRococoMessagesLane: bp_messages::LaneId = DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO; - pub const BridgeHubRococoParachainId: u32 = { - use bp_runtime::Parachain; - BridgeHubRococo::PARACHAIN_ID - }; } #[cfg(test)] diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index dc42ff8d699..d94aef2cb8e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -92,8 +92,6 @@ use parachains_common::{ }; use xcm_executor::XcmExecutor; -pub const LOG_TARGET: &str = "runtime::bridge-hub"; - /// The address format for describing accounts. pub type Address = MultiAddress; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs index 286c8010f8a..81ecd10512f 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs @@ -80,12 +80,12 @@ impl pallet_bridge_messages::WeightInfoExt for pallet_bridge_messages_bridge_mes impl pallet_bridge_parachains::WeightInfoExt for pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance::WeightInfo { fn expected_extra_storage_proof_size() -> u32 { - bp_bridge_hub_wococo::EXTRA_STORAGE_PROOF_SIZE + bp_bridge_hub_rococo::EXTRA_STORAGE_PROOF_SIZE } } impl pallet_bridge_parachains::WeightInfoExt for pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance::WeightInfo { fn expected_extra_storage_proof_size() -> u32 { - bp_bridge_hub_rococo::EXTRA_STORAGE_PROOF_SIZE + bp_bridge_hub_wococo::EXTRA_STORAGE_PROOF_SIZE } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index c8a4c42af0e..1a5bb335964 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -16,8 +16,9 @@ use super::{ AccountId, AllPalletsWithSystem, Balances, BridgeGrandpaRococoInstance, - BridgeGrandpaWococoInstance, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, - RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, + BridgeGrandpaWococoInstance, DeliveryRewardInBalance, ParachainInfo, ParachainSystem, + PolkadotXcm, RequiredStakeForStakeAndSlash, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + WeightToFee, XcmpQueue, }; use crate::{ bridge_hub_rococo_config::ToBridgeHubWococoHaulBlobExporter, @@ -152,6 +153,17 @@ impl Contains for SafeCallFilter { } } + // Allow to change dedicated storage items (called by governance-like) + match call { + RuntimeCall::System(frame_system::Call::set_storage { items }) + if items.iter().any(|(k, _)| { + k.eq(&DeliveryRewardInBalance::key()) | + k.eq(&RequiredStakeForStakeAndSlash::key()) + }) => + return true, + _ => (), + }; + matches!( call, RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | @@ -232,12 +244,12 @@ impl xcm_executor::Config for XcmConfig { UsingComponents>; type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; + type AssetLocker = (); + type AssetExchanger = (); type AssetClaims = PolkadotXcm; type SubscriptionService = PolkadotXcm; type PalletInstancesInfo = AllPalletsWithSystem; type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); type FeeManager = (); type MessageExporter = BridgeHubRococoOrBridgeHubWococoSwitchExporter; type UniversalAliases = Nothing; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index a31171ba609..64477b9ddc4 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -18,8 +18,8 @@ pub use bridge_hub_rococo_runtime::{ constants::fee::WeightToFee, xcm_config::{RelayNetwork, XcmConfig, XcmRouter}, Balances, BridgeGrandpaRococoInstance, BridgeGrandpaWococoInstance, BridgeWococoMessages, - ExistentialDeposit, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, - SessionKeys, + DeliveryRewardInBalance, ExistentialDeposit, ParachainSystem, PolkadotXcm, + RequiredStakeForStakeAndSlash, Runtime, RuntimeCall, RuntimeEvent, SessionKeys, }; use codec::{Decode, Encode}; use xcm::latest::prelude::*; @@ -30,7 +30,7 @@ use bridge_hub_rococo_runtime::{ }; use frame_support::parameter_types; -use parachains_common::{AccountId, AuraId}; +use parachains_common::{AccountId, AuraId, Balance}; const ALICE: [u8; 32] = [1u8; 32]; @@ -80,6 +80,36 @@ mod bridge_hub_rococo_tests { Box::new(|call| RuntimeCall::BridgeWococoGrandpa(call).encode()) ); + bridge_hub_test_utils::include_change_storage_constant_by_governance_works!( + change_delivery_reward_by_governance_works, + Runtime, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::System(call).encode()), + (DeliveryRewardInBalance, u64), + || (DeliveryRewardInBalance::key().to_vec(), DeliveryRewardInBalance::get()), + |old_value| old_value.checked_mul(2).unwrap() + ); + + bridge_hub_test_utils::include_change_storage_constant_by_governance_works!( + change_required_stake_by_governance_works, + Runtime, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::System(call).encode()), + (RequiredStakeForStakeAndSlash, Balance), + || (RequiredStakeForStakeAndSlash::key().to_vec(), RequiredStakeForStakeAndSlash::get()), + |old_value| old_value.checked_mul(2).unwrap() + ); + bridge_hub_test_utils::include_handle_export_message_from_system_parachain_to_outbound_queue_works!( Runtime, XcmConfig, @@ -173,6 +203,36 @@ mod bridge_hub_wococo_tests { Box::new(|call| RuntimeCall::BridgeRococoGrandpa(call).encode()) ); + bridge_hub_test_utils::include_change_storage_constant_by_governance_works!( + change_delivery_reward_by_governance_works, + Runtime, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::System(call).encode()), + (DeliveryRewardInBalance, u64), + || (DeliveryRewardInBalance::key().to_vec(), DeliveryRewardInBalance::get()), + |old_value| old_value.checked_mul(2).unwrap() + ); + + bridge_hub_test_utils::include_change_storage_constant_by_governance_works!( + change_required_stake_by_governance_works, + Runtime, + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } + ), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::System(call).encode()), + (RequiredStakeForStakeAndSlash, Balance), + || (RequiredStakeForStakeAndSlash::key().to_vec(), RequiredStakeForStakeAndSlash::get()), + |old_value| old_value.checked_mul(2).unwrap() + ); + bridge_hub_test_utils::include_handle_export_message_from_system_parachain_to_outbound_queue_works!( Runtime, XcmConfig, diff --git a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs index 5f419fe789f..bc428c2791c 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs +++ b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs @@ -84,8 +84,7 @@ pub fn initialize_bridge_by_governance_works( let require_weight_at_most = ::DbWeight::get().reads_writes(7, 7); - // execute XCM with Transacts to initialize bridge as governance does - // prepare data for xcm::Transact(create) + // execute XCM with Transacts to `initialize bridge` as governance does assert_ok!(RuntimeHelper::::execute_as_governance( initialize_call, require_weight_at_most @@ -123,6 +122,105 @@ macro_rules! include_initialize_bridge_by_governance_works( } ); +/// Test-case makes sure that `Runtime` can change storage constant via governance-like call +pub fn change_storage_constant_by_governance_works( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + runtime_call_encode: Box) -> Vec>, + storage_constant_key_value: fn() -> (Vec, StorageConstantType), + new_storage_constant_value: fn(&StorageConstantType) -> StorageConstantType, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_dmp_queue::Config + + cumulus_pallet_parachain_system::Config, + ValidatorIdOf: From>, + StorageConstant: Get, + StorageConstantType: Encode + PartialEq + std::fmt::Debug, +{ + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_para_id(runtime_para_id.into()) + .with_tracing() + .build() + .execute_with(|| { + let (storage_constant_key, storage_constant_init_value): ( + Vec, + StorageConstantType, + ) = storage_constant_key_value(); + + // check delivery reward constant before (not stored yet, just as default value is used) + assert_eq!(StorageConstant::get(), storage_constant_init_value); + assert_eq!(sp_io::storage::get(&storage_constant_key), None); + + let new_storage_constant_value = + new_storage_constant_value(&storage_constant_init_value); + assert_ne!(new_storage_constant_value, storage_constant_init_value); + + // encode `set_storage` call + let set_storage_call = + runtime_call_encode(frame_system::Call::::set_storage { + items: vec![( + storage_constant_key.clone(), + new_storage_constant_value.encode(), + )], + }); + + // estimate - storing just 1 value + use frame_system::WeightInfo; + let require_weight_at_most = + ::SystemWeightInfo::set_storage(1); + + // execute XCM with Transact to `set_storage` as governance does + assert_ok!(RuntimeHelper::::execute_as_governance( + set_storage_call, + require_weight_at_most + ) + .ensure_complete()); + + // check delivery reward constant after (stored) + assert_eq!(StorageConstant::get(), new_storage_constant_value); + assert_eq!( + sp_io::storage::get(&storage_constant_key), + Some(new_storage_constant_value.encode().into()) + ); + }) +} + +#[macro_export] +macro_rules! include_change_storage_constant_by_governance_works( + ( + $test_name:tt, + $runtime:path, + $collator_session_key:expr, + $runtime_para_id:expr, + $runtime_call_encode:expr, + ($storage_constant:path, $storage_constant_type:path), + $storage_constant_key_value:expr, + $new_storage_constant_value:expr + ) => { + #[test] + fn $test_name() { + $crate::test_cases::change_storage_constant_by_governance_works::< + $runtime, + $storage_constant, + $storage_constant_type, + >( + $collator_session_key, + $runtime_para_id, + $runtime_call_encode, + $storage_constant_key_value, + $new_storage_constant_value, + ) + } + } +); + /// Test-case makes sure that `Runtime` can handle xcm `ExportMessage`: /// Checks if received XCM messages is correctly added to the message outbound queue for delivery. /// For SystemParachains we expect unpaid execution. diff --git a/parachains/runtimes/testing/penpal/src/xcm_config.rs b/parachains/runtimes/testing/penpal/src/xcm_config.rs index 849b0a690a9..53c464c70d5 100644 --- a/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -120,7 +120,7 @@ pub type XcmOriginToTransactDispatchOrigin = ( // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for // foreign chains who want to have a local sovereign account on this chain which they control. SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when // recognized. RelayChainAsNative, // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index efd60119105..bd3e2ede318 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -345,7 +345,7 @@ pub type XcmOriginToTransactDispatchOrigin = ( // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for // foreign chains who want to have a local sovereign account on this chain which they control. SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when // recognised. RelayChainAsNative, // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when diff --git a/scripts/bridges_rococo_wococo.sh b/scripts/bridges_rococo_wococo.sh index fa79ab884ab..3d18ba49c0f 100755 --- a/scripts/bridges_rococo_wococo.sh +++ b/scripts/bridges_rococo_wococo.sh @@ -377,10 +377,12 @@ function transfer_asset_via_bridge() { local url=$1 local seed=$2 local target_account=$3 + local target_global_consensus=$4 echo " calling transfer_asset_via_bridge:" echo " url: ${url}" echo " seed: ${seed}" echo " target_account: ${target_account}" + echo " target_global_consensus: ${target_global_consensus}" echo " params:" local assets=$(jq --null-input \ @@ -408,6 +410,7 @@ function transfer_asset_via_bridge() { local hex_encoded_data=$(cat $tmp_output_file) local destination=$(jq --null-input \ + --arg target_global_consensus "$target_global_consensus" \ --argjson hex_encoded_data "$hex_encoded_data" \ ' { @@ -416,7 +419,7 @@ function transfer_asset_via_bridge() { "interior": { "X3": [ { - "GlobalConsensus": "Wococo" + "GlobalConsensus": $target_global_consensus }, { "Parachain": 1000 @@ -454,10 +457,12 @@ function ping_via_bridge() { local url=$1 local seed=$2 local target_account=$3 + local target_global_consensus=$4 echo " calling ping_via_bridge:" echo " url: ${url}" echo " seed: ${seed}" echo " target_account: ${target_account}" + echo " target_global_consensus: ${target_global_consensus}" echo " params:" local tmp_output_file=$(mktemp) @@ -465,6 +470,7 @@ function ping_via_bridge() { local hex_encoded_data=$(cat $tmp_output_file) local destination=$(jq --null-input \ + --arg target_global_consensus "$target_global_consensus" \ --argjson hex_encoded_data "$hex_encoded_data" \ ' { @@ -473,7 +479,7 @@ function ping_via_bridge() { "interior": { "X3": [ { - "GlobalConsensus": "Wococo" + "GlobalConsensus": $target_global_consensus }, { "Parachain": 1000 @@ -591,12 +597,19 @@ case "$1" in 1014 \ "Rococo" \ 1000 - # drip SovereignAccount for `MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1000)) }` => 5DHZvp523gmJWxg9UcLVbofyu5nZkPvATeP1ciYncpFpXtiG - # drip SovereignAccount for `MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1015)) }` => 5FS75NFUdEYhWHuV3y3ncjSG4PFdHfC5X7V6SEzc3rnCciwb + # drip SovereignAccount for `MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1000)) }` => 5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ + # + # use sp_core::crypto::Ss58Codec; + # println!("{}", + # frame_support::sp_runtime::AccountId32::new( + # GlobalConsensusParachainConvertsFor::::convert_ref( + # MultiLocation { parents: 2, interior: X2(GlobalConsensus(Kusama), Parachain(1000)) }).unwrap() + # ).to_ss58check_with_version(42_u16.into()) + # ); transfer_balance \ "ws://127.0.0.1:9010" \ "//Alice" \ - "5DHZvp523gmJWxg9UcLVbofyu5nZkPvATeP1ciYncpFpXtiG" \ + "5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ" \ $((1000000000 + 50000000000 * 20)) # ExistentialDeposit + maxTargetLocationFee * 20 # create foreign assets for native Statemine token (yes, Kusama, because we are using Statemine runtime on rococo) force_create_foreign_asset \ @@ -605,7 +618,7 @@ case "$1" in 1000 \ "ws://127.0.0.1:9010" \ "Kusama" \ - "5DHZvp523gmJWxg9UcLVbofyu5nZkPvATeP1ciYncpFpXtiG" + "5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ" ;; remove-assets-transfer-from-statemine-local) ensure_polkadot_js_api @@ -621,40 +634,47 @@ case "$1" in transfer_asset_via_bridge \ "ws://127.0.0.1:9910" \ "$STATEMINE_ACCOUNT_SEED_FOR_LOCAL" \ - "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" + "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" \ + "Wococo" ;; transfer-asset-from-statemine-rococo) ensure_polkadot_js_api transfer_asset_via_bridge \ "wss://ws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io" \ "$ROCKMINE2_ACCOUNT_SEED_FOR_ROCOCO" \ - "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" + "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" \ + "Wococo" ;; ping-via-bridge-from-statemine-local) ensure_polkadot_js_api ping_via_bridge \ "ws://127.0.0.1:9910" \ "$STATEMINE_ACCOUNT_SEED_FOR_LOCAL" \ - "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" + "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" \ + "Wococo" ;; ping-via-bridge-from-statemine-rococo) ensure_polkadot_js_api ping_via_bridge \ "wss://ws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io" \ "${ROCKMINE2_ACCOUNT_SEED_FOR_ROCOCO}" \ - "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" + "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" \ + "Wococo" ;; drip) transfer_balance \ "ws://127.0.0.1:9010" \ "//Alice" \ - "5DHZvp523gmJWxg9UcLVbofyu5nZkPvATeP1ciYncpFpXtiG" \ + "5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ" \ $((1000000000 + 50000000000 * 20)) ;; stop) pkill -f polkadot pkill -f parachain ;; + import) + # to avoid trigger anything here + ;; *) echo "A command is require. Supported commands for: Local (zombienet) run: diff --git a/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml b/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml index e5a8459a76a..7badbe51d63 100644 --- a/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml +++ b/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml @@ -73,7 +73,7 @@ cumulus_based = true ws_port = 9910 command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ROCKMINE}}" args = [ - "-lparachain=debug,xcm=trace", + "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace", ] extra_args = [ "--no-mdns", "--bootnodes {{'rockmine-collator2'|zombie('multiAddress')}}", @@ -84,7 +84,7 @@ cumulus_based = true name = "rockmine-collator2" command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ROCKMINE}}" args = [ - "-lparachain=debug,xcm=trace", + "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace", ] extra_args = [ "--no-mdns", "--bootnodes {{'rockmine-collator1'|zombie('multiAddress')}}", diff --git a/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml b/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml index 55a95eb85f7..53247b6fdc8 100644 --- a/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml +++ b/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml @@ -73,7 +73,7 @@ cumulus_based = true ws_port = 9010 command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_WOCKMINT}}" args = [ - "-lparachain=debug,xcm=trace", + "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace", ] extra_args = [ "--no-mdns", "--bootnodes {{'wockmint-collator2'|zombie('multiAddress')}}", @@ -84,7 +84,7 @@ cumulus_based = true name = "wockmint-collator2" command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_WOCKMINT}}" args = [ - "-lparachain=debug,xcm=trace", + "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace", ] extra_args = [ "--no-mdns", "--bootnodes {{'wockmint-collator1'|zombie('multiAddress')}}", From fcf1b67964acc224d47c04b360b229b86a85ef8d Mon Sep 17 00:00:00 2001 From: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Wed, 17 May 2023 11:49:18 +0200 Subject: [PATCH 194/339] Glutton Parachain (#2294) * Glutton Parachain * implement collator stuff * add glutton * implement missing api calls * small changes * use shell-runtime as starting point * update docs * Glutton chain configurations * successfully build * add local chain config * chain spec * update Cargo.lock * Update parachains/runtimes/glutton/glutton-kusama/src/lib.rs Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update parachains/runtimes/glutton/glutton-kusama/src/lib.rs Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update parachains/runtimes/glutton/glutton-kusama/src/lib.rs Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update parachains/runtimes/glutton/glutton-kusama/src/lib.rs Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * explicit indices * update para_id * irrelevant docs * update glutton.json * para_id as cli argument * expect * merge * update * fixes * xcm-builder/runtime-benchmarks added * benchmarks enabled * add glutton to bench scripts + nitpick * remove local bootnode * ".git/.scripts/commands/fmt/fmt.sh" * make clippy happy * fix clippy * fix chain_spec * fix chain_spec 2 * fix chain_spec 3 * ".git/.scripts/commands/bench/bench.sh" pallet glutton-kusama-dev-1300 glutton pallet_glutton * Update polkadot-parachain/src/chain_spec/glutton.rs Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update parachains/runtimes/glutton/glutton-kusama/src/lib.rs Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: NachoPal Co-authored-by: command-bot <> --- Cargo.lock | 53 +++ Cargo.toml | 1 + .../glutton/kusama/glutton-kusama-1300.json | 35 ++ .../glutton/glutton-kusama/Cargo.toml | 85 ++++ .../runtimes/glutton/glutton-kusama/build.rs | 9 + .../glutton/glutton-kusama/src/lib.rs | 423 ++++++++++++++++++ .../glutton/glutton-kusama/src/weights/mod.rs | 1 + .../src/weights/pallet_glutton.rs | 175 ++++++++ .../glutton/glutton-kusama/src/xcm_config.rs | 91 ++++ polkadot-parachain/Cargo.toml | 1 + polkadot-parachain/src/chain_spec/glutton.rs | 90 ++++ polkadot-parachain/src/chain_spec/mod.rs | 1 + polkadot-parachain/src/command.rs | 64 ++- polkadot-parachain/src/service.rs | 15 + scripts/benchmarks-ci.sh | 4 + scripts/benchmarks.sh | 2 + 16 files changed, 1048 insertions(+), 2 deletions(-) create mode 100644 parachains/chain-specs/glutton/kusama/glutton-kusama-1300.json create mode 100644 parachains/runtimes/glutton/glutton-kusama/Cargo.toml create mode 100644 parachains/runtimes/glutton/glutton-kusama/build.rs create mode 100644 parachains/runtimes/glutton/glutton-kusama/src/lib.rs create mode 100644 parachains/runtimes/glutton/glutton-kusama/src/weights/mod.rs create mode 100644 parachains/runtimes/glutton/glutton-kusama/src/weights/pallet_glutton.rs create mode 100644 parachains/runtimes/glutton/glutton-kusama/src/xcm_config.rs create mode 100644 polkadot-parachain/src/chain_spec/glutton.rs diff --git a/Cargo.lock b/Cargo.lock index 85caa4f97f2..bef4bd1a02d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4354,6 +4354,40 @@ dependencies = [ "regex", ] +[[package]] +name = "glutton-runtime" +version = "1.0.0" +dependencies = [ + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcm", + "cumulus-primitives-core", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-try-runtime", + "pallet-glutton", + "parachain-info", + "parachains-common", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-block-builder", + "sp-core", + "sp-inherents", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", +] + [[package]] name = "group" version = "0.12.1" @@ -7128,6 +7162,24 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-glutton" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#a14236059c2d3da052fb08295082341aa7b87240" +dependencies = [ + "blake2", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-grandpa" version = "4.0.0-dev" @@ -9197,6 +9249,7 @@ dependencies = [ "frame-benchmarking", "frame-benchmarking-cli", "futures", + "glutton-runtime", "hex-literal 0.4.1", "jsonrpsee", "log", diff --git a/Cargo.toml b/Cargo.toml index 2e96126cfa6..42acec123a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,6 +50,7 @@ members = [ "parachains/runtimes/bridge-hubs/bridge-hub-polkadot", "parachains/runtimes/collectives/collectives-polkadot", "parachains/runtimes/contracts/contracts-rococo", + "parachains/runtimes/glutton/glutton-kusama", "parachains/runtimes/testing/penpal", "test/client", "test/relay-sproof-builder", diff --git a/parachains/chain-specs/glutton/kusama/glutton-kusama-1300.json b/parachains/chain-specs/glutton/kusama/glutton-kusama-1300.json new file mode 100644 index 00000000000..c1cb0880657 --- /dev/null +++ b/parachains/chain-specs/glutton/kusama/glutton-kusama-1300.json @@ -0,0 +1,35 @@ +{ + "name": "Glutton 1300", + "id": "glutton_kusama_1300", + "chainType": "Live", + "bootNodes": [], + "telemetryEndpoints": null, + "protocolId": "glutton_kusama_1300", + "properties": { + "ss58Format": 2 + }, + "relay_chain": "kusama", + "para_id": 1300, + "codeSubstitutes": {}, + "genesis": { + "raw": { + "top": { + "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0x14050000", + "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x041c676c7574746f6e", + "0x3a63": "0x", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058b4cc04deb74577114e107877930e70565839d8f5c5fa791f7f0f5c593af01ed6cb7ac383ca0b0d8c5e36d281f7f762a3b9c9ec446be48a97b7d91b85fd0c036a24e77aab729d618f216e1c6d13b2b7245b6e29654a29059c127a108f103fedce21f4c8277e98923a2473bf33b2c9b973494a00509377ca01a9dca4c8a77676e7aa2e19f3718b1121f44edb57ac3320954f7ca926350099fbeb2549f9c4179f9e7328bf9a927d76f6d69c2be603b456bc3e6bade93f0d73d7d3340585cc2b9fd8f97ae4d3fe3a633e7bbd6241dcec19591372bb48907a33c598d6e1d326c4b7b7107c72def1bba70873c359347df34ed638eaf8f4c3eed8b4be4ec327f676e51d6d9c8633caa68b4debce954deb5b5cbfd69577b44753528479f5c5d8150bc2ee7c08bb9b8e35c55990ca525d6fb61d7ad68522d3540ad0f81d7a75c93baafd643fedfadb0efdf69a4a0199df5f5fac8885e2756e3be45c3526eed59d4684f4eaada902d99cd70c11bd9b40a457d7335ee7372df35b3bebab26dda5daa2205bdf572e80fa62400e947dcf129bd677889b20158767fe04bae5393afcc9c89d07c0dd9fe8e0ed4ac5fa931c3ee33fe898a81a3eb3c39fb85ffe249b281dde337ec39f90bc9ff044714fd47bce13c56eb5a37aa2dea4621df53c07cffcc98d89c281c3754cd40d9fd11cc78de370940ec77cc64bfe444e9474e7fcc23151d3ad1dbc873bcb7138ca398e898ad179a2a4b3a370f8e54f2adf315134345e63a2da45132572ed7294e6d744753beaf21ab7c1ecd844c5e872a27aa278b8746e674761ce13156d382a3a8ef3e028761e268a86c66f4cd40db72ccf61a26872f01bd60de7c15196f3305139883a0747896e2615261b1365c36fdcf01a1b376e4cdf414acf8187949714693770e8c89a2d27923afa5d37e28c1631f7706433ee6916374bebc615311d38743c6d268b5224ea8bad1b19c63a44188ecc72cfc9192ddee8780347bf1e3df0e566b4cb7dc878903d7ad8c071b50807c751ce7170443a744c37f17313d6430f8e92de430f9a65cdf8741c4c3a4e34991ca5b9a987e9cddc609fde038ecc7b701f1ca5c37dc0c171d4e5383ce0b80f8e12c51e3d2ecda79be20d37b91e3d7af4e028cb7b98a81e3db2761f78e08187a330e721f2e93839388f1d74f8e0388ec2e1382613009c878932f90e3c388ea3a4efe0289e376ec386c3e1d37bf0e0e13be49083d7388f1d9c87a332e7f1bc87fb70d48cfb581d1bf7c15133eec3def80e3eb80f47e9f01d1cf51cc7646333dd06c76d1ca5b9cd3aea721be7a1a6c677c861a2784c140fdfc16b72f01a47615eb38e8ace839b1cc56e5a00f47094e53d260a003d7c4e14003c871cdce4a8f6e92891fb98a81e7af09b89aa99a81ab761c36d266ac70eaf99281bb761c36b1c75c36b266a478def70d48d639367874985ce44d5a8e13c266ac744ed701e8e613e1d3527aac60e3e1d55c3afe984fbe028399f509c751f26aa8749c5e25ccec34449e9341345e3170f7e394a348fb8264a5e6e3351d23191638eb2716d1a71630ea138eba689ea71c301305173a2a6f3a0f9cd44eda083cf8992411a5800a5479b5478cf13cd791a471da54d948ea93eb571d47598de38ea38660e3c74b8cd44d5e4f01d13a56352e13d3a1ca563a26666569ab171d4734c6d9c1fe6667af56c961cd57309c559c73151372615dbf364c669262a731b930a9d9e27ed35266a66e4d944f5a4c27b9eb4678eca26ca9a3aa4596a1cf5d1d4c609c0dc7ebc3acf1fd8445d930a53cf13e872a244930aef79c26e39ca9aa8385d71d651d5cc1a471d4e6d9c9cb9e9bcfa9b26c55977d388e2acab0b75131cce29232bd7de79a26270d2062d655cc0061640e979e2057429628f17cfd5bd779e2814a6b0e2096e3003164fa0d063b9baa9779e08c5200a2bac808c2ab4a18b163dd1d5757ae7890e63ac21086258410a378ca147bafa8fde79a2571003041bac200663c868438fc8d563ef08810184316ce982031d38018c1ef5ac778418421865e8411a5210b3831ef552ef08dd800b38707183316990e10c3dea3cbda33dea526aaa38ed222d2a4ebbdc4b8a2a5fccc7b91469daa35811d93b6969aa38eb518b8ab38e730400bca6a498a2f39a7a12e6a56620d3d4932e9ff39a72c2e5e5bb2c4d1b873d6ab1717856fe301f764bd39eaa678b5f79d4b4c7614564cfde1891ec9d3346247bf6c588688a88a6fe554d9cd07287e1040b3b33333be9e299995948ea053276e7537bbb129fda6fa209c8ac7ff76fd76ff1dbdb1d9f6e1a25f566d34922d35414555e53510c3d015e53506879c57c8ac8b68c87b38c4fcfdbe5d3f45bdb971a806c1ff6f534e88bf93474c588107a28171bf21cceedf973c9d890ec9f2be6d8e45cbaabb57dd917d49e2fa66cda687e5d4ac5e0dc841e7a6b5b7cdead6deea1f3b06c6d5bc0b74bc5aab93df195b7b669eadb9fb6299b9e70620923477cfba66cda8cf8f6edb9b2691be2db79fa69fa9506d465ca9419f3cf5bdb8478e772afd69c3f4d5fb122aa871a50f56f6efb3d81b64c9932657e13fa76a74536ed05d739917a812e3090690a8a30dec4a7ed723e6da66767f7913114593cdf3cff66b3002cba688e3e0f5f7c5267d7d9224805c005324d0d6df9589af2ea199f343594e5d56d685e5d6f5475b27575b5a4543ee9be24393eb1abcb957ba9ce2c00064ed8a4dfcedbd919f3e1a93bb30018446193fe7a6b92175b57cc4d27dfa57cd2dfe2abcbbe58db676c7db1c8a676c586d05fe761cc879d87b70b529fd997790aed0e91ebab15916deed9e37a8cda3bca385bf6eb5bf68e4fecbb49f4f6723b0f6f7777af772fb3c7e7594384dd39ef90759e1b7bf3ae19526f36d71f32a901c8d4db15f3515f2cc81343434350bc4e65d3169f5df2e5f8c4a75536b1f3706b8e4dec3999f3129ff4333e299b36f7eaec347c6a672ff1697dda694c74f82542f1d7e3efac21b2ee7cddcda0fd9e8af9ecdcf6d76f78fef8eb0e42bddb04a9af375bf6ec32f269db4102235bdfaee71eb2f57675c58a58ffe9a96c52e761b95a3ff6e5995c23b9d76aee2f310f543d931a1893ebd7d9470a44c90e3d50029e09fc7576920251b2430f94805f67576c881b1afa751e967ca90259dfda1d9bd4239fb6fd7675d95a64933a4ed6aeae981065937acfc826751e967cadc67f2910259b7a26f0d7d93105a264871e2801bfcebe5811d9d0af5f7cd267576cc80efd3a0ff3300ff3b06aca2675bde1f993bdee20c4cb5a90ca520590adabab45ba820253ca20227541ca62f486511a233224138cd0189161c486511b468085017bc3c808a3314648180d615e303123178c88306ac18805a31f8cae18bd6034054b0336068c0c181a232c46658ca2c0cc8091198981b501830336064303b606ec0c58194657462bc0d8806101cb0276054c0b98184642c0ba807dc1b6300a02c6054c0d5812b032b01e6037c072807181e100c30293013683eb0d97152e2e970eae2fae1d5c5a5c33b8647065715d71c1e09a726171bd406a71e5e0e2424eb9ac5c35b88070f940eee0a281ec4232412e4166914a90549053905ca414e415a4156415e4179904890489459621c99063c89414431e4166416a41769167c827c8284828c82d120d390629061906194682417e417a4182915d905c905b9042903e90409041903f905ec81a481ac82d64156903c902294524461407911b4466107d116d4104051119a21c88aa88b810e140a40569075818fed258c0dcf0a6b8286e8a0a0c9617aa305618eb0b1618444570317030104561dde0e010cb6832dc09301eb0174428b88870b9e16a4334432c43fcb26f885ca8c210b75031210ee1c2423be159a9c870576831aa94c44135848a0695161595aa06720556175a0ad6932826ae21aac17212dd6045b1aab04e60496141b1a8b0a68863229998066b288211e310cf10cb5826886db0a0886c884788614423c422c434e21b221a221cac28229448459ca2b24105065fe1cab8383412ae2dba0c79450ee10d554bb0545041a9a4542bb07e6001c19a824585778427c68eb1a915638fb046d830168c2dc21261afec1056081b84fd6281b03f581fac95edc1f260bdd82e7607581c46618cac5448783eb0a45453888050b1c0eaf2ca78515465301732060f8aaa09a228dc05d11a7a0c2806d402d20052813380328037785e7860de185e17ac322a15585b9e19ef0ba234b02a980f980dec062e5361a994705d715e5605cf089b825784e8a53ac2d583aa080e8bd70287c6084b8ba1c3bc2bde0b3a25a95459aa31445cdc189c142f0b6d8673e2c8200aa34a02c7a17a7265c11d41840679834a0aae12b1e0aa7050e2159e162a193c2cf414aa183c292e8aea8ce6e24c10b5e09ef4136216aa2c3a0a0d85c782b702074535858a0a8e8a1e4387c12a824584ae4297a1cdd06468318d46a3a1cf60d9c0dac2aa8175038b0656158b8bde22a2d256188d199561348691193acb7583eb0722365c36682c570cf80cdc061ec369301916c36f60303018de027301f382b5c05f602f1c460406cb80a9f00cb02cb806bc05db80b3e01cb00e4448e017b0145e812809a234300b78ca626128222bec19768b45c33e61b588aef08015b353582e5b8595c2526191b05a2c0d96ca9a2152030436092cc596b150e0277b039114444a5816ec0a9c6822c90790286104115b8503841ac001242c50010a10d9a18d328490203f7c16a0801e1e041c40882076d68a95e283c9478f231c17725f37f2c0e23eb204090e14710289234b142922b7954872a448119168686495d1263a90848922491469a2034986246982892024902069420141491c4182a40905f860c52108092547921cf18066c1419788e0c84f9125458e28d14412479428b24404478824698289254b8e4440078b8c868009275ec9911f254d54a008cd7a831e09424209269020c1a4c811101c01c10324a0c4110f78000909f860b94197fc2471648924daa04b82921c51726489244cb8352609131da8b1d8a04930b12409134a829e38524404489c700289224a8e2881840910f4fc24d104921e1b6b0dba6487a50645a2888d95867ea008124148288144d09106cc5869180113489060228889244cdcb0d0a03f4934818403458e04812089234f1ca9619d419534a1804bf708120e20119404041d281294c411254c28918489224574d8703aa8c460c102ccab90d4d4d0d0af50eb80ae8aabb24e6ce59899d99dd9c6c686d700ef39e8dc73af46df8ff7b477de7bcfc1e75c8debd7efb5be6e7efdfaa9ebd6f79e6a3fe854b1eed6d6a7aea1830e5ebb8f77abdd55ecc17615d4f7b8f45e5555ae1b3af8de6ba7ed5c43e82a587543e89c3e55d8ddaed2083b4ae75eacda397d2787396cd53d85dd5605bb92905455d805bbb55b7587bea7daeeb9ea297cd57b55b773b000f069bb86fada41e75c376407b51b56da4ffb75eb7b5aa32dd5a936b748b5ab918310baaa1a296c86ce39ed6e20dae9aec25dad5aab0a83170e08ab868ebb2b0749cdb01dac60d512eb570342e71c7c965addce7204d8b14355d5693f75ddaeabaaaa9eaabe513bd70eb694aa55555595ab20bc2e785d10b694ce5515ac2ae82ae760f55acaebea1e40255b87aaa376bfd7adadabdad08d46dd1a5f6b74d0c1aaaa64f554555dd5ad50552be9b086edf4bdeeee5d55c7124275d0bdd7aaaebb5f0e553bb7dbadadcdd055901942a8356ad4a84122cdcc3ce7ba7a90a132546ea7caae2184f0a9b6aa76ab42f8de7baaaf9d005cb74e77bb6e556da7aaad0d551576abaa73ddb09fea7bacdadc50f5697737dc7dce2de4e7e073ece083af92ad43d4eec6f15a9d6a773ba8ef3dd7b08217564149aa628cce55ddcf4109b5aa2a7d0a196a43e8badb39f87e784f4755b9f7aa5d7e01c8f1a143870f5c7aeff17b39f480e3b804b97aef72ae5df77bef3de7de9be1f7f4bde82094d041d84edfe86ad7ddb1213fd74f9b7405694ad750168192263e70e403500912414b7ae898d9f19304121c4082a4891e4c3b72e49043476613839240624912249404150962e2031f68c244336b921c71c209246c7a287144c91125943451e45480011c614249500f0350b28348077064c992234a9cf8401349145172844913491c51520489254a2471a488007e4e05188013491c59b2c3a3034c2839c2a48801045080020c408923459a087242044a92d8613fa02a80234a3a50444913414824d104122448d80071e2f144132108cae154800178f6630002283280233f4820e140110f2461628925482c91430570e4034c0425018192f9a3034120e07164892241499850e24491249630f1011b4b057084c91124459e40e2033a004005e081269014f14012263ce0812690e8b0e1379e38a24412268a246102892592e840079a9804408284891f1d1e96f4b8d1010435d1c40e4a207144894904477e8a043d7124890f9aa0231ee83155004b829630f1c4911e341dc0134c74e088122774982439d2365400459234c1c412254798145182c41124491439e20124943411b4a488124898582289224148408044078e285124e88923384c921ce91e171158689b3411ead74488dd13724654a84913212121d89811a1155a529326ce880a0935e9e636a24d5648a8499326ce88d03669c2469a6c93264dda880a3569228d08add00a3511ea264d9a6813a16d6219d1266ba4c93669c246544864a4c90aad11a16db2d1883669e2842a232a048d345935a22af4841c1b5115126223422b2424d4468456688da8d01a01d25a5655f7034b90d01f45f0cfa52ef36823c1bf21ef9f536c88fc6aba2bf60738876af00e1af4f67677f77af732b3bbce021221be5d08243adff1fb87dcd0c114768044c70b9fda37f7eb826ccb9e99dd07f1fbe3a121a705b1fb75b7586087b9767de78bb52bc641fc4366a060b1414f2442fc0c142c3570afd85659ac5df6b58304846c5dbfbd5789f5516c9fef78deb3b58a9d1bf3e1dd35e820b5bbbbbbab5d9ac33ab0a2831c7c0732d6c10d1ebea674a0c56f194c5574d1ec34a559425df3dfae17480764ef3565832c74a402704efbc97e9cf7f8ed09bd26ef7cb31aa05df837b988cec3ae5af4a739edb50fc4f4c439a44e90e27cb3be9da79dd6e3e52a76811edf64851e7314541b8aefb9edd02b4684f4ce5b63e2deb5abb6aa6a8efa6621d501970f12689f5fd0e52f7fceda927d76c686d0b7e6cfbac54a56739e07c507d2322f9db120978b447282a0f441a5dfa99af3d8d2d404ceaf2c7fb9e552be8b456e3146c40db1fc92be9a744bbbbc3122d177379eab39eb964b6de35f8b497ca08ec350d00ac16532ac3af7e1a536c99c437f8194875e998c38228c9aee1ae87e6332b2c4155a74c8018df77cf069836e52fea7d17b88eb08237c7a9a85083eed3fd7f9c1274db960cc3fa7e3b2fc73e553cd6f0ae65f74e22b67f520f87cc3a7e74a78312245bef258396b35557de89416144157dfb672d6e2ac34a86d420f7fb6cad52136a4aabc9a5b099e5d1fce6d9f596b97cbedec44164e22eb5ce253e5cf6da40bac78a8bd85e2b7e89a3ac1984cd2f009fa73870989be95a0ccaf3336641dce8da1f8e8527928561a4f43289e5b8c7585dc8478dd2139e6ea347c12b9aadbf80d9fa2ab9bf8045de8451ae6511392523a0f5f5a4d74cb045fbc73ec09748945ea9a20d394155cdeb9742ea5d05e6e59d2e54a07ea974e92fe5343a4f2e7aa5145a41a55d2a34b4be4fa966806896eb9e50227ef5ce469bcfb796ecd6dbff2cba3b66f351644241289e6cff3cdf912a1229608fde53fd05d11ceabb941bfa6e53cfd5694ef52ec9a1bea2f87dae61e3a496b96425500dbe384e452a80a00faf6f0f4a5c97741ad9da4694fd48858f30773e7982be643ea41867943e9706e98cb5923bdf247c439366be424121d7a94501379f513634524567188736b6ed0a54ba96d97d758ae2f1d6a35d60cf25c42d7b702cc3b972ef9fa11b99cdbfe06fd72d99748bb7cdbbffc059172aae66cd2dbada9399be5ed5cce4de4d0e53edcdf87bb0121c4ab6bc76b8360285e7da440f4d5757e345921115f2a6801996e4117528c71c2822e1bc525d757d337a34b325d97aaaaaa23f7d835620299d4785555cdd8b4914dec856427595b974fab79aecccf176a35cff72b7d33ce7b7c7be5aa3d67850a1556eb0a77ddcbafc65e69d0791a6aefe5d3d6e596205b87a2afe7aef72ed6d6df7a633ea86c5d3e2c887a819569b4f3693acf3a3336f5f81682db66485d2a32e77d828c7bf09ac2e28c672d5e5353aebce935f5823043824c20e637a130e06f205841125e9db427c89a8cd7941635f8c5f29a924116dec76b4a06522c264464c6970732f26266f0404d46bf0571210b252d7e0baaa285e4c26f415570e1fdb6a40a41f0a1085b7e5b7265cb6b1c1a7ad532affeeaec0209b4ef5c3aedb9f9bef877c66f03da796ea92db2bc73e7eb5c43e49df1cedf19bf2d117ae74fd307d23265ca6c42cffeb2fcbad40d649ab2c116afbdf6922fd674f8a7bd337e3121cee4c6ce2026e2cfde9a64c6846c9907da326fd60c596f17b2de33486aca06583e88ffcd8d9dc97ebbd06bdf9af61c245f5de82d9301f34b9adfbed0550c07b5e52699a656c0e5a590caa35b22b7fcf9e5ec72a4d58c5c7f13fa915fda06e104223d9320fe9133a6d58c7c9fe4d25dac6d96b34bd66a86b8a1a197eebe5f3a6bfc8c091939a691fcd2460eb5be30cdbd74d7a5a91a1ed3fae5bb2e4ddff098c62f1dafbeca4192b35f9ac2e1317dcb6e544344cb2853e6d9fb37a13086869e2f4dbd3cd458834ed230e7694c7bfac36e7913212486e58a0959b72c8b5d83acb32f3684dd7239d2a4cbbd469a96e1255f234dd1f0b2af91a669bc7417d4a48fb425d533e1f780927de90f8a972e2156824cba62a84c3ae9525fef3ade853b8ca48f349d879a62198ae245ce1273d59c88f925f24b74895c6a4a2e0c837e8924144d551fa2199d872d75d6f4f5cd8c4d6ecec7b6fa422ec9dc6b6a05599664ef35b5022daa393b601886396b1ec0300cc35c6f30334829a5b3e60129a594ae37320c966559d12bb72ccbf2a8402cd71b6bfe64db05ad0a1dbc2ec65a5ed9c49a53ad57ae18f36a51732a67cd031ec89c5b0ac487bd7217150816a416c93697499210fd1b09bb61774fed869543edd29ccac50e649a5ac1957f6eaa9cf37005bdaa1c6a42a0e313f48a632085e8935caaa6fc9a4a41125e3525943447d755db5f4c734897e6909cb50e6423c7fc72e91dc8446e79f4ca3b90417f5b7c9293fc5220ec24c714883ec959234d41b6cbd64843a09076e83ccc98e5ccd1dbf2d81d2d09a3b7c6643f4687abdca36eefe9cfc371fe44af5cb106446b6e426fad858add1d9da78150cfeb9181fa39b2f33050c6be92a4ee6adad7db59ab696f6d089e57f5b1555e796bfa95575149d0e5c447576c88918f1e5548a56dd17fda2b97519b4a8054ccd0d007d5789177075d2ff2e88a15e1c45bcec3515302948067cd690f821ff9db2d4d49f420f822578c4891b75c87b73c6a4009f8d51cabada9eaa31d0bf2bc7d319f18b5f56adb57363d0d13b2dfad656c52178a5b89219567fab97ced7231f61e59f1dc849e1755a9aa7aa5bf1a10eab702ea576c9d872569a76a9b8b71556b9e66a0aa4c9932643e16b11a507f9c40add02b6dab9c49f648dc1014bfb1035564a028f34ce266fd386f8fae73cb5e9db58b9d4905a48449f54b84d4795a35e81cc42f72e8a209b464de595a10bff359336453dfce984f3bd4745b87de1a1386bc419f1b10ea9d6fedea52e8abade2dc501f9db565668ebe4b84803a883a3b04ea21eeddfc695f578c8823b2def3479dd5dac88224e02095c818939286914c0905b2fea96702b1ce867e77e8750d725d92f46df804fd7275d5794b45ae40f62fcd864f3aaf0e87484d932e9b8757d35f4ca422b748fb52311f7d33199b446eb9fa623e3b79dad26cd8a42ed2a4c6647fdbb77c3526fb96e564f3768f7602f5d704e95fdfe99aa3be2f356bfe4497ee30a0f8d0e5542729cf5ceedcf2c59464edd65419b52dba259a9bd08bd64724e7867ae9ab595af3aa8ff58d014262bcaa8f75cb791a08f56db54803ea6f574b03cab26fe761d6f42b2de7a156d2e45e51db9eaf575acd4ea07d384b588686de87af1662215bca3b6fed27fb79dee3b737370a9bf43575823172a3f049dff91105a244e7b95017d22ff8baea84d38914393dd0a1d8e889c2279a77be8304846c43f21b854dce75bc608413e8eb3ccc44b66d9477bea917de394a3d6b1c356431042d8660e5cbd0500f74d7b3da90db410a6c10450d8cd0e3448a9c9e7528367ad49d48c13d95434140cf3ad4a020a007e58504d65146348ef3ddf2cea1a3bc9040e570a2781ac77935515e4800fa4e94378e73387534955adf748bae618a257041062be8600b51f0774efa41a63d422ed0628419cc608c2e3f48438ff6a86f3aef5c3109f8d050cf46e1538f77be5298dd0ca42a904d47887412397fce35f97e5d7837df062be7d54c02e7061d49fb40ccbf097debb9a1deb5e69ca08287938bf87c6bf24884b27898e4004e52ff7c73737be23b893a41ca3fdf46f00ece240ae6dfdc52e5083f9c41869302e66d5e535292f092afa77181526f422a53a64c163d16174338b2e003138461c8f902759932cfc5100f14dcc00a2a4a78a0d2832c43414e2898e762e88733c81862720027a92786d409527ad4b711fc73d520547fd8349582387cd03e175128981e6b0e29981e9d28f526496640832a40416668a827ce212743433dea1bca7b6e4e4877454ddd69ed8c51e08733c628d3a3ae180566b690051cc4c10465caf4a8d37c3334826ce7b4e7bb5584ef797bd4b2f7f85acc87c768ecf9bea65260c62b9b9e3b6d5ff6e51cce129bde74fb8e998b7a5420bd95be7d3b7a5bde9537f486de6e418fb0bda177b7bf129ba0a6ff7c78093ccc0e7da1d738dfe7af714d80feaa59621374dabe8b9aa30c06a740a0ab3f0502351b363d17e34b6c7aae586f518992f78ec89f9b7a47fa731d3e59366c8afefc870271cd89fe5c6a19e34417699171628e18fdb90d957f9e4381ec3f87253645ef30a0a6cfa3b74779f6f5e83595f7f3d7541368cb7ce59a4a4119afa9148cf1caa6e810c8bd354b6c8a95f634475d31a739ea3c0cb5fd262cf4b8ab48e553d52cb042eac5581037b77de7edd25d95b6ff843c77ce4f03da3241da9d5744da9d4777738bef2a5f0ce80927514031f4405b08de0087320f7d89d0c3b9a49a9b737e1a92e8240a285ebaed09c688c4b93d211513f2dc39c4824057cdd95ea5ed430d68cbfcfaf371b36648bbf376377fd8dd0442fdd6ff9697202b978bf948bffc79d43057053272e872a40511faed72e98a0589a39fe8ea97b6455f97fb9a4ac1957f9a039d87991dd3a28bb47d29156b00bb6539a6592ed2745d311f6b6e965f96b62f9d87a56a974b4d5f2a2644e7b6af7eb9e44b0a11bd6acea62ee55ef2721e564d5f3b925d2e5df45b1c12ff9a3f96b3d436cbd7795a3122ecd662405be645ced33c2cd2f42d4d3fea43ed694e736cd26b7b8ad40b64ceb7d2bf9899f8f41c88e7a5e79e0229ff74fef9f857fae7199fd8df7bcff5e6cd1f4da540aaaeea2221f5d118c1a7cdb3d0f0f84db9387f5ec5e75f41ffc1a7adc4c3a72d0ec1a72d5b824f950bc1a79aaffc083ee9576e048daf689c76b9f864f31bcd6f3fbe72c5229b9ef3b08d64ad1ada29bee24701155fb9545eed11d09679ad9c864fceabca2bd79b6afea898ce22d548a6a91554f92da66c10e5dbf5d97bcb7ea45ec0a364c117c8d64b361aa38c795ef60774c9266b9aef07a84a2764db15e6d933f69202d94f805c926552477249e6d6f546073465a5bb6b3e3a67179b764040880a295c410a263ce14b10b2f4e8cc8c33bdff30e9f0495351ba3c3b107ce26717e2d2f1ecd7ceeb351525cb3b4d7514a91ae041aa04327639ba827b4d55b1e57548209e18410b2c2083154fb2e8d14baeebcda6a3ad5ce7914d5c044ba9981038377fe851df8c63d3dc825ae4253e496fb7e153252bcb9a9be522b72ac7a68c4f95e5edb2d2f6a5c5a6cb171352fa6b6e978bbcd2f42f2da8df72b9acdba34ad3979abe48cbd8c42657cdd96c7ee706fd79bbec5da8e927603d6a41ef774a957c3df1d055db6263fa66d6d561ca33577be5914dd56cd5229bd89db6edab432da85f7db58c4dec8bf9e87cf3e2d3bad3f4bd77dcd0d0d0d0504fbb4981f48bf6bda05d6f36d71c90adc7e731ab22cbb3d3b4b65f3ac19867b7719a03b275ddf727a4b2947a09f50eb9be9a18a9d89b9bd03f5f4df6b5dabedca105d3980f941ccf59298b67b7e1d35ab1c9671c43540b0fb4657e33f25810f5f2eaf25d2e05afa7a5bae009bac886eadc5bde61a42e15884ed59c5ded4dc7262d22db4acfdeee9c874b9ec6ef9bf8a4292ac43cbb0fd76ee110155ffebda6a880f23a83c63a17243f6b13a97748a6180384deb919a7ee2e40080a288286976e5576bed4192342e87f74023579f58d7d3503030a1aaf29285a7e8befdc87d714142aef20e90b75cdb1e9614408bd13b20f7d137a38236b24309e4b87f9bc560c7a0d9c41f6a1c3b9af376efe6456c8ff59dfda7957237db1ab41a40ec9f8e45eb3f36c770f0a616fe761e5534d10f6f686dbf35f9ccbe17d2c865d2fbdec9caba2c1ccfed87173f3e6cbbcfb829a97970a108c107d7510aae6341a5996358495b7bb2beda091b18295660a7f00ddcc116cb244954b19ad58c136545555d19066944dfa8e9b57b55fb0fcc23c8722e9caee341218d9f3e897cb0af3b99ee5bbbba25d85d6d3aeac8ac2a485ee7e0ee18cb2699f7bcf3d76abaafa949d97ee7eaf9a5136b1a97276e89cb373eb5c698edb75773b0db5b97755e5aa6adfbaed7e5f5c8c115e5abef2e81e3fd6aace412e98dd7b0f9b79e8ebcf2fe71cbf63136bc752698bcf6f0a5edc7bb182ecb22b4dc93e74d8ec2aaf309f8a679c9abde7eeed2e16c40fb9f46eb1215599321a1bc7b9bb505fc5b9b9182b2d68855467aa22b830c284d1459284e83f21389301364567afdc72e79c33434b8b7c128a6c52e8bd05f1bfb764141b9219018dd7d411b2f82d7b3e4294378297d7d411b07ce93575842e7eaff7e4dc1cf4b9097d07b1b2a975a6c4260db2efd854952953a68c7b417a2e15f3b171e9a07bc13f0745dbb92ab405ef9c8b7087bbaecd41e6a64eb6c2a6e77c9d459abee872f2da775dce561408bfc494109d957556766790f5e8d1394dfa4ad14ea6e5df6b8c88295da465bde3ae34ce73b7e59fb3e2ac74c9747817ff7cabb0e9f9e550bb58511c1e6a451e3c9cad549774913f1dce5a68fcb1462e9b8fd2d3ac0f1d10f30122e22f9a3cbc722935a998c857732ed284ac3b9fd1218db65dcf234ec7261ecec3d2d2b57aa49ac3c35d22bec256f80b2b649743df740c95c5784cc833199bb6f8a7c3754c2a5b40e91df7448c3a46c7e898a863361d8de44bf275b826e89b4bbf7cb7c617f3b1f1233608e8cf2fa0409c3fc7809ea4bf1c7c8b3b3af89601b1e1aa3b95e2acdb70a9b5aafeb01e35d59c4d875fd721c7afe740da4b238171b1e9b9d4e215997e741194f15a4c48f4dd44564457ac7cc1cccccc5bf8e498b3fcd3b23197e72e6f84116c92cccc3fca261e5f5871d30a3622553954235ed957d4229b248f2522ba733972ce39286cca2e27e51f94c679be51c870780e2f392c5b9c15f7059faef0a9e4cf5dca61715b72f876fde6acfc23f9e6b2fc735a74f0cd71f9079d732e73ceb9c684f0cbb921b99c0391de4d1dbeb195e86efeb81927116ce2317fb880e23d3978d03e1739f84eec8b6c7354fef9e51c069f5c2afa73b6c2c3dd16bc93833f775474d0dc50e33c971874ec8b6cd32c5084fc18c1a6e741fb44b0e9399c3f2e0a94de612a8df31c947f2e47cba72ff88a106c7adc6ef58d6a88f04377bf95e0618b61d3f31cb44e83715e95bfa2c65838c561b0e9b195c6793ce4dca16dfb3b1cce264346b65ee3371c87b395ded99ee77c854f35fe9cc3d038e35bf634996fa5a771551a57cc0787f3b08df684b6436c7a10632bbd7344e33c8f51bbd44c149b9ee7f0926f3a860845907cbd312224672b7c1af973fe82af2810fde70f2342027273c35cb443d3d7a171918397b41c58fe390eed8610ff9c46db18cb3fbfb4adf41b5bf9e7363425d511afc6dca2c867e69669d6e59f0fd13b394c651ce75b248dae29e716a3686e5906e7562a6d6ecdcdf45bf64fe7d7e3dc74def9a4ef4e8c0e3659917ab3b198872e6b646c7a338eb973a6a240daa14bfe5e89292153e7e16c6a67beda5ea9e919a43df36c76e5adb92b7caaba805efac2c378087d632c0f5df5abcab199ac77741a077a8c59cb4a73a2776ef825757cbbc86f68ab38ed3433df6e4353c5d9acef761e0e436fd888d1c6dc744a9672d12d5fb94844846ca5f4f4c1a6ca979052ae94cc6555891e96910be3c0a446a3cdb2c964df5d2b854f5be50bd7abb9ed670e3d450432df5ec3658cf2aaa16d186c82aed33b9b6a1ce8dba5548210f3a9e65ee99265ae5ec39fbb8dbf301a7cdab999b275cec25bb80b9f6a38744ef12973e88c854f330e9dbff44e0e1c3e9e6f406cece5a16f1ce661efd8f02dd2e4d08c681ce835349d6a774aefe098374a259ab9536cccb9b934bef2290f5d9230228432cf7c469bf29567cf8aaf488c09e157cde9b921b9f91aa0fd1967e2be1d88f45dc38df86245b4d7984cf667e6b69eb96241b289c657feb37309364157824d18865dc93697facaf78c4c8e2e171d729587a3764fbb2b97da33ce54780b3e555b54c5bcb536b1a9670648dab64f72c62aedaa6646aea92244f96daf3c74e77bc54b1862527cda740b16299b854fdb5ac1547ac789c6810ea56f59c90a3e911cbaa63fd268d8f41cd3b6f81b5379e80bdd89863db74c5b34c53c74230e3d0396163523a057ba859f10c63565c8bd4afe1afbc42f7d017c222203d2a5945b8686e9a56f9ac6cbad627422447945e3357585cacbc5a26ffe56fc6e0e8c4bb16937ddf2eb123a5ea8108e6a88ec4777bf35f9389d1836adf3b05633346c82aea92b517ed379e9cf25107c92fe834fecd2797c2b7dd6d7dc62ace696651ae756facd5ee6403aeb4ee561938c9946d5587935a32f804ff0e6f7145dbaf48b4f7187600a0c345ec100f30ae4558730e5f5aac0cdd662de8b932ba45186172bdeaaac17a2ef613e956f3ea26f37bf9bcd49d5b4351a5b63e1998677fa4ae3b0371614877dd71de6d357fa8beeec97c661e70e13e796f51588f954ce27e8f2db7ea9bebb2023cb7cdb2f31fbf29c4b5bf63dbff4dc2fcf6114c802015a31bf6d18beb1222cefca398c02512296f747b7e616d954cda8a33920be5b0c2443ee14324b27be7a49c76f6babfa8d188865c94abe180d9bb8fdb9ef64e7a64e188078a93b45a6a921907991bb48c5bc255d311f962e7212623e22cea243536ff936f33fdef2cdfaf5d51d9dc6b17c7f1d02f13a7d39265adf4a22a93d73b1297ae53a7ce2b71c083e094184e5914be6e5ad4dc1bc257dcb14cb5bce26cb5733b149ce1b365970c6f2e79bbfe53a16362d57e996f46b6ef12d57d1dcb2b7a4efdc4a6f796342fc4522972ef215bd48a48954ccc3229d3bed094f739ac32e15eb5e22d314962bef148802d175c26b33c3d25a129dff698fcdcc953bdf90e8bce52f0659747de83b6415c124ce243a5fcd1fe770c69e595c96320334d8c0a5066bf00214a2f418a0024fdfdcf63be869714af6bc554d104e3737d43be75a2d3684fe9b411891857032e1776f790c2955cca3b170c836fdf2ea9a53800234914219c6888217306750811946aef8879d9b7318a7aa69730ebdb12250ee395f6c48091e46c47d9721852e8d09117ad773e3eaaa5cc62ac609d45fc1221a506d9f4056ae2e17a8cb90791e5acde11de2aab96a7a24705f694c78a712e841f1950465ffcf577f403dfb36f62ec7841fba84576343dc4397dbbc3daabc9a40fd509d1382cb62c81a97ee5daa40385eba413014a24b3788bdb04b81f415b364ebd1b14b158888331d84e8f07102e9f0a320d903ad9820fe40fbe523d63c828f74a90279afcf45de96686e8b61453c771eb504fcc6111392808f1328011f5d66ebb8dd68093f13f8b1bd7245bce9a2b5b00a654821cc43af21025fbf6b00ec4dadf5aa08e8cfa3467a38ddfe9b2d84b42f54ed12218b10aebca682a0e5b3d75410c27849d21b6baf90459e050c11a17451a994650a7d8c7c03e29d481b61ae99d8b48e692ab54b8b37cfb29c3165936565425ff962ea136be0d4cde996d71d84e43617a9dcbda33a05122f3314a4de6c4ecce5ea2e5eab854fd5cbebc296a0ee377c521214df39d09631f9d0d92f7c1279fb82e113f4f60db368f029f3f615d33b35bc81e0d38cb7ffe013a9d2dc4b8711714e9a9b3fe6331ae6236dff7aa4b9d9ccccaea2ffb012e6ed8d1171588cf2ecf1c508b1205574a731891fb7f8adb57cfbb664fa0badadb0a91dd3fa4a185aa7d8d43ea3351636b593b4cec22621d96373dbc7dc69d2d2a2771521fe23bf7c7396436b6ea35933f2382fbf6657c146333201223de624a7619a7e5b09230b972f68f4182752b2a8f2454a4b1707864ffcedb286e6c48b914be13d5e388711c1dccd6d3ef46c9f7d14842e7ee41023e2e646c3a6f6d1cc347d1196b1a97d9bc0d810fee70ef3512244dff24ce317613ea4a9fac30689b08f5c31222578e85d854f236f1fcd8d1ffac38860b3b760533b9c1b937d915fda06218b6717614448bf7e69fa221f3981566469ed03cd69b726505771babaee8d9cf3b0e6bcd2faa1d65fb0a90441debbd95634a797906d4de5dbb7b6f2ed4da5b7e053153ea91343628b07fcc5396f1c77b361b28df4ce37ffee2629109d0a5695f330ac760cd9e65f553efc26a329c10775da9005d7047e4c93390d0bc2cf53b590959c73cecb3ae725dbb277253ed1b8e8de7b475878b109b209fa6c17b2adf4d0c427e8253eb143b7713e39877ec3a7e7d023f48c4f1a098caadaad16ee1362a5980f0f57b09a3f555569346c8a952b7d8c31c6e831c618a3655991af909e6393cd3f1ac6799e7121dbfcdf0d9f9c3f578d040684bc3a5cf8c28aef214c1980d005085dfc2a6f8f82f42b19b220320c590e526f9c8299001ad916bf4b1a78eeb435c7a6e7a6ae17b22dfb97b56357a7619318b28df44c52200b862985e8af10fedd2d64ebaa43f37d314ebb62e1a68f907aa3d87e21733cecdc3907488d40a6291fa0f137af292b5fe00e121859cd10f7e6cf9b35ecafd21c9ba0435e3364585e20067a21f5c6cd44363d875c78d9dc3b2e38c834f5032afd83295b25d31410b2f87740b0e29d732b5fdeb90dab907527f520f3f1ea702a9b5ac7d42c04b9c96775a7d3392c4890293d80622473bec531af291e84f9e7ea31c62dfb25a432e9b58c28be901a77ab733a5d778ff446f76d906d6ef972cadbed46aa39ced7ad129c6725ef1ded71aec3a775e7a6e793a684d0e53720deb9deb82de3dabe746c6a75988ffa6c1cb28c5b7dbb8c1b20faabbfe318c76d1c325e779eb573dddcad185279477b369dd8b3fdc87905e29e9f5fddc4c33b9af2c0187820460eb6a04217507a7cfc7ad63b4d6c918531585c81094f08424f7c7fc5d69f0a0fb8bc0faf292faebc24e986e4faf627a5d386541f2750d5e4d96d94ca1fcbe73d757f80eeb407e59dcf9bca26e7af883dc1fee0a6ab9687a0299ba0b3afb6ece4ac19423fba10fd38493dc8fca3b70b7da56dfe55e55c09fdd382de3b769e167abb5cbefcf5359cb37851e50bf09aea42cc7791ea62ca77b1e5e5afbb292f49cea53269b483c3551d083ec1cbd585e093c82b67edf2d5a0d3d8a8d152f2b47cb52dfb66efedde1fe94d9eb5adbf3f3eb7d6ade607d498bb6283687f3ce3d8dcf8a5cfcc8ddfdadc947fcecc735fb66ffc98997bfe582e9d55f6a59890feedcdcdb1b665cf5008b593772bc13f6f6e8bdfa007f14f7b937fdad643faaddda76deed9aba96c7a9bcbe2f96ccb58110cf92ddf76e7e6a63cf420c666767278bb76edacf9f33638e31b83c9b1bbcfbbe276dc8edb71e3b806c8e73b597bf086d3d89835e6567a731bc2fe8a607f95af3b2b3688e7db2430b220feb705f1af43dfdc94affcca302135fccd9fe7eda41adab6cf550db731b7920da799347e633ef6ed46c55b55d5bc31c284b0ff6ce51856c4f5ec467a8766da983b6b4c7e5e5d595e5a0f5acfbd55c46bdd1f3667c5af434c08fbe5507bced333dac8736838a2261dfaa559d79b4e0a9b60ef3cdfe296b56fa51b3ee929c346eebdc3b3a59e5b89e79b6eb1b8d7755d58dc2b3608d89ebd8dc3fc9b5b90db41fa42f49cdd72de41fa220b7a5ff9bab5bbeb0da8dc822ef98a31cbb6d25faebaa38ac3bed8909d35d1a5437fced33b461ac779a994aa1cfa0ee7fe72cc37fef27292c0c8b6a0f797431739495336491fe1d022e3c8b905b9af1c9b1b7f79e81113b2fe7379851571fdba91cb63ccfef22d539cadf4d7dc82de570e7d2bfda65fde6de5d245eea4f0495fe4ee8a0d425fe410f311b9296f69fa1e0cecda6ed261d353e7563c9c5c58fe947152fd85f34d55d5ed8a01093e3e09376e2a8581a50c2c3459748c041e057284e6ac0fc1b29ea9c43b435c6fa3796f8a2c8b17df7bae1ffdbdf75e7cef0d01fd3d37a2049fac6ae8bdf75ef5ac5759f0c5f7de7bace5bdf7c456f9f27ca73c2178a26221c10da210e6cb23d12feee17b2f6eaa7a01f36061023cc310afeeb4edc73b672364eb487ebcaa8a71e50717215beff6f16ae5dd1622e816d7dc45d63f3a057fb9e54a8402514273447bbdd2e8cd1fd1386b6a9ccc494bdbe7e8712a9bccc8b64c349b47e4d1e443c7629133129d7522784759e3ac08fbf1a377326fe7c944da3b348cd3de8ef913b2cdf4e3db4d3ef87479bbce0f21906897f605f0297afb107c62173936379b6b6efe2daf89e4c78bbc3122a825b0600b2b8f44bbbcc85542fc60d33a9b80d02d184329c812efdc30ceba8ade90394321f31b536c24a58f34258be6559d85e4fa68c52de9b014a24d3ddc7eec18691c087df3f136bc3344e3ecfc681c284f90b91d425591c92998d9e1a3d2059fdee4c24a0dcfe759e340a8625cccd4c671fc45c616f3746c7a1a456fc8a00f718402a91c3a3b2153824fa238e4441012d33b8a08d1dc94cbc719e4f60bcd81ee34b534d11bb29d0277f296cc89a027b60a9fb68c0a9f3637854f5516bbc50f21f86439b44413896ef905020cb45479241ae6d7725f41b761b8650fdba16faa0addbabb5fa5ef3d1d1fda7bafea760b84e6a8bf33f00fb2f521b8edbdf79caadb381a16382fb8d5e34276e80ca7f21622344767090c21d469b2c764ece6fafc451864e0260c24375e20e2cb172348e7e508227677775743a2f3bb5c78b4cbef6211e2878fdb2edfbeef8786f9f6241ae67f78f615e4d2008185a6c4dceddc7b90b50af3f1f8e2d3787d749e86ea717ffc9a6e763d7206be72d5b69b575527369baf342437af42c4b9fdf061d238b7ca5ff543757c389b748b0fb26ab43df15110aa56340626ef7f2a8fae509352dbfce165c4ebbc4449275e4a6d33bda521d17929af8741a03f273d2e25a5bf8c367134e35be9230321db4c3a7cda90e83cc92de7ccd91239bba55d1949cbd8247d462b310ea6d1b049fa623ed773ab9a6f464d392f2cefc24566793937f545a2f34974fe073ae6cf2fdfe0dc749eb669db4d94513a8b91895ca7774696fbf01b9b5f1af591a6988f3537e80ed33623a4cc90dc8c600a3a988294d7578f979644e7dffc71d35decc0b0170c915cb109b2d775f8c7f34648b3964804793a6a1bdceaed7655d13c9f4009c07c583a76375e62243f5648b44f0d4ed59f6f10aa43f51fa8cfa96b7313b2f5d5c214ee6daacff5479f3b9bd2f3cd39e75c73d4085bc9d6dd7bb3abb07b5555edee6665b542eac86aa1afe63c7729e65c3be7dceef66c9655066e78e01cae8c9711b7f27c9cb377c79113efbcb51d64ebeddec99e5bfcadaaaaaa5b5291ecc56ed7ab73ae313a77efe7710fdce41364715a686a44d1c28b1634b4163590b02880962f951630482c64019e208427cce071bca69e30864785d01f24c309571e5a3df04d243a5f62d36291d1949cf086df32e6a28550185c6491832b54a14a1939b88219646c384105385868e00a2f6660822a70410569b0c2962dd4fc408b2b59ba98e14b153d5515ccd0c18c1960dcc042a80b322e60c3163ec8a2073fe862861392192dc8c1c36bca0954f81baf29278c91f267668d3bb7e82e6a5187ff8973bb7976a7e85b33cf18fdabadb465d10521f3d7e77e73cbbefbdf61991bbbdb9c3b4d14848c06595fcfb9fdc2147cd0c0074c982207627ae0832fc4e00c56d622c6386fd8b4ce262d44b8b420a1ab1b13166e452b56510b1d57acaa8a5aaab0a165068b8565412b36618cd4628288c50ebde1b941c76f4c39baf039b4fce63a9510a4f2696b5736e94bd513fbd6dd1d7753777a6ad7ffa384bf3508c7cfbeffc34af683985f31225aa68c0269dfd89d26839025e079aa506f4fd184304c20a3f392b415575be8c21667c8029922ac80093d15151e8b2c4ee1b5094cf8e734a5ded901e30b0ea2e0052a6800458f8eba185f534c20a35f100327566025055f1083188cd0042e661ca16aa082173574e10563c05091020c18063aab6a4546538a367c8a93266a49c347a751021b3ed2f4c418a3d3b0a9147dcb2c8f567468cd2c56312a21ccc7a884337ce49e18633569b2dfa18c5f2aa329955e534ca8f2365e534c70c16f9947765a4a2f49f1c72eb70022b979cb2b7601135630afaf2a57147cd55355fad58da6e07b8f0951fe95e090c1d71413a4682928a14b12d0602b04e0861474e1c4055d648085282c010ad612ac1077302242a95a020a6a9650a527dc7972c698369c610b66a0000a678861871b9ca00c46a0b2852bcac0c2962c5dd8c822460988381c214b12ba10032e503c214b15a42c58d46014e4784d2dc10c8fbda696c085b806b711da3c7475340ca1bb182583aeb1b2411853908213c4c0862dd0a0073ae1a1672587f04d4641a68e06ac820a565a929b086f3e5a9c82acb234f7da3b9a8ad54c72f370fe387f93083fa881952a8c49431aba30e3882536f0820d880005183d18d28203130ca10d6414610c13a0e8d1261ca1c355f4fa0d5781e4c6e6ca19c0dc8cfe41e91d6b4ce3b07b9512956c4a494a8c59562ab9fcc1a7e755cc868686a0e8797db9d4fb7687658b962e5cbe382fdf61c07ccf9495a5774a8dc31e639649fe518ab17b06e17fee9f042fdfee9f328194d754146052515ca9021ad2babab089ddc286e0fc1b6293454674f114d9668da9309f9e2576926da5d29b25b6c66491128181d2c51699c69430ae2f4eaa68c1c48cac50207cf11424303227e637d7c5a5c13ba3e8c8644eac29bc6365691cf64825ab52b2f26c65b9f26c89493dffe84ac79865dbe8ca36bad2658ceb22c284b81bd33b51c39a90f5ec5953553308cf6db5fc7a2acbb35b9bc2f296186bcc0e1ecac0b8307cdaac31ae8b972f634a4218715245cb8ab1e20a7b19da224ba321c57da140f8751448bb3a10ae4be3b0c79865a5cd75b1c8b0897d4be90d9ac3be11e0d57ff08e6848001a84d506fd815d7b5a6334879da1c8b6eb37bea1eb2a75a954faac24c4bfcbf04297d732c090f9cd7579761f5ecb00b3e5d731eccdd1f5e477a586ef0b0323ebaab2c63c3b64b2df3544fecd9ff6e73ddf0cda77222a727439317ce276dc3d570b9bd6475f20e340a30b28efaf291d34e17730e6755e533b48c223810b962cbf2e5fe54fc32c94e79e5b5096c10e9a0f2322fa9eee0a4c48e54ef5db4999c2a7767d9a103f96e81dedd7cedd64da34ccbc6113f364916dda254c96eef2ec4bf4163b8c9b619e7d88de71c651dff8cb3bd7e630a5d296fd1776eaee5d6b3ece2095a5aa563928234a94df32aa486337cbb35f430cc8d6dbb1090161b009549f15af6234b5abbeea8e8acb82cc982e5cbeb0d2523a0a1a61b260d982a9f010192f5dae7cb156ac14314854cb105164a6d5d51be91c298a0c081dcd216d0eb2758709599c37b1493707d9f3d17aef84da5cbd5df5992f5e168f897976b93d2b5e147e4e1c995f776938317c6adfadc13cfbe6b2f8bed23b1816c6617764e2dc3ae5a49a5b6789f25bdcd25b9e9f15dde5d1f82d60386ae1397679f6cdf2f17b63a33d714b9482eec4c6b9020b89df134bc52d27c8b63cc72fcb45d964dacbd4e3ae4cb20e9ea3448add6a6ad51fda552381b1fe0e1303d320a1b7946c02082184704ae94ebbf96a6e25926fd98f7c8b0f31dff89d6a1037fb83081e429fa9e11c45a66caa3137d42741cb671f5d322ff7a8c603f5d798aa39331edbdb6f368805ec0f9dcdad948d66c4e616a4dff9a511c1a67693e5ed0bd820547f1079972cd78d7f532cdf72d5f1686bf2434091399773bbde29d9df344b966f87179bd491dcd410c9bef2ecab19d994ed8bc355c616644ca1f2ec4b265b13f6c43fe7b2b537b72006e8f70ea622db56caf34ac19c7da7f0e972f6cd824ffb4ab2011d87b32fd13b399cfd8647cfa12dd138ec3834237d6332e3f4dce24797363412c9336d13facce59352ba107d394bb0c54b17fad636ff4c6a5b7b0d9f19390fd7981b7b79923b4d683443729ece34ed8b449a37467a4787a310e917e612f3c1463ed2483dc8ae20725e22bffc39a6edeb3f8798cfe58bb55f1811427f5d3b83acea9deda1794fbab651d8f4781aa8fa76a17f5af6567b144d2dd2369da82971bfc5cd5f7d9ef373f7b47de800f18a250837546ab0a80ac94e9dec0a1b625f59e4fbcb731f6ccc472412b9107d910bfd6a9b1b79f64ab33491e63cba62fcdcd2849e237bf9e73e6fae73b52d8655296ecabb2c52b620e7a6b82bdc1437c50be9abf1aa73589c35e8aaadd7b06f94df309e87a55b28af0ed539c47c14c2dd6adfb6afeeb4dd853a37a18fa213a8e25f77dadb8fac3d1dc86507a3e81a65b295e65a2d04d92586967f4d8921c6af676e77975b0c349c730fe688225e555555d1c201037989442291bc443d185d188661231224c2cc9565593653a3861834970d1b366cd0dc184121c78503070e1c394a4e0b3b2e1d3a74e8d85133d3051e970de6a3c54687e6b0db604296072673b85a53574c2b691ec834258697df2e1d0a44df4a635b1daed55270b062059f6b5ebdd8460bd6c7ab0bd1b32996d7ac71d62919507ee635350616afd896cc6f4c5be5834fd5bc799ab3090b0e48134e243a5f555555554981156104c10d5cb2a882258d0c8b93a9423850811731185306384861a50c28e81083c86fa066e2227aef44df38bd71d677afa092050567e0e0cb0e7a2a32bef2ec8bbfbe2a23f595dbf0ce4c4ff5959be68644e7e10d0c3275f71bcd44262bc06b4a8c133c8ed7d411d2f8cdb76238c6be27447f736fd500072a9e50810228526f36fdf2ec52813805e2ae6fad2608efb71684df79ef3ba7d5acebd704d9dff9ccff341a360951fec57aeace2cdb80c898083e6d3a12f801c4b36f3f9e1500650a8aa36f7ac137130fe9977eafec9a8677321bde29294ebb9a3a0826f1d74bbfbe55af1eaf8c4f979a3aaa9ada57533535bf6c1fe78b1591fd86e477777702a176467f4d1d81cb9b71c3210f3dbb12234499abfbd061132f806726075cc9988f12207c745481c8575fde20e402c13b3c8dc3be09a1a3836d375e7b3cfb66f33a8dc32eb25cbd15480452b9badf3c9dc9f16a7c8821a05cc0109ae21902f68ed9a1a3e43b860c9fe4f319677f3b749448355a107f0d57cca786f3700e1bae24f3a0f834ced33b71887d41a65f8394c37ffc60930ebefdc8c13701f0f00de7dbc6376dc788c661df744cdfdeb7eb06217d839a6fd74e0fdfb21b0ae4f29e1b12d30f2cb2f64d4788ce8fa9896004fb03bba6a1d8c4eeec3db475c238ec46f48e3ad7616e3ae430b7128f69336fcc8da239ec97f6441ad9b55c14083ffba5ed15d11600380f5ee3da3b37bec3b57776701dceb38092b33fe8240780a68029a6a038fa351a0f9a02a6c082e2e8efd06e34054ce105c5d1d7a16da5df4153c01464501cfd92868267cfa105310e577201f1e3862b066f0ca10f27927623ace7301f23a27bc69ac6460d87f9cc64103a282e8022831b78e1dca5ad0fb4fdc1fe70854d246dad680efba62163759a04d8a4f3c4146a98020e4f5060049b18fad3302541dc03a11efa10f750cbd3160b9bf8b12cbf2936b11f21816d53283e41e1d3b652ac3cb143eb64a3ac154df14c31c535859c422abbf32d079c73cbe0dcb21cefe696835d8a7453bda33dbc5b4efad665854dd5abaf0271ae0e36e6035d646951eb1cf7d8e68ce71bef187be7db66797f76cc7b854dec3df70b36b1bf293a23db748b956797009f565346e81c91013e6dfb4509b682d97552bda3002841501c3582e2e8a790b0450150cc501cfd6dbb3cbb1b7a1ed2980716b6bcf31f40c021db4cef7cc7f0109fd64960643cf49ba696080a847f0158bca67800e6b70df3ce378bdb2ebfed9628e55d9cf22e52d962151d2bce37bec250de2d1abf05b9d7f2ceb3704a06264ebdf3f5e13ab565329e37798b6b8104a294b3f1c0e39964df7e43a19eaa93667a12b9abaf06e19c732ed23275befa83f3c582f03bc5710e840e39251e78bc93ad340a84df69ef981ae739b665ff74d874f8d71a93f8d04dbd6344e33cc74c7f99b6945e1ad13bbde5c69621fedbcfb74bd6e5114f1acd59cff452d33a13cdf7f5fccf53a7977f12c07c8cd081d4da5d749a12a0a0f855fb2ce6e35c17462d6ace73d62a4d4950f652739e5bfac3f37542b69598906da57ffdfcd5205b28bf37af552095251563a8e09534860b5e558d4865078634f6cbee6e6b4bf6bb355d31dddb96b71679093689a4e5cc0e23e603ab07a1ae15a780834b74f6cac58b4af77b01a4ada8846a55ea73819e041d438866660680000aa3140030381c100c07c4f15099761f14800c9dba505822cbb32407621442c618448821c60000100181111a8209e30c1f3dcd138333c49969d4992274498663619197a6657de862c6a8d42c34260de0ad4ccfcab6c64a818d46d0ca948d229235efca718414341656e6fbf8810e47966b831a1a22dc1a3c8f2d220e2e3f2aaad5e132450ed6864973dd937cea2411d874295c7754d22525a40b0614f771490d3bdd41dd9a8c7d799e5f429f2a63fdf53e247ca467777ffa23d49b7cac120d62ec537116b9032d5b1069d0e80b8239c81fd2358ba91e7c12714ba11af8f46ff2a10d310f26133017b86f8846b498d00c34c3040e1a67f44a37339d9d4937238d75bb4bed95a0c07a42bd1e75beeb951adecc66c5b1479586e6c0a0ad290e6b81dc470408c8e91578c1007adfacbc73c67574a77b29668685ee9e2f07bbfb88148218501c6845d8407b1db8ebc68a83c03380d515e7151b6e9c543a032a9829529eab2f528a473570df9ce18e23a08888fe2b8e83c31b2d33aa467233b6a752fa0df070e5f7b98c9f7aaf183cf45eb7de8bb5e20693fdaa0d8bd88f066d10f986c85e31bbc182e3eca621523222ac018f70747742351c8738a2d426c4e6d59cca53edd1c90bd5eb5d61cc320ad759ceeccf25262db578f537b1df1b3a53437408d5739689acdbb7001d52332c3ca648a214d4a3a91a665d60755a80501d2753d84b7cf9de8f28902ad2e9b3e4be64d2e3d2b37e8bb6822c19a8ed7d8f46261eabd054bdba16680e43f3c5e88453c26e5640c8964b01005e5c91ed483fdb30cff1d2b9124ce481f6a3266647ef998717b13fecc70e39f057c898db4a924e5ff1862e4003940615daa1f036f77f8cd3c6ab0344e54b91ce017bd062c1ac742b20e328ca00676e51d05c0d2c7762ab25abec876a9f7230dce559b8100107902004df2d4cfc85b827023c9c33332f992629eddeb5f19283bee25942753657b7ff58ef8d43e726616878b661b3131c7b7805f02ecaadf7db05bdb2fc9bf114f1485270ff6d2b05ee38d3f71bd407464d1f0249404b1282522545deadfcda98f1094e3f7d878548c6243987aeed96ec72bf7374709e899d73c8ff2a4bf5965c9da3f4823a2e0ca23f04d1c12eb82417cd4a4b263835da747d64d7d068230df8295290b3fac5404eb9439ca3f4c26644c267bdd1b185ad748f8b27fe685d6a326d2120e276a8d6a3eaef2fb9604b5af9b18aa023f334ca7bafd259bb9b961be8fe1e37f7b07acd65e92e72a6604a0383bb8b4d2226a3620df31fa05af51174cb187de060e6cb473c68a17179fdd2b0fe80661545da8e41d3700142417f27be54c22ff44e581c9e048848cfe399884c58cf124586082388b8eb0ff14949cdfe2865f24713c353b23433911f2c5ae18eb4f68bf4ef90d06184039ade1e081bb1cbd1a000d88b692fb92136de204bbea880c3643602456c4a162d9f8114c8b9065241c0ae3c34fde5d4e450b4416f56ba1c0decf761a0e611649f38ebd1c279e90a70bf4466c5421fb589ed0f9f20962887c87482c0361000e8629face1ae861b65d7e0284ae8bfe66f637102054ca821bc9f4893b9e9098f9b1f941317c929c3db76ec406b65a84d28ebf2a90e6f5aafddbe9adece52195aad920e0226b28f1ec10dfbc38a89f1b1c99e8436b337fe34041e9be4e74fbb91f317ba72fee64167182ab4c85f7a595f2c4f1b9394327cfb2a1af940aa81758e0091bdccdbea04d56aca83f34652be11a5ecb38bfdec26d04da96a6fc8556c92cbe4ddc1396bffa0bdead89779932e3848c5e3372a26cfa2e5d617fcdb5595d457af62bf88a1cfa88fb7bbb52975fee077e3478df8ef63836d0237a6a608aede3299744745356fa06de183cbccbb9bb56fcdd05d1184cf3392dc0cd36e61226f2e35d354422a133d62de389c0ed35a122bb9cd7be0e6ff395ab5f7ea5cdf7a8fc43a52c08f82a80144a5eb05cf2325246b13aa770df129afabb99f60daa31bc0c07d34f2ef4b3ed5fab1cbed35a1da14bc3d567470d5867af44283a8986ec16c30b7e96140450042a9f69deb7ebf484d2ee922a91720710aa81607954b0351a401c9bee7de4bae3c0558a6e45ee1e2a2167c533695a2adaa99bb8cbc9a5b0868db08fb04fa83c8c6d3078b75437a3b62812b5c33260793cab2f093d9502d7339a95d53e3e0003b48089c89bd83ddbacc786858ea624c35a44be873b42e7cfa1c0dc542bd5a0aa2e1afc784543cf23bab789279e3dbd706a322c053ec178268ceeded25220d76e7f2e718f693b6dbcc24e02116cd5b993594c1844fac80d0abb2e7f1727a66161ad16ae91da86f4dc11359289f1af7ffc9edb2e00487d289194b45373e9d7745a199052bcc780ebff6a3d65ac0a6c232e42b118900c0afed128660315c22074e0a00c7dbd5ae01e5c14bbe39a44832e52c85057dc28047b33371141c30c88266aacc5832e558155be7df1fd5705755bc9005418ea57501aaf0e26d58c8121af498ca4427a5848a2a35aada2401b0f134c1e3439cd78b9742535c257d7b74cf9a56b0149503bb349318ac008fdfa94049801d2f8220b5d890234868746a439c8eacbe45c1e0334cc216861539b0efed855f3aa4c8d3d584e5b8925c1112957efee2e1757d74c622a55729c16d000ef85c61a359b1b39c81dbff6fb64a8f454f2eb6a4dba2b57ac87a6c34b432f8c2c1206aad63275d99d3c0331715454dec8dbd54cd859c720f6771a5bf43af60b086d69f80452faefa5d251f716932365f4b93eeda2c4ef82479a14156271cc70114377cbb3cb1261fb8c59e49335dd32f8f061a4ef773ccd6c7e4d88cabc3333032f7afff513e67fd3406a059248f1acb0ddda741a36817ac99a3d01d0dccb1bdb01e25d4e440f53a8fded01adba65584445d35c09641ee23300c3a351e6ca04a83e740ab42e1af9328bb695339b5080d34b1b0e7d69df01389b88e02ebfddd18dca3bc23f33ebfc30551f9abb0c439bf4754092f0110568b05504022b9b4e6ff36232dbd4381e5a599a9b35a5a47e1ad8436cfa06299d664f0304e298d3c0c40201099dacfda7173e714da18cd8a67e74222e91108ea1d3504ddadb023cf237d4c5924cef512212c994e8b9ec850e609e0887bad5da835a1268e1b02c1d3cee9c15792662ff74b3c4d441c27cfe3430eb6259dc6eb7cfb91c17d6e01ff404f857cca1c929810946e0c2fba2365a40bb47755319ce8f584c939d450962f4ae86ccecc64642c3686b505f8c9b9152a3d72e62b892cf57537aa8849b8fd4897e059996c04dcb3b3d727697cac57f14051cea1da7ed1d83e81441e6188f1a28bc6d2f716c1aa1336e4a41933b49974091d6247834c607ba16f9f0143e584ed824cd028a45fdf20c23e57b75a3e1b8f740766af9dc875025e9b6594e8588794ca74cfc6e162f30df59e4de7abe3dee536c7a4b4db78b73bc6593a1b506d52845cb611e1ad3eb733153937fdc566246c07c9f6413894359d55765a440accf2f9b642da36dc88ff12abe4b9628b930ceac46c06dfb6296806fce1924905860ad6f4d68cc7ee87b0bed568eb90a13789a6b4435cca5ae8364787839b4d070baca49cf1704b60913b42620163e70fabf5bb12780ad087570e36508bdd080fa9bef1d9407359b1594423842f5166f0bd6b2a216397c84e6b262acf1ac2739fc2aa74ec306f0f2a8dfddf130a68e9c099fe4283bca6f1893f34fc20005fca178ee03277531285a355e7cc3b48c72c2116509e812c7d7c5167d6576ccebdb3a665a215a06eaee224a374cb6212c7b4c6f2c11390999769b0a3ba2a755650ca86a9d31c55326e10fb6af0c901fff0ca4c1a2f4c6eebff97a90a80f84365c40ff4194b225988d87661e28e725273ee61f6166a21c0276533a99482858cc596ee1e148ef8fa24fa8e8e1a61e82c50df5823219576b29f7eeda6db57c4690de60f179d4e6a11ed66d09ae6443af9618ead9d0172bead5cd4935ac87a4b9c6916f02af8652c261e5686b81229d8cac9493e6582db765c72921b7a403a3efab39f58975026f5eeec230a192b0aede75b39377055117c51b65c67984d606c9b3c4e985750c0706ec669c1c830fb0de188018f714b90c1183241dbe3e7f6ae9250fc9cdaa52449b39c7b4a1e45c60c88953b7eeb50292f3f8a136ebe10a0ff27626fb28decce0f660214e904d9c7bfb6bdae0ae4cacc9a9b88d275fda8efd945829fa19fcb8be9be07ad670252f39bf7be488893220d05b685705463a4c104e25b62658a6c7c6e7cbef7a05bb499d03d374c71a599518a5153fb5afa81c32e1ce714bfbb2af6dbb9fbcf0f5d5d3f2c3157c67178b304c7d1f303cb20b6f106cc527e844c0f8dcd1602457f88575a03675c355ba2c50526a4b206f5710fb701d08866f48dfcaf17235fcc3ddbc6e70cbe015963f4dba28ae348d6e9fc1836b23a862c28688f80153525eae0f6ad0148b6f3f0203e1c790b146ad2a07655a23bd9fdc816a22b8d0e5d9affe62425e0d8492a04089c2386c5ac2c2865cb4410e3e8818e52b36a9b5b320818a3fa042573fe30c0ccfe1da5a9d6507e6bac0030a5b488ff49bc903901374fcf184d49f7a222874aaab8c685f7bca189149712348ddab99e86e017fc36d48a171d26f3cbd98d36a4a840033124156da2d28a02b48c78cca67b869f43e6eb40710f266afbf1b105d2845dcb89657c27c8c0bb7eed281b44fd3bc00796866a474b5c67a5754963e2437dcff825b443532be8132b33d0a1cf565f14df44087498dd3a59c490ceed6d87be0ce6246481b4bcc877d5864f5f42112dc127e6e44b432ac713fbe7f12c8494c9490e1ba6622526ad3d735984283d34afa9c3bc5924ad1c08dbeb1bea815f1538683175fbad48d1897586a486ac56010ba44031f2b263c3e2925d665e85850c09494396be92a34e41c3d2a3c16a35b3d94d04c6f5250b488118d457c962c3365270598967585d5a374123aa5c7a047f183547510c476de7c5505a8177641e2423c5c4670a9ef59bd7e29024e2d5742fe472206d02859e985738483addb5b3f2fa6a2ed95457a1ce740a83bd97ad355d81e309896767b31b15a6776df8b900986ab92d590897b3fea11742942e683dc4f1815c2b62c6b81bcf4987ff4bef20fd7f95a4e95d710afcad7ed02bf159943ebd69e346a588d6594eb1857c5a662cb87794fcff899297a81e114063d709ec4b0762cd1a096c5c221e95d4010eceb3746e7fcc6dd377f103298892c9d54422c604d1a2cd4a27b70a0473646fec7b97269a1047eb08033f7692e9083cd427fc76cd470f81ab473cff6d782cc657dc24e1ee173f91bc0a94bdd583d6037ee2f82bd23560c1aa55ebe459a37b4568e4e1cf6e622055621b9625b5544e96c7439478d7aea0478c60f6ed2b036723c476a881b0325c42d5bf9a9611c27b7298b167dc58b37e9856fcd9814a5df732805802fa94c8b233110e8934671bb7580ca9b2cac7cc1864d0abdbed0ea1dc0f1b45a184acb83f6d4fa1ca70cc2eaa7a3d945cd9deebc1b333b3df8b923f31b02a7aea4955705ef2fe8f12fd9d4560401290029c09f09bf62f8e93fbdeea8b9ea5e917e017d84049382ecd8f83a2730322d7f9f4e2b2a0e28335dac91ebd8e2ec24c6848da6d9c09db4740c166eed0e45268b528d36362ede6d8a6a9591f99a2815ca9c9351aa8fe57723f95c027ce97a8142718e8f3aca685cb40e66685942d6bf89a33d1b4490149cb8610ca2b037dc7b540b87cb10bf44c3d2774d38afa452f602c11749d1b71446beab3d65e5e09b466e0f33a798797acd912274ac57927dd466b3efd08b493eb5762871b52dc05f9d0ac129e5be6475a3078b64c4ff4c72696ca00443daf1005faa48a6357ba7593e08f83f904043f1e88eaffb0d28771a3ec9bfcad163280922849fd4f56ac6307a4c3d2405b0464823c9d6669975fb2229ec737beab0f5d3e700b839383f9628f9c975b13d3f1ab53955fc2efefae9a09db6a3bc553f56dfbbf7909472285874d938f7b2e8af479c9973234b948c2a17dd529e347e82b7d199c99b6e98dce0a89c5ca6b11ada1af43239a38426f8d96571afd62d2856b7acca93efa5e6b0f60bdbdfcfc1b84a14bad29058e3eb3463a40fe123bbf03cadaf154f7c648e7ce0837dab11912d22c0472c7fb3eb50336f99e3a5391b32a394bf03829f9ea4966a11d72ec3a4e6db375d06d373e9a2f5f23ef33ff37c73c2aa42bcbae960cdcc680d153b54e1e117fa237848b6fa6aff7d20efdb35d10b631d1f59eb30c29a6de30a83662d3c88c684551c7d6714bb4911f3b7dcdffe43efcb4c7605b2ce2cb78b2e05e05d9f405c248c71a5cb8cdb829f029fe1e5bb9158668fa18d4038a06cacb4229ee5b7c4d1878956d385d9bf2382ffc11ba6ea0f01a927cc778f1cda5dc954a9387a31b0e7a8c1bde866efbcae463806cad97c7b39a6032a4cbeb0ab02195b4ed240a172a99021dad3ef8c8eedca47dd0b67ffa4c1f744680da78a0be92923fe51ea664cb0209e659310ce8b4e7abc3f019fb2f1bffd57b0d8b9ae186e431c85428bbb21892f0793481bce34d15dbf5b08911b77fe04d992f04395648b66d055942e79d0f45301ce12294e85b2fe25d514c5e381563108ea0d700f823cd5c2fb6dc155b21e7bb39b75ddfed0e4931ff63e56b87db8b0bf6c784412260022a46c872df225ce63a0543c22669c476fddc0b628c66a5e048eba66f2edc83bb08907beaf7ab0a30131b148a3894de572e457c8e9e45711b7b238ef839d018f48b837784f67c7c0d5cb3133cc2c7b0042375d2fc8f853aaab9dee632445fd264ff0f1057d5b3439310093e8851085e8a3e9d61a2fc5e04a682f8a3231202f039d90ad09ecb50841ae74541e732f23361874ca93b127db75810d0854c5d60a90fd59530eeb940ddf142de1c9a3aed13af8cd3b68967674647a7ebb758e13d1a61624a3c008d49c33ad8f3ef2b6d93833d1d0d4bc1269c7374f9f6390b8f66a2fc25d9b415bc49a664c250153db6251916119dbc92369b7cc75ff6f445fd84c7e1f7149c13cda27914de0e0d2d7856da19606a4f4e284da460af136ec4c58ffb12c4ace880dc2c247ba801a0835cf9ba225a610075ab08214eb088f68fccb3a70200e45d44db0ec6bef0792d5e590a61c44bf9a3fdfa1816b41dc23f1728acb0f03447ca9d3a4fc125384f9b507021f1631066af630497e6fd86eab135cf2886b93093f49f41e532dfde08f0d1c11db016ba0734a899a2bc1fe9852ef3e99586be6d98820bea40f91f667c5e02e2ffdd1bd09797330a2e0accf28e0c48007b8e670ad1f2eb5613d9f07b6bf81e1bfa7ef3d3716de47b6fe87d1b5113919f59d9c0f7d938debbcffc883dae8dad26d6e59f4ccea7f04ef09cc1251c89c03cc0e824d8b27d56864e339c8884a1a5886be69555529bb9ef1f529b028d809862ac264a3f9a9a24a89a44ac283b8f8a745924c9e31116927f698b79332135cc442bde89f98b1cab97c590223b97a00387a599490bc1ec642532bf5522abb5947f6bcfddde836f76f4915cdc7d48bc46c74d1a1e60857ee42b30b63a6ec24bac12bb1fe62851591048220097aaf6662c119f7c081ab5c0dd6fc2094e5692989f3c3c54ab089b79d218a2e6d136fd62ef5ba2ec31e0f11750a86e285f092eee331f4696c134afd65341d4e3ac31382eeae1d5814e500fbba7315e359fa26036e193fae8f4710cf54b7c55c468f987213560bd0a0c2383e69e373a8d2089472480209b91f10c6553961c38fd8668d93f5c437af4ceefe7d019e77449de3a07b2b844c32ff2f92431efd0666d4b93035e1524714050f973860b24e698d2a1851043df6c3b65e02db6fabb7271b52d571b59b99e4cd0a4fea81bbf2892b227b276413b2a80ece12d5d1795f3daa24b90144f21c2bf1153993a6f87d5cfa5daf134464803391fb2ebdba4ab66063e24e86a0b6af004606f540eb9158f36debcb055db72d007c874e245a7c0eb2a88430a2f6b3dad6c97c50b3564337ff24eeae6f6cae0967b281419111770c37394f9967241d309c106dc3de6aa95d21823b8f25e25b6fd2181bfb4c14d04c252fdb24ba3b18184d88137914a7f09b72f213321dd3d6500b6dc8b8e2d93663daebce67fa41c47ed68fe37aa17e38aad724923b11235081d07c38fb5840b956bfd5d897b47253887dcdbd79fd83ccce5f6ab3d28a52627022acb1fb2fe1beb75a9638d0ab71b01e113446e4c489005a73cf43d8b689d01fb1045bc14119912ff08c9f12226e0af21593aae253420c179397952d3399e200524cac12cfc200548b26dedd0288ac2e40d71ca6f5fcb4b9b86c3c2ea15db70d386a074b509c91f5a618096cacaf253c770c80c274bec68d48542bb191a28bc1a6aded6e2d318ae705d543c218de47d6d22c73a69eaae161e93da5a0aebdfe7c5cdc4aaa1cc6f54de15fc4f64cbb8dd12e8720d431870287e058e74e07488d985d3890c2ff37d650acddc3a688ef1e0dec03379dc76aed0a3801b81953504e1e89b102d5e69d0a56de76d227208646b4bdada0784178f9e30c6ea86c394733d63d864419bc0efa386d8a418bbd491b87466410dfcc6251d764e105f2c691e48b7d9a3ee620fa34a414ebd7911d74756803874f29594d0fb46f11d1529f18067e907d6f5c1ca0d211e7aba7f60dbce2c23fc2bfd064967cbe1ecd97f583968b60700846a3de7acc93ca1f2fca178c0a27b41e0cd2aee45ec92f2beeda3895ea230956e405c1e260613152d8dacb92bf0b85082952c561c980c929b205102616341853827280a6140a7ae18694aa3ce2221c65f36dcc3aa2914158d4f90ec800b3aa265915d53aa3c5aea27cb7274b681a606d375689e50d30306ed4a96ff05a74d056f2eb756b0aee6e1d489d9ff792665c6025c0bef0058442a2185cbab22e9269cf73e587c0c164bf58d189bc80f6cc68df4cad867f779a355c643c99a0d63be0268553cc787a93ef821a897b7d26e85ec609c1b52e5f0c61e4fd1470622e15d74f48d1f2311941c763ff9f0fc26a12a6285e2713e5dc6254612a08224f724fb747c58401c908c37dbf7f8ca5cf31ad7909377d746454a90f492784bd5b6045482c81258eaaeb5a6dfd7b13f7ed118789abd05d1da4b31ac60b830951b1015444cc0df00f788921a15560def235793b5efd08de561b3fe46085b8869fbe7449c9827e6c49c182732267265e282ba5ac209a3b482ebd8f8cfab4953f988bb6dcb9d205d120651e7316796acda254213dc014641cad2fe807983cf41cf28f5c26e8e9b8c1375a8ee249775dfad47913aa95e129fd5efa623733a682789c8faffd671799d352f49cacaf7f688541dba1bc966e571fb71ae4ed59f2462fdb9e1785e27d54992b3d6df705c5e67ed15c9dd194bc8733fa8601d73c54acea549d7328939db8b7d78f72e98739c3641705b1e77d8946c911b470574209ce1ebfd43dbc347bf7af33c4d08374412f62ade2914de011e975c48bb9c990a22a9ef02598aeda03433ddaa96d0f8825bb5ab608f6a729a44a545df2485ba9f8ed5d9f3a58e9bd23f6c11a0b92b39e025f9b094612f738b21ece860e87cb8d1e3df640e8ab1432bfb94e7d93a516143dbf4369b761539962bd2e326dc6e4676cfa3f77a8db0a2ce6c813bae06c6060f501fb19490726f96014c468efb2bc51b9b4ae6d1ef723e20ff8746472d07dc1e973fbc45110918bfb4f90bba601878c04ac444a7940575e1831c2b1b4ce5cf1e8b6e83686f589273b13daefb0a1ae5758d1444ee226de862948dd10024d88da43ab19417c7edb3cead561f790bf26d0ae15bf95dc4c44b2cea11636a0841946080832a012005a74c51353a87af22eb707da53ce9d1c19aecb0ea214d6f92d7368bb8eba0afea566a76908d3235258e845d9da2ff4acfb8911656b78797e9a2fa3db6c02a93f1ef7818da81843e306c2c941db954a8ac54cf58d24701a06f40b6ab121c436215b7118b153e09c318840859691a8bbfb000838e7e4e3b894852c114e7a684ea9d99d1346fdac90d185ecb84e95580e0eccec3a06e0151ee8613d92261768c0db0ae44eac8a17f3ec6e97867e90d2d8206bfe7afadfa8d839a38446a8395babf9a2da8e6bc049b6c4bc81ef278dc1a125e19f8d56a5a50964b5afc556be1b6a1ef3f2e673ac4562bd37d60b3371b486e82552da51918d67d9d63138c1db2e73efa6c73df748af9887cdec3c92d7cde46547d8d2eee3fb9d532b3fb448e545ffb1a50de9d182fd9edbe3d81e8991e710f43514fbcbe331861180a8a8a7b752218f9cc81fdf7ffd096faa3a0a307aad4c4aca2c987bfcaa3fc95fb9dff66c9eb397b7f1ebe5f3795e6ca820d941086f5be84e25044215171b0d4b42b551a06e1856fa12dfdeef124fe0a0fdc14c47cdbe41508c8a00f1a7aa0f200e870fb342d94610165fdfd9e89a30801a17be26b568ca16761831d954e0e101a7211847afa25828070b377ec6da1334542d8c88df5916f7b75136cf42d572071c9ebd13f79cfabf2bc6b296be08679a624d27f827140dea9d34f71969d862a28343c53fca292a8add791b8a4140fd264f702b49fffbee2401726715eb50fa31dc5650f77cf963b288d7308d956d7bad3159ec64fea19d294ae8c6632ae4789d1a006daa8476621dc8f00c2e7b9b407692e2ae8984bcd1f310a6e1c185a81c2a4e4e359d9ac17ff145bb4dfc28a1d5263e1bd7907bc2380def805f07ba9a01ce9c404ce300f5e4fc120758ba28e4fe5aa2213d86b2d670aeacdeebde89a184850f9f261c9a18a0b85af60f308bb770f58c240a541099fa2ca76ae12a8a7c8497943b3eac199bb1a48b8560cd2a6de15e9a6089c10293bf7474d91f2400ca03f7da6d1d2ca585a3ead24497b1af14e9787634e8b6fe0531f6cb2ada2608a622a3c47b4a6ff636009b2a7c5d062881600a19ce091118df937c13080587fe1a8748360f5162f5113f3a8ebcbca64083e8d3efa7747c527b851e6e5a4f49145d449bc374781bf33f36bed7aca4d6690b09dbd4744256693e3fdf3d056906178639ed44dce9f95b34602115727948505e41fd11dc63bf38487ebe41f54a3e8ce62874daee9a6c0fe7cf22201f8c846a4be3774c73dfecb341f8715bfd20262139d9a38ab5d90afb9aec6baba51538a8768f26bda643910099bbdd914839001eeafcdef37de1550c024fae312901c48fd50cbfa10898d6f5a36b50329bf6421ed0da6c0e3c93edae2a354f570d206119f9c72e489e1e80f70552a0414d852813ec14fb4139533ed89697e3f220e9922700fec8f7c66f988ec405f42f99432cab25e9d36c74b8e7d3289f95d62f94276ee4b33b5dfca650c435f84fbe396f35211840222c5c265590a91ba7ecc0e2f97c108f6251a33355428914830472e25fcba36695f7552457fc5f221f9fa32b372264209f0705146d9553b50f8e393c69fad7a598ea6eedb9eef34cdf94ddf6af98634ce90eafad0fa918dc96f43e27351dfeac2cecaec07bf2a68cdf5552619a5884a26627fedbc0b1f2d4f1c970dac06ea4b33c4b7369086476749848a32ef7e6afe5949e6d7083dfad094f4462c5972d812102beed275404709c276183cd6511263199aba4bc0256ae72fd7f16f4a882410ae01e3dbe78ce28b932bf006fa2dd3d75c7ab36968f31413e905b865a8740d655254ef10bcb4653abeb647f9ecbd1fbeb6bf701580c7018341ac22c6f2c45f3cd94001a381fea2bca2ee6632a371ae138562de0d47096c0a16155a0496e4c08c7f2a18eca32563fad3f54dc6746df08b1ae8292d60a393706e930f737231472933609238ca21ab321cd0bada4f690484fba060855ce431f1ef5293978bed02ae746e46a00be8a9cc9079c5338e2ebce00fec51be8a95485398db997f94f38ad704c2a98a04216ee5000ff4571ff96ba75fce7675f0a617fea481fecb0555d72b7c39fb362ee76c1f59e7ea9332781f9b58e86b44d421003fe111d1e8b28cd02a8168376b01da1d4870fc34adabf39c40f412503021618a6fe2b455c9c0b1395fae506dce40638891e63103f034e19e19dc167e1fca8211f036677889454be002c71f57ee91060e903c7a4ffa3b684369d61884f2db8d81411cb52f7cb6d427d6b5e3735a4adfddc3de29e3ef4a15c4037bc8cef375f624325a98d9ceb1ea565b21f57cc381ebf3e11ad58cb36509a8d666f9d7fed55a1b414cb4bc3bb720f704064d58d451380eb51a79ec39e8bbb5d5ac26e73625873d428456e16888df6aab93060d369424ab05099b32137dd438e07019c14c3c81a366601b552ec01033c735d0cb4f7621be54a99e955fa867bf74fa4b5299724fdc479c398bb83ba04582d81a1c9801b970fe437355bf4cf3615f9f3fcb7e46014b71cd71891b31077fdd73882f39e351de2074e0ee4ac0e8262631079860e7fe4d216eb9e1f916dff90566d188b5bc7efb770e64e803ab731876dec484ebd4c2286e8c873d976fa12c6241d0cc5226c5c797cd07808e674939966c025f102c2f0fdc06b3dc61eda63b5f3a51edca8548265e06fccaa62ba0d53fc2e26b0428577ac5e27a23cb6e355ecab73affacc0148ab861d8b9d657ff1c549f203a9e0dff672dde8c1c8ccd504e31adc89e67b93556604767527136abf14ab9a72244cde039e7b387dc87787cc9781ba2eac1883c1e141fad6248c59b655beae8496891c6fa8cb9db5e09e3db3e15edd9596e3f120e27e833bc46c12ba3b61671d36b5a7878f796caa45177e44e871a95f2f03df70d2bf1fd17209f8a573df4a8c2fdcdd3fd1738c8ebd324b6dd79b8abbd00e62ea913ce742039a14d4383149178cac2e0cd46cb140f38aab7f6fbaa8983cff212b0f9235a46c91a2bd676d6e86c5b8d8488967bace912225da6114ef5aa6238ee1fa8e108dc6f5a93bcac29c405d704b8605a2a2daf06baac682a8c5381fc7af2bba4dbcee450ac2d5be4f464bd43ac5497c8983d1e9e7b27037dbebb4015ac49d8272cd26bff62aa7411c0166cc371489b20431e50aedce48e2b17020e86d25b264887cd9a8f38d501e41cee6839ee76206380434868df1e21b9aedf995cb5e66b6b369d7138c919929530d5e7352f3ce4c9c89606a94b08fa4c0ea44be3798a578ab20813d2a0de3ac1a0e0b90f26b127249d70fd76e9d991acaed817d7a82f223c7dd101f3e932412e94553d134c3c0d19cda7b5a7423c330b5dbac1d1655871a495e4341adeb50c2580c372bae024c44185c97b598033437f3d222fc5d3b2fc010efd054a9abba15f253ee7b1019d49956309bc4d82de9ccc9f0ce011e37e87ad4101ec77d20660793e521cb478569b4283cfec1f31b4303694365d9892be0adfe27c694f0ffe435305304944ee9a27e1947e3dd514e774b35c1afc62518d8e9c986e8774efe3b5d6e84d7aff3b8cfbe6796262927736a1d556b261c52907675137455ea054d14844be20c8aa4c27e467a9982e6985addcdbc462e2043ed319f0d7107ab7e49f13bc35bc472fbdfcb3071e73e29b6cd8d0bf5f02b60035fb3d75a28cb72f77c5ea8d0681292defbf69d6800987cba24bf14beafb95d8cab3a91eb70c5542b7c8ae826592dc5b4a0a5e8b3797b90c519a430e9bb025cf3b3c1f9910ca180b710039d0f0044d4f5464684665eddfef13e44bbdf24fdbfb044935eaa17e3dba82d9e8aa3a39fa040142508af092d64885466e700b1b5a85daec03863950d83902a27b67f16538159d181e23aa1004556d03d55bd7810eb79e315b51231b003d8033b4ed0b84a20b81e72173360a69cda3bd9faf8deb6d250952b455a36617c792ca07a8c04fa8324a868817c2f937b033411eaf7f42d1b0a5e0f383f58f476f9c8b4dc7da62b7a80a1d361be894d1a7751fbf5900e2b7fd9c4576e65ad1a7534da64f531f42caf3a7070f102689cd2ce765a634358bb93aa4651d3696f9c7039fc871cefe5541edc85f0f6994b850df67a43d37ad0e1b65a0ec5f0c6c1bd0126140805f27752266cd6b5397ce45169fc8f6264c8f389d93d93b148b5e671fb55eec4afddd1b48f4a16907a088411894d93828459231667156e05bc8cd0650bd4def87cd8407cfa60fbb88a230234a9a334fa6bbb77f0ee014df4c0cec9d908b8a47d712e29945de33147bc3815f03f477d9dd9aa21d759d1c5b5d5d6d2c2b9a2a90efbbfd4115233024f0b5331bd07e84c32566c39e9da2cb0cea1764d31f2646455cc942aea43ecad52421ed1e448689874e20ab148cd5aeb8a694791ad64ef068c77c2929bcce82328cd4ade1c5a18c7f03121f5304d298b2a656530c29aa7758ab869fc42d221f5691c6cfcb8618f80245f44e3e18d9f8b4401d3b583697246e3211469c5f310b6339a44f8a1ee4385a0bdd12f39aee838a51a3990fc0b10b5399a5111f32b1c63dc9bb199bbc1115cb00c5ca923db7534e5d19b431d4a8202626cbb61132d4f32d32dd97272bc8ab3b88218f457ecd80b978b874fb444712a90ef4e8b1115cea3cfd3da9081a0b5a00e7c7a05322103a5011cc00343959f81da2a4960d23c4227cc5f991d73eaaf6a87fba43e20ba4fd24162a62ada3fe161afc5a3fc5165b0de0dd7ccafa84a772d6e0571e4a44e6205f1159c0814089d371a993d9963cdca2e0c6b43234e17f0f632b65d541670aa73f018d9ed5e377bb9099e4310d3ede4c22f37dd867aff945ae2f6112a6bd7f7c9a90bd5bc32ce86be2a408b223c7cfa6f34434c1bbf88ddcc4145d22b3ed05b7a3035bcf8d40eff452d38da4ee301193d04ce813b2050c72fce50ca41bddab5bc01562b4068a8058fa84e88d6858c33f3bfabfc8acd7afc586e3735b5936eaceef2f279a34899467f6f1dc43916fcfc056824b35a3912dd4ba41147de06660f8a7a38b632e2a6d151d143d64225e70f3e5e955a6ab9a88264cf7c27cff0f95a35331b526e66f32a67ba498145b2726fb32cc4d1ca09ff27691f99b0ce58fedf57781cd1a9c610b8a009a56808095ef7545a3b989b19f70386b8ebd5964ce060dd96b8073ddf273bff19409ab39a2d7801bf770c5d53370af919197ae6a1163a530f932a084d7e6a7d97d461d52f2e0e2d054c695111fb867758d875099cceb4b4f4fa36a37ac96869e0a8bf157cc1a606ab4bd00b478dabff6208809246857e0a039c9c7f33e0ec0c545bfc6282ac1476cd5d1c6050846f0fb403b0d62f4beaec1121ef4eb57b1412b37d50817ffa7832308c084be2743e575793f73c42d8059a4e109938aca8a98c45a996e3a0ba3d4410ea9106554a5b8abe28863d6809483516833b75094e775fc8a75202945a1fba973f28ee18c4c3b90d9d25a04d6751f2b4a854fd0f7cbad9cf88166fe33ad4ee175048319585ba4145928d6e5305c143d94136d63b0168856b4e41c427cbe4628eaf13ad2b61dd5549e5da319696f60ba0884aec3705e04804fffb5809a3daa59a7f13f9e76d682d15afadee370c97d5889e2d4356b0960dafb7fac5d00b125017076208d52a96f3c7d178d86b6dd20d736070facb00bfb6f8363853231fb1b07376e1b5f96dd61274336134665deb139b0f36ec78b5287df7801161f4949ec167a2dab187f3c2075803ffbba94c6e7465465c2560ae170769e25a623f4ddcef9079a68c600ef98c38118b38cd8332cf18f0302e52e27504f791e169ae93414cee7a013c8af188dbf5e134ecede07e90f3e797127313f0a81ec6c8f624da4d1c15273415e4e66e92cd1734ab994f9a9d5f6d361239d70461057ae8302bb579b41af177ad060cd3d305b2673504e0652bb0e87694c6706769d21c8490cf64e318f16937c1d9572f50416fbcaebf52bb9d9768d33096deb00839532f80955e7b78b362d4fc6ac39d7284682e192de185325c14f6934c23c815fb1da61e0147ac94fd3a86844f5657ba73725397e96ebcb4174b54b098aa02ffc2b2ddc2d3e50346b90e0710e3a7ae69af3a9b16942f56bb872761de45b0d8e62f54ca51bbc731b980fa9a321a14c5be26b155673dee76ece14bb9dafe4855a4318fa75fc3e478a5fa6c765e0a703bf7c0de79bfc94d8d565cec87f4b6ffaa4d7c44089cb96f3bb9b70d4e36b135b9f933e5a22e105de2240d12412564001dcfc6156910b31d8c5ed4bb27c41979d18cda32330f1995d803542da10e3dd21bfa1bdeb5a7d2ce9e53cc56aff55ba5f5c361d668843d31dffc004187dacb280cdbfd13f2f2217c67c623d653f01f4e129db4192768d5ac8ba4b92d7408eebcbe00ebb4ba610cc5b65c0e2006b01ad3ce55d2508f313e473f2091738ab158919304c02b6a2ab37bb3452422e48945722a3575c468cc58cc5b58181bc96f930fbe562f60d04890fd7493cca7171e97f389b3a59dc8e6b1cc7e1473656d941d348e8d8fc6300d764bf325c19805b42b155dc68648c19eb34b09d66beab9f004bec3fd511092199cd22d8663f7a204efdaeb61868940c60cc59f8f676d9632750d941392efff80fb2f9b8f61b5dd8f4535af689934c99165be63cf769b84bd35f2df9fc559efd065e439089e2ebb4eee33d1d0c8b8ddc50ff5998e61467261d156584d2c67249d9e8d05c9930514ef601fb5ec806c7806c7f4e0fae864724a800baa101ed173d20ada465e1d29e914026a4aca39d4fcb96526821f924a008642cb18197f29fcfef02931ece65f058531144a67e47231de9de4531cc3da1958d1400826869d0fc36a71509d67f66eaa732634911ddfd08ecab0d016230595d88b00d9670d999f2e4bad537276230e40fe643ed002bfde72a267be5261bd544ad3a7f64e62cb4f9ba37bb0a1af34ce9433204724ef7919efa8035a43b0a0867a97da982a00f3b1e9d0446eb8f95633745d37a7886f2771586706ac6f9ba2386fc3f867e2c26ac477eb80c4d92efe411156f1c48b1e9e39c24191a4e7043b29b42cc867c961644e1eae9197a5c6f138e8a69259e2ae3f0c428a1a142da3306fc9369e0560d47ebc6050a7adf0a8477e20e9aa0155a3d84f0281ef93b5e221c6520d923a18690f3e978c2f6e09b7752b9d638c4cdd79053a8a3e7d502e76886ce0137fdc02c449892ae8628f21e5066f2edbf6bcc74cea8431f894d9d7248db7ed7761935655bb4464d6ea15705b167235044b01e22b188511e18d0e6300bde58e3034e7a089a2ea71519391ad3c9a626c219ccc0c6c2b8c77242df379928b35d6cc96e9c09015f46f9846396e721f6edfd7c30a2d62af6673349c9b51b1de1819a0ab8525098f5b5a61ef6442641e27f63c38a1c9aa81e5289c75d9007e58e3e12b4bd053338531e8f5b48dc40e626faccc9c54bfc0a38985f1f05336781e782ece60a2185572a7fcf8756d6101f4b79fb48c796adc1476f505c78a0747dcd1b43a67ebef0c5d9a346f50eec4552c9aac9d806fa18588318d93853476da862e58d21a06e2023792ef5b5987c27ee76cef0b813a607aa987a4c1f90e62cc545cdebb25ad9e17f2c049327198b64eabb38c958b56a6a6889079a018e0b13ddfe3d5b9c71a41b3381688e160f972b9e5b11ce0b9a156ba4256ec1abb98e1c9d20f9667fc82ecf7bae1d535c6174e5c3709c119a433993bbfc06e17d4060ad1b4b2627f37d4cfdcfa8d6f2925bc59e30beda91a58778c59a9d4f915468eb1bdf6320bb0aebcb9553a1ce614754695d68d71716bb3a2468144791c50cd2b0c4eefd22ae08552d44a47c3a17e71cb3ce1b1131a5b5f41a633798643a4225f2eba750c8cde05acc3679653b46ea59921fb3888f5d7130f0788f5bfc4dbe567460af26cb3d3392e00bc6b82b58c6ff367d6c1c02f1660940cc860174c3197b56fe18f56029828c93c9056ece7bcfa76f64f9218c2c183b2af51b4f359347999b2c21b1cc121adbe6a23caf1fb8f19566c8912a49be494615b69a30964afa00a9506f9e1d4088c2e4363c4f0b87937050f24a9c8d97a90741bfec815bb42a94d6d5cf12302b6b30af4578dedd0c9506cfcc9573152df2ced960ef5991c5c120bbf706a93a5213a5baae31f73365db5993d82741e823586e1d432c7e0067c0d6b8d9479a65d76d172fafdad05c2218dc149e97e819cb72ae8c092d342a797d8e41a485c37baee33d462b4e362ca77cb040def9483e11ae63bea61457e6dde1752625b7b595af38e3f4ca48e765d3f6f194b36891ea8ffd8d12a1c2bf6be5ad2218cf0dd559b091e8ba12ddd88384b054479404e0c22c9208a9a0794340a0698ef2c1697994ed556ccdb0972e766ed4ecd14e06a9c84387d5e2b545977b02b5e839cf2d7e018cbd144d2e7b33ea461580091adbf7b174b6fc13f50d46f9215492807497aaee64e2a926af0a6a42d3838cd4aeb00a3edfd7c02fb38947902a3346ab181d386c6e945345f152bf38381cc19789ae09d7d8c7782a861e9c2f3c463e6c0b9e08bf95b19dca45baeb9bed73b960e0d5b66ec1081487b6fdfcfad0357fd1fda978f1cab4b3c226210289afca16e17942452413f2df9a60f1b4d524df69677754d0d9dc085ada08b96f5d67073a317186f25e5dfd265358a15799a29e10c246937cadc53f40d82d04c81cb4f71f2164dad7e6a098c1af3f5936190026ca421544c6b401603602f4538a1c6902fa8c9a570d64eac10951a3e9cc5f5f1fb5557c14dca9e1d06f1f6840fd7fd099d8e3b2d39a037af7cabccd604a2d16eb85883feae7986f208cf861f552b0ed927b3ded8805b13da06d84bc52291185da30c2ce5386bdaa3e12d75bae60496720f9ac8216444f3d064d994ae46c82d515f22c4c5024783d4fcc28f3a858c8d2d2f3543681911edb6ede8cd6f45ad251a8df1eeb40daede9a4443adf79ae6882d6610a9cacb63c4aabfc12ebe2744cb972b7283f072ee632e9bdf537561117041c333240f0490082e500307fff1f9a7f1a80ffdeaffabb9f78339bd1d0502d395547ec4c0a5dec7f9aa8123c0397508d4810c5262518e28c8bea8f7f87e64c361d7ab8973076951c5a84f4f78e5e6e707eced27a01e2e30975ef3ee701456cd26703c273762aa75c7d19cde1f9fece9f5f47bce7a26e4663cb2f2c608a1617e36dc0bf93b3f4d0dc19e3953aad2260cdaee18db8247d4b9001e5702b746482bbf5825a78e4703886da824ec789cb366c593e7ae59bbf79a7bc5aafffdad09083b38b6d7e117c1513d23ea4291c240c0c3937e9597d2482d089642e67b7becf34737b1af3a9cb81a96c2acdfe31568d5b18ce3fee256001834201cd8cbc098785d4630dbc210cfbd869f64b15f897bb4827a984a6e289e9adff9b5f6f33e1270c54cb2de87e23d80da7c827b42759137c834d1eb11553a8aef4c9ce7bef29e8cd5ec64f2a882995165178132ecd69f90ecf7915da7472e5b2f72283f23a0688e8371b8c46aede6b2debd4d1858dd2f20379b5e96a537a153a35f68fbca0bc965c433343fcbf6d51976017f2c8c6704b5e13ba88ad469e17088f296d8dde0ea2c77552fb29caa6734b6ecd8103f57d6f22abbc36e305e38cdf9808b0160562b68765b95d07fed96e5071893d603bf5b5a16d3a64b11aa8694d71a3a2ccaa9ab3eb166e0095c50734d61481e955375da82e3ba1c0ae3daa8b320de901da6f2a8faf8bc632ebd333ad57389cbaff9c62004579dd9c36f4cd196220aa2a35cde914fb93ba9abed6d5e2278c1b4d3b1ce714f7036676cfd3c97545b8124ef82a6f71221b9d255e6454c93d73c22ae245cdc0cbafef223e3016825e35aa141ca4a24847014480cb893bbadaee20357a57739b56dc397cdc0221f9aaa3a0978fb0237d4a4d179ecc902813acbf37ac0d68fe2fc7ae8e7482c2481e02136666870c6bf591c49238fc9d883a6ee67ebcea710957578c241ff04d1cef0d556e9b10f835e8375b378a79555a6d5e905f563e89723bba3033f3f1d1ac678a1356a667cee1edd97bb631ec5fb6d9dc32e62c35191b5f801b70269d347e801305b84fc0552e64d1eef08ed3b28519851834875b8a01f223dbb670f70024559c0a159ba8421467255a9d83f1954e612b015c86d2275ba1bc3c1585384c145e38ca4a9e42159d66c6aca39fdd1ffe493f65ebb0dd799e1eeca1627792f8e418615ba78c2fc67207b3f2d802b5d300c8128f85cb7304fb3f1eb13f552058b849e0f295909004de726773711962d8e158c9ad8bec238b6933bf6faafb13c59ca0c7126d217a8d41536681f6e8bd22bc86727bd030761b5740f3a10683da3fd8e0589d9160e8aa95f988fcb6cfde187587d8f471eaf2fd9bddc5e47d853b8b1f402243f1dca3d2a88348733a26fe986e5a16bd10bf57eb17d70f34707d6470a041ccdd2fcff87ec0f9e71c37633ccb564e375b5f7a63ee9aba9c90efd0fcbd045892f3dbb89d5524303b1d98fe99476dfd162d8a34c2b80a3d441d18527637b160ada1452208623c11c056a7b1f4c40c7a0de33ffc35b44a3c45642468a422f61ddb1f053361e995274f400af94ad584d2646de63653239dfba40a33aa49ac63a70a0d47d5a2b0d743a25c64f608e2545bc2e0c5f4a3a6e4d88a90871b0c706ca15438ea4cda5ef25d4c98104c683b452f2fe302badda760d2b8ae3e3140ff07d0edea93f434e5321454d48734014bcd5c050beae247f963daf32e8e2cc0959fac3029b3bc03af250e9ca875a9ccb14b2a042794e74a4ee5572483ac00b736029f038b5e420107b1369aa924fda76fc30829994f678b3c390846337e636648dc3bc9fba891e562661c88c2d147bb3051e076bcca29657e4d2e58e24274d0f8f05c8583a127a4c4b8f364f3f9400fcb94c895d6858949cd4d885e1ca2ee2b34096d0bff4c68efb1c7c30d14adb6811093118db7ba0dee7815e83e18dd48519b5e2a1f6beaec53dd2586cc3fd24215d38597e12a3de5df9e7b11319e00ad9a59b592bd7b11067122fcc9c38b108c0f76931b5bc35dfdc31748e6c26e41f1197a6d66327285fb20ed2c4d402589876e9e05d2415c3cf6928518e9448dc4199332ff1987df2f53c10f6cf2bc82687741e55676529edaf44f760fd7053eb9ae1632abc05893e68f3682774cc46df23297807ea968015aec3e207cf1f3c6c108506c773fe4683295c2e43e0a37f17208bf7fd32ed50c264602adcde0c9ab995049ce46c8f109014c3ef10ee3ed3cf89be498b3f26dc1e02e3994ba9a957e7b5dc3e9d46863e472c5b3ea6e5496ecd0f004a4eddb5e53f89364e8044fd24a812f500a466c07c43321044e742bb927e33df5da757cfb02e2215f56f1c374a30eb572fb88c5f6c23a56e5197a5811a3e85a40fb4a0d4d0badf7c00060fe9d8ef7c959de67e19085c80a509d8263d52db160ea1e8d917c12385b496a36645a7f64a0250359065434b2145dc97a70bb012c8598457df59ca3d848308c861284e978b9b66c4b0bffe789f6d494c913ecd7f8fb1d1dd19cb6375e191612f7ce0e9b061e8552b8c65df7c93693d66753fbb09f00bd33f0f7da88918883f708194fccde19a09a885e2b93814d0039a895bcf4b035cf644e9e26d907716b1e9305caac5ba37cb5afaa649919a77549031c481027a9b71d6470d93de8ae83a18118152a56cbd2407616bed026c329b827e65a8d9a0778434a46480207f6b58bc91626dce6207262f3c190291c46f189415cf6e3504fac837399ab00c55bdd81d03e416535a5814c9ed6d91ec24c07338997ed4720ebeae92312812fe7f848958b094012dc567359c984ca1ec6c1935327b3c8a9f642f5f0094a86c2c1801d62cdc34b95487ab304039efcb797fdae8ffa1cbf2b7e77b6c52743d7bf7862e33d3efdca79c4053b4f89bff367f5bf150e070b8bf368b37fe0f722344bb82249d2a7ceefaece97b24919a7c37c35605f33cda48cbe57873ea154a5086b6944ed568466c749f9aa88703c9d2a3815eb4ff26f5cb092a0d8031b5cf6ca408e4252ff0577e09f7cd35009e346a6bacf75855f0cb359f322ce0af46c0deb54c2fbefece91f678c7c5a07267d1bafde05a408c77d58ada1f92cafd0ececbf9d042b460b49ad1e6f4c4283593c53bb79d8591282e10426a59f337abee32e3f876ff255d85a7e7b42276063d8b4196beab46ca7e29a8417791e55480c15ce70e87323c837c8903bcce25191111b1faad4f70a5709234be5619aa5c2a81f5a748b3cdfefb0ddee7fbe19ca64a1dd50c5fe0271439250ba77ac6b890cdde5d5c6af809cc1860c145a35e442de754d03f499a1971b0d29cd62b9a97812236bf9ea19239717b67da43b164287518b978cd0e5e33fe1ff4bac467d057814fbd17a42c8d880c0063665eea24c47a670a9268c5949bd6441865080a502ec318d0a240678d49fced594e90f304e02b5d5572fa540f6c4603d40df86d8633f0ba02481d8635e94eee7db5584417c02200eba06fff09dbb31e00931636b0ed224cceb856268a94c4cea0a5eb8a3b82c5db5da27c8f9d5fb5fbc45b070da8603b238a8758cbfbe3260d54b3fac57829e60a48e2ad67515d3f5b05250ea70d4c2059c1f5b76ab18243df0830b027259cc44604cddfb17f62768a3b02d63abbc691f74807cc19cd70901ecc279c91e948e97e09def13cdef733902609d541eb894f3b29dab54b5b834ccb422484908c00a9aeeae884358df012b23a4392b8d2e153daba0103602ca991794b1ae001b55c8523500bc5a1d15fc637badf4fe12981eadec0d5fd51b00b2739f455df92e0299b60692ef418c10c749032ca2990a8a571f21a1f85250855d807abdc410ccd5479e60192e9912dcc981f6c82f189b3d9ff96ac6ba4adf97e72832cbcd2c481297144d37bf0507560d9ff29582464bd9c171b9de452da5a6189803668b92419af4c1cd69bb95460a4f836b69bc003cc89f2b3d151b2cb4bd092baea850cc1dff8a4b8f18bd61d3e19a780a30b74d03e3377e3807c41be2cb73b8aa32230c87e932e1d22aa894b6e14637cb44760482a4eaab789d0b81bd10c97afc7210504c07704c5a3d8e1a16d0a5a18b8d4e3600a31d7c8a5cad4e8af9e9e7d26526e602a8612c825aff059e85f3aeab0bf90ba149c62d48e8de9f013ee904b9e7fbb8f52ad92f5cff139b14c6d9548e9b0b110d059234ed970682295a1a28f8a9611bcd0fd3b6d49d1bc156b8fccc9cd96f8b4cf0aa2943d1972eed1f80f88557a69c574059fbf15c05a7165d65801cc0233c76644f98a10e9e87de4735e28957086362572fdb246c308dff7329c7709fc0645059a787e6160143da1797fdf7940a5143bc5b40d23f1cecc6c3e535cc5d9470bcefd5df2df336c2ea14a60abb509a5d357349dafa5cbbc3abef027da968fc7d2d02d02fd36a927ffc500edf1c5292b36da0c64f5dc66cf62bfb240657226414e7ca5e6ada407c2961bffd1d6d09e0f4845772b0c375214706cb52b85bcbad0546300e2c21685b60751a437e9bf0bd584f301263bc64a2fc54a929874efb29e983b145fb8d4079be29d3cf4f71d8dabf0fa53e45045b0d7232268ea6267630ff388b7384c343dd0a313e19e29484ab3f0571234e7d58b1e6c35da177092df1dd0a63c3a6ae61488a1c083b433394bc2b54d1c0b8326f661c71392085568c869084408888da2c032f4deeb0e348fe6a5fc20c7dc472b017c742b39b7be6300708d6237c7705c8112ce2c925f9b03fb6657a454689bbf362ccb961076ef794825bd2abf79cc6c10bd0c5b5d896b063041d032b05dc4bff40eb1868b3bc66a0a62435821d2817f19bb1d60ddebb8e86e59552909899b388835b22f7ddcbe94da672903fbfbdf4642a58ce96c95be0b8a5e113285ec91729c642d60aad0598fe0ebc9b1f4ba32564dd739165e6ce9ca0c3db609d1bcb87659c562235e9df169845b51abd3a2099598154dd0797b233d6b70b7f10ef45d754f9c6c62c4dcd79c9051c2417ef535ab650f7c23cb7e391e56c175fd1b2a887290fb90fc22e518291c1e85afb4317d5a6f499698c991725f87426db14aa0c54e71ad6c5dd559ea044d42e90e3b300ed7291e700479f3336bc414ccf3d966dcbda012bf9f5749b7e5520cb618ed77a6517334156adc0907d59e1f77fcc1bb5f640e236b617726c23b7321565d17c1214c6034bb3c5f5f22195f8b1dede9e5d77f2452991c0cab2ea1c27bad85887e07e4ed3e38378a0f28517ed8545ab69a5433fcec0593822a9a84b8a6d744bac8afb6e32f4aacfdbbb0d0b34d8c9a632c3dfd4624e853e0d099ccb2753bb422e1d76831a7305a3417fe3127b2faecc0fa03a43fb5ffb3c2189fe8a6894e4287fb100281e52aa6e06ceb1358672bb32448dbe1bc31c98be87caec67105efcade9061008a7e03ea08fa1e8ccbce9470dfd695ccbac4025e83c23a04556dc226ea90d82c97d92ce1cf30457c2f8d54bf55e4e8f9334a6f1cf8e2368b893a8360800d4baca4fa358f4c29ad92b5d4ec6e6036af68c4cc48de95309452831e9698ac52cee5cc6d92d0798ebfe001c6f97248740b45bf54b5f906aa9b07a709343ecac5b2b95399cf84b2d4898c451badc4407e10a1bba442dc39c2e8f96aeadee2d5f3f508c71695ecd83113647bf6d0b4e42c52d08213d578e0c510af195f3ec59bfa7a37aff8d872915f2ab3367d48b1df22c0275bc0627a212f13d8afdfd30b4ecf32632b37917bb45da18ac7bc12e78e548fd83d266d31ec46901582e2765bc09b4c18f0bfb38ec68688feee403993e1c7dcaaa8432f91705140b4de884d6888711b82ad8180c2dfa1b6beb6949194a2fda446f28bc8cb8ae9867f4a2294ad15d176240356254dca8339de7c636bd5dc1cc139bce3c6fd5f83331a3e97eae02b254c8323555847cb77f5b8cc854953522d66fc11589ebed75675a929cf0183394123f84974798b20ac0936f2895f21a37e26d16181925590d5f47091ff4bdaf518bc698f94e14b3b19f8818cf91bd2574458f61c3d50659c47d5b032e58ce38018e7396ac23b8320ac44758a84b9a6b0efb05ce21c0ea33f07ce9876c456981d4200bbf7f0ad59740cdc358f301b6024547786c8250ff71692d5fd0e749dee107a144be68746c3c86281e84f0b7ebdb874710518e4efbf63516c617444880ade69b76af9c1c711be31265a7a4b275ef5b4d0c2517f410d2e9ad43bab39e7fc4d565363a4e7dcdc4c96a992c126050373a1e2c9f05a001e403c27364e4e024cbc16882d650702176a92b4b9229da2f07578c49b2b175364274661ba255aacd3a813c5ea2d22f1a41d355838ac885e30662bcaf90e893c4829818a26e16945f4e312e6cd90ceb86311c2c447e410099a4a1c380220348baf46597c490ad10c419d2acd273f4ba258399456bf6cd9e5b551c1d9c390ee9b0db9a4270b94841b4e99b482237c9799c9db241c40354a54338ebf4366ff4b662f71524faaf6126582b04c3480067c3c50157eae0684206c4761cbfccd8a7d4affe6513f477a16e068c05428d164b2a040fc9573a644efa30375f7f530be03e6d435eecf4201df6a23489702a61971337d0feb2984620d2effcfe850c732b35fb462c5852e21d8eee7f412a78796d1875596125e12e937b35e9cbd8761ce01bc6ded149a6002b23266ba5fc99f059129720a665158bdafac1e974ed3b78e03b12413cea728397fe96092d8a911008ad30e414ddc49f8aa8a92cb99814ca5b99dc241f4282c9145b759fe390d49741cd87386792f1e013e7b50c7ad0f46caf6e19494589605ae49bea5fae31e57064edb9f3e076fd915fdb99d5369557fbd8e1401812ad5e8941f88e297bc15999c9ef3bc63611a98111c9c8d9343b8877ef8fab776f521a4c4eb2f12bec1c014729d6c84d5f2002b488d2132436ccc617bf50a3199710f99cb4bfbfc6b93624fff6c72a5f4a28a33b9b4aba7111a8e153b41a4ff1f6308959f548907007387d375b6311d24dff1cb8b73541ae2536730c7db19cc98be18f75eba3d1b50ab112b89b73f7340a8a88693edf02fb1cdfb41b11284f233a57423cccf4dce191ec3dfbf9a8571e4cf0855a68a330946c15ded50298c703415c02c4cab3c39df5b1c914c93b6c8854a5efb34dc34d81e8e99d0659ca5dfddcff7c40c9ec7ef509628a037478694262c84fe2a0328a709876323e767dda79e21a98a0c3aeae390192f91decaa1f325071370abb9a1872958f8cd9d35e920b7d5cec5c6e37ddc1a0b7c88f53036cb7ab9fc1f17755ab56f3f8d0b448c657ab6908b76efa2c3f55917a746fabaa6f267fbba8c21216e707354dc0063e31c17a5de98cf1e39ee2cb3b0e5ccf4acf5c1e571517990b76bb55be161512fc3e9ec230bc2d74e96d7530a9e856ff77240ff96144215e85d0277d2123af9dd5e299a90e3f8f7c0a98f249fe0cf0a1b97ab9fda93b25373a6c6f7f768b2b489591639f038c7c4caf89ee1e27caa6db6d3fd41052fc7c6486ac02c22fe9562150d2db69a2db748353cc0b4ca3e271ae3d203a986067510f7341db0a9773c50234a9546083b7aef10477ff46f6c373e06a2eb3137d8bfca9741c736b4be327179ef940fa68b7c63e188eaee21f4094cdffeb1fcf8671cb27069c92388954436136ef62e520c0742e1ec2c112717e1f6fae4b668ff427336186475550506c0a0d0d583963cbb18a3c082b7efc0e80f58a718f77561c7cead23cbc6453bdbae90dc7f16d8ea07ae0f540bac5f12e9a7ff8ff2bceafeb151d747c5025c161f1d45f230113d7b5ac8905242f54edce0b6b1d1390369ba7593ad88a7d8ada9956da2c2c0a18790074849cd5b0e69ae762b162a24b95a761231d55a1372104e0885bb742891ee857bc80f3513388b62bcb4448b56b71b9ecf3d5362f7c2b616be0746c23bbbc9f9f16f7b38fe2598a812ab2a3961f4aa13ba614fa8789c057b6b56c41a0ce14e80f4e89cd0d2452c29a3ab57f7fa635709518732a2e14b7625d7781f544bdc6d84c3bd23aaefd95e31c450b94c01cecc6296bda46014eb837a91e29495b5b7be1d800e4b72e08381294fc2e109b4b409fed2dfd737bd1d24b963be4443936398ef048689ce31f37a3d17e581f1b8c628315d577b958f562fcf8ca2c4a0fbac1fe46a1cf2617bfe3d151204834a40df4c5af405d548544eb79d99d958689f272b2cb2a8e1f02b2c4da0df089852746b039aca34a81944e49097e9dd03a8d98be2eb920569eb48d4b3df30644d02f060a3cd62e337d69bbd86d99951ba7cc290c7ba6e9e275527886dc932b14f837db8199156c706a10368ff11de2062835fb71018d3f9c32dc9c0f31d8b8453ed49b59f3fa92242ea681bcfe68f3e689338baf760332d5273d2cdbc1efa388c94f752bd4bdb0379beda4a9ebb22379704245b9bffe97af747d70f6519345082695d4a0a17a6795b7fce717143a21906f3773ac0eb61066199480630c39821fcf575a1411aac11c1950cce06907d90c1e7386a492a5c917a4b85cf06a5d136dedd69fea5819873e12b13823d03b1290e068294a24499b5818a0d12d90472432b1cc74584a200fddabadf7c4f08bf9c42cdb4e3c16f8974b3d42c62a8912b2b06fd7c3a7f2c741c40e4966a386be4eddbdfd377d445e16d0d20f496e7939737354211572ca241ba2e803121e0a129e52102870b62dcc31c9157ea1719fc8307767b37db806885422e9cc4c8cff05e97961375c8701683c58984c5d830b7d8545873a6c59f6c42a254ae1af9d72dade24e83a04b43e580774f65e828c9dea8fbb682b9487152fc877bf291a64f95726287485602880c3a1fffd2d7d220b043795fc7f82f2d0467bb01fb25e3ddd14f5d1595a248be5b153e549f789119bf744828f41272ae764c7f96f8049e4592c7d4ff5e46d1d5b00b68eb241f622dfee8bb72a46e33e00763a00c25f49167a79a3f6b7f406bb5043fcda1fc69d80a8dce6c7025dbc0524b2f4ee468008ef7ea78c607b30765206dcf2b946a358c77ede77a4b174b06bde9d8ca45b6e042ca29dca8fed5127331d70d7f4e569469559ecb8162c90f65d324062c658c32892a19f7f2c4a5e45128d964b45548d7e25a3734fb949fe205215fa954cce118c124b4fa71a7f24937247a3c5d2d2ab62dfc9502ed151598a54d5f95764984b345a2e2d5575fa99ccc6898c164b4d544dbf25937342a3636952abe66fc950eea168599a4455f8379995e7f636e50792aae61fc9504ef1e8a970f123bc1d8be89d8633575f1af6eaab7cb8c27e81117c42a232d7ed30fb660ec4e056da2e1c195a5d9e46f05724f1731bf553806500b5adae37d30eec4e927e52b2ddca8b5b594fe7f596da0ee1df4aa65a46377e07b15664613b669c196245b7a2fd4e8c3803329547c2cb0b0be78269a22e6fa944897f8741c62d1359b056813f3545fdec039db65310fa964b574aeccdec7570a52665558f5c722aa4a74ff02e0479c377b14e82d5cb867e062ded98c816059167ae3ee75df2c7439922e36fbb24eaa8806ad59be976c4be1a8ab215cfb3678a8b72264a64918adfc64a30797a8b4c16b3c8321f23b5b3aabcff6474a16ab96e5f760779dcd13d7811462097df477dea32a1a5bc6a483a955f56f7d2d0a48eef12d404bdccffd6ebd99dd1e70f147eb21127fcf36c22fba46bae68fb630fd1baf845b1ba48a9983e84e20307f7132be6987f2fa9e52a2476b357f715c2e25c166e0db2d72606fe7a6a4d45d9fe9115eb40d21f0f9a3e00a4b8760e4d27eb55c534ec6458d4be396fae1dff44d010c989dd574a5d884d214f86462e9339a87ba35c8dec0df1fdac1a096df4f6b880e156f8c8a9a5a10e08d7ef451b9218604ce9cb83ed3019c6a176395703110cd0d3af1353263c17af13e85d00b5decf589280c8d539a37c17fd579d8831df0f447ff45154d4b0b1ea90f53fe6385cc52149fe9b947ac5d65b8ee59d45912770706bb69b7440dc74bff1796133e03b9ab4e9870cb027794a2663023501fce96173b44b5145c3bb1b602944a6744634213576d3f9d62e9f739d8d48059986efda53bde3e84c13ca4fb6b40e7a6a6fb828367171a5112d6d45535091ccc85c0a4b58326d4023fac001f6e78c76f9389f93eefd24c58aae99beb19e373412e373c73405190ab28e4071c9517e9c068c0a8fd36eb10dc2dd58f2d0f3fb0949d54759b51bcf0a52a30218ac9ed1ec2f6b3df1f2910cffd9a605e6c28522ce5dd8d2ca5026e9b01e98e4381e71129d7ba84a33ee590c27335b6b424f5fe513ef081c031e9dcfd383ab6435d6a3dd9a3200eafb3730b365ad63fe61e21bf2b4b84eac696de0406ca8a30e0b48eeab93bc472dfcb7e825142f9bc770b51bd90a06e8587c654ef81f459a259e7c2f51d1867f67c7a08d638c5ea930453add8628bdef373220e73c6f158d28bd751b2b88efdebf96e80c77c1a4033abe1a22696be1adf9c70b8891ff70b880cb45bf8e306cc5cbbd8e91ed7a179cfef0c942d61155f9520adb4f115cea994ab6317f54c4e53440a5335bfbc4ee9e83d81366bb4e94d34851e2a2b6c7e029a2408cfd6f81c2f177d3f84301f1e3a343a709e20ee233e1e5b160feccece99f50252ba9e4cf5854e7bdeb7f545a106683db9df79d299f14333042ec18cfd4ca48f0f5967cb0aa51c1255299c5d270c4e0be5f0f692f3f70205914dfe88c0d276313b4f6c9b685652b76d75fba62150f369f35e4d8c691cd47866557e01b16a464c020676bb4d82471b931e0ff6099fdece1057952f2b7bd3488ea5fd84ffeb39ffe09ce925f2ddf70e673fe1df83de42cf77b2f227280dc5206865133fe6098a3d141ccafbc814c661c82b8d0235892dd98074c082924d327fda76e34fe428a001d8b6514f2d5c2bf1d78c4ac97635b62883b1707c2ac672b82c1bdc98fff42cea89a8af0bf976a96d96c44c2f0469a4cffc54c162ba09bcb9b283d0283a6c69356458e1605050157581b60739edf806021371fa16914884d7a3c4460e5a37b98a96294777b0830d704566f457ac4a8982a81c3fd97c90f5fda4ac8af6069883057e3e52894fdbec823db3d6d6dc1fe871f8f68e38c821e1efef39cfe504effe4f7f39112a8223a31bd8db1c2b3aa9b4fb6174ca5a80711e35b592fe7e51248bd78b00a25c1f7a131b60a3f221be4ee74c9de98899b9c4f9be095cccfcb78f755a0a29b00787839ff854029b409c1ac1e41b2a6b2c7760118a226de39548f5e01ec4403eaf386935b40d4554d1b9df2ea0eb6b12a7c9e578caa1f3a4ed2cbbd3c14f0066ba82f175e96e27460ee74b757b03853a5ee3893f0d73176004761fb407ea78c4bce5d21f54bf302fa031420f6c17b399deb6d7d33b3b596882412d9dd9b5b061f09ce08fa08dac71bdafc9777c42a1a0c9479d16731dea07a32c49f39c69f3db6ad86d0c75c13df5f0b61a2385f64b71a429fcd994579c7f8214c88b6554ead61a76bd46cb0da71b4188bda1be2c92057e6bfa7a387303f7481bfbdd362b435f1ebd35cb78f5b56a18fbdfc873230d0053efcfaf277d458f614467b2defbca37e4360efde10b387969a6237759433bf219e0bb2c290df2a3c088758e863afec965d8037438f99420f71e879f40025c435f5776808a17cfbde669597d42d242205c2eca1cdf276edd087965583995249210c104ef830075af80e4277c1d593013e85380fb33665d6df21e843cff797214acd3a5c63ef77286330c208e3b3dbb30ea75f81f1da09ca4348c456c932abd4a73fff42e8f298d5b376c7f8f91bfad0f44338b4d5f02c24c2a4f40e8ee083bf6364156dab015ab89277d572ceb20ac43038c46648045ce9f773629982b1477921779df2ae30f2befa24ef938ea1a7a26ccafba4f767d2285f9148442bcd9eda1a7a9be50a8990526e1d72cf7f8fbdcd8610dd9562fb5b87c43ec56ad8cfad06fb35a1bc9fb4a15028a4e5ed407a3e24e2c960b30c89782eccc7de5d90080c833ef4a3945248048f940763072bad69edb595abe5cad14c086202cb95d2d6ba7656d943eab67f78838e6118e6b8a65a0c738a598dd6f857f96ebb41cbdb75b52e4dab94f4a5f4af2fb58c470f74caa736490df63bb4744ab3b73f4f86f79905a2be5d63d695519ab775e9f9f429a44e7fdb682923badd908f3df6d1cb7f1b032afd979d42f8de7b49dffe500cb32eebd2d96f38b4d5a0bdd4b21b73a00b0c4149bf449fa4d112fc98431fd24c0ae568a865da4a5bafee8ed91f4db79f585a9c7d0df8e88ff0c5708bbe52bd08d7bfd19eb7ade61af9d8db2be0ccfebdb7d134f6b2e82f6dc0de47fdb24afdeca7ca571ac4811107fbe9bcd0efb70f65369a7ebf6db4b9e5fd34f6f6e57683a6bdd0dbc679a1b10fcdb861afe51df5b457606fb3bdc2d92ba275698a611866af782ecc1c774c52b01b488479c711ee8fa8b1b171efd902fafd0ee7f1dcc65737a9a4f3023d5ed8000b2ae84227280a551451050c50a4e974ef95a10a54f0e286889dd70ca060240b5580a0a485154ad0fb7ef4610a534a791dc50ab9e974dd955608d1f2a3cb6833524a29a5f428dc90763d5620a169d763c50bac5841ca568ff1fadebdf778f87b47a80f67053160c1148428f2634626d9e2f45e172cecd11694165f5b560bda4ac26c11a995ce7f3158f1c30a20f4a5827c42172ec8892e7a60e002101051228b236054604a29922060424c234d643f59b8a08b246a488b1a6073ce374209383af8516d51e46584049b911f212d5a59081911428b6f4155a1f7c3cc1ffc04e962c6106224054152108222ba98994fd0b3d5043d5b58986861d2aee74708da6ad7f3d3c4153edadfa970b7ebe8b8a0cc7cbda0f97ca0cbcc1e98a9d65ce252bd150f3a2a1828433ffe9e212dc56f26e2872ed34762951ce2cb97d903f5e38c9bb14fa3343834e0cdd097f169de313fca1e8ec8e14541074448cdd48fdfc38ef9f46bde31df033b684ec19f2d7ca466e247f9fe272813a3c7905a02755472f051c921fefcf8f3cd401798a38f3b4d010c94f119f756a4a39fe843ef38b2c7de496ec3d143fdeb80ededdbec01d26fef66e8433b337a986922a98e5cfa3d0d82261f4f3e8e28e9b7fa767bbbd9ace28f79eaf94097f724ace24bf4fb90ab3cc7578e6321ce217fb3f5494fca1e187d7d37b391bef4a5ec01faa47733f63dd3b8e94ba337bddb70d02ffd4a6f1847bf376195f93c664c6f25cee18f43f4d8c3cf8123fbd0c3df21871eec6b2ffa1c7ad8fe6e38465fff6d38e8931e879bfa24edeb93b24afc93a7c30374793fc22995f872f47b93b7632a6195f978e415e193e31c19787a871d7238c001bf430e1c2a39642f7a51f680fdecdd4c7dff1c3854721079607bd1bb19d27ba6911f7ff4f4ede8dd86632361075de408abf8f398a96fa303dccc4df6a21cec67ef1b8eed451f71689fbddb70dc2cca2af0433e1bd6b0c50eba645805661c9cc7b01dab557190f6cc63c64197bde3f2905ea5b0cea19064c690438b878a28a620852a8650c5135b20a902085508d90289166e8b696409d4220659b46401934516448440269e0bef00546cee9f9b22678a9d2cacf35b8509eb042f1f0041a2053e80a620a24e5144a49452fa82042fb2e811051058aa264c91925300b115714692cc000648c879020b122029a26416c1c22cf2df82d292e8fd30f205a6d36d02e6a6d375b265694ec2dc8210a9784580a45862446e9b164d678e55063e33bfe6bbeb9c5200d113cecc39a7703d5220a1a3763d52d460093d52a0a0ba2b59e731314a2965941f6394d5616fbea410ba3f1de7d7297fd6f8dcf033c043bbd7079d601daa008efa8d82a3f82af31d10b2f043cbc7c14d8e5299d901010b4174fc07788c6bd8934aa57c98f1afa10020a89d8817dadf8687d5cc7640fa26a67adc6c3947b89e2404d1db79a1fd27a6a1881f4c430a5e98861424717785b642ef196828c2e528a75d6e0142f3f515174734e028f1bf823bb0ce7d7c8804d11b0941da5fdaadc8b55c71f77f8bc570ac4ab8d9bb1bb27f4f6da09f51fa6e8335f3650dfc8abddc68b08859b8d980fdcb1bab811f1fc370cdc4f0d3957afca145851452b4480189482185132228aefb50dca016adcc26e69c73cf39e762759473351cf552330e7be24f9addf864dfff9a6cb6351bcd317f54f059e285bdc458deeea5a5f3f1d1fbd473e96ff7aa004e75ce39e75eafd7eb85c1fcb0a92ecb7ce010dc534a29a594baa716702dbc5dcbb56668a7838777bb9efccbbb02da2d40bb8d837e80c96f1ca6df10d0a1f49b02dafd6757b509e99d647272147d7f137c82df5de85b8c721425fd7bccfb12e9fd4d3896b0e628fa243cc2308ea27f310c8ea22fc234388a7e082bc051f437bc0047d1d7300eee6586bb50fa1985c16686c965cbba960d43f346697a43bf75b8ad8630ead2d7e8d3b794fedb68b65c1d45bf06d430d632bcafde9a8ea8a337617be4dcb6d7de7b2fefeddd869dd6b4cf360cdc5ade305a7bfaf06e29fde6e1fe23bdcbdb463f1df4fb5d01fdfee2191ce55fc230b80b293be86245d939ea8ef04397ade514da556fdb5f283312bdff083be822ca5b0be1ad9df4cef0c641d750c843e41109eb5af6dbc1ddd539570df365276ae2ba217a9f9c75ebebe03fa8221fc5c90da133c8c0e02ef269adf70645f4fb1aee53b5b6d1dc6da3b9563ca4e25a148d93c27d79b768f7a2ad86953b1291e07b52bef7decb1abef757229546b7240a6d9acdb04a4ba5520925f4dec68a89911f6ec913b0b8425ba8c5e7d8ba1ce50fa184d2bae25bff98dd73213ec43f1abec32b3e873fdc6aa8c11f26219f18c28d765e68f74410549a7ab4367acbb73969aa325fbecacc37a49e3f330f8e923ab8ef71019380398039c0b2c0b28049c01c68d192452041022176f8b91777e4de1c91e349f7ee1cae79b77cca0654b97135fcbb23a575540d5b34fcb875d0d5dd735f5917610220841142e820840e42e872749492fd9c73d139e79c132269c0f9798f2ec6186394714a39e58b2fe79c737bba832ff15b427d29a594990cb489e56f7f575c11535230b1ac6bd936c84129a594524a99922cbd27d5325b5ac4b450c8202466b09241363641adb8f0ab6b502ea105ef3d58a7849308b26a37120163a5a3c7f654617b6c8fdc82fd018c9ed9fac02d581feb637b9c112058b607c66ace39e7bb94f24d39e784320a1355b3e0534a1f09a35069100c823e300a1d7d07aa3db38cdc9156e998f79c363048c77f0ebee0111da1114844c7875038c87234e4c7bc6d601008b2130b0b4bef98aa5a66ca722ff06b9114850206b9ca0537308806d5278db870a0748c31daa0748cafe3c9652e34a17e98015d207667d005c02bcc703e2e56144a145824817249213a29658c313af7e788b858fdbd9a0bb75043413e9aeee8f8f4e7461bba03dd1e6948777adcf8aed21b68f97b646345cf4c7ba4b8ef37eda13d2e56baf386482284ee8482a2905187c778758c4eca7b3a611fa3e91423866f30f952ca28dfe918a58c523a178394524a777902d39df2bd974d379e4e3173ce39e5cf77d9524dc68d86423a67ae138838b51b5498b38347cba7adcbd2f1a5a3d3373a669b871f4b5e61889ebf4d51cbfc5aacfb7ebfd67cadc79224406288fa583087092bb7fd9ea1e30b3abae888b74947142773822e8e069d3235a00b9c610671820f59f43eed93ccb096671bf702bf06e1bedf313a28c47f33e8f856310a74ce2ddf396abb417f3edd6c90b5d61a997da89122b0eefd007f7e200677c71bd086f8336f2965cd8bef0921ba95937bef6d938ebb3ee79ccb77eb56bae73086b649bbf489778014d331fe7332d7a4a710374228d222ed9b0da96746b917f83228c7d32e5637e9f8bedd38800aa2c0c2a4a3044274136e34546201ba40e8d2a5941b8dcbd1739449b8526340d4116f202046ed5a60f4c8c49cefa67399b1f2506d340b683ae678837ab4eadbe6a4390a5e78ef95394197aadd2cd4eb28887214fc532d00910b778dd2dfe90601a6a8c114271d1d551df55c00df437fb93221a18cfe4e4777f852303fd6701935994d7807783a450d02714f8ea2f127cd6f534449dc48e76643cc5adc7eb8af0694aeb9296a30450d7454b1c163b680165b485e47a2b09141355a355a2dd753a4864f0d25f0d41af343f2644efc0171dcc74a257bc4f86a7dec61420fb30f61f75a962356ab7d0da31f75cd35365729738dff76a366b986d2fc86a8f9c10b4f578b32c68f34520b68ba26e6d863881e43541e92cea75808c3401738f30d305006cb427a08999252d9036e34f20d41690f177b3c1da396326f1b4a13656ea123b8f0e1833de439c473414a19ad878cf01e1012202440488090908090bcf79e1c01e92d7f8404c87d8c46385c389000917e8449190712a087c385030990fbc0f11e123aa7e9b70e88e4e1c09ac7d46dd255e2702dd1f371b894e8f9385c417a3e0e57123d1f87eba5e7e37001396a8a74b8ce80b0d1f6f79d9331f9ed3f4ba5d15707a4eb685473e9476f829d7319695f470ff368f4a4df5507bc58d4c4dd32296ff7a3e95fcf3aa0de444f5f6eb94634efcd503fa8b397ff903c244f8651aec97ed29c378f6c02e9fa0f0916fa1a3e5fe2f952a2b494d5a4ebcf897780f5b5afd802265d53c22611c6fee2aad5a7707340e94d0f371a2c577c4b19aef01da56111d61cb56d6fc2136f93debee2b7d9d07e7bfb3411c69ee2ec4db8f4136fefb6d0a6d912cef0ca7b4c8ba380900021014272fd16b1cebaf9339778503a29ada1af92f4245228dff078de2b94370f1dfa8a1f4fe943b8e4de12b53e1e5a957832bc25e67be93a297d4b44185d61d075c61293ba297f848198fe6220266f356c1f8381b10f6118f8a18b08d337e193c7b0e84e194564c121def384e8f9ee29f1787c47e78f47be0f91defe7d6c86aeefe50da3ebfdfa6e8bb248f4a57fa16ca3e950296f184d454d5c52def165fb3eea50167de83d86e50da3a7cbf6b7671daeb5f96f89278328d7681f0ae5b7c4e88a5ecb35efe5b7c473618af27e3c6f0999d9b9af9eafbe5aab949a9432bb2a3518d8f4136b221c4cea4f5c679d5347d48f3efa15efe0be78404c0fe4e4e14623ca1587b086f73dc1a6a7187bb8d9b03f4db0ea674c156b576bfff0d66cd8d7b47f34d7459bfdbfaf5ff35b62e42420e731cf041e2b92944a0fa5542a7d0d7f1b4d6974f2a393977f926f881bcd49de3cf4c98f70ad3f1ad53afafa70a3a93520dc6850fe04a3e4cd439746a37f1bcdc83a8f29e5fdf4e8dd4729e5431f1e535f8eb02be1fd74e9a1a59a73323a982aa902c9d701cabc89744b34f26b7e28530386c909ca3fb2d203781d11a251b4eb3992a32dd4a44e8c01ccf11f4f57e872ba66e8c3511383f1f4eb8edae4eb6fec6bded0878d17e3577e5795df3725efd2cf0f7d0d281323ebb0927755c90eba9ca4e453f6cec9d4d7e1943def93cbfbeafa2779eb90a3931ffd68dbafffa387a3378d46999e687ff2138b9ab8a5ac43ead26f1d527e088b9ab837eb705dfa0de3e443ffb61a6ae6475dca35a35c9a2f472f4d72e83796435a6ab966f4a5a7efdb8d92cd3c46b966bed470bb41ea9973adf589be86bf7f5b0df49fc3321afa1a423f657430e512cca3dc7373859a0eb0baec6e89ee325faba6eba0b311faf9da8b42b86af89a4eeef21ec22cd34ac47341beac9b879e53e2086178a906a127e4f5d056b4e2311b36e79cf2315ce375cea78ad35f0f6cce0ce7ac73fac4774afa307d178ab9f2e8c1dd1f4ec535daefd0b1beaf6f557f7a7d4df4867832f8cf18ef8bf276adbd1e7ae618b3d70f981122449250c4c7478a293c47676fb3df58f67ba4b3df283a7bf7d6d5f08d7e8c2efa507e3f8eca2efee1fe28c6fba3fbee37df8f78e65da5fcfbfee2896770543683e7198eca6086715456014765147054c683a3321d8ecab49f44ae8deeff781c0dffec9f108fc1f24be2a8ecb3b72f09577b39e5dc3edfcbbd643f8b5cecfd37ccab66b70f718e37f1ae1267ff741c95398ece3ee6b7e3a8ec6d7e411c953dd5c2dd4f4767ff5eb5de53f63574c0c163ea672e0a9dfd109db5e80da3b37f298fc91e87c7649ffdbb71349ece9e0233d9cf9821db6f053adbef043a7bfbfb89406759e0e8ed7e74e692e8ec9d96b753a2b3ec01a1330d2bccfb5e07b3ec3fcbdeb564b9c673a66f5c10219284222ddbba91764e5aed61c6b2b8f4ed7b8a456fe3855e90a9d500d9e17c668ed83fc23f8c9e946b340035100e8cde91700f3c6646388cf2e821c6f20847bc3b90d2117bb739c0cd8c7efe08ffc023d593b352dd7cc087d40c103c661c7499b5d2c83c030605d040a370b39f3eb7d6f02824ba87e8c77f2a47837efdd7c3635e7e42ec93e2de7f0cc3e66f8f8fbd9b2f697e3ceea5fe9ce2e60aed4b9ce389708e88e15d27cef17408ef96fa1bde3a787054fd49c5ddefa5ebc3fc528edac2adff78eabda7d3c3c7a3eb5f8fc1be3eccafe85a5b74fd07381a4fd747c150df7d0582163c2728542b747de7b69b42d7c7c163fceb8ba5770174ad59de6e88ae51e8da5273cdc37c1b62becb7b0b85a0e5104f7efc90965905661b22edd9f5d30f06f626889f39c2bf468fa14297fa7015828dda673278ae43cb8ffee83f5a6d34edcf5f95a95fa9ae71947bf11b047f4f055ff0def3170e4a5f38c4ba963d5db002ee05f6d030063d1f47e33dfc47c45523f788833147d41bfa440c7d246c5d1895d070c7bdc05804b21e4b6f89e3a3e13b9c0d7b34fc2d716eb84316ecf19821d3f5857550c081420cbc47fb2749a25d0355ef40bfd8424ae7b0ce63101c42d7d0fdf78afe1c58d7128fb8bbeae75e73f0df3669585b0f70947b08a18e58e375412efcbad1f883a1cd439b5c6a5acaec0e218410c228e59c34f5d1d0e6a1eb731e7af587c51bf67831d0ee3dc7215cc11ef007541549f20272b58a00b97c6294336670514e5a63add05f9d14c3807b715f31ab454d83feb4cc6ea1180a417fa11a7a4e739b482bb225d1ee43af90c8256a69f7b788c3db81b4fb918b144924e88f5443ee3f5c09dff11cffe1415cc77180bc58a224e805a424c8f582bc213d31c813c2f374dcfb5339844bb4fba8e4ddbc1406667845b47bf77188b78b62867b71ffdc218c51fa9b35e49e4318a39493464aa13f1ae59c94d68a6531cba0bf8c3eec6556db36e86fcbaca66d5b2824baf15ee8ef6a0feff844ef8e1ea9144b25e8af44d29cc37bc5e16d72270ec6299e4ed0df69a4954e2593c956c3c3270e46840103fa83514326756f40bf0c55eec57d018c60dd03627ff497a39f7e4976f49c2ec94a3bedb47dee3ce42efe2d700b3232cec99f585567e68c0fb83353ca9881cc9fd8411720e76464a27bf85665bebb51d599fad853acaa333b1ee0a999fa180e62c60c7de7686c0d442d5fc58697a3a58479ef50991907fa4e3fe0ce541efaa574c5146f9797921e9b1080a533c800163f36e483e604103e5a7616a4e167da391afeef71381aa57fff761c0dd2bf7795a331faf7ee7234eebf873c8ec6f6efe3cad110fd938e0a1d7f3e24747c0a848e5ffd47c7c760123a7e36848e6fe3111db3e4d148e0a898583c24680f80f0e13f750b98842d61d39370e9ed0893de5e3c7a6ba363d38bb09cb46299d5a616c2f19f76f2a1a342c37f4868f80e84860f1f26a1e1c72134fc7844439fbf258f863fa2bf270934fc0ddf0fe15b7f4f2c34fca885b008fb4d7ba0e1532d8443d9efea43c3dfecefba85866f4358d37e6340d0f0352d84ada6426fbf331568f8b6c6f82fef4b98f47e845de55ede5fec2ef7f25e84218f7b791fc271e55ede6fcec87e387021b41fd99009fd7ee21d4ba05f16fafdcbbdbccf48cf12c162d5b5de8eab5c9027ae5e514e5a69dd71950bf2c45594934ebae32a17e48972cab9e32a579451eeb82ac2b8b35dab1ab9efdd5de49c7398ca0d6c6b407b8e2ff7e2be02e1398c72d28a6556db42a23b22954c2627304e28292a2b31644f5ce1c89e974a0aca09c689ecd1fe263164b08c200f4e5c9d98984a241ced3f62f9ebca994190677445a119a4fdb7c72257e550966bd32c6569ff0ce7d0fb941c5765588ef6af1900dba7bccff5edd4ba04002d9a163571e34b633eba86a7ec4cc7c746a6331df7e25fa9b8ef77d6625bda6d5071039069f756005a7c391aa40ccb3cac8910d6b5b8f83cbe1755563ebc80f0043e5ef03cde936989de2b058081414a0540f838409918417ac80980b47c1a1630040537ce27954ad96066bb1f2d7b50a043ab2144f0406fa7444bb80b70922fad60aa0215f46ed1d261903fe093bf4f745649a9fc168ff1931510d00c2025da9f061c52a9140866f60c3e4059d0dbb15c4ec8f1a753562019687725da35d6313fc42747f98a086e06c47defde85751e23b71adc3f42bcab7e99b650734cdba8c1ea5e9cfb93535baa4d19b5c5b40ab5cd346cb3e1ef36fcada6d9cd867f86551b7a322a01724a4802e8094190fc40c48729bca00b2974b14310168a28c2c78a092b70a12ac2111718b1818f169ee08413439ce851c2a348a833c985daf500bd6072715dbb1ea01cbd1f1504d4021d47e8c122e20814148123052016f0a8c10e7cb84289115360420b333040387aff832ea8291d4c1180fe118821c7a39433c619617c9b939eeff2e3ab48f9324687eeaee9994df744c4cc7cb83357203fb0195fc337db07f1335a74192ddf1c21339be18761eca186e1f7217c73c4c42286dfbfa0e7c3e84893c56d013cf47cd13ed9aacded064c66312d84ed3f8de1a7e7363f6a0f67ffb2c77e6e3498863dc5eeb9b04d8dbd869d7b61538d558d896e70e7e79931a0b13c73cd3b208feaf204efc5f8ef3dfdb9cfe6c55392a0d70bc8557f5cad56111f116cddf7da66232ad1274c60bd1fa8d4ae4c7533277c533f889fb91e433401b99aa3ae0ff7c5b0e5cfb8ddd86e7440cba7333fe738d63e87f03d7cd947bbd756dad52892d3bd29e3057ab95c3f2dba02734ea65b379a7a4a12f47a01b97eb47b908afba64bbb87ad9676ff600fe3c82dc9a0ab964e4be7f552c9788c65fc531d1bec582128f543b684b55aad642c9111244349ab0565b2d7abb5b2810f1d8f4929810fcf0e94412162055610944171e20721298f416142b5e3c3ce0e173b59ec1cd9d961b5745a3fd8e4522579bd92bc5e3d32825a2a96916c496bb50423199ba87e805e412b28635272b33279b16ae9b4745e2f950a632c23482707275bf24305d8b404f762c4b9f0e3a89516aba56239a1fdb78ca050deaf73cb51a69f24d912a06c490fabc57a5590203a51cc19054bd562bd54ad1f17904a47e7c56afdb880583a55ec046101dd6d6ae9bc58ad1f17106bca609111806f7900ac4ca0cabec896ec24012bf6542a1d8b04f78211dc01a0c8d8be7c8ab0582c191941262f5aad1fd712a61127c30d6ae1550c9ca24a99e066e531293eece8a8a00c8a13d9173cd91228838203942028344059a252a9542a222a2854b1055d7a582d968ca02019413282640475a1fd5964cc293190184f675ec1ce63d827fd82e8a85a3a2f55ebc705a4dad96145c152b5582f55ebc705a4d209a2c36ae9bc58ad1f17102b880eaba5f362b57e5c40ac203aac96ce8bd5fa7101b176b403c00e8dc7c9278084b54ec97318e41ea984766f71e062dca176b4ffce8c68f759cbd1d8de39d74aebcc1bd7d15e68f75289cb481df98484c2c5c81efceea58f935979f7b2056558debd7441997ff7f2056554debd0c62391aa377f28b9e254c04e1e069205d2eb82ad0ee4ba0dd4b219c8c64c94c123817ff2d53da7dbc829399aa98698443f9efa844bb8f5cb89889e3284723f4eee39218e46888de41999b23eaa7bca34131fb342e4e3a467c6232adcf1572792e8f86383ed163c4078a214eacaee03a72eb46636fca4e8c20f702f657a7486338c7db3e7e0a0ee267545858789ab02d6c7d340fc9ab5592762f266988a156c12617743125f142890b3a66d36b03da792f65c796b450083b7db2d1d88758ea255960495d9c6b0469426d8b6f84335a6579e4230b4b585246e090585293250559521a4b6a8b2f345a599fd14ab4722ff85b9cb2839f7e270d62ab2b06a2a27285968aa8a26830345d31108c5f3e913a62a4257d42293b2af8b1732fd81488b7233496153b842b5fa118d814247f85a445d667f432041dca1b250b96570e8ec6a2629232b931f1a1fd6b0fed6f7d44391e23dfa7a2681087ecca8a0c1927182726a612e96d3680c848798c7c57bd27bb626f56361a9b92c2dd36958d2a904bc7081c160b085852a4d16a8e5670b4c2462b2d1fd962a6627d6e4ac6881183f413e504e3c4c4544239c138313195aeb6325858485386264306c4235d319018fff8e6888ff12c58fb9b23de0751677ea05f7cf1c5cc1139745c3d1fee24e150fe9707de2f9ccb5d025d462a478d4270fa2d0383da6fdad6fa5c1ce8e2cfa26261b971d4eb6e93cbe482325910c449e287def198141538947fabc7bd388a91fb858f76288302c5280443462a8f417162a5fd4f79cbe87d7960f09cf098641e134f295f1e52be2e206c7a41177fcb320a52b2d1644156dcaa1f0c495f96d46865f2712f2041cbbc99e0989ae05e8e3813ede5a8241e83bf0a36052db93850c6e485498f8b637283a35dbf949d56160465e2cb82b4432adc3d5a3d8ea9d40cc4245d31907f897358f8f537a693a31303edef292e7028a913c2282ef7e2c3722f28475c4ba310712e516814281ccae17c5182254204a5f8a05db2246b9b5c8f4d41d0c51f625313b0e98873c19f621390a3fc316c7a615312ac6d36b966305aa140a1fd374b2a626c5a025d5c8e32019994687f694d49b4ffb32992de4242f4e87d6a5de8e2a337748d56f655646c32a728d1a2412577a7ec68984d665bc451d65a8855b4855a4dd11806a2f25946d1944e18da5a9b85a4fcf79e5e716d4f0a8fa35294d8a813e80ed5203669fb82e61c0d18edfebdbc03d5f22d8c46b1d3b5a4310c24868ccf62bc0abe51f920eacc4d103f7313c49d6979007c7ed9e33117c79f7031d70887922c28335a411238190b02a7823236055d703ce6f2386a1ae1626e13321b06f5a7134bb252765ab0a5c2bde00f006ca77007f0cfd8127131f8636c83acd48132f6c7efb63e52a7017446255b1ff7827fe8870c4b6a9bdcac68e726bd4d2e1d4d4d7034dc9b8e3819ee92e782a321dfff714a0e74f167c12938d065055dfc473845e55efcaf11293d2e8ec7a408e1501885c7bdf88b30ca68056550a0702e20703d3a05655098702e4da02871793c0605070ee5ef29a92d7305182eb467f1474e462e11eda395761f5dd2a18cc2722ffe2bb8db9a5cf57dc4ee8525f573976c4844bf77a844bfcff23e25d10f02e9f79b25a55d8a8b05ed2f03c325d0e57d0c0ca3418c69f6050de2aa2d8e06d020a6da560b8396c5544a43202b2f311095a71888ea67543e05ff80819597de293c39da7f05a7ec4017ff8a0417647255cbc222e3f240997b79b4bfb64500b0d1589fbcd18c56d667b41aad20cb0e6000022000015c5eb41425369a94026c34d6c7bdf88794b8db94b2a3fd4d411eb3ad8fc96502f29897c76c9b241e23df456d74555662c860799c69a0fcb995500a763310673a5b1e27970016dcbb92fb0cc32a4cdcfdba05e5e236673aa16019c6bd70b75bdc0d1361fca38b2eba98596bb34ca7743d2e0506b324d7618e46fcfbbab02eb5aac58d0fb5ea68d0978f391a3365dbd7ec63af594dd36c7674ca570598c8c4fd16948ba3815dac59dc7d3318f8c3d3ca84e984e268c4cfd551e1ba480347573fcb3660ef59f6349673ac15632d1088979509d309c5d1901fa3a39c7351a405e1cbe2c78a656f737dfbbed9903d7c6bb3ea285c31d6127f88ff7eb4854b8f5ef4297d7df47bb9458fcede6e11a445ef8f6958e63218925fc37bb496371e7d7dc27dc2ddceb5fdb63169d1bbd721de6cbbf17ef4d866c3f6a3bc45bfe58f1a765a846ba8585c5b8306052cc0635ec7895f6fdad78d46aba3bc2bfd2def93a6356a788cbbb6ae69986e37609dbd7d6d8ba2bc6db4c8a477785fe8917dbadd70b7f6ee45b846cba1974ec7edc67bf923acd9985464b691bd7da76bbda747c1e83863d7f8db87db8d4cdb547045bffdefc34dfbcd067f117e3dc24fc30823d4b4871b8db68db0d35ad6b40d0557d32cf62761a77dbb81556c78d15b110ebd75dbcd9b87beda8bf01e651bcebd682ffa1a500bbd083b2d0a65151bb6cf7ecb9f69196778db98a487de47d1cba2f03e33dd16473df7b074947618e336398e0ff10e50013464b8c6139c9679468601ca5c05d4d48689a16101384019fbef714040070ad86040470f1e535bdca505f528df41a4e39f9e3e6d776985ebcebd48c72747bd18ec1fc5e8a435ab50140aa35ab4709ddeff2d28b8d17cf4771d7e633fa8c31fa6e0e2e031f2d1a08007e0d0c16354648e51e7be54e6019e1ba8a4cb17cc9a1a654acd8c00000000d315002030140a070543d17898868a1f14800c85a05862449989a328c96118848c310419600000c00021033434a35100181e728b07440cb518043b52151481bc6c62fa38d22ba5400f031ddecf6dcfc39e3c97ac39ac0e205955c91bd7c47628b92a5f76871001b0dc98c0db9b856665fc529457c8850ec8e5492240a2efbfdaeb4270ad34e5aba6176b5d2134b32d947b336c4c5e7bfb0aa15f9e2f75c9ba428470a1b2097a76ac9ae990d55cf88ba666fb8488489a74d702f9090136b4d2e686d35f2e5f91fc14e013f203ea4ad76cbd691945df7291818565cf299a87f38c27556e2e373647320bea055b334014f30941427e2c5288db9f703c5d31759a3e21a21b5aa911456f132cb662ce256b698d7f055f17bfbe167cd7d039bbd29d44b3feaebc1a85d821cb908589339055a0ec40ec905220350789ab1820b06c96c8b526542070db087f8d7f7648316ee196d04cd36d098b8159d8cea3c3b88fd1dab8a8acf18ff7545145fc76dbbdbac84a513e21009c604d33d7b650e6569230e3d3e5188703589e7ebc5e23cd5c8e2beb4a39f70819e091e800d968b87c426ef200a9fe6a4d6c469965fab905997b4230ae90922364b25912fe687ad9b66ab08986c5beceab82e813426cc52764b7d927c45fbe4f48642f9e597c2183d2a5e49df9066775960afc8decea4848774f14c19fcbde59ee49b13e17c55f911f88107177ffa5899c411e9608b65472d3e0a3086ccaa63f8778e0b01955d73e7d34c3620cfbb9a8120fc47378089e3c059aac52d467f2116c280e9c5582f79922e578d0c3b9bf74c046d0c91cffd2e34ace21469d7990de2a47ede6aed0be9da18d02b3d922448bbaf68802f73b13316e4293f0fdda7feeb2d527d599bda34ba62df9f2a67be1313863089f8f9f284637281af30630b71ca51e7336f0c25e36b5d09612695b229a3141559f00474d97a6fbbad24dcd1384f1894178b3405a5e265393677f616f5e0e8579b96be0a6c3f01f9588dfeb0d2166020f0933abf5d6a521c1fe3b8a8e1f3125f43f802e2386a26284a79a7211ac16c106ee0ae7486188a193e7aa6061a3111a5f3490fa4440f7fbfcdffcc2490d2e88b9843617879b325a3345d75256cf241fe38ac5e65a00894375a1a2047b932c853218b2ade0e4c03e535d0f4683e6558cf0dbd4325be795538e8215b577ab4f7f2e84089c40e8f5ecc6b1977d0c0c158604134a97f6394513ba4bf12f85e4c7cdcb18f8c952de7f02ff4f14c098cce5095adfb0a625ee6b86c2bbf9d686fe3a48acdd4e163f41f3544be7d4850a4c4ca57a38d55bcc1afccfec0a6b9b298ffe58cf7876320e01f135adf8b62991aa0735603d44ff91daf97bf0dd397c6f09c393803aa8dbef59d8a012487cc7d77312bfa7bddbcdb71251325a70cd04ecd78c74f4a3981251293dc6f74a1bf21a1af2eb0e4eb80b0327b28051b989b49855afdcdbaa9ffebd3f5f25ed7a952318dfa76a0ab54cab3730db5bd2a9a420758406d590cb7546e51f8411d38c9fb0ab247054d57f642da82554430792ae2f9c8f4a43d3d61c9fc384c2c7e663303f259694759d9e797e85fbe178c727e104964cbff74fc3984aad0a98f517e00beeed625b9bdc4e5b02147d6f98136d306e4b0589b59ca5ded8ff101bbe9ab6a7c3379cb978ce594f4f26c103ff3942c760d1eb90eeed65026e05c9e739b866430ed4a95ddb1f492edf6b3971ab0a8a8ed31e86a666dd27be44c6fa7539697421248a0f25720ff8ed802905f1625bc5de4a11fda245139046a271a2bba6a4455fea2eb2ec19285a18cd1027beb11febe9154e232378aeca507c2193fb4470892221eae911c865a21326b07f600039c2944038a2d903ca8d69e484fc06692386f354812e18897828b9978183263527a72286f83d409a886403091938a422bd443606c3dea7b283c6e6309178e933c4143ad40ca39d4c62f488ea28a31685283313053664aad6b06fc940c2eb190a9e4758abec9c59c505cf17cd610ca7848553d0355158cd95171b9c29996653863fda441e50c06fd1e9484eda0a9785c4a1e610ce9f660dd54a64cdb97590c0a3dda18a71d523c207232724e6785d44802f30cc0205c7b0883ad06f6c1d09274b66ae53f9f90cf7f16a2806ad67bf07e03d0ebd723343abaf94ce1883892a60a29794523ee59444295b920f73e74134ce85fc2225577ed683521f0f19a80d73e4ce3585583c4ccee1d2b4a3b94ad13a0d5530994a5e8b45fc47f106b310e43045c58ba528aa7e4f4d46452086c5525743a9acaab039ddc861cd872aa2f340bfff188b5330704104410a9c8a71115c857b29e56426c1e81b72cf2b99bc64b4742a2cb711407d1376caadc5a92bc640be86a4c5c0b36e983651c5dacbd4b40e98c8dae779635dc51477f6921d346fb8f65782169b621d7fea6aa86a1ae3774d00359ae2247bf34d155aad9931795827e0fab317b9d717c76f781498542f265b0402d24ae83df44c809a90800abadfe82142fba8a82fc0924ce2e8fadfed22474556a5fde815c07df65297d5fbb0de596ccfa40f41d5568e4dba0750b50acba9957a3cda98ae215869be855cd936acd3349ff98e20fbf5f53235e7a09f68f02c57e7afa4f4e342b845bde3fea60afff556ee2acc7137bd1508ed7ecc679c23c0f069775325c93af3c2288643cea5cc8c998eff5cd4d9ee60b0763cd5fc6cce71e031593de7d291ebfc3c33b8025992bb37e7c22224b939c82b6f6ae141b9e5d253e42e9262e5ea521dfa8420587b07719a6d9fa9d0f2730f74d0b592bfd024ef8af9e5c5f2d288345a2d378a11640eea920822cff7b8b8dc716a00d201dd52d367943989b73f6d94d36026e38c8b72c403c9047a03ed2b4aac3d919ca8721a2aa972ec7d7dca2810fca5c5811212a26bef510d9baa881cf0ed83d909ced6083360c45440a46f8cdd8b4989d756c453a16ccdd455d344bac64680f81f9735e25794e8505471dd509bb6bc25ff4453c13a387b10d16cdcbb510ce88e0b1647f74c749fc8276dd862415f84c86fe5f7723aac8dccaf4f435ad7780cbc22a6b3b83188870e06f234a8f8c04d66a56f545bf9921462a31a702a02c2da516b44add7ae4a052a8397e2a5d04146638728b9578bd783f50d2190c0bf76724a5cde49d6d6aedfd4cf800b0eaa3620e5aa2fb301e1bc9fd76361327b9fa7b8778b7b21a9e610dc99ff016381fd9246bc122c855bdb6eec334b96fbffa011c06448415009c030188817269e0c4f2832ea98251d36a13a8853cc1221802fe20d5d11ed9c706091aa650a2d074d304ff2437a061a15875a932cab06151b276e7c372842f840e0970afc06e23132bd5dd6c83d4cf0d14d8c960c45952215936a1758a430c5ad934817531e70538686b3109caa9ea5655ade20bdafbe43b52b37d8cd051faae24061553d8b4d5b20b6f6d1fc45262fb45f121841e2d053b2c7840ba28d922593fa949b69f162d1661047bf12e5877afa5cb6b06071c0865a0935b619284ce2c0143b09ab97cca291a56333452e3106bcc3ab71ee49f96dbb62e3eb9896f67f244a6a9d4fd25742c32aa7069754247d94676498fdb120fe93dc310d2605ce5f90a400e81a46b97e333f78195eeb1bdaf66b6212cf0b8796cec966150d914ed80af27d0984a11e56881a8e3e03e34244eb890df13831100b974764a248b266c03dfe8b42b57924ba614432229b8cbaa849d2e9e087914cfde66ac062b31e4b7632e44a58143edaf511200b75291b89ce949422d95f4db5d02d80a00b6cf9cb8a871ade55b06f0471819ef17e87e49c22bc42e6f8263e1a46403273d8017c21cbc82c9a1d2a5d4bf391244909d76267a902ef0ba76ae891c13dc469f198af3e2b300aef7e5e9071ee288d8a3467cac71ef5fcf810730aecfaf8cae2d098736d9fab0dea7ed142a4eee7f058cacdd8637810f60d68aae2af03e9fa3a2911df2a9397802fc4323537b8f01c792de54627557c5898a36d2a793ae3c626080ef8034c524f4772424088b1524df2aea727a4fa49f3c9772ba06f2b3f9093aa2eb935be150e3e367c0730b01630411b3eca470e33b88939134a2c8e10437102a7b03c791fdc02a9d6197974c43dea3b153e1c8a929e79bfe452fbb3b1ab76c1455867d2dd517768ae89d594cc87c9f72b69bb3d1d6a67c1d29b878066d07fe62901f3d30de7fd81e580b4cb5afb54ebe9886194f58f1f9a3263618a0784f66c1d7a7b663fbb97f9fcddbedec04458cedae3520980e0f97b3d2361cdaa94635424f7e0a31414a79608260a0aa57c6cc8d0e76e654d33e7e2c86384bd64d6679f5fa23de4118d6d27bdf7788df7244be19f938e701aae3760b945446ad3dde0d923a10ac0d9e1a0db6ae5305a71664aaa2553ec60da83358c281016f2d47cf5cdfaa1ed2e61eb3e32c36ebf2e88852700f46138ae74540b9b00aef569bcde689ca2516634b4d28873423411872642d33feb5850bed56e245c083f58769939ab010a98befc33e6925e68e9a5b49cb1e888fe300e47122558b656502a5471d6c23a6e419e06b3df4270dbd34446420380867ce11557ace830c014f193d28330010c35dbef04a369e15e73055fe7d838d0b26f0ade62ea2ce839a2e5639e28f7cf2df09f7d7fb5dc3cf3f11b0ca73849bde1deff6efea482a6ad4ed2f9e30625604b5b435046386a8b696cf941dd5012a960ffb345f22a0691c803cfa16bc49e0b8ba46f9044fd77c19311db198323f584923e624525a41b16d135f2c58bc553b00bb26fbc4015688b4cec6e66c1e907504ba195d0411c9a5ddbf176967f735e33889270522d4cf23accb5a8037f0d8ab7e3c1142be9572ffc90a7a35ace4eb4828fc99e6e51b5f37bf434e7a7a16856cff5138bbd6c6229ea5f3f4026628769f9467889f14f1c978ca03965a9a639748b788b420728ad77db8c1fb0f78470a0c79907dd888a873942d052616a5cbeac2dad5907e676167b9bfc3b550ad21c0365c10058d8249031bade197222e007373e36cc3a59faf7a7b03c8e4063ff4c524727140890dece474b0dbc5c160d42e4f03cc77356e06eaefd9a2fc097ac74c9e9b451e469371512ee642897d78a45c429d7f273afab643a627fde3c18b2c444c0ff3d7071eff5ee11c6ec9f8b3569c7c8e292594834adf0ac640b3bc0934e87acd4258e904e354a20778bdc0bb31fe9c8d93112866879385c4f661124355a2685f773f2a91926b67f18f87a2f539e16d4a311bad37f2e7832da312c3bdb6be905af037068796c98e4015775005487f0847d898a81a4c617f7932d49b7ca21d81046c20c43e94774d95c352237f9987f860a620c33d541a1b392fadefcdcb5a7572aa3ce6d59aeaaac18db26c551080849c3629fb833f9f7fe94df9e009d239321ee150adeb9542d8faea7d93fed2a388c4afe9b1029c4c5376dc3c4e7411a52aef343ba820f7956cc9cf787a866e9c8310bffe7945761ab508a151d8d267468e618fb90304e734be16660fa31dd58278cbd1e98c453f6b2318473f642a96791de0437a217fb29ed2dd22b616e548fec0d5627068d5ac78b348dde4cac3e6a33b6e5d99ed90ad76ba700a19bbe635dd68abf8e232691dc3e90f0ae5c11ffca0fcead911ea7240e3373eb2e637f9d667255fcd205d29f40ffaf1f6450716602fb2bbcb787dd65c08ca884427f15ecd886bfaa5af11bbe7efae21df4c043b598ade1fd0a92f91dec09fb6b71fe75ba6b29afd40d92a3f241c417634d341b0d36beae5e407183b4b1d0e89c30ab3e366e97d7d773ee37a330e3d3a459062c74c7a0176a757955008aa55b8f79886a13916a37c89d7f90ee17dfdecbf4f8b6cdfd7bceaec7a8a68cd868ab5b649aaaf0de5a99c10ae05e873f1f781f78bda53f4454d42a3ccfcd9a5461a0bd08c22eae15f4daebc63ff3595a8f756e1c6ecd495d69beb373ba6e7d16036beeba2b67c6b48c4dad1df70a0e09a00c83a079adc5c543cc5aee13aa2cb5eb87c4ce588845e91394d71762bbafc2ee6bd83a860f815ced6e23d6091adeda1a1c31931a2bfda83c0a9bd6097d1a6f4283d7076207d18145c5e6f63a52af50bd8675235f3c4a2c55c57f05d9f4fc4cbcf4b872a6123f892d7da7543bb943bdabccfb5773344ae399c00993e8d9852c6562d74e4e23c1c58b5043ddcfe85b9b7c3f7b51ef252e9b4ca1834e1c3bf145508c76168a22512881b5d4cc22bfad68bfa5fc5f0751ffb219cd15f3e6dad56f9089af44a56903ca0d9d624fcc8f0c0c2bd758691f8faa48dedcd3e8a9590ae21c47c35a573c26917339d78e13e7078715f875c1daf3a206ec7a752ea2d1cb5292382d853258771b4ebc77de1a12967fa48738ffd10c8b6f7a988b74668bb7107d98f8bd08c39d7ee4aa44275093bebf9cb676b89d9ede5a25a0a8cb6d7ea181184a0fda734882babb5b23b6a9b2bc3112b07d4e0c93ecf90775f9093d3932924b1a544be4a41d3b0bc129a7fe4b3037141809cec63e27add1eb9fe6517203ed90ebac2691caad680d105aeb54ff26639d0fdca3653bd5436f71ce8636d290fbcfb1190cb35323cb5b988ad1cd41b1171bd1b871755d478adc5b17c1533e0211efbcdca8dadbd16ede922fde623e0c92e89f4062c63cc1fcf63602e9189ecdcc12ad7a87e054760b1d5fe3740e1e47680ed5436956d30cc1c3a34641361e7125e8ab959102119c162727a9659ae4b51a299c554fd458839640303bbb89f911f6cff61e733c868b3692a4ca2e78d1ccfb790a3f01721e880dc8b396ca4385c1b4abf6120243a0f329e8a6bc039f1ac5f98f79460eb9d9e9158e89697c6cfa4e1bf9f3fe4136e857a31439a35fd659d3b7cd1f105afbdb3d3f41a78203a114ea1b0ae8d800fa607e8b9de4a840783f50cbfdab374701778c35572c7762e2db360de7f5dc5008f31715c4b6a38ea971e441121e23d06a5a09afe59f3e10839a0b645706b8531e7b5e90661d643bfeefe3d160cef16827aa13d820df783d560773d6acceeca37b17750aa0386affe2ee5a1d7df565a065e6594ea9ce58a699f99d125d0de8af08f088c9545070c83b6d590228dc701faf9d5b755db7ec7c7bf48361050f6b9a35f6177ea10653ba0b520592a87f4794e5be533cbb001459e0de636ab84ccaf85de96d9af35387acda248577966eeaca8fed4d33b6ab2b693f7a37555752e20e89e634559b8fdca26afbb00c3362c332896f1bc88d7c08a8177ef9688a7b3146b18be903fce405ea6129b7b77e79649104103b4ee23eab9c9c34ecab03b7eacc79cc8be521bd2c6529ede52d4da47ab99d16a2fe3b1752d43390bac6726efd1dce96d2245507b6138f1742077311aa8c10b9e6f004a054e8da88501477b1807365c2301e5d8740cb898dca8b3096698d59bbe303729638768be0b6cb8065f3428d7dfe385ecbba8781cc301f14770cffec7dc46b84be3cea27ba280756194a0127ee6c68137f34a14a56c56255f723189db34b87563fadcdedd00f479992225830e34a9068053e5889985be5a086051386222ef4ab10dc2228f63eba523a267135be9fdf499d930d528a55752c688da08257212de81fa45a14ef7f297a960340f0b60d21afd75abcc01d9150ec175e064bf0ca6e4f66ea793a1ad0214ee386ff0561e058288572433b7b8c9e24ec96265ed25584e707eec821eab51d9494298bf47fb1399e4edeb2d243a07337d5ac98c3b2434f10a31f73dc7f1fe8cce1e89f1f3b282d505e844cd9a13dcace8a8714d15c9e7558c63a4b2c9b2806abf4bf069c4f0d4e51b419f8ee9a5665f0502efba8ebf31f6a232851e92526ddb53d4d1d73e036f97abeb8466690d10ebe18c6d5717067edc64f5b10503be74de546194cad4017eb27df143196808598bb5df31b085a0a776cc95d9e6dac175d10e433103b154eee68fc5fe08c299e0c8318fa608ac3296beb6452d9081786863bf8813cfb015e722be1caecad8108cad767fd1d562f14eb57287a58b1c8c32f8356d6fc8fd47dfa0afb814facb6cd820764d36ba591da1b7c0e159d45e238fa43529372a5e8e153716657ced51ad5d9c7ec9c14668bb2466beed71d8c60504a39d6da9944252af1fd9a5b2a56fe91940238630f3bbb203e35eb283ed7e43e3f6a3501708386b2684ca583eef40834048ba188df1e89d4ce1afbdfb61b77c4d028cad4c81a2e7b86377dcbd380fe7e0d56a3f7f040d27fca864c5d31d76da18a02a44f9df4b1d8e2b8904f8874a49eab6f9616be9dfd570e9bb0af4aad7284eec393acad42c854809f7ad08b45ed06eea22a80e9227d80f6f9e008cd1bc0aa5facc575e031e62161c9a3393662186b5518104d696c6ba558d489763e7e0d1985f4d773b6c9cb11fceeb342c6975c6c93ebbbc896387abb53ced9bc5c0377db29e84a76362722b375ac1b6edca2e605544ff7620bbf15eec208b8c5fe823908e672e70de5c5aef677a2c2e932702da3803405a95b558df3f2c528c2130b86430873ce28748ddc9169d4f862c45b5d382c10fa07ad7a108cf36e958ddafbfc8643d3429ecdd033a8859af9965c6acb00a8fb286b12aafaad93883f52e49d4ea933e2a06f183cf501dbe757f81181087cfdeb9205830cb4a3fb75fb9615b544bf14db0ffb86e701ae89ef4f326a51c1ab9d5f10ca4dbea09f8cdca18407ed754b794e85f87acd6dac9c15b4d107c4ab462c2c11b012649509cadbd698403a78367e683f4872bac8ecf635356b3ed323f4c8d1e08df1c91ee311e399cc6b8c870a8b5e100265980218f1681cc82d483ab190e1fbea820db003c8faa2a85ae15db0bdf65e7bc0ec0815139eef8c1b872b2d39928c9b649ad17c07671806973eb115efaa00f52835e423c40dc72abacf243282f5e3abe946edbaed6f60962abde5e41a9caf54863080c5e878054c428ecd7089b20737a1cd30a65d189bfe62b952190388762b68dd41285598d11306fe191425c6e720434c32ba10ec705dcdc6a5e7fd100a68ada36bd22cfe568db570d1c473ffe0446ca34b405aa1e76aa352ed067b5883c14c6f70e9c6d3511cd3795def9386c2299629494d53a67554e3591d32362a23af69c10161b493a058a81da566e28825b8bc596b0d72b7511d298b1fcf9c2eaca23a307e01291d760d2fb6d4787e9c0509071c8fc1a5007a77bfe54f3b83ff4b4da0769ff7ab1b3c45460c5922835480f9e2c7d63d196e3fc22fb2e26e5e8bab350a6bb6ff33ba7b592652316aadec74c5ec8de06feab977484c75021bce665717666728cb3fcb4dafd284926e87dfcdd2fbb297827fe1c5ba759b593761b945aa09c6b633b1e2ed82e96fa942d8ed35b4ae3225248767fe3bf8ef506bb5654961435980d4d80a81005305aba64455fe169c41d8703f81ba2e87df46c54cb718131e94999bd5c08538ee1d836ac4ce716855e43902a847dd63a85aa03702acc722536f8e113c594ce105fd470068fcf607d9a65411fd80118b5889cfc48f4f52c22739261a0d298ef0fce32a5861bd57ba2bae11ddbcbf7640884dec412c2762fdfb20c01f2c650ebe8d1972fdf658f9a791891fc48221267a3f14fa1366bed1a44ac658bcc61b624926c6bb2f2dd78ffb7673fc5e8fc090976fde383a317dfb5152fee765ce3ad1a393f685d083baee7886120c58752a7fb119672e20074e9aff2eaf3b723cb5ee3e3953b287fe1f289ba93da408c894d2c1ff274b471935325d8ac5546976fa1e4e34227e8aa967cba0aa1a6c4dcf60ffd764a5628dce01d368e730577177f89e3ebac7e34428263da5fbe89697df6f1753a9dd0e947d9600c56a1f945abafc18d0f1f27640c4f129b791a28d423a56bc9e132d619fdea1b98425c28e52536d7048ab0ca5a8e034740f2f0de89442cb49c5efb97a3a060f3489c2d117ac3f529ce728018b012f45a1bfabda1a6474e924f145ed78e88ce14c64ed5cdfd85fd0b00e086a95009b94f3cbe80e8ca924c0ae5ead94a9b1cb540d61a1be71f72806e00bce4a7c81b3cc4118697e7cc1baf4555d7c41a587db56872e6ec7a131f10531e2136650eaae2c5f90ad2034e00d2a5f10a88892c5c51697900b009394bfad2f80734d4e86d164f05d85fe10dd2965e8ca54693bf6b06a273b736f99deb3a41f550fb6230a6d6ea1bc0cbf5639af012b1f7fd30601a0aeb2c944a7e8545363d0348f759f82139c277bb00e09b11bc2ba174f8a9bc8049fd7c011cc47ccd8a6f804f33de36b51a13a7754494e4c04517bb2588a89b308803eb4d813b88b52319c82bcde9dff3629e547d46ccb371d8fdb17ce8afa0dfe403c4d2bbbf3fd53da4ad96983e141df832e0d29672f5bf4548aec959d5ce4a464538c928ecba087fc4e5af3db5ce61b85ae676a1fe8b72a2b7f1f7d57bd4deab6d8baea8153748c14d3795a9a0c20267c252888393b4312fa2487dbe16f1efb6607e09b83e0c3d85738f907878c8f89e13daf0a4f3b377168a49839964c99a3b82fe04b79e2e1b0a94957a889b18d8f86f11e97e2e28ed88218652e0e309cb72fe7d927c84cd35b18baca6d43eae57029e4b987eb8a461b64dc49308dd9f649fbf24988654280ec7131e933008c01e77929f05a83e54cbe342e1cf7b40830e2a106518c9275a20e7c4d67ed9bc7afd807ba3fcda314be9ef405c16ac0c314223745f322decfe432a100097bc13f669b8ba5c8a30f16faf15a6431b86214b3dcbb909688753635b2588b3f0e5136e52d5cbe17361c910f989fe4d3e140adf7ba9b9249a75a6654d6d5e836d009a9daf91714df13c03c6328e8265518a8107726334f59d38b7ac3899de3150e7cf909b40ea03da735a4d55d3f1cb367499720c0a343a4b82cfc98275ae8181da1ff6db1dba888b7f46e14c69cfa02c4dcc99876fb463d2915a63eaff1728266af57865040ebd194d5d9de0d4d3d230d69e61cc1eebc948b744ff3fb0f147149775309f8930dd18fa2e921e7cba6289a33bf324544b5ce160b22b7786c867fcf19cde55ae41071fc7f4ebaa3b7aca59991ace164b97ff9b9d518c845c25640a80de0680788a6d8382a788a0abedff753bd9497be63194c78093df8a94bcbbf806f11ded2589fdedd16431ae866404d555efb454551914222a403ea79ecd4a743a54f43db08944579787115fab86d73c58169d0f5a7a4e1258bda92ba94160f0e14725329d9adfde9f5f143c1dc301a172cec21cda8cfe0f9a1fc7c5373d15711c71dadb82e5897c7a13c5ea854de931e39ec53de3ee8c33be7e87ae97fa2d7feb00f365f29404b2efdb5c607d85ee4df301559cd0242562094f4efbba2b56c6b1efa0fb762bb93a8ca45f4bfa824e915ee23354f54011c539bc84e9fb10fad9a5f2c0efa85ba6773e211ed125ace889c7343b435101c2bf8cea755044b54e469161c2075c0831884f6e89ee290b124b10465985150458f1fcb3ec82891b576b223070cc4c2dde05ea708e7a5959c905d1c80837d147ef416e8cad8ea83e4e14a1fe97639d545e92b44c4783bb6f4343f488ee0a08822f3274a1b762e0fbe636b60e238a48264d25059e36c43920ace9b4fd3c5ceec92bdf3cf1cb939f4179c22ced60aab86880ad5371effe2df7da57c26736be92c9832d1f1a6f31e030d446da9042df72fc194c87806bc71fb3086eea16d91ffcf5727b9ff63a54b7f5dfe09c2d4c19de5c5d3debe24d30745ddc7e8594081ac71708a5e7356312a1bf4933a72822609fe6b52dd5e16a30c8c2e5f8ec7310f72a15e87ac38394585c7a4efd04d91137d48a9bc47d52c84655afd1f6a6e7ab933298c70531adf291ce32c4326e0f6bd4d831b5753cc401bd223f9cf4aad00d3bdc0ef45c1d50683a45c6b37870368d7cdd133e459a407de16d2e9b39023c86f223a4988c631ceeba64053bfc7b8bd2ca68abd53ac1403f23facb484d4fdfe6882bbfdf6d95e12960309ff175f4e4900236fe26ceacadabab156a7acd401eb75667ddd595717d6d6811575b2b6ceac2f757cd6ad8315e8fe2e4d9a15186251a4460cdd357427d3ae5805b4f4ee13ab56d6ab2852ab3be9cd87604552eea8d465304ee9a4fd203c26a1a0a240fd14bfdf93aa6d8c559b8576c9161ca2ba2926bac665744295d86a1216a372451fdbafbf2c0ba0e3c9afb29e4ace08b5ce704fda63477edeabc0597f9b9f037f829755bd5a65b1dad7abb5e1324fbe610d9ba38e975c6573475ddd54395ff7817232fe96fded3c4edb6ebc1baed323d34e104e724a15906151b3502f2133a7468ae17d51ac4d54c03f411da4c1775fce965c310fc7b5a466f0fd2cd76e1d83e55080a09ccc82f9631d3888a687b919be09f4533e5aa8c071c9623d5c3da151af02b56fcc0852187c3e4f46dd850b8f232e11ae5453426e42c68d23db730e6325bbc0cf2efff922430857903404cdb961fede582db9e77f44eb78013e9104482a067121d2a28e63fc012576ccd7b9b401b7ddd0e7416813e35baeeb07aa4581fe9a8570dad7f33e5a6bdc0f053a1b6da0f578842f97ad84ee61f6d00425870b2c6a8bfa915c7e516ffaf7e65553256710637fffeb0d9432da7a628dfa0630063f6b67ae48064b380d0756b1e3920e18248dc4286c7bdfb29442e38f573f18f314d9d22b0772df134efcca3f76b00d3922a57ccbc4777d43e4c2eed2874c8123548008113d55a95da7a768262b3d1ed3ed68558a72c8543fba9d7e8b47971b93cc26fdab277dc1214b22d89729a11babce4f33345ec0cfdcc5192f343567ba58554717c81c0a7c38fe0b998012f15100c60ac99dffb1a014e25ca929f687488ee80cd73f96559cbe1813b0da72a70142748512cd60d81a1395dca83b13569f54593a665e31a30a8384b892f0f473b2634827fa836811574a454c56c175a16fd398ef09caeafc89809fe75f492a7c71445a6fe9d70603f2f52efa6205870e80d94675e5a5f00b7dd8fd3d862f49fab3c994a553b0b46eb749eed638af6d2c879562a3be15498a1e86ae9d54d39b4eb490d4026903676bd013c357e5596cebd27c1abda6702d0d585792cb34d6c56223b228f929bd4b0697c93bf3e4dd913b58d97a32a5254e5510cf74154f210c0ded0dd66b7a37b215256daba07eadd9d0847816da83700b5a451130525ac8e3ebb0ab73612f6118ba6171550ce5ccdbb059d86f92eecfb418cc69b75cf57df237217a66dfb3a0ba1193c7420ed124ec625fa032cd64baacdf0cd57ec4d54a833feaddaf9500fa00eefae19f93957ee404ce151a49abef3e565e8dd8d29fc767dfaaff8731444a68128e7ac84d62ef7e109a50a1b231bbb93d7e5e53e50cfd7e103a52a6ed81e27cc73168cadc0d14ff2d7ef263cbda2fe7500e5c282695f15e36f41427343a80e79e58f4a1d4dd85b2e35bf1f12f4e54e86df0a0b4d7645d41a7fc1d8d0d0f2f863717956151a457d51db562ce83d201cca149b1b60fe10687d1e308651b94db3fb5da67cc37702c15375fc1b211cf508bd893a6c994ab849a52472c272ec06dd3c055f09aba0f6ea2afdf8af998fe606c6e680cd232cf18ba9139569b9e56f0dcd206364db87cf2b03cebb04c1f8377ea3dd8aa87acb78c75d8d7de06d79fb469f0fa90dcff5abc633155c3e32b413bcc1e9bb6926b9be1ccc86f95ddb413119b4d3e4a63a3db2275b12033bdf5e8c26202e34ef0220bfd906dd0e88e8416406b73c3cf2279c36d60b7eb70484034d911a972fccb23f8e71240c2b4dc35820934d7874ae4ea7f632c32ee458fdf382485c28518a6f61ca2ad97a9f5221d364d1d0d77fe9eeb0c945185dbebb9495920b7fe9a2056b7727ae9530d4a72e10ba4f6ca4363105c1f0714f56bea8806e08f81be91a09373799771fd99052fc9ad8513d13109f914d7976b7300258d5600d46473672e367566e9a0f3ad6fefc203d9419d1c44892658b70f7c62fb5264f5eeaf4326f91d5ea98f15837e5fb6f099e0dec981bb44332526f6678fd3cf63fe04c5937a80dc8f4c9e4310462cf94a844ddbec305f85b2dff626b4509fb396398597ed57b5985a4429364f3781bdbcf010c9fde0fead00b5d7f91d1b4f1e745cf447637154859d20f0912a93475ed4a6bc6eb7cede886152c756ee443691086b1a9c891766b28044dfa39eccaae117ab0eb6144d10d4e00a64198ef36a79030b0f3d367ae828912fa277dece79ac2df720ebfaa28246ab01e33ba420b90f617b5030544832ff5a9118d22f32594caabbda2fd64c799df0ed50446b419de1728d1fad81163f3c07745141ad9a88a53f55433fa6a854789e403452967f4a28f519709fc2e94a5217f955eec4329bbf9c4d0d249524b99615c8e483bca78bfaec106e3ebeb00996ce15c9ad63e28ba502d96021a9f8847bbdd184d8c68adb82ce6a11e1a9a6215d175fff33ec911a6fe8c5c1707ceaaab0baf0d8ba9b23c033be69a1816a09c7f0af65f6749c4152c8c9cad9c8543cdea3bd8bca8eee367cee427110c7b2774a793b63a6b984ab5c503c67b3d7cffc56cdf1d0fd65cfb82d8ca54d67232b42074b15eacf46f0983d755a92a6abfe4b0b126426113a32ce7484dff815a931d86eee0fb86b38548acd3512b6896d5d1cc636c900d17ae92725dd67049b23e7831b07e379418a68891a216fa68e7969c3829ec5671ddac210666190d25384fe3da230a02ae9f67312209a3fe8cc6a774880a13d2790de961ca6bcded3569e329d71eb418f44542e20ec65d550012595d0134cdbd9a6c3ed9a480aef3fae54c0c78dee33269056b99d4101766def2e49d2368bc83ef4f9396dbe68efe94ab2089dc7385a7bb70dca2430e28eb9791fff2dd6ba14c05bbd55ff44fcc9d1909b615190d80b42d7f273602566a0e0c0d20201c7302ed9b0b6572963bd8f1291908682741bbae9cf17f995873b89d0690567bd5adbabafc4d0c08f8981c5bccd0f5d7bebccd3f3ead0057d0cf8df6ecec69f5de7ad78b844f7922e843134943c9f42bca10c1d0edb836abe61f48473f827ede588b5edd3d8a238d9e2c143303bb729ee4bd97cf03aeb03c7ec9c0cf895f719e3d857d4a7390580250bdb6671a431a200f0fd0d1acf824e3e5d4c2ea4600c6a9843e574fff6ab7ab01bb2f6882d3d36147873ad1c6638f930431d7c237786d022691b5115fc66422b7f506428b986362b6ed08a7b20d1ea4e33c21d0444ed28a528e8e87774e72a995ec7fbee698800d9f6cfa7da23da0e4cdcaf542f3092a11a89f55049b5abf6fd24945c5871655c16beca54509a36e4ec41673427c3012a19da8425289c40a549572f28a4481771c3b3493cc5a1f3434f198f6260c2944e49e4694f3d409141da6f1fcc9eb66a52f5cae36845c6763ce2ea35dc603aae1c0558acf87640f8e3001dd881820f6ff3d401d06c21e1048df9c80184a0b3c50933f9391ed17805e925d0b103cda83d0fa00e8f5a2ab93c7e33f53291ffaea7c91eff02839af0a66c83558f3f27f3f8b9bf0ab3e22bcc977194f0d3fe0520f0f8b9755f3a67daecc73a8656cef85a0c9e19a63ae22fa0f9043ea25802431155ed41825632feca73832eea9e5412fca8ee28f0f3864f17013a578ca9dbc883d503efd97368a9e22c45e22d750601004e49ffe3968814a1acf0357e3d7f0169bbc09c17adf6b72042303527b5a951ae091326ffc095308e663175cd5180697e24baf9027c8ba0b8ef78b1c811f7f53c55a6e8c18406304a49860036c8c75f6b9cc5525144f4a3de5fd876c0da1ec407e33608231efb1e5495a626c6003269ac8f924fc39bd4458b50140e7a72eab763877e3c4c198c3c6a0292d30e0981fe55fab1655007b8464f93217513b173cfd257d20cb9d5646aa5488a34580eb351e2009a545f50f6340fe8fff4ca58e0a2106660d8cc417f5dfbafef5af82c5ad0bd24a124a296a943d7872dc801201787f518147841d9ef0b02485ac9f9961e8900eca68490c6c848e1fb421e261e2a0945c2a84051f278948073b24c718dfcae45c7fb8bcb0213c9c2c78a22bad390e29b6f16eaa248f770068908a3ba7fc699749a5d562b0ebaa97c81707b044869b981e4d05582ff8505023832dd105e08e9dbcbd342acc682d00f37254a1e2abd40c10217ccb37ba994680bef49da6a838571274f24b87bc0c574962aaa9a99bea819a1ce9bd701e1689bfbe60159740fc6079cddcdfb98136a047ceb9d630c579b948512f291f29a05a5bee9861f52ed8239a27d0bfaac89accb4386ff54b3253ac079b3609dd60d43c1c25341e09f72d97dd72e5a16b060c8f80b0f53c4156a0a68c82f4c3390ef8d354889cb9985d2376230ba593fd73bc6b08c4a2caaccf8ca1381c66a1767a500791a17fa6fd3128a0087b4572ecb7022263337b5798018f312ee045a178f26811f348b353c3fda8cb5fef8e12735f0eb86213f5bc53661621341751dd7bb5bb2c184bec7eefa46e62e1be59d9278a90e2af5c8abce2befcc18ea54b0e85b8127a6cbaa5c5470417417b74641fc3e09e0f0c49a6ea6eeb2ac1c16868d86224193e429086cc1088139d32e95e42a5a6d98e1923f469cfbd6c3ff1270e28cd23e40a6590c11d2acca284dec80033e0efe6784138055310781dad87ba27deae2db0adca781d33adea0ccd760cd58081deb83ccc95d34b40ad9d1f46b88d02b828e94c80e307598594b3f496714b92bad3df92fdb0622f96694ef38d743e5915ff4eb07746d25044222343e34562acf22c36dcb0ffc859b1473f1a6f7f9a7e5dba4e51de0428c72a21dbf6911add11438aa9025b52cd04144428559d65bd99365b91c600066fb20f12022635912358058f21d40d10183c0ca0801d77b950f349b664677dc156765468e098be6e3db8401d868f6318b11300d7ea8293403b48d345ab1fccb5a001b07b96ab4d27c81f0b09f3d8a720d8c8440eef9d394e797575be173a8511d0e8eae46c05e802ba7027d0a832d0bb25a066e3f973cff9787ad78c6ae5fd88cf66e5248f4e324c8f8f42f92efc163e99da04e3185c38eae77a5607a2b920da94efc7110d8d2ea894866b561b4a39d6cdf8e16325769b46c0b6f67430ca2c178b57590004bc8b81b3ccaeb9982b6a98c5b66cc40ce12f8f25110391cc84f347634d021061391366a417a1aee232e1548fc191007ced4b12a36ab8caa722ff91e0fa98c383855fe1fbd10c2bf91c0b91a26a21065572e06fccaf8a974dc44d7a9b7ce5a69763855e849667d51d75029669a4fa87261029286befcf54c46fd3f321de7e826bb302712ce9a1aa4d788827021d5448245f3fb93d143058208b9f8fe590b50beeffc23831071e29cd541ca18ad8fe76225a20f0f81738fca39f42c95a03430ad8f545df20686fea13e81146195adc7b8a6440ffbce76317234fa740fccc59e9a0740e875e11c6698c7c783f7c075a934c3dbe0675d7cbd739cd59b08d798f3c8d04de0f05d8f0a034556cf44c758e47bfb250efbc7fd5b8247ab828c1b94f464df1491e8d1ec2000ba91ca5353955d5368689adf3e4b33cdb5ef74e816815dc3467f23c6d708bf23f651980e80cc3fd7823ec35c0ed230c571ce3014020355305df1793725c4ecd854739416086d3d9e3862d7118a0a7448d00e878ddcd643bb713ffb081c6e83d48f6fa8a3b44686b294538247ac24394736898fc27164cfa1e29999e47afba5c21bcda24f52ae44b8c0bfa149cdbcf2d93db8ba2e297274c9f653224e7a674f66f9118d2f4d780ddc81e690ecfb0fffb0f3414306d727283acb6b5f4992a33230ed487a6814ae8923e7349103373f1f3fafa322556c67dc93cd15003fc55431958271a5917c0cc6e275ab012cc372e8f80c2ec38ef4f811af73270a35859e9cd8319790fe7c14ee18b49b464b758c1d0c8c0bd6c6833b47f28077f81896d14ac1ec30f9b95e8a0d56eaa7a069adb0cae8855d9ea5efd0f65ac8d462264d3b167dd5647803c901a6c023c1b45b226650f867be589a56a0912b15454abcc454d09883a5d394c79b3e90512a85e6e70f1f112ed9c7325f5e8b7b8a71e030a4350404cd6040fff94dc614dd79c8eed74214f72a190e674fd24697f016af27d12cd3e6fa0eac6a39a5215334787d4f16a9be9ce984017e9379b3b1c260f843b140000675653eb751d17d2744552fc9e6d36706ac7195a0324f48a7c02dfec8a4d51e78c51ba820248e6a1cf6193e57d7938e82e0fa45aef221583321c40590caa9b4da621e124207607c5dd44af2f35f872c4ccefbe78e53a375d47a0b4f237ccd47e93210a36292e4065792a22f4dc809714bdf04b347af250ea7816b650453f7f4fce165d76e2b4bf89553585f3137bbfab1f26d256277160588cd7ede965b83220b9a52613d5b1bf0156422bdade80e996af8a2ae027064ec51c57d252e83407fd22f48aa50cdb78e4e9ba136b5305e4209fa4250f36c91d2cef89530810f539b2b6ac035ef8d460a6da98b3674191468868adb2308f35bc53bc58d9c3f5f9f1c17dfccb1110da483a87d6abfbe7f526aa92c610d7da32d3a6d90c0742f1f4bb537b5a513750d5fcd635f7e1b9202299cf66b132c9444ef7b2c2dbd9ec8f557cd654ed853f7f5f7ef45b36e00d4e011125f02e47b18dee35f7d5dd1dfd8d723ee9122d4c749ea42253252e664cb5ea50f65dec7974773bf68bc600bd51208f3dfc3dab372c638f598f9df0b077e515ade242a925aef56e637bdc767ab95b21a20f9c96bc9ba5d0f529042030271892dd30c76733b649cef9acd0c41136b00662501d785c0a2e6b7b9402719c8e5af9cb815f4800a26eb38896a2b700ea4a8ca2e727ebf1c22659de4e7870ebbae10a83f2bef3e94bd1ac034958f0c0bae2c34eb3e17c869845b69150b8bd713483d02aa28cffdf6be62ca5963240a4a5cb990980b73cc173d33743b0e71283cc32f430282d476b767ab853e7ef98237de60ea3b6316a217f5180060fb3b2df2a70197fe4a3deb5eadc07353b4f6c3378618c7af75cc51e8adbd703ed5aa0bbe881871944e8773341a86bbd433aadea0db8ebcd55b7afaea09eafff087e8e251a630b99fd27526465a8d761527a38606c8117fa94866fc9aed279be5610c31ba0f0c3a608bcd7b91688390a17275c66e68fbacf01ab2eb319cb8f9ca5b4aa05e664e94ff8d4a362a26a528295a10c4184c072319c0c3178ee50342704d112f53ed6a0e991f2c9ac55f2a396ca40af5adfcdfd723b8ccec609de9891d41add8d0f5d0e4c60b9eaa472b1321efb4bf5fbaec9104e29dce25886c3fb0962874d92f7898a1e144b8f45a8bc3edfaac4a71e2f7b84a97c7281080da7c9424c8078e80eafcaa7d933b7d18bbd880acd3caded1bfdb8186ea94b5f56ce42621208e58951381a8bc65101057a97ce4386a89d16e108cea27464f1c99499c78083931ba00207d681c15d0d156e93a1e1fee197cb1421d6d872089583c27cddc182d9a487afb3fbacecdc1a50c5be410989c8864e47a3ffcee8349ae1fa1b31ff11c4149aaf04b4953e1d938f0fc2572def14cf21aca7c488a54aa938dd0d38e98d05a6f34fb33e2960df5f164f8f328b4c0517a8e2e1a1a6d45623478a1ad8f6a2e4065f0ab3783e0c220ad7f984047d315a5abfccada7a4407a1a34d68944ed22163414da24e74d029bfc1adefa51d1f4b8fc52aa4205d0057e63be6669b8beff2885a937aef526948c04d2cf42ee3fdefa3eff1f1989c7878d91f3af440b3bd04f82455ee4feb5bc104fe05a61a90de721bb45732d85111955ba82fe5c229cfb7c78858d1e199df00b934d3a15c2878c7efdc63b745f2b57e76061d8c7f1a1c72e4eb26ac0efb1c6f2d6633573d6e261cd8236185270c5a0897927870f51cd9ac29471f6b34dfa59b09a2a71bb0cf9f0a42911ccc73413d2f1dc5b17a57573a135ad5ea30eab645fbe820d34a652b8bb48104c6b90c1a80744a0b8d3fa5310594e12c9df72559f65a6dac1728d14a435d0bfb469eb4bd819761a223d681a0c85d707e9b1f58dabe998a041931767a5ba5d55b6e4e06f1b870f7d6fee4147e790b8cc44adb08e48cecbb63933e7f5942163ff6354cee92c625af6f1beebfc4bf18b8b96d301e6881a5ab1cfe5c6ae49b6fc37b184d264c9957435350a1a5bf0f0b01f5e927790f988bd0ee0e1123907bd41ad21dbd2a701988a60f75205d998aace4abd84ad423029e67f5040e3b9ed9d27caae762080e9d8b7cf418793aa70dafb182f6494a309e74c1890cfd943abed65c4b887b43fb692f343aa645137921d21d549b97abc54a7c343bf1190f8d1772d1376ecbfef5aa1c7d87a0b70eb9873d6e395616c447e2c7adfe904bb627a1a8e3951fb7f24aa72589d23dc4b534207239b22b0972fbf60d3886a209b0b35bc17c71c805896921056d910281254c6dee09c36380da2d3727a93de2781ad50d4863af173f105ec0809b3bda10d0ecee4c17684acb478ea9f3a19968769fafd6bb47b2620999958c1d58837e3a4269254ce4788bf23c6f97d741d80b0d779d3337904917436639b2ce5cceba7569bb2b5de9db54ee92e1bc2fcf8db27fd399564d161e1776d42c3a383b510ba2295be2377878ece866220adc04e74f6237fb364af409cc6c5bbad376ee84e77a0c68dcce0a4d94828f3b776e9c5af780c363c173d544ccd4a061934613d1f17b2e62b7e1d2cee5d4d8517ab2b29f8207580600a993269855acb8483cc3207c1cef84a2b1b84d58f62b4036f30641a0f2ebb40d9b8ebaab95c292ebd45d2034a3fca96a05d190adb84986c5705e73cd0d8450e5c289fcb911e4c994ed67fcd92e55c87123ad2b845190580526d26b62790f8b43c7b860939b8b5ee751959e3c333ab2550f24e4a90b943992080460f1abe65586fed5139313ca20ab80d02f667be6305a157118f719d5b07bfc9f49781b2fdf3e1372b0ca5c4aaa3aca2f9373c1b91b1dc6ae5b385c76fc12e89b4c65ec7206e00db063f77c1c555bab2462912ed64faa6c6f74ebf455a829f4f5908ecb2584185d057eb55829eae5c44825d3ea562be300271e9f09880caeacae974671576ca45b5a1da78be3fdc1147fe45f802ab49670291d0a7677d592081c590308d46e798daf5b5bd2c52b1adae61128b7607a5d693160773a55c9237f7252b1a0384fc888275bb8a5d585afec8f4b03c5674c170c031e638245ec3a9053c096e2bab6a0de07290dd4a2b52b9f846efc2445acd8f6200fc57caae2a4bf20b3fc176a7dce76b05da0e1e5f743fcab0f5ebac92194fc77d14da76910b873533ba1238eb21d28f7768b273bb716557405fc8c7ebbbccdc0cd7e521b918ca50485c8c7aab012f4cb764dc0e19ce690a9693438831fb227990b984eafcb370354135edb4416afb920e2c4fe0d02a235b991493bd237c9b20d8d389626c74553e3b30164d7fd7f3cfb159ca5e6944510f8cee912e921fde2c91d4c7e84fe92687f66cd750ea42ddd6b5ea1a83f622538523c72321eb88119887d9e34ac610545514b58c004b8d8aef521f83cca1ac91f6fcfc78bfb9f85583a3e8804757d0384c5abcde34d3a202e699ca634b9cd05339b1cebf345581320106b912075610e9a392b0d27e46315eb8a15aa3842e93384074c139b34f3008903025e5331b3458b545d5fb5007fb94dcdb733d5ba52032972b38d5e3a7f28e72400737f4b63f84981807709e727cb26b4fecb271a68fca6af2aff1fb71c53f95bbfcbede49db8bd37fe0f7f5ce5e5bbc3b622fb18cf6e6785679eddc7788a4e1058498e563c16af196842f8f4ef41bb337974aa428e80b41402154de8f032aaddf0cc964f34926f88e8bc4ff030960f5235c2f3b42bf0d9de1466fa34c1b04dfc51932d96a92ae1d0fd03d315093d328789000bc49ea94597fdb6522e25963241e6bce488b95630e5de94c671abd5fa48cb5162c898123faf8c95bc45daf0a12ee8e8f142af3297bb5f43ded297b2292f334fb6afd5ba12bf8d80f97fda74be5698c008e7716286835be258bff0d543efabf8cae19f34e257016476211112fb744bf83c94bd68e704ae4f836410a092679841b5341ea87e205b89130e657e7778850fc910b8849f0d2c453d85db690069f26601c5118240925751e33a2a4dd9e5a65baa4b0e9071efbd4f47b97dcad8b9db9462fdb496372c4b885d28497e03e533f4d0c1603da7d5662230c4ae7b7c0ec2107db9d24b797e18be91d79b2cd50c969f9605ba770975fada344221bf60aa1b1b6d407d8a864ed90368807c914cfe12c515d04b76a6486e4f6c45bb4b9fa46ea191294bbba5d11bc60c27a63cdace6a288b7ee64d9fbd4a2f42d4a14c1f9d4aea89a1f8787327101b27e925d6a3afed1b03efd05e055f918d5f8b0dad60c05b55414619f1b5e1a0f27e307c0df4afefaf6ade1ab6b59d9c3a99b3cb34003946dd6829b354896aec0298d54181b2d1b7fbedc9de2d5cca06bb61696c789459ca788965a1c9519c9512971132e79716328a4c9b208418d109302c34e900b3f56a0b422751a9bf7025c8f8b89f98426751850b6ec2e857e5964429e06b8e1a6b52b592b675e4fc0896cfa29762e717df3dd58ca3409dbfb71069038c2396e052aa500ee99a52f2e5688d96995cd4e535dea2351f7bfcd473543feb96c5b2d0e7340be25632a3a110f599c01710d1a78e54c399966a69dc4bef30a4fdbb0b973ddea32f13e78637333171894b88c32c11d20a7feb847c00ff6736c86dc390a135002b87c4ee5472219b9e1de8cc47dcf77456e4fc968d7947732cde4dd194c79104ffcca99baca8ad413e9d961321f9f86f03839231dcefca5405280f0820cec0871f0c98e5d9e64bc70de98c37533bf207d9d060259390d1d0798571d0c5a9941c0b789b5119253f00bca4f59bd5ec8fb578ed487b81df7dbeb30d94f06d0b1e834cac845d352bc7adf3175316ffde5275a70f7f9e6e3981b8aa8c2f477dd9546f5b61b613bc326724bd157caaa61ce7b8f0828c570569dfa611553384716b5cbe18556f2a83f5f294a06edad43457d93f8b2a8c0d88ba8e447109d27e69010ecec665bca4b5a7920dfdd9829771a04e6c186db2239771886c8cec03e3a76d22598e0c921f661f04c3a46e30d3daa7aa2658ad9458e6e4395ab8c6be490c994d5cd621b70a75ecf87d58ecc647b9c66747b417016033431a25235b09f979bcfa58d2fd1e536797eb67bf1c88c4f13f2ca995da4ada7058918021a63dea1e95c7f8ef6bf2fd080f0d8a59cdea2a854f8392bbc17d9d058f8be8dc58749dd3f4b89ea17f4461d987b62376cccfc0f29b3dff742d1519a7cb072b12553396fcccb6a75f6302d876f8f5d5d47835583ad9783f73e93bb84faac4dcbe689c5d004cf43a742f310dc86e4cc6cb98783e1f3d6e6e5677802e94b815f307ef00bc9424c957a9e201d94ec7614b72449f400fbce1bc9481aa2f76ca2ac68b65172442e16da1162a69261357afa1579ddc34b1c92d889bdd48ccdc8dc4cec04da28c5b24ce1c6f53ecc1399fa01825d427e78b265958ed5534bb33efd48c4937a425c5f66964f4f03973be5aed1008a5b53eebe8ff88a3894d40b5eeb87e90301b8fdc11ff871565efd16208e9a37f91c441f03adb676cd0da5028021e5fb06d605eb5e3302fa8a26b2ddb41398ea04c0c041e37b15113a4ec78092079fc3cacb2fd1323f404b8222c599a8078381d39809c806a513e481f6115531be1943202e3cab577f9cf995f29a00040ed19d6f1d95592f0d45248565e4c69800f007cf5b4e82d7453ddcef76163d9e0aafc6723123900421c98b3df678b7835d616a19c37d78cca5ec835fe7f869b5386e2fa8ca1306650146b0a73ed88e7962086295b2e1b8cb51d3921c18591afe46d3d49598cc26c910fe1f9328e4cb86674cea954d521c7da14e173674dd23513340c52e88f581d2af85c2803692c22a79e9183e6d761273c2bff1be4438c1ee85362c7c8974ca30386fd3d663624406742695569235321e8bf1d28e783e40325b1d2ff15d6d771743f45d118e5eadee9817f520dd4048067f8c89f9e89c25e12856d625befe9eca4a5dcdf67d82d224d987ab747fbb76563612be506225d125bdd05309131f85c1c9e45d7439f627d783f99851c0f8233d4231e07be97900c68db23b67dc9770e7bdf9fb459993d2a6f8c1ee0496cddac275a539fa233e8aa4fef8649b0ba3ad3a27132920ff11e721a98f11478e0cd092bbba5af870b7af7463e300f76608c2251c7b2a64d97d9925dffb80936a1071369f40facba4edb601cc58d034d13f836a15966e892d4e04b5c8958724d26b99a7a1435a4d0886b8931c1ddad80868fea6301bc4f899162f7b5ef92512a00b3c79d4d04b30850acb0f96fd514be40d1149193725257a69213dd099026b78aba67a49139365574801707cf1166ad066f50ad4464036a9a92845a30d859a503d5150ea24aae2abfaf6f17d4251926d95284b0d07583453577ddaab2eac8ff9949518216987e00d16a3740813f0cd907eac30ec8685e59e6bf18b9526c2c581ec4f6920930c4e3374288dc64ef4db69452ca94640a1b09cb070108a9af144ebb42e40430d8a20b2598e2073ee801a441128d0a4cc423a8a54054c0015012a44027778105322eb3ba30c44d5d6671210b26a8ed35e49e55b0971354ec45832bb458620a2b2fb3b478c19482162eb0a9295a9820d3620a4898c2c2228a165aec904aaed4020457ca4fcd1c61719485fb5947e20243d822064d24010928b000ce601e019738c2c251d18f91280c41051325289283a3a19d9d23748ed8c9c97aa741d03ccdc3f3c5db90461a23844c1eeb971d431bfe90eb2517367422720c1dc2e89099e7cb91413a5a3a9ee808d271041d2d1dad268a1cc618638c7436e7edf365cf16c3af5994b1b93df81107d83737db27e703d46edcdd00f44a7787eca5f893a390e8f61139747dfae0eeda8d7f779d9088d24927a52ea7006df8cbc9c5f6808ab0bae0e4629d4d788940a2f67cb6b397fcbbc855d87d7bfc330a2d23567809f6e3a03a448b0618c3c08844e4f87abd8a9c776bcc742f3429973802fb79b75d6accb8700d67edd516117a4848fa91eb4e640f4ded8685b8724a29a31f89d147e047a41f91b208c6f17d5929c27e2fb7fb6bccbcd895c8b113ecc758d8ef6f7f845d032c7261b93d936daf6be62e85db8c65aa405f9e72c149159c408ce5e4fa37c1b831cd0a47aca3d6155834c25e114eb1e48a758a1f2805b6473969bd4858663a994e3b45a680724f1a84f084aa11c0944065700b4cee8a16637cb20520b0b4b0b46ce10a5b88d2e2d2e2327d34232e2997947ca25483d48bd48bf9840aa0cb305ec0a0e2095488e04a020c150cd511239ddb9f5171448591a5820aaa2ccbb24cf56214543726d048e8856cdbb6ed8518465a882123868c295224c1945099c42549a412198f8c97f153984c098a53a6b8dc1e0a85423da7445c298285858585ebaa60822971717171e966d42ce8c58b172f66c0540145a552a960685cb1566104abd0028618608801b5a42651ad0762c864c890212306af46212fc68b9172fbb3283119e4aca8e2727b3366cc98210300aca84283060d1a00f0899b11502b81cc0c32334c613405152a153d36a0e282196ccc60a3c89423ad091b333666e21095d60c0d3334502e5c2eb3a810d110001a0240e50a1320714508ec1001a82100580df10a15d470a3861a2a1556eb0a262edbb061c3c68d1b538ad420016434d040030d021080d191aa2901624334386868ae9dec0a2e5ca1051c36e0c081c50eea320b0b12d85063830d1912322c80ea94245870e0c56516163e35396a726490e3674db24c164ac412a4b22852b130ba5f8645156e7f86051472dc902387918f51122a43bfa2e4061c6eb8c1e77e19eb8a1e4c2b44160e19841cc40107ed46b20ccb6c618776c15a1144a222940551164eb8b20806042cb3ac4872bf8c6545129e8511ae8e2c478e1c3974e8682902071c70c021871c5892c821871cae1ca28d8d76e31d841101cbac2a86ae58b5cbaca39f9912b30c7740b61862b98914299774b98994a1cb4da4b42e37911274b9891426f78b4da4d0e09a2e3791a2c4855d10985605ed0a55aa707b4f8a30cc072fc7bb1032778c30ca920ac8fd1270615761bed44f17f6cb5ab03dc6286fe24bcd479cda4dfca9f9a054f3112f129669a5cd9a4ea815961697d40b18aa171bb2e53490875148b256d40ed03bb2d61631a2982128a846a6a686f6fc5706e1fb730080d7b94e866e46cc0c18cf058646143104b10b0d1860587d3089218fe9afa969f438ae9f9cb05ce650ad73e8c49a435e8bd683744fac2a04430c1c85fb9d583484b2560dcce5c7bc981931a4eecae895ce6b487baedd4cc0080342f4d3ab3b3969af8afa021a814560111964000037c44a5501801a199fa2b0d767ad1a32ffe2c4ba645cfe13142ce37e27d68909b74f51c4dc4ca83dd9029919a288111484924866b0f1828d9997998cb94675f9311a029031d7c0b858f6dcc40f31b418388087ea0b1f78e01a6ab891729755cb8a86850b9a8cb966e5320d3687ae3984bafcf30a4c0379261517eb6616590bf21ca0779c581ee35b18d19bd241810d354cb8df1c6acd2b642dfe160fed39b166b0b810801a6ec0c174430038e8b0ab6ca5ddd0a7d1c10f235cd1e7af3083abeb396ba1ae8973cc2168a36bdc00f519fe554facf67a0ecd29e0b021b38126803c5cbafc1009a6c96012b7b3d61c228a320482275c7ed904ce0177a08d6639cd89d52756c6ba7d7292b5e0ce0741a0438776135f87e6235eff1c6ca2b85fd6d2823226409e28975f42e955ecd5279570f925123847c68236bac64fac53089cdceff484e73ac95830c709886df49f9a745f0604ef4e2cda9383cd15b2a1a116176c2e14f0b2a06031116ec63bae1b70e0e061c3d24187f6838306c023ab376678447e49a5eed5bc9b1e9967d89f826e9f58a7272c6304ee14746a5d1e4eac2664b41ef1ba6482858ff1c86eb2199c27770e39b942b7a17031876e9fae894908b2965006c58776133fba7c171f9609c189750a6aefc6bb9313da848f1fac6559cb63fa858c382b2a72f961f4405d171f24a7208ff1181e9ac85a4e7362794cbf67ad136b06ad878d7b0acae2c4b2325a0c6ac52140130008047282e2c43a35619aacc5d9a9083783d2840ed90c0d366690a901001962bc1860a00133a3e35e468c175e54305ea45c5a585650a799d4d53854f153643e7dc935fe4cc3062ebf2c42a7f734dc7e189f34bab1230911c1c2ffa491633fdefd0218d0f8f37bf7108605b6c2864354a791f37907ffe42ac9080bb518588f31c23a4def6887ed0d8170fdca0a6946793d5db9b92aa5dd4baabdfed48cbcf1107630dad7f0da6b3f01063babde19f4945d7158e47a17d96343ff41ed958d196c8e60bb0c2761ddbb95f6aced55bc90617ce9151a761b8fd1a1639aa178d7bb1f52b0f0bd2bc3858e839bb9e1023b03dfff47f34862b3daab98da2b1b747a4b27fc742f3cc7328889a2208fce97a0253f3f3c4744c0040941404fe840a78b23a3a29450cbc2f079a18869a03c48e8c4c82286d14f1354076b052951a2841322a22265c847c8c7c767becf13232b6218f120813a51cfb4c8a3b36385510c23247850318c4e318c680c238f61946995a52314a4b3e9f8c0f8513224a462f908f9744566f7b2491384583e429cceff0b3486910f168a242b484827288827fba2a32a4241423d413a528a8a74a41415c5e0117ae1c8a7a84887548574443a7a7284a487e788085aac18314e5447a7093e4f6802510ba0ff452848e888be48b9b4b0aca05e74feddc10d5c7fd8cd4e04d7df2fec846019ff22db1ffd6bf88debcf2c2e40b90e5b13c913401b787299d585255d6881c442af1a0e61612c293016f3773f8d62fb6d3c87fedcd80c039b69158b59c787e9b1d1f27f1a70277c08770231a6ecb6fb5e6ed70984c42f999d2b97ca6eb044d88f5b1fb378f05ab354ca5a6ea25e6511de185dca80b93956292547b9753e119194539043574e01da90121231333373b700e3c66ae0b8c1c3b58485ee5dbd39332818f21fb0485f7239a91b61129ede895d24b69178444516492971288a6c492831c88964229f883fd795b4e70f91b4e74962ecba278504490f122447901c51c508fb817e7339a9cbec0fd988a9c42222a128de7ac272c2ef70c9f56124d795803cf0487bda8dbcdcb50eb6d2dfd9f6e27c55e469cf55b103226febb4e71fe459e1d1699e2cdc7d2c24bd204667ee9b6166be91099dcec12531323b333bbc6c5f207d2c8c54d83a040be50d341296d1595b5a8691e69c734e9d1e1f1d219d1d9e961248a0c4e0da40a5f304423c516c008acb87557a6fe692e44f7a55213ca6d47d55cb7c803a7c74d1fad775d1c07eb0a7a7214f8f843a4a6ec31fb8b3048621b95060b32a8412688413ec077b749218d1732131826bf8b66761d8abef83d3c01e8fe917126221efd6873e5cf9407aaed7b2aee782b97501573e7b95d20e494f7b4aecd8979e14111642121418c3c4f7987ec83c63c3e3870e3c4016acd18f63e67effd701376e2bb11fac10422827434e08d3c0c21ee883e9b4507b3b9007b694b80da1c8e0225d3c3a1ddce1b1b0d5e2114513ec07a3803a300a2a39f8d31ed4813a0c7518ea305c12a47387324802417c7ac476ad17841f1121f48215427768a3563987667c2cfa1138236b42e00dac2c6394d163138a3eabf6275f8ac4d744df10e9d745baaeeb35d031b4715df3794e2a995fcacb8ff045b33abf9aca6c0ecc3d1263c7eecea979755f75778eac841d0bff5bb1760515dda14bd932727f6b9552fe57a17c2859967afec4f8f2a57c223594745520c0c040223d897a1eb031c6954a3520412e0d67e5069191e4693757576304366bafbb9dbdf8174719632fbef51863fcd87df2a7a51a1007d2000ee76f108d4eff2af463d247dff8305ce3daedff665c7e8e73680cc335d8f304fa685cfe946d18a04b1f083eb8f5190876679ee3c03133e379ffa914f59a812ee907b7e260112391ae0e6eeca1565672aee3acc058df1f46ede8cf97516a38d29932c69ebf759a8d63fcfb61607b271d30359cbfde556f1859968c484b6cf0599ebd3ff65cfa2f5eadd47df676d6611af651f3a1fdc4b01b4c3362bf999630bda219c618863d3c02e680f131cf32229aa6699daaf441b4f72f69efafbd7fcc2ebc5889fb22c9895c8ccbc92e893ee4be78e957d7a074024f91a327474c2e17782e57b9ccda820a77fb7eb8dff50cf3f5d09d8f955803c2aab0bf9ef412333dc61c499ab8ccc86a3e4c3de40fe96b320db9a6cef4b39a3a558ded5d36f6aa94558e8bf56b7bf3b976597b38b0f04ecba94ccf2ad3cbcb4737de8bc4db9bbef498d46e4adbc7ad542a99ba52f7fd70bfd2e7a4eef6360d448493cb40433cb93397818650e296b6af5fdfd4717bb6fbe2adddf7438a6a37b55399bc4b65fad6b0af5c8953d5e754f5374e35a1b0d1963a55e9af276d9daa24447bd79bbad8def5f111c65100def86387dcafbeb5a5c7b4daa9ea7ff172a7aa1d1079ebd7aec4f1c56d8f45c1478aa3cbeaa23e46edf6f6b957f6eb13ddf9a5afa4ffb26b7aee784ddd57b7ae96ea47cd87e9b7b7e915971e8b0273f02d3d0fc6a4c0867a55da4c1c44d2de7ccbc124edcd6feda6d4f1803c17ab1907adb437a1cf06ec075b77fe077fba927efef46a49afb0c76a76711fd4b9d7dbf0e8d5f59094ddab8bdcebe6c26a8691be6230db3e22377b87d6daf7c1d7762ad307b19b0dac0ac77e7deb999ef444eef525ee1b724bbf7126ce725fbd5789c82d7139d9d5b0bfb82f5ecca63da67f5d3a10b96a67d01291e50062fe909921b1d7cbc761e334cc92f4e5f7509d86c80ef9d653fe4e1377c8f7b8a612ede0bfd4860a74250fe14a1a3846dec0a8dd50a8cdb08cfc6b047686dd61dc5139be93e34b7dc00b73d42297dfe39ae6a12730e9544a2692caa7d2e9f46f7777a793cef93ee753fff9e5644d291329a9a4524aca4452399d98745276ea4ea5ecf9b911c2f8f67bd5abee0b7b680f32275932f394d35e4a7f4ac94a2c430821a437b01eb01fd4b9b02fecdc5fcea79c1097913bc93fad9473525a2bbca037778973c49b23887ae58eee1281fde2850e6019f8f0e74a220b2642948b7831e1c090c844886ac14e33afc85a0ff3af0e0393fec54dad07520fd7cf0e03b63504501cb8039b5cf5180bdb54fa2c709965ba0986b1d3d4671257ffe2e8f5b4c340ea5200e96b8701d2017847f51818d87e12ef907207e578c7e47807c7dfc19a0164e70dabc0b8573cddbdd33ccd739bd53c53f44eaa566b7352311b6a9d8c289b424694115ded48eb644419111618173d77f70d9130ed9227f6c49ec8137be8114c06394dfdeeeee2d86362178bb806a5e3898e201dad9b43111d413a5a938aa1a124373e2b5900d7f4e553915c4a2e25f78a52915c4ab28849810ddd8c071bba02169ba67e59ecbe9c8cdb97b033710232894c2e2ce208994c2d6039d2e8caef20a1d8ce2c28b77fdab4e29c1ab83e7f36842c8792b3118a32468fcc12ba0ca463d3d26ea210b1dd3d42f6924f27393c7429b97c2a926b894bc9a5240401cd0373c0d4671b1add66996e1e8750dc767777166cc234b163fa3b2bc26dd9718ffda093a09ecec1a1f67cd819bbcd72cdd717c3400e48046df863dd57812bff13e24a965b0e4a69cf9f66ace3e4521cfad11f126ddd97b25a97755fdf0f12b509ae4b0999a67938c65f22c15e93b87eb10e16b14c8ffd9a874772973e22245804448499849fe301d96eece010eb32f4d2a7810bbf915c4e70064f8fe24e8fa19eb59b130a853a3d24e23e6884329dbe3dffd19e1094f6fc4fa7200630f1b9a647491174591e056484d145d5ac084f9deb1f4ccd509ca482b17613a75839d43abda75e1899dc63fc51a8ee93429a01509d8c72ea644beb810d128bb4e73f045eafd29ed6031be4f443e045fd89932cf9447bda13d94cf50a756451a86885fdde0885eaa493f6fc7354f7e540230fd5f957ed0655b36065918494881671cde9e1a55838bd772a93d57640fde9d4a94c74a857aad3763afde974ea74a8c2a2fcbb876b4eef8fa138ac66c1aefce93f69f4924aaf50ef2f8fb8c6f4fe988983576ae12f8d7a65ea542c256d07d49b4c9d8a451af54a65fad7341cd4b3742a5307c4bba6377530edb9c9a9b4e78fe27468cf39be6e847a4771720acb18b1cc14fbb9d1752023862e5fd46359f6c274513bbeeba2500f59bb41791639d46fdcd7777b378aa8cebe4db77ce4ecb3867a9b76a35e39e9d5ca7beafd652bcbb4f7234a057b7a23aee9eb3264a4529669ba87e950af4eef4f897ae5f2fedcc261278eaf0b176fcb43cda5a5cbf1eee9b113672f66ca62af50cf5d5c140a8542a11e328d34e2187f14ea3187b0dd5756fec4c19be2bcc863fc4bcfc2754f7b8e9256304df770f770719dde95ceb521d8d3afbc1bf58ae5fdb9afaf3d4e43873cc69fa59346edf90f914c74e8facb13d8531704f5a75fe93ed49b507f42713de06596313d0633d4a933d9eecbae031135eecb32ee9350ae3fd63d40c44b1aaddccf8d8c8080ceb18b3f9c8677f85b67e91625b8bbd7b8fd35daab32ad6dcfe767377c8c3df64ba5b8868abbf8021db22b3b3f82714353c6d0b20c078cdcef05a8082af74bbdb0896be06d7b19a808231d024cdb22628199b1e0491863640216038481f96366261d413aa2c27c7586ec2647bfcab862905ec05e329506a3f4624b5997daab96da2bf99fbbbbfcdcdd512b2b2896538bc9c5a6b61725189a2a7bc15e20c5b864d4a7dcece48c08e3341a06184316030c5e89458a1a356ad4f86eb8d6abf134cdef6c6f2273363ffa485729fdd9930fe502e0cb54b37440ec00f680f6fa17d05ebf17e13bf089261bf8814fdcfef6f941097393224130c9ed26a0cf6d2aebbc5230e54f71dc2fe5fd907af6be39a4bdfe9cf6fa7f80da0ef2e70773e3b3bfac4184530dc8056eec1f26cb1d1f9c460823edf5db60fddbca2ec8cb2ec2277aa5037bc1faa4fb2ebe9eaf8e67f7a55c42f8f409cb0ffddde37fcecccc3eb4078fc06aaf60566b7f8d957b87b92e15b995ac063e0cb1c06033aff87a9fc046f6cbab10ac5fd775c99c1beef5d12f87698fe3eaf2f8feed79b6698cd02762eba28b2ebad8519f8d5ccf95e31d5e0c1773182e16695c987b71534300efa8332e46bb8b55ee62d75f8c24e362588c8b652f5c4c7bb95869837131fbe262a6d4c54ea8968bad508e8809f827048b8653af632c2da88bb99c2e96325dec058ced62aad2c55eb48bbd905d2c06763119a48bfd7531ae9b312f06232f460306bf580c59ed8bc5c4e07925efa2644fc6f83e5bee5ec335ed3980104258e3ee0e6f8c32f322943d3ab20c942c03610cfc18a9960b9f61cc57ba4b30207c700f06848f76089dbbee8bed3d13812cc39265f8eb1429d10893021794524a83d0ba82d0846aa403538c48c12490912bc85635023d429d0540a20a5014431455f1e4063d5305f327890ca8125396f0000c7c8a60032d302104104820212021814004246203212c566082244160c207f007a88821603c20234fb8d865202359dcef67a6124454230cb3179d9cec8827d82a2c1160b10a7bd73c9488d6691d23774e9f39a98c08f300fc814be08f89dbe3eeba6f883361e2041320e84cfea9939312824dcba74dcb46c80749e01f52d73d2775ddf926673a601245a11e7eb4e74ffc4ed60d3337da8349bdf480ccad0191777693ab442ab121121541d011a423a885e839a994524a1dad6e26f1086da422a12ab05f0e0fcdd97d35c9fd72b24bc9a5640ad8116928812a451190911f5216b92fbba567ed4926926600ec6aa4c748da0da9f4364d3295380ccb58c3c9befaf623f7c52fbba492e94bd7d7d7de24bf6a3eb4a78f951e1e41b59b12ccb415cba57ee3361e58f8da974ab1c4fe559276038f8036fa2b8494e348040b77ba8f08d4649c4bc054fc309fcd386e61bf68613ef943c4558aa552257b7e28d42b8fd2ab6ba857b535c48ec35c7fb134f06805df57e8bf4b11721ab8633ef7cbe755ee8c46ee9c4f5f567a4564a53dd81a852def06915c8a118f12e4343ee431dd05dde942dea9e8d5611e656a3ee8c53a176a6f3e1027b0f5af3f9acd339ff9681ed1cb8f0d5d4577fe6782ec3f03a459e47ae4342ee431f3e79190d78bd12ce5bd65f78ffe18e59a31d7400c6a379565e2b37675d3947942f33d9f71fec5bd0bb913fc09ec51609aedb5ffb6fbb950e93f97ea429463ea571bf54b5c7d8dab1829ab9c7ffdeb8a97d7d6fcfafaee52d3a1c7dfcba9a4ad7d00ab62a97453b6d235dabef48aeb8d1b22cc8d7f55c8b77637b4df8a424a9429224fe4893d52f0c7666a04c1421dd8e342b8108e0187ef83c6d23e40264e98c04106d7ff13c0e567c1f5ff642e0bc58627a0f10383aebbbbbbbbbbbbe3709a0af0ecc00d48c82e88f47061c5149258a1040750007700f48111007d608705d401d69dffb792be92be6218466b2369cf6bac8da4dba7934061915c277de51abefe3ffc224dd6608c0fb9a6c215fdf8195cd58f1b0f2cad1827640294a4a24feae8531e5def748cc720cb3efe2c61f2c344675cf778cccf12d23b648225a524e9fe9587f622a93aacacec083fd71f3b4ad9d08ff423fdc80028a494861373657dc835d7d78f197d29715a0a9980d476884f553285139f762a69d39eff4b7b42e0adb5e3517d7a1564bebc6ae5ae5a6b7dd93abdd33cedfdc07e8d2449af3ed9489a05d51f736d8718abfcc1e9c0437bad53cadacb1c661d4b1f913ec2edf1e8558df69ce687f71fe44174c7ceff54a4ef54a40e88379f83bc957864fbe1cf358daea41416394df754d3ca09939af62cdab3a058e2d3f8343e9d4fe96bf4b5c75ec85c9ee5858bcbb7d4873b552e23e13290079eb8180caff5c062f0603a8e43fd0b1696d75a980c0d08d4b4181a0ecb6b9485be4665c81ab67caa0546ea5b6070f0ca98e1e2fe63bcf0028c78297d4829a5dc8bec535a8fecb7c764c8bac753296b5373a875e57ff3079b58e01a21d0a82835d42ba25e15b96840e25314eac5a37e42e9d5a74da15e05d166ab571a10489f85e3bba2e1684f9f35178d8bedb13ccb63f3c76960d18fd3f08eaa99b41ecd92fa96d47ff4617c10fa2e5ca37af951065cc3f2f231169687f194e5552cefe2f22c8f75c6c2f26cd3aa2060aa53098137fb20e24dbd90eda69e85e553a977c835106a3cb0db85d1e7e2c07eb187e5b1196d49cf8e941b3ff5a92e08b8510aa3fb5ebc789717f45de863316361f9d67058dee5610881b7e559b820e06df9e6e955d67d2f3e6379a9f908d2f243e075f9173d57b6743dbd4a755f8b12bd72e982b4bccbcb2fb9bca6e1b4b8d09041aee91124fb21f03ea72db9b41dd8af757ca2cff5f2a3925e05815f81ccaf9f693818d60e197371e9b8bd96eea23f6957db63e954f4f97e39339e9d34563aca726991f614a318fd12c5a2ccaf288e6f66e22cf7ddd8b821f0c6afdc373f70e597264faf747ab5337fa6954c346eeeb08cfcf9e334f3031c23ff05299824b8f2ebfcb992d4f930894ada93b48b3eed499f2bbf7ba47c28a5575e7b45b3fbaafc2aab4a453b20def56ebc703ea5b4d68e69cecc9c2e905b029b8fd56a6d2af5efe1b86149ef7f43c389b938da7387d0b3b0e1f1634ab1d9377383c0ff78b81ffcfaa357feb40be24fa2dc0f1b8985e56bd3de7c1c6d87eba953295f66b43d0b12247a438eb224bba7188908919b71dfccbdb821f03ad6351784d4fd686f3e8ff6a6fb8ff60e303377af37d7ffe815f41eb00bfa3ef8d24e453f08a9f327727b686f6e61a77d1e3f74da9b3d74ccfc2c5b5979798181694123edcde7a1bd0979b023b094d65adba978b85fcecc0d76753cb4e7ffe36fe6ddecb969524720b96c84cb401d685d0c6a3ee2bdaeb7dde75dbf69a5aee396fc527d393424bfb47d8908fb9275e56f451cf173ed958fa9b2d82b15df4fbb579665d947e4e5450bcbcacac9644afd0b2b4d254ec8664b266d8752a9547ad6704a5fb272d380589cadc36064d6da6ddbecb6f9ddb8da9ef70fecc7413af4eadb78e01ad4fbe39c7ee33e08afad75430501efd69db86f2b6940eccb4e761827b76d7bcc3310638f7985ccbe7d55387e4bafc2f1fb5de096ba7ae165e77468bf97ac41fa0fe67bb9d7737f2bf7fa8c54bb8b3362af9f44f7e3a052e94bda4d49eb417ba8d5df445dd4a597ef9d6adba1f45276aaad877aa5ca349cd26f9e273f08786557a357dff6a6f720dbcbf7ef164903029b58a175ad7d7969385b6caff492c352d7fb75fd6769dcebb5c76264d7f5d8c6f52d69404a57e26c5776a9be5facb3aa3dd484c09bb1ccf51a0fac7cf8da13a54d03b25df9d8c67940c9652d5c063a8275b11899d603fbc11b4446a63d61e17ff64b3f04de20dc5ee9e1635c43e63859ba2eef2ed5eecb40ad928b4da794b2c3b0868cc592a9f496abed5d1a0744c48878b85fed705cf86d8232bac0e0bbf30defdcdda711ebcfeeee1f0f3767e6f6bb73c7449a33e3f026b617b7b0fe50a414b9d8263d631a766fe686ad9994cb4ed3bd73fb2394325b89db4f9344b945aed74adaebae7d62908591e5343bb430d2317c7768b1d31eb36e7ffc894bfe4ad979ed15b93dc0629c692f42f8cc2c65c75fbd3772662e3f8e1bb55a9b4afd7bde2ac22e6661fdfb6fe0e89510343c3a267e96adacbcbcc0d4b8356e1cd25eb4c1c2c2f729189f4ca66ddb4ebf6d9bfd6d7bd369db4ea66ddbb6cdb4994c9b69b3dccaa77ae5bf71f09a4c26d3b66ddbb66ddb6933994ca7ed4da7ed4fa6cdb499b037a1deb46d7fb2db9fecf6d6a96ca66ddb1ed3b2d66eb698ad705f5ffb6ee4bcfd0ad7827239ad984c2da7dbc2f2506b61313d663a6ddbb66ddbb66d28d49b38785d56583216d36f9c69336ddb663a6ddbc964dab66ddbb13dd56eb6ad51a647ad9c564ea62ec8f6a64775dff6270d677bd363dbe94d5cfc1327b7df3e6ebf6d6fe3f646722ecc002871f2e41ba76b3fb0fdddcf42b6f991eee02fe5fbc7c94f8268693cb070a83d09b95bca12bf33c158c64067c985b90ca4c3738b30004a0d58fad820dc5ed6de5396d19ca8a4ecd26efa67e41296c67e2983907e488e7769fdab6294d2bfbed2c728a514237d5010f092ba94d3707741e80f817792be7e10d2cf1b5c73bdbf00b846be10d2c5c15b9b3c8188c4c9676d725c10f0d28eaa9a4e813594cb97bbc8d0086e7f6d1a58e4319ca379a00dee485c6c0f1679a00ba8042d5785490b19cd08000010007315000020100a0885429168288f24c90f14800c7e8c4c6650190a644112e4308a61188418a40c02c81882080167666838020080f89e50e348f6a8a947d00a90e83688e4947a590d1d54a9b84395cc4ce1cd91837e603e184f395aea0fbee7366dd5fe3eabd05302fdd9f6b790fab5fe805fbe06dd1f2d344680a087ffb9efc156e852667d78879680208aa884843a4424d8fb4566184c6e0f8aa2b63c33e76678469d78b98b91c27649eecc7978f15f8771ed321a90bb452acd10963342a566576c708e7814723b945abdb596eb6148ab73990aa9a316616ce321cd23fc59f47d074b97b65c48f1c8f1495686ce00fe7e0f6938778bbb950034563266a8efec168db5364d187e7a22d041a1628eb87d27105e0ce61df95053d381815830dbfbbf0e1bbe0d06cae3deb498721da8a1e22a6586d25980c99d0074dcd03e3928c443869b6668c3484d919f78ee94cb9e173409eab31a68e7416786869f2efe2db3551b34cd6245968ae087941dab80858a5c2b290e48b4d2fb4f2dcff6bec79c792145ce72369c15ed3fc0240db7fad6f474099beb0a550ae4bc0fc4e2d618d49f75a46eeba7a49757302cddf11f1c29b356ae9e6e3207ac4532bdc0407a2ea1330c1268f02d6db9402de5a8c38742d79eb767d72c0ecde1c8cee2251318142d918bedfa7ef38ea637948be040a0c69b731830625d7759a256a6ca75ae85a1a026bac470140849a1b717cf19f549aad0d2803da2d4711e2a0b28046cf8dcae572cbd2c883c728819fb82d59ef46f35fdcdf52a4e35052915bd0fc55dd562927af59b94afe10d01a13f40aa80604c60e618130acfa425796eea7e58b26bc3d6269c1a13a9a070510ccccab718776892096ebb611cee89a7a1a3472df8665ae4030afdebef2e75893735d1a9a88d755334ac8b203c7e0842e254978a36b2ee3082ced49b11d1bc7a3076a82c01d67944c461c523448cb3a52157d9849dcc88ffad2673ec4c713e17e05952437744fdbb6ff5a05b6896424ea78701b003a730005121b97eaa50b0e78364969ec0138fa803bdd244c77cb01e5259e168fe0d542e6481f226f9e2a2d19b11720a7a642cfd9200919feb39b900f0648a2b278905743207444ca7aa1e2093c4732721aa661d14325dcec98761437404da5d62f40ed410450712a20c075295af1ca9592e8ab2479e0e7c253af7160ca27e3184f3555d63b85309618bc7bd17d5ea2419e994f017315f46b46f7c9d034f2b9480dac44ad2ec9865f3fdf174fa4a5b732596d5741b0dd3caf44bf20359f740cbdb39d0e09b4b0efcf3d6c2e4c294ef6ec6530db2822d846801f691be54f3a1684527cf3711bc3c2c2ec2bd3351fc059c4d2d92cd9a6bb1a9a10b1cfd6bc1cd1eb0c9383869d6b3716964a8e8d0eec39eb15c1181f5b3737d6760caccdae67921d17d7ff9c2e4b48148bc7f7e76d4830a40d43124dd1211bc291a972ccb9996c845bc80a0fe08891ae0275a6f89507f97d5add2dd3c5b30aead85410c31dc06d583a4512182bf25d43d25c9fd335a515b335dd856cd472dc0175ab6f3f9dea171e082fdbf4a27844e766f97d115362671b90e01fb4f5f028a089322968ee332627d3c5f6f560e7e24804b92ed2b09fa3a019628ff694781d7363453adf24ec1edf8c6566a77eb6ab627e6cc0ccabe84b6486316f4e64e12a622dd28ef49e95a9763f0bc7b95bf4ecea348be1aa38c60d06f59270aa554052a4dc1ecf4914f3ec46302459d92274bc1d8040d6d87ab948a4c2f852dfd2c2b4f27a7966b1fe387a1e595a85b40228b1a723f2cb69f9c17b30418426af9d74c26412e42a8d1c8c5f8a714d9a10c669190c305f87f20722c57a80e97307ac5e8b04be64a3da5bdbcbf5455ecdf821d09e6bf04669dcf29fd9bd0d58d1b80f03cfe37675735eb4d6ba2c1dd4a219006b41a516a8145b21898972098537a42bd22114fefe48cc3dd138de251a350eec3c735913582f8ffd0e2242560100804af94988151b156f2753e3404e0f5f3850c62fd6f8564777b8bbebd3fc4f84b0443aaf6f0a73bb4115b3b97442710b7d5e68034ab24e91a3da48ab8dcb45d2a91e5263f1531d025e5fd30f23bab979be51ac74317081cfa6fecd669dbb8930682d4c24e5ef0c569ebe73767ae03609fe635f7c1b5fe44d4734ebd693c8aa4f3d46c18453b44106b2b4086c018fd3a0cffe21534a393bb58d93c4fcc30b0764116883a38ef17017c09290b0f165b9219bde690d3ce94287405148d480475f9728b264dbad227a2c2a76f95e6c0c2cc7007b03aab6003ce9694f82983ed4b26a23f2814d12764a2d06eb1050406004d168cdabb10c33bb7c1bf6ff2ba38c85783e96207d75dcb7feeeb2d62dd36eb6b191c8a98088f75c05659bb70c9930a4e805b4afae2144d86da73b6efc8750b94f55b27555df9d5079c5af56f062bca76c60474d74487c8f1496694762704b9a0b50eeceb4a90e6f41049dd7a2f7ca954225a3a4b2b3b25d2b1bec2f06b665ddbf16e6500c9c1dd46862f6c396f2c0d71772179079eebc8ac6621fb9f7615598672f712fe524fcdaa4ee77596a7785a0a2f893696c29c69318705236cda46262b1529501d97ea89000d3964e4b418a45d0aea607534cf3f2dc7ec29ae467d5b170f746caf2f8d06ad471299aaea2db25a06869343fea9ea7eafcc4dbdbadf1fdde107fe617684cb6efb28f3b39cb875d83f260999f2ac979e36d9021f389961be90aa916d6aae9c0b12329763c7e46bda7956512b699408fe6a1fff86c34f893bcf3878468b72b184628cc1fa7cee53786b02fd244eb4b3e912e8eb4c0d8ee932fd68952a070fce2c8e9fb03e26bb08bd308a4a834bb83fbcd2cb7d4ba07433438d1024c888bc0a50bafac4ebd08e900c94a8a6033452202defab312802ffb2dc18e9ecd11c399a7f765cd64e0f474740298fc69ea13744c7ac372f8672e472ebf70f141bcea364fbfdff2cfb981463f4e362d49805370d726c916e0b9ea491110578c7c4033b7e87e9572bcd2c103cf149b2af64f86d40ebff4a66f6dbe8cf07c0758f67438f7fe0b026628d6667f7445e71945bcb69bd5aea8d3e096d8256de43955424b06ac543c244c88e3ee7975ea59334ab06633adde0f6d94b81d83f492b44639ead18c040c132bb5f72e353cb6e66b55ac66ec612f3d876645decb17ee205d584f83f3276cd39f70fd969034e34ebf512fa77f7f87a1f548ede66be1ef1be6bee8d0a9e00b36ee86b56c9d590637be07a6bac45c8639c688687b6124f5624d1711cbad086fb49da419702edb870c0817008058150314ba875c3253547e325b75e37109e693f44125e4ee7fbf6d1343b95a1cb927ea2024fe2be2532fa2720e29079646fb11bde5e2cd8f2df9d2936a91509464599b0169494e498d45a3de4db42bdc85226fcff9f26d948182b14a37f4bf8ac836494acaa41d6d374791d6d14f9ea4afbe30d42316b6fd1bdc766a754413c2aa60a430c15b55fb9dbf6991aa8af0e383f90600cbb2c4d9e66c84f4f34dd275ef0971841644b9382ef1c8879afafe8bcf7b8b107e986548382090d915e8b2fa31f8be414b2f793505eb893895dfd493ae39e442816a4be549874517b1e8c37fb2eec962ad089b95e497d66899493c3e3af3eac2d69a91ad08c787096de407210e92f70eda4e98c1ac8ebe8547bfa08e72dbaf5ce48a4bedb75463a65f829c3a5ca608f0f81c4cb2d6f760711cd339772175735b63a29d898ad4125cb90ba6fe2380cd8a6d61e31e532a6f73366c74c2c25c206bc14e9f933d8e2b5b5c73801bf44ea4957d097c1cfc4092c74972187978969f757880149acb1c9bbc99ffd6ac2a07f21eb2553591b396242201ba1970133972219050d7a430d1319001513d21f58ad5c5a418efda3b0d62e3e2e5ed995c07680661f1c942318304aeaf7ee6bf0be76007bea7810a23dece370fcf86241dee6875f6e26b27619e06aed1efa5d979891b99e8331dfe3f06ff75166021c026e349a99e10aaf819d2ce5bec846fb20a6b833a5c13c65dd1920a45cbabc333241f1d20227f8c785b07fce1f498b69ee1d808f642952e232848ea5e83f6646b5f49f72b45c977546c2ec28ef169a3a8e90354c0320e48cbc6c0d4ecd7abb94b0e4920fb9ee760eb2bbe654bc512fcebbe1556cfddc6cef10e3ea18db3b6a35ecda565f979240dbfc8e52e79058bb6e8703a217a876e7a897a97bc0de86f64be2518f2db3f790679583222c8b4d1786b0134ab11982365d382c090f748e3f779a25b1da52a1c85067cc114e457869b4a144a18536551e464159f66144a9c73d4ca74b276167a41f3e26e84d7c44709ea24af4c27a2ce32da7389429b358b7f40c69ceb1a1e96a831783d43209ed9c17851ac8f43f15c824b3538be1a07995088462a545893980edc3fea800c7fa169ac0b86f05f87e629828c03d2f26af2f7ac40c63137d7aaf5883e9c8ba0c783e84024c7ff1cd6b64ec9f9801c69a77bce20dd5689a62cc5d0c532427dbae75d63f158a85550655e05973fe8c718b4e86d1556ef9eb3ea658c643c61e021fbd97c82af38c81611347b4dfb548a9ff2ad2f07f20408be50eefcc7a8e97bce936bbbb6ca7b891c510c55ad34a094b3b21af3d7a8e3163534facf27efcb0e7c2c75fa0fffc5f18655ca17c14919d799747a94938021880d29a2b5a16fcd5f31c6ffc5bd219cb98f11c0f2c48f361fa146d9e5bfb3ca7632e72603432cf644d16cfa989b3845f4588059e0b53ca648dae0a1523b223a01bc1f37e21e3b9a933cc6bc9569bd15c57219abc893a12fc35ef3f51f3df15d31e952ba8e075b1ae39c4e4f1d655dee6e29170b940a5baf08de5007409c05a91e359f366b0993e470faab98a8874b9b9a766479134f50fe9e70f4fe9514a459b87f24d15bc00e069c3c9661b20fe60813bf92ddc2f9b438149a0cd7405ab92bd2ff52a7f3a6036fec73028c17c292b5a337273bec0119c8f021db1ee003619b3db878a3eca803c7a03f512a32c7029172750fd21c34878aa557d0e969edc84855d529bb76da5df86baa9552dda283fb79666dc26876b137601155a0bab71b8c914bf5ca3367411fadb2547731853e6b2c4582d8e2670b95063e47e1969668d18b26e38a25e1262b18774a0eb910f0a2e22d9217c66b763b069d8f1b7b371c42d39d68fa276002c43c77220969a2917677db3b50233983ff68f057595c6bf904f5c85c4bc87081b90b7dd3c5f0c1a35b517e69c561a97233e7e91251fd41da91b7d415ceb7c7003860cf0305ca377761c9098f0f41f4bfcb2c49fbec5fca3a5e9ae4220998b15e50c530d3eb31512cc4ae4aa5c223eb70081e1bb1c8fb3f452ea28c66da02479926a7477050818e5da089e494765941006634222c25c40d35a88c805fceaa6717aa6b7ace8e9552bca67618c371f1975492a0743ee4b1747ac0d765ad8da4a7d3cfc2dc8244aff5ab9b9bac2fe365279c4187d9e9cad11acf449b448e0d9300fa27c470162c50204490ffe4c1f5d79e773c4ddcdc72303601d8018d758efe897b13358289c9472cbc08b6582bff565560f34250af5983ced1f32a2f76c043922da7e669aa8a9b5a2b54253a6d4f7a96c65b34b84468a2451189b28a6fdc093a8133ca535d9f930aecc319fc1e232651d49396fbf1c55acb4863674158168902175db27db1a5aa6d376239bfc8f2a29e5634c8050dfcf987aa240b7499fd94d962ed3569d18094459e2b875b4a973c341666fc8ec3487a62e4599370fa123627b09c8c421741c05afa1abdaf8488a7ca093234e7467ff5889828532eb8c8d21ff9a649b1822b6a7b991e21e62ffde37426859ca14b9fb28e81ddf4e8a8e0810aef731b38500854f697aa9aa6b94c1741947891f468696f54072b147b0b9eabe165117bed0f83d07a780cc57f08121e910ef38b259b607f11554130cb35d1137409ae64e7707aa9531da80f35fd7e216efcbfdca945093d976c242b6bf0391cbef9a2d8582cf54c8d658e3847f612e25700e801e2ad257110fdd098e71c2332eac6a0489af2cc76cb18c01781a1c58436cefab1f7233195311feac0322ac4fbc47411965fb658850e19ffcceea0ca2f03a9f2c110f01b04dbfd9ea9cf8ba8e6193bd5c515e71ddcf6d37bfc51f08343f06fd26960fe0aa02d1da21694bf39d38847aacdb9f16d072ab7e298342f55d298f96eb4290660094f2a2a581225881e10d95ec26c41ddba06bfaedfea947ee5138102172e39ba91fc48f998face73002d4924b7d85d6ce2d230304a75e1ba6a84a066b663f7d8434f3f20510dd80a90db0e0470eee0576602eb5388c1d33ed1e5a66bdbd22e8d41ecbae13c814d8c6415e7242408e6956e8dc51d3258d65001c7752fba73279919591b2e3fb612d19333d69fdefe6d9f7213155635154edcc575ab88ca44775aaa04272f3b50d3b43574ac8443130b04a3ac8536bf888fcaee9b2d7e3fbfa9d39d784193aaf01ab2beec33184e0c11d846368c7f65d4016d8391f94d4955a4e3cbd15b88bfda6833eeb62ef7d85506ec72f8e8d847c6f8f0ff00696ec1797620f8804c4a5091477a215ce55c29f27a02ba51ed449dc4c0794a283de79a6e6ed2944cf4d1a25e4e25f273971c4515a788f7c7463a5cf930468ce06e2b93dfb22b330195205b5451527657a3369fe03fdf4425d2332c331ba381200d8fdc1b2cfd8deacc230c4dc8375ef9edb410b13fa7f0f14954e10cf3431081e61b0d836f230907ddbe5e6cd8f3555d179bb9cc0a9146b5dcb227d82c67e52ff764973c30509ef8d8d340bafa3540dd9cb944a966634acf79c8f0022e2fb2a0faec34e52d01c6d4f345f6149aa7a70668a4023bcc8758b1e4dfc30c64c77f8c80974f8a14aafb9dcda1a0a6e2399c96ea24c2fc04f8babb5ef32bbb13a8a34ad06005c67577169f23a5eb0acc11dc8cb59b2c1ffb4a0ab169d95a0e8eb25f14574b523df24d8cc56cdb318da2525364b74f9be6c0e4bce5c543d55f4cc6b4e00daa2a43ae67accbd1b425f6231ab505a297cf10bb9a1d72cfcfb195dad0dca0ab2cf4ba1c81a15e4f667a431b1c07a31337a62f4f72ba7ab122ad5fa73426b256b1dc67fdd2d9a454f7048e3e6100a0285294c3e49dcfeb29627f77ccebd30c966f294eb157cfabea485cd3b2c53c417f2888e479f41cef31c3608b9747760064153e311ed6f472540c9276d73e46d0cac0ef2db6d11ed47d80ad8dc1f44022496d1b07101c5eaec8e30a6685499cdd13a883c4a8388784be0e7f511c3cdfaf2b6b8872f5c3144ff78603849d91f19bce319db47669d07bcf18274be8df8e8ec50441502a0eaa9ee24bd4222964c758c85a093b8042c9c552f981573894e6106b03103a2e643253b48241bea8bfae313c298f31370d1d33a4f32e75d2f56ec921f6819864c1320c83650a9022b8d606af6223d6a2aae5971aa4ace386f0a8e68462906887436cc746846e320b6e012548106a6548992648c6af4569c259ea86495985e871b333d118abae05594b81e1723a471121139378eaa5c6ac37717fcad6d8a2fc31b8d8d476c2371904c71f021cdba372feba92712a2f354ce7cb6eba748f0083428a111b43348a4bb324bb3d5f993e8212d0af388ab64a582ab2da5838630983bca306404266dd680c5a9ce65654435acdff28a84e85de89fdbc632bde9e7dbe47ba7a966d7e533b681ac847859fc8a27d0eb12559e7ee311c0ba099595bf58071e6b24d449ba25854e1febdf19e96c21bc9617d3fb7b1dbd4a877e0443bea29dbde3bbfca477157f71097cadc4caa47f6c04586f82f2f215ef80d74568597d8827e0ab10541edf710d6c2d89cb855f5c075a29a2b2ed3be24b68a0d69226b8559bb04c4c3d73d9cb97f4e5236499b360ea273056a5d9642d1bcb620e87e9243238efe2bb7a3ae19815bc948932a7346c9f04ef1c7da22b750b1926478b4e5867f06a9c81c278e0d865b9b1c59299d863e665e8201906c04a84645c275c9977190d973cfa54ae83f10ca463c11b480d6333daf598b903cf6ff39a92585340402fe9b91fe88d90878fe13dcf7aec0e375ffb8be2f46d66ca72acdc78038a5c9e512512f0a32a1ce0b36f53ee05ff5ab2fb041a6bee14e8abaa8e51a0f484219ce07c45d29acab66f398217470163d3d8abd1d8541db08304936b28d1a4f87ed0125bffa9abbe11c256c399b15649d8e384a19c074725f5201dcd0c619d10baf3ea8ab2a37859e943fcf1b16a0b6f559e1e7e890b70d783464118c46f7f99324403566ed7c28b467e20420e4455d3d6c4311320c4fbd7222ba893d8dd80b34d6d5565966ded921d09683006b8f3c2e5a3533dbd6b40b1eee5ddf440fb3e8ec4e525b99121b5d053be5b3a7829b02fa68b19ea4374082efc6b37d8fb7f3c6d37695a08ea21900480c3af6ff79cc354b6100064053dae01f3ef36799e94380f081a2a99224ffe771d365d93465f1f26325a565635d5edb19fd903a0dafda36ee6cbd9dab0f7168ab3e15632d75ab7dd6e717bb44df0b69e9af0958c98ef5a2e22cae4dcf540ed079c4ec5192a0d80fddc13f85d433c2b216963a41d5711753ddd449628ee2df4f2007632ab44390fc85ce8df031d4174ed73248c4e0e20fa043ea7a74c06a0f324141f753cde70b983318067602544cc0fe02eeeba807bcc88eb11495270b399443973a317f4719b7b38e8f3c29b9938d390b314ae5042d58293242d85d136b0e3f445274df4fa85f3d135a812158c77707eaa5c79854157d0274aca05e670e63c04e58bbf1f02c12db4fc1acb22aa4b5480f0e861fb89826b0360b6b4923b444034119ede3839efafddcde70cad3c12e1c06f4cfddbc1281e2173e734749f29112c27b673924b74e73f2bfdd81c1e61433b766235acdaa955cf5551881e71633f0646a5fda083e8cd11c945e3c900fe2cc0f61c3ee66e353d375d64a35aa167b677ba01d0191a17cdace410c20db61b8b3e71aa776f1d0fd6e8208755b7ffbc48c874b9fcaf63c257035f132005268ea72e73570402527f4a010dc2ba38755edd1e6e7e9554751bad66a2a7e31f64bb83a1c1bcf8d50f8f5d9ec0ec56c59d14739c46e683e9b2ab55c31004dfce21777e9e903482d73b57b0c4e5e005794ca25cb04af9ef2f965623e44480754f95ca250e9778a8b9a9c8c7609123daae1a3dac1954574331265a8db5b0097383d987acfefef0f368fb760ae7ea75c34a1df8f3ae0b791a123ebc25b67f45b77c769599c26d33bd0658d1c7db392ba554b98a5660490a4fdbbeff0ddc371448731bcabbe2bef61bd83859e41b840cd1d0c6995f5f91651ea5bb2842c7a14aee5188cd60f59072e7e20ce67106f17d8c018dac44982e1998525db35bf7ba7b32aa047da08158b22fa5b77f91a47991b42480e4df3eceac4e476cdf7b58268a7ff76a34ca2591892a5788ec4ec09809b0a130a8936834fa2ce04897f009997cb0dbb42461d8f39b9991216e414618a2608fc8a7c047cb07f544ee7a84fc3276f1d288b28c9e9771946cf715234bb8d481a5c56d2b31a370cdbe34ec9caa06ab9303609ad7024bde68ff4138c633d452f782298a32b1a04c3b4e315921ea0c374cf63bc9987777580003f35ebf42017673043b5e34dfd6243736dac37aa27bb7a8c807873e85e27b1353359e543aa3faa335e0392bafd2fa13ee727eca573a3ce913a0b13f6a4dea6e766950c6352805f54267ebe8e4a1ebe719c937848a70623aef3e1349b63244a7fee78c256420665d99a170a3aee95b79162966238489636815402650ef0837e68d4fe0e1e828e2e38ef1996e2cf12a63a254393a9804047c2c245413b312604bc7e1739e100ebde20c692d8176b86501b089aa744d9accf8bcfd51e9443d09b784f4c821321bfe2281feaa360bef7ae9543fd5ce5666874a43c46a2b7de95cd331525b6a4e67ab96530e6a2573898b2e047a92038be2bb8cb4ff77e5a82dbdd041fac5826453ec9b2ab63b36dbdeac0279f338ccea54e9297519031f0247bfd959155790d5799a28acf7afd173784775f25fc797264c42d7b997976de219bdc278886c11a5e70edf1a9d8f3b77acfb843823f7e239c0dc74fd8e09e4c862e18136104fb4a8cba72041173d4137de3f2a7f880762a369de0a5da1db976302c8961ec748232491338fa5b32e87966963842dc642c3ad7e9ad4783d285d12902b5a07ee6dc2b79d669fd2c868cc839b67646916ecdcb043b8fa68d020346f003059152f549e1478a198b0749609aef5664d606c7abeb3d580bf02997fd82064297f2c9c53189a1f33ef16836b9d7ab1b770700b4330fcfc83b322035f0801382d1c686bc83ce3bae6d43d98015194964d3f3f1b5507ceed8171cf4e7ee8f7c33ee527691825186c8280c1519e748088c7d3c069830190730b7275b842fed9af9b8937fe0fd29a98df7a4f9ef18e9203f935a3b92c4726cfa858e37bf4c422a28f6a646f360be0bae8da939d0402a6ddb03923656d4e33924bc30a9c91bb92e34025c8b26e8ac5351d08830eb2bc29a69fc1681a33f8e85c024ef955d299c7851039b83410d4791c839ca03d0ddc9fbf01ee3760cd8f92fbe6b8112c61ca5787d5a0117aa891c55c0238e436c2fe0eb66a91736e926c39ba403259ab92e23130031ab209c991d20a45fee40bb5ce43e3475f9427d821c5a1ad96df18851420d2ce212ce67abbea165f564189a9dda7e69dc44543178e8221dda95ce51112d42115539ee97e2d5c8cb9890f6a249c4d01ee763f15a057a87d5247fd9fc5dd84418231286f6efadbddd1e168088ff9ce508303fb2ae6ea241128f97bdf9e15b75f97b63a2185ccd3459485315f06eabcf46234b835e56be4cf40785a773dc7a580be65f7a14a51ffb2670d7ffd1f9538aaa93edf882a296bfd507beb077164053fb73e0932a9ff5ddbd7137e0d8051444ea57fe2d13aa1c766e804a268fafa1fec9138dce88434a17a84a6c6038b353a9feb0026979e883aef5983fb30be46ffec83d1c83efb28e80d51c4ab9eb326be804665679c288e0090244f18fd931c23fa8258dd93a9d3078aa07ea6be2e308015019c2892e7a33164feeb59c0ab03d74e1b29bd206343f3a0878af5f8801e156402300346c0f11bde677b793c467351d2f0a5de1f31813e714032e937530a8b30c54e2fa4a014070c936a2d553601ba97eb7049090c77da444ac8b372389efe0c591a531d7c9dd425987654aca9827cd6ff2a388a9ce9ba809e8cedc57a2fd5f08115bd8d8f93020285975a1f4a6ceb197f6364452fbb097992e8788eac650a3749286aadcf4ce2f91b09492b9fb70d567b53754a5118b5c9077b014989c184c96e09a5dd05d707a10e4a33c2000ebb28d22f66d013511149921d234ecff23e7c9cd37fc8b91304d83926969dc0e852f6453575c408fdf52c10e3e3559d5fe63f37a9ece214679de6e8823f1250d0b154e7cf0ce9299107898e56f819807a991458d42269e36aa48924123f2cfbcb172a09383ef19666c24e30d949d80359268c11084aedc0c2dbe3f08b6a059db0ae1b0634f9e0e1f8b8160b5406f9f6a8023e3528176cd5e3769ff0c368c74e889195edf275cec820d402ce86b6152eeff9c947a98ff3f2a6ff39fc0d983c3065199c8c1d270788d2c794c2cba89a70590d08a06f413397573cd1f8e4307a8e7cddb4d911876c7f1b3afcbea3292f9ed27c4bfa2cb6a0ac99d8cf46a3144879915119cd05ed7242e2b80e429d68cd5a85528bb0924d08566563effce332ff01287c4da9f47f0ccb21899bfa48d53e68f927e89e4c4be2b8aee9ce4e142919a368e2e015ab369aa6e404df1ae93b3fb35b43046e321b961ab961f374bad24e6cf790f5c02be2bf44c15f4babc41a7d77c4c2fec786abdaf06c19d20fd6350c33bc4bd8d787f737cb64577795184918acda585ede99d465ab9de190848e902f1fa52c4153b4935f8d160b63398e851fc514f7946ce85258736698727183f070bf3cc7e37180ac49291e2c045beadc7dfa2ab9ae23bebda4fa0deb571afc50b21022064268c9f9e4d04d707c75266a7980e066def9beb30460f6b718e5bd3952b37a956e996d16299fe90cded59d196a88d8f14fc66484944b6d08a8cb2bc1da9382527999f21356f470863f0d9961f107dc2e01cd7ba669605ccb9f5bc84993aa2d894ad7c8da75fb89b4550fa591421418f13b52796fa98527ac3c7aa4b14b98f231552d14fa61c2a0c4da0d46e8a1f416aa4be05dead9af494a40a3ec18f2ee0622bf116fa6536ad9ea0b1bdbcd29aa8bc4754df4da5de31ae217f663050c0ad1e07c10d9a487666c3d9f5c1f5611090606fd83725c1961c492ea674d9144e350ebf15b2159e4a2926af11228a1347048962acd0bfb5fd795c7b50f8154b88c1053c6d8d97838f7c9b0eff1211e45a051f96743e216ae31dbc40021ad5ce1ca4a698562eeea9e04d6309f3dd843b4676dce2dc41a929872e22fc2d702a25fd1ac5a71a83102ba8d836ca205694ff0b93de4e42c8950d294b32e6f10490439ccce6e4dd83be9df04648f01caf6368012eae53e68c2b583d4592a81f2eb42a0aca9980b92338f9343253ae7041eaa621344a0e3a1849d386b07c009a934f3a2304111f65d469d46606f6390b6ed53da2d656ed0cafbfdc7f05985d91da005bb3468976bae4bda8ebbdb072be494a13effa2d07997a41ac46d121845849cc60a618366f72ea248c80c036042e1406692a70571fd7431552a08a07429f2211263f2dd2997478d60e527f2a42989468710f379c8eb63d07595326f0901f9cecbf69b84e980020044d190fc5497d63e1b4381c60ab58941b08911e776507d67a172724222d485035faf8d9f14437f6fc5bcdc3b89078746b424c278a5a78a39aae9182040370d1ee8ff2209ec20c6cb345009f414db7dd55821c06dbb40cf1352066cc280f3846ddc24bdff56f8b24064a7ab1555f8e52c56619edb1ca8a018c183ca37017a71bc2a3c125aea9a44f0f424247ebff4b7dd39e034fb07f3cd6dff061cf1169763300b8a838147ea52e7754a039aecda15eac3d842aaee72b6d0aef0b92c70e789ab4ab2edcd52b2fd958dd22d679bc2cd7cea47f9b690d357e020d2a23612ce42cc85d0191ad87f012c87d769c76c6566eb67d0ba0f8d22f7d67c3a058650cead5922d861ae15713b1a8179b6f7d8514b1c8faf0e7855046e8dbc0f57ec1325dbc77936580eb80fa9f01bd17cd6745d2636ff5b737d17dd1c3bce7d3bcd22463104e91d11512da504ab23763a86b21de8305beef0994f7c0a2cefcfec049a0628ae6902503f41b59f34b4105255688d8fc342bb947faec0fa054ae52d664be1dd7fca5bc62a0cedaa3daa9df6e0c259aac59b36555db66a5984101f0edfea0bab0ebd577dd639b3a61651b62dbda073c4e35654c8aabe4e912fff1d9c2ee4ecd75cf95f1b9464c5c13ab5fc229576b2f2c82e4ccad8b88eb115660b52ab801bf0a7c4c8004664194f02ef477f0dad3b5d14cb54deee97c0155fb99b72d015ce2d76f39b8c060f9c4aba6ff0e147d6ee5ba3c810dbce5108b8614bfb262d94d39fa223b33e26b5a81e316bdd00ad543ae248cb3c389bc3cec885a54fa949bb3e60ecc48a286ee5f08c0351d629a811f94a2eec9096e3f85bb2f42cfa778f7c240d014e234bb9c44b12e10aff8da5605efff002ac39838ff8c15c71b94f6aa6c286d849cb4689652638231c29aa3d522ca02f2e8c03d22b5a91d66d50d2e7d2af03d548d6036e03f327dcb937d223f69a0537e11b2efc7a7bcc6187f1483d3de8d456992613204f3b4362f94727d19b094035baf892e38554e60ad3f84514ca167c168951e28e71f06d61b02b5f5a555b9d2044ff430204878c0f42242b856c2adb026c8d60bed026d3a9bba8c4e71c2a6084313b91e80826f22f2dd9f4886a949cadcbab6abf1b019a36f3b68fbedc807f7523ffc6d1c50411d6296255811616e74fe44093855156b13cbf34df402f509599a036c7fe8dcabb6357661e8a98d81d77e4376834f4cda35943ab40ae007f47d3018efe72f7662b934b40cdf20268a7180bf8ea81c6e8315a74e857e63a4f4f1dad4e4cbc74ef27a834bc3529da57d5ecc289eed4c78a2c021fd9846a69d6d4bcd8fc334abb81b0f26b05f78a4d0fd8a1891675edf80cd0f02691b06b39b855858ce802a1c9d2da8405be37d9c7b85a0330e998b9db07d3565adff67a1a8492eaacee38993f20705b3d14db3763a936a4f0a2f9509a79663513ac29d17721865316580d019d5e2a45ec01e86894d01b779bdb68cf4fe6cfe38734e60393adfdbb94a2e75c3a621aec636a7ea0dc02ac05376585e7a571c8419e124bfba51651122a9845798c92eccc145fe6c170da142d43c4023cc0fad1a8c289ca25d7f8d7135c0582c4fcbdf16f60b8b75cbb9f2b5597621d964ad34de72683c635532b3df317ad035598dc59373c60761db41a9af8d44f705b98bff4d106a0b4edb5b6bfc66742e25c7f9b22e47714ea6d23f368eb67e6807bc3ee2353e2489b958c5a7289d3cf09089dbb34ef1f601307ffc9030a379b65a4631f4f3bc11070ea7bcc6976e1e5d65379ff329487e030a91b3c28656fef7a2a6ee29760223296674789f1be24984cc80622dc73bae4a7fe9a90c7ee5c486539056972bd491c6b126f4abc1c05dc4df97ced5dfe393f3626c25ec1487bd7144b9dcdeb14a4b0699aeb9110e2961036bce3182bca49fb31f87b4e3f2f4daa4df4d3b2420af7754a5c87633fdf40c7ca60351ac97a00dee1741230c130af33c290c59d56681c19be9de8fb43a91abc221945a7e3d79e99e2d9c503d73564c7b55ce4c5f90546320f9545bc165eb01a90ff1409237e851f5a51688d58295e7c6eb8c64550ecadc57be63e40b5e11062ecf0ca3de34b4d5f193d6fb1bfdc00d562998998c42473319c134a817bc69cd897876a0b97d12d61f36fe180219020c465a663575340864005c2352528695171fee22162e0d970f35c4e4a01411c9478332442730e1e6e0f5e8a27921abef2cb5fb5120c3a03345031077777137ac1e71b317030fc31edbb7ad5a4045d3daf3d2ae8d9c0783949f13b6b8d0f7fd1b09a1d021b8ada60f343cdf180b61b8d79b2a7f255ce2904d87769e3d0ea7dd17e390ea132cd02341028b62515ba5948b32cd3d667bfb37d2c56d6189a149137f4a1e2aa8d6df41d2b8a1e2ac0633270b7f041f79c68e3de3542fb323ced02275044b2127929c7df4295db4d1be7922403e526f824640e836e05c6083ebd200889f049e4da2e43d1d2822156b494c9e762b630906de94967fb160b4baffc76834ea17dc7d2ce70635d9911865f36b06a096e74f4102dc4d6058125ec5a4cf1ff094459ca43af6af42cfd772325646a2bdd75492077d165a48f3c0e11d3c5ebf80597a036ad297fc825dab6b4a32243bc253fa4d80ab2161f97d030eb263627d667891b57ec7515764c9a72b9e92a54cbb7a0e44db61ab967b26d4e7b0d721743419f9bcf451d316dbd7c7228f718069b5f24d2161bccc25b6ef7172a68ac41899869f90e4ecffc6f62e2713b6e17c05bf82936f84b04f9c9365b88d5aad06fada876c8b15583def289573e628f3c63f99ee8c8145ace62bbd0506a92b560f937f7539820a4c8ba64b51e1d3f906a9c55a181329d0cc4f83261be2118d5f0976e180867802122d0c3ed5aacee8c963aabc6bae2766972a5386d60be6648d7ca1399bcc3e112cb2f4ee85d32d14cf6f5064f5780514328daae029ca800ee7f2882205e1b2f8283ffdb65223bcf555a951555b186596aa834a41d44c99f851344a1af15ef017a8a560f8104f96b969f3506ae2c669cb33159a2f8a8acd0bd2ef5702a02c9677a6ce5950add1afc410d663d4130f89fbfa149eede0d340c8556f1c23b4b6ab493162588e397c489033ccfcc9a64988e4f47245c9c2e2ff779c3c9f3a5ea51c6b2e62e8a91b0ff1e97b53cffc45c245d2380647ccc54c49c3b595c07d2249ba8dfe06ebda777767b4c09f3515f92493e420f59533b3d392f07a5c97bcedee4270901b430cea51dcb0e72c2b757b5ff9394a60ff22c1debd5a35a309a82303d51912d7d7928357dac1bc14ad4129513b24ff5de0cc9a191a986c1decd875d6aeac914b10403f3741f3dee53de1825215ceac88979339f9753ab2f14fbdea0431ac3e9f7abe062727a236c961e82344d7a301ffeefa5057b1139a185b8461717cc104946ad1e64f402049e709c24953efc20b171743a140b7994fe9762380740a8955be628cce5e556c05552c4ff1af0d4e38da259c9094e435d8fb4b0fd0948cc4f3caeab92bb58d075a7c14f30990bbf04710abbd463bd7b512c49f72039a07ad95f7a683858ce89eef572f57d4a7abfb3a1e3b28801e9bc10ad346640452408f2e431c7eb2965f296ba1e5b40f46ec932c2205a42ca8b022b20d2211ebb506b89b2704799f2590af1eeacfa71ef9cc6d8c6fe722865607d04a28292c502f08debbffc11913c36d4ea734fdf4fe8523c08197a7b2cb4e2e89bc61627602ea42f17fab6878252bad46bd87dc89391b69458d4c6b41bed8f7c3a9acd50fe1cfa0a89ba66acc82aada19aa2a39ddc24abdc4936b93c49a075e6357121851e6ae57a264d9fb92a2fc05d69816e089d8836acf62bc28618876be99456575473c833379dd6b5520ee759c12a271223e1798314154ed37ed94d2b3f71a785a5caf7a14019c914d5b27bda860d43ea931fd9eb9199624c822785e2974322d859e3b0f41dccf340414dce27be4dedaa804e9132e401c12f99147b23eaca91da56af33b1b80e64c9c55fe511cca5b5a0ddbbda5aadb6f8563625401c9bb98d4b66b181ce73f4f0d2db2b7406e374fe6193a330b280b2fe88da3b3ce9568000b0d6aa02557c50e51add2f55bb9414313b9324bc8a71dbf4914c585be747177637ce420512be1a68eab5b6b4a5e1bda3269fda2f754c2820e39d256c4d02fcfd676daa38307d738f230bb8bd51f15ef6faf7ca2343692332ab05314b6920aca0c0bb9aee728ab67b043926b904504001bf3114a03fb611575bc96ac46e9bb20589a748670169c79a74e3239bd2f23d45a17951776a0e992c9f8f8ae7169e7405d21e21e26c993ac0f858089b8bd1788c9582866a2b57e34e77f34facd1cd6b61ebb93e382ba3f42c4d080c8b4864b913a77d5227833f00b96af9390ec633e35f3cbd7b02519668860bbdcbbfa4ccc354e623b77ef7a88d21eef5dd4628581c202633338fdc5ffab2a0300fd477bf1c1b052f3e502d4267cb28042eeccf2714fdf9ab5316b091003bde74fed92214ad86b20cf408bbd0380b578cf5f2d67490c9819a1954db05e35d7821b0560b3460d95ad7bb86003eda5efced7fed6326bfcac8f750440202c9ef03745780e5ecccb283dfb8cdea786972df1e93cdb24954703f212f5d48d2c7bb922a8888fe06dcb18163be596667af1e1144be9d99ab6a05d623def800d8012f86e57ccd31c79eb129155d2e92e9cbb66f2207c77b55e31134aadeacdac3a60837a264bdf17ef640495f285bf96364a691c4e11152ae9419c0d3cb5c3404adcfa61db5a074de3ffe53ecfeaebfe868550171557ad5bbaa5e99b6dc37b2bf6f13100452ec5b1567ba7379dc4e98ebeb949b9b07a8d0df0996343d4b6e5b0d249796847f17d57588cfd7fe8a9a8818e0a7c111bc00f923010b34ba795fec6ef642e9a7678cb90c2bba3fb4232c1a6fc21f6d660b1d4623875d8eea00700947155651528574fd37a07761236a60ecb2350a8355d0761c6ec3eec3c6962b9ffe28d004ef5f36b9b1b719607ac7e477a495ed4a6ad1a2a2fe244b6c349816f808a146fddfaf3ddc65419a99ad4489a70df2e4c7d7e59a1732cbff3b41931227e8b28b4e128b8e53b4219e891b813f98ec2c63e4e4ab35e2e32b96154256b3636753fec91c168f5ceac06a9a8232513e98493cf47e4b40f8d161e6c10f3692984ce67df540469c5b991e3852b1f51b36f119e08497c445289f06b9e459f1e7351c3f6741738665abcee1f690c831d90688d215dc84ab28608f6777e8c50baa1b9fc6445d4195b4f454e7c14cfc5c6dea04740c3108c831db587d1a122f82447fa4b69ee7d9d043d296583a08a056d01ae4a30606295a2a5f3151a09eb813f4b0af3f7e559df405d95e41659ebd9138f8fb6843119128b00ee8f70d55536c4dc6365832a8d84127b588f4a54597e0613e479e6bd4977332a9b11102b5220bc89105cbdc1cf522c43d7ebf09cf609c8c99d42d7caac3f71fe04400f86e022cc22dc6ab9a0cd9dcd061a43c098271615d125e06ea9d161661b81ed12d9f05601689aee1ae0cf863e5cc7df5f766298c70aaf7a12654d3014920c476a5c64680022b99cf43ca0379252185d2feb07a2f8254999d2caf89c8ea81092da787d14c85be8b94de1a62b20910003dcf78cdd72b875bb7ae1ccd64981eec8de08f301876ff9a31fb5c417048a0f55247238d035c19ab762d82d4316c44724f8714be5b8ca4876d3631b0ede7116b730cc24928003388fb4be1677318483ca0bad3c40539525761722831202346b3796043ac1546943ef770f6d0980eb3202692533fb06942562910194ea2a945070584f809adb127e205d229f5da1f821159e0a70750f472bc8ce4e8a3b8c04f17dc4ac64566abcbb684746933eb8984809856b9cce148df1336832e7349326401ef5e09afba0ceddcf0d23318f99202fead535cf66013b7c3aa03394438600d7e123389f0309fdcb7f569939243eec42cfef8e655821856276e14f7af4be4ef4d4f6442e6371e7ac08b8d8c23b92a432acd8952bdf2915539f4ae3e06aed570adb8e239e392438b89a416d2db7712357353c9db9104905c54184b50011aa94f222ddfa036fd801d92725405a7305e23c48eb2b287b8a38a1b2350daa9a506b37ef86e12dda9afbcf80344682b9406e89ca794aa08ee2489e493232788ecfdf5dffa0cda28b10225ebbb3f06694f81a4fd04c21789e7f52df2a1d02079a53bdb6d3a36d35efd9b9057c341555bb45e5d13dc22edc398c6116d38b5f83fdc718a24a4c6feb7a4839276b4302e8f58eacc66bd203cc7e6e41650c5282ac586b30539f6695137b6f8d5a5f82e3c37e4bc5f5716d38d9c0f83fb2509a2ffbf845d2903ea7790f52a98af64fd813f21f71cc610eb330bdc02b1a8a3b97ec69b94b4bfd7dd65f65e385fed93198ce77cc7e8e22fcf7d0f34a7f493a8c9571b25c70f122bd5e6ac3e80d9fe4560e392dfb8f230f9395bacfb30db0e36bd3d4c7d01abaf4a5ad47dbe7f634c4bb57d077bfa83fb180da7b344b6e39b7506c691037492fc1707ac5bb80cc731d23b0651e9338a41f840407a585a48686fa0ab1e4d8d521592e95e889736c321a194d3adfeffa1c5bab7d15f97c4bafce16f7986153cf06fa0092d8787f41e04fe3fc27759920114eb787ccd369c6d44ca705338b33bad9eaf3881dbef4e20070a0da26cdd4f1b59b83255ff77d29a122c729af19bdb788d30d33885d8ea1bfd7761bb3765546c7de78440da098d3ac8a0900431ad29466f6c58c3b980b70e64c82ee5d2fa8651d64b225f0fb82cb84a6afe77c9d45f49c9c8d8579cd62df41ced89ed4db7e6fae627c4d7dc99daf709d94a5f4a163ccf1e4863911c2f6984517eb390eb3f1a39bf073435a909a53794960ddf00044ffa2fa32a7ea516f77c9e3f18ef51cc333f10d973a9cbeabf762ba611338b203dca004ebbf44ae7e5d2228469dc23d897383033f51d59aa9d794205eb58012d60834b4aaaadcad24e561a56e93ccff6020184d42f0f75e2a45375fbd4527a24ef316f9a4c2860498a60ce27b29c6d0180f7e10b84a982f85f4dfc8e32f0a684da0adf4ec48b5b8c4ffc624d967062352a4032d3d0a9a609285a94668d26304623d7f2ce0caaaee0baa190009a07b6a15ee603321acfd5b74eda61b68d9ccebbe1dd4347e77942b9604e3f030e92870ddd931103ba9a0b0f7c6b6e0774918ad9df77061e08ce60dbbb2f426a5ddf8c522d3a54ba4f867d56880b71c260b0532a07a3608d020ea1df1fbeda52dee2bf7df4ba182b5c93e88515a06833d8fd81eb489689839bff92af3d774b9ab54d6c0ec272704b48d87780927c874453cd3b12fe2f520e620fc5c58cd3c009c849c4cc4631285e16b5409d40feff6448bbe28b74b479f6d6c274f9a4d0e507d502b1d96725b7b6f0d5093b2b2a2fe65bf792c2389d00384796f2f653b247c86f089518ac9ccbe7dce85f565dbdbc7bd62273b37ccd5dbe2d9fc6a5fa0a6a913903ae1ad2a924d6f95b23444b6a93a6ba48116446d551ac8fcc17592415a159ceb48f2b498b240dc616565fd55290994512ad5101f5e91d0d6905569911874739cd7082be30b683064de8394e28a0fdcd649c1c1e9a1ce7fd832435cef333ded5a0c5d14dfc32af7daf601b1b2be10351d3b31ad90ea912a9347540135ba7c50a9954e9b4b66d310c38236c99cbb7dea2bcfca821868149e3a23d24ce60893ea2f64d4e87df37bb9542942952e353708086f2cb7779736307acccc4bcf09f0f67fbea35b92398a4b139633797d88ac61ca58218f9125c307f1f7b703c378aefc106b8142db6be9b2cde337130ac044a9b8ddddcd1f12d83f49bfda5ae7d4b876be4c352f7070321cf3e4c2360a61abc683db749e400e7f625e99171c1daec9e88d5fcbf0a2d45f579d646828b80cd160d3f46c6c6097c5e65d3b4f4fcee794a66470651ad786e52aaccf38c9a891864a4b2c9f3c9c054ca5b4cf21d2645e81c9ea9d583730c7a25adacef571eb436fa354a336b954c2a66a382c748ca406b414bdf9a15abf96325b6fd788d1ca3a0cf83820c5a819ba3d9cb6583c19d2188d82b68bb4e091e45ab59e712287afb71ef2fe8ee350fe9d1ec85beb8a1631b5c757f46cb58eee357574423d823c8ded737409284dc37e1a9e0f954e2fb5fa0be010cb203183ccf4272b48440ac3f6841f8ddd9206ff0933ea78097844b81954d1e23f26a746a2f2ac4d7cb127519e6defe4033de5ddaee2484d238f107d52f44d6094ecf8d94e42e148c8c7e83a0a277107d4b87d135ca059e00ead983ec6f07de1ace3dc98364afcd9701d3267a0fe57f3c04c9955e1458c4f1a8755b84b6a655137fdce9f890dfb2867dc72a15a549fe89a4b6a2aa27c9e90225893a72090ed40850fa04b64617db3581728074509f78d90c79a2f04fd22527504073140771d288012281c667ef626bcb29c31cca5835ce7e59d6680b2ca6c2700725ce75e025b08f01d1de15bcdb8f7fcf3b5758de847c6545c5ac5bae99cae6c28906e2b297b1d6522a7c719e9bb6f1cd7a539066bd6ab898f8663a9ecee770ec4684d45cb7a898f917633040b2b696190975ab09572c1b700a7a8d30820f335aa9aacd51aa01e7146a2e4a71ce080d015eae15163613191f57b7fa99b34eacdd8254fbaacb732631ead3f219bf9d12dabdf70e56f0b4c0dba75f467daab5983e6b4e899f15a02a7d50651ad0a2eaa07d2c3f04d5128f0f020a331994f3ffc5d2362899f3664574e022559c941eca01396cba69628c8fe8c43339ec0615806fba4a9dc27c09681a57d929f0c81569cce1c100d8d49d4ea23080660dee51b3bf617a5d259ff28be945761f5c095b25931fcea7f519e965b223f3a8a7f05a51006da87288fa6baed883584345639199eea3003fa4002fc13489ce9ebb7a2ed76b91d8698974cb1964aac83243296d0f7af8560071beca92104e627312749c07bf2bd6502ad58bb108f9889753e1bd8bf2a11b13a6a7878e23f7842786043c48e6db58d07a2360d5022e2d7ca2fbc5a1dd87c0b8333d3043593744ff9b7f7da9375e93fb9badde38ff81e81ba4c71d710b67e52b8ad18c7b076571df5cac0f2c9399377593953142144dfe5ba0ff8b74677f3117ba213f235fc517535c51c5175954b14583a27bc9c1a80a495ba6804c14f337469e43d9528ac250ce55027000d40336f0d9365cc0c5d76286cadca119277cb497c37a63140dfc83b00bd945a85b2c9fe26376148ada4c2024ffca02ac2fe0429a4ebd3be7ea34cbcb459b5b072cecc22466b8254decb104cc0153b37e67c4aeb10b60ff39a46870a00fc4516e4ad03709f0a110b14aea15d1e7027024046c497b49f4a360380869ee25e3057e425cf33a60102d90b0ff7d2a6dc42469ca68c2d01bb0564cbc57c8fddc14c4f10b05fd4ef2d92c014fa49e574e90c79428871caad99a403b8fa1b19460284d3f3003f61868d9664d1cfe0882eba32f6a27a0c91323ef98827b226d0e1657b02d13b6362f88fc2b5ab0f9386220ae2109dfbb40b703caa5a4106897ef590013d389ddeb12a4a34282c95f78b360d1133727dfd7108a7241d2a21acf4e8f8b202857490f966e73743d9bc3534ecc807a14a22af73365f844280f86411e17720e80edbd7eb8c97bf07c3728dcd3cd17b4571949e69a0a9c8de9374640f45c80d254a5d31f7a88d3a4197607fb5d74a2e7066bc49c07c2ff47f29af1ddf2260d47ca87ab9197cde77325be808c4ac54f76a011e6d74f5a5d2ec02717f6991b7fd70b1c6e7dce3dad3773a0b8146b806083ef2134d58f9cb5d2bbb1aabad0cb81c4a43f9db7bc744e125e45b82aadf5f59159c9f5113609012ddb0f51e71b8d8f7f605825cba588f320e493c8feba4339b66722849c63771c3b15d0f2b9ff01fbce61186899a903bbe1dc83fbe7a3f2e63a1bd749108f859c1f57c3cfff069e1cc6e7023c28e4df5c0dfcfc1bae32e2f369bbe01ff07990ce862f5bee281b467c082ca46e9eba267506f14cf8527fc1369f66d45cef7b11f4c749b79ed76aa5aa442d130124d2520041c17655d2e876f9fe0afd3f3c5ee148320c49b9e43133a8e076130647a298c64fa40c2555b3e5c12a5f812a743d2c8d6163de493705f29091f982acc504e5f928ad01c852f976abc57d5f05f9481039a659998721a3e42600ac08e483137e2f605f72f0880ad35c04911fa41000b38a8224dba5d65c048740092b8af414481612e1be97094d47fea3fc21b760a4ddb0472205a8401c27385466a5d087e725cbd614ddad20621ffdbfe12b04222b1396b89c759079c94adb226a8348eba59400fe91f20f631ac09f75a47da09f1643bf4280774a72237ebbb94831d2c2b202b40929c4b118799ac752377d600d557783e7f3c9ff8e048ff06e1a5e9a1a2ad7b4ee48420743a167157966023e58428b9b4921e7e2a60c2c9dd3e027c0df7a0140f5d3a2644a67f787e3ed06ec35792a4b035c3357902a221001c8afb560db24932808de7e2c07727d201d3264189d2885e569d82b6d09e45f3421345fc1672e224c4654248099bc257469458d3bbba4a684e04ce1cb38bb6ff48d9bc2fedba247d3f9ee039d9aa16f5e29f127bcc8d5699d37aa848b77008143840137c3be293a7cdcd85611ea350af42b19eb53e8e034cd623dc28a50a5bcd6b7f492a380654682d1779e809073bf423b7cdc91c2634fab0c26dd97a4b275f4021df1350046885ea7c8ee1c351711b487ca792044001dcb06ca8a6f66d3437694ff4deaef7c97abf60cef51ed7cde5f1319e89545e9854885942055c939ce51871947c0b89a252a383b16b5250beef5c9866292800f520fe2264786c73390c8e2813f380559301c138eab9dc32a74411a0252e2406483d65f82e4a12d26216bb0a480c3188fd60f0cd35b28c4a33d02a403e70e95fe4f1bc27e5668046b01621e430f3130ef88b50725df88ed22df51ec7e7238520c888f35dfc78f8a6272df3048715050029cfe91ca9714518fd92bf1bfb7c06fbfe9c74bdb36a5f78dc171a9453aa459059e3e8c624978824887152c3b24a7f440b19fea8206ac0f1e3b6dd7965331bbe548b8f2e87d482c31977706edc033a7468bd017e69333e394b47a41163935a806e63144b827511126a847b107fa4a5c046bfe059c177d4717a28bc0c7bd1bab2525110999cc13a488c31c5c1900c20708bb26bacb2798d6b37bdd68cd35c49988c966954eeba057353fa394aab336369a7b243e3178aa0787cf358a78e863ea1ea5392a2192097d82c2d4e07ba2f84559d156a2fa0391d5c633e1b3adc786742582e25f58a250c806c6ae0ca1ccf360e8023ecc90a37909802082410b019d54b3623c1d0228d8642e725487d38454c53c3ba20002120059448bdb7266ba90e12408c23511533fe17b16bede949e5ab7e91d32e28b5bb9f1e0170441691016c27b50bcc7fadecda304a324839678f824a678631b30cebe8ebf4f0e6ac33b5115e6c16ffc11c1b7ef1f9acd8a25413058a766193ab6c073b4c5027633015054853def6110f49d1134f5836b94afa138c2601074563c306c5ed595965daa62f8f8d1cc4d0f45d6f7799a8127016b693c5484c0d4c23cbcbd5b70ff583b8fdc9dca6d4f0ec7c4daab1947e9bd14ed756b71b892287fc1dca635238d1e04fdda63a352d3151d080e11de8f9930c73082414beded797f4adfe852c69dd8a3ff79d660800cda0433d89fa8822d76a5f45d7eb83904464118d247e4601a2aaa6ba4a193a23abee4216d290318ca808cf67a00e906826959ce9570fe02df160bc54697182aa909fd25a332d5a66b3f12cff603c6528728d37205f77018f52eb1680d9c1ac27db760ced2c0b0108b94ef5ecfe10cef53b4d99ac0840671a23a4a0677db4ab75d04aaf055c92ef12aa02136ce2f69fd1f9d331705332a1a2189a1d45850589e8d3ea29790f9f0342755ed8c8afbb5ffe8a30a4befbc768a07b787d142c10d85a32463b837007de8fc160aee028bfd20fda3a13e094a75a75d4abb49e9f6a76b5fcfe90d2805facceae8fc2109d2c3c4178d61d6a464d0a099163b02ee79108735841248f713438fdd6144cf81fc66e1f05cfb40773a0ccce8ddd7270c1862be98d3a3b0c5e6b3963e45c0ad93458732dc8324496a489a0e83d2420002546082e6f9bc644c4b9469808ed9d02a0b23293a22dcc961be04f7b0834af6d716be2934e892de767eafd64aac2edafd008f8f792feadf328a036264c323d12b55f060dc1db0c8c0c22bf3ca06b909782d6231cc0b73c41558f744e8d0965f2f9626c5a3ae1ce22fd5967422e2170dcef534ec23780e1b5a24d154fa4e7d3507352a97361ae057cb8f5a1d077ea9651d9b1c1cac4f21b588f2f57c076f78455358c9b422b68ec852f0722123c4347b7b5b4caa7d77056dec246fbaf15cd2c740105cccdf04b0f66654612597a457cf6ac26797ba0f8425365a5b045ca3cb36fadde1d08619e637e8a47c07d0091add981de10105335e361ef2a9778297f4f49e63c8a19dcb68b37d37a85339acb7f2713579cd5d3de281e66a45117035420f05cdd472ebe1c4393e2addee930a12c4fdec6e2897838f769ef5fe78205fab993c02f7ad07c9a445e15a8f5e315d41afcf44e0ac777e5d7f625f748bbdcd0a676484b6e72ba57f8cf9ef28bc93089eb5c4996cb27da54415805c2546240160c34b7fe5492c0e8a5e05b04b5599a339579f2d91b7a7e1b964b03e1a5196c965559a2da682d186242bc833ba7c1bc519fceb4b29f0468d453962e06159bfbaaeb90398f267252d9708f8a79e4cc379281be1b88b274b86abab8bbf89c070c263ef452951992e19b9a1090a04821a01fc6a9384c99ff435b6e731f701b3d1be1fbe12f80c92089b9d4f7895681191972888200f11c32a31e3ff70211040f8b287f636c0f2ca32afdf30108048eb227a0b84604e41ed337567673710f834d18d811dad00406827e081509f5d8a12906259350284570fa5fb2d7e6702166eac78b8a958537cefcaf0be9fb5da7ea6da5233b36aa5ea99957508d8a6fcc451d21df55c09e02bf6037e1e9f236839989a4dce5fc6dcb6f6fee5fd2922bc646acf8f855a6411841e7bf9060f85e46adfcde966b6bf0544850c96a843881024afa85b85de3b46fdeb831f96905baa464309d8a355cbb93b106d7a591da1f13e1ea7781ed50e950ad76665ac868dab6ea48ea8167723cd267cb28e1f76eeda9d1801a35ce561cc38880ecddd2019f14c6988544beba2d0c9fd44dc80e4ef67de3a7e9e88f6320ff10a66f1e8753d5c9f54b9c8c4500068b209f562b39c3254ee9b0d843442fdc02a4ebc894a760341ba7e88a60794a2dae4ef4058d7074f2008559ff1801be64542f13f6c5a7c4ae9ff64ca8fa2939e40a7744e115864b42a09800322250ad1f1b67aa93a4526e6f8f34191a48d1b095646083380433b20b4715572c8bddeeda01ba1db44b66ee9ef96c64e73d4c7627a071d816370e3c9d026b9b01ee55fb522ee7d14f15ac77ca95d46ad0001d59d6d192f6f12b9edc2fbdc168f98a52e6efa5ef0833922a8169149533b349e2b7f69122e5285a31a71120180007598624272126539866e70af704556c50539fd1256e1e63dd9e04c0fba469f16d2cbfd2ba70654028e872a9e19d4cf16102c09069877711239a373598b61bd6252cbefbd8eeb258d76cd66bc98598ecbc820b197041d892f4c9412cce388454cbb0feeabc9d5bfa2ab1aa5961b548dae9c62a29d27447c23e273af84694470bd28d652aadf888416ec32ea83161f511a7d741d1bc8ac042569dd2e467b942f4430ee7bd879cbaea31522dd20a401674d548e695038878519c3dd6556c40b376367d7db75e012811e61c9713b92f9c627319bc93e5bd2c20384fb3b26d00b7f67b339136082660456c91091738754881ef984e1ee7a5fefcb0bdd092f05c9a3cbee02fffc0ea962e3a2a77504450ef923df80b0d17514433d2440d4b3eea696c01b52a55d70e31a31fb1d7a37cb13cc3784f0e8c85c4f13b4135c15e2a737846a9dba5b85fcca2f7b12bdf0fe3112be17eb22ca201bef0b60c5d95142ca987b43e4b2150629ce7975eb416962255f7deaf6751e931635706f730d2f8d70994d81ce9c21803ebecaa9a8db33c4b8c7c0ca68e2d41db0d23384eb0e408f14d69f18cdc7c4b9025ccb0e7285670874596748cf60d8c2fa39a46187c431d11efac219626ea65975fa117b56d5a77d6b2982ee5dd06f64566dff2df7855c86b8169f21d4374b3864ba9fa7b31564a207ec36037a8586805b301816a703fdb596d92c46a7985c58b5c80ab46bb02cced44961777122c5a192c008e6d819d1d4429a17f9e7655f03f42dd18f43f7e7be0e8870c9b4fe7adcd717229d01c9aaeb5ff78607f459f213f605a1bdf7de726f29654a32cf071b08f00756d334ab91d80aa12550a03fda68fd88a383ff2a7e94ae265e3fca97944224054df0c18a083468a287954ebd4113adaf2f82204c49414b87275a10854e55c2901464d4a0092480a4d0a9de63a2662c314208286870454a8a8e84892f859af8799797424df840a1b056c88b227badfda2c81747ba6d08011d2104c4c3bfbc146a824ae6d22b10cc891331274e44a1733981819127a834ea9a3f5420615354348902d7443580528328b01a188183b1524a787e76f66d88d9d25ea2d31b1cb558a2e10e27642c21c152a9540e373ecf7ea305a120923cbb0c3304a1d332e04e28881c3c9dcd5ec3940c29cf2ed3a7cc36e9e40a97eb8fcab5fea80c56ad6af547f5aef469cdb266ea55cb6aa6596b6d96b9f623d332cd5a9bd9ec47e66959cdb25aa9f64232c4e7e3c339a5ee65963dcea9677d5a300828849fbde3361b9fb98dcf01e077786d26fd39ef48a47b378eeb38aeb363b6f96f21533bb27323c7713fb8ae9cad1a67ade779dcdc39f4a4d36676dbacb5d66e5cd775dd66addbf0c7c66d5cd7755bc7b9057f6c1bb7d9ccbdcc6e9bb5dacde521f59af391233cefdf5e733aff7c6822f8ce19ecf806cbd504e184f05b6f97a3d1e8e6ab03c03a22d1d0f8cda564f94df3294fcde25b386e23d9e2c8bffac873b4b461fec8bd1df347a125e26ace7ffdbbd1800b32a7fde5d95dbcc5a56469e2d20c5ff19157bfd1a7d28cd087f8337c4668433a0c380269cf7f01479acfdc056c0983d41fa5fc2bada41c0f2fe4d06bf6e66efed13eb2739fba661e32b38b713b97929b3b07ee49670e99337f76d26350731b58fe9336ec1a08fef8cdfac81c2883903676fc61bd9dcacf93362c6d12aeccc138b8bd5afa3580c86be148ff067e410111a594524a29a5940a1901fad13ecef49bd5a760a488149939086696dddd2cb9e898396ca7e16efe4b299d52cac641dbf186e39c33ebdab4c36e299d8cd7e253205c16dbd92533966005aa879559891a936080f13274e9257413c513d32658e3494fe305ebd54c9ae8ca18e405fbf29de6596ff338cff334cffbbc158fc56bf1b416cfc59ba096d5ef60bc191e0d8fe4cd989895195669437dcc9e8e20f89608a021f8768e29bda4cdb4a94ff70e4434707a8ff5697f87cd3cfa8964cc4188a2894f11422a70ad04552331d3893b6e2d5235d28a9952dc716b7d7bab558758095a81d1f0c17ec1d6c593f50deba009abb212313f2b2ec3e650f7697a7ba3768645e993f61d45caf70cadab45249743eaaa59a5b60916bf66dc13066fa75e7f3e64b84a2235eb9bd21d848cc06aa679cce227dc6228ec6ad48acbf0e639ecea4dbf3f186ac61a96aab37b9ea373ccbe69a1870c3300c16187c767c58405e5d5bfb344e762b771cc797f0c434d388e42f1eedcd16f101ef2adf3e04f87d7794fef7c70614da619717dbb06c326b2a08536f06732879f7bf6e4ba423d036fdc20e13a136d4b5e47ba1ea947569a5c966ea54990115d8d9110102d21648b5c44655596cc992e69acb26870a5ce61bba4a0e8a51010ab67e1a5104fecbb9609e58eddab85a8cbe15f32877beec0961e69339d8297256dba151daef5192f99433dc7b42d444fc1f8b17bb520f9e95af7fa29f4737a65c99ccced8fcccd923992c5e148c1f8180d20241db26466c9ac4d39e79ce3e8e77409da30ad94ec1a3373a801e1d66b34d040c30568005283101c3867e754e71c0e811c0319b6a9e0d2fe248c633c74c4e6601b4a3f69b1877e645851b75a6c3772d9db9595a09b73524ae9a5534a397dce49a59452d2a9c4f550d3b4496b15547a276bad36a363968dd6d6b1329232e615b7afb8edd5bbbbb2a40df56828bf67aa15546b9de1487a20a4d77c862eb458bd5176c4a17117192fb9e64c13f24c9842a88decb99ca81a37dd2e73b362ce595d6c17c0ae47966559d6a34f63e659173ab0c7136ee7a364f1c811f6e025305e49232f1c613897b2a57b09c7dbb994281c9c7e3a3a5ed2a7245c545d1c0577e49e566999c73de278f3a9e0763e721129a411b60a261c7d148ee24f179083a44d751caa6be1686fb86171a98fad92515af5f5f429f3e913ff785e3fb0f32c47d685dcf3530ba94f0cf3460b5f9d283165b45a56c31fad111935cb142b9e9e677929f483cfcb96ba33599cb2ded7cd1596dbbff3a3cdc00f481bf60a8a1a78e30240c01a848043404eb1acb4b0aa4fe38b674e5fdcf331735605715f5e9c53b3ee747777e6395a04d2860e9139ed85b3e7059c3e2d0e9139fc4d1efa423f1d2f3c13357fe6cf34f2f3e2daa7c347c7e479c26d1f27cf536fa056f1744faf7e7ac953ef3c500afda07a0d1c67eaa9cf227d9aa93eedf4490af9a092423e50f999ea93f4248fb5f7328fe7399a762fa08d16a97be01069437dbeb4334f0e212dd21a5aa45996695a487d82406e3e2bba812376831d055e817a13fe256c28481bea9b0ea8cf257d62d2c487a1974240f4fcc83c4240a85e09c969e8538b5307d2a7ebd46be8138b5317d2a715a78e439f3ea73e44e6784e5d04324773ea23601c9d53cee9e623a77e335124a7de42a364db89ea1e6cf4e9c5c5a90fb914529487d2c1bccc28d170d92afcd8aa564d949526ea94864638924833c2f15e09138ef6ad535781547af9d1763f5a1d2c4d6c3eda796e9104b2bb802d97dd9345cfde91f1ec5c19cf190e0d354c9464e1308471a458a54373b4cdb27094633c4f168c105f70408822e0e0073598811052d080288b24845d1819438729527aa6988209027841f1844f129620050f4da4cc60079917422810c203f4c7774aca07a11f847221f74cd1304218071be115daef65232fa9d04ac58f3cc5b76f3e384c14276953330e4622576867f2cd440401ceefacd73c7b859b489b760a83cb0022d50659e5f331bdeea061c37e2091482c734ead8b66a552291fa2c0b5f827954a013195f0c9c087aedd5d1dac3508cfcf6e893842c7992b0d2d05e2093f7c87a365d661660d892665bdd5cba627419af94829a5d2734c3927ad321c69d0b4b8ec1308c9e5a474d69e534a94e6da9c734eff21bdc944be393128e51670b47925d883fb7c84a0698e1b373793663644b11e716bdca90c2907d21cdd1cae95d7fb7c7c3e3cb059bb0191c3e67596a7051c9ca6f5d61b37b466415c1ba258b3eac3ad71cf342a43b27364a79cfeb24551703d6b37aba580a7c6715a8a092554b9df4b2126867e70b997424c7461ad156242076fad75b73eba98456c9aa4961de1b2bc146282650426805e6462c544ea072925f8d27b4e673a7bce4949246b7b764b99d393a5244561a5ec6c458389fdf31d0b67d9cb6e1a8a60921a4210a2a4865e3f72d11226fcd8291f7be7bbc82481ced83cddf3b2997cf718506064b4544570e1022e7ee4d60b8afcc82e8ee29a2b5714f99aa1654c0592354a2adf455c8e70821e4c09b2a2b5b3c58fdca384107ee41fcbba99a81832be3802134b10825245a779f0238e0b9ef82f0755907802864b8b28743acab75f2878a3ccd39a17a860002f98e2a9937a78eace85f852e2e8e75cfb74704f52e20827f0b7167098b71ddc91142385c688fd489a2812c9a5c40ade3ab5dea78e822075528bec34741949a2c16b2ee5c953dfac66b9c0045f9df669000d853bb60b861253a914095814b413d56d5756fc74daa71b3f83eed8b0bf11b9135c666f57c7605a14b77fbe893e2266e9b2382c17259d3822091fa44cb852f2ed25eb7d440fc7b870f1bd3aa28406df5ee32e514495234cd2e2083a9aca27dca04a09c24052029e1d1daa8511440062060f9208e2db6138aebbef6d272f30b18513c238c110501043a77770850cbad10b007ef4a26491801f6d3c6d418b5fc19015482c81c40e5890040bc478ea373849809e7a0e1d9eb6608ba7eef2e9a0ae235c276829c00aa2d0d196b6d64d240644e43084095ac0ea810c9dcee2db6ffad47ea3bb9d6db37c3adaabe26ffc2833da58c08f379e1e6182ebc453271d51f4d45d88264f5d5c22f423c6535fc129e99085142c1882142c94b0eb67957949d0efd341a91158b4f0ed9e13239c9079eadd4e09f8c451274584f1eddba7a3a314f1f3d42975fbe9a09b166404e0a96b48f064d2e5a3c4b757d6f51ad1471552b6d46f9f10e033860f3ad46390393287f6a900dfdec5b7b7b5271762c099d42f7512759f28224055d880a70b2176924ca14375f0f48a279efa8d3e694f434a33d5a5940ee13aff7ccecb19204bba6ea5d53699255ed5414be32016a658a8a6c972152f3ca100cd6a671729cc1e912e2907456d9229ab03559be4d34f8776274a0e2146ccb639b5dbe6fa71ade644ddd16e1b112940b1e86c3edaec28d626f91a16446d927f4945f5a5d012afae05b6b6b66d563ae1b6bc143af2a3e5e08418d76b1285dbb5cab834b4c88a70ed4ba12346f8d16377e5a5d09125683b377b291444ea97704d93fcccfe12397c25bdd788f4fd59082ab8e8f1da720e7e1cfd0e43f8bc141aa2c88fdeead96dbc144202f3809efd028dda5452fa0c7d9a4e22dd3b5552b4ada97289da82724854f6338366dfc940517e0b6a917d63855b9316b902557e92e0a7b7cb2d68a23a5807035d4022a5e8b64b1e3c6ead67fb823b6eaad274d5446d524813bb108f15cf9ec5b38ff367aa264aeaf0543dcf9f2dc8bae07af693fddcee88baa289e22480d83b58ac4f52a8a7e8d9bb291d953ea58a783dccaaf1789e3bd873f3aa08104f90111692d6102e225e3eb03e8dcd458c09519fc61a0617f569b450527d1a371e9e872bb8c9935514292dfcc8ab294c050b86f263ef3c4924891d5017b4056dab4df5ec164a9f464b64c3c061ef81d3d2585a2bfbc952ec95499fc6daaa5c8c20a5a3854e5ca9639d86696297433a5247f351c62460dd8625d922119dd74771c7a9ead734bd9ec7fe7927eed83f44c89cee39c3127549411c86c8a22164cef40d0091433e6a58ca863e2603531489cc69e7a15712830e2c55aa4441025a985aa27d04724867099f61697a3853b759a9d4f7105c4da49e8bb0aa4595111e23f7a5131f24be797a7cd8bb489f4afcc34946fee970bc5bd04f0f6806924ed65021dce95f6af719e367d875c8f32d85d4270e4b41d765ce7456bf4c9705a26f1f13d02fa1ef2acd9aa6ee9734b58f608721db0712e5d224bdca8bf1a210be6f8ef0b3c86ce97e3d53f123e5db6bfad42d24c494fe81594242c87ef569ec7116f9f62edd1fb5943ef115df38f8b187bedd1eb94e826116e92f8a203b8cd6a92e7378c80f429236d45ba40d3b9764d08648223aec76a24a326443ec24a273a50d8f38dfae457165b0aeb90db530034b3284720af1193ea0756ae89367b6c541276b765a64da22dd815ce82942843b3a0e7df2fe962f66772e59a6e16d31892bd3221fb93ede3cfbbbc0b8f7b2d6e2428f4f8bf2893cbf5f2183235ccfd2882a5eca1b743edcc9cc75c5f3fe7470d4331f2ebb0f7e4d7b293446912fb5d73008f5cc594aed2cbeb20324c9780d28823737705c188134a4cd7418b9c2f4f06e53ee285f13a0409f6c05b9a78c16e5d7cc8f67169452185cea12c8e8998e9ee91672b6b8d06364bcdd4b2745f0f0e3ed9a7b03bad6863447732f9d18314585a2577674f283c4532194f8db27215cfff1aebc747244124fc3f116f9ae3ee8d889a22ea749521d8e870b503b9d4e97cee10f0ac5ed46cd4d9a724241c2280d62a534365131b86acc1513d29d1a73d1545502518dd52995c8f356b1209a56633415847e0c2e97eb59d65a6badd558a51e0009aa118460e012726248c809d7068605a25a567ff89a92a65a7590b2f6f034abb1f2b2f5d5c7192fe70c8c8f1d94bdec66d044855ec3307b8541af09234d324459ecabf7ecbdd64d9673ae30c83f8348336803e38e591191aca88c3ec5c0780dc3594452815251e14e09433bf4d5bbce60ac31acc54a418669aeb9b838c36260b2a21fb5d4d7a249e363f6ca5e32e70712358bb21ec8138c3741952101950de1abcfa289a23da47b3bcfa3ec346ad4802a8021388b483ede2212859148a4f18684229f509c19d28b7338ee33a1bf84375264a7b0198e3766c2514221c927cf301a72cc49f10a6db8bceea5398c779ce5589eb4288cbea88b850eb15856a8a6c1680e13dea08514ca8bbe5a74c1b88b771bd5368ff6cc4a7b2a8de199c93cc3311b1817c7995d3c865291223b89163d7bad3ccf3e138e24d5f3fd1a40e45d3c86658b2c1c0303435b3031e1485dd3d87fd090ba60420aa5c5ea1f7b2dc2ed583ca6bcf2e9a0217dd262a54e7f1cc1d39012b5c83e0247fe5166efcfb89433546c9186f4c977475a4b0a2e85a05892e1f469a44fbe8ef4f5d5a994af3324297d1ac94f011cb548e333e00b46231c2de925a42ddafaeaf4499fc69a0a9aa8a0178974b59026f3ae2ef9aa2909bdb9b96b8a533545c3bc79d449a8ec354dd5a94b8c931847e6d563640e7bf5923ccd78b53fe3e6cc7029519a34519fe133e0941aa8021882529a46161a03b2ccc005b44db8f21926dbe1cfae3d92eb31e018e39933e8ce7a77ff6e25f341f6452646edc9c2a83c5911aa2a7b655d642f9e4e53347557685c087fdda9a9144d4853eff292655906829ed1d0bccc242d5607c1b9f2667c86c6696a96f104eba96b7404aa10fad8f235a7aa83142bc326aa26ac3c4853f55a8f285241880f7fa8295e8104d2a6fa485320e829d053a08f247f9feea067a39aaaa9ba5355bfa2cd7098828fd94bd3c259064d18c266118d3ed129334e871a157a750aeb138d570fc199a44dd5c1ea0e4e262e2bb308567ff0508bb089a23d5232d8afd080f3a745928f384f0564a2eab467a21836138ef6b7252d565a53b069aaeee232f217a730188781953c057016b558bd0638f2d7c85e2d5624d96bb6ac78f62ab55c96910c58535595bdaadb5b0aeb4e8bd53b1fb3d75853191060dbe6fccaa464b0cd7a8c7c123892aad3005f41341830081d65af1fb9d4d45727dd90651651af45a28d9b1b1b48410b9442efe8a18ba11b21287ca030f2920a94ce640d806a0f10d79e27248a5faf19d49e5ac4a5330993465515509f360b547baaaaf6549e24fc9aa8ead3a6f624b02dac3d33a8f64ca0da537b6acf64d23e81ea4f7bf5a93db5a7fad49f4c3342578730032d6b7247f9aa3e016bef2591b823ddc02433cbb34aaed03e7ed47a23109ccf7ab8ec5915974853eab2a953299de2e0bc1a40e42d58a2ce4c431f6186c338230eceb3743995af3eabcff9840e7d65d5665967cd561cfc6840599fbd10caa0e985d0701cc17348897274f7cde02a51599d2d061db88acee639ba6e7ea34f1318adb4d26a452ef5b1a4b9f4ea548aa0c8a1343197127202681ad984a0428c1f2ac4007ad922cb214250b0a8e0e20a7a836f6e5ac0c1e19e35531cd57b655aa49eddc1d68ccee60a05152a5d5fb30e491b2c80e83a29676b8b2b39d0c99aaa63c192d4691d8e87cb52e7ea50b728bdf03294d226ccc13c64deb6c85c74343c43e52cfd6df188cb345446f49a2d6e6e5c5b8495347536d3249dac195b80be3bd593d66ce33aef5b61b92d2e2f2319981934489e9c26250c2b22228af12cbfd8c5ae9898920ca944238519333015565f1a13462fbbb8e3e69a45139512e385885bd39485dc036611fdf8b1ecb7a8a25caeafd085579f12fef90982f9943010504c49851699146a2e537fbd74caf5756b362e36d7a6854435cfe683efe6e1a1691e0705b0b9686f51be6115565f2d7695d23e3d3d324698c7f57205c0ab5b08c0c3a10622181e7d4a382556c1dfb1be60492d44130526f0bac00c302001f868880d40860032c4e0d24c26938c4d565fb7be6e44920daf6e716d3c283fd61777fbe6fa5ae0c7528144756a76f83da1f2b16eab5313f5b1be4e15204a8b9b6b05999baf8a8f25fda342a236d777457db5bcb53cd85c522c122a0fee4de6f4634d1378ed34f1f0b126aabeeaabbebe6f07cdd71ae5e5353e2524d20d0bcd8201d8003207a85fd4973475f581447d1f4b08df4f5ab448f858322994626ac8acb400812adb755614ec306f402d67191076faf421293b6104414f9dab6d715ed1524adade84aa653eb253ca94669456974228a532087d21940ea57e7a576dcac720294182f1ec1690283b67903994472612a75b7baf2b8aabc586a9ec1066ea69d8af163bca913bb68b5dfd62222a32a7091207edc18fdab307d17e64a21d14ac720576f6c1149704c20e84f05a48e6429eaa5311c25b71b3979471f04b0f679036a01329d270e49d54754237aff5e9331c32e5104b4447fa04e534757b87434857f45b9261c39926ea9b13d1b16149063be4669aa85b27a2e3a51d52a8092a25094ce79c0b45b0853da649a7248116810d734c930eafb4c816b54e03b31d59380ae9cf5ca809d8cb2f0b6ba8cf424d0cd1a63ddc7a6ef9e9a0edb33efd54bf64edc8ed276e3befb45a9f69765a2d9bf507ddb626e69c56cb66369d9833949377a8526690399a75761a644e7518dea10ce90421bc74208d9a8005240e21bc42fbc61f8f1d56dcb1533b322ff9a0cecee1f82328394d375431554c9584716c3b0748b29a28db32c0aab56aad9e300e3bc4c293d644d9d54d6bd55ab5be7a36c438ec9315b2d844595501b25816b3aa2cb6c3386c129b1dd54469311baa982aa6faea5a12c66177980049bebab69a286d00e168afd65a7d750080fce409e3d0867885d61c52217cf200982d1566cb24866357a702600940c7d31501404da84218f27445be7a0dcdca4cac53d1c46662b14ef5d555003f6f0dd1b4665aada1af1e96bc186ef5a4c4ad62b815b77af2d5c1143a194ec5252971aa184ec5a9b8245fdd69703362dc0e8dd88c588cdbf9ea343536526b88466b46ab35f4d5675eaccbb67af2b2ad5cb655b6ad9e7cf51460b4d1a6da92bc6c2a974d95e4abcbd08c63db4e2c16db76be7aa9a55edbb2430c23916e685b76e8abc7bce0d21f67905d3d59ad564f623efe9a34b12a9b846455566593b0d4e839815aac5acceec4622b61ecabdde9ef3c9256c3f14bf225d15a13c5c5b421c6c1ad7885ea2452a8b5b49636c4ad18070bc91538a2af54489bcaad76f4db90594a5cfaf57c3d96c70cea531d67933e815fcf97a4510cf4f9346a07d092afde09c0eb017e3dac89fa7ea6a967a2b8d8c7722791eed7d3b1acede162d5b36f47c7e26213c5ad0923b1b818b362cc9236fd991297722d1eae35510cc4b5a494b2e3f97a5a012ad7d9e1d53fa1db3e2ad9e15fcff7e4ab77a6d1fc947cf51e6932cd666aaa2b5c98e201ce9d363d897780fca44dd51968a2184ad78f08896216eb63c12c6245c77ad2a88e679a581e8fd6f17c654dd4e7d3a6eaf54bf2d5b3f0eb69b1fad7f3d5e90ad137ef60d1b5772cfcdc2f6b6a4496363cfa5974b0347127b7f8c9f9449a7907dd4231e0f96e086449f4941be8ba0d8c4bc71a1e352d62a0eb58b83f1e53be60922cd38a2f5b6e605ce91dfd78786ce365af308756da4887515ac40aacbd57127538994d20039f974e5e0a49f1fa2e4be2ced544b16bc5017d536994a565d03276768a8459126d7b88b89c11ae67a232a7ad0985fad8169446713fb6d5275a6deb67a2e692b9faf6cafd7cbb266a2e69533b131aced55c714048c88cb8a3f72d0a4de1397bce9e73c7ba99cc3e8fab5969c5d9372fad843eac775f967959c67167b751b47123739a85cfea0703bbd7dd9dbfc0ee89df75d7851c2836ed8f75abd3aa84d0149dcfce67e7d335ef585713a75b7bef9435fe9be266ce9ed1e08ee26ba5cfa75b2f7da10ff167bba8b966b7708222955a4b4d8b76b371237338d75e723eb2c0d50f86e91d57e29ce9f7c2f42e2c719c73d3860de9941fab46ab3c7473ba5339a794cc9e85a3ad613892a80dba67a12898d8e9313373489bad65aedc846fa139e79c73727b31e79c73727f31e79c937d4e6ed89c73cec93e99e4c59c73cec93ed9fb62ce39e79cdcb09a51a572a3019d60ca141a9017382e49ac5001101c293737a303208152849114f9eab290418f7c7931895ab5821d2691172db4c003ef072d45ac0185084cc4fa2f78edc1e4542a9512327f5089988924525089bc90d2b1640f76b0a26345e91fa8342a80a0041569003c50620b20242942e84fc9a23fe056fd81891e5a4c449148810998c88b4a450737304af04009eb6d43ebf2a9534b6916de50e3331f2d38e79c73863664317509f7a3366836b41a3badae69e0382d6ba10d59a88427141d0ea9542a87973563e6dfe6a3f79f0e4ac11dd5bbaff3cd6e6e0367c31b6afcf591fab6711be7d6b7dbb9e47ceb213bff3afbc3f37b9d7ab4e5c5472240ff7955bec5bb6d72e07cdb4fb903a5b4e1ac4b99b3f9e7d4e67a8eb98144805e7e3bb8ca07aeb80dd5471c9e8637d478cec391be60df86ea1df8b1b9e73f369fa6151ada507db43eb2a10dd5adafb8dd9c82f647a1af6ca10d5ca86423ba2ece2fe08a032102f49ebb809ecb6749bd94362de1e885d4578800fd4a96f94ae62b9e79273d0bf2cb891ab223abd4e08b30c4780214a2504567e43ab08e4ad3d98188ce2894d3647d6573ea16a42f644e47eb80ccadcf70d49eca15d0eb9397b907fe98ce51e7c29108cb139773aef2e3e69d03b42a55aa8cf1d68623176ea19291f7a7a4f4c2d3774206cf8ff6493c4ec658f2dd37646024f21bd05ec87c1e55aa54a161c98775ea16861210ed6f989f85237fe8d2de155d03644e3f932b5d3f1201facc254987cc8710d1c99cdd669953b06673da16b3b0d5935692acb7d62252ac35043f9de72ca283b5f48b8debbc8fd471f2bb9be5155a2b107456ca9481c8e1decde650ee49ab943224d93cba973329a937e70c6bacb492ce9652f2f683c6faea9dfc7494bca396d21aa3540789ead5aa87af5163355663dc4b3c1f6bacc6644e25ea55af7a49afacdbaef35ef5921aa6a9ba2caa65a476b2225dc34475b7be3ad12aec95112e0d65f2d529500cb7c66666667c2475ad31cdabb13e75349eedbcf87791971a7bf131f3a9b15a064dd1ccccbccccccc10d5589d32e57a9eb96a6c86d2384d285bb4fe9212438aa6688aa628f55858582c57639d1753f2182010011f81233b1a59d03dda8192cb6caf26953e69ee81a347531e55d114dda965a8beb64fafa42d53f5c9d69d2f92f1f4e8f1c9509aa2a9896ada3d586e0b8dd35cdb83de1dd50d99965eb93450af7a4985dd1b3246523b2a1e233fa91e1fd0479aa4a573a1299aa23b542563adb53566ad0d7bb8e02e845f893bbf60bc52a9457da26554298d72af5e5f7da2f1221619c9ea550f177a49af26aa79ca8d16656253da34a349503369b157bd6a2a2dd6ea34d5275b5f5d575ff315e32980396c5863312ee33556892a154dd32878a3c51ade749d73a8a44c9676496c15d108000090002315002030140a89c4229140304d85551f14800d819c486a56988ac324086214a48c21c61842000080002132234304a20400c1d098782d265c4256b60f75f82e1b090eb9393b97e867f01e3871bafaf093e62057877d2eaa587fa2c2bb3eea047003eee3bfd0c453ad00f1233d231b3be894939c57c6fc952b85caef5ff15ba5fb1f9326a6777ff308e22565e34ed97eefbf1d6205e93eb4c8c78a3eca844f1ab2b07ecf6e74d4dde42f42b2831c0775954f6c3d4d1c8f22e631a3a94eb3623a03e74f7855bb997e1847835b9a1a9625612c06a00f11aad94dc678600fa8de7955633a68645e8e309bb6e51dd99d4c648cb7a8cd125885acae6a75b4a2dac1ecc8a2b020be8a10c95602c20a3c4a1be6aacad24b83697a8e68688de5e075a9128406c41162c39ecc4f52175c7988ca78e0d0020ba79e43203987363ca47888e1f80663168c4a4df23fc067f0b489e58f9ad32379a09ec87b1eb4b29854d21286d642130e5c1ff9ec7698af87fd2c961724191883818a1df1bf0cd117a332610be4a95618e33f7cc819fd4c31382c2cea4bab51ec9338d4006f8eefe64254d6002b8705a1bdb3b50db51cd1373e009b7f11a7221419e59d641e06ad91af96e5ce27d914929676122116f4109b61ef3628f75cee7713ff0f78ff51d621cb230ec50f101bbe216bcf14748e44e93e88f1c93e983f22a5d0cc2ac2126663e4e866f035ef9148a097e1e43c917966492339dc85abcd04c3fc47f56cb8ecfdadba15e8c57b203857b38825afc06f43887efc348f12cd20ed8694c8c81f4608ad8d38dd68c817c04ec7303010008a94de6ff831dfaeddd5b4f4c4b4c3753ac3b0f59b68bfd7bc81afc69be2c5ac539bb9b0e99400313a6b8d73f643cbcd309fa96b90ffb244f7e47263435e6c251e975e037860a38c95eb6a6dab3e146986a1b4f25bd58789f1cbeee40b9739a3fce9b7540b027d785f0a19f0df731554f7ec9350fa3d7acb38ac4211d753093f9627be4b83a084de9e0a61910b2457a9b37a135e5d11375fe5194a522c00493543527b7c5456e84a780afb5cd86cd6f0b395df016b6f332dca19327361975666fdfaa8b96b3db8042036848df806bd409dabe1402f8da0fd38214cf047ff3c6a33a3e756912ba452028265c3cd1550a18bfe2fa318b27793661e2c297dc71f368428ca6106461bb884e1bf61fa92586905771c4b7a8570fa7a7d2afeffa1a9fd3f1cc288217e4e2048b8f3079be7795bab475aa6985656f170471e1285261e935cdd64d208821f2237c4546bea46e9ded5b3213e23d3d3ea10164bba8ad4748aa0053e43112748b5e2c27f569e27b84159ac19627b347e316ccc51575c779f3a7557792537c3fac991ca48b50693d8a7452261b421dcbe3d306c55803be235e3b818b0e1ccfc59498680f00ed2757b864291f0965cdce6691817ffca83b1a0a83ee88d357ed3f5b7b3c13026424b1e6948c46ffe1f2affd3626037ea280d3f9ec5c407229a298fd4be827ff066272e5fcf6ea00c829b5e0c024320889699a0e53816b470c6c3166190d9c340953e4616df42d0ce7ca37bea85e6ea65729e27a435ca684fe17de8308a4d946b38cffda9eff1e8a8846c3a4493513de6b6642c5f1c72d28ee8d02200a4195f3d1507198780a330cd54a3995c4924901561317e0b3daed2222db425e7eadc286267848a69585f6cd0b210f214b06b6ec1f3161d69e0287f41fed3fef1170dd32812ba855c94c0cf9133b90de5090ab47235db2c4365529787a118b3bf5caef8438d307c71f2dfa14ab0025507b0ad0721a7ef52cac10a88950c6d8952c6b9d9e1c5a3d05871510888f401915391c9704d7839aa7e498fb0e6f52b16b20dbcf81f6460cee698fc32ceaccb123db3afa8a1d6df80538cee0de6797f559b038e81fa08964934b89d85f0300ee7e599c32da723c30d8388bd381a6e623e9c2e9a605b1cf73f5369fed2dda9bf5802c7b8747a9f375d76201994cd14a70fe88925379cef9415811cc82cc27c956f429eb464349142627137f28ca8c9af4e18331d9e04b1fa32e140ea8ec0c14a76443a82daec01f3e5244dcb9a7924324cc35e67b71215187d8d76cff8069c34d3e5277076155d9a481417fbdac21cd12223b31dd18916adeffd03c958d536b86a4ef46ec9bd3071f5609522f4e06454e5ea7275af769ccd3fb83e6cc4fded2f06f27907151e9d9c2606c0b7bf14b1d0c2fd8f7ea8fefb8bea368aeb77e7940c2a0585b6ddc354d14ca4fa737f89b11f151bcdc47c663d749622e098c5ebad694c11b31c53fe95f81da3cdef738180620010539a68de257aa1d90fe27f9715104c904ca838a2dac7bc05ece6d6a7c3aed3e4b021f0745f464689708ae0fce7a7d8fba4518fee228ebf032d3065205dee1f060940504c5e2ac9cb725fbedd175d1a0f4883c47412720e9e4c3857574ea84db7e792100a07270153d43661746a047b0b5140421dcf1526690bbd8c66b8d8b50772ada43f18d49b3c88b65bd970a3f0095ad39dede20dbe164b0e414b625709f98a7be68618a33d3a634ff4fd6493cd18358163a11b5218901e01f0a0f02a7d663ab635d7ce54fa708e1b811a197f88afc30a8805ab0307d4dc278c43a5a3154fe488fc39ba5f8c7676457116467727b383b90e326148a32c651696ef57ebe53f45f4a29d042787695cd2f357ffad8cb67d520c62351c258d588e929d6a48dff83173f4fab6531643184adb5b326261f8522426c3509a82c39868a01415749f8c77f19172038a7c6e39fd3d7f0fcfa13ebd60706be58dfb59cdc5c4f9a2001e57645cf0bd5406ac1ed9821bd9d4e4901b09205010d3a9d578051a0962265cf9b75dada78cc921cc1da7c4373f678977c60437f631579b29e307627d1a5022f02cb7232f8cd5af1b1f0bb0cffdf450825658568ea5e74b0e6a50d983ef0508a818827cf9b5993f3f0b41343a78758cd373fa80ea170d0e32709328a1f907704315824b24d0e4e61ef40027a9120f1a997ae8b6bf56c4e3b9afb01f3a5068d2441aefceded2df5fb1ba8575f795a77de3770a6b2e5cf9a9bf5fb03b85b577cdc762d07a0bd501838bd63c2f3175864598cdf559209cacb6e55678f538d80f62d0028d1acd2d32ab32228291db87cef1b19fe6ee8501d55bf43ae6cec48f1296c16ff419cddb4d27345973af0cfd0c6e2f8653e3dfae584c03a3cfc8cd4bd04b15e087eb4e6bf02e768a5ebe03d5cc01d63ee0bc1231f927ef40a1180f159c50b2f55bb1d79365bfd780cab2de73b87f7cb1b8aeb2f860ea2afb5423c6986f101215dd68232a76a8a07251297726a82c537da0fbb25bfd7c9a4023f940ef83d7cf55e04dcae84b54ce5f35fb42e5a1c37eec585763dd25731957f8358174358b6cb4498a6771dd4d79d1d2dc5eafe4cd4bdb571e0c1034aa0a7e92641102af886bcc856a30d0fc67d91bb67d446041afb2a7ee5ee92d0b3142802674e0be87f22815bdcee42457883ced2c2dd27b90b08a3df9458a45af35b2ad99bed0d004ccdb07a20344eb20a4d8309164081935f60032221df680517292eec52b9bc5e751d101ad70019abf55337e65bdde81724b22691cd6218f578601ee891207b31bf2345984786b2b3c4073b3fcf73dd4ec4494b57c92f6ea5c0ed3004a62b04225c2ee11f031e7848165e0578e942c35babaaf45f3c28f8adca316e862d47bfad87041c17d09e8edb2dbb6be992be2e9e2d013e18991f1319dc240648fa0ff4916f6e076c75ee590583b4a22c0cea64ef2066f19e749509d08863b88e7a3a429d544e5452e8538fafe3a40cb87589ffdff598869b87770630b1b81095d54652cf7281215a9c96049143ecaf94b0fd3c1af2b86727e80cb8b044e667ca5cc8c67432524e986b8512f50b12d42f7794b134a18ff45d2df6e3a3e1b97bcde3f45a238ba322b3745afff3e46eff664277ae11510e7c27a1029a241bbc08433cc28624154ad1607c5a367dc6546d3c3aa7b4956877908ddc54cd1813c0251dad81ec9c05b4b2b40ebfe419d71255a328794886c5eaf9353654a1f91e2c30aadd375a75ad35a423c0724e5255280cd41ff147f1ed5b8bde4f1f8f6e398c7e1b788ea86e7cf4698c04eac9fe578e33866178166a730b722b5f2c43da6ed5676578342e390180ad025a59ba15c535ac07df1e443884d9c3d35fd2372e8172b91dd7de210f5d9b3f94d00808feb2eaf3a4f6cf246d139e20c4db6a5afa04dbe02290c16eeffd424c9e07be0ca99af08bcfe899bac19fe61602fd0d6d1043fd5669781b8900cbbcd491f654ac1fbc401acc8f321169209972b7fa078cf129d5062ff6a4f92f99523a4abff8976005726bd9a0e0e7652191573ac0856d333d4fa5d3312a4e2093d3a622b92196efa42375287a3293cefae00a50d3d498c8ba9660f2d517f43d5039038f77365842105bcef57f8aaec7b2ad8c75ee9d068cb171e4a80fe232b5d327deed553cf957bd8b2b306c0fb27c83d42e8071b202ede06e9a2ce65710475a77a62974840e070243a182e1b28a5cb9aa72434bfab06c97c18a0cc3a1cb4da5c2af118b7423969d530fbc13ff98bca05e331cb85df0d7a0a9fdcabdc143f8651e8135a2e72fc1d4807c6e55c7f09e8b90c5f1eb622bf75eca3581a90464e8e97d31b7224c520efec90a383b3ecfa697a1a7f30e42fcbc5249d52e3f0c5ab0485beabdbd519e64fa1eac0d4bb1045d40d482c1edebdf88e2fdc91beabc62119896e50029ac5161df7f3b8cb22585cc50e5a67a445c26cbd77555fd607cf81d5d90cc9133b42100fc7d33f8e3b53ebe117d7da2db59e5b1cbd8a3f38a2048809bdab3bbac7d67d70508f193b2ffd27dabb7a7238324c898119f6aed6cd87cbf6ae72cd098df4c771917b330f6baef9e591f027a7e6ae6c8247f46cde486387868b57b1a16fee360ab35624583e14d6e3c86f902c8d29788dcd4644b1d538d9bbea6f17a1226a78c933cd32a083b2659c40963390f6aef2865a44156c735b495b7ffae9509ac9629f0dc5aa035860408016969fbd677c969ed9bb5a724eec82e6f830cb9c2c727b38fb1cb90c80728077abcdc56cd95f46113974f6b17aa6e285aea9a57d7ce3e3612e3f53119c12585fa03c44b9eb05f0fa4031f74c6182e0e9c6c29cb692435f53b63304c2326c4a1bbaa91c66abde197de6ce79f02cbbba3d40e15f565bf8c7dd972ef773233493f1c21a7086ec6abf2e06e55679a51b540a47764f70c316f5662153c68c281abdaa18be6a4b8aaa7f50cc5df9047eac5e65c58ed14650027b6b8654829bd625e268eaff86e671ae93072a096696e7f9ecab8048c4e2ae6316ae139dd221b7c339d00bccec6adde7d45e8e48d82ba393c2d51baeb30fb3ab45cd1f1951cae49c7afa71712cca279766be89831c36032cb3f8ad8785211372897975ccc3d22c98a49c1f2dbb9407fc3839348ecbc9ce961ddcbfb4d5ba4ba17526a34d3e1cb646914060f191f0b0b2c060653ca6569e0069963aace63ecc700d7fe94479201554a206bb4c27ac1f0654612cd8fe9250bd36bb1afea6879c39becab9184e54b0f27254f21196f67e3bfb1d90a460453215d9c14fa8a86c700ae45b6006577ab37014ac6f346c0b76ddd588a1e3fa90692e5811f8713e50995cb5ea445294d0e5a43dcf92f503ad124652879af4bf566c3934a409f4bf12d22cff8a54a6732cad4673411049b0b3177f2d400556013c935178c8e81db5044c2cddf25f68e0e3ea4bb1fdaa30e42a424bae08c05636eeb2e90dfaeebf4e96c983d62788df13945e7121e18fc2116705e8db63e2ea5a6d52372086ffd22c9060f0082ce0e455ce25eeafccec34f4558924d58fda7a8cde8e20c28ade42bf4742f5f91947681e6a5f3bcf74c42a26b78028aea69b04080fb59402cb1e6a29f7c9c182bb6b04593d6ad1ca8c86de10802e62db09b86dec16b2d2ee932f5ee45ac0983ab49e7ad81035c2652413828efa5d2858837c21ae54bd307bbca90872164129db7b5fe49dbe32f9f977a0caf45ccd2c4245008b644b7143f8360425924915b5e9b70ac4b5593d1d9074185bb244df52edb330369ec3593c0a0edc0c55141879b7b03222bc5e03a9032a3a5681f8e4720d0d30316c9ea5c75b7aacecc511c06d563c036980d50d8ee9b19c57533c8203dfbe1ddff2b784a40e1a210e8c7f659367ff3b20828f3b51a32d56207b0527a5d69d94f188d1e1ceaf9d777aeaca18095a55123ad83cd7c6bb1fc67907d0a7ea662741d84cea1d1e9a4324c545146fa1920235003182a2ff71055d4422fe08ae358c7d461dde42ad64ab137cabaa950fe2b246e20c5708ca71b2340b9ef05020c391297fb629d5a5a8d8592c751147352aa27a14aa8b846e85de7b98caa60559efd1af9205c09f37b8dad14bce91b6167ec1bfaacbb594c7b903d88a3cc0b7fc80f8bad30fb257c96eb2d473ac54845e4a6561b4c9d95cea3fe9bbc658514edbbd0860a123e4458c60404ebe75f7c002f2c511a3eb2d70850d1bad41dd733fdc32b4326a4b58ccf2498fdea968371471cbbd894ed2275af76d8e0e11303351a29780a2c43ea41abfd1e32a060d86a8afff7b297737f2bb967e7788e4315fd0dd58e2537c85c62713d11a54d1d2ed95602524030c20f358ea5ba02ccd1c40951cfa917af2272a166c59159b4beb287dccace117338eb17500b6b45bd8a1a99e49121edaf11e42e137b8aac3b00c6b217c9bda6d9c443f68005a6837afa58eb25908f2a67a3e8790c5be56fcf46a0d541051bb51b79f718c4fe6cafb4f6706024f6867535296de1458bce29e4841c9799c694b894e38727a739f98559dcd8d7ed5c9cf6ff0230ddbe89ea84de07a9e0064f5efb69800800ce7e1477139eeba89a59696928da0568201eb52854a8e9760e482504d306fe161101260c8560c41fa37ce56acb942d9e28ededaef5884bfb2dd00a338c81b2705a8d2c36b6d18435a1d6fd662556b00f370a5401b601294c7dd4017351430e3b77bf680ff4fff399f277ec392eb99715b34db14f22fce55bf9daa0b252eb2125802b51e99578a16575f4d0da7b4ffd3759b72fdd0808d4261175798c606e7952a2cc10ea23fd98379a5b5b83122315a01c23326c6238e57aafa022f20d6cf9b3f4de089614dca2fa64d6af789574a24fa34cae9db978df7cd7519d414291dc97f44bd7efd8c65f7c5ddb607ce4bc88fa2b4ee8dc5839180c2e4a69d096dba03988a21ebab5e800a725de7fbd48579cc60e25b0d41e4d340a949947b133c263625ac2d05642c15518466a9978267a607248f68a8779539606ceda631446a385e2f748cbbbffaeffa7669a77315aea7144a67ce6d1df32190285e3bb4afdb2e294c99acc2107c6104994c37f30a87344cc50b16846ccb43e084d10b71417409b874a0e879167f48314833a916db583a146f76e43c695ca62cf401d0d81f18a251cac774036bdebd023c48b4aaa2a74d0e2c3e2221dea069cce233f50967e77171299732fda5fa64f55dacb21d938b3d3ee06897d8908fc259f5bd7b334da79266fca8c2c8a9e859293fbab63d17d0c921282ed9711f560db058bf94e5478dca92e6176669ca82a8cb59193266cc29c49a5f46ee9dfa6fba6d6693a12bc4989778c25ce58f6d12747aceefe0ac543aceb052597294fae40e169e7ef2cee00283764a2af8494d3a3bcc35640b2d3fb32fc0263641cc3de24c717ec403d93310dc7b850d5580fb7c65f60de00eaa995ae44ef30ba088ef2f3f52f87faa4fd9b52236fa4c53668edd7c3fcbb30ef1968bb88297a701b6e40c316202fe12dd424f16d063780b06555616f0f0cc9b776544296452b99fdaeff8e8a627dcbd7a02469d0a5b28c90e53469ed8a087e87d9adc8cd3e351b21ac95d35a4b1b3e360bef1b5d48fee04c8f370aeaa4945019d3246c0f558c845bd81962d0cfd9d8c36808f9e34432a7ca47e58f4bd74d6d4a90f388bf024dd402e89ef6b0e9b4fd3ffad56e0a8684c338a5610eb2c92bb6d6ec55075074c0d1c3eefee173b91ba83441694a1c77c469420db1917a563f0f456873eb45d80ae54fc019098d058b2103e8b27aede5d57cec8722ead4b13025ad09b6eb7593c3d016cd5961de502daa5b6c7e229d3d3835f72d0a9827b9d404f22b3a0875533e3f647b53af5909ff7e83363c5f3be10a063b6da93b8b19ae58920e42ea5699ace07fe9d887c7b1347736656e66b5a7c6ab3682e6a3e867d67571bea8aa0e8bb78ea3b8aba657b2f9e95c515133c04393547da59f5021472d028e6e8fa766e8a2319cf4252c6e1885f85812439ecd5ed1ec2916cec78f388ddd3798821543b68861d79459fb4c7e209d3598b89f044c5d3a20342836f21bc319e1ab7e60dcb9a08cf7c7afdc29d516bd0109e12bba22c2029a09db4f96739cc03f743c64c6ec3859a0b5dbdebcc102163387f194533541d90eb910e0444932caa099988c36984a7b5d1e3affb4cb496be99119ec248b589ac8467dfff38d44a4ffb233c516b27be7b165bb5abff365d898780b35d4b760dec677af75a498148320af502cba9ab82d8d6227749bc6c9e23998b341aaa59d9e92fb5e199aa33968848de964883f6aaa69cc2970f8d9ca28913b66bc54a4c60d28647a6e289d5f136898a2b30d015d4148d7e22e3018a6edb881be8793914f58f0fa0cc03812c70d8e1f11b8a96998835ccdd8b14368d7b037d235e26f1cfba6c96125a0bc6d5e839a9a8fcf95fd9ea96d18a8d48d451b85ec70c9f0413bdf6c681f12b908a7dd1e1b3b491deef750343927131a6833fa257a71d1ed4f12c24884a4243ec4e73491827a707cff738adad1f1827e0258aadb00054753fb3fee577896eff7fcfd9c3b04b147195fe2fc0a146dae01d91b0af2395f4b9c675894a09aaabdc5ca27a1aad2350f576e39c53d09955e685ec2d873a0788414466de95490a885bf8a86c1119405ea29316491f326451dac0c2b5290038bfd4b0ebd898137d46aba00691f592118b2e9c6fbc875c764c86d0f9a9955eac50dc2b5a1196260275dd11b67181202149b4424b514e751a2961ab0eb5c9203f6e68b5332d60c9f13122f6014fd7856df4de4d7c49abcdb3b56b6d705fd0c824327cc3c7cd52713d429e5a636e8b97d0ca32173e79a1e6feca7996b7cb17811e35120dc52e8312cdad1869cbc31e5852179f2fbc3d62a8e2fa85f6acee94bcb9a16cc3f03dedda9a64c9256a332d55cede1e7dbe6e4d1ea4da789367f6de2ad94bec29149c09af3601375498683283be4185a7960e2e34287523beb346f784ddd7a9339c0252f823909cdfd23f21990db482578788a93d4cdbf6d315130c39d0fd335cc45aff468e1d117a4fc1e062eea2fd0359702ba597eda5eb33bb0f4f420d3d4f96fe4b5d5ea6b146d111b77004c46282b2e5d876e3271cf1d2e266e0195cb055e024d5268619c31e3f5c3c470120e961742ed66ce929690c61bbb2c6d4c74cf5ba2c28b1eaedcf7bd41e7d3ce44fd1dcd967b084fd43d6f0d18971af3d7712d00f309ec189f4ba5df47aac158afeed51dabdc9d1bf040a7cfa9ea84d1927dbe54898e456b3eee7f8ae24683f0b5365b97cd0233a09476dba59e4b25db225f590aee3ea45088e42e4f904c88344cea8d1c394fbb0c6b9c330fa4066236307fe32128b4cb7d9932dd603805746174487fb6c65671b86fa707ef66a121f3007c9769d93593b3a5da1edd4f4b636f83e57a3b5bbd2e18148ac1ec7c7c422e77ce0772ffc951d68bd2486ad19be525814212a434928130e12d1342d98428bdd5db4e3d120714736ff3d508f94dcf12d4d8e1fdb34c375b2fb660ee81aa52eb8ce5d6bd9f1795293d122b5fb8991480d135613ba3d2f7afb054e269c45f1119a090315fdd260b516dd8ee696fa9ba775378c8fc5b5bfe3bd830639a74ad3d823de00f7ed5684e3beb2c038d842c02f0b79f1cdd0927678ea11523567c0ea51d8afd64cbccf86bd7e9638b1c955432eda05a5f3fb3e65b0e0fc05b6a210f6b93b40fbe7bc0ab54a77e47ac1cc4a4b965ae6bbe6e3b976a863a228acccc00c68ba90eeace0db7db296902862ff780d8713dae652ce2912f57a22a65774206874d97cbef289ba77c02f5f0277191695169e55a1c5657a807e60639d8c0c8dd1493fcec9de100df35b1b33961af94812da9c2ab5f4105b80c8525235cf6c20cd97b0b39e54ed6d3479b15c352cb8020628c0942cf87a101033bb5285e36dbdab421c6cdc379759479b3dbb5c13e8d0ae7036cd193ac2a9a62d40e4b912d8640d89eb477f8cc2c1601fd61981198eab25ddb28916b0cd7a6afd7409e2c1d649808cbe78803770a7eb07f417dc5a12ec6ac23bd6d925a3d7a872d67cde0f3d390acb994880ff80a75d1a1d6be4bae35e30898de0211d0724c48071992475c6a1179b75be4ae8a24eddd622671f68344e5632c6c8842238affe4ce1b2dacbea89a6bd52c9264978e6d0bab9f5e19f4fbb2a2a1f2346f9f8724b422778c98ec86dfae3ea207e594a5857ab6ad86c85d01289463355f46a0701c41bbddd5519569960d299e637cd78134473a4962abdacb561f34890059338ce5087050012ba070650887176664f1683d970fe3a77ad1cb4d9e977a43346eb3d5fdda806c26247e0fb50b536666da19686c139ebdaa3c1e48250e3d59c65e13bd78e25e4e2e25fa22640abcfca1b28c12570168748c82d24f5a4465756330ff0d595060e2a1c37a756d308eef4a27016b5e8a271abb529622f62f84bd55eeb0d102d900491638105cbcb9d47a494907025c49eb44bfb65677be0d3ead0d17e0dd58277404e303a5a97e072ac2e0adea12eb19d350f6b976c40510bab785ddd1bc2aa0ae5e0af8ce19549d25e40b16f89f95368afc9fb246cf28772961eb6482dae31f253f044ac99810a3ea6261038e745a80fcf725c8ed2ed069233039ff4cb0eb4b346fa29b31b7fc9a84474e0359e51805fc21651e6bbd4c0459c836df308121d97deb6fa219db103df7a2fd77d62c243e7b8622a8e825583c31fbf1b78fdcb8422f89c4cb77abdada29d25bfce7d1f7054a6a5053905bed0e1170dc1d4fca062ab8da4abc96d6af27008e32d3324a6faab4a304315806e2b2cbbde693e887e1e036dd6a90cb49cf0a9c9845c187d9378cb7aba4daa581ef31e37ac58369422b029cfb8d560fb5e3638bdbf24b1d39b984aff941bad155fc2a77af4518d6e2ef8f14711238dcd1189725d5c39bdba80c735c5fa86c389efab3960a785abebd361ca812cc000301a006f3bf263f19d66f1ad66c4119738b121e0a6eb7ed3db9851979da71b062f1c98173d73079fb061e82103f5005bb35f7e80c54d3fcbfa2fddcd3b8c284c46693ac660934fb3025756171214b6a19712ddf2b6eea30ac4575959480923f695a382c8117edacef3793852770b14ca689058fb89cc02c627211ebe94db243f4dde717f7bc2b4425d9bd5897bf1fa4abc50bac63240a824b2508403061910bbde9b27ec21a17be0693fd0b1636993fba597aa36e10c7fa0d3569828d43f31f2f3581394999c2911573451e0ce0f3e25bb898eeb54310cef481d234c35c02cc3615791785ea02b0519925bbbe7a0382a1b073abcb01112e3a8d964bdc8d1c56656b5f2323a4ec4ec79ac30baf2de437e1d4315b3a95c2ac3b6803d8fc4290c7240dd37eb55a789ce24956868f18a144d781a676f84f36749022b9610819c23749424d9b347785ed4b62c0aac954813e1a8ba5520f2fd1264f6ebf8e6ae5e6a2b03fb4e5f0125c74fc0756ba7c47052d103789a6d3c98ac883716b5bb6c65f9494fd66fbd5db2a425cdb4ab54cc34e68f051b33587bdbddacb55c731e9cdd1cd51a133e52e0bfdff8aa4221424bc84f782b24ed4fc345aefed395eff6f17904c1c00c64d01fdadd79a6e521e8f1ed6952cd837a401c24958e94d4451d0f5a697831518550959326e2f5d03d51d715649d7f8036228378da79528b75d8f0dd351b946c1857bc684ee183de277de7d15af8a38f7852db8fc8e4b5f1e7006ed5d05b955fe8bee31b0e5ba23ea94cdc801adcc27d2521c61931aa770e3b7153a5776e26df113fc6ded97e927c49d20a500b42d0ad95e9e8a51acb6c6eb708f4a5cb7326c023b250690186cb4c79cca396d83004cbfb26b9dc98ef14b98cd1b6fef703bee85004f02f2d0c435b9528d0d6cadddd5f2df06e215c3b243eeb834beea7d86b9f71399a19597bfbd7d9d15751ab549b6befc17a295e22786748349158293d6cc3965a8889e4c882dd8dcabbf8c770e962a0e39aca5fec8aa939bdcb20839799a85603146d0333d0cb475424b2cdb7dce8ecd635a6d2f905fc5eee2d60498c2584c3ae02f3aca84c06adaaf4b8468398f1d2a04b9d609b9c20e875184ec00b798df8d426acb942188c4f29edfd4d5729b6f19baec343e6df88c2de94d73255ebb8b22cc7cc40b001b3569bd0266c4591c99229133809f685ecc88ef1c61466e9dc603540ba789441b310df54695ee71969a0c81246bcb2527e8cbda1076434a3266c19e758b96d8cc6aac73b604e63ed328dae38fbe1869c61bfb843d64221b6ecd7574b20fc69f64efa85c098fb654f28f8f54f36bf0a2224cb03e162a601283bc432b634567bb32714f446defbdf90ecf593bb0cf023582e91f74e61aab9d51c952b5d75de475f847c551dc3062c1d83de16818804a460080053855a802d76e45457176617e9fe7519626d452f3fb65cedd16bc170aae925c29f528fb873ecd2769530c6a3e8b16826a2882eb57bb160729e740aeb3339f12f73d7f0d56b1f8b2621c0f8a95b99dfa6220065145dd1631ab95f002b6f4b16c7e89d9c8b16266f36609d15568389e864b01d1de52d642972c3fb1823b5b388855c65e77f373153f6b1e399a994f7037f4840d039ed1663622bbe79b6ae8e9fa39e7f7028ced9d7dce7583d6b397663edf4027af2c50e36c1648b294cfe53a7da74ab16c849d64c5451b262fd22429189bde1d1ee1632fb4742df713c641e06331d166e361c7f9e07f749d644d2011ace3fc28f1032c926b58f4567155ae46136651df9a1bd73bea8fe261ef7deb21bbceee1533ee08469329eab163e6d0df180fe7390df2afe825919bc9d934e13f68a28ef9d28241e8dc833eedc2b37bb4e3fde54d79ba3384de283c5b736475b2becc7dc438c9983ccdb267b1101fb19214d042b3765f2cb53b4c523e2364553af0c7c9a0bad097245cd36ee2a84517ae76342372d90545b6591974ed339400016bf3483ac8bc34097685e4edaed31649a20250f89d3c967b5a41447e09bf3244367e829288df9c6ef9f48f57cd0032aaf31b5d067a2fac01e4decdb13a158d384f85abf9db14425521da6ab1681f13bc2fe3b8cb910e928414a95dda9fb2d534ca56192acbdf18bc8db915fc86c2d3f63faff69bef43197236428dd10c6b73afaf47a22f641e9af5911eb92d6fac1b0c21f4f8cd0532de897238a70aac6233b063e125d9cf2ba9be70cb5d0e9d1c68c3178169d30a266bf2dd71859f675840b3f7d89c750b6fb84536eda2a1a87e86c2af23d8c3f9bee287cdbd458b3c60a007c15f352389ed3411634d56fd927370dd5487f7cd9c1c90285cafe8f2715e214c0d3a5c9cad84ee89d0a337bf00b639b382b3ce2374e672a10a2c0a921cafb38b29837750a4458c9053a7a7432813db8a82679f9ce0bb1018084d97a41812d2c14e69e199a63988e9f5f81f6db810ce8c8dd0cadde573e4bd33c8cdf68801f65e3627f6e40d3c3c4f4fbe06912f6172607ac689a36f338430c3ef931a0a6255a188259de479ea9b3a7ac1e4338fe4a8e46974a579f4afe68cd16bc2d63c2af63021f4f9f4fa857d641b781d1d57c58bccff38b4e714a8e20738b38c701d3cbec69604e93c169e2119a767f9e53df43a80bf3255e7ef8de26e422294c6be2c0201f7d5fea1643cd9abe446f755c7deae9596bc64f64b8b32aec4b02192c6180eb79029a102a13eb11a60fe7b7770fc839af79bdf6c543614547dd3d0da7580d77bfcd5aec5d139a2b09fd81f3c925911ea6ece96f4aa1f8d5448db43d38ef066203872472a163cb8899a2104e656a027adf158cf659b035df36b4150121089172bb42efc695e470612c49b40bc56924c66ed8d80c265d1e62f6887ad36aeb5b3bdeb42cc00a0bee6021fd71eca57f55e2dd2b5d4d7261eb32b5db5eeb5c300a3ee9091eb7fe160c9e61ff7f6ed6aa149546dc2d5fc46ad326139b347ccfbca746ddd1152de124e78d860a71606e02f88a77f177233953b769b78ac693ff524a58b1bd802507c55356c0fd551e0a2b2f512ffb4bfe88b98f9bc91d859f49d48d064343f21589e093138bdc76819d70542e8a42beee1c91ae86bd13aab714750f747e7370a4ff82977cc0da8f2e0b70c3d4b98c4f83eceef766791dc263cbfa514222b25429550866e4e8a3e8f1db6a2598e5d5b16be6594386ff6ea26a5d05826b1138e06a2be99a44c45a0faa0c96202ce057897e462a4cb4af36436ca2d0c432d822638a9090b59dc83ba573aac78029196f82d40c22ed2e107f7622940445df6039f4c71b3c0d92e8810dde16963dc845691556e13d7948b825bc1a1e9f92f6f98e03b93a3cef82157cb1cf945a3009ac82b9874474ae62720449ccdd8031f6066f0da372a86b100deb16387a4eb50f177c59a01a65fe693ab6641e852918b2093baec2a1f8b2c276d3a20205dfd0ba966feab54c3a2fa4f362b360d3afc853169749bc840aae26661e7acc192df6d6d4782bddfedaeb777342e9942b8a9277e538eae1bad4f7dfb5e404214583245d312838b21789948ab70abcb2adb6a7c6e42ac3b67450623d9490d1c826c508a45ffb754912ea5cd43f93b8e11f21d23595764631983b180281606043e19bc066e31ca7220bd476dba9ff9df5f476d106f17f07430daa531b7ea3d26251f3a58f58c2d3fc5ace428421afa06f6b539247d9176826919620787f6035311c70dd29d726594d8c833df37a9bf4ac48c340694557d39dd8f5f38edff12645e8d3304d84a01e7155db76a0c2d8c42be688f6f13fe0215706a3d6f5c0145da15c7f848c5444bcf5095a2029012b420229a4d8a24afcd77afb2024de81dda853def8c8552d0001052a09c3fb3addcde33b698de8c6d1c4cbbae93a58ff7c0ca461bf9f94e8b145ce9d6aaeb19a361fb74361da6916ccccfb2a8dc71188d70fa825cd3f9161432a722b21a082417f2b3236cf664f76aa0ec3a4589ccf0f0ebb3c5fd04dbe4ce517acd0acc0f6f414b6360809a00d1f279c250d71ed94562fb93903d7de88f4a9c3d5c77b181f4ad3f39d1aa112fa0d40d1e69f51368c6a3a3b66d9e4066f2494f582d061045f930a35b6d933e5e067328195b31e03e38ceb8341b1d2173b048621bae0f2d14157131774ccc218152642bce6b3691dc5a9a9fec5f3cb248019f49f5f6e7807633cc1d4e703e62e06dfcfff1553d69a83df408e8f06bd1dd12a4ba9a3a2264ff4917b4799cceeead77d5b0b3fb8705e4bc881aa17221fad5a345273e04d2cd81fbafa44a417c658d60aa85c2b12ea556319aefdf68b26a2ccf1ceeb4e4101c82f63b67c412035e9bfeed62d4d8477fbfbae9a9da4d7182bf273ec9eeea1ec97127f32c496af4b38c0988f2e96502b40b06df0d176ab6eed15eed680b4370577a9ecb9b1640c4b8cd28b92d20e58502a5072bb3c68dc8112671ede34f59726a7140f8e1f79356707958db306ffd6f6aaa3969d047eb9211c63e1d7b8632f295c677d0aff27768765de27035b4bd102c9e58f0ad5d67eec3082028d23fe80fd3959628b04073ff96d7498df03f6f3fbc00a8fc430f5ba15eb17de329c34236d589b8f74a33360786f1dc10a7fe662fe147d5e610996fc68d891a449330a264ce95565fa78e09ae32f9600a674a656f7ff8e5ee96d8475453a6a06ee346bc574ea7683d47b7b6a984ff1f0bde75e3be396869e114a9e408990d5a1885de5f4578b28548c566aa82e1238a52e3e67543de0d04b387221eb279b71e8054566706f70a369a80e2f588b683edb6416285d37d573e0b9dedb8b261e3f2b8a1cdfa2c33acc6521eada871c6da90f14f7d19b76adb41939b896c28d3b8fbae56d5ff7987c355da07734325d794b2968aab9af96c9ecf98a32926049ed41f09c8789d3e068a1856ffaf77a950f0f43d996c0089299c810b19630377a9ea357079fc9a305c83986bf76272ea9110d993ea95c9f1b30a27946ada06dd3e23d64b7412a1909664c16cb78185f67b18d47c7e003fb4b0dce9611290d9a3e5884b5bc50aef618101a66aac13de5488a9f66d081203926a35cb92284c59ca5202e6750ecc260ca9aa7832c91c90f871bca01592b80c5304de4f2690a38b081f335fb5f881f0a388068fac869fcc264ca1d26d52bcbd7b96c6f63246b61b1934d209ec1da830f2cecf5b36ae5277375f8195076650f466c3b31ce95e1f4104e39b5920e0d66d75b56358c880e532116cc8a50e13a030183dbcff69f7d8c3bd99dc24d58ec89bc921a0e0b94121aad62edc23f1421ce90abad4e01c75d7cbffb213f54d89a8d8de3ed91e762422a71911c664c0e06a5f3e1d11a268c4d43ef42e8205790f9ddb3a2fc90041220b4e0fd9e5a2c7e614a86b9d370442ff00ac45a42c50cc74a4a62fc20c17d871104e0feba6294664b885e98b535c6503fe2a1213c354d48e8d5dee747d89822690f41ed9dc1d0aee49142afd075cb7bc825f4b5ca34621c168d51fb40359cae101c3ea5bd7f427f634e9bbe6562007e9893db5335a651704aefa8192cef4e13f50c1b5eac9002ef1c7f1cdb2cb3de0bebf3409de0cc5d13a58c0d09d6e23ba56e83ae04bf65b7ee77a48ebc03fc8fd5284287933e975ee688811768e1ad55f7acac24ddc33b6a47757c327da87589f2809da11238a450878efe5b3952a117d9de47166f56bbf5bb1891029fa9d7b3902224426d5c8182d58640aa3dbdda8915b155c375921103867ef1383f63b2e27a59a034c226892238d05f640e4611564a5ee4eb81e76b6018e72f601902828343fea01b741fbf34fbcc78dae0c08dbb460486de60a9469852d99c4562969d0bf7d7fe2b4aa0103487189b56c1a880e44748c412c229c33e47b99073c6a27e7e1daf4ad8ed506235a938cf81abe7a4ed5a0b4f727c5631b52ac0a9f424ec34f2080d27b8b6e9c9d07b51937bcea08ae4ef3384828962d0503178ecea7a3c77adcdb0d7724bf363f5588672b831df2db225c4aac7c4e74860d059406f20e82c00aca9ce70d282872a3578ad4c245d7d03d47418024c16b443c1d83ad2089257bd4ee1398589527833d8a436c1a558db5ddab5dc6847b9fee62bb181a923a58a24a976c14ea7ebbd33828dc50945043fc44a68e44869c8d8f55473e524c99b12b84b791cbc466b86cf6b2bcbeaacf2feaf2ecd41d78abea5521db876405c18a5765537110b6510866ec6a910a42c2719d9fb9362dc2168c4f34ac7685c3f8e24c6e896373f7fa0a9f2d30cc881088c380d6b6a8954843585b2cfc6ba89510a213b0408c1318263e2d27305abc53e3695d8b0b691240e716831eba01e0369026171c2e704d923909a268aad0a96c02579f17cd615d16be639cf257e132872e30148cc02225730457f4d904feb7105c04e12e94c4cfb8479ccfe09ae090b882118cd389f882548236439619a38a18727600bf19b70c9ad163df0d3acbc28521ead5ae972fe8458bcb3a3e01db2b812ee0ac559092434aab980e04d7ee730f8a6d25f57b44a976633d3a29c0f0056faa2bc71e25e1a9c328892857a89033a0b91269185ed552bda44b82b93562b58b8d0624caaf4c8b41f36aaaaaae2f5a8fb513563c32f5a2d2ce5e3eb55d366e959bbbbb7efaf560a12fae05fdd5e471a3b82ca73a187b8b76c3336a191f68b0c8a7fa124f371d7b59b03eabd5fe968557f21b4334b78050ec045d64a9c4df3ea94977eb9817ccab5842973722c2cef0134291ba86decf85afdf3d38450459e3c06901a2124b2ed39d9a92d3cd4a695165e23c5036e35a9e73102427e03d9d02959d0485513a0789ecd473ee8c78c8c4c1dc1c36c52b5f39f2d941c202348eb8c6f97a27ac66690dc40df4d073b50f4d06d4088857478d424a4c15af5e48dec135f8ab4034b745061287643a31a253d8e190d3b3caba9415163e2a8d331d24630bd6524a2b32420ac7862733eac76793847d140a2f42a1a9b2e5ec8b22f67e68f1e35505f951d429e66fb8fc6a2a3c108da6d09201a94db68f608128542e0acaec0c65c68a18d6a9597193ff432fce88523bb69cfb11574e81600f5d91da2156167823db6f590a52f04932d884ac40793884a4e48748970057db4f1118937996b5f83506d2a1743fbc8b59420532b4540de79cce0e540053a3f08db5b5a8343052bf08e53701cf920c896c41ee4471a7e469c1587caa64327b738e5dcdb332724ad466382f1fc8621703891b356267b210e4c1576f6dfa8db2bbd97e9687c9aa262c3bab837d0faec31c5f10d7042244ce816a180522d1cb3e34b1fcae3df38e435764dec72a180fe56405cbfc8747a88e7ad7e708156e971dbf976639e704c076b08741c74f6580f2eafcbb8183e858c4cfaad6ff2a36e000718f60510f2d6cd185a07500a0c5179455df8335c67833ef926250d45fa63545f19f48e3d534beaea8d1332fa25bb99a6807526102f623e107fb127440db00abaacfab1a561d2ba36d3cc9b5c9dc7752749f3ec4365daa5dcdf4c3d407bb3525fdef214d0deb1c7cc4bc163cf0343a0bd8149025e6d4c77517b610abae74dd37d1d4af8cfe6d2c7643d82e700777627d080bf5db3703c70f7062bdaf73a4c0be1ecf39fbb8e5c14dd5ef678ac2ebf476177082dbe509757806086eaa9cafdcdfd741df2b1c1f14dcc0b8d696e3276d7a4b4e7d13e133536d752f772ee8df58931ca3d2caa4a3abf4b3bbf8224804385f6092fecc2dd7bb7bef1b31a3eb63491f04a6b9789632c36df07761f4eba02aa71c538841d77f542eac483bf6713f8779d44db93109874722c93a62712262f1eac68e2e0a1133a8a4f26937b031760b8522c136aba48e36a8533d7fbca185ec890d95eef201c31bd803a34e77744757356add447e1343b595f5321235932e7f788ea35e8cd30eb77b692019fadc23013ed038c06b058010a3be96deb81772101b9e0765aeba48ad5aa62c10007e171900ee7c64a3707056337e77eaf10e79ccd6a485bea4ee11d416bd619c240cb4d9d7d6d127d9dce6539bad29187769f01df911da6045c11498ece199153202830557b321024ad11a31b6d42006a64fb0d4790ad57c6d7c79163ec34904d587ecadead312c64776827a717f8d6b3f8494508052a240536c872daf223d71839af5d9b52e400d289b678e7a009077f1c2363f64bb853b3d2b29bf56d8bec08f2a4ea8d5f97f7007de2a6e08ae079e5ef8c7ff469628f6040c6fc792c32157cce3fdb6f0f511df20e1986fe1d540b99c285f9c10c13478e661250e937be40f52f6a4187036470a9c45a4ae2592ea43b7364de7ee09dc3eba4a5c749d5e3dfeed3dcb6b24c7b9f9a8835adae434ae11cf655fdc433a85bea6434de5aa69eea1b2f87ee404f5b90e7eaf4ab457d8a94e5adda71a36d8f9a9a6e50ff969d7ee24b8c7592e442da065cf16a1ab11f026b8a3226a193117e9fbf3fa7b369547acd48c4b332b296c4e603052e051af90ec48551800e3f4987079108cb37d76b4d1fd49ae3c72cddab4dd65b05095587200ca73a8ec445e48403ea2aa39531dc095dc8e41f469e12e880f727c1d7a3441499c8765735b0d7207e998083d39b709344aec6cb7211b87504a5d79b0c94114c347c1b2d31785cfdef8241e62238e7fdac3cc75721a546560b441f6fc2280862afe6051e085f195762b2fcb0211d3651607b8b4df40548e20b797211938016e1e24072913ab8301a5c3be015ede7c9572216f2e0fc7606e6d8b20602a4da0bc83977979c09ada490ffccdbc6c6f48d259d7449373d1c83335ed0cc4d677280c3bb16fa24e97c9a31bd8ab61ddfeeb937bd3f31c90577106a95e1f03d52cc7a7c42e898a1a58e0cf3954f025526c1c3a6226274bf08079e2321dac83cf49211e3b8d67d53608dc360eae8fdbf8363bdff74a04abb4489de2f6e3d3c4e219eab6c790b4983d9a533a6b6ce0007f0a8c0fd25dd54afc4ddd528e8df6ec53c61ca4d5da9ae066049a684bc281902a4e9fd8e3ceb3be2384aa1afb23c898aa08049c3730c119af3bb76da24da296479e5355db22ae4d32b5410856b0bf4db19b4da9890a81a9e0b0d3f7ede9609ba7a8aa8adb289c7e5f176227082c57a2bd51e6ff9f7b9b115624723ee90523e06115b9182502725e08ba2f4ab16fbd60e692c4a1a115551dc1d4b222c152334cd3dd4eba2d610adc9e6880ec7f2d4e8c93eb9750b905d40294c07d6f80f69371d9b7f6a64cde21e5891f4ddf6a3086a387abbdd47227906ea7c85156bee4c7199dd4fe6bdd5b4731980704e28c0c058e00e2040b16cc24af63c6028d444c331e6816d252bc50d91f187484ce55bce30ceff852aa59a54bceb42225ee5831d7c311dd7fc6b99aa08da452b123efec7acf3fabe31a6d10caabd068a3c922f9b507573aa2a29f40dd74bde0028cac68ba104602999f738f4be97526e605712a41af97172871975c34295e0ea6c2a4a88d88f3641dfa1e70ff1e70604f1ae9441f03351e1300db1ac695cc6492914581b11b510b595617b5d55987f02179ecf355691ef311575f7fa8143a0a018cddfe17403990fc70a8653f2a4d09f365233ad94199d03c319b56db55fbf56e4f2ddcb4ac134a808ee40b431de85bce3bd1fc0b940119f28712021d4ef3919c7e8c948a7c4495f60a4cccaed43dbf3632c58971e9c29fa00d8c0eab5bb8ea49edbd35200bdbd2ce880a3423f9a815d99a86f9a5b79a3e63f8f81950483ecd31567b26e40f3b564ea6557209d2208de17b9f9dfb685e6b2632ec2cf273006c32d06aa91cac886dd9403ecbfa2785c555bdf2501c01430fd929dbc7f409e0c3ca9d068d1ffba2c0544f1e06a60092d0046b84c75ec5b082be0b02d5495e0ab3178240934d2abc62c73951378b80f9a29365904425f5298cf5d401fa8fed29a242249ac5a59ed5e59cfc4b2da29986589a9659fdcb299e5b2b75bd965b1422fbb799a549cd87a8ad9638ed96025b3051bdea28828432a9b585f37db5fa483ce46f33da315eb96326750539dfc2110d0f076610597d1e2200c20ae139db5870529c98a61cc45a6334a6077124b24a380d9b89497c9f412e562ae1bee844b86243cb0ec541db5cf9f50f3273eaf3fe5cbfb0c9b000127e7a1c0b0ce44429f2d4739733ae249203b5d46ce0157ed1458941b52ce7884c5235bafd2ef55357a8b80f39b417cbdb629da7050ccd2da05ca7bff2fc51033f6cb5ef9ba226144b3d72f05b6179bfaa5c7da794afde26d6227cd0adfa05cd42fb138fb35faea6205f80bf12c2f3dfcbbfb0fa81ee4bb2140d02f8afa7d38d940343bc14027125b8cd3ccfd73ef607bcf870c4f239857da4a26a9895296c6441932a7c11452a5b634344344064e7149b3d6d2c8fd3d1ba8aaa541c7b57de06d1a95dfe1240bdf5ddb3439ca99d63e730051e162152aae90ea59c4b0c98dc71c69a429a69e204a26c2e746f643ea1ffd6cdfabc49cce0e3005f2a4af6219d9c4fb010a612fd4fd97ff16f627fb7549e2995f7a100b2bf44a63aae9227aab77154c6bfde2ae340e2113780ca56cc13ca165d01733c7ddbc8126dd3400d6f2bd40bd8c5a310869bdcda530bbf65268e58e37844ecad6a8ac2af4bb11d6d35a0c4d3afcb13997db98cdbf226e0d7d7675d4447d867d14a436a67a1024c076dc90e687c635cef1c4c7215e0585c18d0c862679591125779297f965568a661c03bcf8a1e6394448a4a3fbc3747aa20e2f240b8bc2d8465917435b8eacdc9319919237c3958a9b6b4f551a72fb0ca5f5df30f69196f9afb011ef765dbae5b1f0c1eb4ea71732e70b981092bb89256e5570a79ccc611b0c3a284a87822700c28ccf0ab3d7f6a85a81502c307d99d063916a33324130de6c387e00e45e66b0858efd4c7e14c38a6ae0d315d6c860ae88912becf685066e02dd82fa0ab31ebd153bbc77c1d4ec47e8057a06a32c2e4cc7e294044276403645eef91e3a3c6f6bf147ec171c4eaeb0a14d7c032f35f4c031da2df2c286d5b6c2e8fe51400c65873361462bd80cda8b1c992291a1686cc49f34e69b14bb3ff9e987e5bf366be4e64dd44409ffafc72a7461d2e17eda4316c9d26735b25f526325e9a6a17567e5ba58459d585167ac5817abad9b55ea8c157563b575b162dd59c5eaf8595d9dac3cfcf6d258d0e742f7a95eb91bb40a560b33aa1002d8e8d87f44493a557411813c0ca3160cad1d7136a6eea9a0809183c3c381bc0e56c6d027b334865839e2a174a9b24cbb13ee9e6048790c76c83e916488a1dae80764ce12e026bcc364a0de0388716be5edbe122471156d30ec2181942fd0fc404c4a51715fd6f84fecf09c8da516c45f76e23029355094c7099f5c1b68ab8714993fc26facf99fb5ae573cdb1c35170de1b36a1301da91f044aeda8df677cfeafedbdd237be1d3e2239b82a88fda8eb44aca77191ad713c90420e95d0513bfaf5a026ee7fb3e6fc6698af1716fc791a654d1ea0bb0b303185c2bf02044a27c2ed103ad824f4c40c582990db991f36eb93ed00b0ea87aaa971974bf17f9f3d65f14b954ddcefe397416eb716730bcc3c31c88f83e2e935bb20f29beeb761bfeb9a420778569c5b0d781285e268398d8dc34afc646f487baad0358561a4343ceff424d603b84c307a8a8e87329ca4bea164629b85e4c94461a9428c0ca0845322740b272853411b21a8f0fe735a9d339b2ae6a9478251940d7b5eb85c2e80b0bc900c1b8bd2b8123c6150a9d83b9b49cf8cd6cd4903cb8430eb719a6004fb99b19cfd9caafef6dfe5cf443112005b7804c8daf1788851025654b52d765eda0a482d4a4df9a730cd63a4c4d0e123fc79ccf319259f587f019301c3624897b85f13db2659691106812a1a01316ad732679a905d5f33002ef80973c2b420fc6fb4e654f13ae8a2cfdfcd7e816993f66c1f54b3304531a63845afe2a137f6af0112c8a9873807a7de797e0c98d3c6f60646efdad57a5325db75d10c5fc9681027190f3e5c1a2d6f2d4c35b49827920f795c744cb6684756fd3b98e10b3f0023a5250ce2b2b7bf2141690c07b1045b513e6eb3204936e0a5a245a8964929dd7eedada6606170504c3aba66661ed02194caec33dc0fb6c1175f383719cf0765c2020a9bfe3a3b7b2a96019eb25ec33c4a270c8950d09505d2d9fd5de585e383c19210e44b04d682245d03626111ae2d061f4007c2aeb6742f868f0b889cdba14143728dd8c92c618f69cc0c81eec50f2a7a994a632f5f454e15dc536d474d807a54263ba2f3f1ef1801e0cb1ad8d074827aaa60220945d87a9e72fcbb20c4f60b99f4001695d2a47a2974c125eed253bf4b9b3fa0df6dc737ddc325c63d1ca541e90bbcea5f3b170eb3a04e306050fe043eda6d69eb521bc5de6458794f0fcb6cd507b79fe721b28b1b528bd28c6a631cfb99443bf34b910639e835ba38a9f509398e7cca27e290187312dfe3e541e9846b4909172accfefcf4d706f363fdb2c179f2777210b7adbc387eeba9756dfcf63db714a6cc0824c0883fac54f3d3b276ecba0a4ca9da61d1aa32e760e812b332a7a80810388f7f720d004dd9f131ea26225aa0d153176d6195f05827c6a2bf022f420a4588cea3f2dd120abe880d8eb702b10155207cd02cefa3b48d2799e7a61b9524585a082e3a9dbd21f2c7c7a322068ef4a0d44717393fb9fba899b8a716b5200c207be9f7c8031b80c4d61882d9523b65dced8afc8e45c7628763905a778c66ed2dad51c410b6e19f0c6b698741ca8f2d9c302d44cc0a5e7cbd4ea63ccc68f79ecf863323cd76c4bc5a2961960619091a2362ed7878249f7edce3052ab33c05eb083a659d4a7302d7ae9a87b880d79466c1079c4a4b9271bec9400b769702f1b59acc9892a41f8b85915073c2e1f41c04721ed9237262d650127dcb76f26a107be5eeed14547a5236d6b06e24a2a5509ff79ac9ab431fcde9b1fb937e70365572e842c85c300f94087ac628159708885863e9022adff5bc53be392f4bd702a30e7ac08346712fad95e4dbe71ea4551bcf24da52bca4ec36f506e76dd02826d085e7213c64eca38a6b901e99aa1f0b8193a0cad416ecbb24f7d5659b22817a584d30b5dae0f5c3a50584616c843e7684a510276178c177ee32a87c345dce82ed6dd7d1751224d56455d4a96774bec4ef52b6703c767231c93abc359a234b514e1062d66b2d04233ae7a9ba60055f17fb3cc37bd3dac37430a69a8347507e2c47aaed641ef482702caadb400702b1c828761d112c334e00283fcc123c2fad4b234a554308e0453be8fbaab10ec4abfebc64c9e516d3fca359763eca96e76bb6b487d290d2764221c9873b6a9e67b7959d85cc8afa5113b20796ff35e920585f76db9dc86961f63364f4719ea58234afb913202ad2112b09d4bad830fe139577bb8e0138c196b6c57ded21539f83767746ed6a5f4b4bf13e1c3a4dedd80c1513fd48b8cf9d3079f18e2d62ed50f00bbb7a8222ca70729c20bf3cb1e9b6d4c8e4d72d0eff5aa279c9c32b9eeba7232818e914d34fec62b889caf7ca8a2a6ee250bed3784ac23d5010cb8436561b726672c48917378b3700473cf7935e597d5e4b82a6fd89463416941e351982577668b41e16e7beb5411c374ebf33d4a5b6fef2e8eeb6d7b33c56ce71d73a1dd5f88e0611102910bec560f16bc2aa1e3d8ca24d4849d6de681dce0e25697c89e2170ed0ad3807c6b23b251b3d2c1fb9305d6c4c6b0af7eef51b29addc92e9c10fc78d3e62a56de60855106a79424bbba5a07340fdf1ee00c30c5443dbe5ca86c0a9a293ad2f8c05d212ac8b11b9d2f456df63d012284e951a684a2118c6322e59df2f086920fbe2f6485ea207588bf444ceebe2b97851e199b89d2ffc596c7f9274f9f07d93d5a8234ec213233164c76cfeca3c2f76c4c35dcd3f76decb373fbc758755ea3b65df01080f11163475573ad2cf54050356fa807ab005dd958b7e2592f5b335b951c09b426a7cb650c86f9be6c3a99246cc207f3fe3cbde91d0a556a596ada6d96d9b314a0ede751b1f65b44ee516717a653b4aadc9127017c1cff26ce584ce59fbf023cfa1894233dcd4ea39a16f5709b123763f4822f19d826e944558cae301a3c4bc6d4d3f14b37e92fa214d2b7e8d61941144b063d8a51470664183df35a6e452ffdce7a3162154bc02efd4e433417d72974c654b89abb46909a03c49e025a1f92695b505cd5a603d01cc7803cee08348721db1c07e38b05ba2d83173e4f3e2df40c83b877d211688ecf78da6004735da03aa1283d421c38282c48698c61d6686a0369bfc1c8fbeae8fc6cafe679d5a4fad72da4edbdb7947b4b99929401e8065b065a0608f8dc5f2083013ebb076434c789f8e9d2cae756c2130af0b9a910e373cbbc44d0f6fd0d83f8e9f0f3b96bd039e81fa43c6786f8691a1074095280d251881f2759016be10bf8456be06709239580a5139207f1e32a93cfd2246b80c3670903b902dc2f4f103fdeaa11646df82c5b2408bccfd10cff398601f75b207a8b8f56c01da3109980fb6dc4cf4c1d1141d7f7d78820ec4b3ec71703e066f19907dc27242c3ab86f889fc9f2089adf2f637fa41c8d8ee1f5015fae0ef8f26d408c2fbb28c23f3675e3cb95015fbe427c41c495c83fd605882fd7057cf9da105917ec5fe3cb2e706dfdf0e5eac3972f0d530bfb2be0cb2e705525e0cbb5872f5f2c63fc677cd985571202be5c0ff0e56b8090bf8c50c93f18cdca972be8cbb700a52fbb702cfc7cb9aa7cf9f21086d83fa569fc839576f87225c097ef009ac61fa569b0bf93fc8385607cb90ae0cbf7848485b0ff8b2fbbc0578cb7fc75f8720dc097af47e50faa72f872c5e1cbf7066ff99b78cbc53f9788ae6cf8b28befcb9de7e2ff2e2ebe5c01f0e55bc34cb5f8b20ba728cbf20f1db9c7bfe4cb2e3a1abedc5d165fbeddacf73a1dd111f627f9b20baca1c8e1bb3b7bcc1ef144a6aa1013aa686846bcc628bcc6dab52e3e30952c0906269ec896358115d9108dc9144f64e3eb35d636aa2cac62426ff1967852494340994a2c164d55411d55510dbdbcc413197a81b58a69523c9159e9082994a9a646c342d80b30176c84896262bcc699d758ab316368b156a793352d419542c9911c35ae5e63edba44171317e972b9463347acce40d362d58827b2b5898242a84a65136c124fa46759f1c49f8efc63b5103d9e8980641e289101bb7fe1d201f51a4faff1c7b2dce39fb74a62826d0a3b4a8cb8625312866b5dab74dddd32787e95bb31bbe3fcb2c473f69583dbcfb2ac183635002cdfb310768fa916f61db0fc6c8980124fbcb9548a5c0346899edadc4bd60049c4139ac081c96432994c2693c9643235d144134d0001020408102040800001020448134d34d144132e3e28e18bfbddbddae0461c8e82329b83fb55f3b578fbbf8b01c0119430e647e979046904e94f3aa94f21b070bf6c954ed65c2967bd6270f3115247898dfa8d6dd83f29ba6a205b737e773bd7f4358ca3d1ce4d0c065a34c99b16a6598d8f5a6bc5c2346a2b4cb554ca259b6829f7d0f7f6492facda4cdbb80de7a6b086628424858a151d0b1a4a5ad4000017ef6d5c0fce8607732f0dd2efdb6a78986435285f9a880906533ac449da48e3d19f1f9ebe66b2d5f0b8205c0fce854355155caaa5b494368383e3b0d5f034937b345483daa8418d477be8cbd4a81b69a3beddb5c0594bad3419d68c0a6ece58192b9be94f8da723ffd40ff633133fbc7d25268e340036784cc05771f1f1e0b5482901c00e3574045841c3005890a08ca8809142008de2a4f32fe4e5e89003b671bf49616282830a0f293b10600028300470f242871c6eb0e1ff03f0b9caf3c9543cf901e680c30d26365cdfc8ff70f12e507c3fbc77d169f1a3a445c905c08f1a5a9470ba1f2bba151b1a7eb0e85670243f46484636153f52908c683fba33143f3a6de58fd2b51c8ed7f8c2ea66ea58d866b3698ccd1a418dafab86e723f7d094fde9a33faef27c9e3f5427d50c82af1bfefad982b8e232e0e7f9027cfdec114139fcc75953c49aa3e952d32a389021ae4c161a9fbd0c3411e482487fa648019f5d4634232a12d32a0078425c993e12f0d9a10013411eaa3fb3d4c3674f9554250ff1f57e6a95ffeb3d077165bee0ebdd1441257fbdf3e8cf9cf1d97b4cf731fd07bede47ad42c35fef25882b13019fdd04f87a6f89a01afefa6ef5671ee073d34c0f895a6821ae5016037cee2db02268c590fe50918ccf0d2322229251b58a0a27e20af5b1f2b98ff012412c4afda125d0e7369550a5948f56e9fefa86415ca12f05f8dc32c0d737298246fefa66e90f55c5f8dc2daae6a1ea812f1466882b54e6f3599ea1268252acfa43592a9f258bd5ba48a210572e161e3ecb29e0eb654c04cdcf254af92c5f44434430f87a89923c882b970f0983eef059fa20823a9fab4480cf92542a99ee0fe0b34401be5e9e20ae5c2f4bf4e742f91c6bf0c582617c8e5ec0d75b20ae5c32728444ab6cfefa23228863b15602b81e477f2e967be8c9e798047cbd8db882b14818f4737c11c978f139e5838982a81141fd970e9f73c057090b800d9f1d5f7f435cc17c984410f6c14aeea17ffd8c2bd88b8441ffbafe861476968feae726ce62912b5a0b0d169cb11420628958221f72451325c047c93f99aa8792aaa42abdc8954c06bf64a519aa92aa242357b217044c967f32d101bec9124d9668b258e44ae6c3002c22ff58960c114bc412f9902b19cb8a0f4cad0a54529554a517b962650af0a2f28f2dc55095542515a64f65e48a7df950194cadc83df455be5c59e48af5c1c397fb12f9a706253b26b69f04470b22884a629269991744cdcdbe0c5c7d4c175e55f631fad3a1947fd199dc16a4cc3d597675b81bd995fdf6d76fdf976564d9671241352268748a9135a49766b598607a6c381a6ebdcbddc83ed9f2ed9058fb72bf1c91bcd67bbbeeb3f7cfda3bf60363efd8739c0d8e87adf34f87beeb423774bddc2c4918fbab14411263df3fb2e16e70dfa4561979ac1f7b598aa00804f7fd9d7590bc7faffc93a3f6dd706e0a8fc493a3ea498827d8773c7f22c2c07e85e72cae027bea79487bf5cff972d7dd7eeeb3f6dc27451967a3bf1d52db3c39922d0d966e8e7882b94acbbc6e61ecfd89088a188b21c6de87b4ca7cecdab6fee4700ff62b12568b16c6b010c63ec6e7741063cecf87c413ecdd735511645b217e64ec5504658f3d0b169d4eee950f8db36efb3b26ee4f8283fbfbda37b46ffb76486cbfdc7f391bd9b78edb20f6e9d83e396a10fb2524d63ed9c29db0172931258c6c699592c63ecaf073f8a76218d6316686fe49694f7ff6e5fa72877461383d57cd5fe1b9c83dd8abf05870303f04df43879a070c886f6f47c5f33bffb44c7b30acc31886cd604ec8cdf2b3af3688bd12136bc1d87336e4771bc4bebfad41acc486872986bd16e9069b9cc6c00a0837e0010f7af08086f07cee29f7947b2ae5f74b1aec7fc5e06a767e6681431b47a3f3363538e3a65d3fb8b9bf9f7ecf74ab55ac7f5a84fd9ccd6a914834431494f9fdf5a9c14d35e913787ea7384e08fa5c469fcb6846a2c54fa7a247d529d9291df21f479ce5945fa3b4486b70f31ccd118ffedccfd38b64a7f9417f339d2288e341046d38bff192e06c5ee67c59669c10f269c6d9904f3fcb5ecb3c5f391167394b9b21fdb22ff44f1886613853a4c6595a78380b87f13ff7e76bd19bd79b30ed99a4c649c8336026eefbe77e93a4c3c306e72f21b10f69706657619a088229d53b43ae0737bbca551e6239b851880f5038d68ea5552b249a431a9c30f3bb48837386f1647e135707fd25e41ccdf79956d1219de5ad56291241dacff73044d0f6dc6fdb675ee6be2c3d89354e0819b1c77036e43b115fa16e7692c784787e9e233cdf635aa5444e1248a4554aa4fc2609a6ff8b7433536612c1f327c93fcd6acf9c4d7343dd246d8d32f569cab71c0de9a45699537eb253d2478324ac599d6ab05f649e480733a4671a9c243c7db44af6498aa0faf3270c2248fe7421e477bfec88dd4bbcc43f203e183cc1397b4a5283f3675ac57e2f1a4cf96792c0ffaebba496eb9f4bacf74f52fd3238bf3f924d7763dfe06d70ca74b86b704aca09d1efdf0c1d2554468c19293f6e4ec1f24ba1a18781d65d115c7cd11bafaec55f314e2f084d6eb4860ff43b80a7d7689569d2f5c54dc12c47637e7e6ca737a75bfbcdd6458339e79c75920801c20f9ca3aa46109dd76abd7949acfd0e5fb64eecba8a00e9aeb7134111d74da371caf9451f007931b95e8b16ebf85d1b8d633cf1bf400cac437efc72f6db6bd2bf5c03fb4b4f23f91c3f7e457182e5776ec0f2efc7580396cff918e56fa2473ef724b336b8bd7bd9a3f0720e98fb8e971f737fbddc61ee39bff172c5dca784c42d3aef881838823872344865a841d3cd12258aa0f8f4e5082248d22c4fb8310aeef012f26dc04bc8ef34448314fcefba965b3f97d8f77ff195d80f081083da3fa5943a2ac2a0d6824f82ee7b4a1dd520f577943fad957a09ede81f10208e06e9bf6890d2159fe27355f1bd428597c28b8d6118866118966d1a4703c3300cc3b0bfbce5352fecc1f95b25b9139c208debf341e26e2311f20313ce600429a5d12bf18fb8c3c2823be79c93ce49e924ad805ed775d149e95ff427a5f423a5945e945e178dc1101c85a05eb0c68926314a1ce7ec1f907014f20317dc9c8c314341838c201b3df3e7fcf9fe7993bb7a384a8e088a787e4a04997c947ed3493b389d4ea7d3e9743a9d4ea7d3e9743a9d4ea7d3e9743a9d4ea7d3e974da4175d93a83162f266e14821ae1280425c25a772f5a90cc6889a05519f7258e88d894319421827216c1f2e719688b8b400c5c109447abc13c53be65a11719f6cf1a8e4fb252250cf77984988408caaff305cbb984e8211206ec509846c0f27386af6b3a8edc4ccd16c44f8c077c9e3370c0e78983067c9e3cc0d128bedfc9103f45dcf83c3dc080cf7304427c9e2708a2479e103f5204c467a7c2023e3b166c7c762ed4e89b83f891a61f3efb0f7cf8ec42687cf62714f09deff712c48f8c49c0674f410bf0679fc18cde68217e3a1430a113a870e51f99628956a1142ae5ad146b0819eac50a214b052102e343529ccdd7cfdc570cc78653eb6f726c86c0e85662473c866895126bdf0641f1d8e7e8038c8ca018914a262b8bf0e0215bb2154f8a3448d3a376a9120cf1047bf9850843d6b407fb16ccc242c50e9bf41cbb17714af5c44b2acb522faa2caba1b7c250b634d9922d4913128d5cac6c856118d65a6bb4f5b3295bad967d99b1a10690c831048e07c413ec1b1061c4f00f1161d7d52a83b10f8555c4522b2bacb5633a942bf145add7d7bf6aade15561ae5a5f4bd96afd112ff6e09ee3f08637bce10d8557967db52b8ff1d0516eed8a480c4c3844e52947b507736aadb5767b7f97f9e2f6ed9024dc0dfb57d73488ddb08661df90fd66b45acd2a89c90bb8fa982ebcaa8f6ca5fc8bcee4b6187de4c83dd8bbcd3a59e699d75a6badb5d65a6badb5d62b543fc982231c85a370148e42ec65ebaa996cf508d52f6f1f0f9bcbd6b7e428942edb67b9021e9ab6f170d1ee2f2171e771841b4ed8f1248b146d5a17912deccbff1d7643d9ca9efb64a86b344f8a24cb55ba38e2092a82e2c41e47cc8ad5a2b1a1202823842826841154c3300c6bcda29d35abb54e29922ca1d40bcb8c4ce108c330b4a99a4aa552a9776ffe888783f928bcab6164bec8757d31ec1ac722496b1d22d0a249bdf171f46bedc9eefe66c71963287bc815ff9963f8fec1e19ed9c5b87382b55ea7fdb23b80a917b46892e90a63d777f6347b3a9fb6caf5323678d52afbc6d52de3fafaa53478c968507e5f1da7f743c42d43383b4d68858d5a18b35eb893be602c5327e667ea4253187bed4a0289f9177723fbec69f61488cc4e9a5aefa5b9a411d1d3dfa28934228cc9d0687ad569f40cb9e01aa7a94fdf25090d7e8ca47bd2ff71ed5727fda6dff45b0b774e0d6ce008374b1aad43ed014c6fd06f9a9a0e512ae314cdd17c8caeb81068d1244f13c65e23a23f2b3e3e055a65fb18135e5577a90b7e3af77c547cfc942e7e66b8a741d9e4e24a6c1f3d645e5773db88bbd5c29ae9340f767f3b9f3db4c9c27ddbf7d9cfa4f64acb8169d9b6aae94f87da83fd047d7c8f8ec76dc1d864d13ed7ca7d6ff776bf6d59d6d9a764280f765f3bdbea36f2db8f6cd9966d9f27c7fdf6519b7d9cf63372375ad3aae7aa995e3588c5c05aaefc5c12f395cced25ccca721d128d00df98ef2c2dd261bf56cd23a208e734afb19dafe5fac373bfe170df4120820380a39020987036b91fd9b6cd3d7b4bffb24ffdb3bf3ee3b46f29c8f8d09f0efb15a17d73fb4298f8456c95e476a3d4942a8c79a143107f6990474b7b64bc66f54cab881730f6cd0577691af7608f7a535772928b56de11e45dad5fbb56958481fdb663e2914f828347be5f0be20be2f38623f731df8ee3b8df6cb80d08c35d1998fbc8fd0b0e8c7d9bd330f73672bf857ae0be46d0f61cb771c1dde0361ce737cfd970dc86bbcff9cd67ee379f5ba6056783f3ed90f87e59e2cd732b57c9eb58c7e62ba2bbbbbbbbbbbb473c1abe8ef321fb91d774d8dcebacbb7fce55673470373aeb6ec9ede0d2e09900ac47c357ac06b16c4662354572b0e06ccc227c48c6f2be425b410bb9c3d866ab747b2db32282abbce51f19b6077b1a8c612d8c619d5d75b1c6b0f725a85a05a6b17725d8c7dec356d11e7b1f1241db63ddcc95c94e04632fc3cd635febc8679fb9cf3e4b98cceb381b23df0e89375feecf9efbc8f9a023fb91ef116f0989b98f088f3b5d9aa3554a2ac90711ad52522b132a1efb22fa002b1efbcd9bf1a45f5bf181ed694f0c530aa5a16ced0363dfb17d3488fd8cee104ae675289e603fbd6669107beab5a849dea506fb031e8830b096f660df3d78c850862c54c870877024c6c356f1afe36e6cdf0d13b3820362db56b5dedb8d705a873ac4c3261ab934a984b2c5f7d99d6556bb91bdfd76c8ce421dead000381b1e2c6b1ac42e1fb7b79006bc8806b19f1e1139e209268178827d04220cecbb19fea140cfd56ab5c2fce90867637e72e41d7257b9bbbb3fa52ef2104dcbfbd3ab5083d8d708727797fe4ebd579a7dff9cbd7f2d73d9b09f7d412061edb3d75236ebdf9ee37a6fd7bdacd74529a5947e8c14678b29a594524adf5ada22c282590d89c15896f171557b505a45baf4f81b41d9cbb77125620d4b9a82bb6129d5debe663f19583e8d29d5a6bdfd4cdf7e9e38bbaac8db0f056743fb7648bc7d997b7b83fef5ed90b87a4b83b24783d22504df030ee6af56abd56a07b7bf7eb9df7eb407c6be063e436a6a9a72d63c5dd84c02898dbbd1d37eb7b3fc13db59acee8fe5b6ba6cdff863947ef57cc6594aa028cf04d3fe56d36ee9385e187649916ca1237a028c7df1297703fb6e514750c4d837b1195216f68d617f3d7661d897127262927084241c8113b7adfda77fdd1afcc1055a34c9f48ac1edd724f72a40794fe751192f43605264cb6d38ce1c28cd4dd561413d3876163cbe8d42506118380a094283595add6ae568c8d6299ab42099313a2a2558d7ddee8b80f2892b719e24520aa6269876989670a613f79cc992ba8e021588204ed7dd51773b9fed77562bcf4e82b9d404368ef85928ad49930a511178e79c7fef54c9d04c61fa46f4676ee6bcf3cefbfef34e59ebbd5df72fa7c96bbd77864c9dfb337ad6daadfcd3d85380e41f23da33699a84a5eabd6c78f0255b73d5795af21ad0d00517f12343f7d0fbf43bb92267240cfa92f58181e9e780efcb3beb9c5849c77a259def78259dbf5e16e91e340dd24ea7f35a9c00cc45bb5bba54f343c47646e7af8f4920715d9c109de72867a3f3dc77fdf5cdb8b2fd949008ea3cb59dce736f3d4ea7f35a6f9dce5fdff924a9a4c305e1ee983809d9c23635c39bbb213b3f63f07c4e08a8fb1d214158d8044721415ab0563759a43fddd397adeed13cbaa559587c96355d87b342450a169d8f11a4441248e0cde7ab8500eef5b5c1ebdb4aae92eb39dfb91ec4da6797d6e17426a7c4e4d897ad4ea7d3e974ae1220406c33d0012c49d7735e0937fff2ea0d67a849d7e2625dc014a42829fadab6d1f8e9381c53e078039e187df7d19fd8c3e59ffc3adffd72c0b9dbae276ec479ae56b486f94e724f8b08ba4e5aa14c70ee320f987e8cf904d39f9f6fc0f4defa4eeab012b38b20fb74c80fced93a95ea94dd588fb3de663dcd7a99f5acf5aaf530eb5dd6a3d61e61ed8bbf2105775334c6ee703e6823dbc88816515264bc0c8121320446c6cb90ec249906e97cb02339a93df43bdf373557253e65e8734edcdca4f6419f729e7e935a45caaf677a08fdcdf69d0c89de2f575785d949a4eca4cf4e0a1283411c850431612d768c726e7207f07d1aac175abc0479aefcd329304569095319720f7d511dad54a8e06c7870f6a749a4417a3fbe49c7eb9070efe794b99a32aa9b3b25bf53aa08e29e7e3f11413188a0266026e26786dc2383a8d279fa4e922b3274f121b80f80dcdb11a2f35776aeebdeabe4fef5f7dd2bb93f4bb0f79f284c89c9040b893f2c7e12e9547c9e413065f175fe45b0fb5fd1752aeefde87f26797fcd49bc16a74b52822b71ee3aafc41ffbeb0fe2912719f96634481fc41385a704e7934002fbdf0ebc3f83bb5f9e1bb7c4c49c9fa67b7fbee580b83fefcff937eb280102d47e86fc53db13ca151961cca77352ffc8f9fa29b897ad5aefedbaff9c03ede9ddef48ce872983ef974df0fc234cbc8b391e07cbd9239ed4e7608eb7a1d9608ec7c17098e36da60d733ccd5b34ccf1325686399e7db198e3d52655ccf1b01a0c73bc2be6c21c8f9e28e678538e34c9f1fc8878527f46d770ccb19f493ca91c4f624d72bc88ed97c26d5e7b3905d318aaa2d687fea6c6a23f5ebec91cc0d4741b0249c0410e5aebee6ef78f11ee91f3a7bc6270fdcb13cbbee1ed6dc4ed6a823083a3901ec0e01ebce0231a9c8f1d61c415866158ed6fa0fd237b981fbbb2744bf3c0cdd1b0c1b9839b53aec71e8988e9d77bdb23b952c25c9d160dce3762cebf3c5072f48bb4d335485b97cca4e084132a128aec82f7c6887147ae18555a972f333c82f008d220f6da6bf16aaefeb6a9dff5bb6a5aca51419c655116655116c5a385c56b30c60937e1573f1c58a6952ee9badcd10d650b1524c5a3a5c5e2352d2f92bdd5c21ad6b08635ac61b5d5565b6db5b5d6fadb566bad15e5c1eed65a6bddfcf69bafd690b3a921addf10d9e7c868f524d6e4663d4735183688a1cc80324fa4b39f4ba4ca7e2572e645a6aa6c859aa42103aedfad56c91e7b59a4fa2f213bb436b4a10d6d68c31c9dd5519d19e7fa26cbb25affb2afd9ac6a9a96b9f6e518626e5feae5858a4c8d46a3d16894b2a9542a958241e1f90f3f5d9eb3d4780dd3314d642553058c7d53c145cd2a3da97319d184a113a810152415dad0861665436b51d6d6cd260cc3300cb3cc5a6b391c4e188661185a6b6d967138f7397f391c87eb3c769ff3997b0ec7c3713b9cd0a2321bdad086198af3e5186283a37ec7f9a083f5224601675ee6fa749feeee6118c2b8a431c3182782491cd5ca2fc71031de4e6826344cab68ddb2a10d03992ca8446cd9a98adea99919000000e315000038100c864302b180384c3365ee14800e708c506e5c381789e224c7318a1963180100000000c00800c0004c710068a95c48a8754d2934ee16f0c4819f346d0fa1ecd41f18edf3a8b54169c5c6d07fbf375083e551321ae20d57f7f11109dbdf0a638203042621e5886dce44f993bca6724d0ac1268c1b99c46885faaa0dcee9f833c491224cfc763111fedfcb95e0f44f602a55e5560b78208171709d4f39d9f33f9fb6b657ad219d70f640e2708546d125678b30f5910a93a1229f1072edccc9fd149c54665cb48ce863cda1136f1aa612077ec04807e4b0a65eb981a404c787ffc1c85815416d7573573c7ef3a58bec7d90baac9922cd451c9092a902016199a9ba02b5eef436a6dc948f944942cc4bb9fe1dd3430e59903b7e88d0366ea6ec8b0b0922cefbd12c7c70491d1e2bdfc7b4523d01ab8e29da31713377e9845fad35189fb65c9b4238df3acb388df0f8ed90fa9c0d71fdb31463f52a675790b222660f1f7fa6bb2d5c6fa77094ececb151f523b18808b9c18f3deadc21419bde012658e38e157d8ae64403ebfbc3c0fd1ee1feeac47de7e1967cd9a67f509994ce6bfaf615e47c5d6bc3c5bfc973d5ab8e32f5ce6e6ec4a042840f6758935e7478265ec825a491b7323cccfcc476de625c8bfe8d736695361f435471f4d074cce2706a5da18df1db9d6d5e54180dd57a75b5be019b7b4bc878501d6b9cb6f77d7c59f0bf19036bd6bada6912408a886e1e020116f760631a8d401f716b5ed997b3f6736af88171af5ec3be981b4306c0eda43e2ada7e56a15827a76f504112c4992c92426153dc938e381047217b9f709a3fb2cec886a29fa8e5d241988851bce1608b84ea499b2cd99635082b5e93caa20830fa8158d2ddb32ecbd0a4023a6f0fc2412acc95bb1cbea52b6a72b8415d41d4ae50059aee5db1b9a0a34ee095ea490e912c742f568e1b13e43a99358559019f8cd1b459ef7f50dcff386b8aec91d9c82f5480d4962529cb4b98517656a4789cdb7155aff08f0dc21d8fbd1222c0b3de893fa30f98b4ec97588c7abcecd8a0b3048bf1f00025adbdef509dff4d66fb724c394a7405578d5bb95142da12d5c9b8d2833780c2923e0a899ba4cddd952f22c07127b4bbbf2c9d714b7ee817a80a52ab3e749e4204f4a01f20760dc8c322103be922bfa12b30f5166dc69affe7a46a3201a86405e48ccbbd187b9c257796101810024530ca114a5d023a3129040932ce2e72e92616c1fd157762c197a111b26d4439b4fd7d53e3d01edc1d31128d4940ccac4c4768816848ba58fedb22fa8560916771053d9588dbb03cb594320d65cbac6685ea3ed43ed863f2ead018081a2729a35cedccf8861fc08033830a009541c191c4ccbd30a5f3ca5a2895537f1e2c4bb8432181678d9abdd7db1fd4b9d704e8a14a03e6b35bf008175febdc2aa4cf84d00803e412228cf0dc3055e95bf3a0b934607eb7dd3e21d0056c076d8e3292098fc179d9571771f8f705d179cbf9313819163ca05ab5f0aa74cb7a4563a24962fdb8febe5168ca33dddac1aea94acc509d7ecdb2e7a54e33086bd60dbdf334c4174fc009f35b0b073e86c85e7022cba1e6363095e893495b43fd3c1362b9091122ad457791ea05398370821f9a9007e2f1e42e10bc084c53c47996ec0b87ff435088560ebd65cc19b6424f73f29f9bcdacd2cd0673db5b478f09dad874e5a34691eacc54ad0ea8d89872046a8ab0850fd574897bc093098c77551215abe95d65dcc3651b7fe1a1ffc312c389c61d35d9bc554412d2228d869020f62b417357e2ef499d63602a47643a2d83d122b927e15bf61b44e19cf4092d02d5c507fd217dd40d2a3035ab829eac64fba695938f9916475f4e1220461cb62a0b57a93ed08382279d27fa6dfc60bfd7e05ba550ff8ccecefcba3dc4928c05124c433ad28c9b7b22ed2d2fe8bb48bce6d5047f443765097d6d6f6928d8eaa31d6b0913d6f374b584dd1d4ec401d98e930a89a4cb9dba4459988f62c3170632a7616cfae635d1effb743f4f4cda5d3994fcf4027201433b03a0f187ec4754edc8ec82c65785f74f5f8918c0e8a0d956fcb69461e3faefe3ebb8b48e7f7930b11328aaf69335ca71fac4945a047b1921554f64a14b0dd234ebeb6b05341017a7cb302971e6249c7f71b346a24e76f4362602fc6fcb21985b6d2330143c43f7988c61f077561371e68ef08c88b89f370b5d7a32cd2cfe4ae43e43d7a1d18f5296a395d59732ca111032d9bbbcc026da1288761dc896f43a0b014106f786f75dbce271402f3e29de2eda859cdb1c7b48ed0ea736b45a7c985d7ce76e2c530c01067dfb402852c1466cc6d5a91b6336d357b1a85f17c4a7aad8819beb2237742f6810456c5d09103b0dcd2004f9e27bd51dfdb955d2918add50742d863632c2133ff6b0cb6c5533657d79aacf2c0f17fb3d2082b58ba4a060f56f1ac41312309e4e894b776537dc9cb65849afc0ec1688682e4ad792813bd6369b7cb84fdb1b12ddfbe9199ff4d732d0fc6845be16949e21868ae3de8e1b36856982e09dbb4e973061111eea16697018737a0136b1645fb5a95ddad68c74890f55df4206abecb529297aa96d8e24611628220509d50bcd65c3b0f45817d24e4a4d63cad263b93729de2db4bf883d6a3968e4450ca125e452156113044496f20fefc23b9b14d271c741abffc034544417f25b3d31545d56e866fc06c51ba9034e10b1c1aaff0ca23ad803a4cf69fb7c2b6dee073010ce359e0bdd0567017d3ca6c76f834866849b3e70333a11447cd4f1cc2879217a4319188d4ef5ced8f46d4400339b2494237a5fe911fcc211cbb6c89f29026d75ab46ef2b650efa6bc1157a90aa1dba680d4b347ddd5cb495e66c743ce17cf46d64467a97614ebafe2d6cb0d24ccdbf345e40cbaf2774d3f5eb34b24a4b6849f6298dc35bb69a0e5d53cec06fa433bf8db340504a32a12c0714171e2eb75725a865ea6be98346c645938fa28a038c045fdbebad9b6b386f3ba0d42d9a8e6a65509923fac84320019a3ad4ed8f7c4e8ef0d2f173271a3a8036ae40a7afd2f6d1ca3d8bff91c4253d241f02abbc3f05447eaf1a2d59f15b6f2ebfc49112334fec57f93584934900809ba9537ffdd736b89ba798bde1326a3b0c5e59891bb9656f71bd3805c7aab9801c99eb04a5575bfb0c4129e6e3cc493fd5490dac9b22a62ff2041519a5f27caf0db6db8db3c356c1f7e54ad889262dfc82fd32f377a44a46fd2f0d1ed015e197fc9ebe3b1aaa0298f506cfd4b4ea5508641378114351adcdc0c6f036f4dab17cd7823680cf51aa592ab79da5a7a50a0cdd0663538cbceebb5a397a77d730e0b7c41d3eedf8e8269e1a0873ca365d78eb051adda698ea3a04457e44d104fe0ed84637bfee57947584f64b440ccc11027224d53fa36c49a0a56c254a63fe6b7ed58f85ad31b5579029668563a66706084863556c47b10a5464dec30d39b181162a1fc1e424847a2a4797201d34c79387f7ef188ab35cf9c632ca4fd5cc9f4edfd1dd60deb151cd86e285a7a5579b09e0c4b561a7062b9a4ae29ac556c30c9e8aba619819b8a64084908af849fd2716ae9a2c7177ee892d04352c6634311698aa107846aa455d67b0488eba9b3f5b58ce8e4b290b98d60ca93675739574faa62c8a483e055e3e5845313bae01c44955652f7626fc0970c4e1e25f11b871d7223f575c6ff1fab3023b2e5161d0f61591eb651486f2b2d070cb8e7c1fec4759e083c1e5f58790cd3219c7a5236748716257dbea5ecc9961f861a8bb520e7eff0eb8d734b06b00d8f4b26d59d37e674d269e474177e6dd8463df167a69f6113370e4cacd10c7284976ff9e06c9cb0186b078062fdf35edc80df4d3b3f0f48e83057fa8c5f352ceaea65d253deed76fb895fcccd1ea886f3f4fec66ec5c930545da212fc8b90e95a90f1af3ec5c05bbd113424ef38f2b0cec30fd5aaf8f806f1f8c6ba58040b736b0e235534c55b53aa0fda32f5e9f16818a8ae8ffdda8a90effb6178b46d2aa2e67cff7517b88592b6d6ff9d7101c9beb380b659c953145abd9e01f08f0e88902b090d93f1f1dc8c58b530602d12b2db543da70f411d2df8fb9f7b23b85ecf601bce778afe3efeac1e38b012243e43aa246ac67dd206bc3999844175a2926f6c1c69182f528497eb044435ae6da904d831a62a47ce925298c21c7aab494e5a85fb2d6d50445eb95061066cce6a8fc3c1bd8a9b072cfa40b000445a7f979ce4a9e3e7d081b631d228c7e9f26b3f1de0d71b11f8bc083db7aadbe021d9fc2a0cb3109e1a46648d634055fa449514fe6377f172b7a2fde0e33f7ebe9ee6da6085e3dc03ff7e0f658bdc5d199e30be189a220bd77e82f9fc9897df8b367c7ed09c74d019e45ee54f3c693c1577516cda908a36fc0dc67141db833da50501cde90bdd44a6ac419392ca29f5b3bdfc0b9e4378c2ff1c8d2d909fd26649d148822c2c48d2fce556c8d4d8c1325ecfcdba2fdb7a5dc59807f9e4a8099f1387a883ee4e496379676720bbf08a0838697b9cd35ba74d00f3c55fe3990c0db86a5cb30a4ea618c0d7a7148581b87bc28e164e89603a1b91ef882212e6ae1020535bd894f3100e2b921922f70b764212476a31e20487cf72b344b8142c60c754afacb7bed0d5d9a445190f3816737a66e9f039f4f9336bedc7a4f1786c19e84cf157a8e0646b184adc8639a4adff513fe27e8cd1205f1113306eb4d34b210b991da85bcb61206485cef1450989461a4744d99702185385d958d4a6bf1631e7f455094419c3b26047b184c7ebc16f1d86731aed0a42eaba88652f08eddbcd28bc59d1cd8941cc7e650e8d51b7a0ceee2ceb3b8917ef5aedebc31ac771b763df453a78f4fc9e91fbc1435b2cbf273a1ac09fd14e4e04a99b1e9ac77342e1be487cff039d6f3209e0a9ef731f019ed88b0ab2e7301cf74ae1a633e6ffa62896a61ef50d06cab151fec387fa928c026801ff339299613f4c912486ff69eba0cc885589843a0fc3d29c286a0d7b9749af28d2810152421838345cde97137a21034f26d10ad0587a0f7583f1887da0033b280e8e6b24084ebe0aac0102e162ee4c81c949dbd193d71156a875fd00fe3a864123b38c83181c06869c28b145e924b507ed43e561e39ec5ad51f612637a177c9ca2938d2fd1c5f19cb15a7a32ffa5ff137076a38ccbc584ebe1ff787de700d26a37516fb00d1966871dbd72b65cf4fec31742277d687c0f06422e9832db3bb0daeb89d8982a3c907383e0f72adbff9781c755c6cf798d55a9720862947e6e2d01bb3604b3823c4b5906b672fe4a1f70ec5f377e81f1272a8e46136452e4e8ea552e61d7a637fc1ac5ca8a7eb2d5b7b6816bd96932f63d1b29873947ad12723c9020f7ea695219ffe399cc4312dccb6d6364c322c7c7a07cd9fd1d65580cda569156397418ce9d9284cadfae257fb7008d303fee62a7a8d086c2b95f9a42777d26b07148cab742b7130bdcc7ef9e8068ee7d007380699c3401854265922c0d6bee7ef7f86871ee4409527999805621d2a8e8495d5dabb846dac61214085a17fdd4851d5c21492353cb3f612d2e597016979f8d46f833e252a9ee6ab61e92f9b58aac2872a9d8d29538202a90daf6efce69abbc65bb2bdc956e24c32e2a774dd0b842bbb8251126b8bbfb2bddb38ee488db23d53bcf41707b6af982bf663441bebef6e27d6f66639096a4160b0b14099641e2eebe7035adfbfea158cf294c93a813e8eba9cdb52b4983162aa3931de9607c938d35cd4bd3cf7f78dbc4c7d44e71ec7b61f0a0fbbd13e7459e2ee9ca5a5698e991784c631268d4222860fea933f9bf455d63799569db77d41870f11d63853786c5f99a3df0b1b884cab6ffc1b28da9691bbd178179e635ce00431fe3b6af929b7fd571d5ec88673856ffb2f60744c7d3a3adff6c6237bdb5eb1d87ea97d782eb30489adf5ed81f07caf025ff4369c4972db2f760ae8e3bbd1eab6ef66bb8df37088a32202b76af8141410764d74cf1bba7a60f56ef9b6fc53565394dd0abdd6f410307224af899b24d690fee8fa8140c22c82db6d7f078e6bde8c3afe88c67716b2dd6b1ea75510b7bdbb2785d2dd9a507f31d9151075a640b839d3fe91f99568d4fec58fcd8430abe4d4b3c1f8ff331a7bfb5776d88696fd0d108d959b99ced0f38cedbdbdd77da7da1cdf900181ef7d676bc2c95ca98744c74632d077fb2cfa26661f967159172aa38dcad5c138df7d2cc3ebfdeeb196b6fc11d9a966a384d311fc920538dfcf4b4910c00d8e4b51287eb65d1484aa512030c1db4c130c0f38fc6dea9fa279de68548c405ed7ae5ee79ac6edbb8e331131c36b80fc2988c5ee04450091f8a3067f8817c5c784e837a7738d54089d08027477339209f237646955373e2aec76d7607386e3b0c769e001227f05bcf629e28dfc0391e31790f056dd794c33fd42f17f3b41dd02cae877fb614c2fd976bd1227e8dc153fc29ffc0368d49811942d8b48edb8fecd3fac6d431a7213922974fa2bb8ea1371dfa34f648aef381ec370213a0e684637c38152e2dbec419fe7ff15fffdb1684cdef3b786c51c31f32f9da097dfc2b71dc286d2a8d9aff1076db9387e93351016fa6e6a6715fd66bc2215ff5eeb5eb2088075b519f405d7710c5bc456eac6c1b19dccd4139212d60a3377b760980f2973101b40a3c7972a06c2fda66e186e5d144086270d92bcc4c3c6299f9727ecbda875d3d9ca25ac73a6d3cca047d16b4714a4008caea12da5635b8800006e8b45bd8d265d299457891df2fc1b706dc4d58c70dbce107e61d1cdd01516c07681d2bd22c151d8026c7232554c9e720ce82ce6656afc6f791b4bb877cd67c39db1d8cbd28965b3c821b39a09d341d08f70289964d3330da6580e807ef9889152b0edb8da58b88708344b03200defd2d820b3b8328ea94a17be34c5363efdf36b3224f1f1c9d59aba9bbc5bb48f71d7602300c7510b5467e41f8d0b136f1192fae4fcefbb93d1bc78e5876bce0fa7bd4f18f735098003043c438b06210d3793139b8eb3ab67e38a22224b8a1bf624e054826e838fa2b04ed0d59f2fdbc1d4ffff47c90ab4d59495ae5af41d18162921cb81e971793be8e8a5a6aa44fb5e88c4a6ca7b7eb5eb136130e3f084f80490397ffd33070d0ef7b233bc553e75fb09809df801ef2b1091d754fb679e80378ecd2e333af118442b8d2d552b56237957e2421c0910d4105bd2a8a71592285442a359326fb97207843d02d8d8ad773d7740307cab5d0af6f1c4fa1a7705b696f6b993fae3cbecc8c78fc891ed607bb46185ec74c3dfae7c16c7c7c0adf1bd0c602a5bbba39c62ca8c046981d7ab5c6de88eb0ea441e591578f1e558b5e12cacaac04bd09f79400c8d722b1098665bbd4c78285e2394294fd5acd5b1eb8553770131a6bb15783de6c6aef25f99120c58cf223e9c7ba158dfdea08e787cc2456980d03549a471763e8113c0ceacc9e2678981cf2e1dea04ce28b167741f60e2956d40b3cd7a0330af8e77e212f812c507a2d7076ff3f66e08d74312bf59be12d7a6bcbe57a3cde2783f0d7a2c07c3d4a6962ff4f146396821681b07e610b3ffe5eb41d1f18a2cf9b042fb9f50e29c39abfe74c97a178b2d01aacb06a6143466390bd94a18d234b2427bdab5295244f8d669089434fa8a2413a70f62f323304d149bf05277146e5f73c39450ee9c51cf198f4be9d993806c330f8fe9ec2b9448b12ed28e86cdd930214002a2495ee32282c595f383880f114d7d1a47271c3932b9a67f1e5698452ce3d848d3392d359c1abb0de746cff80cb0cd92fcef08231f496e2744b8022917e5d2df340857e1fb132dfa61f8ee4390b503633a08c835384ff8cfd93efbde763b72253f8243c3455cc99f99a794952fad96b51701d42c600ce047b7a9b2c108e3a9c42687a087f97a606c63c5a52c1d8ac4a300a46e9adb9bb988428f913ccf442b40049c41ce5d6df5ceff441568ab99a5d564b58a71a4513d81a948daa72bb204f62135d3aad5e87a3b6727ef77ea402f70857c9b035505f516b0bcdac3437e9948cd54238b6f42de0eb91a2014557297e5228a23b0949ae047860ecf952f947ec3a0e5790986592a1ce7e1fd98e3c39b9dccacb12b7355d6d1ec8bf2148785587c358e3cd68d52024e4dc37ede40b9a3c7491ba3ad097ed2d9c44f077c6b2c3bef78a556a7cef76af352caf34114de026e30cf8aed2425adb8eca26e5517b55fb48816d6d51e5b45fd7c114c725d58c2a7fb8ef07bfe959943572baacaab717d651cf1b29b8e047e532bc39fb07a22732d4109ea08a673a8ea6a873f17b403c971b7350d9c79eeada8aa124d5149a66d3a9cb9318ffdbf97d428acee2a7d6635d4690180780d6b654ead3c8caefe2f37d6ce12a13e9e9c236508781f759b99e27f782e7bd3ba8e772eb8f26ba37391519e143c60493c74249234fb91c6afc972fe80e241504588dd00abd03df4616b58e93b78cc840df76954422c4d938f933994ccba81303a03a3207b611be5f54db01898606d5351b5920a236df8061243b9811b0bd97c64b857827a7a538885ee6319fd08b5955443d1a8ff93f48c6122cf03c22d8b44750b38b0ca4107d6b0fb52366184bf2d0e2ce95a1e96c5742babeddd5acc2ebfaa7287dd4eb1da7bc158401c7bd32f8960f7e55cc526d6106370b131e1e4acefda1bb4a094096bba140d2e43e50965c6b0140b897d0bb5313e5cb36a128c9108c81f987b481c33ed999d4ebaeabc2020bdbec59bec81910f984746ae410b862d81b77419d089b7aefe99040ad8617429c45583515e01ad6badb0b8e919fce0eff53de235cd36c651f1f5fdadd2a7b55d936f3fdfdc72b81105b7682312dfe67df085e64f9556090ed1489c65745c66b2c192a531f3563d3570e8976086edfe23ae97f9fa8d50008c0d21816f79d81010b1b421593227e72f00b9ed365acf76ee0cbab69edcaa89a71d53fb2f927bdaa9aaa26b6722293034dc26e2f81f720cbe04c921011a3bc129f3eaf41d79bb5268ac4f6eac8e80a0106af24bd88be2c9d8ce36e1fba1f07d2b48e0f4daf94c10284b234e90e6489e6d53a442fe30ec96972da355c99e4aec6ef69e7584a3e62d5760c6b8f2cbf5854c61560c3c145ac48246d8d44ea7956ca4d6eab7041f893ba2f9d65dc27d705849efb7b0320f695c498bf8222ea8a006fdac8fba45bee71112961100d385cd650f3c97c870075952996a808ee8ac68a6074ed7cab0f789c4359c5690c3946edc3de84fa0b7eab84ee670633a1d008f827f2ae53cb7037198ab77bab5084b8d80acfe0e1cd22bfd22028ce04c323e7a4af1b4f7a867a97a0a45901a5f2ba9b1115a4f067cae4556eb2a8c2a5510d94d1525c78da85e924fe6ac00bd0fd294721da5852c1c8768a8b8e29fdc64576be17dcb878d62f262f1ea8361468be1b0ade832c3d435575a637eda1453abbec2712b6c4499b58efbd6710fed925f6f74c0bab6f94ec2debef48036eb0bf87bd8a9754fc0d3ec2b6034bfd608f9ce63f346bdcaeb687b30fdeec92011d5879b8996b5f869476f71ce542d35ad193a836510242235e02fcb6b98ce7ee0133230a17df7b6f7b04ac24ce5196fd1906ac49880601512cc8b034c635f185c5ecfc267a65822f9fa388d6fd2554e261b220d860da58f220f3a9c0e84f584fc2f616baca08bf5b07bb11e9ce61296429858b1149911603e61b1138b0bf7e4c9d29168def3cafb27e0178624452e3baa8fd8890a3f46682877ff9e993f9609031b1780055c906cf80e37acf9175988248557456c1b3232bcd67b8c5fd71d349d4f530bd49a7ca101c034685fc279d7335fc26669bbb5186b241fa6a40a990b27a59adf528e1444e6ad3ce5305565fa9fed9a32ac5bad6b64ae16c368d9c6e33b50007210d6436b4de080a42c64628aea108b86cd67b5a865cd800b1614db47628ebf54335d742e81949c2de94b4886da4121cc586e5fa44e65f0d6eb02bb5c18a018a30e9fcdadfcdd1f43e3f65c355ce0c54d0eeda86bc45332d26a0c119da8ce743a556c773b1d1f42c7b3260d1123baac33cff6e86cdac144245025001118475c4874aabbd51732911bd430a24894726488ab217e1cf5e18bdc4b501fa0efdfba451ef2c761f0e4754050ca5546b9b20df017072f163dad8fe02b13b04d43898c0e38f80024987cc7f3be6fa8639d5a0fe8f50e61d257e3a9f434df7922880f5f11904a13ce404aa3fd67a952127142c4d2bfddc4c4a8fbaa2aa00d65fa22d6d424ec13a09a44c2448ca8c926567733190e086685ce9f197edd3dafa33000bdc2a4c020c77c520d089cfc4affda093498229239abfac9b841c1618398101e9836e3f4a71546b96602934c6d36b028d7018f441cd60efe2ae3edccd852810e693a1b5a38ec46a712d04a46f7e0593173825d1d414574d508fb3c709ba6d1d68c242f5bc8d16a280c215e950c4a763d4891b34bb1d86899527d44f9b75c429576ab80b8aab37a611b972ccccc839d8b2d221402cd866594ab5845b39a87e11f5310cb27633d0f07417acab9d42dd23173499590dd37879e3cfe7fcc8337a3e00e7aaa25b71ad1c23ce5018f9953bab894331e923e31244075fc5106d39982e79bded31c72b57339cc0b1e1ca21ba2d3d3c7e7b8f1a33ff69d7eccedee723c09af0cc54b4081ab0c45deeb6648334b329274ed43552a8c47c4eaa7875ec8a06a9c6fc185169b5e3f0805dfc723720276b9d3e1d19335843bd93d30b443849bb6170a44ad3124784398333cc51756e9556610e11966ac27d79cf4634e558601aa4a8944e311a3712fe204a39986b1ef07dc70d320a655e0a053082d0abf9ee0e93841a8b014f584a504932798e2370a376e061114b7483ac3893ade2c9b17524ea400562c52c75ac73613a637995b746088f8e4e10bc47ac42333ed4f49a7c1ebc9d6ed6a9c8cc9342202497af56b1c7258545fb8fd8ac6b3454661ca9e0c22a0424d2dc62df51e64f809e48bcf140afaf2a444f7e8b7e108e0c5a2a2b3632e0ae61f137f002ee0b5007dd39deaa3b6a251e3e5fb14d3800fef07ba20b26f14694e817f2b7529793efde9a3b275ebc9bccc88dd31d6529d7dd91da890ca47d68aef91d8685cceb721faa69d98a2dac7968daa1c4bf45fb100109572250409cd29bb78cb8668287ef1de05505958d0f9bd881452345e26dc929735645fa56973cdf1e78f04424f4a31b3c8f23d0bb8667095d939e886471ccb1aabfc8cad38ef13c4b7437c3934ca028dedfa46c6e69f3bc154e9e934ade2f90048f1ba152033800bf5f73497b10ba1b9cf799f9967f27f2735142200c377945aad78690a52dfbbcbeed60eba83e55dc891283cb277ff30fcdaab2868f07d5fcef10679270ff10c340b7cd355452d995edae0b912f638d0757c601b08e8eba986a04247b8d0214d0da79b6ae3f5df49dd62c8c4bb63db41d1155cb4404bad029fea98ba3b4a151a6df581fa56403c865ceb93e4541fd1be3110acea4ca9c549be7b48fbf3b97a9ab2165210de91ad25c624eb10ab40638a0212175df3d950655fef957522422e76b058cdc14490e5479e33874f7a1dd3740ded9c76b15a531487d8c9491a1213c33e78347fc63c3f3937c828296f537bafe2c347fedf0dd9d6d627818e349e765ea39108f8182dc0d426aeaeee6aee76851e901e21247fcedca93405db501850250ca1e2056ec27bb76411926d4dd52902d44813eb8b9cf52ff3d177b9654cd2c2ba1e05f3cf9393c6f1fc9af36d935cf083c3c36abd487d3f8b7edc26bb866af860c69a6aa8cc2c6ff288cfec1a30b717086dafadad25604056879c20e3048654305e24322f4596d05d93f3102ab99178880fbac07c91f227cad575cea3346f6d3019a414af9a4543ade23989dca8a8d5029ee3443e7196e04d3a88252b6c3e85f5e3925789aee56a5c01ebb3ee96885ba1683bff984d180f7cd270089c2f896fd407ffdc27b07634a00e04ce68d1baa231d8cd01d5e25516ca55615ac78284fa9bc8f5265930e40b7fe5d0a5a461a4f333c859757917da07235db36336e4552f128421b36032b69e083862375a415629858e46a19b5cb0a2fe09634172acb3cb8924e1a7819f0a3f9c0a269876859da5eb83a3379a000d9f60e64ce4da146e0d2914229ebfe41d292333015cdd185a3a95dbea99f93b6c947c8468dfcfc072f489189fa98553f9d77463c9404b603755ad8c75651c1166461828542ff75a74a9e1be6a8aa05c7612c80a38a2976c63dd50af27dc43f3928e143c23ee4676da3a1228ff2d74aad0f1b8de81a6f943128f954a3e09ae7708a11c028809c5167e6f96830de26a7d5b7abb213a067e5760c5aa87d1a4769db461231f962c2d311af08e24fc6048ad99cdb5c5304474382f4726e871e1953826c834ebc2e8aead5452da426b2139820cd7138d2a787e4f78daa614b74f27a572d81ed08864868e6f80aa79e230151cf597c11b2f59d143d2890f3faa36b91a1911922fbb956c3b239aa2d84d8224fe337fd855b9bd82efc76d3c02b58f0f1c4e645032051dce5abbef8a59e3dc6382590d9b085ebcde6c50ad016c9229e15972f066281d85d8cd27109ba94e21e0208f89fe438790b84951296eed449f1446f1bf4761315b7b39117813f446d253d80ddf14fe5499003d4d7c8d63d745a3b898bb0a9197d3579415c3e4fb14759067120f14296b1577f37d1422374d12f503ebea32f56bf32bcf206caf28afcd0afd7d6d57c3ebd55b8636736ada8138b2d071acd343b890cce6b1f5d693a0a47db79a821ca4fe129bdcb6b0183ad093f87d4e28ed2ebcfdca1904645ee45c5c24e8ab1d2b97b43f42d421f1ffe3a50dea0e34f3fe46a99647a20536969399c6c098a854586a5e9901065a8ab6a8a51900f0a7dfe3bcf8e21e1ea996f62ce9e746f878380bb3b511e89bf700cf53a4164ce52fd4a8a559a84eeef9a92693c3a8457835a3fc780bb9a8856e3efb49a4c9e4522e71452db1a7bee1bca865d9c55dafd502937cf15b0aaec711062079d175b8b617e24baf4176fda216398aee8d467224adb873c55978ba43aca420841ff94fa9cc78f1f7135612b30f473e8e8e4959452c60414d29f08dd7353b1021ae92b644d7112358026f50393128d265b4b957944d73c0254015958ebe886f5c0368a8a2580deb1ae1a46d458ecf5333f4729afccf04cf655145c7b646f015bac49525a40dd3fe60eeb10685e6042de57c03a191b895467fa6a4f79f8439fb504229a8a33e0c231d813ec4d52270a6d9f48532aec154404f4d1a41cb4e2e8bc6784759a34f5111d5531a391a9093fa023975053ae9cc71543dbf22d770d60ab7c850576b02a6d517d64707e35911096aacec02897a28a0d1adf8002ac092922b12ef8de9c2186d60d4bb3c2c1476c4baa19715ef2a07c7a33e1ae53ad358868d7862d998f0e4a91bf980a658ae8453c0e6b0c5274f98bd8026bf2d620772f1c94a19a0e61c8b0ee5cbd10e51b385d8a08d48e0b1a506ef37c25d0d85020c2d29c8e0a9527a01e0aeec9e7d0a342a023cb127d76e4fefa06764fd183474cd74218defa7be6970de8c3cf7fa1e4aeecbfd38efe20b11ea7b486c1fa99fb47afca89f50ba3d364112a849456f35ab9ab0fd8a42cb85fdd9cfa26ae9fe4a5b8231e958e5a8e8470d30f84f01780de3b5433c4b05bac420b385bc847148f251892dd091c8f295e64bd8cbf89c52b9045fa4ad31673db191ccd07e190c3b74cee0173b3ab869388c42b6f5316ce41f961ae3c7547a60b08e1dc34bfeebcaafe798b90194c368673452169c53ea807d004d221a50bad9953ca9a209c76167619a1540a3fdbeebf823540039778aa23ef1ec5c7c95266d81f74288535e27dab6c2243650f1ff794bd39a270fd0636b58b6f64ab3c8b5c818ef4f343ad1001314486ce47548356082f1750f98c477c065eee02360cb8a8feb87679c8f34cc34428bb593cb572ec2e3c5fc079b8d8484d324cb761c7f8f254954a207732537b90f84286a12bc8c915465a9fd6f613c8a27ce439d681f72bef324315df2801df0b2fadfbf76b852c3fb75f2f849062771bac1de42341ebe9aaef3d085d071ad82ce3feb304fa40f89fc7b62588e534b086bc4c4f81870f285a210830240a011367f1057f2632c8d39391562d14de0de1fb0fc77edb794312515e965766f4409c82def498fffe6e0a2733e10fb1506eacd779f2af8aec4cac2fddcd2dd89236102f923686b562112dde2c7fd06eb38cff7a68bac401f274b38f478f91ade550da3e7bff13fd9a7ea60107710463541ddbc0e6c34805ec60f1efe7245db925c568b6ebe1c111fa4a828d9e018b8e30b811aacbd455e0b5cf248fa0aef3d46bc57100ce881a82841c14bb1c8ebebb205bb96d16f406e0525c0911075e2a96901b556de1ac97445a424ee837d0cb7f87a3daf9ea08528ef3e339b45f301523a5c1cf901276ea4d4dac4ef872aed51e2d338e5a347a49b4b40a86ae4f8c5137f2e9482ae42a4fbe1e612ec14dc564493dcf86f6a39897028d03ac3de92d9b9a81cafc8b0fc403fb644fb55060145845715ec66e2202383e0fc99c4dc8c28bea441b1fc9e599326be7b9d353787add0d44634c82326fec2efd04ce1e1d5ffd0e1d990ada57a4ea3261e44c2cf36fc0779f8bd1ca0d157636a3ef40855889c098f66d80a49d6e4486c4dc6cbbe922040b8158427f210741df0dc4a3dcb8d50fe1066aa99f1d55a295381b8bf66ee1487b55b34d053d1fd5be519bafb8751a3d51e21264c1e6852924029c3cfaff5be9508dab2b013c08714d60f90a5e04610c36bff8acb36435383d23978f19f6d2f465fed7c8302016526c25bb04dd1b2bf76e78eb9303b95efeca4d37dacd896d5b3ab1b064263e65d6c4b9eefd5b532bbcf20ec9b7ccd7d27dc89b3ac33a71dddfa3b50fd8afd10e57374f22e18b9d21ed2f2b1233e655ae8dba831234f987abef56a5bb3e91c32009c2a6ab0dd03c8961205376d7bc4a47be7f0eeb5cf755743de285d0338e7beb31feac9dc5ddc8c21ffc6a960133abfe9bf0494fe001a7ce15f4baa11f535bd6c1e279a8750e0508bf3fb391501e14ed883f76cc9a5e08e6b97f463631936b3ae4ee2182c7af335750a494ebe2755894e073ec389452611984fa90a0edfe7d8a7a3f221459344481e1353efec7bcf70c41f02261079446cba7646a1665e2229ddca1bb04986e4442745b0972220559f066c87222973ac4e22b5b8867f615204d111b3fd95353e95fc6615894801a8804699580d33f27f49bb0d097f798d32f578c81e228f5cf05fe28326e16f238517cc8fec6d45813681dd31d4a8bd506625b3cd9c4f0405a14cacb35e9b9197ff9db15cbc87084299aeba43222574f5bb3de2e275990e6c9ad383864c54b299059a3cc655debd367e6baf12ca37629ecc8d6d3cb0adcf65ceb496cd4f3418600ace63e66ec65495249992c6a8e97d9c4b36cc9204618991d91dd7cfa2f80fae5e32a522b4cbd7b0f10599247a4ef4c0d6968eb519f150c12144c8f4eadff3b4bfb70575f4bed373305a43a9ff51b3117b205d10aa537a802e6b9669cbd2447029cb48363067e162318e7fb3f814ff65d54c687c2671fa4cbb8c425d29e4cd463bbd256df5d83f5c2ee30c22a62e7143cfccd1f0894c68b1c9d57ea322e77caf7b9f33c79e66700d9361870adf2bbaf4f64bca843eae4f51e1f6cad2d44acc1cd640ea12fd60be3fc14d9c2852be040cebe1433d06aa31bf01142da74d124eb932fc2f5dd41aaecbe7ca47b1e43e318d9e63bb1cd0eb7ad4b0d2ec47c9feb4e88e30737c918de8647e3c5cb619c93df33b4aa3fe8ed24341b2df4c2b3bb3be1a0aff442257ab55914545131ea5c8d8a7334678e2206f60f817ebc280549e16dbbb73a1e29d506635af8c81ee9d680aca84dfc345e35113a6888758ef5c777b47ffd0ef683ef43bfa8ffe46fba05f687f6817fa1fad85ee47abd173daee17b40ffd0ded43bba3ffd0efe83fda1bed837ea1fda15be87eb415fafed56bb8fd122d26c47453f2ed86abeffaf6d32956f234164c6827f7b4e36facb04ff3b9340a63fe63eb531e42a096b7228fa2501245d3997a7252e8218f6fc28beac357e67a01af55974f8a80f92c41aff2fb6687756011b8d9401cc5ec678980d9572c858b48e07498458517a946e71a591e2a582d527c1ca993ec188531b47702a15783137288213bfe932e1904a6269b1aa1ca8e618a9b9d320450495df1d4d55371e93cf72e22d107f3ccb433b7d6993ca98861d7976f9c7ecf63a25792fc6852110b6ebd1157be54d67351531bc2f61aa50a798a03809afa122c0f9b57aaee174d828b1e0cbfa5184c6cefb286a8e1e297fde4e3c4b21e8c942c19d1a0a2d429f8b8ddaba820f24344365a1df295711ab304c93fc15b4148cc9efd3fe985c5226c5ae2c7596bf4cdc324f87ee4206222686aba08384ee77af11fd42e82fa6e849d3d72d282a93f75dd88e07f441d419f6b2506ca83b42b5969179208a806ba1461f3659ffa90447028514e03fc0c6a125cd765131f4a7494257e6e39f05e9cd0593d661fc29f345ea588c948c112ae8f0f2d1c9f9a10b0dd9b331bd5ac5ca12271b6073d525213f7e584546ce79254cf6d56ae825eaf6b55650ec9fbdd6c2e2734db1357fe037f34e167c1d561dd69582b59fb2559b33733d1344e4050708828ccd98c60f8efdf0d4bcb893ccd68c51339545778f76c9d217907639729139f5f2fe863690f25587a266674d5897fd1bb10f3e324f7d3b553163d7de7c8421338211aafaf4c93f889172028570eb9463415282f1b345f611e1474748af3042d8d555cef3f7977036bc6ebfb52d26950e05de58c4d3479fae44cc5e4d41ee8c5ecd2db1fb8f15937fde596795b6bd42e519047013f22ddead5deea81dcf55ec5a7604187ece8d90fc08f87d7643dc477d525d7ae2c36304e507b7627ce0cd2eaabbaeb035a238144434b2ac08a1ad00cecc2867f346a6ca078590f2c315be3decfcb819bd74b3caca98b5b2a2f785ebe7a76166d5536f621e3181a353cabf8e244ec1f87444b409368509f26062360fd01dd52e1216f2ea32d06a4c58a9e07d7a0d32765c3936dd774e693728f7904321dae50b2efe2b4f01a6059b917881f8ec981cdd38bb1b9493ecd5c340468ff8a7482dab33b716690568b358c132c3aaac60fc6e541cdebf518ad2943ad9beeeeeb2a4606081f70d2c773b984f903df33b8bfb747e5e1e57fd6c1ec7af381b3ad47f0b432e8c071f608319e88509f7ef48cd65986f50d77afc8793fb4573b87f2dd6145c4161d9c9973fdfd4dccc0c75582dff917c675fbfe45dd8ab26c97a74d46ec7b35088161581ff894282c785db3e86f5d51a81bcde3f3b9d4befd1aa2e8b452dc2343cf84bb64109aae07acefabd5fae1e73f73aedebb18ea47371cc32729c5713ff1fa3d977be1bb6fdff6c688db640ddd0e90b1310663d163f373d5e3d7f74db260b7e8e8fcdc1b8185a16b0436c3aebd123764153afd07f60e270a5c3c942c14bc7741abc36d46221c972f072e5283c012382fc1bd9ec723c9257c884faf7759a2eab86067f5bfca0b799dd82f2024a1ad036b5bfc5637d024e25079654a4754cd3b56ef28f63e891d0075763eaa24133fe79c73a9e8838d21d697665ea4e1523e438e81f4e2f499d4e0d179792639a31b9d8b9f79babca49f9ae9c651afa3374462a1eae1e5184274c30ce578be4448a831e19af9a008baf799e579ea2bd765979e61a93c1090d6334a126855f93ff583af7279b2b334694221bf7f94e835167eb7b8651d515635de1e7ce22186648beaa646ba20c410db3b85561464c9dc78ce40a27c553c582444a6ff0e918a2f6c09d71b4880b88031a4d648e91834a5190be0e854cb1ff33db4072443b579637a0e746cea9c678c904616220a027ba3cdc94b25183f9b8ee441d432fac8c69ebd2e825c7817de30d24bdae0f369da75befddc5fa6fb4a2fc7fed15dde7edc5fd0fd4a2f62af7f8351efb97bbfdccbe4bbdf70fb73bb44ff95be1cf3a1bf7cfb77bba4ff94be88c5efe69fde09efd5a8d7261bfe0f1511d0def8699af2bd227ad557ad5b21c2a007e75dca2d72b0c2853573d96b9270d562a70547e51dcaaceca2cd8f9b1a89ac5133be220f0022864ec2663ca286922fce245f940bd266c2f3a146f790c4631440deef388cb348c1b460c1fba221f3b6ed6e5468ab58a67c9925d6629969555e495f7ad0a2bdc1461fd5e97a3ead74f94910c960b97e97f906bc87ce4122ba381c9523744f2f5c1e4cf36e03cd91d40e939448fe40889965e8035a484e82f1a1fe805223f6ad43a3e151213b365cba26644e51bea28c109c8467a472c27ca4901b03b6dd639d5c3c9d2ee440b5a77c3d212997155333ecc820d0b24ab2443632acb51d6ad97be427b1251ad30773fb84fa3055a18765493e56fc1721882addf0154c9a31220a64bba65ed2c24dc853a2b02bc219854915ae6b863209ef155b6ef118d2aa53cc7d3b2d73d0b16c6886300abf52e8df1ef95be5fc028d8376947f6bf915038268322c3fcd210b98f2926395ac90eb77468a29a053e8b8e3b008d10a924246c5e93917bd1c9aae4531c5bb4e1e1f2faa4aa78ebfcbf91b1382ed89a4602827b3eadfe326e0ab24f798e54c8fcb8d2564bb70a1429c62d9ca0f0115b00a59574f2afbbf38755aeed4e400c65765b740329ec2561d38ffa49ed146044162eca8fb117908e1ef514a19826c24e212f120045e04174e24831950f478972b501c69222bd3ad8c40b6414e1026a0c40f2be15fa97f257c94e7a7bcaf56a2f6a2f68c639b6887cafb55ea47197f4afc57e6dbca59f38d54edb3e084b2746c86c2fcb3391ef3cd0cb6d913b08e779997019dcdb8b9a823ad57d05563b85d1a7ba40effed7eb06d0e7007b7716421e9852ee960799a3c956c92a7214cab978070cad77358662ffc642cdbf4159fa4f7c48573bcef27ca3e9c73daf529bae68b750366f7dbce41e1b9013720d9d14ba70d862baa743f72148a9fc0ba20188741dc4bdbebd99c4d116cf03afb704057ff095c216a115321468d2bc2af149ac4b899c54450e71f6254be851740d3565814237fc898e3cd04f22bad817205bb5d1be195f8b2a913d3aa32ec220ebc8444a05b20d60a96ba138a235d114f9d4aabcc45f776f1521981de82582bb8cd9d108e24473c762a8d32a1dcdbc54b0209340b6245c11a77c2389247e2d189b495d9706f075ee224d02c142b05ffdb09c591568967a7a45526bcbd5d780997409bf02bb2b8b56db67e4c30593858436a6bd359692730a743cfd8528347e228deb5a12ec038b996123962a4b80c2e67d35eb5f733a52f05cebad3b639cc4a79d71380942081cbc104d8a7f49323f4d17a2e84f7c0fce2566802b5c5fad0446a11dba115aa2de64313ab45ac0e5db0b6980f9d682d623ab4c2b5c57ee8e2b588dda109d816f3a111b1456c87be645b64bdac9bc0b43851cdb6c8bdac6983e93891d1b6c83ae45d553a433f644e6d45b5b021d785665b182942d0ea91925342dde97588ca2f89c46dedbdb5ebd0e8525905768913fc0c9e6da9d1b29ed8f497776d15925362099bc64a75907c247d935a862c5498d4266d559d5c1a4bd924d6421675247d935a5d2791c2a43669ab909d1a4bd92456ab93643fc29a8eef3e2269f3f421e6ae11ab6dd1fb6781e1424e5c3e2bbc77fbf6a4b85da8680c5c3def5df497b8ed06b8d7b68544da3e8b72a4b12388de0979f10bc0b374c047c8966cfd388382c7ce66a6025cb41523cfd03d9c21a6b61120ad59a1337596578472aeb86d826a1ced645bfc76aded755b0b7657d6dd7f34e35664ce1884fbd94b14aaf56f3b66b55bacf4151d6b4b37beed56cb3a656fc13873cb09c63ec60da5fb1a2b18289a8e97b1a47491b1888d6f34f1fa47092e1045db43265f3b36967a3a463c307fe07bbeeb3ca935ed6fc57a19b43339d06337b88fbd3959f05234d0e3340a5ee3ef2ddad0eb2fcb9be0c6dacd2aabeae2883ad597a18b05e11c87f2fc417aa2f5d05f700fef385f6a4ffb5b31f72fc609dcf5a1d8d78a94d3788a69291b38fdf04c9a6dfc80b06f73753baa2b61346ecde61fd0f1969f2ef94b8f4a9e3a11571a3b132e575604d2609d204464ef613377d497c1c027375688190a32b05aff7ce661cb12fda76fba05af3ae4d6311f382c1ece1acb4bac4e84baaafb6d1caf0509544f005230f2a4c0b3f6ebf4caa8cb9cd15bb73587cc2bfda88092269c458e826550fd88330a9c15ae812f12a536e4d341ec9fadd1d3436d2756cbffe4f6586ef6e9a1f85d7824f49d61d432137d15f50031d1fb009574d3406fdcf3685928c0fb74ed556444f19d9308697a2ee1a6a4df842c3f7050405048c8f8306f6b7e7c830840f09740334c23454f08416c12df5d593068faa55a00c74bc08de22f7737c08e223da80e63d340207f54807e0223401d1e3acbccc536a4d918908d3dd9cbf67e1b530202b94b9c4938b680c281881dbf9be8882898b0c97fceac2b10de9ee2f5b10bb5c7902e022ee061520d1126d777d63a5954f00fe168958a7f656207a9a94d667254d0a9053e548f031adcd2925c3054b24a0799f0a698dad2b7a50b99342ef144883cbe68de68bbc80f04624760a81e8450609d64231852dc797eb07efc776f18048d2da2c0e82724a3ff5f86517a163ed0522f4c84e5d5e448163542c8967bcbbdc9967b4b299394019808350948098dadf0eb2930ecf1a9d3c9438c710e7b78debd6c9b63ec27f75e61f7c0d475e9349d43fb3863ea1e768afd847b757308e4afc7540ebd34722dd4b6cc70ca39cdd6e573158b53db827dab2edce6f4d61cc6807f8617fc18ab90f29b935f4fe5eb278aaf6f6078fa3ce5f3aa1056bf19e31318f6f8537e49f94bcaaf7ba9ac42dc3cb579ca53170c7bd0d3fdeafdfce69bcf53f9c6e504e6d09a73e87f99bab8cce0542c2d5c4b8b6fb8c5c3f8845bbc4c4f985a7ba98d3a4c26f74e27b73d43c343fcf9c9312aa33eff4218e7aed374e734c0d34be737d44fde654f0627a799e678b187f1c51e2fc6a71c02f953d8e35f9c86d71cda1730764cca731a34f354c190c5b39b6f30763179054ffeb538ca3b79f593574ff97517f0e69469af52d171eedc0351de820243969c432f3ef93dbda4bcf3945f10e515f4fc84c1b0c7634f815e1d95af77e08d97b1d7937fa730877e2f9edf54c7ee55c75e33a691cb26165ee8f1d1a38da1c7e7cc32ca28a30c97461d31bbed443f4aa9e7e510879380e715dc6e3a972894e7a7eaf9e79ecf00bdf7a2ecba00234f9d65899ea79e722438ecf139f36f52ae726e0596485d9ce6b0c5b95ed18c7b353d75d3b9e79d632edd5b42270756b6b8558e724ebd5e1e9e773394f021deb8dc39f5cea96ffe81213701ec9f4f0f0c3bdfb2a704775e7d07ca3d7957a84ef38b7be0cbe79c7b270fed77cef9e69de71b18e23ce53cf3c0d07354f694608f3af62ddf60fff2cd75cf699a032918761927f538d3ec9ecbabe3e69c339fc5ab7b3974c9b425e7cc4f7965c960f8e369e7b9dc2ae77de0391ef4e90ae1e65d98333f95b96b63720a36f52e532e87d573a61702a99466139733b120549e87e939f770fee433360ae51b6a022974d9f3d8b5e66f75f20ebccecde83e8f298c51a81ca6be9a5c3e976f4cbeb929874068e6095c417bce69daf3783da769e95b0ea2fce6de973b30c4f9ce2b3e79d75594c77cf21960ec98ea997fe00cf24f5cbef17648df3c5e1d9e6f8f7254eec01088fc93736088f35eeebc829c9fc0cf6926078638e3a47e73bb859b8b00c87bce6df152207ee7150c71be5a7953f09cf3c058c1f0c76f9e0cb0fd1027f55d0e7ffce6f17abc2693745ad302ce47b773c64bb140c2e789971927f533c81d110b247c7af03a58bea54f3378c243a94ccb3c9559c96c56c6cc42afb698324e914c88207d1893e809bda2d4eb057a4565e20dfa817883bef0c44d0040101d500306956ace2c1373ccaeb1060dc05397580e3a90813ee6118bbd7257a962bc40bc8179c598b0984b972ea923777c03f1c90b2e68203a6002d204cc31192319e9984f403a208a972e3139c5136f74016a6d348a468f59cec6e0e3c3edebac546e70844f123e3ed169f5d94e7df3e4a47e81764a37da148638d363493a2604eed99376f4e9b19bf698339e77aaf7320c3186faec0bf224e9956ca15e498ec6217c47fd0231c65c5095ad1238eca2298d668c742b330b3477b62cf42a37510ff54a7a915c6dd1699abe8ee0701ab98c9a55330f67d14b7a6429153a8498c3b4b9c9e4160cb71c4a4aa451a29a61b4883ef1c77ce20d5a3325a24f5ef4f5baa223a5a44646980d70346a16115cd29ce172ec189a3493aaaba857d27324257a51a289715322a299a4e4dae179cd2a3dbd9281ca22bd9274c92bde90d1c3ea12c28e749a75b3d3ac21318775e93587984373936b1928a7d10ad4a3a53e8da8c709ca20318c169948e03cea1526437f485f3e31c70f72a6baa614821af1d2a3a434f824b8be9d4ab9e2a5d32cba08eb8b1afd2003a5cd0aa751058a3974620ebaa45775c8cb18037519e8ac12f30b8d7926bd9a55a47d890ac911d94b2ee93caa97ff0f91500f513a8b669466499ac19c1e49a4d1558269562f8fea33cf301bbca16eb1557e9936a49196f2e7a58dcf514aa977a4edd37b8234319e102f106f44a779ba7a259728b5e2218143eda9cb323ef6aa957a2539f0721e3be9661a38f7d15ca6e0e4baa7c75b81d8e29ca6bbc8a857b2937a25b71ebd92367a65a567de3c3d7a7a255d02d13656bd8a9987dda348ccd16e2dc62a15e53a46bab55c7549d932e45e4a1c84fe21174a205e7a944b6a17d155a5676652c74897f8ca4bce65688f24adceb9f4588322ae156362945e83b6b67182269e68a289279a68a289277ce003223984b67c5a85c6ee60a05176179ae057486ea452adb0cf3873f2e827445cb7afbb1394168cbf6df4821dd4454673cece67e7f3c3f3e8a33ab268f350fee04d9707917cd2ac9823eeb8f93c473ee6d49b083d84e8009d9e397512a42bedb2f1f2d852a9cbd205f547a4665d5f01f98fea8579bafe09ce60ff1e45d9f40221e69801ff94e880d9c51c5785b1679e7d419dc43ba88352c09b630f2352189188368c19c11eb7440440fed208546e2205e189bf8944bc51bd67104d68244f86f092cca76f34e6119591221dd441b3bbd7bb3caecf1df7de158df91c2829362fd1875dec5b9e91e54c3431a28d4812e1abf7c5623773077d1f489f36ab73a1605389221327d1246a14e88eaf26c6296e036db0af562ad5bdbeb170275026cd18a54b7f3a8937aacb26a209d569b0a4228f649419347d0635007ac386c0a18c335b9277a9bb496022222222a31591258a37aad7e038503e0627cfecc0a6d2aba478a3fad4e2ab7716d184dad3551a376ea45aeb7fd9098e92885239a46fcc3157471e45f5249c468df432a9f3b0b3f82ec75ef1e87c22352b7a53893bba4c3ba33a8de62d81fb807c8c630543bc51e76f59dbeec21f8f73538937ea132c7d4a89df87d3286a463107f6cd679ef1e13432c99be57bfdcb5b0edb877b71eefc03e9d33c837cace356bf994847f922c1d5a88356471dd42ba23903c3249244d5897a3aa67a11235f6bcb2526c79f57a7a9f5f3cfbfcfeb87a751e61709c65cf32c4f50861cfcd63379a5595c7ee17cf3174e47063a8f709e4641d5abce151cb5882684318baf7eadfcc1402aa324d348f68c2db57ba157d5fbe550cc61ca29683947d649856eab00a465592dfa2a69f7a474729707c56806bb77b21ab8575c3714237c37fdc8444a940fadec20a896616ea3f906624e6590614ed3a96699b26ad3322ca55bb01d03a5aa573253eeb114aa6331486b137b35c10662924da557db8b8eba04f491c9d2eb0ff091c911b4f8e9dc95f78f4c968e7ea31cbd0d664e2910bf7a6d5f350b734f09f60dabf246a03d6b0bb6cb7fd1d1dfde0ee4e3f368c76eb0c9648b80f5ea3446faf2421df34a2d9d996fa1ec9b82f47ec99953ebaba71f5f6cc672cd6e690ef8a65dce1778b159dd5caf9a5b4979e4e500eec72ac6d077922dc2842f1ccbd2b6fd6c415b9239a352da7e36a0a19f9fbe1dd9906c4243413f7d7bb219116985db10750de9e0c3ada86848084f657bcdc98fe7e3c14a1f0f95fefd342b7c116a4adb3fa03993297d3cdf6b0aa59ffe15f98c7c41df928fe843f2097d4f7e3a95fd22f442a4f432f4f2e4a763778752ccd1befd6cf4a6707abc136fcc1d7c05d2fc9ac3971b50f949e30a1b7e27e638fdf40c071c56a39f9f5ea5c419cda757a39843feac5dfcf49ac50ce661bde2a763a539a3e56a55aa2cc719a3a4f422f422d42cea2a15c64cc899d80a5f847e7af86285143f3dca99d80a5f9ef89969c8a01257f13bd39091144d789a6920c51b137c49126f4c1073116f4c8ff39bfe52a9d7a466851f8f0453bd7aa93985feeab18918475e7a559a33f5677a35aa48cd8a4ca40cfdf44a65fe8c4c8c5c3f1dd36916cf2caa577e22a9e01a21f910ebf9e915acf9e12809acf1a10a4fb34296a557b342ccc5d7d32c39c6875f919f9468e9a7632ebc98a37dfa0bd22d428ab5460cc32a0c7169064f4c5e1b694508252147bd6a23ad078a83221b32384214fa554149900cf500094a5011448c26a6275d0d57a954733659f273ba6ace39658d99ed4b247ce84d90b0f14092e8b480062210e161871e969a1cf1ed291f7ee0010d56949c80d1ea96a1f1914913224d7428aa47844835e1441956f450840538c8235819143e3a4dcfd83176b254adb5bab0021e98401942154051c2e05982a55a2c0926cdf4d9055a60a15a0c2b72c208254c0429e2043480c10344a69931d2ab66b3ac46051a9a36812a2d76800284259e1cd103122b4630c1d2cc19163099cd6cf6020380c10d433d9872049e325ad9179f35d9014a8d1a3760e962a1d610325dc1dec7263b24f1dcc7263b30f1a1ea239289674e0cc3302bda15ad091d150db04c0c0c0c230e5c810206482c49814286176020810b4388d7505481c20a1457a2e8dc20c33ecbb22c231a52897a2a51914a64c49d0065538993222752cc23b548690abd22cbdc6650a6f82ce36811113785121169000825c0b002a9072fb0e8424a7562c58d59ec4cc02565092420a141ca154a3ba8b24511962b66134b49a8538a611816854b8b62478b82478be205b3434317620821c913202ea4e0811442990daa393fcbb22ccba4a852bc14401d13ab2a7ac1040e824045d291259018418a27a4a862c3322982260ba4152417b084a104cbf44208c3302cab4efc6cb1c48990c5b2c7300cc39cfc681a0d1e3b6a2533074bd605522ec182e0a205317681036983862223ac08010a1d7aa81285934a59966550766acd32ce0b28457449dc1344a23086d0618a2292f8811254b480c273a100c14d914ab6d8d962872b03e94452eb8805527e8038a2ca0a8a40549df460761340d9118661d8173b9a8685e183ea4406b30a6ad3850e2e23968ab058924516d605f18b2084aab5b5d68ac5ab63e28f05c241aa242eb422ea98f8a1cc6351d4313113cab22ccb308c66599665553ccb329ba964bb675996655966c555ab462918489609184938322b15464d8e999c7ac4180d42cfc6248c1660d86990c804497b0191a6fdf494e048f4914915a1c7885e899324944917d915398852892064e62a395f3346934786b2c7a03899e15a98c3348b7e4f914ab01bfa87731418e63cca37fa61ee3b6b734e26cf4d9e4ff73cff50379c4bef7aee39ced4e4f9e7791c7702431c8e9bbe4d67d1e674bac2e62d3e670e533ddb6b999747e79ef7bda0fce6e3fce3a6f7a138ea9e570f9c39ffb9bc2b783ef30bcae70bca39efec0b2aab104d8e3239ca4d9c53ff9c03c39cf939c679a41c976fb0a3f24d8be370df651ceeb17b2d2d73733a537463619993fb264727f7e5904e3a7dcee958103cbd9bc5bfcf6db3a67fbe61ffb813769c3d19e0d509ec9c6b16f0facdf4cf6f9efef9fc320a6b264ed33c0a86394f4ff682b1579dcf0069268b53304c39e6ed995a340c9ebacfa9679473de02de7c1905e47a079e9c05c4384ce5cc64fa9cfb507e1de51c78720a76fe8161ce7b8e0239bfe04d97a90786381c36759e779ed3dc5d0e869c8f1ea91151182105278d88c288285e7abb346a082efce65b8d540a630cd3e510e63b6bb10b9d0ab4d24a2bad2914ae1506070607e6d2c8b1b0a8b853ca5d5a58ae63bf5de727aed6cbe3f3cdafd38e76b4a31dedbebcd1ce51607853bef9ec9c3a866b7ef1fcbbd7431cfa7737872ebc0b5f6f9742a5bccb3729df7060bef30af3a9537752752e2d2c2c2c9d6f1d0beebaad63c1ddd6b9f05e8dafa913ad30286ae30414f2a7c2077ade614aedc4338730a80c038303835d7818ffcebfd6f85ae3bb940a05aa585872885320f6bc138ac53b30e52ca08e14ca05d429e3c0b88003830303a4074812177074210422181c5d0881072c46383775214e586fcd14e3ad2f8fae2bc899bac9e1a452a8ecda682897d476f21616d4e7be7d20e61b06ebf5ceebe7f3f2f0fc730c86a9c798a6befa0786a9a7ddf79dbc734933764a7dab9c07768ec1bac3d4398d7785fb815d0a9c7f218e0ece0b3fcf54907f72138f93d37c73f22edf6c4efd037152a74c5d680b0b2a85f250ded77da8eeda685fa7719bbc3a3e50c3b1e21c02a920adb5bd8e56f0e418dc1ccf1955b53cee555d4d73930ecd14bd7e26937f378740521f4f20c62a9cc3cea39f5c9543cf037152fff9e57c7e6e32b9a9ab9ebf8ecf4f1eef750c7a5e4154f6a40ead73d3d75f41fb795eae9103f2a6acc91a9c14921ebf79b4abf5e3d15570a318bb873d5e1edd0d73e8a5915a6a3914b5d83b8c9d633939f5b0773c36bfde757df1b28e2d5f3f81e186c2f7e4b8c7dd42fb2f5fd6916fee360c86d84f18e537dfa0fccb379ce31cfa38873e0a73d8a525c5924a75a96eeb52ddf67ddc9f9cf68ccf98e927aac3a319774e333df7cfaba3f00c90760ca51f0e7b7ce7b1ab27efc0d094f20e44790ad4713bf73e30ecf1d72bf8f909f49c667e6068aa7e3fefc0fb813a6ef7d5bdea81e18fbf322d01aa9d9728898031b60f83988f1242aded07ad09be60607afbcc3e32223a106afd88607451a535bdb38f8c0642905a3f24111792d6cc47bcec784c8a255c2d19ff013a4259128e3924e6ec9c69dcda26e8831e61849fd60f1b041ffd43839dd60f14880861a535bd411f1109ad1f9189d6cc47bc4807f2328772055708b57e9820c64e900fd9c31840ad1f32428e9c404e4141133c006af9902a48326afde82aadd80c0853328b366ee18591a056835b0f5a3fbaa9111126c4845e863249e8a8c847212a9e207d14aa42c9539e984326f56bc6848143ca93e43589d09ce99880e2048fab255bc855347f1005ca90ab25bd22cd175ad264858c233c519a3352c9e56a496bf238bd62d35bfe509e3953c558fa71d1c039ac492ffd85394397bc1cda2edf1cc625975bae402f5dcbf9f5a14c229424bd2af128091244a8259dfe2c4d8c070302aa4b7326b65a2c1fac28b5b0fae279597f5e7aac39ac2e4ce8a3008060598faca6c9c9d1a81eb379b1bb23732c8b7485768d0c99390970b02762c75b266f900853fea16a1d611dbb2958c7de3a4defa8b641ebf66b2601edc1f36842b74daa1b024f1cbd6a99138e6c11269c3c46b0f4a6940299aa9843078c7de831c907974e1fb143704f1769233109a76762cb2a750b5c316946c1a184011ef2e1c9476fa1e9138619335db58a336c57b360e829830377cc7499f493529b58bf54afa48d0c31de983c19145b6cd6cb0422a58d2dc2c418638c9aa6699a94b4577d1405894a5432924a4a4b4ad28a4b0538647a5583a69ccccbc41b9a14195a3919998e39c17ac88529551dc292ce962c53b60f380c383d729a85f96816a79329111c4a1ef9b3b99ad5ae29755cee70262cc60883ab75c04cca76ad3b85ce9a632eabd5bc73cb6ed95abc361b6702b71a65a75c6b170f1294554049452a4d99d4abcc064c821e39cd926eba612341f4f09c51cd1889b99d31b27a9c310b4840082432203ae6e3c3e8dd3bf0770e7b983cd3ac0d2e2d213f5c888fcc4d59356324a594524abd061c2d9a7f0801d2c2b2102df7f8620262ab82b125ef0ef9f6fb65fe88464064088942258a241cd1f2415dc88f1b4b0ca188265cfc4008a356750cc3300cc3bc061c2d2cff0042c414271003062b30220894968e8ece0e8e56751a66125cad9d5576c5e56aeda85ad569f0965c2e576bc7b6aaebe8d05082926d55a7010248aa56751d1a6219422e570dab56f51a70b46a1642f3119d5fe6ea4706a4fb3ad9b630a773723adf64299dd67cd3bec24d25033b902ae5ab0b02b7a70457af4a1fef547a0f1c41c78a152a5498841165ce120200801a2f3466a85c5a5852a8d387bdee729b49b31956e96c4a9562cfd95335bb276e8fc242af62f539bb7b7614a3cd26cab9c5b6652ec02195b8bbbb7b72796b99a2d59bc1165b7ea4961ea145b283b64e065d0c629065441d84c1f3218767a4543a0843e73dc2849fcc3e12c51c76ce6cce318049642920aebafa6c40e6336f429b932dc98c69df887ad52036458c69e73020d4a51943d42cacc849646150c4557b2fcd998d081b17df75297a1e8671a8ca8f71c05f2b329d42f0d4f16b4573a6638c69867a75d8d78a9ad57185796325c0ae0efada147166f30642768950ed589ba596e5b5614187cb5bb6d8cf1b7730b5b236002be2014f8f154d950ae3d901c737d88a6e0aa7cf324ef2f1d81fc42c3ad881a73e2baa0a4d4aad154adf55ba6a4bf50af3e89f994aae57dd1208f598c707d30ecb32dec0bcc31f4f7dd6495d55a322552acd9abe056d40db11231bd0c7c632561a639b40ce2f4dd3adfae9f405c3727cfb74e60ac620a1904864101432481e89425a91559e10d1f46a68db1aa43eb30bbd8a9d730437b8a3fecc2df42a7a917c7d918fd910476a7c6402041f908a3e320102920fb52426484b5e083d7fe32393205079264857982059894b4fbea3101643df57aa1526572079264b20f9f6a974e4fb0a95202c6935d759ebacb356395d6254524925952950eec430670f31f2fde4dbb728bdea5aab9c951ac97c3d7a15f92194e76952d32bb68a74546b527b95deaeef19e56786c7afe08c1f8054aa242e2e442d2d3f2c2c40a994110af53a9d8abe4f08639f20cf03eabaa27b93384e68db784ca61f4d33b2f69565419426c130a4a3af7911c51cf19fa6ed8f2d629396b49d66c5a497add22c25cb734573d91efb73040e6d52f40eb249b6c81619d923fb63816894e0990f78ebd901b62ecbd32c77307ea6e4208f956679d642abf3ad0df9d65e5a1138b44516e93b4ab3c20e2a426a5698293d95664526570c7d7ba664a559e14cfa2bd20191f51373c4ef5895ea926b8767be7e66093df8760da86762ab1d43d2594fb3620072a81d01801c6247be6be430b3e12587d8926f1a39cc74bebde68722cdea9e8f3f03acf9a1c88fbc353ffcfc60a4594de4e3abc09a1f8cfc00d4b7e6072024cdea147c7c17b0c6074992796b7c920c35ab79f8f82d608dcf1011bd353e44459ad53c1f9f05acf129f2536f8dcf8f9166f50e1f3f05d6f81801c26e8d0f509466b50e1f1f05d6f84431ca6e8d8f514fb33a878f7f026b7c7a5ef6d6f8bc9e34ab877cfc0facf17952a4dd1a9fa225cd6a1c3e3e066b7c9608996e8d8f90cf9166f50d1fdf036b7c8ef8046db7c627c848b3da868fdf81352f2340dcad79013d6956ef7cfc0bd6bc9e14dd5bf32aa2d2ac46c1c7e7c09a1795a4eed6bc929634ab6bf8f81b58f35a22e4dd9a97d09066b5908f6f026b5e4378f0ad79f1146956eb7c7c0dac7915f9f96ecdeb274ab39a868f6fc19a5714a3d3ad7919f534ab4ff0f133b0e6d5f342dd9ad7eb48b33ac8c7a760cdeb4850ead6bc829034ab5d1f1f036b5e4892b0dc9a5792a366c932fe7584d4726b5e48f146fc9ad750b364123efe046b5e432fa277b9352fa27823fe4c6ad6154a8e3eac3c98ef54175db24966d00c226a24a4195483bee79c734e6a29a56efbc748d09ca955926cbd82755443be837abe1b2b52873096439746cca49934adc538ce6b3327fd09e2d4f60914440487f2a7793aa8b33788658c4a8319339a614dcae154a9e48fd663936ad27791edd5b452a557ed33a9e6d02dd373a959b557de3152532aa14f6062d392486955485a99d8e48c2dad189931e690ce39e78c99086ca78ccd78807bf313706c1ecac86c19c794a36c4a942c4381c8125f28e18310a02802195618c99cdb40bc5d3b67eecd76db2c8d4c0d4e36cb321a15ac2862450f074eccd9b647406fefdb7e6bb93cc5b54dd9318156b3d6da8c39165a38faa922e843bb0151051541b44e4a055005031f7debe6a68da73e7120559fb5fa4481cacc387287ba60db5a78b9eae1ab974d7b156d0b6fa29c29aef2a681f3b7c83239e79b766db8090079935bd95adb66ddcd046e20e79c6bd7c6b4c9976eca21f5ea6faf8d9d4e7152b24eafd5a8490f959f3edd35a76088c2d3cfc3049c3c8c7919822fbde3b6540e8cf2d397c10d83f21d3bcea10a8cef5550822175cc35905e1bcdb3e974060e0a3f3d5e2aa7573a677b4d8b64cf12399c111caec74b8c44823994891f89c2b69a51c107b7c91c56981eb0fcf65eb50a73a687ebe6287bcca9492af41394813e921a19198b677a58fbf33d7a66d3755b909933b295e01a92c87636650825be1842892f12b009bdc9b72d9b9c6244b07c9369722db36802e57b6b1e851e15e4dbc3cf24040e4116f437d593c0e1561473d4c0bce6300b8a40025e6e4b04a9609805652f73008466183834400084de00ae1abf65415f5d06f9610084bea5ad09081a6362bf9e87aa98de42ead26ace79bdd8b397bb1ce3cd316e395485fd5cb65a761f6ff20a86f247be248fdc91aea52b4a4911291ac522cec348b4ca3cb4c1e550e5f831eb364656e6d504c6e0e3ed8c61be05fbda60be6d2468a17e2911c99fa5af453106127c26add3748c3730ac07535b214a29a5b2099a33638c2ddb2706e27031564a2b953de42970dc684ec87dc52836319fd89c73561f9f81385cf43927f731fb60f322159e4c616ed28a65564ccb592b34cdb471b3ebbc2b4b7813da3e9494524a295bca6e140bd7a9140b8b64911295f2585a585a5a5a52a8534bcb875b5a5abc96eeb6b4b470636c98b35276ad582629c771de7199148f82e10ae3ef3b7159e698b5343da9cc823ee6f62c88da8fcab67999145a29965915588554050e67519649c9a4c0446963c629884c4ac7d813a4b46699c536a61b01fa36de306ddc8df85eca45a378a333b289ee15c51b356c54bd8a8e7b1537a16fcfa8c0534af074bad54aafe29cdedddded38ab7a2555af2c59f99616d9d29d95ac0db5b136d485c5c5c525853ab9b87cd8c5c5c573e9ae8b8b4b013a53155a2bc6611927637f7a8674c027b61873c8f8802dc61853a1d75aa93492989318986badb572368692c07e178149e95666d26d563d93d2a34d26652665a659e6516db0454983e63f337f8a9ba5b9743ab33073d7ee0ecc35b75747e69ad53133cd64e632a41e1dbb3ba60eea590e69cd37416611b6039603cf662a826588b3093d91106c428fe59b9a6f44b0cd5cca352be25e51ce39fad2b75e498ee34090baad944e4a27e530f082b163b00cf32cbf588f2f6da699b280b31996611816438fd73cfb18f0db9bcc6d6637ee4afbe10adb1ea9644a6360044344485528a9e187491ffda0a4670a25860812c40eba8a16620624129a8a15684144083e4fac8051434b6923130cc107a12d9244410a42cf165a3aee1123a5602f7da05792c6482b56b18ad55a63754a0487f6576fa3b598664a9b930e9033093f1039a24a9114e4808b170f4e58c9321e20442d78a2f400e43d1bd049c50eecdd31bd7a4663b06949b0f44ec558042c9d7a8c31b6ecee8e31c6185f30d0adeafda1099e889ae38c91da916df244f6b1c90e4130337a0d9b43dc7da81282c255388864ac0b51973c126945775e52f1d2c3123e3a00a2035a8826488f457cb87a0a702164b404164570a2492b7a0d552a7a8c3251482bc4314486d0d7ea5cb3aaab6af8175f3deeb44298af3868ae1852755a612cfafad5ea2fa8e0abc73052895594be8671295e71dd50030fad50ea7c95437842f92a92c4571c6a566b8d4d7628d2532b16acbf7e806b738174287a7bdd5a6badd10d92f0010d8aa0c47343cb3ec0001fd6f89b4393bf05f87b73c8e2af0e2ff8eb06b836d73dcff33ce6da782bec3107201e7b01ae0db699e3213c7ce6a9cc6b34cbf3cc7dce44a5cc579fb9cc9cb1c08f901e2b382083085bb4b22622cbe1862c9b19910c6732d9cc8747fc25c0df0bc55f27c0b5b9b8c990173cc6d807706d702adaf810269ef076076fdd22bd752cc45b57390e3378eb2b8bc394b737ace0adc35c1b8be305ef35b9c187f73c237a9812850e54d800258996e702b8365e4642d9b0c5a31cbc36281bacf8ce7ad7759dfb8c5d131b8ebc55c05bf76b63b32ccbbc846b9305e0da7432a71d1dfcc901706d4eb65db023833799dc46aa67645c2e574fcbe435785c2e170d2d30085a1401c41850acd8d032b9940f5330257c68e3b30c85980fe3904e193484f808f1e2b32635e8e0335fa9e03397c1d1acd8040535f8cc699a159becd4f099d7b836d9176d75c0b046de3adee2ad7595751930a0a4e08a2521575cd0b2fe726d2c8d6b633afa4f47c87f3ee3da7c4ba018b1832433a8a20855f410ae1d5ad36bf89489218e1314f16114eae693283fef9cfe82144387496476737a7346277060c10d538e902085a73585f850bec2f850feb834f2f3089eb3090d413cc6aeba363886abb7d65a77b936d6f3b8c47bde726dbc20be739cc4775d078270b4e34303275380d1ea9ce5da7434fe9e6087bf9eba36373e81fab0c64b0b826cf159109dcf1c756d3293e331de64f268f2d3b5317dd7660a3de59078cef1b5e134cd31115ef394e6302b8d0141a2fc000723380083062dad7fb4326ca011d1aca64d8d6a2814b133041247562059d2d2ba055a139710dad70aa395d7e2159dd7343944e6c354194d7c96656578f159a6fa3035e5c31a1ff3d36d125e4990f2938b9fde596baddf6b6305f02632866c4cdbb5d1e87665e937375d9b2dca299e3a1ef2d4533d93b5287598950d191c33f8300ae5d00ae3507c72f4d45fa01ec398944479a846835013bd928337995cbb362616bca6699adb6ba3cdb8f27adb40fcbc42e4e7c4c2891808b10328b4e8418b360b26895e1bca2391de628e55ee62758f79c4bcaf0d4675ae58a9d245da481ff90e1bc9b777923903c455c483153e50010f84e86915e9b089be3d866d2588c7071420c1054565b4c236fa157cd848495de53b6c25532b6c2bb615f695a93387cc9eef59247ef11385c8932635f0c141eb870e67d0b7c77026012264a8878b31c2288202452b9c42efd3e19c51befba542f3c8cc98964fbee55028978412c9909def0f5ba78b0fdbb534819eb12a956abef00118e60c0484a848a2072b28a30851b45e1fc6a56f2b0d2022c6119ac86287072c5aa1dc791fdefb16e60b09229814b1020931f0a255f0ed587ef1c30854785084256e80021d5add836b48b00a73a6055b5b442cdc2c1b5f59b0f4d54fc0a1559d0517e287d1e825959f2fb4a04d812b132c84c39f94a8a46cb695492d15aa190c000000f314002028140c0745a2c160248ef348df0314800e8ca24c6e4e9708b3208941c8186310200600430000202030224334050004dc278f184c74091e1749d97d275e3ec1740cb5a8cf5ed0efc0e5d6f9f8f8484542321e06f6403461d0c4c3e58235c499a304299f252f80fc095a5cf50222e38c2b02287f814c1ff0cbd0e7e62514ddbac7110ef0fe3ed4fe5fc4d0deb0d67ae30a229e56d68ba2e3b70811302941350ec3a1f0b01525b6e9f8ab3dfc47b756fca920c854f9b9a0bb954dbe668032340350f55af296a74ca2edd2d640128776de9f98bd4c29559a779ee830e2f92489c74f75c14e7b37daef808a1555080a15d2e27cae2002613bc4ba4352efd79962006aac914a15619f07f848782a3d8cb167f02f138a93c33b750f59de99888ac05d2a1e9ab3e737a2a999185419016888ae130569b075e3836b44c4328520b62dd22653aa7fd724df0557a53295af932c7bb458067d5bca7cfa565dbb80f081c029b66b06de2271bad7bf18408bcbb055b5e6aca5d89396285e97b13ce5b25731e6f6be6a574969cd6e54feda99633531095e0962514ed0274476d1537391ec027486f3d89b4812f29cc954b2a2133666baa7ad4a6dd84f62249b18efd9592cea73ea94607ecfc2b7e3d12421bfb6a0dddbe9df34518945fe9ef14da48cec1ee521f819d5acbea710cfa184df39895d4be011a2f151706970d5534bb44c9fcc13c3fc6ecb330165ad83ec3c509ee440019f179c33dcc30bf43898eba5f4c0245aad0d2bead9416792a9a59d3cf706d4960a9d3fdf6830f2fb2c1515bb087494bb6c0903b9682413fd1e3f5302b7d2915fcacd77f65ba70f3bf47d083a47517f6569f6146b1dc0e04baba6469473d7429b5fbcd470f0e39d9ebe26a9d1aed063e2e0ac64c1324e17ed51bc10f397026a5872e4f8942f192ce13b65d835a5cafbf0de5aa9d24934d29a7cce05c28887db894c7a0201df56a7d5ba0899610e58411ab184c2b6f4fe9366690e577b5a209633e10be3b6799c96124ce047839163758797c71f8d025fd7c2f061afa9846e7abb19c7ff0fa6e7b1a83deaad53ac020d83e8e0bf6a720a36944a33c89d3690fda607981ba76984355bfc354bd224cc2caa2fb1b30d02997f795319c6c8c9bab191f227208aa05012ef255f0b2d681d351f57151e53740407419e4a018758ff9a0b402377b2672d2442ed81825641582d7d0018232b1ceab2fd32afde16b8fe2f45a48e038fb1fb7b209dacf6cd45a7d5f5b389310adefb0161ecfb69fea86a4866c614c8f47038a831f31ca32747d07c852ef26d524a04daf42d740198ce749252c47abceca0ad893ef13177fd617aad7fb4d80580d62f29709593a24c720612dd939e4c646e2af3f62979f0dfefda226429716556a6cce3e2947cfaeb1e1be379ccfa8bd4c884d8d0f51b6414427d6c233b2d02d1cfe3043c55d9c7d6e59fb65caad9457811dee11fcd31ce462a376bd79b32ea883cab2faa1e2c8c879c71775147ff1e61907cc3ca507586f48158cae5ceeb4e1231900384025f984baf6b126842a01bd8808d1772a8b7f016f59cd150ba0bfe4015a381cfbbee1e81866eed4f8a273aa9c05fdbd4f4d34f8a02e5a1f90228c314f09d51ac43cb0e21dc098668948f1cf698e6012717bba49e40f5723223726fa325a2e633cde63bdf85d7c44ea1af524dd4207c9149188d210422791a2542055e4742eda8edf6440b52bf3c717b156a3d95897c469583a990bd2d261aa7107408303a01a20308f61726e8bb3deebd7f607799be402bf7aaec39a9b97aa64e9f492db881508917d6de45b32cce8178953563c3f224d9609c3630af2d5df19ab68d210372354d719e617fc0c9671c19670fe1d9213d5f7c063a51d9188442cf7a8e236f430a043bcc38e8085da1f140e7c22bdbd9bcf231b46f654c06daac3acb2ecff1a0f159e067c1805478523c0c92b113b9f4a1d2bd76f65893ac5f9b7c6d6a69a3504963e1950d5bb8bd19245f007ce5a514adbc6de433573d700d8a8b0118908453e1c70801243321f3caee77271ffb3bae1d0cbb180eee2e9760f815cbdd640879321c7eab1c90527807e3ef3118d4065c3a91b23acaf11a7c6d60e7eaaa367457fb02eeff7df132d3207d9b2aca0c9c6039bf21cea830436b8a9a3942e6a8e2714b6458ff0a185a9c8660e72b6166c39eedefffa34f4ea07b12b538aa859a10feda69ac8ce50a3c5e31a8fda1cbcc34d72312ae3752fa8340dade1ae6858e54fa21c17558b6c9a0fe67ebabac7024ca72b10420f50c7416729defc1e0de214a1793cc9641be3290b744d8a4c0cca241050913b73b1e454ff1dcef35db2f4010ffeaa3d9d2fdfc770b0d48ca95c6a83f2bdbd1d9932893ca814b02b5db6db13e10ff32aad3fe57dc4744b1c50c731dd6d702861d4295a65aa6f54fcd46d1ca09d884e7f63b6977ade141183be33e4e2db6246c935464966c94b1eb33ce18bac7addbc26cd322d5a8d0bee79d035df623515390c2d9dbb1269072180cb6664013b2a2b9a8e51593535100463be7908bf4aafd902aa028dee28b9cd0b6dbb0d66d8282256a54b7b38449d997d235f4a2592c8dcf3f6a22da9e676fc94c47f22fae3f51cd0ca415595717c6627c80e854a2b63d4ca04fe99bbd9a1c15f9247a334b074589a24a8a9af39c42bed5650ee1f66714a5dbd678e4d26771a42928ac2e11940928038c018f7eb26f7c415bf6128c315d4f1a0baa04b455308296ac946b18b1dac75c43c9099f9d9e944528b45dde70b1c290346e541fb602f8131c3ee912ef05e4ab7d437255cdd2e9ae11f836060528fef69146449de0f0562531c2e03a5005cca3890d88ebea4fd4283de21486fcfa41d421efd43d9d5277a251359e4e8f35ba5906e91a31864de0c79fc804bcb6660e016f1cc0a61a8b00e9203c60b4939e5469d4f2d260f6073e860dba88209eeb4ba277a4d82c2b31c3f5cb8825440c013a622abb0019528559f301eb53a7f76ab9a7295c3efbc840d134097f5f3c3c3b87fe18fe1aa56f519865ab92c9fd9aa8ab0ada71ba86358ea3dcaef4fbaccb5bde97c00f645fd22c3772a1b2f710bee272ed90b1d78e7a148ec32af224fe51d673996439418a94120e5ed16112c47c91e188cbd3af28d68c1250406f3c7802b970d6b235914b5832095f882258d102cf35e001a860eace0d66db57a52827bcb5b084cf9d6d3a82a2abfb4b1d208cad654f6261092d1558259a69deb6e7b3a783e909af567116f887a3e1c02784c01cf743b127e194b855e26e19595f1b58e4f14728e1328e0dcd8b8f6683371c0489b086b3851b4608e6dc35bc838416fdbd412a888aad01f8967ca8be88adf274ab2efaa29b373c136271bbfa20870a2a8f89ffc029e528d6526bf2ea1c2168da3a426cff7547881aa654be6731345cceffb9a0533bc6d92ed8efd3019d46cd64ac92b03cdef11484de021fa04dc353a09ed14e36b1864ec6511598466c0e349c778eb64a06252e36f01a401113e5da6234be09644a4e456fa78cbde5dc8b63c124309565aa875dd6b50acce5460af8a1a52e0ea5d335a8884819a8201540f1b28e7c1d1ad2c5d3b63b6e42ace408177f3a7a8eae06356e0185bdbc4dddd3445e7e4b9f5242b5be474f8e886970b495ce5cc80d3056cd6afffb2fe4f4635e1a24ac63a30793942d8395f1d3d69a76e8bff9027b77b7955b2e19bf8a14a94343a5952098e0f2c5470799556c6e5dc4d379a87dde6f0871fc9bf50328e436f31f4487b8a99cff6a4b51d400a6793e37d5434e076e39f48fbea9c900128eebf54ddc49e6ab3fd3fe325feb2d4669632fb92a72636eb3a0de3d051ff4a0857fff059463d7fcf9d6cc1afb22707fa713dc4e072515ed1f8c6391cb7574916bea1273c84531795c0628cbc9a6ec90a2824848998e84f7972eb408dfb3259135847a6ba4a68b271c30537e08aba05fc0ca61b5139fc1921ec1a5fb50696fe71f16decac5fc8ffe661fb21adb0e500a91dfc5c714566e0b5e84562f98ae81f068c45872d0c51a14b90aaac37f3372d55baf11969b8424aee08bec0557c6b0f8cac96e5678c74be8ede86ce99b41fc62d0d76939693a650394a6a50e1b66b84803cca2f974e8a43d5af07a50a8d08e6adae6061f3027d8003904c77932c1e86033d99eee5caaee8cc7dc342047d692b1da66062b2667eb50311c2968e0436c1440105784dfcc7e4cae0b3da3c78cd847ed35696be3712288fdf4c45b94356b935ab7b9c859d92c627028181fae577fdfcf8fc3d2fc8711d36be396f48dec082da30bc33fda280efa2ad762c3d2ac9acd0738b438c09de3a5b0dd954e4f0824fad9842b30cdf71d6fb5ec54b8ea2c2257b63e7fa96e09dd1fc5861f619ac870c65058cfaa3a1705b8feff7fe181c4ebf2fb1470c6f34e0fd77d0ed33821873842a85b8ff91739b517d33ed11a81a32788ac2ab76cec969c21355d422d19d785d9df9ce36c3c8bdc50c76846708558f5aee988b35cc8e1bf1667fd514e0a2e6f13fc778049a137b1727166137c07416e79b6c0be9c9825b56062fd1d5fdc8fb4bbdf61cc0a09e2fdbde189b721389f23ed3f3e52cc283d92d387750a2389f03b9ad5a7c3951352d64e94950098bf14237912882e6a24f633ae17fb7114a768f047b996ae460824fce9adb6ace037b1fab4d130e485669adac62593c809e8673917e693c63d2f30dc9757226c2105242b6a8d558aba8a2dc66ac93b6ff945b2b28740652fbb0232cbfb300eaa2a2dc7803b0eb1552de32030d650639601cabe890ac222131998037e4ec2bea00c531e336f225a6907549ead240933074a4ab1a1e026a8976c941aefdd7394525c47a990bb3965ac91fd1ce750c7761890d757a912e4aace4d27d23758597621679775e23724652119c6b910bf52f30015773d489e2e2ec4ef3afe50f576f07eb2c38544db5a73f72e08f205411d209094716877282714d84232a9ad8388fc3eddad3e34d783990b8c7fae7a2c6d2a55c4a5c7ef3a4cce1abd17b4efc1ca4a9bfc5bef9323efd95e7ff0bd42af93998c0212503b3b2d3c00187bdcfa6f056a6e74128808b0b098f6cbb372bd6517cf51ab52fa5c3920f302ccc226458b561620f7172b8f11e5a1062fd613c110f31a60107f2bef79d8a2b5fb99bcd5b8053298bcb1620519a9fe3c4a067a154024546c92e88bdbbdc5ea68b6ee0c74f493502fc6e178db81df302bac03441c86c6e8406f51552a0806b363a1beed5307aa19c07d11242acd71534c4c6c4558b75e3d7acd416ec5238b8edbe966daa17d86a851936382917156656b61ddc38ba4490e2b3f3747866cc102aa15503d3bad21fc052192043c362b18d5b6b128aeb51ca0778c3ea842de4b93967f36b40e980ccc3dbf6755e6127bb48c109fc4d584dfa701b328eacff63f7d25feee73895c3f0cfec60512f9e5712e2a9b6fa9e64e258c2ea4985cc860cf1cedb3ba0e0bcb2f0603bb7a461313643617bd1bfbe4fc10d7ac5311352e092abac633ef66f196d3fb0cc3b600434be5ad653080e38bec466cc19ec9db66c0d8b6be99818993e6a216bb4bc10e32829417d0e3dd5b498301564e9ea4ba5efc5238ab4aa91cb098f4739adb7d58f0407ce63ad83b9939a14339365edc964b375a2fa2e2ac6a2ffd891c74cdc1f568aad7eb9389febd4e72a8f411f7adf99296900af67ee75ba894fc86b00022182a7c9c2a1ab692b3e0dd1f204bdc1c30a29d7d2fb0d83e8aca912fa686300fcd0d33d70a48db0675622b2e513b9fa989c14db4a65009b2dafe7dbc3864384aafee22bdbce1499ccf2d11c1568db0d01925fe609612a4ec829b877215fa09a4de0e510eb448ee4734f4479aefb5ba12c3e8f7e7410bd8244d30fc081407c74ff98e550b04f9716ffde6e22010cb07261617535a4896faeda2058ab9b6b83502204cf2306217e85ed2c9155519bcb31570ee30594bd7603eecbc6ba0c91ebba206f497739d04f1e55f21b7db9ff427bb7b2531139afa3e5ac979859e4b408f06803f8338d607c73a5eec4d93496ecb450468960f61910fd3735a633e192651d166a65af2d70734b4b69666f3d7f125eb187518c3872ac7d1076781796aacf5132159a8232b59946fe8ded11ee338c747b0e082ce264e51f00448fa46bf53e40da4fd4e2d9d65e51d2e90f2e68a42db6aa59da9c8bcad2ef65e157cce4a014df29c4860fe2752c7a035fc4466776154d2a04cb5e7da3a50b6ceee0a550a2e280008e92929848e475a6df074027c02c6100d100c00dfdeba8d3520387e1da2c0722178fbaa9a5856aee6a7ff2968b37931560d2d5bc8c33dd14647fbbdeef56429c1edc72a6d71fd19a29a20c226fe3aadbbf9c4dcfdcbc935bbd6ba4f625147226cabb262bc4c6724960ea3f5863b0ecd4aaa4cd2ae18f84278876c47da6ca34815e7246663db62947ae25944a2fc468cc4e5d1961d31d6b4aef5849e9ef6095b9e79d5127fa9f631ca3cee5f2cbf38515a57b148fda77cfec6b97499affb9c27973ba02c73deb9c485b6195ce47b7404fcebd9722d72022bb34c0615c249c4a28a9900dce80f82b73fde2e9a9ca0c66f99d84776743b4f0331e16273350a62f1aed665a7be2ecadaf678ad35270d69b399d0bb835e6004e62cccb84d848a44aa8bba994b62650a1f3f1a27ee2f12af9312eb5fd27e46cc82010f27d55f85786559809cf7d664ae80f81418c07b3335774dc51c8b347ed1e25cc3278b8efbf6c92e35bda18f338747ee2235b2caa8b23c4c60cdd760223b35323553d071b20d818237776198bc59af0975f08db7e0772a8fcd04c5c28797e607bb77f83f3a454ec0ef925e970ed86cbe992298e7d1c8f39d5964f7c977dc1abb9cec28d48860fe13645acdb1cd03aada6b9801b693e167439b0b5e19708232c2c78bb1c7b82062e5d65e1fa9aa28145fc79a98d48ee782d307315b2b93b3dc3d7ce32c3ece2e220e25293217441d8d229a647cee79198e5467fc00ccdd66379bf21949f4568ba81f6b5d307980d610adf930515da92541a5f660b3aeefe1c37d4d9587616aa89914b53b74a555ff667e3c0c15629f4da3ffcde461164feb28188287e312ea4884d1b8b1e2aca204aa95ca0e8147b644624b5b576bd9fff90f0b65724da452b7e417cd2065794368faac1b5d9bd0736b286a018051397dbf4943a59439e10f79550ebaebd1a37cb7d21c844727d0889c661c4d778ea722ccba0615ae0bef27390aebeeac037d17721a67a2a2428ba3a9aa86cd218a1f68909f373e7a5ef964543597f0784408f79c97844104aff1485651a5f4bec815d0c29078ac03951ec4a12cb9f46da1bd0a9334099c595bafdf34818a4ba85411d50fdc5068c9c3f1f13084c871e1e0dd46b00e8532079493c22f4266fa18b12dd397ff6c2a5524f8ea6b2d67906262cca53c895a35165480cf01274945aa553b6fa0868fe6b551c443ef3a016634e3352df3093fb7139b7976ea9057aad2f2599923372cd91b593b8d67725778824386927ae61f60268639978009b99bcda0fa3b3dbd64577f8d9f0cd94a84f6ee1bfc1ff277786999569308908c7a5791e45097d392d1495323612b645879a3484cdecf25e732b949e0b35b6f52b672c4c8f24a9084c3634f6423eca669cb653ef34512ae5f0af97d1423dab5c2c4324e1506b8bb60b4a153738e88b752edd59c8ec3da15c54d60862cee186dc3455db6e84af04098c1fb458625482a5373664013da52266905193ae37b69ee6fb50df88c0b7e4cab4b7fcfdc62956070b3211a051f2008e87eaf1cd462aac90229075ef92d57898bdc49263aa019ee59d25f8e16ceccd55d02df3df3f10b47322593ee37418b796089f36d4e165e469cb7e25903326a8eac41e2edbccbf7dfa1c5e427981f97354c5dab44ad5e77fca0213ae7edef5516737a4e5ab4ec665adad0bc24506d8e5e29988161e2c76a639f541b48fe7d8074c7d27dd432671fab838d5241c77ff2ca78acce1c1fc8924a1608fc5be70cd369696156de723e2682d67b507e38a35db39802f4c2ed8b1c1535ccf3d935f66057a4756116d3db0cb7a318c182c4080c51e863eedc06a5f52d387aee2a9f556dac2bd76cccd23b5ced69e6690b0c2981c9294204cee3a4c095c48119045999cd322c3bd69381b9a7f1952d6bebba46b03ac61eab04bfa6b11f3e4d961d39405f15d8788e2e83692c94308a77748b4f240caabce6eea25754522bfdd97ba01d213ffa96097b98e05b0d3b121364083ebeb0a221471cc0cff8dbbf41851dee3c7e0b398586c4aa6da4af018e5a7f4c7ce4f42b30185915bd735bb589414511d0e24da08273f9c76b1446442c4661366cd4722190221e9d34f2c90903227a0c33e7458f496b084297fbdff6d45b489a12e5f5419b2f1cd787e89c8504c1de36e2298357bbad6e1244dbde08ecdd517f878cbe14e2f0929f0290f5004642f45289a7f47363cda98a346da0590b0aad62572c2f0f711c624d2b3162bd1419d67c1fef2435ca4289206f119538a427e40c1b900d0858b0863d07818d458cda63d52a7510a6936a6384a3f04836b0b4c337639a399dd278fdb8bdde5b6c7380447771971dac620b6267611249027b09bdfe5834a3a1a0c08ac8780df6368b46292aae8a920840dc43b94b08a5f25c73272321eb09eddcda5c02833b561df0a70f2d68cc7bced6e757358d13a84ab35efeb21f54a79dc4a55df0ab7e73f23c80bd9674a1abd74fd51fb5753f4b55ee2dac84d4a72a59fec43271e2cbbf75bcc3896c4485f11181f19cf86738b3dc861f20817871056a686618f61a30d27fee82d34ab099faed159ac0dbfbcbbb983121aa6c398b5cce4ad8d22c9b87e1f3f9217c43fa76251994031162c5ceadff9c7d6cbf8653193f0f8ceea29a31acb3ff743ed85088e0b770a00918728291dc3e4d381dd4830b9a141c748e044a559eccc06a6e0b7b293c963371bd36b0705a5b1c7aac488b8f0abc6127b6836da489d3a57080afcc82ccd509727c0501f1e35225061c53177054eaf24167b347f2fe9c41fe98c521736c5df915800ff7caf998859e20efcf029c1cdc2c378712157c2129e3df52404105cecb6cab4a20ec40facfaf90548b8465817655344ec76454c2fe374fbee2819e65e4052fcb16759091fb2df5127696e539db8c03a1fa134c294e439eebdf8b100c4dd081d215ff236ef46f9ac1dd4e43457d8bb8ab14d2c33d51b3f5fb9b14b56331dc4892ab918c04c1da0b9d8e232f52a4d9d842389a58cf918ff187c59c532aec5983552b7f63013b5e0f4452901a0cc17f7b9f78fe16a2ed5624d59cdc81a7d8c913052f1a5aaef4c3bab5d6ab612aead8c3b5a5e9e7d67e6359cf66bf43464bf211c96796ef2919c49d94cf18c18148310544f06c8045c8d4c7febea1a494f90b4957d8af19ee5d7fd0f11562d7ec8f85f101373441e9f94c3fcbfacf538c1312c73856ecd4815a05a2a1114fe8f03edc8e25d3a5000c36b03832b5e56c12247dbb744bef9f715081a1d1ec8152781977b58808dc68dfa0393fe8f8fc2b852f842313cba64589dfa65e1d01f5d36ccbc549ca25ab27ce114329fafb3647b539e09c106fbf421f72baa4aa6996ee32dc5d7696499d621586f3b910ab92b79bbe44ddd35861d6bf481c1128e4cbdf87f577b0eefd2cbc8bc5efb1eafd2cbd8fe5efb0eefd2cbc8fd5efb0ecfdacbd8fd5efb10ede2fdc53ab94db54608595d1f811c91d5512d7501bc5010729303e4a3d5483b16153f34da02a4e2612689e48b3caf0199b9fba6108a77cb318abfcb36f3f86b0cfb7c5c3f73dc7094725ed2288b91dd6b5b51198d8ecfdd8fcc89ec7575165cebe3c62b6e1973433ee894daee4355615a8cde6d70c85c5ea31b1202dd8cb988ee362c6c541f82f6c68c7e7d555355ce6762b328e56a90978c209cc290f77cbcade10e2a7f9fd6f61099582ffa6cb0d22ba01dbe6764c3a76afaedc6027a55ed2a45b9892f8ccb5d7a80c0aa1704530be32de26b85c3a3435fff9cfb6055d590eb5de7977e4f8fdd39fb599e04b32d035a84aadd70cf93569b93924c2e39e9038033bfb4556b911d21d9542f18c242dbc5038f6d24a312ff681b5e98b9c48bac5e7f73d6e56311a8981ec57ee86beb094ee68a255e7adb4ae2b9ff77676287f3f510434b01a3954d4e9f3354809dfb308a8241cac8f7459215c68933652b0d89ed822ecd15dea1d1f2ff246f7fe5a17520f024fbef336f675e5f5ca7137fb65febbd57b77bc3bd723f49d46e051676cf745f07c6e6b78a756cd357ef39d6d1ad1ef44c3ca48485e88bb9f15d0f52a8a62b2ac369781a7e3f441726ab906f5268da330de27d22747462b57b5782a5d7bf367743cbccf715694c841d6c0a2e2ff39a82093d12895e3fc1066ea19dff1ac27e0f2249bab8fedaa50c950f37b0a1242c8b9e06ca57d18592497f0460e6fa2272fa010238836acf41c80b9b46b920fbc239616a8b39ece484f96a925bba982962193e2e26521beff03c439a807335fb88318c070c40c1be60c08d9908f210f971e5affa30dc3b6c20781355242d9bedeef3dd7873895d39245c06de473d176c4b88d6c53a93ac59213f1b8a6258e5fbe2bc76530845992ca8883b80356505d0d26079e86431c596c9e29b2f0b212370862dd70d2462113f1196b30687adf7be58d4602d23e23272e17da1d1a2a3d422dd5d59da1d97d561e2062ce09ab51549fae15bbb8d33f42fb91c27877a586a9a4c3f183110d665f5c598121779fb4cf10d6ecc4eb82c677e8e6dcf950e9cdda07388137ba4641157d4741eb94b2fe4992b8d3b083931faf93469a2e87b3b08680ce38c21ba5975c84b21ac0fd14d0b0f79d23d3901c0b5ea6a9355de7cf1474162684f55d42cf39f4cce81c80d26f764ea3280bbf63bad0bda334e7cbbdb672920d932c638ee358cdb4f1082fc340eb5e1f6146fd773bb8ccdad3b35008cacdbbd8c6291b756420fb5c01f0479e7888c26aefa30e515c6c3193d4bd0803b6d08cda456cde71f4613e234343bcb44af896c6132d8cbce4915928880618503849475fcdb4c3cb75555896df8124b0e4ae3b24036ef257407923347c94e2dbeeb262e903e67b8d1686f8f514b3fe1ff983a47116e1452fe87b877bc496aab0e79414762e487987ad12fa1a398b65d2bb2c615409c1f05dd5783d79012fe1203e62845f06b2aea7ad50889f75bc353ad1a0fa09128da588499e989befa3781a975ed8d4c1d06fbc37cf97bc1cfbc09d11532121d175ad06ebab756634b38b833477ae0c93757868a417c0abf0d0ce5760ef9aa5eb7dce0496adc9a10e6377cdfc1240fc8f874ddbe6b3ef73ee79dbb3d08fd1a08e2015f94bca214572dffce44204531fdbf90a3ba103a4c805b38cb2e5ef8142e06f59cc1d6de81a538606db39b6b6734d5b11b6cd6f81f834cc77c5e28b8f2dde14a0dabef1dad26924ab9ca2790c230d518afeddf583fce77dd255130683f5c76d4acfb008939801f06759b69252db249b19fb61410090f221e0df5a3b3ce23e4a7542a321950b4831028e85c1eaf49cca4c221264a0eb15472aacd537c9f4f89889f1c7c4d6f2e7cb6ca3b0a85ae39822c294d7adb71c7abae3637a20b2ef8bec5734fde74b2fe8176c754af3429ff0823e62c3d3345ff48817683b363d5df348bf7c403365eb539abef485ce81b066e8a76ade29c409cc4103f4a1ff51435dc0dab44c7b7aa75ae51df059cb7a53f0ab2d5f805bb6543705d7dad20df8714b39164f766796b79382645f6fdfa4b691cf947ee9e8926fd443c9f719f199c93fe175e2cc47509fe7f6f779110dd76089052ae3236af32c16507f6562279275ebf676b088aa352991f8b14fdd8ab23b5d6723fefca63c8da9ec5cdfbbcbebdf75830a73b19436e236416ecdfebfd0927e8447430e124810a0fee91a07963c279180422c8ccebcffee8961bda925a0638e1beb9fbe902db723413113fafa739f6ae30ccaa7a8f7ddd0ed91327b33dd2e5329c77bc02c9c98249a9a4925b857fba56836128478979f33e127a20f56b57f761488db8aacf8eb54625de275fda3acbbc9518a1826e85a9971a5eaf5f5f203fa5ebd6e51d9ed1a15fc6e51c5e916559c6e51c5e916559c6e51c5e98e5afe80dfa3a323aa7abba29abb33aa3abaa39aa723aa793aa29aa723aa793aa29aa723aa793a41847eedeb1a792c888f78ddb9c1310693b9c041a77632560fd19dc3d0a666b3df924033b8ce08cf24f775461ed19ad04e5500bf19d5a98059ecd6b3065f1923a34b2af0a4a86600763b1eb9a5d21ef210c14c2399a92f4b64205019a064bdcfd555a7fdf78a141bc26d8e86d86f156431b37aace89c1e2af8dd88d481014eee6b4368efe66b86996d8546a160db789173a6e6171a8cd99753db07249a9d4077d6637fbf423bc37262ddb040610369ac18404ca3cad0b0eaa7944b0081970702e13dd5e6cc474e1f4d7839a897ded1c12ea0d06248d0e8e0797294533934d9835087ab3ffdf72e4b90423a1fbac44b690ffc31cdba97712600bbc0f992352954783a7b5513cf6d6ed87b31fea553ade14f32b0ce7531f9684b1582d012bb82a12187809875c305bf4b651660e788c5942e9ad26958ca60aa3d96888153c5afaf35538fb0b17274f57492aac7c7d6ef19fbfcf758dcb550860340f7cf614a722c095ec1d0751d9f83fb4a405e4bab6e8a04199efdd23b5b5e3b36395028d72842c6780a8437c494a082d60bb2cb07efbc2090283a6ac456cfde6642209e850eba963f25766c4a8f87405cda5aec34befcb64dd94519e3d15c7908f7e9add3a2a382ebc852c3997048418b88247e169fca3ea0e427332b41c89560f882968fee3e245ddb0a52923171e819047edc81c8821e39f922b05d826d3e201e082ccf732504978dbd0b63a4bb128a93c7d773d25d29e2cd73ce23c5a255cccc64801da25df97847b20a46d1c902d36457f954969d42a34df753f5d14f8e2d452c40acfcb42d7db7653ab74a9de291967ac18ae862af3d9338b78578b77707c2fe40ccadec85ac31418a46f6722e5b5bb008ba641e45101572651025be8bb484225492cb3e5d3346a8a52cfbffc71661219c54b7865d1b95b8b531d43369307ac4edadc390e9a459c320eed4caad8f03da8d10cb25a4f623b4e0c9d138b346f7ca4dd56cf1888678d93955e4b87e8ec72fca103a16306e390f9598f365e1e0bce2d47c60222d55a8a452115f174a52d8b144424f931e3979f70481e8859928bcf23426abda9689371110069b9577c7ea80c4643967712b01530ff184289d85c419a28d5248dd925235192549e1828e9c7a2fc2fa4bf730d99a88b490ac68904c026950097fb825be2641a59ca2efd619bf15a4152bf78257741b218635c1fe1d912d4c17d4538554458ced2898dc3c764c998689455f014da5a02f8b53e4d14b27e69c310f3fc45b4a6fbf5d096c38395f93f5324a005becd7f2ac12174cf8ba875e0a01951dc638e5ad3b2f7979b938303411b029ca26d3648f1272f7292ad7960b55e5cc5daa6b9577a49c6f7372a8cf1fbd287c86bdde82dd2c520c16f0ee833920932e8c3a29ed8195dde5e65a00b6586a193696b13e75c98682335110aede61d8f8fa3a5e81c3e3c79278401a1463137dcbdfe045b01fbb7d790e5c1df3e8ed70ae8e34f6a2391814c4088971708f15b89a810b6affd1d3a2945f28e15b263f5069bf6bbc6e8ca6d6ded92b92fc3b69123f47abd137c0abf075bf08b13ddf80de190873475530bdb9df084b1ed205bcd8d4c9cab584c060c0833952b22e226cccf07c8375e24424a9339f7a648d92a0605c79989280a369056c36a97d6e645a2abdc2d028b274c24042be20650c5e7195730435b5a12fb6a86aed3712e7d5fd49b1291264fd1b2877bff9e787ce8b0c0332ff0b4b3ab9ae817491d6456f4e86a6a2ea3b68312c5de4602cca545674df1a873d964ca3561fdbc58b6c012836300c56515595ae004084ca62da90dbc02c4d3f73d7107a48152d86e3f5c4e9d7f8363d1cc5f06fa230e4abf805d680629f5b98cc5b7cd69089e5d2d4aaef0e0f92ca15bc4c6089d41985428c4ffda924d4b31eeb66dbec0fcb64fe5cb26f3ab2cbd11aaab6498e73138025c031421a983b68c1e95d7112775d6503a9221793f79c7532e9b75f17728dcf0b6613e2e470566370c2789dad427dafc41a0b33da9c2f7ad8a0f2c4f0c80a9ee1a5c365e42bd5c35ee175c9c7d3122b30962a32f7015c04d8102b657aac7bcde628cfc7e229ea4af8d03e7d6db66725fde0fe038b03bc15a3b18dbae8f8a8f4398a8f181f1bb985f1cbfee2d81d533bfc415420da9c2e58e43e8fcb77cb6021afd9d16f0f1a00993df8129e44f444eb14922e6a0bd4f932d4dd5d926d01cd164b10d282c350bd6cdb0fe2db489b05732053a09a35c755d5e32b7482e1c3ece9e99c362ce62af8af7023234801bd3688b1ee2aac27cc01a1b8dd09832e900a4509d89e000590025b012e17020d80c1de700763a751c4694c93c34c499815e94c25bfca77156ccd480404dce582b701ab8aa310d28298e21e65b1b68093c0fd60542ebaacf67f3aa540117a47b03f29e8758f63700d4167cadafe73c56ce27c831592503c14ce79e80f6f9669b8f4f972316c8b5129a7438c901e759abba3daa6353aa3e8fe806f7bd48c8eab36ee57e79b00fd6ab929145445e111d70483bbadd823f4facabf76f1a4315a177c1acb8a26ce808d700156828111d675e92e65641b2b17b53ca1a046242b5b086cb807ac80e38dbbb07930ba0808843d8ed3458dd54448661ddbffb333db92594e7839a30d3c934dbf15a108208757caf6ab851cb16aadafce38750a295b61a42b3a6a274f2a4db4926b7022461b2a728cca5ec4ba8576f1c1318f774f519173c31e21072bb4f717160ca4064750ecaf1d2b9573cad0538d89da72353f4ee5837158c908cc1e46b4b76d886469fa28fa53830c19821ec377f6e3e5f9923790f63a8f65d5f5fa038e2659fea892a8eb3413cdc0bc4dd2c6f563cca279c238740579913a6e293a6994b85ac8c2a3bf2feaf33806c6f8bc0d88546105d05d01935604ed94efe6bfd3512dd9dd14267d2bc4541ce378716c7d948d272be41d3728640892cbb5864d3ad26ff0702e7112e4251f21a21192dac28cfc9844762c26fa1756fa5becb86c99dc577fbba3fb78142c1da947a04175349e5d042c081535bf8a1c151bdfb6559382b9ca41f72b4230d584fa4b4a0aa040f2424baecd1273c3c098d6160742842ba01b7fe1caa0343b4d55ef4004a741f560ca043d5897424cb3fd41c5ecd86002e0f89551cfba987f716126beaaa74910a5996655c7c7146ed603d6961d7020d6af3911d3f61fa55f2386f3af07e0ae8db87b44dd97e26cb65e69d608a08244528d6decb2893e50611a51a1cc046e1ec92d0b7a755ff719822ad1828fa3d0c3178f6a7a63412bf51db81d68251acf728e368938d6e26ec81e0a615bb432b60c4d75d42ea7858791c338bae49225aa937c4c274cbd74c23088722f8652f16981d7397b10aab3704de259d4e72125e12b0cf8e36e13fd97c65265bc1a49c5126685db7747211adcccc13498e2d0634ec105a097067ab5e7a3e4196897b4571e4298a5ff0ef9e1ee855e3b8b7a16fac7a848a33704fd27a549744c3655e48e04541067d578a556cf30e312799499dbdaac7ac5c01500f46e0c1d056ef81220e32ba121e01778f48cad2eb0bb04f92aeb1bf764e62d5102b0576da0d18fabd750b901f4ea870eebee5c3dd5116ac4e61ad8ab0d136a1fae15dda7b1c83a507e00bcc1871e9eb37225d96918560a83eba5800860631050ba4f36d7814f45f32f55250168500c034d9a0b874c5825b26d4bd30ef434f463403c250275e28b45efb118b7efdec21116e2fdb1695b0fc1af46532b1261f55dc8e59af564c5fba3a97cc8f3c34c6b578bb8bc0a400f171a7c9cde3a3017f403c01b1b7480d7ff756ef7963731c90d1b74198e302aa105974c5deeaba0847f90fa4ac6e2102d0bc55cc5add527ed00dc09583fc8e556ca8e35ed700598ca1f65b9ad198e9b0d1d4e4d3a6a6692d840a6171cd2037b8f446fe9cea08417ba8d94bad65fa27c52ced3c82cfda948eac54b11c3d0496241b37f61c93e962c71d515da4f366cc39062d50a522c9c6531847176ea51b3b282470fa9d41758e1d13a85b85d4ab571db020f4205bf666b2fe41db068e5cbb6558ae0253e7c5285e342365700e801273eac7e23ca4637cbfbca8d746e6a4a1b2d561bd78b06911921a635541f016e60a1cf7f38aa1faa90c96f608216b6c7ada994b15260fb635da766496a3579cc5ec9f83823868bae453536c8cc62e76c6f89aa9db9c9ea56be662360775278467850bf26468a35a6c6990821c776e0686bb213cad2305053e20c465e6738e4a4f5c0b1719b01c05ece622846b76836783077cf125b43b8a9abe92e3b94b8d087f6b4cd37eb0fc560f50b39f2b1bab26593231a28d758e2b31294780104e9b887a5a96c2609c85387c5c03200b96ca5bba2fa5250d66633335a36b6307bae9bd1d2b30fd3d407dd7f28022d77e867dc9690435a9b86070138cab6d858138043825fe473b542c18373ad470ffb6f0ea23a88284d4f00830b1ce2ab6220e61bf1ef08ee624423458e36192222466b20eaea293e87bd458f68f402e252c18dd9435d34d23f54447ea574136cdb28803620fe0ab96245d456737d0b26ad0cd5c4c4441ed5c91a6af607dc018eda8f04c0a6ce61f619d9adc45ca3cd01864519f47458095eee589de327959c628ec6eff1605338a1838c8cdb45422a6de5737bf1ab2a1925e2813608e9895b55c4439f4e3c1c990f35910ef98a95ea49e08d7b62f9e51526db6ae5b91f4625ffd3c2a4a7b695478234cb0c6de59feb9a2f14fcef6391a1f913b808afb06ca7ffef6620d14a3042638a9f0374cd00ad73f09710216c0447a52f3f81ec2542317ffc37bb00ecbd9d95c5d8396dc812758be9682a9846b89ec989de933d21a4a1d486e41caab6c919d426c4586cca0dd4d13207167fb005985601b6b6d514a1df3211eca19ced4bf515e424a671837e947fa371746b7a9dad5b66d26eb2af7b86dee4023a9a1f07cf948e64263979a2d6cfd0408b38efec7c522558ed476f37fdeebc3b8ba2ae30e7cedc670855185ef7a35c75f20ce294f0a3ea192d85d47bf0315c99cdb2cd683932e23f435a5dc8b6cb23e181594528e33724ddb6339945256686bd8dd4966880b537fcdd4f8d85eec3f6adc7c6c895a95f71fa76156010adea801b505c4027b5987ebc4eeb298636901c62d77222e156b82288f02414ce3f31778978c2e15f822af6e116d19645b1dcb07e28f2bdbcb29d7714f880c2df63b63b7a358dae1a1c6866994cc88bd593905249f0c432093f588f946f14b0215365f8f0612b25bbcec7ae36097f291d237ad0bc7eaa05bdcfe0b7cb3e65f20445b83316f9ce3aaf96e7ae13e40b0e06e28fa5938bf08e50e308b850f7f1e00cc3bfb377c83fd5457ee1b463a1a1262f16f411e38d05cd999366fd46b3b0df9ca4c2a904d3290418cca6ea7bb852c7185b5dab9ef2c49746d9dc805eff55f075d2c06cd8b3b0598e202c548e71dd1062825c169dc342366b9eea26846f3a4d22429a64f0fdd6d1102102325d18cc3584b18175625ce23e2716b50c055b5f81c9f89d658df01ff92d10b34a2ee0b47df0fff20ac92a0da97ea4090ce038121bdaeb7c88e95f6cda508df9191b0c767dba17f44e656f1576f55d334084b70674c190431fbc102c4db7be41c2370644b6827db5fe4516214f1548fc675bf97aba27f81c2904aa8abc8e209fd337241f5a34e26fc615e73eca150f4af201b4e84d936635d1179ce818e204d892d2df7af3f689ca5e09815f930c7d3526c08fe25beec40f46dfd192b6c865a5aa33289f87ff9bf224bdc92ca7d07ca73376d58dbbf16222627d4f27f67650f45e556ae9502427fc29f85349f6c5e91371e6964ae28863216036dd71970522541092e8f802b0fc76b5f4bd08816887263c243a5d4cb20b82ed1078531efebca379d2e0facfa6a9fe63f30264539282e8603b49ed9049b3aef9c8f543c73b44d83626e626e57b51260dd9904faaca3c9aa78de8240f76980515c953ab196e3ea606268d866d3dd5ace8117e67fc39dce668cb4eb240dc82ad11f607da6da7758a92df43537d9544a4866bfb41babaf6ec91ff840d234297177889ede9f10ab04576182cd55b051302bdf92b0e9e115c4a2cbaaf434376aaf24fe928e75b192b6f7698b53bd5953413fd58996222984e714d592b49340850233d04952f40a0e061ae6654a0bc2cce528030d8bb69a02133189a91e427bdf9a0f96945f5b19b3c1fef9e292952c9ccfe384204022e0b3439a37687016bc4bc1b2a2c26d8958253e19d1d7af20c15a22798e0c0a3177c6a4eb266ce3623106498049571dcc457333592bebc2fe564216493161181bf2bbf678b11329f789a4b33ed7602e3502474aca56d8b252c04172a3ff45b1ce4e1235db50439574cc691af55af6b5ff19aab3714987d46b8f0f4da9064fc584a5b4a974e942da69c29a1ec578cdc342383dbc82ba8d5bb5e59be74afac5da6342cf94548344aca5336271a056a060f3c778f2ed8783ccbfee05055105cbd13e7dec7c2b0b17c3fa31a6dce5c9e921f9039b17a5e94206fc4531e8571133dec8a97c31c8f845668e827d6f489c548c5dbc044e77c996b1933af90d1ec9dab47b7599951f786a8aa33113165d6bfc4d50e8a56187fed527d9b695b9393bda4d339bd5fcfdd5503285be1df162f0fa531dde902f61b93d4040ffbd22f7b1204d449d3c014b5b543c23ab6f12237a40d38f4104fc3fcaada9babc6ac3e47561060deb4c59f2e24f0dc3b7cae81bde2938dfcfb3e43d716d0f1ac8b0d11ccbfbdbc5282d7127f3ad7e60f7d514800d520f8ccea6e3bdf143643e3b90ca3fe02e63f2f8a4ca619b82b81b218fcdcc0bc97e0667152a812e874d746469273d939c3e0fc77c6bdb38a9710e1320cdef438c0ec892244120210e74cedce49f4849c0bfecca7bdae44fbb576ec8db16631e9c880a42feecc1613767c1fe818520cedd3126708640adfe5e1293ba81d533afad10ec6879f911c087df90503c8a82effaabc6c60cd43d8253a9259146ea7a822dbc4b0e842d175b22ecd67a0249f36ebc4bde79a0f4c99aef6b85a6b9b88ca055314cc519e1b0fa2a3038cf91daee2e9725c667dad6c113d0eb9872df1ca76b6ec7bcc733bc5cc8d0f01046d1ccffa8ffc2a1357dc502523698a271fc06b8c48ba9aad8b12b89b61cd704924538a71687589b5a6c007a0d5cf6e3906503095b85ae02a07975bc617a17d401fbd4f58e042fcc64e0d0b9a1a8b392840ea54d10b0635795fee949a72e0fd348f937679dea50ea7334a31506b56f3a1c83af228f1c22c2289d9424903c63a25492de2af112e5de5cf60ea336907c52f344b3b00a18284905dd9ad2e0f3c48b660b5e193163190ee6105f522e1e4e5848c898b0f8c7922388c3ea1474510d17260020c3c4e7f7b0e80230eacf10481d9926c5b239d0dd2abd0a0629f98cc2a4c95d8e9152e7766f570ff128bbc1c75c7274c62be803ba66da3a6cedce4d4f9ccac88663ed0a4d38733931747e575e4457a31dcf8b17350c6e877f3162abd3e8c6c0665ecfcbee163867f31b0f43c280140d3361164e6e213fe81b51399f7658af3d6af0f6b4224aafa6cc1afc66368a11148e495a2d5a9687437a5b98ba523421716032c26f066893ca2b93aee8dc89cc9a6508d6489f864db7d81e4d06af17b88f11a9e7ae677056c019034f0d34f404bfb62211299afb601dd19d345c1052a5b3819cc71d122f7627998212508adde96cf4f1eeff307507301a1aa99355196c7af75e4334f59c69e871956273377c16161e9ac40a7e62f8be9c799e009e5f613d854b3cb26a172692f6c0362a8103fb1130df2b41fbc9b23de0ac8a6cf6149d6fd7587152e38128221c6d880a14393a6048c1016b48f4430a8bcdd46b6ac22007b06d9d60f1af030ca8493fad5a6f0304722fd0e02b5f98b0cdb14194d69ad91164b44bda5536094db9f7711acd973a69abef099fe99339ef69448771768b6317841d0db26f5f6c73d56cb293329e1b9c4bc3b94ad2ba5f735a4c3ad4ccc69ed94a0e74ff2a21d2269664d97dbaa6653023b69f654629c48e831a74368ca3c39038f7471a69e6aefca0fad2315193d59300939dd40e0171f701f284d97e657f9256e86aa668cc1c2b8b19e5dfa04ddf46b89679ce168e3351fa0d3392a82f93433b10682e33e63e4bfe6c132a4fff89ecee4e219b3c23c06c95c7c88e6307bcf4a65753b9321073c621fe699421295c1cabee6ef9dec9699e3a3be1108622c08520d5fc8747aa7b96835711f1863dc678dfb6a644f2709ca103882af1f13551f97dd03d9569e17ca8156a624d39cbed6bc7eb5f714605e063ab1964b65a88a0fb04368c181c5801d9bef62f098bf3794bd8959e3687529c743e4fc592469b04b2a4a3e9525bd19f9154bb9d2b91581d1d467350e7989058cd72a9a5be35f7faf6fe9885291ada275322237061966c02fc92b9bdf57c08468b01493b328d65d2baf4dae9183060b50ae38164c9278dc4637cc78d713f95e04ee002935445688d18815116de3127e1188f219f6a8c58e5f34ad415cf34f6cf2a0c1e07bf5b03b796a44f5b9eddd28e40a972c5ecc2d3d4bf76efe9c159406bab8530a0cb9cfc0df12a6393e6b5f075129a595dcaceb75dbbacfc989f2dc483f4da6b9595be8786d018501820947c210ef8833b963849ef71b197a5b19a567c8d3a481bb4d92c1787285e8c5512136aa4f81b6b78cabac78cb74ec684601a6d12661125e90afff9560ab73373bfc30a8a68ed4e16771eb9af0ad883f302664bdec95a558ec38eda7fee1fa7c13311d036eeaa2e79970f81b0d5ea590c4f054dc6bc16207ea6a09e9b0449ce335d7231613ba77dee1518af9d133288bf47cf490d5c2090cbd6281474d7f570066ea2e67320429372a4a689d686d7b666898ce2530db93b370d1c72c42cec96707323f3ce28252598e189edf35829ba16d9a314cb8bf1004c130c32cfa2531b024736d53906626b55c2971976d434e3ef27908a7500396136d7ebff37742102931e82aaa0e5745ff0ac0ce93ff9bde07424470cd5e67bc391ae8204863f099a5220419c2b5a581b98a22016751e88a6147ccf620ae1223874d9f184a923e5a8545b3dc7b4f64a636b405a47d2a145c408e7126494eb3fa4405b25da05b8b0e3d492975a7eb58303c1e50ae1de6d8d4491636c0b4cad72db175fb0dc394d309181f11b5593245f0ff2dfc1dd80234a401ca2111da6e080774346dc5528153f97bf6254d2eafed30f4c876584c88d932fe26b280422803b564451e1393c020bc3acd09e2a5a082d02e5f44ecd05fabf37da53817bb8ce0ea8502203334f6dcc01b986a4a27469fbc6f10dc62513a62350699dbb7d37d4374e6a8999574ded202a9809560813bb443189e4070be414f04b19be83e6e92b4d42cb2062cc223ccaf230869304085eec560eab785c2da6b21a33546967263c0ee0f6400c4af3019e4d3d84da92366bd4918d8be39115100016d00f00d6dd9dff47dcbc8dd23d04b99b87dbd2933136b472888e78698af49d4cd9686687145e4fc699dfa45abbb1f4b1633e42698e7a685fb637f0eb201e61b5ded3d21bc8806a5952830b627e896c537521eac6a1bcd4bea2cecdf91c8469c8581aa0377b663e3315767f2d850c26dca4cf1d3802ee26fdb7a773af6a077d37ea10294482db9171e2ec5c9ebc2c8f290ce4b9ffa8e9ce3cc89b654179119119c23acc6417d68e107fa27b76fc03e2b407c09884f34274586fa4d0dc711ceca0b4083ccd74923c797de531c74573d4e1e34177bfacd593529a3f7e0f1206c88fdf7dca978b4efacf6e5eadc283dedff7d853d1631cab2cbea76d2f146ba43f5dc3f1eba4bf32130beb7c23d09f8728c1aef336d49482f6295501d4e264817a0490d558985672515ef6c7cc9a19632226152a2a9683ba66fef6d334913577184d4fbd9d64f01ee00c31ee8953c1d2d9527c60b92fc97827ed111684ae85620d5b808ad7960f2eb81171200f2222b5198692d371ca1866723c035eec78e726782ba325b9cad23e119fd28a651da1931294512f03f8bcc378cd27f4e45546b548e8d9e0e88d15536c0d732e2f56836b10bfacfc628ea07009a3e0c52d19866b997ad53e3b7f6a7741394e0fc33d71cc2c08fd5e37009e3604d1c918eaadda3003deff684c773c7a6e9f051f3108d7a38599713b50d04e625d0889c0fe0ddf22591b24a20333e9972279f52b33dd15b06539b4f1381314dac08736df7a1a2f3469dd4921380214826bca241ac4db475fa55bdb320bee3b100fb84327299628de55cdf1cd5e7ae7d07ac5faad7c0ae7e1d1c18cd1a730cbc627961cbe70b5c41f44883da8d0d8faf6215a8b4f0667d372ea172963dffa294877971854273dde6e435d8aef35797c9c5689bfed55459b33faf5135469216d948065480d756df5e9b9fa176e6e6e6f1179af19bc1a913791fb3854e21efb2836d6cc003ce8c105a0ebc7e1c970f696148e64dcab76fc1ec74a8120149de528867240c4bd09a8007fc29f110b955c583e6325177916e9dccb76aae3f016e2349f8221d328ba3048149de51aba243f71290a8391c818219c4145bb416536ad56c63338462b866321158dbe01a5de5d82223304c32b3452b0207f993a834bd26ed6a523caa259233f84ad26935a58829d64c1f9c3a912b4242a389546c044140b5899008a598a2c8c80f7011839e7244dd9f188ca81fb9de84ee4caaa482daae228fe031423feda89277122fe848e7a5142d490b8fc06ffeff62d8b2107c899b7112e9526e9bf070c36c841771e92bcd3896361d3417be10f93e2b67e25543662b486604bab97290042c70f50fca24f51981c1ba14d26d47a3424d99846addb08a2a79926a594982454e6ce05a941f6ec563351581cad762c6b09dfe607224d7f2962b9eb6ed97ed4a43126c59bb9ef7a4903c0459f57b2898c5f5982df2780884e71acd23145f3065a9d60605827939c92d0e2ec7110080796562d4556dc299a30e092e4f522cb1ba05537f95bbaa001c8d0a270457cd06858997a5f736a78ab3ee0ba463ae2608ce458664d6b70c03245e41c65e488129d7ad38f7ada799af5e8e8cbed0201846c60b23bfdab3e29dee5f8c5f01ad234486d933e9e12cc6dd644947d2fcea30ee9ca5a5acb923ce79c3538d226dc930ed86429a23fbf150c47c2a2932b8ffd46f0020f94043bc8b21c982aa446cb362056c3cb1741588da70d73367935505460c591aaffcb30e8cd25ef6f47af115cd81f47b5e14fa9bc13c296888c1942f3ed10654c199950f2c7ae54e8bfdd3e67944205bb34738b37a34b53b768ba30cc09e75134b3729aa8670759d24c1db8f169537f0e62619ec4ef7df3e7d4d2d49d56e944c56b5aa43fb87097ead230b0690c99e3510cdc8f9580112c15c0ddd65429760a7df0c23cc3005002ef8fa031b8bf79476b3c5f693192a7f206ea7a95a692d171c56c59da080697509b91eaff1aa7bf7b0c599ee790299a6248e4d054710fd4d3f811cb92f4a2d2ab6ee0cb8a7037c31e480084086890922192ff3b32ab09fbed1a2c2b82ac257877027363ad5063368efc66b4c80aee3c6346e669999885d1208c746647dc518ce7a8136b5eacd416327db515f61280f64c556d88c390e2e93d0aea6eff670b105ecf4607d87988058b823e7e407ab77cea8c1985085f5897f53acb89df51fb9011c801d61720b717a40e8bc02d8209450fc5dbfe4b07730a171e508242b02635480d8058f14df08fe0a6d893866b28ba3af422ef4ed306351b1a15cc7fdc8ac583294a00d747abd742114885a2cf3c48a98539ed10e46cfaf9e7dba669e5835d70a34d0a08a6efb2bf08fb7c406ca60b1f616a43da0b0d23bc7f3f35b0defef1380401ea29050e3c979672d2ca514a6034004c1a31e773f9b45592341b8deaf8977f7b5b25bbdac1061583cd949796a36114c334ca4104c6b8f60acefcdb2057af12f583285849c64814c04adbda23ad642d122515efc72a281f0bf4647d54a2690081112f29337cd71d7d4415aeb47ab060676bb1372ed03fd95a4d8eb6ec65764d30be047abfd39ef1d62dcd203d69992b50303fb0d05f5f1493c9af7de7dac0749caa08d14e590b88e99a7f64606a0c2e57db3cc91542946a341adb07cb47ea05e6512a834803f85bb3a045121997ced42a826403a6930b05eea9abdae404e816dc25347715d331faa3c1c3f2892770d3e54c10b815db5e18b9b653036ee2a88e0eec291e24030b4cc4933529d3836342268509559ae1b51e91dc8d0d6a0c9a27e0f09b7867f0654eeb505dd3e7dba739504d0b9d64a0e5b21f7ee1b97f334dd910d5f8d12f9dab6093b63585ee6fad47d96aa534c24debbfd2e36f0464ac78e81040a09a4a7d78a13758c2d6f3ca73ab2fb7b9ab5750f544adddd253b9d4f941ddca9ce0e7d097a616b06e0819094cca2370d23353993fcf98eedb037f415490b89ac623862a86d16182c36f4db450830a5c6c3e8d90a247026a73c638a3848a432b3efe7120a9bfe94e501cd5483049b72a97146863e896b126258c055cd6f317c911621eb2382e1a73a3ee133454afd2e87dfb87c7ac1287712ce4c5332b2e8a7a6fd85a07f90ea2fdd3e85d5cf58f41b767d0cd55746cdefc73e4adbef78c0dcf185b5cb1e3855e7dcf9e2be392928441dfe4ca0ab10ff6fdcdf104271f1eaf90b618622a5dcc170b8973648a04e630c01f93e5ee2ce5412b62625e60a51660012c00166fa95fb815f39af05feca88f635d23da82e883a54e54367a04479a2330eb61aae1f9f995010559888dec4b1686ada0ea2561a8d0a834bed0443e19c990e5e28c573d411de955d365d829a94f30bc50ca130825e68ed163ea43eb357a2fe99db3be47e9d80d408f7672c12d8ca77e684bbd00418f2649afd92c3f3cfbc2bcb9e19ae6b7ab79a43022d406024ab031d23b4aef62c02a5463533f9aa0753b83e64d8a9d1561f55d387982e8fc326900362e4967062e2356d4575663582fdea9908bb17ccc3a00b0ead53db3014a0638418fd24536127f1f0fde456d6cf6079b7171278c4428e20d47ff42d2d85607af0e50761ab4cb4b84ad5aff0682bad4a8329122da2bb701f89ce1047ec7019cd98a2438451e795b55c9cb387e92d0fb6d3c9054b4951c9666a9c243623aa54ef7d68a98993833a01a101017c57db346efd131042fd56be830b990e6c709782a8cca1b9dae9c44ea4e7100ee446b0b573893b0803bef45fb8a2726ea29412d75e94577bfa87984b6d005698b73f616289ca17d9cb21ce2cb916f8d71b958a2f527432dbaa9fcf9ced1e4ada0dda0d0818a609adfddcae2d715e7e74e116059d7641f779bab3cf289f79cc4e6b726e92d1c91dd91daf6f0ea218a4202ed0ef191be78e6c9babcc5430901fcd72119ea6529b4ae0643f959a9419e081941d911041cf54216b324d5c83c69b1b343df93ae94ee69c6165bb807ac363ecdf17b604e443f1e4add588b5f8b830802e4cbb2b4b4d4133a0817d058057f034bc857af8d1278db6d4b343739f22ad78ef56a140b1deebb0ccace926a15997f16f7c90e2ba71278067e18bdd8177a25ec84e0d196aac78554e79c21d50d71ce48a259c2a58cb5742a62cde0b64bdff450fc9a7b19cab99e033bd1e02df3955575fbac7c0f0f60d854ac346b6ed205c5cdd6ec7ed3396acc961c8f337f6af5985915a3e60bc318b7f35c23c29dcbd058c84dd421813e0f151d838e546dc440ea44b8b45df3526e7940e80fb83b48759f316b06a25750bc8288b9e4f65bc7e0889d804b4c50037a3a4102fd8659b9069b337d2c279c6ba2c93a04d6434fda7d48a03b5bd6df437345981dc27cebb9bf569b314e26d6705213e8bc0413a3c0f50334606d0ec22623001d45f3c8b0084940210f18ecfb46cabce1f220ca83a7f62de6a1a7974883728569a5ea8561606ff1fa12d082236d83516e576a2b0c8640b78fcbd58487caf66111a5c6000a0f953865d8d8c857505ef31a765e030b604a620d6d16f7826ba864966f16878d0b93e36e3a0b279cb28e72798801add377598c54c7880733b43a4e07d0b6ec306e4d66758a6cace6d48a5229378414e75623ac3a7e2211e61c6fb7641bd8123471a4aea35cc9984bd461016ae8a5661545f0404852aaa252ae4d80d29f6fc018120ca6d9e2c72cc8332b3b88dfd6a7b0bf82a57a95667aa78778f9c50d253581b66e5b619672ea3cf0d73a7a535515b8a4eca823e8eedf9b2321762217af8f5d2ac69f7e6ef626006151773f99fbb916ca72271901889fb32121d853670d0f4bcdec434adfb32f2844fca64ef197c3c0ed5b132e8e8d9f73873823ef0164aea1f7948bafa30c3cc37de27a82852b83d3685a96d8f270dae7781b3d5bb0d8ae3266c1c8cac6d215a6b45dfa19066534d529bcd0bd9860326fe619f2a7299e1dc419c2ff79aed3ecd2786473ff443851da93df2baa0babc06b52f74aaa847fa623a031a02700811609ac918dc0cc0b08b2cbd1d1e88e0e072db45d73081be1817232491db06ef868efce9ec95e1fd2c0c6ecf173b0041981a6f1c99d3eab01494d53278f84cd15fe75afdb38c857437140e2d87f1dfcfd1e6e4508e8425953aa466fff1b78132bb668454f6ee17c9b27a89895cfd2a7d3c7c6dd35cc40b25e7900b0431d238fb4f3a0ac10e7285c29d23d4d74c85ec411e34687ce00f15647e616417603bd04ab83ebe70175d3dd60c068d9333542dfdebfb42d54dc62f51ea9eaa2e87d1a611674923441e150a864194548b18bd7327e1cc2449477e7bb12ab9aec08028f3c017a9b431a6196f4fe0601530940f03b281c555a94c7609dc007c188be3a9904f5071c2dedc6335a3f5f7c8793893df51233a8457c4b1b1d132210867622433b82a54d007d0e1800a1d51517728801adf711b884bd6b0466aa1da223f5cb8a157ff2562befceff21e8f4e3e6473095f3383b51057163c7aae35c334f8c5baebb20c0b6042f475ee3f04666234d454c446b009c1dc2f8218232422a8b34cb1a2c2199a4fc44db38893974f64d14f443c2533fd368a2244848b702f87a308118d5bd7319efa34d6c8ca847713b27844274f38c2509d3f7399c8ba192287fd8fbb2d8cd33a2411e7a741b5d1c6a9f08e9c3e4ce9369fc61afc71ed27f25edffc5a83f265b13ea1944900dd0d8fbe76816c25cc70ba4251bc2e1bafd32f111dbfb34c3bf0881e42eae9ea7e0d901aaa00f7628700ed559bfa31444e185bb0e072c4551c2e11349fa0c3992d715a2fc11e7e25386d75c8dd87467bf8007eb3565af0dd4a6577ab5b68b3f15480179c1158ddae6c57c17eacc15cef131421d363ca0d1bcddfc16c03b8e77743a3e5b88665b2e8529ebe8db01e7706908224e2020c22d95085c97efa8c656bbb0796b97af22bf4dad6ce28468ce9658f6c8fe1a574f79870f40f290e9ed0c44e947b53694034a161d9a2f01afb639471053142dfc410f94dd99f502149f3ac6dadb10db28be9c328fed939d7b8afbc0fe70f3502be75b9c2b3d989a6c41f08d12181ff05629ceb28e0a4cca6a7eae543b44fafafa47405048a8dce7d5c40d855a503f1359269b62baa2ba76b5b3db1b599d193205a90ba2a96a4c24967509e84140fee582c0a25a3ed3f864e46df28301ce0bf8091bb6ba899baa17b3f129b04616292ea1d0e817dbcb91095a6ad6c64efbdb7dc5bca94520abd07be07cd07a19fb0d6901aca9d133b8186588b55444f0fab8822439a74696954ad1aca9d1d9e2586504c14f51491e12d8d93bca561af2b43e1a2ad936cdbb66d4ab6fe518247faec482212c543f6d46ecd3dd4616f5f3bb2456aa398d9996f40b156edf7ae66be9ffc74f2d3f481faa9f6b78cff035ade45f630a91a9197180a4711ea5722343491f491dadf2b2ff54eaf78565205070f1256f594ba5144218b2050b92377e84eefc89d1df7a952a15930425c201c1b1d3b6e78e8f0a9c73ef9b836bf49afeb7aa96dd68624e9b036d45e28f46e515b46e6ed4b7f7675f82f042a83cd022dd002012d90f4b6daa4b0d88476376eec963f439a2687a7b9be7fb6e0ff359c3d4cc0aa5f3a08916248ef02d2c0a1c374632f12e9babc5116041aceebba26b30b19cf209148241209c340f924c6b87179bb47bc31e9ee237353a0a01eb1a0a013aec2d260cbfeb2a280a465b3d315aadab57f468dd6cfea8a9f14d084346a13adae084297a337e7bce36717b2babc53651b64f947aaf462c2184427a747651e9546652ee42afbd3e01f7bbb8487091694eb52ec179719335858a60a0e1e2d1adc3a5b86a750e5d741a030eaaeac582c0ad60faaba2c1f96541cd4659d000a352e4ba5a4c64fa7ab06483504723a9daa0ea952ccf3e72e3ef65818bfd03f1ffe5db76271fa403f1ffe5e7d44ff6eece4e0343760344a64e0b43a9d4e45766ea009677713dbbac49c2bd611bf1cfdc6dee8679a631434e414d19196f169192d7b0ec6f7734f0e1056c1cbf1977e1c2fc5f89abf85e1c9dfb86e65656565e53fa475c50bf953e8ab0851a19c936e55ee671c7369703f8768c610e968f08647834db11d0d16416374b8d6f0bb54b0417e1a310df2abae17ec4751d9a3bb33afea9c949248ff20c83eba9b254f57b94264c0aa1b056317773976a500165ebcba4f63103283ba51e4d855f521bd0a911c8bb65d1bdd2e73bdb9b62bb36bee87911dc3ae29c3dd75cea37f7773bb367a94cd608b2a30bc19aa45c35d0d21e214638d1e70627e0ced3011a7e8d15b38a0a061efac9a881314ff986242c35dc5145d99e6f41e62c426af56ab550fed1bca26c69154b9555c0d77685733fec98fcef80f1201ac48c20a26349cb57134d839505ef52f994c68bfca4bdb6fdf9c949248df2a26926941c356f1699fd49057aaee5998d4ca539b0d7b00bafd9c317a903a5ffb4d8bedef1c97b99661d7f5d363a95b86698f7da6659c655736270e728794c869a41048c5b02f8c9ff1f0026df0afe7366c6271af672151963833ecafdfeba7977ddbbcb41b2693148d62db47ee0b732ab7c39c5b8d2aa84bd5e8e4b22cfbcc33350876f357a30a7a7d2b17dad625e4882a7f7ba124aafe3a38a57262417e0bd496f20b73ea0a610752b5bfd05f0614e59e0681b4bce0f57aee69903f4883ac711534934195533e9f9f9d48c9ec43ec14a4c19b1bfe906b6dad9a79e146a99c0d2a27c30d1bb12037a71a04e2beb7feaef8dbdb92a3c36fb0f97b5d9c036a5541dba541cee35a1e27c4d960d9086e88ab7f1c9010b43fc44e2e2e54508651b7a185e18f46287373445a11db15b4f37884763ab8df38eccbf97e70910e069b06fb7958a5e224fc737dcb2540cca4657a645f8f06fb87977467df8f1c56ad62f7850be5273863c269e29a6bae9f7be69c8bcd2d39fcf9fd6bc911ab8ff8fd37a3c12f5e41f9557ec50d0f9c195ae6fa91a333a3379c1f98df7833f4e0118f50fe42970da29434678d893199b41e5f452ba8695e8cd360bf4bddd5cc6ab55a99be4f46fee132e367094400ada03f94d0b07db68811349c73ce397d05836d5dfca367a30364bf8b5be10817080648d547f63a1aec9b067bc76f129bd78e177434d8bfe366621736bf160c7b2c36a8fd8d0e2fd1fea633386ca2745fdf961c210648d5873f6db0b23f8b7466a12fb06ca4885d3172f388ed677afb26a54db327f3e39f76275784ea602095650062d3e0855d3ea3b2c7f2f5ffffdbc8a023e32c8bd375620c0df8e28b2f66b8935fd8a386fc2df159026990bf19a422f49b9bb928864432790fa4c638830712e9068e991a20289fbd1b0d2e3199624059963d07730e31e79c18f6f3396c0e81c385fd358df0ea5c1790207cc2b9ae197afce09d9b9669deb1036d892fa4462632ce4c7c4266d2f263861e7c0ad2204bddae8695604ca6108e4b97b1bf657ff70ba9ad6a909b55610bd760cb0662f5c122f93dcaeede9772635482823f1a648c09e5ff381ac434d83a419caf1b0dcea83416c83fc619f343b906a74f116652caf5367f8cc5e3fa03d5bef9c58c09eacfd75e98fc4d46ec7aef62582b92b02209febeaa8b3794eca347da3ed4a95790eb0b234b11cad541efbb85c6e2cea81989f6e7f034dccf9fcf71de770bfdd8f5c3b670fd5ef107540cf79917bafb1766ebee186b8e6960e53c1ffe31e4ba4d6d5e9366dfda57afcf85470c02b8b80663e40a36ce07da325f489dac132ca932eab24e2054b7e6a6d792637ef7dd27a46e5d4e7cf9188835dbf4989d99e777bf7957e3fe9df65b9706fe0286addd471af88bbafd0c61d8eae3479c1f06e24bef6ae47b5773fdf4ea3ebdf9dbe5715e0d3ab1eec25c2f3d1ffcf29d24c1a46e1df1d792a346722de3b57f1bcd34e761bf699a90edb7c86932e1076c60ce7ef3e6d3a0f1c7f57bc1abcf85e1cfbc8ceb1686b23c0602237870e03859324be6662eb6e825d899dddddd5df7f6e8d1a33b4bf5ed7e6263de8d717777bf9039894d7eebf5c6e478a9015dda367969ba094430042f48b003eb88111a6fa1eabe5577f7498a1f8f9689f2c266f82069d754b7e59f50926d5d42efeca7414d48d33acd8934d75ad5ab5403796987b06a55ffb4925ed2ad76d243dda485fa494a08dd6f71762fa476ddc9bda0975f5c6c996de9b4ae13d2765a557b26d2325a104148f86788d6ad209cd49055553b05b104ed3bf656b54cd845556b2154ed9a47b2cfbeb7c96d1ef65b0ff1368ceb4d4a7f21d5b929f077924e1d699fee37af657b2175fb42ee220d6aa806b528b4bf26d2a0f6feda77da5f3b0d6a3fe39b77d5745de77d6a50fb8c04547b76c2dae85e7bee825dd85eeb0fd9e32ef800dab2131646d381f65a7c4dbef6fd93adb6d7bad7be99b00b5bb5cdbbadfbb4d11493a3dddddd9d0285e4d5b62e274a9a7d494cc607b33983143319679c12fbc2982a77d541745d21b6106e0a3424c527f9e43545529defa41924fffe624ca9f15b29a828aadbe548a9fdc5b62e130aea1308da9fe6d915e282e4112a8f502570917115459c61d8ac62a8ce2a94c0520211834a6201a102207ca8e1c770a1a28980f26b22984a22363b6ed3b6d6b2d6b4d632f0c6678793cea3cbb2a49db1bfdcce05fd2f2f2ee8e18fdaf2a3e338623492266812890809c390a87852477e96b4940035792213ee9ce132f9795a734e4a7ae659324423171932bf9c13508f96f9ca42d70a0ed0ccda0f4dd35afb38a310e5f8b70665194155c9c5ecb7cf3cf9eb65fdbb5cdc4ccb9e6bedb7b871b7ddb6af9b01b8ebdf4e6b7fa9f94be7cdb5ed3121d0af49ea1521b07db8b58ff83adcbda03df7ec79a14efdc1d52dfb5a62d8efefcfc7575b72f4ef7e2d31441ffb6dd5bcaf65b6cc8f757e711a41872852af2ffce562b22ab675c13ed37ee37e9ff3a6bfeceef2115eb55a26645593205e01093de122d6a23247a9cca71d4ec24a6a8e5812a5e0bf2926c66675d31dc13eadfeb807fb78878bb050a32e21575f3fd4304f91658f9a08683819c5346d3299b665c70c82fdfc84d08024666fd7a79413b71c2fe1c828659411457f4a40c30d0a92d332fbc33588021f54ba4a4194f1ba6277777777f725e34d3736670e345c201bfeb06fbb1affc58a96707cc7377635863576358e977288d018dd04b45297354411a2c8eb17484e831c2f19af2b5e32f660588d2190a8e1d3550fb6d5b5a34116c2301ec23b394082a07a7c8aa490547eec92382d13c6f4f89981638e0e0f946b9037e8663e3f8f96999fc904848386b4c6d3556b9b9466fda38c5146c6616646424a16b20497bcae4b3af64fe9efda981c6a0ba1dd96ddb271dcfdfb85f19e2959c8212c755944f4909205516fed796db95a5e976466666666e6bf5a323377f382fe2c84e3faa8bf23b02fc6196412ab78361af861e8da35c61a5e98c671a36b4a165eb473bb7b77777777777b777797c39d20a1880d608cdd1c0dbabbbbbbbbbbbbbbbbbb47d0ddfd1d817d7f34485fdb0b67f7f505417777f72df6bf7b5da3100d411a0e82200882314a2936f7f626611846859436dd11d812fbee103626a15f431008ec61e325edb30fa7f665dfeecbf5cd7d91bc40d2e6ba68c8c6a460217a98dcf46bf85c0b68b8add58ee6bef11af89be99032af111bcf21685dd60fabea3e2b77dc3ff84b8e7132cf89c4168271068ca961bab1038749e405c1dd07850002acbc3030fbd27fa385da2f2c98dc3f90449af160d6030882527a93c827881ee67ab1b0a00842f5fecbafbf2effc2fe7cf4f5319c3ed0f8eed587373333734799a7baa55ca64b876906878d0c39374ea048936952cae4e777308cea2f4cff0c42caf96b6354fbff47099d593db29cb921257b578d89bf1427e83c55feecf242aec94e757a371acc9aa0fca10986aba58548a2860b648a58d01bd26432994c97b7d5745d341ad486e8d6755d7bed5ff346f6fb3296013b9326fbfddd05ec8034998926fbd60500facbb5295b65802f6458d0b057eda3ca1fe9094a9a47bc4683df72c9c7b9ae197ae8b8e19113a46576fc890c0f0e77223434b54253f5ef08ecfd6fb44c7f341af412f691fcc5dd85b2a4dc8b8d7f5db6055d8606775b1d205e729c1e32a77d26b2bbb275b4ccb2cf8ef53de2fa192f5d5f8c1675bb1b0d6e1853f74352ddae6e145158420d27abbaa0e12dd8e518e633365a5477d60f51aabb13a9e112a5789054ec726f2caa7bbb1c31ffbd343feadd0c94cfe0c893169210e920ad45fb5ee8aac9d4f22659c91f89a45f73d233cd0a2fe3f7df53a042405dd69128156b7949ee6c24af69d8e3da1fbe785b6224f6c50bb2c2b7bc0c2f888c272969d0b570227fc2cc9a13311495273972f22850a845b5a1d4292251ed8f4f30a0ba44c94f8bb7246f0e81fa877247fb26f294903c2a24775ac899d48d52545660b0c460153e6cb22a7559291e6a2879564a92d498057d15eab284d8a286748231584bc6875fa386580dec08340441191ea6f2170c8542612dac159540438c45c40d955b5893f91c3f9926851400dbf78fb528fd42fa75907fc858d0bff66141ad9697a886a1bc2477e6fb0e86923b180a43d54ed260172a783286b7e26d832ade0889dc79026dd260a83dd6a4412c48c35a412da305d9a8c15a58132ca8b250b045f5b01d2ccc91235f5dd691d30b0c85229cf80949f59397e4cecec90822238636ae0816f4b22e6be887ca79586bf3b47fedc39a34d8f307aa7df287728cbaacd4124610a9cb2a828900eab28a7852e58e97b05663ad9dd8ec23ed5bfbb01d2c0c57b1d6c270110dd45ffc5b998db9ebda78734ddbae99695e3ba9d9bcd63dae8b67ed34d8763523434c8dfd4855563e3ef62b1ec95fe2ab78d45f22fd7e32b3775dd7566e7f341a8d46d76fdcef4c0ba91db75d5ed8ad8cfa257d887352babb13096f3383a365ae9ff2b10bfb8a5dccefab6d5ddc1908afec6a38f2e71b37ee1336bba0fcc869506621a78cec8bfc94f0b7cb6be93efe2e5d4cc6ae26e52b1b59197f183ffaddd288d6d1ef3260f4a67ee1b836f54b8442c31daa393a405ae6fa87a1c70f9d06f9e4a595f33b7d61bf76715e0d5c83e4968e94208d06650e47a341b03b07cc4cf3baabd9fa6bb1d9da0fc3ba17bde96d9e3de609a971cb7e66df60c6d35f620c689c44a061e4768f31a0b1c90bdb76713d682df3a07bc9ed0442f65b0cd6fa6878312090dc92a3edcb3c3e52b5ee6e6e691f7f7f71eb05fef8481279a441d900a8fedbe5004065240d4a9f8e5331d5031a3fe4947fd1064924891fff46e414c0c24bb62a2b6372b779bdc34dfa453e3b619f2fa4f393988cd2431a6c7541714c333637a41a9a9248d5d0a5821bce86f192012b1fbaa8842cb549ca4b30bef5979527a99052dc6a5012518e8d5201cac673e3c9bcbbfe5106dbba70777f3e64cb6ff93efae5f58c75952ed4a0336b77f5363039b6a7c335f0b7c0803981eed3581bf3afafd132347ce05dc07f591bda5f0fb336b2aebb304c03d751edaf818e6aff68e399da92fd56cd6bc9be181850fb6b1072aaf36bc9c180dacf80da2f6406350954bd9e745dff31cb42222513808be5f384e5eb755d3ec2be6df0ba40b0c9d7623b151c404069706bf8fc3ee77b8ddbc47fa9f16354408d5efd8501e2494405c18d9238110d261104b0eee0ef1fb18d968c56ce4a2209d9eeae2602ccaf2877777777b19eb3e43ffdc5dd33df6e6c0abb1bdb9d9b3ac8d860139a556e4267e5a7586d42afda84cada84460e6b4231da9597a08c35a15cb909ddcab3b1ae1bddb511eceebebbbbbbb3501618ec244d049b7ff4b832c67753dddf7e409997351d76378cd9d4684f36650824c67119f794a5f436ed97c614a06280ec4b3ff8f21e49465511b225162a69ef5fc847d46622483fd0124c0e4105592848bb66bc8628213f8749a37dac9737038ed08f1e435e2f6f878e168f9ba0aed79ceede8dac3399e428e640a251422767b78518eb6cded646f2a31152b3c28a56f77b79cb78b9f592363dd0dba1fce1f3dad8658d1479a500165e64b0fc60c92676492e345567419bd82563e71fd7b4ebc950a9aaf8cc424242aa0154c92a212f71605ffa6d18d281888754085ed0aa7f40828a36ad66a394146dd3468d9aad02926d779736c845562aeef990590575a0b53181d646cb4bd7f387addc062b83b51abc3c8c8bdd176ce5250c1b6a90072b832161c1a015175fd47e2f5a296c69a2786ea85d24c84bb1043fd47e6cc84bbb29ccb123cdc1865c0eb54c07b9302eb624b127d47e79618cd5f6a23d79510ac34ecc32a5a4f6fb4f47f739126512a96ab065ca7d480ea9fd529eaea227516aff2cca62967973364771e8ba2650b6faa9fd5a4cb26ab0a34ad38a6291dacf4554174fb57f148548ed4fd969b0bd28854bf19593daaf12d42b30585a1b23c688e1cd31e6c8575ea48a43a92b540080c76b72dc48002bacbad5412dd4434445cd934aa552a9544aa552a9542a9517ad7c67b55aad562b47398fa7dcc755fd984aa552a954abd56ab55a6d238eaeb0d0e649b58faa7f621a4828aaba55d441424344459754a9542a954ae5455ee4455ee4455ea4c2a20229458887888a1a954aa552a9542a0ea99a47a552a954aa4eb54fabfaa7579d4aa552a9944aa552a9542a1500c0c968f146eca3e29f1503e514d11369e751a9542a954aa5e290d0d0100f1115f569277a2a954aa552a9381487e2501c8a432bbcd7e56c119f7847060505a5fcc527260604ff49244a59c53f0cc42dee204ea552a9546a03c099e68a02915a1f74c9a09c981810fc2791289d939e483b8f027948a00c9a41970c923228ca20974102e0e615f4b79a0205bd50a630467e0d49dbaeb6152474014d4afa07e58502ea5ec8ea059405903627c97fb32c0bea655936c24e1318c2ab3469a99060baebb02507625ffa79e00108208c18410289269aa8ee3f35a4be5343aa52f9731e1ef8ceda58f15614b30a1a622a2aa8c05445a8fdac15617dda01e51ec56f1726be7b6f27ad488b427dc8855c0b215cc8472b2fda708b6af33490e66729e2b1e9c4f82eb4ade616a6bbdd9d066796069bfdd90b7fcc8851caeba20df66c10279c3368899c44c78ef41285dc0a6a193ec5c8441c47021d360ee702dbba6c5df9897c7ebcbd87c801ebf012669a51557e1c36fc32b4cc56960a7e2aff0c39eb440a01554da5822e6aec1aef24d0345fb9c64f3e9d68fc63c13e7e63df11f3bb9d9b265ea12eab8705b59b7b7e6c8bfcd5dfb42ffc7ec9b805938af9175fd4e904fd1a9aa258020af5342a32d2d2a28921dc1d59aa263503b3aee0e32e472f4a29658c1e6394327e835132338d2a326c3b066f92fc1ea7ce979fcd201809a63ba1e1a05d1b47f6e85e570c1ea8da5fbfdacba7f40bb1cf9e5e1c8d1bb4e70a54ec352f74f9ea037b99794b6a90868440178307eaf5988feba35fa42c9cc671894d1a4129379959685b176e8f9263e1e2829565db085d50feb64ca439d55faed4a971412983547ff62ff6701244206144f46406412b9001163ed0c2880e5846a88831e2820a80ba2c2329ec895f8f81b6cd458a8e1dc21048b07812b46a29a0dd38cca90347b4f2afcf679f4b36cd2ce2a44b38baa74b3ca49968c144d88787fc92a189a7b6378aa8776282847cfc0b69d48d3d12a279527427aa799aa7976046125b62882f5f3291f2ebf5dddde5e520c0c007063c48848055ae8db07b8016f985bb183613769fcc91a5a7dcf6073ca3db6394f2ba306c4e2c346ddb989999b9e3dd5d666666e6df52b86c08bacb244a771ffb01dd2daaacac74359b04ba1f0c0e0633ef320c1696181cf3ce153221b41ee8b6da560d32e8f224ffbe87ee922094d4f0b7a289036ab281817a6248f426867c88444f1cc99ce8a9a10cbbd02c53f96bb00bfd2e49a8210dda329c0219b67463b3325e035e22059b186e112bc94f5d1ad46539b184ba71e76ff3b10d1b72e927a60910893702040fb59950fbb7706df0f7fbd892fcfe1b0e784016c686521331488046282bf9a1e102851c07ea4097e5c416353e6fdd61a3332b3dd019ca261b4dc49c3109a8fb2c607f7d08c6b00bf163610f807def2f9f56fba34050538d99d56a75c3ffc38010450e4475a3c0418b28706802839d1714492a4446d94d1e1a9aaacf492989f4207b41af0f394ec6df8e8589c95f9ca1505297b5c550a575595bf4000a2475594740d57087585b14b1c7061d064d071330aa39bfd1a097c06f34c85f8c3dd188e4e1ad1103243d4e21a8a9990372a0076d1c08fb9ac66711360b44036c21b10390da3ccae8d7153d85834aa562140a85c2698ef10938c414ff487578891985e22629a0ab5245e77ac40a545fa1e664548fac8b217e34673f7ff9ddc55001a129fcffa8f27d7e189f3f8f7b427a3f581868b682669a44a2747eece8fc9a0eb4bf311bb675c956a18c1ae32ffedc0d2856c3588750fdc36e8728b0b5bf9b85f1974fd0fe1bd059c35837fe5c1b310be32516f6c59f44525189d1b130fe3e348ca94445ff2a2b23db17aee9ee6ab6073ab79b230f89e9e6960f97143d970bf8d7ef942204299c171af7583f61fde062095dcb621561632d816b24d4f09de0892db09ce8e18282072a6600042453f8294213d35297c58227b06009b38a2d43d1fdc5b21d5cb21da49452c6d7c0c2e8ac8dae5cbd19a2ceda908ee33378f7c2f5fee14881621faed0eae8cdc79b758322f55b66bfee0643ded1591897d315822026a0f0a02b8514516a01ea4ac112aaaa21ddcd4f8583a12a0593555d296ec0c454578a1bf050b9abe1baa00b724ea03bd858346f1392216950cbe8e49971333e1c0df68c4dc739816ebd7ec637885140dbba2c1185092deab2986852439ea22e8b092295bb9a2e07da7125eec6ddb81b574629294b3ca9cb5ac249ed1deab29030a9db7635dd10daccb58ccaf3d396a1cf74662ea419dcfc156ffee5f96fd78a765d97b77da7fdd6adec5ebf72f550f16c64d0b103e78797e3e934082488c7a706996fa6a05ce3f7b2faf77fbbc2b3c531c6f8c4d6bf2e614c37847a94d7252fbe9a25cb8edecb5cc5d6e1d0dd4057dbb18323c70513191adc261c836da50e7287c6cd372db29295df3c8ed2a7068770ef1bc775352b1ce7cf2c39aefb6db49245cddb3abb9a58d379d77d2d5d4bd77dc79d4d7c1fdccf8fdccfe77ebe7fb6792baf79d96fe71ca7a4657854f42ccf1e8cdf3848b2c0f0b806654a104351792e7228dd9c0a194a95bf392ba123de1ef973919e66947bda86924eaa7cb04ae669508e3e67dbd1ccbde933f9c74592d01d9cc7bf827b8cf5ff41aa9d7be71ee3c19689f1c98fe16db710ceca492448b88ff1528c6f8812d9e7f0344af8cb07696c399f79eecd685092bc0574e42699e5be6f01e51d1df7eb997b1bb450967ba25e52e527515f78c3e3ca282f4215a1a24846f133aa8739e67240bb9ff9b84883927b322aae8fb60a0eb62e047405494f8c38a0fe31fa8f20082cc3300cc33a1b68ff34c5292809dc38ec376e728f6d8f7113dbb06d6ad9c49cc8c2ed99d460c6d2609665f37ff33a10689bc6691fa7a0a496e93e7b701b75dd06b99f5d37fabe41edbbd762aae692b9405524c6186b40a3bb73ec519ec2b62ef3499c82ae4f6424ecf3212ba931ae54b50cfb488c7d62565404446e11102fb1cfe6e393621eee61137f9c02e2a559747d74997d9cea693062fe91fc85e762429d7d90a87e580950cb6471c6eb7939d673fa5c3efe12bf8b40d9877d483e9d4f401a8c41a6179472dc4def8b2f7d7240e5831dfb5bd3c27426a0fde16c613c6a021222527aec18a36c29a5945246295f4a29a594f2331cd0f8327e341a0463916d650eb4d33ac65f1e32a01d45fbe9f110de69904f0dc69f2f7feb38edbbaea6b9ae8633e6328eeb6ab28ebf962ccb3e4be96cb6625f0bf63eaef9fd38de0c5dcdfc783418e776d3327bd360c4fe67fcc64ba4188382de3dacabb9ae23ba9fe978c4ced39066bc4bcbb03c99df1e465b40fb03bdc4a7d369488b667fc30367866f3d1e425adc3418ff06eadfacddc0f9803a0bed221394e3bea0f2f7493396dd5b4ede83e1a30be39f01d17e5e1842b04597186e360d6dc5168309a94a396f40e3af1099df677c071b04b1792f1963b624c618a36961a2f760054aeab2568024a62e2b89281b6fbbbbefc6955da2bcd5c03534d5a8807d891f458d710735be9b16267e0614f2ce47a34130ca0aa166475283fe69bff37706148be1e49e406383f3fd9bfb8266df9ab66c6e9db75db996e99efbeefb1975ce2ca6665fd61b73deefd351b0adc481b66cfceb12be17e7c72ccb5e485d2ffc10a732a7304199b1e884e3babff7121d9bfd925d745708e13339debd3ff5d228e549fee23ff202a7bfa8840ef7243165340200000000a314000028100a06c442b1703c9aea7aee0314800b7e96427e5a9b4ab324097218a610320619430040000004444483481000c7a34f35de552abdd70aeb4e6f16209b41ec568a0c4c629fd688b23e1e16e3aba70be8abf2e7bd73173ad99ec3aed6f15b5453c2f91289f09f4ad4f7745e8ba7f0a535e0769b01ec008370b833ca950dc01a9dc1a8729b5471d339fe818047eb923250c34e30a3a086eb00e0876220aab53dc1863243e67214dc410a5cd80591923b6ee168c83461e9c1a0b6174cce474944830ad35143c8ba42f76e9701c5a98c1bfaaa306e2ae83e80f41b4adc882b494bf95ea5616153d4312a34c67e269b6207bafc9597026b2ad630c551cb0f7088acee29e0a34addd5fa4dd2849634edcbf1062ce8125a7861d39ecfc00621ff52113764cc3b4180b3a3c1a175ac5037e074706d819ab2aa76141858341258b12b8ebf62aa576cdebd545ff95b352ffba6544631170135997e53b664c0a74504299347d524d767b4c48d6db962949f8c3485e61609541cc7094cbe9097c30708c1f6bef675245d3823dc5dd50ec516ffb0372238bde4abd300640d39d9db50e0b1781713491e03cf81173ead9e339e608c160f1b1826bf576fa22782d18810906227ad68f1fd6e4a274a0c87948299cfbe9383d065f8c4f5a5aac15cf976ecb2f168c5fdde6593b9220e7b2ba4880e8eafe71698329a93cd9e18d4353da983682a1e1f7d7d6815cca3b2c65cfeb553629d483c58f86fbd21b23587e5d70d3babaa24dbe693eeeceb1a4a9b742bca7706df97d06e900666790a6c462c99f8e2e13f09c0045f4c5c9135739977d508c11e3e1de9f55a3fcc7616985ed262dc1963b56d7437232bf892bd6fd1ad2a941e193ba87313c1e7194ac9756b4a29cc8ca18fa2d66bb05b62e6f1b4437be74a34cc127613dcdb511d2bc9efab0342ab706892a258757cb3c140892e22d2ff35ba18d8b663eda244e45a0cec0e2caeb523e30ac302fee92404ce77bed96280e554632d0616ee394854fc89f353cc734e0482aa47a204e8cd7d07180a3e841b40544505bcfc04b113565cc8161915d6efe518125ceeebd8cec4b6b112b1e6d90359a160364b4f066d23bf6095a01866d711049ef2ac379b0c42df94b01dda4dd2ddd7d6bd0730a6ba593a71ad775383174c579c66bdb6c3a9804b31fa027925234190616ee505d120444c2258794b64486cf8d768a416a0b1716ec1212eb9ed039384126dd5f58d4ead0f378399014d470c2fdbd5f0f28c40e28e1aad4d750bb6acdc28b6448f0163880a540530b705c32730f805a070372d8cbb50cfde3d89a573ed7f7225bdb40662b87fd05e215c451ab3e330e3a8bb540f25136daeeb051c3c33a12b305e714102fbe2f7a3396c558b2aa88a0c7225d538a546e1f1f0c71b1ca53c73ab7b3e32ff0234d451e1bd5cbf20b8678737848a79b15c15a230bfc92190eac3a3dba5949a6fe0d2a6c29adaac89ae17ff5fcb44d78dc82d2941aca04c6b8a12b685c8cc9f4458621a17bd97d128ec089517c6a72c33afffe43139a98662c3368abef2b47a1421447f519de32282e7209b574294f2f9e18a25a0956cb6a1bf1f182c5f513d5b95db08a9e80f22b414781ac4c29f92d5cf6ab81e3d8c2fe3e47a910fc72825e23faaddf88d6829393983b1426682933a7dbc026c055e65befc98124573742e82ee497eee453799bf996df25ee20a72cebd47cdd7c0c13ec572f54b2260b700d577efd6b6087f50b7587019789167c11200b717e5f1e3dee6c8fae63fc764105378b26d4164630fb6913179f24abdcdf5371e9433b601700d175e3421c59aa799889693b033062be4bebf3362e9bd6a8405ad98bb5603497ed2a8ca51719c512a3a4ce745d655e124ec74f98c062c3dea33d750eccad89a16e11ea229001431ec7419d52bbf1029be2fb2968f6853316fdf93e8ec33c5a5167be8cb0fc049b79e5433179a2fcb583a66f683bda35ca889975b3e2891f7976bf5608c9507ec355094104f52d96520cf4f01e81e85d061ffd1a6fa9642ce4351db752b2dda766f7a13cd1f24ec578b6d69461ef4819ff4910f8062ce1108c25eb2c7f494246bcf729b704cc5afcfb6dbd02f640c02cb92abcfa08ac23765f611afa4b6999451255b80b124f7e8973120690cd2c618c566275d335d10ed994a92a837ae335faae0106f284813d9ac07c2b238a5760a66af01e8c904dd713b679fa0ad5ee2d35fd01dd149ce014550384d4cfc5c922e17142e6f6f9336595ca29fbd43991c14d57503d849c4306fa12ac19ca876a88c10db65b54b159141d95ba97742ddfebfa6fae5318b33c833454b0eb0e668a31c9ec7d6ec592b1d363171060bf245c2c66779823acdf4a4832b2fa9a18179d6230883855c1ae51a904206c60ac3bc46f0c22a65a5f82fe4315a1453b6a2f15a0049ff10380a409cec343e4899fe93c853720452c72c2f6c29336cc32e24317e728f8b12eb50212b4b425e4509c61ba6bcde08f5c8e12decc79f402515a7bf1b93a25bde396596b370eb93bc82d9c2e9e621441de0de4d4f881d6447b68cdc4d3c1c5197bd05f9bbc47817133bf829ed7331e444950a5e5b017831efea5bb0c1e531ba2453a9ff45efb60cc86e0779ddf16556110508d7e5ec496dd8b865da632a463121c33c44da12e4eece05828db6190b3258245855e1bb81a6da34534cc59312f07075a4f734ec7753f3f52bded2a0823585f00f4d9089aeaf61deb7ed14f10c57fac4329a390b4a07b879cf0ed4aef106dc30de34eb6e1df173d03461c53d7dd8c9d7d3e81024b1ab9abf744dbeeba03aafdc7ebe46950899c90fe128db527afc9664caaea0ca1cff5e69e1cbb5e5cf5a1981678956544ddbb1c959fd5deb28eb2cc1a39384dd3c98cf8a41eb261f6c48564d181580c28e6756be6f313dc9b427d9a18e446dff66dd3f84a269757bb8f2653f725f2426af4e091aace5bb3120e7d043b1f096e5f8781f6cc8f21d0c1fe3874660a1523fe305bc12c62f0d80e70f381c2d863528c7df49f948b920b455bc5f1b6b516f1e37caa55d4598dac7f28574b158a58f9830612025b364e51e53b9e43e2f94360f4b94fbc0e1e7e7ef068735ffbe87d71741176ef09a4ed3a4163f3ed7f0ab4187848631e0f70b3a184b0cbaf6c8ab0b8293b78a66c5b7012da90d64fb84aa3ad0acfe332cfeba766fbd6155beb19078f85825ded44f52eef4eb3dcfccb0ebe6f43584298975eed85596add8484edc8aed6a1e4bd8284cb151e9c0064e515b992448701f35a6e1bd20a36337f81846a602affc6d3fd277e98c34712db10bae93fd80c1f55d09b1e5ddd06a906bb8942ac8eb50546b4712da139900dd2718a503ee5cc26148be8fb0eb148a0ebf7e624c4cb5138ea241e40b93d72aceee1c5c7e05e982345a8704eaec8fb3ee8270396965c84d782871e74db283a08853eb942a80765baeded6aaa2a383becbd9bc2ae4efef80cb0549fa6e03984be5a44fbf1ac89a0557d7963b64d3ec1dcd7ba3e287ee45205a6a73358d006f2267855d14c0e1c8ad5116ca2dc8cc31cf40e17e46b2863c3f01a246133cd4cbdcaef6dc6659d97e3950060111b54b8fb40a642f3a939e8fff046c329db54e16ae89fc3d76d726f4c64431a642c93effd4a6528671abe8f5767a97fe32622496b061fe523523b6680914307618c74fa0dc44502ac87e8fb05c96f7a04db156b9168e899910630952b1e298ab71fc0d0e71a5e9e0aa49c9420caadc7817f7804b92b83570ec12b14e67ae275fcf8536b4dec563f25ebc72111b7f6d8da5e7e5dfa86683335bad0bdf18e04fd670dc1fe72a5fc7747d42d74b89e2e6fa2084624b734a1aea6be00aab98f177051160532054475049e61681d0607f7daa4462f3095e2f99ea75bb5fe952d91d25b1ad1caa81197e676c9de6dc3d4a47c7f892b5a7b6762ef9410f0f670b2407dbbfa9c3aff03b62adcb27fddfaa28889291a03c7007387b4b6cef7261628644772cd3c404394969a9ab7b722ff9818e5ca07c449b5f37b3b8f6c02702b9bc5b3f12c8b8e98cd91f0eca10058e61d000e69f4c46fdb161a1753ea17c9728d60e56d7cd759fe2e768c04f06e07728e623c1026f2d7293aa8daada60ae0dbda9832dc9de9aa188d73cd41c605d32314522736d2ce97ac062f09f1ea4de09c8afc9c6076a663485ae9b7c49b7bf8182fd6023db1bc4dce601a0f8b8afa043b7790c00122ce8558ec1511c5489c5641ed7595591770a556fbd26730e0622d51f16ab879b6eec4e22fa23fddb72f0a68603dab9461c013906a2204b2e0d1d08da6a747a58192fad5af9354861553e130fde921793742065f299a7b2f1693971c396ea70735c25586b8df8fb3cb664662b343bcbe7ef82902f15827f8db78e250ace7f3f4c2428cab97d229f97bacfa924cb2996b651edeb6ed085bd23f8e934c5728a3d257d6a009ea29f7972b8187e5b1b7ce030ad3cead8e3fdc2797e958f31677f9e79678a6049adf27991e16ea60431ceb31e8ec6378974d1fbca0061cf0c62204a78e35e03a8a87c579f21da5a20feef2bf17e1e2832bbd65e69a236fd7251914d1326b189f76c132d89266c96b2a57ca00ddd37d8d2fdf46b22ca8614a04001431f458150b113c3f27a49f05da4c77e800fcb43cd31147f8b912b9386b6b1fec5e997e4326e29bd4d9e1af6d61e198c5bbe20d6099b1d41d4f4036eee2e6c5fe3c826d8cf2de0938d8aac1db8533a515ac3b1bc5502c8b6ff20ac42191d4c95aea7100055be03c8ec40d77f631afcc45e6917f1360f7dfd151be490d148adeb128cbad4934b118c4c06a59fe328de4fbe2827740fcd499674025168496bb78b9db69fc03a7ebb6f8a0b86bfb12f5d1d1f59b2eac4b5d0436edae09eb0462ed641178a7bb1044e9d704cf3652b7aaff2ed7e7d484c0f600cf170a825961dce75eaff8deb458465948ffdf760af56fb4e5bc6e00b9f6194cef59719144c64e5cad19d214bfc845ca03fc0345b338db83f336f9b703c32d7e2212b568172bd2777a75c82e67f5ee7e3c0e7c954b2d6c6b3e44ff4e78b58c4cdb5f30166e4a0e647ae12c91c1c79be2da63c60cf7201795c897ef171e0e002431a3f3cb2e1de1c8f0236c86eefb3049a44c6134c1aa40b90ebbdb556d04959ed140bbd1d9b5ae9c9f558fc9e0fcdc8a33c47c220f3d928663f19ee4a474808f86393863b3f417aaaad6d265a9eac11b7244dbd96c789a24bcd385b93d03beb7b373bbe9bfcc81ba4524d1a3eea8cd6e1e76db1a1905e6c6743c813f49c73821a1adb2532f8a0f280ca068ac24baeacd7d63ce03a6b95c1e6b7e027640799536da79308fe0566437bc6b268f430739fb2b89c48f03d86886246fc2e2486ee0bd0fc0f334009f038cceda5438ed977ff00f78d904091c70b84c88d19a49724425b2312be706d81ac94d5635951a7a92e27eddc5f6c95a52dec6e6a49c1e753c83e27d94c557e34b97d0de8f76cfff86d6398a05d5c1f01c83bbb94b59b080d5af71b4736542fc49138a20ac0edf842fb4cca09a648cc841eac6dd97f8ff39687e450b134d198f02260962e2c0b0c6945d752ae132dddc95966937d9fae33824427ff0c5acc9af0d7ae341e216cb9ec3f18bb83e70886aab2ae819910c4fd4cce8cb0a4a701250589aaeaae21b160986f31019632e82c42c7cb22a1d437da4f47f6e545d48d2a7e2ba42452b143ac8053e613e20fe6c67bb08ec827650935d2a33f59eeea5476614ae08fd55d8a8526380a931b05f6509adcd91be362e05217d53b6c5025d61488a74abd06e78e5015a81800227ad452f629ed0360040f68f8f0dd045536506dcc7558c7d16a42fd24e125ef13bf3fa31e15f5f5b01dd156e1799cd86bfb8feed2d352a2162e0e1d61cf958ca6e1942cf478a8ee8bb5d8893c6a16cedf63890c857a70cbbc98b81f28084ec266bd7f5b68876da5f733434ff4c7ef3c390e6aeb059b9164738c08f643686fce11fe7a1b26873e2a3051337f20c9bff9946f3c7e9fbe5fa466e996a75668a94bd7b3f6257e140b5c8025c0d07fc462788592a8ee34a5237618565d24e294b98134b96dde0df2c3719e87585afd001b18e2b03554e1d1ad955e72b7a2531c21ea473c4db36a02808ca101e1f4871216e1cb6eb5006f75ae5063f81ab888cf88334f7b441aa07092d28c431ef2d9a7d792dd5c520f9604ee0ee7bc019b3909fa93a16d4ce40a4a2853e3fb434fbfa0bc58e2d2b6f516f92bdaa2257adf8fe8b541d9b2e60c8251136e635f0221d8451bb884a5c00993e7ee7f13b0c0ce5dcfb7880ea4efdb7c4ad3459ec02a972767bd2b49fd44d6b52e82502d68d0c127896e3b71848820fd013fe56456686b17abd401c4d7b32082d7895b52953c9fc85afd665cf215588a4bd07af81d0eb009494baeee0ccaa3bedf065a29feab58f796437595474ab406f214db2bcfc5cf600b3cc5439b9f11fd62b58b28d7610e9f811311e0c1e1444e42aa3d09696e9a613def397abf9697da9d8b18b689574991b6f9290d29c2383b3875832761ad1bbe2824ca6d965eebb340e4d718958ddad5c497d147d5cfa5c15177af860540af3c8608bf98315ceb90f1ee3a748d210213b8a35567d90ab16d23315ab19b55328fb5c60c6aa7f5fa8264a2cfe480df7f0a70bff873c99879275c0e978f338f44f1551e90da4e4c13583a8036202c74091139cd77560d7fcf55c393061f351f404450fee32305983df0b6b720bad99858a9e4b731b064fb924b9894fc8422ff437a508c377ac0b2c14eb936fb5a6d70c14a0cc4fe49a2e64689a75e74b1f57a031a74ed1ff8550bc8dfb114c4259ee2b76a7a1336180b1b3ca36ae4aff95c58886c71056fd0d839df548768132061c57970822947e0fe68a43a419b5d08ef9bf05b8ad43ab75f732bbacc5e69a53ace738b1a7391151706ec5bde4cb1083ae0aca0db28091fa3b5509fbdd80158eaac2ceb7df840180cbf62fbb480d5ca14d013016fad8e18e1c320c0832b162253da155e75dde00a1161c7f573e90553de3ce630424afdcecc75f306112f7462dc5a48f84aa404082ec05a2aeafc03dc3936bc400c1bf908910a7ce35536e9f3f37cb929fdab9000c10f9636c82ac80c27c8ccacb0e701abb2c955897d976d1391c3a8f4455193a52881d6f180a822f54a7aea4058967532161f34e1bfe54d54c6d00a02565d48443a50b2074f185546df8ae675d9c8808f25d74133bfdad1a5ff8c5a4b939b44546f9869d574d7cb82ef0a1448911a2fe97392abfc07bf0e2d8362ffba1208a7d5e845e58510f05247b32c69377c99c5534f70108c2cd0e43b9c037df4a122422f78336981cffbcb9f74dd955ce7ddb23278d53ce0e6466a1bf41ce0e7819ef58c1792666fae8b2fb36ef527ade19e05a899ddbc324430622088a99f9e9fd5c4d760dcabd8a151aae71ea06994f3dd4924ba254b78c487dc65794068c56abfdb1e2fb68bf4ddd7f1d40d6b918623492678de63914ef891461faa01620fdb98c99d7e6ec2942639731f59e1f9620a0ae0c4c6e334d7e7065223d3f06248005d6fe6e7a2882e5c9e60fdaee8e2563871a1f59c8445216836220e63333cc1b0df09a32488a441886aa73840d3c784921e68931d0b3b0127aaec8a028177b58352cb0e877af586e717d9c8b59f8c949319aa5701fdd56145bb123c0486c1fc9c9d905a52c758086cb514ce3d4536d61d6fafb9c4790815f64c55559e0155ae1f3723b26024c0e566c903ca8b713d38461e298f2649c5e45b90bf51f1f16f5b7ad9cdce6467101c0a0252c2423950f4ddd8f48b075e11b9fd3128c31cb38a3d7f8dce96d6dffe4aa26b432a3dbd76d593252334e9d45beefa44e649296c7b3b6d9998d5a74e0ab4d5acf0cc23b02ab7a140032f408925072b6ab9e6661c26493732e2930afa5b6375d963e61e1c87bbb09380b049fda86c5b528a77d200a104ea905b0e1050af4c776e3caed0cf39460e7977bce02588a837f9d27808c9ccbb9c7e4c6e14683cb6e0bf015ce195dbf56f5562cd1f0cabba76af858b5fcfc6fa8c2e52459d23d059bcd8af452af8cd89227c9d6ce0965d66233c18a81bb615d2611e0921c72de018f81060bca4a587dbd322ef59059d9edb33d8a38d938c1e84585b5ff50d9756845a649fb908c4cd2fea7b2ce03c87de9da5e1f5dfbb76b879d77b23c40bc995cc3252b45fd74c0a095ed59375a9b35b1f749ff023cfb4eb820a63579d4ecf38c08c9774bf56649c96048567c9bc522d1383421e48683f44bcf8b77742e00fc75a7900adca45c997d65887e4f26d8a3e15c884baa4d3053c52f00ad721173564be27d27dc89706b29cf0e7fdfdd61870526c8abbad341f3fb0674d01b257d62c59945aac42cc1eeeb574d53a3e40a0c6d9de5488def976b633e7ec3af0d3a2f9662f605a06b95a1c04b0448ffa02659123a8da6695c6cd4016c25d3b6778c0f19b64c899c6ad4b0080ad170f85088288b6863692580359512837c5493ddd7ef48da6a8da3d27e4a22fc9c022b669a23cfb1d24b8589d54a094bb697b6e4fe0995b44072144353c6da23ead233f3fe2807af775084fc7826b8e18c25ca2b18acc99a43d086d5e43aa30fe54d13de753ddebe467000866c076891323f81de29d3f15778974e3581f4c85f49f48e0f1661ec8a10f7d6cadf53101db22f45e43506ce3191c6118715a8991653ea078fe580b9659d757dd7ecf779bb4497946dccf77edf511f68e8e532cd3f070e702726854e4464312b36bf873d9359b3c5b270de3ccd991bbd0df8e5f8719e87c40e519ac746fef321a4f06db80839a645203d6d97083d4cb8a9965066204b10672bc0b3246bdcc495cbe1bbe4ddc2939d809cac3e4fb6ea7114fca43364b388721f7f35dc66f2a9c6186f622c64e86be1c1daa35973b9dc363ab4ee8b9c3d3d5a4598af37a46e83eda67183048847f0f54aafbf836a4d5a414f63b5f66d2dc5b6ea3aa8d0c40e4e91745e389744544727729c6c22932e2b8d5a116dae54139816125688c9963626c8e1f800c68ad9a63b3b489fa87cc5d85313c3b9ab48eb0a2a76cf3db85ad71798006e10650d2c2b9beb609a122e8e7da37970fcf10924ffd921700e0f263a998ed71e4f295ce51e9618b3e738db398b1fddfe45cde0a6a947959cf21f1957ef02ef389c9f5750a0108fe81f0db6404f776441f78194397528af46b94a6bcd5e47e8fcbbd3633499a6d8b3d6e6f74e052a0e426455a84205c189ae8b42d3840d34d509241a79b0f10f320a42d66a3364c189de7f21bb3a20813b81dd1d19ec5754038c7437e03a565ee41e14df5cfb7a89172f645528930a6a7eab7f46fd2fe0909bae5f23e58f0371d50aed95bb397de328549c18aa5cc8669039bd9f27a007a9be300ad68fe248678c5fc60a2716836d347f01d8771197849037485b76adb58030665b4503242b5201dd6769982520539f999b0556b75169706757de5df1393cc05979e20dea1228f1d705bd4bbc584a66163524f3d981d240c13944b1d8b8f89f121f31e1644e1afe8bba4b6e5e7dd2db47220cfd262898a98120529cd068b2170d9d4543046ed31293f8cd8534551e453b951530ec51755d299294ba81b2498b7dbcc2424863f87966bc882994064d56272854a4ba5a600f1a325d37b54dc6530809f9fe3a0a07a64c1af067a80e229421e7c85c81ecdf836b5986fd3c7fea3c44a0e82a1f439d8d2daf545e46348007310c887148dcd4890a91a83275627d71d341ac3a957abbdb65a6947b05c156ff525d0876f419764986c74706caf138bee40b6503b10d75ee8a57d26ae4644bdbaa19c0c89a4a77d5bed40fc879a190eb3ffc6e994cd7999910f91806e306116ccb11592ad4770de600381df1d41684b507e23456068faeda0444d8901209d3a2c9514e2f393417c42231fc7d6557c5489d03dd75686a3303b77555f49b089a457eab12b318cd284aeede1d11f6fdee70a9c742785796be4910e91686d9fdb785b60f6b1f9e449a05a1ce2bc3aa723f80c75eb325f542a0fc2029d121f04e8b0d6aa6dab584a515b59ac5afa6b044152f3ab742f74b748430027ac017dc73ef2874abd48a5a1b51fca108d412c334740deb8db41caec129b39343d5ccf5e539a7cc335a23dee54fc3d7b8f62e414483aa62f516ae045bd3145b67e977be0390105dd025427802adac5172c8b355eb03beb13ef0f1b0e7ab44cb06703d8a0250ffce0a5d889b071f588845235d6030ea13c0098751e7662f8de215269d67170bcf69706a682b6c026d2ce8bbad40ef38b04e983f3001862966598c2e25194d85b36e747802efc6bc8478ec8cb6e703f792f9d509b7dd8747ad7b869fcc7e21bbd7d2288e2e3745f8325841376bd4f814b4882258f08db6e4764428572d676e2b32938438e6b35901f2a181fb3a0526653d66c5c20d350b9eddace61a4aa3aadcc5bdb4e02f248f910333a4e0133fed50bd5cbd802d99a1ffdad55ae88144d2730f5fec85d1d303ec51500c2cfd234fdbc4bf9240b69eac3c212b91ea67a5b6b674f6e1a4401864831376ab7a1b83b014c62a4ef6bc577257038e482171619272032074f7a5c08db22efe7ebc1420599bdf72afa4434bee6836f05c1372ac55dde35854ac603edd6a9920add3a7e138cd470e1901009a82b29f68fe7b13211ce0dff95e770bbd711be1f269fdb43a26c3326b9ae9798e63852e4d144925e228a52b5ea001e6e46db5d5083eb098d07f64028ecb73e7b16e728d5a7016d16d70ba521144f599a42b7f4cd2031830724d9f977fa4bf6f12ca3c336faaeae30d2c50f527ae7331e6895de3973d6b2e151963e46ca8ff5bdb77152aa3a86453968d37b4cf94b7a75a175c37aba1350194009681c29d64e876e8c00a86c45d3f1fac464ab2bf01ca548236ae4a6fb552431d06ade0f1a2256fa422e8ee8e39b83459512dfd86cf70736390cacec5c57cdd19188f2cb6baa497d2f7b6936c4b024bdc8d4ed843af615b7c6c7176ba6377e715b0d5fc39ff3332e2adc58acd865028258add8f5c4a5cc0b3f777c98e301bf2330cd46589ad8cfd5ba3fd90d47d4b39e33c5519c52e4a827d1a823addbed87f2dbfecbb57d15011f4bb6ab1b4114bfd483ff28ebb922e5fb79ef1d242d3fe3d4bc5e7605536b10911362672554da71d772653750d841e1b1f366fddb7a3d0e18b2511c692d06671f60383f2c2819097f721cb6f6440a18d36cdf4ede40b5be2e57b6465ce6d0ffbc53ca579e433f1397dfec7ab6c8fbf6cbfd575006b6aa42381972d926d317224bba97de7b4fc4a11084a1be9bd7abb1e76e58bd84ebb02c9ab2c520c2e11f88004dc73d4c3bf6fdf3f15451eada6e38673a100eb93e6a86a255cf9fb00118871f9671eeda5f3952afda3570657c0c48bf835793a6f2bb1372c7598da22fd8d3830f5ae341dd11621106f2f72eefd903fb3c11995df07004251261bfe467a96c8058e8d52a63431a4c971d6f620cd4d4a26df2c949da72b16fb21fed4bfe335b981f17b18b779c63e7d774375d207530a635d81c3a88c89f28c92776a5468255d9b904eb57e881b882101da53e63cd786e9978b29157e0ccc1eb04002348640288562202adc22486d36000263e1f5adfb0a3c9f9810ba85fb5ad414446808c3c08b813b313d70fdfc2a5d4a94eb929940fc233e10a84fad0ae0881a0ad0c88fae762c04a07cfc67b48774ee9884e8a513bb7ddeb30d7c5b830363a021980ae6336f187b4800af9382568c694f91b595b681e3538912784921cfd70430f3e827d9539288e8b1aeb11cd8c6fdc5bac568808d3c44e5fc812d890488516743d09ec05828c65033616950f8336d485bda39f558b9b2d127829f212427f23a185ce28bff376fc3eaecd498b35a367752010743bf876f152dca87a63a3264ae28694a9ba3c3f24aa6028af0095822acbcaf3c2a871e0492849bd11b8651f4971876017b428b35c795a41322674ff56e788fe29857fb3d5205b54623777c96ef858bbbf81dafa4f89142020f20e444b4527ff901f5ed6d7de438e1f23480c9c89d2d431d1c99e045b28a4f3839b5fb3b9e62f85a8f741f69549acb07df9b1a5d9b39de3ded30b763e6bc173bede760976031d96fb95bc340505a8bff47288800597987ef61755e4413053ca0f553a4e30a4ce5da09390e4135ebf4f991b091fce9a74f8aaa04ff038dcef3e104203fd636c4399e8b0c1820ac082453b3972b2f1465eef753c5dcf6c1decd7299051b540f5a12b7727ec53dcd065351ba042205c9d3cb9481274536a8cdee082e4308daae03e27c95c8812cbee6c5400d6f7a1787df579b94040811fca1149c0395db323901ff96c2bce88393699abe54127435b2373b5bd5c035726aa13a08d9dd8ef4094a5a0934aab8875ab95a8c604df15c729d0ea30143ccb3a11774501162f909a2afe98f3f27001b05356bc667392875493c3bd0bdd220121357555b8d5ac245135872157b5c30298341e8b1d9430d35de420e54652e24899e54fbee4c3114f8bf5fbb178a0078e18206a4fff3ba7e60910a36285a2fee82fb0a391388a1726159ae0c778415026096d41a9d486f3b51b4bd5a39c735f7f992ce2d07aafca0d14f391a5305c66c1d726c84b44398defabe98a19e4a0436446c60fdf3123827cabcec5255a625c4fcefc22468aab3f99431ff8a7c2614f2f15754c6e87343c50d45ca4726c0b93351f0881573e626ee049520d11489308365ba03a8c8cea64e9590dc43d029c2b46269f37908e74a377945b28b5887d5eeb98e3aab910dec176d4ac444de02d496eecfcf9db62a468498eee52fe3953a245449f72d06f7109d10b266854c3c6025aa039522093f6e5351978f8fb253bf38a40b1490dff55a5f8728c7bb719b5e7d48820a51b6c70a78a502c0deb8343d2801701a046cef2994150a29080280a2cc25ecd81e30a8561ea94908e239b9a3cbc7180bda6f14e5b6dcbad1f06869413ac42fc6de3ab6a8bc5744c4afb2efd7aafcb4bb69b711e7209dd2f20429704e84e03f21c8e96e2b5e555e19961d6ab8c06842746d37884cde4975e78fedd6b80d827afc7878cc48c46817ea027f840a22be9207094b4d994473b9aeb6f7edc60d5a7a40a180bf023dfaa40563a928c9f18f6931d69c598316aa24313abd4380066408f1ba8745ee8784bc53cf0d664d1cca5ceccd8ea49e7b4150d6de43ecbef1906678103bc49de227660b0a8db85488199ea9d0403bcc49d08b6e84837a1615e9840d0495feca4580b3696eeeb5ca7cc4bf587f73528375c0cc5d286ef2f28d8bd3a55b75ebc94e7f43c0c869e7bd7174c520cdd15a2dbf532127f35308cca0750642d7af0f6e9e617b3a7362e6066012f47fecc1e2994488ad8f22913ef128779208e75cbd38ba345d96bba00eb7e653605294892a5cf43c8bd3f94e2fdda53906c2d47bf16eafceed231a3b21444bc7d283477e639073f749e83eda0ce801603231a40c3b464d09e3db133acc8e9a34a5ef17a2951d9b9f71a6b3701df6f6266b3e8b0e189a487c764ac3fd092a893e1f7f10ea2815c173bd4454e9a26fbf58192d0b81878d1405077496e9b96521ac8e67bfbb51530054759ec92265431c95ee853954c838297a57a0ec42ba7a4185a76999f878414c41fc93ed2cc3a1e68de5922555bee6144324ec2c2c799011aa4616e584bc9a9d88fffa756a7705abcd63391a301f36d5d5c10c952984f6cd86b19973687c3563ccd7ef788c944f6a40e9f3e4a4f2edb670d1dacde5f20cbda0242b235ac76b3b02293e6c4db569d950264ca70aa8a77c06f821319aff649e24d88e27114cb93225b2bfe8d3bd13e6e2c30405ba11954f180453e2256b00c35b0d0c20d7905500d9097830500ae064cac975d38f245154642e967bf9c6200b1e407a089b149f5159585efcd5f4fb72e5d683a6ee7bc04c6f7ec9caea90a0054c5d0058a82555e159321ae5a1adfe153df817958fdbb083187c63c1b82340c62225a0ef86b047eb1f07aafbfc1d858620e94627c17accc9fde5af8b910c8439f9eeccfd21c7095751d9e33981b5642987b88d41133d0dd9bc21fca2d313eb2b4b6a8f04450a9e3fd2a83117eb2010519fda9dbf3c185d2e3335627edb45b8e8f28dd83640247068a6b18ac25779fab17ea971d808e33472613186eccb135050690018a04b057445e2dd794d33077af0f2621b1772810d96724eb098996c8191f5d0ffbb0a31a7b15da2a33b092b36635d69846bd61eabf22c61d1d8eeb7a5f15002b865b731a35aaa1b6cf241527d46a9c490b3317c7a294822f1e924dc4c647f731be6485731429b4233344e9c6b1cf6a69779e66d8f60ceb850b78f3bc790d8f8114708346e2aa120e255649f29cc269116e1375b6e48a319a088af6f31e599756946d8b0102a003f74a3e14f128cd02bfaf13c444b9c4f685396b255e86cd23810f889e623490023528600f9f2f74f8a835b9d3e2179d6b5fefe02464e355666670af8dc675f7e3a6ca29d05dea2b009bc38ecedb66bc93c43aa2e69ff976beecd38e7acc55a8f463e5631e5938f3020330f107c0d2de7b01356b9f1d80f1b0852f701b4ce5f232408e23ae9360b8f85d86726552097ee3ace3ad3aa3421cd9df52bff1c696b9479f12ea754bf33f409bf037d57aa38ddd1b16abd7ab913331f75eee08003ea0cfeec33ea7fcba8688ad8151a3ac02c00c5bafec567b855412a122837939588be6424822df1f04225afc2b639b28d1f89e3b6b07a0109c1a6ba8598d356e0ec968a0d574bc482cbd66a297153f2e6ad3b1f3cc65ceafac751a6dcae8d8a4a8dc0a3e5925ed746ce6dcfcf684c294096d368524f184361a6e95e0301195a5a71456e3b848c5dede317e6078165b2414b68d8eb22b7c111c7a7057d20389ac240fad8d0001ec8952c4956b2cd016eb703b676a0e21c7e44e0bbff2259e5429b0574e00c552c7ebbab29ae2d8d0306e244e3bc43c017162cbc97151ade38e7dfc78470ccb8ec42876d332da992e76a2c6eb4cd971a8ed8b636b350bf10f5fbbd911d7f011a8319ab22c046f9129c6541144860326b3b50bbd6fecfda1617ab722f927167b030581d0275dfa11099c4fecb3f4356232d425c21719c2420ee38111ba73f4804617a088e541d8defa06d84cc333740323ec646bd4973cb23238d9716ea86d71e3904e62c92771388cd802fcddb1debba247e639bc544c70fed6203480c2425cc8ea3c3ddba953ea03a07fa366425a7544c0565ae81ea498a4c76a1357e5e5c86977dd90b677ade103642e3a57bdfb57ef5b19ce9be912d0dfde0cea3902b85582c3445e29999fddd01de3d6d34995d5e29c6236080c5dca47d8f9a51d0d06cdc47df19a1ac3bb8b5c934e7265724b87794bc931e52bc94786ae37aa47da2e429c5b12f55f345aee7c5df8cdc33d7b20a6e4514e77f9583c96c8c006653956d38b75078a0be50a88db3ea6b3360a58ca7d433240f7cd883fc50d8fad506670c27d94483aa05c5fe379adfaac8aef29d83fc0fd22aa2f7c7d3dbb89575974d1713706ce11d9c657af7d9bacb8f96c4455cfd9c42d2fdd6316ace805c2b8753063967e8479c2fa78ce599af06be720179692b20edc66b85c6bbc12bcb87e04ccf3c93c1fbaf9d87a7a9f1f77598e25c3ef3a00ecc36029d0ea683aa70a2bb31ac565149b0c25b3be9344185bef4e5db17c2adb40a018e742b74b1b7ec37c5c17dbe00fa480d8e84c8a31cd90615e178b6287c1c713a76356772ade306c1690242866002e7bcc41a2c3f3ce69ca8eedb859ee8f6835df0507c88b2de1f452cdb26378e0b87d54e783fdbcf0486e77ec0c5150d8d7715ce8efb799836f30c7093cc9c2ee2952fc25adf06f9552655d0d5051e67a2419683a5f88e2f08e09d6f6542e90e5b34e80bbbaccdc9b8c183ce5170f557969637c819e82e725227aa7f7b1df11d4b1d4dd4a546fe25c04abf3ee010e2fc0f4c9cba69e24fb7e37fa1a432985d4fdbe81df4fd78a7fd6183d5ba76fb75a199e889270d305c6323a2d9553e621d9d30d00126be544287d0e5a3a3e429e573d4ffcefff6b8af9155b6f897ac6ea8df453fb0ee575c49133aaa780ec3f45f5a6521582ee27750b889dd2af23860fafba1ffb3388b8aaa043c086508e78af4815beee0919d978a1b01bee1074e1306eb84722daa899820368aed956806a1c44e080c44c652077f4ad590fc63eea83ad8e7f494c81000ebb9d9a714ee48a8ba78b29c1078bbdfb192190e56e30b499f0cc92794926addbd916adf61ff385d85a57f14176d823d63f8825cc2d521872f8e58ec00c2fb0304e7aa4ceba7746941c082de3f97a02307b7af2dd5ad365bd8c31bb3f4e61dc88c01074a24ea705c44eb6916db8b60bafbeb23624d6ff9c10fa4101a066d2c6be7578ad53bb7580993a6bffac6405efbd686092e4f83770ec4cc9e60428c062cd463a0c58c92b62cb09aae38ce4585028ba6352046e41badc232aad92dad3cd8a53893f79fda7afed48c3bcbcf93a03661f828af42f8374929a4e7f47ae1df8fd0f19c19320cbc57e64d56b4195faa0fd04365f053544d271432368df2b8ca73983e6d95e931797df8a43059e4f060c88e847e170889d00459a45bb08a6e4371020099e67a383caea7eaf1a2db1542c4504545d12b3cf05402e94689f7eac67c53c6f99949abf1c759fdb9a4e69bed3f887402c8377bf199bde497a1d045f5d69266da35ae5784abe2dd3b1298c83fed08c3b5dda4e79cd4a962b7cce29597ccd46df600e48960ca3f92952603562604b257f4aaf14bc7ea91d7c676dcc6fbfd96a484568f7203b7b74833b91656cc28966ca1cf1ab67a5dc80f0d31336ca3b8ff2743ab32ac9272d3d265c771b87088d53211c97149c3adf1c9049aaee723fc6feafc6ecd3ee77eca2a495bc72ec4d16d45daabf0c4c4bb61ca2ae1d4e326b1a142d1c61c957bf4a43043b424b5dd4c6dc3ad49c9091a9b365bd83826620527cf22d1e327bc9153cc4bdae19918414983245259129372fbef5b06dc568a2b467db404fb864e938518f18211cd887877148dd7a2acdce113b6d0f2a42765721527f3ddf6874b5410b8e9f72de9abc82bbac7dd10e5e459cf26c60debf6f3530d588ea61c64038a871b9bb509c6216cf62bb1bc494a1cb09ad466e3e63e552e8977850eda4309a6740aaab75f2f15714c9eab16f747ff6df0b01577bc8bdb1a539ef84a5803e3227765266f72023ca2e4c3da90abd802eb7111fdc101e8a81c11908b87a946bfed9eba9a60f75b43466ce6a7d116ed8b1d542cc1c37e827d7db0db527205dfaab7bbc2f3b6b148d2d0ca1b1ba6d3d85ce94b4931e90d6194cdd9f4ade73d058d2380b7ffb27d3ee57e8079edb992fa62680e708a4a0482edfa2049616209b2b4ff15797fed4ad0e6c2c983d4864497949158e79a81e09da069c7c9636cbfc5d2483c2ef6e953a210bd1a170d9356e39a95f253d189836b362fdf5c301721fad08ac153a3d92beff79b9a4c06989baf5be356724e6830e681ad2284e5d4411d72a7f9cc5e15e2d75dd018230e8d82e40f20fedcd8785cdd781a4ed75e3bc2e993db22fffce08ef70bf16f8ec0b7afeb1c46adb8a1080b7e4c03631f9ae615fab9031fc88debe854438f67933d1fe88d333c598948a99bb9cb586d24ce474fe86ca4fc57c1a80ce03b546c87ec62a1fec558f022389877a7d34fa4a261fd25ee4a0990892b9c354187d0109e5eaf92b5741cd65592ccbea04e3794aaca690736870973accd8c534d49ed75bc46439fb7e4602b2403a734757d27665306481020d58b7c819f8ad825a253fc0e49c9fc0b612f726f4da2e51c15ef7474deb09e924599329e88e207955b354d863bcb5140cfa6fe5af2b06c01c6cf982fcbaf7f586e8d8d46ab98c80fc9d2b52bf787eeac8784e0327d8fa77d0a386e4980ad791bdfb122c0c59f71cd8426db6b3335aef860ca2be42a3cd90fbce7beabd9063e1630662a8d9088533baf42151055cb83c4f5d12cce56d8384cff456d7ea63f64fa3a1b5cb58036aedcc398220c052d65a6252c08e19a38eb23fafc6536d1ede5cad497523ed3edb5265ae6e53bebd7fb20fb6e156f61dd012d154e7139788636f66495dee764a87cdc9c9e3120d5884a77de58fba58ed99a90b070266106b91d0d1a4d0297dca1f6ac3f0d33e4ff6567c6594300c8aaddfa2d58cc980a2c2c9cf12fe72abc3acbd8adffc25140e4567ec0ecec838996ec4140f898f52d7a5aefd66e89f985a855ab017c244aa5bcc6a5226e94364c896cc9955d96a7cbe99a2951b33aa252823e8d57b04a9b489fd9ef6088070228efd3dd977ac14c9b4928275fed29f8fa7d9c8f784ad51004c8b9bfd09cf587dd8adbfbc1e92a12d222721a00857a0429753f9fe5076d97176df353c2dc5dbc2ec8b9284fcdfad60c8711666a5ae10f8d1873eb89ffe9dad6b5a929e90f737e9e8874253c808b8eb2de9ce47b197a73dd1f0bca4c8d4e885896de299b1bf36d6081911c9ac429433435d1c871e6e47192e70d5bb5dba5c6f7d83808f822a11d3ded8276145b6194e70ee10536eacfe97b487d2b52558e869ff54450876202808368ee678b1fac2060c478814cfe618fa1f73dc82ed9cf230788bc89b7c24dc2e5825611f3a8d7f618755450269985826b708962e27c005d18ca6f2a9bb8672f096c4a2490b04db8df5a238d40509c87af3bd0ccaec09cf89b3173ce36adef807a03e554443acf489414ffba188f6382ca7d5ab48e5bb656b15aca3afd9cacd009f41df76753de6bfed22d75578f29e67285c1ef7ce09115b08585306da738cb5770773c67882561df3db7d212a3e73e6198cd66487717efa5e2639d12a629b700a7fe8a7b8fb90dfe65349a370753fec8380812ade68a4b63793fadd5463015e903e8fea4944fab746500bed92ff3932d3ae8e85058aceb84c8a97a42fd2168bcc80c00ddf8371d8482ac06b9316ac48ce43585984eb5b2dee43b548822d286de5a182555ebcd3adae9079cb75c61a70cf45ebc1126917ee49f5798255a3c81de4c37e6186acf435d5f72c046b0312a5d635d5db0347c75bac690eddec164e616109bfc4aaefc2d28671a1db2d8d86ef4a11afdbadc9109717427d2dd0e7e2dd42f547ac907c6fe0e8757178e76651112a43b982ab59d8e576e908865d96d684e3576dd9f51d5c2a52c059f68a4673481dff0c178ab5430f53f54bec29a28b2fa5fb9e9cd9caf70a0b5fd57394337732a9aea2afc2f8ad3fc04dce0f5fff132563340ef66663ed25b9eab1087f374539292f25beeb6188f00bc7336164fd947d13f026fccc4509f3f169d96b0bae15c01866b1b9602a81703c1f2996ef77f06d327eb60b691863b2d2cfdd3c6f187da58f2da9066c7abf80d7352f36c86731a450ff16714f3352e00ec4cfae7dc2cd986b0fa1a3b513842eb966adf04b263f53ae5782e2848bcb105b0c8cac0e38a95daedb1506eee766c7df991ba9f4c99514e9bf8be0851963c59b79e44d9352526e4ab09823d08a334a0f8946d1b978368f37c72527cdedc1c3b794ad6c79e3a014d3373b297ab70c8f4a2c91bba72731e30cfec3572d80636ca7e13886a1f126c016b7d8c06673ef3dfb4e780189619167809ce9e44ce9bbdb2b19bea5a085430aa4882747f16dc09ebea9939c104fa85e37b7f54ce64fe9465c3aa1360cf1a27ec600db52ec849149ab7df994cdf14bb0c281706ff4c3d64c6151b35744d9b17a433f46c2217001d63334d9bbfe96b1b240b7dea3967127a6f1a2442f72dc0e2396b638d6de3fe2f8a6671ab944527d7cdf663be7971bab26eb2758228e35d617c1cad99e277b0fed090246ef76d328b6302e292316703289029b3c98e9a0a344c3e4782e70e8d4e30c0e336f1e998c937bf126f3005be47bf8feccaab1f3534233e04f5611d347b1dfb50c083e74f06b2b5fdabd2595c8c6b2199d6976f0a25b5cd298799a95d6c088e1b24ec81f076d6dc05d3d62e4f481d506d10f27cd0034cdf5b5c12ffb9acbdfea9d99a178b9f9055015f285c64eb81080e1bbe47ea50ebe1cd3f59cad2fb68b1ae69fef12a828658df945a7912c0181ebef75005316ffbff562ae89cff1a84a85b17d7b3c49b78922eec3f1afb8c07483f5401b8ca179325d63ced5681189e0716a4272ad3fce4e33401cbd365930ebc6cff47eea8c6653d9898339869c4e68a4d7630ef4b95513c3d5c9c1b08a43326fd3e943712b27b6359dd2a97552586757dfffaad4d6c4de584c3ea0f3f929f3fc5444f93c3c8cfc7e610f544ae9408dcb74ade29fc5d43cd8892d6cd38cae11a77092a66bc09e30c0146a787dcc12ed555dc2612aac06fe2c5f2af0fc15914440b6e3c4c25cc6fc8630638d56aafbc1e7571181d293d771079211b752b9f2c9db78648c3018bc7e762938b54b82fe8bbbfb15017cd537beccecc19780b3d81c588d356896a3a7bdd125764355704062fcf34c7e31431117c1e4a6a05f2a80a16225581c9f699ca434448dfbc0d0f95340015f065bef3439744f8953b6f1233fbae87cec2bb5c232b678ceb91c2826ef12a30a403171cb56dccfc32314012f578ab8aa0ce27582bd126ec588aa61fae5725eeb800007127ab135389329ffdef5dc5b510c5fe32945e1385e8c4bf7444f1fe1a9793f7e7bbb1a8807580691b8340a0825ddb94d3abb176a2846e642a631a55ea9a71c35c98002811e05dd76e5934f843a46934c17e82965eb1f4e5cb15e557608cc743d11597d09ceaa4a18b01760c14b81897ee13213eef38fb4710619b0fabfd93fbf1c19c6770b8061b2a94416b0c922a6bf70c739b2746b78bd0bf084e219778134e0a34fb4b088d45f4e5129e0c12785f1f433a265662753088dde01707973bdfece36a343e889923039776adde57a6d5d9fee81762f916e293f396de3a6963c063c5aa36843f0758af37f93426b7bcd75397f698de74c9c690288e0fb7d6c9854d0ab6dfe701dc1fe9fcf0471fc42b4b8e65c3870d5149c96458ad004140b28c9229883a6f8e729a1f5d9029171b585cbc8869f58490ec47e8d405be972ee1c99ac3624981b5c49d5610292624a27e21e926644ae2fd841884e87adccc2fbe77f1929e1c9c9b84e20526a64c44205d40cf172790329d2cc0dac47c37eedc7f56b844f7a6169b94f49a0b09da36919add3659444a001b06eda7e960b3e82a6e32217dc38793f429ad518928ed50823f98dd4ac76aa08bcf3565aeaf90acbd53f0286bfe987810aa40b9baf1835b95ab78219632c700fd785036339803699258cc46513e16537c22198f6c234d5928a62219fee47a438a7899003e0130c578b6e1c6801ec06e707b67900344ae31a8ecab9887d235965de13b461975155b82bff3c76d5547226b4e184d94e23a6a3c8eda47010618b0e42b6fab644a7e6c0f8d2c85ec7f3373270ea64ad037aca3c360fa5450d973b80642a8218d1193e94bb2881d3e9c5f0e18385bd057de607de2f6d82a555eabb82e26e570b79349fa6c30c04a85c5b6fa324aadf5f15bd776696d34e0303038be86d931049eceab6fefc2e372955ede440913bb0c51646bedcc00813b9eccc74e8dc3b12278409b607255a3fae066d57825123d168a06240472880bbb1bf89b824d9640c763f7c12d15f03424ace05adc2232174596916566c1020da00c5b5873c2696a4685236767287b1f0b65e8f99d70ce1294fee50ee81b74f2a216a2ce0c557fd7e24d06d2f0d40092919b29c5d668a8a9e923d03639ad8d39757677325cbb573d4ad8b61a5694e0e3db992d82a800b10ee6c812f8e8ac1fb1cdba787dcf49c549fc59d07fe36a8c8872ce4f6961822668c4d99f8fb25b0aad40f059b346a8c39b9a51c2bfcbc9ea7cc4e118886762ddaddef1334509241b9024bad1bcb846a7a7b35ac6d064b6ae5b358d9862ad3af057353d9be6b29f35ab2a59e9fa9a63559ae7ab8e94d94d9380f22dd9977987045fb28b3159f051b9745db3e82a01819ddc703d18f33ace5748202a8c5194aac65c4a2c44bec5d0ab936d35d1f3fa51143549214f53d4a007fc4a2248e95692b1a713d46dced31aa50b78f60aa2aaae101956600ec1e358aea219344091ba0ce6a3584be1a30421eef6a137fa2bd742f34ac0beff9d030fffe53b8eb2cb58b86b20c101d6dccaf277260fb7a172d38e78c8bb04e7ce67d2e586e9a12d880e6038570043c4a3682a3251ab1fc338035d9486bdf658e951db02c86020dd148c1ed360dc0cb757b4dd642e6dde330ca8fa8f6f15d4385e24e2bdc7d3f7297f64ec8b5eadca586cd8704f000f338abd200efacae500cc8db030c614810932307c94c0efa1fd9336552b6b9477aeffd501add2a45230a5cacc6da4250495d294bd04a5e8b179900e959f540402b92bc968f401cc1b650ac7a8c83f67bf4d7e4eb94cf01e87d2b415e80e5e3803ca1d6d9db9dfacd6f17d81d2c831e9eebaf4accd1254aa4d95766c363d7cc33bd79b8305811dfe7952bd91f30d225daf56844660196906bb2fc2d371d0eeb8ede497e52b47663dae0cc878466ac609198a2dcc5f750e77668f0aa21bc10f083af750e3f63d8618ac8722727a97c4d826bedf33250f6d45b4d6d5f90af78fc96f03dd71d67b5941a2956300d29ba913357a1a180dd0a223365a5ceb1e7b14be95e7a4869c5b05b2159b879dadd4e14201833dd35adf49bbd236913eeaaba8463dfd2816886aa3b70de326b5e5914c87c8e29987ed57e2dd1df59f776cec2c8802327f8197d6b129edf9109504423f5d8516fa9fe002e47292500a3010822db2d956c004205e7f7cfb54d01ff9a21766d3ad6f3144a370923ea2fd6d99c01e2f9d7bd33bf97ebf594595b93b14afd805b0b5ab0bf73d62d3018206b7bbee56bf84ea6f776cd814f55bb66be45d1861481d50c554588a64dc8229bf0747d4b99f74bc710962a5ddaec2ef51632a647ca8d882e9f11443c83e317fee3edad0e55f50028dbe33e3ddfbe0c882cf5293658f61e8994a48d709ded31f8b99a962e8372254b4679e2a1bdd942ccbc7e28309f9bae1e1f6f1ce81f174a1a78fe973443cdd5ee38c4a0a23b1d836a02a61d0e9e24333d28d9f3ee25546c20da344a4f072abb136a01623caf42e8382d400407d184385069d193c5522c6fde8ca019c50974ee2a334630396e55da1ca65f21a7dfd990a9b9fa0680a0e115f4962f2e3ef986e7a56fcfca3396923df2c2cee53d6c0d6b9ce1d9314fd3a267e398e771f611e6d539af7b189fdcaf19fbbabc1190a33722cf7dc3c1948830bead3a4930a9a434dc297ae0bdd777c66caa069a32a945ea667a5005150016f49dc90658084d6f1f20b1dee63b0f0e7590457eb1a30f0a8de0ad0f1b9b7f0cdab78d42da54c141eb3de7d1c1653f575e12472d57592b2fcbdf121580ce63bc2900e132d99ad6c71e18d999c085b63002220c514f90e5da3c492ef4e3381e7a444f7b6e4f4e922ed079c43c4c8a3ad5756785e202737568d708b82d4840da7bd1114fdfc6d53ee0ce89a8529bbf909cafca8c187b6126a93727e48a2162ce9eec2ab61106eedc5518480373899df3039ca41ebc30aee9c5f9d1ffacbace52ef04f1361e50d57f17faea87ca9513ce1f4a435b700404e57a90cb0059e5289ccec20898d3261c0683b1ae1ec3020a94f08f1c5c5d54d4ee4905d21c7d72473ff0febaf78fffc2a4a6be391bed9db0f13aec0663e0343a980eeb5f2dbd867c75680c752adaaf196ed34d44d166a149cec1bd8d84384ccdd3ad4888724172741eba9c065b243b4237e690aaaf48e0899280347151f04965c8b167cac73069caf06b4e7172f6241c03b8153db3866894a25cb04a618c0d99067c5dccc4772d36ee723bdb90d2cad18cc1d987e850074c8e0e6d7c46665d8f69a30d26ef52a22fc23eda4a4dce3eb2f4a7d8c3ae6be21ae99b07baa640976cced28d76b6f6f604f2568767a92d15c7608592255f93b48605f88908d352ada9ced26de4f076164b84f0b819a5909f2446244febca2338bcb138dd74cf03ee6cd36a8c825e58c34053360758821b7e54205044d9781c5a313d5c9ff8a99b6c23a8e864008c62f94003b84f83093d7ad61327e9e8923178cf94406313244ddd243691248eedd3696a863e621a424ff60c21a45ecadd85e4a21b8bffa4ede659e0edbf1291b6b96cd535b37b6c8d96b3bf2d3b2252a156723577a4513c0d2fb96747a45f292055d73f3ca4b1ab59362bdfd300586d04f6300c4993f2bd283418cd8676c3c4f245b8a30812ab7ebe1b69301bfeeb5b001dfdc85d21a9e442ca26370a00d702cfe5de72f66e8597f04b1f00052537313f061e64573c5e11587fd311f1e08c4cbc9c85de53e2fbb9a071acf3371f824e8c70c2205206ddcac5325908a28c5ee60e3bb83917d2371dd11f1ca489df23f1cd87ee18e96a53a1c6d110de2a1cd4c6a474686bccb7ddb2fdad8607a70db18e8a7dba5e2f33ddc8070053e8891367a633de253d7a51499831a23a84d718446b0358e9b78583908c5f17fb91992b767bd88b15a477a033fe86d9806f4e8d2ad1c3dc054fbdf2cfb1c759ea4f21a112e1243bfad70df67802ebd8c51d9a92d63c0b51dff22df5ee0f69596cc9edac72ba48bd2321600701fe0a6ae1d939055bb9ef838bec90e9f39f7f44efb2a7f2f4970438feac5bf59a190085731a007ef890a0019ca0d831dd25e6bad0b72555b4ca79e430ff7c664f244404fd80a77b5203e6cc9895b35b6e8e2127c00eaff6d24f23def5b362804abc19f2e65b5800ee0b0190ede16131cca1926de5a6c940ce7b4d96b8cd40b40b0cded027c831c75e13dd6e1c14549406d62e68b3a45f8834dd05f55a897cf1e1d8c6773d383ca7e4c3a12771e25722dfe267cdf451a61ea7264c141b8f25921e85f38a58a8e9971d79a0e3deef3f576ef1437e3de1d298009e46a6cb9ada20413b7f361cb02bf2b99239751b0976e270ee6fdc8d666d2e317d9d3d3954ae0da00ba8b34aac3c5dc6e63cf0fded06defbcddc977fee0aaf08c1be17ced25320a5195d2debf1874e578719e507bde55e80b10de134152be5d043340e438f82342536338dfd523e0c6f818acaa7dd08df33d0d82fd9048f6ac89be68458db31437c3536c328be6df6c217480390b15faa95b2c65795a669f473d77ff57e74b7ba209924d03195829e133d67251547ce28a2cf2f3922de600f0aedaafee260156f4032941f1543283d3263817bccb00956bb3d15d9f57c4484193f440d3d9f37862d0d526d2741f991d843ee956ba968208ec85ab26b78c63f00aa96fb2321216624f0b89b9e169f9661b4884b6af3aee379173531b94dba6765c067bde676f0bdee6350399cd0c230a159ab09947946d733034db908e44fabe994938f1d6db46f8d639a9e4133f15dc847d4ecad47ae6b6c126b6685bcde90829935714b6178d070bada3b02814a6ee9b348da111ebaf63fa699ac12ea23c69d97256203750ebeb3e0090f991424fa991450cea2beafa835ad6a4e22e67acb12ecf106c092eb74902158c7a71de846e0efc9fbde6b4b39c0d50441610725722a9887f487fca4c2321afe44654207d9e399669c5ddeba62690c1b929eaca09b5f1f08e83c79c99923f2b492306542ba3ab43507d420d8db73108ac6863a4efb079fdbe18b4e74418f63c7b1a2d862ec30f6d0630fb9a41f57c1bc85b41656e001e7844a79369648a5454b21ff33c100cca65092361e520f102f2050718d21be4de5331430380b112af1d2bb24f21ec7010f6142b4cbbe7169430412764fdf612a8b59e0a8c72917d9f0ee822f352f0dc5fc672f12deb38845c18d20764a7c51f9ce1e18468f746c725c3fdfdc8a225a2f277ec7298fb580697925056af9b4d4f708bfa9eedc9055ca4a51057f3086d75765a6595eabb383dbdfe998024fbfe095ba9bc4ca3b4037129fe60edd963f7935ee7721411f1788c606cd6b066a56360c9ce6ea2490410c48d51736d2576ee50c258fe14e9d49f799cbcfd2225c67b5d1634fbd15df26607cfcb71423c7685a0f7db57603402048cf598f4c9165f679646e0233922fd74737378a4c6d736f006920905a978d473f2153569dfdcdf905fe4fd1bb5b3b02d40b44e09be9e878e8467527879da2fac26a98f9d0f26ec266566eaefa42595f0c7b86828832d82c60474c66c1045fd3bc0212db5e3df43e890e908f1da53097ee065888b8a08fe472704fb18ac90171953dd643fa4a3e7c3d51e2442d680fb7440983e7079e8ed8d64d09f60279adcbd2af1bd03bef48e693f3e8d7e2bb0ac4ce943c5f790a3dcf815890a22630691ac1e0b9b40bd1b1e76c1785ff8cff9cf44dbab8ae558074f1847089dfe9547c82cfcc9ad7bcf077d9cbeb90a116b88ca4fbb52f498f216383c1e63a610a75c5e24a14cfcc3fdcb7f4910259fec68cee22502c544c6b000ee74438fa0a7411d9cbeb9b538e9985c782ea1f818fcc45d29608984f813c70f5e2671c67f4e36985f6e9cf468106da9b76bd1f24d0d2ee37fa95f5247c26b5768824902db498639ab19d9df2b8ad607541a21bba1f524fe3bba5695efd660c5b609925a754bea7fc73c518405038284840a050ff0cba34fb2c24af3dcc9721c5d9c61968bd198bad0d187e860187b5386a63004091d981a8233f51fdeb7711c210a6aff558908ff42773700723aeaa106b655d606bf30d705a31177df3c2f6d0ee4642076760d607ba85af5a4907b0fb69e969d2f44d07b91f7992d35444d2b01cd85ae428746f4817b7b4de579abfc56751e31c4c7ab20c22c9a368acf60083c0c6ea3a0f089b1e4753d64986c053df10be602501683c8cab212d9235f92fbe89597006025350f2a07166a5858467e620a3bcb24b3f64093a3e684a58d86294b9c8dfda818528b37676f5d06e924f221096b4ef7f458dac38b27edaf11b067b0303ec9a21a072f152be950acbf22548b7de16a7f64cdd58269f3b4dc2ae0a09c66a691986b350fb691d74764bbd8b73248e24a905a9a7d0107bcf88beb268f27c90045b7c20bb4a0ceef1547b3337215a842d5b16d1ccac8687d91fd32417db123d666ca18ecd10ff917423452657eb61c4818d584a8f586b97064250978545eb59374c3332a770cbedce98ba5d300b509474e851f3e34442bd9382c93c0da7f858b028a2d460f98dfc57f25cfd04adbe25bf1f50ef03038e62f7e0cced4bc065e1e12e04454f7484ab804194fee5d584fe85d805d061036d1d1a658f4ac8d1146aa8e3863addd5a4ee845a81aa8eabe173eddc4f8d3087edac1e27c955db6d6b83a75b925081d3b84066f98047fa950e60766cc820a7d3ecc962f5d29d8e1a27b8af30447b0e950f96efbb5103401baab9f1a1694ffd624a801463dd078424705dd921fd611101a9622a6aba8845e2db826c006bfc0f0172e89f1155adf689ccd1a720984f2ec027f269c83579cf84db9e140a8659bf5622ea7cf43c31075f322fd2d08d113741c22f54f11409ee83d038adc612cf8d0e366a269bce9cc1c4fc81951501d96144d6ad47a79ce9b30655d43fb59b545ab6a7fc852f21a23f714422d483624eff6e1d84573a496b937c2ae754b7a38299d868daa639856c2a79635113eb0cf7037a957d4785c030f88115b142423c761da45d8bb7317fb30d380d3d5f80ef4708d4f678053d961af954a17636b5595f974e13591937c14884c4c093a205818a627848053f1790af7b554a68fdad69993efaa4a1883c5fc0d56b13fde802fc17af057b38436da6ed6825bbffcc4598424e186f3bb93e258f9b796f43d73f06abaed3a2ecc0ca2487bcc2e463a9a7dc6218f9322b9d98851652217c57f32002d5a89db02d2b7794daf23676c62633c7d9400e0e7685a3612c91b8e5ba421a6f2d457bb563b78db5901e82234db1fb4932f1d599512c9d23ddc29de9ff6afde32bf907d41a631afbc1918ee22759d0acd4a54e70d0bade33420fc421a42678975c2679243b1beb15224284b9d85884327c22d89f3bd5b0bacc4009bb6a72567b9dc0e768150717bd9f58747904572703985f0412d15c3bc2151784a0cdab525cc010eda4e7a6f81dd9e951aee9db515e4d929a19154f0ccda9f622829f45817bf634b038ef0bb59b73e658e00a3907fec6a01dba7f5e1f896a401922b48a21a1e18323ab288968dce38c82fc61f9bb7f8261fd0321c499f77ec8d197768175d85257193e60545770b2e7d3130ed19d7f7cb3ac1ce9187ec0751b2d59fe422da8d88b66f910b4e28784f901a21118efd50d74a981c288e98fe1dce0949d0443570d371183db92355e7ca786a98af02eab6002d6978f3024596b13eb40e55e4453e81e17273bb6b7e50c60c3a6bee3c18d2bd11e7dbf5b37416ca8e6cdfc839d66e56ca58c81b5d018007d54073ade87b9d9245d870e196e1fd4895736379554810ad46cb04e9dff2bc98521ae505cc8168d16e19be914e24d0a40d5694e4973580bcbfc8377235a24bff4863ad19e27fb7f02f1cec87ca7980da3ae3b205bda81879e844881844070e289b2f86f531db524b491869fd3e4e709fb12786d7758c2cf87355e160fe79082337cc6a1a8d04d4c6576f2204c88a97def892bdf27aeb0d02968f5d494fb700614a5275372d96fca559de5f9e38dd0bb61d41988df5b54d9cd380967c8d50329ef0a29c81754aded0ba7d3262b2db96895e1ef87ce0c158ec6967cb52d106d9dd7710a2db9166d6a02a6f9928bfd096acff13bb4903574b5279895652dd5c886fdb352616b6d0fb900d211b53b57f409eb0460892fca7515e35719d8364215f9a87a7c8a7fc392ff273865f3453dde8b76fe7eaa2a98290a4878e51fdc5e7af4930b8750ade66460df39780b2fcd85ea8bfab2efdc6105950cee1c3dbefcb92c334cf629f44528edefd8ce6419fef2cbb77ace646cc86a68a0321a7c41deb5ae3b3aa2a2430e393bec9c1706ea93a3d78fb77ff1ba61e2f7abf0027e53a07447832b2f92af09d5c1cd79f754e491c14dce0466ba8e63e9382b84ed4bc08512e6f3e5113035f37ecbdb781a256f481167d812bcb0b53a094865116f6e1410b281fafb81f634e504e43dcf3edbc7d9511720a07228dae247026e8b4893041a0487e2365d19960f3724ca6e88d99f0737e3870c31d587f70f5d170036f3d3cf79da08eff68d07f51b5742a73cc1620d84793d2d5d55798e689fc488d542c4542b7149e78a221f5b89e1117b16c04b99558b48a88bfe131321d3840b1bb813c516eb6b53f3f16b35a95e9276859e849b15c30867a93ac4702168c3d6644578ad8fd1592e7738acf5af2e867d08823897b69599714f97c7dd62c16430977726888cbdd830d07c630d57024cd128e194298919b945ae9ce313b52ff476b7436bdc76f276e4391519c6c17b60ecbd9c881257efe632538d5a57b05e02fd74a2345e1f3ca4ac845fb66642914feefcd8e3407bc8869fe5163d4dcb1f7d506750af4c316b6b50305cb86871616df62d488cb8b3f53ada0df1350bfeb1bd2471b674d0e976961c1cdb354a0410c32d95674c9c8c298db3251db3d93cf9641516f62e2ec2fcea3e56beac930b932a836842e65ae0e467dc9d0253c9c02a973d9bb251ecb8ee61cbe4cbd23f9eaf7d8ad487609ad901f482180fd3f209ac670cf2439c59d18fbe40d4cbf6945e6c1e807a12229b6bc134800bd0678c705a64d1d6134aff12d56c64588d0bb35d523e9253ed69e04594c52ac3b41898b5ecc59d2ba6025c5577856c6659394523e2ee92d04eed8fc4c1fa6e0df6c7b6a1ffe6d2c7b531374c4a2d3d58c35dc822f7df49aae8fd57c4a1cd7882a1bb1958661d0ced1c308cdcd58b08fa0573a763fc4cba92dc549d55d410c323094f99b356aec2e5277ffc677cbc25371ee3259774e281d0e4a7c16b44a564e3b915688753a11d98e3fee322e2a292d7a8a3cdf73344df15e925b7444c363e14dfdfd10a93c704173756258738e20991680603de2f3ff7fa07f201a5335d506c806001edc178314fc798cb174498053c9d384658d36e173284936241c42dab4672f06880ca1b292975aa66d9c3ed1c283b100957e3bea03629a4957167c20f4c42903d6de55669beace43cd672679cb6e5b45478a851a6b9f1653e7ce50ad33991d9281586bb17bd79cebf71a49e18839e8ce3b353ba21a3799a73ec730659569c86bcb0186d42648c827393ad031270923fd3bab7b72f8b229951deca4b2ed0c2a8108b12a2587bc3e650121d140271deeb067ae9c63cbd9b0ff5394201afe8817e5270d9a9368c45025d49d6438beee91676f3e251d569b5926fb50fee60c5e3b7a0fc5489bd88922afea90f74785414c672285777ed48368fc0094b3205cc645adb2caee23a96ee22bd25e2a79f9980dccc7bbb3832f3a4c37cc6135a2df4f21ae4d26707654612f2e61a33fbb1eaebf7bc0eb9a131b18a6a1bbe54634cef6e21b247c7c6079e764cfc59b734acee7b2560b0e3123558765656500e506784f17fc1913a2c9e03b9f775823e50a129751e132423592716b925b49ab2d81ef37a6787998cf03e9b0543f3c8912894915f30f4a7baf20fe50a7499fddf9dacbb9307b285526eaa3abf1bf66728c5c302afff8cfe59c7d1db0c64d28da6966bd3884acb1199ff9c3db1a2b24141ab27deb91f0b5903cc01abd0d025f0c2ee353c428c10fd49c58b50f44f0ca7204f9d8547895fadae4622c0e5be1b12125e17336704b1659711d6dfc46e7f93ab68d7743d1eaa35dd16d8b7f586648cf479ba03c6376620d049cedeb6128c127796d8653040e1d33b99d6c9efd8ed98947e810279786c07fc35fd0bfee932ae629bf9a93cb39c529b8bce173c55c6ec726d3baa98ef58437d1e13d6855f00fc3aa3776cb2510a9473b19523dda81048c4749d47c0eb9b9b8c8727c368ff4d86f5a82792c96ce44ad00aae1a51485b65bddc70653885679e67a44854d0db83a5964f41ba877da610ea134eda61448000aeebb0e69c9194d7b839f290fcd5ca3d140410f41119086ab97e4e89a13101ecec09ca94de21ba16dd2dd20c523a6b4cfc2355d7c2ba3ce4edb754460c80f01640d8aa6451e4e7f8272c3030f6f656a0e7b7b47b21e92c0d516f705da354dd18489e2441bc4992f3c8b3392f17033cb9e32a9110496763ce0887532b906ec2f7a5b3eede2886815d8813a4a4e57c3fbcdace6c3816b82a3a970c2d6802d7bbbcb2265d634aec12a7b47d063dd0a96869e87c0fa5272f12464f9b5eb5490e81f5848101ed5b88978c00522ac7858ecc7da0cad23b50689064d9f5b8a7ba9e5d9c2452ba5a2b840cda78ab06f60c9f5b029f8aa445beb5c95d969e7d9264572bb33f73fd84feb528b74c7d7a8a24dff90bfd53bea77641034aaf48153eb72227ca7ecde99aef7cb574a26a70865128948c74a9531e19fd1d5f1e3dc68885d29db72db457ad4f7be81d73698a830cc960408f7b51e511cac3c94093e16181c0b6d600e10dd79219a8b429e1cb8145a6c85f351f81d32da75249ece5f8c8e10cbd3a3a059b13e27205aa4927d6f6320ae6d79bf550374d8da385fc5f62c9f301a7464e5e88219b461b3eb539d39bd506d1601154cb04a84d6c0fca9b446d62f008ddec3701ea08dfb9154af69bc5ed4a043e6729522c466faa194fc155959a7cd4581b8c36734fd81ba6417d536774a5df2a51cc649d35dd07d7c856d3d04ca1d34622631fc4294ccb62f7814e4c88cd1504d31b3afad3fa153fffbe1ebdef729725c91bfb372a1c9f5ce20cfde89577d757704f687da2931503f7b10452c084ef043eec85aab528bb8e8b7251f6b95c83105a02c2dd617f702049a339b6958852b2a12c5b6f57f185b800c9b3ee1a36a65b410174d411d4059d69b1d45bd56e814da144d2bd1cf695201eb2c5496989a826e9c4bccb2752c74f44f169dbfc8c7c661b47d00792ec0c15719e7862f348a073e1153cf596cf4952ea1b639ca72d7dedbc2a0854679241d17184a8a6288e418c3a153b60c8508401f4c03b4ad00e400492a909f352cf2f9dd76f7305a7f633a6983e74bfc39cbb989d7252de62d488f583b205148ed275a91f3750507d07de148a4413012bdb4fa8a788022828424d4cd1b213a9ce295a5739d44438e1648b7e382dab2b948f184bec5b53f8054913d6d6f86be914b4e17de556371cc071aa97626e6590b925f3401f012395a0e922b50651a6bc31dc0d1020405cbcf9803407655742381e17cecefd039906d28619494535834fc166dcadaf6cbec4e69aef33bf61108ccb90240b837f02ea403b96197e4c7e9caa78ad203a9f5756d344bbcf653e954a94998bdfff0b1496c4a7145911f08aaf2532a7e9059580c73c0da45d47fdd8d9648a27c5a82691cc7cf258780ce5c7d17ef23b0bf95e904895c5de2993d7b9178ce37ceb69ce721293b7a4c7364ea1eb29374999de812d0c9f513d9b4b76b57f843da27ff201b126eaf300f766f8967482e318365e0ab01ba2a853075ae707e786c968b24858499977968f3a53e13403029e7e09b79e36dd80c3cd9e49c75a44d6205f30569c7eef0f54cc5c672611481e0b0c407506715d7848ba3023ed4939f24362581965a1a40feb918109824c16d1b8d6336ca777ea2ce5af71a6f45448861563edc8b37479e6cc3bd75e1df3008165d7ceef3e46acdfeab407a67c386ec220057d08747ccf6e19c1e00f30b521f02b0f6484e7c609e691d1d72385bfcff551bce4ee1b6bd13611611f61d070e51e497cb8c0ab3a86e5cf40d615f3b98ff68e1d6570b2cf241f9548d1920c0b0b96fbca9933c95a699821ff24f7e69dd2346a3544b717094bec1a48ce8686f7b9894dca2476f02898c61501e5fef7e262a1f61ce35211402dd36c7433ad1c431530fb80418cbb7bb52c4ecf96f35dddb08ad5e76cca517b3b3d4cd0603a5a456f794ad16e4f5a5c3ad24c275cb21ea40ebb8085a0477ac0e72bd8b9ee623e748e550e026c5ed67dfd2d25f1e95a7f079b0535c3ddee9f68dd13794e20ffe8c0aadd67a33b0e919f04ea029961f3ef1e5c644297d0876157e5b746e5359a85cf6a0b56871d3dec3ec3bf765fb18f675dccb01bb0a92f9462a3591d9c2e1cd0070eabfa0a3e43945e7a60058e0779d39daa37f55517375dbbec6972ca351eda40a83a2d24342f6c482149c7f16fc0d7c7af607f08e37d07ba3ede46bd42873e43188c7d81a623dd3eda67294b7411e8f712aeb62b9b36574c01655df5e158e8e65effc374b42f7220520d1d9ea2cd2e5becac6c96fbb3a06467bfa02f8a7174352064d0ac4a98b7b5095d4cd1fe274959dfe7b4d7747a7b52916c19e4adb7ff1b3451d4733f559326aeb000f1a9960fe7af6af98c36f0c687faba069ac76e793fd33d2446cd492c8de007b8232e7f87647fc4586b3cd33cb08cea36a2dcbc9e675d0fb91126f31195f0626d135159764027fc116e3e7f2652ab87b668f2e1e45844f3c37d2217afbb8a5a0c8279412434bbce921599b44e5e4272e401aa58a6447c97fd74eab1d806c9c131967b4eacca31412da6db9049867c55223aab5004fd15cdccc4bf1a5767dd72ec9a12e294c881155e475e31a8e810fc515f9bb970b6cfc4fa547a20f78efe46dde3a5697079f1de4ff6c40c3f35a79ac09d45959ea1750f39f762a1dd6764973b83954a3aebab575062dde6d821c0d1d1a87b2b7b66ab92d4dc1f8436ce6ade848c136cd0fe7aad2f2d8beb2a72fde3503bfe833655bb700ad10581a4f08265d4e52e4d597a445bf00667ff633874df4476a800e38f1476f6e8ef3542e97bc0a81af4f918dc046575ddc5de506159d7e9143e2019f9777da93fff3ba76132ce1d1ed533021ca9ed7c35ec42ce703fad0b82726790e8ebefa46ba875071e6c20d7ab73a18ca977bcbe4b1efa9049c5cd1090b2919c22beb008d1dc4a06df0f6e58fbc3166d644ab2ae8ae89446b3492ea31057df72e2b213282862f6cedd3160a3f39abbdc6552be982aa02caa33de04c17a79565646bca3e13d0f995f3deca478fbd0d6664a637434684df7c3b0f08e4d325f92b845eb8de8934085cd8d788bb49b8a8625859ac89130f74066ce7a8641b1ce89ecf9af681ed72a5d310dac1e810dbd93f20017a620969bfe759db881aa1d13d59733c5fb0147d9e050c5c9a34ec550c2967a2ab15fc8662d4e57169c2d6bc3c000ad320eca7cb05157edb170e9fd50ede19cabc89b0362bf08d11b723754cf3f5ff1c98be9809e4baaf454c2de161b49d9c389ca9f0209d55c5be44fade4b2539067b0c1285f91ab3ff2d9781f4a1b067f559e11042b9be76eb4caf8901acec3695ed4c48ed063145d240b0611de4c559c83039478cb2c3cacee65efb348668219779b1c7fab43b52d57c18a808dd32a9ba41f84b7139cb48c01079932f0395a0c0f5696210010f34ad93bf2b479c16114738eff5776d6ec9dbdd8ccc5a31432cec5509467d4c6a08a21901c4d28efcb402b095b15e820c688627e8545186f2eb2e52cb55318b1f6f0c36618a967f5c7a1907f964e93d4513c8ce411dc314a5e73b2239a4fe4d5799a6b929b6d186a68cc3cce7c73f99d1157da9590dc9c4172dd1e2b1e5c5e3f8c336a7205d7e79ff2ae17ef5baa9e124008b0b79a96d21a239996de6e062741fb173be30d828872d7d782ce2265153ded430b60f338118aa1e1d7d5c491e38d79640377b1d701821e0aef9d8ad2d9ad88e42078ed3dddaa71232d5cd945f906a1a4a449ce9b8e825fc91078a83818639a02c13d3b0adc340ee8a188074af68ab6a1d9779bd0d1bad5814c7c73de420483bd275eb5c0b658c620fc40261dd5ccbf4472b8dfb0f135e063c9f66512b9a6e0a9f27cfd1170dd91f2e5d01fd71a6d9e6058baca328edaa3e0e84f9baff99cf82f67d3852a32a72eadd5b0230516037adfb0081677f00506a2ff5c2141c5292365a24d0ead767e6b9d3db22a1eb436040a2647a15b3054324e070d0f3b7daeb2d90873f9bf01ebe624fc06461dee24d5db2213b2b5dc7423000dc95b8215183d1206d40c191a0607f583a0f97566146903a0b491037fa53cebc6c377c8eda527744646e0dbcaa3b6dbdade5bca94640ae309060a060a13069577362ae58f0fb5eb9e93d2894565c903ca1e33aa2b1ca76fe3e61c4f102cd97271ce49ee2773dcf18849bc7dac9e73b62ccb276c43dd3572fdb8485dfeac90078961885016b11f6bfe470b948e5d8b8fb5245d5205320a2a9e62f154fe74ecc578d003eabe3a3bd285a650f6a0d48eaf6196774f54efc2eeee6e3aeba154edba59b324124aa94bd7ded02a6254ead437979ccd9a15034737efa80df2392e94b3bda14e99b0f2a36f5bfba08eaa785ba32385a73e76d446dc9b2aa80cad188274cd12bd4d6cd604c628e3a977e1195c388468f6c0cccccc1cd6b048bbb951ea0c8eee2cd229b4321c82c430a42595a77463c0da50a75d1de3e96f6190bda16e4565972e30668b39af17589cde2b67b35c589be95cc0bcf8e961c46ea6138551e7abeb6a4da55ca461eedc16e66ac79c73bb1e6f6bbeb973a74e57456d1e1e648e3bc589910fd38a3166f2037581b2e0f9e9de8eb3e1f48e920fff19f61555f41eda29c044acda364184f08af30e5d86ee3c96f2e9ba1d4acc25a73d3cd4718ba8f4a69cde9cbe5c962a03111a70e0550b7523d225a97f5dd4718b646c4ad116b2898c6d110f0637e80675dca28f8daea8d12aaea0d5cca86460916e31e58b58dba2e3cae0c7fa7456fb157e81ae90bd4783dab92cc1b8a29c09e6ec4d374e50d18713e27462e4ac8e6c2cbea9f86effc60274a957d6e202eef3686981572eded2e2347416db87c2c6f91ed236d4c54e566b295f19ce7732fa813ad9bbaf6e2e72b289fce97870d2e73797b22d895cd98c41f9be8c2ebae4fc34b248e8c1d5d2618b7dd16a49343dc7251c714ce128b684a3b79cc2b1fba6f5f49c1c9c1147740947311c3dd5128ea9fa1236ed48ebc551e0b6ba88ba74fdfe48fdc5f5028e3b33e284896a7593cba1d56939b98b7b9eeb5f9c8254019be5616ad82c0fe327707c096b38e27a9870e4f12f4ec355ddd6b65c3c48b38c48572b9ce1c53df9b5bc744febe8a38843c3f1c55d5e421e6d024325da85055522f9990a7565bffba570ecbe70ac5e38a648e1e8a3701471b62d09f118d716fba2c5a10a861823477630c3d58a098de8c01ee33a70e84495830ea1ab15e331a1911c48d083160adc56c7a44eda31a923d3907d84785cb4d8e3a21503f2108a70b526cdc45e122d78a40b072c9e4b0c94063b57d08e83115e8ddf09a75934d4548ae6a28883b3b4ee4991a5c9242f57b26b6960785b3336eda77be2ea30a561872b577871fd11d5894af9878352c7ae65756410df741bb8253288d59147eccdf429612c4eefa298167532131f1667d3eea6dddcd6751d9d1ca34feac83eec339da76ad90705937d9ab69d60c15fa025481e8a3a438f95a81389b728540fb777b777b7f66ddbb66df32dfc5e2b73b67160516edbfae60ee3d516caaedbd646fa0693727d455dd26e67c9566884bf58c22b394e297978783564e8a51c0151d7c754c705a18e5be5d73ba29f975e17083e2f5d3ac0db9a115095ee91c164ac0e7fdb48a92a183a87960a06ce61bae7a884d05487314c9cb611d246fa48eb488bc34e05956992d9035336d0ea74c8c4cbafbd7f3b0cf75d56a82e173c73ac6d666c6fe612505c3055f0ec72f6b44dcbd3282a37ad69d3b5379bf7cc975c016802b12cd9c4dac8e40a1dca98448144c2c1c99103000050a97e9c3dd2679c3dddda42e9d344e5a0d4a63d738cc5262aff3461d1474f54906675260866e40ab347a2c02e91bc0ddcdbc0cd1eb98264222708564726b137ec4c6750c73993558bca2dc175d8dccdcddd1ce5388ee3b850070e0f92e87eeac8b59c9111d2c7a3599e7ba111cf3b3fd22af9919674aead0e7f604edbc89c0a8e64b57dec52a03f515d586a552ad7726a587825b997de3d1c057decbb3c51a93823c9abdad9d90a8b92c65540267252a90b2a330eceae683812393d751dd2bf0e542a431c1627d72b36836273dc9931b9bb0ae6293c9eb2e5b7093c5e66a64954e9db7513b2253d62d471dbfcc1eba6120425ae97a15c71720d6e2b4edfe9f286166e9bde1c78e6d59c32e433246704133e7454c4e05bb6b395d255051d62d00306941c0c518210304d490f2df620cccc3a2d7590831cfcb803851f59f839bd9b5e6130fbe92914fc748f41969f53782183e2a7e78ce0270c4cf0d367696709111a8b28377876aeb39b644cdff181959c2664f11c258a67324843a4ba93e18945999a9142072fad4eb18883283808c28114b6d99aaaa29e524040b31feb542279d4f968d47580c98f9e84eafd02a9e0092454d32f900a5ed002922d15b4a7a85f20152ce1e72f101556948c8cd8d982e8ba706dd8bb70e4bc1bf2d25f38d2c9968e2f5a78e1879271c70e2d92204243112aa4d188c4751da92375a48e4422859248569141151950b1c2c70a981c79232b57aa7032841f85a33f77564c79d9638594f57614838ac317550b2c1605c9c5ea02055519398867bcda2ab04ce195a42203263ff26c8857728164b0e425159eb2cb49c9954b3e7645ee92cb1395f365b17df4739cfbd8bd213917baa092bc7d0ee2156fad0be90806b5732a4525919c2404c93767b00272f6338c7cc899cbf32c4a9d38482781b5f60e94814549038beb57f8fcd87d3848a02b604978e68d76e40cdad0b90fe98d7c78a17c59eac1473670a461d821cf9aa50129a5f4d15f4a1c588845294766434652d475267ac1c10c827e8166f0a48b5fa02da8b46c21e517688b283ff216bf4052ac3cff743b4371a1544a4e098bfd62b1bffd7d523b8f934d07b35a7cc7ef89592ebe2efd84c514941f35d0921efc682b2d40ba907c0bc85d933af24fc75f098c1002225daedf9a86fd24057576425437410e7e8623cbbe474ed457ff78449eb9a16c3e721c38439e81e3272da894c86986141c222a129a9bf79386b2f9f60345d63b937fa034d775614379c26277bcd5d95078b5754a29a59c73cec9fcd3362d5f93eef0cf62a93ea60c86063230199f22eae8098d9d9037938179429e908ccc4c0605b227883aeeec47d7d59a4ab98b22cece78b0c83f648fece9ba5a5329f76d2abd295e8f23557ec37d80142abf405a54f9915f5ac8e0f9f5e26e71c3138bbb2dfecdcff3aa6f69c7b4a59d17e7c1fc3c81a82911067c0171c01c16d9056c0124528445d0081250f2b0b8819276a5c62216e69fee09b3b675fa1740c9a2d2d4da4c7f8938b12e882ad74f4aa8d4c7cf076d0aeeec95b29dbf9ef9db36dadbdb52e675b14050acfcfac2785bb3de356be40b81e9444246e1b68d2c05a1426d239d82b455db86f309a65a5bea81c2efde70db2a7d2c72a4226e79129c6d929cab583283423f823079ce8544c00541cf79115eb984ac3cc705f7b9c0073f4a9ee79ca5c8ab71f2904ac8e021c81470b3a6366b3ae7a96651e77c72f23599f07cec3383275565b17dd6da339f8d82ce4aed9e07f0b686b6bcad7159e7146299932394533b19ebeeee22ea9813ab2fb94287a64501b6303fc0b8f399c2ab919f78e6277202f003d0017a39dabc9cddc1e40a1dbab028ac1644e490a08e3216a12c9245d20aafbaa688fe8a2ba644ba8ad0aaec505a297ac93e4adad768cdf2cf5584275b23276a076358cf73122bb199ce8c1e76713f959d5dd25d0c2b4a52419a3c5f098292e7138f93761ebc359d17141203abc03eaa411d3b2288c8a0f245f82f307f646a8188272c7a2d10c145547ebf0521acf06aab4842d602115478a56a97dfe17709bc1e38dfc1c1dd14c6dde26590cd793037398ee3388ee3388edbc2dd14386ece39e79c739b73ce39e7dc388ee3388ee328c7711cc771dce4388ee3388e731db8e6388ee3388e9b1b9dfd15518316a1aebb4851d9637cbd01dba223290cc2836c55af3b414eee6da51e35c82cbf790d32cbab5adc73ffcd55ed2dde122e8b9b9742d517d6b0b8d530f271fa0dfd4a6c00c6f7bbd3c903273772a475f22d0539851e30a24396d6c97778f11a86358c7c73cef7f7e7b970039588f1175007d9f2c06669f5d068c5843d9c7c071d7638e27940666939a17edac2743a9d4ea7d3e9743a9d9c4c292ffd14562795bdc31e645a3b1839994c2693c96432c1984c2693c964721e725aa670070e60110321a410430846fcb460fcc577d061870c1451d1a40c23ac48e2082d93eb700a77a8a7d3e9743a9d9c879cd629dcc1e43049c49001511154f820a8c50e03be809d1031b0810f6244e1450f2d7613b87c8409cf0c785020050b0f845a2d6cda81c7ed47a66815751b787cfb9157d1fd19ba699ce6d9691030d706a594fe78e4b94199e5191c7540e202bbe8caed1655ab7a65bfe1ccf2db11310a0295b2bbb46372dadc264d24175fc7d991c3028fd579f1dd1b2ff45c4ef6bc03774505f47721af80f07b5d038e14f183a4084158e1a40b305abb361e28bf76fba60a12f9de254c95d1ade87def8d454ae0640f87ef5c8a1ea9e32e9ca724359584e6c0dbed421c7a4c22dfdcaf69e02dcf39e79c5d7758c3ca219912a6ecd0145ead4c09527e5271998c53396e34a223b0088bd386f9f2078a8a432094860f7c814b72cf49b76ee4cc6da37048db30fd21948ae771e0e8bbe7deeb8f03b7f7e6c781f43dfa71e07c6ffb38b0412671436498e1d779a4162ee446fb5dc1636d3801cb1a42a4c5f31575341a9148a3d18844f24c72c66b4e444e9ed7356b64c34e3b751dbb725b71be526e606f3c7e5c51650bcb9db3650b776fb6d2a8a5392efde06d0dfdbcc1af7b143f1ff982e3e97392aac5a7c7389daf0a854c4eb3c4286ff30b34c6eb3d8f3f59f26172198e2cbc6c1ad265e4ee4d4eb74743e64443e68442a15e5ed853208c6f309b9434c0b13bc11061c1099950c647a08c7312ed38c400b36d7246a2568f0155288ff193b7802a94b7b87cef031b9cb2eac5d0a517f9c500e3fb624aa59c060d97a51d1aeeb5b7b9e73eb6520ddf125784bf462ae525701cf229e7d134c0d4960a6758fcc1ab516481470b24dfba93373843fbe69b779d0b25f7dc47c9e738a4e4a9b19d3bf20dfa736011faa9b07f90286cfe6de2480605dab0d3e24062fcd4b2584663b87ea7fc021535798fbf161ddc3d51472f2af551f821c1b5f5bc361f5e75de40c019da3ff74a59bee4852a209e93dc8717b2f0a5706c971fc8ee81a49d9e41d41864a01e015e6ddcc6f50f4abe5c41c5f82ec7445da0a225fb7268bad026bbaeca6fd6286f6759b362bc4dedd2dbe61e865bb86d5b2784c6069a4c2ee058030d26f7fcab291c69789770a4e167707193178eb5878b8f34bc292c32270a540941a91ce5475a31a04a488cd7f01aa1911a1ee3475ad2255da2b8a4ee25bdf8583708c93d1548030e6da3026b801efd2894daadfe764fa5b8ad6bdf7cd75bf7bc59764b1016db55e0b66a80db221951532ee3be36eda710e6251c6b0dc7d4bf7cdf0f16fbf34f04f57329d41c03aad255bd9d93a8333e000d1846a2d67054c3d1c54b31e0b65cc07d14b8ad1670e7387f9442364c1238ba946fef52a06af36d1be9e372b56440d51606915c0a9640a2c7d5ea9ca823c768d81c5b9d968f02b715036e8b89daae17ae62f0e795462ada9d369fcf71bedfe9f0bc593838fcbd80e3e95f7835b68bed2d0be870869650f4165eba4948f48bf3982dcea9d48befb6784d0b28b684228bdca3af6872f697979797703485355e5d5a58dcd139381e698239e00e9c14d46e52bf0ec715921199a427449745a5eff1575d4aa64eaa3f0d19c817f6d83d12b541fef963aa03728589e4d71b20e50acc430a083207cf794e739c18b56e3e6703f9d93c822251a5f726a7dba033d5ddbd3b9bdb68cf3927d75bd3ee6eeeee96bbcbb57443dddd3db9d921edee9ddddd2fa8d27b77611cf703122937520948f7381272de946eedb812100980fe0392283ace47ce6f4935f8a594b2d65a7bca3cd7b5618759969cb194fde2c7ba3496b324d30555fa287d2814ddf440110f6208e1c7ea3ef84117b51f049146a311d00f96f891aa351a8d46a3d1a808b2decea8347e817ef0f2412d55e346f071d10734af117d8064fb4975b5d62e355329c7c9c19139738abfac6566664e3d3333335bf1e3a98cef1e48f1ed600a8992a21e966082075174c14730620812ac0ba04a15df6ea33b628b21686ec003217cbb09a59d9e8c849bd92b3311ab332305d0f1600a318abe5d559d972039410d16667b274693306cf0ed34aa9447288909e303a9ae5908cfcccccc616c53c921434533110b9e99d951a51d5ed20311c4884421f8f65369a753386d8410cc0a030043e81b8c23befda5b4d3a9e6996a8167304117618c600b1da880072d36c233d76766e6576d016b5bdd3b90f2edb3bb836ac4ef34a383230cf0ec5dd5c117cf9edac19367afdebd750b754104142baa282ae22b3e2420810b9529cfdee20309108698c10b3e204413453022882dbd9c666a74ecf0820ad0b3d7948b385f8cf1ec5f0ed1b65eb4efe8eef6beb0418e1f75a49083570e82f0450cbc00e3d949384d6bee14174124f0a104420882d26a26c27777778f86544be58bd48f3b74800323706084a1d790152faeb8816c877326733333330fd1626666de2bcef8e6cacd92994df08392163333736967e67441c5773771a470192600f2418b1fbfef533746174fa640f19da274bb4ddfdddd2d6b42506b6878a6a6065470600316d8808b294c7cc7abdfbebbbdb68f13df31dfdddd954f41f871e69975d0200c309ebd139271f1f35c83229e05e04457bb8e34e5e386309a0191693ba56a8a08b0ae0c9a0c68064a30a10c181135ca28e2271b9351a3b9667dc1a9351a8d46a3d1888c57db6c074483198c8450aba92a68c98b8d68f663e5c113a2316aea17e849194aa830bf4050f480e317a8054cae90522451e2c4a89c84f439e79c73ba6b61c4cf39e76c2685bcea48a45178ea2a4dd56e226ff2d89b395b7e3fe9eeeeae8af3e99b8a0b75e4ece8dddddd8ece5295bd81130aef7362bbb2bbdbedcedddddddddddd6db6355312a1a1080696777b398725e5d2e6a59d99bd6137a15decaea652ee622772f710398d50cfa8d2db79d51da892be402c582243293424895a82a394c96410afdae54cca78e5237dbaf391b213f9c3c07ab30667880c3414912bc8e7d2d6dddd43aca8d3a57b49f0bcdf2bc6abdd4f098b3016db513254902ae6c244fd5e33ffc08f24441d6badc77c1395ef21165b883a7eac93ef166bd629e4b858cd5753daa9b5efc60d1c9ee328ed7c4ebb977151e1a2094000a51d6e430185d20e67ea31bd9aa57ad59ac985e5db4d3cbceaefa01228f945416b342d31c54c4fbe9d6eb1596d83cd58df8be44d8b7026470a29166b33bf27bed8e7433f18ddd906aa28375140a1b4331d07a7b433e96c6f28cee7a5f0a550da995b8ba6f09182a80368a1d593c7b8aac7cbcf8771ea63d7ac90563a4469b3cdf50c0376dfb7a7b0a74f60e8026b6df37dd3e99cd2735289bf1d417ebcf0792096202ffc00cd00696011c0247c3bc92bb52051479006d256674f185a1d2f88ba81d76f3e6bc03466ca742774bd78c5852e161ba4354803aff0aa0b79c21e5e81b59027ec016958d4912f11114aab584c2e16db2b8ba7e973c7472a41f5188f7194c7f8b660429729232a1860fce4a7300715874ac8388c9f1cc6b7950a8fb4381c451085025132204ac62a9c7cdcaefc86e5a54fe762a0ca05e97a20d2f51c72f2f93b10d4918b71b10569b5a652a208d2704640a84bdb6a2fb72b2f693220586315da51204803690de016485b411db918174bc5dc6b7c2f184e0e13a2662518603c2644c9dae67b6d5256a76813da66db146671311a6cb12b6c3089423b07a5ca37f7b351095f2058c12b7b536311c4c2362d57008db028b4773d8166ec4dfbb8c19ec1ed4f18da1b1054ea4a9815e33fcd0a79d8a69d05d2d8a63d4ad113a226434c8496ccc65089ac673e28df7506a48d1f4a4a0c880a629b760f8657a65fe71025637618153e6ff52daf543d5ede873a6532ecf1428bbcd5b7cb8af185e19e58564c68729dc21ae7821437c5b7c794766a6d6fda494aeab8b3578d44f463f7bdbabbfb93ac6fce398bac6cb0222b1b6c169b35c1afef029080a863adc17ec6a76d62bc9ae9619bd8994d88c3991e23ea685a526bb5b6f3045536e9a4ddd66d5b4e4e69a79392271775fadca2ee8b6ddad7e7fb7b7dbb8a7e3ebc1ab91853cafec59a95927d2f5e2d4cc91226df0faf364849936fffa27cb31ebf27df9fecfb93f2ed543217abf253048557230e2bdf84576bc63767841fb9284f7154e1d58892e128e2150e2bed333ecdda62333dec6a83712cf6bd153193e4db6760dfe336db9ece4ee0b64dd7e87c524a908827036be0156e8b8a0ae2d5e623114ff61c4a0a5803afd078c58fba42b63aa46797cb42c91655c5b26a0da505cbb89ee4431d778692b5779d0fee79fa08d2e86c6fa69f847e3a0cb83b7d8b1115b1521ec6148b9fbefda4405047938f671a4dde88994d3e26269514aad847d39228a6282cf6e8372d61b1c6abfed04b50c75aabb58ac5c5ab1e5e5153125ecd5089186f37bd78c54a9cbcddb4c4e46362c2ab26bc22f18aba6a864ac0f846e57b9bb24999352b26044f5d577f2851379fe9599de9ed33af669d6a40acd83ef67fafedd9f62770a6a763a1b443f2e54ee0cc0bacb5ef0584ac7dcf70a6676f9a23c262ffe81f2cb62ab6373d1ba9d08f28d938031bd7cacff430cef87cfb8f17660486c84084575d916ef224095d210f8b0d6201af803510a4957c54d2480e815c8348f0e437e895e409f01bf45ac28334190e9725aafc1125a30931f558186991688003480478a61c3a6e048042006c441c27dcc049610004d8a1c28a9553038002843a2bb06000d00f80808dce11e92bb5b854130e4af68d12e2d508a2869aa5238492f16a673e52a6a08878b54046b082aa8da82a52568418fc88a279b42264f1230a0b0dbcc22b5ec2370e5a65790221660d9852e64fce2025f6c7ab9572bbc627d175055244fe47c461d7f3d239252f9b6764df33cfad531abd421a5a1defd729164bb9f06269d1eff0647bd354ac4d17e108c30b2e9e06d11db42645f5f1f22818aa466ba61f6f0c15d1375385e18d81aa7db36f972aa2bd6937a16adf6efa599d2728d8ea7824a2bda931d2da8ccc871c44dff39354a8595ce8c138a442a56f9f455468ad90a2f060df3e92a2f8b152f160730c1725d488cd2a31322a3132292acfbc7703cadeb4b7bca0aa7ac8e152157d3b183dfc09aa2219e670b5f09c00fb7617f22937a0ac8ed7055165df2f9f836866e16dcdb8b9bebde50455a86dba4352c74eea60a18ab48517b8f9434b1975a4df77b4a3ddb7d205883a522121224a73e9a923159a325229df54784589a637a5d12b140b5d29bc5ad6b6266d75bc2e88bab968dbb665e01041741d354bfcfc982282cf8f5dca6b441daa209bef0b61576be475f30ee4e9e95aa351d8f1e8a68100bf2520fb83df5009d574232b6b6960730d7073359bdda74fd58641389f6103b6c58593a9155e193e65c03825ea0211c10554c64f19b5327c9e85b0abc5f9dc94e0c2cd79f486c3cf198af0cff086fe7598df12101cbfa1121a98abd9dc9be4ddcd92a5b5492536df120c08686de1b64d4f2b354ebacf93cf9f273f6f394adb3db0fb4293052af528ed0fdc56070a995e285705ca0115034afe790ca5f0f318d65d5a506bd8dac8b7e86738f2785e9be7f3065da0a8356ced8bf453dfd66e0adbec71e4bbe581db228163ea9feaf01308019ee366fff6d1d2f4ce039ddcc05b7777cf52cb28bc81a95359b39c70be42a60a4246a15c9b5106e4be37029d4cd6e139861e2735e4fc0c45fa3b17ff486be45e0d320bcfc879705243ce17e914a873c9c791676f4d70c7f9309f2c2da0bf9deb527bf41b814e6e60aebb3bdad28537f06fdc465f411d4ee181f7460984bac01c8e479ebad03eb9439e33088f7a1ed88ebc474b0a90595e865f89d481ca72058ffb3af0067661ba5cdf813a7ffce8ea74b4721d78037fe7dee8932e7bca6ea1be21e79bbbb0798fd2070bc890f20b0484d809bf40643079cf45ca65e66ed6da12918145c9ccccbb1cd21f2f44804529a59382ea28b9206ac8f30795dd2768837c598f921781c7e364f21699ddac3b36a786521d3d49ea58c1a8642ce93e1709092c9c187514c53e89bd382292959d96a8637dfa4c9f077b382e5279761d355545098aaba3761f11a618822ce7b5b1679f39d4b7c6897c9fb837dc3ba8ec232aea385fccdeed6bbe7a8cb5612fa35b76217115ed8d4f53a923cee3ec983f1c13d26708f289f4994054c9b1588c9b48e913e599f00f3799a28e1cf3f991fec331e9646fd8f9877f9a34e11f6e8a3af68f7cf112aefd72a28edd77dfd683e7adcd5b4ad943864d44ce3e2512c62ab053a15abdcaab51f28463a567d41da28ebe38579e7d070e10dd2fa984c90c93a08e383938a99917cce51a7a76c9535335339d6f0d6f72e5267de3b88ddbb88ddbb68d725169943a8241557552d4170cbc49d460d45194dab0a18ef16a9442b286b54f3769981016759442507ef686798a9c348b3a76cfee9a443ea45242883dfbcc76a76ffa6c52f97d68f5969c63424812c35af1e1c15b4ec6f6212c4680c5213b64488311a85f59f4b0545959fa4c2b6056683e4d9848222141a40fabb08489ca50d451c2825ab610709185109edd33a30a7151d47185e4124fb6b888c52ab2a5942d2591d35cba74e906aec4ab524a39a79c94523a6b9522222a558886f6869b699fd46926555356684555ac1411edcd09ea24eaa1294da587a6f3e019b6d0dea4bceefb4aa5d24ed541f5968f7482ea226b359964cb39e79c73d29e4d4386eb3692048920284804517e8344d0e447bf4122f0f90d12c1eb7f8344d0c3977e83926079396f2009b155bc9ebab737a6b0e84df1866e083dbd21e56fcc5894329322944396238aec73043dad41959774939b94343f5c6b3a4dac6d8ce062c17214f1f0578890d0c47aa3896d21cd589788c51dce27a8da7cfab61a5449cfe5878ebb8e34228d5c80a8230bc6826262c15e5830d6125ebd38c9594d583f378658a4549edea8d28137886e5861913a898905bad2e4698ea21b434f7d87d10694a73edea0e520e2c931f4350f0b76fa9105b3816f103d0c367c8639b8db7009c240e31de6d04ee39e8d1e50058383eebe2dd0c6cb48e86198c39c0e86363ca4a9b50d8deb4713cd500d2133a2d00945d61e78ea3b9a9e44097a2a5326a10e4d4233f7d0343bd2a281f5044db4b6a10d9a8a6892d0bc68946c4e03eb144803a359e2c3aba5f161f1c4790adc6892304bba6894f06a6992d0bc58a44a6228944bd3bc78ad2e411aa1596c66126a16cd4f6812a28132233383474a22b84d7620357aecd108f1aaf36dd5e8175adb50d21195e6a7bd4323fd43136b964ac874770f8db8cf90e6488bfa96844cefd0c874b95aed1e1a6993ca8419a729529960822a003e477822651413665409e849c2ab46f2948688a6a8b413846608892ae32c1f96d752b6a965dcc073db6ad17875a4456b566ba86da8773542205aa987f8ada126755ca0a1a71e0058007c684f652d1aafc6ada227013d4f0385c51c432cd8ea704e49475459014ff65cea21fdb990074b1a5e44f634421a28bcdaba6ebb4164042c731e61c953a7c192a4d56343c990cc6b6fa8c3b096f0aa5d3ebc8a6112e3554b13d60faf504e9df584573c84c9a353a02703da3051a32936fa8fa698a936bec4686236c877016d98de508dc9ea14c166344978b5a2f8e2e225265ad71a695e393f9a622de18823437bea453fd2bcf43c759a1e5eed50b33c9f148c57db9568863e9a218f66a8c953284fdd2392e518cac1823180b6720cb54d1295c66db8f4918f5e0e6f8a3744c30574842add4045604284e967f4643fb2e163a5f13155f3eb9e9037855723a7ee0d7932ead35d57eb7a3e304ca7711b218f938e63c140960f8bdbe6c994a0711edc9546216b89e9c7f4c4048505632d61913a0dc8f26115a86f298829d6363443a6d84bd0236251725b8ea1a74e398e862625b7c91c43bc1a3da21c54e836b2887835b2602c180bf6d429dd7ca4197aeaaa8e739ad877dde634b46685329a211a33ae54b14253e3d502d592f0d878d160794a5bf2a38d9ea79e0ba8d6c48f36943cf58edb4c311314d34f166a8af2b4a9d0ead0b955bc68300e149e5349a594924a49a594544a2a2595524a2aa594524a29a5a4524a29a9945252292595528e5e0e6a3b8fde7aa3524a2aa5dc36efeeeeee6e49a5a452ca6e49a5a45252293dd9cb90dd9379b29f8165e865e12dcfe922b3f026ac4aa7b209d6d03dbc1e93459993c33d1acd54aa565aabd7d364a2eea9d4964ad5ba37f2f4a31c69b05862c0b64d977c703fe79c5372d7d21ca6f626b537dd63967ccc203c3becd0b5cd3a2df9a07b23bde4632331a9e32cf9587134718ff6c1cfb5ee4dc947f7a3973e8ed83d97068c9a019ce7799e27b96be946cf4e6a61e7c1bda1093c1ea2eecc9e1e5ada71292afa75aeb4431a62be7e1b4a43612226e21ef9237fc61d7ae9bb927bd28deb5ae47b2e1d326f4da49452ca9672777777c7f03c9210757700ded68cabd76fdebb3ee79c73ce9db3bbbbbbe70cbb192ff4606db3f9b66d6175795ad4ac9d73a6e6e7239f9c4fcfa753a26d6ef3f34012d8b5cdf46ddb462af41bcc73a7314851b87e83352b6656b76366bff9e61e57c3c918bfa992c4cc3a1f6b38a919da9bcd862ac96f3e026dd058dcbc458a3a42a1686f366f7941bd11850a3fabc3ce85e31ce34614bf6d2afceccd360a73e0cc7ef31cae1c3c28146d1d0846cdd0ea7445b4dfba7016bdfcd66ce10cabd7e46e099e376b50c79a5fdf5d1b1cdeb6647685411a107573def8b78fd2660d55c5f457cb09aa9c72923849e224a93672f9217cfd683432f18cc0d194c403f9c3570d24391726e1152954122e21d51a8b5cc5c262d75ab36a283fba759de7b19c52c60801f104082953569192638ee316586c0651b2aed4751dcf8d45ce47b188578ba2f16aa9942439c723a822161b656593db2d2af6cd5786478607550525e355e394a08e28d9a2aaa08abee9dff43aa223dac2913812894422914839392413c739e9c505e431c4712e610ddc0bc791da14aa381289e3421e32fe26cfaf86aa39a2234a5b4215dd668f52e7e1c4a0728871946f2b26e7e4322e13e6d082f123ad1860fce45b822126c4691be9a89e3c7e705191952a3c662fb028e50b414e08d2ac934b8fa159302859dbcc79e5e5577bf9a36dda63621ce5a8d0c8760c580b5ddf20ad6d90a8236aab7c2f1699a28498529e342ab233aaa0aaf08fec0c327e44d13e19123af0230acbac355ec9d8f7cee68fae595dcc6f376b20999951b2cda9fcfd291d3585065ea162593fd6a67d720f6459736df0ed5e075e29ed708ffa1807f207d646a459f231e3da9bde6435c82c1d89013dc4179ff28ecb133e1a506a008c6fbbcd4d6edbb6f14ccb98819fae044ce863fae85864ea795f690715b4d2855bd8512c258336cce9b36ff7a1048ccf10256b164c38d9861d355b52da210551bf97ec7f8a38c6d92951b34ecef38c679fb5d5910ee3af13bc0069323c61883482fac3ab9b6f5410a3a444f93e398cc384a820867d938aa840505e0b02fe689bf6fd21251111bcc230147c81c59e3ea8234a3699c56f67103543c9c4af6dc3a90db6f97cbb572a79a9148d5ff75e5e4a3b1d901a6496bfa17ef5161f3574962c5fddc5e5e725974e994f2c32e9678f3ac10d3563b11d254305d12bc05967ba6ff481a59a8d061f6cc3c10786f8bd94c4646d754802f876ee09b33c964d2deab85df9361a8b2edff661599d1117262fb6305ecec60d8b19affc14f39188a8aa580c4a062523d3dd3f50b29dd5e8667a5e150794d5993886be5f6d23d4c446f98ee1880287ec71cc24d72b72387a433c7bb7f7f33c3dd87b3e5e8cc60a9ca1730704b4686fe80f0f75a65ae2d95143cfda48de236acaf728884ac778e912469af148ef420ee9cabc1aaa6f79c5bd8f21ea08d278b06ac6841913361a58651f39d8cbf686bfa1698209f5d76d8034f00adb3487241254d9ac18f7b13e2a8851b21a4a566306af302b2644cd180b6ae8dbc79007256b4142953ea27e344b460604696d830ac15ac784ebebb244dd9d714dd4112573183048d736366cd828ed78c9c7fc8dfbd962537cc7484aeaf8bdb8d8ea908802f01bac6d7a836d3394acd66ab536a9106a0a6a084584aa822a4259415de11557c322c3c32bd59cdf92eef5c3928e767409832ea61e136c0b4d3ca69e244a60aaa621a8748d5536492d15cd08000000005314002030140e878462c16038a0eaaadc0314000d85a04a82569749b32487610a21030c31048801000000000022331108d7447e79974926437f8ab4ec513da4acd2b42c56608799385b3c57d096c28ab386d26c1d8e4ed8527879c7e004113e4fb6b1437c2eb7994eef7319d397fbc94c63acd0b2a91e2b3458e87d134100e67ae2bafb4a0e7ac96788245184b32c70c4976317a07a52a52d99531a7254ba8154a5b5958edb95eef28f570536841a639a1a0ae2be30f009ecb10c33417aa292f788b6cd8199133f82221a2c5ef77f7e64fd8734475285ed57bbb7614c92d8f41151872eaed03458a9d604f911bbed2d16815273ebab6fb5a4d5261021b2aba7445f0190ae918e6e34fe540aae84fb8ce78945eeec1aba0aaade86e795ba045470ad4fb6f9b18c48e50463f98d48ad7b23a0abe95ce53e83ccef57e8761aaeab7bea821ac63199d08f8ff626194f10f4b5e2380987bd4f47db9286fe733cc3ef6aea82239f50242f513d26269b3801bf0971dc8c152b5163e91172fdbfb41574d7aad2209a88028d0132fe45a47de75d32a55d91283f14007e30e7efbdf743f748e6322aad16a6a589c0f0eb6280d9d4676fe42807a503d007255375a5269fa48d913d9ba633953ae101b05b3836eb2993ac688ef5adcc0a9c6a7d17595e32321714ee5f287148f842f005a05c0403d6f100ec657b80708876727f23411b4b44c38a843fac9731c5b2077dc33ca357b39d9ac65aaf492dce2d83e83bea336c263cbfd273963258405d58cae2041df29c7822c9faf93aeec1195821a3b11aa0c79f19823f19b286fd2f939d91c9aee73ef21ff8cf3a29ff60d26a07a8b03c7708629741610c79193a8a63152d56d16e611dc415dea608701353aa5faf61d9c5a7cb84d3f5cd1697fb4778e8c242c0646ae2edb4990d7e0a38bdde623336bc3ba520c2219efb6b88be85e202856de9e82b14d8be826371cdd2788da599deed1bea976e055827cac304b36b26ae85fa258a5a0ba5afc67e526b772fc58fba8049f2f151f5292cd24ac75f93d075ced0c24ab386a78c7b394f3402ec682b1ebcb529d3236b0946dad9c81d398d1ee3635da6309903ce7eb0494d5791fae1faa7b79376da8461698557ce3a0a6079972267666e625ef85958ab11ef71f3a5318fd69e12600103915ebfc8ecbc1a216fa7945b62dffa41f54719132ad6b56f96c06280f6f92b3f0670fdd9b1e40b745629741f4323dc374900bcc269048b82ecc9be778cf07fdca20d8d1feb44182a6728bc9e186952b5e3444a14a4fdaac1a9b60959e7629a87e65e898f02c40e252044c2e56baf5026007d561f6573324ac8918649ecd7fb134a7b33d2f623c8c38c9acea7498afcdfce4b2a4af9d121585948a60e4f51f2589094e42ecdda49ed4d31a2f88ce01e6e0083208df2fe03114d75d1600351820ab37a937c1adcbd125b71f88ad498d6aac67fe5980ded22388e03094d8b18640dc20f1ddd56120595c0d8ac661d0f374682ef8f65274b2dbcbca65fd4db47cd980eccee6d46e6482c591baedae4819ecd300469dad4cae31289cf732c01026801e5b6b686af65b057802e07bcd6a76c255776423c9cd917cdee677a813c7b6a54e16a3cb23b0670273164547d6bbf9c89410d75bcde793bce41d2045f796e5bd1cb6a2ff1106141c7aa5796c38b8af038463b1e228fe7c7e9817c590645a25b9aeccab1dc867eb422b4d07e5eaf81cd4dc2e93a3e5bfb2617c815ac62e269f17f818e962fb7bdf8623d33a2fcbbc6bc2f1318f652f8b0c8e1f4bff5cafb242d434577c4d92cc31977576748fea630ede1bc0ff8a1f377047c3d79874f3fad5df28a81948a0edcb24fa8fa808662ea2afae4e64a223192e740d69bc0308926752467c55db715236117b9cc6f618a5e4205068942c6f0d92d8e42f1b9e4eba6b063804ae660333ccfd5f849f5bcd8786a567dfcba5f7eec5e9d0d1ad2003b698c43b7cd5dd0be67bf876ecc8bc57dbaf832b74a4462c893258d712cef2ebbb27d9344c2797394e136a99c11b7243afa7bff2224b951da093d207e1dd1c966f22482773322e3ae8b99cf2e45048f4025499b2e41d8774a72b4ca0c17ef8f72a9be8517ecad714fbadba2feac19b95662c6d682653e0b9dab682f7701f69c792acf96495083529fc5823051c8d7658dccb89bfe5d110356dab39f11f18e050d7eb83f4a6bcc0261a59feeb9bda211dd8c7981180e94083cafe9def962fae90689e5280d1d5f577971243a91fe38aa780d8754c15126275a476a069e12f84a6cd9a57445a15427c07269540a62a3154e076edc816b9d82f230f2f022bbc483b6ff1a33406595e045e3d49b76fbb8620f377ee83a824129ecc9da40586e5fd787a06d8add6833afbab5ea40a00da6cca391ab8d50a2cd3e68a31e41f08322b80ee1ab5291f124e64e76181af7b2439450d8ddd06d57a9aff600b13d89f4d2069ba7859ee8ae32b55d8063abbd19e137261d696b88485c22819e3865eaa5abff346e82697f4a9958cbb0473be3146d308d9efd83d8a469c25e9a783889fe9bd6ee367b4afddec214bfb77fde9139b6d09a5b0cf9ed325bc3aac6b4b6586e1c592717ea0cc3cab7a33d87f7f636a2672c1f1f2aaefba0a3bf07b3834f519bea8b6a5ad6ea16da8b775596ea946ea1daccf1c2d476698b2a27fd0e52f2e3a4bb5df5020db8562845313c749569cb5236f50c7f30bbeabd274f1e332dffb33ed8e0da25496321845aac0f96fede52fe30cf8691345ba1b944db94b0e064713658025597fbf61a4f4da293b53a47945a8b5ab6e00af7ae7a88aefa4c0f8bf7bddfdffd8442c285eb53eeee35f3f88d069245fc112c82b7d8a1ad6e57754f2da0bd08af4882121546fa4f77c85d306d368fe0f7b6cff9b4f0af5102a4de979f3fa449441acbe2a8b026717f93d2c3258dfe539c3a877a6296cd9111500a84f86cf61ce1305f552f73336fcce54ca8c186153176f491f93487cd4791ad3c610c5a218c6ee841129cc7b210c3cf6a61e4ed29e6990b62857aa5f63e99917d54a7d3084e042d7a9c6127c6fd876d4712ecacf07452abf7f219f3cee7cc39a37b30acf1177e07bfd1c0411f0390406d779a976016313631344c1680b1878ffd6ea1e4cb017c2d855ee3fcc1d82b59dca609c11515786b7fb078326f1a79ed7eff4d6c98d09ccd7b94366a1aa5f0c16e4ed2135b0ff1b121b7542a4b7a97e4af1b917b6aef5fa962d40c5105fb52139aec8b14f95a0fe4c948c08c23572518724d547c50d425984c36fd9b623f784995730b1f2c33d3c266531b67879d477855b9ae3b9e25d7e75a881d362ceb02ea9504518ba7cd01478e31a1ee70f9f4809af08b4a521d6299a607c80a1b9fb2b781262dd1781ee0ce07764032a8b6cbe79cbf67561afd5606c882010dc36f0c4e65754e08a45d6cd4b57e15946f6205083c55a06339e8efb31914e533e74e0145daa43df666137bf65a80970e12646a72528883c64f507f817518fbe84da0ac09e01cc8c5ab0299253f0318f631e33d190e6058810f0138c3df5b945f483ecd0a5b9fb8c24f14abc8538a9f8a86efe13665ddef05cb4dbe22444836460a336ba9ee3fdd7db13e482b4a459c0d8021a811c50654f21f51ae9ab5bf1871d55c0b7f40585b4fd36b20f0b2f7e262114b904812c115da97481727341e935fd0b08e8463c8af410e1c68783fe4c29c1702ccc5c53bce8e880ee72bb18334533ffaced1401e12259aad6339bb6160707816957f07a0c1805e19cb9dc733e3c40f3ca4a93feab23ef1c7645d881c0bd5c05023b6dbdb0dd11c44e0900c0ae77af9a9b789d777c9c17af5d86159e91144a1ec42116c9b9eebb1776a99f937cbf4906ee51b03a8dcc4e2b5a7063682d4d6df5481a2f52d71b46678b32b747fad48e9cb50b276f9f7e46cd1bf568c4c805578bfe359f5d88e00b4ff1d5d5b05a66b9a60a5e36a308d855ba0ddc2a970d267bb164a6e0441a60b48572ba5d71d1c79eb24911d6e515a849074c3aba9406071443d2b1b95533fbb1c7b68b4d005d72ee7b68af8a108d606daf68ee6b733bcaca239f88d4aa51936f6543a302bca26dee6bbc93595b8ac24e940ba98d6bbe81f62d02804faafac59328c138648cfa3b3b2a11aa0c574aa3adb7f37622b0d47b21bfc4ec35dbfefde0ffc909f71ceb8de365edd90adc24b201101f56b39ffb2b4ab5e53a232940224a525422ca961184f149d9820c4e081f96fc20e40780430b10e14d0159a3bd539a032797c143b21e662188120c50788580b4e392bdf2864e855ea9583ff96d318c150ccdc33a6d7e963fb33b00e71d5045543ad4ea7b2ccc83829d133de2ce84d35f3177f3e198ed27053dd0a19e7f774bce1036aac6d7ea912ba9077978b9d9a69f5a08aef5bf8c394e3d9fba6cff78ef64502550ff672e7ee98d890048c29ca3bbebb577623abb0601752d6f585f129a2c9d91895fe267e135c2944a87f4722b9ea4f671f9bd1496a7e85ec47e227ff76c09e1a0726d86910c9cc13cc4285b31b12da98e99dc6d82b7363413f69b4c99f6e7fed2d91924d5005d385a4bf6f76294560a41ee8fddfa99541138e488730cf24e52f728f315c8fa85c00f09262078136021bf565599592da1bb55ade6f6d365bf43000da48cb30d490c4725a3e11d8bb404822e2b78fcca6004aae57890d73da58aac34835913d86702ca1b39e066548a412cdc04132b8cf24df93ce33aed5d60786e012518763e0fe0e15be93e3caa63a277bae321ad3c2bfb8b2c7a724e03ba29726125a28eb0cdfb3ea2263439f7a6790786a1a5bed141ea777554782a312a03defe89c5967adcdb3f6be4618f9aebc37fd18be31bdf303630fb6b82f539d17966f1abbd21458ed730b1666b9b5b1df25192331316d9a10062bcee243cad2bd038b8f1a417458a3acc2690530793cc33e5b266fe540e96fe811517a09ddfc6d3f7eca4c790fa2b98f0a6e3c1aa8fa954fbcb445d68deea89c5182e618964caa028cd5139d1aac59b1100d00f80fa60340f41dce8495279fd59634e93d857a496cf66ecc4364d2734f842cc6965ae90f6b387bb74c302011ab7efdafc9e7237e010483efaf450804b811d2cb8c425013f989659e39c7e1456f52abb30caab4fdf126a673f37fb32054aa0a11cb6ea7efb7a66f8ce911a42f0a801d11369b4987c589a614f92e43cdd3342a46af60bb5e82bcd9eefcc6ce4b988e6fe80e1106569a72518f025d4123c7aa4e7f24f02552a45d5af383f8a4f2be38e6178b6d937be6c5bff2f229a8ba3672f3be1847e6865fee165b88e5c8363156695d66944466a3f606a0378687f6f07231bc7dc33daabcc5a1a361726a2644f53b207c5623cd92df5ecbc40eae79628afbf44b040994d5f6e5517750abad02898d05ed07b3f71aefa1adfca7cedf1b578107a80d1fe1e5a086f5f22f0617838e901925e4aeb3c3638ec6ce49e37d86272ea6690e1aa3102b57468bcdb61eafa20beb9342b2d6dc941f12d2e151f65bccf4cafd7dc02b5e2ad5cb4ae6451f4d2d5f7118017ff9830335cb0ee03469abe55ad5d293a244906fd88409995a5e8010f974a7819f0b4b98213a5f352878397c955e89babd9c5cf9cd78d976f8d0ec023999ae70d44e4043d54dcbeab60e983e1831dfb1e7bef5dc6b22ed84808fb09a36421a44f1ada21c40220ff14e06d110ec7823b4c7ffe222392370b0109f2294c897ffa04f13a1eb5899acb30ca627aba218b1730ebf92456fdbd0b08e32154e39e202adbd8ddc225009a195ed2faa628f1b7f801619bc3365063941e2a7f61bcfaeae6aa5d8066baa9579210f5d18f7e53c57371ddada66dde5a30a761c337e860a622b1fa65c50ac92e80bfbebffac3cf2b894b537732682f2dedaca7e83f4d7e54424c6d68203cde19972aefe92b1fbb0198b8017d24976c533c40b722b84b68ed86ae254df781ba59dd5f182fe52bfa470b3035f37a528da95de89fd6130af768716b261617e17024c6fe1bba5a42240e67b714437c01395775cb6756b1365ef7415b026803497277d71c735b4563244d70d9c1502fcbbd62fd22ead15f20666ce84cabf7368d45980124e3d66d1d92c0646e8cbb19c403e29d6aa58862dc85a35286da986e68ee04e56ef05a277ded9110b0a1666e29a1ae54dc7cd21bac0244d947521d0b2e94041192c9d53c0e560513c9c248ede5ede09bc3482c56656a3ad0d16befb1c69c83d510ad16fa69a96f5c454ce5ad8edec48046228a4802bce398236a8f8bac85ca1ac65a76b7ffcac98d6a8333887dc8d4452ded434789727caeb510cd4cae6cf834d65e1fc82e74396fbf8f38d20853ae9324154f8f82276468502e373b1472ee60af014bf50a29add2e596bb14bfbadd886c9f3f84886d7fc7d364314256b131c4a02c3feaff5c011d2db863420348e58418e506850c0574b8ee4e885c8321464c17f63cf0bcb60c5505e73e5a503ee3f8f6966262f0d09921ba39d5fbbcd00d32bcb95f0943766790086235c28fee01212fc897393e96ac8bd307f10458d1b269003560e8910b35f2b3c62892dd28c57d1b92cb634ec88bb9ee35b000dae4850441c9ab9d666d3bbd645c227d7e49164013a660bb87fa816b53dedd8d7b429c12d3cb5391bad7228fa357de5915f9e14fb804e7e1e88fb684addbb82c37b0b185227f6d1f090d811e4c4667bc3c1ddbe2bf9b03f16702a07cbfc361fe07f8c8202d9a35b003a9b629cb2c9d7199da9969bac34d30ed335a80cd9acbea5d3524d89d91b6f98e3c136f131182a11c2e276020553b4e7b6453a262aa927c04e3d3b5cfd136135fc5a54e57818053598f48912fed97327f53992367c1c17be7f7ed5a9cab0603e2d643f9a837cb724262195be3bcc85f8ec471ff6acb747f2397bf804801db597bd83a77426db4f5e3a7c92cd43ab1824ec056da221ecbacc4a1ec3ff6837f4026fb57d6decaa33cd194ba9808122091cbf38a27219c2f9f80c4949d3112661718d222ba95f60b10760b8643c2c79eca513a4e57bf621d245a93a5cb086482f27c12e5ff02174341bc50b00cb2340fc239c765f258e7117a9a951050d13d716585a2f0e36d0b4434a8db322527db9d2a1ca0a2ec5d8b223c2e1d9548317ce1a5e76c56b357f969608081db1cfb5096216a5a9def2199413840817371230dd6a35dac1342de8476f0c5d0940ff271c0223f3a19340b5a35e6fc8583d5a31e323ea13d0d3b808c43d55445705abe4354fd91a324ee8fb9fbdc4da96c4fc2e29d133f01c157492351a7dcac1672035490612c31c9f8e9c5f6b953e9188bfb2086874a11ba853da537711a104a371569d926d8cba33585701ac1928a427f10dfa80910bb3e5fd57002d2d088ec4a7abd02c62576e70549ac9910aa6cb987bdea4015d31030ac457d627d3bb15a05c9545eea3794cb2a4c718b2d917f3580b09cb1528983a7bd69c655c39738f16783f465e7c714188319e3315ebb83ca893c9bc918987acaeceb211abda26517c7dc658dbdc3b917a58e4727ed657fd08677578151647b461583c9253d2aca167b05a1e023c89226ac0b50c6466a6c8003e99da717b0f8033d404f993810ee4719562bb3ac4ca139302a35ab76abf6e01965cffdb2977e91a0de4e628427b9919237ef2fb140a4ef2753c918653a95d1345abbfb7a985e53deb2b204076592e72724eb02f772d98b49090a4a14b30f30de0c26fcdadb5fb0c045d18975330046b995f295fed824411ca2a4a1c02bd2612d491ab205a504db8c2661387a18314dd72c8b99691be2640a4789b58c04e8098514337eb268ca2c173aecb2902893765aed2fc6fb6d9e30b71a542416ce209f298a3cfc56cc3a69969f380e3bb28d726a6cd10ba638d40bec0d5d283c7a2ec401fd98ae3604ab9014c2bf4d5e46428b6d0ae657df939b0ebd306323aba00de5ab62638b2fee4a296889300c4431bce44f0c954f10475bfb3021b0a5afcb3429514947a62a0f923417a933bc4485e6952614a5e8e0a39f03e589366230bc0dc614e9e207b726c659f2896a2c3f83d36ef3af58defe0d5f0b6e75aee6cc9bed58c1692b2b4515e2eda93a01baed4e3442a6ae05bf3cfb09f2bc00d4b81e647971315e0b25a4ba61280ffd60ea2e6fad992e1a14b94d500ccb9e74dad144d2e747025f6b3f11c4d5dd18cead4095c3dd55fe58f7d9d04ecd6a02c7d288754b1f729c5b384d1d3600b9f620cca204d36911b82e2494a56806476725a0e0b6413162b1a52c82e8cc89e56b68bf5303760a79ba4a1cbf56bc814d3b1dcbb5513937e0b72da5cf37fee3345244c8de093c2f3c99b6841c6a1842c8e605dad0f86bc5dc67729a86aad01e11818c0280606c9c06b33b0efe2dadb7c69ccaf5a2d8c0648d30c8c44bb2c455b001147ee1f4bed8e15d577a6cfb401af7134209da69e6ac921a0f3e0808c236b8dca64b644993a3f62abfbc37368d4e6a57292ab45c42a1bf368812af3c87de84002a6484500b854297b91b9d968c405eb7afabbb33b542a929a88ea7a836480a8b51293b15e3db4b599950446a2a3931b7df795617111d8a7bbd8d3c8df088b6ada50ca4d6f97b57ca9f6201f90be91bbd9098a0377e595f8ba8bfc618533dd5e82aafb660bcf55b5e1f6555371d1012cee98471135246b297bc3465d0229bb72891527f16b6bafd61897b1e513f5500593f14ead5c767ec094c5be52e87bc586824e85752892c2455f980b9594fa4fa17d9a558cab9b1e2b10f818b4e73763d6198bda6d9b3c51019a5d685af90d98e38d397a9b70440cf8d8a74b1b363250e31664028a15908b88bdbe21edfae061fb7f89ab74b830787f2da8ffa06b2a1b2c4f329efed6f75d468f4a7de539477913eee2323b753264095a1a4754fc2171bac060654ec258b1eea81678345247a4290835560938716e62e2d13be9050efad0989ba3b3d601b03244b655b3a24d0b4d1dfddde721c0fe779fb0a57f9856b378bfbba04e87b66429dfcdfa20f969a8ff0d7b52d21eb30f8ff65de86537b52cc6e9a796477d335efb6ab1762252647d2cffe63c2bd79da0911b6dd6357da459bd6facad60f92938f494bb5a6035d597674014bb38b47d8b58cb0c1d85a811c122483f1d9a6299e0970174563a249fe75ebcd1d3b683c0607303ed0cca93884633defeb76620a62bb4746cb189f4261426a1cd2c2f0057711e64708926816557d2c6a7fd271ea4a281b6d39b7039ff2cc9afb3685cb57284afcfd7488bb6ebd38d1e0243e4dcf6193b0833c5225e07ce4dec270d0a86f11bd7a5d09f51b0e31bb6e5b34873aedfae2113ec752981fffa04c412cbb4ff4690c427c0e91d563a0360e8a23df4e1adb7677f8b0374f721c6f869c6104f9c89d0a0ef02f39cfad1cd4b1e3d5cacc61b1bc45b6cc9110005a26561e8e6623c4334069fc326ebacadb953230ad68571e0ceb3d3539d7351e47963ff7539afb92a46da1f493c877446af27d8762bc48a61c593bb471e4b5b102ef66c6eedcff2b23e02239e80d3d41b68afd198c7c820dc6d7036adbf1e214f0d28abaeb2d730f22249539787d968d673dc9f9343ebd7d04c9d6f0a391f9775ea13e56c18aa0412580d92a8d342c6feca48f9c7464911952932bb94720b008c0025e947d0677a4093c8ed621b87968fcaa514e1607a1ac01e55b1724fd03523ed7581ca8ce76079b5819be0d5314f506230391c8fc0bafe661e18db46305b0084daaabc0b76688138a62f8c82816bc97cdaca58d8c23ee513068d8fd480045ddb700c3c42d9b28894eaa2961259f895ccaaa533a2e0c58152b1126c1902cb587d27fb7af38ec19845332a7b611eae19e45472625e407d8bb00f6af5b44c3d8a1eb8b1fa0fe3cfed825e0ae455f2c270a3539899da1453f33d593ad682c0270367c23df07a9ec7806a2b7924be879a32963bd61702ae6d1cf663dc0ecb0d603cd27dcbd39edccae56c77e8f64743b2db61fb790baf50ca5621f9c857b2bd7897132fd68c4894beb6c4cfa5fe1dee98d2282f63dc95b38bf6d010a19ba7e5b3ab46532c148ec5b4c090e67e4dca5e43ba4a8b0d843ccc4cc89019e3250d4148248e9af4662e04ff8ae71d62c442ac8125d6478df8af69d0f7abf3b6545b58cabd5e4a4cd577087fe51ef2947c80d080ad28ac353c41241aef2966200c1eaa1294ef34f0e3f7128088ecab80f723918653329830bc9f6d550c2212b92e5e8f5afe057c15a169404402c41aaa6b6488602135f5cf867e48d48ea1273115090145058fd2b2224f56d4a8eb6744e63c0ee6d85ecb695f6a3a2148bfbc396691365dce396306215e4c4eb6ef9f95399e1f77e41f8f0d2f2673018b9374a5f20bfc42e8e82bb8b7b5713537a3e07ca2658272226a23082938a9dceb0370e80a851588980421ff7a72f2c5e3f51e6fbdca8428cb9c110ec6eaf54d9ea845503528813c5d671107bd07a2d9052c3a33aee0c1b3bf57974c4f0f450e2b9e7d3aa2c93b3da5a0688f7de9074441d1624a05faf5ed5f5fcfb85118beb7d74f86f723c45f5e5446d6e232684ae9e419381dde36595394f64387882e95181649b6d4a64789806caebe97a9988fdbe8f95a9710e1f7a6141adb80024298c680134e75cd8aab3f6b1b0c64d1a6ce7eac8b2ab7fd214b347c4919db77fa1c9518c5c106b7b379c5ca19bfeb1fe8bb6dd491e6ae4d81fd9f0cfbeb985c6b24c61f5a89d9bdb1f8585ff58206f82800ba46a60508ef746292becde2e41a786f26f5553a5b7bbb7e3d5241bb3d104a810490de34c6410854f7b05d15842b43afd0b4c6e5d38abe8d1c436ea1d8c45045c2c3c73f7de00c65d46e26e648b8eab0c58288884d85345500e45cd7c61f4fca7a1214c443025d0a02cd0a09e17914c1992407744e8e467538f31299c1035f968352b3d45f6333c150a76c28528e440198b75cd6b71056423bca0ed4fd9058ebca4064a476ff6e05b03659dcc093d1654751237173180fe33b127c3e30c20ac9c3de34dd4a4f5155869290e9050c46652511a589d49e9e724da582cf0d131c272cc11c1d08652019ea9bad81052837621278f179481f135435265a26dd126edd4ab685ad686e13ed8f52d0490036e30d050997580c0dcb1fe13e51ee54de6e017c453188ef9ce485d1c1b4d05c00b53cb486ef48235d238d0486c11d43e121fe88ce018cd5ad0db863cb254d1923344eac285330ba3f7363b331a13aa2f72d9b974e63b4d144d218e9d265c105afe4876ca4cc08ee9bd710cd227faed47d33668b9adbdb140682799a1b4958f8dea54c7260ac0e31ff7c3a3cfca761eebaa1cec1993305b1fa19026226b0b5a4f31275b75d1cdff864cc4be20f7f27a8cd966d60d0f59141cd68a98997151ae1741a04acb24d8099739347e41a38ca121486f1fa7d8fba129b2f4d72292c764e0ec4aee44d9e9f05026acd6b33000f8133106e1cc039207e1047add88cf18737c6d793edee875224f3dafac905c5304ef9d7d896c10bff4434e042662894d08c1293885d05edf180b89f549fc0b85c99fee448e3f780e91d46bca0223eae62e2ee979e590cfe9c5f242fa4b530841df54ead4b0af85c5f19d23efabc52591c7c77541adab3703709ad8d45c5a6a741b671c605b889ae1f5ba4d03edc53f702258be7235e35edb6658d75111291aaff87fa6b023a3269e896c1593e00ff2f1e3f8728af17cc2a209614b2069f1edd98a73cc3aedf3c094fc34cded5d20ecaeabba70e96f5ad21737e7f255072bfec055ced391b1eccbd6739dc77217a940ee154862df8a4e4429dfeedf35564880470b926b2bb589f9889e2f21b62fe4e8e7fac4f66a420a8bef519c2bb15e1f3742012ac26dd694871a30294f5f55092913e1e1948ceb2f81dfb0694b66d88056c7b956b0f4c9fd103619091590b74bdb8a08245c36e968792d074e73d317d73b756119e48303547689f7f0489ac5980468dc84fbf1b7c50d030473a7967e69a69114c215a025201e04ea114c386c9b45ceb06dc0644bcc4f39b71e0644717f64e38212c668b3948b729cf78e7abdcae7973673ed715db541f74246cf8bcd9bf81171a304917efa89770d45d8397d7f54905c4ebdfbcc7d602815cef6a7804a3121d4c3dda6689d99fa3d00454be2f8414c0a5c7dd6362de8d33695b4b67926f2fe442784c161eeebac4e99c0706fe350cfbee4f4a64d1e54a218344e97cbd48f7dd4b41909850bede2583e4c0227e00fcb118eb623d170a94ca2477aecc733ee30641f6bf49a9343a1ad96a11c7b7ee2a4093f0c68d9200e85da64a129aa650f69c80d63bb725e89fe640c18c368a4b6eed1f7e86cf5faaa1b8a0e80f1a4e21150d9c2965461cbe3ebc6492017d8865fd2be4f7e0d39abdc867a6975bf787bb9a01f762461c7aad12b8b5265c4acbfe16a09969c7bcb63de745e7dfa63623c482961c197721bd5eb4f412c37a4a265694258032e800bc1282618eec01689d272fb08d4f30adc12f638307e8119b0d4371ef671d0219ed8f46cb26e71f3ff0b4321b3ec10fb1e95afa62ac0bdca1b8253c63cc5199a15e609e6f011ca672ee3479eb0392f52b312b93eb44d1607c4b62e7afabceaf5986c965ed461aa4f25960c08f2158f44830efd3fd63bf7e93ee52c6c3852d4c0f0d7104f23cb06c292afb779950dae77b230810c50086630d315dc0bc09b710c2b55da532c6704c6725cb6b8ac3a08905e90fbddb287b8950a343539dd3868a725ac092094df91b9de39aff9af4f8160871725ab1cfb440b7c282808b0f5c53e5722d390718987bc8d55ace99e7abc6bf099338007613129500beac5e7d2bbdc320ef4fccc873cb609a874ea9f79f3c5f364f018c73080e138626b5748ed9a7256b72444d49058440abab114135251adf65109fcc2a9599664827dd24835140c89ec712849355ed7b1abc2f9ce1c45c6999af33a3c6124e85dabcb8f571173b32828d7b693ceae5f133d024c1e0086a3d93c875b5192ca68a4e61589ec861f14571b4e88a92e2986eac8192333fae30c739ce02aaedfd91b6ffc269ac9123366140f6dcf789db1fcb28c1701a3cd7ff3d21b5e62c45cf7739a093337327064708f9a0c5355cfb4f90ccc416b237a91108046585f6ac15c1fd591aae9177cafbae9a7a9cd823dc896ab51ef196e502718f967b8c40baad6a86accbf69a44df5cd4de3bf7842a5c7bc23360c31acdb93ba0eb43baef1a0db99a924892298997ea0ff3e3814ac43031ee3cbcb3e39b6c3fb992e83423bcf53b1ce20011da6afc0b2ed3ed53c56ec95af03942d7c296b4a4916e5366f4f296204070b8b60e53f910f68abe2f7cd059090c1d4049a07197272f63569cb67c60f21c552099de213cb67bf82a2b79408d1d0dea583ed63f531594ab71676603b4dd54269328c4498db0ddb78e378c11777049159bd30bdaed7e23132c6d63e9e55c4f123a56eb678eca24cdd5decf6ab30792ce69e1ff675100b705543c64a903572d7d9aacd29d029228c38471bcf4a7e457719eb05d6cbdff2239eb640c89aefa0c30a9931cf8fd4968fb2253817d9eb37deff7666daae970df00f98d27db76ac8b1766a4ae889fa730e275a2348af6e6022667af2ebbe85af55907ef7c2f5ff8642d2f4a8edb49569144fa100aa5b6e06036c4b45279599b72a7928b4dca1b689f36d7a6e25cb588724fcefe1f847aeca50ccf1a6bdf37e91171f61402435384780d58bd70c142e71ee7e5ec3f45456b559c6ce390b303832b333d6cbed9b7305051478f9eb2792771035b4fbc1df91afa189713d772224410e7ed2f99e47724dd65ccf9260945f9df168dc3eccc6c1e918b0cc78ace6f5e86e88207e4470fdd5586fe2458cdc6be013f955604d33f473fe32203f78c520da8c4250b748249574a294362555df189b571ae9be57e90070149f41f740ae7386545bdb1b2d0b1e19411c01a1b5acdd750b1a78a69adcee3eed25a2ec5ee24ce5f28f464ae573417a2f791bb7bf5d4b1be55a660a639e7d792e51b7348ce970e111e4b25046517f77d3796ea5696dcbd3fdcc564dbdd3cf92deb293fa9b59d1a6cbb6e8d729db523f21ba5232a349152b902ec2cc0309d5e96ccc1be771592edc17c4b83e1137002679bc285c0551a4c995e47ab2474a13c7eaa970f91a03a3d886d6be57377a1f4b832545c8924702be98aca4a13261e97814d91021e3d40c634c628f9284113914418d7fe718bea9dc0cbcde8edce3b96301f1c4102aa93626622918d6792cd9f1df8d81ffb2cfc53c373ead6575e2bd566d9cfd9c5ed7b784148fc20c6cfc044b31e895e6ab053564a69c6920fc8c6156af8f701a6945786f2a5f37b2b0556929a922a29823693c461424d0bce029612131954d22d9f58dcbb2c4ee9b9e4a498d59779710197569f07cb158a431859fa6656eca2edc35c5e6c59d14ecb48d02a2057f8c2174d504904ff673cf9760fd57b0b7f4a5253e4e17eae6bbbb96bddced259e0afc2bc756f19510f9438d7e794d5efafe9e03717105c05a0d38b9bdd458725bd984ab1a34bf6dd4a403d24833d94f1f6494f7d34955a29d8b4bc8fd274e72668e1e13486a1dd27fd5b267ae3a6ae6f174de316820197c4027dfff22c1f20430dcd015e4fee8d0b4c4b047377ba261f8462cdf848fcb581818112a65ae22965f13224019a1f7466c7147d0c355b512183e2e3380414b08de4162924c4e425236d447255b23d3c5a247547a082850c856cbd606947304ce2132802bdf0bc187843dd7836743c51f40546a1bc3436c6fc56d3ac6ad2d283920a1fd71ab06974b55f472a70e0ed8b0c3ed6abdd247a73af611a383704c57c49a55c548d9c665c222f156f1ac472f891d39cf3ca6e1f0ccfa46200c03c84ea7ab270adc1228d406c922bf5d87b4882e2ec66932f0c0ed565081c23a00f0accc8cefa3bf93eb0f5111e1e8bdb92cbfd0258792773858890c5d70a7453a0e5318d7854ad51dc3b160d7073c3f6ee803d5dda67526166f537e30208d523be3a86311b2df11af7873f3a14718d0ca7421d1414235653e6e823ad9e6fc210136798c62734eaacb065ffa2a15fac6fa6268ec32ee882fa1f155aba192f5b76710e41721df8c55bc8df9359bf8e052a39b60e5a34fb76cab143f78e10ee283ed8e586440304fa42d62154739ed91a90f12e23bb516d53a9c0e39a5b3d8b56c09500ea91e58530f3bddd5a6730a8000e6a26499538009a60074c2067784486054294c739155a5733ba7ccf8703115a7c195491730b337ac166ea6350d2e27720eafe902b570e1144178a52f44c7e446304146b411618133808954d1a76add8af97aaea0da613e366e71651c60196a2fa7ff44a9c010b5cb9f46a4dfa9e8c52ae8d582d63d3189ffd9d4c0eeeb97c1abdcb157f42490744357835c9c2e5449d01ccdecd67d42088ea666db0302c115aa077f517d0b86e598b7ba0d25740effaf7667420733afdd420152acd00edcf69cabf39982d381c800cf1bb3e024841f5c47e73fdddf61ed90d938939ab65610d9d4d4265f36e704b81231a1e59a733a5f5dff80d6944c5e9f45e965df3c0a19ca4a091271bf79ae84a43d9efd88a4daf89afb45b3bc50b4cd9adf48b24a467e968dd9e2ab587119fd74fdac89ac0d7a715bb65944a5352636f16aced636955b538d69a74139c993f294b63aa83b0503aa2efb950d06e963b51d8b61c3aaa47776c84c653bc9d4583dabbc2d07b52316c4a172ce1d579c4ebe11381fcbdad757ffaba74ad10a444895c58eb67c7bcb3ea81d2c93510e45c541bef3195261f31d9ca4585f6e3421e93aa36f90b23b08cd65ebe635e2a51641c8194ed0d51e9b91d4c0f8d8569d8f41223ef53f436cb9d40f0eff11ec490f3ac038bbdb13494d2d5f8b1bf1f24d646abc2271b87a8d4fa5a81acb7551ae66d9309edc431d3aba054328b1c554bdac7a9e83ada30d0def5deed8787a7efcc13be51ed1388068efc7ed2cc7ba24a6ba1b0c4736a63d99312dbf90e45b51f22be53ccbae85497724bacaf311c117e6387d8f9c2701dee0834e578bf22bc62f01ea0dbd1130f43cb9de0b7acc64c58455be81436479eff3a96748ca217d449bb8632a7657a5a791c7660f0ea242c0780a02091e8423f87b49f4d8f154bdfd0a126e8a531811f4248f2f181830d8eeb4adb5137a31b17be575b4e14af47d953e99a4bcd228511a55186891d4387eaef9589c10f40f5c83cc6048e67d0431c4cd0e160b58987555fcf54e8d2feeae28ea9e995f77ebadea0680b86f1e9197f0b37e0e18531ea4f0a846cd211ea5f543e87b195d6dc653f85535e889d8e6396b25b5e9fc3f216eb6600f2f1d727b475b1cc3a4d4e4dac37dbc46073e8747b3a68b1403a9634ba789f9bd81125b6f2392a7899d2a31b7be0f45cbe928eb08f468f0fabcd4ed41ea9815f5b18858b14b204bffe256968210416b1c51fd93258602e1d05aad9c6350af2de2b7153da3a7f3a8b475964c6c3bc5db4818656f1ccf9a3cb83e39ecd4dffd8e15a69c825986541317219747a1270b49d0d42e99772854b4abc46e61b3cb822f6b29dbfa5978110f195f3b4ab64e446f023299dbe2645f7a5d7d35c254480e5c05b1c7d340d3448bcdf8d96994ae6e62c858bf6c11aad5552a4730ab57dc8e226dcf9feaf231a4e7fdda69488eaede636bec3b32a9d053343af3085034eb110991f2558cb7a62d15edacdb703412e5b8a2947a5f2e1c4e57a3eec982d9ac0f492318030126d79c88455b270d08dbcaae6fa89a2d90043e3f045f4a537b7f3542a0e6788538105c2251b7a161a6c3479fedf868f2ad4a9dbaafd8eb544927ef80ab5fd2ab51bef2e168316082eeb712054653785d9bb1506b7c24c673a6063a969ed4e67bd30094235e271a52baa9dc689967ee2fb23c3af58bd37b0ddba5200008af50ca6f7625a50e551356a36a68e0d47b1a9b96cae96f8d3dc0d0e5079022eb50a88da2656dc9964244e409a057005a4deb2e9a945644125b7873f68156f0880cabeb95743e699d6e5b76950d855587d9b08833fca3020c77b01714462450954bedd688e579e2c2d63831745ee071b5821755ebc94aefd1557c7139293931f410bca75a2741518f98c7f2889e0ebae50881314d742784478744c407c684ca963eabc9622939818531439b233c2e63faf27e52d7968670c06427a6f91b452a3c810625f0b5170fc64c789b6c1c5b067cee0266630348a99dca853c29326f03b3f5db0e9427330c68aa9d9e141d9f1958ea8d39d34d0c2ea24eab1578edd4ad242f43835aa7445be9446a75486f383db4c8c8db522ecd370fe74bfead725226d393f4eda6965a869655ef2bd6f314e5fd7720aba2f24ba03422c29aee450be74b9580ea10adb0a7c2317958f039ed326f60645f2d150570c09ea02aa81fe79d1b2118e994b4d960029be1967fb6e81f5657d1682ec609b305539af047d1248b41f3e6823d4abc210aa094f09fb326028e68d9219050c60dcb482779ba16519ee24c1c8bdcf159fcd66b0f4565bd675d75cab7d6bdb10bf2f68fec8369bceb6a7c38df3ac1d67b9224f463b1032903124a8844f23cc2a86510a85a5138d99fd2d1534c48cc38065658344e5836884dcd72e46928d8648f661b95d359a6d40867a70dac659adc085fa0257239b43117d5cb62b3b8fe8cad9d2468cc2602158190e89c17c13ce30b7d92bfc5b4459bac594a042f7a45ad97c2434a49457ccab78700ca09f4d58c38a4534e705159f40d31b7958a5f330826aaff727675ae6601295985dacd169f1703c1896d23131d26af831dfcc499c30530a44a8c6c6964a0e3a867aeb1ea8fc229060af427d55fa7614b2284e4a2db695a077ac8aabc0109268e8fc8729ec941d7e7036ae6a8650e8ec58cf9091b76cc31d6e2c4b9499973739df085d3caa8c72af1d01167bd80382d94fe9ee5d419d15a00390a9e77cbc24d9fd20981f0251c0ea5ef41e59207bb25fd9f71c074ce69ddcd9789952e1488f4027d28aa695ecaceea45429b56b7ead4bf2733fa12350db0f0a3ef7e09b2279dc8ef70ccc94cd86f232d412c4606a6e58b2dc02e27803271ab92d0b98ced8a0fb05746950e49a9baf84583bea68bbc3c33a57f489181578063ad148ac2602b9681ac473b8122d68f3ecb0f32c91fb6e91d187340dde5576e3f353519477f58aa9122a103334719f69d0c7462a6d99f7473dbc7e8d1078f04dc5ebc9b5b100c599cda5fc0278790688ad355ee2b988369fc9845866438a62556fec241b8ad610af75b42bef01b58323b12aa04a34d53d7e71cf51f81472ccd4c344b2a38577cdcb1f5dfe220d69c586791a5a071546526da03884991a2cf4d1cac457ab65a5a151bf19e5000f143b0bf7aae23e91cb10cfc5a265ec498412e471dcb6fb81150a8be3caf138e10d08565bb5e36fc50e4c3d7aa5d64205e36ecc0b867d2d5718465ed514e285e8f72a83b63ada99918ea643a111d22099a2188c1c781e78686a04113e17ef29d1d64971bb42e3f231bbc5dd50e90972809ca91197d200a15f1c6649c5c3ed8ac7226bd05bb45fc40251ac1ef2f19d77747c61f4b31235815d87281650ad396a28bdc70cfb9f35b8acca24cd26d627954888e66bdd8c2e63bf8a6b4ddd6870aa9d14794fea8c145c2692100956be60bf7a1909940dd5c486fdebd014c4dfa83bf3f3246d89a101eafc67cb3b0c7003c784cb8af70c256e1e97641b17cab0e19f9e2c9abb86906c67edd3704c322a24099c1091fd1be7abaf8f368e744f84ecd02c7c26719ac6bc1bfdd66b4054e64fba5619d5c3cc27a69ceb60528b002cad4c7d61bf2b18454e638ae1c2081dc43cc753906fd4a7ec7c2bd1cf62a445d1befbcd6420962f4e1e82ccec26c23ad0541bbd88092735e53afc95e7a21a048938e4b942795fc8cac1bd6cfdc26ab02417f6c08653c3fba0a1db89cc6c65a94facfd38144b6c76035f34fc7069e339986fbd9a7bcb1703f7035c7e30be4f059eda9baaad47c0ec0a4151fa538137226866ee3861021ed0734a3abd5f28af4e16fc4ed5ac80f04ea1b0b67b73ddf7a6890a0a5e6439b103d069f2c403ade093d8538db0651514f3aab0820d82589429c8f289767a5c0565840ae08c4a768e33ae9cc7ccfdc512691f0064668aa2e61687c524e07ffec12464ee40ffba109977c04eb475c032c98b95f363e9c22f31b363b522ee52121a52f5eeef485df4b695f33bb64ab006c9dcf82d3c7950a8a6a7366110fa6626221f2d354e477b04315bebfb906663bda1d03e8764402beec3906124f3374dda5f88bfee190150cbe1385fec3cb6580183a98c4e4eb87c15a88ce382e91cf7bce9d43eede2aa8bcfeee94aa97741ab436267daab5a7cae82869427082d6d0997bf72e0fa68265641ed3a4fa9f83885997f442889664c06d7b3d9bd10d2acc6a30019f7a7d36c8aaa82edf8af896f389304d72eac7bd7166b4725a389abe93e3a7e731f3b64ca9087c169999577bf208f136967f32ea41db0c0f23cb6d6890943d515e0685475356fea7ec93b32ca5e4a9efe38c16b8432dae87d83a57d981389e4fb0732b1986a2662e2caf6de34d4b3201a376b5106fe1ec6ef74e42da8afb0fbdbb965e095d99bf6a8669fbf1d883b550931a2a7bd28b016797962511b191053c7ceeb354df513a23f6fd51f382c99feb806eed0e6769d7d8a0028801d1fb419e7845f4c47ec724c2b657d970b8014b477bd9e31d402bc200229c3863cd305de728277585206c7ad769e99514236021feba1a3d3c74a0a215b7049b984b78aa003433f551d4b4cd3dbe2e8236120fbd6449a4c4464e68a57a8a5d8cc5c0163dd3b759aab4da7a60c4e1c2491371ff8166f7351ca6dba2678810cb49bfb657d307a6821b3b9837f882e878959d52afda7f69cb712ae3e1869255469153dff982a6a92aac4642df0b2da974fb81f4bbd9083b1c4401c7d131e0f791bc8b481543215b77fbcc50dd61570295493498bf517deea739f9dca6f9dc62f9293a90290acf14562c18cd44d7ee714764f4d1f85b3efa0e2777510cfd038cb91cdb6a53ae2c341505137b82d704d17f419477d2922f10480e237fafe8430f8112b80d3655e1aa8cb4ee33fba3c1c28cf87b7181d9bdb20d1e02564ccfefec62bba101bec1307cc94282fb4eee8a90a50e3adfd06c8923ec5b5de167d7f4cbfcf3f5f895e8ffde6368c68b820c9252829aff6978dec874f7619a30494208252f7eef3e4a8b23ec6be92b18f7a8791556ad9ed95d38155a1bd967735a088b8f35fc9593ff62e9a5be755387154c6693139b9eac031363f7edf6d1c81ffb75dcfd5afc132f070fc5b08165db4a24c9fa403ff26a152543e67abf365464e153858d216596c52d905c0f0a7d454e6c5cc8f82d6ef483eef135afd9232714f12dd5307ab80d868f5befaff53cc0caba471a32ccb6cc911ebf2e853634323955f85f69845ebb0008f1bd80f117e55d198e945ef5a4a8b34e84b6b9773d0121e6e5053a34d80f829eda275710103d16b4bbf7f7fe6068d62ba114dab3ceef47147b6fb1074b10088f5572790d446d0df050d445d1d96c4f38d596c340bec637748bba834fc727217cb9c50ebc20006e7aac1ebc4dec471f1da4bb8ba58a212b8704d0d86eb8f395ce7b883ecd5b713a654aed8f90312f3f7b9f55a1db9f1c75232b6154273d64c84aa697b8d19c0e973be1fcf795378b91358a2db3ee5b911b5db93d52b385d10f16edfaf1680a2916efa188fab36bcc9b9f282908d1ed5d63c72657946af3a8a2170ba4cd7552eeba9e46e8976050936242a91a09ff002e8e1dff0025cc226feff752674ec23b05a081166f72b235ba88fb916e0d808a8f481dc5225ccb41eb43a167d47ef730b3c310b05650e93c8aeeb422b9befa3fe868909f888cca0a6e9fae1e0754cf92e0880b9fe0f37f5fc7df1e63eccd52dfe33f3aa99317797c6e5397eb9f76a570d3095fa0bb0b4d34fc96457cfa363bdf28505fc8d5a38290ff0b338cc5ebfe9b512bc2fa08cceb672168367c6d9e5d27c6cf1b77f7f383ad32c73f1d84ce2576d0a6a66fafc35e2d22b0da44b2a4ef12a849c910de52762b77f376c26b3efd27629e5ead5d7e6907ef32a295b976d2f316e67c518b809b7c7b5d0932a80a84ffd4f184e5f5d86374d6bcb9c3af91ff4b3aedffa925f70e5ae8ff5c687139b42221972c4136599f6b512be06ce99982ce8cd5db52c81581aab21aac49e065a7985374b483893cb05bc020e005cc5bf455ec87ef3cdcc918fa0cbda5f9c6944cdc011ee98829745f5cf41cb176027d1e960f1e902e83f7c506a45a85235fb0eb8fc2d83a9ffa117d66fe113748edce79075e6029bb0ebb598317bb72e108fd83352ea300905310b59b5003f10f60ea1ef9637c5f9ba0ccd7ff5397e66c0979959a39e956d945fc4098a805e3397bf7882edab137b5c38801ab8fb2da348b9217d7d60892528bf741490b038578af93e4b87674f1614ef423407bd0f1ff5c7169755b17ea9fe84bdebc2c9fd621354041e868a72556c4f2fd892704878f6a3d00f4c5b6be6bfbda73d1ede3953d09b3798670751a349726a442d19c9a51216bcd25bdbe4f0a5682a6d5d537612055fe73dc85878e0a39354c8358e6490a1e2b67ed489fa8aaff6e2f7106bb61273b3f3453771baa8248f99961671eb9ee031ed616c53ae888e7e5327b899f92ecb0ba031a576bc58ccce022e93e6140d87b2e461bd1dde8faba1a25394b0ce74aed81c55310d16303b815848cc99b8d72c6b0e98ec9d4be63ba3ef9569ebc18b433434d49c5f9a4577dde5c96e8207a9cc12f42c3f0bc1caa4c34a10664a5fd7383bd15171495a7167e99d16198ae2e8dfde7a254bb9ff72f6a1bae5eba2a8ad94a606f2e16f550f21d9bd0d694f4e7aa016c92c235a3e0578d3523084ace430ec9ae9bb614aa2165cd7abec0342532891edb9eed40604a33c321b0effe208b828e2879a882761004e2865c2936a40706ca6a87f98750a955c5d79a3be65db3148cf58aa0f7732966d6af20fd642111b4b65aa359ff43e7e528b6b1a2dde239c75775cc7befc4d237b0f1efa9eaef2d1e10247fabb0ded2eb2051100187e9a9790cb6828d34c3f0dfb5d59bf7fe6468ad73694bc19d6a0cafcc610a137229c7a6865515fd307bda1ffd6c5fae9ab6f13f7d13caa887d87b4f5870d3fc999d5d61fd4f64ed1a51dbd23b4922b1aa526044b296c9ee765e9f1c462cae9e5b49751b0f4e8534ff03cde978d66f02579934ca2edeb1651165383ea43e83af41e4e988dd3e3c84e6fa36aafcce8c3801bbb342090c248d23d0e38de61fbd9e92a627bdc069b6f1099efaf852fa73d336a9a323b9898302f1248ad912f12683517d892d340bdd6ca6b5770bdd080cb0a9a69d1e711bfe38ab58f18815c5701183d4c8d505725ed93108e539553ccda995f5b197ba3b4645d628ead6034cdf9f197fcc82d84263a569162b5a878e436c424a92b16faaa2199b09d3861e3296c8855d1c3615d179a4bd043254009c259ae6463ccd7568174bddc2acad92b444e1d748f357e6d065fee2a48b466cd560d87f2f2bd74f0036d0d7aa77639c91a588918dd253000b4748e89d1d4f239fb1027013cb4afdbd22557160528d78d33eb9e1bd085830e36ced12490c99cce7616cdbe8a35d457106c8898ae4006bcc0158a5f6441a1a502e64ad13047e474bc4b6d0d15e5b1e2ce1a22dbcbcde8c3d4150e338ba7c9f9b8a28c9b250e3505a7d33cba541992fcd8863c84e9b44a223670a84d8cef1a4e86f30fc251d393b1613b4205f131cd1c8e9c19baff8f709a910cdc6dbd11455f52e6f6f887a4061830d1c391caa122c21fc4b0815d0ad49485910e08e9085645504f0b413b6c0de9bc992353c241641f120422018299fc91e3489dd6358d0cc699575469b810a5392e1b24149cb68e06dce6eab408351e1d8b3f882c06809b3d4b7f535b790486574caf29ecdec00ecf94c52f49660999adee1084a9cd5fffd565d1c17a9fdf6973b169cf6312b15cf1b4c8adc179f572ad9c6e9f20aba0e54d29af0cf290982e62b76ae89a1822e447541b9a6dc24d36a0b21a180d3fba35379bf0a0010a7c5ded04f6e910ea1e9aadb858a51665eeff716042011afc3da6f7080914d94724238fede5242904786ff9bbe38db334b8fa112f4849bafdda426e94eabbd2c116099fa9ed19a8824b3c8b2ed86a49b5656b853da0ca73529ecde2d2e7c025695adf4de358c0b81d0213576c1e0ef798ee899608f22c3e5dcb2c245266462fe9830b14b16ab778725919528fc864edd3554daad1050b0db1629ce86ead503b745029b252fa501efceb61603507989e655060244d91c909f36c9865ab8aab971e637ebbb4127d1e2438a79a7821d07eaa3c9957090e77512f178f58e375eade0bcbdcdf7c3d91e2f6ca8855bea4ebfa53885d7e11168b287219c03692302506f34316681c7f838cfa9056b2516d8621e7eb3be7370f4e4ea73826660b27da10446b66ed10a885d4505eef99140d31d0be27ee0a7ffebe01cffa16523d4c73c9857b6cbfa4f16bb0d39ed164fd33931ff615e08bb1ae85bc2c8906c8d6cf2221c120674082e084cbc7783563777e2c2707625b974d0290676e41493b7974571501b38f0cc89b071b41fa37ca1239e506ed24c55332e46e3d1316acaf0cad0bd80f52e536f68a62f28817de2203066cbb39b0073521d93aee713a5e8038da24f163e9da6ffec286f147c91404a580d40c434d2101f09ee32ef587a4b82c09986669cb8276ead5db911f9e05a26725921a30a525c18d8eeead25a0c01b0572497a4de4056b48f35affe8ab4fdccbd4a0fd83fa40ea015700f5efdc60f863a40272099225c22f9b98d21ecc104a8eb788496e6862f446e94abfc983d4c21af8fc8de05071cc28ce35ee134de12a1fddafb11bd4d3976ea2977e3b6a8233dc82cc0fcb07e25642bed4a4d7f3425da8231e74340955e045e9f025e651949768021cb337fbd6a3c0332fcd55c251087581f4ddc1c1b440d3bc977c08dad1bb858b5f2fe0c31e34c80531179e720b7a6f1d6d7cf28f2874ab5041db4fd13e34fa950239ce599d1bd909ec5d86d8f3ce2840d2f193e6af7fe074c830e4303949f4837cc38faf5a7e4c217d015aee245fc70f95792fa09bdbcc785f0033a863baa30b7210b28bceb738f35ac507f17e7363ef749a5645ffe3c746c770aceaedcdccf8d14dc4e7459bda6bebf6f5d545835e705e3e64a7c1256516816aeec22d8cd7d0c8067f79d76434331667d40edac8904718c8f27530142286d4e88493b0cb01dc8d5043a5b5bc4f2d2b4d91419a0efd80c86dede4b5a58f4919d613ce87d8a8c7f6367139293c26bef3028e4ed3db3128616a42db426ef90d255d9e0c80fb24e92725a9246852eb43f25b601dd7139d119703f912a395f4940dd6af0d9f9ece91e405127de39ad3b2ecacf1568489562f181e9f21eddfdf8b51bb6d14e52335f481b19ba61fc6398b1688d0e2edede3127080d0c795bc9074173c5e2c76889e18a3852a385ee24f4a75e6c23f50f14fbe3892908e270ef15903e4caa6c8689170cca80c506dbee01dea651670b93485ed65beb8994aaec412afb154be9314fd70fb8df4ce7d5359223d0ff8cee90ea2281eecab742a1f22c2d26396dc781024b361b80362a4d87162e4265fd825d6a2d891f78a4ca69ac1b4add06443c5a91c7b4dcdfea7136cd562b59d461c3a5e849d23b7c61613532587865d1f487c08265556892c088371c139922fe7c882c330b505ce65632bf850bc12d90248e9481c190ca138b31d0ac9e58db76c04acb7bc94361fe03ad82a1c5279dbce885c4a01e62187bcb3291dc39ea9c6d05751aa4df90c00a96b283b2d209003f12072c9b9abae573a2c97acbc91f1a4293fe44926303114b9cae603953df4ff66119756946874250e8c5ef34fd66d07157341af51955b97a32de9f912e62287b7bcb15840b62d2228e59d7987b6058456f1cb37e02f124a180ee5d5c44a883adb15cad73d3f90deded0bc6b59d5f5620c39d602d6fff17abae80c03d25986842366b51dd7b1a4b45dc02531cf74b29f8638bf434de17c6d34ed64aa6676b01512896694613c6b46c75ae6f2013b4793c8c49a5ee0b051924ae1d76849b54392613389f49d7110ba5fa3058be97ece45e01eeadd0b597244ddee24301ad64ea4eafdd08105733fd2dee58328bfe445ea5de9855dc6b1550967e4ea546d6b59ebdd3681944915f38780a1501a1a2e986527313b27a1e57e2d08e8f110430442da4cdf4ed658954c775bf4d6b8fd84eef8e28d4719cfa80d3f07a1ad3afa6f93aa42e72c353992c23dd37166e0ff2a25cb31f36431774c23c38de64b0b8e7b936408b1edf48d24e88df92892e574628c56eefd9256a4b18698be254c4fb893b75c747765072c3f8a2fb88c1ed64698b8be1d57a9c6885208867edaab00ba5631327f7fe8e9597a31bab87c6d5e21fe8f96cdceca5aef44988c1476cf2f40257413e23fa8645f5fb8618c747aced0d54d9c0bc849bf0c5c318c487e694c5741772dc2e032c84f3b3c21b8854290829579976de9063b2b1fac9fa0c816af31b42c449259d9c5a9c861c5368a68241a45fdfa863a6f95e2510389c4f78ad51808d96d823f23373c4f5236cd740e4486867f567fc609fcaec83e9338059ef9e6d043ed79af78d3cdc19696ed2fd667cf877b9b1e6ff79ba278529bfb35b56bb08900c964aaba2cb27686cae06f35bc56a1a1f7cda97fccb63a44a2c4cd97be72199d6aa63d53ca0c03b62c26dd0f66d144e1860181ee7cbd498d5700a993e64795146a7c80e1b14df73af34f5c774386f1b59c3963b1589467b1202b89c96b36ce35375f48ad91159f32b8a6815b993599225b3a796db2d808060a25b9789eda8571c0f25009e7dfa0afaaa151289a3142a84cd14ddb7d25949f0a08952d26a7b9853369e1fa140dd74a6d76f59a7bb3ddd3da9c72d4bfbb69bcbf29f99f886cd816243c15b83efc11041a502c95c90b3a5458f100dd596ea2077d3c7ff3264c1f4685f58616a32919ec8bbd79aec216522a3db4cdb6eedf8fd0e86cbb813f7afab3bd6dde6feaad0dd778c3ed9dc6b8a9ee2084425bb5acd8737e0a4067cb278352bfc3ca404adadadc0af4fa0aabd08d11438fe86ea1dd5d87593e55e0d25db2a37812d0181e91f06dd87d60babf1d0e08dd3114fe92e03d0c4a909c93118636f351e1d304cf196882cb7d936dfcb0c7a04e64e6adbb7b6e542d804687fdfa9450f7e722495abedd5b9019181f9c33ab979ce23d4ebac0b004b4079104ebab27dcd74fc96c262c21c1bd90a5354784c5edb05fe39e71a959b047534e36ff74370e86c6e7cc22bc936dfd258e5003c9eb34554aa6d32f0d3aebbe3b80def34b6e5a403ecc6b0731d95afa4283ed6fc42d5bdcbcd7bbfa0b13ebcd056de5dd1cd0e47dbde32b16532c6584d746066c6b8b6b0bf6f327d5429c1d2c185191c641ecaf61cca56e00b21da2dca4f5810bb96bac5a2d301cb8752bec7431c810b7500c493556fec7e839f321353e881ae08a09a421586d5f9c5e02f80863b1b492bae7a7cd5ae411766a1c1db8b786feec9e2146093bf4bd5ab83a2257d4c83f42ae5487e98ee69d58312f98e9a14697db35e2eedfd8676cd4df90b814e9229821a89aa18da2b8f1e01a39f14309575c598402ac2ac04c8da1205e5bf4601069581e291b803c65fcc3b69f0b3d3f0d40239d9ac5b2c77bf040926b0d7db961416988d6aefa9af8779cefeb3630cc3c8aebd03aad8e3151d5c5d3368fdca11eebef584541a115e15a57b533f12c3544db81a1ca922ab3d5f5cef0cba783cff8682656994912b318451eddc71b6c7a0f69c1cc5d7d4e01486c28d9f6f0f65e87b79c281055f058bcc0bcaf6895f3560a67b926fddb9de2144d61f92e97fb3aec100fc1faea7030610ecf8a19f184e4839f47ddcbf2d69dc34d0e1126a815a2454c5b00d0732ab656c76a6ab5bd58ce0e938e802b51eb33651c0f68ce35c7238d37acdd72eba970a14e68e067f5ec1b808ea22f9e38c7d784b4f019f95443f7e98117421eed302e8e695d304d65952f2e2ec07fab79dc710abbbb14ddc931fb87695af5a2c713a54039c3398d08532382b933b4d438c2031d95d3d10b7ee6f134890bb5eae9c38c111aa044e70fcbb2ef2462416ab3af6ff05627c064d2f21f9ce8cb5acc9b64a6ae17a6db66850923e6baac5402e02372c744c7b3032efaebc62d6776eb5cdd5f01205770d827fbb7a454ff4db61ff686ea87d51c7b479261817db872c8ff2826909042a320f1872f78a90a4ca0aa0428d10a0d23c4e4f02322c5f1758176a64d4647ff85533761b16bb805ea7a61e500013c1f3fa986acfca730f46b042cfd31a66bfab842b4610d008efd7e6cbd15ce8561b27207faa7fbda6e68284c8997b9aa25b010b6ca594f9c3e76134368bece986a39bf49a3873797c4288afe01b1ab03ac904b6624837c027b88957b38d92b939046a0bd26b3fa1cf1678c3590e84939691283e15274380b76a4b23d784fedfaa4b55c834115b6346d063ad5675c5535aa0a931ba551b47f54175ae429478016a7fbbf8568d09c0fdc74db8962d5a58cf8eb18c76cb40404a67ef98331293bfb05ca03c00f454309e67aaa58553f70a408762820b2c3fd462312fdcd4c14be8174246873160f7c633b2cfa97890ced4c88bee834b165111ca396a292e94bf71ecb4259a71a0fe31a001cdfbe307b00b923eb4c2f67313ee4b4958e6a3d1a0472233d5baeb67ba581db66d1235d44fc124f3596f89d728d2af891b1d1d83dfccb91afcfcf1e8cc25ae62aaeff9ae6f0c9139672fca3461b81ae0152a949183c33fd606d06ed3327557f4fe74edeca12617c41a901fb0a64e7edcba4203e5de3318d96f8bfa32fff38ae4c625ca6b51c20b7b1dcb9ac423a0baf2f76ad10de361492c7707dd602d2e2b5a44b31248435d5179a6b501426cba4fb5762444bc77399af8515c013869c3c191088d1f6285e9fa51847eebd1ac439ea63d021167ec161320df4763556fa558fb4620018f36d108a004610208b86f528d9ba678674ca53d07d2c2d937f64f414d35f54ba207cdb9b151004369aa8eb312c36a3bef0cd314ae1b7075cb19c3a324e5b77897efea4fba8372b1442244e8fa34b8a555d3c48f3f7fd8235f6e6265ca3489649f44ca5c83b042d74d79881abf7fb1cbf3dc45651625fe33f9a6dab58705270887a8519d1165c0f023308da442e0e18e49aadd63da69f0d55d9a97d8a14f1020e48f36c767fe3942036ea90dafacceb1595b6f91e53edc1828fb0d8d8ef59d2a8d7b06ad332e9a5f268b63219e226623f71196c540e91140ffda102677e50f0824c606d076785ddc8c8ca09dcc8c9a76a61388c7006424d67260976cf0f3fbcbdfdab092f790a8b35bd9457125eb1bbfade087f4e991a17126174e333cac89c530603ac2af03c58d60ca1152429a2ca2a0632a3c6fe531711bba9216164fe981ef7fd1e9e59e556f428c187ecfd4895a4b90277d46301c849c154e866870623f5ea2d86f6e6ec1eddf00b4f40f916d4d1cf6b1f4640a0f24e71f6022fe5db64d9f374196768df4254ec8bbd74cfdcf7c41c0b3c646f25f3629a07707dc9f6dca6d49617bbbd13026b337ae05a3e0df5de29a844f03225633927f82bc127eb262750bc386ff4b06263afb1682729d24682645cf24c4e9db346c3f85d8640e3555e15bbc27013f8ae26c594946bf54f106e4b57ae5e8f58b3495c51ce5d12a99a2c1c13c203d46726a1163eb12b86ffedac080d8cc92f8239718399793b791614b1c946e49ee22ca0faf679ed48cb8526159320f1a4a1daff2e77aafc5340fb55698d500406b5ca16445e1938cf5684222733528c89c382946cdaedb25e24697c7f4c4b806ed504813c88f1b2b0ea9f44b0ba1c7771436301a9cf4046b72673f0cdd1b6637400841dd86fa2b0275f2c68386ae8277cb6a64cb1918fcbaeaec11be3fb77b848d0d02968e476d82339269f6191716ff17c0d95d8f4d3454765884d101518b16d5353a75030f23c0e70054e4685d31d93a09cd7e084d5d996da90b567a84364d98e712f8914ebed2298f7b4e14e602f504288a78bf55c7fed331fe6b1fc989468832db02b3337ada255d4db57fccbb6aa9bc00a01ac60b426d21acd2b3a6b77f7bd14e7069e38975d0ad1692b033c3388254e33e4807128c29d7348ff2c9821c41826a03a690b8531d63bf6cc88c7519572b807e3e05b90d28f3a81bf8af53a54ed40f03fd0719158f92f164320963b915fec910fbb70a8db27175519daf51efe60cf269393a9fe62547027041d8dd840c64a5dd9f723d86457fec075fce22161e6e5f2c37d761ab3bf2580b5277ccb0e72f1dbdb57dc334abb4e5d2ab9c85c3d3ff020bb21417ae4320b5eb7500b1998bbdaa5c11c0ab06b0d6b71436d09ee86b2d0536e645f8bdfabb51f6400a87148a3b2ef1a90f0cb6e9ee9fd5510235f44bb4d82800eaf071fb8a3954558aa656cf4014207252a07e8ac1b8653d8fca767cf9a4a7111e64074a8570cdf65cafe0613d95cc65040584e4a776c639a4149984aa03fa564e9b0d78e3e2c92af13655ac60eb194ac8079be8ae6b384124bf12e8362b93e936f23f177bf21b2d192e1eb64e9f83317245143bb318459adfff4f62b054f08ee964ef7017dfb6b4f22c7d63dfe5ed33d40faf033fb8b7a0e8970d3b3fabf7ab37de1a81f839f689cddf43e4170fa02a3b83b6b458fe1d9a5b8b8a375a6ee4a23a6a3bb38d25adc66f4221d9be50b7066c3df0799df5525056c43445575049eca7a590c3c56c7f4f7d1c2a45c6428fdae1c4e9cab3f905a26f8c24a61fc7a72a366ca71e3f2ae5a0d3bc3612f933684444662c3668f7b854569bc0641a7a22b934cd7caf38185c18edde60f3070e4e4bd61a4b4436025581d58c082a69814c0f234f129725a5b4286d254e2347f11189b85e559acd12971eff6582cf4fd7dab0ebc4e571e9bf56c35d7845492d8db1797b6b363fc509940aabf89398367c82e44abf4c40a604d087349ce94c72e8688dc9858a7d8c4f6ff0b3cf6fc6db2199bb1fa0d534f4811dfc8fa01eea0c9fc28f3c6d6f19f9f7e6b0beff0ead4428bf0e24c6fcb88d5a9b1fba46aa339ed9b1bb503718a8bb20eb6486987363b8b8fab78a462741f14a9a6b8011c9c1df2c400f59de35952369d9b446fdf7e4553fd447d5249d6fd89da132b1452132769632b2cd06998f92e8e10a0168533889dce69af53e8a284ff5fa12b4eb41652af520eda8ae87d0ff955aff9bf7919fc93f7d3ab6de1fad4bae26126984fa723c0a138354732c112bc3ae68b0ce6cc2758b3f41c63a9745a89d1122d409d73ad12edfbab4fe29b1cda557016c1367e46f6aa64916303ef96848a9ac13ed573a7a8dfd49c0d94c880072c6d46f48929af425aee4da551c7839f95a196c339ef104d8f0dd9a260c4671bd2064385cbf701a780b084336550ab014552f026367dd71968fadb56d0dce0636be3d343241e96d6e1c8c3225cd7f359b5c6220ac893ba6aea0088a64e2285f98604c08ec40341faef1f933b90bf4ac91298a0450cfc45a2f0dc298994c8cec118d7603c337f95f2ea8aed9f67d98989f712ad58b4141225f15fba839eee67d48f87e77d8a009baa55811c2ee75d85dc88396937b0888a26ea212d3e0f3ec53432157c58dac279a1d4d8271e6da1eb0fd43445eb835011e52704b1434ab2bee67a571ca0f76268977ce8a67f04ce29fe33d3186503fdd230106cb6a6b0430c60abd0b7604aaecb0e06c78a40c0da7ae77fc5888332ac01f0b88c293044cac375a7c02742c3006c549afa4d9f60c7eeda3110090c79ef98897cd642bd59c660ae1e18cd6220bb4007b85731e170a87a6829ac2d5659bcd48753bb7eab3561da6255de32e3ec6b1f1f7f1dbbb801849db03435a8a8f6a4cb3da70bfb99c442f277dfb3150d7be32150e690e044288845852336d7d0e44566b8b2b7bbcb3c865e8db9da4ae66717c3943f4a48e21d84a028cc1142a6f1f8af287174daa683b8245ddc53758b26392ab7bbf2a3b9bd699475f8e3b760c26192265bf4b4bdb135c50e79c92845645cc88078e1e6e1f9f44bc31e46f8724e8c2f142f419e3a99c7c7dea45998b21d1a8b0ffbb6668cdbebcdc8f6b606dc218cd4ed8ea539a2a9a1b476f2263a1e600a099bf9b91258e924c31f0be87d07829d82a1d275905f4b2b9b9c99e3e1b9f5de9c083dc269718c70ae01ff1bf1202c70c7f78d22af030db5286b4c0f973ffa481bea0cfa5872dff2430c6c830993708107a3edbd921135a617ef39fb40a8a5b9e650ed1774661c9c5d4aef59673ab3f84541dff17b7f41b8e5ba20d4739f84cec15a9768158d2741401138f75be760db2f3577ef8260230d33adc2bbf30e720e9c41963da4f94a76e63b9c31f0155699e103f41f7391b6a0b9d014290fb980bd907ac6e2ec41d131f7fd13c76cbb908816aeee6b4d57e19ae107d2696c60e9897849e8ccab5719d12d64d1966de37ee9d0f772a15b238088fdfa08a60da758329b6ee624d4cf1ea77859380d9735f765f5a7e822759ae1540a9cd51d7afad3e452fb2e51b3b61aadad11005ee50eac2bd8e617136be97725df9b2425213bdabaa03f91f51cf829989e734ad1cce094a00599b66a641ea1ceea1b95f1675b2419500bdba7ae0d1b0e612866b56004e8af66e37ff3f55fc1df696886a765af9bcfeefaaf7c91d9317badeba29329ab076e11061ab98b04f93d82121e0dfbaf5ca04dba93ab44f5355d2e2329ebb14c105439f41c5dc6f53c3eb00029e77bfaf2d9b25e545af137d27fe9ed805d7d0339664cd20558638346e230a62f085f4c226ab56679a4fab9b495327094926c8ed1493b6389ca3b2c7c6005d92d152aab918c4ebdd40e008d690b1614bf0c52f28857af0d80153d5a6d3d35f7c4b19588e548aa04f24b7dab2726d70c7174ab905aae8d983d9f1ab738f5f156eebe4ea1d3e567af7ba2b236c572967eca1bc3da17cc7a5a973f3e8d194398ce5d894fa2e90a002fb2822081fecbb922a3d6cf12f29dae549419a6388b1235698e4a87c459c3f7b1f1850dd510e747a02abbfd8aab90cc16ca7e99e44a080f704cbd3ca965e7d65d627dced682b4f726e18e01b8d38fd2a6659d0720a0fca47447f8230c33918cd9e889c9c0c6060c21b18c23eafdb64ea2a4d21c8faf9428cb61be973655fbf2adf8382e9fbdcde77932a68e98d3835503d84fbca103e9d54980a913f7c781447ae95643d1928c685952811a47f14c660c443d381b1be93a3f81918ee064a0c4b0ff3910e12d446fa39daabf9740877434185eeee58b063cc6bf54ebcc2dd95b72afedd10255f9b5a8159e80f9cf23e4a168d7c900e8b48d2ab49b9c77ef3b02ef6b4107b2ee86e6a05818d02f46837f1f18acedf293de127719e123386456c70e06fc7441d434b540430d558e9aab621b70c321bf57c8ae1ccc64466e2addfcb6c05d161d648bd3ebe472c95ec3279fc3d40ae82f4dbd462e7d3b1bdd9d9735cba5ca695bda7a6e0b0ebfb53d0604397928e0c1dbde209f6b31fcf184f99ecc8552c55c52398492646081f4d59bea61320e81044f79402fa31c470748e1b1e5fc1fdde846b4ada22e2b2eed4c8162d2b95c72550142aa963bbea0b18715e9ab0cef35b1db3d6f56e48a020d85ff96ef0c17f5706f6967140be4a9d68ce83fcf10e42653e78857d53c7e9708e3977ffaca8b317e4c8b0785a01cd4feaad588e051bad64cb722357a8b52dc57d3e6256a20ebdeea46dfe5d7e841bd889ba6e6e10b7de64ad942c5a5165f537e5514bc9ea554c86ee92639743171886302dc27144b8d3aec2f2a304c8f9ce8ceb535ab84cc8b2be9e55c0c827e4ff938b94519fb996e9cbdc26b1a944a7b660635a8a1191ea9831a45b7fa1adec4ab93467474a08b4e8b402d032fa6b7d33964c7a03cb25d44f942fe2410ce896614d015d066242494b057a65a69533ec5aae5c30d609ffaeb28f867d84ddc032e4cd161c23aef7c39e4568c3d1a72688a4547a04e5c9c2d2d9e7b14e6edc52d05b9b10882d9061b2ac5bda865af81828c018e1949214fae1d001b16e07e7bf3ebeca36c074324318823b06b667a2ac7fee9d0ad00988d09dfdf2cb06570bd11cf2bc20c276695ca7493ba327e2339386ddea7e96a81a1508b0cd10c963372642f6680934638452733c4467ad48b6d62363d1c0bfe1a3b6d06415a43ba57b6176c8864b4a112f45a760b75e42e9d4352c8e2015860ebd2056e2f5c669d3f3d640b25a2298f2b22113b8ba0479a48e0f80919fe2141ad32f502e474290d36158fa07b6c4a6a7ddd4b4982c4ac4ceda3d1b0331b2ca9f28248cf3a1a6026fac0c6e6108293fff03fa84516e9cf597a76d669fdef28097cbf4637ee82fabba79ac0a71d6af35b53aa9b262d2d43d64c08742ef26b9cfaf5a0c46a516680aa1394edf968b06b41fb4c8dc0a415b4f1bcbf22fbcc4bbdd21bfdc1f4624704c260183c33c261a049a28c05a24bb731e4cd2f94681a95d648c70f14a058659bd1e4158451f606d9c3091ebe5b06e5c5cf688a01012e5c2a408d0183b223dbc9dc4dbb5c7100c6662826b82ab0056c25c962511d0b33a23989e058c9043649c3c9dc7cde6a30c598b4a5bdb414c014221fea2a9a478d01c5e4d4c98dd727139a9bb275c3d361040b060882fbe8ace7fca9671dc33b07ea7a445207473cf7b78100c9135416c7a80860bb365289f4ae620fb7e0fa45e29f1a4efc913ec6ad2127f40785200b8dc760cc569751cc619935a5813960451c8f2464ad95775a9b4a09edbe494ba1c0ec34ef7df857e40224447560ea65a580226612c5d9de770524f4d12e4a8d4fccd369d0de3bdcf1fe6735a2e372a642e83e12dbf78f3b7372df5feeb835772f72b6dfe0f70ee82cea364bef6c13a66d13dc78039a5a8275593054ba491b0a69bd86473ce1f273c51655cdb0034f88448824e53e963e642c3562cc143d86368d6157cb78c6d8883ab4cfe10061e20700e2d86f7a026e7666b0782c08db600f5ad8b4d01f547d63dd646b92422bbbbb37b70c38075d077907451cfcf9deca8bc17b3197e462ed6d95188a069c415b0376cb4e8c569a77de77b7cb296c3ce25c1ee980f502cc997397cb429a3fc7795e858ee741e2e3180f79feaf10707f5bfd60e6612b21ba176386844648f3c7e9d75aaac1f780a8c0b5a8b4e1238e6d33e0b6fa41cc4fa7f179c3f916837bf8306ba15f6e7360cf51d8f31a18c46c5cf9399dc6a7afa0c35f06fd0675cbb1bbcb85fa43979f3f6cf9ebf05a4187430c873f8ce4d22defcb85eac2f587b5dbf08ad970139673dde418cbae63af41a3c3dba39c3ac56874780e6f6fdd623445aed3f8759a4ca3230be1f993d314c9e125cfe1252fa5e0d35a0232af5eabe7c04e8ec24e8e03cb465efd069663f2566de4ec7a3d6135b28d09cba95eaa2edd226139a37cf3f49a692ca7108bc161d6dfce7deb1699872438f280efc6a392c0f21df9b6e861b6d0adeacd5d10e0a9e2616ead84eaf26a81fa3ce25e08a5197a8f3eb6aba97c8628115d581460e7b061f8377a7a667366f3d64df17423b61664e4a69cf9c79b2d319885be39790d3779a6a3faeb26935b278f3772464f37fc5d2cb4bf9177e2a3e0cc993344afa3b2819d30f8354c58eb5409bb8eaf93b0eb23ff9b2996597f0e6fceac4b9ce94b8285cd6aec6260bf206a45366e5d83d8916673a68241f5d90b9f63b9b399f581773aefda8f52aa84f9dbd18eb1865967e0c6b6b56da724acbd1da36c5d5886c26f73763fdb890faf862b1d947ba8f7de7bef398f5e5ccf1b03cc03f2ce81b4181698f7bca7a767270ae0cc993392644758cdb7f7c314a791cf5c86cea9a4d90cd28d38a732c7f219de4923d21fa6f6c11cebd6e5ee599cb39da6d44ae8964323468c1871f2e094323a2672ba9035c97a56bdd9bcd33ff34e3fccd251075de6ccc14c6339f548dfcb4a1e3d733f4f47d71079490a4b195379b12b73e62c746a2dd61e420b3108e11b62f20bbba466c459743a75d4ca39d0add3899dbe62ed4731db69d7dedb9c03a973b189d8ec74703d9c5f1ea947ebd6954953588f5edd8451df892e6d34027f66703ca3c65884f9fbce1dd08fd033e0dbca8732bff221cba7bead7c007a1fb8bcfd4bc651007c234073c0374bf62848c96d3c0b6bef1c34350008808e776bad3b7db11cabe1a8f55e943b1c39e7ba85c3a3e3b4b3e13872d66fb90d32ef5ebbc1f5686bc0bff772a6e3a36259f65e7e754a1e24338879d04cc4e133fc8b3c3fa34f68c67321ebc7e127395dbaf58ccc4bbfaeda81e528b9a6e3e3452beff4d7bcd31f6f51ea06ee6979f7acc81af02e01ef99ea9d748e03c7df8c2da9460b162ad76cf9749923673487d3e40cd3784dce5000c801c801701d39ebd1c213e34c78ee727d990e323fbd1b479c353c001900b926d364cf9151f9e5c828e7393567ee7235a2932e4b637e9e0355ba11e8ed8d6fc9fb9ec3bfd87b168e0cc73c31d1db25f64a6e031bf9099b1ea53766790d2ceb91ca1ca3589486fe524f3debf1f0d482f48dc91b7d07021dba1e2954cd19ea65e832d5d79a2bce39d16f1de34c30bdf8e28b2feaf888ee547f6fcd997b2237c33115cbe8085e8f1ea9943b0a05c7e8f8f8eb998e8fc74eba9eedf463bfbc84b56bc8f51c9c33372f17ee5f7751de0fa70a6307119625673a3ebe3a6954fd82639c09d7271c332799b76aad758ceb2133a47102c0d2c278d567edcc67adb5c6c321e15eba74e1e1ca12a2317ae0610b156307330fbfad966ce9bc5a22c59951c2e3e1dbddc5ac7608d3945868e78c313e2c9b4ee79c917a744adf7c334846bd1d423adfa3af69cba4c7c0934d97d4e77bddee79c47953faa4f988c7c0f30f455d14c33a97d3de22cc4422cfd310c959e379fba00b34449ee7407f99e7ef05b11cd8b0fdbd244e0733ab1db83c8e936f2b1d987c5b9275039cb5220f7cc0dd510f6980a5b757a1535c5ebf6ef79e4da7b8e0eeeeb6dac2dae2d43530648c3122e1a3c3fe3153887eeaa685e9db2a071f8431a686a22cbc504106951bbc253824417160c19d380c61e1d043bd210d7c0399d10d606e8d6fab1cbe208265832d283be79cf38625686eb0c2dea02417d968c151c5c611379a0d4b4c4f7ae6d271daf1996ba5c4cc9c325a3358e5f0e4737c5be530c51d5a2911b34a92860586c5c52a0720272dae72286295431035b0cd260cec409eca26e5c3f1430a1fe34e3dfa7ee0214b0b6b0638ba065269d1a2c5468bf428f3a953cecf787d042f4664ac928059d580046bf576582531635a5404e0dbaa062d9e7e5bd5b08acfc1778770f3e8cedfcbe91984106699d1b202664125c1aac2486bcd39f7fe22992cd90ec4d08a812a06aa78444f8e28a270413b083de67637b0b536a13d6bde8e04ee9bb7d649a8f2fcf45c173bc062860c16334a7aa2b3a6d029ad1660d2b7558f124be88c102c2a678ace70793bdac734be48838b329dc65096d9a50905a16145a2410574969414d02813849e89250d1ca615643d613961a3ea62396163638433ccf806c65b5289be1f8da2de0fdc3b9a47f7948fbe690e08ee1d1dddc268a324912ba36deb7e8d8315e25ac8bb8640e8043ff89ca393f69c13d39942d4ad213084ae03412edfe029b466c009dd0d213cf29898de50a81c9866fc763c47bd1d5d70ccd99b07b6b58d01f7b7d50a865aca53aa638051d2ad8bed5a8109e7380d31156c06bcd7307610f07b3608f8bdf77a85c20d37dc4c68ae47e60f371e4f854e3d3fa153cf81748a0cce80b0d0189f500d5e1c53ac10f737f0731b27dcbcc91a36949a7ca050250bb49631f6f1de7b25bcd7efbdf748180d3bba2e50524105523ad5809ebc7b4b03bc05dfbe717e42dfbc29ef1cc8898f77ce6f10afbb158033fadd0f52c9b4dbdb0ac8c9b7873ccf75a0a5f0f319a78bb37b483749a2e8db0aa8c8c7b71590137f04b70758bb42c2cceff41f991f03fce6ad046b553c8a32767c31c6e86ed328d0874f358f668a95044dafb4ce5927ed2933cd53b50cecc44a8260b6ad6f1a05f80337cc12bf199c1b629b0d6cf48a81239eae24284ab7a11880b1a6a38f54a7a6c04052ef07a5a954098d82f4e8aae8b74f91091f4f41e68795043d1f6a1cac10f74db302a16fab15003d027e42ecc64ca5c099fbcce807c16ed328583e9320f373ae5670c54f6f57ccd9612541d5af2b097a6eb99220e7b611d58a358b5930d34477afdb0bdbb092a07eae24a8396f281a843e536525642d8b062200e40a1596190551369d6a6f007e25c04e35e7dc6b198b5e17db5c121e9b5dec2c0c2c1070df3ce81802a1db89b4e73458a25ae0a69e331d892b12092c77ce99512a16cec9829f480441b7499dbead90e8c167ae8a40b68a0f203491a5071ce87005180f891eb84242090170f0f7db0a892d564790591d5143b7ad32690f2b30238b982b84f0019677849de247d0105747f4a8f00945bfad8c28f3aea056e819a1f383178c61e60c0f4868794e5a6022840e50e8c009104d5e114f3c3146109a163ffc20091bb4f8b0c493262fa0f8dbca082c8cb08165620b7b44104678d1831420284d582122ca74e2640823809cf0f0f6dbca490d1db0a20d41218ca8e28c228060c48f132896053c43f0008a2d497e60020c2e5290411831851a31b2c15730603871629ba8a08c6592e3dbaa88287e7e5b15c1851d42a5b242a8562a08b36a62c6aa60a582334639d0551129a83688ebdbaa08163ce9dbaa0815f8b340a86c2c102a0744932e4dbea0df564db63411037b6c6bebd9c9eac1bda74e591e3044c1c7536814daabe531ae20afdf4c8381f6cb29d07e651e2c73d5e3746a1b97c77932c29377106c09a986c513a5d8910774bf1761a75a1b429de2439dfc75d7b4209c5b1a9dbee874703d66f3d7feb59f6b8546311baf30d5a91d60e7994af57ed00c48eb025d0346b0d3d02be3c3cffbb7150f5ff4bceadbaa072ebec91522843eda592119f7de7b3953f9905711ebe53544fa73d81e36327d03ddd1af79c1fa8243d0ae5d3b551823ef07e4f2aaa214172782401e3e0c733112ddcfbba1e6d1488c324619a1fb81f027ba9f08d3d802c97c04ea014b39a594314609c94888c5f8b34a4197d5cf90ea331d1f500c1cb322026835041348069271d005d5a163cf514eb603820a2cb84d4673766bde69142c47d97806b6fc59d983337790b69beaa9d7275419d879ab995a3cc0ed5d8eb411c924080de1b866c13acb55e79c0c2a84c138422e90bf8d0845511885721628b532aa8cc75c264620a6275a7e4082047cca01672814a518370ea6cb48e9fb41633bd92e399b747d137360a6b771682554861d32b07b3764049d6abf2fb193ebc1f0a1c36a3ad5345b25444e54348492878f24a54fc942e3e15420d282b816c4cd9c9ae8d26d0d8c9a6afa460651e6a3d314a12efde4d1e412cba867d2478d07843632ea5208223efa14c2e7ad5393530c7b0dc9a5bbe8d4ed756d84f07cc96bfa063abc1c623426ebe436300ba32962fde4d64f99c6e434452ebf6a602537614278be946f602c87947d84e55c18904eb92c6b6e0be2de49bf2d480ccedec8ec68bb8f945a96d711d4e93bf22b09aaef48173cf0d471daa25ea7b70b02ad849933e942a0b38023fdb9b5207429b1885d6c05228d87734ac3f347f251a423e8104a1f61d7a10dc9db3522c5518ca37861de7838bfd6474a756c5c7cee1e1db937863ac432fcb0de87b9f7192184d9dd81de86e003aceb2d4298f1ed8d9de4f09fe59844c248536092577fd8db45c2d06186a4eb62187c7b51b47deec4ef6eda3c24f7784029a5934e4aa94bcb4a496b9452f5aa58f3c58eb43331d24cc7c62d0883cde74caf7e1bc2b7c6e0d6a9d88240a17e80c2ab207c7e7e5b054143e9db8a09995f0541c4b7968449d167281ffe3913a27fcfb9dcf106e737780a41b089583101fab602a2ca2be0db0a881a3e46179d85b90c7698431a7d80a1c74c6dc08de885680123ce041f207a1e7aec1ad8e73aec129cb52c78e4edc5ac6521594fa23c3be4bacce667534b2995344bfc3ad2edc49f1275f229b1230f800da16b712485d097299b5883c2d6ed8961f01d75892179979560f9cc7c5ccb1b96f134b7b785e73367ce2d7b2dc77996d57c9e0f6ece02c528948f5cadb4ac3370c3186b6f87bcad53cedb53979d43e2ad443be5ae0fb8bd1d9715dbda3604609253b74edd3604b4cc47ea078e41eee559fc2bdbaa799c211d4112e9bd372ac1da8b4d19ffc25ce3f1a4ebb0b6a5d77a0514c8799d39239fe1dda4734e7f99d278a7bbe72393bbac7fe426179d7323c78324fa94d167b5f299f48eeea353a01ac599e0bcab509ccf5d6d229bd3279655292f4d3081f663042fb420269fb9ca3963565b884e67d541aa529f094a9e35111cf92c32cab589fcbcc64c3372442e0c22cea3477714a86fa2c418a57cfb85af21d36326cd7e4235ba9ee6cb6268ce2c34673ed5c8b5cbdb371a61eddf7b237ab1915f58f512be2850fbd159341d247d13bd873a8bf6e365d1764087ae8884b99ce9b4eba29767f79b98ad4856b7724ef479ad7b72cd5c9bb8b08c3e19b9ec32f47ee09745fb81a3ed80d985de440f7a4f9d56d48aac276fb9c55e683c2ea7a38ce372e8f87278cd228757ce742e7d529ba84d50a0da846555295fe79cb336e17ac84784b2e2bafb730ac2d0df3779f750143e5010410154a50c14426fdfea1fe99c73d1773ac79ace49e9a665c1fe89fd43dda5d439cb318bd9fc73ea6c9bde4c305b3c48667819bea56c27dfdeaef6e925ce8476ab99387955cb41ab7aa97f4cd57a755da4ba4c535d7a648144c45dfbf41267592d87982cbf26e95ec2d0a3cb1ed29ee3dab5a4b487deda6aadad56ee1e5c5f9d8a3a6e466a235f1446597e6fa67116de8e5755d2a30eea2d4baf2196e7d86a390bcf5f966849af3edd8333a1ad407fde61f1a784b07b703d62864526a267fab6a262042a3ff80cd30801858f17667031c4d0184a8051220c497e5b51e10174ce39e75c6b190a7c6a0d756a47e63f77f7c9eb393abbb69473d7b0f754ba786b3d1f52af21ef79933b5c2870b7ebbe7144589729a41d1f7ceedc73f7a267ced1dba4163152b1f231470a31c6186304828a0b5240654a10b87e5b5159820915272b2a341ce151995266d629672e2ab4044f2127560a3121a350d0854252dcd7b0900cae5017426260ebdb4a0808b68b09667435fcc410ec7d020dcb363c05876a2d99f2737fa618c1038e4c48c112b73ce58a8d53b228411fa67099e2a5366e537c701b9e4284884fa8ebdb2ac8cc67d88f88f2892aa66bf8092cee1335c8811269441f0c0063dc68a0c4117ece4ef244952453fe80e3b7d513536e0e512e0e4f2491729b94f56df5c4103ffab67a2287cf5c357497d0726db84a6aa0e54a182aa2900932c28bf58215bc415096a850a6c039e79c5072a8507e3841a1a189f1a407f4c9981af38916f48917356e12fc6d15e4657209b2010dea2206cd60e2132a488a39a7eca1059f611f3cbfad829c78d4b75510102d4585c2514a7975f0a09e1a0ebb942be50bdc61a5c495d50a88ae941b540b378c458d0a69c330b8f484ba3b48a9f2ceb11225f943294ad18142dca4d8101fa40d6727ce481aca4c2ca51366bc94523affb672e20b27b07c86dd8689d72fbf3212ebf7f2914d4d571fd21a0f7761366dba8d4dcdf49a77fedcbd81e61c9953fdb4b0ad75b880b394cd0936282e588b7536ce0468c337c7b1ce60d71ef549e5d8f6edefb5b05ac2c953dade5d3fd8f97b50d8d6503639a174017ec0cc008c1ed2e811e3059430709c72ce39e79c13d7408c5aebeb42892d251fa244f0a249d1143f509c48021111a425de694b931f1c928c41a4858b24168a03418f0d8468121485184cb678228512360c81e1022410410828de931eacba013164740162871f2caebc2d4be8608232bbd1400933bd843bc11755bc8001153790e2450b28328092c4931c002105145578e962064f98b834f0dc40c6173f2c60620c2992785a56505c60ba496e03e38ea1ba3d36aad3e9f6d8d40f14197195083e1e15d82d3723fe09d29d4f0b523d4aa73ea54f2961ac67e0e8d45b122675225e3a759b06ce9cf3795d297df4d147dfa314e3477db2d4fb7832910c4b420367f48d9ed029d7a494ddde5a6badb56e4dee34a82a026eae351e65ee7b072f07389d6a2da7dd35ef9cc1ab031b732eaaa1fcd678c8e831668a7173651869413ed078386f8da87d51f2e60d7a8441f539131b65dabe569fd90b4f6b1ce5ac5e5846b38eea6bfde2c2668e00c6b0c55a742b049c79aadd6d1c90d8e40408216cf03d89cdce02ef70eced25380ca9b7a91e61d649a1308a6b86a0834f2a1564226b72f8b3eccde530a83ee7f291bf8c4b3872a6aab5e60c879770e8a81e0695104c72ef1b18509f73c3ab974a4efbc6e425c7a7be3979c9517d53c36f78c96dc5506edb85236721781c5eb10cf5b5de701496e1c83aa8c7e137bc5d2be0c8dea9d28d5cd3a992e7c06c60b853253f61a74e95bc0686ea5429d34ea9be9431c65ea8f9c29daa57be9daa9daa8eabd39aa53b87596c045e50a55afba2b51380b4d6b276c5379016e6b5c05a6bedb4335a6b6d8d6e5f78ea31c61853df7454d696205a233498833308c0ad077667e08cbe6c619ecf9cb5300f4953e0560667ad8c0c0f3ae8a03bc107a518a350fe9c94ef278b8ac800461360f8d01702fdf98d3987164124ec7c32cbcb2b2490ebd27d6ce3d2b83c90a623b048c099eb918e49d247d7bdb006f642e321fd84a97a87740fbc1f2af408a49b86aac45896cafcca3d591bcada1653c333ba5be3915dbfcbb1fdc17fddfe3c5e45389089609f03bde345043acc99eb97023bc68e21006ed0da60946bd77900d839c066dca0952e06c6708c80d79cf015dc1abc02388215e23e00250b00dc600d8d753ab0923eb0ddcec72d714ba05bb2856d3fae3cd82fbaf61123864e2b6aa0284395226d1728ec0acb16e702cee8735961d992011b272fb1489fb05db5629c519dfbaacf2132e7549744aacb3c44fa8c8fcad16ea84b0c3eaa51b248835762ee51f45a299dafb05cc122e5cd6961f56bc8f4eaf1696d3794f60d09fa690bd2dace536f4c7a950edd350aa1a3ce0412b87f43aacf4c43c4d17eeb2232fb2dccbd9d7762eee125c47d75cb853634dd45c4f5f4fc1cfa49643acd19b48225b479960e6c6bf73274aacb05bf1f6e737380dba347ef96bbd11f7a69d89cf6096f17dc5a6b34a0506ea21c4a8620ca2883c6fb03dc20bc4de7feb7eb326ceb28575490f9b6a2a26845850bae5855f1e45e3775dcbedd802c7d770568ad5bb7f46236d358b71cd2586f3436bab3d7ab605245cfdb776f19380504d5507e45994bc825030fb199529a0245d1c8d47dea76e759580669642e129fe6d6b0cc5e6097af5316c460cb1fe0db2a063e3c7df299ce859042a7402ed4265c8f21586d7b196d5f2bfd71db2dacdd5d8e3ab51cbaa39dc2970bfc1c428ae1bb05769bd415a02b44b0e0fa8a000422d03e3a8daef568beeed1f429bef88c3e0afa14b15d8f9e7b1855d20cfbdef3c73377aaf42ce6c4fc8860ad17d7a3bf79439aea39d4e3dda918fd0727c6a3731f66ebe5e5e0091ad4728b5958e686b41f5d6f9704201c39cc99f5d16834723972e9a3c7697709b15efdc2acdbce43db71de8c18c478ac6b338ed49ade641acb732a690aa621521d7af5e63c1fb1eceefc94deaec9f313d3b92f9b473a6706c867499cb668dee87ca24fec78adedd2ac17261f7f3a157316b87d9cf592858fcf929f14d86693c121260e36cc73b61b82f00dfdab3e2bf666067ab8adeb5194390721cccffb66c1cdf3b08cf39c43c77947dec319b2e0f6cc013917c55138145b6251c484884b87ac0373af783fdcd0101ec243d88aa12bb26c21fa82cbf4c7e571795ddac739ce8352a208459122248313aac66d524243355e3032c0d41b3ea16adc26650576f884aa719bd4fd8289a260474919ca82f1d0d0fdd23e4378a887de0f17e58bcf3bb7360f59ce5d9487ba5f8a7e60a1bb25eee75dbeaa5bdbd75d2e9f30aec2baeb2edfbb72424ee85d170bcea91e3f7342b68a156b4d7fd39f9567e55d99b666f7c4014571407d033d46e91bea6e1535d6222c30f5f658b07bd4fccc7d66bdb81ece8279e9ab2a55805ae05345ca3f00fc7327b4aaf2f3ef0ad5dc5c8fcc7681d185f847de9933420e28baea9655b3500c3c1976403567746679b5fcf02069b68b9869c1441e24cd76c1b6cb34612791f005232edd92c36bbd582fd68bf5f233912085987729f8b6b2c2256b57365d8e2fc7f8723c4d584e26fd921867f0af795d145b324e7bf9854d266c3261c779f8f29d7e8c4b6e2dc69793b0932e93c971ba341a39369130e9ca309e26ec2412be60f589bdf53461c74e21f612c49793b275bfb81e5711fb56cea457a769a7901601f4de7bef7eb95f1e0f92f6b945d72dba607a893f1fff7ed7e8ba17eaf2cbe935ca8dba5fee97fbe57e01e20283286f806f2b29cce464ef628ca4e8a48b66f0bdb8f5ae5f24d245225d8ef32eebf28be5d8cb47d7752fbfd67b5236c3e738b77e394e93ae5f3973992dbaaeac95fc75e5d1288bc133fc97cb28bf19b35e5c0f2b9f68ce7e46f15e7d3ee9f339e784900749172b66ce39dbb46026c949d935ef352fbf73ce795d3eba260c679dfb96936a8cae3bbd582fa5a64778cfbef71eeddadebe5d44de3bf2bea95bd8cfabdfa29ce8adadeef609f3d96b015ae979057c5bbd608b952cd58a152b3fb5625e5d62a42a547a25b90e3924a773e62c52f7bdeebd97df924f6f39c33548359ce42752d720917236caa5beaecd3acdcc5bb9fd7eb9b04e21f4f382a97d69fbdca27ac15817cce5234ab1f5d7337dce9b6777ee49f252f512364d5a5b638ce64cd69ce9a0fef6c4aeb78f6ccea43fabd6f7ee97fbe57e11ba7a5661a5842d7bbed3efb00cf7a590baed927304c9536fefde535bd432f83b9db9e75b7e01df565110f1573ef56df502266fdf45572f50f205f8b68aa2cbb5026dce878efcf2ea5903f528fbdceb43f291670d64f2a639a3b8b4a394b3d168e69175cd99736cce9c9947738ef3e9724afb3167ce61b65e5c8f49c3d517137bc1c49e2754fa5c6fecdad81dfb92e96641ebdc86b16c7cdd174cd6d1bb9bfa95978c7ddd3e45ce84f679c3b8b6de05f3d29d99cc3ddbbdc445b7167b37ee8eeebadba3b7cf2d72d65e30607e5e432e8f0df488a05fb14d3357bf6d726160095eb92f266fdf7bef7eb94516561de7b52361b77d5c5bc94618edeedb7daf67a8bf5f9ef492eeeeae28771db63aa83b2f0d75cba54726565094685abf7e79d64bdecaa42970a683ba762e79099ddee9f27eb95f7cee970be67e892477638be96a1757a5589d16c47aab52040de8f29e982472613c127ee701a10ba834aed5653575884800000008d314000020100a07c42291502c1828cb661f14000c8ba04672529747a32087411c838c318418628c21840003008c21b2a1ae005c29291fb3cbde19c7d11bb63ed054cb7907884a0afb730c160aed60004b1a416f96874c2c1e033bff9b652b9d88a6ae8ec2eed3a64eb1f1e1e54cbfd2fc185865b603e913746e01c6d5650f4d8da7c712121b7ae5b4c9af50fd162a554b57e1136f26bc8df42b384da764e2f90c756710395c11a0b4571a4777824332f894847cb1a5f28892e54a8872a3f7efa9908f07d2a643170bc44051550a0ecc0e94924f514d0bab52473be31d423004acd50ba7991914a204260e919d0190ea4cb7a4a3477aafa4314184773afac74bbbafa0cc8d42a2d838620931838a5225f03bd71b4f61d3d73fa5f7ecaac7fb7ee9a425d3dda960a6d01e7611ad2c8dea84b8cdf7abe18168ca3a3485e31f4a93acb357c613af0467d735aea7613672704d06abaa666e4534ed898496c19402041d04fbde889c79d52757c6edf8208b157585ce8f5cf9034ca8fc4ce26b37dbc1c12b697b399c762f91a651ccf16928a9dbbce323f626a309c78cb2f6ed0ac3d01a0039e67dcd588014c202e6d7b950149ea445df01760a33e6c1a71e7903c47f42902e22af7e4e7f4ddc1071729385dc8710430d640788ea72dbeafbd57048c0ca74a8c6cdb927b3d662fbda9a20284427c8f3887168330b9a7ef312add8c1ea0085b4035876e1e6e6b5ce36e7e228079a1ab2d5818bf7037de187360eaf7ccfac722338328f0059d0b9e91f33d91b3512d88c636909bacb51bbcf58df320add32833fb686cb331aeea56ee6340182c26142f5535866684ad22ed0f71817f238e0e2ede2779f1240717e2b634e9a853832fd08f8d19d7483c12562fa72cc4907c2c84e2267dfdc5d0264b84b4e6fbcaa55f8cb31c6dcd1887422a91429ab1ded138f4102ef73b07f356e1c676a05a632d0d8664791dd12518509279c8039a43d4152fe18d6f00504fa622d6f5477bdd5709a4d6b61f51a025881eb0e1905cb027b255ef157c4400c3c3bf50681ac941cfb8084beef04b547e99e61e0d71d5ae75ad057850b420d4cc8259c8337c0be709ea7a0b2b80d3c32eaca59f453c9c15f42dd273237943376dce18450204c931bfb399c1ba41ee24d080cba03cfa03d67844b738c5302a4962fcd2f2e4518605c61a4fa61d84948fcdc217688390a3038e3235d9a1e3fc1ab5dd18f1d5d16a47e557d04ea1100afb616a97fa40707e372d581625cf57253443ad3aa98f0ece4e33ef223d534bfc0ec5edd8726d15796391d06c3643de3d3da15b034b11c85bfbf594a7aa0adf346bd3b18e671ed48f338ca51412165602a6555f80f8f9f23febd964f76dc0162bce2165ceaefabeabf1f446e171292f23362ffef2e99558ff78aed8b69834d853d81c6078911cf1ebb1fe636529b9cbf3b40a43dbd87a22bbd8197ee41d111ebe0961c104bc88b22b07da908a23479a8f55f99c758ade14293ff1a71a7524ce5c06d1e5552dcb733b618e2be21608fd97e9d65d2d6dfbc62693a3f23197a97eebaf997077ea5df19e56a6b639ac106ce2031ff26548a41b4c454e5ba1503962703a9e6dbfd4ed83126452f7785762f596cc7f394f27f2353c1f274af249243cfe3ab079ff0e8a48bae3cdbc9799a7da4418f5879eef189d293cf3e7956563848559e2a5d009adb846d479b24911ce65e2b93407b6c01f0785f3938cfe9e6c4465dad3897f1fb227f392b0dc62d0cfb0ec85a8617063ba7515942754832f5f2b591593bb8277339ae93d5bb8f77955410b1855732cae6bba6c8a19b6d07ff5698a875b145b24c6fb867d9bfddaa06429975191a0f3322040a128ae28b794c44807870a17fa198694f2ce0d3152eb16e94e9d352a883cb4dd6ac0ef509ca48ebb7386b660b12b3537acf0b7d952227285aed5c8128ae16ddf14d6be7763a0fee088b1b19ea198ec92e8bcaac827c0635f74d1d9cf440ac13812e413d56087be596111a38ab2c8017bb47cb205349d734353aeed756887759d62f590ebf6fd0ebb3e8cc09513f5c92c91023e842531ccd5798359678ff3f87b2fc3f768b996beb6311ff2307c9b5e4847775a337382f1c403602c8fd8009f8414920679f983ace932efe7ffe17d2cd29ab099fe198a020b74fac017fc757c5a28c1621e886e01c7a9bb7977a7b8dc3db4b3025f138be5f1061c41e7f605fc178b36396548d7bcb7221bc1a7db2a738af98797194f1e722361466e71e46e16028be5c491d3cd7bb28f89799c4583700db8e5b33fda04d6aeb69fb0aa47e6dcec59fc01c954caee3c8470b99f19c62c46c059070be027cbeed228c18f6cf97d0ef5921dfea0943084f564e8ce9285933e4b2adfbe06ab4d30593f2509f5df4bf373c527da2c4b01c122b59b00b71b47d354c041e83f8153ea1aa44c995775acb14e8e22c5fa95e96fdafc50015980a83779daa441d84016b4d077675b2557694399996b796fb134a56b24b78937f086b3105585bc2e42a973c3b8ba89795fdc604d61b237d2cbc92094c73387f7bbb461b63e76623729ffb6d91a390daa33783bffc5768c5f0391c559c367a3bb23af0dc45a0d83dd77e8214d32c61dd121ba118a0056df6eb05d37c4e4d1e6ef1299af3eba7cf6de2d146f1c8882aa8b67b2afd2798d7fb41e8e8cc5ea00a2876cb06767067a70e67324da61968799d6b677cc37849c72c752795c14e0779a5bbf0824b105170f71ed59b3d83b7942eef86895218ab984f65b46e42c9504ed2bd828f07eb25a05518190ae562b819f229914c7040ea0ba2d8c27faac1694d5c59cae065eec01c59561cdb81aefb6a5631596cddb0553acc9340ffe30c9d0514417c409f4eebfc6774b4a1517945e0d04710b49cbc591ebc2b872105e5353e5bdaa254e9ced4cd658eef22ff76f58a6078f55981751310fd6a67373e9cb11471e0fa18b57fe8c8a86432b82c26a6427704471798d1c9097d09e52b2c18744591020a08f9697134ca2e1f12784b648acc5987c377586b0dee728b07d49686a70a9093be83245e6c7ffd0e3e4fe2e5167539b8222f316ac379d0828c511143e37720117566aa7bc79c317d8324a2e270998ab595803fea063f772dadc55cfcac65aac0a8ebaa706cd846cd53bcebf249b12841aa85a14100a5376fca1251abb1586afb4824f7e044b481d212187046a4af829496c8a7740848e2521f741e33daa77a0315a263e4fe0d2fbfabd02ce8e456715066c817a1ac318c44957b4cb9bbbf090bee76df740639df67d462b03dfb553dd2bf94b2d3e4b0bccb59b5311cb8df8a21742746766ac767494add7a6c719e56e17a7d04d085d84a651f61007f52e14028eeb4a177ad1709f113061e363af5bc047b94991f093359ae4c78ef4b947028c6a5b3a45fc7de62ee4a553554b97be2de83fdc693df85767b4a6c501eaf1befb2b7cab666cb40b7452a86a102098b04704976d13834f571dc839f4ab4483105eea4cf033246ad02791612ec3ae0d07b505d551cad4fbe77c2bb00285808466b2f1030e39cad15e385241aade1af128820d7e231afada328363b54e8a34515055f3a26deeaf54d1cbfd1296549b95b51230387413c005a5442f5a9f74cd8155ecc7270079efc8ded6017a9b94b30086a781c86cccf65674ca8884d43fc4a58022233d1e6736ca4de518da7579a98e4bc407866b122bc0fcebe48384883d3b902cedba776195e477cf131446acaba861125b5e007274f1d0d41742cf0622dbb074c3a18f446736a6163017cb901283c4a3a809d53696a902c5772304d028fd89cf421732a564ebd53878cb11c46de455f566a1d0582fbecbb35f711c0fa71922c8620cfee9919f92227ce56071f4216d772dc596d8cf35406a5f379ee5b72718d9da31d88932b9e63b14fcf0b742411ffb47931b427575436314fc938afb3f5bf8907ce63a01e31918289f0940ad12a1bce59998d133d58fa1147707ff0123f464c2f5e6384aaba37178af0cbdc248ab4731bccddbf50f12537e00b05bfbc46c621b48c6bad57c09832eddc701fd051b0bde48ab29d6c528bceb32ca418165260729959808b13209231c699edcfad6cf9cbec9317843a84b22d6649f7250ac3b2329410771090c77816fefac6b1c391dc07ab0a55272a6a970350c969cbb106d4fb6c62494062971334c0379c07a64d8581488de1d86e08efe84c111fc9333b4a5e89cf64156e453a15faa3b9ed8903e23129b7de3829496795490b841e175d613bcb3c1044d9d5f44a87c534441533d0bdcbc02c3b73b85d1142af05c5a02785c484c057b204634d3934b6b046276875709b1da066423f8b3e5bce41e4ae706cd4fa6c89f253da7a0823e061c08a44fb0a376d9490569b5d1815cc22a12a02130178481ef952bcef93879a4a18bce5fda333a9fa2a72f476aed4a6600ff9c8e8e4fab97a673a33a52e4a5ccaa87b3ea08b71ace1c245ccb2736ea27b8cc88e9db201e58bdb1e6162e3ee260953293a64c5ebc6469320b43064898bd4aa0847d18139e7476b9555ea8d47cf476000e99b67348d63a522747c71d2aa7c80d98ad508658bb4489770ba1a80f5aa01ea486bcd7ec79b3846e015353484c9106150a29e80010f203c3a9384973181099186c78496166d292f144d3ff1cf6671d22ec2f03f44c790358914c0b643775458842d000167134e46fd4684f7599ae79c1ea0e5c606e68620db9f56170c0869f666197a003c0d80ae4ea13406eb07787b23c039e1cbbd9104a279fb065c63778fee69d6b3b331f01ae83378d113977c3b6ce0d98baffa0ed64d50f3c0833b08c6e2e166d7afad0502a7a53f9f02f5f9e9734d0a355bd5b31667ca56539a57082c7100a730cd34f3308ea0d4199f01efa0977ad5f4532df6ba6c8e9d4a0ee7dcb232a2e21e64cec910d043f14406201ba49e9251cef2037198f7619e68fa91aa2253450b53462dbf690309f52e08cf77dafb77c2ffec9caca5274a642f868f9d31923fc52632d4184681d6d931095d582f9b00c1cf9ac978930dd5daab281055c65f22a98aadfd58f514f4e405ac356066893f8b25b5ad43f3804f35864946786fbeeebdeb05ffafecdcd9572c5003fb51d23bfe9752185d0e063061b7b273d151dc528c8f486ca831d2bc11f886263e26ed71ad4195541abbf2af21196fbffb51ba9e162cdbcb66b44667d7a98c0d8e61283eb1e320be927c38bb36d82963ab375aeb5ce59b505f2fc8d8b8382144d538f7a908c0d4f3b00a1ed0adae8c0bea72a8023c5f9de126be03a3309d1dc34bcd1f957ad95c0cff225a7f3f1c303a9b738a26354d4a8ac1a5bdf8159270fcafd277d691e53d13051ba175b2d94d0cef2097f11f91b38cf90021154634357b0169d9e15c19a80220955c7a19e4e26a0448be942ea2328d8f5e6ec28126403c30c0d22b94077227def8150508edf8023390d7498285a1e622a525e3a662343f5fc320be51ee43078c5426de413d6f0feb039b4802be4dca7aac041eb3a60a4409998c01c1972c56e9bd261b0d08fcf70ab7bbdd792a7a00890a739f78696aa6322400177b1e13ed776a48ba8013bb24267d9214c405b000e9ddf723a8063d2c14f38f9f3281b2c0340e8084e6b0604be5510a08e0c1b1eb0d5772602af2e75c04ed4ed99d4513856dc0c83b639670e6de78b79482a0910c78d92aef1272f0dc7581f73e39f63c23fd7a3ef47a43f79fb80a7d40c9c04b4f26876d9fdc213a419f332d6c25e73a9c5aad7fcdfa68820782a79420f832c44605a1d1a2da7d54136c18149a982f0a220a2e0b8822e49e429240b481f7539c2139e84009efd683b37d86ccbd29c2e1ba7ef1908348751f31c40f14e27da7eae23a042e4523045d981baf9dc086121590f967dc72180f6471553f8c25f9738cb9125398eb52fc8839758efdcf3e392ab1254e9bc09546811c9f1f40f6cf574d277271f83010962e1a68f39ced5a4ec1b7f5040226380eefe87b030a5c050cfc6c6981a643b50149c2381decbe44e806616102331bc9f682009b091858203aeea0a0f532e5c2279cad7cd0f146147b4300f1ea619a447349684aefa1005100fc65b57ad8a070c3ca90bc21d25d71addf3ce21d3e61c9e3f4039c0880d4c07577ff62f6fd2fb9bbdf6d7e9cce7b60716582f9e8c7c983f53ec34f9412dc307a052df38bb2c74545bbd00bfebe7f40a59b43f4f749a3eca9601840dc42eaeced9faca66b0bc312be22ac1137a0a7bbb1f66555511b4042f9244a18ac18d6f6381070e15fff69992ce9137929ecef689448e231b94207a0d635e06f1287699acb85a4d93696eab19b01125b10e71b43c721750d2e23b19ef97de545e86d4dbc60a226904c71f915ccd33c6fcbe5b1c7e7e7da9a5218202ef3ce080c6874c373a0d8a0ab041f62dfe59a74448948e55b1d5b9ca47583e62fca80e86f078129904b0f242d318baa76f5e6dc26db6a8fa46c3805dc597da9969e86d7eec59007ce09348fc04a324d70f1a9bf521f110dc4283e4934863c051c7c305036532703125decca47c5eedf22f68e00e78bb3d3516877fe75edd2617dad8e2140dbb7b103ca1bbbdb46eacd580f566b83bc71cd9b5e953120fce2ac0582b9984da95b473fdbcef4e3c04bec3695091ea061e558e79d1f1dba82b84bc36468621d9865d66f4e254f50b5d0e5f3997260d5f479c348eafd4291e1c2f0a7da599c0a0b443729f2490243f94e6d846bbbc97fa34d37b06f68df05607fb7a275d17042873f5c90c2b25b3ab807042c788fc747beff598ed30d00d34e81219a5af450fa435db99c637964a41bbe6c6018f527b46d52b1ae902c8a4e085f6c4e4ccb08d0a2be9f5da32bf333dbf6228b20f7e98112b2b3e080893fe496420cd602104d825124696877398a595163e29005d9d53180f170ad1055dd6fedc086b0a3f7a045d7520a35aaa16267414575a26c4c156addb9f34135b8fe8673eb638214461a36d3776bc1de187c978b57cfe3689c594e3f3a66288a52094b9859f76d1831eac9d0a3daff48a88c3f84728d703a26f1f2e4e1f9cd6e8f1ed00ef6f171659ba5724ca274b898d07a6109feeba25c65e8a8b6f7a9398adc69af9846c40d06a60487b0fbdad179914ed079f991fe3b55bb730638400847d94fe6478bac477e17b540c51f15ead5f9cf0b886d143e0156af3b6ec366a3321debbe0eb3a840612799e1a437652fecebfcc5184b80b28ef23422f28ad7ada632cd4762ce39d643d302ac710d79160edbe4378688fe233fe8fcd8b22d4c25fc879e69058f21f0b347c87faed50efbee642d5bea2e76a2a612632b806b037e302e6827244006617c7cd0ac831219581b6c803057e1a8787d58b49d6cd00aae9cbd11460b5e04577fa8ae73899b0869552c80f09c3685dfb3d1c04c72fd11c226d9dfbde5274f2f18061543308dc0e6243e2ae2e1b4528ac4c67228a8de9fb547cf7af59b1b7dbefd39ca16b88e982020f434bb95f39e29973b66d727f48e47e71d967864fcbd5df3884d2fe78963800515498225efc5ce21cf5c49827ba91312e00a79be28c97c4087898f32f82b79d95f36124f0c3c6604b5311452e9f77b9054cbff8b3f4f207af9af91a8f01d79d7a4e720b6a5acbbf89d2c2e78ed49b480c8742302229015991404114c4a2a088a88d222df9271cf3607b08084024fc3820a881e0cd6cb99443d81ffad388bda3014031658020cff28355f79a68ad83b9f9280134a829fc182c22037a64f831050e626c8e8f0a1d32a8954a9ee0c4d103d04ed1aab7c1dc5d3ff33110aed3aba7dafaebc17756f690ea8b5b67bc7ded171d62056833b6b8037d8470c3531c484dbaf3008440cfca145d7a032b70c59580e2b88b060d86d7883ef10da20fda46ee176d064517b818520815e7d0705d410b18f8e4c545d55510ce96bde1f48b23e8e0e1d2fc8f767a250bd28827bf9fc0805f5fa7378e809f0a9e06b8f05d1cd62c01844084457773554d365eb32520d9fabbbd6456e36b8fed8be978b1f1ad1054c80b63a8a2e952ec1e6cbc3e39ba6304265c400eebeadb0ad8aeecc6e554de26ec6f29ff0a0da7ed87b6d4a3d742437043c9ef300910316f4697dfee4bd9f031d5c8293252200d620a48436be93adfb3fb9a6139f0d08813d2481008a3ebb84f5fb79c7dee6a10877c9f162c36574c6f0e9f57bc31590d4f19129f858881488b219356b72660d0c186932d940eff9d6843db3504a65837ace1d7f3af6933d662f5b671042a8ea7d7f835dfe7bc83a7c65548651d12931ee0a6178b56797133014cfb90e2547ee82983651dfc021aa58499b5ce08db243cef0c018069ad1c98a378b8658a4475cc2d7e19897d40f40f82164314c6c4bdfbf82f9724e22a6c40d0595c724f246ab56f0371a7de51e518fb98e0756481f507767c2bd80bed30b996be99c5ed18fffb1593e09305a7441a4694cbf0894ac5ef754ef10523533505ca5d83273eff2a2fa968b31952d3bd3239c1a372bbe11432219101f08aac900b365838df271c4d7daed3f821cdc5da643528fe8e6297387c6a92540c6689fa5d6de79e1a4fa25611c27927c6226302c285999131a258ac805b9602010f4c410f2fe3ddea3c292d4fdcead1239f7febb2ce1591c44c2f07913fe4223d355753a986846cec4085866acc6fd872e467de013a0e949ce6edf69f22d86768f643342c8aaf033cf80d5ce0501a43cb59c6d1b61335b8d3d59ca4c00b683efe0493de882c1defa433f2db093864656daf9a55afc8e19869204e01ad06e4cd0144d2a1db8d2a71b3308f4e874880d91b3efa0bc08eb8041d770341e5a4830524da5a664614891d88aeafd7d3c8c9ad419f210669f1e34ad4ddc103956cde71c0d010f61e72892adb945eb76f6ccc4286640aea5346fe62b4550cc046cbb1dc08f7b32e067f1b0f386b223c4f2f55d004e9cdefd07bc4c4c36a64f27ad9a88c53523fe4d0e1c8ec6643c8dd95e5429122cb58cdab3652cc0e0b1960d5da58dd7b071278905a2168a8b64a6ef1298268fbfbcebfec8aafa3eae89771e34728bb055fc478bf9dff4c810d012ac32b3174fa12e7ce9c3c88895ed96f6193c144928dde1f5a70b45cbb074cd509a91ff283df06ea3f9a072f47ae8675ae7fc167d043406895810fd5c3b8584662eccc32309d249062b60ef34cab7542abb00267af445e0a70be6344c47e8ce96788044f8de43f07f004c8273fb53982d401fd40bf72bcfc9786e9510a715ed6e16c320362c992b04b8478560dd3114e1f2111a0477be0f67757356e2615098b74ce3b0e8d9ee040728181eca1a8293cc0a7ebb4472a964ec09ecbd911a6bbf263fd4223c1e7f620a795fa766bd7d3821a47db3a9413b26c0618d64993b80c2c9b77fe1b48082aa053d076f7a79b56dbd48cc3054c5558ebe6fba5485787a18b4043629b42f7d071dd373dd3c6706ec043fcc45212a84915d1f619823701703cb30c11b22eb07c9b4aae2ba2e3999696315229cb88b68b8fde69aac41ff0e6a50c7f18fec343ed0a822ff9221618400a16876a76cb0f80096022fbecbc41c3110a1b1d7c5e156e56a26de460cae867b12c99a4ed678fb947ec4e01c44d51227bef1dd1dc2493473b2bbdc2f32cb82f315d70ff97aa032ceae4707f7c35af57bc96e944e4c0b38880f2ed251d8bd442ccd37011320d3410e5f60d7cc2e388180f6b6d1c13e107535c048380da3c716b0bbea83fce134ad18db49957ac2b349ba6ea9907a134107082bb9f4c1acfd206b026283b62e561977a9f3a1e093916b55805f70a50b5414400f3c1354d237be1954b0040bf8023ab040fe3bca065471e7b96fe6a15a842fec9ddfeb2db8681cf34a8c1f01af80ee7d40f3ee58ac43517c6cc96e0e1bab610303986a586a0309b94c24c978fa70607a0b24f3073da1978454d75e8a24af1bf3c5b898df344d03e7e905cbf1fb2f912881389201513321f332d895f53de65748570f7337a7c47bca95a5834b396982c99c174c4af0e3045f224b68d8db1de0407ae1efb701ac1b25bb655370dd315d4c0fb4166de6464bf2fcc1d6064a72a50645493c60caf90d497efb0096be082bbea960a1694b2941a9512b289e9e0220d921502dc6325dd2ba77f66dc079021761567242c529a65330e7214942256d97bc49226e3ad8fd407840de101101db599715403c7432a07e7b395258ddf91425c931c31afea7b52fbad8b9b1b10d7e44b53a942a085c55b1f5ba21a66f0c2a15265cbf7adc1c6529dbc0dc6440c15d5b17276c03b747a4fb646b49a40ab3225350270b47762d937123b3e41acb98c1d2b3688f81093e4542918163b7630444932c3eeeeb19d28e1d3d2fa38f0fd97acd631d6bdd618b913e712c14ef722b06649cbfaa7361d7b0a767398e66bc7feab6d5a51d4158cdb9ee3523f5b465a015d7300b6b012de02e2d4724fd8ba7d7a5b2ed2b648bea146d813a17823c4e26c4f9368a34595c11d15e0b3d57ebca7c6454f9bcf85b5999e7eb0c44ec8c3b7a1d6a3f7c406bf733887664d73b6abaa10c465761bb8fdbdac2bd2e55bbddedf85ee399e286dea7543767469d7d06bce86989e3477dd6a507b7bd7c56f6a15352d217a5167633a52c0f0f5fce2c796b02f1451667e7b4d2befa9a7b9c10d418f8b2c211efb5ff3299d7b9f24eb857278cc69c7e54a7b64af6dca122928f6a71d63634ee67bb9f0e12e794443e485eb99485d383f4712b07a2447ab0ef95cac47f3ba77cb43deafa551b44d24db3d5c1c6ac53b27fe005bff6c6a5fef2b842155a1ab6711daa3724c8fcd1cbf60aed4f28c09b79070e0700016317a20ce973acec528588f24ad616d2887f274030b314a64d05fb39401780864f35176f216f7847bf9b672eecfdbd53da016081692184c93918e061de7dadc69239c7881a85274ad0f18aad69f847801bed6bceb4a9c079f7f3c0bc61e02c8cec4d6ea0b791faf747e32c3b252f4560ae92d51ec1bdc0fb6b09229c2acee5ad2989069cde2f6ecd759fe2d4b3b0cc32809fcff2f292f0929992db3e8703dfc4aaee35db14880b2e339ecc1125df59870bc173af4c810af8960e1002903590bdbc0cc72708661142ca361b235a66b1227c7c5f2d0617a7ae038e504c076acea7c1e0590c4e1fd336cc5a36ec292413ff5c331b0e5cbb440dd9296f81843aded05d84725ee4781879aa7a042e1b01117aa6e3e14eb7c6c905d3c5390659d8448a826919df1851032c4a830ffea1554e92a84f4112d82bebb3d64577698170335b11df178a35e51b95b2f60639e530d8d0c806110037e0e29a9dfdc5104a2c59fa4565218f1451bcdcf4375e2945a1d7754328885e7e6e8c8b9dd08b77acfb5c6de5370ff74fc88e55100c7b57c1830a5ac7331fd73f419eeeef8e75a0d08a6e69a694c759f951b38378c8a75fd34a8cd220f5b411e0b4067565c9d09ce32f0c566fe671be2b2700a72b19047b1108b70577d9379e9f4a47135a68f7c3a0442b93059d010ff9129d3b90e311ff4e887cf28417a3ada5fb1a9263ee96574a83661cfc9f70a8c8f15bc582ff55600f0ac13d3efe3e3b1725e8d98cf3ad5c14dec145284ea87a04e658d0078f8e2af81ad355a9c887704fd5fde1f4a5bd36ea949e2595b2e7597bdc03a613499aa5fb5e0ad3d0a744e0ad7290bfc2f20450810d481175a0a7a9ef8f1692e88f7adc66c8c337feb569f04efbfb7ad6de1f3aa7c48a117e3cb25c0a91d20638f79bee0710205eeac406186d713d042b5dc2151eb0505661e6bac4543646c6dae6e4f332fffba9b0a7c9af93741c404f09019d0b5fc83df284683fad000816a9d9e527a9ebf2faab66af1995a404131f276687eb23f8cbdc4fa9019473221f81b0e05fb92fc8a3d7dee810a8f41e5e4e366ba988fc43bac39ae52a3e8787d355854dcc2b6f0d7c0356ba8461c9b8f3bcaa785d81a9e0c5571c3118011c56f90cab1a60dc5838408db43b75166af2014d351937cdf7a2dcd969cba16e77a1940457801c7f684adcf7dc6c7ab286489909cc5b6e5648d1a7ee541a1c46ceb3681169b448e2c20be5babc416713d85ca50b8d10d33a5f1fceadd4d4b40f78282e4e75873678b3f59720684f7366103bd824e4e0224303ec2ac63c5d8e1f0a4f6ab5c3ab0b406053a37951b4e02b8140618701bb374d664f4aec86abd39ff1131fbb75c05573b6caf07b8bdc8784a1ec292006c2252759b0398b7f12e87e9c0f5770bfd2b7c51a74a95a791a93d888aba5863e42c26a0d7779811484296827c42d891e120219212643ea12fb93c80ee9b9c4b05ca6e0a033c7106785c1ddd1d4a386be3976e2de64fb76c5a4291d442f6be9a4eaee25a1f3bd7a74027c0d9ea528a4467582b4a44c3418f23d7614f444e85f8af1da5096834168785f563eb8ed5f4a91198b0dfa2841c20454a9a91b048eb3d6b2106dd5820bc391743196c33e238b1054b5b1722a63dead61d18f0ba4533f543957810401138c069fcc850ca2495fca994260c4488e29083e621cfa6a2ad6e55e3131ca5735129922b354dae03a0cb9361d50963b76b2b3ee314ab107baf1570d4d2a9dc4ead10a28fc22df932865a19289dc251a5554c394350685cd0e33548aea15ad4ab801ce2d3bc52a974d2b6f9589df9371628e60862b43178d1aab0e3ff64c2e97ab8ea6c325facdf18d6a58e1a1417af94f64f9e2e026347e18ad985c9a60ec2e90be8e67848f0d3815e6f49486ac1a480ee8c9ac97d1293f655e13d403a76091243368f2268a9496b7628acd45c183012567df3d1c3bf51018d5138cf2898258ba1982ec4c793d438302db9c2a15185327405042fdfe0d76d290b7c8909530638cda64d131031103d61e92400515c92cbaff853417ca962e18bea8adb842fe4ed2282866c1fe12e02563a41331ee42c2a43c742e250953b78214fdece50d33b6520e2fd44f7d88106f7717d2fbdbd317ebfbccc030851f70483c73c79b39441f5e24ffe37df73409adb47938ea09e66e29906540ba58ea183cbc5ad46b215a8a996925b15abf915f596e9aec4f80a57849cc0f1fed6b3c983329ecda384a4d7334881636a39869c0d900f1598a90c20318b7f58614dccc5df975270944dec40c84f5d96694c9d01a5c8c88cd594b63b872caf26734e7800c0c8af689af17e4ccce3721ae3cc6ad87a04925b2cd2108c211ffcd152d44a7f5c660de71a9beedb8ceab926af151ccfd67fefff9968cd268e6a0911fccb9577946899718752711e9493a340efc66245f6b55091105bffd66c876d5cb1931adf9be6c120a9852e51bfeefb9cba49dce79c174456f7883b1cd71b7b5e8f81df3eb2c6681716c0c231383f304a30d934bcfaf73a76c13bba855fc664966108148652ea669f00e179bc6be35885d60094bb09f22e15dcc594d4a3c3491f1ceb838224a33a9dab9355e7a56ebd0f68f69e314c7f0a4c76dfe5358d1e36cc8f9b7e24b994d8ecadb48bf20af071a9663184fc1087ad68f4d465de7ed6a2fc803223eab5f291d83a10d9bf980f466222391096a192526c916c2d6134377bf3b9c99b0fd9243e9b5b6dbfa3d283f6c4e9f6b9e087ca19f5b0b7111eae0e9b34dbd234e9c3c40d1be4584c4d1e7580e62822fc3288fc828c9cc353b107ced42c71db24d4fb2b1af4b7e600e33de28518f1e0bd847732df73fc29b6e21e6f5eb67b2082579910c236ff46fa5309f997551f75b1dd2c2038e3c77dbc8ea999a391bf0bf565a171072f5dac751829e352d501b1f8e7fb57ee172a92d78603b03522d86beb72ff75856de8b47f80612f791f995bc7a37ac86583f26d57062f6f175308dbbbf1e308f4fc7a08f833e55803cfca06b87c3f3e19cca977533e5f87180c13f7928d6894ed0c3da7da36f859c9a74bc39fdec746b4430d43384513ba29cfe909a28dd417e7c541cf0ef8d8a2a6338e7d050a976c97949b4663661da78e19ff968f14a199a075d7a91bb5fc292850f195709f26c3b809378d903ff89e30a7bc66dda908349506464d2cca06a31654781246fd8ed0c2a2714117ccc72cf4c8854e584f40570d25472276452f5a15a7c03f312ac553fd22f0bbbb31114bc1fd6167f749ca2098aed1101fa07eea396a4867b12fe9d9840bd389194f8efb8f54ac0ebb91bbbb5702f598e1b206714380f56c11229c9f623241ebda48e0681a7e6273bd8e472a23caa96e54b683410287f04a1959d5f41b452746707e80617319fae372cfa42d82ca77192c3e5209893e4bf018e5fe67fb1ddac9ccc67c74b4f8b61f46b99d460a3b13a69c23d4897283b0b53609647c2b24f93102bb6142f19a5aa890f37540214c0124492f9634ce878909702b3d3600188404af88640c01edf683eb91752fa8e4284ab0751da14fac4a430a532bd74e4be4979ae597f889d742944a0af8d46581f92ffeba5b645a0229c577f86204767397378cbb9b412f476fc64d7144cdef2e74f3cb63091e2f059521239966ac19e3add2d174b70cd80122c4fe6d46a31f333aac9ec2cc477661e00268a31cb650e5060cda3f59627943b7a5c09f8870616f44ddf18dc3711938e9f24fbc63366bc20809e025a84de953ed96140230cdd6e033299cb618aab5dba38e078753150774d0dd0722e92596c7f37b460aba0ea4400c3649086e18f70e7465d6bc609999b36be0f5770190879a6d2e24957de08193867a836ef1a70a181809e6945c0c68760695fa692441296445ab32e0897455893c64efeeb0cf5c763728204ee0f1264d9d8e067cab8f23919ecd1979f241d7e5c52aeceff07d7c271834266bad5d57c9ecf27c71eb3e76f49d205c5d21f225b8872c3ded7d623063cfe1cc89cb496ecd43b2a8ca50614e2b96ae103ed4d08dc87d4fa850d508369a18cbe8dde79dc69a38d88e8225c1e8622d68b8cdeace8e29e179ff06ec2fe52c230cf60815205f69fd12c8dce114550173fd1ff593f5b408af100007b5a13413d2902ba6efbcf49bd80ef100fea8f9dbd49056211b937b576c774f5df81f81891abf7c372e8e0291fdf379ecb0c4a32cccbf929f04205554c41d60dcf6965c38a8fb3f1cb06219096c23ce33686369e19e275de3407fa485b42e6d9b086e1fb83378e35b9832de1310f41a7da9388f4eee4c4d373382d933286deed0326a9dbd0e92cb175a54fe3f2ff1700ec05ee59d9e9edebe83eea96addf57e1a1f77cde0f8a6bdadfcf90ff6020bb8e50b29483dc7c2ac50aa68cbc7d9347fd821bd637e9b5c29c7b6f2974524c087cae2b7a9fc5bcdd0798f477d964c212ea4b81a17c576ad8adcba827abed50e76a860d64eee36b024db9006fdb7a23d1f0c434c7e236fc9e702e138c62516f8abfc36d730464f254ac31f19a9d1962ad165ca5a5c13a39146484cc231b4f599672d8dac27b817f2b52a6bdffead0fc4a6248035c4a5bbe7724877fbb5c14111d04f92e3bb430177c964f9fa274340a4d281914e619302f3726274dcfd0753d5edf11f7955450c151074a6e301e646a5905c4985d25ec30ce0b8071f528d3204d249cd3888cf039a69e09292f37ccb2b68bb96b6deeb51535d59a7345b8ed7ce467d9d34c7cc71dbe5b58364f1eb686a04842f1adb3f631c2310fcc3e84c9ec85ebeb387e4537bb57cbe87a017aec9be014400302886119c214fd7442c5ac7290011a1a9a68faf6b8de23b676254c95af168d3770e656f220105746bdf3422b1a3b7faf878aecd9dadb04686f9146ad30cc97d800d3d75232feaaddfd17f7d38e3b11dbb52efc7f91d451a33f9903a08dca2886f4cdd12e93f97d9eb556e359fcfe2deb16d61179ae0dab4b5bac83ae93d746754a7a0e613e09b0167c31bbf2bb048aa2d52d585c6d93cb5fa2584c69d4c29ec77c054860cf06e37fce1caff48b83e38164e3899595f147cbd8a9d74c5804a3e327fd8bdac0fc5cd8250faa0dc2740ceec93703f351dd44d7b62c135888053528913c04543a36017758255e1ffd03f36007e667d5a8c347ea2282400465635f23966b4ecbf8724aa122f6869e73cb744fe2a09d006c165668a2f38d3e5e23473d4ce60cdc78489286f80e59250e78d27ac84c6e65a3a5acb6c6555bc3b042e8c7cb76b5cb876912e92932ce50634f39870b728b5080b5b0c77d2e590a09169d6a6881fa0f63cfa7cba594c85e8ca4730aa21a4645e928011b7516d6e72da315d18e1b696fe99c13f6aee8f63d56bbf8743b8b9ced1011d4551c8bf6efce3501252eb4d40b623e8fb13f9c8a91f0dc54f3bdb1808b2374146d4a2c8e9e2a3bed0eef0f929d4ae2946b17062cce47e1e7a768eb218024e4ac4386aee75cbc8b99a0bf8578d617d6d45b06539d8ca13fc24ada4705e78bfc85bc2d81c23081d4e1845ce5eb27aed98ecba089079cac8c0ea75243841358fa7a2499ab2e2363432851b4b163d784d8f94c92a029751c0e5178f224bee0811030d2335330f20489f65abb55949f4af3846dac03dabb974710700e067c6e25cba34a144a5df68ddae5fa0016f89f81580b10d88ce90a9d43aa95c064052033d60f4cdcb2583074ed93e475e98f45997c5528875c809156614605503906e3b2defad2e6fef90065691a3bc7eb87a2c116d89195550c0b512afc1f0c2c64d883a692503f14ee5f44ddd0591180cb99349a41c254ab35f1ecb0340b3979ecd2db4c9e211c07310fb360dcf36c22e6910277274d39c2047be8acaa5918338967c557f976268a8b7a3e4e871c289f560718f54d0a57074ae49eca442b443d9af9f6c9324ea555e4260689cc198f15251af51276d70519f29d039f38766cdd9cee22a9084c929d0a26df89e132eea24ab74d07630c57f8819cabdb5beaf42cf0ade0aed9d7e399a97d08bb0c6a92af977c865fbc1968d79e392854a6003d7480270076dafdd5d591681ac092822fa9e51d60a269b9f92a1a9b46e267737668ac667dfe371da8fe3a0b4e91d4a3a6c29d1199e31ec6d419f0c8e6d2d029303f09741a21331fedf152b18ea7b55fc8993ac2443d254f6b52c1fc620b1a26b8af8ea0f7bd81a05ecbd10e40a2dbc4755f19740b358ff96e948e1e763b09dd991d09018a6a80aef4c34c74453480d0e94e85fbcd5db7fce5482819f40eb2666ef250d44ba023b9592691f1605d6fbc120ef2dbfbc7ab474c74891c9cd3975c152c66284b7a4ea96c2d114e5064a78dcc98e7458f791ab72817349754b357ecdaf97886766e57ced549421443469e1b511594db5912f1f9a79b01c2e924a6aeb9d711ff4c00bd0a8bd248c6750b37e3158270ffcbccdd52b15fa20c05fa07acf1022c24cb666945e176886bd808f1a246529ae7434a1512f4fcc46b78b2adf2de48ddc5a03b9e05b4fb31ae221987b9194bd56d14485648da54c5c06347b2ec705348f7b510257f1edc825e65438634a3bad71999d87770e7584e39dd6974fd8c00bbe8296eac9d31f3ae46e932cdefb74c619920d8d568653f88b0393ae7c8e78993a55e5b588546d602f894dfffb493332f65100f40a1ce798d7af47a70d668ecf2f4af58176ea9c6428970288851b18a7a3cf1df3f357708e7e4156f920bf40237c07ab669cda938eb09ade589cb4cb4011a19619c7dcea35a16f1c9f97248baee68836b9f16c617d6f28f7e52a071d19b4c0153df308ce8d41e968618ce218f35cbace79e83d8addaaacd0d05d9b6ed3b0db92f68ce6a2042636514305b216be4efc0f66bd3e0fb20c0ec34eaac4bac85a39f9f562ca0c956183d3924c83ecbe61b4d2b2e8b2ae22ffb07bd4122181c80d433d4622d63bc4f109824f5247083ef25c9567d50fa2dc37cfd4da87159ee38d11778d0dac515f21bbf3db3b424225ac6abc48ed54aeac945fc8bcf7b7714c8e42f4f8d719d1d12bc52cf2a8f574a9fd3dceec732c107a9e38cd18124dc044d7c1ce43980180f2cf416a7c1c7df68e38335600f68e56145b17e2b7ca30d5698743283edfc10ec1a2f69c31f605752e4ba66aa87403888e12d24d24aff41313a5ad42dbade0209a16eaec9ff23f458fb2b18dc32d58821a9191ae0a51e6235d1ca28f921db0488983f4fb0edbffb9c8cee7e2a6501ba3dff85acc48b70d9e4b19d5263847a3f693e423053718ee462477693444d86aff5b5992f277f6b9b4192095d316753163be0ada823a878ec9aa8dc57603e687021b68c0d1a0847d8783d3e4831693f7b8d3975daccf6c68f924c2ddbb48410ca1ea0c6ffac1e85d9056b79a478978f2cf6408a5ec3bd39274076d60b7d871ae60bab9472b1ae06c293b596df0c50be2fa8df23963fc61213dd2b7e1a7d63cf6ae6d611e17388300473072c2eac61c0554f781ea4f654dcfaf04b197255baa38a046b4a470a6de2bf00975298dd06149699cfa82491b3031a847111e8bca477a602b2f7eb846ac58ce76c5fff594917cf68599bca55d569d98201bb49f64059d840fa6fa6f76e525a0c32f278738417f0c42aeb61980ae4d52bb8a6900a40db7dedc8a1dabfb66326e0ac6e781449b767cf098f4e3440429b478e94c828d6c4482bd23cf5b13b6bc479f286f2b0e55a41670b977bf5f66832b6e4fdab7c53652e634e71c339dd4156593c7bd9d638f49d8338ad53f4e12533cd25a4085ace157759d1089d8606cb5567203442b7365fbbcd11ebb68a35234387406f2f06a1418020cf9f4b2a7547e81e579269c8fcbf952b90661c2b9f11fe6175a4b10806ba96c9f0e5db2cea9fd8a3600a9db55f0aafc68c1f3d0319f7588b3521a2d7e96513ed1611d7624f2db07950ea01c4608348f25503ca0634ed406663418cb10438cc8695220d68be05a1249ab111ec5d7785a3df24942c96bd70cb55da6e6f8ec65617c0fa5925ec007aaea849c1c52c8aa2ef22318953b8a24798e95a0f1deae7e4a84eb50f7ec080aa03744812c7d5d90a629aec1cacc86fffd4391d77543f92d1680d2feb5cfe2fa018c77c7527fda94e6722c058bf560d1b13b5e534d380509a2722063231ef780d828c14000058fa9c9fcf62cc16aa4014c857b9ebcd528b2f78a6fbfdb56a9e021789045fb1b9a490e9efabd56250ae99f3e983da93fd5dc3b0dfe6ec8c1bbfa513a4f078e35ae482bb7a632a1c509ab9bdafd2c8264b5acaf54da90aebd14006c41732f877f070cb9bf745e6347e2cc0d1f881427b9c6170389f1226d948c9d590ca8a694b2be32e18cbfd862b9d19fd0aa109a382736694f94799212e88f3895246e61ba9644c7377f2039cf078a005c7a8632773c3c00597106c6865e0474ffbb59752c1fdee0b0a23854c50766a0aeb63c59e06b6a3ac0a4e503d15299e570513914dc2f6ceef74d3df9192dddc14627113079d20a18e7035f833b09fc36eb8e5a56bdc9c3aa69e0db0e91ee88b834466e256e14f75646a363032332209f004809a7c93a8e979cb96430244cf0aaa853862127896a48732a1e972610dcfdff65764310fbdb901f60bbf429cdd7b864ef83c88f9f6e0a109aceaad9438a1790bb3605c40ca67ceca212c8464578e8486d199a15e564b7f66cf1d3bcc75721afccbff4b7293975482dce126950b4f6daeab97ca2fbd40bc07817ae1a9f49e5389e1d0db60199fa9280bb2f1623a9e0ab0b2263bd59fcd3e7c542e8a16483f9ebbcf4e466b58e4cab75364663c51515be76943493b435ce5f48073a1ca68fb2b03fa42dc436f20403dc76364043048e22274b8872c2953a9624cc17c2599b5d1eb8ae8946f180d9b041072b7b06777182f294795ea4634c0374b546888c0967da669e7e13f18d65ef08c962429a7fcbc4517b738a386a0d43dbdffc1f82df39c5f349dedd1bbe935c4cce90d452572eaa4e7449cf8bb077c0a49974467e09382577ec73046eef000cf07e4c55997094e4329db0a3b6bf150d28eae6c03df4d562c052c7bc3703d3f7fe58ff75e6a766d13970fce3464a090486f0bf3bf992668baee4af2c8b5fae8b47ea6afbee7b47a28336e8215a8709774d36c634c8516a7079900a2cde327bc0288dca17613d14483deeea82c7bab965542927f74abf08dd4b95211a27e87a9a7b403ea0f405252f9ce4d5462da6d4487a6fd94f83effbdbaf1871c47a1d0ed3dddc85aeb96949b3ab547fa74017a04370f771106441ad1200d5a8ff19220322fe0561f20365c2406b3e9603c387ce0e48700e54f492f7fd4e0f439270d2ba099f8224d49e15222e13f832ee80274be4cfd7050b2f403662690a9626fc499c3cc852f9f6f43a64441eac151d546df63c8a750c86cf40b75b75fa2c0db800a1561d4b1fa5a2fe4aff8c6a3392ef7a655f052f3b0b342eec61ee10820edfdeaed2014a37795edc0a829402f86930f499614a951b339d20729304d64c370de268b1f5421338e3d51c608317139cec98bef34ed17e4f6b7019a049c6773961e79959cb72c953176f812ad3ae77ede304dc73968ef8dd0393fa5e29ffacca0ef912bc710109fdb36ce2aaba257ba0b1d04073fa480aa7193ac7716d46ba72982eb74c90e602378633c9a4a45e16b194686bd1198089f6cebf0eaab7c9f380d5a3f74b579d8cef2c4596736e909e86f0bfc9566f80387fde8b594e05c400774012fe4c56e4c438420fc0ea4935a10f37b5b92abf5c17ea3b70248003f0e56b4da11a8b65223cfbdea1a27874e7437311198f874f4673b0727b44b78b2ed753f8809f3dfc37412bbed992215214aa0395494dfa6d79a84b146359cda9967d53cee4cb879fe86849305ee20c94b4680ef9d2e534b85d334bc40842e829fb74cdbd2e75f19664ad8c9adad731835dd43f47c313797f30cbb0450ee72583ceabf0a5ecca82d1bd8632888d4029245d4a8a5d1a2fc1fc2e7848e50074fe8c26339508ab99b652f4d8ed8f5cf898bfd8cdce8983d6c9406302b42c635d85846aaa70c1eef5bd2eb88c7a65aa9be90b5ee43902c8a5374935ccc117459ac0c766067b00145f64fbd41a70b1e80dec3663db394ae83b3f852765d56a90b6ea70e26eb3fee2b81f50655800bd55fa8a42f5282fecfc0602669b906e5cbbc9db9175d248034a09b6c64a2bf5b46e1821d49d818d601218db18ffffa0f1ac1846d99743581f1a7d24f171a7b00a6047c7ce0bea4d53c254622c60b3e5f9e7d36f783d4f81da4d4742e37a54f76c4d14054a73a3af48a85f2018347754ad8fd8bcdaa80e922c3c1eb42b9189012b965db922c51959d8cc103733adcb9958a8add6805a58e68de6662b357a125b08827c2d8a5e5ab7918d81b3ce558be8d6e78642a753caaab7e92ac095be396faff8502cd9eaa1712e07743e75aae8a987f6288f95dab4accc5d7de36a5e669d87421b27c6d6a8102232706753a0988419a7871703034232ed6f1f1d0204d90f2789cc35a44b268179ebfeb85323935f6c356cdce9e70730ef4e91476a617a90729055485749b8905b41e67678581d9c93179385367bb608e25a0906b98b990cfc54553c4e813d73306e78bc246a06d4270b97d07c22d89dd64fa363dc2118cc524005de70ddbe3e41200d5130e9ceebf767955e0e68465dfc9a4bb1e6940e57d88b29c00be5da9156f27015f79844244c0d721c97769d8e8997de489be18a07213a0d302159bd61228da0369a19891244e8162c73fe5865c01428b996da6dcc2bf87792bb3c66d078ce044769016f22138c0294e22a6b4bfbcd22e1767ac86d12a052156d1ab637c12cfaf864f7e073e0e377a1c8610b6cbfc8fa23a808c02ed877260c20b3745cac8b93190a372bef3c4981c7dbe460a7cbefd5d0d3cb405b7905fd7ed7d1c180f233f6ed371db8988f289f79502e98e127cbaa2db72fd3ac17ca9d610dbf39d4b99a024d6bea71d951f9a5ab611c38ca835a07e59de56902a9e0ad7b746f0c7d68e7d03ff047adb4b7ce1ef78115897287b6b5c37cd8ffb1abdf0ad3e4b3901dfcd765793a4d26c194c61f92817b7daf09a27f0ef12bc5c9f339ee93372830c21c78a71750cc1ed02b7508b6aea69b2d7433ea9483292ad2f622f061b98eb557b0d1f0733e985c4de496d9cd014dd7aae96888115d18bde19a8695c724332c83f3bef069adb09cdabfe03a388c15c19ef63fc1fe1c2de6f22e12ef1f229a623be17c5cdf90cd714a7d372aef3f6854909bd30f045be8d450078e0ccc8c38c59c30117d34ab1fb00b226219c262347ae56cec2cef95f10c1b57cfef132e731e2d30c8eac2e33ce6344aae44e1378f6ac220c604fc349b0e187e921c02aeb567d4fe78eee0e93f1c383297e915e4fbc04d70e6d78c0b2c0bd9108a70ed9ca5b1d779df928d44fd7e727145af4ca66b3d240c777dfab0ce712730a97e0e941b45238acce442263910ce2f302146b1cdaefc9c26f8e0b57da281c47486712b7db0c6016fe42ff41b28befccaaafbac76eb269e1dc64bbed3721e082a46d304cc526d8672da98995c19098435a7b81d92c4f175cca327260d696f3dcdb784584d1145a6d0213b2fbed6e237ec27703f5b1027c0158ecbe55bb4546907339cfabeeba1b8e237b3d1c79a7340a5581c4e45519d78f0b59f2765838cd260a320d99dd5caf089ee4d203e739556a2aa45e46694804fdef1a81c3ae4f35c093093027325f700c6352ac4b0251a1da971173c650ea1fa6a4d03e76f4122e70005dfff30e7e336740038244d178b4a88dd5aed4c513559ce27366bfae70d749d1e5507d069b976be1bed395b3bb9695fea02c361ab0ba6194e206ca3fe54034bf30267b46659521b7c1b8c41407ecb1b4439333ed93ab8b3b4a7156c691e27f70e05177c7259c51dd9f709b9d601d605b679c02547f3948435e1f50fd976f8d034081dd83dfa9250f537972a6f66e3880afc089c598b8cdaca86f0dfd2168478c140770851f08a415e7adeaa9761a37827e0880bfbc08312409552f2b6437371999eb696ac12d761de8980d8094af70a7bb111d7cee1d631362ca32c25deea066e9c558f860fe76afad15da0f65aeadcc910809cc44bf4d96bb35e66eae7e76ce4e438ad40b5828bd2b3e4436113ea5710a7ed84d13b1f50b412e094e1a7e451e645501f35d170131c6d08a80138111a7ef148d922aca478706a1d6ad1f0d5af71b1a6a8ee2ac5a1ba669457cfeee265fe0614d5932c5989ac6a402f580f7d1faf57593330ee9822910945ffa5c56e9783a0d659116d0532d66840aab1ca0d42707dd4c0832f7588a235f364ed021b86f3ed26b920ba3e49d3d64a63117bc92844519e4be4b8018eaaa1362dce74d1d8a069a40751d1a8e2589e41a931df901af7226ece97ea2ea5fab1c59a5b55a8932c3516fed7454564a7ab7e15b38477bc39994c273331cdb65b8d44ce86c51368c2727cba8c3591afa55ae5434bb7aec558f206e42d814d2d5d03fbd745af70cac3791ea1b63d8510020c10a9736b5208722dfe79eb4618722e4e1592a5a7e98ae0ee3038a1314d87114467348a14469f192ce135c7c50eb923051525420109f2cc66a20c4d805d9b5519348d1efb068724629f87f9ccff18a5cdb1301f43081ccdf213d6a34855ae8a2ff1742f77b882943f6f40086a10fb3fdba1ba6d71f4f6c070ebef15549a5b3173b358d474efcb8fe877bd86e56b0d9e7f951c212d05f00464371d41d0e2140edf12e5302f49b5f18ee7d33a490bc87bd552c6fecf34fda5270918e283631cd0373ab86d4bbe41c5700599aaa623c1767404d97027dda31d82e2b5aafc3d2fec312756df42db0a97c009f121d9ef7e990a1a809c10ca4645d5bfdbc779471fa89b407895ce0c043fdd252a9573871278947631185d41babe7daea1d719a0495d0d6fdd6df3bf407bb8192fe2dbd06d50fddef0953e8e8d2973c4a92bbf421fcfbbc7e75f621c7a4d65d21414980d2fc676600472da0935135cff09fd1ba32c4381828837f01fc5b53a907638333903a66b6a4c0344328365f5e715b5dca8be13f88a7548b7ebac077bc79f184eeb23ce2fc5ab57d17e8765d938a3e62e5bb27784e33d9fb8aa6c7119b41cfacfb397e8556ad8c52aa92e37e56eecd0ed9c22aeb830314433d821bfc71ee346483186d09e0f861f3998484d8e471ad5a1dbf75f7111f2199d88398388cb1d112d5494a111b81cce5a2c979fa8b52f6a4f04762cbb811febeaed9dcd9c1171c365579c739a72847227eb1a118f512de66d4fb21325a5da52a1cf918ed2b00e684094480163a6096b6280029e2bf1d62d227e6d9d1aa1b206df67136537e9c1ff8a44e95884eee61a16be86842b21ea83ea0faeea3b2f3f0ec7ac97f07913ec6ca7a6d15329d1516a5bb502041ce796e132a500c959eb7f0c3b1f828676cbae65000735a17f34535d46b2228dfca2770e7f307ecf7c0462470794a9072207ae1b093cb0a41fadeac7ca2f1df782587bbc4e2ebbdf3be30a678378e62fe1ebf183373b60acb6f73f31f71cde398becc13b122fa911c45f1681efb5ec3819afafba2b88ecddc8cd2598e721c9225142614a8d6a21ca0b41a549efc126ffc8eef81177efd47455f059df515e4f44defa7c8d36de918c3fbe14a1bcdc62f9e54bdd78c00f50575b19b21ba10830d584f2afc040676acba5a067f6c7dcf1201419fa2783ea54bd87a12fb089f0f72f57d3fefcfb9ad2fdd3f41aae3dabfce2d0272c3138319c5b5f317ab9fbc85059c9e9452e7fbe529c77a26165a6ae19fb1485b27dbd2c3823ee8aee8096b3d39cc3ca821a7088a646b205fe8dfb54f98f10daa53057d4931aa659f3d2dcc75aed8e8da5f275873fdc0c8b24c97688b9a640e62c1f6191dc31ac8b774ae0710544850dba078ea51f5d30b3c930c1d5f56a2af270c47b043948b77801b248aac8a0f7c7ce9a2bf041dc08b3756116df8965bb529fb20952090fb20120c63adb6bcbad15c53d9e72bfa4ebaf79e472bbc71e1052d0f3ffb295f42515c481311453be9d382f348f31a2ce4f004da0d14a050e27c9016c2e6f8751c8becc81437d32ca408d08da0134aa322543ea45bc8955007514fd5fcf3e57225380beb08f6f88429640afd7c5f462f4602b542573af97e832405d74a72bb5e226cb75efe4ec21b348f3576f365ecacebf0049f759ebb0bb029b42c60a8fa017931bc36282eebf496d9080f70cf61c4eeb92ab7196b3119ec59d010a66761c63902a0175ba88818383c62e58027d2de874a0fe07b63dd892773ba146ec10d4dae353434f7652b19ea901de7f9ded866c378cd96728a3f5f17f17e6df8bef3b0877d4363bc000da15744e89334b717abe1d1df21ccb9d8680597aa3529aa696e9dd6a907fca26132646b936525be6a24df22277c18a0d4c8e9df667c933dd9f9dad01daef978d60418cd1e26ac563b8e761e7ac8f74b04a8f5caf0d2c1186eca27155800540278787c0ee0b45deaada338cb0b4ebbb216b2a39e2ceccf9df75d6a117f03d582e876c0603f537f0f15b76dacb00ede9a53af65cd1574e43bdd24411b1072a563af96a3272811270d7facc61b20cd8f828fcd69bc67f19fab8d37faa3471661865567dd00d5109a0e72a82a391edef3c391954674f8386df964e536a0ea53b298422494882fbb5621be08ee339392eedfd48c474d5ff81e8c383da0aeecfcf00c59125fd9f569d01c34d39229e09dd91cf80fcb937d1f1e46ccb708b56cdfcd2e353f4daeaa2cead7a7445a4db193f8d34c176b770e354f58ef39549fb0fa798b0b633141452188c72ddf9e90e4a033b536c72ec20dc60a42b80b007eadd4414ada27d9264bd1957d391282b132241b34a0c556b80f4069ac04eb4c70c4435c0e4a5bd0c7ccf02a87317af6077aee5ccdc0057b34faa4b2f6ba04c36afdfd3b49e6b17b230586d66774ee11950ae643c0a89c17d30b244051105c671b21278e2d29266d071d03dfc5c34ead33929d069ccbb727d6a7a6e5cfcc8bd7ccfad4a06970a17953c96495724f3ea1fcdff2157ae610c81d2165ec145b03e4942fd7438f240becea4acf7cf811f92837d66cfeb9e2fa99ba980b8980fe36d9c5379f79a63c1cc32c7ec687df9586d5feb2e707fc613d39a108bda470820fb538225e57c00da93c7120c6015e67e187d8b78177771d20bfc7b7f8ae562c1163183f0be11bb031968bc1da419dd95807c06b0ab271737a912de04b056182ec58a39e9e030a16c5b5e5a9d31bba107f031a05dca2fc3ce57a063afca414ad1feaffed3517ebb2e988a6f90847a00170658dd166a2d66bd436b8c3d174929f9916fb1a752a9a3ee070605b2d4959bbc0969c5c5967f5af99d4f8b6470968b15049a48ab22aeca613b0952e8d8f84e3537c7d0259e71cbdaebb7447e8f2496bd4d4f34e34f1be8df5e8d93f126687193e580864278f6d17a532b85c23ee01606a28a91cbb08b1cfd7371fe89d60cb60e3409504326d6d6a676ebfa2a1ab3ef16d03d3b45143468965ef2490e8d5947a68b6f9fee05ba0bae97a212b388bf61d70ce67d2f4e0ebcbda205dbbc0b06a53a9eb3efa971054c100f5db761ab95d00863f82164ad74ebc05b45c9c614ace3ab89a51b722fbd41968dae4937489dcfec64b7ee035c4b32512f3e6249025f62a7ba67e47cd7808bd606895dee721049defc151f6934bbdfb245b3173d4427ed4371396c9fa18817aea27b9f90045ba10ec8d5d5510f42f7bf2c0d7de7f19eedba6cd4939f13be61a3c76a9c2bfa1749be5e381eddbb3cbae66a12dff3e6ea3b6f8f287ba1a187ea6fbb4084e7e5f0f78f3744d184837a1399ad3898b0147efde6a2025b0e72802e5c1b8c754134a12e6bef4ff1b839c956ce4c6e2ebff158066b46b2a0111e5a306b99c7760900f2b330df5f1a13e347765323452e73e77a306062a0dae4430406fea77549c97b4ed5016b889a7f083c1acbf0e8957fc2307c17aa741172ffb190d6e3d595e690b5c8267f236223d7cbc5f15c170e9ac76b4369a45acccbe86ecd0884bcc1e69a132b7ef72fab13942138f5f0c4846cf6aa6e13572fc7a49b8e89028d7b6a6230b4c4266fd5cac00d54cbbf73af6c88b05bf727b1db5bf4359dba3b568bb4da990c8152c001c316e578ae39fe4a947279fc6af1d984b86ca06614b4e0df544d02449c651018695b4fc00d5be4c0ce8a1ae5314a9c11774cf734054d5563568fd660feac5a7c21a109988ba4c694a468e4b62681df54f4695c739266571ad44efb585e1db6ba5987a2ece47a7b1c9b7c37b7e9e9d12dcda7a4f4622f8890733a8fe7aebef95ef2779243d2f4ab84d737cb9d7b0019e25070b5e9f99f45c4c90af58ff67d47bb2efd18183183935f63df8e0ef6f0d75cafe45cb0fa18d572f1283b14e50261d8d77cc7f9c6c222c907a0273a140d8b437d5cc9c1254326edbc93308b08d0d479e645eaa3b076b7e30dea06f65a879858ea2a5b50cede60a2d8a8723d1d5d7a25d71625cf0263908c200d1e038af055d36ac82e9f9597d63608a83e827cec074ead5f4c56628fa21220419b86686f47ae032ee3a6b3682643774f3ab7ec2a2ff1f5228669cd4e9f6d85c671b391c2f26caf97663fd1f0f14bbaf5f04641b59b65510eda2eaa4b65918c933776548726308e471f54bd6b523ae570fc991a1be13676ea113c6ddbb738cf94025af6286d3f20fab1150457390239875cd8aefa05b81ff0bc646db2831fe2be9af033eaf417fd6ba59d18d37c75d1c84fbaed28b780356fcb0cdae611b48f1b7895ea562669566aeb95f4b47fdbe798e633bf81723bc212f3c8ce0ecf197670b886324d6af183b80ee6f05b17b05e4fb95572314a6be37f65787cc22a1d4f4a999111c0d7804ad374d76671eff40e64a3505a5cf46b1e27a1b4e1608795df9c7c8b883b08fc0575b94edb3b0d52e4ede5f74ee2d1bae6588da290aed1f65f089b20ba71b2040865a3491418ed5ef3505010a318debf808f44716b5785585a43c2af9e42d9f00d5f057ca221fa1f68828cfc91c4a217c89f68e5add892088935020111ec369c5fbc9d5c3697f24da74bc87a7d2d43d0589acdb03244f7e5946e7e388ce9280961b6520c11d45692059fcd5d12298208af16a5da3497429bc8f259397de7d5ad08ac2b4f4853bf99d133af8f9c1d7602e510c5e922c54516fe66638399339675a608a9976f215fa5f5c243ef243ec2b1499bf99945bd067dd6871768a6f91c3c555b09c8841356add1c98d3aae261096fa0be9652b2381a58e82d4137e54cd9f691a51a204c2bd2d691e34cde1d2f75ad2ddc7d67025650b959f35317223d7063175603f9babd0de902eed5ae40a7edb93f83e2c7d8417edb8eee07f204a66a8d9ed61eda2733c78625cfbac5e7858421c52329f23a5b26cc0f4ad385f589dfce39446ad2f5d166c27bed8a5bb4548628119f850434d37dc2a6bf657b7f268abf4ff6c5d67bd7d5fba65c5e0f357bb1dbe052039c6b22162d5caaf33e4041a8df9ca6737d0846f14041e80a02a15efb411ef67fdeb14c324ef0080a23014e226524be130861a7a40cfac1e3af1b7777d99cb8789ad2f242b714b0af65d6899a7f921d8903b3c54909a289b1b34646fb71f6dd1b400daa02ed1725cd8ace3183b28da385b3b4763a9870c940aab1086bcf6d7a5ee4c1440bdd9d2bce2a6ac43c7b52ad1de6e25821fe95a20a00b11e6061cd80e9b8f4ad71ef352247c55e2660a6b7122343d7befb26f866d8904ea0a701d45295d65b0578de63cb3c012436c1d57ff8d7eccead11265522a837bbfc51cb7ecc093fcd6ddebbce5d4b2f0892af476dc5cce324e18944e4fa423412e93dbcb4924ea1e2c0372e2ba568517628f306c53be4efc059e04473599bb9a4b6c6cb47e493fea478c4d99b31017bdffa0f3418b415806ad6dbc580b6340440773a3211341dd596553e92244d555bee00108b17064bb536e251767abe0b91e6c57cabfe87711d95a88fca7fc207a87e747931120a63b891d81c16ad7bbe2b80d8d4c7d057d157783c4da3df8ded7fbe76afda386718fb47467863dc26d102c97b4842690f42808fe7f5c5f939a8921d09bbe39200b174b80126000bcc549300d08509bcd8fbf87425842607054d14168b093798532ff2f7cdb8d37324c98e34936639ed2a20edc7cb624f91382a759b150e012df97c70912f86c60f97550be07c43b07bec67bb70e3c5d13e53c081f0606f0e59a517610e9a5c82a78b8efe74579f7ab01411dec75cf77a03fd37087f08896712710506864d721e4048ac803ef65b50e4242136e78f7a0ead6f2b0bc426cf91290939891a44e4f0ac2bae0717927a8daa295d594291cc060692a73b681014b527fa6994428f4b73a3fa67cfc9dfd72708e923c7cc35a93b0cfefeb422d33fb9ffe165dff55284aa87ce35f183fcae8596da166de7507462a94e427027d9894fe21842f394b4d0bc04018c32e054cd9dd2711de97211ad120eaea76e3a4ae687d1594aea8fc19c0ef7d9dc3daa8776c87aef287002211440ca9773bcdf787d5b9614c28121c4e1d640c646c88df5ed01a47d033a54627559309c19a5038ddd570ae84b2d617ca11b5d9faad17995cd2d19c99b45cb72912344742fd74b32bdb8dc848954c08d3cc4a31d38b0c51d16cd0bde962fc458f0f0379f8ac3affbb86890b2f6d92cd9646fb9f796524a29534a0100072c0797074a143911d48414edc27cbaed72864f86cbb1b523a2684594aa60f55c138b2708d937a7cff7f970d2c0061c7fd474b8f8fc9673086101f78d7f69a68ccef90fb859dbeb02994f67969b03ed4813ce8476a44674f92e833a039ec1f71b41800917f00c9e1a115ccc65adc7086e479f32e6b610b42134191001c0d5e14b51c451158e3edfef7f06e5dde468a5f46badd775cdd01cb43ce5461c27ce28a5c7204ae9466837f3eecd74842824701faba267f2187837d3924540fa9d6a0648c933c638635c7269673926817bfbcdd0c8755609113b630ec225b97c70f960727fd5b97c7025a19dadce43675282e52e89dfb00c3b93a32215b859558301f7fc9f33bb17a4049ce306a679081f078e1a3550a87f9389e3ac13dcc9878cdc37ec6c83eb1edcbbeaa80c4ad67a9262dbd1d26c8af89c41c95ab4639caf553176ce12ee6b558fce4f0fec614e5d8ecc3e85a988290c39b1c2859eb22d9491cbb54e6fb2f735d57c6037f24fe78f4c3bee9d2570fdf3f3f54f2781b1c885cf9eea0b65bc9b7194b392b89916032e3a7972b90a279fef8cbcf24b2de31346b10d08388982517c3f78fdc6c7c9ce65202747ee1297819ab06e36aae1db583847639900bc81694aa68711c2d3d73b97fbf27895cc9f67543d38b41d966d8b8b119e620f4941281bf9db2b5c5f3b85d371a2224755691d2147f51328382b85abefac2d709f13b55a4ee4366494d6a9a180ea37b79fb60e0fbf6d8469aae0befab2630eb2c2f5fd58e8425692e6283dc96d9fcbfc905fca09a157eaf8f2e3495e7f1abd29e3284ba3c6b4014fb07f4ef8277f383d0c085d6e416f5569bbe0e6d387ef2fa594527adb16c0e799af862dca6a866917a63d6673339f73420821a5167bd865a53aaf0e3ea5934e9ba546f4a132179cfcf91f479f8beeb4d35ec0f5639cdbd0feb992c95e4934add64abbebe258bbaecd3eb5eca8cc6d707dac66f682b5d2969fb205b6cc444985bbbbcd45cd195f468f0f5f42e828293809bad06f98869382b3c48de5e27b9b85e3e7e4d760ef7f01b2860b21a594d2ddbaf3c0bde5dc9dda773f59fbd65d0af6b139a23fa2bf79b4dac7b0d1a6599b6bbb20f67a87751f0e77eaa053aa885a44aad665202644b9f1b92745a6641e28c743cf401bbe7cf9d28b52e060ce6592b16751e8810991cce0db2d389f1f6998c00d525e5d8d9452ca705d7efd444dbe93fb58a834e7c337c9d39437d97c59842b712847fdfc0cfbb885e1e0363c7b7fac630c7b6c9484ec3b83fea39f1bf3aaa582a358bcde7c19474913151cf572881745a386027444c03d7e2cb2f83b5870fe5926038eebfa11a4f2f9d992f020d1b147708aa4341e760852020fe0f003034d2c17b80fc7298ba778f5e5ede028e8411863ad55b214eb3e2cc7b1e3c26cd51e93b2be7cf840a49452ab1266f586ccfb44608a3740aff2adc43cce51d2fb4e5efdec2425dcc151300af7314bfe0d8e23871dd23bc9ea9da427397083a31c070e193814aafb81058e35998bb5647acd391d64f179e66bd5f51d26addb4f5c065aa56ee6f60aef13c1951f698880f3704872da48e390bec8cd901d5a5e041c78fa5804680862ba50c71077dab608e7cbe85087a3bcc59fe43b39c4eb5857038efe1be2900a17dfc2217efb88cfd4e11042ef1381e95ae8e9f04a3bad8d3cee6493baf379f36ae87b9a3646ee84da0eab050e7e10550e3ba077824f7f47f44ed0db644be99d6af84aef34ea1ff54b8fafb7b9df906d24359b1b61919bbd0e683ba8edc07444200b153e3cc1137ceacd67b7f1137a3e6a9880a3f84ff106486272e4ba3a4bc4f5f7d5de77fdecbe2eef6eca54dbd1edc5eb65ed4ef5e7737d79fb69ed8bd9f3216f3f7f77dcd928dc572f7f107b6d953b70d1bd30b69996e2be7a75c8972ce33287786d13ee7354ad51436a9777614f5f065ac231bfd609347604b55b743af4b55ae024fd20727bca05c1c9cfb21f7df6b673127d127d8e5652f7450d6696bb326c7efd8b2ba59502e17344ce8e889b439c8720a6dba7f9fc6d6d1427fafcdc9de87f5c74f99d3e9dfc73cef9414c97be0ef73ff90e8e923109360b771fe272885f210b93e9878582836fa570d0bb92d01964ad6b71ee8e7697eeda8e282577d7ececcdcccecececc50861a0a70d48c4986475f97d06ff8d27670bbbb77a45276f3b9eb7b512135655c624d8ee305ef8b6d648a22437802248414d010828086702468c85aa193cae2fd3c958aa954cc5a8e8ad50538461c958a02f7b50b6eea328203a957efa7b41d777c866e7719c82768a7fa8dcde5d9288e8adf47300d7c1b1fa79d27f11dd761c27d7d441bf119b08f4835e1bc8f64d16f80a1c180fbfeb6e25bae64a2b54a29e7db5c7777acbed7d701af7a0361f046387f8e1f8d60270bdfc2cf3cf871c8bd6cd7b176d54e07a473468792f5c3d084e02c5732ddd1fbd3e84b1de7b56eebae866980f039f81cc771dccfdfba475df6acd5686fb720a69b5d5e8dd651b07503340824aada130ee2708e1627b8fa9406de3edb8ab6cfb66eeb5a73d73e8376eb20845a8c316a9f49bb75524a29b5cfa6ddba39e79cb36a5170f62f156ba63c87d59239cdc344f43f1c973ef5b428b4d167d8c8f351afa67de661d8dbdc1edb675fb3793daa4bdfe6b6963d6b9b77da7ef4a7ec6deec8d361f37890aee631d358ef9b45977ee6f1205dde07892ef53ef8f180738344f8d90edc5a8e339964643afefbd4844641e0fc5dda20832cff4870610a6a4d70f2619452f2f0cc39614729a53427a7d65a2becb427f8abda137c3dc7735aade6699e8f893e1c163ec15d423acb8d11da9a0a552ba6f1674d071e241ea41b1f877344981a826fc0207846bf4a75842328a14412492081841146348c980d9145f64a25afb53bc6d66ada02da8fead552c9fd54c3b7bde86959b84fa607f44c2647d5748ff6bc669aa8d5c4eb5f9f3e10f35481faf47f540ffe989ef42a9ca165d1a4d0b2708c693da01721e7284755aed7e69f8d6c802e95c838560e3261323ad1c097bf862f7b27f840faf9fb89cdcde6f6d9f48816e0198a00a1bd7d20b41f9ac770c68fcc6338e36be88d5f43af90a62dbb1abe1288bffce95d835dfa9e5d0aa1bd34c6a85d2aa59435dba573ce396b4697524a29a555abe164075330c562798ee7b45acdd33c4c743f1c38342a5c5a86f1905ea5f4bd938f7ae7cb51dffa9707551e54310df3205da9030fd2a5cf8374a557439aa44b3d98621a98629af9dec1d909e92c59225c31cdb556f82509dcc1cc0cc2f42979d01b0caa18e1f3c4123e3148a9a6584104c959b022087313628918870cdd44515d8ed273f9b94074f9a7ce8d4338373e25124fd1eb98bff3d1b79963d56ae81aa8c7cf30dee87df46577c3f9a79ecf1e0dfa94d6d03476ccd3a97ffea969d3b8fc34aea6d9d00f3ffae8872fbbb8aeefebfa6eb558fd4455e904d27ff568ef9ad33b350fbfddc4514d5df301bf7aadea0a447da90a9a5775a37c97b146cd07ec213d4fdb21fd4e5505a2c29744577e05427efd01fe0482ba74975c5c5aae2b0b8a4d60341eadbad2fb6ca46e4366b3eb161290faf3499cd6a3d653f695877b3aa0fcbac9ed676b9aa921030d3f7008b243111cf789919add02cb5e557ef47d6a3e9a0b3717d6d0a3bea45e841e9ba1dc4649702a1f7eae8c32fa10d8abe8a94245295f1f3b666629b1c7bc0a230df87d1d35ff24bd3f76143f12bca28143c66b949c6f8f2a6db581f6c8feb38f7dec6c37e328ae96e2bc1e9b9e09e9abd960bd491f75bfbf3ecbf86b1682aefdcfe6ca4f7af2b1cf623724da40ad067b8adf3fad04727d7dec65778aff365cde293e6a7a34dcd834684bc8d8c519377a284731ebe242c60ed46a7219888a284054fcb080b0d023011b203ca03fe9cf243810fa1a13b8e61cd7fcc935cca77f67c7ee22878ad4e58b059d2be33210166eee37a4ef47a9ec4eddb4abede295bd7df9d4524ae94f6a69cd68841724126fc7f6befa5fbb0aa4e157efeb3fd553f5e073cd102964749b69fa2751d1a54f7fe8f2e52b94c1c7fe8b7c95b83e75c7c6b6d7b6d125126ffd21f14a132663cafab5a71a8f7e9a03d368d89fe4f30be9fbd5807944bc93fceb3fece36757373f62315e1475afc7e255515f3cc58fd1a3e128a638d9a9b351c6f1a7c8b97c21f44eedf940451a9402a1dff53377efe4030581b40e271f289407e4dd83a90cfe14a9eb452112af9026ea4ec8e84629e4bbbe9bd2f9a7f9b2fee509a1f1275ac5159edc1c9781aed0226a41b93468388a39470efdcc34f083cd3986cc972ca567b526707d92dd4942f9a81b7fca4883699808ec4db3dc2cdea9077f7f0d7b13fbf6a0cd8d9a0df2d923d236f8b747a4b97a3d2890e90181ee37f62f3a87609559fb1396fd6569f5319f359b61341cca1522fc217dfb351fce9fbdd3e5cfcce37451667e2ba46ba81e91869a0df1d96be8f1683e5d4f3f36b333e1ee57376cf6e839a410e2c3f81008fcf8727a5f730df03ffac78e88ec064206db0a41177ef4b9fed7ce851f8f8cea67f5a95673617f22126fbf90d19d9a0df3a947a4efc5de071feb3ef939f4e0ae0efeded7a5b0fbe40fe9ebe1e501b95870b9fbae875a8f2b564dc8e8ea60838c449a487ba71ef4e1530f4804e242fa0ae9eb5ec53af620eb2a54a14afc6a8522b7fe8cb6568e3399fe6bb40fd4a571ebfd6ac0d0a2c009e92be4150083e01318a3244cc936b48d567aece15ea4ed01993f3f7ead4ea4af7c2072484b5ac9d86d0889cdf5024d45f6942874458a9b24b3af105a455105ada70a0c528e66c00a40401204218aa0c11278859050156a41ed072f9781a22842143d3df8c0073b56e4e0033e60e1440d525d58e182155074012f034151a588279e3c19d276a070a2415105a794528a0497ea82265d20b90115445f98810e05210e81eac0d2c02e008a1f48501c815ed0388b27a25c4f4cd1b41c4071051450eef735947460015c4062034cc880e80750c082164cd8820e34246ac02990d06800d4c40e5013aa1c20564acb8155b076440c4a94586da18aca0b3dd082134f3027a62001b194c00a963bbedd97ce358b8a2ac7994cff28549137e55639ce64daa48d5a86d5adb50c62f5d2c938db7c61c759d14528d9c66eadabd5a503eb0aaeb2482f9d4b07ded8529ce97adfa3ee77e9f4a50367c5c16938a5e44cb43156ed6eacd2d56ab55aadec8b15b4eb8eb91fbb18eceeb642755557b5aeeaaaaeeaca73301ae1ac314e0d635199412cc65914b13a65b49062535a1c9c8a6385980a7bd345c87884c0581ea5488788eb7515bbc6b08e5f74d73786b51db30c6bbbbe5d5fefc2d1a6653db12db5a5b6d4684b6d5b4adb52d996f23e676da9ebffd99beb2feba665d5835cc613691d6d5ad6bafd308a39e76bf3b359a747b7ab884a0935d3f7925ed6ed4fefabb6da9fd6fb707839f4fdb49e55dfcbd37a98c67f7b02f759a19eeb6f85e00d86d0f4dfdbcf0a41af3815a7e2541ce87d30557184e00d670909b584868488848a84e08d0ebce139ae43759c87ea780fd5f9a13a2aaab3a23ad7bb354454e437a921c719bafeb3a7bfa7fe702ad3ea59a89eeb25a8375cca84f32855bfaaae389649e85b281e922a986bdb54ed430f997fe61d0b754fca5bf0e78b38a71ed88d43f78b43debe7d2890316584db97020064d855e3f6a9e049dc68d3e4f6f1d09962605e4a2e73fb56e0d1ed63410cde4cbf4d775c91869af311dc5a5183b97901e3241343c6f7c7210ecbacb68dae256e255db9d87f2d4e2e7c1932baf831ba528b1352f69fcbce851fa38b2fd3bdec70f63f972f5cf8325dfc5307e3f28591f65fc9890bffd4c58f2939b16dffa2333d8c9724b4d1bfb03d76e6541a73b26bea30c034fd315dc374fed279a9833f4cd32f499910d3c096ff3abb619a1c17709fed71a142b6c7a585d47d9914a34dc3023cc2e554ce1cdb43cae11cd5f654db233da9a2f3ca9b4578b36963e737abf5daa2e7c5211899b637504108d98a9bc1567787a44a2e719979601787693ad2e5ae77a30b7fbbde6917be77f642093fab9b545d3a19cf7c31c8d75ed3bcefcc062b99d0ff24934bc43430c5ad980608ee838169710eede1675a27ab8cc19229621a18f3b3fdc07d313fd7fb89c1baf08798a62f98d447d2b910bb3a3158325db8f02b4cebc2a75d96bad08a8b4915d3c4f002d2507311c747f0a7d5825b2b6a9e1ae21cf676cf90f749d5e521a9e21cd8e548448ff0de3d020f30961a3874d07003069a3c813254e26c8dddedce4518620d1c3a68b8a1c99312676b8c23881e9052042b56e1a811028e5543fcdcef7118810744506dc9f4c9ccd050800c4157a6c4d9daa1c054f2a125632aed602ae229191377279069c1ed7f1c6488a46efff38e2c9b61b57e16d2593a14d37021e57edc9a3183f2cb40555e804315231542ef494cb2ad8793bb176dba69e0a6e684d39a70d184c6e2ac402f037151055011d094211e920133e72021ad2e1729b290022184316a91b22e39daf6830d3bc2c80269c104490b212db2e0a2c59016575e4a3dc0b81411c363624775c78e2a693b4aa5d2cb0b915076221a9221aa1283f3a13b2a4450d1a19244868d1123460c1932a814c183b90c44851583ed8eca16665a2e0351f94200464204c0cecccccc04200054544806a029811a2d61c6e584002f5014c076b70516346c036dd1058d09c7001acf016c734104ee874cf34277376b29a8f3531d85240b9e2840535a37b002c950cfa6c48a34802ca470114016526800b42964c1458e4b0c3fd8bc23601d907d262e00086132b230636831b4c96871253bf550825184cb0b1e6bf2d96262658ea8091cccd4982072e2f6130dd9125115171fb8162236928ee59260a3225c1b0b46a3b285174be50b2d9910230cc9cbb585125b2c61b485936b0b285eb6c0628b2e5e708163e28247e38208958b265c7919880b250ce00add107ad088eb38843835d0888439b7612aca1329432da1272d564789034639699db4d65cd885653556db46713482de23ab6d45db88eb1147ea21b568352d2e49bce5898b94db5f1a2abd70070363b93fc63d8923711fef711d47e23955a26029221a8a42d45ad24982549de4a779ba085769239d2aea9b12304d3f37e98f9fb0ba7e87513a8c72d6582bf4ae93d60bcbb0cc66da36da46dc88d4e2528aa512f42eb5b8945c341e2f31a617304a2719ada66f1743469421037acbe8bed87d32357d4d26ee4e3231628c18d03bc6a96e3e2e84444d830a00c8887182f1c21403f352726921cd2e54c0a628388a1682ebefcb3751dc08a34db31976553a25ec228a26808a886214405358f7b3d7a7ac2e034df99992e432d01424f78b536630c5c8ed1ca448a158aecb40537ef01a784d820592ee76c76285c59218a39457aca810a5b4562c88b0a002c3302ccba4a4a4dc0049c9b9ec289e571298850097df72a5788316f961447f66b3fba104f2b3c9eeed305b7796c665d46dad06868d0dbb644f3e605cf87ebf0f381c42e61e04559b08af113444d6cfcccc2f98c619722f4aa6ed32d0155b38d3f8c30801c74058dc608113b128e27a6455147e1370f37ef58a9c2b866ee3f86460d507a13e6b23a043062b743f1999fb55a02b56f7534091ac8673c418bd8b693a219da5320d7b4f6edf5cffb622c80a245c769413d1355e6bf4bcd6e8419c2c7e36e218bb47eeb183b542df899135af35c6910560a9c471304619993699608d7b1dbd869f8d4ea70acc970f84cd851fa37ff4e2855568873536770bd1a59cbf519a6594d26d085c16ca951d89686b71817265f7b99421a1dbef3b4b7e9c67c775a478911b2c454452b0140db54f935590eac72748d53d58fa48e3f40d96220e622842415146d595cfddee104619a584deb2dd218c51ca28e59c94d64a6bbd2e0ccb322ccbacd5b46dd3b66d34e23812a905c625a6647a79010306060ce80d4376df4c8b8b8b8479818181de30f4e99491f94997bd1839c28d9fb91bc22c4edb8dc538351e7eebf519bd5e762d17eb1a63a458cb18638c315e355647710e6943f42bfdc20eb21cd56f83e8c575463995cb1f895a3307eb825ca2bb96cb8237b81f9fe1bfba2e749debe17aa0115d685d568fa37c1ce52f392f443dd7dfd48522ce21ff003c2824aebf30e2fa102f82b843f450c272fd5f885eaabc14b90d087198a6bf3bb89a5dc6ca84b227192b8769fcb91e4ee5e336e012b7013947e7f18b1e0a832cb62e4c01f7633f48e0be8c8af9dc0de7a04317c2c95cff275939973574b91e82c84e728b88b681c7086dc0c538b5e88db624744b8283ddc6c341d8852c1bb124ba50e331efcf95ab8b03cf3a73cf2084598c31da4e4a296536e79c7366db0e873dc56e22cec55359ad224f519deef9e64a68dbe134ed334cf37c5c37cbfeaaf56d6e0ffbd7d7d8ac8799e63ad9d7fe74bdcdd53c1dacc7a3e5661e26c4a3e556cffbe4c38fd0f6e5844dc9a66453b229d9946c4a36259b924dc9a66453b229e9d6e073e4d132ada031dffd9209dbf87ed982dddd18f6447086cf1b47f9fc81517ecd14336ac23b33196433c2c5e71ad3c5e0646de78ddbf89f3f7c92e87a4c108c42f95b2026089ee14f328267f8fcd1fc91b6e3862240c03c10319fc9cfe6befccb734c77826f7a9b1960ba13f44e1580f998ff01f3310f3fc6e34109f47ec4bcc9e3e1c5c73c0fa6998ac16138a394034ebea438077479e6fe16296e3fa909ee4839241d7823e6dd3eb38d1818e536feb7f6e4aad47d3139d73f26087847de473282c473fdb52f63917a6274be14e0dc2092e852d9e219f49d09c7c04d2e7da77f7992c533e8c3502370f0e98c113e4ba2db40e0014e4cc9b3279470e8777cb904dbc098245b7c63f4fc92c537ac03b477a2fd2799b8fc1c0bde18799367f318ce607545945cd85bed33edebaa6ef5b6f7c156d6f10c5b7d4dab3fb1ad075b0fec67dd0699804e16f0412645523f83fdac57b6934d9026cf50377fb35cd1aee54e1e7823c3e119feb5723c1f631c75e17e93e7fa536f54c4b170aebf8b142e429c833ec7e2581c8b63712cceb15cd6f5e758dc13b721e436e273e9f22b4b06bbafcbfb87b7e7db0faecd656d47ec11bd52a96b4df4ba996646ed5481f9f27f4c09a58c4deb8b17170a75fd633ffea7349998065a6056cd99948d28f098c964324138e1438fe398c62f0dbbaed61c6a40b3c08fe931ec2cf1fda30e35fe7e5d9a3fac149b12da2b9994524a29a59492091329a59473ce39ddbd5110b8ed88cc422dc64d4a399a734e8e524a296968a8d5da8eb82e221711295b5a5a5abc381487e68c9e94b30552d59f6149b8c400bc21553cc3bf56a9e2a44ae81bfe5fbe1ffc4faa7c7cf4309e20b82fbbc96eb801a99f21fb4fca90aa3143f61fbdfc268839202ba284d6c7ba224a7210d2595af033647f7545523fc3f52cbbf8a3dedcdc60dc0cb313c2829b1f009025fb4ccefa0367c9928508fb4cda1e609fd108bd5952bac91742ad63455ac0cdc08c808f26e0e305f4773022914168d3ce104208dbebe65f13df79603fff04dfe64e4f07e9d560b706bb0d868c9d995f70e7e0f454e18931cab952c1ee56150cc3b2ac0a916625752121db8ca892537dac042db94351d0f845b71524ec5ea56836612b55ee17ad66e5c965e6ba4ac64396dc2b3ab79fb3dd2fbae46eba1274e50964f6b467ed8569bcd457925821ba20e018c84acbca14b7f4c239f8ca1497e165a02b55442ad976c4ca10569238804ddd159c2b45a4b4b617cc5c018ac7ed05335225a14821b99241f28964d5cc2313c7486ade482cd3c84cc922b73648f5e313a4ead159f2e3d3c3b3e3d3a323a594524a0919fb225ce7873f9ca30a8185cbef2dce419f3d4a1030094a5cfeee89444871f93110bbc9f59f2ba770fe4c9f3883a6ca513e7be49c43456e26d19432b1cca239147596fcf8f4f0ecf8f4509d68adb5d65a3b75965cfffa73f5f05c7f8ceef85cffacc7514e752815a25528116d5128540a1da24235e38a13638c6d336badb5b5935c7f8cc733987324eee838ca2bceb5a5b69d4d67c3d98c6c48b69c2dc534fead718c31c65857354a6d55566d52a154214779659d6bc9f5f7eb075e3c3b97cfd5a363d91972c48ca4ae229b5d4547aebf86e1f8968237d77f74618946ae3f9762522491a037a96e5711d3f86b35d8bd309694ebef430e3121ec49c4a2602d4739c6b23612e14dedc8c22ecb21d2a0eb5f52d5979fabe7fac3247154b6e4fac7fc38ca331ea6f12f653c377d73737373737373c343b2b0d3248be34ca6ff8c27e3c9783e548ddb375763b0db3c8aa9a8a8a86816b5273116c6c258180b63612c8cb54d5b54f453a42a5a15b18a848a56abd56ab5eaae5d2cec4601a376a8b4eed535316534020040d000a315000020140c090443b15012079222c90714000c75923e6e5a3694c843591003314831648c21c4004300060064664a9b14a903b092b1d9fd5a11771a38b686b0f5e834134dc0f9b68878a0f98bb441e058644985f24af318dff28af51d957e5e1dc45ff7ebfa69d193ff70c057be8653e551f3c5ceb2a3ca93a657e5f3fce3abd46a49f37e73c8d4ac268372443dc108e8836db83ca33c8b400b21783cd477ae077e4aa3a09501e46eee41194e67a383bdf2b0f384dbe0b3788de1b2c2d0b58732246544030b21b372b4699eb989c6f8b989ac45c53859f4944f6da1e67fd8341b4b063962500ad04789e7a4c1bd1280179a4efa049f4e35799662c0d2d698df610894d6cea500acd43272c7da752ef652f90306c9288f5e6ed402d27c47df830f51567a14fbf4f262a9581df6965fde82d6b6556abb9cf4338ec4da19007b41be4afa7f7bbc6891a0530e6eb4f9fb137ad5792e0a103e6ca5e21285c7613c543350389cf3b010123b349107ada58f4ec0834fb130c2e004f8630c02b314824018d822cd5564befebb1f9928231629939bfc50580492f97619d2231f7434f1e26650de1311e254848ba0dccdbc422f2fe69f23477ea839789a09681c805378286b6aab747fbbd2aea81f2b4a356bb25e7915e49fdbde58dc3504cf471d59a94607954c00071d213e46e8cb1e005d99b7629be55daa8416f4d40657e18ccc409ffd79ba0ffa9254810f36e4f3e70b5cb4441be63e1df9105d85712e1efe0f2a6087a39f7261b0c079b0fc2262a3e513882e6cb4532a179d2151e50a4c605b0103e76c3f5c3f9586335a9758ae1c46abe902a30f9f7fc8023d39c9edf80098511ddc918b7d1820791cda76f78e2e6eadc25852a384d218f357a05ce3c545a5d5363c4884ac79ade7659a77e1fba2e64da6ff509b5c4e41f29b838a248f8d8f3f29fd6bf104b278ebbd4cda6a495b5d2d2fb02fcb48c144726c8df381b2d78f6f3c7f1ddcf208872ab99fc643c5b76de5b8f119ffde6c15dde9812284f404fb807562b909547da2a14f63afb8acac00314a006ad45f51b31666e4bedb11e41701d4ac413bceed7cb2f8834ed801f05adee8aeb7fea880b8a327e719385778e3475337fb94f0476a5d1aa7acdb32ff507a21c2dcb59f293b029707d14a314887a5d907e71e7a4b1d559ce91e8a6f29e0f22814d7a0dd6dda3b6a803e22ff750a4b41515c5c834be080a28d8851e2bd8f8ac41008a8cc1c598a582d833bd05627180693670544f9d5fc0819a7fd18484a0888ace92c29965d5b80eaef8a2919273f1305a1df1d7c432d889f8dee0e2a284d30e8c7d8db5355fbda87a49b0aa47c0b2de761ad9260b192ca517ea0c5ce4b5349a1bf1213ea2d3e422884005271ce6b8c16ef5188e4e072fbf74af465657312c4c11ee88a18da5c77eca9e48cc5ee6dcbcf70e2ee982818119b7ab7cd2c3cfba8eb9caeb70a37b59eb18f12fae6b4cb30d555cf77267904104c754bf9e0c9feeec604a68af97be164e3ac239931a60ac6ebed9900d1f2e724aa62ea7a11c1c8662e73289ad0a08031d5bfe6cae04d2ee9245a0aea7e6dc1d4dcfd6e76f817a18a91a64adce09a2d5264bcca315f75e8d2e6e36c3dff85b7356111cb7966321373f587235f589bf733ed63605579d477d5a7ed63ae56f37cffef5b0c4ccf6a94af21235d4d4a6c1582a29b7b64353745d49aa964982e831a4e4295d83b52f10767d73ac398530fa84828134f5f88e677e31d06e4746935d04ff4434b81dac789287ad0aa74511d7cb848bd4d3252a7be90fbe04cfc3cb8a4734f1069d4ad527504dc03862e7721e04f631c309f9dc9ffe693271de31e261d48a1fffeb55652c1fbbfe0d6d018aeb890076e3fddf58038d8032caa74506fdf6df1261352642634401633ba51631c42f4490882a18cee90e7568c949e4b69db8c11ca17fb3d1d8d1234bb5487fe8fd10c12c851510916a061b2ab1d83d1849309bc21ab03add91d41af2e9409cfe52f801342cbad36e480bdb3f5376b52b302117fcca77acf0a70f1c35186bb4e71e518b90907442b877abb9aa4ec014e8e402112115424e1d8d6fa18394942ea8a8895a8ab192e6cf42e676595fee125959410013932cad58c8579a31b819c7566ebc6f2b0b5108a06bd0c2b844aa9559b8916625d67f16dd45b8f95295c6b39e35b5ccb16600ff37142037a1d410b91a1373d9bd3b1ef1d19168a68aef800c4db9087db5e29428bcf5196a63d1e629b43303878679b4539d9e625ac6eda4bcc64dbbe8bb75c979d7d5d1355e0584ed959c0b77b1db851e1c9b78e6126be00a2754cac930072dcd3e93321eafab4a81d3db24ddfb782a7da92d528542f0c6489544013fd42a18f48c0e53b5de050ea2f71e5a447abd6acef35ecb27002a1d5c1fee64751e380bbfd5147083c62c8ca37c79ea92a4c3cdd44ed2babfb27a1451ed1944a2b726e70a545e2f64db9cb5b910a2a795205622bc2a7a57e804c81867a210da3b41b44ba28ce6a61b10b761da4a15364fd491daf0a51fc2737b9a4dc61741a6699ad4eb210345f9def679b9a265965467edec00aa1f88abcc5bb010befff2fa7edb74b4e21b6e070362e8660b003c0da24f8b38aa0e188d7aa94ccab8138b3d18cecb8b434eecade854a993c200fe2dc8498d0a01272e50d22684ac96c6804a3d360eb99926ba8b84e6004f7c5b80253f208b8efec434e27e0ceb28ec2ac177adf180e97f012617b3b4a3ea761fdb20f2b46533862a6f81c523e6fcb67974778e9ce3575e6cfb6f799434d5f43b4366972bf7168eb5fe3e7f7189d5a19fd09e845a5ef18d0071e5c9e6a701ad6a903ad81c971c14bbbdd4ecf865e39be4cd977cfd3b2e7a34d182faf8fa3e3eea9a27cfc465a379e8d48a5e803498a07de3d29c72fe4a1b1e33e70d1cd8578a5fed9bd9dd0abe82bce9b3acdd2a62eec59538759d2d4d1de4cfd578d9b69c4bb1fe79204f1777203f60668f9531c45e0ff6bfd4e7a78d7d50be333e0802dbc6e3190d022749a302e6ad29e05f602f2774f8724914c27071ae18022b911c56e983816f678987031eac6c8ca88d3573b205b2ca8dcf070b970fe2b86270cae91ab87f76aae67b6d3814eec95cb7fa555239c5279c61478724ce42a22b539df96afa4ff386ddbb661a472f85a87a391b45062f91d17ac291c0b796de0a14bef33cba38b8bed3ac4415948ee65e6aee949071951d2d9e533e9ab93cf2aa2e8059475809b42370f1e1c89a34719e7d8fa7bd6eba915a9c2e4489ab2d1a7f34321c8174674e1439ffd3a5899eaa82357f3a0034785040b1fe6285010e67605187173db5670c2de1cad9959c0508836c1f414f85b3f7360c8182c5f32b51c1d3f8eb3a76dd301014341a6ec768a8266d700c0106342edcfdc6df43449daab9c8e4c1428ba776e0a6a0e45d8ab2ce147bc0bb39dcab4e52da072e14364fea893743e828d311155cba5004dff13d4e5b3ad3d68232eb47b93f4549e3527d9cc0ba76c2da3e11bff3f646d7e98ff06d0f885ad9833745fe45165c0fb0c09c12172a4a532cf054a2405d4fce8c411823a51c0130f771d5ee28e0e5f2fb36c976541719019cdf1d85d1bee02648ca39daf918a685be79ea2bee01867c7c5da73ecba8ca3107850ddc693e15b10c9656d1ccfec345d371c66362ed70908aa1fcac7f9d838e5ef50720ecf9f28a55fe3e895bbbc2351291a20cc546b5c40119c464fe11c3761e0404aebd5785d614b8a5ba1f6d2dc8d189d4a7b0a54dee8b73268a40ed82ab0f6bc36a6ad85bfe2e8c1934325b50b2e00709a576a1c6d1f3d14a2db6a98acc621417fb2023c332f7966238900256df1d2590e33bb47fdbbbc786fc0d1887a9d87b14639ba7794aaa42b802a09d6600ab0f8f6eeb97521b7b9ec0dd5a09c5c781da34f18fb3eb3ce8373fe7476f385e5c8db826795c145399ab09829a7d6f1329144140d043340b73faee85c52b082d688a565160b4d0635be7132b0579a8bf0dbc6ccae47062da5ef41b6ca5ac68da6b32f775a71ba755be89d5e0ff95e1b5779b9cc8d581366692c70c0e32dfa3f0e29be68f6d0b6f9d37a375a7a8881d29c36f67f74190d20d38230f413e2011cefa68e91249c2b08181c0407d91e35ba909632ed23e3a1758bfeb6ecf690f0280ec99da1cdeefc58966bc8033fd74dc456483eebc3965d0da285c003f7c284d6b6a0055ae79a04a0d662ede1097b3a2e75fb1d59b0449bbb9e294d77601ea71982c97e2e0d793e52abbf2e27a7ca43f7a8125071dfd5b559d4a3d2c12cd1851fe5b642d5456ac38ae618a3b9e81d3607e8067a0733a1ef9e37e841893f39922195746b98bd40f3b33bef4bba90477a75e4792d3a4aedc6757ecab6029af36200636655d52e1d1300ccb500fd5d906189c94a76fe670ad6d895284b3691f5dd9b89cd66fee3653b5c1e4288715b5fdd4f8f5f0314036616dfdef38191e6d99193c7be7b657aa43fffbaa75358393c6d7cc471f06e3cf328e3f45a6e5d72af4d521f24bb8d56684e97b15e43839918d15fe96dad39c62976783e213fe9bbddf3295d886a745e07ac61d0790243ee36eecbb001e6c9f849b248afa5c90f1c7b1c8704d87a6749bb0b489861d6e298ebdc05f1ef206e173486c91eb22f50367c4e73c2ebcfd33dab65d39a190da46af904f2e31da85800678cdff3b154262c892013fd7fd0c20a5266df384d09b5e759b243340cd3736c70770cac0a5de6b3a967137cbde11ca979b68c75221388a0ba44c724b59bc86e34eefe85a5bf23bb862065db2e8946c8811a414f0e62d094d7386fabafea02245302770d85b9cf2b6af00adcf398c17b288639dba5b7bb2caf0d6e884e5aff842d92c02cd2fb8899ce68a147de28587370a39f51e10f6f012609e56f6c40b914f67b8dc08bcf295378291c9ab28c3e1547fe2d7ced6122965bfeac19f7677dbed02c1e0acd610a028e0cb19eb0d6b654ca52da2470b917a1cbaff3c49496be8ce22ebf3ec41e2edb9516e7af000675f371bf58567451d2c464707fd857f94f693122b87f1c2b2e66bf10c0364710c148fa836b02ea160dfd18c345973868afcc178b94b4ab6f18ba4e35f8b27ebd2155fc9c3b2fc80b46765009076f40359cdd094ad05a8463f6de9a4fdaecb301d9e40d8d7e9bac4422607b3b5b18663de8ae2da450cf08c0b66154b3875f8198ba078c0fb635bb60c14e202912f17be41eeb129d7de748ef76a680b398e24569d139bc9efe3d9c75e5c90b4a089f6dbc63687d476a0841ba736e44f5c131bbb704be5383e4bfcaca2ef1c65e3ad0a238834c8022d88606b99f2002f762f43f136b48dfc27d43c066f0d6f5ab73d6c6f13c776777905c96ca947d52f7569f28a0f39126e11a882cabc2dce0c2c3832dbece97249c24bc3c22f45ba34e295fc4265dec9364ed07756fb9e2918b5871f32c1dd773cb6c810538818421e267b7c4af4f0183b1f5195da4622ab2d5272a65c1a111140b0dd996e34293ffa259346a57c901604c5a136a36fda56292dbe1f39a03c8bb4d0add55f094cb83e075494cc43e2a548c34ef94c3dc25ac5bc5fe1090348c0352e9fdee3b4285b4e02eaa78715a848420768bde746fec22d540ff0d464b059b8f625a1401a2bb49011ff001c84abd9f812e3d4dd5fad76c9e56608396d0775970a1e115d2b5925655c4751e662847e8bb4612e1e504f1281cb7c7cdfb5023305218bb04ea36d8a789fde8b68e5974878201c21b4165790aedb2d3bc802245de229d94897ef8e4373c6094ad4f171dee517d6c4e4e91dd3f5d16c0ea8014f3fbe5168cfc013c49aa5f9a93f13a6595497fb7aa14901240a3a054a600a8e9405dddc019029fc748d935871452746be5002c0b4532d7b6ee254fef4f56725589fb0eedb7e710fb710415b2bd63419e7a47a42208300120c3ed32dfd25d18e3de87b55d825e0705782b5001ebb054deb938841a029c5f1880109c505ac15756e2be77f748e4025c93070f318bd5b1541997b448050499d9befdd5444aa0da937a1d5fdbd98196f911e27a75a4a09eec911f8f7fb2606ea234e46dc94f26b4f77dff34ddd193c72d55c7a48fd030cd85e4632224a318eff2c2b8eddf6a62f14516fbc53adada70d7a501769eb4d32c87f1d8f2cdc1131d1c6699621477a7a5c28a9c15988ebf532388cabab1a6b8403161104a0fdd790c5d6dc817f2f27a9705d2aa6fc57754d7edfb31986619e8214bbdac279aa5914240453917b7289ee175bcbefeaa5eca40f1fa50a00c590ef907eb01d8eccbbae53637bbf099625ca3ffdc7f6c21ab1a0f9dbba1e56878f92276d1159231122434754dda8459cb496b7a27ac159fa2e1e6692045f2a6169467b4c6c414b6207218892fc344617201f08bf0d5fdbba7003de7891bceb0e13f51eff0c33fa7fa48a0db259ed5cc693589f5aae2d165ad4ae5b9f1575ed65295bcde5f7809f186a46a286b123dbca5beaec485982ba91d8858ecf17c3002a9a748f210f6aa8f0ef72a0d69f4e7e24605c321109a178e0a8045d729f660d0497d2df369796c549ed40be7ac18614659151a2541441b829a88fa8f7256a0f796751225516a394a09800540e5b35d97f811ef139353bf8c6dc2142aa82a43e02de74ba17ccdc5a18136ed632cac4af45cc17c5efef27be1cbef252fbf1776b5417198688eb6b353e3153165d6045ea84b70ae918240f01ff80f4eb6f1dcccce5c4fb4ffbc957d951da9f42fa004a6f989b00a6dc97915d7fd9cc7d9ad489d0f226f2f6c5018f916330c736672bb0257879be30d309b925169f62409cc733d33e424b45747163f8356ae4aa3893e2aae482a72fe2ef1f58c0c84b9c9204cec7538765f108dda79ae6adaacd8c338e7360a9f927f8fa2945566c34717b3412e1d840fc9ffdb6cd914cea6177c69a00633cbb7f7ddd055ac6f6fdc77edf0989ebeb4673917b33b7163cf86e3042d7437463e562f890275d5712a8ebafdcea1fd7baa5972122d676980a44fc4a0534c1f1b20ba99918e259294b0d7b18d3460595960b2e23f3ece61cf1f7b7587cc201e2a7072551ff8a78f3a783aef8464c6818a3acec0903aa7af6daa8c347e2f8267279b8b2134c21dbd87eada313a3070853a20868593c0851d0df244d852016669c1e256f969faa6cb904345160e8612e582dce56445218019b97a6f47f1386c7f9eff72f9bf47985d110c6e29b1fa7b0738383f8687a3054fef46cc532904f0e73ca578af51272f94e73d52bcc6c84300c42a53e69a3716f05c07654946a9308391cbe07457e56e21c71bdb15134622c9304944a5c42a01a344516796b919f6344b568fe0091e77c10b896d2074487e1e0512427bc330938ac2a7c4fc290059d953115a1a0331a17dd802de590ed6ccab55101ad47a6426a528e9f0ccac1bd79fa97009d2a91f7d33db16dfc25b78399448b8f9c74a496589ac4a11c4afe31ee91a047c41d856e0c2b5dbecb0d282739c403c3b26c9932a614818d8460d30ef20091b30397ebd59df3da5ae46d1ef6023570bcde4faf038b9dced1150fdf91f1cdb3a4ea38d854f1ee6a2533e8d59741c5d6440b58c1019ff292cb4398c5230923da33ae595671d23f53e2116c8513ed83a9660274308167e546ba95c4d584758674911a928c77e5345b3b0b0a1ea7cab28c8a740df908da7f35a2f05486a0238097fdadaf1c0db2aa450b9d2550968a4f17294d3c5420f1a2b7fe6a8c2b02c2481678b943874a440ab48aa9d525258b4495d5b25a52d4914ca892c0eac57410d2c222df8e421c79e38d0845c44e0de30c8a5a3d021f147f96b1b840ec98f4755ce4a50c047952341061d814fc8ff0b653982972cb4b61361829a2a4d1c4a03567831242ed4150d8d6b077c9e45f029e10a987625b566d8ac4ad4da835f5e0faf62a3be16c094691059ac7054560f606cc69aa2d4030efa317adb9d890e3e058e1347238fc9ad5d8d218963be2f9b743d6c5595aa1402b27ba9f0a756609720ceedb307709fad1ff75915aab8daaabbd6ad13ebaafbb51d5af3d61d535e718e97d6dba4f23da855b1540452b6724ba8607f99d7d65827de99f9d2004b959674592834a33ba319bd5febded813367b452df59214e1002aedc10cfd826284d4cfe487918c62bb3c7b0243df6a5cc3c938fe2c507c588b6158d85171bbfac6661a6441026c4975a0ccc5110f6a41a4c5d1803fa6684b1f7967270315c6b364242b982e6c8c777a157fecc941ae7b06d167988c2d261aa7b1be016951526ee75d3e98161fa8fa707891c8d642a4ce60b08f2111ed296d3948c36555b4511f4930124519a686076d3edfbd1ef32f0e7d2acb07e1b056266c69676d39604afacd03841bacb5d2dcba3016ebff227d2ba132ae212b51db6011e4d1d805f6964f86f7b102e55c66975e97f2b510bb3ed49efbafc6ab2de100cbdd0eac8bf03cf4d53e3c38510f9e12225e0b0c4dfec0c5e8297a869ea3a7e9dfaf5351dbc7866ae35aec60dbce1d36aae7081852b816ec6e30e9565d425f67b479dd6b84f74b78357ecd7885d5870c8ff9fdd2ec857f835b4e880eddfc89ebf220a55c4a401683c2ca89020a53e617aa4ca752e028e87ccb552c33a2eec2e053d3e7ca181204fbf761d3539e356e55f1a11b6e8d7d15f43f0eaf81028d0e81641f70624aae4791f892713d34045599fd8df4fefca7eaa2b908a9cdc17a657bfda2fe428a18e94df496dea497e94dfe9fde44d46df564ba1b25dd58fc2c1280b170a9197a1681aebfe3afbfb8d19a6536081641f3c3fb9809f8f483fd03c59a19189149a6907e4ace85aac47f868300141e3b45741a5090a695c6e60979049e8406a4752517217b859177c9493f02975bf3f422fcfef66d1308921a11dc1fbc08c6042316c5c04c8efdebea39c22cd8a01f326cbbd8403f224474ab9e787b4f29e19280374ae055a062a532318714a5c41d1021b24481197e81071b910858114a4aae4fa4e5350cae4cb35b92be83bfd8789ec635761c020b0d82b81c146f35304da92f041d97c6896873ac60bd3aacdcd4119f1e60793da7f6d58df01869b94c578de763d04bf42ae0b511ffedf5ca6bdaa699de84180d3a93e6ca172ed67d725c2868ec7802db018d79808615d8684dbda7d7215332659a50c50e02fd8ec51cc0ecf2111bca22037f246005d575ccd91965ead99c87f356f388de36e3377c9035441acb18de06fad520a13d4876188fa204204dc40d76a473d0c12b5eae81e920fd8cdc8f64e03f81bf32d9dcff1ca92046d31aeaaf2964a3e02d7eb1114435afe5d68ef73e888a639241d08c031a2b89862307013971a4a7b0f77f519953855403faf2bf4124c7ca481dc21e54065d6d2689cf4152d4123f383d49a5877144f2feb72bdac651ec5b1f7e849d7cf70c1e94456bc3428c5079156ae82f8741d4d401914908111acb360d62c040666258c64de65e357af60476dc004fada46872b39c5a8a120c767c4abdd1cdf0014f9dd2c6bbfebdbe5d99b1b99473a76fc783ed75f0012f76764465aff676464e49d6bc74cc5117d6ddfc0cf46d940ee77d78bee1afa8b6c3a38c5dda8209d6cfd0094bd32dbd3b6b4019687a0c470bb37683dfc874618f5b62550e369c58a5861e1a3ee3c48f84e3d90499e8fcefe7252fea055774256326fb96cdcfe5a09564256bac0b565e94bcf9757d5f5a00553a5e526591dc83a3b1b18fd8a51f92f1b4a4c11f4f2d2f95ace0e222b34cdebf1b661510216a951f58af7968463d61aeacf9c9178c7bf3499e52a989009dc40bc5ef5e381095dd9df7220fc48e0117bd130c6e2ad8ce160656f57164c0192e67d216faad92d54bb9806245d4384cecfa879c8874d7a2114c03f5400603c7ddb5913b75f90067df884e75d1402a4e383f0c0d949a1e9e8b95414225a1dd8bbee9b1a753792309aaacbc64ab0f11e994f620aedaf6e7dd59adc8bddde025758178a856968b941e7efbc9dabca1b8697d73dbc24fa76658bb4d879a75917e35653848f2fdf0921a7e0d6b23e5e58e43ea0893ae69d39b2c2010d0ca18c323f8d42e81df0a9073b98ab6edfff41ac1004b5facf63def9be00d02bd833b5a909ea33a19756c4aeeb223cc5aacf9599c3b9fa71811fdae11c7476343c039e97030a8bda3327afcaddba37cdf7391a0f523a550753b2892863cc9bc64df0735b6e0b810ff5668a3e866827256688b299c6b403741c6c698f7b23296ff4bb78bb74bf1306c219a0f1d94e06053fd2a38b995fd89c1227dcc8f8f6197024ed59bc6d94ac0bf2c2bda06b7559e2de8deaabe39c80cb6cfb62d59686854ee6c01ba8c085483b3a424c5befa086c14fcbf105dbf5220ad211e9c9cf7a3ee0809bb84629b2ca7c21fad687bc6d8bd5666fe7a6f2a78a70b5e7f7ca6f40102a3923bc88ae1301d83287eb4f9aa5f707e238aec0e1f65fad97d7d935b3572808da4f9279ae88ecd6f9f5525ff22396b87baaa0670b592e038a857daa66a9e018d121ddd6730753b5e981219e892d18192b09f7f3f008d1d9290298713797227706631d29a0053748c1812a654bb406d3c56e7528a8d0bbb033de2d690a74637bbe6923e6fe88bdaa5c0680104b342aa97c1ec4e0ca62cb2054d8083d6fdd6c32de961e33ab4846bdbac4f25edc11d73111595d5eb248a38a5857576479599bc4df8cc4a8de05a797dcc7fdb10bd663243c247d1ad13a51980ba9da5fe49ae873b680674dd8e0841d20c20aa0760c4a93e183a7827829621c22bd2bd1c5bf25a6c62f50b338b0e5f786e97e7d2702acf441c31c114fa2fcb994967e8979a8d4e9aa3a3cee1b0fb5448e6048270a964c3b303fc7dddc99a0b6e1c0922de452329e2a270589153d51f06f870fe0b3e95b076349838e93b9bc1c06480c61b90364cef633736638b7cebc9a71bf8f073058d103fa9a08797e6d7d0b4c45b7647509a5580815e288051ecc320831a6184ab2b2c7420ef31b91083064cf807afa870ad627078a84b3f4da7dcbc583bd93f881cfbe1826c3e452a5806fa6fa2b3ddb509d53c88b65c30adf972909d61ce32d1ea58fdcb8c2b16283062e6052489c9095ace19af7eb540a8e207d7f24e6a524b234f90548482831048f577a26055f7e282a6ab7bbbc49938c9d4433df79ed56552cedad36956b275e90f2b13d58dba9531ac1be94743f45c541ac361ded9d71a54ed0c3ec72e0c234bbadf40b98bdef3f0d70ce1b92b70a6d99ab61f93a2f1801e36ed85d734482f0b39beda075273187d2dd206591ed1dae1e6bb213ea06b00efc56d9489a248afaf3c32a078bf5d126e4a280f4b1f41ab47ae6c3af016710e5ea139d160b313ffacd21f4c639c224459b570ad063bcf01f16412d6a48dbc429a2c149b5254b790271bca2629d659c8c985b6798a751532908766f328a25348938566738aea2c44a53821a2122c0312747ce50ac936b33414d8d54cfde3663d22cdb5d7479e7a93b4771c95b5b1d3b6762c3ceeaa776c48c1e4bcc7729b8906ab23249c436d9341ea080967a1dbcce03a84cc39a836b7e03a85cc66a0b5d92075848c73e86d9c95d73fef0379e0f2916dcc6d6bd6b2318da9a9168ddd56f60ea82794b79209b071ddac275ee6bc22d433c081e53f598cb7b196ad9940a16ec18edc91a34516fc19f7d55494a972cd9acf38f0abfe79f92a64d381f5e965201a19bd7b72a121107535a11e8492d37697e51bb0b7556541c3f13ca76f86782d783d92f291bb5553e70ae525388bafbb566bbe99c30301292e63a768de2c9e9160455a22a18da8ae1a0df408852e41ecc14d95fc68bc62b90225bd1cb04ac3fc3ee319a4cf90e952e9ccd6fbdd5d2ba7129271f39fdb5097feeca61f9ca635c970633bdfea9ac9e47d6d57b1ef71a64bb38119dc669cbb4f687fb39d1562b3541732df86f46ce3642348df6574dbde1acd16116472f332cd7e26446f3a4cc0efa479b9274b086a964d2b7cd6887eac45086ae82358ec15d57660d8bd23c52086397bcbfcd936d95b06f32974e64a377469f0b0512380654a703545c7fcb5662e9f0e2e7da14244365040db0fad80fd78ac6feab2a569bb912da1f7d5bbae63722e6397d61924f4b7e4e75041a5386cffa94efbf2898d755b531c558f1d18e52c11735f3a82ceaad0419136976a3e1d8f4a1195f96e02b9df743289724286d2aec6e91e30ac6b194e587721f7d7840cb1e6d359df2ea44604e8e06f4e2d2dbd3956b0b442d52ba61efb7f1787ea941388f107e7b47fb836d4cc88a0326e6eebcc63b7a7310119ea71c196d57d8aad3b7fb09fc007b85746f34a48dfbda0579f815e7afe25ee1281267e793faa0915183d1c8feadc3e75eb98bc5336b62f97136bc4c1210ab49e7a0c7bf2f5f82cb774e15c65a53dfe39748fa5f374dda269d03b789eed17e0e2e79be30158f08f659a5627cd3922d34bf3ccafb07ac53cb6182e30abfa71fcfbed68f5fb27a1d6beb6b256174c767def522450175040223d8f0e60ef5b7eb15be68a6bf8dd232755768da5b976d71aec56235d6b48578d5057f1905f83a2263a4a4dbdfcf15b6ee61f5c56abfede41f7452e0663a2f0e5e488faa57ce635bff0f5138e9bbdb66571fa7cff15a76f4d656bac00d7d7cfe857dd6b3bd9e58765494f8a67abffc14df16b59ead77651e3ae6adc4d8dbb3b9e94ad8ff38ae2f76fdeb5a430b8de2ef6c778d9145f2f5066c6ebd5daeb0312d09912f43d69fb53be1d74ac7b0e4e113f32dd79520bbbaee657f7ed3d2010119d9a8c8ccfd4c58e4c575eeac2aeeb30d7731f1f9fef8ebf3674e0e6349a5a3d4eb7750383d46c45fe823400c239157529305b98183d04663613531a3d87e9407f9c180261ba358490e3caa76f85c998fbe5388268e1da9a8357a4a46fc72235bf8d71ceff6a47cf1b31711919e16fcccb2fe4f5bcc120944c41582f30a8c733345abc481c54041de03037df16ee6280077ee3c67cfd5b05f6ee2cc1179551e029a3a3726c117ed47c873b1372ccdd01fd1bd73717e6ebdf28307fe453eb7960f4d532f49e110ac6d9e696b32a1f1aefd418144439de97160134ee37b4b297aa9dbdb6e3aff70861568685fc1354f59e32ee0d781ed308eeaede89041063ba1a5404e549b615ae5ce6dc271b3796ab05ff517e3f4628ccaa70e92b2f007b9774a1543e534d1f94d97b546a61ff7d5645c8c99eb5a1c3b3cde432cdfaea9469f7cf5931a7c7e17ac6cf948345819de6cdad4fa16a2562a19d34b8e32250edc597edd9366b777a808f9671724d9f68f0b6deb62bdd0f64930a8b4963c1706e2afb001be4642d65d0bf526bb7d24bce268ff9a2eb5846373bed15e6091320360621dfa37770bb12c0fff2957bb60421d0db571cd12bd8e5d2db2882c1f7a4f5b5104080a7a5f5e9722d9df71208a5234bc142c2d76e03a2fafc5f1bbd3ecee7669ff4be1c3f1e727b7d0e01cdb07c0f5d367829d7f25683508c204d47bb20cc0e9bcba4bc9b8afd0e3904c4a73d7fb80fb5728a346d055e61ad349e0c53ffe2a92262d1889381d2adc5801e3865159522ebd07f0e1da1ce1fed3f52267bae419ab8c8406bcd380622d955b9800f22e67c2f407407205a518be00af79dfe9b0bdc5b262c139c59851deb60432a8d1b246ed0253a9bb00a9a34c94aced0da000d8bb1aa9c65cdad00a99c8f53e46ca339a15afc6940fdeec5c456ed0d712503ec0cecea5f6e9233ceee207ce109a57741bde835557c3bb0f01fd9ca06fd17ebc61bcf27aa412f9472b8278de1cf3902c707276d8fc912cc5c02bf0b0cc98a0d5a388a274f86815654abe7ee2984ccd635da175d156d707491458c7475b94c726dad79f06f0072852cdd25ab085d953975e58f20f157d99814cd5632472c5dbe5cb7c1b37436b794bad107e587829caa6fc8a70e2980b7b09a35123c18d65a760cf7cf70356ad19b030ccfdd849db0ca89a2841224a822df40f7a00c5c63fb80d396d1e50b0e83872003fa56483bcff20bf62290163e520012857bc6a0324c86895d4e2d8e788d3de545b0ef40eddfcf8c4a84805bbb58873e1030ea8e9921515c65e7615ed01402daec07a544c5d53d023a8d90254bbd1c9fced322009c5a15a472a6b9dd2aacc13d6700db2a1476b94c3964d562a87cc5f1f10e6412e45a0fcb1d35ee655d131276ae7146082ba1c229e72d6c7da16fd623ba5166822400015db822d6899d4e41c8b57a60c015fa839f51465a7fd36041dd1ff5148689b55332334a36b1aaeeb840a3fb00524df8f50d0b7f2982c64a4213722ad29114639633214e81f7af7ea388432a205e1a32f173b32539457bc2a79617137355c0591428382445978fcc1bd17e9a754fbdadd4dcb0b20acb3e5b8d297b2e0b3c5d16c203b56a780ca1c04242e57396585004f7f7722388f5b1d95f170d5e5d8bbfb02a7a8c9914beede030a8544d5137b49025e3f8e18af6d4a8089a0a6646778a49b46691c27816a36a46957d06f40e84be59874fb1695054ddd4472a6106401cc31ffafb427d7e78650c8871cc8a321842c94f407ed2f8cfe1e72343c57a41b12af9ae6d40c704d873393235f567c3a33dfb6b21d5133312845f9d7fa0eef76cfee4286fefa9db9bd7774385d43bb620fa4a55e2e0cfa68a3ffbd3e8b3439883501a0214e1236ce3d35099eb830308491e959c1cadd97cb67a2f0c95858a293941656316a216afe834f819e2fd81cc915e4759507a26ef14faab4a0c79905c97ff195b4ed410e4e04522e0368ea835c2e31127970e760a0dc6125c560d63d59e7e5809f447060326619d9a4d9571260aad4384629a9e5ed80e44c88375ccb03aad83b0ea228f80097c0a59b1c93a625467ea54e766b91293529e711e700a0f29e26c174e4f727cc70c2900473fcbdd0a7442afa937877bb0d6c85c187784ceac3a26e11cfc9d9e09aa4a9ad6ffbe9178725a66e8d484697704ff4131d2cd4ce4467de6581690500497228bb9f53509c2047e82376d3efd130b40f4e8ee348a5b733354d9b4f342855678d0a90757c91abb4a9d76abdc87de451898deba9bc87537160f915d7747caf804f2dd303dda5b8fb154aa9c24ee22ef0604cfad1c95ca38655e3bfb43474d3eb9da315ad51361fe4f36030de724383577efd3f84fb3615408e59c4554d936bcc9fd637ba00687a30c36769b91f659e4de004b55b302316d511b5f3d02ea416eba6a71c6d3f9e0cd104301f8d484afb16981a277727ea01e60edf2bc4ae342dee4737f32a878631849dd5c075e6076d3a8cabb411bbb693d4b6ffa8a88320b39c87b52d4b903d2cd608a2ce608e6e92827bb296419e532286152028306543785f0b291b6b5cb506223246a4441596c1ee57319aaec6941007b762f186346bf782959395f912be181ebc047d72365c6cbbe8040c3ca702e1b5100ec0eba194182e180522e2ae4d7f5d5ad0cc39c28187338daf94c5c8cdcbaf8048a2e27dea95331cf5d67bfd6492f40e6ce3b9095049f4930871c1f22e278548ebc7d042a2f5ecb00dd651a72b01c0fbaaaeaf373aedbb446c0913ccae0c5ee8ba242eef68d97e60d539dece0365fcc803b9b6571f02f1a362d8840fe7c421d05d3034d83b8c8b65b624f59720c670e10aad4857b146ea21731afc50390ca3b398942e1d9d42dcabdb43ce5298d50d861f44f01756c5fff620f0643ae910429c54ea3a4ec6c50ab5c5634646100ab72bb8a57912b5a3cb3b72e6d0a534840e4f53c664561a1794e95d91bc5525e3561abdae0ecf77dc3960c811dfa14a2372cbe57a7a7facccc663edd723f00494c1a5f22a04f29905cc8e6ba49042379e264c06819ce575f8e0aa1c2e8ee974156964e286b3c2b96018d4b8c66ae22ef7bbcb812e0cea6e3388a819c895090d0685fca641defc44f8e3dc9ec2525c6031ca9fd6aec53d0ed2ac4cab14ec66438ce67e7163d496c26492b21210a1b742b7339c8b8788afcc863cd65ee460a21f44d8aa84b8905214738914f12821c120579d9fd197dd1409b716deb3ea41b489e0d0c307b36d4de879a7ec589fbaf2964298250b845441fdb34d4f13ce8918b6877e9083345d7e85038d68321ad3b540f1e125f7c3c343e4430c8423abcc854210d5a5d18ab174effa7d1e2ad78ef011b6d4fae75b30be055fc7dd7ee9405313cd9cd86be39653c6083b6281a27a9bf4e9d3a6cf24e236f654a9b1b61e8fde7e8f5f1a83254babd67fa21f8e7aaa743c41aed60e1d907611682a8f7381ee3082d03378642bb498b55687ea7c2c0d7ac2a8b62c438bb93862cf8a7fe8f365ae7f7fcfcd6435ebf1636a611a5a094b697ba1c24e8afeb20d0f6f1cfd8c908933cade90bdd9035822233b448d0dda1a5bbd5a9c66a669f0cc6eb51fec1de0cb5d354022d5a562a43efaf8caaf0d01a65135c19c055230d14cbca9338a77a2f935ea3baac19e62c040f8a451c50e70848feb73cc1e8d38115bc0262adc375d951cb2d6621d03c1559bb7e922795d192f189984506319fd1b6821b34ad7a9af229e63bbdd0cba8ee7ed0a0c4effdef4630d53125ce622f926eb98e235ee258590baa08f64797dcc0db717117c60fa55da7e3f701554c8ecb14a4f9077f78cc84987edac78088193992080026d6b60664cd866f2e5c4a40296662a02571d2b0c30f06f90f612c4d2e1983092851d251ddd1477a412ce953843fdaadf8baf01d7a6c090a9f78c2e0771adb995a98367879f6142a23d67f6c4b5743097a754a8accf2fcda6df4a444eec7b80ed1e4648617acaf8f72d02d6a64e080cbb8f454242cbc887ed149c204c2c69d15f80c6294011e1144583409353af172f8103738f0fa3e53c16cabe0d2fd5a60dafd38de64ab0050e1b342ef3434ba6e1ccb93fe126ca12e6f9c8298f24c60a8344de5652d4630792eba9281bd4056d22ec2aec8682d7ac7c970277e202231721aa3acbec4fa673e028a7305ea5a5ebbb91fb87eeb978e4f8d90b1fc36f9ad32ea93e8b25d1fed5997686103e5cad44cbb16e2fc47c00c0c003ab31d4e1b532af15ce281c9cbfdb85dbfc37deb0b8d548b3106b34060a97f0769d93a047503a626e2a0a4ee81821847814debdc9d6205f363cf0f2d1af636caa5862691bc5c0ce3eacf9a6fe4855b2bba9619775921e353626ec16f5684a702fcd40833a227e4f49e85409fe7b996c657eef737c1739db7d28bba0a2b81a7cece8a4813f746249722759bca016373eaeb57554e9b8ccd037d5543fa9fbb975a32d74e0e9600374860e41d13f532907e801f9cc14907548afb3004192cc0572059ea448048f13c1e2851799b74ffb539aadbdb44fdbe18a467dc58eb19b80339252b0b89db2d52f84dba43e14c072fba3c04f7844117a3f957fca7c3751633ad49edb28fe7de1f92c9a2e8c243ab024f51119354edfd0cff2118259d4560f87b96748b0bf8f8a08937ce98ec5b74404d9c80da3249f9786cf93f96e9cb0aa6d8d20a4155f2b6f2285313f4885ba6a9917905b4e7f26b5342d719c4761da08e17fe2ba760cc8230a077385d3f60553bfc5817ac19290cf8f854ec222ee9998f8c071c7ac84935c0206f5224bcd4d95ebfea4351114d65fae7b770db26003fe08698f6002de53ca5bf6d47c4a50390c0faf887270bbac01cf68ff0c0c4bc9609dba9ade96d0acd23772984089ef0d996f4db7c94fbc1d00d7593a777104480464b41e0b3dcf429a138a153466ca111ea379fe52cdf9703cc71425c3a46178f463697befa276c4b18b60900ab9eb5af76c9cbd0d50f25412c162bd9e1746cefe4e53fee39c7949045d295b1ef9be0ac042e9b9d781bb9416984b29077323846174b5f9ce01493c3e64ee0c45a91a67518152ec41087ab7bd9047662c9adf17859d0cae97b0d109b47d1996dc5135b2ac0b947da10f30450d981227a18fa99780dc08e86632c2601ea3edf4bf9fbc5cf7478412b0543e26fa02d14aba8759a889bbbd9b311edc40e280354c1d2e3e7e950449e4b1d03c441219a028001dadf07920ab9ebc347ef449c51e2fac6e072df25b37946c8cd6137bb0193bac8aa29b1917ae6d98951ac88e4fc5c82521da17fe51f3c682e82b3d625a80701442a37282c90c22367a1d9ce1708654fd770974d0c72dfc15d019827c2775e0eab75007269230a06d787bffc7bf2f871d0baf319bc82c5bbd6871a5b4240a3eb54ba798c4980d0a36015a3368b0a00a1e5c74c8b1a787c2b194d53207ae656669037f1d6fc304253ed1e1ad45db68355b34e45b66a7f464577b306bc125aa9bfbe60a468ae0fe220b8c9cc0a2be0e4a1396899317e2b0cbca4ef567aee3e8929a8ef5547b89ca3391c31daaf2b2079ae4c1050965c6950ff2f0dc772d804d413d8cd28733b6a31e0fc679a3b7be318f6709c4510ba7f6b7ea6b602d0d1ef35a555706297d76ded14afa391ac1a12b563051bfa3f649c1f9e596be4c3687edcae2fd3c88355e70002ea2a9a0223df5c5398d9f7bad97699d366ea1fe8bbaaf15e5b3bda443364afa2df90255cab92c431e88129f01fd5d1295f311e3418161dcaa6ffb6bd536e8743cbf8af32f4883eba941d45f812bd2f491dc3c04a4a40c3055a9042880ddb720c1936b0a7e803c8bf1f4051c5cda30b5421da87fbe4b8d9a42749b23deb45e869f00ca012b3510ec10abf3272a34c8257c327c021847ad0560b08f7376248264e556bc4edc9fcf66f37bea9f30b243aa4c664ea83d8307e8e57e346f8f7a0eaa188830a7fa3de83151a93d9c83b27eb07db8b3951869a0a10e2ca53d5558d1c04900adc1847dd0f1be5f4fe561ab8e3d2af9ed587360e0978773a1ee7872d69afb7a7845412f041d46211b4af38e7368570082b0cf5cacca77f7756b55ce04cb0b553d1c742c3fd9f4ae5832b4909980f38c84c1d0a84f282df1452930383d6f099f9bb8fc9a4dc55210a13aa52d89af8dc00f85ca9b841ca6036463408ee388d793b001031d420da01a8a31194a403db4ca702b53606f1dd794683c6cfcd0c8091b4d261ac79c9e606ff618e38914afb64276e969bec191583b3e2011fefd518c75357cdbc7d3ec8f6304bb2fed9996e137eac96a4969eafc38026af941e31a603ac34e8d6306f23f278b768ccac5916f630c7334803e75ec4d5d84ba52a3d044972eedfd55bc95183ffbd33ea918d750bcf2e81210fdba5ba97cb86b570b6c1f0769dcc11ea1950177ac5f8798b895534e905a7d1ca2715a27163654d74aaba65f5acc08bf312260608b849f252897f387d664c6cde49204e37694cb02dbf559940bdd58b1beeee70bef7a1745566077cdd414a04ed59e8329bc392c059b4f43994113c7932095b9f14bbfd2d59bc9915c9746d006816e21a30f24a4c47d5cf269d6601432152c5b707282500961827613c0e8b399c1569a9266e4136237e0223648ed4e3ac36547180a1020d9321af5d9b44b86b47927fe141848e2fd68169a535ecbedd9ebba4506f561bd33502f0f9349a420d2f07338e93e026205da64d0b7cd7380295f891fe804346a3348ff51272fff4a54c017e80b78e2b617b3a8bfe0b379600d33c4da4b015dfb08c07655050236656604bb47b549038cdd2370dff29dea72c62ed63dd428f911ce3382a3fb42a1fbba18587006971b822691a40c3e4bfb190dcf8ea0a32f08c0d01dd5dba7c25e4ba5a89ced02a443f381091e0a2960ea9aa2c542db1b87a9aee66ad8e50682b1a1d1c121d24467a814458d5f30f88ad2f7e704ddf90c982b3c60458f1467a08878a27db6e6cd5629afce5a26a5f7bd991a9d9c781f71dc335e58c78aafba05ce4456f1df0b7aca4732447a8e3fa2e6ca3057869c27450b03bc4034f128b80502f24d44b918262fd4c6091b2f08c2739723afbe1825951e2fba441b210193a08d446cef94743aaa61b7762bcd6e32431f584655eff8c38a0778bc3ef567a4b71964a86055b01b2a21856f52b9b76b000fd44efd0b7caa6710de0379356c3e863b4ff3d02554d177eec76306d49bac6d4949224f89af2f358861821853b4b46bd3f70dc2ecc3efa88730e2750e6d4d9d3127a4a74b2b5df43381eaf7d0ccf73b888341a7ed13611ca168f9c0c71022da4113889ff1cb44d1ef25deb5eb01f5844c82cbf3e5a231d918682abac788b321bcb337e65f4caf8f25500707ae5c885f0e87e7d1bc25e7442429f5932b010e703d7b972d6a241914c91f98d0741792bfe0f1b79e717d6347a2b86524cb831c38d3e5faf3f8fa43cc1bbd28ec868118a98f446e42b43668874b68a6e8ce343c1f6c50715e9acd8062096f6f6ae0733b82460a4a34597471dc29964a25798430424b3112236d2ca5b99fb7a07b211f6fe27d912aabdff055e34cde04c38396354be4161888158352bbf94495b61f04eb55e3634094d922d0afdd095957991e6860a97e871788ff9e7e704382839c7697789fe79b2f1196d9987b7e773b03f0a33a4dd92c2bbf34ca758a5c49124ca6c81a7fee62187a76790bf508801d904fc9e40d6e0df3247893bb80429d7209c30f0a87f760df4aa373b4da1f6fe219d26f69038c6c4242299a80570535d4ad5ad295d0f557595e53b1a4c7b55ffd6d25d8d12b11f336ecea7a1737f2501bda868056ee8b03da00d2b641adda21fc87fbd469f6739b272876d9975f4e0c54dce343d27bdbfcc8d099ba2f498dc4a372d1b2034f7e6636ef3cf1f91cbb60b30f6944f59f9d0cd26b2590b5a7287fcd416c16b84ad90bb0424e6fcb0ea0b48a6615ec0554d71c4634191b9f70f4fd3d68c9928dd784fbe1da0d0e943688cc2155fadf7208f775df9e24dc07106c0a7eb2d830c1809d9bc0c1d8b1fabe5328b6cfea2aa652f816f5667b3080761fc0eb5c91adc5e96f7688f92ce3ce1a0739094911715b21250cae864a7771e272b98c8becc3655872076288e185ab0551bf503c4aa0d33f6e021539af798e63e36e24c585ff6d35e0b00ce7c554cd1f61a0c7b2eb3e112b518ad6e3dcf8c27480734945a62d7269eefeca21ca6b0489926bf38f007342bfdde48e46f3022ede2045d2474fcc7817eb102550f5d62c2a662a1fa4d80f6d40a7ad3bb4ace2e0106b6f6e877d0344af5ec89164d3c6de2ce3e1541818f7560e686097c413e7abc34d55ca40756d1d4e4470fe3935152391b3de40428655a46beb5ff9600fd637bfbdcee70b830f0ed2295af72b5d87454a5f23c6c2f515ba8079174ae30ec9418ba55daadeac640d532fc85d0f9ff0140a3bb94311528d47b1320499bef49da3ab48f8135c4bde8387f4c9b22b422223ab00617a31e9678159e98720e9f23df920d46da98f06fdf8dcd882bd966f3568d75875e4140a4ec98007e5b26c1e67c2c7b1140a26d453f76762d480c5aa36dd51d583687cdf4f7c4cb3f5b8fd39e0b376b94bab1d9c32b093dc7e57be53d8c18c3440995c505a9198c133e195839429abe64117842e93e46caa2a6c641511325eba0a1a92b271cb350e6f3a62d76f76526a2cac7c9fb46abf790ddb7edb9229a17059cb98a702cb1609679c7f87d2c61771e87cec31f7270dc7f5362026ee2c52e8f6bed3417976c2a823713ca2b6faf2a33c1b5e2e2639e8209f3d932e6763a3a15415903f4aea502fe82298be93b90adcc172c818eb1dbb91229d7f911ff56151f25cf767d4248a5038264fd1ff0be9114d5a391a6fe032842374df07d246f3cc3b1f4bc50c5acb0b86fb6d6eff8a125d1b3b3c876b7dd8a28d828d72e7c16b59d5b24900c507c01492301f3b848d4876ba83685bb126d13d8bf6536d7fc2338133259bfda589f4eb5d2c3c352a3da9d9981858f834c364bd01639c6362b71d7c4c5d18ec1498f4de3e5c68aa99b625ccc9a2fb2580b90df6890dad75718856af10af8ed67fbcba1af674f0dced75976446774b8dd35ea0647c55b85aa6f4112a55e0a1c754775a155b8f9759dc9672d629db087cbd286ddcde1288ed8963bb2da198511cabeb516cbcb928b32399f74af95c97902507f4d5bdcf15ee5adae354165ddc599214f49c0d0c179086e944b4b4a8c57d63b0d70a562e2fe32f8491289d071eab6ae9be4c2f1dd326733b34861ff10aec0b2dbdb5514580f56cc3e5c8bd3b512a2853a94e03b2c3cfd6bf22b492f2c10a1fd422743fb719ddfd7b295e33fba529694272f6c24edfb848d41520c26e91dbca468fbd605717b22a0c96c54b0abfc24e412e2418a26fbcae5aa4b225c6dfe831b4454eac2968ae971f575a4a686883d937f9464d0cbbd8195aa688f7c40ef7b248fc42d9bfdaa07c743fb02e89426da1fb298a31786447ac056aa482fa7f327bab59f35139320d0fa693783784a6421bcc2baf8aace601d04db2c626d4bcbaa2c2e5fab89927a01938301fd39ab0642d8ac0503bdc2f6bf5042e34809e97e44175551b992aefb90cb337295afbed2e785fd8873353721695498c2cb8e9bc14cb757012412efab65eaa71940fb2560ab5c4eabf5c65451493290eb775a6b00b0bf5639c7586942bab2ce56a894d5f0ea79385b90e62a7664c208a5da4978d493ac5c6e4727911e1b81c48aadd027de031899dd9aa33bfe66dd5c9054f2a0883730a147bf7d7648b2326798522976c38430241af1b506e7f5785b89c0707c82e5f40d78e7028a2bda96405001673a8ac5483c027993d1c99d4e095d5151b1473a8a9d0ebce64551a8fa9d787b177d10f9270d9bcb98cac256a533c300e3b2158d0603c5fae206ee933a1e82ede85fbce7fa14c7fae51c4c49ee842a6d3f43daf19473e26999eed5698a4635c9d52ca94809d6607398da6b9f01787960d2062c23a7dd68ae39f5acda31502e26e874c4a12d2c32a40bea8d2fe93b7ffdca64e6ace51ae5e533b2473d20336fc631392c24b93685b5b278ec0fa7cc03da4974046bc4a9a343eecc9bc42925b77fb1d32dec98c00e72057cccf1c9617e1db86065f3f1cb5ceb8ca5ce0c5b89393312825342e869bd95d568508bfb93d38bc44c38e93d6e1e7340aaae43f40d270ae3b3c80fe16b843f245b562a77ccdca96b0ba71bc733d33ac6139e93afe873b41e8deb41ce49a61aac782d0220a6846ed0ff54ec6c920d1c31dab2f1dda2d9913ac8993def21df26637254c24d6612c624c39b7a2d812beea1725dcd1255f9c882bcdd8e5f3b73323ef2f9d37232c6f12cdbe6f4b68ad52e7ec177c8ee87b9a6338488860f7641cc9d309568a7ea3d32139ce8460f4002e60502d1b8db92a3107fdeb0041badc158099cf06803bfd8275773c6bc8d6ea274aa465a2dd4fe5c6ef2f6983967d63e10be4f08b7bb9d12e4d3ef1d0177658d151969523d10fdc3ee9af7bdc7c3cfc11dbc6800999b9a4a7d2b8439ffc7de20f80b2981d762c87c5d10f3834144850f88f94602d71f3cc7b11899bb2b01b09047b5e4de5ff34a1da137aff6ba6e68b79a015664745fb86a0d104b3f54358d91b6c4f6170e54139b557861cd8c5a45181a8efd88a582e412b5f7cd613b4760697ab9b62feb0ef6bbf91b3a24d5ca008d6abafb98ebcd1fbfc4d451bf125cd852ae887516496c46a7fe1a3f12f84716060c7834388e9b62886940776859a0bc9c510c3d019c89fb6ce2425d9c34cbbe8a0578232310710b18c36258a543a0b9008dc12bc8acbd881e95cff02e80cf13e64e3ca1eb48225b0c4987985c426341d3cd9c6ed8d21ee2aca8a9e1715f591510e1956022cdc9ccd4a0cb3e2cfb4c7f38290bd9dc6e64e0181f86795f831ff86066db8b171e1c71cb911dadc5a60b3130fb7a371019e99ea94b9bf722d53d874a82174a889315f506f59ce2a85cf1ea102deea0b2d998a6b47c7eda36265256760c438ad6a9d12016b0d2118914e6b6deb311ef1ea0f087a82b425e02426bfe94cbe1bcfcf929278d0796eb0803f7f19ac420d92d0ed602e4ec93b6711af1ee01012190feadd865eead6676b769dc32d0029afbadcd1e7084bff4c9aa57d5e23944f3c3769cc57c5ef872f45b9d20de336130082d63f840101f702b9817a0a6ae46fc1938de71a44cebb41897be6364b848cec78dccf67702d2c4ad0ef260f7a7ce8a28f3e8381bca691460546e12755966c7d783be106363ccc30b0d28fc2bb7c52d574dcead94c744d130ca0fa11427d59c1c90e539d420ee89329e1635f0134777731a3c8d2df35b2cf96be3540b3134877f3a48a5ffbbe16d1ca9c47b037edee94f6524e7b5402a587e5f8956f52a7b5c930dbc5d806999716d579b924c38dba3d2aa6ad2d751a7e119e7e8ed6e25c46d528f286c6bacd8ff2c95187147e9d8cf2001d41117c3a66f5d490f4fb2b1d2c275ad609a11dcaa594475ba6abc1d359a70925e0f906eb9b6092b841049ecc7344033616d24ea49f87993652ab5101f50bf7e3ed2a2339c13a3c73bd271ad9f417212a8dacde0a503b81915ebda0666360dab7629e670a1667978dbe06272aa6dc4f66784370b295ac619a3edf0dbedc135c386936d11f35fa36c0add3014843adbf38e74f2cfe619db31fc67188c0fbbc6e01fdbc0d0e0d6ef5c9ba561252b69676fbd06a6830a70a2e7c5302c5a47fdff3e5f2b8fd9f5631977283ca2a5214006474afad6d20173405652cacdc03ad9fb10d82c7e4664c6b32e0000e1a04a7c693c6c0e6986cb8368e90ea64d3acdac3b2e2693ab4256aaada30abaa8dcbf8d188408dfd68c9c8d02b5dd0df6c2293a241981a1d8e345a8b83347888cc6faa2c51b4f64eac64cd8fb717801eadc642b79a7a1642308efdc02295ba7a933c134cafcf3a2579627891bb455c4f9a0a7031ff01afae15d2b539b6b2182f75a00b003fe85101aabd2acbaaf19d666199b89f719abc0b71990ba9d2d186f16cc9d080da3a8734e3d0f901388e81273fc2e2a2f47b47fa80d5948ca2d955c932ab93c83cb9f950d0ac77878a915142a74ab48c52ee88ea2201951c9ec70ae1a95c160c18d903e15fd9db34b98c361c860dd2c75ea57b89045a9d1a82f03f2bed171b51850b94ec51971d61b1474d1920a53cd005a1463863749ddcc2cfff15d51ee2480f019b7a95013efb4c8402699586bd25ff1da2f13c5fa65db2a652e6983a0fd3e289a464c0870b25fa5fdb9de2737f08d531b5d32f5c419c9d98da2478940a77012006dc8540bd9267504e5b25a3ae79caa13d0d117e15fceaa25b44d841d68519f7c49e11f73c3284dc90748540eb28ba6f8dbc4345f67a85f696c49c688acb5ad69b14960cec6bf26a288a1632a7baec9823a83bdabcaf249c881992bc5684368846ea643277dc717c91ea909fd3265a6ffb9b0ea3eaa780e9784768dec05db31104b39b2a8201c8d93957a8b7b2c9b6d30a4732a2e4fc2927fc4a0de1473f5aecc15a1cd7082e655ad8ba64ff02266bd82c73386fd101515d86673f9c34c6d6b9cd7987fc956e69003da058fc8f12b73b142f9c9bb2cffd760ada18f019127472f1d4183a375971b8701cac9303f41e26d992a73aeccb1a9e08705553ac9598d5d7ab800639fe2d7c427d4c296b272cdf75e9ddd9c806bcd049654ec58dfe0d337ee492f80773aa70db404f77cf485bc2f8e46acb286490c428bd2f0f1b3893019e660eedd43672fa0a00362febf1fa20c555dd707c57129e0f2450467e2d1701b810405903229753e7a42b1a4993475e7531737bb488111cc5decd3964013a7ddcb0ef9700af360b0eefc8ac3bda145ba8236a9802b950d324c249315a2c9d8c6b3ccb56a9dcf984b5908f00c9bdcea6ea18225a9a137ee26b635d178986a359f2793e4d9e18ac08b930b931bbe184ea9c10d9fe204e487d5c9ea6cf04e3310c89671edd070cf7f8baef1cb0359b074987968734cf5343b35c668615c89f8301cdf14eb104a5399017c7bc90550bfa858221931576620ba6c84fdc3a616b031cbe34bc2bbc6a307a39428a42ef012272c7f242c1f4feee2da71b0df2b31c3928188a98e17d0e18da3c2bdacbc71e1f01be0423d44cc5a6ff090d8d652a8c035b0821bde5f57789b82888d3a7887db6bbac852ddde640fde3ca88ae7f932ee320002a1d68f9843792b81226437d737a0f449f87f43a06af5dc3de7e7f5e424fba4987f982a1934d921d1a10cbeae9c15216d23a2c900630dac63bbe721d8411b54f7a0b9683d5023f937c128915329f1e1dc22d48d1ba4ec874f30dbea2419b053bc7cc81fb6021aa74861563cf49f65bdd0ed23b2c315e4809d37de2f9f2263844b13a6082321116b9c96b28303f353398dc5ad90df40d2a61f98e226e5623cb7d1f5e1b2afa48992d9e3612f4a82cd18892e41926011d85031de14db8e614ca19d45f5200457282cef27086b6b8a16285c664486a46bc101948af2970cb02d20c105c82d529305c59efa62ac8ae84aaec384d49b9bd4d50d3a950961d5607edb1762c07ff26c9e7e791bfb27f658ae0a413c3793a2a640a1bb599a7f04a58912d6557d79c171ba030f3546b4eec04f03e871c8d31f6f528265a502d094c32578437897d6554ec0bedbcefb6878b6e0151586054499ce61063f7a7dd3d108aeacc09f1ba49af6682b39d6b9332222188e4ca8241f4b19aeaf7c8ed5d4ba16617a76f68258985498591e2218621598296c6315c81a9313940c0e3e7f135e6831e1cce6088cbb35e0b16a72696c4fdafa25216511047745421d5e90b2b5facae91b3f8d064045c188a64624ab1a12a1e958b0f1173ae091693548e8a6c77a920c34fc19b1410536c3b11072720152a6df99c94a7c67fd95f38384031a59910adb11d0c05db99898f80711c05eed29b64d595a91db8b7aa413a6121c4c39c9d38d0955a0b7f59feb37306903feeaffc2c2f88d400b5ec677d3a07b506e22449a557bcd158d8212a3e688c94d8810e62819917e14cd33303104f5c144c56070b77fad4af4e0e4255bd74e0352e2f69b920ff982b042c2c5634f978c29f9bb19f2ce2eed386241c1a02e4d60d11e92f6c0b96695a9293218b408f23865ad08135fc4061f2864843861ab1e6f50806e86cd73adcf9f5c4fd1bd89be3b56db741469d4314dbd420d848e9068abf365515c4ae71db5626e5869730b41135ace0e37516a58b61abfa0a62d17b3e532ff43242622b43058f40cc66a2c51bc5d9534fae1effe0c84b77f6537e58bf76e795a241f33c4186520ce9c429c5616e9e8c2627a2177f15a9e559182dbde91d14f11e5739594d49f2bb97f7a80d464f531496e9802ca84537f6a8260549441c590edc615721e7510ec747458d66d3189fa389094faaeb8c60203c1b9487253d3d4c59750db734489fd5b86392ab1fc2519c4dd103d0f4d4f1232a990a986bb0aa838b0291c3f59e72a4c98932860c1d22f731094c2847ebf4134c4e67f14cf26b88579df369e9600114f6459f5141f2e3043d53682306bcbd7778718acdcb253fcfa2335c525cc6ed90dfe7c705364dcacb8db3cf81e91f393f4b8dd1e17b6ba919799e62ed6d869db2985b80ce0f638c9d8844111e6c0cbea0d6ceecf402647fafe21943e655b764c23fee557aa5629afe956a4a39fdd45327e7ed225b17eb7efed10c9e17967c433eaf46a110eb817ec18dff62d553f838d849d8d05056a8c2fefb58d545eafb0a67f57348173a77ceeff84a7807a64198ad48f2861a23b82f78d8602803c81a411161ecccd381e87e211e659f31a3a1da774dda47e1b4a84fa64e9fcd56072095c6db5a2809933cd01e1047e941feeaba476c5413081cb46ac9e57385110a26c85e0aac9c523446837cfa5b6af499d723226e76694fd13a1611eb8042c24134740a1d55ba3faaf9206b3cec63106fe320f3c5810f27064090264a0e684db302bd4c301aeed01fa19768d9473099499496380d29dffeea4f3ec9f5eb63da474af84efef698aa8a3586cfc7398caca2004db9e237eca65bb1ce3e11503d1ed23a4fc2102549b71d873141214a5b663739504e61b619bb19911794b98f3ccd038ba5cf22ae772a6632f6d3f1491e96c296f64ea120f58b58eb85100ae0ad900db9568be27a2e8135a46edadfec3fafb5dce3f8b3fdaa6b6df503354c97d004e39ac8e60924c9c013c4d42a3930f1f83dacd825b2a665d7eae7047b37d72ee9aa18f2f7546c6fe3d0c902c07bf58aa81003566384fb9b5eb56464e94118e6b73960229d0de82437e2bbe896568703abfc212ae01002e2fbe925f4f9c91ae7975fa0d9b9f7e299caa40866742a6641006f48670fb561aaec514ab709882475c33f237ac86a168873f3ed10e317b3d36d31e2b796864a18f6ddb43d6901e1e6188b88b32a8b51b88e5d39f55022acc8d3bf4b6c02373724d23eb1c669f8ca70d40f084aa557c91ef62fc532f1e605419504af20b3b2319dd5b3988797113e12d20cc653a5fa4a12658463080096aab819b3846b8552687a45a48085088dbad2d42081f2e0549a155657646efbb28c211bb5d4ae3c5a0d8248484fd513a14159fee39a9368fbf2ece489af219d7756bf854fb0cf89496adc00753b7a0b8cb46c3007761a70f0bc163ef131688ab893b39c2b1bc8969b504b64df6b091ad7781239a0ac305db08e4ae85a96098ad0d944865b759346dc1382735d5df834b190f4538702ea8a94f0b413402731c8c123784e7fe5da6c0f92991980ef9ef4603fd16352d6f5b80bbcae802387d47a866ba931bf869a8746546a8ddebdaccecc66d35f8bd9137774a8998faa202e919148e62468095ccb3de9750d60d3d965b7f7050a925d668560663df30907391d6ef1f683fa09a23162e57ad6931fa1b8857553b29d60f6cc98bb612c1ea748285c038c3c52e7db44c35e4cd3942cbfe41b3d638b11704867e77409d4b7a516fd8fffdf6c70d9ab76e6851650e5514e6282f6d6db51b6f4897b841ec26053071d91e9f4c007612c13abe2d64edf56295ef6022c567bce3aa823296c802c459c8250e9a399accd9f708125cf5c0ef05824e24b1addfb8463526d62079b2c9c012f88e521291b9a9f2f4e2dc2bb36581a39fccad22db61fe0325e5c8f1d57200539efae7365fa850334cb73de8deb3e8ce121c90db6a386fd3b0ad8947eb27364523d7f83ba74409bdcc98644dc074de030b338edfbff1aeea06584ed2d5ceba4064ea17c0b6340a37f018c05e4593ee79f89c6c9e972c127a62f67a0ffafe827c6bd9fd768ac2550545f923b0edbf3fdc44995ff932a37fd8bdc5eea23cb9405223f5118eb173f02c84e3d9d5196510b5bc9e975a29a21c04f7a40e2a620df191de07412430db060a891f29d12105af08db3cf105fca7a97f4ca0893a43070f5c73c605258b67a8c395eeabf0b12c8ee4dd5b6d0d79fdb98465e608c7d76433e225b2b9bb32c6a261c9210f5ad2d9d0a731f88af12420eda069f78472369ca3daef86055499614fa499b9ff1cb394ace5eef16d3a2e604b848304ea1294b5d4ad3ae5d6201f5b4d5485fe4027333648bbb3deae528304ba696ed7ce056148696aee29afd9f32277ac1f622e8674dc0fdccf918175b4ffddc849bb869760ca84b1d46cc7ebb0ef4a8dd6fd792215842d8266c63e3779771fd7f005df4c316d8f7b40a89e669f2938145fe2955812b925e6c34f166f10afe0e9cd1f7b0611c2caffbf6951ad47c55d6c685a239f9eb556aa25fe19816c2b5fd95b581add1f82e54b2468f615b358ceed28d15be0bbd688031d8982a0cb5a851fdb5b54b18a7663c9483c5b046e1e440a0e5920d65d690e0a09afc9c1938f5f4e229e15cb0b086e484a5ae23a455be0a5157df1c69b9d04db3ff2764c132c1c79fb2edfca76286e5acc70d9dcc0fe2e58a6f11d281f90b81079aa5dd60f942f47f4a62622d444889452ca14a90dc70d630e621027bfdf40214e7edaffdcffc0710ab11b63aabf8f1fe7960e194a77f10fbc1cae76e0e19cb5d69aa669dbb66d1bc7711cc7ed40b5031c2489dde26f12bb85f6daa89d46ed84f3c563ee72b7274c4d5df11335f55a7ea07eb658d145df60ea0653535778994a02bfe764b6f9e6ee5d50f955f9bb31b6669df5932b0ad7932b8bc5c94a2c41eaf7aa781c1552afb6e8a7d516513f4571793467451b218a8a27dcb37a0df5048567bf87ca22c6b49477454b7957b49477454b45e15df1ae3c71799c3c2c97c7f3a2f0a0b88f8aa282f35c4fae2caea70e2ce15959a2039e15a84e7b56565074da7e3776505a6a8928449b5f77b12aedc595c5a5c5bb12d3524f9727e669a9cbe3ba4b8d2b97c7b59496f2ae78575c59ba51e5ca125bb3fd55cb37ceca937665b1385e77bf15788e829ed2579036461463e0598f5bcde0e3387125033149f5dafb9a82b83cf633e2a3f21d71795adc7f4b7c4b7c1de03ca89f2da3f7e5d27861fa982ecf6655fa63ba3c31bb8a814adb578d2b1a684d5e5632106d10da94cb938db83cf68fd0aa5c1effd96271ec4805962845203d2f9727e67969a27279f06b5fbea6cbe32496284fae35694d5fd3d7f4b3859bc2ffb325a6c6f4d416d39a7eb67c56bc2fdb66571c065f7f1886e05804630cb6561bc6386badb5c6d9f5b4711a7358c37ad35abfe805d7682f825a4c7b8aa1df5b412126598ed35a6b8ed35ccbfe05574910f1b5da7b8f5bde11583e90da5b8cf1bb20b3a83d7804d2beca8b15202e3aabe928927b2dc80b2e7b711b8dc5446a4e50598921f54121456aab188849db6b52bb9f058768f2b551fb173a6baa96c524d4f6f8f3e3b188fe1fa84debedb5563d6ea9ecb66d3fda7fa2b6967bd6664f639afa81f29edc46fb9fbb5282a86963780251631af30fd62c2955d34a0b45160c0c4b0c7fa07eb4fc40fd6cf989fac17835c6a0fc6cf981f29f2d3f513f503f5beeb6b26105d7e4b776b46105f77c52b8263f27c6c42d3f502a4c89810d2b3f5b6c3861e3c9c61397471b6d60b161c5c6151b4e3f5b8a10bf0f8b10631f0c94e5ee06e305e63f29dc13e3846bf2673176838c7d52315d60c69a2e314e2ad5b3629cc41827d587314eab18a72e00f0e236f961a070f67e1b6337ee188bf13c1b56bc90f9575988311bf809003881ccdfd9b052238427b044a1850a321b41c6b82a557eb678d19ab429f95598220e014b9420b670229f58110a4e822fb73dc762b1b6b188b5cf71595c503f188341e26f2d91e33cbf3cae27cfe282e25a7e2ff6b6cf718f0b182d0224f7ee3ee1c7342a4e804d647e2e663f26b4b73456c8fc5e5310e40cd2b12c608af4ecb782424ce25e9335a45c9e1a542ecfd708e2f268e335a206d3e569aa3145fb3c161260a06cec63828c814d345556aa8fc9280199dfb65270a242e677d11a9f704d7e18ef632c24b4bab84dae010345e65f6d21c66a3091996609323fd88a8d50649642e69610c62832851590f93f295f1064fe8c20f37744ec5382cc5f2e507e326eae2c507454ce96c6ca97052b043f0c43f0c310fc9015861bcba525b49a16592cd7932b0a96d84a5a85302cd68721f862f8228bc5125f04d72cb23eb666511c636b98c38db50a5fb4f2e4cae2cae2cae2ca92c3bb0541092c3d4c11330882e096432d0cb750f560a869ccfa3087ff0395c3ffc121f8ac56d22a840943f059e1b34098d5eac3cc0a597a137fb6fc6cd9c61cda6d0728f2628c31a8f5af5c59c0d5caf5e48a62e54af2be70b5faef03bf0757ab15f8e098c90d043fd68bad4ff3427e0f3eb9b2b8b2b8b2b8b2406d4a60598014960538a1a74810638c57a3d67fbf9f2d16a7fbeefbbaefdde9f3debff0fbba5f7dbf4a82c3efaebe0eab5062df83adeffecf969f2d3f5bb09ed254f0610dbb9e5c51b8a288ad99dbaef7377f32cf7bd17b56cb5b8daadf40f0f3c296e39a6e5cb32bcb97c1cbf9e0610d630d6b58c377bb77b3bffd40fd68b1bfddfb546cdbc6c3153207e9587890d203d3c6c3140f4fdbc6699acaebc6310665db7eb67c190b29728bd2d65a6cb5ca9da2ee8de92927ba4da57fb6fc6cf9d9f2c59b42aa2eb696b3d6e2cbddeb82eaf04b2175908e450150e41558a44471b14879824c81742c528cb8acbf2afd14fb5ef5dcb35a9c1332fd148631707c725c03ae19af99d44fe4e6bd2a3fc632fde4cae2cae2ca82bd29abab0901f32d30b9a06254217517fe8b772d45fabb6da934147805e5890eaea795e45c54ac2c075ad78afb957659ae2c20b7fa8f63c1b8a048edad1dbf355b6bef98b4faefaf36769bf6dca63de7a222e9be0ea4b6b2f63b971632b671d705d5c5b831e68222b77ffbb1557efc1cc78d0ebea0715568d6db517fda73b675c798b5426ae3cca7a1886188f6aea7cbd33df7ae28ec0ada739aa6c5d61b734191dd8b601098d7c624edef87309df6db771c4cd78d1c3805c7c17c2d3091deeafb5a4eae5ada7b76d5d2b4ef725af8b8e5e273ebc583add55b55abd346d7d3a5d93c2248fd31ebc57d5c902ebebb08c5293c22b47e6bbfbf634cf5a93ea69f48d5f8b9b2d81544718cadb135c7b63149eb5657b3af592157bf4d416ad69529eeb75fb556bfbdb77ad0fbbe31b67e55ac3ee652b98bdbac5e463f59d61552bf2b8b5de17bef5d4fdebbb278af81419e0b8ad4b4a6699a46aab8d195c5e26c5c8c2aab0b830819fcfc7a4a5fa1f3eb2f5ec88fd45e5b81029cc81da4635140138965072c3b5821b1ecd085f4488ff33a4ed334fdeb4da271354d3fc7658dcb97a4f19aee12d3033d85a66934740cf969fccf0de2deeaa9182f60c40b02d153638ccb7aca83f224fffd81fad192ffba939769fc8ff73f5aec0af6bdd1a978edd2a0f15bec0af73519dbd9191addcf6822cc8b183ef379ecdec1173a4d7bffad627ec60fd48f16eddeeb14e5d1f88e9301c3c58c676957fba4cb81453e527b1614eed150c4bce3d597b56d054d9ed7d1d0665ae0cbb4bce77e462ba6b56241715bcb7fa02e8d7e4f4ac608637c31c64417236bbcf1a431dd9f2d5a877fc1209a14ee6141e11aec49c53c294fea6bf2f4149994c7982c0cc799edbdd72c282cd2dc20632c2812b3bc347d0c6c699d69708f86a20b0c62ee84a5d05e37fe6cb138fa55ff03f5b3c5ae1045723f5b6438c9d89820a4f4c0017def50d0c47a903ab11a7ced0a5b8cfb70ef791c7941209ad43e0f83bfb57e2cce7dad056469ee732d1a5a406ccd0547b73531cf524315eea47d6050d7b5c8dcb5f025bf560f31404de4fc180492491a312a9223375223359949cffbb6afd3baa501efbf561307e48d99c44de0b798bc64cca5b11d992fe87dd6ef97571d893d95256f780a383de4c5401708e755ee80b2f6364db5da48d5e5acf0fc6a5960c9c2890dbbe32caec8628acc428a8c715968c95a48716bbd055a58a9a241400b216ece596b2d9c9cb05a54d1020a5bb7d6fa164d5b48d122668b0caca878ab2c76a0c5155a0c610b0ef00041105cadb61881a8036f85058b2cf48a076d6bc0c649e08b059af83202d2b76de3b82f2ae8bacefbbe50f1450bf8d9d617d73df0562c28c2139a908df861074d096d03a45b2cac5812608102d23b182fb0c00116466021831730b07081a852a9549d878515585cb115e1ad9cbe4c59d60fd731761ec8fb78076e0219bbe32f583690c505c82c3e206e57bc550ab42a5e93fb881fd3ba64ad6d1ba7719cdb640d1ee1704dd6b4ede3b898952a66b5e1f736304847b2de82acf72e0dc962b1c0202e9ee502e65730ad18300826591a0c924916189433c97a6ffb546e937f03836824eb3deeeb3a2fc80706b1b7cbac317b6010779a188be67b7f41e3cfeac020a2c8912c15c87aaffb3ef0038fb0de033f0f94a1c649d67b9f7fdff77df6722bd6731cebbdce6dc77ad6e86e238eab263129d4aac4c454a4937e634f33c39322c2731462315348dc82275821bd054e9842c63ca91638a14a6aa592e0585578107d9081efc6f2d2e5faff5ccf07285a5a152dc54a82c4efc9b8625d6a484c7b7bc9176e12bb05ab8adb6015f9e4369e14cb0b895f95bd78f99cc7985e414cfb9917b8df7e1bc9984a35f3c2f6aa578d49dcb88d4e8e592a668a8685e7f7094fd0421a3d61064f70229d4814def3b0958939994206093f7761ce8fc731d6815dd60145e2877122f1afdef3f067570f230698ef5f3c1e632e3ea9fbec752dad00fbdd5b21bb8fe1a50a891f6688f838ccdf05b15b80de881fecfefbf071ee4090f54ea6c4003e1e67c26fcd84ef7d9e094720dd7bef7df7e27b1df63ad6f87d37267d1f8e4931be1b3b18309fbf7be16205b35a752bafebc2d7bcefc6bc1a63399043700c5ef760d879980122c653a6a83eb7624e64de134520e25b1048187e3886ff8345a9fca027131349f0c531a6a7f494d779ff73f1dbefbc3091dde30f4f20ea29f07356b27aedaf372661ec640ac97ad6d80ac1fcb905be08b662ab71ebbe7b150a6ec59c4c59550054c9f414d88ae900c41bbff71814b253a94e2ba4577182f3a5220a0b90162bb1a4a5228a2448fb1a0c1bfac0061a2730d160f456cc4ea9c00906947d6d35ba085f8462c80ac370f5203845b4e4ea59634c7c3186ef427b1c84c331d6572d4b66aba7d0527ca00c2752c43d1ae7694c227963091ee015e289a7f0541026cc71a2886362ec3391770ae3a96f645da922c6585253e47d184bb8cff7b707a4feeeddb114a4c6503c91fa632c29f292df889f6eb46030c12a8108c385f51860a5dc574334b1960945600210dcaf37410af7050647586de0de1c64848275c839673da369fc2cd074de70673136c27680b4af97b81aa662045725e3296e43c5155345e822454511ba446d5ce765cfc3d77aaaeed3de07aec45084c9011608cc4187fbdcc874dfbe6d39d0f7bd6aebf277574afeef6d2b07d5dbab02fa5a509854ad1e5a00c2dfb5a4345920fc3db40024437ef085f0e7b540f03bef9b2c5027e57b4f060752fdcf05dfb672e8deaac61c9a10eade7e0ede5f11d7e8f75a8ec11920db6b49dba88126f7b551034df0b7c0812d07e25a52bab7e0c884dfbe1da5e4a003fe6e64c2529a1e087c0c16006ce5a0037e6f64c27f65c042f86fd76ab240ddab5a4d1648f55e4b4a0f2d0075df6481bcf76e0bc460d08c0cf9c12f00feefb99614550d5080c031872684bcb79f43f7ad1c3cafeba189242d90da5ba02d486d4cd24093fb1a6892ffbe9011d0487e078de0c7572b81179ae09be23f5bf275a89f2d3f519a9496c68475d3a5f9020331a655713d65bd50f1dbd25faef8a640e089077c40a57ad7347f57164d1b5d59387fcdf5e4cae282ba3c9aaaf5c2b6b414fe2d5f1acde4367a4a6b7912ef6b2fb8473fdd1a7f0cc5a4ef6bad25045888b0020b113610021622b0841f488553bdb02e587fdf08ccc71c4a145fb462a20b0e06060c0d43c3d0305adf65414dc946d8a5c11f635911637521912e0d664141494dd96f8af84583318254a6fc8a30570383eec8e94064fde705f75820299747c31875eb27ead2681850be2fba05325d1aec78f57901a95c1e1c1221b266c4b43ccf766010f79e15458e03592d172d11668c6957d24c7a60108cf7c0a0abf5d5575ff1851431f679d93e467469f0cb8298d1725ca377722e8d14d1cbe5b98f1f6cfabe3081418053402a976746c31841edafd5efc5fc8c183666c6c7bcd08c8f89f919337ec6f864060b8aa4e23e17f7ccf8be0fc1f0c198191ff331961232a8c838424695cb2343eb418c2bee737f736241b1b45c1e1851544480c4f8db9c48ac7f861e676488f9192f14f333c6274de87f32e36374ccc78c4f62f4c3a8220231aeb80df63ef67981d162696145b1a8b834f79381ed8cd6ccfd98d68c0c77149af1322f34f3313ff3313fd39261fd0ca8136c2c568c967e07593060c080d12e8c0d9706874b83b5192dcd09d7e08f69b1a258503910633e35f3e2c738528c21452cfe4ccb6358ac8781f130efc2850b4d1b9f565388fa59305ec07801f31ae63798ffc12e60c67c695823a79fc215145aca8b51822be26dcc7e6f5ee9ffb99ace386018f78614cf5188d9b052c49395c9a5c9315052f95ed2f3db23d333f3fee24cebbb359c0c2919fa8be1a2698b5926174d2e9a5c34b96872d1f449c5902125434a861532bac8989271850c2f314c96c9a1a600f1418c7d60501ac449eeb7cb91566bc5386948315a62a2c8fc1b1874479916247a63cc93f999182b33f3322f34f332323f4363e669607d5fbc90f1314cc2788ff13064c226c41b6f23bf8d261b41d898727966c07c8d25dce7be8ba618272c314f31515c9eee330c1364b62e9a48ed671e0ad0d5c61919647ee6859ad0fec98d971192f9999f199fd87899110a1086f9980c29171fb34c314e31589e6e4c149726df6f06b646a4dc781bef850c1063da940d325fe36d98791a39342164e3697c0e37c619ed6bbcccd7f81c6c8c337894a1c6cbfc8c360ad5186566847ee6698caa57a9be96f60e7e1863acd25a60078504554858367e57dc26ff4ceb73c24388316d8abcf239e19e99cf5b14aec9bfc578771e8d084e935fc63bee9189d2a288a075b93cd9cb8f373008d45a31fdb49a42d4ee55ad1e0a79579a2ae853f95dc59c9057a615be8c560c9331c6988682942261b4621a8a17ad18a7580d26c8fc32ad415d9a56d8d2a288e2d2e4a74b93af0d1fbc26bf14524c31450f7a70475f22bfd59e32d4171621c62c93b6314e369adc47b3539f947fa3e7377c887da4d5461b4d6e933f6699b094a6cb33c5084ba58af605f18210657ec63a4d9139f664a665a309d7e497b13185cc3596709bfcb12f46eaf25c2bba5c9e29edf37f5778019962e03e7647ee855fcf2bcdba5bbbb52ca98db2eb36acc4b85f057e2828ec313d85b1bf8669b15aee79100806e95ecbaeb5b4bb973fcfc5b87a21985143e11a9dffb6565388d7c9956ca19036fcfeb6beffc1a0aae54f5ace53da8b9eca81785fe36222c9c5901ce6626e0b6bad0c6575bb289ea310836942f4fe6345b1a860b1acb83cae12bd74f9a67c465c1e2a4754a155810264dff3fe1b85c0fffe1b9f7c0f8e3ec656dc72d18d3151f4e236b7ca67c4fda87c475c9afb4288b16f4a952ede94e7e5631a63faa989bc7f398ee35afa35ab9f48fd3ff8be7e826182c2bb1f16610392106cfdc9daf007310442b4ef9fdd460c5cefbb8702c46de38c0caaef5e48f5ddf8a489ed9f3816527df7ddf84435ba12a276431ec4181a3c88362009814188118f39155238e7f2dcbf8fb9a7b93c784733c1d36fad773f0ce6950e431699bb740993784185a1903688c67a9b418844884488448844884488448844884488448844884488447881b04a4881d0026105fcd29022ad4c28c4475e61317957bc2bde15efcad4d3b8827bf413aeb10f051515252545ca4c55711bfb2b13884ccc44354dc104692d1e67a2dcc6c69822ad77859ca221954910230c42d47ebb32db5fed8eab17a9885e3c0d43ca7db226c2d0a206c39bdc06bfd54f388613e90000420c2919520d10b56c1b868068494dd35d342d96d45adc09b60b9622f167a54b0344eb142e208a7441e69125013106d36485bc5a5413e9392d40b463ec850c29ad4b8cd3f5b00811879bc6692aadd398685af83e1e10e3113e0f269d7b51b9172f9b7b71ad08dad494366549d7a215e1f2c4fc89bb1cc7c3c78fb6712a6dcaae341d8bd1c629f24a55216f1122c61f838159c26dee871310633031dbbbab3cf0dded46450838c6380ec7fc49356ea3e64f50dc182a6e733fec41c463ec0579394e14498e8c71fa7a8872820729a24223a4422376b069ad5d50575c4b818acb61c871636cfd605aacd60616f142edca02c654bffac42e0cc3e7c2f7442e1cc3504b692b2e0dd65d88d01abcffb53c9796980bca95c5e2dc57b5c48f73415d3088db5adc4784e882b2a0d65ee0313dc1f485cc211d0b5314431461fb36b088475adbfad90216f9d962a17eb6709f8343bc916b7db77aab92e995f6b34583415663d2a45c1aade9efab7eb6586bdf8e798af81365419d5f9b72843088a65921af1d7fa22e4dfe1b6e73df759728317643ab827bbe1beee3b8a591ab1c68d7482b56ac40af89202e3c2f28872d0d856b3672fbed5aaf73208da9bbb8e9630a3d2096c093ba3c56785d2e4f112ecf95fbde0af4172d3505442393d82ba66c4b23b514eef1aef8d2c59bba343910bd29ef8ae31eaf045e73a36e4811030579bd155c2163228dfe2235f5315d40e7d53b904cd884c7e449690aa2abe23ef7632ea5afe827b493c602e4b8e7ded1d35aaaef5adedf31d625d155711b1d457e634c3f692c1ed357b620760bd2f33c7d5febeeb5fa8a37053fc1ba14ae275716bd03cdbafdae0662fe180d8da669af7a4e35936dc6b70b14b94315b2453a96285f48cf7e9a4bebb2c281180b37ed610c06ada6f8fe3e75dcab466df4a0ae176d8a96284da5076204a66ce17aba475842ea270acbd3104cae272c0c98c222841617d4df7bf3c53e8190c9da17da662d87c770878d49b39fa7b48f6524901bbeab24760b32ca45e7e436378f1e8e8ada1620c63429510b10635a6adbacdc128451c2286114992b856b9aa659d750ee93dfbef6f83ee7b9cd77a57def3d0fddabfe8233327cefbdd02764710e726fe6b016b720db7d4eb50db1400eaeb410bd2b6e8335c0853d8831ed08d27ed883f86fb5ab67e0f90d8bc8f9732136f0d03e78e89fd80b1ff3a589d1e8e1816bb84d6fa318ba8d7eccd2b88d46e338ad730222ea5e20ba0c81816802184403b84da3d1ba029902646c87d42f48075fa021f587eee31738820a16209aa46001820ae9ee00cf2f13feda8bfdee90423fb98ff6a00c0e2485878f87ef3514aef180b8d3d07832b8d768d9edc5e02a09e237ce00d148cf73ced97df4dbff5ae17fef7ddfafbeeff3dec3ef754b23a7b4ffbc1b5be78ddbd7caafa730c6aa8ca7b0f7d7f35ee53de7819ea7bd176423bdd17d36d2b6a634145304e1a916e39c735393d65a6b9aa669dbb66ddb6a094b90925a0290fbe18cef168556656583472126d35331ed45ebdcf21f88f8ed98432ae2b5d7fe57b95c3cdb75cf711cc7712fa321b9bf39735c7ec2126fe5814be3c4039fb07a628a1538f454eb8d2b1e842b1e840e0843710447106c859f451e8839872b1e04f160c58320b870e1c2850b172e5cb870e1c2850b172e5cb870e1c2850b172e5cb870e1c2850b172e5cb870e1c2c5fbefcb3199989325569f276aad3f8f63cc8bf2ba2bc8fc2eac20f3879f18c6f82f061732c087f1c243eff57bbf7a2da4f732b0fc8085ccef42f4a2f2afbc075f7cec8dabd7b27e166b25ead68cf8dfeb197104c2faaf157392bfdf3cfd306311f0bd31097c714c92f1e02843c6e8313c182f421761e8b5bcec8979f5df7b617e1dc3fa2bf674feee5b71e800279c20bbd7ad981319562ba6a34816eb2d086435c6a0b05aa2f8e228c2ac5a200ceb57ab678d311d45ae72c6f28312a4873fdd8ac5e8d6ea759492f037ef3d274bc4643aea6b892bfdbd6ead9eb56ac5c251a6a362deabfa5b62e503313f10fd2bef7500e203f1f3a2bad3cb0ae56409d2f1ed028405481bd505083dc56508431842172008611584991919bcef9e079b2f97ad15b3b5f935adb50f9247fda48dfac9da8bb3d6368ee3388ee35652e27d2c25a59212bd4e7ffe20fa827a9c09c2a97e463f145235aadc080466749b7b31ce396badb5a6699ab66ddbb66dab2ac4fb584a2a68558568b52030a406d325269e800a2c3e5cc1d274c415cff3a6bcafc5fad5f320cec8c0fad50bb184c4d171f89ecdf96a0e6b01474823384be89aa46e17dc3d0617652ce1ee2db54c4b237feebd64dd45bfd572a7afd3fc26b2f565a6abfae8fa2a6ceff3d35da4343b3fe985ca8afe344ba4d7372965fb88bbe7d0c9c1b971c771bfdd85c1dd875c8cf183b53c329594f80347641cb41ca8b067818557aa32e0fee0ee0670114692bbcedb18c9b6fa2cb0f02bd291b9916ef6116cabe9cd86a127cedee95a84a39ea8b9beb64c86be707a7a724a1d3a3d3d7ba748875159e618ed1d9e9d1d3a7aec14e9d0d1c9e9b16317edd0d9297578705eab3a4b716e101af2833442fe781fcf0466ba0fe03c3265e57662aaeb0c6d52c2e0534c44be296d9e3db3607dab62619a65370fad8e615796cb917b1c1b916d6c97e374c6d6ba8c7be3d7ad0cb905ebdb0ada43cdbab556eb9deb5db7d6e22bc4dacd5e6bb1e6e4da6bb71be388b59addfc5af0065f4da3e9dee67bf3149badbd9d5dc2b52ad7365fbcad8d5d6b2f37c39db9f66af95a225c6bb56b65b032acc5976b81c6dbcac6b0d6dadbe3c2e0b0a580bd56bbd65e3c646fee543bf7b32ece6a14300b76bb37ebe0ee5e5b13f2d804641d0f0836723dfbc580cd9826eb6bb16b07581f58bf2e8aa2bdd60896bb2a587bf5bdd85a1d16c772f6bbf75eed874de1de7c6d0ebef1667002b0208ccc8580d57786cd165bbf46ee7736fb35357f222b04f6560bacffbce062abd9bc59d0622af7723ed8f2c0f6defcf753d1586ded9693756ee4d8db69dcb5d6dacd5a1f7baf0eb0665537632576bc336bb18d5579d7729bbd3fd7c6b5716b60c76e43abdd6bc12ce27c67dc7bad66b39155a1603d7dadb6ab1e6badb53377c8e6a9ae2de2beed5a192c672dbe365b21b6c6ed71695cef6e575b6cafbdd6c7d6b8deddb2c51a5bdb63b1a5b12afb596b57b0366e8737cb657badf5b1568b715fd87cadceb6c7f52cbe362cc6f7e69b6d8f7badccedacca72f95a6b7d6c8ddb6dd8662e5b6b7bdec6a8c0f9c003d0165b95cd3156a5f2f10c3063c30220db7bb5bb6d2bc2c8f184587bedb5d6daf8e64b5e002876ea0623f8df904417a81b5a5614a186d2071e98a107522ed4ca812349428a8da4a4811f49e2090a1c69a1456448223665a4dcf98121091b4a1052d2c8e991440c4e8f72c5819e1e8028f4b43acbd3039b050fd11615e0792dfc86080b1b36444b5c1c521940717c8e0a03a882e3083788febbf13260bc8a8b03389126c23f2bc01dbbe3604464c1dcdddd5550d39b722d61439a942e003260da549b2aaf389e4d856b7c4251888c1c8dd6713cf217dafc6943790906312b472940024cdaea6eaa8c03acc1c3034c1d0d1f2ce35845b93b337a866c351f2c6062010617580ab8b9cb30d4348109083ba80015c56a1fd68d9f2837cb609b25db72e901dc8049d36e1891022304e2010789b200a619aa1abe17df0b2740602c716ac704261fab2a085111e2a6c2a04eca3e041185cb2bad860d7544098205542a6c91c27981c0ea7afa87b5f5c82f6c0358d9c185a6e9807402d070c82a6c3d762841124176d8c01031c41c29e00b861fb0307933a3092800cc115a1a68e015b6193c51baad87d6712bdc332408aed101610253b70d01917042668280742a211f12988f1230c9c838783acdc705a8755ed088800c30759c101b454030692c6aabc9a0757a054d0517903753a5c009d1ba6d06e8820a854c4425e3050d01c8c450811bc00b470410a5e36e361da08e9e2146b62f6f32da07f3a8be9cc2ff6caaadcb38fa85cce3c7ea19dcd2317254dc0bf7085a2186eb62a87aa2fc20e2ed703419858c82b601261556d9053d006d438542a611eae01a3b30dde0586c846d32d6091811d08014a0e7073c00e564e5031b50e20728393051938cf68b08013814c0061a66406204060208f1e1a18346000100c0e717b8608b231421082db80230caccd8aacc200a0d644086a0167c6ac0f83c0dcb13266862090d28718124aa5060069a14706e26200121245b7cb9a2a8004730820a86505611439846ae15ba6d0922a6f4a8a6886262099f1e3c325e781db7d19821c10870d8b0224408300448500518e0c30260a476a0e0031ed800941a68e8e1897991a58052020d2e1678549b06821e4c10020b3ca001402400890a54608822445c2ba4f0592cf013ae973cf546b85d72106e0fb494cdc1c5c1dda2bac1a7e54a7169709fb820c01fb849396651b037b81a9a0638e3cab830ec0b960b0d735956ccabebe9eeaa38ee6e9bbed9626b3507433c8353c0948560ca30682abcdd961045cc0093d6df26801c44c949e864199f121cd07e60ca30a86274346214c0a4ba211700dbf056ede380703cb40eaf10d36919307157985ee01045d583299084af0a26bd0593fe64b6307deb98022655ccea6e2b681c6d44130c6f060476c8413085adb0856d58385c0c6b8b1df400381e9b0f1c621f9c124c38061d1cadd33ac0843d4d26e3f074b0cd5fc6d101d103d86ed064b44e8b7d2fbe17aa18558ced069cc50e9a0cb6b2837e620a402c2bfd50006a649f2fd458d9621bfc231bf9646877ab619bd98868182bab7958e76fc31c56753432de66d86042231d6bd3368bb7bc9371b2e566e09928aa1b9a034cab0e44616979867361875cc50ee3d0fb165a04618a2829a0a0789a1d2121624a10500b2cf4a0e7118c80938218729b010a5084c81659b4d4e0c610395420f023812a70400318a880041fd000ce8d001e305b8750d32520618a8a1b68718108a0e880001c0a604311224180dcb02123c6132780f2010fe890c3500d1ae8796355050f9228316da145139880830164c460e100062f58810a483002100cc1001f861070430d45880ca1419617cc00055484e820073480810b5490820c2801040f0a40c2140e6ea082143c1102294c1b362488054e71b1a20a285c70021338c10411426cd810027030400d438256f0a9618134c8020505264084940d4300018600095ac1670566e762050db2c4e005273081132060a208064839000186b0b0824fcf8e4e0d0c2bfb165cace0410ca078810b4e600210305104110c10428a0f860e80430b38375fb080e18570b5031a538200c2861a722c2004104d9834a1da026b71b3d058dc27701cc81bb84c5c0dd81c5707e7d81bcf060f007f8c1b97869dd964f00c1b9365d8182a17303058cce1b71241996f8647a363a9364edbaea6698dadbbcb74a257c5b7aca8c4d930f4659eb31aee76f356cd450f88e8b9442fa6e669fe37cc544ff355f357f3576892966989f4fad2fc0e089d0fc44e8b3bd11f9de6465af235cf828fa761c1c79fe6d12eea9410bb08b813bd11faaaf96b93a203dcdcdc1800f6d276e4b86b1a460de4ee375cec5eb89ade9ce95ed77209275d07e0a24a0ad513a7b9aa1bf6bfa2e7ab1b857d0dcd7ea53354555540d5e4b073afe5aba20a09766e51c5a342e18dd0ff14354acb55fd7d7496291277859adea4482fa5ad84b35fa64c7555141bee2a27ee5b9595467b96aeee79e46eb820bcc6dd69dc3d85d172f11e3aeffa349dbd54e8d183478f9e1e3c3d76f4d8e9a1a3478e1e3a3d727af4e0c183470f0f1e1e3b78ecf0d0c123070f1d1e393c7af4f0e8e9e9e1e9d9d1b3d3a3a327478f4e4f4e4f0f1e1e3c3d3c3c3c3b78767874f0e4e0d1e1c9e1e9b183c78e9e1d3c3b76ecd8d9a163478e1d3a3b7276f4d8e1b1d3b3c3b3b363676747c74e8e1d9d9d9c9d1e3a78e8e8d1c1a363878e1d1d3a74e4d0a1a32347478f1c3c72f4e4e0c9b123c74e0e1d3972e4d0c99193a3870e0f9d1e1d1e9d1d3a3b3a3a7472e8e8e8e4e8f4c8e191d393c393b323672747474e8e1c9d9c9c1c2639dbdd675cdc8cb89ade28cd4e9c55c968a7e8eb0006e870d07434397c0e9f807f1c1d8e2e01ffffefee0270f700b83b0adff6bd4f17221688da0894d08020227a9f0e0711d1fbac465bf6df11d5ac484766fabf1a6d190d110b2cb0d05237d26b2d9500308ada0c428f2385147e2d1fb6935ee6592e6938dc7d3495a885e0af9aebace85f3537d2bace6248d1340d5a82a6290a84c5fde66603a2be8066e235efc3c7ebd0fc3e5122447fa2e6ba5444cbdc7d24723f85dc5321ee2b0e3edc73707077ec9ca84577263888792a7f71771cc43ce53e16b9bb0a898b598835458b4af717eeeec2dd87b86756c630eea2bb87eebef2cfed11988988573c03777f1f1576ced0a237427f9da18fae436a7a9373b373a363a3eeb5c9b3e0e3dddd73f7cedd555e9ea89aee25a4f5a886e6dcb29b5556aaeb6c699da1eeaabbcfe0e28d5264ca766e72746e726c72eca4525684a323078fd7ee5104ebd12307cfebb5756c94d0d74dd10c69358f9aa4ab6a1eed14073d4acbd70d0e8af42a4f1c35ddea0c383534db89a9ce86d0d5c76787678667c1c76f27a63ad46427bd4fba5595735912c870d1dae0be70f7d5942da94fb49644a21d81bbc770d15671771817ed10986cd869beac54822aed940535bd81a14a38afada4e65593e6cf2d7b1fbf8b1e269ba148ead7b87b0e774b83bbcf70d1aeeeaea637afb389baed99ac54f244691a44f467f927fa4435344b65bae49cf9f8acb299ba8f103d6ccb64e5cbdddffdc2dc3dc6452baae9cdaa64a4b9bbf5144dd3fd67f9b07da6b375a7ebb995b66c49c9fcd52cd3f58f4e735d4ba51435fa1209b714707719179dc8dd41177d087787e1a23b816d99591abdbad72645ff46e89fa8b996df244595b6929ade5ccddd69b8e831eece72d177dc7d092a334ab712f49bace6ab5c2a5f6a7af3da4a86969429ce2b55715ea84c56e23449cbb4c894b9bbc6d9dd6f8640149e3b3131918ef304983c2f244192fe3c42c1f605cf6fcbf3eebd7f33ce590439e7acdf5a9b649ffbedef93987d0240d1522577c55863fd840050482eb792f498e409a91a93b8bfaf69faf38863f72de7a4d64af2e4cb19639c71ce39637cdfad7d7f6b2dd63e04a7ab92fbdaebdc4a124326dd91b4639227422cc9bd6a8ce5b7639227e4fd517b9cc724984cf2f71742f25e14dc569394a63cf6d072a0dbeac1f6d092d2d4449216c8a4ef218f4d246981c47f93b8530d5e78252c01877b9e3cd1e13e7e1dece77fd284d0f6da3f91d2f4405a48f5fa75e0be7b1f9ff4f0407a7ca283f6ddd8f440f855a30edcd8f4403a68a31efd75d0ec195a791f9ef760ebbe67f1e7b50241e0b6226a8aa6e95e67e86a3eaa3e8e0d43cfdfab3a2380bb03c1ddb958e1ee3ff0817740c4010777df30f42cd1d7b98b1eb661b072c92682040e7f9ab2d3a4c104a2019e6eac14240e0680b90f8e0a10a5a637eb4cc9a5a6b801ea06a22adc9d0753d8206443cbdd77e0ee54e860a73324331f9f9799ee731fc1f63983cfd010912243901c09a26128280879a4881092a1211fd83eb26532f385259b086caf254c55f7eb3543528376a761078f044dd32091861d6e9a147dba977e3d4b332d95fc3ed11f423259f9c3088f1d4890dca4db3432d773c3ccf2d7a452e9d1f5d30d4bd13fcd67621aad33b4a8fc25e89984aae53ef237afbda43e6ca7a5ecb561df644df7129a2efd0884c70e551d55f379ec4082e4617b2dcf2353ddb01b35851de48b5cb8d949a892d3fcb37ca1e55ac25024b514b2aaa969f4b07dced2a55fd50d93a134bfb47792d2c7f0374ab31b5555cba2f75105f07fb3d51269e9f76f24a29d22adaf9e66b9a2e71b995f03a3f9adca4a207f439443c78ce855f3898866a9d0dfc0f6b997964aa49f19a14f444444f43b4557247fb3aaa8ec7791d21f1d99e9fabbe8653273c99b46e68a9e8f32d9e77aa22f23f3dc48eb13c1b63afbbde48dccdfeaac7ceda227aac1214443f47ba9c98ab4aa3bddab2933429554f32c915e5be98f4e33e955a6eb36d3f5b7922d33652f9b15e9c894bdaa9a48427f83fed169c2cefd3257d53c4da574af1b2693913ed46d84963542ebb9d59d2eed94e65fe612ba7e79749a4b4b650c7fb3aaa6ec895c423e888cd0df48ab129a1abd12acdce9cb64e6aafe3ed1ad84aabfd5f2f5a76984da1cfd8a9e4c50a0bfb139cddf4769292b9d98ead3801a594b99d169fe56cd25e9465ad1d7af43fee6441f966e25fbfc9da2463bdd48ebec55f395f66afa04091521027bf56fd28daab2f271acea3e325df81b75869a4a76ba64843e925a0af91ba2bd89be49d1af1bc9dffcd169eea2af59cd4757350575a954a2f9bf5197ca1870a41b69dd47e8faeb6c4956d69ce64d3a7bfd465a5554e86f5c189296b2d9cb5cd372e9cbd3fcf265b299d1562a89bcf6129273c810544885ed4de4b5975e65ba320942858028a13f56d9ac34da2e9c2891f59ca13f8cf61134dd053851223213884c56fe70bde40522ee7e8029944a75abb347d787ed74f682a144561810204311187cc08003038d08c30d183a18381836f725f46b0240f33e8ff33501f8c71180f759421f47009ee6df0787fa7f0003bcb0e58527dcfd7d6a68867c707c7c6c5ed0fcc8547af47c1e8ef081ba8fcaa5a1a5adaa43eb0c5db7ba5526a6d14e9786643233693db7923d9494964a3bb5d97a37702a8620b9bb0b1709f0c26f5e276aaa274a64480f804cc005588c7072e7dc9d9c6c929008a8e90d8e0e2538af544542a4c810a11f446620c0900d640ce946cf4f517348569ea6d19113871a4c7797b9188403e8e9ee2c70f71538a980072290249c3be955160d6d335ddd5d87bb430008d8645d52da36a7cc2cd37586b4fe0ab2d24c57743dd12f529aa5af2f5fdd48ea6c69085d4f7308664db0575991a9aae8d2465a55a5b4fcad042d2a4bd81eb26128112017b6990a3dec2c7d7c8a9466e90fabc40eee2b7a9ea8fa44eb4c6968554b19d1866da4d7ba8d7e5567b1df4a52d84b9ab8007335bd49d1b54cf76adab0c71335571376a2af9d2e3d0c455ab7d237297a98b5c05d591ffc6072f7d78f1725a0c08e135748508111b8bb089c100a82a5e86b1f59cfad24a85c4b1750231b4e20b52c954a97259238a8e9cdca647fe034d135c89d882209523df82132410b522da03b1e70175a67240cfde102878bae2a37ea1254262b4fb34c5d00c10946700191852a5c4d6fd6ade2a8fb08b651251bd85ed552a696aaee4451f5d5f2617b097696fb447f55cb2dfbb55ccb9dbe9a94b2742b29f227a9a637364a2f26384a2f26383b3b78f0f0d081e1f0d839cabdb377c07a7218f1d091b36393ee21a517131f1fa517131f2a707f9f07826d2626909c1c39742c298fc08630d9b01336e44596e62a9b29a9ea4e6130d25c65b3186878c1dd995802b6615b89b95ffb48bacd74cf9268e048ba8dd26da49e1990c9cad7aaa24a436b39949ab3243b75770cc04e3369688849a9c4a4543af752911f4b36917569bf5e64ba61e7565374358f4e5345653f60e77ea9db85266969be4ca37deea2d554d1a5ed82ac543299944aeb592ed94acca37d7496482f2641351c59d50d936da1bdbabb1247a70993a142f6366a32035267b2a574860476ce8cf69174cb60672964236162c2cebdb444ae1bc9ba935ee6aa2a99a5ecc752990ab9fb058698944aee6e019839d424ddb324488accf4a516cdd47386339d01b97b12558290408d4e7368ab27baa4eeb449ba6732a4e8690e9da6528ac64aa5a1bd96e96bcb663054c9dd2bb095cad3dd296024c8dd8f585374691f51676bb9229980ac54d3adc4940013778f80bb53494ad125eb3e5374894950ba6730acfb282dd775ab2a99ee7309ba65457b4589a43be985cadc1d02eb56d532e985cace195675cf923c604999c2905673c9d06ac6360c8d41dd1bc8ba91b8bb03d68de4652ea14269b9653fdcdd88226a69ca48776fc0691e99293ae4ee450c9da8b9ce5e9b4910cc2c97ce19dc9d88294a2f1b48f1062d176ff0e3e20da2b8bb8c1554b8e1ee327ad800e6a20d12e0a20d56e0a20dbeb8a865c6452d412e6a497251cb0f2e6a49c2452d4f2edec0babb0d1c49d8225b639b5822bb82bbdbe0e20e241e3a3739362b8aa639e8b233c500771722087707e20777f7c1dd9b7a70771e5cdc9122ee3091e2ee0a68f2ede0ee51dc9dc9dda1b8bb0e2eeeec883b3439b8fb93265c029c34f121ee4274f850439364878b3a56de82fd59fe7e95b2a59d3eda241552d39b1d373a37393636afad6428a9dc4b7c7c86721411730cc0dd6fd49dfe5e425fea9fe6a7e8fada4a1eb661691a94542448680851878abb5a2e79954636384b680afb13fd7327956b4e13ecce79fdc37aced0d7b3e0fa73cb8656a32d1b82c95006fc9003cee7a8d13964554b18ccd53c87383165e56902096a225b5a22b75a221911f2f181c13a618383afaf9da6e8eb57f454ff8dccbdc464bf6afe4612fa15888652748808b69154f3348d3edd3099390352d31b75359592dcddc6fce834d315c991a125752b95e7fa2a9794d01f3e3e4a72e898b9d26d441d4af712935209b695a45bdda9ac5cd1758849a9e462522abd4cf534d395c91eda6a59e4caa163e623dd4698944ae829a434801da8e98dac1455b081dfdcdca4b06e198eb5dce9d1af2891bf51655bc996bdac2c65b397ac7c3dd26a2ef9a3d3849d331f1f771adcdd486d521ad9db68486d522ea96a297bd5b04405156a740e6992a26b093bcb186465ba978ac84aa51425a2aaa5ec87daa434a2ee1b50222ed85e5a32d355f55152cb253ed4f4060707492d91ce998fcf9aa24b4b3375682b95a9918fcf5632d77396d2f880464aa489c289de87e8d7f21fb6d7a5599aa23fdc9d68c843e2ee30b84843048300175398daabbacfa174afe690129a1a0dbdf6928af3da4ac41470709a25d20fb35c4b1790ce21486a29c4e5e31ce2e3b56940e2e3b3a4966b0973e148555acba1f5dc6a0e1d3325e8d210935249c8109100084144c88e121f9f722d5d80ed5535d5741ba1e185a53286bd532120d890158595493274692ba148f68912114ad1d750b9962ec0ca2d04566e2422492f54069494964ae95ecb25434b4a29520e1db373090a7ba1e9926bc3d01f34f838517368c93e97945221ebac88ac5c4fd48999a248ae3dc3561a82a5e592a5998bc7ccc76bd3e0e3f3da4a7c7c60ab3ab4a4966b09830d59cf6d2e99af9d0220870574c981bbd7e0e26885abe9ccdd895c1cd5743d37ce52a94480edaa81ed23989916918f0336a44c4b23343e5e9b06f53564d6e4d0317b1c3974cc68f66ccf920cc190d452888f0facdc4843af244a434994600e68fd5881bb17c0c5e780bbcc9cf1dce4b0418d4ed366cbca970adbe791a9aa486b69c4084553231b86beb60bebb9d52212e9b5964aaa19c38aa2b0721f6992ae6790ac8495fbc88aca90c0ca8d44a2414ed4dc4736ac4c8f966638328d4ef407acdc425e496248a2e4c2766222d9b33d9301e9b5964baae9c23964492915c264c3ce21aabad3a3a025a55488bb07712041eeb27d9e25d28f25a554c8aa0e3529653bf5f1191a1a5a512475a93c91ecb55c911c9de651a9aa3b061e7e702500210f3044a03505cce1000a38e1844d12621e1093e5064cb8a0430d847e6081079abb933fb2a2729d29fdd0380064b8972eda60e24d76d290ac7ca11cf00cd4f8a273a363b3dd46b5c0c51aef4dcef2cf12697d24b5dc464626eccbdf4a4a24a49789b4e4713cba9e26ac4465b0bdbe66e9aa9ee8eb9bc84ef455f3a67c2314499d7d93a287eddf4567f972f716dcdde5eed969f8015ca47184fb96151599a7126c27f915d6b5fc722d61af362997c8ca876dd5445a1f76968fa49648bf61e85912ed99aca4c1c707b6cf254536ece834915ee5eb775afeaec1c70afe335365699684a2327146e6fe3e1b86be7ecb8a4aa457b9d373f6b09deef5dcef739aeecec3dd7b98b0e0ee4af024b8fb0d2eca50e1b06da6abce4d4f8e9b1c9b2298cd36d37547076c177d1358b95359e9240905dcddc8451914dc61e86b68c3d0d34c571c752b315753c94c97707814e9d02979368e4e8e32a747c76b07a643c70e8f9cdd63b3d7325dd5a2998aa3ae3334e9b5915e38ab79147403dbeb6a2a29a12ffb7393f42a8bd0f477d19fe5ebd71269fd3ff712fa28112c527071866c45d1f4f75199a2abda84968b3372969c09315fdc3d8553dd28ec61e546faf5dc6969c4dd6d8e5c8c91e26a7a8373b36ed55c4d5979a67b65b25f56aee7563ad1d45472063d897157daabda44b559c251d72d93954b38ea4c36539abd705474691fc1b9416848a201a814eed1a6410c3285cccc00400000000063140030381c12898583c1681a467aaac70714800a8aa05868489908e32ccb6114428611630c1001000001800191d126086bb4de4f8804b57327decfbfb31de3fccb31aad056e029235bf37b5a0a3374e8a3676f7e7116395e8fdf8b61b87fb537a90c0ef0ee715ba616b8fa01eef5b5b97fef782a11688e348ab24beccdfe2f4ee082b5f42c0060e8e00ed5bfa003985fbb62f54369fe9bda67e6a7a2243a841e6320679e3b0c7e8c51fe18f223b1be3dfed586cfed2943ec43b8064230fc928d643f7d3cda53d927c3cf9e6b96db2d1c5ff3830be5c9a156ec98ebc813f936a3cb86496875cbcdaf28492e4d2810b167c8e1a3afb8fc37dbf03fe923f2148c834bc572f4b234c9aae35b7695b542e15ed949cda0c45a1d288053d110523ebbd4b38924bae39c22c978a30517de854bec437fb64eb26ab52d9dade9fccfd7a2fd9b138dfed0ac917aebbcbbb1f57e5240bf7ea6dc27dea92e48b9c52ec7c15d1898cf7eb4175f6e28c121e9a704ffd9ec1615ba353489ef152a8203fa37c5ff03e0406edca3633af5da54bf4f014c87e8a38583c6ce5fcf3f5c4e8a8e8df6183fb2ad3b64e3e9e610504cbb8992ee53ab6b2c8b094305402acae1b073ea015d43a776cf7c3e27c87f4c076999eb675d35eef885b13e765e2234c981079701e7c27202d05ea28c1e4b506801bb9e7add9ae26a9779e6ffc9887978ac9589ced472a561270f41b8656918fdf35710ff8d32cb2a0fd21cf67aeb231fa60e5092ae98120d22fbd7338a3ef1d0b343bcdbfcc3a440ecb234fb9fa4e32dbadb098d48b19780723ab84805a8c8cdd9b3ffc030786128b6360f09ea2735c6be1d025f8e434676ce14ccb459742bbfc46161509dfc4e38c2ea9cad845b9b5fb22e1f4c9c8c88653ffe704bbcaf12c0b669f6439eeb8e1f8dd18311345e549aa40177384dff464fda1b3d377ba1c87aa9a84387fb453655759493cff6f031da0999aaea61e9b609cee34be630bd075b843c92cbf66b544ac627cd98ee25be446b43bd918eebbe6bfb232c41e6559ae9df4cfb69b588238d288b68756478db4cdfa23582967e833d2ced55bee629e5b90c705027077de44126ee7b4b38b72a5489df8b915a3f03c220aab02c557e76e3d5404f35929ba16b7a284668c16c2f156da981aa60a7a93a93b7c2282b5f1be56b84fde44e5153bb5e659179afd81a593f072abd4d5fd6f39847c1d9d59eac684cd5cc4d671adc47fcf5e0672d71f40473eb23c6b2bd8f3327e94b2fc31970895c1e377ef422101fefe1b7f7d37618f9ec6be3373629cbbaab2ddcae79e103c1da04e9d638a71d34ddef4243e706180be0f12dcbcb51a1c391ccac3c9d52ce0885847837b1a3bfaefd639df4571625ccbfe3aa13c7b336dfcb6b0e0b057266314d3cba7f85a556fa187a2ec72067e3b96d2f4e3bc74bc57499832888386a452248ab5141800f3812e05b3be2144e48478f42ea93de755be7631b5baa60338e92d67d0f4b62bffb3f33fa01c0b34c451f261a7ea59c6e9f5ce3c36de2c2e9eb2fa5d38a357ef7ce55daf05cba3bd3eb1ec19047cf88fd01ef930ea0ad97173167ef4ee5f069d5656d90fec6c04e4f8dab80f8afa2561bd2c2d2d831abb990534514a447a8d32a706cade71e68b8a0c6e411ea6cc41ea549378890d251f61656eb82d8d86ef66e38db5e25b715f2df05edd218ff036c6611bde6a63b248ced51d1c154ae98f6f1b97451748992674d8df0cbfb25064741d6714a1dd4a54ad99e2ff566d7d4c0bf873c3fdea210a4f5a82eea7eedda6e7624eeeb4a5cb9ee82ff71d75862549643a6a1301ebf6c28793f086945a05c0f610702df5e2b2777bcc5ce1a95e6bb3f8d63cd88c8dde2ea5faee8aa42f029352771094938fe413615bcf530cf4d635649b51823a7b97e4122da46d1febb35efdbcd5f31c6b2dd8ca87dd3d581dd84bd22e983b7771747fde0e2c202de419bb74843ac610a1e293ad87227b146ddbc4f07fc3cb7f91660e415931b601be53be7395d8035bc91bc0d7733cd07a375bd7d0542f634163df6b2fed1539190795a7c4b6b5e960eb3d12b3902cf61e997656ea724ecc2575f35587db9cd96782480d40d9ed227504908cf5fa5ad42c63fdb6d717c92e21f5a012ee7dec3f27ac51ec8cab3ba32042cd60b1837ac90f0a8bf4301f7666aa32ca2215ba752ed1d86eee2ffd2f72347a5db9562e7bce0467c344218b92a8b68512219fb1e0687171fd85bfb0d5663d07c1069de5732086458f8ab1c97e9af556f93978bc4e226f5c775e7d1b41025b9fc4937a91b0a68611c85c74931cbd20eca4cc04f92c4c5d72450252c6658595df45315a29c227f462eb00e5c2d0f5bd4af47883bb78cf3f28628714153225b37d4b8a64d3c345d542472afd95a3c4845afccc032f32e46d755d63b70d60ff53311c768e446359bfc9312c999361de1e4bc0f0e03508d0eb4649c4e7ec4d55ecbc1a07549cdab34578cabf7ac31962b68a17dde128db73d159c2e4ea5b3bde496a3457d7ab4bfed4076eb5e2558162330124eeb703fba618fac47990efe0c68cb4a1de243d8d2a354082262784fb883c1f0898b3deb3a3a595cecf609e62695ffec8e11bd2d655c16e0480e12854725219b2383172056672c0e3842e4cc7ffd2eb0bf214b7117b5637e651cf04d9f92902e24262a98fff7e4fb7e1e1abf66e08232917b43db76e41b961e778e99bfdf7426c84d8ae3edf1ef969b17a4c6296e3e87edab5bba6bdfeb4fec9941a9eeaba65ea89d75d7bfe6ce1ddf370e4a9e07a524b1cdf271c3765c9076f9ad03a6c55ecc69598d6123f1556f3c08ff6f0aba9f2e671e3c1053e6725d6c2bbef9ad588f89df432ebb86a775be9b1887377fabb8139286309ed6e6945718dcbd7436682975a894dabf42d91c7d149694cb1c8bfa23d693cb5576f17e2f4154f25cca3903f7ef71c1dbd2b891cd1c1ebf1e005ea4d170173c5a03ece33ae77da76037f952860a406620d986fd5f0deef7aa8c9d6a8c09cff3d096bf6f181d57a2f868aec61d860b04ed5321d9a1f74287697ce2f6cbda7c4080b4cb3e394da9ae70400e63f160ab42c847127af76336238eef21d2e31674406290bb7d21bf0963c9cb40c01d86342b66ff30c7932651d7ad4ad45175cc9a11ebd83f046d00022a9724acff48226cea6ab0448ba28a384d8f9011a5f34c123d7e93f1b2ede76c69b212cb021539c859c326ec9620369f9ca2d375b75a727406163bc71e0c6fea9f380761d930aa5b70250eb72230a224623259c824044d33b2d6e905ada21051ee7d1c9d0cc89b600d5a07463029a165fdf933a841a8d10499c5d7748da9f72d9f69405762f945c3353eca5ec68813fb550043ef25ca8ba3d81e21a2807aa8226feb7a9725d70d86088191e7ad3b7a0f7d0d55c5974169684073fa1db9453281a184f4470a01055d79ff63555337fd045abad4a75ab4b53811f53a9a1f72e1624711a29689acd6e386fcbcbf70325afced9de9a144c6f3a8697c2524208d68b45960789a601c4c532c1eb08ca607c09b1efafb3532a9b0e539eaa301eb52a71afa3ada804459bbd3f72455b38a62c23760278becc0e3942f602f1138686c9d86c07af9936a1d78687204a65349b0355c7d10a6017d8df495d0638112a3190d7f1a4e9a798d25017ae16ca02d37f07679b39d4c5e158b65cb8850312307e84a69c2a2b989f24a08ac1d0141e828add35abdca3f47227512ad4899aed7961ea29aaaa5e833752e4bf591215a72c1750fd3585aaf1dca3e8f389e5c0de4acaf99b037850eb3006f2e19e0560b854e374d68a66a475e89c3a0f1ee4d71174a123fda5d4f3cb4a5a35070fbdbca6372e4a669ced915f7ba23aadf44234a4d67d305b13cda61f18f8beef1e17d9614161e2102060b1d2ac6e4488c4969cf43ace7d50ee24e7f797fd9d8128361adc3a7dc4a7575ef8b344881e86717f007a9af1bdbac9fa0c39c41c258f5e81ab676d0aa8d7d94ebda408135ec116548a32ba660eefa0fc581241d42f2316e2205c0d9fcecef655f934c6501987584eb2bee805f1ac3d419435ccdbf6a259501103d334ed2e9d34e4bc32c750f10e2a502bdd53cacddf80121358fb3b68ba52f66d02cd7b6597c45fdb00078c488a92d0a2dfdbfb5adb363a2bd4cb0d2bd0fe343f66aa39d8141f6df69fc2fcff74eb05c99c0deade8a3ee8248f2fd3f69e4ac92f1d32451c0f9ee4bfbbbbf727c5ffa62b78aa167025df63d2f84f6bfe9e4335a44f7f4e5d0f6aa98fa614a61ab2cad67fe8fc9d6f4dc39caee7f9cd22ec944efd96cf115942e2ac60fb45a35549dc387bb0254384cf5ffed1acab9db16253d4ed49dd9a6c4ad8b9b07ee7f3d51ffcb3f825730d5ea19900e663775ea9e53b49eb66a8c5efd0fec48747cbbe14a2fd18fba6ac22610f82eb2f201b129b5cff358024ea62e7be996a1f84564661ab27e6da76cf5315bbcd3e9934b8ca3ef62739fbb8759df6cf9aa2b2972c76b30554cfc17cfee958fae61ad137115755684c65b737f620ed0fdf2803fac04f56bf5e42714bdd80d2dea97d80275adef6000a20f93fe671a188e8f2fc1b027a16c776f576f649793fdb8b1d53799cfbd7c3d480af30dc844ab37bf13949448ccce8a138bec9370cba3de4c46b56e30bd628e5887dc8c85347c5f9f02f304ba2691546291f89dcedf4b7c14f2f87292cc130723efd2970a544a7288cb9172239498dab95a5da793374e546a3ffeff9e647117d7c1b7e3e3361c61914ca18ee98d93339c811c03bfae6c47d37c7427127aab8f1c6c1373492b2a14370878187096898e5dde5ae7659f9b0d80433d37be3671b258ec14036c44f172df7c3baddcba23c5b3dde1c17c0e0a3c6e78166dff91786d0a7f12af81de21e0172067dc5f7aa5d257067dfb44fef3710b72c6cac680f216df36777ddd709ef90654b936e757c43b65795c8b4da0c3f3a142f7e2eb83fa7bf108f480a7bd7c190d0ef1b7422abda3566e53d208469bc3467ffe63af78cbbb9f7b4fb197606b3ea13500576bcb9399fbfe42e7f0a576df990300ee6f70afdedb82029eb97b78dde5666e81be41d6658a2159765ebcb3fe5911a78d78dcba89c574c17e37fca3dd881fe78b1f336cd5b76cc7c7c683eea54e7fcb3e9be0946e1fb35806f338e81a407cb9285f4f6792839868efe71e44978350bd858b7edf874acfd93e897f149ca0bf80ed4d7ebd2dc35ba5401fa2530a99e1e0fc47f51e7219af48f6bd2895a04c1cb3b1170c9520d5612c426aef34fc1f672d21890f0c5362b7110de1461b3a3f4969e8034bb80417b5683aecbdd2c6caaf3bf4db0fdfe34a5f61b46848dd4aad9faa25a865b8f8cec91ff29ddb525f64606e9503f58a5a0534ff2cf22b48a014ae4a922fb6cea4f2e0c1fc57a41c7fb5598a99b7dd5e172062e641629ffa011573103ad37eb07566f7f26329ec174c012bfcb206cba4c0eff4919ed5516648af71df7a8733c3f724e43e3ba2a9e2fea25e90b666eb51307355a58b5af44cea02eb615d61eb23ceb189880800fb66a571b9096a81858ffed4c4763aef032eeb60491faede72f96b42b67f7d57e451f731980669645c3ce9d8d13026cc72d3fd6ade946aa47bd126823030ae788d842928f56eefa4dca27066633a6c3fe1660ed0f3843e5a101796274b1321f618b35a8905fe7690df74aac9c46e22e4e8a9ef77026c8942a2753768d016d2aca61ad9094f55b4c57ddef34368e6353ea71782235c3fc37f067ecb6bea1d97fa2f74443c8c4ba4c111c87dda1cc6ed536d94ac539b634ef4549c065bc3aa0a599577db9a8921dc5bee532c72171f03fb53be98f4b8d220c1d6f9d6f9f6e51c5fec391cb01ed9d3eb491c0af936c537c15b9116e801bb3fce03cf4769d2c1e9fc8c80218f40cfb1c1e46d139859a766f50379368958e59a75c0e811d87bcf40760086c73a41026b644349d0e80f929d96a91e5d04de3b68fc5fb6fdd4bacd8640a5668c3b087ed53a6d1133042fe7941a89bb29f84e7d154caf8f53e2d911e159a51898fb993a193d4db38e54df7239f811b45d366623dff3216a3428515dd3003d87e8f94b3b138491cb66bd385dc15567e7993ff113f93579562d6293e88630dcee9ce889c648684f3422e8da6332f7f9e0fedbcb78de102459bef4b573df941873dbb1f0f367d514733dc5e0bdf4cee983316f4bbb82e82c2f21157cc132a97fb24962b12885651f50a597ceff7d151730f66b6df44659c1b7a69453d3826f7b6be2c2e94552947fe3cf9d3a32733c60496df321341afe4dbb846c4149f1f331b2af587a76cf3545acd02e887cb22250349387d8404eb0b31b586f3ec68ed71e21e0db63c207350a88d0533cfcd35e112a19f8c420cf3571644dc54a0890be565c49981d1ef33caafdfcaf63ffcd118ee4371899e399a917676029a4701da3e1b396052740f1d6adf19c255513df4e9663d307e36aaf25cfea8526e06b11e9a652f55ce92df88b661f5b8ae64cf3df72b1f54a27072cef22fc3d3d4cec4c109e74bf3313879ed85185778119449985c640f4a3860dd09bb74ab472173c3a2d3824dd02a32809f7a67cd89b4c923decda92a30a82e9fdec88045489dc172ab8e8e9a4fd09407812b724a94ed4fc5a3e2cfb1987fb76c8749112e499bf9651c64c348a1ef818ed1a736ed5e54b0ee2a4b548607400973237d5ce51eb2501a97ab211c2b0f3af941d3674a22d3f9256bf6dcbf141afa3aa27dbb562699b9a884132c1795ab2224e0e8ad79c301f24e984d0928076da3bca3c9648f6acccdfdfcad303e47ad8e9ecae88af6c86468c985953008879c36eee7f823d2250802f6a199030d8456739f3584dc801d391ec41f0f926572d3e9f2b2ac50b399a1c5eedec2bce0cfa61aaf893374302925ca40a891db9b71643b4bf892021a0ab86fcc4333ca7f43b0285f8952f768b2865ce83bc29711498f5d8f21a834f7d767fac092108e491db2cd37045ff554bf2b9aa60a16232ed2305db94d38e2c20c1df2fc3b6b6de9b4fdc95edb6b0c7aa4a5d783e338bdcd71a624be27159e93cf571a15ad675e03655b5a03a50b111b0c17b5aeeb19675b3c12ece45325fbe58bd8ae8635c5d171ad86fdd71d4c79f7947fd57bcb39b51d76c9adfb49427be95fba970c5aaa8bcbea99194d7a930a90991cd760ef2a969b7015c7c2130ec992032404dfe06ab0af7d72e10a1a229f345e65ca453498010a809b95ece235b39b4b0da2d6ff6410c68cc27b982aee723a152ff2e57144642e18881c850fedaf9aa83fb06d9c61120808d1718c618c3ca442c37e6638c7d12298a721197ff0ac23d46cbd7dd3311cc28dfa27e8cbe0896e9a9e57c602588e4feea4620661cfb76154a9939c0f3035ec9597f764b13b998295d33a155033e6d8018fc5ccd3038a23703c579d164a4d50e10b2acf810fd68caf4400874741446e796fb30309710038ab8af8edcb796022c751e5645744aaf1d3761119fa63a2ad69925221118bb2ac164a9616bfa89533e70acb40637675dfd38184d562bd4036c0cccee6b333da8c5b129f3b101a21b32c33592a91a40b0e28a7b1baf39b7768ac99c17d3746891b71dd5847a9d4dd2210fc97a54bfa8eb40640604b8ddce490687e68e1cfc10b2cd97f2ee0b9426765ca0c3efb4d0a65cd500e2fccf607816f8848e3c1153514b222e50aba338a88232655a63435554bba0751d8e16d82fb6ded77eae141db45074b94ead6bd92429a57fd0a85747d5f6e7e5960aeaa27805677d6f4f42efe3bc6938dbc603624d0c6a8c5d9788f061ab732f453f793038119f29db845f64dcade09807fccb183841f7ba6c897d7134b43e5ea1c99090fa6dc19b5f5b221344d7cae305c5b34904e43c92424a028aab780f1c1d7d4cee6fb6041ebca43dc51f7b3c14874d3c8a369008a116155947a2de63f6e2a96c3b6a8738caca105c7f48e06807b401ed67d9ef21b4df6c4b1a31c0eb8105e16ab3531bd263c8e0d3ba52382324e472561176bd91c47fde0bdf67965f7d71b84c641a4446d0d94e49078a60696b761852827df21b353726d592768526c838e5acfe2cf80d08f6af9a652a548900023748154ab94009b555db5182861c5a0ce76f6baf87920071b0352a1885a1839312f3bd43a5dca68260df407b55e0870ebd1658e922779cfc9ea9f73b8969365a9407c444f7a8e0fad00e294d74b1e1398802cc7a10cf7d098015d3d6a8db9164c64d5c5517dbac3fd923afbe01ffa5434eb2e6aaaf3e8fcc3491deacf2c06e058536e4a3d79436da88338d6f036085d3e0e0c6aec5e0a09650ff344b464b754b5af75979691d4c4fe8e2560be545baed6800c4a7112c063d5303838a8a5be223516b435c94e34749a7cf03f6261850d9d5ce9f799bce31768655c1dc6f8cf6056b34e5768e04a126ddef762d1e0e93f0b04f192eaa00614e03cedcaf7377faee1a3dcb79d1c4fbd8bdf38539d97eb0d518949205d68783552797a4db4a722936800fb6d0203feaaa9863b465a6497a18807626733846fc2157cb0b8cece30fec23a287b92e98a743fff965f70771e22a06d169e92c79659da7efeac38c0aacd70156ed1ded3fdd6bac24f26f4a2fa23d2aa52b7dd1f9f8670320328be9c7ee4bbd6c417b8c85681f2658025ff821d51364ed636928e3c01e353c32e3aab9add35ea4bd170d5e96e35c555af76100385b4c53a6d6bb89c6e92a570535131cb92e1d0e536f321fe0d263cb7b9cd0e332908fad3ac372d69fd40645a442d8e66ffd0f85bb1ffb495373a9d4e12418af6eeb6b156531c1a0eb3c10ac1dfb694eccc3259d4f0335f7c9119994b57815f9b8bb8eb043212f4c3c85d12cd945b44a69a367f3b988ce56ffbe2148a27518161adec6d87c8c73e973528eb5accace373cd5797cb98c9aff8431515ad46c4757059db9e288ef73da492a1c8fe1b36e591ece951cc33a0e6f095ab2ff1ca56a6cfe1735edff8887672d7156acc6cd223d26dc1996731ef8e85427c847af2c2a201e8bcee5077e12ae99e47ca0817a2f7c29f5a0a9c48019a1eaa1d1b40ec9458987ec17d36b25a16850ba93ec4f4fae7e01e2f4e16b15d158e268b845fed368121e496f7a91e6b44f26eb451c8390d5dacaaf35bb2413a1116babae033059e486f41bca6a1170a69c06d5d9957da7a345c0a69592a1792d8f80c0159a45bcc091c88e9f194267525f12dc8e26eaf104ad1825718480672a464fbe62f4ba40ef08a43345da8a961063af4461c79cd4203927d1df21bcc65410bb720e787b52da46efe3d1ac3f0ad1290fa8139716c48d513ceb207532eab764a894c133857341c3b570b26da089e2d370bf800735f7562b6e87d82de4f480472bf49af38a1161c41f21ec9ef118b791c60a40c5ae74572a8b7c59ec5e1211199b42e28bbe97b1c62f3427233a36a91c786857cadbf536280247e156b986438b7f2bdca145b74358c45b9676a1bffd1fa240be20c5d455f18759ebd3dbecd828797184b55153661481e9271cd04c41a3f1e496a4e638c96bb917956ccdd0bd430e788c45069a94ac03def66e1c9768c8292cf81b24f1731d90c196d8adddf5b5f8657d335da58dc47bfe2c5ec9377e4f4a9cf9f7177af3f51563b114a4d602d68da652951fdd52db181f81b013706982d112cd26791f89e0e1a3dac560ba38980a567bb381fad2c6601f7031337cd915424455b319bb29e921cff6a57f7302726cccacb5b7eea3fe1f68ecd4b6f21dab1333bcd78c800e0c67e00dc504f9e03650a6cf1f62b2311c9fc8bc52cd828281ca8810c2152a0c0b913bd18f5bae0866440ab9b1537c87bc109d5bb34d78e9b57d2b746707d6d63803033db6701e93370fee65435235e782e0923191c35f5c0498970dd6c43fcee408474129a00feec9101d2401566d642ec23c60fae958eb3bb20b202188e370e7e4474f6e5d3d44d846248ddf75ad1fd1f3b0f9a5accbfdc3c7afae511bd31bb4f633be1989671692496f1d69b1964402a85438302f7e468e7478e440c36669d405a1c840122fb9b43b217f1dabfee382c0f732b5f8f3ed9cb64299fa1dcaa2ec2f504e6915baa06bc8810d4cba6c4f6199296c0ff78bb324efd60d39f592a62f3ab6439d437583d155445e85cf6e97441eac10ba28eb5b6fd48049d68cfb0adcc01ae752d4addcb77da0e2c675a365cabd13d5b8e5ffb608b0b137516abf5680d12c23ffa4306dceabb7cfeeb4ed7b89d8efcf38cf0f29ecbc848b24efb296790bee6e50b98cd068da32650c8e478070321898da270bd2ed00b0f5b0450320521480cf1a955e60ee15f765bd8a2141038fb0b2c57a8617893ccfaaaa37d81d01de62de8ed18957fbc4c5439edc15e5e4178000204151726e620fd96294a689f841bbc44a3800f0e8d85b76df1d58c8569c337f29bfd3b209d5fecc9695093ccc4aee86f411d6c880134e8ef2423825676a4962be02e82ca65110bbc3765d0f98bd380827a2a7ac2630f6201807d1e267b6df56ab093f9bde4e4aaa5df26ce9fd4476468556054359ea14f39470f8f950d1bfce3f11fdd52cddc958591009cc90e406fdf1eea3e02448d2b015b19041757680fc488af78fdb7ed58365149d931ec9334445a76101e3ccb74fc48ae8504a233bc201033df96d53e4c5f9380903861fe5eba8a6f7e4084f73c424dcd22a23df9dc4481832ead5be9669b6917839b4390cf28951a654d90e91b4024f3ea820778630fc20f89193d4b4c8513a3c3b37bc68e0dca1358b0865d543aa2dda10117457392a9f4fef6a661461bfb287ef7c5405b773a36fc928aa10e1528e67b23a3be7040108022f495185e25b39b24b6bbaf1837a01af907a655bb05797afa73c450c35f4bc0b930f9916586e3ec088f6aa53a9cf92a3a37a79e3b1b323c11beca8a192577e75354e6228e23f987ccc14dc687c54740277efbb74444f86bc95dd26a7c077625ce6c4d387f51bc3b32f4476061830c4d9974599c8315f1b9f22e697a1e67dead625c5bd47d409a597b82cb8377e9221fb0c56fd1c226c4efae955385422f1a62455c2fc042440c74da3e06e64d36c936434b3b82498c2336795a3bdbc8be5a52598df715bbdcb8ec3450149ae653e58e5634f905626c2aa222dfbcc16eb113d9639b8209fa2f6f3748fbd8d73413f545eb63283f988d10a6d0ae3267d77fcda52e09d0bda2db126eac2e61d48030235b102db59b779238055e076604706ab0ade95df99445926de6f5ce5ec1575e985b104df7635fda0609a8ed3ff1602fcb3a1579636e9f53ac3b1ba04673eff7c3f1f7e31a97cddaf2b62fad24f38dc597e0f4de32135fd71c7a8314a3e369354142366977bc2ae1f482b54dcc3120aedc2977e83daccd499dc69a507ddcc4d4ea4bf1928272226f1822721195091beac5a5349f13a841cc3333fc80500e3989e028114c745f7aab23117546f409e2d06cd3b17643763944ef667a6f3b82d5460c5d8af6794a95361741209d9aa1407d4cc82b738bdb7606051153d2e5ab8fab7375107c0a9c28a21a6fa62eae994422681fa060f7bd73dfc21d60b79ca60fdd802829f19e202c33f9d992b3e960371831572bc346e417f243976cc13e3624aaf3c483003294e08aca7ffbcc988e418811122877339d1ee2def03bae0e6dc089ece86ba01dc16651089faed20f85dc8aedcc05b3137b04cab180b02091d41792c4c90f238c2c0fd1df475447fabb532a889807344590d82f2b30823c3273236ded80426870c140cf6e74b39718e5b5bd1f9219ebe2e40606fb47e8c0c380b8c3d563ce6562e2e90420d43363d8a0d21baa2b73dae8a006fecaf14e12ade9f6320d826638c39660f2b3a878be09837a7e8af0689200206f5d3e5004332cea671ad80480fc5f3191611827fb49c3fbc242b4d3304b0bb10c914f1aa0a60642a4748690e09334323eb1240127bfc955aad8e75097eea639dd54f5e66bb2ddc4c7fd615abda32015638f806a8a0b43ac3b4e4c093b130b26e5cc54abee0512492ea221428080c451447af1f0d952c53ca3d2bdcd651f46f69dbae68cb47e8892b5d97917c13e26efc4fb142cf5efde9445c214d2a4b7bef4e4ba902df00036cc3a35af4bb299df42f817630941ea9d22fae97998a9e6d41b8e9bffba2d87bb8108edb55ee508e22daba248370214722d07b8f9382fb373a6326fc098ab734852d6c92d21dbfa98d5d07f41dd0d3b202a36891f7ecc3062f27b8c56cfb7dd6c1cf12087d8668a80881cb46db0c03bee7c3344c02c90344abd51956488c5c7e90a10847c54cf79128f03f346c550a62a18ae15ebb919ba05ebe66a3ff2a71040b334017626e98613108a03aba29ddc83b41a252b66d623602472cbc2065d11eb99352fcf119e2aa8be99054b4deccd283add8133630c7992c789495196e9f9eea88a00f63055a4ab2ce8c790815425e9300ba80a4c22850acca0be702e1148138caad0a8d50095d84891146189f16b8b7d606d8ac12dd357bd79e42ad7f68f1ba25ea749272b934725002b3084ac45dae1ef4d635569232862daf56620a5088550ef617e82b1d7343e7d82ca3e90b8d2d354bb64cb474fe1eb6ae4066754153537b0f9a3a80f54b605c2d8fd3698efbb5c4483cb246dbf702d24ff740ac977a72d906e5cdf9ecb477cced89a2a198b7a65ff1bed09c5cb4efd0c0b1d0146218a01da4bf6cb03127036bf91e48afdd7bb3e240bf568e352e2453d9b7be71886f23e72d85c5e1a01193cd2ec523878799e39b507d889f39e95f390d25267b9b0eccc4c8f7e7483d41c2e4a3ad288c04635356a92a5c8911cc88190f3c0cfa45cd0351e3e72cfd219dad5dbf4fe8e59aa735e56bdfd2cd49793683f49e86bf36ea76985ae5780c3e0b116d701cd1cc6d4b3c37633b4b1e2df9fbf09ac4361d80bda56d811d732a68da672af73016ebf69bfcf5e452b5c92db2cc77701a19ccc09fa8bcdb0a8437bc086797dcfa4c366fc4b60e8fe7e1e608848cadf556d3a174697ef8b3d65433cf0538b64c713524be45468eb98aacbe019bcbd3ad76e1d2a13586a192fbc373301dc12cd317a12841f4be1397e064b8979994e80237be853a303acd44835a5694bef472c7bd7ad2a68c1ef1b830a35afb2ea376bf2202193503edfe5e5f7a8dc47621248429646aaeaa51e4af9f9c0a4f043901abc5f14851f0787a66e54880b09962d6ba69ee54e5d44343bdcd9a2219152cdc11859604a1fc6916d823ff59a03db773a050a0f05f81158521575d02ac6bff26230608850321865eba4006a75fde92908679c5697dbb67f9322bf642fd4d34ba385e739e154fd8e2d42166658f70c377852195df67ab68352c3eba57663e6afbbf9408b449e7870702614d59135ab1ee25723bf869b2bbc8ecc14b9fe30e2795477003aef986f6ceec3d00f72488f0d26b431793567fe924dfabb5ffb98b969be446d2832252fb203d0dca8e0acfdf6c3ed878339bbf02619edb80e0361d2bdd029fd75b9a4d770b1d8b46c8039893fe0160603bd1d1dfa52d2e6a9e7ba373aed47955ba3949745fded165eeaa65902ea95d716d15335510e264314c1ffc7916c4def6d071818ab6f6d22e02a6040423f4ff58c91d2d5632701ca63dff0457b46349ba87800b581e38cff78974efb6389553a347c5e0e1679f0d82715d92ba420bf782b1c613b42bb23960ca26864f3263e57380954ea05680bf04bc1fa2b35da013ccf5550470683e41378938e073706662cd2ef8b626f8bf6b37fa875a66d952499cff04a435272caf96b087cad9c6e1860d5e260af9062b278019d593548f88c72d4601b7a83404a6260dfd4cdbed55b0f42c0d2462f6cf4d2c5e1c47119ca255e5f883e60441a1a6826ceb2c0f5c5a36deeffa2e4135a00a0c00ec90e4e6c40ff2d8cbb539f9d9931b239c0c67992eef4563bc0ae765e09d0d716544932c19f584acbec03cb1ad98e129927cb9012a70f66c799168135288853bdbce099c13f540d269cbaf22e95bd423885dead451a58ce533f6fd05e856d5ce0cfd682783a5a7c412d3dff27eb221f3b5993c08059de542d82a349664ff1690e55423731c001a544d767f695c6d841adaa9c9c368b568cb7c682f4a0a892d9331817697c249f9b77bfd916e3525d08132dd27f5edc27a11a07a1656d595d43d6a05df00fec998f437c8147d9d2422cc4ab7d716c7dee13702163a7f18accf4e915b8a9df189a106377824fd03d059f64a8e3511c5a6468b2bf150a777f4d9cc442875098ec387502df5dc3f475c218e2aee8389b95a910488352318920988a95ec81f2e13b4e57d5053e3b2e8a599e062401765ae4cbb427fd01c256ea9761ada7df402de39b71ba5ce8f48f36bb69a18547a802a50a5c77f078f23c91be0f48d51427712f006c3195409c1006177f48ee8276a413b5cb7e82f5f456d56768d0b2889423a081f236511de874f73b07769af2e679495a48ba474abf3ab4133db91be9c55435466e223d36384b6ee519e2b51a9b52a22ef18a719662a9c2aa986b3b1747399d92bd650aaa393ea4095c8a1b02a2c8613ceca1ef48888fa6283d5b206bd51cd9e138681cd7fcf2866ff372a030f6707b09c7a25cacd495ca0181a9fa1aa1e0be5127c28099a2ae4c579c655d108eb7013ac4bcb15dc59c6328bb4cc1c8bcb80e83e23e6328859884bda7772f6614cca904f4d3dca1872f8366f9fad6ed6e36e15a2ac59c1b4b818bef58aa671144eeddfae23ab1a7ef581f60a125643e19eb64c864fed08ac15bc527258d06c221618bd2bc7491b90d71a406462077409ef077c054bc9b58328376dec7ab6d63aa580fdf70dc0277cd396b612fad480101a8407ba7485faf35a149483418e82ec2f3960ef45070423d1df5616a42603963e6879f79463f66c491b5244f29aa9ad905b661ce3ba275f73518823a941840ef6433fb622475d61d8b812cbd9714474fefb4f261dfde5c640ef2d317b5a9b9f4e92d49580c568dfeaa756bfd9c564a0a39410ae99dce50d6bc44b949b503acdd458dbdabc608df262e279087463403533299e2de969b7d86d97628c0356f9825d177466d0180a8acdd0dbae60596e528501c5eadc75bb87177ceb976106c0c648eb781b95fe2c431a025a1c8a434ba711018612df0af55f253ecef243858dcbc48caa191b886da6c96eae70b29ecaa091e158668aaee7b9fe51b25c9dfc218e262abe2eaa61c11b7ca375847ba48cf335f25af3a4960ef56266429fe963897fc07903c69d80e3e80bdcc3f82bee45029bac3f377ccaf52f3147b6d77568d2d92ed948bb651dc9ca809b4ffe8743d31ba46887a9a587f41c37b35bc71c9362523f421fec45e2838254da50369d7b6cd9d579210f05cffec24d92deac1c54b59a93268795753979a4f8362c9c9ca8bdb141364631bb2d27c85b1130e75183028251d27bfd6caa2569d2182c3198e07ee110e5170f6c5d8a56f9b1bb3850ac426bafb27157b5010515ce57b0264391fcabb6148eca772b077e32852eff89f25bb3db55efb0bc6e408a724eadb50285a5d2cc60c39a8dd2e3a45c48a0954d355cd4df4aba86b81ae57bb023bdd8f4db7d219b22f0241320368910fdec4e043a76937ec662f22906cfad2e6678d2979c98ab0eec0fcffc3194f1d596605833f1c49f18c1d008450181358344832818133ee1b5592aa5e8709ed19ab52efd171c6664cfdbd20d33c9b1ce20cf6766c8720506494ad1269138c8203ddf7beeb18d2ad0abe5a8c1c08b1afda596882c4668ba95ac4629780d88fe9946b7eaf3ad133ed23eb295746e75f261c4cc66d651b824e5562b0cfa335e7b80a3cc062447dc6a3767e93480b792945a59c6a9a5795be19ce16c410698e9200fe820710421486e28a9553b86876dace214bf676db955e13ee6ac72a0772ee58caa57fdb3dd746ea0f06376543cfd9b60fb8a41825540e48dea39079ecb51b6ff27010df33aad91a37d233bd8574eb50bfc2f66e38d2c8da2e4aa54fca469101991c07815388e2f8182ff0462e3958464a25b70547c0914b19347df6953cba2618cf6b3a46b2734f7cf8adf3b6897034bad52bf99228ed273a340571895cb81ab47639b953c2e13873d920ae7a3dbb3214829bab51a739d9884b64321ea12446c5810d3e13567abfa69820a000894b76316d5f89a15eaebe8c290028ff6b06a7b181723b95a4043824012461d55d9ae1a130131bde46b018000263d22ea100004921e8effb7bc8f525d583e43cddd0c32b8eb06043f025796412363bd377abb61d4f544f4371283f447e77325b6e46d7d9958aedc06617f38c50c2a13a09f2713208deef10912cf8979a513bbdbb511804f9628961b76ddeb6530ffdc35e8d3b033c5baa9612b552c11902d151e937df9bda8103ce957c80ade8a69533545f6184e688418971fd8007931d089c572e879cae5518b1d2b1cc8b8588a99cc8ba197594abf9e3764b103f37b64bf1b236f9165cf0ade97d17eeabc433609ef96d53e75bc452e39ef97691ff5bc4756ec27f395dabd8e53cf4c2f631745995cc5fde6b3eb8e72dffac50574278ed3cc527794634e2e0f7b66a90314416245afa4f2f961737260e2a2f78ccbbaee8499a5cc0c0a0cfd18bbadd7152e7ae5300cac30570b9c5982efb8fdec596391788ad1ad913c250ac6f7a5e4296696d0813c5394d823ba70e5458551a5e74b09455317f804c93cb3b44a3da578aeb5ffe00f5fe73e6f9828835414102bb3943911fd22aca6a4a0cde949199b88902ae970da74c69428a13325e75ac76da6e412f1d48a9d7f6cc019f77a84344918f833f2433dbf8b1e17cf963e84d23f7af857709115f518fd9b88cc2ca136a93e89686dbd516aca50199f85b1d82c624e247035c5e7ec3d107156c51a9d5d425c3e9f59f23665306792805cf2e34a901a201ff9e0a3d46ff440d4f5c3a5bb513b7889502ad3949a843af374824f0392abe52a48ee15ab8cf44ea8da1693f9b196a5ec5f71a2b660d0284beb41b9dc7b75100fea2cb7ffffb8a135cffa972beb8f6e38f12880a7e0a6fe924651d51751bb2646475e298a6e25407a1640f4d79862a714866cdaef7368603f9a66861e50bbc33b17764a6e9fdbb12f4693fbdf93f6330c5e504d839682df1e02a4b39214e011150a8be844d44371a0112da38291cfb2d44589d4818de64b378e8cbdd2b715426b2f4c86a0eb26968d8897de53e266d52870de0c3a002d4bc972a371cd89341e180b03942c7af4d401d2a977947302e101062a71d8955f262debf24111973c96a52f7d7a4a15a1dfd140904473da1ec1654ce82d53582f78f63641161f7e26fc3380e3071608770785654986a89567b14d6cdb7a6f621293e170ddd869d6cf44ecd23469b63312cb2b21e224fc36c5e06fdfb31644d38b3c7b3887d216f98e53fe35d81ec1271702c61a9f175540e251f04923d38dfa7c58205a184038c002761dc74724c6fb0edb967ffef5faeb2b1d7a1c45ba94388400a2dae888de584346f481d42f0a6d8368f343e45aa27e697abc86f5df1648c43c211c546301420d42431748dd05fa6796118aa7a57368f046ba87cfee09d95eeabc4146d89fc1d2c8c7eca399443e488bd41caa879972544e1545688aab7e60eac900903140cd8725ffa86992e5af95c4aaf909abbe3504c9b506dabcf69ea8805d8cd50f548886d87bf84a63398f80d13a8a265723df8769921f6d803f63507c375b355d5c7cdb6e9f6be172509a41f0ba7842ac1193bde155c16b96f0d8a30518ba30e509bd7a51503ceca56ed4c44427cecfcf0233ed35db127b7a45703e7e2e3053a1a76a24b41456f6526ecbc7daa573996551d47c7855f8fbf668c3b56ebcfa5508281260864de5ba1c45083bac763965c4be4833eb07fe4461cb3ae33d41e12cb7e4a1d1e9147a6ab28863525fc374beb12f7f7bd0672460ba10260280748615e990ed6ca1335087cbdb6a5ad128d3c87f7c29cf2302ffc3958f80e46e84a471645236514c74d174f71658ac0791137441ce52353b284d1d1c64307317f236638062fd6dc79e915e34d90893205232f4e757ac1440963629bae5c2688500827ecf425d6320b5f21811648f99fec616c6584c22a595a3bbe0db5c4fc8c90496cb66dc6630e3b476a13bc17b9a75f28bb54d30567cf8da3e53742a09e2ed1acc1b2949ebe45cf48ca00e487d2cbfe81fd8b3987ab7cc2e46777a03ec25d9f6570e97d179066e937aed6f64dddd51138dbeffb6c2168bfbd6f446c8a481a5c6acd16d8bace92096bad11fecbcedf66a05002d9976e8feaa2e411b23547bd44ebad14d71ce1623bfe94a4f7d325c010d8d4682db3b4fd22b1c85635332167db2e81f3abbd992b68caaceea15f4d09d0af8c6e4001c760b3abe02185e2cdcb9edd12dc5480bbacc5518f66765b035f5e6b5eea789b4047a7e897e7fe8e7e2ecd21d7195ee9bde626a7657afecffb6bb72b0c1a9a73c9255ee30e6062e80e97ab96f25b78499ba476b205cfd400df87ac03d745041fb959a695079fc1e5389cef390222f2dadee9d100908c5201e2083cb2af29c34614e33fc72e02fefbf61ef512dccc9ed01f98c167bfd0dda42a1397119766a1280a06c0e7dc06fe796932b062d8ff7306d20b2822c99ccf26dde750582d762597eec9875f6b103913ffad9dedb982fdd29054ffb1f18e6898f4e4e941147c145e735af4ff4e02e50f1a8772874097fbc8e32c3567efed5d8d1372be31ed2cf50686c4412e92222ec3bc56b1e46151b091b3da30c63b8c144148d0490a59db952a59233432443d021c267e4da48f81612c1931340d4358b9b4b3c54b48e082e0cdde944635497590c8d0376b6bac8ce2956509bbc40a371041aad3b772d2eb3941eb2c42af9cb125c7accc86e2fd578c611875842ae8dae130e4e59ab40e835a4581796907684afe35040c90ba0e3ad92fa011d07adf917b8cd5c7d34cf5c501f12bc8e2cef1d41b7e734cb227b17db4b04c2a8d9bcd464816189d350c68b1fe4d5e7d03b2a510e029250a0c50288225dda9bc6a36eecf6067511f78f8fa46fe9ebdeda9f864d34be03b1d056097a578ae9c0d0cdd54f5c976140908b165f6c3514d8adc68e2e133737457a80b4dfb1b3f7894ed0090997526cbf1b7676d039397f913e0d7c438839529aaaf2803768e4aa7ec7e7663c3fa3f7c490e122cd54cb9c31e25baa66d649d435a87485e4193d2b69eb42bf930a7c3e0835cec410bde3b5d7894d44c560e9ccd7eae2cc1d0dcd26f57a489009324f3812279891df2db62ab19bc2f13b698b31822924cd55627372f84001c26fcdb6a72cee118b1c4ce410423c914ba87495d5c14cddac57e0f3221e0e26d08ba374d1112a11eeb3613a2529ff275d6a21cc2cc014a48121f9322c179dfdb3027b511339e83b92e6e6e831b15149df3991fdc5f66999c2aca25e8374ce935132998710af8c33492a80be93c8a1ac4eb7af31a5d30cf2c8f3c3a4639946fe9440d34bf925dde94a6ab362578771e1ef68590ed8ca2e4f9695a149c4855845e02d3187f813788233681e7ca2c95e6521db9e9d5518c40254931619a8d623d2aba854b75c815d7aca7b8eb81b1306a464139169fc07be4f5eb18353868db3434720edf5a09a6d903f45554443adfadbf72035df8d9f8c5c17810330d1800fd661bcf55b582554e9683003b658938a6950a693df55480d968e6a4c07a261ea006a40d854474f6683991cd1c482fa336ea0b41a6f8ee2e5db0168a249fa1166725df13a406ad0475c6f82a281cacf439374de39ec5e52664c5596cdcbaeb69990bd17328279a1b7eee89fdc85da94197428856e1c89d470f68cbb5eeb2444c45af044d68d61cf28b25331954d4d9c605108b4309848909da56c23ed3ea4eb963197270aa8740b9460d75b1ad7c5762b1351bab6854e47baa444943b080a60b33be5503b37fcd9b8d6f5e54e4482d07944e4cc9af70bb610494718999d832d4d423055e05947c394da6373ca8491137fe4522a75b21b1a1666d6445f151423805b123c1f746fe10f3d6c058c77bd1b6ded3c17495cbc99530476c404f39a8c2ca80c6e919fec78594e1a47c2fc7cd6d197fcdbad9ae3beda5443661b2f30e80c0a340bb56c82cd8c1784f4e2a5c6694ae16fdd1fe8f75dd1127c361bd225744694f13352d5ce92338670f3d30792d64c72e108c22b50b8f59ff996054c429181593de5293afb212e11ab9b8c1fad347b4672e2e2ec32354eaa3388eedd9d0d5374a91b84dc4d845cb8d8a17269eef430050da19af205000a6c107228a283970260a9086ecee5d309290c1f59668abb1096efc25e754b70b2b98ac285c452678d5025845d70b510f4d00825174248e7d9c9e94b3eb44f321a46c05337fd1ffbd7a336a5a65073afe21ffcae35ae9b42889e201baddd8deb521b3cdb7ed7fbfb4c4cf710e540e1798e1f44b04ad604597e83b27f87950d12dfa46ad11a9a9e97bb1fe223f9a8410b365fd360ce4df38906eb84cd1b2d08b108f72f69c44215ff1f4aa654a87b56c7507b5f74481db42010ea982ed6d0df0314d4462a9fd42e70606afe343079067d537e9ded87820366b535e48f558c2efeb0cf207e146e4c004f66993d7f959c412f95a5ff3f23121844f9048eeae3c387395f0c02d7a9c3b2f583ed772e344bf01e7f6ce720c5a45f0abeff6e717d6a29591a7f33f2351845281ca6497bc9169cfdee3bbce0720edac55e35279f2d93b6ac070e85372c93391f2df7292072065c1462665b7b9840f66b7312e33b09688c4a4a091b9a7dcb36a77b39eab47346c5f74bc16ad6890dc4dcb1e098cb0ce4fe3c196d529d4d7aad755171faf29e388ab9eefba829aa156ee1d350133daccecd37fb185560a3af76a5cd6be5e2f620daa2be2b02adf6acd04ee35da9a006be190d819aa727e755a5884a18462987aa7b2512403903ebabfd5e6423f3a65098908e202ade43358232af859608d93906d14a468ed225f11c48cad1924746c4b12523239f56ae3015bb7013f51f590ec6e02d9eb7bbc08dd9a86f32641ec3c057ca29567a79a1077c6801d80e1e90a908bd252688f9e21c803a09b048fa86bed664bf1eb2f441df425c029588472123c32ea94bffbb03a6378e495c0b8f1eddf03dea1ee61a797c14e56b68573a8dd8a4664ac6efeec327c51a24f5630844f3b1728e93108f43b0093fe4a5274cb921de52999c79dafa1748668e889e74049999c7026f6fef9acf97a966728afd45bb4356b1e10850ca089b2b91ab9c488f15a6f21c90c96faeb599c926bcefceb03c1b64f7280dbd3e04f7a055f362215e22024dbe4fc399fdc799eb33b414ff4c7ce98eb6d38b26e008e11d49021ac2bfb6409c47f4c49dd621c36345d53415413fc1eaabd7a888ad717d45f3fc62007a179e89120fc4015bceca4e9958f6893342a63175dcf573214354665f8a1bb8cd9770cbefdaf7ec182d725e25d73385f7847e67f4e61ad90768291d6a8118b3eeeedf44765b616e33f5c9a09475d50a21f4c9018c4b28eed9cdffad46aa6c19ca9f04a9b73b20dc15f9c4b451b3637c67daa0936d7e3da13f5d20af3fe7cc9ed972f1eab6d87a993d625fb34f38b376498471d903c6b930ef1c307335fee40d7f4d16d3e6ba50606a93983577d4a5bb8fac7c398e0769c193030a793604c07b4bf63b0f29c057a404cd67f0adaa7bfcde0a4381140cfe42adac4ebb38b2c9c7639136c770d7d28f6031579aa5b0b60970167708bcfcefd0756d81fcd70f56777a0642b7405fce031985144d28d24e406da7111e156975f43debd6acc60c8cb585ca4432cbd80f54e286828f5bcb00ea78d63c6b65709c20cab3c6fe5434b5461c9283fa01622c480e78ed1df44f62979f7778d61094d24bdec2f5d4ec21394e681a38343a88b8b326d255069b2cf85c67adb3554050c8f22810e547a61cebf5ca2bb1aab1ab8881afd7f888de0fb20a571356b15eafe8f19391ad406714750efdaeb84804d2d691f6ac459997c01b57cedadcb113808cb0c1141cc98e40222e0dc5aa7440a634bf20ea13faf0beb00e025bb55e1ab7ffcd463abea138e9068f8f8d8fea2ecf5537758dde8a7169041a9dd1fe19522d6be9e19d606efe305e8ed5851d9f73ec4f982231cd8fb12237acd55ac5f268fe5a437b00013cb65e2d001434c83b1407e46ac038e83568c8a1079edb7a4f365f17e71dffe035c83acc39f489ea7bcafb6fb8ac1c120a2a54bb473097a509d25605408702fb56f42ff8a3010ba74613ded29a3e44dc79f75294e56a38cdcff5c36f05ad4b0a3808d5c6826bc6708d3e6db40efc1b740646d75862c680cc561df7c6b95137799b0cba66653271e465b9083c7024856fa334ade7d7cf356b5bb051d4cd7aae214ebbf75b8407e11e0fdf04e0e2c529eb08464a1f75f80820302d0eaf784d287453458d80f4d8127430dd38b9b525de3619c39024ed9812d95c63b603b8a27f7ab88ecf500dd64914ce492f040330fa12f8b43c9c401028ef908a19d705a3affe77867b2df1ec62cd026a54f016027e8a8c5dd91c9d202c74e05fbfe2081234937b3f532e8fcbc0857c6a738d245207f5a8dacfbb4b005caf3f10583b6085a92008525beb948b200918e94a87f5cb4cc0e4d704ac607201bd08b4a7e9f30088b74ccd5415007f3d9d3f9be137a8c7aa8d4dfb4b6974038b85308d6470a6df1d776fcddf60cdbe37893f34f23a3b825c53a87cb08bbc9e9979ec0917216989e8e22455b9166b5c4b12bc1620011f75ea470d3901e0e5b2d3867ad0555238d869b76d167c11203d9549b141a94e80d7f0b90f28db099716ebb4f461aa3277d635786d5be561ccc21e161802736993a0ba2d26d9e6d3f4365c95820d8960bc916b1e9e0739584e03d3691a9c0c053845efef046536734aa7e574c4dd702cae83a40e220a263fa6551f1342c24f6f07fa4a3a22a15d9c6be606e12c477712b6cc544b108df4e391cd66e4110849658669a3806866a576850e4e52ba7e88719a43d6c9d96b4a0cd43b0b46101e901d5747fbeedb02c0b30bbd3ac1a32f12183cfce5dba41b91566aaeafcfaa7597f55ce68ff9233fa3030848ba25d711c924db48a895ce9de6c2ea890396c11287ed89972530a485f5062dfca046c96703bec0980a94395ffa477863c61ce30836626da413e100e307b185bcd7fc6645fc982bf419c48edaaded15e3a52845eb89880b254705f00bde9683b2cc081dac131869abf838c75cc99ba790f52d55dbdb390666b635d7a66a9c0e7bbc82cab54cb35f8d143d7d4d7edd4469c83010a9799f4d37ad30962af88f4083bb935e758443afe5fe54caa25e31f217ebf7ea150013f88309c82970ae84882476dab9571e62796bc944787df36ee57d009b16631b50a3d956665ae1dd431f1a87cd6a26dae4f31a929f905c1fb708a4151825e5f86ba69516e404a37865d49fd7c410eb44792839f34d5dc9d6a646bda989ab6166f7a6db314767df3a0462b185d9ce7b09752f0e4fbcfc5345abbb024d9bd28260e87237a2cab45103f5188b78284636af75bb8653dc54ca4c9602cee78dad8c897f85892fbf263cff4e1e62ca5616b5a28e5749634ce2af8158e5400e83d4d8ff818c77efa3c180f898051dd8daa2a56e1c051da218c11867de4529ef3488d48f39f8354949b0e4eb44b90b36361065d7e496397a27e64094168c51991312a221c92814d805ce5c0af5b62ee9b35374e744e6e93d9755ca28b2a65636a3bcccb5b1c901793e1eadb94116642ae021c1a225725451e74ea7c88b83f05a887b993385e678409122cb638d9cacb74769ac27358ecfecf8fb0295aeb4047241f1b882ce900422c75c5d7a64a38fa45415d41b9772a9307163645f80c104ee31e8f90544f32d0592ab459049c076bba657c2f1d63b56091641c8c7ee343e94ae25cbfd26598e092400f45227d80e642aaa97e189f6bf0cd4ab115cc71d0e2ec43cdfa42827ba98a792128bb00ecb6a46c1ec3ca4e2ea656c52eda285d61c9fe3ef745136055711e57e51a42594b9e70d3cc3d3b663548373c076fc952ec8eb8b796eb960b7f0e5e04dbfb2711e4f904e3374f07b864e919230a43f41dfb65a707efedaf1d42c7392afff35029760173d3fd935ebdb754d6e50fb46742af554b2cef2c1f16af05f7f1ac77ac9845420e2224bdb9a7b8dda00237135035a3cabaf022bfc671fcfe4b166bfab601e41a258524bc46e31e4c55f110ae85da4a8b513945093e8bca35f1a371d1042e348ef8e75ac2da804dca5aada9847e756be3cf9f0b573db89c57b890426f4d225260d82c2ec352c0440afaf6b3406c72135c59645b028f796ba38082475b27bfad1682d0d431050be51206663d5b48da5a70402d373248adec1777183f40b8d0f180ee92c854849e48868634e996607dc8f3d01072b277d15a07a113a1250296bf7deed46c42fa16e07e02b32770304a96cc3929ea2d9a8303f5eb3bc549044f17e9c6854209aa626be760c24175766a83e42c9992907814927452694ace1035cc1f3b41446d612f30934a6804b8d35f619f2211314c43200f4982e8b98e8ee83970378d0e7bf6279e198c8545bd69e70aafefd5f5b873cc4d1ab8eedaa21687d0a09bca88f79bab7b35d9c053a147b033a85a93b5b7b4ef41f7a7be8eb3febc626009806669879519c46eb93454cedb4ac5b848dabeb4df34f534db35505a8513a43ae00a41db6661cfbe84b767d62d904a58fa9c118749aa345c21db307d4b2c2ce20a00c9f307f160345e7e9a744b401b1e0ed5468524e4911a373389b1c63c3a93fa7d5d0d8ed6a40eb7ae69b16c9036ccb6f58a88ddbb1cb5ab47589f5fb14c89beb09c128fe6ad67a411ebbb7fb636586a64d8cf5913662761dfa10f95891f9ad0f6dc21e2b410c46a369fff70a3e58d81c519908908602dfa05bc570a82b92986ae4989628571360b3cd4bffa7829ee1aa43aef27227f964f309bfe963a50476dbe093df323481d02e634cb01468c32f653932ff4b124a839455065a9cdc15c51c963be16caa5210725a68fe3f051546420d87ad0d2d7fa413cb0450bf2e55b659ca22ae7cc9c15cc6e10981218208514196002a7464276d7e8aa9496452242fb0bf73da5645010061cb4c78db0b7ac8c92402b09f7606d879b518667770808802734a23f91c9b2d00958967cf4b085a0082469a9a9ea58f73cda11658ca0b80035be02197d95e453ef4bd30645e568ccc9cc1914bf2b944d1aa1aa8320dd84e14c7393be7210903849fdb9657500e1cbe0f90f35a6f8d23931ac30c1173dd11e14f8a9e5545d45f62508b8888db94180cf6696843217c4f2b6508dff0958a156b57bd367c593fb10578e06664c5b1bd86ea8d452507187213d1a9ca8276dedc8be30ba824485fbbaff11de40bb6511565d50cf8e71623b5f229717c7c8693a1441ef92836eeb1a4378b2029a1eefc8f00fc32a810a7624581992159855ebb627f31438e75bba2b033430be03d32ea3d1c8fdf6f02205065f26846045c18558c8b8b0c030bf9f80c80ffe7a9980bf17220851611ea2ca34fbe41db77af42f6e58bd4869c354f524b53393c2b4820d8a0e5eff1d4770bd0052e10abac09bc6c76fcbddf1fa4b2acfa308f9a0e50ca68b61a38739cef87e8b7d4cd70a545b66cb90cea95b5cda0f1b97ce8ff7522b32d307495a89b63b4574d873f0c9e46b0ffaed9081cf6d2b130d1a9066bd913c450e1d1a43cb1dab1fc22d776bc55c1d592a0546895e05889dbef6fe58d107a0ef4fd3a1957a84de85733e6902ec97b3b9a03914348d8fb496bad9090b1a8bf875747bb11cd4e7a4faa68d817c11f0b083c7cd423329d56f2f37b64bd2ecbdd1a5e5d163044d6d85d0dcc6ab6470b7e7d39651f3e71f6764a1242f4511255a5cc52b0c68b78528a037273c84bd8b5d051fc507583bed3481a48946bad02a903f0e2f1465f5a04073bcfbde1b470ede192e3529d77818f77fe0f503ab3ee835a3817b15d3016237b62ae9f3f0c29d3f72ae173ff24f7490f27b6b572dbf12d792032a966bf81b5fbb79dedee825a9f449224e2f62f50c62496ff1e4ee39492327f0d1861afbdb1b18c10224a1c9718dc9dc9ec06ef0ef9c4bc1318a283b8ce8c3f6b9852f4b41e775e6bcb117a80376ac3c24e977d8c44d9d3eaffcefc3b390ce29847ef0c56a8cfa65ca21ae72bc509add6131449f4b2f111cf53c0e80e090818ae328af6b54e3a69fe59084f33cc76937997e2937f413b680c4fad4fd3fc5da9a287f791f703d52ead3e3a7bc4820a9bc2a2c6fd9de72213c011c4967d8c0c9831cc847f83d01896846798e7f6676a0edad35de218505d4f7cf10b7d617b083c871e7c99820eaf124d973a9163215a2ce8fc8f5712404ed1e31d3c8146504280268d2c032c8c0601c99d1c9d91fdd7eba94c27fb4f1f274cf57f0bcce38cb3d62b9f8a23104b65f9aad2f8fe8bba17b15bef9f87fe8092c8a18075009db11acd31c39c77adb840bb3e8b2d6c8cebb7bb2fa8ba82a40f2f146ba475c66aa52bb26df05b2bbb1854029b83dd7f3a700d73160b532a2b4866ff2c2d653fb8e7683fde0834935bbc5bcc89960d32a4e31aa32f0402f04284e66bbae7854f2ab32d4124115b5e791cc9f14fce0c2558a87461a973f4ffce6ecf16f0dd7f18b3732213defc9240ed6141b45a3d150c58c696b0c0824429d85025c86dffeac5237218d3d5e26356da2dc4b6eb4e98f8a0d51f714db22bd429911538237cc64b812db2fe7cdd2d6defa0d3e24f56a8ae7463a1ff14c09bf65f6f2d5bfc1f0f1dad60c0ca3748ba5af8c72951d5973dd610a01c12d53288077552c18bf142d58f4ceee5cb9d37de268b214f0f80176751b8608e00d91d5e578feb8bd40f7a4e48220fe71e48f5dc28580f5b7a5582ee86eadbcabd22986b6ce5de5a1d861b6e438042f5e4dfb3bb595317613b1336f31df16622a522b7a137a76c421334cd3ff5db7316fb0e5c4d98b52ec268b13d87c69a51c0a4a6b1137538870308483c61738273e818a14c192f7736d841538603824c0c198ec926d22298a3170d9f3412caa6c4ba1e7ef58988dc67d48272bb75b97a6d93f24e35dc5be3d7b072d43f44c1f819c3f79f555575112483136f0e40a75b9080d9bf194525a75499c939a1f8f84b38f40a63974852dc3b0b7126c3266fd1cc5724ac959d568fc48b32699ab5193d7815300e0ead15af59371d078555682b77f09d20e39ac1813e50090ecc94364447c4762ae82f6e10c220c941b8a40d5a3d6c8a7816777965294d39d9adbc512261ef3fd18fbbc80ca63abf4888aa3cb93d12b8af9b8d055778d14af371f6e170b7d1c499be170a36da4eeb5d926df90abf67427f7c0f0fe77ccab649583917c0a97073eb2d72b170e40c5f46e5ac468af18ef03bfc193995f2b8a50069bcc2f1b593ca066f4353f954e78e2ea614153cccbb386147a06891f93057334f0b04bbb277780739b7b8b85f28ad4bcb1a6f1c77134618baca76785c2d59a933b9aaf81343aaf6c619d61dbe622cdd975cb6c24bf096c7b4c50314a0f5065ec00bc40c96457a643a88cb254810d46d1f699ca1f0a01de399fdc5e234c5ecc83dcd040fbf800927c5b205b45a8c1b774e2ce69ade35e9cfd2d05833dba10c7bbc2ba47061111aa6a2792450386f26db51237914e24dbb3041a210373580038343bc78474c010d15338d1e12c58a703e08e153caad18071d2453c8676cb86c87c970cf06ec0cf33465c0b9323877c86b47d27ced1e43d6230fd0bb3aff78939d359f9923ff972f5a701631fbc585cea2736e16e7264da4a7f860c05cd29c9847e2e2ef6f4d4fb304563b7b9cbb15fc24baddd3dc524cc2951368e7ad400c63ea17f5c065e0e8133a54525672f85481d5d119b11c0fc1397a38274b8553e01b511b690da77be813c093e8f5ac24d9f383d8e4aa85ad060c9b41dea541d4255ff89f0e00e6cdfb393c9537d4c4ff08da074e955a4376e9a63ab46e13cfe44b458e15d6fdb31abe7c11984cbe08e4111b02012a9f017076a514641cc78e23b405e34ca1b1c34b95a61382826f7353f084fd4cbe442f87032071c1d617f897dd17e70b80eb81879f278d388c20899d62662cd67ce189356b47bf392cb56dc206328abf73d24f8e8fb37da490fbcca12ff508f868064fcfc3161427670d7d7100e10c40e0c6d097a51b4c35077825cf8ff71496b530c41e3c281cd3ee10fefc50a12f126559aed4f138db27de336836ac1c86bef2bc48f67cffd4d88ec4fa9ec3ad495f2631966a9891a42fadb13f93be58941e3b98a279eae5ff147a4ae90b8fce0da26d0de1af28e1d25914d0c34e6050df3f985cb3e33e358cb67fd2f517fb70a68944a65f8a416d164d941891204c8466d535d22c41068d09ed3bcc3391f15081e8c702805c66d59871665fa2b9152ba76b589dc2ec4b9453f52e4953066119bebf856c695186b004fe37d4fd470c25b6b8461566d01d320e2e98629a25346537143fd802a4e18a2ceda289edb2641cc1205e7fae9e4f1f7d5910d03ece97c89eb862a73fdb0c8fa5dbfcc2c453f8229d5af04451e7606b8bac31a2e0c8288d1f126faa8bc36c9b0bfd35c9384e5efe0f91b8075025f3478474c2143563f7a58284bfcb302c19e180e4e8bda00d8eeccd23e05509f16cafd198b9058c182ce7824a9e0dd152d380afa2f532988fc4259f0d890acf466da43ec737720d7b3a0a3ebaa383a858eb59ffa3a3d0d3d63fbf10a9ae221156169fdd5a18e1462b77d75065ff15af08c0e6765d2cdfe6ff109582b83b5c9742c05bcacb175bf9afca3233d626e2b23cacd0a24fee579f481028ba02fcac4acc546ea0843269b04059055a405fbc2b1389b0a23acfc2742ac289fc749c47f81b7f05817b89a5da3371562ae27460b7bfc5a2cd0c739c9380df696c925963ce44227f38826f39fd0ae3e3077cfafd21ade6c17c80c32af9b2d3d5ce030461cd1611d1796d735f7338bdcd0400cbd0ee52a216f6c7ea4f7cc3090bb92263261d91a827f2b24c8b2f50863705c4958ca54219a25e0d09d976a5b441878dfc084f8e948a124adcbd5d51a948cb4a2f62efa6762bacf25bb52854cff2e84cf61e62d466d3a01d1b8ea71e716c52eca1298823bd9fc1839f6304a7266dd3b393fc62e8b9f58d50262344f14c6fb3baa465e1baaf80a03ccd73fe3c7bb7891d871f751588ef98a620934be1797b11846f8aea9a7283e25a35708b40ab2159112cae34dce999c67a01476000c63d67148fb3e56a38b3aa20859eaff473fa97c1d4acf9751d392aae5f18da153730ef62705ac899ba9e2c8b10db34bf286a66b2a92b38df4d49402e8032d95a11db8f940448b038f9e10c59951cd1be9ddee9299ed9d410bcb89ea0db3a285d899d3919f7fdea294de406ae6bed7de08b092c611f4437739d32d303d1c92115dc56c1bc0a2a7c037fa9e6653553c55f3a4cd56c5c6c32d216722e8d2b14d6ca659da02fc5b2b99c4efd4bae68482fd31c35aa9c5b33308121c280022338fcb56ae448d4d79597e83976af84315bc2088a2f800283a08206de247b2618c83f28c78c3b8304633fdcf6c8654353c10a06813a1837a8190e8c42b5494b737f4a4fc09386dd00a2a5615bb79eb97065428154888578cacb13a0e6a1c41093cc83700a572721eebc7dda4d0fe7f1fd57140126b82f5f6d19a6f7feed96ea28e0ee3fafe22584cf8a55b208916c42847c484fe8db6613aea2ea17bcf27cc1a7551f5902fe3f330753c1b924034b301088833c3168a17fab25c98ab9e5d90bec3a5200ca60bd599691fb3ac05ce8bb3d0ff428ae21fa8716bc13d087f8048643df861d42893add3dc86a8dd79e63577af386caa63a6cf28035adf270c6e21269707d6848828cadb0cf6962939905f0e1fb17b4f09f96447aa92f0acc1d04de9e45b7104210a0b5491b0392651886e135195316beefa3c9829bc78f1a21bd91d645acdb4aaedcb42c4cb1dab8c0473e20a3e09b6fd8767777f7de210c3cad2a0c2d2cb5ffbf911e140d103a0fa12ef0e72febc110425dea5260445106140d8822ccd17842f52b6a63f9ca8743dd8b93238a48186081c20e0b5000490210f009359cc573c388a28c27381f4e3e00ee70c0e87470e0cfb4114524553c904e07471491a0441689013ea11c452405c09c28ca7ce2faea7ea895ebe2882212027cc7725e3ea11d1f8a05ff87931f7fbc88229201445144228047453449a6881d45995104206a2ec6ab0ac757cfa3c36861b8305e18308c18860c63861145240058f9eb3b8fffb242d5f5f1a2d309ede8584e8f8b62e958bf2816dca1783c199c2147fc878e282239b92a0a44551f2f3c1cefac502d47fc87f5bfe3a258de08c7fa502d51940105c8ab96b73abe037f42d48e8b62798fb37cc772ae4f0fdc095160bc908ebf0e8ae5fa1f17c562fdef2872291f1c4ff541a8cdfdf8c78bef58a73c370cfcf1228a32a188be639d622972fd1a62e1ff7ba446118949e6132425995190904451a60d924c149144511465469111c5cac70bfc5194094506145194f944a7136289a28c27ac28ca74e24371a228c3092a7f7a589bc8680287aa162a6732d1c60108908900b4118a363a81d2461b5145bdc73f5194c1c425a22863894a4451861293b8ff05fe17436de0c811ada0062cc0841992c84c22f387cc1a63b844232213405ca20c0044e20334b0441da2289a22003a2cd1228a4a14020d946823120209241c218ad0a0810c64506d71717ee4a8fef3e1481e681206a4cf772c89495a5440fa7c07a24c22c5481b5a68e20a55c8410433761024fa22fa004a244011456207d8bf820424a2a81951d1802c48080105123680c4912b2415e986a46205182d30d40ac89aa1cbaffb5f581c100e8b03f24f07e4e13c222652c3119c88b8d8c2115494c5f54330f569c4231a3124d2582dd70ff90102461c218a18214564842164c678f970703003ebab4c8c224a90e11c02f457e520aae5f3202014cb7b45e5970fe7067e2394678a29a698828a8fe790a6ebad98abe260e92bea7ec8254ac28188341c011126871880120c81832832848f288a308082141e1422091a17b4204a010a5008d146e49765884104a210298360517444108988228b4309620a0208d111fc71ab9a0a00f39f1312a8e053821b37b4d8420be98a239863c595df878a900ac895df872449d2a70428908e608ee65ff06b3ae186369c80c1065a64c18120267df84303fc90083f581145d82898962fe29d1c97f52f5e74fc877c15c4c29fd08e98ce078827e4e17c383f60a8cee77832a86a07ee503c56be631d7f1e74a456bfb980780e2141289695988fffa0a8960fc5f18f17f829968ba28408a93ec67d502c6ee15b2be7ea847e5cd4a7e397f2d1e36f15a286c45c9c2fbca0587cac54d87360cf61bd10ab6eae8a930307f61cdff16bc88eebf39e180fd2e9f84accc5b93e21e9e357c0501d89a2ae8e5b2b24eb3fc73848a22e8ef54f8faf4257287f15baac74551c2b7d5cfa58be39f2d3c7fdad77704cd8032f1c0b0f2588a24c20a228038828cafc2142c1c3f3431465f81045993d4451460f79e8b81895488f211a1d5507901596aad1541f5ee800f24313068e1f958a4a87a2ec5ffee220aa02f930f22f1faab3c58bb704f9509c8ae254a08f179f2f42b57c2784a91f33b485e7af1e59dcffc27aa13ab8c77f382f9f6a85accf5b1f6ac50e1e5d61451445911851e7ab0c14ea00b2aa29c66a2ccb415bd0c2f5f10fc7c3a9aec5c19227f479cb63398c45f1a843042c90e597ebb03a7e79ee50948df122d416d28d2cfc724c070444117eda10b6ca7a30be3944504c4bcc77415da098ea36f7a1133808885bf8bea5a91ea4a2e21a907539d77b3617a7c2e105553d91981c1f8a63718c7074341792030180ac4451e6073e88a24e55d54b753a38e240023894010e56446f4823b286bc7c3896c5f91145991e98d143066f606e684114455101dc9006ab9a3697833a1073f1c00cebb24242a497b7a4cd854345258a2e5099c80a44275b3849a30d91684391680d6d446bf0081b8f0098580f8ab9346a68841a1a114547981aca504304d410455114e419515119430f268f6895780309388041243bc480824be041015ab8c0610f8220a3085a3022132060e30747f88112c8c0918138084248c914a63130019c400e8ac8420754a8a86844198ca0062904200d9460c18f01fc811264c0c416422c3302a145358432367125366e80dc00830a571ad1e8e0b93860091e23d0010035586c9c9ce04616b09009074809689199c3196a78021a607ce07383178cc2878b1a29b09730e3e44261ae81002238a1044920c0185b504073060c6227cc90070af0c11301861d3ce1030cdc28002801286c068a08041d4a582065e2c9e0bc5831de790c43e10e455d8dc613fa60aab9d0190c1045517366b801eef1985a5151c9a081c2061b1860238c288ad8d0c1c605242db290241597970fe7c3718fe56e04ffcaf5432e8e87e363a50c6344515486024451d48108850c6788a2a84351b622430ba2a8bae22b2bc8a00029e618784451f455e8f2cf928bf509698c1471e958ff3cfe38a7c222e68b44b2a737312c5ea8ce0d32358850c620d180c81a5c6893eb8961f181a12abbb17cb386195284b2060c22ab9a9c11cf3da2114322ac2086322649a5a2aaaa4a15c8218614482a6218c2e38618ac88241521408408a952052a5081064428614044180e11863684818d68a3b9d10149057fd5014b23ddd084010d490b2db488a2cc0ac22046187844924a14653e60780318c80086264411073f1860000610181e0c20b842d3712b2449e53af2372495eaa58df4e14852d572031898408b08e50b5f88a8eac9f88e94391b2baa22c2118a1740f105972862ce044dfaf877623c9507b1aae9c2c961711f53178b988b5339a82463c284c8137aa91cc50b3188222fe0288abcc023f2028b345e480028a242446ab4218ad4c042a4c60fa22852e348a4c6468d206acc288ad448893217e80217dce356a8081656179a107581045d004134c55c204ff539872cf55109813e1c097b8e2812830868648ebccb721f255c90b4d042aa423774851545288dc599aeb0a4145ca1916e5856642005d20d2b62be8826c66a36b7f2b734530991ebf34370e5d7e2e8c0b1630b524c62b8a8a8b89040fa1f224d2e2e9d9075251cd2f41faa45c725fde6f238b512c6e78d5430930bfe7808067fde92ae8f912eea53b9175fbd14e487101ed2244dd4fd7024eb4a1607bf11b724fc71a73a9682b19464b9e555e72b0fc5b1fef32fd62d4ec72f6b7a995eba916f589c2abb74bdb5e148d6c7dfd3f1ea3dbf01551c8fe41fce95f0df10a62ad025868b0b0924fc718b73c3c21505f3e9214d6ee1cf078734712e65592e491f901e0c697a4e75712cce460c171712c0fce73bf7fa7ce8046f5d7e399f90e548f8e316c8925424ea5662541d4056545460a84f114da7f33024108304d2732a98ea8d500f23ddc0827ab1de08e7c5251cd2843bcfc9dec38b981cf883bc707250540bc78de0b8a82117c542b1e08f172a48810f1c2d2c4088f41002848714456b44191490114591cb0f2f5834950b1c4386d41f1a1d42708011c40b4d18387eb8a4e184368e583aeae0842c2af0e148992399984c18509a5083e8f396f51a04a030e1132e2e124ca68d3c30014751e452260e4c601bcb47b084362c184be082089670e9e8b1049337c24151421bdcc3a2841f49b044f4790bbf75718e50452a0ae6c27f2b2a7faa37f230140f69facbb9ae5720e9c3c9949483f30346490b2907a78b963620158151fa38e5b934f0a160244fc8b2dcc3b9ac10fecaaf8a02793892c57926882d5d2e813ca13160a8ce5b8b53044689922c8ef4f98e4f16b0c06f242ca44e28bf7c381f7f8f447d1c46aaa80c728f4bf546a817bf3e7f7d0323c5e417c7382223f008453d887480061a688481868f2391553da7aadc16a1072845884111ae227411492a17077f7535372415e986a4627d280e47bae1a1aa1d17e7723aa0231586ea7470148104e58c449cc18433d0885c5c8c482e2e40a4e98a0d6cc00ac9922c69075fa04412ce3884067fded2503864bd46735dff7c44b20611d0a0aecf181f8ec72b0749e79a63c5581bcb790c010e039002258d9608250d9708258d13442869a8204249e38c08250d2e44286984214249630e51340004440ff8712342f93123941f5c44283f8844283f6022941f3c882236d04006122f8cf130d6570f06891648a490e144d1f416d5b9d291eb43d7c72b7f91241045813105155fed98820acb612af76ceee7ed274b1d4f01be11654a324332592c40127fc8c1093238fa11455ca8a8a844516613459997288a4c32d9c80fa01059d5f483eb39d595afc7bffa0108222a42f1811bac6a6a465454507ac046332251d7271405cf133e1c2554657411a1f0008d48baf1e1648962b141c725ea25f382cce3680c330a11fdfd507eb90e120164a4306365e5b2281edf0171aa166a05e6593e14e731b572fd10ccd1817be8b03696f300792a1e5690e6bca05ab01bf9ce0b0982c100792a1e8f3955f54680803c370cfc791f56a783037ffc7e42d4e783a36359eee3c8aba870aa2b073722a9964186080785c0c12070f0862802f96f543298c041cbcd58323856c7432778e92d191c8baa9e0c29c672f0091d6e70997103074837b2a8a81515152a54543496e6f31873361a0ec83520cbea747ce51ed9220b1515ea92846834534565e9f20e2764afe42b9215f35d4c1c900f91349ae941311c9060bc9a2ea76343a0ea03c7ca5f7e3f96e432f315729130e72dc78884dfa240475e8af922157559bf798b92361707c67aeb2dc9f1bfc501e10003c8c401b9547d918a82d1e44c15b1fcca798834559fabbff287e2e07f79f1968963591dd05b29c63d6e713e14c87271b9ac0fc75f5cb2fe43591d8e5f8fa54fe5df91a84bea5014e8a52357ccc5e9b8a6c8fdcd8a644dd41553b991cbabff3c17d30e69e2e05087637da873271c96cb0f171717eab22489ba24315c2c1595dcf9212e2490def2429a2a8ee4e2225d3eb99429bfdef315b5320d9162aa37f21c90bb7c45ad4cd24f9610c9738f68385c786e182b54fef488a20c18992f325e4451a6258a324332991fa4a00ccbd182b204227cf088288a3238800405aea84eb298421445243eea071481030de060135114952860077598841086b0c61da22892e20c2070229307155180208a229244648207290085101021a3283229820b0088b081c31884883ed475853a2f2531d84202f90e14fc208a324202c07a6a2cee1be974dc63654490096284288a9690d98027f4d15821cd161bcb79786e181bcb3727f0601432a0104593747dde226303029111804ac28f12d386097ff530921563468c6f5a62785492f41e2a468a701ca94414512c284792708447f409559883258bdab4a01c0940144d38a6c3a158601c11459108221498214c9f50a7c381b138160433a3970fc7ba3896b3a12a9014d309021345578b912c4493f41dce06078a110c180940280b282198288a844428210c5c7588a268b23a1d1c93f421fc9b7b813c7f5d1ed301812896095bbef9843c5fdd075921ebf3373cf798f07ffeede59b2b622aff70ac15d2bfb88713e4ca28d704ac47586db08e58614412875381a80a04f21bd7fd9c5f7accb124972c1c2e2ed25be9b2429e0b8623fdbdae1f79094bd5262a38545615816a01272043144dd6e4a9a85c3d488ae9743c745dce0d972cdff8fd708648132773aa37823f6e6940dac0bc78274b1fff0e655d6f49d55fef7171917ed332557f79073fa70302852c1797a86b63f946f398ba1d8ab291905cfc727c3d27af44510648146558a228f3238a323ea228d3451465421045991e5194e11145192ea228b323a3238a322b5194c91145191c990f4451668b28ca681145992c322a5194a15194995194915194895194815194795194715194695194e928cab028ca74208a32531465b088a2cc8d28ca7020b30110a88c68fa2ad4e178ce145581240b7289369647911844a8348891d94024e11e40503e898832f53103cac78c2812a304d28df750f70a511f980f18911825903047224109a61f2b61488fffe385a70b31768a29a6a002ff4502e9372d534c3105151e184d31c514544c534c3105155774c0c2c2ea4007ac4b612c3e1cf77480e24c937529dc810ea858a0ebda582186259140f25097155a99628a29a8e8f4218a3a1d5fe924c18773bef8bc70be7a23d410ab9a3445f21045d55ba1ea41a121168e2236402992a78aaaaab72c07c5586a888b8b74fd9009732c87d9a2b95016d727447d2e0ecced7438b6fa2030ff89a268254219030f286324218a2617c698066a369657978b545159c214f522e1905cfc721d1bcbab16174e0523c55809658c2ec61840d4c11ccd87aa42d8e53d9c4b93bf72913470431e0986da5c2190875ae1e40185a3060e0ca2688ab19d8e039936d75faaa8fc2f6e85ac7771e978cbc6f20d565169a9a8aaaa54fef4a844b4a94348c5659384984e2794bf836373248a706c824451147d360ce45f4996c37c70a0bcd4e1b1445dbf69417931237a2bf9cd528e08e5c5a1644e445134b95494e452fde6e2d4eb7a7549390fd98ce93ec8f2789ed14b15aa407fbf92a8eac9c0e2437d24af7ed382f290b8926f30e7724243b688f92e5e0c6d11f35dc47c91c7d46d2e84f2a08be3f92d2294b7228a2690ff46b23420c574ace72d0b877d30503e8a503016a26872794c5d174b8af95018971145d1f498ba30ff1982c7d070214814b95cd156007191b098242c3e9454c47fe01b5134650a488472d788a2882542b99f288a221d11cadd4034c574fef22a74afc358315fc4862c49a22ee9a22821319dafa40743dac00636b081e9f346382fd26fae982f22b9e5f98bd3e970baa85bb4fcfd501fab7acc31425520bf1c5f4ece21cbaade13b23ed4b5aaa9035878ee910fc5b12c15958ad278ee11cb00074524a9e00fa7887443529154aeea8d7cee11cf3d8281a8a86c2ce7b1b17c8bdff02872a94e8e2116478718cd89c19ae481192201eee1f2124554fe70a8ace1421499ec30a9261f6840149978c0a4a5a0680240f221f1488a2768408a0e4801c6f4f2a12a18e9fa3cccf51e6a883459366449d447dadc8f5739a410430a3338a0d0bd949439d2f5167e2b348192039860e20a2b3416e7e5c3b92cce91af801820883c8f1b5171cfc8a23fcb4d696bce889a7384595e2addb53ef3222ab3f9cde92e2d75ecdf54447dec695f9b199bdee89489a83e237b98be765bb66c4644d4e67ebee7ec4d6ffb7e880ad9534c7fe6771df13444cd335e1a1bbeb635731216a266db72f7f5ecb0b35212a2b288a76cc7f0cbb1d9d883a817be8bafe576125f8905519db66ff3de089d7f8e6c237b7371609e6cea3a10d5c5785bc7e9163228015165c7e7594a9633be8dd2f987fa6c938e734f873b5bdbfc50a58b39b7cbdc1db3b3bd8decd83f327da8f8d24b1dfe8ccd352b23cdf0a15ac9dabe3b2974534ec936b235f83f3094063bd599a6eb5fa629a5850b4ed592b2d25f4cd334591c6511327ba88e650aad8cd0dfb69cdf57218bea5ccd6c9adf5cbfa090a6084575644b69e1224504292b293e525a7ca4503d5447277eaded63ddecc19b872a598b9ee933f6d0e2cb36b253b00ca578381b6b3292626528853d22193c54f671b688df4dec6fceb991dde9f87d9f1dad3377a871428f2ee67fd979bc6d87dad05e8add51ea9ee79937b229757d7ab478a86ac77dd0906992ae0a993a54dc9a3176b3c5f9bde6ad05ca1664e850f36b395ef60ebe975d861bd99fefdc37a2c1b4e16c16229a1d9939e019ddcbe8cd316f0ebbdf5c5f794ed5324d292b31dfc5c6721e2b29d3344d3974fc88a928cf7b20742548c8c821b66ee9186dfd1a9472bed994b9b7372183d7624875908943f539a5b372b2cc2684f6e150df73ac51f70db68f8cde696233c8bca1b6d6a26c4bbf257e93764a0b1729d3344d1acd14270b118d918c1b2a8ed9696417672b63b66d23fbc9e07477cb36547c3165d121a5964267ef3955cbb322c38626996ce7d88493d29e13baf793e59b3f7a9496b57cd505729ccc1aaab46f62776f36c7f28c2fa3866a296e56627b1d6698594c83b58eb577cd356568a84fbd3d65d02df599a56f64c7c7140b656db16421a2c92273864a67663363382986cede99a14a4ba9cbb6d6d906dd59d74e9061a3367c9836d65ab496cebe4e059932543ba5734b3bd36ba3a58d0cd5bd8fb6dd4d7a1f6dcc8ea1e2d93e366cffe69cb3798d3a19b4ed5939b3940f4bb8914d332ec888a1b689e18df141778edbc74646260c153a3ce995f0e73ff8765a60a816b29e96413823fce7f60bf5616b0ffd5afcb1658abd50fdde26e763f9af6cfd7323bb63326a54c8a67ccd2db4fd9859b991ed5090e9428db6e96b0d3b96f4297347325ca8ed9bdf7c336b17b175bd91dd8dca6ca1ce1c5963b739c5f4592dd496ee19b6e7104eea7d37b261b33259a84e62175d939e5f42dc1485852addc5b25d46179b739a37b2675fa1b2fb6c66ecdf65574afb1bd9d493b1429d0ec367319cedbd54a1de091fbb90fa8ced1eb3561c2343856ae7b39b1fc3ce608b4dbfb2a88dec229929d4f9f9cdb7ac5fa459fae5b8bd7edd8e8588a6ca48a176c337a39d737e37ccad63d194162e525a2a1cadef27c67a2a992854d657669fb251d64c628742bd34377ed6a87cb2312cd3a831339cdf3a865f7b17b227d4768fd1785b83d3f97c6c237bb62d324ea8f4d979617bf9d0bdd1db8439a98371c2a62f42c8643f08db21feceeddffdf64646d8784c534a8b8f696af9820c13aa8c37beff1c19cd8fb1b9912da1632d360b114d27b3844adf8db0676efd6073d96d64cf30649450d965edca182fbc165f0b37b2af7f713c72e8d858ce639a2cd66c2cdfaca4aca4f04859491992d2e223a5e6784ed5324d53b310d164ba904942edbff9dad896e27831961bd954fed020425272a4aca4e04809e223659aac0ec8c3811ad62c4434a10c12aac479b646db9f94d9c5b891fd3c9e1e6de22173847a67cc92c6674f5e27ffab4bd3dda302f2a09896d731a3878c112aa3d9b1fb1cb277e7c4be91fdf2e15855e87ef5e1c4fe175cfd7daca47c91b292d245ca4aca15fa314dd517a9dc935fc8638a659aa689757b4c7d1eec2641238346f5669fb4f0b5ce8ecec723c814a1c2cbaebcf19964cfc9f96754676ddf6799ebfb4f31254275b6c5e8173ed62ecd390ea15acbac73d7ef9d8f619985501f85b9398b5f63b7edd946f687a3f9cb3b082fd29e6e3ac81a952dc22861cb676eb3737fefe6d8192054781b474ba1ccaeaf75f707955186e97b7fef10cbee17598868c4c8f8804d8f30d38973c351bad9836673de1bd963a7d8c5e692e1418dded9b2b7d9c2fcb0b98c19b5618bfe2cb34f617433bf98d941c590b2e618327aad5fb7a1869ed1c1e79cdd7cdc3833c66edbc87e51f6c8e4a0bac86e8cedce5de83cdec939f23caa87a17c98205346cdd9a59cec42d78d69cc5e4c13553d191fea334d9ed027b210d1d80c0e6a338b336419cace33670b5fe606954dc7a86c2fe76b8eb64b3336a88cd2b6123a1cf38477fec7553fa4ba8674cbeab21ccdd4a03ef60cd973ef6063745a8fe6f31dd93120eac2c63094d29262612885b6cfd0a0be462f8c9f1f5ef8513eb89299419534cb0bdf6d6b1f23750d04191954d7dab139d99df9b94999ccc4a03e94ce5a991b47fcf9972303833a6167da703f49637c6937b2af4a43b9c8bca05adba0cc8f629c9fb48f3fdfb92abfac0675645c501d3336afcbcef97df9da4c0b2acc99e64bdd9d31bff6d6372ca892b9979d66d9d3cdd9e178eceab256503fca97997ceddedfeedb488dc5694d5550637e79ba96527abc11bb8dec883feff90dc8ab17d8ad65085250a59c37e66c9d43ea3ec2eab2584541b597fa6c87d96d99f57787a22c0f32eab4f3492bdfcdf8d2ffc298cab2f5fc93e229bbc5dbde916a1f7a9b2d4667f72d7c072b4c65fe9ece86edce3e4863fb0e2874c16aa4b6f71067eae6bfcd0eb615aa96bdd8aef4db11daffdfc8d6388d26b6abe61b9f6d3d9bfae76f72231b3bc84d56b5d962271d9d8f36773a37b25b55e7bd39bbebd8d9e6967423dba2f06b585d563c41c550da09af7bff9e614bbd0055f98c3a6cdb3317e7740c0caa3a86e57d94e69fcf59fed48e37531a5b8410c7dbb0a7e6666f9410df09df6ccec1e8d497cfc6d6f8bdc7d8bb37b23b5ebdbc835a577fd159a4fdb3e3eb6fdbb416b68decd93aa4b93c79ee1883b1fc226b691b67d936b25f0c69deaa1cf4da13fab81f1ce831cefbf06d0b2feebc910dabff7c7ab46c6ab6cfdc64ee77c6e89afc0e28d4c25eaaeb3c2da3dd246c8919ddc88643bae7e5c92e8b5c65b313ba4725c617e29b37b2f16b5e4748bfbef8a847c6a2a4dfb0c3813dc88c2c44342fb83e85b75d6ffa307c769bebf81575dbad13c688bfb5bd13b7bfc641210b114d18f659cbb8df4ffb1147dc1e0b118d8bd7f62dda6821bcacb1492df5800bb5d43674eed2a5cb2c9afab8b16c6ff46fdc209c1bd99609aa85ccc298a3cdfdf2bfbc918d1d14a3beec69b383d0b1fdf976231bde2841757de5b78bf1cb6933cef8c381f984a88f6636092a74cc7d9e5752e8e2cd9411a9f9e2e7e284f7276c8ff61841a5985d9a9bc9e7117e739087e36c1835dac6f83136e19bac1b8251198bec9bcd91b66789f1ebf1458d0fdf7db6ed9f654c768c77401687ca9f1e97f3f120d324598868b217d599b317bbbf0c36ceee2f1f4e11ca5a6a8c36df4bdd9cee51f9acebd886d43931664fbe85dfd4d2eba2909a1f6eb2cdec2666f9ba69ea74feb2c84244330211549be9750eadcf07dba46e231b73340f8ab9644a0b1729311f1cd314f3f196e85888686a906a1fbe4fbf317dd8358c1bd9f0f2e40c00a97f2f7c8c27c612fe7ddf1c2b014b65ac3988bb49875dcbdb47708f978f0b99a669b24094a6250b110dfee11c835352f73a52075d6c145ed79c9cb2297e6dc6dec8aefeeab1324df83920ea4e9355fd0572ecd354fdc5d92124a5b1ae2e5066093eea7497b5cb985fbb9462b891fdf743693a1dbff4ef07c867479c168852e9a2ca76fbb8c987f2bf4dcf2f44c697907d0c2f4f76a010d4fba27b2e539cef948ede8dec0bf460cc42d918b3fcae4b263b043cdc62f936cb467bc21cef46b66b1f5c44071bb6f6d8ac65f1ded6c50e27e99530e36b5d730ba9908ab38d32b29fd8e56dba918da9161d1766876fc62f2766ff30a686acd06e676fbf9cd031391d1b92a3d2a70de5a42d46f7e66b1bd91d9087a3c15ff9c69a1247f4f9d47694d0cea7f6b5e605082a8e0cbb4c23b58e3d797d63c98e1f78feee9f4b395b669636e5a12a50b7962d2ab6af3373cf7d19762e6f6483a80a37d3a2cee8f45aa791bd0be97d231aea72ddb2a8d9bd5fd7b941da3fdd87ea5ccde55c7e59addb03f59b6ded7a37eb99e20737b23d5495df34dd3792d2e223c543553ba629c7345116221a3254aa73b8b343d81a7bcf7a6f64cf1c14bf66f67ecc6c628a2dddc8699a2607ab0b748229dd9cdd1d613b28a78cd3f57cd827a5dfd867bf161d191c2b5451f925645f4707e4e134e8097ddce5c94764c593da28e7b3f762c928dec89e325698ddd236e933265b4fbb916d7960fe03fb2b6aa5f22f6c7b1d5988683e00ebfd8f2d3a64d9b17d90e64cd157217ed3c6dce09472e2f836b235ae63ecfb467ab83aedc5143f89a784af5db791ad691d2f4f76b179284ad3c195463345578fd3b98bbd3d8a2773b9917d551304ac422c9d9cf95bbe0d9dcf8d6c8d9c1da871c6f83a338c27cbf8fd46f66c39550c7b3ad8f9753bbff76d64c350d58ba61b16b5ed63ea31d3b6f227831bd9d565dda8d63576237d5636cb9ebb8deccb93a9171ca83443cb5cbe135e3ba3941bd9f8e31a0a779323d84095383febd962dcd32d7c1bd91b2b04d25454d6441c292b292d292d3e52ee7f01e342684bc84244e3e38a9af164fd3c765367d6ed4676e59bab617f712a30a6e9f2e469fa8aba968391c25a28e50a79340cb210d18061058d52460a197c8d4d17a773b2278f914e67aaf7357c704ecb5eb3b0b58dec94162e5266286587909494161f299a0f4703a22a2c5b7581dc57d47d2c443460684063852a8de60119d000061c9072810d5800fb570fa8c004240750200213b8381e0f6585042c1001084020020fc0bf0107b40648062c4001adf92a6b2aeaf20824e0450920600207a862b646690b1840020588000106e000014854b405a6702c00960600d02e8a92e2e486496bfe4503256d6d80a469329101d620001fd490798f7f4c08c0874f0c4000511acee8038e288a482cd00636ac410d6940c319ccc04619c8308635c41006307cc10b6a74810b59c08215aa40852948210a5048e3094e68021396a084244451e68c31dc8850c6804614455e528600a23408210e38a22a044044a39122aa828a4050910735a24852f1505596aacf9a2aa8285205153f346f63dca3a9820a2aa69004b581b94294e6e35745a58a290450c51453a822006d4492ca653d966e58d5d401cde51b980b2603511455118008445154852eb78af8a5e9bc58d544a201924a44114906aa0080194aa8428a51906080a4021149ca05a2481313b2559c7ca18a132a445188ca9ad750d425dd8822920a9050e03dd4902a4cfa104529559870514554872a2234465188e6f08b24112081006b31fff7e397f5e94132001205c47c171ddce16c56623a1f205144f280ab72501491380073aa50274814919474dc521d2efe72a82faceaade77f7ca81d97e5efe3c2e1a13e8f3dd487025155908f6f5abea27e5c1c01545f84f3a17e4451a68ddaf1cbf96ceeb7bc11cecbfbe838e7727028046f7d3ebf8e0ae388a942967fd5c2454c8e28ca8c22aade16a9a81d3139dce3561837f7ac378b38da9f218fe6955ca2321b3f3a65efb1269dc51acb595b38588868545062897a7bd2d88ec2ecf23fec4a2a519d6cee5176d99c8e45cf4b98124ad40ba38b91be7df45e39891afbde2631b40d3696349648a2be261b538a9db3497dda96d08f48407865d39b1d6db2fd9740a2c6ced0ca6ed81c9c2ccaf988fc3fe3ffb3dbdac35e468923ea5b2a31c41d258eccdd95941c3aac9246d4069dc2fe9e133fccdf1bd98cb210d16051c2881a656bd4516c1f9599fd6b1651a985f1b33bcdd6398eae883a6533d95a84b3fbe64454b7d8db934f1d7cc9ac4344edd617d3db6c74dd1c64dd62c921eaa3304ec7cd42eb937536449d2f197d975efa90deecfcea3c86fd9cea622585a8315fe8ffefb1619a7f12a24e6829b30f53185b777e1bd99a4fd6782c87d168a8cbe52819447d8fa7cd4e52fc7cd28f928588e69608a2ba6b33d2a7ed8e2f747823bbd371d9381e8e8fcd057a1c5988688e9404a266d9f4a3753f1b6c0cfbf382ba3e3d829400c26f74ae1d8554bee65ae2bf0e1a12f35dc87e8228f943b7375b8eadfdb42de72bf1436513cbdb30678a67fb0b37b25f75818694f4a13eb7ccfe8dad59f3a676231b8651c2876aed73cf54fad3eb62c7699a260b07257ba8d231c8626e3f9b3b27a71e2abdf85e275fa3f36147651eeaa5f63ed8726eb7cfe2a13e6417b7fcf02d6b16dd1d6abc3046ecf7497f4865b343fdfb187a3fb4b379b475a87ffb3d3a87dd3a6dde74a80f4776a783763ab7d0e7501d762ba16d395bb6d2b112395489e3bcef66ca5a74af3f5495351b2b04624db72889438d8e76c3b37d839fe3933e288143953de575eeeff1b3393d04d3344dce1a833a23cd738fb837d477fde785cefa3ffb3e6e643f1caeafb72cd7bc8e24287143bd4f366ff341d7983a774bda5099a40eb7d81e85915d088714f107639aa689352294b0a1493b19cc7f99f4876dcb34699a354094aca13a8c13b776a7df4b61bb6aa8174a285d644e4af9a4cd69a8df9895b14d9fb2f3cdaf4e131aeaa4b4e374cf4a68e3bcf90cf5e7b39cf14f27df6d509aa14af891c57629edfb9e6c7205256cd476b16bb94d9ff6c2f65849196aebe6dd914af8b65bcb64a8cf4978ad84d1636eeb3f86faf75b64194b9c9f6c36d7a871da99fd319791c638a3186cbb2f29b6efa994d4763abec2da092561a83d5b6c394ef8f0b3984130d48eacefbbd1b694d9f1fb42b3d70de1949249d8d89bede0cd8d317b7bca0c5382f8e8314dcdc83479ee91694689172afbcfb64967717b8d31a746b54c5ad893e5499f738fb594162eb2bf0fe8ae922ed4e7dab58b2fb236db955dc2850a5d6e08e38ded452a5f2bd9426d1c653b9ad97499adf4122d54f8f0cf86cfbbe1e68ed9a0240b95361af163ef9c717c3c4bb05019b3f24126dba54c5aec4aae507163cc24832e7b6e393f4b942c44345489156ab48fb237a583133f775f5352851a99b391b568dff395117ea0840a7532cb7c36e79ec31236ca45c9146a6c7fa37d7871733146974285afe1cd38320ca33ff6a2505f5b4ab3b3f94fb2d84d7d3450a82c3ba63f1bca1c9db4398dea8e4a8663a4ccd929677e4295ecca9e5066fb7452999d509bb97bd69a37bd17c66f42950db7ebfcdcbb4fe77b26543a2fc358c606f112aa6bce9abb735e492db54aa8b2e7756e624ae5b4ee6e122a73d179fedc1c4f8f48a85662c9a46c6da9ccedf9116a5f7ae575f9793bb54e8d505d36ccdebdb9dbcb4c271a354f2ca37ff406ddbf5c84faa46ccdb1176fee98e519353ebcd4c189a56c391f11ea84cc61991ffd76ed3739849a9b94f7ca4b5d5e88b3106a96ef503ac7ac45e83e08b5197b6de3646efbba05428538fb6b8d7376f2dd833fa8194bcce26cee46f70e3f1f54eb9abd886f831d7d52d7837a29ee9c2374fc2ccbb2f1a0c2779d94ace97bd6bcb519b5b9882f96f4bd7cb0eda0bedcf7baeb6dbea39d7550addff82075eab49fa339a8ce3e8d52e229cba82cbe86b3bd79622aaf633b4a70505b3fec60b30efbb5f2c9921b54e98e65e7303eb7784ea787121b54f93a378965b7e793ce5c838a1dfeb3344b972583cf695099cb7ed4baf7985ec9e00c6a6ccc1cbcf1c9878f7d2bd209598aff0303246634512283faf9f385596268efbbcf6350a98cf6e676e37d876dc2a0be371984cdfbbddfbff882ea22cbf1caf99c9bd2d156e282eaeed63a73499d5b3aef467627e4712d3e523aa11fd3b4b93895773a1c3b4d2c443455490b6aa4b4b1537c69db9bb14f4db71b908ca252779fb9c5134acf78e6b77c13446a3a86441475da762fcfd912ca96dfdcc88ea1a88f63c49fdd4e2cddbc1914f54deb4e3a97df3dcb1c6402c9276abeb0e5a6f79fec2b679b9ab603124fd4f8cdb663b1c17beff7cf1e9074a2be63f973fbf910ba8b2d0b11cd868413354efc4c5ac7705b68df9b1a924dd42b71b6f7510cdfb1f9f2866aa2ba8c73842db2f6565aca36b2a7d53ab64c30c9dca4b031d7ef490a9b753bebae73b339bef25adfc89e266b9a6048daa8f9bef3f920cbf1d2dc24266afc6f362f7d73ded6e8bb446d73b22921a397466a89fa8cdd86a57f7c523acf95a84cdeb7d4ca269975523e4ad499e97397413c89dadc4d8819652cbbb5f649a2be699f616a5fbecc35dc91a8174b0ad9cbd2defb906248d48c61c33ee1642e3ec6f02368cb6ec75a43475db786af1b36f8eef2d96fae5947d4c7eeb3704e2bffb14c6523aa5f7a197edc2d328c2523ea7b715a4c9fe6e68ebb1751694fe670f6265f6cd8e39b2c4434272051448d17dae6b08cf6f6a452c62649448d10634bfbe6db335339271048105119b61e9f8bd8638e0c421a049243547c1dec365fa674da38dd8af120d3344d9a9e86a8b3df83d62973916507f334594f0b512dc4b659e9f9713e1c8d26fac09103880f2e62ec1d2484a8913decd8afffca9ecd727cb3324d7110f5d9dced36be1666af28cdf52fafa713848411b236a38c8cce4661b3d7fee063cfbd1bc12009449558bef82dcb8e5052e6688f4901515f6c1c5decd8688b17d23f54f61a96d9ba1929cdffcc0f1553fbdcf4868fb27686fb50677bfb2eb59039f736231f2abe2cf77c97efdb8cfef650dbb7cb8e66fb68b3575a3dd49c9995b01b85f163b42c0fef4ddae4a4903ed99036936d23b6f6317c29b58de12e48f050a3b5ceaf6dcf79f3a76d233b7e80e40e15f78bcd39f9d6d1db9edba14a17dd5dfc3cc278e17c75a893460c237deb8c59e61c1dea6befbbb5ebd8b36c760ef5cab74cde99a96df8599343b5f166877f7afccff3b21787eada6d77de7746a975ce1c091c6a8b973ef8eefeed661b7cef0df5b67b7377bef3e2e69abff7dc5063b6eeaebb9ff16b438d98d266f6e9839136c8de63438576426b5f9ed2652adf1a2af34cddbd315e99317efc9e1a2a9b133ee670bbffe063edbd34d4475b8bf2e1f7ecfbe7f83d3454d6af713f9b595a78bb619fa1be182dc32c5ec7f29f43c7944062862aa5cc3936f58c61b351b21790b051adbccfc57f8c59fc39d28d6cc73a072465a8d87694d1e5cbc89ee306fb8b1512325499e9bbb4e5d732fecd2da6ba3e6f0cf5fdda3b63bbebe2bf9b31b599582059a37efc9c9fedc7dc4eca18b5125b0cd54dbff9e508338d2c443498240c95c6ec6d71b3d8286eec8380a1bad678b2c8da95f965cb38201cb08d4c136c23ee0b95baa3adb19f6cba66f8bd50df6697df39778adb9cf82251a3befbbcb43d7ca5bb770f7f90696aad791d05922ed4971d930f7ac3efad63910b15ba666d9cadd9b67e730fd65420d94285d3e238edbb91c9dbe6870149b45027eb8c1bc4ce66363f4b2141a6e93b769a48b25025bbcd617cd349fada3ddc79ce8e69b2e21248b05021b52c42e8b42f74d4d92bd4db7ddb747c67bb30c63c4dac354f20b1426dd74ddafcd298e9944ebe3248aa50a99d94e2195db30de774ca03122ad4ff96e93fda5a5ae7e00b1273693ae66a45209942a51337c30fc7199f1648a450279d4eca7ef9b687f97d4a8b8f94d96a9044a13229f3c517be77f4b52625fb0209146adb6c2384393fd72ef6e797eb98a66e4dcb3548d2a80e426f91520871ce9eed13ea7b3e2f7e30e699a55b8debe8846a2d9ccd6e9376c6781f9334a1bac5175af628ebe7ae3f5a244ca8d23d7334ff4b8c2196972565659a9e9169ead6f433d22c6a059225540ca9bfb5cf519fffa88b7e6acb0c489450e98418bf9b8cba9b8f5ed647204942fd7baf8cafe5fc18c7179150713b9a9b6cf72695eecd2354ea973dfb0e33e692b26784fa32b651629fce66cb1e43a3c2f63c1b6b3f5b4fdb8a50ffbd89e79b59e277b3c33360bb265d84d4c129e784f0c1d86e74cfcc7a8471ca47848a27fc3c6fc77861b3749a226b4dbf26059221d4f8ec5adbf3dbfab3cfca804408d5b9bcecc2979f31f6b6d33435ed1a0b114d46082441a80c47fb6f5b9ecd628c6d235bb6f848b1be90ad830408953e7ff913fbbc90cd7c7f509dc474ce186963dde6b45520f141658d6f7cf352bfd24e6b7b5025964fafbbe33659f7e4416d9936289fa56e4248d92331a366495d678cb177e329e70eaaa4b73d8b2ef66d3c1f1c01890e6a7e6f3a16a58b70e68797240795318b23fe6634b279b32c434af61e7b913eda26edc8a293167a7f7b0ba374869d04079536ea5ea6cce56de9a0ddc87e4c7d5c3fa658de24b941a5efef93d331fc58b4d737b2af8f5fff6236907b9c86c406fdfac9a691754fe75873aff585f8bec3efbe4c65f62f486a50dddbd822b4965d99fb7f23635b174a99986b2790d0a0e61631b3acc977bd51886750996450e6a7f39b63f729890ceacb93323c6dcb6e3f371c031218d406f38d52b2a7f0e3fdf96487e40595ca661f3bfbe4830e3ba42ec81a07890bea8cffb4df5ac6e46bad43654d4c75cd94162e522aeaf21d292b293d9a0d485a509bbae6dcbb11cf9b1d461ed334db3d22338acada61fb8d724ae6fa278f213bba485949e1f17a0b1951d4eb2efc17e57368dbed0b45c57f6dbbd82796b1b994162e524054a5639a40548571b4f8489926907b28282aa38e51d7ecfddc308e4e5988685690f944756fcac72c9bcfb2dcfed3344d2d888c27aac339ad73ed3284d4cdb791ad6927834c272a6e6cd2bf937eb4f64eba91add1502fb371a2e2db90c6f8b3494773741bd91a6f6e13353b949839eb5e7f73b4c120a389dabef56db9ef95eed02d6b9b4c26eaf3d66e3e7bdc6074d9daa856bec85c8e2c3fd91433d6ac61a2462a29cbf8fd63d81a83b8c7344d53ca0e2129145617e812b533b4d327c6aca964f75aa2b6a6fd9e5fb227f1b5fe3295a8edbe51dc2cfd1861bb94a88f51692d76f9b9362fcb93a8f23d0be9b34c1df4d9b0246acf98637c389ba438ca48548a994f6bdbe39bdbf78544a5943afb585308a7a3fe88dad17d94b25d8379bab38ea8edbe96a73f36e9c333dff7ef66cc720faa65b9b96d99b688219d3ca81237ce6ffe73595a0ca11955decc329ef7b529299dbd83dab329761f67bb0dc6cba4d041bd93b66e8de577ef75948d408a1cd4065df695f41dbb587a1915db77ce6fbb2de3a04ad62e8cf7427c83fa1c8cccc519d995edad0d6a6b87f2426737e33c6b506766d345ccfe46087b3e0d2a93f639f7a89dd95197ed0c6aff754dba83d0b969716b6c65dbfbac6b1a83eafddfe8652e633a9dc3a0527c1d3b8abb35cb7eca17548cd9cdb27167c62c962eb83742e8f3befba46841752d5bde3cb383a3a8ffaeecc7ddcfae8c2e8a6adf7cf47aa37f9fbc3014b5a5940dc3e8dea383fd40516f7e3d5b63993d4633fd447514c2d970e2db2cdb6e4fd4678f4d79adfdbefeb61355e248dd6d3b3dceeb2227aa6b4e66271db26e103f76b289fa324ef9d43a685b73fa3451a97cf7df3f94964ed8da4926624f28296bac4948639cede3a5ccdd3bccd89db4519b8492b297b18398a8adb1665b5ecade57af5b605c483718af1cbd4475f2c639e16df9f3cefc2a1d302e649a60bc9aa6b882134b5408f185d04e8f37dbf8be12f521b40d5a3a5b7b13faa5446513ba8b9fcdb9f173545affc2c17412f53a063f337f772dc6c94e2451b3cfcf8f2df36bdf7df32412f5bad6d8b5bd8dd28ed24f205125c6b1bdf766b4375f3c37b27f9c3ca2de77ace17f1a1bf66cdefac41115bb983f32fb344eff3963aa6b8271d288eaf61b3e467d427f37e70923229eb335c6534e4aa99345d4e89c7d8f61fb1acec9d88922aa6dafbf1dba6ced42e789a834e3d9d4d9e9e609222abe6ef38cf332e7f9bd7c88da3e768cef3e4ffc98bcd3062786a8b23b7bf406717ed8b0fba41035c64bdb6c2da37cf7d20951db939d9d3e4ce9206ab38f96bd6caf3f9c4f103552769fbb7d1dcbdba05f950789c1548e405488b36b93e137d97b0f3e202afcf7266554e29833ebdce0c91f6a7b30636be943f92e85ddda891f7aea439d4d6d7bec28bd31bbfcf8c3e9629a5a3be1434f7ba87edfa42fc376ee3dfb371e277aa82d27f5fbe465ae65db6e6b2779a81433373b3bcd784edcddf05027c419bbb5cf319bf9f11daa63ff392d8e144be8764e936c76a8ad9b6cacd14b1976dd5d874a61ce90e6e8af59b7b7e95029b43236fe1c3173a737a5c5479c43b5d7b6e82ef17dd4cd8cfb440ef5c1be8ed219ef6d18ff6d64cb0eee81869338544c9fb5395f2b6f6471b68dec08870a59b6ed60cfdbadf5e737b8a14ed9d236b3f95b94ff780c276da89fad94d6326fd6b38454fe70a0f5f7e2a0f2a787f55c836b9cb0a1fa5b3cef6d7f373ff56b84933554dcec65ecc98ca11aaaccd73127db5d7cb7bbcf3849437d8ecafc913a671994eda1a1d2899bc5efd666766547249c9ca1ca28319bd0629fefc2cb36d2ba3e0e5b182766a8df9c5d9abf4d7ce38b0d819cb051e7b4b3b1978c39caa67dc9839332d49efd286be8ac6c7f2e46334ec850bf356ce91cfe94b1313c19436531e7fcfff67eced1c18decf972b2468dfed4fd64cfb187f37b474ec4d0133b0943754f6dee0b5f9c31cf871bd99cce457d1a185a6b944d29297372322665bbb83d8dd879b3ce59eb9683932f54383dbaa68d36691d5b5ea8563e2aa75b8673632af146b6e6e3b7754ed4a816fef57ed429bb8fb2d7857a6fdb8fd7a3eb17256b1bd9ace118275ca8ed4f9994d05f7b9e534e133dd9426553469823bd2fb677fdd11c275aa82f677cdb32fcb0d92c9d17d3e44eb250df74f89cb390fd94f7f10916eabbefca6bb3fc68dffc009926ab08456d7a2585d594203e5282707285ca2ca61effdf838c39b3d9bf43557062858a6d7e3ddd6bcf9e743656a1d288ed7d89ef938ede4985ca3c5b761dba9b2f76f6a65061eb2c7366ec3d7d6a5b0a357f5bf75132782fb358436b701285da384ee89e3bda0ddfdb83c10914ea63105b28f1a3d3b6e0248deaf9ce48d947f9be39cd4fa8b03118d9fbeb0c7b4aeb84ea207490b6639e9df6d32654f6dc79bfcdfd1a8d341a396142b5f3f6cfe62d9d41db7e095536a44d9bb53bc73ebb126ab31bdb65767f296e5826a1b2f690fecbd8206ddd20122a86b42764193638dd9bcf3a394295b4cdbe0fc277f67d6e23d4fc2d594377ed93174389467536bb94ede6361d7c1a4f8a50e19bf9fdc32eb7b3fbdac9192db6e7da4d26a164ad5b52da5c46dbf77dbef9a677404438214265d0527f1447c751bec79a9321cce04408b5fb39c7a2b36e4ecae73138a5c5470a1e4e82d0d3e70408d5490aef95ef4aeae273ede407f5a7373867c61e2794d4faa04ee7fe1d6eef9cb3cbb20715c63bdbcccfdd74d8a7e341cd113befb6d3be39f363276654dc32cd8c3dec20c5d7e1114e7650277d4f25c394629750fe4676b76bd73d4e74506193f1737caecd9c699b39525a7c60e1240795ba6867ffb3ec70622fa3329b2da6323e9d37c2964f7050db71b38e627bfbe406f59f776cf97533eaedaf8fbfc0d6726283dadc4e999f7b0b59768c6a5a13c1490daa7d8718474ba5cb4c6d0e65e9e38406d5dbc3666163dafeb1f68d8c5d9ccca0f67cf6aea5773e6931641bd9aca5ac2732e8a9c8490caacdef60a3b2b9c5f8e6dfc88ef9229fd813144e60509fff63896dcbef268df90575ba7fcf5fe7c7903ab32ea830637b9d7312da1871a4272da899667a5b9492c551d478e5cbf93929297d3e9d28ea7c17e6361b66f6659a9949286a769d6fbb0e36653101457d18b7cc1e8e31be18ff4d934fd4f70e1f9b3fd9cdf7bdd7c3c413f5f98beebb51db307bec349fdf5c9a66d2893af3f52ba9a3cfb176ff8ba381f1caf510134e346de93ed3768fcc5bc4269ba8d9c278b1b374b6c352f230d14485d9627b1d636fb2d9a430ff690de342629b424c325167cbeeeee9ec3ed832b651ad6bfb9f21cb4e5d0f0c134c54899db4b6a9cbe71c5aef16934b54f964eb179f952f5a177f239b76a52396c0c412f51f3b66f46d5f189fb38d6c0d7eadab4925ea7d71326fb699bbd6a4a444c59949f9187e994608739c04bb16ce799fbad92fb69644b5d04adc0dc72b1dc21c890a1f66b19d336f90a832ffd3f9187e6da16318c87c44c69149dad6ce9f32d33b354b3071448db2359eefb5b738fbe1d79a668449232a7ccdff316490baa38ead0fc52183e3e15c2020af35893061447dcc1fcafc12428767db45547f469f6bdee473544aa7889adbbcced1e91ec62e714e447d3437958f3e3b19a3cc115129832d1f4f2c196d70be435439fd69cbd73615019586a8edd14b29c54d42f898d28ad274cbc2a410b551d8de68df2c27f5872df74c08511fe33c656c86f1ed36886aa5830ddf77ff3ec2e63e9a6e268290ccdb477717e6e81a662e980402baa60d65c396b3c54967ec19a56d4c1dbff7ec1fa1724c13fe23949545300144cdf94ae62c938c49cbdcfda13ecdd0ad537fcef5ede6872add6571b6b310be0c25bb7e081a267dc011376bf14ad7226d7f86091f6a6b096fbed8deee7b9deda1ba46fb2db6aee5eb0f3a3dd41b23a354fefb8c8ee3cd439decd1065b4bf7d1c276f15099a314e3666d6c77e31d6a94994176e7f3291fc3d20ed5b6fc37a1753feb50e195cf5cbf6e8edd36211daacdedf58b747a7b6c4ce7501bed7e39e36b7d736e4e0ef54ddb1efc3999d36e6de3509bf69316cee62ee7cd6c235960028799f3bc99328b2985366e64872ccd75fda13a2bd3f41faa73691a266fb06f2dbc2ea3ed861fdec82ef26f71aa166ae2863a1b6c385e6739ba1933d6549406c62bcdf52fb20d5532ebe27dd2423a5f66df9dd2c2056c1d266ca8334e375dbfefc6588cd1640db51bbc6db686d335c89e534385ddf649976d8353435dad334555415a084cd250736cef997509e546f6bf4c1f1e1334d497eede613823333943f519f1ebbe7d2796d7458d89199ac4ed3e7fe7165b878f98b051df83ec5e69a1fb63f3365a06369fc29799b7ed87f118266480f7fdbc2e238efd9eedae2e10164cc6507f32fba26c73462be1af51bb7f36646e29bd2f432c86eaec45e926a411e3272f738349186acf0b61bb0be5b513b70443edce8dd18761a6cc46dbbe50599b105a1a3fbb7cdbf76b6b30f142c519cee8d22f85373ef71f3051a3baccd651f99ebcd86de72ed42629eb687bc66e87b04db8509d5beccf4a77981b32c704932d54f724f4bfedd3c5d628d642651fdd399f8d6f3bcd9209495949612248594961415282f848e9803c9c9849824916aab576463a63bf999db50d1bc83dee0b132c54874c4efaa4bcece18cc91c4c79e24ab3a6b24dae50ed7d7bd947b719bf4c6d154cac5029be4de2d75c7be80e7b156aceef61e7f0a3ccff3ea642a5d0fd6374b473bbdde64636ec58f7ea3a52535656a6699a2e674ac1640a957e96dd9ddd65eedd590af559767d3e77d046a152ca9c93ce3eeab2ed9750a84f2f9cf0cad6d0338c2f8dd91c32e724cbec368899c6b5275c189b752c537c9bddc8fe91b292b2f25c448189136afedb8dbab793c26e2f37a14e67f6fd59279f47762f13ea84b3a963fb2eb7f8b25d42c5ecd9f9d2997ce97c5225d487feaf5d3aeb32667626a1364adbb3cd12be6b199648a83062770d6f948f35fbf008954e69df39695b7c87276b1f9818a1c21c67864c66ebd3ba4959e7c0048dfad89c1e7337cc1cb767d3d4ade9354c8a50996bcec27e3f71b639db238f3f2b29ad35dd1a0c2667548a1f65efe56fcf68749408b54536ad7b2a9d46f8221c426d16e3fca0f3167fc21742bd91524ae9c38cbd9eec5931df45106ae3f860e7dcf0d18ce70542753647072fbd8c5ef79cffa04a1cdddd37be145eebde07f541d8e865b6410c1b46d7836a31bcd4619a9df5f8ef5919263ca8b6cde98f73f4679262686246f51b716c134387636bef83f84869931dd086b331f8d8a354c646998b14670a9de51723cbd791ffc47c174730d141852cb6949345fadc71963230c941c50c3a0cedbc17cbdbfe3ab210d1103129a33a46e1b5d4e2beb8cde838a82de626affda60e88c90daa75b6c507ef7bd86297e746f633b14175dde28bb079a6187fc435a8f2fbd97b67b851d72834a1416dec923ec99ebc33a8345b899dc538e2e852caa04acfb14df81442389ff318d498716cf72ebe6f79be09839a1d6e1dbd6fbc2dbe185f509f62476773a77252961d17262ea8d265cce495cc3ddcb0b3490bea95fddace7f8f36bc8e47c928ea94d3b236bf31785db3531435caf92c460aefb3d6dd52189484a2fe6717997b8b736c1d2328eaf499ff199b90dd08bf6f18f31339d34b1bb418b6f7447d9a5bb3b73b67989b369782924e54dc0c7a6cecb09cf249ba6263fc470b4a3851219538e77b9bbd91c9f7a6a6c928d944bdce427a199c53c28cbf3551ad73465ff487d22d8c331375ba97a7945842db173bac2e50491bd5767b96efda6431554b09266a98afa8b4ef0796a134c9511004310c039170b308007312003030241e1047c311d184426c6a1480035e845e844230928863a14010c4288882200682180040108631c818a4b083480d91a3607d76eeaffbe4a3161f257355640ff12435195f5f7955b73a0841cae3b9aeecb2426ba6caf6726d91fe62de3cd4f6b5bfb53a369346dca89fdc454b22768b47aea9c4915796ccb8b162d586838b2c76874393c6da11e71dbcb5317499ec1f3a06ed407178106bba38ac9e9185fb56a4908ccd64923477e0c6e3cd12aecbea290086ebc19782c2a4ee7ee305a764a9a20d1160138995b9a8051fc612115b0317b38a3cca59efbae10dc1b3f217b969bf70799e7ea40b34fc6854d75b29308d9f930cfe147ee64c0c6c040eb2094726e6fc329aa3ba1a9c282f1d0564e1651d486e41439c75b84c86f7915b39f7747037cf19083e98b806f6217f2b9b83235b051ef07c590b04af1c0f29a49a37c9afc66148fba84e1227660239f2daaeb6c8e0504739d0cdc85c8af51e4686dfa49784c8875afb222a6639ecfc878730eb02e8fdd3295925afe2cc50f4a26a9195196f72ea99525a72fbc5187cbfc718ff4c333b06b5061637545dbdad1788bf375ded4ffe4e42d44721b6c9728b1e10156ee3c322dabc04e59de984acbb96c335b711ccc0904dd224ec00aba1742d5cece412b8af76f05a9c3f2a45883a05ac70ebb753bfb6e479f430e24ff5334d3d296856260a9f723ceb59a53e9d3cd1712df85704a78b2068b67883f99a0a279a52e499b79cd0d1811afe4403682f8061582eb48713f256ab319a19b0e9a107cc2a9d6747a56b440342f9c46d48450a2a0343c43d63c97c0f3a58468bf54e2108d1818ac5cf33eca31b0a3e94963f9fb88524c3b3cbe06e372116a62a863070700306ae7efe0de464e680689d5ac3093b05af0929205742a84884d8ad13627b6431a7d5caec75a8b29b5c99e530d1cc8419b008f4c8192d53214fc8f15d75ee462671d967cd8462153269838acbcc44b65ec7e12b8a55f6e827af6aaa5d13060629b56b8d833a5050a55d760c0bf843e0cdedc2f873b28872717f5487575edf27ec2e4cd5cdfe4236b4adff08985b30380ffa340de5369a4c9004a9385881eafd05bfb9de1ac756e04496c66e106892412f3616f760124472a95730f8838bcbbeff80ad6ef349fb888d2cc59555cc34ac3c97dd3f45ad3fd8596eb7b8915a462693f6780992bd5f269173e57f72b6eefbebb836543e09fc9db5a62fdedf8ebeeeb1716c49a7e141c46952820b24a8bb40a8155a1fad1b61e6ae4452af4a2f230448a25310d2b31b36b946dacde9d97fd136b7f04cbf10bfe9e7364197a9e647f127639c1f4d27c7a880e1bae7fb5ad94761fe922b8b6cc9a6d234fe30e9c5359280c91fe6558aac2a9ae8d5e4c1461dee0e44414f8816725027e44bb3dbc4575df792c193963c7dcbe4e7eb3bf6c5097abf7ab8b5dc5967f701dbcc93837e778ec9c108cd6714fea8a7a972003f6041b5c1a7b76f434093d7f4d0d56ac4ae20e00284977b44ec59b6565cb8c882a208255e21bf386a397eb432a0411b095f0b8a185709456db7b6d874802910498ddaa67aa8ad85f359e895dde74418b53a8c037888c25ba1019c1cac34610eb45383c3414c6c4b193102f64640bb5b2f6896a0651fc3d08e1e14969c1f9e7d1359188245f8e14f0d6200c2402f3a6d369d06a322d93bac87c766c1a0c1f8a74009fbbe5eb5f6646bd542ca4eb5f9116795dfc7b35eb33459abb6f395c7ff1de61f1c3e900b74ed92d19dfc9815ff5e76ff462a5e00e53e6beed3d0582176f8930250ce5929b2a647e7fe7faff0c4c96c53a1e083716b9d60168bd8197edef4c0c0858a564159fd2b2a1b247897e0d7ba120041c9982a8f1931da2c52bf1126aa55d5d7a71b314dee22cff6a6edc2a0805faeb01833e433a7dbd46b34230594cb73a6bc6ed02fe36b52bb305823d10bdca5dc66d23ac29776864e96bf36af086e443ddd13a11d112ac568bf84c2e726a347c2d56f1f3dcea28ce1ba333d40508530e813ebbeaa2617569a2e39d79e0c75aca69936b0c478aec3da02ec4a5a60ba2bb605f1fa1f0c5292ae79a7aa80a5922f297950ce73760ec53a2df9b03b1408e492c4183d9b349680f56adcbca3f2152ede961b5897bce1bd9bf22642238aa695092b8f4ba4131f91f98ed6bc1735b5c395c9d90d78076b01f547269b9797bf44753779518a9edbfaacf75ba66671543578698516fe36b4c62474955fc05c3fe4e5f6e716a833d71a34d0fbb12c01a8a19b50f640e9365956219631bf038aa19bb9c05c528d42d23b59214db89ebc978a2f05a284750fd6d563f6812d955be0840cf05d6da915dd76de9cc88563309b5ca8150bd058a07c09727319d1dca82129b723a8f1465aedebcdb99a99e8dc3bb79858b2f37bf21d1271ba8e24495d264735b6f3eb045955b0f8147128ad19ad36eb51ed330c97b3b92481da1fe33bdc0bdca2c8a871740c1af187e51e9ece733cdd4b26025b49fcd5b4619ba5e5c5f8977974ea2ae2ae4ac835528accc16366cf8c60af08ba0500f644fe2b69757b47ce0a6eafb450765e1ccc59d1d2e918b78b881e0a0129763529d35116a5178b51e82d94f5ff0ad21952d4d5fbf033e3559be1cdc1a809813f7738626d93c63a3e24936708a126ac7621579bdfe9bbe5a44dcee6cd0a2a4d8e77b0dc635a0de16c01341a64a23f6c306a76546c05b314b0c1a5e9071027615f75a975fb2382f8092a5cb71626b765a748a05d4dc40112541390435ae515e12c6c78240540941a4394aff3efaf5670fefae7d0902020231d102485264449e636df5b2e6bf1c08488b9902dea73165bbb14b5ac5ec339e5521d9d124e4368109be67e8a82f1c68bb0e2643d8e5bf11db253658783d11efef446724b1f0a68107145a8a2296389326ec9e7d1425fb8bd437aee269077269288d4c5eb87f35cf6a494ee43336264f2b6efb1497f9834837c04743ce337e2d8bbf55bb9c45b0ccb6bb264bda63d6d892fb45d732b1a2f4c480b2d196163b4c56638e9e05c0bf50c7bb6e46897418f5246539a80a2fab2dc977acc195503fd536b36ed8e1f150c053a66082b027ee30234bd97b0ff16dc5388c584283310f66b1390937b383d2f593222fcb2f20671223c4ea5700d2bbf507369aec026f0c970b1bd80023cefe20499abba51b046564bf72cac0b0c3d3bfcb53851a4c6a6861c95e3856367b64f88173589db8f8cd0f98c435808bd0b8c46bd8e2adafa2a76db5f0e1d1d60d3f64804f0328c87ae047c62b857b73ee8d2edde304eb378ac78232481b124c18898f386a0c8a9acbb1edd4811003119de8cbd018359916c5ecf3633a66be3c6f410e802a236c86c02aa00207f56846beb21e8baf4e8749afd20791d8383dc10f6d1be9d0db74f5de09154c74c17448a809b10ec7609782b82df86c05b12d4ed1268c26d86454e083cfee301613e9dd17d851c5c07c80a0250e1b9241ac857a3afd55582f5da0a5f5d828881d885c97e9baa93c2005d8aa6165a817e07761bc53f9315189ae89963501cf226ecd7b1081972ccc0978fcaecda796d4b62465028263d142e215cb5d5d1576a7a8d7538b5cf41bcd25978484bdc4ab7987c83da80823f46a1777011a5f50393a9ba83dbfb4b2fb4a8ce3c3bb64126fd142ee3fcb3328ec3b14b917a5f520afdd390f46735782124953342a261ca05da3eae2b6503bdd9f7ca0d96412d4572c8e9c368363c9b468bfa1a5ec5558c04e106f2a83cc28ccf1fc47488a3bddf5adc0d01578b9a3e37dfadd5f3a1cb43410e127a33cb12d94a05087f158c7aaba680436ee572a2b6a0f9731dccce42bd6e6da164c10cc6df4712cb168babb7576896074e05526d51d8d1a508e2dc2c0c76e180ca65e4d9bdb46874f6d4a6d16f898450c173bcdb9a17f9b6f6e1c1109c46694215f0bfa67157f842152af2145d94ef599955e429866e04c42680b52082602106ae701ee528813e3d084f3504f20e18d18d0fc2028fb9bbef2425931ee35b3ff842c58db1c55ef24733e4d1ab47cf338d653140c725ae267044ceca959d3fd339226b1dd80329fa2aa3d3537dd2aeacb0c527a295b2e8b0d74d086dc3c5b4228dd80adf683eabb5ef6e39a8a5f4f04643958f33e28a672cd0d80faf4378cb4d4a5075cc5edf242b9a057bf1b3d055dd9b3b1b7a20a59d0118984fd2c27ffd48e0aeb8915b035b532c7f0dbf98af6839cfb05fa170edf05f98d05ff45632f24cd7f6b24a1c8a09136442fe551c1891c253052c6fabdc6e29e55661f0efc727ce663833db0a05200e85ce03507586674c902b45bedcf00362cfd6761c86cc9e401ee10956bce51ec7b4f9c3ba03b80f52218c0423cd5c151b0f66e253ec147b6dc627b1d577f89a6fa2c5248dcbb44f9cd1a7986c4fd8dc1182db235757ce2c846beb9d248e7eeddc09b3a0410956799752e07c203d7f3e79b9cf11a5005b214a77a3326d434ee0ab88f112b2528dff772ffcc6bfed41116f857b752c22cd424b5c03c9b85f197a8d09ffd4832614a1b3906872719c905f6a2a31c394512852118058f13000865ef3733f0a87a5c5ba874a47271c2fd35d5905ffc1171b74513ef767563305d86560b2dfc20c11130506957641fe99a497cb965826bec9aa3b14ae6dfca49a31dd1493b0c81a6159a099d76030ca5cdeaf70b931d2f54e1d91d74717c1cb8efcc85ee99e9b46853dd09abd95592bc12e239f35ca19205deb806c97c90a00457bb66b815649ce09f9978b42ea6003672d3fe2205a899d29ba99129a9ced163926e9deb8003c235ad7fafedc6372a0e36edd2ac77cd314973edb22b5e746b2811c127b18b825e99b4cfe387fda495a3e5c37b8a5c9520d8c58d3252b993226c9ec6c058459dcd738a733c35c1a0c49c915e80f92c475d5037329d33108ab0e494f7efee7d2b3aa5b3484b12e172364e9e3fdfc9b8117b0e44a13e2c4e899fd392457403180160c99e8c25342113cd4b8d06bc6a106814c089b9e63df91d544922f7bd61cc6516b8030e4c402935c56f417f11142a734656e25b01803d9435480bb6a877cb875492d9b15a1657c609738f053c81d5bc713aa841a342be54df251812d2272cf702f4bd59ab973a5b2f55601dfd43f78fad5d9af356bceea330c47074a545b5868140b313e246ac335144825026262c665e061bd8b0746a9e52f9c25a61547aef59ecda490c1f075f4ccfc249e5e142c2c1d74309964c1b53396e204551584711499a0c5d346c1254bd535a86e5475209ca4d81ec4568a5ad0a26963e0e26820411b4fbd16f4b6a82f7338f8664abc320355d1832861ec759ae10f621fc9789ede84fe52b65e94937e95fb6d219b282600177cc576ef1041fc1a105ca7b13afa6e3c2c2dbd4562907fc1fe8561f6670b23efbf57c18f4dd7f378c059b0dd19be3de20dad2fece91e10e60c44de8539399a001b6ab96b9faefeedaa1f3a2111793f79716d8bde1e611b7a9a9043d05fb524aaf4222ccd4c5ae25289d885d62a98ae5303cd78322e54276b8256fd2e6d3ced8d25bd3c9ccd3c61c839a333986e76be5182003403c0c67f5e488a8f3451b6db4e280822da5b4817eb3895cc344fb1dd727b13d7957014491b02354337f1340e903249757630aeb727487d6d385b64adb3e599a368be24326d863a1e124b8958dc41a96485f70981480166a026631c70684c3771b893623d5911672a3e68bef30f08316430077b34659d00096be6a9bf85e931354a3f4c0ab40c882fe5a81f530476338180fbd10e3e11ec93939da952516c1b8fe623214653c778b1c911371e47ade11d49f7722a413e3d3db0edb031cec9301415c837326c9786ae45d2df735fd98639ec172ee0bb46d4243a708f9e91c47b125fd248c13d1ba03472579ace197ec683e372b1739d94450da5d1e30493b684267d8161162d06ea388a2b38222b9b7300661d61e37c8814be7e060ada0207e8daca77f55009b10c9c7059bf9bc211fcb6bce180f986b893c0358b68bf818b1a6a15a870f1e6959fad4af4f52e9ff46f8d1987309d44948f01d08c0d1850094ec2a1eda638b4643776f0807e3bfbe4f495ba4fa5e96cc50144216f675a2a7e41ce5eaede6ab7325ea346051505d3a24775b451c690866775a278d890da36db62e7f5a4a5cdc337cf700d0cf8cbb4fe2d6835bacec8240fcc893c26c117d5c01e363160e204428fd935a5141df3f3332dbf04b06ac264bd2b06ca44b04b141c9ca15617ac75f70146a25d1f7c34e8e88be2465fe27e244d41ed239cfa4040b6451224fc98dda42783a8e865a23b20e358cdf82b01603d3d11309174f8e7a33a9cc19835baf495f9c31c74a5300464ecb385cee5c95466ff75b362f25c4fddd052c35cd0d9b7ade8e8b00f71540b8370fc350ca8d274561434128e3f08f37abd7a997d9cb5226611ea2d56d6eabf704ad3722e76ed86cc9334de73383b00fe9f45374bf6f657c77c7b4a8d629486087da29c36ba40bab9a4e39cba09315895745f782159561a45ddf69a5936c45cb9f58096630569dcdb508546f295b5c63d675836b39073696b012a2f715fda2518050249c558363a44da4cfe714ef5a1241527ca07297d562ac9a200343d7bc46075225672bbfc7f034c3cfa956a7fbb15288cb852fe8bc9ce5468318d0b8ce00e0d7ae33d463b75035bda73aee0ea9956151643d639ab094e051a452b5af35c5a7ab98502bee400b9098b87c524fda1ec5c031aa257b9eb98840a279060e3ac0749b1c0614cdd5c707ddb41d6f4613f2b3ce9519f78a5b72dbdaa416317fccd1da32f4beff5517a58018d0efb6456b4363aadd88458c4e81fe8e72f45c638e9e46156eee1e5b3884ba1f4ba4d5d409c51ed615f1af133b50728aca42255a9dec61ae51baedb65dbd88d9d5cef8eb7badf65bffbe562844defc9e251dfcae345170960a0d5fc5ae091f8a4c2265104f5fe17122d1af70247e1581d4e919befdbf60219f281393b63473246249b3beedc71ae53eb1d58e9c68ad3610079442ce60efc7d2202d78389c08339e3a8e2d83faf657b2e972f4b85048280c43393fb6a30f4115e6d4c25f2fcb5f8a500cc1b5d9f13652eb030b1885f06f2ddeab0c92f81765be0fc2ff1c02c55554f6b42d1431c26f3e4cd3878663315f0ed8ddd44d381600dcbf6aaa3e64355c4781e9d9a4f05a3c530e2072ff38643f36d057037f6c31e5b9377f8ea1d9ece5aee53e07839aca5491dc9069afb610224799fcbd4b3db9053927c0f3a23ffd3ee57903f811234798c28e807184921d2eb49b8a6a67db08f0999de6a48687742ffb1129378f6c3980748222821b7870796db550534b81616c9ad6b4bc9216d1c8ce411a50cbfba449b91335ca881320c71273c72bdded02643ac0c498a88e3f168300ddf86a7ef78ec6edbcd79e05b214f7d0085c25a1ea1a2b5414f807b62518f60aa6d579899139a528a88e38c940e27a056a8cc9dc3d08195ca391599fc61929f7566cce747083e6902ad5589842731ac91f968fc811e7cba64fecd07a430eae14f31760c34e791b726db47bd3169ee21b2e12b88f62d72598456e040ad11800522ba16808d0b508f0ff6c726fe53e5bb3629964d044b4643bfeba0a34034502272c3f3f750110bd412994fd83fc1660b5a370bbe7b4fb01f00603b30a70623b5356dcc3ee4dbf704b82138d6dabe9ab80ed5c628bb89e10ccae67e4c55a8769e89ae024e8475184f82eac62d70d3a3c2d935fa87be5ea098720589a7ed86b5fe6c2606778457bb278821c8e7552f8f120168ee9de3af6075040ce3b554052c3b738ab9e4eabc699f79ee908f519961e2c1d7e7474d193dacb67debbf9d4ebc486bf6f0477fdb8f376adbbdbc88ef757246c3ef908d9c6eafde51799def45e4ec635fa4f6ce444162458fdfe193016e17697b9b54fbe74a06940daf51db49308e6a8e922ee645717935b3543ded87a9464ce5ffd5c10a654f2525cb5bf357e1d06e1e799a04c6a1353c36eff70cd44cdc0e5873e0b929f2c1b806401c22691d78c023d57374426006e8dee92ac3bdbbf4320b8b798706abab25cf302a4e82ab4686499691bacc4d5ec0538009d4d2291445af0dd56d4f497f0497a2439da5f5a921b8456951941fbb93390e5db7955cc9fea08b0f7f5955451847f0685754652e8bcbfe2550d55dbd96891816ba4de87dd210a03866dafdcb0b659d77334d1eafcb832aaa19e83b9c5b391a931b9614955a53330a654b065bbf333db37d03e0d35f208232ba81ed4d397d0b87dd1b6e723c1bd07f5a0db081deab8e12c4b227321879ce34971cd4f27b831fda83e8409a8d65616ad685a210903ae2684067bbad66b9f5d212555af323095bbc6270822f3cfb8f606092e41418a1a93fc357d987ed3be99f169dcc8f80f981f8bdb7a42109cb2e171fc75ed5c8120a0444001d81c97ccf927fa60dfa690ce0d89567f6300c749737c639c7365b18f755aed79c1a6122b0fe4294f54d0ff9936f99b8837d57f5e9ed0978ebf3c42bb25031cd7ab16facf385f7b0ad50c23f284777610a06c27d1ad4fc359d1a774d938d1d7d00859fa82571db1d4911081fa0ef76cf667d681ed5bf63a23add7a4d58f17ae887d47c0b500254067ff589d9139ffcc2ea08bc17088839ead6cb33942a5fccce4298043e33c362bc9956aa0a5672c47183a59df5a8704238feb32b1a0d03932b79d5b441b36c059ef3ee83f2444360b4d9e1ce1e81c4cee41227a8584fa3c045240ccc25ba131eced4df90ebe0086820e479a268b70191a3d647e0295bb90c7116e0ba3919c9e15ea83462f19abd668cce5f947547e68d8593760fddc306e5c7e2b3efc364786ad2ea3bece0e74ad68709e7ccf5fd5fbaee3a08fd51da4cc1af30077fa2644c8c37bcd13384ed2a381b4eefcd23c5a2e04861b312797a4c8fb2a0fd2a6dcc9178fc6c7a0c015760b0b1600070155103065294c64aa1c52648bbdbe78309cd999712d89f2fc658c12fd08ab702075487bd0411d95d8ef8f1572609e28cf71c19255d09a2079eacc33125b6369e44ba0684c964325946b86700b3d704d855fc1ba1e893352ff1acdee883373f998f284500a158cb67cf802ee57e222e719bf5e927278ad0ca9290d1ac97a4cad681fd324132e3edb84da94f8b1cfebb0828e9843e18763cab73175962a6778440d8d543d60d4eca5b5175281eb4b0f835cdd1b739d9dac882687b0c0bde04a64a0ea7cac0ca61d48e61a816b952c20456c09e330c6755de9edeb441c107fc7eda18ad8dbdb036a4e0fce492d9d2a9485c962cfa93656e38c4b605290864d1275e9c40cf045fa1c8194f8fc577ce901699020cfd02779ae5559fbca14974a42236b19c7673a734b0cf4061ef2e2a16cd812525e3584629e916870e4533af320afce91420a11e69302f1b6e8f8c1ce7544f12f1ef9bb4114111871439ecca9dee6e78ea62cc18307e5c9622a1506646bd29ec3ae19bbdcc812d0317c80f33899e6c04e49c937990ef0b88fee34cb8a47e3096d046f30f154134dc3bfe11935b08535a9e9b59f1ab6b281e47bdee535ad2d79da9a128e0535676ea98222d6f13560d916473bac212fa224b43285a25f1a1b52e6127d20266bb71f4966ed3ede81cd4292e96970a7445057ca4c4d01ff5679e282ad8049c28a0a10f693bf6d74065cc3c702d1a5e9097d0204aa72f16027b6bf6f1f753f8986adc9e722c3d0bd12f49aecaf2f0426d352eb8fc5be8fd0d6c19c306a880611040487b019d28a19713ff7146c10ab11c7ee48578c84d82706d93041647aca58e96ccf2a55050429b65841627d991ac78710c2bc24b4c04cf6e0416702416bdf0781d43553560ccc2d59499e0fa4f2272e42b68098c7888517f845b9072e693330b4b52f8be0127738033feb4b7c4bec1796b26b192431d5728ed303ede19a9f84799f3a6663115d56ecb148a7f3c04aa8f118ee43c40c1344dc421c44bb1ed66446df59bc10c6647144ff4abdf345bb295c3988fd1f8a7d596510cd5715bea47d89bab83b4b236ab0c5f7dcb2716d1a2ba62633c27fd50e1d8291a475a8fd91b9256ae1914c79f9d7128e7361eed616dc66f458794357f0d75d1ea19ee8efe5c69a5c89a4d97c1ef41dc4a04d68c59073435baacb63186e4ac0890ce5ab84c86a1799b4cc7f70dd45e7139009aee8effea6b996c72cfca5410c76484e06f46b7639d310ba95177e97d1454e7715b68e39ed6d84deef0588ce83d8374f047e5bd1ab6f4ad0c4fbe0d5a5ed71d6ccb4344c99581d4690fcb6ac39822e1720d83c2c243fef4111342de277108e001229c43e5c3fa489dbfe0dbba8749547509f6efe4ecf870829f9ce599863052ed9165c95c01013b0093eee059d3fd9f33d147c743589ca3b3f16c461fa931486e1f8dbde0dd478ab749799ada6b602f5f21ec41188820c702bc5716a36e5968a41814f3aef7281636f4cc679b01109355b618517fbffbff47fe5ae22ff3a0b57e0a821061ab3bd108d324800f3f7a069b47fa4b2e71810e413f5a39782df6fc44b6762417f993d26933eb39a6c4d45f3286210b34f4e9b6b35dc2a52312d284463ab64bc3676c53e6e26ed5798e0379553bbfa2d6b1386ae841ad70824b8758407a5976ebb9ef41eedee191e3e1b2327341aba3131e89551a2f734686faabaa8699faafc451f611eb697c0766307cc95d82e3e14b469029cd88aba2c126a1b8a5c360d856ab9f4c0fa734f61b86e74d72886d9efa60cb924cd2005113c0edd8d46cd47a3dd23cc9e78d0a42e700db540ea01c1f9c620759e4eca30d385658a53116c95cd181f17e9c91996c601e7f8606b89db75acf424afcecadd65586b0d5bad2e35badeba05b7062f5295cb9a1c5a71316cda1f40370b57eab28d505aed65729aa3b50d9f156ebe2e4f75b90ef8362c644e16adde0a0f466b85ad714fb56ebaa3a0f57eb621a71b50693c99d68023accc06c14b1d38052566e3c7c266257d7b0da8a71ddb576f0906c4ac611e46a5d3023576b6a8c899ef57a0d4dfcc92297b77eabd94dec7a0cc9ef23160500add605c4a9e56a1d7e2c4a99fd45d8fcdeb5f99fdab46d835597d13c56af495be9e671774f41012f3ac6e0f18647a98eeb0fcdea63cd1276e5c199cb8abee91e89bd3b7ce92d9a995d91ee712f360f647e0edf92a0b72f9b312daba09fc4ee3958253f0bfa6ac99e6ad36ed8baea7d627d0f51a449ac7669c5f7d1791aa37b6d1e2b37fcfe4371055eb750e84c17232091b61af84512169c3fe96cbe9d427c79fdc7b8526e620bf171c8f534b925b0d9d693fe521f3367c686404c371909ce2b794a1bd25f9ebc3bc189c9e32a7bbbd3a96b88e979b5d22269c56127e8b07879be67b0cf392cab73282b10486f8fc4f0ffa60c3178963d2cf6d8523ffa5d5d00a6d2331a396af8d7c0a547f72169989db9c455f2fec6b7f09f5308dc03999b4833b492b0cd915c6176647e32f6144921de8e7ae542329c42afad87d1ef816bee08d21a18ac8a7aa12aa405a2ed85de353cf73be4a4bdfe7ad1162e989f0dc54978b5241b8bc854816346e6493b88b07a10a6a660739f7cccc13df13aa36b10a2ee81047a940b9fdc9ddb6269fe88359496c03598b20d2af29e7b002f7ca23c76b3571a956c03891dc4d8b43bbbc65c67834906c11ed96ab5628363cf7c1d39eb814817477d47318300d5b5cb0cc59fad9237fb8af2b3a0e9b0ee9f3e5f6c70fecbafe94a3eb175971acf0a9ac0559e5e733b4e1e51f8679eff66bb4f3ec64acf1fd4b77113ad242707753659180a031a0c2787d1e912ab5390e0eb579e0f52c9dd46ad1e937b6d6da5b258ef4ae9b4f7c0e30235fa8f82837e6387f6dada8c033f96b2b35d37e6afe92bf6ccab50a699b4578e6291b01acdc67158c6a5da940c3c988defc3446178e495b1e7955f802d5cedbb277d4695d4d7c2332739d6a8649f934dfb53eeef691529e701816451cab4d2f77a90e41cb3f39a6a979010bbe65b0d2f67bb1c56b67c1e64bbcc570b2be22226d284db796a67108bf2eadfbd9e8075a39acce000201d76d72b0033135d1711685b2e58373b6c547fc951e9253e8612ac78451ac6799166d00c2606c3fc891da1bd85017f31b5855bab2fe4f7fa65e7f1c1fa3739f224523453e4e00add635e42693fc92fd3cd5f5ea5e27dbccf9c60d76bd3f20f4313eca1722cf730b30b0b607b1f127ce4611b013345ac2e1c55612aeefa6151259b2cef8d274a6d808c3deff876f134aad8caf36d7713491f50633cf043be2773d6513de7fc797632ec4fe5a1f57e0248ecc4a1eb992b9da842c1e576bbccf9f69f4dfea653f01d322c4fe913228a8f73d0880197d2f5b16f95e706841ceedbcdc3e630ebfd42e4fbcf969651ef7e7986fd7e5ccfcd2c594fc6377b8b15061ce8bde3208593ee9afa95594cd379ecea8d9d6953861769e3f0fa5fc6e979845cbb61655970b0f33757d9682a0528eae3b3e5fca79c7233621e549b8fe1dd8dcbfb98b294aa7fb431eaf09d9954c4e7858ac5af23abd5c177d31dc53931beeea4725935c11c95ef66847a296ecc6417b66a33150a378ddfc38c1087369f24d451df36a2aad1ef28d6f8ed0fc2abff5986d8f7e0c318fc400ebfda28a7c4151dd4ba9df34f63b376c5d36593fcc8d39ed0c1ba1147d5ae9d31fe117a8e0147842f2d8bfec29557b12fd1a13cb8d33b79c699dc778eb3c1837d8a7875a1c124fa441d3e6c393f4bcccd42678ba7419c637b1019e3a23b550f01c6aa4d859a362a02f87c5da9ba58fd0e40256e5da1f3013420cbdf21abcfafdb44a4adb24ee0e03885339b4e5e43e55ea95a4036a90207cf11d326c6c3527f5fe62d1ff0c68f3420d827797a0cd0429399527a6256d3e1e4f2dec9a7610daa41976ec496864c2e8ed1ddc7529dbf355589dfcf8f5f1798dbebf35bd456e970680e559f9147aa590c11a2a6dd9400c2e01d08618f9587a6ae2ae07ed9691fbe966571a2f5e4e2bf6764600aee15c45e72db491c20c9a3efc3d2f805af7266a4c6c0c4d1a3b0e1b43393f5e6a75aa7677a346a754bce09a48498c1307df148438c17b131debd4bbcbbdf2eab708dec772c0c2e3db860d2cbabe1c3f0c1aba46fbe4496e349fcb4ce75c5e85849a424d91e49c0e84b625d57d535f78be1f1a4a563c3b3694578df4a969e3cfa8bdc2b43e1d63732335b1c4079cb668e96f78580b56b211d0b02882c384de1df6b1d74c5383004bc33057592fef1b2446412676fb45cb64e15374e8e41405a495d7e06af1b25e6d5d243c3c03a323db283c32f8254319619c7bcf460b2dd7213af89312b315d595b2df207407c4116e2c3db0e66e00e404963f990ec9284d38b23e2871b683a2cffcb4e4a8680eda624885d2b0a18ca5e347652bac67894d24eeec172780724678010dcb7af8303bc866a187b6d6ba8293e39a9f7298c020aeb5457b700159ae44e5aa7f6f960f2533a65065d31b2f1d7ff31044247a3f4a4578fc5c1d241aff8c62c26dea309fe4dd4393c58f70fd99d123b80c5353b55fdd04338b39ea4b434fa511fdeddb63171c07ebea02762422e72e54fec3578784418d4e39a1f37a9ab43ec422a0d590c9cdb853a7c534485cc676c8e7fa59812302ab32f4bb10d3aea3427fd803ea29eac997d422808e033ef6db84bd637f4043d247dee10319fe77c5c7e64962413d70718412849459880f4e11f2aceaf89db987555da9e03a3ff56e6b6aecf83e2ab786eb7a7662de75123ec85ddab4431bfaa5ecba5192fbe3da78b69557b9838c2e80bdb0b17bd1cd4c0bec05955153bb00a7b4f5f53e5e48801ff03dd44528f927f1fccec4bd27dc99188e512ecf9ec757edfdbdc93861a7a1f2ab1cd8d7c89370617393700071efb9b8e40fc1b287da3ea21a40d97ba6ddf09ea1f5b85c80144b59173746ec41497e68c88868830f3bfa9dbfb808b7a2a1f18ef22905214d6b87bd176a02974e64f33695ec343de98fe1be6348633ae2116f46023ce386d97a39b3f0619e16c4b4c4a3603a113613ef787d01469c6b97980c648209e2150e456a8e2cb14a6e24ecf8333bb82a5d371da3089b2255772c2e1519969997f35e345ceac16396112f9b24d03a593e6b1ca74b15afe0ed487a787f375801026aff777068df414a8a131b869f381f1052747db32112fda75b14d1d2e9c26cf1ca784fadbd9f5b4421f909d3c5f9686c7f7b89928065957f9fbddc7672f451a27a34e6502b9b145877534f6fa2dec8952ab5c88a5a208168982a6bc854f9f24bc0859ff42ce267db1a986bd8b4fca30aeb6044a81a32243690308cd49d3087f03c633fc136c12a510e69324dc907037ff1891c9d0891affb5007081493bdae1c163f3c3892add19b0e875737a14de72ce79908936f53314275efac2856a18729a07b68c365d82f34108a1cec2b40f14b12899de72c9f9765ca44c88324c522b38127d1a28586bf438df227f45fc333d8a7350ba832e90565beb171af12fe2ce9a9b917b8f70f647263db1fe1465977d372b1f05b0695295e170140b26f76637876554c9af84e46d41cefa66fb19b63d50647d2d5cbc1ad6cd044ae633a44f615f766da1ebf27db4e7cfe54e30b3decff34f1204d45b101c391740de2028bebad86afa3612d12430d8d21b9292bd4db91fece62de29e124cb92921206118c5a98fe64910dddad05565557df5ae0f818c11d62be94bd7de92db51db0d363b16c3ae2025da25c56a56337a002187225400324057040b629071d0d2ab12d942f3f23eb07b6518b8bc714bdd7a4a44fc3338bd80c39012575f37b0bfef6222d891086a02d716a8842d93a065cd52f3ebaedb970a2300ffe479ca2b4334ef4ad21a60100eeb6d44e0fea2fc9f371db1bdaed4ebf1eeca98239581fac73f5f6aca366abe5aa540c3317878242fedeac273c9aa3d8b3c8135cc50df0a891ba56f167e4c7ecfa3ab9f60b0183bd011b117dd2fd9b198aaeff248ab3080038fb09717d0c17c6d5f9a84f625fdfd1f9bf5cbbe4722b92e41fc143a845445461eb3b864d635e781c37522fb1c2802281a9bcbc63bdca30690abcc8c974ec5a0813bff3c43c08d564e24928748eacd6f152113f55daea41d0cbe437510e09d3ebd03839e14c99e222bb187e240c363737862ef8e4f922d42b605a2be1399070049de46a8a840380bfccb0786cb1382701e66b1cc2f4af73ea4c1f14a82c78e7b6690e785d55b84673fe03e8709630e45198bba8710edf9cecb7817630ce1ad67b83754c975bea18d51b1f9c902efcc78df2a3a9e42e44d53f6760c48d4faed7373794e9196715e10eb3420677b68830b30f0caa74c0683d5f84e9422b45c9dc8049aeaa571915120f2426aaed6e82bc28dfa99657451b4aa29857e6adb7bf970386a8c24942794a20e0c029d1b05ca891e3aa72f715b18b254bf4003a6e609c5b09842903b405802a20301b063f25caf1d0027b6abea5a99a5d3433746d551ec03c05933375325249ea199ee7f471259168a4f102e9fed3edecfeb820097edfd7ffcb62a6e2ca63c512c7cf3e0d006c0708cdb6339546680781be615d616b5c5be61fb95337c4146ca7a4abbce54c17830c5b6d3a23b21b1171205db10ac1a45da427d1c9ff117885208e8550381a0f9c36b31f68e61382cfb3ef39f3b7fc528f13b8991e5364f8babfc1937aae65073f0e023186c1fb16fc004b4702b069ce61630ffe1308ee44fa1477fc8c9416461f4c5ed977ebe33ef30a19efb43ba79c5f3d752e5f3a305fc359bf68f8369064dae53e4796f95c18fc5f5b0348f9e0d102e8d2e3cde490d7a6b773818721de8b5350909ff3fbfa2e757453157ce6bc78fc2ec77231715701ba7d0e352ce5f9851e329bd37beae361ce207086151175978bf80205e191c03e432e5d15d6d60b7803ecf938ab41979440b41a4408f2a100d782529404b8b0e8f8ee3e2d62525adf116d941005896b5845dbe75d427dbbbf897288cfda5d8385700750331efd3e57e4376cae9e8d443c1d064076c6641f2d3d142d500e2b201a547f6843ad07ab1aa52015ded274b992bb455b045ef68b6fec7bb66ea2c817fe3075fef665b1fa6ae0e7984cd76abda6388cbec925f4dc52a60ec470ae1c2de8dd7a147d5ec7cd0a3f858324be0436f2b48d1f09d6055cdaecaf9735ba1bb4969add5496c91504be61944185de14d4abc9101fbb1dc5cd394b46eaf7a5246e2b972c8f9b5fe7ba5c3a71bc87c765566fa2c7aea9dbb971d96f31949ee40f20136e69d331d62894ef69f6992401b9c114a369d7ad2a24a153928a26a98888716eff8fdc73f99ee8c6f83a4c82c5e12980dad873e8ec90e44812dbfef21295f1b818caab8d8c266538676e32209c7494bc8ed248e9f487d3a37f97384e22c04328518d62a13753a6b865f7eb925924fc1982b7d09ff2da6acfa429830e8c941c60842a65fdde51ce6a645c6b70c1883c9bf01d1ee1e4d6a38cd09aa105a81a4d63488e6dec53c5da7c41170a02eb940ca5ecbd4b0f287f665286e63312d60cc0ae46bbdc46da56bc782048a6305808079e8418a0e6a40f76237fbb80055a6dc08508f3e8f5a226b15a528603c5b1636ab05494a5417946cf1281030f2afc77e57d245b2cf186ed1c4e0f296b18116ca0f88ce93b46014a1071a0107d3bf415d8b2f67d309bb67a92f336645648e39a69388a3c4eff08541d011903a80ef248b0292570dbbba35c35c4a9b5d7489620abb9054b81f01e578511a1566e886ba3562b629086301cddbfeb8ed64e3431ed16f4248c7b1e03be8d4dd0cc6942b635fee722883a29e4c9d366a2561c3c61877e0ed9bfe72267c87388d1ddd09853f551747ee0cfdb641eb0d8b26c99dc24321e854cd0bf484e77991a796242aa0566751567f4f916a9832d9edcbc7d837e73159fb953433013dab0a43577f2d27b6801ed39c18c2ee0987184c3a2083084b4d19178f04a57352511c994b0ade05463115e2acf8df171e07001fc855e793cc032a3378efac9c077d256158460b141fa960a7ebfac1480e8c9da97b963afc7aa2415b1878ac5a50b745ce17572a1730d86de59676ce2a75ed6b24999aa19498cf2185f8d3e59dfcd6e031136385652e6791b7a36cc65488c3f8b2574a7df533c132f5a843574ab168f560429e99d0a85816617b5c3740ce6bbdd5407ce810d89f5264d04957070d9c0fec9345344596c6d108b109a87e24a69a9f943045c234258597269f5d6e4a9f18dc5c81a640bf4f8532605a6d3887d87bc4114086865845cc73740a33ba61effa166d1a4ccb7fa74ee9e0f0fb83fb3d0894883f6aa02608411cb4066f0a1e13803204dec3fcb752955e38842030011038d3780e5fde24de4e323a2bff59b6a38fefabb5bd8aec390df056664d3571fd9173394874bd6eafad73ddfdfc76ab75676fa331d5330253f9349e78b6029d92d49d6cdcfac4b7ff95cd9b601e98859664ab738777aa7b8c1f8119e7c5f794a196695c229d6bb43c08747c8bb3be75ea266155bf298e8cdfe79e76e635638119cc75374232d862f41db43c6d94fb050873c9bd4d49342a7fe83f72598bdaaa290bd668e7e3c140ca105886b2c58bcceeba85e07f0fe1efd05fbb64943538e4dfa1bf0f93541b4dcfe0b851aab84d28dbd40cdc03e6a88b36d5286e4f5f1788e7838943fa807a28e01e073ea69fc43443eec1345cc55addb95210ebe063f1d8b706e32a2c07f46f14c832fc6006d49c55e08d8138b35da85eee8067586725729212b64f42f4821a7f87e643a18584144a9a3f25b1ffb2e587f82c2f153584dccd6307b5a4fcc2c80ffc4d05831b99a396fbe1b06ed2d32efb010a0dc032f8da1bf425414e59160e1b5060b3918ee20fcab95889a6c8966b626ae6e7712a0b9840c1e4b0f23a5b513147c96a5e46ae94326705b542bf0dadd52a8f674a91858099645ce9027dd5a0c490866c603e4553069f83112626cfcb145853c345e22abd7cd523da016b01cd5a0f56e25c1be6a0f663bee2656ecf3030b8901b288efe0ccfe8ef29c4a640c263adacc4da23b8508f2b45c9525a9c12bd4e9e1ed0678c75cc043562079c5b6738ac383a6d0aa29672cf1f9a2dc26d24c39ea1c44be4294f0cfb778032bb4ec039182f8adcca6bd4b7bf26d32d5f4103bdf4a7fd009c17b3d799bbf7211df69d0eecf0f5d9f91e74603bea674fbc406089d8d91cf19cee092a83833ca087e6ddbe013b8a51336ee5732f836a02a3da209ae043ebb8efa3da1c22c7d9ddcbfd740a297f0e6ca49e216a55f991965fa488d6d59138248375c83cdfcbbdf2499ae6c71b092efbfdadb3abd99f68d1015c514a96611ac4478de084e0fc6a0ac8af4130211c46021899b31740d6c272ae3a6f4a32ef5a0d8b47a471902d0befb00c155604da21cb7b80661185d8972bb2c13d3d737158141f3ec3c0118eba2cf2db72e1be118da48461317c91ed4f231b8910559552906897efc6df265f4c4f4ff6022f50e4781b1adf7ab6fd9f4ccc2a038bde01a438cc0c31b0668b004601146f970648da576e25ec340ec74d773258134a2464b0cc610d939d196f7ac468beafa1d28e056751c0487574bf13a2a2c260026a0f7536ae550ef8c81732c04b479984401579bbe9cb6569912a2de4b9f94c2884a00550f5787dbdc59befcd5edc7a907fbe527025045711247109f2c65a166901bdda09f9607b681a6aa3cfee573c3a16ec4797ffee923ce63cd1004613554d33c7e394fce7c177bd8d51430cacd68709fa9419f447af528338587f8d15f09bdf3f0eb3e68bb84094b0cde779a803bf065fc795b39f225d23ae513c0890db1d1544fbc618e1165396ef425567218286e1c545a9259b0d5fc8e3edda1feaf83cb05a744f007bb812537f15d92fbea58a69a21aa27ca3071c613f95103ed66627cd5fc5ac2fe6310291b813ebc4fccefb98fe125248105b81cd5e672c863d26a3abc219a23906b9ac71183b1270d7bdfc78a999709e57e962065d90347de03777c3ccb1064afaf61251b739ba6f4f01e2d2e593661b22b26750f1054bb52091600cf7963e0326cd41d89e01ff971220ca779e128b0df240e36bcec45c9c1bc962805fad151b57538dd34108d5ecf4d57141a9a6359b17046aac86eb4d7c87f2d1c5c54e2bb37a9505a0f8bec8f0fba8688c98074bb4b99a7635eb39907eb244838c66ac5b2c460307f8651b91ac0c39096a097514f510b37d036ce3f85a609e5be511c32ff665b361e33e23e0bb3c796757eb87a24657550419fd644bbf82612ebd2a1f5df7b47bb30790406ed091b41cfa22a7138fe34d059331f233ef834f91318186344e6c9610a99a5509092d4d5e592eb12f36375a5b5ed996c4b244c360c84a2e78716f44a6ad02e51c21cc3c2d40eaf2cf9bca47f0111015e97f1c22982efbc28ff85e24a6fa7b0f67228eaa1464dba35b027e493c8884bf9eab3330be78f913f9175b0d185f0360e6be7a183f08a23301b8a5993854c35fd1a3a0ebf0c9792733236bfbfc36352d5e6b74098cd85ca711035b8a59c349872dc85326dc43eb4ceeaa91cf2d5dc1e8da196f08845d0f89e326f773b050ac378f84a8fcae0f32da42d6c583691077b88c7792e8c2f4fb37a9711377aa537b9d8326ee1b3525930356501fe585442006e3ca43bbd0c4e2172ea4e484b5124b0c1e1842464a41d4131963358cd941c9c421169f73158b2d24dc7e3fbc63daf7bec2f3130c35d580b25184181b6ebe525489a6ef0e5b2e6fc165f5db7b89bd24fb014004a1ba34474ed58cd851c9012684790b5ebb9c5345a60d3c43c91497c2884ed4d87cfb0dca3abc1c0f444b6ed6be3f9d0b6be4c41c8fa42d5f41a2c8d20b2ae18c6212675004113788c253254e2b639422a07e8542c8b0a56f4b6d7cf01177f9297e6c4cd9ae70524e3de07818a2460858b9d58ee7fb202d647d26be48dc92f9b2c1b02aec9b437d23950c44f29b7d85ae2694cf8a5f7f4e6f97193316a9cb4b4e6e7371598ffc07d973d0c209edefcde2d0fb4a32850ae31f0231cbe22fbfe0b6deb502fb19c2664bbeb287d5fcf58060454fe480c3dde89da6e831e80bf27c1336dd55248818e9fd02f29a0ad41edc925d5d8140418c29aa46a65a3b03e5b01d95d98dc2fc025155c0942aa65151e9b42c4392a25d957a255757a619fa1154e531afe59a3ca24b47d3370ca32d2d6e61e6e68e57d868ddd465ec072a50ec4f9521ae2a1d40b22d585494b286ea88ea9859b985af0d02e168dc76a9e3aa1f1f14df3cce482912a96786942d2a654a0923dc72784a00a8d8ee8e2561260457b4998b6986424da99492bb368988dae76b0ce1bfd2c46726ba025d9242a05479a459838032a2da2e5c6a9d36cbc0a6973bb4ad942f5ef60e513e1ff4a84001615873dc3facae7353fed6f5c5b6ccc7296d0e3db4017e8d6d8fbec752b9356a800be103d290b03e4b17c88ac9cd137a06004b413fa117246c8a5c3b92e0d937df2471982e177c547e209714131ce83eb29afb681ed3d76aaac1b8494c1fea67be4105f8eb9171fdfc4105c902f809bc76e3907bcf4e302eecac7297394afb5e235c11665ad34da2136661c31ebba3ee1cabbf6ef35619d754707b74ef7b72e330b805a2074b48ac85f2169c1b23d9895178d0a6ac08fff6bd8ce7f3a7f05799ad8442b2e1a333f74fea27f0ebefac61d97dad818c554a783178dbf72ba8a7c78eefeeae738f390f4d3d0f0acdbdcb815f7376fe1ff03573e0d17a9e4a8633b0be604e5b9d0e89741172318ad62e58c54c8fd2ebe9bd34749cfa00ff85ea23f3486d8b242d2afb7e1458bdbc1fea2133adf7bffd21cd4ae6ef49ace6a69cbc3613d6e1f88b6a317ef389de8ed06180882539d62d1aa55bb3374ceb759ba2f876e0990708c821cbc4b2be4f4dd2a911edf3c1f9433ef5e1864adb28777f74573f97cb0755b6dc9ae7190d63c66ed4a7022af21c16cd60dbcba98ca4d1c1fedc592f8fcaf5b2d365801292ccd74e3a50ec833f4f011ad1a36676a70eb27084cd228a079ca8b501ed260bde187ae7049eed205a885a3ec435ad9ad9004144c8c0aae5ebd0dc239bc177ee3e77801d2b8e274aa93402ffe013f8263ea4345a4f93e6d9a99ed9417f54065f9f36c9820262d2c864cb1f63565651f56c6cb48b44959d4a0f807c17942c65861c8e9a9014f18129a581f52140aff68332820a120f489259e16c1e851ed99b04e74f55dd1e6af8505e8f083a89af9b333e385597f2a9187ae7d01b1b6760b8c920b88e390a5590e26493358a369d83dc81b52b6e009132b0cf971a0f04428dd2ca981ed4b8141e00915da9c1818859513986f5ba13cd065704e1e3808b60dca1ebc620cc7b3fa6fd8ab7ebbb0ae9a50589a46989c9d204a10d9c0ab12889275096ad530000bfba13ab83821d3cef3645d7c0aaf1d43adfd961236b0af638bb548805494b2e84dff97b68e46443fe02b076635caad3e933ca0696ae3313e390b4e77d332a82f5179d53af0ae96eb8ee94953f504fe8570b05d5d6af0bb83168630703562e44e8bad200868b47e7e3122072e479bcf326f814b14eed5cdf51971881c7d2c8d93cff9e5c5feaa26f7836bd4b8c5a419e2e4d80bf4f4ea80357237561c8fc39dadaa714fcdd49247b0d298d111020240bdfc27d6fe402dc53336a6d2f3dbdd31fb714d6e7ba018041499e08b82ec2e4a995afa30098b8aab4742acf109dfb577d14ce2c45ca44676605d70c1b374b86125620cde520f7df9bb597fd1f176d7c7495c67d69abf8274978c416dccd75cd5c7793521d3810f8ba7abf5e7e1e58a0ca131d3ca7a5ab5414de35924db31bba2c757cc1ddc7f78487e21a8468b5d998f7de2917efbb90fb1ca4be245c54d924d0c8921ffbc2c74892c74362f0f776c1f8f422c8e772c9d98cd5cdc3f7b2fbde188c0f59d7245436c1abf6c57f6bf5bb7a0ededfe0b581b318c69b512c192334a9cc8e180945718b721e0c862eecd504e8be58ac427d023a6814b66c56445cad88d10dac1201a99b3fe3573de8fa21939af2c704f60021bbd940ef6e19a9b3591679c5f5c207b6c665d8c039e902c7aaa879b34bea00a88055e5ed9d2917744c743a1578eb3b4c3ba1796696dbf26984e6d3febb7da629b2ec70fc069c83f3b90a27f69e6ed851244d646049ba2535964ffc00cfecc90cb824eb71d72bdede68e13cf75420346948035ec8fc349ecfbabd6b74d967dd49330579a058bc195d83ba0633bfb84da23c119bb423058364bf82fe203d2f85fd19f685a9ab67b8f162b44a783a3ed1ec0461cc5f0c6e5a27add4fef6f7f3e2598790f2d06d950ed515baa17299e943752279b2d1264c4d9983aadf0d08aae596861e490227a00cdf466f198313d4a43c9387748aea4960d80b0db04a852c0f003085709a412c571d89d3afd3a5d826a80c3cffe80797f82b8c76a6c0768cdfb3a2fa897261812e1d25e6a7a26c0715df0456c8544202c097512958924870d336c4727280e1a0facec37457b741fcccac2f674b0c2d817eb550dc7712c14f3b252e5765acc7e0f0953b6fc85ed583ffb16f955e92ee53a67641b0337a9e6b346d4ecc188fa626e87017b7938e5076ccaddcf9993dad848d248c9e0c6843bb921199832b95ee8f0e14093c74de8ce468926b024cdf2055ae04f742072207b000a1a1825f01128dec6729e92665cb4fd8cc71b067e0508a79239ad6618486a9408c501d25a476381ad9d5bd06ec6a4575d404d629dbc9beb982c5a5feec85532d59452c4e5e711ef638b9e497b5cf7fe4737d7163da3beb7b20996567ca90c4f464fb37ac8726b4fd95eb00e56926a82e21c2d4f6d5103d3e8036c67b3c137e1c2986c2f3b0805e0b07d9590e8eaf847b11538893272901c43d7c816df0c4f508f7a0c3fac0d9619ef2151523ef0adeae53582540a92e00039b47d5dbb659f941af3904d7a689e8cbb5c1be7d735dde3cd53a189b13097f2cfd37e914274d7be1297818a3b388904081ec67cbc2bfb263683592fa3939205c239ba87f934d33bf754605294a3c58924d711671a53652617670404f1fb701981c664b46052437dd1d5382e83321aee1a4c5fe3f76693303881df6738b1909cfc9dd39e57b0e67effcf7d4485ffc2bc5d101413c1cc2018413504b2509f103da2c6530964cfe6aed905e32857b3e7377a5ff039a20f75470d133275d7e555af34d8b585ceb385bae90ea3196e30ec9bf8b4da59e8da7428313ecd322f0f82bda1bfdacbb49d2be65f519d3ae778c1d767e09ea77e01f84e999fc344b1e0af2f45500bf47e5528bf1c6976673f0bc751cd904841703ce4bc5b10d3640b0a6d0013c0c3c0c3c0c3c0cbcc6f05b5f6b1f9f24c824a59c067daf1922a524534a29311d675c7f383f0ffebf7b77b7a676e804089f0de20d910d6e48cc15e4ec67550b7fa5363466e23b858b2b53171b12e4bc064d693e9f5a7e0d099f7242bdd74fb4436a48fc8d414693f4a421b1dce3767966f73a190d49f24fa9ef94d9d04f9e21712ce5a9f7856648543d9953ea530799538664d70ab9eb2fdb8a1d1992c389b99655fbd24976031a63304d97d221b6f289a172ddb5bc52e14e1c86045d69c4538e5da6a50486c4d894792d688a193dff85c46c419ee668ee2044e485e4181e2cc74ae57e9fd38504dff7333fe129fbcf91203ec448c6000118618011061861805114c8fb282388e680061792925ec745b74fd3996f21f935fafe583031a2612d245afe6ca929ad9508390bc922d37af45452e9459e34b09018ae3d7c980c19a3b457480c2a55caa9f572e769adc0d669a5e8361b174ba6d8e197f1762f6e021a5548929effc45636215f710c9460f5478f20de4fa04185840b2a5bee584d49e7eb0134a69014a245d65a5d7c9215292476ba921e8434751569149233f46d6ab9539e552824887a0d36a39ea24e7c427695acc4a8d809c9a7d2756bd226938c65380f361e3e468f1d6822a0d1846419214af37cfaae3cb234d0604272759c0aa1848693a31b593bc6a30790317a84d1051a4b4830bd51d1c29d49a0a184e4ec3d9acb5454c7d331028d2424b87b0ccd4e96daab84041a4848b8b694379f58cb6ff6111277d594d0a6436691bf8e4786348c90e0baeb312332e36e8a8e328c8e022222e203480582dc201111097283b7028d222489ba6dce719376d744482cd99d265414d7aad21012d662ec52ca37ad6121245f69b91ed754232d28084959d6828e7af9e37740487ad11dd3ddce0f926fb4fe56b469f820f9fc3a7ce697e58cb61789319beacd3c34442dbc488e1a5e34c7927af294bb482a79393d5647178999d45353fed8b359cc456257283dca63abad76b848bc58a3842c79d13ce916899d3673e2f3e3b2c86c91b897d489537e2d9273d3877e76d7a063358316c91da7f272153a7244001461c62c36a17b49b2483a1363363e63a5ab128b64ffbf5ccb49bb534d5824dee725f7addfa4c62bc17e60053ac698f18ac4e9a493ff57c815891fd764c97d4d55526e45c2b9cfe99863ae7f5b5624c7a47498e88a151b5a45a26858b78f22cd652eaa4852ff41b5e6d18cdf9e54249df0f653eb6955161bd9353350915c1ea62a8b66ee089d22317d9dfd5c8d3a69615324a70e4ae524aa7b34795a4a91a0a92ea77db88d3d332992ec45b3534555b173678c22f934b8e9aceef74d510d334491a4aa62880a953a663466334291bcada34c6efc4a550745f2ed77d88e51d7532b0a667c22e1f5ab52d89137ffba2792825fdea46b935bd0744627eaefb42c192245e8347222b9d2a8d27827459fcea3199bd8cd4ca6fc74eb29586e7f04f1314313372313c7ad855fdd3a1f2de262e2c78c4b14d71e164bab2eacda6a6689e4a076d12eae99f6d456223928554fbf345da72a94485ed39946c8cb26917c15ca729f76bdec839461748c0021c347cf9044a2e7a4db63578a96d6482469cf701d6339e8b60c24126b43cba8b7fb88643b1d4ee9ebd40c4724a6cc2684a90d37f579239244c91e93df121a4637831109eb315a5297ff5436c336cc58446209a1ae62dcaaab354110e771011191313e4810e7911491f82f2a63d0caeed5a144247faee7d8de071149d1caaf6f36e610c969669350d13686482a2da2f25d68aa98f24224e65b91b35357972a4d88a471130bb25fb932db4124c5a0e9a54ce6d49e4e4124263d32689231c70aed0291f8e6aa9974308d293f20924a4e2f481b15b4e870c61f12e692ac86bbc70f89496bdcb4d8d4c81a9030c228638c18ec2041daf1e33d2022524ec0e33c1211f101a408e00833fa90f47b9fb3921232abc887c4cbe4ea512e2ddddc43822e95641e4f9f2fa78ac20c3d24fe8de8485d93164ff9831979481a11f2e294c6fddc2522c23acc0833f0c0ace9f54b6adfe11d3accf60ec9a797576946c358f0823c0666d8e1edd4297d3ecf9ef9c38c3a245d96b98ca7aafe9348070644449a0e89fd61abcb44654b6d9a43924c72dd6f76b383070f4f63ec2806cc9043622c95d7262a34230ec9dd1b3fad7dcaadf61959382488fe1993a3e7c2e74c44a4c78c37249578a690ebb9a0c7e486e47fb57c32dca70933da90d87e6a3bc8de381bcd196c48fa9362c9fbdee33f3302c4475e30630d5a1acf69cfc3c5f2c9a0c15be0fc09ec9e0c1a3cd271be06bd63861a1293a9dcd1ee74526aed196948d62c164fc8cc0d7b3f1a1263d708b1142cc34d3d43825027d38c8e1df6579a21d93fa5ac963dfb08959b5186245d3196be49d96ca594e13f7eb88a31830c5fd8cff48e15af1e8318de0fd98d9a2de32c468f1f494484078f2b9c981186c344d429ad490b86faddc2329f0613da1752a79385d8a462772e08191e18e3022a82195e4057ea3139fd201a9fd18524b973d6a347fac54c501764c7183bc620e34c8c17e30433b8909cfa3f25d36cbadefd2d24dd8530cb62b9ad1dd44282ec652ee99ae752d2cdc84272c9743f5ac32a85195848fcb815f6294b1a987185e4bfafb8b4e3df7d5a6561861592c5836b69079d4c4d618888cca84272ccb1a753556964cd665021a9af4c5a30bbee1d0a33a690a473121f19f2b9cd63a4901494aed64b72e2b66e2ecc884272fa71cb91bed982ce8142e2ffa61cbaf137e8cf6c61c6139292a9d63c9d4c6343d3ec84a4f89011ef7e32c48c262469c77d06a144021f64a0b78088087a1f64a0476698c18424bd7b31cbcc3c7865fc0862b6c61f58818e09cc58427227b9eb95ac63e6ef8caca122c607d10005c028011ae383dc20e1c1c3c5208188082219662821d94ee6724a59666485900d7c0437230949a153f78aaac5976920084344246d061214ad941d16cc729d56b6a5ed12cd61325325e13d62c61192c49cb949ebecba4154a6cb8619464810b118afced5649e6f46119236868cbfd184ebbc07640611926cddc3a7146132984e6dc61092b46290a9a3636635092141579c2d197593fe7010123ea7a709b1f0f3172024e8f5644a799966fc2039940e5d1ea2a3092fcdf041723e915365e2a1542af522395af85768d6783a7f5e24c8ac5fa2c209917df95d24e99f50df4109edcc235d24c968f9b92c5c5825512e12cd4385970eada6720817097e9f1734498d4d1dba4552559d8cd1e2a832d3b14562787cad5a0bca6d746a91b0d13ddedbb9a89c8616499efa49eb67fa09dd6791b4619385eacba572dfb2485295e2652c4bcef68e45925e19dd2c3b2c123c67ead35562ee62fd8ae4f89a6db6363673ec8aa437a5730afa92c750d9562408a965269f6145e7b02229cfd5552cadee5556915c991a3f65b7c6985445b2e6b83fa2bf425aaca422a9f7e2c618534553848aa48a9e732951b93aa9a74854b73895cbfe6ba5299273d2e79def84a8a614c94974bf4a5b9414c93f3ae8b20dd251245aef082bad65a2fb1345724c2a7664d097efe4178aa4caad39a1970345d2e830274a273dd3d12712beb3f6d27e0e9f6ef34492d2b7971677d779d389e49c6c94ae202e574e7322d9aa34a5c81d9dcf2612f5935e91e3b1b4d5fa42134949b66367af625e19652241af5f8993274be3e56022694376d5d3c2dac47b89e470b1419aaa6a7f272d91ec29a4791019940efaab44a2c6cc694e690b888e8fc18f17a3eccf0e1e40b4015f5022d1a4fedbab9aa59b3789e418fd17de43544e9b9244e25f9e158da983a78f894482def7fcf12f37af877fc78f1264902f2091a02cdbdedaa51c4ff711892394768fdf5b695ffbc00a748cf1852392538ca52bf2e4ce52be114922dcbf7395a67ff536757e71b6b3882479a563a8edcaf7ae88c4e049ad885f9039a329114979e478dfc67a5129a3c78f20401e6d070e1189be173c5cf0b37eb3dc6047ea432449115f6afd629eebde10891f846cd5bcf89cea236b1ac61785e84b9dc7cba293f0320991b465394fd7569faca0412489f51bd31ddd730c8f1e3a36045f08e28ebb39deda4d415c47fb178148f4ec4126dd393a7ff60872de0790317680e00b40ac234f7be753666fd31fcca43c6f63a5cab047d6fe0b3f2457d624c3edff068fd1912ffa90deca203ba939d530f2e1cfea95729c688ecff690786b29cca6e70a277a3d245f6e769638195b4d76c1177948741f534937433c240653ca6a5399a8f41d922b96a6ec20d3aa2dc90e499633a5db8e1eaddc5387a4ca9862aed8a1ffded221a92ac611a1a4771e7162e08b3924654a41955e517fe95472480cba622b6bb963784c1c92b2ae63263d4db6b5a9fb020e093f16a4e7a4661bf4500d7cf18644d92e9933635bb4d1b9212978ac3ca2473dbc53da90b87195d164a7ca164c3624a7b7fd9493341dd2e635248cd450de156236944a0d49a26fd76eeeff261ef4451a92fd7ce635c81c223fffd143c78fb183c7183bf20b3424e5f4e1b229e433a8758617f8e20c09a32173b77735b24683a741c2c37704f121869ac14420f045196e065f90212965b9744de37a32294544f8f0c51892bbf682e92416ed76b3862fc490bcf55bf23b88cfd9a355f6842fc29064c2e4625dbd79a5508f0f947d018604ad592beb2fa7524f7f21e13b463df4c6f745ec85a4e039c84831a5cf55ec4262460b961d2374e5438f7a8c5131f8820b4977ab19a3f8f5c516b6fed8f92f9449cf9f16727dfbea741b4e547bf64516d2a4da6c2b05392e16ca69d5a51997a25d765bf7c94b1a54964ed9beb0b50ebeb842d27b5b57bea96e8d150423c8c21756481895eab495928da92a5f542151f32b8615d7f628272a245e4e76caf35dde06992924c820fec2a94971cd5d0ac96d9a65742afbcee98d4282f92668d0b7512e22418f69c6b787a7ce97221245d5ec548e3439fa4a44b2fc891835caa4a8bc10916a665a764b1713ad7137592a069983ea30aa738844cd1cdd4eb144d3a486484c32f754cef31f1513166a1422b9a38a5a4ed972aaef92a10621926c2f89d139288bb96d598d41248be889c8b3eba42f350491289fc4d97e7e0391b83bb61943596a00825fdffd6bfc21c153ca1df62d2e16ea0bd4f043d27abc37f1dcf621d1727ecaaeae9736db7cb8bb42ec565dcbbccb3efb34758ad0795b3e7b28b86ac7454bd9a265b1ea0635f4906465634177a8b4c9f61a7948cea29a16465bcc965d0d3c2429ab0f6ae9644e53cd1d924f5c4fd366cc9daaec90b072a17d3694dd7548f656b5385e9ef6693a247ba91132bafe64656f0e69aa675dc9b56b59a725651f527cb7347c392475f00efbe69b3824db89ca75d1e225a52c70480c9f825788f6602aa36f480abdb199d3a4725959c30d895e16749394b5b05bd768439269279da7a2aa8cd65550830dc997952c94e7257d27ae21b9f356eed77435d450899dc959d9451babe0a53b3ff8a664f669b61a6948be9175428daacdf3b18e1d5e831d3f7ce8d0f18115e810a9818664d30bfdb1a973b864f1487a86049992ea86860a32761d598b410f1e58c30c49614b876858d2c8daf6e84019d81ab17417b79a59e1462e6dcb6e250631e8d1011f3d3e202212831e3c147f04f14186c49425d2328927d979d5184362783f99bbdec47038190a35c2e08590fb4165c972950735c06035be90f4e94c08cf5c1d7aac1a5e38911a5dc01a5c48b6a07486addc6c2931ce0dccc43829f8c208d4d842d28595a75cd29a645b35b490183687cbb051aad4c846d67efc781d3e5c8ced1a5948cc914d72dff22038ef83042520410d2c246e4ccd1031b7e5290c831a5748163d8b71d71ebee1013135ac8066676ba7cc9d458bf978d4a88289600d2a24c63fa5bb199456f4b67750630a89a1c574bdca5885cc183d7c00f91f9b811a5248ca56c27e2bf373a36864ff84a00360f4081246181a802bd4884252a526f9eb57b9729847d6da0435a09030df263f8a65f2929e913520411e0810376400c910d47842b2adea7dea67e568ebc8da7da086131265f3e76bb93cb2a6a347902624b56852f1cf52593b1d59eb400d2624f57acbc7cb385d7e5a42b29aca318975dc1cd14da1861292a377d8bea0543c9ca54612124f6ff46817e34848921dc36e9ab633399954428d231c346791ef572a3ebb22d43042c2b699f60b3d5b2a958a901c83be91da398608495154750ea6c58392a6212488b0109b99a2e79021212458fca0cb82b6656e3708491d944a179553959c3cc1280106c8f0318606446e0835809098335a4f4be7cb79698d1fe4a8e1031d0b08e985024278a1230121bb5040882e1610920b5cdce20021b6d08180905a18208416080899c5004264518090581020041637425e916cf797842717751d3e337031ba0121ae484c8b35bd8f3f0946807806f87cb818ad4872fdd223ae632e99a36645a2fde719a5553a4b16b28a04d151fbe32deaa620533e425491205743533386d3a0d3905424c914aa8212523efb76462022727e84a022b13d9bcacab93d7d923945729ec85bc57c53cbb0c420c4143408298517424891b43f571deb27ecf26821a348f0783e26a7e4773b4c42882892ae82d031898c6d25392414c99b77c48b48ad8d9fdd85802229f6e3c5b0e2316efdc89a0ec54f246611f9a0e286d167eec89a0ec43284782279638af317ef2c3be747d64e0b219d48bc33df7591a92e6d679785104e24aec68b4965bcabb64d24c6b1fc4d1e4bd95eac3591945653ba30ab4d555910219948b0cd519d6676a4fb8c89240bedb78b9d53acaf5c22c9ba92b6bca1b2a55c2c91f0ed69465d5d6c8926a41289333e5f3327ad5392153b84502231d77cd0bf6a59e36375089944a2b749bbb1313fb35b1249d9d6ef649259d48e0a901bb807c008a38ce7c00810cf002b4222917416f3c3997cfbaf0912493af308699aec9047246ed01df34eb94ed9cd97087144727e8e3176d8fcea113722316a6e89efce193ff63a086144929cd9dcec0bf2427b169124b7343dc6d1c176d48a48b4ecdf943d2c999cf506218948cc3cd98a9ff6913504128288c45b993d377d31367c88c4ef9c47669e91df17fc11628844df508db6494dfbc8430ad1ac69b4ec7e61544688c494f36ac7a9ce12fe40761f3288e41cb4640c429d8ed031c55a102288e4fe0dbe39e7bc694e1f128804dbd0e8e163b0bc648fac1983220410497117842aad3c77da33b256f787a478f9635cfa519e6e1a59432345881f12775783101ded1e426964ad0f8939db88515a4a766315c2877469e7e890493bb236831e3d46743c0fb4e36e10217b48f8b8987250a3c48e540c217a484c2dd5cdb326c43a59f2905c497bd04eddd43ba3103c24f9c8bdd264e51c42ee90a4ee42d5adc84ecbe11542ec9054f721a24606530db10ec99d5f2efeaf514cb97448cce3fbfd2977cc35da85903924a93e3d7322dbb2632f8210392486dbd0f5cfdb31a84a1c12d386c7acbfb0224b490a2170405b55b8f411ffd8496ff02fc578b3d939978bdcd07df5ec8ceeed5f870f17e37c78990f1703db905ca233e5ce68b1cd62308c91203b500084070f0a80110618608401061861801106184996a985b021b1ae83164ffae287dd6b484ee5fa9b2353766daa86c4b9584acf8f67ac31d3903856b3fe16e64dcd12828644bb98e7e55364e60c09ba7263ebd7198710332467e5f2bc4ee69ec36b43481992f28dc6efcf747fb18fac250944441ef120a3c708101111113884902131f428b31a4f4143c81892f5a48ec77ed0df8b2131dbfb6e27f541c81c0e43c225d9b157bb46c7f635040c494168f94b252796e9258a6308f94282f9e6c9890d2de6154222c40b497f9afb367e8432217621840b899ba72ae7cbddfe5b48708b25aa459b6c6fac852415e45b4465e68f17b46094a00360887152a09742b290989addda377b081612e39e9c900fe225e51f59d310888858c81592adccf44feb430bb1427258b1cf222d28a40a89eaa2cea38ba8985445878e3bf463984044a40f2154484a2644a3c7aa202f7ca6903c7a5ce457a8a5cff0e810228584bdd1be31967795ac43a290bc997c4589d2cb491d7b609400031b0285042b53f7ecff56bb4e10ffe1e3ec8b950d843c21b1d2cdafd865608401465143881392c64bce9dfa7b97f82a464813ea14af20766e5daff106218409c9312ddf4d6ff81d7dca0090329e034b48b268a97a1945ca7bccc85ac941881292d4eb7df6ac6974507decb0419611928404b57e7d2763a7cbcaeab0c18ff18653084142f29845b1983d05f99fc4177284e41db95e2d19e4c7f48b13428c90a4318cf7671d25eebb22247f90535f76769d3569648d08496274a6d48fdde6a76a42c81092a3867989111bfae10a21c1fa3e0635f1be2fe129212408094298b81f15743ec3e8810021b9eea4277d49a58e36d52121e40749429af21ca3af27f4d94708f1416228511e66c693b25547d67a91701debd428cf29090ff2225146e44c8cbde51c1dd0d8455230f5a8fa71f294c77491645f7a9bae82522af3dcb948128d39931e299a154fb848da14d663ced999dd4922d0b8458287edabadb2142c936c9120adddcd7fbc53db9f42a0518bc4e495edb48adc557e406891bc9b326d4c1b0d3f01d9c1e383ec18b1818e201f835924c9fd85771999f288b2488c0f9df1924c175ea15824980a525e47265d0d352c923e87519a1f3e6a67d30181c62b123e366a388fbf31058f0f68b822f1339de9383246f59b5b91d4a65d3a9af6345891f0f1f3d2769395586d1549263367d1caa194495115093ea349e9ec1922dfa3918ae44f17f2ef2efcc6d468a022c1a298a8201af3547580d03845d296cc6e1f7488cf9b291243c7cb15c7e427adfbc89a18fe64d0284592c98e66d0bfe61abb91351d62f8ff084282fdc00a74d0800629925ffbc328d139b2955176d0184582490d1b3b98aeff1a6988026984227964a545cf58724269068ac39aaa3032dac7b146d60a8d4f245ac612de3d6a3a8a37b2560c11343c91f429c6b02756830c7eea44826ff8b8cc2822723a9c48dc309b5c2f5b4a9a299b48107f32e579a837cb5313891f93d22ff79a4d37472313c9aa19adb3e72426928207d57717fa3b2c27d0b844926c1615447470aff403c7041a96483abdab1f590d73b9d23a8c7109342a9198d2098f9edc45569923a04189a4dc50d93973982edd1d8d4924bccb8e70cb312a051a9248d80b6f753a75cc8c9dd66178051a9148cafb7e29b6ac8dba70648d04342091a44ce5e6d4f81029ca3b1a8f48ce37ddb1a4e63f29e91d0d472477c6efcc115506683422298e0e96375968114a1d3f030f7276c788243972f44a6d6711c9757e9572de7616d15840440491d103a589716e8060a0a18864eb70b9e1b2e42f977d021a8948d4bad014bfa38dce1c7c040d44247aaa9331a645f497270f340e91244d4cf533d3f5df6a88a48d9f5357648a623aa8d776a05188446b4d172ce991f53cd140831049a6a7a35912b58848d6a00c34069114eb31ce9707092241fd688cca1cb367bcd0084482961dcf611e40245fbac5d374beab33ff21312fb495dc0647d65244a41234fc90bcb39e969d2d6f6a38b2a623c80e3176f0d02b16e4068f2ba0d187e48ea95b714b681f2fdb0334f890289f56fd59b3f5a9d1c8dad2d84352fea7783285285fb1e821f92f7bbe90e19af2d291c520d0c84382d8deed5c123e7a33341a78481e19dff418fb62573c0e34ee905c4237f869aba06492991b68d821f1747c7770b57c6daa3a24599ccd78e538c24443830ec93723a62c7a26db31cd2141e5f89afb9f4af47ee490f071b48e52fd68c421315b265559f48a7e8cc32171732ad1ccea39a831bd215193e64f323e94b6ad3c08196204c64ea2e4372c9170c93f550cb1eb172f95480ca263a14492362d6225d5c3a991277157f85a4b16dcc27556698b9277656a842cb1183724913876493ef4fccc65752312893999fed23be20d482487091954b5ba9c9699879fa09c246e3c22c9d475b677dbf270f9c8ea38d3c50d4724a6d2a42ba99c63d21c7df820a311496e9f4206913937efd1f1e36dd083870e34c68e74a7861b8c48d04dcfe029bb4bc5bf88840d163f652ea92292cc3c97fc4de6a9d37623114949980e994ff9f5cd4144b26e4c41df3f1c59abc10cb864e2c62112537f86cb4b5b2a4ec510c959f3551cf5793b568319e848e380de226e1422314587a78e8aa24e760891d82673c9eb184b731ebdde20ceb06c517d2a288824ed6eee99bb53e774d8052239366475ccd4ff419e00912c7e4176763a12831d3f4abaf18764511e63d37906d527fa2159457fb6a6dcf697d2f3d0c1c33f0810b5188cb1e38ce13cbc027d7d48cce31a779392dd4a233e24479196e2be5650423e7b480cbda131357dc80a327a480a7ff5a071f5de97e721d9b27e3c9d173d7a0e6fe021d92ea9fc2e5af359ca9170e30e49ef9a762f66d20e99a3c20d3b2458fc746daf183268f0664e060d921b754814ab4cd39adfdb65bc418704a53aee6cfc28b1628eac9511f41c92e35b79128df2271704e4861c9236dea5d3143f3b19621c923579cfa99c377349cf0e6ec02159e5f64a668b02e1c61b92840c112533c699831b6e481e25a426f9d21a3a231edc684362e8faacaed94fb725d990fcb955aa29da86cfa735245ece8be177c5c3c6ff861a9253d7fd7a3ec8ce9dd290e062fa63397d3a992c6848aa284a870fcb565abbf5c18d33248bf43ca23bfc5cda7ac30c575765e5304baf7acb311eeb4dc80df746199263ae9c4bb525a54c24c20d32248af85449ac6dd384dad670630c4936eba5bb52740b333a36dc1043f298548b514ac8a829a5e770230c892e1e37839bec98e70386c49866a534698fc92ad3861b5f48780b61a5743cdafae8c7d861c4e871ae04c50b49a731a828ca839ceeed6f7421716683debba41942a59c1b5c48aab08a9d523466f316831b5bb8bb2a556a6dadf1b816add5b0a67e593528df78141cdcd042528cc5a9b7532f17de188cb1e34710201f58810e326e64e1d09f82e9c88b39576301999de3b35a8ce3e971e30a5c6c7de74f229e46010d6e584199d1baaf1959d57cd10ca65254ef11e58d2a24f8a7acf6cf2dbadda042c276f07f0a4997edcae5c3a49686a49098a4d8760e72a6251485a40f957f1583ab9979a090f497ad3723b582507a427218512e363a99a7d638216144b6c934dd373ad384c40ab195ba712ee9ee4c485efdf60de7ae7bf25e42b27d50dbf9dd2a21d1738e29cc569b84c44f3af6e5fbe7b435121284ee154f31546bc57984a4d4f8f639533154864648909a2a578d4eb29dad1b45e044e9670f53212224a6ffcf99f4fcfec70c21393727b1db2573c37854704308c9222f6f73522383323f084925aaa3573c0121cd1d46a6eeeb377e808a66e5b66d53f9a5a5f52a6e1cb8e18324f1b86e9a2a62428f547b91e472be7f3aaa68d3942a2f12c32fc71c5ef2f3f7a5aabb4812d9a1af1f7cb5a18b44b1e0fd1eaff6d2a7d8c845e229a9b91e16b3f239236b3a7aa443bbc645725fa9d2a7c94e8cf8250f366e919cca63feecaf57071bb6480c6bbe26545bcc4738020dd4007fecd0e10348daa845d2eb85eae8b9e1b3b5366891dc9b44e6ffd8c786d4c62c12bd32742a399ee1e2b248d041c50d42fc3f7be5c4227167a4854c6dabf71916496a3db625a19be1cd7c4552f9bb28cd76e71ddbda7045f2a8113ae5c6249e76b2d18a042d7332d4ffb9adc5062b92573b7c4c63d5fb4d365691987be3c5fdb49a6468d65491a42f98a5a04af32f344052911483d850911c94926b329aa5b2aca93b4552faabd814095742b7a9328f1e3696224156af88ff051311932259ac6deef29ba34816cd1ad36dfab02812fd32aca6a0d3978c4a289254da389f848add8f1e2812942991f1312faa92d22712548a16b67767fd5d1c59c3fb1d3f82a4278e29a514f3bba5cfe4c8da7582996f2befee4a414ba8677e50623fb38713c91b2733ff73aff578e6430c0d94510120403c042510b14d2449bfddb029a63432a63b52d2d123c8183b520317b8801840dc062222a7e33491f02953b52edf8b9a89041d749fc626f34e611f594b44363091a0c2442b074fd626eac85a5a086c5c22a9e26dec1c745025161f5913a35822692ca9cc5be9a76359caae44922621cf73cb08e9a61959cbb29448cecbf56ce5b121a78facf1241244e72fa5dd8e34d746d68a9e243e712f2a97c79cb211203eb291489eff930fa653b7dd39b2a60689e45cadcda362663ff491b50dd87844829da9e8af3d23738ee8384076889119b0e188e4539e2fa2e4c69a0d6d346200361851ca66af970384c7ebf8d143870f17c34c59606311995dda9a55578a257662ea9f3aa81f88970e2246b2a188042122d38552325e6a3e021e3c76704044a4c78e44246ac851a733965acad0c89a8e1bb8188d88a493c1a2bf6abcd64d1a89c1183b6210831e3c36b17188e4207b4673cd3de8ac3c60c310c92397e6fdaee32ba9d24060a310c9977369ea3c83c9ddec98012192538c9aba72ca2d67232083485cb7cb301d6db4542a8884eb98ffa2825c0a9b34818d4024a57701911c97839099b46adaa80436fe9098732a1badef646db0f821c132e514cee38cd8adfa90e469b45c3495cdb6630a648c1f67d763870e1f40940f49a1d52d695767bb4def2139cef628656aa387c42c226444c6ec27b29187844d1fd1fc1a95d79436f0905442e68dd3ba9c59eb206598056cdc2139887ec74b1637fb868c60c30e89229a2be9add5efff888800b93a2467cc4157a7ad12a74f5cb04187e4b0929d94bcecc918cd21f943bbe9c78f75156b392465506699dfd2714812edbad77e1b557c63030e49325a5b1e9f8da64466e30d09a35d9e544ee89cc3734392e620e572ad981ad1b6c13257ab58ea769fe67346255f2d970d89a7ab57e9c3f7546ef4687f011b6b48ba50ff192a2e4c258d1a92e3429fa6c50e69efeab04d43825f4e4b3ab36e05ddd8404382da78bb95d1b4d76fce9018d37ad49fbe7c0d9e0d3324fa95120b2a9d36ca901c7f41e666ea2c19124dc9a4a161735da5b96c106c8c21f1d3a6a43208bdb46f1283399366f860aaa50e43e28a7a0c13424f0935db00836d565db1a19665dea27e23b3e9d5e277a9828d2f247d86259d57eb52bc3acc0636bc90181e4bcfafd4c7cb8a888888ac0ed3ffd1e3f4c0461712664cb5e52d0653a9c285244f0ff1594f2bf77f36b6c0795af26efbec4a2e26428e4a6f62961bf6d9d04272929fdcddf6baf2af6553b09185c4511e37e996cbe6606321f13d4fb7a69a754a411b57480cdbcab0a52c283f8d88089a1592f2e7051d94faa4e4f836aa901435bea98f1532661cd9a0428259a94c9efd343cff36a69020e388778ce90e9a54a450f04cd3d8b2f20a965cb472da982ad7a9303236a290746a4eccc54cad4f720cd88042f2ad89054df9c4566dc2b0f184a478b5d1e1a2e88ca7b7e18464d3333a2aa51719a51f3d748cf1e335b0f6e3f903369a9099669a5b675878caadc7b016ce2dc58638b2f6a3c705c4f8d123ed8f203e906083094941bb6b4a95dd25147e59d247643694905451ccb4e7d64e2a35369290fcd1b44ac7bcf249db1fd84042e228b524f726d38f5c49b07184e4202d29619fa4766b9ede02efa38c12d4c086111294ac4b5b3a875129fe45483215fe64ebfc4c888808c99a53aa3ca2636308050b96ccdd928de5d216acf664273143b083870f12fc0802e4093684905c5ab45b5910ebb1e420240891d3b1bc9be5d3c506109252f22473a9cb62a52c6b6cfc20417c4ef130f6bb9b46367c90fc96decd54dced47b717c963e33533b21f09e221101111292388d7e045f2a8fe9ad2203278fc0f1fcb3576919ca193aac551f2eaff91201e821c09e23eb28c2097357491d831e54e17e45f6348cb0882c69c8be4b47fea94ce20c7e31b592b5c247e945d8d712f356e91f87e9b5b368c236b4076b001e1b123081910a8618b04a1996a9e266b1f356a91bcdd9563a76cf13e47b4480e67971dabefec546e1649426d7acaeffdcee7e60c6ac822492db985b90a76963bcaa0462c924d779eec8fdbebc578f4e8616091a0c205cd6ac5d8f123080701f22308905724fad58f32bd999405bd2b9255c66b84fa6765baad48caf85971ae5cec536545b2e6374bbda0d66af155248992aaa9c742db3377aa484c31233f8f26395a9b5424c86495f7d4375fb615154956d164aa1899f72f9e2239cc55c530fad3bfc64c91e0b9f16d4f9b148b512992f3b6c2438cf478e59222794d09255dc4354691581a5b2bb158f16e1f63b2418db05614899794529dc3d5502469c9a02cd995565f550314892986da981bfd449216d9f964cc7bda6cace189a478d7aaa9773b47d375223106594abc9796f40b39919cd3e2ef45cfc9d6eb4d30aa5d5bc13ad552188b1abd54d0fce339dc25692231a9ac313e3ea6acaaabc380a865829913d54ae26676edeee19bfcda9295e954f3032bd0716a6022a92c29eb4aa7d3a91f6b5c224166d52c75d9413f373b46743c0e760069842c9198dfc2eea993a95189044fd3932773d7b8959448f6d01a94dc1875645793484e6adb1b4be55466bacc420d4924a6f0183b98850a3266ad851a914838719dc4cc8afc6b350c35209194d92b44e8f46be1ff2312ed32a9b6dc99a7a9a9e188c498f35d597cb6987e3522f1cca3fbc8dcd94c7c4624993e53b3070f648c1e3e80fc183d72b822f984502327f24cc3875a91f0991935d8e9a073deac4852c2dab39dce4e79eb2a12737dda2c5da71f67544582c6273d4afdfbe4e75291a43685d1ab6136a890a3c244c6c8710a1331c595c2440a296e14278a24d313bb4ffb1b84fda168410e50246c8e69b47b5757b8f41326523c719d484e2ac9b89ff46dd251cec10913d984899c26126dc6d349dfb813b2c99189a4dbb77fed9d5331f41c98e8e35d2c9c96db7a58ba749dd255b72ae83019392e916c1b6e7a3a6c2ceb5882b154b1b2e6ac954ce4a84472dea02a7535498d39a744927e774d9f3b650dbfe5984492ad5adcda89ebc82f89c411d366e92975f678c91189a49cc3bf8ce9fcf65a8244b2869ef0d0cb399777236b407e7c901d47841c8f4850da4558b7680e5ee77044f2658672d7d62a25d3da23472312640569498ad2dff91a46248cb070bdb541958b9a631189de69f9e5d38a48aee89e3689d65c10718e4424ab89b211391b4424585fc7d2ef688e432457077d315f85f8d31c4324589e5d2af94ce944cc518844ef533b9d0bb3da2325e420c420124fd6eb68750db24e412478106f0a4452cee737a663dc0f510182f9ca31a4f8e90bf7ff21397954cb9b2ae97ac7fd901ccb2de71aad254f8cfa90b0a2cf4398168f4f3a39f850b66d85a56461430625affcf23d24c8383a749ba7e8213129f956b16a96b4c7c387183b807092230f89bd3542fae77462bef91f3e0e3790030f79db57965d57bba8ab458d314d5cbe13fa1c7748cc35f5cd94ec45fdc50ec9a336cba928e1bf97ca5187a49cf3fb980d27d38de89058c26279860f159e8339e6901cfe47afa47f14e13939e4a09c6b6daa9988c95e482f17a562cc3be58843d25cf620df9e72bc5c38246ed890a392c7d2da35c71b92674ee805ad9841369fc30dc917c494ce293a94d51d831c6d48fc9ef7e496a51c6c3091352407d5a629e852db0c8b1a92c6737664a82f0d268226071a9262673f74526d19a8470576e4384392660d6a65ffc423871912348c18f9a1eb57e11f920146188739ca90b8412c478f9b4de1792107191235874c2264c413c83186240f1adea5363a69be98430c8931465fa5b3f01956cc11862415ffdb37e91b35ef3c0718126f3bfb4c94b2ea180424737c2179defbf643d85f9abd808c8f1be6e842528c2e327eeb741ef77021f143ef9668272126e4d84272ca28332bef927966207e811c5a488c7e1ff3e85899f3bb62e4c882d142739eca50693dfac88185c4396d3933e74bda439ce30a89dac1bd377786ecdc5b21317683b66c977f8a9b2a7c7f6fada95b634d85e4e02dd2c5b2778515a790e0a734c80619118f1d28c01c52c0556d3bad2caba5a68bce8e775632fd0f0639a290a031fdc7d2d77f99322824cd6752a5ac848a9dae27246adce9b69d4d712a9bc30909ea29c92ae12756a3a7821c4d489011a672db2ed4378809093229ddac4b3af88a78098929cffbff97f04ba2544272deec192f65e7417c3992d065c5f4b44cefb4cccb323a8fa564e740427272cb7429f53508d54821c71192528f5e53abb27cd139cd6184644b41be5785e5d13109e42842524ce2bb53fb8e18031d63ec1809b2c30644e82ebba85b10dbd636e55f95d9466df6e8478090e16387901ce3c53db47de9a0de8114c82184c4e07b9ae434e5e583ece0e103488e2024e8e89f329af9fa2b7e821c4048de0d4bb5a35252fd4b8e1f7c51c36d6c5d34870f9263f675c5ab11326d4a2f125b3e26b5498ea79ece8b440bd24ccd620ad77b5e0470ec22e952901e7783f5da07e92231684c6e1a4288b0cfe422c9443ec6e0e7e92c6571e022e13a29d5153b9d8cc8b74852167e373d9b0a16af2d927f94eca9cc5aaad9ac456285d3a1845cd23715a445e2c69434d35375708ba30e70cca2d5f4eecc34758f91f7d01525b752235b060e5924ea05bdbb41ad28f9c7226964b4e6d8d7f0394cb048d0589df921e3e894bf22d18266f9b89e84cef8ae483e753aaf46fbfd516a45c269cf7ddd7d589114ebb72b5eda5524994afa6b747638ab5515899fd7f3836e1c19da5424ca76d68b1ddb35c64445d2c81a15bdbad84976a7480e324c6baef50d4ac614354562da3fbb90ebdd9e46b8a548ce3f739ed2c58983140927cda4999bf6fc6f194592ce8aede42583cc0fda00872892b7cda3e9a7c7ac73f911c4078e5024d5d7a510799ee3eb1a021ca0b8478805d3d1ef9019d931be0337700f30196669c0f189c3e189a4fdb8d22697930ef2e944c137c7dfe6a8ec9c30681bf1ee9e736ed06e2271348cfccf791944b9383451767d678d56aa0a6be9eeb1a9bed39e8a968924f3ce1476b55466183191ecb1aa2727d406a576fdc00a748800c72512b3a8ff7636a1afbf320e4b248ee9d379aaa70eb319e0a844e257907d9a97478f7c83f8d9c1037d901f3d80f0013113e0a044f2eb7576516d52358487631209e25b45ae846cd6f88fac251d63f4184307901d6a85011c9248d40d654a89ccb2f1e60fac40070b704422493de8783acb961abd8144e2ef8cc834bbbbf5f5c81a8e4724a758dac72fc5c8d2274724998b8d6f90b9546fa81149be393fb757fed7de302251af636e4e794da86c2e22b93cc70d3ae615df2e1c8a488a31a73e2629a73e7b811180f141caa8000f1c89480ed6e6d9b94341d28e11200dc4470f1d85031109969afaea2b593c0b8f8ce13c42f0a8c70718711c2269e4f5935a98abc5d8c81922b1539ab9f6d3d92c7c07e02844e1c2e4ee4633ab352d34b8a670dacb4a5bb6102249a998730afa3649d7b8151c83482e0d691e3f6ebe9a5dc9648411820e8071811180a106091c82c8e2d27c66c9b766a994f53288f3aba040a8a1630e2ab545380091f85eb2255ec5f187e42046a7bed1666a4569640d8de13ece0f09ee9afa83e84347da1838fa90e079a1254b8ad8ce4138f890148408d35eb1ded9a2409c870c70ec21b1645c8b9e3fc907ea2151e6f6a3a634cfe5d991b53c5f83ce43720c42e62bcbf191351f621c443f40b040c08187641b0b36b23fb4de34f83b7f0234e0b8436257ee985b648cd59eaf810e207648ca1cadf24f7a934af2c45187c4122574a5cd7055560f1c7448fcb8182664a73b70cc21398b4c6fe721ac928e8ed1430c317a1cfc81430ec9319ab4636a2fb5d11104471c122ed33c48d5ca61bed363070f127c404424cd70c021a974c8144f85f88dcd190b00e9018e3724e7f69bca7737a7dcc2e186c424ffd3c4eba97d8b99028e3624bd7c99d4349ba51a0e3624c6ea6f4f8d13d5682601c71a92928ae577e153ca764135246beac8d018eaecc29406c643c6ca3cb52be84ecaafdd92abc70d1a927c7bcb3d6f30770d6dd0230c11110e028e332476b5e6d8e60e42df3743c2e9684ab3e8914fa1c55186048bd1c5649bf6dc11e12043b2c8faf7a4d1d456501a43c2dea8470b131243b227b3117fcb398d586148daf06d9e73d05a62461c6058bd5a2dbb9d76caddf9e9a9a6787f21f12c8aee24f5ac620675117078216975db83ea8caf9d3e1c5d48bc59ed4bdaa466ca300e2e2477ceb9cb649d829e11c71612bf5f652fa530323e51c0a185a47917553ae63658d738b290246543a9a4468af031b180030b4949dfcd69d2b3530f1a594bfe3ccc078e2b249b1853e9664eeeb46d85648f6a7bf1dedcbec42a2458ccd83d9695f4da4985c4ac2af576753aed06a7b0a9b7abdca77cbaa7bae8a8bf1ef374c998944292e7672e31511ad584ea7aa43134d061e088428299fd5d7fd80cdf1428545bf396ad522c6dbb8d1b35cbf3f5389e901c9387a698d059c74c1c4e403cc3ce2e7dca75d8698c4c173f7f88ce418ba309c9b3b1e49c741d516de631139252f2941632ea2524b99545fd6fcf399c9490945468dc706ae248425229999d338ccc3397d5f1a3472221d953a78f4ddadad9a32324cd59cc15b7a856992dbb17e03042d2f6ea7930b3cacc681192c4796985f4d2c81a0e2224996813ddb71ed56a1f4282a978bfce0aa9715c844308c93db282a83899eb2d0c429295ea4e41f907115267830308c9a37a4434ef4dbe4407c70f92e2e7354d953319fc731c3e487c59bdf3a46254c78d5e24e60d9135ba4bbc485249eb43f388524a6c5c706317c969c63b975cb0f07f1959d3c556962a33eb2aa5b494a278f88d3a0d2bb9749d7023174929668d299b3e95693415841bb848aa1c340715b7f3e4bd884809e1c62d92b245bdb1babc15c7b54562921793fa0f62f92d38b26696871bb5f852a9ed50f5db392dd0ea243ceb8db0fc8cac01e9c1e3ace92c12ae457967bd94f5842a8be45c95cce4084f6fc4a20a0f378d9353bb1b718d1dd34d6afdb47bd009f06091b466716a5fb57ecf72e315499e2e7ab5769f503a73c3158927e2abe64e69ad76a3155dec388b5e9f25963c3553787fd1fc51d939b322d9742aa5948ac973c8e5c62a9244b4898a351f3bff451549d2caf3f2c69c745dca8d5424c99efbd813a96ac2bb810a2c2e556cad60f6552a5f29625398ddf69a7d8a24257f63da7c124a97da144961c4549e10a5f294578a24511fb4ffcd6d65d7a448eca03cf3efcbc853e128924eedfc6596d24b493744912cf6b9a6629d5024c5f84af1bf9e6f470514c9d9b39a46b3b044e1c62792b357e7e597f7d221f74452e7a4e1d162b50521fff8201ab8d189a4b09684a61e519a152f0c6e7022f97fb6928c5e8c79af1b9b4838b7607a637742a5a82692532a1d26e684ace94a1963b88e1f3d108d053732b1a5a5ab6469e44e5d3cb3b2a5daff8889c4fa6cdd746ba205b9c16318372e91546264d20d038f3aa8e4efe50261200e8582a14028100a8443fb59831208001840240cc6a2119160bab413001480034f3c284c3c3426281c140d0543d140180c07c28060201008064281280ca2380cad8114ed01832a2c060c476844bec7dd411424af1e481c3185eb7a50da742b45a4365aa7bfa8535b95b46ea42cb19925304e5646ef93dd7d2a98011b31fbd69201cc5360973d5172c543c485e4bd13a525ce840de83fe525255b6947d7c834a884692aec701f804b6c68f3f45378b0bc2520cb9e3c10bbc9e0f848ea2f675628c459a398b0e58f050cf2d083c2bc288a877429fef20d1b34d5d1bd1c36dbbb122d86efdc5985de5dae2a16b5f9382ece44645812a3cc887ac6e6015e4161ac9ee3634ad80c0fd5eae18ead6d5dcafda793ec2b4ab96bac37f89784355b63931a30476d497c729850904c1087c756efd5fee756f2501ea332f6888f9173c78dbcfb376245adb19c4f7ee0b9254a6685828fb790cae5ec26b13012bda9f02d7bdff7ce84cf2a1e165b4c095f072ac890d27e89d29cc41992bbdaf97fe9c28b204e86fdc033e2bb0f24f5fa067b225ec426e1018e926219d4b8547001045772d2223fa2825ecfb84c9f1644b1055970d49d1968d061839d3624dc6462cfc54bd7ca70a95d29d3d76b5abe07f4079196103d090392d89085c6c5a40efa41ead052e4a81ef9e9b8818b2da3a464a3e91fa653a166be629cf1eac024b7b971c984f15be15040ea5cba8fdd6041955d8f5029498e9d5adc8cd4e8f35cef4dbfd5bdda64f32b6ca08aa5e5258809771ebde5dc19c1887d8a010e161a917f54800000ff9620a766eac6798e7634d23763a1d20d6a9d2fbede996d50d82ba5e1e227f7d3db970da40dc8b17fc419f2e70ddfdb65d3f1b2d399c856ad423111181323a74642488abebb595b9b33d0935acb189d8ddc48b7c057abfe702786bdf4dc82b313604d1d67cbe07aec6f8dda01e2a9567c6ba5f66c7a4e65150ad2bf8418b16e68798dcac46b131749a91a04061d7ad878df9439a3e8f3074de652387e441883c20a6105b46792bc17eff7f7e2b7e6eb387e152b63db57f30f6088e56c59a31002bb378f62153e8bfe5cfecf8368346cbf7e67fdcfbf2686125b0f806f51c9ca94c2deec086c2a70d26640808c6da40fd68b0aa2278b5532f331b98b9495987aa5e4ae4d63a314cf66f23e8b5edeceec9a7862ec7daf5a46d4ae5d711be3f08ed5a135e10d648471e247130af0aa7bef18fa47360faba7bdd83a8a3a006df8bb30f3e555cb4974ad4d548cef2f002ccf9b597cfd329e7f95d308cd91c355ae877f8934a5d5862ef5b0d2359321e2f0a885a60d48ed92c4e79110525356135ba15cb88e7270a956b32f53cce8ce55a9fe72df11781b021d9798b9b5cc5aab9b176f0e8dedbab93845745f515bc97a6cb8f4ef7de879bb6828bf58e61f4aa14d84f9087454273303181f543f8658885a2b89c1430d8afdd6cd617a51f311f1aa5a6aece858c06dccf498641c5d137b02a3ca7e09212c4194b8740f5f5e48431c10c26d164eb98ee2e0077a73dc9f0fd25211548def356506151928ddee100d45d706e2000e5e10e54b882794d89610628ff48e9e7002705095ef3a1559495a5071ed2240ab5641fd9a84c1d150378119a8085a950a8ac211a20d679d89c9e1ced7a53257537062822fd025a5c13049dab4dbf90d309ef945fe176dae79625c5cc308c0d37e8bc2d2dea5e086b84714a1c75dd173441ef8563edbf2f945da841f8d8f5c855d1e6186a9ca25858303cc659b9c270c2955d65d47d32bfeb85123fb69a2b36ca2d13fd5195740018168a64514c53f98a6c848a79e2b214055599dc112e09bd4250ad9834e20f3046c472b211e662870861f9eac8d55188a50e9ebc30ed7e5fb38e84821dd95030f4bf06e08f6e0edfa4a9f738d6826267ab10ac93ba22f476680f6e85729c12ddb08e99daf6cfadc67b07af830447be4cae9d62e51988a74fc5a314d68029798efc96412158dc16e565f805d64700be22e35ce2f2f85c5ae211e11fa159e05900d8f103e67e9fdb430f55de3634d7d549560595b5c6e765b769731d4b62de21b629b7d0026ad179b0c6543ee95a4cf9fcb206d3a0eeca091af06366b87b308e266f2d1163c93045a288b04f984700b39493ccfa4f51276d993f21785e89bc9318a401a09a9ae62de3c163b4793f35e585f477a1686c702729c784067108a48d98f4c73c4fdc8b722b86017d022fe245d6ebd107e63ce8d34b96b16421f58327cd8152065edca8bc15911b4fd21ad0d8e5f278853e726fe2cab660c780a77f8785e6c9cfdc82ef4ebc6fa563f5e8260a32c5a38472384b51f49555ac2ceb19647768e2fc719ab551495d2638ced0e46483aa05f4fd6528a96b2146cddffce4dbe16998aff9ebe22aaaf21b2cff9c9ab9ffdfdf09ed0e7f8f0fe031b7b5ca5219e6a83f1a33fbbd474f00838a6a670f57a1de1ffb74270268100dfc9204f71517cdd6eb54ed2cec79d1ae7e8d4f572d1c12d6b7673281024986f31e7f715a58699626e457c2735da4dd5f7153f06e3a9b049e479756e70a882f6129c1922d361662dacb0269a98a305a0b48b2c25f7ee5526e73280a92819f633549a1f8c000acfec3fc1562ac14117138237b7af0670004c6d5b1e61e4a4cb6705e0392d24a8356c2d6a32643c6cf99d376f135f11098036a98f3dade7172bf3831be3830f0bc2938ad0e0390423822c97b5be4b11622eef89f740f458a22e6c1bb9e9514d89bbeb4dc035b7180882b4ee5430676415272bd3494e3d767c2362abc121c1ed57b418752d34105f74f0009affc7eb71c35b97b14c316ab54ac85d7d31fd468d2174ec4a4841313a4726090135ea0c39bd9fdf79d6f18bc6a21417f26f61aacc0f4da4ab5895d73f8a34dbefb3f7184f041b2fe0986f8579980c44180f5d8ff92b040e0e7aebc8025901364f76c279b3079f8f0773b6e2a8d4ba9156469f284f6a3075fcf4669e5d474f3ca0e22d4553e54cfe132f44eb32ffad4129be72ec97d2bf552886da38827f35cdd9113ca7ed68e967bc30697d032286b011ea122787cb6c3bd7b84e1b2a48db7d4aea22739ea4365e8958d833113241991078f24c7ce7eb5337424f3924509e9d305c5e051317219e8b3d1aaadd4c498329cb775b9bb45643caa5847f5e29c471429e6224387ccd3939f981452f511b8e264d2b6ea5422f1956a83a2f330a3e6b76a739de5ce5b82f1e5a30c9dc8fcf84b663634744f6944caab48fb0a04955a4cc3edeb117022b2040c32bc6b44a84794ab0378a52e2c299f6138572879f464d3d448432d08ddac7a492696da48e0b185e06eebabad9cb773974d65f6ca18092467cb871d4bdb3dddef7248406d44c13014e18b7c7d33357482741df71f2dcf133633034d3c6c12cb1f0f3a9babbb10725ae1c0c29a024860d289497f2d0832e8a75cf8c97aad4328fd5084966bcacc3c5f77dd310d9220d3769b545d5215325ec28b89ed154a67d11db5f2a80d6eaf251419c328f9069406baf2e3b53a50766a8423ab764cf67ddc7403042162a64bd2080edc0201dae23500fd2dce6edc8002d2336992e3a8ab4e34bb2737ce54458c224094dcb9e6c6bf51b497ed2e8ce26dfe68b3fb9e32245bc06616ea33e6280cf7514b78acb7dbe5ae7de6c37aab96a328779a155429aa5100a99b8e582e2e4070782ab542530372ed0cc4709543ba0eec298bee74a0200f4b94f2fe64a9e5e31844601a4078f383b98a8e18414b823677f03afac25a293a1c75353992a09edc0a1736c68756b79a9b7b85617237843bd168805bc8c62ba699b3c706c658517241b82bb89e695dd5f2832215cd1b9d9e49e397762972d0727a34fde503574c17d5eacc2433b7769f2a5a85653b8821eb13eb022941d7691ae93e53665024b417a1a7f44b62005b5527b647e7d3befa8df24a5bb2c4c82566dc42305ac474a4c16d0d45171c25875d2a229f984a1344a7fa411bf3370108626ab9cb8462d220713e69b7c4ff53ed271dc2495c8e35ca438d56166ef6c8527fa4a77171d833b2524c34ef1e43f2259f23a6683fc10b91cc2a5725e11b97777481183a21795c4ae20d298907745de9c5e69461d457d5ceca3faf20da1160e8e7f2643a01fa50b2b8fe0a1a296b43595fba4191e3de86672bb000819944fe6f41430e88e1aa4404d89b1c26a038b61958fe5dcf5883b79905858f6f357770e0447f69334c51ea3c3fe32127623725e19873306d4cbea5ab85cc114bae8ba49b129cc899758229442b85ba9d72bac94079867f5784e5dc58aae18017a6edb3ce19800dfec6c84f439b0e83ab2406f2cac77165aaf2c8cb897155a39ea4544ec6ae9b4d85be1cd952eca1d3b56a393ea4d27523aecf94a809de4a8fdc49ebf60108449b4d785bacd25652d5614712c53cbe2144b5a53222d0ed4ef03833a293a70ae64f778e8f9120734b4007eb22085f2f510657026c26fd9c98bc70dcc241082fd78f443bfa3917b03fe453100f89ce20d17042c488c303518b9d8bd6a4bb76f7d469ca04172c5048a64f1e8f22f8401359b0eccc7306151fc00fe9f1ca08178c8914e0641d39602c136f59d2bd9786851caa05702a9a57c0a8736ab6e06e34abcd57907f7bd76d58018eaa5b0ec9ac4970348b95365a607d22712ace0360799f186d48026cb85af769141bbba7d05ac8b8fa7776ea14408eb66af524fa65f6a1578f7869c70aacc992e7cdb26d06284d3ec74edcfbc9fe58ad58ad18d2138fff1ca18b81a6ad64085362862b050e366ccb71f206d578d91e446a1b205a60f0f8517035b0fd9401be269ec3ac555fecd2bb7ff33a406fce970c87fe888ebae20610d30af80c4ce11c3b01b1f77164d7dcced861502d98aeca601f02baf97b3b806a87dcda6a5fedd26ed5d3ee7666b33c0ba3594e425b2c4e430f6686f46fb487c7aeb393dbab2255dbb9da2a5364c9067cb1bca69ec4976ccad427b855bef0977df2801c4b8a5a78dfc6ac8f4ab46b1c6487c2b65d40d2fc87dfa80a96af920f5b11d2255450aa75195c4f7cec00e1670e9be67e1fa9b1ff8d53e6e474ca8b92e69807f5d14eca4f7d03f539f1027210121399d00795d7d26f3b02dcb040a78878747bd4bf766fa1bae744f14c34b2d2dc5f4fbe202e1fcf8765f84f4f3697c083620256978144577f8f3608f76113f49429d04336448f88aa1d21b614dbfb11670be342d8e04747e42aaf79150d52b7f014fcc835c8585f07f61b1893c96e035bdc810b9c78451802a526c610d880c3fe2b4cc1ecf42a01712cc31000aa4cfafd356a768c71ce128a3f7185f89289b6f1c0edddac8c76646716d70ddaef26ced45c33a48f5801ed4105d135c5367b8dfa803a326315a7a74f6ae3327dd61cac7c0b4a922736e32f8ac308124c26eec05d4e60e83c1525c697a36ba04c97b66555d8c3bf05dfbbb04be8cee1c8a82c5fc8da0635877f76913637c5284cd9856b1ea501d07895f49b69d9790c3f5ae015bf563cb2a088f5c1a26f15062182111b363f1443882c80452c48060906a45c0448582432800ba02751202110eeb17619cfa355fa2fdb52d1d642bcc45a460d97e900c84021e602ece33f52dc72bf80dfc3efad6975849c88224d9d3e00bc77477ad87d6b037832a2d5abd6533c61214e0652b235303e529576718035935d8bff911ba14f660ebbbe95f5cf9c5e1f66d0c7389d8b4c83dab26bd4864b3f5fad24c910e169fc5ce3d22451e46f83782298580b43e5cc7e79cd12ecc79ebaf787222a473ba26aa66456889b4346fe2de344862ff41374250db8971520f88f42a0f6b697674e53091d239f60681c755c8feaada20e1634fca3eba88ef1ef24e11951f2ef899b30e37139f277cd70e2cfba4bfa7b835e5b64a17b51912534904c1469c9687a87a7af18293efd34a88c2314197d88636e1429ef1c4b4c53cd409794479757564a1695cd0b73203a6d46e31fd3c0870eb1cd05612f2d946b823b92075698e55fb5de37ad12096beb33fd2182cb72ac760da4a01720bc6c666738e049b0b93e26f8cc0281eef440ccd9686f6f0926e40ec56fd4a3eae80c7101e681832001f9796a5dd85233228f5b474bae842c57ac9f5798dbb961f9ae6dea051de83108554170a3c7c3e688177b04d40a4b79d1de52c1ac5f80879213a4fd17b423e92e27a6d2d5492b8a343a1c721dced674acdeeed3f5dc8331fee90c5c2e849bc314ef8b35f779dc37c400d557da8ba52869d8c21a7b3018cb1183b8a2d34213b147062678d104150f1f1f837c734478de1440902079a0a6ebd9fef4183f00212418e031c8e0b3ab1221d968664320c00314458111553fd27e541f365f4f51f8a2497b142cac33f236592ea00d2190a7429cccf86c22092fada09f13db50cdf5547adfad322a0dca954f0f22c1cca712987cf681aeb48011651469192219a0e80498cfe50b1360c2431ad4a55588329f6f662868cf62e787e4d597ce8550d19acda01189030d53e6c976ba6c71f2746964a5e393a84128ee49155da7901fbfb6e114cb32f80865f5987d0df41c83ba897e16067cfe8d68e29a4284e07d87c441c86cd3d2537fe017ca3f3ec1e38705c90d6b3aeba5c73e40ae2d046dc8dea3895dde84f5f9732bd6af5c09b13d02264029b7f40e543b9ff991b260d7b6d4d830944461d290d6c508445d966a227143df734c51c143438aeb59d2358606b79ab6993d0cf4aea22a5665622eddea01185d71833d74aea484f387eb1eb01f96b0248977f41ffdf95f1b3249e2c5f8c9147ef0b328996fe00a64170e1af43f8b099b8a05f667ba3e933130231224aa65cd85dae5eef1067a7067efa5da57242e82b3429a266ad52865efde72688630c6e5b07aaf24908e6a468353a4c28c37a9605ade14e2f2211179db7cf66d3b6925a9631f357ecf2a33633c0465818b2e79e83c7eacf401326a74c0550b87f173128da09de5b816b528c3aae38b2c5b878fa7976e5e7503311cb612646b9ab0dea340dfeccdb6a3a832e377d879161145a16c9ec12967500e91f2cac7b63d88f1c75f149878ffa0fb293f25559fa651a18d4f93cec95088ec5d0fbaafe683313f10f707519b654b1836b2199311fbdb443e760c6d8e7f84bbc99952df682255e8daa31c1a905d6d084fcd139769393f2425eb3a5a21f3f0601a4a978527cec55fe7bd22c04dc47d312de9acba0c1a7794a198c04140a4d6ac36b6d1a453e7aefc9d6494f6ca38cf6f3f059cc8b100972ceb3564a1d5170a37320baf9769fb7e1aafa0692540283e270380ff10fb35ca9db315d1d21a1ad8a1ef302a0b48d0189d9399e5a18a9de52804f9656b48fd06db17e6a7af4aa043576ecd26a2d5e383b74948e7db45b0b60697020e5149c9865c623b3e5b183171303e505d972aa700cdaf71349d617a86532498bcc2b8e29c43a3ca3ef48e273df8d94be17d9462490d41edbc376afc4652eb0a06fa1491f34cb89cbbce0d3b14b1c8b2db3ed86e730c9b2e3d0740d0e21a614e107781463d527a6fdd1f59951e4a7868327004ece88a8421c0970222b5351da5f06e2d5d04bc5e581a4c7e381364000a74552b96e0f01904a643da78f391d082f5d2ad206108667b72cd14a4afbb4bffb0ea273f3df4e1bb48d842712bdd8e985555ab3170235413b20922c24267651c38c0df2212914711808547218c9c8c93f7f8bada067d3204c91295d388603fedb7e750867d78c44c1fa31f46587f302359634b04135b424279cd575cf91c30ee9d5e2da15dca432679d7035fbec611b5368fba98aa3ec4016f02081b76e0d2fab390e244b19560d241a3c1c8034262310794b7683d41613928cd5aa52b45e1f83311841584cfaebba21b2c94f670b35cf8737a88d64ca91679cc2c1b2eafff4c8eb64fa70798bbaa3a2983c084d4c162fb84ea23a70cbcc11a382bef19c710c63b642ec15eba31e3c42de15e60baa05eccb670e56953d8e7e1cb9f095604c8aa2f34e65fd9b4e16af18e3832137a7253d7ec4d3821c0abefd2b31393220b88146a7ec2147ec4a5cc1ab22d659daa9a853b3d46c38a588145b40db5d7fa9e146093868bf8988f068d00e899cba466552cdef5dadda8a3f1f10ef42e3f5506946cdb5ed51c97f152dc309279b48603fc3df3031a0ffda521b91c4fe766f98144c4a8158f30a67bf6096d20062d559fb034b45c52fb72a43afb753883103f26a5c11e0b7be2f261130f4e035e3464142ffb13efdadd63281e0958c03b9a8699b7939f0c61257d22d032d101e59a58664e9d98f76d4026011d5e415c1966cfa8f35d2b53afea9687db831249e695d9cf06e2e762e051da789152a1286d66872b7f3eb3032e12ada42f205420ba525917d48bb4cc8fcaa0e1c47aa0f847535eea2bdb9f1206f2c9e8b28e894a069d9f316ccc455b310b17da74f78e4be44a00e739be27a88b5ccaa4e81d615dd98cbea4148b3d043eafa1b5669fac119b419d65a5afe4c19607d30d02252b758c7b57ba06770379a425bcf2df70e92bf42a82e10605eba873e955a9c4be255a4455e985b755cd053c1bbf44005ae9d2115554fcbfe6fe4222996da5e326f7510590c252281a00130da0ecde049339ba548d9dd1b74d965b884c04121055fafac9fcbe41ba540c70670234dd34ee36675bf2f716010595c1d8d4f12a5bcf343fe09d0944867b4a9d381c48f2ae96eb8d7c1501e7f648e70b3978241a4bdfa126a63b9548b6c710900bd623c7a03ca470387a97ca49fb70805a07caa95cce96b62d0eefb268e9e5356902fd59aa4b48b7f6a8b2e6b164c8d161934113fea4adf6592b8b9e5be55dcaed73609fc11f291191eb7575c229f487bdce8347f1ad947cec31437362ceaa45d372aba20d09345b99c891a4816d141eedcb884bb41e4153cbda7a1a3e37ee6fb55fc30006d2b7bb4bd45401924c12b31dbf0b65ce34dc1491db6cfb2adaa160ce308d6ee876fbc8ca96a8af899080b8af5ebd7597b3f823cb10916e3ec80c5a64e1d374c7368c1b46ab6a1bba8b79332232bb6a413a90a0f2c30ff5713ca445221a0d00833f06dc5fc3bac0cfea4db81869a7c8ad925f05d93c04c990b5042cb0ab600d098cf6192f966454f381cab440885f7a8b0b4ac96a88a0b698492b072a63b62f38c9fb158d14b20aa704b725b5dbd2b455472d980f22389b442c759d4f2d36175a342751c9052f64448d0afe0410884b21ff1fb3ad0f226bf1657cbe9aaec5a5d66fe97b535c8b13eee2c351a5250950b4295491a4cefb3f3974970d0110cc9dfebf0292a81a8a63fd87984b9d711d8e41dd184fca44d2dee099243bf4eb3a17cafd1a6ea5c17f9e6409499813d289e4826acba0074203c0770a5e5267e552d969e1bd4adeb7dcdc7e684bf516d9d55798f1188f6804630a5faef994385de6125ec0f3e3facd02a5b6e06906908aaf0c50aa0f60b89faa986b336c359ec880426d4d4cbdd024528f48944de766b7dc94db4e7333ee4de9c93f7d741c6aadfeefe3f976efb12795ec937fd2865314adcf5e4f766b715d4f29091d7eea2e10229a12207fe56cb5728b91fd02783255301b74bff514d75cd6edc22882ec6858946bc37cd229169a03626cf7de4ca96125523f1fd59348aa9ce19cdd7814a6236ef83cf8c2ae3d5966f4b1ef661ac7777a49a0c9ff734d54022c8d1418f38b1144a6202dc1b80698d261b5ced2b7356f0253257cc125fa1fafe897a6c50000558ff6d04c851f419a248f4b25d1de121ab15fb62e027f45526c56a273a36e08467815cba75a1b3799445c7a34317e5503fe7c76bedac3a7ecee7a604720fa24b01331c17f6191dcad8d6019890528df8bd3098a3eee58c43009d18384c1f57a33dc9b9b44fdd22462ee9e740e9824f8cc1f8d9cecced529fa730078737d83ca9386de58034e3eac63fcc71f5a64d84ac7a85c032f46df6690ebbe3b751ae7fdfae24a4e00300d3e359708d1880370e7ba363d9e6dd8c7bd513dd86f80b997bf8057566c2b403235ae980962f7c03c12072bf6c77ac02483843db680c302f1fb3096afcdd059e75704649c1a323ec3276e08b17e110b5b8fffa0115da181e2b1d99bddf5960eba5b70a5ce4050da2d40b58450cba0a607beab561634b4d59480d6d5d26e0c7a96029c232ed1faa27d5e0871b32a7ee797e563df1fe4baa0cb291674c0d1cb5cd3816b0bfe1bdab0d04dc4d50792bf712385e1f4778479f8505945b153ca21905ca1148a2adc8915705a2badd43cebc76c8aaf5a95f8c53139dfc8505f955ca6aae603381b30fd7cc104f462051ba02c625cc2c9b1593322b5502debc9dff145c1bbb5e5271ecdebaf02e972327e44714f614836981b29f68a1b94ccac8676d473c25490cbf129befb6f847779a45ffd65b0004a90709d8f211ff852a7d64e7554c00bdf8bffc2a7b28fb7dd39decb2d1e61e3246565af9c414456f254475b367804be34e686aa16b4fbde11abde5741bbc19059d430d18d5649e64c3957a78b7fcdee177ef7d9cd1bf0d79bf2b590c73b6a1a17827f5b12070f22edd98856b32e703de0bc8313f1a5889fa153d1d9120fb0e0f47f9748ffd9470affc4a83988df14e87fe5047e6a8b0f9d492e5a44b192acf168da0a5ef2a5251107801e2710f182c236d034430d990e62b93862d4ec7bf41fff26a4b28ca75b520aaef62bc744acfce35382130f55786912c59d36f317102803fb584024ea698f388fa65ebfbc069f19409b4d55aab008e47b6ff9174e5618bde14c0ae8d4a4d3922f7c333ef3e1313eebd840fe441b538ea6933c049ef7056d9d05bdc1921de469505f5a37c9d62ad45f5cc139667c5208b087ee228dc63dc24269de7c9307524a09d5c287ee6dfddeb2248bc25d285c7e2bd3c3590125a1e0bd5ff41c30ad99bbc43138ff0e5f314d1c163d270681925e8c84c894cbb883a353d073e66992efc86f72b987c73062a708e7764aac58b0367b591794b8a686817f8a559fd02c93dcb8de537110b73afbe4db1db58785efa83148a15b656a3730bc566f7587989b19ef95f9b0b9558e823a68a7bd04524609177f652f6075014b4c3f99bb6d78291b2e5a9f51a0f9779d3b2f02369e82c998681d7eb5b8dbe6d2044d9a769e60ab396550154439dcbc7eb0c0178b8b54737c87989be0c11c819d9e6397c0fdbaa2b179ca83b235f4c040db4dea8f6690e99ba0cfb256943ad6b21b7ac1faa7bed5d419ec4a40018dcae2fb949947c81eedb74b5a2aadb90ad26a1ac9052af11fa5d3135b9fbc4fd3278b841517cfc3762a8902c3b38306124ba7888698ae83d576f521a1567060e2994b43c6a67dca16a10fe0883ceaaf40b7614a8f4e01f4d4251ee18292b8d951e413b5073e4db7fccf2de48ba1f1192d75e8519b4facc6694428c8582ed3de014187ebfabd9aa40d78736643c21028a6a649862a0dcd3cb804cb9bb8ca6a213e1bce8571165263a9ea3a3971d935b13c8bf527225f5c74c6bf08b45513329825cb1a76bf3d6bbb39126d3343b41910d434cdd44c324d7c309ed47cee2294153dee3fedc1ba49dd916c54d211f4d88cf68e2ce206f1d50d891126a6a51a6771f6ab4d1c7e190f95eb52eb51cede439e49dbee06a3790364cd78204a7407c6ff4b55c76023b3ac9515040446f5da75dc1079363994aaa486a205201cb71aba281f8e7d12e4ff5a66393d59547736e6275d3dc594042525e0dfe934dcc925e2dd85ddc992820193bf41155dcc56e229253a68ec2988252f0beb37c4ebf962a2664dbcb61615c7679a45a3e235d4ed5b444e40d1a7b06af25f4333a9794d808f48fe9390cfb204cce2957e0a3c1e9342f7064e97221fddcb8b99d615c33d4e10cc05d5c763c871ddf651abd3a6ad231a902ee453bcc8960563cf4be7f17d85bd7ecebb3d2e821fc12b10b45a4e8d6a304d063bed77d2c6e53986fb08a7922a1081474d2864d7edb95c003d94eb3de10025f3408e95ecf0720c7eaddf0e33020c0d5f9342f594e5e6a3873e02af9a70ed0009fa6fdf3a0a1847fc5f91a119636eede3bc20f453003b068d4d900a59a4eb43cbe7e37c77b1abde5a5883771950cbc914bd965982e2b0f38e9cc7ed69eeaa9da443cf4bbf75d8c30cbb9d3a8bad6395e00cebc76720800a3d11400ec3a2c105e13ed48fa491637098065577298660a503be8a6e90159571c513195a2c96badecd852996ac3c8de81ecfd22df181df0e64e279e19bf4220ab36810e110ada24a18e5349db3598af040129caeba1af34e6f6f0d8346b54cad939e72143a45688fe3e5d0aec4c39bf71f47085cab43ccc977079f3b64520b8d7f25280c9ff212990f211f3a00bd71ed4363361b48307bf1feed3cd8bf205ed405a158fb82c3ebf16a63c70cdbb9dcf6197edcd36d71a3c8eb13787a0443c5c7b2ad7aa0e2104728c5416375477d7d19d7ce87ae67714c8ca5f63de53fab8701988104d9b14e4b267badbe2056ff638f0cc83a581e7eada3aa238af42624a8b4f2fa0270128d0d6028ca11451ec63148626872e2498fa1d1b662b05da88f6bb6a8efa75fb7e3c969f99548c72ac61c47b9dca183a4c477ad02edb165e60b64768d4353606203104011d4d4e676bd374e98e6a45520161df5adf52f46570d4641e4f2414fe6066a8eae3bd0dce9dcfe12f6ea627c5a90a77a0e37b4eb904699ff8704387a3a80b89ddadbacae0d84e38dfe128f98dafb9e5fd9c38ffc3d4e592425e95eb745a5b1952e36cf1534919918a0f5ae9c934d453e81386c2dab2fe7011a18243abd8f43b2ab21d65b8e84cc081ca68c6b9bdb2322811f109687727929988a85b98f44ec34971ae656d30a7a0165d071c553ce698f62b6edf5fc2909168b0a08978542180df61088446c48b9615c1a8348abc5a1d01f48ed199ace0d705d7ab0093e421849092284c9f820df66c66c5d4685db9c7619971ca47d47693820bddb96650cfdc515d7e18f931c5c17409a4dcced9efd64ebff9de5b58a7b73480b3ef9a486e8ff4ee621755b3e2cead444fd13aadc8c2ba8e5fa0ec6ecb8842147e0fb500445416409518d2242a50c1271e14fb0ff7991666bd2a671227321997caa9679acee94cdba6b9c266ad42a569c259507071a5492a6d436f001c7560efa21011e9e90fa9f714a2362784d227b2388e0e874691dcd43e88fd4ba68282cac6d6e7b680d5b1053c490841b640b25581dd9d04ae6be10787b13437fd11b759238dea57a367c5c57421ffd954069d7af205fd0e932b07f0b4774850f50bbf8b37e1d569d188f1c27a53f67ad73b68766ff00a8f1cc65f6fe9da679ed9a2803f0e267fbb1c74c79d2e70153ed3d9915077a46a31eb3e3ebea181b9c5ac067654e117e75c4c48fd46e6e1ab51acebd2a99cc7739bf5e2af44cc5629ae6730bdd1eb96abdb162e236a988a5926e3cc7f6b67381de4ad1d8b3349281c6a77466855f60d9728e9aa8a6765106b19d216823eb7fbfed6830819b5a968a4f38d4863fc63d4a63ebef40d0c47f53a4e02ef6d6bb00859ee19a528f2fb88e5832cc9beabc0d4838c8c150ff4202aa0541da1d022747134a422397a70da17283106c9622e3ff285a51e812c9afa4bbaec0699b69345d2a01e8fa97f21c80dedbd46f66b189ac0819b38be28a6ac370e0d32bfd0316a8536c16a7d9e1dda11717c458db0c449fe0f00196f24dd10ec23a9c42ed98e60ab8757aef4db3f0c649f87bb5116048063e4b55c929177fdfea114c87212c52bab5fa2b3e87e755c1ec3c48511f2f7e13f6842d693dc8493f6131663be7d8e7131e4e0fb85095c6fff866dc685909860964f1c235541ac311d02310803b2466737c0485ec8ec05da0cca3fda1efabc09b46926c2f87c2c244bbbe08a82c94bbe67c490f04983cbdcc5f34d0116fe58cc5eb3abcd5bac7aaeeb6ea2cb2329b18c9159abf64d6f22ae82e0661e584d27f724310b220168c07a243bb0e5773d87bb36a09c45d0eb67e6dd55397fef7bbff5d80ba2a87cb4cc896846906b3aad863afb9f155569a84efaa1b459297d84600adad500dc674eacae6c45212a72863ccc87fddbdc6796cba5120f4c545e2ba4f0cb55922caa30ff016d52aef9dc6618740d34327751241f671919bacb85522f72750aa3129798aa41190905c23de67dfef0c656c81557c381facdc6e8f58b905bf739da1f5b5d79d190d6e600eea419ee78341f52158d45e6260d246d4a41da17d4637fdad14d86356ef5bd720a98c935a96be083009a96327dc88450e08b689d6fc62588023c7a2bbb98711b9a95dfbef467bb4d5de1e4e560d480cbdaade6c20d1b1fd560d8c478608a29ee295c63cecc5aa3276b044332b51113a33c8c41ca00fb8e6b6286108a36959ae642e1439f040d023e167e43dc70f81aa5fd1a9ecbae0e797e48a49784eeeb5b868504d93a47aa1263c44b197774740debae85784aa36d867b9eedd19dcc9843c62a0de0bb1ca537edc704fc3521727878357444b0cf1b212dcaae71155e9faebaa9360a60dc442df86e047f5f7fdd558547ce6ce4a64c795782bf023d443e8992673074f78f22f1a8a2ced92b85e3625c7e4133175e6dd40583da31af086e07639edfcedc3cd1246c2c2629a0441ee9fc9f8ac430b1761be4e99235e3cbdc736218297e0bd89b6ee668da3d4633e9a72a2a67447ec8136649be2e6fc0e9124221e936fa29713fb92d1a30f14942d66d24d0063755c3c488b0dc6648a94a0a190d99448fcc4499ce20006a245cc2094d0b7265a5c203bed4864272de200083a14b63623a0a50eb452c007704ce8cbe56013b223590288407f8a9762fd8f16fc4739d7d941b29f5def000c490c905483a1a41a1c3bd2685b1018538400a548e2d2ec4200627469f111d551277e84af3bd86530896d0d3cec9c194418a683f541e29a57da85c524efba6f24901ed831aebba7a756fbd4e5b3456af4d12b5e0af5e9c745be8aa6f4f52b780d6be4d05e8f7a2384fd80e53e03835a11553ad6c343e2a65eb56d33a55546785b6a6a83032c75f6a23c9a8c19894b501a955050f915d62a9a58d105780cebe65dc6e3a0430997c84ce74282a3ac9f3045d265cb49bd6c63cc5b41d605234dffb1831b184d07698e7e0d6f4dbd4d67e2e54afd1ec4feed4b689d415ab1ba1d57847501be99b87949b23f1c6659f14a3f0a2d9244a1ae5356f4f045ddf8356ace1dfc04e5b49ed1a6d9c4972ea0741630bc633fa7b2b836298eb1fe779a0516843d1667486cc511ac41ed4efd2467078ef7af92ea3f5bd9d03b67da404a1b22ee0d90e836c78decc87c1b3cd48d4af6764eeaa9904d50f148e2ee88150e1ac13dc347e625855ff8e17df3667b08175c491ede902dc47ee442809ccfcd1edc51e581317a89952851c4c11d4f4ee36934e255a9b02f4819510d07ad0bc1d349b920592a732f2eafea7dbe9b921d006790fea1a482c37812b11cc638865169ba8d3659dc817949d761dba3a06e08acc88309fc1f79a394ff2cd739012d7afa9cb5be6c2f38780f7fe685e42d22a3243f62fabe1b96ac7dbe07605bd104d1e14d26999d75ef4a08f90c24e2c71c057942603ca274c0e5a59ffa4474bc1e88e3758e411b9bde41289c9b78e3b4983e1ccc544979cb4f854cb95cdca9e8b563ae958b8b9074864872be1f701b17ea15157a24e140c826e0b2a518bad5976324296c36db9b949c6ee8b2510196b840a5100834a48619ed0ce012828c0cd739c4a92bce73c83b8b85d8040c98b38ec64c150c15387b6c66da3617092cdc37f33a4cbd2dbe5202679aeb5f1c33163a015564ae6856e363f81ab58967cc91ad8550c854796e031597386f36e09af7d56f7c2f1474ca91e226c3d3caddd161e9b4feb2c6ca70d84900d70f128035c83dc904e673afb8d2c036d3500fa559c0f3de0dc141b5c5c0030cc30c30c33ccb0d3d2d2d2d2d2d2d2d25200075a23c8bbb5ecc87a65f71d5742bbc13b0486c8deb45396519047e61c3fac5abbd75ade00d800e000dc2af3fa962b11b13e63cd163eda54085720bc37a80f113e7ef0d676f34a97ddd208e1a089953a6ebf3ddbe55fef607d7ea764277897ec697466c945257c77b0fa578963c6f961b36ffecf9917b5925ad6baf6ba6f2e9c3291ce0b9f42fb8dfaa2abcad20526f398b5fffab6dc820f973777d6ac6cef166d0d76c01913b9259d8ed9ebf724ad2f26c2c56a93f45af9975d9c300ec6bf442a5773cf1332f412dfe7b2b6bb5d49593e8bd3e57d41b69e83dcdd9edbdfaa76515bbb56c6df6e35042251c7e112d99debb13bd77dce313b9c2dd1bbb1e6e7cbc1c6167b1ec71cb239098a466b0c3687fdeec16fcfcc1edeff9fcda7748f313523bed7a07dd4ed4bc798362523f27abbec53eff7f85d8720540c695db267a17b30fafbbdddadeefe075de3795f6defcefb59f6ae532f625b0cb269f93edbf6dc5c447afddadb1c2e3adb5ad622dac7fe795e978e4574f2b2fd66cc564459bbdfbb66eddf773e5544b6ee62dc57567aedad8c47a5b8d4b5fa6c95b3c16614d1d1b7f5dd6627fb9fabbe449d88acebb36ed72ef6ebbf9a88acd62a2db3766e325489089bb6bf90e16bfcf25b2812d14d66cfb9393a21fbd5d48868af74703e0e17b29fdd4e31b9ee19a3552d899476ad8db576ffa0f72b25b141e8fc795bc63c8e7d4624772ac9aa8f3ac796f6b46bf1386e8524b2f6af97bbd5fbb5dacf11d491d86fb6bd9032e76ea97ba08c44da3cd7bfca4b9a1a0455e4b9c7acca5b9d22e2410d619d1f25a4559006d290a47e301f4cf568c5e3dd626eefbd5bef3963efbed2065f76f5f9ae56cb415e00523b225bbe9a65552eea8c35573ae2b2b659becb3566bd6ea35039a27cd3d5c5ef9db7572dc4111963fabf9cc9be97baab1b11c2d59a395db5fe93ad2a1b913164eef0f6fa07659b19548de82cedcb36fbbdcb0e9a7378e578af5ed060c150cf896767e493b3745ed36106f4640a2a0db0199a39076a4ea6200b026cec8e0cdaf1913d0600984a37186a6c14a8368d80e4015963324d1d0100e449569d0136f224eb4f49a7404d800437257bf219fd0089385079328944aac60641812120aa25de6f4797738e9b57ff2c71c906ab5c57d2bfd7d9c5129f63adb6aedf7d21bba6ae4477e56cd69aa3973a1b022259d22b2b3e3a95784c3d22d18daae2a3530f8f498a44378a8a15fa21912ca9809a72b226292e121950517c74121ad52091e84641895caf63f6fd39ea72f6e471af39a899644b22a1511555c8279f919b7c46a292630a1a4415d413201225591201e524aee63fa97cd7cee7fc6e12eb85effd0780dea8811d4288880422222232472974918484108608414639c7ca07128070318e04298642200461388c1062048608638410a2c8c80cdd6e7b93119038e5354fe21ca84fdd34397fca0f25124cca409439667e7991e72f724f34cf51fd10afc86b746dfb599338a5a1ff3b59a41e271ab5bd5db7f5ea31551520328eba352884cecd1f73f4505418cf4e47327c4a2aaa00a0faef926937dc2e144b22ad0c1718fa4c034579c97408bd0d88f15cbe6d913aee623d0db2f89096f9731cf1c0c1123d1c8a52c0a86d849d6855096b94d55ea5e26926fa02d8c54a7c23d573a23515e3650e530a7c05ad7ad10106c00b340083b41ed39439790beb985660ef7d28799ace8cc5978bdd9b3d383eb81e3d6217b04b611525141f2f1e7c4260edb73416269cd3319f3f62b3538caa771e51f26c28b77f10363abbceb4ad258536820fd323c5fe9a6fd763db50cc5f50931bf198d6a5e2a8174a1bc46a32645268c2ed92ce1c6540d0c9e8a6737b52ed6f7392cd45d726f5952ab516056e3308737cc0e3f3cbb60fe568cd6369fb2007a671dc5b401237f28c9fc4887b0bd82774e3fe8c35ff3ff76cb09a1537a5bd6a284db1bb9638e2809ed2c4d5afcaeaa81c59864ca49f6f7786a3368d1d3acca40c43e817ce7b2f40849503e9fb7952028f40b3d9962cf375e40fcecb9c92930d17cef6e5cc99cf626487a0a69abbcc164b46b8ebf93292334097c10a4681b2dad9c1c8d82b3ab6dec9f03f4a1a50ea36f35cef5a536f120bd505a3718aeff3244f7948f7228f64bd4a3850ce0510cfbc02c0d7ca3f3aad5e38c194af88fa034909539410f4f918b5edd678bc3439db05267eaf38388a169c923e2a8a6e7049de969544ab33a4cf85c7c299e4df31af72ad109094deb33e266b716c55351761bccbe0f6ab1944e9e6093e97f806c6e5576c7805fc1f2a4d26a4659ebada5fdf5b2345bf220f7c321f26ec88a2148ad42670accdbcb205", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2eac8c3d5c3234dc0a1a2cbcf2683444e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + }, + "childrenDefault": {} + } + } +} diff --git a/parachains/runtimes/glutton/glutton-kusama/Cargo.toml b/parachains/runtimes/glutton/glutton-kusama/Cargo.toml new file mode 100644 index 00000000000..d1b80296191 --- /dev/null +++ b/parachains/runtimes/glutton/glutton-kusama/Cargo.toml @@ -0,0 +1,85 @@ +[package] +name = "glutton-runtime" +version = "1.0.0" +authors = ["Parity Technologies "] +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } + +# Substrate +frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } +frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } +frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } +pallet-glutton = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } +sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + +# Polkadot +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } + +# Cumulus +cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } +cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } +cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } +parachain-info = { path = "../../../pallets/parachain-info", default-features = false } +parachains-common = { path = "../../../common", default-features = false } + +[build-dependencies] +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[features] +default = [ "std" ] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-glutton/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", +] +std = [ + "codec/std", + "scale-info/std", + "frame-executive/std", + "frame-support/std", + "frame-system/std", + "pallet-glutton/std", + "sp-api/std", + "sp-block-builder/std", + "sp-core/std", + "sp-inherents/std", + "sp-offchain/std", + "sp-runtime/std", + "sp-session/std", + "sp-std/std", + "sp-transaction-pool/std", + "sp-version/std", + "xcm-builder/std", + "xcm-executor/std", + "xcm/std", + "cumulus-pallet-parachain-system/std", + "cumulus-pallet-xcm/std", + "cumulus-primitives-core/std", + "parachain-info/std", + "parachains-common/std", +] +try-runtime = [ + "frame-executive/try-runtime", + "frame-try-runtime/try-runtime", + "pallet-glutton/try-runtime", +] diff --git a/parachains/runtimes/glutton/glutton-kusama/build.rs b/parachains/runtimes/glutton/glutton-kusama/build.rs new file mode 100644 index 00000000000..9b53d2457df --- /dev/null +++ b/parachains/runtimes/glutton/glutton-kusama/build.rs @@ -0,0 +1,9 @@ +use substrate_wasm_builder::WasmBuilder; + +fn main() { + WasmBuilder::new() + .with_current_project() + .export_heap_base() + .import_memory() + .build() +} diff --git a/parachains/runtimes/glutton/glutton-kusama/src/lib.rs b/parachains/runtimes/glutton/glutton-kusama/src/lib.rs new file mode 100644 index 00000000000..9336cf7d4b3 --- /dev/null +++ b/parachains/runtimes/glutton/glutton-kusama/src/lib.rs @@ -0,0 +1,423 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! # Glutton Runtime +//! +//! The purpose of the Glutton parachain is to do stress testing on the Kusama +//! network. +//! +//! There may be multiple instances of the Glutton parachain deployed and +//! connected to Kusama. +//! +//! These parachains are not holding any real value. Their purpose is to stress +//! test the network. +//! +//! ### Governance +//! +//! Glutton defers its governance (namely, its `Root` origin), to its Relay +//! Chain parent, Kusama. +//! +//! ### XCM +//! +//! Since the main goal of Glutton is solely stress testing, the parachain will +//! only be able receive XCM messages from Kusama via DMP. This way the Glutton +//! parachains will be able to listen for upgrades that are coming from the +//! Relay chain. + +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +pub mod weights; +pub mod xcm_config; + +use codec::{Decode, Encode}; +use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +use frame_support::unsigned::TransactionValidityError; +use scale_info::TypeInfo; +use sp_api::impl_runtime_apis; +use sp_core::OpaqueMetadata; +use sp_runtime::{ + create_runtime_str, generic, + traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, DispatchInfoOf}, + transaction_validity::{TransactionSource, TransactionValidity}, + ApplyExtrinsicResult, +}; +use sp_std::prelude::*; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; + +pub use frame_support::{ + construct_runtime, + dispatch::DispatchClass, + parameter_types, + traits::{Everything, IsInVec, Randomness}, + weights::{ + constants::{ + BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND, + }, + IdentityFee, Weight, + }, + StorageValue, +}; +use frame_system::limits::{BlockLength, BlockWeights}; +use parachains_common::{AccountId, Signature}; +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; +pub use sp_runtime::{Perbill, Permill}; + +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("glutton"), + impl_name: create_runtime_str!("glutton"), + authoring_version: 1, + spec_version: 9430, + impl_version: 0, + apis: RUNTIME_API_VERSIONS, + transaction_version: 1, + state_version: 1, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } +} + +/// We assume that ~10% of the block weight is consumed by `on_initialize` handlers. +/// This is used to limit the maximal weight of a single extrinsic. +const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); +/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used +/// by Operational extrinsics. +const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); +/// We allow for .5 seconds of compute with a 12 second average block time. +const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( + WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), + cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, +); + +parameter_types! { + pub const BlockHashCount: BlockNumber = 4096; + pub const Version: RuntimeVersion = VERSION; + pub RuntimeBlockLength: BlockLength = + BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); + pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have some extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); + pub const SS58Prefix: u8 = 2; +} + +impl frame_system::Config for Runtime { + type AccountId = AccountId; + type RuntimeCall = RuntimeCall; + type Lookup = AccountIdLookup; + type Index = Index; + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hashing = BlakeTwo256; + type Header = generic::Header; + type RuntimeEvent = RuntimeEvent; + type RuntimeOrigin = RuntimeOrigin; + type BlockHashCount = BlockHashCount; + type Version = Version; + type PalletInfo = PalletInfo; + type AccountData = (); + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = frame_support::traits::Everything; + type SystemWeightInfo = (); + type BlockWeights = RuntimeBlockWeights; + type BlockLength = RuntimeBlockLength; + type SS58Prefix = SS58Prefix; + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +parameter_types! { + // We do anything the parent chain tells us in this runtime. + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(2); +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnSystemEvent = (); + type SelfParaId = parachain_info::Pallet; + type OutboundXcmpMessageSource = (); + type DmpMessageHandler = cumulus_pallet_xcm::UnlimitedDmpExecution; + type ReservedDmpWeight = ReservedDmpWeight; + type XcmpMessageHandler = (); + type ReservedXcmpWeight = (); + type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; +} + +impl parachain_info::Config for Runtime {} + +impl pallet_glutton::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = weights::pallet_glutton::WeightInfo; +} + +construct_runtime! { + pub enum Runtime where + Block = Block, + NodeBlock = generic::Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Storage, Config, Event} = 0, + ParachainSystem: cumulus_pallet_parachain_system::{ + Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, + } = 1, + ParachainInfo: parachain_info::{Pallet, Storage, Config} = 2, + + // DMP handler. + CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Storage, Event, Origin} = 10, + + // The main stage. + Glutton: pallet_glutton::{Pallet, Call, Storage, Event} = 20, + } +} + +/// Simple implementation which fails any transaction which is signed. +#[derive(Eq, PartialEq, Clone, Default, sp_core::RuntimeDebug, Encode, Decode, TypeInfo)] +pub struct DisallowSigned; +impl sp_runtime::traits::SignedExtension for DisallowSigned { + const IDENTIFIER: &'static str = "DisallowSigned"; + type AccountId = AccountId; + type Call = RuntimeCall; + type AdditionalSigned = (); + type Pre = (); + fn additional_signed( + &self, + ) -> sp_std::result::Result<(), sp_runtime::transaction_validity::TransactionValidityError> { + Ok(()) + } + fn pre_dispatch( + self, + who: &Self::AccountId, + call: &Self::Call, + info: &DispatchInfoOf, + len: usize, + ) -> Result { + self.validate(who, call, info, len).map(|_| ()) + } + fn validate( + &self, + _who: &Self::AccountId, + _call: &Self::Call, + _info: &sp_runtime::traits::DispatchInfoOf, + _len: usize, + ) -> TransactionValidity { + let i = sp_runtime::transaction_validity::InvalidTransaction::BadProof; + Err(sp_runtime::transaction_validity::TransactionValidityError::Invalid(i)) + } +} + +/// Index of a transaction in the chain. +pub type Index = u32; +/// A hash of some data used by the chain. +pub type Hash = sp_core::H256; +/// An index to a block. +pub type BlockNumber = u32; +/// The address format for describing accounts. +pub type Address = sp_runtime::MultiAddress; +/// Block header type as expected by this runtime. +pub type Header = generic::Header; +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// A Block signed with a Justification +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 = DisallowSigned; +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; +/// Extrinsic type that has already been checked. +pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Executive: handles dispatch to the various modules. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + AllPalletsWithSystem, +>; + +#[cfg(feature = "runtime-benchmarks")] +#[macro_use] +extern crate frame_benchmarking; + +#[cfg(feature = "runtime-benchmarks")] +mod benches { + define_benchmarks!( + [frame_system, SystemBench::] + [pallet_glutton, Glutton] + ); +} + +impl_runtime_apis! { + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + OpaqueMetadata::new(Runtime::metadata().into()) + } + + fn metadata_at_version(version: u32) -> Option { + Runtime::metadata_at_version(version) + } + + fn metadata_versions() -> sp_std::vec::Vec { + Runtime::metadata_versions() + } + } + + impl sp_block_builder::BlockBuilder for Runtime { + fn apply_extrinsic( + extrinsic: ::Extrinsic, + ) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents(block: Block, data: sp_inherents::InherentData) -> sp_inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + } + + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + block_hash: ::Hash, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx, block_hash) + } + } + + impl sp_offchain::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl sp_session::SessionKeys for Runtime { + fn decode_session_keys(_: Vec) -> Option, sp_core::crypto::KeyTypeId)>> { + Some(Vec::new()) + } + + fn generate_session_keys(_: Option>) -> Vec { + Vec::new() + } + } + + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info(header) + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn benchmark_metadata(extra: bool) -> ( + Vec, + Vec, + ) { + use frame_benchmarking::{Benchmarking, BenchmarkList}; + use frame_support::traits::StorageInfoTrait; + use frame_system_benchmarking::Pallet as SystemBench; + + let mut list = Vec::::new(); + list_benchmarks!(list, extra); + + let storage_info = AllPalletsWithSystem::storage_info(); + + (list, storage_info) + } + + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, TrackedStorageKey}; + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime {} + + use frame_support::traits::WhitelistedStorageKeys; + let whitelist: Vec = AllPalletsWithSystem::whitelisted_storage_keys(); + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + add_benchmarks!(params, batches); + Ok(batches) + } + } +} + +struct CheckInherents; + +impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { + fn check_inherents( + _: &Block, + _: &cumulus_pallet_parachain_system::RelayChainStateProof, + ) -> sp_inherents::CheckInherentsResult { + sp_inherents::CheckInherentsResult::new() + } +} + +cumulus_pallet_parachain_system::register_validate_block! { + Runtime = Runtime, + BlockExecutor = Executive, + CheckInherents = CheckInherents, +} diff --git a/parachains/runtimes/glutton/glutton-kusama/src/weights/mod.rs b/parachains/runtimes/glutton/glutton-kusama/src/weights/mod.rs new file mode 100644 index 00000000000..234ce34bf42 --- /dev/null +++ b/parachains/runtimes/glutton/glutton-kusama/src/weights/mod.rs @@ -0,0 +1 @@ +pub mod pallet_glutton; diff --git a/parachains/runtimes/glutton/glutton-kusama/src/weights/pallet_glutton.rs b/parachains/runtimes/glutton/glutton-kusama/src/weights/pallet_glutton.rs new file mode 100644 index 00000000000..991ec6f5336 --- /dev/null +++ b/parachains/runtimes/glutton/glutton-kusama/src/weights/pallet_glutton.rs @@ -0,0 +1,175 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_glutton` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("glutton-kusama-dev-1300"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_glutton +// --chain=glutton-kusama-dev-1300 +// --header=./file_header.txt +// --output=./parachains/runtimes/glutton/glutton-kusama/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_glutton`. +pub struct WeightInfo(PhantomData); +impl pallet_glutton::WeightInfo for WeightInfo { + /// Storage: Glutton TrashDataCount (r:1 w:1) + /// Proof: Glutton TrashDataCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: Glutton TrashData (r:0 w:1000) + /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// The range of component `n` is `[0, 1000]`. + fn initialize_pallet_grow(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `1489` + // Minimum execution time: 7_874_000 picoseconds. + Weight::from_parts(7_943_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) + // Standard Error: 1_822 + .saturating_add(Weight::from_parts(1_461_713, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) + } + /// Storage: Glutton TrashDataCount (r:1 w:1) + /// Proof: Glutton TrashDataCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: Glutton TrashData (r:0 w:1000) + /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// The range of component `n` is `[0, 1000]`. + fn initialize_pallet_shrink(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `66` + // Estimated: `1489` + // Minimum execution time: 8_562_000 picoseconds. + Weight::from_parts(8_684_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) + // Standard Error: 1_058 + .saturating_add(Weight::from_parts(951_263, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) + } + /// The range of component `i` is `[0, 100000]`. + fn waste_ref_time_iter(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 632_000 picoseconds. + Weight::from_parts(648_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 20 + .saturating_add(Weight::from_parts(95_703, 0).saturating_mul(i.into())) + } + /// Storage: Glutton TrashData (r:5000 w:0) + /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// The range of component `i` is `[0, 5000]`. + fn waste_proof_size_some(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `119037 + i * (1022 ±0)` + // Estimated: `990 + i * (3016 ±0)` + // Minimum execution time: 508_000 picoseconds. + Weight::from_parts(20_794_033, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 2_740 + .saturating_add(Weight::from_parts(5_120_718, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) + .saturating_add(Weight::from_parts(0, 3016).saturating_mul(i.into())) + } + /// Storage: Glutton Storage (r:1 w:0) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: Glutton Compute (r:1 w:0) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn on_idle_high_proof_waste() -> Weight { + // Proof Size summary in bytes: + // Measured: `89` + // Estimated: `1489` + // Minimum execution time: 92_266_435_000 picoseconds. + Weight::from_parts(92_887_511_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) + .saturating_add(T::DbWeight::get().reads(2)) + } + /// Storage: Glutton Storage (r:1 w:0) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: Glutton Compute (r:1 w:0) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn on_idle_low_proof_waste() -> Weight { + // Proof Size summary in bytes: + // Measured: `89` + // Estimated: `1489` + // Minimum execution time: 92_086_821_000 picoseconds. + Weight::from_parts(92_651_037_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) + .saturating_add(T::DbWeight::get().reads(2)) + } + /// Storage: Glutton Storage (r:1 w:0) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: Glutton Compute (r:1 w:0) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn empty_on_idle() -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `1489` + // Minimum execution time: 3_161_000 picoseconds. + Weight::from_parts(3_222_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) + .saturating_add(T::DbWeight::get().reads(2)) + } + /// Storage: Glutton Compute (r:0 w:1) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn set_compute() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_464_000 picoseconds. + Weight::from_parts(6_617_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Glutton Storage (r:0 w:1) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn set_storage() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_510_000 picoseconds. + Weight::from_parts(6_641_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/parachains/runtimes/glutton/glutton-kusama/src/xcm_config.rs b/parachains/runtimes/glutton/glutton-kusama/src/xcm_config.rs new file mode 100644 index 00000000000..083ca592491 --- /dev/null +++ b/parachains/runtimes/glutton/glutton-kusama/src/xcm_config.rs @@ -0,0 +1,91 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::{ + AccountId, AllPalletsWithSystem, ParachainInfo, Runtime, RuntimeCall, RuntimeEvent, + RuntimeOrigin, +}; +use frame_support::{ + match_types, parameter_types, + traits::{Everything, Nothing}, + weights::Weight, +}; +use xcm::latest::prelude::*; +use xcm_builder::{ + AllowExplicitUnpaidExecutionFrom, FixedWeightBounds, ParentAsSuperuser, ParentIsPreset, + SovereignSignedViaLocation, +}; + +parameter_types! { + pub const KusamaLocation: MultiLocation = MultiLocation::parent(); + pub const KusamaNetwork: Option = Some(NetworkId::Kusama); + pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); +} + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// bias the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, RuntimeOrigin>, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, +); + +match_types! { + pub type JustTheParent: impl Contains = { MultiLocation { parents:1, interior: Here } }; +} + +parameter_types! { + // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. + pub UnitWeightCost: Weight = Weight::from_parts(1_000_000_000, 64 * 1024); + pub const MaxInstructions: u32 = 100; + pub const MaxAssetsIntoHolding: u32 = 64; +} + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = (); // sending XCM not supported + type AssetTransactor = (); // balances not supported + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = (); // balances not supported + type IsTeleporter = (); // balances not supported + type UniversalLocation = UniversalLocation; + type Barrier = AllowExplicitUnpaidExecutionFrom; + type Weigher = FixedWeightBounds; // balances not supported + type Trader = (); // balances not supported + type ResponseHandler = (); // Don't handle responses for now. + type AssetTrap = (); // don't trap for now + type AssetClaims = (); // don't claim for now + type SubscriptionService = (); // don't handle subscriptions for now + type PalletInstancesInfo = AllPalletsWithSystem; + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type AssetLocker = (); + type AssetExchanger = (); + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type CallDispatcher = RuntimeCall; + type SafeCallFilter = Everything; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = xcm_executor::XcmExecutor; +} diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index ce096c8ea43..b68d206fec3 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -23,6 +23,7 @@ serde_json = "1.0.96" # Local rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parachain" } shell-runtime = { path = "../parachains/runtimes/starters/shell" } +glutton-runtime = { path = "../parachains/runtimes/glutton/glutton-kusama" } seedling-runtime = { path = "../parachains/runtimes/starters/seedling" } statemint-runtime = { path = "../parachains/runtimes/assets/statemint" } statemine-runtime = { path = "../parachains/runtimes/assets/statemine" } diff --git a/polkadot-parachain/src/chain_spec/glutton.rs b/polkadot-parachain/src/chain_spec/glutton.rs new file mode 100644 index 00000000000..77b9efb5ee8 --- /dev/null +++ b/polkadot-parachain/src/chain_spec/glutton.rs @@ -0,0 +1,90 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +use crate::chain_spec::Extensions; +use cumulus_primitives_core::ParaId; +use sc_service::ChainType; + +/// Specialized `ChainSpec` for the Glutton parachain runtime. +pub type GluttonChainSpec = + sc_service::GenericChainSpec; + +pub fn glutton_development_config(para_id: ParaId) -> GluttonChainSpec { + GluttonChainSpec::from_genesis( + // Name + "Glutton Development", + // ID + "glutton_dev", + ChainType::Local, + move || glutton_genesis(para_id), + Vec::new(), + None, + None, + None, + None, + Extensions { relay_chain: "kusama-dev".into(), para_id: para_id.into() }, + ) +} + +pub fn glutton_local_config(para_id: ParaId) -> GluttonChainSpec { + GluttonChainSpec::from_genesis( + // Name + "Glutton Local", + // ID + "glutton_local", + ChainType::Local, + move || glutton_genesis(para_id), + Vec::new(), + None, + None, + None, + None, + Extensions { relay_chain: "kusama-local".into(), para_id: para_id.into() }, + ) +} + +pub fn glutton_config(para_id: ParaId) -> GluttonChainSpec { + let mut properties = sc_chain_spec::Properties::new(); + properties.insert("ss58Format".into(), 2.into()); + + GluttonChainSpec::from_genesis( + // Name + format!("Glutton {}", para_id).as_str(), + // ID + format!("glutton_kusama_{}", para_id).as_str(), + ChainType::Live, + move || glutton_genesis(para_id), + Vec::new(), + None, + // Protocol ID + Some(format!("glutton_kusama_{}", para_id).as_str()), + None, + Some(properties), + Extensions { relay_chain: "kusama".into(), para_id: para_id.into() }, + ) +} + +fn glutton_genesis(parachain_id: ParaId) -> glutton_runtime::GenesisConfig { + glutton_runtime::GenesisConfig { + system: glutton_runtime::SystemConfig { + code: glutton_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + }, + parachain_info: glutton_runtime::ParachainInfoConfig { parachain_id }, + parachain_system: Default::default(), + } +} diff --git a/polkadot-parachain/src/chain_spec/mod.rs b/polkadot-parachain/src/chain_spec/mod.rs index 3637e915406..f53552768f3 100644 --- a/polkadot-parachain/src/chain_spec/mod.rs +++ b/polkadot-parachain/src/chain_spec/mod.rs @@ -23,6 +23,7 @@ use sp_runtime::traits::{IdentifyAccount, Verify}; pub mod bridge_hubs; pub mod collectives; pub mod contracts; +pub mod glutton; pub mod penpal; pub mod rococo_parachain; pub mod seedling; diff --git a/polkadot-parachain/src/command.rs b/polkadot-parachain/src/command.rs index f7445e65645..ab13c00099b 100644 --- a/polkadot-parachain/src/command.rs +++ b/polkadot-parachain/src/command.rs @@ -19,7 +19,7 @@ use crate::{ cli::{Cli, RelayChainCli, Subcommand}, service::{ new_partial, Block, BridgeHubKusamaRuntimeExecutor, BridgeHubPolkadotRuntimeExecutor, - BridgeHubRococoRuntimeExecutor, CollectivesPolkadotRuntimeExecutor, + BridgeHubRococoRuntimeExecutor, CollectivesPolkadotRuntimeExecutor, GluttonRuntimeExecutor, StatemineRuntimeExecutor, StatemintRuntimeExecutor, WestmintRuntimeExecutor, }, }; @@ -54,6 +54,7 @@ enum Runtime { ContractsRococo, CollectivesPolkadot, CollectivesWestend, + Glutton, BridgeHub(chain_spec::bridge_hubs::BridgeHubRuntimeType), } @@ -111,6 +112,8 @@ fn runtime(id: &str) -> Runtime { id.parse::() .expect("Invalid value"), ) + } else if id.starts_with("glutton") { + Runtime::Glutton } else { log::warn!("No specific runtime was recognized for ChainSpec's id: '{}', so Runtime::default() will be used", id); Runtime::default() @@ -214,6 +217,18 @@ fn load_spec(id: &str) -> std::result::Result, String> { "polkadot-local", )), + // -- Glutton + "glutton-kusama-dev" => Box::new(chain_spec::glutton::glutton_development_config( + para_id.expect("Must specify parachain id"), + )), + "glutton-kusama-local" => Box::new(chain_spec::glutton::glutton_local_config( + para_id.expect("Must specify parachain id"), + )), + // the chain spec as used for generating the upgrade genesis values + "glutton-kusama-genesis" => Box::new(chain_spec::glutton::glutton_config( + para_id.expect("Must specify parachain id"), + )), + // -- Fallback (generic chainspec) "" => { log::warn!("No ChainSpec.id specified, so using default one, based on rococo-parachain runtime"); @@ -243,6 +258,8 @@ fn load_spec(id: &str) -> std::result::Result, String> { bridge_hub_runtime_type.chain_spec_from_json_file(path)?, Runtime::Penpal(_para_id) => Box::new(chain_spec::penpal::PenpalChainSpec::from_json_file(path)?), + Runtime::Glutton => + Box::new(chain_spec::glutton::GluttonChainSpec::from_json_file(path)?), Runtime::Default => Box::new( chain_spec::rococo_parachain::RococoParachainChainSpec::from_json_file(path)?, ), @@ -258,12 +275,25 @@ fn extract_parachain_id(id: &str) -> (&str, &str, Option) { const KUSAMA_TEST_PARA_PREFIX: &str = "penpal-kusama-"; const POLKADOT_TEST_PARA_PREFIX: &str = "penpal-polkadot-"; + const GLUTTON_PARA_DEV_PREFIX: &str = "glutton-kusama-dev-"; + const GLUTTON_PARA_LOCAL_PREFIX: &str = "glutton-kusama-local-"; + const GLUTTON_PARA_GENESIS_PREFIX: &str = "glutton-kusama-genesis-"; + let (norm_id, orig_id, para) = if let Some(suffix) = id.strip_prefix(KUSAMA_TEST_PARA_PREFIX) { let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); (&id[..KUSAMA_TEST_PARA_PREFIX.len() - 1], id, Some(para_id)) } else if let Some(suffix) = id.strip_prefix(POLKADOT_TEST_PARA_PREFIX) { let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); (&id[..POLKADOT_TEST_PARA_PREFIX.len() - 1], id, Some(para_id)) + } else if let Some(suffix) = id.strip_prefix(GLUTTON_PARA_DEV_PREFIX) { + let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); + (&id[..GLUTTON_PARA_DEV_PREFIX.len() - 1], id, Some(para_id)) + } else if let Some(suffix) = id.strip_prefix(GLUTTON_PARA_LOCAL_PREFIX) { + let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); + (&id[..GLUTTON_PARA_LOCAL_PREFIX.len() - 1], id, Some(para_id)) + } else if let Some(suffix) = id.strip_prefix(GLUTTON_PARA_GENESIS_PREFIX) { + let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); + (&id[..GLUTTON_PARA_GENESIS_PREFIX.len() - 1], id, Some(para_id)) } else { (id, id, None) }; @@ -319,6 +349,7 @@ impl SubstrateCli for Cli { Runtime::BridgeHub(bridge_hub_runtime_type) => bridge_hub_runtime_type.runtime_version(), Runtime::Penpal(_) => &penpal_runtime::VERSION, + Runtime::Glutton => &glutton_runtime::VERSION, Runtime::Default => &rococo_parachain_runtime::VERSION, } } @@ -553,6 +584,16 @@ macro_rules! construct_async_run { let task_manager = $components.task_manager; { $( $code )* }.map(|v| (v, task_manager)) }) + }, + Runtime::Glutton => { + runner.async_run(|$config| { + let $components = new_partial::( + &$config, + crate::service::shell_build_import_queue, + )?; + let task_manager = $components.task_manager; + { $( $code )* }.map(|v| (v, task_manager)) + }) } } }} @@ -659,7 +700,9 @@ pub fn run() -> Result<()> { bridge_hub_runtime_type ) .into()), - } + }, + Runtime::Glutton => + cmd.run::(config), _ => Err(format!( "Chain '{:?}' doesn't support benchmarking", config.chain_spec.runtime() @@ -796,6 +839,12 @@ pub fn run() -> Result<()> { task_manager, )) }), + Runtime::Glutton => runner.async_run(|_| { + Ok(( + cmd.run::, _>(Some(info_provider)), + task_manager, + )) + }), _ => Err("Chain doesn't support try-runtime".into()), } }, @@ -963,6 +1012,17 @@ pub fn run() -> Result<()> { .await .map(|r| r.0) .map_err(Into::into), + Runtime::Glutton => + crate::service::start_shell_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), } }) }, diff --git a/polkadot-parachain/src/service.rs b/polkadot-parachain/src/service.rs index 71fe4d35b16..b4cc4ce4981 100644 --- a/polkadot-parachain/src/service.rs +++ b/polkadot-parachain/src/service.rs @@ -206,6 +206,21 @@ impl sc_executor::NativeExecutionDispatch for ContractsRococoRuntimeExecutor { } } +/// Native Glutton executor instance. +pub struct GluttonRuntimeExecutor; + +impl sc_executor::NativeExecutionDispatch for GluttonRuntimeExecutor { + type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; + + fn dispatch(method: &str, data: &[u8]) -> Option> { + shell_runtime::api::dispatch(method, data) + } + + fn native_version() -> sc_executor::NativeVersion { + shell_runtime::native_version() + } +} + /// Starts a `ServiceBuilder` for a full service. /// /// Use this macro if you don't actually need the full service, but just the builder in order to diff --git a/scripts/benchmarks-ci.sh b/scripts/benchmarks-ci.sh index 4b465400198..fcf0cc61984 100755 --- a/scripts/benchmarks-ci.sh +++ b/scripts/benchmarks-ci.sh @@ -9,6 +9,10 @@ repeat=${5:-20} benchmarkOutput=./parachains/runtimes/$category/$runtimeName/src/weights benchmarkRuntimeName="$runtimeName-dev" +if [ $category = "glutton" ]; then + benchmarkRuntimeName="$runtimeName-dev-1300" +fi + # Load all pallet names in an array. pallets=($( ${artifactsDir}/polkadot-parachain benchmark pallet --list --chain="${benchmarkRuntimeName}" |\ diff --git a/scripts/benchmarks.sh b/scripts/benchmarks.sh index 0db74102f24..be9aa9b8348 100755 --- a/scripts/benchmarks.sh +++ b/scripts/benchmarks.sh @@ -15,3 +15,5 @@ ${__dir}/benchmarks-ci.sh assets westmint target/$target $steps $repeat ${__dir}/benchmarks-ci.sh bridge-hubs bridge-hub-polkadot target/$target $steps $repeat ${__dir}/benchmarks-ci.sh bridge-hubs bridge-hub-kusama target/$target $steps $repeat ${__dir}/benchmarks-ci.sh bridge-hubs bridge-hub-rococo target/$target $steps $repeat + +${__dir}/benchmarks-ci.sh glutton glutton-kusama target/$target $steps $repeat From 48d01c4825f9f15b47dbf2f3f1cab4255d71a38f Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 17 May 2023 12:19:38 +0200 Subject: [PATCH 195/339] Bump polkadot (#2589) --- Cargo.lock | 134 ++++++++++++++++++++++++++--------------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bef4bd1a02d..9958eeccdbf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5118,7 +5118,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bitvec", "frame-benchmarking", @@ -5216,7 +5216,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "frame-support", "polkadot-primitives", @@ -7867,7 +7867,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7888,7 +7888,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "frame-benchmarking", "frame-support", @@ -8466,7 +8466,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8482,7 +8482,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8496,7 +8496,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "derive_more", "fatality", @@ -8519,7 +8519,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "fatality", "futures", @@ -8540,7 +8540,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8569,7 +8569,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "async-trait", "frame-benchmarking", @@ -8612,7 +8612,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "always-assert", "bitvec", @@ -8634,7 +8634,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "parity-scale-codec", "scale-info", @@ -8646,7 +8646,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "derive_more", "fatality", @@ -8671,7 +8671,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8685,7 +8685,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "futures", "futures-timer", @@ -8705,7 +8705,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "always-assert", "async-trait", @@ -8728,7 +8728,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "futures", "parity-scale-codec", @@ -8746,7 +8746,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bitvec", "derive_more", @@ -8775,7 +8775,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bitvec", "futures", @@ -8796,7 +8796,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bitvec", "fatality", @@ -8815,7 +8815,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8830,7 +8830,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "async-trait", "futures", @@ -8850,7 +8850,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "futures", "polkadot-node-metrics", @@ -8865,7 +8865,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "futures", "futures-timer", @@ -8882,7 +8882,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "fatality", "futures", @@ -8901,7 +8901,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "async-trait", "futures", @@ -8918,7 +8918,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bitvec", "fatality", @@ -8936,7 +8936,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "always-assert", "futures", @@ -8963,7 +8963,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "futures", "polkadot-node-primitives", @@ -8979,7 +8979,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "assert_matches", "cpu-time", @@ -9008,7 +9008,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "futures", "lru 0.9.0", @@ -9023,7 +9023,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "lazy_static", "log", @@ -9041,7 +9041,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bs58", "futures", @@ -9060,7 +9060,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "async-trait", "derive_more", @@ -9082,7 +9082,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bounded-vec", "futures", @@ -9104,7 +9104,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9114,7 +9114,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "async-trait", "futures", @@ -9132,7 +9132,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "async-trait", "derive_more", @@ -9155,7 +9155,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "async-trait", "derive_more", @@ -9188,7 +9188,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "async-trait", "futures", @@ -9211,7 +9211,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bounded-collections", "derive_more", @@ -9310,7 +9310,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9328,7 +9328,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9354,7 +9354,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9386,7 +9386,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bitvec", "frame-benchmarking", @@ -9480,7 +9480,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bitvec", "frame-benchmarking", @@ -9526,7 +9526,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "frame-support", "polkadot-primitives", @@ -9540,7 +9540,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bs58", "parity-scale-codec", @@ -9552,7 +9552,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bitflags", "bitvec", @@ -9596,7 +9596,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9706,7 +9706,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9727,7 +9727,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9737,7 +9737,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9762,7 +9762,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9823,7 +9823,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "frame-benchmarking", "frame-system", @@ -10615,7 +10615,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10701,7 +10701,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "frame-support", "polkadot-primitives", @@ -12555,7 +12555,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "enumn", "parity-scale-codec", @@ -13918,7 +13918,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "frame-support", "polkadot-primitives", @@ -14304,7 +14304,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14315,7 +14315,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -15378,7 +15378,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bitvec", "frame-benchmarking", @@ -15470,7 +15470,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "frame-support", "polkadot-primitives", @@ -15972,7 +15972,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "bounded-collections", "derivative", @@ -15988,7 +15988,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "frame-support", "frame-system", @@ -16009,7 +16009,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "environmental", "frame-benchmarking", @@ -16029,7 +16029,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#19fdd197aff085f7f66e54942999fd536e7df475" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" dependencies = [ "Inflector", "proc-macro2", From dd48e3a3d085c431a89b1356e422772378fd9c41 Mon Sep 17 00:00:00 2001 From: Joakim Nyman Date: Wed, 17 May 2023 21:28:26 +0200 Subject: [PATCH 196/339] Added Dwellir bootnodes. (#2557) --- parachains/chain-specs/bridge-hub-kusama.json | 4 +++- parachains/chain-specs/bridge-hub-polkadot.json | 4 +++- parachains/chain-specs/bridge-hub-westend.json | 4 +++- parachains/chain-specs/collectives-polkadot.json | 4 +++- parachains/chain-specs/collectives-westend.json | 4 +++- parachains/chain-specs/statemine.json | 4 +++- parachains/chain-specs/statemint.json | 4 +++- parachains/chain-specs/westmint.json | 4 +++- 8 files changed, 24 insertions(+), 8 deletions(-) diff --git a/parachains/chain-specs/bridge-hub-kusama.json b/parachains/chain-specs/bridge-hub-kusama.json index f49420b1747..a0938b7f0de 100644 --- a/parachains/chain-specs/bridge-hub-kusama.json +++ b/parachains/chain-specs/bridge-hub-kusama.json @@ -27,7 +27,9 @@ "/dns/boot-node.helikon.io/tcp/10250/p2p/12D3KooWDJLkhqQdXcVKWX7CqJHnpAY6PzrPc4ZG2CUWnARbmguy", "/dns/boot-node.helikon.io/tcp/10252/wss/p2p/12D3KooWDJLkhqQdXcVKWX7CqJHnpAY6PzrPc4ZG2CUWnARbmguy", "/dns/bridge-hub-kusama.bootnode.amforc.com/tcp/30337/p2p/12D3KooWGNeQJ5rXnEJkVUuQqwHd8aV5GkTAheaRoCaK8ZwW94id", - "/dns/bridge-hub-kusama.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWGNeQJ5rXnEJkVUuQqwHd8aV5GkTAheaRoCaK8ZwW94id" + "/dns/bridge-hub-kusama.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWGNeQJ5rXnEJkVUuQqwHd8aV5GkTAheaRoCaK8ZwW94id", + "/dns/kusama-bridge-hub-boot-ng.dwellir.com/tcp/30337/p2p/12D3KooWBFskNCQDVjuUeBh6vrszWrUvYMBBhtZRLnoTZDdLYbW5", + "/dns/kusama-bridge-hub-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWBFskNCQDVjuUeBh6vrszWrUvYMBBhtZRLnoTZDdLYbW5" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/bridge-hub-polkadot.json b/parachains/chain-specs/bridge-hub-polkadot.json index 4c28b9d419d..39a165d95c0 100644 --- a/parachains/chain-specs/bridge-hub-polkadot.json +++ b/parachains/chain-specs/bridge-hub-polkadot.json @@ -10,7 +10,9 @@ "/dns/polkadot-bridge-hub-connect-a-0.polkadot.io/tcp/443/wss/p2p/12D3KooWAVQMhkXmc5ueSYasdsRWQbKus2YGZ6HDZUB4ViJMCxXy", "/dns/polkadot-bridge-hub-connect-a-1.polkadot.io/tcp/443/wss/p2p/12D3KooWG4ypDHLKGCv4BZ6PuaGUwQHKAH6p2D6arR2uQ1eiR1T3", "/dns/polkadot-bridge-hub-connect-b-0.polkadot.io/tcp/443/wss/p2p/12D3KooWCwGKxjpJXnx1mwXKvaxGQm769EM3b6Pg5vbU33wbhsNw", - "/dns/polkadot-bridge-hub-connect-b-1.polkadot.io/tcp/443/wss/p2p/12D3KooWLiSEdhriJUPdZKFtAjZrQncxN2ssEoDKVrt5mGM4Qu4J" + "/dns/polkadot-bridge-hub-connect-b-1.polkadot.io/tcp/443/wss/p2p/12D3KooWLiSEdhriJUPdZKFtAjZrQncxN2ssEoDKVrt5mGM4Qu4J", + "/dns/polkadot-bridge-hub-boot-ng.dwellir.com/tcp/30339/p2p/12D3KooWPZ38PL3PhRVcUVYDNn7nRcZF8MykmWWLBKeDV2yna1vV", + "/dns/polkadot-bridge-hub-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWPZ38PL3PhRVcUVYDNn7nRcZF8MykmWWLBKeDV2yna1vV" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/bridge-hub-westend.json b/parachains/chain-specs/bridge-hub-westend.json index 460c25e8f50..8013d40c8a6 100644 --- a/parachains/chain-specs/bridge-hub-westend.json +++ b/parachains/chain-specs/bridge-hub-westend.json @@ -6,7 +6,9 @@ "/dns/westend-bridge-hub-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWKyEuqkkWvFSrwZWKWBAsHgLV3HGfHj7yH3LNJLAVhmxY", "/dns/westend-bridge-hub-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWBpvudthz61XC4oP2YYFFJdhWohBeQ1ffn1BMSGWhapjd", "/dns/westend-bridge-hub-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWPXqdRRthjKAMPFtaXUK7yBxsvh83QsmzXzALA3inoJfo", - "/dns/westend-bridge-hub-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWAp2YpVaiNBy7rozEHJGocDpaLFt3VFZsGMBEYh4BoEz7" + "/dns/westend-bridge-hub-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWAp2YpVaiNBy7rozEHJGocDpaLFt3VFZsGMBEYh4BoEz7", + "/dns/westend-bridge-hub-boot-ng.dwellir.com/tcp/30338/p2p/12D3KooWJWWRYTAwBLqYkh7iMBGDr5ouJ3MHj7M3fZ7zWS4zEk6F", + "/dns/westend-bridge-hub-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWJWWRYTAwBLqYkh7iMBGDr5ouJ3MHj7M3fZ7zWS4zEk6F" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/collectives-polkadot.json b/parachains/chain-specs/collectives-polkadot.json index 99fc78ea4a6..850d895e4d4 100644 --- a/parachains/chain-specs/collectives-polkadot.json +++ b/parachains/chain-specs/collectives-polkadot.json @@ -27,7 +27,9 @@ "/dns/boot-node.helikon.io/tcp/10230/p2p/12D3KooWS8CBz4P5CBny9aBy2EQUvAExFo9PUVT57X8r3zWMFkXT", "/dns/boot-node.helikon.io/tcp/10232/wss/p2p/12D3KooWS8CBz4P5CBny9aBy2EQUvAExFo9PUVT57X8r3zWMFkXT", "/dns/collectives-polkadot.bootnode.amforc.com/tcp/30335/p2p/12D3KooWQeAjDnGkrPe5vtpfnB6ydZfWyMxyrXLkBFmA6o4k9aiU", - "/dns/collectives-polkadot.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWQeAjDnGkrPe5vtpfnB6ydZfWyMxyrXLkBFmA6o4k9aiU" + "/dns/collectives-polkadot.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWQeAjDnGkrPe5vtpfnB6ydZfWyMxyrXLkBFmA6o4k9aiU", + "/dns/polkadot-collectives-boot-ng.dwellir.com/tcp/30341/p2p/12D3KooWDMFYCNRAQcSRNV7xu2xv8319goSEbSHW4TnXRz6EpPKc", + "/dns/polkadot-collectives-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWDMFYCNRAQcSRNV7xu2xv8319goSEbSHW4TnXRz6EpPKc" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/collectives-westend.json b/parachains/chain-specs/collectives-westend.json index db4552e046b..3eb3366e9c3 100644 --- a/parachains/chain-specs/collectives-westend.json +++ b/parachains/chain-specs/collectives-westend.json @@ -31,7 +31,9 @@ "/dns/boot-node.helikon.io/tcp/10260/p2p/12D3KooWMzfnt29VAmrJHQcJU6Vfn4RsMbqPqgyWHqt9VTTAbSrL", "/dns/boot-node.helikon.io/tcp/10262/wss/p2p/12D3KooWMzfnt29VAmrJHQcJU6Vfn4RsMbqPqgyWHqt9VTTAbSrL", "/dns/collectives-westend.bootnode.amforc.com/tcp/30340/p2p/12D3KooWERPzUhHau6o2XZRUi3tn7544rYiaHL418Nw5t8fYWP1F", - "/dns/collectives-westend.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWERPzUhHau6o2XZRUi3tn7544rYiaHL418Nw5t8fYWP1F" + "/dns/collectives-westend.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWERPzUhHau6o2XZRUi3tn7544rYiaHL418Nw5t8fYWP1F", + "/dns/westend-collectives-boot-ng.dwellir.com/tcp/30340/p2p/12D3KooWPFM93jgm4pgxx8PM8WJKAJF49qia8jRB95uciUQwYh7m", + "/dns/westend-collectives-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWPFM93jgm4pgxx8PM8WJKAJF49qia8jRB95uciUQwYh7m" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/statemine.json b/parachains/chain-specs/statemine.json index dd32b21adb5..c31c715fc01 100644 --- a/parachains/chain-specs/statemine.json +++ b/parachains/chain-specs/statemine.json @@ -25,7 +25,9 @@ "/dns/boot-node.helikon.io/tcp/10210/p2p/12D3KooWFXRQce3aMgZMn5SxvHtYH4PsR63TZLf8LrnBsEVTyzdr", "/dns/boot-node.helikon.io/tcp/10212/wss/p2p/12D3KooWFXRQce3aMgZMn5SxvHtYH4PsR63TZLf8LrnBsEVTyzdr", "/dns/statemine.bootnode.amforc.com/tcp/30336/p2p/12D3KooWHmSyrBWsc6fdpq8HtCFWasmLVLYGKWA2a78m4xAHKyBq", - "/dns/statemine.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWHmSyrBWsc6fdpq8HtCFWasmLVLYGKWA2a78m4xAHKyBq" + "/dns/statemine.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWHmSyrBWsc6fdpq8HtCFWasmLVLYGKWA2a78m4xAHKyBq", + "/dns/statemine-boot-ng.dwellir.com/tcp/30343/p2p/12D3KooWQNJKBaNfW6Nn7HZDi5pSSEFmHL2Qz7chr9RksQUDR1Wk", + "/dns/statemine-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWQNJKBaNfW6Nn7HZDi5pSSEFmHL2Qz7chr9RksQUDR1Wk" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/statemint.json b/parachains/chain-specs/statemint.json index 12d655ae7df..55973c2dbb3 100644 --- a/parachains/chain-specs/statemint.json +++ b/parachains/chain-specs/statemint.json @@ -25,7 +25,9 @@ "/dns/boot-node.helikon.io/tcp/10220/p2p/12D3KooW9uybhguhDjVJc3U3kgZC3i8rWmAnSpbnJkmuR7C6ZsRW", "/dns/boot-node.helikon.io/tcp/10222/wss/p2p/12D3KooW9uybhguhDjVJc3U3kgZC3i8rWmAnSpbnJkmuR7C6ZsRW", "/dns/statemint.bootnode.amforc.com/tcp/30341/p2p/12D3KooWByohP9FXn7ao8syS167qJsbFdpa7fY2Y24xbKtt3r7Ls", - "/dns/statemint.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWByohP9FXn7ao8syS167qJsbFdpa7fY2Y24xbKtt3r7Ls" + "/dns/statemint.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWByohP9FXn7ao8syS167qJsbFdpa7fY2Y24xbKtt3r7Ls", + "/dns/statemint-boot-ng.dwellir.com/tcp/30344/p2p/12D3KooWEFrNuNk8fPdQS2hf34Gmqi6dGSvrETshGJUrqrvfRDZr", + "/dns/statemint-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWEFrNuNk8fPdQS2hf34Gmqi6dGSvrETshGJUrqrvfRDZr" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/westmint.json b/parachains/chain-specs/westmint.json index a700e5ddd61..d498fc320cb 100644 --- a/parachains/chain-specs/westmint.json +++ b/parachains/chain-specs/westmint.json @@ -19,7 +19,9 @@ "/dns/boot-node.helikon.io/tcp/10200/p2p/12D3KooWMRY8wb7rMT81LLuivvsy6ahUxKHQgYJw4zm1hC1uYLxb", "/dns/boot-node.helikon.io/tcp/10202/wss/p2p/12D3KooWMRY8wb7rMT81LLuivvsy6ahUxKHQgYJw4zm1hC1uYLxb", "/dns/westmint.bootnode.amforc.com/tcp/30339/p2p/12D3KooWNjKeaANaeZxBAPctmx8jugSYzuw4vnSCJmEDPB5mtRd6", - "/dns/westmint.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWNjKeaANaeZxBAPctmx8jugSYzuw4vnSCJmEDPB5mtRd6" + "/dns/westmint.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWNjKeaANaeZxBAPctmx8jugSYzuw4vnSCJmEDPB5mtRd6", + "/dns/westmint-boot-ng.dwellir.com/tcp/30345/p2p/12D3KooWFZ9xqApB1wnFYkbe1qJ5Jqwxe2f3i8W25F3tKNXy59ux", + "/dns/westmint-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWFZ9xqApB1wnFYkbe1qJ5Jqwxe2f3i8W25F3tKNXy59ux" ], "telemetryEndpoints": null, "protocolId": null, From 99df7d005228c765e7fa8d90db52d5ab93db99ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 22:06:40 +0200 Subject: [PATCH 197/339] Bump scale-info from 2.6.0 to 2.7.0 (#2587) Bumps [scale-info](https://github.com/paritytech/scale-info) from 2.6.0 to 2.7.0. - [Release notes](https://github.com/paritytech/scale-info/releases) - [Changelog](https://github.com/paritytech/scale-info/blob/master/CHANGELOG.md) - [Commits](https://github.com/paritytech/scale-info/commits/v2.7.0) --- updated-dependencies: - dependency-name: scale-info dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- bridges/bin/runtime-common/Cargo.toml | 2 +- bridges/modules/grandpa/Cargo.toml | 2 +- bridges/modules/messages/Cargo.toml | 2 +- bridges/modules/parachains/Cargo.toml | 2 +- bridges/modules/relayers/Cargo.toml | 2 +- pallets/aura-ext/Cargo.toml | 2 +- pallets/collator-selection/Cargo.toml | 2 +- pallets/dmp-queue/Cargo.toml | 2 +- pallets/parachain-system/Cargo.toml | 2 +- pallets/solo-to-para/Cargo.toml | 2 +- pallets/xcm/Cargo.toml | 2 +- pallets/xcmp-queue/Cargo.toml | 2 +- parachain-template/runtime/Cargo.toml | 2 +- parachains/common/Cargo.toml | 2 +- parachains/pallets/parachain-info/Cargo.toml | 2 +- parachains/pallets/ping/Cargo.toml | 2 +- parachains/runtimes/assets/common/Cargo.toml | 2 +- parachains/runtimes/assets/statemine/Cargo.toml | 2 +- parachains/runtimes/assets/statemint/Cargo.toml | 2 +- parachains/runtimes/assets/westmint/Cargo.toml | 2 +- parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml | 2 +- parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- .../runtimes/collectives/collectives-polkadot/Cargo.toml | 2 +- parachains/runtimes/contracts/contracts-rococo/Cargo.toml | 2 +- parachains/runtimes/glutton/glutton-kusama/Cargo.toml | 2 +- parachains/runtimes/starters/seedling/Cargo.toml | 2 +- parachains/runtimes/starters/shell/Cargo.toml | 2 +- parachains/runtimes/testing/penpal/Cargo.toml | 2 +- parachains/runtimes/testing/rococo-parachain/Cargo.toml | 2 +- primitives/core/Cargo.toml | 2 +- primitives/parachain-inherent/Cargo.toml | 2 +- test/runtime/Cargo.toml | 2 +- 34 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9958eeccdbf..05a0d46c8cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12088,9 +12088,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfdef77228a4c05dc94211441595746732131ad7f6530c6c18f045da7b7ab937" +checksum = "b569c32c806ec3abdf3b5869fb8bf1e0d275a7c1c9b0b05603d9464632649edf" dependencies = [ "bitvec", "cfg-if", diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml index 08d102cc753..5f42048d8d3 100644 --- a/bridges/bin/runtime-common/Cargo.toml +++ b/bridges/bin/runtime-common/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } hash-db = { version = "0.16.0", default-features = false } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } static_assertions = { version = "1.1", optional = true } # Bridge dependencies diff --git a/bridges/modules/grandpa/Cargo.toml b/bridges/modules/grandpa/Cargo.toml index 9b97b518fc5..ea8d00b8860 100644 --- a/bridges/modules/grandpa/Cargo.toml +++ b/bridges/modules/grandpa/Cargo.toml @@ -11,7 +11,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } finality-grandpa = { version = "0.16.2", default-features = false } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Bridge Dependencies diff --git a/bridges/modules/messages/Cargo.toml b/bridges/modules/messages/Cargo.toml index 639ac9dc23c..52fdea1df00 100644 --- a/bridges/modules/messages/Cargo.toml +++ b/bridges/modules/messages/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } log = { version = "0.4.17", default-features = false } num-traits = { version = "0.2", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Bridge dependencies diff --git a/bridges/modules/parachains/Cargo.toml b/bridges/modules/parachains/Cargo.toml index d8c89b79991..147111fd4ce 100644 --- a/bridges/modules/parachains/Cargo.toml +++ b/bridges/modules/parachains/Cargo.toml @@ -8,7 +8,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Bridge Dependencies diff --git a/bridges/modules/relayers/Cargo.toml b/bridges/modules/relayers/Cargo.toml index 857d47cc65a..2a504b0e090 100644 --- a/bridges/modules/relayers/Cargo.toml +++ b/bridges/modules/relayers/Cargo.toml @@ -9,7 +9,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Bridge dependencies diff --git a/pallets/aura-ext/Cargo.toml b/pallets/aura-ext/Cargo.toml index 6c890eeceb0..23f70e4be9b 100644 --- a/pallets/aura-ext/Cargo.toml +++ b/pallets/aura-ext/Cargo.toml @@ -7,7 +7,7 @@ description = "AURA consensus extension pallet for parachains" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/collator-selection/Cargo.toml b/pallets/collator-selection/Cargo.toml index 837b0c0287c..9ff4d2eb5e6 100644 --- a/pallets/collator-selection/Cargo.toml +++ b/pallets/collator-selection/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] log = { version = "0.4.17", default-features = false } codec = { default-features = false, features = ["derive"], package = "parity-scale-codec", version = "3.0.0" } rand = { version = "0.8.5", features = ["std_rng"], default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/pallets/dmp-queue/Cargo.toml b/pallets/dmp-queue/Cargo.toml index 81cb05d8af1..c2e914cf282 100644 --- a/pallets/dmp-queue/Cargo.toml +++ b/pallets/dmp-queue/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/parachain-system/Cargo.toml b/pallets/parachain-system/Cargo.toml index 3a67e2eef4c..23db13bca7c 100644 --- a/pallets/parachain-system/Cargo.toml +++ b/pallets/parachain-system/Cargo.toml @@ -11,7 +11,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = environmental = { version = "1.1.4", default-features = false } impl-trait-for-tuples = "0.2.1" log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/solo-to-para/Cargo.toml b/pallets/solo-to-para/Cargo.toml index d4800733cee..c7398391b7f 100644 --- a/pallets/solo-to-para/Cargo.toml +++ b/pallets/solo-to-para/Cargo.toml @@ -7,7 +7,7 @@ description = "Adds functionality to migrate from a Solo to a Parachain" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/xcm/Cargo.toml b/pallets/xcm/Cargo.toml index 841c862557a..80436a841ea 100644 --- a/pallets/xcm/Cargo.toml +++ b/pallets/xcm/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/pallets/xcmp-queue/Cargo.toml b/pallets/xcmp-queue/Cargo.toml index 62419f78a08..2238469f05a 100644 --- a/pallets/xcmp-queue/Cargo.toml +++ b/pallets/xcmp-queue/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } log = { version = "0.4.17", default-features = false } rand_chacha = { version = "0.3.0", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachain-template/runtime/Cargo.toml b/parachain-template/runtime/Cargo.toml index fefaffb032c..7894ea2176e 100644 --- a/parachain-template/runtime/Cargo.toml +++ b/parachain-template/runtime/Cargo.toml @@ -18,7 +18,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Local diff --git a/parachains/common/Cargo.toml b/parachains/common/Cargo.toml index bf16861894c..ba2955615f3 100644 --- a/parachains/common/Cargo.toml +++ b/parachains/common/Cargo.toml @@ -10,7 +10,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"], default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } diff --git a/parachains/pallets/parachain-info/Cargo.toml b/parachains/pallets/parachain-info/Cargo.toml index 7ff346fe24b..3fbccc215e0 100644 --- a/parachains/pallets/parachain-info/Cargo.toml +++ b/parachains/pallets/parachain-info/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/pallets/ping/Cargo.toml b/parachains/pallets/ping/Cargo.toml index b705a9a2f10..2af482598c2 100644 --- a/parachains/pallets/ping/Cargo.toml +++ b/parachains/pallets/ping/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/assets/common/Cargo.toml b/parachains/runtimes/assets/common/Cargo.toml index 303b0bd9c64..db9d5674dad 100644 --- a/parachains/runtimes/assets/common/Cargo.toml +++ b/parachains/runtimes/assets/common/Cargo.toml @@ -7,7 +7,7 @@ description = "Assets common utilities" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } # Substrate diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index c3231e23958..ad16c4bafc6 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -9,7 +9,7 @@ description = "Kusama variant of Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/assets/statemint/Cargo.toml b/parachains/runtimes/assets/statemint/Cargo.toml index 837be9a2738..61955f3c6bb 100644 --- a/parachains/runtimes/assets/statemint/Cargo.toml +++ b/parachains/runtimes/assets/statemint/Cargo.toml @@ -9,7 +9,7 @@ description = "Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/westmint/Cargo.toml index 91b06660dfa..b7484ec3122 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/westmint/Cargo.toml @@ -9,7 +9,7 @@ description = "Westend variant of Statemint parachain runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index 9498823e358..4853ad2eb60 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } serde = { version = "1.0.163", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 3a5476b8f20..4e14a964363 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } serde = { version = "1.0.163", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 2ab55ae8ca4..51c501dc4e8 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -12,7 +12,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } serde = { version = "1.0.163", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml index 13fe985a63b..9ab4be51048 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml +++ b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml @@ -9,7 +9,7 @@ description = "Polkadot Collectives Parachain Runtime" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index 1bbf4b09294..37996e29586 100644 --- a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -14,7 +14,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/glutton/glutton-kusama/Cargo.toml b/parachains/runtimes/glutton/glutton-kusama/Cargo.toml index d1b80296191..e2ad80d2048 100644 --- a/parachains/runtimes/glutton/glutton-kusama/Cargo.toml +++ b/parachains/runtimes/glutton/glutton-kusama/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } diff --git a/parachains/runtimes/starters/seedling/Cargo.toml b/parachains/runtimes/starters/seedling/Cargo.toml index 0a9e05d4bb4..ac81003f36f 100644 --- a/parachains/runtimes/starters/seedling/Cargo.toml +++ b/parachains/runtimes/starters/seedling/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/starters/shell/Cargo.toml b/parachains/runtimes/starters/shell/Cargo.toml index 7332ff8d012..670578b506a 100644 --- a/parachains/runtimes/starters/shell/Cargo.toml +++ b/parachains/runtimes/starters/shell/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/testing/penpal/Cargo.toml b/parachains/runtimes/testing/penpal/Cargo.toml index a42bf488487..679a252c362 100644 --- a/parachains/runtimes/testing/penpal/Cargo.toml +++ b/parachains/runtimes/testing/penpal/Cargo.toml @@ -18,7 +18,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } log = { version = "0.4.16", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" # Substrate diff --git a/parachains/runtimes/testing/rococo-parachain/Cargo.toml b/parachains/runtimes/testing/rococo-parachain/Cargo.toml index 9b3f993bb77..e5f567cbbf4 100644 --- a/parachains/runtimes/testing/rococo-parachain/Cargo.toml +++ b/parachains/runtimes/testing/rococo-parachain/Cargo.toml @@ -7,7 +7,7 @@ description = "Simple runtime used by the rococo parachain(s)" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index b2adf290db1..990a76d2d8a 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/primitives/parachain-inherent/Cargo.toml b/primitives/parachain-inherent/Cargo.toml index ff7bfa8ae44..5c1730e35e0 100644 --- a/primitives/parachain-inherent/Cargo.toml +++ b/primitives/parachain-inherent/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] async-trait = { version = "0.1.68", optional = true } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } tracing = { version = "0.1.37", optional = true } # Substrate diff --git a/test/runtime/Cargo.toml b/test/runtime/Cargo.toml index cbba13e1a93..6f829c27492 100644 --- a/test/runtime/Cargo.toml +++ b/test/runtime/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } From 97899fbd7ef69c883e407fb8f1bae4ea101ed1cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 21:46:57 +0000 Subject: [PATCH 198/339] Bump proc-macro2 from 1.0.56 to 1.0.58 (#2592) Bumps [proc-macro2](https://github.com/dtolnay/proc-macro2) from 1.0.56 to 1.0.58. - [Release notes](https://github.com/dtolnay/proc-macro2/releases) - [Commits](https://github.com/dtolnay/proc-macro2/compare/1.0.56...1.0.58) --- updated-dependencies: - dependency-name: proc-macro2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- pallets/parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 05a0d46c8cb..2e159252208 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10070,9 +10070,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" dependencies = [ "unicode-ident", ] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index d32fd096999..f98ca6f469b 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -10,7 +10,7 @@ proc-macro = true [dependencies] syn = "2.0.15" -proc-macro2 = "1.0.54" +proc-macro2 = "1.0.58" quote = "1.0.27" proc-macro-crate = "1.3.1" From 974dc4616a9bd3ca82641cc3f80bc317c188e13c Mon Sep 17 00:00:00 2001 From: Adrian Catangiu Date: Thu, 18 May 2023 18:10:36 +0300 Subject: [PATCH 199/339] BridgeHub[Rococo/Wococo] test batched relaying of messages and their dispatch (#2578) Added some tests that aim to cover the runtime configuration that is exercised when BH receives relayed complex message. * checks correct importing of proofs for: bridged chain finality, bridged para heads, bridged messages, * checks relayer extension correctly configured to reward submitting relayer, * checks relayed message is successfully dispatched. Also moved generic test-utils from `asset-test-utils: parachains/runtimes/assets/test-utils` one level up to new crate `parachains-runtimes-test-utils: parachains/runtimes/test-utils` to be reused by BridgeHubs. Signed-off-by: acatangiu Co-authored-by: Branislav Kontur --- .gitignore | 1 - Cargo.lock | 52 ++ bridges/bin/runtime-common/src/lib.rs | 2 +- .../runtime-common/src/messages_generation.rs | 8 +- bridges/modules/parachains/src/lib.rs | 96 +-- bridges/primitives/test-utils/Cargo.toml | 9 +- bridges/primitives/test-utils/src/lib.rs | 41 + .../runtimes/assets/statemine/tests/tests.rs | 46 +- .../runtimes/assets/statemint/tests/tests.rs | 28 +- .../runtimes/assets/test-utils/Cargo.toml | 2 + .../runtimes/assets/test-utils/src/lib.rs | 421 +--------- .../assets/test-utils/src/test_cases.rs | 37 +- .../runtimes/assets/westmint/tests/tests.rs | 46 +- .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 + .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 3 - .../bridge-hub-rococo/tests/tests.rs | 553 ++++++++----- .../bridge-hubs/test-utils/Cargo.toml | 27 +- .../bridge-hubs/test-utils/src/lib.rs | 8 +- .../bridge-hubs/test-utils/src/test_cases.rs | 762 +++++++++++++----- parachains/runtimes/test-utils/Cargo.toml | 74 ++ parachains/runtimes/test-utils/src/lib.rs | 479 +++++++++++ 21 files changed, 1720 insertions(+), 977 deletions(-) create mode 100644 parachains/runtimes/test-utils/Cargo.toml create mode 100644 parachains/runtimes/test-utils/src/lib.rs diff --git a/.gitignore b/.gitignore index 58abcc32cc5..225be857745 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,4 @@ polkadot_argument_parsing **/chains/ *.iml .env -bin **/._* diff --git a/Cargo.lock b/Cargo.lock index 2e159252208..e7e81aa65a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -394,6 +394,7 @@ dependencies = [ "pallet-xcm", "parachain-info", "parachains-common", + "parachains-runtimes-test-utils", "parity-scale-codec", "polkadot-parachain", "sp-consensus-aura", @@ -914,13 +915,18 @@ name = "bp-test-utils" version = "0.1.0" dependencies = [ "bp-header-chain", + "bp-parachains", + "bp-polkadot-core", + "bp-runtime", "ed25519-dalek", "finality-grandpa", "parity-scale-codec", "sp-application-crypto", "sp-consensus-grandpa", + "sp-core", "sp-runtime", "sp-std", + "sp-trie", ] [[package]] @@ -1126,6 +1132,7 @@ dependencies = [ "sp-core", "sp-inherents", "sp-io", + "sp-keyring", "sp-offchain", "sp-runtime", "sp-session", @@ -1144,28 +1151,40 @@ name = "bridge-hub-test-utils" version = "0.1.0" dependencies = [ "asset-test-utils", + "bp-bridge-hub-rococo", + "bp-bridge-hub-wococo", "bp-header-chain", "bp-messages", + "bp-parachains", "bp-polkadot-core", + "bp-relayers", "bp-runtime", "bp-test-utils", "bridge-runtime-common", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", "cumulus-pallet-xcmp-queue", + "frame-benchmarking", + "frame-executive", "frame-support", "frame-system", "log", "pallet-balances", "pallet-bridge-grandpa", "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-bridge-relayers", "pallet-collator-selection", "pallet-session", + "pallet-utility", "pallet-xcm", "pallet-xcm-benchmarks", "parachain-info", + "parachains-runtimes-test-utils", "parity-scale-codec", + "sp-core", "sp-io", + "sp-keyring", "sp-runtime", "xcm", "xcm-builder", @@ -8051,6 +8070,39 @@ dependencies = [ "xcm-executor", ] +[[package]] +name = "parachains-runtimes-test-utils" +version = "1.0.0" +dependencies = [ + "assets-common", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-test-relay-sproof-builder", + "frame-support", + "frame-system", + "hex-literal 0.3.4", + "pallet-assets", + "pallet-balances", + "pallet-collator-selection", + "pallet-session", + "pallet-xcm", + "parachain-info", + "parachains-common", + "parity-scale-codec", + "polkadot-parachain", + "sp-consensus-aura", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "substrate-wasm-builder", + "xcm", + "xcm-executor", +] + [[package]] name = "parity-db" version = "0.4.8" diff --git a/bridges/bin/runtime-common/src/lib.rs b/bridges/bin/runtime-common/src/lib.rs index 12b096492cd..546d4388471 100644 --- a/bridges/bin/runtime-common/src/lib.rs +++ b/bridges/bin/runtime-common/src/lib.rs @@ -28,12 +28,12 @@ pub mod messages; pub mod messages_api; pub mod messages_benchmarking; pub mod messages_call_ext; +pub mod messages_generation; pub mod messages_xcm_extension; pub mod parachains_benchmarking; pub mod priority_calculator; pub mod refund_relayer_extension; -mod messages_generation; mod mock; #[cfg(feature = "integrity-test")] diff --git a/bridges/bin/runtime-common/src/messages_generation.rs b/bridges/bin/runtime-common/src/messages_generation.rs index 29a869a5c87..8dbf3abd683 100644 --- a/bridges/bin/runtime-common/src/messages_generation.rs +++ b/bridges/bin/runtime-common/src/messages_generation.rs @@ -16,8 +16,6 @@ //! Helpers for generating message storage proofs, that are used by tests and by benchmarks. -#![cfg(any(feature = "runtime-benchmarks", test))] - use crate::messages::{BridgedChain, HashOf, HasherOf, MessageBridge}; use bp_messages::{ @@ -29,19 +27,19 @@ use sp_std::{ops::RangeInclusive, prelude::*}; use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; /// Simple and correct message data encode function. -pub(crate) fn encode_all_messages(_: MessageNonce, m: &MessagePayload) -> Option> { +pub fn encode_all_messages(_: MessageNonce, m: &MessagePayload) -> Option> { Some(m.encode()) } /// Simple and correct outbound lane data encode function. -pub(crate) fn encode_lane_data(d: &OutboundLaneData) -> Vec { +pub fn encode_lane_data(d: &OutboundLaneData) -> Vec { d.encode() } /// Prepare storage proof of given messages. /// /// Returns state trie root and nodes with prepared messages. -pub(crate) fn prepare_messages_storage_proof( +pub fn prepare_messages_storage_proof( lane: LaneId, message_nonces: RangeInclusive, outbound_lane_data: Option, diff --git a/bridges/modules/parachains/src/lib.rs b/bridges/modules/parachains/src/lib.rs index 5a393af7cc4..c2052e3d4eb 100644 --- a/bridges/modules/parachains/src/lib.rs +++ b/bridges/modules/parachains/src/lib.rs @@ -701,16 +701,17 @@ pub(crate) mod tests { use crate::mock::{ run_test, test_relay_header, BigParachainHeader, RegularParachainHasher, RegularParachainHeader, RuntimeEvent as TestEvent, RuntimeOrigin, TestRuntime, - PARAS_PALLET_NAME, UNTRACKED_PARACHAIN_ID, + UNTRACKED_PARACHAIN_ID, }; + use bp_test_utils::prepare_parachain_heads_proof; use codec::Encode; use bp_parachains::{ BestParaHeadHash, BridgeParachainCall, ImportedParaHeadsKeyProvider, ParasInfoKeyProvider, }; use bp_runtime::{ - record_all_trie_keys, BasicOperatingMode, OwnedBridgeModuleError, - StorageDoubleMapKeyProvider, StorageMapKeyProvider, + BasicOperatingMode, OwnedBridgeModuleError, StorageDoubleMapKeyProvider, + StorageMapKeyProvider, }; use bp_test_utils::{ authority_list, generate_owned_bridge_module_tests, make_default_justification, @@ -725,7 +726,6 @@ pub(crate) mod tests { use frame_system::{EventRecord, Pallet as System, Phase}; use sp_core::Hasher; use sp_runtime::{traits::Header as HeaderT, DispatchError}; - use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; type BridgesGrandpaPalletInstance = pallet_bridge_grandpa::Instance1; type WeightInfo = ::WeightInfo; @@ -768,32 +768,6 @@ pub(crate) mod tests { hash } - pub(crate) fn prepare_parachain_heads_proof( - heads: Vec<(u32, ParaHead)>, - ) -> (RelayBlockHash, ParaHeadsProof, Vec<(ParaId, ParaHash)>) { - let mut parachains = Vec::with_capacity(heads.len()); - let mut root = Default::default(); - let mut mdb = MemoryDB::default(); - { - let mut trie = TrieDBMutBuilderV1::::new(&mut mdb, &mut root).build(); - for (parachain, head) in heads { - let storage_key = - parachain_head_storage_key_at_source(PARAS_PALLET_NAME, ParaId(parachain)); - trie.insert(&storage_key.0, &head.encode()) - .map_err(|_| "TrieMut::insert has failed") - .expect("TrieMut::insert should not fail in tests"); - parachains.push((ParaId(parachain), head.hash())); - } - } - - // generate storage proof to be delivered to This chain - let storage_proof = record_all_trie_keys::, _>(&mdb, &root) - .map_err(|_| "record_all_trie_keys has failed") - .expect("record_all_trie_keys should not fail in benchmarks"); - - (root, ParaHeadsProof(storage_proof), parachains) - } - fn initial_best_head(parachain: u32) -> ParaInfo { ParaInfo { best_head_hash: BestParaHeadHash { @@ -875,7 +849,7 @@ pub(crate) mod tests { #[test] fn submit_parachain_heads_checks_operating_mode() { let (state_root, proof, parachains) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 0))]); + prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); run_test(|| { initialize(state_root); @@ -906,7 +880,10 @@ pub(crate) mod tests { #[test] fn imports_initial_parachain_heads() { let (state_root, proof, parachains) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 0)), (3, head_data(3, 10))]); + prepare_parachain_heads_proof::(vec![ + (1, head_data(1, 0)), + (3, head_data(3, 10)), + ]); run_test(|| { initialize(state_root); @@ -985,9 +962,9 @@ pub(crate) mod tests { #[test] fn imports_parachain_heads_is_able_to_progress() { let (state_root_5, proof_5, parachains_5) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 5))]); + prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); let (state_root_10, proof_10, parachains_10) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 10))]); + prepare_parachain_heads_proof::(vec![(1, head_data(1, 10))]); run_test(|| { // start with relay block #0 and import head#5 of parachain#1 initialize(state_root_5); @@ -1083,11 +1060,12 @@ pub(crate) mod tests { #[test] fn ignores_untracked_parachain() { - let (state_root, proof, parachains) = prepare_parachain_heads_proof(vec![ - (1, head_data(1, 5)), - (UNTRACKED_PARACHAIN_ID, head_data(1, 5)), - (2, head_data(1, 5)), - ]); + let (state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![ + (1, head_data(1, 5)), + (UNTRACKED_PARACHAIN_ID, head_data(1, 5)), + (2, head_data(1, 5)), + ]); run_test(|| { // start with relay block #0 and try to import head#5 of parachain#1 and untracked // parachain @@ -1160,7 +1138,7 @@ pub(crate) mod tests { #[test] fn does_nothing_when_already_imported_this_head_at_previous_relay_header() { let (state_root, proof, parachains) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 0))]); + prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); run_test(|| { // import head#0 of parachain#1 at relay block#0 initialize(state_root); @@ -1220,9 +1198,9 @@ pub(crate) mod tests { #[test] fn does_nothing_when_already_imported_head_at_better_relay_header() { let (state_root_5, proof_5, parachains_5) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 5))]); + prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); let (state_root_10, proof_10, parachains_10) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 10))]); + prepare_parachain_heads_proof::(vec![(1, head_data(1, 10))]); run_test(|| { // start with relay block #0 initialize(state_root_5); @@ -1314,7 +1292,10 @@ pub(crate) mod tests { #[test] fn does_nothing_when_parachain_head_is_too_large() { let (state_root, proof, parachains) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 5)), (4, big_head_data(1, 5))]); + prepare_parachain_heads_proof::(vec![ + (1, head_data(1, 5)), + (4, big_head_data(1, 5)), + ]); run_test(|| { // start with relay block #0 and try to import head#5 of parachain#1 and big parachain initialize(state_root); @@ -1368,8 +1349,9 @@ pub(crate) mod tests { // import exactly `HeadsToKeep` headers for i in 0..heads_to_keep { - let (state_root, proof, parachains) = - prepare_parachain_heads_proof(vec![(1, head_data(1, i))]); + let (state_root, proof, parachains) = prepare_parachain_heads_proof::< + RegularParachainHeader, + >(vec![(1, head_data(1, i))]); if i == 0 { initialize(state_root); } else { @@ -1389,8 +1371,9 @@ pub(crate) mod tests { } // import next relay chain header and next parachain head - let (state_root, proof, parachains) = - prepare_parachain_heads_proof(vec![(1, head_data(1, heads_to_keep))]); + let (state_root, proof, parachains) = prepare_parachain_heads_proof::< + RegularParachainHeader, + >(vec![(1, head_data(1, heads_to_keep))]); proceed(heads_to_keep, state_root); let expected_weight = weight_of_import_parachain_1_head(&proof, true); let result = import_parachain_1_head(heads_to_keep, state_root, parachains, proof); @@ -1411,7 +1394,7 @@ pub(crate) mod tests { #[test] fn fails_on_unknown_relay_chain_block() { let (state_root, proof, parachains) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 5))]); + prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); run_test(|| { // start with relay block #0 initialize(state_root); @@ -1427,7 +1410,7 @@ pub(crate) mod tests { #[test] fn fails_on_invalid_storage_proof() { let (_state_root, proof, parachains) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 5))]); + prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); run_test(|| { // start with relay block #0 initialize(Default::default()); @@ -1445,11 +1428,11 @@ pub(crate) mod tests { #[test] fn is_not_rewriting_existing_head_if_failed_to_read_updated_head() { let (state_root_5, proof_5, parachains_5) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 5))]); + prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); let (state_root_10_at_20, proof_10_at_20, parachains_10_at_20) = - prepare_parachain_heads_proof(vec![(2, head_data(2, 10))]); + prepare_parachain_heads_proof::(vec![(2, head_data(2, 10))]); let (state_root_10_at_30, proof_10_at_30, parachains_10_at_30) = - prepare_parachain_heads_proof(vec![(1, head_data(1, 10))]); + prepare_parachain_heads_proof::(vec![(1, head_data(1, 10))]); run_test(|| { // we've already imported head#5 of parachain#1 at relay block#10 initialize(state_root_5); @@ -1517,7 +1500,8 @@ pub(crate) mod tests { #[test] fn ignores_parachain_head_if_it_is_missing_from_storage_proof() { - let (state_root, proof, _) = prepare_parachain_heads_proof(vec![]); + let (state_root, proof, _) = + prepare_parachain_heads_proof::(vec![]); let parachains = vec![(ParaId(2), Default::default())]; run_test(|| { initialize(state_root); @@ -1542,7 +1526,8 @@ pub(crate) mod tests { #[test] fn ignores_parachain_head_if_parachain_head_hash_is_wrong() { - let (state_root, proof, _) = prepare_parachain_heads_proof(vec![(1, head_data(1, 0))]); + let (state_root, proof, _) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); let parachains = vec![(ParaId(1), head_data(1, 10).hash())]; run_test(|| { initialize(state_root); @@ -1569,7 +1554,8 @@ pub(crate) mod tests { #[test] fn test_bridge_parachain_call_is_correctly_defined() { - let (state_root, proof, _) = prepare_parachain_heads_proof(vec![(1, head_data(1, 0))]); + let (state_root, proof, _) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); let parachains = vec![(ParaId(2), Default::default())]; let relay_header_id = (0, test_relay_header(0, state_root).hash()); diff --git a/bridges/primitives/test-utils/Cargo.toml b/bridges/primitives/test-utils/Cargo.toml index 5ed835857d1..2e2af99332e 100644 --- a/bridges/primitives/test-utils/Cargo.toml +++ b/bridges/primitives/test-utils/Cargo.toml @@ -7,23 +7,30 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] bp-header-chain = { path = "../header-chain", default-features = false } +bp-parachains = { path = "../parachains", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } ed25519-dalek = { version = "1.0", default-features = false, features = ["u64_backend"] } finality-grandpa = { version = "0.16.2", default-features = false } sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } [features] default = ["std"] std = [ "bp-header-chain/std", + "bp-polkadot-core/std", "codec/std", "ed25519-dalek/std", "finality-grandpa/std", "sp-application-crypto/std", "sp-consensus-grandpa/std", + "sp-core/std", "sp-runtime/std", "sp-std/std", ] diff --git a/bridges/primitives/test-utils/src/lib.rs b/bridges/primitives/test-utils/src/lib.rs index 6bb4adbf450..5a7d0cca279 100644 --- a/bridges/primitives/test-utils/src/lib.rs +++ b/bridges/primitives/test-utils/src/lib.rs @@ -19,10 +19,14 @@ #![cfg_attr(not(feature = "std"), no_std)] use bp_header_chain::justification::{required_justification_precommits, GrandpaJustification}; +use bp_parachains::parachain_head_storage_key_at_source; +use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; +use bp_runtime::record_all_trie_keys; use codec::Encode; use sp_consensus_grandpa::{AuthorityId, AuthoritySignature, AuthorityWeight, SetId}; use sp_runtime::traits::{Header as HeaderT, One, Zero}; use sp_std::prelude::*; +use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; // Re-export all our test account utilities pub use keyring::*; @@ -31,6 +35,7 @@ mod keyring; pub const TEST_GRANDPA_ROUND: u64 = 1; pub const TEST_GRANDPA_SET_ID: SetId = 1; +pub const PARAS_PALLET_NAME: &str = "Paras"; /// Configuration parameters when generating test GRANDPA justifications. #[derive(Clone)] @@ -161,6 +166,33 @@ fn generate_chain(fork_id: u32, depth: u32, ancestor: &H) -> Vec headers } +/// Make valid proof for parachain `heads` +pub fn prepare_parachain_heads_proof( + heads: Vec<(u32, ParaHead)>, +) -> (H::Hash, ParaHeadsProof, Vec<(ParaId, ParaHash)>) { + let mut parachains = Vec::with_capacity(heads.len()); + let mut root = Default::default(); + let mut mdb = MemoryDB::default(); + { + let mut trie = TrieDBMutBuilderV1::::new(&mut mdb, &mut root).build(); + for (parachain, head) in heads { + let storage_key = + parachain_head_storage_key_at_source(PARAS_PALLET_NAME, ParaId(parachain)); + trie.insert(&storage_key.0, &head.encode()) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in tests"); + parachains.push((ParaId(parachain), head.hash())); + } + } + + // generate storage proof to be delivered to This chain + let storage_proof = record_all_trie_keys::, _>(&mdb, &root) + .map_err(|_| "record_all_trie_keys has failed") + .expect("record_all_trie_keys should not fail in benchmarks"); + + (root, ParaHeadsProof(storage_proof), parachains) +} + /// Create signed precommit with given target. pub fn signed_precommit( signer: &Account, @@ -207,6 +239,15 @@ pub fn test_header(number: H::Number) -> H { header } +/// Get a header for testing with given `state_root`. +/// +/// The correct parent hash will be used if given a non-zero header. +pub fn test_header_with_root(number: H::Number, state_root: H::Hash) -> H { + let mut header: H = test_header(number); + header.set_state_root(state_root); + header +} + /// Convenience function for generating a Header ID at a given block number. pub fn header_id(index: u8) -> (H::Hash, H::Number) { (test_header::(index.into()).hash(), index.into()) diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index 57cd502857c..c25d09837b6 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -1,4 +1,4 @@ -use asset_test_utils::{ExtBuilder, RuntimeHelper}; +use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper}; use codec::{Decode, Encode}; use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ @@ -26,6 +26,14 @@ const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; type AssetIdForTrustBackedAssetsConvert = assets_common::AssetIdForTrustBackedAssetsConvert; +fn collator_session_keys() -> CollatorSessionKeys { + CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + ) +} + #[test] fn test_asset_xcm_trader() { ExtBuilder::::default() @@ -472,11 +480,7 @@ asset_test_utils::include_teleports_for_native_asset_works!( CheckingAccount, WeightToFee, ParachainSystem, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), Box::new(|runtime_event_encoded: Vec| { match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { @@ -501,11 +505,7 @@ asset_test_utils::include_teleports_for_foreign_assets_works!( ParachainSystem, ForeignCreatorsSovereignAccountOf, ForeignAssetsInstance, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), Box::new(|runtime_event_encoded: Vec| { match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { @@ -524,11 +524,7 @@ asset_test_utils::include_teleports_for_foreign_assets_works!( asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( Runtime, XcmConfig, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), Box::new(|| { assert!(Assets::asset_ids().collect::>().is_empty()); @@ -547,11 +543,7 @@ asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_ TrustBackedAssetsInstance, AssetIdForTrustBackedAssets, AssetIdForTrustBackedAssetsConvert, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), 12345, Box::new(|| { @@ -569,11 +561,7 @@ asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_ ForeignAssetsInstance, MultiLocation, JustTry, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) }, Box::new(|| { @@ -592,11 +580,7 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p ForeignAssetsInstance, MultiLocation, JustTry, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), AssetDeposit::get(), MetadataDepositBase::get(), diff --git a/parachains/runtimes/assets/statemint/tests/tests.rs b/parachains/runtimes/assets/statemint/tests/tests.rs index 87242682b15..82491fa27f5 100644 --- a/parachains/runtimes/assets/statemint/tests/tests.rs +++ b/parachains/runtimes/assets/statemint/tests/tests.rs @@ -1,4 +1,4 @@ -use asset_test_utils::{ExtBuilder, RuntimeHelper}; +use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper}; use codec::Decode; use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ @@ -26,6 +26,14 @@ const ALICE: [u8; 32] = [1u8; 32]; type AssetIdForTrustBackedAssetsConvert = assets_common::AssetIdForTrustBackedAssetsConvert; +fn collator_session_keys() -> CollatorSessionKeys { + CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }, + ) +} + #[test] fn test_asset_xcm_trader() { ExtBuilder::::default() @@ -450,11 +458,7 @@ asset_test_utils::include_teleports_for_native_asset_works!( CheckingAccount, WeightToFee, ParachainSystem, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), Box::new(|runtime_event_encoded: Vec| { match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { @@ -474,11 +478,7 @@ asset_test_utils::include_teleports_for_native_asset_works!( asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( Runtime, XcmConfig, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), Box::new(|| { assert!(Assets::asset_ids().collect::>().is_empty()); @@ -495,11 +495,7 @@ asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_ TrustBackedAssetsInstance, AssetIdForTrustBackedAssets, AssetIdForTrustBackedAssetsConvert, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), 12345, Box::new(|| {}), diff --git a/parachains/runtimes/assets/test-utils/Cargo.toml b/parachains/runtimes/assets/test-utils/Cargo.toml index 8a1ce0e6e3c..d4e7922c576 100644 --- a/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/parachains/runtimes/assets/test-utils/Cargo.toml @@ -31,6 +31,7 @@ cumulus-primitives-core = { path = "../../../../primitives/core", default-featur cumulus-primitives-parachain-inherent = { path = "../../../../primitives/parachain-inherent", default-features = false } cumulus-test-relay-sproof-builder = { path = "../../../../test/relay-sproof-builder", default-features = false } parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } +parachains-runtimes-test-utils = { path = "../../test-utils", default-features = false } # Polkadot xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } @@ -61,6 +62,7 @@ std = [ "assets-common/std", "parachains-common/std", "parachain-info/std", + "parachains-runtimes-test-utils/std", "polkadot-parachain/std", "sp-consensus-aura/std", "sp-io/std", diff --git a/parachains/runtimes/assets/test-utils/src/lib.rs b/parachains/runtimes/assets/test-utils/src/lib.rs index 4a67e661322..9a24867592e 100644 --- a/parachains/runtimes/assets/test-utils/src/lib.rs +++ b/parachains/runtimes/assets/test-utils/src/lib.rs @@ -1,411 +1,20 @@ -use sp_std::marker::PhantomData; +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. -use cumulus_primitives_core::{AbridgedHrmpChannel, ParaId, PersistedValidationData}; -use cumulus_primitives_parachain_inherent::ParachainInherentData; -use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; -use frame_support::{ - dispatch::{DispatchResult, RawOrigin, UnfilteredDispatchable}, - inherent::{InherentData, ProvideInherent}, - traits::{GenesisBuild, OriginTrait}, - weights::Weight, -}; -use parachains_common::AccountId; -use polkadot_parachain::primitives::{HrmpChannelId, RelayChainBlockNumber}; -use sp_consensus_aura::AURA_ENGINE_ID; -use sp_core::Encode; -use sp_runtime::{Digest, DigestItem}; -use xcm::{ - latest::{MultiAsset, MultiLocation, XcmContext, XcmHash}, - prelude::*, -}; -use xcm_executor::{traits::TransactAsset, Assets}; +// Cumulus 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. -pub mod test_cases; -pub use test_cases::CollatorSessionKeys; - -pub type BalanceOf = ::Balance; -pub type AccountIdOf = ::AccountId; -pub type ValidatorIdOf = ::ValidatorId; -pub type SessionKeysOf = ::Keys; - -// Basic builder based on balances, collators and pallet_sessopm -pub struct ExtBuilder< - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config, -> { - // endowed accounts with balances - balances: Vec<(AccountIdOf, BalanceOf)>, - // collators to test block prod - collators: Vec>, - // keys added to pallet session - keys: Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)>, - // safe xcm version for pallet_xcm - safe_xcm_version: Option, - // para id - para_id: Option, - _runtime: PhantomData, -} - -impl< - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config, - > Default for ExtBuilder -{ - fn default() -> ExtBuilder { - ExtBuilder { - balances: vec![], - collators: vec![], - keys: vec![], - safe_xcm_version: None, - para_id: None, - _runtime: PhantomData, - } - } -} - -impl< - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config, - > ExtBuilder -{ - pub fn with_balances( - mut self, - balances: Vec<(AccountIdOf, BalanceOf)>, - ) -> Self { - self.balances = balances; - self - } - pub fn with_collators(mut self, collators: Vec>) -> Self { - self.collators = collators; - self - } - - pub fn with_session_keys( - mut self, - keys: Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)>, - ) -> Self { - self.keys = keys; - self - } - - pub fn with_tracing(self) -> Self { - frame_support::sp_tracing::try_init_simple(); - self - } - - pub fn with_safe_xcm_version(mut self, safe_xcm_version: XcmVersion) -> Self { - self.safe_xcm_version = Some(safe_xcm_version); - self - } - - pub fn with_para_id(mut self, para_id: ParaId) -> Self { - self.para_id = Some(para_id); - self - } - - pub fn build(self) -> sp_io::TestExternalities - where - Runtime: - pallet_collator_selection::Config + pallet_balances::Config + pallet_session::Config, - ValidatorIdOf: From>, - { - let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); - - >::assimilate_storage( - &pallet_xcm::GenesisConfig { safe_xcm_version: self.safe_xcm_version }, - &mut t, - ) - .unwrap(); - - if let Some(para_id) = self.para_id { - >::assimilate_storage( - ¶chain_info::GenesisConfig { parachain_id: para_id }, - &mut t, - ) - .unwrap(); - } - - pallet_balances::GenesisConfig:: { balances: self.balances } - .assimilate_storage(&mut t) - .unwrap(); - - pallet_collator_selection::GenesisConfig:: { - invulnerables: self.collators.clone(), - candidacy_bond: Default::default(), - desired_candidates: Default::default(), - } - .assimilate_storage(&mut t) - .unwrap(); - - pallet_session::GenesisConfig:: { keys: self.keys } - .assimilate_storage(&mut t) - .unwrap(); - - let mut ext = sp_io::TestExternalities::new(t); - - ext.execute_with(|| { - frame_system::Pallet::::set_block_number(1u32.into()); - }); +// Cumulus 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. - ext - } -} +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . -pub struct RuntimeHelper(PhantomData); -/// Utility function that advances the chain to the desired block number. -/// If an author is provided, that author information is injected to all the blocks in the meantime. -impl RuntimeHelper -where - AccountIdOf: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, -{ - pub fn run_to_block(n: u32, author: Option) { - while frame_system::Pallet::::block_number() < n.into() { - // Set the new block number and author - match author { - Some(ref author) => { - let pre_digest = Digest { - logs: vec![DigestItem::PreRuntime(AURA_ENGINE_ID, author.encode())], - }; - frame_system::Pallet::::reset_events(); - frame_system::Pallet::::initialize( - &(frame_system::Pallet::::block_number() + 1u32.into()), - &frame_system::Pallet::::parent_hash(), - &pre_digest, - ); - }, - None => { - frame_system::Pallet::::set_block_number( - frame_system::Pallet::::block_number() + 1u32.into(), - ); - }, - } - } - } +//! Module contains predefined test-case scenarios for `Runtime` with various assets. - pub fn root_origin() -> ::RuntimeOrigin { - ::RuntimeOrigin::root() - } - - pub fn origin_of( - account_id: AccountIdOf, - ) -> ::RuntimeOrigin { - ::RuntimeOrigin::signed(account_id.into()) - } -} - -impl RuntimeHelper { - pub fn do_transfer( - from: MultiLocation, - to: MultiLocation, - (asset, amount): (MultiLocation, u128), - ) -> Result { - ::transfer_asset( - &MultiAsset { id: Concrete(asset), fun: Fungible(amount) }, - &from, - &to, - // We aren't able to track the XCM that initiated the fee deposit, so we create a - // fake message hash here - &XcmContext::with_message_hash([0; 32]), - ) - } -} - -impl RuntimeHelper { - pub fn do_teleport_assets( - origin: ::RuntimeOrigin, - dest: MultiLocation, - beneficiary: MultiLocation, - (asset, amount): (MultiLocation, u128), - open_hrmp_channel: Option<(u32, u32)>, - ) -> DispatchResult - where - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - { - // open hrmp (if needed) - if let Some((source_para_id, target_para_id)) = open_hrmp_channel { - mock_open_hrmp_channel::( - source_para_id.into(), - target_para_id.into(), - ); - } - - // do teleport - >::teleport_assets( - origin, - Box::new(dest.into()), - Box::new(beneficiary.into()), - Box::new((Concrete(asset), amount).into()), - 0, - ) - } -} - -impl - RuntimeHelper -{ - pub fn execute_as_governance(call: Vec, require_weight_at_most: Weight) -> Outcome { - // prepare xcm as governance will do - let xcm = Xcm(vec![ - UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - Transact { - origin_kind: OriginKind::Superuser, - require_weight_at_most, - call: call.into(), - }, - ]); - - // execute xcm as parent origin - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - <::XcmExecutor>::execute_xcm( - MultiLocation::parent(), - xcm, - hash, - Self::xcm_max_weight(XcmReceivedFrom::Parent), - ) - } -} - -pub enum XcmReceivedFrom { - Parent, - Sibling, -} - -impl RuntimeHelper { - pub fn xcm_max_weight(from: XcmReceivedFrom) -> Weight { - use frame_support::traits::Get; - match from { - XcmReceivedFrom::Parent => ParachainSystem::ReservedDmpWeight::get(), - XcmReceivedFrom::Sibling => ParachainSystem::ReservedXcmpWeight::get(), - } - } -} - -impl RuntimeHelper { - pub fn assert_pallet_xcm_event_outcome( - unwrap_pallet_xcm_event: &Box) -> Option>>, - assert_outcome: fn(Outcome), - ) { - let outcome = >::events() - .into_iter() - .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())) - .find_map(|e| match e { - pallet_xcm::Event::Attempted(outcome) => Some(outcome), - _ => None, - }) - .expect("No `pallet_xcm::Event::Attempted(outcome)` event found!"); - - assert_outcome(outcome); - } -} - -impl RuntimeHelper { - pub fn xcmp_queue_message_sent( - unwrap_xcmp_queue_event: Box< - dyn Fn(Vec) -> Option>, - >, - ) -> Option { - >::events() - .into_iter() - .filter_map(|e| unwrap_xcmp_queue_event(e.event.encode())) - .find_map(|e| match e { - cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => message_hash, - _ => None, - }) - } -} - -pub fn assert_metadata( - asset_id: impl Into + Copy, - expected_name: &str, - expected_symbol: &str, - expected_decimals: u8, -) where - Fungibles: frame_support::traits::tokens::fungibles::metadata::Inspect - + frame_support::traits::tokens::fungibles::Inspect, -{ - assert_eq!(Fungibles::name(asset_id.into()), Vec::from(expected_name),); - assert_eq!(Fungibles::symbol(asset_id.into()), Vec::from(expected_symbol),); - assert_eq!(Fungibles::decimals(asset_id.into()), expected_decimals); -} - -pub fn assert_total( - asset_id: impl Into + Copy, - expected_total_issuance: impl Into, - expected_active_issuance: impl Into, -) where - Fungibles: frame_support::traits::tokens::fungibles::metadata::Inspect - + frame_support::traits::tokens::fungibles::Inspect, -{ - assert_eq!(Fungibles::total_issuance(asset_id.into()), expected_total_issuance.into()); - assert_eq!(Fungibles::active_issuance(asset_id.into()), expected_active_issuance.into()); -} - -/// Helper function which emulates opening HRMP channel which is needed for `XcmpQueue` to pass -pub fn mock_open_hrmp_channel< - C: cumulus_pallet_parachain_system::Config, - T: ProvideInherent>, ->( - sender: ParaId, - recipient: ParaId, -) { - let n = 1_u32; - let mut sproof_builder = RelayStateSproofBuilder { - para_id: sender, - hrmp_egress_channel_index: Some(vec![recipient]), - ..Default::default() - }; - sproof_builder.hrmp_channels.insert( - HrmpChannelId { sender, recipient }, - AbridgedHrmpChannel { - max_capacity: 10, - max_total_size: 10_000_000_u32, - max_message_size: 10_000_000_u32, - msg_count: 0, - total_size: 0_u32, - mqc_head: None, - }, - ); - - let (relay_parent_storage_root, relay_chain_state) = sproof_builder.into_state_root_and_proof(); - let vfp = PersistedValidationData { - relay_parent_number: n as RelayChainBlockNumber, - relay_parent_storage_root, - ..Default::default() - }; - // It is insufficient to push the validation function params - // to storage; they must also be included in the inherent data. - let inherent_data = { - let mut inherent_data = InherentData::default(); - let system_inherent_data = ParachainInherentData { - validation_data: vfp, - relay_chain_state, - downward_messages: Default::default(), - horizontal_messages: Default::default(), - }; - inherent_data - .put_data( - cumulus_primitives_parachain_inherent::INHERENT_IDENTIFIER, - &system_inherent_data, - ) - .expect("failed to put VFP inherent"); - inherent_data - }; - - // execute the block - T::create_inherent(&inherent_data) - .expect("got an inherent") - .dispatch_bypass_filter(RawOrigin::None.into()) - .expect("dispatch succeeded"); -} +pub mod test_cases; +pub use parachains_runtimes_test_utils::*; diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index a599db82713..366c1922cda 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -15,10 +15,6 @@ //! Module contains predefined test-case scenarios for `Runtime` with various assets. -use crate::{ - assert_metadata, assert_total, AccountIdOf, BalanceOf, ExtBuilder, RuntimeHelper, - SessionKeysOf, ValidatorIdOf, XcmReceivedFrom, -}; use codec::Encode; use frame_support::{ assert_noop, assert_ok, @@ -26,6 +22,10 @@ use frame_support::{ weights::Weight, }; use parachains_common::Balance; +use parachains_runtimes_test_utils::{ + assert_metadata, assert_total, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, + RuntimeHelper, ValidatorIdOf, XcmReceivedFrom, +}; use sp_runtime::{ traits::{StaticLookup, Zero}, DispatchError, Saturating, @@ -33,35 +33,6 @@ use sp_runtime::{ use xcm::latest::prelude::*; use xcm_executor::{traits::Convert, XcmExecutor}; -pub struct CollatorSessionKeys< - Runtime: frame_system::Config + pallet_balances::Config + pallet_session::Config, -> { - collator: AccountIdOf, - validator: ValidatorIdOf, - key: SessionKeysOf, -} - -impl - CollatorSessionKeys -{ - pub fn new( - collator: AccountIdOf, - validator: ValidatorIdOf, - key: SessionKeysOf, - ) -> Self { - Self { collator, validator, key } - } - pub fn collators(&self) -> Vec> { - vec![self.collator.clone()] - } - - pub fn session_keys( - &self, - ) -> Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)> { - vec![(self.collator.clone(), self.validator.clone(), self.key.clone())] - } -} - /// Test-case makes sure that `Runtime` can receive native asset from relay chain /// and can teleport it back and to the other parachains pub fn teleports_for_native_asset_works< diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index 740edc0c20b..e378e7b1e52 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -1,4 +1,4 @@ -use asset_test_utils::{ExtBuilder, RuntimeHelper, XcmReceivedFrom}; +use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper, XcmReceivedFrom}; use codec::{Decode, DecodeLimit, Encode}; use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ @@ -33,6 +33,14 @@ const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; type AssetIdForTrustBackedAssetsConvert = assets_common::AssetIdForTrustBackedAssetsConvert; +fn collator_session_keys() -> CollatorSessionKeys { + CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + ) +} + #[test] fn test_asset_xcm_trader() { ExtBuilder::::default() @@ -477,11 +485,7 @@ asset_test_utils::include_teleports_for_native_asset_works!( CheckingAccount, WeightToFee, ParachainSystem, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), Box::new(|runtime_event_encoded: Vec| { match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { @@ -506,11 +510,7 @@ asset_test_utils::include_teleports_for_foreign_assets_works!( ParachainSystem, ForeignCreatorsSovereignAccountOf, ForeignAssetsInstance, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), Box::new(|runtime_event_encoded: Vec| { match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { @@ -529,11 +529,7 @@ asset_test_utils::include_teleports_for_foreign_assets_works!( asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( Runtime, XcmConfig, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), Box::new(|| { assert!(Assets::asset_ids().collect::>().is_empty()); @@ -552,11 +548,7 @@ asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_ TrustBackedAssetsInstance, AssetIdForTrustBackedAssets, AssetIdForTrustBackedAssetsConvert, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), 12345, Box::new(|| { @@ -574,11 +566,7 @@ asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_ ForeignAssetsInstance, MultiLocation, JustTry, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) }, Box::new(|| { @@ -597,11 +585,7 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p ForeignAssetsInstance, MultiLocation, JustTry, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), AssetDeposit::get(), MetadataDepositBase::get(), diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 51c501dc4e8..9bb5e0d3d2e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -91,6 +91,7 @@ bridge-runtime-common = { path = "../../../../bridges/bin/runtime-common", defau static_assertions = "1.1" bridge-hub-test-utils = { path = "../test-utils"} bridge-runtime-common = { path = "../../../../bridges/bin/runtime-common", features = ["integrity-test"] } +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } [features] default = [ @@ -119,6 +120,7 @@ std = [ "cumulus-primitives-core/std", "cumulus-primitives-timestamp/std", "cumulus-primitives-utility/std", + "frame-benchmarking/std", "frame-executive/std", "frame-support/std", "frame-system-rpc-runtime-api/std", diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index d94aef2cb8e..e7b3630171d 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -122,9 +122,6 @@ pub type SignedExtra = ( pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; - /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index 64477b9ddc4..6a1ec2793f2 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -14,32 +14,94 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -pub use bridge_hub_rococo_runtime::{ - constants::fee::WeightToFee, - xcm_config::{RelayNetwork, XcmConfig, XcmRouter}, - Balances, BridgeGrandpaRococoInstance, BridgeGrandpaWococoInstance, BridgeWococoMessages, - DeliveryRewardInBalance, ExistentialDeposit, ParachainSystem, PolkadotXcm, - RequiredStakeForStakeAndSlash, Runtime, RuntimeCall, RuntimeEvent, SessionKeys, -}; -use codec::{Decode, Encode}; -use xcm::latest::prelude::*; +#![cfg(test)] +use bp_polkadot_core::Signature; use bridge_hub_rococo_runtime::{ - bridge_hub_rococo_config, bridge_hub_wococo_config, WithBridgeHubRococoMessagesInstance, - WithBridgeHubWococoMessagesInstance, + bridge_hub_rococo_config, bridge_hub_wococo_config, + constants::fee::WeightToFee, + xcm_config::{RelayNetwork, XcmConfig}, + BridgeRejectObsoleteHeadersAndMessages, DeliveryRewardInBalance, Executive, ExistentialDeposit, + ParachainSystem, PolkadotXcm, RequiredStakeForStakeAndSlash, Runtime, RuntimeCall, + RuntimeEvent, SessionKeys, SignedExtra, UncheckedExtrinsic, }; - +use codec::{Decode, Encode}; use frame_support::parameter_types; use parachains_common::{AccountId, AuraId, Balance}; +use sp_keyring::AccountKeyring::Alice; +use sp_runtime::{ + generic::{Era, SignedPayload}, + AccountId32, +}; +use xcm::latest::prelude::*; -const ALICE: [u8; 32] = [1u8; 32]; +// Para id of sibling chain (Rockmine/Wockmint) used in tests. +pub const SIBLING_PARACHAIN_ID: u32 = 1000; parameter_types! { pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } +fn construct_extrinsic( + sender: sp_keyring::AccountKeyring, + call: RuntimeCall, +) -> UncheckedExtrinsic { + let extra: SignedExtra = ( + frame_system::CheckNonZeroSender::::new(), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckEra::::from(Era::immortal()), + frame_system::CheckNonce::::from(0), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(0), + BridgeRejectObsoleteHeadersAndMessages {}, + ( + bridge_hub_wococo_config::BridgeRefundBridgeHubRococoMessages::default(), + bridge_hub_rococo_config::BridgeRefundBridgeHubWococoMessages::default(), + ), + ); + let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap(); + let signature = payload.using_encoded(|e| sender.sign(e)); + UncheckedExtrinsic::new_signed( + call, + AccountId32::from(sender.public()).into(), + Signature::Sr25519(signature.clone()), + extra, + ) +} + +fn construct_and_apply_extrinsic( + relayer_at_target: sp_keyring::AccountKeyring, + batch: pallet_utility::Call, +) -> sp_runtime::DispatchOutcome { + let batch_call = RuntimeCall::Utility(batch); + let xt = construct_extrinsic(relayer_at_target, batch_call); + let r = Executive::apply_extrinsic(xt); + r.unwrap() +} + +fn executive_init_block(header: &::Header) { + Executive::initialize_block(header) +} + +fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys { + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(Alice), + AccountId::from(Alice), + SessionKeys { aura: AuraId::from(Alice.public()) }, + ) +} + mod bridge_hub_rococo_tests { use super::*; + use bridge_hub_rococo_config::{ + WithBridgeHubWococoMessageBridge, DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO, + }; + use bridge_hub_rococo_runtime::{ + BridgeGrandpaWococoInstance, BridgeParachainWococoInstance, + WithBridgeHubWococoMessagesInstance, + }; bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( Runtime, @@ -47,11 +109,7 @@ mod bridge_hub_rococo_tests { CheckingAccount, WeightToFee, ParachainSystem, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), Box::new(|runtime_event_encoded: Vec| { match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { @@ -68,101 +126,157 @@ mod bridge_hub_rococo_tests { bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID ); - bridge_hub_test_utils::include_initialize_bridge_by_governance_works!( - Runtime, - BridgeGrandpaWococoInstance, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::BridgeWococoGrandpa(call).encode()) - ); + #[test] + fn initialize_bridge_by_governance_works() { + bridge_hub_test_utils::test_cases::initialize_bridge_by_governance_works::< + Runtime, + BridgeGrandpaWococoInstance, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::BridgeWococoGrandpa(call).encode()), + ) + } - bridge_hub_test_utils::include_change_storage_constant_by_governance_works!( - change_delivery_reward_by_governance_works, - Runtime, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::System(call).encode()), - (DeliveryRewardInBalance, u64), - || (DeliveryRewardInBalance::key().to_vec(), DeliveryRewardInBalance::get()), - |old_value| old_value.checked_mul(2).unwrap() - ); + #[test] + fn change_delivery_reward_by_governance_works() { + bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< + Runtime, + DeliveryRewardInBalance, + u64, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::System(call).encode()), + || (DeliveryRewardInBalance::key().to_vec(), DeliveryRewardInBalance::get()), + |old_value| old_value.checked_mul(2).unwrap(), + ) + } - bridge_hub_test_utils::include_change_storage_constant_by_governance_works!( - change_required_stake_by_governance_works, - Runtime, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::System(call).encode()), - (RequiredStakeForStakeAndSlash, Balance), - || (RequiredStakeForStakeAndSlash::key().to_vec(), RequiredStakeForStakeAndSlash::get()), - |old_value| old_value.checked_mul(2).unwrap() - ); + #[test] + fn change_required_stake_by_governance_works() { + bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< + Runtime, + RequiredStakeForStakeAndSlash, + Balance, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::System(call).encode()), + || { + ( + RequiredStakeForStakeAndSlash::key().to_vec(), + RequiredStakeForStakeAndSlash::get(), + ) + }, + |old_value| old_value.checked_mul(2).unwrap(), + ) + } - bridge_hub_test_utils::include_handle_export_message_from_system_parachain_to_outbound_queue_works!( - Runtime, - XcmConfig, - WithBridgeHubWococoMessagesInstance, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - 1000, - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeWococoMessages(event)) => Some(event), - _ => None, - } - }), - || ExportMessage { network: Wococo, destination: X1(Parachain(1234)), xcm: Xcm(vec![]) }, - bridge_hub_rococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO - ); + #[test] + fn handle_export_message_from_system_parachain_add_to_outbound_queue_works() { + bridge_hub_test_utils::test_cases::handle_export_message_from_system_parachain_to_outbound_queue_works::< + Runtime, + XcmConfig, + WithBridgeHubWococoMessagesInstance, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + SIBLING_PARACHAIN_ID, + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeWococoMessages(event)) => Some(event), + _ => None, + } + }), + || ExportMessage { network: Wococo, destination: X1(Parachain(1234)), xcm: Xcm(vec![]) }, + bridge_hub_rococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO + ) + } - bridge_hub_test_utils::include_message_dispatch_routing_works!( - Runtime, - XcmConfig, - ParachainSystem, - WithBridgeHubWococoMessagesInstance, - RelayNetwork, - bridge_hub_rococo_config::WococoGlobalConsensusNetwork, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - 1000, - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::ParachainSystem(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - bridge_hub_rococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO - ); + #[test] + fn message_dispatch_routing_works() { + bridge_hub_test_utils::test_cases::message_dispatch_routing_works::< + Runtime, + XcmConfig, + ParachainSystem, + WithBridgeHubWococoMessagesInstance, + RelayNetwork, + bridge_hub_rococo_config::WococoGlobalConsensusNetwork, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + SIBLING_PARACHAIN_ID, + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::ParachainSystem(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + bridge_hub_rococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO, + ) + } + + #[test] + fn relayed_incoming_message_works() { + bridge_hub_test_utils::test_cases::relayed_incoming_message_works::< + Runtime, + XcmConfig, + ParachainSystem, + BridgeGrandpaWococoInstance, + BridgeParachainWococoInstance, + WithBridgeHubWococoMessagesInstance, + WithBridgeHubWococoMessageBridge, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + SIBLING_PARACHAIN_ID, + Rococo, + DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO, + ) + } + + #[test] + pub fn complex_relay_extrinsic_works() { + bridge_hub_test_utils::test_cases::complex_relay_extrinsic_works::< + Runtime, + XcmConfig, + ParachainSystem, + BridgeGrandpaWococoInstance, + BridgeParachainWococoInstance, + WithBridgeHubWococoMessagesInstance, + WithBridgeHubWococoMessageBridge, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + SIBLING_PARACHAIN_ID, + bridge_hub_rococo_config::BridgeHubWococoChainId::get(), + Rococo, + DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO, + ExistentialDeposit::get(), + executive_init_block, + construct_and_apply_extrinsic, + ); + } } mod bridge_hub_wococo_tests { use super::*; + use bridge_hub_rococo_runtime::{ + BridgeGrandpaRococoInstance, BridgeParachainRococoInstance, + WithBridgeHubRococoMessagesInstance, + }; + use bridge_hub_wococo_config::{ + WithBridgeHubRococoMessageBridge, DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO, + }; bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( Runtime, @@ -170,11 +284,7 @@ mod bridge_hub_wococo_tests { CheckingAccount, WeightToFee, ParachainSystem, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), + collator_session_keys(), ExistentialDeposit::get(), Box::new(|runtime_event_encoded: Vec| { match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { @@ -191,95 +301,144 @@ mod bridge_hub_wococo_tests { bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID ); - bridge_hub_test_utils::include_initialize_bridge_by_governance_works!( - Runtime, - BridgeGrandpaRococoInstance, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::BridgeRococoGrandpa(call).encode()) - ); + #[test] + fn initialize_bridge_by_governance_works() { + bridge_hub_test_utils::test_cases::initialize_bridge_by_governance_works::< + Runtime, + BridgeGrandpaRococoInstance, + >( + collator_session_keys(), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::BridgeRococoGrandpa(call).encode()), + ) + } - bridge_hub_test_utils::include_change_storage_constant_by_governance_works!( - change_delivery_reward_by_governance_works, - Runtime, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::System(call).encode()), - (DeliveryRewardInBalance, u64), - || (DeliveryRewardInBalance::key().to_vec(), DeliveryRewardInBalance::get()), - |old_value| old_value.checked_mul(2).unwrap() - ); + #[test] + fn change_delivery_reward_by_governance_works() { + bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< + Runtime, + DeliveryRewardInBalance, + u64, + >( + collator_session_keys(), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::System(call).encode()), + || (DeliveryRewardInBalance::key().to_vec(), DeliveryRewardInBalance::get()), + |old_value| old_value.checked_mul(2).unwrap(), + ) + } - bridge_hub_test_utils::include_change_storage_constant_by_governance_works!( - change_required_stake_by_governance_works, - Runtime, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::System(call).encode()), - (RequiredStakeForStakeAndSlash, Balance), - || (RequiredStakeForStakeAndSlash::key().to_vec(), RequiredStakeForStakeAndSlash::get()), - |old_value| old_value.checked_mul(2).unwrap() - ); + #[test] + fn change_required_stake_by_governance_works() { + bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< + Runtime, + RequiredStakeForStakeAndSlash, + Balance, + >( + collator_session_keys(), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::System(call).encode()), + || { + ( + RequiredStakeForStakeAndSlash::key().to_vec(), + RequiredStakeForStakeAndSlash::get(), + ) + }, + |old_value| old_value.checked_mul(2).unwrap(), + ) + } - bridge_hub_test_utils::include_handle_export_message_from_system_parachain_to_outbound_queue_works!( - Runtime, - XcmConfig, - WithBridgeHubRococoMessagesInstance, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - 1000, - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeRococoMessages(event)) => Some(event), - _ => None, - } - }), - || ExportMessage { network: Rococo, destination: X1(Parachain(4321)), xcm: Xcm(vec![]) }, - bridge_hub_wococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO - ); + #[test] + fn handle_export_message_from_system_parachain_add_to_outbound_queue_works() { + bridge_hub_test_utils::test_cases::handle_export_message_from_system_parachain_to_outbound_queue_works::< + Runtime, + XcmConfig, + WithBridgeHubRococoMessagesInstance, + >( + collator_session_keys(), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + SIBLING_PARACHAIN_ID, + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeRococoMessages(event)) => Some(event), + _ => None, + } + }), + || ExportMessage { network: Rococo, destination: X1(Parachain(4321)), xcm: Xcm(vec![]) }, + bridge_hub_wococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO + ) + } - bridge_hub_test_utils::include_message_dispatch_routing_works!( - Runtime, - XcmConfig, - ParachainSystem, - WithBridgeHubRococoMessagesInstance, - RelayNetwork, - bridge_hub_wococo_config::RococoGlobalConsensusNetwork, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - 1000, - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::ParachainSystem(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - bridge_hub_wococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO - ); + #[test] + fn message_dispatch_routing_works() { + bridge_hub_test_utils::test_cases::message_dispatch_routing_works::< + Runtime, + XcmConfig, + ParachainSystem, + WithBridgeHubRococoMessagesInstance, + RelayNetwork, + bridge_hub_wococo_config::RococoGlobalConsensusNetwork, + >( + collator_session_keys(), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + SIBLING_PARACHAIN_ID, + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::ParachainSystem(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + bridge_hub_wococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO, + ) + } + + #[test] + fn relayed_incoming_message_works() { + bridge_hub_test_utils::test_cases::relayed_incoming_message_works::< + Runtime, + XcmConfig, + ParachainSystem, + BridgeGrandpaRococoInstance, + BridgeParachainRococoInstance, + WithBridgeHubRococoMessagesInstance, + WithBridgeHubRococoMessageBridge, + >( + collator_session_keys(), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + SIBLING_PARACHAIN_ID, + Wococo, + DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO, + ) + } + + #[test] + pub fn complex_relay_extrinsic_works() { + bridge_hub_test_utils::test_cases::complex_relay_extrinsic_works::< + Runtime, + XcmConfig, + ParachainSystem, + BridgeGrandpaRococoInstance, + BridgeParachainRococoInstance, + WithBridgeHubRococoMessagesInstance, + WithBridgeHubRococoMessageBridge, + >( + collator_session_keys(), + bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + SIBLING_PARACHAIN_ID, + bridge_hub_wococo_config::BridgeHubRococoChainId::get(), + Wococo, + DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO, + ExistentialDeposit::get(), + executive_init_block, + construct_and_apply_extrinsic, + ); + } } diff --git a/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml index 096c777901a..d9410a1abf0 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -10,20 +10,26 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = log = { version = "0.4.17", default-features = false } # Substrate +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } # Cumulus +asset-test-utils = { path = "../../assets/test-utils"} cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } +pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } -asset-test-utils = { path = "../../assets/test-utils"} +parachains-runtimes-test-utils = { path = "../../test-utils", default-features = false } # Polkadot pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } @@ -33,13 +39,19 @@ xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } # Bridges +bp-bridge-hub-rococo = { path = "../../../../bridges/primitives/chain-bridge-hub-rococo", default-features = false } +bp-bridge-hub-wococo = { path = "../../../../bridges/primitives/chain-bridge-hub-wococo", default-features = false } bp-header-chain = { path = "../../../../bridges/primitives/header-chain", default-features = false } bp-messages = { path = "../../../../bridges/primitives/messages", default-features = false } +bp-parachains = { path = "../../../../bridges/primitives/parachains", default-features = false } bp-polkadot-core = { path = "../../../../bridges/primitives/polkadot-core", default-features = false } +bp-relayers = { path = "../../../../bridges/primitives/relayers", default-features = false } bp-runtime = { path = "../../../../bridges/primitives/runtime", default-features = false } bp-test-utils = { path = "../../../../bridges/primitives/test-utils", default-features = false } pallet-bridge-grandpa = { path = "../../../../bridges/modules/grandpa", default-features = false } +pallet-bridge-parachains = { path = "../../../../bridges/modules/parachains", default-features = false } pallet-bridge-messages = { path = "../../../../bridges/modules/messages", default-features = false } +pallet-bridge-relayers = { path = "../../../../bridges/modules/relayers", default-features = false } bridge-runtime-common = { path = "../../../../bridges/bin/runtime-common", default-features = false } [features] @@ -47,20 +59,28 @@ default = [ "std" ] std = [ "codec/std", "log/std", + "frame-benchmarking/std", + "frame-executive/std", "frame-support/std", "frame-system/std", "bp-messages/std", + "bp-parachains/std", "bp-polkadot-core/std", "bp-header-chain/std", + "bp-relayers/std", "bp-runtime/std", "bp-test-utils/std", "bridge-runtime-common/std", "pallet-bridge-grandpa/std", + "pallet-bridge-parachains/std", "pallet-bridge-messages/std", + "pallet-bridge-relayers/std", "parachain-info/std", + "parachains-runtimes-test-utils/std", "cumulus-pallet-parachain-system/std", "cumulus-pallet-xcmp-queue/std", "pallet-xcm/std", + "sp-core/std", "sp-io/std", "sp-runtime/std", "xcm/std", @@ -70,4 +90,5 @@ std = [ "cumulus-pallet-dmp-queue/std", "pallet-session/std", "pallet-balances/std", + "pallet-utility/std", ] diff --git a/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs b/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs index b65b25c525d..289d3f5b4d3 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. +// Copyright Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -pub use bp_test_utils::test_header; +//! Module contains predefined test-case scenarios for "BridgeHub" `Runtime`s. + pub mod test_cases; -pub use test_cases::CollatorSessionKeys; +pub use bp_test_utils::test_header; +pub use parachains_runtimes_test_utils::*; diff --git a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs index bc428c2791c..7d26b266dc2 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs +++ b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs @@ -16,28 +16,41 @@ //! Module contains predefined test-case scenarios for `Runtime` with bridging capabilities. +use bp_messages::{ + target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch, SourceHeaderChain}, + LaneId, MessageKey, OutboundLaneData, Weight, +}; +use bp_parachains::{BestParaHeadHash, ParaInfo}; +use bp_polkadot_core::parachains::{ParaHash, ParaId}; +use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; +use bp_runtime::{HeaderOf, Parachain, StorageProofSize, UnderlyingChainOf}; +use bp_test_utils::{make_default_justification, prepare_parachain_heads_proof}; +use bridge_runtime_common::{ + messages::{ + target::FromBridgedChainMessagesProof, BridgedChain as MessageBridgedChain, MessageBridge, + }, + messages_generation::{encode_all_messages, encode_lane_data, prepare_messages_storage_proof}, + messages_xcm_extension::{XcmAsPlainPayload, XcmBlobMessageDispatchResult}, +}; use codec::Encode; -use frame_support::{assert_ok, traits::Get}; +use frame_support::{ + assert_ok, + traits::{Get, OriginTrait}, +}; +use pallet_bridge_grandpa::BridgedHeader; +use parachains_runtimes_test_utils::{ + mock_open_hrmp_channel, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, RuntimeHelper, + ValidatorIdOf, XcmReceivedFrom, +}; +use sp_core::H256; +use sp_keyring::AccountKeyring::*; +use sp_runtime::{traits::Header as HeaderT, AccountId32}; use xcm::latest::prelude::*; use xcm_builder::DispatchBlobError; use xcm_executor::XcmExecutor; -// Lets re-use this stuff from assets (later we plan to move it outside of assets as `runtimes/test-utils`) -use asset_test_utils::{ - mock_open_hrmp_channel, AccountIdOf, ExtBuilder, RuntimeHelper, ValidatorIdOf, -}; - -// Re-export test_cases from assets -pub use asset_test_utils::{ - include_teleports_for_native_asset_works, CollatorSessionKeys, XcmReceivedFrom, -}; -use bp_messages::{ - target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch}, - LaneId, MessageKey, OutboundLaneData, -}; -use bridge_runtime_common::messages_xcm_extension::{ - XcmAsPlainPayload, XcmBlobMessageDispatchResult, -}; +// Re-export test_case from assets +pub use asset_test_utils::include_teleports_for_native_asset_works; /// Test-case makes sure that `Runtime` can process bridging initialize via governance-like call pub fn initialize_bridge_by_governance_works( @@ -99,29 +112,6 @@ pub fn initialize_bridge_by_governance_works( }) } -#[macro_export] -macro_rules! include_initialize_bridge_by_governance_works( - ( - $runtime:path, - $pallet_bridge_grandpa_instance:path, - $collator_session_key:expr, - $runtime_para_id:expr, - $runtime_call_encode:expr - ) => { - #[test] - fn initialize_bridge_by_governance_works() { - $crate::test_cases::initialize_bridge_by_governance_works::< - $runtime, - $pallet_bridge_grandpa_instance, - >( - $collator_session_key, - $runtime_para_id, - $runtime_call_encode - ) - } - } -); - /// Test-case makes sure that `Runtime` can change storage constant via governance-like call pub fn change_storage_constant_by_governance_works( collator_session_key: CollatorSessionKeys, @@ -192,35 +182,6 @@ pub fn change_storage_constant_by_governance_works { - #[test] - fn $test_name() { - $crate::test_cases::change_storage_constant_by_governance_works::< - $runtime, - $storage_constant, - $storage_constant_type, - >( - $collator_session_key, - $runtime_para_id, - $runtime_call_encode, - $storage_constant_key_value, - $new_storage_constant_value, - ) - } - } -); - /// Test-case makes sure that `Runtime` can handle xcm `ExportMessage`: /// Checks if received XCM messages is correctly added to the message outbound queue for delivery. /// For SystemParachains we expect unpaid execution. @@ -307,37 +268,6 @@ pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< }) } -#[macro_export] -macro_rules! include_handle_export_message_from_system_parachain_to_outbound_queue_works( - ( - $runtime:path, - $xcm_config:path, - $pallet_bridge_messages_instance:path, - $collator_session_key:expr, - $runtime_para_id:expr, - $sibling_parachain_id:expr, - $unwrap_pallet_bridge_messages_event:expr, - $export_message_instruction:expr, - $expected_lane_id:expr - ) => { - #[test] - fn handle_export_message_from_system_parachain_add_to_outbound_queue_works() { - $crate::test_cases::handle_export_message_from_system_parachain_to_outbound_queue_works::< - $runtime, - $xcm_config, - $pallet_bridge_messages_instance - >( - $collator_session_key, - $runtime_para_id, - $sibling_parachain_id, - $unwrap_pallet_bridge_messages_event, - $export_message_instruction, - $expected_lane_id - ) - } - } -); - /// Test-case makes sure that Runtime can route XCM messages received in inbound queue, /// We just test here `MessageDispatch` configuration. /// We expect that runtime can route messages: @@ -392,123 +322,573 @@ pub fn message_dispatch_routing_works< .with_tracing() .build() .execute_with(|| { - // 1. this message is sent from other global consensus with destination of this Runtime relay chain (UMP) - let bridging_message = - test_data::simulate_message_exporter_on_bridged_chain::( - (RuntimeNetwork::get(), Here) - ); - let result = <>::MessageDispatch>::dispatch( - test_data::dispatch_message(expected_lane_id, 1, bridging_message) + // 1. this message is sent from other global consensus with destination of this Runtime relay chain (UMP) + let bridging_message = + test_data::simulate_message_exporter_on_bridged_chain::( + (RuntimeNetwork::get(), Here) ); - assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched)); - - // check events - UpwardMessageSent - let mut events = >::events() - .into_iter() - .filter_map(|e| unwrap_cumulus_pallet_parachain_system_event(e.event.encode())); - assert!( - events.any(|e| matches!(e, cumulus_pallet_parachain_system::Event::UpwardMessageSent { .. })) - ); - - // 2. this message is sent from other global consensus with destination of this Runtime sibling parachain (HRMP) - let bridging_message = - test_data::simulate_message_exporter_on_bridged_chain::( - (RuntimeNetwork::get(), X1(Parachain(sibling_parachain_id))), - ); + let result = <>::MessageDispatch>::dispatch( + test_data::dispatch_message(expected_lane_id, 1, bridging_message) + ); + assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched)); - // 2.1. WITHOUT opened hrmp channel -> RoutingError - let result = - <>::MessageDispatch>::dispatch( - DispatchMessage { - key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, - data: DispatchMessageData { payload: Ok(bridging_message.clone()) }, - } - ); - assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::NotDispatched(Some(DispatchBlobError::RoutingError)))); + // check events - UpwardMessageSent + let mut events = >::events() + .into_iter() + .filter_map(|e| unwrap_cumulus_pallet_parachain_system_event(e.event.encode())); + assert!( + events.any(|e| matches!(e, cumulus_pallet_parachain_system::Event::UpwardMessageSent { .. })) + ); - // check events - no XcmpMessageSent - assert_eq!(>::events() - .into_iter() - .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())) - .count(), 0); + // 2. this message is sent from other global consensus with destination of this Runtime sibling parachain (HRMP) + let bridging_message = + test_data::simulate_message_exporter_on_bridged_chain::( + (RuntimeNetwork::get(), X1(Parachain(sibling_parachain_id))), + ); - // 2.1. WITH hrmp channel -> Ok - mock_open_hrmp_channel::(runtime_para_id.into(), sibling_parachain_id.into()); - let result = <>::MessageDispatch>::dispatch( + // 2.1. WITHOUT opened hrmp channel -> RoutingError + let result = + <>::MessageDispatch>::dispatch( DispatchMessage { key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, - data: DispatchMessageData { payload: Ok(bridging_message) }, + data: DispatchMessageData { payload: Ok(bridging_message.clone()) }, } ); - assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched)); - - // check events - XcmpMessageSent - let mut events = >::events() - .into_iter() - .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())); - assert!( - events.any(|e| matches!(e, cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. })) + assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::NotDispatched(Some(DispatchBlobError::RoutingError)))); + + // check events - no XcmpMessageSent + assert_eq!(>::events() + .into_iter() + .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())) + .count(), 0); + + // 2.1. WITH hrmp channel -> Ok + mock_open_hrmp_channel::(runtime_para_id.into(), sibling_parachain_id.into()); + let result = <>::MessageDispatch>::dispatch( + DispatchMessage { + key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, + data: DispatchMessageData { payload: Ok(bridging_message) }, + } + ); + assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched)); + + // check events - XcmpMessageSent + let mut events = >::events() + .into_iter() + .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())); + assert!( + events.any(|e| matches!(e, cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. })) + ); + }) +} + +/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, +/// with proofs (finality, para heads, message) independently submitted. +pub fn relayed_incoming_message_works( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + bridged_para_id: u32, + sibling_parachain_id: u32, + local_relay_chain_id: NetworkId, + lane_id: LaneId, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_dmp_queue::Config + + cumulus_pallet_parachain_system::Config + + cumulus_pallet_xcmp_queue::Config + + pallet_bridge_grandpa::Config + + pallet_bridge_parachains::Config + + pallet_bridge_messages::Config, + GPI: 'static, + PPI: 'static, + MPI: 'static, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + UnderlyingChainOf>: bp_runtime::Chain + Parachain, + XcmConfig: xcm_executor::Config, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + ValidatorIdOf: From>, + <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: From>, + <>::BridgedChain as bp_runtime::Chain>::Hash: From, + ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + AccountIdOf: From, + >::InboundRelayer: From, +{ + assert_ne!(runtime_para_id, sibling_parachain_id); + assert_ne!(runtime_para_id, bridged_para_id); + + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_safe_xcm_version(XCM_VERSION) + .with_para_id(runtime_para_id.into()) + .with_tracing() + .build() + .execute_with(|| { + mock_open_hrmp_channel::( + runtime_para_id.into(), + sibling_parachain_id.into(), + ); + + // start with bridged chain block#0 + let init_data = test_data::initialization_data::(0); + pallet_bridge_grandpa::Pallet::::initialize( + RuntimeHelper::::root_origin(), + init_data, + ) + .unwrap(); + + // set up relayer details and proofs + + let message_destination = + X2(GlobalConsensus(local_relay_chain_id), Parachain(sibling_parachain_id)); + // some random numbers (checked by test) + let message_nonce = 1; + let para_header_number = 5; + let relay_header_number = 1; + + let relayer_at_target = Bob; + let relayer_id_on_target: AccountIdOf = relayer_at_target.public().into(); + let relayer_at_source = Dave; + let relayer_id_on_source: AccountId32 = relayer_at_source.public().into(); + + let xcm = vec![xcm::v3::Instruction::<()>::ClearOrigin; 42]; + let expected_dispatch = xcm::VersionedXcm::<()>::V3(xcm.clone().into()); + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let ( + relay_chain_header, + grandpa_justification, + bridged_para_head, + parachain_heads, + para_heads_proof, + message_proof, + ) = test_data::make_complex_relayer_proofs::, MB, ()>( + lane_id, + xcm.into(), + message_nonce, + message_destination, + para_header_number, + relay_header_number, + bridged_para_id, + ); + + // submit bridged relay chain finality proof + { + let result = pallet_bridge_grandpa::Pallet::::submit_finality_proof( + RuntimeHelper::::origin_of(relayer_id_on_target.clone()), + Box::new(relay_chain_header.clone()), + grandpa_justification, + ); + assert_ok!(result); + assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); + } + + // verify finality proof correctly imported + assert_eq!( + pallet_bridge_grandpa::BestFinalized::::get().unwrap().1, + relay_chain_header.hash() + ); + assert!(pallet_bridge_grandpa::ImportedHeaders::::contains_key( + relay_chain_header.hash() + )); + + // submit parachain heads proof + { + let result = + pallet_bridge_parachains::Pallet::::submit_parachain_heads( + RuntimeHelper::::origin_of(relayer_id_on_target.clone()), + (relay_header_number, relay_chain_header.hash().into()), + parachain_heads, + para_heads_proof, + ); + assert_ok!(result); + assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); + } + // verify parachain head proof correctly imported + assert_eq!( + pallet_bridge_parachains::ParasInfo::::get(ParaId(bridged_para_id)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: relay_header_number, + head_hash: bridged_para_head.hash() + }, + next_imported_hash_position: 1, + }) + ); + + // import message + assert!(RuntimeHelper::>::take_xcm( + sibling_parachain_id.into() + ) + .is_none()); + assert_eq!( + pallet_bridge_messages::InboundLanes::::get(lane_id) + .last_delivered_nonce(), + 0, + ); + // submit message proof + { + let result = pallet_bridge_messages::Pallet::::receive_messages_proof( + RuntimeHelper::::origin_of(relayer_id_on_target), + relayer_id_on_source.into(), + message_proof.into(), + 1, + Weight::MAX / 1000, ); + assert_ok!(result); + assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); + } + // verify message correctly imported and dispatched + assert_eq!( + pallet_bridge_messages::InboundLanes::::get(lane_id) + .last_delivered_nonce(), + 1, + ); + // verify relayed bridged XCM message is dispatched to destination sibling para + let dispatched = RuntimeHelper::>::take_xcm( + sibling_parachain_id.into(), + ) + .unwrap(); + assert_eq!(dispatched, expected_dispatch); }) } -#[macro_export] -macro_rules! include_message_dispatch_routing_works( - ( - $runtime:path, - $xcm_config:path, - $hrmp_channel_opener:path, - $pallet_bridge_messages_instance:path, - $runtime_network:path, - $bridged_network:path, - $collator_session_key:expr, - $runtime_para_id:expr, - $sibling_parachain_id:expr, - $unwrap_cumulus_pallet_parachain_system_event:expr, - $unwrap_cumulus_pallet_xcmp_queue_event:expr, - $expected_lane_id:expr - ) => { - #[test] - fn message_dispatch_routing_works() { - $crate::test_cases::message_dispatch_routing_works::< - $runtime, - $xcm_config, - $hrmp_channel_opener, - $pallet_bridge_messages_instance, - $runtime_network, - $bridged_network - >( - $collator_session_key, - $runtime_para_id, - $sibling_parachain_id, - $unwrap_cumulus_pallet_parachain_system_event, - $unwrap_cumulus_pallet_xcmp_queue_event, - $expected_lane_id, +/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, +/// with proofs (finality, para heads, message) batched together in signed extrinsic. +/// Also verifies relayer transaction signed extensions work as intended. +pub fn complex_relay_extrinsic_works( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + bridged_para_id: u32, + sibling_parachain_id: u32, + bridged_chain_id: bp_runtime::ChainId, + local_relay_chain_id: NetworkId, + lane_id: LaneId, + existential_deposit: BalanceOf, + executive_init_block: fn(&::Header), + construct_and_apply_extrinsic: fn( + sp_keyring::AccountKeyring, + pallet_utility::Call:: + ) -> sp_runtime::DispatchOutcome, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_utility::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_dmp_queue::Config + + cumulus_pallet_parachain_system::Config + + cumulus_pallet_xcmp_queue::Config + + pallet_bridge_grandpa::Config + + pallet_bridge_parachains::Config + + pallet_bridge_messages::Config + + pallet_bridge_relayers::Config, + GPI: 'static, + PPI: 'static, + MPI: 'static, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + UnderlyingChainOf>: bp_runtime::Chain + Parachain, + XcmConfig: xcm_executor::Config, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + ValidatorIdOf: From>, + <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: From>, + <>::BridgedChain as bp_runtime::Chain>::Hash: From, + ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + AccountIdOf: From, + >::InboundRelayer: From, + ::RuntimeCall: + From> + + From> + + From> +{ + assert_ne!(runtime_para_id, sibling_parachain_id); + assert_ne!(runtime_para_id, bridged_para_id); + + // Relayer account at local/this BH. + let relayer_at_target = Bob; + let relayer_id_on_target: AccountIdOf = relayer_at_target.public().into(); + let relayer_initial_balance = existential_deposit * 100000u32.into(); + // Relayer account at remote/bridged BH. + let relayer_at_source = Dave; + let relayer_id_on_source: AccountId32 = relayer_at_source.public().into(); + + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_safe_xcm_version(XCM_VERSION) + .with_para_id(runtime_para_id.into()) + .with_balances(vec![(relayer_id_on_target.clone(), relayer_initial_balance)]) + .with_tracing() + .build() + .execute_with(|| { + let zero: ::BlockNumber = 0u32.into(); + let genesis_hash = frame_system::Pallet::::block_hash(zero); + let mut header: ::Header = + bp_test_utils::test_header(1u32.into()); + header.set_parent_hash(genesis_hash); + executive_init_block(&header); + + mock_open_hrmp_channel::( + runtime_para_id.into(), + sibling_parachain_id.into(), + ); + + // start with bridged chain block#0 + let init_data = test_data::initialization_data::(0); + pallet_bridge_grandpa::Pallet::::initialize( + RuntimeHelper::::root_origin(), + init_data, ) - } - } -); + .unwrap(); + + // set up relayer details and proofs + + let message_destination = + X2(GlobalConsensus(local_relay_chain_id), Parachain(sibling_parachain_id)); + // some random numbers (checked by test) + let message_nonce = 1; + let para_header_number = 5; + let relay_header_number = 1; + + let xcm = vec![xcm::v3::Instruction::<()>::ClearOrigin; 42]; + let expected_dispatch = xcm::VersionedXcm::<()>::V3(xcm.clone().into()); + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let ( + relay_chain_header, + grandpa_justification, + bridged_para_head, + parachain_heads, + para_heads_proof, + message_proof, + ) = test_data::make_complex_relayer_proofs::, MB, ()>( + lane_id, + xcm.into(), + message_nonce, + message_destination, + para_header_number, + relay_header_number, + bridged_para_id, + ); -mod test_data { + let submit_grandpa = + pallet_bridge_grandpa::Call::::submit_finality_proof { + finality_target: Box::new(relay_chain_header.clone()), + justification: grandpa_justification, + }; + let submit_para_head = + pallet_bridge_parachains::Call::::submit_parachain_heads { + at_relay_block: (relay_header_number, relay_chain_header.hash().into()), + parachains: parachain_heads, + parachain_heads_proof: para_heads_proof, + }; + let submit_message = + pallet_bridge_messages::Call::::receive_messages_proof { + relayer_id_at_bridged_chain: relayer_id_on_source.into(), + proof: message_proof.into(), + messages_count: 1, + dispatch_weight: Weight::from_parts(1000000000, 0), + }; + let batch = pallet_utility::Call::::batch_all { + calls: vec![submit_grandpa.into(), submit_para_head.into(), submit_message.into()], + }; + + // sanity checks - before relayer extrinsic + assert!(RuntimeHelper::>::take_xcm( + sibling_parachain_id.into() + ) + .is_none()); + assert_eq!( + pallet_bridge_messages::InboundLanes::::get(lane_id) + .last_delivered_nonce(), + 0, + ); + let msg_proofs_rewards_account = RewardsAccountParams::new( + lane_id, + bridged_chain_id, + RewardsAccountOwner::ThisChain, + ); + assert_eq!( + pallet_bridge_relayers::RelayerRewards::::get( + relayer_id_on_target.clone(), + msg_proofs_rewards_account + ), + None, + ); + + // construct and apply extrinsic containing batch calls: + // bridged relay chain finality proof + // + parachain heads proof + // + submit message proof + let dispatch_outcome = construct_and_apply_extrinsic(relayer_at_target, batch); + + // verify finality proof correctly imported + assert_ok!(dispatch_outcome); + assert_eq!( + >::get().unwrap().1, + relay_chain_header.hash() + ); + assert!(>::contains_key( + relay_chain_header.hash() + )); + // verify parachain head proof correctly imported + assert_eq!( + pallet_bridge_parachains::ParasInfo::::get(ParaId(bridged_para_id)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: relay_header_number, + head_hash: bridged_para_head.hash() + }, + next_imported_hash_position: 1, + }) + ); + // verify message correctly imported and dispatched + assert_eq!( + pallet_bridge_messages::InboundLanes::::get(lane_id) + .last_delivered_nonce(), + 1, + ); + // verify relayer is refunded + assert!(pallet_bridge_relayers::RelayerRewards::::get( + relayer_id_on_target, + msg_proofs_rewards_account + ) + .is_some()); + // verify relayed bridged XCM message is dispatched to destination sibling para + let dispatched = RuntimeHelper::>::take_xcm( + sibling_parachain_id.into(), + ) + .unwrap(); + assert_eq!(dispatched, expected_dispatch); + }) +} + +pub mod test_data { use super::*; + use bp_header_chain::justification::GrandpaJustification; use bp_messages::MessageNonce; + use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; + use bp_runtime::BasicOperatingMode; + use bp_test_utils::authority_list; use xcm_builder::{HaulBlob, HaulBlobError, HaulBlobExporter}; use xcm_executor::traits::{validate_export, ExportXcm}; + pub fn prepare_inbound_xcm( + xcm_message: Xcm, + destination: InteriorMultiLocation, + ) -> Vec { + let location = xcm::VersionedInteriorMultiLocation::V3(destination); + let xcm = xcm::VersionedXcm::::V3(xcm_message); + // this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor + // or public fields, so just tuple + // (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed + // to the storage) + (location, xcm).encode().encode() + } + + pub fn make_complex_relayer_proofs( + lane_id: LaneId, + xcm_message: Xcm, + message_nonce: MessageNonce, + message_destination: Junctions, + para_header_number: u32, + relay_header_number: u32, + bridged_para_id: u32, + ) -> ( + BridgedRelayHeader, + GrandpaJustification, + ParaHead, + Vec<(ParaId, ParaHash)>, + ParaHeadsProof, + FromBridgedChainMessagesProof, + ) + where + BridgedRelayHeader: HeaderT, + ::Hash: From, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + UnderlyingChainOf>: bp_runtime::Chain + Parachain, + { + let message_payload = prepare_inbound_xcm(xcm_message, message_destination); + let message_size = StorageProofSize::Minimal(message_payload.len() as u32); + // prepare para storage proof containing message + let (para_state_root, para_storage_proof) = prepare_messages_storage_proof::( + lane_id, + message_nonce..=message_nonce, + None, + message_size, + message_payload, + encode_all_messages, + encode_lane_data, + ); + + let bridged_para_head = ParaHead( + bp_test_utils::test_header_with_root::>( + para_header_number.into(), + para_state_root.into(), + ) + .encode(), + ); + let (relay_state_root, para_heads_proof, parachain_heads) = + prepare_parachain_heads_proof::>(vec![( + bridged_para_id, + bridged_para_head.clone(), + )]); + assert_eq!(bridged_para_head.hash(), parachain_heads[0].1); + + let message_proof = FromBridgedChainMessagesProof { + bridged_header_hash: bridged_para_head.hash(), + storage_proof: para_storage_proof, + lane: lane_id, + nonces_start: message_nonce, + nonces_end: message_nonce, + }; + + // import bridged relay chain block#1 with state root containing head#5 of bridged parachain + let relay_chain_header: BridgedRelayHeader = bp_test_utils::test_header_with_root( + relay_header_number.into(), + relay_state_root.into(), + ); + let justification = make_default_justification(&relay_chain_header); + ( + relay_chain_header, + justification, + bridged_para_head, + parachain_heads, + para_heads_proof, + message_proof, + ) + } + /// Helper that creates InitializationData mock data, that can be used to initialize bridge GRANDPA pallet - pub(crate) fn initialization_data< + pub fn initialization_data< Runtime: pallet_bridge_grandpa::Config, GrandpaPalletInstance: 'static, >( block_number: u32, - ) -> bp_header_chain::InitializationData< - pallet_bridge_grandpa::BridgedHeader, - > { + ) -> bp_header_chain::InitializationData> { bp_header_chain::InitializationData { header: Box::new(bp_test_utils::test_header(block_number.into())), - authority_list: Default::default(), - set_id: 6, - operating_mode: bp_runtime::BasicOperatingMode::Normal, + authority_list: authority_list(), + set_id: 1, + operating_mode: BasicOperatingMode::Normal, } } diff --git a/parachains/runtimes/test-utils/Cargo.toml b/parachains/runtimes/test-utils/Cargo.toml new file mode 100644 index 00000000000..2b8ee2fb322 --- /dev/null +++ b/parachains/runtimes/test-utils/Cargo.toml @@ -0,0 +1,74 @@ +[package] +name = "parachains-runtimes-test-utils" +version = "1.0.0" +authors = ["Parity Technologies "] +edition = "2021" +description = "Utils for Runtimes testing" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } + +# Substrate +frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + +# Cumulus +cumulus-pallet-parachain-system = { path = "../../../pallets/parachain-system", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../../pallets/xcmp-queue", default-features = false } +cumulus-pallet-dmp-queue = { path = "../../../pallets/dmp-queue", default-features = false } +pallet-collator-selection = { path = "../../../pallets/collator-selection", default-features = false } +parachains-common = { path = "../../common", default-features = false } +assets-common = { path = "../assets/common", default-features = false } +cumulus-primitives-core = { path = "../../../primitives/core", default-features = false } +cumulus-primitives-parachain-inherent = { path = "../../../primitives/parachain-inherent", default-features = false } +cumulus-test-relay-sproof-builder = { path = "../../../test/relay-sproof-builder", default-features = false } +parachain-info = { path = "../../../parachains/pallets/parachain-info", default-features = false } + +# Polkadot +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } + +[dev-dependencies] +hex-literal = "0.3.4" + +[build-dependencies] +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[features] +default = [ "std" ] +std = [ + "cumulus-pallet-parachain-system/std", + "cumulus-primitives-core/std", + "cumulus-test-relay-sproof-builder/std", + "cumulus-primitives-parachain-inherent/std", + "frame-support/std", + "frame-system/std", + "pallet-assets/std", + "pallet-balances/std", + "cumulus-pallet-parachain-system/std", + "pallet-collator-selection/std", + "pallet-session/std", + "assets-common/std", + "parachains-common/std", + "parachain-info/std", + "polkadot-parachain/std", + "sp-consensus-aura/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "xcm/std", + "xcm-executor/std", + "pallet-xcm/std", + "cumulus-pallet-xcmp-queue/std", + "cumulus-pallet-dmp-queue/std", +] diff --git a/parachains/runtimes/test-utils/src/lib.rs b/parachains/runtimes/test-utils/src/lib.rs new file mode 100644 index 00000000000..7a59650db51 --- /dev/null +++ b/parachains/runtimes/test-utils/src/lib.rs @@ -0,0 +1,479 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use sp_std::marker::PhantomData; + +use codec::DecodeLimit; +use cumulus_primitives_core::{AbridgedHrmpChannel, ParaId, PersistedValidationData}; +use cumulus_primitives_parachain_inherent::ParachainInherentData; +use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; +use frame_support::{ + dispatch::{DispatchResult, RawOrigin, UnfilteredDispatchable}, + inherent::{InherentData, ProvideInherent}, + traits::{GenesisBuild, OriginTrait}, + weights::Weight, +}; +use parachains_common::AccountId; +use polkadot_parachain::primitives::{HrmpChannelId, RelayChainBlockNumber, XcmpMessageFormat}; +use sp_consensus_aura::AURA_ENGINE_ID; +use sp_core::Encode; +use sp_runtime::{Digest, DigestItem}; +use xcm::{ + latest::{MultiAsset, MultiLocation, XcmContext, XcmHash}, + prelude::*, + VersionedXcm, MAX_XCM_DECODE_DEPTH, +}; +use xcm_executor::{traits::TransactAsset, Assets}; + +pub type BalanceOf = ::Balance; +pub type AccountIdOf = ::AccountId; +pub type ValidatorIdOf = ::ValidatorId; +pub type SessionKeysOf = ::Keys; + +pub struct CollatorSessionKeys< + Runtime: frame_system::Config + pallet_balances::Config + pallet_session::Config, +> { + collator: AccountIdOf, + validator: ValidatorIdOf, + key: SessionKeysOf, +} + +impl + CollatorSessionKeys +{ + pub fn new( + collator: AccountIdOf, + validator: ValidatorIdOf, + key: SessionKeysOf, + ) -> Self { + Self { collator, validator, key } + } + pub fn collators(&self) -> Vec> { + vec![self.collator.clone()] + } + + pub fn session_keys( + &self, + ) -> Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)> { + vec![(self.collator.clone(), self.validator.clone(), self.key.clone())] + } +} + +// Basic builder based on balances, collators and pallet_sessopm +pub struct ExtBuilder< + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config, +> { + // endowed accounts with balances + balances: Vec<(AccountIdOf, BalanceOf)>, + // collators to test block prod + collators: Vec>, + // keys added to pallet session + keys: Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)>, + // safe xcm version for pallet_xcm + safe_xcm_version: Option, + // para id + para_id: Option, + _runtime: PhantomData, +} + +impl< + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config, + > Default for ExtBuilder +{ + fn default() -> ExtBuilder { + ExtBuilder { + balances: vec![], + collators: vec![], + keys: vec![], + safe_xcm_version: None, + para_id: None, + _runtime: PhantomData, + } + } +} + +impl< + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config, + > ExtBuilder +{ + pub fn with_balances( + mut self, + balances: Vec<(AccountIdOf, BalanceOf)>, + ) -> Self { + self.balances = balances; + self + } + pub fn with_collators(mut self, collators: Vec>) -> Self { + self.collators = collators; + self + } + + pub fn with_session_keys( + mut self, + keys: Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)>, + ) -> Self { + self.keys = keys; + self + } + + pub fn with_tracing(self) -> Self { + frame_support::sp_tracing::try_init_simple(); + self + } + + pub fn with_safe_xcm_version(mut self, safe_xcm_version: XcmVersion) -> Self { + self.safe_xcm_version = Some(safe_xcm_version); + self + } + + pub fn with_para_id(mut self, para_id: ParaId) -> Self { + self.para_id = Some(para_id); + self + } + + pub fn build(self) -> sp_io::TestExternalities + where + Runtime: + pallet_collator_selection::Config + pallet_balances::Config + pallet_session::Config, + ValidatorIdOf: From>, + { + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + + >::assimilate_storage( + &pallet_xcm::GenesisConfig { safe_xcm_version: self.safe_xcm_version }, + &mut t, + ) + .unwrap(); + + if let Some(para_id) = self.para_id { + >::assimilate_storage( + ¶chain_info::GenesisConfig { parachain_id: para_id }, + &mut t, + ) + .unwrap(); + } + + pallet_balances::GenesisConfig:: { balances: self.balances } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_collator_selection::GenesisConfig:: { + invulnerables: self.collators.clone(), + candidacy_bond: Default::default(), + desired_candidates: Default::default(), + } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_session::GenesisConfig:: { keys: self.keys } + .assimilate_storage(&mut t) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + + ext.execute_with(|| { + frame_system::Pallet::::set_block_number(1u32.into()); + }); + + ext + } +} + +pub struct RuntimeHelper(PhantomData); +/// Utility function that advances the chain to the desired block number. +/// If an author is provided, that author information is injected to all the blocks in the meantime. +impl RuntimeHelper +where + AccountIdOf: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, +{ + pub fn run_to_block(n: u32, author: Option) { + while frame_system::Pallet::::block_number() < n.into() { + // Set the new block number and author + match author { + Some(ref author) => { + let pre_digest = Digest { + logs: vec![DigestItem::PreRuntime(AURA_ENGINE_ID, author.encode())], + }; + frame_system::Pallet::::reset_events(); + frame_system::Pallet::::initialize( + &(frame_system::Pallet::::block_number() + 1u32.into()), + &frame_system::Pallet::::parent_hash(), + &pre_digest, + ); + }, + None => { + frame_system::Pallet::::set_block_number( + frame_system::Pallet::::block_number() + 1u32.into(), + ); + }, + } + } + } + + pub fn root_origin() -> ::RuntimeOrigin { + ::RuntimeOrigin::root() + } + + pub fn origin_of( + account_id: AccountIdOf, + ) -> ::RuntimeOrigin { + ::RuntimeOrigin::signed(account_id.into()) + } +} + +impl RuntimeHelper { + pub fn do_transfer( + from: MultiLocation, + to: MultiLocation, + (asset, amount): (MultiLocation, u128), + ) -> Result { + ::transfer_asset( + &MultiAsset { id: Concrete(asset), fun: Fungible(amount) }, + &from, + &to, + // We aren't able to track the XCM that initiated the fee deposit, so we create a + // fake message hash here + &XcmContext::with_message_hash([0; 32]), + ) + } +} + +impl RuntimeHelper { + pub fn do_teleport_assets( + origin: ::RuntimeOrigin, + dest: MultiLocation, + beneficiary: MultiLocation, + (asset, amount): (MultiLocation, u128), + open_hrmp_channel: Option<(u32, u32)>, + ) -> DispatchResult + where + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + { + // open hrmp (if needed) + if let Some((source_para_id, target_para_id)) = open_hrmp_channel { + mock_open_hrmp_channel::( + source_para_id.into(), + target_para_id.into(), + ); + } + + // do teleport + >::teleport_assets( + origin, + Box::new(dest.into()), + Box::new(beneficiary.into()), + Box::new((Concrete(asset), amount).into()), + 0, + ) + } +} + +impl + RuntimeHelper +{ + pub fn execute_as_governance(call: Vec, require_weight_at_most: Weight) -> Outcome { + // prepare xcm as governance will do + let xcm = Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + Transact { + origin_kind: OriginKind::Superuser, + require_weight_at_most, + call: call.into(), + }, + ]); + + // execute xcm as parent origin + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + <::XcmExecutor>::execute_xcm( + MultiLocation::parent(), + xcm, + hash, + Self::xcm_max_weight(XcmReceivedFrom::Parent), + ) + } +} + +pub enum XcmReceivedFrom { + Parent, + Sibling, +} + +impl RuntimeHelper { + pub fn xcm_max_weight(from: XcmReceivedFrom) -> Weight { + use frame_support::traits::Get; + match from { + XcmReceivedFrom::Parent => ParachainSystem::ReservedDmpWeight::get(), + XcmReceivedFrom::Sibling => ParachainSystem::ReservedXcmpWeight::get(), + } + } +} + +impl RuntimeHelper { + pub fn assert_pallet_xcm_event_outcome( + unwrap_pallet_xcm_event: &Box) -> Option>>, + assert_outcome: fn(Outcome), + ) { + let outcome = >::events() + .into_iter() + .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())) + .find_map(|e| match e { + pallet_xcm::Event::Attempted(outcome) => Some(outcome), + _ => None, + }) + .expect("No `pallet_xcm::Event::Attempted(outcome)` event found!"); + + assert_outcome(outcome); + } +} + +impl RuntimeHelper { + pub fn xcmp_queue_message_sent( + unwrap_xcmp_queue_event: Box< + dyn Fn(Vec) -> Option>, + >, + ) -> Option { + >::events() + .into_iter() + .filter_map(|e| unwrap_xcmp_queue_event(e.event.encode())) + .find_map(|e| match e { + cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => message_hash, + _ => None, + }) + } +} + +pub fn assert_metadata( + asset_id: impl Into + Copy, + expected_name: &str, + expected_symbol: &str, + expected_decimals: u8, +) where + Fungibles: frame_support::traits::tokens::fungibles::metadata::Inspect + + frame_support::traits::tokens::fungibles::Inspect, +{ + assert_eq!(Fungibles::name(asset_id.into()), Vec::from(expected_name),); + assert_eq!(Fungibles::symbol(asset_id.into()), Vec::from(expected_symbol),); + assert_eq!(Fungibles::decimals(asset_id.into()), expected_decimals); +} + +pub fn assert_total( + asset_id: impl Into + Copy, + expected_total_issuance: impl Into, + expected_active_issuance: impl Into, +) where + Fungibles: frame_support::traits::tokens::fungibles::metadata::Inspect + + frame_support::traits::tokens::fungibles::Inspect, +{ + assert_eq!(Fungibles::total_issuance(asset_id.into()), expected_total_issuance.into()); + assert_eq!(Fungibles::active_issuance(asset_id.into()), expected_active_issuance.into()); +} + +/// Helper function which emulates opening HRMP channel which is needed for `XcmpQueue` to pass +pub fn mock_open_hrmp_channel< + C: cumulus_pallet_parachain_system::Config, + T: ProvideInherent>, +>( + sender: ParaId, + recipient: ParaId, +) { + let n = 1_u32; + let mut sproof_builder = RelayStateSproofBuilder { + para_id: sender, + hrmp_egress_channel_index: Some(vec![recipient]), + ..Default::default() + }; + sproof_builder.hrmp_channels.insert( + HrmpChannelId { sender, recipient }, + AbridgedHrmpChannel { + max_capacity: 10, + max_total_size: 10_000_000_u32, + max_message_size: 10_000_000_u32, + msg_count: 0, + total_size: 0_u32, + mqc_head: None, + }, + ); + + let (relay_parent_storage_root, relay_chain_state) = sproof_builder.into_state_root_and_proof(); + let vfp = PersistedValidationData { + relay_parent_number: n as RelayChainBlockNumber, + relay_parent_storage_root, + ..Default::default() + }; + // It is insufficient to push the validation function params + // to storage; they must also be included in the inherent data. + let inherent_data = { + let mut inherent_data = InherentData::default(); + let system_inherent_data = ParachainInherentData { + validation_data: vfp, + relay_chain_state, + downward_messages: Default::default(), + horizontal_messages: Default::default(), + }; + inherent_data + .put_data( + cumulus_primitives_parachain_inherent::INHERENT_IDENTIFIER, + &system_inherent_data, + ) + .expect("failed to put VFP inherent"); + inherent_data + }; + + // execute the block + T::create_inherent(&inherent_data) + .expect("got an inherent") + .dispatch_bypass_filter(RawOrigin::None.into()) + .expect("dispatch succeeded"); +} + +impl + RuntimeHelper +{ + pub fn take_xcm(sent_to_para_id: ParaId) -> Option> { + match HrmpChannelSource::take_outbound_messages(10)[..] { + [(para_id, ref mut xcm_message_data)] if para_id.eq(&sent_to_para_id.into()) => { + let mut xcm_message_data = &xcm_message_data[..]; + // decode + let _ = XcmpMessageFormat::decode_with_depth_limit( + MAX_XCM_DECODE_DEPTH, + &mut xcm_message_data, + ) + .expect("valid format"); + VersionedXcm::<()>::decode_with_depth_limit( + MAX_XCM_DECODE_DEPTH, + &mut xcm_message_data, + ) + .map(|x| Some(x)) + .expect("result with xcm") + }, + _ => return None, + } + } +} From 6aaf894c7cb1bc6f7fb2f51cc966109bba909552 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 May 2023 21:42:11 +0000 Subject: [PATCH 200/339] Bump toml from 0.7.3 to 0.7.4 (#2598) Bumps [toml](https://github.com/toml-rs/toml) from 0.7.3 to 0.7.4. - [Commits](https://github.com/toml-rs/toml/compare/toml-v0.7.3...toml-v0.7.4) --- updated-dependencies: - dependency-name: toml dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 24 +++++++++---------- .../Cargo.toml | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e7e81aa65a8..10a57137285 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2822,7 +2822,7 @@ name = "cumulus-test-relay-validation-worker-provider" version = "0.1.0" dependencies = [ "polkadot-node-core-pvf-worker", - "toml 0.7.3", + "toml 0.7.4", ] [[package]] @@ -12420,9 +12420,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +checksum = "93107647184f6027e3b7dcb2e11034cf95ffa1e3a682c67951963ac69c1c007d" dependencies = [ "serde", ] @@ -13852,7 +13852,7 @@ dependencies = [ "sp-maybe-compressed-blob", "strum", "tempfile", - "toml 0.7.3", + "toml 0.7.4", "walkdir", "wasm-opt", ] @@ -14236,9 +14236,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" +checksum = "d6135d499e69981f9ff0ef2167955a5333c35e36f6937d382974566b3d5b94ec" dependencies = [ "serde", "serde_spanned", @@ -14248,18 +14248,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.7" +version = "0.19.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc18466501acd8ac6a3f615dd29a3438f8ca6bb3b19537138b3106e575621274" +checksum = "92d964908cec0d030b812013af25a0e57fddfadb1e066ecc6681d86253129d4f" dependencies = [ "indexmap", "serde", @@ -15937,9 +15937,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.3.6" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d020b441f92996c80d94ae9166e8501e59c7bb56121189dc9eab3bd8216966" +checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" dependencies = [ "memchr", ] diff --git a/test/relay-validation-worker-provider/Cargo.toml b/test/relay-validation-worker-provider/Cargo.toml index e8cc1f16b9f..6728541ffc9 100644 --- a/test/relay-validation-worker-provider/Cargo.toml +++ b/test/relay-validation-worker-provider/Cargo.toml @@ -11,4 +11,4 @@ build = "build.rs" polkadot-node-core-pvf-worker = { git = "https://github.com/paritytech/polkadot", branch = "master" } [build-dependencies] -toml = "0.7.3" +toml = "0.7.4" From e2a3cf2ec276273c6a8ff81659e8ad6537557283 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 19 May 2023 16:11:27 +0200 Subject: [PATCH 201/339] Bump bridges (#2602) * Squashed 'bridges/' changes from 0f6091d481..c9dd8b9dfc c9dd8b9dfc expose test utilities to be used in BH paras (#2142) 334df22361 Ws-port argument has been repalced with rpc-port (#2140) 106173cb91 fix nodes startup (#2138) git-subtree-dir: bridges git-subtree-split: c9dd8b9dfc8b48014d119153032589ac39c18c9a * tmp --- bridges/Cargo.lock | 15696 ++++++++++++++++ bridges/README.md | 2 +- .../src/messages_benchmarking.rs | 12 +- .../src/parachains_benchmarking.rs | 2 +- bridges/modules/messages/src/benchmarking.rs | 12 +- bridges/modules/messages/src/mock.rs | 2 +- bridges/modules/parachains/src/mock.rs | 7 +- bridges/modules/relayers/src/benchmarking.rs | 6 +- 8 files changed, 15722 insertions(+), 17 deletions(-) create mode 100644 bridges/Cargo.lock diff --git a/bridges/Cargo.lock b/bridges/Cargo.lock new file mode 100644 index 00000000000..a4dc5e19a82 --- /dev/null +++ b/bridges/Cargo.lock @@ -0,0 +1,15696 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli 0.26.2", +] + +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli 0.27.2", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", +] + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array 0.14.7", +] + +[[package]] +name = "aes" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" +dependencies = [ + "aes-soft", + "aesni", + "cipher 0.2.5", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if 1.0.0", + "cipher 0.3.0", + "cpufeatures", + "opaque-debug 0.3.0", +] + +[[package]] +name = "aes" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +dependencies = [ + "cfg-if 1.0.0", + "cipher 0.4.4", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" +dependencies = [ + "aead 0.4.3", + "aes 0.7.5", + "cipher 0.3.0", + "ctr 0.8.0", + "ghash 0.4.4", + "subtle", +] + +[[package]] +name = "aes-gcm" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e1366e0c69c9f927b1fa5ce2c7bf9eafc8f9268c0b9800729e8b267612447c" +dependencies = [ + "aead 0.5.2", + "aes 0.8.2", + "cipher 0.4.4", + "ctr 0.9.2", + "ghash 0.5.0", + "subtle", +] + +[[package]] +name = "aes-soft" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" +dependencies = [ + "cipher 0.2.5", + "opaque-debug 0.3.0", +] + +[[package]] +name = "aesni" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" +dependencies = [ + "cipher 0.2.5", + "opaque-debug 0.3.0", +] + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.9", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if 1.0.0", + "getrandom 0.2.9", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "aho-corasick" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +dependencies = [ + "memchr", +] + +[[package]] +name = "always-assert" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4436e0292ab1bb631b42973c61205e704475fe8126af845c8d923c0996328127" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + +[[package]] +name = "anstyle-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys 0.48.0", +] + +[[package]] +name = "anyhow" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" + +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + +[[package]] +name = "array-bytes" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" + +[[package]] +name = "array-bytes" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b1c5a481ec30a5abd8dfbd94ab5cf1bb4e9a66be7f1b3b322f2f1170c200fd" + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "asn1-rs" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ff05a702273012438132f449575dbc804e27b2f3cbe3069aa237d26c98fa33" +dependencies = [ + "asn1-rs-derive 0.1.0", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time 0.3.21", +] + +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive 0.4.0", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time 0.3.21", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8b7511298d5b7784b40b092d9e9dcd3a627a5707e4b5e507931ab0d44eeebf" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "async-channel" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-executor" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +dependencies = [ + "async-lock", + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +dependencies = [ + "async-channel", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock", + "autocfg", + "cfg-if 1.0.0", + "concurrent-queue", + "futures-lite", + "log", + "parking", + "polling", + "rustix 0.37.19", + "slab", + "socket2", + "waker-fn", +] + +[[package]] +name = "async-lock" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-recursion" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-attributes", + "async-channel", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite 0.2.9", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" + +[[package]] +name = "async-trait" +version = "0.1.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "asynchronous-codec" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite 0.2.9", +] + +[[package]] +name = "atomic-waker" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom 0.2.9", + "instant", + "rand 0.8.5", +] + +[[package]] +name = "backtrace" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +dependencies = [ + "addr2line 0.19.0", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide 0.6.2", + "object 0.30.3", + "rustc-demangle", +] + +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base58" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +dependencies = [ + "serde", +] + +[[package]] +name = "binary-merkle-tree" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "hash-db", + "log", +] + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.65.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "prettyplease 0.2.5", + "proc-macro2 1.0.57", + "quote 1.0.27", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.16", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "constant_time_eq", +] + +[[package]] +name = "blake2s_simd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637f448b9e61dfadbdcbae9a885fadee1f3eaffb1f8d3c1965d3ade8bdfd44f" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "constant_time_eq", +] + +[[package]] +name = "blake3" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "cc", + "cfg-if 1.0.0", + "constant_time_eq", + "digest 0.10.6", +] + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding 0.1.5", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "block-modes" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" +dependencies = [ + "block-padding 0.2.1", + "cipher 0.2.5", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "blocking" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +dependencies = [ + "async-channel", + "async-lock", + "async-task", + "atomic-waker", + "fastrand", + "futures-lite", + "log", +] + +[[package]] +name = "bounded-collections" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fbd1d11282a1eb134d3c3b7cf8ce213b5161c6e5f73fb1b98618482c606b64" +dependencies = [ + "log", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "bounded-vec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68534a48cbf63a4b1323c433cf21238c9ec23711e0df13b08c33e5c2082663ce" +dependencies = [ + "thiserror", +] + +[[package]] +name = "bp-beefy" +version = "0.1.0" +dependencies = [ + "binary-merkle-tree", + "bp-runtime", + "frame-support", + "pallet-beefy-mmr", + "pallet-mmr", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-beefy", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-bridge-hub-cumulus" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "frame-system", + "polkadot-primitives", + "sp-api", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-bridge-hub-kusama" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-bridge-hub-polkadot" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-bridge-hub-rococo" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-bridge-hub-wococo" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-header-chain" +version = "0.1.0" +dependencies = [ + "bp-runtime", + "bp-test-utils", + "finality-grandpa", + "frame-support", + "hex", + "hex-literal", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-kusama" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", +] + +[[package]] +name = "bp-messages" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-runtime", + "frame-support", + "hex", + "hex-literal", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-millau" +version = "0.1.0" +dependencies = [ + "bp-beefy", + "bp-header-chain", + "bp-messages", + "bp-runtime", + "fixed-hash", + "frame-support", + "frame-system", + "hash256-std-hasher", + "impl-codec", + "impl-serde", + "parity-util-mem", + "scale-info", + "serde", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "sp-trie", +] + +[[package]] +name = "bp-parachains" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-polkadot" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", +] + +[[package]] +name = "bp-polkadot-core" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-runtime", + "frame-support", + "frame-system", + "hex", + "parity-scale-codec", + "parity-util-mem", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-relayers" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-runtime", + "frame-support", + "hex", + "hex-literal", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-rialto" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-messages", + "bp-runtime", + "frame-support", + "frame-system", + "sp-api", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-rialto-parachain" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "frame-system", + "sp-api", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "bp-rococo" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", +] + +[[package]] +name = "bp-runtime" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "hash-db", + "hex-literal", + "impl-trait-for-tuples", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std 5.0.0", + "sp-trie", + "trie-db", +] + +[[package]] +name = "bp-test-utils" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-parachains", + "bp-polkadot-core", + "bp-runtime", + "ed25519-dalek", + "finality-grandpa", + "parity-scale-codec", + "sp-application-crypto", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", + "sp-trie", +] + +[[package]] +name = "bp-westend" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", +] + +[[package]] +name = "bp-wococo" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-rococo", + "bp-runtime", + "frame-support", + "sp-api", +] + +[[package]] +name = "bridge-runtime-common" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-relayers", + "bp-runtime", + "bp-test-utils", + "frame-support", + "frame-system", + "hash-db", + "log", + "pallet-balances", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-bridge-relayers", + "pallet-transaction-payment", + "pallet-utility", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "sp-trie", + "static_assertions", + "xcm", + "xcm-builder", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bstr" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "build-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" +dependencies = [ + "semver 0.6.0", +] + +[[package]] +name = "bumpalo" +version = "3.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "camino" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.17", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "castaway" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +dependencies = [ + "jobserver", +] + +[[package]] +name = "ccm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aca1a8fbc20b50ac9673ff014abfb2b5f4085ee1a850d408f14a159c5853ac7" +dependencies = [ + "aead 0.3.2", + "cipher 0.2.5", + "subtle", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-expr" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8790cf1286da485c72cf5fc7aeba308438800036ec67d89425924c4807268c9" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "chacha20" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" +dependencies = [ + "cfg-if 1.0.0", + "cipher 0.3.0", + "cpufeatures", + "zeroize", +] + +[[package]] +name = "chacha20poly1305" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" +dependencies = [ + "aead 0.4.3", + "chacha20", + "cipher 0.3.0", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-integer", + "num-traits", + "time 0.1.45", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "cid" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ed9c8b2d17acb8110c46f1da5bf4a696d745e1474a16db0cd2b49cd0249bf2" +dependencies = [ + "core2", + "multibase", + "multihash 0.16.3", + "serde", + "unsigned-varint", +] + +[[package]] +name = "cipher" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "ckb-merkle-mountain-range" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f061f97d64fd1822664bdfb722f7ae5469a97b77567390f7442be5b5dc82a5b" +dependencies = [ + "cfg-if 0.1.10", +] + +[[package]] +name = "ckb-merkle-mountain-range" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ccb671c5921be8a84686e6212ca184cb1d7c51cadcdbfcbd1cc3f042f5dfb8" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "clang-sys" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "4.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" +dependencies = [ + "anstream", + "anstyle", + "bitflags", + "clap_lex", + "strsim 0.10.0", +] + +[[package]] +name = "clap_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" +dependencies = [ + "heck 0.4.1", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "clap_lex" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" + +[[package]] +name = "coarsetime" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90d114103adbc625300f346d4d09dfb4ab1c4a8df6868435dd903392ecf4354" +dependencies = [ + "libc", + "once_cell", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "comfy-table" +version = "6.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7b787b0dc42e8111badfdbe4c3059158ccb2db8780352fa1b01e8ccf45cc4d" +dependencies = [ + "strum", + "strum_macros", + "unicode-width", +] + +[[package]] +name = "concurrent-queue" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.42.0", +] + +[[package]] +name = "const-oid" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" + +[[package]] +name = "constant_time_eq" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpp_demangle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "cpu-time" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e393a7668fe1fad3075085b86c781883000b4ede868f43627b34a87c8b7ded" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "cpufeatures" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-bforest" +version = "0.93.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc42ba2e232e5b20ff7dc299a812d53337dadce9a7e39a238e6a5cb82d2e57b" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.93.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "253531aca9b6f56103c9420369db3263e784df39aa1c90685a1f69cfbba0623e" +dependencies = [ + "arrayvec 0.7.2", + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "cranelift-isle", + "gimli 0.26.2", + "hashbrown 0.12.3", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.93.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f2154365e2bff1b1b8537a7181591fdff50d8e27fa6e40d5c69c3bad0ca7c8" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.93.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687e14e3f5775248930e0d5a84195abef8b829958e9794bf8d525104993612b4" + +[[package]] +name = "cranelift-entity" +version = "0.93.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f42ea692c7b450ad18b8c9889661505d51c09ec4380cf1c2d278dbb2da22cae1" +dependencies = [ + "serde", +] + +[[package]] +name = "cranelift-frontend" +version = "0.93.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8483c2db6f45fe9ace984e5adc5d058102227e4c62e5aa2054e16b0275fd3a6e" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.93.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9793158837678902446c411741d87b43f57dadfb944f2440db4287cda8cbd59" + +[[package]] +name = "cranelift-native" +version = "0.93.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72668c7755f2b880665cb422c8ad2d56db58a88b9bebfef0b73edc2277c13c49" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-wasm" +version = "0.93.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3852ce4b088b44ac4e29459573943009a70d1b192c8d77ef949b4e814f656fc1" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools", + "log", + "smallvec", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "crossbeam-utils", + "memoffset 0.8.0", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array 0.14.7", + "subtle", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array 0.14.7", + "subtle", +] + +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher 0.3.0", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher 0.4.4", +] + +[[package]] +name = "cumulus-client-cli" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "clap 4.2.7", + "parity-scale-codec", + "sc-chain-spec", + "sc-cli", + "sc-service", + "sp-core", + "sp-runtime", + "url", +] + +[[package]] +name = "cumulus-client-collator" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "cumulus-client-consensus-common", + "cumulus-client-network", + "cumulus-primitives-core", + "futures", + "parity-scale-codec", + "parking_lot 0.12.1", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-primitives", + "sc-client-api", + "sp-api", + "sp-consensus", + "sp-core", + "sp-runtime", + "tracing", +] + +[[package]] +name = "cumulus-client-consensus-aura" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "async-trait", + "cumulus-client-collator", + "cumulus-client-consensus-common", + "cumulus-client-consensus-proposer", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-relay-chain-interface", + "futures", + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-overseer", + "polkadot-primitives", + "sc-client-api", + "sc-consensus", + "sc-consensus-aura", + "sc-consensus-slots", + "sc-telemetry", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-state-machine", + "sp-timestamp", + "substrate-prometheus-endpoint", + "tracing", +] + +[[package]] +name = "cumulus-client-consensus-common" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "async-trait", + "cumulus-client-pov-recovery", + "cumulus-primitives-core", + "cumulus-relay-chain-interface", + "dyn-clone", + "futures", + "log", + "parity-scale-codec", + "polkadot-primitives", + "sc-client-api", + "sc-consensus", + "schnellru", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-trie", + "substrate-prometheus-endpoint", + "tracing", +] + +[[package]] +name = "cumulus-client-consensus-proposer" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "anyhow", + "async-trait", + "cumulus-primitives-parachain-inherent", + "sp-consensus", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "thiserror", +] + +[[package]] +name = "cumulus-client-network" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "async-trait", + "cumulus-relay-chain-interface", + "futures", + "futures-timer", + "parity-scale-codec", + "parking_lot 0.12.1", + "polkadot-node-primitives", + "polkadot-parachain", + "polkadot-primitives", + "sc-client-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-state-machine", + "tracing", +] + +[[package]] +name = "cumulus-client-pov-recovery" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "async-trait", + "cumulus-primitives-core", + "cumulus-relay-chain-interface", + "futures", + "futures-timer", + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-primitives", + "rand 0.8.5", + "sc-client-api", + "sc-consensus", + "sp-consensus", + "sp-maybe-compressed-blob", + "sp-runtime", + "tracing", +] + +[[package]] +name = "cumulus-client-service" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "cumulus-client-cli", + "cumulus-client-collator", + "cumulus-client-consensus-common", + "cumulus-client-network", + "cumulus-client-pov-recovery", + "cumulus-primitives-core", + "cumulus-relay-chain-inprocess-interface", + "cumulus-relay-chain-interface", + "cumulus-relay-chain-minimal-node", + "futures", + "polkadot-primitives", + "sc-client-api", + "sc-consensus", + "sc-network", + "sc-network-sync", + "sc-network-transactions", + "sc-rpc", + "sc-service", + "sc-sysinfo", + "sc-telemetry", + "sc-transaction-pool", + "sc-utils", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-transaction-pool", +] + +[[package]] +name = "cumulus-pallet-aura-ext" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "frame-support", + "frame-system", + "pallet-aura", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-aura", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "cumulus-pallet-dmp-queue" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "xcm", +] + +[[package]] +name = "cumulus-pallet-parachain-system" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "bytes", + "cumulus-pallet-parachain-system-proc-macro", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "environmental", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "polkadot-parachain", + "scale-info", + "sp-core", + "sp-externalities", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std 5.0.0", + "sp-trie", + "sp-version", + "xcm", +] + +[[package]] +name = "cumulus-pallet-parachain-system-proc-macro" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "cumulus-pallet-xcm" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "xcm", +] + +[[package]] +name = "cumulus-pallet-xcmp-queue" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "polkadot-runtime-common", + "rand_chacha 0.3.1", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "xcm", + "xcm-executor", +] + +[[package]] +name = "cumulus-primitives-core" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-primitives", + "scale-info", + "sp-api", + "sp-runtime", + "sp-std 5.0.0", + "sp-trie", + "xcm", +] + +[[package]] +name = "cumulus-primitives-parachain-inherent" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "async-trait", + "cumulus-primitives-core", + "cumulus-relay-chain-interface", + "cumulus-test-relay-sproof-builder", + "parity-scale-codec", + "sc-client-api", + "scale-info", + "sp-api", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-std 5.0.0", + "sp-storage", + "sp-trie", + "tracing", +] + +[[package]] +name = "cumulus-primitives-timestamp" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "cumulus-primitives-core", + "futures", + "parity-scale-codec", + "sp-inherents", + "sp-std 5.0.0", + "sp-timestamp", +] + +[[package]] +name = "cumulus-relay-chain-inprocess-interface" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "async-trait", + "cumulus-primitives-core", + "cumulus-relay-chain-interface", + "futures", + "futures-timer", + "polkadot-cli", + "polkadot-client", + "polkadot-service", + "sc-cli", + "sc-client-api", + "sc-sysinfo", + "sc-telemetry", + "sc-tracing", + "sp-api", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-state-machine", +] + +[[package]] +name = "cumulus-relay-chain-interface" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "async-trait", + "cumulus-primitives-core", + "futures", + "jsonrpsee-core 0.16.2", + "parity-scale-codec", + "polkadot-overseer", + "sc-client-api", + "sp-api", + "sp-blockchain", + "sp-state-machine", + "thiserror", +] + +[[package]] +name = "cumulus-relay-chain-minimal-node" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "array-bytes 6.1.0", + "async-trait", + "cumulus-primitives-core", + "cumulus-relay-chain-interface", + "cumulus-relay-chain-rpc-interface", + "futures", + "lru 0.9.0", + "polkadot-availability-recovery", + "polkadot-collator-protocol", + "polkadot-core-primitives", + "polkadot-network-bridge", + "polkadot-node-collation-generation", + "polkadot-node-core-runtime-api", + "polkadot-node-network-protocol", + "polkadot-node-subsystem-util", + "polkadot-overseer", + "polkadot-primitives", + "sc-authority-discovery", + "sc-client-api", + "sc-network", + "sc-network-common", + "sc-service", + "sc-tracing", + "sc-utils", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-runtime", + "tokio", + "tracing", +] + +[[package]] +name = "cumulus-relay-chain-rpc-interface" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "async-trait", + "cumulus-primitives-core", + "cumulus-relay-chain-interface", + "futures", + "futures-timer", + "jsonrpsee 0.16.2", + "lru 0.9.0", + "parity-scale-codec", + "polkadot-overseer", + "sc-client-api", + "sc-rpc-api", + "sc-service", + "serde", + "serde_json", + "sp-api", + "sp-authority-discovery", + "sp-consensus-babe", + "sp-core", + "sp-state-machine", + "sp-storage", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "cumulus-test-relay-sproof-builder" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "cumulus-primitives-core", + "parity-scale-codec", + "polkadot-primitives", + "sp-runtime", + "sp-state-machine", + "sp-std 5.0.0", +] + +[[package]] +name = "curl" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" +dependencies = [ + "curl-sys", + "libc", + "openssl-probe", + "openssl-sys", + "schannel", + "socket2", + "winapi", +] + +[[package]] +name = "curl-sys" +version = "0.4.61+curl-8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d05c10f541ae6f3bc5b3d923c20001f47db7d5f0b2bc6ad16490133842db79" +dependencies = [ + "cc", + "libc", + "libnghttp2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", + "winapi", +] + +[[package]] +name = "curve25519-dalek" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" +dependencies = [ + "byteorder", + "digest 0.8.1", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "4.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d4ba9852b42210c7538b75484f9daa0655e9a3ac04f693747bb0f02cf3cfe16" +dependencies = [ + "cfg-if 1.0.0", + "fiat-crypto", + "packed_simd_2", + "platforms 3.0.2", + "subtle", + "zeroize", +] + +[[package]] +name = "cxx" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2 1.0.57", + "quote 1.0.27", + "scratch", + "syn 2.0.16", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "darling" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.57", + "quote 1.0.27", + "strsim 0.10.0", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +dependencies = [ + "darling_core", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "data-encoding" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" + +[[package]] +name = "data-encoding-macro" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86927b7cd2fe88fa698b87404b287ab98d1a0063a34071d92e575b72d3029aca" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05e58dffcdcc8ee7b22f0c1f71a69243d7c2d9ad87b5a14361f2424a1565c219" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe398ac75057914d7d07307bf67dc7f3f574a26783b4fc7805a20ffa9f506e82" +dependencies = [ + "asn1-rs 0.3.1", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs 0.5.2", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "derive-syn-parse" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07adf7be193b71cc36b193d0f5fe60b918a3a9db4dad0449f57bcfd519704a3" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f91d4cfa921f1c05904dc3c57b4a32c38aed3340cce209f3a6fd1478babafc4" +dependencies = [ + "darling", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder_macro" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f0314b72bed045f3a68671b3c86328386762c93f82d98c65c3cb5e5f573dd68" +dependencies = [ + "derive_builder_core", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2 1.0.57", + "quote 1.0.27", + "rustc_version", + "syn 1.0.109", +] + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "dtoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d09067bfacaa79114679b279d7f5885b53295b1e2cfb4e79c8e4bd3d633169" + +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "dyn-clone" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + +[[package]] +name = "ecdsa" +version = "0.16.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" +dependencies = [ + "der 0.7.5", + "digest 0.10.6", + "elliptic-curve 0.13.4", + "rfc6979 0.4.0", + "signature 2.1.0", + "spki 0.7.2", +] + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature 1.6.4", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek 3.2.0", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek 3.2.0", + "hashbrown 0.12.3", + "hex", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.6", + "ff 0.12.1", + "generic-array 0.14.7", + "group 0.12.1", + "hkdf", + "pem-rfc7468", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c71eaa367f2e5d556414a8eea812bc62985c879748d6403edabd9cb03f16e7" +dependencies = [ + "base16ct 0.2.0", + "crypto-bigint 0.5.2", + "digest 0.10.6", + "ff 0.13.0", + "generic-array 0.14.7", + "group 0.13.0", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sec1 0.7.2", + "subtle", + "zeroize", +] + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encoding_rs" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "enum-as-inner" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" +dependencies = [ + "heck 0.4.1", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "enumflags2" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" +dependencies = [ + "enumflags2_derive", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "enumn" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48016319042fb7c87b78d2993084a831793a897a5cd1a2a67cab9d1eeb4b7d76" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "env_logger" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "environmental" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-rlp", + "impl-serde", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-rlp", + "impl-serde", + "primitive-types", + "uint", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "exit-future" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" +dependencies = [ + "futures", +] + +[[package]] +name = "expander" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a718c0675c555c5f976fff4ea9e2c150fa06cefa201cadef87cfbf9324075881" +dependencies = [ + "blake3", + "fs-err", + "proc-macro2 1.0.57", + "quote 1.0.27", +] + +[[package]] +name = "expander" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3774182a5df13c3d1690311ad32fbe913feef26baba609fa2dd5f72042bd2ab6" +dependencies = [ + "blake2", + "fs-err", + "proc-macro2 1.0.57", + "quote 1.0.27", +] + +[[package]] +name = "expander" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f360349150728553f92e4c997a16af8915f418d3a0f21b440d34c5632f16ed84" +dependencies = [ + "blake2", + "fs-err", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "expander" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f86a749cf851891866c10515ef6c299b5c69661465e9c3bbe7e07a2b77fb0f7" +dependencies = [ + "blake2", + "fs-err", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fatality" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad875162843b0d046276327afe0136e9ed3a23d5a754210fb6f1f33610d39ab" +dependencies = [ + "fatality-proc-macro", + "thiserror", +] + +[[package]] +name = "fatality-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5aa1e3ae159e592ad222dc90c5acbad632b527779ba88486abe92782ab268bd" +dependencies = [ + "expander 0.0.4", + "indexmap", + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", + "thiserror", +] + +[[package]] +name = "fdlimit" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4c9e43643f5a3be4ca5b67d26b98031ff9db6806c3440ae32e02e3ceac3f1b" +dependencies = [ + "libc", +] + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" + +[[package]] +name = "file-per-thread-logger" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f2e425d9790201ba4af4630191feac6dcc98765b118d4d18e91d23c2353866" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "filetime" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.2.16", + "windows-sys 0.48.0", +] + +[[package]] +name = "finality-grandpa" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36530797b9bf31cd4ff126dcfee8170f86b00cfdcea3269d73133cc0415945c3" +dependencies = [ + "either", + "futures", + "futures-timer", + "log", + "num-traits", + "parity-scale-codec", + "parking_lot 0.12.1", + "scale-info", +] + +[[package]] +name = "finality-relay" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "backoff", + "bp-header-chain", + "futures", + "log", + "num-traits", + "parking_lot 0.12.1", + "relay-utils", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "libz-sys", + "miniz_oxide 0.7.1", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fork-tree" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fragile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" + +[[package]] +name = "frame-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "frame-support-procedural", + "frame-system", + "linregress", + "log", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-runtime-interface", + "sp-std 5.0.0", + "sp-storage", + "static_assertions", +] + +[[package]] +name = "frame-benchmarking-cli" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "Inflector", + "array-bytes 4.2.0", + "chrono", + "clap 4.2.7", + "comfy-table", + "frame-benchmarking", + "frame-support", + "frame-system", + "gethostname", + "handlebars", + "itertools", + "lazy_static", + "linked-hash-map", + "log", + "parity-scale-codec", + "rand 0.8.5", + "rand_pcg", + "sc-block-builder", + "sc-cli", + "sc-client-api", + "sc-client-db", + "sc-executor", + "sc-service", + "sc-sysinfo", + "serde", + "serde_json", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-database", + "sp-externalities", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-state-machine", + "sp-std 5.0.0", + "sp-storage", + "sp-trie", + "thiserror", + "thousands", +] + +[[package]] +name = "frame-election-provider-solution-type" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "frame-election-provider-support" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-election-provider-solution-type", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-npos-elections", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "frame-executive" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "sp-tracing", +] + +[[package]] +name = "frame-metadata" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" +dependencies = [ + "cfg-if 1.0.0", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "frame-remote-externalities" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-recursion", + "futures", + "indicatif", + "jsonrpsee 0.16.2", + "log", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "spinners", + "substrate-rpc-client", + "tokio", +] + +[[package]] +name = "frame-support" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "bitflags", + "environmental", + "frame-metadata", + "frame-support-procedural", + "impl-trait-for-tuples", + "k256", + "log", + "once_cell", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "smallvec", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-core-hashing-proc-macro", + "sp-debug-derive", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-state-machine", + "sp-std 5.0.0", + "sp-tracing", + "sp-weights", + "tt-call", +] + +[[package]] +name = "frame-support-procedural" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "Inflector", + "cfg-expr", + "derive-syn-parse", + "frame-support-procedural-tools", + "itertools", + "proc-macro-warning", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "frame-support-procedural-tools" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support-procedural-tools-derive", + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "frame-support-procedural-tools-derive" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "frame-system" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "cfg-if 1.0.0", + "frame-support", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "sp-version", + "sp-weights", +] + +[[package]] +name = "frame-system-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "frame-system-rpc-runtime-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "sp-api", +] + +[[package]] +name = "frame-try-runtime" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "parity-scale-codec", + "sp-api", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "fs-err" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0845fa252299212f0389d64ba26f34fa32cfe41588355f21ed507c59a0f64541" + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "fs4" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f5b6908aecca5812a4569056285e58c666588c9573ee59765bf1d3692699e2" +dependencies = [ + "rustix 0.37.19", + "windows-sys 0.48.0", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite 0.2.9", + "waker-fn", +] + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "futures-rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" +dependencies = [ + "futures-io", + "rustls 0.20.8", + "webpki 0.22.0", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-timer" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite 0.2.9", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "ghash" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" +dependencies = [ + "opaque-debug 0.3.0", + "polyval 0.5.3", +] + +[[package]] +name = "ghash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" +dependencies = [ + "opaque-debug 0.3.0", + "polyval 0.6.0", +] + +[[package]] +name = "gimli" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "gimli" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +dependencies = [ + "aho-corasick 0.7.20", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.0", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "handlebars" +version = "4.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83c3372087601b532857d332f5957cbae686da52bb7810bf038c3e3c3cc2fa0d" +dependencies = [ + "log", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "hash-db" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" + +[[package]] +name = "hash256-std-hasher" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hkdf" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +dependencies = [ + "hmac 0.12.1", +] + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac 0.8.0", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac 0.11.1", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array 0.14.7", + "hmac 0.8.1", +] + +[[package]] +name = "honggfuzz" +version = "0.5.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "848e9c511092e0daa0a35a63e8e6e475a3e8f870741448b9f6028d69b142f18e" +dependencies = [ + "arbitrary", + "lazy_static", + "memmap2", + "rustc_version", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite 0.2.9", +] + +[[package]] +name = "http-range-header" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite 0.2.9", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" +dependencies = [ + "http", + "hyper", + "log", + "rustls 0.20.8", + "rustls-native-certs", + "tokio", + "tokio-rustls 0.23.4", + "webpki-roots", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows 0.48.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "if-addrs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "if-watch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9465340214b296cd17a0009acdb890d6160010b8adf8f78a00d0d7ab270f79f" +dependencies = [ + "async-io", + "core-foundation", + "fnv", + "futures", + "if-addrs", + "ipnet", + "log", + "rtnetlink", + "system-configuration", + "tokio", + "windows 0.34.0", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indicatif" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cef509aa9bc73864d6756f0d34d35504af3cf0844373afe9b8669a5b8005a729" +dependencies = [ + "console", + "number_prefix", + "portable-atomic 0.3.20", + "unicode-width", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + +[[package]] +name = "interceptor" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8a11ae2da61704edada656798b61c94b35ecac2c58eb955156987d5e6be90b" +dependencies = [ + "async-trait", + "bytes", + "log", + "rand 0.8.5", + "rtcp", + "rtp", + "thiserror", + "tokio", + "waitgroup", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ip_network" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" + +[[package]] +name = "ipconfig" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd302af1b90f2463a98fa5ad469fc212c8e3175a41c3068601bfa2727591c5be" +dependencies = [ + "socket2", + "widestring", + "winapi", + "winreg", +] + +[[package]] +name = "ipnet" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" + +[[package]] +name = "is-terminal" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes", + "rustix 0.37.19", + "windows-sys 0.48.0", +] + +[[package]] +name = "isahc" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" +dependencies = [ + "async-channel", + "castaway", + "crossbeam-utils", + "curl", + "curl-sys", + "encoding_rs", + "event-listener", + "futures-lite", + "http", + "log", + "mime", + "once_cell", + "polling", + "slab", + "sluice", + "tracing", + "tracing-futures", + "url", + "waker-fn", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonpath_lib" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f" +dependencies = [ + "log", + "serde", + "serde_json", +] + +[[package]] +name = "jsonrpsee" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d291e3a5818a2384645fd9756362e6d89cf0541b0b916fa7702ea4a9833608e" +dependencies = [ + "jsonrpsee-client-transport 0.16.2", + "jsonrpsee-core 0.16.2", + "jsonrpsee-http-client", + "jsonrpsee-proc-macros 0.16.2", + "jsonrpsee-server", + "jsonrpsee-types 0.16.2", + "jsonrpsee-ws-client 0.16.2", + "tracing", +] + +[[package]] +name = "jsonrpsee" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b971ce0f6cd1521ede485afc564b95b2c8e7079b9da41d4273bd9b55140a55d" +dependencies = [ + "jsonrpsee-core 0.17.1", + "jsonrpsee-proc-macros 0.17.1", + "jsonrpsee-types 0.17.1", + "jsonrpsee-ws-client 0.17.1", + "tracing", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965de52763f2004bc91ac5bcec504192440f0b568a5d621c59d9dbd6f886c3fb" +dependencies = [ + "futures-util", + "http", + "jsonrpsee-core 0.16.2", + "jsonrpsee-types 0.16.2", + "pin-project", + "rustls-native-certs", + "soketto", + "thiserror", + "tokio", + "tokio-rustls 0.23.4", + "tokio-util", + "tracing", + "webpki-roots", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca00d975eda834826b04ad57d4e690c67439bb51b02eb0f8b7e4c30fcef8ab9" +dependencies = [ + "futures-util", + "http", + "jsonrpsee-core 0.17.1", + "pin-project", + "rustls-native-certs", + "soketto", + "thiserror", + "tokio", + "tokio-rustls 0.24.0", + "tokio-util", + "tracing", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e70b4439a751a5de7dd5ed55eacff78ebf4ffe0fc009cb1ebb11417f5b536b" +dependencies = [ + "anyhow", + "arrayvec 0.7.2", + "async-lock", + "async-trait", + "beef", + "futures-channel", + "futures-timer", + "futures-util", + "globset", + "hyper", + "jsonrpsee-types 0.16.2", + "parking_lot 0.12.1", + "rand 0.8.5", + "rustc-hash", + "serde", + "serde_json", + "soketto", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b83cca7a5a7899eed8b2935d5f755c8c4052ad66ab5b328bd34ac2b3ffd3515f" +dependencies = [ + "anyhow", + "async-lock", + "async-trait", + "beef", + "futures-timer", + "futures-util", + "jsonrpsee-types 0.17.1", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc345b0a43c6bc49b947ebeb936e886a419ee3d894421790c969cc56040542ad" +dependencies = [ + "async-trait", + "hyper", + "hyper-rustls", + "jsonrpsee-core 0.16.2", + "jsonrpsee-types 0.16.2", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa6da1e4199c10d7b1d0a6e5e8bd8e55f351163b6f4b3cbb044672a69bd4c1c" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d814a21d9a819f8de1a41b819a263ffd68e4bb5f043d936db1c49b54684bde0a" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpsee-server" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb69dad85df79527c019659a992498d03f8495390496da2f07e6c24c2b356fc" +dependencies = [ + "futures-channel", + "futures-util", + "http", + "hyper", + "jsonrpsee-core 0.16.2", + "jsonrpsee-types 0.16.2", + "serde", + "serde_json", + "soketto", + "tokio", + "tokio-stream", + "tokio-util", + "tower", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd522fe1ce3702fd94812965d7bb7a3364b1c9aba743944c5a00529aae80f8c" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd301ccc3e08718393432d1961539d78c4580dcca86014dfe6769c308b2c08b2" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b83daeecfc6517cfe210df24e570fb06213533dfb990318fae781f4c7119dd9" +dependencies = [ + "http", + "jsonrpsee-client-transport 0.16.2", + "jsonrpsee-core 0.16.2", + "jsonrpsee-types 0.16.2", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a69852133d549b07cb37ff2d0ec540eae0d20abb75ae923f5d39bc7536d987" +dependencies = [ + "http", + "jsonrpsee-client-transport 0.17.1", + "jsonrpsee-core 0.17.1", + "jsonrpsee-types 0.17.1", +] + +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if 1.0.0", + "ecdsa 0.16.7", + "elliptic-curve 0.13.4", + "once_cell", + "sha2 0.10.6", +] + +[[package]] +name = "keccak" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "kusama-runtime" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bitvec", + "frame-benchmarking", + "frame-election-provider-support", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal", + "kusama-runtime-constants", + "log", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-bags-list", + "pallet-balances", + "pallet-bounties", + "pallet-child-bounties", + "pallet-collective", + "pallet-conviction-voting", + "pallet-democracy", + "pallet-election-provider-multi-phase", + "pallet-election-provider-support-benchmarking", + "pallet-elections-phragmen", + "pallet-fast-unstake", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-membership", + "pallet-multisig", + "pallet-nis", + "pallet-nomination-pools", + "pallet-nomination-pools-benchmarking", + "pallet-nomination-pools-runtime-api", + "pallet-offences", + "pallet-offences-benchmarking", + "pallet-preimage", + "pallet-proxy", + "pallet-ranked-collective", + "pallet-recovery", + "pallet-referenda", + "pallet-scheduler", + "pallet-session", + "pallet-session-benchmarking", + "pallet-society", + "pallet-staking", + "pallet-staking-runtime-api", + "pallet-timestamp", + "pallet-tips", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", + "pallet-utility", + "pallet-vesting", + "pallet-whitelist", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parity-scale-codec", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", + "rustc-hex", + "scale-info", + "serde", + "serde_derive", + "smallvec", + "sp-api", + "sp-arithmetic", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-core", + "sp-inherents", + "sp-io", + "sp-mmr-primitives", + "sp-npos-elections", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 5.0.0", + "sp-transaction-pool", + "sp-version", + "static_assertions", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "kusama-runtime-constants" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "frame-support", + "polkadot-primitives", + "polkadot-runtime-common", + "smallvec", + "sp-core", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "kvdb" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d770dcb02bf6835887c3a979b5107a04ff4bbde97a5f0928d27404a155add9" +dependencies = [ + "smallvec", +] + +[[package]] +name = "kvdb-memorydb" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7a85fe66f9ff9cd74e169fdd2c94c6e1e74c412c99a73b4df3200b5d3760b2" +dependencies = [ + "kvdb", + "parking_lot 0.12.1", +] + +[[package]] +name = "kvdb-rocksdb" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b644c70b92285f66bfc2032922a79000ea30af7bc2ab31902992a5dcb9b434f6" +dependencies = [ + "kvdb", + "num_cpus", + "parking_lot 0.12.1", + "regex", + "rocksdb", + "smallvec", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if 1.0.0", + "winapi", +] + +[[package]] +name = "libm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" + +[[package]] +name = "libm" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" + +[[package]] +name = "libnghttp2-sys" +version = "0.1.7+1.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ed28aba195b38d5ff02b9170cbff627e336a20925e43b4945390401c5dc93f" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "libp2p" +version = "0.51.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f210d259724eae82005b5c48078619b7745edb7b76de370b03f8ba59ea103097" +dependencies = [ + "bytes", + "futures", + "futures-timer", + "getrandom 0.2.9", + "instant", + "libp2p-allow-block-list", + "libp2p-connection-limits", + "libp2p-core", + "libp2p-dns", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-mdns", + "libp2p-metrics", + "libp2p-noise", + "libp2p-ping", + "libp2p-quic", + "libp2p-request-response", + "libp2p-swarm", + "libp2p-tcp", + "libp2p-wasm-ext", + "libp2p-webrtc", + "libp2p-websocket", + "libp2p-yamux", + "multiaddr", + "pin-project", +] + +[[package]] +name = "libp2p-allow-block-list" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510daa05efbc25184458db837f6f9a5143888f1caa742426d92e1833ddd38a50" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", +] + +[[package]] +name = "libp2p-connection-limits" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4caa33f1d26ed664c4fe2cca81a08c8e07d4c1c04f2f4ac7655c2dd85467fda0" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", +] + +[[package]] +name = "libp2p-core" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c1df63c0b582aa434fb09b2d86897fa2b419ffeccf934b36f87fcedc8e835c2" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-identity", + "log", + "multiaddr", + "multihash 0.17.0", + "multistream-select", + "once_cell", + "parking_lot 0.12.1", + "pin-project", + "quick-protobuf", + "rand 0.8.5", + "rw-stream-sink", + "smallvec", + "thiserror", + "unsigned-varint", + "void", +] + +[[package]] +name = "libp2p-dns" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146ff7034daae62077c415c2376b8057368042df6ab95f5432ad5e88568b1554" +dependencies = [ + "futures", + "libp2p-core", + "log", + "parking_lot 0.12.1", + "smallvec", + "trust-dns-resolver", +] + +[[package]] +name = "libp2p-identify" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5455f472243e63b9c497ff320ded0314254a9eb751799a39c283c6f20b793f3c" +dependencies = [ + "asynchronous-codec", + "either", + "futures", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "log", + "lru 0.10.0", + "quick-protobuf", + "quick-protobuf-codec", + "smallvec", + "thiserror", + "void", +] + +[[package]] +name = "libp2p-identity" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2d584751cecb2aabaa56106be6be91338a60a0f4e420cf2af639204f596fc1" +dependencies = [ + "bs58", + "ed25519-dalek", + "log", + "multiaddr", + "multihash 0.17.0", + "quick-protobuf", + "rand 0.8.5", + "sha2 0.10.6", + "thiserror", + "zeroize", +] + +[[package]] +name = "libp2p-kad" +version = "0.43.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39d5ef876a2b2323d63c258e63c2f8e36f205fe5a11f0b3095d59635650790ff" +dependencies = [ + "arrayvec 0.7.2", + "asynchronous-codec", + "bytes", + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "log", + "quick-protobuf", + "rand 0.8.5", + "sha2 0.10.6", + "smallvec", + "thiserror", + "uint", + "unsigned-varint", + "void", +] + +[[package]] +name = "libp2p-mdns" +version = "0.43.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19983e1f949f979a928f2c603de1cf180cc0dc23e4ac93a62651ccb18341460b" +dependencies = [ + "data-encoding", + "futures", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "log", + "rand 0.8.5", + "smallvec", + "socket2", + "tokio", + "trust-dns-proto", + "void", +] + +[[package]] +name = "libp2p-metrics" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a42ec91e227d7d0dafa4ce88b333cdf5f277253873ab087555c92798db2ddd46" +dependencies = [ + "libp2p-core", + "libp2p-identify", + "libp2p-kad", + "libp2p-ping", + "libp2p-swarm", + "prometheus-client", +] + +[[package]] +name = "libp2p-noise" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3673da89d29936bc6435bafc638e2f184180d554ce844db65915113f86ec5e" +dependencies = [ + "bytes", + "curve25519-dalek 3.2.0", + "futures", + "libp2p-core", + "libp2p-identity", + "log", + "once_cell", + "quick-protobuf", + "rand 0.8.5", + "sha2 0.10.6", + "snow", + "static_assertions", + "thiserror", + "x25519-dalek 1.1.1", + "zeroize", +] + +[[package]] +name = "libp2p-ping" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e57759c19c28a73ef1eb3585ca410cefb72c1a709fcf6de1612a378e4219202" +dependencies = [ + "either", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "rand 0.8.5", + "void", +] + +[[package]] +name = "libp2p-quic" +version = "0.7.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6b26abd81cd2398382a1edfe739b539775be8a90fa6914f39b2ab49571ec735" +dependencies = [ + "bytes", + "futures", + "futures-timer", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-tls", + "log", + "parking_lot 0.12.1", + "quinn-proto", + "rand 0.8.5", + "rustls 0.20.8", + "thiserror", + "tokio", +] + +[[package]] +name = "libp2p-request-response" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffdb374267d42dc5ed5bc53f6e601d4a64ac5964779c6e40bb9e4f14c1e30d5" +dependencies = [ + "async-trait", + "futures", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "smallvec", +] + +[[package]] +name = "libp2p-swarm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "903b3d592d7694e56204d211f29d31bc004be99386644ba8731fc3e3ef27b296" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm-derive", + "log", + "rand 0.8.5", + "smallvec", + "tokio", + "void", +] + +[[package]] +name = "libp2p-swarm-derive" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fba456131824ab6acd4c7bf61e9c0f0a3014b5fc9868ccb8e10d344594cdc4f" +dependencies = [ + "heck 0.4.1", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "libp2p-tcp" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d33698596d7722d85d3ab0c86c2c322254fce1241e91208e3679b4eb3026cf" +dependencies = [ + "futures", + "futures-timer", + "if-watch", + "libc", + "libp2p-core", + "log", + "socket2", + "tokio", +] + +[[package]] +name = "libp2p-tls" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff08d13d0dc66e5e9ba6279c1de417b84fa0d0adc3b03e5732928c180ec02781" +dependencies = [ + "futures", + "futures-rustls", + "libp2p-core", + "libp2p-identity", + "rcgen 0.10.0", + "ring", + "rustls 0.20.8", + "thiserror", + "webpki 0.22.0", + "x509-parser 0.14.0", + "yasna", +] + +[[package]] +name = "libp2p-wasm-ext" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77dff9d32353a5887adb86c8afc1de1a94d9e8c3bc6df8b2201d7cdf5c848f43" +dependencies = [ + "futures", + "js-sys", + "libp2p-core", + "parity-send-wrapper", + "wasm-bindgen", + "wasm-bindgen-futures", +] + +[[package]] +name = "libp2p-webrtc" +version = "0.4.0-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dba48592edbc2f60b4bc7c10d65445b0c3964c07df26fdf493b6880d33be36f8" +dependencies = [ + "async-trait", + "asynchronous-codec", + "bytes", + "futures", + "futures-timer", + "hex", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-noise", + "log", + "multihash 0.17.0", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "rcgen 0.9.3", + "serde", + "stun", + "thiserror", + "tinytemplate", + "tokio", + "tokio-util", + "webrtc", +] + +[[package]] +name = "libp2p-websocket" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111273f7b3d3510524c752e8b7a5314b7f7a1fee7e68161c01a7d72cbb06db9f" +dependencies = [ + "either", + "futures", + "futures-rustls", + "libp2p-core", + "log", + "parking_lot 0.12.1", + "quicksink", + "rw-stream-sink", + "soketto", + "url", + "webpki-roots", +] + +[[package]] +name = "libp2p-yamux" +version = "0.43.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd21d950662700a385d4c6d68e2f5f54d778e97068cdd718522222ef513bda" +dependencies = [ + "futures", + "libp2p-core", + "log", + "thiserror", + "yamux", +] + +[[package]] +name = "librocksdb-sys" +version = "0.11.0+8.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e" +dependencies = [ + "bindgen", + "bzip2-sys", + "cc", + "glob", + "libc", + "libz-sys", + "tikv-jemalloc-sys", +] + +[[package]] +name = "libsecp256k1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +dependencies = [ + "arrayref", + "base64 0.13.1", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.8.5", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libz-sys" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +dependencies = [ + "cc", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linked_hash_set" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "linregress" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "475015a7f8f017edb28d2e69813be23500ad4b32cfe3421c4148efc97324ee52" +dependencies = [ + "nalgebra", +] + +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + +[[package]] +name = "linux-raw-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if 1.0.0", + "value-bag", +] + +[[package]] +name = "lru" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lru" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e7d46de488603ffdd5f30afbc64fbba2378214a2c3a2fb83abf3d33126df17" +dependencies = [ + "hashbrown 0.13.2", +] + +[[package]] +name = "lru" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03f1160296536f10c833a82dca22267d5486734230d47bf00bf435885814ba1e" +dependencies = [ + "hashbrown 0.13.2", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "lz4" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +dependencies = [ + "libc", + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matrixmultiply" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "md-5" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memfd" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" +dependencies = [ + "rustix 0.37.19", +] + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memory-db" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" +dependencies = [ + "hash-db", +] + +[[package]] +name = "memory_units" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" + +[[package]] +name = "merlin" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "messages-relay" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "bp-messages", + "env_logger", + "finality-relay", + "futures", + "hex", + "log", + "num-traits", + "parking_lot 0.12.1", + "relay-utils", + "sp-arithmetic", +] + +[[package]] +name = "mick-jaeger" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69672161530e8aeca1d1400fbf3f1a1747ff60ea604265a4e906c2442df20532" +dependencies = [ + "futures", + "rand 0.8.5", + "thrift", +] + +[[package]] +name = "millau-bridge-node" +version = "0.1.0" +dependencies = [ + "clap 4.2.7", + "frame-benchmarking", + "frame-benchmarking-cli", + "jsonrpsee 0.16.2", + "millau-runtime", + "mmr-rpc", + "node-inspect", + "pallet-transaction-payment-rpc", + "sc-basic-authorship", + "sc-cli", + "sc-client-api", + "sc-consensus", + "sc-consensus-aura", + "sc-consensus-beefy", + "sc-consensus-beefy-rpc", + "sc-consensus-grandpa", + "sc-consensus-grandpa-rpc", + "sc-executor", + "sc-keystore", + "sc-network", + "sc-network-common", + "sc-rpc", + "sc-service", + "sc-telemetry", + "sc-transaction-pool", + "serde_json", + "sp-consensus-aura", + "sp-consensus-beefy", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-timestamp", + "substrate-build-script-utils", + "substrate-frame-rpc-system", +] + +[[package]] +name = "millau-runtime" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-millau", + "bp-parachains", + "bp-polkadot-core", + "bp-relayers", + "bp-rialto", + "bp-rialto-parachain", + "bp-runtime", + "bp-westend", + "bridge-runtime-common", + "env_logger", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "hex-literal", + "pallet-aura", + "pallet-balances", + "pallet-beefy", + "pallet-beefy-mmr", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-bridge-relayers", + "pallet-grandpa", + "pallet-mmr", + "pallet-session", + "pallet-shift-session-manager", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "pallet-xcm", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-consensus-beefy", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std 5.0.0", + "sp-transaction-pool", + "sp-version", + "static_assertions", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.45.0", +] + +[[package]] +name = "mmr-gadget" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "futures", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-offchain", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-consensus-beefy", + "sp-core", + "sp-mmr-primitives", + "sp-runtime", +] + +[[package]] +name = "mmr-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "anyhow", + "jsonrpsee 0.16.2", + "parity-scale-codec", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-mmr-primitives", + "sp-runtime", +] + +[[package]] +name = "mockall" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +dependencies = [ + "cfg-if 1.0.0", + "downcast", + "fragile", + "lazy_static", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +dependencies = [ + "cfg-if 1.0.0", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "multiaddr" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b36f567c7099511fa8612bbbb52dda2419ce0bdbacf31714e3a5ffdb766d3bd" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "log", + "multibase", + "multihash 0.17.0", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" +dependencies = [ + "blake2b_simd", + "blake2s_simd", + "blake3", + "core2", + "digest 0.10.6", + "multihash-derive", + "sha2 0.10.6", + "sha3", + "unsigned-varint", +] + +[[package]] +name = "multihash" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" +dependencies = [ + "core2", + "digest 0.10.6", + "multihash-derive", + "sha2 0.10.6", + "unsigned-varint", +] + +[[package]] +name = "multihash-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" +dependencies = [ + "proc-macro-crate", + "proc-macro-error", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "multistream-select" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8552ab875c1313b97b8d20cb857b9fd63e2d1d6a0a1b53ce9821e575405f27a" +dependencies = [ + "bytes", + "futures", + "log", + "pin-project", + "smallvec", + "unsigned-varint", +] + +[[package]] +name = "nalgebra" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68d47bba83f9e2006d117a9a33af1524e655516b8919caac694427a6fb1e511" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d232c68884c0c99810a5a4d333ef7e47689cfd0edc85efc9e54e1e6bf5212766" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "names" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d66043b25d4a6cccb23619d10c19c25304b355a7dccd4a8e11423dd2382146" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" + +[[package]] +name = "netlink-packet-core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" +dependencies = [ + "anyhow", + "byteorder", + "libc", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" +dependencies = [ + "anyhow", + "bitflags", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror", +] + +[[package]] +name = "netlink-proto" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror", + "tokio", +] + +[[package]] +name = "netlink-sys" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" +dependencies = [ + "bytes", + "futures", + "libc", + "log", + "tokio", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "node-inspect" +version = "0.9.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +dependencies = [ + "clap 4.2.7", + "parity-scale-codec", + "sc-cli", + "sc-client-api", + "sc-executor", + "sc-service", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec 0.7.2", + "itoa", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +dependencies = [ + "crc32fast", + "hashbrown 0.12.3", + "indexmap", + "memchr", +] + +[[package]] +name = "object" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +dependencies = [ + "memchr", +] + +[[package]] +name = "oid-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e20717fa0541f39bd146692035c37bedfa532b3e5071b35761082407546b2a" +dependencies = [ + "asn1-rs 0.3.1", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs 0.5.2", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "orchestra" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227585216d05ba65c7ab0a0450a3cf2cbd81a98862a54c4df8e14d5ac6adb015" +dependencies = [ + "async-trait", + "dyn-clonable", + "futures", + "futures-timer", + "orchestra-proc-macro", + "pin-project", + "prioritized-metered-channel", + "thiserror", + "tracing", +] + +[[package]] +name = "orchestra-proc-macro" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2871aadd82a2c216ee68a69837a526dfe788ecbe74c4c5038a6acdbff6653066" +dependencies = [ + "expander 0.0.6", + "itertools", + "petgraph", + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "ordered-float" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7" +dependencies = [ + "num-traits", +] + +[[package]] +name = "p256" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +dependencies = [ + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.6", +] + +[[package]] +name = "p384" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" +dependencies = [ + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.6", +] + +[[package]] +name = "packed_simd_2" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" +dependencies = [ + "cfg-if 1.0.0", + "libm 0.1.4", +] + +[[package]] +name = "pallet-aura" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "frame-system", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-aura", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-authority-discovery" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "frame-system", + "pallet-session", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-authority-discovery", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-authorship" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-babe" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-babe", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-bags-list" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "sp-tracing", +] + +[[package]] +name = "pallet-balances" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-beefy" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "frame-system", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-beefy", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-beefy-mmr" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "binary-merkle-tree", + "frame-support", + "frame-system", + "log", + "pallet-beefy", + "pallet-mmr", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-consensus-beefy", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-bounties" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-treasury", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-bridge-beefy" +version = "0.1.0" +dependencies = [ + "bp-beefy", + "bp-runtime", + "bp-test-utils", + "ckb-merkle-mountain-range 0.3.2", + "frame-support", + "frame-system", + "log", + "pallet-beefy-mmr", + "pallet-mmr", + "parity-scale-codec", + "rand 0.8.5", + "scale-info", + "serde", + "sp-consensus-beefy", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-bridge-grandpa" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-runtime", + "bp-test-utils", + "finality-grandpa", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "sp-trie", +] + +[[package]] +name = "pallet-bridge-messages" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-runtime", + "bp-test-utils", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "num-traits", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-bridge-parachains" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-parachains", + "bp-polkadot-core", + "bp-runtime", + "bp-test-utils", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-bridge-grandpa", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "sp-trie", +] + +[[package]] +name = "pallet-bridge-relayers" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-relayers", + "bp-runtime", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "pallet-bridge-messages", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-child-bounties" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-bounties", + "pallet-treasury", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-collective" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-conviction-voting" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "assert_matches", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-democracy" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-election-provider-multi-phase" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-election-provider-support-benchmarking", + "parity-scale-codec", + "rand 0.8.5", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-std 5.0.0", + "strum", +] + +[[package]] +name = "pallet-election-provider-support-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-system", + "parity-scale-codec", + "sp-npos-elections", + "sp-runtime", +] + +[[package]] +name = "pallet-elections-phragmen" +version = "5.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-fast-unstake" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-grandpa" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-grandpa", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-identity" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "enumflags2", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-im-online" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-indices" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-membership" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-mmr" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-mmr-primitives", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-multisig" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-nis" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-nomination-pools" +version = "1.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-nomination-pools-benchmarking" +version = "1.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "pallet-bags-list", + "pallet-nomination-pools", + "pallet-staking", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-runtime-interface", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-nomination-pools-runtime-api" +version = "1.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "pallet-nomination-pools", + "parity-scale-codec", + "sp-api", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-offences" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "sp-runtime", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-offences-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-babe", + "pallet-balances", + "pallet-grandpa", + "pallet-im-online", + "pallet-offences", + "pallet-session", + "pallet-staking", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-preimage" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-proxy" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-ranked-collective" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-recovery" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-referenda" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "assert_matches", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-scheduler" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "sp-weights", +] + +[[package]] +name = "pallet-session" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 5.0.0", + "sp-trie", +] + +[[package]] +name = "pallet-session-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-session", + "pallet-staking", + "rand 0.8.5", + "sp-runtime", + "sp-session", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-shift-session-manager" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "pallet-session", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-society" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "rand_chacha 0.2.2", + "scale-info", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-staking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "rand_chacha 0.2.2", + "scale-info", + "serde", + "sp-application-crypto", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-staking-reward-curve" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "pallet-staking-reward-fn" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "log", + "sp-arithmetic", +] + +[[package]] +name = "pallet-staking-runtime-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "sp-api", +] + +[[package]] +name = "pallet-state-trie-migration" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-sudo" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-timestamp" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "sp-timestamp", +] + +[[package]] +name = "pallet-tips" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-treasury", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-transaction-payment" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-transaction-payment-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "jsonrpsee 0.16.2", + "pallet-transaction-payment-rpc-runtime-api", + "parity-scale-codec", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "pallet-transaction-payment-rpc-runtime-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "pallet-transaction-payment", + "parity-scale-codec", + "sp-api", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "pallet-treasury" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-utility" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-vesting" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-whitelist" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "pallet-xcm" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bounded-collections", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "xcm", + "xcm-executor", +] + +[[package]] +name = "pallet-xcm-benchmarks" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "parachain-info" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "parachains-relay" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "bp-polkadot-core", + "futures", + "log", + "parity-scale-codec", + "relay-substrate-client", + "relay-utils", + "sp-core", +] + +[[package]] +name = "parity-db" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4890dcb9556136a4ec2b0c51fa4a08c8b733b829506af8fff2e853f3a065985b" +dependencies = [ + "blake2", + "crc32fast", + "fs2", + "hex", + "libc", + "log", + "lz4", + "memmap2", + "parking_lot 0.12.1", + "rand 0.8.5", + "siphasher", + "snap", +] + +[[package]] +name = "parity-scale-codec" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ddb756ca205bd108aee3c62c6d3c994e1df84a59b9d6d4a5ea42ee1fd5a9a28" +dependencies = [ + "arrayvec 0.7.2", + "bitvec", + "byte-slice-cast", + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b26a931f824dd4eca30b3e43bb4f31cd5f0d3a403c5f5ff27106b805bfde7b" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "parity-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" + +[[package]] +name = "parity-util-mem" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d32c34f4f5ca7f9196001c0aba5a1f9a5a12382c8944b8b0f90233282d1e8f8" +dependencies = [ + "cfg-if 1.0.0", + "ethereum-types", + "hashbrown 0.12.3", + "impl-trait-for-tuples", + "lru 0.8.1", + "parity-util-mem-derive", + "parking_lot 0.12.1", + "primitive-types", + "smallvec", + "winapi", +] + +[[package]] +name = "parity-util-mem-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" +dependencies = [ + "proc-macro2 1.0.57", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "parity-wasm" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" + +[[package]] +name = "parking" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.7", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "paste" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" + +[[package]] +name = "pbkdf2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +dependencies = [ + "crypto-mac 0.11.1", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "pem-rfc7468" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "pest" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e68e84bfb01f0507134eac1e9b410a12ba379d064eab48c50ba4ce329a527b70" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b79d4c71c865a25a4322296122e3924d30bc8ee0834c8bfc8b95f7f054afbfb" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c435bf1076437b851ebc8edc3a18442796b30f1728ffea6262d59bbe28b077e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "pest_meta" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "745a452f8eb71e39ffd8ee32b3c5f51d03845f99786fa9b68db6ff509c505411" +dependencies = [ + "once_cell", + "pest", + "sha2 0.10.6", +] + +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "pin-project-lite" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der 0.7.5", + "spki 0.7.2", +] + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "platforms" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" + +[[package]] +name = "platforms" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" + +[[package]] +name = "polkadot-approval-distribution" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "futures", + "polkadot-node-jaeger", + "polkadot-node-metrics", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-primitives", + "rand 0.8.5", + "tracing-gum", +] + +[[package]] +name = "polkadot-availability-bitfield-distribution" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "futures", + "polkadot-node-network-protocol", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "rand 0.8.5", + "tracing-gum", +] + +[[package]] +name = "polkadot-availability-distribution" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "derive_more", + "fatality", + "futures", + "lru 0.9.0", + "parity-scale-codec", + "polkadot-erasure-coding", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "rand 0.8.5", + "sp-core", + "sp-keystore", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-availability-recovery" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "fatality", + "futures", + "lru 0.9.0", + "parity-scale-codec", + "polkadot-erasure-coding", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "rand 0.8.5", + "sc-network", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-cli" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "clap 4.2.7", + "frame-benchmarking-cli", + "futures", + "log", + "polkadot-client", + "polkadot-node-core-pvf-worker", + "polkadot-node-metrics", + "polkadot-service", + "sc-cli", + "sc-executor", + "sc-service", + "sc-storage-monitor", + "sc-sysinfo", + "sc-tracing", + "sp-core", + "sp-io", + "sp-keyring", + "sp-maybe-compressed-blob", + "substrate-build-script-utils", + "thiserror", + "try-runtime-cli", +] + +[[package]] +name = "polkadot-client" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "async-trait", + "frame-benchmarking", + "frame-benchmarking-cli", + "frame-system", + "frame-system-rpc-runtime-api", + "futures", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "polkadot-core-primitives", + "polkadot-node-core-parachains-inherent", + "polkadot-primitives", + "polkadot-runtime", + "polkadot-runtime-common", + "sc-client-api", + "sc-consensus", + "sc-executor", + "sc-service", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-consensus-grandpa", + "sp-core", + "sp-inherents", + "sp-keyring", + "sp-mmr-primitives", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-storage", + "sp-timestamp", + "sp-transaction-pool", +] + +[[package]] +name = "polkadot-collator-protocol" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "always-assert", + "bitvec", + "fatality", + "futures", + "futures-timer", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sp-core", + "sp-keystore", + "sp-runtime", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-core-primitives" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "polkadot-dispute-distribution" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "derive_more", + "fatality", + "futures", + "futures-timer", + "indexmap", + "lru 0.9.0", + "parity-scale-codec", + "polkadot-erasure-coding", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sc-network", + "sp-application-crypto", + "sp-keystore", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-erasure-coding" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-primitives", + "reed-solomon-novelpoly", + "sp-core", + "sp-trie", + "thiserror", +] + +[[package]] +name = "polkadot-gossip-support" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "futures", + "futures-timer", + "polkadot-node-network-protocol", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "rand 0.8.5", + "rand_chacha 0.3.1", + "sc-network", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "tracing-gum", +] + +[[package]] +name = "polkadot-network-bridge" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "always-assert", + "async-trait", + "bytes", + "fatality", + "futures", + "parity-scale-codec", + "parking_lot 0.12.1", + "polkadot-node-metrics", + "polkadot-node-network-protocol", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-primitives", + "sc-network", + "sp-consensus", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-collation-generation" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "futures", + "parity-scale-codec", + "polkadot-erasure-coding", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sp-core", + "sp-maybe-compressed-blob", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-approval-voting" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bitvec", + "derive_more", + "futures", + "futures-timer", + "kvdb", + "lru 0.9.0", + "merlin", + "parity-scale-codec", + "polkadot-node-jaeger", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-overseer", + "polkadot-primitives", + "sc-keystore", + "schnorrkel", + "sp-application-crypto", + "sp-consensus", + "sp-consensus-slots", + "sp-runtime", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-av-store" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bitvec", + "futures", + "futures-timer", + "kvdb", + "parity-scale-codec", + "polkadot-erasure-coding", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-overseer", + "polkadot-primitives", + "sp-consensus", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-backing" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bitvec", + "fatality", + "futures", + "polkadot-erasure-coding", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "polkadot-statement-table", + "sp-keystore", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-bitfield-signing" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "futures", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sp-keystore", + "thiserror", + "tracing-gum", + "wasm-timer", +] + +[[package]] +name = "polkadot-node-core-candidate-validation" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "parity-scale-codec", + "polkadot-node-core-pvf", + "polkadot-node-metrics", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-parachain", + "polkadot-primitives", + "sp-maybe-compressed-blob", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-chain-api" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "futures", + "polkadot-node-metrics", + "polkadot-node-subsystem", + "polkadot-primitives", + "sc-client-api", + "sc-consensus-babe", + "sp-blockchain", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-chain-selection" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "futures", + "futures-timer", + "kvdb", + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-dispute-coordinator" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "fatality", + "futures", + "kvdb", + "lru 0.9.0", + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sc-keystore", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-parachains-inherent" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-primitives", + "sp-blockchain", + "sp-inherents", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-provisioner" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bitvec", + "fatality", + "futures", + "futures-timer", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "rand 0.8.5", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-pvf" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "always-assert", + "futures", + "futures-timer", + "libc", + "parity-scale-codec", + "pin-project", + "polkadot-core-primitives", + "polkadot-node-metrics", + "polkadot-node-primitives", + "polkadot-parachain", + "polkadot-primitives", + "rand 0.8.5", + "slotmap", + "sp-core", + "sp-maybe-compressed-blob", + "sp-tracing", + "sp-wasm-interface", + "substrate-build-script-utils", + "tokio", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-pvf-checker" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "futures", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-overseer", + "polkadot-primitives", + "sp-keystore", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-pvf-worker" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "assert_matches", + "cpu-time", + "futures", + "libc", + "parity-scale-codec", + "polkadot-node-core-pvf", + "polkadot-parachain", + "polkadot-primitives", + "rayon", + "sc-executor", + "sc-executor-common", + "sc-executor-wasmtime", + "sp-core", + "sp-externalities", + "sp-io", + "sp-maybe-compressed-blob", + "sp-tracing", + "substrate-build-script-utils", + "tempfile", + "tikv-jemalloc-ctl", + "tokio", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-runtime-api" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "futures", + "lru 0.9.0", + "polkadot-node-metrics", + "polkadot-node-subsystem", + "polkadot-node-subsystem-types", + "polkadot-primitives", + "sp-consensus-babe", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-jaeger" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "lazy_static", + "log", + "mick-jaeger", + "parity-scale-codec", + "parking_lot 0.12.1", + "polkadot-node-primitives", + "polkadot-primitives", + "sc-network", + "sp-core", + "thiserror", + "tokio", +] + +[[package]] +name = "polkadot-node-metrics" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bs58", + "futures", + "futures-timer", + "log", + "parity-scale-codec", + "polkadot-primitives", + "prioritized-metered-channel", + "sc-cli", + "sc-service", + "sc-tracing", + "substrate-prometheus-endpoint", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-network-protocol" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "async-trait", + "derive_more", + "fatality", + "futures", + "hex", + "parity-scale-codec", + "polkadot-node-jaeger", + "polkadot-node-primitives", + "polkadot-primitives", + "rand 0.8.5", + "sc-authority-discovery", + "sc-network", + "strum", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-primitives" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bounded-vec", + "futures", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "schnorrkel", + "serde", + "sp-application-crypto", + "sp-consensus-babe", + "sp-core", + "sp-keystore", + "sp-maybe-compressed-blob", + "sp-runtime", + "thiserror", + "zstd 0.11.2+zstd.1.5.2", +] + +[[package]] +name = "polkadot-node-subsystem" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "polkadot-node-jaeger", + "polkadot-node-subsystem-types", + "polkadot-overseer", +] + +[[package]] +name = "polkadot-node-subsystem-types" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "async-trait", + "derive_more", + "futures", + "orchestra", + "polkadot-node-jaeger", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-primitives", + "polkadot-statement-table", + "sc-network", + "smallvec", + "sp-api", + "sp-authority-discovery", + "sp-consensus-babe", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "polkadot-node-subsystem-util" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "async-trait", + "derive_more", + "fatality", + "futures", + "futures-channel", + "itertools", + "kvdb", + "lru 0.9.0", + "parity-db", + "parity-scale-codec", + "parking_lot 0.11.2", + "pin-project", + "polkadot-node-jaeger", + "polkadot-node-metrics", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-primitives", + "prioritized-metered-channel", + "rand 0.8.5", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-overseer" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "lru 0.9.0", + "orchestra", + "parking_lot 0.12.1", + "polkadot-node-metrics", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem-types", + "polkadot-primitives", + "sc-client-api", + "sp-api", + "sp-core", + "tikv-jemalloc-ctl", + "tracing-gum", +] + +[[package]] +name = "polkadot-parachain" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bounded-collections", + "derive_more", + "frame-support", + "parity-scale-codec", + "polkadot-core-primitives", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "polkadot-primitives" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bitvec", + "hex-literal", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-authority-discovery", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "polkadot-rpc" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "jsonrpsee 0.16.2", + "mmr-rpc", + "pallet-transaction-payment-rpc", + "polkadot-primitives", + "sc-chain-spec", + "sc-client-api", + "sc-consensus-babe", + "sc-consensus-babe-rpc", + "sc-consensus-beefy", + "sc-consensus-beefy-rpc", + "sc-consensus-epochs", + "sc-consensus-grandpa", + "sc-consensus-grandpa-rpc", + "sc-rpc", + "sc-sync-state-rpc", + "sc-transaction-pool-api", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-keystore", + "sp-runtime", + "substrate-frame-rpc-system", + "substrate-state-trie-migration-rpc", +] + +[[package]] +name = "polkadot-runtime" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bitvec", + "frame-benchmarking", + "frame-election-provider-support", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal", + "log", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-bags-list", + "pallet-balances", + "pallet-bounties", + "pallet-child-bounties", + "pallet-collective", + "pallet-conviction-voting", + "pallet-democracy", + "pallet-election-provider-multi-phase", + "pallet-election-provider-support-benchmarking", + "pallet-elections-phragmen", + "pallet-fast-unstake", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-membership", + "pallet-multisig", + "pallet-nomination-pools", + "pallet-nomination-pools-benchmarking", + "pallet-nomination-pools-runtime-api", + "pallet-offences", + "pallet-offences-benchmarking", + "pallet-preimage", + "pallet-proxy", + "pallet-referenda", + "pallet-scheduler", + "pallet-session", + "pallet-session-benchmarking", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-staking-runtime-api", + "pallet-timestamp", + "pallet-tips", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", + "pallet-utility", + "pallet-vesting", + "pallet-whitelist", + "pallet-xcm", + "parity-scale-codec", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-constants", + "polkadot-runtime-parachains", + "rustc-hex", + "scale-info", + "serde", + "serde_derive", + "smallvec", + "sp-api", + "sp-arithmetic", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-core", + "sp-inherents", + "sp-io", + "sp-mmr-primitives", + "sp-npos-elections", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 5.0.0", + "sp-transaction-pool", + "sp-version", + "static_assertions", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "polkadot-runtime-common" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bitvec", + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "libsecp256k1", + "log", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-election-provider-multi-phase", + "pallet-fast-unstake", + "pallet-session", + "pallet-staking", + "pallet-staking-reward-fn", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-treasury", + "pallet-vesting", + "parity-scale-codec", + "polkadot-primitives", + "polkadot-runtime-parachains", + "rustc-hex", + "scale-info", + "serde", + "serde_derive", + "slot-range-helper", + "sp-api", + "sp-core", + "sp-inherents", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 5.0.0", + "static_assertions", + "xcm", +] + +[[package]] +name = "polkadot-runtime-constants" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "frame-support", + "polkadot-primitives", + "polkadot-runtime-common", + "smallvec", + "sp-core", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "polkadot-runtime-metrics" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bs58", + "parity-scale-codec", + "polkadot-primitives", + "sp-std 5.0.0", + "sp-tracing", +] + +[[package]] +name = "polkadot-runtime-parachains" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bitflags", + "bitvec", + "derive_more", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-session", + "pallet-staking", + "pallet-timestamp", + "pallet-vesting", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-metrics", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rustc-hex", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 5.0.0", + "static_assertions", + "xcm", + "xcm-executor", +] + +[[package]] +name = "polkadot-service" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "async-trait", + "frame-benchmarking-cli", + "frame-support", + "frame-system-rpc-runtime-api", + "futures", + "hex-literal", + "kusama-runtime", + "kvdb", + "kvdb-rocksdb", + "log", + "lru 0.9.0", + "mmr-gadget", + "pallet-babe", + "pallet-im-online", + "pallet-staking", + "pallet-transaction-payment-rpc-runtime-api", + "parity-db", + "polkadot-approval-distribution", + "polkadot-availability-bitfield-distribution", + "polkadot-availability-distribution", + "polkadot-availability-recovery", + "polkadot-client", + "polkadot-collator-protocol", + "polkadot-dispute-distribution", + "polkadot-gossip-support", + "polkadot-network-bridge", + "polkadot-node-collation-generation", + "polkadot-node-core-approval-voting", + "polkadot-node-core-av-store", + "polkadot-node-core-backing", + "polkadot-node-core-bitfield-signing", + "polkadot-node-core-candidate-validation", + "polkadot-node-core-chain-api", + "polkadot-node-core-chain-selection", + "polkadot-node-core-dispute-coordinator", + "polkadot-node-core-parachains-inherent", + "polkadot-node-core-provisioner", + "polkadot-node-core-pvf-checker", + "polkadot-node-core-runtime-api", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-types", + "polkadot-node-subsystem-util", + "polkadot-overseer", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-rpc", + "polkadot-runtime", + "polkadot-runtime-constants", + "polkadot-runtime-parachains", + "polkadot-statement-distribution", + "rococo-runtime", + "sc-authority-discovery", + "sc-basic-authorship", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-client-db", + "sc-consensus", + "sc-consensus-babe", + "sc-consensus-beefy", + "sc-consensus-grandpa", + "sc-consensus-slots", + "sc-executor", + "sc-keystore", + "sc-network", + "sc-network-common", + "sc-network-sync", + "sc-offchain", + "sc-service", + "sc-sync-state-rpc", + "sc-sysinfo", + "sc-telemetry", + "sc-transaction-pool", + "serde", + "serde_json", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-consensus-grandpa", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-mmr-primitives", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-state-machine", + "sp-storage", + "sp-timestamp", + "sp-transaction-pool", + "sp-trie", + "substrate-prometheus-endpoint", + "thiserror", + "tracing-gum", + "westend-runtime", +] + +[[package]] +name = "polkadot-statement-distribution" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "arrayvec 0.5.2", + "fatality", + "futures", + "indexmap", + "parity-scale-codec", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sp-keystore", + "sp-staking", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-statement-table" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "parity-scale-codec", + "polkadot-primitives", + "sp-core", +] + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags", + "cfg-if 1.0.0", + "concurrent-queue", + "libc", + "log", + "pin-project-lite 0.2.9", + "windows-sys 0.48.0", +] + +[[package]] +name = "poly1305" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" +dependencies = [ + "cpufeatures", + "opaque-debug 0.3.0", + "universal-hash 0.4.1", +] + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "opaque-debug 0.3.0", + "universal-hash 0.4.1", +] + +[[package]] +name = "polyval" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "opaque-debug 0.3.0", + "universal-hash 0.5.0", +] + +[[package]] +name = "portable-atomic" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e30165d31df606f5726b090ec7592c308a0eaf61721ff64c9a3018e344a8753e" +dependencies = [ + "portable-atomic 1.3.2", +] + +[[package]] +name = "portable-atomic" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc59d1bcc64fc5d021d67521f818db868368028108d37f0e98d74e33f68297b5" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "predicates" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +dependencies = [ + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" + +[[package]] +name = "predicates-tree" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2 1.0.57", + "syn 1.0.109", +] + +[[package]] +name = "prettyplease" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617feabb81566b593beb4886fb8c1f38064169dae4dccad0e3220160c3b37203" +dependencies = [ + "proc-macro2 1.0.57", + "syn 2.0.16", +] + +[[package]] +name = "primitive-types" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "prioritized-metered-channel" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382698e48a268c832d0b181ed438374a6bb708a82a8ca273bb0f61c74cf209c4" +dependencies = [ + "coarsetime", + "crossbeam-queue", + "derive_more", + "futures", + "futures-timer", + "nanorand", + "thiserror", + "tracing", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "version_check", +] + +[[package]] +name = "proc-macro-warning" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e99670bafb56b9a106419397343bdbc8b8742c3cc449fec6345f86173f47cd4" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid 0.1.0", +] + +[[package]] +name = "proc-macro2" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ec6d5fe0b140acb27c9a0444118cf55bfbb4e0b259739429abb4521dd67c16" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prometheus" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" +dependencies = [ + "cfg-if 1.0.0", + "fnv", + "lazy_static", + "memchr", + "parking_lot 0.12.1", + "thiserror", +] + +[[package]] +name = "prometheus-client" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6fa99d535dd930d1249e6c79cb3c2915f9172a540fe2b02a4c8f9ca954721e" +dependencies = [ + "dtoa", + "itoa", + "parking_lot 0.12.1", + "prometheus-client-derive-encode", +] + +[[package]] +name = "prometheus-client-derive-encode" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b6a5217beb0ad503ee7fa752d451c905113d70721b937126158f3106a48cc1" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck 0.4.1", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease 0.1.25", + "prost", + "prost-types", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost", +] + +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", +] + +[[package]] +name = "quick-protobuf-codec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1693116345026436eb2f10b677806169c1a1260c1c60eaaffe3fb5a29ae23d8b" +dependencies = [ + "asynchronous-codec", + "bytes", + "quick-protobuf", + "thiserror", + "unsigned-varint", +] + +[[package]] +name = "quicksink" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project-lite 0.1.12", +] + +[[package]] +name = "quinn-proto" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c10f662eee9c94ddd7135043e544f3c82fa839a1e7b865911331961b53186c" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring", + "rustc-hash", + "rustls 0.20.8", + "slab", + "thiserror", + "tinyvec", + "tracing", + "webpki 0.22.0", +] + +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + +[[package]] +name = "quote" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +dependencies = [ + "proc-macro2 1.0.57", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.9", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "rbtag" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c64936fcc0b811890a9d90020f3df5cec9c604efde88af7db6a35d365132a3" +dependencies = [ + "rbtag_derive", +] + +[[package]] +name = "rbtag_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75511b710ccca8adbb211e04763bd8c78fed585b0ec188a20ed9b0dd95567c4" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", +] + +[[package]] +name = "rcgen" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" +dependencies = [ + "pem", + "ring", + "time 0.3.21", + "x509-parser 0.13.2", + "yasna", +] + +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring", + "time 0.3.21", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.9", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "reed-solomon-novelpoly" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bd8f48b2066e9f69ab192797d66da804d1935bf22763204ed3675740cb0f221" +dependencies = [ + "derive_more", + "fs-err", + "itertools", + "static_init 0.5.2", + "thiserror", +] + +[[package]] +name = "ref-cast" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43faa91b1c8b36841ee70e97188a869d37ae21759da6846d4be66de5bf7b12c" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d2275aab483050ab2a7364c1a46604865ee7d6906684e08db0f090acf74f9e7" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "regalloc2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +dependencies = [ + "aho-corasick 1.0.1", + "memchr", + "regex-syntax 0.7.1", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" + +[[package]] +name = "region" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" +dependencies = [ + "bitflags", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "relay-bridge-hub-kusama-client" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-kusama", + "bp-bridge-hub-polkadot", + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot", + "bp-runtime", + "bridge-runtime-common", + "parity-scale-codec", + "relay-substrate-client", + "scale-info", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "relay-bridge-hub-polkadot-client" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-kusama", + "bp-bridge-hub-polkadot", + "bp-header-chain", + "bp-kusama", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-runtime", + "bridge-runtime-common", + "parity-scale-codec", + "relay-substrate-client", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "relay-bridge-hub-rococo-client" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-rococo", + "bp-bridge-hub-wococo", + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-runtime", + "bp-wococo", + "bridge-runtime-common", + "parity-scale-codec", + "relay-substrate-client", + "scale-info", + "sp-core", + "sp-runtime", + "sp-weights", + "subxt", +] + +[[package]] +name = "relay-bridge-hub-wococo-client" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-rococo", + "bp-bridge-hub-wococo", + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-rococo", + "bp-runtime", + "bridge-runtime-common", + "parity-scale-codec", + "relay-bridge-hub-rococo-client", + "relay-substrate-client", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-weights", + "subxt", +] + +[[package]] +name = "relay-kusama-client" +version = "0.1.0" +dependencies = [ + "bp-kusama", + "bp-runtime", + "relay-substrate-client", + "relay-utils", + "sp-core", +] + +[[package]] +name = "relay-millau-client" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-millau", + "bp-runtime", + "frame-support", + "frame-system", + "millau-runtime", + "pallet-transaction-payment", + "parity-scale-codec", + "relay-substrate-client", + "relay-utils", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "relay-polkadot-client" +version = "0.1.0" +dependencies = [ + "bp-polkadot", + "bp-runtime", + "relay-substrate-client", + "relay-utils", + "sp-core", +] + +[[package]] +name = "relay-rialto-client" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-rialto", + "bp-runtime", + "frame-support", + "frame-system", + "pallet-transaction-payment", + "parity-scale-codec", + "relay-substrate-client", + "relay-utils", + "rialto-runtime", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "relay-rialto-parachain-client" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-header-chain", + "bp-messages", + "bp-millau", + "bp-polkadot-core", + "bp-rialto-parachain", + "bp-runtime", + "bridge-runtime-common", + "parity-scale-codec", + "relay-substrate-client", + "scale-info", + "sp-core", + "sp-runtime", + "sp-weights", + "subxt", +] + +[[package]] +name = "relay-rococo-client" +version = "0.1.0" +dependencies = [ + "bp-rococo", + "bp-runtime", + "relay-substrate-client", + "relay-utils", + "sp-core", +] + +[[package]] +name = "relay-substrate-client" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "bp-header-chain", + "bp-messages", + "bp-polkadot-core", + "bp-runtime", + "finality-relay", + "frame-support", + "frame-system", + "futures", + "jsonrpsee 0.17.1", + "log", + "num-traits", + "pallet-balances", + "pallet-bridge-messages", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "parity-scale-codec", + "rand 0.8.5", + "relay-utils", + "sc-chain-spec", + "sc-rpc-api", + "sc-transaction-pool-api", + "scale-info", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-std 5.0.0", + "sp-trie", + "sp-version", + "thiserror", + "tokio", + "xcm", +] + +[[package]] +name = "relay-utils" +version = "0.1.0" +dependencies = [ + "ansi_term", + "anyhow", + "async-std", + "async-trait", + "backoff", + "bp-runtime", + "env_logger", + "futures", + "isahc", + "jsonpath_lib", + "log", + "num-traits", + "serde_json", + "sp-runtime", + "substrate-prometheus-endpoint", + "sysinfo", + "thiserror", + "time 0.3.21", + "tokio", +] + +[[package]] +name = "relay-westend-client" +version = "0.1.0" +dependencies = [ + "bp-runtime", + "bp-westend", + "relay-substrate-client", + "relay-utils", + "sp-core", +] + +[[package]] +name = "relay-wococo-client" +version = "0.1.0" +dependencies = [ + "bp-runtime", + "bp-wococo", + "relay-substrate-client", + "relay-utils", + "sp-core", +] + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] + +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac 0.12.1", + "zeroize", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac 0.12.1", + "subtle", +] + +[[package]] +name = "rialto-bridge-node" +version = "0.1.0" +dependencies = [ + "clap 4.2.7", + "frame-benchmarking", + "frame-benchmarking-cli", + "frame-support", + "node-inspect", + "polkadot-node-core-pvf-worker", + "polkadot-primitives", + "polkadot-runtime-parachains", + "polkadot-service", + "rialto-runtime", + "sc-cli", + "sc-executor", + "sc-service", + "serde_json", + "sp-authority-discovery", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "substrate-build-script-utils", +] + +[[package]] +name = "rialto-parachain-collator" +version = "0.1.0" +dependencies = [ + "clap 4.2.7", + "cumulus-client-cli", + "cumulus-client-consensus-aura", + "cumulus-client-consensus-common", + "cumulus-client-network", + "cumulus-client-service", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-relay-chain-interface", + "frame-benchmarking", + "frame-benchmarking-cli", + "jsonrpsee 0.16.2", + "log", + "pallet-transaction-payment-rpc", + "parity-scale-codec", + "polkadot-cli", + "polkadot-primitives", + "polkadot-service", + "rialto-parachain-runtime", + "sc-basic-authorship", + "sc-chain-spec", + "sc-cli", + "sc-client-api", + "sc-consensus", + "sc-executor", + "sc-network", + "sc-network-sync", + "sc-rpc", + "sc-rpc-api", + "sc-service", + "sc-telemetry", + "sc-tracing", + "sc-transaction-pool", + "serde", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-keystore", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-timestamp", + "sp-transaction-pool", + "substrate-build-script-utils", + "substrate-frame-rpc-system", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "rialto-parachain-runtime" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-millau", + "bp-relayers", + "bp-rialto-parachain", + "bp-runtime", + "bridge-runtime-common", + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-timestamp", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "hex-literal", + "pallet-aura", + "pallet-balances", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-relayers", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-xcm", + "parachain-info", + "parity-scale-codec", + "polkadot-parachain", + "scale-info", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std 5.0.0", + "sp-transaction-pool", + "sp-version", + "static_assertions", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "rialto-runtime" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-millau", + "bp-relayers", + "bp-rialto", + "bp-runtime", + "bridge-runtime-common", + "env_logger", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "pallet-authority-discovery", + "pallet-babe", + "pallet-balances", + "pallet-beefy", + "pallet-beefy-mmr", + "pallet-bridge-beefy", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-relayers", + "pallet-grandpa", + "pallet-mmr", + "pallet-session", + "pallet-shift-session-manager", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-xcm", + "parity-scale-codec", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", + "scale-info", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std 5.0.0", + "sp-transaction-pool", + "sp-version", + "static_assertions", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "rocksdb" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe" +dependencies = [ + "libc", + "librocksdb-sys", +] + +[[package]] +name = "rococo-runtime" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "binary-merkle-tree", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal", + "log", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-beefy", + "pallet-beefy-mmr", + "pallet-bounties", + "pallet-child-bounties", + "pallet-collective", + "pallet-democracy", + "pallet-elections-phragmen", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-membership", + "pallet-mmr", + "pallet-multisig", + "pallet-nis", + "pallet-offences", + "pallet-preimage", + "pallet-proxy", + "pallet-recovery", + "pallet-scheduler", + "pallet-session", + "pallet-society", + "pallet-staking", + "pallet-state-trie-migration", + "pallet-sudo", + "pallet-timestamp", + "pallet-tips", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", + "pallet-utility", + "pallet-vesting", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", + "rococo-runtime-constants", + "scale-info", + "serde", + "serde_derive", + "smallvec", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-core", + "sp-inherents", + "sp-io", + "sp-mmr-primitives", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 5.0.0", + "sp-transaction-pool", + "sp-version", + "static_assertions", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "rococo-runtime-constants" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "frame-support", + "polkadot-primitives", + "polkadot-runtime-common", + "smallvec", + "sp-core", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "rpassword" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678cf63ab3491898c0d021b493c94c9b221d91295294a2a5746eacbe5928322" +dependencies = [ + "libc", + "rtoolbox", + "winapi", +] + +[[package]] +name = "rtcp" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1919efd6d4a6a85d13388f9487549bb8e359f17198cc03ffd72f79b553873691" +dependencies = [ + "bytes", + "thiserror", + "webrtc-util", +] + +[[package]] +name = "rtnetlink" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" +dependencies = [ + "futures", + "log", + "netlink-packet-route", + "netlink-proto", + "nix", + "thiserror", + "tokio", +] + +[[package]] +name = "rtoolbox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "034e22c514f5c0cb8a10ff341b9b048b5ceb21591f31c8f44c43b960f9b3524a" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "rtp" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a095411ff00eed7b12e4c6a118ba984d113e1079582570d56a5ee723f11f80" +dependencies = [ + "async-trait", + "bytes", + "rand 0.8.5", + "serde", + "thiserror", + "webrtc-util", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.17", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "0.36.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a38f9520be93aba504e8ca974197f46158de5dcaa9fa04b57c57cd6a679d658" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.1.4", + "windows-sys 0.45.0", +] + +[[package]] +name = "rustix" +version = "0.37.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.7", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64 0.13.1", + "log", + "ring", + "sct 0.6.1", + "webpki 0.21.4", +] + +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "log", + "ring", + "sct 0.7.0", + "webpki 0.22.0", +] + +[[package]] +name = "rustls" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c911ba11bc8433e811ce56fde130ccf32f5127cab0e0194e9c68c5a5b671791e" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct 0.7.0", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +dependencies = [ + "base64 0.21.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "rw-stream-sink" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" +dependencies = [ + "futures", + "pin-project", + "static_assertions", +] + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "safe_arch" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "794821e4ccb0d9f979512f9c1973480123f9bd62a90d74ab0f9426fcf8f4a529" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "sc-allocator" +version = "4.1.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "log", + "sp-core", + "sp-wasm-interface", + "thiserror", +] + +[[package]] +name = "sc-authority-discovery" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "ip_network", + "libp2p", + "log", + "multihash 0.17.0", + "parity-scale-codec", + "prost", + "prost-build", + "rand 0.8.5", + "sc-client-api", + "sc-network", + "sc-network-common", + "sp-api", + "sp-authority-discovery", + "sp-blockchain", + "sp-core", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-basic-authorship" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "futures", + "futures-timer", + "log", + "parity-scale-codec", + "sc-block-builder", + "sc-client-api", + "sc-proposer-metrics", + "sc-telemetry", + "sc-transaction-pool-api", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-inherents", + "sp-runtime", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-block-builder" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "sc-client-api", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-core", + "sp-inherents", + "sp-runtime", +] + +[[package]] +name = "sc-chain-spec" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "memmap2", + "sc-chain-spec-derive", + "sc-client-api", + "sc-executor", + "sc-network", + "sc-telemetry", + "serde", + "serde_json", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-state-machine", +] + +[[package]] +name = "sc-chain-spec-derive" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "sc-cli" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "chrono", + "clap 4.2.7", + "fdlimit", + "futures", + "libp2p-identity", + "log", + "names", + "parity-scale-codec", + "rand 0.8.5", + "regex", + "rpassword", + "sc-client-api", + "sc-client-db", + "sc-keystore", + "sc-network", + "sc-network-common", + "sc-service", + "sc-telemetry", + "sc-tracing", + "sc-utils", + "serde", + "serde_json", + "sp-blockchain", + "sp-core", + "sp-keyring", + "sp-keystore", + "sp-panic-handler", + "sp-runtime", + "sp-version", + "thiserror", + "tiny-bip39", + "tokio", +] + +[[package]] +name = "sc-client-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "fnv", + "futures", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-executor", + "sc-transaction-pool-api", + "sc-utils", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-database", + "sp-externalities", + "sp-keystore", + "sp-runtime", + "sp-state-machine", + "sp-statement-store", + "sp-storage", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-client-db" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "hash-db", + "kvdb", + "kvdb-memorydb", + "kvdb-rocksdb", + "linked-hash-map", + "log", + "parity-db", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-client-api", + "sc-state-db", + "schnellru", + "sp-arithmetic", + "sp-blockchain", + "sp-core", + "sp-database", + "sp-runtime", + "sp-state-machine", + "sp-trie", +] + +[[package]] +name = "sc-consensus" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "libp2p-identity", + "log", + "mockall", + "parking_lot 0.12.1", + "sc-client-api", + "sc-utils", + "serde", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-state-machine", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-consensus-aura" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "futures", + "log", + "parity-scale-codec", + "sc-block-builder", + "sc-client-api", + "sc-consensus", + "sc-consensus-slots", + "sc-telemetry", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-aura", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-consensus-babe" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "fork-tree", + "futures", + "log", + "num-bigint", + "num-rational", + "num-traits", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-client-api", + "sc-consensus", + "sc-consensus-epochs", + "sc-consensus-slots", + "sc-keystore", + "sc-telemetry", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-consensus-babe-rpc" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "futures", + "jsonrpsee 0.16.2", + "sc-consensus-babe", + "sc-consensus-epochs", + "sc-rpc-api", + "serde", + "sp-api", + "sp-application-crypto", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-keystore", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-consensus-beefy" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "async-trait", + "fnv", + "futures", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-client-api", + "sc-consensus", + "sc-keystore", + "sc-network", + "sc-network-common", + "sc-network-gossip", + "sc-network-sync", + "sc-utils", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-beefy", + "sp-core", + "sp-keystore", + "sp-mmr-primitives", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", + "wasm-timer", +] + +[[package]] +name = "sc-consensus-beefy-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "futures", + "jsonrpsee 0.16.2", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-consensus-beefy", + "sc-rpc", + "serde", + "sp-consensus-beefy", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-consensus-epochs" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "fork-tree", + "parity-scale-codec", + "sc-client-api", + "sc-consensus", + "sp-blockchain", + "sp-runtime", +] + +[[package]] +name = "sc-consensus-grandpa" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "ahash 0.8.3", + "array-bytes 4.2.0", + "async-trait", + "dyn-clone", + "finality-grandpa", + "fork-tree", + "futures", + "futures-timer", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.8.5", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-consensus", + "sc-network", + "sc-network-common", + "sc-network-gossip", + "sc-telemetry", + "sc-utils", + "serde_json", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-grandpa", + "sp-core", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-consensus-grandpa-rpc" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "finality-grandpa", + "futures", + "jsonrpsee 0.16.2", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-consensus-grandpa", + "sc-rpc", + "serde", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-consensus-slots" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-consensus", + "sc-telemetry", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", +] + +[[package]] +name = "sc-executor" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "lru 0.8.1", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-executor-common", + "sc-executor-wasmi", + "sc-executor-wasmtime", + "sp-api", + "sp-core", + "sp-externalities", + "sp-io", + "sp-panic-handler", + "sp-runtime-interface", + "sp-trie", + "sp-version", + "sp-wasm-interface", + "tracing", + "wasmi", +] + +[[package]] +name = "sc-executor-common" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "sc-allocator", + "sp-maybe-compressed-blob", + "sp-wasm-interface", + "thiserror", + "wasm-instrument", + "wasmi", +] + +[[package]] +name = "sc-executor-wasmi" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "log", + "sc-allocator", + "sc-executor-common", + "sp-runtime-interface", + "sp-wasm-interface", + "wasmi", +] + +[[package]] +name = "sc-executor-wasmtime" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "anyhow", + "cfg-if 1.0.0", + "libc", + "log", + "once_cell", + "rustix 0.36.13", + "sc-allocator", + "sc-executor-common", + "sp-runtime-interface", + "sp-wasm-interface", + "wasmtime", +] + +[[package]] +name = "sc-informant" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "ansi_term", + "futures", + "futures-timer", + "log", + "sc-client-api", + "sc-network", + "sc-network-common", + "sp-blockchain", + "sp-runtime", +] + +[[package]] +name = "sc-keystore" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "parking_lot 0.12.1", + "serde_json", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "thiserror", +] + +[[package]] +name = "sc-network" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "async-channel", + "async-trait", + "asynchronous-codec", + "bytes", + "either", + "fnv", + "futures", + "futures-timer", + "ip_network", + "libp2p", + "linked_hash_set", + "log", + "lru 0.8.1", + "mockall", + "parity-scale-codec", + "parking_lot 0.12.1", + "pin-project", + "rand 0.8.5", + "sc-block-builder", + "sc-client-api", + "sc-consensus", + "sc-network-common", + "sc-peerset", + "sc-utils", + "serde", + "serde_json", + "smallvec", + "snow", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", + "unsigned-varint", + "zeroize", +] + +[[package]] +name = "sc-network-bitswap" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "cid", + "futures", + "libp2p-identity", + "log", + "prost", + "prost-build", + "sc-client-api", + "sc-network", + "sc-network-common", + "sp-blockchain", + "sp-runtime", + "thiserror", + "unsigned-varint", +] + +[[package]] +name = "sc-network-common" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "async-trait", + "bitflags", + "bytes", + "futures", + "futures-timer", + "libp2p-identity", + "parity-scale-codec", + "prost-build", + "sc-consensus", + "sc-peerset", + "sc-utils", + "serde", + "smallvec", + "sp-blockchain", + "sp-consensus", + "sp-consensus-grandpa", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", + "zeroize", +] + +[[package]] +name = "sc-network-gossip" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "ahash 0.8.3", + "futures", + "futures-timer", + "libp2p", + "log", + "lru 0.8.1", + "sc-network", + "sc-network-common", + "sc-peerset", + "sp-runtime", + "substrate-prometheus-endpoint", + "tracing", +] + +[[package]] +name = "sc-network-light" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "futures", + "libp2p-identity", + "log", + "parity-scale-codec", + "prost", + "prost-build", + "sc-client-api", + "sc-network", + "sc-network-common", + "sc-peerset", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-network-sync" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "async-trait", + "fork-tree", + "futures", + "futures-timer", + "libp2p", + "log", + "lru 0.8.1", + "mockall", + "parity-scale-codec", + "prost", + "prost-build", + "sc-client-api", + "sc-consensus", + "sc-network", + "sc-network-common", + "sc-peerset", + "sc-utils", + "smallvec", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-network-transactions" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "futures", + "libp2p", + "log", + "parity-scale-codec", + "pin-project", + "sc-network", + "sc-network-common", + "sc-peerset", + "sc-utils", + "sp-consensus", + "sp-runtime", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-offchain" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "bytes", + "fnv", + "futures", + "futures-timer", + "hyper", + "hyper-rustls", + "libp2p", + "num_cpus", + "once_cell", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.8.5", + "sc-client-api", + "sc-network", + "sc-network-common", + "sc-peerset", + "sc-utils", + "sp-api", + "sp-core", + "sp-offchain", + "sp-runtime", + "threadpool", + "tracing", +] + +[[package]] +name = "sc-peerset" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "futures", + "libp2p-identity", + "log", + "sc-utils", + "serde_json", + "wasm-timer", +] + +[[package]] +name = "sc-proposer-metrics" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "log", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "futures", + "jsonrpsee 0.16.2", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-rpc-api", + "sc-tracing", + "sc-transaction-pool-api", + "sc-utils", + "serde_json", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-keystore", + "sp-offchain", + "sp-rpc", + "sp-runtime", + "sp-session", + "sp-statement-store", + "sp-version", + "tokio", +] + +[[package]] +name = "sc-rpc-api" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "jsonrpsee 0.16.2", + "parity-scale-codec", + "sc-chain-spec", + "sc-transaction-pool-api", + "scale-info", + "serde", + "serde_json", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-version", + "thiserror", +] + +[[package]] +name = "sc-rpc-server" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "http", + "jsonrpsee 0.16.2", + "log", + "serde_json", + "substrate-prometheus-endpoint", + "tokio", + "tower", + "tower-http", +] + +[[package]] +name = "sc-rpc-spec-v2" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "futures", + "futures-util", + "hex", + "jsonrpsee 0.16.2", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-chain-spec", + "sc-client-api", + "sc-transaction-pool-api", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-version", + "thiserror", + "tokio-stream", +] + +[[package]] +name = "sc-service" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "directories", + "exit-future", + "futures", + "futures-timer", + "jsonrpsee 0.16.2", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "pin-project", + "rand 0.8.5", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-client-db", + "sc-consensus", + "sc-executor", + "sc-informant", + "sc-keystore", + "sc-network", + "sc-network-bitswap", + "sc-network-common", + "sc-network-light", + "sc-network-sync", + "sc-network-transactions", + "sc-offchain", + "sc-rpc", + "sc-rpc-server", + "sc-rpc-spec-v2", + "sc-storage-monitor", + "sc-sysinfo", + "sc-telemetry", + "sc-tracing", + "sc-transaction-pool", + "sc-transaction-pool-api", + "sc-utils", + "serde", + "serde_json", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-runtime", + "sp-session", + "sp-state-machine", + "sp-storage", + "sp-transaction-pool", + "sp-transaction-storage-proof", + "sp-trie", + "sp-version", + "static_init 1.0.3", + "substrate-prometheus-endpoint", + "tempfile", + "thiserror", + "tokio", + "tracing", + "tracing-futures", +] + +[[package]] +name = "sc-state-db" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sp-core", +] + +[[package]] +name = "sc-storage-monitor" +version = "0.1.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "clap 4.2.7", + "fs4", + "futures", + "log", + "sc-client-db", + "sc-utils", + "sp-core", + "thiserror", + "tokio", +] + +[[package]] +name = "sc-sync-state-rpc" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "jsonrpsee 0.16.2", + "parity-scale-codec", + "sc-chain-spec", + "sc-client-api", + "sc-consensus-babe", + "sc-consensus-epochs", + "sc-consensus-grandpa", + "serde", + "serde_json", + "sp-blockchain", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-sysinfo" +version = "6.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "futures", + "libc", + "log", + "rand 0.8.5", + "rand_pcg", + "regex", + "sc-telemetry", + "serde", + "serde_json", + "sp-core", + "sp-io", + "sp-std 5.0.0", +] + +[[package]] +name = "sc-telemetry" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "chrono", + "futures", + "libp2p", + "log", + "parking_lot 0.12.1", + "pin-project", + "rand 0.8.5", + "sc-utils", + "serde", + "serde_json", + "thiserror", + "wasm-timer", +] + +[[package]] +name = "sc-tracing" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "ansi_term", + "atty", + "chrono", + "lazy_static", + "libc", + "log", + "once_cell", + "parking_lot 0.12.1", + "regex", + "rustc-hash", + "sc-client-api", + "sc-rpc-server", + "sc-tracing-proc-macro", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-tracing", + "thiserror", + "tracing", + "tracing-log", + "tracing-subscriber", +] + +[[package]] +name = "sc-tracing-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "sc-transaction-pool" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "linked-hash-map", + "log", + "num-traits", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-client-api", + "sc-transaction-pool-api", + "sc-utils", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-tracing", + "sp-transaction-pool", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-transaction-pool-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "futures", + "log", + "serde", + "sp-blockchain", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-utils" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-channel", + "futures", + "futures-timer", + "lazy_static", + "log", + "parking_lot 0.12.1", + "prometheus", + "sp-arithmetic", +] + +[[package]] +name = "scale-bits" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd7aca73785181cc41f0bbe017263e682b585ca660540ba569133901d013ecf" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "scale-decode" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e5527e4b3bf079d4c0b2f253418598c380722ba37ef20fac9088081407f2b6" +dependencies = [ + "parity-scale-codec", + "primitive-types", + "scale-bits", + "scale-decode-derive", + "scale-info", + "thiserror", +] + +[[package]] +name = "scale-decode-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b38741b2f78e4391b94eac6b102af0f6ea2b0f7fe65adb55d7f4004f507854db" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "scale-encode" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15546e5efbb45f0fc2291f7e202dee8623274c5d8bbfdf9c6886cc8b44a7ced3" +dependencies = [ + "parity-scale-codec", + "primitive-types", + "scale-bits", + "scale-encode-derive", + "scale-info", + "thiserror", +] + +[[package]] +name = "scale-encode-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd983cf0a9effd76138554ead18a6de542d1af175ac12fd5e91836c5c0268082" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "scale-info" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b569c32c806ec3abdf3b5869fb8bf1e0d275a7c1c9b0b05603d9464632649edf" +dependencies = [ + "bitvec", + "cfg-if 1.0.0", + "derive_more", + "parity-scale-codec", + "scale-info-derive", + "serde", +] + +[[package]] +name = "scale-info-derive" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53012eae69e5aa5c14671942a5dd47de59d4cdcff8532a6dd0e081faf1119482" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "scale-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11f549769261561e6764218f847e500588f9a79a289de49ce92f9e26642a3574" +dependencies = [ + "either", + "frame-metadata", + "parity-scale-codec", + "scale-bits", + "scale-decode", + "scale-encode", + "scale-info", + "serde", + "thiserror", + "yap", +] + +[[package]] +name = "schannel" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys 0.42.0", +] + +[[package]] +name = "schnellru" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" +dependencies = [ + "ahash 0.8.3", + "cfg-if 1.0.0", + "hashbrown 0.13.2", +] + +[[package]] +name = "schnorrkel" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "curve25519-dalek 2.1.3", + "getrandom 0.1.16", + "merlin", + "rand 0.7.3", + "rand_core 0.5.1", + "sha2 0.8.2", + "subtle", + "zeroize", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "scratch" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" + +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sdp" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d22a5ef407871893fd72b4562ee15e4742269b173959db4b8df6f538c414e13" +dependencies = [ + "rand 0.8.5", + "substring", + "thiserror", + "url", +] + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array 0.14.7", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + +[[package]] +name = "sec1" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" +dependencies = [ + "base16ct 0.2.0", + "der 0.7.5", + "generic-array 0.14.7", + "pkcs8 0.10.2", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" +dependencies = [ + "cc", +] + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2855b3715770894e67cbfa3df957790aa0c9edc3bf06efa1a84d77fa0839d1" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.163" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.163" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "serde_json" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +dependencies = [ + "serde", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.6", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" + +[[package]] +name = "signal-hook" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-async-std" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4aa94397e2023af5b7cff5b8d4785e935cfb77f0e4aab0cae3b26258ace556" +dependencies = [ + "async-io", + "futures-lite", + "libc", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.6", + "rand_core 0.6.4", +] + +[[package]] +name = "signature" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +dependencies = [ + "digest 0.10.6", + "rand_core 0.6.4", +] + +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "slot-range-helper" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "enumn", + "parity-scale-codec", + "paste", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "slotmap" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +dependencies = [ + "version_check", +] + +[[package]] +name = "sluice" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" +dependencies = [ + "async-channel", + "futures-core", + "futures-io", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "snap" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831" + +[[package]] +name = "snow" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ccba027ba85743e09d15c03296797cad56395089b832b48b5a5217880f57733" +dependencies = [ + "aes-gcm 0.9.4", + "blake2", + "chacha20poly1305", + "curve25519-dalek 4.0.0-rc.1", + "rand_core 0.6.4", + "ring", + "rustc_version", + "sha2 0.10.6", + "subtle", +] + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes", + "flate2", + "futures", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha-1", +] + +[[package]] +name = "sp-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "hash-db", + "log", + "parity-scale-codec", + "scale-info", + "sp-api-proc-macro", + "sp-core", + "sp-metadata-ir", + "sp-runtime", + "sp-state-machine", + "sp-std 5.0.0", + "sp-trie", + "sp-version", + "thiserror", +] + +[[package]] +name = "sp-api-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "Inflector", + "blake2", + "expander 1.0.0", + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "sp-application-crypto" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-std 5.0.0", +] + +[[package]] +name = "sp-arithmetic" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-std 5.0.0", + "static_assertions", +] + +[[package]] +name = "sp-authority-discovery" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "sp-block-builder" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "sp-api", + "sp-inherents", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "sp-blockchain" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "futures", + "log", + "lru 0.8.1", + "parity-scale-codec", + "parking_lot 0.12.1", + "sp-api", + "sp-consensus", + "sp-database", + "sp-runtime", + "sp-state-machine", + "thiserror", +] + +[[package]] +name = "sp-consensus" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "futures", + "log", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "thiserror", +] + +[[package]] +name = "sp-consensus-aura" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-consensus", + "sp-consensus-slots", + "sp-inherents", + "sp-runtime", + "sp-std 5.0.0", + "sp-timestamp", +] + +[[package]] +name = "sp-consensus-babe" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-consensus", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-std 5.0.0", + "sp-timestamp", +] + +[[package]] +name = "sp-consensus-beefy" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "lazy_static", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-mmr-primitives", + "sp-runtime", + "sp-std 5.0.0", + "strum", +] + +[[package]] +name = "sp-consensus-grandpa" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "finality-grandpa", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "sp-consensus-slots" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-std 5.0.0", + "sp-timestamp", +] + +[[package]] +name = "sp-core" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "array-bytes 4.2.0", + "bitflags", + "blake2", + "bounded-collections", + "bs58", + "dyn-clonable", + "ed25519-zebra", + "futures", + "hash-db", + "hash256-std-hasher", + "impl-serde", + "lazy_static", + "libsecp256k1", + "log", + "merlin", + "parity-scale-codec", + "parking_lot 0.12.1", + "paste", + "primitive-types", + "rand 0.8.5", + "regex", + "scale-info", + "schnorrkel", + "secp256k1", + "secrecy", + "serde", + "sp-core-hashing 5.0.0", + "sp-debug-derive", + "sp-externalities", + "sp-runtime-interface", + "sp-std 5.0.0", + "sp-storage", + "ss58-registry", + "substrate-bip39", + "thiserror", + "tiny-bip39", + "zeroize", +] + +[[package]] +name = "sp-core-hashing" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "blake2b_simd", + "byteorder", + "digest 0.10.6", + "sha2 0.10.6", + "sha3", + "sp-std 5.0.0", + "twox-hash", +] + +[[package]] +name = "sp-core-hashing" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27449abdfbe41b473e625bce8113745e81d65777dd1d5a8462cf24137930dad8" +dependencies = [ + "blake2b_simd", + "byteorder", + "digest 0.10.6", + "sha2 0.10.6", + "sha3", + "sp-std 7.0.0", + "twox-hash", +] + +[[package]] +name = "sp-core-hashing-proc-macro" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "sp-core-hashing 5.0.0", + "syn 2.0.16", +] + +[[package]] +name = "sp-database" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "kvdb", + "parking_lot 0.12.1", +] + +[[package]] +name = "sp-debug-derive" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "sp-externalities" +version = "0.13.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std 5.0.0", + "sp-storage", +] + +[[package]] +name = "sp-inherents" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", + "thiserror", +] + +[[package]] +name = "sp-io" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "bytes", + "ed25519", + "ed25519-dalek", + "futures", + "libsecp256k1", + "log", + "parity-scale-codec", + "rustversion", + "secp256k1", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-runtime-interface", + "sp-state-machine", + "sp-std 5.0.0", + "sp-tracing", + "sp-trie", + "tracing", + "tracing-core", +] + +[[package]] +name = "sp-keyring" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "lazy_static", + "sp-core", + "sp-runtime", + "strum", +] + +[[package]] +name = "sp-keystore" +version = "0.13.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "futures", + "parity-scale-codec", + "parking_lot 0.12.1", + "serde", + "sp-core", + "sp-externalities", + "thiserror", +] + +[[package]] +name = "sp-maybe-compressed-blob" +version = "4.1.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "thiserror", + "zstd 0.12.3+zstd.1.5.2", +] + +[[package]] +name = "sp-metadata-ir" +version = "0.1.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-metadata", + "parity-scale-codec", + "scale-info", + "sp-std 5.0.0", +] + +[[package]] +name = "sp-mmr-primitives" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "ckb-merkle-mountain-range 0.5.2", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-core", + "sp-debug-derive", + "sp-runtime", + "sp-std 5.0.0", + "thiserror", +] + +[[package]] +name = "sp-npos-elections" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "sp-offchain" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "sp-api", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "sp-panic-handler" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "backtrace", + "lazy_static", + "regex", +] + +[[package]] +name = "sp-rpc" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "rustc-hash", + "serde", + "sp-core", +] + +[[package]] +name = "sp-runtime" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "paste", + "rand 0.8.5", + "scale-info", + "serde", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-std 5.0.0", + "sp-weights", +] + +[[package]] +name = "sp-runtime-interface" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities", + "sp-runtime-interface-proc-macro", + "sp-std 5.0.0", + "sp-storage", + "sp-tracing", + "sp-wasm-interface", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "Inflector", + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "sp-session" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-runtime", + "sp-staking", + "sp-std 5.0.0", +] + +[[package]] +name = "sp-staking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std 5.0.0", +] + +[[package]] +name = "sp-state-machine" +version = "0.13.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "hash-db", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.8.5", + "smallvec", + "sp-core", + "sp-externalities", + "sp-panic-handler", + "sp-std 5.0.0", + "sp-trie", + "thiserror", + "tracing", +] + +[[package]] +name = "sp-statement-store" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "log", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-externalities", + "sp-runtime", + "sp-runtime-interface", + "sp-std 5.0.0", + "thiserror", +] + +[[package]] +name = "sp-std" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" + +[[package]] +name = "sp-std" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de8eef39962b5b97478719c493bed2926cf70cb621005bbf68ebe58252ff986" + +[[package]] +name = "sp-storage" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive", + "sp-std 5.0.0", +] + +[[package]] +name = "sp-timestamp" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "futures-timer", + "log", + "parity-scale-codec", + "sp-inherents", + "sp-runtime", + "sp-std 5.0.0", + "thiserror", +] + +[[package]] +name = "sp-tracing" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "sp-std 5.0.0", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "sp-transaction-pool" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "sp-api", + "sp-runtime", +] + +[[package]] +name = "sp-transaction-storage-proof" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-std 5.0.0", + "sp-trie", +] + +[[package]] +name = "sp-trie" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "ahash 0.8.3", + "hash-db", + "hashbrown 0.13.2", + "lazy_static", + "memory-db", + "nohash-hasher", + "parity-scale-codec", + "parking_lot 0.12.1", + "scale-info", + "schnellru", + "sp-core", + "sp-std 5.0.0", + "thiserror", + "tracing", + "trie-db", + "trie-root", +] + +[[package]] +name = "sp-version" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "parity-wasm", + "scale-info", + "serde", + "sp-core-hashing-proc-macro", + "sp-runtime", + "sp-std 5.0.0", + "sp-version-proc-macro", + "thiserror", +] + +[[package]] +name = "sp-version-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "sp-wasm-interface" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "anyhow", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-std 5.0.0", + "wasmi", + "wasmtime", +] + +[[package]] +name = "sp-weights" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "smallvec", + "sp-arithmetic", + "sp-core", + "sp-debug-derive", + "sp-std 5.0.0", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spinners" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08615eea740067d9899969bc2891c68a19c315cb1f66640af9a9ecb91b13bcab" +dependencies = [ + "lazy_static", + "maplit", + "strum", +] + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + +[[package]] +name = "spki" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +dependencies = [ + "base64ct", + "der 0.7.5", +] + +[[package]] +name = "ss58-registry" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47a8ad42e5fc72d5b1eb104a5546937eaf39843499948bb666d6e93c62423b" +dependencies = [ + "Inflector", + "num-format", + "proc-macro2 1.0.57", + "quote 1.0.27", + "serde", + "serde_json", + "unicode-xid 0.2.4", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "static_init" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11b73400442027c4adedda20a9f9b7945234a5bd8d5f7e86da22bd5d0622369c" +dependencies = [ + "cfg_aliases", + "libc", + "parking_lot 0.11.2", + "static_init_macro 0.5.0", +] + +[[package]] +name = "static_init" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6" +dependencies = [ + "bitflags", + "cfg_aliases", + "libc", + "parking_lot 0.11.2", + "parking_lot_core 0.8.6", + "static_init_macro 1.0.2", + "winapi", +] + +[[package]] +name = "static_init_macro" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2261c91034a1edc3fc4d1b80e89d82714faede0515c14a75da10cb941546bbf" +dependencies = [ + "cfg_aliases", + "memchr", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "static_init_macro" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf" +dependencies = [ + "cfg_aliases", + "memchr", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "storage-proof-fuzzer" +version = "0.1.0" +dependencies = [ + "bp-runtime", + "env_logger", + "honggfuzz", + "log", + "sp-core", + "sp-runtime", + "sp-state-machine", + "sp-std 5.0.0", + "sp-trie", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "structopt" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" +dependencies = [ + "clap 2.34.0", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +dependencies = [ + "heck 0.3.3", + "proc-macro-error", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", +] + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck 0.4.1", + "proc-macro2 1.0.57", + "quote 1.0.27", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "stun" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e94b1ec00bad60e6410e058b52f1c66de3dc5fe4d62d09b3e52bb7d3b73e25" +dependencies = [ + "base64 0.13.1", + "crc", + "lazy_static", + "md-5", + "rand 0.8.5", + "ring", + "subtle", + "thiserror", + "tokio", + "url", + "webrtc-util", +] + +[[package]] +name = "substrate-bip39" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" +dependencies = [ + "hmac 0.11.0", + "pbkdf2 0.8.0", + "schnorrkel", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "substrate-build-script-utils" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "platforms 2.0.0", +] + +[[package]] +name = "substrate-frame-rpc-system" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "frame-system-rpc-runtime-api", + "futures", + "jsonrpsee 0.16.2", + "log", + "parity-scale-codec", + "sc-rpc-api", + "sc-transaction-pool-api", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "substrate-prometheus-endpoint" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "hyper", + "log", + "prometheus", + "thiserror", + "tokio", +] + +[[package]] +name = "substrate-relay" +version = "1.0.1" +dependencies = [ + "anyhow", + "async-std", + "async-trait", + "bp-header-chain", + "bp-messages", + "bp-millau", + "bp-parachains", + "bp-polkadot-core", + "bp-rialto", + "bp-rialto-parachain", + "bp-runtime", + "bp-test-utils", + "bridge-runtime-common", + "finality-grandpa", + "frame-support", + "futures", + "hex", + "hex-literal", + "log", + "millau-runtime", + "num-format", + "num-traits", + "pallet-bridge-parachains", + "parachains-relay", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", + "rbtag", + "relay-bridge-hub-kusama-client", + "relay-bridge-hub-polkadot-client", + "relay-bridge-hub-rococo-client", + "relay-bridge-hub-wococo-client", + "relay-kusama-client", + "relay-millau-client", + "relay-polkadot-client", + "relay-rialto-client", + "relay-rialto-parachain-client", + "relay-rococo-client", + "relay-substrate-client", + "relay-utils", + "relay-westend-client", + "relay-wococo-client", + "rialto-parachain-runtime", + "rialto-runtime", + "signal-hook", + "signal-hook-async-std", + "sp-core", + "sp-keyring", + "sp-runtime", + "structopt", + "strum", + "substrate-relay-helper", + "tempfile", + "xcm", + "xcm-executor", +] + +[[package]] +name = "substrate-relay-helper" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-std", + "async-trait", + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-relayers", + "bp-rialto", + "bp-rialto-parachain", + "bp-rococo", + "bp-runtime", + "bp-wococo", + "bridge-runtime-common", + "finality-grandpa", + "finality-relay", + "frame-support", + "frame-system", + "futures", + "hex", + "log", + "messages-relay", + "num-traits", + "pallet-balances", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-transaction-payment", + "parachains-relay", + "parity-scale-codec", + "relay-rialto-client", + "relay-rococo-client", + "relay-substrate-client", + "relay-utils", + "relay-wococo-client", + "rialto-runtime", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "substrate-rpc-client" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "jsonrpsee 0.16.2", + "log", + "sc-rpc-api", + "serde", + "sp-runtime", +] + +[[package]] +name = "substrate-state-trie-migration-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "jsonrpsee 0.16.2", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-rpc-api", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-state-machine", + "sp-trie", + "trie-db", +] + +[[package]] +name = "substrate-wasm-builder" +version = "5.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "ansi_term", + "build-helper", + "cargo_metadata", + "filetime", + "sp-maybe-compressed-blob", + "strum", + "tempfile", + "toml 0.7.3", + "walkdir", + "wasm-opt", +] + +[[package]] +name = "substring" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" +dependencies = [ + "autocfg", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "subxt" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b9c4ddefcb2d87eb18a6336f65635c29208f766d0deefaa2a1a19f7426a993" +dependencies = [ + "base58", + "blake2", + "derivative", + "either", + "frame-metadata", + "futures", + "getrandom 0.2.9", + "hex", + "impl-serde", + "parity-scale-codec", + "parking_lot 0.12.1", + "primitive-types", + "scale-bits", + "scale-decode", + "scale-encode", + "scale-info", + "scale-value", + "serde", + "serde_json", + "sp-core-hashing 8.0.0", + "subxt-macro", + "subxt-metadata", + "thiserror", + "tracing", +] + +[[package]] +name = "subxt-codegen" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e924f41069e9273236398ff89662d6d336468a5d94faac812129d44547db0e7f" +dependencies = [ + "darling", + "frame-metadata", + "heck 0.4.1", + "hex", + "jsonrpsee 0.16.2", + "parity-scale-codec", + "proc-macro2 1.0.57", + "quote 1.0.27", + "scale-info", + "subxt-metadata", + "syn 1.0.109", + "thiserror", + "tokio", +] + +[[package]] +name = "subxt-macro" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced0b043a069ee039f8700d3dfda01be156e4229c82277c305bc8e79a7dd855d" +dependencies = [ + "darling", + "proc-macro-error", + "subxt-codegen", + "syn 1.0.109", +] + +[[package]] +name = "subxt-metadata" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18be3b8f4308fe7369ee1df66ae59c2eca79de20eab57b0f41c75736e843300f" +dependencies = [ + "frame-metadata", + "parity-scale-codec", + "scale-info", + "sp-core-hashing 8.0.0", +] + +[[package]] +name = "syn" +version = "0.15.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid 0.1.0", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 1.0.109", + "unicode-xid 0.2.4", +] + +[[package]] +name = "sysinfo" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02f1dc6930a439cc5d154221b5387d153f8183529b07c19aca24ea31e0a167e1" +dependencies = [ + "cfg-if 1.0.0", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "rayon", + "winapi", +] + +[[package]] +name = "system-configuration" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" + +[[package]] +name = "tempfile" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +dependencies = [ + "cfg-if 1.0.0", + "fastrand", + "redox_syscall 0.3.5", + "rustix 0.37.19", + "windows-sys 0.45.0", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "termtree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "thousands" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if 1.0.0", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "thrift" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b82ca8f46f95b3ce96081fe3dd89160fdea970c254bb72925255d1b62aae692e" +dependencies = [ + "byteorder", + "integer-encoding", + "log", + "ordered-float", + "threadpool", +] + +[[package]] +name = "tikv-jemalloc-ctl" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e37706572f4b151dff7a0146e040804e9c26fe3a3118591112f05cf12a4216c1" +dependencies = [ + "libc", + "paste", + "tikv-jemalloc-sys", +] + +[[package]] +name = "tikv-jemalloc-sys" +version = "0.5.3+5.3.0-patched" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a678df20055b43e57ef8cddde41cdfda9a3c1a060b67f4c5836dfb1d78543ba8" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "time" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" +dependencies = [ + "itoa", + "libc", + "num_threads", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +dependencies = [ + "time-core", +] + +[[package]] +name = "tiny-bip39" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" +dependencies = [ + "anyhow", + "hmac 0.12.1", + "once_cell", + "pbkdf2 0.11.0", + "rand 0.8.5", + "rustc-hash", + "sha2 0.10.6", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" +dependencies = [ + "autocfg", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot 0.12.1", + "pin-project-lite 0.2.9", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls 0.20.8", + "tokio", + "webpki 0.22.0", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0d409377ff5b1e3ca6437aa86c1eb7d40c134bfec254e44c830defa92669db5" +dependencies = [ + "rustls 0.21.1", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite 0.2.9", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite 0.2.9", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d1d42a9b3f3ec46ba828e8d376aec14592ea199f70a06a548587ecd1c4ab658" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "pin-project-lite 0.2.9", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if 1.0.0", + "log", + "pin-project-lite 0.2.9", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-gum" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "polkadot-node-jaeger", + "polkadot-primitives", + "tracing", + "tracing-gum-proc-macro", +] + +[[package]] +name = "tracing-gum-proc-macro" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "expander 2.0.0", + "proc-macro-crate", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "ansi_term", + "chrono", + "lazy_static", + "matchers", + "parking_lot 0.11.2", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "trie-db" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "767abe6ffed88a1889671a102c2861ae742726f52e0a5a425b92c9fbfa7e9c85" +dependencies = [ + "hash-db", + "hashbrown 0.13.2", + "log", + "rustc-hex", + "smallvec", +] + +[[package]] +name = "trie-root" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ed310ef5ab98f5fa467900ed906cb9232dd5376597e00fd4cba2a449d06c0b" +dependencies = [ + "hash-db", +] + +[[package]] +name = "trust-dns-proto" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" +dependencies = [ + "async-trait", + "cfg-if 1.0.0", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.2.3", + "ipnet", + "lazy_static", + "rand 0.8.5", + "smallvec", + "socket2", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" +dependencies = [ + "cfg-if 1.0.0", + "futures-util", + "ipconfig", + "lazy_static", + "lru-cache", + "parking_lot 0.12.1", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", + "trust-dns-proto", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "try-runtime-cli" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" +dependencies = [ + "async-trait", + "clap 4.2.7", + "frame-remote-externalities", + "hex", + "log", + "parity-scale-codec", + "sc-cli", + "sc-executor", + "sc-service", + "serde", + "serde_json", + "sp-api", + "sp-consensus-aura", + "sp-consensus-babe", + "sp-core", + "sp-debug-derive", + "sp-externalities", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-rpc", + "sp-runtime", + "sp-state-machine", + "sp-timestamp", + "sp-transaction-storage-proof", + "sp-version", + "sp-weights", + "substrate-rpc-client", + "zstd 0.12.3+zstd.1.5.2", +] + +[[package]] +name = "tt-call" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f195fd851901624eee5a58c4bb2b4f06399148fcd0ed336e6f1cb60a9881df" + +[[package]] +name = "turn" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4712ee30d123ec7ae26d1e1b218395a16c87cdbaf4b3925d170d684af62ea5e8" +dependencies = [ + "async-trait", + "base64 0.13.1", + "futures", + "log", + "md-5", + "rand 0.8.5", + "ring", + "stun", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if 0.1.10", + "digest 0.10.6", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "ucd-trie" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array 0.14.7", + "subtle", +] + +[[package]] +name = "universal-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "unsigned-varint" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures-io", + "futures-util", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna 0.3.0", + "percent-encoding", +] + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "uuid" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345444e32442451b267fc254ae85a209c64be56d2890e601a0c37ff0c3c5ecd2" +dependencies = [ + "getrandom 0.2.9", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "value-bag" +version = "1.0.0-alpha.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" +dependencies = [ + "ctor", + "version_check", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "waitgroup" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" +dependencies = [ + "atomic-waker", +] + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +dependencies = [ + "quote 1.0.27", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" + +[[package]] +name = "wasm-instrument" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa1dafb3e60065305741e83db35c6c2584bb3725b692b5b66148a38d72ace6cd" +dependencies = [ + "parity-wasm", +] + +[[package]] +name = "wasm-opt" +version = "0.112.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fef6d0d508f08334e0ab0e6877feb4c0ecb3956bcf2cb950699b22fedf3e9c" +dependencies = [ + "anyhow", + "libc", + "strum", + "strum_macros", + "tempfile", + "thiserror", + "wasm-opt-cxx-sys", + "wasm-opt-sys", +] + +[[package]] +name = "wasm-opt-cxx-sys" +version = "0.112.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc816bbc1596c8f2e8127e137a760c798023ef3d378f2ae51f0f1840e2dfa445" +dependencies = [ + "anyhow", + "cxx", + "cxx-build", + "wasm-opt-sys", +] + +[[package]] +name = "wasm-opt-sys" +version = "0.112.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40199e4f68ef1071b3c6d0bd8026a12b481865d4b9e49c156932ea9a6234dd14" +dependencies = [ + "anyhow", + "cc", + "cxx", + "cxx-build", +] + +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmi" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c326c93fbf86419608361a2c925a31754cf109da1b8b55737070b4d6669422" +dependencies = [ + "parity-wasm", + "wasmi-validation", + "wasmi_core", +] + +[[package]] +name = "wasmi-validation" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ff416ad1ff0c42e5a926ed5d5fab74c0f098749aa0ad8b2a34b982ce0e867b" +dependencies = [ + "parity-wasm", +] + +[[package]] +name = "wasmi_core" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d20cb3c59b788653d99541c646c561c9dd26506f25c0cebfe810659c54c6d7" +dependencies = [ + "downcast-rs", + "libm 0.2.7", + "memory_units", + "num-rational", + "num-traits", + "region", +] + +[[package]] +name = "wasmparser" +version = "0.100.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b20236ab624147dfbb62cf12a19aaf66af0e41b8398838b66e997d07d269d4" +dependencies = [ + "indexmap", + "url", +] + +[[package]] +name = "wasmtime" +version = "6.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a222f5fa1e14b2cefc286f1b68494d7a965f4bf57ec04c59bb62673d639af6" +dependencies = [ + "anyhow", + "bincode", + "cfg-if 1.0.0", + "indexmap", + "libc", + "log", + "object 0.29.0", + "once_cell", + "paste", + "psm", + "rayon", + "serde", + "target-lexicon", + "wasmparser", + "wasmtime-cache", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-runtime", + "windows-sys 0.42.0", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "6.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4407a7246e7d2f3d8fb1cf0c72fda8dbafdb6dd34d555ae8bea0e5ae031089cc" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "wasmtime-cache" +version = "6.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ceb3adf61d654be0be67fffdce42447b0880481348785be5fe40b5dd7663a4c" +dependencies = [ + "anyhow", + "base64 0.13.1", + "bincode", + "directories-next", + "file-per-thread-logger", + "log", + "rustix 0.36.13", + "serde", + "sha2 0.10.6", + "toml 0.5.11", + "windows-sys 0.42.0", + "zstd 0.11.2+zstd.1.5.2", +] + +[[package]] +name = "wasmtime-cranelift" +version = "6.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c366bb8647e01fd08cb5589976284b00abfded5529b33d7e7f3f086c68304a4" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli 0.26.2", + "log", + "object 0.29.0", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-environ" +version = "6.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b8b50962eae38ee319f7b24900b7cf371f03eebdc17400c1dc8575fc10c9a7" +dependencies = [ + "anyhow", + "cranelift-entity", + "gimli 0.26.2", + "indexmap", + "log", + "object 0.29.0", + "serde", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-jit" +version = "6.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffaed4f9a234ba5225d8e64eac7b4a5d13b994aeb37353cde2cbeb3febda9eaa" +dependencies = [ + "addr2line 0.17.0", + "anyhow", + "bincode", + "cfg-if 1.0.0", + "cpp_demangle", + "gimli 0.26.2", + "log", + "object 0.29.0", + "rustc-demangle", + "serde", + "target-lexicon", + "wasmtime-environ", + "wasmtime-jit-debug", + "wasmtime-jit-icache-coherence", + "wasmtime-runtime", + "windows-sys 0.42.0", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "6.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed41cbcbf74ce3ff6f1d07d1b707888166dc408d1a880f651268f4f7c9194b2" +dependencies = [ + "object 0.29.0", + "once_cell", + "rustix 0.36.13", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "6.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a28ae1e648461bfdbb79db3efdaee1bca5b940872e4175390f465593a2e54c" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "windows-sys 0.42.0", +] + +[[package]] +name = "wasmtime-runtime" +version = "6.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e704b126e4252788ccfc3526d4d4511d4b23c521bf123e447ac726c14545217b" +dependencies = [ + "anyhow", + "cc", + "cfg-if 1.0.0", + "indexmap", + "libc", + "log", + "mach", + "memfd", + "memoffset 0.6.5", + "paste", + "rand 0.8.5", + "rustix 0.36.13", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-jit-debug", + "windows-sys 0.42.0", +] + +[[package]] +name = "wasmtime-types" +version = "6.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e5572c5727c1ee7e8f28717aaa8400e4d22dcbd714ea5457d85b5005206568" +dependencies = [ + "cranelift-entity", + "serde", + "thiserror", + "wasmparser", +] + +[[package]] +name = "web-sys" +version = "0.3.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki 0.22.0", +] + +[[package]] +name = "webrtc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3bc9049bdb2cea52f5fd4f6f728184225bdb867ed0dc2410eab6df5bdd67bb" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "hex", + "interceptor", + "lazy_static", + "log", + "rand 0.8.5", + "rcgen 0.9.3", + "regex", + "ring", + "rtcp", + "rtp", + "rustls 0.19.1", + "sdp", + "serde", + "serde_json", + "sha2 0.10.6", + "stun", + "thiserror", + "time 0.3.21", + "tokio", + "turn", + "url", + "waitgroup", + "webrtc-data", + "webrtc-dtls", + "webrtc-ice", + "webrtc-mdns", + "webrtc-media", + "webrtc-sctp", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "webrtc-data" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef36a4d12baa6e842582fe9ec16a57184ba35e1a09308307b67d43ec8883100" +dependencies = [ + "bytes", + "derive_builder", + "log", + "thiserror", + "tokio", + "webrtc-sctp", + "webrtc-util", +] + +[[package]] +name = "webrtc-dtls" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942be5bd85f072c3128396f6e5a9bfb93ca8c1939ded735d177b7bcba9a13d05" +dependencies = [ + "aes 0.6.0", + "aes-gcm 0.10.1", + "async-trait", + "bincode", + "block-modes", + "byteorder", + "ccm", + "curve25519-dalek 3.2.0", + "der-parser 8.2.0", + "elliptic-curve 0.12.3", + "hkdf", + "hmac 0.12.1", + "log", + "oid-registry 0.6.1", + "p256", + "p384", + "rand 0.8.5", + "rand_core 0.6.4", + "rcgen 0.9.3", + "ring", + "rustls 0.19.1", + "sec1 0.3.0", + "serde", + "sha1", + "sha2 0.10.6", + "signature 1.6.4", + "subtle", + "thiserror", + "tokio", + "webpki 0.21.4", + "webrtc-util", + "x25519-dalek 2.0.0-pre.1", + "x509-parser 0.13.2", +] + +[[package]] +name = "webrtc-ice" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465a03cc11e9a7d7b4f9f99870558fe37a102b65b93f8045392fef7c67b39e80" +dependencies = [ + "arc-swap", + "async-trait", + "crc", + "log", + "rand 0.8.5", + "serde", + "serde_json", + "stun", + "thiserror", + "tokio", + "turn", + "url", + "uuid", + "waitgroup", + "webrtc-mdns", + "webrtc-util", +] + +[[package]] +name = "webrtc-mdns" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f08dfd7a6e3987e255c4dbe710dde5d94d0f0574f8a21afa95d171376c143106" +dependencies = [ + "log", + "socket2", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-media" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f72e1650a8ae006017d1a5280efb49e2610c19ccc3c0905b03b648aee9554991" +dependencies = [ + "byteorder", + "bytes", + "rand 0.8.5", + "rtp", + "thiserror", +] + +[[package]] +name = "webrtc-sctp" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d47adcd9427eb3ede33d5a7f3424038f63c965491beafcc20bc650a2f6679c0" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "crc", + "log", + "rand 0.8.5", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-srtp" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6183edc4c1c6c0175f8812eefdce84dfa0aea9c3ece71c2bf6ddd3c964de3da5" +dependencies = [ + "aead 0.4.3", + "aes 0.7.5", + "aes-gcm 0.9.4", + "async-trait", + "byteorder", + "bytes", + "ctr 0.8.0", + "hmac 0.11.0", + "log", + "rtcp", + "rtp", + "sha-1", + "subtle", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-util" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87" +dependencies = [ + "async-trait", + "bitflags", + "bytes", + "cc", + "ipnet", + "lazy_static", + "libc", + "log", + "nix", + "rand 0.8.5", + "thiserror", + "tokio", + "winapi", +] + +[[package]] +name = "westend-runtime" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bitvec", + "frame-benchmarking", + "frame-election-provider-support", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal", + "log", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-bags-list", + "pallet-balances", + "pallet-collective", + "pallet-democracy", + "pallet-election-provider-multi-phase", + "pallet-election-provider-support-benchmarking", + "pallet-elections-phragmen", + "pallet-fast-unstake", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-membership", + "pallet-multisig", + "pallet-nomination-pools", + "pallet-nomination-pools-benchmarking", + "pallet-nomination-pools-runtime-api", + "pallet-offences", + "pallet-offences-benchmarking", + "pallet-preimage", + "pallet-proxy", + "pallet-recovery", + "pallet-scheduler", + "pallet-session", + "pallet-session-benchmarking", + "pallet-society", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-staking-runtime-api", + "pallet-state-trie-migration", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", + "pallet-utility", + "pallet-vesting", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", + "rustc-hex", + "scale-info", + "serde", + "serde_derive", + "smallvec", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-core", + "sp-inherents", + "sp-io", + "sp-mmr-primitives", + "sp-npos-elections", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 5.0.0", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder", + "westend-runtime-constants", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "westend-runtime-constants" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "frame-support", + "polkadot-primitives", + "polkadot-runtime-common", + "smallvec", + "sp-core", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + +[[package]] +name = "wide" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b689b6c49d6549434bf944e6b0f39238cf63693cb7a147e9d887507fffa3b223" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" +dependencies = [ + "windows_aarch64_msvc 0.34.0", + "windows_i686_gnu 0.34.0", + "windows_i686_msvc 0.34.0", + "windows_x86_64_gnu 0.34.0", + "windows_x86_64_msvc 0.34.0", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winnow" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x25519-dalek" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" +dependencies = [ + "curve25519-dalek 3.2.0", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "x25519-dalek" +version = "2.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5da623d8af10a62342bcbbb230e33e58a63255a58012f8653c578e54bab48df" +dependencies = [ + "curve25519-dalek 3.2.0", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9bace5b5589ffead1afb76e43e34cff39cd0f3ce7e170ae0c29e53b88eb1c" +dependencies = [ + "asn1-rs 0.3.1", + "base64 0.13.1", + "data-encoding", + "der-parser 7.0.0", + "lazy_static", + "nom", + "oid-registry 0.4.0", + "ring", + "rusticata-macros", + "thiserror", + "time 0.3.21", +] + +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs 0.5.2", + "base64 0.13.1", + "data-encoding", + "der-parser 8.2.0", + "lazy_static", + "nom", + "oid-registry 0.6.1", + "rusticata-macros", + "thiserror", + "time 0.3.21", +] + +[[package]] +name = "xcm" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "bounded-collections", + "derivative", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-weights", + "xcm-procedural", +] + +[[package]] +name = "xcm-builder" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-transaction-payment", + "parity-scale-codec", + "polkadot-parachain", + "scale-info", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "xcm", + "xcm-executor", +] + +[[package]] +name = "xcm-executor" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "environmental", + "frame-benchmarking", + "frame-support", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 5.0.0", + "sp-weights", + "xcm", +] + +[[package]] +name = "xcm-procedural" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +dependencies = [ + "Inflector", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "yamux" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d9ba232399af1783a58d8eb26f6b5006fbefe2dc9ef36bd283324792d03ea5" +dependencies = [ + "futures", + "log", + "nohash-hasher", + "parking_lot 0.12.1", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "yap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2a7eb6d82a11e4d0b8e6bda8347169aff4ccd8235d039bba7c47482d977dcf7" + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time 0.3.21", +] + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe 5.0.2+zstd.1.5.2", +] + +[[package]] +name = "zstd" +version = "0.12.3+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" +dependencies = [ + "zstd-safe 6.0.5+zstd.1.5.4", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-safe" +version = "6.0.5+zstd.1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.8+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +dependencies = [ + "cc", + "libc", + "pkg-config", +] diff --git a/bridges/README.md b/bridges/README.md index aab6007d2cd..2f8c5ca9abb 100644 --- a/bridges/README.md +++ b/bridges/README.md @@ -242,7 +242,7 @@ To run a Rialto node for example, you can use the following command: ```bash docker run -p 30333:30333 -p 9933:9933 -p 9944:9944 \ -it paritytech/rialto-bridge-node --dev --tmp \ - --rpc-cors=all --unsafe-rpc-external --unsafe-ws-external + --rpc-cors=all --unsafe-rpc-external ``` ## Community diff --git a/bridges/bin/runtime-common/src/messages_benchmarking.rs b/bridges/bin/runtime-common/src/messages_benchmarking.rs index 9d90f12ed5c..b067523c305 100644 --- a/bridges/bin/runtime-common/src/messages_benchmarking.rs +++ b/bridges/bin/runtime-common/src/messages_benchmarking.rs @@ -182,7 +182,11 @@ where // update runtime storage let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::(state_root); - FromBridgedChainMessagesDeliveryProof { bridged_header_hash, storage_proof, lane } + FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: bridged_header_hash.into(), + storage_proof, + lane, + } } /// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call. @@ -207,7 +211,11 @@ where let (_, bridged_header_hash) = insert_header_to_parachains_pallet::>>(state_root); - FromBridgedChainMessagesDeliveryProof { bridged_header_hash, storage_proof, lane } + FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: bridged_header_hash.into(), + storage_proof, + lane, + } } /// Prepare in-memory message delivery proof, without inserting anything to the runtime storage. diff --git a/bridges/bin/runtime-common/src/parachains_benchmarking.rs b/bridges/bin/runtime-common/src/parachains_benchmarking.rs index 8a9b8547fbf..aad53673c3a 100644 --- a/bridges/bin/runtime-common/src/parachains_benchmarking.rs +++ b/bridges/bin/runtime-common/src/parachains_benchmarking.rs @@ -60,7 +60,7 @@ where TrieDBMutBuilderV1::::new(&mut mdb, &mut state_root).build(); // insert parachain heads - for (i, parachain) in parachains.iter().enumerate() { + for (i, parachain) in parachains.into_iter().enumerate() { let storage_key = parachain_head_storage_key_at_source(R::ParasPalletName::get(), *parachain); let leaf_data = if i == 0 { diff --git a/bridges/modules/messages/src/benchmarking.rs b/bridges/modules/messages/src/benchmarking.rs index 5a4d2de7000..04f64b53b30 100644 --- a/bridges/modules/messages/src/benchmarking.rs +++ b/bridges/modules/messages/src/benchmarking.rs @@ -139,7 +139,7 @@ benchmarks_instance_pallet! { }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) verify { assert_eq!( - crate::InboundLanes::::get(T::bench_lane_id()).last_delivered_nonce(), + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), 21, ); } @@ -172,7 +172,7 @@ benchmarks_instance_pallet! { }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 2, dispatch_weight) verify { assert_eq!( - crate::InboundLanes::::get(T::bench_lane_id()).last_delivered_nonce(), + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), 22, ); } @@ -208,7 +208,7 @@ benchmarks_instance_pallet! { }); }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) verify { - let lane_state = crate::InboundLanes::::get(T::bench_lane_id()); + let lane_state = crate::InboundLanes::::get(&T::bench_lane_id()); assert_eq!(lane_state.last_delivered_nonce(), 21); assert_eq!(lane_state.last_confirmed_nonce, 20); } @@ -240,7 +240,7 @@ benchmarks_instance_pallet! { }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) verify { assert_eq!( - crate::InboundLanes::::get(T::bench_lane_id()).last_delivered_nonce(), + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), 21, ); } @@ -274,7 +274,7 @@ benchmarks_instance_pallet! { }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) verify { assert_eq!( - crate::InboundLanes::::get(T::bench_lane_id()).last_delivered_nonce(), + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), 21, ); } @@ -432,7 +432,7 @@ benchmarks_instance_pallet! { }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) verify { assert_eq!( - crate::InboundLanes::::get(T::bench_lane_id()).last_delivered_nonce(), + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), 21, ); assert!(T::is_message_successfully_dispatched(21)); diff --git a/bridges/modules/messages/src/mock.rs b/bridges/modules/messages/src/mock.rs index fa3ce31f952..f0516fbc23f 100644 --- a/bridges/modules/messages/src/mock.rs +++ b/bridges/modules/messages/src/mock.rs @@ -185,7 +185,7 @@ impl crate::benchmarking::Config<()> for TestRuntime { // in mock run we only care about benchmarks correctness, not the benchmark results // => ignore size related arguments let (messages, total_dispatch_weight) = - params.message_nonces.map(|n| message(n, REGULAR_PAYLOAD)).fold( + params.message_nonces.into_iter().map(|n| message(n, REGULAR_PAYLOAD)).fold( (Vec::new(), Weight::zero()), |(mut messages, total_dispatch_weight), message| { let weight = REGULAR_PAYLOAD.declared_weight; diff --git a/bridges/modules/parachains/src/mock.rs b/bridges/modules/parachains/src/mock.rs index 3086adc1cc2..0a61d91d7b2 100644 --- a/bridges/modules/parachains/src/mock.rs +++ b/bridges/modules/parachains/src/mock.rs @@ -250,9 +250,10 @@ impl pallet_bridge_parachains::benchmarking::Config<()> for TestRuntime { ) { // in mock run we only care about benchmarks correctness, not the benchmark results // => ignore size related arguments - let (state_root, proof, parachains) = crate::tests::prepare_parachain_heads_proof( - parachains.iter().map(|p| (p.0, crate::tests::head_data(p.0, 1))).collect(), - ); + let (state_root, proof, parachains) = + bp_test_utils::prepare_parachain_heads_proof::( + parachains.iter().map(|p| (p.0, crate::tests::head_data(p.0, 1))).collect(), + ); let relay_genesis_hash = crate::tests::initialize(state_root); (0, relay_genesis_hash, proof, parachains) } diff --git a/bridges/modules/relayers/src/benchmarking.rs b/bridges/modules/relayers/src/benchmarking.rs index dfdecad31af..d66a11ff06d 100644 --- a/bridges/modules/relayers/src/benchmarking.rs +++ b/bridges/modules/relayers/src/benchmarking.rs @@ -104,7 +104,7 @@ benchmarks! { // create slash destination account let lane = LaneId([0, 0, 0, 0]); let slash_destination = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); - T::prepare_rewards_account(slash_destination, Zero::zero()); + T::prepare_rewards_account(slash_destination.clone(), Zero::zero()); }: { crate::Pallet::::slash_and_deregister(&relayer, slash_destination) } @@ -121,10 +121,10 @@ benchmarks! { let account_params = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); }: { - crate::Pallet::::register_relayer_reward(account_params, &relayer, One::one()); + crate::Pallet::::register_relayer_reward(account_params.clone(), &relayer, One::one()); } verify { - assert_eq!(RelayerRewards::::get(relayer, account_params), Some(One::one())); + assert_eq!(RelayerRewards::::get(relayer, &account_params), Some(One::one())); } impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) From 95f2c0cc901d472ffbfe14d99e88342a0f4642a3 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 19 May 2023 17:00:38 +0200 Subject: [PATCH 202/339] Removed Cargo.lock from subtreee (#2604) --- bridges/Cargo.lock | 15696 ------------------------------------------- 1 file changed, 15696 deletions(-) delete mode 100644 bridges/Cargo.lock diff --git a/bridges/Cargo.lock b/bridges/Cargo.lock deleted file mode 100644 index a4dc5e19a82..00000000000 --- a/bridges/Cargo.lock +++ /dev/null @@ -1,15696 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "addr2line" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" -dependencies = [ - "gimli 0.26.2", -] - -[[package]] -name = "addr2line" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" -dependencies = [ - "gimli 0.27.2", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "aead" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", -] - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array 0.14.7", -] - -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher 0.2.5", -] - -[[package]] -name = "aes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" -dependencies = [ - "cfg-if 1.0.0", - "cipher 0.3.0", - "cpufeatures", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aes" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" -dependencies = [ - "cfg-if 1.0.0", - "cipher 0.4.4", - "cpufeatures", -] - -[[package]] -name = "aes-gcm" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" -dependencies = [ - "aead 0.4.3", - "aes 0.7.5", - "cipher 0.3.0", - "ctr 0.8.0", - "ghash 0.4.4", - "subtle", -] - -[[package]] -name = "aes-gcm" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e1366e0c69c9f927b1fa5ce2c7bf9eafc8f9268c0b9800729e8b267612447c" -dependencies = [ - "aead 0.5.2", - "aes 0.8.2", - "cipher 0.4.4", - "ctr 0.9.2", - "ghash 0.5.0", - "subtle", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher 0.2.5", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher 0.2.5", - "opaque-debug 0.3.0", -] - -[[package]] -name = "ahash" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" -dependencies = [ - "getrandom 0.2.9", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if 1.0.0", - "getrandom 0.2.9", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" -dependencies = [ - "memchr", -] - -[[package]] -name = "aho-corasick" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" -dependencies = [ - "memchr", -] - -[[package]] -name = "always-assert" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4436e0292ab1bb631b42973c61205e704475fe8126af845c8d923c0996328127" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - -[[package]] -name = "anstream" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is-terminal", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" - -[[package]] -name = "anstyle-parse" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "anstyle-wincon" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" -dependencies = [ - "anstyle", - "windows-sys 0.48.0", -] - -[[package]] -name = "anyhow" -version = "1.0.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" - -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - -[[package]] -name = "arbitrary" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" - -[[package]] -name = "arc-swap" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" - -[[package]] -name = "array-bytes" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" - -[[package]] -name = "array-bytes" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b1c5a481ec30a5abd8dfbd94ab5cf1bb4e9a66be7f1b3b322f2f1170c200fd" - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "arrayvec" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" - -[[package]] -name = "asn1-rs" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ff05a702273012438132f449575dbc804e27b2f3cbe3069aa237d26c98fa33" -dependencies = [ - "asn1-rs-derive 0.1.0", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror", - "time 0.3.21", -] - -[[package]] -name = "asn1-rs" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" -dependencies = [ - "asn1-rs-derive 0.4.0", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror", - "time 0.3.21", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8b7511298d5b7784b40b092d9e9dcd3a627a5707e4b5e507931ab0d44eeebf" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "assert_matches" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - -[[package]] -name = "async-attributes" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" -dependencies = [ - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "async-channel" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-executor" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" -dependencies = [ - "async-lock", - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "slab", -] - -[[package]] -name = "async-global-executor" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" -dependencies = [ - "async-channel", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "once_cell", -] - -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock", - "autocfg", - "cfg-if 1.0.0", - "concurrent-queue", - "futures-lite", - "log", - "parking", - "polling", - "rustix 0.37.19", - "slab", - "socket2", - "waker-fn", -] - -[[package]] -name = "async-lock" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-recursion" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "async-std" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" -dependencies = [ - "async-attributes", - "async-channel", - "async-global-executor", - "async-io", - "async-lock", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite 0.2.9", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-task" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" - -[[package]] -name = "async-trait" -version = "0.1.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "asynchronous-codec" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182" -dependencies = [ - "bytes", - "futures-sink", - "futures-util", - "memchr", - "pin-project-lite 0.2.9", -] - -[[package]] -name = "atomic-waker" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backoff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" -dependencies = [ - "getrandom 0.2.9", - "instant", - "rand 0.8.5", -] - -[[package]] -name = "backtrace" -version = "0.3.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" -dependencies = [ - "addr2line 0.19.0", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide 0.6.2", - "object 0.30.3", - "rustc-demangle", -] - -[[package]] -name = "base-x" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" - -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base58" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "beef" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" -dependencies = [ - "serde", -] - -[[package]] -name = "binary-merkle-tree" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "hash-db", - "log", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bindgen" -version = "0.65.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "prettyplease 0.2.5", - "proc-macro2 1.0.57", - "quote 1.0.27", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.16", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest 0.10.6", -] - -[[package]] -name = "blake2b_simd" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" -dependencies = [ - "arrayref", - "arrayvec 0.7.2", - "constant_time_eq", -] - -[[package]] -name = "blake2s_simd" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637f448b9e61dfadbdcbae9a885fadee1f3eaffb1f8d3c1965d3ade8bdfd44f" -dependencies = [ - "arrayref", - "arrayvec 0.7.2", - "constant_time_eq", -] - -[[package]] -name = "blake3" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" -dependencies = [ - "arrayref", - "arrayvec 0.7.2", - "cc", - "cfg-if 1.0.0", - "constant_time_eq", - "digest 0.10.6", -] - -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding 0.1.5", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "block-modes" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" -dependencies = [ - "block-padding 0.2.1", - "cipher 0.2.5", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "blocking" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" -dependencies = [ - "async-channel", - "async-lock", - "async-task", - "atomic-waker", - "fastrand", - "futures-lite", - "log", -] - -[[package]] -name = "bounded-collections" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fbd1d11282a1eb134d3c3b7cf8ce213b5161c6e5f73fb1b98618482c606b64" -dependencies = [ - "log", - "parity-scale-codec", - "scale-info", - "serde", -] - -[[package]] -name = "bounded-vec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68534a48cbf63a4b1323c433cf21238c9ec23711e0df13b08c33e5c2082663ce" -dependencies = [ - "thiserror", -] - -[[package]] -name = "bp-beefy" -version = "0.1.0" -dependencies = [ - "binary-merkle-tree", - "bp-runtime", - "frame-support", - "pallet-beefy-mmr", - "pallet-mmr", - "parity-scale-codec", - "scale-info", - "serde", - "sp-consensus-beefy", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-bridge-hub-cumulus" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "frame-system", - "polkadot-primitives", - "sp-api", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-bridge-hub-kusama" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-cumulus", - "bp-messages", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-bridge-hub-polkadot" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-cumulus", - "bp-messages", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-bridge-hub-rococo" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-cumulus", - "bp-messages", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-bridge-hub-wococo" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-cumulus", - "bp-messages", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-header-chain" -version = "0.1.0" -dependencies = [ - "bp-runtime", - "bp-test-utils", - "finality-grandpa", - "frame-support", - "hex", - "hex-literal", - "parity-scale-codec", - "scale-info", - "serde", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-kusama" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "sp-api", -] - -[[package]] -name = "bp-messages" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-runtime", - "frame-support", - "hex", - "hex-literal", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-millau" -version = "0.1.0" -dependencies = [ - "bp-beefy", - "bp-header-chain", - "bp-messages", - "bp-runtime", - "fixed-hash", - "frame-support", - "frame-system", - "hash256-std-hasher", - "impl-codec", - "impl-serde", - "parity-util-mem", - "scale-info", - "serde", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "sp-trie", -] - -[[package]] -name = "bp-parachains" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-polkadot" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "sp-api", -] - -[[package]] -name = "bp-polkadot-core" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-runtime", - "frame-support", - "frame-system", - "hex", - "parity-scale-codec", - "parity-util-mem", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-relayers" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-runtime", - "frame-support", - "hex", - "hex-literal", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-rialto" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-messages", - "bp-runtime", - "frame-support", - "frame-system", - "sp-api", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-rialto-parachain" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-cumulus", - "bp-messages", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "frame-system", - "sp-api", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "bp-rococo" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "sp-api", -] - -[[package]] -name = "bp-runtime" -version = "0.1.0" -dependencies = [ - "frame-support", - "frame-system", - "hash-db", - "hex-literal", - "impl-trait-for-tuples", - "num-traits", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-state-machine", - "sp-std 5.0.0", - "sp-trie", - "trie-db", -] - -[[package]] -name = "bp-test-utils" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-parachains", - "bp-polkadot-core", - "bp-runtime", - "ed25519-dalek", - "finality-grandpa", - "parity-scale-codec", - "sp-application-crypto", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", - "sp-trie", -] - -[[package]] -name = "bp-westend" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "sp-api", -] - -[[package]] -name = "bp-wococo" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-rococo", - "bp-runtime", - "frame-support", - "sp-api", -] - -[[package]] -name = "bridge-runtime-common" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-messages", - "bp-parachains", - "bp-polkadot-core", - "bp-relayers", - "bp-runtime", - "bp-test-utils", - "frame-support", - "frame-system", - "hash-db", - "log", - "pallet-balances", - "pallet-bridge-grandpa", - "pallet-bridge-messages", - "pallet-bridge-parachains", - "pallet-bridge-relayers", - "pallet-transaction-payment", - "pallet-utility", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "sp-trie", - "static_assertions", - "xcm", - "xcm-builder", -] - -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - -[[package]] -name = "bstr" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "build-helper" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" -dependencies = [ - "semver 0.6.0", -] - -[[package]] -name = "bumpalo" -version = "3.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "bytemuck" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" - -[[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "camino" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.17", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "castaway" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" - -[[package]] -name = "cc" -version = "1.0.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" -dependencies = [ - "jobserver", -] - -[[package]] -name = "ccm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aca1a8fbc20b50ac9673ff014abfb2b5f4085ee1a850d408f14a159c5853ac7" -dependencies = [ - "aead 0.3.2", - "cipher 0.2.5", - "subtle", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-expr" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8790cf1286da485c72cf5fc7aeba308438800036ec67d89425924c4807268c9" -dependencies = [ - "smallvec", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - -[[package]] -name = "chacha20" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" -dependencies = [ - "cfg-if 1.0.0", - "cipher 0.3.0", - "cpufeatures", - "zeroize", -] - -[[package]] -name = "chacha20poly1305" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" -dependencies = [ - "aead 0.4.3", - "chacha20", - "cipher 0.3.0", - "poly1305", - "zeroize", -] - -[[package]] -name = "chrono" -version = "0.4.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-integer", - "num-traits", - "time 0.1.45", - "wasm-bindgen", - "winapi", -] - -[[package]] -name = "cid" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ed9c8b2d17acb8110c46f1da5bf4a696d745e1474a16db0cd2b49cd0249bf2" -dependencies = [ - "core2", - "multibase", - "multihash 0.16.3", - "serde", - "unsigned-varint", -] - -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "cipher" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "ckb-merkle-mountain-range" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f061f97d64fd1822664bdfb722f7ae5469a97b77567390f7442be5b5dc82a5b" -dependencies = [ - "cfg-if 0.1.10", -] - -[[package]] -name = "ckb-merkle-mountain-range" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ccb671c5921be8a84686e6212ca184cb1d7c51cadcdbfcbd1cc3f042f5dfb8" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "clang-sys" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", -] - -[[package]] -name = "clap" -version = "4.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" -dependencies = [ - "clap_builder", - "clap_derive", - "once_cell", -] - -[[package]] -name = "clap_builder" -version = "4.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" -dependencies = [ - "anstream", - "anstyle", - "bitflags", - "clap_lex", - "strsim 0.10.0", -] - -[[package]] -name = "clap_derive" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" -dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "clap_lex" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" - -[[package]] -name = "coarsetime" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90d114103adbc625300f346d4d09dfb4ab1c4a8df6868435dd903392ecf4354" -dependencies = [ - "libc", - "once_cell", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "comfy-table" -version = "6.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7b787b0dc42e8111badfdbe4c3059158ccb2db8780352fa1b01e8ccf45cc4d" -dependencies = [ - "strum", - "strum_macros", - "unicode-width", -] - -[[package]] -name = "concurrent-queue" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "console" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "unicode-width", - "windows-sys 0.42.0", -] - -[[package]] -name = "const-oid" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" - -[[package]] -name = "constant_time_eq" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "core2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" -dependencies = [ - "memchr", -] - -[[package]] -name = "cpp_demangle" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "cpu-time" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e393a7668fe1fad3075085b86c781883000b4ede868f43627b34a87c8b7ded" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "cpufeatures" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" -dependencies = [ - "libc", -] - -[[package]] -name = "cranelift-bforest" -version = "0.93.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc42ba2e232e5b20ff7dc299a812d53337dadce9a7e39a238e6a5cb82d2e57b" -dependencies = [ - "cranelift-entity", -] - -[[package]] -name = "cranelift-codegen" -version = "0.93.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "253531aca9b6f56103c9420369db3263e784df39aa1c90685a1f69cfbba0623e" -dependencies = [ - "arrayvec 0.7.2", - "bumpalo", - "cranelift-bforest", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-entity", - "cranelift-isle", - "gimli 0.26.2", - "hashbrown 0.12.3", - "log", - "regalloc2", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-codegen-meta" -version = "0.93.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f2154365e2bff1b1b8537a7181591fdff50d8e27fa6e40d5c69c3bad0ca7c8" -dependencies = [ - "cranelift-codegen-shared", -] - -[[package]] -name = "cranelift-codegen-shared" -version = "0.93.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687e14e3f5775248930e0d5a84195abef8b829958e9794bf8d525104993612b4" - -[[package]] -name = "cranelift-entity" -version = "0.93.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f42ea692c7b450ad18b8c9889661505d51c09ec4380cf1c2d278dbb2da22cae1" -dependencies = [ - "serde", -] - -[[package]] -name = "cranelift-frontend" -version = "0.93.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8483c2db6f45fe9ace984e5adc5d058102227e4c62e5aa2054e16b0275fd3a6e" -dependencies = [ - "cranelift-codegen", - "log", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-isle" -version = "0.93.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9793158837678902446c411741d87b43f57dadfb944f2440db4287cda8cbd59" - -[[package]] -name = "cranelift-native" -version = "0.93.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72668c7755f2b880665cb422c8ad2d56db58a88b9bebfef0b73edc2277c13c49" -dependencies = [ - "cranelift-codegen", - "libc", - "target-lexicon", -] - -[[package]] -name = "cranelift-wasm" -version = "0.93.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852ce4b088b44ac4e29459573943009a70d1b192c8d77ef949b4e814f656fc1" -dependencies = [ - "cranelift-codegen", - "cranelift-entity", - "cranelift-frontend", - "itertools", - "log", - "smallvec", - "wasmparser", - "wasmtime-types", -] - -[[package]] -name = "crc" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" -dependencies = [ - "autocfg", - "cfg-if 1.0.0", - "crossbeam-utils", - "memoffset 0.8.0", - "scopeguard", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-bigint" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array 0.14.7", - "subtle", -] - -[[package]] -name = "crypto-mac" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" -dependencies = [ - "generic-array 0.14.7", - "subtle", -] - -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "ctr" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" -dependencies = [ - "cipher 0.3.0", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher 0.4.4", -] - -[[package]] -name = "cumulus-client-cli" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "clap 4.2.7", - "parity-scale-codec", - "sc-chain-spec", - "sc-cli", - "sc-service", - "sp-core", - "sp-runtime", - "url", -] - -[[package]] -name = "cumulus-client-collator" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "cumulus-client-consensus-common", - "cumulus-client-network", - "cumulus-primitives-core", - "futures", - "parity-scale-codec", - "parking_lot 0.12.1", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-overseer", - "polkadot-primitives", - "sc-client-api", - "sp-api", - "sp-consensus", - "sp-core", - "sp-runtime", - "tracing", -] - -[[package]] -name = "cumulus-client-consensus-aura" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "async-trait", - "cumulus-client-collator", - "cumulus-client-consensus-common", - "cumulus-client-consensus-proposer", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-relay-chain-interface", - "futures", - "parity-scale-codec", - "polkadot-node-primitives", - "polkadot-overseer", - "polkadot-primitives", - "sc-client-api", - "sc-consensus", - "sc-consensus-aura", - "sc-consensus-slots", - "sc-telemetry", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "sp-state-machine", - "sp-timestamp", - "substrate-prometheus-endpoint", - "tracing", -] - -[[package]] -name = "cumulus-client-consensus-common" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "async-trait", - "cumulus-client-pov-recovery", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "dyn-clone", - "futures", - "log", - "parity-scale-codec", - "polkadot-primitives", - "sc-client-api", - "sc-consensus", - "schnellru", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", - "sp-trie", - "substrate-prometheus-endpoint", - "tracing", -] - -[[package]] -name = "cumulus-client-consensus-proposer" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "anyhow", - "async-trait", - "cumulus-primitives-parachain-inherent", - "sp-consensus", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "thiserror", -] - -[[package]] -name = "cumulus-client-network" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "async-trait", - "cumulus-relay-chain-interface", - "futures", - "futures-timer", - "parity-scale-codec", - "parking_lot 0.12.1", - "polkadot-node-primitives", - "polkadot-parachain", - "polkadot-primitives", - "sc-client-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", - "sp-state-machine", - "tracing", -] - -[[package]] -name = "cumulus-client-pov-recovery" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "futures", - "futures-timer", - "parity-scale-codec", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-overseer", - "polkadot-primitives", - "rand 0.8.5", - "sc-client-api", - "sc-consensus", - "sp-consensus", - "sp-maybe-compressed-blob", - "sp-runtime", - "tracing", -] - -[[package]] -name = "cumulus-client-service" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "cumulus-client-cli", - "cumulus-client-collator", - "cumulus-client-consensus-common", - "cumulus-client-network", - "cumulus-client-pov-recovery", - "cumulus-primitives-core", - "cumulus-relay-chain-inprocess-interface", - "cumulus-relay-chain-interface", - "cumulus-relay-chain-minimal-node", - "futures", - "polkadot-primitives", - "sc-client-api", - "sc-consensus", - "sc-network", - "sc-network-sync", - "sc-network-transactions", - "sc-rpc", - "sc-service", - "sc-sysinfo", - "sc-telemetry", - "sc-transaction-pool", - "sc-utils", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", - "sp-transaction-pool", -] - -[[package]] -name = "cumulus-pallet-aura-ext" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "frame-support", - "frame-system", - "pallet-aura", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-aura", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "cumulus-pallet-dmp-queue" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "xcm", -] - -[[package]] -name = "cumulus-pallet-parachain-system" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "bytes", - "cumulus-pallet-parachain-system-proc-macro", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "environmental", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "polkadot-parachain", - "scale-info", - "sp-core", - "sp-externalities", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-state-machine", - "sp-std 5.0.0", - "sp-trie", - "sp-version", - "xcm", -] - -[[package]] -name = "cumulus-pallet-parachain-system-proc-macro" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "cumulus-pallet-xcm" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "xcm", -] - -[[package]] -name = "cumulus-pallet-xcmp-queue" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "polkadot-runtime-common", - "rand_chacha 0.3.1", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "xcm", - "xcm-executor", -] - -[[package]] -name = "cumulus-primitives-core" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-primitives", - "scale-info", - "sp-api", - "sp-runtime", - "sp-std 5.0.0", - "sp-trie", - "xcm", -] - -[[package]] -name = "cumulus-primitives-parachain-inherent" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "cumulus-test-relay-sproof-builder", - "parity-scale-codec", - "sc-client-api", - "scale-info", - "sp-api", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "sp-std 5.0.0", - "sp-storage", - "sp-trie", - "tracing", -] - -[[package]] -name = "cumulus-primitives-timestamp" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "cumulus-primitives-core", - "futures", - "parity-scale-codec", - "sp-inherents", - "sp-std 5.0.0", - "sp-timestamp", -] - -[[package]] -name = "cumulus-relay-chain-inprocess-interface" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "futures", - "futures-timer", - "polkadot-cli", - "polkadot-client", - "polkadot-service", - "sc-cli", - "sc-client-api", - "sc-sysinfo", - "sc-telemetry", - "sc-tracing", - "sp-api", - "sp-consensus", - "sp-core", - "sp-runtime", - "sp-state-machine", -] - -[[package]] -name = "cumulus-relay-chain-interface" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "futures", - "jsonrpsee-core 0.16.2", - "parity-scale-codec", - "polkadot-overseer", - "sc-client-api", - "sp-api", - "sp-blockchain", - "sp-state-machine", - "thiserror", -] - -[[package]] -name = "cumulus-relay-chain-minimal-node" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "array-bytes 6.1.0", - "async-trait", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "cumulus-relay-chain-rpc-interface", - "futures", - "lru 0.9.0", - "polkadot-availability-recovery", - "polkadot-collator-protocol", - "polkadot-core-primitives", - "polkadot-network-bridge", - "polkadot-node-collation-generation", - "polkadot-node-core-runtime-api", - "polkadot-node-network-protocol", - "polkadot-node-subsystem-util", - "polkadot-overseer", - "polkadot-primitives", - "sc-authority-discovery", - "sc-client-api", - "sc-network", - "sc-network-common", - "sc-service", - "sc-tracing", - "sc-utils", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-runtime", - "tokio", - "tracing", -] - -[[package]] -name = "cumulus-relay-chain-rpc-interface" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "futures", - "futures-timer", - "jsonrpsee 0.16.2", - "lru 0.9.0", - "parity-scale-codec", - "polkadot-overseer", - "sc-client-api", - "sc-rpc-api", - "sc-service", - "serde", - "serde_json", - "sp-api", - "sp-authority-discovery", - "sp-consensus-babe", - "sp-core", - "sp-state-machine", - "sp-storage", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "cumulus-test-relay-sproof-builder" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "cumulus-primitives-core", - "parity-scale-codec", - "polkadot-primitives", - "sp-runtime", - "sp-state-machine", - "sp-std 5.0.0", -] - -[[package]] -name = "curl" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" -dependencies = [ - "curl-sys", - "libc", - "openssl-probe", - "openssl-sys", - "schannel", - "socket2", - "winapi", -] - -[[package]] -name = "curl-sys" -version = "0.4.61+curl-8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d05c10f541ae6f3bc5b3d923c20001f47db7d5f0b2bc6ad16490133842db79" -dependencies = [ - "cc", - "libc", - "libnghttp2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", - "winapi", -] - -[[package]] -name = "curve25519-dalek" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" -dependencies = [ - "byteorder", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek" -version = "4.0.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d4ba9852b42210c7538b75484f9daa0655e9a3ac04f693747bb0f02cf3cfe16" -dependencies = [ - "cfg-if 1.0.0", - "fiat-crypto", - "packed_simd_2", - "platforms 3.0.2", - "subtle", - "zeroize", -] - -[[package]] -name = "cxx" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2 1.0.57", - "quote 1.0.27", - "scratch", - "syn 2.0.16", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "darling" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2 1.0.57", - "quote 1.0.27", - "strsim 0.10.0", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "data-encoding" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" - -[[package]] -name = "data-encoding-macro" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86927b7cd2fe88fa698b87404b287ab98d1a0063a34071d92e575b72d3029aca" -dependencies = [ - "data-encoding", - "data-encoding-macro-internal", -] - -[[package]] -name = "data-encoding-macro-internal" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" -dependencies = [ - "data-encoding", - "syn 1.0.109", -] - -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "der" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e58dffcdcc8ee7b22f0c1f71a69243d7c2d9ad87b5a14361f2424a1565c219" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "der-parser" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe398ac75057914d7d07307bf67dc7f3f574a26783b4fc7805a20ffa9f506e82" -dependencies = [ - "asn1-rs 0.3.1", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "der-parser" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" -dependencies = [ - "asn1-rs 0.5.2", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "derive-syn-parse" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07adf7be193b71cc36b193d0f5fe60b918a3a9db4dad0449f57bcfd519704a3" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f91d4cfa921f1c05904dc3c57b4a32c38aed3340cce209f3a6fd1478babafc4" -dependencies = [ - "darling", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder_macro" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f0314b72bed045f3a68671b3c86328386762c93f82d98c65c3cb5e5f573dd68" -dependencies = [ - "derive_builder_core", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case", - "proc-macro2 1.0.57", - "quote 1.0.27", - "rustc_version", - "syn 1.0.109", -] - -[[package]] -name = "difflib" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "digest" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "directories" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "directories-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" -dependencies = [ - "cfg-if 1.0.0", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "displaydoc" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "downcast" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" - -[[package]] -name = "downcast-rs" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" - -[[package]] -name = "dtoa" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65d09067bfacaa79114679b279d7f5885b53295b1e2cfb4e79c8e4bd3d633169" - -[[package]] -name = "dyn-clonable" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" -dependencies = [ - "dyn-clonable-impl", - "dyn-clone", -] - -[[package]] -name = "dyn-clonable-impl" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "dyn-clone" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" - -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - -[[package]] -name = "ecdsa" -version = "0.16.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" -dependencies = [ - "der 0.7.5", - "digest 0.10.6", - "elliptic-curve 0.13.4", - "rfc6979 0.4.0", - "signature 2.1.0", - "spki 0.7.2", -] - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.2.0", - "ed25519", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-zebra" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" -dependencies = [ - "curve25519-dalek 3.2.0", - "hashbrown 0.12.3", - "hex", - "rand_core 0.6.4", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "either" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.6", - "ff 0.12.1", - "generic-array 0.14.7", - "group 0.12.1", - "hkdf", - "pem-rfc7468", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle", - "zeroize", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c71eaa367f2e5d556414a8eea812bc62985c879748d6403edabd9cb03f16e7" -dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.2", - "digest 0.10.6", - "ff 0.13.0", - "generic-array 0.14.7", - "group 0.13.0", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1 0.7.2", - "subtle", - "zeroize", -] - -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "encoding_rs" -version = "0.8.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "enum-as-inner" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" -dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "enumflags2" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" -dependencies = [ - "enumflags2_derive", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "enumn" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48016319042fb7c87b78d2993084a831793a897a5cd1a2a67cab9d1eeb4b7d76" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "env_logger" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "environmental" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" - -[[package]] -name = "errno" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-rlp", - "impl-serde", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-rlp", - "impl-serde", - "primitive-types", - "uint", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "exit-future" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" -dependencies = [ - "futures", -] - -[[package]] -name = "expander" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a718c0675c555c5f976fff4ea9e2c150fa06cefa201cadef87cfbf9324075881" -dependencies = [ - "blake3", - "fs-err", - "proc-macro2 1.0.57", - "quote 1.0.27", -] - -[[package]] -name = "expander" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3774182a5df13c3d1690311ad32fbe913feef26baba609fa2dd5f72042bd2ab6" -dependencies = [ - "blake2", - "fs-err", - "proc-macro2 1.0.57", - "quote 1.0.27", -] - -[[package]] -name = "expander" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f360349150728553f92e4c997a16af8915f418d3a0f21b440d34c5632f16ed84" -dependencies = [ - "blake2", - "fs-err", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "expander" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f86a749cf851891866c10515ef6c299b5c69661465e9c3bbe7e07a2b77fb0f7" -dependencies = [ - "blake2", - "fs-err", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fatality" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad875162843b0d046276327afe0136e9ed3a23d5a754210fb6f1f33610d39ab" -dependencies = [ - "fatality-proc-macro", - "thiserror", -] - -[[package]] -name = "fatality-proc-macro" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5aa1e3ae159e592ad222dc90c5acbad632b527779ba88486abe92782ab268bd" -dependencies = [ - "expander 0.0.4", - "indexmap", - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", - "thiserror", -] - -[[package]] -name = "fdlimit" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4c9e43643f5a3be4ca5b67d26b98031ff9db6806c3440ae32e02e3ceac3f1b" -dependencies = [ - "libc", -] - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" - -[[package]] -name = "file-per-thread-logger" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f2e425d9790201ba4af4630191feac6dcc98765b118d4d18e91d23c2353866" -dependencies = [ - "env_logger", - "log", -] - -[[package]] -name = "filetime" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall 0.2.16", - "windows-sys 0.48.0", -] - -[[package]] -name = "finality-grandpa" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36530797b9bf31cd4ff126dcfee8170f86b00cfdcea3269d73133cc0415945c3" -dependencies = [ - "either", - "futures", - "futures-timer", - "log", - "num-traits", - "parity-scale-codec", - "parking_lot 0.12.1", - "scale-info", -] - -[[package]] -name = "finality-relay" -version = "0.1.0" -dependencies = [ - "async-std", - "async-trait", - "backoff", - "bp-header-chain", - "futures", - "log", - "num-traits", - "parking_lot 0.12.1", - "relay-utils", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" -dependencies = [ - "crc32fast", - "libz-sys", - "miniz_oxide 0.7.1", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "fork-tree" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "form_urlencoded" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fragile" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" - -[[package]] -name = "frame-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "frame-support-procedural", - "frame-system", - "linregress", - "log", - "parity-scale-codec", - "paste", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", - "sp-runtime-interface", - "sp-std 5.0.0", - "sp-storage", - "static_assertions", -] - -[[package]] -name = "frame-benchmarking-cli" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "Inflector", - "array-bytes 4.2.0", - "chrono", - "clap 4.2.7", - "comfy-table", - "frame-benchmarking", - "frame-support", - "frame-system", - "gethostname", - "handlebars", - "itertools", - "lazy_static", - "linked-hash-map", - "log", - "parity-scale-codec", - "rand 0.8.5", - "rand_pcg", - "sc-block-builder", - "sc-cli", - "sc-client-api", - "sc-client-db", - "sc-executor", - "sc-service", - "sc-sysinfo", - "serde", - "serde_json", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-database", - "sp-externalities", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "sp-state-machine", - "sp-std 5.0.0", - "sp-storage", - "sp-trie", - "thiserror", - "thousands", -] - -[[package]] -name = "frame-election-provider-solution-type" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "frame-election-provider-support" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-election-provider-solution-type", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-npos-elections", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "frame-executive" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "sp-tracing", -] - -[[package]] -name = "frame-metadata" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" -dependencies = [ - "cfg-if 1.0.0", - "parity-scale-codec", - "scale-info", - "serde", -] - -[[package]] -name = "frame-remote-externalities" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-recursion", - "futures", - "indicatif", - "jsonrpsee 0.16.2", - "log", - "parity-scale-codec", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "spinners", - "substrate-rpc-client", - "tokio", -] - -[[package]] -name = "frame-support" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "bitflags", - "environmental", - "frame-metadata", - "frame-support-procedural", - "impl-trait-for-tuples", - "k256", - "log", - "once_cell", - "parity-scale-codec", - "paste", - "scale-info", - "serde", - "smallvec", - "sp-api", - "sp-arithmetic", - "sp-core", - "sp-core-hashing-proc-macro", - "sp-debug-derive", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-state-machine", - "sp-std 5.0.0", - "sp-tracing", - "sp-weights", - "tt-call", -] - -[[package]] -name = "frame-support-procedural" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "Inflector", - "cfg-expr", - "derive-syn-parse", - "frame-support-procedural-tools", - "itertools", - "proc-macro-warning", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "frame-support-procedural-tools" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support-procedural-tools-derive", - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "frame-support-procedural-tools-derive" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "frame-system" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "cfg-if 1.0.0", - "frame-support", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "sp-version", - "sp-weights", -] - -[[package]] -name = "frame-system-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "frame-system-rpc-runtime-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "sp-api", -] - -[[package]] -name = "frame-try-runtime" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "fs-err" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0845fa252299212f0389d64ba26f34fa32cfe41588355f21ed507c59a0f64541" - -[[package]] -name = "fs2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "fs4" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f5b6908aecca5812a4569056285e58c666588c9573ee59765bf1d3692699e2" -dependencies = [ - "rustix 0.37.19", - "windows-sys 0.48.0", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", - "num_cpus", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite 0.2.9", - "waker-fn", -] - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "futures-rustls" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" -dependencies = [ - "futures-io", - "rustls 0.20.8", - "webpki 0.22.0", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-timer" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite 0.2.9", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "ghash" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" -dependencies = [ - "opaque-debug 0.3.0", - "polyval 0.5.3", -] - -[[package]] -name = "ghash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" -dependencies = [ - "opaque-debug 0.3.0", - "polyval 0.6.0", -] - -[[package]] -name = "gimli" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" -dependencies = [ - "fallible-iterator", - "indexmap", - "stable_deref_trait", -] - -[[package]] -name = "gimli" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "globset" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" -dependencies = [ - "aho-corasick 0.7.20", - "bstr", - "fnv", - "log", - "regex", -] - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff 0.13.0", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "handlebars" -version = "4.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c3372087601b532857d332f5957cbae686da52bb7810bf038c3e3c3cc2fa0d" -dependencies = [ - "log", - "pest", - "pest_derive", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "hash-db" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" - -[[package]] -name = "hash256-std-hasher" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" -dependencies = [ - "crunchy", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.6", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.3", -] - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hkdf" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" -dependencies = [ - "hmac 0.12.1", -] - -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" -dependencies = [ - "crypto-mac 0.11.1", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.6", -] - -[[package]] -name = "hmac-drbg" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" -dependencies = [ - "digest 0.9.0", - "generic-array 0.14.7", - "hmac 0.8.1", -] - -[[package]] -name = "honggfuzz" -version = "0.5.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e9c511092e0daa0a35a63e8e6e475a3e8f870741448b9f6028d69b142f18e" -dependencies = [ - "arbitrary", - "lazy_static", - "memmap2", - "rustc_version", -] - -[[package]] -name = "hostname" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -dependencies = [ - "libc", - "match_cfg", - "winapi", -] - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite 0.2.9", -] - -[[package]] -name = "http-range-header" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "0.14.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite 0.2.9", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" -dependencies = [ - "http", - "hyper", - "log", - "rustls 0.20.8", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.23.4", - "webpki-roots", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows 0.48.0", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "if-addrs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "if-watch" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9465340214b296cd17a0009acdb890d6160010b8adf8f78a00d0d7ab270f79f" -dependencies = [ - "async-io", - "core-foundation", - "fnv", - "futures", - "if-addrs", - "ipnet", - "log", - "rtnetlink", - "system-configuration", - "tokio", - "windows 0.34.0", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indicatif" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef509aa9bc73864d6756f0d34d35504af3cf0844373afe9b8669a5b8005a729" -dependencies = [ - "console", - "number_prefix", - "portable-atomic 0.3.20", - "unicode-width", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" - -[[package]] -name = "integer-sqrt" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" -dependencies = [ - "num-traits", -] - -[[package]] -name = "interceptor" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e8a11ae2da61704edada656798b61c94b35ecac2c58eb955156987d5e6be90b" -dependencies = [ - "async-trait", - "bytes", - "log", - "rand 0.8.5", - "rtcp", - "rtp", - "thiserror", - "tokio", - "waitgroup", - "webrtc-srtp", - "webrtc-util", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "ip_network" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" - -[[package]] -name = "ipconfig" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd302af1b90f2463a98fa5ad469fc212c8e3175a41c3068601bfa2727591c5be" -dependencies = [ - "socket2", - "widestring", - "winapi", - "winreg", -] - -[[package]] -name = "ipnet" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" - -[[package]] -name = "is-terminal" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" -dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", - "rustix 0.37.19", - "windows-sys 0.48.0", -] - -[[package]] -name = "isahc" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" -dependencies = [ - "async-channel", - "castaway", - "crossbeam-utils", - "curl", - "curl-sys", - "encoding_rs", - "event-listener", - "futures-lite", - "http", - "log", - "mime", - "once_cell", - "polling", - "slab", - "sluice", - "tracing", - "tracing-futures", - "url", - "waker-fn", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" - -[[package]] -name = "jobserver" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonpath_lib" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f" -dependencies = [ - "log", - "serde", - "serde_json", -] - -[[package]] -name = "jsonrpsee" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d291e3a5818a2384645fd9756362e6d89cf0541b0b916fa7702ea4a9833608e" -dependencies = [ - "jsonrpsee-client-transport 0.16.2", - "jsonrpsee-core 0.16.2", - "jsonrpsee-http-client", - "jsonrpsee-proc-macros 0.16.2", - "jsonrpsee-server", - "jsonrpsee-types 0.16.2", - "jsonrpsee-ws-client 0.16.2", - "tracing", -] - -[[package]] -name = "jsonrpsee" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b971ce0f6cd1521ede485afc564b95b2c8e7079b9da41d4273bd9b55140a55d" -dependencies = [ - "jsonrpsee-core 0.17.1", - "jsonrpsee-proc-macros 0.17.1", - "jsonrpsee-types 0.17.1", - "jsonrpsee-ws-client 0.17.1", - "tracing", -] - -[[package]] -name = "jsonrpsee-client-transport" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965de52763f2004bc91ac5bcec504192440f0b568a5d621c59d9dbd6f886c3fb" -dependencies = [ - "futures-util", - "http", - "jsonrpsee-core 0.16.2", - "jsonrpsee-types 0.16.2", - "pin-project", - "rustls-native-certs", - "soketto", - "thiserror", - "tokio", - "tokio-rustls 0.23.4", - "tokio-util", - "tracing", - "webpki-roots", -] - -[[package]] -name = "jsonrpsee-client-transport" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca00d975eda834826b04ad57d4e690c67439bb51b02eb0f8b7e4c30fcef8ab9" -dependencies = [ - "futures-util", - "http", - "jsonrpsee-core 0.17.1", - "pin-project", - "rustls-native-certs", - "soketto", - "thiserror", - "tokio", - "tokio-rustls 0.24.0", - "tokio-util", - "tracing", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e70b4439a751a5de7dd5ed55eacff78ebf4ffe0fc009cb1ebb11417f5b536b" -dependencies = [ - "anyhow", - "arrayvec 0.7.2", - "async-lock", - "async-trait", - "beef", - "futures-channel", - "futures-timer", - "futures-util", - "globset", - "hyper", - "jsonrpsee-types 0.16.2", - "parking_lot 0.12.1", - "rand 0.8.5", - "rustc-hash", - "serde", - "serde_json", - "soketto", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b83cca7a5a7899eed8b2935d5f755c8c4052ad66ab5b328bd34ac2b3ffd3515f" -dependencies = [ - "anyhow", - "async-lock", - "async-trait", - "beef", - "futures-timer", - "futures-util", - "jsonrpsee-types 0.17.1", - "rustc-hash", - "serde", - "serde_json", - "thiserror", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "jsonrpsee-http-client" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc345b0a43c6bc49b947ebeb936e886a419ee3d894421790c969cc56040542ad" -dependencies = [ - "async-trait", - "hyper", - "hyper-rustls", - "jsonrpsee-core 0.16.2", - "jsonrpsee-types 0.16.2", - "rustc-hash", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-proc-macros" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa6da1e4199c10d7b1d0a6e5e8bd8e55f351163b6f4b3cbb044672a69bd4c1c" -dependencies = [ - "heck 0.4.1", - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "jsonrpsee-proc-macros" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d814a21d9a819f8de1a41b819a263ffd68e4bb5f043d936db1c49b54684bde0a" -dependencies = [ - "heck 0.4.1", - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "jsonrpsee-server" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb69dad85df79527c019659a992498d03f8495390496da2f07e6c24c2b356fc" -dependencies = [ - "futures-channel", - "futures-util", - "http", - "hyper", - "jsonrpsee-core 0.16.2", - "jsonrpsee-types 0.16.2", - "serde", - "serde_json", - "soketto", - "tokio", - "tokio-stream", - "tokio-util", - "tower", - "tracing", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd522fe1ce3702fd94812965d7bb7a3364b1c9aba743944c5a00529aae80f8c" -dependencies = [ - "anyhow", - "beef", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd301ccc3e08718393432d1961539d78c4580dcca86014dfe6769c308b2c08b2" -dependencies = [ - "anyhow", - "beef", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "jsonrpsee-ws-client" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b83daeecfc6517cfe210df24e570fb06213533dfb990318fae781f4c7119dd9" -dependencies = [ - "http", - "jsonrpsee-client-transport 0.16.2", - "jsonrpsee-core 0.16.2", - "jsonrpsee-types 0.16.2", -] - -[[package]] -name = "jsonrpsee-ws-client" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a69852133d549b07cb37ff2d0ec540eae0d20abb75ae923f5d39bc7536d987" -dependencies = [ - "http", - "jsonrpsee-client-transport 0.17.1", - "jsonrpsee-core 0.17.1", - "jsonrpsee-types 0.17.1", -] - -[[package]] -name = "k256" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" -dependencies = [ - "cfg-if 1.0.0", - "ecdsa 0.16.7", - "elliptic-curve 0.13.4", - "once_cell", - "sha2 0.10.6", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "kusama-runtime" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bitvec", - "frame-benchmarking", - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "kusama-runtime-constants", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-bags-list", - "pallet-balances", - "pallet-bounties", - "pallet-child-bounties", - "pallet-collective", - "pallet-conviction-voting", - "pallet-democracy", - "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking", - "pallet-elections-phragmen", - "pallet-fast-unstake", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-membership", - "pallet-multisig", - "pallet-nis", - "pallet-nomination-pools", - "pallet-nomination-pools-benchmarking", - "pallet-nomination-pools-runtime-api", - "pallet-offences", - "pallet-offences-benchmarking", - "pallet-preimage", - "pallet-proxy", - "pallet-ranked-collective", - "pallet-recovery", - "pallet-referenda", - "pallet-scheduler", - "pallet-session", - "pallet-session-benchmarking", - "pallet-society", - "pallet-staking", - "pallet-staking-runtime-api", - "pallet-timestamp", - "pallet-tips", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-treasury", - "pallet-utility", - "pallet-vesting", - "pallet-whitelist", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "rustc-hex", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-arithmetic", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-core", - "sp-inherents", - "sp-io", - "sp-mmr-primitives", - "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 5.0.0", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "kusama-runtime-constants" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "kvdb" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d770dcb02bf6835887c3a979b5107a04ff4bbde97a5f0928d27404a155add9" -dependencies = [ - "smallvec", -] - -[[package]] -name = "kvdb-memorydb" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7a85fe66f9ff9cd74e169fdd2c94c6e1e74c412c99a73b4df3200b5d3760b2" -dependencies = [ - "kvdb", - "parking_lot 0.12.1", -] - -[[package]] -name = "kvdb-rocksdb" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b644c70b92285f66bfc2032922a79000ea30af7bc2ab31902992a5dcb9b434f6" -dependencies = [ - "kvdb", - "num_cpus", - "parking_lot 0.12.1", - "regex", - "rocksdb", - "smallvec", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.144" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if 1.0.0", - "winapi", -] - -[[package]] -name = "libm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" - -[[package]] -name = "libm" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" - -[[package]] -name = "libnghttp2-sys" -version = "0.1.7+1.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ed28aba195b38d5ff02b9170cbff627e336a20925e43b4945390401c5dc93f" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "libp2p" -version = "0.51.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f210d259724eae82005b5c48078619b7745edb7b76de370b03f8ba59ea103097" -dependencies = [ - "bytes", - "futures", - "futures-timer", - "getrandom 0.2.9", - "instant", - "libp2p-allow-block-list", - "libp2p-connection-limits", - "libp2p-core", - "libp2p-dns", - "libp2p-identify", - "libp2p-identity", - "libp2p-kad", - "libp2p-mdns", - "libp2p-metrics", - "libp2p-noise", - "libp2p-ping", - "libp2p-quic", - "libp2p-request-response", - "libp2p-swarm", - "libp2p-tcp", - "libp2p-wasm-ext", - "libp2p-webrtc", - "libp2p-websocket", - "libp2p-yamux", - "multiaddr", - "pin-project", -] - -[[package]] -name = "libp2p-allow-block-list" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510daa05efbc25184458db837f6f9a5143888f1caa742426d92e1833ddd38a50" -dependencies = [ - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "void", -] - -[[package]] -name = "libp2p-connection-limits" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4caa33f1d26ed664c4fe2cca81a08c8e07d4c1c04f2f4ac7655c2dd85467fda0" -dependencies = [ - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "void", -] - -[[package]] -name = "libp2p-core" -version = "0.39.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c1df63c0b582aa434fb09b2d86897fa2b419ffeccf934b36f87fcedc8e835c2" -dependencies = [ - "either", - "fnv", - "futures", - "futures-timer", - "instant", - "libp2p-identity", - "log", - "multiaddr", - "multihash 0.17.0", - "multistream-select", - "once_cell", - "parking_lot 0.12.1", - "pin-project", - "quick-protobuf", - "rand 0.8.5", - "rw-stream-sink", - "smallvec", - "thiserror", - "unsigned-varint", - "void", -] - -[[package]] -name = "libp2p-dns" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146ff7034daae62077c415c2376b8057368042df6ab95f5432ad5e88568b1554" -dependencies = [ - "futures", - "libp2p-core", - "log", - "parking_lot 0.12.1", - "smallvec", - "trust-dns-resolver", -] - -[[package]] -name = "libp2p-identify" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5455f472243e63b9c497ff320ded0314254a9eb751799a39c283c6f20b793f3c" -dependencies = [ - "asynchronous-codec", - "either", - "futures", - "futures-timer", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "log", - "lru 0.10.0", - "quick-protobuf", - "quick-protobuf-codec", - "smallvec", - "thiserror", - "void", -] - -[[package]] -name = "libp2p-identity" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e2d584751cecb2aabaa56106be6be91338a60a0f4e420cf2af639204f596fc1" -dependencies = [ - "bs58", - "ed25519-dalek", - "log", - "multiaddr", - "multihash 0.17.0", - "quick-protobuf", - "rand 0.8.5", - "sha2 0.10.6", - "thiserror", - "zeroize", -] - -[[package]] -name = "libp2p-kad" -version = "0.43.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39d5ef876a2b2323d63c258e63c2f8e36f205fe5a11f0b3095d59635650790ff" -dependencies = [ - "arrayvec 0.7.2", - "asynchronous-codec", - "bytes", - "either", - "fnv", - "futures", - "futures-timer", - "instant", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "log", - "quick-protobuf", - "rand 0.8.5", - "sha2 0.10.6", - "smallvec", - "thiserror", - "uint", - "unsigned-varint", - "void", -] - -[[package]] -name = "libp2p-mdns" -version = "0.43.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19983e1f949f979a928f2c603de1cf180cc0dc23e4ac93a62651ccb18341460b" -dependencies = [ - "data-encoding", - "futures", - "if-watch", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "log", - "rand 0.8.5", - "smallvec", - "socket2", - "tokio", - "trust-dns-proto", - "void", -] - -[[package]] -name = "libp2p-metrics" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a42ec91e227d7d0dafa4ce88b333cdf5f277253873ab087555c92798db2ddd46" -dependencies = [ - "libp2p-core", - "libp2p-identify", - "libp2p-kad", - "libp2p-ping", - "libp2p-swarm", - "prometheus-client", -] - -[[package]] -name = "libp2p-noise" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3673da89d29936bc6435bafc638e2f184180d554ce844db65915113f86ec5e" -dependencies = [ - "bytes", - "curve25519-dalek 3.2.0", - "futures", - "libp2p-core", - "libp2p-identity", - "log", - "once_cell", - "quick-protobuf", - "rand 0.8.5", - "sha2 0.10.6", - "snow", - "static_assertions", - "thiserror", - "x25519-dalek 1.1.1", - "zeroize", -] - -[[package]] -name = "libp2p-ping" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e57759c19c28a73ef1eb3585ca410cefb72c1a709fcf6de1612a378e4219202" -dependencies = [ - "either", - "futures", - "futures-timer", - "instant", - "libp2p-core", - "libp2p-swarm", - "log", - "rand 0.8.5", - "void", -] - -[[package]] -name = "libp2p-quic" -version = "0.7.0-alpha.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6b26abd81cd2398382a1edfe739b539775be8a90fa6914f39b2ab49571ec735" -dependencies = [ - "bytes", - "futures", - "futures-timer", - "if-watch", - "libp2p-core", - "libp2p-identity", - "libp2p-tls", - "log", - "parking_lot 0.12.1", - "quinn-proto", - "rand 0.8.5", - "rustls 0.20.8", - "thiserror", - "tokio", -] - -[[package]] -name = "libp2p-request-response" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffdb374267d42dc5ed5bc53f6e601d4a64ac5964779c6e40bb9e4f14c1e30d5" -dependencies = [ - "async-trait", - "futures", - "instant", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "rand 0.8.5", - "smallvec", -] - -[[package]] -name = "libp2p-swarm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903b3d592d7694e56204d211f29d31bc004be99386644ba8731fc3e3ef27b296" -dependencies = [ - "either", - "fnv", - "futures", - "futures-timer", - "instant", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm-derive", - "log", - "rand 0.8.5", - "smallvec", - "tokio", - "void", -] - -[[package]] -name = "libp2p-swarm-derive" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fba456131824ab6acd4c7bf61e9c0f0a3014b5fc9868ccb8e10d344594cdc4f" -dependencies = [ - "heck 0.4.1", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "libp2p-tcp" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d33698596d7722d85d3ab0c86c2c322254fce1241e91208e3679b4eb3026cf" -dependencies = [ - "futures", - "futures-timer", - "if-watch", - "libc", - "libp2p-core", - "log", - "socket2", - "tokio", -] - -[[package]] -name = "libp2p-tls" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff08d13d0dc66e5e9ba6279c1de417b84fa0d0adc3b03e5732928c180ec02781" -dependencies = [ - "futures", - "futures-rustls", - "libp2p-core", - "libp2p-identity", - "rcgen 0.10.0", - "ring", - "rustls 0.20.8", - "thiserror", - "webpki 0.22.0", - "x509-parser 0.14.0", - "yasna", -] - -[[package]] -name = "libp2p-wasm-ext" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77dff9d32353a5887adb86c8afc1de1a94d9e8c3bc6df8b2201d7cdf5c848f43" -dependencies = [ - "futures", - "js-sys", - "libp2p-core", - "parity-send-wrapper", - "wasm-bindgen", - "wasm-bindgen-futures", -] - -[[package]] -name = "libp2p-webrtc" -version = "0.4.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba48592edbc2f60b4bc7c10d65445b0c3964c07df26fdf493b6880d33be36f8" -dependencies = [ - "async-trait", - "asynchronous-codec", - "bytes", - "futures", - "futures-timer", - "hex", - "if-watch", - "libp2p-core", - "libp2p-identity", - "libp2p-noise", - "log", - "multihash 0.17.0", - "quick-protobuf", - "quick-protobuf-codec", - "rand 0.8.5", - "rcgen 0.9.3", - "serde", - "stun", - "thiserror", - "tinytemplate", - "tokio", - "tokio-util", - "webrtc", -] - -[[package]] -name = "libp2p-websocket" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111273f7b3d3510524c752e8b7a5314b7f7a1fee7e68161c01a7d72cbb06db9f" -dependencies = [ - "either", - "futures", - "futures-rustls", - "libp2p-core", - "log", - "parking_lot 0.12.1", - "quicksink", - "rw-stream-sink", - "soketto", - "url", - "webpki-roots", -] - -[[package]] -name = "libp2p-yamux" -version = "0.43.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd21d950662700a385d4c6d68e2f5f54d778e97068cdd718522222ef513bda" -dependencies = [ - "futures", - "libp2p-core", - "log", - "thiserror", - "yamux", -] - -[[package]] -name = "librocksdb-sys" -version = "0.11.0+8.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e" -dependencies = [ - "bindgen", - "bzip2-sys", - "cc", - "glob", - "libc", - "libz-sys", - "tikv-jemalloc-sys", -] - -[[package]] -name = "libsecp256k1" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" -dependencies = [ - "arrayref", - "base64 0.13.1", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.8.5", - "serde", - "sha2 0.9.9", - "typenum", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libz-sys" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "link-cplusplus" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" -dependencies = [ - "cc", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linked_hash_set" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "linregress" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "475015a7f8f017edb28d2e69813be23500ad4b32cfe3421c4148efc97324ee52" -dependencies = [ - "nalgebra", -] - -[[package]] -name = "linux-raw-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" - -[[package]] -name = "linux-raw-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" - -[[package]] -name = "lock_api" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if 1.0.0", - "value-bag", -] - -[[package]] -name = "lru" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" -dependencies = [ - "hashbrown 0.12.3", -] - -[[package]] -name = "lru" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e7d46de488603ffdd5f30afbc64fbba2378214a2c3a2fb83abf3d33126df17" -dependencies = [ - "hashbrown 0.13.2", -] - -[[package]] -name = "lru" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03f1160296536f10c833a82dca22267d5486734230d47bf00bf435885814ba1e" -dependencies = [ - "hashbrown 0.13.2", -] - -[[package]] -name = "lru-cache" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "lz4" -version = "1.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" -dependencies = [ - "libc", - "lz4-sys", -] - -[[package]] -name = "lz4-sys" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "mach" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" -dependencies = [ - "libc", -] - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - -[[package]] -name = "matchers" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "matrixmultiply" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77" -dependencies = [ - "autocfg", - "rawpointer", -] - -[[package]] -name = "md-5" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" -dependencies = [ - "digest 0.10.6", -] - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memfd" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" -dependencies = [ - "rustix 0.37.19", -] - -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memory-db" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" -dependencies = [ - "hash-db", -] - -[[package]] -name = "memory_units" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" - -[[package]] -name = "merlin" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.5.1", - "zeroize", -] - -[[package]] -name = "messages-relay" -version = "0.1.0" -dependencies = [ - "async-std", - "async-trait", - "bp-messages", - "env_logger", - "finality-relay", - "futures", - "hex", - "log", - "num-traits", - "parking_lot 0.12.1", - "relay-utils", - "sp-arithmetic", -] - -[[package]] -name = "mick-jaeger" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69672161530e8aeca1d1400fbf3f1a1747ff60ea604265a4e906c2442df20532" -dependencies = [ - "futures", - "rand 0.8.5", - "thrift", -] - -[[package]] -name = "millau-bridge-node" -version = "0.1.0" -dependencies = [ - "clap 4.2.7", - "frame-benchmarking", - "frame-benchmarking-cli", - "jsonrpsee 0.16.2", - "millau-runtime", - "mmr-rpc", - "node-inspect", - "pallet-transaction-payment-rpc", - "sc-basic-authorship", - "sc-cli", - "sc-client-api", - "sc-consensus", - "sc-consensus-aura", - "sc-consensus-beefy", - "sc-consensus-beefy-rpc", - "sc-consensus-grandpa", - "sc-consensus-grandpa-rpc", - "sc-executor", - "sc-keystore", - "sc-network", - "sc-network-common", - "sc-rpc", - "sc-service", - "sc-telemetry", - "sc-transaction-pool", - "serde_json", - "sp-consensus-aura", - "sp-consensus-beefy", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "sp-timestamp", - "substrate-build-script-utils", - "substrate-frame-rpc-system", -] - -[[package]] -name = "millau-runtime" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-millau", - "bp-parachains", - "bp-polkadot-core", - "bp-relayers", - "bp-rialto", - "bp-rialto-parachain", - "bp-runtime", - "bp-westend", - "bridge-runtime-common", - "env_logger", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "hex-literal", - "pallet-aura", - "pallet-balances", - "pallet-beefy", - "pallet-beefy-mmr", - "pallet-bridge-grandpa", - "pallet-bridge-messages", - "pallet-bridge-parachains", - "pallet-bridge-relayers", - "pallet-grandpa", - "pallet-mmr", - "pallet-session", - "pallet-shift-session-manager", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-utility", - "pallet-xcm", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-consensus-beefy", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std 5.0.0", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" -dependencies = [ - "adler", -] - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" -dependencies = [ - "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.45.0", -] - -[[package]] -name = "mmr-gadget" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "futures", - "log", - "parity-scale-codec", - "sc-client-api", - "sc-offchain", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-consensus-beefy", - "sp-core", - "sp-mmr-primitives", - "sp-runtime", -] - -[[package]] -name = "mmr-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "anyhow", - "jsonrpsee 0.16.2", - "parity-scale-codec", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-mmr-primitives", - "sp-runtime", -] - -[[package]] -name = "mockall" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" -dependencies = [ - "cfg-if 1.0.0", - "downcast", - "fragile", - "lazy_static", - "mockall_derive", - "predicates", - "predicates-tree", -] - -[[package]] -name = "mockall_derive" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" -dependencies = [ - "cfg-if 1.0.0", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "multiaddr" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b36f567c7099511fa8612bbbb52dda2419ce0bdbacf31714e3a5ffdb766d3bd" -dependencies = [ - "arrayref", - "byteorder", - "data-encoding", - "log", - "multibase", - "multihash 0.17.0", - "percent-encoding", - "serde", - "static_assertions", - "unsigned-varint", - "url", -] - -[[package]] -name = "multibase" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" -dependencies = [ - "base-x", - "data-encoding", - "data-encoding-macro", -] - -[[package]] -name = "multihash" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" -dependencies = [ - "blake2b_simd", - "blake2s_simd", - "blake3", - "core2", - "digest 0.10.6", - "multihash-derive", - "sha2 0.10.6", - "sha3", - "unsigned-varint", -] - -[[package]] -name = "multihash" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" -dependencies = [ - "core2", - "digest 0.10.6", - "multihash-derive", - "sha2 0.10.6", - "unsigned-varint", -] - -[[package]] -name = "multihash-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" -dependencies = [ - "proc-macro-crate", - "proc-macro-error", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "multimap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" - -[[package]] -name = "multistream-select" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8552ab875c1313b97b8d20cb857b9fd63e2d1d6a0a1b53ce9821e575405f27a" -dependencies = [ - "bytes", - "futures", - "log", - "pin-project", - "smallvec", - "unsigned-varint", -] - -[[package]] -name = "nalgebra" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d68d47bba83f9e2006d117a9a33af1524e655516b8919caac694427a6fb1e511" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232c68884c0c99810a5a4d333ef7e47689cfd0edc85efc9e54e1e6bf5212766" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "names" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d66043b25d4a6cccb23619d10c19c25304b355a7dccd4a8e11423dd2382146" -dependencies = [ - "rand 0.8.5", -] - -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" - -[[package]] -name = "netlink-packet-core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" -dependencies = [ - "anyhow", - "byteorder", - "libc", - "netlink-packet-utils", -] - -[[package]] -name = "netlink-packet-route" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" -dependencies = [ - "anyhow", - "bitflags", - "byteorder", - "libc", - "netlink-packet-core", - "netlink-packet-utils", -] - -[[package]] -name = "netlink-packet-utils" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" -dependencies = [ - "anyhow", - "byteorder", - "paste", - "thiserror", -] - -[[package]] -name = "netlink-proto" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" -dependencies = [ - "bytes", - "futures", - "log", - "netlink-packet-core", - "netlink-sys", - "thiserror", - "tokio", -] - -[[package]] -name = "netlink-sys" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" -dependencies = [ - "bytes", - "futures", - "libc", - "log", - "tokio", -] - -[[package]] -name = "nix" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" -dependencies = [ - "bitflags", - "cfg-if 1.0.0", - "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "node-inspect" -version = "0.9.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" -dependencies = [ - "clap 4.2.7", - "parity-scale-codec", - "sc-cli", - "sc-client-api", - "sc-executor", - "sc-service", - "sp-blockchain", - "sp-core", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "nohash-hasher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "normalize-line-endings" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" - -[[package]] -name = "ntapi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" -dependencies = [ - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-format" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" -dependencies = [ - "arrayvec 0.7.2", - "itoa", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" -dependencies = [ - "hermit-abi 0.2.6", - "libc", -] - -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - -[[package]] -name = "object" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" -dependencies = [ - "crc32fast", - "hashbrown 0.12.3", - "indexmap", - "memchr", -] - -[[package]] -name = "object" -version = "0.30.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" -dependencies = [ - "memchr", -] - -[[package]] -name = "oid-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e20717fa0541f39bd146692035c37bedfa532b3e5071b35761082407546b2a" -dependencies = [ - "asn1-rs 0.3.1", -] - -[[package]] -name = "oid-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" -dependencies = [ - "asn1-rs 0.5.2", -] - -[[package]] -name = "once_cell" -version = "1.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "orchestra" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "227585216d05ba65c7ab0a0450a3cf2cbd81a98862a54c4df8e14d5ac6adb015" -dependencies = [ - "async-trait", - "dyn-clonable", - "futures", - "futures-timer", - "orchestra-proc-macro", - "pin-project", - "prioritized-metered-channel", - "thiserror", - "tracing", -] - -[[package]] -name = "orchestra-proc-macro" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2871aadd82a2c216ee68a69837a526dfe788ecbe74c4c5038a6acdbff6653066" -dependencies = [ - "expander 0.0.6", - "itertools", - "petgraph", - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "ordered-float" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7" -dependencies = [ - "num-traits", -] - -[[package]] -name = "p256" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" -dependencies = [ - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.6", -] - -[[package]] -name = "p384" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" -dependencies = [ - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.6", -] - -[[package]] -name = "packed_simd_2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" -dependencies = [ - "cfg-if 1.0.0", - "libm 0.1.4", -] - -[[package]] -name = "pallet-aura" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "frame-system", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-aura", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-authority-discovery" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "frame-system", - "pallet-session", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-authority-discovery", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-authorship" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-babe" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-babe", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-bags-list" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "sp-tracing", -] - -[[package]] -name = "pallet-balances" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-beefy" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "frame-system", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "scale-info", - "serde", - "sp-consensus-beefy", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-beefy-mmr" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "binary-merkle-tree", - "frame-support", - "frame-system", - "log", - "pallet-beefy", - "pallet-mmr", - "pallet-session", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-consensus-beefy", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-bounties" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-treasury", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-bridge-beefy" -version = "0.1.0" -dependencies = [ - "bp-beefy", - "bp-runtime", - "bp-test-utils", - "ckb-merkle-mountain-range 0.3.2", - "frame-support", - "frame-system", - "log", - "pallet-beefy-mmr", - "pallet-mmr", - "parity-scale-codec", - "rand 0.8.5", - "scale-info", - "serde", - "sp-consensus-beefy", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-bridge-grandpa" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-runtime", - "bp-test-utils", - "finality-grandpa", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-consensus-grandpa", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "sp-trie", -] - -[[package]] -name = "pallet-bridge-messages" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-runtime", - "bp-test-utils", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "num-traits", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-bridge-parachains" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-parachains", - "bp-polkadot-core", - "bp-runtime", - "bp-test-utils", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-bridge-grandpa", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "sp-trie", -] - -[[package]] -name = "pallet-bridge-relayers" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-relayers", - "bp-runtime", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-balances", - "pallet-bridge-messages", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-child-bounties" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-bounties", - "pallet-treasury", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-collective" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-conviction-voting" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "assert_matches", - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "serde", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-democracy" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-election-provider-multi-phase" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-election-provider-support-benchmarking", - "parity-scale-codec", - "rand 0.8.5", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-std 5.0.0", - "strum", -] - -[[package]] -name = "pallet-election-provider-support-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-system", - "parity-scale-codec", - "sp-npos-elections", - "sp-runtime", -] - -[[package]] -name = "pallet-elections-phragmen" -version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-fast-unstake" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-grandpa" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-grandpa", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-identity" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "enumflags2", - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-im-online" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-indices" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-keyring", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-membership" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-mmr" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-mmr-primitives", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-multisig" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-nis" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-nomination-pools" -version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-nomination-pools-benchmarking" -version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "pallet-bags-list", - "pallet-nomination-pools", - "pallet-staking", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-runtime-interface", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-nomination-pools-runtime-api" -version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "pallet-nomination-pools", - "parity-scale-codec", - "sp-api", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-offences" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "serde", - "sp-runtime", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-offences-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-babe", - "pallet-balances", - "pallet-grandpa", - "pallet-im-online", - "pallet-offences", - "pallet-session", - "pallet-staking", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-preimage" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-proxy" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-ranked-collective" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-recovery" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-referenda" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "assert_matches", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-arithmetic", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-scheduler" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "sp-weights", -] - -[[package]] -name = "pallet-session" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 5.0.0", - "sp-trie", -] - -[[package]] -name = "pallet-session-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-session", - "pallet-staking", - "rand 0.8.5", - "sp-runtime", - "sp-session", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-shift-session-manager" -version = "0.1.0" -dependencies = [ - "frame-support", - "frame-system", - "pallet-session", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-society" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "rand_chacha 0.2.2", - "scale-info", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-staking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "rand_chacha 0.2.2", - "scale-info", - "serde", - "sp-application-crypto", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-staking-reward-curve" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "pallet-staking-reward-fn" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "log", - "sp-arithmetic", -] - -[[package]] -name = "pallet-staking-runtime-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "sp-api", -] - -[[package]] -name = "pallet-state-trie-migration" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-sudo" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-timestamp" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "sp-timestamp", -] - -[[package]] -name = "pallet-tips" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-treasury", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-transaction-payment" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-transaction-payment-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "jsonrpsee 0.16.2", - "pallet-transaction-payment-rpc-runtime-api", - "parity-scale-codec", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "pallet-transaction-payment-rpc-runtime-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "pallet-transaction-payment", - "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "pallet-treasury" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "serde", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-utility" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-vesting" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-whitelist" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "pallet-xcm" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bounded-collections", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "xcm", - "xcm-executor", -] - -[[package]] -name = "pallet-xcm-benchmarks" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "parachain-info" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=master#48d01c4825f9f15b47dbf2f3f1cab4255d71a38f" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", -] - -[[package]] -name = "parachains-relay" -version = "0.1.0" -dependencies = [ - "async-std", - "async-trait", - "bp-polkadot-core", - "futures", - "log", - "parity-scale-codec", - "relay-substrate-client", - "relay-utils", - "sp-core", -] - -[[package]] -name = "parity-db" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4890dcb9556136a4ec2b0c51fa4a08c8b733b829506af8fff2e853f3a065985b" -dependencies = [ - "blake2", - "crc32fast", - "fs2", - "hex", - "libc", - "log", - "lz4", - "memmap2", - "parking_lot 0.12.1", - "rand 0.8.5", - "siphasher", - "snap", -] - -[[package]] -name = "parity-scale-codec" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ddb756ca205bd108aee3c62c6d3c994e1df84a59b9d6d4a5ea42ee1fd5a9a28" -dependencies = [ - "arrayvec 0.7.2", - "bitvec", - "byte-slice-cast", - "bytes", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b26a931f824dd4eca30b3e43bb4f31cd5f0d3a403c5f5ff27106b805bfde7b" -dependencies = [ - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "parity-send-wrapper" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" - -[[package]] -name = "parity-util-mem" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d32c34f4f5ca7f9196001c0aba5a1f9a5a12382c8944b8b0f90233282d1e8f8" -dependencies = [ - "cfg-if 1.0.0", - "ethereum-types", - "hashbrown 0.12.3", - "impl-trait-for-tuples", - "lru 0.8.1", - "parity-util-mem-derive", - "parking_lot 0.12.1", - "primitive-types", - "smallvec", - "winapi", -] - -[[package]] -name = "parity-util-mem-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" -dependencies = [ - "proc-macro2 1.0.57", - "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - -[[package]] -name = "parking" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.7", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "windows-sys 0.45.0", -] - -[[package]] -name = "paste" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" - -[[package]] -name = "pbkdf2" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" -dependencies = [ - "crypto-mac 0.11.1", -] - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.6", -] - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[package]] -name = "pem-rfc7468" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" - -[[package]] -name = "pest" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e68e84bfb01f0507134eac1e9b410a12ba379d064eab48c50ba4ce329a527b70" -dependencies = [ - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b79d4c71c865a25a4322296122e3924d30bc8ee0834c8bfc8b95f7f054afbfb" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c435bf1076437b851ebc8edc3a18442796b30f1728ffea6262d59bbe28b077e" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "pest_meta" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "745a452f8eb71e39ffd8ee32b3c5f51d03845f99786fa9b68db6ff509c505411" -dependencies = [ - "once_cell", - "pest", - "sha2 0.10.6", -] - -[[package]] -name = "petgraph" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "pin-project" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "pin-project-lite" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" - -[[package]] -name = "pin-project-lite" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der 0.7.5", - "spki 0.7.2", -] - -[[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] -name = "platforms" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" - -[[package]] -name = "platforms" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" - -[[package]] -name = "polkadot-approval-distribution" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "futures", - "polkadot-node-jaeger", - "polkadot-node-metrics", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-primitives", - "rand 0.8.5", - "tracing-gum", -] - -[[package]] -name = "polkadot-availability-bitfield-distribution" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "futures", - "polkadot-node-network-protocol", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "rand 0.8.5", - "tracing-gum", -] - -[[package]] -name = "polkadot-availability-distribution" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "derive_more", - "fatality", - "futures", - "lru 0.9.0", - "parity-scale-codec", - "polkadot-erasure-coding", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "rand 0.8.5", - "sp-core", - "sp-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-availability-recovery" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "fatality", - "futures", - "lru 0.9.0", - "parity-scale-codec", - "polkadot-erasure-coding", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "rand 0.8.5", - "sc-network", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-cli" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "clap 4.2.7", - "frame-benchmarking-cli", - "futures", - "log", - "polkadot-client", - "polkadot-node-core-pvf-worker", - "polkadot-node-metrics", - "polkadot-service", - "sc-cli", - "sc-executor", - "sc-service", - "sc-storage-monitor", - "sc-sysinfo", - "sc-tracing", - "sp-core", - "sp-io", - "sp-keyring", - "sp-maybe-compressed-blob", - "substrate-build-script-utils", - "thiserror", - "try-runtime-cli", -] - -[[package]] -name = "polkadot-client" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "async-trait", - "frame-benchmarking", - "frame-benchmarking-cli", - "frame-system", - "frame-system-rpc-runtime-api", - "futures", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "polkadot-core-primitives", - "polkadot-node-core-parachains-inherent", - "polkadot-primitives", - "polkadot-runtime", - "polkadot-runtime-common", - "sc-client-api", - "sc-consensus", - "sc-executor", - "sc-service", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-keyring", - "sp-mmr-primitives", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-storage", - "sp-timestamp", - "sp-transaction-pool", -] - -[[package]] -name = "polkadot-collator-protocol" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "always-assert", - "bitvec", - "fatality", - "futures", - "futures-timer", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-core", - "sp-keystore", - "sp-runtime", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-core-primitives" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "polkadot-dispute-distribution" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "derive_more", - "fatality", - "futures", - "futures-timer", - "indexmap", - "lru 0.9.0", - "parity-scale-codec", - "polkadot-erasure-coding", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sc-network", - "sp-application-crypto", - "sp-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-erasure-coding" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "parity-scale-codec", - "polkadot-node-primitives", - "polkadot-primitives", - "reed-solomon-novelpoly", - "sp-core", - "sp-trie", - "thiserror", -] - -[[package]] -name = "polkadot-gossip-support" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "futures", - "futures-timer", - "polkadot-node-network-protocol", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "rand 0.8.5", - "rand_chacha 0.3.1", - "sc-network", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "tracing-gum", -] - -[[package]] -name = "polkadot-network-bridge" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "always-assert", - "async-trait", - "bytes", - "fatality", - "futures", - "parity-scale-codec", - "parking_lot 0.12.1", - "polkadot-node-metrics", - "polkadot-node-network-protocol", - "polkadot-node-subsystem", - "polkadot-overseer", - "polkadot-primitives", - "sc-network", - "sp-consensus", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-collation-generation" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "futures", - "parity-scale-codec", - "polkadot-erasure-coding", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-core", - "sp-maybe-compressed-blob", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-approval-voting" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bitvec", - "derive_more", - "futures", - "futures-timer", - "kvdb", - "lru 0.9.0", - "merlin", - "parity-scale-codec", - "polkadot-node-jaeger", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-overseer", - "polkadot-primitives", - "sc-keystore", - "schnorrkel", - "sp-application-crypto", - "sp-consensus", - "sp-consensus-slots", - "sp-runtime", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-av-store" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bitvec", - "futures", - "futures-timer", - "kvdb", - "parity-scale-codec", - "polkadot-erasure-coding", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-overseer", - "polkadot-primitives", - "sp-consensus", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-backing" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bitvec", - "fatality", - "futures", - "polkadot-erasure-coding", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "polkadot-statement-table", - "sp-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-bitfield-signing" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "futures", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-keystore", - "thiserror", - "tracing-gum", - "wasm-timer", -] - -[[package]] -name = "polkadot-node-core-candidate-validation" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "parity-scale-codec", - "polkadot-node-core-pvf", - "polkadot-node-metrics", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-parachain", - "polkadot-primitives", - "sp-maybe-compressed-blob", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-chain-api" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "futures", - "polkadot-node-metrics", - "polkadot-node-subsystem", - "polkadot-primitives", - "sc-client-api", - "sc-consensus-babe", - "sp-blockchain", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-chain-selection" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "futures", - "futures-timer", - "kvdb", - "parity-scale-codec", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-dispute-coordinator" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "fatality", - "futures", - "kvdb", - "lru 0.9.0", - "parity-scale-codec", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sc-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-parachains-inherent" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "polkadot-node-subsystem", - "polkadot-overseer", - "polkadot-primitives", - "sp-blockchain", - "sp-inherents", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-provisioner" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bitvec", - "fatality", - "futures", - "futures-timer", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "rand 0.8.5", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-pvf" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "always-assert", - "futures", - "futures-timer", - "libc", - "parity-scale-codec", - "pin-project", - "polkadot-core-primitives", - "polkadot-node-metrics", - "polkadot-node-primitives", - "polkadot-parachain", - "polkadot-primitives", - "rand 0.8.5", - "slotmap", - "sp-core", - "sp-maybe-compressed-blob", - "sp-tracing", - "sp-wasm-interface", - "substrate-build-script-utils", - "tokio", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-pvf-checker" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "futures", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-overseer", - "polkadot-primitives", - "sp-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-pvf-worker" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "assert_matches", - "cpu-time", - "futures", - "libc", - "parity-scale-codec", - "polkadot-node-core-pvf", - "polkadot-parachain", - "polkadot-primitives", - "rayon", - "sc-executor", - "sc-executor-common", - "sc-executor-wasmtime", - "sp-core", - "sp-externalities", - "sp-io", - "sp-maybe-compressed-blob", - "sp-tracing", - "substrate-build-script-utils", - "tempfile", - "tikv-jemalloc-ctl", - "tokio", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-runtime-api" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "futures", - "lru 0.9.0", - "polkadot-node-metrics", - "polkadot-node-subsystem", - "polkadot-node-subsystem-types", - "polkadot-primitives", - "sp-consensus-babe", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-jaeger" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "lazy_static", - "log", - "mick-jaeger", - "parity-scale-codec", - "parking_lot 0.12.1", - "polkadot-node-primitives", - "polkadot-primitives", - "sc-network", - "sp-core", - "thiserror", - "tokio", -] - -[[package]] -name = "polkadot-node-metrics" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bs58", - "futures", - "futures-timer", - "log", - "parity-scale-codec", - "polkadot-primitives", - "prioritized-metered-channel", - "sc-cli", - "sc-service", - "sc-tracing", - "substrate-prometheus-endpoint", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-network-protocol" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "async-trait", - "derive_more", - "fatality", - "futures", - "hex", - "parity-scale-codec", - "polkadot-node-jaeger", - "polkadot-node-primitives", - "polkadot-primitives", - "rand 0.8.5", - "sc-authority-discovery", - "sc-network", - "strum", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-primitives" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bounded-vec", - "futures", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "schnorrkel", - "serde", - "sp-application-crypto", - "sp-consensus-babe", - "sp-core", - "sp-keystore", - "sp-maybe-compressed-blob", - "sp-runtime", - "thiserror", - "zstd 0.11.2+zstd.1.5.2", -] - -[[package]] -name = "polkadot-node-subsystem" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "polkadot-node-jaeger", - "polkadot-node-subsystem-types", - "polkadot-overseer", -] - -[[package]] -name = "polkadot-node-subsystem-types" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "async-trait", - "derive_more", - "futures", - "orchestra", - "polkadot-node-jaeger", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-primitives", - "polkadot-statement-table", - "sc-network", - "smallvec", - "sp-api", - "sp-authority-discovery", - "sp-consensus-babe", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "polkadot-node-subsystem-util" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "async-trait", - "derive_more", - "fatality", - "futures", - "futures-channel", - "itertools", - "kvdb", - "lru 0.9.0", - "parity-db", - "parity-scale-codec", - "parking_lot 0.11.2", - "pin-project", - "polkadot-node-jaeger", - "polkadot-node-metrics", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-overseer", - "polkadot-primitives", - "prioritized-metered-channel", - "rand 0.8.5", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-overseer" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "lru 0.9.0", - "orchestra", - "parking_lot 0.12.1", - "polkadot-node-metrics", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem-types", - "polkadot-primitives", - "sc-client-api", - "sp-api", - "sp-core", - "tikv-jemalloc-ctl", - "tracing-gum", -] - -[[package]] -name = "polkadot-parachain" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bounded-collections", - "derive_more", - "frame-support", - "parity-scale-codec", - "polkadot-core-primitives", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "polkadot-primitives" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bitvec", - "hex-literal", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-authority-discovery", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "polkadot-rpc" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "jsonrpsee 0.16.2", - "mmr-rpc", - "pallet-transaction-payment-rpc", - "polkadot-primitives", - "sc-chain-spec", - "sc-client-api", - "sc-consensus-babe", - "sc-consensus-babe-rpc", - "sc-consensus-beefy", - "sc-consensus-beefy-rpc", - "sc-consensus-epochs", - "sc-consensus-grandpa", - "sc-consensus-grandpa-rpc", - "sc-rpc", - "sc-sync-state-rpc", - "sc-transaction-pool-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-keystore", - "sp-runtime", - "substrate-frame-rpc-system", - "substrate-state-trie-migration-rpc", -] - -[[package]] -name = "polkadot-runtime" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bitvec", - "frame-benchmarking", - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-bags-list", - "pallet-balances", - "pallet-bounties", - "pallet-child-bounties", - "pallet-collective", - "pallet-conviction-voting", - "pallet-democracy", - "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking", - "pallet-elections-phragmen", - "pallet-fast-unstake", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-membership", - "pallet-multisig", - "pallet-nomination-pools", - "pallet-nomination-pools-benchmarking", - "pallet-nomination-pools-runtime-api", - "pallet-offences", - "pallet-offences-benchmarking", - "pallet-preimage", - "pallet-proxy", - "pallet-referenda", - "pallet-scheduler", - "pallet-session", - "pallet-session-benchmarking", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-staking-runtime-api", - "pallet-timestamp", - "pallet-tips", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-treasury", - "pallet-utility", - "pallet-vesting", - "pallet-whitelist", - "pallet-xcm", - "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-constants", - "polkadot-runtime-parachains", - "rustc-hex", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-arithmetic", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-core", - "sp-inherents", - "sp-io", - "sp-mmr-primitives", - "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 5.0.0", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "polkadot-runtime-common" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bitvec", - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "libsecp256k1", - "log", - "pallet-authorship", - "pallet-babe", - "pallet-balances", - "pallet-election-provider-multi-phase", - "pallet-fast-unstake", - "pallet-session", - "pallet-staking", - "pallet-staking-reward-fn", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-treasury", - "pallet-vesting", - "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-parachains", - "rustc-hex", - "scale-info", - "serde", - "serde_derive", - "slot-range-helper", - "sp-api", - "sp-core", - "sp-inherents", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 5.0.0", - "static_assertions", - "xcm", -] - -[[package]] -name = "polkadot-runtime-constants" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "polkadot-runtime-metrics" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bs58", - "parity-scale-codec", - "polkadot-primitives", - "sp-std 5.0.0", - "sp-tracing", -] - -[[package]] -name = "polkadot-runtime-parachains" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bitflags", - "bitvec", - "derive_more", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances", - "pallet-session", - "pallet-staking", - "pallet-timestamp", - "pallet-vesting", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-metrics", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rustc-hex", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 5.0.0", - "static_assertions", - "xcm", - "xcm-executor", -] - -[[package]] -name = "polkadot-service" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "async-trait", - "frame-benchmarking-cli", - "frame-support", - "frame-system-rpc-runtime-api", - "futures", - "hex-literal", - "kusama-runtime", - "kvdb", - "kvdb-rocksdb", - "log", - "lru 0.9.0", - "mmr-gadget", - "pallet-babe", - "pallet-im-online", - "pallet-staking", - "pallet-transaction-payment-rpc-runtime-api", - "parity-db", - "polkadot-approval-distribution", - "polkadot-availability-bitfield-distribution", - "polkadot-availability-distribution", - "polkadot-availability-recovery", - "polkadot-client", - "polkadot-collator-protocol", - "polkadot-dispute-distribution", - "polkadot-gossip-support", - "polkadot-network-bridge", - "polkadot-node-collation-generation", - "polkadot-node-core-approval-voting", - "polkadot-node-core-av-store", - "polkadot-node-core-backing", - "polkadot-node-core-bitfield-signing", - "polkadot-node-core-candidate-validation", - "polkadot-node-core-chain-api", - "polkadot-node-core-chain-selection", - "polkadot-node-core-dispute-coordinator", - "polkadot-node-core-parachains-inherent", - "polkadot-node-core-provisioner", - "polkadot-node-core-pvf-checker", - "polkadot-node-core-runtime-api", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-types", - "polkadot-node-subsystem-util", - "polkadot-overseer", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-rpc", - "polkadot-runtime", - "polkadot-runtime-constants", - "polkadot-runtime-parachains", - "polkadot-statement-distribution", - "rococo-runtime", - "sc-authority-discovery", - "sc-basic-authorship", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-client-db", - "sc-consensus", - "sc-consensus-babe", - "sc-consensus-beefy", - "sc-consensus-grandpa", - "sc-consensus-slots", - "sc-executor", - "sc-keystore", - "sc-network", - "sc-network-common", - "sc-network-sync", - "sc-offchain", - "sc-service", - "sc-sync-state-rpc", - "sc-sysinfo", - "sc-telemetry", - "sc-transaction-pool", - "serde", - "serde_json", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-mmr-primitives", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-state-machine", - "sp-storage", - "sp-timestamp", - "sp-transaction-pool", - "sp-trie", - "substrate-prometheus-endpoint", - "thiserror", - "tracing-gum", - "westend-runtime", -] - -[[package]] -name = "polkadot-statement-distribution" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "arrayvec 0.5.2", - "fatality", - "futures", - "indexmap", - "parity-scale-codec", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-keystore", - "sp-staking", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-statement-table" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "parity-scale-codec", - "polkadot-primitives", - "sp-core", -] - -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags", - "cfg-if 1.0.0", - "concurrent-queue", - "libc", - "log", - "pin-project-lite 0.2.9", - "windows-sys 0.48.0", -] - -[[package]] -name = "poly1305" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" -dependencies = [ - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash 0.4.1", -] - -[[package]] -name = "polyval" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash 0.4.1", -] - -[[package]] -name = "polyval" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash 0.5.0", -] - -[[package]] -name = "portable-atomic" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e30165d31df606f5726b090ec7592c308a0eaf61721ff64c9a3018e344a8753e" -dependencies = [ - "portable-atomic 1.3.2", -] - -[[package]] -name = "portable-atomic" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc59d1bcc64fc5d021d67521f818db868368028108d37f0e98d74e33f68297b5" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "predicates" -version = "2.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" -dependencies = [ - "difflib", - "float-cmp", - "itertools", - "normalize-line-endings", - "predicates-core", - "regex", -] - -[[package]] -name = "predicates-core" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" - -[[package]] -name = "predicates-tree" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" -dependencies = [ - "predicates-core", - "termtree", -] - -[[package]] -name = "prettyplease" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" -dependencies = [ - "proc-macro2 1.0.57", - "syn 1.0.109", -] - -[[package]] -name = "prettyplease" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617feabb81566b593beb4886fb8c1f38064169dae4dccad0e3220160c3b37203" -dependencies = [ - "proc-macro2 1.0.57", - "syn 2.0.16", -] - -[[package]] -name = "primitive-types" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "prioritized-metered-channel" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382698e48a268c832d0b181ed438374a6bb708a82a8ca273bb0f61c74cf209c4" -dependencies = [ - "coarsetime", - "crossbeam-queue", - "derive_more", - "futures", - "futures-timer", - "nanorand", - "thiserror", - "tracing", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "version_check", -] - -[[package]] -name = "proc-macro-warning" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e99670bafb56b9a106419397343bdbc8b8742c3cc449fec6345f86173f47cd4" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - -[[package]] -name = "proc-macro2" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4ec6d5fe0b140acb27c9a0444118cf55bfbb4e0b259739429abb4521dd67c16" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "prometheus" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" -dependencies = [ - "cfg-if 1.0.0", - "fnv", - "lazy_static", - "memchr", - "parking_lot 0.12.1", - "thiserror", -] - -[[package]] -name = "prometheus-client" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6fa99d535dd930d1249e6c79cb3c2915f9172a540fe2b02a4c8f9ca954721e" -dependencies = [ - "dtoa", - "itoa", - "parking_lot 0.12.1", - "prometheus-client-derive-encode", -] - -[[package]] -name = "prometheus-client-derive-encode" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b6a5217beb0ad503ee7fa752d451c905113d70721b937126158f3106a48cc1" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "prost" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" -dependencies = [ - "bytes", - "heck 0.4.1", - "itertools", - "lazy_static", - "log", - "multimap", - "petgraph", - "prettyplease 0.1.25", - "prost", - "prost-types", - "regex", - "syn 1.0.109", - "tempfile", - "which", -] - -[[package]] -name = "prost-derive" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "prost-types" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" -dependencies = [ - "prost", -] - -[[package]] -name = "psm" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" -dependencies = [ - "cc", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quick-protobuf" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" -dependencies = [ - "byteorder", -] - -[[package]] -name = "quick-protobuf-codec" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1693116345026436eb2f10b677806169c1a1260c1c60eaaffe3fb5a29ae23d8b" -dependencies = [ - "asynchronous-codec", - "bytes", - "quick-protobuf", - "thiserror", - "unsigned-varint", -] - -[[package]] -name = "quicksink" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858" -dependencies = [ - "futures-core", - "futures-sink", - "pin-project-lite 0.1.12", -] - -[[package]] -name = "quinn-proto" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c10f662eee9c94ddd7135043e544f3c82fa839a1e7b865911331961b53186c" -dependencies = [ - "bytes", - "rand 0.8.5", - "ring", - "rustc-hash", - "rustls 0.20.8", - "slab", - "thiserror", - "tinyvec", - "tracing", - "webpki 0.22.0", -] - -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - -[[package]] -name = "quote" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" -dependencies = [ - "proc-macro2 1.0.57", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.9", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", -] - -[[package]] -name = "rbtag" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c64936fcc0b811890a9d90020f3df5cec9c604efde88af7db6a35d365132a3" -dependencies = [ - "rbtag_derive", -] - -[[package]] -name = "rbtag_derive" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75511b710ccca8adbb211e04763bd8c78fed585b0ec188a20ed9b0dd95567c4" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "syn 0.15.44", -] - -[[package]] -name = "rcgen" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" -dependencies = [ - "pem", - "ring", - "time 0.3.21", - "x509-parser 0.13.2", - "yasna", -] - -[[package]] -name = "rcgen" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" -dependencies = [ - "pem", - "ring", - "time 0.3.21", - "yasna", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom 0.2.9", - "redox_syscall 0.2.16", - "thiserror", -] - -[[package]] -name = "reed-solomon-novelpoly" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd8f48b2066e9f69ab192797d66da804d1935bf22763204ed3675740cb0f221" -dependencies = [ - "derive_more", - "fs-err", - "itertools", - "static_init 0.5.2", - "thiserror", -] - -[[package]] -name = "ref-cast" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43faa91b1c8b36841ee70e97188a869d37ae21759da6846d4be66de5bf7b12c" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d2275aab483050ab2a7364c1a46604865ee7d6906684e08db0f090acf74f9e7" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "regalloc2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" -dependencies = [ - "fxhash", - "log", - "slice-group-by", - "smallvec", -] - -[[package]] -name = "regex" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" -dependencies = [ - "aho-corasick 1.0.1", - "memchr", - "regex-syntax 0.7.1", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" - -[[package]] -name = "region" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" -dependencies = [ - "bitflags", - "libc", - "mach", - "winapi", -] - -[[package]] -name = "relay-bridge-hub-kusama-client" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-kusama", - "bp-bridge-hub-polkadot", - "bp-header-chain", - "bp-messages", - "bp-parachains", - "bp-polkadot", - "bp-runtime", - "bridge-runtime-common", - "parity-scale-codec", - "relay-substrate-client", - "scale-info", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "relay-bridge-hub-polkadot-client" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-kusama", - "bp-bridge-hub-polkadot", - "bp-header-chain", - "bp-kusama", - "bp-messages", - "bp-parachains", - "bp-polkadot-core", - "bp-runtime", - "bridge-runtime-common", - "parity-scale-codec", - "relay-substrate-client", - "scale-info", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "relay-bridge-hub-rococo-client" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-rococo", - "bp-bridge-hub-wococo", - "bp-header-chain", - "bp-messages", - "bp-parachains", - "bp-polkadot-core", - "bp-runtime", - "bp-wococo", - "bridge-runtime-common", - "parity-scale-codec", - "relay-substrate-client", - "scale-info", - "sp-core", - "sp-runtime", - "sp-weights", - "subxt", -] - -[[package]] -name = "relay-bridge-hub-wococo-client" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-rococo", - "bp-bridge-hub-wococo", - "bp-header-chain", - "bp-messages", - "bp-parachains", - "bp-polkadot-core", - "bp-rococo", - "bp-runtime", - "bridge-runtime-common", - "parity-scale-codec", - "relay-bridge-hub-rococo-client", - "relay-substrate-client", - "scale-info", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "sp-weights", - "subxt", -] - -[[package]] -name = "relay-kusama-client" -version = "0.1.0" -dependencies = [ - "bp-kusama", - "bp-runtime", - "relay-substrate-client", - "relay-utils", - "sp-core", -] - -[[package]] -name = "relay-millau-client" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-millau", - "bp-runtime", - "frame-support", - "frame-system", - "millau-runtime", - "pallet-transaction-payment", - "parity-scale-codec", - "relay-substrate-client", - "relay-utils", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "relay-polkadot-client" -version = "0.1.0" -dependencies = [ - "bp-polkadot", - "bp-runtime", - "relay-substrate-client", - "relay-utils", - "sp-core", -] - -[[package]] -name = "relay-rialto-client" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-rialto", - "bp-runtime", - "frame-support", - "frame-system", - "pallet-transaction-payment", - "parity-scale-codec", - "relay-substrate-client", - "relay-utils", - "rialto-runtime", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "relay-rialto-parachain-client" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-cumulus", - "bp-header-chain", - "bp-messages", - "bp-millau", - "bp-polkadot-core", - "bp-rialto-parachain", - "bp-runtime", - "bridge-runtime-common", - "parity-scale-codec", - "relay-substrate-client", - "scale-info", - "sp-core", - "sp-runtime", - "sp-weights", - "subxt", -] - -[[package]] -name = "relay-rococo-client" -version = "0.1.0" -dependencies = [ - "bp-rococo", - "bp-runtime", - "relay-substrate-client", - "relay-utils", - "sp-core", -] - -[[package]] -name = "relay-substrate-client" -version = "0.1.0" -dependencies = [ - "async-std", - "async-trait", - "bp-header-chain", - "bp-messages", - "bp-polkadot-core", - "bp-runtime", - "finality-relay", - "frame-support", - "frame-system", - "futures", - "jsonrpsee 0.17.1", - "log", - "num-traits", - "pallet-balances", - "pallet-bridge-messages", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-utility", - "parity-scale-codec", - "rand 0.8.5", - "relay-utils", - "sc-chain-spec", - "sc-rpc-api", - "sc-transaction-pool-api", - "scale-info", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-std 5.0.0", - "sp-trie", - "sp-version", - "thiserror", - "tokio", - "xcm", -] - -[[package]] -name = "relay-utils" -version = "0.1.0" -dependencies = [ - "ansi_term", - "anyhow", - "async-std", - "async-trait", - "backoff", - "bp-runtime", - "env_logger", - "futures", - "isahc", - "jsonpath_lib", - "log", - "num-traits", - "serde_json", - "sp-runtime", - "substrate-prometheus-endpoint", - "sysinfo", - "thiserror", - "time 0.3.21", - "tokio", -] - -[[package]] -name = "relay-westend-client" -version = "0.1.0" -dependencies = [ - "bp-runtime", - "bp-westend", - "relay-substrate-client", - "relay-utils", - "sp-core", -] - -[[package]] -name = "relay-wococo-client" -version = "0.1.0" -dependencies = [ - "bp-runtime", - "bp-wococo", - "relay-substrate-client", - "relay-utils", - "sp-core", -] - -[[package]] -name = "resolv-conf" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" -dependencies = [ - "hostname", - "quick-error", -] - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac 0.12.1", - "zeroize", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac 0.12.1", - "subtle", -] - -[[package]] -name = "rialto-bridge-node" -version = "0.1.0" -dependencies = [ - "clap 4.2.7", - "frame-benchmarking", - "frame-benchmarking-cli", - "frame-support", - "node-inspect", - "polkadot-node-core-pvf-worker", - "polkadot-primitives", - "polkadot-runtime-parachains", - "polkadot-service", - "rialto-runtime", - "sc-cli", - "sc-executor", - "sc-service", - "serde_json", - "sp-authority-discovery", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "substrate-build-script-utils", -] - -[[package]] -name = "rialto-parachain-collator" -version = "0.1.0" -dependencies = [ - "clap 4.2.7", - "cumulus-client-cli", - "cumulus-client-consensus-aura", - "cumulus-client-consensus-common", - "cumulus-client-network", - "cumulus-client-service", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-relay-chain-interface", - "frame-benchmarking", - "frame-benchmarking-cli", - "jsonrpsee 0.16.2", - "log", - "pallet-transaction-payment-rpc", - "parity-scale-codec", - "polkadot-cli", - "polkadot-primitives", - "polkadot-service", - "rialto-parachain-runtime", - "sc-basic-authorship", - "sc-chain-spec", - "sc-cli", - "sc-client-api", - "sc-consensus", - "sc-executor", - "sc-network", - "sc-network-sync", - "sc-rpc", - "sc-rpc-api", - "sc-service", - "sc-telemetry", - "sc-tracing", - "sc-transaction-pool", - "serde", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-keystore", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-timestamp", - "sp-transaction-pool", - "substrate-build-script-utils", - "substrate-frame-rpc-system", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "rialto-parachain-runtime" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-millau", - "bp-relayers", - "bp-rialto-parachain", - "bp-runtime", - "bridge-runtime-common", - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "hex-literal", - "pallet-aura", - "pallet-balances", - "pallet-bridge-grandpa", - "pallet-bridge-messages", - "pallet-bridge-relayers", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-xcm", - "parachain-info", - "parity-scale-codec", - "polkadot-parachain", - "scale-info", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std 5.0.0", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "rialto-runtime" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-millau", - "bp-relayers", - "bp-rialto", - "bp-runtime", - "bridge-runtime-common", - "env_logger", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "pallet-authority-discovery", - "pallet-babe", - "pallet-balances", - "pallet-beefy", - "pallet-beefy-mmr", - "pallet-bridge-beefy", - "pallet-bridge-grandpa", - "pallet-bridge-messages", - "pallet-bridge-relayers", - "pallet-grandpa", - "pallet-mmr", - "pallet-session", - "pallet-shift-session-manager", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-xcm", - "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "scale-info", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std 5.0.0", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rustc-hex", -] - -[[package]] -name = "rocksdb" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe" -dependencies = [ - "libc", - "librocksdb-sys", -] - -[[package]] -name = "rococo-runtime" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "binary-merkle-tree", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances", - "pallet-beefy", - "pallet-beefy-mmr", - "pallet-bounties", - "pallet-child-bounties", - "pallet-collective", - "pallet-democracy", - "pallet-elections-phragmen", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-membership", - "pallet-mmr", - "pallet-multisig", - "pallet-nis", - "pallet-offences", - "pallet-preimage", - "pallet-proxy", - "pallet-recovery", - "pallet-scheduler", - "pallet-session", - "pallet-society", - "pallet-staking", - "pallet-state-trie-migration", - "pallet-sudo", - "pallet-timestamp", - "pallet-tips", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-treasury", - "pallet-utility", - "pallet-vesting", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "rococo-runtime-constants", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-core", - "sp-inherents", - "sp-io", - "sp-mmr-primitives", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 5.0.0", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "rococo-runtime-constants" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "rpassword" -version = "7.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678cf63ab3491898c0d021b493c94c9b221d91295294a2a5746eacbe5928322" -dependencies = [ - "libc", - "rtoolbox", - "winapi", -] - -[[package]] -name = "rtcp" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1919efd6d4a6a85d13388f9487549bb8e359f17198cc03ffd72f79b553873691" -dependencies = [ - "bytes", - "thiserror", - "webrtc-util", -] - -[[package]] -name = "rtnetlink" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" -dependencies = [ - "futures", - "log", - "netlink-packet-route", - "netlink-proto", - "nix", - "thiserror", - "tokio", -] - -[[package]] -name = "rtoolbox" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034e22c514f5c0cb8a10ff341b9b048b5ceb21591f31c8f44c43b960f9b3524a" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "rtp" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a095411ff00eed7b12e4c6a118ba984d113e1079582570d56a5ee723f11f80" -dependencies = [ - "async-trait", - "bytes", - "rand 0.8.5", - "serde", - "thiserror", - "webrtc-util", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver 1.0.17", -] - -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "0.36.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a38f9520be93aba504e8ca974197f46158de5dcaa9fa04b57c57cd6a679d658" -dependencies = [ - "bitflags", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.1.4", - "windows-sys 0.45.0", -] - -[[package]] -name = "rustix" -version = "0.37.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" -dependencies = [ - "bitflags", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.7", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64 0.13.1", - "log", - "ring", - "sct 0.6.1", - "webpki 0.21.4", -] - -[[package]] -name = "rustls" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" -dependencies = [ - "log", - "ring", - "sct 0.7.0", - "webpki 0.22.0", -] - -[[package]] -name = "rustls" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c911ba11bc8433e811ce56fde130ccf32f5127cab0e0194e9c68c5a5b671791e" -dependencies = [ - "log", - "ring", - "rustls-webpki", - "sct 0.7.0", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" -dependencies = [ - "base64 0.21.0", -] - -[[package]] -name = "rustls-webpki" -version = "0.100.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" - -[[package]] -name = "rw-stream-sink" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" -dependencies = [ - "futures", - "pin-project", - "static_assertions", -] - -[[package]] -name = "ryu" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" - -[[package]] -name = "safe_arch" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "794821e4ccb0d9f979512f9c1973480123f9bd62a90d74ab0f9426fcf8f4a529" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "sc-allocator" -version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "log", - "sp-core", - "sp-wasm-interface", - "thiserror", -] - -[[package]] -name = "sc-authority-discovery" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "ip_network", - "libp2p", - "log", - "multihash 0.17.0", - "parity-scale-codec", - "prost", - "prost-build", - "rand 0.8.5", - "sc-client-api", - "sc-network", - "sc-network-common", - "sp-api", - "sp-authority-discovery", - "sp-blockchain", - "sp-core", - "sp-keystore", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-basic-authorship" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "futures", - "futures-timer", - "log", - "parity-scale-codec", - "sc-block-builder", - "sc-client-api", - "sc-proposer-metrics", - "sc-telemetry", - "sc-transaction-pool-api", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-block-builder" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "sc-client-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-core", - "sp-inherents", - "sp-runtime", -] - -[[package]] -name = "sc-chain-spec" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "memmap2", - "sc-chain-spec-derive", - "sc-client-api", - "sc-executor", - "sc-network", - "sc-telemetry", - "serde", - "serde_json", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-state-machine", -] - -[[package]] -name = "sc-chain-spec-derive" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "sc-cli" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "chrono", - "clap 4.2.7", - "fdlimit", - "futures", - "libp2p-identity", - "log", - "names", - "parity-scale-codec", - "rand 0.8.5", - "regex", - "rpassword", - "sc-client-api", - "sc-client-db", - "sc-keystore", - "sc-network", - "sc-network-common", - "sc-service", - "sc-telemetry", - "sc-tracing", - "sc-utils", - "serde", - "serde_json", - "sp-blockchain", - "sp-core", - "sp-keyring", - "sp-keystore", - "sp-panic-handler", - "sp-runtime", - "sp-version", - "thiserror", - "tiny-bip39", - "tokio", -] - -[[package]] -name = "sc-client-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "fnv", - "futures", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-executor", - "sc-transaction-pool-api", - "sc-utils", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-database", - "sp-externalities", - "sp-keystore", - "sp-runtime", - "sp-state-machine", - "sp-statement-store", - "sp-storage", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-client-db" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "hash-db", - "kvdb", - "kvdb-memorydb", - "kvdb-rocksdb", - "linked-hash-map", - "log", - "parity-db", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-client-api", - "sc-state-db", - "schnellru", - "sp-arithmetic", - "sp-blockchain", - "sp-core", - "sp-database", - "sp-runtime", - "sp-state-machine", - "sp-trie", -] - -[[package]] -name = "sc-consensus" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "libp2p-identity", - "log", - "mockall", - "parking_lot 0.12.1", - "sc-client-api", - "sc-utils", - "serde", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", - "sp-state-machine", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-consensus-aura" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "futures", - "log", - "parity-scale-codec", - "sc-block-builder", - "sc-client-api", - "sc-consensus", - "sc-consensus-slots", - "sc-telemetry", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-aura", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-consensus-babe" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "fork-tree", - "futures", - "log", - "num-bigint", - "num-rational", - "num-traits", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-client-api", - "sc-consensus", - "sc-consensus-epochs", - "sc-consensus-slots", - "sc-keystore", - "sc-telemetry", - "scale-info", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-consensus-babe-rpc" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "futures", - "jsonrpsee 0.16.2", - "sc-consensus-babe", - "sc-consensus-epochs", - "sc-rpc-api", - "serde", - "sp-api", - "sp-application-crypto", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-core", - "sp-keystore", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-consensus-beefy" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "async-trait", - "fnv", - "futures", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-client-api", - "sc-consensus", - "sc-keystore", - "sc-network", - "sc-network-common", - "sc-network-gossip", - "sc-network-sync", - "sc-utils", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-beefy", - "sp-core", - "sp-keystore", - "sp-mmr-primitives", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", - "wasm-timer", -] - -[[package]] -name = "sc-consensus-beefy-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "futures", - "jsonrpsee 0.16.2", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-consensus-beefy", - "sc-rpc", - "serde", - "sp-consensus-beefy", - "sp-core", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-consensus-epochs" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "fork-tree", - "parity-scale-codec", - "sc-client-api", - "sc-consensus", - "sp-blockchain", - "sp-runtime", -] - -[[package]] -name = "sc-consensus-grandpa" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "ahash 0.8.3", - "array-bytes 4.2.0", - "async-trait", - "dyn-clone", - "finality-grandpa", - "fork-tree", - "futures", - "futures-timer", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-consensus", - "sc-network", - "sc-network-common", - "sc-network-gossip", - "sc-telemetry", - "sc-utils", - "serde_json", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-grandpa", - "sp-core", - "sp-keystore", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-consensus-grandpa-rpc" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "finality-grandpa", - "futures", - "jsonrpsee 0.16.2", - "log", - "parity-scale-codec", - "sc-client-api", - "sc-consensus-grandpa", - "sc-rpc", - "serde", - "sp-blockchain", - "sp-core", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-consensus-slots" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "log", - "parity-scale-codec", - "sc-client-api", - "sc-consensus", - "sc-telemetry", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", -] - -[[package]] -name = "sc-executor" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "lru 0.8.1", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-executor-common", - "sc-executor-wasmi", - "sc-executor-wasmtime", - "sp-api", - "sp-core", - "sp-externalities", - "sp-io", - "sp-panic-handler", - "sp-runtime-interface", - "sp-trie", - "sp-version", - "sp-wasm-interface", - "tracing", - "wasmi", -] - -[[package]] -name = "sc-executor-common" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "sc-allocator", - "sp-maybe-compressed-blob", - "sp-wasm-interface", - "thiserror", - "wasm-instrument", - "wasmi", -] - -[[package]] -name = "sc-executor-wasmi" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "log", - "sc-allocator", - "sc-executor-common", - "sp-runtime-interface", - "sp-wasm-interface", - "wasmi", -] - -[[package]] -name = "sc-executor-wasmtime" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "anyhow", - "cfg-if 1.0.0", - "libc", - "log", - "once_cell", - "rustix 0.36.13", - "sc-allocator", - "sc-executor-common", - "sp-runtime-interface", - "sp-wasm-interface", - "wasmtime", -] - -[[package]] -name = "sc-informant" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "ansi_term", - "futures", - "futures-timer", - "log", - "sc-client-api", - "sc-network", - "sc-network-common", - "sp-blockchain", - "sp-runtime", -] - -[[package]] -name = "sc-keystore" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "parking_lot 0.12.1", - "serde_json", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "thiserror", -] - -[[package]] -name = "sc-network" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "async-channel", - "async-trait", - "asynchronous-codec", - "bytes", - "either", - "fnv", - "futures", - "futures-timer", - "ip_network", - "libp2p", - "linked_hash_set", - "log", - "lru 0.8.1", - "mockall", - "parity-scale-codec", - "parking_lot 0.12.1", - "pin-project", - "rand 0.8.5", - "sc-block-builder", - "sc-client-api", - "sc-consensus", - "sc-network-common", - "sc-peerset", - "sc-utils", - "serde", - "serde_json", - "smallvec", - "snow", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", - "unsigned-varint", - "zeroize", -] - -[[package]] -name = "sc-network-bitswap" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "cid", - "futures", - "libp2p-identity", - "log", - "prost", - "prost-build", - "sc-client-api", - "sc-network", - "sc-network-common", - "sp-blockchain", - "sp-runtime", - "thiserror", - "unsigned-varint", -] - -[[package]] -name = "sc-network-common" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "async-trait", - "bitflags", - "bytes", - "futures", - "futures-timer", - "libp2p-identity", - "parity-scale-codec", - "prost-build", - "sc-consensus", - "sc-peerset", - "sc-utils", - "serde", - "smallvec", - "sp-blockchain", - "sp-consensus", - "sp-consensus-grandpa", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", - "zeroize", -] - -[[package]] -name = "sc-network-gossip" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "ahash 0.8.3", - "futures", - "futures-timer", - "libp2p", - "log", - "lru 0.8.1", - "sc-network", - "sc-network-common", - "sc-peerset", - "sp-runtime", - "substrate-prometheus-endpoint", - "tracing", -] - -[[package]] -name = "sc-network-light" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "futures", - "libp2p-identity", - "log", - "parity-scale-codec", - "prost", - "prost-build", - "sc-client-api", - "sc-network", - "sc-network-common", - "sc-peerset", - "sp-blockchain", - "sp-core", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-network-sync" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "async-trait", - "fork-tree", - "futures", - "futures-timer", - "libp2p", - "log", - "lru 0.8.1", - "mockall", - "parity-scale-codec", - "prost", - "prost-build", - "sc-client-api", - "sc-consensus", - "sc-network", - "sc-network-common", - "sc-peerset", - "sc-utils", - "smallvec", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-network-transactions" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "futures", - "libp2p", - "log", - "parity-scale-codec", - "pin-project", - "sc-network", - "sc-network-common", - "sc-peerset", - "sc-utils", - "sp-consensus", - "sp-runtime", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-offchain" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "bytes", - "fnv", - "futures", - "futures-timer", - "hyper", - "hyper-rustls", - "libp2p", - "num_cpus", - "once_cell", - "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", - "sc-client-api", - "sc-network", - "sc-network-common", - "sc-peerset", - "sc-utils", - "sp-api", - "sp-core", - "sp-offchain", - "sp-runtime", - "threadpool", - "tracing", -] - -[[package]] -name = "sc-peerset" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "futures", - "libp2p-identity", - "log", - "sc-utils", - "serde_json", - "wasm-timer", -] - -[[package]] -name = "sc-proposer-metrics" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "log", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "futures", - "jsonrpsee 0.16.2", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-rpc-api", - "sc-tracing", - "sc-transaction-pool-api", - "sc-utils", - "serde_json", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-keystore", - "sp-offchain", - "sp-rpc", - "sp-runtime", - "sp-session", - "sp-statement-store", - "sp-version", - "tokio", -] - -[[package]] -name = "sc-rpc-api" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "jsonrpsee 0.16.2", - "parity-scale-codec", - "sc-chain-spec", - "sc-transaction-pool-api", - "scale-info", - "serde", - "serde_json", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-version", - "thiserror", -] - -[[package]] -name = "sc-rpc-server" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "http", - "jsonrpsee 0.16.2", - "log", - "serde_json", - "substrate-prometheus-endpoint", - "tokio", - "tower", - "tower-http", -] - -[[package]] -name = "sc-rpc-spec-v2" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "futures", - "futures-util", - "hex", - "jsonrpsee 0.16.2", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-chain-spec", - "sc-client-api", - "sc-transaction-pool-api", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-version", - "thiserror", - "tokio-stream", -] - -[[package]] -name = "sc-service" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "directories", - "exit-future", - "futures", - "futures-timer", - "jsonrpsee 0.16.2", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "pin-project", - "rand 0.8.5", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-client-db", - "sc-consensus", - "sc-executor", - "sc-informant", - "sc-keystore", - "sc-network", - "sc-network-bitswap", - "sc-network-common", - "sc-network-light", - "sc-network-sync", - "sc-network-transactions", - "sc-offchain", - "sc-rpc", - "sc-rpc-server", - "sc-rpc-spec-v2", - "sc-storage-monitor", - "sc-sysinfo", - "sc-telemetry", - "sc-tracing", - "sc-transaction-pool", - "sc-transaction-pool-api", - "sc-utils", - "serde", - "serde_json", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-externalities", - "sp-keystore", - "sp-runtime", - "sp-session", - "sp-state-machine", - "sp-storage", - "sp-transaction-pool", - "sp-transaction-storage-proof", - "sp-trie", - "sp-version", - "static_init 1.0.3", - "substrate-prometheus-endpoint", - "tempfile", - "thiserror", - "tokio", - "tracing", - "tracing-futures", -] - -[[package]] -name = "sc-state-db" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sp-core", -] - -[[package]] -name = "sc-storage-monitor" -version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "clap 4.2.7", - "fs4", - "futures", - "log", - "sc-client-db", - "sc-utils", - "sp-core", - "thiserror", - "tokio", -] - -[[package]] -name = "sc-sync-state-rpc" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "jsonrpsee 0.16.2", - "parity-scale-codec", - "sc-chain-spec", - "sc-client-api", - "sc-consensus-babe", - "sc-consensus-epochs", - "sc-consensus-grandpa", - "serde", - "serde_json", - "sp-blockchain", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-sysinfo" -version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "futures", - "libc", - "log", - "rand 0.8.5", - "rand_pcg", - "regex", - "sc-telemetry", - "serde", - "serde_json", - "sp-core", - "sp-io", - "sp-std 5.0.0", -] - -[[package]] -name = "sc-telemetry" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "chrono", - "futures", - "libp2p", - "log", - "parking_lot 0.12.1", - "pin-project", - "rand 0.8.5", - "sc-utils", - "serde", - "serde_json", - "thiserror", - "wasm-timer", -] - -[[package]] -name = "sc-tracing" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "ansi_term", - "atty", - "chrono", - "lazy_static", - "libc", - "log", - "once_cell", - "parking_lot 0.12.1", - "regex", - "rustc-hash", - "sc-client-api", - "sc-rpc-server", - "sc-tracing-proc-macro", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-tracing", - "thiserror", - "tracing", - "tracing-log", - "tracing-subscriber", -] - -[[package]] -name = "sc-tracing-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "sc-transaction-pool" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "linked-hash-map", - "log", - "num-traits", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-client-api", - "sc-transaction-pool-api", - "sc-utils", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-tracing", - "sp-transaction-pool", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-transaction-pool-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "futures", - "log", - "serde", - "sp-blockchain", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-utils" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-channel", - "futures", - "futures-timer", - "lazy_static", - "log", - "parking_lot 0.12.1", - "prometheus", - "sp-arithmetic", -] - -[[package]] -name = "scale-bits" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd7aca73785181cc41f0bbe017263e682b585ca660540ba569133901d013ecf" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", -] - -[[package]] -name = "scale-decode" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e5527e4b3bf079d4c0b2f253418598c380722ba37ef20fac9088081407f2b6" -dependencies = [ - "parity-scale-codec", - "primitive-types", - "scale-bits", - "scale-decode-derive", - "scale-info", - "thiserror", -] - -[[package]] -name = "scale-decode-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b38741b2f78e4391b94eac6b102af0f6ea2b0f7fe65adb55d7f4004f507854db" -dependencies = [ - "darling", - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "scale-encode" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15546e5efbb45f0fc2291f7e202dee8623274c5d8bbfdf9c6886cc8b44a7ced3" -dependencies = [ - "parity-scale-codec", - "primitive-types", - "scale-bits", - "scale-encode-derive", - "scale-info", - "thiserror", -] - -[[package]] -name = "scale-encode-derive" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd983cf0a9effd76138554ead18a6de542d1af175ac12fd5e91836c5c0268082" -dependencies = [ - "darling", - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "scale-info" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b569c32c806ec3abdf3b5869fb8bf1e0d275a7c1c9b0b05603d9464632649edf" -dependencies = [ - "bitvec", - "cfg-if 1.0.0", - "derive_more", - "parity-scale-codec", - "scale-info-derive", - "serde", -] - -[[package]] -name = "scale-info-derive" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53012eae69e5aa5c14671942a5dd47de59d4cdcff8532a6dd0e081faf1119482" -dependencies = [ - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "scale-value" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f549769261561e6764218f847e500588f9a79a289de49ce92f9e26642a3574" -dependencies = [ - "either", - "frame-metadata", - "parity-scale-codec", - "scale-bits", - "scale-decode", - "scale-encode", - "scale-info", - "serde", - "thiserror", - "yap", -] - -[[package]] -name = "schannel" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" -dependencies = [ - "windows-sys 0.42.0", -] - -[[package]] -name = "schnellru" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" -dependencies = [ - "ahash 0.8.3", - "cfg-if 1.0.0", - "hashbrown 0.13.2", -] - -[[package]] -name = "schnorrkel" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "curve25519-dalek 2.1.3", - "getrandom 0.1.16", - "merlin", - "rand 0.7.3", - "rand_core 0.5.1", - "sha2 0.8.2", - "subtle", - "zeroize", -] - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "scratch" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" - -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "sdp" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d22a5ef407871893fd72b4562ee15e4742269b173959db4b8df6f538c414e13" -dependencies = [ - "rand 0.8.5", - "substring", - "thiserror", - "url", -] - -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array 0.14.7", - "pkcs8 0.9.0", - "subtle", - "zeroize", -] - -[[package]] -name = "sec1" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" -dependencies = [ - "base16ct 0.2.0", - "der 0.7.5", - "generic-array 0.14.7", - "pkcs8 0.10.2", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" -dependencies = [ - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" -dependencies = [ - "cc", -] - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2855b3715770894e67cbfa3df957790aa0c9edc3bf06efa1a84d77fa0839d1" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" -dependencies = [ - "serde", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "serde" -version = "1.0.163" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.163" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "serde_json" -version = "1.0.96" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" -dependencies = [ - "serde", -] - -[[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.6", -] - -[[package]] -name = "sha2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "sha2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.6", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.6", - "keccak", -] - -[[package]] -name = "sharded-slab" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" - -[[package]] -name = "signal-hook" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-async-std" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4aa94397e2023af5b7cff5b8d4785e935cfb77f0e4aab0cae3b26258ace556" -dependencies = [ - "async-io", - "futures-lite", - "libc", - "signal-hook", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.6", - "rand_core 0.6.4", -] - -[[package]] -name = "signature" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" -dependencies = [ - "digest 0.10.6", - "rand_core 0.6.4", -] - -[[package]] -name = "simba" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - -[[package]] -name = "siphasher" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" - -[[package]] -name = "slab" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" -dependencies = [ - "autocfg", -] - -[[package]] -name = "slice-group-by" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" - -[[package]] -name = "slot-range-helper" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "enumn", - "parity-scale-codec", - "paste", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "slotmap" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" -dependencies = [ - "version_check", -] - -[[package]] -name = "sluice" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" -dependencies = [ - "async-channel", - "futures-core", - "futures-io", -] - -[[package]] -name = "smallvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" - -[[package]] -name = "snap" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831" - -[[package]] -name = "snow" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ccba027ba85743e09d15c03296797cad56395089b832b48b5a5217880f57733" -dependencies = [ - "aes-gcm 0.9.4", - "blake2", - "chacha20poly1305", - "curve25519-dalek 4.0.0-rc.1", - "rand_core 0.6.4", - "ring", - "rustc_version", - "sha2 0.10.6", - "subtle", -] - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "soketto" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" -dependencies = [ - "base64 0.13.1", - "bytes", - "flate2", - "futures", - "http", - "httparse", - "log", - "rand 0.8.5", - "sha-1", -] - -[[package]] -name = "sp-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "hash-db", - "log", - "parity-scale-codec", - "scale-info", - "sp-api-proc-macro", - "sp-core", - "sp-metadata-ir", - "sp-runtime", - "sp-state-machine", - "sp-std 5.0.0", - "sp-trie", - "sp-version", - "thiserror", -] - -[[package]] -name = "sp-api-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "Inflector", - "blake2", - "expander 1.0.0", - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "sp-application-crypto" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-std 5.0.0", -] - -[[package]] -name = "sp-arithmetic" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "integer-sqrt", - "num-traits", - "parity-scale-codec", - "scale-info", - "serde", - "sp-std 5.0.0", - "static_assertions", -] - -[[package]] -name = "sp-authority-discovery" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-application-crypto", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "sp-block-builder" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "sp-api", - "sp-inherents", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "sp-blockchain" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "futures", - "log", - "lru 0.8.1", - "parity-scale-codec", - "parking_lot 0.12.1", - "sp-api", - "sp-consensus", - "sp-database", - "sp-runtime", - "sp-state-machine", - "thiserror", -] - -[[package]] -name = "sp-consensus" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "futures", - "log", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "thiserror", -] - -[[package]] -name = "sp-consensus-aura" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-application-crypto", - "sp-consensus", - "sp-consensus-slots", - "sp-inherents", - "sp-runtime", - "sp-std 5.0.0", - "sp-timestamp", -] - -[[package]] -name = "sp-consensus-babe" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-consensus", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "sp-std 5.0.0", - "sp-timestamp", -] - -[[package]] -name = "sp-consensus-beefy" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "lazy_static", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-mmr-primitives", - "sp-runtime", - "sp-std 5.0.0", - "strum", -] - -[[package]] -name = "sp-consensus-grandpa" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "finality-grandpa", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "sp-consensus-slots" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "sp-std 5.0.0", - "sp-timestamp", -] - -[[package]] -name = "sp-core" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "array-bytes 4.2.0", - "bitflags", - "blake2", - "bounded-collections", - "bs58", - "dyn-clonable", - "ed25519-zebra", - "futures", - "hash-db", - "hash256-std-hasher", - "impl-serde", - "lazy_static", - "libsecp256k1", - "log", - "merlin", - "parity-scale-codec", - "parking_lot 0.12.1", - "paste", - "primitive-types", - "rand 0.8.5", - "regex", - "scale-info", - "schnorrkel", - "secp256k1", - "secrecy", - "serde", - "sp-core-hashing 5.0.0", - "sp-debug-derive", - "sp-externalities", - "sp-runtime-interface", - "sp-std 5.0.0", - "sp-storage", - "ss58-registry", - "substrate-bip39", - "thiserror", - "tiny-bip39", - "zeroize", -] - -[[package]] -name = "sp-core-hashing" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "blake2b_simd", - "byteorder", - "digest 0.10.6", - "sha2 0.10.6", - "sha3", - "sp-std 5.0.0", - "twox-hash", -] - -[[package]] -name = "sp-core-hashing" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27449abdfbe41b473e625bce8113745e81d65777dd1d5a8462cf24137930dad8" -dependencies = [ - "blake2b_simd", - "byteorder", - "digest 0.10.6", - "sha2 0.10.6", - "sha3", - "sp-std 7.0.0", - "twox-hash", -] - -[[package]] -name = "sp-core-hashing-proc-macro" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "sp-core-hashing 5.0.0", - "syn 2.0.16", -] - -[[package]] -name = "sp-database" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "kvdb", - "parking_lot 0.12.1", -] - -[[package]] -name = "sp-debug-derive" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "sp-externalities" -version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "environmental", - "parity-scale-codec", - "sp-std 5.0.0", - "sp-storage", -] - -[[package]] -name = "sp-inherents" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", - "thiserror", -] - -[[package]] -name = "sp-io" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "bytes", - "ed25519", - "ed25519-dalek", - "futures", - "libsecp256k1", - "log", - "parity-scale-codec", - "rustversion", - "secp256k1", - "sp-core", - "sp-externalities", - "sp-keystore", - "sp-runtime-interface", - "sp-state-machine", - "sp-std 5.0.0", - "sp-tracing", - "sp-trie", - "tracing", - "tracing-core", -] - -[[package]] -name = "sp-keyring" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "lazy_static", - "sp-core", - "sp-runtime", - "strum", -] - -[[package]] -name = "sp-keystore" -version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "futures", - "parity-scale-codec", - "parking_lot 0.12.1", - "serde", - "sp-core", - "sp-externalities", - "thiserror", -] - -[[package]] -name = "sp-maybe-compressed-blob" -version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "thiserror", - "zstd 0.12.3+zstd.1.5.2", -] - -[[package]] -name = "sp-metadata-ir" -version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-metadata", - "parity-scale-codec", - "scale-info", - "sp-std 5.0.0", -] - -[[package]] -name = "sp-mmr-primitives" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "ckb-merkle-mountain-range 0.5.2", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-core", - "sp-debug-derive", - "sp-runtime", - "sp-std 5.0.0", - "thiserror", -] - -[[package]] -name = "sp-npos-elections" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "sp-arithmetic", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "sp-offchain" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "sp-api", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "sp-panic-handler" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "backtrace", - "lazy_static", - "regex", -] - -[[package]] -name = "sp-rpc" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "rustc-hash", - "serde", - "sp-core", -] - -[[package]] -name = "sp-runtime" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "either", - "hash256-std-hasher", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "paste", - "rand 0.8.5", - "scale-info", - "serde", - "sp-application-crypto", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-std 5.0.0", - "sp-weights", -] - -[[package]] -name = "sp-runtime-interface" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "bytes", - "impl-trait-for-tuples", - "parity-scale-codec", - "primitive-types", - "sp-externalities", - "sp-runtime-interface-proc-macro", - "sp-std 5.0.0", - "sp-storage", - "sp-tracing", - "sp-wasm-interface", - "static_assertions", -] - -[[package]] -name = "sp-runtime-interface-proc-macro" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "Inflector", - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "sp-session" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-core", - "sp-runtime", - "sp-staking", - "sp-std 5.0.0", -] - -[[package]] -name = "sp-staking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std 5.0.0", -] - -[[package]] -name = "sp-state-machine" -version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "hash-db", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", - "smallvec", - "sp-core", - "sp-externalities", - "sp-panic-handler", - "sp-std 5.0.0", - "sp-trie", - "thiserror", - "tracing", -] - -[[package]] -name = "sp-statement-store" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "log", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-externalities", - "sp-runtime", - "sp-runtime-interface", - "sp-std 5.0.0", - "thiserror", -] - -[[package]] -name = "sp-std" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" - -[[package]] -name = "sp-std" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de8eef39962b5b97478719c493bed2926cf70cb621005bbf68ebe58252ff986" - -[[package]] -name = "sp-storage" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "impl-serde", - "parity-scale-codec", - "ref-cast", - "serde", - "sp-debug-derive", - "sp-std 5.0.0", -] - -[[package]] -name = "sp-timestamp" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "futures-timer", - "log", - "parity-scale-codec", - "sp-inherents", - "sp-runtime", - "sp-std 5.0.0", - "thiserror", -] - -[[package]] -name = "sp-tracing" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "sp-std 5.0.0", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "sp-transaction-pool" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "sp-api", - "sp-runtime", -] - -[[package]] -name = "sp-transaction-storage-proof" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-std 5.0.0", - "sp-trie", -] - -[[package]] -name = "sp-trie" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "ahash 0.8.3", - "hash-db", - "hashbrown 0.13.2", - "lazy_static", - "memory-db", - "nohash-hasher", - "parity-scale-codec", - "parking_lot 0.12.1", - "scale-info", - "schnellru", - "sp-core", - "sp-std 5.0.0", - "thiserror", - "tracing", - "trie-db", - "trie-root", -] - -[[package]] -name = "sp-version" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "impl-serde", - "parity-scale-codec", - "parity-wasm", - "scale-info", - "serde", - "sp-core-hashing-proc-macro", - "sp-runtime", - "sp-std 5.0.0", - "sp-version-proc-macro", - "thiserror", -] - -[[package]] -name = "sp-version-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "sp-wasm-interface" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "anyhow", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "sp-std 5.0.0", - "wasmi", - "wasmtime", -] - -[[package]] -name = "sp-weights" -version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "smallvec", - "sp-arithmetic", - "sp-core", - "sp-debug-derive", - "sp-std 5.0.0", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spinners" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08615eea740067d9899969bc2891c68a19c315cb1f66640af9a9ecb91b13bcab" -dependencies = [ - "lazy_static", - "maplit", - "strum", -] - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - -[[package]] -name = "spki" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" -dependencies = [ - "base64ct", - "der 0.7.5", -] - -[[package]] -name = "ss58-registry" -version = "1.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47a8ad42e5fc72d5b1eb104a5546937eaf39843499948bb666d6e93c62423b" -dependencies = [ - "Inflector", - "num-format", - "proc-macro2 1.0.57", - "quote 1.0.27", - "serde", - "serde_json", - "unicode-xid 0.2.4", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "static_init" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11b73400442027c4adedda20a9f9b7945234a5bd8d5f7e86da22bd5d0622369c" -dependencies = [ - "cfg_aliases", - "libc", - "parking_lot 0.11.2", - "static_init_macro 0.5.0", -] - -[[package]] -name = "static_init" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6" -dependencies = [ - "bitflags", - "cfg_aliases", - "libc", - "parking_lot 0.11.2", - "parking_lot_core 0.8.6", - "static_init_macro 1.0.2", - "winapi", -] - -[[package]] -name = "static_init_macro" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2261c91034a1edc3fc4d1b80e89d82714faede0515c14a75da10cb941546bbf" -dependencies = [ - "cfg_aliases", - "memchr", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "static_init_macro" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf" -dependencies = [ - "cfg_aliases", - "memchr", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "storage-proof-fuzzer" -version = "0.1.0" -dependencies = [ - "bp-runtime", - "env_logger", - "honggfuzz", - "log", - "sp-core", - "sp-runtime", - "sp-state-machine", - "sp-std 5.0.0", - "sp-trie", -] - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "structopt" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" -dependencies = [ - "clap 2.34.0", - "lazy_static", - "structopt-derive", -] - -[[package]] -name = "structopt-derive" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" -dependencies = [ - "heck 0.3.3", - "proc-macro-error", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.57", - "quote 1.0.27", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "stun" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e94b1ec00bad60e6410e058b52f1c66de3dc5fe4d62d09b3e52bb7d3b73e25" -dependencies = [ - "base64 0.13.1", - "crc", - "lazy_static", - "md-5", - "rand 0.8.5", - "ring", - "subtle", - "thiserror", - "tokio", - "url", - "webrtc-util", -] - -[[package]] -name = "substrate-bip39" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" -dependencies = [ - "hmac 0.11.0", - "pbkdf2 0.8.0", - "schnorrkel", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "substrate-build-script-utils" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "platforms 2.0.0", -] - -[[package]] -name = "substrate-frame-rpc-system" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "frame-system-rpc-runtime-api", - "futures", - "jsonrpsee 0.16.2", - "log", - "parity-scale-codec", - "sc-rpc-api", - "sc-transaction-pool-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "substrate-prometheus-endpoint" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "hyper", - "log", - "prometheus", - "thiserror", - "tokio", -] - -[[package]] -name = "substrate-relay" -version = "1.0.1" -dependencies = [ - "anyhow", - "async-std", - "async-trait", - "bp-header-chain", - "bp-messages", - "bp-millau", - "bp-parachains", - "bp-polkadot-core", - "bp-rialto", - "bp-rialto-parachain", - "bp-runtime", - "bp-test-utils", - "bridge-runtime-common", - "finality-grandpa", - "frame-support", - "futures", - "hex", - "hex-literal", - "log", - "millau-runtime", - "num-format", - "num-traits", - "pallet-bridge-parachains", - "parachains-relay", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "rbtag", - "relay-bridge-hub-kusama-client", - "relay-bridge-hub-polkadot-client", - "relay-bridge-hub-rococo-client", - "relay-bridge-hub-wococo-client", - "relay-kusama-client", - "relay-millau-client", - "relay-polkadot-client", - "relay-rialto-client", - "relay-rialto-parachain-client", - "relay-rococo-client", - "relay-substrate-client", - "relay-utils", - "relay-westend-client", - "relay-wococo-client", - "rialto-parachain-runtime", - "rialto-runtime", - "signal-hook", - "signal-hook-async-std", - "sp-core", - "sp-keyring", - "sp-runtime", - "structopt", - "strum", - "substrate-relay-helper", - "tempfile", - "xcm", - "xcm-executor", -] - -[[package]] -name = "substrate-relay-helper" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-std", - "async-trait", - "bp-header-chain", - "bp-messages", - "bp-parachains", - "bp-polkadot-core", - "bp-relayers", - "bp-rialto", - "bp-rialto-parachain", - "bp-rococo", - "bp-runtime", - "bp-wococo", - "bridge-runtime-common", - "finality-grandpa", - "finality-relay", - "frame-support", - "frame-system", - "futures", - "hex", - "log", - "messages-relay", - "num-traits", - "pallet-balances", - "pallet-bridge-grandpa", - "pallet-bridge-messages", - "pallet-bridge-parachains", - "pallet-transaction-payment", - "parachains-relay", - "parity-scale-codec", - "relay-rialto-client", - "relay-rococo-client", - "relay-substrate-client", - "relay-utils", - "relay-wococo-client", - "rialto-runtime", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "substrate-rpc-client" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "jsonrpsee 0.16.2", - "log", - "sc-rpc-api", - "serde", - "sp-runtime", -] - -[[package]] -name = "substrate-state-trie-migration-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "jsonrpsee 0.16.2", - "log", - "parity-scale-codec", - "sc-client-api", - "sc-rpc-api", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-state-machine", - "sp-trie", - "trie-db", -] - -[[package]] -name = "substrate-wasm-builder" -version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "ansi_term", - "build-helper", - "cargo_metadata", - "filetime", - "sp-maybe-compressed-blob", - "strum", - "tempfile", - "toml 0.7.3", - "walkdir", - "wasm-opt", -] - -[[package]] -name = "substring" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" -dependencies = [ - "autocfg", -] - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "subxt" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b9c4ddefcb2d87eb18a6336f65635c29208f766d0deefaa2a1a19f7426a993" -dependencies = [ - "base58", - "blake2", - "derivative", - "either", - "frame-metadata", - "futures", - "getrandom 0.2.9", - "hex", - "impl-serde", - "parity-scale-codec", - "parking_lot 0.12.1", - "primitive-types", - "scale-bits", - "scale-decode", - "scale-encode", - "scale-info", - "scale-value", - "serde", - "serde_json", - "sp-core-hashing 8.0.0", - "subxt-macro", - "subxt-metadata", - "thiserror", - "tracing", -] - -[[package]] -name = "subxt-codegen" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e924f41069e9273236398ff89662d6d336468a5d94faac812129d44547db0e7f" -dependencies = [ - "darling", - "frame-metadata", - "heck 0.4.1", - "hex", - "jsonrpsee 0.16.2", - "parity-scale-codec", - "proc-macro2 1.0.57", - "quote 1.0.27", - "scale-info", - "subxt-metadata", - "syn 1.0.109", - "thiserror", - "tokio", -] - -[[package]] -name = "subxt-macro" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced0b043a069ee039f8700d3dfda01be156e4229c82277c305bc8e79a7dd855d" -dependencies = [ - "darling", - "proc-macro-error", - "subxt-codegen", - "syn 1.0.109", -] - -[[package]] -name = "subxt-metadata" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18be3b8f4308fe7369ee1df66ae59c2eca79de20eab57b0f41c75736e843300f" -dependencies = [ - "frame-metadata", - "parity-scale-codec", - "scale-info", - "sp-core-hashing 8.0.0", -] - -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "unicode-ident", -] - -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 1.0.109", - "unicode-xid 0.2.4", -] - -[[package]] -name = "sysinfo" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02f1dc6930a439cc5d154221b5387d153f8183529b07c19aca24ea31e0a167e1" -dependencies = [ - "cfg-if 1.0.0", - "core-foundation-sys", - "libc", - "ntapi", - "once_cell", - "rayon", - "winapi", -] - -[[package]] -name = "system-configuration" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" -dependencies = [ - "bitflags", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "target-lexicon" -version = "0.12.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" - -[[package]] -name = "tempfile" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" -dependencies = [ - "cfg-if 1.0.0", - "fastrand", - "redox_syscall 0.3.5", - "rustix 0.37.19", - "windows-sys 0.45.0", -] - -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "termtree" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "thiserror" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "thousands" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" - -[[package]] -name = "thread_local" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" -dependencies = [ - "cfg-if 1.0.0", - "once_cell", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "thrift" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b82ca8f46f95b3ce96081fe3dd89160fdea970c254bb72925255d1b62aae692e" -dependencies = [ - "byteorder", - "integer-encoding", - "log", - "ordered-float", - "threadpool", -] - -[[package]] -name = "tikv-jemalloc-ctl" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e37706572f4b151dff7a0146e040804e9c26fe3a3118591112f05cf12a4216c1" -dependencies = [ - "libc", - "paste", - "tikv-jemalloc-sys", -] - -[[package]] -name = "tikv-jemalloc-sys" -version = "0.5.3+5.3.0-patched" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a678df20055b43e57ef8cddde41cdfda9a3c1a060b67f4c5836dfb1d78543ba8" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" -dependencies = [ - "itoa", - "libc", - "num_threads", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" -dependencies = [ - "time-core", -] - -[[package]] -name = "tiny-bip39" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" -dependencies = [ - "anyhow", - "hmac 0.12.1", - "once_cell", - "pbkdf2 0.11.0", - "rand 0.8.5", - "rustc-hash", - "sha2 0.10.6", - "thiserror", - "unicode-normalization", - "wasm-bindgen", - "zeroize", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinytemplate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" -dependencies = [ - "autocfg", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot 0.12.1", - "pin-project-lite 0.2.9", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.8", - "tokio", - "webpki 0.22.0", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0d409377ff5b1e3ca6437aa86c1eb7d40c134bfec254e44c830defa92669db5" -dependencies = [ - "rustls 0.21.1", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" -dependencies = [ - "futures-core", - "pin-project-lite 0.2.9", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-util" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "pin-project-lite 0.2.9", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.19.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1d42a9b3f3ec46ba828e8d376aec14592ea199f70a06a548587ecd1c4ab658" -dependencies = [ - "bitflags", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-range-header", - "pin-project-lite 0.2.9", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if 1.0.0", - "log", - "pin-project-lite 0.2.9", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "tracing-core" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - -[[package]] -name = "tracing-gum" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "polkadot-node-jaeger", - "polkadot-primitives", - "tracing", - "tracing-gum-proc-macro", -] - -[[package]] -name = "tracing-gum-proc-macro" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "expander 2.0.0", - "proc-macro-crate", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - -[[package]] -name = "tracing-serde" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "ansi_term", - "chrono", - "lazy_static", - "matchers", - "parking_lot 0.11.2", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", - "tracing-serde", -] - -[[package]] -name = "trie-db" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "767abe6ffed88a1889671a102c2861ae742726f52e0a5a425b92c9fbfa7e9c85" -dependencies = [ - "hash-db", - "hashbrown 0.13.2", - "log", - "rustc-hex", - "smallvec", -] - -[[package]] -name = "trie-root" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4ed310ef5ab98f5fa467900ed906cb9232dd5376597e00fd4cba2a449d06c0b" -dependencies = [ - "hash-db", -] - -[[package]] -name = "trust-dns-proto" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" -dependencies = [ - "async-trait", - "cfg-if 1.0.0", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.2.3", - "ipnet", - "lazy_static", - "rand 0.8.5", - "smallvec", - "socket2", - "thiserror", - "tinyvec", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" -dependencies = [ - "cfg-if 1.0.0", - "futures-util", - "ipconfig", - "lazy_static", - "lru-cache", - "parking_lot 0.12.1", - "resolv-conf", - "smallvec", - "thiserror", - "tokio", - "tracing", - "trust-dns-proto", -] - -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "try-runtime-cli" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#6507a79b2baf7e4cc6f5868aa490dfe275144f9a" -dependencies = [ - "async-trait", - "clap 4.2.7", - "frame-remote-externalities", - "hex", - "log", - "parity-scale-codec", - "sc-cli", - "sc-executor", - "sc-service", - "serde", - "serde_json", - "sp-api", - "sp-consensus-aura", - "sp-consensus-babe", - "sp-core", - "sp-debug-derive", - "sp-externalities", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-rpc", - "sp-runtime", - "sp-state-machine", - "sp-timestamp", - "sp-transaction-storage-proof", - "sp-version", - "sp-weights", - "substrate-rpc-client", - "zstd 0.12.3+zstd.1.5.2", -] - -[[package]] -name = "tt-call" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f195fd851901624eee5a58c4bb2b4f06399148fcd0ed336e6f1cb60a9881df" - -[[package]] -name = "turn" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4712ee30d123ec7ae26d1e1b218395a16c87cdbaf4b3925d170d684af62ea5e8" -dependencies = [ - "async-trait", - "base64 0.13.1", - "futures", - "log", - "md-5", - "rand 0.8.5", - "ring", - "stun", - "thiserror", - "tokio", - "webrtc-util", -] - -[[package]] -name = "twox-hash" -version = "1.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" -dependencies = [ - "cfg-if 0.1.10", - "digest 0.10.6", - "rand 0.8.5", - "static_assertions", -] - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "ucd-trie" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "universal-hash" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" -dependencies = [ - "generic-array 0.14.7", - "subtle", -] - -[[package]] -name = "universal-hash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "unsigned-varint" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" -dependencies = [ - "asynchronous-codec", - "bytes", - "futures-io", - "futures-util", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" -dependencies = [ - "form_urlencoded", - "idna 0.3.0", - "percent-encoding", -] - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "uuid" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345444e32442451b267fc254ae85a209c64be56d2890e601a0c37ff0c3c5ecd2" -dependencies = [ - "getrandom 0.2.9", -] - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "value-bag" -version = "1.0.0-alpha.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" -dependencies = [ - "ctor", - "version_check", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "waitgroup" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" -dependencies = [ - "atomic-waker", -] - -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - -[[package]] -name = "walkdir" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" -dependencies = [ - "quote 1.0.27", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" - -[[package]] -name = "wasm-instrument" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa1dafb3e60065305741e83db35c6c2584bb3725b692b5b66148a38d72ace6cd" -dependencies = [ - "parity-wasm", -] - -[[package]] -name = "wasm-opt" -version = "0.112.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fef6d0d508f08334e0ab0e6877feb4c0ecb3956bcf2cb950699b22fedf3e9c" -dependencies = [ - "anyhow", - "libc", - "strum", - "strum_macros", - "tempfile", - "thiserror", - "wasm-opt-cxx-sys", - "wasm-opt-sys", -] - -[[package]] -name = "wasm-opt-cxx-sys" -version = "0.112.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc816bbc1596c8f2e8127e137a760c798023ef3d378f2ae51f0f1840e2dfa445" -dependencies = [ - "anyhow", - "cxx", - "cxx-build", - "wasm-opt-sys", -] - -[[package]] -name = "wasm-opt-sys" -version = "0.112.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40199e4f68ef1071b3c6d0bd8026a12b481865d4b9e49c156932ea9a6234dd14" -dependencies = [ - "anyhow", - "cc", - "cxx", - "cxx-build", -] - -[[package]] -name = "wasm-timer" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" -dependencies = [ - "futures", - "js-sys", - "parking_lot 0.11.2", - "pin-utils", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasmi" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c326c93fbf86419608361a2c925a31754cf109da1b8b55737070b4d6669422" -dependencies = [ - "parity-wasm", - "wasmi-validation", - "wasmi_core", -] - -[[package]] -name = "wasmi-validation" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ff416ad1ff0c42e5a926ed5d5fab74c0f098749aa0ad8b2a34b982ce0e867b" -dependencies = [ - "parity-wasm", -] - -[[package]] -name = "wasmi_core" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d20cb3c59b788653d99541c646c561c9dd26506f25c0cebfe810659c54c6d7" -dependencies = [ - "downcast-rs", - "libm 0.2.7", - "memory_units", - "num-rational", - "num-traits", - "region", -] - -[[package]] -name = "wasmparser" -version = "0.100.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b20236ab624147dfbb62cf12a19aaf66af0e41b8398838b66e997d07d269d4" -dependencies = [ - "indexmap", - "url", -] - -[[package]] -name = "wasmtime" -version = "6.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a222f5fa1e14b2cefc286f1b68494d7a965f4bf57ec04c59bb62673d639af6" -dependencies = [ - "anyhow", - "bincode", - "cfg-if 1.0.0", - "indexmap", - "libc", - "log", - "object 0.29.0", - "once_cell", - "paste", - "psm", - "rayon", - "serde", - "target-lexicon", - "wasmparser", - "wasmtime-cache", - "wasmtime-cranelift", - "wasmtime-environ", - "wasmtime-jit", - "wasmtime-runtime", - "windows-sys 0.42.0", -] - -[[package]] -name = "wasmtime-asm-macros" -version = "6.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4407a7246e7d2f3d8fb1cf0c72fda8dbafdb6dd34d555ae8bea0e5ae031089cc" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "wasmtime-cache" -version = "6.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ceb3adf61d654be0be67fffdce42447b0880481348785be5fe40b5dd7663a4c" -dependencies = [ - "anyhow", - "base64 0.13.1", - "bincode", - "directories-next", - "file-per-thread-logger", - "log", - "rustix 0.36.13", - "serde", - "sha2 0.10.6", - "toml 0.5.11", - "windows-sys 0.42.0", - "zstd 0.11.2+zstd.1.5.2", -] - -[[package]] -name = "wasmtime-cranelift" -version = "6.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c366bb8647e01fd08cb5589976284b00abfded5529b33d7e7f3f086c68304a4" -dependencies = [ - "anyhow", - "cranelift-codegen", - "cranelift-entity", - "cranelift-frontend", - "cranelift-native", - "cranelift-wasm", - "gimli 0.26.2", - "log", - "object 0.29.0", - "target-lexicon", - "thiserror", - "wasmparser", - "wasmtime-environ", -] - -[[package]] -name = "wasmtime-environ" -version = "6.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b8b50962eae38ee319f7b24900b7cf371f03eebdc17400c1dc8575fc10c9a7" -dependencies = [ - "anyhow", - "cranelift-entity", - "gimli 0.26.2", - "indexmap", - "log", - "object 0.29.0", - "serde", - "target-lexicon", - "thiserror", - "wasmparser", - "wasmtime-types", -] - -[[package]] -name = "wasmtime-jit" -version = "6.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffaed4f9a234ba5225d8e64eac7b4a5d13b994aeb37353cde2cbeb3febda9eaa" -dependencies = [ - "addr2line 0.17.0", - "anyhow", - "bincode", - "cfg-if 1.0.0", - "cpp_demangle", - "gimli 0.26.2", - "log", - "object 0.29.0", - "rustc-demangle", - "serde", - "target-lexicon", - "wasmtime-environ", - "wasmtime-jit-debug", - "wasmtime-jit-icache-coherence", - "wasmtime-runtime", - "windows-sys 0.42.0", -] - -[[package]] -name = "wasmtime-jit-debug" -version = "6.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed41cbcbf74ce3ff6f1d07d1b707888166dc408d1a880f651268f4f7c9194b2" -dependencies = [ - "object 0.29.0", - "once_cell", - "rustix 0.36.13", -] - -[[package]] -name = "wasmtime-jit-icache-coherence" -version = "6.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a28ae1e648461bfdbb79db3efdaee1bca5b940872e4175390f465593a2e54c" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "windows-sys 0.42.0", -] - -[[package]] -name = "wasmtime-runtime" -version = "6.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e704b126e4252788ccfc3526d4d4511d4b23c521bf123e447ac726c14545217b" -dependencies = [ - "anyhow", - "cc", - "cfg-if 1.0.0", - "indexmap", - "libc", - "log", - "mach", - "memfd", - "memoffset 0.6.5", - "paste", - "rand 0.8.5", - "rustix 0.36.13", - "wasmtime-asm-macros", - "wasmtime-environ", - "wasmtime-jit-debug", - "windows-sys 0.42.0", -] - -[[package]] -name = "wasmtime-types" -version = "6.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e5572c5727c1ee7e8f28717aaa8400e4d22dcbd714ea5457d85b5005206568" -dependencies = [ - "cranelift-entity", - "serde", - "thiserror", - "wasmparser", -] - -[[package]] -name = "web-sys" -version = "0.3.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki 0.22.0", -] - -[[package]] -name = "webrtc" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3bc9049bdb2cea52f5fd4f6f728184225bdb867ed0dc2410eab6df5bdd67bb" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "hex", - "interceptor", - "lazy_static", - "log", - "rand 0.8.5", - "rcgen 0.9.3", - "regex", - "ring", - "rtcp", - "rtp", - "rustls 0.19.1", - "sdp", - "serde", - "serde_json", - "sha2 0.10.6", - "stun", - "thiserror", - "time 0.3.21", - "tokio", - "turn", - "url", - "waitgroup", - "webrtc-data", - "webrtc-dtls", - "webrtc-ice", - "webrtc-mdns", - "webrtc-media", - "webrtc-sctp", - "webrtc-srtp", - "webrtc-util", -] - -[[package]] -name = "webrtc-data" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef36a4d12baa6e842582fe9ec16a57184ba35e1a09308307b67d43ec8883100" -dependencies = [ - "bytes", - "derive_builder", - "log", - "thiserror", - "tokio", - "webrtc-sctp", - "webrtc-util", -] - -[[package]] -name = "webrtc-dtls" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942be5bd85f072c3128396f6e5a9bfb93ca8c1939ded735d177b7bcba9a13d05" -dependencies = [ - "aes 0.6.0", - "aes-gcm 0.10.1", - "async-trait", - "bincode", - "block-modes", - "byteorder", - "ccm", - "curve25519-dalek 3.2.0", - "der-parser 8.2.0", - "elliptic-curve 0.12.3", - "hkdf", - "hmac 0.12.1", - "log", - "oid-registry 0.6.1", - "p256", - "p384", - "rand 0.8.5", - "rand_core 0.6.4", - "rcgen 0.9.3", - "ring", - "rustls 0.19.1", - "sec1 0.3.0", - "serde", - "sha1", - "sha2 0.10.6", - "signature 1.6.4", - "subtle", - "thiserror", - "tokio", - "webpki 0.21.4", - "webrtc-util", - "x25519-dalek 2.0.0-pre.1", - "x509-parser 0.13.2", -] - -[[package]] -name = "webrtc-ice" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465a03cc11e9a7d7b4f9f99870558fe37a102b65b93f8045392fef7c67b39e80" -dependencies = [ - "arc-swap", - "async-trait", - "crc", - "log", - "rand 0.8.5", - "serde", - "serde_json", - "stun", - "thiserror", - "tokio", - "turn", - "url", - "uuid", - "waitgroup", - "webrtc-mdns", - "webrtc-util", -] - -[[package]] -name = "webrtc-mdns" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f08dfd7a6e3987e255c4dbe710dde5d94d0f0574f8a21afa95d171376c143106" -dependencies = [ - "log", - "socket2", - "thiserror", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-media" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f72e1650a8ae006017d1a5280efb49e2610c19ccc3c0905b03b648aee9554991" -dependencies = [ - "byteorder", - "bytes", - "rand 0.8.5", - "rtp", - "thiserror", -] - -[[package]] -name = "webrtc-sctp" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d47adcd9427eb3ede33d5a7f3424038f63c965491beafcc20bc650a2f6679c0" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "crc", - "log", - "rand 0.8.5", - "thiserror", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-srtp" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6183edc4c1c6c0175f8812eefdce84dfa0aea9c3ece71c2bf6ddd3c964de3da5" -dependencies = [ - "aead 0.4.3", - "aes 0.7.5", - "aes-gcm 0.9.4", - "async-trait", - "byteorder", - "bytes", - "ctr 0.8.0", - "hmac 0.11.0", - "log", - "rtcp", - "rtp", - "sha-1", - "subtle", - "thiserror", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-util" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87" -dependencies = [ - "async-trait", - "bitflags", - "bytes", - "cc", - "ipnet", - "lazy_static", - "libc", - "log", - "nix", - "rand 0.8.5", - "thiserror", - "tokio", - "winapi", -] - -[[package]] -name = "westend-runtime" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bitvec", - "frame-benchmarking", - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-bags-list", - "pallet-balances", - "pallet-collective", - "pallet-democracy", - "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking", - "pallet-elections-phragmen", - "pallet-fast-unstake", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-membership", - "pallet-multisig", - "pallet-nomination-pools", - "pallet-nomination-pools-benchmarking", - "pallet-nomination-pools-runtime-api", - "pallet-offences", - "pallet-offences-benchmarking", - "pallet-preimage", - "pallet-proxy", - "pallet-recovery", - "pallet-scheduler", - "pallet-session", - "pallet-session-benchmarking", - "pallet-society", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-staking-runtime-api", - "pallet-state-trie-migration", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-treasury", - "pallet-utility", - "pallet-vesting", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "rustc-hex", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-core", - "sp-inherents", - "sp-io", - "sp-mmr-primitives", - "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 5.0.0", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "westend-runtime-constants", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "westend-runtime-constants" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "which" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" -dependencies = [ - "either", - "libc", - "once_cell", -] - -[[package]] -name = "wide" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b689b6c49d6549434bf944e6b0f39238cf63693cb7a147e9d887507fffa3b223" -dependencies = [ - "bytemuck", - "safe_arch", -] - -[[package]] -name = "widestring" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" -dependencies = [ - "windows_aarch64_msvc 0.34.0", - "windows_i686_gnu 0.34.0", - "windows_i686_msvc 0.34.0", - "windows_x86_64_gnu 0.34.0", - "windows_x86_64_msvc 0.34.0", -] - -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" -dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_i686_gnu" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" - -[[package]] -name = "windows_i686_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" - -[[package]] -name = "winnow" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "x25519-dalek" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" -dependencies = [ - "curve25519-dalek 3.2.0", - "rand_core 0.5.1", - "zeroize", -] - -[[package]] -name = "x25519-dalek" -version = "2.0.0-pre.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5da623d8af10a62342bcbbb230e33e58a63255a58012f8653c578e54bab48df" -dependencies = [ - "curve25519-dalek 3.2.0", - "rand_core 0.6.4", - "zeroize", -] - -[[package]] -name = "x509-parser" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9bace5b5589ffead1afb76e43e34cff39cd0f3ce7e170ae0c29e53b88eb1c" -dependencies = [ - "asn1-rs 0.3.1", - "base64 0.13.1", - "data-encoding", - "der-parser 7.0.0", - "lazy_static", - "nom", - "oid-registry 0.4.0", - "ring", - "rusticata-macros", - "thiserror", - "time 0.3.21", -] - -[[package]] -name = "x509-parser" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" -dependencies = [ - "asn1-rs 0.5.2", - "base64 0.13.1", - "data-encoding", - "der-parser 8.2.0", - "lazy_static", - "nom", - "oid-registry 0.6.1", - "rusticata-macros", - "thiserror", - "time 0.3.21", -] - -[[package]] -name = "xcm" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "bounded-collections", - "derivative", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-weights", - "xcm-procedural", -] - -[[package]] -name = "xcm-builder" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-transaction-payment", - "parity-scale-codec", - "polkadot-parachain", - "scale-info", - "sp-arithmetic", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "xcm", - "xcm-executor", -] - -[[package]] -name = "xcm-executor" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "environmental", - "frame-benchmarking", - "frame-support", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 5.0.0", - "sp-weights", - "xcm", -] - -[[package]] -name = "xcm-procedural" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" -dependencies = [ - "Inflector", - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "yamux" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d9ba232399af1783a58d8eb26f6b5006fbefe2dc9ef36bd283324792d03ea5" -dependencies = [ - "futures", - "log", - "nohash-hasher", - "parking_lot 0.12.1", - "rand 0.8.5", - "static_assertions", -] - -[[package]] -name = "yap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2a7eb6d82a11e4d0b8e6bda8347169aff4ccd8235d039bba7c47482d977dcf7" - -[[package]] -name = "yasna" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" -dependencies = [ - "time 0.3.21", -] - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2 1.0.57", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe 5.0.2+zstd.1.5.2", -] - -[[package]] -name = "zstd" -version = "0.12.3+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" -dependencies = [ - "zstd-safe 6.0.5+zstd.1.5.4", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-safe" -version = "6.0.5+zstd.1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" -dependencies = [ - "cc", - "libc", - "pkg-config", -] From b7082d1a9d25f8173cdebabceb691f082e120a27 Mon Sep 17 00:00:00 2001 From: Roman Useinov Date: Fri, 19 May 2023 19:53:41 +0200 Subject: [PATCH 203/339] [Feature] XCM-Emulator (#2447) * [Feature] XCM-Emulator * ".git/.scripts/commands/fmt/fmt.sh" * rename * readme * more rename * rename directory * implement AssetTransactor * Update xcm/xcm-emulator/README.md Co-authored-by: Muharem Ismailov * address review comments (#2502) * Update xcm/xcm-emulator/example/src/lib.rs Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update xcm/xcm-emulator/README.md * Use 2d weights. * Point out nearer the failure why it should fail * Move test-runtime to under examples * Walk through how to use it * proof needs to be non-zero * Apply suggestions from code review * Update xcm/xcm-emulator/README.md Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Improve xcm emulator (#2593) * folder restructutre * common created * make macros repetitions * messenger traits for relay and para * default Messenger impls * messenger traits refactor * declared two networks * init network approach works * queues use HashMap but relay block number * init and reset refactor * messengers trait name changed * relay block number suboptimal * fix reset hashmap keys * genesis added * test ext added for parachains * genesis added relay chains * genesis to storage * new_ext replaced by on_init * new relay block number approach * ext_wrapper added * added types to Parachain trait * relay chain with types * restructure * para_ids working * replace para_id getter * replace para_id getter 2 * tests restructure + common variables * added sovereign and balances helpers * more helpers + tess pass * expected events macro added * added events trait method * expect_events macro improve * expect_events macro done * network traits added * reserve_transfer test added * para & relay macro inputs redefined * added collectives & BH paras * test restructure * statemine removed * nitpick * rename test folder + events logs * clean * weight threshold helper * update readme * remove cumulus-test-service dependancy * fmt * comment docs * update e2e tests to xcm v3 * clippy + runtime-benchmark + clean docs --------- Co-authored-by: command-bot <> Co-authored-by: Muharem Ismailov Co-authored-by: Squirrel Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: Ignacio Palacios --- Cargo.lock | 108 ++ Cargo.toml | 4 +- .../assets/statemine/0_xcm}/0_init.yml | 72 +- .../assets/statemine/0_xcm}/1_dmp.yml | 77 +- .../assets/statemine/0_xcm}/2_ump.yml | 81 +- .../statemine/0_xcm/3_hrmp-open-channels.yml | 134 +++ .../e2e/assets/statemine/0_xcm/4_hrmp.yml | 403 ++++++++ .../e2e/assets/statemine/config.toml | 70 ++ .../assets/statemint/0_xcm}/0_init.yml | 78 +- .../assets/statemint/0_xcm}/1_dmp.yml | 77 +- .../assets/statemint/0_xcm}/2_ump.yml | 80 +- .../statemint/0_xcm/3_hrmp-open-channels.yml | 132 +++ .../e2e/assets/statemint/0_xcm/4_hrmp.yml | 401 ++++++++ .../e2e/assets/statemint/config.toml | 71 ++ .../collectives_polkadot}/0_xcm/0_init.yml | 4 +- .../0_xcm/1_teleport.yml | 26 +- .../collectives_polkadot}/0_xcm/2_reserve.yml | 10 +- .../1_alliance/0_join_alliance_fails.yml | 0 .../1_alliance/1_init_alliance.yml | 19 +- .../1_alliance/2_join_alliance_fails.yml | 0 .../1_alliance/3_kick_member.yml | 4 +- .../collectives_polkadot}/config.toml | 8 + .../emulated/assets/statemint/Cargo.toml | 36 + .../emulated/assets/statemint/src/lib.rs | 33 + .../assets/statemint/src/tests/mod.rs | 3 + .../statemint/src/tests/reserve_transfer.rs | 63 ++ .../assets/statemint/src/tests/teleport.rs | 60 ++ .../assets/statemint/src/tests/transact.rs | 58 ++ .../emulated/common/Cargo.toml | 54 + .../emulated/common/src/constants.rs | 672 +++++++++++++ .../emulated/common/src/lib.rs | 253 +++++ .../integration-tests/statemine/config.toml | 49 - .../statemine/xcm/3_hrmp-open-channels.yml | 408 -------- .../statemine/xcm/4_hrmp.yml | 356 ------- .../integration-tests/statemint/config.toml | 49 - .../statemint/xcm/3_hrmp-open-channels.yml | 402 -------- .../statemint/xcm/4_hrmp.yml | 356 ------- xcm/xcm-emulator/Cargo.toml | 37 + xcm/xcm-emulator/README.md | 20 + xcm/xcm-emulator/src/lib.rs | 939 ++++++++++++++++++ 40 files changed, 3848 insertions(+), 1859 deletions(-) rename parachains/integration-tests/{statemint/xcm => e2e/assets/statemine/0_xcm}/0_init.yml (67%) rename parachains/integration-tests/{statemint/xcm => e2e/assets/statemine/0_xcm}/1_dmp.yml (78%) rename parachains/integration-tests/{statemine/xcm => e2e/assets/statemine/0_xcm}/2_ump.yml (71%) create mode 100644 parachains/integration-tests/e2e/assets/statemine/0_xcm/3_hrmp-open-channels.yml create mode 100644 parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml create mode 100644 parachains/integration-tests/e2e/assets/statemine/config.toml rename parachains/integration-tests/{statemine/xcm => e2e/assets/statemint/0_xcm}/0_init.yml (66%) rename parachains/integration-tests/{statemine/xcm => e2e/assets/statemint/0_xcm}/1_dmp.yml (79%) rename parachains/integration-tests/{statemint/xcm => e2e/assets/statemint/0_xcm}/2_ump.yml (72%) create mode 100644 parachains/integration-tests/e2e/assets/statemint/0_xcm/3_hrmp-open-channels.yml create mode 100644 parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml create mode 100644 parachains/integration-tests/e2e/assets/statemint/config.toml rename parachains/integration-tests/{collectives => e2e/collectives/collectives_polkadot}/0_xcm/0_init.yml (97%) rename parachains/integration-tests/{collectives => e2e/collectives/collectives_polkadot}/0_xcm/1_teleport.yml (96%) rename parachains/integration-tests/{collectives => e2e/collectives/collectives_polkadot}/0_xcm/2_reserve.yml (94%) rename parachains/integration-tests/{collectives => e2e/collectives/collectives_polkadot}/1_alliance/0_join_alliance_fails.yml (100%) rename parachains/integration-tests/{collectives => e2e/collectives/collectives_polkadot}/1_alliance/1_init_alliance.yml (96%) rename parachains/integration-tests/{collectives => e2e/collectives/collectives_polkadot}/1_alliance/2_join_alliance_fails.yml (100%) rename parachains/integration-tests/{collectives => e2e/collectives/collectives_polkadot}/1_alliance/3_kick_member.yml (98%) rename parachains/integration-tests/{collectives => e2e/collectives/collectives_polkadot}/config.toml (84%) create mode 100644 parachains/integration-tests/emulated/assets/statemint/Cargo.toml create mode 100644 parachains/integration-tests/emulated/assets/statemint/src/lib.rs create mode 100644 parachains/integration-tests/emulated/assets/statemint/src/tests/mod.rs create mode 100644 parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs create mode 100644 parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs create mode 100644 parachains/integration-tests/emulated/assets/statemint/src/tests/transact.rs create mode 100644 parachains/integration-tests/emulated/common/Cargo.toml create mode 100644 parachains/integration-tests/emulated/common/src/constants.rs create mode 100644 parachains/integration-tests/emulated/common/src/lib.rs delete mode 100644 parachains/integration-tests/statemine/config.toml delete mode 100644 parachains/integration-tests/statemine/xcm/3_hrmp-open-channels.yml delete mode 100644 parachains/integration-tests/statemine/xcm/4_hrmp.yml delete mode 100644 parachains/integration-tests/statemint/config.toml delete mode 100644 parachains/integration-tests/statemint/xcm/3_hrmp-open-channels.yml delete mode 100644 parachains/integration-tests/statemint/xcm/4_hrmp.yml create mode 100644 xcm/xcm-emulator/Cargo.toml create mode 100644 xcm/xcm-emulator/README.md create mode 100644 xcm/xcm-emulator/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 10a57137285..e395209bf46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1347,6 +1347,15 @@ dependencies = [ "thiserror", ] +[[package]] +name = "casey" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabe85130dda9cf267715582ce6cf1ab581c8dfe3cb33f7065fee0f14e3fea14" +dependencies = [ + "syn 1.0.109", +] + [[package]] name = "cast" version = "0.3.0" @@ -4861,6 +4870,47 @@ dependencies = [ "num-traits", ] +[[package]] +name = "integration-tests-common" +version = "1.0.0" +dependencies = [ + "bridge-hub-kusama-runtime", + "bridge-hub-polkadot-runtime", + "collectives-polkadot-runtime", + "cumulus-primitives-core", + "frame-support", + "frame-system", + "kusama-runtime", + "kusama-runtime-constants", + "pallet-assets", + "pallet-balances", + "pallet-im-online", + "pallet-staking", + "pallet-xcm", + "parachain-info", + "parachains-common", + "parity-scale-codec", + "penpal-runtime", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime", + "polkadot-runtime-constants", + "polkadot-runtime-parachains", + "polkadot-service", + "sc-consensus-grandpa", + "sp-authority-discovery", + "sp-consensus-babe", + "sp-core", + "sp-runtime", + "sp-weights", + "statemine-runtime", + "statemint-runtime", + "xcm", + "xcm-emulator", + "xcm-executor", +] + [[package]] name = "interceptor" version = "0.8.2" @@ -13536,6 +13586,32 @@ dependencies = [ "xcm-executor", ] +[[package]] +name = "statemint-it" +version = "1.0.0" +dependencies = [ + "frame-support", + "frame-system", + "integration-tests-common", + "pallet-assets", + "pallet-balances", + "pallet-xcm", + "parachains-common", + "parity-scale-codec", + "penpal-runtime", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-runtime", + "polkadot-runtime-parachains", + "sp-core", + "sp-runtime", + "sp-weights", + "statemint-runtime", + "xcm", + "xcm-emulator", + "xcm-executor", +] + [[package]] name = "statemint-runtime" version = "1.0.0" @@ -16058,6 +16134,38 @@ dependencies = [ "xcm-executor", ] +[[package]] +name = "xcm-emulator" +version = "0.1.0" +dependencies = [ + "casey", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-test-relay-sproof-builder", + "cumulus-test-service", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parachain-info", + "parachains-common", + "parity-scale-codec", + "paste", + "polkadot-primitives", + "polkadot-runtime-parachains", + "quote", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-std", + "sp-trie", + "xcm", + "xcm-executor", +] + [[package]] name = "xcm-executor" version = "0.9.41" diff --git a/Cargo.toml b/Cargo.toml index 42acec123a5..dcb862654e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,11 +52,14 @@ members = [ "parachains/runtimes/contracts/contracts-rococo", "parachains/runtimes/glutton/glutton-kusama", "parachains/runtimes/testing/penpal", + "parachains/integration-tests/emulated/common", + "parachains/integration-tests/emulated/assets/statemint", "test/client", "test/relay-sproof-builder", "test/relay-validation-worker-provider", "test/runtime", "test/service", + "xcm/xcm-emulator", ] [profile.release] @@ -67,4 +70,3 @@ opt-level = 3 inherits = "release" lto = true codegen-units = 1 - diff --git a/parachains/integration-tests/statemint/xcm/0_init.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml similarity index 67% rename from parachains/integration-tests/statemint/xcm/0_init.yml rename to parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml index b9640517719..b770c8e569e 100644 --- a/parachains/integration-tests/statemint/xcm/0_init.yml +++ b/parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml @@ -11,12 +11,12 @@ settings: paraId: &pp_id 2000 variables: common: - xcm_verison: &xcm_version '2' - require_weight_at_most: &weight_at_most 1000000000 + xcm_version: &xcm_version '3' + require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 200000} chains: relay_chain: signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} penpal_parachain: signer: &pp_signer //Alice decodedCalls: @@ -37,7 +37,7 @@ tests: its: - name: XCM supported versions between chains actions: - - extrinsics: # Relay Chain sets supported version for Assset Parachain + - extrinsics: # Relay Chain sets supported version for Asset Parachain - chain: *relay_chain sudo: true signer: *rc_signer @@ -56,13 +56,13 @@ tests: ] events: - name: sudo.Sudid - attribute: - type: Result - value: Ok + attributes: + - type: Result + value: Ok - name: xcmPallet.SupportedVersionChanged - attribute: - type: u32 - value: *xcm_version + attributes: + - type: u32 + value: *xcm_version - extrinsics: # Relay Chain sets supported version for Penpal Parachain - chain: *relay_chain sudo: true @@ -82,14 +82,14 @@ tests: ] events: - name: sudo.Sudid - attribute: - type: Result - value: Ok + attributes: + - type: Result + value: Ok - name: xcmPallet.SupportedVersionChanged - attribute: - type: u32 - value: *xcm_version - - extrinsics: # Assset Parachain sets supported version for Relay Chain through it + attributes: + - type: u32 + value: *xcm_version + - extrinsics: # Asset Parachain sets supported version for Relay Chain through it - chain: *relay_chain signer: *rc_signer sudo: true @@ -98,10 +98,20 @@ tests: args: [ *ap_dest, # destination { - v2: [ #message + v3: [ #message + { + UnpaidExecution: { + weightLimit: { + limited: { + refTime: 2200000000, + proofSize: 200000 + } + } + } + }, { Transact: { - originType: Superuser, + originKind: Superuser, requireWeightAtMost: *weight_at_most, call: $ap_force_xcm_version } @@ -111,15 +121,15 @@ tests: ] events: - name: sudo.Sudid - attribute: - type: Result - value: Ok + attributes: + - type: Result + value: Ok - name: xcmPallet.Sent - name: polkadotXcm.SupportedVersionChanged chain: *assets_parachain - attribute: - type: u32 - value: *xcm_version + attributes: + - type: u32 + value: *xcm_version - extrinsics: # Penpal Parachain sets supported version for Relay Chain - chain: *penpal_parachain signer: *pp_signer @@ -135,10 +145,10 @@ tests: ] events: - name: sudo.Sudid - attribute: - type: Result - value: Ok + attributes: + - type: Result + value: Ok - name: polkadotXcm.SupportedVersionChanged - attribute: - type: u32 - value: *xcm_version + attributes: + - type: u32 + value: *xcm_version diff --git a/parachains/integration-tests/statemint/xcm/1_dmp.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml similarity index 78% rename from parachains/integration-tests/statemint/xcm/1_dmp.yml rename to parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml index 5f0fa349072..0852a3907db 100644 --- a/parachains/integration-tests/statemint/xcm/1_dmp.yml +++ b/parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml @@ -10,13 +10,13 @@ settings: relay_chain: signer: &rc_signer //Alice wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v1: { parents: 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_destination: &ap_dest { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}} assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *ap_acc }}}}} + assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} amount: &amount 1000000000000 ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - require_weight_at_most: &rc_weight_at_most 1000000000 + require_weight_at_most: &rc_weight_at_most {refTime: 1000000000, proofSize: 200000} assets_parachain_account: wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F asset_id: &asset_id 1 @@ -63,22 +63,22 @@ tests: args: [ *ap_dest, # destination *ap_benf, # beneficiary - { v1: [ *rc_ksm_fungible ] }, # assets + { v3: [ *rc_ksm_fungible ] }, 0, # feeAssetItem { unlimited: true } # weightLimit ] events: - name: xcmPallet.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,021,635,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"162,379,000","proofSize":"0"} - queries: balance_rc_sender_after: chain: *relay_chain @@ -131,10 +131,15 @@ tests: args: [ *ap_dest, # destination { - v2: [ #message + v3: [ #message + { + UnpaidExecution: { + weightLimit: Unlimited + } + }, { Transact: { - originType: Superuser, + originKind: Superuser, requireWeightAtMost: *rc_weight_at_most, call: $force_create_asset } @@ -146,11 +151,11 @@ tests: - name: xcmPallet.Sent - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,020,807,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"1,014,103,000","proofSize":"200,000"} - queries: forced_created_asset: chain: *assets_parachain @@ -173,10 +178,15 @@ tests: args: [ *ap_dest, # destination { - v2: [ #message + v3: [ #message + { + UnpaidExecution: { + weightLimit: Unlimited + } + }, { Transact: { - originType: Native, + originKind: Native, requireWeightAtMost: *rc_weight_at_most, call: $force_create_asset } @@ -186,9 +196,9 @@ tests: ] events: - name: system.ExtrinsicFailed - attribute: - type: SpRuntimeDispatchError - value: BadOrigin + attributes: + - type: SpRuntimeDispatchError + value: BadOrigin - name: xcmPallet.limitedReserveTransferAssets before: *before_get_balances @@ -203,22 +213,23 @@ tests: args: [ *ap_dest, # destination *ap_benf, # beneficiary - { v1: [ *rc_ksm_fungible ] }, # assets + { v3: [ *rc_ksm_fungible ] }, # assets 0, # feeAssetItem { unlimited: true } # weightLimit ] events: - name: xcmPallet.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true - value: 1,000,000,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"750,645,000","proofSize":"0"} - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isError: true - value: "WeightNotComputable" + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Incomplete + value: [{"refTime":"1,000,000,000","proofSize":"0"},"UntrustedReserveLocation"] - queries: balance_rc_sender_after: chain: *relay_chain diff --git a/parachains/integration-tests/statemine/xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml similarity index 71% rename from parachains/integration-tests/statemine/xcm/2_ump.yml rename to parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml index daddf927931..46519da3fde 100644 --- a/parachains/integration-tests/statemine/xcm/2_ump.yml +++ b/parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml @@ -9,21 +9,21 @@ settings: variables: common: amount: &amount 1000000000000 - require_weight_at_most: &weight_at_most 1000000000 + require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 0} relay_chain: signer: &rc_signer //Alice wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F #Alice - assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *ap_acc }}}}} + assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} assets_parachain_account: signer: &ap_signer //Alice wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - relay_chain_destination: &rc_dest { v1: { parents: 1, interior: { here: true }}} + relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' #Alice - relay_chain_beneficiary: &rc_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *rc_acc }}}}} + relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *rc_acc }}}}} ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} decodedCalls: @@ -38,7 +38,7 @@ tests: describes: - name: polkadotXcm.limitedTeleportAssets before: - - name: DEPENDANCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Assets Parachain to have funds to send them back + - name: DEPENDENCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Assets Parachain to have funds to send them back actions: - extrinsics: - chain: *relay_chain @@ -48,22 +48,24 @@ tests: args: [ *ap_dest, # destination *ap_benf, # beneficiary - { v1: [ *rc_ksm_fungible ] }, # assets + { v3: [ *rc_ksm_fungible ] }, # assets 0, # feeAssetItem { unlimited: true } # weightLimit ] events: - name: xcmPallet.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"761,173,000","proofSize":"0"} - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,021,973,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"162,379,000","proofSize":"0"} - name: Get the balances of the Assets Parachain's sender & Relay Chain's receiver actions: @@ -89,24 +91,24 @@ tests: args: [ *rc_dest, # destination *rc_benf, # beneficiary - { v1: [ *ap_ksm_fungible ] }, # assets + { v3: [ *ap_ksm_fungible ] }, # assets 0, # feeAssetItem { unlimited: true } # weightLimit ] events: - name: polkadotXcm.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 360,315,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"539,494,000","proofSize":"7,133"} - name: ump.ExecutedUpward chain: *relay_chain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 297,578,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"298,716,000","proofSize":"0"} - queries: balance_ap_sender_after: chain: *assets_parachain @@ -148,7 +150,7 @@ tests: - name: polkadotXcm.send | Native - Transact(system.remark) its: - - name: Assets Parachain SHOULD NOT be able to dipatch 'send' call + - name: Assets Parachain SHOULD NOT be able to dispatch 'send' call actions: - extrinsics: - chain: *assets_parachain @@ -158,10 +160,15 @@ tests: args: [ *rc_dest, # destination { - v2: [ #message + v3: [ #message + { + UnpaidExecution: { + weightLimit: Unlimited + } + }, { Transact: { - originType: Native, + originKind: Native, requireWeightAtMost: *weight_at_most, call: $system_remark } @@ -171,9 +178,9 @@ tests: ] events: - name: system.ExtrinsicFailed - attribute: - type: SpRuntimeDispatchError - value: BadOrigin + attributes: + - type: SpRuntimeDispatchError + value: BadOrigin - name: polkadotXcm.limitedReserveTransferAssets its: @@ -187,13 +194,13 @@ tests: args: [ *rc_dest, # destination *rc_benf, # beneficiary - { v1: [ *ap_ksm_fungible ] }, # assets + { v3: [ *ap_ksm_fungible ] }, # assets 0, # feeAssetItem { unlimited: true } # weightLimit ] events: - name: polkadotXcm.Attempted - attribute: - type: XcmV2TraitsOutcome - isError: true - value: Barrier + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Error + value: Barrier diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/3_hrmp-open-channels.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/3_hrmp-open-channels.yml new file mode 100644 index 00000000000..cc1fc9da146 --- /dev/null +++ b/parachains/integration-tests/e2e/assets/statemine/0_xcm/3_hrmp-open-channels.yml @@ -0,0 +1,134 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + penpal_parachain: &penpal_parachain + wsPort: 9920 + paraId: &pp_id 2000 + variables: + common: + amount: &amount 2000000000000 + require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 20000} + hrmp_channels: + proposed_max_capacity: &max_capacity 8 + proposed_max_message_size: &max_message_size 8192 + channel: &channel { + maxCapacity: 8, + maxTotalSize: 8192, + maxMessageSize: 8192, + msgCount: 0, + totalSize: 0, + mqcHead: null, + senderDeposit: 0, + recipientDeposit: 0 + } + chains: + relay_chain: + signer: &rc_signer //Alice + assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} + ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + assets_parachain_account: + sovereign_account: &ap_sovereign F7fq1jSNVTPfJmaHaXCMtatT1EZefCUsa7rRiQVNR5efcah + relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} + penpal_parachain: + sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ + signer: &pp_signer //Alice + +tests: + - name: HRMP + beforeEach: + - name: DEPENDENCY | Penpal Parachain Sovereign account in the Relay Chain needs to be funded + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: balances + call: transfer + args: [ + *pp_sovereign, # destination + *amount, # value + ] + events: + - name: balances.Transfer + + - name: DEPENDENCY | Assets Parachain Sovereign account in the Relay Chain needs to be funded + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: balances + call: transfer + args: [ + *ap_sovereign, # destination + *amount, # value + ] + events: + - name: balances.Transfer + describes: + - name: hrmp.hrmpInitOpenChannel (Penpal Parachain → Assets Parachain) + its: + - name: Open Penpal Parachain to Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: hrmp + call: forceOpenHrmpChannel + args: [ + 2000, + 1000, + 8, + 8192 + ] + events: + - name: sudo.Sudid + attributes: + - type: Result + value: Ok + - name: hrmp.HrmpChannelForceOpened + - name: hrmp.hrmpInitOpenChannel (Assets Parachain → PenPal Parachain) + its: + - name: Open Assets Parachain to PenPal Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: hrmp + call: forceOpenHrmpChannel + args: [ + 1000, + 2000, + 8, + 8192 + ] + events: + - name: sudo.Sudid + attributes: + - type: Result + value: Ok + - name: hrmp.HrmpChannelForceOpened + - name: hrmp.forceProcessHrmpOpen (make sure all the channels are open) + its: + - name: Make sure all the pending channels are open + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: hrmp + call: forceProcessHrmpOpen + args: [ 2 ] + events: + - name: sudo.Sudid + attributes: + - type: Result + value: Ok diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml new file mode 100644 index 00000000000..e47ae5a4054 --- /dev/null +++ b/parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml @@ -0,0 +1,403 @@ +--- +# Note: This tests depends on the 3_hrmp-open-channels.yml for opening channels, otherwise teleports aren't going to +# work. +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + penpal_parachain: &penpal_parachain + wsPort: 9920 + paraId: &pp_id 2000 + variables: + common: + mint_amount: &mint_amount 1000000000000 + amount: &amount 100000000000 + require_weight_at_most: &weight_at_most {refTime: 1200000000, proofSize: 20000} + amount_to_send: &amount_to_send 500000000000 + chains: + relay_chain: + signer: &rc_signer //Alice + assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_dest_routed: &ap_dest_routed { v3: { parents: 1, interior: { x1: { parachain: *ap_id } }}} + assets_parachain_account: + signer: &ap_signer //Alice + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + asset_id: &asset_id 2 + assets_pallet_id: &assets_pallet_id 50 + asset_min_balance: &asset_ed 1000 + penpal_parachain_destination: &pp_dest { v3: { parents: 1, interior: { x1: { parachain: *pp_id } }}} + ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} + ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} + suff_asset: &suff_asset { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: *asset_id } ] }}} + suff_asset_fail: &suff_asset_fail { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: 3 } ] }}} + suff_asset_fungible_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: 200000000000 }} + penpal_parachain: + sovereign_account: &pp_sovereign_sibl FBeL7EAeUroLWXW1yfKboiqTqVfbRBcsUKd6QqVf4kGBySS + signer: &pp_signer //Alice + penpal_parachain_account: &pp_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + decodedCalls: + force_create_asset: + chain: *assets_parachain + pallet: assets + call: forceCreate + args: [ + *asset_id, + { Id: *ap_wallet }, # owner + true, # isSufficient + *asset_ed # minBalance + ] + force_create_asset2: + chain: *assets_parachain + pallet: assets + call: forceCreate + args: [ + *asset_id, + { Id: *ap_wallet }, # owner + true, # isSufficient + *asset_ed # minBalance + ] + +tests: + - name: HRMP + describes: + - name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain + before: + - name: DEPENDENCY | A sufficient Asset should exist in the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v3: [ #message + { + UnpaidExecution: { + weightLimit: Unlimited + } + }, + { + SetTopic: "0x0123456789012345678901234567891201234567890123456789012345678912" + }, + { + Transact: { + originKind: Superuser, + requireWeightAtMost: *weight_at_most, + call: $force_create_asset + } + } + ] + } + ] + events: + - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"1,216,703,000","proofSize":"20,000"} + - queries: + forced_created_asset: + chain: *assets_parachain + pallet: assets + call: asset + args: [ *asset_id ] + - asserts: + isSome: + args: [ $forced_created_asset ] + + - name: DEPENDENCY | Some Assets should be minted for the sender + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: assets + call: mint + args: [ + *asset_id, + *ap_wallet, + *mint_amount + ] + events: + - name: assets.Issued + + its: + - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedReserveTransferAssets + args: [ + *pp_dest, # destination + { # beneficiary + V3: { + parents: 0, + interior: { + X1: { + AccountId32: { + id: *pp_acc + } + } + } + } + }, + { # assets + V3: [ + { + id: { + Concrete: { + parents: 0, + interior: { + X2: [ + { + PalletInstance: *assets_pallet_id + }, + { + GeneralIndex: *asset_id + } + ] + } + } + }, + fun: { + Fungible: *amount_to_send + } + } + ] + }, + 0, # feeAssetItem + Unlimited # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"679,150,000","proofSize":"6,196"} + - name: assets.Transferred + attributes: + - type: AccountId32 + value: *pp_sovereign_sibl + - name: assets.Transferred + attributes: + - type: u128 + value: *amount_to_send + + - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain + its: + - name: Assets Parachain should be able to reserve transfer KSM to Penpal Parachain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedReserveTransferAssets + args: [ + *pp_dest, # destination + { # beneficiary + V3: { + parents: 0, + interior: { + X1: { + AccountId32: { + id: *pp_acc + } + } + } + } + }, + { # assets + V3: [ + *ap_ksm_fungible + ] + }, + 0, # feeAssetItem + Unlimited # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"679,150,000","proofSize":"6,196"} + - name: balances.Endowed + attributes: + - type: AccountId32 + value: *pp_sovereign_sibl + - name: balances.Endowed + attributes: + - type: u128 + value: *amount + + - name: polkadotXcm.send( assets.forceCreateAsset ) | Penpal Parachain -> Assets Parachain + before: + - name: Get the asset balance of the Penpal Parachain Sovereign account in Assets Parachain + actions: + - queries: + assets_balance_pp_sovereign_before: + chain: *assets_parachain + pallet: assets + call: account + args: [ + *asset_id, + *pp_sovereign_sibl + ] + its: + - name: Penpal Parachain should be able to send XCM message paying its fee with sufficient asset in Assets Parachain + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *ap_dest_routed, # destination + { + v3: [ #message + { + WithdrawAsset: [ + { + id: { + concrete: { + parents: 0, + interior: { + X2: [ + { PalletInstance: *assets_pallet_id }, + { GeneralIndex: *asset_id } + ] + } + } + }, + fun: { fungible: *amount }} + ] + }, + { + BuyExecution: { + fees: { id: *suff_asset, fun: { fungible: *amount }}, + weightLimit: Unlimited + } + }, + { + Transact: { + originKind: SovereignAccount, + requireWeightAtMost: *weight_at_most, + call: $force_create_asset2 + } + }, + { + RefundSurplus + }, + { + DepositAsset: { + assets: { Wild: All }, + beneficiary: { + parents: 0, + interior: { + X1: { + AccountId32: { + network: , # None + id: *pp_acc + } + } + }} + } + } + ] + } + ] + events: + - name: sudo.Sudid + attributes: + - type: Result + value: Ok + - name: polkadotXcm.Sent + - name: assets.Burned + chain: *assets_parachain + attributes: + - type: AccountId32 + value: *pp_sovereign_sibl + - name: assets.Issued + chain: *assets_parachain + attributes: + - type: u32 + value: *asset_id + - queries: + assets_balance_pp_sovereign_after: + chain: *assets_parachain + pallet: assets + call: account + args: [ + *asset_id, + *pp_sovereign_sibl + ] + forced_created_asset2: + chain: *assets_parachain + pallet: assets + call: asset + args: [ 3 ] + - asserts: + isSome: + args: [ $forced_created_asset2 ] + - name: Should reduce the assets balance of the Penpal Parachain's SovereignAccount in the Assets Parachain + actions: + - asserts: + assetsDecreased: + args: [ + { + balances: { + before: $assets_balance_pp_sovereign_before, + after: $assets_balance_pp_sovereign_after, + }, + } + ] + + - name: Penpal Parachain SHOULD NOT be able to send XCM message paying its fee with sufficient assets if not enough balance + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *ap_dest_routed, # destination + { + v3: [ #message + { + WithdrawAsset: [*ap_suff_asset_fungible_fail] + }, + { + BuyExecution: { + fees: *ap_suff_asset_fungible_fail, + weightLimit: Unlimited + } + }, + { + Transact: { + originKind: SovereignAccount, + requireWeightAtMost: *weight_at_most, + call: $force_create_asset2 + } + } + ] + } + ] + events: + - name: xcmpQueue.Fail + chain: *assets_parachain + attributes: + - type: XcmV3TraitsError + value: FailedToTransactAsset diff --git a/parachains/integration-tests/e2e/assets/statemine/config.toml b/parachains/integration-tests/e2e/assets/statemine/config.toml new file mode 100644 index 00000000000..6aa7ee8d116 --- /dev/null +++ b/parachains/integration-tests/e2e/assets/statemine/config.toml @@ -0,0 +1,70 @@ +[relaychain] +default_command = "./bin/polkadot" +default_args = [ "-lparachain=debug", "-lxcm=trace" ] +chain = "kusama-local" + + [[relaychain.nodes]] + name = "alice" + ws_port = 9900 + validator = true + + [[relaychain.nodes]] + name = "bob" + ws_port = 9901 + validator = true + + [[relaychain.nodes]] + name = "charlie" + ws_port = 9902 + validator = true + + [[relaychain.nodes]] + name = "dave" + ws_port = 9903 + validator = true + +[[parachains]] +id = 1000 +chain = "statemine-local" +cumulus_based = true + + [[parachains.collators]] + name = "collator1" + ws_port = 9910 + command = "./bin/polkadot-parachain" + args = [ "-lxcm=trace" ] + + [[parachains.collators]] + name = "collator2" + ws_port = 9911 + command = "./bin/polkadot-parachain" + args = [ "-lxcm=trace" ] + +[[parachains]] +id = 2000 +chain = "penpal-kusama-2000" +cumulus_based = true + + [[parachains.collators]] + name = "collator3" + ws_port = 9920 + command = "./bin/polkadot-parachain" + args = [ "-lxcm=trace" ] + + [[parachains.collators]] + name = "collator4" + ws_port = 9921 + command = "./bin/polkadot-parachain" + args = [ "-lxcm=trace" ] + +# [[hrmpChannels]] +# sender = 1000 +# recipient = 2000 +# maxCapacity = 8 +# maxMessageSize = 8192 + +# [[hrmpChannels]] +# sender = 2000 +# recipient = 1000 +# maxCapacity = 8 +# maxMessageSize = 8192 diff --git a/parachains/integration-tests/statemine/xcm/0_init.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml similarity index 66% rename from parachains/integration-tests/statemine/xcm/0_init.yml rename to parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml index b9640517719..95c77f72d0d 100644 --- a/parachains/integration-tests/statemine/xcm/0_init.yml +++ b/parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml @@ -2,21 +2,21 @@ settings: chains: relay_chain: &relay_chain - wsPort: 9900 + wsPort: 9800 assets_parachain: &assets_parachain - wsPort: 9910 + wsPort: 9810 paraId: &ap_id 1000 penpal_parachain: &penpal_parachain - wsPort: 9920 + wsPort: 9820 paraId: &pp_id 2000 variables: common: - xcm_verison: &xcm_version '2' - require_weight_at_most: &weight_at_most 1000000000 + xcm_version: &xcm_version '3' + require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 200000} chains: relay_chain: signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} penpal_parachain: signer: &pp_signer //Alice decodedCalls: @@ -37,7 +37,7 @@ tests: its: - name: XCM supported versions between chains actions: - - extrinsics: # Relay Chain sets supported version for Assset Parachain + - extrinsics: # Relay Chain sets supported version for Asset Parachain - chain: *relay_chain sudo: true signer: *rc_signer @@ -56,13 +56,13 @@ tests: ] events: - name: sudo.Sudid - attribute: - type: Result - value: Ok + attributes: + - type: Result + value: Ok - name: xcmPallet.SupportedVersionChanged - attribute: - type: u32 - value: *xcm_version + attributes: + - type: u32 + value: *xcm_version - extrinsics: # Relay Chain sets supported version for Penpal Parachain - chain: *relay_chain sudo: true @@ -82,14 +82,14 @@ tests: ] events: - name: sudo.Sudid - attribute: - type: Result - value: Ok + attributes: + - type: Result + value: Ok - name: xcmPallet.SupportedVersionChanged - attribute: - type: u32 - value: *xcm_version - - extrinsics: # Assset Parachain sets supported version for Relay Chain through it + attributes: + - type: u32 + value: *xcm_version + - extrinsics: # Asset Parachain sets supported version for Relay Chain through it - chain: *relay_chain signer: *rc_signer sudo: true @@ -98,10 +98,20 @@ tests: args: [ *ap_dest, # destination { - v2: [ #message + v3: [ #message + { + UnpaidExecution: { + weightLimit: { + limited: { + refTime: 3200000000, + proofSize: 200000 + } + } + } + }, { Transact: { - originType: Superuser, + originKind: Superuser, requireWeightAtMost: *weight_at_most, call: $ap_force_xcm_version } @@ -111,15 +121,15 @@ tests: ] events: - name: sudo.Sudid - attribute: - type: Result - value: Ok + attributes: + - type: Result + value: Ok - name: xcmPallet.Sent - name: polkadotXcm.SupportedVersionChanged chain: *assets_parachain - attribute: - type: u32 - value: *xcm_version + attributes: + - type: u32 + value: *xcm_version - extrinsics: # Penpal Parachain sets supported version for Relay Chain - chain: *penpal_parachain signer: *pp_signer @@ -135,10 +145,10 @@ tests: ] events: - name: sudo.Sudid - attribute: - type: Result - value: Ok + attributes: + - type: Result + value: Ok - name: polkadotXcm.SupportedVersionChanged - attribute: - type: u32 - value: *xcm_version + attributes: + - type: u32 + value: *xcm_version diff --git a/parachains/integration-tests/statemine/xcm/1_dmp.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml similarity index 79% rename from parachains/integration-tests/statemine/xcm/1_dmp.yml rename to parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml index 9b08555a251..96a97ba728d 100644 --- a/parachains/integration-tests/statemine/xcm/1_dmp.yml +++ b/parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml @@ -2,21 +2,21 @@ settings: chains: relay_chain: &relay_chain - wsPort: 9900 + wsPort: 9800 assets_parachain: &assets_parachain - wsPort: 9910 + wsPort: 9810 paraId: &ap_id 1000 variables: relay_chain: signer: &rc_signer //Alice wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v1: { parents: 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_destination: &ap_dest { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}} assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *ap_acc }}}}} + assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} amount: &amount 1000000000000 ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - require_weight_at_most: &rc_weight_at_most 1000000000 + require_weight_at_most: &rc_weight_at_most {refTime: 1000000000, proofSize: 200000} assets_parachain_account: wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F asset_id: &asset_id 1 @@ -63,22 +63,22 @@ tests: args: [ *ap_dest, # destination *ap_benf, # beneficiary - { v1: [ *rc_ksm_fungible ] }, # assets + { v3: [ *rc_ksm_fungible ] }, # assets 0, # feeAssetItem { unlimited: true } # weightLimit ] events: - name: xcmPallet.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,021,973,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"162,909,000","proofSize":"0"} - queries: balance_rc_sender_after: chain: *relay_chain @@ -131,7 +131,12 @@ tests: args: [ *ap_dest, # destination { - v2: [ #message + v3: [ #message + { + UnpaidExecution: { + weightLimit: Unlimited + } + }, { Transact: { originType: Superuser, @@ -146,11 +151,11 @@ tests: - name: xcmPallet.Sent - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,021,258,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"1,015,234,000","proofSize":"200,000"} - queries: forced_created_asset: chain: *assets_parachain @@ -173,7 +178,12 @@ tests: args: [ *ap_dest, # destination { - v2: [ #message + v3: [ #message + { + UnpaidExecution: { + weightLimit: Unlimited + } + }, { Transact: { originType: Native, @@ -186,9 +196,9 @@ tests: ] events: - name: system.ExtrinsicFailed - attribute: - type: SpRuntimeDispatchError - value: BadOrigin + attributes: + - type: SpRuntimeDispatchError + value: BadOrigin - name: xcmPallet.limitedReserveTransferAssets before: *before_get_balances @@ -203,23 +213,22 @@ tests: args: [ *ap_dest, # destination *ap_benf, # beneficiary - { v1: [ *rc_ksm_fungible ] }, # assets + { v3: [ *rc_ksm_fungible ] }, # assets 0, # feeAssetItem { unlimited: true } # weightLimit ] events: - name: xcmPallet.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 750,645,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + value: {"refTime":"2,000,000,000","proofSize":"0"} - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isError: true - value: "WeightNotComputable" + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Incomplete + value: [{"refTime":"1,000,000,000","proofSize":"0"},"UntrustedReserveLocation"] - queries: balance_rc_sender_after: chain: *relay_chain diff --git a/parachains/integration-tests/statemint/xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml similarity index 72% rename from parachains/integration-tests/statemint/xcm/2_ump.yml rename to parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml index f51823eb3e8..d839375320b 100644 --- a/parachains/integration-tests/statemint/xcm/2_ump.yml +++ b/parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml @@ -2,28 +2,28 @@ settings: chains: relay_chain: &relay_chain - wsPort: 9900 + wsPort: 9800 assets_parachain: &assets_parachain - wsPort: 9910 + wsPort: 9810 paraId: &ap_id 1000 variables: common: amount: &amount 1000000000000 - require_weight_at_most: &weight_at_most 1000000000 + require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 0} relay_chain: signer: &rc_signer //Alice wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *ap_acc }}}}} + assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} assets_parachain_account: signer: &ap_signer //Alice wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - relay_chain_destination: &rc_dest { v1: { parents: 1, interior: { here: true }}} + relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - relay_chain_beneficiary: &rc_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *rc_acc }}}}} + relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *rc_acc }}}}} ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} decodedCalls: @@ -38,7 +38,7 @@ tests: describes: - name: polkadotXcm.limitedTeleportAssets before: - - name: DEPENDANCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Assets Parachain to have funds to send them back + - name: DEPENDENCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Assets Parachain to have funds to send them back actions: - extrinsics: - chain: *relay_chain @@ -48,22 +48,23 @@ tests: args: [ *ap_dest, # destination *ap_benf, # beneficiary - { v1: [ *rc_ksm_fungible ] }, # assets + { v3: [ *rc_ksm_fungible ] }, # assets 0, # feeAssetItem { unlimited: true } # weightLimit ] events: - name: xcmPallet.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + value: {"refTime":"3,000,000,000","proofSize":"0"} - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,021,635,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"162,909,000","proofSize":"0"} - name: Get the balances of the Assets Parachain's sender & Relay Chain's receiver actions: @@ -90,23 +91,23 @@ tests: args: [ *rc_dest, # destination *rc_benf, # beneficiary - { v1: [ *ap_ksm_fungible ] }, # assets + { v3: [ *ap_ksm_fungible ] }, # assets 0, # feeAssetItem { unlimited: true } # weightLimit ] events: - name: polkadotXcm.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 358,878,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"533,283,000","proofSize":"7,096"} - name: ump.ExecutedUpward chain: *relay_chain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - value: 4,000,000,000 + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + value: {"refTime":"4,000,000,000","proofSize":"0"} - queries: balance_ap_sender_after: chain: *assets_parachain @@ -148,7 +149,7 @@ tests: - name: polkadotXcm.send | Native - Transact(system.remark) its: - - name: Assets Parachain SHOULD NOT be able to dipatch 'send' call + - name: Assets Parachain SHOULD NOT be able to dispatch 'send' call actions: - extrinsics: - chain: *assets_parachain @@ -158,7 +159,12 @@ tests: args: [ *rc_dest, # destination { - v2: [ #message + v3: [ #message + { + UnpaidExecution: { + weightLimit: Unlimited + } + }, { Transact: { originType: Native, @@ -171,9 +177,9 @@ tests: ] events: - name: system.ExtrinsicFailed - attribute: - type: SpRuntimeDispatchError - value: BadOrigin + attributes: + - type: SpRuntimeDispatchError + value: BadOrigin - name: polkadotXcm.limitedReserveTransferAssets its: @@ -187,13 +193,13 @@ tests: args: [ *rc_dest, # destination *rc_benf, # beneficiary - { v1: [ *ap_ksm_fungible ] }, # assets + { v3: [ *ap_ksm_fungible ] }, # assets 0, # feeAssetItem { unlimited: true } # weightLimit ] events: - name: polkadotXcm.Attempted - attribute: - type: XcmV2TraitsOutcome - isError: true - value: Barrier + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Error + value: Barrier diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/3_hrmp-open-channels.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/3_hrmp-open-channels.yml new file mode 100644 index 00000000000..a274282df30 --- /dev/null +++ b/parachains/integration-tests/e2e/assets/statemint/0_xcm/3_hrmp-open-channels.yml @@ -0,0 +1,132 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9800 + assets_parachain: &assets_parachain + wsPort: 9810 + paraId: &ap_id 1000 + penpal_parachain: &penpal_parachain + wsPort: 9820 + paraId: &pp_id 2000 + variables: + common: + amount: &amount 2000000000000 + require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 20000} + hrmp_channels: + proposed_max_capacity: &max_capacity 8 + proposed_max_message_size: &max_message_size 8192 + channel: &channel { + maxCapacity: 8, + maxTotalSize: 8192, + maxMessageSize: 8192, + msgCount: 0, + totalSize: 0, + mqcHead: null, + senderDeposit: 0, + recipientDeposit: 0 + } + chains: + relay_chain: + signer: &rc_signer //Alice + assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} + ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + assets_parachain_account: + sovereign_account: &ap_sovereign 5Ec4AhPZk8STuex8Wsi9TwDtJQxKqzPJRCH7348Xtcs9vZLJ + relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} + penpal_parachain: + sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ + signer: &pp_signer //Alice + +tests: + - name: HRMP + beforeEach: + - name: DEPENDENCY | Penpal Parachain Sovereign account in the Relay Chain needs to be funded + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: balances + call: transfer + args: [ + *pp_sovereign, # destination + *amount, # value + ] + events: + - name: balances.Transfer + + - name: DEPENDENCY | Assets Parachain Sovereign account in the Relay Chain needs to be funded + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: balances + call: transfer + args: [ + *ap_sovereign, # destination + *amount, # value + ] + events: + - name: balances.Transfer + describes: + - name: hrmp.hrmpInitOpenChannel (Penpal Parachain → Assets Parachain) + its: + - name: Open Penpal Parachain to Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: hrmp + call: forceOpenHrmpChannel + args: [ + 2000, + 1000, + 8, + 8192 + ] + events: + - name: sudo.Sudid + attributes: + - type: Result + value: Ok + - name: hrmp.HrmpChannelForceOpened + - name: hrmp.hrmpInitOpenChannel (Assets Parachain → PenPal Parachain) + its: + - name: Open Assets Parachain to PenPal Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: hrmp + call: forceOpenHrmpChannel + args: [ + 1000, + 2000, + 8, + 8192 + ] + events: + - name: sudo.Sudid + attributes: + - type: Result + value: Ok + - name: hrmp.HrmpChannelForceOpened + - name: hrmp.forceProcessHrmpOpen (make sure all the channels are open) + its: + - name: Make sure all the pending channels are open + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: hrmp + call: forceProcessHrmpOpen + args: [ 2 ] + events: + - name: sudo.Sudid + attributes: + - type: Result + value: Ok diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml new file mode 100644 index 00000000000..c36192fd5a3 --- /dev/null +++ b/parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml @@ -0,0 +1,401 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9800 + assets_parachain: &assets_parachain + wsPort: 9810 + paraId: &ap_id 1000 + penpal_parachain: &penpal_parachain + wsPort: 9820 + paraId: &pp_id 2000 + variables: + common: + mint_amount: &mint_amount 1000000000000 + amount: &amount 1000000000000 + require_weight_at_most: &weight_at_most {refTime: 1200000000, proofSize: 20000} + amount_to_send: &amount_to_send 500000000000 + chains: + relay_chain: + signer: &rc_signer //Alice + assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_dest_routed: &ap_dest_routed { v3: { parents: 1, interior: { x1: { parachain: *ap_id } }}} + assets_parachain_account: + signer: &ap_signer //Alice + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + asset_id: &asset_id 2 + assets_pallet_id: &assets_pallet_id 50 + asset_min_balance: &asset_ed 1000 + penpal_parachain_destination: &pp_dest { v3: { parents: 1, interior: { x1: { parachain: *pp_id } }}} + ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} + ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} + suff_asset: &suff_asset { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: *asset_id } ] }}} + suff_asset_fail: &suff_asset_fail { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: 3 } ] }}} + suff_asset_fungible_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: 200000000000 }} + penpal_parachain: + sovereign_account: &pp_sovereign_sibl 13cKp89Msu7M2PiaCuuGr1BzAsD5V3vaVbDMs3YtjMZHdGwR + signer: &pp_signer //Alice + penpal_parachain_account: &pp_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + decodedCalls: + force_create_asset: + chain: *assets_parachain + pallet: assets + call: forceCreate + args: [ + *asset_id, + { Id: *ap_wallet }, # owner + true, # isSufficient + *asset_ed # minBalance + ] + force_create_asset2: + chain: *assets_parachain + pallet: assets + call: forceCreate + args: [ + *asset_id, + { Id: *ap_wallet }, # owner + true, # isSufficient + *asset_ed # minBalance + ] + +tests: + - name: HRMP + describes: + - name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain + before: + - name: DEPENDENCY | A sufficient Asset should exist in the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v3: [ #message + { + UnpaidExecution: { + weightLimit: Unlimited + } + }, + { + SetTopic: "0x0123456789012345678901234567891201234567890123456789012345678912" + }, + { + Transact: { + originKind: Superuser, + requireWeightAtMost: *weight_at_most, + call: $force_create_asset + } + } + ] + } + ] + events: + - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"1,218,405,000","proofSize":"20,000"} + - queries: + forced_created_asset: + chain: *assets_parachain + pallet: assets + call: asset + args: [ *asset_id ] + - asserts: + isSome: + args: [ $forced_created_asset ] + + - name: DEPENDENCY | Some Assets should be minted for the sender + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: assets + call: mint + args: [ + *asset_id, + *ap_wallet, + *mint_amount + ] + events: + - name: assets.Issued + + its: + - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedReserveTransferAssets + args: [ + *pp_dest, # destination + { # beneficiary + V3: { + parents: 0, + interior: { + X1: { + AccountId32: { + id: *pp_acc + } + } + } + } + }, + { # assets + V3: [ + { + id: { + Concrete: { + parents: 0, + interior: { + X2: [ + { + PalletInstance: *assets_pallet_id + }, + { + GeneralIndex: *asset_id + } + ] + } + } + }, + fun: { + Fungible: *amount_to_send + } + } + ] + }, + 0, # feeAssetItem + Unlimited # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"673,627,000","proofSize":"6,196"} + - name: assets.Transferred + attributes: + - type: AccountId32 + value: *pp_sovereign_sibl + - name: assets.Transferred + attributes: + - type: u128 + value: *amount_to_send + + - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain + its: + - name: Assets Parachain should be able to reserve transfer KSM to Penpal Parachain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedReserveTransferAssets + args: [ + *pp_dest, # destination + { # beneficiary + V3: { + parents: 0, + interior: { + X1: { + AccountId32: { + id: *pp_acc + } + } + } + } + }, + { # assets + V3: [ + *ap_ksm_fungible + ] + }, + 0, # feeAssetItem + Unlimited # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attributes: + - type: XcmV3TraitsOutcome + xcmOutcome: Complete + threshold: [10, 10] + value: {"refTime":"673,627,000","proofSize":"6,196"} + - name: balances.Endowed + attributes: + - type: AccountId32 + value: *pp_sovereign_sibl + - name: balances.Endowed + attributes: + - type: u128 + value: *amount + + - name: polkadotXcm.send( assets.forceCreateAsset ) | Penpal Parachain -> Assets Parachain + before: + - name: Get the asset balance of the Penpal Parachain Sovereign account in Assets Parachain + actions: + - queries: + assets_balance_pp_sovereign_before: + chain: *assets_parachain + pallet: assets + call: account + args: [ + *asset_id, + *pp_sovereign_sibl + ] + its: + - name: Penpal Parachain should be able to send XCM message paying its fee with sufficient asset in Assets Parachain + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *ap_dest_routed, # destination + { + v3: [ #message + { + WithdrawAsset: [ + { + id: { + concrete: { + parents: 0, + interior: { + X2: [ + { PalletInstance: *assets_pallet_id }, + { GeneralIndex: *asset_id } + ] + } + } + }, + fun: { fungible: *amount_to_send }} + ] + }, + { + BuyExecution: { + fees: { id: *suff_asset, fun: { fungible: *amount_to_send }}, + weightLimit: Unlimited + } + }, + { + Transact: { + originKind: SovereignAccount, + requireWeightAtMost: *weight_at_most, + call: $force_create_asset2 + } + }, + { + RefundSurplus + }, + { + DepositAsset: { + assets: { Wild: All }, + beneficiary: { + parents: 0, + interior: { + X1: { + AccountId32: { + network: , # None + id: *pp_acc + } + } + }} + } + } + ] + } + ] + events: + - name: sudo.Sudid + attributes: + - type: Result + value: Ok + - name: polkadotXcm.Sent + - name: assets.Burned + chain: *assets_parachain + attributes: + - type: AccountId32 + value: *pp_sovereign_sibl + - name: assets.Issued + chain: *assets_parachain + attributes: + - type: u32 + value: *asset_id + - queries: + assets_balance_pp_sovereign_after: + chain: *assets_parachain + pallet: assets + call: account + args: [ + *asset_id, + *pp_sovereign_sibl + ] + forced_created_asset2: + chain: *assets_parachain + pallet: assets + call: asset + args: [ 3 ] + - asserts: + isSome: + args: [ $forced_created_asset2 ] + - name: Should reduce the assets balance of the Penpal Parachain's SovereignAccount in the Assets Parachain + actions: + - asserts: + assetsDecreased: + args: [ + { + balances: { + before: $assets_balance_pp_sovereign_before, + after: $assets_balance_pp_sovereign_after, + }, + } + ] + + - name: Penpal Parachain SHOULD NOT be able to send XCM message paying its fee with sufficient assets if not enough balance + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *ap_dest_routed, # destination + { + v3: [ #message + { + WithdrawAsset: [*ap_suff_asset_fungible_fail] + }, + { + BuyExecution: { + fees: *ap_suff_asset_fungible_fail, + weightLimit: Unlimited + } + }, + { + Transact: { + originKind: SovereignAccount, + requireWeightAtMost: *weight_at_most, + call: $force_create_asset2 + } + } + ] + } + ] + events: + - name: xcmpQueue.Fail + chain: *assets_parachain + attributes: + - type: XcmV3TraitsError + value: FailedToTransactAsset diff --git a/parachains/integration-tests/e2e/assets/statemint/config.toml b/parachains/integration-tests/e2e/assets/statemint/config.toml new file mode 100644 index 00000000000..5b5a861eed6 --- /dev/null +++ b/parachains/integration-tests/e2e/assets/statemint/config.toml @@ -0,0 +1,71 @@ +[relaychain] +default_command = "./bin/polkadot" +default_args = [ "-lparachain=debug", "-lxcm=trace" ] +chain = "polkadot-local" + + [[relaychain.nodes]] + name = "alice" + ws_port = 9800 + validator = true + + [[relaychain.nodes]] + name = "bob" + ws_port = 9801 + validator = true + + [[relaychain.nodes]] + name = "charlie" + ws_port = 9802 + validator = true + + [[relaychain.nodes]] + name = "dave" + ws_port = 9803 + validator = true + +[[parachains]] +id = 1000 +chain = "statemint-local" +cumulus_based = true + + [[parachains.collators]] + name = "collator1" + ws_port = 9810 + command = "./bin/polkadot-parachain" + args = [ "-lxcm=trace" ] + + [[parachains.collators]] + name = "collator2" + ws_port = 9811 + command = "./bin/polkadot-parachain" + args = [ "-lxcm=trace" ] + + +[[parachains]] +id = 2000 +chain = "penpal-polkadot-2000" +cumulus_based = true + + [[parachains.collators]] + name = "collator3" + ws_port = 9820 + command = "./bin/polkadot-parachain" + args = [ "-lxcm=trace" ] + + [[parachains.collators]] + name = "collator4" + ws_port = 9821 + command = "./bin/polkadot-parachain" + args = [ "-lxcm=trace" ] + +# [[hrmpChannels]] +# sender = 1000 +# recipient = 2000 +# maxCapacity = 8 +# maxMessageSize = 8192 + +# [[hrmpChannels]] +# sender = 2000 +# recipient = 1000 +# maxCapacity = 8 +# maxMessageSize = 8192 diff --git a/parachains/integration-tests/collectives/0_xcm/0_init.yml b/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/0_init.yml similarity index 97% rename from parachains/integration-tests/collectives/0_xcm/0_init.yml rename to parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/0_init.yml index 48a86f9136e..4dadb9f0116 100644 --- a/parachains/integration-tests/collectives/0_xcm/0_init.yml +++ b/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/0_init.yml @@ -67,7 +67,7 @@ tests: v3: [ # message { UnpaidExecution: { - weightLimit: { + weightLimit: { limited: { refTime: 2200000000, # 2_200_000_000 proofSize: 200000, # 200_000 @@ -79,7 +79,7 @@ tests: Transact: { originKind: Superuser, requireWeightAtMost: { - refTime: 200000000, # 200_000_000 + refTime: 200000000, # 200_000_000 proofSize: 0, }, call: $ap_force_xcm_version diff --git a/parachains/integration-tests/collectives/0_xcm/1_teleport.yml b/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/1_teleport.yml similarity index 96% rename from parachains/integration-tests/collectives/0_xcm/1_teleport.yml rename to parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/1_teleport.yml index 2b1a6bba8f1..e6310d05922 100644 --- a/parachains/integration-tests/collectives/0_xcm/1_teleport.yml +++ b/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/1_teleport.yml @@ -39,19 +39,19 @@ tests: args: [ { v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination { v3: { parents: 0, interior: { x1: { accountId32: { id: *acc_alice_acc32 }}}}}, # beneficiary - { - v3: [ - # { + { + v3: [ + # { # # TODO use a separate Assets to pay a fee, to receive an exact amount of assets on beneficiary account. # # a call with two assets fails with an error right now. - # id: { concrete: { 0, interior: { here: true }}}, - # fun: { fungible: 1000000000000 } # 1_000_000_000_000 + # id: { concrete: { 0, interior: { here: true }}}, + # fun: { fungible: 1000000000000 } # 1_000_000_000_000 # }, - { - id: { concrete: { 0, interior: { here: true }}}, + { + id: { concrete: { 0, interior: { here: true }}}, fun: { fungible: 20000000000000 } # 20_000_000_000_000 } - ] + ] }, # assets 0, # feeAssetItem ] @@ -109,13 +109,13 @@ tests: args: [ { v3: { parents: 1, interior: { here: true }}}, # destination { v3: { parents: 0, interior: { x1: { accountId32: { id: *acc_alice_acc32 }}}}}, # beneficiary - { - v3: [ - { - id: { concrete: { parents: 1, interior: { here: true }}}, + { + v3: [ + { + id: { concrete: { parents: 1, interior: { here: true }}}, fun: { fungible: 10000000000000 } # 10_000_000_000_000 } - ] + ] }, # assets 0, # feeAssetItem ] diff --git a/parachains/integration-tests/collectives/0_xcm/2_reserve.yml b/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/2_reserve.yml similarity index 94% rename from parachains/integration-tests/collectives/0_xcm/2_reserve.yml rename to parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/2_reserve.yml index ac42ca4a4b0..b152d71de3a 100644 --- a/parachains/integration-tests/collectives/0_xcm/2_reserve.yml +++ b/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/2_reserve.yml @@ -26,13 +26,13 @@ tests: args: [ { v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination { v3: { parents: 0, interior: { x1: { accountId32: { id: *alice_acc32 }}}}}, # beneficiary - { - v3: [ - { - id: { concrete: { 0, interior: { here: true }}}, + { + v3: [ + { + id: { concrete: { 0, interior: { here: true }}}, fun: { fungible: 20000000000000 } # 20_000_000_000_000 } - ] + ] }, # assets 0, # feeAssetItem ] diff --git a/parachains/integration-tests/collectives/1_alliance/0_join_alliance_fails.yml b/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/0_join_alliance_fails.yml similarity index 100% rename from parachains/integration-tests/collectives/1_alliance/0_join_alliance_fails.yml rename to parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/0_join_alliance_fails.yml diff --git a/parachains/integration-tests/collectives/1_alliance/1_init_alliance.yml b/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/1_init_alliance.yml similarity index 96% rename from parachains/integration-tests/collectives/1_alliance/1_init_alliance.yml rename to parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/1_init_alliance.yml index 8e9adbbeb47..26bd72a7967 100644 --- a/parachains/integration-tests/collectives/1_alliance/1_init_alliance.yml +++ b/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/1_init_alliance.yml @@ -24,7 +24,7 @@ settings: ava_account32: &acc_ava_acc32 "0x348ef0b8776adbc09c862ddc29b1d193b9e24738e54eea3b0609c83856dc101c" mia_signer: &acc_mia_signer //Mia mia_account32: &acc_mia_acc32 "0xaebf15374cf7e758d10232514c569a7abf81cc1b8f1e81a73dbc608a0e335264" - decodedCalls: + decodedCalls: init_alliance_members: chain: *collectives_parachain pallet: alliance @@ -86,7 +86,7 @@ tests: v3: [ # message { UnpaidExecution: { - weightLimit: { + weightLimit: { limited: { refTime: 3000000000, # 3_000_000_000 proofSize: 2000000, # 2_000_000 @@ -98,7 +98,7 @@ tests: Transact: { originKind: Superuser, requireWeightAtMost: { - refTime: 1000000000, # 1_000_000_000 + refTime: 1000000000, # 1_000_000_000 proofSize: 1000000, # 1_000_000 }, call: $init_alliance_members @@ -120,7 +120,7 @@ tests: attributes: - type: XcmV3TraitsOutcome xcmOutcome: Complete - + - name: Alliance init call fails. actions: - extrinsics: @@ -135,7 +135,7 @@ tests: v3: [ # message { UnpaidExecution: { - weightLimit: { + weightLimit: { limited: { refTime: 3000000000, # 3_000_000_000 proofSize: 2000000, # 2_000_000 @@ -147,7 +147,7 @@ tests: Transact: { originKind: Superuser, requireWeightAtMost: { - refTime: 1000000000, # 1_000_000_000 + refTime: 1000000000, # 1_000_000_000 proofSize: 1000000, # 1_000_000 }, call: $init_alliance_voting_members @@ -186,7 +186,7 @@ tests: v3: [ # message { UnpaidExecution: { - weightLimit: { + weightLimit: { limited: { refTime: 5000000000, # 3_000_000_000 proofSize: 1000000, # 1_000_000 @@ -244,7 +244,7 @@ tests: v3: [ # message { UnpaidExecution: { - weightLimit: { + weightLimit: { limited: { refTime: 3000000000, # 3_000_000_000 proofSize: 2000000, # 2_000_000 @@ -256,7 +256,7 @@ tests: Transact: { originKind: Superuser, requireWeightAtMost: { - refTime: 1000000000, # 1_000_000_000 + refTime: 1000000000, # 1_000_000_000 proofSize: 1000000, # 1_000_000 }, call: $init_alliance_members @@ -278,4 +278,3 @@ tests: attributes: - type: XcmV3TraitsOutcome xcmOutcome: Complete - diff --git a/parachains/integration-tests/collectives/1_alliance/2_join_alliance_fails.yml b/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/2_join_alliance_fails.yml similarity index 100% rename from parachains/integration-tests/collectives/1_alliance/2_join_alliance_fails.yml rename to parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/2_join_alliance_fails.yml diff --git a/parachains/integration-tests/collectives/1_alliance/3_kick_member.yml b/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/3_kick_member.yml similarity index 98% rename from parachains/integration-tests/collectives/1_alliance/3_kick_member.yml rename to parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/3_kick_member.yml index 62c61787e21..aac09883375 100644 --- a/parachains/integration-tests/collectives/1_alliance/3_kick_member.yml +++ b/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/3_kick_member.yml @@ -125,7 +125,7 @@ tests: v3: [ #message { UnpaidExecution: { - weightLimit: { + weightLimit: { limited: { refTime: 4000000000, # 4_000_000_000 proofSize: 2000000, # 2_000_000 @@ -137,7 +137,7 @@ tests: Transact: { originKind: Superuser, requireWeightAtMost: { - refTime: 2000000000, # 2_000_000_000 + refTime: 2000000000, # 2_000_000_000 proofSize: 1000000, # 1_000_000 }, call: $alliance_kick_member diff --git a/parachains/integration-tests/collectives/config.toml b/parachains/integration-tests/e2e/collectives/collectives_polkadot/config.toml similarity index 84% rename from parachains/integration-tests/collectives/config.toml rename to parachains/integration-tests/e2e/collectives/collectives_polkadot/config.toml index 9d138be11ba..d99e38078d0 100644 --- a/parachains/integration-tests/collectives/config.toml +++ b/parachains/integration-tests/e2e/collectives/collectives_polkadot/config.toml @@ -10,10 +10,17 @@ chain = "polkadot-local" [[relaychain.nodes]] name = "bob" + ws_port = 9701 validator = true [[relaychain.nodes]] name = "charlie" + ws_port = 9702 + validator = true + + [[relaychain.nodes]] + name = "dave" + ws_port = 9703 validator = true [[parachains]] @@ -29,5 +36,6 @@ cumulus_based = true [[parachains.collators]] name = "collator2" + ws_port = 9711 command = "./bin/polkadot-parachain" args = ["-lxcm=trace"] diff --git a/parachains/integration-tests/emulated/assets/statemint/Cargo.toml b/parachains/integration-tests/emulated/assets/statemint/Cargo.toml new file mode 100644 index 00000000000..8c6077b67e4 --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemint/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "statemint-it" +version = "1.0.0" +authors = ["Parity Technologies "] +edition = "2021" +description = "Statemint parachain runtime integration tests with xcm-emulator" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } + +# Substrate +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } + +# Polkadot +polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } +xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } + +# Cumulus +parachains-common = { path = "../../../../common" } +penpal-runtime = { path = "../../../../runtimes/testing/penpal" } +statemint-runtime = { path = "../../../../runtimes/assets/statemint" } + +# Local +xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } +integration-tests-common = { default-features = false, path = "../../common" } diff --git a/parachains/integration-tests/emulated/assets/statemint/src/lib.rs b/parachains/integration-tests/emulated/assets/statemint/src/lib.rs new file mode 100644 index 00000000000..f7ca680a800 --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemint/src/lib.rs @@ -0,0 +1,33 @@ +pub use codec::Encode; +pub use frame_support::{ + assert_ok, instances::Instance1, pallet_prelude::Weight, traits::fungibles::Inspect, +}; +pub use integration_tests_common::{ + constants::{ + accounts::{ALICE, BOB}, + polkadot::ED as POLKADOT_ED, + PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, + }, + AccountId, BHKusama, BHKusamaPallet, BHKusamaReceiver, BHKusamaSender, BHPolkadot, + BHPolkadotPallet, BHPolkadotReceiver, BHPolkadotSender, Collectives, CollectivesPallet, + CollectivesReceiver, CollectivesSender, Kusama, KusamaMockNet, KusamaPallet, KusamaReceiver, + KusamaSender, PenpalKusama, PenpalKusamaReceiver, PenpalKusamaSender, PenpalPolkadot, + PenpalPolkadotReceiver, PenpalPolkadotSender, Polkadot, PolkadotMockNet, PolkadotPallet, + PolkadotReceiver, PolkadotSender, Statemine, StateminePallet, StatemineReceiver, + StatemineSender, Statemint, StatemintPallet, StatemintReceiver, StatemintSender, +}; +pub use polkadot_core_primitives::InboundDownwardMessage; +pub use xcm::{ + prelude::*, + v3::{ + Error, + NetworkId::{Kusama as KusamaId, Polkadot as PolkadotId}, + }, +}; +pub use xcm_emulator::{ + assert_expected_events, bx, cumulus_pallet_dmp_queue, helpers::weight_within_threshold, + Parachain as Para, RelayChain as Relay, TestExt, +}; + +#[cfg(test)] +mod tests; diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/mod.rs b/parachains/integration-tests/emulated/assets/statemint/src/tests/mod.rs new file mode 100644 index 00000000000..996f9fd0aae --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemint/src/tests/mod.rs @@ -0,0 +1,3 @@ +mod reserve_transfer; +mod teleport; +mod transact; diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs new file mode 100644 index 00000000000..55d201c5608 --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs @@ -0,0 +1,63 @@ +use crate::*; + +#[test] +fn reserve_transfer_native_asset_from_relay_to_assets() { + // Init tests variables + let amount = POLKADOT_ED * 1000; + let relay_sender_balance_before = Polkadot::account_data_of(PolkadotSender::get()).free; + let para_receiver_balance_before = Statemint::account_data_of(StatemintReceiver::get()).free; + + let origin = ::RuntimeOrigin::signed(PolkadotSender::get()); + let assets_para_destination: VersionedMultiLocation = + Polkadot::child_location_of(Statemint::para_id()).into(); + let beneficiary: VersionedMultiLocation = + AccountId32 { network: None, id: StatemintReceiver::get().into() }.into(); + let native_assets: VersionedMultiAssets = (Here, amount).into(); + let fee_asset_item = 0; + let weight_limit = WeightLimit::Unlimited; + + // Send XCM message from Relay Chain + Polkadot::execute_with(|| { + assert_ok!(::XcmPallet::limited_reserve_transfer_assets( + origin, + bx!(assets_para_destination), + bx!(beneficiary), + bx!(native_assets), + fee_asset_item, + weight_limit, + )); + + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Polkadot, + vec![ + RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted(Outcome::Complete(weight))) => { + weight: weight_within_threshold((REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), Weight::from_parts(2_000_000_000, 0), *weight), + }, + ] + ); + }); + + // Receive XCM message in Assets Parachain + Statemint::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Statemint, + vec![ + RuntimeEvent::DmpQueue(cumulus_pallet_dmp_queue::Event::ExecutedDownward { + outcome: Outcome::Incomplete(_, Error::UntrustedReserveLocation), + .. + }) => {}, + ] + ); + }); + + // Check if balances are updated accordingly in Relay Chain and Assets Parachain + let relay_sender_balance_after = Polkadot::account_data_of(PolkadotSender::get()).free; + let para_sender_balance_after = Statemint::account_data_of(StatemintReceiver::get()).free; + + assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); + assert_eq!(para_sender_balance_after, para_receiver_balance_before); +} diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs new file mode 100644 index 00000000000..163db77ddfd --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs @@ -0,0 +1,60 @@ +use crate::*; + +#[test] +fn teleport_native_assets_from_relay_to_assets_para() { + // Init tests variables + let amount = POLKADOT_ED * 1000; + let relay_sender_balance_before = Polkadot::account_data_of(PolkadotSender::get()).free; + let para_receiver_balance_before = Statemint::account_data_of(StatemintReceiver::get()).free; + + let origin = ::RuntimeOrigin::signed(PolkadotSender::get()); + let assets_para_destination: VersionedMultiLocation = + Polkadot::child_location_of(Statemint::para_id()).into(); + let beneficiary: VersionedMultiLocation = + AccountId32 { network: None, id: StatemintReceiver::get().into() }.into(); + let native_assets: VersionedMultiAssets = (Here, amount).into(); + let fee_asset_item = 0; + let weight_limit = WeightLimit::Unlimited; + + // Send XCM message from Relay Chain + Polkadot::execute_with(|| { + assert_ok!(::XcmPallet::limited_teleport_assets( + origin, + bx!(assets_para_destination), + bx!(beneficiary), + bx!(native_assets), + fee_asset_item, + weight_limit, + )); + + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Polkadot, + vec![ + RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted(Outcome::Complete { .. })) => {}, + ] + ); + }); + + // Receive XCM message in Assets Parachain + Statemint::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Statemint, + vec![ + RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + who: *who == StatemineReceiver::get().into(), + }, + ] + ); + }); + + // Check if balances are updated accordingly in Relay Chain and Assets Parachain + let relay_sender_balance_after = Polkadot::account_data_of(PolkadotSender::get()).free; + let para_sender_balance_after = Statemint::account_data_of(StatemintReceiver::get()).free; + + assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); + assert!(para_sender_balance_after > para_receiver_balance_before); +} diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/transact.rs b/parachains/integration-tests/emulated/assets/statemint/src/tests/transact.rs new file mode 100644 index 00000000000..9220d914e47 --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemint/src/tests/transact.rs @@ -0,0 +1,58 @@ +use crate::*; + +#[test] +fn transact_sudo_from_relay_to_assets_para() { + // Init tests variables + // Call to be executed in Assets Parachain + const ASSET_ID: u32 = 1; + + let call = ::RuntimeCall::Assets(pallet_assets::Call::< + ::Runtime, + Instance1, + >::force_create { + id: ASSET_ID.into(), + is_sufficient: true, + min_balance: 1000, + owner: StatemintSender::get().into(), + }) + .encode() + .into(); + + // XcmPallet send arguments + let sudo_origin = ::RuntimeOrigin::root(); + let assets_para_destination: VersionedMultiLocation = + Polkadot::child_location_of(Statemint::para_id()).into(); + + let weight_limit = WeightLimit::Unlimited; + let require_weight_at_most = Weight::from_parts(1000000000, 200000); + let origin_kind = OriginKind::Superuser; + let check_origin = None; + + let xcm = VersionedXcm::from(Xcm(vec![ + UnpaidExecution { weight_limit, check_origin }, + Transact { require_weight_at_most, origin_kind, call }, + ])); + + // Send XCM message from Relay Chain + Polkadot::execute_with(|| { + assert_ok!(::XcmPallet::send( + sudo_origin, + bx!(assets_para_destination), + bx!(xcm), + )); + + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Polkadot, + vec![ + RuntimeEvent::XcmPallet(pallet_xcm::Event::Sent { .. }) => {}, + ] + ); + }); + + // Receive XCM message in Assets Parachain + Statemint::execute_with(|| { + assert!(::Assets::asset_exists(ASSET_ID)); + }); +} diff --git a/parachains/integration-tests/emulated/common/Cargo.toml b/parachains/integration-tests/emulated/common/Cargo.toml new file mode 100644 index 00000000000..a13ceac2cff --- /dev/null +++ b/parachains/integration-tests/emulated/common/Cargo.toml @@ -0,0 +1,54 @@ +[package] +name = "integration-tests-common" +version = "1.0.0" +authors = ["Parity Technologies "] +edition = "2021" +description = "Common resources for integration testing with xcm-emulator" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } + +# Substrate +grandpa = { package = "sc-consensus-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } +sp-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-consensus-babe = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-staking = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } + +# Polkadot +polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-service = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime-constants = { git = "https://github.com/paritytech/polkadot", branch = "master" } +kusama-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } +kusama-runtime-constants = { git = "https://github.com/paritytech/polkadot", branch = "master" } +xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } + +# Cumulus +parachains-common = { path = "../../../common" } +parachain-info = { path = "../../../pallets/parachain-info" } +cumulus-primitives-core = { path = "../../../../primitives/core" } +penpal-runtime = { path = "../../../runtimes/testing/penpal" } +statemint-runtime = { path = "../../../runtimes/assets/statemint" } +statemine-runtime = { path = "../../../runtimes/assets/statemine" } +collectives-polkadot-runtime = { path = "../../../runtimes/collectives/collectives-polkadot" } +bridge-hub-kusama-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-kusama" } +bridge-hub-polkadot-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-polkadot" } +xcm-emulator = { default-features = false, path = "../../../../xcm/xcm-emulator" } + +[features] +runtime-benchmarks = [ + "kusama-runtime/runtime-benchmarks", +] diff --git a/parachains/integration-tests/emulated/common/src/constants.rs b/parachains/integration-tests/emulated/common/src/constants.rs new file mode 100644 index 00000000000..b9720db4cf0 --- /dev/null +++ b/parachains/integration-tests/emulated/common/src/constants.rs @@ -0,0 +1,672 @@ +use grandpa::AuthorityId as GrandpaId; +use pallet_im_online::sr25519::AuthorityId as ImOnlineId; +pub use parachains_common::{AccountId, AuraId, Balance, BlockNumber, StatemintAuraId}; +use polkadot_primitives::{AssignmentId, ValidatorId}; +pub use polkadot_runtime_parachains::configuration::HostConfiguration; +use polkadot_service::chain_spec::get_authority_keys_from_seed_no_beefy; +use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; +use sp_consensus_babe::AuthorityId as BabeId; +use sp_core::{sr25519, storage::Storage, Pair, Public}; +use sp_runtime::{ + traits::{IdentifyAccount, Verify}, + BuildStorage, MultiSignature, Perbill, +}; +pub use xcm; + +pub const XCM_V2: u32 = 3; +pub const XCM_V3: u32 = 2; +pub const REF_TIME_THRESHOLD: u64 = 33; +pub const PROOF_SIZE_THRESHOLD: u64 = 33; + +type AccountPublic = ::Signer; + +/// Helper function to generate a crypto pair from seed +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 an account ID from seed. +fn get_account_id_from_seed(seed: &str) -> AccountId +where + AccountPublic: From<::Public>, +{ + AccountPublic::from(get_from_seed::(seed)).into_account() +} + +pub mod accounts { + use super::*; + pub const ALICE: &str = "Alice"; + pub const BOB: &str = "Bob"; + pub const CHARLIE: &str = "Charlie"; + pub const DAVE: &str = "Dave"; + pub const EVE: &str = "Eve"; + pub const FERDIE: &str = "Ferdei"; + pub const ALICE_STASH: &str = "Alice//stash"; + pub const BOB_STASH: &str = "Bob//stash"; + pub const CHARLIE_STASH: &str = "Charlie//stash"; + pub const DAVE_STASH: &str = "Dave//stash"; + pub const EVE_STASH: &str = "Eve//stash"; + pub const FERDIE_STASH: &str = "Ferdie//stash"; + + pub fn init_balances() -> Vec { + 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), + ] + } +} + +pub mod collators { + use super::*; + + pub fn invulnerables_statemint() -> Vec<(AccountId, StatemintAuraId)> { + vec![ + ( + get_account_id_from_seed::("Alice"), + get_from_seed::("Alice"), + ), + ( + get_account_id_from_seed::("Bob"), + get_from_seed::("Bob"), + ), + ] + } + + pub fn invulnerables() -> Vec<(AccountId, AuraId)> { + vec![ + ( + get_account_id_from_seed::("Alice"), + get_from_seed::("Alice"), + ), + (get_account_id_from_seed::("Bob"), get_from_seed::("Bob")), + ] + } +} + +pub mod validators { + use super::*; + + pub fn initial_authorities() -> Vec<( + AccountId, + AccountId, + BabeId, + GrandpaId, + ImOnlineId, + ValidatorId, + AssignmentId, + AuthorityDiscoveryId, + )> { + vec![get_authority_keys_from_seed_no_beefy("Alice")] + } +} + +/// The default XCM version to set in genesis config. +const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION; +// Polkadot +pub mod polkadot { + use super::*; + pub const ED: Balance = polkadot_runtime_constants::currency::EXISTENTIAL_DEPOSIT; + const STASH: u128 = 100 * polkadot_runtime_constants::currency::UNITS; + + pub fn get_host_config() -> HostConfiguration { + HostConfiguration { + max_upward_queue_count: 10, + max_upward_queue_size: 51200, + max_upward_message_size: 51200, + max_upward_message_num_per_candidate: 10, + max_downward_message_size: 51200, + ..Default::default() + } + } + + fn session_keys( + babe: BabeId, + grandpa: GrandpaId, + im_online: ImOnlineId, + para_validator: ValidatorId, + para_assignment: AssignmentId, + authority_discovery: AuthorityDiscoveryId, + ) -> polkadot_runtime::SessionKeys { + polkadot_runtime::SessionKeys { + babe, + grandpa, + im_online, + para_validator, + para_assignment, + authority_discovery, + } + } + + pub fn genesis() -> Storage { + let genesis_config = polkadot_runtime::GenesisConfig { + system: polkadot_runtime::SystemConfig { + code: polkadot_runtime::WASM_BINARY.unwrap().to_vec(), + }, + balances: polkadot_runtime::BalancesConfig { + balances: accounts::init_balances() + .iter() + .cloned() + .map(|k| (k, ED * 4096)) + .collect(), + }, + indices: polkadot_runtime::IndicesConfig { indices: vec![] }, + session: polkadot_runtime::SessionConfig { + keys: validators::initial_authorities() + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + polkadot::session_keys( + x.2.clone(), + x.3.clone(), + x.4.clone(), + x.5.clone(), + x.6.clone(), + x.7.clone(), + ), + ) + }) + .collect::>(), + }, + staking: polkadot_runtime::StakingConfig { + validator_count: validators::initial_authorities().len() as u32, + minimum_validator_count: 1, + stakers: validators::initial_authorities() + .iter() + .map(|x| { + (x.0.clone(), x.1.clone(), STASH, polkadot_runtime::StakerStatus::Validator) + }) + .collect(), + invulnerables: validators::initial_authorities() + .iter() + .map(|x| x.0.clone()) + .collect(), + force_era: pallet_staking::Forcing::ForceNone, + slash_reward_fraction: Perbill::from_percent(10), + ..Default::default() + }, + phragmen_election: Default::default(), + democracy: Default::default(), + council: polkadot_runtime::CouncilConfig { + members: vec![], + phantom: Default::default(), + }, + technical_committee: polkadot_runtime::TechnicalCommitteeConfig { + members: vec![], + phantom: Default::default(), + }, + technical_membership: Default::default(), + babe: polkadot_runtime::BabeConfig { + authorities: Default::default(), + epoch_config: Some(polkadot_runtime::BABE_GENESIS_EPOCH_CONFIG), + }, + grandpa: Default::default(), + im_online: Default::default(), + authority_discovery: polkadot_runtime::AuthorityDiscoveryConfig { keys: vec![] }, + claims: polkadot_runtime::ClaimsConfig { claims: vec![], vesting: vec![] }, + vesting: polkadot_runtime::VestingConfig { vesting: vec![] }, + treasury: Default::default(), + hrmp: Default::default(), + configuration: polkadot_runtime::ConfigurationConfig { config: get_host_config() }, + paras: Default::default(), + xcm_pallet: Default::default(), + nomination_pools: Default::default(), + }; + + genesis_config.build_storage().unwrap() + } +} + +// Kusama +pub mod kusama { + use super::*; + pub const ED: Balance = kusama_runtime_constants::currency::EXISTENTIAL_DEPOSIT; + const STASH: u128 = 100 * kusama_runtime_constants::currency::UNITS; + + pub fn get_host_config() -> HostConfiguration { + HostConfiguration { + max_upward_queue_count: 10, + max_upward_queue_size: 51200, + max_upward_message_size: 51200, + max_upward_message_num_per_candidate: 10, + max_downward_message_size: 51200, + ..Default::default() + } + } + + fn session_keys( + babe: BabeId, + grandpa: GrandpaId, + im_online: ImOnlineId, + para_validator: ValidatorId, + para_assignment: AssignmentId, + authority_discovery: AuthorityDiscoveryId, + ) -> kusama_runtime::SessionKeys { + kusama_runtime::SessionKeys { + babe, + grandpa, + im_online, + para_validator, + para_assignment, + authority_discovery, + } + } + + pub fn genesis() -> Storage { + let genesis_config = kusama_runtime::GenesisConfig { + system: kusama_runtime::SystemConfig { + code: kusama_runtime::WASM_BINARY.unwrap().to_vec(), + }, + balances: kusama_runtime::BalancesConfig { + balances: accounts::init_balances() + .iter() + .cloned() + .map(|k| (k, ED * 4096)) + .collect(), + }, + indices: kusama_runtime::IndicesConfig { indices: vec![] }, + session: kusama_runtime::SessionConfig { + keys: validators::initial_authorities() + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + kusama::session_keys( + x.2.clone(), + x.3.clone(), + x.4.clone(), + x.5.clone(), + x.6.clone(), + x.7.clone(), + ), + ) + }) + .collect::>(), + }, + staking: kusama_runtime::StakingConfig { + minimum_validator_count: 1, + validator_count: validators::initial_authorities().len() as u32, + stakers: validators::initial_authorities() + .iter() + .map(|x| { + (x.0.clone(), x.1.clone(), STASH, kusama_runtime::StakerStatus::Validator) + }) + .collect(), + invulnerables: validators::initial_authorities() + .iter() + .map(|x| x.0.clone()) + .collect(), + force_era: pallet_staking::Forcing::NotForcing, + slash_reward_fraction: Perbill::from_percent(10), + ..Default::default() + }, + babe: kusama_runtime::BabeConfig { + authorities: Default::default(), + epoch_config: Some(kusama_runtime::BABE_GENESIS_EPOCH_CONFIG), + }, + grandpa: Default::default(), + im_online: Default::default(), + authority_discovery: kusama_runtime::AuthorityDiscoveryConfig { keys: vec![] }, + claims: kusama_runtime::ClaimsConfig { claims: vec![], vesting: vec![] }, + vesting: kusama_runtime::VestingConfig { vesting: vec![] }, + treasury: Default::default(), + hrmp: Default::default(), + configuration: kusama_runtime::ConfigurationConfig { config: get_host_config() }, + paras: Default::default(), + xcm_pallet: Default::default(), + nomination_pools: Default::default(), + nis_counterpart_balances: Default::default(), + }; + + genesis_config.build_storage().unwrap() + } +} + +// Statemint +pub mod statemint { + use super::*; + pub const PARA_ID: u32 = 1000; + pub const ED: Balance = statemint_runtime::constants::currency::EXISTENTIAL_DEPOSIT; + + pub fn genesis() -> Storage { + let genesis_config = statemint_runtime::GenesisConfig { + system: statemint_runtime::SystemConfig { + code: statemint_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + }, + balances: statemint_runtime::BalancesConfig { + balances: accounts::init_balances() + .iter() + .cloned() + .map(|k| (k, ED * 4096)) + .collect(), + }, + parachain_info: statemint_runtime::ParachainInfoConfig { parachain_id: PARA_ID.into() }, + collator_selection: statemint_runtime::CollatorSelectionConfig { + invulnerables: collators::invulnerables_statemint() + .iter() + .cloned() + .map(|(acc, _)| acc) + .collect(), + candidacy_bond: ED * 16, + ..Default::default() + }, + session: statemint_runtime::SessionConfig { + keys: collators::invulnerables_statemint() + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + statemint_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect(), + }, + aura: Default::default(), + aura_ext: Default::default(), + parachain_system: Default::default(), + polkadot_xcm: statemint_runtime::PolkadotXcmConfig { + safe_xcm_version: Some(SAFE_XCM_VERSION), + }, + }; + + genesis_config.build_storage().unwrap() + } +} + +// Statemint +pub mod statemine { + use super::*; + pub const PARA_ID: u32 = 1000; + pub const ED: Balance = statemine_runtime::constants::currency::EXISTENTIAL_DEPOSIT; + + pub fn genesis() -> Storage { + let genesis_config = statemine_runtime::GenesisConfig { + system: statemine_runtime::SystemConfig { + code: statemine_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + }, + balances: statemine_runtime::BalancesConfig { + balances: accounts::init_balances() + .iter() + .cloned() + .map(|k| (k, ED * 4096)) + .collect(), + }, + parachain_info: statemine_runtime::ParachainInfoConfig { parachain_id: PARA_ID.into() }, + collator_selection: statemine_runtime::CollatorSelectionConfig { + invulnerables: collators::invulnerables() + .iter() + .cloned() + .map(|(acc, _)| acc) + .collect(), + candidacy_bond: ED * 16, + ..Default::default() + }, + session: statemine_runtime::SessionConfig { + keys: collators::invulnerables() + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + statemine_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect(), + }, + aura: Default::default(), + aura_ext: Default::default(), + parachain_system: Default::default(), + polkadot_xcm: statemine_runtime::PolkadotXcmConfig { + safe_xcm_version: Some(SAFE_XCM_VERSION), + }, + }; + + genesis_config.build_storage().unwrap() + } +} + +// Penpal +pub mod penpal { + use super::*; + pub const PARA_ID: u32 = 2000; + pub const ED: Balance = penpal_runtime::EXISTENTIAL_DEPOSIT; + + pub fn genesis(para_id: u32) -> Storage { + let genesis_config = penpal_runtime::GenesisConfig { + system: penpal_runtime::SystemConfig { + code: penpal_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + }, + balances: penpal_runtime::BalancesConfig { + balances: accounts::init_balances() + .iter() + .cloned() + .map(|k| (k, ED * 4096)) + .collect(), + }, + parachain_info: penpal_runtime::ParachainInfoConfig { parachain_id: para_id.into() }, + collator_selection: penpal_runtime::CollatorSelectionConfig { + invulnerables: collators::invulnerables() + .iter() + .cloned() + .map(|(acc, _)| acc) + .collect(), + candidacy_bond: ED * 16, + ..Default::default() + }, + session: penpal_runtime::SessionConfig { + keys: collators::invulnerables() + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + penpal_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect(), + }, + aura: Default::default(), + aura_ext: Default::default(), + parachain_system: Default::default(), + polkadot_xcm: penpal_runtime::PolkadotXcmConfig { + safe_xcm_version: Some(SAFE_XCM_VERSION), + }, + sudo: penpal_runtime::SudoConfig { + key: Some(get_account_id_from_seed::("Alice")), + }, + }; + + genesis_config.build_storage().unwrap() + } +} + +// Collectives +pub mod collectives { + use super::*; + pub const PARA_ID: u32 = 1001; + pub const ED: Balance = collectives_polkadot_runtime::constants::currency::EXISTENTIAL_DEPOSIT; + + pub fn genesis() -> Storage { + let genesis_config = collectives_polkadot_runtime::GenesisConfig { + system: collectives_polkadot_runtime::SystemConfig { + code: collectives_polkadot_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + }, + balances: collectives_polkadot_runtime::BalancesConfig { + balances: accounts::init_balances() + .iter() + .cloned() + .map(|k| (k, ED * 4096)) + .collect(), + }, + parachain_info: collectives_polkadot_runtime::ParachainInfoConfig { + parachain_id: PARA_ID.into(), + }, + collator_selection: collectives_polkadot_runtime::CollatorSelectionConfig { + invulnerables: collators::invulnerables() + .iter() + .cloned() + .map(|(acc, _)| acc) + .collect(), + candidacy_bond: ED * 16, + ..Default::default() + }, + session: collectives_polkadot_runtime::SessionConfig { + keys: collators::invulnerables() + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + collectives_polkadot_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect(), + }, + // no need to pass anything to aura, in fact it will panic if we do. Session will take care + // of this. + aura: Default::default(), + aura_ext: Default::default(), + parachain_system: Default::default(), + polkadot_xcm: collectives_polkadot_runtime::PolkadotXcmConfig { + safe_xcm_version: Some(SAFE_XCM_VERSION), + }, + alliance: Default::default(), + alliance_motion: Default::default(), + }; + + genesis_config.build_storage().unwrap() + } +} + +pub mod bridge_hub_kusama { + use super::*; + pub const PARA_ID: u32 = 1002; + pub const ED: Balance = bridge_hub_kusama_runtime::constants::currency::EXISTENTIAL_DEPOSIT; + + pub fn genesis() -> Storage { + let genesis_config = bridge_hub_kusama_runtime::GenesisConfig { + system: bridge_hub_kusama_runtime::SystemConfig { + code: bridge_hub_kusama_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + }, + balances: bridge_hub_kusama_runtime::BalancesConfig { + balances: accounts::init_balances() + .iter() + .cloned() + .map(|k| (k, ED * 4096)) + .collect(), + }, + parachain_info: bridge_hub_kusama_runtime::ParachainInfoConfig { + parachain_id: PARA_ID.into(), + }, + collator_selection: bridge_hub_kusama_runtime::CollatorSelectionConfig { + invulnerables: collators::invulnerables() + .iter() + .cloned() + .map(|(acc, _)| acc) + .collect(), + candidacy_bond: ED * 16, + ..Default::default() + }, + session: bridge_hub_kusama_runtime::SessionConfig { + keys: collators::invulnerables() + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + bridge_hub_kusama_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect(), + }, + aura: Default::default(), + aura_ext: Default::default(), + parachain_system: Default::default(), + polkadot_xcm: bridge_hub_kusama_runtime::PolkadotXcmConfig { + safe_xcm_version: Some(SAFE_XCM_VERSION), + }, + }; + + genesis_config.build_storage().unwrap() + } +} + +pub mod bridge_hub_polkadot { + use super::*; + pub const PARA_ID: u32 = 1002; + pub const ED: Balance = bridge_hub_polkadot_runtime::constants::currency::EXISTENTIAL_DEPOSIT; + + pub fn genesis() -> Storage { + let genesis_config = bridge_hub_polkadot_runtime::GenesisConfig { + system: bridge_hub_polkadot_runtime::SystemConfig { + code: bridge_hub_polkadot_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + }, + balances: bridge_hub_polkadot_runtime::BalancesConfig { + balances: accounts::init_balances() + .iter() + .cloned() + .map(|k| (k, ED * 4096)) + .collect(), + }, + parachain_info: bridge_hub_polkadot_runtime::ParachainInfoConfig { + parachain_id: PARA_ID.into(), + }, + collator_selection: bridge_hub_polkadot_runtime::CollatorSelectionConfig { + invulnerables: collators::invulnerables() + .iter() + .cloned() + .map(|(acc, _)| acc) + .collect(), + candidacy_bond: ED * 16, + ..Default::default() + }, + session: bridge_hub_polkadot_runtime::SessionConfig { + keys: collators::invulnerables() + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + bridge_hub_polkadot_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect(), + }, + aura: Default::default(), + aura_ext: Default::default(), + parachain_system: Default::default(), + polkadot_xcm: bridge_hub_polkadot_runtime::PolkadotXcmConfig { + safe_xcm_version: Some(SAFE_XCM_VERSION), + }, + }; + + genesis_config.build_storage().unwrap() + } +} diff --git a/parachains/integration-tests/emulated/common/src/lib.rs b/parachains/integration-tests/emulated/common/src/lib.rs new file mode 100644 index 00000000000..0d0928998a0 --- /dev/null +++ b/parachains/integration-tests/emulated/common/src/lib.rs @@ -0,0 +1,253 @@ +pub mod constants; + +pub use constants::{ + accounts::{ALICE, BOB}, + bridge_hub_kusama, bridge_hub_polkadot, collectives, kusama, penpal, polkadot, statemine, + statemint, +}; +use frame_support::{parameter_types, sp_io, sp_tracing}; +pub use parachains_common::{AccountId, AuraId, Balance, BlockNumber, StatemintAuraId}; +pub use sp_core::{sr25519, storage::Storage, Get}; +use xcm::prelude::*; +use xcm_emulator::{ + decl_test_networks, decl_test_parachains, decl_test_relay_chains, Parachain, RelayChain, + TestExt, +}; +use xcm_executor::traits::Convert; + +decl_test_relay_chains! { + pub struct Polkadot { + genesis = polkadot::genesis(), + on_init = (), + runtime = { + Runtime: polkadot_runtime::Runtime, + RuntimeOrigin: polkadot_runtime::RuntimeOrigin, + RuntimeCall: polkadot_runtime::RuntimeCall, + RuntimeEvent: polkadot_runtime::RuntimeEvent, + XcmConfig: polkadot_runtime::xcm_config::XcmConfig, + SovereignAccountOf: polkadot_runtime::xcm_config::SovereignAccountOf, + System: polkadot_runtime::System, + Balances: polkadot_runtime::Balances, + }, + pallets_extra = { + XcmPallet: polkadot_runtime::XcmPallet, + } + }, + pub struct Kusama { + genesis = kusama::genesis(), + on_init = (), + runtime = { + Runtime: kusama_runtime::Runtime, + RuntimeOrigin: kusama_runtime::RuntimeOrigin, + RuntimeCall: polkadot_runtime::RuntimeCall, + RuntimeEvent: kusama_runtime::RuntimeEvent, + XcmConfig: kusama_runtime::xcm_config::XcmConfig, + SovereignAccountOf: kusama_runtime::xcm_config::SovereignAccountOf, + System: kusama_runtime::System, + Balances: kusama_runtime::Balances, + }, + pallets_extra = { + XcmPallet: kusama_runtime::XcmPallet, + } + } +} + +decl_test_parachains! { + // Polkadot + pub struct Statemint { + genesis = statemint::genesis(), + on_init = (), + runtime = { + Runtime: statemint_runtime::Runtime, + RuntimeOrigin: statemint_runtime::RuntimeOrigin, + RuntimeCall: statemint_runtime::RuntimeCall, + RuntimeEvent: statemint_runtime::RuntimeEvent, + XcmpMessageHandler: statemint_runtime::XcmpQueue, + DmpMessageHandler: statemint_runtime::DmpQueue, + LocationToAccountId: statemint_runtime::xcm_config::LocationToAccountId, + System: statemint_runtime::System, + Balances: statemint_runtime::Balances, + ParachainSystem: statemint_runtime::ParachainSystem, + ParachainInfo: statemint_runtime::ParachainInfo, + }, + pallets_extra = { + PolkadotXcm: statemint_runtime::PolkadotXcm, + Assets: statemint_runtime::Assets, + } + }, + pub struct PenpalPolkadot { + genesis = penpal::genesis(penpal::PARA_ID), + on_init = (), + runtime = { + Runtime: penpal_runtime::Runtime, + RuntimeOrigin: penpal_runtime::RuntimeOrigin, + RuntimeCall: penpal_runtime::RuntimeEvent, + RuntimeEvent: penpal_runtime::RuntimeEvent, + XcmpMessageHandler: penpal_runtime::XcmpQueue, + DmpMessageHandler: penpal_runtime::DmpQueue, + LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId, + System: penpal_runtime::System, + Balances: penpal_runtime::Balances, + ParachainSystem: penpal_runtime::ParachainSystem, + ParachainInfo: penpal_runtime::ParachainInfo, + }, + pallets_extra = { + PolkadotXcm: penpal_runtime::PolkadotXcm, + Assets: penpal_runtime::Assets, + } + }, + // Kusama + pub struct Statemine { + genesis = statemine::genesis(), + on_init = (), + runtime = { + Runtime: statemine_runtime::Runtime, + RuntimeOrigin: statemine_runtime::RuntimeOrigin, + RuntimeCall: statemine_runtime::RuntimeEvent, + RuntimeEvent: statemine_runtime::RuntimeEvent, + XcmpMessageHandler: statemine_runtime::XcmpQueue, + DmpMessageHandler: statemine_runtime::DmpQueue, + LocationToAccountId: statemine_runtime::xcm_config::LocationToAccountId, + System: statemine_runtime::System, + Balances: statemine_runtime::Balances, + ParachainSystem: statemine_runtime::ParachainSystem, + ParachainInfo: statemine_runtime::ParachainInfo, + }, + pallets_extra = { + PolkadotXcm: statemine_runtime::PolkadotXcm, + Assets: statemine_runtime::Assets, + ForeignAssets: statemine_runtime::Assets, + } + }, + pub struct PenpalKusama { + genesis = penpal::genesis(penpal::PARA_ID), + on_init = (), + runtime = { + Runtime: penpal_runtime::Runtime, + RuntimeOrigin: penpal_runtime::RuntimeOrigin, + RuntimeCall: penpal_runtime::RuntimeEvent, + RuntimeEvent: penpal_runtime::RuntimeEvent, + XcmpMessageHandler: penpal_runtime::XcmpQueue, + DmpMessageHandler: penpal_runtime::DmpQueue, + LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId, + System: penpal_runtime::System, + Balances: penpal_runtime::Balances, + ParachainSystem: penpal_runtime::ParachainSystem, + ParachainInfo: penpal_runtime::ParachainInfo, + }, + pallets_extra = { + PolkadotXcm: penpal_runtime::PolkadotXcm, + Assets: penpal_runtime::Assets, + } + }, + pub struct Collectives { + genesis = collectives::genesis(), + on_init = (), + runtime = { + Runtime: collectives_polkadot_runtime::Runtime, + RuntimeOrigin: collectives_polkadot_runtime::RuntimeOrigin, + RuntimeCall: collectives_polkadot_runtime::RuntimeEvent, + RuntimeEvent: collectives_polkadot_runtime::RuntimeEvent, + XcmpMessageHandler: collectives_polkadot_runtime::XcmpQueue, + DmpMessageHandler: collectives_polkadot_runtime::DmpQueue, + LocationToAccountId: collectives_polkadot_runtime::xcm_config::LocationToAccountId, + System: collectives_polkadot_runtime::System, + Balances: collectives_polkadot_runtime::Balances, + ParachainSystem: collectives_polkadot_runtime::ParachainSystem, + ParachainInfo: collectives_polkadot_runtime::ParachainInfo, + }, + pallets_extra = { + PolkadotXcm: collectives_polkadot_runtime::PolkadotXcm, + } + }, + pub struct BHKusama { + genesis = bridge_hub_kusama::genesis(), + on_init = (), + runtime = { + Runtime: bridge_hub_kusama_runtime::Runtime, + RuntimeOrigin: bridge_hub_kusama_runtime::RuntimeOrigin, + RuntimeCall: bridge_hub_kusama_runtime::RuntimeEvent, + RuntimeEvent: bridge_hub_kusama_runtime::RuntimeEvent, + XcmpMessageHandler: bridge_hub_kusama_runtime::XcmpQueue, + DmpMessageHandler: bridge_hub_kusama_runtime::DmpQueue, + LocationToAccountId: bridge_hub_kusama_runtime::xcm_config::LocationToAccountId, + System: bridge_hub_kusama_runtime::System, + Balances: bridge_hub_kusama_runtime::Balances, + ParachainSystem: bridge_hub_kusama_runtime::ParachainSystem, + ParachainInfo:bridge_hub_kusama_runtime::ParachainInfo, + }, + pallets_extra = { + PolkadotXcm: bridge_hub_kusama_runtime::PolkadotXcm, + } + }, + pub struct BHPolkadot { + genesis = bridge_hub_polkadot::genesis(), + on_init = (), + runtime = { + Runtime: bridge_hub_polkadot_runtime::Runtime, + RuntimeOrigin: bridge_hub_polkadot_runtime::RuntimeOrigin, + RuntimeCall: bridge_hub_polkadot_runtime::RuntimeEvent, + RuntimeEvent: bridge_hub_polkadot_runtime::RuntimeEvent, + XcmpMessageHandler: bridge_hub_polkadot_runtime::XcmpQueue, + DmpMessageHandler: bridge_hub_polkadot_runtime::DmpQueue, + LocationToAccountId: bridge_hub_polkadot_runtime::xcm_config::LocationToAccountId, + System: bridge_hub_polkadot_runtime::System, + Balances: bridge_hub_polkadot_runtime::Balances, + ParachainSystem: bridge_hub_polkadot_runtime::ParachainSystem, + ParachainInfo:bridge_hub_polkadot_runtime::ParachainInfo, + }, + pallets_extra = { + PolkadotXcm: bridge_hub_polkadot_runtime::PolkadotXcm, + } + } +} + +decl_test_networks! { + pub struct PolkadotMockNet { + relay_chain = Polkadot, + parachains = vec![ + Statemint, + PenpalPolkadot, + Collectives, + BHPolkadot, + ], + }, + pub struct KusamaMockNet { + relay_chain = Kusama, + parachains = vec![ + Statemine, + PenpalKusama, + BHKusama, + ], + } +} + +parameter_types! { + // Polkadot + pub PolkadotSender: AccountId = Polkadot::account_id_of(ALICE); + pub PolkadotReceiver: AccountId = Polkadot::account_id_of(BOB); + // Kusama + pub KusamaSender: AccountId = Kusama::account_id_of(ALICE); + pub KusamaReceiver: AccountId = Kusama::account_id_of(BOB); + // Statemint + pub StatemintSender: AccountId = Statemint::account_id_of(ALICE); + pub StatemintReceiver: AccountId = Statemint::account_id_of(BOB); + // Statemine + pub StatemineSender: AccountId = Statemine::account_id_of(ALICE); + pub StatemineReceiver: AccountId = Statemine::account_id_of(BOB); + // Penpal Polkadot + pub PenpalPolkadotSender: AccountId = PenpalPolkadot::account_id_of(ALICE); + pub PenpalPolkadotReceiver: AccountId = PenpalPolkadot::account_id_of(BOB); + // Penpal Kusama + pub PenpalKusamaSender: AccountId = PenpalKusama::account_id_of(ALICE); + pub PenpalKusamaReceiver: AccountId = PenpalKusama::account_id_of(BOB); + // Collectives + pub CollectivesSender: AccountId = Collectives::account_id_of(ALICE); + pub CollectivesReceiver: AccountId = Collectives::account_id_of(BOB); + // Bridge Hub Polkadot + pub BHPolkadotSender: AccountId = BHPolkadot::account_id_of(ALICE); + pub BHPolkadotReceiver: AccountId = BHPolkadot::account_id_of(BOB); + // Bridge Hub Kusama + pub BHKusamaSender: AccountId = BHKusama::account_id_of(ALICE); + pub BHKusamaReceiver: AccountId = BHKusama::account_id_of(BOB); +} diff --git a/parachains/integration-tests/statemine/config.toml b/parachains/integration-tests/statemine/config.toml deleted file mode 100644 index 510f3cd3b04..00000000000 --- a/parachains/integration-tests/statemine/config.toml +++ /dev/null @@ -1,49 +0,0 @@ -[relaychain] -default_command = "./bin/polkadot" -default_args = [ "-lparachain=debug" ] -chain = "kusama-local" - - [[relaychain.nodes]] - name = "alice" - ws_port = 9900 - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - - [[relaychain.nodes]] - name = "charlie" - validator = true - - [[relaychain.nodes]] - name = "dave" - validator = true - -[[parachains]] -id = 1000 -chain = "statemine-local" -cumulus_based = true - - [[parachains.collators]] - name = "collator1" - ws_port = 9910 - command = "./bin/polkadot-parachain" - - [[parachains.collators]] - name = "collator2" - command = "./bin/polkadot-parachain" - -[[parachains]] -id = 2000 -chain = "penpal-kusama-2000" -cumulus_based = true - - [[parachains.collators]] - name = "collator3" - ws_port = 9920 - command = "./bin/polkadot-parachain" - - [[parachains.collators]] - name = "collator4" - command = "./bin/polkadot-parachain" diff --git a/parachains/integration-tests/statemine/xcm/3_hrmp-open-channels.yml b/parachains/integration-tests/statemine/xcm/3_hrmp-open-channels.yml deleted file mode 100644 index 45bf89e2b05..00000000000 --- a/parachains/integration-tests/statemine/xcm/3_hrmp-open-channels.yml +++ /dev/null @@ -1,408 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9920 - paraId: &pp_id 2000 - variables: - common: - amount: &amount 2000000000000 - require_weight_at_most: &weight_at_most 1000000000 - hrmp_channels: - proposed_max_capacity: &max_capacity 8 - proposed_max_message_size: &max_message_size 8192 - channel: &channel { - maxCapacity: 8, - maxTotalSize: 8192, - maxMessageSize: 8192, - msgCount: 0, - totalSize: 0, - mqcHead: null, - senderDeposit: 0, - recipientDeposit: 0 - } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - assets_parachain_account: - sovereign_account: &ap_sovereign F7fq1jSNVTPfJmaHaXCMtatT1EZefCUsa7rRiQVNR5efcah - relay_chain_destination: &rc_dest { v1: { parents: 1, interior: { here: true }}} - penpal_parachain: - sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ - signer: &pp_signer //Alice - decodedCalls: - init_open_channel_with_ap: - chain: *relay_chain - pallet: hrmp - call: hrmpInitOpenChannel - args: [ - *ap_id, # recipient - *max_capacity, # proposedMaxCapacity - *max_message_size # proposedMaxMessageSize - ] - init_open_channel_with_cp: - chain: *relay_chain - pallet: hrmp - call: hrmpInitOpenChannel - args: [ - *pp_id, # recipient - *max_capacity, # proposedMaxCapacity - *max_message_size # proposedMaxMessageSize - ] - accept_open_channel_with_ap: - chain: *relay_chain - pallet: hrmp - call: hrmpAcceptOpenChannel - args: [ - *ap_id, # recipient - ] - accept_init_open_request_from_cp: - chain: *relay_chain - pallet: hrmp - call: hrmpAcceptOpenChannel - args: [ - *pp_id, # sender - ] - xcm_accept_init_open_request_from_cp: - chain: *assets_parachain - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v2: [ #message - { - WithdrawAsset: [*rc_ksm_fungible] - }, - { - BuyExecution: { - fees: *rc_ksm_fungible, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *weight_at_most, - call: $accept_init_open_request_from_cp - } - } - ] - } - ] - xcm_init_open_channel_with_cp: - chain: *assets_parachain - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v2: [ #message - { - WithdrawAsset: [*rc_ksm_fungible] - }, - { - BuyExecution: { - fees: *rc_ksm_fungible, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *weight_at_most, - call: $init_open_channel_with_cp - } - } - ] - } - ] - -tests: - - name: HRMP - beforeEach: - - name: DEPENDANCY | Penpal Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *pp_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - - - name: DEPENDANCY | Assets Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *ap_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - describes: - - name: hrmp.hrmpInitOpenChannel (Penpal Parachain → Assets Parachain) - its: - - name: Penpal Parachain sends a request to the Relay Chain to open a channel with the Assets Parchain - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v2: [ #message - { - WithdrawAsset: [*rc_ksm_fungible] - }, - { - BuyExecution: { - fees: *rc_ksm_fungible, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *weight_at_most, - call: $init_open_channel_with_ap - } - } - ] - } - ] - events: - - name: sudo.Sudid - attribute: - type: Result - value: Ok - - name: polkadotXcm.Sent - - name: ump.ExecutedUpward - chain: *relay_chain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,160,892,000 - - name: hrmp.OpenChannelRequested - chain: *relay_chain - - queries: - requested_channels: - chain: *relay_chain - pallet: hrmp - call: hrmpOpenChannelRequestsList - args: [] - - asserts: - equal: - args: [ - $requested_channels, - [ - { - sender: *pp_id, - recipient: *ap_id - } - ] - ] - - - name: hrmp.hrmpAcceptOpenChannel (Assets Parachain → Penpal Parachain) - its: - - name: Assets Parachain sends a response to the Relay Chain accepting the Penpal Parachain's request for openning a HRMP channel - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v2: [ #message - { - Transact: { - originType: Superuser, - requireWeightAtMost: *weight_at_most, - call: $xcm_accept_init_open_request_from_cp - } - } - ] - } - ] - events: - - name: sudo.Sudid - attribute: - type: Result - value: Ok - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,021,258,000 - - name: polkadotXcm.Sent - chain: *assets_parachain - - name: ump.ExecutedUpward - timeout: 40000 - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,160,892,000 - - name: hrmp.OpenChannelAccepted - timeout: 40000 - - queries: - open_channels: - chain: *relay_chain - pallet: hrmp - call: hrmpChannels - delay: 80000 - args: [ - { - sender: *pp_id, - recipient: *ap_id - } - ] - - asserts: - equal: - args: [ - $open_channels, - *channel - ] - - - name: hrmp.hrmpInitOpenChannel (Assets Parachain → Penpal Parachain) - its: - - name: Assets Parchain sends a request to the Relay Chain to open a channel with a Penpal Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v2: [ #message - { - Transact: { - originType: Superuser, - requireWeightAtMost: *weight_at_most, - call: $xcm_init_open_channel_with_cp - } - } - ] - } - ] - events: - - name: sudo.Sudid - attribute: - type: Result - value: Ok - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,021,258,000 - - name: polkadotXcm.Sent - chain: *assets_parachain - - name: ump.ExecutedUpward - timeout: 40000 - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,160,892,000 - - name: hrmp.OpenChannelRequested - timeout: 40000 - - queries: - requested_channels: - chain: *relay_chain - pallet: hrmp - call: hrmpOpenChannelRequestsList - args: [] - - asserts: - equal: - args: [ - $requested_channels, - [ - { - sender: *ap_id, - recipient: *pp_id - } - ] - ] - - - name: hrmp.hrmpAcceptOpenChannel (Penpal Parachain → Assets Parachain) - its: - - name: Penpal Parachain sends a response to the Relay Chain accepting the Assets Parachain's request for openning a HRMP channel - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v2: [ #message - { - WithdrawAsset: [*rc_ksm_fungible] - }, - { - BuyExecution: { - fees: *rc_ksm_fungible, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *weight_at_most, - call: $accept_open_channel_with_ap - } - } - ] - } - ] - events: - - name: sudo.Sudid - attribute: - type: Result - value: Ok - - name: polkadotXcm.Sent - - name: ump.ExecutedUpward - chain: *relay_chain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,160,892,000 - - name: hrmp.OpenChannelAccepted - chain: *relay_chain diff --git a/parachains/integration-tests/statemine/xcm/4_hrmp.yml b/parachains/integration-tests/statemine/xcm/4_hrmp.yml deleted file mode 100644 index 28ef7bc803a..00000000000 --- a/parachains/integration-tests/statemine/xcm/4_hrmp.yml +++ /dev/null @@ -1,356 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9920 - paraId: &pp_id 2000 - variables: - common: - amount: &amount 1000000000000 - require_weight_at_most: &weight_at_most 1000000000 - amount_to_send: &amount_to_send 500000000000 - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_dest_routed: &ap_dest_routed { v1: { parents: 1, interior: { x1: { parachain: *ap_id } }}} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - asset_id: &asset_id 2 - assets_pallet_id: &assets_pallet_id 50 - asset_min_balance: &asset_ed 1000 - penpal_parachain_destination: &pp_dest { v1: { parents: 1, interior: { x1: { parachain: *pp_id } }}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} - suff_asset: &suff_asset { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: *asset_id } ] }}} - suff_asset_fail: &suff_asset_fail { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: 3 } ] }}} - suff_asset_fungible: &ap_suff_asset_fungible { id: *suff_asset, fun: { fungible: *weight_at_most }} - suff_asset_fungible_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: *weight_at_most }} - penpal_parachain: - sovereign_account: &pp_sovereign_sibl FBeL7EAeUroLWXW1yfKboiqTqVfbRBcsUKd6QqVf4kGBySS - signer: &pp_signer //Alice - penpal_parachain_account: &pp_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - decodedCalls: - force_create_asset: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - system_remark_with_event: - chain: *assets_parachain - pallet: system - call: remarkWithEvent - args: [ 0x0011 ] - -tests: - - name: HRMP - describes: - - name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain - before: - - name: DEPENDANCY | A sufficient Asset should exist in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v2: [ #message - { - Transact: { - originType: Superuser, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,021,258,000 - - queries: - forced_created_asset: - chain: *assets_parachain - pallet: assets - call: asset - args: [ *asset_id ] - - asserts: - isSome: - args: [ $forced_created_asset ] - - - name: DEPENDANCY | Some Assets should be minted for the sender - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: assets - call: mint - args: [ - *asset_id, - *ap_wallet, - *amount - ] - events: - - name: assets.Issued - - its: - - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V1: { - parents: 0, - interior: { - X1: { - AccountId32: { - network: Any, - id: *pp_acc - } - } - } - } - }, - { # assets - V1: [ - { - id: { - Concrete: { - parents: 0, - interior: { - X2: [ - { - PalletInstance: 50 - }, - { - GeneralIndex: *asset_id - } - ] - } - } - }, - fun: { - Fungible: *amount_to_send - } - } - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 654,608,000 - - name: assets.Transferred - attribute: - type: AccountId32 - value: *pp_sovereign_sibl - - name: assets.Transferred - attribute: - type: u128 - value: *amount_to_send - - - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain - its: - - name: Assets Parachain should be able to reserve transfer KSM to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V1: { - parents: 0, - interior: { - X1: { - AccountId32: { - network: Any, - id: *pp_acc - } - } - } - } - }, - { # assets - V1: [ - *ap_ksm_fungible - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 654,608,000 - - name: balances.Endowed - attribute: - type: AccountId32 - value: *pp_sovereign_sibl - - name: balances.Endowed - attribute: - type: u128 - value: *amount - - - name: polkadotXcm.send( system.remarkWithEvent() ) | Penpal Parachain -> Assets Parachain - before: - - name: Get the asset balance of the Penpal Parachain Sovereign account in Assets Parachain - actions: - - queries: - assets_balance_pp_sovereign_before: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - its: - - name: Penpal Parachain should be able to send XCM message paying its fee with sufficient asset in Assets Parachain - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v2: [ #message - { - WithdrawAsset: [*ap_suff_asset_fungible] - }, - { - BuyExecution: { - fees: *ap_suff_asset_fungible, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $system_remark_with_event - } - } - ] - } - ] - events: - - name: sudo.Sudid - attribute: - type: Result - value: Ok - - name: polkadotXcm.Sent - - name: assets.Burned - chain: *assets_parachain - attribute: - type: AccountId32 - value: *pp_sovereign_sibl - - name: assets.Issued - chain: *assets_parachain - attribute: - type: u32 - value: *asset_id - - name: system.Remarked - chain: *assets_parachain - attribute: - type: AccountId32 - value: *pp_sovereign_sibl - - queries: - assets_balance_pp_sovereign_after: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - - - name: Should reduce the assets balance of the Penpal Parachain's SovereignAccount in the Assets Parachain - actions: - - asserts: - assetsDecreased: - args: [ - { - balances: { - before: $assets_balance_pp_sovereign_before, - after: $assets_balance_pp_sovereign_after, - }, - } - ] - - - name: Penpal Parachain SHOULD NOT be able to send XCM message paying its fee with sufficient assets if not enough balance - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v2: [ #message - { - WithdrawAsset: [*ap_suff_asset_fungible_fail] - }, - { - BuyExecution: { - fees: *ap_suff_asset_fungible_fail, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $system_remark_with_event - } - } - ] - } - ] - events: - - name: xcmpQueue.Fail - chain: *assets_parachain - attribute: - type: XcmV2TraitsError - value: FailedToTransactAsset diff --git a/parachains/integration-tests/statemint/config.toml b/parachains/integration-tests/statemint/config.toml deleted file mode 100644 index f989d366ef3..00000000000 --- a/parachains/integration-tests/statemint/config.toml +++ /dev/null @@ -1,49 +0,0 @@ -[relaychain] -default_command = "./bin/polkadot" -default_args = [ "-lparachain=debug" ] -chain = "polkadot-local" - - [[relaychain.nodes]] - name = "alice" - ws_port = 9900 - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - - [[relaychain.nodes]] - name = "charlie" - validator = true - - [[relaychain.nodes]] - name = "dave" - validator = true - -[[parachains]] -id = 1000 -chain = "statemint-local" -cumulus_based = true - - [[parachains.collators]] - name = "collator1" - ws_port = 9910 - command = "./bin/polkadot-parachain" - - [[parachains.collators]] - name = "collator2" - command = "./bin/polkadot-parachain" - -[[parachains]] -id = 2000 -chain = "penpal-polkadot-2000" -cumulus_based = true - - [[parachains.collators]] - name = "collator3" - ws_port = 9920 - command = "./bin/polkadot-parachain" - - [[parachains.collators]] - name = "collator4" - command = "./bin/polkadot-parachain" diff --git a/parachains/integration-tests/statemint/xcm/3_hrmp-open-channels.yml b/parachains/integration-tests/statemint/xcm/3_hrmp-open-channels.yml deleted file mode 100644 index f83e778f1c0..00000000000 --- a/parachains/integration-tests/statemint/xcm/3_hrmp-open-channels.yml +++ /dev/null @@ -1,402 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9920 - paraId: &pp_id 2000 - variables: - common: - amount: &amount 2000000000000 - require_weight_at_most: &weight_at_most 1000000000 - hrmp_channels: - proposed_max_capacity: &max_capacity 8 - proposed_max_message_size: &max_message_size 8192 - channel: &channel { - maxCapacity: 8, - maxTotalSize: 8192, - maxMessageSize: 8192, - msgCount: 0, - totalSize: 0, - mqcHead: null, - senderDeposit: 0, - recipientDeposit: 0 - } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} - ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - assets_parachain_account: - sovereign_account: &ap_sovereign F7fq1jSNVTPfJmaHaXCMtatT1EZefCUsa7rRiQVNR5efcah - relay_chain_destination: &rc_dest { v1: { parents: 1, interior: { here: true }}} - penpal_parachain: - sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ - signer: &pp_signer //Alice - decodedCalls: - init_open_channel_with_ap: - chain: *relay_chain - pallet: hrmp - call: hrmpInitOpenChannel - args: [ - *ap_id, # recipient - *max_capacity, # proposedMaxCapacity - *max_message_size # proposedMaxMessageSize - ] - init_open_channel_with_cp: - chain: *relay_chain - pallet: hrmp - call: hrmpInitOpenChannel - args: [ - *pp_id, # recipient - *max_capacity, # proposedMaxCapacity - *max_message_size # proposedMaxMessageSize - ] - accept_open_channel_with_ap: - chain: *relay_chain - pallet: hrmp - call: hrmpAcceptOpenChannel - args: [ - *ap_id, # recipient - ] - accept_init_open_request_from_cp: - chain: *relay_chain - pallet: hrmp - call: hrmpAcceptOpenChannel - args: [ - *pp_id, # sender - ] - xcm_accept_init_open_request_from_cp: - chain: *assets_parachain - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v2: [ #message - { - WithdrawAsset: [*rc_ksm_fungible] - }, - { - BuyExecution: { - fees: *rc_ksm_fungible, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *weight_at_most, - call: $accept_init_open_request_from_cp - } - } - ] - } - ] - xcm_init_open_channel_with_cp: - chain: *assets_parachain - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v2: [ #message - { - WithdrawAsset: [*rc_ksm_fungible] - }, - { - BuyExecution: { - fees: *rc_ksm_fungible, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *weight_at_most, - call: $init_open_channel_with_cp - } - } - ] - } - ] - -tests: - - name: HRMP - beforeEach: - - name: DEPENDANCY | Penpal Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *pp_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - - - name: DEPENDANCY | Assets Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *ap_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - describes: - - name: hrmp.hrmpInitOpenChannel (Penpal Parachain → Assets Parachain) - its: - - name: Penpal Parachain sends a request to the Relay Chain to open a channel with the Assets Parchain - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v2: [ #message - { - WithdrawAsset: [*rc_ksm_fungible] - }, - { - BuyExecution: { - fees: *rc_ksm_fungible, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *weight_at_most, - call: $init_open_channel_with_ap - } - } - ] - } - ] - events: - - name: sudo.Sudid - attribute: - type: Result - value: Ok - - name: polkadotXcm.Sent - - name: ump.ExecutedUpward - chain: *relay_chain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - value: 4,000,000,000 - - name: hrmp.OpenChannelRequested - chain: *relay_chain - - queries: - requested_channels: - chain: *relay_chain - pallet: hrmp - call: hrmpOpenChannelRequestsList - args: [] - - asserts: - equal: - args: [ - $requested_channels, - [ - { - sender: *pp_id, - recipient: *ap_id - } - ] - ] - - - name: hrmp.hrmpAcceptOpenChannel (Assets Parachain → Penpal Parachain) - its: - - name: Assets Parachain sends a response to the Relay Chain accepting the Penpal Parachain's request for openning a HRMP channel - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v2: [ #message - { - Transact: { - originType: Superuser, - requireWeightAtMost: *weight_at_most, - call: $xcm_accept_init_open_request_from_cp - } - } - ] - } - ] - events: - - name: sudo.Sudid - attribute: - type: Result - value: Ok - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,020,807,000 - - name: polkadotXcm.Sent - chain: *assets_parachain - - name: ump.ExecutedUpward - timeout: 40000 - attribute: - type: XcmV2TraitsOutcome - isComplete: true - value: 4,000,000,000 - - name: hrmp.OpenChannelAccepted - timeout: 40000 - - queries: - open_channels: - chain: *relay_chain - pallet: hrmp - call: hrmpChannels - delay: 80000 - args: [ - { - sender: *pp_id, - recipient: *ap_id - } - ] - - asserts: - equal: - args: [ - $open_channels, - *channel - ] - - - name: hrmp.hrmpInitOpenChannel (Assets Parachain → Penpal Parachain) - its: - - name: Assets Parchain sends a request to the Relay Chain to open a channel with a Penpal Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v2: [ #message - { - Transact: { - originType: Superuser, - requireWeightAtMost: *weight_at_most, - call: $xcm_init_open_channel_with_cp - } - } - ] - } - ] - events: - - name: sudo.Sudid - attribute: - type: Result - value: Ok - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,020,807,000 - - name: polkadotXcm.Sent - chain: *assets_parachain - - name: ump.ExecutedUpward - timeout: 40000 - attribute: - type: XcmV2TraitsOutcome - isComplete: true - value: 4,000,000,000 - - name: hrmp.OpenChannelRequested - timeout: 40000 - - queries: - requested_channels: - chain: *relay_chain - pallet: hrmp - call: hrmpOpenChannelRequestsList - args: [] - - asserts: - equal: - args: [ - $requested_channels, - [ - { - sender: *ap_id, - recipient: *pp_id - } - ] - ] - - - name: hrmp.hrmpAcceptOpenChannel (Penpal Parachain → Assets Parachain) - its: - - name: Penpal Parachain sends a response to the Relay Chain accepting the Assets Parachain's request for openning a HRMP channel - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v2: [ #message - { - WithdrawAsset: [*rc_ksm_fungible] - }, - { - BuyExecution: { - fees: *rc_ksm_fungible, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *weight_at_most, - call: $accept_open_channel_with_ap - } - } - ] - } - ] - events: - - name: sudo.Sudid - attribute: - type: Result - value: Ok - - name: polkadotXcm.Sent - - name: ump.ExecutedUpward - chain: *relay_chain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - value: 4,000,000,000 - - name: hrmp.OpenChannelAccepted - chain: *relay_chain diff --git a/parachains/integration-tests/statemint/xcm/4_hrmp.yml b/parachains/integration-tests/statemint/xcm/4_hrmp.yml deleted file mode 100644 index 00a3ff467bc..00000000000 --- a/parachains/integration-tests/statemint/xcm/4_hrmp.yml +++ /dev/null @@ -1,356 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9920 - paraId: &pp_id 2000 - variables: - common: - amount: &amount 1000000000000 - require_weight_at_most: &weight_at_most 1000000000 - amount_to_send: &amount_to_send 500000000000 - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_dest_routed: &ap_dest_routed { v1: { parents: 1, interior: { x1: { parachain: *ap_id } }}} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - asset_id: &asset_id 2 - assets_pallet_id: &assets_pallet_id 50 - asset_min_balance: &asset_ed 1000 - penpal_parachain_destination: &pp_dest { v1: { parents: 1, interior: { x1: { parachain: *pp_id } }}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} - suff_asset: &suff_asset { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: *asset_id } ] }}} - suff_asset_fail: &suff_asset_fail { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: 3 } ] }}} - suff_asset_fungible: &ap_suff_asset_fungible { id: *suff_asset, fun: { fungible: *weight_at_most }} - suff_asset_fungible_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: *weight_at_most }} - penpal_parachain: - sovereign_account: &pp_sovereign_sibl 13cKp89Msu7M2PiaCuuGr1BzAsD5V3vaVbDMs3YtjMZHdGwR - signer: &pp_signer //Alice - penpal_parachain_account: &pp_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - decodedCalls: - force_create_asset: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - system_remark_with_event: - chain: *assets_parachain - pallet: system - call: remarkWithEvent - args: [ 0x0011 ] - -tests: - - name: HRMP - describes: - - name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain - before: - - name: DEPENDANCY | A sufficient Asset should exist in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v2: [ #message - { - Transact: { - originType: Superuser, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 1,020,807,000 - - queries: - forced_created_asset: - chain: *assets_parachain - pallet: assets - call: asset - args: [ *asset_id ] - - asserts: - isSome: - args: [ $forced_created_asset ] - - - name: DEPENDANCY | Some Assets should be minted for the sender - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: assets - call: mint - args: [ - *asset_id, - *ap_wallet, - *amount - ] - events: - - name: assets.Issued - - its: - - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V1: { - parents: 0, - interior: { - X1: { - AccountId32: { - network: Any, - id: *pp_acc - } - } - } - } - }, - { # assets - V1: [ - { - id: { - Concrete: { - parents: 0, - interior: { - X2: [ - { - PalletInstance: 50 - }, - { - GeneralIndex: *asset_id - } - ] - } - } - }, - fun: { - Fungible: *amount_to_send - } - } - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 654,404,000 - - name: assets.Transferred - attribute: - type: AccountId32 - value: *pp_sovereign_sibl - - name: assets.Transferred - attribute: - type: u128 - value: *amount_to_send - - - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain - its: - - name: Assets Parachain should be able to reserve transfer KSM to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V1: { - parents: 0, - interior: { - X1: { - AccountId32: { - network: Any, - id: *pp_acc - } - } - } - } - }, - { # assets - V1: [ - *ap_ksm_fungible - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - attribute: - type: XcmV2TraitsOutcome - isComplete: true - threshold: [10, 10] - value: 654,404,000 - - name: balances.Endowed - attribute: - type: AccountId32 - value: *pp_sovereign_sibl - - name: balances.Endowed - attribute: - type: u128 - value: *amount - - - name: polkadotXcm.send( system.remarkWithEvent() ) | Penpal Parachain -> Assets Parachain - before: - - name: Get the asset balance of the Penpal Parachain Sovereign account in Assets Parachain - actions: - - queries: - assets_balance_pp_sovereign_before: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - its: - - name: Penpal Parachain should be able to send XCM message paying its fee with sufficient asset in Assets Parachain - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v2: [ #message - { - WithdrawAsset: [*ap_suff_asset_fungible] - }, - { - BuyExecution: { - fees: *ap_suff_asset_fungible, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $system_remark_with_event - } - } - ] - } - ] - events: - - name: sudo.Sudid - attribute: - type: Result - value: Ok - - name: polkadotXcm.Sent - - name: assets.Burned - chain: *assets_parachain - attribute: - type: AccountId32 - value: *pp_sovereign_sibl - - name: assets.Issued - chain: *assets_parachain - attribute: - type: u32 - value: *asset_id - - name: system.Remarked - chain: *assets_parachain - attribute: - type: AccountId32 - value: *pp_sovereign_sibl - - queries: - assets_balance_pp_sovereign_after: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - - - name: Should reduce the assets balance of the Penpal Parachain's SovereignAccount in the Assets Parachain - actions: - - asserts: - assetsDecreased: - args: [ - { - balances: { - before: $assets_balance_pp_sovereign_before, - after: $assets_balance_pp_sovereign_after, - }, - } - ] - - - name: Penpal Parachain SHOULD NOT be able to send XCM message paying its fee with sufficient assets if not enough balance - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v2: [ #message - { - WithdrawAsset: [*ap_suff_asset_fungible_fail] - }, - { - BuyExecution: { - fees: *ap_suff_asset_fungible_fail, - weightLimit: Unlimited - } - }, - { - Transact: { - originType: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $system_remark_with_event - } - } - ] - } - ] - events: - - name: xcmpQueue.Fail - chain: *assets_parachain - attribute: - type: XcmV2TraitsError - value: FailedToTransactAsset diff --git a/xcm/xcm-emulator/Cargo.toml b/xcm/xcm-emulator/Cargo.toml new file mode 100644 index 00000000000..8da28d0283f --- /dev/null +++ b/xcm/xcm-emulator/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "xcm-emulator" +description = "Test kit to emulate XCM program execution." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0" } +paste = "1.0.5" +quote = "1.0.23" +casey = "0.3.3" +log = { version = "0.4.17", default-features = false } + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master" } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } + +cumulus-primitives-core = { path = "../../primitives/core"} +cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue" } +cumulus-pallet-dmp-queue = { path = "../../pallets/dmp-queue" } +cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system" } +cumulus-test-service = { path = "../../test/service" } +parachain-info = { path = "../../parachains/pallets/parachain-info" } +cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } +cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder" } +parachains-common = { path = "../../parachains/common" } + +xcm = { git = "https://github.com/paritytech/polkadot", branch = "master" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } diff --git a/xcm/xcm-emulator/README.md b/xcm/xcm-emulator/README.md new file mode 100644 index 00000000000..5087ae4ac3c --- /dev/null +++ b/xcm/xcm-emulator/README.md @@ -0,0 +1,20 @@ +# xcm-emulator + +XCM-Emulator is a tool to emulate XCM program execution using +pre-configured runtimes, including those used to run on live +networks, such as Kusama, Polkadot, Statemine et cetera. +This allows for testing cross-chain message passing and verifying +outcomes, weights, and side-effects. It is faster than spinning up +a zombienet and as all the chains are in one process debugging using Clion is easy. + +## Limitations + +As the messages do not physically go through the same messaging infrastructure +there is some code that is not being tested compared to using slower E2E tests. +In future it may be possible to run these XCM emulated tests as E2E tests (without changes). + +## Alternatives + +If you just wish to test execution of various XCM instructions +against the XCM VM then the `xcm-simulator` (in the polkadot +repo) is the perfect tool for this. diff --git a/xcm/xcm-emulator/src/lib.rs b/xcm/xcm-emulator/src/lib.rs new file mode 100644 index 00000000000..b928d5cf76e --- /dev/null +++ b/xcm/xcm-emulator/src/lib.rs @@ -0,0 +1,939 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +pub use casey::pascal; +pub use codec::Encode; +pub use frame_support::{ + sp_runtime::BuildStorage, + traits::{Get, Hooks}, + weights::Weight, +}; +pub use frame_system::AccountInfo; +pub use log; +pub use pallet_balances::AccountData; +pub use paste; +pub use sp_arithmetic::traits::Bounded; +pub use sp_core::storage::Storage; +pub use sp_io::TestExternalities; +pub use sp_std::{cell::RefCell, collections::vec_deque::VecDeque, marker::PhantomData}; +pub use sp_trie::StorageProof; + +pub use cumulus_pallet_dmp_queue; +pub use cumulus_pallet_parachain_system; +pub use cumulus_pallet_xcmp_queue; +pub use cumulus_primitives_core::{ + self, relay_chain::BlockNumber as RelayBlockNumber, DmpMessageHandler, ParaId, + PersistedValidationData, XcmpMessageHandler, +}; +pub use cumulus_primitives_parachain_inherent::ParachainInherentData; +pub use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; +pub use cumulus_test_service::get_account_id_from_seed; +pub use parachain_info; +pub use parachains_common::{AccountId, BlockNumber}; + +pub use polkadot_primitives; +pub use polkadot_runtime_parachains::{ + dmp, + ump::{MessageId, UmpSink, XcmSink}, +}; +pub use std::{collections::HashMap, thread::LocalKey}; +pub use xcm::{v3::prelude::*, VersionedXcm}; +pub use xcm_executor::XcmExecutor; + +thread_local! { + /// Downward messages, each message is: `(to_para_id, [(relay_block_number, msg)])` + #[allow(clippy::type_complexity)] + pub static DOWNWARD_MESSAGES: RefCell)>)>>> + = RefCell::new(HashMap::new()); + /// Downward messages that already processed by parachains, each message is: `(to_para_id, relay_block_number, Vec)` + #[allow(clippy::type_complexity)] + pub static DMP_DONE: RefCell)>>> + = RefCell::new(HashMap::new()); + /// Horizontal messages, each message is: `(to_para_id, [(from_para_id, relay_block_number, msg)])` + #[allow(clippy::type_complexity)] + pub static HORIZONTAL_MESSAGES: RefCell)>)>>> + = RefCell::new(HashMap::new()); + /// Upward messages, each message is: `(from_para_id, msg) + pub static UPWARD_MESSAGES: RefCell)>>> = RefCell::new(HashMap::new()); + /// Global incremental relay chain block number + pub static RELAY_BLOCK_NUMBER: RefCell> = RefCell::new(HashMap::new()); + /// Parachains Ids a the Network + pub static PARA_IDS: RefCell>> = RefCell::new(HashMap::new()); + /// Flag indicating if global variables have been initialized for a certain Network + pub static INITIALIZED: RefCell> = RefCell::new(HashMap::new()); +} + +pub trait TestExt { + fn build_new_ext(storage: Storage) -> sp_io::TestExternalities; + fn new_ext() -> sp_io::TestExternalities; + fn reset_ext(); + fn execute_with(execute: impl FnOnce() -> R) -> R; + fn ext_wrapper(func: impl FnOnce() -> R) -> R; +} + +pub trait Network { + fn _init(); + fn _para_ids() -> Vec; + fn _relay_block_number() -> u32; + fn _set_relay_block_number(block_number: u32); + fn _process_messages(); + fn _has_unprocessed_messages() -> bool; + fn _process_downward_messages(); + fn _process_horizontal_messages(); + fn _process_upward_messages(); + fn _hrmp_channel_parachain_inherent_data( + para_id: u32, + relay_parent_number: u32, + ) -> ParachainInherentData; +} + +pub trait NetworkComponent { + fn network_name() -> &'static str; + + fn init() { + N::_init(); + } + + fn relay_block_number() -> u32 { + N::_relay_block_number() + } + + fn set_relay_block_number(block_number: u32) { + N::_set_relay_block_number(block_number); + } + + fn para_ids() -> Vec { + N::_para_ids() + } + + fn send_horizontal_messages)>>( + to_para_id: u32, + iter: I, + ) { + HORIZONTAL_MESSAGES.with(|b| { + b.borrow_mut() + .get_mut(Self::network_name()) + .unwrap() + .push_back((to_para_id, iter.collect())) + }); + } + + fn send_upward_message(from_para_id: u32, msg: Vec) { + UPWARD_MESSAGES.with(|b| { + b.borrow_mut() + .get_mut(Self::network_name()) + .unwrap() + .push_back((from_para_id, msg)) + }); + } + + fn send_downward_messages( + to_para_id: u32, + iter: impl Iterator)>, + ) { + DOWNWARD_MESSAGES.with(|b| { + b.borrow_mut() + .get_mut(Self::network_name()) + .unwrap() + .push_back((to_para_id, iter.collect())) + }); + } + + fn hrmp_channel_parachain_inherent_data( + para_id: u32, + relay_parent_number: u32, + ) -> ParachainInherentData { + N::_hrmp_channel_parachain_inherent_data(para_id, relay_parent_number) + } + + fn process_messages() { + N::_process_messages(); + } +} + +pub trait RelayChain: UmpSink { + type Runtime; + type RuntimeOrigin; + type RuntimeCall; + type RuntimeEvent; + type XcmConfig; + type SovereignAccountOf; + type System; + type Balances; +} + +pub trait Parachain: XcmpMessageHandler + DmpMessageHandler { + type Runtime; + type RuntimeOrigin; + type RuntimeCall; + type RuntimeEvent; + type XcmpMessageHandler; + type DmpMessageHandler; + type LocationToAccountId; + type System; + type Balances; + type ParachainSystem; + type ParachainInfo; +} + +// Relay Chain Implementation +#[macro_export] +macro_rules! decl_test_relay_chains { + ( + $( + pub struct $name:ident { + genesis = $genesis:expr, + on_init = $on_init:expr, + runtime = { + Runtime: $($runtime:tt)::*, + RuntimeOrigin: $($runtime_origin:tt)::*, + RuntimeCall: $($runtime_call:tt)::*, + RuntimeEvent: $($runtime_event:tt)::*, + XcmConfig: $($xcm_config:tt)::*, + SovereignAccountOf: $($sovereign_acc_of:tt)::*, + System: $($system:tt)::*, + Balances: $($balances:tt)::*, + }, + pallets_extra = { + $($pallet_name:ident: $pallet_path:path,)* + } + } + ), + + + ) => { + $( + pub struct $name; + + impl RelayChain for $name { + type Runtime = $($runtime)::*; + type RuntimeOrigin = $($runtime_origin)::*; + type RuntimeCall = $($runtime_call)::*; + type RuntimeEvent = $($runtime_event)::*; + type XcmConfig = $($xcm_config)::*; + type SovereignAccountOf = $($sovereign_acc_of)::*; + type System = $($system)::*; + type Balances = $($balances)::*; + } + + $crate::paste::paste! { + pub trait [<$name Pallet>] { + $( + type $pallet_name; + )? + } + + impl [<$name Pallet>] for $name { + $( + type $pallet_name = $pallet_path; + )? + } + } + + $crate::__impl_xcm_handlers_for_relay_chain!($name); + $crate::__impl_test_ext_for_relay_chain!($name, $genesis, $on_init); + )+ + }; +} + +#[macro_export] +macro_rules! __impl_xcm_handlers_for_relay_chain { + ($name:ident) => { + impl $crate::UmpSink for $name { + fn process_upward_message( + origin: $crate::ParaId, + msg: &[u8], + max_weight: $crate::Weight, + ) -> Result<$crate::Weight, ($crate::MessageId, $crate::Weight)> { + use $crate::{TestExt, UmpSink}; + + Self::execute_with(|| { + $crate::XcmSink::< + $crate::XcmExecutor<::XcmConfig>, + ::Runtime, + >::process_upward_message(origin, msg, max_weight) + }) + } + } + }; +} + +#[macro_export] +macro_rules! __impl_test_ext_for_relay_chain { + // entry point: generate ext name + ($name:ident, $genesis:expr, $on_init:expr) => { + $crate::paste::paste! { + $crate::__impl_test_ext_for_relay_chain!(@impl $name, $genesis, $on_init, []); + } + }; + // impl + (@impl $name:ident, $genesis:expr, $on_init:expr, $ext_name:ident) => { + thread_local! { + pub static $ext_name: $crate::RefCell<$crate::TestExternalities> + = $crate::RefCell::new(<$name>::build_new_ext($genesis)); + } + + impl TestExt for $name { + fn build_new_ext(storage: $crate::Storage) -> $crate::TestExternalities { + let mut ext = sp_io::TestExternalities::new(storage); + ext.execute_with(|| { + #[allow(clippy::no_effect)] + $on_init; + sp_tracing::try_init_simple(); + ::System::set_block_number(1); + }); + ext + } + + fn new_ext() -> $crate::TestExternalities { + <$name>::build_new_ext($genesis) + } + + fn reset_ext() { + $ext_name.with(|v| *v.borrow_mut() = <$name>::build_new_ext($genesis)); + } + + fn execute_with(execute: impl FnOnce() -> R) -> R { + use $crate::{NetworkComponent}; + // Make sure the Network is initialized + <$name>::init(); + + let r = $ext_name.with(|v| v.borrow_mut().execute_with(execute)); + + // send messages if needed + $ext_name.with(|v| { + v.borrow_mut().execute_with(|| { + use $crate::polkadot_primitives::runtime_api::runtime_decl_for_parachain_host::ParachainHostV4; + + //TODO: mark sent count & filter out sent msg + for para_id in <$name>::para_ids() { + // downward messages + let downward_messages = ::Runtime::dmq_contents(para_id.into()) + .into_iter() + .map(|inbound| (inbound.sent_at, inbound.msg)); + if downward_messages.len() == 0 { + continue; + } + <$name>::send_downward_messages(para_id, downward_messages.into_iter()); + + // Note: no need to handle horizontal messages, as the + // simulator directly sends them to dest (not relayed). + } + }) + }); + + <$name>::process_messages(); + + r + } + + fn ext_wrapper(func: impl FnOnce() -> R) -> R { + $ext_name.with(|v| { + v.borrow_mut().execute_with(|| { + func() + }) + }) + } + } + }; +} + +#[macro_export] +macro_rules! __impl_relay { + ($network_name:ident, $relay_chain:ty) => { + impl $crate::NetworkComponent<$network_name> for $relay_chain { + fn network_name() -> &'static str { + stringify!($network_name) + } + } + + impl $relay_chain { + pub fn child_location_of(id: $crate::ParaId) -> MultiLocation { + (Ancestor(0), Parachain(id.into())).into() + } + + pub fn account_id_of(seed: &str) -> $crate::AccountId { + $crate::get_account_id_from_seed::(seed) + } + + pub fn account_data_of(account: AccountId) -> $crate::AccountData { + Self::ext_wrapper(|| ::System::account(account).data) + } + + pub fn sovereign_account_id_of(location: $crate::MultiLocation) -> $crate::AccountId { + ::SovereignAccountOf::convert(location.into()).unwrap() + } + + pub fn fund_accounts(accounts: Vec<(AccountId, Balance)>) { + Self::ext_wrapper(|| { + for account in accounts { + let _ = ::Balances::force_set_balance( + ::RuntimeOrigin::root(), + account.0.into(), + account.1.into(), + ); + } + }); + } + + pub fn events() -> Vec<::RuntimeEvent> { + ::System::events() + .iter() + .map(|record| record.event.clone()) + .collect() + } + } + }; +} + +// Parachain Implementation +#[macro_export] +macro_rules! decl_test_parachains { + ( + $( + pub struct $name:ident { + genesis = $genesis:expr, + on_init = $on_init:expr, + runtime = { + Runtime: $runtime:path, + RuntimeOrigin: $runtime_origin:path, + RuntimeCall: $runtime_call:path, + RuntimeEvent: $runtime_event:path, + XcmpMessageHandler: $xcmp_message_handler:path, + DmpMessageHandler: $dmp_message_handler:path, + LocationToAccountId: $location_to_account:path, + System: $system:path, + Balances: $balances_pallet:path, + ParachainSystem: $parachain_system:path, + ParachainInfo: $parachain_info:path, + }, + pallets_extra = { + $($pallet_name:ident: $pallet_path:path,)* + } + } + ), + + + ) => { + $( + pub struct $name; + + impl Parachain for $name { + type Runtime = $runtime; + type RuntimeOrigin = $runtime_origin; + type RuntimeCall = $runtime_call; + type RuntimeEvent = $runtime_event; + type XcmpMessageHandler = $xcmp_message_handler; + type DmpMessageHandler = $dmp_message_handler; + type LocationToAccountId = $location_to_account; + type System = $system; + type Balances = $balances_pallet; + type ParachainSystem = $parachain_system; + type ParachainInfo = $parachain_info; + } + + $crate::paste::paste! { + pub trait [<$name Pallet>] { + $( + type $pallet_name; + )* + } + + impl [<$name Pallet>] for $name { + $( + type $pallet_name = $pallet_path; + )* + } + } + + $crate::__impl_xcm_handlers_for_parachain!($name); + $crate::__impl_test_ext_for_parachain!($name, $genesis, $on_init); + )+ + }; +} + +#[macro_export] +macro_rules! __impl_xcm_handlers_for_parachain { + ($name:ident) => { + impl $crate::XcmpMessageHandler for $name { + fn handle_xcmp_messages< + 'a, + I: Iterator, + >( + iter: I, + max_weight: $crate::Weight, + ) -> $crate::Weight { + use $crate::{TestExt, XcmpMessageHandler}; + + $name::execute_with(|| { + ::XcmpMessageHandler::handle_xcmp_messages(iter, max_weight) + }) + } + } + + impl $crate::DmpMessageHandler for $name { + fn handle_dmp_messages( + iter: impl Iterator)>, + max_weight: $crate::Weight, + ) -> $crate::Weight { + use $crate::{DmpMessageHandler, TestExt}; + + $name::execute_with(|| { + ::DmpMessageHandler::handle_dmp_messages(iter, max_weight) + }) + } + } + }; +} + +#[macro_export] +macro_rules! __impl_test_ext_for_parachain { + // entry point: generate ext name + ($name:ident, $genesis:expr, $on_init:expr) => { + $crate::paste::paste! { + $crate::__impl_test_ext_for_parachain!(@impl $name, $genesis, $on_init, []); + } + }; + // impl + (@impl $name:ident, $genesis:expr, $on_init:expr, $ext_name:ident) => { + thread_local! { + pub static $ext_name: $crate::RefCell<$crate::TestExternalities> + = $crate::RefCell::new(<$name>::build_new_ext($genesis)); + } + + impl TestExt for $name { + fn build_new_ext(storage: $crate::Storage) -> $crate::TestExternalities { + let mut ext = sp_io::TestExternalities::new(storage); + ext.execute_with(|| { + #[allow(clippy::no_effect)] + $on_init; + sp_tracing::try_init_simple(); + ::System::set_block_number(1); + }); + ext + } + + fn new_ext() -> $crate::TestExternalities { + <$name>::build_new_ext($genesis) + } + + fn reset_ext() { + $ext_name.with(|v| *v.borrow_mut() = <$name>::build_new_ext($genesis)); + } + + fn execute_with(execute: impl FnOnce() -> R) -> R { + use $crate::{Get, Hooks, NetworkComponent}; + + // Make sure the Network is initialized + <$name>::init(); + + let mut relay_block_number = <$name>::relay_block_number(); + relay_block_number += 1; + <$name>::set_relay_block_number(relay_block_number); + + let para_id = <$name>::para_id().into(); + + $ext_name.with(|v| { + v.borrow_mut().execute_with(|| { + // Make sure it has been recorded properly + let relay_block_number = <$name>::relay_block_number(); + let _ = ::ParachainSystem::set_validation_data( + ::RuntimeOrigin::none(), + <$name>::hrmp_channel_parachain_inherent_data(para_id, relay_block_number), + ); + }) + }); + + + let r = $ext_name.with(|v| v.borrow_mut().execute_with(execute)); + + // send messages if needed + $ext_name.with(|v| { + v.borrow_mut().execute_with(|| { + use sp_runtime::traits::Header as HeaderT; + + let block_number = ::System::block_number(); + let mock_header = HeaderT::new( + 0, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ); + + // get messages + ::ParachainSystem::on_finalize(block_number); + let collation_info = ::ParachainSystem::collect_collation_info(&mock_header); + + // send upward messages + let relay_block_number = <$name>::relay_block_number(); + for msg in collation_info.upward_messages.clone() { + <$name>::send_upward_message(para_id, msg); + } + + // send horizontal messages + for msg in collation_info.horizontal_messages { + <$name>::send_horizontal_messages( + msg.recipient.into(), + vec![(para_id.into(), relay_block_number, msg.data)].into_iter(), + ); + } + + // clean messages + ::ParachainSystem::on_initialize(block_number); + }) + }); + + <$name>::process_messages(); + + r + } + + fn ext_wrapper(func: impl FnOnce() -> R) -> R { + $ext_name.with(|v| { + v.borrow_mut().execute_with(|| { + func() + }) + }) + } + } + }; +} + +#[macro_export] +macro_rules! __impl_parachain { + ($network_name:ident, $parachain:ty) => { + impl $crate::NetworkComponent<$network_name> for $parachain { + fn network_name() -> &'static str { + stringify!($network_name) + } + } + + impl $parachain { + pub fn para_id() -> $crate::ParaId { + Self::ext_wrapper(|| ::ParachainInfo::get()) + } + + pub fn parent_location() -> $crate::MultiLocation { + (Parent).into() + } + + pub fn account_id_of(seed: &str) -> $crate::AccountId { + $crate::get_account_id_from_seed::(seed) + } + + pub fn account_data_of(account: AccountId) -> $crate::AccountData { + Self::ext_wrapper(|| ::System::account(account).data) + } + + pub fn sovereign_account_id_of(location: $crate::MultiLocation) -> $crate::AccountId { + ::LocationToAccountId::convert(location.into()).unwrap() + } + + pub fn fund_accounts(accounts: Vec<(AccountId, Balance)>) { + Self::ext_wrapper(|| { + for account in accounts { + let _ = ::Balances::force_set_balance( + ::RuntimeOrigin::root(), + account.0.into(), + account.1.into(), + ); + } + }); + } + + pub fn events() -> Vec<::RuntimeEvent> { + ::System::events() + .iter() + .map(|record| record.event.clone()) + .collect() + } + + fn prepare_for_xcmp() { + use $crate::NetworkComponent; + let para_id = Self::para_id(); + + ::ext_wrapper(|| { + use $crate::{Get, Hooks}; + + let block_number = ::System::block_number(); + + let _ = ::ParachainSystem::set_validation_data( + ::RuntimeOrigin::none(), + Self::hrmp_channel_parachain_inherent_data(para_id.into(), 1), + ); + // set `AnnouncedHrmpMessagesPerCandidate` + ::ParachainSystem::on_initialize(block_number); + }); + } + } + }; +} + +// Network Implementation +#[macro_export] +macro_rules! decl_test_networks { + ( + $( + pub struct $name:ident { + relay_chain = $relay_chain:ty, + parachains = vec![ $( $parachain:ty, )* ], + } + ), + + + ) => { + $( + pub struct $name; + + impl $name { + pub fn reset() { + use $crate::{TestExt, VecDeque}; + + $crate::INITIALIZED.with(|b| b.borrow_mut().remove(stringify!($name))); + $crate::DOWNWARD_MESSAGES.with(|b| b.borrow_mut().remove(stringify!($name))); + $crate::DMP_DONE.with(|b| b.borrow_mut().remove(stringify!($name))); + $crate::UPWARD_MESSAGES.with(|b| b.borrow_mut().remove(stringify!($name))); + $crate::HORIZONTAL_MESSAGES.with(|b| b.borrow_mut().remove(stringify!($name))); + $crate::RELAY_BLOCK_NUMBER.with(|b| b.borrow_mut().remove(stringify!($name))); + + <$relay_chain>::reset_ext(); + $( <$parachain>::reset_ext(); )* + $( <$parachain>::prepare_for_xcmp(); )* + } + } + + impl $crate::Network for $name { + fn _init() { + // If Network has not been itialized yet, it gets initialized + if $crate::INITIALIZED.with(|b| b.borrow_mut().get(stringify!($name)).is_none()) { + $crate::INITIALIZED.with(|b| b.borrow_mut().insert(stringify!($name).to_string(), true)); + $crate::DOWNWARD_MESSAGES.with(|b| b.borrow_mut().insert(stringify!($name).to_string(), $crate::VecDeque::new())); + $crate::DMP_DONE.with(|b| b.borrow_mut().insert(stringify!($name).to_string(), $crate::VecDeque::new())); + $crate::UPWARD_MESSAGES.with(|b| b.borrow_mut().insert(stringify!($name).to_string(), $crate::VecDeque::new())); + $crate::HORIZONTAL_MESSAGES.with(|b| b.borrow_mut().insert(stringify!($name).to_string(), $crate::VecDeque::new())); + $crate::RELAY_BLOCK_NUMBER.with(|b| b.borrow_mut().insert(stringify!($name).to_string(), 1)); + $crate::PARA_IDS.with(|b| b.borrow_mut().insert(stringify!($name).to_string(), Self::_para_ids())); + } + } + + fn _para_ids() -> Vec { + vec![$( + <$parachain>::para_id().into(), + )*] + } + + fn _relay_block_number() -> u32 { + $crate::RELAY_BLOCK_NUMBER.with(|v| *v.clone().borrow().get(stringify!($name)).unwrap()) + } + + fn _set_relay_block_number(block_number: u32) { + $crate::RELAY_BLOCK_NUMBER.with(|v| v.borrow_mut().insert(stringify!($name).to_string(), block_number)); + } + + fn _process_messages() { + while Self::_has_unprocessed_messages() { + Self::_process_upward_messages(); + Self::_process_horizontal_messages(); + Self::_process_downward_messages(); + } + } + + fn _has_unprocessed_messages() -> bool { + $crate::DOWNWARD_MESSAGES.with(|b| !b.borrow_mut().get_mut(stringify!($name)).unwrap().is_empty()) + || $crate::HORIZONTAL_MESSAGES.with(|b| !b.borrow_mut().get_mut(stringify!($name)).unwrap().is_empty()) + || $crate::UPWARD_MESSAGES.with(|b| !b.borrow_mut().get_mut(stringify!($name)).unwrap().is_empty()) + } + + fn _process_downward_messages() { + use $crate::{DmpMessageHandler, Bounded}; + use polkadot_parachain::primitives::RelayChainBlockNumber; + + while let Some((to_para_id, messages)) + = $crate::DOWNWARD_MESSAGES.with(|b| b.borrow_mut().get_mut(stringify!($name)).unwrap().pop_front()) { + $( + if $crate::PARA_IDS.with(|b| b.borrow_mut().get_mut(stringify!($name)).unwrap().contains(&to_para_id)) { + let mut msg_dedup: Vec<(RelayChainBlockNumber, Vec)> = Vec::new(); + for m in &messages { + msg_dedup.push((m.0, m.1.clone())); + } + msg_dedup.dedup(); + + let msgs = msg_dedup.clone().into_iter().filter(|m| { + !$crate::DMP_DONE.with(|b| b.borrow_mut().get_mut(stringify!($name)).unwrap_or(&mut $crate::VecDeque::new()).contains(&(to_para_id, m.0, m.1.clone()))) + }).collect::)>>(); + if msgs.len() != 0 { + <$parachain>::handle_dmp_messages(msgs.clone().into_iter(), $crate::Weight::max_value()); + for m in msgs { + $crate::DMP_DONE.with(|b| b.borrow_mut().get_mut(stringify!($name)).unwrap().push_back((to_para_id, m.0, m.1))); + } + } + } else { + unreachable!(); + } + )* + } + } + + fn _process_horizontal_messages() { + use $crate::{XcmpMessageHandler, Bounded}; + + while let Some((to_para_id, messages)) + = $crate::HORIZONTAL_MESSAGES.with(|b| b.borrow_mut().get_mut(stringify!($name)).unwrap().pop_front()) { + let iter = messages.iter().map(|(p, b, m)| (*p, *b, &m[..])).collect::>().into_iter(); + $( + if $crate::PARA_IDS.with(|b| b.borrow_mut().get_mut(stringify!($name)).unwrap().contains(&to_para_id)) { + <$parachain>::handle_xcmp_messages(iter.clone(), $crate::Weight::max_value()); + } + )* + } + } + + fn _process_upward_messages() { + use $crate::{UmpSink, Bounded}; + while let Some((from_para_id, msg)) = $crate::UPWARD_MESSAGES.with(|b| b.borrow_mut().get_mut(stringify!($name)).unwrap().pop_front()) { + let _ = <$relay_chain>::process_upward_message( + from_para_id.into(), + &msg[..], + $crate::Weight::max_value(), + ); + } + } + + fn _hrmp_channel_parachain_inherent_data( + para_id: u32, + relay_parent_number: u32, + ) -> $crate::ParachainInherentData { + use $crate::cumulus_primitives_core::{relay_chain::HrmpChannelId, AbridgedHrmpChannel}; + + let mut sproof = $crate::RelayStateSproofBuilder::default(); + sproof.para_id = para_id.into(); + + // egress channel + let e_index = sproof.hrmp_egress_channel_index.get_or_insert_with(Vec::new); + for recipient_para_id in $crate::PARA_IDS.with(|b| b.borrow_mut().get_mut(stringify!($name)).unwrap().clone()) { + let recipient_para_id = $crate::ParaId::from(recipient_para_id); + if let Err(idx) = e_index.binary_search(&recipient_para_id) { + e_index.insert(idx, recipient_para_id); + } + + sproof + .hrmp_channels + .entry(HrmpChannelId { + sender: sproof.para_id, + recipient: recipient_para_id, + }) + .or_insert_with(|| AbridgedHrmpChannel { + max_capacity: 1024, + max_total_size: 1024 * 1024, + max_message_size: 1024 * 1024, + msg_count: 0, + total_size: 0, + mqc_head: Option::None, + }); + } + + let (relay_storage_root, proof) = sproof.into_state_root_and_proof(); + + $crate::ParachainInherentData { + validation_data: $crate::PersistedValidationData { + parent_head: Default::default(), + relay_parent_number, + relay_parent_storage_root: relay_storage_root, + max_pov_size: Default::default(), + }, + relay_chain_state: proof, + downward_messages: Default::default(), + horizontal_messages: Default::default(), + } + } + } + + $crate::__impl_relay!($name, $relay_chain); + + $( + $crate::__impl_parachain!($name, $parachain); + )* + )+ + }; +} + +#[macro_export] +macro_rules! assert_expected_events { + ( $chain:ident, vec![$( $event_pat:pat => { $($attr:ident : $condition:expr, )* }, )*] ) => { + let mut message: Vec = Vec::new(); + $( + let mut meet_conditions = true; + let mut event_message: Vec = Vec::new(); + + let event_received = <$chain>::events().iter().any(|event| { + $crate::log::debug!(target: format!("events::{}", stringify!($chain)).to_lowercase().as_str(), "{:?}", event); + + match event { + $event_pat => { + $( + if !$condition { + event_message.push(format!(" - The attribute {:?} = {:?} did not met the condition {:?}\n", stringify!($attr), $attr, stringify!($condition))); + meet_conditions &= $condition + } + )* + true + }, + _ => false + } + }); + + if event_received && !meet_conditions { + message.push(format!("\n\nEvent \x1b[31m{}\x1b[0m was received but some of its attributes did not meet the conditions:\n{}", stringify!($event_pat), event_message.concat())); + } else if !event_received { + message.push(format!("\n\nEvent \x1b[31m{}\x1b[0m was never received", stringify!($event_pat))); + } + )* + if !message.is_empty() { + panic!("{}", message.concat()) + } + } + +} + +#[macro_export] +macro_rules! bx { + ($e:expr) => { + Box::new($e) + }; +} + +pub mod helpers { + use super::Weight; + + pub fn within_threshold(threshold: u64, expected_value: u64, current_value: u64) -> bool { + let margin = (current_value * threshold) / 100; + let lower_limit = expected_value - margin; + let upper_limit = expected_value + margin; + + current_value >= lower_limit && current_value <= upper_limit + } + + pub fn weight_within_threshold( + (threshold_time, threshold_size): (u64, u64), + expected_weight: Weight, + weight: Weight, + ) -> bool { + let ref_time_within = + within_threshold(threshold_time, expected_weight.ref_time(), weight.ref_time()); + let proof_size_within = + within_threshold(threshold_size, expected_weight.proof_size(), weight.proof_size()); + + ref_time_within && proof_size_within + } +} From 8f404009feec574c6668df1a74706680109c3947 Mon Sep 17 00:00:00 2001 From: S E R A Y A Date: Fri, 19 May 2023 20:39:23 +0200 Subject: [PATCH 204/339] Update README.md (#2603) fix broken link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d8c8b204b72..fe6836e03ae 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ A set of tools for writing [Substrate](https://substrate.io/)-based [Polkadot](https://wiki.polkadot.network/en/) [parachains](https://wiki.polkadot.network/docs/en/learn-parachains). Refer to the included [overview](docs/overview.md) for architectural details, and the -[Connect to relay and parachain tutorials](https://docs.substrate.io/tutorials/connect-relay-and-parachains/) for a +[Connect to a relay chain how-to guide](https://docs.substrate.io/reference/how-to-guides/parachains/connect-to-a-relay-chain/) for a guided walk-through of using these tools. It's easy to write blockchains using Substrate, and the overhead of writing parachains' From d090ac06a5f82ebc8220dbf3a1ddaa3ddeb5e518 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Sat, 20 May 2023 12:20:30 +0200 Subject: [PATCH 205/339] Update syn (#2605) Signed-off-by: Oliver Tale-Yazdi --- Cargo.lock | 62 +++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e395209bf46..ce20ee4bdef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -473,7 +473,7 @@ checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -484,7 +484,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -613,7 +613,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -1573,7 +1573,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -2514,7 +2514,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -3470,7 +3470,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -3637,7 +3637,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -3908,7 +3908,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -4024,7 +4024,7 @@ dependencies = [ "proc-macro-warning", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -4036,7 +4036,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -4046,7 +4046,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b03 dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -4215,7 +4215,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -7121,7 +7121,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -7721,7 +7721,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -10092,7 +10092,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ceca8aaf45b5c46ec7ed39fff75f57290368c1846d33d24a122ca81416ab058" dependencies = [ "proc-macro2", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -10167,7 +10167,7 @@ checksum = "0e99670bafb56b9a106419397343bdbc8b8742c3cc449fec6345f86173f47cd4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -11152,7 +11152,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -12129,7 +12129,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -12454,7 +12454,7 @@ checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -12762,7 +12762,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -13004,7 +13004,7 @@ dependencies = [ "proc-macro2", "quote", "sp-core-hashing", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -13023,7 +13023,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b03 dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -13234,7 +13234,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -13420,7 +13420,7 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -13913,7 +13913,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -13961,9 +13961,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" dependencies = [ "proc-macro2", "quote", @@ -14080,7 +14080,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -14260,7 +14260,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -14449,7 +14449,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -16194,7 +16194,7 @@ dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] From 8cb913db529a23c2d378a960470b2c7e9b4ff06a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sun, 21 May 2023 22:23:18 +0200 Subject: [PATCH 206/339] Switch to `relay_dispatch_queue_remaining_capacity` (#2608) * Switch to `relay_dispatch_queue_remaining_capacity` This switches the parachain runtimes to use `relay_dispatch_queue_remaining_capacity` when possible. If the data is not yet available on the relay chain it falls back to `relay_dispatch_queue_size`. It will require that all parachains migrate to `relay_dispatch_queue_remaining_capacity` before we can start removing the call to `relay_dipatch_queue_size`. Besides that the pr adapts the xcm exumulator to make it work with the message queue. * Fix test and use correct types * ".git/.scripts/commands/fmt/fmt.sh" --------- Co-authored-by: command-bot <> --- Cargo.lock | 554 ++++++++++-------- pallets/parachain-system/src/lib.rs | 10 +- .../src/relay_state_snapshot.rs | 54 +- pallets/parachain-system/src/tests.rs | 6 +- .../emulated/common/src/lib.rs | 2 + .../parachain-inherent/src/client_side.rs | 4 + test/relay-sproof-builder/src/lib.rs | 11 +- xcm/xcm-emulator/Cargo.toml | 1 + xcm/xcm-emulator/src/lib.rs | 109 ++-- 9 files changed, 424 insertions(+), 327 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ce20ee4bdef..f100b5b7583 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -580,7 +580,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "hash-db", "log", @@ -3808,7 +3808,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", ] @@ -3831,7 +3831,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-support-procedural", @@ -3856,7 +3856,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3903,7 +3903,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3914,7 +3914,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3931,7 +3931,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-system", @@ -3960,7 +3960,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-recursion", "futures", @@ -3975,12 +3975,13 @@ dependencies = [ "spinners", "substrate-rpc-client", "tokio", + "tokio-retry", ] [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "bitflags", "environmental", @@ -4014,7 +4015,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "Inflector", "cfg-expr", @@ -4030,7 +4031,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4042,7 +4043,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "proc-macro2", "quote", @@ -4052,7 +4053,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "cfg-if", "frame-support", @@ -4071,7 +4072,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -4086,7 +4087,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "sp-api", @@ -4095,7 +4096,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "parity-scale-codec", @@ -5187,7 +5188,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bitvec", "frame-benchmarking", @@ -5220,6 +5221,7 @@ dependencies = [ "pallet-im-online", "pallet-indices", "pallet-membership", + "pallet-message-queue", "pallet-multisig", "pallet-nis", "pallet-nomination-pools", @@ -5285,7 +5287,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "frame-support", "polkadot-primitives", @@ -6167,7 +6169,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "futures", "log", @@ -6186,7 +6188,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "anyhow", "jsonrpsee", @@ -6705,7 +6707,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6726,7 +6728,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -6744,7 +6746,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -6759,7 +6761,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-system", @@ -6775,7 +6777,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-system", @@ -6791,7 +6793,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-system", @@ -6805,7 +6807,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -6829,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6849,7 +6851,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -6864,7 +6866,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-system", @@ -6883,7 +6885,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6907,7 +6909,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7013,7 +7015,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7057,7 +7059,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7074,7 +7076,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "bitflags", "environmental", @@ -7104,7 +7106,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "bitflags", "parity-scale-codec", @@ -7117,7 +7119,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "proc-macro2", "quote", @@ -7127,7 +7129,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7144,7 +7146,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7162,7 +7164,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7185,7 +7187,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7198,7 +7200,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7216,7 +7218,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7234,7 +7236,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#a14236059c2d3da052fb08295082341aa7b87240" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "blake2", "frame-benchmarking", @@ -7252,7 +7254,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7275,7 +7277,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7291,7 +7293,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7311,7 +7313,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7328,7 +7330,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-system", @@ -7342,7 +7344,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7356,10 +7358,29 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-message-queue" +version = "7.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-weights", +] + [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7376,7 +7397,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7392,7 +7413,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7410,7 +7431,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "pallet-nfts", @@ -7421,7 +7442,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7437,7 +7458,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-system", @@ -7454,7 +7475,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7474,7 +7495,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7485,7 +7506,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-system", @@ -7502,7 +7523,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7541,7 +7562,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7558,7 +7579,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7573,7 +7594,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7591,7 +7612,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7606,7 +7627,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7625,7 +7646,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7642,7 +7663,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-system", @@ -7663,7 +7684,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7679,7 +7700,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-system", @@ -7693,7 +7714,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7716,7 +7737,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7727,7 +7748,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "log", "sp-arithmetic", @@ -7736,7 +7757,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "sp-api", @@ -7745,7 +7766,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7762,7 +7783,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7777,7 +7798,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7795,7 +7816,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7814,7 +7835,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-support", "frame-system", @@ -7830,7 +7851,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7846,7 +7867,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7858,7 +7879,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7875,7 +7896,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7890,7 +7911,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7906,7 +7927,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7921,7 +7942,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7936,7 +7957,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7957,7 +7978,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "frame-benchmarking", "frame-support", @@ -8568,7 +8589,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8584,7 +8605,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8598,7 +8619,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "derive_more", "fatality", @@ -8621,7 +8642,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "fatality", "futures", @@ -8642,7 +8663,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8671,7 +8692,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "async-trait", "frame-benchmarking", @@ -8714,7 +8735,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "always-assert", "bitvec", @@ -8736,7 +8757,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "parity-scale-codec", "scale-info", @@ -8748,7 +8769,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "derive_more", "fatality", @@ -8773,7 +8794,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8787,7 +8808,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "futures", "futures-timer", @@ -8807,7 +8828,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "always-assert", "async-trait", @@ -8830,7 +8851,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "futures", "parity-scale-codec", @@ -8848,7 +8869,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bitvec", "derive_more", @@ -8877,7 +8898,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bitvec", "futures", @@ -8898,7 +8919,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bitvec", "fatality", @@ -8917,7 +8938,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8932,7 +8953,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "async-trait", "futures", @@ -8952,7 +8973,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "futures", "polkadot-node-metrics", @@ -8967,7 +8988,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "futures", "futures-timer", @@ -8984,7 +9005,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "fatality", "futures", @@ -9003,7 +9024,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "async-trait", "futures", @@ -9020,7 +9041,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bitvec", "fatality", @@ -9038,7 +9059,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "always-assert", "futures", @@ -9065,7 +9086,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "futures", "polkadot-node-primitives", @@ -9081,7 +9102,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "assert_matches", "cpu-time", @@ -9110,7 +9131,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "futures", "lru 0.9.0", @@ -9125,7 +9146,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "lazy_static", "log", @@ -9143,7 +9164,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bs58", "futures", @@ -9162,7 +9183,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "async-trait", "derive_more", @@ -9184,7 +9205,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bounded-vec", "futures", @@ -9206,7 +9227,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9216,7 +9237,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "async-trait", "futures", @@ -9234,7 +9255,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "async-trait", "derive_more", @@ -9257,7 +9278,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "async-trait", "derive_more", @@ -9290,7 +9311,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "async-trait", "futures", @@ -9313,7 +9334,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bounded-collections", "derive_more", @@ -9412,7 +9433,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9430,7 +9451,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9456,7 +9477,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9488,7 +9509,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bitvec", "frame-benchmarking", @@ -9520,6 +9541,7 @@ dependencies = [ "pallet-im-online", "pallet-indices", "pallet-membership", + "pallet-message-queue", "pallet-multisig", "pallet-nomination-pools", "pallet-nomination-pools-benchmarking", @@ -9582,7 +9604,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bitvec", "frame-benchmarking", @@ -9628,7 +9650,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "frame-support", "polkadot-primitives", @@ -9642,7 +9664,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bs58", "parity-scale-codec", @@ -9654,7 +9676,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bitflags", "bitvec", @@ -9667,6 +9689,7 @@ dependencies = [ "pallet-authorship", "pallet-babe", "pallet-balances", + "pallet-message-queue", "pallet-session", "pallet-staking", "pallet-timestamp", @@ -9698,7 +9721,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9808,7 +9831,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9829,7 +9852,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9839,7 +9862,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9864,7 +9887,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9925,7 +9948,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "frame-benchmarking", "frame-system", @@ -10717,7 +10740,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10745,6 +10768,7 @@ dependencies = [ "pallet-im-online", "pallet-indices", "pallet-membership", + "pallet-message-queue", "pallet-mmr", "pallet-multisig", "pallet-nis", @@ -10803,7 +10827,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "frame-support", "polkadot-primitives", @@ -11050,7 +11074,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "log", "sp-core", @@ -11061,7 +11085,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "futures", @@ -11090,7 +11114,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "futures", "futures-timer", @@ -11113,7 +11137,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11128,7 +11152,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11147,7 +11171,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11158,7 +11182,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11198,7 +11222,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "fnv", "futures", @@ -11225,7 +11249,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "hash-db", "kvdb", @@ -11251,7 +11275,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "futures", @@ -11276,7 +11300,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "futures", @@ -11305,7 +11329,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "fork-tree", @@ -11341,7 +11365,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "futures", "jsonrpsee", @@ -11363,7 +11387,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11398,7 +11422,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "futures", "jsonrpsee", @@ -11417,7 +11441,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11430,7 +11454,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11470,7 +11494,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "finality-grandpa", "futures", @@ -11490,7 +11514,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "futures", @@ -11513,7 +11537,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11537,7 +11561,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11550,7 +11574,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "log", "sc-allocator", @@ -11563,7 +11587,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "anyhow", "cfg-if", @@ -11581,7 +11605,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "ansi_term", "futures", @@ -11597,7 +11621,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11611,7 +11635,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11656,7 +11680,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "cid", "futures", @@ -11676,7 +11700,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11704,7 +11728,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "ahash 0.8.2", "futures", @@ -11723,7 +11747,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11745,7 +11769,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11779,7 +11803,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11799,7 +11823,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11830,7 +11854,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "futures", "libp2p-identity", @@ -11843,7 +11867,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11852,7 +11876,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "futures", "jsonrpsee", @@ -11883,7 +11907,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11902,7 +11926,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "http", "jsonrpsee", @@ -11917,7 +11941,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11943,7 +11967,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "directories", @@ -12009,7 +12033,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "log", "parity-scale-codec", @@ -12020,7 +12044,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "clap 4.2.7", "fs4", @@ -12036,7 +12060,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12055,7 +12079,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "futures", "libc", @@ -12074,7 +12098,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "chrono", "futures", @@ -12093,7 +12117,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "ansi_term", "atty", @@ -12124,7 +12148,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12135,7 +12159,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "futures", @@ -12162,7 +12186,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "futures", @@ -12176,7 +12200,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-channel", "futures", @@ -12657,7 +12681,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "enumn", "parity-scale-codec", @@ -12734,7 +12758,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "hash-db", "log", @@ -12754,7 +12778,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "Inflector", "blake2", @@ -12768,7 +12792,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "scale-info", @@ -12781,7 +12805,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "integer-sqrt", "num-traits", @@ -12795,7 +12819,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "scale-info", @@ -12808,7 +12832,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "sp-api", @@ -12820,7 +12844,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "futures", "log", @@ -12838,7 +12862,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "futures", @@ -12853,7 +12877,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "parity-scale-codec", @@ -12871,7 +12895,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "parity-scale-codec", @@ -12892,7 +12916,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12911,7 +12935,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "finality-grandpa", "log", @@ -12929,7 +12953,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "scale-info", @@ -12941,7 +12965,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12985,7 +13009,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "blake2b_simd", "byteorder", @@ -12999,7 +13023,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "proc-macro2", "quote", @@ -13010,7 +13034,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13019,7 +13043,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "proc-macro2", "quote", @@ -13029,7 +13053,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "environmental", "parity-scale-codec", @@ -13040,7 +13064,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13055,7 +13079,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "bytes", "ed25519", @@ -13081,7 +13105,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "lazy_static", "sp-core", @@ -13092,7 +13116,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "futures", "parity-scale-codec", @@ -13106,7 +13130,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13115,7 +13139,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13126,7 +13150,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13144,7 +13168,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "scale-info", @@ -13158,7 +13182,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "sp-api", "sp-core", @@ -13168,7 +13192,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "backtrace", "lazy_static", @@ -13178,7 +13202,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "rustc-hash", "serde", @@ -13188,7 +13212,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "either", "hash256-std-hasher", @@ -13210,7 +13234,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13228,7 +13252,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "Inflector", "proc-macro-crate", @@ -13240,7 +13264,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "scale-info", @@ -13254,7 +13278,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "scale-info", @@ -13267,7 +13291,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "hash-db", "log", @@ -13287,7 +13311,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "log", "parity-scale-codec", @@ -13305,12 +13329,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13323,7 +13347,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "futures-timer", @@ -13338,7 +13362,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "sp-std", @@ -13350,7 +13374,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "sp-api", "sp-runtime", @@ -13359,7 +13383,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "log", @@ -13375,7 +13399,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13398,7 +13422,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13415,7 +13439,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13426,7 +13450,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13440,7 +13464,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "parity-scale-codec", "scale-info", @@ -13801,7 +13825,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "platforms 2.0.0", ] @@ -13809,7 +13833,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13828,7 +13852,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "hyper", "log", @@ -13840,7 +13864,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "jsonrpsee", @@ -13853,7 +13877,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "jsonrpsee", "log", @@ -13872,7 +13896,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13898,7 +13922,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13908,7 +13932,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3919ca88d1dd0b06f26bd80fd0066a1ad7187081" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13919,7 +13943,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "ansi_term", "build-helper", @@ -14046,7 +14070,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "frame-support", "polkadot-primitives", @@ -14263,6 +14287,17 @@ dependencies = [ "syn 2.0.16", ] +[[package]] +name = "tokio-retry" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f" +dependencies = [ + "pin-project", + "rand 0.8.5", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.23.2" @@ -14432,7 +14467,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14443,7 +14478,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14573,7 +14608,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#1b8ad0303b039b6f958ca3e52e84befb2bb44ad2" +source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" dependencies = [ "async-trait", "clap 4.2.7", @@ -15506,7 +15541,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bitvec", "frame-benchmarking", @@ -15535,6 +15570,7 @@ dependencies = [ "pallet-im-online", "pallet-indices", "pallet-membership", + "pallet-message-queue", "pallet-multisig", "pallet-nomination-pools", "pallet-nomination-pools-benchmarking", @@ -15598,7 +15634,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "frame-support", "polkadot-primitives", @@ -16100,7 +16136,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "bounded-collections", "derivative", @@ -16116,7 +16152,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "frame-support", "frame-system", @@ -16130,6 +16166,7 @@ dependencies = [ "sp-io", "sp-runtime", "sp-std", + "sp-weights", "xcm", "xcm-executor", ] @@ -16150,6 +16187,7 @@ dependencies = [ "frame-system", "log", "pallet-balances", + "pallet-message-queue", "parachain-info", "parachains-common", "parity-scale-codec", @@ -16169,7 +16207,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "environmental", "frame-benchmarking", @@ -16189,7 +16227,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e260da4ddad8cbd76999c23a93580167d60d81e4" +source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" dependencies = [ "Inflector", "proc-macro2", diff --git a/pallets/parachain-system/src/lib.rs b/pallets/parachain-system/src/lib.rs index b841820acfc..5f7e1501570 100644 --- a/pallets/parachain-system/src/lib.rs +++ b/pallets/parachain-system/src/lib.rs @@ -233,13 +233,13 @@ pub mod pallet { }; >::mutate(|up| { - let (count, size) = relevant_messaging_state.relay_dispatch_queue_size; + let queue_size = relevant_messaging_state.relay_dispatch_queue_size; let available_capacity = cmp::min( - host_config.max_upward_queue_count.saturating_sub(count), - host_config.max_upward_message_num_per_candidate, + queue_size.remaining_count, + host_config.max_upward_message_num_per_candidate.into(), ); - let available_size = host_config.max_upward_queue_size.saturating_sub(size); + let available_size = queue_size.remaining_size; // Count the number of messages we can possibly fit in the given constraints, i.e. // available_capacity and available_size. @@ -431,7 +431,7 @@ pub mod pallet { .read_abridged_host_configuration() .expect("Invalid host configuration in relay chain state proof"); let relevant_messaging_state = relay_state_proof - .read_messaging_state_snapshot() + .read_messaging_state_snapshot(&host_config) .expect("Invalid messaging state in relay chain state proof"); >::put(&vfp); diff --git a/pallets/parachain-system/src/relay_state_snapshot.rs b/pallets/parachain-system/src/relay_state_snapshot.rs index 0a6426a8012..e3763549d44 100644 --- a/pallets/parachain-system/src/relay_state_snapshot.rs +++ b/pallets/parachain-system/src/relay_state_snapshot.rs @@ -24,6 +24,17 @@ use sp_state_machine::{Backend, TrieBackend, TrieBackendBuilder}; use sp_std::vec::Vec; use sp_trie::{HashDBT, MemoryDB, StorageProof, EMPTY_PREFIX}; +/// The capacity of the upward message queue of a parachain on the relay chain. +// The field order should stay the same as the data can be found in the proof to ensure both are +// have the same encoded representation. +#[derive(Clone, Encode, Decode, TypeInfo, Default)] +pub struct RelayDispachQueueSize { + /// The number of additional messages that can be enqueued. + pub remaining_count: u32, + /// The total size of additional messages that can be enqueued. + pub remaining_size: u32, +} + /// A snapshot of some messaging related state of relay chain pertaining to the current parachain. /// /// This data is essential for making sure that the parachain is aware of current resource use on @@ -37,10 +48,7 @@ pub struct MessagingStateSnapshot { pub dmq_mqc_head: relay_chain::Hash, /// The current capacity of the upward message queue of the current parachain on the relay chain. - /// - /// The capacity is represented by a tuple that consist of the `count` of the messages and the - /// `total_size` expressed as the sum of byte sizes of all messages in the queue. - pub relay_dispatch_queue_size: (u32, u32), + pub relay_dispatch_queue_size: RelayDispachQueueSize, /// Information about all the inbound HRMP channels. /// @@ -164,7 +172,10 @@ impl RelayChainStateProof { /// Read the [`MessagingStateSnapshot`] from the relay chain state proof. /// /// Returns an error if anything failed at reading or decoding. - pub fn read_messaging_state_snapshot(&self) -> Result { + pub fn read_messaging_state_snapshot( + &self, + host_config: &AbridgedHostConfiguration, + ) -> Result { let dmq_mqc_head: relay_chain::Hash = read_entry( &self.trie_backend, &relay_chain::well_known_keys::dmq_mqc_head(self.para_id), @@ -172,12 +183,35 @@ impl RelayChainStateProof { ) .map_err(Error::DmqMqcHead)?; - let relay_dispatch_queue_size: (u32, u32) = read_entry( + let relay_dispatch_queue_size = read_optional_entry::( &self.trie_backend, - &relay_chain::well_known_keys::relay_dispatch_queue_size(self.para_id), - Some((0, 0)), - ) - .map_err(Error::RelayDispatchQueueSize)?; + &relay_chain::well_known_keys::relay_dispatch_queue_remaining_capacity(self.para_id) + .key, + ); + + // TODO paritytech/polkadot#6283: Remove all usages of `relay_dispatch_queue_size` + // + // When the relay chain and all parachains support `relay_dispatch_queue_remaining_capacity`, + // this code here needs to be removed and above needs to be changed to `read_entry` that + // returns an error if `relay_dispatch_queue_remaining_capacity` can not be found/decoded. + // + // For now we just fallback to the old dispatch queue size if there is an error. + let relay_dispatch_queue_size = match relay_dispatch_queue_size { + Ok(Some(r)) => r, + _ => { + let res = read_entry::<(u32, u32), _>( + &self.trie_backend, + #[allow(deprecated)] + &relay_chain::well_known_keys::relay_dispatch_queue_size(self.para_id), + Some((0, 0)), + ) + .map_err(Error::RelayDispatchQueueSize)?; + + let remaining_count = host_config.max_upward_queue_count.saturating_sub(res.0); + let remaining_size = host_config.max_upward_queue_size.saturating_sub(res.1); + RelayDispachQueueSize { remaining_count, remaining_size } + }, + }; let ingress_channel_index: Vec = read_entry( &self.trie_backend, diff --git a/pallets/parachain-system/src/tests.rs b/pallets/parachain-system/src/tests.rs index cfbe834983c..d1dd6a83736 100755 --- a/pallets/parachain-system/src/tests.rs +++ b/pallets/parachain-system/src/tests.rs @@ -513,7 +513,7 @@ fn send_upward_message_num_per_candidate() { BlockTests::new() .with_relay_sproof_builder(|_, _, sproof| { sproof.host_config.max_upward_message_num_per_candidate = 1; - sproof.relay_dispatch_queue_size = None; + sproof.relay_dispatch_queue_remaining_capacity = None; }) .add_with_post_test( 1, @@ -544,8 +544,8 @@ fn send_upward_message_relay_bottleneck() { sproof.host_config.max_upward_queue_count = 5; match relay_block_num { - 1 => sproof.relay_dispatch_queue_size = Some((5, 0)), - 2 => sproof.relay_dispatch_queue_size = Some((4, 0)), + 1 => sproof.relay_dispatch_queue_remaining_capacity = Some((0, 2048)), + 2 => sproof.relay_dispatch_queue_remaining_capacity = Some((1, 2048)), _ => unreachable!(), } }) diff --git a/parachains/integration-tests/emulated/common/src/lib.rs b/parachains/integration-tests/emulated/common/src/lib.rs index 0d0928998a0..e2587e9bf02 100644 --- a/parachains/integration-tests/emulated/common/src/lib.rs +++ b/parachains/integration-tests/emulated/common/src/lib.rs @@ -24,6 +24,7 @@ decl_test_relay_chains! { RuntimeOrigin: polkadot_runtime::RuntimeOrigin, RuntimeCall: polkadot_runtime::RuntimeCall, RuntimeEvent: polkadot_runtime::RuntimeEvent, + MessageQueue: polkadot_runtime::MessageQueue, XcmConfig: polkadot_runtime::xcm_config::XcmConfig, SovereignAccountOf: polkadot_runtime::xcm_config::SovereignAccountOf, System: polkadot_runtime::System, @@ -41,6 +42,7 @@ decl_test_relay_chains! { RuntimeOrigin: kusama_runtime::RuntimeOrigin, RuntimeCall: polkadot_runtime::RuntimeCall, RuntimeEvent: kusama_runtime::RuntimeEvent, + MessageQueue: polkadot_runtime::MessageQueue, XcmConfig: kusama_runtime::xcm_config::XcmConfig, SovereignAccountOf: kusama_runtime::xcm_config::SovereignAccountOf, System: kusama_runtime::System, diff --git a/primitives/parachain-inherent/src/client_side.rs b/primitives/parachain-inherent/src/client_side.rs index 1a1506dcbbd..03ca3203dc0 100644 --- a/primitives/parachain-inherent/src/client_side.rs +++ b/primitives/parachain-inherent/src/client_side.rs @@ -99,7 +99,11 @@ async fn collect_relay_storage_proof( relay_well_known_keys::CURRENT_SLOT.to_vec(), relay_well_known_keys::ACTIVE_CONFIG.to_vec(), relay_well_known_keys::dmq_mqc_head(para_id), + // TODO paritytech/polkadot#6283: Remove all usages of `relay_dispatch_queue_size` + // We need to keep this here until all parachains have migrated to `relay_dispatch_queue_remaining_capacity`. + #[allow(deprecated)] relay_well_known_keys::relay_dispatch_queue_size(para_id), + relay_well_known_keys::relay_dispatch_queue_remaining_capacity(para_id).key, relay_well_known_keys::hrmp_ingress_channel_index(para_id), relay_well_known_keys::hrmp_egress_channel_index(para_id), relay_well_known_keys::upgrade_go_ahead_signal(para_id), diff --git a/test/relay-sproof-builder/src/lib.rs b/test/relay-sproof-builder/src/lib.rs index b5fc0c7f08f..fd98899ed3b 100644 --- a/test/relay-sproof-builder/src/lib.rs +++ b/test/relay-sproof-builder/src/lib.rs @@ -38,7 +38,7 @@ pub struct RelayStateSproofBuilder { pub host_config: AbridgedHostConfiguration, pub dmq_mqc_head: Option, pub upgrade_go_ahead: Option, - pub relay_dispatch_queue_size: Option<(u32, u32)>, + pub relay_dispatch_queue_remaining_capacity: Option<(u32, u32)>, pub hrmp_ingress_channel_index: Option>, pub hrmp_egress_channel_index: Option>, pub hrmp_channels: BTreeMap, @@ -65,7 +65,7 @@ impl Default for RelayStateSproofBuilder { }, dmq_mqc_head: None, upgrade_go_ahead: None, - relay_dispatch_queue_size: None, + relay_dispatch_queue_remaining_capacity: None, hrmp_ingress_channel_index: None, hrmp_egress_channel_index: None, hrmp_channels: BTreeMap::new(), @@ -124,9 +124,12 @@ impl RelayStateSproofBuilder { dmq_mqc_head.encode(), ); } - if let Some(relay_dispatch_queue_size) = self.relay_dispatch_queue_size { + if let Some(relay_dispatch_queue_size) = self.relay_dispatch_queue_remaining_capacity { insert( - relay_chain::well_known_keys::relay_dispatch_queue_size(self.para_id), + relay_chain::well_known_keys::relay_dispatch_queue_remaining_capacity( + self.para_id, + ) + .key, relay_dispatch_queue_size.encode(), ); } diff --git a/xcm/xcm-emulator/Cargo.toml b/xcm/xcm-emulator/Cargo.toml index 8da28d0283f..d64c64800c6 100644 --- a/xcm/xcm-emulator/Cargo.toml +++ b/xcm/xcm-emulator/Cargo.toml @@ -20,6 +20,7 @@ sp-std = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-message-queue = { git = "https://github.com/paritytech/substrate", branch = "master" } cumulus-primitives-core = { path = "../../primitives/core"} cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue" } diff --git a/xcm/xcm-emulator/src/lib.rs b/xcm/xcm-emulator/src/lib.rs index b928d5cf76e..72a0021aefd 100644 --- a/xcm/xcm-emulator/src/lib.rs +++ b/xcm/xcm-emulator/src/lib.rs @@ -18,8 +18,8 @@ pub use casey::pascal; pub use codec::Encode; pub use frame_support::{ sp_runtime::BuildStorage, - traits::{Get, Hooks}, - weights::Weight, + traits::{EnqueueMessage, Get, Hooks, ProcessMessage, ProcessMessageError, ServiceQueues}, + weights::{Weight, WeightMeter}, }; pub use frame_system::AccountInfo; pub use log; @@ -41,13 +41,14 @@ pub use cumulus_primitives_core::{ pub use cumulus_primitives_parachain_inherent::ParachainInherentData; pub use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; pub use cumulus_test_service::get_account_id_from_seed; +pub use pallet_message_queue; pub use parachain_info; pub use parachains_common::{AccountId, BlockNumber}; pub use polkadot_primitives; pub use polkadot_runtime_parachains::{ dmp, - ump::{MessageId, UmpSink, XcmSink}, + inclusion::{AggregateMessageOrigin, UmpQueueId}, }; pub use std::{collections::HashMap, thread::LocalKey}; pub use xcm::{v3::prelude::*, VersionedXcm}; @@ -164,7 +165,7 @@ pub trait NetworkComponent { } } -pub trait RelayChain: UmpSink { +pub trait RelayChain: ProcessMessage { type Runtime; type RuntimeOrigin; type RuntimeCall; @@ -198,14 +199,15 @@ macro_rules! decl_test_relay_chains { genesis = $genesis:expr, on_init = $on_init:expr, runtime = { - Runtime: $($runtime:tt)::*, - RuntimeOrigin: $($runtime_origin:tt)::*, - RuntimeCall: $($runtime_call:tt)::*, - RuntimeEvent: $($runtime_event:tt)::*, - XcmConfig: $($xcm_config:tt)::*, - SovereignAccountOf: $($sovereign_acc_of:tt)::*, - System: $($system:tt)::*, - Balances: $($balances:tt)::*, + Runtime: $runtime:path, + RuntimeOrigin: $runtime_origin:path, + RuntimeCall: $runtime_call:path, + RuntimeEvent: $runtime_event:path, + MessageQueue: $mq:path, + XcmConfig: $xcm_config:path, + SovereignAccountOf: $sovereign_acc_of:path, + System: $system:path, + Balances: $balances:path, }, pallets_extra = { $($pallet_name:ident: $pallet_path:path,)* @@ -218,14 +220,14 @@ macro_rules! decl_test_relay_chains { pub struct $name; impl RelayChain for $name { - type Runtime = $($runtime)::*; - type RuntimeOrigin = $($runtime_origin)::*; - type RuntimeCall = $($runtime_call)::*; - type RuntimeEvent = $($runtime_event)::*; - type XcmConfig = $($xcm_config)::*; - type SovereignAccountOf = $($sovereign_acc_of)::*; - type System = $($system)::*; - type Balances = $($balances)::*; + type Runtime = $runtime; + type RuntimeOrigin = $runtime_origin; + type RuntimeCall = $runtime_call; + type RuntimeEvent = $runtime_event; + type XcmConfig = $xcm_config; + type SovereignAccountOf = $sovereign_acc_of; + type System = $system; + type Balances = $balances; } $crate::paste::paste! { @@ -242,31 +244,43 @@ macro_rules! decl_test_relay_chains { } } - $crate::__impl_xcm_handlers_for_relay_chain!($name); - $crate::__impl_test_ext_for_relay_chain!($name, $genesis, $on_init); - )+ - }; -} + impl $crate::ProcessMessage for $name { + type Origin = $crate::ParaId; -#[macro_export] -macro_rules! __impl_xcm_handlers_for_relay_chain { - ($name:ident) => { - impl $crate::UmpSink for $name { - fn process_upward_message( - origin: $crate::ParaId, - msg: &[u8], - max_weight: $crate::Weight, - ) -> Result<$crate::Weight, ($crate::MessageId, $crate::Weight)> { - use $crate::{TestExt, UmpSink}; - - Self::execute_with(|| { - $crate::XcmSink::< - $crate::XcmExecutor<::XcmConfig>, - ::Runtime, - >::process_upward_message(origin, msg, max_weight) - }) + fn process_message( + msg: &[u8], + para: Self::Origin, + meter: &mut $crate::WeightMeter, + ) -> Result { + use $crate::{Weight, AggregateMessageOrigin, UmpQueueId, ServiceQueues, EnqueueMessage}; + use $mq as message_queue; + use $runtime_event as runtime_event; + + Self::execute_with(|| { + <$mq as EnqueueMessage>::enqueue_message( + msg.try_into().expect("Message too long"), + AggregateMessageOrigin::Ump(UmpQueueId::Para(para.clone())) + ); + + <$system>::reset_events(); + <$mq as ServiceQueues>::service_queues(Weight::MAX); + let events = <$system>::events(); + let event = events.last().expect("There must be at least one event"); + + match &event.event { + runtime_event::MessageQueue( + $crate::pallet_message_queue::Event::Processed {origin, ..}) => { + assert_eq!(origin, &AggregateMessageOrigin::Ump(UmpQueueId::Para(para))); + }, + event => panic!("Unexpected event: {:#?}", event), + } + Ok(true) + }) + } } - } + + $crate::__impl_test_ext_for_relay_chain!($name, $genesis, $on_init); + )+ }; } @@ -800,12 +814,13 @@ macro_rules! decl_test_networks { } fn _process_upward_messages() { - use $crate::{UmpSink, Bounded}; + use $crate::{Bounded, ProcessMessage, WeightMeter}; while let Some((from_para_id, msg)) = $crate::UPWARD_MESSAGES.with(|b| b.borrow_mut().get_mut(stringify!($name)).unwrap().pop_front()) { - let _ = <$relay_chain>::process_upward_message( - from_para_id.into(), + let mut weight_meter = WeightMeter::max_limit(); + let _ = <$relay_chain>::process_message( &msg[..], - $crate::Weight::max_value(), + from_para_id.into(), + &mut weight_meter, ); } } From ba8f89bc0839b6f1e9b62c3ae2287c0de7266f85 Mon Sep 17 00:00:00 2001 From: yjh Date: Mon, 22 May 2023 05:31:34 +0800 Subject: [PATCH 207/339] update WasmExecutionMethod (#2599) --- test/service/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/service/src/lib.rs b/test/service/src/lib.rs index c79c9554b01..c97339f7fe9 100644 --- a/test/service/src/lib.rs +++ b/test/service/src/lib.rs @@ -740,7 +740,7 @@ pub fn node_config( state_pruning: Some(PruningMode::ArchiveAll), blocks_pruning: BlocksPruning::KeepAll, chain_spec: spec, - wasm_method: WasmExecutionMethod::Interpreted, + wasm_method: WasmExecutionMethod::default(), // NOTE: we enforce the use of the native runtime to make the errors more debuggable execution_strategies: ExecutionStrategies { syncing: sc_client_api::ExecutionStrategy::NativeWhenPossible, From 469fe9c0ed8ff108271bfbc92bb9bc5eebe9c992 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 22 May 2023 12:21:26 +0200 Subject: [PATCH 208/339] Used `GlobalConsensusParachainConvertsFor` from `xcm-builder` --- parachains/runtimes/assets/common/src/lib.rs | 1 - .../assets/common/src/location_conversion.rs | 152 ------------------ .../assets/test-utils/src/test_cases.rs | 22 +-- .../assets/westmint/src/xcm_config.rs | 20 ++- 4 files changed, 20 insertions(+), 175 deletions(-) delete mode 100644 parachains/runtimes/assets/common/src/location_conversion.rs diff --git a/parachains/runtimes/assets/common/src/lib.rs b/parachains/runtimes/assets/common/src/lib.rs index 6e29623d7e4..8a321ad97aa 100644 --- a/parachains/runtimes/assets/common/src/lib.rs +++ b/parachains/runtimes/assets/common/src/lib.rs @@ -17,7 +17,6 @@ pub mod foreign_creators; pub mod fungible_conversion; -pub mod location_conversion; pub mod matching; pub mod runtime_api; diff --git a/parachains/runtimes/assets/common/src/location_conversion.rs b/parachains/runtimes/assets/common/src/location_conversion.rs deleted file mode 100644 index 50e06f27b20..00000000000 --- a/parachains/runtimes/assets/common/src/location_conversion.rs +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// TODO:check-parameter - is it worth to move it to the [`xcm-builder -> location_conversion.rs`]? - -use codec::Encode; -use frame_support::sp_io::hashing::blake2_256; -use sp_std::{borrow::Borrow, marker::PhantomData}; -use xcm::prelude::*; -use xcm_executor::traits::Convert; - -/// Tries to convert **foreign** global consensus parachain to accountId. -/// -/// **foreign** means `parents > 1` -/// -/// (E.g.: can be used for sovereign account conversion) -pub struct GlobalConsensusParachainConvert(PhantomData); - -impl + Clone> Convert - for GlobalConsensusParachainConvert -{ - fn convert_ref(location: impl Borrow) -> Result { - match location.borrow() { - MultiLocation { - parents, - interior: X2(GlobalConsensus(network), Parachain(para_id)), - } if parents > &1_u8 => - Ok(AccountId::from(GlobalConsensusParachainConvert::::from_params( - network, para_id, *parents, - ))), - _ => Err(()), - } - } - - fn reverse_ref(_: impl Borrow) -> Result { - // if this will be needed, we could implement some kind of guessing, if we have configuration for supported foreign networkId+paraId - Err(()) - } -} - -impl GlobalConsensusParachainConvert { - fn from_params(network: &NetworkId, para_id: &u32, parents: u8) -> [u8; 32] { - (network, para_id, parents).using_encoded(blake2_256) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn global_consensus_parachain_convert_works() { - let test_data = vec![ - ( - MultiLocation::new(0, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - false, - ), - ( - MultiLocation::new(1, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - false, - ), - ( - MultiLocation::new( - 2, - X3( - GlobalConsensus(ByGenesis([0; 32])), - Parachain(1000), - AccountId32 { network: None, id: [1; 32].into() }, - ), - ), - false, - ), - (MultiLocation::new(2, X1(GlobalConsensus(ByGenesis([0; 32])))), false), - (MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), - (MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), - (MultiLocation::new(4, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), - ( - MultiLocation::new(10, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - true, - ), - ]; - - for (location, expected_result) in test_data { - let result = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref(&location); - match result { - Ok(account) => { - assert_eq!( - true, expected_result, - "expected_result: {}, but conversion passed: {:?}, location: {:?}", - expected_result, account, location - ); - match &location { - MultiLocation { parents, interior: X2(GlobalConsensus(network), Parachain(para_id)) } => - assert_eq!( - account, - GlobalConsensusParachainConvert::<[u8; 32]>::from_params(network, para_id, *parents), - "expected_result: {}, but conversion passed: {:?}, location: {:?}", expected_result, account, location - ), - _ => assert_eq!( - true, - expected_result, - "expected_result: {}, conversion passed: {:?}, but MultiLocation does not match expected pattern, location: {:?}", expected_result, account, location - ) - } - }, - Err(_) => { - assert_eq!( - false, expected_result, - "expected_result: {} - but conversion failed, location: {:?}", - expected_result, location - ); - }, - } - } - - // all success - let res_2_1000 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( - MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - ) - .expect("conversion is ok"); - let res_2_1001 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( - MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1001))), - ) - .expect("conversion is ok"); - let res_3_1000 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( - MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - ) - .expect("conversion is ok"); - let res_3_1001 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( - MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1001))), - ) - .expect("conversion is ok"); - assert_ne!(res_2_1000, res_2_1001); - assert_ne!(res_2_1000, res_3_1000); - assert_ne!(res_2_1000, res_3_1001); - assert_ne!(res_2_1001, res_3_1000); - assert_ne!(res_2_1001, res_3_1001); - assert_ne!(res_3_1000, res_3_1001); - } -} diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 060ec532892..62f2f36d4af 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1883,9 +1883,6 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< parents: 2, interior: X2(GlobalConsensus(remote_network_id), Parachain(1000)), }; - let remote_parachain_sovereign_account = - LocationToAccountId::convert_ref(remote_parachain_as_origin) - .expect("Sovereign account works"); let foreign_asset_id_multilocation = MultiLocation { parents: 2, interior: X1(GlobalConsensus(remote_network_id)) }; let buy_execution_fee_amount = 50000000000; @@ -1897,18 +1894,21 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< ExtBuilder::::default() .with_collators(collator_session_keys.collators()) .with_session_keys(collator_session_keys.session_keys()) - .with_balances(vec![ - ( - remote_parachain_sovereign_account.clone(), - existential_deposit + buy_execution_fee_amount.into(), - ), - (target_account.clone(), existential_deposit), - ]) + .with_balances(vec![(target_account.clone(), existential_deposit)]) .with_tracing() .build() .execute_with(|| { - // setup bridge transfer configuration + // drip SA for remote global parachain origin + let remote_parachain_sovereign_account = + LocationToAccountId::convert_ref(remote_parachain_as_origin) + .expect("Sovereign account works"); + assert_ok!(>::force_set_balance( + RuntimeHelper::::root_origin(), + remote_parachain_sovereign_account.clone().into(), + existential_deposit + buy_execution_fee_amount.into(), + )); + // setup bridge transfer configuration // add allowed univeral alias for remote network assert_ok!(>::add_universal_alias( RuntimeHelper::::root_origin(), diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index c6e33734eb1..ff555416178 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -18,12 +18,9 @@ use super::{ ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; -use assets_common::{ - location_conversion::GlobalConsensusParachainConvert, - matching::{ - FromSiblingParachain, IsDifferentGlobalConsensusConcreteAsset, IsForeignConcreteAsset, - StartsWith, StartsWithExplicitGlobalConsensus, - }, +use assets_common::matching::{ + FromSiblingParachain, IsDifferentGlobalConsensusConcreteAsset, IsForeignConcreteAsset, + StartsWith, StartsWithExplicitGlobalConsensus, }; use frame_support::{ match_types, parameter_types, @@ -44,10 +41,11 @@ use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - UsingComponents, WeightInfoBounds, WithComputedOrigin, + FungiblesAdapter, GlobalConsensusParachainConvertsFor, IsConcrete, LocalMint, NativeAsset, + NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, + WithComputedOrigin, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -74,7 +72,7 @@ pub type LocationToAccountId = ( // Straight up local `AccountId32` origins just alias directly to `AccountId`. AccountId32Aliases, // Different global consensus parachain sovereign account - GlobalConsensusParachainConvert, + GlobalConsensusParachainConvertsFor, ); /// Means for transacting the native currency on this chain. From 9608ea1adf923108aa0b5a8c4ce1e67ac974fc96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 12:40:43 +0200 Subject: [PATCH 209/339] Bump ruby/setup-ruby from 1.148.0 to 1.149.0 (#2581) Bumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.148.0 to 1.149.0. - [Release notes](https://github.com/ruby/setup-ruby/releases) - [Commits](https://github.com/ruby/setup-ruby/compare/d2b39ad0b52eca07d23f3aa14fdf2a3fcc1f411c...7d546f4868fb108ed378764d873683f920672ae2) --- updated-dependencies: - dependency-name: ruby/setup-ruby dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release-30_create-draft.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index a3b39806eec..d81f0a7809e 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -126,7 +126,7 @@ jobs: path: cumulus ref: ${{ github.event.inputs.ref2 }} - - uses: ruby/setup-ruby@d2b39ad0b52eca07d23f3aa14fdf2a3fcc1f411c # v1.148.0 + - uses: ruby/setup-ruby@7d546f4868fb108ed378764d873683f920672ae2 # v1.149.0 with: ruby-version: 3.0.0 @@ -253,7 +253,7 @@ jobs: - name: Download artifacts uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 - - uses: ruby/setup-ruby@d2b39ad0b52eca07d23f3aa14fdf2a3fcc1f411c # v1.148.0 + - uses: ruby/setup-ruby@7d546f4868fb108ed378764d873683f920672ae2 # v1.149.0 with: ruby-version: 3.0.0 From 1f75cb92bfeade9ec5839f2b4f0288f9ec56eb3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 12:40:58 +0200 Subject: [PATCH 210/339] Bump Swatinem/rust-cache from 2.2.1 to 2.3.0 (#2582) Bumps [Swatinem/rust-cache](https://github.com/Swatinem/rust-cache) from 2.2.1 to 2.3.0. - [Release notes](https://github.com/Swatinem/rust-cache/releases) - [Changelog](https://github.com/Swatinem/rust-cache/blob/master/CHANGELOG.md) - [Commits](https://github.com/Swatinem/rust-cache/compare/6fd3edff6979b79f87531400ad694fb7f2c84b1f...060bda31e0be4f453bb6ed2d7e5427b31734ad01) --- updated-dependencies: - dependency-name: Swatinem/rust-cache dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index a5ad2bd555e..3e49636a96b 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -23,7 +23,7 @@ jobs: run: rustup show - name: Rust cache - uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 + uses: Swatinem/rust-cache@060bda31e0be4f453bb6ed2d7e5427b31734ad01 # v2.3.0 - name: Build rustdocs run: SKIP_WASM_BUILD=1 cargo doc --all --no-deps From 04d4333c44a0ec2e74e83ec85eb2afdf0e5bce7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 22 May 2023 13:10:13 +0200 Subject: [PATCH 211/339] Chainspecs: Fix bootnode address (#2611) --- parachains/chain-specs/bridge-hub-kusama.json | 2 +- parachains/chain-specs/bridge-hub-polkadot.json | 2 +- parachains/chain-specs/bridge-hub-westend.json | 2 +- parachains/chain-specs/collectives-polkadot.json | 2 +- parachains/chain-specs/collectives-westend.json | 2 +- parachains/chain-specs/statemine.json | 4 ++-- parachains/chain-specs/statemint.json | 4 ++-- parachains/chain-specs/westmint.json | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/parachains/chain-specs/bridge-hub-kusama.json b/parachains/chain-specs/bridge-hub-kusama.json index a0938b7f0de..0b95abcb24b 100644 --- a/parachains/chain-specs/bridge-hub-kusama.json +++ b/parachains/chain-specs/bridge-hub-kusama.json @@ -29,7 +29,7 @@ "/dns/bridge-hub-kusama.bootnode.amforc.com/tcp/30337/p2p/12D3KooWGNeQJ5rXnEJkVUuQqwHd8aV5GkTAheaRoCaK8ZwW94id", "/dns/bridge-hub-kusama.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWGNeQJ5rXnEJkVUuQqwHd8aV5GkTAheaRoCaK8ZwW94id", "/dns/kusama-bridge-hub-boot-ng.dwellir.com/tcp/30337/p2p/12D3KooWBFskNCQDVjuUeBh6vrszWrUvYMBBhtZRLnoTZDdLYbW5", - "/dns/kusama-bridge-hub-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWBFskNCQDVjuUeBh6vrszWrUvYMBBhtZRLnoTZDdLYbW5" + "/dns/kusama-bridge-hub-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWBFskNCQDVjuUeBh6vrszWrUvYMBBhtZRLnoTZDdLYbW5" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/bridge-hub-polkadot.json b/parachains/chain-specs/bridge-hub-polkadot.json index 39a165d95c0..cf366c37794 100644 --- a/parachains/chain-specs/bridge-hub-polkadot.json +++ b/parachains/chain-specs/bridge-hub-polkadot.json @@ -12,7 +12,7 @@ "/dns/polkadot-bridge-hub-connect-b-0.polkadot.io/tcp/443/wss/p2p/12D3KooWCwGKxjpJXnx1mwXKvaxGQm769EM3b6Pg5vbU33wbhsNw", "/dns/polkadot-bridge-hub-connect-b-1.polkadot.io/tcp/443/wss/p2p/12D3KooWLiSEdhriJUPdZKFtAjZrQncxN2ssEoDKVrt5mGM4Qu4J", "/dns/polkadot-bridge-hub-boot-ng.dwellir.com/tcp/30339/p2p/12D3KooWPZ38PL3PhRVcUVYDNn7nRcZF8MykmWWLBKeDV2yna1vV", - "/dns/polkadot-bridge-hub-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWPZ38PL3PhRVcUVYDNn7nRcZF8MykmWWLBKeDV2yna1vV" + "/dns/polkadot-bridge-hub-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWPZ38PL3PhRVcUVYDNn7nRcZF8MykmWWLBKeDV2yna1vV" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/bridge-hub-westend.json b/parachains/chain-specs/bridge-hub-westend.json index 8013d40c8a6..3428695c309 100644 --- a/parachains/chain-specs/bridge-hub-westend.json +++ b/parachains/chain-specs/bridge-hub-westend.json @@ -8,7 +8,7 @@ "/dns/westend-bridge-hub-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWPXqdRRthjKAMPFtaXUK7yBxsvh83QsmzXzALA3inoJfo", "/dns/westend-bridge-hub-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWAp2YpVaiNBy7rozEHJGocDpaLFt3VFZsGMBEYh4BoEz7", "/dns/westend-bridge-hub-boot-ng.dwellir.com/tcp/30338/p2p/12D3KooWJWWRYTAwBLqYkh7iMBGDr5ouJ3MHj7M3fZ7zWS4zEk6F", - "/dns/westend-bridge-hub-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWJWWRYTAwBLqYkh7iMBGDr5ouJ3MHj7M3fZ7zWS4zEk6F" + "/dns/westend-bridge-hub-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWJWWRYTAwBLqYkh7iMBGDr5ouJ3MHj7M3fZ7zWS4zEk6F" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/collectives-polkadot.json b/parachains/chain-specs/collectives-polkadot.json index 850d895e4d4..084a92713ce 100644 --- a/parachains/chain-specs/collectives-polkadot.json +++ b/parachains/chain-specs/collectives-polkadot.json @@ -29,7 +29,7 @@ "/dns/collectives-polkadot.bootnode.amforc.com/tcp/30335/p2p/12D3KooWQeAjDnGkrPe5vtpfnB6ydZfWyMxyrXLkBFmA6o4k9aiU", "/dns/collectives-polkadot.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWQeAjDnGkrPe5vtpfnB6ydZfWyMxyrXLkBFmA6o4k9aiU", "/dns/polkadot-collectives-boot-ng.dwellir.com/tcp/30341/p2p/12D3KooWDMFYCNRAQcSRNV7xu2xv8319goSEbSHW4TnXRz6EpPKc", - "/dns/polkadot-collectives-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWDMFYCNRAQcSRNV7xu2xv8319goSEbSHW4TnXRz6EpPKc" + "/dns/polkadot-collectives-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWDMFYCNRAQcSRNV7xu2xv8319goSEbSHW4TnXRz6EpPKc" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/collectives-westend.json b/parachains/chain-specs/collectives-westend.json index 3eb3366e9c3..e93611ee028 100644 --- a/parachains/chain-specs/collectives-westend.json +++ b/parachains/chain-specs/collectives-westend.json @@ -33,7 +33,7 @@ "/dns/collectives-westend.bootnode.amforc.com/tcp/30340/p2p/12D3KooWERPzUhHau6o2XZRUi3tn7544rYiaHL418Nw5t8fYWP1F", "/dns/collectives-westend.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWERPzUhHau6o2XZRUi3tn7544rYiaHL418Nw5t8fYWP1F", "/dns/westend-collectives-boot-ng.dwellir.com/tcp/30340/p2p/12D3KooWPFM93jgm4pgxx8PM8WJKAJF49qia8jRB95uciUQwYh7m", - "/dns/westend-collectives-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWPFM93jgm4pgxx8PM8WJKAJF49qia8jRB95uciUQwYh7m" + "/dns/westend-collectives-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWPFM93jgm4pgxx8PM8WJKAJF49qia8jRB95uciUQwYh7m" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/parachains/chain-specs/statemine.json b/parachains/chain-specs/statemine.json index c31c715fc01..bf296a173b9 100644 --- a/parachains/chain-specs/statemine.json +++ b/parachains/chain-specs/statemine.json @@ -27,7 +27,7 @@ "/dns/statemine.bootnode.amforc.com/tcp/30336/p2p/12D3KooWHmSyrBWsc6fdpq8HtCFWasmLVLYGKWA2a78m4xAHKyBq", "/dns/statemine.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWHmSyrBWsc6fdpq8HtCFWasmLVLYGKWA2a78m4xAHKyBq", "/dns/statemine-boot-ng.dwellir.com/tcp/30343/p2p/12D3KooWQNJKBaNfW6Nn7HZDi5pSSEFmHL2Qz7chr9RksQUDR1Wk", - "/dns/statemine-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWQNJKBaNfW6Nn7HZDi5pSSEFmHL2Qz7chr9RksQUDR1Wk" + "/dns/statemine-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWQNJKBaNfW6Nn7HZDi5pSSEFmHL2Qz7chr9RksQUDR1Wk" ], "telemetryEndpoints": null, "protocolId": null, @@ -58,4 +58,4 @@ "childrenDefault": {} } } -} \ No newline at end of file +} diff --git a/parachains/chain-specs/statemint.json b/parachains/chain-specs/statemint.json index 55973c2dbb3..61ca655af6c 100644 --- a/parachains/chain-specs/statemint.json +++ b/parachains/chain-specs/statemint.json @@ -27,7 +27,7 @@ "/dns/statemint.bootnode.amforc.com/tcp/30341/p2p/12D3KooWByohP9FXn7ao8syS167qJsbFdpa7fY2Y24xbKtt3r7Ls", "/dns/statemint.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWByohP9FXn7ao8syS167qJsbFdpa7fY2Y24xbKtt3r7Ls", "/dns/statemint-boot-ng.dwellir.com/tcp/30344/p2p/12D3KooWEFrNuNk8fPdQS2hf34Gmqi6dGSvrETshGJUrqrvfRDZr", - "/dns/statemint-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWEFrNuNk8fPdQS2hf34Gmqi6dGSvrETshGJUrqrvfRDZr" + "/dns/statemint-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWEFrNuNk8fPdQS2hf34Gmqi6dGSvrETshGJUrqrvfRDZr" ], "telemetryEndpoints": null, "protocolId": null, @@ -60,4 +60,4 @@ "childrenDefault": {} } } -} \ No newline at end of file +} diff --git a/parachains/chain-specs/westmint.json b/parachains/chain-specs/westmint.json index d498fc320cb..17d768e58d7 100644 --- a/parachains/chain-specs/westmint.json +++ b/parachains/chain-specs/westmint.json @@ -21,7 +21,7 @@ "/dns/westmint.bootnode.amforc.com/tcp/30339/p2p/12D3KooWNjKeaANaeZxBAPctmx8jugSYzuw4vnSCJmEDPB5mtRd6", "/dns/westmint.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWNjKeaANaeZxBAPctmx8jugSYzuw4vnSCJmEDPB5mtRd6", "/dns/westmint-boot-ng.dwellir.com/tcp/30345/p2p/12D3KooWFZ9xqApB1wnFYkbe1qJ5Jqwxe2f3i8W25F3tKNXy59ux", - "/dns/westmint-boot-ng.dwellir.com//tcp/443/wss/p2p/12D3KooWFZ9xqApB1wnFYkbe1qJ5Jqwxe2f3i8W25F3tKNXy59ux" + "/dns/westmint-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWFZ9xqApB1wnFYkbe1qJ5Jqwxe2f3i8W25F3tKNXy59ux" ], "telemetryEndpoints": null, "protocolId": null, From 673e9f6e9e9183028c39e2abbee2540baba2a687 Mon Sep 17 00:00:00 2001 From: Squirrel Date: Mon, 22 May 2023 18:05:30 +0100 Subject: [PATCH 212/339] Update substrate/polkadot + needed changes to compile (#2613) * Update substrate/polkadot + needed changed to compile * ".git/.scripts/commands/fmt/fmt.sh" --------- Co-authored-by: command-bot <> --- Cargo.lock | 524 ++++++++++++++++++------------------ xcm/xcm-emulator/src/lib.rs | 3 + 2 files changed, 265 insertions(+), 262 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f100b5b7583..eb38e8393b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -580,7 +580,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "hash-db", "log", @@ -3475,13 +3475,13 @@ dependencies = [ [[package]] name = "enumn" -version = "0.1.5" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038b1afa59052df211f9efd58f8b1d84c242935ede1c3dbaed26b018a9e06ae2" +checksum = "48016319042fb7c87b78d2993084a831793a897a5cd1a2a67cab9d1eeb4b7d76" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.16", ] [[package]] @@ -3808,7 +3808,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", ] @@ -3831,7 +3831,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-support-procedural", @@ -3856,7 +3856,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3903,7 +3903,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3914,7 +3914,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3931,7 +3931,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-system", @@ -3960,7 +3960,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-recursion", "futures", @@ -3981,7 +3981,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "bitflags", "environmental", @@ -4015,7 +4015,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "Inflector", "cfg-expr", @@ -4031,7 +4031,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4043,7 +4043,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "proc-macro2", "quote", @@ -4053,7 +4053,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "cfg-if", "frame-support", @@ -4072,7 +4072,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -4087,7 +4087,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "sp-api", @@ -4096,7 +4096,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "parity-scale-codec", @@ -5188,7 +5188,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bitvec", "frame-benchmarking", @@ -5287,7 +5287,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "frame-support", "polkadot-primitives", @@ -6169,7 +6169,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "futures", "log", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "anyhow", "jsonrpsee", @@ -6707,7 +6707,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6728,7 +6728,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -6761,7 +6761,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-system", @@ -6777,7 +6777,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-system", @@ -6793,7 +6793,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-system", @@ -6807,7 +6807,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6851,7 +6851,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -6866,7 +6866,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-system", @@ -6885,7 +6885,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6909,7 +6909,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7059,7 +7059,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7076,7 +7076,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "bitflags", "environmental", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "bitflags", "parity-scale-codec", @@ -7119,7 +7119,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "proc-macro2", "quote", @@ -7129,7 +7129,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7146,7 +7146,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7164,7 +7164,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7187,7 +7187,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7200,7 +7200,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7218,7 +7218,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7236,7 +7236,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "blake2", "frame-benchmarking", @@ -7254,7 +7254,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7277,7 +7277,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7293,7 +7293,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7313,7 +7313,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7330,7 +7330,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-system", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7380,7 +7380,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7397,7 +7397,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7413,7 +7413,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7431,7 +7431,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "pallet-nfts", @@ -7442,7 +7442,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-system", @@ -7475,7 +7475,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7495,7 +7495,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7506,7 +7506,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-system", @@ -7523,7 +7523,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7562,7 +7562,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7579,7 +7579,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7594,7 +7594,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7612,7 +7612,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7627,7 +7627,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7646,7 +7646,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7663,7 +7663,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-system", @@ -7684,7 +7684,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7700,7 +7700,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-system", @@ -7714,7 +7714,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7737,7 +7737,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7748,7 +7748,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "log", "sp-arithmetic", @@ -7757,7 +7757,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "sp-api", @@ -7766,7 +7766,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7783,7 +7783,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7798,7 +7798,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7816,7 +7816,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7835,7 +7835,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-support", "frame-system", @@ -7851,7 +7851,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7867,7 +7867,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7879,7 +7879,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7896,7 +7896,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7911,7 +7911,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7927,7 +7927,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7942,7 +7942,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-benchmarking", "frame-support", @@ -7957,7 +7957,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7978,7 +7978,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8589,7 +8589,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8605,7 +8605,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8619,7 +8619,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "derive_more", "fatality", @@ -8642,7 +8642,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "fatality", "futures", @@ -8663,7 +8663,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8692,7 +8692,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "async-trait", "frame-benchmarking", @@ -8735,7 +8735,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "always-assert", "bitvec", @@ -8757,7 +8757,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8769,7 +8769,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "derive_more", "fatality", @@ -8794,7 +8794,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8808,7 +8808,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "futures", "futures-timer", @@ -8828,7 +8828,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "always-assert", "async-trait", @@ -8851,7 +8851,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "futures", "parity-scale-codec", @@ -8869,7 +8869,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bitvec", "derive_more", @@ -8898,7 +8898,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bitvec", "futures", @@ -8919,7 +8919,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bitvec", "fatality", @@ -8938,7 +8938,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8953,7 +8953,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "async-trait", "futures", @@ -8973,7 +8973,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "futures", "polkadot-node-metrics", @@ -8988,7 +8988,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "futures", "futures-timer", @@ -9005,7 +9005,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "fatality", "futures", @@ -9024,7 +9024,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "async-trait", "futures", @@ -9041,7 +9041,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bitvec", "fatality", @@ -9059,7 +9059,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "always-assert", "futures", @@ -9086,7 +9086,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "futures", "polkadot-node-primitives", @@ -9102,7 +9102,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "assert_matches", "cpu-time", @@ -9131,7 +9131,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "futures", "lru 0.9.0", @@ -9146,7 +9146,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "lazy_static", "log", @@ -9164,7 +9164,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bs58", "futures", @@ -9183,7 +9183,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "async-trait", "derive_more", @@ -9205,7 +9205,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bounded-vec", "futures", @@ -9227,7 +9227,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9237,7 +9237,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "async-trait", "futures", @@ -9255,7 +9255,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "async-trait", "derive_more", @@ -9278,7 +9278,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "async-trait", "derive_more", @@ -9311,7 +9311,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "async-trait", "futures", @@ -9334,7 +9334,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bounded-collections", "derive_more", @@ -9433,7 +9433,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9451,7 +9451,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9477,7 +9477,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9509,7 +9509,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bitvec", "frame-benchmarking", @@ -9604,7 +9604,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bitvec", "frame-benchmarking", @@ -9650,7 +9650,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "frame-support", "polkadot-primitives", @@ -9664,7 +9664,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bs58", "parity-scale-codec", @@ -9676,7 +9676,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bitflags", "bitvec", @@ -9721,7 +9721,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9831,7 +9831,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9852,7 +9852,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9862,7 +9862,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9887,7 +9887,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9948,7 +9948,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "frame-benchmarking", "frame-system", @@ -10740,7 +10740,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10827,7 +10827,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "frame-support", "polkadot-primitives", @@ -11074,7 +11074,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "log", "sp-core", @@ -11085,7 +11085,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "futures", @@ -11114,7 +11114,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "futures", "futures-timer", @@ -11137,7 +11137,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11152,7 +11152,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11171,7 +11171,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11182,7 +11182,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11222,7 +11222,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "fnv", "futures", @@ -11249,7 +11249,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "hash-db", "kvdb", @@ -11275,7 +11275,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "futures", @@ -11300,7 +11300,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "futures", @@ -11329,7 +11329,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "fork-tree", @@ -11365,7 +11365,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "futures", "jsonrpsee", @@ -11387,7 +11387,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11422,7 +11422,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "futures", "jsonrpsee", @@ -11441,7 +11441,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11454,7 +11454,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11494,7 +11494,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "finality-grandpa", "futures", @@ -11514,7 +11514,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "futures", @@ -11537,7 +11537,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11561,7 +11561,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11574,7 +11574,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "log", "sc-allocator", @@ -11587,7 +11587,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "anyhow", "cfg-if", @@ -11605,7 +11605,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "ansi_term", "futures", @@ -11621,7 +11621,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11635,7 +11635,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11680,7 +11680,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "cid", "futures", @@ -11700,7 +11700,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11728,7 +11728,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "ahash 0.8.2", "futures", @@ -11747,7 +11747,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11769,7 +11769,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11803,7 +11803,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11823,7 +11823,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11854,7 +11854,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "futures", "libp2p-identity", @@ -11867,7 +11867,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11876,7 +11876,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "futures", "jsonrpsee", @@ -11907,7 +11907,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11926,7 +11926,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "http", "jsonrpsee", @@ -11941,7 +11941,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11967,7 +11967,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "directories", @@ -12033,7 +12033,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "log", "parity-scale-codec", @@ -12044,7 +12044,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "clap 4.2.7", "fs4", @@ -12060,7 +12060,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12079,7 +12079,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "futures", "libc", @@ -12098,7 +12098,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "chrono", "futures", @@ -12117,7 +12117,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "ansi_term", "atty", @@ -12148,7 +12148,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12159,7 +12159,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "futures", @@ -12186,7 +12186,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "futures", @@ -12200,7 +12200,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-channel", "futures", @@ -12681,7 +12681,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "enumn", "parity-scale-codec", @@ -12758,7 +12758,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "hash-db", "log", @@ -12778,7 +12778,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "Inflector", "blake2", @@ -12792,7 +12792,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "scale-info", @@ -12805,7 +12805,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "integer-sqrt", "num-traits", @@ -12819,7 +12819,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "scale-info", @@ -12832,7 +12832,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "sp-api", @@ -12844,7 +12844,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "futures", "log", @@ -12862,7 +12862,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "futures", @@ -12877,7 +12877,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "parity-scale-codec", @@ -12895,7 +12895,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "parity-scale-codec", @@ -12916,7 +12916,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12935,7 +12935,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "finality-grandpa", "log", @@ -12953,7 +12953,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "scale-info", @@ -12965,7 +12965,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13009,7 +13009,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "blake2b_simd", "byteorder", @@ -13023,7 +13023,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "proc-macro2", "quote", @@ -13034,7 +13034,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13043,7 +13043,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "proc-macro2", "quote", @@ -13053,7 +13053,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "environmental", "parity-scale-codec", @@ -13064,7 +13064,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13079,7 +13079,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "bytes", "ed25519", @@ -13105,7 +13105,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "lazy_static", "sp-core", @@ -13116,7 +13116,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "futures", "parity-scale-codec", @@ -13130,7 +13130,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13139,7 +13139,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13150,7 +13150,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13168,7 +13168,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "scale-info", @@ -13182,7 +13182,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "sp-api", "sp-core", @@ -13192,7 +13192,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "backtrace", "lazy_static", @@ -13202,7 +13202,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "rustc-hash", "serde", @@ -13212,7 +13212,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "either", "hash256-std-hasher", @@ -13234,7 +13234,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13252,7 +13252,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "Inflector", "proc-macro-crate", @@ -13264,7 +13264,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "scale-info", @@ -13278,7 +13278,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "scale-info", @@ -13291,7 +13291,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "hash-db", "log", @@ -13311,7 +13311,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "log", "parity-scale-codec", @@ -13329,12 +13329,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13347,7 +13347,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "futures-timer", @@ -13362,7 +13362,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "sp-std", @@ -13374,7 +13374,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "sp-api", "sp-runtime", @@ -13383,7 +13383,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "log", @@ -13399,7 +13399,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13422,7 +13422,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13439,7 +13439,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13450,7 +13450,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13464,7 +13464,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "parity-scale-codec", "scale-info", @@ -13825,7 +13825,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "platforms 2.0.0", ] @@ -13833,7 +13833,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13852,7 +13852,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "hyper", "log", @@ -13864,7 +13864,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "jsonrpsee", @@ -13877,7 +13877,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "jsonrpsee", "log", @@ -13896,7 +13896,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13922,7 +13922,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13932,7 +13932,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13943,7 +13943,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "ansi_term", "build-helper", @@ -14070,7 +14070,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "frame-support", "polkadot-primitives", @@ -14467,7 +14467,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14478,7 +14478,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14608,7 +14608,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0046337664b221ff1072fb8f872f13a170babca9" +source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" dependencies = [ "async-trait", "clap 4.2.7", @@ -15541,7 +15541,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bitvec", "frame-benchmarking", @@ -15634,7 +15634,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "frame-support", "polkadot-primitives", @@ -16136,7 +16136,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "bounded-collections", "derivative", @@ -16152,7 +16152,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "frame-support", "frame-system", @@ -16207,7 +16207,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "environmental", "frame-benchmarking", @@ -16227,7 +16227,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#7c1dc9429245d705ffb188b16ad5339c6de281c1" +source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" dependencies = [ "Inflector", "proc-macro2", diff --git a/xcm/xcm-emulator/src/lib.rs b/xcm/xcm-emulator/src/lib.rs index 72a0021aefd..48f2fdb10c1 100644 --- a/xcm/xcm-emulator/src/lib.rs +++ b/xcm/xcm-emulator/src/lib.rs @@ -251,6 +251,7 @@ macro_rules! decl_test_relay_chains { msg: &[u8], para: Self::Origin, meter: &mut $crate::WeightMeter, + _id: &mut XcmHash ) -> Result { use $crate::{Weight, AggregateMessageOrigin, UmpQueueId, ServiceQueues, EnqueueMessage}; use $mq as message_queue; @@ -815,12 +816,14 @@ macro_rules! decl_test_networks { fn _process_upward_messages() { use $crate::{Bounded, ProcessMessage, WeightMeter}; + use sp_core::Encode; while let Some((from_para_id, msg)) = $crate::UPWARD_MESSAGES.with(|b| b.borrow_mut().get_mut(stringify!($name)).unwrap().pop_front()) { let mut weight_meter = WeightMeter::max_limit(); let _ = <$relay_chain>::process_message( &msg[..], from_para_id.into(), &mut weight_meter, + &mut msg.using_encoded(sp_core::blake2_256), ); } } From 5cb68fadbce86b5d4311246488f5481c0c23d0a0 Mon Sep 17 00:00:00 2001 From: Jegor Sidorenko <5252494+jsidorenko@users.noreply.github.com> Date: Tue, 23 May 2023 11:35:02 +0200 Subject: [PATCH 213/339] Nfts on Statemint (#2595) --- Cargo.lock | 2 + .../runtimes/assets/statemint/Cargo.toml | 6 + .../runtimes/assets/statemint/src/lib.rs | 95 ++- .../assets/statemint/src/weights/mod.rs | 1 + .../statemint/src/weights/pallet_nfts.rs | 763 ++++++++++++++++++ .../assets/statemint/src/xcm_config.rs | 39 +- 6 files changed, 887 insertions(+), 19 deletions(-) create mode 100644 parachains/runtimes/assets/statemint/src/weights/pallet_nfts.rs diff --git a/Cargo.lock b/Cargo.lock index eb38e8393b9..a8e6be92aa8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13667,6 +13667,8 @@ dependencies = [ "pallet-balances", "pallet-collator-selection", "pallet-multisig", + "pallet-nfts", + "pallet-nfts-runtime-api", "pallet-proxy", "pallet-session", "pallet-timestamp", diff --git a/parachains/runtimes/assets/statemint/Cargo.toml b/parachains/runtimes/assets/statemint/Cargo.toml index 61955f3c6bb..d5dd4fdf974 100644 --- a/parachains/runtimes/assets/statemint/Cargo.toml +++ b/parachains/runtimes/assets/statemint/Cargo.toml @@ -26,6 +26,8 @@ pallet-aura = { git = "https://github.com/paritytech/substrate", default-feature pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-nfts = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-nfts-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-proxy = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -90,6 +92,7 @@ runtime-benchmarks = [ "pallet-assets/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-multisig/runtime-benchmarks", + "pallet-nfts/runtime-benchmarks", "pallet-proxy/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-uniques/runtime-benchmarks", @@ -119,6 +122,7 @@ try-runtime = [ "pallet-balances/try-runtime", "pallet-collator-selection/try-runtime", "pallet-multisig/try-runtime", + "pallet-nfts/try-runtime", "pallet-proxy/try-runtime", "pallet-session/try-runtime", "pallet-timestamp/try-runtime", @@ -142,6 +146,8 @@ std = [ "pallet-authorship/std", "pallet-balances/std", "pallet-multisig/std", + "pallet-nfts/std", + "pallet-nfts-runtime-api/std", "pallet-proxy/std", "pallet-session/std", "pallet-timestamp/std", diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index 8d2c3e317c6..0f5de5b3072 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -62,7 +62,7 @@ use sp_api::impl_runtime_apis; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, ConvertInto}, + traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, ConvertInto, Verify}, transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, }; @@ -86,12 +86,13 @@ use frame_system::{ limits::{BlockLength, BlockWeights}, EnsureRoot, EnsureSigned, }; +use pallet_nfts::PalletFeatures; pub use parachains_common as common; use parachains_common::{ impls::{AssetsToBlockAuthor, DealWithFees}, opaque, AccountId, AssetIdForTrustBackedAssets, Balance, BlockNumber, Hash, Header, Index, - Signature, StatemintAuraId as AuraId, AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, - NORMAL_DISPATCH_RATIO, SLOT_DURATION, + Signature, StatemintAuraId as AuraId, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, + MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_config::{ DotLocation, FellowshipLocation, GovernanceLocation, TrustBackedAssetsConvertedConcreteId, @@ -358,6 +359,7 @@ impl InstanceFilter for ProxyType { c, RuntimeCall::Balances { .. } | RuntimeCall::Assets { .. } | + RuntimeCall::Nfts { .. } | RuntimeCall::Uniques { .. } ), ProxyType::CancelProxy => matches!( @@ -372,7 +374,7 @@ impl InstanceFilter for ProxyType { RuntimeCall::Assets { .. } | RuntimeCall::Utility { .. } | RuntimeCall::Multisig { .. } | - RuntimeCall::Uniques { .. } + RuntimeCall::Nfts { .. } | RuntimeCall::Uniques { .. } ) }, ProxyType::AssetOwner => matches!( @@ -386,6 +388,13 @@ impl InstanceFilter for ProxyType { RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::create { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::destroy { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::redeposit { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::transfer_ownership { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::set_team { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::set_collection_max_supply { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::lock_collection { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | @@ -408,6 +417,17 @@ impl InstanceFilter for ProxyType { RuntimeCall::Assets(TrustBackedAssetsCall::thaw { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::freeze_asset { .. }) | RuntimeCall::Assets(TrustBackedAssetsCall::thaw_asset { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::force_mint { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::update_mint_settings { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::mint_pre_signed { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::set_attributes_pre_signed { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::lock_item_transfer { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::unlock_item_transfer { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::lock_item_properties { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::set_metadata { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::clear_metadata { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::set_collection_metadata { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::clear_collection_metadata { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | @@ -573,14 +593,11 @@ impl pallet_asset_tx_payment::Config for Runtime { } parameter_types! { - pub const CollectionDeposit: Balance = 10 * UNITS; // 10 UNIT deposit to create uniques class - pub const ItemDeposit: Balance = UNITS / 100; // 1 / 100 UNIT deposit to create uniques instance - pub const KeyLimit: u32 = 32; // Max 32 bytes per key - pub const ValueLimit: u32 = 64; // Max 64 bytes per value + pub const UniquesCollectionDeposit: Balance = 10 * UNITS; // 10 UNIT deposit to create uniques class + pub const UniquesItemDeposit: Balance = UNITS / 100; // 1 / 100 UNIT deposit to create uniques instance pub const UniquesMetadataDepositBase: Balance = deposit(1, 129); - pub const AttributeDepositBase: Balance = deposit(1, 0); - pub const DepositPerByte: Balance = deposit(0, 1); - pub const UniquesStringLimit: u32 = 128; + pub const UniquesAttributeDepositBase: Balance = deposit(1, 0); + pub const UniquesDepositPerByte: Balance = deposit(0, 1); } impl pallet_uniques::Config for Runtime { @@ -589,14 +606,14 @@ impl pallet_uniques::Config for Runtime { type ItemId = u32; type Currency = Balances; type ForceOrigin = AssetsForceOrigin; - type CollectionDeposit = CollectionDeposit; - type ItemDeposit = ItemDeposit; + type CollectionDeposit = UniquesCollectionDeposit; + type ItemDeposit = UniquesItemDeposit; type MetadataDepositBase = UniquesMetadataDepositBase; - type AttributeDepositBase = AttributeDepositBase; - type DepositPerByte = DepositPerByte; - type StringLimit = UniquesStringLimit; - type KeyLimit = KeyLimit; - type ValueLimit = ValueLimit; + type AttributeDepositBase = UniquesAttributeDepositBase; + type DepositPerByte = UniquesDepositPerByte; + type StringLimit = ConstU32<128>; + type KeyLimit = ConstU32<32>; // Max 32 bytes per key + type ValueLimit = ConstU32<64>; // Max 64 bytes per value type WeightInfo = weights::pallet_uniques::WeightInfo; #[cfg(feature = "runtime-benchmarks")] type Helper = (); @@ -604,6 +621,46 @@ impl pallet_uniques::Config for Runtime { type Locker = (); } +parameter_types! { + pub NftsPalletFeatures: PalletFeatures = PalletFeatures::all_enabled(); + pub const NftsMaxDeadlineDuration: BlockNumber = 12 * 30 * DAYS; + // re-use the Uniques deposits + pub const NftsCollectionDeposit: Balance = UniquesCollectionDeposit::get(); + pub const NftsItemDeposit: Balance = UniquesItemDeposit::get(); + pub const NftsMetadataDepositBase: Balance = UniquesMetadataDepositBase::get(); + pub const NftsAttributeDepositBase: Balance = UniquesAttributeDepositBase::get(); + pub const NftsDepositPerByte: Balance = UniquesDepositPerByte::get(); +} + +impl pallet_nfts::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type CollectionId = u32; + type ItemId = u32; + type Currency = Balances; + type CreateOrigin = AsEnsureOriginWithArg>; + type ForceOrigin = AssetsForceOrigin; + type Locker = (); + type CollectionDeposit = NftsCollectionDeposit; + type ItemDeposit = NftsItemDeposit; + type MetadataDepositBase = NftsMetadataDepositBase; + type AttributeDepositBase = NftsAttributeDepositBase; + type DepositPerByte = NftsDepositPerByte; + type StringLimit = ConstU32<256>; + type KeyLimit = ConstU32<64>; + type ValueLimit = ConstU32<256>; + type ApprovalsLimit = ConstU32<20>; + type ItemAttributesApprovalsLimit = ConstU32<30>; + type MaxTips = ConstU32<10>; + type MaxDeadlineDuration = NftsMaxDeadlineDuration; + type MaxAttributesPerCall = ConstU32<10>; + type Features = NftsPalletFeatures; + type OffchainSignature = Signature; + type OffchainPublic = ::Signer; + type WeightInfo = weights::pallet_nfts::WeightInfo; + #[cfg(feature = "runtime-benchmarks")] + type Helper = (); +} + // Create the runtime by composing the FRAME pallets that were previously configured. construct_runtime!( pub enum Runtime where @@ -646,6 +703,7 @@ construct_runtime!( // The main stage. Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, + Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, } ); @@ -697,6 +755,7 @@ mod benches { [pallet_assets, Assets] [pallet_balances, Balances] [pallet_multisig, Multisig] + [pallet_nfts, Nfts] [pallet_proxy, Proxy] [pallet_session, SessionBench::] [pallet_uniques, Uniques] diff --git a/parachains/runtimes/assets/statemint/src/weights/mod.rs b/parachains/runtimes/assets/statemint/src/weights/mod.rs index 5dd6ffd662e..92af360ced1 100644 --- a/parachains/runtimes/assets/statemint/src/weights/mod.rs +++ b/parachains/runtimes/assets/statemint/src/weights/mod.rs @@ -6,6 +6,7 @@ pub mod pallet_assets; pub mod pallet_balances; pub mod pallet_collator_selection; pub mod pallet_multisig; +pub mod pallet_nfts; pub mod pallet_proxy; pub mod pallet_session; pub mod pallet_timestamp; diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_nfts.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_nfts.rs new file mode 100644 index 00000000000..1f1f718c9c5 --- /dev/null +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_nfts.rs @@ -0,0 +1,763 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_nfts` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_nfts +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_nfts.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_nfts`. +pub struct WeightInfo(PhantomData); +impl pallet_nfts::WeightInfo for WeightInfo { + /// Storage: Nfts NextCollectionId (r:1 w:1) + /// Proof: Nfts NextCollectionId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:0 w:1) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:0 w:1) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts CollectionAccount (r:0 w:1) + /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + fn create() -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `3549` + // Minimum execution time: 39_589_000 picoseconds. + Weight::from_parts(40_305_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: Nfts NextCollectionId (r:1 w:1) + /// Proof: Nfts NextCollectionId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:0 w:1) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:0 w:1) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts CollectionAccount (r:0 w:1) + /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + fn force_create() -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `3549` + // Minimum execution time: 23_945_000 picoseconds. + Weight::from_parts(24_351_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts ItemMetadataOf (r:1 w:0) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:1) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1001 w:1000) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1000 w:1000) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts CollectionMetadataOf (r:0 w:1) + /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(294), added: 2769, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:0 w:1) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts CollectionAccount (r:0 w:1) + /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// The range of component `m` is `[0, 1000]`. + /// The range of component `c` is `[0, 1000]`. + /// The range of component `a` is `[0, 1000]`. + fn destroy(_m: u32, _c: u32, a: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `32170 + a * (366 ±0)` + // Estimated: `2523990 + a * (2954 ±0)` + // Minimum execution time: 992_533_000 picoseconds. + Weight::from_parts(941_813_359, 0) + .saturating_add(Weight::from_parts(0, 2523990)) + // Standard Error: 3_954 + .saturating_add(Weight::from_parts(5_784_754, 0).saturating_mul(a.into())) + .saturating_add(T::DbWeight::get().reads(1004)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) + .saturating_add(T::DbWeight::get().writes(1005)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(a.into())) + } + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts Item (r:1 w:1) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:1) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts Account (r:0 w:1) + /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + fn mint() -> Weight { + // Proof Size summary in bytes: + // Measured: `421` + // Estimated: `4326` + // Minimum execution time: 49_305_000 picoseconds. + Weight::from_parts(50_143_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts Item (r:1 w:1) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:1) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts Account (r:0 w:1) + /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + fn force_mint() -> Weight { + // Proof Size summary in bytes: + // Measured: `421` + // Estimated: `4326` + // Minimum execution time: 48_627_000 picoseconds. + Weight::from_parts(48_954_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: Nfts ItemConfigOf (r:1 w:1) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Item (r:1 w:1) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts ItemMetadataOf (r:1 w:0) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) + /// Storage: Nfts Account (r:0 w:1) + /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + /// Storage: Nfts ItemPriceOf (r:0 w:1) + /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) + /// Storage: Nfts ItemAttributesApprovalsOf (r:0 w:1) + /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(1001), added: 3476, mode: MaxEncodedLen) + /// Storage: Nfts PendingSwapOf (r:0 w:1) + /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + fn burn() -> Weight { + // Proof Size summary in bytes: + // Measured: `530` + // Estimated: `4326` + // Minimum execution time: 49_958_000 picoseconds. + Weight::from_parts(50_387_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(7)) + } + /// Storage: Nfts Collection (r:1 w:0) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:0) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts Item (r:1 w:1) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts Account (r:0 w:2) + /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + /// Storage: Nfts ItemPriceOf (r:0 w:1) + /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) + /// Storage: Nfts PendingSwapOf (r:0 w:1) + /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + fn transfer() -> Weight { + // Proof Size summary in bytes: + // Measured: `559` + // Estimated: `4326` + // Minimum execution time: 36_267_000 picoseconds. + Weight::from_parts(36_712_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: Nfts Collection (r:1 w:0) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts Item (r:5000 w:5000) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// The range of component `i` is `[0, 5000]`. + fn redeposit(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `729 + i * (108 ±0)` + // Estimated: `3549 + i * (3336 ±0)` + // Minimum execution time: 17_738_000 picoseconds. + Weight::from_parts(17_801_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) + // Standard Error: 13_596 + .saturating_add(Weight::from_parts(15_695_790, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) + .saturating_add(Weight::from_parts(0, 3336).saturating_mul(i.into())) + } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:1) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + fn lock_item_transfer() -> Weight { + // Proof Size summary in bytes: + // Measured: `401` + // Estimated: `3534` + // Minimum execution time: 20_845_000 picoseconds. + Weight::from_parts(21_133_000, 0) + .saturating_add(Weight::from_parts(0, 3534)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:1) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + fn unlock_item_transfer() -> Weight { + // Proof Size summary in bytes: + // Measured: `401` + // Estimated: `3534` + // Minimum execution time: 20_862_000 picoseconds. + Weight::from_parts(21_105_000, 0) + .saturating_add(Weight::from_parts(0, 3534)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts Collection (r:1 w:0) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:1) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn lock_collection() -> Weight { + // Proof Size summary in bytes: + // Measured: `306` + // Estimated: `3549` + // Minimum execution time: 18_196_000 picoseconds. + Weight::from_parts(18_333_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts OwnershipAcceptance (r:1 w:1) + /// Proof: Nfts OwnershipAcceptance (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionAccount (r:0 w:2) + /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + fn transfer_ownership() -> Weight { + // Proof Size summary in bytes: + // Measured: `354` + // Estimated: `3549` + // Minimum execution time: 24_025_000 picoseconds. + Weight::from_parts(24_277_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:2 w:4) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + fn set_team() -> Weight { + // Proof Size summary in bytes: + // Measured: `335` + // Estimated: `6078` + // Minimum execution time: 40_974_000 picoseconds. + Weight::from_parts(41_706_000, 0) + .saturating_add(Weight::from_parts(0, 6078)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionAccount (r:0 w:2) + /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + fn force_collection_owner() -> Weight { + // Proof Size summary in bytes: + // Measured: `277` + // Estimated: `3549` + // Minimum execution time: 19_044_000 picoseconds. + Weight::from_parts(19_465_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: Nfts Collection (r:1 w:0) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:0 w:1) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn force_collection_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `242` + // Estimated: `3549` + // Minimum execution time: 15_591_000 picoseconds. + Weight::from_parts(15_858_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:1) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + fn lock_item_properties() -> Weight { + // Proof Size summary in bytes: + // Measured: `401` + // Estimated: `3534` + // Minimum execution time: 20_831_000 picoseconds. + Weight::from_parts(21_121_000, 0) + .saturating_add(Weight::from_parts(0, 3534)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:0) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1 w:1) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + fn set_attribute() -> Weight { + // Proof Size summary in bytes: + // Measured: `505` + // Estimated: `3944` + // Minimum execution time: 50_650_000 picoseconds. + Weight::from_parts(51_315_000, 0) + .saturating_add(Weight::from_parts(0, 3944)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1 w:1) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + fn force_set_attribute() -> Weight { + // Proof Size summary in bytes: + // Measured: `310` + // Estimated: `3944` + // Minimum execution time: 28_244_000 picoseconds. + Weight::from_parts(28_627_000, 0) + .saturating_add(Weight::from_parts(0, 3944)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Nfts Attribute (r:1 w:1) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:0) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + fn clear_attribute() -> Weight { + // Proof Size summary in bytes: + // Measured: `949` + // Estimated: `3944` + // Minimum execution time: 47_299_000 picoseconds. + Weight::from_parts(47_921_000, 0) + .saturating_add(Weight::from_parts(0, 3944)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Nfts Item (r:1 w:0) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) + /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(1001), added: 3476, mode: MaxEncodedLen) + fn approve_item_attributes() -> Weight { + // Proof Size summary in bytes: + // Measured: `347` + // Estimated: `4466` + // Minimum execution time: 19_400_000 picoseconds. + Weight::from_parts(19_601_000, 0) + .saturating_add(Weight::from_parts(0, 4466)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts Item (r:1 w:0) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) + /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(1001), added: 3476, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1001 w:1000) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `n` is `[0, 1000]`. + fn cancel_item_attributes_approval(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `726 + n * (398 ±0)` + // Estimated: `4466 + n * (2954 ±0)` + // Minimum execution time: 28_552_000 picoseconds. + Weight::from_parts(28_822_000, 0) + .saturating_add(Weight::from_parts(0, 4466)) + // Standard Error: 3_265 + .saturating_add(Weight::from_parts(5_570_824, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) + } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:0) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts ItemMetadataOf (r:1 w:1) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) + fn set_metadata() -> Weight { + // Proof Size summary in bytes: + // Measured: `505` + // Estimated: `3812` + // Minimum execution time: 42_425_000 picoseconds. + Weight::from_parts(42_883_000, 0) + .saturating_add(Weight::from_parts(0, 3812)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts ItemMetadataOf (r:1 w:1) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:0) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + fn clear_metadata() -> Weight { + // Proof Size summary in bytes: + // Measured: `815` + // Estimated: `3812` + // Minimum execution time: 40_219_000 picoseconds. + Weight::from_parts(41_709_000, 0) + .saturating_add(Weight::from_parts(0, 3812)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionMetadataOf (r:1 w:1) + /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(294), added: 2769, mode: MaxEncodedLen) + fn set_collection_metadata() -> Weight { + // Proof Size summary in bytes: + // Measured: `364` + // Estimated: `3759` + // Minimum execution time: 39_376_000 picoseconds. + Weight::from_parts(39_895_000, 0) + .saturating_add(Weight::from_parts(0, 3759)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:0) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts CollectionMetadataOf (r:1 w:1) + /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(294), added: 2769, mode: MaxEncodedLen) + fn clear_collection_metadata() -> Weight { + // Proof Size summary in bytes: + // Measured: `682` + // Estimated: `3759` + // Minimum execution time: 38_414_000 picoseconds. + Weight::from_parts(38_627_000, 0) + .saturating_add(Weight::from_parts(0, 3759)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts Item (r:1 w:1) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn approve_transfer() -> Weight { + // Proof Size summary in bytes: + // Measured: `376` + // Estimated: `4326` + // Minimum execution time: 22_896_000 picoseconds. + Weight::from_parts(23_137_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts Item (r:1 w:1) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + fn cancel_approval() -> Weight { + // Proof Size summary in bytes: + // Measured: `384` + // Estimated: `4326` + // Minimum execution time: 20_602_000 picoseconds. + Weight::from_parts(20_869_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts Item (r:1 w:1) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + fn clear_all_transfer_approvals() -> Weight { + // Proof Size summary in bytes: + // Measured: `384` + // Estimated: `4326` + // Minimum execution time: 19_415_000 picoseconds. + Weight::from_parts(19_594_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts OwnershipAcceptance (r:1 w:1) + /// Proof: Nfts OwnershipAcceptance (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + fn set_accept_ownership() -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `3517` + // Minimum execution time: 16_784_000 picoseconds. + Weight::from_parts(17_133_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts CollectionConfigOf (r:1 w:1) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:0) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + fn set_collection_max_supply() -> Weight { + // Proof Size summary in bytes: + // Measured: `306` + // Estimated: `3549` + // Minimum execution time: 20_391_000 picoseconds. + Weight::from_parts(20_710_000, 0) + .saturating_add(Weight::from_parts(0, 3549)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts CollectionRoleOf (r:1 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:1) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn update_mint_settings() -> Weight { + // Proof Size summary in bytes: + // Measured: `289` + // Estimated: `3538` + // Minimum execution time: 19_989_000 picoseconds. + Weight::from_parts(20_179_000, 0) + .saturating_add(Weight::from_parts(0, 3538)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts Item (r:1 w:0) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:0) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts ItemPriceOf (r:0 w:1) + /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) + fn set_price() -> Weight { + // Proof Size summary in bytes: + // Measured: `484` + // Estimated: `4326` + // Minimum execution time: 24_308_000 picoseconds. + Weight::from_parts(24_721_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts Item (r:1 w:1) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts ItemPriceOf (r:1 w:1) + /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:0) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:0) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts Account (r:0 w:2) + /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + /// Storage: Nfts PendingSwapOf (r:0 w:1) + /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + fn buy_item() -> Weight { + // Proof Size summary in bytes: + // Measured: `671` + // Estimated: `4326` + // Minimum execution time: 45_626_000 picoseconds. + Weight::from_parts(46_030_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// The range of component `n` is `[0, 10]`. + fn pay_tips(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_654_000 picoseconds. + Weight::from_parts(4_301_940, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 9_223 + .saturating_add(Weight::from_parts(3_945_966, 0).saturating_mul(n.into())) + } + /// Storage: Nfts Item (r:2 w:0) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts PendingSwapOf (r:0 w:1) + /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + fn create_swap() -> Weight { + // Proof Size summary in bytes: + // Measured: `460` + // Estimated: `7662` + // Minimum execution time: 23_071_000 picoseconds. + Weight::from_parts(23_535_000, 0) + .saturating_add(Weight::from_parts(0, 7662)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts PendingSwapOf (r:1 w:1) + /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + /// Storage: Nfts Item (r:1 w:0) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + fn cancel_swap() -> Weight { + // Proof Size summary in bytes: + // Measured: `479` + // Estimated: `4326` + // Minimum execution time: 21_554_000 picoseconds. + Weight::from_parts(21_941_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Nfts Item (r:2 w:2) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts PendingSwapOf (r:1 w:2) + /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:0) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:2 w:0) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts Account (r:0 w:4) + /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + /// Storage: Nfts ItemPriceOf (r:0 w:2) + /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) + fn claim_swap() -> Weight { + // Proof Size summary in bytes: + // Measured: `800` + // Estimated: `7662` + // Minimum execution time: 74_272_000 picoseconds. + Weight::from_parts(75_374_000, 0) + .saturating_add(Weight::from_parts(0, 7662)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(10)) + } + /// Storage: Nfts CollectionRoleOf (r:2 w:0) + /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts Item (r:1 w:1) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:1) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:10 w:10) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + /// Storage: Nfts ItemMetadataOf (r:1 w:1) + /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) + /// Storage: Nfts Account (r:0 w:1) + /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + /// The range of component `n` is `[0, 10]`. + fn mint_pre_signed(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `524` + // Estimated: `6078 + n * (2954 ±0)` + // Minimum execution time: 133_545_000 picoseconds. + Weight::from_parts(137_797_962, 0) + .saturating_add(Weight::from_parts(0, 6078)) + // Standard Error: 33_124 + .saturating_add(Weight::from_parts(29_785_862, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().writes(6)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) + } + /// Storage: Nfts Item (r:1 w:0) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) + /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(1001), added: 3476, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:10 w:10) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `n` is `[0, 10]`. + fn set_attributes_pre_signed(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `554` + // Estimated: `4466 + n * (2954 ±0)` + // Minimum execution time: 77_475_000 picoseconds. + Weight::from_parts(88_353_947, 0) + .saturating_add(Weight::from_parts(0, 4466)) + // Standard Error: 60_491 + .saturating_add(Weight::from_parts(29_507_037, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) + } +} diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index c12631dd414..5960b35d9cf 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -214,7 +214,44 @@ impl Contains for SafeCallFilter { pallet_assets::Call::transfer_approved { .. } | pallet_assets::Call::touch { .. } | pallet_assets::Call::refund { .. }, - ) | RuntimeCall::Uniques( + ) | RuntimeCall::Nfts( + pallet_nfts::Call::create { .. } | + pallet_nfts::Call::force_create { .. } | + pallet_nfts::Call::destroy { .. } | + pallet_nfts::Call::mint { .. } | + pallet_nfts::Call::force_mint { .. } | + pallet_nfts::Call::burn { .. } | + pallet_nfts::Call::transfer { .. } | + pallet_nfts::Call::lock_item_transfer { .. } | + pallet_nfts::Call::unlock_item_transfer { .. } | + pallet_nfts::Call::lock_collection { .. } | + pallet_nfts::Call::transfer_ownership { .. } | + pallet_nfts::Call::set_team { .. } | + pallet_nfts::Call::force_collection_owner { .. } | + pallet_nfts::Call::force_collection_config { .. } | + pallet_nfts::Call::approve_transfer { .. } | + pallet_nfts::Call::cancel_approval { .. } | + pallet_nfts::Call::clear_all_transfer_approvals { .. } | + pallet_nfts::Call::lock_item_properties { .. } | + pallet_nfts::Call::set_attribute { .. } | + pallet_nfts::Call::force_set_attribute { .. } | + pallet_nfts::Call::clear_attribute { .. } | + pallet_nfts::Call::approve_item_attributes { .. } | + pallet_nfts::Call::cancel_item_attributes_approval { .. } | + pallet_nfts::Call::set_metadata { .. } | + pallet_nfts::Call::clear_metadata { .. } | + pallet_nfts::Call::set_collection_metadata { .. } | + pallet_nfts::Call::clear_collection_metadata { .. } | + pallet_nfts::Call::set_accept_ownership { .. } | + pallet_nfts::Call::set_collection_max_supply { .. } | + pallet_nfts::Call::update_mint_settings { .. } | + pallet_nfts::Call::set_price { .. } | + pallet_nfts::Call::buy_item { .. } | + pallet_nfts::Call::pay_tips { .. } | + pallet_nfts::Call::create_swap { .. } | + pallet_nfts::Call::cancel_swap { .. } | + pallet_nfts::Call::claim_swap { .. }, + ) | RuntimeCall::Uniques( pallet_uniques::Call::create { .. } | pallet_uniques::Call::force_create { .. } | pallet_uniques::Call::destroy { .. } | From 014ce4b3f3903b80e8b4d813a18e0add6d835ef1 Mon Sep 17 00:00:00 2001 From: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Tue, 23 May 2023 11:59:52 +0200 Subject: [PATCH 214/339] Try-runtime proper return types (#2615) * Try-runtime proper return types * update * update pallet-xcm --- Cargo.lock | 518 +++++++++--------- .../src/fellowship/migration.rs | 24 +- 2 files changed, 271 insertions(+), 271 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a8e6be92aa8..70040aae764 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -580,7 +580,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "hash-db", "log", @@ -3808,7 +3808,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", ] @@ -3831,7 +3831,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-support-procedural", @@ -3856,7 +3856,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3903,7 +3903,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3914,7 +3914,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3931,7 +3931,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-system", @@ -3960,7 +3960,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-recursion", "futures", @@ -3981,7 +3981,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "bitflags", "environmental", @@ -4015,7 +4015,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "Inflector", "cfg-expr", @@ -4031,7 +4031,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4043,7 +4043,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "proc-macro2", "quote", @@ -4053,7 +4053,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "cfg-if", "frame-support", @@ -4072,7 +4072,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -4087,7 +4087,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "sp-api", @@ -4096,7 +4096,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "parity-scale-codec", @@ -5188,7 +5188,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bitvec", "frame-benchmarking", @@ -5287,7 +5287,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "frame-support", "polkadot-primitives", @@ -6169,7 +6169,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "futures", "log", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "anyhow", "jsonrpsee", @@ -6707,7 +6707,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6728,7 +6728,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "frame-benchmarking", "frame-support", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "frame-benchmarking", "frame-support", @@ -6761,7 +6761,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "frame-support", "frame-system", @@ -6777,7 +6777,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-system", @@ -6793,7 +6793,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-system", @@ -6807,7 +6807,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6851,7 +6851,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6866,7 +6866,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-system", @@ -6885,7 +6885,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6909,7 +6909,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7059,7 +7059,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7076,7 +7076,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "bitflags", "environmental", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "bitflags", "parity-scale-codec", @@ -7119,7 +7119,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "proc-macro2", "quote", @@ -7129,7 +7129,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7146,7 +7146,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7164,7 +7164,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7187,7 +7187,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7200,7 +7200,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7218,7 +7218,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7236,7 +7236,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "blake2", "frame-benchmarking", @@ -7254,7 +7254,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7277,7 +7277,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7293,7 +7293,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7313,7 +7313,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7330,7 +7330,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "frame-support", "frame-system", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7380,7 +7380,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7397,7 +7397,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7413,7 +7413,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7431,7 +7431,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "frame-support", "pallet-nfts", @@ -7442,7 +7442,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-system", @@ -7475,7 +7475,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7495,7 +7495,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7506,7 +7506,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-system", @@ -7523,7 +7523,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7562,7 +7562,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7579,7 +7579,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7594,7 +7594,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7612,7 +7612,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7627,7 +7627,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7646,7 +7646,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7663,7 +7663,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-system", @@ -7684,7 +7684,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7700,7 +7700,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-system", @@ -7714,7 +7714,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7737,7 +7737,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7748,7 +7748,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "log", "sp-arithmetic", @@ -7757,7 +7757,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "sp-api", @@ -7766,7 +7766,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7783,7 +7783,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7798,7 +7798,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7816,7 +7816,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7835,7 +7835,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-system", @@ -7851,7 +7851,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7867,7 +7867,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7879,7 +7879,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7896,7 +7896,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7911,7 +7911,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7927,7 +7927,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7942,7 +7942,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7957,7 +7957,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7978,7 +7978,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8589,7 +8589,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8605,7 +8605,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8619,7 +8619,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "derive_more", "fatality", @@ -8642,7 +8642,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "fatality", "futures", @@ -8663,7 +8663,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "clap 4.2.7", "frame-benchmarking-cli", @@ -8692,7 +8692,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "async-trait", "frame-benchmarking", @@ -8735,7 +8735,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "always-assert", "bitvec", @@ -8757,7 +8757,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "parity-scale-codec", "scale-info", @@ -8769,7 +8769,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "derive_more", "fatality", @@ -8794,7 +8794,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8808,7 +8808,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "futures", "futures-timer", @@ -8828,7 +8828,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "always-assert", "async-trait", @@ -8851,7 +8851,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "futures", "parity-scale-codec", @@ -8869,7 +8869,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bitvec", "derive_more", @@ -8898,7 +8898,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bitvec", "futures", @@ -8919,7 +8919,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bitvec", "fatality", @@ -8938,7 +8938,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8953,7 +8953,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "async-trait", "futures", @@ -8973,7 +8973,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "futures", "polkadot-node-metrics", @@ -8988,7 +8988,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "futures", "futures-timer", @@ -9005,7 +9005,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "fatality", "futures", @@ -9024,7 +9024,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "async-trait", "futures", @@ -9041,7 +9041,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bitvec", "fatality", @@ -9059,7 +9059,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "always-assert", "futures", @@ -9086,7 +9086,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "futures", "polkadot-node-primitives", @@ -9102,7 +9102,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "assert_matches", "cpu-time", @@ -9131,7 +9131,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "futures", "lru 0.9.0", @@ -9146,7 +9146,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "lazy_static", "log", @@ -9164,7 +9164,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bs58", "futures", @@ -9183,7 +9183,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "async-trait", "derive_more", @@ -9205,7 +9205,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bounded-vec", "futures", @@ -9227,7 +9227,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9237,7 +9237,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "async-trait", "futures", @@ -9255,7 +9255,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "async-trait", "derive_more", @@ -9278,7 +9278,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "async-trait", "derive_more", @@ -9311,7 +9311,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "async-trait", "futures", @@ -9334,7 +9334,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bounded-collections", "derive_more", @@ -9433,7 +9433,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9451,7 +9451,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9477,7 +9477,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9509,7 +9509,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bitvec", "frame-benchmarking", @@ -9604,7 +9604,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bitvec", "frame-benchmarking", @@ -9650,7 +9650,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "frame-support", "polkadot-primitives", @@ -9664,7 +9664,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bs58", "parity-scale-codec", @@ -9676,7 +9676,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bitflags", "bitvec", @@ -9721,7 +9721,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9831,7 +9831,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9852,7 +9852,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9862,7 +9862,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9887,7 +9887,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9948,7 +9948,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "frame-benchmarking", "frame-system", @@ -10740,7 +10740,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10827,7 +10827,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "frame-support", "polkadot-primitives", @@ -11074,7 +11074,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "log", "sp-core", @@ -11085,7 +11085,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "futures", @@ -11114,7 +11114,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "futures", "futures-timer", @@ -11137,7 +11137,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11152,7 +11152,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11171,7 +11171,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11182,7 +11182,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11222,7 +11222,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "fnv", "futures", @@ -11249,7 +11249,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "hash-db", "kvdb", @@ -11275,7 +11275,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "futures", @@ -11300,7 +11300,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "async-trait", "futures", @@ -11329,7 +11329,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "fork-tree", @@ -11365,7 +11365,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "futures", "jsonrpsee", @@ -11387,7 +11387,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11422,7 +11422,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "futures", "jsonrpsee", @@ -11441,7 +11441,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11454,7 +11454,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11494,7 +11494,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "finality-grandpa", "futures", @@ -11514,7 +11514,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "futures", @@ -11537,7 +11537,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11561,7 +11561,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11574,7 +11574,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "log", "sc-allocator", @@ -11587,7 +11587,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "anyhow", "cfg-if", @@ -11605,7 +11605,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "ansi_term", "futures", @@ -11621,7 +11621,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11635,7 +11635,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11680,7 +11680,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "cid", "futures", @@ -11700,7 +11700,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11728,7 +11728,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "ahash 0.8.2", "futures", @@ -11747,7 +11747,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11769,7 +11769,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11803,7 +11803,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11823,7 +11823,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11854,7 +11854,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "futures", "libp2p-identity", @@ -11867,7 +11867,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11876,7 +11876,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "futures", "jsonrpsee", @@ -11907,7 +11907,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11926,7 +11926,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "http", "jsonrpsee", @@ -11941,7 +11941,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11967,7 +11967,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "directories", @@ -12033,7 +12033,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "log", "parity-scale-codec", @@ -12044,7 +12044,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "clap 4.2.7", "fs4", @@ -12060,7 +12060,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12079,7 +12079,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "futures", "libc", @@ -12098,7 +12098,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "chrono", "futures", @@ -12117,7 +12117,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "ansi_term", "atty", @@ -12148,7 +12148,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12159,7 +12159,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "futures", @@ -12186,7 +12186,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "futures", @@ -12200,7 +12200,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-channel", "futures", @@ -12681,7 +12681,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "enumn", "parity-scale-codec", @@ -12758,7 +12758,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "hash-db", "log", @@ -12778,7 +12778,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "Inflector", "blake2", @@ -12792,7 +12792,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "scale-info", @@ -12805,7 +12805,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "integer-sqrt", "num-traits", @@ -12819,7 +12819,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "scale-info", @@ -12832,7 +12832,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "sp-api", @@ -12844,7 +12844,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "futures", "log", @@ -12862,7 +12862,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "futures", @@ -12877,7 +12877,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "parity-scale-codec", @@ -12895,7 +12895,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "parity-scale-codec", @@ -12916,7 +12916,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12935,7 +12935,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "finality-grandpa", "log", @@ -12953,7 +12953,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "scale-info", @@ -12965,7 +12965,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13009,7 +13009,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "blake2b_simd", "byteorder", @@ -13023,7 +13023,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "proc-macro2", "quote", @@ -13034,7 +13034,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13043,7 +13043,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "proc-macro2", "quote", @@ -13053,7 +13053,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "environmental", "parity-scale-codec", @@ -13064,7 +13064,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13079,7 +13079,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "bytes", "ed25519", @@ -13105,7 +13105,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "lazy_static", "sp-core", @@ -13116,7 +13116,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "futures", "parity-scale-codec", @@ -13130,7 +13130,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13139,7 +13139,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13150,7 +13150,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13168,7 +13168,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "scale-info", @@ -13182,7 +13182,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "sp-api", "sp-core", @@ -13192,7 +13192,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "backtrace", "lazy_static", @@ -13202,7 +13202,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "rustc-hash", "serde", @@ -13212,7 +13212,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "either", "hash256-std-hasher", @@ -13234,7 +13234,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13252,7 +13252,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "Inflector", "proc-macro-crate", @@ -13264,7 +13264,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "scale-info", @@ -13278,7 +13278,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "scale-info", @@ -13291,7 +13291,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "hash-db", "log", @@ -13311,7 +13311,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "log", "parity-scale-codec", @@ -13329,12 +13329,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13347,7 +13347,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "futures-timer", @@ -13362,7 +13362,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "sp-std", @@ -13374,7 +13374,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "sp-api", "sp-runtime", @@ -13383,7 +13383,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "log", @@ -13399,7 +13399,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13422,7 +13422,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13439,7 +13439,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13450,7 +13450,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13464,7 +13464,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "parity-scale-codec", "scale-info", @@ -13827,7 +13827,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "platforms 2.0.0", ] @@ -13835,7 +13835,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13854,7 +13854,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "hyper", "log", @@ -13866,7 +13866,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "jsonrpsee", @@ -13879,7 +13879,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "jsonrpsee", "log", @@ -13898,7 +13898,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13924,7 +13924,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13934,7 +13934,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13945,7 +13945,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "ansi_term", "build-helper", @@ -14072,7 +14072,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "frame-support", "polkadot-primitives", @@ -14469,7 +14469,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14480,7 +14480,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14610,7 +14610,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#20bd05cac4112a8455ec542e83313e22fcc77ddb" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "clap 4.2.7", @@ -15543,7 +15543,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bitvec", "frame-benchmarking", @@ -15636,7 +15636,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "frame-support", "polkadot-primitives", @@ -16138,7 +16138,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "bounded-collections", "derivative", @@ -16154,7 +16154,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "frame-support", "frame-system", @@ -16209,7 +16209,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "environmental", "frame-benchmarking", @@ -16229,7 +16229,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#cbd5330173383e752a94bfa367b6db51930be87d" +source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs index 71ad62f70b3..8ceb1c403b0 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs @@ -90,11 +90,11 @@ pub(crate) mod import_kusama_fellowship { ::AccountId: From<[u8; 32]>, { #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, &'static str> { + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { let onchain_version = RankedCollective::::on_chain_storage_version(); - assert_eq!(onchain_version, 0, "the storage version must be 0."); + ensure!(onchain_version == 0, "the storage version must be 0."); let member_count = MemberCount::::get(0); - assert_eq!(member_count, 0, "the collective must be uninitialized."); + ensure!(member_count == 0, "the collective must be uninitialized."); Ok(Vec::new()) } @@ -143,15 +143,15 @@ pub(crate) mod import_kusama_fellowship { } #[cfg(feature = "try-runtime")] - fn post_upgrade(_state: Vec) -> Result<(), &'static str> { - assert_eq!(MemberCount::::get(0), 47, "invalid members count at rank 0."); - assert_eq!(MemberCount::::get(1), 47, "invalid members count at rank 1."); - assert_eq!(MemberCount::::get(2), 24, "invalid members count at rank 2."); - assert_eq!(MemberCount::::get(3), 17, "invalid members count at rank 3."); - assert_eq!(MemberCount::::get(4), 10, "invalid members count at rank 4."); - assert_eq!(MemberCount::::get(5), 7, "invalid members count at rank 5."); - assert_eq!(MemberCount::::get(6), 3, "invalid members count at rank 6."); - assert_eq!(MemberCount::::get(7), 0, "invalid members count at rank 7."); + fn post_upgrade(_state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { + ensure!(MemberCount::::get(0) == 47, "invalid members count at rank 0."); + ensure!(MemberCount::::get(1) == 47, "invalid members count at rank 1."); + ensure!(MemberCount::::get(2) == 24, "invalid members count at rank 2."); + ensure!(MemberCount::::get(3) == 17, "invalid members count at rank 3."); + ensure!(MemberCount::::get(4) == 10, "invalid members count at rank 4."); + ensure!(MemberCount::::get(5) == 7, "invalid members count at rank 5."); + ensure!(MemberCount::::get(6) == 3, "invalid members count at rank 6."); + ensure!(MemberCount::::get(7) == 0, "invalid members count at rank 7."); Ok(()) } } From 175643f6abcd2238545cea544a937bfae8d0d940 Mon Sep 17 00:00:00 2001 From: Jegor Sidorenko <5252494+jsidorenko@users.noreply.github.com> Date: Tue, 23 May 2023 13:04:44 +0200 Subject: [PATCH 215/339] NFT Fractionalization on Westmint (#2600) * NFT Fractionalization on Westmint * Typos * One more typo * Undo Cargo.lock * Point to master * Referense the first instance of the assets pallet * Update cargo.lock --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 48 +++++++++----- .../runtimes/assets/westmint/Cargo.toml | 4 ++ .../runtimes/assets/westmint/src/lib.rs | 49 +++++++++++++-- .../assets/westmint/src/weights/mod.rs | 1 + .../weights/pallet_nft_fractionalization.rs | 63 +++++++++++++++++++ .../assets/westmint/src/xcm_config.rs | 3 + 6 files changed, 149 insertions(+), 19 deletions(-) create mode 100644 parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs diff --git a/Cargo.lock b/Cargo.lock index 70040aae764..e8f126ed221 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6707,7 +6707,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6728,7 +6728,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6761,7 +6761,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-system", @@ -7076,7 +7076,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "bitflags", "environmental", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "bitflags", "parity-scale-codec", @@ -7119,7 +7119,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "proc-macro2", "quote", @@ -7236,7 +7236,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "blake2", "frame-benchmarking", @@ -7330,7 +7330,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "frame-system", @@ -7410,10 +7410,27 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-nft-fractionalization" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-assets", + "pallet-nfts", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7431,7 +7448,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-support", "pallet-nfts", @@ -7896,7 +7913,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "frame-benchmarking", "frame-support", @@ -11300,7 +11317,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "async-trait", "futures", @@ -13924,7 +13941,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13934,7 +13951,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#784ac7e9cf42a88cf5ad105281633f705688bae9" +source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -15678,6 +15695,7 @@ dependencies = [ "pallet-balances", "pallet-collator-selection", "pallet-multisig", + "pallet-nft-fractionalization", "pallet-nfts", "pallet-nfts-runtime-api", "pallet-proxy", diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/westmint/Cargo.toml index b7484ec3122..16d7e606221 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/westmint/Cargo.toml @@ -26,6 +26,7 @@ pallet-aura = { git = "https://github.com/paritytech/substrate", default-feature pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-nft-fractionalization = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-nfts = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-nfts-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-proxy = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -91,6 +92,7 @@ runtime-benchmarks = [ "pallet-assets/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-multisig/runtime-benchmarks", + "pallet-nft-fractionalization/runtime-benchmarks", "pallet-nfts/runtime-benchmarks", "pallet-proxy/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", @@ -121,6 +123,7 @@ try-runtime = [ "pallet-balances/try-runtime", "pallet-collator-selection/try-runtime", "pallet-multisig/try-runtime", + "pallet-nft-fractionalization/try-runtime", "pallet-nfts/try-runtime", "pallet-proxy/try-runtime", "pallet-session/try-runtime", @@ -145,6 +148,7 @@ std = [ "pallet-authorship/std", "pallet-balances/std", "pallet-multisig/std", + "pallet-nft-fractionalization/std", "pallet-nfts/std", "pallet-nfts-runtime-api/std", "pallet-proxy/std", diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 83762145cf6..d4c714b0fa6 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -54,7 +54,7 @@ use frame_support::{ InstanceFilter, }, weights::{ConstantMultiplier, Weight}, - PalletId, RuntimeDebug, + BoundedVec, PalletId, RuntimeDebug, }; use frame_system::{ limits::{BlockLength, BlockWeights}, @@ -68,6 +68,7 @@ use parachains_common::{ Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; +use scale_info::TypeInfo; use xcm_config::{ ForeignAssetsConvertedConcreteId, TrustBackedAssetsConvertedConcreteId, WestendLocation, XcmConfig, XcmOriginToTransactDispatchOrigin, @@ -179,6 +180,15 @@ parameter_types! { pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; } +/// A reason for placing a hold on funds. +#[derive( + Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, MaxEncodedLen, Debug, TypeInfo, +)] +pub enum HoldReason { + /// Used by the NFT Fractionalization Pallet. + NftFractionalization, +} + impl pallet_balances::Config for Runtime { type MaxLocks = ConstU32<50>; /// The type for recording an account's balance. @@ -191,9 +201,9 @@ impl pallet_balances::Config for Runtime { type WeightInfo = weights::pallet_balances::WeightInfo; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type HoldIdentifier = HoldReason; type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; + type MaxHolds = ConstU32<1>; type MaxFreezes = ConstU32<0>; } @@ -376,6 +386,7 @@ impl InstanceFilter for ProxyType { c, RuntimeCall::Balances { .. } | RuntimeCall::Assets { .. } | + RuntimeCall::NftFractionalization { .. } | RuntimeCall::Nfts { .. } | RuntimeCall::Uniques { .. } ), @@ -391,6 +402,7 @@ impl InstanceFilter for ProxyType { RuntimeCall::Assets { .. } | RuntimeCall::Utility { .. } | RuntimeCall::Multisig { .. } | + RuntimeCall::NftFractionalization { .. } | RuntimeCall::Nfts { .. } | RuntimeCall::Uniques { .. } ) }, @@ -624,6 +636,33 @@ impl pallet_uniques::Config for Runtime { type Locker = (); } +parameter_types! { + pub const NftFractionalizationPalletId: PalletId = PalletId(*b"fraction"); + pub NewAssetSymbol: BoundedVec = (*b"FRAC").to_vec().try_into().unwrap(); + pub NewAssetName: BoundedVec = (*b"Frac").to_vec().try_into().unwrap(); + pub const NftFractionalizationHoldReason: HoldReason = HoldReason::NftFractionalization; +} + +impl pallet_nft_fractionalization::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Deposit = AssetDeposit; + type Currency = Balances; + type NewAssetSymbol = NewAssetSymbol; + type NewAssetName = NewAssetName; + type StringLimit = AssetsStringLimit; + type NftCollectionId = ::CollectionId; + type NftId = ::ItemId; + type AssetBalance = ::Balance; + type AssetId = >::AssetId; + type Assets = Assets; + type Nfts = Nfts; + type PalletId = NftFractionalizationPalletId; + type WeightInfo = pallet_nft_fractionalization::weights::SubstrateWeight; + type HoldReason = NftFractionalizationHoldReason; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = (); +} + parameter_types! { pub NftsPalletFeatures: PalletFeatures = PalletFeatures::all_enabled(); pub const NftsMaxDeadlineDuration: BlockNumber = 12 * 30 * DAYS; @@ -708,6 +747,7 @@ construct_runtime!( Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, + NftFractionalization: pallet_nft_fractionalization::{Pallet, Call, Storage, Event} = 54, } ); @@ -736,7 +776,7 @@ pub type UncheckedExtrinsic = /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Migrations to apply on runtime upgrade. -pub type Migrations = (pallet_nfts::migration::v1::MigrateToV1,); +pub type Migrations = (); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< @@ -760,6 +800,7 @@ mod benches { [pallet_assets, ForeignAssets] [pallet_balances, Balances] [pallet_multisig, Multisig] + [pallet_nft_fractionalization, NftFractionalization] [pallet_nfts, Nfts] [pallet_proxy, Proxy] [pallet_session, SessionBench::] diff --git a/parachains/runtimes/assets/westmint/src/weights/mod.rs b/parachains/runtimes/assets/westmint/src/weights/mod.rs index 92af360ced1..0a0188da823 100644 --- a/parachains/runtimes/assets/westmint/src/weights/mod.rs +++ b/parachains/runtimes/assets/westmint/src/weights/mod.rs @@ -6,6 +6,7 @@ pub mod pallet_assets; pub mod pallet_balances; pub mod pallet_collator_selection; pub mod pallet_multisig; +pub mod pallet_nft_fractionalization; pub mod pallet_nfts; pub mod pallet_proxy; pub mod pallet_session; diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs new file mode 100644 index 00000000000..d8db24f50e6 --- /dev/null +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs @@ -0,0 +1,63 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_nfts` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=westmint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_nft_fractionalization +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_nfts`. +pub struct WeightInfo(PhantomData); +impl pallet_nft_fractionalization::WeightInfo for WeightInfo { + fn fractionalize() -> Weight { + // Minimum execution time: 44_312 nanoseconds. + Weight::from_parts(25_147_000, 3549) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) + } + fn unify() -> Weight { + // Minimum execution time: 31_654 nanoseconds. + Weight::from_parts(25_147_000, 3549) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) + } +} diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index c183d6c2676..c802e99e26b 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -271,6 +271,9 @@ impl Contains for SafeCallFilter { pallet_assets::Call::transfer_approved { .. } | pallet_assets::Call::touch { .. } | pallet_assets::Call::refund { .. }, + ) | RuntimeCall::NftFractionalization( + pallet_nft_fractionalization::Call::fractionalize { .. } | + pallet_nft_fractionalization::Call::unify { .. }, ) | RuntimeCall::Nfts( pallet_nfts::Call::create { .. } | pallet_nfts::Call::force_create { .. } | From 0c7ce723addb14ab50ac464a8196e60dec915093 Mon Sep 17 00:00:00 2001 From: Koute Date: Tue, 23 May 2023 21:09:45 +0900 Subject: [PATCH 216/339] Do not assume `AssetId`s are `Copy` (companion for substrate#14158) (#2586) * Do not assume `AssetId`s are `Copy` * update lockfile for {"substrate", "polkadot"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 386 +++++++++--------- parachains/common/src/impls.rs | 4 +- .../runtimes/testing/penpal/src/xcm_config.rs | 2 +- primitives/utility/src/lib.rs | 25 +- 4 files changed, 209 insertions(+), 208 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e8f126ed221..8df34af23b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -580,7 +580,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "hash-db", "log", @@ -3808,7 +3808,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", ] @@ -3831,7 +3831,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-support-procedural", @@ -3856,7 +3856,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3903,7 +3903,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3914,7 +3914,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3931,7 +3931,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-system", @@ -3960,7 +3960,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-recursion", "futures", @@ -3981,7 +3981,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "bitflags", "environmental", @@ -4015,7 +4015,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "Inflector", "cfg-expr", @@ -4031,7 +4031,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4043,7 +4043,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "proc-macro2", "quote", @@ -4053,7 +4053,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "cfg-if", "frame-support", @@ -4072,7 +4072,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -4087,7 +4087,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "sp-api", @@ -4096,7 +4096,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "parity-scale-codec", @@ -6169,7 +6169,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "futures", "log", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "anyhow", "jsonrpsee", @@ -6707,7 +6707,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6728,7 +6728,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -6761,7 +6761,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-system", @@ -6777,7 +6777,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-system", @@ -6793,7 +6793,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-system", @@ -6807,7 +6807,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6851,7 +6851,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -6866,7 +6866,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-system", @@ -6885,7 +6885,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6909,7 +6909,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7059,7 +7059,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7076,7 +7076,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "bitflags", "environmental", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "bitflags", "parity-scale-codec", @@ -7119,7 +7119,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "proc-macro2", "quote", @@ -7129,7 +7129,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7146,7 +7146,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7164,7 +7164,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7187,7 +7187,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7200,7 +7200,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7218,7 +7218,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7236,7 +7236,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "blake2", "frame-benchmarking", @@ -7254,7 +7254,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7277,7 +7277,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7293,7 +7293,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7313,7 +7313,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7330,7 +7330,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-system", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7380,7 +7380,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7397,7 +7397,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7413,7 +7413,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7430,7 +7430,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7448,7 +7448,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "pallet-nfts", @@ -7459,7 +7459,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7475,7 +7475,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-system", @@ -7492,7 +7492,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7512,7 +7512,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7523,7 +7523,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-system", @@ -7540,7 +7540,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7579,7 +7579,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7596,7 +7596,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7611,7 +7611,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7629,7 +7629,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7644,7 +7644,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7663,7 +7663,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7680,7 +7680,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-system", @@ -7701,7 +7701,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7717,7 +7717,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-system", @@ -7731,7 +7731,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7754,7 +7754,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7765,7 +7765,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "log", "sp-arithmetic", @@ -7774,7 +7774,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "sp-api", @@ -7783,7 +7783,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7800,7 +7800,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7815,7 +7815,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7833,7 +7833,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7852,7 +7852,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-support", "frame-system", @@ -7868,7 +7868,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7884,7 +7884,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7896,7 +7896,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7913,7 +7913,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7928,7 +7928,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7944,7 +7944,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -7959,7 +7959,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-benchmarking", "frame-support", @@ -11091,7 +11091,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "log", "sp-core", @@ -11102,7 +11102,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "futures", @@ -11131,7 +11131,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "futures", "futures-timer", @@ -11154,7 +11154,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11169,7 +11169,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11188,7 +11188,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11199,7 +11199,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11239,7 +11239,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "fnv", "futures", @@ -11266,7 +11266,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "hash-db", "kvdb", @@ -11292,7 +11292,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "futures", @@ -11317,7 +11317,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "futures", @@ -11346,7 +11346,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "fork-tree", @@ -11382,7 +11382,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "futures", "jsonrpsee", @@ -11404,7 +11404,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11439,7 +11439,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "futures", "jsonrpsee", @@ -11458,7 +11458,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11471,7 +11471,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11511,7 +11511,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "finality-grandpa", "futures", @@ -11531,7 +11531,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "futures", @@ -11554,7 +11554,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11578,7 +11578,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11591,7 +11591,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "log", "sc-allocator", @@ -11604,7 +11604,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "anyhow", "cfg-if", @@ -11622,7 +11622,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "ansi_term", "futures", @@ -11638,7 +11638,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11652,7 +11652,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11697,7 +11697,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "cid", "futures", @@ -11717,7 +11717,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11745,7 +11745,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "ahash 0.8.2", "futures", @@ -11764,7 +11764,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11786,7 +11786,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11820,7 +11820,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11840,7 +11840,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11871,7 +11871,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "futures", "libp2p-identity", @@ -11884,7 +11884,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11893,7 +11893,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "futures", "jsonrpsee", @@ -11924,7 +11924,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11943,7 +11943,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "http", "jsonrpsee", @@ -11958,7 +11958,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11984,7 +11984,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "directories", @@ -12050,7 +12050,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "log", "parity-scale-codec", @@ -12061,7 +12061,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "clap 4.2.7", "fs4", @@ -12077,7 +12077,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12096,7 +12096,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "futures", "libc", @@ -12115,7 +12115,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "chrono", "futures", @@ -12134,7 +12134,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "ansi_term", "atty", @@ -12165,7 +12165,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12176,7 +12176,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "futures", @@ -12203,7 +12203,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "futures", @@ -12217,7 +12217,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-channel", "futures", @@ -12775,7 +12775,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "hash-db", "log", @@ -12795,7 +12795,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "Inflector", "blake2", @@ -12809,7 +12809,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "scale-info", @@ -12822,7 +12822,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "integer-sqrt", "num-traits", @@ -12836,7 +12836,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "scale-info", @@ -12849,7 +12849,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "sp-api", @@ -12861,7 +12861,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "futures", "log", @@ -12879,7 +12879,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "futures", @@ -12894,7 +12894,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "parity-scale-codec", @@ -12912,7 +12912,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "parity-scale-codec", @@ -12933,7 +12933,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12952,7 +12952,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "finality-grandpa", "log", @@ -12970,7 +12970,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "scale-info", @@ -12982,7 +12982,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13026,7 +13026,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "blake2b_simd", "byteorder", @@ -13040,7 +13040,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "proc-macro2", "quote", @@ -13051,7 +13051,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13060,7 +13060,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "proc-macro2", "quote", @@ -13070,7 +13070,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "environmental", "parity-scale-codec", @@ -13081,7 +13081,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13096,7 +13096,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "bytes", "ed25519", @@ -13122,7 +13122,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "lazy_static", "sp-core", @@ -13133,7 +13133,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "futures", "parity-scale-codec", @@ -13147,7 +13147,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13156,7 +13156,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13167,7 +13167,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13185,7 +13185,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "scale-info", @@ -13199,7 +13199,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "sp-api", "sp-core", @@ -13209,7 +13209,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "backtrace", "lazy_static", @@ -13219,7 +13219,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "rustc-hash", "serde", @@ -13229,7 +13229,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "either", "hash256-std-hasher", @@ -13251,7 +13251,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13269,7 +13269,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "Inflector", "proc-macro-crate", @@ -13281,7 +13281,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "scale-info", @@ -13295,7 +13295,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "scale-info", @@ -13308,7 +13308,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "hash-db", "log", @@ -13328,7 +13328,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "log", "parity-scale-codec", @@ -13346,12 +13346,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13364,7 +13364,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "futures-timer", @@ -13379,7 +13379,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "sp-std", @@ -13391,7 +13391,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "sp-api", "sp-runtime", @@ -13400,7 +13400,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "log", @@ -13416,7 +13416,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13439,7 +13439,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13456,7 +13456,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13467,7 +13467,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13481,7 +13481,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "parity-scale-codec", "scale-info", @@ -13844,7 +13844,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "platforms 2.0.0", ] @@ -13852,7 +13852,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13871,7 +13871,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "hyper", "log", @@ -13883,7 +13883,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "jsonrpsee", @@ -13896,7 +13896,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "jsonrpsee", "log", @@ -13915,7 +13915,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13941,7 +13941,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13951,7 +13951,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13962,7 +13962,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "ansi_term", "build-helper", @@ -14627,7 +14627,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc3ce835964347166414203d68dccc26b9e9044f" +source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" dependencies = [ "async-trait", "clap 4.2.7", diff --git a/parachains/common/src/impls.rs b/parachains/common/src/impls.rs index d9998755212..506f8aff2a7 100644 --- a/parachains/common/src/impls.rs +++ b/parachains/common/src/impls.rs @@ -91,7 +91,7 @@ where Assets: fungibles::Inspect, { fn contains(id: &>::AssetId) -> bool { - !Assets::total_issuance(*id).is_zero() + !Assets::total_issuance(id.clone()).is_zero() } } @@ -103,7 +103,7 @@ where Assets: fungibles::Inspect, { fn contains(id: &>::AssetId) -> bool { - Assets::asset_exists(*id) + Assets::asset_exists(id.clone()) } } diff --git a/parachains/runtimes/testing/penpal/src/xcm_config.rs b/parachains/runtimes/testing/penpal/src/xcm_config.rs index 53c464c70d5..26beb474169 100644 --- a/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -197,7 +197,7 @@ where Assets: fungibles::Inspect, { fn contains(id: &>::AssetId) -> bool { - !Assets::total_issuance(*id).is_zero() + !Assets::total_issuance(id.clone()).is_zero() } } diff --git a/primitives/utility/src/lib.rs b/primitives/utility/src/lib.rs index e71eab178a8..81a83fd070b 100644 --- a/primitives/utility/src/lib.rs +++ b/primitives/utility/src/lib.rs @@ -168,17 +168,18 @@ impl< // Calculate how much we should charge in the asset_id for such amount of weight // Require at least a payment of minimum_balance // Necessary for fully collateral-backed assets - let asset_balance: u128 = FeeCharger::charge_weight_in_fungibles(local_asset_id, weight) - .map(|amount| { - let minimum_balance = ConcreteAssets::minimum_balance(local_asset_id); - if amount < minimum_balance { - minimum_balance - } else { - amount - } - })? - .try_into() - .map_err(|_| XcmError::Overflow)?; + let asset_balance: u128 = + FeeCharger::charge_weight_in_fungibles(local_asset_id.clone(), weight) + .map(|amount| { + let minimum_balance = ConcreteAssets::minimum_balance(local_asset_id); + if amount < minimum_balance { + minimum_balance + } else { + amount + } + })? + .try_into() + .map_err(|_| XcmError::Overflow)?; // Convert to the same kind of multiasset, with the required fungible balance let required = first.id.into_multiasset(asset_balance.into()); @@ -206,7 +207,7 @@ impl< let (local_asset_id, outstanding_balance) = Matcher::matches_fungibles(&(id, fun).into()).ok()?; - let minimum_balance = ConcreteAssets::minimum_balance(local_asset_id); + let minimum_balance = ConcreteAssets::minimum_balance(local_asset_id.clone()); // Calculate asset_balance // This read should have already be cached in buy_weight From ca5b329a0aa4feaf8955c011eeac78195313c21d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 May 2023 14:53:28 +0200 Subject: [PATCH 217/339] Bump Swatinem/rust-cache from 2.3.0 to 2.4.0 (#2617) Bumps [Swatinem/rust-cache](https://github.com/Swatinem/rust-cache) from 2.3.0 to 2.4.0. - [Release notes](https://github.com/Swatinem/rust-cache/releases) - [Changelog](https://github.com/Swatinem/rust-cache/blob/master/CHANGELOG.md) - [Commits](https://github.com/Swatinem/rust-cache/compare/060bda31e0be4f453bb6ed2d7e5427b31734ad01...988c164c3d0e93c4dbab36aaf5bbeb77425b2894) --- updated-dependencies: - dependency-name: Swatinem/rust-cache dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 3e49636a96b..5f5bdec19af 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -23,7 +23,7 @@ jobs: run: rustup show - name: Rust cache - uses: Swatinem/rust-cache@060bda31e0be4f453bb6ed2d7e5427b31734ad01 # v2.3.0 + uses: Swatinem/rust-cache@988c164c3d0e93c4dbab36aaf5bbeb77425b2894 # v2.4.0 - name: Build rustdocs run: SKIP_WASM_BUILD=1 cargo doc --all --no-deps From fab8d1f47447551f4271d84a2f81d34052b38274 Mon Sep 17 00:00:00 2001 From: yjh Date: Tue, 23 May 2023 22:19:15 +0800 Subject: [PATCH 218/339] use `WasmExecutionMethod::default()` (#2622) --- test/client/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/client/src/lib.rs b/test/client/src/lib.rs index 4027a056d55..cbf0459b816 100644 --- a/test/client/src/lib.rs +++ b/test/client/src/lib.rs @@ -183,7 +183,7 @@ pub fn validate_block( let heap_pages = HeapAllocStrategy::Static { extra_pages: 1024 }; let executor = WasmExecutor::::builder() - .with_execution_method(WasmExecutionMethod::Interpreted) + .with_execution_method(WasmExecutionMethod::default()) .with_max_runtime_instances(1) .with_runtime_cache_size(2) .with_onchain_heap_alloc_strategy(heap_pages) From 80ca5eec9257d1ae4271d25873baf29097be2eb4 Mon Sep 17 00:00:00 2001 From: Squirrel Date: Tue, 23 May 2023 15:53:23 +0100 Subject: [PATCH 219/339] Use default for test relay runtimes (#2616) --- .../emulated/common/src/constants.rs | 34 ++----------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/parachains/integration-tests/emulated/common/src/constants.rs b/parachains/integration-tests/emulated/common/src/constants.rs index b9720db4cf0..c207a8e7330 100644 --- a/parachains/integration-tests/emulated/common/src/constants.rs +++ b/parachains/integration-tests/emulated/common/src/constants.rs @@ -198,32 +198,12 @@ pub mod polkadot { slash_reward_fraction: Perbill::from_percent(10), ..Default::default() }, - phragmen_election: Default::default(), - democracy: Default::default(), - council: polkadot_runtime::CouncilConfig { - members: vec![], - phantom: Default::default(), - }, - technical_committee: polkadot_runtime::TechnicalCommitteeConfig { - members: vec![], - phantom: Default::default(), - }, - technical_membership: Default::default(), babe: polkadot_runtime::BabeConfig { authorities: Default::default(), epoch_config: Some(polkadot_runtime::BABE_GENESIS_EPOCH_CONFIG), }, - grandpa: Default::default(), - im_online: Default::default(), - authority_discovery: polkadot_runtime::AuthorityDiscoveryConfig { keys: vec![] }, - claims: polkadot_runtime::ClaimsConfig { claims: vec![], vesting: vec![] }, - vesting: polkadot_runtime::VestingConfig { vesting: vec![] }, - treasury: Default::default(), - hrmp: Default::default(), configuration: polkadot_runtime::ConfigurationConfig { config: get_host_config() }, - paras: Default::default(), - xcm_pallet: Default::default(), - nomination_pools: Default::default(), + ..Default::default() }; genesis_config.build_storage().unwrap() @@ -318,18 +298,8 @@ pub mod kusama { authorities: Default::default(), epoch_config: Some(kusama_runtime::BABE_GENESIS_EPOCH_CONFIG), }, - grandpa: Default::default(), - im_online: Default::default(), - authority_discovery: kusama_runtime::AuthorityDiscoveryConfig { keys: vec![] }, - claims: kusama_runtime::ClaimsConfig { claims: vec![], vesting: vec![] }, - vesting: kusama_runtime::VestingConfig { vesting: vec![] }, - treasury: Default::default(), - hrmp: Default::default(), configuration: kusama_runtime::ConfigurationConfig { config: get_host_config() }, - paras: Default::default(), - xcm_pallet: Default::default(), - nomination_pools: Default::default(), - nis_counterpart_balances: Default::default(), + ..Default::default() }; genesis_config.build_storage().unwrap() From e19df87f5f572fb053efbc6b3c68bbf20be35e76 Mon Sep 17 00:00:00 2001 From: Ignacio Palacios Date: Tue, 23 May 2023 16:55:28 +0200 Subject: [PATCH 220/339] Companion for substrate#14188 (Add genesis config to Glutton pallet) (#2612) * sudo + genesis for glutton * ".git/.scripts/commands/fmt/fmt.sh" * add AdminOrigin to glutton * ".git/.scripts/commands/fmt/fmt.sh" * update Cargo.lock --------- Co-authored-by: command-bot <> --- Cargo.lock | 396 +++++++++--------- .../glutton/kusama/glutton-kusama-1300.json | 35 -- .../glutton/glutton-kusama/Cargo.toml | 3 + .../glutton/glutton-kusama/src/lib.rs | 17 +- polkadot-parachain/src/chain_spec/glutton.rs | 11 +- xcm/xcm-emulator/src/lib.rs | 14 +- 6 files changed, 238 insertions(+), 238 deletions(-) delete mode 100644 parachains/chain-specs/glutton/kusama/glutton-kusama-1300.json diff --git a/Cargo.lock b/Cargo.lock index 8df34af23b4..3a0ca145db4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -580,7 +580,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "hash-db", "log", @@ -3808,7 +3808,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", ] @@ -3831,7 +3831,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-support-procedural", @@ -3856,7 +3856,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3903,7 +3903,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3914,7 +3914,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3931,7 +3931,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-system", @@ -3960,7 +3960,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-recursion", "futures", @@ -3981,7 +3981,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "bitflags", "environmental", @@ -4015,7 +4015,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "Inflector", "cfg-expr", @@ -4031,7 +4031,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4043,7 +4043,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "proc-macro2", "quote", @@ -4053,7 +4053,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "cfg-if", "frame-support", @@ -4072,7 +4072,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -4087,7 +4087,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "sp-api", @@ -4096,7 +4096,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "parity-scale-codec", @@ -4397,6 +4397,7 @@ dependencies = [ "frame-system-benchmarking", "frame-try-runtime", "pallet-glutton", + "pallet-sudo", "parachain-info", "parachains-common", "parity-scale-codec", @@ -6169,7 +6170,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "futures", "log", @@ -6188,7 +6189,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "anyhow", "jsonrpsee", @@ -6707,7 +6708,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6728,7 +6729,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6746,7 +6747,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6761,7 +6762,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-system", @@ -6777,7 +6778,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-system", @@ -6793,7 +6794,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-system", @@ -6807,7 +6808,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,7 +6832,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6851,7 +6852,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -6866,7 +6867,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-system", @@ -6885,7 +6886,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6909,7 +6910,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7015,7 +7016,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7059,7 +7060,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7076,7 +7077,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "bitflags", "environmental", @@ -7106,7 +7107,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "bitflags", "parity-scale-codec", @@ -7119,7 +7120,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "proc-macro2", "quote", @@ -7129,7 +7130,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7146,7 +7147,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7164,7 +7165,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7187,7 +7188,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7200,7 +7201,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7218,7 +7219,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7236,7 +7237,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "blake2", "frame-benchmarking", @@ -7254,7 +7255,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7277,7 +7278,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7293,7 +7294,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7313,7 +7314,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7330,7 +7331,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-system", @@ -7344,7 +7345,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7361,7 +7362,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7380,7 +7381,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7397,7 +7398,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7413,7 +7414,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7430,7 +7431,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7448,7 +7449,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "pallet-nfts", @@ -7459,7 +7460,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7475,7 +7476,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-system", @@ -7492,7 +7493,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7512,7 +7513,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7523,7 +7524,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-system", @@ -7540,7 +7541,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7579,7 +7580,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7596,7 +7597,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7611,7 +7612,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7629,7 +7630,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7644,7 +7645,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7663,7 +7664,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7680,7 +7681,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-system", @@ -7701,7 +7702,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7717,7 +7718,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-system", @@ -7731,7 +7732,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7754,7 +7755,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7765,7 +7766,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "log", "sp-arithmetic", @@ -7774,7 +7775,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "sp-api", @@ -7783,7 +7784,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7800,7 +7801,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7815,7 +7816,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7833,7 +7834,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7852,7 +7853,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-support", "frame-system", @@ -7868,7 +7869,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7884,7 +7885,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7896,7 +7897,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7913,7 +7914,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7928,7 +7929,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7944,7 +7945,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -7959,7 +7960,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-benchmarking", "frame-support", @@ -8333,6 +8334,12 @@ dependencies = [ "windows-sys 0.32.0", ] +[[package]] +name = "partial_sort" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7924d1d0ad836f665c9065e26d016c673ece3993f30d340068b16f282afc1156" + [[package]] name = "paste" version = "1.0.12" @@ -11091,7 +11098,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "log", "sp-core", @@ -11102,7 +11109,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "futures", @@ -11131,7 +11138,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "futures", "futures-timer", @@ -11154,7 +11161,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11169,7 +11176,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11188,7 +11195,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11199,7 +11206,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11239,7 +11246,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "fnv", "futures", @@ -11266,7 +11273,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "hash-db", "kvdb", @@ -11292,7 +11299,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "futures", @@ -11317,7 +11324,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "futures", @@ -11346,7 +11353,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "fork-tree", @@ -11382,7 +11389,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "futures", "jsonrpsee", @@ -11404,7 +11411,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11439,7 +11446,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "futures", "jsonrpsee", @@ -11458,7 +11465,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11471,7 +11478,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11511,7 +11518,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "finality-grandpa", "futures", @@ -11531,7 +11538,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "futures", @@ -11554,7 +11561,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11578,7 +11585,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11591,7 +11598,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "log", "sc-allocator", @@ -11604,7 +11611,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "anyhow", "cfg-if", @@ -11622,7 +11629,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "ansi_term", "futures", @@ -11638,7 +11645,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11652,7 +11659,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11697,7 +11704,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "cid", "futures", @@ -11717,7 +11724,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11745,7 +11752,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "ahash 0.8.2", "futures", @@ -11764,7 +11771,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11786,7 +11793,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11820,7 +11827,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11840,7 +11847,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11871,20 +11878,23 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "futures", "libp2p-identity", "log", + "parking_lot 0.12.1", + "partial_sort", "sc-utils", "serde_json", + "sp-arithmetic", "wasm-timer", ] [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11893,7 +11903,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "futures", "jsonrpsee", @@ -11924,7 +11934,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11943,7 +11953,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "http", "jsonrpsee", @@ -11958,7 +11968,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11984,7 +11994,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "directories", @@ -12050,7 +12060,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "log", "parity-scale-codec", @@ -12061,7 +12071,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "clap 4.2.7", "fs4", @@ -12077,7 +12087,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12096,7 +12106,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "futures", "libc", @@ -12115,7 +12125,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "chrono", "futures", @@ -12134,7 +12144,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "ansi_term", "atty", @@ -12165,7 +12175,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12176,7 +12186,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "futures", @@ -12203,7 +12213,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "futures", @@ -12217,7 +12227,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-channel", "futures", @@ -12775,7 +12785,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "hash-db", "log", @@ -12795,7 +12805,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "Inflector", "blake2", @@ -12809,7 +12819,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -12822,7 +12832,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "integer-sqrt", "num-traits", @@ -12836,7 +12846,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -12849,7 +12859,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "sp-api", @@ -12861,7 +12871,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "futures", "log", @@ -12879,7 +12889,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "futures", @@ -12894,7 +12904,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "parity-scale-codec", @@ -12912,7 +12922,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "parity-scale-codec", @@ -12933,7 +12943,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12952,7 +12962,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "finality-grandpa", "log", @@ -12970,7 +12980,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -12982,7 +12992,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13026,7 +13036,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "blake2b_simd", "byteorder", @@ -13040,7 +13050,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "proc-macro2", "quote", @@ -13051,7 +13061,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13060,7 +13070,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "proc-macro2", "quote", @@ -13070,7 +13080,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "environmental", "parity-scale-codec", @@ -13081,7 +13091,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13096,7 +13106,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "bytes", "ed25519", @@ -13122,7 +13132,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "lazy_static", "sp-core", @@ -13133,7 +13143,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "futures", "parity-scale-codec", @@ -13147,7 +13157,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13156,7 +13166,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13167,7 +13177,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13185,7 +13195,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -13199,7 +13209,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "sp-api", "sp-core", @@ -13209,7 +13219,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "backtrace", "lazy_static", @@ -13219,7 +13229,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "rustc-hash", "serde", @@ -13229,7 +13239,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "either", "hash256-std-hasher", @@ -13251,7 +13261,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13269,7 +13279,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "Inflector", "proc-macro-crate", @@ -13281,7 +13291,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -13295,7 +13305,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -13308,7 +13318,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "hash-db", "log", @@ -13328,7 +13338,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "log", "parity-scale-codec", @@ -13346,12 +13356,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13364,7 +13374,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "futures-timer", @@ -13379,7 +13389,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "sp-std", @@ -13391,7 +13401,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "sp-api", "sp-runtime", @@ -13400,7 +13410,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "log", @@ -13416,7 +13426,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13439,7 +13449,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13456,7 +13466,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13467,7 +13477,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13481,7 +13491,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "parity-scale-codec", "scale-info", @@ -13844,7 +13854,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "platforms 2.0.0", ] @@ -13852,7 +13862,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13871,7 +13881,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "hyper", "log", @@ -13883,7 +13893,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "jsonrpsee", @@ -13896,7 +13906,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "jsonrpsee", "log", @@ -13915,7 +13925,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13941,7 +13951,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13951,7 +13961,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13962,7 +13972,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "ansi_term", "build-helper", @@ -14627,7 +14637,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#aacba0fda8f86cf96bbe8c271463923943586748" +source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" dependencies = [ "async-trait", "clap 4.2.7", diff --git a/parachains/chain-specs/glutton/kusama/glutton-kusama-1300.json b/parachains/chain-specs/glutton/kusama/glutton-kusama-1300.json deleted file mode 100644 index c1cb0880657..00000000000 --- a/parachains/chain-specs/glutton/kusama/glutton-kusama-1300.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "Glutton 1300", - "id": "glutton_kusama_1300", - "chainType": "Live", - "bootNodes": [], - "telemetryEndpoints": null, - "protocolId": "glutton_kusama_1300", - "properties": { - "ss58Format": 2 - }, - "relay_chain": "kusama", - "para_id": 1300, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0x14050000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x041c676c7574746f6e", - "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058b4cc04deb74577114e107877930e70565839d8f5c5fa791f7f0f5c593af01ed6cb7ac383ca0b0d8c5e36d281f7f762a3b9c9ec446be48a97b7d91b85fd0c036a24e77aab729d618f216e1c6d13b2b7245b6e29654a29059c127a108f103fedce21f4c8277e98923a2473bf33b2c9b973494a00509377ca01a9dca4c8a77676e7aa2e19f3718b1121f44edb57ac3320954f7ca926350099fbeb2549f9c4179f9e7328bf9a927d76f6d69c2be603b456bc3e6bade93f0d73d7d3340585cc2b9fd8f97ae4d3fe3a633e7bbd6241dcec19591372bb48907a33c598d6e1d326c4b7b7107c72def1bba70873c359347df34ed638eaf8f4c3eed8b4be4ec327f676e51d6d9c8633caa68b4debce954deb5b5cbfd69577b44753528479f5c5d8150bc2ee7c08bb9b8e35c55990ca525d6fb61d7ad68522d3540ad0f81d7a75c93baafd643fedfadb0efdf69a4a0199df5f5fac8885e2756e3be45c3526eed59d4684f4eaada902d99cd70c11bd9b40a457d7335ee7372df35b3bebab26dda5daa2205bdf572e80fa62400e947dcf129bd677889b20158767fe04bae5393afcc9c89d07c0dd9fe8e0ed4ac5fa931c3ee33fe898a81a3eb3c39fb85ffe249b281dde337ec39f90bc9ff044714fd47bce13c56eb5a37aa2dea4621df53c07cffcc98d89c281c3754cd40d9fd11cc78de370940ec77cc64bfe444e9474e7fcc23151d3ad1dbc873bcb7138ca398e898ad179a2a4b3a370f8e54f2adf315134345e63a2da45132572ed7294e6d744753beaf21ab7c1ecd844c5e872a27aa278b8746e674761ce13156d382a3a8ef3e028761e268a86c66f4cd40db72ccf61a26872f01bd60de7c15196f3305139883a0747896e2615261b1365c36fdcf01a1b376e4cdf414acf8187949714693770e8c89a2d27923afa5d37e28c1631f7706433ee6916374bebc615311d38743c6d268b5224ea8bad1b19c63a44188ecc72cfc9192ddee8780347bf1e3df0e566b4cb7dc878903d7ad8c071b50807c751ce7170443a744c37f17313d6430f8e92de430f9a65cdf8741c4c3a4e34991ca5b9a987e9cddc609fde038ecc7b701f1ca5c37dc0c171d4e5383ce0b80f8e12c51e3d2ecda79be20d37b91e3d7af4e028cb7b98a81e3db2761f78e08187a330e721f2e93839388f1d74f8e0388ec2e1382613009c878932f90e3c388ea3a4efe0289e376ec386c3e1d37bf0e0e13be49083d7388f1d9c87a332e7f1bc87fb70d48cfb581d1bf7c15133eec3def80e3eb80f47e9f01d1cf51cc7646333dd06c76d1ca5b9cd3aea721be7a1a6c677c861a2784c140fdfc16b72f01a47615eb38e8ace839b1cc56e5a00f47094e53d260a003d7c4e14003c871cdce4a8f6e92891fb98a81e7af09b89aa99a81ab761c36d266ac70eaf99281bb761c36b1c75c36b266a478def70d48d639367874985ce44d5a8e13c266ac744ed701e8e613e1d3527aac60e3e1d55c3afe984fbe028399f509c751f26aa8749c5e25ccec34449e9341345e3170f7e394a348fb8264a5e6e3351d23191638eb2716d1a71630ea138eba689ea71c301305173a2a6f3a0f9cd44eda083cf8992411a5800a5479b5478cf13cd791a471da54d948ea93eb571d47598de38ea38660e3c74b8cd44d5e4f01d13a56352e13d3a1ca563a26666569ab171d4734c6d9c1fe6667af56c961cd57309c559c73151372615dbf364c669262a731b930a9d9e27ed35266a66e4d944f5a4c27b9eb4678eca26ca9a3aa4596a1cf5d1d4c609c0dc7ebc3acf1fd8445d930a53cf13e872a244930aef79c26e39ca9aa8385d71d651d5cc1a471d4e6d9c9cb9e9bcfa9b26c55977d388e2acab0b75131cce29232bd7de79a26270d2062d655cc0061640e979e2057429628f17cfd5bd779e2814a6b0e2096e3003164fa0d063b9baa9779e08c5200a2bac808c2ab4a18b163dd1d5757ae7890e63ac21086258410a378ca147bafa8fde79a2571003041bac200663c868438fc8d563ef08810184316ce982031d38018c1ef5ac778418421865e8411a5210b3831ef552ef08dd800b38707183316990e10c3dea3cbda33dea526aaa38ed222d2a4ebbdc4b8a2a5fccc7b91469daa35811d93b6969aa38eb518b8ab38e730400bca6a498a2f39a7a12e6a56620d3d4932e9ff39a72c2e5e5bb2c4d1b873d6ab1717856fe301f764bd39eaa678b5f79d4b4c7614564cfde1891ec9d3346247bf6c588688a88a6fe554d9cd07287e1040b3b33333be9e299995948ea053276e7537bbb129fda6fa209c8ac7ff76fd76ff1dbdb1d9f6e1a25f566d34922d35414555e53510c3d015e53506879c57c8ac8b68c87b38c4fcfdbe5d3f45bdb971a806c1ff6f534e88bf93474c588107a28171bf21cceedf973c9d890ec9f2be6d8e45cbaabb57dd917d49e2fa66cda687e5d4ac5e0dc841e7a6b5b7cdead6deea1f3b06c6d5bc0b74bc5aab93df195b7b669eadb9fb6299b9e70620923477cfba66cda8cf8f6edb9b2691be2db79fa69fa9506d465ca9419f3cf5bdb8478e772afd69c3f4d5fb122aa871a50f56f6efb3d81b64c9932657e13fa76a74536ed05d739917a812e3090690a8a30dec4a7ed723e6da66767f7913114593cdf3cff66b3002cba688e3e0f5f7c5267d7d9224805c005324d0d6df9589af2ea199f343594e5d56d685e5d6f5475b27575b5a4543ee9be24393eb1abcb957ba9ce2c00064ed8a4dfcedbd919f3e1a93bb30018446193fe7a6b92175b57cc4d27dfa57cd2dfe2abcbbe58db676c7db1c8a676c586d05fe761cc879d87b70b529fd997790aed0e91ebab15916deed9e37a8cda3bca385bf6eb5bf68e4fecbb49f4f6723b0f6f7777af772fb3c7e7594384dd39ef90759e1b7bf3ae19526f36d71f32a901c8d4db15f3515f2cc81343434350bc4e65d3169f5df2e5f8c4a75536b1f3706b8e4dec3999f3129ff4333e299b36f7eaec347c6a672ff1697dda694c74f82542f1d7e3efac21b2ee7cddcda0fd9e8af9ecdcf6d76f78fef8eb0e42bddb04a9af375bf6ec32f269db4102235bdfaee71eb2f57675c58a58ffe9a96c52e761b95a3ff6e5995c23b9d76aee2f310f543d931a1893ebd7d9470a44c90e3d50029e09fc7576920251b2430f94805f67576c881b1afa751e967ca90259dfda1d9bd4239fb6fd7675d95a64933a4ed6aeae981065937acfc826751e967cadc67f2910259b7a26f0d7d93105a264871e2801bfcebe5811d9d0af5f7cd267576cc80efd3a0ff3300ff3b06aca2675bde1f993bdee20c4cb5a90ca520590adabab45ba820253ca20227541ca62f486511a233224138cd0189161c486511b468085017bc3c808a3314648180d615e303123178c88306ac18805a31f8cae18bd6034054b0336068c0c181a232c46658ca2c0cc8091198981b501830336064303b606ec0c58194657462bc0d8806101cb0276054c0b98184642c0ba807dc1b6300a02c6054c0d5812b032b01e6037c072807181e100c30293013683eb0d97152e2e970eae2fae1d5c5a5c33b8647065715d71c1e09a726171bd406a71e5e0e2424eb9ac5c35b88070f940eee0a281ec4232412e4166914a90549053905ca414e415a4156415e4179904890489459621c99063c89414431e4166416a41769167c827c8284828c82d120d390629061906194682417e417a4182915d905c905b9042903e90409041903f905ec81a481ac82d64156903c902294524461407911b4466107d116d4104051119a21c88aa88b810e140a40569075818fed258c0dcf0a6b8286e8a0a0c9617aa305618eb0b1618444570317030104561dde0e010cb6832dc09301eb0174428b88870b9e16a4334432c43fcb26f885ca8c210b75031210ee1c2423be159a9c870576831aa94c44135848a0695161595aa06720556175a0ad6932826ae21aac17212dd6045b1aab04e60496141b1a8b0a68863229998066b288211e310cf10cb5826886db0a0886c884788614423c422c434e21b221a221cac28229448459ca2b24105065fe1cab8383412ae2dba0c79450ee10d554bb0545041a9a4542bb07e6001c19a824585778427c68eb1a915638fb046d830168c2dc21261afec1056081b84fd6281b03f581fac95edc1f260bdd82e7607581c46618cac5448783eb0a45453888050b1c0eaf2ca78515465301732060f8aaa09a228dc05d11a7a0c2806d402d20052813380328037785e7860de185e17ac322a15585b9e19ef0ba234b02a980f980dec062e5361a994705d715e5605cf089b825784e8a53ac2d583aa080e8bd70287c6084b8ba1c3bc2bde0b3a25a95459aa31445cdc189c142f0b6d8673e2c8200aa34a02c7a17a7265c11d41840679834a0aae12b1e0aa7050e2159e162a193c2cf414aa183c292e8aea8ce6e24c10b5e09ef4136216aa2c3a0a0d85c782b702074535858a0a8e8a1e4387c12a824584ae4297a1cdd06468318d46a3a1cf60d9c0dac2aa8175038b0656158b8bde22a2d256188d199561348691193acb7583eb0722365c36682c570cf80cdc061ec369301916c36f60303018de027301f382b5c05f602f1c460406cb80a9f00cb02cb806bc05db80b3e01cb00e4448e017b0145e812809a234300b78ca626128222bec19768b45c33e61b588aef08015b353582e5b8595c2526191b05a2c0d96ca9a2152030436092cc596b150e0277b039114444a5816ec0a9c6822c90790286104115b8503841ac001242c50010a10d9a18d328490203f7c16a0801e1e041c40882076d68a95e283c9478f231c17725f37f2c0e23eb204090e14710289234b142922b7954872a448119168686495d1263a90848922491469a2034986246982892024902069420141491c4182a40905f860c52108092547921cf18066c1419788e0c84f9125458e28d14412479428b24404478824698289254b8e4440078b8c868009275ec9911f254d54a008cd7a831e09424209269020c1a4c811101c01c10324a0c4110f78000909f860b94197fc2471648924daa04b82921c51726489244cb8352609131da8b1d8a04930b12409134a829e38524404489c700289224a8e2881840910f4fc24d104921e1b6b0dba6487a50645a2888d95867ea008124148288144d09106cc5869180113489060228889244cdcb0d0a03f4934818403458e04812089234f1ca9619d419534a1804bf708120e20119404041d281294c411254c28918489224574d8703aa8c460c102ccab90d4d4d0d0af50eb80ae8aabb24e6ce59899d99dd9c6c686d700ef39e8dc73af46df8ff7b477de7bcfc1e75c8debd7efb5be6e7efdfaa9ebd6f79e6a3fe854b1eed6d6a7aea1830e5ebb8f77abdd55ecc17615d4f7b8f45e5555ae1b3af8de6ba7ed5c43e82a587543e89c3e55d8ddaed2083b4ae75eacda397d2787396cd53d85dd5605bb92905455d805bbb55b7587bea7daeeb9ea297cd57b55b773b000f069bb86fada41e75c376407b51b56da4ffb75eb7b5aa32dd5a936b748b5ab918310baaa1a296c86ce39ed6e20dae9aec25dad5aab0a83170e08ab868ebb2b0749cdb01dac60d512eb570342e71c7c965addce7204d8b14355d5693f75ddaeabaaaa9eaabe513bd70eb694aa55555595ab20bc2e785d10b694ce5515ac2ae82ae760f55acaebea1e40255b87aaa376bfd7adadabdad08d46dd1a5f6b74d0c1aaaa64f554555dd5ad50552be9b086edf4bdeeee5d55c7124275d0bdd7aaaebb5f0e553bb7dbadadcdd055901942a8356ad4a84122cdcc3ce7ba7a90a132546ea7caae2184f0a9b6aa76ab42f8de7baaaf9d005cb74e77bb6e556da7aaad0d551576abaa73ddb09fea7bacdadc50f5697737dc7dce2de4e7e073ece083af92ad43d4eec6f15a9d6a773ba8ef3dd7b08217564149aa628cce55ddcf4109b5aa2a7d0a196a43e8badb39f87e784f4755b9f7aa5d7e01c8f1a143870f5c7aeff17b39f480e3b804b97aef72ae5df77bef3de7de9be1f7f4bde82094d041d84edfe86ad7ddb1213fd74f9b7405694ad750168192263e70e403500912414b7ae898d9f19304121c4082a4891e4c3b72e49043476613839240624912249404150962e2031f68c244336b921c71c209246c7a287144c91125943451e45480011c614249500f0350b28348077064c992234a9cf8401349145172844913491c51520489254a2471a488007e4e05188013491c59b2c3a3034c2839c2a48801045080020c408923459a087242044a92d8613fa02a80234a3a50444913414824d104122448d80071e2f144132108cae154800178f6630002283280233f4820e140110f2461628925482c91430570e4034c0425018192f9a3034120e07164892241499850e24491249630f1011b4b057084c91124459e40e2033a004005e081269014f14012263ce0812690e8b0e1379e38a24412268a246102892592e840079a9804408284891f1d1e96f4b8d1010435d1c40e4a207144894904477e8a043d7124890f9aa0231ee83155004b829630f1c4911e341dc0134c74e088122774982439d2365400459234c1c412254798145182c41124491439e20124943411b4a488124898582289224148408044078e285124e88923384c921ce91e171158689b3411ead74488dd13724654a84913212121d89811a1155a529326ce880a0935e9e636a24d5648a8499326ce88d03669c2469a6c93264dda880a3569228d08add00a3511ea264d9a6813a16d6219d1266ba4c93669c246544864a4c90aad11a16db2d1883669e2842a232a048d345935a22af4841c1b5115126223422b2424d4468456688da8d01a01d25a5655f7034b90d01f45f0cfa52ef36823c1bf21ef9f536c88fc6aba2bf60738876af00e1af4f67677f77af732b3bbce021221be5d08243adff1fb87dcd0c114768044c70b9fda37f7eb826ccb9e99dd07f1fbe3a121a705b1fb75b7586087b9767de78bb52bc641fc4366a060b1414f2442fc0c142c3570afd85659ac5df6b58304846c5dbfbd5789f5516c9fef78deb3b58a9d1bf3e1dd35e820b5bbbbbbab5d9ac33ab0a2831c7c0732d6c10d1ebea674a0c56f194c5574d1ec34a559425df3dfae17480764ef3565832c74a402704efbc97e9cf7f8ed09bd26ef7cb31aa05df837b988cec3ae5af4a739edb50fc4f4c439a44e90e27cb3be9da79dd6e3e52a76811edf64851e7314541b8aefb9edd02b4684f4ce5b63e2deb5abb6aa6a8efa6621d501970f12689f5fd0e52f7fceda927d76c686d0b7e6cfbac54a56739e07c507d2322f9db120978b447282a0f441a5dfa99af3d8d2d404ceaf2c7fb9e552be8b456e3146c40db1fc92be9a744bbbbc3122d177379eab39eb964b6de35f8b497ca08ec350d00ac16532ac3af7e1a536c99c437f8194875e998c38228c9aee1ae87e6332b2c4155a74c8018df77cf069836e52fea7d17b88eb08237c7a9a85083eed3fd7f9c1274db960cc3fa7e3b2fc73e553cd6f0ae65f74e22b67f520f87cc3a7e74a78312245bef258396b35557de89416144157dfb672d6e2ac34a86d420f7fb6cad52136a4aabc9a5b099e5d1fce6d9f596b97cbedec44164e22eb5ce253e5cf6da40bac78a8bd85e2b7e89a3ac1984cd2f009fa73870989be95a0ccaf3336641dce8da1f8e8527928561a4f43289e5b8c7585dc8478dd2139e6ea347c12b9aadbf80d9fa2ab9bf8045de8451ae6511392523a0f5f5a4d74cb045fbc73ec09748945ea9a20d394155cdeb9742ea5d05e6e59d2e54a07ea974e92fe5343a4f2e7aa5145a41a55d2a34b4be4fa966806896eb9e50227ef5ce469bcfb796ecd6dbff2cba3b66f351644241289e6cff3cdf912a1229608fde53fd05d11ceabb941bfa6e53cfd5694ef52ec9a1bea2f87dae61e3a496b96425500dbe384e452a80a00faf6f0f4a5c97741ad9da4694fd48858f30773e7982be643ea41867943e9706e98cb5923bdf247c439366be424121d7a94501379f513634524567188736b6ed0a54ba96d97d758ae2f1d6a35d60cf25c42d7b702cc3b972ef9fa11b99cdbfe06fd72d99748bb7cdbbffc059172aae66cd2dbada9399be5ed5cce4de4d0e53edcdf87bb0121c4ab6bc76b8360285e7da440f4d5757e345921115f2a6801996e4117528c71c2822e1bc525d757d337a34b325d97aaaaaa23f7d835620299d4785555cdd8b4914dec856427595b974fab79aecccf176a35cff72b7d33ce7b7c7be5aa3d67850a1556eb0a77ddcbafc65e69d0791a6aefe5d3d6e596205b87a2afe7aef72ed6d6df7a633ea86c5d3e2c887a819569b4f3693acf3a3336f5f81682db66485d2a32e77d828c7bf09ac2e28c672d5e5353aebce935f5823043824c20e637a130e06f205841125e9db427c89a8cd7941635f8c5f29a924116dec76b4a06522c264464c6970732f26266f0404d46bf0571210b252d7e0baaa285e4c26f415570e1fdb6a40a41f0a1085b7e5b7265cb6b1c1a7ad532affeeaec0209b4ef5c3aedb9f9bef877c66f03da796ea92db2bc73e7eb5c43e49df1cedf19bf2d117ae74fd307d23265ca6c42cffeb2fcbad40d649ab2c116afbdf6922fd674f8a7bd337e3121cee4c6ce2026e2cfde9a64c6846c9907da326fd60c596f17b2de33486aca06583e88ffcd8d9dc97ebbd06bdf9af61c245f5de82d9301f34b9adfbed0550c07b5e52699a656c0e5a590caa35b22b7fcf9e5ec72a4d58c5c7f13fa915fda06e104223d9320fe9133a6d58c7c9fe4d25dac6d96b34bd66a86b8a1a197eebe5f3a6bfc8c091939a691fcd2460eb5be30cdbd74d7a5a91a1ed3fae5bb2e4ddff098c62f1dafbeca4192b35f9ac2e1317dcb6e544344cb2853e6d9fb37a13086869e2f4dbd3cd458834ed230e7694c7bfac36e7913212486e58a0959b72c8b5d83acb32f3684dd7239d2a4cbbd469a96e1255f234dd1f0b2af91a669bc7417d4a48fb425d533e1f780927de90f8a972e2156824cba62a84c3ae9525fef3ade853b8ca48f349d879a62198ae245ce1273d59c88f925f24b74895c6a4a2e0c837e8924144d551fa2199d872d75d6f4f5cd8c4d6ecec7b6fa422ec9dc6b6a05599664ef35b5022daa393b601886396b1ec0300cc35c6f30334829a5b3e60129a594ae37320c966559d12bb72ccbf2a8402cd71b6bfe64db05ad0a1dbc2ec65a5ed9c49a53ad57ae18f36a51732a67cd031ec89c5b0ac487bd7217150816a416c93697499210fd1b09bb61774fed869543edd29ccac50e649a5ac1957f6eaa9cf37005bdaa1c6a42a0e313f48a632085e8935caaa6fc9a4a41125e3525943447d755db5f4c734897e6909cb50e6423c7fc72e91dc8446e79f4ca3b90417f5b7c9293fc5220ec24c714883ec959234d41b6cbd64843a09076e83ccc98e5ccd1dbf2d81d2d09a3b7c6643f4687abdca36eefe9cfc371fe44af5cb106446b6e426fad858add1d9da78150cfeb9181fa39b2f33050c6be92a4ee6adad7db59ab696f6d089e57f5b1555e796bfa95575149d0e5c447576c88918f1e5548a56dd17fda2b97519b4a8054ccd0d007d5789177075d2ff2e88a15e1c45bcec3515302948067cd690f821ff9db2d4d49f420f822578c4891b75c87b73c6a4009f8d51cabada9eaa31d0bf2bc7d319f18b5f56adb57363d0d13b2dfad656c52178a5b89219567fab97ced7231f61e59f1dc849e1755a9aa7aa5bf1a10eab702ea576c9d872569a76a9b8b71556b9e66a0aa4c9932643e16b11a507f9c40add02b6dab9c49f648dc1014bfb1035564a028f34ce266fd386f8fae73cb5e9db58b9d4905a48449f54b84d4795a35e81cc42f72e8a209b464de595a10bff359336453dfce984f3bd4745b87de1a1386bc419f1b10ea9d6fedea52e8abade2dc501f9db565668ebe4b84803a883a3b04ea21eeddfc695f578c8823b2def3479dd5dac88224e02095c818939286914c0905b2fea96702b1ce867e77e8750d725d92f46df804fd7275d5794b45ae40f62fcd864f3aaf0e87484d932e9b8757d35f4ca422b748fb52311f7d33199b446eb9fa623e3b79dad26cd8a42ed2a4c6647fdbb77c3526fb96e564f3768f7602f5d704e95fdfe99aa3be2f356bfe4497ee30a0f8d0e5542729cf5ceedcf2c59464edd65419b52dba259a9bd08bd64724e7867ae9ab595af3aa8ff58d014262bcaa8f75cb791a08f56db54803ea6f574b03cab26fe761d6f42b2de7a156d2e45e51db9eaf575acd4ea07d384b588686de87af1662215bca3b6fed27fb79dee3b737370a9bf43575823172a3f049dff91105a244e7b95017d22ff8baea84d38914393dd0a1d8e889c2279a77be8304846c43f21b854dce75bc608413e8eb3ccc44b66d9477bea917de394a3d6b1c356431042d8660e5cbd0500f74d7b3da90db410a6c10450d8cd0e3448a9c9e7528367ad49d48c13d95434140cf3ad4a020a007e58504d65146348ef3ddf2cea1a3bc9040e570a2781ac77935515e4800fa4e94378e73387534955adf748bae618a257041062be8600b51f0774efa41a63d422ed0628419cc608c2e3f48438ff6a86f3aef5c3109f8d050cf46e1538f77be5298dd0ca42a904d47887412397fce35f97e5d7837df062be7d54c02e7061d49fb40ccbf097debb9a1deb5e69ca08287938bf87c6bf24884b27898e4004e52ff7c73737be23b893a41ca3fdf46f00ece240ae6dfdc52e5083f9c41869302e66d5e535292f092afa77181526f422a53a64c163d16174338b2e003138461c8f902759932cfc5100f14dcc00a2a4a78a0d2832c43414e2898e762e88733c81862720027a92786d409527ad4b711fc73d520547fd8349582387cd03e175128981e6b0e29981e9d28f526496640832a40416668a827ce212743433dea1bca7b6e4e4877454ddd69ed8c51e08733c628d3a3ae180566b690051cc4c10465caf4a8d37c3334826ce7b4e7bb5584ef797bd4b2f7f85acc87c768ecf9bea65260c62b9b9e3b6d5ff6e51cce129bde74fb8e998b7a5420bd95be7d3b7a5bde9537f486de6e418fb0bda177b7bf129ba0a6ff7c78093ccc0e7da1d738dfe7af714d80feaa59621374dabe8b9aa30c06a740a0ab3f0502351b363d17e34b6c7aae586f518992f78ec89f9b7a47fa731d3e59366c8afefc870271cd89fe5c6a19e34417699171628e18fdb90d957f9e4381ec3f87253645ef30a0a6cfa3b74779f6f5e83595f7f3d7541368cb7ce59a4a4119afa9148cf1caa6e810c8bd354b6c8a95f634475d31a739ea3c0cb5fd262cf4b8ab48e553d52cb042eac5581037b77de7edd25d95b6ff843c77ce4f03da3241da9d5744da9d4777738bef2a5f0ce80927514031f4405b08de0087320f7d89d0c3b9a49a9b737e1a92e8240a285ebaed09c688c4b93d211513f2dc39c4824057cdd95ea5ed430d68cbfcfaf371b36648bbf376377fd8dd0442fdd6ff9697202b978bf948bffc79d43057053272e872a40511faed72e98a0589a39fe8ea97b6455f97fb9a4ac1957f9a039d87991dd3a28bb47d29156b00bb6539a6592ed2745d311f6b6e965f96b62f9d87a56a974b4d5f2a2644e7b6af7eb9e44b0a11bd6acea62ee55ef2721e564d5f3b925d2e5df45b1c12ff9a3f96b3d436cbd7795a3122ecd662405be645ced33c2cd2f42d4d3fea43ed694e736cd26b7b8ad40b64ceb7d2bf9899f8f41c88e7a5e79e0229ff74fef9f857fae7199fd8df7bcff5e6cd1f4da540aaaeea2221f5d118c1a7cdb3d0f0f84db9387f5ec5e75f41ffc1a7adc4c3a72d0ec1a72d5b824f950bc1a79aaffc083ee9576e048daf689c76b9f864f31bcd6f3fbe72c5229b9ef3b08d64ad1ada29bee24701155fb9545eed11d09679ad9c864fceabca2bd79b6afea898ce22d548a6a91554f92da66c10e5dbf5d97bcb7ea45ec0a364c117c8d64b361aa38c795ef60774c9266b9aef07a84a2764db15e6d933f69202d94f805c926552477249e6d6f546073465a5bb6b3e3a67179b764040880a295c410a263ce14b10b2f4e8cc8c33bdff30e9f0495351ba3c3b107ce26717e2d2f1ecd7ceeb351525cb3b4d7514a91ae041aa04327639ba827b4d55b1e57548209e18410b2c2083154fb2e8d14baeebcda6a3ad5ce7914d5c044ba9981038377fe851df8c63d3dc825ae4253e496fb7e153252bcb9a9be522b72ac7a68c4f95e5edb2d2f6a5c5a6cb171352fa6b6e978bbcd2f42f2da8df72b9acdba34ad3979abe48cbd8c42657cdd96c7ee706fd79bbec5da8e927603d6a41ef774a957c3df1d055db6263fa66d6d561ca33577be5914dd56cd5229bd89db6edab432da85f7db58c4dec8bf9e87cf3e2d3bad3f4bd77dcd0d0d0d0504fbb4981f48bf6bda05d6f36d71c90adc7e731ab22cbb3d3b4b65f3ac19867b7719a03b275ddf727a4b2947a09f50eb9be9a18a9d89b9bd03f5f4df6b5dabedca105d3980f941ccf59298b67b7e1d35ab1c9671c43540b0fb4657e33f25810f5f2eaf25d2e05afa7a5bae009bac886eadc5bde61a42e15884ed59c5ded4dc7262d22db4acfdeee9c874b9ec6ef9bf8a4292ac43cbb0fd76ee110155ffebda6a880f23a83c63a17243f6b13a97748a6180384deb919a7ee2e40080a288286976e5576bed4192342e87f74023579f58d7d3503030a1aaf29285a7e8befdc87d714142aef20e90b75cdb1e9614408bd13b20f7d137a38236b24309e4b87f9bc560c7a0d9c41f6a1c3b9af376efe6456c8ff59dfda7957237db1ab41a40ec9f8e45eb3f36c770f0a616fe761e5534d10f6f686dbf35f9ccbe17d2c865d2fbdec9caba2c1ccfed87173f3e6cbbcfb829a97970a108c107d7510aae6341a5996358495b7bb2beda091b18295660a7f00ddcc116cb244954b19ad58c136545555d19066944dfa8e9b57b55fb0fcc23c8722e9caee341218d9f3e897cb0af3b99ee5bbbba25d85d6d3aeac8ac2a485ee7e0ee18cb2699f7bcf3d76abaafa949d97ee7eaf9a5136b1a97276e89cb373eb5c698edb75773b0db5b97755e5aa6adfbaed7e5f5c8c115e5abef2e81e3fd6aace412e98dd7b0f9b79e8ebcf2fe71cbf63136bc752698bcf6f0a5edc7bb182ecb22b4dc93e74d8ec2aaf309f8a679c9abde7eeed2e16c40fb9f46eb1215599321a1bc7b9bb505fc5b9b9182b2d68855467aa22b830c284d1459284e83f21389301364567afdc72e79c33434b8b7c128a6c52e8bd05f1bfb764141b9219018dd7d411b2f82d7b3e4294378297d7d411b07ce93575842e7eaff7e4dc1cf4b9097d07b1b2a975a6c4260db2efd854952953a68c7b417a2e15f3b171e9a07bc13f0745dbb92ab405ef9c8b7087bbaecd41e6a64eb6c2a6e77c9d459abee872f2da775dce561408bfc494109d957556766790f5e8d1394dfa4ad14ea6e5df6b8c88295da465bde3ae34ce73b7e59fb3e2ac74c9747817ff7cabb0e9f9e550bb58511c1e6a451e3c9cad549774913f1dce5a68fcb1462e9b8fd2d3ac0f1d10f30122e22f9a3cbc722935a998c857732ed284ac3b9fd1218db65dcf234ec7261ecec3d2d2b57aa49ac3c35d22bec256f80b2b649743df740c95c5784cc833199bb6f8a7c3754c2a5b40e91df7448c3a46c7e898a863361d8de44bf275b826e89b4bbf7cb7c617f3b1f1233608e8cf2fa0409c3fc7809ea4bf1c7c8b3b3af89601b1e1aa3b95e2acdb70a9b5aafeb01e35d59c4d875fd721c7afe740da4b238171b1e9b9d4e215997e741194f15a4c48f4dd44564457ac7cc1cccccc5bf8e498b3fcd3b23197e72e6f84116c92cccc3fca261e5f5871d30a3622553954235ed957d4229b248f2522ba733972ce39286cca2e27e51f94c679be51c870780e2f392c5b9c15f7059faef0a9e4cf5dca61715b72f876fde6acfc23f9e6b2fc735a74f0cd71f9079d732e73ceb9c684f0cbb921b99c0391de4d1dbeb195e86efeb81927116ce2317fb880e23d3978d03e1739f84eec8b6c7354fef9e51c069f5c2afa73b6c2c3dd16bc93833f775474d0dc50e33c971874ec8b6cd32c5084fc18c1a6e741fb44b0e9399c3f2e0a94de612a8df31c947f2e47cba72ff88a106c7adc6ef58d6a88f04377bf95e0618b61d3f31cb44e83715e95bfa2c65838c561b0e9b195c6793ce4dca16dfb3b1cce264346b65ee3371c87b395ded99ee77c854f35fe9cc3d038e35bf634996fa5a771551a57cc0787f3b08df684b6436c7a10632bbd7344e33c8f51bbd44c149b9ee7f0926f3a860845907cbd312224672b7c1af973fe82af2810fde70f2342027273c35cb443d3d7a171918397b41c58fe390eed8610ff9c46db18cb3fbfb4adf41b5bf9e7363425d511afc6dca2c867e69669d6e59f0fd13b394c651ce75b248dae29e716a3686e5906e7562a6d6ecdcdf45bf64fe7d7e3dc74def9a4ef4e8c0e3659917ab3b198872e6b646c7a338eb973a6a240daa14bfe5e89292153e7e16c6a67beda5ea9e919a43df36c76e5adb92b7caaba805efac2c378087d632c0f5df5abcab199ac77741a077a8c59cb4a73a2776ef825757cbbc86f68ab38ed3433df6e4353c5d9acef761e0e436fd888d1c6dc744a9672d12d5fb94844846ca5f4f4c1a6ca979052ae94cc6555891e96910be3c0a446a3cdb2c964df5d2b854f5be50bd7abb9ed670e3d450432df5ec3658cf2aaa16d186c82aed33b9b6a1ce8dba5548210f3a9e65ee99265ae5ec39fbb8dbf301a7cdab999b275cec25bb80b9f6a38744ef12973e88c854f330e9dbff44e0e1c3e9e6f406cece5a16f1ce661efd8f02dd2e4d08c681ce835349d6a774aefe098374a259ab9536cccb9b934bef2290f5d9230228432cf7c469bf29567cf8aaf488c09e157cde9b921b9f91aa0fd1967e2be1d88f45dc38df86245b4d7984cf667e6b69eb96241b289c657feb37309364157824d18865dc93697facaf78c4c8e2e171d729587a3764fbb2b97da33ce54780b3e555b54c5bcb536b1a9670648dab64f72c62aedaa6646aea92244f96daf3c74e77bc54b1862527cda740b16299b854fdb5ac1547ac789c6810ea56f59c90a3e911cbaa63fd268d8f41cd3b6f81b5379e80bdd89863db74c5b34c53c74230e3d0396163523a057ba859f10c63565c8bd4afe1afbc42f7d017c222203d2a5945b8686e9a56f9ac6cbad627422447945e3357585cacbc5a26ffe56fc6e0e8c4bb16937ddf2eb123a5ea8108e6a88ec4777bf35f9389d1836adf3b05633346c82aea92b517ed379e9cf25107c92fe834fecd2797c2b7dd6d7dc62ace696651ae756facd5ee6403aeb4ee561938c9946d5587935a32f804ff0e6f7145dbaf48b4f7187600a0c345ec100f30ae4558730e5f5aac0cdd662de8b932ba45186172bdeaaac17a2ef613e956f3ea26f37bf9bcd49d5b4351a5b63e1998677fa4ae3b0371614877dd71de6d357fa8beeec97c661e70e13e796f51588f954ce27e8f2db7ea9bebb2023cb7cdb2f31fbf29c4b5bf63dbff4dc2fcf6114c802015a31bf6d18beb1222cefca398c02512296f747b7e616d954cda8a33920be5b0c2443ee14324b27be7a49c76f6babfa8d188865c94abe180d9bb8fdb9ef64e7a64e188078a93b45a6a921907991bb48c5bc255d311f962e7212623e22cea243536ff936f33fdef2cdfaf5d51d9dc6b17c7f1d02f13a7d39265adf4a22a93d73b1297ae53a7ce2b71c083e094184e5914be6e5ad4dc1bc257dcb14cb5bce26cb5733b149ce1b365970c6f2e79bbfe53a16362d57e996f46b6ef12d57d1dcb2b7a4efdc4a6f796342fc4522972ef215bd48a48954ccc3229d3bed094f739ac32e15eb5e22d314962bef148802d175c26b33c3d25a129dff698fcdcc953bdf90e8bce52f0659747de83b6415c124ce243a5fcd1fe770c69e595c96320334d8c0a5066bf00214a2f418a0024fdfdcf63be869714af6bc554d104e3737d43be75a2d3684fe9b411891857032e1776f790c2955cca3b170c836fdf2ea9a53800234914219c6888217306750811946aef8879d9b7318a7aa69730ebdb12250ee395f6c48091e46c47d9721852e8d09117ad773e3eaaa5cc62ac609d45fc1221a506d9f4056ae2e17a8cb90791e5acde11de2aab96a7a24705f694c78a712e841f1950465ffcf577f403dfb36f62ec7841fba84576343dc4397dbbc3daabc9a40fd509d1382cb62c81a97ee5daa40385eba413014a24b3788bdb04b81f415b364ebd1b14b158888331d84e8f07102e9f0a320d903ad9820fe40fbe523d63c828f74a90279afcf45de96686e8b61453c771eb504fcc6111392808f1328011f5d66ebb8dd68093f13f8b1bd7245bce9a2b5b00a654821cc43af21025fbf6b00ec4dadf5aa08e8cfa3467a38ddfe9b2d84b42f54ed12218b10aebca682a0e5b3d75410c27849d21b6baf90459e050c11a17451a994650a7d8c7c03e29d481b61ae99d8b48e692ab54b8b37cfb29c3165936565425ff962ea136be0d4cde996d71d84e43617a9dcbda33a05122f3314a4de6c4ecce5ea2e5eab854fd5cbebc296a0ee377c521214df39d09631f9d0d92f7c1279fb82e113f4f60db368f029f3f615d33b35bc81e0d38cb7ffe013a9d2dc4b8711714e9a9b3fe6331ae6236dff7aa4b9d9ccccaea2ffb012e6ed8d1171588cf2ecf1c508b1205574a731891fb7f8adb57cfbb664fa0badadb0a91dd3fa4a185aa7d8d43ea3351636b593b4cec22621d96373dbc7dc69d2d2a2771521fe23bf7c7396436b6ea35933f2382fbf6657c146333201223de624a7619a7e5b09230b972f68f4182752b2a8f2454a4b1707864ffcedb286e6c48b914be13d5e388711c1dccd6d3ef46c9f7d14842e7ee41023e2e646c3a6f6d1cc347d1196b1a97d9bc0d810fee70ef3512244dff24ce317613ea4a9fac30689b08f5c31222578e85d854f236f1fcd8d1ffac38860b3b760533b9c1b937d915fda06218b6717614448bf7e69fa221f3981566469ed03cd69b726505771babaee8d9cf3b0e6bcd2faa1d65fb0a90441debbd95634a797906d4de5dbb7b6f2ed4da5b7e053153ea91343628b07fcc5396f1c77b361b28df4ce37ffee2629109d0a5695f330ac760cd9e65f553efc26a329c10775da9005d7047e4c93390d0bc2cf53b590959c73cecb3ae725dbb277253ed1b8e8de7b475878b109b209fa6c17b2adf4d0c427e8253eb143b7713e39877ec3a7e7d023f48c4f1a098caadaad16ee1362a5980f0f57b09a3f555569346c8a952b7d8c31c6e831c618a3655991af909e6393cd3f1ac6799e7121dbfcdf0d9f9c3f578d040684bc3a5cf8c28aef214c1980d005085dfc2a6f8f82f42b19b220320c590e526f9c8299001ad916bf4b1a78eeb435c7a6e7a6ae17b22dfb97b56357a7619318b28df44c52200b862985e8af10fedd2d64ebaa43f37d314ebb62e1a68f907aa3d87e21733cecdc3907488d40a6291fa0f137af292b5fe00e121859cd10f7e6cf9b35ecafd21c9ba0435e3364585e20067a21f5c6cd44363d875c78d9dc3b2e38c834f5032afd83295b25d31410b2f87740b0e29d732b5fdeb90dab907527f520f3f1ea702a9b5ac7d42c04b9c96775a7d3392c4890293d80622473bec531af291e84f9e7ea31c62dfb25a432e9b58c28be901a77ab733a5d778ff446f76d906d6ef972cadbed46aa39ced7ad129c6725ef1ded71aec3a775e7a6e793a684d0e53720deb9deb82de3dabe746c6a75988ffa6c1cb28c5b7dbb8c1b20faabbfe318c76d1c325e779eb573dddcad185279477b369dd8b3fdc87905e29e9f5fddc4c33b9af2c0187820460eb6a04217507a7cfc7ad63b4d6c918531585c81094f08424f7c7fc5d69f0a0fb8bc0faf292faebc24e986e4faf627a5d386541f2750d5e4d96d94ca1fcbe73d757f80eeb407e59dcf9bca26e7af883dc1fee0a6ab9687a0299ba0b3afb6ece4ac19423fba10fd38493dc8fca3b70b7da56dfe55e55c09fdd382de3b769e167abb5cbefcf5359cb37851e50bf09aea42cc7791ea62ca77b1e5e5afbb292f49cea53269b483c3551d083ec1cbd585e093c82b67edf2d5a0d3d8a8d152f2b47cb52dfb66efedde1fe94d9eb5adbf3f3eb7d6ade607d498bb6283687f3ce3d8dcf8a5cfcc8ddfdadc947fcecc735fb66ffc98997bfe582e9d55f6a59890feedcdcdb1b665cf5008b593772bc13f6f6e8bdfa007f14f7b937fdad643faaddda76deed9aba96c7a9bcbe2f96ccb58110cf92ddf76e7e6a63cf420c666767278bb76edacf9f33638e31b83c9b1bbcfbbe276dc8edb71e3b806c8e73b597bf086d3d89835e6567a731bc2fe8a607f95af3b2b3688e7db2430b220feb705f1af43dfdc94affcca302135fccd9fe7eda41adab6cf550db731b7920da799347e633ef6ed46c55b55d5bc31c284b0ff6ce51856c4f5ec467a8766da983b6b4c7e5e5d595e5a0f5acfbd55c46bdd1f3667c5af434c08fbe5507bced333dac8736838a2261dfaa559d79b4e0a9b60ef3cdfe296b56fa51b3ee929c346eebdc3b3a59e5b89e79b6eb1b8d7755d58dc2b3608d89ebd8dc3fc9b5b90db41fa42f49cdd72de41fa220b7a5ff9bab5bbeb0da8dc822ef98a31cbb6d25faebaa38ac3bed8909d35d1a5437fced33b461ac779a994aa1cfa0ee7fe72cc37fef27292c0c8b6a0f797431739495336491fe1d022e3c8b905b9af1c9b1b7f79e81113b2fe7379851571fdba91cb63ccfef22d539cadf4d7dc82de570e7d2bfda65fde6de5d245eea4f0495fe4ee8a0d425fe410f311b9296f69fa1e0cecda6ed261d353e7563c9c5c58fe947152fd85f34d55d5ed8a01093e3e09376e2a8581a50c2c3459748c041e057284e6ac0fc1b29ea9c43b435c6fa3796f8a2c8b17df7bae1ffdbdf75e7cef0d01fd3d37a2049fac6ae8bdf75ef5ac5759f0c5f7de7bace5bdf7c456f9f27ca73c2178a26221c10da210e6cb23d12feee17b2f6eaa7a01f36061023cc310afeeb4edc73b672364eb487ebcaa8a71e50717215beff6f16ae5dd1622e816d7dc45d63f3a057fb9e54a8402514273447bbdd2e8cd1fd1386b6a9ccc494bdbe7e8712a9bccc8b64c349b47e4d1e443c7629133129d7522784759e3ac08fbf1a377326fe7c944da3b348cd3de8ef913b2cdf4e3db4d3ef87479bbce0f21906897f605f0297afb107c62173936379b6b6efe2daf89e4c78bbc3122a825b0600b2b8f44bbbcc85542fc60d33a9b80d02d184329c812efdc30ceba8ade90394321f31b536c24a58f34258be6559d85e4fa68c52de9b014a24d3ddc7eec18691c087df3f136bc3344e3ecfc681c284f90b91d425591c92998d9e1a3d2059fdee4c24a0dcfe759e340a8625cccd4c671fc45c616f3746c7a1a456fc8a00f718402a91c3a3b2153824fa238e4441012d33b8a08d1dc94cbc719e4f60bcd81ee34b534d11bb29d0277f296cc89a027b60a9fb68c0a9f3637854f5516bbc50f21f86439b44413896ef905020cb45479241ae6d7725f41b761b8650fdba16faa0addbabb5fa5ef3d1d1fda7bafea760b84e6a8bf33f00fb2f521b8edbdf79caadb381a16382fb8d5e34276e80ca7f21622344767090c21d469b2c764ece6fafc451864e0260c24375e20e2cb172348e7e508227677775743a2f3bb5c78b4cbef6211e2878fdb2edfbeef8786f9f6241ae67f78f615e4d2008185a6c4dceddc7b90b50af3f1f8e2d3787d749e86ea717ffc9a6e763d7206be72d5b69b575527369baf342437af42c4b9fdf061d238b7ca5ff543757c389b748b0fb26ab43df15110aa56340626ef7f2a8fae509352dbfce165c4ebbc4449275e4a6d33bda521d17929af8741a03f273d2e25a5bf8c367134e35be9230321db4c3a7cda90e83cc92de7ccd91239bba55d1949cbd8247d462b310ea6d1b049fa623ed773ab9a6f464d392f2cefc24566793937f545a2f34974fe073ae6cf2fdfe0dc749eb669db4d94513a8b91895ca7774696fbf01b9b5f1af591a6988f3537e80ed33623a4cc90dc8c600a3a988294d7578f979644e7dffc71d35decc0b0170c915cb109b2d775f8c7f34648b3964804793a6a1bdceaed7655d13c9f4009c07c583a76375e62243f5648b44f0d4ed59f6f10aa43f51fa8cfa96b7313b2f5d5c214ee6daacff5479f3b9bd2f3cd39e75c73d4085bc9d6dd7bb3abb07b5555edee6665b542eac86aa1afe63c7729e65c3be7dceef66c9655066e78e01cae8c9711b7f27c9cb377c79113efbcb51d64ebeddec99e5bfcadaaaaaa5b5291ecc56ed7ab73ae313a77efe7710fdce41364715a686a44d1c28b1634b4163590b02880962f951630482c64019e208427cce071bca69e30864785d01f24c309571e5a3df04d243a5f62d36291d1949cf086df32e6a28550185c6491832b54a14a1939b88219646c384105385868e00a2f6660822a70410569b0c2962dd4fc408b2b59ba98e14b153d5515ccd0c18c1960dcc042a80b322e60c3163ec8a2073fe862861392192dc8c1c36bca0954f81baf29278c91f267668d3bb7e82e6a5187ff8973bb7976a7e85b33cf18fdabadb465d10521f3d7e77e73cbbefbdf61991bbbdb9c3b4d14848c06595fcfb9fdc2147cd0c0074c982207627ae0832fc4e00c56d622c6386fd8b4ce262d44b8b420a1ab1b13166e452b56510b1d57acaa8a5aaab0a165068b8565412b36618cd4628288c50ebde1b941c76f4c39baf039b4fce63a9510a4f2696b5736e94bd513fbd6dd1d7753777a6ad7ffa384bf3508c7cfbeffc34af683985f31225aa68c0269dfd89d26839025e079aa506f4fd184304c20a3f392b415575be8c21667c8029922ac80093d15151e8b2c4ee1b5094cf8e734a5ded901e30b0ea2e0052a6800458f8eba185f534c20a35f100327566025055f1083188cd0042e661ca16aa082173574e10563c05091020c18063aab6a4546538a367c8a93266a49c347a751021b3ed2f4c418a3d3b0a9147dcb2c8f567468cd2c56312a21ccc7a884337ce49e18633569b2dfa18c5f2aa329955e534ca8f2365e534c70c16f9947765a4a2f49f1c72eb70022b979cb2b7601135630afaf2a57147cd55355fad58da6e07b8f0951fe95e090c1d71413a4682928a14b12d0602b04e0861474e1c4055d648085282c010ad612ac1077302242a95a020a6a9650a527dc7972c698369c610b66a0000a678861871b9ca00c46a0b2852bcac0c2962c5dd8c822460988381c214b12ba10032e503c214b15a42c58d46014e4784d2dc10c8fbda696c085b806b711da3c7475340ca1bb182583aeb1b2411853908213c4c0862dd0a0073ae1a1672587f04d4641a68e06ac820a565a929b086f3e5a9c82acb234f7da3b9a8ad54c72f370fe387f93083fa881952a8c49431aba30e3882536f0820d880005183d18d28203130ca10d6414610c13a0e8d1261ca1c355f4fa0d5781e4c6e6ca19c0dc8cfe41e91d6b4ce3b07b9512956c4a494a8c59562ab9fcc1a7e755cc868686a0e8797db9d4fb7687658b962e5cbe382fdf61c07ccf9495a5774a8dc31e639649fe518ab17b06e17fee9f042fdfee9f328194d754146052515ca9021ad2babab089ddc286e0fc1b6293454674f114d9668da9309f9e2576926da5d29b25b6c66491128181d2c51699c69430ae2f4eaa68c1c48cac50207cf11424303227e637d7c5a5c13ba3e8c8644eac29bc6365691cf64825ab52b2f26c65b9f26c89493dffe84ac79865dbe8ca36bad2658ceb22c284b81bd33b51c39a90f5ec5953553308cf6db5fc7a2acbb35b9bc2f296186bcc0e1ecac0b8307cdaac31ae8b972f634a4218715245cb8ab1e20a7b19da224ba321c57da140f8751448bb3a10ae4be3b0c79865a5cd75b1c8b0897d4be90d9ac3be11e0d57ff08e6848001a84d506fd815d7b5a6334879da1c8b6eb37bea1eb2a75a954faac24c4bfcbf04297d732c090f9cd7579761f5ecb00b3e5d731eccdd1f5e477a586ef0b0323ebaab2c63c3b64b2df3544fecd9ff6e73ddf0cda77222a727439317ce276dc3d570b9bd6475f20e340a30b28efaf291d34e17730e6755e533b48c223810b962cbf2e5fe54fc32c94e79e5b5096c10e9a0f2322fa9eee0a4c48e54ef5db4999c2a7767d9a103f96e81dedd7cedd64da34ccbc6113f364916dda254c96eef2ec4bf4163b8c9b619e7d88de71c651dff8cb3bd7e630a5d296fd1776eaee5d6b3ece2095a5aa563928234a94df32aa486337cbb35f430cc8d6dbb1090161b009549f15af6234b5abbeea8e8acb82cc982e5cbeb0d2523a0a1a61b260d982a9f010192f5dae7cb156ac14314854cb105164a6d5d51be91c298a0c081dcd216d0eb2758709599c37b1493707d9f3d17aef84da5cbd5df5992f5e168f897976b93d2b5e147e4e1c995f776938317c6adfadc13cfbe6b2f8bed23b1816c6617764e2dc3ae5a49a5b6789f25bdcd25b9e9f15dde5d1f82d60386ae1397679f6cdf2f17b63a33d714b9482eec4c6b9020b89df134bc52d27c8b63cc72fcb45d964dacbd4e3ae4cb20e9ea3448add6a6ad51fda552381b1fe0e1303d320a1b7946c02082184704ae94ebbf96a6e25926fd98f7c8b0f31dff89d6a1037fb83081e429fa9e11c45a66caa3137d42741cb671f5d322ff7a8c603f5d798aa39331edbdb6f368805ec0f9dcdad948d66c4e616a4dff9a511c1a67693e5ed0bd820547f1079972cd78d7f532cdf72d5f1686bf2434091399773bbde29d9df344b966f87179bd491dcd410c9bef2ecab19d994ed8bc355c616644ca1f2ec4b265b13f6c43fe7b2b537b72006e8f70ea622db56caf34ac19c7da7f0e972f6cd824ffb4ab2011d87b32fd13b399cfd8647cfa12dd138ec3834237d6332e3f4dce24797363412c9336d13facce59352ba107d394bb0c54b17fad636ff4c6a5b7b0d9f19390fd7981b7b79923b4d683443729ece34ed8b449a37467a4787a310e917e612f3c1463ed2483dc8ae20725e22bffc39a6edeb3f8798cfe58bb55f1811427f5d3b83acea9deda1794fbab651d8f4781aa8fa76a17f5af6567b144d2dd2369da82971bfc5cd5f7d9ef373f7b47de800f18a250837546ab0a80ac94e9dec0a1b625f59e4fbcb731f6ccc472412b9107d910bfd6a9b1b79f64ab33491e63cba62fcdcd2849e237bf9e73e6fae73b52d8655296ecabb2c52b620e7a6b82bdc1437c50be9abf1aa73589c35e8aaadd7b06f94df309e87a55b28af0ed539c47c14c2dd6adfb6afeeb4dd853a37a18fa213a8e25f77dadb8fac3d1dc86507a3e81a65b295e65a2d04d92586967f4d8921c6af676e77975b0c349c730fe688225e555555d1c201037989442291bc443d185d188661231224c2cc9565593653a3861834970d1b366cd0dc184121c78503070e1c394a4e0b3b2e1d3a74e8d85133d3051e970de6a3c54687e6b0db604296072673b85a53574c2b691ec834258697df2e1d0a44df4a635b1daed55270b062059f6b5ebdd8460bd6c7ab0bd1b32996d7ac71d62919507ee635350616afd896cc6f4c5be5834fd5bc799ab3090b0e48134e243a5f555555554981156104c10d5cb2a882258d0c8b93a9423850811731185306384861a50c28e81083c86fa066e2227aef44df38bd71d677afa092050567e0e0cb0e7a2a32bef2ec8bbfbe2a23f595dbf0ce4c4ff5959be68644e7e10d0c3275f71bcd44262bc06b4a8c133c8ed7d411d2f8cdb76238c6be27447f736fd500072a9e50810228526f36fdf2ec52813805e2ae6fad2608efb71684df79ef3ba7d5acebd704d9dff9ccff341a360951fec57aeace2cdb80c898083e6d3a12f801c4b36f3f9e1500650a8aa36f7ac137130fe9977eafec9a8677321bde29294ebb9a3a0826f1d74bbfbe55af1eaf8c4f979a3aaa9ada57533535bf6c1fe78b1591fd86e477777702a176467f4d1d81cb9b71c3210f3dbb12234499abfbd061132f806726075cc9988f12207c745481c8575fde20e402c13b3c8dc3be09a1a3836d375e7b3cfb66f33a8dc32eb25cbd15480452b9badf3c9dc9f16a7c8821a05cc0109ae21902f68ed9a1a3e43b860c9fe4f319677f3b749448355a107f0d57cca786f3700e1bae24f3a0f834ced33b71887d41a65f8394c37ffc60930ebefdc8c13701f0f00de7dbc6376dc788c661df744cdfdeb7eb06217d839a6fd74e0fdfb21b0ae4f29e1b12d30f2cb2f64d4788ce8fa9896004fb03bba6a1d8c4eeec3db475c238ec46f48e3ad7616e3ae430b7128f69336fcc8da239ec97f6441ad9b55c14083ffba5ed15d11600380f5ee3da3b37bec3b57776701dceb38092b33fe8240780a68029a6a038fa351a0f9a02a6c082e2e8efd06e34054ce105c5d1d7a16da5df4153c01464501cfd92868267cfa105310e577201f1e3862b066f0ca10f27927623ace7301f23a27bc69ac6460d87f9cc64103a282e8022831b78e1dca5ad0fb4fdc1fe70854d246dad680efba62163759a04d8a4f3c4146a98020e4f5060049b18fad3302541dc03a11efa10f750cbd3160b9bf8b12cbf2936b11f21816d53283e41e1d3b652ac3cb143eb64a3ac154df14c31c535859c422abbf32d079c73cbe0dcb21cefe696835d8a7453bda33dbc5b4efad665854dd5abaf0271ae0e36e6035d646951eb1cf7d8e68ce71bef187be7db66797f76cc7b854dec3df70b36b1bf293a23db748b956797009f565346e81c91013e6dfb4509b682d97552bda3002841501c3582e2e8a790b0450150cc501cfd6dbb3cbb1b7a1ed2980716b6bcf31f40c021db4cef7cc7f0109fd64960643cf49ba696080a847f0158bca67800e6b70df3ce378bdb2ebfed9628e55d9cf22e52d962151d2bce37bec250de2d1abf05b9d7f2ceb3704a06264ebdf3f5e13ab565329e37798b6b8104a294b3f1c0e39964df7e43a19eaa93667a12b9abaf06e19c732ed23275befa83f3c582f03bc5710e840e39251e78bc93ad340a84df69ef981ae739b665ff74d874f8d71a93f8d04dbd6344e33cc74c7f99b6945e1ad13bbde5c69621fedbcfb74bd6e5114f1acd59cff452d33a13cdf7f5fccf53a7977f12c07c8cd081d4da5d749a12a0a0f855fb2ce6e35c17462d6ace73d62a4d4950f652739e5bfac3f37542b69598906da57ffdfcd5205b28bf37af552095251563a8e09534860b5e558d4865078634f6cbee6e6b4bf6bb355d31dddb96b71679093689a4e5cc0e23e603ab07a1ae15a780834b74f6cac58b4af77b01a4ada8846a55ea73819e041d438866660680000aa3140030381c100c07c4f15099761f14800c9dba505822cbb32407621442c618448821c60000100181111a8209e30c1f3dcd138333c49969d4992274498663619197a6657de862c6a8d42c34260de0ad4ccfcab6c64a818d46d0ca948d229235efca718414341656e6fbf8810e47966b831a1a22dc1a3c8f2d220e2e3f2aaad5e132450ed6864973dd937cea2411d874295c7754d22525a40b0614f771490d3bdd41dd9a8c7d799e5f429f2a63fdf53e247ca467777ffa23d49b7cac120d62ec537116b9032d5b1069d0e80b8239c81fd2358ba91e7c12714ba11af8f46ff2a10d310f26133017b86f8846b498d00c34c3040e1a67f44a37339d9d4937238d75bb4bed95a0c07a42bd1e75beeb951adecc66c5b1479586e6c0a0ad290e6b81dc470408c8e91578c1007adfacbc73c67574a77b29668685ee9e2f07bbfb88148218501c6845d8407b1db8ebc68a83c03380d515e7151b6e9c543a032a9829529eab2f528a473570df9ce18e23a08888fe2b8e83c31b2d33aa467233b6a752fa0df070e5f7b98c9f7aaf183cf45eb7de8bb5e20693fdaa0d8bd88f066d10f986c85e31bbc182e3eca621523222ac018f70747742351c8738a2d426c4e6d59cca53edd1c90bd5eb5d61cc320ad759ceeccf25262db578f537b1df1b3a53437408d5739689acdbb7001d52332c3ca648a214d4a3a91a665d60755a80501d2753d84b7cf9de8f28902ad2e9b3e4be64d2e3d2b37e8bb6822c19a8ed7d8f46261eabd054bdba16680e43f3c5e88453c26e5640c8964b01005e5c91ed483fdb30cff1d2b9124ce481f6a3266647ef998717b13fecc70e39f057c898db4a924e5ff1862e4003940615daa1f036f77f8cd3c6ab0344e54b91ce017bd062c1ac742b20e328ca00676e51d05c0d2c7762ab25abec876a9f7230dce559b8100107902004df2d4cfc85b827023c9c33332f992629eddeb5f19283bee25942753657b7ff58ef8d43e726616878b661b3131c7b7805f02ecaadf7db05bdb2fc9bf114f1485270ff6d2b05ee38d3f71bd407464d1f0249404b1282522545deadfcda98f1094e3f7d878548c6243987aeed96ec72bf7374709e899d73c8ff2a4bf5965c9da3f4823a2e0ca23f04d1c12eb82417cd4a4b263835da747d64d7d068230df8295290b3fac5404eb9439ca3f4c26644c267bdd1b185ad748f8b27fe685d6a326d2120e276a8d6a3eaef2fb9604b5af9b18aa023f334ca7bafd259bb9b961be8fe1e37f7b07acd65e92e72a6604a0383bb8b4d2226a3620df31fa05af51174cb187de060e6cb473c68a17179fdd2b0fe80661545da8e41d3700142417f27be54c22ff44e581c9e048848cfe399884c58cf124586082388b8eb0ff14949cdfe2865f24713c353b23433911f2c5ae18eb4f68bf4ef90d06184039ade1e081bb1cbd1a000d88b692fb92136de204bbea880c3643602456c4a162d9f8114c8b9065241c0ae3c34fde5d4e450b4416f56ba1c0decf761a0e611649f38ebd1c279e90a70bf4466c5421fb589ed0f9f20962887c87482c0361000e8629face1ae861b65d7e0284ae8bfe66f637102054ca821bc9f4893b9e9098f9b1f941317c929c3db76ec406b65a84d28ebf2a90e6f5aafddbe9adece52195aad920e0226b28f1ec10dfbc38a89f1b1c99e8436b337fe34041e9be4e74fbb91f317ba72fee64167182ab4c85f7a595f2c4f1b9394327cfb2a1af940aa81758e0091bdccdbea04d56aca83f34652be11a5ecb38bfdec26d04da96a6fc8556c92cbe4ddc1396bffa0bdead89779932e3848c5e3372a26cfa2e5d617fcdb5595d457af62bf88a1cfa88fb7bbb52975fee077e3478df8ef63836d0237a6a608aede3299744745356fa06de183cbccbb9bb56fcdd05d1184cf3392dc0cd36e61226f2e35d354422a133d62de389c0ed35a122bb9cd7be0e6ff395ab5f7ea5cdf7a8fc43a52c08f82a80144a5eb05cf2325246b13aa770df129afabb99f60daa31bc0c07d34f2ef4b3ed5fab1cbed35a1da14bc3d567470d5867af44283a8986ec16c30b7e96140450042a9f69deb7ebf484d2ee922a91720710aa81607954b0351a401c9bee7de4bae3c0558a6e45ee1e2a2167c533695a2adaa99bb8cbc9a5b0868db08fb04fa83c8c6d3078b75437a3b62812b5c33260793cab2f093d9502d7339a95d53e3e0003b48089c89bd83ddbacc786858ea624c35a44be873b42e7cfa1c0dc542bd5a0aa2e1afc784543cf23bab789279e3dbd706a322c053ec178268ceeded25220d76e7f2e718f693b6dbcc24e02116cd5b993594c1844fac80d0abb2e7f1727a66161ad16ae91da86f4dc11359289f1af7ffc9edb2e00487d289194b45373e9d7745a199052bcc780ebff6a3d65ac0a6c232e42b118900c0afed128660315c22074e0a00c7dbd5ae01e5c14bbe39a44832e52c85057dc28047b33371141c30c88266aacc5832e558155be7df1fd5705755bc9005418ea57501aaf0e26d58c8121af498ca4427a5848a2a35aada2401b0f134c1e3439cd78b9742535c257d7b74cf9a56b0149503bb349318ac008fdfa94049801d2f8220b5d890234868746a439c8eacbe45c1e0334cc216861539b0efed855f3aa4c8d3d584e5b8925c1112957efee2e1757d74c622a55729c16d000ef85c61a359b1b39c81dbff6fb64a8f454f2eb6a4dba2b57ac87a6c34b432f8c2c1206aad63275d99d3c0331715454dec8dbd54cd859c720f6771a5bf43af60b086d69f80452faefa5d251f716932365f4b93eeda2c4ef82479a14156271cc70114377cbb3cb1261fb8c59e49335dd32f8f061a4ef773ccd6c7e4d88cabc3333032f7afff513e67fd3406a059248f1acb0ddda741a36817ac99a3d01d0dccb1bdb01e25d4e440f53a8fded01adba65584445d35c09641ee23300c3a351e6ca04a83e740ab42e1af9328bb695339b5080d34b1b0e7d69df01389b88e02ebfddd18dca3bc23f33ebfc30551f9abb0c439bf4754092f0110568b05504022b9b4e6ff36232dbd4381e5a599a9b35a5a47e1ad8436cfa06299d664f0304e298d3c0c40201099dacfda7173e714da18cd8a67e74222e91108ea1d3504ddadb023cf237d4c5924cef512212c994e8b9ec850e609e0887bad5da835a1268e1b02c1d3cee9c15792662ff74b3c4d441c27cfe3430eb6259dc6eb7cfb91c17d6e01ff404f857cca1c929810946e0c2fba2365a40bb47755319ce8f584c939d450962f4ae86ccecc64642c3686b505f8c9b9152a3d72e62b892cf57537aa8849b8fd4897e059996c04dcb3b3d727697cac57f14051cea1da7ed1d83e81441e6188f1a28bc6d2f716c1aa1336e4a41933b49974091d6247834c607ba16f9f0143e584ed824cd028a45fdf20c23e57b75a3e1b8f740766af9dc875025e9b6594e8588794ca74cfc6e162f30df59e4de7abe3dee536c7a4b4db78b73bc6593a1b506d52845cb611e1ad3eb733153937fdc566246c07c9f6413894359d55765a440accf2f9b642da36dc88ff12abe4b9628b930ceac46c06dfb6296806fce1924905860ad6f4d68cc7ee87b0bed568eb90a13789a6b4435cca5ae8364787839b4d070baca49cf1704b60913b42620163e70fabf5bb12780ad087570e36508bdd080fa9bef1d9407359b1594423842f5166f0bd6b2a216397c84e6b262acf1ac2739fc2aa74ec306f0f2a8dfddf130a68e9c099fe4283bca6f1893f34fc20005fca178ee03277531285a355e7cc3b48c72c2116509e812c7d7c5167d6576ccebdb3a665a215a06eaee224a374cb6212c7b4c6f2c11390999769b0a3ba2a755650ca86a9d31c55326e10fb6af0c901fff0ca4c1a2f4c6eebff97a90a80f84365c40ff4194b225988d87661e28e725273ee61f6166a21c0276533a99482858cc596ee1e148ef8fa24fa8e8e1a61e82c50df5823219576b29f7eeda6db57c4690de60f179d4e6a11ed66d09ae6443af9618ead9d0172bead5cd4935ac87a4b9c6916f02af8652c261e5686b81229d8cac9493e6582db765c72921b7a403a3efab39f58975026f5eeec230a192b0aede75b39377055117c51b65c67984d606c9b3c4e985750c0706ec669c1c830fb0de188018f714b90c1183241dbe3e7f6ae9250fc9cdaa52449b39c7b4a1e45c60c88953b7eeb50292f3f8a136ebe10a0ff27626fb28decce0f660214e904d9c7bfb6bdae0ae4cacc9a9b88d275fda8efd945829fa19fcb8be9be07ad670252f39bf7be488893220d05b685705463a4c104e25b62658a6c7c6e7cbef7a05bb499d03d374c71a599518a5153fb5afa81c32e1ce714bfbb2af6dbb9fbcf0f5d5d3f2c3157c67178b304c7d1f303cb20b6f106cc527e844c0f8dcd1602457f88575a03675c355ba2c50526a4b206f5710fb701d08866f48dfcaf17235fcc3ddbc6e70cbe015963f4dba28ae348d6e9fc1836b23a862c28688f80153525eae0f6ad0148b6f3f0203e1c790b146ad2a07655a23bd9fdc816a22b8d0e5d9affe62425e0d8492a04089c2386c5ac2c2865cb4410e3e8818e52b36a9b5b320818a3fa042573fe30c0ccfe1da5a9d6507e6bac0030a5b488ff49bc903901374fcf184d49f7a222874aaab8c685f7bca189149712348ddab99e86e017fc36d48a171d26f3cbd98d36a4a840033124156da2d28a02b48c78cca67b869f43e6eb40710f266afbf1b105d2845dcb89657c27c8c0bb7eed281b44fd3bc00796866a474b5c67a5754963e2437dcff825b443532be8132b33d0a1cf565f14df44087498dd3a59c490ceed6d87be0ce6246481b4bcc877d5864f5f42112dc127e6e44b432ac713fbe7f12c8494c9490e1ba6622526ad3d735984283d34afa9c3bc5924ad1c08dbeb1bea815f1538683175fbad48d1897586a486ac56010ba44031f2b263c3e2925d665e85850c09494396be92a34e41c3d2a3c16a35b3d94d04c6f5250b488118d457c962c3365270598967585d5a374123aa5c7a047f183547510c476de7c5505a8177641e2423c5c4670a9ef59bd7e29024e2d5742fe472206d02859e985738483addb5b3f2fa6a2ed95457a1ce740a83bd97ad355d81e309896767b31b15a6776df8b900986ab92d590897b3fea11742942e683dc4f1815c2b62c6b81bcf4987ff4bef20fd7f95a4e95d710afcad7ed02bf159943ebd69e346a588d6594eb1857c5a662cb87794fcff899297a81e114063d709ec4b0762cd1a096c5c221e95d4010eceb3746e7fcc6dd377f103298892c9d54422c604d1a2cd4a27b70a0473646fec7b97269a1047eb08033f7692e9083cd427fc76cd470f81ab473cff6d782cc657dc24e1ee173f91bc0a94bdd583d6037ee2f82bd23560c1aa55ebe459a37b4568e4e1cf6e622055621b9625b5544e96c7439478d7aea0478c60f6ed2b036723c476a881b0325c42d5bf9a9611c27b7298b167dc58b37e9856fcd9814a5df732805802fa94c8b233110e8934671bb7580ca9b2cac7cc1864d0abdbed0ea1dc0f1b45a184acb83f6d4fa1ca70cc2eaa7a3d945cd9deebc1b333b3df8b923f31b02a7aea4955705ef2fe8f12fd9d4560401290029c09f09bf62f8e93fbdeea8b9ea5e917e017d84049382ecd8f83a2730322d7f9f4e2b2a0e28335dac91ebd8e2ec24c6848da6d9c09db4740c166eed0e45268b528d36362ede6d8a6a9591f99a2815ca9c9351aa8fe57723f95c027ce97a8142718e8f3aca685cb40e66685942d6bf89a33d1b4490149cb8610ca2b037dc7b540b87cb10bf44c3d2774d38afa452f602c11749d1b71446beab3d65e5e09b466e0f33a798797acd912274ac57927dd466b3efd08b493eb5762871b52dc05f9d0ac129e5be6475a3078b64c4ff4c72696ca00443daf1005faa48a6357ba7593e08f83f904043f1e88eaffb0d28771a3ec9bfcad163280922849fd4f56ac6307a4c3d2405b0464823c9d6669975fb2229ec737beab0f5d3e700b839383f9628f9c975b13d3f1ab53955fc2efefae9a09db6a3bc553f56dfbbf7909472285874d938f7b2e8af479c9973234b948c2a17dd529e347e82b7d199c99b6e98dce0a89c5ca6b11ada1af43239a38426f8d96571afd62d2856b7acca93efa5e6b0f60bdbdfcfc1b84a14bad29058e3eb3463a40fe123bbf03cadaf154f7c648e7ce0837dab11912d22c0472c7fb3eb50336f99e3a5391b32a394bf03829f9ea4966a11d72ec3a4e6db375d06d373e9a2f5f23ef33ff37c73c2aa42bcbae960cdcc680d153b54e1e117fa237848b6fa6aff7d20efdb35d10b631d1f59eb30c29a6de30a83662d3c88c684551c7d6714bb4911f3b7dcdffe43efcb4c7605b2ce2cb78b2e05e05d9f405c248c71a5cb8cdb829f029fe1e5bb9158668fa18d4038a06cacb4229ee5b7c4d1878956d385d9bf2382ffc11ba6ea0f01a927cc778f1cda5dc954a9387a31b0e7a8c1bde866efbcae463806cad97c7b39a6032a4cbeb0ab02195b4ed240a172a99021dad3ef8c8eedca47dd0b67ffa4c1f744680da78a0be92923fe51ea664cb0209e659310ce8b4e7abc3f019fb2f1bffd57b0d8b9ae186e431c85428bbb21892f0793481bce34d15dbf5b08911b77fe04d992f04395648b66d055942e79d0f45301ce12294e85b2fe25d514c5e381563108ea0d700f823cd5c2fb6dc155b21e7bb39b75ddfed0e4931ff63e56b87db8b0bf6c784412260022a46c872df225ce63a0543c22669c476fddc0b628c66a5e048eba66f2edc83bb08907beaf7ab0a30131b148a3894de572e457c8e9e45711b7b238ef839d018f48b837784f67c7c0d5cb3133cc2c7b0042375d2fc8f853aaab9dee632445fd264ff0f1057d5b3439310093e8851085e8a3e9d61a2fc5e04a682f8a3231202f039d90ad09ecb50841ae74541e732f23361874ca93b127db75810d0854c5d60a90fd59530eeb940ddf142de1c9a3aed13af8cd3b68967674647a7ebb758e13d1a61624a3c008d49c33ad8f3ef2b6d93833d1d0d4bc1269c7374f9f6390b8f66a2fc25d9b415bc49a664c250153db6251916119dbc92369b7cc75ff6f445fd84c7e1f7149c13cda27914de0e0d2d7856da19606a4f4e284da460af136ec4c58ffb12c4ace880dc2c247ba801a0835cf9ba225a610075ab08214eb088f68fccb3a70200e45d44db0ec6bef0792d5e590a61c44bf9a3fdfa1816b41dc23f1728acb0f03447ca9d3a4fc125384f9b507021f1631066af630497e6fd86eab135cf2886b93093f49f41e532dfde08f0d1c11db016ba0734a899a2bc1fe9852ef3e99586be6d98820bea40f91f667c5e02e2ffdd1bd09797330a2e0accf28e0c48007b8e670ad1f2eb5613d9f07b6bf81e1bfa7ef3d3716de47b6fe87d1b5113919f59d9c0f7d938debbcffc883dae8dad26d6e59f4ccea7f04ef09cc1251c89c03cc0e824d8b27d56864e339c8884a1a5886be69555529bb9ef1f529b028d809862ac264a3f9a9a24a89a44ac283b8f8a745924c9e31116927f698b79332135cc442bde89f98b1cab97c590223b97a00387a599490bc1ec642532bf5522abb5947f6bcfddde836f76f4915cdc7d48bc46c74d1a1e60857ee42b30b63a6ec24bac12bb1fe62851591048220097aaf6662c119f7c081ab5c0dd6fc2094e5692989f3c3c54ab089b79d218a2e6d136fd62ef5ba2ec31e0f11750a86e285f092eee331f4696c134afd65341d4e3ac31382eeae1d5814e500fbba7315e359fa26036e193fae8f4710cf54b7c55c468f987213560bd0a0c2383e69e373a8d2089472480209b91f10c6553961c38fd8668d93f5c437af4ceefe7d019e77449de3a07b2b844c32ff2f92431efd0666d4b93035e1524714050f973860b24e698d2a1851043df6c3b65e02db6fabb7271b52d571b59b99e4cd0a4fea81bbf2892b227b276413b2a80ece12d5d1795f3daa24b90144f21c2bf1153993a6f87d5cfa5daf134464803391fb2ebdba4ab66063e24e86a0b6af004606f540eb9158f36debcb055db72d007c874e245a7c0eb2a88430a2f6b3dad6c97c50b3564337ff24eeae6f6cae0967b281419111770c37394f9967241d309c106dc3de6aa95d21823b8f25e25b6fd2181bfb4c14d04c252fdb24ba3b18184d88137914a7f09b72f213321dd3d6500b6dc8b8e2d93663daebce67fa41c47ed68fe37aa17e38aad724923b11235081d07c38fb5840b956bfd5d897b47253887dcdbd79fd83ccce5f6ab3d28a52627022acb1fb2fe1beb75a9638d0ab71b01e113446e4c489005a73cf43d8b689d01fb1045bc14119912ff08c9f12226e0af21593aae253420c179397952d3399e200524cac12cfc200548b26dedd0288ac2e40d71ca6f5fcb4b9b86c3c2ea15db70d386a074b509c91f5a618096cacaf253c770c80c274bec68d48542bb191a28bc1a6aded6e2d318ae705d543c218de47d6d22c73a69eaae161e93da5a0aebdfe7c5cdc4aaa1cc6f54de15fc4f64cbb8dd12e8720d431870287e058e74e07488d985d3890c2ff37d650acddc3a688ef1e0dec03379dc76aed0a3801b81953504e1e89b102d5e69d0a56de76d227208646b4bdada0784178f9e30c6ea86c394733d63d864419bc0efa386d8a418bbd491b87466410dfcc6251d764e105f2c691e48b7d9a3ee620fa34a414ebd7911d74756803874f29594d0fb46f11d1529f18067e907d6f5c1ca0d211e7aba7f60dbce2c23fc2bfd064967cbe1ecd97f583968b60700846a3de7acc93ca1f2fca178c0a27b41e0cd2aee45ec92f2beeda3895ea230956e405c1e260613152d8dacb92bf0b85082952c561c980c929b205102616341853827280a6140a7ae18694aa3ce2221c65f36dcc3aa2914158d4f90ec800b3aa265915d53aa3c5aea27cb7274b681a606d375689e50d30306ed4a96ff05a74d056f2eb756b0aee6e1d489d9ff792665c6025c0bef0058442a2185cbab22e9269cf73e587c0c164bf58d189bc80f6cc68df4cad867f779a355c643c99a0d63be0268553cc787a93ef821a897b7d26e85ec609c1b52e5f0c61e4fd1470622e15d74f48d1f2311941c763ff9f0fc26a12a6285e2713e5dc6254612a08224f724fb747c58401c908c37dbf7f8ca5cf31ad7909377d746454a90f492784bd5b6045482c81258eaaeb5a6dfd7b13f7ed118789abd05d1da4b31ac60b830951b1015444cc0df00f788921a15560def235793b5efd08de561b3fe46085b8869fbe7449c9827e6c49c182732267265e282ba5ac209a3b482ebd8f8cfab4953f988bb6dcb9d205d120651e7316796acda254213dc014641cad2fe807983cf41cf28f5c26e8e9b8c1375a8ee249775dfad47913aa95e129fd5efa623733a682789c8faffd671799d352f49cacaf7f688541dba1bc966e571fb71ae4ed59f2462fdb9e1785e27d54992b3d6df705c5e67ed15c9dd194bc8733fa8601d73c54acea549d7328939db8b7d78f72e98739c3641705b1e77d8946c911b470574209ce1ebfd43dbc347bf7af33c4d08374412f62ade2914de011e975c48bb9c990a22a9ef02598aeda03433ddaa96d0f8825bb5ab608f6a729a44a545df2485ba9f8ed5d9f3a58e9bd23f6c11a0b92b39e025f9b094612f738b21ece860e87cb8d1e3df640e8ab1432bfb94e7d93a516143dbf4369b761539962bd2e326dc6e4676cfa3f77a8db0a2ce6c813bae06c6060f501fb19490726f96014c468efb2bc51b9b4ae6d1ef723e20ff8746472d07dc1e973fbc45110918bfb4f90bba601878c04ac444a7940575e1831c2b1b4ce5cf1e8b6e83686f589273b13daefb0a1ae5758d1444ee226de862948dd10024d88da43ab19417c7edb3cead561f790bf26d0ae15bf95dc4c44b2cea11636a0841946080832a012005a74c51353a87af22eb707da53ce9d1c19aecb0ea214d6f92d7368bb8eba0afea566a76908d3235258e845d9da2ff4acfb8911656b78797e9a2fa3db6c02a93f1ef7818da81843e306c2c941db954a8ac54cf58d24701a06f40b6ab121c436215b7118b153e09c318840859691a8bbfb000838e7e4e3b894852c114e7a684ea9d99d1346fdac90d185ecb84e95580e0eccec3a06e0151ee8613d92261768c0db0ae44eac8a17f3ec6e97867e90d2d8206bfe7afadfa8d839a38446a8395babf9a2da8e6bc049b6c4bc81ef278dc1a125e19f8d56a5a50964b5afc556be1b6a1ef3f2e673ac4562bd37d60b3371b486e82552da51918d67d9d63138c1db2e73efa6c73df748af9887cdec3c92d7cde46547d8d2eee3fb9d532b3fb448e545ffb1a50de9d182fd9edbe3d81e8991e710f43514fbcbe331861180a8a8a7b752218f9cc81fdf7ffd096faa3a0a307aad4c4aca2c987bfcaa3fc95fb9dff66c9eb397b7f1ebe5f3795e6ca820d941086f5be84e25044215171b0d4b42b551a06e1856fa12dfdeef124fe0a0fdc14c47cdbe41508c8a00f1a7aa0f200e870fb342d94610165fdfd9e89a30801a17be26b568ca16761831d954e0e101a7211847afa25828070b377ec6da1334542d8c88df5916f7b75136cf42d572071c9ebd13f79cfabf2bc6b296be08679a624d27f827140dea9d34f71969d862a28343c53fca292a8add791b8a4140fd264f702b49fffbee2401726715eb50fa31dc5650f77cf963b288d7308d956d7bad3159ec64fea19d294ae8c6632ae4789d1a006daa8476621dc8f00c2e7b9b407692e2ae8984bcd1f310a6e1c185a81c2a4e4e359d9ac17ff145bb4dfc28a1d5263e1bd7907bc2380def805f07ba9a01ce9c404ce300f5e4fc120758ba28e4fe5aa2213d86b2d670aeacdeebde89a184850f9f261c9a18a0b85af60f308bb770f58c240a541099fa2ca76ae12a8a7c8497943b3eac199bb1a48b8560cd2a6de15e9a6089c10293bf7474d91f2400ca03f7da6d1d2ca585a3ead24497b1af14e9787634e8b6fe0531f6cb2ada2608a622a3c47b4a6ff636009b2a7c5d062881600a19ce091118df937c13080587fe1a8748360f5162f5113f3a8ebcbca64083e8d3efa7747c527b851e6e5a4f49145d449bc374781bf33f36bed7aca4d6690b09dbd4744256693e3fdf3d056906178639ed44dce9f95b34602115727948505e41fd11dc63bf38487ebe41f54a3e8ce62874daee9a6c0fe7cf22201f8c846a4be3774c73dfecb341f8715bfd20262139d9a38ab5d90afb9aec6baba51538a8768f26bda643910099bbdd914839001eeafcdef37de1550c024fae312901c48fd50cbfa10898d6f5a36b50329bf6421ed0da6c0e3c93edae2a354f570d206119f9c72e489e1e80f70552a0414d852813ec14fb4139533ed89697e3f220e9922700fec8f7c66f988ec405f42f99432cab25e9d36c74b8e7d3289f95d62f94276ee4b33b5dfca650c435f84fbe396f35211840222c5c265590a91ba7ecc0e2f97c108f6251a33355428914830472e25fcba36695f7552457fc5f221f9fa32b372264209f0705146d9553b50f8e393c69fad7a598ea6eedb9eef34cdf94ddf6af98634ce90eafad0fa918dc96f43e27351dfeac2cecaec07bf2a68cdf5552619a5884a26627fedbc0b1f2d4f1c970dac06ea4b33c4b7369086476749848a32ef7e6afe5949e6d7083dfad094f4462c5972d812102beed275404709c276183cd6511263199aba4bc0256ae72fd7f16f4a882410ae01e3dbe78ce28b932bf006fa2dd3d75c7ab36968f31413e905b865a8740d655254ef10bcb4653abeb647f9ecbd1fbeb6bf701580c7018341ac22c6f2c45f3cd94001a381fea2bca2ee6632a371ae138562de0d47096c0a16155a0496e4c08c7f2a18eca32563fad3f54dc6746df08b1ae8292d60a393706e930f737231472933609238ca21ab321cd0bada4f690484fba060855ce431f1ef5293978bed02ae746e46a00be8a9cc9079c5338e2ebce00fec51be8a95485398db997f94f38ad704c2a98a04216ee5000ff4571ff96ba75fce7675f0a617fea481fecb0555d72b7c39fb362ee76c1f59e7ea9332781f9b58e86b44d421003fe111d1e8b28cd02a8168376b01da1d4870fc34adabf39c40f412503021618a6fe2b455c9c0b1395fae506dce40638891e63103f034e19e19dc167e1fca8211f036677889454be002c71f57ee91060e903c7a4ffa3b684369d61884f2db8d81411cb52f7cb6d427d6b5e3735a4adfddc3de29e3ef4a15c4037bc8cef375f624325a98d9ceb1ea565b21f57cc381ebf3e11ad58cb36509a8d666f9d7fed55a1b414cb4bc3bb720f704064d58d451380eb51a79ec39e8bbb5d5ac26e73625873d428456e16888df6aab93060d369424ab05099b32137dd438e07019c14c3c81a366601b552ec01033c735d0cb4f7621be54a99e955fa867bf74fa4b5299724fdc479c398bb83ba04582d81a1c9801b970fe437355bf4cf3615f9f3fcb7e46014b71cd71891b31077fdd73882f39e351de2074e0ee4ac0e8262631079860e7fe4d216eb9e1f916dff90566d188b5bc7efb770e64e803ab731876dec484ebd4c2286e8c873d976fa12c6241d0cc5226c5c797cd07808e674939966c025f102c2f0fdc06b3dc61eda63b5f3a51edca8548265e06fccaa62ba0d53fc2e26b0428577ac5e27a23cb6e355ecab73affacc0148ab861d8b9d657ff1c549f203a9e0dff672dde8c1c8ccd504e31adc89e67b93556604767527136abf14ab9a72244cde039e7b387dc87787cc9781ba2eac1883c1e141fad6248c59b655beae8496891c6fa8cb9db5e09e3db3e15edd9596e3f120e27e833bc46c12ba3b61671d36b5a7878f796caa45177e44e871a95f2f03df70d2bf1fd17209f8a573df4a8c2fdcdd3fd1738c8ebd324b6dd79b8abbd00e62ea913ce742039a14d4383149178cac2e0cd46cb140f38aab7f6fbaa8983cff212b0f9235a46c91a2bd676d6e86c5b8d8488967bace912225da6114ef5aa6238ee1fa8e108dc6f5a93bcac29c405d704b8605a2a2daf06baac682a8c5381fc7af2bba4dbcee450ac2d5be4f464bd43ac5497c8983d1e9e7b27037dbebb4015ac49d8272cd26bff62aa7411c0166cc371489b20431e50aedce48e2b17020e86d25b264887cd9a8f38d501e41cee6839ee76206380434868df1e21b9aedf995cb5e66b6b369d7138c919929530d5e7352f3ce4c9c89606a94b08fa4c0ea44be3798a578ab20813d2a0de3ac1a0e0b90f26b127249d70fd76e9d991acaed817d7a82f223c7dd101f3e932412e94553d134c3c0d19cda7b5a7423c330b5dbac1d1655871a495e4341adeb50c2580c372bae024c44185c97b598033437f3d222fc5d3b2fc010efd054a9abba15f253ee7b1019d49956309bc4d82de9ccc9f0ce011e37e87ad4101ec77d20660793e521cb478569b4283cfec1f31b4303694365d9892be0adfe27c694f0ffe435305304944ee9a27e1947e3dd514e774b35c1afc62518d8e9c986e8774efe3b5d6e84d7aff3b8cfbe6796262927736a1d556b261c52907675137455ea054d14844be20c8aa4c27e467a9982e6985addcdbc462e2043ed319f0d7107ab7e49f13bc35bc472fbdfcb3071e73e29b6cd8d0bf5f02b60035fb3d75a28cb72f77c5ea8d0681292defbf69d6800987cba24bf14beafb95d8cab3a91eb70c5542b7c8ae826592dc5b4a0a5e8b3797b90c519a430e9bb025cf3b3c1f9910ca180b710039d0f0044d4f5464684665eddfef13e44bbdf24fdbfb044935eaa17e3dba82d9e8aa3a39fa040142508af092d64885466e700b1b5a85daec03863950d83902a27b67f16538159d181e23aa1004556d03d55bd7810eb79e315b51231b003d8033b4ed0b84a20b81e72173360a69cda3bd9faf8deb6d250952b455a36617c792ca07a8c04fa8324a868817c2f937b033411eaf7f42d1b0a5e0f383f58f476f9c8b4dc7da62b7a80a1d361be894d1a7751fbf5900e2b7fd9c4576e65ad1a7534da64f531f42caf3a7070f102689cd2ce765a634358bb93aa4651d3696f9c7039fc871cefe5541edc85f0f6994b850df67a43d37ad0e1b65a0ec5f0c6c1bd0126140805f27752266cd6b5397ce45169fc8f6264c8f389d93d93b148b5e671fb55eec4afddd1b48f4a16907a088411894d93828459231667156e05bc8cd0650bd4def87cd8407cfa60fbb88a230234a9a334fa6bbb77f0ee014df4c0cec9d908b8a47d712e29945de33147bc3815f03f477d9dd9aa21d759d1c5b5d5d6d2c2b9a2a90efbbfd4115233024f0b5331bd07e84c32566c39e9da2cb0cea1764d31f2646455cc942aea43ecad52421ed1e448689874e20ab148cd5aeb8a694791ad64ef068c77c2929bcce82328cd4ade1c5a18c7f03121f5304d298b2a656530c29aa7758ab869fc42d221f5691c6cfcb8618f80245f44e3e18d9f8b4401d3b583697246e3211469c5f310b6339a44f8a1ee4385a0bdd12f39aee838a51a3990fc0b10b5399a5111f32b1c63dc9bb199bbc1115cb00c5ca923db7534e5d19b431d4a8202626cbb61132d4f32d32dd97272bc8ab3b88218f457ecd80b978b874fb444712a90ef4e8b1115cea3cfd3da9081a0b5a00e7c7a05322103a5011cc00343959f81da2a4960d23c4227cc5f991d73eaaf6a87fba43e20ba4fd24162a62ada3fe161afc5a3fc5165b0de0dd7ccafa84a772d6e0571e4a44e6205f1159c0814089d371a993d9963cdca2e0c6b43234e17f0f632b65d541670aa73f018d9ed5e377bb9099e4310d3ede4c22f37dd867aff945ae2f6112a6bd7f7c9a90bd5bc32ce86be2a408b223c7cfa6f34434c1bbf88ddcc4145d22b3ed05b7a3035bcf8d40eff452d38da4ee301193d04ce813b2050c72fce50ca41bddab5bc01562b4068a8058fa84e88d6858c33f3bfabfc8acd7afc586e3735b5936eaceef2f279a34899467f6f1dc43916fcfc056824b35a3912dd4ba41147de06660f8a7a38b632e2a6d151d143d64225e70f3e5e955a6ab9a88264cf7c27cff0f95a35331b526e66f32a67ba498145b2726fb32cc4d1ca09ff27691f99b0ce58fedf57781cd1a9c610b8a009a56808095ef7545a3b989b19f70386b8ebd5964ce060dd96b8073ddf273bff19409ab39a2d7801bf770c5d53370af919197ae6a1163a530f932a084d7e6a7d97d461d52f2e0e2d054c695111fb867758d875099cceb4b4f4fa36a37ac96869e0a8bf157cc1a606ab4bd00b478dabff6208809246857e0a039c9c7f33e0ec0c545bfc6282ac1476cd5d1c6050846f0fb403b0d62f4beaec1121ef4eb57b1412b37d50817ffa7832308c084be2743e575793f73c42d8059a4e109938aca8a98c45a996e3a0ba3d4410ea9106554a5b8abe28863d6809483516833b75094e775fc8a75202945a1fba973f28ee18c4c3b90d9d25a04d6751f2b4a854fd0f7cbad9cf88166fe33ad4ee175048319585ba4145928d6e5305c143d94136d63b0168856b4e41c427cbe4628eaf13ad2b61dd5549e5da319696f60ba0884aec3705e04804fffb5809a3daa59a7f13f9e76d682d15afadee370c97d5889e2d4356b0960dafb7fac5d00b125017076208d52a96f3c7d178d86b6dd20d736070facb00bfb6f8363853231fb1b07376e1b5f96dd61274336134665deb139b0f36ec78b5287df7801161f4949ec167a2dab187f3c2075803ffbba94c6e7465465c2560ae170769e25a623f4ddcef9079a68c600ef98c38118b38cd8332cf18f0302e52e27504f791e169ae93414cee7a013c8af188dbf5e134ecede07e90f3e797127313f0a81ec6c8f624da4d1c15273415e4e66e92cd1734ab994f9a9d5f6d361239d70461057ae8302bb579b41af177ad060cd3d305b2673504e0652bb0e87694c6706769d21c8490cf64e318f16937c1d9572f50416fbcaebf52bb9d9768d33096deb00839532f80955e7b78b362d4fc6ac39d7284682e192de185325c14f6934c23c815fb1da61e0147ac94fd3a86844f5657ba73725397e96ebcb4174b54b098aa02ffc2b2ddc2d3e50346b90e0710e3a7ae69af3a9b16942f56bb872761de45b0d8e62f54ca51bbc731b980fa9a321a14c5be26b155673dee76ece14bb9dafe4855a4318fa75fc3e478a5fa6c765e0a703bf7c0de79bfc94d8d565cec87f4b6ffaa4d7c44089cb96f3bb9b70d4e36b135b9f933e5a22e105de2240d12412564001dcfc6156910b31d8c5ed4bb27c41979d18cda32330f1995d803542da10e3dd21bfa1bdeb5a7d2ce9e53cc56aff55ba5f5c361d668843d31dffc004187dacb280cdbfd13f2f2217c67c623d653f01f4e129db4192768d5ac8ba4b92d7408eebcbe00ebb4ba610cc5b65c0e2006b01ad3ce55d2508f313e473f2091738ab158919304c02b6a2ab37bb3452422e48945722a3575c468cc58cc5b58181bc96f930fbe562f60d04890fd7493cca7171e97f389b3a59dc8e6b1cc7e1473656d941d348e8d8fc6300d764bf325c19805b42b155dc68648c19eb34b09d66beab9f004bec3fd511092199cd22d8663f7a204efdaeb61868940c60cc59f8f676d9632750d941392efff80fb2f9b8f61b5dd8f4535af689934c99165be63cf769b84bd35f2df9fc559efd065e439089e2ebb4eee33d1d0c8b8ddc50ff5998e61467261d156584d2c67249d9e8d05c9930514ef601fb5ec806c7806c7f4e0fae864724a800baa101ed173d20ada465e1d29e914026a4aca39d4fcb96526821f924a008642cb18197f29fcfef02931ece65f058531144a67e47231de9de4531cc3da1958d1400826869d0fc36a71509d67f66eaa732634911ddfd08ecab0d016230595d88b00d9670d999f2e4bad537276230e40fe643ed002bfde72a267be5261bd544ad3a7f64e62cb4f9ba37bb0a1af34ce9433204724ef7919efa8035a43b0a0867a97da982a00f3b1e9d0446eb8f95633745d37a7886f2771586706ac6f9ba2386fc3f867e2c26ac477eb80c4d92efe411156f1c48b1e9e39c24191a4e7043b29b42cc867c961644e1eae9197a5c6f138e8a69259e2ae3f0c428a1a142da3306fc9369e0560d47ebc6050a7adf0a8477e20e9aa0155a3d84f0281ef93b5e221c6520d923a18690f3e978c2f6e09b7752b9d638c4cdd79053a8a3e7d502e76886ce0137fdc02c449892ae8628f21e5066f2edbf6bcc74cea8431f894d9d7248db7ed7761935655bb4464d6ea15705b167235044b01e22b188511e18d0e6300bde58e3034e7a089a2ea71519391ad3c9a626c219ccc0c6c2b8c77242df379928b35d6cc96e9c09015f46f9846396e721f6edfd7c30a2d62af6673349c9b51b1de1819a0ab8525098f5b5a61ef6442641e27f63c38a1c9aa81e5289c75d9007e58e3e12b4bd053338531e8f5b48dc40e626faccc9c54bfc0a38985f1f05336781e782ece60a2185572a7fcf8756d6101f4b79fb48c796adc1476f505c78a0747dcd1b43a67ebef0c5d9a346f50eec4552c9aac9d806fa18588318d93853476da862e58d21a06e2023792ef5b5987c27ee76cef0b813a607aa987a4c1f90e62cc545cdebb25ad9e17f2c049327198b64eabb38c958b56a6a6889079a018e0b13ddfe3d5b9c71a41b3381688e160f972b9e5b11ce0b9a156ba4256ec1abb98e1c9d20f9667fc82ecf7bae1d535c6174e5c3709c119a433993bbfc06e17d4060ad1b4b2627f37d4cfdcfa8d6f2925bc59e30beda91a58778c59a9d4f915468eb1bdf6320bb0aebcb9553a1ce614754695d68d71716bb3a2468144791c50cd2b0c4eefd22ae08552d44a47c3a17e71cb3ce1b1131a5b5f41a633798643a4225f2eba750c8cde05acc3679653b46ea59921fb3888f5d7130f0788f5bfc4dbe567460af26cb3d3392e00bc6b82b58c6ff367d6c1c02f1660940cc860174c3197b56fe18f56029828c93c9056ece7bcfa76f64f9218c2c183b2af51b4f359347999b2c21b1cc121adbe6a23caf1fb8f19566c8912a49be494615b69a30964afa00a9506f9e1d4088c2e4363c4f0b87937050f24a9c8d97a90741bfec815bb42a94d6d5cf12302b6b30af4578dedd0c9506cfcc9573152df2ced960ef5991c5c120bbf706a93a5213a5baae31f73365db5993d82741e823586e1d432c7e0067c0d6b8d9479a65d76d172fafdad05c2218dc149e97e819cb72ae8c092d342a797d8e41a485c37baee33d462b4e362ca77cb040def9483e11ae63bea61457e6dde1752625b7b595af38e3f4ca48e765d3f6f194b36891ea8ffd8d12a1c2bf6be5ad2218cf0dd559b091e8ba12ddd88384b054479404e0c22c9208a9a0794340a0698ef2c1697994ed556ccdb0972e766ed4ecd14e06a9c84387d5e2b545977b02b5e839cf2d7e018cbd144d2e7b33ea461580091adbf7b174b6fc13f50d46f9215492807497aaee64e2a926af0a6a42d3838cd4aeb00a3edfd7c02fb38947902a3346ab181d386c6e945345f152bf38381cc19789ae09d7d8c7782a861e9c2f3c463e6c0b9e08bf95b19dca45baeb9bed73b960e0d5b66ec1081487b6fdfcfad0357fd1fda978f1cab4b3c226210289afca16e17942452413f2df9a60f1b4d524df69677754d0d9dc085ada08b96f5d67073a317186f25e5dfd265358a15799a29e10c246937cadc53f40d82d04c81cb4f71f2164dad7e6a098c1af3f5936190026ca421544c6b401603602f4538a1c6902fa8c9a570d64eac10951a3e9cc5f5f1fb5557c14dca9e1d06f1f6840fd7fd099d8e3b2d39a037af7cabccd604a2d16eb85883feae7986f208cf861f552b0ed927b3ded8805b13da06d84bc52291185da30c2ce5386bdaa3e12d75bae60496720f9ac8216444f3d064d994ae46c82d515f22c4c5024783d4fcc28f3a858c8d2d2f3543681911edb6ede8cd6f45ad251a8df1eeb40daede9a4443adf79ae6882d6610a9cacb63c4aabfc12ebe2744cb972b7283f072ee632e9bdf537561117041c333240f0490082e500307fff1f9a7f1a80ffdeaffabb9f78339bd1d0502d395547ec4c0a5dec7f9aa8123c0397508d4810c5262518e28c8bea8f7f87e64c361d7ab8973076951c5a84f4f78e5e6e707eced27a01e2e30975ef3ee701456cd26703c273762aa75c7d19cde1f9fece9f5f47bce7a26e4663cb2f2c608a1617e36dc0bf93b3f4d0dc19e3953aad2260cdaee18db8247d4b9001e5702b746482bbf5825a78e4703886da824ec789cb366c593e7ae59bbf79a7bc5aafffdad09083b38b6d7e117c1513d23ea4291c240c0c3937e9597d2482d089642e67b7becf34737b1af3a9cb81a96c2acdfe31568d5b18ce3fee256001834201cd8cbc098785d4630dbc210cfbd869f64b15f897bb4827a984a6e289e9adff9b5f6f33e1270c54cb2de87e23d80da7c827b42759137c834d1eb11553a8aef4c9ce7bef29e8cd5ec64f2a882995165178132ecd69f90ecf7915da7472e5b2f72283f23a0688e8371b8c46aede6b2debd4d1858dd2f20379b5e96a537a153a35f68fbca0bc965c433343fcbf6d51976017f2c8c6704b5e13ba88ad469e17088f296d8dde0ea2c77552fb29caa6734b6ecd8103f57d6f22abbc36e305e38cdf9808b0160562b68765b95d07fed96e5071893d603bf5b5a16d3a64b11aa8694d71a3a2ccaa9ab3eb166e0095c50734d61481e955375da82e3ba1c0ae3daa8b320de901da6f2a8faf8bc632ebd333ad57389cbaff9c62004579dd9c36f4cd196220aa2a35cde914fb93ba9abed6d5e2278c1b4d3b1ce714f7036676cfd3c97545b8124ef82a6f71221b9d255e6454c93d73c22ae245cdc0cbafef223e3016825e35aa141ca4a24847014480cb893bbadaee20357a57739b56dc397cdc0221f9aaa3a0978fb0237d4a4d179ecc902813acbf37ac0d68fe2fc7ae8e7482c2481e02136666870c6bf591c49238fc9d883a6ee67ebcea710957578c241ff04d1cef0d556e9b10f835e8375b378a79555a6d5e905f563e89723bba3033f3f1d1ac678a1356a667cee1edd97bb631ec5fb6d9dc32e62c35191b5f801b70269d347e801305b84fc0552e64d1eef08ed3b28519851834875b8a01f223dbb670f70024559c0a159ba8421467255a9d83f1954e612b015c86d2275ba1bc3c1585384c145e38ca4a9e42159d66c6aca39fdd1ffe493f65ebb0dd799e1eeca1627792f8e418615ba78c2fc67207b3f2d802b5d300c8128f85cb7304fb3f1eb13f552058b849e0f295909004de726773711962d8e158c9ad8bec238b6933bf6faafb13c59ca0c7126d217a8d41536681f6e8bd22bc86727bd030761b5740f3a10683da3fd8e0589d9160e8aa95f988fcb6cfde187587d8f471eaf2fd9bddc5e47d853b8b1f402243f1dca3d2a88348733a26fe986e5a16bd10bf57eb17d70f34707d6470a041ccdd2fcff87ec0f9e71c37633ccb564e375b5f7a63ee9aba9c90efd0fcbd045892f3dbb89d5524303b1d98fe99476dfd162d8a34c2b80a3d441d18527637b160ada1452208623c11c056a7b1f4c40c7a0de33ffc35b44a3c45642468a422f61ddb1f053361e995274f400af94ad584d2646de63653239dfba40a33aa49ac63a70a0d47d5a2b0d743a25c64f608e2545bc2e0c5f4a3a6e4d88a90871b0c706ca15438ea4cda5ef25d4c98104c683b452f2fe302badda760d2b8ae3e3140ff07d0edea93f434e5321454d48734014bcd5c050beae247f963daf32e8e2cc0959fac3029b3bc03af250e9ca875a9ccb14b2a042794e74a4ee5572483ac00b736029f038b5e420107b1369aa924fda76fc30829994f678b3c390846337e636648dc3bc9fba891e562661c88c2d147bb3051e076bcca29657e4d2e58e24274d0f8f05c8583a127a4c4b8f364f3f9400fcb94c895d6858949cd4d885e1ca2ee2b34096d0bff4c68efb1c7c30d14adb6811093118db7ba0dee7815e83e18dd48519b5e2a1f6beaec53dd2586cc3fd24215d38597e12a3de5df9e7b11319e00ad9a59b592bd7b11067122fcc9c38b108c0f76931b5bc35dfdc31748e6c26e41f1197a6d66327285fb20ed2c4d402589876e9e05d2415c3cf6928518e9448dc4199332ff1987df2f53c10f6cf2bc82687741e55676529edaf44f760fd7053eb9ae1632abc05893e68f3682774cc46df23297807ea968015aec3e207cf1f3c6c108506c773fe4683295c2e43e0a37f17208bf7fd32ed50c264602adcde0c9ab995049ce46c8f109014c3ef10ee3ed3cf89be498b3f26dc1e02e3994ba9a957e7b5dc3e9d46863e472c5b3ea6e5496ecd0f004a4eddb5e53f89364e8044fd24a812f500a466c07c43321044e742bb927e33df5da757cfb02e2215f56f1c374a30eb572fb88c5f6c23a56e5197a5811a3e85a40fb4a0d4d0badf7c00060fe9d8ef7c959de67e19085c80a509d8263d52db160ea1e8d917c12385b496a36645a7f64a0250359065434b2145dc97a70bb012c8598457df59ca3d848308c861284e978b9b66c4b0bffe789f6d494c913ecd7f8fb1d1dd19cb6375e191612f7ce0e9b061e8552b8c65df7c93693d66753fbb09f00bd33f0f7da88918883f708194fccde19a09a885e2b93814d0039a895bcf4b035cf644e9e26d907716b1e9305caac5ba37cb5afaa649919a77549031c481027a9b71d6470d93de8ae83a18118152a56cbd2407616bed026c329b827e65a8d9a0778434a46480207f6b58bc91626dce6207262f3c190291c46f189415cf6e3504fac837399ab00c55bdd81d03e416535a5814c9ed6d91ec24c07338997ed4720ebeae92312812fe7f848958b094012dc567359c984ca1ec6c1935327b3c8a9f642f5f0094a86c2c1801d62cdc34b95487ab304039efcb797fdae8ffa1cbf2b7e77b6c52743d7bf7862e33d3efdca79c4053b4f89bff367f5bf150e070b8bf368b37fe0f722344bb82249d2a7ceefaece97b24919a7c37c35605f33cda48cbe57873ea154a5086b6944ed568466c749f9aa88703c9d2a3815eb4ff26f5cb092a0d8031b5cf6ca408e4252ff0577e09f7cd35009e346a6bacf75855f0cb359f322ce0af46c0deb54c2fbefece91f678c7c5a07267d1bafde05a408c77d58ada1f92cafd0ececbf9d042b460b49ad1e6f4c4283593c53bb79d8591282e10426a59f337abee32e3f876ff255d85a7e7b42276063d8b4196beab46ca7e29a8417791e55480c15ce70e87323c837c8903bcce25191111b1faad4f70a5709234be5619aa5c2a81f5a748b3cdfefb0ddee7fbe19ca64a1dd50c5fe0271439250ba77ac6b890cdde5d5c6af809cc1860c145a35e442de754d03f499a1971b0d29cd62b9a97812236bf9ea19239717b67da43b164287518b978cd0e5e33fe1ff4bac467d057814fbd17a42c8d880c0063665eea24c47a670a9268c5949bd6441865080a502ec318d0a240678d49fced594e90f304e02b5d5572fa540f6c4603d40df86d8633f0ba02481d8635e94eee7db5584417c02200eba06fff09dbb31e00931636b0ed224cceb856268a94c4cea0a5eb8a3b82c5db5da27c8f9d5fb5fbc45b070da8603b238a8758cbfbe3260d54b3fac57829e60a48e2ad67515d3f5b05250ea70d4c2059c1f5b76ab18243df0830b027259cc44604cddfb17f62768a3b02d63abbc691f74807cc19cd70901ecc279c91e948e97e09def13cdef733902609d541eb894f3b29dab54b5b834ccb422484908c00a9aeeae884358df012b23a4392b8d2e153daba0103602ca991794b1ae001b55c8523500bc5a1d15fc637badf4fe12981eadec0d5fd51b00b2739f455df92e0299b60692ef418c10c749032ca2990a8a571f21a1f85250855d807abdc410ccd5479e60192e9912dcc981f6c82f189b3d9ff96ac6ba4adf97e72832cbcd2c481297144d37bf0507560d9ff29582464bd9c171b9de452da5a6189803668b92419af4c1cd69bb95460a4f836b69bc003cc89f2b3d151b2cb4bd092baea850cc1dff8a4b8f18bd61d3e19a780a30b74d03e3377e3807c41be2cb73b8aa32230c87e932e1d22aa894b6e14637cb44760482a4eaab789d0b81bd10c97afc7210504c07704c5a3d8e1a16d0a5a18b8d4e3600a31d7c8a5cad4e8af9e9e7d26526e602a8612c825aff059e85f3aeab0bf90ba149c62d48e8de9f013ee904b9e7fbb8f52ad92f5cff139b14c6d9548e9b0b110d059234ed970682295a1a28f8a9611bcd0fd3b6d49d1bc156b8fccc9cd96f8b4cf0aa2943d1972eed1f80f88557a69c574059fbf15c05a7165d65801cc0233c76644f98a10e9e87de4735e28957086362572fdb246c308dff7329c7709fc0645059a787e6160143da1797fdf7940a5143bc5b40d23f1cecc6c3e535cc5d9470bcefd5df2df336c2ea14a60abb509a5d357349dafa5cbbc3abef027da968fc7d2d02d02fd36a927ffc500edf1c5292b36da0c64f5dc66cf62bfb240657226414e7ca5e6ada407c2961bffd1d6d09e0f4845772b0c375214706cb52b85bcbad0546300e2c21685b60751a437e9bf0bd584f301263bc64a2fc54a929874efb29e983b145fb8d4079be29d3cf4f71d8dabf0fa53e45045b0d7232268ea6267630ff388b7384c343dd0a313e19e29484ab3f0571234e7d58b1e6c35da177092df1dd0a63c3a6ae61488a1c083b433394bc2b54d1c0b8326f661c71392085568c869084408888da2c032f4deeb0e348fe6a5fc20c7dc472b017c742b39b7be6300708d6237c7705c8112ce2c925f9b03fb6657a454689bbf362ccb961076ef794825bd2abf79cc6c10bd0c5b5d896b063041d032b05dc4bff40eb1868b3bc66a0a62435821d2817f19bb1d60ddebb8e86e59552909899b388835b22f7ddcbe94da672903fbfbdf4642a58ce96c95be0b8a5e113285ec91729c642d60aad0598fe0ebc9b1f4ba32564dd739165e6ce9ca0c3db609d1bcb87659c562235e9df169845b51abd3a2099598154dd0797b233d6b70b7f10ef45d754f9c6c62c4dcd79c9051c2417ef535ab650f7c23cb7e391e56c175fd1b2a887290fb90fc22e518291c1e85afb4317d5a6f499698c991725f87426db14aa0c54e71ad6c5dd559ea044d42e90e3b300ed7291e700479f3336bc414ccf3d966dcbda012bf9f5749b7e5520cb618ed77a6517334156adc0907d59e1f77fcc1bb5f640e236b617726c23b7321565d17c1214c6034bb3c5f5f22195f8b1dede9e5d77f2452991c0cab2ea1c27bad85887e07e4ed3e38378a0f28517ed8545ab69a5433fcec0593822a9a84b8a6d744bac8afb6e32f4aacfdbbb0d0b34d8c9a632c3dfd4624e853e0d099ccb2753bb422e1d76831a7305a3417fe3127b2faecc0fa03a43fb5ffb3c2189fe8a6894e4287fb100281e52aa6e06ceb1358672bb32448dbe1bc31c98be87caec67105efcade9061008a7e03ea08fa1e8ccbce9470dfd695ccbac4025e83c23a04556dc226ea90d82c97d92ce1cf30457c2f8d54bf55e4e8f9334a6f1cf8e2368b893a8360800d4baca4fa358f4c29ad92b5d4ec6e6036af68c4cc48de95309452831e9698ac52cee5cc6d92d0798ebfe001c6f97248740b45bf54b5f906aa9b07a709343ecac5b2b95399cf84b2d4898c451badc4407e10a1bba442dc39c2e8f96aeadee2d5f3f508c71695ecd83113647bf6d0b4e42c52d08213d578e0c510af195f3ec59bfa7a37aff8d872915f2ab3367d48b1df22c0275bc0627a212f13d8afdfd30b4ecf32632b37917bb45da18ac7bc12e78e548fd83d266d31ec46901582e2765bc09b4c18f0bfb38ec68688feee403993e1c7dcaaa8432f91705140b4de884d6888711b82ad8180c2dfa1b6beb6949194a2fda446f28bc8cb8ae9867f4a2294ad15d176240356254dca8339de7c636bd5dc1cc139bce3c6fd5f83331a3e97eae02b254c8323555847cb77f5b8cc854953522d66fc11589ebed75675a929cf0183394123f84974798b20ac0936f2895f21a37e26d16181925590d5f47091ff4bdaf518bc698f94e14b3b19f8818cf91bd2574458f61c3d50659c47d5b032e58ce38018e7396ac23b8320ac44758a84b9a6b0efb05ce21c0ea33f07ce9876c456981d4200bbf7f0ad59740cdc358f301b6024547786c8250ff71692d5fd0e749dee107a144be68746c3c86281e84f0b7ebdb874710518e4efbf63516c617444880ade69b76af9c1c711be31265a7a4b275ef5b4d0c2517f410d2e9ad43bab39e7fc4d565363a4e7dcdc4c96a992c126050373a1e2c9f05a001e403c27364e4e024cbc16882d650702176a92b4b9229da2f07578c49b2b175364274661ba255aacd3a813c5ea2d22f1a41d355838ac885e30662bcaf90e893c4829818a26e16945f4e312e6cd90ceb86311c2c447e410099a4a1c380220348baf46597c490ad10c419d2acd273f4ba258399456bf6cd9e5b551c1d9c390ee9b0db9a4270b94841b4e99b482237c9799c9db241c40354a54338ebf4366ff4b662f71524faaf6126582b04c3480067c3c50157eae0684206c4761cbfccd8a7d4affe6513f477a16e068c05428d164b2a040fc9573a644efa30375f7f530be03e6d435eecf4201df6a23489702a61971337d0feb2984620d2effcfe850c732b35fb462c5852e21d8eee7f412a78796d1875596125e12e937b35e9cbd8761ce01bc6ded149a6002b23266ba5fc99f059129720a665158bdafac1e974ed3b78e03b12413cea728397fe96092d8a911008ad30e414ddc49f8aa8a92cb99814ca5b99dc241f4282c9145b759fe390d49741cd87386792f1e013e7b50c7ad0f46caf6e19494589605ae49bea5fae31e57064edb9f3e076fd915fdb99d5369557fbd8e1401812ad5e8941f88e297bc15999c9ef3bc63611a98111c9c8d9343b8877ef8fab776f521a4c4eb2f12bec1c014729d6c84d5f2002b488d2132436ccc617bf50a3199710f99cb4bfbfc6b93624fff6c72a5f4a28a33b9b4aba7111a8e153b41a4ff1f6308959f548907007387d375b6311d24dff1cb8b73541ae2536730c7db19cc98be18f75eba3d1b50ab112b89b73f7340a8a88693edf02fb1cdfb41b11284f233a57423cccf4dce191ec3dfbf9a8571e4cf0855a68a330946c15ded50298c703415c02c4cab3c39df5b1c914c93b6c8854a5efb34dc34d81e8e99d0659ca5dfddcff7c40c9ec7ef509628a037478694262c84fe2a0328a709876323e767dda79e21a98a0c3aeae390192f91decaa1f325071370abb9a1872958f8cd9d35e920b7d5cec5c6e37ddc1a0b7c88f53036cb7ab9fc1f17755ab56f3f8d0b448c657ab6908b76efa2c3f55917a746fabaa6f267fbba8c21216e707354dc0063e31c17a5de98cf1e39ee2cb3b0e5ccf4acf5c1e571517990b76bb55be161512fc3e9ec230bc2d74e96d7530a9e856ff77240ff96144215e85d0277d2123af9dd5e299a90e3f8f7c0a98f249fe0cf0a1b97ab9fda93b25373a6c6f7f768b2b489591639f038c7c4caf89ee1e27caa6db6d3fd41052fc7c6486ac02c22fe9562150d2db69a2db748353cc0b4ca3e271ae3d203a986067510f7341db0a9773c50234a9546083b7aef10477ff46f6c373e06a2eb3137d8bfca9741c736b4be327179ef940fa68b7c63e188eaee21f4094cdffeb1fcf8671cb27069c92388954436136ef62e520c0742e1ec2c112717e1f6fae4b668ff427336186475550506c0a0d0d583963cbb18a3c082b7efc0e80f58a718f77561c7cead23cbc6453bdbae90dc7f16d8ea07ae0f540bac5f12e9a7ff8ff2bceafeb151d747c5025c161f1d45f230113d7b5ac8905242f54edce0b6b1d1390369ba7593ad88a7d8ada9956da2c2c0a18790074849cd5b0e69ae762b162a24b95a761231d55a1372104e0885bb742891ee857bc80f3513388b62bcb4448b56b71b9ecf3d5362f7c2b616be0746c23bbbc9f9f16f7b38fe2598a812ab2a3961f4aa13ba614fa8789c057b6b56c41a0ce14e80f4e89cd0d2452c29a3ab57f7fa635709518732a2e14b7625d7781f544bdc6d84c3bd23aaefd95e31c450b94c01cecc6296bda46014eb837a91e29495b5b7be1d800e4b72e08381294fc2e109b4b409fed2dfd737bd1d24b963be4443936398ef048689ce31f37a3d17e581f1b8c628315d577b958f562fcf8ca2c4a0fbac1fe46a1cf2617bfe3d151204834a40df4c5af405d548544eb79d99d958689f272b2cb2a8e1f02b2c4da0df089852746b039aca34a81944e49097e9dd03a8d98be2eb920569eb48d4b3df30644d02f060a3cd62e337d69bbd86d99951ba7cc290c7ba6e9e275527886dc932b14f837db8199156c706a10368ff11de2062835fb71018d3f9c32dc9c0f31d8b8453ed49b59f3fa92242ea681bcfe68f3e689338baf760332d5273d2cdbc1efa388c94f752bd4bdb0379beda4a9ebb22379704245b9bffe97af747d70f6519345082695d4a0a17a6795b7fce717143a21906f3773ac0eb61066199480630c39821fcf575a1411aac11c1950cce06907d90c1e7386a492a5c917a4b85cf06a5d136dedd69fea5819873e12b13823d03b1290e068294a24499b5818a0d12d90472432b1cc74584a200fddabadf7c4f08bf9c42cdb4e3c16f8974b3d42c62a8912b2b06fd7c3a7f2c741c40e4966a386be4eddbdfd377d445e16d0d20f496e7939737354211572ca241ba2e803121e0a129e52102870b62dcc31c9157ea1719fc8307767b37db806885422e9cc4c8cff05e97961375c8701683c58984c5d830b7d8545873a6c59f6c42a254ae1af9d72dade24e83a04b43e580774f65e828c9dea8fbb682b9487152fc877bf291a64f95726287485602880c3a1fffd2d7d220b043795fc7f82f2d0467bb01fb25e3ddd14f5d1595a248be5b153e549f789119bf744828f41272ae764c7f96f8049e4592c7d4ff5e46d1d5b00b68eb241f622dfee8bb72a46e33e00763a00c25f49167a79a3f6b7f406bb5043fcda1fc69d80a8dce6c7025dbc0524b2f4ee468008ef7ea78c607b30765206dcf2b946a358c77ede77a4b174b06bde9d8ca45b6e042ca29dca8fed5127331d70d7f4e569469559ecb8162c90f65d324062c658c32892a19f7f2c4a5e45128d964b45548d7e25a3734fb949fe205215fa954cce118c124b4fa71a7f24937247a3c5d2d2ab62dfc9502ed151598a54d5f95764984b345a2e2d5575fa99ccc6898c164b4d544dbf25937342a3636952abe66fc950eea168599a4455f8379995e7f636e50792aae61fc9504ef1e8a970f123bc1d8be89d8633575f1af6eaab7cb8c27e81117c42a232d7ed30fb660ec4e056da2e1c195a5d9e46f05724f1731bf553806500b5adae37d30eec4e927e52b2ddca8b5b594fe7f596da0ee1df4aa65a46377e07b15664613b669c196245b7a2fd4e8c3803329547c2cb0b0be78269a22e6fa944897f8741c62d1359b056813f3545fdec039db65310fa964b574aeccdec7570a52665558f5c722aa4a74ff02e0479c377b14e82d5cb867e062ded98c816059167ae3ee75df2c7439922e36fbb24eaa8806ad59be976c4be1a8ab215cfb3678a8b72264a64918adfc64a30797a8b4c16b3c8321f23b5b3aabcff6474a16ab96e5f760779dcd13d7811462097df477dea32a1a5bc6a483a955f56f7d2d0a48eef12d404bdccffd6ebd99dd1e70f147eb21127fcf36c22fba46bae68fb630fd1baf845b1ba48a9983e84e20307f7132be6987f2fa9e52a2476b357f715c2e25c166e0db2d72606fe7a6a4d45d9fe9115eb40d21f0f9a3e00a4b8760e4d27eb55c534ec6458d4be396fae1dff44d010c989dd574a5d884d214f86462e9339a87ba35c8dec0df1fdac1a096df4f6b880e156f8c8a9a5a10e08d7ef451b9218604ce9cb83ed3019c6a176395703110cd0d3af1353263c17af13e85d00b5decf589280c8d539a37c17fd579d8831df0f447ff45154d4b0b1ea90f53fe6385cc52149fe9b947ac5d65b8ee59d45912770706bb69b7440dc74bff1796133e03b9ab4e9870cb027794a2663023501fce96173b44b5145c3bb1b602944a6744634213576d3f9d62e9f739d8d48059986efda53bde3e84c13ca4fb6b40e7a6a6fb828367171a5112d6d45535091ccc85c0a4b58326d4023fac001f6e78c76f9389f93eefd24c58aae99beb19e373412e373c73405190ab28e4071c9517e9c068c0a8fd36eb10dc2dd58f2d0f3fb0949d54759b51bcf0a52a30218ac9ed1ec2f6b3df1f2910cffd9a605e6c28522ce5dd8d2ca5026e9b01e98e4381e71129d7ba84a33ee590c27335b6b424f5fe513ef081c031e9dcfd383ab6435d6a3dd9a3200eafb3730b365ad63fe61e21bf2b4b84eac696de0406ca8a30e0b48eeab93bc472dfcb7e825142f9bc770b51bd90a06e8587c654ef81f459a259e7c2f51d1867f67c7a08d638c5ea930453add8628bdef373220e73c6f158d28bd751b2b88efdebf96e80c77c1a4033abe1a22696be1adf9c70b8891ff70b880cb45bf8e306cc5cbbd8e91ed7a179cfef0c942d61155f9520adb4f115cea994ab6317f54c4e53440a5335bfbc4ee9e83d81366bb4e94d34851e2a2b6c7e029a2408cfd6f81c2f177d3f84301f1e3a343a709e20ee233e1e5b160feccece99f50252ba9e4cf5854e7bdeb7f545a106683db9df79d299f14333042ec18cfd4ca48f0f5967cb0aa51c1255299c5d270c4e0be5f0f692f3f70205914dfe88c0d276313b4f6c9b685652b76d75fba62150f369f35e4d8c691cd47866557e01b16a464c020676bb4d82471b931e0ff6099fdece1057952f2b7bd3488ea5fd84ffeb39ffe09ce925f2ddf70e673fe1df83de42cf77b2f227280dc5206865133fe6098a3d141ccafbc814c661c82b8d0235892dd98074c082924d327fda76e34fe428a001d8b6514f2d5c2bf1d78c4ac97635b62883b1707c2ac672b82c1bdc98fff42cea89a8af0bf976a96d96c44c2f0469a4cffc54c162ba09bcb9b283d0283a6c69356458e1605050157581b60739edf806021371fa16914884d7a3c4460e5a37b98a96294777b0830d704566f457ac4a8982a81c3fd97c90f5fda4ac8af6069883057e3e52894fdbec823db3d6d6dc1fe871f8f68e38c821e1efef39cfe504effe4f7f39112a8223a31bd8db1c2b3aa9b4fb6174ca5a80711e35b592fe7e51248bd78b00a25c1f7a131b60a3f221be4ee74c9de98899b9c4f9be095cccfcb78f755a0a29b00787839ff854029b409c1ac1e41b2a6b2c7760118a226de39548f5e01ec4403eaf386935b40d4554d1b9df2ea0eb6b12a7c9e578caa1f3a4ed2cbbd3c14f0066ba82f175e96e27460ee74b757b03853a5ee3893f0d73176004761fb407ea78c4bce5d21f54bf302fa031420f6c17b399deb6d7d33b3b596882412d9dd9b5b061f09ce08fa08dac71bdafc9777c42a1a0c9479d16731dea07a32c49f39c69f3db6ad86d0c75c13df5f0b61a2385f64b71a429fcd994579c7f8214c88b6554ead61a76bd46cb0da71b4188bda1be2c92057e6bfa7a387303f7481bfbdd362b435f1ebd35cb78f5b56a18fbdfc873230d0053efcfaf277d458f614467b2defbca37e4360efde10b387969a6237759433bf219e0bb2c290df2a3c088758e863afec965d8037438f99420f71e879f40025c435f5776808a17cfbde669597d42d242205c2eca1cdf276edd087965583995249210c104ef830075af80e4277c1d593013e85380fb33665d6df21e843cff797214acd3a5c63ef77286330c208e3b3dbb30ea75f81f1da09ca4348c456c932abd4a73fff42e8f298d5b376c7f8f91bfad0f44338b4d5f02c24c2a4f40e8ee083bf6364156dab015ab89277d572ceb20ac43038c46648045ce9f773629982b1477921779df2ae30f2befa24ef938ea1a7a26ccafba4f767d2285f9148442bcd9eda1a7a9be50a8990526e1d72cf7f8fbdcd8610dd9562fb5b87c43ec56ad8cfad06fb35a1bc9fb4a15028a4e5ed407a3e24e2c960b30c89782eccc7de5d90080c833ef4a3945248048f940763072bad69edb595abe5cad14c086202cb95d2d6ba7656d943eab67f78838e6118e6b8a65a0c738a598dd6f857f96ebb41cbdb75b52e4dab94f4a5f4af2fb58c470f74caa736490df63bb4744ab3b73f4f86f79905a2be5d63d695519ab775e9f9f429a44e7fdb682923badd908f3df6d1cb7f1b032afd979d42f8de7b49dffe500cb32eebd2d96f38b4d5a0bdd4b21b73a00b0c4149bf449fa4d112fc98431fd24c0ae568a865da4a5bafee8ed91f4db79f585a9c7d0df8e88ff0c5708bbe52bd08d7bfd19eb7ade61af9d8db2be0ccfebdb7d134f6b2e82f6dc0de47fdb24afdeca7ca571ac4811107fbe9bcd0efb70f65369a7ebf6db4b9e5fd34f6f6e57683a6bdd0dbc679a1b10fcdb861afe51df5b457606fb3bdc2d92ba275698a611866af782ecc1c774c52b01b488479c711ee8fa8b1b171efd902fafd0ee7f1dcc65737a9a4f3023d5ed8000b2ae84227280a551451050c50a4e974ef95a10a54f0e286889dd70ca060240b5580a0a485154ad0fb7ef4610a534a791dc50ab9e974dd955608d1f2a3cb6833524a29a5f428dc90763d5620a169d763c50bac5841ca568ff1fadebdf778f87b47a80f67053160c1148428f2634626d9e2f45e172cecd11694165f5b560bda4ac26c11a995ce7f3158f1c30a20f4a5827c42172ec8892e7a60e002101051228b236054604a29922060424c234d643f59b8a08b246a488b1a6073ce374209383af8516d51e46584049b911f212d5a59081911428b6f4155a1f7c3cc1ffc04e962c6106224054152108222ba98994fd0b3d5043d5b58986861d2aee74708da6ad7f3d3c4153edadfa970b7ebe8b8a0cc7cbda0f97ca0cbcc1e98a9d65ce252bd150f3a2a1828433ffe9e212dc56f26e2872ed34762951ce2cb97d903f5e38c9bb14fa3343834e0cdd097f169de313fca1e8ec8e14541074448cdd48fdfc38ef9f46bde31df033b684ec19f2d7ca466e247f9fe272813a3c7905a02755472f051c921fefcf8f3cd401798a38f3b4d010c94f119f756a4a39fe843ef38b2c7de496ec3d143fdeb80ededdbec01d26fef66e8433b337a986922a98e5cfa3d0d82261f4f3e8e28e9b7fa767bbbd9ace28f79eaf94097f724ace24bf4fb90ab3cc7578e6321ce217fb3f5494fca1e187d7d37b391bef4a5ec01faa47733f63dd3b8e94ba337bddb70d02ffd4a6f1847bf376195f93c664c6f25cee18f43f4d8c3cf8123fbd0c3df21871eec6b2ffa1c7ad8fe6e38465fff6d38e8931e879bfa24edeb93b24afc93a7c30374793fc22995f872f47b93b7632a6195f978e415e193e31c19787a871d7238c001bf430e1c2a39642f7a51f680fdecdd4c7dff1c3854721079607bd1bb19d27ba6911f7ff4f4ede8dd86632361075de408abf8f398a96fa303dccc4df6a21cec67ef1b8eed451f71689fbddb70dc2cca2af0433e1bd6b0c50eba645805661c9cc7b01dab557190f6cc63c64197bde3f2905ea5b0cea19064c690438b878a28a620852a8650c5135b20a902085508d90289166e8b696409d4220659b46401934516448440269e0bef00546cee9f9b22678a9d2cacf35b8509eb042f1f0041a2053e80a620a24e5144a49452fa82042fb2e811051058aa264c91925300b115714692cc000648c879020b122029a26416c1c22cf2df82d292e8fd30f205a6d36d02e6a6d375b265694ec2dc8210a9784580a45862446e9b164d678e55063e33bfe6bbeb9c5200d113cecc39a7703d5220a1a3763d52d460093d52a0a0ba2b59e731314a2965941f6394d5616fbea410ba3f1de7d7297fd6f8dcf033c043bbd7079d601daa008efa8d82a3f82af31d10b2f043cbc7c14d8e5299d901010b4174fc07788c6bd8934aa57c98f1afa10020a89d8817dadf8687d5cc7640fa26a67adc6c3947b89e2404d1db79a1fd27a6a1881f4c430a5e98861424717785b642ef196828c2e528a75d6e0142f3f515174734e028f1bf823bb0ce7d7c8804d11b0941da5fdaadc8b55c71f77f8bc570ac4ab8d9bb1bb27f4f6da09f51fa6e8335f3650dfc8abddc68b08859b8d980fdcb1bab811f1fc370cdc4f0d3957afca145851452b4480189482185132228aefb50dca016adcc26e69c73cf39e762759473351cf552330e7be24f9addf864dfff9a6cb6351bcd317f54f059e285bdc458deeea5a5f3f1d1fbd473e96ff7aa004e75ce39e75eafd7eb85c1fcb0a92ecb7ce010dc534a29a594baa716702dbc5dcbb56668a7838777bb9efccbbb02da2d40bb8d837e80c96f1ca6df10d0a1f49b02dafd6757b509e99d647272147d7f137c82df5de85b8c721425fd7bccfb12e9fd4d3896b0e628fa243cc2308ea27f310c8ea22fc234388a7e082bc051f437bc0047d1d7300eee6586bb50fa1985c16686c965cbba960d43f346697a43bf75b8ad8630ead2d7e8d3b794fedb68b65c1d45bf06d430d632bcafde9a8ea8a337617be4dcb6d7de7b2fefeddd869dd6b4cf360cdc5ade305a7bfaf06e29fde6e1fe23bdcbdb463f1df4fb5d01fdfee2191ce55fc230b80b293be86245d939ea8ef04397ade514da556fdb5f283312bdff083be822ca5b0be1ad9df4cef0c641d750c843e41109eb5af6dbc1ddd539570df365276ae2ba217a9f9c75ebebe03fa8221fc5c90da133c8c0e02ef269adf70645f4fb1aee53b5b6d1dc6da3b9563ca4e25a148d93c27d79b768f7a2ad86953b1291e07b52bef7decb1abef757229546b7240a6d9acdb04a4ba5520925f4dec68a89911f6ec913b0b8425ba8c5e7d8ba1ce50fa184d2bae25bff98dd73213ec43f1abec32b3e873fdc6aa8c11f26219f18c28d765e68f74410549a7ab4367acbb73969aa325fbecacc37a49e3f330f8e923ab8ef71019380398039c0b2c0b28049c01c68d192452041022176f8b91777e4de1c91e349f7ee1cae79b77cca0654b97135fcbb23a575540d5b34fcb875d0d5dd735f5917610220841142e820840e42e872749492fd9c73d139e79c132269c0f9798f2ec6186394714a39e58b2fe79c737bba832ff15b427d29a594990cb489e56f7f575c11535230b1ac6bd936c84129a594524a99922cbd27d5325b5ac4b450c8202466b09241363641adb8f0ab6b502ea105ef3d58a7849308b26a37120163a5a3c7f654617b6c8fdc82fd018c9ed9fac02d581feb637b9c112058b607c66ace39e7bb94f24d39e784320a1355b3e0534a1f09a35069100c823e300a1d7d07aa3db38cdc9156e998f79c363048c77f0ebee0111da1114844c7875038c87234e4c7bc6d601008b2130b0b4bef98aa5a66ca722ff06b9114850206b9ca0537308806d5278db870a0748c31daa0748cafe3c9652e34a17e98015d207667d005c02bcc703e2e56144a145824817249213a29658c313af7e788b858fdbd9a0bb75043413e9aeee8f8f4e7461bba03dd1e6948777adcf8aed21b68f97b646345cf4c7ba4b8ef37eda13d2e56baf386482284ee8482a2905187c778758c4eca7b3a611fa3e91423866f30f952ca28dfe918a58c523a178394524a777902d39df2bd974d379e4e3173ce39e5cf77d9524dc68d86423a67ae138838b51b5498b38347cba7adcbd2f1a5a3d3373a669b871f4b5e61889ebf4d51cbfc5aacfb7ebfd67cadc79224406288fa583087092bb7fd9ea1e30b3abae888b74947142773822e8e069d3235a00b9c610671820f59f43eed93ccb096671bf702bf06e1bedf313a28c47f33e8f856310a74ce2ddf396abb417f3edd6c90b5d61a997da89122b0eefd007f7e200677c71bd086f8336f2965cd8bef0921ba95937bef6d938ebb3ee79ccb77eb56bae73086b649bbf489778014d331fe7332d7a4a710374228d222ed9b0da96746b917f83228c7d32e5637e9f8bedd38800aa2c0c2a4a3044274136e34546201ba40e8d2a5941b8dcbd1739449b8526340d4116f202046ed5a60f4c8c49cefa67399b1f2506d340b683ae678837ab4eadbe6a4390a5e78ef95394197aadd2cd4eb28887214fc532d00910b778dd2dfe90601a6a8c114271d1d551df55c00df437fb93221a18cfe4e4777f852303fd6701935994d7807783a450d02714f8ea2f127cd6f534449dc48e76643cc5adc7eb8af0694aeb9296a30450d7454b1c163b680165b485e47a2b09141355a355a2dd753a4864f0d25f0d41af343f2644efc0171dcc74a257bc4f86a7dec61420fb30f61f75a962356ab7d0da31f75cd35365729738dff76a366b986d2fc86a8f9c10b4f578b32c68f34520b68ba26e6d863881e43541e92cea75808c3401738f30d305006cb427a08999252d9036e34f20d41690f177b3c1da396326f1b4a13656ea123b8f0e1833de439c473414a19ad878cf01e1012202440488090908090bcf79e1c01e92d7f8404c87d8c46385c389000917e8449190712a087c385030990fbc0f11e123aa7e9b70e88e4e1c09ac7d46dd255e2702dd1f371b894e8f9385c417a3e0e57123d1f87eba5e7e37001396a8a74b8ce80b0d1f6f79d9331f9ed3f4ba5d15707a4eb685473e9476f829d7319695f470ff368f4a4df5507bc58d4c4dd32296ff7a3e95fcf3aa0de444f5f6eb94634efcd503fa8b397ff903c244f8651aec97ed29c378f6c02e9fa0f0916fa1a3e5fe2f952a2b494d5a4ebcf897780f5b5afd802265d53c22611c6fee2aad5a7707340e94d0f371a2c577c4b19aef01da56111d61cb56d6fc2136f93debee2b7d9d07e7bfb3411c69ee2ec4db8f4136fefb6d0a6d912cef0ca7b4c8ba380900021014272fd16b1cebaf9339778503a29ada1af92f4245228dff078de2b94370f1dfa8a1f4fe943b8e4de12b53e1e5a957832bc25e67be93a297d4b44185d61d075c61293ba297f848198fe6220266f356c1f8381b10f6118f8a18b08d337e193c7b0e84e194564c121def384e8f9ee29f1787c47e78f47be0f91defe7d6c86aeefe50da3ebfdfa6e8bb248f4a57fa16ca3e950296f184d454d5c52def165fb3eea50167de83d86e50da3a7cbf6b7671daeb5f96f89278328d7681f0ae5b7c4e88a5ecb35efe5b7c473618af27e3c6f0999d9b9af9eafbe5aab949a9432bb2a3518d8f4136b221c4cea4f5c679d5347d48f3efa15efe0be78404c0fe4e4e14623ca1587b086f73dc1a6a7187bb8d9b03f4db0ea674c156b576bfff0d66cd8d7b47f34d7459bfdbfaf5ff35b62e42420e731cf041e2b92944a0fa5542a7d0d7f1b4d6974f2a393977f926f881bcd49de3cf4c98f70ad3f1ad53afafa70a3a93520dc6850fe04a3e4cd439746a37f1bcdc83a8f29e5fdf4e8dd4729e5431f1e535f8eb02be1fd74e9a1a59a73323a982aa902c9d701cabc89744b34f26b7e28530386c909ca3fb2d203781d11a251b4eb3992a32dd4a44e8c01ccf11f4f57e872ba66e8c3511383f1f4eb8edae4eb6fec6bded0878d17e3577e5795df3725efd2cf0f7d0d281323ebb0927755c90eba9ca4e453f6cec9d4d7e1943def93cbfbeafa2779eb90a3931ffd68dbafffa387a3378d46999e687ff2138b9ab8a5ac43ead26f1d527e088b9ab837eb705dfa0de3e443ffb61a6ae6475dca35a35c9a2f472f4d72e83796435a6ab966f4a5a7efdb8d92cd3c46b966bed470bb41ea9973adf589be86bf7f5b0df49fc3321afa1a423f657430e512cca3dc7373859a0eb0baec6e89ee325faba6eba0b311faf9da8b42b86af89a4eeef21ec22cd34ac47341beac9b879e53e2086178a906a127e4f5d056b4e2311b36e79cf2315ce375cea78ad35f0f6cce0ce7ac73fac4774afa307d178ab9f2e8c1dd1f4ec535daefd0b1beaf6f557f7a7d4df4867832f8cf18ef8bf276adbd1e7ae618b3d70f981122449250c4c7478a293c47676fb3df58f67ba4b3df283a7bf7d6d5f08d7e8c2efa507e3f8eca2efee1fe28c6fba3fbee37df8f78e65da5fcfbfee2896770543683e7198eca6086715456014765147054c683a3321d8ecab49f44ae8deeff781c0dffec9f108fc1f24be2a8ecb3b72f09577b39e5dc3edfcbbd643f8b5cecfd37ccab66b70f718e37f1ae1267ff741c95398ece3ee6b7e3a8ec6d7e411c953dd5c2dd4f4767ff5eb5de53f63574c0c163ea672e0a9dfd109db5e80da3b37f298fc91e87c7649ffdbb71349ece9e0233d9cf9821db6f053adbef043a7bfbfb89406759e0e8ed7e74e692e8ec9d96b753a2b3ec01a1330d2bccfb5e07b3ec3fcbdeb564b9c673a66f5c10219284222ddbba91764e5aed61c6b2b8f4ed7b8a456fe3855e90a9d500d9e17c668ed83fc23f8c9e946b340035100e8cde91700f3c6646388cf2e821c6f20847bc3b90d2117bb739c0cd8c7efe08ffc023d593b352dd7cc087d40c103c661c7499b5d2c83c030605d040a370b39f3eb7d6f02824ba87e8c77f2a47837efdd7c3635e7e42ec93e2de7f0cc3e66f8f8fbd9b2f697e3ceea5fe9ce2e60aed4b9ce389708e88e15d27cef17408ef96fa1bde3a787054fd49c5ddefa5ebc3fc528edac2adff78eabda7d3c3c7a3eb5f8fc1be3eccafe85a5b74fd07381a4fd747c150df7d0582163c2728542b747de7b69b42d7c7c163fceb8ba5770174ad59de6e88ae51e8da5273cdc37c1b62becb7b0b85a0e5104f7efc90965905661b22edd9f5d30f06f626889f39c2bf468fa14297fa7015828dda673278ae43cb8ffee83f5a6d34edcf5f95a95fa9ae71947bf11b047f4f055ff0def3170e4a5f38c4ba963d5db002ee05f6d030063d1f47e33dfc47c45523f788833147d41bfa440c7d246c5d1895d070c7bdc05804b21e4b6f89e3a3e13b9c0d7b34fc2d716eb84316ecf19821d3f5857550c081420cbc47fb2749a25d0355ef40bfd8424ae7b0ce63101c42d7d0fdf78afe1c58d7128fb8bbeae75e73f0df3669585b0f70947b08a18e58e375412efcbad1f883a1cd439b5c6a5acaec0e218410c228e59c34f5d1d0e6a1eb731e7af587c51bf67831d0ee3dc7215cc11ef007541549f20272b58a00b97c6294336670514e5a63add05f9d14c3807b715f31ab454d83feb4cc6ea1180a417fa11a7a4e739b482bb225d1ee43af90c8256a69f7b788c3db81b4fb918b144924e88f5443ee3f5c09dff11cffe1415cc77180bc58a224e805a424c8f582bc213d31c813c2f374dcfb5339844bb4fba8e4ddbc1406667845b47bf77188b78b62867b71ffdc218c51fa9b35e49e4318a39493464aa13f1ae59c94d68a6531cba0bf8c3eec6556db36e86fcbaca66d5b2824baf15ee8ef6a0feff844ef8e1ea9144b25e8af44d29cc37bc5e16d72270ec6299e4ed0df69a4954e2593c956c3c3270e46840103fa83514326756f40bf0c55eec57d018c60dd03627ff497a39f7e4976f49c2ec94a3bedb47dee3ce42efe2d700b3232cec99f585567e68c0fb83353ca9881cc9fd8411720e76464a27bf85665bebb51d599fad853acaa333b1ee0a999fa180e62c60c7de7686c0d442d5fc58697a3a58479ef50991907fa4e3fe0ce541efaa574c5146f9797921e9b1080a533c800163f36e483e604103e5a7616a4e167da391afeef71381aa57fff761c0dd2bf7795a331faf7ee7234eebf873c8ec6f6efe3cad110fd938e0a1d7f3e24747c0a848e5ffd47c7c760123a7e36848e6fe3111db3e4d148e0a898583c24680f80f0e13f750b98842d61d39370e9ed0893de5e3c7a6ba363d38bb09cb46299d5a616c2f19f76f2a1a342c37f4868f80e84860f1f26a1e1c72134fc7844439fbf258f863fa2bf270934fc0ddf0fe15b7f4f2c34fca885b008fb4d7ba0e1532d8443d9efea43c3dfecefba85866f4358d37e6340d0f0352d84ada6426fbf331568f8b6c6f82fef4b98f47e845de55ede5fec2ef7f25e84218f7b791fc271e55ede6fcec87e387021b41fd99009fd7ee21d4ba05f16fafdcbbdbccf48cf12c162d5b5de8eab5c9027ae5e514e5a69dd71950bf2c45594934ebae32a17e48972cab9e32a579451eeb82ac2b8b35dab1ab9efdd5de49c7398ca0d6c6b407b8e2ff7e2be02e1398c72d28a6556db42a23b22954c2627304e28292a2b31644f5ce1c89e974a0aca09c689ecd1fe263164b08c200f4e5c9d98984a241ced3f62f9ebca994190677445a119a4fdb7c72257e550966bd32c6569ff0ce7d0fb941c5765588ef6af1900dba7bccff5edd4ba04002d9a163571e34b633eba86a7ec4cc7c746a6331df7e25fa9b8ef77d6625bda6d5071039069f756005a7c391aa40ccb3cac8910d6b5b8f83cbe1755563ebc80f0043e5ef03cde936989de2b058081414a0540f838409918417ac80980b47c1a1630040537ce27954ad96066bb1f2d7b50a043ab2144f0406fa7444bb80b70922fad60aa0215f46ed1d261903fe093bf4f745649a9fc168ff1931510d00c2025da9f061c52a9140866f60c3e4059d0dbb15c4ec8f1a753562019687725da35d6313fc42747f98a086e06c47defde85751e23b71adc3f42bcab7e99b650734cdba8c1ea5e9cfb93535baa4d19b5c5b40ab5cd346cb3e1ef36fcada6d9cd867f86551b7a322a01724a4802e8094190fc40c48729bca00b2974b14310168a28c2c78a092b70a12ac2111718b1818f169ee08413439ce851c2a348a833c985daf500bd6072715dbb1ea01cbd1f1504d4021d47e8c122e20814148123052016f0a8c10e7cb84289115360420b333040387aff832ea8291d4c1180fe118821c7a39433c619617c9b939eeff2e3ab48f9324687eeaee9994df744c4cc7cb83357203fb0195fc337db07f1335a74192ddf1c21339be18761eca186e1f7217c73c4c42286dfbfa0e7c3e84893c56d013cf47cd13ed9aacded064c66312d84ed3f8de1a7e7363f6a0f67ffb2c77e6e3498863dc5eeb9b04d8dbd869d7b61538d558d896e70e7e79931a0b13c73cd3b208feaf204efc5f8ef3dfdb9cfe6c55392a0d70bc8557f5cad56111f116cddf7da66232ad1274c60bd1fa8d4ae4c7533277c533f889fb91e433401b99aa3ae0ff7c5b0e5cfb8ddd86e7440cba7333fe738d63e87f03d7cd947bbd756dad52892d3bd29e3057ab95c3f2dba02734ea65b379a7a4a12f47a01b97eb47b908afba64bbb87ad9676ff600fe3c82dc9a0ab964e4be7f552c9788c65fc531d1bec582128f543b684b55aad642c9111244349ab0565b2d7abb5b2810f1d8f4929810fcf0e94412162055610944171e20721298f416142b5e3c3ce0e173b59ec1cd9d961b5745a3fd8e4522579bd92bc5e3d32825a2a96916c496bb50423199ba87e805e412b28635272b33279b16ae9b4745e2f950a632c23482707275bf24305d8b404f762c4b9f0e3a89516aba56239a1fdb78ca050deaf73cb51a69f24d912a06c490fabc57a5590203a51cc19054bd562bd54ad1f17904a47e7c56afdb880583a55ec046101dd6d6ae9bc58ad1f17106bca609111806f7900ac4ca0cabec896ec24012bf6542a1d8b04f78211dc01a0c8d8be7c8ab0582c191941262f5aad1fd712a61127c30d6ae1550c9ca24a99e066e531293eece8a8a00c8a13d9173cd91228838203942028344059a252a9542a222a2854b1055d7a582d968ca02019413282640475a1fd5964cc293190184f675ec1ce63d827fd82e8a85a3a2f55ebc705a4dad96145c152b5582f55ebc705a4d209a2c36ae9bc58ad1f17102b880eaba5f362b57e5c40ac203aac96ce8bd5fa7101b176b403c00e8dc7c9278084b54ec97318e41ea984766f71e062dca176b4ffce8c68f759cbd1d8de39d74aebcc1bd7d15e68f75289cb481df98484c2c5c81efceea58f935979f7b2056558debd7441997ff7f2056554debd0c62391aa377f28b9e254c04e1e069205d2eb82ad0ee4ba0dd4b219c8c64c94c123817ff2d53da7dbc829399aa98698443f9efa844bb8f5cb89889e3284723f4eee39218e46888de41999b23eaa7bca34131fb342e4e3a467c6232adcf1572792e8f86383ed163c4078a214eacaee03a72eb46636fca4e8c20f702f657a7486338c7db3e7e0a0ee267545858789ab02d6c7d340fc9ab5592762f266988a156c12617743125f142890b3a66d36b03da792f65c796b450083b7db2d1d88758ea255960495d9c6b0469426d8b6f84335a6579e4230b4b585246e090585293250559521a4b6a8b2f345a599fd14ab4722ff85b9cb2839f7e270d62ab2b06a2a27285968aa8a26830345d31108c5f3e913a62a4257d42293b2af8b1732fd81488b7233496153b842b5fa118d814247f85a445d667f432041dca1b250b96570e8ec6a2629232b931f1a1fd6b0fed6f7d44391e23dfa7a2681087ecca8a0c1927182726a612e96d3680c848798c7c57bd27bb626f56361a9b92c2dd36958d2a904bc7081c160b085852a4d16a8e5670b4c2462b2d1fd962a6627d6e4ac6881183f413e504e3c4c4544239c138313195aeb6325858485386264306c4235d319018fff8e6888ff12c58fb9b23de0751677ea05f7cf1c5cc1139745c3d1fee24e150fe9707de2f9ccb5d025d462a478d4270fa2d0383da6fdad6fa5c1ce8e2cfa26261b971d4eb6e93cbe482325910c449e287def198141538947fabc7bd388a91fb858f76288302c5280443462a8f417162a5fd4f79cbe87d7960f09cf098641e134f295f1e52be2e206c7a41177fcb320a52b2d1644156dcaa1f0c495f96d46865f2712f2041cbbc99e0989ae05e8e3813ede5a8241e83bf0a36052db93850c6e485498f8b637283a35dbf949d56160465e2cb82b4432adc3d5a3d8ea9d40cc4245d31907f897358f8f537a693a31303edef292e7028a913c2282ef7e2c3722f28475c4ba310712e516814281ccae17c5182254204a5f8a05db2246b9b5c8f4d41d0c51f625313b0e98873c19f621390a3fc316c7a615312ac6d36b966305aa140a1fd374b2a626c5a025d5c8e32019994687f694d49b4ffb32992de4242f4e87d6a5de8e2a337748d56f655646c32a728d1a2412577a7ec68984d665bc451d65a8855b4855a4dd11806a2f25946d1944e18da5a9b85a4fcf79e5e716d4f0a8fa35294d8a813e80ed5203669fb82e61c0d18edfebdbc03d5f22d8c46b1d3b5a4310c24868ccf62bc0abe51f920eacc4d103f7313c49d6979007c7ed9e33117c79f7031d70887922c28335a411238190b02a7823236055d703ce6f2386a1ae1626e13321b06f5a7134bb252765ab0a5c2bde00f006ca77007f0cfd8127131f8636c83acd48132f6c7efb63e52a7017446255b1ff7827fe8870c4b6a9bdcac68e726bd4d2e1d4d4d7034dc9b8e3819ee92e782a321dfff714a0e74f167c12938d065055dfc473845e55efcaf11293d2e8ec7a408e1501885c7bdf88b30ca68056550a0702e20703d3a05655098702e4da02871793c0605070ee5ef29a92d7305182eb467f1474e462e11eda395761f5dd2a18cc2722ffe2bb8db9a5cf57dc4ee8525f573976c4844bf77a844bfcff23e25d10f02e9f79b25a55d8a8b05ed2f03c325d0e57d0c0ca3418c69f6050de2aa2d8e06d020a6da560b8396c5544a43202b2f311095a71888ea67543e05ff80819597de293c39da7f05a7ec4017ff8a0417647255cbc222e3f240997b79b4bfb64500b0d1589fbcd18c56d667b41aad20cb0e6000022000015c5eb41425369a94026c34d6c7bdf88794b8db94b2a3fd4d411eb3ad8fc96502f29897c76c9b241e23df456d74555662c860799c69a0fcb995500a763310673a5b1e27970016dcbb92fb0cc32a4cdcfdba05e5e236673aa16019c6bd70b75bdc0d1361fca38b2eba98596bb34ca7743d2e0506b324d7618e46fcfbbab02eb5aac58d0fb5ea68d0978f391a3365dbd7ec63af594dd36c7674ca570598c8c4fd16948ba3815dac59dc7d3318f8c3d3ca84e984e268c4cfd551e1ba480347573fcb3660ef59f6349673ac15632d1088979509d309c5d1901fa3a39c7351a405e1cbe2c78a656f737dfbbed9903d7c6bb3ea285c31d6127f88ff7eb4854b8f5ef4297d7df47bb9458fcede6e11a445ef8f6958e63218925fc37bb496371e7d7dc27dc2ddceb5fdb63169d1bbd721de6cbbf17ef4d866c3f6a3bc45bfe58f1a765a846ba8585c5b8306052cc0635ec7895f6fdad78d46aba3bc2bfd2def93a6356a788cbbb6ae69986e37609dbd7d6d8ba2bc6db4c8a477785fe8917dbadd70b7f6ee45b846cba1974ec7edc67bf923acd9985464b691bd7da76bbda747c1e83863d7f8db87db8d4cdb547045bffdefc34dfbcd067f117e3dc24fc30823d4b4871b8db68db0d35ad6b40d0557d32cf62761a77dbb81556c78d15b110ebd75dbcd9b87beda8bf01e651bcebd682ffa1a500bbd083b2d0a65151bb6cf7ecb9f69196778db98a487de47d1cba2f03e33dd16473df7b074947618e336398e0ff10e50013464b8c6139c9679468601ca5c05d4d48689a16101384019fbef714040070ad86040470f1e535bdca505f528df41a4e39f9e3e6d776985ebcebd48c72747bd18ec1fc5e8a435ab50140aa35ab4709ddeff2d28b8d17cf4771d7e633fa8c31fa6e0e2e031f2d1a08007e0d0c16354648e51e7be54e6019e1ba8a4cb17cc9a1a654acd8c00000000d315002030140a070543d17898868a1f14800c85a05862449989a328c96118848c310419600000c00021033434a35100181e728b07440cb518043b52151481bc6c62fa38d22ba5400f031ddecf6dcfc39e3c97ac39ac0e205955c91bd7c47628b92a5f76871001b0dc98c0db9b856665fc529457c8850ec8e5492240a2efbfdaeb4270ad34e5aba6176b5d2134b32d947b336c4c5e7bfb0aa15f9e2f75c9ba428470a1b2097a76ac9ae990d55cf88ba666fb8488489a74d702f9090136b4d2e686d35f2e5f91fc14e013f203ea4ad76cbd691945df7291818565cf299a87f38c27556e2e373647320bea055b334014f30941427e2c5288db9f703c5d31759a3e21a21b5aa911456f132cb662ce256b698d7f055f17bfbe167cd7d039bbd29d44b3feaebc1a85d821cb908589339055a0ec40ec905220350789ab1820b06c96c8b526542070db087f8d7f7648316ee196d04cd36d098b8159d8cea3c3b88fd1dab8a8acf18ff7545145fc76dbbdbac84a513e21009c604d33d7b650e6569230e3d3e5188703589e7ebc5e23cd5c8e2beb4a39f70819e091e800d968b87c426ef200a9fe6a4d6c469965fab905997b4230ae90922364b25912fe687ad9b66ab08986c5beceab82e813426cc52764b7d927c45fbe4f48642f9e597c2183d2a5e49df9066775960afc8decea4848774f14c19fcbde59ee49b13e17c55f911f88107177ffa5899c411e9608b65472d3e0a3086ccaa63f8778e0b01955d73e7d34c3620cfbb9a8120fc47378089e3c059aac52d467f2116c280e9c5582f79922e578d0c3b9bf74c046d0c91cffd2e34ace21469d7990de2a47ede6aed0be9da18d02b3d922448bbaf68802f73b13316e4293f0fdda7feeb2d527d599bda34ba62df9f2a67be1313863089f8f9f284637281af30630b71ca51e7336f0c25e36b5d09612695b229a3141559f00474d97a6fbbad24dcd1384f1894178b3405a5e265393677f616f5e0e8579b96be0a6c3f01f9588dfeb0d2166020f0933abf5d6a521c1fe3b8a8e1f3125f43f802e2386a26284a79a7211ac16c106ee0ae7486188a193e7aa6061a3111a5f3490fa4440f7fbfcdffcc2490d2e88b9843617879b325a3345d75256cf241fe38ac5e65a00894375a1a2047b932c853218b2ade0e4c03e535d0f4683e6558cf0dbd4325be795538e8215b577ab4f7f2e84089c40e8f5ecc6b1977d0c0c158604134a97f6394513ba4bf12f85e4c7cdcb18f8c952de7f02ff4f14c098cce5095adfb0a625ee6b86c2bbf9d686fe3a48acdd4e163f41f3544be7d4850a4c4ca57a38d55bcc1afccfec0a6b9b298ffe58cf7876320e01f135adf8b62991aa0735603d44ff91daf97bf0dd397c6f09c393803aa8dbef59d8a012487cc7d77312bfa7bddbcdb71251325a70cd04ecd78c74f4a3981251293dc6f74a1bf21a1af2eb0e4eb80b0327b28051b989b49855afdcdbaa9ffebd3f5f25ed7a952318dfa76a0ab54cab3730db5bd2a9a420758406d590cb7546e51f8411d38c9fb0ab247054d57f642da82554430792ae2f9c8f4a43d3d61c9fc384c2c7e663303f259694759d9e797e85fbe178c727e104964cbff74fc3984aad0a98f517e00beeed625b9bdc4e5b02147d6f98136d306e4b0589b59ca5ded8ff101bbe9ab6a7c3379cb978ce594f4f26c103ff3942c760d1eb90eeed65026e05c9e739b866430ed4a95ddb1f492edf6b3971ab0a8a8ed31e86a666dd27be44c6fa7539697421248a0f25720ff8ed802905f1625bc5de4a11fda245139046a271a2bba6a4455fea2eb2ec19285a18cd1027beb11febe9154e232378aeca507c2193fb4470892221eae911c865a21326b07f600039c2944038a2d903ca8d69e484fc06692386f354812e18897828b9978183263527a72286f83d409a886403091938a422bd443606c3dea7b283c6e6309178e933c4143ad40ca39d4c62f488ea28a31685283313053664aad6b06fc940c2eb190a9e4758abec9c59c505cf17cd610ca7848553d0355158cd95171b9c29996653863fda441e50c06fd1e9484eda0a9785c4a1e610ce9f660dd54a64cdb97590c0a3dda18a71d523c207232724e6785d44802f30cc0205c7b0883ad06f6c1d09274b66ae53f9f90cf7f16a2806ad67bf07e03d0ebd723343abaf94ce1883892a60a29794523ee59444295b920f73e74134ce85fc2225577ed683521f0f19a80d73e4ce3585583c4ccee1d2b4a3b94ad13a0d5530994a5e8b45fc47f106b310e43045c58ba528aa7e4f4d46452086c5525743a9acaab039ddc861cd872aa2f340bfff188b5330704104410a9c8a71115c857b29e56426c1e81b72cf2b99bc64b4742a2cb711407d1376caadc5a92bc640be86a4c5c0b36e983651c5dacbd4b40e98c8dae779635dc51477f6921d346fb8f65782169b621d7fea6aa86a1ae3774d00359ae2247bf34d155aad9931795827e0fab317b9d717c76f781498542f265b0402d24ae83df44c809a90800abadfe82142fba8a82fc0924ce2e8fadfed22474556a5fde815c07df65297d5fbb0de596ccfa40f41d5568e4dba0750b50acba9957a3cda98ae215869be855cd936acd3349ff98e20fbf5f53235e7a09f68f02c57e7afa4f4e342b845bde3fea60afff556ee2acc7137bd1508ed7ecc679c23c0f069775325c93af3c2288643cea5cc8c998eff5cd4d9ee60b0763cd5fc6cce71e031593de7d291ebfc3c33b8025992bb37e7c22224b939c82b6f6ae141b9e5d253e42e9262e5ea521dfa8420587b07719a6d9fa9d0f2730f74d0b592bfd024ef8af9e5c5f2d288345a2d378a11640eea920822cff7b8b8dc716a00d201dd52d367943989b73f6d94d36026e38c8b72c403c9047a03ed2b4aac3d919ca8721a2aa972ec7d7dca2810fca5c5811212a26bef510d9baa881cf0ed83d909ced6083360c45440a46f8cdd8b4989d756c453a16ccdd455d344bac64680f81f9735e25794e8505471dd509bb6bc25ff4453c13a387b10d16cdcbb510ce88e0b1647f74c749fc8276dd862415f84c86fe5f7723aac8dccaf4f435ad7780cbc22a6b3b83188870e06f234a8f8c04d66a56f545bf9921462a31a702a02c2da516b44add7ae4a052a8397e2a5d04146638728b9578bd783f50d2190c0bf76724a5cde49d6d6aedfd4cf800b0eaa3620e5aa2fb301e1bc9fd76361327b9fa7b8778b7b21a9e610dc99ff016381fd9246bc122c855bdb6eec334b96fbffa011c06448415009c030188817269e0c4f2832ea98251d36a13a8853cc1221802fe20d5d11ed9c706091aa650a2d074d304ff2437a061a15875a932cab06151b276e7c372842f840e0970afc06e23132bd5dd6c83d4cf0d14d8c960c45952215936a1758a430c5ad934817531e70538686b3109caa9ea5655ade20bdafbe43b52b37d8cd051faae24061553d8b4d5b20b6f6d1fc45262fb45f121841e2d053b2c7840ba28d922593fa949b69f162d1661047bf12e5877afa5cb6b06071c0865a0935b619284ce2c0143b09ab97cca291a56333452e3106bcc3ab71ee49f96dbb62e3eb9896f67f244a6a9d4fd25742c32aa7069754247d94676498fdb120fe93dc310d2605ce5f90a400e81a46b97e333f78195eeb1bdaf66b6212cf0b8796cec966150d914ed80af27d0984a11e56881a8e3e03e34244eb890df13831100b974764a248b266c03dfe8b42b57924ba614432229b8cbaa849d2e9e087914cfde66ac062b31e4b7632e44a58143edaf511200b75291b89ce949422d95f4db5d02d80a00b6cf9cb8a871ade55b06f0471819ef17e87e49c22bc42e6f8263e1a46403273d8017c21cbc82c9a1d2a5d4bf391244909d76267a902ef0ba76ae891c13dc469f198af3e2b300aef7e5e9071ee288d8a3467cac71ef5fcf810730aecfaf8cae2d098736d9fab0dea7ed142a4eee7f058cacdd8637810f60d68aae2af03e9fa3a2911df2a9397802fc4323537b8f01c792de54627557c5898a36d2a793ae3c626080ef8034c524f4772424088b1524df2aea727a4fa49f3c9772ba06f2b3f9093aa2eb935be150e3e367c0730b01630411b3eca470e33b88939134a2c8e10437102a7b03c791fdc02a9d6197974c43dea3b153e1c8a929e79bfe452fbb3b1ab76c1455867d2dd517768ae89d594cc87c9f72b69bb3d1d6a67c1d29b878066d07fe62901f3d30de7fd81e580b4cb5afb54ebe9886194f58f1f9a3263618a0784f66c1d7a7b663fbb97f9fcddbedec04458cedae3520980e0f97b3d2361cdaa94635424f7e0a31414a79608260a0aa57c6cc8d0e76e654d33e7e2c86384bd64d6679f5fa23de4118d6d27bdf7788df7244be19f938e701aae3760b945446ad3dde0d923a10ac0d9e1a0db6ae5305a71664aaa2553ec60da83358c281016f2d47cf5cdfaa1ed2e61eb3e32c36ebf2e88852700f46138ae74540b9b00aef569bcde689ca2516634b4d28873423411872642d33feb5850bed56e245c083f58769939ab010a98befc33e6925e68e9a5b49cb1e888fe300e47122558b656502a5471d6c23a6e419e06b3df4270dbd34446420380867ce11557ace830c014f193d28330010c35dbef04a369e15e73055fe7d838d0b26f0ade62ea2ce839a2e5639e28f7cf2df09f7d7fb5dc3cf3f11b0ca73849bde1deff6efea482a6ad4ed2f9e30625604b5b435046386a8b696cf941dd5012a960ffb345f22a0691c803cfa16bc49e0b8ba46f9044fd77c19311db198323f584923e624525a41b16d135f2c58bc553b00bb26fbc4015688b4cec6e66c1e907504ba195d0411c9a5ddbf176967f735e33889270522d4cf23accb5a8037f0d8ab7e3c1142be9572ffc90a7a35ace4eb4828fc99e6e51b5f37bf434e7a7a16856cff5138bbd6c6229ea5f3f4026628769f9467889f14f1c978ca03965a9a639748b788b420728ad77db8c1fb0f78470a0c79907dd888a873942d052616a5cbeac2dad5907e676167b9bfc3b550ad21c0365c10058d8249031bade197222e007373e36cc3a59faf7a7b03c8e4063ff4c524727140890dece474b0dbc5c160d42e4f03cc77356e06eaefd9a2fc097ac74c9e9b451e469371512ee642897d78a45c429d7f273afab643a627fde3c18b2c444c0ff3d7071eff5ee11c6ec9f8b3569c7c8e292594834adf0ac640b3bc0934e87acd4258e904e354a20778bdc0bb31fe9c8d93112866879385c4f661124355a2685f773f2a91926b67f18f87a2f539e16d4a311bad37f2e7832da312c3bdb6be905af037068796c98e4015775005487f0847d898a81a4c617f7932d49b7ca21d81046c20c43e94774d95c352237f9987f860a620c33d541a1b392fadefcdcb5a7572aa3ce6d59aeaaac18db26c551080849c3629fb833f9f7fe94df9e009d239321ee150adeb9542d8faea7d93fed2a388c4afe9b1029c4c5376dc3c4e7411a52aef343ba820f7956cc9cf787a866e9c8310bffe7945761ab508a151d8d267468e618fb90304e734be16660fa31dd58278cbd1e98c453f6b2318473f642a96791de0437a217fb29ed2dd22b616e548fec0d5627068d5ac78b348dde4cac3e6a33b6e5d99ed90ad76ba700a19bbe635dd68abf8e232691dc3e90f0ae5c11ffca0fcead911ea7240e3373eb2e637f9d667255fcd205d29f40ffaf1f6450716602fb2bbcb787dd65c08ca884427f15ecd886bfaa5af11bbe7efae21df4c043b598ade1fd0a92f91dec09fb6b71fe75ba6b29afd40d92a3f241c417634d341b0d36beae5e407183b4b1d0e89c30ab3e366e97d7d773ee37a330e3d3a459062c74c7a0176a757955008aa55b8f79886a13916a37c89d7f90ee17dfdecbf4f8b6cdfd7bceaec7a8a68cd868ab5b649aaaf0de5a99c10ae05e873f1f781f78bda53f4454d42a3ccfcd9a5461a0bd08c22eae15f4daebc63ff3595a8f756e1c6ecd495d69beb373ba6e7d16036beeba2b67c6b48c4dad1df70a0e09a00c83a079adc5c543cc5aee13aa2cb5eb87c4ce588845e91394d71762bbafc2ee6bd83a860f815ced6e23d6091adeda1a1c31931a2bfda83c0a9bd6097d1a6f4283d7076207d18145c5e6f63a52af50bd8675235f3c4a2c55c57f05d9f4fc4cbcf4b872a6123f892d7da7543bb943bdabccfb5773344ae399c00993e8d9852c6562d74e4e23c1c58b5043ddcfe85b9b7c3f7b51ef252e9b4ca1834e1c3bf145508c76168a22512881b5d4cc22bfad68bfa5fc5f0751ffb219cd15f3e6dad56f9089af44a56903ca0d9d624fcc8f0c0c2bd758691f8faa48dedcd3e8a9590ae21c47c35a573c26917339d78e13e7078715f875c1daf3a206ec7a752ea2d1cb5292382d853258771b4ebc77de1a12967fa48738ffd10c8b6f7a988b74668bb7107d98f8bd08c39d7ee4aa44275093bebf9cb676b89d9ede5a25a0a8cb6d7ea181184a0fda734882babb5b23b6a9b2bc3112b07d4e0c93ecf90775f9093d3932924b1a544be4a41d3b0bc129a7fe4b3037141809cec63e27add1eb9fe6517203ed90ebac2691caad680d105aeb54ff26639d0fdca3653bd5436f71ce8636d290fbcfb1190cb35323cb5b988ad1cd41b1171bd1b871755d478adc5b17c1533e0211efbcdca8dadbd16ede922fde623e0c92e89f4062c63cc1fcf63602e9189ecdcc12ad7a87e054760b1d5fe3740e1e47680ed5436956d30cc1c3a34641361e7125e8ab959102119c162727a9659ae4b51a299c554fd458839640303bbb89f911f6cff61e733c868b3692a4ca2e78d1ccfb790a3f01721e880dc8b396ca4385c1b4abf6120243a0f329e8a6bc039f1ac5f98f79460eb9d9e9158e89697c6cfa4e1bf9f3fe4136e857a31439a35fd659d3b7cd1f105afbdb3d3f41a78203a114ea1b0ae8d800fa607e8b9de4a840783f50cbfdab374701778c35572c7762e2db360de7f5dc5008f31715c4b6a38ea971e441121e23d06a5a09afe59f3e10839a0b645706b8531e7b5e90661d643bfeefe3d160cef16827aa13d820df783d560773d6acceeca37b17750aa0386affe2ee5a1d7df565a065e6594ea9ce58a699f99d125d0de8af08f088c9545070c83b6d590228dc701faf9d5b755db7ec7c7bf48361050f6b9a35f6177ea10653ba0b520592a87f4794e5be533cbb001459e0de636ab84ccaf85de96d9af35387acda248577966eeaca8fed4d33b6ab2b693f7a37555752e20e89e634559b8fdca26afbb00c3362c332896f1bc88d7c08a8177ef9688a7b3146b18be903fce405ea6129b7b77e79649104103b4ee23eab9c9c34ecab03b7eacc79cc8be521bd2c6529ede52d4da47ab99d16a2fe3b1752d43390bac6726efd1dce96d2245507b6138f1742077311aa8c10b9e6f004a054e8da88501477b1807365c2301e5d8740cb898dca8b3096698d59bbe303729638768be0b6cb8065f3428d7dfe385ecbba8781cc301f14770cffec7dc46b84be3cea27ba280756194a0127ee6c68137f34a14a56c56255f723189db34b87563fadcdedd00f479992225830e34a9068053e5889985be5a086051386222ef4ab10dc2228f63eba523a267135be9fdf499d930d528a55752c688da08257212de81fa45a14ef7f297a960340f0b60d21afd75abcc01d9150ec175e064bf0ca6e4f66ea793a1ad0214ee386ff0561e058288572433b7b8c9e24ec96265ed25584e707eec821eab51d9494298bf47fb1399e4edeb2d243a07337d5ac98c3b2434f10a31f73dc7f1fe8cce1e89f1f3b282d505e844cd9a13dcace8a8714d15c9e7558c63a4b2c9b2806abf4bf069c4f0d4e51b419f8ee9a5665f0502efba8ebf31f6a232851e92526ddb53d4d1d73e036f97abeb8466690d10ebe18c6d5717067edc64f5b10503be74de546194cad4017eb27df143196808598bb5df31b085a0a776cc95d9e6dac175d10e433103b154eee68fc5fe08c299e0c8318fa608ac3296beb6452d9081786863bf8813cfb015e722be1caecad8108cad767fd1d562f14eb57287a58b1c8c32f8356d6fc8fd47dfa0afb814facb6cd820764d36ba591da1b7c0e159d45e238fa43529372a5e8e153716657ced51ad5d9c7ec9c14668bb2466beed71d8c60504a39d6da9944252af1fd9a5b2a56fe91940238630f3bbb203e35eb283ed7e43e3f6a3501708386b2684ca583eef40834048ba188df1e89d4ce1afbdfb61b77c4d028cad4c81a2e7b86377dcbd380fe7e0d56a3f7f040d27fca864c5d31d76da18a02a44f9df4b1d8e2b8904f8874a49eab6f9616be9dfd570e9bb0af4aad7284eec393acad42c854809f7ad08b45ed06eea22a80e9227d80f6f9e008cd1bc0aa5facc575e031e62161c9a3393662186b5518104d696c6ba558d489763e7e0d1985f4d773b6c9cb11fceeb342c6975c6c93ebbbc896387abb53ced9bc5c0377db29e84a76362722b375ac1b6edca2e605544ff7620bbf15eec208b8c5fe823908e672e70de5c5aef677a2c2e932702da3803405a95b558df3f2c528c2130b86430873ce28748ddc9169d4f862c45b5d382c10fa07ad7a108cf36e958ddafbfc8643d3429ecdd033a8859af9965c6acb00a8fb286b12aafaad93883f52e49d4ea933e2a06f183cf501dbe757f81181087cfdeb9205830cb4a3fb75fb9615b544bf14db0ffb86e701ae89ef4f326a51c1ab9d5f10ca4dbea09f8cdca18407ed754b794e85f87acd6dac9c15b4d107c4ab462c2c11b012649509cadbd698403a78367e683f4872bac8ecf635356b3ed323f4c8d1e08df1c91ee311e399cc6b8c870a8b5e100265980218f1681cc82d483ab190e1fbea820db003c8faa2a85ae15db0bdf65e7bc0ec0815139eef8c1b872b2d39928c9b649ad17c07671806973eb115efaa00f52835e423c40dc72abacf243282f5e3abe946edbaed6f60962abde5e41a9caf54863080c5e878054c428ecd7089b20737a1cd30a65d189bfe62b952190388762b68dd41285598d11306fe191425c6e720434c32ba10ec705dcdc6a5e7fd100a68ada36bd22cfe568db570d1c473ffe0446ca34b405aa1e76aa352ed067b5883c14c6f70e9c6d3511cd3795def9386c2299629494d53a67554e3591d32362a23af69c10161b493a058a81da566e28825b8bc596b0d72b7511d298b1fcf9c2eaca23a307e01291d760d2fb6d4787e9c0509071c8fc1a5007a77bfe54f3b83ff4b4da0769ff7ab1b3c45460c5922835480f9e2c7d63d196e3fc22fb2e26e5e8bab350a6bb6ff33ba7b592652316aadec74c5ec8de06feab977484c75021bce665717666728cb3fcb4dafd284926e87dfcdd2fbb297827fe1c5ba759b593761b945aa09c6b633b1e2ed82e96fa942d8ed35b4ae3225248767fe3bf8ef506bb5654961435980d4d80a81005305aba64455fe169c41d8703f81ba2e87df46c54cb718131e94999bd5c08538ee1d836ac4ce716855e43902a847dd63a85aa03702acc722536f8e113c594ce105fd470068fcf607d9a65411fd80118b5889cfc48f4f52c22739261a0d298ef0fce32a5861bd57ba2bae11ddbcbf7640884dec412c2762fdfb20c01f2c650ebe8d1972fdf658f9a791891fc48221267a3f14fa1366bed1a44ac658bcc61b624926c6bb2f2dd78ffb7673fc5e8fc090976fde383a317dfb5152fee765ce3ad1a393f685d083baee7886120c58752a7fb119672e20074e9aff2eaf3b723cb5ee3e3953b287fe1f289ba93da408c894d2c1ff274b471935325d8ac5546976fa1e4e34227e8aa967cba0aa1a6c4dcf60ffd764a5628dce01d368e730577177f89e3ebac7e34428263da5fbe89697df6f1753a9dd0e947d9600c56a1f945abafc18d0f1f27640c4f129b791a28d423a56bc9e132d619fdea1b98425c28e52536d7048ab0ca5a8e034740f2f0de89442cb49c5efb97a3a060f3489c2d117ac3f529ce728018b012f45a1bfabda1a6474e924f145ed78e88ce14c64ed5cdfd85fd0b00e086a95009b94f3cbe80e8ca924c0ae5ead94a9b1cb540d61a1be71f72806e00bce4a7c81b3cc4118697e7cc1baf4555d7c41a587db56872e6ec7a131f10531e2136650eaae2c5f90ad2034e00d2a5f10a88892c5c51697900b009394bfad2f80734d4e86d164f05d85fe10dd2965e8ca54693bf6b06a273b736f99deb3a41f550fb6230a6d6ea1bc0cbf5639af012b1f7fd30601a0aeb2c944a7e8545363d0348f759f82139c277bb00e09b11bc2ba174f8a9bc8049fd7c011cc47ccd8a6f804f33de36b51a13a7754494e4c04517bb2588a89b308803eb4d813b88b52319c82bcde9dff3629e547d46ccb371d8fdb17ce8afa0dfe403c4d2bbbf3fd53da4ad96983e141df832e0d29672f5bf4548aec959d5ce4a464538c928ecba087fc4e5af3db5ce61b85ae676a1fe8b72a2b7f1f7d57bd4deab6d8baea8153748c14d3795a9a0c20267c252888393b4312fa2487dbe16f1efb6607e09b83e0c3d85738f907878c8f89e13daf0a4f3b377168a49839964c99a3b82fe04b79e2e1b0a94957a889b18d8f86f11e97e2e28ed88218652e0e309cb72fe7d927c84cd35b18baca6d43eae57029e4b987eb8a461b64dc49308dd9f649fbf24988654280ec7131e933008c01e77929f05a83e54cbe342e1cf7b40830e2a106518c9275a20e7c4d67ed9bc7afd807ba3fcda314be9ef405c16ac0c314223745f322decfe432a100097bc13f669b8ba5c8a30f16faf15a6431b86214b3dcbb909688753635b2588b3f0e5136e52d5cbe17361c910f989fe4d3e140adf7ba9b9249a75a6654d6d5e836d009a9daf91714df13c03c6328e8265518a8107726334f59d38b7ac3899de3150e7cf909b40ea03da735a4d55d3f1cb367499720c0a343a4b82cfc98275ae8181da1ff6db1dba888b7f46e14c69cfa02c4dcc99876fb463d2915a63eaff1728266af57865040ebd194d5d9de0d4d3d230d69e61cc1eebc948b744ff3fb0f147149775309f8930dd18fa2e921e7cba6289a33bf324544b5ce160b22b7786c867fcf19cde55ae41071fc7f4ebaa3b7aca59991ace164b97ff9b9d518c845c25640a80de0680788a6d8382a788a0abedff753bd9497be63194c78093df8a94bcbbf806f11ded2589fdedd16431ae866404d555efb454551914222a403ea79ecd4a743a54f43db08944579787115fab86d73c58169d0f5a7a4e1258bda92ba94160f0e14725329d9adfde9f5f143c1dc301a172cec21cda8cfe0f9a1fc7c5373d15711c71dadb82e5897c7a13c5ea854de931e39ec53de3ee8c33be7e87ae97fa2d7feb00f365f29404b2efdb5c607d85ee4df301559cd0242562094f4efbba2b56c6b1efa0fb762bb93a8ca45f4bfa824e915ee23354f54011c539bc84e9fb10fad9a5f2c0efa85ba6773e211ed125ace889c7343b435101c2bf8cea755044b54e469161c2075c0831884f6e89ee290b124b10465985150458f1fcb3ec82891b576b223070cc4c2dde05ea708e7a5959c905d1c80837d147ef416e8cad8ea83e4e14a1fe97639d545e92b44c4783bb6f4343f488ee0a08822f3274a1b762e0fbe636b60e238a48264d25059e36c43920ace9b4fd3c5ceec92bdf3cf1cb939f4179c22ced60aab86880ad5371effe2df7da57c26736be92c9832d1f1a6f31e030d446da9042df72fc194c87806bc71fb3086eea16d91ffcf5727b9ff63a54b7f5dfe09c2d4c19de5c5d3debe24d30745ddc7e8594081ac71708a5e7356312a1bf4933a72822609fe6b52dd5e16a30c8c2e5f8ec7310f72a15e87ac38394585c7a4efd04d91137d48a9bc47d52c84655afd1f6a6e7ab933298c70531adf291ce32c4326e0f6bd4d831b5753cc401bd223f9cf4aad00d3bdc0ef45c1d50683a45c6b37870368d7cdd133e459a407de16d2e9b39023c86f223a4988c631ceeba64053bfc7b8bd2ca68abd53ac1403f23facb484d4fdfe6882bbfdf6d95e12960309ff175f4e4900236fe26ceacadabab156a7acd401eb75667ddd595717d6d6811575b2b6ceac2f757cd6ad8315e8fe2e4d9a15186251a4460cdd357427d3ae5805b4f4ee13ab56d6ab2852ab3be9cd87604552eea8d465304ee9a4fd203c26a1a0a240fd14bfdf93aa6d8c559b8576c9161ca2ba2926bac665744295d86a1216a372451fdbafbf2c0ba0e3c9afb29e4ace08b5ce704fda63477edeabc0597f9b9f037f829755bd5a65b1dad7abb5e1324fbe610d9ba38e975c6573475ddd54395ff7817232fe96fded3c4edb6ebc1baed323d34e104e724a15906151b3502f2133a7468ae17d51ac4d54c03f411da4c1775fce965c310fc7b5a466f0fd2cd76e1d83e55080a09ccc82f9631d3888a687b919be09f4533e5aa8c071c9623d5c3da151af02b56fcc0852187c3e4f46dd850b8f232e11ae5453426e42c68d23db730e6325bbc0cf2efff922430857903404cdb961fede582db9e77f44eb78013e9104482a067121d2a28e63fc012576ccd7b9b401b7ddd0e7416813e35baeeb07aa4581fe9a8570dad7f33e5a6bdc0f053a1b6da0f578842f97ad84ee61f6d00425870b2c6a8bfa915c7e516ffaf7e65553256710637fffeb0d9432da7a628dfa0630063f6b67ae48064b380d0756b1e3920e18248dc4286c7bdfb29442e38f573f18f314d9d22b0772df134efcca3f76b00d3922a57ccbc4777d43e4c2eed2874c8123548008113d55a95da7a768262b3d1ed3ed68558a72c8543fba9d7e8b47971b93cc26fdab277dc1214b22d89729a11babce4f33345ec0cfdcc5192f343567ba58554717c81c0a7c38fe0b998012f15100c60ac99dffb1a014e25ca929f687488ee80cd73f96559cbe1813b0da72a70142748512cd60d81a1395dca83b13569f54593a665e31a30a8384b892f0f473b2634827fa836811574a454c56c175a16fd398ef09caeafc89809fe75f492a7c71445a6fe9d70603f2f52efa6205870e80d94675e5a5f00b7dd8fd3d862f49fab3c994a553b0b46eb749eed638af6d2c879562a3be15498a1e86ae9d54d39b4eb490d4026903676bd013c357e5596cebd27c1abda6702d0d585792cb34d6c56223b228f929bd4b0697c93bf3e4dd913b58d97a32a5254e5510cf74154f210c0ded0dd66b7a37b215256daba07eadd9d0847816da83700b5a451130525ac8e3ebb0ab73612f6118ba6171550ce5ccdbb059d86f92eecfb418cc69b75cf57df237217a66dfb3a0ba1193c7420ed124ec625fa032cd64baacdf0cd57ec4d54a833feaddaf9500fa00eefae19f93957ee404ce151a49abef3e565e8dd8d29fc767dfaaff8731444a68128e7ac84d62ef7e109a50a1b231bbb93d7e5e53e50cfd7e103a52a6ed81e27cc73168cadc0d14ff2d7ef263cbda2fe7500e5c282695f15e36f41427343a80e79e58f4a1d4dd85b2e35bf1f12f4e54e86df0a0b4d7645d41a7fc1d8d0d0f2f863717956151a457d51db562ce83d201cca149b1b60fe10687d1e308651b94db3fb5da67cc37702c15375fc1b211cf508bd893a6c994ab849a52472c272ec06dd3c055f09aba0f6ea2afdf8af998fe606c6e680cd232cf18ba9139569b9e56f0dcd206364db87cf2b03cebb04c1f8377ea3dd8aa87acb78c75d8d7de06d79fb469f0fa90dcff5abc633155c3e32b413bcc1e9bb6926b9be1ccc86f95ddb413119b4d3e4a63a3db2275b12033bdf5e8c26202e34ef0220bfd906dd0e88e8416406b73c3cf2279c36d60b7eb70484034d911a972fccb23f8e71240c2b4dc35820934d7874ae4ea7f632c32ee458fdf382485c28518a6f61ca2ad97a9f5221d364d1d0d77fe9eeb0c945185dbebb9495920b7fe9a2056b7727ae9530d4a72e10ba4f6ca4363105c1f0714f56bea8806e08f81be91a09373799771fd99052fc9ad8513d13109f914d7976b7300258d5600d46473672e367566e9a0f3ad6fefc203d9419d1c44892658b70f7c62fb5264f5eeaf4326f91d5ea98f15837e5fb6f099e0dec981bb44332526f6678fd3cf63fe04c5937a80dc8f4c9e4310462cf94a844ddbec305f85b2dff626b4509fb396398597ed57b5985a4429364f3781bdbcf010c9fde0fead00b5d7f91d1b4f1e745cf447637154859d20f0912a93475ed4a6bc6eb7cede886152c756ee443691086b1a9c891766b28044dfa39eccaae117ab0eb6144d10d4e00a64198ef36a79030b0f3d367ae828912fa277dece79ac2df720ebfaa28246ab01e33ba420b90f617b5030544832ff5a9118d22f32594caabbda2fd64c799df0ed50446b419de1728d1fad81163f3c07745141ad9a88a53f55433fa6a854789e403452967f4a28f519709fc2e94a5217f955eec4329bbf9c4d0d249524b99615c8e483bca78bfaec106e3ebeb00996ce15c9ad63e28ba502d96021a9f8847bbdd184d8c68adb82ce6a11e1a9a6215d175fff33ec911a6fe8c5c1707ceaaab0baf0d8ba9b23c033be69a1816a09c7f0af65f6749c4152c8c9cad9c8543cdea3bd8bca8eee367cee427110c7b2774a793b63a6b984ab5c503c67b3d7cffc56cdf1d0fd65cfb82d8ca54d67232b42074b15eacf46f0983d755a92a6abfe4b0b126426113a32ce7484dff815a931d86eee0fb86b38548acd3512b6896d5d1cc636c900d17ae92725dd67049b23e7831b07e379418a68891a216fa68e7969c3829ec5671ddac210666190d25384fe3da230a02ae9f67312209a3fe8cc6a774880a13d2790de961ca6bcded3569e329d71eb418f44542e20ec65d550012595d0134cdbd9a6c3ed9a480aef3fae54c0c78dee33269056b99d4101766def2e49d2368bc83ef4f9396dbe68efe94ab2089dc7385a7bb70dca2430e28eb9791fff2dd6ba14c05bbd55ff44fcc9d1909b615190d80b42d7f273602566a0e0c0d20201c7302ed9b0b6572963bd8f1291908682741bbae9cf17f995873b89d0690567bd5adbabafc4d0c08f8981c5bccd0f5d7bebccd3f3ead0057d0cf8df6ecec69f5de7ad78b844f7922e843134943c9f42bca10c1d0edb836abe61f48473f827ede588b5edd3d8a238d9e2c143303bb729ee4bd97cf03aeb03c7ec9c0cf895f719e3d857d4a7390580250bdb6671a431a200f0fd0d1acf824e3e5d4c2ea4600c6a9843e574fff6ab7ab01bb2f6882d3d36147873ad1c6638f930431d7c237786d022691b5115fc66422b7f506428b986362b6ed08a7b20d1ea4e33c21d0444ed28a528e8e87774e72a995ec7fbee698800d9f6cfa7da23da0e4cdcaf542f3092a11a89f55049b5abf6fd24945c5871655c16beca54509a36e4ec41673427c3012a19da8425289c40a549572f28a4481771c3b3493cc5a1f3434f198f6260c2944e49e4694f3d409141da6f1fcc9eb66a52f5cae36845c6763ce2ea35dc603aae1c0558acf87640f8e3001dd881820f6ff3d401d06c21e1048df9c80184a0b3c50933f9391ed17805e925d0b103cda83d0fa00e8f5a2ab93c7e33f53291ffaea7c91eff02839af0a66c83558f3f27f3f8b9bf0ab3e22bcc977194f0d3fe0520f0f8b9755f3a67daecc73a8656cef85a0c9e19a63ae22fa0f9043ea25802431155ed41825632feca73832eea9e5412fca8ee28f0f3864f17013a578ca9dbc883d503efd97368a9e22c45e22d750601004e49ffe3968814a1acf0357e3d7f0169bbc09c17adf6b72042303527b5a951ae091326ffc095308e663175cd5180697e24baf9027c8ba0b8ef78b1c811f7f53c55a6e8c18406304a49860036c8c75f6b9cc5525144f4a3de5fd876c0da1ec407e33608231efb1e5495a626c6003269ac8f924fc39bd4458b50140e7a72eab763877e3c4c198c3c6a0292d30e0981fe55fab1655007b8464f93217513b173cfd257d20cb9d5646aa5488a34580eb351e2009a545f50f6340fe8fff4ca58e0a2106660d8cc417f5dfbafef5af82c5ad0bd24a124a296a943d7872dc801201787f518147841d9ef0b02485ac9f9961e8900eca68490c6c848e1fb421e261e2a0945c2a84051f278948073b24c718dfcae45c7fb8bcb0213c9c2c78a22bad390e29b6f16eaa248f770068908a3ba7fc699749a5d562b0ebaa97c81707b044869b981e4d05582ff8505023832dd105e08e9dbcbd342acc682d00f37254a1e2abd40c10217ccb37ba994680bef49da6a838571274f24b87bc0c574962aaa9a99bea819a1ce9bd701e1689bfbe60159740fc6079cddcdfb98136a047ceb9d630c579b948512f291f29a05a5bee9861f52ed8239a27d0bfaac89accb4386ff54b3253ac079b3609dd60d43c1c25341e09f72d97dd72e5a16b060c8f80b0f53c4156a0a68c82f4c3390ef8d354889cb9985d2376230ba593fd73bc6b08c4a2caaccf8ca1381c66a1767a500791a17fa6fd3128a0087b4572ecb7022263337b5798018f312ee045a178f26811f348b353c3fda8cb5fef8e12735f0eb86213f5bc53661621341751dd7bb5bb2c184bec7eefa46e62e1be59d9278a90e2af5c8abce2befcc18ea54b0e85b8127a6cbaa5c5470417417b74641fc3e09e0f0c49a6ea6eeb2ac1c16868d86224193e429086cc1088139d32e95e42a5a6d98e1923f469cfbd6c3ff1270e28cd23e40a6590c11d2acca284dec80033e0efe6784138055310781dad87ba27deae2db0adca781d33adea0ccd760cd58081deb83ccc95d34b40ad9d1f46b88d02b828e94c80e307598594b3f496714b92bad3df92fdb0622f96694ef38d743e5915ff4eb07746d25044222343e34562acf22c36dcb0ffc859b1473f1a6f7f9a7e5dba4e51de0428c72a21dbf6911add11438aa9025b52cd04144428559d65bd99365b91c600066fb20f12022635912358058f21d40d10183c0ca0801d77b950f349b664677dc156765468e098be6e3db8401d868f6318b11300d7ea8293403b48d345ab1fccb5a001b07b96ab4d27c81f0b09f3d8a720d8c8440eef9d394e797575be173a8511d0e8eae46c05e802ba7027d0a832d0bb25a066e3f973cff9787ad78c6ae5fd88cf66e5248f4e324c8f8f42f92efc163e99da04e3185c38eae77a5607a2b920da94efc7110d8d2ea894866b561b4a39d6cdf8e16325769b46c0b6f67430ca2c178b57590004bc8b81b3ccaeb9982b6a98c5b66cc40ce12f8f25110391cc84f347634d021061391366a417a1aee232e1548fc191007ced4b12a36ab8caa722ff91e0fa98c383855fe1fbd10c2bf91c0b91a26a21065572e06fccaf8a974dc44d7a9b7ce5a69763855e849667d51d75029669a4fa87261029286befcf54c46fd3f321de7e826bb302712ce9a1aa4d788827021d5448245f3fb93d143058208b9f8fe590b50beeffc23831071e29cd541ca18ad8fe76225a20f0f81738fca39f42c95a03430ad8f545df20686fea13e81146195adc7b8a6440ffbce76317234fa740fccc59e9a0740e875e11c6698c7c783f7c075a934c3dbe0675d7cbd739cd59b08d798f3c8d04de0f05d8f0a034556cf44c758e47bfb250efbc7fd5b8247ab828c1b94f464df1491e8d1ec2000ba91ca5353955d5368689adf3e4b33cdb5ef74e816815dc3467f23c6d708bf23f651980e80cc3fd7823ec35c0ed230c571ce3014020355305df1793725c4ecd854739416086d3d9e3862d7118a0a7448d00e878ddcd643bb713ffb081c6e83d48f6fa8a3b44686b294538247ac24394736898fc27164cfa1e29999e47afba5c21bcda24f52ae44b8c0bfa149cdbcf2d93db8ba2e297274c9f653224e7a674f66f9118d2f4d780ddc81e690ecfb0fffb0f3414306d727283acb6b5f4992a33230ed487a6814ae8923e7349103373f1f3fafa322556c67dc93cd15003fc55431958271a5917c0cc6e275ab012cc372e8f80c2ec38ef4f811af73270a35859e9cd8319790fe7c14ee18b49b464b758c1d0c8c0bd6c6833b47f28077f81896d14ac1ec30f9b95e8a0d56eaa7a069adb0cae8855d9ea5efd0f65ac8d462264d3b167dd5647803c901a6c023c1b45b226650f867be589a56a0912b15454abcc454d09883a5d394c79b3e90512a85e6e70f1f112ed9c7325f5e8b7b8a71e030a4350404cd6040fff94dc614dd79c8eed74214f72a190e674fd24697f016af27d12cd3e6fa0eac6a39a5215334787d4f16a9be9ce984017e9379b3b1c260f843b140000675653eb751d17d2744552fc9e6d36706ac7195a0324f48a7c02dfec8a4d51e78c51ba820248e6a1cf6193e57d7938e82e0fa45aef221583321c40590caa9b4da621e124207607c5dd44af2f35f872c4ccefbe78e53a375d47a0b4f237ccd47e93210a36292e4065792a22f4dc809714bdf04b347af250ea7816b650453f7f4fce165d76e2b4bf89553585f3137bbfab1f26d256277160588cd7ede965b83220b9a52613d5b1bf0156422bdade80e996af8a2ae027064ec51c57d252e83407fd22f48aa50cdb78e4e9ba136b5305e4209fa4250f36c91d2cef89530810f539b2b6ac035ef8d460a6da98b3674191468868adb2308f35bc53bc58d9c3f5f9f1c17dfccb1110da483a87d6abfbe7f526aa92c610d7da32d3a6d90c0742f1f4bb537b5a513750d5fcd635f7e1b9202299cf66b132c9444ef7b2c2dbd9ec8f557cd654ed853f7f5f7ef45b36e00d4e011125f02e47b18dee35f7d5dd1dfd8d723ee9122d4c749ea42253252e664cb5ea50f65dec7974773bf68bc600bd51208f3dfc3dab372c638f598f9df0b077e515ade242a925aef56e637bdc767ab95b21a20f9c96bc9ba5d0f529042030271892dd30c76733b649cef9acd0c41136b00662501d785c0a2e6b7b9402719c8e5af9cb815f4800a26eb38896a2b700ea4a8ca2e727ebf1c22659de4e7870ebbae10a83f2bef3e94bd1ac034958f0c0bae2c34eb3e17c869845b69150b8bd713483d02aa28cffdf6be62ca5963240a4a5cb990980b73cc173d33743b0e71283cc32f430282d476b767ab853e7ef98237de60ea3b6316a217f5180060fb3b2df2a70197fe4a3deb5eadc07353b4f6c3378618c7af75cc51e8adbd703ed5aa0bbe881871944e8773341a86bbd433aadea0db8ebcd55b7afaea09eafff087e8e251a630b99fd27526465a8d761527a38606c8117fa94866fc9aed279be5610c31ba0f0c3a608bcd7b91688390a17275c66e68fbacf01ab2eb319cb8f9ca5b4aa05e664e94ff8d4a362a26a528295a10c4184c072319c0c3178ee50342704d112f53ed6a0e991f2c9ac55f2a396ca40af5adfcdfd723b8ccec609de9891d41add8d0f5d0e4c60b9eaa472b1321efb4bf5fbaec9104e29dce25886c3fb0962874d92f7898a1e144b8f45a8bc3edfaac4a71e2f7b84a97c7281080da7c9424c8078e80eafcaa7d933b7d18bbd880acd3caded1bfdb8186ea94b5f56ce42621208e58951381a8bc65101057a97ce4386a89d16e108cea27464f1c99499c78083931ba00207d681c15d0d156e93a1e1fee197cb1421d6d872089583c27cddc182d9a487afb3fbacecdc1a50c5be410989c8864e47a3ffcee8349ae1fa1b31ff11c4149aaf04b4953e1d938f0fc2572def14cf21aca7c488a54aa938dd0d38e98d05a6f34fb33e2960df5f164f8f328b4c0517a8e2e1a1a6d45623478a1ad8f6a2e4065f0ab3783e0c220ad7f984047d315a5abfccada7a4407a1a34d68944ed22163414da24e74d029bfc1adefa51d1f4b8fc52aa4205d0057e63be6669b8beff2885a937aef526948c04d2cf42ee3fdefa3eff1f1989c7878d91f3af440b3bd04f82455ee4feb5bc104fe05a61a90de721bb45732d85111955ba82fe5c229cfb7c78858d1e199df00b934d3a15c2878c7efdc63b745f2b57e76061d8c7f1a1c72e4eb26ac0efb1c6f2d6633573d6e261cd8236185270c5a0897927870f51cd9ac29471f6b34dfa59b09a2a71bb0cf9f0a42911ccc73413d2f1dc5b17a57573a135ad5ea30eab645fbe820d34a652b8bb48104c6b90c1a80744a0b8d3fa5310594e12c9df72559f65a6dac1728d14a435d0bfb469eb4bd819761a223d681a0c85d707e9b1f58dabe998a041931767a5ba5d55b6e4e06f1b870f7d6fee4147e790b8cc44adb08e48cecbb63933e7f5942163ff6354cee92c625af6f1beebfc4bf18b8b96d301e6881a5ab1cfe5c6ae49b6fc37b184d264c9957435350a1a5bf0f0b01f5e927790f988bd0ee0e1123907bd41ad21dbd2a701988a60f75205d998aace4abd84ad423029e67f5040e3b9ed9d27caae762080e9d8b7cf418793aa70dafb182f6494a309e74c1890cfd943abed65c4b887b43fb692f343aa645137921d21d549b97abc54a7c343bf1190f8d1772d1376ecbfef5aa1c7d87a0b70eb9873d6e395616c447e2c7adfe904bb627a1a8e3951fb7f24aa72589d23dc4b534207239b22b0972fbf60d3886a209b0b35bc17c71c805896921056d910281254c6dee09c36380da2d3727a93de2781ad50d4863af173f105ec0809b3bda10d0ecee4c17684acb478ea9f3a19968769fafd6bb47b2620999958c1d58837e3a4269254ce4788bf23c6f97d741d80b0d779d3337904917436639b2ce5cceba7569bb2b5de9db54ee92e1bc2fcf8db27fd399564d161e1776d42c3a383b510ba2295be2377878ece866220adc04e74f6237fb364af409cc6c5bbad376ee84e77a0c68dcce0a4d94828f3b776e9c5af780c363c173d544ccd4a061934613d1f17b2e62b7e1d2cee5d4d8517ab2b29f8207580600a993269855acb8483cc3207c1cef84a2b1b84d58f62b4036f30641a0f2ebb40d9b8ebaab95c292ebd45d2034a3fca96a05d190adb84986c5705e73cd0d8450e5c289fcb911e4c994ed67fcd92e55c87123ad2b845190580526d26b62790f8b43c7b860939b8b5ee751959e3c333ab2550f24e4a90b943992080460f1abe65586fed5139313ca20ab80d02f667be6305a157118f719d5b07bfc9f49781b2fdf3e1372b0ca5c4aaa3aca2f9373c1b91b1dc6ae5b385c76fc12e89b4c65ec7206e00db063f77c1c555bab2462912ed64faa6c6f74ebf455a829f4f5908ecb2584185d057eb55829eae5c44825d3ea562be300271e9f09880caeacae974671576ca45b5a1da78be3fdc1147fe45f802ab49670291d0a7677d592081c590308d46e798daf5b5bd2c52b1adae61128b7607a5d693160773a55c9237f7252b1a0384fc888275bb8a5d585afec8f4b03c5674c170c031e638245ec3a9053c096e2bab6a0de07290dd4a2b52b9f846efc2445acd8f6200fc57caae2a4bf20b3fc176a7dce76b05da0e1e5f743fcab0f5ebac92194fc77d14da76910b873533ba1238eb21d28f7768b273bb716557405fc8c7ebbbccdc0cd7e521b918ca50485c8c7aab012f4cb764dc0e19ce690a9693438831fb227990b984eafcb370354135edb4416afb920e2c4fe0d02a235b991493bd237c9b20d8d389626c74553e3b30164d7fd7f3cfb159ca5e6944510f8cee912e921fde2c91d4c7e84fe92687f66cd750ea42ddd6b5ea1a83f622538523c72321eb88119887d9e34ac610545514b58c004b8d8aef521f83cca1ac91f6fcfc78bfb9f85583a3e8804757d0384c5abcde34d3a202e699ca634b9cd05339b1cebf345581320106b912075610e9a392b0d27e46315eb8a15aa3842e93384074c139b34f3008903025e5331b3458b545d5fb5007fb94dcdb733d5ba52032972b38d5e3a7f28e72400737f4b63f84981807709e727cb26b4fecb271a68fca6af2aff1fb71c53f95bbfcbede49db8bd37fe0f7f5ce5e5bbc3b622fb18cf6e6785679eddc7788a4e1058498e563c16af196842f8f4ef41bb337974aa428e80b41402154de8f032aaddf0cc964f34926f88e8bc4ff030960f5235c2f3b42bf0d9de1466fa34c1b04dfc51932d96a92ae1d0fd03d315093d328789000bc49ea94597fdb6522e25963241e6bce488b95630e5de94c671abd5fa48cb5162c898123faf8c95bc45daf0a12ee8e8f142af3297bb5f43ded297b2292f334fb6afd5ba12bf8d80f97fda74be5698c008e7716286835be258bff0d543efabf8cae19f34e257016476211112fb744bf83c94bd68e704ae4f836410a092679841b5341ea87e205b89130e657e7778850fc910b8849f0d2c453d85db690069f26601c5118240925751e33a2a4dd9e5a65baa4b0e9071efbd4f47b97dcad8b9db9462fdb496372c4b885d28497e03e533f4d0c1603da7d5662230c4ae7b7c0ec2107db9d24b797e18be91d79b2cd50c969f9605ba770975fada344221bf60aa1b1b6d407d8a864ed90368807c914cfe12c515d04b76a6486e4f6c45bb4b9fa46ea191294bbba5d11bc60c27a63cdace6a288b7ee64d9fbd4a2f42d4a14c1f9d4aea89a1f8787327101b27e925d6a3afed1b03efd05e055f918d5f8b0dad60c05b55414619f1b5e1a0f27e307c0df4afefaf6ade1ab6b59d9c3a99b3cb34003946dd6829b354896aec0298d54181b2d1b7fbedc9de2d5cca06bb61696c789459ca788965a1c9519c9512971132e79716328a4c9b208418d109302c34e900b3f56a0b422751a9bf7025c8f8b89f98426751850b6ec2e857e5964429e06b8e1a6b52b592b675e4fc0896cfa29762e717df3dd58ca3409dbfb71069038c2396e052aa500ee99a52f2e5688d96995cd4e535dea2351f7bfcd473543feb96c5b2d0e7340be25632a3a110f599c01710d1a78e54c399966a69dc4bef30a4fdbb0b973ddea32f13e78637333171894b88c32c11d20a7feb847c00ff6736c86dc390a135002b87c4ee5472219b9e1de8cc47dcf77456e4fc968d7947732cde4dd194c79104ffcca99baca8ad413e9d961321f9f86f03839231dcefca5405280f0820cec0871f0c98e5d9e64bc70de98c37533bf207d9d060259390d1d0798571d0c5a9941c0b789b5119253f00bca4f59bd5ec8fb578ed487b81df7dbeb30d94f06d0b1e834cac845d352bc7adf3175316ffde5275a70f7f9e6e3981b8aa8c2f477dd9546f5b61b613bc326724bd157caaa61ce7b8f0828c570569dfa611553384716b5cbe18556f2a83f5f294a06edad43457d93f8b2a8c0d88ba8e447109d27e69010ecec665bca4b5a7920dfdd9829771a04e6c186db2239771886c8cec03e3a76d22598e0c921f661f04c3a46e30d3daa7aa2658ad9458e6e4395ab8c6be490c994d5cd621b70a75ecf87d58ecc647b9c66747b417016033431a25235b09f979bcfa58d2fd1e536797eb67bf1c88c4f13f2ca995da4ada7058918021a63dea1e95c7f8ef6bf2fd080f0d8a59cdea2a854f8392bbc17d9d058f8be8dc58749dd3f4b89ea17f4461d987b62376cccfc0f29b3dff742d1519a7cb072b12553396fcccb6a75f6302d876f8f5d5d47835583ad9783f73e93bb84faac4dcbe689c5d004cf43a742f310dc86e4cc6cb98783e1f3d6e6e5677802e94b815f307ef00bc9424c957a9e201d94ec7614b72449f400fbce1bc9481aa2f76ca2ac68b65172442e16da1162a69261357afa1579ddc34b1c92d889bdd48ccdc8dc4cec04da28c5b24ce1c6f53ecc1399fa01825d427e78b265958ed5534bb33efd48c4937a425c5f66964f4f03973be5aed1008a5b53eebe8ff88a3894d40b5eeb87e90301b8fdc11ff871565efd16208e9a37f91c441f03adb676cd0da5028021e5fb06d605eb5e3302fa8a26b2ddb41398ea04c0c041e37b15113a4ec78092079fc3cacb2fd1323f404b8222c599a8078381d39809c806a513e481f6115531be1943202e3cab577f9cf995f29a00040ed19d6f1d95592f0d45248565e4c69800f007cf5b4e82d7453ddcef76163d9e0aafc6723123900421c98b3df678b7835d616a19c37d78cca5ec835fe7f869b5386e2fa8ca1306650146b0a73ed88e7962086295b2e1b8cb51d3921c18591afe46d3d49598cc26c910fe1f9328e4cb86674cea954d521c7da14e173674dd23513340c52e88f581d2af85c2803692c22a79e9183e6d761273c2bff1be4438c1ee85362c7c8974ca30386fd3d663624406742695569235321e8bf1d28e783e40325b1d2ff15d6d771743f45d118e5eadee9817f520dd4048067f8c89f9e89c25e12856d625befe9eca4a5dcdf67d82d224d987ab747fbb76563612be506225d125bdd05309131f85c1c9e45d7439f627d783f99851c0f8233d4231e07be97900c68db23b67dc9770e7bdf9fb459993d2a6f8c1ee0496cddac275a539fa233e8aa4fef8649b0ba3ad3a27132920ff11e721a98f11478e0cd092bbba5af870b7af7463e300f76608c2251c7b2a64d97d9925dffb80936a1071369f40facba4edb601cc58d034d13f836a15966e892d4e04b5c8958724d26b99a7a1435a4d0886b8931c1ddad80868fea6301bc4f899162f7b5ef92512a00b3c79d4d04b30850acb0f96fd514be40d1149193725257a69213dd099026b78aba67a49139365574801707cf1166ad066f50ad4464036a9a92845a30d859a503d5150ea24aae2abfaf6f17d4251926d95284b0d07583453577ddaab2eac8ff9949518216987e00d16a3740813f0cd907eac30ec8685e59e6bf18b9526c2c581ec4f6920930c4e3374288dc64ef4db69452ca94640a1b09cb070108a9af144ebb42e40430d8a20b2598e2073ee801a441128d0a4cc423a8a54054c0015012a44027778105322eb3ba30c44d5d6671210b26a8ed35e49e55b0971354ec45832bb458620a2b2fb3b478c19482162eb0a9295a9820d3620a4898c2c2228a165aec904aaed4020457ca4fcd1c61719485fb5947e20243d822064d24010928b000ce601e019738c2c251d18f91280c41051325289283a3a19d9d23748ed8c9c97aa741d03ccdc3f3c5db90461a23844c1eeb971d431bfe90eb2517367422720c1dc2e89099e7cb91413a5a3a9ee808d271041d2d1dad268a1cc618638c7436e7edf365cf16c3af5994b1b93df81107d83737db27e703d46edcdd00f44a7787eca5f893a390e8f61139747dfae0eeda8d7f779d9088d24927a52ea7006df8cbc9c5f6808ab0bae0e4629d4d788940a2f67cb6b397fcbbc855d87d7bfc330a2d23567809f6e3a03a448b0618c3c08844e4f87abd8a9c776bcc742f3429973802fb79b75d6accb8700d67edd516117a4848fa91eb4e640f4ded8685b8724a29a31f89d147e047a41f91b208c6f17d5929c27e2fb7fb6bccbcd895c8b113ecc758d8ef6f7f845d032c7261b93d936daf6be62e85db8c65aa405f9e72c149159c408ce5e4fa37c1b831cd0a47aca3d6155834c25e114eb1e48a758a1f2805b6473969bd4858663a994e3b45a680724f1a84f084aa11c0944065700b4cee8a16637cb20520b0b4b0b46ce10a5b88d2e2d2e2327d34232e2997947ca25483d48bd48bf9840aa0cb305ec0a0e2095488e04a020c150cd511239ddb9f5171448591a5820aaa2ccbb24cf56214543726d048e8856cdbb6ed8518465a882123868c295224c1945099c42549a412198f8c97f153984c098a53a6b8dc1e0a85423da7445c298285858585ebaa60822971717171e966d42ce8c58b172f66c0540145a552a960685cb1566104abd0028618608801b5a42651ad0762c864c890212306af46212fc68b9172fbb3283119e4aca8e2727b3366cc98210300aca84283060d1a00f0899b11502b81cc0c32334c613405152a153d36a0e282196ccc60a3c89423ad091b333666e21095d60c0d3334502e5c2eb3a810d110001a0240e50a1320714508ec1001a82100580df10a15d470a3861a2a1556eb0a262edbb061c3c68d1b538ad420016434d040030d021080d191aa2901624334386868ae9dec0a2e5ca1051c36e0c081c50eea320b0b12d85063830d1912322c80ea94245870e0c56516163e35396a726490e3674db24c164ac412a4b22852b130ba5f8645156e7f86051472dc902387918f51122a43bfa2e4061c6eb8c1e77e19eb8a1e4c2b44160e19841cc40107ed46b20ccb6c618776c15a1144a222940551164eb8b20806042cb3ac4872bf8c6545129e8511ae8e2c478e1c3974e8682902071c70c021871c5892c821871cae1ca28d8d76e31d841101cbac2a86ae58b5cbaca39f9912b30c7740b61862b98914299774b98994a1cb4da4b42e37911274b9891426f78b4da4d0e09a2e3791a2c4855d10985605ed0a55aa707b4f8a30cc072fc7bb1032778c30ca920ac8fd1270615761bed44f17f6cb5ab03dc6286fe24bcd479cda4dfca9f9a054f3112f129669a5cd9a4ea815961697d40b18aa171bb2e53490875148b256d40ed03bb2d61631a2982128a846a6a686f6fc5706e1fb730080d7b94e866e46cc0c18cf058646143104b10b0d1860587d3089218fe9afa969f438ae9f9cb05ce650ad73e8c49a435e8bd683744fac2a04430c1c85fb9d583484b2560dcce5c7bc981931a4eecae895ce6b487baedd4cc0080342f4d3ab3b3969af8afa021a814560111964000037c44a5501801a199fa2b0d767ad1a32ffe2c4ba645cfe13142ce37e27d68909b74f51c4dc4ca83dd9029919a288111484924866b0f1828d9997998cb94675f9311a029031d7c0b858f6dcc40f31b418388087ea0b1f78e01a6ab891729755cb8a86850b9a8cb966e5320d3687ae3984bafcf30a4c0379261517eb6616590bf21ca0779c581ee35b18d19bd241810d354cb8df1c6acd2b642dfe160fed39b166b0b810801a6ec0c174430038e8b0ab6ca5ddd0a7d1c10f235cd1e7af3083abeb396ba1ae8973cc2168a36bdc00f519fe554facf67a0ecd29e0b021b38126803c5cbafc1009a6c96012b7b3d61c228a320482275c7ed904ce0177a08d6639cd89d52756c6ba7d7292b5e0ce0741a0438776135f87e6235eff1c6ca2b85fd6d2823226409e28975f42e955ecd5279570f925123847c68236bac64fac53089cdceff484e73ac95830c709886df49f9a745f0604ef4e2cda9383cd15b2a1a116176c2e14f0b2a06031116ec63bae1b70e0e061c3d24187f6838306c023ab376678447e49a5eed5bc9b1e9967d89f826e9f58a7272c6304ee14746a5d1e4eac2664b41ef1ba6482858ff1c86eb2199c27770e39b942b7a17031876e9fae894908b2965006c58776133fba7c171f9609c189750a6aefc6bb9313da848f1fac6559cb63fa858c382b2a72f961f4405d171f24a7208ff1181e9ac85a4e7362794cbf67ad136b06ad878d7b0acae2c4b2325a0c6ac52140130008047282e2c43a35619aacc5d9a9083783d2840ed90c0d366690a901001962bc1860a00133a3e35e468c175e54305ea45c5a585650a799d4d53854f153643e7dc935fe4cc3062ebf2c42a7f734dc7e189f34bab1230911c1c2ffa491633fdefd0218d0f8f37bf7108605b6c2864354a791f37907ffe42ac9080bb518588f31c23a4def6887ed0d8170fdca0a6946793d5db9b92aa5dd4baabdfed48cbcf1107630dad7f0da6b3f01063babde19f4945d7158e47a17d96343ff41ed958d196c8e60bb0c2761ddbb95f6aced55bc90617ce9151a761b8fd1a1639aa178d7bb1f52b0f0bd2bc3858e839bb9e1023b03dfff47f34862b3daab98da2b1b747a4b27fc742f3cc7328889a2208fce97a0253f3f3c4744c0040941404fe840a78b23a3a29450cbc2f079a18869a03c48e8c4c82286d14f1354076b052951a2841322a22265c847c8c7c767becf13232b6218f120813a51cfb4c8a3b36385510c23247850318c4e318c680c238f61946995a52314a4b3e9f8c0f8513224a462f908f9744566f7b2491384583e429cceff0b3486910f168a242b484827288827fba2a32a4241423d413a528a8a74a41415c5e0117ae1c8a7a84887548574443a7a7284a487e788085aac18314e5447a7093e4f6802510ba0ff452848e888be48b9b4b0aca05e74feddc10d5c7fd8cd4e04d7df2fec846019ff22db1ffd6bf88debcf2c2e40b90e5b13c913401b787299d585255d6881c442af1a0e61612c293016f3773f8d62fb6d3c87fedcd80c039b69158b59c787e9b1d1f27f1a70277c08770231a6ecb6fb5e6ed70984c42f999d2b97ca6eb044d88f5b1fb378f05ab354ca5a6ea25e6511de185dca80b93956292547b9753e119194539043574e01da90121231333373b700e3c66ae0b8c1c3b58485ee5dbd39332818f21fb0485f7239a91b61129ede895d24b69178444516492971288a6c492831c88964229f883fd795b4e70f91b4e74962ecba278504490f122447901c51c508fb817e7339a9cbec0fd988a9c42222a128de7ac272c2ef70c9f56124d795803cf0487bda8dbcdcb50eb6d2dfd9f6e27c55e469cf55b103226febb4e71fe459e1d1699e2cdc7d2c24bd204667ee9b6166be91099dcec12531323b333bbc6c5f207d2c8c54d83a040be50d341296d1595b5a8691e69c734e9d1e1f1d219d1d9e961248a0c4e0da40a5f304423c516c008acb87557a6fe692e44f7a55213ca6d47d55cb7c803a7c74d1fad775d1c07eb0a7a7214f8f843a4a6ec31fb8b3048621b95060b32a8412688413ec077b749218d1732131826bf8b66761d8abef83d3c01e8fe917126221efd6873e5cf9407aaed7b2aee782b97501573e7b95d20e494f7b4aecd8979e14111642121418c3c4f7987ec83c63c3e3870e3c4016acd18f63e67effd701376e2bb11fac10422827434e08d3c0c21ee883e9b4507b3b9007b694b80da1c8e0225d3c3a1ddce1b1b0d5e2114513ec07a3803a300a2a39f8d31ed4813a0c7518ea305c12a47387324802417c7ac476ad17841f1121f48215427768a3563987667c2cfa1138236b42e00dac2c6394d163138a3eabf6275f8ac4d744df10e9d745baaeeb35d031b4715df3794e2a995fcacb8ff045b33abf9aca6c0ecc3d1263c7eecea979755f75778eac841d0bff5bb1760515dda14bd932727f6b9552fe57a17c2859967afec4f8f2a57c223594745520c0c040223d897a1eb031c6954a3520412e0d67e5069191e4693757576304366bafbb9dbdf8174719632fbef51863fcd87df2a7a51a1007d2000ee76f108d4eff2af463d247dff8305ce3daedff665c7e8e73680cc335d8f304fa685cfe946d18a04b1f083eb8f5190876679ee3c03133e379ffa914f59a812ee907b7e260112391ae0e6eeca1565672aee3acc058df1f46ede8cf97516a38d29932c69ebf759a8d63fcfb61607b271d30359cbfde556f1859968c484b6cf0599ebd3ff65cfa2f5eadd47df676d6611af651f3a1fdc4b01b4c3362bf999630bda219c618863d3c02e680f131cf32229aa6699daaf441b4f72f69efafbd7fcc2ebc5889fb22c9895c8ccbc92e893ee4be78e957d7a074024f91a327474c2e17782e57b9ccda820a77fb7eb8dff50cf3f5d09d8f955803c2aab0bf9ef412333dc61c499ab8ccc86a3e4c3de40fe96b320db9a6cef4b39a3a558ded5d36f6aa94558e8bf56b7bf3b976597b38b0f04ecba94ccf2ad3cbcb4737de8bc4db9bbef498d46e4adbc7ad542a99ba52f7fd70bfd2e7a4eef6360d448493cb40433cb93397818650e296b6af5fdfd4717bb6fbe2adddf7438a6a37b55399bc4b65fad6b0af5c8953d5e754f5374e35a1b0d1963a55e9af276d9daa24447bd79bbad8def5f111c65100def86387dcafbeb5a5c7b4daa9ea7ff172a7aa1d1079ebd7aec4f1c56d8f45c1478aa3cbeaa23e46edf6f6b957f6eb13ddf9a5afa4ffb26b7aee784ddd57b7ae96ea47cd87e9b7b7e915971e8b0273f02d3d0fc6a4c0867a55da4c1c44d2de7ccbc124edcd6feda6d4f1803c17ab1907adb437a1cf06ec075b77fe077fba927efef46a49afb0c76a76711fd4b9d7dbf0e8d5f59094ddab8bdcebe6c26a8691be6230db3e22377b87d6daf7c1d7762ad307b19b0dac0ac77e7deb999ef444eef525ee1b724bbf7126ce725fbd5789c82d7139d9d5b0bfb82f5ecca63da67f5d3a10b96a67d01291e50062fe909921b1d7cbc761e334cc92f4e5f7509d86c80ef9d653fe4e1377c8f7b8a612ede0bfd4860a74250fe14a1a3846dec0a8dd50a8cdb08cfc6b047686dd61dc5139be93e34b7dc00b73d42297dfe39ae6a12730e9544a2692caa7d2e9f46f7777a793cef93ee753fff9e5644d291329a9a4524aca4452399d98745276ea4ea5ecf9b911c2f8f67bd5abee0b7b680f32275932f394d35e4a7f4ac94a2c430821a437b01eb01fd4b9b02fecdc5fcea79c1097913bc93fad9473525a2bbca037778973c49b23887ae58eee1281fde2850e6019f8f0e74a220b2642948b7831e1c090c844886ac14e33afc85a0ff3af0e0393fec54dad07520fd7cf0e03b63504501cb8039b5cf5180bdb54fa2c709965ba0986b1d3d4671257ffe2e8f5b4c340ea5200e96b8701d2017847f51818d87e12ef907207e578c7e47807c7dfc19a0164e70dabc0b8573cddbdd33ccd739bd53c53f44eaa566b7352311b6a9d8c289b424694115ded48eb644419111618173d77f70d9130ed9227f6c49ec8137be8114c06394dfdeeeee2d86362178bb806a5e3898e201dad9b43111d413a5a938aa1a124373e2b5900d7f4e553915c4a2e25f78a52915c4ab28849810ddd8c071bba02169ba67e59ecbe9c8cdb97b033710232894c2e2ce208994c2d6039d2e8caef20a1d8ce2c28b77fdab4e29c1ab83e7f36842c8792b3118a32468fcc12ba0ca463d3d26ea210b1dd3d42f6924f27393c7429b97c2a926b894bc9a5240401cd0373c0d4671b1add66996e1e8750dc767777166cc234b163fa3b2bc26dd9718ffda093a09ecec1a1f67cd819bbcd72cdd717c3400e48046df863dd57812bff13e24a965b0e4a69cf9f66ace3e4521cfad11f126ddd97b25a97755fdf0f12b509ae4b0999a67938c65f22c15e93b87eb10e16b14c8ffd9a874772973e22245804448499849fe301d96eece010eb32f4d2a7810bbf915c4e70064f8fe24e8fa19eb59b130a853a3d24e23e6884329dbe3dffd19e1094f6fc4fa7200630f1b9a647491174591e056484d145d5ac084f9deb1f4ccd509ca482b17613a75839d43abda75e1899dc63fc51a8ee93429a01509d8c72ea644beb810d128bb4e73f045eafd29ed6031be4f443e045fd89932cf9447bda13d94cf50a756451a86885fdde0885eaa493f6fc7354f7e540230fd5f957ed0655b36065918494881671cde9e1a55838bd772a93d57640fde9d4a94c74a857aad3763afde974ea74a8c2a2fcbb876b4eef8fa138ac66c1aefce93f69f4924aaf50ef2f8fb8c6f4fe988983576ae12f8d7a65ea542c256d07d49b4c9d8a451af54a65fad7341cd4b3742a5307c4bba6377530edb9c9a9b4e78fe27468cf39be6e847a4771720acb18b1cc14fbb9d1752023862e5fd46359f6c274513bbeeba2500f59bb41791639d46fdcd7777b378aa8cebe4db77ce4ecb3867a9b76a35e39e9d5ca7beafd652bcbb4f7234a057b7a23aee9eb3264a4529669ba87e950af4eef4f897ae5f2fedcc261278eaf0b176fcb43cda5a5cbf1eee9b113672f66ca62af50cf5d5c140a8542a11e328d34e2187f14ea3187b0dd5756fec4c19be2bcc863fc4bcfc2754f7b8e9256304df770f770719dde95ceb521d8d3afbc1bf58ae5fdb9afaf3d4e43873cc69fa59346edf90f914c74e8facb13d8531704f5a75fe93ed49b507f42713de06596313d0633d4a933d9eecbae031135eecb32ee9350ae3fd63d40c44b1aaddccf8d8c8080ceb18b3f9c8677f85b67e91625b8bbd7b8fd35daab32ad6dcfe767377c8c3df64ba5b8868abbf8021db22b3b3f82714353c6d0b20c078cdcef05a8082af74bbdb0896be06d7b19a808231d024cdb22628199b1e0491863640216038481f96366261d413aa2c27c7586ec2647bfcab862905ec05e329506a3f4624b5997daab96da2bf99fbbbbfcdcdd512b2b2896538bc9c5a6b61725189a2a7bc15e20c5b864d4a7dcece48c08e3341a06184316030c5e89458a1a356ad4f86eb8d6abf134cdef6c6f2273363ffa485729fdd9930fe502e0cb54b37440ec00f680f6fa17d05ebf17e13bf089261bf8814fdcfef6f941097393224130c9ed26a0cf6d2aebbc5230e54f71dc2fe5fd907af6be39a4bdfe9cf6fa7f80da0ef2e70773e3b3bfac4184530dc8056eec1f26cb1d1f9c460823edf5db60fddbca2ec8cb2ec2277aa5037bc1faa4fb2ebe9eaf8e67f7a55c42f8f409cb0ffddde37fcecccc3eb4078fc06aaf60566b7f8d957b87b92e15b995ac063e0cb1c06033aff87a9fc046f6cbab10ac5fd775c99c1beef5d12f87698fe3eaf2f8feed79b6698cd02762eba28b2ebad8519f8d5ccf95e31d5e0c1773182e16695c987b71534300efa8332e46bb8b55ee62d75f8c24e362588c8b652f5c4c7bb95869837131fbe262a6d4c54ea8968bad508e8809f827048b8653af632c2da88bb99c2e96325dec058ced62aad2c55eb48bbd905d2c06763119a48bfd7531ae9b312f06232f460306bf580c59ed8bc5c4e07925efa2644fc6f83e5bee5ec335ed3980104258e3ee0e6f8c32f322943d3ab20c942c03610cfc18a9960b9f61cc57ba4b30207c700f06848f76089dbbee8bed3d13812cc39265f8eb1429d10893021794524a83d0ba82d0846aa403538c48c12490912bc85635023d429d0540a20a5014431455f1e4063d5305f327890ca8125396f0000c7c8a60032d302104104820212021814004246203212c566082244160c207f007a88821603c20234fb8d865202359dcef67a6124454230cb3179d9cec8827d82a2c1160b10a7bd73c9488d6691d23774e9f39a98c08f300fc814be08f89dbe3eeba6f883361e2041320e84cfea9939312824dcba74dcb46c80749e01f52d73d2775ddf926673a601245a11e7eb4e74ffc4ed60d3337da8349bdf480ccad0191777693ab442ab121121541d011a423a885e839a994524a1dad6e26f1086da422a12ab05f0e0fcdd97d35c9fd72b24bc9a5640ad8116928812a451190911f5216b92fbba567ed4926926600ec6aa4c748da0da9f4364d3295380ccb58c3c9befaf623f7c52fbba492e94bd7d7d7de24bf6a3eb4a78f951e1e41b59b12ccb415cba57ee3361e58f8da974ab1c4fe559276038f8036fa2b8494e348040b77ba8f08d4649c4bc054fc309fcd386e61bf68613ef943c4558aa552257b7e28d42b8fd2ab6ba857b535c48ec35c7fb134f06805df57e8bf4b11721ab8633ef7cbe755ee8c46ee9c4f5f567a4564a53dd81a852def06915c8a118f12e4343ee431dd05dde942dea9e8d5611e656a3ee8c53a176a6f3e1027b0f5af3f9acd339ff9681ed1cb8f0d5d4577fe6782ec3f03a459e47ae4342ee431f3e79190d78bd12ce5bd65f78ffe18e59a31d7400c6a379565e2b37675d3947942f33d9f71fec5bd0bb913fc09ec51609aedb5ffb6fbb950e93f97ea429463ea571bf54b5c7d8dab1829ab9c7ffdeb8a97d7d6fcfafaee52d3a1c7dfcba9a4ad7d00ab62a97453b6d235dabef48aeb8d1b22cc8d7f55c8b77637b4df8a424a9429224fe4893d52f0c7666a04c1421dd8e342b8108e0187ef83c6d23e40264e98c04106d7ff13c0e567c1f5ff642e0bc58627a0f10383aebbbbbbbbbbbbe3709a0af0ecc00d48c82e88f47061c5149258a1040750007700f48111007d608705d401d69dffb792be92be6218466b2369cf6bac8da4dba7934061915c277de51abefe3ffc224dd6608c0fb9a6c215fdf8195cd58f1b0f2cad1827640294a4a24feae8531e5def748cc720cb3efe2c61f2c344675cf778cccf12d23b648225a524e9fe9587f622a93aacacec083fd71f3b4ad9d08ff423fdc80028a494861373657dc835d7d78f197d29715a0a9980d476884f553285139f762a69d39eff4b7b42e0adb5e3517d7a1564bebc6ae5ae5a6b7dd93abdd33cedfdc07e8d2449af3ed9489a05d51f736d8718abfcc1e9c0437bad53cadacb1c661d4b1f913ec2edf1e8558df69ce687f71fe44174c7ceff54a4ef54a40e88379f83bc957864fbe1cf358daea41416394df754d3ca09939af62cdab3a058e2d3f8343e9d4fe96bf4b5c75ec85c9ee5858bcbb7d4873b552e23e13290079eb8180caff5c062f0603a8e43fd0b1696d75a980c0d08d4b4181a0ecb6b9485be4665c81ab67caa0546ea5b6070f0ca98e1e2fe63bcf0028c78297d4829a5dc8bec535a8fecb7c764c8bac753296b5373a875e57ff3079b58e01a21d0a82835d42ba25e15b96840e25314eac5a37e42e9d5a74da15e05d166ab571a10489f85e3bba2e1684f9f35178d8bedb13ccb63f3c76960d18fd3f08eaa99b41ecd92fa96d47ff4617c10fa2e5ca37af951065cc3f2f231169687f194e5552cefe2f22c8f75c6c2f26cd3aa2060aa53098137fb20e24dbd90eda69e85e553a977c835106a3cb0db85d1e7e2c07eb187e5b1196d49cf8e941b3ff5a92e08b8510aa3fb5ebc789717f45de863316361f9d67058dee5610881b7e559b820e06df9e6e955d67d2f3e6379a9f908d2f243e075f9173d57b6743dbd4a755f8b12bd72e982b4bccbcb2fb9bca6e1b4b8d09041aee91124fb21f03ea72db9b41dd8af757ca2cff5f2a3925e05815f81ccaf9f693818d60e197371e9b8bd96eea23f6957db63e954f4f97e39339e9d34563aca726991f614a318fd12c5a2ccaf288e6f66e22cf7ddd8b821f0c6afdc373f70e597264faf747ab5337fa6954c346eeeb08cfcf9e334f3031c23ff05299824b8f2ebfcb992d4f930894ada93b48b3eed499f2bbf7ba47c28a5575e7b45b3fbaafc2aab4a453b20def56ebc703ea5b4d68e69cecc9c2e905b029b8fd56a6d2af5efe1b86149ef7f43c389b938da7387d0b3b0e1f1634ab1d9377383c0ff78b81ffcfaa357feb40be24fa2dc0f1b8985e56bd3de7c1c6d87eba953295f66b43d0b12247a438eb224bba7188908919b71dfccbdb821f03ad6351784d4fd686f3e8ff6a6fb8ff60e303377af37d7ffe815f41eb00bfa3ef8d24e453f08a9f327727b686f6e61a77d1e3f74da9b3d74ccfc2c5b5979798181694123edcde7a1bd0979b023b094d65adba978b85fcecc0d76753cb4e7ffe36fe6ddecb969524720b96c84cb401d685d0c6a3ee2bdaeb7dde75dbf69a5aee396fc527d393424bfb47d8908fb9275e56f451cf173ed958fa9b2d82b15df4fbb579665d947e4e5450bcbcacac9644afd0b2b4d254ec8664b266d8752a9547ad6704a5fb272d380589cadc36064d6da6ddbecb6f9ddb8da9ef70fecc7413af4eadb78e01ad4fbe39c7ee33e08afad75430501efd69db86f2b6940eccb4e761827b76d7bcc3310638f7985ccbe7d55387e4bafc2f1fb5de096ba7ae165e77468bf97ac41fa0fe67bb9d7737f2bf7fa8c54bb8b3362af9f44f7e3a052e94bda4d49eb417ba8d5df445dd4a597ef9d6adba1f45276aaad877aa5ca349cd26f9e273f08786557a357dff6a6f720dbcbf7ef164903029b58a175ad7d7969385b6caff492c352d7fb75fd6769dcebb5c76264d7f5d8c6f52d69404a57e26c5776a9be5facb3aa3dd484c09bb1ccf51a0fac7cf8da13a54d03b25df9d8c67940c9652d5c063a8275b11899d603fbc11b4446a63d61e17ff64b3f04de20dc5ee9e1635c43e63859ba2eef2ed5eecb40ad928b4da794b2c3b0868cc592a9f496abed5d1a0744c48878b85fed705cf86d8232bac0e0bbf30defdcdda711ebcfeeee1f0f3767e6f6bb73c7449a33e3f026b617b7b0fe50a414b9d8263d631a766fe686ad9994cb4ed3bd73fb2394325b89db4f9344b945aed74adaebae7d62908591e5343bb430d2317c7768b1d31eb36e7ffc894bfe4ad979ed15b93dc0629c692f42f8cc2c65c75fbd3772662e3f8e1bb55a9b4afd7bde2ac22e6661fdfb6fe0e89510343c3a267e96adacbcbcc0d4b8356e1cd25eb4c1c2c2f729189f4ca66ddb4ebf6d9bfd6d7bd369db4ea66ddbb6cdb4994c9b69b3dccaa77ae5bf71f09a4c26d3b66ddbb66ddb6933994ca7ed4da7ed4fa6cdb499b037a1deb46d7fb2db9fecf6d6a96ca66ddb1ed3b2d66eb698ad705f5ffb6ee4bcfd0ad7827239ad984c2da7dbc2f2506b61313d663a6ddbb66ddbb66d28d49b38785d56583216d36f9c69336ddb663a6ddbc964dab66ddbb13dd56eb6ad51a647ad9c564ea62ec8f6a64775dff6270d677bd363dbe94d5cfc1327b7df3e6ebf6d6fe3f646722ecc002871f2e41ba76b3fb0fdddcf42b6f991eee02fe5fbc7c94f8268693cb070a83d09b95bca12bf33c158c64067c985b90ca4c3738b30004a0d58fad820dc5ed6de5396d19ca8a4ecd26efa67e41296c67e2983907e488e7769fdab6294d2bfbed2c728a514237d5010f092ba94d3707741e80f817792be7e10d2cf1b5c73bdbf00b846be10d2c5c15b9b3c8188c4c9676d725c10f0d28eaa9a4e813594cb97bbc8d0086e7f6d1a58e4319ca379a00dee485c6c0f1679a00ba8042d5785490b19cd08000010007315000020100a0885429168288f24c90f14800c7e8c4c6650190a644112e4308a61188418a40c02c81882080167666838020080f89e50e348f6a8a947d00a90e83688e4947a590d1d54a9b84395cc4ce1cd91837e603e184f395aea0fbee7366dd5fe3eabd05302fdd9f6b790fab5fe805fbe06dd1f2d344680a087ffb9efc156e852667d78879680208aa884843a4424d8fb4566184c6e0f8aa2b63c33e76678469d78b98b91c27649eecc7978f15f8771ed321a90bb452acd10963342a566576c708e7814723b945abdb596eb6148ab73990aa9a316616ce321cd23fc59f47d074b97b65c48f1c8f1495686ce00fe7e0f6938778bbb950034563266a8efec168db5364d187e7a22d041a1628eb87d27105e0ce61df95053d381815830dbfbbf0e1bbe0d06cae3deb498721da8a1e22a6586d25980c99d0074dcd03e3928c443869b6668c3484d919f78ee94cb9e173409eab31a68e7416786869f2efe2db3551b34cd6245968ae087941dab80858a5c2b290e48b4d2fb4f2dcff6bec79c792145ce72369c15ed3fc0240db7fad6f474099beb0a550ae4bc0fc4e2d618d49f75a46eeba7a49757302cddf11f1c29b356ae9e6e3207ac4532bdc0407a2ea1330c1268f02d6db9402de5a8c38742d79eb767d72c0ecde1c8cee2251318142d918bedfa7ef38ea637948be040a0c69b731830625d7759a256a6ca75ae85a1a026bac470140849a1b717cf19f549aad0d2803da2d4711e2a0b28046cf8dcae572cbd2c883c728819fb82d59ef46f35fdcdf52a4e35052915bd0fc55dd562927af59b94afe10d01a13f40aa80604c60e618130acfa425796eea7e58b26bc3d6269c1a13a9a070510ccccab718776892096ebb611cee89a7a1a3472df8665ae4030afdebef2e75893735d1a9a88d755334ac8b203c7e0842e254978a36b2ee3082ced49b11d1bc7a3076a82c01d67944c461c523448cb3a52157d9849dcc88ffad2673ec4c713e17e05952437744fdbb6ff5a05b6896424ea78701b003a730005121b97eaa50b0e78364969ec0138fa803bdd244c77cb01e5259e168fe0d542e6481f226f9e2a2d19b11720a7a642cfd9200919feb39b900f0648a2b278905743207444ca7aa1e2093c4732721aa661d14325dcec98761437404da5d62f40ed410450712a20c075295af1ca9592e8ab2479e0e7c253af7160ca27e3184f3555d63b85309618bc7bd17d5ea2419e994f017315f46b46f7c9d034f2b9480dac44ad2ec9865f3fdf174fa4a5b732596d5741b0dd3caf44bf20359f740cbdb39d0e09b4b0efcf3d6c2e4c294ef6ec6530db2822d846801f691be54f3a1684527cf3711bc3c2c2ec2bd3351fc059c4d2d92cd9a6bb1a9a10b1cfd6bc1cd1eb0c9383869d6b3716964a8e8d0eec39eb15c1181f5b3737d6760caccdae67921d17d7ff9c2e4b48148bc7f7e76d4830a40d43124dd1211bc291a972ccb9996c845bc80a0fe08891ae0275a6f89507f97d5add2dd3c5b30aead85410c31dc06d583a4512182bf25d43d25c9fd335a515b335dd856cd472dc0175ab6f3f9dea171e082fdbf4a27844e766f97d115362671b90e01fb4f5f028a089322968ee332627d3c5f6f560e7e24804b92ed2b09fa3a019628ff694781d7363453adf24ec1edf8c6566a77eb6ab627e6cc0ccabe84b6486316f4e64e12a622dd28ef49e95a9763f0bc7b95bf4ecea348be1aa38c60d06f59270aa554052a4dc1ecf4914f3ec46302459d92274bc1d8040d6d87ab948a4c2f852dfd2c2b4f27a7966b1fe387a1e595a85b40228b1a723f2cb69f9c17b30418426af9d74c26412e42a8d1c8c5f8a714d9a10c669190c305f87f20722c57a80e97307ac5e8b04be64a3da5bdbcbf5455ecdf821d09e6bf04669dcf29fd9bd0d58d1b80f03cfe37675735eb4d6ba2c1dd4a219006b41a516a8145b21898972098537a42bd22114fefe48cc3dd138de251a350eec3c735913582f8ffd0e2242560100804af94988151b156f2753e3404e0f5f3850c62fd6f8564777b8bbebd3fc4f84b0443aaf6f0a73bb4115b3b97442710b7d5e68034ab24e91a3da48ab8dcb45d2a91e5263f1531d025e5fd30f23bab979be51ac74317081cfa6fecd669dbb8930682d4c24e5ef0c569ebe73767ae03609fe635f7c1b5fe44d4734ebd693c8aa4f3d46c18453b44106b2b4086c018fd3a0cffe21534a393bb58d93c4fcc30b0764116883a38ef17017c09290b0f165b9219bde690d3ce94287405148d480475f9728b264dbad227a2c2a76f95e6c0c2cc7007b03aab6003ce9694f82983ed4b26a23f2814d12764a2d06eb1050406004d168cdabb10c33bb7c1bf6ff2ba38c85783e96207d75dcb7feeeb2d62dd36eb6b191c8a98088f75c05659bb70c9930a4e805b4afae2144d86da73b6efc8750b94f55b27555df9d5079c5af56f062bca76c60474d74487c8f1496694762704b9a0b50eeceb4a90e6f41049dd7a2f7ca954225a3a4b2b3b25d2b1bec2f06b665ddbf16e6500c9c1dd46862f6c396f2c0d71772179079eebc8ac6621fb9f7615598672f712fe524fcdaa4ee77596a7785a0a2f893696c29c69318705236cda46262b1529501d97ea89000d3964e4b418a45d0aea607534cf3f2dc7ec29ae467d5b170f746caf2f8d06ad471299aaea2db25a06869343fea9ea7eafcc4dbdbadf1fdde107fe617684cb6efb28f3b39cb875d83f260999f2ac979e36d9021f389961be90aa916d6aae9c0b12329763c7e46bda7956512b699408fe6a1fff86c34f893bcf3878468b72b184628cc1fa7cee53786b02fd244eb4b3e912e8eb4c0d8ee932fd68952a070fce2c8e9fb03e26bb08bd308a4a834bb83fbcd2cb7d4ba07433438d1024c888bc0a50bafac4ebd08e900c94a8a6033452202defab312802ffb2dc18e9ecd11c399a7f765cd64e0f474740298fc69ea13744c7ac372f8672e472ebf70f141bcea364fbfdff2cfb981463f4e362d49805370d726c916e0b9ea491110578c7c4033b7e87e9572bcd2c103cf149b2af64f86d40ebff4a66f6dbe8cf07c0758f67438f7fe0b026628d6667f7445e71945bcb69bd5aea8d3e096d8256de43955424b06ac543c244c88e3ee7975ea59334ab06633adde0f6d94b81d83f492b44639ead18c040c132bb5f72e353cb6e66b55ac66ec612f3d876645decb17ee205d584f83f3276cd39f70fd969034e34ebf512fa77f7f87a1f548ede66be1ef1be6bee8d0a9e00b36ee86b56c9d590637be07a6bac45c8639c688687b6124f5624d1711cbad086fb49da419702edb870c0817008058150314ba875c3253547e325b75e37109e693f44125e4ee7fbf6d1343b95a1cb927ea2024fe2be2532fa2720e29079646fb11bde5e2cd8f2df9d2936a91509464599b0169494e498d45a3de4db42bdc85226fcff9f26d948182b14a37f4bf8ac836494acaa41d6d374791d6d14f9ea4afbe30d42316b6fd1bdc766a754413c2aa60a430c15b55fb9dbf6991aa8af0e383f90600cbb2c4d9e66c84f4f34dd275ef0971841644b9382ef1c8879afafe8bcf7b8b107e986548382090d915e8b2fa31f8be414b2f793505eb893895dfd493ae39e442816a4be549874517b1e8c37fb2eec962ad089b95e497d66899493c3e3af3eac2d69a91ad08c787096de407210e92f70eda4e98c1ac8ebe8547bfa08e72dbaf5ce48a4bedb75463a65f829c3a5ca608f0f81c4cb2d6f760711cd339772175735b63a29d898ad4125cb90ba6fe2380cd8a6d61e31e532a6f73366c74c2c25c206bc14e9f933d8e2b5b5c73801bf44ea4957d097c1cfc4092c74972187978969f757880149acb1c9bbc99ffd6ac2a07f21eb2553591b396242201ba1970133972219050d7a430d1319001513d21f58ad5c5a418efda3b0d62e3e2e5ed995c07680661f1c942318304aeaf7ee6bf0be76007bea7810a23dece370fcf86241dee6875f6e26b27619e06aed1efa5d979891b99e8331dfe3f06ff75166021c026e349a99e10aaf819d2ce5bec846fb20a6b833a5c13c65dd1920a45cbabc333241f1d20227f8c785b07fce1f498b69ee1d808f642952e232848ea5e83f6646b5f49f72b45c977546c2ec28ef169a3a8e90354c0320e48cbc6c0d4ecd7abb94b0e4920fb9ee760eb2bbe654bc512fcebbe1556cfddc6cef10e3ea18db3b6a35ecda565f979240dbfc8e52e79058bb6e8703a217a876e7a897a97bc0de86f64be2518f2db3f790679583222c8b4d1786b0134ab11982365d382c090f748e3f779a25b1da52a1c85067cc114e457869b4a144a18536551e464159f66144a9c73d4ca74b276167a41f3e26e84d7c44709ea24af4c27a2ce32da7389429b358b7f40c69ceb1a1e96a831783d43209ed9c17851ac8f43f15c824b3538be1a07995088462a545893980edc3fea800c7fa169ac0b86f05f87e629828c03d2f26af2f7ac40c63137d7aaf5883e9c8ba0c783e84024c7ff1cd6b64ec9f9801c69a77bce20dd5689a62cc5d0c532427dbae75d63f158a85550655e05973fe8c718b4e86d1556ef9eb3ea658c643c61e021fbd97c82af38c81611347b4dfb548a9ff2ad2f07f20408be50eefcc7a8e97bce936bbbb6ca7b891c510c55ad34a094b3b21af3d7a8e3163534facf27efcb0e7c2c75fa0fffc5f18655ca17c14919d799747a94938021880d29a2b5a16fcd5f31c6ffc5bd219cb98f11c0f2c48f361fa146d9e5bfb3ca7632e72603432cf644d16cfa989b3845f4588059e0b53ca648dae0a1523b223a01bc1f37e21e3b9a933cc6bc9569bd15c57219abc893a12fc35ef3f51f3df15d31e952ba8e075b1ae39c4e4f1d655dee6e29170b940a5baf08de5007409c05a91e359f366b0993e470faab98a8874b9b9a766479134f50fe9e70f4fe9514a459b87f24d15bc00e069c3c9661b20fe60813bf92ddc2f9b438149a0cd7405ab92bd2ff52a7f3a6036fec73028c17c292b5a337273bec0119c8f021db1ee003619b3db878a3eca803c7a03f512a32c7029172750fd21c34878aa557d0e969edc84855d529bb76da5df86baa9552dda283fb79666dc26876b137601155a0bab71b8c914bf5ca3367411fadb2547731853e6b2c4582d8e2670b95063e47e1969668d18b26e38a25e1262b18774a0eb910f0a2e22d9217c66b763b069d8f1b7b371c42d39d68fa276002c43c77220969a2917677db3b50233983ff68f057595c6bf904f5c85c4bc87081b90b7dd3c5f0c1a35b517e69c561a97233e7e91251fd41da91b7d415ceb7c7003860cf0305ca377761c9098f0f41f4bfcb2c49fbec5fca3a5e9ae4220998b15e50c530d3eb31512cc4ae4aa5c223eb70081e1bb1c8fb3f452ea28c66da02479926a7477050818e5da089e494765941006634222c25c40d35a88c805fceaa6717aa6b7ace8e9552bca67618c371f1975492a0743ee4b1747ac0d765ad8da4a7d3cfc2dc8244aff5ab9b9bac2fe365279c4187d9e9cad11acf449b448e0d9300fa27c470162c50204490ffe4c1f5d79e773c4ddcdc72303601d8018d758efe897b13358289c9472cbc08b6582bff565560f34250af5983ced1f32a2f76c043922da7e669aa8a9b5a2b54253a6d4f7a96c65b34b84468a2451189b28a6fdc093a8133ca535d9f930aecc319fc1e232651d49396fbf1c55acb4863674158168902175db27db1a5aa6d376239bfc8f2a29e5634c8050dfcf987aa240b7499fd94d962ed3569d18094459e2b875b4a973c341666fc8ec3487a62e4599370fa123627b09c8c421741c05afa1abdaf8488a7ca093234e7467ff5889828532eb8c8d21ff9a649b1822b6a7b991e21e62ffde37426859ca14b9fb28e81ddf4e8a8e0810aef731b38500854f697aa9aa6b94c1741947891f468696f54072b147b0b9eabe165117bed0f83d07a780cc57f08121e910ef38b259b607f11554130cb35d1137409ae64e7707aa9531da80f35fd7e216efcbfdca945093d976c242b6bf0391cbef9a2d8582cf54c8d658e3847f612e25700e801e2ad257110fdd098e71c2332eac6a0489af2cc76cb18c01781a1c58436cefab1f7233195311feac0322ac4fbc47411965fb658850e19ffcceea0ca2f03a9f2c110f01b04dbfd9ea9cf8ba8e6193bd5c515e71ddcf6d37bfc51f08343f06fd26960fe0aa02d1da21694bf39d38847aacdb9f16d072ab7e298342f55d298f96eb4290660094f2a2a581225881e10d95ec26c41ddba06bfaedfea947ee5138102172e39ba91fc48f998face73002d4924b7d85d6ce2d230304a75e1ba6a84a066b663f7d8434f3f20510dd80a90db0e0470eee0576602eb5388c1d33ed1e5a66bdbd22e8d41ecbae13c814d8c6415e7242408e6956e8dc51d3258d65001c7752fba73279919591b2e3fb612d19333d69fdefe6d9f7213155635154edcc575ab88ca44775aaa04272f3b50d3b43574ac8443130b04a3ac8536bf888fcaee9b2d7e3fbfa9d39d784193aaf01ab2beec33184e0c11d846368c7f65d4016d8391f94d4955a4e3cbd15b88bfda6833eeb62ef7d85506ec72f8e8d847c6f8f0ff00696ec1797620f8804c4a5091477a215ce55c29f27a02ba51ed449dc4c0794a283de79a6e6ed2944cf4d1a25e4e25f273971c4515a788f7c7463a5cf930468ce06e2b93dfb22b330195205b5451527657a3369fe03fdf4425d2332c331ba381200d8fdc1b2cfd8deacc230c4dc8375ef9edb410b13fa7f0f14954e10cf3431081e61b0d836f230907ddbe5e6cd8f3555d179bb9cc0a9146b5dcb227d82c67e52ff764973c30509ef8d8d340bafa3540dd9cb944a966634acf79c8f0022e2fb2a0faec34e52d01c6d4f345f6149aa7a70668a4023bcc8758b1e4dfc30c64c77f8c80974f8a14aafb9dcda1a0a6e2399c96ea24c2fc04f8babb5ef32bbb13a8a34ad06005c67577169f23a5eb0acc11dc8cb59b2c1ffb4a0ab169d95a0e8eb25f14574b523df24d8cc56cdb318da2525364b74f9be6c0e4bce5c543d55f4cc6b4e00daa2a43ae67accbd1b425f6231ab505a297cf10bb9a1d72cfcfb195dad0dca0ab2cf4ba1c81a15e4f667a431b1c07a31337a62f4f72ba7ab122ad5fa73426b256b1dc67fdd2d9a454f7048e3e6100a0285294c3e49dcfeb29627f77ccebd30c966f294eb157cfabea485cd3b2c53c417f2888e479f41cef31c3608b9747760064153e311ed6f472540c9276d73e46d0cac0ef2db6d11ed47d80ad8dc1f44022496d1b07101c5eaec8e30a6685499cdd13a883c4a8388784be0e7f511c3cdfaf2b6b8872f5c3144ff78603849d91f19bce319db47669d07bcf18274be8df8e8ec50441502a0eaa9ee24bd4222964c758c85a093b8042c9c552f981573894e6106b03103a2e643253b48241bea8bfae313c298f31370d1d33a4f32e75d2f56ec921f6819864c1320c83650a9022b8d606af6223d6a2aae5971aa4ace386f0a8e68462906887436cc746846e320b6e012548106a6548992648c6af4569c259ea86495985e871b333d118abae05594b81e1723a471121139378eaa5c6ac37717fcad6d8a2fc31b8d8d476c2371904c71f021cdba372feba92712a2f354ce7cb6eba748f0083428a111b43348a4bb324bb3d5f993e8212d0af388ab64a582ab2da5838630983bca306404266dd680c5a9ce65654435acdff28a84e85de89fdbc632bde9e7dbe47ba7a966d7e533b681ac847859fc8a27d0eb12559e7ee311c0ba099595bf58071e6b24d449ba25854e1febdf19e96c21bc9617d3fb7b1dbd4a877e0443bea29dbde3bbfca477157f71097cadc4caa47f6c04586f82f2f215ef80d74568597d8827e0ab10541edf710d6c2d89cb855f5c075a29a2b2ed3be24b68a0d69226b8559bb04c4c3d73d9cb97f4e5236499b360ea273056a5d9642d1bcb620e87e9243238efe2bb7a3ae19815bc948932a7346c9f04ef1c7da22b750b1926478b4e5867f06a9c81c278e0d865b9b1c59299d863e665e8201906c04a84645c275c9977190d973cfa54ae83f10ca463c11b480d6333daf598b903cf6ff39a92585340402fe9b91fe88d90878fe13dcf7aec0e375ffb8be2f46d66ca72acdc78038a5c9e512512f0a32a1ce0b36f53ee05ff5ab2fb041a6bee14e8abaa8e51a0f484219ce07c45d29acab66f398217470163d3d8abd1d8541db08304936b28d1a4f87ed0125bffa9abbe11c256c399b15649d8e384a19c074725f5201dcd0c619d10baf3ea8ab2a37859e943fcf1b16a0b6f559e1e7e890b70d783464118c46f7f99324403566ed7c28b467e20420e4455d3d6c4311320c4fbd7222ba893d8dd80b34d6d5565966ded921d09683006b8f3c2e5a3533dbd6b40b1eee5ddf440fb3e8ec4e525b99121b5d053be5b3a7829b02fa68b19ea4374082efc6b37d8fb7f3c6d37695a08ea21900480c3af6ff79cc354b6100064053dae01f3ef36799e94380f081a2a99224ffe771d365d93465f1f26325a565635d5edb19fd903a0dafda36ee6cbd9dab0f7168ab3e15632d75ab7dd6e717bb44df0b69e9af0958c98ef5a2e22cae4dcf540ed079c4ec5192a0d80fddc13f85d433c2b216963a41d5711753ddd449628ee2df4f2007632ab44390fc85ce8df031d4174ed73248c4e0e20fa043ea7a74c06a0f324141f753cde70b983318067602544cc0fe02eeeba807bcc88eb11495270b399443973a317f4719b7b38e8f3c29b9938d390b314ae5042d58293242d85d136b0e3f445274df4fa85f3d135a812158c77707eaa5c79854157d0274aca05e670e63c04e58bbf1f02c12db4fc1acb22aa4b5480f0e861fb89826b0360b6b4923b444034119ede3839efafddcde70cad3c12e1c06f4cfddbc1281e2173e734749f29112c27b673924b74e73f2bfdd81c1e61433b766235acdaa955cf5551881e71633f0646a5fda083e8cd11c945e3c900fe2cc0f61c3ee66e353d375d64a35aa167b677ba01d0191a17cdace410c20db61b8b3e71aa776f1d0fd6e8208755b7ffbc48c874b9fcaf63c257035f132005268ea72e73570402527f4a010dc2ba38755edd1e6e7e9554751bad66a2a7e31f64bb83a1c1bcf8d50f8f5d9ec0ec56c59d14739c46e683e9b2ab55c31004dfce21777e9e903482d73b57b0c4e5e005794ca25cb04af9ef2f965623e44480754f95ca250e9778a8b9a9c8c7609123daae1a3dac1954574331265a8db5b0097383d987acfefef0f368fb760ae7ea75c34a1df8f3ae0b791a123ebc25b67f45b77c769599c26d33bd0658d1c7db392ba554b98a5660490a4fdbbeff0ddc371448731bcabbe2bef61bd83859e41b840cd1d0c6995f5f91651ea5bb2842c7a14aee5188cd60f59072e7e20ce67106f17d8c018dac44982e1998525db35bf7ba7b32aa047da08158b22fa5b77f91a47991b42480e4df3eceac4e476cdf7b58268a7ff76a34ca2591892a5788ec4ec09809b0a130a8936834fa2ce04897f009997cb0dbb42461d8f39b9991216e414618a2608fc8a7c047cb07f544ee7a84fc3276f1d288b28c9e9771946cf715234bb8d481a5c56d2b31a370cdbe34ec9caa06ab9303609ad7024bde68ff4138c633d452f782298a32b1a04c3b4e315921ea0c374cf63bc9987777580003f35ebf42017673043b5e34dfd6243736dac37aa27bb7a8c807873e85e27b1353359e543aa3faa335e0392bafd2fa13ee727eca573a3ce913a0b13f6a4dea6e766950c6352805f54267ebe8e4a1ebe719c937848a70623aef3e1349b63244a7fee78c256420665d99a170a3aee95b79162966238489636815402650ef0837e68d4fe0e1e828e2e38ef1996e2cf12a63a254393a9804047c2c245413b312604bc7e1739e100ebde20c692d8176b86501b089aa744d9accf8bcfd51e9443d09b784f4c821321bfe2281feaa360bef7ae9543fd5ce5666874a43c46a2b7de95cd331525b6a4e67ab96530e6a2573898b2e047a92038be2bb8cb4ff77e5a82dbdd041fac5826453ec9b2ab63b36dbdeac0279f338ccea54e9297519031f0247bfd959155790d5799a28acf7afd173784775f25fc797264c42d7b997976de219bdc278886c11a5e70edf1a9d8f3b77acfb843823f7e239c0dc74fd8e09e4c862e18136104fb4a8cba72041173d4137de3f2a7f880762a369de0a5da1db976302c8961ec748232491338fa5b32e87966963842dc642c3ad7e9ad4783d285d12902b5a07ee6dc2b79d669fd2c868cc839b67646916ecdcb043b8fa68d020346f003059152f549e1478a198b0749609aef5664d606c7abeb3d580bf02997fd82064297f2c9c53189a1f33ef16836b9d7ab1b770700b4330fcfc83b322035f0801382d1c686bc83ce3bae6d43d98015194964d3f3f1b5507ceed8171cf4e7ee8f7c33ee527691825186c8280c1519e748088c7d3c069830190730b7275b842fed9af9b8937fe0fd29a98df7a4f9ef18e9203f935a3b92c4726cfa858e37bf4c422a28f6a646f360be0bae8da939d0402a6ddb03923656d4e33924bc30a9c91bb92e34025c8b26e8ac5351d08830eb2bc29a69fc1681a33f8e85c024ef955d299c7851039b83410d4791c839ca03d0ddc9fbf01ee3760cd8f92fbe6b8112c61ca5787d5a0117aa891c55c0238e436c2fe0eb66a91736e926c39ba403259ab92e23130031ab209c991d20a45fee40bb5ce43e3475f9427d821c5a1ad96df18851420d2ce212ce67abbea165f564189a9dda7e69dc44543178e8221dda95ce51112d42115539ee97e2d5c8cb9890f6a249c4d01ee763f15a057a87d5247fd9fc5dd84418231286f6efadbddd1e168088ff9ce508303fb2ae6ea241128f97bdf9e15b75f97b63a2185ccd3459485315f06eabcf46234b835e56be4cf40785a773dc7a580be65f7a14a51ffb2670d7ffd1f9538aaa93edf882a296bfd507beb077164053fb73e0932a9ff5ddbd7137e0d8051444ea57fe2d13aa1c766e804a268fafa1fec9138dce88434a17a84a6c6038b353a9feb0026979e883aef5983fb30be46ffec83d1c83efb28e80d51c4ab9eb326be804665679c288e0090244f18fd931c23fa8258dd93a9d3078aa07ea6be2e308015019c2892e7a33164feeb59c0ab03d74e1b29bd206343f3a0878af5f8801e156402300346c0f11bde677b793c467351d2f0a5de1f31813e714032e937530a8b30c54e2fa4a014070c936a2d553601ba97eb7049090c77da444ac8b372389efe0c591a531d7c9dd425987654aca9827cd6ff2a388a9ce9ba809e8cedc57a2fd5f08115bd8d8f93020285975a1f4a6ceb197f6364452fbb097992e8788eac650a3749286aadcf4ce2f91b09492b9fb70d567b53754a5118b5c9077b014989c184c96e09a5dd05d707a10e4a33c2000ebb28d22f66d013511149921d234ecff23e7c9cd37fc8b91304d83926969dc0e852f6453575c408fdf52c10e3e3559d5fe63f37a9ece214679de6e8823f1250d0b154e7cf0ce9299107898e56f819807a991458d42269e36aa48924123f2cfbcb172a09383ef19666c24e30d949d80359268c11084aedc0c2dbe3f08b6a059db0ae1b0634f9e0e1f8b8160b5406f9f6a8023e3528176cd5e3769ff0c368c74e889195edf275cec820d402ce86b6152eeff9c947a98ff3f2a6ff39fc0d983c3065199c8c1d270788d2c794c2cba89a70590d08a06f413397573cd1f8e4307a8e7cddb4d911876c7f1b3afcbea3292f9ed27c4bfa2cb6a0ac99d8cf46a3144879915119cd05ed7242e2b80e429d68cd5a85528bb0924d08566563effce332ff01287c4da9f47f0ccb21899bfa48d53e68f927e89e4c4be2b8aee9ce4e142919a368e2e015ab369aa6e404df1ae93b3fb35b43046e321b961ab961f374bad24e6cf790f5c02be2bf44c15f4babc41a7d77c4c2fec786abdaf06c19d20fd6350c33bc4bd8d787f737cb64577795184918acda585ede99d465ab9de190848e902f1fa52c4153b4935f8d160b63398e851fc514f7946ce85258736698727183f070bf3cc7e37180ac49291e2c045beadc7dfa2ab9ae23bebda4fa0deb571afc50b21022064268c9f9e4d04d707c75266a7980e066def9beb30460f6b718e5bd3952b37a956e996d16299fe90cded59d196a88d8f14fc66484944b6d08a8cb2bc1da9382527999f21356f470863f0d9961f107dc2e01cd7ba669605ccb9f5bc84993aa2d894ad7c8da75fb89b4550fa591421418f13b52796fa98527ac3c7aa4b14b98f231552d14fa61c2a0c4da0d46e8a1f416aa4be05dead9af494a40a3ec18f2ee0622bf116fa6536ad9ea0b1bdbcd29aa8bc4754df4da5de31ae217f663050c0ad1e07c10d9a487666c3d9f5c1f5611090606fd83725c1961c492ea674d9144e350ebf15b2159e4a2926af11228a1347048962acd0bfb5fd795c7b50f8154b88c1053c6d8d97838f7c9b0eff1211e45a051f96743e216ae31dbc40021ad5ce1ca4a698562eeea9e04d6309f3dd843b4676dce2dc41a929872e22fc2d702a25fd1ac5a71a83102ba8d836ca205694ff0b93de4e42c8950d294b32e6f10490439ccce6e4dd83be9df04648f01caf6368012eae53e68c2b583d4592a81f2eb42a0aca9980b92338f9343253ae7041eaa621344a0e3a1849d386b07c009a934f3a2304111f65d469d46606f6390b6ed53da2d656ed0cafbfdc7f05985d91da005bb3468976bae4bda8ebbdb072be494a13effa2d07997a41ac46d121845849cc60a618366f72ea248c80c036042e1406692a70571fd7431552a08a07429f2211263f2dd2997478d60e527f2a42989468710f379c8eb63d07595326f0901f9cecbf69b84e980020044d190fc5497d63e1b4381c60ab58941b08911e776507d67a172724222d485035faf8d9f14437f6fc5bcdc3b89078746b424c278a5a78a39aae9182040370d1ee8ff2209ec20c6cb345009f414db7dd55821c06dbb40cf1352066cc280f3846ddc24bdff56f8b24064a7ab1555f8e52c56619edb1ca8a018c183ca37017a71bc2a3c125aea9a44f0f424247ebff4b7dd39e034fb07f3cd6dff061cf1169763300b8a838147ea52e7754a039aecda15eac3d842aaee72b6d0aef0b92c70e789ab4ab2edcd52b2fd958dd22d679bc2cd7cea47f9b690d357e020d2a23612ce42cc85d0191ad87f012c87d769c76c6566eb67d0ba0f8d22f7d67c3a058650cead5922d861ae15713b1a8179b6f7d8514b1c8faf0e7855046e8dbc0f57ec1325dbc77936580eb80fa9f01bd17cd6745d2636ff5b737d17dd1c3bce7d3bcd22463104e91d11512da504ab23763a86b21de8305beef0994f7c0a2cefcfec049a0628ae6902503f41b59f34b4105255688d8fc342bb947faec0fa054ae52d664be1dd7fca5bc62a0cedaa3daa9df6e0c259aac59b36555db66a5984101f0edfea0bab0ebd577dd639b3a61651b62dbda073c4e35654c8aabe4e912fff1d9c2ee4ecd75cf95f1b9464c5c13ab5fc229576b2f2c82e4ccad8b88eb115660b52ab801bf0a7c4c8004664194f02ef477f0dad3b5d14cb54deee97c0155fb99b72d015ce2d76f39b8c060f9c4aba6ff0e147d6ee5ba3c810dbce5108b8614bfb262d94d39fa223b33e26b5a81e316bdd00ad543ae248cb3c389bc3cec885a54fa949bb3e60ecc48a286ee5f08c0351d629a811f94a2eec9096e3f85bb2f42cfa778f7c240d014e234bb9c44b12e10aff8da5605efff002ac39838ff8c15c71b94f6aa6c286d849cb4689652638231c29aa3d522ca02f2e8c03d22b5a91d66d50d2e7d2af03d548d6036e03f327dcb937d223f69a0537e11b2efc7a7bcc6187f1483d3de8d456992613204f3b4362f94727d19b094035baf892e38554e60ad3f84514ca167c168951e28e71f06d61b02b5f5a555b9d2044ff430204878c0f42242b856c2adb026c8d60bed026d3a9bba8c4e71c2a6084313b91e80826f22f2dd9f4886a949cadcbab6abf1b019a36f3b68fbedc807f7523ffc6d1c50411d6296255811616e74fe44093855156b13cbf34df402f509599a036c7fe8dcabb6357661e8a98d81d77e4376834f4cda35943ab40ae007f47d3018efe72f7662b934b40cdf20268a7180bf8ea81c6e8315a74e857e63a4f4f1dad4e4cbc74ef27a834bc3529da57d5ecc289eed4c78a2c021fd9846a69d6d4bcd8fc334abb81b0f26b05f78a4d0fd8a1891675edf80cd0f02691b06b39b855858ce802a1c9d2da8405be37d9c7b85a0330e998b9db07d3565adff67a1a8492eaacee38993f20705b3d14db3763a936a4f0a2f9509a79663513ac29d17721865316580d019d5e2a45ec01e86894d01b779bdb68cf4fe6cfe38734e60393adfdbb94a2e75c3a621aec636a7ea0dc02ac05376585e7a571c8419e124bfba51651122a9845798c92eccc145fe6c170da142d43c4023cc0fad1a8c289ca25d7f8d7135c0582c4fcbdf16f60b8b75cbb9f2b5597621d964ad34de72683c635532b3df317ad035598dc59373c60761db41a9af8d44f705b98bff4d106a0b4edb5b6bfc66742e25c7f9b22e47714ea6d23f368eb67e6807bc3ee2353e2489b958c5a7289d3cf09089dbb34ef1f601307ffc9030a379b65a4631f4f3bc11070ea7bcc6976e1e5d65379ff329487e030a91b3c28656fef7a2a6ee29760223296674789f1be24984cc80622dc73bae4a7fe9a90c7ee5c486539056972bd491c6b126f4abc1c05dc4df97ced5dfe393f3626c25ec1487bd7144b9dcdeb14a4b0699aeb9110e2961036bce3182bca49fb31f87b4e3f2f4daa4df4d3b2420af7754a5c87633fdf40c7ca60351ac97a00dee1741230c130af33c290c59d56681c19be9de8fb43a91abc221945a7e3d79e99e2d9c503d73564c7b55ce4c5f90546320f9545bc165eb01a90ff1409237e851f5a51688d58295e7c6eb8c64550ecadc57be63e40b5e11062ecf0ca3de34b4d5f193d6fb1bfdc00d562998998c42473319c134a817bc69cd897876a0b97d12d61f36fe180219020c465a663575340864005c2352528695171fee22162e0d970f35c4e4a01411c9478332442730e1e6e0f5e8a27921abef2cb5fb5120c3a03345031077777137ac1e71b317030fc31edbb7ad5a4045d3daf3d2ae8d9c0783949f13b6b8d0f7fd1b09a1d021b8ada60f343cdf180b61b8d79b2a7f255ce2904d87769e3d0ea7dd17e390ea132cd02341028b62515ba5948b32cd3d667bfb37d2c56d6189a149137f4a1e2aa8d6df41d2b8a1e2ac0633270b7f041f79c68e3de3542fb323ced02275044b2127929c7df4295db4d1be7922403e526f824640e836e05c6083ebd200889f049e4da2e43d1d2822156b494c9e762b630906de94967fb160b4baffc76834ea17dc7d2ce70635d9911865f36b06a096e74f4102dc4d6058125ec5a4cf1ff094459ca43af6af42cfd772325646a2bdd75492077d165a48f3c0e11d3c5ebf80597a036ad297fc825dab6b4a32243bc253fa4d80ab2161f97d030eb263627d667891b57ec7515764c9a72b9e92a54cbb7a0e44db61ab967b26d4e7b0d721743419f9bcf451d316dbd7c7228f718069b5f24d2161bccc25b6ef7172a68ac41899869f90e4ecffc6f62e2713b6e17c05bf82936f84b04f9c9365b88d5aad06fada876c8b15583def289573e628f3c63f99ee8c8145ace62bbd0506a92b560f937f7539820a4c8ba64b51e1d3f906a9c55a181329d0cc4f83261be2118d5f0976e180867802122d0c3ed5aacee8c963aabc6bae2766972a5386d60be6648d7ca1399bcc3e112cb2f4ee85d32d14cf6f5064f5780514328daae029ca800ee7f2882205e1b2f8283ffdb65223bcf555a951555b186596aa834a41d44c99f851344a1af15ef017a8a560f8104f96b969f3506ae2c669cb33159a2f8a8acd0bd2ef5702a02c9677a6ce5950add1afc410d663d4130f89fbfa149eede0d340c8556f1c23b4b6ab493162588e397c489033ccfcc9a64988e4f47245c9c2e2ff779c3c9f3a5ea51c6b2e62e8a91b0ff1e97b53cffc45c245d2380647ccc54c49c3b595c07d2249ba8dfe06ebda777767b4c09f3515f92493e420f59533b3d392f07a5c97bcedee4270901b430cea51dcb0e72c2b757b5ff9394a60ff22c1debd5a35a309a82303d51912d7d7928357dac1bc14ad4129513b24ff5de0cc9a191a986c1decd875d6aeac914b10403f3741f3dee53de1825215ceac88979339f9753ab2f14fbdea0431ac3e9f7abe062727a236c961e82344d7a301ffeefa5057b1139a185b8461717cc104946ad1e64f402049e709c24953efc20b171743a140b7994fe9762380740a8955be628cce5e556c05552c4ff1af0d4e38da259c9094e435d8fb4b0fd0948cc4f3caeab92bb58d075a7c14f30990bbf04710abbd463bd7b512c49f72039a07ad95f7a683858ce89eef572f57d4a7abfb3a1e3b28801e9bc10ad346640452408f2e431c7eb2965f296ba1e5b40f46ec932c2205a42ca8b022b20d2211ebb506b89b2704799f2590af1eeacfa71ef9cc6d8c6fe722865607d04a28292c502f08debbffc11913c36d4ea734fdf4fe8523c08197a7b2cb4e2e89bc61627602ea42f17fab6878252bad46bd87dc89391b69458d4c6b41bed8f7c3a9acd50fe1cfa0a89ba66acc82aada19aa2a39ddc24abdc4936b93c49a075e6357121851e6ae57a264d9fb92a2fc05d69816e089d8836acf62bc28618876be99456575473c833379dd6b5520ee759c12a271223e1798314154ed37ed94d2b3f71a785a5caf7a14019c914d5b27bda860d43ea931fd9eb9199624c822785e2974322d859e3b0f41dccf340414dce27be4dedaa804e9132e401c12f99147b23eaca91da56af33b1b80e64c9c55fe511cca5b5a0ddbbda5aadb6f8563625401c9bb98d4b66b181ce73f4f0d2db2b7406e374fe6193a330b280b2fe88da3b3ce9568000b0d6aa02557c50e51add2f55bb9414313b9324bc8a71dbf4914c585be747177637ce420512be1a68eab5b6b4a5e1bda3269fda2f754c2820e39d256c4d02fcfd676daa38307d738f230bb8bd51f15ef6faf7ca2343692332ab05314b6920aca0c0bb9aee728ab67b043926b904504001bf3114a03fb611575bc96ac46e9bb20589a748670169c79a74e3239bd2f23d45a17951776a0e992c9f8f8ae7169e7405d21e21e26c993ac0f858089b8bd1788c9582866a2b57e34e77f34facd1cd6b61ebb93e382ba3f42c4d080c8b4864b913a77d5227833f00b96af9390ec633e35f3cbd7b02519668860bbdcbbfa4ccc354e623b77ef7a88d21eef5dd4628581c202633338fdc5ffab2a0300fd477bf1c1b052f3e502d4267cb28042eeccf2714fdf9ab5316b091003bde74fed92214ad86b20cf408bbd0380b578cf5f2d67490c9819a1954db05e35d7821b0560b3460d95ad7bb86003eda5efced7fed6326bfcac8f750440202c9ef03745780e5ecccb283dfb8cdea786972df1e93cdb24954703f212f5d48d2c7bb922a8888fe06dcb18163be596667af1e1144be9d99ab6a05d623def800d8012f86e57ccd31c79eb129155d2e92e9cbb66f2207c77b55e31134aadeacdac3a60837a264bdf17ef640495f285bf96364a691c4e11152ae9419c0d3cb5c3404adcfa61db5a074de3ffe53ecfeaebfe868550171557ad5bbaa5e99b6dc37b2bf6f13100452ec5b1567ba7379dc4e98ebeb949b9b07a8d0df0996343d4b6e5b0d249796847f17d57588cfd7fe8a9a8818e0a7c111bc00f923010b34ba795fec6ef642e9a7678cb90c2bba3fb4232c1a6fc21f6d660b1d4623875d8eea00700947155651528574fd37a07761236a60ecb2350a8355d0761c6ec3eec3c6962b9ffe28d004ef5f36b9b1b719607ac7e477a495ed4a6ad1a2a2fe244b6c349816f808a146fddfaf3ddc65419a99ad4489a70df2e4c7d7e59a1732cbff3b41931227e8b28b4e128b8e53b4219e891b813f98ec2c63e4e4ab35e2e32b96154256b3636753fec91c168f5ceac06a9a8232513e98493cf47e4b40f8d161e6c10f3692984ce67df540469c5b991e3852b1f51b36f119e08497c445289f06b9e459f1e7351c3f6741738665abcee1f690c831d90688d215dc84ab28608f6777e8c50baa1b9fc6445d4195b4f454e7c14cfc5c6dea04740c3108c831db587d1a122f82447fa4b69ee7d9d043d296583a08a056d01ae4a30606295a2a5f3151a09eb813f4b0af3f7e559df405d95e41659ebd9138f8fb6843119128b00ee8f70d55536c4dc6365832a8d84127b588f4a54597e0613e479e6bd4977332a9b11102b5220bc89105cbdc1cf522c43d7ebf09cf609c8c99d42d7caac3f71fe04400f86e022cc22dc6ab9a0cd9dcd061a43c098271615d125e06ea9d161661b81ed12d9f05601689aee1ae0cf863e5cc7df5f766298c70aaf7a12654d3014920c476a5c64680022b99cf43ca0379252185d2feb07a2f8254999d2caf89c8ea81092da787d14c85be8b94de1a62b20910003dcf78cdd72b875bb7ae1ccd64981eec8de08f301876ff9a31fb5c417048a0f55247238d035c19ab762d82d4316c44724f8714be5b8ca4876d3631b0ede7116b730cc24928003388fb4be1677318483ca0bad3c40539525761722831202346b3796043ac1546943ef770f6d0980eb3202692533fb06942562910194ea2a945070584f809adb127e205d229f5da1f821159e0a70750f472bc8ce4e8a3b8c04f17dc4ac64566abcbb684746933eb8984809856b9cce148df1336832e7349326401ef5e09afba0ceddcf0d23318f99202fead535cf66013b7c3aa03394438600d7e123389f0309fdcb7f569939243eec42cfef8e655821856276e14f7af4be4ef4d4f6442e6371e7ac08b8d8c23b92a432acd8952bdf2915539f4ae3e06aed570adb8e239e392438b89a416d2db7712357353c9db9104905c54184b50011aa94f222ddfa036fd801d92725405a7305e23c48eb2b287b8a38a1b2350daa9a506b37ef86e12dda9afbcf80344682b9406e89ca794aa08ee2489e493232788ecfdf5dffa0cda28b10225ebbb3f06694f81a4fd04c21789e7f52df2a1d02079a53bdb6d3a36d35efd9b9057c341555bb45e5d13dc22edc398c6116d38b5f83fdc718a24a4c6feb7a4839276b4302e8f58eacc66bd203cc7e6e41650c5282ac586b30539f6695137b6f8d5a5f82e3c37e4bc5f5716d38d9c0f83fb2509a2ffbf845d2903ea7790f52a98af64fd813f21f71cc610eb330bdc02b1a8a3b97ec69b94b4bfd7dd65f65e385fed93198ce77cc7e8e22fcf7d0f34a7f493a8c9571b25c70f122bd5e6ac3e80d9fe4560e392dfb8f230f9395bacfb30db0e36bd3d4c7d01abaf4a5ad47dbe7f634c4bb57d077bfa83fb180da7b344b6e39b7506c691037492fc1707ac5bb80cc731d23b0651e9338a41f840407a585a48686fa0ab1e4d8d521592e95e889736c321a194d3adfeffa1c5bab7d15f97c4bafce16f7986153cf06fa0092d8787f41e04fe3fc27759920114eb787ccd369c6d44ca705338b33bad9eaf3881dbef4e20070a0da26cdd4f1b59b83255ff77d29a122c729af19bdb788d30d33885d8ea1bfd7761bb3765546c7de78440da098d3ac8a0900431ad29466f6c58c3b980b70e64c82ee5d2fa8651d64b225f0fb82cb84a6afe77c9d45f49c9c8d8579cd62df41ced89ed4db7e6fae627c4d7dc99daf709d94a5f4a163ccf1e4863911c2f6984517eb390eb3f1a39bf073435a909a53794960ddf00044ffa2fa32a7ea516f77c9e3f18ef51cc333f10d973a9cbeabf762ba611338b203dca004ebbf44ae7e5d2228469dc23d897383033f51d59aa9d794205eb58012d60834b4aaaadcad24e561a56e93ccff6020184d42f0f75e2a45375fbd4527a24ef316f9a4c2860498a60ce27b29c6d0180f7e10b84a982f85f4dfc8e32f0a684da0adf4ec48b5b8c4ffc624d967062352a4032d3d0a9a609285a94668d26304623d7f2ce0caaaee0baa190009a07b6a15ee603321acfd5b74eda61b68d9ccebbe1dd4347e77942b9604e3f030e92870ddd931103ba9a0b0f7c6b6e0774918ad9df77061e08ce60dbbb2f426a5ddf8c522d3a54ba4f867d56880b71c260b0532a07a3608d020ea1df1fbeda52dee2bf7df4ba182b5c93e88515a06833d8fd81eb489689839bff92af3d774b9ab54d6c0ec272704b48d87780927c874453cd3b12fe2f520e620fc5c58cd3c009c849c4cc4631285e16b5409d40feff6448bbe28b74b479f6d6c274f9a4d0e507d502b1d96725b7b6f0d5093b2b2a2fe65bf792c2389d00384796f2f653b247c86f089518ac9ccbe7dce85f565dbdbc7bd62273b37ccd5dbe2d9fc6a5fa0a6a913903ae1ad2a924d6f95b23444b6a93a6ba48116446d551ac8fcc17592415a159ceb48f2b498b240dc616565fd55290994512ad5101f5e91d0d6905569911874739cd7082be30b683064de8394e28a0fdcd649c1c1e9a1ce7fd832435cef333ded5a0c5d14dfc32af7daf601b1b2be10351d3b31ad90ea912a9347540135ba7c50a9954e9b4b66d310c38236c99cbb7dea2bcfca821868149e3a23d24ce60893ea2f64d4e87df37bb9542942952e353708086f2cb7779736307acccc4bcf09f0f67fbea35b92398a4b139633797d88ac61ca58218f9125c307f1f7b703c378aefc106b8142db6be9b2cde337130ac044a9b8ddddcd1f12d83f49bfda5ae7d4b876be4c352f7070321cf3e4c2360a61abc683db749e400e7f625e99171c1daec9e88d5fcbf0a2d45f579d646828b80cd160d3f46c6c6097c5e65d3b4f4fcee794a66470651ad786e52aaccf38c9a891864a4b2c9f3c9c054ca5b4cf21d2645e81c9ea9d583730c7a25adacef571eb436fa354a336b954c2a66a382c748ca406b414bdf9a15abf96325b6fd788d1ca3a0cf83820c5a819ba3d9cb6583c19d2188d82b68bb4e091e45ab59e712287afb71ef2fe8ee350fe9d1ec85beb8a1631b5c757f46cb58eee357574423d823c8ded737409284dc37e1a9e0f954e2fb5fa0be010cb203183ccf4272b48440ac3f6841f8ddd9206ff0933ea78097844b81954d1e23f26a746a2f2ac4d7cb127519e6defe4033de5ddaee2484d238f107d52f44d6094ecf8d94e42e148c8c7e83a0a277107d4b87d135ca059e00ead983ec6f07de1ace3dc98364afcd9701d3267a0fe57f3c04c9955e1458c4f1a8755b84b6a655137fdce9f890dfb2867dc72a15a549fe89a4b6a2aa27c9e90225893a72090ed40850fa04b64617db3581728074509f78d90c79a2f04fd22527504073140771d288012281c667ef626bcb29c31cca5835ce7e59d6680b2ca6c2700725ce75e025b08f01d1de15bcdb8f7fcf3b5758de847c6545c5ac5bae99cae6c28906e2b297b1d6522a7c719e9bb6f1cd7a539066bd6ab898f8663a9ecee770ec4684d45cb7a898f917633040b2b696190975ab09572c1b700a7a8d30820f335aa9aacd51aa01e7146a2e4a71ce080d015eae15163613191f57b7fa99b34eacdd8254fbaacb732631ead3f219bf9d12dabdf70e56f0b4c0dba75f467daab5983e6b4e899f15a02a7d50651ad0a2eaa07d2c3f04d5128f0f020a331994f3ffc5d2362899f3664574e022559c941eca01396cba69628c8fe8c43339ec0615806fba4a9dc27c09681a57d929f0c81569cce1c100d8d49d4ea23080660dee51b3bf617a5d259ff28be945761f5c095b25931fcea7f519e965b223f3a8a7f05a51006da87288fa6baed883584345639199eea3003fa4002fc13489ce9ebb7a2ed76b91d8698974cb1964aac83243296d0f7af8560071beca92104e627312749c07bf2bd6502ad58bb108f9889753e1bd8bf2a11b13a6a7878e23f7842786043c48e6db58d07a2360d5022e2d7ca2fbc5a1dd87c0b8333d3043593744ff9b7f7da9375e93fb9badde38ff81e81ba4c71d710b67e52b8ad18c7b076571df5cac0f2c9399377593953142144dfe5ba0ff8b74677f3117ba213f235fc517535c51c5175954b14583a27bc9c1a80a495ba6804c14f337469e43d9528ac250ce55027000d40336f0d9365cc0c5d76286cadca119277cb497c37a63140dfc83b00bd945a85b2c9fe26376148ada4c2024ffca02ac2fe0429a4ebd3be7ea34cbcb459b5b072cecc22466b8254decb104cc0153b37e67c4aeb10b60ff39a46870a00fc4516e4ad03709f0a110b14aea15d1e7027024046c497b49f4a360380869ee25e3057e425cf33a60102d90b0ff7d2a6dc42469ca68c2d01bb0564cbc57c8fddc14c4f10b05fd4ef2d92c014fa49e574e90c79428871caad99a403b8fa1b19460284d3f3003f61868d9664d1cfe0882eba32f6a27a0c91323ef98827b226d0e1657b02d13b6362f88fc2b5ab0f9386220ae2109dfbb40b703caa5a4106897ef590013d389ddeb12a4a34282c95f78b360d1133727dfd7108a7241d2a21acf4e8f8b202857490f966e73743d9bc3534ecc807a14a22af73365f844280f86411e17720e80edbd7eb8c97bf07c3728dcd3cd17b4571949e69a0a9c8de9374640f45c80d254a5d31f7a88d3a4197607fb5d74a2e7066bc49c07c2ff47f29af1ddf2260d47ca87ab9197cde77325be808c4ac54f76a011e6d74f5a5d2ec02717f6991b7fd70b1c6e7dce3dad3773a0b8146b806083ef2134d58f9cb5d2bbb1aabad0cb81c4a43f9db7bc744e125e45b82aadf5f59159c9f5113609012ddb0f51e71b8d8f7f605825cba588f320e493c8feba4339b66722849c63771c3b15d0f2b9ff01fbce61186899a903bbe1dc83fbe7a3f2e63a1bd749108f859c1f57c3cfff069e1cc6e7023c28e4df5c0dfcfc1bae32e2f369bbe01ff07990ce862f5bee281b467c082ca46e9eba267506f14cf8527fc1369f66d45cef7b11f4c749b79ed76aa5aa442d130124d2520041c17655d2e876f9fe0afd3f3c5ee148320c49b9e43133a8e076130647a298c64fa40c2555b3e5c12a5f812a743d2c8d6163de493705f29091f982acc504e5f928ad01c852f976abc57d5f05f9481039a659998721a3e42600ac08e483137e2f605f72f0880ad35c04911fa41000b38a8224dba5d65c048740092b8af414481612e1be97094d47fea3fc21b760a4ddb0472205a8401c27385466a5d087e725cbd614ddad20621ffdbfe12b04222b1396b89c759079c94adb226a8348eba59400fe91f20f631ac09f75a47da09f1643bf4280774a72237ebbb94831d2c2b202b40929c4b118799ac752377d600d557783e7f3c9ff8e048ff06e1a5e9a1a2ad7b4ee48420743a167157966023e58428b9b4921e7e2a60c2c9dd3e027c0df7a0140f5d3a2644a67f787e3ed06ec35792a4b035c3357902a221001c8afb560db24932808de7e2c07727d201d3264189d2885e569d82b6d09e45f3421345fc1672e224c4654248099bc257469458d3bbba4a684e04ce1cb38bb6ff48d9bc2fedba247d3f9ee039d9aa16f5e29f127bcc8d5699d37aa848b77008143840137c3be293a7cdcd85611ea350af42b19eb53e8e034cd623dc28a50a5bcd6b7f492a380654682d1779e809073bf423b7cdc91c2634fab0c26dd97a4b275f4021df1350046885ea7c8ee1c351711b487ca792044001dcb06ca8a6f66d3437694ff4deaef7c97abf60cef51ed7cde5f1319e89545e9854885942055c939ce51871947c0b89a252a383b16b5250beef5c9866292800f520fe2264786c73390c8e2813f380559301c138eab9dc32a74411a0252e2406483d65f82e4a12d26216bb0a480c3188fd60f0cd35b28c4a33d02a403e70e95fe4f1bc27e5668046b01621e430f3130ef88b50725df88ed22df51ec7e7238520c888f35dfc78f8a6272df3048715050029cfe91ca9714518fd92bf1bfb7c06fbfe9c74bdb36a5f78dc171a9453aa459059e3e8c624978824887152c3b24a7f440b19fea8206ac0f1e3b6dd7965331bbe548b8f2e87d482c31977706edc033a7468bd017e69333e394b47a41163935a806e63144b827511126a847b107fa4a5c046bfe059c177d4717a28bc0c7bd1bab2525110999cc13a488c31c5c1900c20708bb26bacb2798d6b37bdd68cd35c49988c966954eeba057353fa394aab336369a7b243e3178aa0787cf358a78e863ea1ea5392a2192097d82c2d4e07ba2f84559d156a2fa0391d5c633e1b3adc786742582e25f58a250c806c6ae0ca1ccf360e8023ecc90a37909802082410b019d54b3623c1d0228d8642e725487d38454c53c3ba20002120059448bdb7266ba90e12408c23511533fe17b16bede949e5ab7e91d32e28b5bb9f1e0170441691016c27b50bcc7fadecda304a324839678f824a678631b30cebe8ebf4f0e6ac33b5115e6c16ffc11c1b7ef1f9acd8a25413058a766193ab6c073b4c5027633015054853def6110f49d1134f5836b94afa138c2601074563c306c5ed595965daa62f8f8d1cc4d0f45d6f7799a8127016b693c5484c0d4c23cbcbd5b70ff583b8fdc9dca6d4f0ec7c4daab1947e9bd14ed756b71b892287fc1dca635238d1e04fdda63a352d3151d080e11de8f9930c73082414beded797f4adfe852c69dd8a3ff79d660800cda0433d89fa8822d76a5f45d7eb83904464118d247e4601a2aaa6ba4a193a23abee4216d290318ca808cf67a00e906826959ce9570fe02df160bc54697182aa909fd25a332d5a66b3f12cff603c6528728d37205f77018f52eb1680d9c1ac27db760ced2c0b0108b94ef5ecfe10cef53b4d99ac0840671a23a4a0677db4ab75d04aaf055c92ef12aa02136ce2f69fd1f9d331705332a1a2189a1d45850589e8d3ea29790f9f0342755ed8c8afbb5ffe8a30a4befbc768a07b787d142c10d85a32463b837007de8fc160aee028bfd20fda3a13e094a75a75d4abb49e9f6a76b5fcfe90d2805facceae8fc2109d2c3c4178d61d6a464d0a099163b02ee79108735841248f713438fdd6144cf81fc66e1f05cfb40773a0ccce8ddd7270c1862be98d3a3b0c5e6b3963e45c0ad93458732dc8324496a489a0e83d2420002546082e6f9bc644c4b9469808ed9d02a0b23293a22dcc961be04f7b0834af6d716be2934e892de767eafd64aac2edafd008f8f792feadf328a036264c323d12b55f060dc1db0c8c0c22bf3ca06b909782d6231cc0b73c41558f744e8d0965f2f9626c5a3ae1ce22fd5967422e2170dcef534ec23780e1b5a24d154fa4e7d3507352a97361ae057cb8f5a1d077ea9651d9b1c1cac4f21b588f2f57c076f78455358c9b422b68ec852f0722123c4347b7b5b4caa7d77056dec246fbaf15cd2c740105cccdf04b0f66654612597a457cf6ac26797ba0f8425365a5b045ca3cb36fadde1d08619e637e8a47c07d0091add981de10105335e361ef2a9778297f4f49e63c8a19dcb68b37d37a85339acb7f2713579cd5d3de281e66a45117035420f05cdd472ebe1c4393e2addee930a12c4fdec6e2897838f769ef5fe78205fab993c02f7ad07c9a445e15a8f5e315d41afcf44e0ac777e5d7f625f748bbdcd0a676484b6e72ba57f8cf9ef28bc93089eb5c4996cb27da54415805c2546240160c34b7fe5492c0e8a5e05b04b5599a339579f2d91b7a7e1b964b03e1a5196c965559a2da682d186242bc833ba7c1bc519fceb4b29f0468d453962e06159bfbaaeb90398f267252d9708f8a79e4cc379281be1b88b274b86abab8bbf89c070c263ef452951992e19b9a1090a04821a01fc6a9384c99ff435b6e731f701b3d1be1fbe12f80c92089b9d4f7895681191972888200f11c32a31e3ff70211040f8b287f636c0f2ca32afdf30108048eb227a0b84604e41ed337567673710f834d18d811dad00406827e081509f5d8a12906259350284570fa5fb2d7e6702166eac78b8a958537cefcaf0be9fb5da7ea6da5233b36aa5ea99957508d8a6fcc451d21df55c09e02bf6037e1e9f236839989a4dce5fc6dcb6f6fee5fd2922bc646acf8f855a6411841e7bf9060f85e46adfcde966b6bf0544850c96a843881024afa85b85de3b46fdeb831f96905baa464309d8a355cbb93b106d7a591da1f13e1ea7781ed50e950ad76665ac868dab6ea48ea8167723cd267cb28e1f76eeda9d1801a35ce561cc38880ecddd2019f14c6988544beba2d0c9fd44dc80e4ef67de3a7e9e88f6320ff10a66f1e8753d5c9f54b9c8c4500068b209f562b39c3254ee9b0d843442fdc02a4ebc894a760341ba7e88a60794a2dae4ef4058d7074f2008559ff1801be64542f13f6c5a7c4ae9ff64ca8fa2939e40a7744e115864b42a09800322250ad1f1b67aa93a4526e6f8f34191a48d1b095646083380433b20b4715572c8bddeeda01ba1db44b66ee9ef96c64e73d4c7627a071d816370e3c9d026b9b01ee55fb522ee7d14f15ac77ca95d46ad0001d59d6d192f6f12b9edc2fbdc168f98a52e6efa5ef0833922a8169149533b349e2b7f69122e5285a31a71120180007598624272126539866e70af704556c50539fd1256e1e63dd9e04c0fba469f16d2cbfd2ba70654028e872a9e19d4cf16102c09069877711239a373598b61bd6252cbefbd8eeb258d76cd66bc98598ecbc820b197041d892f4c9412cce388454cbb0feeabc9d5bfa2ab1aa5961b548dae9c62a29d27447c23e273af84694470bd28d652aadf888416ec32ea83161f511a7d741d1bc8ac042569dd2e467b942f4430ee7bd879cbaea31522dd20a401674d548e695038878519c3dd6556c40b376367d7db75e012811e61c9713b92f9c627319bc93e5bd2c20384fb3b26d00b7f67b339136082660456c91091738754881ef984e1ee7a5fefcb0bdd092f05c9a3cbee02fffc0ea962e3a2a77504450ef923df80b0d17514433d2440d4b3eea696c01b52a55d70e31a31fb1d7a37cb13cc3784f0e8c85c4f13b4135c15e2a737846a9dba5b85fcca2f7b12bdf0fe3112be17eb22ca201bef0b60c5d95142ca987b43e4b2150629ce7975eb416962255f7deaf6751e931635706f730d2f8d70994d81ce9c21803ebecaa9a8db33c4b8c7c0ca68e2d41db0d23384eb0e408f14d69f18cdc7c4b9025ccb0e7285670874596748cf60d8c2fa39a46187c431d11efac219626ea65975fa117b56d5a77d6b2982ee5dd06f64566dff2df7855c86b8169f21d4374b3864ba9fa7b31564a207ec36037a8586805b301816a703fdb596d92c46a7985c58b5c80ab46bb02cced44961777122c5a192c008e6d819d1d4429a17f9e7655f03f42dd18f43f7e7be0e8870c9b4fe7adcd717229d01c9aaeb5ff78607f459f213f605a1bdf7de726f29654a32cf071b08f00756d334ab91d80aa12550a03fda68fd88a383ff2a7e94ae265e3fca97944224054df0c18a083468a287954ebd4113adaf2f82204c49414b87275a10854e55c2901464d4a0092480a4d0a9de63a2662c314208286870454a8a8e84892f859af8799797424df840a1b056c88b227badfda2c81747ba6d08011d2104c4c3bfbc146a824ae6d22b10cc891331274e44a1733981819127a834ea9a3f5420615354348902d7443580528328b01a188183b1524a787e76f66d88d9d25ea2d31b1cb558a2e10e27642c21c152a9540e373ecf7ea305a120923cbb0c3304a1d332e04e28881c3c9dcd5ec3940c29cf2ed3a7cc36e9e40a97eb8fcab5fea80c56ad6af547f5aef469cdb266ea55cb6aa6596b6d96b9f623d332cd5a9bd9ec47e66959cdb25aa9f64232c4e7e3c339a5ee65963dcea9677d5a300828849fbde3361b9fb98dcf01e077786d26fd39ef48a47b378eeb38aeb363b6f96f21533bb27323c7713fb8ae9cad1a67ade779dcdc39f4a4d36676dbacb5d66e5cd775dd66addbf0c7c66d5cd7755bc7b9057f6c1bb7d9ccbdcc6e9bb5dacde521f59af391233cefdf5e733aff7c6822f8ce19ecf806cbd504e184f05b6f97a3d1e8e6ab03c03a22d1d0f8cda564f94df3294fcde25b386e23d9e2c8bffac873b4b461fec8bd1df347a125e26ace7ffdbbd1800b32a7fde5d95dbcc5a56469e2d20c5ff19157bfd1a7d28cd087f8337c4668433a0c380269cf7f01479acfdc056c0983d41fa5fc2bada41c0f2fe4d06bf6e66efed13eb2739fba661e32b38b713b97929b3b07ee49670e99337f76d26350731b58fe9336ec1a08fef8cdfac81c2883903676fc61bd9dcacf93362c6d12aeccc138b8bd5afa3580c86be148ff067e410111a594524a29a5940a1901fad13ecef49bd5a760a488149939086696dddd2cb9e898396ca7e16efe4b299d52cac641dbf186e39c33ebdab4c36e299d8cd7e253205c16dbd92533966005aa879559891a936080f13274e9257413c513d32658e3494fe305ebd54c9ae8ca18e405fbf29de6596ff338cff334cffbbc158fc56bf1b416cfc59ba096d5ef60bc191e0d8fe4cd989895195669437dcc9e8e20f89608a021f8768e29bda4cdb4a94ff70e4434707a8ff5697f87cd3cfa8964cc4188a2894f11422a70ad04552331d3893b6e2d5235d28a9952dc716b7d7bab558758095a81d1f0c17ec1d6c593f50deba009abb212313f2b2ec3e650f7697a7ba3768645e993f61d45caf70cadab45249743eaaa59a5b60916bf66dc13066fa75e7f3e64b84a2235eb9bd21d848cc06aa679cce227dc6228ec6ad48acbf0e639ecea4dbf3f186ac61a96aab37b9ea373ccbe69a1870c3300c16187c767c58405e5d5bfb344e762b771cc797f0c434d388e42f1eedcd16f101ef2adf3e04f87d7794fef7c70614da619717dbb06c326b2a08536f06732879f7bf6e4ba423d036fdc20e13a136d4b5e47ba1ea947569a5c966ea54990115d8d9110102d21648b5c44655596cc992e69acb26870a5ce61bba4a0e8a51010ab67e1a5104fecbb9609e58eddab85a8cbe15f32877beec0961e69339d8297256dba151daef5192f99433dc7b42d444fc1f8b17bb520f9e95af7fa29f4737a65c99ccced8fcccd923992c5e148c1f8180d20241db26466c9ac4d39e79ce3e8e77409da30ad94ec1a3373a801e1d66b34d040c30568005283101c3867e754e71c0e811c0319b6a9e0d2fe248c633c74c4e6601b4a3f69b1877e645851b75a6c3772d9db9595a09b73524ae9a5534a397dce49a59452d2a9c4f550d3b4496b15547a276bad36a363968dd6d6b1329232e615b7afb8edd5bbbbb2a40df56828bf67aa15546b9de1487a20a4d77c862eb458bd5176c4a17117192fb9e64c13f24c9842a88decb99ca81a37dd2e73b362ce595d6c17c0ae47966559d6a34f63e659173ab0c7136ee7a364f1c811f6e025305e49232f1c613897b2a57b09c7dbb994281c9c7e3a3a5ed2a7245c545d1c0577e49e566999c73de278f3a9e0763e721129a411b60a261c7d148ee24f179083a44d751caa6be1686fb86171a98fad92515af5f5f429f3e913ff785e3fb0f32c47d685dcf3530ba94f0cf3460b5f9d283165b45a56c31fad111935cb142b9e9e677929f483cfcb96ba33599cb2ded7cd1596dbbff3a3cdc00f481bf60a8a1a78e30240c01a848043404eb1acb4b0aa4fe38b674e5fdcf331735605715f5e9c53b3ee747777e6395a04d2860e9139ed85b3e7059c3e2d0e9139fc4d1efa423f1d2f3c13357fe6cf34f2f3e2daa7c347c7e479c26d1f27cf536fa056f1744faf7e7ac953ef3c500afda07a0d1c67eaa9cf227d9aa93eedf4490af9a092423e50f999ea93f4248fb5f7328fe7399a762fa08d16a97be01069437dbeb4334f0e212dd21a5aa45996695a487d82406e3e2bba812376831d055e817a13fe256c28481bea9b0ea8cf257d62d2c487a1974240f4fcc83c4240a85e09c969e8538b5307d2a7ebd46be8138b5317d2a715a78e439f3ea73e44e6784e5d04324773ea23601c9d53cee9e623a77e335124a7de42a364db89ea1e6cf4e9c5c5a90fb914529487d2c1bccc28d170d92afcd8aa564d949526ea94864638924833c2f15e09138ef6ad535781547af9d1763f5a1d2c4d6c3eda796e9104b2bb802d97dd9345cfde91f1ec5c19cf190e0d354c9464e1308471a458a54373b4cdb27094633c4f168c105f70408822e0e0073598811052d080288b24845d1819438729527aa6988209027841f1844f129620050f4da4cc60079917422810c203f4c7774aca07a11f847221f74cd1304218071be115daef65232fa9d04ac58f3cc5b76f3e384c14276953330e4622576867f2cd440401ceefacd73c7b859b489b760a83cb0022d50659e5f331bdeea061c37e2091482c734ead8b66a552291fa2c0b5f827954a013195f0c9c087aedd5d1dac3508cfcf6e893842c7992b0d2d05e2093f7c87a365d661660d892665bdd5cba627419af94829a5d2734c3927ad321c69d0b4b8ec1308c9e5a474d69e534a94e6da9c734eff21bdc944be393128e51670b47925d883fb7c84a0698e1b373793663644b11e716bdca90c2907d21cdd1cae95d7fb7c7c3e3cb059bb0191c3e67596a7051c9ca6f5d61b37b466415c1ba258b3eac3ad71cf342a43b27364a79cfeb24551703d6b37aba580a7c6715a8a092554b9df4b2126867e70b997424c7461ad156242076fad75b73eba98456c9aa4961de1b2bc146282650426805e6462c544ea072925f8d27b4e673a7bce4949246b7b764b99d393a5244561a5ec6c458389fdf31d0b67d9cb6e1a8a60921a4210a2a4865e3f72d11226fcd8291f7be7bbc82481ced83cddf3b2997cf718506064b4544570e1022e7ee4d60b8afcc82e8ee29a2b5714f99aa1654c0592354a2adf455c8e70821e4c09b2a2b5b3c58fdca384107ee41fcbba99a81832be3802134b10825245a779f0238e0b9ef82f0755907802864b8b28743acab75f2878a3ccd39a17a860002f98e2a9937a78eace85f852e2e8e75cfb74704f52e20827f0b7167098b71ddc91142385c688fd489a2812c9a5c40ade3ab5dea78e822075528bec34741949a2c16b2ee5c953dfac66b9c0045f9df669000d853bb60b861253a914095814b413d56d5756fc74daa71b3f83eed8b0bf11b9135c666f57c7605a14b77fbe893e2266e9b2382c17259d3822091fa44cb852f2ed25eb7d440fc7b870f1bd3aa28406df5ee32e514495234cd2e2083a9aca27dca04a09c24052029e1d1daa8511440062060f9208e2db6138aebbef6d272f30b18513c238c110501043a77770850cbad10b007ef4a26491801f6d3c6d418b5fc19015482c81c40e5890040bc478ea373849809e7a0e1d9eb6608ba7eef2e9a0ae235c276829c00aa2d0d196b6d64d240644e43084095ac0ea810c9dcee2db6ffad47ea3bb9d6db37c3adaabe26ffc2833da58c08f379e1e6182ebc453271d51f4d45d88264f5d5c22f423c6535fc129e99085142c1882142c94b0eb67957949d0efd341a91158b4f0ed9e13239c9079eadd4e09f8c451274584f1eddba7a3a314f1f3d42975fbe9a09b166404e0a96b48f064d2e5a3c4b757d6f51ad1471552b6d46f9f10e033860f3ad46390393287f6a900dfdec5b7b7b5271762c099d42f7512759f28224055d880a70b2176924ca14375f0f48a279efa8d3e694f434a33d5a5940ee13aff7ccecb19204bba6ea5d53699255ed5414be32016a658a8a6c972152f3ca100cd6a671729cc1e912e2907456d9229ab03559be4d34f8776274a0e2146ccb639b5dbe6fa71ade644ddd16e1b112940b1e86c3edaec28d626f91a16446d927f4945f5a5d012afae05b6b6b66d563ae1b6bc143af2a3e5e08418d76b1285dbb5cab834b4c88a70ed4ba12346f8d16377e5a5d09125683b377b291444ea97704d93fcccfe12397c25bdd788f4fd59082ab8e8f1da720e7e1cfd0e43f8bc141aa2c88fdeead96dbc144202f3809efd028dda5452fa0c7d9a4e22dd3b5552b4ada97289da82724854f6338366dfc940517e0b6a917d63855b9316b902557e92e0a7b7cb2d68a23a5807035d4022a5e8b64b1e3c6ead67fb823b6eaad274d5446d524813bb108f15cf9ec5b38ff367aa264aeaf0543dcf9f2dc8bae07af693fddcee88baa289e22480d83b58ac4f52a8a7e8d9bb291d953ea58a783dccaaf1789e3bd873f3aa08104f90111692d6102e225e3eb03e8dcd458c09519fc61a0617f569b450527d1a371e9e872bb8c9935514292dfcc8ab294c050b86f263ef3c4924891d5017b4056dab4df5ec164a9f464b64c3c061ef81d3d2585a2bfbc952ec95499fc6daaa5c8c20a5a3854e5ca9639d86696297433a5247f351c62460dd8625d922119dd74771c7a9ead734bd9ec7fe7927eed83f44c89cee39c3127549411c86c8a22164cef40d0091433e6a58ca863e2603531489cc69e7a15712830e2c55aa4441025a985aa27d04724867099f61697a3853b759a9d4f7105c4da49e8bb0aa4595111e23f7a5131f24be797a7cd8bb489f4afcc34946fee970bc5bd04f0f6806924ed65021dce95f6af719e367d875c8f32d85d4270e4b41d765ce7456bf4c9705a26f1f13d02fa1ef2acd9aa6ee9734b58f608721db0712e5d224bdca8bf1a210be6f8ef0b3c86ce97e3d53f123e5db6bfad42d24c494fe81594242c87ef569ec7116f9f62edd1fb5943ef115df38f8b187bedd1eb94e826116e92f8a203b8cd6a92e7378c80f429236d45ba40d3b9764d08648223aec76a24a326443ec24a273a50d8f38dfae457165b0aeb90db530034b3284720af1193ea0756ae89367b6c541276b765a64da22dd815ce82942843b3a0e7df2fe962f66772e59a6e16d31892bd3221fb93ede3cfbbbc0b8f7b2d6e2428f4f8bf2893cbf5f2183235ccfd2882a5eca1b743edcc9cc75c5f3fe7470d4331f2ebb0f7e4d7b293446912fb5d73008f5cc594aed2cbeb20324c9780d28823737705c188134a4cd7418b9c2f4f06e53ee285f13a0409f6c05b9a78c16e5d7cc8f67169452185cea12c8e8998e9ee91672b6b8d06364bcdd4b2745f0f0e3ed9a7b03bad6863447732f9d18314585a2577674f283c4532194f8db27215cfff1aebc747244124fc3f116f9ae3ee8d889a22ea749521d8e870b503b9d4e97cee10f0ac5ed46cd4d9a724241c2280d62a534365131b86acc1513d29d1a73d1545502518dd52995c8f356b1209a56633415847e0c2e97eb59d65a6badd558a51e0009aa118460e012726248c809d7068605a25a567ff89a92a65a7590b2f6f034abb1f2b2f5d5c7192fe70c8c8f1d94bdec66d044855ec3307b8541af09234d324459ecabf7ecbdd64d9673ae30c83f8348336803e38e591191aca88c3ec5c0780dc3594452815251e14e09433bf4d5bbce60ac31acc54a418669aeb9b838c36260b2a21fb5d4d7a249e363f6ca5e32e70712358bb21ec8138c3741952101950de1abcfa289a23da47b3bcfa3ec346ad4802a8021388b483ede2212859148a4f18684229f509c19d28b7338ee33a1bf84375264a7b0198e3766c2514221c927cf301a72cc49f10a6db8bceea5398c779ce5589eb4288cbea88b850eb15856a8a6c1680e13dea08514ca8bbe5a74c1b88b771bd5368ff6cc4a7b2a8de199c93cc3311b1817c7995d3c865291223b89163d7bad3ccf3e138e24d5f3fd1a40e45d3c86658b2c1c0303435b3031e1485dd3d87fd090ba60420aa5c5ea1f7b2dc2ed583ca6bcf2e9a0217dd262a54e7f1cc1d39012b5c83e0247fe5166efcfb89433546c9186f4c977475a4b0a2e85a05892e1f469a44fbe8ef4f5d5a994af3324297d1ac94f011cb548e333e00b46231c2de925a42ddafaeaf4499fc69a0a9aa8a0178974b59026f3ae2ef9aa2909bdb9b96b8a533545c3bc79d449a8ec354dd5a94b8c931847e6d563640e7bf5923ccd78b53fe3e6cc7029519a34519fe133e0941aa8021882529a46161a03b2ccc005b44db8f21926dbe1cfae3d92eb31e018e39933e8ce7a77ff6e25f341f6452646edc9c2a83c5911aa2a7b655d642f9e4e53347557685c087fdda9a9144d4853eff292655906829ed1d0bccc242d5607c1b9f2667c86c6696a96f104eba96b7404aa10fad8f235a7aa83142bc326aa26ac3c4853f55a8f285241880f7fa8295e8104d2a6fa485320e829d053a08f247f9feea067a39aaaa9ba5355bfa2cd7098828fd94bd3c259064d18c266118d3ed129334e871a157a750aeb138d570fc199a44dd5c1ea0e4e262e2bb308567ff0508bb089a23d5232d8afd080f3a745928f384f0564a2eab467a21836138ef6b7252d565a53b069aaeee232f217a730188781953c057016b558bd0638f2d7c85e2d5624d96bb6ac78f62ab55c96910c58535595bdaadb5b0aeb4e8bd53b1fb3d75853191060dbe6fccaa464b0cd7a8c7c123892aad3005f41341830081d65af1fb9d4d45727dd90651651af45a28d9b1b1b48410b9442efe8a18ba11b21287ca030f2920a94ce640d806a0f10d79e27248a5faf19d49e5ac4a5330993465515509f360b547baaaaf6549e24fc9aa8ead3a6f624b02dac3d33a8f64ca0da537b6acf64d23e81ea4f7bf5a93db5a7fad49f4c3342578730032d6b7247f9aa3e016bef2591b823ddc02433cbb34aaed03e7ed47a23109ccf7ab8ec5915974853eab2a953299de2e0bc1a40e42d58a2ce4c431f6186c338230eceb3743995af3eabcff9840e7d65d5665967cd561cfc6840599fbd10caa0e985d0701cc17348897274f7cde02a51599d2d061db88acee639ba6e7ea34f1318adb4d26a452ef5b1a4b9f4ea548aa0c8a1343197127202681ad984a0428c1f2ac4007ad922cb214250b0a8e0e20a7a836f6e5ac0c1e19e35531cd57b655aa49eddc1d68ccee60a05152a5d5fb30e491b2c80e83a29676b8b2b39d0c99aaa63c192d4691d8e87cb52e7ea50b728bdf03294d226ccc13c64deb6c85c74343c43e52cfd6df188cb345446f49a2d6e6e5c5b8495347536d3249dac195b80be3bd593d66ce33aef5b61b92d2e2f2319981934489e9c26250c2b22228af12cbfd8c5ae9898920ca944238519333015565f1a13462fbbb8e3e69a45139512e385885bd39485dc036611fdf8b1ecb7a8a25caeafd085579f12fef90982f9943010504c49851699146a2e537fbd74caf5756b362e36d7a6854435cfe683efe6e1a1691e0705b0b9686f51be6115565f2d7695d23e3d3d324698c7f57205c0ab5b08c0c3a10622181e7d4a382556c1dfb1be60492d44130526f0bac00c302001f868880d40860032c4e0d24c26938c4d565fb7be6e44920daf6e716d3c283fd61777fbe6fa5ae0c7528144756a76f83da1f2b16eab5313f5b1be4e15204a8b9b6b05999baf8a8f25fda342a236d777457db5bcb53cd85c522c122a0fee4de6f4634d1378ed34f1f0b126aabeeaabbebe6f07cdd71ae5e5353e2524d20d0bcd8201d8003207a85fd4973475f581447d1f4b08df4f5ab448f858322994626ac8acb400812adb755614ec306f402d67191076faf421293b6104414f9dab6d715ed1524adade84aa653eb253ca94669456974228a532087d21940ea57e7a576dcac720294182f1ec1690283b67903994472612a75b7baf2b8aabc586a9ec1066ea69d8af163bca913bb68b5dfd62222a32a7091207edc18fdab307d17e64a21d14ac720576f6c1149704c20e84f05a48e6429eaa5311c25b71b3979471f04b0f679036a01329d270e49d54754237aff5e9331c32e5104b4447fa04e534757b87434857f45b9261c39926ea9b13d1b16149063be4669aa85b27a2e3a51d52a8092a25094ce79c0b45b0853da649a7248116810d734c930eafb4c816b54e03b31d59380ae9cf5ca809d8cb2f0b6ba8cf424d0cd1a63ddc7a6ef9e9a0edb33efd54bf64edc8ed276e3befb45a9f69765a2d9bf507ddb626e69c56cb66369d9833949377a8526690399a75761a644e7518dea10ce90421bc74208d9a8005240e21bc42fbc61f8f1d56dcb1533b322ff9a0cecee1f82328394d375431554c9584716c3b0748b29a28db32c0aab56aad9e300e3bc4c293d644d9d54d6bd55ab5be7a36c438ec9315b2d844595501b25816b3aa2cb6c3386c129b1dd54469311baa982aa6faea5a12c66177980049bebab69a286d00e168afd65a7d750080fce409e3d0867885d61c52217cf200982d1566cb24866357a702600940c7d31501404da84218f27445be7a0dcdca4cac53d1c46662b14ef5d555003f6f0dd1b4665aada1af1e96bc186ef5a4c4ad62b815b77af2d5c1143a194ec5252971aa184ec5a9b8245fdd69703362dc0e8dd88c588cdbf9ea343536526b88466b46ab35f4d5675eaccbb67af2b2ad5cb655b6ad9e7cf51460b4d1a6da92bc6c2a974d95e4abcbd08c63db4e2c16db76be7aa9a55edbb2430c23916e685b76e8abc7bce0d21f67905d3d59ad564f623efe9a34b12a9b846455566593b0d4e839815aac5acceec4622b61ecabdde9ef3c9256c3f14bf225d15a13c5c5b421c6c1ad7885ea2452a8b5b49636c4ad18070bc91538a2af54489bcaad76f4db90594a5cfaf57c3d96c70cea531d67933e815fcf97a4510cf4f9346a07d092afde09c0eb017e3dac89fa7ea6a967a2b8d8c7722791eed7d3b1acede162d5b36f47c7e26213c5ad0923b1b818b362cc9236fd991297722d1eae35510cc4b5a494b2e3f97a5a012ad7d9e1d53fa1db3e2ad9e15fcff7e4ab77a6d1fc947cf51e6932cd666aaa2b5c98e201ce9d363d897780fca44dd51968a2184ad78f08896216eb63c12c6245c77ad2a88e679a581e8fd6f17c654dd4e7d3a6eaf54bf2d5b3f0eb69b1fad7f3d5e90ad137ef60d1b5772cfcdc2f6b6a4496363cfa5974b0347127b7f8c9f9449a7907dd4231e0f96e086449f4941be8ba0d8c4bc71a1e352d62a0eb58b83f1e53be60922cd38a2f5b6e605ce91dfd78786ce365af308756da4887515ac40aacbd57127538994d20039f974e5e0a49f1fa2e4be2ced544b16bc5017d536994a565d03276768a8459126d7b88b89c11ae67a232a7ad0985fad8169446713fb6d5275a6deb67a2e692b9faf6cafd7cbb266a2e69533b131aced55c714048c88cb8a3f72d0a4de1397bce9e73c7ba99cc3e8fab5969c5d9372fad843eac775f967959c67167b751b47123739a85cfea0703bbd7dd9dbfc0ee89df75d7851c2836ed8f75abd3aa84d0149dcfce67e7d335ef585713a75b7bef9435fe9be266ce9ed1e08ee26ba5cfa75b2f7da10ff167bba8b966b7708222955a4b4d8b76b371237338d75e723eb2c0d50f86e91d57e29ce9f7c2f42e2c719c73d3860de9941fab46ab3c7473ba5339a794cc9e85a3ad613892a80dba67a12898d8e9313373489bad65aedc846fa139e79c73727b31e79c73727f31e79c937d4e6ed89c73cec93e99e4c59c73cec93ed9fb62ce39e79cdcb09a51a572a3019d60ca141a9017382e49ac5001101c293737a303208152849114f9eab290418f7c7931895ab5821d2691172db4c003ef072d45ac0185084cc4fa2f78edc1e4542a9512327f5089988924525089bc90d2b1640f76b0a26345e91fa8342a80a0041569003c50620b20242942e84fc9a23fe056fd81891e5a4c449148810998c88b4a450737304af04009eb6d43ebf2a9534b6916de50e3331f2d38e79c73863664317509f7a3366836b41a3badae69e0382d6ba10d59a88427141d0ea9542a87973563e6dfe6a3f79f0e4ac11dd5bbaff3cd6e6e0367c31b6afcf591fab6711be7d6b7dbb9e47ceb213bff3afbc3f37b9d7ab4e5c5472240ff7955bec5bb6d72e07cdb4fb903a5b4e1ac4b99b3f9e7d4e67a8eb98144805e7e3bb8ca07aeb80dd5471c9e8637d478cec391be60df86ea1df8b1b9e73f369fa6151ada507db43eb2a10dd5adafb8dd9c82f647a1af6ca10d5ca86423ba2ece2fe08a032102f49ebb809ecb6749bd94362de1e885d4578800fd4a96f94ae62b9e79273d0bf2cb891ab223abd4e08b30c4780214a2504567e43ab08e4ad3d98188ce2894d3647d6573ea16a42f644e47eb80ccadcf70d49eca15d0eb9397b907fe98ce51e7c29108cb139773aef2e3e69d03b42a55aa8cf1d68623176ea19291f7a7a4f4c2d3774206cf8ff6493c4ec658f2dd37646024f21bd05ec87c1e55aa54a161c98775ea16861210ed6f989f85237fe8d2de155d03644e3f932b5d3f1201facc254987cc8710d1c99cdd669953b06673da16b3b0d5935692acb7d62252ac35043f9de72ca283b5f48b8debbc8fd471f2bb9be5155a2b107456ca9481c8e1decde650ee49ab943224d93cba973329a937e70c6bacb492ce9652f2f683c6faea9dfc7494bca396d21aa3540789ead5aa87af5163355663dc4b3c1f6bacc6644e25ea55af7a49afacdbaef35ef5921aa6a9ba2caa65a476b2225dc34475b7be3ad12aec95112e0d65f2d529500cb7c66666667c2475ad31cdabb13e75349eedbcf87791971a7bf131f3a9b15a064dd1ccccbccccccc10d5589d32e57a9eb96a6c86d2384d285bb4fe9212438aa6688aa628f55858582c57639d1753f2182010011f81233b1a59d03dda8192cb6caf26953e69ee81a347531e55d114dda965a8beb64fafa42d53f5c9d69d2f92f1f4e8f1c9509aa2a9896ada3d586e0b8dd35cdb83de1dd50d99965eb93450af7a4985dd1b3246523b2a1e233fa91e1fd0479aa4a573a1299aa23b542563adb53566ad0d7bb8e02e845f893bbf60bc52a9457da26554298d72af5e5f7da2f1221619c9ea550f177a49af26aa79ca8d16656253da34a349503369b157bd6a2a2dd6ea34d5275b5f5d575ff315e32980396c5863312ee33556892a154dd32878a3c51ade749d73a8a44c9676496c15d108000090002315002030140a89c4229140304d85551f14800d819c486a56988ac324086214a48c21c61842000080002132234304a20400c1d098782d265c4256b60f75f82e1b090eb9393b97e867f01e3871bafaf093e62057877d2eaa587fa2c2bb3eea047003eee3bfd0c453ad00f1233d231b3be894939c57c6fc952b85caef5ff15ba5fb1f9326a6777ff308e22565e34ed97eefbf1d6205e93eb4c8c78a3eca844f1ab2b07ecf6e74d4dde42f42b2831c0775954f6c3d4d1c8f22e631a3a94eb3623a03e74f7855bb997e1847835b9a1a9625612c06a00f11aad94dc678600fa8de7955633a68645e8e309bb6e51dd99d4c648cb7a8cd125885acae6a75b4a2dac1ecc8a2b020be8a10c95602c20a3c4a1be6aacad24b83697a8e68688de5e075a9128406c41162c39ecc4f52175c7988ca78e0d0020ba79e43203987363ca47888e1f80663168c4a4df23fc067f0b489e58f9ad32379a09ec87b1eb4b29854d21286d642130e5c1ff9ec7698af87fd2c961724191883818a1df1bf0cd117a332610be4a95618e33f7cc819fd4c31382c2cea4bab51ec9338d4006f8eefe64254d6002b8705a1bdb3b50db51cd1373e009b7f11a7221419e59d641e06ad91af96e5ce27d914929676122116f4109b61ef3628f75cee7713ff0f78ff51d621cb230ec50f101bbe216bcf14748e44e93e88f1c93e983f22a5d0cc2ac2126663e4e866f035ef9148a097e1e43c917966492339dc85abcd04c3fc47f56cb8ecfdadba15e8c57b203857b38825afc06f43887efc348f12cd20ed8694c8c81f4608ad8d38dd68c817c04ec7303010008a94de6ff831dfaeddd5b4f4c4b4c3753ac3b0f59b68bfd7bc81afc69be2c5ac539bb9b0e99400313a6b8d73f643cbcd309fa96b90ffb244f7e47263435e6c251e975e037860a38c95eb6a6dab3e146986a1b4f25bd58789f1cbeee40b9739a3fce9b7540b027d785f0a19f0df731554f7ec9350fa3d7acb38ac4211d753093f9627be4b83a084de9e0a61910b2457a9b37a135e5d11375fe5194a522c00493543527b7c5456e84a780afb5cd86cd6f0b395df016b6f332dca19327361975666fdfaa8b96b3db8042036848df806bd409dabe1402f8da0fd38214cf047ff3c6a33a3e756912ba452028265c3cd1550a18bfe2fa318b27793661e2c297dc71f368428ca6106461bb884e1bf61fa92586905771c4b7a8570fa7a7d2afeffa1a9fd3f1cc288217e4e2048b8f3079be7795bab475aa6985656f170471e1285261e935cdd64d208821f2237c4546bea46e9ded5b3213e23d3d3ea10164bba8ad4748aa0053e43112748b5e2c27f569e27b84159ac19627b347e316ccc51575c779f3a7557792537c3fac991ca48b50693d8a7452261b421dcbe3d306c55803be235e3b818b0e1ccfc59498680f00ed2757b864291f0965cdce6691817ffca83b1a0a83ee88d357ed3f5b7b3c13026424b1e6948c46ffe1f2affd3626037ea280d3f9ec5c407229a298fd4be827ff066272e5fcf6ea00c829b5e0c024320889699a0e53816b470c6c3166190d9c340953e4616df42d0ce7ca37bea85e6ea65729e27a435ca684fe17de8308a4d946b38cffda9eff1e8a8846c3a4493513de6b6642c5f1c72d28ee8d02200a4195f3d1507198780a330cd54a3995c4924901561317e0b3daed2222db425e7eadc286267848a69585f6cd0b210f214b06b6ec1f3161d69e0287f41fed3fef1170dd32812ba855c94c0cf9133b90de5090ab47235db2c4365529787a118b3bf5caef8438d307c71f2dfa14ab0025507b0ad0721a7ef52cac10a88950c6d8952c6b9d9e1c5a3d05871510888f401915391c9704d7839aa7e498fb0e6f52b16b20dbcf81f6460cee698fc32ceaccb123db3afa8a1d6df80538cee0de6797f559b038e81fa08964934b89d85f0300ee7e599c32da723c30d8388bd381a6e623e9c2e9a605b1cf73f5369fed2dda9bf5802c7b8747a9f375d76201994cd14a70fe88925379cef9415811cc82cc27c956f429eb464349142627137f28ca8c9af4e18331d9e04b1fa32e140ea8ec0c14a76443a82daec01f3e5244dcb9a7924324cc35e67b71215187d8d76cff8069c34d3e5277076155d9a481417fbdac21cd12223b31dd18916adeffd03c958d536b86a4ef46ec9bd3071f5609522f4e06454e5ea7275af769ccd3fb83e6cc4fded2f06f27907151e9d9c2606c0b7bf14b1d0c2fd8f7ea8fefb8bea368aeb77e7940c2a0585b6ddc354d14ca4fa737f89b11f151bcdc47c663d749622e098c5ebad694c11b31c53fe95f81da3cdef738180620010539a68de257aa1d90fe27f9715104c904ca838a2dac7bc05ece6d6a7c3aed3e4b021f0745f464689708ae0fce7a7d8fba4518fee228ebf032d3065205dee1f060940504c5e2ac9cb725fbedd175d1a0f4883c47412720e9e4c3857574ea84db7e792100a07270153d43661746a047b0b5140421dcf1526690bbd8c66b8d8b50772ada43f18d49b3c88b65bd970a3f0095ad39dede20dbe164b0e414b625709f98a7be68618a33d3a634ff4fd6493cd18358163a11b5218901e01f0a0f02a7d663ab635d7ce54fa708e1b811a197f88afc30a8805ab0307d4dc278c43a5a3154fe488fc39ba5f8c7676457116467727b383b90e326148a32c651696ef57ebe53f45f4a29d042787695cd2f357ffad8cb67d520c62351c258d588e929d6a48dff83173f4fab6531643184adb5b326261f8522426c3509a82c39868a01415749f8c77f19172038a7c6e39fd3d7f0fcfa13ebd60706be58dfb59cdc5c4f9a2001e57645cf0bd5406ac1ed9821bd9d4e4901b09205010d3a9d578051a0962265cf9b75dada78cc921cc1da7c4373f678977c60437f631579b29e307627d1a5022f02cb7232f8cd5af1b1f0bb0cffdf450825658568ea5e74b0e6a50d983ef0508a818827cf9b5993f3f0b41343a78758cd373fa80ea170d0e32709328a1f907704315824b24d0e4e61ef40027a9120f1a997ae8b6bf56c4e3b9afb01f3a5068d2441aefceded2df5fb1ba8575f795a77de3770a6b2e5cf9a9bf5fb03b85b577cdc762d07a0bd501838bd63c2f3175864598cdf559209cacb6e55678f538d80f62d0028d1acd2d32ab32228291db87cef1b19fe6ee8501d55bf43ae6cec48f1296c16ff419cddb4d27345973af0cfd0c6e2f8653e3dfae584c03a3cfc8cd4bd04b15e087eb4e6bf02e768a5ebe03d5cc01d63ee0bc1231f927ef40a1180f159c50b2f55bb1d79365bfd780cab2de73b87f7cb1b8aeb2f860ea2afb5423c6986f101215dd68232a76a8a07251297726a82c537da0fbb25bfd7c9a4023f940ef83d7cf55e04dcae84b54ce5f35fb42e5a1c37eec585763dd25731957f8358174358b6cb4498a6771dd4d79d1d2dc5eafe4cd4bdb571e0c1034aa0a7e92641102af886bcc856a30d0fc67d91bb67d446041afb2a7ee5ee92d0b3142802674e0be87f22815bdcee42457883ced2c2dd27b90b08a3df9458a45af35b2ad99bed0d004ccdb07a20344eb20a4d8309164081935f60032221df680517292eec52b9bc5e751d101ad70019abf55337e65bdde81724b22691cd6218f578601ee891207b31bf2345984786b2b3c4073b3fcf73dd4ec4494b57c92f6ea5c0ed3004a62b04225c2ee11f031e7848165e0578e942c35babaaf45f3c28f8adca316e862d47bfad87041c17d09e8edb2dbb6be992be2e9e2d013e18991f1319dc240648fa0ff4916f6e076c75ee590583b4a22c0cea64ef2066f19e749509d08863b88e7a3a429d544e5452e8538fafe3a40cb87589ffdff598869b87770630b1b81095d54652cf7281215a9c96049143ecaf94b0fd3c1af2b86727e80cb8b044e667ca5cc8c67432524e986b8512f50b12d42f7794b134a18ff45d2df6e3a3e1b97bcde3f45a238ba322b3745afff3e46eff664277ae11510e7c27a1029a241bbc08433cc28624154ad1607c5a367dc6546d3c3aa7b4956877908ddc54cd1813c0251dad81ec9c05b4b2b40ebfe419d71255a328794886c5eaf9353654a1f91e2c30aadd375a75ad35a423c0724e5255280cd41ff147f1ed5b8bde4f1f8f6e398c7e1b788ea86e7cf4698c04eac9fe578e33866178166a730b722b5f2c43da6ed5676578342e390180ad025a59ba15c535ac07df1e443884d9c3d35fd2372e8172b91dd7de210f5d9b3f94d00808feb2eaf3a4f6cf246d139e20c4db6a5afa04dbe02290c16eeffd424c9e07be0ca99af08bcfe899bac19fe61602fd0d6d1043fd5669781b8900cbbcd491f654ac1fbc401acc8f321169209972b7fa078cf129d5062ff6a4f92f99523a4abff8976005726bd9a0e0e7652191573ac0856d333d4fa5d3312a4e2093d3a622b92196efa42375287a3293cefae00a50d3d498c8ba9660f2d517f43d5039038f77365842105bcef57f8aaec7b2ad8c75ee9d068cb171e4a80fe232b5d327deed553cf957bd8b2b306c0fb27c83d42e8071b202ede06e9a2ce65710475a77a62974840e070243a182e1b28a5cb9aa72434bfab06c97c18a0cc3a1cb4da5c2af118b7423969d530fbc13ff98bca05e331cb85df0d7a0a9fdcabdc143f8651e8135a2e72fc1d4807c6e55c7f09e8b90c5f1eb622bf75eca3581a90464e8e97d31b7224c520efec90a383b3ecfa697a1a7f30e42fcbc5249d52e3f0c5ab0485beabdbd519e64fa1eac0d4bb1045d40d482c1edebdf88e2fdc91beabc62119896e50029ac5161df7f3b8cb22585cc50e5a67a445c26cbd77555fd607cf81d5d90cc9133b42100fc7d33f8e3b53ebe117d7da2db59e5b1cbd8a3f38a2048809bdab3bbac7d67d70508f193b2ffd27dabb7a7238324c898119f6aed6cd87cbf6ae72cd098df4c771917b330f6baef9e591f027a7e6ae6c8247f46cde486387868b57b1a16fee360ab35624583e14d6e3c86f902c8d29788dcd4644b1d538d9bbea6f17a1226a78c933cd32a083b2659c40963390f6aef2865a44156c735b495b7ffae9509ac9629f0dc5aa035860408016969fbd677c969ed9bb5a724eec82e6f830cb9c2c727b38fb1cb90c80728077abcdc56cd95f46113974f6b17aa6e285aea9a57d7ce3e3612e3f53119c12585fa03c44b9eb05f0fa4031f74c6182e0e9c6c29cb692435f53b63304c2326c4a1bbaa91c66abde197de6ce79f02cbbba3d40e15f565bf8c7dd972ef773233493f1c21a7086ec6abf2e06e55679a51b540a47764f70c316f5662153c68c281abdaa18be6a4b8aaa7f50cc5df9047eac5e65c58ed14650027b6b8654829bd625e268eaff86e671ae93072a096696e7f9ecab8048c4e2ae6316ae139dd221b7c339d00bccec6adde7d45e8e48d82ba393c2d51baeb30fb3ab45cd1f1951cae49c7afa71712cca279766be89831c36032cb3f8ad8785211372897975ccc3d22c98a49c1f2dbb9407fc3839348ecbc9ce961ddcbfb4d5ba4ba17526a34d3e1cb646914060f191f0b0b2c060653ca6569e0069963aace63ecc700d7fe94479201554a206bb4c27ac1f0654612cd8fe9250bd36bb1afea6879c39becab9184e54b0f27254f21196f67e3bfb1d90a460453215d9c14fa8a86c700ae45b6006577ab37014ac6f346c0b76ddd588a1e3fa90692e5811f8713e50995cb5ea445294d0e5a43dcf92f503ad124652879af4bf566c3934a409f4bf12d22cff8a54a6732cad4673411049b0b3177f2d400556013c935178c8e81db5044c2cddf25f68e0e3ea4bb1fdaa30e42a424bae08c05636eeb2e90dfaeebf4e96c983d62788df13945e7121e18fc2116705e8db63e2ea5a6d52372086ffd22c9060f0082ce0e455ce25eeafccec34f4558924d58fda7a8cde8e20c28ade42bf4742f5f91947681e6a5f3bcf74c42a26b78028aea69b04080fb59402cb1e6a29f7c9c182bb6b04593d6ad1ca8c86de10802e62db09b86dec16b2d2ee932f5ee45ac0983ab49e7ad81035c2652413828efa5d2858837c21ae54bd307bbca90872164129db7b5fe49dbe32f9f977a0caf45ccd2c4245008b644b7143f8360425924915b5e9b70ac4b5593d1d9074185bb244df52edb330369ec3593c0a0edc0c55141879b7b03222bc5e03a9032a3a5681f8e4720d0d30316c9ea5c75b7aacecc511c06d563c036980d50d8ee9b19c57533c8203dfbe1ddff2b784a40e1a210e8c7f659367ff3b20828f3b51a32d56207b0527a5d69d94f188d1e1ceaf9d777aeaca18095a55123ad83cd7c6bb1fc67907d0a7ea662741d84cea1d1e9a4324c545146fa1920235003182a2ff71055d4422fe08ae358c7d461dde42ad64ab137cabaa950fe2b246e20c5708ca71b2340b9ef05020c391297fb629d5a5a8d8592c751147352aa27a14aa8b846e85de7b98caa60559efd1af9205c09f37b8dad14bce91b6167ec1bfaacbb594c7b903d88a3cc0b7fc80f8bad30fb257c96eb2d473ac54845e4a6561b4c9d95cea3fe9bbc658514edbbd0860a123e4458c60404ebe75f7c002f2c511a3eb2d70850d1bad41dd733fdc32b4326a4b58ccf2498fdea968371471cbbd894ed2275af76d8e0e11303351a29780a2c43ea41abfd1e32a060d86a8afff7b297737f2bb967e7788e4315fd0dd58e2537c85c62713d11a54d1d2ed95602524030c20f358ea5ba02ccd1c40951cfa917af2272a166c59159b4beb287dccace117338eb17500b6b45bd8a1a99e49121edaf11e42e137b8aac3b00c6b217c9bda6d9c443f68005a6837afa58eb25908f2a67a3e8790c5be56fcf46a0d541051bb51b79f718c4fe6cafb4f6706024f6867535296de1458bce29e4841c9799c694b894e38727a739f98559dcd8d7ed5c9cf6ff0230ddbe89ea84de07a9e0064f5efb69800800ce7e1477139eeba89a59696928da0568201eb52854a8e9760e482504d306fe161101260c8560c41fa37ce56acb942d9e28ededaef5884bfb2dd00a338c81b2705a8d2c36b6d18435a1d6fd662556b00f370a5401b601294c7dd4017351430e3b77bf680ff4fff399f277ec392eb99715b34db14f22fce55bf9daa0b252eb2125802b51e99578a16575f4d0da7b4ffd3759b72fdd0808d4261175798c606e7952a2cc10ea23fd98379a5b5b83122315a01c23326c6238e57aafa022f20d6cf9b3f4de089614dca2fa64d6af789574a24fa34cae9db978df7cd7519d414291dc97f44bd7efd8c65f7c5ddb607ce4bc88fa2b4ee8dc5839180c2e4a69d096dba03988a21ebab5e800a725de7fbd48579cc60e25b0d41e4d340a949947b133c263625ac2d05642c15518466a9978267a607248f68a8779539606ceda631446a385e2f748cbbbffaeffa7669a77315aea7144a67ce6d1df32190285e3bb4afdb2e294c99acc2107c6104994c37f30a87344cc50b16846ccb43e084d10b71417409b874a0e879167f48314833a916db583a146f76e43c695ca62cf401d0d81f18a251cac774036bdebd023c48b4aaa2a74d0e2c3e2221dea069cce233f50967e77171299732fda5fa64f55dacb21d938b3d3ee06897d8908fc259f5bd7b334da79266fca8c2c8a9e859293fbab63d17d0c921282ed9711f560db058bf94e5478dca92e6176669ca82a8cb59193266cc29c49a5f46ee9dfa6fba6d6693a12bc4989778c25ce58f6d12747aceefe0ac543aceb052597294fae40e169e7ef2cee00283764a2af8494d3a3bcc35640b2d3fb32fc0263641cc3de24c717ec403d93310dc7b850d5580fb7c65f60de00eaa995ae44ef30ba088ef2f3f52f87faa4fd9b52236fa4c53668edd7c3fcbb30ef1968bb88297a701b6e40c316202fe12dd424f16d063780b06555616f0f0cc9b776544296452b99fdaeff8e8a627dcbd7a02469d0a5b28c90e53469ed8a087e87d9adc8cd3e351b21ac95d35a4b1b3e360bef1b5d48fee04c8f370aeaa4945019d3246c0f558c845bd81962d0cfd9d8c36808f9e34432a7ca47e58f4bd74d6d4a90f388bf024dd402e89ef6b0e9b4fd3ffad56e0a8684c338a5610eb2c92bb6d6ec55075074c0d1c3eefee173b91ba83441694a1c77c469420db1917a563f0f456873eb45d80ae54fc019098d058b2103e8b27aede5d57cec8722ead4b13025ad09b6eb7593c3d016cd5961de502daa5b6c7e229d3d3835f72d0a9827b9d404f22b3a0875533e3f647b53af5909ff7e83363c5f3be10a063b6da93b8b19ae58920e42ea5699ace07fe9d887c7b1347736656e66b5a7c6ab3682e6a3e867d67571bea8aa0e8bb78ea3b8aba657b2f9e95c515133c04393547da59f5021472d028e6e8fa766e8a2319cf4252c6e1885f85812439ecd5ed1ec2916cec78f388ddd3798821543b68861d79459fb4c7e209d3598b89f044c5d3a20342836f21bc319e1ab7e60dcb9a08cf7c7afdc29d516bd0109e12bba22c2029a09db4f96739cc03f743c64c6ec3859a0b5dbdebcc102163387f194533541d90eb910e0444932caa099988c36984a7b5d1e3affb4cb496be99119ec248b589ac8467dfff38d44a4ffb233c516b27be7b165bb5abff365d898780b35d4b760dec677af75a498148320af502cba9ab82d8d6227749bc6c9e23998b341aaa59d9e92fb5e199aa33968848de964883f6aaa69cc2970f8d9ca28913b66bc54a4c60d28647a6e289d5f136898a2b30d015d4148d7e22e3018a6edb881be8793914f58f0fa0cc03812c70d8e1f11b8a96998835ccdd8b14368d7b037d235e26f1cfba6c96125a0bc6d5e839a9a8fcf95fd9ea96d18a8d48d451b85ec70c9f0413bdf6c681f12b908a7dd1e1b3b491deef750343927131a6833fa257a71d1ed4f12c24884a4243ec4e73491827a707cff738adad1f1827e0258aadb00054753fb3fee577896eff7fcfd9c3b04b147195fe2fc0a146dae01d91b0af2395f4b9c675894a09aaabdc5ca27a1aad2350f576e39c53d09955e685ec2d873a0788414466de95490a885bf8a86c1119405ea29316491f326451dac0c2b5290038bfd4b0ebd898137d46aba00691f592118b2e9c6fbc875c764c86d0f9a9955eac50dc2b5a1196260275dd11b67181202149b4424b514e751a2961ab0eb5c9203f6e68b5332d60c9f13122f6014fd7856df4de4d7c49abcdb3b56b6d705fd0c824327cc3c7cd52713d429e5a636e8b97d0ca32173e79a1e6feca7996b7cb17811e35120dc52e8312cdad1869cbc31e5852179f2fbc3d62a8e2fa85f6acee94bcb9a16cc3f03dedda9a64c9256a332d55cede1e7dbe6e4d1ea4da789367f6de2ad94bec29149c09af3601375498683283be4185a7960e2e34287523beb346f784ddd7a9339c0252f823909cdfd23f21990db482578788a93d4cdbf6d315130c39d0fd335cc45aff468e1d117a4fc1e062eea2fd0359702ba597eda5eb33bb0f4f420d3d4f96fe4b5d5ea6b146d111b77004c46282b2e5d876e3271cf1d2e266e0195cb055e024d5268619c31e3f5c3c470120e961742ed66ce929690c61bbb2c6d4c74cf5ba2c28b1eaedcf7bd41e7d3ce44fd1dcd967b084fd43d6f0d18971af3d7712d00f309ec189f4ba5df47aac158afeed51dabdc9d1bf040a7cfa9ea84d1927dbe54898e456b3eee7f8ae24683f0b5365b97cd0233a09476dba59e4b25db225f590aee3ea45088e42e4f904c88344cea8d1c394fbb0c6b9c330fa4066236307fe32128b4cb7d9932dd603805746174487fb6c65671b86fa707ef66a121f3007c9769d93593b3a5da1edd4f4b636f83e57a3b5bbd2e18148ac1ec7c7c422e77ce0772ffc951d68bd2486ad19be525814212a434928130e12d1342d98428bdd5db4e3d120714736ff3d508f94dcf12d4d8e1fdb34c375b2fb660ee81aa52eb8ce5d6bd9f1795293d122b5fb8991480d135613ba3d2f7afb054e269c45f1119a090315fdd260b516dd8ee696fa9ba775378c8fc5b5bfe3bd830639a74ad3d823de00f7ed5684e3beb2c038d842c02f0b79f1cdd0927678ea11523567c0ea51d8afd64cbccf86bd7e9638b1c955432eda05a5f3fb3e65b0e0fc05b6a210f6b93b40fbe7bc0ab54a77e47ac1cc4a4b965ae6bbe6e3b976a863a228acccc00c68ba90eeace0db7db296902862ff780d8713dae652ce2912f57a22a65774206874d97cbef289ba77c02f5f0277191695169e55a1c5657a807e60639d8c0c8dd1493fcec9de100df35b1b33961af94812da9c2ab5f4105b80c8525235cf6c20cd97b0b39e54ed6d3479b15c352cb8020628c0942cf87a101033bb5285e36dbdab421c6cdc379759479b3dbb5c13e8d0ae7036cd193ac2a9a62d40e4b912d8640d89eb477f8cc2c1601fd61981198eab25ddb28916b0cd7a6afd7409e2c1d649808cbe78803770a7eb07f417dc5a12ec6ac23bd6d925a3d7a872d67cde0f3d390acb994880ff80a75d1a1d6be4bae35e30898de0211d0724c48071992475c6a1179b75be4ae8a24eddd622671f68344e5632c6c8842238affe4ce1b2dacbea89a6bd52c9264978e6d0bab9f5e19f4fbb2a2a1f2346f9f8724b422778c98ec86dfae3ea207e594a5857ab6ad86c85d01289463355f46a0701c41bbddd5519569960d299e637cd78134473a4962abdacb561f34890059338ce5087050012ba070650887176664f1683d970fe3a77ad1cb4d9e977a43346eb3d5fdda806c26247e0fb50b536666da19686c139ebdaa3c1e48250e3d59c65e13bd78e25e4e2e25fa22640abcfca1b28c12570168748c82d24f5a4465756330ff0d595060e2a1c37a756d308eef4a27016b5e8a271abb529622f62f84bd55eeb0d102d900491638105cbcb9d47a494907025c49eb44bfb65677be0d3ead0d17e0dd58277404e303a5a97e072ac2e0adea12eb19d350f6b976c40510bab785ddd1bc2aa0ae5e0af8ce19549d25e40b16f89f95368afc9fb246cf28772961eb6482dae31f253f044ac99810a3ea6261038e745a80fcf725c8ed2ed069233039ff4cb0eb4b346fa29b31b7fc9a84474e0359e51805fc21651e6bbd4c0459c836df308121d97deb6fa219db103df7a2fd77d62c243e7b8622a8e825583c31fbf1b78fdcb8422f89c4cb77abdada29d25bfce7d1f7054a6a5053905bed0e1170dc1d4fca062ab8da4abc96d6af27008e32d3324a6faab4a304315806e2b2cbbde693e887e1e036dd6a90cb49cf0a9c9845c187d9378cb7aba4daa581ef31e37ac58369422b029cfb8d560fb5e3638bdbf24b1d39b984aff941bad155fc2a77af4518d6e2ef8f14711238dcd1189725d5c39bdba80c735c5fa86c389efab3960a785abebd361ca812cc000301a006f3bf263f19d66f1ad66c4119738b121e0a6eb7ed3db9851979da71b062f1c98173d73079fb061e82103f5005bb35f7e80c54d3fcbfa2fddcd3b8c284c46693ac660934fb3025756171214b6a19712ddf2b6eea30ac4575959480923f695a382c8117edacef3793852770b14ca689058fb89cc02c627211ebe94db243f4dde717f7bc2b4425d9bd5897bf1fa4abc50bac63240a824b2508403061910bbde9b27ec21a17be0693fd0b1636993fba597aa36e10c7fa0d3569828d43f31f2f3581394999c2911573451e0ce0f3e25bb898eeb54310cef481d234c35c02cc3615791785ea02b0519925bbbe7a0382a1b073abcb01112e3a8d964bdc8d1c56656b5f2323a4ec4ec79ac30baf2de437e1d4315b3a95c2ac3b6803d8fc4290c7240dd37eb55a789ce24956868f18a144d781a676f84f36749022b9610819c23749424d9b347785ed4b62c0aac954813e1a8ba5520f2fd1264f6ebf8e6ae5e6a2b03fb4e5f0125c74fc0756ba7c47052d103789a6d3c98ac883716b5bb6c65f9494fd66fbd5db2a425cdb4ab54cc34e68f051b33587bdbddacb55c731e9cdd1cd51a133e52e0bfdff8aa4221424bc84f782b24ed4fc345aefed395eff6f17904c1c00c64d01fdadd79a6e521e8f1ed6952cd837a401c24958e94d4451d0f5a697831518550959326e2f5d03d51d715649d7f8036228378da79528b75d8f0dd351b946c1857bc684ee183de277de7d15af8a38f7852db8fc8e4b5f1e7006ed5d05b955fe8bee31b0e5ba23ea94cdc801adcc27d2521c61931aa770e3b7153a5776e26df113fc6ded97e927c49d20a500b42d0ad95e9e8a51acb6c6eb708f4a5cb7326c023b250690186cb4c79cca396d83004cbfb26b9dc98ef14b98cd1b6fef703bee85004f02f2d0c435b9528d0d6cadddd5f2df06e215c3b243eeb834beea7d86b9f71399a19597bfbd7d9d15751ab549b6befc17a295e22786748349158293d6cc3965a8889e4c882dd8dcabbf8c770e962a0e39aca5fec8aa939bdcb20839799a85603146d0333d0cb475424b2cdb7dce8ecd635a6d2f905fc5eee2d60498c2584c3ae02f3aca84c06adaaf4b8468398f1d2a04b9d609b9c20e875184ec00b798df8d426acb942188c4f29edfd4d5729b6f19baec343e6df88c2de94d73255ebb8b22cc7cc40b001b3569bd0266c4591c99229133809f685ecc88ef1c61466e9dc603540ba789441b310df54695ee71969a0c81246bcb2527e8cbda1076434a3266c19e758b96d8cc6aac73b604e63ed328dae38fbe1869c61bfb843d64221b6ecd7574b20fc69f64efa85c098fb654f28f8f54f36bf0a2224cb03e162a601283bc432b634567bb32714f446defbdf90ecf593bb0cf023582e91f74e61aab9d51c952b5d75de475f847c551dc3062c1d83de16818804a460080053855a802d76e45457176617e9fe7519626d452f3fb65cedd16bc170aae925c29f528fb873ecd2769530c6a3e8b16826a2882eb57bb160729e740aeb3339f12f73d7f0d56b1f8b2621c0f8a95b99dfa6220065145dd1631ab95f002b6f4b16c7e89d9c8b16266f36609d15568389e864b01d1de52d642972c3fb1823b5b388855c65e77f373153f6b1e399a994f7037f4840d039ed1663622bbe79b6ae8e9fa39e7f7028ced9d7dce7583d6b397663edf4027af2c50e36c1648b294cfe53a7da74ab16c849d64c5451b262fd22429189bde1d1ee1632fb4742df713c641e06331d166e361c7f9e07f749d644d2011ace3fc28f1032c926b58f4567155ae46136651df9a1bd73bea8fe261ef7deb21bbceee1533ee08469329eab163e6d0df180fe7390df2afe825919bc9d934e13f68a28ef9d28241e8dc833eedc2b37bb4e3fde54d79ba3384de283c5b736475b2becc7dc438c9983ccdb267b1101fb19214d042b3765f2cb53b4c523e2364553af0c7c9a0bad097245cd36ee2a84517ae76342372d90545b6591974ed339400016bf3483ac8bc34097685e4edaed31649a20250f89d3c967b5a41447e09bf3244367e829288df9c6ef9f48f57cd0032aaf31b5d067a2fac01e4decdb13a158d384f85abf9db14425521da6ab1681f13bc2fe3b8cb910e928414a95dda9fb2d534ca56192acbdf18bc8db915fc86c2d3f63faff69bef43197236428dd10c6b73afaf47a22f641e9af5911eb92d6fac1b0c21f4f8cd0532de897238a70aac6233b063e125d9cf2ba9be70cb5d0e9d1c68c3178169d30a266bf2dd71859f675840b3f7d89c750b6fb84536eda2a1a87e86c2af23d8c3f9bee287cdbd458b3c60a007c15f352389ed3411634d56fd927370dd5487f7cd9c1c90285cafe8f2715e214c0d3a5c9cad84ee89d0a337bf00b639b382b3ce2374e672a10a2c0a921cafb38b29837750a4458c9053a7a7432813db8a82679f9ce0bb1018084d97a41812d2c14e69e199a63988e9f5f81f6db810ce8c8dd0cadde573e4bd33c8cdf68801f65e3627f6e40d3c3c4f4fbe06912f6172607ac689a36f338430c3ef931a0a6255a188259de479ea9b3a7ac1e4338fe4a8e46974a579f4afe68cd16bc2d63c2af63021f4f9f4fa857d641b781d1d57c58bccff38b4e714a8e20738b38c701d3cbec69604e93c169e2119a767f9e53df43a80bf3255e7ef8de26e422294c6be2c0201f7d5fea1643cd9abe446f755c7deae9596bc64f64b8b32aec4b02192c6180eb79029a102a13eb11a60fe7b7770fc839af79bdf6c543614547dd3d0da7580d77bfcd5aec5d139a2b09fd81f3c925911ea6ece96f4aa1f8d5448db43d38ef066203872472a163cb8899a2104e656a027adf158cf659b035df36b4150121089172bb42efc695e470612c49b40bc56924c66ed8d80c265d1e62f6887ad36aeb5b3bdeb42cc00a0bee6021fd71eca57f55e2dd2b5d4d7261eb32b5db5eeb5c300a3ee9091eb7fe160c9e61ff7f6ed6aa149546dc2d5fc46ad326139b347ccfbca746ddd1152de124e78d860a71606e02f88a77f177233953b769b78ac693ff524a58b1bd802507c55356c0fd551e0a2b2f512ffb4bfe88b98f9bc91d859f49d48d064343f21589e093138bdc76819d70542e8a42beee1c91ae86bd13aab714750f747e7370a4ff82977cc0da8f2e0b70c3d4b98c4f83eceef766791dc263cbfa514222b25429550866e4e8a3e8f1db6a2598e5d5b16be6594386ff6ea26a5d05826b1138e06a2be99a44c45a0faa0c96202ce057897e462a4cb4af36436ca2d0c432d822638a9090b59dc83ba573aac78029196f82d40c22ed2e107f7622940445df6039f4c71b3c0d92e8810dde16963dc845691556e13d7948b825bc1a1e9f92f6f98e03b93a3cef82157cb1cf945a3009ac82b9874474ae62720449ccdd8031f6066f0da372a86b100deb16387a4eb50f177c59a01a65fe693ab6641e852918b2093baec2a1f8b2c276d3a20205dfd0ba966feab54c3a2fa4f362b360d3afc853169749bc840aae26661e7acc192df6d6d4782bddfedaeb777342e9942b8a9277e538eae1bad4f7dfb5e404214583245d312838b21789948ab70abcb2adb6a7c6e42ac3b67450623d9490d1c826c508a45ffb754912ea5cd43f93b8e11f21d23595764631983b180281606043e19bc066e31ca7220bd476dba9ff9df5f476d106f17f07430daa531b7ea3d26251f3a58f58c2d3fc5ace428421afa06f6b539247d9176826919620787f6035311c70dd29d726594d8c833df37a9bf4ac48c340694557d39dd8f5f38edff12645e8d3304d84a01e7155db76a0c2d8c42be688f6f13fe0215706a3d6f5c0145da15c7f848c5444bcf5095a2029012b420229a4d8a24afcd77afb2024de81dda853def8c8552d0001052a09c3fb3addcde33b698de8c6d1c4cbbae93a58ff7c0ca461bf9f94e8b145ce9d6aaeb19a361fb74361da6916ccccfb2a8dc71188d70fa825cd3f9161432a722b21a082417f2b3236cf664f76aa0ec3a4589ccf0f0ebb3c5fd04dbe4ce517acd0acc0f6f414b6360809a00d1f279c250d71ed94562fb93903d7de88f4a9c3d5c77b181f4ad3f39d1aa112fa0d40d1e69f51368c6a3a3b66d9e4066f2494f582d061045f930a35b6d933e5e067328195b31e03e38ceb8341b1d2173b048621bae0f2d14157131774ccc218152642bce6b3691dc5a9a9fec5f3cb248019f49f5f6e7807633cc1d4e703e62e06dfcfff1553d69a83df408e8f06bd1dd12a4ba9a3a2264ff4917b4799cceeead77d5b0b3fb8705e4bc881aa17221fad5a345273e04d2cd81fbafa44a417c658d60aa85c2b12ea556319aefdf68b26a2ccf1ceeb4e4101c82f63b67c412035e9bfeed62d4d8477fbfbae9a9da4d7182bf273ec9eeea1ec97127f32c496af4b38c0988f2e96502b40b06df0d176ab6eed15eed680b4370577a9ecb9b1640c4b8cd28b92d20e58502a5072bb3c68dc8112671ede34f59726a7140f8e1f79356707958db306ffd6f6aaa3969d047eb9211c63e1d7b8632f295c677d0aff27768765de27035b4bd102c9e58f0ad5d67eec3082028d23fe80fd3959628b04073ff96d7498df03f6f3fbc00a8fc430f5ba15eb17de329c34236d589b8f74a33360786f1dc10a7fe662fe147d5e610996fc68d891a449330a264ce95565fa78e09ae32f9600a674a656f7ff8e5ee96d8475453a6a06ee346bc574ea7683d47b7b6a984ff1f0bde75e3be396869e114a9e408990d5a1885de5f4578b28548c566aa82e1238a52e3e67543de0d04b387221eb279b71e8054566706f70a369a80e2f588b683edb6416285d37d573e0b9dedb8b261e3f2b8a1cdfa2c33acc6521eada871c6da90f14f7d19b76adb41939b896c28d3b8fbae56d5ff7987c355da07734325d794b2968aab9af96c9ecf98a32926049ed41f09c8789d3e068a1856ffaf77a950f0f43d996c0089299c810b19630377a9ea357079fc9a305c83986bf76272ea9110d993ea95c9f1b30a27946ada06dd3e23d64b7412a1909664c16cb78185f67b18d47c7e003fb4b0dce9611290d9a3e5884b5bc50aef618101a66aac13de5488a9f66d081203926a35cb92284c59ca5202e6750ecc260ca9aa7832c91c90f871bca01592b80c5304de4f2690a38b081f335fb5f881f0a388068fac869fcc264ca1d26d52bcbd7b96c6f63246b61b1934d209ec1da830f2cecf5b36ae5277375f8195076650f466c3b31ce95e1f4104e39b5920e0d66d75b56358c880e532116cc8a50e13a030183dbcff69f7d8c3bd99dc24d58ec89bc921a0e0b94121aad62edc23f1421ce90abad4e01c75d7cbffb213f54d89a8d8de3ed91e762422a71911c664c0e06a5f3e1d11a268c4d43ef42e8205790f9ddb3a2fc90041220b4e0fd9e5a2c7e614a86b9d370442ff00ac45a42c50cc74a4a62fc20c17d871104e0feba6294664b885e98b535c6503fe2a1213c354d48e8d5dee747d89822690f41ed9dc1d0aee49142afd075cb7bc825f4b5ca34621c168d51fb40359cae101c3ea5bd7f427f634e9bbe6562007e9893db5335a651704aefa8192cef4e13f50c1b5eac9002ef1c7f1cdb2cb3de0bebf3409de0cc5d13a58c0d09d6e23ba56e83ae04bf65b7ee77a48ebc03fc8fd5284287933e975ee688811768e1ad55f7acac24ddc33b6a47757c327da87589f2809da11238a450878efe5b3952a117d9de47166f56bbf5bb1891029fa9d7b3902224426d5c8182d58640aa3dbdda8915b155c375921103867ef1383f63b2e27a59a034c226892238d05f640e4611564a5ee4eb81e76b6018e72f601902828343fea01b741fbf34fbcc78dae0c08dbb460486de60a9469852d99c4562969d0bf7d7fe2b4aa0103487189b56c1a880e44748c412c229c33e47b99073c6a27e7e1daf4ad8ed506235a938cf81abe7a4ed5a0b4f727c5631b52ac0a9f424ec34f2080d27b8b6e9c9d07b51937bcea08ae4ef3384828962d0503178ecea7a3c77adcdb0d7724bf363f5588672b831df2db225c4aac7c4e74860d059406f20e82c00aca9ce70d282872a3578ad4c245d7d03d47418024c16b443c1d83ad2089257bd4ee1398589527833d8a436c1a558db5ddab5dc6847b9fee62bb181a923a58a24a976c14ea7ebbd33828dc50945043fc44a68e44869c8d8f55473e524c99b12b84b791cbc466b86cf6b2bcbeaacf2feaf2ecd41d78abea5521db876405c18a5765537110b6510866ec6a910a42c2719d9fb9362dc2168c4f34ac7685c3f8e24c6e896373f7fa0a9f2d30cc881088c380d6b6a8954843585b2cfc6ba89510a213b0408c1318263e2d27305abc53e3695d8b0b691240e716831eba01e0369026171c2e704d923909a268aad0a96c02579f17cd615d16be639cf257e132872e30148cc02225730457f4d904feb7105c04e12e94c4cfb8479ccfe09ae090b882118cd389f882548236439619a38a18727600bf19b70c9ad163df0d3acbc28521ead5ae972fe8458bcb3a3e01db2b812ee0ac559092434aab980e04d7ee730f8a6d25f57b44a976633d3a29c0f0056faa2bc71e25e1a9c328892857a89033a0b91269185ed552bda44b82b93562b58b8d0624caaf4c8b41f36aaaaaae2f5a8fb513563c32f5a2d2ce5e3eb55d366e959bbbbb7efaf560a12fae05fdd5e471a3b82ca73a187b8b76c3336a191f68b0c8a7fa124f371d7b59b03eabd5fe968557f21b4334b78050ec045d64a9c4df3ea94977eb9817ccab5842973722c2cef0134291ba86decf85afdf3d38450459e3c06901a2124b2ed39d9a92d3cd4a695165e23c5036e35a9e73102427e03d9d02959d0485513a0789ecd473ee8c78c8c4c1dc1c36c52b5f39f2d941c202348eb8c6f97a27ac66690dc40df4d073b50f4d06d4088857478d424a4c15af5e48dec135f8ab4034b745061287643a31a253d8e190d3b3caba9415163e2a8d331d24630bd6524a2b32420ac7862733eac76793847d140a2f42a1a9b2e5ec8b22f67e68f1e35505f951d429e66fb8fc6a2a3c108da6d09201a94db68f608128542e0acaec0c65c68a18d6a9597193ff432fce88523bb69cfb11574e81600f5d91da2156167823db6f590a52f04932d884ac40793884a4e48748970057db4f1118937996b5f83506d2a1743fbc8b59420532b4540de79cce0e540053a3f08db5b5a8343052bf08e53701cf920c896c41ee4471a7e469c1587caa64327b738e5dcdb332724ad466382f1fc8621703891b356267b210e4c1576f6dfa8db2bbd97e9687c9aa262c3bab837d0faec31c5f10d7042244ce816a180522d1cb3e34b1fcae3df38e435764dec72a180fe56405cbfc8747a88e7ad7e708156e971dbf976639e704c076b08741c74f6580f2eafcbb8183e858c4cfaad6ff2a36e000718f60510f2d6cd185a07500a0c5179455df8335c67833ef926250d45fa63545f19f48e3d534beaea8d1332fa25bb99a6807526102f623e107fb127440db00abaacfab1a561d2ba36d3cc9b5c9dc7752749f3ec4365daa5dcdf4c3d407bb3525fdef214d0deb1c7cc4bc163cf0343a0bd8149025e6d4c77517b610abae74dd37d1d4af8cfe6d2c7643d82e700777627d080bf5db3703c70f7062bdaf73a4c0be1ecf39fbb8e5c14dd5ef678ac2ebf476177082dbe509757806086eaa9cafdcdfd741df2b1c1f14dcc0b8d696e3276d7a4b4e7d13e133536d752f772ee8df58931ca3d2caa4a3abf4b3bbf8224804385f6092fecc2dd7bb7bef1b31a3eb63491f04a6b9789632c36df07761f4eba02aa71c538841d77f542eac483bf6713f8779d44db93109874722c93a62712262f1eac68e2e0a1133a8a4f26937b031760b8522c136aba48e36a8533d7fbca185ec890d95eef201c31bd803a34e77744757356add447e1343b595f5321235932e7f788ea35e8cd30eb77b692019fadc23013ed038c06b058010a3be96deb81772101b9e0765aeba48ad5aa62c10007e171900ee7c64a3707056337e77eaf10e79ccd6a485bea4ee11d416bd619c240cb4d9d7d6d127d9dce6539bad29187769f01df911da6045c11498ece199153202830557b321024ad11a31b6d42006a64fb0d4790ad57c6d7c79163ec34904d587ecadead312c64776827a717f8d6b3f8494508052a240536c872daf223d71839af5d9b52e400d289b678e7a009077f1c2363f64bb853b3d2b29bf56d8bec08f2a4ea8d5f97f7007de2a6e08ae079e5ef8c7ff469628f6040c6fc792c32157cce3fdb6f0f511df20e1986fe1d540b99c285f9c10c13478e661250e937be40f52f6a4187036470a9c45a4ae2592ea43b7364de7ee09dc3eba4a5c749d5e3dfeed3dcb6b24c7b9f9a8835adae434ae11cf655fdc433a85bea6434de5aa69eea1b2f87ee404f5b90e7eaf4ab457d8a94e5adda71a36d8f9a9a6e50ff969d7ee24b8c7592e442da065cf16a1ab11f026b8a3226a193117e9fbf3fa7b369547acd48c4b332b296c4e603052e051af90ec48551800e3f4987079108cb37d76b4d1fd49ae3c72cddab4dd65b05095587200ca73a8ec445e48403ea2aa39531dc095dc8e41f469e12e880f727c1d7a3441499c8765735b0d7207e998083d39b709344aec6cb7211b87504a5d79b0c94114c347c1b2d31785cfdef8241e62238e7fdac3cc75721a546560b441f6fc2280862afe6051e085f195762b2fcb0211d3651607b8b4df40548e20b797211938016e1e24072913ab8301a5c3be015ede7c9572216f2e0fc7606e6d8b20602a4da0bc83977979c09ada490ffccdbc6c6f48d259d7449373d1c83335ed0cc4d677280c3bb16fa24e97c9a31bd8ab61ddfeeb937bd3f31c90577106a95e1f03d52cc7a7c42e898a1a58e0cf3954f025526c1c3a6226274bf08079e2321dac83cf49211e3b8d67d53608dc360eae8fdbf8363bdff74a04abb4489de2f6e3d3c4e219eab6c790b4983d9a533a6b6ce0007f0a8c0fd25dd54afc4ddd528e8df6ec53c61ca4d5da9ae066049a684bc281902a4e9fd8e3ceb3be2384aa1afb23c898aa08049c3730c119af3bb76da24da296479e5355db22ae4d32b5410856b0bf4db19b4da9890a81a9e0b0d3f7ede9609ba7a8aa8adb289c7e5f176227082c57a2bd51e6ff9f7b9b115624723ee90523e06115b9182502725e08ba2f4ab16fbd60e692c4a1a115551dc1d4b222c152334cd3dd4eba2d610adc9e6880ec7f2d4e8c93eb9750b905d40294c07d6f80f69371d9b7f6a64cde21e5891f4ddf6a3086a387abbdd47227906ea7c85156bee4c7199dd4fe6bdd5b4731980704e28c0c058e00e2040b16cc24af63c6028d444c331e6816d252bc50d91f187484ce55bce30ceff852aa59a54bceb42225ee5831d7c311dd7fc6b99aa08da452b123efec7acf3fabe31a6d10caabd068a3c922f9b507573aa2a29f40dd74bde0028cac68ba104602999f738f4be97526e605712a41af97172871975c34295e0ea6c2a4a88d88f3641dfa1e70ff1e70604f1ae9441f03351e1300db1ac695cc6492914581b11b510b595617b5d55987f02179ecf355691ef311575f7fa8143a0a018cddfe17403990fc70a8653f2a4d09f365233ad94199d03c319b56db55fbf56e4f2ddcb4ac134a808ee40b431de85bce3bd1fc0b940119f28712021d4ef3919c7e8c948a7c4495f60a4cccaed43dbf3632c58971e9c29fa00d8c0eab5bb8ea49edbd35200bdbd2ce880a3423f9a815d99a86f9a5b79a3e63f8f81950483ecd31567b26e40f3b564ea6557209d2208de17b9f9dfb685e6b2632ec2cf273006c32d06aa91cac886dd9403ecbfa2785c555bdf2501c01430fd929dbc7f409e0c3ca9d068d1ffba2c0544f1e06a60092d0046b84c75ec5b082be0b02d5495e0ab3178240934d2abc62c73951378b80f9a29365904425f5298cf5d401fa8fed29a242249ac5a59ed5e59cfc4b2da29986589a9659fdcb299e5b2b75bd965b1422fbb799a549cd87a8ad9638ed96025b3051bdea28828432a9b585f37db5fa483ce46f33da315eb96326750539dfc2110d0f076610597d1e2200c20ae139db5870529c98a61cc45a6334a6077124b24a380d9b89497c9f412e562ae1bee844b86243cb0ec541db5cf9f50f3273eaf3fe5cbfb0c9b000127e7a1c0b0ce44429f2d4739733ae249203b5d46ce0157ed1458941b52ce7884c5235bafd2ef55357a8b80f39b417cbdb629da7050ccd2da05ca7bff2fc51033f6cb5ef9ba226144b3d72f05b6179bfaa5c7da794afde26d6227cd0adfa05cd42fb138fb35faea6205f80bf12c2f3dfcbbfb0fa81ee4bb2140d02f8afa7d38d940343bc14027125b8cd3ccfd73ef607bcf870c4f239857da4a26a9895296c6441932a7c11452a5b634344344064e7149b3d6d2c8fd3d1ba8aaa541c7b57de06d1a95dfe1240bdf5ddb3439ca99d63e730051e162152aae90ea59c4b0c98dc71c69a429a69e204a26c2e746f643ea1ffd6cdfabc49cce0e3005f2a4af6219d9c4fb010a612fd4fd97ff16f627fb7549e2995f7a100b2bf44a63aae9227aab77154c6bfde2ae340e2113780ca56cc13ca165d01733c7ddbc8126dd3400d6f2bd40bd8c5a310869bdcda530bbf65268e58e37844ecad6a8ac2af4bb11d6d35a0c4d3afcb13997db98cdbf226e0d7d7675d4447d867d14a436a67a1024c076dc90e687c635cef1c4c7215e0585c18d0c862679591125779297f965568a661c03bcf8a1e6394448a4a3fbc3747aa20e2f240b8bc2d8465917435b8eacdc9319919237c3958a9b6b4f551a72fb0ca5f5df30f69196f9afb011ef765dbae5b1f0c1eb4ea71732e70b981092bb89256e5570a79ccc611b0c3a284a87822700c28ccf0ab3d7f6a85a81502c307d99d063916a33324130de6c387e00e45e66b0858efd4c7e14c38a6ae0d315d6c860ae88912becf685066e02dd82fa0ab31ebd153bbc77c1d4ec47e8057a06a32c2e4cc7e294044276403645eef91e3a3c6f6bf147ec171c4eaeb0a14d7c032f35f4c031da2df2c286d5b6c2e8fe51400c65873361462bd80cda8b1c992291a1686cc49f34e69b14bb3ff9e987e5bf366be4e64dd44409ffafc72a7461d2e17eda4316c9d26735b25f526325e9a6a17567e5ba58459d585167ac5817abad9b55ea8c157563b575b162dd59c5eaf8595d9dac3cfcf6d258d0e742f7a95eb91bb40a560b33aa1002d8e8d87f44493a557411813c0ca3160cad1d7136a6eea9a0809183c3c381bc0e56c6d027b334865839e2a174a9b24cbb13ee9e6048790c76c83e916488a1dae80764ce12e026bcc364a0de0388716be5edbe122471156d30ec2181942fd0fc404c4a51715fd6f84fecf09c8da516c45f76e23029355094c7099f5c1b68ab8714993fc26facf99fb5ae573cdb1c35170de1b36a1301da91f044aeda8df677cfeafedbdd237be1d3e2239b82a88fda8eb44aca77191ad713c90420e95d0513bfaf5a026ee7fb3e6fc6698af1716fc791a654d1ea0bb0b303185c2bf02044a27c2ed103ad824f4c40c582990db991f36eb93ed00b0ea87aaa971974bf17f9f3d65f14b954ddcefe397416eb716730bcc3c31c88f83e2e935bb20f29beeb761bfeb9a420778569c5b0d781285e268398d8dc34afc646f487baad0358561a4343ceff424d603b84c307a8a8e87329ca4bea164629b85e4c94461a9428c0ca0845322740b272853411b21a8f0fe735a9d339b2ae6a9478251940d7b5eb85c2e80b0bc900c1b8bd2b8123c6150a9d83b9b49cf8cd6cd4903cb8430eb719a6004fb99b19cfd9caafef6dfe5cf443112005b7804c8daf1788851025654b52d765eda0a482d4a4df9a730cd63a4c4d0e123fc79ccf319259f587f019301c3624897b85f13db2659691106812a1a01316ad732679a905d5f33002ef80973c2b420fc6fb4e654f13ae8a2cfdfcd7e816993f66c1f54b3304531a63845afe2a137f6af0112c8a9873807a7de797e0c98d3c6f60646efdad57a5325db75d10c5fc9681027190f3e5c1a2d6f2d4c35b49827920f795c744cb6684756fd3b98e10b3f0023a5250ce2b2b7bf2141690c07b1045b513e6eb3204936e0a5a245a8964929dd7eedada6606170504c3aba66661ed02194caec33dc0fb6c1175f383719cf0765c2020a9bfe3a3b7b2a96019eb25ec33c4a270c8950d09505d2d9fd5de585e383c19210e44b04d682245d03626111ae2d061f4007c2aeb6742f868f0b889cdba14143728dd8c92c618f69cc0c81eec50f2a7a994a632f5f454e15dc536d474d807a54263ba2f3f1ef1801e0cb1ad8d074827aaa60220945d87a9e72fcbb20c4f60b99f4001695d2a47a2974c125eed253bf4b9b3fa0df6dc737ddc325c63d1ca541e90bbcea5f3b170eb3a04e306050fe043eda6d69eb521bc5de6458794f0fcb6cd507b79fe721b28b1b528bd28c6a631cfb99443bf34b910639e835ba38a9f509398e7cca27e290187312dfe3e541e9846b4909172accfefcf4d706f363fdb2c179f2777210b7adbc387eeba9756dfcf63db714a6cc0824c0883fac54f3d3b276ecba0a4ca9da61d1aa32e760e812b332a7a80810388f7f720d004dd9f131ea26225aa0d153176d6195f05827c6a2bf022f420a4588cea3f2dd120abe880d8eb702b10155207cd02cefa3b48d2799e7a61b9524585a082e3a9dbd21f2c7c7a322068ef4a0d44717393fb9fba899b8a716b5200c207be9f7c8031b80c4d61882d9523b65dced8afc8e45c7628763905a778c66ed2dad51c410b6e19f0c6b698741ca8f2d9c302d44cc0a5e7cbd4ea63ccc68f79ecf863323cd76c4bc5a2961960619091a2362ed7878249f7edce3052ab33c05eb083a659d4a7302d7ae9a87b880d79466c1079c4a4b9271bec9400b769702f1b59acc9892a41f8b85915073c2e1f41c04721ed9237262d650127dcb76f26a107be5eeed14547a5236d6b06e24a2a5509ff79ac9ab431fcde9b1fb937e70365572e842c85c300f94087ac628159708885863e9022adff5bc53be392f4bd702a30e7ac08346712fad95e4dbe71ea4551bcf24da52bca4ec36f506e76dd02826d085e7213c64eca38a6b901e99aa1f0b8193a0cad416ecbb24f7d5659b22817a584d30b5dae0f5c3a50584616c843e7684a510276178c177ee32a87c345dce82ed6dd7d1751224d56455d4a96774bec4ef52b6703c767231c93abc359a234b514e1062d66b2d04233ae7a9ba60055f17fb3cc37bd3dac37430a69a8347507e2c47aaed641ef482702caadb400702b1c828761d112c334e00283fcc123c2fad4b234a554308e0453be8fbaab10ec4abfebc64c9e516d3fca359763eca96e76bb6b487d290d2764221c9873b6a9e67b7959d85cc8afa5113b20796ff35e920585f76db9dc86961f63364f4719ea58234afb913202ad2112b09d4bad830fe139577bb8e0138c196b6c57ded21539f83767746ed6a5f4b4bf13e1c3a4dedd80c1513fd48b8cf9d3079f18e2d62ed50f00bbb7a8222ca70729c20bf3cb1e9b6d4c8e4d72d0eff5aa279c9c32b9eeba7232818e914d34fec62b889caf7ca8a2a6ee250bed3784ac23d5010cb8436561b726672c48917378b3700473cf7935e597d5e4b82a6fd89463416941e351982577668b41e16e7beb5411c374ebf33d4a5b6fef2e8eeb6d7b33c56ce71d73a1dd5f88e0611102910bec560f16bc2aa1e3d8ca24d4849d6de681dce0e25697c89e2170ed0ad3807c6b23b251b3d2c1fb9305d6c4c6b0af7eef51b29addc92e9c10fc78d3e62a56de60855106a79424bbba5a07340fdf1ee00c30c5443dbe5ca86c0a9a293ad2f8c05d212ac8b11b9d2f456df63d012284e951a684a2118c6322e59df2f086920fbe2f6485ea207588bf444ceebe2b97851e199b89d2ffc596c7f9274f9f07d93d5a8234ec213233164c76cfeca3c2f76c4c35dcd3f76decb373fbc758755ea3b65df01080f11163475573ad2cf54050356fa807ab005dd958b7e2592f5b335b951c09b426a7cb650c86f9be6c3a99246cc207f3fe3cbde91d0a556a596ada6d96d9b314a0ede751b1f65b44ee516717a653b4aadc9127017c1cff26ce584ce59fbf023cfa1894233dcd4ea39a16f5709b123763f4822f19d826e944558cae301a3c4bc6d4d3f14b37e92fa214d2b7e8d61941144b063d8a51470664183df35a6e452ffdce7a3162154bc02efd4e433417d72974c654b89abb46909a03c49e025a1f92695b505cd5a603d01cc7803cee08348721db1c07e38b05ba2d83173e4f3e2df40c83b877d211688ecf78da6004735da03aa1283d421c38282c48698c61d6686a0369bfc1c8fbeae8fc6cafe679d5a4fad72da4edbdb7947b4b99929401e8065b065a0608f8dc5f2083013ebb076434c789f8e9d2cae756c2130af0b9a910e373cbbc44d0f6fd0d83f8e9f0f3b96bd039e81fa43c6786f8691a1074095280d251881f2759016be10bf8456be06709239580a5139207f1e32a93cfd2246b80c3670903b902dc2f4f103fdeaa11646df82c5b2408bccfd10cff398601f75b207a8b8f56c01da3109980fb6dc4cf4c1d1141d7f7d78820ec4b3ec71703e066f19907dc27242c3ab86f889fc9f2089adf2f637fa41c8d8ee1f5015fae0ef8f26d408c2fbb28c23f3675e3cb95015fbe427c41c495c83fd605882fd7057cf9da105917ec5fe3cb2e706dfdf0e5eac3972f0d530bfb2be0cb2e705525e0cbb5872f5f2c63fc677cd985571202be5c0ff0e56b8090bf8c50c93f18cdca972be8cbb700a52fbb702cfc7cb9aa7cf9f21086d83fa569fc839576f87225c097ef009ac61fa569b0bf93fc8385607cb90ae0cbf7848485b0ff8b2fbbc0578cb7fc75f8720dc097af47e50faa72f872c5e1cbf7066ff99b78cbc53f9788ae6cf8b28befcb9de7e2ff2e2ebe5c01f0e55bc34cb5f8b20ba728cbf20f1db9c7bfe4cb2e3a1abedc5d165fbeddacf73a1dd111f627f9b20baca1c8e1bb3b7bcc1ef144a6aa1013aa686846bcc628bcc6dab52e3e30952c0906269ec896358115d9108dc9144f64e3eb35d636aa2cac62426ff1967852494340994a2c164d55411d55510dbdbcc413197a81b58a69523c9159e9082994a9a646c342d80b30176c84896262bcc699d758ab316368b156a793352d419542c9911c35ae5e63edba44171317e972b9463347acce40d362d58827b2b5898242a84a65136c124fa46759f1c49f8efc63b5103d9e8980641e289101bb7fe1d201f51a4faff1c7b2dce39fb74a62826d0a3b4a8cb8625312866b5dab74dddd32787e95bb31bbe3fcb2c473f69583dbcfb2ac183635002cdfb310768fa916f61db0fc6c8980124fbcb9548a5c0346899edadc4bd60049c4139ac081c96432994c2693c9643235d144134d0001020408102040800001020448134d34d144132e3e28e18bfbddbddae0461c8e82329b83fb55f3b578fbbf8b01c0119430e647e979046904e94f3aa94f21b070bf6c954ed65c2967bd6270f3115247898dfa8d6dd83f29ba6a205b737e773bd7f4358ca3d1ce4d0c065a34c99b16a6598d8f5a6bc5c2346a2b4cb554ca259b6829f7d0f7f6492facda4cdbb80de7a6b086628424858a151d0b1a4a5ad4000017ef6d5c0fce8607732f0dd2efdb6a78986435285f9a880906533ac449da48e3d19f1f9ebe66b2d5f0b8205c0fce854355155caaa5b494368383e3b0d5f034937b345483daa8418d477be8cbd4a81b69a3beddb5c0594bad3419d68c0a6ece58192b9be94f8da723ffd40ff633133fbc7d25268e340036784cc05771f1f1e0b5482901c00e3574045841c3005890a08ca8809142008de2a4f32fe4e5e89003b671bf49616282830a0f293b10600028300470f242871c6eb0e1ff03f0b9caf3c9543cf901e680c30d26365cdfc8ff70f12e507c3fbc77d169f1a3a445c905c08f1a5a9470ba1f2bba151b1a7eb0e85670243f46484636153f52908c683fba33143f3a6de58fd2b51c8ed7f8c2ea66ea58d866b3698ccd1a418dafab86e723f7d094fde9a33faef27c9e3f5427d50c82af1bfefad982b8e232e0e7f9027cfdec114139fcc75953c49aa3e952d32a389021ae4c161a9fbd0c3411e482487fa648019f5d4634232a12d32a0078425c993e12f0d9a10013411eaa3fb3d4c3674f9554250ff1f57e6a95ffeb3d077165bee0ebdd1441257fbdf3e8cf9cf1d97b4cf731fd07bede47ad42c35fef25882b13019fdd04f87a6f89a01afefa6ef5671ee073d34c0f895a6821ae5016037cee2db02268c590fe50918ccf0d2322229251b58a0a27e20af5b1f2b98ff012412c4afda125d0e7369550a5948f56e9fefa86415ca12f05f8dc32c0d737298246fefa66e90f55c5f8dc2daae6a1ea812f1466882b54e6f3599ea1268252acfa43592a9f258bd5ba48a210572e161e3ecb29e0eb654c04cdcf254af92c5f44434430f87a89923c882b970f0983eef059fa20823a9fab4480cf92542a99ee0fe0b34401be5e9e20ae5c2f4bf4e742f91c6bf0c582617c8e5ec0d75b20ae5c32728444ab6cfefa23228863b15602b81e477f2e967be8c9e798047cbd8db882b14818f4737c11c978f139e5838982a81141fd970e9f73c057090b800d9f1d5f7f435cc17c984410f6c14aeea17ffd8c2bd88b8441ffbafe861476968feae726ce62912b5a0b0d169cb11420628958221f72451325c047c93f99aa8792aaa42abdc8954c06bf64a519aa92aa242357b217044c967f32d101bec9124d9668b258e44ae6c3002c22ff58960c114bc412f9902b19cb8a0f4cad0a54529554a517b962650af0a2f28f2dc55095542515a64f65e48a7df950194cadc83df455be5c59e48af5c1c397fb12f9a706253b26b69f04470b22884a629269991744cdcdbe0c5c7d4c175e55f631fad3a1947fd199dc16a4cc3d597675b81bd995fdf6d76fdf976564d9671241352268748a9135a49766b598607a6c381a6ebdcbddc83ed9f2ed9058fb72bf1c91bcd67bbbeeb3f7cfda3bf60363efd8739c0d8e87adf34f87beeb423774bddc2c4918fbab14411263df3fb2e16e70dfa4561979ac1f7b598aa00804f7fd9d7590bc7faffc93a3f6dd706e0a8fc493a3ea498827d8773c7f22c2c07e85e72cae027bea79487bf5cff972d7dd7eeeb3f6dc27451967a3bf1d52db3c39922d0d966e8e7882b94acbbc6e61ecfd89088a188b21c6de87b4ca7cecdab6fee4700ff62b12568b16c6b010c63ec6e7741063cecf87c413ecdd735511645b217e64ec5504658f3d0b169d4eee950f8db36efb3b26ee4f8283fbfbda37b46ffb76486cbfdc7f391bd9b78edb20f6e9d83e396a10fb2524d63ed9c29db0172931258c6c699592c63ecaf073f8a76218d6316686fe49694f7ff6e5fa72877461383d57cd5fe1b9c83dd8abf05870303f04df43879a070c886f6f47c5f33bffb44c7b30acc31886cd604ec8cdf2b3af3688bd12136bc1d87336e4771bc4bebfad41acc486872986bd16e9069b9cc6c00a0837e0010f7af08086f07cee29f7947b2ae5f74b1aec7fc5e06a767e6681431b47a3f3363538e3a65d3fb8b9bf9f7ecf74ab55ac7f5a84fd9ccd6a914834431494f9fdf5a9c14d35e913787ea7384e08fa5c469fcb6846a2c54fa7a247d529d9291df21f479ce5945fa3b4486b70f31ccd118ffedccfd38b64a7f9417f339d2288e341046d38bff192e06c5ee67c59669c10f269c6d9904f3fcb5ecb3c5f391167394b9b21fdb22ff44f1886613853a4c6595a78380b87f13ff7e76bd19bd79b30ed99a4c649c8336026eefbe77e93a4c3c306e72f21b10f69706657619a088229d53b43ae0737bbca551e6239b851880f5038d68ea5552b249a431a9c30f3bb48837386f1647e135707fd25e41ccdf79956d1219de5ad56291241dacff73044d0f6dc6fdb675ee6be2c3d89354e0819b1c77036e43b115fa16e7692c784787e9e233cdf635aa5444e1248a4554aa4fc2609a6ff8b7433536612c1f327c93fcd6acf9c4d7343dd246d8d32f569cab71c0de9a45699537eb253d2478324ac599d6ab05f649e480733a4671a9c243c7db44af6498aa0faf3270c2248fe7421e477bfec88dd4bbcc43f203e183cc1397b4a5283f3675ac57e2f1a4cf96792c0ffaebba496eb9f4bacf74f52fd3238bf3f924d7763dfe06d70ca74b86b704aca09d1efdf0c1d2554468c19293f6e4ec1f24ba1a18781d65d115c7cd11bafaec55f314e2f084d6eb4860ff43b80a7d7689569d2f5c54dc12c47637e7e6ca737a75bfbcdd6458339e79c75920801c20f9ca3aa46109dd76abd7949acfd0e5fb64eecba8a00e9aeb7134111d74da371caf9451f007931b95e8b16ebf85d1b8d633cf1bf400cac437efc72f6db6bd2bf5c03fb4b4f23f91c3f7e457182e5776ec0f2efc7580396cff918e56fa2473ef724b336b8bd7bd9a3f0720e98fb8e971f737fbddc61ee39bff172c5dca784c42d3aef881838823872344865a841d3cd12258aa0f8f4e5082248d22c4fb8310aeef012f26dc04bc8ef34448314fcefba965b3f97d8f77ff195d80f081083da3fa5943a2ac2a0d6824f82ee7b4a1dd520f577943fad957a09ede81f10208e06e9bf6890d2159fe27355f1bd428597c28b8d6118866118966d1a4703c3300cc3b0bfbce5352fecc1f95b25b9139c208debf341e26e2311f20313ce600429a5d12bf18fb8c3c2823be79c93ce49e924ad805ed775d149e95ff427a5f423a5945e945e178dc1101c85a05eb0c68926314a1ce7ec1f907014f20317dc9c8c314341838c201b3df3e7fcf9fe7993bb7a384a8e088a787e4a04997c947ed3493b389d4ea7d3e9743a9d4ea7d3e9743a9d4ea7d3e9743a9d4ea7d3e974da4175d93a83162f266e14821ae1280425c25a772f5a90cc6889a05519f7258e88d894319421827216c1f2e719688b8b400c5c109447abc13c53be65a11719f6cf1a8e4fb252250cf77984988408caaff305cbb984e8211206ec509846c0f27386af6b3a8edc4ccd16c44f8c077c9e3370c0e78983067c9e3cc0d128bedfc9103f45dcf83c3dc080cf7304427c9e2708a2479e103f5204c467a7c2023e3b166c7c762ed4e89b83f891a61f3efb0f7cf8ec42687cf62714f09deff712c48f8c49c0674f410bf0679fc18cde68217e3a1430a113a870e51f99628956a1142ae5ad146b0819eac50a214b052102e343529ccdd7cfdc570cc78653eb6f726c86c0e85662473c866895126bdf0641f1d8e7e8038c8ca018914a262b8bf0e0215bb2154f8a3448d3a376a9120cf1047bf9850843d6b407fb16ccc242c50e9bf41cbb17714af5c44b2acb522faa2caba1b7c250b634d9922d4913128d5cac6c856118d65a6bb4f5b3295bad967d99b1a10690c831048e07c413ec1b1061c4f00f1161d7d52a83b10f8555c4522b2bacb5633a942bf145add7d7bf6aade15561ae5a5f4bd96afd112ff6e09ee3f08637bce10d8557967db52b8ff1d0516eed8a480c4c3844e52947b507736aadb5767b7f97f9e2f6ed9024dc0dfb57d73488ddb08661df90fd66b45acd2a89c90bb8fa982ebcaa8f6ca5fc8bcee4b6187de4c83dd8bbcd3a59e699d75a6badb5d65a6badb5d62b543fc982231c85a370148e42ec65ebaa996cf508d52f6f1f0f9bcbd6b7e428942edb67b9021e9ab6f170d1ee2f2171e771841b4ed8f1248b146d5a17912deccbff1d7643d9ca9efb64a86b344f8a24cb55ba38e2092a82e2c41e47cc8ad5a2b1a1202823842826841154c3300c6bcda29d35abb54e29922ca1d40bcb8c4ce108c330b4a99a4aa552a9776ffe888783f928bcab6164bec8757d31ec1ac722496b1d22d0a249bdf171f46bedc9eefe66c71963287bc815ff9963f8fec1e19ed9c5b87382b55ea7fdb23b80a917b46892e90a63d777f6347b3a9fb6caf5323678d52afbc6d52de3fafaa53478c968507e5f1da7f743c42d43383b4d68858d5a18b35eb893be602c5327e667ea4253187bed4a0289f9177723fbec69f61488cc4e9a5aefa5b9a411d1d3dfa28934228cc9d0687ad569f40cb9e01aa7a94fdf25090d7e8ca47bd2ff71ed5727fda6dff45b0b774e0d6ce008374b1aad43ed014c6fd06f9a9a0e512ae314cdd17c8caeb81068d1244f13c65e23a23f2b3e3e055a65fb18135e5577a90b7e3af77c547cfc942e7e66b8a741d9e4e24a6c1f3d645e5773db88bbd5c29ae9340f767f3b9f3db4c9c27ddbf7d9cfa4f64acb8169d9b6aae94f87da83fd047d7c8f8ec76dc1d864d13ed7ca7d6ff776bf6d59d6d9a764280f765f3bdbea36f2db8f6cd9966d9f27c7fdf6519b7d9cf63372375ad3aae7aa995e3588c5c05aaefc5c12f395cced25ccca721d128d00df98ef2c2dd261bf56cd23a208e734afb19dafe5fac373bfe170df4120820380a39020987036b91fd9b6cd3d7b4bffb24ffdb3bf3ee3b46f29c8f8d09f0efb15a17d73fb4298f8456c95e476a3d4942a8c79a143107f6990474b7b64bc66f54cab881730f6cd0577691af7608f7a535772928b56de11e45dad5fbb56958481fdb663e2914f828347be5f0be20be2f38623f731df8ee3b8df6cb80d08c35d1998fbc8fd0b0e8c7d9bd330f73672bf857ae0be46d0f61cb771c1dde0361ce737cfd970dc86bbcff9cd67ee379f5ba6056783f3ed90f87e59e2cd732b57c9eb58c7e62ba2bbbbbbbbbbbb473c1abe8ef321fb91d774d8dcebacbb7fce55673470373aeb6ec9ede0d2e09900ac47c357ac06b16c4662354572b0e06ccc227c48c6f2be425b410bb9c3d866ab747b2db32282abbce51f19b6077b1a8c612d8c619d5d75b1c6b0f725a85a05a6b17725d8c7dec356d11e7b1f1241db63ddcc95c94e04632fc3cd635febc8679fb9cf3e4b98cceb381b23df0e89375feecf9efbc8f9a023fb91ef116f0989b98f088f3b5d9aa3554a2ac90711ad52522b132a1efb22fa002b1efbcd9bf1a45f5bf181ed694f0c530aa5a16ced0363dfb17d3488fd8cee104ae675289e603fbd6669107beab5a849dea506fb031e8830b096f660df3d78c850862c54c870877024c6c356f1afe36e6cdf0d13b3820362db56b5dedb8d705a873ac4c3261ab934a984b2c5f7d99d6556bb91bdfd76c8ce421dead000381b1e2c6b1ac42e1fb7b79006bc8806b19f1e1139e209268178827d04220cecbb19fea140cfd56ab5c2fce90867637e72e41d7257b9bbbb3fa52ef2104dcbfbd3ab5083d8d708727797fe4ebd579a7dff9cbd7f2d73d9b09f7d412061edb3d75236ebdf9ee37a6fd7bdacd74529a5947e8c14678b29a594524adf5ada22c282590d89c15896f171557b505a45baf4f81b41d9cbb77125620d4b9a82bb6129d5debe663f19583e8d29d5a6bdfd4cdf7e9e38bbaac8db0f056743fb7648bc7d997b7b83fef5ed90b87a4b83b24783d22504df030ee6af56abd56a07b7bf7eb9df7eb407c6be063e436a6a9a72d63c5dd84c02898dbbd1d37eb7b3fc13db59acee8fe5b6ba6cdff863947ef57cc6594aa028cf04d3fe56d36ee9385e187649916ca1237a028c7df1297703fb6e514750c4d837b1195216f68d617f3d7661d897127262927084241c8113b7adfda77fdd1afcc1055a34c9f48ac1edd724f72a40794fe751192f43605264cb6d38ce1c28cd4dd561413d3876163cbe8d42506118380a094283595add6ae568c8d6299ab42099313a2a2558d7ddee8b80f2892b719e24520aa6269876989670a613f79cc992ba8e021588204ed7dd51773b9fed77562bcf4e82b9d404368ef85928ad49930a511178e79c7fef54c9d04c61fa46f4676ee6bcf3cefbfef34e59ebbd5df72fa7c96bbd77864c9dfb337ad6daadfcd3d85380e41f23da33699a84a5eabd6c78f0255b73d5795af21ad0d00517f12343f7d0fbf43bb92267240cfa92f58181e9e780efcb3beb9c5849c77a259def78259dbf5e16e91e340dd24ea7f35a9c00cc45bb5bba54f343c47646e7af8f4920715d9c109de72867a3f3dc77fdf5cdb8b2fd949008ea3cb59dce736f3d4ea7f35a6f9dce5fdff924a9a4c305e1ee983809d9c23635c39bbb213b3f63f07c4e08a8fb1d214158d8044721415ab0563759a43fddd397adeed13cbaa559587c96355d87b342450a169d8f11a4441248e0cde7ab8500eef5b5c1ebdb4aae92eb39dfb91ec4da6797d6e17426a7c4e4d897ad4ea7d3e974ae1220406c33d0012c49d7735e0937fff2ea0d67a849d7e2625dc014a42829fadab6d1f8e9381c53e078039e187df7d19fd8c3e59ffc3adffd72c0b9dbae276ec479ae56b486f94e724f8b08ba4e5aa14c70ee320f987e8cf904d39f9f6fc0f4defa4eeab012b38b20fb74c80fced93a95ea94dd588fb3de663dcd7a99f5acf5aaf530eb5dd6a3d61e61ed8bbf2105775334c6ee703e6823dbc88816515264bc0c8121320446c6cb90ec249906e97cb02339a93df43bdf373557253e65e8734edcdca4f6419f729e7e935a45caaf677a08fdcdf69d0c89de2f575785d949a4eca4cf4e0a1283411c850431612d768c726e7207f07d1aac175abc0479aefcd329304569095319720f7d511dad54a8e06c7870f6a749a4417a3fbe49c7eb9070efe794b99a32aa9b3b25bf53aa08e29e7e3f11413188a0266026e26786dc2383a8d279fa4e922b3274f121b80f80dcdb11a2f35776aeebdeabe4fef5f7dd2bb93f4bb0f79f284c89c9040b893f2c7e12e9547c9e413065f175fe45b0fb5fd1752aeefde87f26797fcd49bc16a74b52822b71ee3aafc41ffbeb0fe2912719f96634481fc41385a704e7934002fbdf0ebc3f83bb5f9e1bb7c4c49c9fa67b7fbee580b83fefcff937eb280102d47e86fc53db13ca151961cca77352ffc8f9fa29b897ad5aefedbaff9c03ede9ddef48ce872983ef974df0fc234cbc8b391e07cbd9239ed4e7608eb7a1d9608ec7c17098e36da60d733ccd5b34ccf1325686399e7db198e3d52655ccf1b01a0c73bc2be6c21c8f9e28e678538e34c9f1fc8878527f46d770ccb19f493ca91c4f624d72bc88ed97c26d5e7b3905d318aaa2d687fea6c6a23f5ebec91cc0d4741b0249c0410e5aebee6ef78f11ee91f3a7bc6270fdcb13cbbee1ed6dc4ed6a823083a3901ec0e01ebce0231a9c8f1d61c415866158ed6fa0fd237b981fbbb2744bf3c0cdd1b0c1b9839b53aec71e8988e9d77bdb23b952c25c9d160dce3762cebf3c5072f48bb4d335485b97cca4e084132a128aec82f7c6887147ae18555a972f333c82f008d220f6da6bf16aaefeb6a9dff5bb6a5aca51419c655116655116c5a385c56b30c60937e1573f1c58a6952ee9badcd10d650b1524c5a3a5c5e2352d2f92bdd5c21ad6b08635ac61b5d5565b6db5b5d6fadb566bad15e5c1eed65a6bddfcf69bafd690b3a921addf10d9e7c868f524d6e4663d4735183688a1cc80324fa4b39f4ba4ca7e2572e645a6aa6c859aa42103aedfad56c91e7b59a4fa2f213bb436b4a10d6d68c31c9dd5519d19e7fa26cbb25affb2afd9ac6a9a96b9f6e518626e5feae5858a4c8d46a3d16894b2a9542a958241e1f90f3f5d9eb3d4780dd3314d642553058c7d53c145cd2a3da97319d184a113a810152415dad0861665436b51d6d6cd260cc3300cb3cc5a6b391c4e188661185a6b6d967138f7397f391c87eb3c769ff3997b0ec7c3713b9cd0a2321bdad086198af3e5186283a37ec7f9a083f5224601675ee6fa749feeee6118c2b8a431c3182782491cd5ca2fc71031de4e6826344cab68ddb2a10d03992ca8446cd9a98adea99919000000e315000038100c864302b180384c3365ee14800e708c506e5c381789e224c7318a1963180100000000c00800c0004c710068a95c48a8754d2934ee16f0c4819f346d0fa1ecd41f18edf3a8b54169c5c6d07fbf375083e551321ae20d57f7f11109dbdf0a638203042621e5886dce44f993bca6724d0ac1268c1b99c46885faaa0dcee9f833c491224cfc763111fedfcb95e0f44f602a55e5560b78208171709d4f39d9f33f9fb6b657ad219d70f640e2708546d125678b30f5910a93a1229f1072edccc9fd149c54665cb48ce863cda1136f1aa612077ec04807e4b0a65eb981a404c787ffc1c85815416d7573573c7ef3a58bec7d90baac9922cd451c9092a902016199a9ba02b5eef436a6dc948f944942cc4bb9fe1dd3430e59903b7e88d0366ea6ec8b0b0922cefbd12c7c70491d1e2bdfc7b4523d01ab8e29da31713377e9845fad35189fb65c9b4238df3acb388df0f8ed90fa9c0d71fdb31463f52a675790b222660f1f7fa6bb2d5c6fa77094ececb151f523b18808b9c18f3deadc21419bde012658e38e157d8ae64403ebfbc3c0fd1ee1feeac47de7e1967cd9a67f509994ce6bfaf615e47c5d6bc3c5bfc973d5ab8e32f5ce6e6ec4a042840f6758935e7478265ec825a491b7323cccfcc476de625c8bfe8d736695361f435471f4d074cce2706a5da18df1db9d6d5e54180dd57a75b5be019b7b4bc878501d6b9cb6f77d7c59f0bf19036bd6bada6912408a886e1e020116f760631a8d401f716b5ed997b3f6736af88171af5ec3be981b4306c0eda43e2ada7e56a15827a76f504112c4992c92426153dc938e381047217b9f709a3fb2cec886a29fa8e5d241988851bce1608b84ea499b2cd99635082b5e93caa20830fa8158d2ddb32ecbd0a4023a6f0fc2412acc95bb1cbea52b6a72b8415d41d4ae50059aee5db1b9a0a34ee095ea490e912c742f568e1b13e43a99358559019f8cd1b459ef7f50dcff386b8aec91d9c82f5480d4962529cb4b98517656a4789cdb7155aff08f0dc21d8fbd1222c0b3de893fa30f98b4ec97588c7abcecd8a0b3048bf1f00025adbdef509dff4d66fb724c394a7405578d5bb95142da12d5c9b8d2833780c2923e0a899ba4cddd952f22c07127b4bbbf2c9d714b7ee817a80a52ab3e749e4204f4a01f20760dc8c322103be922bfa12b30f5166dc69affe7a46a3201a86405e48ccbbd187b9c257796101810024530ca114a5d023a3129040932ce2e72e92616c1fd157762c197a111b26d4439b4fd7d53e3d01edc1d31128d4940ccac4c4768816848ba58fedb22fa8560916771053d9588dbb03cb594320d65cbac6685ea3ed43ed863f2ead018081a2729a35cedccf8861fc08033830a009541c191c4ccbd30a5f3ca5a2895537f1e2c4bb8432181678d9abdd7db1fd4b9d704e8a14a03e6b35bf008175febdc2aa4cf84d00803e412228cf0dc3055e95bf3a0b934607eb7dd3e21d0056c076d8e3292098fc179d9571771f8f705d179cbf9313819163ca05ab5f0aa74cb7a4563a24962fdb8febe5168ca33dddac1aea94acc509d7ecdb2e7a54e33086bd60dbdf334c4174fc009f35b0b073e86c85e7022cba1e6363095e893495b43fd3c1362b9091122ad457791ea05398370821f9a9007e2f1e42e10bc084c53c47996ec0b87ff435088560ebd65cc19b6424f73f29f9bcdacd2cd0673db5b478f09dad874e5a34691eacc54ad0ea8d89872046a8ab0850fd574897bc093098c77551215abe95d65dcc3651b7fe1a1ffc312c389c61d35d9bc554412d2228d869020f62b417357e2ef499d63602a47643a2d83d122b927e15bf61b44e19cf4092d02d5c507fd217dd40d2a3035ab829eac64fba695938f9916475f4e1220461cb62a0b57a93ed08382279d27fa6dfc60bfd7e05ba550ff8ccecefcba3dc4928c05124c433ad28c9b7b22ed2d2fe8bb48bce6d5047f443765097d6d6f6928d8eaa31d6b0913d6f374b584dd1d4ec401d98e930a89a4cb9dba4459988f62c3170632a7616cfae635d1effb743f4f4cda5d3994fcf4027201433b03a0f187ec4754edc8ec82c65785f74f5f8918c0e8a0d956fcb69461e3faefe3ebb8b48e7f7930b11328aaf69335ca71fac4945a047b1921554f64a14b0dd234ebeb6b05341017a7cb302971e6249c7f71b346a24e76f4362602fc6fcb21985b6d2330143c43f7988c61f077561371e68ef08c88b89f370b5d7a32cd2cfe4ae43e43d7a1d18f5296a395d59732ca111032d9bbbcc026da1288761dc896f43a0b014106f786f75dbce271402f3e29de2eda859cdb1c7b48ed0ea736b45a7c985d7ce76e2c530c01067dfb402852c1466cc6d5a91b6336d357b1a85f17c4a7aad8819beb2237742f6810456c5d09103b0dcd2004f9e27bd51dfdb955d2918add50742d863632c2133ff6b0cb6c5533657d79aacf2c0f17fb3d2082b58ba4a060f56f1ac41312309e4e894b776537dc9cb65849afc0ec1688682e4ad792813bd6369b7cb84fdb1b12ddfbe9199ff4d732d0fc6845be16949e21868ae3de8e1b36856982e09dbb4e973061111eea16697018737a0136b1645fb5a95ddad68c74890f55df4206abecb529297aa96d8e24611628220509d50bcd65c3b0f45817d24e4a4d63cad263b93729de2db4bf883d6a3968e4450ca125e452156113044496f20fefc23b9b14d271c741abffc034544417f25b3d31545d56e866fc06c51ba9034e10b1c1aaff0ca23ad803a4cf69fb7c2b6dee073010ce359e0bdd0567017d3ca6c76f834866849b3e70333a11447cd4f1cc2879217a4319188d4ef5ced8f46d4400339b2494237a5fe911fcc211cbb6c89f29026d75ab46ef2b650efa6bc1157a90aa1dba680d4b347ddd5cb495e66c743ce17cf46d64467a97614ebafe2d6cb0d24ccdbf345e40cbaf2774d3f5eb34b24a4b6849f6298dc35bb69a0e5d53cec06fa433bf8db340504a32a12c0714171e2eb75725a865ea6be98346c645938fa28a038c045fdbebad9b6b386f3ba0d42d9a8e6a65509923fac84320019a3ad4ed8f7c4e8ef0d2f173271a3a8036ae40a7afd2f6d1ca3d8bff91c4253d241f02abbc3f05447eaf1a2d59f15b6f2ebfc49112334fec57f93584934900809ba9537ffdd736b89ba798bde1326a3b0c5e59891bb9656f71bd3805c7aab9801c99eb04a5575bfb0c4129e6e3cc493fd5490dac9b22a62ff2041519a5f27caf0db6db8db3c356c1f7e54ad889262dfc82fd32f377a44a46fd2f0d1ed015e197fc9ebe3b1aaa0298f506cfd4b4ea5508641378114351adcdc0c6f036f4dab17cd7823680cf51aa592ab79da5a7a50a0cdd0663538cbceebb5a397a77d730e0b7c41d3eedf8e8269e1a0873ca365d78eb051adda698ea3a04457e44d104fe0ed84637bfee57947584f64b440ccc11027224d53fa36c49a0a56c254a63fe6b7ed58f85ad31b5579029668563a66706084863556c47b10a5464dec30d39b181162a1fc1e424847a2a4797201d34c79387f7ef188ab35cf9c632ca4fd5cc9f4edfd1dd60deb151cd86e285a7a5579b09e0c4b561a7062b9a4ae29ac556c30c9e8aba619819b8a64084908af849fd2716ae9a2c7177ee892d04352c6634311698aa107846aa455d67b0488eba9b3f5b58ce8e4b290b98d60ca93675739574faa62c8a483e055e3e5845313bae01c44955652f7626fc0970c4e1e25f11b871d7223f575c6ff1fab3023b2e5161d0f61591eb651486f2b2d070cb8e7c1fec4759e083c1e5f58790cd3219c7a5236748716257dbea5ecc9961f861a8bb520e7eff0eb8d734b06b00d8f4b26d59d37e674d269e474177e6dd8463df167a69f6113370e4cacd10c7284976ff9e06c9cb0186b078062fdf35edc80df4d3b3f0f48e83057fa8c5f352ceaea65d253deed76fb895fcccd1ea886f3f4fec66ec5c930545da212fc8b90e95a90f1af3ec5c05bbd113424ef38f2b0cec30fd5aaf8f806f1f8c6ba58040b736b0e235534c55b53aa0fda32f5e9f16818a8ae8ffdda8a90effb6178b46d2aa2e67cff7517b88592b6d6ff9d7101c9beb380b659c953145abd9e01f08f0e88902b090d93f1f1dc8c58b530602d12b2db543da70f411d2df8fb9f7b23b85ecf601bce778afe3efeac1e38b012243e43aa246ac67dd206bc3999844175a2926f6c1c69182f528497eb044435ae6da904d831a62a47ce925298c21c7aab494e5a85fb2d6d50445eb95061066cce6a8fc3c1bd8a9b072cfa40b000445a7f979ce4a9e3e7d081b631d228c7e9f26b3f1de0d71b11f8bc083db7aadbe021d9fc2a0cb3109e1a46648d634055fa449514fe6377f172b7a2fde0e33f7ebe9ee6da6085e3dc03ff7e0f658bdc5d199e30be189a220bd77e82f9fc9897df8b367c7ed09c74d019e45ee54f3c693c1577516cda908a36fc0dc67141db833da50501cde90bdd44a6ac419392ca29f5b3bdfc0b9e4378c2ff1c8d2d909fd26649d148822c2c48d2fce556c8d4d8c1325ecfcdba2fdb7a5dc59807f9e4a8099f1387a883ee4e496379676720bbf08a0838697b9cd35ba74d00f3c55fe3990c0db86a5cb30a4ea618c0d7a7148581b87bc28e164e89603a1b91ef882212e6ae1020535bd894f3100e2b921922f70b764212476a31e20487cf72b344b8142c60c754afacb7bed0d5d9a445190f3816737a66e9f039f4f9336bedc7a4f1786c19e84cf157a8e0646b184adc8639a4adff513fe27e8cd1205f1113306eb4d34b210b991da85bcb61206485cef1450989461a4744d99702185385d958d4a6bf1631e7f455094419c3b26047b184c7ebc16f1d86731aed0a42eaba88652f08eddbcd28bc59d1cd8941cc7e650e8d51b7a0ceee2ceb3b8917ef5aedebc31ac771b763df453a78f4fc9e91fbc1435b2cbf273a1ac09fd14e4e04a99b1e9ac77342e1be487cff039d6f3209e0a9ef731f019ed88b0ab2e7301cf74ae1a633e6ffa62896a61ef50d06cab151fec387fa928c026801ff339299613f4c912486ff69eba0cc885589843a0fc3d29c286a0d7b9749af28d2810152421838345cde97137a21034f26d10ad0587a0f7583f1887da0033b280e8e6b24084ebe0aac0102e162ee4c81c949dbd193d71156a875fd00fe3a864123b38c83181c06869c28b145e924b507ed43e561e39ec5ad51f612637a177c9ca2938d2fd1c5f19cb15a7a32ffa5ff137076a38ccbc584ebe1ff787de700d26a37516fb00d1966871dbd72b65cf4fec31742277d687c0f06422e9832db3bb0daeb89d8982a3c907383e0f72adbff9781c755c6cf798d55a9720862947e6e2d01bb3604b3823c4b5906b672fe4a1f70ec5f377e81f1272a8e46136452e4e8ea552e61d7a637fc1ac5ca8a7eb2d5b7b6816bd96932f63d1b29873947ad12723c9020f7ea695219ffe399cc4312dccb6d6364c322c7c7a07cd9fd1d65580cda569156397418ce9d9284cadfae257fb7008d303fee62a7a8d086c2b95f9a42777d26b07148cab742b7130bdcc7ef9e8068ee7d007380699c3401854265922c0d6bee7ef7f86871ee4409527999805621d2a8e8495d5dabb846dac61214085a17fdd4851d5c21492353cb3f612d2e597016979f8d46f833e252a9ee6ab61e92f9b58aac2872a9d8d29538202a90daf6efce69abbc65bb2bdc956e24c32e2a774dd0b842bbb8251126b8bbfb2bddb38ee488db23d53bcf41707b6af982bf663441bebef6e27d6f66639096a4160b0b14099641e2eebe7035adfbfea158cf294c93a813e8eba9cdb52b4983162aa3931de9607c938d35cd4bd3cf7f78dbc4c7d44e71ec7b61f0a0fbbd13e7459e2ee9ca5a5698e991784c631268d4222860fea933f9bf455d63799569db77d41870f11d63853786c5f99a3df0b1b884cab6ffc1b28da9691bbd178179e635ce00431fe3b6af929b7fd571d5ec88673856ffb2f60744c7d3a3adff6c6237bdb5eb1d87ea97d782eb30489adf5ed81f07caf025ff4369c4972db2f760ae8e3bbd1eab6ef66bb8df37088a32202b76af8141410764d74cf1bba7a60f56ef9b6fc53565394dd0abdd6f410307224af899b24d690fee8fa8140c22c82db6d7f078e6bde8c3afe88c67716b2dd6b1ea75510b7bdbb2785d2dd9a507f31d9151075a640b839d3fe91f99568d4fec58fcd8430abe4d4b3c1f8ff331a7bfb5776d88696fd0d108d959b99ced0f38cedbdbdd77da7da1cdf900181ef7d676bc2c95ca98744c74632d077fb2cfa26661f967159172aa38dcad5c138df7d2cc3ebfdeeb196b6fc11d9a966a384d311fc920538dfcf4b4910c00d8e4b51287eb65d1484aa512030c1db4c130c0f38fc6dea9fa279de68548c405ed7ae5ee79ac6edbb8e331131c36b80fc2988c5ee04450091f8a3067f8817c5c784e837a7738d54089d08027477339209f237646955373e2aec76d7607386e3b0c769e001227f05bcf629e28dfc0391e31790f056dd794c33fd42f17f3b41dd02cae877fb614c2fd976bd1227e8dc153fc29ffc0368d49811942d8b48edb8fecd3fac6d431a7213922974fa2bb8ea1371dfa34f648aef381ec370213a0e684637c38152e2dbec419fe7ff15fffdb1684cdef3b786c51c31f32f9da097dfc2b71dc286d2a8d9aff1076db9387e93351016fa6e6a6715fd66bc2215ff5eeb5eb2088075b519f405d7710c5bc456eac6c1b19dccd4139212d60a3377b760980f2973101b40a3c7972a06c2fda66e186e5d144086270d92bcc4c3c6299f9727ecbda875d3d9ca25ac73a6d3cca047d16b4714a4008caea12da5635b8800006e8b45bd8d265d299457891df2fc1b706dc4d58c70dbce107e61d1cdd01516c07681d2bd22c151d8026c7232554c9e720ce82ce6656afc6f791b4bb877cd67c39db1d8cbd28965b3c821b39a09d341d08f70289964d3330da6580e807ef9889152b0edb8da58b88708344b03200defd2d820b3b8328ea94a17be34c5363efdf36b3224f1f1c9d59aba9bbc5bb48f71d7602300c7510b5467e41f8d0b136f1192fae4fcefbb93d1bc78e5876bce0fa7bd4f18f735098003043c438b06210d3793139b8eb3ab67e38a22224b8a1bf624e054826e838fa2b04ed0d59f2fdbc1d4ffff47c90ab4d59495ae5af41d18162921cb81e971793be8e8a5a6aa44fb5e88c4a6ca7b7eb5eb136130e3f084f80490397ffd33070d0ef7b233bc553e75fb09809df801ef2b1091d754fb679e80378ecd2e333af118442b8d2d552b56237957e2421c0910d4105bd2a8a71592285442a359326fb97207843d02d8d8ad773d7740307cab5d0af6f1c4fa1a7705b696f6b993fae3cbecc8c78fc891ed607bb46185ec74c3dfae7c16c7c7c0adf1bd0c602a5bbba39c62ca8c046981d7ab5c6de88eb0ea441e591578f1e558b5e12cacaac04bd09f79400c8d722b1098665bbd4c78285e2394294fd5acd5b1eb8553770131a6bb15783de6c6aef25f99120c58cf223e9c7ba158dfdea08e787cc2456980d03549a471763e8113c0ceacc9e2678981cf2e1dea04ce28b167741f60e2956d40b3cd7a0330af8e77e212f812c507a2d7076ff3f66e08d74312bf59be12d7a6bcbe57a3cde2783f0d7a2c07c3d4a6962ff4f146396821681b07e610b3ffe5eb41d1f18a2cf9b042fb9f50e29c39abfe74c97a178b2d01aacb06a6143466390bd94a18d234b2427bdab5295244f8d669089434fa8a2413a70f62f323304d149bf05277146e5f73c39450ee9c51cf198f4be9d993806c330f8fe9ec2b9448b12ed28e86cdd930214002a2495ee32282c595f383880f114d7d1a47271c3932b9a67f1e5698452ce3d848d3392d359c1abb0de746cff80cb0cd92fcef08231f496e2744b8022917e5d2df340857e1fb132dfa61f8ee4390b503633a08c835384ff8cfd93efbde763b72253f8243c3455cc99f99a794952fad96b51701d42c600ce047b7a9b2c108e3a9c42687a087f97a606c63c5a52c1d8ac4a300a46e9adb9bb988428f913ccf442b40049c41ce5d6df5ceff441568ab99a5d564b58a71a4513d81a948daa72bb204f62135d3aad5e87a3b6727ef77ea402f70857c9b035505f516b0bcdac3437e9948cd54238b6f42de0eb91a2014557297e5228a23b0949ae047860ecf952f947ec3a0e5790986592a1ce7e1fd98e3c39b9dccacb12b7355d6d1ec8bf2148785587c358e3cd68d52024e4dc37ede40b9a3c7491ba3ad097ed2d9c44f077c6b2c3bef78a556a7cef76af352caf34114de026e30cf8aed2425adb8eca26e5517b55fb48816d6d51e5b45fd7c114c725d58c2a7fb8ef07bfe959943572baacaab717d651cf1b29b8e047e532bc39fb07a22732d4109ea08a673a8ea6a873f17b403c971b7350d9c79eeada8aa124d5149a66d3a9cb9318ffdbf97d428acee2a7d6635d4690180780d6b654ead3c8caefe2f37d6ce12a13e9e9c236508781f759b99e27f782e7bd3ba8e772eb8f26ba37391519e143c60493c74249234fb91c6afc972fe80e241504588dd00abd03df4616b58e93b78cc840df76954422c4d938f933994ccba81303a03a3207b611be5f54db01898606d5351b5920a236df8061243b9811b0bd97c64b857827a7a538885ee6319fd08b5955443d1a8ff93f48c6122cf03c22d8b44750b38b0ca4107d6b0fb52366184bf2d0e2ce95a1e96c5742babeddd5acc2ebfaa7287dd4eb1da7bc158401c7bd32f8960f7e55cc526d6106370b131e1e4acefda1bb4a094096bba140d2e43e50965c6b0140b897d0bb5313e5cb36a128c9108c81f987b481c33ed999d4ebaeabc2020bdbec59bec81910f984746ae410b862d81b77419d089b7aefe99040ad8617429c45583515e01ad6badb0b8e919fce0eff53de235cd36c651f1f5fdadd2a7b55d936f3fdfdc72b81105b7682312dfe67df085e64f9556090ed1489c65745c66b2c192a531f3563d3570e8976086edfe23ae97f9fa8d50008c0d21816f79d81010b1b421593227e72f00b9ed365acf76ee0cbab69edcaa89a71d53fb2f927bdaa9aaa26b6722293034dc26e2f81f720cbe04c921011a3bc129f3eaf41d79bb5268ac4f6eac8e80a0106af24bd88be2c9d8ce36e1fba1f07d2b48e0f4daf94c10284b234e90e6489e6d53a442fe30ec96972da355c99e4aec6ef69e7584a3e62d5760c6b8f2cbf5854c61560c3c145ac48246d8d44ea7956ca4d6eab7041f893ba2f9d65dc27d705849efb7b0320f695c498bf8222ea8a006fdac8fba45bee71112961100d385cd650f3c97c870075952996a808ee8ac68a6074ed7cab0f789c4359c5690c3946edc3de84fa0b7eab84ee670633a1d008f827f2ae53cb7037198ab77bab5084b8d80acfe0e1cd22bfd22028ce04c323e7a4af1b4f7a867a97a0a45901a5f2ba9b1115a4f067cae4556eb2a8c2a5510d94d1525c78da85e924fe6ac00bd0fd294721da5852c1c8768a8b8e29fdc64576be17dcb878d62f262f1ea8361468be1b0ade832c3d435575a637eda1453abbec2712b6c4499b58efbd6710fed925f6f74c0bab6f94ec2debef48036eb0bf87bd8a9754fc0d3ec2b6034bfd608f9ce63f346bdcaeb687b30fdeec92011d5879b8996b5f869476f71ce542d35ad193a836510242235e02fcb6b98ce7ee0133230a17df7b6f7b04ac24ce5196fd1906ac49880601512cc8b034c635f185c5ecfc267a65822f9fa388d6fd2554e261b220d860da58f220f3a9c0e84f584fc2f616baca08bf5b07bb11e9ce61296429858b1149911603e61b1138b0bf7e4c9d29168def3cafb27e0178624452e3baa8fd8890a3f46682877ff9e993f9609031b1780055c906cf80e37acf9175988248557456c1b3232bcd67b8c5fd71d349d4f530bd49a7ca101c034685fc279d7335fc26669bbb5186b241fa6a40a990b27a59adf528e1444e6ad3ce5305565fa9fed9a32ac5bad6b64ae16c368d9c6e33b50007210d6436b4de080a42c64628aea108b86cd67b5a865cd800b1614db47628ebf54335d742e81949c2de94b4886da4121cc586e5fa44e65f0d6eb02bb5c18a018a30e9fcdadfcdd1f43e3f65c355ce0c54d0eeda86bc45332d26a0c119da8ce743a556c773b1d1f42c7b3260d1123baac33cff6e86cdac144245025001118475c4874aabbd51732911bd430a24894726488ab217e1cf5e18bdc4b501fa0efdfba451ef2c761f0e4754050ca5546b9b20df017072f163dad8fe02b13b04d43898c0e38f80024987cc7f3be6fa8639d5a0fe8f50e61d257e3a9f434df7922880f5f11904a13ce404aa3fd67a952127142c4d2bfddc4c4a8fbaa2aa00d65fa22d6d424ec13a09a44c2448ca8c926567733190e086685ce9f197edd3dafa33000bdc2a4c020c77c520d089cfc4affda093498229239abfac9b841c1618398101e9836e3f4a71546b96602934c6d36b028d7018f441cd60efe2ae3edccd852810e693a1b5a38ec46a712d04a46f7e0593173825d1d414574d508fb3c709ba6d1d68c242f5bc8d16a280c215e950c4a763d4891b34bb1d86899527d44f9b75c429576ab80b8aab37a611b972ccccc839d8b2d221402cd866594ab5845b39a87e11f5310cb27633d0f07417acab9d42dd23173499590dd37879e3cfe7fcc8337a3e00e7aaa25b71ad1c23ce5018f9953bab894331e923e31244075fc5106d39982e79bded31c72b57339cc0b1e1ca21ba2d3d3c7e7b8f1a33ff69d7eccedee723c09af0cc54b4081ab0c45deeb6648334b329274ed43552a8c47c4eaa7875ec8a06a9c6fc185169b5e3f0805dfc723720276b9d3e1d19335843bd93d30b443849bb6170a44ad3124784398333cc51756e9556610e11966ac27d79cf4634e558601aa4a8944e311a3712fe204a39986b1ef07dc70d320a655e0a053082d0abf9ee0e93841a8b014f584a504932798e2370a376e061114b7483ac3893ade2c9b17524ea400562c52c75ac73613a637995b746088f8e4e10bc47ac42333ed4f49a7c1ebc9d6ed6a9c8cc9342202497af56b1c7258545fb8fd8ac6b3454661ca9e0c22a0424d2dc62df51e64f809e48bcf140afaf2a444f7e8b7e108e0c5a2a2b3632e0ae61f137f002ee0b5007dd39deaa3b6a251e3e5fb14d3800fef07ba20b26f14694e817f2b7529793efde9a3b275ebc9bccc88dd31d6529d7dd91da890ca47d68aef91d8685cceb721faa69d98a2dac7968daa1c4bf45fb100109572250409cd29bb78cb8668287ef1de05505958d0f9bd881452345e26dc929735645fa56973cdf1e78f04424f4a31b3c8f23d0bb8667095d939e886471ccb1aabfc8cad38ef13c4b7437c3934ca028dedfa46c6e69f3bc154e9e934ade2f90048f1ba152033800bf5f73497b10ba1b9cf799f9967f27f2735142200c377945aad78690a52dfbbcbeed60eba83e55dc891283cb277ff30fcdaab2868f07d5fcef10679270ff10c340b7cd355452d995edae0b912f638d0757c601b08e8eba986a04247b8d0214d0da79b6ae3f5df49dd62c8c4bb63db41d1155cb4404bad029fea98ba3b4a151a6df581fa56403c865ceb93e4541fd1be3110acea4ca9c549be7b48fbf3b97a9ab2165210de91ad25c624eb10ab40638a0212175df3d950655fef957522422e76b058cdc14490e5479e33874f7a1dd3740ded9c76b15a531487d8c9491a1213c33e78347fc63c3f3937c828296f537bafe2c347fedf0dd9d6d627818e349e765ea39108f8182dc0d426aeaeee6aee76851e901e21247fcedca93405db501850250ca1e2056ec27bb76411926d4dd52902d44813eb8b9cf52ff3d177b9654cd2c2ba1e05f3cf9393c6f1fc9af36d935cf083c3c36abd487d3f8b7edc26bb866af860c69a6aa8cc2c6ff288cfec1a30b717086dafadad25604056879c20e3048654305e24322f4596d05d93f3102ab99178880fbac07c91f227cad575cea3346f6d3019a414af9a4543ade23989dca8a8d5029ee3443e7196e04d3a88252b6c3e85f5e3925789aee56a5c01ebb3ee96885ba1683bff984d180f7cd270089c2f896fd407ffdc27b07634a00e04ce68d1baa231d8cd01d5e25516ca55615ac78284fa9bc8f5265930e40b7fe5d0a5a461a4f333c859757917da07235db36336e4552f128421b36032b69e083862375a415629858e46a19b5cb0a2fe09634172acb3cb8924e1a7819f0a3f9c0a269876859da5eb83a3379a000d9f60e64ce4da146e0d2914229ebfe41d292333015cdd185a3a95dbea99f93b6c947c8468dfcfc072f489189fa98553f9d77463c9404b603755ad8c75651c1166461828542ff75a74a9e1be6a8aa05c7612c80a38a2976c63dd50af27dc43f3928e143c23ee4676da3a1228ff2d74aad0f1b8de81a6f943128f954a3e09ae7708a11c028809c5167e6f96830de26a7d5b7abb213a067e5760c5aa87d1a4769db461231f962c2d311af08e24fc6048ad99cdb5c5304474382f4726e871e1953826c834ebc2e8aead5452da426b2139820cd7138d2a787e4f78daa614b74f27a572d81ed08864868e6f80aa79e230151cf597c11b2f59d143d2890f3faa36b91a1911922fbb956c3b239aa2d84d8224fe337fd855b9bd82efc76d3c02b58f0f1c4e645032051dce5abbef8a59e3dc6382590d9b085ebcde6c50ad016c9229e15972f066281d85d8cd27109ba94e21e0208f89fe438790b84951296eed449f1446f1bf4761315b7b39117813f446d253d80ddf14fe5499003d4d7c8d63d745a3b898bb0a9197d3579415c3e4fb14759067120f14296b1577f37d1422374d12f503ebea32f56bf32bcf206caf28afcd0afd7d6d57c3ebd55b8636736ada8138b2d071acd343b890cce6b1f5d693a0a47db79a821ca4fe129bdcb6b0183ad093f87d4e28ed2ebcfdca1904645ee45c5c24e8ab1d2b97b43f42d421f1ffe3a50dea0e34f3fe46a99647a20536969399c6c098a854586a5e9901065a8ab6a8a51900f0a7dfe3bcf8e21e1ea996f62ce9e746f878380bb3b511e89bf700cf53a4164ce52fd4a8a559a84eeef9a92693c3a8457835a3fc780bb9a8856e3efb49a4c9e4522e71452db1a7bee1bca865d9c55dafd502937cf15b0aaec711062079d175b8b617e24baf4176fda216398aee8d467224adb873c55978ba43aca420841ff94fa9cc78f1f7135612b30f473e8e8e4959452c60414d29f08dd7353b1021ae92b644d7112358026f50393128d265b4b957944d73c0254015958ebe886f5c0368a8a2580deb1ae1a46d458ecf5333f4729afccf04cf655145c7b646f015bac49525a40dd3fe60eeb10685e6042de57c03a191b895467fa6a4f79f8439fb504229a8a33e0c231d813ec4d52270a6d9f48532aec154404f4d1a41cb4e2e8bc6784759a34f5111d5531a391a9093fa023975053ae9cc71543dbf22d770d60ab7c850576b02a6d517d64707e35911096aacec02897a28a0d1adf8002ac092922b12ef8de9c2186d60d4bb3c2c1476c4baa19715ef2a07c7a33e1ae53ad358868d7862d998f0e4a91bf980a658ae8453c0e6b0c5274f98bd8026bf2d620772f1c94a19a0e61c8b0ee5cbd10e51b385d8a08d48e0b1a506ef37c25d0d85020c2d29c8e0a9527a01e0aeec9e7d0a342a023cb127d76e4fefa06764fd183474cd74218defa7be6970de8c3cf7fa1e4aeecbfd38efe20b11ea7b486c1fa99fb47afca89f50ba3d364112a849456f35ab9ab0fd8a42cb85fdd9cfa26ae9fe4a5b8231e958e5a8e8470d30f84f01780de3b5433c4b05bac420b385bc847148f251892dd091c8f295e64bd8cbf89c52b9045fa4ad31673db191ccd07e190c3b74cee0173b3ab869388c42b6f5316ce41f961ae3c7547a60b08e1dc34bfeebcaafe798b90194c368673452169c53ea807d004d221a50bad9953ca9a209c76167619a1540a3fdbeebf823540039778aa23ef1ec5c7c95266d81f74288535e27dab6c2243650f1ff794bd39a270fd0636b58b6f64ab3c8b5c818ef4f343ad1001314486ce47548356082f1750f98c477c065eee02360cb8a8feb87679c8f34cc34428bb593cb572ec2e3c5fc079b8d8484d324cb761c7f8f254954a207732537b90f84286a12bc8c915465a9fd6f613c8a27ce439d681f72bef324315df2801df0b2fadfbf76b852c3fb75f2f849062771bac1de42341ebe9aaef3d085d071ad82ce3feb304fa40f89fc7b62588e534b086bc4c4f81870f285a210830240a011367f1057f2632c8d39391562d14de0de1fb0fc77edb794312515e965766f4409c82def498fffe6e0a2733e10fb1506eacd779f2af8aec4cac2fddcd2dd89236102f923686b562112dde2c7fd06eb38cff7a68bac401f274b38f478f91ade550da3e7bff13fd9a7ea60107710463541ddbc0e6c34805ec60f1efe7245db925c568b6ebe1c111fa4a828d9e018b8e30b811aacbd455e0b5cf248fa0aef3d46bc57100ce881a82841c14bb1c8ebebb205bb96d16f406e0525c0911075e2a96901b556de1ac97445a424ee837d0cb7f87a3daf9ea08528ef3e339b45f301523a5c1cf901276ea4d4dac4ef872aed51e2d338e5a347a49b4b40a86ae4f8c5137f2e9482ae42a4fbe1e612ec14dc564493dcf86f6a39897028d03ac3de92d9b9a81cafc8b0fc403fb644fb55060145845715ec66e2202383e0fc99c4dc8c28bea441b1fc9e599326be7b9d353787add0d44634c82326fec2efd04ce1e1d5ffd0e1d990ada57a4ea3261e44c2cf36fc0779f8bd1ca0d157636a3ef40855889c098f66d80a49d6e4486c4dc6cbbe922040b8158427f210741df0dc4a3dcb8d50fe1066aa99f1d55a295381b8bf66ee1487b55b34d053d1fd5be519bafb8751a3d51e21264c1e6852924029c3cfaff5be9508dab2b013c08714d60f90a5e04610c36bff8acb36435383d23978f19f6d2f465fed7c8302016526c25bb04dd1b2bf76e78eb9303b95efeca4d37dacd896d5b3ab1b064263e65d6c4b9eefd5b532bbcf20ec9b7ccd7d27dc89b3ac33a71dddfa3b50fd8afd10e57374f22e18b9d21ed2f2b1233e655ae8dba831234f987abef56a5bb3e91c32009c2a6ab0dd03c8961205376d7bc4a47be7f0eeb5cf755743de285d0338e7beb31feac9dc5ddc8c21ffc6a960133abfe9bf0494fe001a7ce15f4baa11f535bd6c1e279a8750e0508bf3fb391501e14ed883f76cc9a5e08e6b97f463631936b3ae4ee2182c7af335750a494ebe2755894e073ec389452611984fa90a0edfe7d8a7a3f221459344481e1353efec7bcf70c41f02261079446cba7646a1665e2229ddca1bb04986e4442745b0972220559f066c87222973ac4e22b5b8867f615204d111b3fd95353e95fc6615894801a8804699580d33f27f49bb0d097f798d32f578c81e228f5cf05fe28326e16f238517cc8fec6d45813681dd31d4a8bd506625b3cd9c4f0405a14cacb35e9b9197ff9db15cbc87084299aeba43222574f5bb3de2e275990e6c9ad383864c54b299059a3cc655debd367e6baf12ca37629ecc8d6d3cb0adcf65ceb496cd4f3418600ace63e66ec65495249992c6a8e97d9c4b36cc9204618991d91dd7cfa2f80fae5e32a522b4cbd7b0f10599247a4ef4c0d6968eb519f150c12144c8f4eadff3b4bfb70575f4bed373305a43a9ff51b3117b205d10aa537a802e6b9669cbd2447029cb48363067e162318e7fb3f814ff65d54c687c2671fa4cbb8c425d29e4cd463bbd256df5d83f5c2ee30c22a62e7143cfccd1f0894c68b1c9d57ea322e77caf7b9f33c79e66700d9361870adf2bbaf4f64bca843eae4f51e1f6cad2d44acc1cd640ea12fd60be3fc14d9c2852be040cebe1433d06aa31bf01142da74d124eb932fc2f5dd41aaecbe7ca47b1e43e318d9e63bb1cd0eb7ad4b0d2ec47c9feb4e88e30737c918de8647e3c5cb619c93df33b4aa3fe8ed24341b2df4c2b3bb3be1a0aff442257ab55914545131ea5c8d8a7334678e2206f60f817ebc280549e16dbbb73a1e29d506635af8c81ee9d680aca84dfc345e35113a6888758ef5c777b47ffd0ef683ef43bfa8ffe46fba05f687f6817fa1fad85ee47abd173daee17b40ffd0ded43bba3ffd0efe83fda1bed837ea1fda15be87eb415fafed56bb8fd122d26c47453f2ed86abeffaf6d32956f234164c6827f7b4e36facb04ff3b9340a63fe63eb531e42a096b7228fa2501245d3997a7252e8218f6fc28beac357e67a01af55974f8a80f92c41aff2fb6687756011b8d9401cc5ec678980d9572c858b48e07498458517a946e71a591e2a582d527c1ca993ec188531b47702a15783137288213bfe932e1904a6269b1aa1ca8e618a9b9d320450495df1d4d55371e93cf72e22d107f3ccb433b7d6993ca98861d7976f9c7ecf63a25792fc6852110b6ebd1157be54d67351531bc2f61aa50a798a03809afa122c0f9b57aaee174d828b1e0cbfa5184c6cefb286a8e1e297fde4e3c4b21e8c942c19d1a0a2d429f8b8ddaba820f24344365a1df295711ab304c93fc15b4148cc9efd3fe985c5226c5ae2c7596bf4cdc324f87ee4206222686aba08384ee77af11fd42e82fa6e849d3d72d282a93f75dd88e07f441d419f6b2506ca83b42b5969179208a806ba1461f3659ffa90447028514e03fc0c6a125cd765131f4a7494257e6e39f05e9cd0593d661fc29f345ea588c948c112ae8f0f2d1c9f9a10b0dd9b331bd5ac5ca12271b6073d525213f7e584546ce79254cf6d56ae825eaf6b55650ec9fbdd6c2e2734db1357fe037f34e167c1d561dd69582b59fb2559b33733d1344e4050708828ccd98c60f8efdf0d4bcb893ccd68c51339545778f76c9d217907639729139f5f2fe863690f25587a266674d5897fd1bb10f3e324f7d3b553163d7de7c8421338211aafaf4c93f889172028570eb9463415282f1b345f611e1474748af3042d8d555cef3f7977036bc6ebfb52d26950e05de58c4d3479fae44cc5e4d41ee8c5ecd2db1fb8f15937fde596795b6bd42e519047013f22ddead5deea81dcf55ec5a7604187ece8d90fc08f87d7643dc477d525d7ae2c36304e507b7627ce0cd2eaabbaeb035a238144434b2ac08a1ad00cecc2867f346a6ca078590f2c315be3decfcb819bd74b3caca98b5b2a2f785ebe7a76166d5536f621e3181a353cabf8e244ec1f87444b409368509f26062360fd01dd52e1216f2ea32d06a4c58a9e07d7a0d32765c3936dd774e693728f7904321dae50b2efe2b4f01a6059b917881f8ec981cdd38bb1b9493ecd5c340468ff8a7482dab33b716690568b358c132c3aaac60fc6e541cdebf518ad2943ad9beeeeeb2a4606081f70d2c773b984f903df33b8bfb747e5e1e57fd6c1ec7af381b3ad47f0b432e8c071f608319e88509f7ef48cd65986f50d77afc8793fb4573b87f2dd6145c4161d9c9973fdfd4dccc0c75582dff917c675fbfe45dd8ab26c97a74d46ec7b35088161581ff894282c785db3e86f5d51a81bcde3f3b9d4befd1aa2e8b452dc2343cf84bb64109aae07acefabd5fae1e73f73aedebb18ea47371cc32729c5713ff1fa3d977be1bb6fdff6c688db640ddd0e90b1310663d163f373d5e3d7f74db260b7e8e8fcdc1b8185a16b0436c3aebd123764153afd07f60e270a5c3c942c14bc7741abc36d46221c972f072e5283c012382fc1bd9ec723c9257c884faf7759a2eab86067f5bfca0b799dd82f2024a1ad036b5bfc5637d024e25079654a4754cd3b56ef28f63e891d0075763eaa24133fe79c73a9e8838d21d697665ea4e1523e438e81f4e2f499d4e0d179792639a31b9d8b9f79babca49f9ae9c651afa3374462a1eae1e5184274c30ce578be4448a831e19af9a008baf799e579ea2bd765979e61a93c1090d6334a126855f93ff583af7279b2b334694221bf7f94e835167eb7b8651d515635de1e7ce22186648beaa646ba20c410db3b85561464c9dc78ce40a27c553c582444a6ff0e918a2f6c09d71b4880b88031a4d648e91834a5190be0e854cb1ff33db4072443b579637a0e746cea9c678c904616220a027ba3cdc94b25183f9b8ee441d432fac8c69ebd2e825c7817de30d24bdae0f369da75befddc5fa6fb4a2fc7fed15dde7edc5fd0fd4a2f62af7f8351efb97bbfdccbe4bbdf70fb73bb44ff95be1cf3a1bf7cfb77bba4ff94be88c5efe69fde09efd5a8d7261bfe0f1511d0def8699af2bd227ad557ad5b21c2a007e75dca2d72b0c2853573d96b9270d562a70547e51dcaaceca2cd8f9b1a89ac5133be220f0022864ec2663ca286922fce245f940bd266c2f3a146f790c4631440deef388cb348c1b460c1fba221f3b6ed6e5468ab58a67c9925d6629969555e495f7ad0a2bdc1461fd5e97a3ead74f94910c960b97e97f906bc87ce4122ba381c9523744f2f5c1e4cf36e03cd91d40e939448fe40889965e8035a484e82f1a1fe805223f6ad43a3e151213b365cba26644e51bea28c109c8467a472c27ca4901b03b6dd639d5c3c9d2ee440b5a77c3d212997155333ecc820d0b24ab2443632acb51d6ad97be427b1251ad30773fb84fa3055a18765493e56fc1721882addf0154c9a31220a64bba65ed2c24dc853a2b02bc219854915ae6b863209ef155b6ef118d2aa53cc7d3b2d73d0b16c6886300abf52e8df1ef95be5fc028d8376947f6bf915038268322c3fcd210b98f2926395ac90eb77468a29a053e8b8e3b008d10a924246c5e93917bd1c9aae4531c5bb4e1e1f2faa4aa78ebfcbf91b1382ed89a4602827b3eadfe326e0ab24f798e54c8fcb8d2564bb70a1429c62d9ca0f0115b00a59574f2afbbf38755aeed4e400c65765b740329ec2561d38ffa49ed146044162eca8fb117908e1ef514a19826c24e212f120045e04174e24831950f478972b501c69222bd3ad8c40b6414e1026a0c40f2be15fa97f257c94e7a7bcaf56a2f6a2f68c639b6887cafb55ea47197f4afc57e6dbca59f38d54edb3e084b2746c86c2fcb3391ef3cd0cb6d913b08e779997019dcdb8b9a823ad57d05563b85d1a7ba40effed7eb06d0e7007b7716421e9852ee960799a3c956c92a7214cab978070cad77358662ffc642cdbf4159fa4f7c48573bcef27ca3e9c73daf529bae68b750366f7dbce41e1b9013720d9d14ba70d862baa743f72148a9fc0ba20188741dc4bdbebd99c4d116cf03afb704057ff095c216a115321468d2bc2af149ac4b899c54450e71f6254be851740d3565814237fc898e3cd04f22bad817205bb5d1be195f8b2a913d3aa32ec220ebc8444a05b20d60a96ba138a235d114f9d4aabcc45f776f1521981de82582bb8cd9d108e24473c762a8d32a1dcdbc54b0209340b6245c11a77c2389247e2d189b495d9706f075ee224d02c142b05ffdb09c591568967a7a45526bcbd5d780997409bf02bb2b8b56db67e4c30593858436a6bd359692730a743cfd8528347e228deb5a12ec038b996123962a4b80c2e67d35eb5f733a52f05cebad3b639cc4a79d71380942081cbc104d8a7f49323f4d17a2e84f7c0fce2566802b5c5fad0446a11dba115aa2de64313ab45ac0e5db0b6980f9d682d623ab4c2b5c57ee8e2b588dda109d816f3a111b1456c87be645b64bdac9bc0b43851cdb6c8bdac6983e93891d1b6c83ae45d553a433f644e6d45b5b021d785665b182942d0ea91925342dde97588ca2f89c46dedbdb5ebd0e8525905768913fc0c9e6da9d1b29ed8f497776d15925362099bc64a75907c247d935a862c5498d4266d559d5c1a4bd924d6421675247d935a5d2791c2a43669ab909d1a4bd92456ab93643fc29a8eef3e2269f3f421e6ae11ab6dd1fb6781e1424e5c3e2bbc77fbf6a4b85da8680c5c3def5df497b8ed06b8d7b68544da3e8b72a4b12388de0979f10bc0b374c047c8966cfd388382c7ce66a6025cb41523cfd03d9c21a6b61120ad59a1337596578472aeb86d826a1ced645bfc76aded755b0b7657d6dd7f34e35664ce1884fbd94b14aaf56f3b66b55bacf4151d6b4b37beed56cb3a656fc13873cb09c63ec60da5fb1a2b18289a8e97b1a47491b1888d6f34f1fa47092e1045db43265f3b36967a3a463c307fe07bbeeb3ca935ed6fc57a19b43339d06337b88fbd3959f05234d0e3340a5ee3ef2ddad0eb2fcb9be0c6dacd2aabeae2883ad597a18b05e11c87f2fc417aa2f5d05f700fef385f6a4ffb5b31f72fc609dcf5a1d8d78a94d3788a69291b38fdf04c9a6dfc80b06f73753baa2b61346ecde61fd0f1969f2ef94b8f4a9e3a11571a3b132e575604d2609d204464ef613377d497c1c027375688190a32b05aff7ce661cb12fda76fba05af3ae4d6311f382c1ece1acb4bac4e84baaafb6d1caf0509544f005230f2a4c0b3f6ebf4caa8cb9cd15bb73587cc2bfda88092269c458e826550fd88330a9c15ae812f12a536e4d341ec9fadd1d3436d2756cbffe4f6586ef6e9a1f85d7824f49d61d432137d15f50031d1fb009574d3406fdcf3685928c0fb74ed556444f19d9308697a2ee1a6a4df842c3f7050405048c8f8306f6b7e7c830840f09740334c23454f08416c12df5d593068faa55a00c74bc08de22f7737c08e223da80e63d340207f54807e0223401d1e3acbccc536a4d918908d3dd9cbf67e1b530202b94b9c4938b680c281881dbf9be8882898b0c97fceac2b10de9ee2f5b10bb5c7902e022ee061520d1126d777d63a5954f00fe168958a7f656207a9a94d667254d0a9053e548f031adcd2925c3054b24a0799f0a698dad2b7a50b99342ef144883cbe68de68bbc80f04624760a81e8450609d64231852dc797eb07efc776f18048d2da2c0e82724a3ff5f86517a163ed0522f4c84e5d5e448163542c8967bcbbdc9967b4b299394019808350948098dadf0eb2930ecf1a9d3c9438c710e7b78debd6c9b63ec27f75e61f7c0d475e9349d43fb3863ea1e768afd847b757308e4afc7540ebd34722dd4b6cc70ca39cdd6e573158b53db827dab2edce6f4d61cc6807f8617fc18ab90f29b935f4fe5eb278aaf6f6078fa3ce5f3aa1056bf19e31318f6f8537e49f94bcaaf7ba9ac42dc3cb579ca53170c7bd0d3fdeafdfce69bcf53f9c6e504e6d09a73e87f99bab8cce0542c2d5c4b8b6fb8c5c3f8845bbc4c4f985a7ba98d3a4c26f74e27b73d43c343fcf9c9312aa33eff4218e7aed374e734c0d34be737d44fde654f0627a799e678b187f1c51e2fc6a71c02f953d8e35f9c86d71cda1730764cca731a34f354c190c5b39b6f30763179054ffeb538ca3b79f593574ff97517f0e69469af52d171eedc0351de820243969c432f3ef93dbda4bcf3945f10e515f4fc84c1b0c7634f815e1d95af77e08d97b1d7937fa730877e2f9edf54c7ee55c75e33a691cb26165ee8f1d1a38da1c7e7cc32ca28a30c97461d31bbed443f4aa9e7e510879380e715dc6e3a972894e7a7eaf9e79ecf00bdf7a2ecba00234f9d65899ea79e722438ecf139f36f52ae726e0596485d9ce6b0c5b95ed18c7b353d75d3b9e79d632edd5b42270756b6b8558e724ebd5e1e9e773394f021deb8dc39f5cea96ffe81213701ec9f4f0f0c3bdfb2a704775e7d07ca3d7957a84ef38b7be0cbe79c7b270fed77cef9e69de71b18e23ce53cf3c0d07354f694608f3af62ddf60fff2cd75cf699a032918761927f538d3ec9ecbabe3e69c339fc5ab7b3974c9b425e7cc4f7965c960f8e369e7b9dc2ae77de0391ef4e90ae1e65d98333f95b96b63720a36f52e532e87d573a61702a99466139733b120549e87e939f770fee433360ae51b6a022974d9f3d8b5e66f75f20ebccecde83e8f298c51a81ca6be9a5c3e976f4cbeb929874068e6095c417bce69daf3783da769e95b0ea2fce6de973b30c4f9ce2b3e79d75594c77cf21960ec98ea997fe00cf24f5cbef17648df3c5e1d9e6f8f7254eec01088fc93736088f35eeebc829c9fc0cf6926078638e3a47e73bb859b8b00c87bce6df152207ee7150c71be5a7953f09cf3c058c1f0c76f9e0cb0fd1027f55d0e7ffce6f17abc2693745ad302ce47b773c64bb140c2e789971927f533c81d110b247c7af03a58bea54f3378c243a94ccb3c9559c96c56c6cc42afb698324e914c88207d1893e809bda2d4eb057a4565e20dfa817883bef0c44d0040101d500306956ace2c1373ccaeb1060dc05397580e3a90813ee6118bbd7257a962bc40bc8179c598b0984b972ea923777c03f1c90b2e68203a6002d204cc31192319e9984f403a208a972e3139c5136f74016a6d348a468f59cec6e0e3c3edebac546e70844f123e3ed169f5d94e7df3e4a47e81764a37da148638d363493a2604eed99376f4e9b19bf698339e77aaf7320c3186faec0bf224e9956ca15e498ec6217c47fd0231c65c5095ad1238eca2298d668c742b330b3477b62cf42a37510ff54a7a915c6dd1699abe8ee0701ab98c9a55330f67d14b7a6429153a8498c3b4b9c9e4160cb71c4a4aa451a29a61b4883ef1c77ce20d5a3325a24f5ef4f5baa223a5a44646980d70346a16115cd29ce172ec189a3493aaaba857d27324257a51a289715322a299a4e4dae179cd2a3dbd9281ca22bd9274c92bde90d1c3ea12c28e749a75b3d3ac21318775e93587984373936b1928a7d10ad4a3a53e8da8c709ca20318c169948e03cea1526437f485f3e31c70f72a6baa614821af1d2a3a434f824b8be9d4ab9e2a5d32cba08eb8b1afd2003a5cd0aa751058a3974620ebaa45775c8cb18037519e8ac12f30b8d7926bd9a55a47d890ac911d94b2ee93caa97ff0f91500f513a8b669466499ac19c1e49a4d1558269562f8fea33cf301bbca16eb1557e9936a49196f2e7a58dcf514aa977a4edd37b8234319e102f106f44a779ba7a259728b5e2218143eda9cb323ef6aa957a2539f0721e3be9661a38f7d15ca6e0e4baa7c75b81d8e29ca6bbc8a857b2937a25b71ebd92367a65a567de3c3d7a7a255d02d13656bd8a9987dda348ccd16e2dc62a15e53a46bab55c7549d932e45e4a1c84fe21174a205e7a944b6a17d155a5676652c74897f8ca4bce65688f24adceb9f4588322ae156362945e83b6b67182269e68a289279a68a289277ce003223984b67c5a85c6ee60a05176179ae057486ea452adb0cf3873f2e827445cb7afbb1394168cbf6df4821dd4454673cece67e7f3c3f3e8a33ab268f350fee04d9707917cd2ac9823eeb8f93c473ee6d49b083d84e8009d9e397512a42bedb2f1f2d852a9cbd205f547a4665d5f01f98fea8579bafe09ce60ff1e45d9f40221e69801ff94e880d9c51c5785b1679e7d419dc43ba88352c09b630f2352189188368c19c11eb7440440fed208546e2205e189bf8944bc51bd67104d68244f86f092cca76f34e6119591221dd441b3bbd7bb3caecf1df7de158df91c2829362fd1875dec5b9e91e54c3431a28d4812e1abf7c5623773077d1f489f36ab73a1605389221327d1246a14e88eaf26c6296e036db0af562ad5bdbeb170275026cd18a54b7f3a8937aacb26a209d569b0a4228f649419347d0635007ac386c0a18c335b9277a9bb496022222222a31591258a37aad7e038503e0627cfecc0a6d2aba478a3fad4e2ab7716d184dad3551a376ea45aeb7fd9098e92885239a46fcc3157471e45f5249c468df432a9f3b0b3f82ec75ef1e87c22352b7a53893bba4c3ba33a8de62d81fb807c8c630543bc51e76f59dbeec21f8f73538937ea132c7d4a89df87d3286a463107f6cd679ef1e13432c99be57bfdcb5b0edb877b71eefc03e9d33c837cace356bf994847f922c1d5a88356471dd42ba23903c3249244d5897a3aa67a11235f6bcb2526c79f57a7a9f5f3cfbfcfeb87a751e61709c65cf32c4f50861cfcd63379a5595c7ee17cf3174e47063a8f709e4641d5abce151cb5882684318baf7eadfcc1402aa324d348f68c2db57ba157d5fbe550cc61ca29683947d649856eab00a465592dfa2a69f7a474729707c56806bb77b21ab8575c3714237c37fdc8444a940fadec20a896616ea3f906624e6590614ed3a96699b26ad3322ca55bb01d03a5aa573253eeb114aa6331486b137b35c10662924da557db8b8eba04f491c9d2eb0ff091c911b4f8e9dc95f78f4c968e7ea31cbd0d664e2910bf7a6d5f350b734f09f60dabf246a03d6b0bb6cb7fd1d1dfde0ee4e3f368c76eb0c9648b80f5ea3446faf2421df34a2d9d996fa1ec9b82f47ec99953ebaba71f5f6cc672cd6e690ef8a65dce1778b159dd5caf9a5b4979e4e500eec72ac6d077922dc2842f1ccbd2b6fd6c415b9239a352da7e36a0a19f9fbe1dd9906c4243413f7d7bb219116985db10750de9e0c3ada86848084f657bcdc98fe7e3c14a1f0f95fefd342b7c116a4adb3fa03993297d3cdf6b0aa59ffe15f98c7c41df928fe843f2097d4f7e3a95fd22f442a4f432f4f2e4a763778752ccd1befd6cf4a6707abc136fcc1d7c05d2fc9ac3971b50f949e30a1b7e27e638fdf40c071c56a39f9f5ea5c419cda757a39843feac5dfcf49ac50ce661bde2a763a539a3e56a55aa2cc719a3a4f422f422d42cea2a15c64cc899d80a5f847e7af86285143f3dca99d80a5f9ef89969c8a01257f13bd39091144d789a6920c51b137c49126f4c1073116f4c8ff39bfe52a9d7a466851f8f0453bd7aa93985feeab18918475e7a559a33f5677a35aa48cd8a4ca40cfdf44a65fe8c4c8c5c3f1dd36916cf2caa577e22a9e01a21f910ebf9e915acf9e12809acf1a10a4fb34296a557b342ccc5d7d32c39c6875f919f9468e9a7632ebc98a37dfa0bd22d428ab5460cc32a0c7169064f4c5e1b694508252147bd6a23ad078a83221b32384214fa554149900cf500094a5011448c26a6275d0d57a954733659f273ba6ace39658d99ed4b247ce84d90b0f14092e8b480062210e161871e969a1cf1ed291f7ee0010d56949c80d1ea96a1f1914913224d7428aa47844835e1441956f450840538c8235819143e3a4dcfd83176b254adb5bab0021e98401942154051c2e05982a55a2c0926cdf4d9055a60a15a0c2b72c208254c0429e2043480c10344a69931d2ab66b3ac46051a9a36812a2d76800284259e1cd103122b4630c1d2cc19163099cd6cf6020380c10d433d9872049e325ad9179f35d9014a8d1a3760e962a1d610325dc1dec7263b24f1dcc7263b30f1a1ea239289674e0cc3302bda15ad091d150db04c0c0c0c230e5c810206482c49814286176020810b4388d7505481c20a1457a2e8dc20c33ecbb22c231a52897a2a51914a64c49d0065538993222752cc23b548690abd22cbdc6650a6f82ce36811113785121169000825c0b002a9072fb0e8424a7562c58d59ec4cc02565092420a141ca154a3ba8b24511962b66134b49a8538a611816854b8b62478b82478be205b3434317620821c913202ea4e0811442990daa393fcbb22ccba4a852bc14401d13ab2a7ac1040e824045d291259018418a27a4a862c3322982260ba4152417b084a104cbf44208c3302cab4efc6cb1c48990c5b2c7300cc39cfc681a0d1e3b6a2533074bd605522ec182e0a205317681036983862223ac08010a1d7aa81285934a59966550766acd32ce0b28457449dc1344a23086d0618a2292f8811254b480c273a100c14d914ab6d8d962872b03e94452eb8805527e8038a2ca0a8a40549df460761340d9118661d8173b9a8685e183ea4406b30a6ad3850e2e23968ab058924516d605f18b2084aab5b5d68ac5ab63e28f05c241aa242eb422ea98f8a1cc6351d4313113cab22ccb308c66599665553ccb329ba964bb675996655966c555ab462918489609184938322b15464d8e999c7ac4180d42cfc6248c1660d86990c804497b0191a6fdf494e048f4914915a1c7885e899324944917d915398852892064e62a395f3346934786b2c7a03899e15a98c3348b7e4f914ab01bfa87731418e63cca37fa61ee3b6b734e26cf4d9e4ff73cff50379c4bef7aee39ced4e4f9e7791c7702431c8e9bbe4d67d1e674bac2e62d3e670e533ddb6b999747e79ef7bda0fce6e3fce3a6f7a138ea9e570f9c39ffb9bc2b783ef30bcae70bca39efec0b2aab104d8e3239ca4d9c53ff9c03c39cf939c679a41c976fb0a3f24d8be370df651ceeb17b2d2d73733a537463619993fb264727f7e5904e3a7dcee958103cbd9bc5bfcf6db3a67fbe61ffb813769c3d19e0d509ec9c6b16f0facdf4cf6f9efef9fc320a6b264ed33c0a86394f4ff682b1579dcf0069268b53304c39e6ed995a340c9ebacfa9679473de02de7c1905e47a079e9c05c4384ce5cc64fa9cfb507e1de51c78720a76fe8161ce7b8e0239bfe04d97a90786381c36759e779ed3dc5d0e869c8f1ea91151182105278d88c288285e7abb346a082efce65b8d540a630cd3e510e63b6bb10b9d0ab4d24a2bad2914ae1506070607e6d2c8b1b0a8b853ca5d5a58ae63bf5de727aed6cbe3f3cdafd38e76b4a31dedbebcd1ce51607853bef9ec9c3a866b7ef1fcbbd7431cfa7737872ebc0b5f6f9742a5bccb3729df7060bef30af3a9537752752e2d2c2c2c9d6f1d0beebaad63c1ddd6b9f05e8dafa913ad30286ae30414f2a7c2077ade614aedc4338730a80c038303835d7818ffcebfd6f85ae3bb940a05aa585872885320f6bc138ac53b30e52ca08e14ca05d429e3c0b88003830303a4074812177074210422181c5d0881072c46383775214e586fcd14e3ad2f8fae2bc899bac9e1a452a8ecda682897d476f21616d4e7be7d20e61b06ebf5ceebe7f3f2f0fc730c86a9c798a6befa0786a9a7ddf79dbc734933764a7dab9c07768ec1bac3d4398d7785fb815d0a9c7f218e0ece0b3fcf54907f72138f93d37c73f22edf6c4efd037152a74c5d680b0b2a85f250ded77da8eeda685fa7719bbc3a3e50c3b1e21c02a920adb5bd8e56f0e418dc1ccf1955b53cee555d4d73930ecd14bd7e26937f378740521f4f20c62a9cc3cea39f5c9543cf037152fff9e57c7e6e32b9a9ab9ebf8ecf4f1eef750c7a5e4154f6a40ead73d3d75f41fb795eae9103f2a6acc91a9c14921ebf79b4abf5e3d15570a318bb873d5e1edd0d73e8a5915a6a3914b5d83b8c9d633939f5b0773c36bfde757df1b28e2d5f3f81e186c2f7e4b8c7dd42fb2f5fd6916fee360c86d84f18e537dfa0fccb379ce31cfa38873e0a73d8a525c5924a75a96eeb52ddf67ddc9f9cf68ccf98e927aac3a319774e333df7cfaba3f00c90760ca51f0e7b7ce7b1ab27efc0d094f20e44790ad4713bf73e30ecf1d72bf8f909f49c667e6068aa7e3fefc0fb813a6ef7d5bdea81e18fbf322d01aa9d9728898031b60f83988f1242aded07ad09be60607afbcc3e32223a106afd88607451a535bdb38f8c0642905a3f24111792d6cc47bcec784c8a255c2d19ff013a4259128e3924e6ec9c69dcda26e8831e61849fd60f1b041ffd43839dd60f14880861a535bd411f1109ad1f9189d6cc47bc4807f2328772055708b57e9820c64e900fd9c31840ad1f32428e9c404e4141133c006af9902a48326afde82aadd80c0853328b366ee18591a056835b0f5a3fbaa9111126c4845e863249e8a8c847212a9e207d14aa42c9539e984326f56bc6848143ca93e43589d09ce99880e2048fab255bc855347f1005ca90ab25bd22cd175ad264858c233c519a3352c9e56a496bf238bd62d35bfe509e3953c558fa71d1c039ac492ffd85394397bc1cda2edf1cc625975bae402f5dcbf9f5a14c229424bd2af128091244a8259dfe2c4d8c070302aa4b7326b65a2c1fac28b5b0fae279597f5e7aac39ac2e4ce8a3008060598faca6c9c9d1a81eb379b1bb23732c8b7485768d0c99390970b02762c75b266f900853fea16a1d611dbb2958c7de3a4defa8b641ebf66b2601edc1f36842b74daa1b024f1cbd6a99138e6c11269c3c46b0f4a6940299aa9843078c7de831c907974e1fb143704f1769233109a76762cb2a750b5c316946c1a184011ef2e1c9476fa1e9138619335db58a336c57b360e829830377cc7499f493529b58bf54afa48d0c31de983c19145b6cd6cb0422a58d2dc2c418638c9aa6699a94b4577d1405894a5432924a4a4b4ad28a4b0538647a5583a69ccccbc41b9a14195a3919998e39c17ac88529551dc292ce962c53b60f380c383d729a85f96816a79329111c4a1ef9b3b99ad5ae29755cee70262cc60883ab75c04cca76ad3b85ce9a632eabd5bc73cb6ed95abc361b6702b71a65a75c6b170f1294554049452a4d99d4abcc064c821e39cd926eba612341f4f09c51cd1889b99d31b27a9c310b4840082432203ae6e3c3e8dd3bf0770e7b983cd3ac0d2e2d213f5c888fcc4d59356324a594524abd061c2d9a7f0801d2c2b2102df7f8620262ab82b125ef0ef9f6fb65fe88464064088942258a241cd1f2415dc88f1b4b0ca188265cfc4008a356750cc3300cc3bc061c2d2cff0042c414271003062b30220894968e8ece0e8e56751a66125cad9d5576c5e56aeda85ad569f0965c2e576bc7b6aaebe8d05082926d55a7010248aa56751d1a6219422e570dab56f51a70b46a1642f3119d5fe6ea4706a4fb3ad9b630a773723adf64299dd67cd3bec24d25033b902ae5ab0b02b7a70457af4a1fef547a0f1c41c78a152a5498841165ce120200801a2f3466a85c5a5852a8d387bdee729b49b31956e96c4a9562cfd95335bb276e8fc242af62f539bb7b7614a3cd26cab9c5b6652ec02195b8bbbb7b72796b99a2d59bc1165b7ea4961ea145b283b64e065d0c629065441d84c1f3218767a4543a0843e73dc2849fcc3e12c51c76ce6cce318049642920aebafa6c40e6336f429b932dc98c69df887ad52036458c69e73020d4a51943d42cacc849646150c4557b2fcd998d081b17df75297a1e8671a8ca8f71c05f2b329d42f0d4f16b4573a6638c69867a75d8d78a9ad57185796325c0ae0efada147166f30642768950ed589ba596e5b5614187cb5bb6d8cf1b7730b5b236002be2014f8f154d950ae3d901c737d88a6e0aa7cf324ef2f1d81fc42c3ad881a73e2baa0a4d4aad154adf55ba6a4bf50af3e89f994aae57dd1208f598c707d30ecb32dec0bcc31f4f7dd6495d55a322552acd9abe056d40db11231bd0c7c632561a639b40ce2f4dd3adfae9f405c3727cfb74e60ac620a1904864101432481e89425a91559e10d1f46a68db1aa43eb30bbd8a9d730437b8a3fecc2df42a7a917c7d918fd910476a7c6402041f908a3e320102920fb52426484b5e083d7fe32393205079264857982059894b4fbea3101643df57aa1526572079264b20f9f6a974e4fb0a95202c6935d759ebacb356395d6254524925952950eec430670f31f2fde4dbb728bdea5aab9c951ac97c3d7a15f92194e76952d32bb68a74546b527b95deaeef19e56786c7afe08c1f8054aa242e2e442d2d3f2c2c40a994110af53a9d8abe4f08639f20cf03eabaa27b93384e68db784ca61f4d33b2f69565419426c130a4a3af7911c51cf19fa6ed8f2d629396b49d66c5a497add22c25cb734573d91efb73040e6d52f40eb249b6c81619d923fb63816894e0990f78ebd901b62ecbd32c77307ea6e4208f956679d642abf3ad0df9d65e5a1138b44516e93b4ab3c20e2a426a5698293d95664526570c7d7ba664a559e14cfa2bd20191f51373c4ef5895ea926b8767be7e66093df8760da86762ab1d43d2594fb3620072a81d01801c6247be6be430b3e12587d8926f1a39cc74bebde68722cdea9e8f3f03acf9a1c88fbc353ffcfc60a4594de4e3abc09a1f8cfc00d4b7e6072024cdea147c7c17b0c6074992796b7c920c35ab79f8f82d608dcf1011bd353e44459ad53c1f9f05acf129f2536f8dcf8f9166f50e1f3f05d6f81801c26e8d0f509466b50e1f1f05d6f84431ca6e8d8f514fb33a878f7f026b7c7a5ef6d6f8bc9e34ab877cfc0facf17952a4dd1a9fa225cd6a1c3e3e066b7c9608996e8d8f90cf9166f50d1fdf036b7c8ef8046db7c627c848b3da868fdf81352f2340dcad79013d6956ef7cfc0bd6bc9e14dd5bf32aa2d2ac46c1c7e7c09a1795a4eed6bc929634ab6bf8f81b58f35a22e4dd9a97d09066b5908f6f026b5e4378f0ad79f1146956eb7c7c0dac7915f9f96ecdeb274ab39a868f6fc19a5714a3d3ad7919f534ab4ff0f133b0e6d5f342dd9ad7eb48b33ac8c7a760cdeb4850ead6bc829034ab5d1f1f036b5e4892b0dc9a5792a366c932fe7584d4726b5e48f146fc9ad750b364123efe046b5e432fa277b9352fa27823fe4c6ad6154a8e3eac3c98ef54175db24966d00c226a24a4195483bee79c734e6a29a56efbc748d09ca955926cbd82755443be837abe1b2b52873096439746cca49934adc538ce6b3327fd09e2d4f60914440487f2a7793aa8b33788658c4a8319339a614dcae154a9e48fd663936ad27791edd5b452a557ed33a9e6d02dd373a959b557de3152532aa14f6062d392486955485a99d8e48c2dad189931e690ce39e78c99086ca78ccd78807bf313706c1ecac86c19c794a36c4a942c4381c8125f28e18310a02802195618c99cdb40bc5d3b67eecd76db2c8d4c0d4e36cb321a15ac2862450f074eccd9b647406fefdb7e6bb93cc5b54dd9318156b3d6da8c39165a38faa922e843bb0151051541b44e4a055005031f7debe6a68da73e7120559fb5fa4481cacc387287ba60db5a78b9eae1ab974d7b156d0b6fa29c29aef2a681f3b7c83239e79b766db8090079935bd95adb66ddcd046e20e79c6bd7c6b4c9976eca21f5ea6faf8d9d4e7152b24eafd5a8490f959f3edd35a76088c2d3cfc3049c3c8c7919822fbde3b6540e8cf2d397c10d83f21d3bcea10a8cef5550822175cc35905e1bcdb3e974060e0a3f3d5e2aa7573a677b4d8b64cf12399c111caec74b8c44823994891f89c2b69a51c107b7c91c56981eb0fcf65eb50a73a687ebe6287bcca9492af41394813e921a19198b677a58fbf33d7a66d3755b909933b295e01a92c87636650825be1842892f12b009bdc9b72d9b9c6244b07c9369722db36802e57b6b1e851e15e4dbc3cf24040e4116f437d593c0e1561473d4c0bce6300b8a40025e6e4b04a9609805652f73008466183834400084de00ae1abf65415f5d06f9610084bea5ad09081a6362bf9e87aa98de42ead26ace79bdd8b397bb1ce3cd316e395485fd5cb65a761f6ff20a86f247be248fdc91aea52b4a4911291ac522cec348b4ca3cb4c1e550e5f831eb364656e6d504c6e0e3ed8c61be05fbda60be6d2468a17e2911c99fa5af453106127c26add3748c3730ac07535b214a29a5b2099a33638c2ddb2706e27031564a2b953de42970dc684ec87dc52836319fd89c73561f9f81385cf43927f731fb60f322159e4c616ed28a65564ccb592b34cdb471b3ebbc2b4b7813da3e9494524a295bca6e140bd7a9140b8b64911295f2585a585a5a5a52a8534bcb875b5a5abc96eeb6b4b470636c98b35276ad582629c771de7199148f82e10ae3ef3b7159e698b5343da9cc823ee6f62c88da8fcab67999145a29965915588554050e67519649c9a4c0446963c629884c4ac7d813a4b46699c536a61b01fa36de306ddc8df85eca45a378a333b289ee15c51b356c54bd8a8e7b1537a16fcfa8c0534af074bad54aafe29cdedddded38ab7a2555af2c59f99616d9d29d95ac0db5b136d485c5c5c525853ab9b87cd8c5c5c573e9ae8b8b4b013a53155a2bc6611927637f7a8674c027b61873c8f8802dc61853a1d75aa93492989318986badb572368692c07e178149e95666d26d563d93d2a34d26652665a659e6516db0454983e63f337f8a9ba5b9743ab33073d7ee0ecc35b75747e69ad53133cd64e632a41e1dbb3ba60eea590e69cd37416611b6039603cf662a826588b3093d91106c428fe59b9a6f44b0cd5cca352be25e51ce39fad2b75e498ee34090baad944e4a27e530f082b163b00cf32cbf588f2f6da699b280b31996611816438fd73cfb18f0db9bcc6d6637ee4afbe10adb1ea9644a6360044344485528a9e187491ffda0a4670a25860812c40eba8a16620624129a8a15684144083e4fac8051434b6923130cc107a12d9244410a42cf165a3aee1123a5602f7da05792c6482b56b18ad55a63754a0487f6576fa3b598664a9b930e9033093f1039a24a9114e4808b170f4e58c9321e20442d78a2f400e43d1bd049c50eecdd31bd7a4663b06949b0f44ec558042c9d7a8c31b6ecee8e31c6185f30d0adeafda1099e889ae38c91da916df244f6b1c90e4130337a0d9b43dc7da81282c255388864ac0b51973c126945775e52f1d2c3123e3a00a2035a8826488f457cb87a0a702164b404164570a2492b7a0d552a7a8c3251482bc4314486d0d7ea5cb3aaab6af8175f3deeb44298af3868ae1852755a612cfafad5ea2fa8e0abc73052895594be8671295e71dd50030fad50ea7c95437842f92a92c4571c6a566b8d4d7628d2532b16acbf7e806b738174287a7bdd5a6badd10d92f0010d8aa0c47343cb3ec0001fd6f89b4393bf05f87b73c8e2af0e2ff8eb06b836d73dcff33ce6da782bec3107201e7b01ae0db699e3213c7ce6a9cc6b34cbf3cc7dce44a5cc579fb9cc9cb1c08f901e2b382083085bb4b22622cbe1862c9b19910c6732d9cc8747fc25c0df0bc55f27c0b5b9b8c990173cc6d807706d702adaf810269ef076076fdd22bd752cc45b57390e3378eb2b8bc394b737ace0adc35c1b8be305ef35b9c187f73c237a9812850e54d800258996e702b8365e4642d9b0c5a31cbc36281bacf8ce7ad7759dfb8c5d131b8ebc55c05bf76b63b32ccbbc846b9305e0da7432a71d1dfcc901706d4eb65db023833799dc46aa67645c2e574fcbe435785c2e170d2d30085a1401c41850acd8d032b9940f5330257c68e3b30c85980fe3904e193484f808f1e2b32635e8e0335fa9e03397c1d1acd8040535f8cc699a159becd4f099d7b836d9176d75c0b046de3adee2ad7595751930a0a4e08a2521575cd0b2fe726d2c8d6b633afa4f47c87f3ee3da7c4ba018b1832433a8a20855f410ae1d5ad36bf89489218e1314f16114eae693283fef9cfe82144387496476737a7346277060c10d538e902085a73585f850bec2f850feb834f2f3089eb3090d413cc6aeba363886abb7d65a77b936d6f3b8c47bde726dbc20be739cc4775d078270b4e34303275380d1ea9ce5da7434fe9e6087bf9eba36373e81fab0c64b0b826cf159109dcf1c756d3293e331de64f268f2d3b5317dd7660a3de59078cef1b5e134cd31115ef394e6302b8d0141a2fc000723380083062dad7fb4326ca011d1aca64d8d6a2814b133041247562059d2d2ba055a139710dad70aa395d7e2159dd7343944e6c354194d7c96656578f159a6fa3035e5c31a1ff3d36d125e4990f2938b9fde596baddf6b6305f02632866c4cdbb5d1e87665e937375d9b2dca299e3a1ef2d4533d93b5287598950d191c33f8300ae5d00ae3507c72f4d45fa01ec398944479a846835013bd928337995cbb362616bca6699adb6ba3cdb8f27adb40fcbc42e4e7c4c2891808b10328b4e8418b360b26895e1bca2391de628e55ee62758f79c4bcaf0d4675ae58a9d245da481ff90e1bc9b777923903c455c483153e50010f84e86915e9b089be3d866d2588c7071420c1054565b4c236fa157cd848495de53b6c25532b6c2bb615f695a93387cc9eef59247ef11385c8932635f0c141eb870e67d0b7c77026012264a8878b31c2288202452b9c42efd3e19c51befba542f3c8cc98964fbee55028978412c9909def0f5ba78b0fdbb534819eb12a956abef00118e60c0484a848a2072b28a30851b45e1fc6a56f2b0d2022c6119ac86287072c5aa1dc791fdefb16e60b09229814b1020931f0a255f0ed587ef1c30854785084256e80021d5add836b48b00a73a6055b5b442cdc2c1b5f59b0f4d54fc0a1559d0517e287d1e825959f2fb4a04d812b132c84c39f94a8a46cb695492d15aa190c000000f314002028140c0745a2c160248ef348df0314800e8ca24c6e4e9708b3208941c8186310200600430000202030224334050004dc278f184c74091e1749d97d275e3ec1740cb5a8cf5ed0efc0e5d6f9f8f8484542321e06f6403461d0c4c3e58235c499a304299f252f80fc095a5cf50222e38c2b02287f814c1ff0cbd0e7e62514ddbac7110ef0fe3ed4fe5fc4d0deb0d67ae30a229e56d68ba2e3b70811302941350ec3a1f0b01525b6e9f8ab3dfc47b756fca920c854f9b9a0bb954dbe668032340350f55af296a74ca2edd2d640128776de9f98bd4c29559a779ee830e2f92489c74f75c14e7b37daef808a1555080a15d2e27cae2002613bc4ba4352efd79962006aac914a15619f07f848782a3d8cb167f02f138a93c33b750f59de99888ac05d2a1e9ab3e737a2a999185419016888ae130569b075e3836b44c4328520b62dd22653aa7fd724df0557a53295af932c7bb458067d5bca7cfa565dbb80f081c029b66b06de2271bad7bf18408bcbb055b5e6aca5d89396285e97b13ce5b25731e6f6be6a574969cd6e54feda99633531095e0962514ed0274476d1537391ec027486f3d89b4812f29cc954b2a2133666baa7ad4a6dd84f62249b18efd9592cea73ea94607ecfc2b7e3d12421bfb6a0dddbe9df34518945fe9ef14da48cec1ee521f819d5acbea710cfa184df39895d4be011a2f151706970d5534bb44c9fcc13c3fc6ecb330165ad83ec3c509ee440019f179c33dcc30bf43898eba5f4c0245aad0d2bead9416792a9a59d3cf706d4960a9d3fdf6830f2fb2c1515bb087494bb6c0903b9682413fd1e3f5302b7d2915fcacd77f65ba70f3bf47d083a47517f6569f6146b1dc0e04baba6469473d7429b5fbcd470f0e39d9ebe26a9d1aed063e2e0ac64c1324e17ed51bc10f397026a5872e4f8942f192ce13b65d835a5cafbf0de5aa9d24934d29a7cce05c28887db894c7a0201df56a7d5ba0899610e58411ab184c2b6f4fe9366690e577b5a209633e10be3b6799c96124ce047839163758797c71f8d025fd7c2f061afa9846e7abb19c7ff0fa6e7b1a83deaad53ac020d83e8e0bf6a720a36944a33c89d3690fda607981ba76984355bfc354bd224cc2caa2fb1b30d02997f795319c6c8c9bab191f227208aa05012ef255f0b2d681d351f57151e53740407419e4a018758ff9a0b402377b2672d2442ed81825641582d7d0018232b1ceab2fd32afde16b8fe2f45a48e038fb1fb7b209dacf6cd45a7d5f5b389310adefb0161ecfb69fea86a4866c614c8f47038a831f31ca32747d07c852ef26d524a04daf42d740198ce749252c47abceca0ad893ef13177fd617aad7fb4d80580d62f29709593a24c720612dd939e4c646e2af3f62979f0dfefda226429716556a6cce3e2947cfaeb1e1be379ccfa8bd4c884d8d0f51b6414427d6c233b2d02d1cfe3043c55d9c7d6e59fb65caad9457811dee11fcd31ce462a376bd79b32ea883cab2faa1e2c8c879c71775147ff1e61907cc3ca507586f48158cae5ceeb4e1231900384025f984baf6b126842a01bd8808d1772a8b7f016f59cd150ba0bfe4015a381cfbbee1e81866eed4f8a273aa9c05fdbd4f4d34f8a02e5a1f90228c314f09d51ac43cb0e21dc098668948f1cf698e6012717bba49e40f5723223726fa325a2e633cde63bdf85d7c44ea1af524dd4207c9149188d210422791a2542055e4742eda8edf6440b52bf3c717b156a3d95897c469583a990bd2d261aa7107408303a01a20308f61726e8bb3deebd7f607799be402bf7aaec39a9b97aa64e9f492db881508917d6de45b32cce8178953563c3f224d9609c3630af2d5df19ab68d210372354d719e617fc0c9671c19670fe1d9213d5f7c063a51d9188442cf7a8e236f430a043bcc38e8085da1f140e7c22bdbd9bcf231b46f654c06daac3acb2ecff1a0f159e067c1805478523c0c92b113b9f4a1d2bd76f65893ac5f9b7c6d6a69a3504963e1950d5bb8bd19245f007ce5a514adbc6de433573d700d8a8b0118908453e1c70801243321f3caee77271ffb3bae1d0cbb180eee2e9760f815cbdd640879321c7eab1c90527807e3ef3118d4065c3a91b23acaf11a7c6d60e7eaaa367457fb02eeff7df132d3207d9b2aca0c9c6039bf21cea830436b8a9a3942e6a8e2714b6458ff0a185a9c8660e72b6166c39eedefffa34f4ea07b12b538aa859a10feda69ac8ce50a3c5e31a8fda1cbcc34d72312ae3752fa8340dade1ae6858e54fa21c17558b6c9a0fe67ebabac7024ca72b10420f50c7416729defc1e0de214a1793cc9641be3290b744d8a4c0cca241050913b73b1e454ff1dcef35db2f4010ffeaa3d9d2fdfc770b0d48ca95c6a83f2bdbd1d9932893ca814b02b5db6db13e10ff32aad3fe57dc4744b1c50c731dd6d702861d4295a65aa6f54fcd46d1ca09d884e7f63b6977ade141183be33e4e2db6246c935464966c94b1eb33ce18bac7addbc26cd322d5a8d0bee79d035df623515390c2d9dbb1269072180cb6664013b2a2b9a8e51593535100463be7908bf4aafd902aa028dee28b9cd0b6dbb0d66d8282256a54b7b38449d997d235f4a2592c8dcf3f6a22da9e676fc94c47f22fae3f51cd0ca415595717c6627c80e854a2b63d4ca04fe99bbd9a1c15f9247a334b074589a24a8a9af39c42bed5650ee1f66714a5dbd678e4d26771a42928ac2e11940928038c018f7eb26f7c415bf6128c315d4f1a0baa04b455308296ac946b18b1dac75c43c9099f9d9e944528b45dde70b1c290346e541fb602f8131c3ee912ef05e4ab7d437255cdd2e9ae11f836060528fef69146449de0f0562531c2e03a5005cca3890d88ebea4fd4283de21486fcfa41d421efd43d9d5277a251359e4e8f35ba5906e91a31864de0c79fc804bcb6660e016f1cc0a61a8b00e9203c60b4939e5469d4f2d260f6073e860dba88209eeb4ba277a4d82c2b31c3f5cb8825440c013a622abb0019528559f301eb53a7f76ab9a7295c3efbc840d134097f5f3c3c3b87fe18fe1aa56f519865ab92c9fd9aa8ab0ada71ba86358ea3dcaef4fbaccb5bde97c00f645fd22c3772a1b2f710bee272ed90b1d78e7a148ec32af224fe51d673996439418a94120e5ed16112c47c91e188cbd3af28d68c1250406f3c7802b970d6b235914b5832095f882258d102cf35e001a860eace0d66db57a52827bcb5b084cf9d6d3a82a2abfb4b1d208cad654f6261092d1558259a69deb6e7b3a783e909af567116f887a3e1c02784c01cf743b127e194b855e26e19595f1b58e4f14728e1328e0dcd8b8f6683371c0489b086b3851b4608e6dc35bc838416fdbd412a888aad01f8967ca8be88adf274ab2efaa29b373c136271bbfa20870a2a8f89ffc029e528d6526bf2ea1c2168da3a426cff7547881aa654be6731345cceffb9a0533bc6d92ed8efd3019d46cd64ac92b03cdef11484de021fa04dc353a09ed14e36b1864ec6511598466c0e349c778eb64a06252e36f01a401113e5da6234be09644a4e456fa78cbde5dc8b63c124309565aa875dd6b50acce5460af8a1a52e0ea5d335a8884819a8201540f1b28e7c1d1ad2c5d3b63b6e42ace408177f3a7a8eae06356e0185bdbc4dddd3445e7e4b9f5242b5be474f8e886970b495ce5cc80d3056cd6afffb2fe4f4635e1a24ac63a30793942d8395f1d3d69a76e8bff9027b77b7955b2e19bf8a14a94343a5952098e0f2c5470799556c6e5dc4d379a87dde6f0871fc9bf50328e436f31f4487b8a99cff6a4b51d400a6793e37d5434e076e39f48fbea9c900128eebf54ddc49e6ab3fd3fe325feb2d4669632fb92a72636eb3a0de3d051ff4a0857fff059463d7fcf9d6cc1afb22707fa713dc4e072515ed1f8c6391cb7574916bea1273c84531795c0628cbc9a6ec90a2824848998e84f7972eb408dfb3259135847a6ba4a68b271c30537e08aba05fc0ca61b5139fc1921ec1a5fb50696fe71f16decac5fc8ffe661fb21adb0e500a91dfc5c714566e0b5e84562f98ae81f068c45872d0c51a14b90aaac37f3372d55baf11969b8424aee08bec0557c6b0f8cac96e5678c74be8ede86ce99b41fc62d0d76939693a650394a6a50e1b66b84803cca2f974e8a43d5af07a50a8d08e6adae6061f3027d8003904c77932c1e86033d99eee5caaee8cc7dc342047d692b1da66062b2667eb50311c2968e0436c1440105784dfcc7e4cae0b3da3c78cd847ed35696be3712288fdf4c45b94356b935ab7b9c859d92c627028181fae577fdfcf8fc3d2fc8711d36be396f48dec082da30bc33fda280efa2ad762c3d2ac9acd0738b438c09de3a5b0dd954e4f0824fad9842b30cdf71d6fb5ec54b8ea2c2257b63e7fa96e09dd1fc5861f619ac870c65058cfaa3a1705b8feff7fe181c4ebf2fb1470c6f34e0fd77d0ed33821873842a85b8ff91739b517d33ed11a81a32788ac2ab76cec969c21355d422d19d785d9df9ce36c3c8bdc50c76846708558f5aee988b35cc8e1bf1667fd514e0a2e6f13fc778049a137b1727166137c07416e79b6c0be9c9825b56062fd1d5fdc8fb4bbdf61cc0a09e2fdbde189b721389f23ed3f3e52cc283d92d387750a2389f03b9ad5a7c3951352d64e94950098bf14237912882e6a24f633ae17fb7114a768f047b996ae460824fce9adb6ace037b1fab4d130e485669adac62593c809e8673917e693c63d2f30dc9757226c2105242b6a8d558aba8a2dc66ac93b6ff945b2b28740652fbb0232cbfb300eaa2a2dc7803b0eb1552de32030d650639601cabe890ac222131998037e4ec2bea00c531e336f225a6907549ead240933074a4ab1a1e026a8976c941aefdd7394525c47a990bb3965ac91fd1ce750c7761890d757a912e4aace4d27d23758597621679775e23724652119c6b910bf52f30015773d489e2e2ec4ef3afe50f576f07eb2c38544db5a73f72e08f205411d209094716877282714d84232a9ad8388fc3eddad3e34d783990b8c7fae7a2c6d2a55c4a5c7ef3a4cce1abd17b4efc1ca4a9bfc5bef9323efd95e7ff0bd42af93998c0212503b3b2d3c00187bdcfa6f056a6e74128808b0b098f6cbb372bd6517cf51ab52fa5c3920f302ccc226458b561620f7172b8f11e5a1062fd613c110f31a60107f2bef79d8a2b5fb99bcd5b8053298bcb1620519a9fe3c4a067a154024546c92e88bdbbdc5ea68b6ee0c74f493502fc6e178db81df302bac03441c86c6e8406f51552a0806b363a1beed5307aa19c07d11242acd71534c4c6c4558b75e3d7acd416ec5238b8edbe966daa17d86a851936382917156656b61ddc38ba4490e2b3f3747866cc102aa15503d3bad21fc052192043c362b18d5b6b128aeb51ca0778c3ea842de4b93967f36b40e980ccc3dbf6755e6127bb48c109fc4d584dfa701b328eacff63f7d25feee73895c3f0cfec60512f9e5712e2a9b6fa9e64e258c2ea4985cc860cf1cedb3ba0e0bcb2f0603bb7a461313643617bd1bfbe4fc10d7ac5311352e092abac633ef66f196d3fb0cc3b600434be5ad653080e38bec466cc19ec9db66c0d8b6be99818993e6a216bb4bc10e32829417d0e3dd5b498301564e9ea4ba5efc5238ab4aa91cb098f4739adb7d58f0407ce63ad83b9939a14339365edc964b375a2fa2e2ac6a2ffd891c74cdc1f568aad7eb9389febd4e72a8f411f7adf99296900af67ee75ba894fc86b00022182a7c9c2a1ab692b3e0dd1f204bdc1c30a29d7d2fb0d83e8aca912fa686300fcd0d33d70a48db0675622b2e513b9fa989c14db4a65009b2dafe7dbc3864384aafee22bdbce1499ccf2d11c1568db0d01925fe609612a4ec829b877215fa09a4de0e510eb448ee4734f4479aefb5ba12c3e8f7e7410bd8244d30fc081407c74ff98e550b04f9716ffde6e22010cb07261617535a4896faeda2058ab9b6b83502204cf2306217e85ed2c9155519bcb31570ee30594bd7603eecbc6ba0c91ebba206f497739d04f1e55f21b7db9ff427bb7b2531139afa3e5ac979859e4b408f06803f8338d607c73a5eec4d93496ecb450468960f61910fd3735a633e192651d166a65af2d70734b4b69666f3d7f125eb187518c3872ac7d1076781796aacf5132159a8232b59946fe8ded11ee338c747b0e082ce264e51f00448fa46bf53e40da4fd4e2d9d65e51d2e90f2e68a42db6aa59da9c8bcad2ef65e157cce4a014df29c4860fe2752c7a035fc4466776154d2a04cb5e7da3a50b6ceee0a550a2e280008e92929848e475a6df074027c02c6100d100c00dfdeba8d3520387e1da2c0722178fbaa9a5856aee6a7ff2968b37931560d2d5bc8c33dd14647fbbdeef56429c1edc72a6d71fd19a29a20c226fe3aadbbf9c4dcfdcbc935bbd6ba4f625147226cabb262bc4c6724960ea3f5863b0ecd4aaa4cd2ae18f84278876c47da6ca34815e7246663db62947ae25944a2fc468cc4e5d1961d31d6b4aef5849e9ef6095b9e79d5127fa9f631ca3cee5f2cbf38515a57b148fda77cfec6b97499affb9c27973ba02c73deb9c485b6195ce47b7404fcebd9722d72022bb34c0615c249c4a28a9900dce80f82b73fde2e9a9ca0c66f99d84776743b4f0331e16273350a62f1aed665a7be2ecadaf678ad35270d69b399d0bb835e6004e62cccb84d848a44aa8bba994b62650a1f3f1a27ee2f12af9312eb5fd27e46cc82010f27d55f85786559809cf7d664ae80f81418c07b3335774dc51c8b347ed1e25cc3278b8efbf6c92e35bda18f338747ee2235b2caa8b23c4c60cdd760223b35323553d071b20d818237776198bc59af0975f08db7e0772a8fcd04c5c28797e607bb77f83f3a454ec0ef925e970ed86cbe992298e7d1c8f39d5964f7c977dc1abb9cec28d48860fe13645acdb1cd03aada6b9801b693e167439b0b5e19708232c2c78bb1c7b82062e5d65e1fa9aa28145fc79a98d48ee782d307315b2b93b3dc3d7ce32c3ece2e220e25293217441d8d229a647cee79198e5467fc00ccdd66379bf21949f4568ba81f6b5d307980d610adf930515da92541a5f660b3aeefe1c37d4d9587616aa89914b53b74a555ff667e3c0c15629f4da3ffcde461164feb28188287e312ea4884d1b8b1e2aca204aa95ca0e8147b644624b5b576bd9fff90f0b65724da452b7e417cd2065794368faac1b5d9bd0736b286a018051397dbf4943a59439e10f79550ebaebd1a37cb7d21c844727d0889c661c4d778ea722ccba0615ae0bef27390aebeeac037d17721a67a2a2428ba3a9aa86cd218a1f68909f373e7a5ef964543597f0784408f79c97844104aff1485651a5f4bec815d0c29078ac03951ec4a12cb9f46da1bd0a9334099c595bafdf34818a4ba85411d50fdc5068c9c3f1f13084c871e1e0dd46b00e8532079493c22f4266fa18b12dd397ff6c2a5524f8ea6b2d67906262cca53c895a35165480cf01274945aa553b6fa0868fe6b551c443ef3a016634e3352df3093fb7139b7976ea9057aad2f2599923372cd91b593b8d67725778824386927ae61f60268639978009b99bcda0fa3b3dbd64577f8d9f0cd94a84f6ee1bfc1ff277786999569308908c7a5791e45097d392d1495323612b645879a3484cdecf25e732b949e0b35b6f52b672c4c8f24a9084c3634f6423eca669cb653ef34512ae5f0af97d1423dab5c2c4324e1506b8bb60b4a153738e88b752edd59c8ec3da15c54d60862cee186dc3455db6e84af04098c1fb458625482a5373664013da52266905193ae37b69ee6fb50df88c0b7e4cab4b7fcfdc62956070b3211a051f2008e87eaf1cd462aac90229075ef92d57898bdc49263aa019ee59d25f8e16ceccd55d02df3df3f10b47322593ee37418b796089f36d4e165e469cb7e25903326a8eac41e2edbccbf7dfa1c5e427981f97354c5dab44ad5e77fca0213ae7edef5516737a4e5ab4ec665adad0bc24506d8e5e29988161e2c76a639f541b48fe7d8074c7d27dd432671fab838d5241c77ff2ca78acce1c1fc8924a1608fc5be70cd369696156de723e2682d67b507e38a35db39802f4c2ed8b1c1535ccf3d935f66057a4756116d3db0cb7a318c182c4080c51e863eedc06a5f52d387aee2a9f556dac2bd76cccd23b5ced69e6690b0c2981c9294204cee3a4c095c48119045999cd322c3bd69381b9a7f1952d6bebba46b03ac61eab04bfa6b11f3e4d961d39405f15d8788e2e83692c94308a77748b4f240caabce6eea25754522bfdd97ba01d213ffa96097b98e05b0d3b121364083ebeb0a221471cc0cff8dbbf41851dee3c7e0b398586c4aa6da4af018e5a7f4c7ce4f42b30185915bd735bb589414511d0e24da08273f9c76b1446442c4661366cd4722190221e9d34f2c90903227a0c33e7458f496b084297fbdff6d45b489a12e5f5419b2f1cd787e89c8504c1de36e2298357bbad6e1244dbde08ecdd517f878cbe14e2f0929f0290f5004642f45289a7f47363cda98a346da0590b0aad62572c2f0f711c624d2b3162bd1419d67c1fef2435ca4289206f119538a427e40c1b900d0858b0863d07818d458cda63d52a7510a6936a6384a3f04836b0b4c337639a399dd278fdb8bdde5b6c7380447771971dac620b6267611249027b09bdfe5834a3a1a0c08ac8780df6368b46292aae8a920840dc43b94b08a5f25c73272321eb09eddcda5c02833b561df0a70f2d68cc7bced6e757358d13a84ab35efeb21f54a79dc4a55df0ab7e73f23c80bd9674a1abd74fd51fb5753f4b55ee2dac84d4a72a59fec43271e2cbbf75bcc3896c4485f11181f19cf86738b3dc861f20817871056a686618f61a30d27fee82d34ab099faed159ac0dbfbcbbb983121aa6c398b5cce4ad8d22c9b87e1f3f9217c43fa76251994031162c5ceadff9c7d6cbf8653193f0f8ceea29a31acb3ff743ed85088e0b770a00918728291dc3e4d381dd4830b9a141c748e044a559eccc06a6e0b7b293c963371bd36b0705a5b1c7aac488b8f0abc6127b6836da489d3a57080afcc82ccd509727c0501f1e35225061c53177054eaf24167b347f2fe9c41fe98c521736c5df915800ff7caf998859e20efcf029c1cdc2c378712157c2129e3df52404105cecb6cab4a20ec40facfaf90548b8465817655344ec76454c2fe374fbee2819e65e4052fcb16759091fb2df5127696e539db8c03a1fa134c294e439eebdf8b100c4dd081d215ff236ef46f9ac1dd4e43457d8bb8ab14d2c33d51b3f5fb9b14b56331dc4892ab918c04c1da0b9d8e232f52a4d9d842389a58cf918ff187c59c532aec5983552b7f63013b5e0f4452901a0cc17f7b9f78fe16a2ed5624d59cdc81a7d8c913052f1a5aaef4c3bab5d6ab612aead8c3b5a5e9e7d67e6359cf66bf43464bf211c96796ef2919c49d94cf18c18148310544f06c8045c8d4c7febea1a494f90b4957d8af19ee5d7fd0f11562d7ec8f85f101373441e9f94c3fcbfacf538c1312c73856ecd4815a05a2a1114fe8f03edc8e25d3a5000c36b03832b5e56c12247dbb744bef9f715081a1d1ec8152781977b58808dc68dfa0393fe8f8fc2b852f842313cba64589dfa65e1d01f5d36ccbc549ca25ab27ce114329fafb3647b539e09c106fbf421f72baa4aa6996ee32dc5d7696499d621586f3b910ab92b79bbe44ddd35861d6bf481c1128e4cbdf87f577b0eefd2cbc8bc5efb1eafd2cbd8fe5efb0eefd2cbc8fd5efb0ecfdacbd8fd5efb10ede2fdc53ab94db54608595d1f811c91d5512d7501bc5010729303e4a3d5483b16153f34da02a4e2612689e48b3caf0199b9fba6108a77cb318abfcb36f3f86b0cfb7c5c3f73dc7094725ed2288b91dd6b5b51198d8ecfdd8fcc89ec7575165cebe3c62b6e1973433ee894daee4355615a8cde6d70c85c5ea31b1202dd8cb988ee362c6c541f82f6c68c7e7d555355ce6762b328e56a90978c209cc290f77cbcade10e2a7f9fd6f61099582ffa6cb0d22ba01dbe6764c3a76afaedc6027a55ed2a45b9892f8ccb5d7a80c0aa1704530be32de26b85c3a3435fff9cfb6055d590eb5de7977e4f8fdd39fb599e04b32d035a84aadd70cf93569b93924c2e39e9038033bfb4556b911d21d9542f18c242dbc5038f6d24a312ff681b5e98b9c48bac5e7f73d6e56311a8981ec57ee86beb094ee68a255e7adb4ae2b9ff77676287f3f510434b01a3954d4e9f3354809dfb308a8241cac8f7459215c68933652b0d89ed822ecd15dea1d1f2ff246f7fe5a17520f024fbef336f675e5f5ca7137fb65febbd57b77bc3bd723f49d46e051676cf745f07c6e6b78a756cd357ef39d6d1ad1ef44c3ca48485e88bb9f15d0f52a8a62b2ac369781a7e3f441726ab906f5268da330de27d22747462b57b5782a5d7bf367743cbccf715694c841d6c0a2e2ff39a82093d12895e3fc1066ea19dff1ac27e0f2249bab8fedaa50c950f37b0a1242c8b9e06ca57d18592497f0460e6fa2272fa010238836acf41c80b9b46b920fbc239616a8b39ece484f96a925bba982962193e2e26521beff03c439a807335fb88318c070c40c1be60c08d9908f210f971e5affa30dc3b6c20781355242d9bedeef3dd7873895d39245c06de473d176c4b88d6c53a93ac59213f1b8a6258e5fbe2bc76530845992ca8883b80356505d0d26079e86431c596c9e29b2f0b212370862dd70d2462113f1196b30687adf7be58d4602d23e23272e17da1d1a2a3d422dd5d59da1d97d561e2062ce09ab51549fae15bbb8d33f42fb91c27877a586a9a4c3f183110d665f5c598121779fb4cf10d6ecc4eb82c677e8e6dcf950e9cdda07388137ba4641157d4741eb94b2fe4992b8d3b083931faf93469a2e87b3b08680ce38c21ba5975c84b21ac0fd14d0b0f79d23d3901c0b5ea6a9355de7cf1474162684f55d42cf39f4cce81c80d26f764ea3280bbf63bad0bda334e7cbbdb672920d932c638ee358cdb4f1082fc340eb5e1f6146fd773bb8ccdad3b35008cacdbbd8c6291b756420fb5c01f0479e7888c26aefa30e515c6c3193d4bd0803b6d08cda456cde71f4613e234343bcb44af896c6132d8cbce4915928880618503849475fcdb4c3cb75555896df8124b0e4ae3b24036ef257407923347c94e2dbeeb262e903e67b8d1686f8f514b3fe1ff983a47116e1452fe87b877bc496aab0e79414762e487987ad12fa1a398b65d2bb2c615409c1f05dd5783d79012fe1203e62845f06b2aea7ad50889f75bc353ad1a0fa09128da588499e989befa3781a975ed8d4c1d06fbc37cf97bc1cfbc09d11532121d175ad06ebab756634b38b833477ae0c93757868a417c0abf0d0ce5760ef9aa5eb7dce0496adc9a10e6377cdfc1240fc8f874ddbe6b3ef73ee79dbb3d08fd1a08e2015f94bca214572dffce44204531fdbf90a3ba103a4c805b38cb2e5ef8142e06f59cc1d6de81a538606db39b6b6734d5b11b6cd6f81f834cc77c5e28b8f2dde14a0dabef1dad26924ab9ca2790c230d518afeddf583fce77dd255130683f5c76d4acfb008939801f06759b69252db249b19fb61410090f221e0df5a3b3ce23e4a7542a321950b4831028e85c1eaf49cca4c221264a0eb15472aacd537c9f4f89889f1c7c4d6f2e7cb6ca3b0a85ae39822c294d7adb71c7abae3637a20b2ef8bec5734fde74b2fe8176c754af3429ff0823e62c3d3345ff48817683b363d5df348bf7c403365eb539abef485ce81b066e8a76ade29c409cc4103f4a1ff51435dc0dab44c7b7aa75ae51df059cb7a53f0ab2d5f805bb6543705d7dad20df8714b39164f766796b79382645f6fdfa4b691cf947ee9e8926fd443c9f719f199c93fe175e2cc47509fe7f6f779110dd76089052ae3236af32c16507f6562279275ebf676b088aa352991f8b14fdd8ab23b5d6723fefca63c8da9ec5cdfbbcbebdf75830a73b19436e236416ecdfebfd0927e8447430e124810a0fee91a07963c279180422c8ccebcffee8961bda925a0638e1beb9fbe902db723413113fafa739f6ae30ccaa7a8f7ddd0ed91327b33dd2e5329c77bc02c9c98249a9a4925b857fba56836128478979f33e127a20f56b57f761488db8aacf8eb54625de275fda3acbbc9518a1826e85a9971a5eaf5f5f203fa5ebd6e51d9ed1a15fc6e51c5e916559c6e51c5e916559c6e51c5e98e5afe80dfa3a323aa7abba29abb33aa3abaa39aa723aa793aa29aa723aa793aa29aa723aa793a41847eedeb1a792c888f78ddb9c1310693b9c041a77632560fd19dc3d0a666b3df924033b8ce08cf24f775461ed19ad04e5500bf19d5a98059ecd6b3065f1923a34b2af0a4a86600763b1eb9a5d21ef210c14c2399a92f4b64205019a064bdcfd555a7fdf78a141bc26d8e86d86f156431b37aace89c1e2af8dd88d481014eee6b4368efe66b86996d8546a160db789173a6e6171a8cd99753db07249a9d4077d6637fbf423bc37262ddb040610369ac18404ca3cad0b0eaa7944b0081970702e13dd5e6cc474e1f4d7839a897ded1c12ea0d06248d0e8e0797294533934d9835087ab3ffdf72e4b90423a1fbac44b690ffc31cdba97712600bbc0f992352954783a7b5513cf6d6ed87b31fea553ade14f32b0ce7531f9684b1582d012bb82a12187809875c305bf4b651660e788c5942e9ad26958ca60aa3d96888153c5afaf35538fb0b17274f57492aac7c7d6ef19fbfcf758dcb550860340f7cf614a722c095ec1d0751d9f83fb4a405e4bab6e8a04199efdd23b5b5e3b36395028d72842c6780a8437c494a082d60bb2cb07efbc2090283a6ac456cfde6642209e850eba963f25766c4a8f87405cda5aec34befcb64dd94519e3d15c7908f7e9add3a2a382ebc852c3997048418b88247e169fca3ea0e427332b41c89560f882968fee3e245ddb0a52923171e819047edc81c8821e39f922b05d826d3e201e082ccf732504978dbd0b63a4bb128a93c7d773d25d29e2cd73ce23c5a255cccc64801da25df97847b20a46d1c902d36457f954969d42a34df753f5d14f8e2d452c40acfcb42d7db7653ab74a9de291967ac18ae862af3d9338b78578b77707c2fe40ccadec85ac31418a46f6722e5b5bb008ba641e45101572651025be8bb484225492cb3e5d3346a8a52cfbffc71661219c54b7865d1b95b8b531d43369307ac4edadc390e9a459c320eed4caad8f03da8d10cb25a4f623b4e0c9d138b346f7ca4dd56cf1888678d93955e4b87e8ec72fca103a16306e390f9598f365e1e0bce2d47c60222d55a8a452115f174a52d8b144424f931e3979f70481e8859928bcf23426abda9689371110069b9577c7ea80c4643967712b01530ff184289d85c419a28d5248dd925235192549e1828e9c7a2fc2fa4bf730d99a88b490ac68904c026950097fb825be2641a59ca2efd619bf15a4152bf78257741b218635c1fe1d912d4c17d4538554458ced2898dc3c764c998689455f014da5a02f8b53e4d14b27e69c310f3fc45b4a6fbf5d096c38395f93f5324a005becd7f2ac12174cf8ba875e0a01951dc638e5ad3b2f7979b938303411b029ca26d3648f1272f7292ad7960b55e5cc5daa6b9577a49c6f7372a8cf1fbd287c86bdde82dd2c520c16f0ee833920932e8c3a29ed8195dde5e65a00b6586a193696b13e75c98682335110aede61d8f8fa3a5e81c3e3c79278401a1463137dcbdfe045b01fbb7d790e5c1df3e8ed70ae8e34f6a2391814c4088971708f15b89a810b6affd1d3a2945f28e15b263f5069bf6bbc6e8ca6d6ded92b92fc3b69123f47abd137c0abf075bf08b13ddf80de190873475530bdb9df084b1ed205bcd8d4c9cab584c060c0833952b22e226cccf07c8375e24424a9339f7a648d92a0605c79989280a369056c36a97d6e645a2abdc2d028b274c24042be20650c5e7195730435b5a12fb6a86aed3712e7d5fd49b1291264fd1b2877bff9e787ce8b0c0332ff0b4b3ab9ae817491d6456f4e86a6a2ea3b68312c5de4602cca545674df1a873d964ca3561fdbc58b6c012836300c56515595ae004084ca62da90dbc02c4d3f73d7107a48152d86e3f5c4e9d7f8363d1cc5f06fa230e4abf805d680629f5b98cc5b7cd69089e5d2d4aaef0e0f92ca15bc4c6089d41985428c4ffda924d4b31eeb66dbec0fcb64fe5cb26f3ab2cbd11aaab6498e73138025c031421a983b68c1e95d7112775d6503a9221793f79c7532e9b75f17728dcf0b6613e2e470566370c2789dad427dafc41a0b33da9c2f7ad8a0f2c4f0c80a9ee1a5c365e42bd5c35ee175c9c7d3122b30962a32f7015c04d8102b657aac7bcde628cfc7e229ea4af8d03e7d6db66725fde0fe038b03bc15a3b18dbae8f8a8f4398a8f181f1bb985f1cbfee2d81d533bfc415420da9c2e58e43e8fcb77cb6021afd9d16f0f1a00993df8129e44f444eb14922e6a0bd4f932d4dd5d926d01cd164b10d282c350bd6cdb0fe2db489b05732053a09a35c755d5e32b7482e1c3ece9e99c362ce62af8af7023234801bd3688b1ee2aac27cc01a1b8dd09832e900a4509d89e000590025b012e17020d80c1de700763a751c4694c93c34c499815e94c25bfca77156ccd480404dce582b701ab8aa310d28298e21e65b1b68093c0fd60542ebaacf67f3aa540117a47b03f29e8758f63700d4167cadafe73c56ce27c831592503c14ce79e80f6f9669b8f4f972316c8b5129a7438c901e759abba3daa6353aa3e8fe806f7bd48c8eab36ee57e79b00fd6ab929145445e111d70483bbadd823f4facabf76f1a4315a177c1acb8a26ce808d700156828111d675e92e65641b2b17b53ca1a046242b5b086cb807ac80e38dbbb07930ba0808843d8ed3458dd54448661ddbffb333db92594e7839a30d3c934dbf15a108208757caf6ab851cb16aadafce38750a295b61a42b3a6a274f2a4db4926b7022461b2a728cca5ec4ba8576f1c1318f774f519173c31e21072bb4f717160ca4064750ecaf1d2b9573cad0538d89da72353f4ee5837158c908cc1e46b4b76d886469fa28fa53830c19821ec377f6e3e5f9923790f63a8f65d5f5fa038e2659fea892a8eb3413cdc0bc4dd2c6f563cca279c238740579913a6e293a6994b85ac8c2a3bf2feaf33806c6f8bc0d88546105d05d01935604ed94efe6bfd3512dd9dd14267d2bc4541ce378716c7d948d272be41d3728640892cbb5864d3ad26ff0702e7112e4251f21a21192dac28cfc9844762c26fa1756fa5becb86c99dc577fbba3fb78142c1da947a04175349e5d042c081535bf8a1c151bdfb6559382b9ca41f72b4230d584fa4b4a0aa040f2424baecd1273c3c098d6160742842ba01b7fe1caa0343b4d55ef4004a741f560ca043d5897424cb3fd41c5ecd86002e0f89551cfba987f716126beaaa74910a5996655c7c7146ed603d6961d7020d6af3911d3f61fa55f2386f3af07e0ae8db87b44dd97e26cb65e69d608a08244528d6decb2893e50611a51a1cc046e1ec92d0b7a755ff719822ad1828fa3d0c3178f6a7a63412bf51db81d68251acf728e368938d6e26ec81e0a615bb432b60c4d75d42ea7858791c338bae49225aa937c4c274cbd74c23088722f8652f16981d7397b10aab3704de259d4e72125e12b0cf8e36e13fd97c65265bc1a49c5126685db7747211adcccc13498e2d0634ec105a097067ab5e7a3e4196897b4571e4298a5ff0ef9e1ee855e3b8b7a16fac7a848a33704fd27a549744c3655e48e04541067d578a556cf30e312799499dbdaac7ac5c01500f46e0c1d056ef81220e32ba121e01778f48cad2eb0bb04f92aeb1bf764e62d5102b0576da0d18fabd750b901f4ea870eebee5c3dd5116ac4e61ad8ab0d136a1fae15dda7b1c83a507e00bcc1871e9eb37225d96918560a83eba5800860631050ba4f36d7814f45f32f55250168500c034d9a0b874c5825b26d4bd30ef434f463403c250275e28b45efb118b7efdec21116e2fdb1695b0fc1af46532b1261f55dc8e59af564c5fba3a97cc8f3c34c6b578bb8bc0a400f171a7c9cde3a3017f403c01b1b7480d7ff756ef7963731c90d1b74198e302aa105974c5deeaba0847f90fa4ac6e2102d0bc55cc5add527ed00dc09583fc8e556ca8e35ed700598ca1f65b9ad198e9b0d1d4e4d3a6a6692d840a6171cd2037b8f446fe9cea08417ba8d94bad65fa27c52ced3c82cfda948eac54b11c3d0496241b37f61c93e962c71d515da4f366cc39062d50a522c9c6531847176ea51b3b282470fa9d41758e1d13a85b85d4ab571db020f4205bf666b2fe41db068e5cbb6558ae0253e7c5285e342365700e801273eac7e23ca4637cbfbca8d746e6a4a1b2d561bd78b06911921a635541f016e60a1cf7f38aa1faa90c96f608216b6c7ada994b15260fb635da766496a3579cc5ec9f83823868bae453536c8cc62e76c6f89aa9db9c9ea56be662360775278467850bf26468a35a6c6990821c776e0686bb213cad2305053e20c465e6738e4a4f5c0b1719b01c05ece622846b76836783077cf125b43b8a9abe92e3b94b8d087f6b4cd37eb0fc560f50b39f2b1bab26593231a28d758e2b31294780104e9b887a5a96c2609c85387c5c03200b96ca5bba2fa5250d66633335a36b6307bae9bd1d2b30fd3d407dd7f28022d77e867dc9690435a9b86070138cab6d858138043825fe473b542c18373ad470ffb6f0ea23a88284d4f00830b1ce2ab6220e61bf1ef08ee624423458e36192222466b20eaea293e87bd458f68f402e252c18dd9435d34d23f54447ea574136cdb28803620fe0ab96245d456737d0b26ad0cd5c4c4441ed5c91a6af607dc018eda8f04c0a6ce61f619d9adc45ca3cd01864519f47458095eee589de327959c628ec6eff1605338a1838c8cdb45422a6de5737bf1ab2a1925e2813608e9895b55c4439f4e3c1c990f35910ef98a95ea49e08d7b62f9e51526db6ae5b91f4625ffd3c2a4a7b695478234cb0c6de59feb9a2f14fcef6391a1f913b808afb06ca7ffef6620d14a3042638a9f0374cd00ad73f09710216c0447a52f3f81ec2542317ffc37bb00ecbd9d95c5d8396dc812758be9682a9846b89ec989de933d21a4a1d486e41caab6c919d426c4586cca0dd4d13207167fb005985601b6b6d514a1df3211eca19ced4bf515e424a671837e947fa371746b7a9dad5b66d26eb2af7b86dee4023a9a1f07cf948e64263979a2d6cfd0408b38efec7c522558ed476f37fdeebc3b8ba2ae30e7cedc670855185ef7a35c75f20ce294f0a3ea192d85d47bf0315c99cdb2cd683932e23f435a5dc8b6cb23e181594528e33724ddb6339945256686bd8dd4966880b537fcdd4f8d85eec3f6adc7c6c895a95f71fa76156010adea801b505c4027b5987ebc4eeb298636901c62d77222e156b82288f02414ce3f31778978c2e15f822af6e116d19645b1dcb07e28f2bdbcb29d7714f880c2df63b63b7a358dae1a1c6866994cc88bd593905249f0c432093f588f946f14b0215365f8f0612b25bbcec7ae36097f291d237ad0bc7eaa05bdcfe0b7cb3e65f20445b83316f9ce3aaf96e7ae13e40b0e06e28fa5938bf08e50e308b850f7f1e00cc3bfb377c83fd5457ee1b463a1a1262f16f411e38d05cd999366fd46b3b0df9ca4c2a904d3290418cca6ea7bb852c7185b5dab9ef2c49746d9dc805eff55f075d2c06cd8b3b0598e202c548e71dd1062825c169dc342366b9eea26846f3a4d22429a64f0fdd6d1102102325d18cc3584b18175625ce23e2716b50c055b5f81c9f89d658df01ff92d10b34a2ee0b47df0fff20ac92a0da97ea4090ce038121bdaeb7c88e95f6cda508df9191b0c767dba17f44e656f1576f55d334084b70674c190431fbc102c4db7be41c2370644b6827db5fe4516214f1548fc675bf97aba27f81c2904aa8abc8e209fd337241f5a34e26fc615e73eca150f4af201b4e84d936635d1179ce818e204d892d2df7af3f689ca5e09815f930c7d3526c08fe25beec40f46dfd192b6c865a5aa33289f87ff9bf224bdc92ca7d07ca73376d58dbbf16222627d4f27f67650f45e556ae9502427fc29f85349f6c5e91371e6964ae28863216036dd71970522541092e8f802b0fc76b5f4bd08816887263c243a5d4cb20b82ed1078531efebca379d2e0facfa6a9fe63f30264539282e8603b49ed9049b3aef9c8f543c73b44d83626e626e57b51260dd9904faaca3c9aa78de8240f76980515c953ab196e3ea606268d866d3dd5ace8117e67fc39dce668cb4eb240dc82ad11f607da6da7758a92df43537d9544a4866bfb41babaf6ec91ff840d234297177889ede9f10ab04576182cd55b051302bdf92b0e9e115c4a2cbaaf434376aaf24fe928e75b192b6f7698b53bd5953413fd58996222984e714d592b49340850233d04952f40a0e061ae6654a0bc2cce528030d8bb69a02133189a91e427bdf9a0f96945f5b19b3c1fef9e292952c9ccfe384204022e0b3439a37687016bc4bc1b2a2c26d8958253e19d1d7af20c15a22798e0c0a3177c6a4eb266ce3623106498049571dcc457333592bebc2fe564216493161181bf2bbf678b11329f789a4b33ed7602e3502474aca56d8b252c04172a3ff45b1ce4e1235db50439574cc691af55af6b5ff19aab3714987d46b8f0f4da9064fc584a5b4a974e942da69c29a1ec578cdc342383dbc82ba8d5bb5e59be74afac5da6342cf94548344aca5336271a056a060f3c778f2ed8783ccbfee05055105cbd13e7dec7c2b0b17c3fa31a6dce5c9e921f9039b17a5e94206fc4531e8571133dec8a97c31c8f845668e827d6f489c548c5dbc044e77c996b1933af90d1ec9dab47b7599951f786a8aa33113165d6bfc4d50e8a56187fed527d9b695b9393bda4d339bd5fcfdd5503285be1df162f0fa531dde902f61b93d4040ffbd22f7b1204d449d3c014b5b543c23ab6f12237a40d38f4104fc3fcaada9babc6ac3e47561060deb4c59f2e24f0dc3b7cae81bde2938dfcfb3e43d716d0f1ac8b0d11ccbfbdbc5282d7127f3ad7e60f7d514800d520f8ccea6e3bdf143643e3b90ca3fe02e63f2f8a4ca619b82b81b218fcdcc0bc97e0667152a812e874d746469273d939c3e0fc77c6bdb38a9710e1320cdef438c0ec892244120210e74cedce49f4849c0bfecca7bdae44fbb576ec8db16631e9c880a42feecc1613767c1fe818520cedd3126708640adfe5e1293ba81d533afad10ec6879f911c087df90503c8a82effaabc6c60cd43d8253a9259146ea7a822dbc4b0e842d175b22ecd67a0249f36ebc4bde79a0f4c99aef6b85a6b9b88ca055314cc519e1b0fa2a3038cf91daee2e9725c667dad6c113d0eb9872df1ca76b6ec7bcc733bc5cc8d0f01046d1ccffa8ffc2a1357dc502523698a271fc06b8c48ba9aad8b12b89b61cd704924538a71687589b5a6c007a0d5cf6e3906503095b85ae02a07975bc617a17d401fbd4f58e042fcc64e0d0b9a1a8b392840ea54d10b0635795fee949a72e0fd348f937679dea50ea7334a31506b56f3a1c83af228f1c22c2289d9424903c63a25492de2af112e5de5cf60ea336907c52f344b3b00a18284905dd9ad2e0f3c48b660b5e193163190ee6105f522e1e4e5848c898b0f8c7922388c3ea1474510d17260020c3c4e7f7b0e80230eacf10481d9926c5b239d0dd2abd0a0629f98cc2a4c95d8e9152e7766f570ff128bbc1c75c7274c62be803ba66da3a6cedce4d4f9ccac88663ed0a4d38733931747e575e4457a31dcf8b17350c6e877f3162abd3e8c6c0665ecfcbee163867f31b0f43c280140d3361164e6e213fe81b51399f7658af3d6af0f6b4224aafa6cc1afc66368a11148e495a2d5a9687437a5b98ba523421716032c26f066893ca2b93aee8dc89cc9a6508d6489f864db7d81e4d06af17b88f11a9e7ae677056c019034f0d34f404bfb62211299afb601dd19d345c1052a5b3819cc71d122f7627998212508adde96cf4f1eeff307507301a1aa99355196c7af75e4334f59c69e871956273377c16161e9ac40a7e62f8be9c799e009e5f613d854b3cb26a172692f6c0362a8103fb1130df2b41fbc9b23de0ac8a6cf6149d6fd7587152e38128221c6d880a14393a6048c1016b48f4430a8bcdd46b6ac22007b06d9d60f1af030ca8493fad5a6f0304722fd0e02b5f98b0cdb14194d69ad91164b44bda5536094db9f7711acd973a69abef099fe99339ef69448771768b6317841d0db26f5f6c73d56cb293329e1b9c4bc3b94ad2ba5f735a4c3ad4ccc69ed94a0e74ff2a21d2269664d97dbaa6653023b69f654629c48e831a74368ca3c39038f7471a69e6aefca0fad2315193d59300939dd40e0171f701f284d97e657f9256e86aa668cc1c2b8b19e5dfa04ddf46b89679ce168e3351fa0d3392a82f93433b10682e33e63e4bfe6c132a4fff89ecee4e219b3c23c06c95c7c88e6307bcf4a65753b9321073c621fe699421295c1cabee6ef9dec9699e3a3be1108622c08520d5fc8747aa7b96835711f1863dc678dfb6a644f2709ca103882af1f13551f97dd03d9569e17ca8156a624d39cbed6bc7eb5f714605e063ab1964b65a88a0fb04368c181c5801d9bef62f098bf3794bd8959e3687529c743e4fc592469b04b2a4a3e9525bd19f9154bb9d2b91581d1d467350e7989058cd72a9a5be35f7faf6fe9885291ada275322237061966c02fc92b9bdf57c08468b01493b328d65d2baf4dae9183060b50ae38164c9278dc4637cc78d713f95e04ee002935445688d18815116de3127e1188f219f6a8c58e5f34ad415cf34f6cf2a0c1e07bf5b03b796a44f5b9eddd28e40a972c5ecc2d3d4bf76efe9c159406bab8530a0cb9cfc0df12a6393e6b5f075129a595dcaceb75dbbacfc989f2dc483f4da6b9595be8786d018501820947c210ef8833b963849ef71b197a5b19a567c8d3a481bb4d92c1787285e8c5512136aa4f81b6b78cabac78cb74ec684601a6d12661125e90afff9560ab73373bfc30a8a68ed4e16771eb9af0ad883f302664bdec95a558ec38eda7fee1fa7c13311d036eeaa2e79970f81b0d5ea590c4f054dc6bc16207ea6a09e9b0449ce335d7231613ba77dee1518af9d133288bf47cf490d5c2090cbd6281474d7f570066ea2e67320429372a4a689d686d7b666898ce2530db93b370d1c72c42cec96707323f3ce28252598e189edf35829ba16d9a314cb8bf1004c130c32cfa2531b024736d53906626b55c2971976d434e3ef27908a7500396136d7ebff37742102931e82aaa0e5745ff0ac0ce93ff9bde07424470cd5e67bc391ae8204863f099a5220419c2b5a581b98a22016751e88a6147ccf620ae1223874d9f184a923e5a8545b3dc7b4f64a636b405a47d2a145c408e7126494eb3fa4405b25da05b8b0e3d492975a7eb58303c1e50ae1de6d8d4491636c0b4cad72db175fb0dc394d309181f11b5593245f0ff2dfc1dd80234a401ca2111da6e080774346dc5528153f97bf6254d2eafed30f4c876584c88d932fe26b280422803b564451e1393c020bc3acd09e2a5a082d02e5f44ecd05fabf37da53817bb8ce0ea8502203334f6dcc01b986a4a27469fbc6f10dc62513a62350699dbb7d37d4374e6a8999574ded202a9809560813bb443189e4070be414f04b19be83e6e92b4d42cb2062cc223ccaf230869304085eec560eab785c2da6b21a33546967263c0ee0f6400c4af3019e4d3d84da92366bd4918d8be39115100016d00f00d6dd9dff47dcbc8dd23d04b99b87dbd2933136b472888e78698af49d4cd9686687145e4fc699dfa45abbb1f4b1633e42698e7a685fb637f0eb201e61b5ded3d21bc8806a5952830b627e896c537521eac6a1bcd4bea2cecdf91c8469c8581aa0377b663e3315767f2d850c26dca4cf1d3802ee26fdb7a773af6a077d37ea10294482db9171e2ec5c9ebc2c8f290ce4b9ffa8e9ce3cc89b654179119119c23acc6417d68e107fa27b76fc03e2b407c09884f34274586fa4d0dc711ceca0b4083ccd74923c797de531c74573d4e1e34177bfacd593529a3f7e0f1206c88fdf7dca978b4efacf6e5eadc283dedff7d853d1631cab2cbea76d2f146ba43f5dc3f1eba4bf32130beb7c23d09f8728c1aef336d49482f6295501d4e264817a0490d558985672515ef6c7cc9a19632226152a2a9683ba66fef6d334913577184d4fbd9d64f01ee00c31ee8953c1d2d9527c60b92fc97827ed111684ae85620d5b808ad7960f2eb81171200f2222b5198692d371ca1866723c035eec78e726782ba325b9cad23e119fd28a651da1931294512f03f8bcc378cd27f4e45546b548e8d9e0e88d15536c0d732e2f56836b10bfacfc628ea07009a3e0c52d19866b997ad53e3b7f6a7741394e0fc33d71cc2c08fd5e37009e3604d1c918eaadda3003deff684c773c7a6e9f051f3108d7a38599713b50d04e625d0889c0fe0ddf22591b24a20333e9972279f52b33dd15b06539b4f1381314dac08736df7a1a2f3469dd4921380214826bca241ac4db475fa55bdb320bee3b100fb84327299628de55cdf1cd5e7ae7d07ac5faad7c0ae7e1d1c18cd1a730cbc627961cbe70b5c41f44883da8d0d8faf6215a8b4f0667d372ea172963dffa294877971854273dde6e435d8aef35797c9c5689bfed55459b33faf5135469216d948065480d756df5e9b9fa176e6e6e6f1179af19bc1a913791fb3854e21efb2836d6cc003ce8c105a0ebc7e1c970f696148e64dcab76fc1ec74a8120149de528867240c4bd09a8007fc29f110b955c583e6325177916e9dccb76aae3f016e2349f8221d328ba3048149de51aba243f71290a8391c818219c4145bb416536ad56c63338462b866321158dbe01a5de5d82223304c32b3452b0207f993a834bd26ed6a523caa259233f84ad26935a58829d64c1f9c3a912b4242a389546c044140b5899008a598a2c8c80f7011839e7244dd9f188ca81fb9de84ee4caaa482daae228fe031423feda89277122fe848e7a5142d490b8fc06ffeff62d8b2107c899b7112e9526e9bf070c36c841771e92bcd3896361d3417be10f93e2b67e25543662b486604bab97290042c70f50fca24f51981c1ba14d26d47a3424d99846addb08a2a79926a594982454e6ce05a941f6ec563351581cad762c6b09dfe607224d7f2962b9eb6ed97ed4a43126c59bb9ef7a4903c0459f57b2898c5f5982df2780884e71acd23145f3065a9d60605827939c92d0e2ec7110080796562d4556dc299a30e092e4f522cb1ba05537f95bbaa001c8d0a270457cd06858997a5f736a78ab3ee0ba463ae2608ce458664d6b70c03245e41c65e488129d7ad38f7ada799af5e8e8cbed0201846c60b23bfdab3e29dee5f8c5f01ad234486d933e9e12cc6dd644947d2fcea30ee9ca5a5acb923ce79c3538d226dc930ed86429a23fbf150c47c2a2932b8ffd46f0020f94043bc8b21c982aa446cb362056c3cb1741588da70d73367935505460c591aaffcb30e8cd25ef6f47af115cd81f47b5e14fa9bc13c296888c1942f3ed10654c199950f2c7ae54e8bfdd3e67944205bb34738b37a34b53b768ba30cc09e75134b3729aa8670759d24c1db8f169537f0e62619ec4ef7df3e7d4d2d49d56e944c56b5aa43fb87097ead230b0690c99e3510cdc8f9580112c15c0ddd65429760a7df0c23cc3005002ef8fa031b8bf79476b3c5f693192a7f206ea7a95a692d171c56c59da080697509b91eaff1aa7bf7b0c599ee790299a6248e4d054710fd4d3f811cb92f4a2d2ab6ee0cb8a7037c31e480084086890922192ff3b32ab09fbed1a2c2b82ac257877027363ad5063368efc66b4c80aee3c6346e669999885d1208c746647dc518ce7a8136b5eacd416327db515f61280f64c556d88c390e2e93d0aea6eff670b105ecf4607d87988058b823e7e407ab77cea8c1985085f5897f53acb89df51fb9011c801d61720b717a40e8bc02d8209450fc5dbfe4b07730a171e508242b02635480d8058f14df08fe0a6d893866b28ba3af422ef4ed306351b1a15cc7fdc8ac583294a00d747abd742114885a2cf3c48a98539ed10e46cfaf9e7dba669e5835d70a34d0a08a6efb2bf08fb7c406ca60b1f616a43da0b0d23bc7f3f35b0defef1380401ea29050e3c979672d2ca514a6034004c1a31e773f9b45592341b8deaf8977f7b5b25bbdac1061583cd949796a36114c334ca4104c6b8f60acefcdb2057af12f583285849c64814c04adbda23ad642d122515efc72a281f0bf4647d54a2690081112f29337cd71d7d4415aeb47ab060676bb1372ed03fd95a4d8eb6ec65764d30be047abfd39ef1d62dcd203d69992b50303fb0d05f5f1493c9af7de7dac0749caa08d14e590b88e99a7f64606a0c2e57db3cc91542946a341adb07cb47ea05e6512a834803f85bb3a045121997ced42a826403a6930b05eea9abdae404e816dc25347715d331faa3c1c3f2892770d3e54c10b815db5e18b9b653036ee2a88e0eec291e24030b4cc4933529d3836342268509559ae1b51e91dc8d0d6a0c9a27e0f09b7867f0654eeb505dd3e7dba739504d0b9d64a0e5b21f7ee1b97f334dd910d5f8d12f9dab6093b63585ee6fad47d96aa534c24debbfd2e36f0464ac78e81040a09a4a7d78a13758c2d6f3ca73ab2fb7b9ab5750f544adddd253b9d4f941ddca9ce0e7d097a616b06e0819094cca2370d23353993fcf98eedb037f415490b89ac623862a86d16182c36f4db450830a5c6c3e8d90a247026a73c638a3848a432b3efe7120a9bfe94e501cd5483049b72a97146863e896b126258c055cd6f317c911621eb2382e1a73a3ee133454afd2e87dfb87c7ac1287712ce4c5332b2e8a7a6fd85a07f90ea2fdd3e85d5cf58f41b767d0cd55746cdefc73e4adbef78c0dcf185b5cb1e3855e7dcf9e2be392928441dfe4ca0ab10ff6fdcdf104271f1eaf90b618622a5dcc170b8973648a04e630c01f93e5ee2ce5412b62625e60a51660012c00166fa95fb815f39af05feca88f635d23da82e883a54e54367a04479a2330eb61aae1f9f995010559888dec4b1686ada0ea2561a8d0a834bed0443e19c990e5e28c573d411de955d365d829a94f30bc50ca130825e68ed163ea43eb357a2fe99db3be47e9d80d408f7672c12d8ca77e684bbd00418f2649afd92c3f3cfbc2bcb9e19ae6b7ab79a43022d406024ab031d23b4aef62c02a5463533f9aa0753b83e64d8a9d1561f55d387982e8fc326900362e4967062e2356d4575663582fdea9908bb17ccc3a00b0ead53db3014a0638418fd24536127f1f0fde456d6cf6079b7171278c4428e20d47ff42d2d85607af0e50761ab4cb4b84ad5aff0682bad4a8329122da2bb701f89ce1047ec7019cd98a2438451e795b55c9cb387e92d0fb6d3c9054b4951c9666a9c243623aa54ef7d68a98993833a01a101017c57db346efd131042fd56be830b990e6c709782a8cca1b9dae9c44ea4e7100ee446b0b573893b0803bef45fb8a2726ea29412d75e94577bfa87984b6d005698b73f616289ca17d9cb21ce2cb916f8d71b958a2f527432dbaa9fcf9ced1e4ada0dda0d0818a609adfddcae2d715e7e74e116059d7641f779bab3cf289f79cc4e6b726e92d1c91dd91daf6f0ea218a4202ed0ef191be78e6c9babcc5430901fcd72119ea6529b4ae0643f959a9419e081941d911041cf54216b324d5c83c69b1b343df93ae94ee69c6165bb807ac363ecdf17b604e443f1e4add588b5f8b830802e4cbb2b4b4d4133a0817d058057f034bc857af8d1278db6d4b343739f22ad78ef56a140b1deebb0ccace926a15997f16f7c90e2ba71278067e18bdd8177a25ec84e0d196aac78554e79c21d50d71ce48a259c2a58cb5742a62cde0b64bdff450fc9a7b19cab99e033bd1e02df3955575fbac7c0f0f60d854ac346b6ed205c5cdd6ec7ed3396acc961c8f337f6af5985915a3e60bc318b7f35c23c29dcbd058c84dd421813e0f151d838e546dc440ea44b8b45df3526e7940e80fb83b48759f316b06a25750bc8288b9e4f65bc7e0889d804b4c50037a3a4102fd8659b9069b337d2c279c6ba2c93a04d6434fda7d48a03b5bd6df437345981dc27cebb9bf569b314e26d6705213e8bc0413a3c0f50334606d0ec22623001d45f3c8b0084940210f18ecfb46cabce1f220ca83a7f62de6a1a7974883728569a5ea8561606ff1fa12d082236d83516e576a2b0c8640b78fcbd58487caf66111a5c6000a0f953865d8d8c857505ef31a765e030b604a620d6d16f7826ba864966f16878d0b93e36e3a0b279cb28e72798801add377598c54c7880733b43a4e07d0b6ec306e4d66758a6cace6d48a5229378414e75623ac3a7e2211e61c6fb7641bd8123471a4aea35cc9984bd461016ae8a5661545f0404852aaa252ae4d80d29f6fc018120ca6d9e2c72cc8332b3b88dfd6a7b0bf82a57a95667aa78778f9c50d253581b66e5b619672ea3cf0d73a7a535515b8a4eca823e8eedf9b2321762217af8f5d2ac69f7e6ef626006151773f99fbb916ca72271901889fb32121d853670d0f4bcdec434adfb32f2844fca64ef197c3c0ed5b132e8e8d9f73873823ef0164aea1f7948bafa30c3cc37de27a82852b83d3685a96d8f270dae7781b3d5bb0d8ae3266c1c8cac6d215a6b45dfa19066534d529bcd0bd9860326fe619f2a7299e1dc419c2ff79aed3ecd2786473ff443851da93df2baa0babc06b52f74aaa847fa623a031a02700811609ac918dc0cc0b08b2cbd1d1e88e0e072db45d73081be1817232491db06ef868efce9ec95e1fd2c0c6ecf173b0041981a6f1c99d3eab01494d53278f84cd15fe75afdb38c857437140e2d87f1dfcfd1e6e4508e8425953aa466fff1b78132bb668454f6ee17c9b27a89895cfd2a7d3c7c6dd35cc40b25e7900b0431d238fb4f3a0ac10e7285c29d23d4d74c85ec411e34687ce00f15647e616417603bd04ab83ebe70175d3dd60c068d9333542dfdebfb42d54dc62f51ea9eaa2e87d1a611674923441e150a864194548b18bd7327e1cc2449477e7bb12ab9aec08028f3c017a9b431a6196f4fe0601530940f03b281c555a94c7609dc007c188be3a9904f5071c2dedc6335a3f5f7c8793893df51233a8457c4b1b1d132210867622433b82a54d007d0e1800a1d51517728801adf711b884bd6b0466aa1da223f5cb8a157ff2562befceff21e8f4e3e6473095f3383b51057163c7aae35c334f8c5baebb20c0b6042f475ee3f04666234d454c446b009c1dc2f8218232422a8b34cb1a2c2199a4fc44db38893974f64d14f443c2533fd368a2244848b702f87a308118d5bd7319efa34d6c8ca847713b27844274f38c2509d3f7399c8ba192287fd8fbb2d8cd33a2411e7a741b5d1c6a9f08e9c3e4ce9369fc61afc71ed27f25edffc5a83f265b13ea1944900dd0d8fbe76816c25cc70ba4251bc2e1bafd32f111dbfb34c3bf0881e42eae9ea7e0d901aaa00f7628700ed559bfa31444e185bb0e072c4551c2e11349fa0c3992d715a2fc11e7e25386d75c8dd87467bf8007eb3565af0dd4a6577ab5b68b3f15480179c1158ddae6c57c17eacc15cef131421d363ca0d1bcddfc16c03b8e77743a3e5b88665b2e8529ebe8db01e7706908224e2020c22d95085c97efa8c656bbb0796b97af22bf4dad6ce28468ce9658f6c8fe1a574f79870f40f290e9ed0c44e947b53694034a161d9a2f01afb639471053142dfc410f94dd99f502149f3ac6dadb10db28be9c328fed939d7b8afbc0fe70f3502be75b9c2b3d989a6c41f08d12181ff05629ceb28e0a4cca6a7eae543b44fafafa47405048a8dce7d5c40d855a503f1359269b62baa2ba76b5b3db1b599d193205a90ba2a96a4c24967509e84140fee582c0a25a3ed3f864e46df28301ce0bf8091bb6ba899baa17b3f129b04616292ea1d0e817dbcb91095a6ad6c64efbdb7dc5bca94520abd07be07cd07a19fb0d6901aca9d133b8186588b55444f0fab8822439a74696954ad1aca9d1d9e2586504c14f51491e12d8d93bca561af2b43e1a2ad936cdbb66d4ab6fe518247faec482212c543f6d46ecd3dd4616f5f3bb2456aa398d9996f40b156edf7ae66be9ffc74f2d3f481faa9f6b78cff035ade45f630a91a9197180a4711ea5722343491f491dadf2b2ff54eaf78565205070f1256f594ba5144218b2050b92377e84eefc89d1df7a952a15930425c201c1b1d3b6e78e8f0a9c73ef9b836bf49afeb7aa96dd68624e9b036d45e28f46e515b46e6ed4b7f7675f82f042a83cd022dd002012d90f4b6daa4b0d88476376eec963f439a2687a7b9be7fb6e0ff359c3d4cc0aa5f3a08916248ef02d2c0a1c374632f12e9babc5116041aceebba26b30b19cf209148241209c340f924c6b87179bb47bc31e9ee237353a0a01eb1a0a013aec2d260cbfeb2a280a465b3d315aadab57f468dd6cfea8a9f14d084346a13adae084297a337e7bce36717b2babc53651b64f947aaf462c2184427a747651e9546652ee42afbd3e01f7bbb8487091694eb52ec179719335858a60a0e1e2d1adc3a5b86a750e5d741a030eaaeac582c0ad60faaba2c1f96541cd4659d000a352e4ba5a4c64fa7ab06483504723a9daa0ea952ccf3e72e3ef65818bfd03f1ffe5db76271fa403f1ffe5e7d44ff6eece4e0343760344a64e0b43a9d4e45766ea009677713dbbac49c2bd611bf1cfdc6dee8679a631434e414d19196f169192d7b0ec6f7734f0e1056c1cbf1977e1c2fc5f89abf85e1c9dfb86e65656565e53fa475c50bf953e8ab0851a19c936e55ee671c7369703f8768c610e968f08647834db11d0d16416374b8d6f0bb54b0417e1a310df2abae17ec4751d9a3bb33afea9c949248ff20c83eba9b254f57b94264c0aa1b056317773976a500165ebcba4f63103283ba51e4d855f521bd0a911c8bb65d1bdd2e73bdb9b62bb36bee87911dc3ae29c3dd75cea37f7773bb367a94cd608b2a30bc19aa45c35d0d21e214638d1e70627e0ced3011a7e8d15b38a0a061efac9a881314ff986242c35dc5145d99e6f41e62c426af56ab550fed1bca26c69154b9555c0d77685733fec98fcef80f1201ac48c20a26349cb57134d839505ef52f994c68bfca4bdb6fdf9c949248df2a26926941c356f1699fd49057aaee5998d4ca539b0d7b00bafd9c317a903a5ffb4d8bedef1c97b99661d7f5d363a95b86698f7da6659c655736270e728794c869a41048c5b02f8c9ff1f0026df0afe7366c6271af672151963833ecafdfeba7977ddbbcb41b2693148d62db47ee0b732ab7c39c5b8d2aa84bd5e8e4b22cfbcc33350876f357a30a7a7d2b17dad625e4882a7f7ba124aafe3a38a57262417e0bd496f20b73ea0a610752b5bfd05f0614e59e0681b4bce0f57aee69903f4883ac711534934195533e9f9f9d48c9ec43ec14a4c19b1bfe906b6dad9a79e146a99c0d2a27c30d1bb12037a71a04e2beb7feaef8dbdb92a3c36fb0f97b5d9c036a5541dba541cee35a1e27c4d960d9086e88ab7f1c9010b43fc44e2e2e54508651b7a185e18f46287373445a11db15b4f37884763ab8df38eccbf97e70910e069b06fb7958a5e224fc737dcb2540cca4657a645f8f06fb87977467df8f1c56ad62f7850be5273863c269e29a6bae9f7be69c8bcd2d39fcf9fd6bc911ab8ff8fd37a3c12f5e41f9557ec50d0f9c195ae6fa91a333a3379c1f98df7833f4e0118f50fe42970da29434678d893199b41e5f452ba8695e8cd360bf4bddd5cc6ab55a99be4f46fee132e367094400ada03f94d0b07db68811349c73ce397d05836d5dfca367a30364bf8b5be10817080648d547f63a1aec9b067bc76f129bd78e177434d8bfe366621736bf160c7b2c36a8fd8d0e2fd1fea633386ca2745fdf961c210648d5873f6db0b23f8b7466a12fb06ca4885d3172f388ed677afb26a54db327f3e39f76275784ea602095650062d3e0855d3ea3b2c7f2f5ffffdbc8a023e32c8bd375620c0df8e28b2f66b8935fd8a386fc2df159026990bf19a422f49b9bb928864432790fa4c638830712e9068e991a20289fbd1b0d2e3199624059963d07730e31e79c18f6f3396c0e81c385fd358df0ea5c1790207cc2b9ae197afce09d9b9669deb1036d892fa4462632ce4c7c4266d2f263861e7c0ad2204bddae8695604ca6108e4b97b1bf657ff70ba9ad6a909b55610bd760cb0662f5c122f93dcaeede9772635482823f1a648c09e5ff381ac434d83a419caf1b0dcea83416c83fc619f343b906a74f116652caf5367f8cc5e3fa03d5bef9c58c09eacfd75e98fc4d46ec7aef62582b92b02209febeaa8b3794eca347da3ed4a95790eb0b234b11cad541efbb85c6e2cea81989f6e7f034dccf9fcf71de770bfdd8f5c3b670fd5ef107540cf79917bafb1766ebee186b8e6960e53c1ffe31e4ba4d6d5e9366dfda57afcf85470c02b8b80663e40a36ce07da325f489dac132ca932eab24e2054b7e6a6d792637ef7dd27a46e5d4e7cf9188835dbf4989d99e777bf7957e3fe9df65b9706fe0286addd471af88bbafd0c61d8eae3479c1f06e24bef6ae47b5773fdf4ea3ebdf9dbe5715e0d3ab1eec25c2f3d1ffcf29d24c1a46e1df1d792a346722de3b57f1bcd34e761bf699a90edb7c86932e1076c60ce7ef3e6d3a0f1c7f57bc1abcf85e1cfbc8ceb1686b23c0602237870e03859324be6662eb6e825d899dddddd5df7f6e8d1a33b4bf5ed7e6263de8d717777bf9039894d7eebf5c6e478a9015dda367969ba094430042f48b003eb88111a6fa1eabe5577f7498a1f8f9689f2c266f82069d754b7e59f50926d5d42efeca7414d48d33acd8934d75ad5ab5403796987b06a55ffb4925ed2ad76d243dda485fa494a08dd6f71762fa476ddc9bda0975f5c6c996de9b4ae13d2765a557b26d2325a104148f86788d6ad209cd49055553b05b104ed3bf656b54cd845556b2154ed9a47b2cfbeb7c96d1ef65b0ff1368ceb4d4a7f21d5b929f077924e1d699fee37af657b2175fb42ee220d6aa806b528b4bf26d2a0f6feda77da5f3b0d6a3fe39b77d5745de77d6a50fb8c04547b76c2dae85e7bee825dd85eeb0fd9e32ef800dab2131646d381f65a7c4dbef6fd93adb6d7bad7be99b00b5bb5cdbbadfbb4d11493a3dddddd9d0285e4d5b62e274a9a7d494cc607b33983143319679c12fbc2982a77d541745d21b6106e0a3424c527f9e43545529defa41924fffe624ca9f15b29a828aadbe548a9fdc5b62e130aea1308da9fe6d915e282e4112a8f502570917115459c61d8ac62a8ce2a94c0520211834a6201a102207ca8e1c770a1a28980f26b22984a22363b6ed3b6d6b2d6b4d632f0c6678793cea3cbb2a49db1bfdcce05fd2f2f2ee8e18fdaf2a3e338623492266812890809c390a87852477e96b4940035792213ee9ce132f9795a734e4a7ae659324423171932bf9c13508f96f9ca42d70a0ed0ccda0f4dd35afb38a310e5f8b70665194155c9c5ecb7cf3cf9eb65fdbb5cdc4ccb9e6bedb7b871b7ddb6af9b01b8ebdf4e6b7fa9f94be7cdb5ed3121d0af49ea1521b07db8b58ff83adcbda03df7ec79a14efdc1d52dfb5a62d8efefcfc7575b72f4ef7e2d31441ffb6dd5bcaf65b6cc8f757e711a41872852af2ffce562b22ab675c13ed37ee37e9ff3a6bfeceef2115eb55a26645593205e01093de122d6a23247a9cca71d4ec24a6a8e5812a5e0bf2926c66675d31dc13eadfeb807fb78878bb050a32e21575f3fd4304f91658f9a08683819c5346d3299b665c70c82fdfc84d08024666fd7a79413b71c2fe1c828659411457f4a40c30d0a92d332fbc33588021f54ba4a4194f1ba6277777777f725e34d3736670e345c201bfeb06fbb1affc58a96707cc7377635863576358e977288d018dd04b45297354411a2c8eb17484e831c2f19af2b5e32f660588d2190a8e1d3550fb6d5b5a34116c2301ec23b394082a07a7c8aa490547eec92382d13c6f4f89981638e0e0f946b9037e8663e3f8f96999fc904848386b4c6d3556b9b9466fda38c5146c6616646424a16b20497bcae4b3af64fe9efda981c6a0ba1dd96ddb271dcfdfb85f19e2959c8212c755944f4909205516fed796db95a5e976466666666e6bf5a323377f382fe2c84e3faa8bf23b02fc6196412ab78361af861e8da35c61a5e98c671a36b4a165eb473bb7b77777777777b777797c39d20a1880d608cdd1c0dbabbbbbbbbbbbbbbbbbb47d0ddfd1d817d7f34485fdb0b67f7f505417777f72df6bf7b5da3100d411a0e82200882314a2936f7f626611846859436dd11d812fbee103626a15f431008ec61e325edb30fa7f665dfeecbf5cd7d91bc40d2e6ba68c8c6a460217a98dcf46bf85c0b68b8add58ee6bef11af89be99032af111bcf21685dd60fabea3e2b77dc3ff84b8e7132cf89c4168271068ca961bab1038749e405c1dd07850002acbc3030fbd27fa385da2f2c98dc3f90449af160d6030882527a93c827881ee67ab1b0a00842f5fecbafbf2effc2fe7cf4f5319c3ed0f8eed587373333734799a7baa55ca64b876906878d0c39374ea048936952cae4e777308cea2f4cff0c42caf96b6354fbff47099d593db29cb921257b578d89bf1427e83c55feecf242aec94e757a371acc9aa0fca10986aba58548a2860b648a58d01bd26432994c97b7d5745d341ad486e8d6755d7bed5ff346f6fb3296013b9326fbfddd05ec8034998926fbd60500facbb5295b65802f6458d0b057eda3ca1fe9094a9a47bc4683df72c9c7b9ae197ae8b8e19113a46576fc890c0f0e77223434b54253f5ef08ecfd6fb44c7f341af412f691fcc5dd85b2a4dc8b8d7f5db6055d8606775b1d205e729c1e32a77d26b2bbb275b4ccb2cf8ef53de2fa192f5d5f8c1675bb1b0d6e1853f74352ddae6e145158420d27abbaa0e12dd8e518e633365a5477d60f51aabb13a9e112a5789054ec726f2caa7bbb1c31ffbd343feadd0c94cfe0c893169210e920ad45fb5ee8aac9d4f22659c91f89a45f73d233cd0a2fe3f7df53a042405dd69128156b7949ee6c24af69d8e3da1fbe785b6224f6c50bb2c2b7bc0c2f888c272969d0b570227fc2cc9a13311495273972f22850a845b5a1d4292251ed8f4f30a0ba44c94f8bb7246f0e81fa877247fb26f294903c2a24775ac899d48d52545660b0c460153e6cb22a7559291e6a2879564a92d498057d15eab284d8a286748231584bc6875fa386580dec08340441191ea6f2170c8542612dac159540438c45c40d955b5893f91c3f9926851400dbf78fb528fd42fa75907fc858d0bff66141ad9697a886a1bc2477e6fb0e86923b180a43d54ed260172a783286b7e26d832ade0889dc79026dd260a83dd6a4412c48c35a412da305d9a8c15a58132ca8b250b045f5b01d2ccc91235f5dd691d30b0c85229cf80949f59397e4cecec90822238636ae0816f4b22e6be887ca79586bf3b47fedc39a34d8f307aa7df287728cbaacd4124610a9cb2a828900eab28a7852e58e97b05663ad9dd8ec23ed5bfbb01d2c0c57b1d6c270110dd45ffc5b998db9ebda78734ddbae99695e3ba9d9bcd63dae8b67ed34d8763523434c8dfd4855563e3ef62b1ec95fe2ab78d45f22fd7e32b3775dd7566e7f341a8d46d76fdcef4c0ba91db75d5ed8ad8cfa257d887352babb13096f3383a365ae9ff2b10bfb8a5dccefab6d5ddc1908afec6a38f2e71b37ee1336bba0fcc869506621a78cec8bfc94f0b7cb6be93efe2e5d4cc6ae26e52b1b59197f183ffaddd288d6d1ef3260f4a67ee1b836f54b8442c31daa393a405ae6fa87a1c70f9d06f9e4a595f33b7d61bf76715e0d5c83e4968e94208d06650e47a341b03b07cc4cf3baabd9fa6bb1d9da0fc3ba17bde96d9e3de609a971cb7e66df60c6d35f620c689c44a061e4768f31a0b1c90bdb76713d682df3a07bc9ed0442f65b0cd6fa6878312090dc92a3edcb3c3e52b5ee6e6e691f7f7f71eb05fef8481279a441d900a8fedbe5004065240d4a9f8e5331d5031a3fe4947fd1064924891fff46e414c0c24bb62a2b6372b779bdc34dfa453e3b619f2fa4f393988cd2431a6c7541714c333637a41a9a9248d5d0a5821bce86f192012b1fbaa8842cb549ca4b30bef5979527a99052dc6a5012518e8d5201cac673e3c9bcbbfe5106dbba70777f3e64cb6ff93efae5f58c75952ed4a0336b77f5363039b6a7c335f0b7c0803981eed3581bf3afafd132347ce05dc07f591bda5f0fb336b2aebb304c03d751edaf818e6aff68e399da92fd56cd6bc9be181850fb6b1072aaf36bc9c180dacf80da2f6406350954bd9e745dff31cb42222513808be5f384e5eb755d3ec2be6df0ba40b0c9d7623b151c404069706bf8fc3ee77b8ddbc47fa9f16354408d5efd8501e2494405c18d9238110d261104b0eee0ef1fb18d968c56ce4a2209d9eeae2602ccaf2877777777b19eb3e43ffdc5dd33df6e6c0abb1bdb9d9b3ac8d860139a556e4267e5a7586d42afda84cada84460e6b4231da9597a08c35a15cb909ddcab3b1ae1bddb511eceebebbbbbbb3501618ec244d049b7ff4b832c67753dddf7e409997351d76378cd9d4684f36650824c67119f794a5f436ed97c614a06280ec4b3ff8f21e49465511b225162a69ef5fc847d46622483fd0124c0e4105592848bb66bc8628213f8749a37dac9737038ed08f1e435e2f6f878e168f9ba0aed79ceede8dac3399e428e640a251422767b78518eb6cded646f2a31152b3c28a56f77b79cb78b9f592363dd0dba1fce1f3dad8658d1479a500165e64b0fc60c92676492e345567419bd82563e71fd7b4ebc950a9aaf8cc424242aa0154c92a212f71605ffa6d18d281888754085ed0aa7f40828a36ad66a394146dd3468d9aad02926d779736c845562aeef990590575a0b53181d646cb4bd7f387addc062b83b51abc3c8c8bdd176ce5250c1b6a90072b832161c1a015175fd47e2f5a296c69a2786ea85d24c84bb1043fd47e6cc84bbb29ccb123cdc1865c0eb54c07b9302eb624b127d47e79618cd5f6a23d79510ac34ecc32a5a4f6fb4f47f739126512a96ab065ca7d480ea9fd529eaea227516aff2cca62967973364771e8ba2650b6faa9fd5a4cb26ab0a34ad38a6291dacf4554174fb57f148548ed4fd969b0bd28854bf19593daaf12d42b30585a1b23c688e1cd31e6c8575ea48a43a92b540080c76b72dc48002bacbad5412dd4434445cd934aa552a9544aa552a9542a9517ad7c67b55aad562b47398fa7dcc755fd984aa552a954abd56ab55a6d238eaeb0d0e649b58faa7f621a4828aaba55d441424344459754a9542a954ae5455ee4455ee4455ea4c2a20229458887888a1a954aa552a9542a0ea99a47a552a954aa4eb54fabfaa7579d4aa552a9944aa552a9542a1500c0c968f146eca3e29f1503e514d11369e751a9542a954aa5e290d0d0100f1115f569277a2a954aa552a9381487e2501c8a432bbcd7e56c119f7847060505a5fcc527260604ff49244a59c53f0cc42dee204ea552a9546a03c099e68a02915a1f74c9a09c981810fc2791289d939e483b8f027948a00c9a41970c923228ca20974102e0e615f4b79a0205bd50a630467e0d49dbaeb6152474014d4afa07e58502ea5ec8ea059405903627c97fb32c0bea655936c24e1318c2ab3469a99060baebb02507625ffa79e00108208c18410289269aa8ee3f35a4be5343aa52f9731e1ef8ceda58f15614b30a1a622a2aa8c05445a8fdac15617dda01e51ec56f1726be7b6f27ad488b427dc8855c0b215cc8472b2fda708b6af33490e66729e2b1e9c4f82eb4ade616a6bbdd9d066796069bfdd90b7fcc8851caeba20df66c10279c3368899c44c78ef41285dc0a6a193ec5c8441c47021d360ee702dbba6c5df9897c7ebcbd87c801ebf012669a51557e1c36fc32b4cc56960a7e2aff0c39eb440a01554da5822e6aec1aef24d0345fb9c64f3e9d68fc63c13e7e63df11f3bb9d9b265ea12eab8705b59b7b7e6c8bfcd5dfb42ffc7ec9b805938af9175fd4e904fd1a9aa258020af5342a32d2d2a28921dc1d59aa263503b3aee0e32e472f4a29658c1e6394327e835132338d2a326c3b066f92fc1ea7ce979fcd201809a63ba1e1a05d1b47f6e85e570c1ea8da5fbfdacba7f40bb1cf9e5e1c8d1bb4e70a54ec352f74f9ea037b99794b6a90868440178307eaf5988feba35fa42c9cc671894d1a4129379959685b176e8f9263e1e2829565db085d50feb64ca439d55faed4a971412983547ff62ff6701244206144f46406412b9001163ed0c2880e5846a88831e2820a80ba2c2329ec895f8f81b6cd458a8e1dc21048b07812b46a29a0dd38cca90347b4f2afcf679f4b36cd2ce2a44b38baa74b3ca49968c144d88787fc92a189a7b6378aa8776282847cfc0b69d48d3d12a279527427aa799aa7976046125b62882f5f3291f2ebf5dddde5e520c0c007063c48848055ae8db07b8016f985bb183613769fcc91a5a7dcf6073ca3db6394f2ba306c4e2c346ddb989999b9e3dd5d666666e6df52b86c08bacb244a771ffb01dd2daaacac74359b04ba1f0c0e0633ef320c1696181cf3ce153221b41ee8b6da560d32e8f224ffbe87ee922094d4f0b7a289036ab281817a6248f426867c88444f1cc99ce8a9a10cbbd02c53f96bb00bfd2e49a8210dda329c0219b67463b3325e035e22059b186e112bc94f5d1ad46539b184ba71e76ff3b10d1b72e927a60910893702040fb59950fbb7706df0f7fbd892fcfe1b0e784016c686521331488046282bf9a1e102851c07ea4097e5c416353e6fdd61a3332b3dd019ca261b4dc49c3109a8fb2c607f7d08c6b00bf163610f807def2f9f56fba34050538d99d56a75c3ffc38010450e4475a3c0418b28706802839d1714492a4446d94d1e1a9aaacf492989f4207b41af0f394ec6df8e8589c95f9ca1505297b5c550a575595bf4000a2475594740d57087585b14b1c7061d064d071330aa39bfd1a097c06f34c85f8c3dd188e4e1ad1103243d4e21a8a9990372a0076d1c08fb9ac66711360b44036c21b10390da3ccae8d7153d85834aa562140a85c2698ef10938c414ff487578891985e22629a0ab5245e77ac40a545fa1e664548fac8b217e34673f7ff9ddc55001a129fcffa8f27d7e189f3f8f7b427a3f581868b682669a44a2747eece8fc9a0eb4bf311bb675c956a18c1ae32ffedc0d2856c3588750fdc36e8728b0b5bf9b85f1974fd0fe1bd059c35837fe5c1b310be32516f6c59f44525189d1b130fe3e348ca94445ff2a2b23db17aee9ee6ab6073ab79b230f89e9e6960f97143d970bf8d7ef942204299c171af7583f61fde062095dcb621561632d816b24d4f09de0892db09ce8e18282072a6600042453f8294213d35297c58227b06009b38a2d43d1fdc5b21d5cb21da49452c6d7c0c2e8ac8dae5cbd19a2ceda908ee33378f7c2f5fee14881621faed0eae8cdc79b758322f55b66bfee0643ded1591897d315822026a0f0a02b8514516a01ea4ac112aaaa21ddcd4f8583a12a0593555d296ec0c454578a1bf050b9abe1baa00b724ea03bd858346f1392216950cbe8e49971333e1c0df68c4dc739816ebd7ec637885140dbba2c1185092deab2986852439ea22e8b092295bb9a2e07da7125eec6ddb81b574629294b3ca9cb5ac249ed1deab29030a9db7635dd10daccb58ccaf3d396a1cf74662ea419dcfc156ffee5f96fd78a765d97b77da7fdd6adec5ebf72f550f16c64d0b103e78797e3e934082488c7a706996fa6a05ce3f7b2faf77fbbc2b3c531c6f8c4d6bf2e614c37847a94d7252fbe9a25cb8edecb5cc5d6e1d0dd4057dbb18323c70513191adc261c836da50e7287c6cd372db29295df3c8ed2a7068770ef1bc775352b1ce7cf2c39aefb6db49245cddb3abb9a58d379d77d2d5d4bd77dc79d4d7c1fdccf8fdccfe77ebe7fb6792baf79d96fe71ca7a4657854f42ccf1e8cdf3848b2c0f0b806654a104351792e7228dd9c0a194a95bf392ba123de1ef973919e66947bda86924eaa7cb04ae669508e3e67dbd1ccbde933f9c74592d01d9cc7bf827b8cf5ff41aa9d7be71ee3c19689f1c98fe16db710ceca492448b88ff1528c6f8812d9e7f0344af8cb07696c399f79eecd685092bc0574e42699e5be6f01e51d1df7eb997b1bb450967ba25e52e527515f78c3e3ca282f4215a1a24846f133aa8739e67240bb9ff9b84883927b322aae8fb60a0eb62e047405494f8c38a0fe31fa8f20082cc3300cc33a1b68ff34c5292809dc38ec376e728f6d8f7113dbb06d6ad9c49cc8c2ed99d460c6d2609665f37ff33a10689bc6691fa7a0a496e93e7b701b75dd06b99f5d37fabe41edbbd762aae692b9405524c6186b40a3bb73ec519ec2b62ef3499c82ae4f6424ecf3212ba931ae54b50cfb488c7d62565404446e11102fb1cfe6e393621eee61137f9c02e2a559747d74997d9cea693062fe91fc85e762429d7d90a87e580950cb6471c6eb7939d673fa5c3efe12bf8b40d9877d483e9d4f401a8c41a6179472dc4def8b2f7d7240e5831dfb5bd3c27426a0fde16c613c6a021222527aec18a36c29a5945246295f4a29a594f2331cd0f8327e341a0463916d650eb4d33ac65f1e32a01d45fbe9f110de69904f0dc69f2f7feb38edbbaea6b9ae8633e6328eeb6ab28ebf962ccb3e4be96cb6625f0bf63eaef9fd38de0c5dcdfc783418e776d3327bd360c4fe67fcc64ba4188382de3dacabb9ae23ba9fe978c4ced39066bc4bcbb03c99df1e465b40fb03bdc4a7d369488b667fc30367866f3d1e425adc3418ff06eadfacddc0f9803a0bed221394e3bea0f2f7493396dd5b4ede83e1a30be39f01d17e5e1842b04597186e360d6dc5168309a94a396f40e3af1099df677c071b04b1792f1963b624c618a36961a2f760054aeab2568024a62e2b89281b6fbbbbefc6955da2bcd5c03534d5a8807d891f458d710735be9b16267e0614f2ce47a34130ca0aa166475283fe69bff37706148be1e49e406383f3fd9bfb8266df9ab66c6e9db75db996e99efbeefb1975ce2ca6665fd61b73deefd351b0adc481b66cfceb12be17e7c72ccb5e485d2ffc10a732a7304199b1e884e3babff7121d9bfd925d745708e13339debd3ff5d228e549fee23ff202a7bfa8840ef7243165340200000000a314000028100a06c442b1703c9aea7aee0314800b7e96427e5a9b4ab324097218a610320619430040000004444483481000c7a34f35de552abdd70aeb4e6f16209b41ec568a0c4c629fd688b23e1e16e3aba70be8abf2e7bd73173ad99ec3aed6f15b5453c2f91289f09f4ad4f7745e8ba7f0a535e0769b01ec008370b833ca950dc01a9dc1a8729b5471d339fe818047eb923250c34e30a3a086eb00e0876220aab53dc1863243e67214dc410a5cd80591923b6ee168c83461e9c1a0b6174cce474944830ad35143c8ba42f76e9701c5a98c1bfaaa306e2ae83e80f41b4adc882b494bf95ea5616153d4312a34c67e269b6207bafc9597026b2ad630c551cb0f7088acee29e0a34addd5fa4dd2849634edcbf1062ce8125a7861d39ecfc00621ff52113764cc3b4180b3a3c1a175ac5037e074706d819ab2aa76141858341258b12b8ebf62aa576cdebd545ff95b352ffba6544631170135997e53b664c0a74504299347d524d767b4c48d6db962949f8c3485e61609541cc7094cbe9097c30708c1f6bef675245d3823dc5dd50ec516ffb0372238bde4abd300640d39d9db50e0b1781713491e03cf81173ead9e339e608c160f1b1826bf576fa22782d18810906227ad68f1fd6e4a274a0c87948299cfbe9383d065f8c4f5a5aac15cf976ecb2f168c5fdde6593b9220e7b2ba4880e8eafe71698329a93cd9e18d4353da983682a1e1f7d7d6815cca3b2c65cfeb553629d483c58f86fbd21b23587e5d70d3babaa24dbe693eeeceb1a4a9b742bca7706df97d06e900666790a6c462c99f8e2e13f09c0045f4c5c9135739977d508c11e3e1de9f55a3fcc7616985ed262dc1963b56d7437232bf892bd6fd1ad2a941e193ba87313c1e7194ac9756b4a29cc8ca18fa2d66bb05b62e6f1b4437be74a34cc127613dcdb511d2bc9efab0342ab706892a258757cb3c140892e22d2ff35ba18d8b663eda244e45a0cec0e2caeb523e30ac302fee92404ce77bed96280e554632d0616ee394854fc89f353cc734e0482aa47a204e8cd7d07180a3e841b40544505bcfc04b113565cc8161915d6efe518125ceeebd8cec4b6b112b1e6d90359a160364b4f066d23bf6095a01866d711049ef2ac379b0c42df94b01dda4dd2ddd7d6bd0730a6ba593a71ad775383174c579c66bdb6c3a9804b31fa027925234190616ee505d120444c2258794b64486cf8d768a416a0b1716ec1212eb9ed039384126dd5f58d4ead0f378399014d470c2fdbd5f0f28c40e28e1aad4d750bb6acdc28b6448f0163880a540530b705c32730f805a070372d8cbb50cfde3d89a573ed7f7225bdb40662b87fd05e215c451ab3e330e3a8bb540f25136daeeb051c3c33a12b305e714102fbe2f7a3396c558b2aa88a0c7225d538a546e1f1f0c71b1ca53c73ab7b3e32ff0234d451e1bd5cbf20b8678737848a79b15c15a230bfc92190eac3a3dba5949a6fe0d2a6c29adaac89ae17ff5fcb44d78dc82d2941aca04c6b8a12b685c8cc9f4458621a17bd97d128ec089517c6a72c33afffe43139a98662c3368abef2b47a1421447f519de32282e7209b574294f2f9e18a25a0956cb6a1bf1f182c5f513d5b95db08a9e80f22b414781ac4c29f92d5cf6ab81e3d8c2fe3e47a910fc72825e23faaddf88d6829393983b1426682933a7dbc026c055e65befc98124573742e82ee497eee453799bf996df25ee20a72cebd47cdd7c0c13ec572f54b2260b700d577efd6b6087f50b7587019789167c11200b717e5f1e3dee6c8fae63fc764105378b26d4164630fb6913179f24abdcdf5371e9433b601700d175e3421c59aa799889693b033062be4bebf3362e9bd6a8405ad98bb5603497ed2a8ca51719c512a3a4ce745d655e124ec74f98c062c3dea33d750eccad89a16e11ea229001431ec7419d52bbf1029be2fb2968f6853316fdf93e8ec33c5a5167be8cb0fc049b79e5433179a2fcb583a66f683bda35ca889975b3e2891f7976bf5608c9507ec355094104f52d96520cf4f01e81e85d061ffd1a6fa9642ce4351db752b2dda766f7a13cd1f24ec578b6d69461ef4819ff4910f8062ce1108c25eb2c7f494246bcf729b704cc5afcfb6dbd02f640c02cb92abcfa08ac23765f611afa4b6999451255b80b124f7e8973120690cd2c618c566275d335d10ed994a92a837ae335faae0106f284813d9ac07c2b238a5760a66af01e8c904dd713b679fa0ad5ee2d35fd01dd149ce014550384d4cfc5c922e17142e6f6f9336595ca29fbd43991c14d57503d849c4306fa12ac19ca876a88c10db65b54b159141d95ba97742ddfebfa6fae5318b33c833454b0eb0e668a31c9ec7d6ec592b1d363171060bf245c2c66779823acdf4a4832b2fa9a18179d6230883855c1ae51a904206c60ac3bc46f0c22a65a5f82fe4315a1453b6a2f15a0049ff10380a409cec343e4899fe93c853720452c72c2f6c29336cc32e24317e728f8b12eb50212b4b425e4509c61ba6bcde08f5c8e12decc79f402515a7bf1b93a25bde396596b370eb93bc82d9c2e9e621441de0de4d4f881d6447b68cdc4d3c1c5197bd05f9bbc47817133bf829ed7331e444950a5e5b017831efea5bb0c1e531ba2453a9ff45efb60cc86e0779ddf16556110508d7e5ec496dd8b865da632a463121c33c44da12e4eece05828db6190b3258245855e1bb81a6da34534cc59312f07075a4f734ec7753f3f52bded2a0823585f00f4d9089aeaf61deb7ed14f10c57fac4329a390b4a07b879cf0ed4aef106dc30de34eb6e1df173d03461c53d7dd8c9d7d3e81024b1ab9abf744dbeeba03aafdc7ebe46950899c90fe128db527afc9664caaea0ca1cff5e69e1cbb5e5cf5a1981678956544ddbb1c959fd5deb28eb2cc1a39384dd3c98cf8a41eb261f6c48564d181580c28e6756be6f313dc9b427d9a18e446dff66dd3f84a269757bb8f2653f725f2426af4e091aace5bb3120e7d043b1f096e5f8781f6cc8f21d0c1fe3874660a1523fe305bc12c62f0d80e70f381c2d863528c7df49f948b920b455bc5f1b6b516f1e37caa55d4598dac7f28574b158a58f9830612025b364e51e53b9e43e2f94360f4b94fbc0e1e7e7ef068735ffbe87d71741176ef09a4ed3a4163f3ed7f0ab4187848631e0f70b3a184b0cbaf6c8ab0b8293b78a66c5b7012da90d64fb84aa3ad0acfe332cfeba766fbd6155beb19078f85825ded44f52eef4eb3dcfccb0ebe6f43584298975eed85596add8484edc8aed6a1e4bd8284cb151e9c0064e515b992448701f35a6e1bd20a36337f81846a602affc6d3fd277e98c34712db10bae93fd80c1f55d09b1e5ddd06a906bb8942ac8eb50546b4712da139900dd2718a503ee5cc26148be8fb0eb148a0ebf7e624c4cb5138ea241e40b93d72aceee1c5c7e05e982345a8704eaec8fb3ee8270396965c84d782871e74db283a08853eb942a80765baeded6aaa2a383becbd9bc2ae4efef80cb0549fa6e03984be5a44fbf1ac89a0557d7963b64d3ec1dcd7ba3e287ee45205a6a73358d006f2267855d14c0e1c8ad5116ca2dc8cc31cf40e17e46b2863c3f01a246133cd4cbdcaef6dc6659d97e3950060111b54b8fb40a642f3a939e8fff046c329db54e16ae89fc3d76d726f4c64431a642c93effd4a6528671abe8f5767a97fe32622496b061fe523523b6680914307618c74fa0dc44502ac87e8fb05c96f7a04db156b9168e899910630952b1e298ab71fc0d0e71a5e9e0aa49c9420caadc7817f7804b92b83570ec12b14e67ae275fcf8536b4dec563f25ebc72111b7f6d8da5e7e5dfa86683335bad0bdf18e04fd670dc1fe72a5fc7747d42d74b89e2e6fa2084624b734a1aea6be00aab98f177051160532054475049e61681d0607f7daa4462f3095e2f99ea75bb5fe952d91d25b1ad1caa81197e676c9de6dc3d4a47c7f892b5a7b6762ef9410f0f670b2407dbbfa9c3aff03b62adcb27fddfaa28889291a03c7007387b4b6cef7261628644772cd3c404394969a9ab7b722ff9818e5ca07c449b5f37b3b8f6c02702b9bc5b3f12c8b8e98cd91f0eca10058e61d000e69f4c46fdb161a1753ea17c9728d60e56d7cd759fe2e768c04f06e07728e623c1026f2d7293aa8daada60ae0dbda9832dc9de9aa188d73cd41c605d32314522736d2ce97ac062f09f1ea4de09c8afc9c6076a663485ae9b7c49b7bf8182fd6023db1bc4dce601a0f8b8afa043b7790c00122ce8558ec1511c5489c5641ed7595591770a556fbd26730e0622d51f16ab879b6eec4e22fa23fddb72f0a68603dab9461c013906a2204b2e0d1d08da6a747a58192fad5af9354861553e130fde921793742065f299a7b2f1693971c396ea70735c25586b8df8fb3cb664662b343bcbe7ef82902f15827f8db78e250ace7f3f4c2428cab97d229f97bacfa924cb2996b651edeb6ed085bd23f8e934c5728a3d257d6a009ea29f7972b8187e5b1b7ce030ad3cead8e3fdc2797e958f31677f9e79678a6049adf27991e16ea60431ceb31e8ec6378974d1fbca0061cf0c62204a78e35e03a8a87c579f21da5a20feef2bf17e1e2832bbd65e69a236fd7251914d1326b189f76c132d89266c96b2a57ca00ddd37d8d2fdf46b22ca8614a04001431f458150b113c3f27a49f05da4c77e800fcb43cd31147f8b912b9386b6b1fec5e997e4326e29bd4d9e1af6d61e198c5bbe20d6099b1d41d4f4036eee2e6c5fe3c826d8cf2de0938d8aac1db8533a515ac3b1bc5502c8b6ff20ac42191d4c95aea7100055be03c8ec40d77f631afcc45e6917f1360f7dfd151be490d148adeb128cbad4934b118c4c06a59fe328de4fbe2827740fcd499674025168496bb78b9db69fc03a7ebb6f8a0b86bfb12f5d1d1f59b2eac4b5d0436edae09eb0462ed641178a7bb1044e9d704cf3652b7aaff2ed7e7d484c0f600cf170a825961dce75eaff8deb458465948ffdf760af56fb4e5bc6e00b9f6194cef59719144c64e5cad19d214bfc845ca03fc0345b338db83f336f9b703c32d7e2212b568172bd2777a75c82e67f5ee7e3c0e7c954b2d6c6b3e44ff4e78b58c4cdb5f30166e4a0e647ae12c91c1c79be2da63c60cf7201795c897ef171e0e002431a3f3cb2e1de1c8f0236c86eefb3049a44c6134c1aa40b90ebbdb556d04959ed140bbd1d9b5ae9c9f558fc9e0fcdc8a33c47c220f3d928663f19ee4a474808f86393863b3f417aaaad6d265a9eac11b7244dbd96c789a24bcd385b93d03beb7b373bbe9bfcc81ba4524d1a3eea8cd6e1e76db1a1905e6c6743c813f49c73821a1adb2532f8a0f280ca068ac24baeacd7d63ce03a6b95c1e6b7e027640799536da79308fe0566437bc6b268f430739fb2b89c48f03d86886246fc2e2486ee0bd0fc0f334009f038cceda5438ed977ff00f78d904091c70b84c88d19a49724425b2312be706d81ac94d5635951a7a92e27eddc5f6c95a52dec6e6a49c1e753c83e27d94c557e34b97d0de8f76cfff86d6398a05d5c1f01c83bbb94b59b080d5af71b4736542fc49138a20ac0edf842fb4cca09a648cc841eac6dd97f8ff39687e450b134d198f02260962e2c0b0c6945d752ae132dddc95966937d9fae33824427ff0c5acc9af0d7ae341e216cb9ec3f18bb83e70886aab2ae819910c4fd4cce8cb0a4a701250589aaeaae21b160986f31019632e82c42c7cb22a1d437da4f47f6e545d48d2a7e2ba42452b143ac8053e613e20fe6c67bb08ec827650935d2a33f59eeea5476614ae08fd55d8a8526380a931b05f6509adcd91be362e05217d53b6c5025d61488a74abd06e78e5015a81800227ad452f629ed0360040f68f8f0dd045536506dcc7558c7d16a42fd24e125ef13bf3fa31e15f5f5b01dd156e1799cd86bfb8feed2d352a2162e0e1d61cf958ca6e1942cf478a8ee8bb5d8893c6a16cedf63890c857a70cbbc98b81f28084ec266bd7f5b68876da5f733434ff4c7ef3c390e6aeb059b9164738c08f643686fce11fe7a1b26873e2a3051337f20c9bff9946f3c7e9fbe5fa466e996a75668a94bd7b3f6257e140b5c8025c0d07fc462788592a8ee34a5237618565d24e294b98134b96dde0df2c3719e87585afd001b18e2b03554e1d1ad955e72b7a2531c21ea473c4db36a02808ca101e1f4871216e1cb6eb5006f75ae5063f81ab888cf88334f7b441aa07092d28c431ef2d9a7d792dd5c520f9604ee0ee7bc019b3909fa93a16d4ce40a4a2853e3fb434fbfa0bc58e2d2b6f516f92bdaa2257adf8fe8b541d9b2e60c8251136e635f0221d8451bb884a5c00993e7ee7f13b0c0ce5dcfb7880ea4efdb7c4ad3459ec02a972767bd2b49fd44d6b52e82502d68d0c127896e3b71848820fd013fe56456686b17abd401c4d7b32082d7895b52953c9fc85afd665cf215588a4bd07af81d0eb009494baeee0ccaa3bedf065a29feab58f796437595474ab406f214db2bcfc5cf600b3cc5439b9f11fd62b58b28d7610e9f811311e0c1e1444e42aa3d09696e9a613def397abf9697da9d8b18b689574991b6f9290d29c2383b3875832761ad1bbe2824ca6d965eebb340e4d718958ddad5c497d147d5cfa5c15177af860540af3c8608bf98315ceb90f1ee3a748d210213b8a35567d90ab16d23315ab19b55328fb5c60c6aa7f5fa8264a2cfe480df7f0a70bff873c99879275c0e978f338f44f1551e90da4e4c13583a8036202c74091139cd77560d7fcf55c393061f351f404450fee32305983df0b6b720bad99858a9e4b731b064fb924b9894fc8422ff437a508c377ac0b2c14eb936fb5a6d70c14a0cc4fe49a2e64689a75e74b1f57a031a74ed1ff8550bc8dfb114c4259ee2b76a7a1336180b1b3ca36ae4aff95c58886c71056fd0d839df548768132061c57970822947e0fe68a43a419b5d08ef9bf05b8ad43ab75f732bbacc5e69a53ace738b1a7391151706ec5bde4cb1083ae0aca0db28091fa3b5509fbdd80158eaac2ceb7df840180cbf62fbb480d5ca14d013016fad8e18e1c320c0832b162253da155e75dde00a1161c7f573e90553de3ce630424afdcecc75f306112f7462dc5a48f84aa404082ec05a2aeafc03dc3936bc400c1bf908910a7ce35536e9f3f37cb929fdab9000c10f9636c82ac80c27c8ccacb0e701abb2c955897d976d1391c3a8f4455193a52881d6f180a822f54a7aea4058967532161f34e1bfe54d54c6d00a02565d48443a50b2074f185546df8ae675d9c8808f25d74133bfdad1a5ff8c5a4b939b44546f9869d574d7cb82ef0a1448911a2fe97392abfc07bf0e2d8362ffba1208a7d5e845e58510f05247b32c69377c99c5534f70108c2cd0e43b9c037df4a122422f78336981cffbcb9f74dd955ce7ddb23278d53ce0e6466a1bf41ce0e7819ef58c1792666fae8b2fb36ef527ade19e05a899ddbc324430622088a99f9e9fd5c4d760dcabd8a151aae71ea06994f3dd4924ba254b78c487dc65794068c56abfdb1e2fb68bf4ddd7f1d40d6b918623492678de63914ef891461faa01620fdb98c99d7e6ec2942639731f59e1f9620a0ae0c4c6e334d7e7065223d3f06248005d6fe6e7a2882e5c9e60fdaee8e2563871a1f59c8445216836220e63333cc1b0df09a32488a441886aa73840d3c784921e68931d0b3b0127aaec8a028177b58352cb0e877af586e717d9c8b59f8c949319aa5701fdd56145bb123c0486c1fc9c9d905a52c758086cb514ce3d4536d61d6fafb9c4790815f64c55559e0155ae1f3723b26024c0e566c903ca8b713d38461e298f2649c5e45b90bf51f1f16f5b7ad9cdce6467101c0a0252c2423950f4ddd8f48b075e11b9fd3128c31cb38a3d7f8dce96d6dffe4aa26b432a3dbd76d593252334e9d45beefa44e649296c7b3b6d9998d5a74e0ab4d5acf0cc23b02ab7a140032f408925072b6ab9e6661c26493732e2930afa5b6375d963e61e1c87bbb09380b049fda86c5b528a77d200a104ea905b0e1050af4c776e3caed0cf39460e7977bce02588a837f9d27808c9ccbb9c7e4c6e14683cb6e0bf015ce195dbf56f5562cd1f0cabba76af858b5fcfc6fa8c2e52459d23d059bcd8af452af8cd89227c9d6ce0965d66233c18a81bb615d2611e0921c72de018f81060bca4a587dbd322ef59059d9edb33d8a38d938c1e84585b5ff50d9756845a649fb908c4cd2fea7b2ce03c87de9da5e1f5dfbb76b879d77b23c40bc995cc3252b45fd74c0a095ed59375a9b35b1f749ff023cfb4eb820a63579d4ecf38c08c9774bf56649c96048567c9bc522d1383421e48683f44bcf8b77742e00fc75a7900adca45c997d65887e4f26d8a3e15c884baa4d3053c52f00ad721173564be27d27dc89706b29cf0e7fdfdd61870526c8abbad341f3fb0674d01b257d62c59945aac42cc1eeeb574d53a3e40a0c6d9de5488def976b633e7ec3af0d3a2f9662f605a06b95a1c04b0448ffa02659123a8da6695c6cd4016c25d3b6778c0f19b64c899c6ad4b0080ad170f85088288b6863692580359512837c5493ddd7ef48da6a8da3d27e4a22fc9c022b669a23cfb1d24b8589d54a094bb697b6e4fe0995b44072144353c6da23ead233f3fe2807af775084fc7826b8e18c25ca2b18acc99a43d086d5e43aa30fe54d13de753ddebe467000866c076891323f81de29d3f15778974e3581f4c85f49f48e0f1661ec8a10f7d6cadf53101db22f45e43506ce3191c6118715a8991653ea078fe580b9659d757dd7ecf779bb4497946dccf77edf511f68e8e532cd3f070e702726854e4464312b36bf873d9359b3c5b270de3ccd991bbd0df8e5f8719e87c40e519ac746fef321a4f06db80839a645203d6d97083d4cb8a9965066204b10672bc0b3246bdcc495cbe1bbe4ddc2939d809cac3e4fb6ea7114fca43364b388721f7f35dc66f2a9c6186f622c64e86be1c1daa35973b9dc363ab4ee8b9c3d3d5a4598af37a46e83eda67183048847f0f54aafbf836a4d5a414f63b5f66d2dc5b6ea3aa8d0c40e4e91745e389744544727729c6c22932e2b8d5a116dae54139816125688c9963626c8e1f800c68ad9a63b3b489fa87cc5d85313c3b9ab48eb0a2a76cf3db85ad71798006e10650d2c2b9beb609a122e8e7da37970fcf10924ffd921700e0f263a998ed71e4f295ce51e9618b3e738db398b1fddfe45cde0a6a947959cf21f1957ef02ef389c9f5750a0108fe81f0db6404f776441f78194397528af46b94a6bcd5e47e8fcbbd3633499a6d8b3d6e6f74e052a0e426455a84205c189ae8b42d3840d34d509241a79b0f10f320a42d66a3364c189de7f21bb3a20813b81dd1d19ec5754038c7437e03a565ee41e14df5cfb7a89172f645528930a6a7eab7f46fd2fe0909bae5f23e58f0371d50aed95bb397de328549c18aa5cc8669039bd9f27a007a9be300ad68fe248678c5fc60a2716836d347f01d8771197849037485b76adb58030665b4503242b5201dd6769982520539f999b0556b75169706757de5df1393cc05979e20dea1228f1d705bd4bbc584a66163524f3d981d240c13944b1d8b8f89f121f31e1644e1afe8bba4b6e5e7dd2db47220cfd262898a98120529cd068b2170d9d4543046ed31293f8cd8534551e453b951530ec51755d299294ba81b2498b7dbcc2424863f87966bc882994064d56272854a4ba5a600f1a325d37b54dc6530809f9fe3a0a07a64c1af067a80e229421e7c85c81ecdf836b5986fd3c7fea3c44a0e82a1f439d8d2daf545e46348007310c887148dcd4890a91a83275627d71d341ac3a957abbdb65a6947b05c156ff525d0876f419764986c74706caf138bee40b6503b10d75ee8a57d26ae4644bdbaa19c0c89a4a77d5bed40fc879a190eb3ffc6e994cd7999910f91806e306116ccb11592ad4770de600381df1d41684b507e23456068faeda0444d8901209d3a2c9514e2f393417c42231fc7d6557c5489d03dd75686a3303b77555f49b089a457eab12b318cd284aeede1d11f6fdee70a9c742785796be4910e91686d9fdb785b60f6b1f9e449a05a1ce2bc3aa723f80c75eb325f542a0fc2029d121f04e8b0d6aa6dab584a515b59ac5afa6b044152f3ab742f74b748430027ac017dc73ef2874abd48a5a1b51fca108d412c334740deb8db41caec129b39343d5ccf5e539a7cc335a23dee54fc3d7b8f62e414483aa62f516ae045bd3145b67e977be0390105dd025427802adac5172c8b355eb03beb13ef0f1b0e7ab44cb06703d8a0250ffce0a5d889b071f588845235d6030ea13c0098751e7662f8de215269d67170bcf69706a682b6c026d2ce8bbad40ef38b04e983f3001862966598c2e25194d85b36e747802efc6bc8478ec8cb6e703f792f9d509b7dd8747ad7b869fcc7e21bbd7d2288e2e3745f8325841376bd4f814b4882258f08db6e4764428572d676e2b32938438e6b35901f2a181fb3a0526653d66c5c20d350b9eddace61a4aa3aadcc5bdb4e02f248f910333a4e0133fed50bd5cbd802d99a1ffdad55ae88144d2730f5fec85d1d303ec51500c2cfd234fdbc4bf9240b69eac3c212b91ea67a5b6b674f6e1a4401864831376ab7a1b83b014c62a4ef6bc577257038e482171619272032074f7a5c08db22efe7ebc1420599bdf72afa4434bee6836f05c1372ac55dde35854ac603edd6a9920add3a7e138cd470e1901009a82b29f68fe7b13211ce0dff95e770bbd711be1f269fdb43a26c3326b9ae9798e63852e4d144925e228a52b5ea001e6e46db5d5083eb098d07f64028ecb73e7b16e728d5a7016d16d70ba521144f599a42b7f4cd2031830724d9f977fa4bf6f12ca3c336faaeae30d2c50f527ae7331e6895de3973d6b2e151963e46ca8ff5bdb77152aa3a86453968d37b4cf94b7a75a175c37aba1350194009681c29d64e876e8c00a86c45d3f1fac464ab2bf01ca548236ae4a6fb552431d06ade0f1a2256fa422e8ee8e39b83459512dfd86cf70736390cacec5c57cdd19188f2cb6baa497d2f7b6936c4b024bdc8d4ed843af615b7c6c7176ba6377e715b0d5fc39ff3332e2adc58acd865028258add8f5c4a5cc0b3f777c98e301bf2330cd46589ad8cfd5ba3fd90d47d4b39e33c5519c52e4a827d1a823addbed87f2dbfecbb57d15011f4bb6ab1b4114bfd483ff28ebb922e5fb79ef1d242d3fe3d4bc5e7605536b10911362672554da71d772653750d841e1b1f366fddb7a3d0e18b2511c692d06671f60383f2c2819097f721cb6f6440a18d36cdf4ede40b5be2e57b6465ce6d0ffbc53ca579e433f1397dfec7ab6c8fbf6cbfd575006b6aa42381972d926d317224bba97de7b4fc4a11084a1be9bd7abb1e76e58bd84ebb02c9ab2c520c2e11f88004dc73d4c3bf6fdf3f15451eada6e38673a100eb93e6a86a255cf9fb00118871f9671eeda5f3952afda3570657c0c48bf835793a6f2bb1372c7598da22fd8d3830f5ae341dd11621106f2f72eefd903fb3c11995df07004251261bfe467a96c8058e8d52a63431a4c971d6f620cd4d4a26df2c949da72b16fb21fed4bfe335b981f17b18b779c63e7d774375d207530a635d81c3a88c89f28c92776a5468255d9b904eb57e881b882101da53e63cd786e9978b29157e0ccc1eb04002348640288562202adc22486d36000263e1f5adfb0a3c9f9810ba85fb5ad414446808c3c08b813b313d70fdfc2a5d4a94eb929940fc233e10a84fad0ae0881a0ad0c88fae762c04a07cfc67b48774ee9884e8a513bb7ddeb30d7c5b830363a021980ae6336f187b4800af9382568c694f91b595b681e3538912784921cfd70430f3e827d9539288e8b1aeb11cd8c6fdc5bac568808d3c44e5fc812d890488516743d09ec05828c65033616950f8336d485bda39f558b9b2d127829f212427f23a185ce28bff376fc3eaecd498b35a367752010743bf876f152dca87a63a3264ae28694a9ba3c3f24aa6028af0095822acbcaf3c2a871e0492849bd11b8651f4971876017b428b35c795a41322674ff56e788fe29857fb3d5205b54623777c96ef858bbbf81dafa4f89142020f20e444b4527ff901f5ed6d7de438e1f23480c9c89d2d431d1c99e045b28a4f3839b5fb3b9e62f85a8f741f69549acb07df9b1a5d9b39de3ded30b763e6bc173bede760976031d96fb95bc340505a8bff47288800597987ef61755e4413053ca0f553a4e30a4ce5da09390e4135ebf4f991b091fce9a74f8aaa04ff038dcef3e104203fd636c4399e8b0c1820ac082453b3972b2f1465eef753c5dcf6c1decd7299051b540f5a12b7727ec53dcd065351ba042205c9d3cb9481274536a8cdee082e4308daae03e27c95c8812cbee6c5400d6f7a1787df579b94040811fca1149c0395db323901ff96c2bce88393699abe54127435b2373b5bd5c035726aa13a08d9dd8ef4094a5a0934aab8875ab95a8c604df15c729d0ea30143ccb3a11774501162f909a2afe98f3f27001b05356bc667392875493c3bd0bdd220121357555b8d5ac245135872157b5c30298341e8b1d9430d35de420e54652e24899e54fbee4c3114f8bf5fbb178a0078e18206a4fff3ba7e60910a36285a2fee82fb0a391388a1726159ae0c778415026096d41a9d486f3b51b4bd5a39c735f7f992ce2d07aafca0d14f391a5305c66c1d726c84b44398defabe98a19e4a0436446c60fdf3123827cabcec5255a625c4fcefc22468aab3f99431ff8a7c2614f2f15754c6e87343c50d45ca4726c0b93351f0881573e626ee049520d11489308365ba03a8c8cea64e9590dc43d029c2b46269f37908e74a377945b28b5887d5eeb98e3aab910dec176d4ac444de02d496eecfcf9db62a468498eee52fe3953a245449f72d06f7109d10b266854c3c6025aa039522093f6e5351978f8fb253bf38a40b1490dff55a5f8728c7bb719b5e7d48820a51b6c70a78a502c0deb8343d2801701a046cef2994150a29080280a2cc25ecd81e30a8561ea94908e239b9a3cbc7180bda6f14e5b6dcbad1f06869413ac42fc6de3ab6a8bc5744c4afb2efd7aafcb4bb69b711e7209dd2f20429704e84e03f21c8e96e2b5e555e19961d6ab8c06842746d37884cde4975e78fedd6b80d827afc7878cc48c46817ea027f840a22be9207094b4d994473b9aeb6f7edc60d5a7a40a180bf023dfaa40563a928c9f18f6931d69c598316aa24313abd4380066408f1ba8745ee8784bc53cf0d664d1cca5ceccd8ea49e7b4150d6de43ecbef1906678103bc49de227660b0a8db85488199ea9d0403bcc49d08b6e84837a1615e9840d0495feca4580b3696eeeb5ca7cc4bf587f73528375c0cc5d286ef2f28d8bd3a55b75ebc94e7f43c0c869e7bd7174c520cdd15a2dbf532127f35308cca0750642d7af0f6e9e617b3a7362e6066012f47fecc1e2994488ad8f22913ef128779208e75cbd38ba345d96bba00eb7e653605294892a5cf43c8bd3f94e2fdda53906c2d47bf16eafceed231a3b21444bc7d283477e639073f749e83eda0ce801603231a40c3b464d09e3db133acc8e9a34a5ef17a2951d9b9f71a6b3701df6f6266b3e8b0e189a487c764ac3fd092a893e1f7f10ea2815c173bd4454e9a26fbf58192d0b81878d1405077496e9b96521ac8e67bfbb51530054759ec92265431c95ee853954c838297a57a0ec42ba7a4185a76999f878414c41fc93ed2cc3a1e68de5922555bee6144324ec2c2c799011aa4616e584bc9a9d88fffa756a7705abcd63391a301f36d5d5c10c952984f6cd86b19973687c3563ccd7ef788c944f6a40e9f3e4a4f2edb670d1dacde5f20cbda0242b235ac76b3b02293e6c4db569d950264ca70aa8a77c06f821319aff649e24d88e27114cb93225b2bfe8d3bd13e6e2c30405ba11954f180453e2256b00c35b0d0c20d7905500d9097830500ae064cac975d38f245154642e967bf9c6200b1e407a089b149f5159585efcd5f4fb72e5d683a6ee7bc04c6f7ec9caea90a0054c5d0058a82555e159321ae5a1adfe153df817958fdbb083187c63c1b82340c62225a0ef86b047eb1f07aafbfc1d858620e94627c17accc9fde5af8b910c8439f9eeccfd21c7095751d9e33981b5642987b88d41133d0dd9bc21fca2d313eb2b4b6a8f04450a9e3fd2a83117eb2010519fda9dbf3c185d2e3335627edb45b8e8f28dd83640247068a6b18ac25779fab17ea971d808e33472613186eccb135050690018a04b057445e2dd794d33077af0f2621b1772810d96724eb098996c8191f5d0ffbb0a31a7b15da2a33b092b36635d69846bd61eabf22c61d1d8eeb7a5f15002b865b731a35aaa1b6cf241527d46a9c490b3317c7a294822f1e924dc4c647f731be6485731429b4233344e9c6b1cf6a69779e66d8f60ceb850b78f3bc790d8f8114708346e2aa120e255649f29cc269116e1375b6e48a319a088af6f31e599756946d8b0102a003f74a3e14f128cd02bfaf13c444b9c4f685396b255e86cd23810f889e623490023528600f9f2f74f8a835b9d3e2179d6b5fefe02464e355666670af8dc675f7e3a6ca29d05dea2b009bc38ecedb66bc93c43aa2e69ff976beecd38e7acc55a8f463e5631e5938f3020330f107c0d2de7b01356b9f1d80f1b0852f701b4ce5f232408e23ae9360b8f85d86726552097ee3ace3ad3aa3421cd9df52bff1c696b9479f12ea754bf33f409bf037d57aa38ddd1b16abd7ab913331f75eee08003ea0cfeec33ea7fcba8688ad8151a3ac02c00c5bafec567b855412a122837939588be6424822df1f04225afc2b639b28d1f89e3b6b07a0109c1a6ba8598d356e0ec968a0d574bc482cbd66a297153f2e6ad3b1f3cc65ceafac751a6dcae8d8a4a8dc0a3e5925ed746ce6dcfcf684c294096d368524f184361a6e95e0301195a5a71456e3b848c5dede317e6078165b2414b68d8eb22b7c111c7a7057d20389ac240fad8d0001ec8952c4956b2cd016eb703b676a0e21c7e44e0bbff2259e5429b0574e00c552c7ebbab29ae2d8d0306e244e3bc43c017162cbc97151ade38e7dfc78470ccb8ec42876d332da992e76a2c6eb4cd971a8ed8b636b350bf10f5fbbd911d7f011a8319ab22c046f9129c6541144860326b3b50bbd6fecfda1617ab722f927167b030581d0275dfa11099c4fecb3f4356232d425c21719c2420ee38111ba73f4804617a088e541d8defa06d84cc333740323ec646bd4973cb23238d9716ea86d71e3904e62c92771388cd802fcddb1debba247e639bc544c70fed6203480c2425cc8ea3c3ddba953ea03a07fa366425a7544c0565ae81ea498a4c76a1357e5e5c86977dd90b677ade103642e3a57bdfb57ef5b19ce9be912d0dfde0cea3902b85582c3445e29999fddd01de3d6d34995d5e29c6236080c5dca47d8f9a51d0d06cdc47df19a1ac3bb8b5c934e7265724b87794bc931e52bc94786ae37aa47da2e429c5b12f55f345aee7c5df8cdc33d7b20a6e4514e77f9583c96c8c006653956d38b75078a0be50a88db3ea6b3360a58ca7d433240f7cd883fc50d8fad506670c27d94483aa05c5fe379adfaac8aef29d83fc0fd22aa2f7c7d3dbb89575974d1713706ce11d9c657af7d9bacb8f96c4455cfd9c42d2fdd6316ace805c2b8753063967e8479c2fa78ce599af06be720179692b20edc66b85c6bbc12bcb87e04ccf3c93c1fbaf9d87a7a9f1f77598e25c3ef3a00ecc36029d0ea683aa70a2bb31ac565149b0c25b3be9344185bef4e5db17c2adb40a018e742b74b1b7ec37c5c17dbe00fa480d8e84c8a31cd90615e178b6287c1c713a76356772ade306c1690242866002e7bcc41a2c3f3ce69ca8eedb859ee8f6835df0507c88b2de1f452cdb26378e0b87d54e783fdbcf0486e77ec0c5150d8d7715ce8efb799836f30c7093cc9c2ee2952fc25adf06f9552655d0d5051e67a2419683a5f88e2f08e09d6f6542e90e5b34e80bbbaccdc9b8c183ce5170f557969637c819e82e725227aa7f7b1df11d4b1d4dd4a546fe25c04abf3ee010e2fc0f4c9cba69e24fb7e37fa1a432985d4fdbe81df4fd78a7fd6183d5ba76fb75a199e889270d305c6323a2d9553e621d9d30d00126be544287d0e5a3a3e429e573d4ffcefff6b8af9155b6f897ac6ea8df453fb0ee575c49133aaa780ec3f45f5a6521582ee27750b889dd2af23860fafba1ffb3388b8aaa043c086508e78af4815beee0919d978a1b01bee1074e1306eb84722daa899820368aed956806a1c44e080c44c652077f4ad590fc63eea83ad8e7f494c81000ebb9d9a714ee48a8ba78b29c1078bbdfb192190e56e30b499f0cc92794926addbd916adf61ff385d85a57f14176d823d63f8825cc2d521872f8e58ec00c2fb0304e7aa4ceba7746941c082de3f97a02307b7af2dd5ad365bd8c31bb3f4e61dc88c01074a24ea705c44eb6916db8b60bafbeb23624d6ff9c10fa4101a066d2c6be7578ad53bb7580993a6bffac6405efbd686092e4f83770ec4cc9e60428c062cd463a0c58c92b62cb09aae38ce4585028ba6352046e41badc232aad92dad3cd8a53893f79fda7afed48c3bcbcf93a03661f828af42f8374929a4e7f47ae1df8fd0f19c19320cbc57e64d56b4195faa0fd04365f053544d271432368df2b8ca73983e6d95e931797df8a43059e4f060c88e847e170889d00459a45bb08a6e4371020099e67a383caea7eaf1a2db1542c4504545d12b3cf05402e94689f7eac67c53c6f99949abf1c759fdb9a4e69bed3f887402c8377bf199bde497a1d045f5d69266da35ae5784abe2dd3b1298c83fed08c3b5dda4e79cd4a962b7cce29597ccd46df600e48960ca3f92952603562604b257f4aaf14bc7ea91d7c676dcc6fbfd96a484568f7203b7b74833b91656cc28966ca1cf1ab67a5dc80f0d31336ca3b8ff2743ab32ac9272d3d265c771b87088d53211c97149c3adf1c9049aaee723fc6feafc6ecd3ee77eca2a495bc72ec4d16d45daabf0c4c4bb61ca2ae1d4e326b1a142d1c61c957bf4a43043b424b5dd4c6dc3ad49c9091a9b365bd83826620527cf22d1e327bc9153cc4bdae19918414983245259129372fbef5b06dc568a2b467db404fb864e938518f18211cd887877148dd7a2acdce113b6d0f2a42765721527f3ddf6874b5410b8e9f72de9abc82bbac7dd10e5e459cf26c60debf6f3530d588ea61c64038a871b9bb509c6216cf62bb1bc494a1cb09ad466e3e63e552e8977850eda4309a6740aaab75f2f15714c9eab16f747ff6df0b01577bc8bdb1a539ef84a5803e3227765266f72023ca2e4c3da90abd802eb7111fdc101e8a81c11908b87a946bfed9eba9a60f75b43466ce6a7d116ed8b1d542cc1c37e827d7db0db527205dfaab7bbc2f3b6b148d2d0ca1b1ba6d3d85ce94b4931e90d6194cdd9f4ade73d058d2380b7ffb27d3ee57e8079edb992fa62680e708a4a0482edfa2049616209b2b4ff15797fed4ad0e6c2c983d4864497949158e79a81e09da069c7c9636cbfc5d2483c2ef6e953a210bd1a170d9356e39a95f253d189836b362fdf5c301721fad08ac153a3d92beff79b9a4c06989baf5be356724e6830e681ad2284e5d4411d72a7f9cc5e15e2d75dd018230e8d82e40f20fedcd8785cdd781a4ed75e3bc2e993db22fffce08ef70bf16f8ec0b7afeb1c46adb8a1080b7e4c03631f9ae615fab9031fc88debe854438f67933d1fe88d333c598948a99bb9cb586d24ce474fe86ca4fc57c1a80ce03b546c87ec62a1fec558f022389877a7d34fa4a261fd25ee4a0990892b9c354187d0109e5eaf92b5741cd65592ccbea04e3794aaca690736870973accd8c534d49ed75bc46439fb7e4602b2403a734757d27665306481020d58b7c819f8ad825a253fc0e49c9fc0b612f726f4da2e51c15ef7474deb09e924599329e88e207955b354d863bcb5140cfa6fe5af2b06c01c6cf982fcbaf7f586e8d8d46ab98c80fc9d2b52bf787eeac8784e0327d8fa77d0a386e4980ad791bdfb122c0c59f71cd8426db6b3335aef860ca2be42a3cd90fbce7beabd9063e1630662a8d9088533baf42151055cb83c4f5d12cce56d8384cff456d7ea63f64fa3a1b5cb58036aedcc398220c052d65a6252c08e19a38eb23fafc6536d1ede5cad497523ed3edb5265ae6e53bebd7fb20fb6e156f61dd012d154e7139788636f66495dee764a87cdc9c9e3120d5884a77de58fba58ed99a90b070266106b91d0d1a4d0297dca1f6ac3f0d33e4ff6567c6594300c8aaddfa2d58cc980a2c2c9cf12fe72abc3acbd8adffc25140e4567ec0ecec838996ec4140f898f52d7a5aefd66e89f985a855ab017c244aa5bcc6a5226e94364c896cc9955d96a7cbe99a2951b33aa252823e8d57b04a9b489fd9ef6088070228efd3dd977ac14c9b4928275fed29f8fa7d9c8f784ad51004c8b9bfd09cf587dd8adbfbc1e92a12d222721a00857a0429753f9fe5076d97176df353c2dc5dbc2ec8b9284fcdfad60c8711666a5ae10f8d1873eb89ffe9dad6b5a929e90f737e9e8874253c808b8eb2de9ce47b197a73dd1f0bca4c8d4e885896de299b1bf36d6081911c9ac429433435d1c871e6e47192e70d5bb5dba5c6f7d83808f822a11d3ded8276145b6194e70ee10536eacfe97b487d2b52558e869ff54450876202808368ee678b1fac2060c478814cfe618fa1f73dc82ed9cf230788bc89b7c24dc2e5825611f3a8d7f618755450269985826b708962e27c005d18ca6f2a9bb8672f096c4a2490b04db8df5a238d40509c87af3bd0ccaec09cf89b3173ce36adef807a03e554443acf489414ffba188f6382ca7d5ab48e5bb656b15aca3afd9cacd009f41df76753de6bfed22d75578f29e67285c1ef7ce09115b08585306da738cb5770773c67882561df3db7d212a3e73e6198cd66487717efa5e2639d12a629b700a7fe8a7b8fb90dfe65349a370753fec8380812ade68a4b63793fadd5463015e903e8fea4944fab746500bed92ff3932d3ae8e85058aceb84c8a97a42fd2168bcc80c00ddf8371d8482ac06b9316ac48ce43585984eb5b2dee43b548822d286de5a182555ebcd3adae9079cb75c61a70cf45ebc1126917ee49f5798255a3c81de4c37e6186acf435d5f72c046b0312a5d635d5db0347c75bac690eddec164e616109bfc4aaefc2d28671a1db2d8d86ef4a11afdbadc9109717427d2dd0e7e2dd42f547ac907c6fe0e8757178e76651112a43b982ab59d8e576e908865d96d684e3576dd9f51d5c2a52c059f68a4673481dff0c178ab5430f53f54bec29a28b2fa5fb9e9cd9caf70a0b5fd57394337732a9aea2afc2f8ad3fc04dce0f5fff132563340ef66663ed25b9eab1087f374539292f25beeb6188f00bc7336164fd947d13f026fccc4509f3f169d96b0bae15c01866b1b9602a81703c1f2996ef77f06d327eb60b691863b2d2cfdd3c6f187da58f2da9066c7abf80d7352f36c86731a450ff16714f3352e00ec4cfae7dc2cd986b0fa1a3b513842eb966adf04b263f53ae5782e2848bcb105b0c8cac0e38a95daedb1506eee766c7df991ba9f4c99514e9bf8be0851963c59b79e44d9352526e4ab09823d08a334a0f8946d1b978368f37c72527cdedc1c3b794ad6c79e3a014d3373b297ab70c8f4a2c91bba72731e30cfec3572d80636ca7e13886a1f126c016b7d8c06673ef3dfb4e780189619167809ce9e44ce9bbdb2b19bea5a085430aa4882747f16dc09ebea9939c104fa85e37b7f54ce64fe9465c3aa1360cf1a27ec600db52ec849149ab7df994cdf14bb0c281706ff4c3d64c6151b35744d9b17a433f46c2217001d63334d9bbfe96b1b240b7dea3967127a6f1a2442f72dc0e2396b638d6de3fe2f8a6671ab944527d7cdf663be7971bab26eb2758228e35d617c1cad99e277b0fed090246ef76d328b6302e292316703289029b3c98e9a0a344c3e4782e70e8d4e30c0e336f1e998c937bf126f3005be47bf8feccaab1f3534233e04f5611d347b1dfb50c083e74f06b2b5fdabd2595c8c6b2199d6976f0a25b5cd298799a95d6c088e1b24ec81f076d6dc05d3d62e4f481d506d10f27cd0034cdf5b5c12ffb9acbdfea9d99a178b9f9055015f285c64eb81080e1bbe47ea50ebe1cd3f59cad2fb68b1ae69fef12a828658df945a7912c0181ebef75005316ffbff562ae89cff1a84a85b17d7b3c49b78922eec3f1afb8c07483f5401b8ca179325d63ced5681189e0716a4272ad3fce4e33401cbd365930ebc6cff47eea8c6653d9898339869c4e68a4d7630ef4b95513c3d5c9c1b08a43326fd3e943712b27b6359dd2a97552586757dfffaad4d6c4de584c3ea0f3f929f3fc5444f93c3c8cfc7e610f544ae9408dcb74ade29fc5d43cd8892d6cd38cae11a77092a66bc09e30c0146a787dcc12ed555dc2612aac06fe2c5f2af0fc15914440b6e3c4c25cc6fc8630638d56aafbc1e7571181d293d771079211b752b9f2c9db78648c3018bc7e762938b54b82fe8bbbfb15017cd537beccecc19780b3d81c588d356896a3a7bdd125764355704062fcf34c7e31431117c1e4a6a05f2a80a16225581c9f699ca434448dfbc0d0f95340015f065bef3439744f8953b6f1233fbae87cec2bb5c232b678ceb91c2826ef12a30a403171cb56dccfc32314012f578ab8aa0ce27582bd126ec588aa61fae5725eeb800007127ab135389329ffdef5dc5b510c5fe32945e1385e8c4bf7444f1fe1a9793f7e7bbb1a8807580691b8340a0825ddb94d3abb176a2846e642a631a55ea9a71c35c98002811e05dd76e5934f843a46934c17e82965eb1f4e5cb15e557608cc743d11597d09ceaa4a18b01760c14b81897ee13213eef38fb4710619b0fabfd93fbf1c19c6770b8061b2a94416b0c922a6bf70c739b2746b78bd0bf084e219778134e0a34fb4b088d45f4e5129e0c12785f1f433a265662753088dde01707973bdfece36a343e889923039776adde57a6d5d9fee81762f916e293f396de3a6963c063c5aa36843f0758af37f93426b7bcd75397f698de74c9c690288e0fb7d6c9854d0ab6dfe701dc1fe9fcf0471fc42b4b8e65c3870d5149c96458ad004140b28c9229883a6f8e729a1f5d9029171b585cbc8869f58490ec47e8d405be972ee1c99ac3624981b5c49d5610292624a27e21e926644ae2fd841884e87adccc2fbe77f1929e1c9c9b84e20526a64c44205d40cf172790329d2cc0dac47c37eedc7f56b844f7a6169b94f49a0b09da36919add3659444a001b06eda7e960b3e82a6e32217dc38793f429ad518928ed50823f98dd4ac76aa08bcf3565aeaf90acbd53f0286bfe987810aa40b9baf1835b95ab78219632c700fd785036339803699258cc46513e16537c22198f6c234d5928a62219fee47a438a7899003e0130c578b6e1c6801ec06e707b67900344ae31a8ecab9887d235965de13b461975155b82bff3c76d5547226b4e184d94e23a6a3c8eda47010618b0e42b6fab644a7e6c0f8d2c85ec7f3373270ea64ad037aca3c360fa5450d973b80642a8218d1193e94bb2881d3e9c5f0e18385bd057de607de2f6d82a555eabb82e26e570b79349fa6c30c04a85c5b6fa324aadf5f15bd776696d34e0303038be86d931049eceab6fefc2e372955ede440913bb0c51646bedcc00813b9eccc74e8dc3b12278409b607255a3fae066d57825123d168a06240472880bbb1bf89b824d9640c763f7c12d15f03424ace05adc2232174596916566c1020da00c5b5873c2696a4685236767287b1f0b65e8f99d70ce1294fee50ee81b74f2a216a2ce0c557fd7e24d06d2f0d40092919b29c5d668a8a9e923d03639ad8d39757677325cbb573d4ad8b61a5694e0e3db992d82a800b10ee6c812f8e8ac1fb1cdba787dcf49c549fc59d07fe36a8c8872ce4f6961822668c4d99f8fb25b0aad40f059b346a8c39b9a51c2bfcbc9ea7cc4e118886762ddaddef1334509241b9024bad1bcb846a7a7b35ac6d064b6ae5b358d9862ad3af057353d9be6b29f35ab2a59e9fa9a63559ae7ab8e94d94d9380f22dd9977987045fb28b3159f051b9745db3e82a01819ddc703d18f33ace5748202a8c5194aac65c4a2c44bec5d0ab936d35d1f3fa51143549214f53d4a007fc4a2248e95692b1a713d46dced31aa50b78f60aa2aaae101956600ec1e358aea219344091ba0ce6a3584be1a30421eef6a137fa2bd742f34ac0beff9d030fffe53b8eb2cb58b86b20c101d6dccaf277260fb7a172d38e78c8bb04e7ce67d2e586e9a12d880e6038570043c4a3682a3251ab1fc338035d9486bdf658e951db02c86020dd148c1ed360dc0cb757b4dd642e6dde330ca8fa8f6f15d4385e24e2bdc7d3f7297f64ec8b5eadca586cd8704f000f338abd200efacae500cc8db030c614810932307c94c0efa1fd9336552b6b9477aeffd501add2a45230a5cacc6da4250495d294bd04a5e8b179900e959f540402b92bc968f401cc1b650ac7a8c83f67bf4d7e4eb94cf01e87d2b415e80e5e3803ca1d6d9db9dfacd6f17d81d2c831e9eebaf4accd1254aa4d95766c363d7cc33bd79b8305811dfe7952bd91f30d225daf56844660196906bb2fc2d371d0eeb8ede497e52b47663dae0cc878466ac609198a2dcc5f750e77668f0aa21bc10f083af750e3f63d8618ac8722727a97c4d826bedf33250f6d45b4d6d5f90af78fc96f03dd71d67b5941a2956300d29ba913357a1a180dd0a223365a5ceb1e7b14be95e7a4869c5b05b2159b879dadd4e14201833dd35adf49bbd236913eeaaba8463dfd2816886aa3b70de326b5e5914c87c8e29987ed57e2dd1df59f776cec2c8802327f8197d6b129edf9109504423f5d8516fa9fe002e47292500a3010822db2d956c004205e7f7cfb54d01ff9a21766d3ad6f3144a370923ea2fd6d99c01e2f9d7bd33bf97ebf594595b93b14afd805b0b5ab0bf73d62d3018206b7bbee56bf84ea6f776cd814f55bb66be45d1861481d50c554588a64dc8229bf0747d4b99f74bc710962a5ddaec2ef51632a647ca8d882e9f11443c83e317fee3edad0e55f50028dbe33e3ddfbe0c882cf5293658f61e8994a48d709ded31f8b99a962e8372254b4679e2a1bdd942ccbc7e28309f9bae1e1f6f1ce81f174a1a78fe973443cdd5ee38c4a0a23b1d836a02a61d0e9e24333d28d9f3ee25546c20da344a4f072abb136a01623caf42e8382d400407d184385069d193c5522c6fde8ca019c50974ee2a334630396e55da1ca65f21a7dfd990a9b9fa0680a0e115f4962f2e3ef986e7a56fcfca3396923df2c2cee53d6c0d6b9ce1d9314fd3a267e398e771f611e6d539af7b189fdcaf19fbbabc1190a33722cf7dc3c1948830bead3a4930a9a434dc297ae0bdd777c66caa069a32a945ea667a5005150016f49dc90658084d6f1f20b1dee63b0f0e7590457eb1a30f0a8de0ad0f1b9b7f0cdab78d42da54c141eb3de7d1c1653f575e12472d57592b2fcbdf121580ce63bc2900e132d99ad6c71e18d999c085b63002220c514f90e5da3c492ef4e3381e7a444f7b6e4f4e922ed079c43c4c8a3ad5756785e202737568d708b82d4840da7bd1114fdfc6d53ee0ce89a8529bbf909cafca8c187b6126a93727e48a2162ce9eec2ab61106eedc5518480373899df3039ca41ebc30aee9c5f9d1ffacbace52ef04f1361e50d57f17faea87ca9513ce1f4a435b700404e57a90cb0059e5289ccec20898d3261c0683b1ae1ec3020a94f08f1c5c5d54d4ee4905d21c7d72473ff0febaf78fffc2a4a6be391bed9db0f13aec0663e0343a980eeb5f2dbd867c75680c752adaaf196ed34d44d166a149cec1bd8d84384ccdd3ad4888724172741eba9c065b243b4237e690aaaf48e0899280347151f04965c8b167cac73069caf06b4e7172f6241c03b8153db3866894a25cb04a618c0d99067c5dccc4772d36ee723bdb90d2cad18cc1d987e850074c8e0e6d7c46665d8f69a30d26ef52a22fc23eda4a4dce3eb2f4a7d8c3ae6be21ae99b07baa640976cced28d76b6f6f604f2568767a92d15c7608592255f93b48605f88908d352ada9ced26de4f076164b84f0b819a5909f2446244febca2338bcb138dd74cf03ee6cd36a8c825e58c34053360758821b7e54205044d9781c5a313d5c9ff8a99b6c23a8e864008c62f94003b84f83093d7ad61327e9e8923178cf94406313244ddd243691248eedd3696a863e621a424ff60c21a45ecadd85e4a21b8bffa4ede659e0edbf1291b6b96cd535b37b6c8d96b3bf2d3b2252a156723577a4513c0d2fb96747a45f292055d73f3ca4b1ab59362bdfd300586d04f6300c4993f2bd283418cd8676c3c4f245b8a30812ab7ebe1b69301bfeeb5b001dfdc85d21a9e442ca26370a00d702cfe5de72f66e8597f04b1f00052537313f061e64573c5e11587fd311f1e08c4cbc9c85de53e2fbb9a071acf3371f824e8c70c2205206ddcac5325908a28c5ee60e3bb83917d2371dd11f1ca489df23f1cd87ee18e96a53a1c6d110de2a1cd4c6a474686bccb7ddb2fdad8607a70db18e8a7dba5e2f33ddc8070053e8891367a633de253d7a51499831a23a84d718446b0358e9b78583908c5f17fb91992b767bd88b15a477a033fe86d9806f4e8d2ad1c3dc054fbdf2cfb1c759ea4f21a112e1243bfad70df67802ebd8c51d9a92d63c0b51dff22df5ee0f69596cc9edac72ba48bd2321600701fe0a6ae1d939055bb9ef838bec90e9f39f7f44efb2a7f2f4970438feac5bf59a190085731a007ef890a0019ca0d831dd25e6bad0b72555b4ca79e430ff7c664f244404fd80a77b5203e6cc9895b35b6e8e2127c00eaff6d24f23def5b362804abc19f2e65b5800ee0b0190ede16131cca1926de5a6c940ce7b4d96b8cd40b40b0cded027c831c75e13dd6e1c14549406d62e68b3a45f8834dd05f55a897cf1e1d8c6773d383ca7e4c3a12771e25722dfe267cdf451a61ea7264c141b8f25921e85f38a58a8e9971d79a0e3deef3f576ef1437e3de1d298009e46a6cb9ada20413b7f361cb02bf2b99239751b0976e270ee6fdc8d666d2e317d9d3d3954ae0da00ba8b34aac3c5dc6e63cf0fded06defbcddc977fee0aaf08c1be17ced25320a5195d2debf1874e578719e507bde55e80b10de134152be5d043340e438f82342536338dfd523e0c6f818acaa7dd08df33d0d82fd9048f6ac89be68458db31437c3536c328be6df6c217480390b15faa95b2c65795a669f473d77ff57e74b7ba209924d03195829e133d67251547ce28a2cf2f3922de600f0aedaafee260156f4032941f1543283d3263817bccb00956bb3d15d9f57c4484193f440d3d9f37862d0d526d2741f991d843ee956ba968208ec85ab26b78c63f00aa96fb2321216624f0b89b9e169f9661b4884b6af3aee379173531b94dba6765c067bde676f0bdee6350399cd0c230a159ab09947946d733034db908e44fabe994938f1d6db46f8d639a9e4133f15dc847d4ecad47ae6b6c126b6685bcde90829935714b6178d070bada3b02814a6ee9b348da111ebaf63fa699ac12ea23c69d97256203750ebeb3e0090f991424fa991450cea2beafa835ad6a4e22e67acb12ecf106c092eb74902158c7a71de846e0efc9fbde6b4b39c0d50441610725722a9887f487fca4c2321afe44654207d9e399669c5ddeba62690c1b929eaca09b5f1f08e83c79c99923f2b492306542ba3ab43507d420d8db73108ac6863a4efb079fdbe18b4e74418f63c7b1a2d862ec30f6d0630fb9a41f57c1bc85b41656e001e7844a79369648a5454b21ff33c100cca65092361e520f102f2050718d21be4de5331430380b112af1d2bb24f21ec7010f6142b4cbbe7169430412764fdf612a8b59e0a8c72917d9f0ee822f352f0dc5fc672f12deb38845c18d20764a7c51f9ce1e18468f746c725c3fdfdc8a225a2f277ec7298fb580697925056af9b4d4f708bfa9eedc9055ca4a51057f3086d75765a6595eabb383dbdfe998024fbfe095ba9bc4ca3b4037129fe60edd963f7935ee7721411f1788c606cd6b066a56360c9ce6ea2490410c48d51736d2576ee50c258fe14e9d49f799cbcfd2225c67b5d1634fbd15df26607cfcb71423c7685a0f7db57603402048cf598f4c9165f679646e0233922fd74737378a4c6d736f006920905a978d473f2153569dfdcdf905fe4fd1bb5b3b02d40b44e09be9e878e8467527879da2fac26a98f9d0f26ec266566eaefa42595f0c7b86828832d82c60474c66c1045fd3bc0212db5e3df43e890e908f1da53097ee065888b8a08fe472704fb18ac90171953dd643fa4a3e7c3d51e2442d680fb7440983e7079e8ed8d64d09f60279adcbd2af1bd03bef48e693f3e8d7e2bb0ac4ce943c5f790a3dcf815890a22630691ac1e0b9b40bd1b1e76c1785ff8cff9cf44dbab8ae558074f1847089dfe9547c82cfcc9ad7bcf077d9cbeb90a116b88ca4fbb52f498f216383c1e63a610a75c5e24a14cfcc3fdcb7f4910259fec68cee22502c544c6b000ee74438fa0a7411d9cbeb9b538e9985c782ea1f818fcc45d29608984f813c70f5e2671c67f4e36985f6e9cf468106da9b76bd1f24d0d2ee37fa95f5247c26b5768824902db498639ab19d9df2b8ad607541a21bba1f524fe3bba5695efd660c5b609925a754bea7fc73c518405038284840a050ff0cba34fb2c24af3dcc9721c5d9c61968bd198bad0d187e860187b5386a63004091d981a8233f51fdeb7711c210a6aff558908ff42773700723aeaa106b655d606bf30d705a31177df3c2f6d0ee4642076760d607ba85af5a4907b0fb69e969d2f44d07b91f7992d35444d2b01cd85ae428746f4817b7b4de579abfc56751e31c4c7ab20c22c9a368acf60083c0c6ea3a0f089b1e4753d64986c053df10be602501683c8cab212d9235f92fbe89597006025350f2a07166a5858467e620a3bcb24b3f64093a3e684a58d86294b9c8dfda818528b37676f5d06e924f221096b4ef7f458dac38b27edaf11b067b0303ec9a21a072f152be950acbf22548b7de16a7f64cdd58269f3b4dc2ae0a09c66a691986b350fb691d74764bbd8b73248e24a905a9a7d0107bcf88beb268f27c90045b7c20bb4a0ceef1547b3337215a842d5b16d1ccac8687d91fd32417db123d666ca18ecd10ff917423452657eb61c4818d584a8f586b97064250978545eb59374c3332a770cbedce98ba5d300b509474e851f3e34442bd9382c93c0da7f858b028a2d460f98dfc57f25cfd04adbe25bf1f50ef03038e62f7e0cced4bc065e1e12e04454f7484ab804194fee5d584fe85d805d061036d1d1a658f4ac8d1146aa8e3863addd5a4ee845a81aa8eabe173eddc4f8d3087edac1e27c955db6d6b83a75b925081d3b84066f98047fa950e60766cc820a7d3ecc962f5d29d8e1a27b8af30447b0e950f96efbb5103401baab9f1a1694ffd624a801463dd078424705dd921fd611101a9622a6aba8845e2db826c006bfc0f0172e89f1155adf689ccd1a720984f2ec027f269c83579cf84db9e140a8659bf5622ea7cf43c31075f322fd2d08d113741c22f54f11409ee83d038adc612cf8d0e366a269bce9cc1c4fc81951501d96144d6ad47a79ce9b30655d43fb59b545ab6a7fc852f21a23f714422d483624eff6e1d84573a496b937c2ae754b7a38299d868daa639856c2a79635113eb0cf7037a957d4785c030f88115b142423c761da45d8bb7317fb30d380d3d5f80ef4708d4f678053d961af954a17636b5595f974e13591937c14884c4c093a205818a627848053f1790af7b554a68fdad69993efaa4a1883c5fc0d56b13fde802fc17af057b38436da6ed6825bbffcc4598424e186f3bb93e258f9b796f43d73f06abaed3a2ecc0ca2487bcc2e463a9a7dc6218f9322b9d98851652217c57f32002d5a89db02d2b7794daf23676c62633c7d9400e0e7685a3612c91b8e5ba421a6f2d457bb563b78db5901e82234db1fb4932f1d599512c9d23ddc29de9ff6afde32bf907d41a631afbc1918ee22759d0acd4a54e70d0bade33420fc421a42678975c2679243b1beb15224284b9d85884327c22d89f3bd5b0bacc4009bb6a72567b9dc0e768150717bd9f58747904572703985f0412d15c3bc2151784a0cdab525cc010eda4e7a6f81dd9e951aee9db515e4d929a19154f0ccda9f622829f45817bf634b038ef0bb59b73e658e00a3907fec6a01dba7f5e1f896a401922b48a21a1e18323ab288968dce38c82fc61f9bb7f8261fd0321c499f77ec8d197768175d85257193e60545770b2e7d3130ed19d7f7cb3ac1ce9187ec0751b2d59fe422da8d88b66f910b4e28784f901a21118efd50d74a981c288e98fe1dce0949d0443570d371183db92355e7ca786a98af02eab6002d6978f3024596b13eb40e55e4453e81e17273bb6b7e50c60c3a6bee3c18d2bd11e7dbf5b37416ca8e6cdfc839d66e56ca58c81b5d018007d54073ade87b9d9245d870e196e1fd4895736379554810ad46cb04e9dff2bc98521ae505cc8168d16e19be914e24d0a40d5694e4973580bcbfc8377235a24bff4863ad19e27fb7f02f1cec87ca7980da3ae3b205bda81879e844881844070e289b2f86f531db524b491869fd3e4e709fb12786d7758c2cf87355e160fe79082337cc6a1a8d04d4c6576f2204c88a97def892bdf27aeb0d02968f5d494fb700614a5275372d96fca559de5f9e38dd0bb61d41988df5b54d9cd380967c8d50329ef0a29c81754aded0ba7d3262b2db96895e1ef87ce0c158ec6967cb52d106d9dd7710a2db9166d6a02a6f9928bfd096acff13bb4903574b5279895652dd5c886fdb352616b6d0fb900d211b53b57f409eb0460892fca7515e35719d8364215f9a87a7c8a7fc392ff273865f3453dde8b76fe7eaa2a98290a4878e51fdc5e7af4930b8750ade66460df39780b2fcd85ea8bfab2efdc6105950cee1c3dbefcb92c334cf629f44528edefd8ce6419fef2cbb77ace646cc86a68a0321a7c41deb5ae3b3aa2a2430e393bec9c1706ea93a3d78fb77ff1ba61e2f7abf0027e53a07447832b2f92af09d5c1cd79f754e491c14dce0466ba8e63e9382b84ed4bc08512e6f3e5113035f37ecbdb781a256f481167d812bcb0b53a094865116f6e1410b281fafb81f634e504e43dcf3edbc7d9511720a07228dae247026e8b4893041a0487e2365d19960f3724ca6e88d99f0737e3870c31d587f70f5d170036f3d3cf79da08eff68d07f51b5742a73cc1620d84793d2d5d55798e689fc488d542c4542b7149e78a221f5b89e1117b16c04b99558b48a88bfe131321d3840b1bb813c516eb6b53f3f16b35a95e9276859e849b15c30867a93ac4702168c3d6644578ad8fd1592e7738acf5af2e867d08823897b69599714f97c7dd62c16430977726888cbdd830d07c630d57024cd128e194298919b945ae9ce313b52ff476b7436bdc76f276e4391519c6c17b60ecbd9c881257efe632538d5a57b05e02fd74a2345e1f3ca4ac845fb66642914feefcd8e3407bc8869fe5163d4dcb1f7d506750af4c316b6b50305cb86871616df62d488cb8b3f53ada0df1350bfeb1bd2471b674d0e976961c1cdb354a0410c32d95674c9c8c298db3251db3d93cf9641516f62e2ec2fcea3e56beac930b932a836842e65ae0e467dc9d0253c9c02a973d9bb251ecb8ee61cbe4cbd23f9eaf7d8ad487609ad901f482180fd3f209ac670cf2439c59d18fbe40d4cbf6945e6c1e807a12229b6bc134800bd0678c705a64d1d6134aff12d56c64588d0bb35d523e9253ed69e04594c52ac3b41898b5ecc59d2ba6025c5577856c6659394523e2ee92d04eed8fc4c1fa6e0df6c7b6a1ffe6d2c7b531374c4a2d3d58c35dc822f7df49aae8fd57c4a1cd7882a1bb1958661d0ced1c308cdcd58b08fa0573a763fc4cba92dc549d55d410c323094f99b356aec2e5277ffc677cbc25371ee3259774e281d0e4a7c16b44a564e3b915688753a11d98e3fee322e2a292d7a8a3cdf73344df15e925b7444c363e14dfdfd10a93c704173756258738e20991680603de2f3ff7fa07f201a5335d506c806001edc178314fc798cb174498053c9d384658d36e173284936241c42dab4672f06880ca1b292975aa66d9c3ed1c283b100957e3bea03629a4957167c20f4c42903d6de55669beace43cd672679cb6e5b45478a851a6b9f1653e7ce50ad33991d9281586bb17bd79cebf71a49e18839e8ce3b353ba21a3799a73ec730659569c86bcb0186d42648c827393ad031270923fd3bab7b72f8b229951deca4b2ed0c2a8108b12a2587bc3e650121d140271deeb067ae9c63cbd9b0ff5394201afe8817e5270d9a9368c45025d49d6438beee91676f3e251d569b5926fb50fee60c5e3b7a0fc5489bd88922afea90f74785414c672285777ed48368fc0094b3205cc645adb2caee23a96ee22bd25e2a79f9980dccc7bbb3832f3a4c37cc6135a2df4f21ae4d26707654612f2e61a33fbb1eaebf7bc0eb9a131b18a6a1bbe54634cef6e21b247c7c6079e764cfc59b734acee7b2560b0e3123558765656500e506784f17fc1913a2c9e03b9f775823e50a129751e132423592716b925b49ab2d81ef37a6787998cf03e9b0543f3c8912894915f30f4a7baf20fe50a7499fddf9dacbb9307b285526eaa3abf1bf66728c5c302afff8cfe59c7d1db0c64d28da6966bd3884acb1199ff9c3db1a2b24141ab27deb91f0b5903cc01abd0d025f0c2ee353c428c10fd49c58b50f44f0ca7204f9d8547895fadae4622c0e5be1b12125e17336704b1659711d6dfc46e7f93ab68d7743d1eaa35dd16d8b7f586648cf479ba03c6376620d049cedeb6128c127796d8653040e1d33b99d6c9efd8ed98947e810279786c07fc35fd0bfee932ae629bf9a93cb39c529b8bce173c55c6ec726d3baa98ef58437d1e13d6855f00fc3aa3776cb2510a9473b19523dda81048c4749d47c0eb9b9b8c8727c368ff4d86f5a82792c96ce44ad00aae1a51485b65bddc70653885679e67a44854d0db83a5964f41ba877da610ea134eda61448000aeebb0e69c9194d7b839f290fcd5ca3d140410f41119086ab97e4e89a13101ecec09ca94de21ba16dd2dd20c523a6b4cfc2355d7c2ba3ce4edb754460c80f01640d8aa6451e4e7f8272c3030f6f656a0e7b7b47b21e92c0d516f705da354dd18489e2441bc4992f3c8b3392f17033cb9e32a9110496763ce0887532b906ec2f7a5b3eede2886815d8813a4a4e57c3fbcdace6c3816b82a3a970c2d6802d7bbbcb2265d634aec12a7b47d063dd0a96869e87c0fa5272f12464f9b5eb5490e81f5848101ed5b88978c00522ac7858ecc7da0cad23b50689064d9f5b8a7ba9e5d9c2452ba5a2b840cda78ab06f60c9f5b029f8aa445beb5c95d969e7d9264572bb33f73fd84feb528b74c7d7a8a24dff90bfd53bea77641034aaf48153eb72227ca7ecde99aef7cb574a26a70865128948c74a9531e19fd1d5f1e3dc68885d29db72db457ad4f7be81d73698a830cc960408f7b51e511cac3c94093e16181c0b6d600e10dd79219a8b429e1cb8145a6c85f351f81d32da75249ece5f8c8e10cbd3a3a059b13e27205aa4927d6f6320ae6d79bf550374d8da385fc5f62c9f301a7464e5e88219b461b3eb539d39bd506d1601154cb04a84d6c0fca9b446d62f008ddec3701ea08dfb9154af69bc5ed4a043e6729522c466faa194fc155959a7cd4581b8c36734fd81ba6417d536774a5df2a51cc649d35dd07d7c856d3d04ca1d34622631fc4294ccb62f7814e4c88cd1504d31b3afad3fa153fffbe1ebdef729725c91bfb372a1c9f5ce20cfde89577d757704f687da2931503f7b10452c084ef043eec85aab528bb8e8b7251f6b95c83105a02c2dd617f702049a339b6958852b2a12c5b6f57f185b800c9b3ee1a36a65b410174d411d4059d69b1d45bd56e814da144d2bd1cf695201eb2c5496989a826e9c4bccb2752c74f44f169dbfc8c7c661b47d00792ec0c15719e7862f348a073e1153cf596cf4952ea1b639ca72d7dedbc2a0854679241d17184a8a6288e418c3a153b60c8508401f4c03b4ad00e400492a909f352cf2f9dd76f7305a7f633a6983e74bfc39cbb989d7252de62d488f583b205148ed275a91f3750507d07de148a4413012bdb4fa8a788022828424d4cd1b213a9ce295a5739d44438e1648b7e382dab2b948f184bec5b53f8054913d6d6f86be914b4e17de556371cc071aa97626e6590b925f3401f012395a0e922b50651a6bc31dc0d1020405cbcf9803407655742381e17cecefd039906d28619494535834fc166dcadaf6cbec4e69aef33bf61108ccb90240b837f02ea403b96197e4c7e9caa78ad203a9f5756d344bbcf653e954a94998bdfff0b1496c4a7145911f08aaf2532a7e9059580c73c0da45d47fdd8d9648a27c5a82691cc7cf258780ce5c7d17ef23b0bf95e904895c5de2993d7b9178ce37ceb69ce721293b7a4c7364ea1eb29374999de812d0c9f513d9b4b76b57f843da27ff201b126eaf300f766f8967482e318365e0ab01ba2a853075ae707e786c968b24858499977968f3a53e13403029e7e09b79e36dd80c3cd9e49c75a44d6205f30569c7eef0f54cc5c672611481e0b0c407506715d7848ba3023ed4939f24362581965a1a40feb918109824c16d1b8d6336ca777ea2ce5af71a6f45448861563edc8b37479e6cc3bd75e1df3008165d7ceef3e46acdfeab407a67c386ec220057d08747ccf6e19c1e00f30b521f02b0f6484e7c609e691d1d72385bfcff551bce4ee1b6bd13611611f61d070e51e497cb8c0ab3a86e5cf40d615f3b98ff68e1d6570b2cf241f9548d1920c0b0b96fbca9933c95a699821ff24f7e69dd2346a3544b717094bec1a48ce8686f7b9894dca2476f02898c61501e5fef7e262a1f61ce35211402dd36c7433ad1c431530fb80418cbb7bb52c4ecf96f35dddb08ad5e76cca517b3b3d4cd0603a5a456f794ad16e4f5a5c3ad24c275cb21ea40ebb8085a0477ac0e72bd8b9ee623e748e550e026c5ed67dfd2d25f1e95a7f079b0535c3ddee9f68dd13794e20ffe8c0aadd67a33b0e919f04ea029961f3ef1e5c644297d0876157e5b746e5359a85cf6a0b56871d3dec3ec3bf765fb18f675dccb01bb0a92f9462a3591d9c2e1cd0070eabfa0a3e43945e7a60058e0779d39daa37f55517375dbbec6972ca351eda40a83a2d24342f6c482149c7f16fc0d7c7af607f08e37d07ba3ede46bd42873e43188c7d81a623dd3eda67294b7411e8f712aeb62b9b36574c01655df5e158e8e65effc374b42f7220520d1d9ea2cd2e5becac6c96fbb3a06467bfa02f8a7174352064d0ac4a98b7b5095d4cd1fe274959dfe7b4d7747a7b52916c19e4adb7ff1b3451d4733f559326aeb000f1a9960fe7af6af98c36f0c687faba069ac76e793fd33d2446cd492c8de007b8232e7f87647fc4586b3cd33cb08cea36a2dcbc9e675d0fb91126f31195f0626d135159764027fc116e3e7f2652ab87b668f2e1e45844f3c37d2217afbb8a5a0c8279412434bbce921599b44e5e4272e401aa58a6447c97fd74eab1d806c9c131967b4eacca31412da6db9049867c55223aab5004fd15cdccc4bf1a5767dd72ec9a12e294c881155e475e31a8e810fc515f9bb970b6cfc4fa547a20f78efe46dde3a5697079f1de4ff6c40c3f35a79ac09d45959ea1750f39f762a1dd6764973b83954a3aebab575062dde6d821c0d1d1a87b2b7b66ab92d4dc1f8436ce6ade848c136cd0fe7aad2f2d8beb2a72fde3503bfe833655bb700ad10581a4f08265d4e52e4d597a445bf00667ff633874df4476a800e38f1476f6e8ef3542e97bc0a81af4f918dc046575ddc5de506159d7e9143e2019f9777da93fff3ba76132ce1d1ed533021ca9ed7c35ec42ce703fad0b82726790e8ebefa46ba875071e6c20d7ab73a18ca977bcbe4b1efa9049c5cd1090b2919c22beb008d1dc4a06df0f6e58fbc3166d644ab2ae8ae89446b3492ea31057df72e2b213282862f6cedd3160a3f39abbdc6552be982aa02caa33de04c17a79565646bca3e13d0f995f3deca478fbd0d6664a637434684df7c3b0f08e4d325f92b845eb8de8934085cd8d788bb49b8a8625859ac89130f74066ce7a8641b1ce89ecf9af681ed72a5d310dac1e810dbd93f20017a620969bfe759db881aa1d13d59733c5fb0147d9e050c5c9a34ec550c2967a2ab15fc8662d4e57169c2d6bc3c000ad320eca7cb05157edb170e9fd50ede19cabc89b0362bf08d11b723754cf3f5ff1c98be9809e4baaf454c2de161b49d9c389ca9f0209d55c5be44fade4b2539067b0c1285f91ab3ff2d9781f4a1b067f559e11042b9be76eb4caf8901acec3695ed4c48ed063145d240b0611de4c559c83039478cb2c3cacee65efb348668219779b1c7fab43b52d57c18a808dd32a9ba41f84b7139cb48c01079932f0395a0c0f5696210010f34ad93bf2b479c16114738eff5776d6ec9dbdd8ccc5a31432cec5509467d4c6a08a21901c4d28efcb402b095b15e820c688627e8545186f2eb2e52cb55318b1f6f0c36618a967f5c7a1907f964e93d4513c8ce411dc314a5e73b2239a4fe4d5799a6b929b6d186a68cc3cce7c73f99d1157da9590dc9c4172dd1e2b1e5c5e3f8c336a7205d7e79ff2ae17ef5baa9e124008b0b79a96d21a239996de6e062741fb173be30d828872d7d782ce2265153ded430b60f338118aa1e1d7d5c491e38d79640377b1d701821e0aef9d8ad2d9ad88e42078ed3dddaa71232d5cd945f906a1a4a449ce9b8e825fc91078a83818639a02c13d3b0adc340ee8a188074af68ab6a1d9779bd0d1bad5814c7c73de420483bd275eb5c0b658c620fc40261dd5ccbf4472b8dfb0f135e063c9f66512b9a6e0a9f27cfd1170dd91f2e5d01fd71a6d9e6058baca328edaa3e0e84f9baff99cf82f67d3852a32a72eadd5b0230516037adfb0081677f00506a2ff5c2141c5292365a24d0ead767e6b9d3db22a1eb436040a2647a15b3054324e070d0f3b7daeb2d90873f9bf01ebe624fc06461dee24d5db2213b2b5dc7423000dc95b8215183d1206d40c191a0607f583a0f97566146903a0b491037fa53cebc6c377c8eda527744646e0dbcaa3b6dbdade5bca94640ae309060a060a13069577362ae58f0fb5eb9e93d2894565c903ca1e33aa2b1ca76fe3e61c4f102cd97271ce49ee2773dcf18849bc7dac9e73b62ccb276c43dd3572fdb8485dfeac90078961885016b11f6bfe470b948e5d8b8fb5245d5205320a2a9e62f154fe74ecc578d003eabe3a3bd285a650f6a0d48eaf6196774f54efc2eeee6e3aeba154edba59b324124aa94bd7ded02a6254ead437979ccd9a15034737efa80df2392e94b3bda14e99b0f2a36f5bfba08eaa785ba32385a73e76d446dc9b2aa80cad188274cd12bd4d6cd604c628e3a977e1195c388468f6c0cccccc1cd6b048bbb951ea0c8eee2cd229b4321c82c430a42595a77463c0da50a75d1de3e96f6190bda16e4565972e30668b39af17589cde2b67b35c589be95cc0bcf8e961c46ea6138551e7abeb6a4da55ca461eedc16e66ac79c73bb1e6f6bbeb973a74e57456d1e1e648e3bc589910fd38a3166f2037581b2e0f9e9de8eb3e1f48e920fff19f61555f41eda29c044acda364184f08af30e5d86ee3c96f2e9ba1d4acc25a73d3cd4718ba8f4a69cde9cbe5c962a03111a70e0550b7523d225a97f5dd4718b646c4ad116b2898c6d110f0637e80675dca28f8daea8d12aaea0d5cca86460916e31e58b58dba2e3cae0c7fa7456fb157e81ae90bd4783dab92cc1b8a29c09e6ec4d374e50d18713e27462e4ac8e6c2cbea9f86effc60274a957d6e202eef3686981572eded2e2347416db87c2c6f91ed236d4c54e566b295f19ce7732fa813ad9bbaf6e2e72b289fce97870d2e73797b22d895cd98c41f9be8c2ebae4fc34b248e8c1d5d2618b7dd16a49343dc7251c714ce128b684a3b79cc2b1fba6f5f49c1c9c1147740947311c3dd5128ea9fa1236ed48ebc551e0b6ba88ba74fdfe48fdc5f5028e3b33e284896a7593cba1d56939b98b7b9eeb5f9c8254019be5616ad82c0fe327707c096b38e27a9870e4f12f4ec355ddd6b65c3c48b38c48572b9ce1c53df9b5bc744febe8a38843c3f1c55d5e421e6d024325da85055522f9990a7565bffba570ecbe70ac5e38a648e1e8a3701471b62d09f118d716fba2c5a10a861823477630c3d58a098de8c01ee33a70e84495830ea1ab15e331a1911c48d083160adc56c7a44eda31a923d3907d84785cb4d8e3a21503f2108a70b526cdc45e122d78a40b072c9e4b0c94063b57d08e83115e8ddf09a75934d4548ae6a28883b3b4ee4991a5c9242f57b26b6960785b3336eda77be2ea30a561872b577871fd11d5894af9878352c7ae65756410df741bb8253288d59147eccdf429612c4eefa298167532131f1667d3eea6dddcd6751d9d1ca34feac83eec339da76ad90705937d9ab69d60c15fa025481e8a3a438f95a81389b728540fb777b777b7f66ddbb66df32dfc5e2b73b67160516edbfae60ee3d516caaedbd646fa0693727d455dd26e67c9566884bf58c22b394e297978783564e8a51c0151d7c754c705a18e5be5d73ba29f975e17083e2f5d3ac0db9a115095ee91c164ac0e7fdb48a92a183a87960a06ce61bae7a884d05487314c9cb611d246fa48eb488bc34e05956992d9035336d0ea74c8c4cbafbd7f3b0cf75d56a82e173c73ac6d666c6fe612505c3055f0ec72f6b44dcbd3282a37ad69d3b5379bf7cc975c016802b12cd9c4dac8e40a1dca98448144c2c1c99103000050a97e9c3dd2679c3dddda42e9d344e5a0d4a63d738cc5262aff3461d1474f54906675260866e40ab347a2c02e91bc0ddcdbc0cd1eb98264222708564726b137ec4c6750c73993558bca2dc175d8dccdcddd1ce5388ee3b850070e0f92e87eeac8b59c9111d2c7a3599e7ba111cf3b3fd22af9919674aead0e7f604edbc89c0a8e64b57dec52a03f515d586a552ad7726a587825b997de3d1c057decbb3c51a93823c9abdad9d90a8b92c65540267252a90b2a330eceae683812393d751dd2bf0e542a431c1627d72b36836273dc9931b9bb0ae6293c9eb2e5b7093c5e66a64954e9db7513b2253d62d471dbfcc1eba6120425ae97a15c71720d6e2b4edfe9f286166e9bde1c78e6d59c32e433246704133e7454c4e05bb6b395d255051d62d00306941c0c518210304d490f2df620cccc3a2d7590831cfcb803851f59f839bd9b5e6130fbe92914fc748f41969f53782183e2a7e78ce0270c4cf0d367696709111a8b28377876aeb39b644cdff181959c2664f11c258a67324843a4ba93e18945999a9142072fad4eb18883283808c28114b6d99aaaa29e524040b31feb542279d4f968d47580c98f9e84eafd02a9e0092454d32f900a5ed002922d15b4a7a85f20152ce1e72f101556948c8cd8d982e8ba706dd8bb70e4bc1bf2d25f38d2c9968e2f5a78e1879271c70e2d92204243112aa4d188c4751da92375a48e4422859248569141151950b1c2c70a981c79232b57aa7032841f85a33f77564c79d9638594f57614838ac317550b2c1605c9c5ea02055519398867bcda2ab04ce195a42203263ff26c8857728164b0e425159eb2cb49c9954b3e7645ee92cb1395f365b17df4739cfbd8bd213917baa092bc7d0ee2156fad0be90806b5732a4525919c2404c93767b00272f6338c7cc899cbf32c4a9d38482781b5f60e94814549038beb57f8fcd87d3848a02b604978e68d76e40cdad0b90fe98d7c78a17c59eac1473670a461d821cf9aa50129a5f4d15f4a1c588845294766434652d475267ac1c10c827e8166f0a48b5fa02da8b46c21e517688b283ff216bf4052ac3cff743b4371a1544a4e098bfd62b1bffd7d523b8f934d07b35a7cc7ef89592ebe2efd84c514941f35d0921efc682b2d40ba907c0bc85d933af24fc75f098c1002225daedf9a86fd24057576425437410e7e8623cbbe474ed457ff78449eb9a16c3e721c38439e81e3272da894c86986141c222a129a9bf79386b2f9f60345d63b937fa034d775614379c26277bcd5d95078b5754a29a59c73cec9fcd3362d5f93eef0cf62a93ea60c86063230199f22eae8098d9d9037938179429e908ccc4c0605b227883aeeec47d7d59a4ab98b22cece78b0c83f648fece9ba5a5329f76d2abd295e8f23557ec37d80142abf405a54f9915f5ac8e0f9f5e26e71c3138bbb2dfecdcff3aa6f69c7b4a59d17e7c1fc3c81a82911067c0171c01c16d9056c0124528445d0081250f2b0b8819276a5c62216e69fee09b3b675fa1740c9a2d2d4da4c7f8938b12e882ad74f4aa8d4c7cf076d0aeeec95b29dbf9ef9db36dadbdb52e675b14050acfcfac2785bb3de356be40b81e9444246e1b68d2c05a1426d239d82b455db86f309a65a5bea81c2efde70db2a7d2c72a4226e79129c6d929cab583283423f823079ce8544c00541cf79115eb984ac3cc705f7b9c0073f4a9ee79ca5c8ab71f2904ac8e021c81470b3a6366b3ae7a96651e77c72f23599f07cec3383275565b17dd6da339f8d82ce4aed9e07f0b686b6bcad7159e7146299932394533b19ebeeee22ea9813ab2fb94287a64501b6303fc0b8f399c2ab919f78e6277202f003d0017a39dabc9cddc1e40a1dbab028ac1644e490a08e3216a12c9245d20aafbaa688fe8a2ba644ba8ad0aaec505a297ac93e4adad768cdf2cf5584275b23276a076358cf73122bb199ce8c1e76713f959d5dd25d0c2b4a52419a3c5f098292e7138f93761ebc359d17141203abc03eaa411d3b2288c8a0f245f82f307f646a8188272c7a2d10c145547ebf0521acf06aab4842d602115478a56a97dfe17709bc1e38dfc1c1dd14c6dde26590cd793037398ee3388ee3388edbc2dd14386ece39e79c739b73ce39e7dc388ee3388ee328c7711cc771dce4388ee3388e731db8e6388ee3388e9b1b9dfd15518316a1aebb4851d9637cbd01dba223290cc2836c55af3b414eee6da51e35c82cbf790d32cbab5adc73ffcd55ed2dde122e8b9b9742d517d6b0b8d530f271fa0dfd4a6c00c6f7bbd3c903273772a475f22d0539851e30a24396d6c97778f11a86358c7c73cef7f7e7b970039588f1175007d9f2c06669f5d068c5843d9c7c071d7638e27940666939a17edac2743a9d4ea7d3e9743a9d9c4c292ffd14562795bdc31e645a3b1839994c2693c96432c1984c2693c964721e725aa670070e60110321a410430846fcb460fcc577d061870c1451d1a40c23ac48e2082d93eb700a77a8a7d3e9743a9d9c879cd629dcc1e43049c49001511154f820a8c50e03be809d1031b0810f6244e1450f2d7613b87c8409cf0c785020050b0f845a2d6cda81c7ed47a66815751b787cfb9157d1fd19ba699ce6d9691030d706a594fe78e4b94199e5191c7540e202bbe8caed1655ab7a65bfe1ccf2db11310a0295b2bbb46372dadc264d24175fc7d991c3028fd579f1dd1b2ff45c4ef6bc03774505f47721af80f07b5d038e14f183a4084158e1a40b305abb361e28bf76fba60a12f9de254c95d1ade87def8d454ae0640f87ef5c8a1ea9e32e9ca724359584e6c0dbed421c7a4c22dfdcaf69e02dcf39e79c5d7758c3ca219912a6ecd0145ead4c09527e5271998c53396e34a223b0088bd386f9f2078a8a432094860f7c814b72cf49b76ee4cc6da37048db30fd21948ae771e0e8bbe7deeb8f03b7f7e6c781f43dfa71e07c6ffb38b0412671436498e1d779a4162ee446fb5dc1636d3801cb1a42a4c5f31575341a9148a3d18844f24c72c66b4e444e9ed7356b64c34e3b751dbb725b71be526e606f3c7e5c51650bcb9db3650b776fb6d2a8a5392efde06d0dfdbcc1af7b143f1ff982e3e97392aac5a7c7389daf0a854c4eb3c4286ff30b34c6eb3d8f3f59f26172198e2cbc6c1ad265e4ee4d4eb74743e64443e68442a15e5ed853208c6f309b9434c0b13bc11061c1099950c647a08c7312ed38c400b36d7246a2568f0155288ff193b7802a94b7b87cef031b9cb2eac5d0a517f9c500e3fb624aa59c060d97a51d1aeeb5b7b9e73eb6520ddf125784bf462ae525701cf229e7d134c0d4960a6758fcc1ab516481470b24dfba93373843fbe69b779d0b25f7dc47c9e738a4e4a9b19d3bf20dfa736011faa9b07f90286cfe6de2480605dab0d3e24062fcd4b2584663b87ea7fc021535798fbf161ddc3d51472f2af551f821c1b5f5bc361f5e75de40c019da3ff74a59bee4852a209e93dc8717b2f0a5706c971fc8ee81a49d9e41d41864a01e015e6ddcc6f50f4abe5c41c5f82ec7445da0a225fb7268bad026bbaeca6fd6286f6759b362bc4dedd2dbe61e865bb86d5b2784c6069a4c2ee058030d26f7fcab291c69789770a4e167707193178eb5878b8f34bc292c32270a540941a91ce5475a31a04a488cd7f01aa1911a1ee3475ad2255da2b8a4ee25bdf8583708c93d1548030e6da3026b801efd2894daadfe764fa5b8ad6bdf7cd75bf7bc59764b1016db55e0b66a80db221951532ee3be36eda710e6251c6b0dc7d4bf7cdf0f16fbf34f04f57329d41c03aad255bd9d93a8333e000d1846a2d67054c3d1c54b31e0b65cc07d14b8ad1670e7387f9442364c1238ba946fef52a06af36d1be9e372b56440d51606915c0a9640a2c7d5ea9ca823c768d81c5b9d968f02b715036e8b89daae17ae62f0e795462ada9d369fcf71bedfe9f0bc593838fcbd80e3e95f7835b68bed2d0be870869650f4165eba4948f48bf3982dcea9d48befb6784d0b28b684228bdca3af6872f697979797703485355e5d5a58dcd139381e698239e00e9c14d46e52bf0ec715921199a427449745a5eff1575d4aa64eaa3f0d19c817f6d83d12b541fef963aa03728589e4d71b20e50acc430a083207cf794e739c18b56e3e6703f9d93c822251a5f726a7dba033d5ddbd3b9bdb68cf3927d75bd3ee6eeeee96bbcbb57443dddd3db9d921edee9ddddd2fa8d27b77611cf703122937520948f7381272de946eedb812100980fe0392283ace47ce6f4935f8a594b2d65a7bca3cd7b5618759969cb194fde2c7ba3496b324d30555fa287d2814ddf440110f6208e1c7ea3ef84117b51f049146a311d00f96f891aa351a8d46a3d1a808b2decea8347e817ef0f2412d55e346f071d10734af117d8064fb4975b5d62e355329c7c9c19139738abfac6566664e3d3333335bf1e3a98cef1e48f1ed600a8992a21e966082075174c14730620812ac0ba04a15df6ea33b628b21686ec003217cbb09a59d9e8c849bd92b3311ab332305d0f1600a318abe5d559d972039410d16667b274693306cf0ed34aa9447288909e303a9ae5908cfcccccc616c53c921434533110b9e99d951a51d5ed20311c4884421f8f65369a753386d8410cc0a030043e81b8c23befda5b4d3a9e6996a8167304117618c600b1da880072d36c233d76766e6576d016b5bdd3b90f2edb3bb836ac4ef34a383230cf0ec5dd5c117cf9edac19367afdebd750b754104142baa282ae22b3e2420810b9529cfdee20309108698c10b3e204413453022882dbd9c666a74ecf0820ad0b3d7948b385f8cf1ec5f0ed1b65eb4efe8eef6beb0418e1f75a49083570e82f0450cbc00e3d949384d6bee14174124f0a104420882d26a26c27777778f86544be58bd48f3b74800323706084a1d790152faeb8816c877326733333330fd1626666de2bcef8e6cacd92994df08392163333736967e67441c5773771a470192600f2418b1fbfef533746174fa640f19da274bb4ddfdddd2d6b42506b6878a6a6065470600316d8808b294c7cc7abdfbebbbdb68f13df31dfdddd954f41f871e69975d0200c309ebd139271f1f35c83229e05e04457bb8e34e5e386309a0191693ba56a8a08b0ae0c9a0c68064a30a10c181135ca28e2271b9351a3b9667dc1a9351a8d46a3d1888c57db6c074483198c8450aba92a68c98b8d68f663e5c113a2316aea17e849194aa830bf4050f480e317a8054cae90522451e2c4a89c84f439e79c73ba6b61c4cf39e76c2685bcea48a45178ea2a4dd56e226ff2d89b395b7e3fe9eeeeae8af3e99b8a0b75e4ece8dddddd8ece5295bd81130aef7362bbb2bbdbedcedddddddddddd6db6355312a1a1080696777b398725e5d2e6a59d99bd6137a15decaea652ee622772f710398d50cfa8d2db79d51da892be402c582243293424895a82a394c96410afdae54cca78e5237dbaf391b213f9c3c07ab30667880c3414912bc8e7d2d6dddd43aca8d3a57b49f0bcdf2bc6abdd4f098b3016db513254902ae6c244fd5e33ffc08f24441d6badc77c1395ef21165b883a7eac93ef166bd629e4b858cd5753daa9b5efc60d1c9ee328ed7c4ebb977151e1a2094000a51d6e430185d20e67ea31bd9aa57ad59ac985e5db4d3cbceaefa01228f945416b342d31c54c4fbe9d6eb1596d83cd58df8be44d8b7026470a29166b33bf27bed8e7433f18ddd906aa28375140a1b4331d07a7b433e96c6f28cee7a5f0a550da995b8ba6f09182a80368a1d593c7b8aac7cbcf8771ea63d7ac90563a4469b3cdf50c0376dfb7a7b0a74f60e8026b6df37dd3e99cd2735289bf1d417ebcf0792096202ffc00cd00696011c0247c3bc92bb52051479006d256674f185a1d2f88ba81d76f3e6bc03466ca742774bd78c5852e161ba4354803aff0aa0b79c21e5e81b59027ec016958d4912f11114aab584c2e16db2b8ba7e973c7472a41f5188f7194c7f8b660429729232a1860fce4a7300715874ac8388c9f1cc6b7950a8fb4381c451085025132204ac62a9c7cdcaefc86e5a54fe762a0ca05e97a20d2f51c72f2f93b10d4918b71b10569b5a652a208d2704640a84bdb6a2fb72b2f693220586315da51204803690de016485b411db918174bc5dc6b7c2f184e0e13a2662518603c2644c9dae67b6d5256a76813da66db146671311a6cb12b6c3089423b07a5ca37f7b351095f2058c12b7b536311c4c2362d57008db028b4773d8166ec4dfbb8c19ec1ed4f18da1b1054ea4a9815e33fcd0a79d8a69d05d2d8a63d4ad113a226434c8496ccc65089ac673e28df7506a48d1f4a4a0c880a629b760f8657a65fe71025637618153e6ff52daf543d5ede873a6532ecf1428bbcd5b7cb8af185e19e58564c68729dc21ae7821437c5b7c794766a6d6fda494aeab8b3578d44f463f7bdbabbfb93ac6fce398bac6cb0222b1b6c169b35c1afef029080a863adc17ec6a76d62bc9ae9619bd8994d88c3991e23ea685a526bb5b6f3045536e9a4ddd66d5b4e4e69a79392271775fadca2ee8b6ddad7e7fb7b7dbb8a7e3ebc1ab91853cafec59a95927d2f5e2d4cc91226df0faf364849936fffa27cb31ebf27df9fecfb93f2ed543217abf253048557230e2bdf84576bc63767841fb9284f7154e1d58892e128e2150e2bed333ecdda62333dec6a83712cf6bd153193e4db6760dfe336db9ece4ee0b64dd7e87c524a908827036be0156e8b8a0ae2d5e623114ff61c4a0a5803afd078c58fba42b63aa46797cb42c91655c5b26a0da505cbb89ee4431d778692b5779d0fee79fa08d2e86c6fa69f847e3a0cb83b7d8b1115b1521ec6148b9fbefda4405047938f671a4dde88994d3e26269514aad847d39228a6282cf6e8372d61b1c6abfed04b50c75aabb58ac5c5ab1e5e5153125ecd5089186f37bd78c54a9cbcddb4c4e46362c2ab26bc22f18aba6a864ac0f846e57b9bb24999352b26044f5d577f2851379fe9599de9ed33af669d6a40acd83ef67fafedd9f62770a6a763a1b443f2e54ee0cc0bacb5ef0584ac7dcf70a6676f9a23c262ffe81f2cb62ab6373d1ba9d08f28d938031bd7cacff430cef87cfb8f17660486c84084575d916ef224095d210f8b0d6201af803510a4957c54d2480e815c8348f0e437e895e409f01bf45ac28334190e9725aafc1125a30931f558186991688003480478a61c3a6e048042006c441c27dcc049610004d8a1c28a9553038002843a2bb06000d00f80808dce11e92bb5b854130e4af68d12e2d508a2869aa5238492f16a673e52a6a08878b54046b082aa8da82a52568418fc88a279b42264f1230a0b0dbcc22b5ec2370e5a65790221660d9852e64fce2025f6c7ab9572bbc627d175055244fe47c461d7f3d239252f9b6764df33cfad531abd421a5a1defd729164bb9f06269d1eff0647bd354ac4d17e108c30b2e9e06d11db42645f5f1f22818aa466ba61f6f0c15d1375385e18d81aa7db36f972aa2bd6937a16adf6efa599d2728d8ea7824a2bda931d2da8ccc871c44dff39354a8595ce8c138a442a56f9f455468ad90a2f060df3e92a2f8b152f160730c1725d488cd2a31322a3132292acfbc7703cadeb4b7bca0aa7ac8e152157d3b183dfc09aa2219e670b5f09c00fb7617f22937a0ac8ed7055165df2f9f836866e16dcdb8b9bebde50455a86dba4352c74eea60a18ab48517b8f9434b1975a4df77b4a3ddb7d205883a522121224a73e9a923159a325229df54784589a637a5d12b140b5d29bc5ad6b6266d75bc2e88bab968dbb665e01041741d354bfcfc982282cf8f5dca6b441daa209bef0b61576be475f30ee4e9e95aa351d8f1e8a68100bf2520fb83df5009d574232b6b6960730d7073359bdda74fd58641389f6103b6c58593a9155e193e65c03825ea0211c10554c64f19b5327c9e85b0abc5f9dc94e0c2cd79f486c3cf198af0cff086fe7598df12101cbfa1121a98abd9dc9be4ddcd92a5b5492536df120c08686de1b64d4f2b354ebacf93cf9f273f6f394adb3db0fb4293052af528ed0fdc56070a995e285705ca0115034afe790ca5f0f318d65d5a506bd8dac8b7e86738f2785e9be7f3065da0a8356ced8bf453dfd66e0adbec71e4bbe581db228163ea9feaf01308019ee366fff6d1d2f4ce039ddcc05b7777cf52cb28bc81a95359b39c70be42a60a4246a15c9b5106e4be37029d4cd6e139861e2735e4fc0c45fa3b17ff486be45e0d320bcfc879705243ce17e914a873c9c791676f4d70c7f9309f2c2da0bf9deb527bf41b814e6e60aebb3bdad28537f06fdc465f411d4ee181f7460984bac01c8e479ebad03eb9439e33088f7a1ed88ebc474b0a90595e865f89d481ca72058ffb3af0067661ba5cdf813a7ffce8ea74b4721d78037fe7dee8932e7bca6ea1be21e79bbbb0798fd2070bc890f20b0484d809bf40643079cf45ca65e66ed6da12918145c9ccccbb1cd21f2f44804529a59382ea28b9206ac8f30795dd2768837c598f921781c7e364f21699ddac3b36a786521d3d49ea58c1a8642ce93e1709092c9c187514c53e89bd382292959d96a8637dfa4c9f077b382e5279761d355545098aaba3761f11a618822ce7b5b1679f39d4b7c6897c9fb837dc3ba8ec232aea385fccdeed6bbe7a8cb5612fa35b76217115ed8d4f53a923cee3ec983f1c13d26708f289f4994054c9b1588c9b48e913e599f00f3799a28e1cf3f991fec331e9646fd8f9877f9a34e11f6e8a3af68f7cf112aefd72a28edd77dfd683e7adcd5b4ad943864d44ce3e2512c62ab053a15abdcaab51f28463a567d41da28ebe38579e7d070e10dd2fa984c90c93a08e383938a99917cce51a7a76c9535335339d6f0d6f72e5267de3b88ddbb88ddbb68d725169943a8241557552d4170cbc49d460d45194dab0a18ef16a9442b286b54f3769981016759442507ef686798a9c348b3a76cfee9a443ea45242883dfbcc76a76ffa6c52f97d68f5969c63424812c35af1e1c15b4ec6f6212c4680c5213b64488311a85f59f4b0545959fa4c2b6056683e4d9848222141a40fabb08489ca50d451c2825ab610709185109edd33a30a7151d47185e4124fb6b888c52ab2a5942d2591d35cba74e906aec4ab524a39a79c94523a6b9522222a558886f6869b699fd46926555356684555ac1411edcd09ea24eaa1294da587a6f3e019b6d0dea4bceefb4aa5d24ed541f5968f7482ea226b359964cb39e79c73d29e4d4386eb3692048920284804517e8344d0e447bf4122f0f90d12c1eb7f8344d0c3977e83926079396f2009b155bc9ebab737a6b0e84df1866e083dbd21e56fcc5894329322944396238aec73043dad41959774939b94343f5c6b3a4dac6d8ce062c17214f1f0578890d0c47aa3896d21cd589788c51dce27a8da7cfab61a5449cfe5878ebb8e34228d5c80a8230bc6826262c15e5830d6125ebd38c9594d583f378658a4549edea8d28137886e5861913a898905bad2e4698ea21b434f7d87d10694a73edea0e520e2c931f4350f0b76fa9105b3816f103d0c367c8639b8db7009c240e31de6d04ee39e8d1e50058383eebe2dd0c6cb48e86198c39c0e86363ca4a9b50d8deb4713cd500d2133a2d00945d61e78ea3b9a9e44097a2a5326a10e4d4233f7d0343bd2a281f5044db4b6a10d9a8a6892d0bc68946c4e03eb144803a359e2c3aba5f161f1c4790adc6892304bba6894f06a6992d0bc58a44a6228944bd3bc78ad2e411aa1596c66126a16cd4f6812a28132233383474a22b84d7620357aecd108f1aaf36dd5e8175adb50d21195e6a7bd4323fd43136b964ac874770f8db8cf90e6488bfa96844cefd0c874b95aed1e1a6993ca8419a729529960822a003e477822651413665409e849c2ab46f2948688a6a8b413846608892ae32c1f96d752b6a965dcc073db6ad17875a4456b566ba86da8773542205aa987f8ada126755ca0a1a71e0058007c684f652d1aafc6ada227013d4f0385c51c432cd8ea704e49475459014ff65cea21fdb990074b1a5e44f634421a28bcdaba6ebb4164042c731e61c953a7c192a4d56343c990cc6b6fa8c3b096f0aa5d3ebc8a6112e3554b13d60faf504e9df584573c84c9a353a02703da3051a32936fa8fa698a936bec4686236c877016d98de508dc9ea14c166344978b5a2f8e2e225265ad71a695e393f9a622de18823437bea453fd2bcf43c759a1e5eed50b33c9f148c57db9568863e9a218f66a8c953284fdd2392e518cac1823180b6720cb54d1295c66db8f4918f5e0e6f8a3744c30574842add4045604284e967f4643fb2e163a5f13155f3eb9e9037855723a7ee0d7932ead35d57eb7a3e304ca7711b218f938e63c140960f8bdbe6c994a0711edc9546216b89e9c7f4c4048505632d61913a0dc8f26115a86f298829d6363443a6d84bd0236251725b8ea1a74e398e862625b7c91c43bc1a3da21c54e836b2887835b2602c180bf6d429dd7ca4197aeaaa8e739ad877dde634b46685329a211a33ae54b14253e3d502d592f0d878d160794a5bf2a38d9ea79e0ba8d6c48f36943cf58edb4c311314d34f166a8af2b4a9d0ead0b955bc68300e149e5349a594924a49a594544a2a2595524a2aa594524a29a5a4524a29a9945252292595528e5e0e6a3b8fde7aa3524a2aa5dc36efeeeeee6e49a5a452ca6e49a5a45252293dd9cb90dd9379b29f8165e865e12dcfe922b3f026ac4aa7b209d6d03dbc1e93459993c33d1acd54aa565aabd7d364a2eea9d4964ad5ba37f2f4a31c69b05862c0b64d977c703fe79c5372d7d21ca6f626b537dd63967ccc203c3becd0b5cd3a2df9a07b23bde4632331a9e32cf9587134718ff6c1cfb5ee4dc947f7a3973e8ed83d97068c9a019ce7799e27b96be946cf4e6a61e7c1bda1093c1ea2eecc9e1e5ada71292afa75aeb4431a62be7e1b4a43612226e21ef9237fc61d7ae9bb927bd28deb5ae47b2e1d326f4da49452ca9672777777c7f03c9210757700ded68cabd76fdebb3ee79c73ce9db3bbbbbbe70cbb192ff4606db3f9b66d6175795ad4ac9d73a6e6e7239f9c4fcfa753a26d6ef3f34012d8b5cdf46ddb462af41bcc73a7314851b87e83352b6656b76366bff9e61e57c3c918bfa992c4cc3a1f6b38a919da9bcd862ac96f3e026dd058dcbc458a3a42a1686f366f7941bd11850a3fabc3ce85e31ce34614bf6d2afceccd360a73e0cc7ef31cae1c3c28146d1d0846cdd0ea7445b4dfba7016bdfcd66ce10cabd7e46e099e376b50c79a5fdf5d1b1cdeb6647685411a107573def8b78fd2660d55c5f457cb09aa9c72923849e224a93672f9217cfd683432f18cc0d194c403f9c3570d24391726e1152954122e21d51a8b5cc5c262d75ab36a283fba759de7b19c52c60801f104082953569192638ee316586c0651b2aed4751dcf8d45ce47b188578ba2f16aa9942439c723a822161b656593db2d2af6cd5786478607550525e355e394a08e28d9a2aaa08abee9dff43aa223dac2913812894422914839392413c739e9c505e431c4712e610ddc0bc791da14aa381289e3421e32fe26cfaf86aa39a2234a5b4215dd668f52e7e1c4a0728871946f2b26e7e4322e13e6d082f123ad1860fce45b822126c4691be9a89e3c7e705191952a3c662fb028e50b414e08d2ac934b8fa159302859dbcc79e5e5577bf9a36dda63621ce5a8d0c8760c580b5ddf20ad6d90a8236aab7c2f1699a28498529e342ab233aaa0aaf08fec0c327e44d13e19123af0230acbac355ec9d8f7cee68fae595dcc6f376b20999951b2cda9fcfd291d3585065ea162593fd6a67d720f6459736df0ed5e075e29ed708ffa1807f207d646a459f231e3da9bde6435c82c1d89013dc4179ff28ecb133e1a506a008c6fbbcd4d6edbb6f14ccb98819fae044ce863fae85864ea795f690715b4d2855bd8512c258336cce9b36ff7a1048ccf10256b164c38d9861d355b52da210551bf97ec7f8a38c6d92951b34ecef38c679fb5d5910ee3af13bc0069323c61883482fac3ab9b6f5410a3a444f93e398cc384a820867d938aa840505e0b02fe689bf6fd21251111bcc230147c81c59e3ea8234a3699c56f67103543c9c4af6dc3a90db6f97cbb572a79a9148d5ff75e5e4a3b1d901a6496bfa17ef5161f3574962c5fddc5e5e725974e994f2c32e9678f3ac10d3563b11d254305d12bc05967ba6ff481a59a8d061f6cc3c10786f8bd94c4646d754802f876ee09b33c964d2deab85df9361a8b2edff661599d1117262fb6305ecec60d8b19affc14f39188a8aa580c4a062523d3dd3f50b29dd5e8667a5e150794d5993886be5f6d23d4c446f98ee1880287ec71cc24d72b72387a433c7bb7f7f33c3dd87b3e5e8cc60a9ca1730704b4686fe80f0f75a65ae2d95143cfda48de236acaf728884ac778e912469af148ef420ee9cabc1aaa6f79c5bd8f21ea08d278b06ac6841913361a58651f39d8cbf686bfa1698209f5d76d8034f00adb3487241254d9ac18f7b13e2a8851b21a4a566306af302b2644cd180b6ae8dbc79007256b4142953ea27e344b460604696d830ac15ac784ebebb244dd9d714dd4112573183048d736366cd828ed78c9c7fc8dfbd962537cc7484aeaf8bdb8d8ea908802f01bac6d7a836d3394acd66ab536a9106a0a6a084584aa822a4259415de11557c322c3c32bd59cdf92eef5c3928e767409832ea61e136c0b4d3ca69e244a60aaa621a8748d5536492d15cd08000000005314002030140e878462c16038a0eaaadc0314000d85a04a82569749b32487610a21030c31048801000000000022331108d7447e79974926437f8ab4ec513da4acd2b42c56608799385b3c57d096c28ab386d26c1d8e4ed8527879c7e004113e4fb6b1437c2eb7994eef7319d397fbc94c63acd0b2a91e2b3458e87d134100e67ae2bafb4a0e7ac96788245184b32c70c4976317a07a52a52d99531a7254ba8154a5b5958edb95eef28f570536841a639a1a0ae2be30f009ecb10c33417aa292f788b6cd8199133f82221a2c5ef77f7e64fd8734475285ed57bbb7614c92d8f41151872eaed03458a9d604f911bbed2d16815273ebab6fb5a4d5261021b2aba7445f0190ae918e6e34fe540aae84fb8ce78945eeec1aba0aaade86e795ba045470ad4fb6f9b18c48e50463f98d48ad7b23a0abe95ce53e83ccef57e8761aaeab7bea821ac63199d08f8ff626194f10f4b5e2380987bd4f47db9286fe733cc3ef6aea82239f50242f513d26269b3801bf0971dc8c152b5163e91172fdbfb41574d7aad2209a88028d0132fe45a47de75d32a55d91283f14007e30e7efbdf743f748e6322aad16a6a589c0f0eb6280d9d4676fe42807a503d007255375a5269fa48d913d9ba633953ae101b05b3836eb2993ac688ef5adcc0a9c6a7d17595e32321714ee5f287148f842f005a05c0403d6f100ec657b80708876727f23411b4b44c38a843fac9731c5b2077dc33ca357b39d9ac65aaf492dce2d83e83bea336c263cbfd273963258405d58cae2041df29c7822c9faf93aeec1195821a3b11aa0c79f19823f19b286fd2f939d91c9aee73ef21ff8cf3a29ff60d26a07a8b03c7708629741610c79193a8a63152d56d16e611dc415dea608701353aa5faf61d9c5a7cb84d3f5cd1697fb4778e8c242c0646ae2edb4990d7e0a38bdde623336bc3ba520c2219efb6b88be85e202856de9e82b14d8be826371cdd2788da599deed1bea976e055827cac304b36b26ae85fa258a5a0ba5afc67e526b772fc58fba8049f2f151f5292cd24ac75f93d075ced0c24ab386a78c7b394f3402ec682b1ebcb529d3236b0946dad9c81d398d1ee3635da6309903ce7eb0494d5791fae1faa7b79376da8461698557ce3a0a6079972267666e625ef85958ab11ef71f3a5318fd69e12600103915ebfc8ecbc1a216fa7945b62dffa41f54719132ad6b56f96c06280f6f92b3f0670fdd9b1e40b745629741f4323dc374900bcc269048b82ecc9be778cf07fdca20d8d1feb44182a6728bc9e186952b5e3444a14a4fdaac1a9b60959e7629a87e65e898f02c40e252044c2e56baf5026007d561f6573324ac8918649ecd7fb134a7b33d2f623c8c38c9acea7498afcdfce4b2a4af9d121585948a60e4f51f2589094e42ecdda49ed4d31a2f88ce01e6e0083208df2fe03114d75d1600351820ab37a937c1adcbd125b71f88ad498d6aac67fe5980ded22388e03094d8b18640dc20f1ddd56120595c0d8ac661d0f374682ef8f65274b2dbcbca65fd4db47cd980eccee6d46e6482c591baedae4819ecd300469dad4cae31289cf732c01026801e5b6b686af65b057802e07bcd6a76c255776423c9cd917cdee677a813c7b6a54e16a3cb23b0670273164547d6bbf9c89410d75bcde793bce41d2045f796e5bd1cb6a2ff1106141c7aa5796c38b8af038463b1e228fe7c7e9817c590645a25b9aeccab1dc867eb422b4d07e5eaf81cd4dc2e93a3e5bfb2617c815ac62e269f17f818e962fb7bdf8623d33a2fcbbc6bc2f1318f652f8b0c8e1f4bff5cafb242d434577c4d92cc31977576748fea630ede1bc0ff8a1f377047c3d79874f3fad5df28a81948a0edcb24fa8fa808662ea2afae4e64a223192e740d69bc0308926752467c55db715236117b9cc6f618a5e4205068942c6f0d92d8e42f1b9e4eba6b063804ae660333ccfd5f849f5bcd8786a567dfcba5f7eec5e9d0d1ad2003b698c43b7cd5dd0be67bf876ecc8bc57dbaf832b74a4462c893258d712cef2ebbb27d9344c2797394e136a99c11b7243afa7bff2224b951da093d207e1dd1c966f22482773322e3ae8b99cf2e45048f4025499b2e41d8774a72b4ca0c17ef8f72a9be8517ecad714fbadba2feac19b95662c6d682653e0b9dab682f7701f69c792acf96495083529fc5823051c8d7658dccb89bfe5d110356dab39f11f18e050d7eb83f4a6bcc0261a59feeb9bda211dd8c7981180e94083cafe9def962fae90689e5280d1d5f577971243a91fe38aa780d8754c15126275a476a069e12f84a6cd9a57445a15427c07269540a62a3154e076edc816b9d82f230f2f022bbc483b6ff1a33406595e045e3d49b76fbb8620f377ee83a824129ecc9da40586e5fd787a06d8add6833afbab5ea40a00da6cca391ab8d50a2cd3e68a31e41f08322b80ee1ab5291f124e64e76181af7b2439450d8ddd06d57a9aff600b13d89f4d2069ba7859ee8ae32b55d8063abbd19e137261d696b88485c22819e3865eaa5abff346e82697f4a9958cbb0473be3146d308d9efd83d8a469c25e9a783889fe9bd6ee367b4afddec214bfb77fde9139b6d09a5b0cf9ed325bc3aac6b4b6586e1c592717ea0cc3cab7a33d87f7f636a2672c1f1f2aaefba0a3bf07b3834f519bea8b6a5ad6ea16da8b775596ea946ea1daccf1c2d476698b2a27fd0e52f2e3a4bb5df5020db8562845313c749569cb5236f50c7f30bbeabd274f1e332dffb33ed8e0da25496321845aac0f96fede52fe30cf8691345ba1b944db94b0e064713658025597fbf61a4f4da293b53a47945a8b5ab6e00af7ae7a88aefa4c0f8bf7bddfdffd8442c285eb53eeee35f3f88d069245fc112c82b7d8a1ad6e57754f2da0bd08af4882121546fa4f77c85d306d368fe0f7b6cff9b4f0af5102a4de979f3fa449441acbe2a8b026717f93d2c3258dfe539c3a877a6296cd9111500a84f86cf61ce1305f552f73336fcce54ca8c186153176f491f93487cd4791ad3c610c5a218c6ee841129cc7b210c3cf6a61e4ed29e6990b62857aa5f63e99917d54a7d3084e042d7a9c6127c6fd876d4712ecacf07452abf7f219f3cee7cc39a37b30acf1177e07bfd1c0411f0390406d779a976016313631344c1680b1878ffd6ea1e4cb017c2d855ee3fcc1d82b59dca609c11515786b7fb078326f1a79ed7eff4d6c98d09ccd7b94366a1aa5f0c16e4ed2135b0ff1b121b7542a4b7a97e4af1b917b6aef5fa962d40c5105fb52139aec8b14f95a0fe4c948c08c23572518724d547c50d425984c36fd9b623f784995730b1f2c33d3c266531b67879d477855b9ae3b9e25d7e75a881d362ceb02ea9504518ba7cd01478e31a1ee70f9f4809af08b4a521d6299a607c80a1b9fb2b781262dd1781ee0ce07764032a8b6cbe79cbf67561afd5606c882010dc36f0c4e65754e08a45d6cd4b57e15946f6205083c55a06339e8efb31914e533e74e0145daa43df666137bf65a80970e12646a72528883c64f507f817518fbe84da0ac09e01cc8c5ab0299253f0318f631e33d190e6058810f0138c3df5b945f483ecd0a5b9fb8c24f14abc8538a9f8a86efe13665ddef05cb4dbe22444836460a336ba9ee3fdd7db13e482b4a459c0d8021a811c50654f21f51ae9ab5bf1871d55c0b7f40585b4fd36b20f0b2f7e262114b904812c115da97481727341e935fd0b08e8463c8af410e1c68783fe4c29c1702ccc5c53bce8e880ee72bb18334533ffaced1401e12259aad6339bb6160707816957f07a0c1805e19cb9dc733e3c40f3ca4a93feab23ef1c7645d881c0bd5c05023b6dbdb0dd11c44e0900c0ae77af9a9b789d777c9c17af5d86159e91144a1ec42116c9b9eebb1776a99f937cbf4906ee51b03a8dcc4e2b5a7063682d4d6df5481a2f52d71b46678b32b747fad48e9cb50b276f9f7e46cd1bf568c4c805578bfe359f5d88e00b4ff1d5d5b05a66b9a60a5e36a308d855ba0ddc2a970d267bb164a6e0441a60b48572ba5d71d1c79eb24911d6e515a849074c3aba9406071443d2b1b95533fbb1c7b68b4d005d72ee7b68af8a108d606daf68ee6b733bcaca239f88d4aa51936f6543a302bca26dee6bbc93595b8ac24e940ba98d6bbe81f62d02804faafac59328c138648cfa3b3b2a11aa0c574aa3adb7f37622b0d47b21bfc4ec35dbfefde0ffc909f71ceb8de365edd90adc24b201101f56b39ffb2b4ab5e53a232940224a525422ca961184f149d9820c4e081f96fc20e40780430b10e14d0159a3bd539a032797c143b21e662188120c50788580b4e392bdf2864e855ea9583ff96d318c150ccdc33a6d7e963fb33b00e71d5045543ad4ea7b2ccc83829d133de2ce84d35f3177f3e198ed27053dd0a19e7f774bce1036aac6d7ea912ba9077978b9d9a69f5a08aef5bf8c394e3d9fba6cff78ef64502550ff672e7ee98d890048c29ca3bbebb577623abb0601752d6f585f129a2c9d91895fe267e135c2944a87f4722b9ea4f671f9bd1496a7e85ec47e227ff76c09e1a0726d86910c9cc13cc4285b31b12da98e99dc6d82b7363413f69b4c99f6e7fed2d91924d5005d385a4bf6f76294560a41ee8fddfa99541138e488730cf24e52f728f315c8fa85c00f09262078136021bf565599592da1bb55ade6f6d365bf43000da48cb30d490c4725a3e11d8bb404822e2b78fcca6004aae57890d73da58aac34835913d86702ca1b39e066548a412cdc04132b8cf24df93ce33aed5d60786e012518763e0fe0e15be93e3caa63a277bae321ad3c2bfb8b2c7a724e03ba29726125a28eb0cdfb3ea2263439f7a6790786a1a5bed141ea777554782a312a03defe89c5967adcdb3f6be4618f9aebc37fd18be31bdf303630fb6b82f539d17966f1abbd21458ed730b1666b9b5b1df25192331316d9a10062bcee243cad2bd038b8f1a417458a3acc2690530793cc33e5b266fe540e96fe811517a09ddfc6d3f7eca4c790fa2b98f0a6e3c1aa8fa954fbcb445d68deea89c5182e618964caa028cd5139d1aac59b1100d00f80fa60340f41dce8495279fd59634e93d857a496cf66ecc4364d2734f842cc6965ae90f6b387bb74c302011ab7efdafc9e7237e010483efaf450804b811d2cb8c425013f989659e39c7e1456f52abb30caab4fdf126a673f37fb32054aa0a11cb6ea7efb7a66f8ce911a42f0a801d11369b4987c589a614f92e43cdd3342a46af60bb5e82bcd9eefcc6ce4b988e6fe80e1106569a72518f025d4123c7aa4e7f24f02552a45d5af383f8a4f2be38e6178b6d937be6c5bff2f229a8ba3672f3be1847e6865fee165b88e5c8363156695d66944466a3f606a0378687f6f07231bc7dc33daabcc5a1a361726a2644f53b207c5623cd92df5ecbc40eae79628afbf44b040994d5f6e5517750abad02898d05ed07b3f71aefa1adfca7cedf1b578107a80d1fe1e5a086f5f22f0617838e901925e4aeb3c3638ec6ce49e37d86272ea6690e1aa3102b57468bcdb61eafa20beb9342b2d6dc941f12d2e151f65bccf4cafd7dc02b5e2ad5cb4ae6451f4d2d5f7118017ff9830335cb0ee03469abe55ad5d293a244906fd88409995a5e8010f974a7819f0b4b98213a5f352878397c955e89babd9c5cf9cd78d976f8d0ec023999ae70d44e4043d54dcbeab60e983e1831dfb1e7bef5dc6b22ed84808fb09a36421a44f1ada21c40220ff14e06d110ec7823b4c7ffe222392370b0109f2294c897ffa04f13a1eb5899acb30ca627aba218b1730ebf92456fdbd0b08e32154e39e202adbd8ddc225009a195ed2faa628f1b7f801619bc3365063941e2a7f61bcfaeae6aa5d8066baa9579210f5d18f7e53c57371ddada66dde5a30a761c337e860a622b1fa65c50ac92e80bfbebffac3cf2b894b537732682f2dedaca7e83f4d7e54424c6d68203cde19972aefe92b1fbb0198b8017d24976c533c40b722b84b68ed86ae254df781ba59dd5f182fe52bfa470b3035f37a528da95de89fd6130af768716b261617e17024c6fe1bba5a42240e67b714437c01395775cb6756b1365ef7415b026803497277d71c735b4563244d70d9c1502fcbbd62fd22ead15f20666ce84cabf7368d45980124e3d66d1d92c0646e8cbb19c403e29d6aa58862dc85a35286da986e68ee04e56ef05a277ded9110b0a1666e29a1ae54dc7cd21bac0244d947521d0b2e94041192c9d53c0e560513c9c248ede5ede09bc3482c56656a3ad0d16befb1c69c83d510ad16fa69a96f5c454ce5ad8edec48046228a4802bce398236a8f8bac85ca1ac65a76b7ffcac98d6a8333887dc8d4452ded434789727caeb510cd4cae6cf834d65e1fc82e74396fbf8f38d20853ae9324154f8f82276468502e373b1472ee60af014bf50a29add2e596bb14bfbadd886c9f3f84886d7fc7d364314256b131c4a02c3feaff5c011d2db863420348e58418e506850c0574b8ee4e885c8321464c17f63cf0bcb60c5505e73e5a503ee3f8f6966262f0d09921ba39d5fbbcd00d32bcb95f0943766790086235c28fee01212fc897393e96ac8bd307f10458d1b269003560e8910b35f2b3c62892dd28c57d1b92cb634ec88bb9ee35b000dae4850441c9ab9d666d3bbd645c227d7e49164013a660bb87fa816b53dedd8d7b429c12d3cb5391bad7228fa357de5915f9e14fb804e7e1e88fb684addbb82c37b0b185227f6d1f090d811e4c4667bc3c1ddbe2bf9b03f16702a07cbfc361fe07f8c8202d9a35b003a9b629cb2c9d7199da9969bac34d30ed335a80cd9acbea5d3524d89d91b6f98e3c136f131182a11c2e276020553b4e7b6453a262aa927c04e3d3b5cfd136135fc5a54e57818053598f48912fed97327f53992367c1c17be7f7ed5a9cab0603e2d643f9a837cb724262195be3bcc85f8ec471ff6acb747f2397bf804801db597bd83a77426db4f5e3a7c92cd43ab1824ec056da221ecbacc4a1ec3ff6837f4026fb57d6decaa33cd194ba9808122091cbf38a27219c2f9f80c4949d3112661718d222ba95f60b10760b8643c2c79eca513a4e57bf621d245a93a5cb086482f27c12e5ff02174341bc50b00cb2340fc239c765f258e7117a9a951050d13d716585a2f0e36d0b4434a8db322527db9d2a1ca0a2ec5d8b223c2e1d9548317ce1a5e76c56b357f969608081db1cfb5096216a5a9def2199413840817371230dd6a35dac1342de8476f0c5d0940ff271c0223f3a19340b5a35e6fc8583d5a31e323ea13d0d3b808c43d55445705abe4354fd91a324ee8fb9fbdc4da96c4fc2e29d133f01c157492351a7dcac1672035490612c31c9f8e9c5f6b953e9188bfb2086874a11ba853da537711a104a371569d926d8cba33585701ac1928a427f10dfa80910bb3e5fd57002d2d088ec4a7abd02c62576e70549ac9910aa6cb987bdea4015d31030ac457d627d3bb15a05c9545eea3794cb2a4c718b2d917f3580b09cb1528983a7bd69c655c39738f16783f465e7c714188319e3315ebb83ca893c9bc918987acaeceb211abda26517c7dc658dbdc3b917a58e4727ed657fd08677578151647b461583c9253d2aca167b05a1e023c89226ac0b50c6466a6c8003e99da717b0f8033d404f993810ee4719562bb3ac4ca139302a35ab76abf6e01965cffdb2977e91a0de4e628427b9919237ef2fb140a4ef2753c918653a95d1345abbfb7a985e53deb2b204076592e72724eb02f772d98b49090a4a14b30f30de0c26fcdadb5fb0c045d18975330046b995f295fed824411ca2a4a1c02bd2612d491ab205a504db8c2661387a18314dd72c8b99691be2640a4789b58c04e8098514337eb268ca2c173aecb2902893765aed2fc6fb6d9e30b71a542416ce209f298a3cfc56cc3a69969f380e3bb28d726a6cd10ba638d40bec0d5d283c7a2ec401fd98ae3604ab9014c2bf4d5e46428b6d0ae657df939b0ebd306323aba00de5ab62638b2fee4a296889300c4431bce44f0c954f10475bfb3021b0a5afcb3429514947a62a0f923417a933bc4485e6952614a5e8e0a39f03e589366230bc0dc614e9e207b726c659f2896a2c3f83d36ef3af58defe0d5f0b6e75aee6cc9bed58c1692b2b4515e2eda93a01baed4e3442a6ae05bf3cfb09f2bc00d4b81e647971315e0b25a4ba61280ffd60ea2e6fad992e1a14b94d500ccb9e74dad144d2e747025f6b3f11c4d5dd18cead4095c3dd55fe58f7d9d04ecd6a02c7d288754b1f729c5b384d1d3600b9f620cca204d36911b82e2494a56806476725a0e0b6413162b1a52c82e8cc89e56b68bf5303760a79ba4a1cbf56bc814d3b1dcbb5513937e0b72da5cf37fee3345244c8de093c2f3c99b6841c6a1842c8e605dad0f86bc5dc67729a86aad01e11818c0280606c9c06b33b0efe2dadb7c69ccaf5a2d8c0648d30c8c44bb2c455b001147ee1f4bed8e15d577a6cfb401af7134209da69e6ac921a0f3e0808c236b8dca64b644993a3f62abfbc37368d4e6a57292ab45c42a1bf368812af3c87de84002a6484500b854297b91b9d968c405eb7afabbb33b542a929a88ea7a836480a8b51293b15e3db4b599950446a2a3931b7df795617111d8a7bbd8d3c8df088b6ada50ca4d6f97b57ca9f6201f90be91bbd9098a0377e595f8ba8bfc618533dd5e82aafb660bcf55b5e1f6555371d1012cee98471135246b297bc3465d0229bb72891527f16b6bafd61897b1e513f5500593f14ead5c767ec094c5be52e87bc586824e85752892c2455f980b9594fa4fa17d9a558cab9b1e2b10f818b4e73763d6198bda6d9b3c51019a5d685af90d98e38d397a9b70440cf8d8a74b1b363250e31664028a15908b88bdbe21edfae061fb7f89ab74b830787f2da8ffa06b2a1b2c4f329efed6f75d468f4a7de539477913eee2323b753264095a1a4754fc2171bac060654ec258b1eea81678345247a4290835560938716e62e2d13be9050efad0989ba3b3d601b03244b655b3a24d0b4d1dfddde721c0fe779fb0a57f9856b378bfbba04e87b66429dfcdfa20f969a8ff0d7b52d21eb30f8ff65de86537b52cc6e9a796477d335efb6ab1762252647d2cffe63c2bd79da0911b6dd6357da459bd6facad60f92938f494bb5a6035d597674014bb38b47d8b58cb0c1d85a811c122483f1d9a6299e0970174563a249fe75ebcd1d3b683c0607303ed0cca93884633defeb76620a62bb4746cb189f4261426a1cd2c2f0057711e64708926816557d2c6a7fd271ea4a281b6d39b7039ff2cc9afb3685cb57284afcfd7488bb6ebd38d1e0243e4dcf6193b0833c5225e07ce4dec270d0a86f11bd7a5d09f51b0e31bb6e5b34873aedfae2113ec752981fffa04c412cbb4ff4690c427c0e91d563a0360e8a23df4e1adb7677f8b0374f721c6f869c6104f9c89d0a0ef02f39cfad1cd4b1e3d5cacc61b1bc45b6cc9110005a26561e8e6623c4334069fc326ebacadb953230ad68571e0ceb3d3539d7351e47963ff7539afb92a46da1f493c877446af27d8762bc48a61c593bb471e4b5b102ef66c6eedcff2b23e02239e80d3d41b68afd198c7c820dc6d7036adbf1e214f0d28abaeb2d730f22249539787d968d673dc9f9343ebd7d04c9d6f0a391f9775ea13e56c18aa0412580d92a8d342c6feca48f9c7464911952932bb94720b008c0025e947d0677a4093c8ed621b87968fcaa514e1607a1ac01e55b1724fd03523ed7581ca8ce76079b5819be0d5314f506230391c8fc0bafe661e18db46305b0084daaabc0b76688138a62f8c82816bc97cdaca58d8c23ee513068d8fd480045ddb700c3c42d9b28894eaa2961259f895ccaaa533a2e0c58152b1126c1902cb587d27fb7af38ec19845332a7b611eae19e45472625e407d8bb00f6af5b44c3d8a1eb8b1fa0fe3cfed825e0ae455f2c270a3539899da1453f33d593ad682c0270367c23df07a9ec7806a2b7924be879a32963bd61702ae6d1cf663dc0ecb0d603cd27dcbd39edccae56c77e8f64743b2db61fb790baf50ca5621f9c857b2bd7897132fd68c4894beb6c4cfa5fe1dee98d2282f63dc95b38bf6d010a19ba7e5b3ab46532c148ec5b4c090e67e4dca5e43ba4a8b0d843ccc4cc89019e3250d4148248e9af4662e04ff8ae71d62c442ac8125d6478df8af69d0f7abf3b6545b58cabd5e4a4cd577087fe51ef2947c80d080ad28ac353c41241aef2966200c1eaa1294ef34f0e3f7128088ecab80f723918653329830bc9f6d550c2212b92e5e8f5afe057c15a169404402c41aaa6b6488602135f5cf867e48d48ea1273115090145058fd2b2224f56d4a8eb6744e63c0ee6d85ecb695f6a3a2148bfbc396691365dce396306215e4c4eb6ef9f95399e1f77e41f8f0d2f2673018b9374a5f20bfc42e8e82bb8b7b5713537a3e07ca2658272226a23082938a9dceb0370e80a851588980421ff7a72f2c5e3f51e6fbdca8428cb9c110ec6eaf54d9ea845503528813c5d671107bd07a2d9052c3a33aee0c1b3bf57974c4f0f450e2b9e7d3aa2c93b3da5a0688f7de9074441d1624a05faf5ed5f5fcfb85118beb7d74f86f723c45f5e5446d6e232684ae9e419381dde36595394f64387882e95181649b6d4a64789806caebe97a9988fdbe8f95a9710e1f7a6141adb80024298c680134e75cd8aab3f6b1b0c64d1a6ce7eac8b2ab7fd214b347c4919db77fa1c9518c5c106b7b379c5ca19bfeb1fe8bb6dd491e6ae4d81fd9f0cfbeb985c6b24c61f5a89d9bdb1f8585ff58206f82800ba46a60508ef746292becde2e41a786f26f5553a5b7bbb7e3d5241bb3d104a810490de34c6410854f7b05d15842b43afd0b4c6e5d38abe8d1c436ea1d8c45045c2c3c73f7de00c65d46e26e648b8eab0c58288884d85345500e45cd7c61f4fca7a1214c443025d0a02cd0a09e17914c1992407744e8e467538f31299c1035f968352b3d45f6333c150a76c28528e440198b75cd6b71056423bca0ed4fd9058ebca4064a476ff6e05b03659dcc093d1654751237173180fe33b127c3e30c20ac9c3de34dd4a4f5155869290e9050c46652511a589d49e9e724da582cf0d131c272cc11c1d08652019ea9bad81052837621278f179481f135435265a26dd126edd4ab685ad686e13ed8f52d0490036e30d050997580c0dcb1fe13e51ee54de6e017c453188ef9ce485d1c1b4d05c00b53cb486ef48235d238d0486c11d43e121fe88ce018cd5ad0db863cb254d1923344eac285330ba3f7363b331a13aa2f72d9b974e63b4d144d218e9d265c105afe4876ca4cc08ee9bd710cd227faed47d33668b9adbdb140682799a1b4958f8dea54c7260ac0e31ff7c3a3cfca761eebaa1cec1993305b1fa19026226b0b5a4f31275b75d1cdff864cc4be20f7f27a8cd966d60d0f59141cd68a98997151ae1741a04acb24d8099739347e41a38ca121486f1fa7d8fba129b2f4d72292c764e0ec4aee44d9e9f05026acd6b33000f8133106e1cc039207e1047add88cf18737c6d793edee875224f3dafac905c5304ef9d7d896c10bff4434e042662894d08c1293885d05edf180b89f549fc0b85c99fee448e3f780e91d46bca0223eae62e2ee979e590cfe9c5f242fa4b530841df54ead4b0af85c5f19d23efabc52591c7c77541adab3703709ad8d45c5a6a741b671c605b889ae1f5ba4d03edc53f702258be7235e35edb6658d75111291aaff87fa6b023a3269e896c1593e00ff2f1e3f8728af17cc2a209614b2069f1edd98a73cc3aedf3c094fc34cded5d20ecaeabba70e96f5ad21737e7f255072bfec055ced391b1eccbd6739dc77217a940ee154862df8a4e4429dfeedf35564880470b926b2bb589f9889e2f21b62fe4e8e7fac4f66a420a8bef519c2bb15e1f3742012ac26dd694871a30294f5f55092913e1e1948ceb2f81dfb0694b66d88056c7b956b0f4c9fd103619091590b74bdb8a08245c36e968792d074e73d317d73b756119e48303547689f7f0489ac5980468dc84fbf1b7c50d030473a7967e69a69114c215a025201e04ea114c386c9b45ceb06dc0644bcc4f39b71e0644717f64e38212c668b3948b729cf78e7abdcae7973673ed715db541f74246cf8bcd9bf81171a304917efa89770d45d8397d7f54905c4ebdfbcc7d602815cef6a7804a3121d4c3dda6689d99fa3d00454be2f8414c0a5c7dd6362de8d33695b4b67926f2fe442784c161eeebac4e99c0706fe350cfbee4f4a64d1e54a218344e97cbd48f7dd4b41909850bede2583e4c0227e00fcb118eb623d170a94ca2477aecc733ee30641f6bf49a9343a1ad96a11c7b7ee2a4093f0c68d9200e85da64a129aa650f69c80d63bb725e89fe640c18c368a4b6eed1f7e86cf5faaa1b8a0e80f1a4e21150d9c2965461cbe3ebc6492017d8865fd2be4f7e0d39abdc867a6975bf787bb9a01f762461c7aad12b8b5265c4acbfe16a09969c7bcb63de745e7dfa63623c482961c197721bd5eb4f412c37a4a265694258032e800bc1282618eec01689d272fb08d4f30adc12f638307e8119b0d4371ef671d0219ed8f46cb26e71f3ff0b4321b3ec10fb1e95afa62ac0bdca1b8253c63cc5199a15e609e6f011ca672ee3479eb0392f52b312b93eb44d1607c4b62e7afabceaf5986c965ed461aa4f25960c08f2158f44830efd3fd63bf7e93ee52c6c3852d4c0f0d7104f23cb06c292afb779950dae77b230810c50086630d315dc0bc09b710c2b55da532c6704c6725cb6b8ac3a08905e90fbddb287b8950a343539dd3868a725ac092094df91b9de39aff9af4f8160871725ab1cfb440b7c282808b0f5c53e5722d390718987bc8d55ace99e7abc6bf099338007613129500beac5e7d2bbdc320ef4fccc873cb609a874ea9f79f3c5f364f018c73080e138626b5748ed9a7256b72444d49058440abab114135251adf65109fcc2a9599664827dd24835140c89ec712849355ed7b1abc2f9ce1c45c6999af33a3c6124e85dabcb8f571173b32828d7b693ceae5f133d024c1e0086a3d93c875b5192ca68a4e61589ec861f14571b4e88a92e2986eac8192333fae30c739ce02aaedfd91b6ffc269ac9123366140f6dcf789db1fcb28c1701a3cd7ff3d21b5e62c45cf7739a093337327064708f9a0c5355cfb4f90ccc416b237a91108046585f6ac15c1fd591aae9177cafbae9a7a9cd823dc896ab51ef196e502718f967b8c40baad6a86accbf69a44df5cd4de3bf7842a5c7bc23360c31acdb93ba0eb43baef1a0db99a924892298997ea0ff3e3814ac43031ee3cbcb3e39b6c3fb992e83423bcf53b1ce20011da6afc0b2ed3ed53c56ec95af03942d7c296b4a4916e5366f4f296204070b8b60e53f910f68abe2f7cd059090c1d4049a07197272f63569cb67c60f21c552099de213cb67bf82a2b79408d1d0dea583ed63f531594ab71676603b4dd54269328c4498db0ddb78e378c11777049159bd30bdaed7e23132c6d63e9e55c4f123a56eb678eca24cdd5decf6ab30792ce69e1ff675100b705543c64a903572d7d9aacd29d029228c38471bcf4a7e457719eb05d6cbdff2239eb640c89aefa0c30a9931cf8fd4968fb2253817d9eb37deff7666daae970df00f98d27db76ac8b1766a4ae889fa730e275a2348af6e6022667af2ebbe85af55907ef7c2f5ff8642d2f4a8edb49569144fa100aa5b6e06036c4b45279599b72a7928b4dca1b689f36d7a6e25cb588724fcefe1f847aeca50ccf1a6bdf37e91171f61402435384780d58bd70c142e71ee7e5ec3f45456b559c6ce390b303832b333d6cbed9b7305051478f9eb2792771035b4fbc1df91afa189713d772224410e7ed2f99e47724dd65ccf9260945f9df168dc3eccc6c1e918b0cc78ace6f5e86e88207e4470fdd5586fe2458cdc6be013f955604d33f473fe32203f78c520da8c4250b748249574a294362555df189b571ae9be57e90070149f41f740ae7386545bdb1b2d0b1e19411c01a1b5acdd750b1a78a69adcee3eed25a2ec5ee24ce5f28f464ae573417a2f791bb7bf5d4b1be55a660a639e7d792e51b7348ce970e111e4b25046517f77d3796ea5696dcbd3fdcc564dbdd3cf92deb293fa9b59d1a6cbb6e8d729db523f21ba5232a349152b902ec2cc0309d5e96ccc1be771592edc17c4b83e1137002679bc285c0551a4c995e47ab2474a13c7eaa970f91a03a3d886d6be57377a1f4b832545c8924702be98aca4a13261e97814d91021e3d40c634c628f9284113914418d7fe718bea9dc0cbcde8edce3b96301f1c4102aa93626622918d6792cd9f1df8d81ffb2cfc53c373ead6575e2bd566d9cfd9c5ed7b784148fc20c6cfc044b31e895e6ab053564a69c6920fc8c6156af8f701a6945786f2a5f37b2b0556929a922a29823693c461424d0bce029612131954d22d9f58dcbb2c4ee9b9e4a498d59779710197569f07cb158a431859fa6656eca2edc35c5e6c59d14ecb48d02a2057f8c2174d504904ff673cf9760fd57b0b7f4a5253e4e17eae6bbbb96bddced259e0afc2bc756f19510f9438d7e794d5efafe9e03717105c05a0d38b9bdd458725bd984ab1a34bf6dd4a403d24833d94f1f6494f7d34955a29d8b4bc8fd274e72668e1e13486a1dd27fd5b267ae3a6ae6f174de316820197c4027dfff22c1f20430dcd015e4fee8d0b4c4b047377ba261f8462cdf848fcb581818112a65ae22965f13224019a1f7466c7147d0c355b512183e2e3380414b08de4162924c4e425236d447255b23d3c5a247547a082850c856cbd606947304ce2132802bdf0bc187843dd7836743c51f40546a1bc3436c6fc56d3ac6ad2d283920a1fd71ab06974b55f472a70e0ed8b0c3ed6abdd247a73af611a383704c57c49a55c548d9c665c222f156f1ac472f891d39cf3ca6e1f0ccfa46200c03c84ea7ab270adc1228d406c922bf5d87b4882e2ec66932f0c0ed565081c23a00f0accc8cefa3bf93eb0f5111e1e8bdb92cbfd0258792773858890c5d70a7453a0e5318d7854ad51dc3b160d7073c3f6ee803d5dda67526166f537e30208d523be3a86311b2df11af7873f3a14718d0ca7421d1414235653e6e823ad9e6fc210136798c62734eaacb065ffa2a15fac6fa6268ec32ee882fa1f155aba192f5b76710e41721df8c55bc8df9359bf8e052a39b60e5a34fb76cab143f78e10ee283ed8e586440304fa42d62154739ed91a90f12e23bb516d53a9c0e39a5b3d8b56c09500ea91e58530f3bddd5a6730a8000e6a26499538009a60074c2067784486054294c739155a5733ba7ccf8703115a7c195491730b337ac166ea6350d2e27720eafe902b570e1144178a52f44c7e446304146b411618133808954d1a76add8af97aaea0da613e366e71651c60196a2fa7ff44a9c010b5cb9f46a4dfa9e8c52ae8d582d63d3189ffd9d4c0eeeb97c1abdcb157f42490744357835c9c2e5449d01ccdecd67d42088ea666db0302c115aa077f517d0b86e598b7ba0d25740effaf7667420733afdd420152acd00edcf69cabf39982d381c800cf1bb3e024841f5c47e73fdddf61ed90d938939ab65610d9d4d4265f36e704b81231a1e59a733a5f5dff80d6944c5e9f45e965df3c0a19ca4a091271bf79ae84a43d9efd88a4daf89afb45b3bc50b4cd9adf48b24a467e968dd9e2ab587119fd74fdac89ac0d7a715bb65944a5352636f16aced636955b538d69a74139c993f294b63aa83b0503aa2efb950d06e963b51d8b61c3aaa47776c84c653bc9d4583dabbc2d07b52316c4a172ce1d579c4ebe11381fcbdad757ffaba74ad10a444895c58eb67c7bcb3ea81d2c93510e45c541bef3195261f31d9ca4585f6e3421e93aa36f90b23b08cd65ebe635e2a51641c8194ed0d51e9b91d4c0f8d8569d8f41223ef53f436cb9d40f0eff11ec490f3ac038bbdb13494d2d5f8b1bf1f24d646abc2271b87a8d4fa5a81acb7551ae66d9309edc431d3aba054328b1c554bdac7a9e83ada30d0def5deed8787a7efcc13be51ed1388068efc7ed2cc7ba24a6ba1b0c4736a63d99312dbf90e45b51f22be53ccbae85497724bacaf311c117e6387d8f9c2701dee0834e578bf22bc62f01ea0dbd1130f43cb9de0b7acc64c58455be81436479eff3a96748ca217d449bb8632a7657a5a791c7660f0ea242c0780a02091e8423f87b49f4d8f154bdfd0a126e8a531811f4248f2f181830d8eeb4adb5137a31b17be575b4e14af47d953e99a4bcd228511a55186891d4387eaef9589c10f40f5c83cc6048e67d0431c4cd0e160b58987555fcf54e8d2feeae28ea9e995f77ebadea0680b86f1e9197f0b37e0e18531ea4f0a846cd211ea5f543e87b195d6dc653f85535e889d8e6396b25b5e9fc3f216eb6600f2f1d727b475b1cc3a4d4e4dac37dbc46073e8747b3a68b1403a9634ba789f9bd81125b6f2392a7899d2a31b7be0f45cbe928eb08f468f0fabcd4ed41ea9815f5b18858b14b204bffe256968210416b1c51fd93258602e1d05aad9c6350af2de2b7153da3a7f3a8b475964c6c3bc5db4818656f1ccf9a3cb83e39ecd4dffd8e15a69c825986541317219747a1270b49d0d42e99772854b4abc46e61b3cb822f6b29dbfa5978110f195f3b4ab64e446f023299dbe2645f7a5d7d35c254480e5c05b1c7d340d3448bcdf8d96994ae6e62c858bf6c11aad5552a4730ab57dc8e226dcf9feaf231a4e7fdda69488eaede636bec3b32a9d053343af3085034eb110991f2558cb7a62d15edacdb703412e5b8a2947a5f2e1c4e57a3eec982d9ac0f492318030126d79c88455b270d08dbcaae6fa89a2d90043e3f045f4a537b7f3542a0e6788538105c2251b7a161a6c3479fedf868f2ad4a9dbaafd8eb544927ef80ab5fd2ab51bef2e168316082eeb712054653785d9bb1506b7c24c673a6063a969ed4e67bd30094235e271a52baa9dc689967ee2fb23c3af58bd37b0ddba5200008af50ca6f7625a50e551356a36a68e0d47b1a9b96cae96f8d3dc0d0e5079022eb50a88da2656dc9964244e409a057005a4deb2e9a945644125b7873f68156f0880cabeb95743e699d6e5b76950d855587d9b08833fca3020c77b01714462450954bedd688e579e2c2d63831745ee071b5821755ebc94aefd1557c7139293931f410bca75a2741518f98c7f2889e0ebae50881314d742784478744c407c684ca963eabc9622939818531439b233c2e63faf27e52d7968670c06427a6f91b452a3c810625f0b5170fc64c789b6c1c5b067cee0266630348a99dca853c29326f03b3f5db0e9427330c68aa9d9e141d9f1958ea8d39d34d0c2ea24eab1578edd4ad242f43835aa7445be9446a75486f383db4c8c8db522ecd370fe74bfead725226d393f4eda6965a869655ef2bd6f314e5fd7720aba2f24ba03422c29aee450be74b9580ea10adb0a7c2317958f039ed326f60645f2d150570c09ea02aa81fe79d1b2118e994b4d960029be1967fb6e81f5657d1682ec609b305539af047d1248b41f3e6823d4abc210aa094f09fb326028e68d9219050c60dcb482779ba16519ee24c1c8bdcf159fcd66b0f4565bd675d75cab7d6bdb10bf2f68fec8369bceb6a7c38df3ac1d67b9224f463b1032903124a8844f23cc2a86510a85a5138d99fd2d1534c48cc38065658344e5836884dcd72e46928d8648f661b95d359a6d40867a70dac659adc085fa0257239b43117d5cb62b3b8fe8cad9d2468cc2602158190e89c17c13ce30b7d92bfc5b4459bac594a042f7a45ad97c2434a49457ccab78700ca09f4d58c38a4534e705159f40d31b7958a5f330826aaff727675ae6601295985dacd169f1703c1896d23131d26af831dfcc499c30530a44a8c6c6964a0e3a867aeb1ea8fc229060af427d55fa7614b2284e4a2db695a077ac8aabc0109268e8fc8729ec941d7e7036ae6a8650e8ec58cf9091b76cc31d6e2c4b9499973739df085d3caa8c72af1d01167bd80382d94fe9ee5d419d15a00390a9e77cbc24d9fd20981f0251c0ea5ef41e59207bb25fd9f71c074ce69ddcd9789952e1488f4027d28aa695ecaceea45429b56b7ead4bf2733fa12350db0f0a3ef7e09b2279dc8ef70ccc94cd86f232d412c4606a6e58b2dc02e27803271ab92d0b98ced8a0fb05746950e49a9baf84583bea68bbc3c33a57f489181578063ad148ac2602b9681ac473b8122d68f3ecb0f32c91fb6e91d187340dde5576e3f353519477f58aa9122a103334719f69d0c7462a6d99f7473dbc7e8d1078f04dc5ebc9b5b100c599cda5fc0278790688ad355ee2b988369fc9845866438a62556fec241b8ad610af75b42bef01b58323b12aa04a34d53d7e71cf51f81472ccd4c344b2a38577cdcb1f5dfe220d69c586791a5a071546526da03884991a2cf4d1cac457ab65a5a151bf19e5000f143b0bf7aae23e91cb10cfc5a265ec498412e471dcb6fb81150a8be3caf138e10d08565bb5e36fc50e4c3d7aa5d64205e36ecc0b867d2d5718465ed514e285e8f72a83b63ada99918ea643a111d22099a2188c1c781e78686a04113e17ef29d1d64971bb42e3f231bbc5dd50e90972809ca91197d200a15f1c6649c5c3ed8ac7226bd05bb45fc40251ac1ef2f19d77747c61f4b31235815d87281650ad396a28bdc70cfb9f35b8acca24cd26d627954888e66bdd8c2e63bf8a6b4ddd6870aa9d14794fea8c145c2692100956be60bf7a1909940dd5c486fdebd014c4dfa83bf3f3246d89a101eafc67cb3b0c7003c784cb8af70c256e1e97641b17cab0e19f9e2c9abb86906c67edd3704c322a24099c1091fd1be7abaf8f368e744f84ecd02c7c26719ac6bc1bfdd66b4054e64fba5619d5c3cc27a69ceb60528b002cad4c7d61bf2b18454e638ae1c2081dc43cc753906fd4a7ec7c2bd1cf62a445d1befbcd6420962f4e1e82ccec26c23ad0541bbd88092735e53afc95e7a21a048938e4b942795fc8cac1bd6cfdc26ab02417f6c08653c3fba0a1db89cc6c65a94facfd38144b6c76035f34fc7069e339986fbd9a7bcb1703f7035c7e30be4f059eda9baaad47c0ec0a4151fa538137226866ee3861021ed0734a3abd5f28af4e16fc4ed5ac80f04ea1b0b67b73ddf7a6890a0a5e6439b103d069f2c403ade093d8538db0651514f3aab0820d82589429c8f289767a5c0565840ae08c4a768e33ae9cc7ccfdc512691f0064668aa2e61687c524e07ffec12464ee40ffba109977c04eb475c032c98b95f363e9c22f31b363b522ee52121a52f5eeef485df4b695f33bb64ab006c9dcf82d3c7950a8a6a7366110fa6626221f2d354e477b04315bebfb906663bda1d03e8764402beec3906124f3374dda5f88bfee190150cbe1385fec3cb6580183a98c4e4eb87c15a88ce382e91cf7bce9d43eede2aa8bcfeee94aa97741ab436267daab5a7cae82869427082d6d0997bf72e0fa68265641ed3a4fa9f83885997f442889664c06d7b3d9bd10d2acc6a30019f7a7d36c8aaa82edf8af896f389304d72eac7bd7166b4725a389abe93e3a7e731f3b64ca9087c169999577bf208f136967f32ea41db0c0f23cb6d6890943d515e0685475356fea7ec93b32ca5e4a9efe38c16b8432dae87d83a57d981389e4fb0732b1986a2662e2caf6de34d4b3201a376b5106fe1ec6ef74e42da8afb0fbdbb965e095d99bf6a8669fbf1d883b550931a2a7bd28b016797962511b191053c7ceeb354df513a23f6fd51f382c99feb806eed0e6769d7d8a0028801d1fb419e7845f4c47ec724c2b657d970b8014b477bd9e31d402bc200229c3863cd305de728277585206c7ad769e99514236021feba1a3d3c74a0a215b7049b984b78aa003433f551d4b4cd3dbe2e8236120fbd6449a4c4464e68a57a8a5d8cc5c0163dd3b759aab4da7a60c4e1c2491371ff8166f7351ca6dba2678810cb49bfb657d307a6821b3b9837f882e878959d52afda7f69cb712ae3e1869255469153dff982a6a92aac4642df0b2da974fb81f4bbd9083b1c4401c7d131e0f791bc8b481543215b77fbcc50dd61570295493498bf517deea739f9dca6f9dc62f9293a90290acf14562c18cd44d7ee714764f4d1f85b3efa0e2777510cfd038cb91cdb6a53ae2c341505137b82d704d17f419477d2922f10480e237fafe8430f8112b80d3655e1aa8cb4ee33fba3c1c28cf87b7181d9bdb20d1e02564ccfefec62bba101bec1307cc94282fb4eee8a90a50e3adfd06c8923ec5b5de167d7f4cbfcf3f5f895e8ffde6368c68b820c9252829aff6978dec874f7619a30494208252f7eef3e4a8b23ec6be92b18f7a8791556ad9ed95d38155a1bd967735a088b8f35fc9593ff62e9a5be755387154c6693139b9eac031363f7edf6d1c81ffb75dcfd5afc132f070fc5b08165db4a24c9fa403ff26a152543e67abf365464e153858d216596c52d905c0f0a7d454e6c5cc8f82d6ef483eef135afd9232714f12dd5307ab80d868f5befaff53cc0caba471a32ccb6cc911ebf2e853634323955f85f69845ebb0008f1bd80f117e55d198e945ef5a4a8b34e84b6b9773d0121e6e5053a34d80f829eda275710103d16b4bbf7f7fe6068d62ba114dab3ceef47147b6fb1074b10088f5572790d446d0df050d445d1d96c4f38d596c340bec637748bba834fc727217cb9c50ebc20006e7aac1ebc4dec471f1da4bb8ba58a212b8704d0d86eb8f395ce7b883ecd5b713a654aed8f90312f3f7b9f55a1db9f1c75232b6154273d64c84aa697b8d19c0e973be1fcf795378b91358a2db3ee5b911b5db93d52b385d10f16edfaf1680a2916efa188fab36bcc9b9f282908d1ed5d63c72657946af3a8a2170ba4cd7552eeba9e46e8976050936242a91a09ff002e8e1dff0025cc226feff752674ec23b05a081166f72b235ba88fb916e0d808a8f481dc5225ccb41eb43a167d47ef730b3c310b05650e93c8aeeb422b9befa3fe868909f888cca0a6e9fae1e0754cf92e0880b9fe0f37f5fc7df1e63eccd52dfe33f3aa99317797c6e5397eb9f76a570d3095fa0bb0b4d34fc96457cfa363bdf28505fc8d5a38290ff0b338cc5ebfe9b512bc2fa08cceb672168367c6d9e5d27c6cf1b77f7f383ad32c73f1d84ce2576d0a6a66fafc35e2d22b0da44b2a4ef12a849c910de52762b77f376c26b3efd27629e5ead5d7e6907ef32a295b976d2f316e67c518b809b7c7b5d0932a80a84ffd4f184e5f5d86374d6bcb9c3af91ff4b3aedffa925f70e5ae8ff5c687139b42221972c4136599f6b512be06ce99982ce8cd5db52c81581aab21aac49e065a7985374b483893cb05bc020e005cc5bf455ec87ef3cdcc918fa0cbda5f9c6944cdc011ee98829745f5cf41cb176027d1e960f1e902e83f7c506a45a85235fb0eb8fc2d83a9ffa117d66fe113748edce79075e6029bb0ebb598317bb72e108fd83352ea300905310b59b5003f10f60ea1ef9637c5f9ba0ccd7ff5397e66c0979959a39e956d945fc4098a805e3397bf7882edab137b5c38801ab8fb2da348b9217d7d60892528bf741490b038578af93e4b87674f1614ef423407bd0f1ff5c7169755b17ea9fe84bdebc2c9fd621354041e868a72556c4f2fd892704878f6a3d00f4c5b6be6bfbda73d1ede3953d09b3798670751a349726a442d19c9a51216bcd25bdbe4f0a5682a6d5d537612055fe73dc85878e0a39354c8358e6490a1e2b67ed489fa8aaff6e2f7106bb61273b3f3453771baa8248f99961671eb9ee031ed616c53ae888e7e5327b899f92ecb0ba031a576bc58ccce022e93e6140d87b2e461bd1dde8faba1a25394b0ce74aed81c55310d16303b815848cc99b8d72c6b0e98ec9d4be63ba3ef9569ebc18b433434d49c5f9a4577dde5c96e8207a9cc12f42c3f0bc1caa4c34a10664a5fd7383bd15171495a7167e99d16198ae2e8dfde7a254bb9ff72f6a1bae5eba2a8ad94a606f2e16f550f21d9bd0d694f4e7aa016c92c235a3e0578d3523084ace430ec9ae9bb614aa2165cd7abec0342532891edb9eed40604a33c321b0effe208b828e2879a882761004e2865c2936a40706ca6a87f98750a955c5d79a3be65db3148cf58aa0f7732966d6af20fd642111b4b65aa359ff43e7e528b6b1a2dde239c75775cc7befc4d237b0f1efa9eaef2d1e10247fabb0ded2eb2051100187e9a9790cb6828d34c3f0dfb5d59bf7fe6468ad73694bc19d6a0cafcc610a137229c7a6865515fd307bda1ffd6c5fae9ab6f13f7d13caa887d87b4f5870d3fc999d5d61fd4f64ed1a51dbd23b4922b1aa526044b296c9ee765e9f1c462cae9e5b49751b0f4e8534ff03cde978d66f02579934ca2edeb1651165383ea43e83af41e4e988dd3e3c84e6fa36aafcce8c3801bbb342090c248d23d0e38de61fbd9e92a627bdc069b6f1099efaf852fa73d336a9a323b9898302f1248ad912f12683517d892d340bdd6ca6b5770bdd080cb0a9a69d1e711bfe38ab58f18815c5701183d4c8d505725ed93108e539553ccda995f5b197ba3b4645d628ead6034cdf9f197fcc82d84263a569162b5a878e436c424a92b16faaa2199b09d3861e3296c8855d1c3615d179a4bd043254009c259ae6463ccd7568174bddc2acad92b444e1d748f357e6d065fee2a48b466cd560d87f2f2bd74f0036d0d7aa77639c91a588918dd253000b4748e89d1d4f239fb1027013cb4afdbd22557160528d78d33eb9e1bd085830e36ced12490c99cce7616cdbe8a35d457106c8898ae4006bcc0158a5f6441a1a502e64ad13047e474bc4b6d0d15e5b1e2ce1a22dbcbcde8c3d4150e338ba7c9f9b8a28c9b250e3505a7d33cba541992fcd8863c84e9b44a223670a84d8cef1a4e86f30fc251d393b1613b4205f131cd1c8e9c19baff8f709a910cdc6dbd11455f52e6f6f887a4061830d1c391caa122c21fc4b0815d0ad49485910e08e9085645504f0b413b6c0de9bc992353c241641f120422018299fc91e3489dd6358d0cc699575469b810a5392e1b24149cb68e06dce6eab408351e1d8b3f882c06809b3d4b7f535b790486574caf29ecdec00ecf94c52f49660999adee1084a9cd5fffd565d1c17a9fdf6973b169cf6312b15cf1b4c8adc179f572ad9c6e9f20aba0e54d29af0cf290982e62b76ae89a1822e447541b9a6dc24d36a0b21a180d3fba35379bf0a0010a7c5ded04f6e910ea1e9aadb858a51665eeff716042011afc3da6f7080914d94724238fede5242904786ff9bbe38db334b8fa112f4849bafdda426e94eabbd2c116099fa9ed19a8824b3c8b2ed86a49b5656b853da0ca73529ecde2d2e7c025695adf4de358c0b81d0213576c1e0ef798ee899608f22c3e5dcb2c245266462fe9830b14b16ab778725919528fc864edd3554daad1050b0db1629ce86ead503b745029b252fa501efceb61603507989e655060244d91c909f36c9865ab8aab971e637ebbb4127d1e2438a79a7821d07eaa3c9957090e77512f178f58e375eade0bcbdcdf7c3d91e2f6ca8855bea4ebfa53885d7e11168b287219c03692302506f34316681c7f838cfa9056b2516d8621e7eb3be7370f4e4ea73826660b27da10446b66ed10a885d4505eef99140d31d0be27ee0a7ffebe01cffa16523d4c73c9857b6cbfa4f16bb0d39ed164fd33931ff615e08bb1ae85bc2c8906c8d6cf2221c120674082e084cbc7783563777e2c2707625b974d0290676e41493b7974571501b38f0cc89b071b41fa37ca1239e506ed24c55332e46e3d1316acaf0cad0bd80f52e536f68a62f28817de2203066cbb39b0073521d93aee713a5e8038da24f163e9da6ffec286f147c91404a580d40c434d2101f09ee32ef587a4b82c09986669cb8276ead5db911f9e05a26725921a30a525c18d8eeead25a0c01b0572497a4de4056b48f35affe8ab4fdccbd4a0fd83fa40ea015700f5efdc60f863a40272099225c22f9b98d21ecc104a8eb788496e6862f446e94abfc983d4c21af8fc8de05071cc28ce35ee134de12a1fddafb11bd4d3976ea2977e3b6a8233dc82cc0fcb07e25642bed4a4d7f3425da8231e74340955e045e9f025e651949768021cb337fbd6a3c0332fcd55c251087581f4ddc1c1b440d3bc977c08dad1bb858b5f2fe0c31e34c80531179e720b7a6f1d6d7cf28f2874ab5041db4fd13e34fa950239ce599d1bd909ec5d86d8f3ce2840d2f193e6af7fe074c830e4303949f4837cc38faf5a7e4c217d015aee245fc70f95792fa09bdbcc785f0033a863baa30b7210b28bceb738f35ac507f17e7363ef749a5645ffe3c746c770aceaedcdccf8d14dc4e7459bda6bebf6f5d545835e705e3e64a7c1256516816aeec22d8cd7d0c8067f79d76434331667d40edac8904718c8f27530142286d4e88493b0cb01dc8d5043a5b5bc4f2d2b4d91419a0efd80c86dede4b5a58f4919d613ce87d8a8c7f6367139293c26bef3028e4ed3db3128616a42db426ef90d255d9e0c80fb24e92725a9246852eb43f25b601dd7139d119703f912a395f4940dd6af0d9f9ece91e405127de39ad3b2ecacf1568489562f181e9f21eddfdf8b51bb6d14e52335f481b19ba61fc6398b1688d0e2edede3127080d0c795bc9074173c5e2c76889e18a3852a385ee24f4a75e6c23f50f14fbe3892908e270ef15903e4caa6c8689170cca80c506dbee01dea651670b93485ed65beb8994aaec412afb154be9314fd70fb8df4ce7d5359223d0ff8cee90ea2281eecab742a1f22c2d26396dc781024b361b80362a4d87162e4265fd825d6a2d891f78a4ca69ac1b4add06443c5a91c7b4dcdfea7136cd562b59d461c3a5e849d23b7c61613532587865d1f487c08265556892c088371c139922fe7c882c330b505ce65632bf850bc12d90248e9481c190ca138b31d0ac9e58db76c04acb7bc94361fe03ad82a1c5279dbce885c4a01e62187bcb3291dc39ea9c6d05751aa4df90c00a96b283b2d209003f12072c9b9abae573a2c97acbc91f1a4293fe44926303114b9cae603953df4ff66119756946874250e8c5ef34fd66d07157341af51955b97a32de9f912e62287b7bcb15840b62d2228e59d7987b6058456f1cb37e02f124a180ee5d5c44a883adb15cad73d3f90deded0bc6b59d5f5620c39d602d6fff17abae80c03d25986842366b51dd7b1a4b45dc02531cf74b29f8638bf434de17c6d34ed64aa6676b01512896694613c6b46c75ae6f2013b4793c8c49a5ee0b051924ae1d76849b54392613389f49d7110ba5fa3058be97ece45e01eeadd0b597244ddee24301ad64ea4eafdd08105733fd2dee58328bfe445ea5de9855dc6b1550967e4ea546d6b59ebdd3681944915f38780a1501a1a2e986527313b27a1e57e2d08e8f110430442da4cdf4ed658954c775bf4d6b8fd84eef8e28d4719cfa80d3f07a1ad3afa6f93aa42e72c353992c23dd37166e0ff2a25cb31f36431774c23c38de64b0b8e7b936408b1edf48d24e88df92892e574628c56eefd9256a4b18698be254c4fb893b75c747765072c3f8a2fb88c1ed64698b8be1d57a9c6885208867edaab00ba5631327f7fe8e9597a31bab87c6d5e21fe8f96cdceca5aef44988c1476cf2f40257413e23fa8645f5fb8618c747aced0d54d9c0bc849bf0c5c318c487e694c5741772dc2e032c84f3b3c21b8854290829579976de9063b2b1fac9fa0c816af31b42c449259d9c5a9c861c5368a68241a45fdfa863a6f95e2510389c4f78ad51808d96d823f23373c4f5236cd740e4486867f567fc609fcaec83e9338059ef9e6d043ed79af78d3cdc19696ed2fd667cf877b9b1e6ff79ba278529bfb35b56bb08900c964aaba2cb27686cae06f35bc56a1a1f7cda97fccb63a44a2c4cd97be72199d6aa63d53ca0c03b62c26dd0f66d144e1860181ee7cbd498d5700a993e64795146a7c80e1b14df73af34f5c774386f1b59c3963b1589467b1202b89c96b36ce35375f48ad91159f32b8a6815b993599225b3a796db2d808060a25b9789eda8571c0f25009e7dfa0afaaa151289a3142a84cd14ddb7d25949f0a08952d26a7b9853369e1fa140dd74a6d76f59a7bb3ddd3da9c72d4bfbb69bcbf29f99f886cd816243c15b83efc11041a502c95c90b3a5458f100dd596ea2077d3c7ff3264c1f4685f58616a32919ec8bbd79aec216522a3db4cdb6eedf8fd0e86cbb813f7afab3bd6dde6feaad0dd778c3ed9dc6b8a9ee2084425bb5acd8737e0a4067cb278352bfc3ca404adadadc0af4fa0aabd08d11438fe86ea1dd5d87593e55e0d25db2a37812d0181e91f06dd87d60babf1d0e08dd3114fe92e03d0c4a909c93118636f351e1d304cf196882cb7d936dfcb0c7a04e64e6adbb7b6e542d804687fdfa9450f7e722495abedd5b9019181f9c33ab979ce23d4ebac0b004b4079104ebab27dcd74fc96c262c21c1bd90a5354784c5edb05fe39e71a959b047534e36ff74370e86c6e7cc22bc936dfd258e5003c9eb34554aa6d32f0d3aebbe3b80def34b6e5a403ecc6b0731d95afa4283ed6fc42d5bdcbcd7bbfa0b13ebcd056de5dd1cd0e47dbde32b16532c6584d746066c6b8b6b0bf6f327d5429c1d2c185191c641ecaf61cca56e00b21da2dca4f5810bb96bac5a2d301cb8752bec7431c810b7500c493556fec7e839f321353e881ae08a09a421586d5f9c5e02f80863b1b492bae7a7cd5ae411766a1c1db8b786feec9e2146093bf4bd5ab83a2257d4c83f42ae5487e98ee69d58312f98e9a14697db35e2eedfd8676cd4df90b814e9229821a89aa18da2b8f1e01a39f14309575c598402ac2ac04c8da1205e5bf4601069581e291b803c65fcc3b69f0b3d3f0d40239d9ac5b2c77bf040926b0d7db961416988d6aefa9af8779cefeb3630cc3c8aebd03aad8e3151d5c5d3368fdca11eebef584541a115e15a57b533f12c3544db81a1ca922ab3d5f5cef0cba783cff8682656994912b318451eddc71b6c7a0f69c1cc5d7d4e01486c28d9f6f0f65e87b79c281055f058bcc0bcaf6895f3560a67b926fddb9de2144d61f92e97fb3aec100fc1faea7030610ecf8a19f184e4839f47ddcbf2d69dc34d0e1126a815a2454c5b00d0732ab656c76a6ab5bd58ce0e938e802b51eb33651c0f68ce35c7238d37acdd72eba970a14e68e067f5ec1b808ea22f9e38c7d784b4f019f95443f7e98117421eed302e8e695d304d65952f2e2ec07fab79dc710abbbb14ddc931fb87695af5a2c713a54039c3398d08532382b933b4d438c2031d95d3d10b7ee6f134890bb5eae9c38c111aa044e70fcbb2ef2462416ab3af6ff05627c064d2f21f9ce8cb5acc9b64a6ae17a6db66850923e6baac5402e02372c744c7b3032efaebc62d6776eb5cdd5f01205770d827fbb7a454ff4db61ff686ea87d51c7b479261817db872c8ff2826909042a320f1872f78a90a4ca0aa0428d10a0d23c4e4f02322c5f1758176a64d4647ff85533761b16bb805ea7a61e500013c1f3fa986acfca730f46b042cfd31a66bfab842b4610d008efd7e6cbd15ce8561b27207faa7fbda6e68284c8997b9aa25b010b6ca594f9c3e76134368bece986a39bf49a3873797c4288afe01b1ab03ac904b6624837c027b88957b38d92b939046a0bd26b3fa1cf1678c3590e84939691283e15274380b76a4b23d784fedfaa4b55c834115b6346d063ad5675c5535aa0a931ba551b47f54175ae429478016a7fbbf8568d09c0fdc74db8962d5a58cf8eb18c76cb40404a67ef98331293bfb05ca03c00f454309e67aaa58553f70a408762820b2c3fd462312fdcd4c14be8174246873160f7c633b2cfa97890ced4c88bee834b165111ca396a292e94bf71ecb4259a71a0fe31a001cdfbe307b00b923eb4c2f67313ee4b4958e6a3d1a0472233d5baeb67ba581db66d1235d44fc124f3596f89d728d2af891b1d1d83dfccb91afcfcf1e8cc25ae62aaeff9ae6f0c9139672fca3461b81ae0152a949183c33fd606d06ed3327557f4fe74edeca12617c41a901fb0a64e7edcba4203e5de3318d96f8bfa32fff38ae4c625ca6b51c20b7b1dcb9ac423a0baf2f76ad10de361492c7707dd602d2e2b5a44b31248435d5179a6b501426cba4fb5762444bc77399af8515c013869c3c191088d1f6285e9fa51847eebd1ac439ea63d021167ec161320df4763556fa558fb4620018f36d108a004610208b86f528d9ba678674ca53d07d2c2d937f64f414d35f54ba207cdb9b151004369aa8eb312c36a3bef0cd314ae1b7075cb19c3a324e5b77897efea4fba8372b1442244e8fa34b8a555d3c48f3f7fd8235f6e6265ca3489649f44ca5c83b042d74d79881abf7fb1cbf3dc45651625fe33f9a6dab58705270887a8519d1165c0f023308da442e0e18e49aadd63da69f0d55d9a97d8a14f1020e48f36c767fe3942036ea90dafacceb1595b6f91e53edc1828fb0d8d8ef59d2a8d7b06ad332e9a5f268b63219e226623f71196c540e91140ffda102677e50f0824c606d076785ddc8c8ca09dcc8c9a76a61388c7006424d67260976cf0f3fbcbdfdab092f790a8b35bd9457125eb1bbfade087f4e991a17126174e333cac89c530603ac2af03c58d60ca1152429a2ca2a0632a3c6fe531711bba9216164fe981ef7fd1e9e59e556f428c187ecfd4895a4b90277d46301c849c154e866870623f5ea2d86f6e6ec1eddf00b4f40f916d4d1cf6b1f4640a0f24e71f6022fe5db64d9f374196768df4254ec8bbd74cfdcf7c41c0b3c646f25f3629a07707dc9f6dca6d49617bbbd13026b337ae05a3e0df5de29a844f03225633927f82bc127eb262750bc386ff4b06263afb1682729d24682645cf24c4e9db346c3f85d8640e3555e15bbc27013f8ae26c594946bf54f106e4b57ae5e8f58b3495c51ce5d12a99a2c1c13c203d46726a1163eb12b86ffedac080d8cc92f8239718399793b791614b1c946e49ee22ca0faf679ed48cb8526159320f1a4a1daff2e77aafc5340fb55698d500406b5ca16445e1938cf5684222733528c89c382946cdaedb25e24697c7f4c4b806ed504813c88f1b2b0ea9f44b0ba1c7771436301a9cf4046b72673f0cdd1b6637400841dd86fa2b0275f2c68386ae8277cb6a64cb1918fcbaeaec11be3fb77b848d0d02968e476d82339269f6191716ff17c0d95d8f4d3454765884d101518b16d5353a75030f23c0e70054e4685d31d93a09cd7e084d5d996da90b567a84364d98e712f8914ebed2298f7b4e14e602f504288a78bf55c7fed331fe6b1fc989468832db02b3337ada255d4db57fccbb6aa9bc00a01ac60b426d21acd2b3a6b77f7bd14e7069e38975d0ad1692b033c3388254e33e4807128c29d7348ff2c9821c41826a03a690b8531d63bf6cc88c7519572b807e3e05b90d28f3a81bf8af53a54ed40f03fd0719158f92f164320963b915fec910fbb70a8db27175519daf51efe60cf269393a9fe62547027041d8dd840c64a5dd9f723d86457fec075fce22161e6e5f2c37d761ab3bf2580b5277ccb0e72f1dbdb57dc334abb4e5d2ab9c85c3d3ff020bb21417ae4320b5eb7500b1998bbdaa5c11c0ab06b0d6b71436d09ee86b2d0536e645f8bdfabb51f6400a87148a3b2ef1a90f0cb6e9ee9fd5510235f44bb4d82800eaf071fb8a3954558aa656cf4014207252a07e8ac1b8653d8fca767cf9a4a7111e64074a8570cdf65cafe0613d95cc65040584e4a776c639a4149984aa03fa564e9b0d78e3e2c92af13655ac60eb194ac8079be8ae6b384124bf12e8362b93e936f23f177bf21b2d192e1eb64e9f83317245143bb318459adfff4f62b054f08ee964ef7017dfb6b4f22c7d63dfe5ed33d40faf033fb8b7a0e8970d3b3fabf7ab37de1a81f839f689cddf43e4170fa02a3b83b6b458fe1d9a5b8b8a375a6ee4a23a6a3bb38d25adc66f4221d9be50b7066c3df0799df5525056c43445575049eca7a590c3c56c7f4f7d1c2a45c6428fdae1c4e9cab3f905a26f8c24a61fc7a72a366ca71e3f2ae5a0d3bc3612f933684444662c3668f7b854569bc0641a7a22b934cd7caf38185c18edde60f3070e4e4bd61a4b4436025581d58c082a69814c0f234f129725a5b4286d254e2347f11189b85e559acd12971eff6582cf4fd7dab0ebc4e571e9bf56c35d7845492d8db1797b6b363fc509940aabf89398367c82e44abf4c40a604d087349ce94c72e8688dc9858a7d8c4f6ff0b3cf6fc6db2199bb1fa0d534f4811dfc8fa01eea0c9fc28f3c6d6f19f9f7e6b0beff0ead4428bf0e24c6fcb88d5a9b1fba46aa339ed9b1bb503718a8bb20eb6486987363b8b8fab78a462741f14a9a6b8011c9c1df2c400f59de35952369d9b446fdf7e4553fd447d5249d6fd89da132b1452132769632b2cd06998f92e8e10a0168533889dce69af53e8a284ff5fa12b4eb41652af520eda8ae87d0ff955aff9bf7919fc93f7d3ab6de1fad4bae26126984fa723c0a138354732c112bc3ae68b0ce6cc2758b3f41c63a9745a89d1122d409d73ad12edfbab4fe29b1cda557016c1367e46f6aa64916303ef96848a9ac13ed573a7a8dfd49c0d94c880072c6d46f48929af425aee4da551c7839f95a196c339ef104d8f0dd9a260c4671bd2064385cbf701a780b084336550ab014552f026367dd71968fadb56d0dce0636be3d343241e96d6e1c8c3225cd7f359b5c6220ac893ba6aea0088a64e2285f98604c08ec40341faef1f933b90bf4ac91298a0450cfc45a2f0dc298994c8cec118d7603c337f95f2ea8aed9f67d98989f712ad58b4141225f15fba839eee67d48f87e77d8a009baa55811c2ee75d85dc88396937b0888a26ea212d3e0f3ec53432157c58dac279a1d4d8271e6da1eb0fd43445eb835011e52704b1434ab2bee67a571ca0f76268977ce8a67f04ce29fe33d3186503fdd230106cb6a6b0430c60abd0b7604aaecb0e06c78a40c0da7ae77fc5888332ac01f0b88c293044cac375a7c02742c3006c549afa4d9f60c7eeda3110090c79ef98897cd642bd59c660ae1e18cd6220bb4007b85731e170a87a6829ac2d5659bcd48753bb7eab3561da6255de32e3ec6b1f1f7f1dbbb801849db03435a8a8f6a4cb3da70bfb99c442f277dfb3150d7be32150e690e044288845852336d7d0e44566b8b2b7bbcb3c865e8db9da4ae66717c3943f4a48e21d84a028cc1142a6f1f8af287174daa683b8245ddc53758b26392ab7bbf2a3b9bd699475f8e3b760c26192265bf4b4bdb135c50e79c92845645cc88078e1e6e1f9f44bc31e46f8724e8c2f142f419e3a99c7c7dea45998b21d1a8b0ffbb6668cdbebcdc8f6b606dc218cd4ed8ea539a2a9a1b476f2263a1e600a099bf9b91258e924c31f0be87d07829d82a1d275905f4b2b9b9c99e3e1b9f5de9c083dc269718c70ae01ff1bf1202c70c7f78d22af030db5286b4c0f973ffa481bea0cfa5872dff2430c6c830993708107a3edbd921135a617ef39fb40a8a5b9e650ed1774661c9c5d4aef59673ab3f84541dff17b7f41b8e5ba20d4739f84cec15a9768158d2741401138f75be760db2f3577ef8260230d33adc2bbf30e720e9c41963da4f94a76e63b9c31f0155699e103f41f7391b6a0b9d014290fb980bd907ac6e2ec41d131f7fd13c76cbb908816aeee6b4d57e19ae107d2696c60e9897849e8ccab5719d12d64d1966de37ee9d0f772a15b238088fdfa08a60da758329b6ee624d4cf1ea77859380d9735f765f5a7e822759ae1540a9cd51d7afad3e452fb2e51b3b61aadad11005ee50eac2bd8e617136be97725df9b2425213bdabaa03f91f51cf829989e734ad1cce094a00599b66a641ea1ceea1b95f1675b2419500bdba7ae0d1b0e612866b56004e8af66e37ff3f55fc1df696886a765af9bcfeefaaf7c91d9317badeba29329ab076e11061ab98b04f93d82121e0dfbaf5ca04dba93ab44f5355d2e2329ebb14c105439f41c5dc6f53c3eb00029e77bfaf2d9b25e545af137d27fe9ed805d7d0339664cd20558638346e230a62f085f4c226ab56679a4fab9b495327094926c8ed1493b6389ca3b2c7c6005d92d152aab918c4ebdd40e008d690b1614bf0c52f28857af0d80153d5a6d3d35f7c4b19588e548aa04f24b7dab2726d70c7174ab905aae8d983d9f1ab738f5f156eebe4ea1d3e567af7ba2b236c572967eca1bc3da17cc7a5a973f3e8d194398ce5d894fa2e90a002fb2822081fecbb922a3d6cf12f29dae549419a6388b1235698e4a87c459c3f7b1f1850dd510e747a02abbfd8aab90cc16ca7e99e44a080f704cbd3ca965e7d65d627dced682b4f726e18e01b8d38fd2a6659d0720a0fca47447f8230c33918cd9e889c9c0c6060c21b18c23eafdb64ea2a4d21c8faf9428cb61be973655fbf2adf8382e9fbdcde77932a68e98d3835503d84fbca103e9d54980a913f7c781447ae95643d1928c685952811a47f14c660c443d381b1be93a3f81918ee064a0c4b0ff3910e12d446fa39daabf9740877434185eeee58b063cc6bf54ebcc2dd95b72afedd10255f9b5a8159e80f9cf23e4a168d7c900e8b48d2ab49b9c77ef3b02ef6b4107b2ee86e6a05818d02f46837f1f18acedf293de127719e123386456c70e06fc7441d434b540430d558e9aab621b70c321bf57c8ae1ccc64466e2addfcb6c05d161d648bd3ebe472c95ec3279fc3d40ae82f4dbd462e7d3b1bdd9d9735cba5ca695bda7a6e0b0ebfb53d0604397928e0c1dbde209f6b31fcf184f99ecc8552c55c52398492646081f4d59bea61320e81044f79402fa31c470748e1b1e5fc1fdde846b4ada22e2b2eed4c8162d2b95c72550142aa963bbea0b18715e9ab0cef35b1db3d6f56e48a020d85ff96ef0c17f5706f6967140be4a9d68ce83fcf10e42653e78857d53c7e9708e3977ffaca8b317e4c8b0785a01cd4feaad588e051bad64cb722357a8b52dc57d3e6256a20ebdeea46dfe5d7e841bd889ba6e6e10b7de64ad942c5a5165f537e5514bc9ea554c86ee92639743171886302dc27144b8d3aec2f2a304c8f9ce8ceb535ab84cc8b2be9e55c0c827e4ff938b94519fb996e9cbdc26b1a944a7b660635a8a1191ea9831a45b7fa1adec4ab93467474a08b4e8b402d032fa6b7d33964c7a03cb25d44f942fe2410ce896614d015d066242494b057a65a69533ec5aae5c30d609ffaeb28f867d84ddc032e4cd161c23aef7c39e4568c3d1a72688a4547a04e5c9c2d2d9e7b14e6edc52d05b9b10882d9061b2ac5bda865af81828c018e1949214fae1d001b16e07e7bf3ebeca36c074324318823b06b667a2ac7fee9d0ad00988d09dfdf2cb06570bd11cf2bc20c276695ca7493ba327e2339386ddea7e96a81a1508b0cd10c963372642f6680934638452733c4467ad48b6d62363d1c0bfe1a3b6d06415a43ba57b6176c8864b4a112f45a760b75e42e9d4352c8e2015860ebd2056e2f5c669d3f3d640b25a2298f2b22113b8ba0479a48e0f80919fe2141ad32f502e474290d36158fa07b6c4a6a7ddd4b4982c4ac4ceda3d1b0331b2ca9f28248cf3a1a6026fac0c6e6108293fff03fa84516e9cf597a76d669fdef28097cbf4637ee82fabba79ac0a71d6af35b53aa9b262d2d43d64c08742ef26b9cfaf5a0c46a516680aa1394edf968b06b41fb4c8dc0a415b4f1bcbf22fbcc4bbdd21bfdc1f4624704c260183c33c261a049a28c05a24bb731e4cd2f94681a95d648c70f14a058659bd1e4158451f606d9c3091ebe5b06e5c5cf688a01012e5c2a408d0183b223dbc9dc4dbb5c7100c6662826b82ab0056c25c962511d0b33a23989e058c9043649c3c9dc7cde6a30c598b4a5bdb414c014221fea2a9a478d01c5e4d4c98dd727139a9bb275c3d361040b060882fbe8ace7fca9671dc33b07ea7a445207473cf7b78100c9135416c7a80860bb365289f4ae620fb7e0fa45e29f1a4efc913ec6ad2127f40785200b8dc760cc569751cc619935a5813960451c8f2464ad95775a9b4a09edbe494ba1c0ec34ef7df857e40224447560ea65a580226612c5d9de770524f4d12e4a8d4fccd369d0de3bdcf1fe6735a2e372a642e83e12dbf78f3b7372df5feeb835772f72b6dfe0f70ee82cea364bef6c13a66d13dc78039a5a8275593054ba491b0a69bd86473ce1f273c51655cdb0034f88448824e53e963e642c3562cc143d86368d6157cb78c6d8883ab4cfe10061e20700e2d86f7a026e7666b0782c08db600f5ad8b4d01f547d63dd646b92422bbbbb37b70c38075d077907451cfcf9deca8bc17b3197e462ed6d95188a069c415b0376cb4e8c569a77de77b7cb296c3ce25c1ee980f502cc997397cb429a3fc7795e858ee741e2e3180f79feaf10707f5bfd60e6612b21ba176386844648f3c7e9d75aaac1f780a8c0b5a8b4e1238e6d33e0b6fa41cc4fa7f179c3f916837bf8306ba15f6e7360cf51d8f31a18c46c5cf9399dc6a7afa0c35f06fd0675cbb1bbcb85fa43979f3f6cf9ebf05a4187430c873f8ce4d22defcb85eac2f587b5dbf08ad970139673dde418cbae63af41a3c3dba39c3ac56874780e6f6fdd623445aed3f8759a4ca3230be1f993d314c9e125cfe1252fa5e0d35a0232af5eabe7c04e8ec24e8e03cb465efd069663f2566de4ec7a3d6135b28d09cba95eaa2edd226139a37cf3f49a692ca7108bc161d6dfce7deb1699872438f280efc6a392c0f21df9b6e861b6d0adeacd5d10e0a9e2616ead84eaf26a81fa3ce25e08a5197a8f3eb6aba97c8628115d581460e7b061f8377a7a667366f3d64df17423b61664e4a69cf9c79b2d319885be39790d3779a6a3faeb26935b278f3772464f37fc5d2cb4bf9177e2a3e0cc993344afa3b2819d30f8354c58eb5409bb8eaf93b0eb23ff9b2996597f0e6fceac4b9ce94b8285cd6aec6260bf206a45366e5d83d8916673a68241f5d90b9f63b9b399f581773aefda8f52aa84f9dbd18eb1865967e0c6b6b56da724acbd1da36c5d5886c26f73763fdb890faf862b1d947ba8f7de7bef398f5e5ccf1b03cc03f2ce81b4181698f7bca7a767270ae0cc993392644758cdb7f7c314a791cf5c86cea9a4d90cd28d38a732c7f219de4923d21fa6f6c11cebd6e5ee599cb39da6d44ae8964323468c1871f2e094323a2672ba9035c97a56bdd9bcd33ff34e3fccd251075de6ccc14c6339f548dfcb4a1e3d733f4f47d71079490a4b195379b12b73e62c746a2dd61e420b3108e11b62f20bbba466c459743a75d4ca39d0add3899dbe62ed4731db69d7dedb9c03a973b189d8ec74703d9c5f1ea947ebd6954953588f5edd8451df892e6d34027f66703ca3c65884f9fbce1dd08fd033e0dbca8732bff221cba7bead7c007a1fb8bcfd4bc651007c234073c0374bf62848c96d3c0b6bef1c34350008808e776bad3b7db11cabe1a8f55e943b1c39e7ba85c3a3e3b4b3e13872d66fb90d32ef5ebbc1f5686bc0bff772a6e3a36259f65e7e754a1e24338879d04cc4e133fc8b3c3fa34f68c67321ebc7e127395dbaf58ccc4bbfaeda81e528b9a6e3e3452beff4d7bcd31f6f51ea06ee6979f7acc81af02e01ef99ea9d748e03c7df8c2da9460b162ad76cf9749923673487d3e40cd3784dce5000c801c801701d39ebd1c213e34c78ee727d990e323fbd1b479c353c001900b926d364cf9151f9e5c828e7393567ee7235a2932e4b637e9e0355ba11e8ed8d6fc9fb9ec3bfd87b168e0cc73c31d1db25f64a6e031bf9099b1ea53766790d2ceb91ca1ca3589486fe524f3debf1f0d482f48dc91b7d07021dba1e2954cd19ea65e832d5d79a2bce39d16f1de34c30bdf8e28b2feaf888ee547f6fcd997b2237c33115cbe8085e8f1ea9943b0a05c7e8f8f8eb998e8fc74eba9eedf463bfbc84b56bc8f51c9c33372f17ee5f7751de0fa70a6307119625673a3ebe3a6954fd82639c09d7271c332799b76aad758ceb2133a47102c0d2c278d567edcc67adb5c6c321e15eba74e1e1ca12a2317ae0610b156307330fbfad966ce9bc5a22c59951c2e3e1dbddc5ac7608d3945868e78c313e2c9b4ee79c917a744adf7c334846bd1d423adfa3af69cba4c7c0934d97d4e77bddee79c47953faa4f988c7c0f30f455d14c33a97d3de22cc4422cfd310c959e379fba00b34449ee7407f99e7ef05b11cd8b0fdbd244e0733ab1db83c8e936f2b1d987c5b9275039cb5220f7cc0dd510f6980a5b757a1535c5ebf6ef79e4da7b8e0eeeeb6dac2dae2d43530648c3122e1a3c3fe3153887eeaa685e9db2a071f8431a686a22cbc504106951bbc253824417160c19d380c61e1d043bd210d7c0399d10d606e8d6fab1cbe208265832d283be79cf38625686eb0c2dea02417d968c151c5c611379a0d4b4c4f7ae6d271daf1996ba5c4cc9c325a3358e5f0e4737c5be530c51d5a2911b34a92860586c5c52a0720272dae72286295431035b0cd260cec409eca26e5c3f1430a1fe34e3dfa7ee0214b0b6b0638ba065269d1a2c5468bf428f3a953cecf787d042f4664ac928059d580046bf576582531635a5404e0dbaa062d9e7e5bd5b08acfc1778770f3e8cedfcbe91984106699d1b202664125c1aac2486bcd39f7fe22992cd90ec4d08a812a06aa78444f8e28a270413b083de67637b0b536a13d6bde8e04ee9bb7d649a8f2fcf45c173bc062860c16334a7aa2b3a6d029ad1660d2b7558f124be88c102c2a678ace70793bdac734be48838b329dc65096d9a50905a16145a2410574969414d02813849e89250d1ca615643d613961a3ea62396163638433ccf806c65b5289be1f8da2de0fdc3b9a47f7948fbe690e08ee1d1dddc268a324912ba36deb7e8d8315e25ac8bb8640e8043ff89ca393f69c13d39942d4ad213084ae03412edfe029b466c009dd0d213cf29898de50a81c9866fc763c47bd1d5d70ccd99b07b6b58d01f7b7d50a865aca53aa638051d2ad8bed5a8109e7380d31156c06bcd7307610f07b3608f8bdf77a85c20d37dc4c68ae47e60f371e4f854e3d3fa153cf81748a0cce80b0d0189f500d5e1c53ac10f737f0731b27dcbcc91a36949a7ca050250bb49631f6f1de7b25bcd7efbdf748180d3bba2e50524105523ad5809ebc7b4b03bc05dfbe717e42dfbc29ef1cc8898f77ce6f10afbb158033fadd0f52c9b4dbdb0ac8c9b7873ccf75a0a5f0f319a78bb37b483749a2e8db0aa8c8c7b71590137f04b70758bb42c2cceff41f991f03fce6ad046b553c8a32767c31c6e86ed328d0874f358f668a95044dafb4ce5927ed2933cd53b50cecc44a8260b6ad6f1a05f80337cc12bf199c1b629b0d6cf48a81239eae24284ab7a11880b1a6a38f54a7a6c04052ef07a5a954098d82f4e8aae8b74f91091f4f41e68795043d1f6a1cac10f74db302a16fab15003d027e42ecc64ca5c099fbcce807c16ed328583e9320f373ae5670c54f6f57ccd9612541d5af2b097a6eb99220e7b611d58a358b5930d34477afdb0bdbb092a07eae24a8396f281a843e536525642d8b062200e40a1596190551369d6a6f007e25c04e35e7dc6b198b5e17db5c121e9b5dec2c0c2c1070df3ce81802a1db89b4e73458a25ae0a69e331d892b12092c77ce99512a16cec9829f480441b7499dbead90e8c167ae8a40b68a0f203491a5071ce87005180f891eb84242090170f0f7db0a892d564790591d5143b7ad32690f2b30238b982b84f0019677849de247d0105747f4a8f00945bfad8c28f3aea056e819a1f383178c61e60c0f4868794e5a6022840e50e8c009104d5e114f3c3146109a163ffc20091bb4f8b0c493262fa0f8dbca082c8cb08165620b7b44104678d1831420284d582122ca74e2640823809cf0f0f6dbca490d1db0a20d41218ca8e28c228060c48f132896053c43f0008a2d497e60020c2e5290411831851a31b2c15730603871629ba8a08c6592e3dbaa88287e7e5b15c1851d42a5b242a8562a08b36a62c6aa60a582334639d0551129a83688ebdbaa08163ce9dbaa0815f8b340a86c2c102a0744932e4dbea0df564db63411037b6c6bebd9c9eac1bda74e591e3044c1c7536814daabe531ae20afdf4c8381f6cb29d07e651e2c73d5e3746a1b97c77932c29377106c09a986c513a5d8910774bf1761a75a1b429de2439dfc75d7b4209c5b1a9dbee874703d66f3d7feb59f6b8546311baf30d5a91d60e7994af57ed00c48eb025d0346b0d3d02be3c3cffbb7150f5ff4bceadbaa072ebec91522843eda592119f7de7b3953f9905711ebe53544fa73d81e36327d03ddd1af79c1fa8243d0ae5d3b551823ef07e4f2aaa214172782401e3e0c733112ddcfbba1e6d1488c324619a1fb81f027ba9f08d3d802c97c04ea014b39a594314609c94888c5f8b34a4197d5cf90ea331d1f500c1cb322026835041348069271d005d5a163cf514eb603820a2cb84d4673766bde69142c47d97806b6fc59d983337790b69beaa9d7275419d879ab995a3cc0ed5d8eb411c924080de1b866c13acb55e79c0c2a84c138422e90bf8d0845511885721628b532aa8cc75c264620a6275a7e4082047cca01672814a518370ea6cb48e9fb41633bd92e399b747d137360a6b771682554861d32b07b3764049d6abf2fb193ebc1f0a1c36a3ad5345b25444e54348492878f24a54fc942e3e15420d282b816c4cd9c9ae8d26d0d8c9a6afa460651e6a3d314a12efde4d1e412cba867d2478d07843632ea5208223efa14c2e7ad5393530c7b0dc9a5bbe8d4ed756d84f07cc96bfa063abc1c623426ebe436300ba32962fde4d64f99c6e434452ebf6a602537614278be946f602c87947d84e55c18904eb92c6b6e0be2de49bf2d480ccedec8ec68bb8f945a96d711d4e93bf22b09aaef48173cf0d471daa25ea7b70b02ad849933e942a0b38023fdb9b5207429b1885d6c05228d87734ac3f347f251a423e8104a1f61d7a10dc9db3522c5518ca37861de7838bfd6474a756c5c7cee1e1db937863ac432fcb0de87b9f7192184d9dd81de86e003aceb2d4298f1ed8d9de4f09fe59844c248536092577fd8db45c2d06186a4eb62187c7b51b47deec4ef6eda3c24f7784029a5934e4aa94bcb4a496b9452f5aa58f3c58eb43331d24cc7c62d0883cde74caf7e1bc2b7c6e0d6a9d88240a17e80c2ab207c7e7e5b054143e9db8a09995f0541c4b7968449d167281ffe3913a27fcfb9dcf106e737780a41b089583101fab602a2ca2be0db0a881a3e46179d85b90c7698431a7d80a1c74c6dc08de885680123ce041f207a1e7aec1ad8e73aec129cb52c78e4edc5ac6521594fa23c3be4bacce667534b2995344bfc3ad2edc49f1275f229b1230f800da16b712485d097299b5883c2d6ed8961f01d75892179979560f9cc7c5ccb1b96f134b7b785e73367ce2d7b2dc77996d57c9e0f6ece02c528948f5cadb4ac3370c3186b6f87bcad53cedb53979d43e2ad443be5ae0fb8bd1d9715dbda3604609253b74edd3604b4cc47ea078e41eee559fc2bdbaa799c211d4112e9bd372ac1da8b4d19ffc25ce3f1a4ebb0b6a5d77a0514c8799d39239fe1dda4734e7f99d278a7bbe72393bbac7fe426179d7323c78324fa94d167b5f299f48eeea353a01ac599e0bcab509ccf5d6d229bd3279655292f4d3081f663042fb420269fb9ca3963565b884e67d541aa529f094a9e35111cf92c32cab589fcbcc64c3372442e0c22cea3477714a86fa2c418a57cfb85af21d36326cd7e4235ba9ee6cb6268ce2c34673ed5c8b5cbdb371a61eddf7b237ab1915f58f512be2850fbd159341d247d13bd873a8bf6e365d1764087ae8884b99ce9b4eba29767f79b98ad4856b7724ef479ad7b72cd5c9bb8b08c3e19b9ec32f47ee09745fb81a3ed80d985de440f7a4f9d56d48aac276fb9c55e683c2ea7a38ce372e8f87278cd228757ce742e7d529ba84d50a0da846555295fe79cb336e17ac84784b2e2bafb730ac2d0df3779f750143e5010410154a50c14426fdfea1fe99c73d1773ac79ace49e9a665c1fe89fd43dda5d439cb318bd9fc73ea6c9bde4c305b3c48667819bea56c27dfdeaef6e925ce8476ab99387955cb41ab7aa97f4cd57a755da4ba4c535d7a648144c45dfbf41267592d87982cbf26e95ec2d0a3cb1ed29ee3dab5a4b487deda6aadad56ee1e5c5f9d8a3a6e466a235f1446597e6fa67116de8e5755d2a30eea2d4baf2196e7d86a390bcf5f966849af3edd8333a1ad407fde61f1a784b07b703d62864526a267fab6a262042a3ff80cd30801858f17667031c4d0184a8051220c497e5b51e10174ce39e75c6b190a7c6a0d756a47e63f77f7c9eb393abbb69473d7b0f754ba786b3d1f52af21ef79933b5c2870b7ebbe7144589729a41d1f7ceedc73f7a267ced1dba4163152b1f231470a31c6186304828a0b5240654a10b87e5b5159820915272b2a341ce151995266d629672e2ab4044f2127560a3121a350d0854252dcd7b0900cae5017426260ebdb4a0808b68b09667435fcc410ec7d020dcb363c05876a2d99f2737fa618c1038e4c48c112b73ce58a8d53b228411fa67099e2a5366e537c701b9e4284884fa8ebdb2ac8cc67d88f88f2892aa66bf8092cee1335c8811269441f0c0063dc68a0c4117ece4ef244952453fe80e3b7d513536e0e512e0e4f2491729b94f56df5c4103ffab67a2287cf5c357497d0726db84a6aa0e54a182aa2900932c28bf58215bc415096a850a6c039e79c5072a8507e3841a1a189f1a407f4c9981af38916f48917356e12fc6d15e4657209b2010dea2206cd60e2132a488a39a7eca1059f611f3cbfad829c78d4b75510102d4585c2514a7975f0a09e1a0ebb942be50bdc61a5c495d50a88ae941b540b378c458d0a69c330b8f484ba3b48a9f2ceb11225f943294ad18142dca4d8101fa40d6727ce481aca4c2ca51366bc94523affb672e20b27b07c86dd8689d72fbf3212ebf7f2914d4d571fd21a0f7761366dba8d4dcdf49a77fedcbd81e61c9953fdb4b0ad75b880b394cd0936282e588b7536ce0468c337c7b1ce60d71ef549e5d8f6edefb5b05ac2c953dade5d3fd8f97b50d8d6503639a174017ec0cc008c1ed2e811e3059430709c72ce39e79c13d7408c5aebeb42892d251fa244f0a249d1143f509c48021111a425de694b931f1c928c41a4858b24168a03418f0d8468121485184cb678228512360c81e1022410410828de931eacba013164740162871f2caebc2d4be8608232bbd1400933bd843bc11755bc8001153790e2450b28328092c4931c002105145578e962064f98b834f0dc40c6173f2c60620c2992785a56505c60ba496e03e38ea1ba3d36aad3e9f6d8d40f14197195083e1e15d82d3723fe09d29d4f0b523d4aa73ea54f2961ac67e0e8d45b122675225e3a759b06ce9cf3795d297df4d147dfa314e3477db2d4fb7832910c4b420367f48d9ed029d7a494ddde5a6badb56e4dee34a82a026eae351e65ee7b072f07389d6a2da7dd35ef9cc1ab031b732eaaa1fcd678c8e831668a7173651869413ed078386f8da87d51f2e60d7a8441f539131b65dabe569fd90b4f6b1ce5ac5e5846b38eea6bfde2c2668e00c6b0c55a742b049c79aadd6d1c90d8e40408216cf03d89cdce02ef70eced25380ca9b7a91e61d649a1308a6b86a0834f2a1564226b72f8b3eccde530a83ee7f291bf8c4b3872a6aab5e60c879770e8a81e0695104c72ef1b18509f73c3ab974a4efbc6e425c7a7be3979c9517d53c36f78c96dc5506edb85236721781c5eb10cf5b5de701496e1c83aa8c7e137bc5d2be0c8dea9d28d5cd3a992e7c06c60b853253f61a74e95bc0686ea5429d34ea9be9431c65ea8f9c29daa57be9daa9daa8eabd39aa53b87596c045e50a55afba2b51380b4d6b276c5379016e6b5c05a6bedb4335a6b6d8d6e5f78ea31c61853df7454d696205a233498833308c0ad077667e08cbe6c619ecf9cb5300f4953e0560667ad8c0c0f3ae8a03bc107a518a350fe9c94ef278b8ac800461360f8d01702fdf98d3987164124ec7c32cbcb2b2490ebd27d6ce3d2b83c90a623b048c099eb918e49d247d7bdb006f642e321fd84a97a87740fbc1f2af408a49b86aac45896cafcca3d591bcada1653c333ba5be3915dbfcbb1fdc17fddfe3c5e45389089609f03bde345043acc99eb97023bc68e21006ed0da60946bd77900d839c066dca0952e06c6708c80d79cf015dc1abc02388215e23e00250b00dc600d8d753ab0923eb0ddcec72d714ba05bb2856d3fae3cd82fbaf61123864e2b6aa0284395226d1728ec0acb16e702cee8735961d992011b272fb1489fb05db5629c519dfbaacf2132e7549744aacb3c44fa8c8fcad16ea84b0c3eaa51b248835762ee51f45a299dafb05cc122e5cd6961f56bc8f4eaf1696d3794f60d09fa690bd2dace536f4c7a950edd350aa1a3ce0412b87f43aacf4c43c4d17eeb2232fb2dccbd9d7762eee125c47d75cb853634dd45c4f5f4fc1cfa49643acd19b48225b479960e6c6bf73274aacb05bf1f6e737380dba347ef96bbd11f7a69d89cf6096f17dc5a6b34a0506ea21c4a8620ca2883c6fb03dc20bc4de7feb7eb326ceb28575490f9b6a2a26845850bae5855f1e45e3775dcbedd802c7d770568ad5bb7f46236d358b71cd2586f3436bab3d7ab605245cfdb776f19380504d5507e45994bc825030fb199529a0245d1c8d47dea76e759580669642e129fe6d6b0cc5e6097af5316c460cb1fe0db2a063e3c7df299ce859042a7402ed4265c8f21586d7b196d5f2bfd71db2dacdd5d8e3ab51cbaa39dc2970bfc1c428ae1bb05769bd415a02b44b0e0fa8a000422d03e3a8daef568beeed1f429bef88c3e0afa14b15d8f9e7b1855d20cfbdef3c73377aaf42ce6c4fc8860ad17d7a3bf79439aea39d4e3dda918fd0727c6a3731f66ebe5e5e0091ad4728b5958e686b41f5d6f9704201c39cc99f5d16834723972e9a3c7697709b15efdc2acdbce43db71de8c18c478ac6b338ed49ade641acb732a690aa621521d7af5e63c1fb1eceefc94deaec9f313d3b92f9b473a6706c867499cb668dee87ca24fec78adedd2ac17261f7f3a157316b87d9cf592858fcf929f14d86693c121260e36cc73b61b82f00dfdab3e2bf666067ab8adeb5194390721cccffb66c1cdf3b08cf39c43c77947dec319b2e0f6cc013917c55138145b6251c484884b87ac0373af783fdcd0101ec243d88aa12bb26c21fa82cbf4c7e571795ddac739ce8352a208459122248313aac66d524243355e3032c0d41b3ea16adc26650576f884aa719bd4fd8289a260474919ca82f1d0d0fdd23e4378a887de0f17e58bcf3bb7360f59ce5d9487ba5f8a7e60a1bb25eee75dbeaa5bdbd75d2e9f30aec2baeb2edfbb72424ee85d170bcea91e3f7342b68a156b4d7fd39f9567e55d99b666f7c4014571407d033d46e91bea6e1535d6222c30f5f658b07bd4fccc7d66bdb81ece8279e9ab2a55805ae05345ca3f00fc7327b4aaf2f3ef0ad5dc5c8fcc7681d185f847de9933420e28baea9655b3500c3c1976403567746679b5fcf02069b68b9869c1441e24cd76c1b6cb34612791f005232edd92c36bbd582fd68bf5f233912085987729f8b6b2c2256b57365d8e2fc7f8723c4d584e26fd921867f0af795d145b324e7bf9854d266c3261c779f8f29d7e8c4b6e2dc69793b0932e93c971ba341a39369130e9ca309e26ec2412be60f589bdf53461c74e21f612c49793b275bfb81e5711fb56cea457a769a7901601f4de7bef7eb95f1e0f92f6b945d72dba607a893f1fff7ed7e8ba17eaf2cbe935ca8dba5fee97fbe57e01e20283286f806f2b29cce464ef628ca4e8a48b66f0bdb8f5ae5f24d245225d8ef32eebf28be5d8cb47d7752fbfd67b5236c3e738b77e394e93ae5f3973992dbaaeac95fc75e5d1288bc133fc97cb28bf19b35e5c0f2b9f68ce7e46f15e7d3ee9f339e784900749172b66ce39dbb46026c949d935ef352fbf73ce795d3eba260c679dfb96936a8cae3bbd582fa5a64778cfbef71eeddadebe5d44de3bf2bea95bd8cfabdfa29ce8adadeef609f3d96b015ae979057c5bbd608b952cd58a152b3fb5625e5d62a42a547a25b90e3924a773e62c52f7bdeebd97df924f6f39c33548359ce42752d720917236caa5beaecd3acdcc5bb9fd7eb9b04e21f4f382a97d69fbdca27ac15817cce5234ab1f5d7337dce9b6777ee49f252f512364d5a5b638ce64cd69ce9a0fef6c4aeb78f6ccea43fabd6f7ee97fbe57e11ba7a5661a5842d7bbed3efb00cf7a590baed927304c9536fefde535bd432f83b9db9e75b7e01df565110f1573ef56df502266fdf45572f50f205f8b68aa2cbb5026dce878efcf2ea5903f528fbdceb43f291670d64f2a639a3b8b4a394b3d168e69175cd99736cce9c9947738ef3e9724afb3167ce61b65e5c8f49c3d517137bc1c49e2754fa5c6fecdad81dfb92e96641ebdc86b16c7cdd174cd6d1bb9bfa95978c7ddd3e45ce84f679c3b8b6de05f3d29d99cc3ddbbdc445b7167b37ee8eeebadba3b7cf2d72d65e30607e5e432e8f0df488a05fb14d3357bf6d726160095eb92f266fdf7bef7eb94516561de7b52361b77d5c5bc94618edeedb7daf67a8bf5f9ef492eeeeae28771db63aa83b2f0d75cba54726565094685abf7e79d64bdecaa42970a683ba762e79099ddee9f27eb95f7cee970be67e892477638be96a1757a5589d16c47aab52040de8f29e982472613c127ee701a10ba834aed5653575884800000008d314000020100a07c42291502c1828cb661f14000c8ba04672529747a32087411c838c318418628c21840003008c21b2a1ae005c29291fb3cbde19c7d11bb63ed054cb7907884a0afb730c160aed60004b1a416f96874c2c1e033bff9b652b9d88a6ae8ec2eed3a64eb1f1e1e54cbfd2fc185865b603e913746e01c6d5650f4d8da7c712121b7ae5b4c9af50fd162a554b57e1136f26bc8df42b384da764e2f90c756710395c11a0b4571a4777824332f894847cb1a5f28892e54a8872a3f7efa9908f07d2a643170bc44051550a0ecc0e94924f514d0bab52473be31d423004acd50ba7991914a204260e919d0190ea4cb7a4a3477aafa4314184773afac74bbbafa0cc8d42a2d838620931838a5225f03bd71b4f61d3d73fa5f7ecaac7fb7ee9a425d3dda960a6d01e7611ad2c8dea84b8cdf7abe18168ca3a3485e31f4a93acb357c613af0467d735aea7613672704d06abaa666e4534ed898496c19402041d04fbde889c79d52757c6edf8208b157585ce8f5cf9034ca8fc4ce26b37dbc1c12b697b399c762f91a651ccf16928a9dbbce323f626a309c78cb2f6ed0ac3d01a0039e67dcd588014c202e6d7b950149ea445df01760a33e6c1a71e7903c47f42902e22af7e4e7f4ddc1071729385dc8710430d640788ea72dbeafbd57048c0ca74a8c6cdb927b3d662fbda9a20284427c8f3887168330b9a7ef312add8c1ea0085b4035876e1e6e6b5ce36e7e228079a1ab2d5818bf7037de187360eaf7ccfac722338328f0059d0b9e91f33d91b3512d88c636909bacb51bbcf58df320add32833fb686cb331aeea56ee6340182c26142f5535866684ad22ed0f71817f238e0e2ede2779f1240717e2b634e9a853832fd08f8d19d7483c12562fa72cc4907c2c84e2267dfdc5d0264b84b4e6fbcaa55f8cb31c6dcd1887422a91429ab1ded138f4102ef73b07f356e1c676a05a632d0d8664791dd12518509279c8039a43d4152fe18d6f00504fa622d6f5477bdd5709a4d6b61f51a025881eb0e1905cb027b255ef157c4400c3c3bf50681ac941cfb8084beef04b547e99e61e0d71d5ae75ad057850b420d4cc8259c8337c0be709ea7a0b2b80d3c32eaca59f453c9c15f42dd273237943376dce18450204c931bfb399c1ba41ee24d080cba03cfa03d67844b738c5302a4962fcd2f2e4518605c61a4fa61d84948fcdc217688390a3038e3235d9a1e3fc1ab5dd18f1d5d16a47e557d04ea1100afb616a97fa40707e372d581625cf57253443ad3aa98f0ece4e33ef223d534bfc0ec5edd8726d15796391d06c3643de3d3da15b034b11c85bfbf594a7aa0adf346bd3b18e671ed48f338ca51412165602a6555f80f8f9f23febd964f76dc0162bce2165ceaefabeabf1f446e171292f23362ffef2e99558ff78aed8b69834d853d81c6078911cf1ebb1fe636529b9cbf3b40a43dbd87a22bbd8197ee41d111ebe0961c104bc88b22b07da908a23479a8f55f99c758ade14293ff1a71a7524ce5c06d1e5552dcb733b618e2be21608fd97e9d65d2d6dfbc62693a3f23197a97eebaf997077ea5df19e56a6b639ac106ce2031ff26548a41b4c454e5ba1503962703a9e6dbfd4ed83126452f7785762f596cc7f394f27f2353c1f274af249243cfe3ab079ff0e8a48bae3cdbc9799a7da4418f5879eef189d293cf3e7956563848559e2a5d009adb846d479b24911ce65e2b93407b6c01f0785f3938cfe9e6c4465dad3897f1fb227f392b0dc62d0cfb0ec85a8617063ba7515942754832f5f2b591593bb8277339ae93d5bb8f77955410b1855732cae6bba6c8a19b6d07ff5698a875b145b24c6fb867d9bfddaa06429975191a0f3322040a128ae28b794c44807870a17fa198694f2ce0d3152eb16e94e9d352a883cb4dd6ac0ef509ca48ebb7386b660b12b3537acf0b7d952227285aed5c8128ae16ddf14d6be7763a0fee088b1b19ea198ec92e8bcaac827c0635f74d1d9cf440ac13812e413d56087be596111a38ab2c8017bb47cb205349d734353aeed756887759d62f590ebf6fd0ebb3e8cc09513f5c92c91023e842531ccd5798359678ff3f87b2fc3f768b996beb6311ff2307c9b5e4847775a337382f1c403602c8fd8009f8414920679f983ace932efe7ffe17d2cd29ab099fe198a020b74fac017fc757c5a28c1621e886e01c7a9bb7977a7b8dc3db4b3025f138be5f1061c41e7f605fc178b36396548d7bcb7221bc1a7db2a738af98797194f1e722361466e71e46e16028be5c491d3cd7bb28f89799c4583700db8e5b33fda04d6aeb69fb0aa47e6dcec59fc01c954caee3c8470b99f19c62c46c059070be027cbeed228c18f6cf97d0ef5921dfea0943084f564e8ce9285933e4b2adfbe06ab4d30593f2509f5df4bf373c527da2c4b01c122b59b00b71b47d354c041e83f8153ea1aa44c995775acb14e8e22c5fa95e96fdafc50015980a83779daa441d84016b4d077675b2557694399996b796fb134a56b24b78937f086b3105585bc2e42a973c3b8ba89795fdc604d61b237d2cbc92094c73387f7bbb461b63e76623729ffb6d91a390daa33783bffc5768c5f0391c559c367a3bb23af0dc45a0d83dd77e8214d32c61dd121ba118a0056df6eb05d37c4e4d1e6ef1299af3eba7cf6de2d146f1c8882aa8b67b2afd2798d7fb41e8e8cc5ea00a2876cb06767067a70e67324da61968799d6b677cc37849c72c752795c14e0779a5bbf0824b105170f71ed59b3d83b7942eef86895218ab984f65b46e42c9504ed2bd828f07eb25a05518190ae562b819f229914c7040ea0ba2d8c27faac1694d5c59cae065eec01c59561cdb81aefb6a5631596cddb0553acc9340ffe30c9d0514417c409f4eebfc6774b4a1517945e0d04710b49cbc591ebc2b872105e5353e5bdaa254e9ced4cd658eef22ff76f58a6078f55981751310fd6a67373e9cb11471e0fa18b57fe8c8a86432b82c26a6427704471798d1c9097d09e52b2c18744591020a08f9697134ca2e1f12784b648acc5987c377586b0dee728b07d49686a70a9093be83245e6c7ffd0e3e4fe2e5167539b8222f316ac379d0828c511143e37720117566aa7bc79c317d8324a2e270998ab595803fea063f772dadc55cfcac65aac0a8ebaa706cd846cd53bcebf249b12841aa85a14100a5376fca1251abb1586afb4824f7e044b481d212187046a4af829496c8a7740848e2521f741e33daa77a0315a263e4fe0d2fbfabd02ce8e456715066c817a1ac318c44957b4cb9bbbf090bee76df740639df67d462b03dfb553dd2bf94b2d3e4b0bccb59b5311cb8df8a21742746766ac767494add7a6c719e56e17a7d04d085d84a651f61007f52e14028eeb4a177ad1709f113061e363af5bc047b94991f093359ae4c78ef4b947028c6a5b3a45fc7de62ee4a553554b97be2de83fdc693df85767b4a6c501eaf1befb2b7cab666cb40b7452a86a102098b04704976d13834f571dc839f4ab4483105eea4cf033246ad02791612ec3ae0d07b505d551cad4fbe77c2bb00285808466b2f1030e39cad15e385241aade1af128820d7e231afada328363b54e8a34515055f3a26deeaf54d1cbfd1296549b95b51230387413c005a5442f5a9f74cd8155ecc7270079efc8ded6017a9b94b30086a781c86cccf65674ca8884d43fc4a58022233d1e6736ca4de518da7579a98e4bc407866b122bc0fcebe48384883d3b902cedba776195e477cf131446acaba861125b5e007274f1d0d41742cf0622dbb074c3a18f446736a6163017cb901283c4a3a809d53696a902c5772304d028fd89cf421732a564ebd53878cb11c46de455f566a1d0582fbecbb35f711c0fa71922c8620cfee9919f92227ce56071f4216d772dc596d8cf35406a5f379ee5b72718d9da31d88932b9e63b14fcf0b742411ffb47931b427575436314fc938afb3f5bf8907ce63a01e31918289f0940ad12a1bce59998d133d58fa1147707ff0123f464c2f5e6384aaba37178af0cbdc248ab4731bccddbf50f12537e00b05bfbc46c621b48c6bad57c09832eddc701fd051b0bde48ab29d6c528bceb32ca418165260729959808b13209231c699edcfad6cf9cbec9317843a84b22d6649f7250ac3b2329410771090c77816fefac6b1c391dc07ab0a55272a6a970350c969cbb106d4fb6c62494062971334c0379c07a64d8581488de1d86e08efe84c111fc9333b4a5e89cf64156e453a15faa3b9ed8903e23129b7de3829496795490b841e175d613bcb3c1044d9d5f44a87c534441533d0bdcbc02c3b73b85d1142af05c5a02785c484c057b204634d3934b6b046276875709b1da066423f8b3e5bce41e4ae706cd4fa6c89f253da7a0823e061c08a44fb0a376d9490569b5d1815cc22a12a02130178481ef952bcef93879a4a18bce5fda333a9fa2a72f476aed4a6600ff9c8e8e4fab97a673a33a52e4a5ccaa87b3ea08b71ace1c245ccb2736ea27b8cc88e9db201e58bdb1e6162e3ee260953293a64c5ebc6469320b43064898bd4aa0847d18139e7476b9555ea8d47cf476000e99b67348d63a522747c71d2aa7c80d98ad508658bb4489770ba1a80f5aa01ea486bcd7ec79b3846e015353484c9106150a29e80010f203c3a9384973181099186c78496166d292f144d3ff1cf6671d22ec2f03f44c790358914c0b643775458842d000167134e46fd4684f7599ae79c1ea0e5c606e68620db9f56170c0869f666197a003c0d80ae4ea13406eb07787b23c039e1cbbd9104a279fb065c63778fee69d6b3b331f01ae83378d113977c3b6ce0d98baffa0ed64d50f3c0833b08c6e2e166d7afad0502a7a53f9f02f5f9e9734d0a355bd5b31667ca56539a57082c7100a730cd34f3308ea0d4199f01efa0977ad5f4532df6ba6c8e9d4a0ee7dcb232a2e21e64cec910d043f14406201ba49e9251cef2037198f7619e68fa91aa2253450b53462dbf690309f52e08cf77dafb77c2ffec9caca5274a642f868f9d31923fc52632d4184681d6d931095d582f9b00c1cf9ac978930dd5daab281055c65f22a98aadfd58f514f4e405ac356066893f8b25b5ad43f3804f35864946786fbeeebdeb05ffafecdcd9572c5003fb51d23bfe9752185d0e063061b7b273d151dc528c8f486ca831d2bc11f886263e26ed71ad4195541abbf2af21196fbffb51ba9e162cdbcb66b44667d7a98c0d8e61283eb1e320be927c38bb36d82963ab375aeb5ce59b505f2fc8d8b8382144d538f7a908c0d4f3b00a1ed0adae8c0bea72a8023c5f9de126be03a3309d1dc34bcd1f957ad95c0cff225a7f3f1c303a9b738a26354d4a8ac1a5bdf8159270fcafd277d691e53d13051ba175b2d94d0cef2097f11f91b38cf90021154634357b0169d9e15c19a80220955c7a19e4e26a0448be942ea2328d8f5e6ec28126403c30c0d22b94077227def8150508edf8023390d7498285a1e622a525e3a662343f5fc320be51ee43078c5426de413d6f0feb039b4802be4dca7aac041eb3a60a4409998c01c1972c56e9bd261b0d08fcf70ab7bbdd792a7a00890a739f78696aa6322400177b1e13ed776a48ba8013bb24267d9214c405b000e9ddf723a8063d2c14f38f9f3281b2c0340e8084e6b0604be5510a08e0c1b1eb0d5772602af2e75c04ed4ed99d4513856dc0c83b639670e6de78b79482a0910c78d92aef1272f0dc7581f73e39f63c23fd7a3ef47a43f79fb80a7d40c9c04b4f26876d9fdc213a419f332d6c25e73a9c5aad7fcdfa68820782a79420f832c44605a1d1a2da7d54136c18149a982f0a220a2e0b8822e49e429240b481f7539c2139e84009efd683b37d86ccbd29c2e1ba7ef1908348751f31c40f14e27da7eae23a042e4523045d981baf9dc086121590f967dc72180f6471553f8c25f9738cb9125398eb52fc8839758efdcf3e392ab1254e9bc09546811c9f1f40f6cf574d277271f83010962e1a68f39ced5a4ec1b7f5040226380eefe87b030a5c050cfc6c6981a643b50149c2381decbe44e806616102331bc9f682009b091858203aeea0a0f532e5c2279cad7cd0f146147b4300f1ea619a447349684aefa1005100fc65b57ad8a070c3ca90bc21d25d71addf3ce21d3e61c9e3f4039c0880d4c07577ff62f6fd2fb9bbdf6d7e9cce7b60716582f9e8c7c983f53ec34f9412dc307a052df38bb2c74545bbd00bfebe7f40a59b43f4f749a3eca9601840dc42eaeced9faca66b0bc312be22ac1137a0a7bbb1f66555511b4042f9244a18ac18d6f6381070e15fff69992ce9137929ecef689448e231b94207a0d635e06f1287699acb85a4d93696eab19b01125b10e71b43c721750d2e23b19ef97de545e86d4dbc60a226904c71f915ccd33c6fcbe5b1c7e7e7da9a5218202ef3ce080c6874c373a0d8a0ab041f62dfe59a74448948e55b1d5b9ca47583e62fca80e86f078129904b0f242d318baa76f5e6dc26db6a8fa46c3805dc597da9969e86d7eec59007ce09348fc04a324d70f1a9bf521f110dc4283e4934863c051c7c305036532703125decca47c5eedf22f68e00e78bb3d3516877fe75edd2617dad8e2140dbb7b103ca1bbbdb46eacd580f566b83bc71cd9b5e953120fce2ac0582b9984da95b473fdbcef4e3c04bec3695091ea061e558e79d1f1dba82b84bc36468621d9865d66f4e254f50b5d0e5f3997260d5f479c348eafd4291e1c2f0a7da599c0a0b443729f2490243f94e6d846bbbc97fa34d37b06f68df05607fb7a275d17042873f5c90c2b25b3ab807042c788fc747beff598ed30d00d34e81219a5af450fa435db99c637964a41bbe6c6018f527b46d52b1ae902c8a4e085f6c4e4ccb08d0a2be9f5da32bf333dbf6228b20f7e98112b2b3e080893fe496420cd602104d825124696877398a595163e29005d9d53180f170ad1055dd6fedc086b0a3f7a045d7520a35aaa16267414575a26c4c156addb9f34135b8fe8673eb638214461a36d3776bc1de187c978b57cfe3689c594e3f3a66288a52094b9859f76d1831eac9d0a3daff48a88c3f84728d703a26f1f2e4e1f9cd6e8f1ed00ef6f171659ba5724ca274b898d07a6109feeba25c65e8a8b6f7a9398adc69af9846c40d06a60487b0fbdad179914ed079f991fe3b55bb730638400847d94fe6478bac477e17b540c51f15ead5f9cf0b886d143e0156af3b6ec366a3321debbe0eb3a840612799e1a437652fecebfcc5184b80b28ef23422f28ad7ada632cd4762ce39d643d302ac710d79160edbe4378688fe233fe8fcd8b22d4c25fc879e69058f21f0b347c87faed50efbee642d5bea2e76a2a612632b806b037e302e6827244006617c7cd0ac831219581b6c803057e1a8787d58b49d6cd00aae9cbd11460b5e04577fa8ae73899b0869552c80f09c3685dfb3d1c04c72fd11c226d9dfbde5274f2f18061543308dc0e6243e2ae2e1b4528ac4c67228a8de9fb547cf7af59b1b7dbefd39ca16b88e982020f434bb95f39e29973b66d727f48e47e71d967864fcbd5df3884d2fe78963800515498225efc5ce21cf5c49827ba91312e00a79be28c97c4087898f32f82b79d95f36124f0c3c6604b5311452e9f77b9054cbff8b3f4f207af9af91a8f01d79d7a4e720b6a5acbbf89d2c2e78ed49b480c8742302229015991404114c4a2a088a88d222df9271cf3607b08084024fc3820a881e0cd6cb99443d81ffad388bda3014031658020cff28355f79a68ad83b9f9280134a829fc182c22037a64f831050e626c8e8f0a1d32a8954a9ee0c4d103d04ed1aab7c1dc5d3ff33110aed3aba7dafaebc17756f690ea8b5b67bc7ded171d62056833b6b8037d8470c3531c484dbaf3008440cfca145d7a032b70c59580e2b88b060d86d7883ef10da20fda46ee176d064517b818520815e7d0705d410b18f8e4c545d55510ce96bde1f48b23e8e0e1d2fc8f767a250bd28827bf9fc0805f5fa7378e809f0a9e06b8f05d1cd62c01844084457773554d365eb32520d9fabbbd6456e36b8fed8be978b1f1ad1054c80b63a8a2e952ec1e6cbc3e39ba6304265c400eebeadb0ad8aeecc6e554de26ec6f29ff0a0da7ed87b6d4a3d742437043c9ef300910316f4697dfee4bd9f031d5c8293252200d620a48436be93adfb3fb9a6139f0d08813d2481008a3ebb84f5fb79c7dee6a10877c9f162c36574c6f0e9f57bc31590d4f19129f858881488b219356b72660d0c186932d940eff9d6843db3504a65837ace1d7f3af6933d662f5b671042a8ea7d7f835dfe7bc83a7c65548651d12931ee0a6178b56797133014cfb90e2547ee82983651dfc021aa58499b5ce08db243cef0c018069ad1c98a378b8658a4475cc2d7e19897d40f40f82164314c6c4bdfbf82f9724e22a6c40d0595c724f246ab56f0371a7de51e518fb98e0756481f507767c2bd80bed30b996be99c5ed18fffb1593e09305a7441a4694cbf0894ac5ef754ef10523533505ca5d83273eff2a2fa968b31952d3bd3239c1a372bbe11432219101f08aac900b365838df271c4d7daed3f821cdc5da643528fe8e6297387c6a92540c6689fa5d6de79e1a4fa25611c27927c6226302c285999131a258ac805b9602010f4c410f2fe3ddea3c292d4fdcead1239f7febb2ce1591c44c2f07913fe4223d355753a986846cec4085866acc6fd872e467de013a0e949ce6edf69f22d86768f643342c8aaf033cf80d5ce0501a43cb59c6d1b61335b8d3d59ca4c00b683efe0493de882c1defa433f2db093864656daf9a55afc8e19869204e01ad06e4cd0144d2a1db8d2a71b3308f4e874880d91b3efa0bc08eb8041d770341e5a4830524da5a664614891d88aeafd7d3c8c9ad419f210669f1e34ad4ddc103956cde71c0d010f61e72892adb945eb76f6ccc4286640aea5346fe62b4550cc046cbb1dc08f7b32e067f1b0f386b223c4f2f55d004e9cdefd07bc4c4c36a64f27ad9a88c53523fe4d0e1c8ec6643c8dd95e5429122cb58cdab3652cc0e0b1960d5da58dd7b071278905a2168a8b64a6ef1298268fbfbcebfec8aafa3eae89771e34728bb055fc478bf9dff4c810d012ac32b3174fa12e7ce9c3c88895ed96f6193c144928dde1f5a70b45cbb074cd509a91ff283df06ea3f9a072f47ae8675ae7fc167d043406895810fd5c3b8584662eccc32309d249062b60ef34cab7542abb00267af445e0a70be6344c47e8ce96788044f8de43f07f004c8273fb53982d401fd40bf72bcfc9786e9510a715ed6e16c320362c992b04b8478560dd3114e1f2111a0477be0f67757356e2615098b74ce3b0e8d9ee040728181eca1a8293cc0a7ebb4472a964ec09ecbd911a6bbf263fd4223c1e7f620a795fa766bd7d3821a47db3a9413b26c0618d64993b80c2c9b77fe1b48082aa053d076f7a79b56dbd48cc3054c5558ebe6fba5485787a18b4043629b42f7d071dd373dd3c6706ec043fcc45212a84915d1f619823701703cb30c11b22eb07c9b4aae2ba2e3999696315229cb88b68b8fde69aac41ff0e6a50c7f18fec343ed0a822ff9221618400a16876a76cb0f80096022fbecbc41c3110a1b1d7c5e156e56a26de460cae867b12c99a4ed678fb947ec4e01c44d51227bef1dd1dc2493473b2bbdc2f32cb82f315d70ff97aa032ceae4707f7c35af57bc96e944e4c0b38880f2ed251d8bd442ccd37011320d3410e5f60d7cc2e388180f6b6d1c13e107535c048380da3c716b0bbea83fce134ad18db49957ac2b349ba6ea9907a134107082bb9f4c1acfd206b026283b62e561977a9f3a1e093916b55805f70a50b5414400f3c1354d237be1954b0040bf8023ab040fe3bca065471e7b96fe6a15a842fec9ddfeb2db8681cf34a8c1f01af80ee7d40f3ee58ac43517c6cc96e0e1bab610303986a586a0309b94c24c978fa70607a0b24f3073da1978454d75e8a24af1bf3c5b898df344d03e7e905cbf1fb2f912881389201513321f332d895f53de65748570f7337a7c47bca95a5834b396982c99c174c4af0e3045f224b68d8db1de0407ae1efb701ac1b25bb655370dd315d4c0fb4166de6464bf2fcc1d6064a72a50645493c60caf90d497efb0096be082bbea960a1694b2941a9512b289e9e0220d921502dc6325dd2ba77f66dc079021761567242c529a65330e7214942256d97bc49226e3ad8fd407840de101101db599715403c7432a07e7b395258ddf91425c931c31afea7b52fbad8b9b1b10d7e44b53a942a085c55b1f5ba21a66f0c2a15265cbf7adc1c6529dbc0dc6440c15d5b17276c03b747a4fb646b49a40ab3225350270b47762d937123b3e41acb98c1d2b3688f81093e4542918163b7630444932c3eeeeb19d28e1d3d2fa38f0fd97acd631d6bdd618b913e712c14ef722b06649cbfaa7361d7b0a767398e66bc7feab6d5a51d4158cdb9ee3523f5b465a015d7300b6b012de02e2d4724fd8ba7d7a5b2ed2b648bea146d813a17823c4e26c4f9368a34595c11d15e0b3d57ebca7c6454f9bcf85b5999e7eb0c44ec8c3b7a1d6a3f7c406bf733887664d73b6abaa10c465761bb8fdbdac2bd2e55bbddedf85ee399e286dea7543767469d7d06bce86989e3477dd6a507b7bd7c56f6a15352d217a5167633a52c0f0f5fce2c796b02f1451667e7b4d2befa9a7b9c10d418f8b2c211efb5ff3299d7b9f24eb857278cc69c7e54a7b64af6dca122928f6a71d63634ee67bb9f0e12e794443e485eb99485d383f4712b07a2447ab0ef95cac47f3ba77cb43deafa551b44d24db3d5c1c6ac53b27fe005bff6c6a5fef2b842155a1ab6711daa3724c8fcd1cbf60aed4f28c09b79070e0700016317a20ce973acec528588f24ad616d2887f274030b314a64d05fb39401780864f35176f216f7847bf9b672eecfdbd53da016081692184c93918e061de7dadc69239c7881a85274ad0f18aad69f847801bed6bceb4a9c079f7f3c0bc61e02c8cec4d6ea0b791faf747e32c3b252f4560ae92d51ec1bdc0fb6b09229c2acee5ad2989069cde2f6ecd759fe2d4b3b0cc32809fcff2f292f0929992db3e8703dfc4aaee35db14880b2e339ecc1125df59870bc173af4c810af8960e1002903590bdbc0cc72708661142ca361b235a66b1227c7c5f2d0617a7ae038e504c076acea7c1e0590c4e1fd336cc5a36ec292413ff5c331b0e5cbb440dd9296f81843aded05d84725ee4781879aa7a042e1b01117aa6e3e14eb7c6c905d3c5390659d8448a826919df1851032c4a830ffea1554e92a84f4112d82bebb3d64577698170335b11df178a35e51b95b2f60639e530d8d0c806110037e0e29a9dfdc5104a2c59fa4565218f1451bcdcf4375e2945a1d7754328885e7e6e8c8b9dd08b77acfb5c6de5370ff74fc88e55100c7b57c1830a5ac7331fd73f419eeeef8e75a0d08a6e69a694c759f951b38378c8a75fd34a8cd220f5b411e0b4067565c9d09ce32f0c566fe671be2b2700a72b19047b1108b70577d9379e9f4a47135a68f7c3a0442b93059d010ff9129d3b90e311ff4e887cf28417a3ada5fb1a9263ee96574a83661cfc9f70a8c8f15bc582ff55600f0ac13d3efe3e3b1725e8d98cf3ad5c14dec145284ea87a04e658d0078f8e2af81ad355a9c887704fd5fde1f4a5bd36ea949e2595b2e7597bdc03a613499aa5fb5e0ad3d0a744e0ad7290bfc2f20450810d481175a0a7a9ef8f1692e88f7adc66c8c337feb569f04efbfb7ad6de1f3aa7c48a117e3cb25c0a91d20638f79bee0710205eeac406186d713d042b5dc2151eb0505661e6bac4543646c6dae6e4f332fffba9b0a7c9af93741c404f09019d0b5fc83df284683fad000816a9d9e527a9ebf2faab66af1995a404131f276687eb23f8cbdc4fa9019473221f81b0e05fb92fc8a3d7dee810a8f41e5e4e366ba988fc43bac39ae52a3e8787d355854dcc2b6f0d7c0356ba8461c9b8f3bcaa785d81a9e0c5571c3118011c56f90cab1a60dc5838408db43b75166af2014d351937cdf7a2dcd969cba16e77a1940457801c7f684adcf7dc6c7ab286489909cc5b6e5648d1a7ee541a1c46ceb3681169b448e2c20be5babc416713d85ca50b8d10d33a5f1fceadd4d4b40f78282e4e75873678b3f59720684f7366103bd824e4e0224303ec2ac63c5d8e1f0a4f6ab5c3ab0b406053a37951b4e02b8140618701bb374d664f4aec86abd39ff1131fbb75c05573b6caf07b8bdc8784a1ec292006c2252759b0398b7f12e87e9c0f5770bfd2b7c51a74a95a791a93d888aba5863e42c26a0d7779811484296827c42d891e120219212643ea12fb93c80ee9b9c4b05ca6e0a033c7106785c1ddd1d4a386be3976e2de64fb76c5a4291d442f6be9a4eaee25a1f3bd7a74027c0d9ea528a4467582b4a44c3418f23d7614f444e85f8af1da5096834168785f563eb8ed5f4a91198b0dfa2841c20454a9a91b048eb3d6b2106dd5820bc391743196c33e238b1054b5b1722a63dead61d18f0ba4533f543957810401138c069fcc850ca2495fca994260c4488e29083e621cfa6a2ad6e55e3131ca5735129922b354dae03a0cb9361d50963b76b2b3ee314ab107baf1570d4d2a9dc4ead10a28fc22df932865a19289dc251a5554c394350685cd0e33548aea15ad4ab801ce2d3bc52a974d2b6f9589df9371628e60862b43178d1aab0e3ff64c2e97ab8ea6c325facdf18d6a58e1a1417af94f64f9e2e026347e18ad985c9a60ec2e90be8e67848f0d3815e6f49486ac1a480ee8c9ac97d1293f655e13d403a76091243368f2268a9496b7628acd45c183012567df3d1c3bf51018d5138cf2898258ba1982ec4c793d438302db9c2a15185327405042fdfe0d76d290b7c8909530638cda64d131031103d61e92400515c92cbaff853417ca962e18bea8adb842fe4ed2282866c1fe12e02563a41331ee42c2a43c742e250953b78214fdece50d33b6520e2fd44f7d88106f7717d2fbdbd317ebfbccc030851f70483c73c79b39441f5e24ffe37df73409adb47938ea09e66e29906540ba58ea183cbc5ad46b215a8a996925b15abf915f596e9aec4f80a57849cc0f1fed6b3c983329ecda384a4d7334881636a39869c0d900f1598a90c20318b7f58614dccc5df975270944dec40c84f5d96694c9d01a5c8c88cd594b63b872caf26734e7800c0c8af689af17e4ccce3721ae3cc6ad87a04925b2cd2108c211ffcd152d44a7f5c660de71a9beedb8ceab926af151ccfd67fefff9968cd268e6a0911fccb9577946899718752711e9493a340efc66245f6b55091105bffd66c876d5cb1931adf9be6c120a9852e51bfeefb9cba49dce79c174456f7883b1cd71b7b5e8f81df3eb2c6681716c0c231383f304a30d934bcfaf73a76c13bba855fc664966108148652ea669f00e179bc6be35885d60094bb09f22e15dcc594d4a3c3491f1ceb838224a33a9dab9355e7a56ebd0f68f69e314c7f0a4c76dfe5358d1e36cc8f9b7e24b994d8ecadb48bf20af071a9663184fc1087ad68f4d465de7ed6a2fc803223eab5f291d83a10d9bf980f466222391096a192526c916c2d6134377bf3b9c99b0fd9243e9b5b6dbfa3d283f6c4e9f6b9e087ca19f5b0b7111eae0e9b34dbd234e9c3c40d1be4584c4d1e7580e62822fc3288fc828c9cc353b107ced42c71db24d4fb2b1af4b7e600e33de28518f1e0bd847732df73fc29b6e21e6f5eb67b2082579910c236ff46fa5309f997551f75b1dd2c2038e3c77dbc8ea999a391bf0bf565a171072f5dac751829e352d501b1f8e7fb57ee172a92d78603b03522d86beb72ff75856de8b47f80612f791f995bc7a37ac86583f26d57062f6f175308dbbbf1e308f4fc7a08f833e55803cfca06b87c3f3e19cca977533e5f87180c13f7928d6894ed0c3da7da36f859c9a74bc39fdec746b4430d43384513ba29cfe909a28dd417e7c541cf0ef8d8a2a6338e7d050a976c97949b4663661da78e19ff968f14a199a075d7a91bb5fc292850f195709f26c3b809378d903ff89e30a7bc66dda908349506464d2cca06a31654781246fd8ed0c2a2714117ccc72cf4c8854e584f40570d25472276452f5a15a7c03f312ac553fd22f0bbbb31114bc1fd6167f749ca2098aed1101fa07eea396a4867b12fe9d9840bd389194f8efb8f54ac0ebb91bbbb5702f598e1b206714380f56c11229c9f623241ebda48e0681a7e6273bd8e472a23caa96e54b683410287f04a1959d5f41b452746707e80617319fae372cfa42d82ca77192c3e5209893e4bf018e5fe67fb1ddac9ccc67c74b4f8b61f46b99d460a3b13a69c23d4897283b0b53609647c2b24f93102bb6142f19a5aa890f37540214c0124492f9634ce878909702b3d3600188404af88640c01edf683eb91752fa8e4284ab0751da14fac4a430a532bd74e4be4979ae597f889d742944a0af8d46581f92ffeba5b645a0229c577f86204767397378cbb9b412f476fc64d7144cdef2e74f3cb63091e2f059521239966ac19e3add2d174b70cd80122c4fe6d46a31f333aac9ec2cc477661e00268a31cb650e5060cda3f59627943b7a5c09f8870616f44ddf18dc3711938e9f24fbc63366bc20809e025a84de953ed96140230cdd6e033299cb618aab5dba38e078753150774d0dd0722e92596c7f37b460aba0ea4400c3649086e18f70e7465d6bc609999b36be0f5770190879a6d2e24957de08193867a836ef1a70a181809e6945c0c68760695fa692441296445ab32e0897455893c64efeeb0cf5c763728204ee0f1264d9d8e067cab8f23919ecd1979f241d7e5c52aeceff07d7c271834266bad5d57c9ecf27c71eb3e76f49d205c5d21f225b8872c3ded7d623063cfe1cc89cb496ecd43b2a8ca50614e2b96ae103ed4d08dc87d4fa850d508369a18cbe8dde79dc69a38d88e8225c1e8622d68b8cdeace8e29e179ff06ec2fe52c230cf60815205f69fd12c8dce114550173fd1ff593f5b408af100007b5a13413d2902ba6efbcf49bd80ef100fea8f9dbd49056211b937b576c774f5df81f81891abf7c372e8e0291fdf379ecb0c4a32cccbf929f04205554c41d60dcf6965c38a8fb3f1cb06219096c23ce33686369e19e275de3407fa485b42e6d9b086e1fb83378e35b9832de1310f41a7da9388f4eee4c4d373382d933286deed0326a9dbd0e92cb175a54fe3f2ff1700ec05ee59d9e9edebe83eea96addf57e1a1f77cde0f8a6bdadfcf90ff6020bb8e50b29483dc7c2ac50aa68cbc7d9347fd821bd637e9b5c29c7b6f2974524c087cae2b7a9fc5bcdd0798f477d964c212ea4b81a17c576ad8adcba827abed50e76a860d64eee36b024db9006fdb7a23d1f0c434c7e236fc9e702e138c62516f8abfc36d730464f254ac31f19a9d1962ad165ca5a5c13a39146484cc231b4f599672d8dac27b817f2b52a6bdffead0fc4a6248035c4a5bbe7724877fbb5c14111d04f92e3bb430177c964f9fa274340a4d281914e619302f3726274dcfd0753d5edf11f7955450c151074a6e301e646a5905c4985d25ec30ce0b8071f528d3204d249cd3888cf039a69e09292f37ccb2b68bb96b6deeb51535d59a7345b8ed7ce467d9d34c7cc71dbe5b58364f1eb686a04842f1adb3f631c2310fcc3e84c9ec85ebeb387e4537bb57cbe87a017aec9be014400302886119c214fd7442c5ac7290011a1a9a68faf6b8de23b676254c95af168d3770e656f220105746bdf3422b1a3b7faf878aecd9dadb04686f9146ad30cc97d800d3d75232feaaddfd17f7d38e3b11dbb52efc7f91d451a33f9903a08dca2886f4cdd12e93f97d9eb556e359fcfe2deb16d61179ae0dab4b5bac83ae93d746754a7a0e613e09b0167c31bbf2bb048aa2d52d585c6d93cb5fa2584c69d4c29ec77c054860cf06e37fce1caff48b83e38164e3899595f147cbd8a9d74c5804a3e327fd8bdac0fc5cd8250faa0dc2740ceec93703f351dd44d7b62c135888053528913c04543a36017758255e1ffd03f36007e667d5a8c347ea2282400465635f23966b4ecbf8724aa122f6869e73cb744fe2a09d006c165668a2f38d3e5e23473d4ce60cdc78489286f80e59250e78d27ac84c6e65a3a5acb6c6555bc3b042e8c7cb76b5cb876912e92932ce50634f39870b728b5080b5b0c77d2e590a09169d6a6881fa0f63cfa7cba594c85e8ca4730aa21a4645e928011b7516d6e72da315d18e1b696fe99c13f6aee8f63d56bbf8743b8b9ced1011d4551c8bf6efce3501252eb4d40b623e8fb13f9c8a91f0dc54f3bdb1808b2374146d4a2c8e9e2a3bed0eef0f929d4ae2946b17062cce47e1e7a768eb218024e4ac4386aee75cbc8b99a0bf8578d617d6d45b06539d8ca13fc24ada4705e78bfc85bc2d81c23081d4e1845ce5eb27aed98ecba089079cac8c0ea75243841358fa7a2499ab2e2363432851b4b163d784d8f94c92a029751c0e5178f224bee0811030d2335330f20489f65abb55949f4af3846dac03dabb974710700e067c6e25cba34a144a5df68ddae5fa0016f89f81580b10d88ce90a9d43aa95c064052033d60f4cdcb2583074ed93e475e98f45997c5528875c809156614605503906e3b2defad2e6fef90065691a3bc7eb87a2c116d89195550c0b512afc1f0c2c64d883a692503f14ee5f44ddd0591180cb99349a41c254ab35f1ecb0340b3979ecd2db4c9e211c07310fb360dcf36c22e6910277274d39c2047be8acaa5918338967c557f976268a8b7a3e4e871c289f560718f54d0a57074ae49eca442b443d9af9f6c9324ea555e4260689cc198f15251af51276d70519f29d039f38766cdd9cee22a9084c929d0a26df89e132eea24ab74d07630c57f8819cabdb5beaf42cf0ade0aed9d7e399a97d08bb0c6a92af977c865fbc1968d79e392854a6003d7480270076dafdd5d591681ac092822fa9e51d60a269b9f92a1a9b46e267737668ac667dfe371da8fe3a0b4e91d4a3a6c29d1199e31ec6d419f0c8e6d2d029303f09741a21331fedf152b18ea7b55fc8993ac2443d254f6b52c1fc620b1a26b8af8ea0f7bd81a05ecbd10e40a2dbc4755f19740b358ff96e948e1e763b09dd991d09018a6a80aef4c34c74453480d0e94e85fbcd5db7fce5482819f40eb2666ef250d44ba023b9592691f1605d6fbc120ef2dbfbc7ab474c74891c9cd3975c152c66284b7a4ea96c2d114e5064a78dcc98e7458f791ab72817349754b357ecdaf97886766e57ced549421443469e1b511594db5912f1f9a79b01c2e924a6aeb9d711ff4c00bd0a8bd248c6750b37e3158270ffcbccdd52b15fa20c05fa07acf1022c24cb666945e176886bd808f1a246529ae7434a1512f4fcc46b78b2adf2de48ddc5a03b9e05b4fb31ae221987b9194bd56d14485648da54c5c06347b2ec705348f7b510257f1edc825e65438634a3bad71999d87770e7584e39dd6974fd8c00bbe8296eac9d31f3ae46e932cdefb74c619920d8d568653f88b0393ae7c8e78993a55e5b588546d602f894dfffb493332f65100f40a1ce798d7af47a70d668ecf2f4af58176ea9c6428970288851b18a7a3cf1df3f357708e7e4156f920bf40237c07ab669cda938eb09ade589cb4cb4011a19619c7dcea35a16f1c9f97248baee68836b9f16c617d6f28f7e52a071d19b4c0153df308ce8d41e968618ce218f35cbace79e83d8addaaacd0d05d9b6ed3b0db92f68ce6a2042636514305b216be4efc0f66bd3e0fb20c0ec34eaac4bac85a39f9f562ca0c956183d3924c83ecbe61b4d2b2e8b2ae22ffb07bd4122181c80d433d4622d63bc4f109824f5247083ef25c9567d50fa2dc37cfd4da87159ee38d11778d0dac515f21bbf3db3b424225ac6abc48ed54aeac945fc8bcf7b7714c8e42f4f8d719d1d12bc52cf2a8f574a9fd3dceec732c107a9e38cd18124dc044d7c1ce43980180f2cf416a7c1c7df68e38335600f68e56145b17e2b7ca30d5698743283edfc10ec1a2f69c31f605752e4ba66aa87403888e12d24d24aff41313a5ad42dbade0209a16eaec9ff23f458fb2b18dc32d58821a9191ae0a51e6235d1ca28f921db0488983f4fb0edbffb9c8cee7e2a6501ba3dff85acc48b70d9e4b19d5263847a3f693e423053718ee462477693444d86aff5b5992f277f6b9b4192095d316753163be0ada823a878ec9aa8dc57603e687021b68c0d1a0847d8783d3e4831693f7b8d3975daccf6c68f924c2ddbb48410ca1ea0c6ffac1e85d9056b79a478978f2cf6408a5ec3bd39274076d60b7d871ae60bab9472b1ae06c293b596df0c50be2fa8df23963fc61213dd2b7e1a7d63cf6ae6d611e17388300473072c2eac61c0554f781ea4f654dcfaf04b197255baa38a046b4a470a6de2bf00975298dd06149699cfa82491b3031a847111e8bca477a602b2f7eb846ac58ce76c5fff594917cf68599bca55d569d98201bb49f64059d840fa6fa6f76e525a0c32f278738417f0c42aeb61980ae4d52bb8a6900a40db7dedc8a1dabfb66326e0ac6e781449b767cf098f4e3440429b478e94c828d6c4482bd23cf5b13b6bc479f286f2b0e55a41670b977bf5f66832b6e4fdab7c53652e634e71c339dd4156593c7bd9d638f49d8338ad53f4e12533cd25a4085ace157759d1089d8606cb5567203442b7365fbbcd11ebb68a35234387406f2f06a1418020cf9f4b2a7547e81e579269c8fcbf952b90661c2b9f11fe6175a4b10806ba96c9f0e5db2cea9fd8a3600a9db55f0aafc68c1f3d0319f7588b3521a2d7e96513ed1611d7624f2db07950ea01c4608348f25503ca0634ed406663418cb10438cc8695220d68be05a1249ab111ec5d7785a3df24942c96bd70cb55da6e6f8ec65617c0fa5925ec007aaea849c1c52c8aa2ef22318953b8a24798e95a0f1deae7e4a84eb50f7ec080aa03744812c7d5d90a629aec1cacc86fffd4391d77543f92d1680d2feb5cfe2fa018c77c7527fda94e6722c058bf560d1b13b5e534d380509a2722063231ef780d828c14000058fa9c9fcf62cc16aa4014c857b9ebcd528b2f78a6fbfdb56a9e021789045fb1b9a490e9efabd56250ae99f3e983da93fd5dc3b0dfe6ec8c1bbfa513a4f078e35ae482bb7a632a1c509ab9bdafd2c8264b5acaf54da90aebd14006c41732f877f070cb9bf745e6347e2cc0d1f881427b9c6170389f1226d948c9d590ca8a694b2be32e18cbfd862b9d19fd0aa109a382736694f94799212e88f3895246e61ba9644c7377f2039cf078a005c7a8632773c3c00597106c6865e0474ffbb59752c1fdee0b0a23854c50766a0aeb63c59e06b6a3ac0a4e503d15299e570513914dc2f6ceef74d3df9192dddc14627113079d20a18e7035f833b09fc36eb8e5a56bdc9c3aa69e0db0e91ee88b834466e256e14f75646a363032332209f004809a7c93a8e979cb96430244cf0aaa853862127896a48732a1e972610dcfdff65764310fbdb901f60bbf429cdd7b864ef83c88f9f6e0a109aceaad9438a1790bb3605c40ca67ceca212c8464578e8486d199a15e564b7f66cf1d3bcc75721afccbff4b7293975482dce126950b4f6daeab97ca2fbd40bc07817ae1a9f49e5389e1d0db60199fa9280bb2f1623a9e0ab0b2263bd59fcd3e7c542e8a16483f9ebbcf4e466b58e4cab75364663c51515be76943493b435ce5f48073a1ca68fb2b03fa42dc436f20403dc76364043048e22274b8872c2953a9624cc17c2599b5d1eb8ae8946f180d9b041072b7b06777182f294795ea4634c0374b546888c0967da669e7e13f18d65ef08c962429a7fcbc4517b738a386a0d43dbdffc1f82df39c5f349dedd1bbe935c4cce90d452572eaa4e7449cf8bb077c0a49974467e09382577ec73046eef000cf07e4c55997094e4329db0a3b6bf150d28eae6c03df4d562c052c7bc3703d3f7fe58ff75e6a766d13970fce3464a090486f0bf3bf992668baee4af2c8b5fae8b47ea6afbee7b47a28336e8215a8709774d36c634c8516a7079900a2cde327bc0288dca17613d14483deeea82c7bab965542927f74abf08dd4b95211a27e87a9a7b403ea0f405252f9ce4d5462da6d4487a6fd94f83effbdbaf1871c47a1d0ed3dddc85aeb96949b3ab547fa74017a04370f771106441ad1200d5a8ff19220322fe0561f20365c2406b3e9603c387ce0e48700e54f492f7fd4e0f439270d2ba099f8224d49e15222e13f832ee80274be4cfd7050b2f403662690a9626fc499c3cc852f9f6f43a64441eac151d546df63c8a750c86cf40b75b75fa2c0db800a1561d4b1fa5a2fe4aff8c6a3392ef7a655f052f3b0b342eec61ee10820edfdeaed2014a37795edc0a829402f86930f499614a951b339d20729304d64c370de268b1f5421338e3d51c608317139cec98bef34ed17e4f6b7019a049c6773961e79959cb72c953176f812ad3ae77ede304dc73968ef8dd0393fa5e29ffacca0ef912bc710109fdb36ce2aaba257ba0b1d04073fa480aa7193ac7716d46ba72982eb74c90e602378633c9a4a45e16b194686bd1198089f6cebf0eaab7c9f380d5a3f74b579d8cef2c4596736e909e86f0bfc9566f80387fde8b594e05c400774012fe4c56e4c438420fc0ea4935a10f37b5b92abf5c17ea3b70248003f0e56b4da11a8b65223cfbdea1a27874e7437311198f874f4673b0727b44b78b2ed753f8809f3dfc37412bbed992215214aa0395494dfa6d79a84b146359cda9967d53cee4cb879fe86849305ee20c94b4680ef9d2e534b85d334bc40842e829fb74cdbd2e75f19664ad8c9adad731835dd43f47c313797f30cbb0450ee72583ceabf0a5ecca82d1bd8632888d4029245d4a8a5d1a2fc1fc2e7848e50074fe8c26339508ab99b652f4d8ed8f5cf898bfd8cdce8983d6c9406302b42c635d85846aaa70c1eef5bd2eb88c7a65aa9be90b5ee43902c8a5374935ccc117459ac0c766067b00145f64fbd41a70b1e80dec3663db394ae83b3f852765d56a90b6ea70e26eb3fee2b81f50655800bd55fa8a42f5282fecfc0602669b906e5cbbc9db9175d248034a09b6c64a2bf5b46e1821d49d818d601218db18ffffa0f1ac1846d99743581f1a7d24f171a7b00a6047c7ce0bea4d53c254622c60b3e5f9e7d36f783d4f81da4d4742e37a54f76c4d14054a73a3af48a85f2018347754ad8fd8bcdaa80e922c3c1eb42b9189012b965db922c51959d8cc103733adcb9958a8add6805a58e68de6662b357a125b08827c2d8a5e5ab7918d81b3ce558be8d6e78642a753caaab7e92ac095be396faff8502cd9eaa1712e07743e75aae8a987f6288f95dab4accc5d7de36a5e669d87421b27c6d6a8102232706753a0988419a7871703034232ed6f1f1d0204d90f2789cc35a44b268179ebfeb85323935f6c356cdce9e70730ef4e91476a617a90729055485749b8905b41e67678581d9c93179385367bb608e25a0906b98b990cfc54553c4e813d73306e78bc246a06d4270b97d07c22d89dd64fa363dc2118cc524005de70ddbe3e41200d5130e9ceebf767955e0e68465dfc9a4bb1e6940e57d88b29c00be5da9156f27015f79844244c0d721c97769d8e8997de489be18a07213a0d302159bd61228da0369a19891244e8162c73fe5865c01428b996da6dcc2bf87792bb3c66d078ce044769016f22138c0294e22a6b4bfbcd22e1767ac86d12a052156d1ab637c12cfaf864f7e073e0e377a1c8610b6cbfc8fa23a808c02ed877260c20b3745cac8b93190a372bef3c4981c7dbe460a7cbefd5d0d3cb405b7905fd7ed7d1c180f233f6ed371db8988f289f79502e98e127cbaa2db72fd3ac17ca9d610dbf39d4b99a024d6bea71d951f9a5ab611c38ca835a07e59de56902a9e0ad7b746f0c7d68e7d03ff047adb4b7ce1ef78115897287b6b5c37cd8ffb1abdf0ad3e4b3901dfcd765793a4d26c194c61f92817b7daf09a27f0ef12bc5c9f339ee93372830c21c78a71750cc1ed02b7508b6aea69b2d7433ea9483292ad2f622f061b98eb557b0d1f0733e985c4de496d9cd014dd7aae96888115d18bde19a8695c724332c83f3bef069adb09cdabfe03a388c15c19ef63fc1fe1c2de6f22e12ef1f229a623be17c5cdf90cd714a7d372aef3f6854909bd30f045be8d450078e0ccc8c38c59c30117d34ab1fb00b226219c262347ae56cec2cef95f10c1b57cfef132e731e2d30c8eac2e33ce6344aae44e1378f6ac220c604fc349b0e187e921c02aeb567d4fe78eee0e93f1c383297e915e4fbc04d70e6d78c0b2c0bd9108a70ed9ca5b1d779df928d44fd7e727145af4ca66b3d240c777dfab0ce712730a97e0e941b45238acce442263910ce2f302146b1cdaefc9c26f8e0b57da281c47486712b7db0c6016fe42ff41b28befccaaafbac76eb269e1dc64bbed3721e082a46d304cc526d8672da98995c19098435a7b81d92c4f175cca327260d696f3dcdb784584d1145a6d0213b2fbed6e237ec27703f5b1027c0158ecbe55bb4546907339cfabeeba1b8e237b3d1c79a7340a5581c4e45519d78f0b59f2765838cd260a320d99dd5caf089ee4d203e739556a2aa45e46694804fdef1a81c3ae4f35c093093027325f700c6352ac4b0251a1da971173c650ea1fa6a4d03e76f4122e70005dfff30e7e336740038244d178b4a88dd5aed4c513559ce27366bfae70d749d1e5507d069b976be1bed395b3bb9695fea02c361ab0ba6194e206ca3fe54034bf30267b46659521b7c1b8c41407ecb1b4439333ed93ab8b3b4a7156c691e27f70e05177c7259c51dd9f709b9d601d605b679c02547f3948435e1f50fd976f8d034081dd83dfa9250f537972a6f66e3880afc089c598b8cdaca86f0dfd2168478c140770851f08a415e7adeaa9761a37827e0880bfbc08312409552f2b6437371999eb696ac12d761de8980d8094af70a7bb111d7cee1d631362ca32c25deea066e9c558f860fe76afad15da0f65aeadcc910809cc44bf4d96bb35e66eae7e76ce4e438ad40b5828bd2b3e4436113ea5710a7ed84d13b1f50b412e094e1a7e451e645501f35d170131c6d08a80138111a7ef148d922aca478706a1d6ad1f0d5af71b1a6a8ee2ac5a1ba669457cfeee265fe0614d5932c5989ac6a402f580f7d1faf57593330ee9822910945ffa5c56e9783a0d659116d0532d66840aab1ca0d42707dd4c0832f7588a235f364ed021b86f3ed26b920ba3e49d3d64a63117bc92844519e4be4b8018eaaa1362dce74d1d8a069a40751d1a8e2589e41a931df901af7226ece97ea2ea5fab1c59a5b55a8932c3516fed7454564a7ab7e15b38477bc39994c273331cdb65b8d44ce86c51368c2727cba8c3591afa55ae5434bb7aec558f206e42d814d2d5d03fbd745af70cac3791ea1b63d8510020c10a9736b5208722dfe79eb4618722e4e1592a5a7e98ae0ee3038a1314d87114467348a14469f192ce135c7c50eb923051525420109f2cc66a20c4d805d9b5519348d1efb068724629f87f9ccff18a5cdb1301f43081ccdf213d6a34855ae8a2ff1742f77b882943f6f40086a10fb3fdba1ba6d71f4f6c070ebef15549a5b3173b358d474efcb8fe877bd86e56b0d9e7f951c212d05f00464371d41d0e2140edf12e5302f49b5f18ee7d33a490bc87bd552c6fecf34fda5270918e283631cd0373ab86d4bbe41c5700599aaa623c1767404d97027dda31d82e2b5aafc3d2fec312756df42db0a97c009f121d9ef7e990a1a809c10ca4645d5bfdbc779471fa89b407895ce0c043fdd252a9573871278947631185d41babe7daea1d719a0495d0d6fdd6df3bf407bb8192fe2dbd06d50fddef0953e8e8d2973c4a92bbf421fcfbbc7e75f621c7a4d65d21414980d2fc676600472da0935135cff09fd1ba32c4381828837f01fc5b53a907638333903a66b6a4c0344328365f5e715b5dca8be13f88a7548b7ebac077bc79f184eeb23ce2fc5ab57d17e8765d938a3e62e5bb27784e33d9fb8aa6c7119b41cfacfb397e8556ad8c52aa92e37e56eecd0ed9c22aeb830314433d821bfc71ee346483186d09e0f861f3998484d8e471ad5a1dbf75f7111f2199d88398388cb1d112d5494a111b81cce5a2c979fa8b52f6a4f04762cbb811febeaed9dcd9c1171c365579c739a72847227eb1a118f512de66d4fb21325a5da52a1cf918ed2b00e684094480163a6096b6280029e2bf1d62d227e6d9d1aa1b206df67136537e9c1ff8a44e95884eee61a16be86842b21ea83ea0faeea3b2f3f0ec7ac97f07913ec6ca7a6d15329d1516a5bb502041ce796e132a500c959eb7f0c3b1f828676cbae65000735a17f34535d46b2228dfca2770e7f307ecf7c0462470794a9072207ae1b093cb0a41fadeac7ca2f1df782587bbc4e2ebbdf3be30a678378e62fe1ebf183373b60acb6f73f31f71cde398becc13b122fa911c45f1681efb5ec3819afafba2b88ecddc8cd2598e721c9225142614a8d6a21ca0b41a549efc126ffc8eef81177efd47455f059df515e4f44defa7c8d36de918c3fbe14a1bcdc62f9e54bdd78c00f50575b19b21ba10830d584f2afc040676acba5a067f6c7dcf1201419fa2783ea54bd87a12fb089f0f72f57d3fefcfb9ad2fdd3f41aae3dabfce2d0272c3138319c5b5f317ab9fbc85059c9e9452e7fbe529c77a26165a6ae19fb1485b27dbd2c3823ee8aee8096b3d39cc3ca821a7088a646b205fe8dfb54f98f10daa53057d4931aa659f3d2dcc75aed8e8da5f275873fdc0c8b24c97688b9a640e62c1f6191dc31ac8b774ae0710544850dba078ea51f5d30b3c930c1d5f56a2af270c47b043948b77801b248aac8a0f7c7ce9a2bf041dc08b3756116df8965bb529fb20952090fb20120c63adb6bcbad15c53d9e72bfa4ebaf79e472bbc71e1052d0f3ffb295f42515c481311453be9d382f348f31a2ce4f004da0d14a050e27c9016c2e6f8751c8becc81437d32ca408d08da0134aa322543ea45bc8955007514fd5fcf3e57225380beb08f6f88429640afd7c5f462f4602b542573af97e832405d74a72bb5e226cb75efe4ec21b348f3576f365ecacebf0049f759ebb0bb029b42c60a8fa017931bc36282eebf496d9080f70cf61c4eeb92ab7196b3119ec59d010a66761c63902a0175ba88818383c62e58027d2de874a0fe07b63dd892773ba146ec10d4dae353434f7652b19ea901de7f9ded866c378cd96728a3f5f17f17e6df8bef3b0877d4363bc000da15744e89334b717abe1d1df21ccb9d8680597aa3529aa696e9dd6a907fca26132646b936525be6a24df22277c18a0d4c8e9df667c933dd9f9dad01daef978d60418cd1e26ac563b8e761e7ac8f74b04a8f5caf0d2c1186eca27155800540278787c0ee0b45deaada338cb0b4ebbb216b2a39e2ceccf9df75d6a117f03d582e876c0603f537f0f15b76dacb00ede9a53af65cd1574e43bdd24411b1072a563af96a3272811270d7facc61b20cd8f828fcd69bc67f19fab8d37faa3471661865567dd00d5109a0e72a82a391edef3c391954674f8386df964e536a0ea53b298422494882fbb5621be08ee339392eedfd48c474d5ff81e8c383da0aeecfcf00c59125fd9f569d01c34d39229e09dd91cf80fcb937d1f1e46ccb708b56cdfcd2e353f4daeaa2cead7a7445a4db193f8d34c176b770e354f58ef39549fb0fa798b0b633141452188c72ddf9e90e4a033b536c72ec20dc60a42b80b007eadd4414ada27d9264bd1957d391282b132241b34a0c556b80f4069ac04eb4c70c4435c0e4a5bd0c7ccf02a87317af6077aee5ccdc0057b34faa4b2f6ba04c36afdfd3b49e6b17b230586d66774ee11950ae643c0a89c17d30b244051105c671b21278e2d29266d071d03dfc5c34ead33929d069ccbb727d6a7a6e5cfcc8bd7ccfad4a06970a17953c96495724f3ea1fcdff2157ae610c81d2165ec145b03e4942fd7438f240becea4acf7cf811f92837d66cfeb9e2fa99ba980b8980fe36d9c5379f79a63c1cc32c7ec687df9586d5feb2e707fc613d39a108bda470820fb538225e57c00da93c7120c6015e67e187d8b78177771d20bfc7b7f8ae562c1163183f0be11bb031968bc1da419dd95807c06b0ab271737a912de04b056182ec58a39e9e030a16c5b5e5a9d31bba107f031a05dca2fc3ce57a063afca414ad1feaffed3517ebb2e988a6f90847a00170658dd166a2d66bd436b8c3d174929f9916fb1a752a9a3ee070605b2d4959bbc0969c5c5967f5af99d4f8b6470968b15049a48ab22aeca613b0952e8d8f84e3537c7d0259e71cbdaebb7447e8f2496bd4d4f34e34f1be8df5e8d93f126687193e580864278f6d17a532b85c23ee01606a28a91cbb08b1cfd7371fe89d60cb60e3409504326d6d6a676ebfa2a1ab3ef16d03d3b45143468965ef2490e8d5947a68b6f9fee05ba0bae97a212b388bf61d70ce67d2f4e0ebcbda205dbbc0b06a53a9eb3efa971054c100f5db761ab95d00863f82164ad74ebc05b45c9c614ace3ab89a51b722fbd41968dae4937489dcfec64b7ee035c4b32512f3e6249025f62a7ba67e47cd7808bd606895dee721049defc151f6934bbdfb245b3173d4427ed4371396c9fa18817aea27b9f90045ba10ec8d5d5510f42f7bf2c0d7de7f19eedba6cd4939f13be61a3c76a9c2bfa1749be5e381eddbb3cbae66a12dff3e6ea3b6f8f287ba1a187ea6fbb4084e7e5f0f78f3744d184837a1399ad3898b0147efde6a2025b0e72802e5c1b8c754134a12e6bef4ff1b839c956ce4c6e2ebff158066b46b2a0111e5a306b99c7760900f2b330df5f1a13e347765323452e73e77a306062a0dae4430406fea77549c97b4ed5016b889a7f083c1acbf0e8957fc2307c17aa741172ffb190d6e3d595e690b5c8267f236223d7cbc5f15c170e9ac76b4369a45acccbe86ecd0884bcc1e69a132b7ef72fab13942138f5f0c4846cf6aa6e13572fc7a49b8e89028d7b6a6230b4c4266fd5cac00d54cbbf73af6c88b05bf727b1db5bf4359dba3b568bb4da990c8152c001c316e578ae39fe4a947279fc6af1d984b86ca06614b4e0df544d02449c651018695b4fc00d5be4c0ce8a1ae5314a9c11774cf734054d5563568fd660feac5a7c21a109988ba4c694a468e4b62681df54f4695c739266571ad44efb585e1db6ba5987a2ece47a7b1c9b7c37b7e9e9d12dcda7a4f4622f8890733a8fe7aebef95ef2779243d2f4ab84d737cb9d7b0019e25070b5e9f99f45c4c90af58ff67d47bb2efd18183183935f63df8e0ef6f0d75cafe45cb0fa18d572f1283b14e50261d8d77cc7f9c6c222c907a0273a140d8b437d5cc9c1254326edbc93308b08d0d479e645eaa3b076b7e30dea06f65a879858ea2a5b50cede60a2d8a8723d1d5d7a25d71625cf0263908c200d1e038af055d36ac82e9f9597d63608a83e827cec074ead5f4c56628fa21220419b86686f47ae032ee3a6b3682643774f3ab7ec2a2ff1f5228669cd4e9f6d85c671b391c2f26caf97663fd1f0f14bbaf5f04641b59b65510eda2eaa4b65918c933776548726308e471f54bd6b523ae570fc991a1be13676ea113c6ddbb738cf94025af6286d3f20fab1150457390239875cd8aefa05b81ff0bc646db2831fe2be9af033eaf417fd6ba59d18d37c75d1c84fbaed28b780356fcb0cdae611b48f1b7895ea562669566aeb95f4b47fdbe798e633bf81723bc212f3c8ce0ecf197670b886324d6af183b80ee6f05b17b05e4fb95572314a6be37f65787cc22a1d4f4a999111c0d7804ad374d76671eff40e64a3505a5cf46b1e27a1b4e1608795df9c7c8b883b08fc0575b94edb3b0d52e4ede5f74ee2d1bae6588da290aed1f65f089b20ba71b2040865a3491418ed5ef3505010a318debf808f44716b5785585a43c2af9e42d9f00d5f057ca221fa1f68828cfc91c4a217c89f68e5add892088935020111ec369c5fbc9d5c3697f24da74bc87a7d2d43d0589acdb03244f7e5946e7e388ce9280961b6520c11d45692059fcd5d12298208af16a5da3497429bc8f259397de7d5ad08ac2b4f4853bf99d133af8f9c1d7602e510c5e922c54516fe66638399339675a608a9976f215fa5f5c243ef243ec2b1499bf99945bd067dd6871768a6f91c3c555b09c8841356add1c98d3aae261096fa0be9652b2381a58e82d4137e54cd9f691a51a204c2bd2d691e34cde1d2f75ad2ddc7d67025650b959f35317223d7063175603f9babd0de902eed5ae40a7edb93f83e2c7d8417edb8eee07f204a66a8d9ed61eda2733c78625cfbac5e7858421c52329f23a5b26cc0f4ad385f589dfce39446ad2f5d166c27bed8a5bb4548628119f850434d37dc2a6bf657b7f268abf4ff6c5d67bd7d5fba65c5e0f357bb1dbe052039c6b22162d5caaf33e4041a8df9ca6737d0846f14041e80a02a15efb411ef67fdeb14c324ef0080a23014e226524be130861a7a40cfac1e3af1b7777d99cb8789ad2f242b714b0af65d6899a7f921d8903b3c54909a289b1b34646fb71f6dd1b400daa02ed1725cd8ace3183b28da385b3b4763a9870c940aab1086bcf6d7a5ee4c1440bdd9d2bce2a6ac43c7b52ad1de6e25821fe95a20a00b11e6061cd80e9b8f4ad71ef352247c55e2660a6b7122343d7befb26f866d8904ea0a701d45295d65b0578de63cb3c012436c1d57ff8d7eccead11265522a837bbfc51cb7ecc093fcd6ddebbce5d4b2f0892af476dc5cce324e18944e4fa423412e93dbcb4924ea1e2c0372e2ba568517628f306c53be4efc059e04473599bb9a4b6c6cb47e493fea478c4d99b31017bdffa0f3418b415806ad6dbc580b6340440773a3211341dd596553e92244d555bee00108b17064bb536e251767abe0b91e6c57cabfe87711d95a88fca7fc207a87e747931120a63b891d81c16ad7bbe2b80d8d4c7d057d157783c4da3df8ded7fbe76afda386718fb47467863dc26d102c97b4842690f42808fe7f5c5f939a8921d09bbe39200b174b80126000bcc549300d08509bcd8fbf87425842607054d14168b093798532ff2f7cdb8d37324c98e34936639ed2a20edc7cb624f91382a759b150e012df97c70912f86c60f97550be07c43b07bec67bb70e3c5d13e53c081f0606f0e59a517610e9a5c82a78b8efe74579f7ab01411dec75cf77a03fd37087f08896712710506864d721e4048ac803ef65b50e4242136e78f7a0ead6f2b0bc426cf91290939891a44e4f0ac2bae0717927a8daa295d594291cc060692a73b681014b527fa6994428f4b73a3fa67cfc9dfd72708e923c7cc35a93b0cfefeb422d33fb9ffe165dff55284aa87ce35f183fcae8596da166de7507462a94e427027d9894fe21842f394b4d0bc04018c32e054cd9dd2711de97211ad120eaea76e3a4ae687d1594aea8fc19c0ef7d9dc3daa8776c87aef287002211440ca9773bcdf787d5b9614c28121c4e1d640c646c88df5ed01a47d033a54627559309c19a5038ddd570ae84b2d617ca11b5d9faad17995cd2d19c99b45cb72912344742fd74b32bdb8dc848954c08d3cc4a31d38b0c51d16cd0bde962fc458f0f0379f8ac3affbb86890b2f6d92cd9646fb9f796524a29534a0100072c0797074a143911d48414edc27cbaed72864f86cbb1b523a2684594aa60f55c138b2708d937a7cff7f970d2c0061c7fd474b8f8fc9673086101f78d7f69a68ccef90fb859dbeb02994f67969b03ed4813ce8476a44674f92e833a039ec1f71b41800917f00c9e1a115ccc65adc7086e479f32e6b610b42134191001c0d5e14b51c451158e3edfef7f06e5dde468a5f46badd775cdd01cb43ce5461c27ce28a5c7204ae9466837f3eecd74842824701faba267f2187837d3924540fa9d6a0648c933c638635c7269673926817bfbcdd0c8755609113b630ec225b97c70f960727fd5b97c7025a19dadce43675282e52e89dfb00c3b93a32215b859558301f7fc9f33bb17a4049ce306a679081f078e1a3550a87f9389e3ac13dcc9878cdc37ec6c83eb1edcbbeaa80c4ad67a9262dbd1d26c8af89c41c95ab4639caf553176ce12ee6b558fce4f0fec614e5d8ecc3e85a988290c39b1c2859eb22d9491cbb54e6fb2f735d57c6037f24fe78f4c3bee9d2570fdf3f3f54f2781b1c885cf9eea0b65bc9b7194b392b89916032e3a7972b90a279fef8cbcf24b2de31346b10d08388982517c3f78fdc6c7c9ce65202747ee1297819ab06e36aae1db583847639900bc81694aa68711c2d3d73b97fbf27895cc9f67543d38b41d966d8b8b119e620f4941281bf9db2b5c5f3b85d371a2224755691d2147f51328382b85abefac2d709f13b55a4ee4366494d6a9a180ea37b79fb60e0fbf6d8469aae0befab2630eb2c2f5fd58e8425692e6283dc96d9fcbfc905fca09a157eaf8f2e3495e7f1abd29e3284ba3c6b4014fb07f4ef8277f383d0c085d6e416f5569bbe0e6d387ef2fa594527adb16c0e799af862dca6a866917a63d6673339f73420821a5167bd865a53aaf0e3ea5934e9ba546f4a132179cfcf91f479f8beeb4d35ec0f5639cdbd0feb992c95e4934add64abbebe258bbaecd3eb5eca8cc6d707dac66f682b5d2969fb205b6cc444985bbbbcd45cd195f468f0f5f42e828293809bad06f98869382b3c48de5e27b9b85e3e7e4d760ef7f01b2860b21a594d2ddbaf3c0bde5dc9dda773f59fbd65d0af6b139a23fa2bf79b4dac7b0d1a6599b6bbb20f67a87751f0e77eaa053aa885a44aad665202644b9f1b92745a6641e28c743cf401bbe7cf9d28b52e060ce6592b16751e8810991cce0db2d389f1f6998c00d525e5d8d9452ca705d7efd444dbe93fb58a834e7c337c9d39437d97c59842b712847fdfc0cfbb885e1e0363c7b7fac630c7b6c9484ec3b83fea39f1bf3aaa582a358bcde7c19474913151cf572881745a386027444c03d7e2cb2f83b5870fe5926038eebfa11a4f2f9d992f020d1b147708aa4341e760852020fe0f003034d2c17b80fc7298ba778f5e5ede028e8411863ad55b214eb3e2cc7b1e3c26cd51e93b2be7cf840a49452ab1266f586ccfb44608a3740aff2adc43cce51d2fb4e5efdec2425dcc151300af7314bfe0d8e23871dd23bc9ea9da427397083a31c070e193814aafb81058e35998bb5647acd391d64f179e66bd5f51d26addb4f5c065aa56ee6f60aef13c1951f698880f3704872da48e390bec8cd901d5a5e041c78fa5804680862ba50c71077dab608e7cbe85087a3bcc59fe43b39c4eb5857038efe1be2900a17dfc2217efb88cfd4e11042ef1381e95ae8e9f04a3bad8d3cee6493baf379f36ae87b9a3646ee84da0eab050e7e10550e3ba077824f7f47f44ed0db644be99d6af84aef34ea1ff54b8fafb7b9df906d24359b1b61919bbd0e683ba8edc07444200b153e3cc1137ceacd67b7f1137a3e6a9880a3f84ff106486272e4ba3a4bc4f5f7d5de77fdecbe2eef6eca54dbd1edc5eb65ed4ef5e7737d79fb69ed8bd9f3216f3f7f77dcd928dc572f7f107b6d953b70d1bd30b69996e2be7a75c8972ce33287786d13ee7354ad51436a9777614f5f065ac231bfd609347604b55b743af4b55ae024fd20727bca05c1c9cfb21f7df6b673127d127d8e5652f7450d6696bb326c7efd8b2ba59502e17344ce8e889b439c8720a6dba7f9fc6d6d1427fafcdc9de87f5c74f99d3e9dfc73cef9414c97be0ef73ff90e8e923109360b771fe272885f210b93e9878582836fa570d0bb92d01964ad6b71ee8e7697eeda8e282577d7ececcdcccecececc50861a0a70d48c4986475f97d06ff8d27670bbbb77a45276f3b9eb7b512135655c624d8ee305ef8b6d648a22437802248414d010828086702468c85aa193cae2fd3c958aa954cc5a8e8ad50538461c958a02f7b50b6eea328203a957efa7b41d777c866e7719c82768a7fa8dcde5d9288e8adf47300d7c1b1fa79d27f11dd761c27d7d441bf119b08f4835e1bc8f64d16f80a1c180fbfeb6e25bae64a2b54a29e7db5c7777acbed7d701af7a0361f046387f8e1f8d60270bdfc2cf3cf871c8bd6cd7b176d54e07a473468792f5c3d084e02c5732ddd1fbd3e84b1de7b56eebae866980f039f81cc771dccfdfba475df6acd5686fb720a69b5d5e8dd651b07503340824aada130ee2708e1627b8fa9406de3edb8ab6cfb66eeb5a73d73e8376eb20845a8c316a9f49bb75524a29b5cfa6ddba39e79cb36a5170f62f156ba63c87d59239cdc344f43f1c973ef5b428b4d167d8c8f351afa67de661d8dbdc1edb675fb3793daa4bdfe6b6963d6b9b77da7ef4a7ec6deec8d361f37890aee631d358ef9b45977ee6f1205dde07892ef53ef8f180738344f8d90edc5a8e339964643afefbd4844641e0fc5dda20832cff4870610a6a4d70f2619452f2f0cc39614729a53427a7d65a2becb427f8abda137c3dc7735aade6699e8f893e1c163ec15d423acb8d11da9a0a552ba6f1674d071e241ea41b1f877344981a826fc0207846bf4a75842328a14412492081841146348c980d9145f64a25afb53bc6d66ada02da8fead552c9fd54c3b7bde86959b84fa607f44c2647d5748ff6bc669aa8d5c4eb5f9f3e10f35481faf47f540ffe989ef42a9ca165d1a4d0b2708c693da01721e7284755aed7e69f8d6c802e95c838560e3261323ad1c097bf862f7b27f840faf9fb89cdcde6f6d9f48816e0198a00a1bd7d20b41f9ac770c68fcc6338e36be88d5f43af90a62dbb1abe1288bffce95d835dfa9e5d0aa1bd34c6a85d2aa59435dba573ce396b4697524a29a555abe164075330c562798ee7b45acdd33c4c743f1c38342a5c5a86f1905ea5f4bd938f7ae7cb51dffa9707551e54310df3205da9030fd2a5cf8374a557439aa44b3d98621a98629af9dec1d909e92c59225c31cdb556f82509dcc1cc0cc2f42979d01b0caa18e1f3c4123e3148a9a6584104c959b022087313628918870cdd44515d8ed273f9b94074f9a7ce8d4338373e25124fd1eb98bff3d1b79963d56ae81aa8c7cf30dee87df46577c3f9a79ecf1e0dfa94d6d03476ccd3a97ffea969d3b8fc34aea6d9d00f3ffae8872fbbb8aeefebfa6eb558fd4455e904d27ff568ef9ad33b350fbfddc4514d5df301bf7aadea0a447da90a9a5775a37c97b146cd07ec213d4fdb21fd4e5505a2c29744577e05427efd01fe0482ba74975c5c5aae2b0b8a4d60341eadbad2fb6ca46e4366b3eb161290faf3499cd6a3d653f695877b3aa0fcbac9ed676b9aa921030d3f7008b243111cf789919add02cb5e557ef47d6a3e9a0b3717d6d0a3bea45e841e9ba1dc4649702a1f7eae8c32fa10d8abe8a94245295f1f3b666629b1c7bc0a230df87d1d35ff24bd3f76143f12bca28143c66b949c6f8f2a6db581f6c8feb38f7dec6c37e328ae96e2bc1e9b9e09e9abd960bd491f75bfbf3ecbf86b1682aefdcfe6ca4f7af2b1cf623724da40ad067b8adf3fad04727d7dec65778aff365cde293e6a7a34dcd834684bc8d8c519377a284731ebe242c60ed46a7219888a284054fcb080b0d023011b203ca03fe9cf243810fa1a13b8e61cd7fcc935cca77f67c7ee22878ad4e58b059d2be33210166eee37a4ef47a9ec4eddb4abede295bd7df9d4524ae94f6a69cd68841724126fc7f6befa5fbb0aa4e157efeb3fd553f5e073cd102964749b69fa2751d1a54f7fe8f2e52b94c1c7fe8b7c95b83e75c7c6b6d7b6d125126ffd21f14a132663cafab5a71a8f7e9a03d368d89fe4f30be9fbd5807944bc93fceb3fece36757373f62315e1475afc7e255515f3cc58fd1a3e128a638d9a9b351c6f1a7c8b97c21f44eedf940451a9402a1dff53377efe4030581b40e271f289407e4dd83a90cfe14a9eb452112af9026ea4ec8e84629e4bbbe9bd2f9a7f9b2fee509a1f1275ac5159edc1c9781aed0226a41b93468388a39470efdcc34f083cd3986cc972ca567b526707d92dd4942f9a81b7fca4883699808ec4db3dc2cdea9077f7f0d7b13fbf6a0cd8d9a0df2d923d236f8b747a4b97a3d2890e90181ee37f62f3a87609559fb1396fd6569f5319f359b61341cca1522fc217dfb351fce9fbdd3e5cfcce37451667e2ba46ba81e91869a0df1d96be8f1683e5d4f3f36b333e1ee57376cf6e839a410e2c3f81008fcf8727a5f730df03ffac78e88ec064206db0a41177ef4b9fed7ce851f8f8cea67f5a95673617f22126fbf90d19d9a0df3a947a4efc5de071feb3ef939f4e0ae0efeded7a5b0fbe40fe9ebe1e501b95870b9fbae875a8f2b564dc8e8ea60838c449a487ba71ef4e1530f4804e242fa0ae9eb5ec53af620eb2a54a14afc6a8522b7fe8cb6568e3399fe6bb40fd4a571ebfd6ac0d0a2c009e92be4150083e01318a3244cc936b48d567aece15ea4ed01993f3f7ead4ea4af7c2072484b5ac9d86d0889cdf5024d45f6942874458a9b24b3af105a455105ada70a0c528e66c00a40401204218aa0c11278859050156a41ed072f9781a22842143d3df8c0073b56e4e0033e60e1440d525d58e182155074012f034151a588279e3c19d276a070a2415105a794528a0497ea82265d20b90115445f98810e05210e81eac0d2c02e008a1f48501c815ed0388b27a25c4f4cd1b41c4071051450eef735947460015c4062034cc880e80750c082164cd8820e34246ac02990d06800d4c40e5013aa1c20564acb8155b076440c4a94586da18aca0b3dd082134f3027a62001b194c00a963bbedd97ce358b8a2ac7994cff28549137e55639ce64daa48d5a86d5adb50c62f5d2c938db7c61c759d14528d9c66eadabd5a503eb0aaeb2482f9d4b07ded8529ce97adfa3ee77e9f4a50367c5c16938a5e44cb43156ed6eacd2d56ab55aadec8b15b4eb8eb91fbb18eceeb642755557b5aeeaaaaeeaca73301ae1ac314e0d635199412cc65914b13a65b49062535a1c9c8a6385980a7bd345c87884c0581ea5488788eb7515bbc6b08e5f74d73786b51db30c6bbbbe5d5fefc2d1a6653db12db5a5b6d4684b6d5b4adb52d996f23e676da9ebffd99beb2feba665d5835cc613691d6d5ad6bafd308a39e76bf3b359a747b7ab884a0935d3f7925ed6ed4fefabb6da9fd6fb707839f4fdb49e55dfcbd37a98c67f7b02f759a19eeb6f85e00d86d0f4dfdbcf0a41af3815a7e2541ce87d30557184e00d670909b584868488848a84e08d0ebce139ae43759c87ea780fd5f9a13a2aaab3a23ad7bb354454e437a921c719bafeb3a7bfa7fe702ad3ea59a89eeb25a8375cca84f32855bfaaae389649e85b281e922a986bdb54ed430f997fe61d0b754fca5bf0e78b38a71ed88d43f78b43debe7d2890316584db97020064d855e3f6a9e049dc68d3e4f6f1d09962605e4a2e73fb56e0d1ed63410cde4cbf4d775c91869af311dc5a5183b97901e3241343c6f7c7210ecbacb68dae256e255db9d87f2d4e2e7c1932baf831ba528b1352f69fcbce851fa38b2fd3bdec70f63f972f5cf8325dfc5307e3f28591f65fc9890bffd4c58f2939b16dffa2333d8c9724b4d1bfb03d76e6541a73b26bea30c034fd315dc374fed279a9833f4cd32f499910d3c096ff3abb619a1c17709fed71a142b6c7a585d47d9914a34dc3023cc2e554ce1cdb43cae11cd5f654db233da9a2f3ca9b4578b36963e737abf5daa2e7c5211899b637504108d98a9bc1567787a44a2e719979601787693ad2e5ae77a30b7fbbde6917be77f642093fab9b545d3a19cf7c31c8d75ed3bcefcc062b99d0ff24934bc43430c5ad980608ee838169710eede1675a27ab8cc19229621a18f3b3fdc07d313fd7fb89c1baf08798a62f98d447d2b910bb3a3158325db8f02b4cebc2a75d96bad08a8b4915d3c4f002d2507311c747f0a7d5825b2b6a9e1ae21cf676cf90f749d5e521a9e21cd8e548448ff0de3d020f30961a3874d07003069a3c813254e26c8dddedce4518620d1c3a68b8a1c99312676b8c23881e9052042b56e1a811028e5543fcdcef7118810744506dc9f4c9ccd050800c4157a6c4d9daa1c054f2a125632aed602ae229191377279069c1ed7f1c6488a46efff38e2c9b61b57e16d2593a14d37021e57edc9a3183f2cb40555e804315231542ef494cb2ad8793bb176dba69e0a6e684d39a70d184c6e2ac402f037151055011d094211e920133e72021ad2e1729b290022184316a91b22e39daf6830d3bc2c80269c104490b212db2e0a2c59016575e4a3dc0b81411c363624775c78e2a693b4aa5d2cb0b915076221a9221aa1283f3a13b2a4450d1a19244868d1123460c1932a814c183b90c44851583ed8eca16665a2e0351f94200464204c0cecccccc04200054544806a029811a2d61c6e584002f5014c076b70516346c036dd1058d09c7001acf016c734104ee874cf34277376b29a8f3531d85240b9e2840535a37b002c950cfa6c48a34802ca470114016526800b42964c1458e4b0c3fd8bc23601d907d262e00086132b230636831b4c96871253bf550825184cb0b1e6bf2d96262658ea8091cccd4982072e2f6130dd9125115171fb8162236928ee59260a3225c1b0b46a3b285174be50b2d9910230cc9cbb585125b2c61b485936b0b285eb6c0628b2e5e708163e28247e38208958b265c7919880b250ce00add107ad088eb38843835d0888439b7612aca1329432da1272d564789034639699db4d65cd885653556db46713482de23ab6d45db88eb1147ea21b568352d2e49bce5898b94db5f1a2abd70070363b93fc63d8923711fef711d47e23955a26029221a8a42d45ad24982549de4a779ba085769239d2aea9b12304d3f37e98f9fb0ba7e87513a8c72d6582bf4ae93d60bcbb0cc66da36da46dc88d4e2528aa512f42eb5b8945c341e2f31a617304a2719ada66f1743469421037acbe8bed87d32357d4d26ee4e3231628c18d03bc6a96e3e2e84444d830a00c8887182f1c21403f352726921cd2e54c0a628388a1682ebefcb3751dc08a34db31976553a25ec228a26808a886214405358f7b3d7a7ac2e034df99992e432d01424f78b536630c5c8ed1ca448a158aecb40537ef01a784d820592ee76c76285c59218a39457aca810a5b4562c88b0a002c3302ccba4a4a4dc0049c9b9ec289e571298850097df72a5788316f961447f66b3fba104f2b3c9eeed305b7796c665d46dad06868d0dbb644f3e605cf87ebf0f381c42e61e04559b08af113444d6cfcccc2f98c619722f4aa6ed32d0155b38d3f8c30801c74058dc608113b128e27a6455147e1370f37ef58a9c2b866ee3f86460d507a13e6b23a043062b743f1999fb55a02b56f7534091ac8673c418bd8b693a219da5320d7b4f6edf5cffb622c80a245c769413d1355e6bf4bcd6e8419c2c7e36e218bb47eeb183b542df899135af35c6910560a9c471304619993699608d7b1dbd869f8d4ea70acc970f84cd851fa37ff4e2855568873536770bd1a59cbf519a6594d26d085c16ca951d89686b71817265f7b99421a1dbef3b4b7e9c67c775a478911b2c454452b0140db54f935590eac72748d53d58fa48e3f40d96220e622842415146d595cfddee104619a584deb2dd218c51ca28e59c94d64a6bbd2e0ccb322ccbacd5b46dd3b66d34e23812a905c625a6647a79010306060ce80d4376df4c8b8b8b8479818181de30f4e99491f94997bd1839c28d9fb91bc22c4edb8dc538351e7eebf519bd5e762d17eb1a63a458cb18638c315e355647710e6943f42bfdc20eb21cd56f83e8c575463995cb1f895a3307eb825ca2bb96cb8237b81f9fe1bfba2e749debe17aa0115d685d568fa37c1ce52f392f443dd7dfd48522ce21ff003c2824aebf30e2fa102f82b843f450c272fd5f885eaabc14b90d087198a6bf3bb89a5dc6ca84b227192b8769fcb91e4ee5e336e012b7013947e7f18b1e0a832cb62e4c01f7633f48e0be8c8af9dc0de7a04317c2c95cff275939973574b91e82c84e728b88b681c7086dc0c538b5e88db624744b8283ddc6c341d8852c1bb124ba50e331efcf95ab8b03cf3a73cf2084598c31da4e4a296536e79c7366db0e873dc56e22cec55359ad224f519deef9e64a68dbe134ed334cf37c5c37cbfeaaf56d6e0ffbd7d7d8ac8799e63ad9d7fe74bdcdd53c1dacc7a3e5661e26c4a3e556cffbe4c38fd0f6e5844dc9a66453b229d9946c4a36259b924dc9a66453b229e9d6e073e4d132ada031dffd9209dbf87ed982dddd18f6447086cf1b47f9fc81517ecd14336ac23b33196433c2c5e71ad3c5e0646de78ddbf89f3f7c92e87a4c108c42f95b2026089ee14f328267f8fcd1fc91b6e3862240c03c10319fc9cfe6befccb734c77826f7a9b1960ba13f44e1580f998ff01f3310f3fc6e34109f47ec4bcc9e3e1c5c73c0fa6998ac16138a394034ebea438077479e6fe16296e3fa909ee4839241d7823e6dd3eb38d1818e536feb7f6e4aad47d3139d73f26087847de473282c473fdb52f63917a6274be14e0dc2092e852d9e219f49d09c7c04d2e7da77f7992c533e8c3502370f0e98c113e4ba2db40e0014e4cc9b3279470e8777cb904dbc098245b7c63f4fc92c537ac03b477a2fd2799b8fc1c0bde18799367f318ce607545945cd85bed33edebaa6ef5b6f7c156d6f10c5b7d4dab3fb1ad075b0fec67dd0699804e16f0412645523f83fdac57b6934d9026cf50377fb35cd1aee54e1e7823c3e119feb5723c1f631c75e17e93e7fa536f54c4b170aebf8b142e429c833ec7e2581c8b63712cceb15cd6f5e758dc13b721e436e273e9f22b4b06bbafcbfb87b7e7db0faecd656d47ec11bd52a96b4df4ba996646ed5481f9f27f4c09a58c4deb8b17170a75fd633ffea7349998065a6056cd99948d28f098c964324138e1438fe398c62f0dbbaed61c6a40b3c08fe931ec2cf1fda30e35fe7e5d9a3fac149b12da2b9994524a29a59492091329a59473ce39ddbd5110b8ed88cc422dc64d4a399a734e8e524a296968a8d5da8eb82e221711295b5a5a5abc381487e68c9e94b30552d59f6149b8c400bc21553cc3bf56a9e2a44ae81bfe5fbe1ffc4faa7c7cf4309e20b82fbbc96eb801a99f21fb4fca90aa3143f61fbdfc268839202ba284d6c7ba224a7210d2595af033647f7545523fc3f52cbbf8a3dedcdc60dc0cb313c2829b1f009025fb4ccefa0367c9928508fb4cda1e609fd108bd5952bac91742ad63455ac0cdc08c808f26e0e305f4773022914168d3ce104208dbebe65f13df79603fff04dfe64e4f07e9d560b706bb0d868c9d995f70e7e0f454e18931cab952c1ee56150cc3b2ac0a916625752121db8ca892537dac042db94351d0f845b71524ec5ea56836612b55ee17ad66e5c965e6ba4ac64396dc2b3ab79fb3dd2fbae46eba1274e50964f6b467ed8569bcd457925821ba20e018c84acbca14b7f4c239f8ca1497e165a02b55442ad976c4ca10569238804ddd159c2b45a4b4b617cc5c018ac7ed05335225a14821b99241f28964d5cc2313c7486ade482cd3c84cc922b73648f5e313a4ead159f2e3d3c3b3e3d3a323a594524a0919fb225ce7873f9ca30a8185cbef2dce419f3d4a1030094a5cfeee89444871f93110bbc9f59f2ba770fe4c9f3883a6ca513e7be49c43456e26d19432b1cca239147596fcf8f4f0ecf8f4509d68adb5d65a3b75965cfffa73f5f05c7f8ceef85cffacc7514e752815a25528116d5128540a1da24235e38a13638c6d336badb5b5935c7f8cc733987324eee838ca2bceb5a5b69d4d67c3d98c6c48b69c2dc534fead718c31c65857354a6d55566d52a154214779659d6bc9f5f7eb075e3c3b97cfd5a363d91972c48ca4ae229b5d4547aebf86e1f8968237d77f74618946ae3f9762522491a037a96e5711d3f86b35d8bd309694ebef430e3121ec49c4a2602d4739c6b23612e14dedc8c22ecb21d2a0eb5f52d5979fabe7fac3247154b6e4fac7fc38ca331ea6f12f653c377d73737373737373c343b2b0d3248be34ca6ff8c27e3c9783e548ddb375763b0db3c8aa9a8a8a86816b5273116c6c258180b63612c8cb54d5b54f453a42a5a15b18a848a56abd56ab5eaae5d2cec4601a376a8b4eed535316534020040d000a315000020140c090443b15012079222c90714000c75923e6e5a3694c843591003314831648c21c4004300060064664a9b14a903b092b1d9fd5a11771a38b686b0f5e834134dc0f9b68878a0f98bb441e058644985f24af318dff28af51d957e5e1dc45ff7ebfa69d193ff70c057be8653e551f3c5ceb2a3ca93a657e5f3fce3abd46a49f37e73c8d4ac268372443dc108e8836db83ca33c8b400b21783cd477ae077e4aa3a09501e46eee41194e67a383bdf2b0f384dbe0b3788de1b2c2d0b58732246544030b21b372b4699eb989c6f8b989ac45c53859f4944f6da1e67fd8341b4b063962500ad04789e7a4c1bd1280179a4efa049f4e35799662c0d2d698df610894d6cea500acd43272c7da752ef652f90306c9288f5e6ed402d27c47df830f51567a14fbf4f262a9581df6965fde82d6b6556abb9cf4338ec4da19007b41be4afa7f7bbc6891a0530e6eb4f9fb137ad5792e0a103e6ca5e21285c7613c543350389cf3b010123b349107ada58f4ec0834fb130c2e004f8630c02b314824018d822cd5564befebb1f9928231629939bfc50580492f97619d2231f7434f1e26650de1311e254848ba0dccdbc422f2fe69f23477ea839789a09681c805378286b6aab747fbbd2aea81f2b4a356bb25e7915e49fdbde58dc3504cf471d59a94607954c00071d213e46e8cb1e005d99b7629be55daa8416f4d40657e18ccc409ffd79ba0ffa9254810f36e4f3e70b5cb4441be63e1df9105d85712e1efe0f2a6087a39f7261b0c079b0fc2262a3e513882e6cb4532a179d2151e50a4c605b0103e76c3f5c3f9586335a9758ae1c46abe902a30f9f7fc8023d39c9edf80098511ddc918b7d1820791cda76f78e2e6eadc25852a384d218f357a05ce3c545a5d5363c4884ac79ade7659a77e1fba2e64da6ff509b5c4e41f29b838a248f8d8f3f29fd6bf104b278ebbd4cda6a495b5d2d2fb02fcb48c144726c8df381b2d78f6f3c7f1ddcf208872ab99fc643c5b76de5b8f119ffde6c15dde9812284f404fb807562b909547da2a14f63afb8acac00314a006ad45f51b31666e4bedb11e41701d4ac413bceed7cb2f8834ed801f05adee8aeb7fea880b8a327e719385778e3475337fb94f0476a5d1aa7acdb32ff507a21c2dcb59f293b029707d14a314887a5d907e71e7a4b1d559ce91e8a6f29e0f22814d7a0dd6dda3b6a803e22ff750a4b41515c5c834be080a28d8851e2bd8f8ac41008a8cc1c598a582d833bd05627180693670544f9d5fc0819a7fd18484a0888ace92c29965d5b80eaef8a2919273f1305a1df1d7c432d889f8dee0e2a284d30e8c7d8db5355fbda87a49b0aa47c0b2de761ad9260b192ca517ea0c5ce4b5349a1bf1213ea2d3e422884005271ce6b8c16ef5188e4e072fbf74af465657312c4c11ee88a18da5c77eca9e48cc5ee6dcbcf70e2ee982818119b7ab7cd2c3cfba8eb9caeb70a37b59eb18f12fae6b4cb30d555cf77267904104c754bf9e0c9feeec604a68af97be164e3ac239931a60ac6ebed9900d1f2e724aa62ea7a11c1c8662e73289ad0a08031d5bfe6cae04d2ee9245a0aea7e6dc1d4dcfd6e76f817a18a91a64adce09a2d5264bcca315f75e8d2e6e36c3dff85b7356111cb7966321373f587235f589bf733ed63605579d477d5a7ed63ae56f37cffef5b0c4ccf6a94af21235d4d4a6c1582a29b7b64353745d49aa964982e831a4e4295d83b52f10767d73ac398530fa84828134f5f88e677e31d06e4746935d04ff4434b81dac789287ad0aa74511d7cb848bd4d3252a7be90fbe04cfc3cb8a4734f1069d4ad527504dc03862e7721e04f631c309f9dc9ffe693271de31e261d48a1fffeb55652c1fbbfe0d6d018aeb890076e3fddf58038d8032caa74506fdf6df1261352642634401633ba51631c42f4490882a18cee90e7568c949e4b69db8c11ca17fb3d1d8d1234bb5487fe8fd10c12c851510916a061b2ab1d83d1849309bc21ab03add91d41af2e9409cfe52f801342cbad36e480bdb3f5376b52b302117fcca77acf0a70f1c35186bb4e71e518b90907442b877abb9aa4ec014e8e402112115424e1d8d6fa18394942ea8a8895a8ab192e6cf42e676595fee125959410013932cad58c8579a31b819c7566ebc6f2b0b5108a06bd0c2b844aa9559b8916625d67f16dd45b8f95295c6b39e35b5ccb16600ff37142037a1d410b91a1373d9bd3b1ef1d19168a68aef800c4db9087db5e29428bcf5196a63d1e629b43303878679b4539d9e625ac6eda4bcc64dbbe8bb75c979d7d5d1355e0584ed959c0b77b1db851e1c9b78e6126be00a2754cac930072dcd3e93321eafab4a81d3db24ddfb782a7da92d528542f0c6489544013fd42a18f48c0e53b5de050ea2f71e5a447abd6acef35ecb27002a1d5c1fee64751e380bbfd5147083c62c8ca37c79ea92a4c3cdd44ed2babfb27a1451ed1944a2b726e70a545e2f64db9cb5b910a2a795205622bc2a7a57e804c81867a210da3b41b44ba28ce6a61b10b761da4a15364fd491daf0a51fc2737b9a4dc61741a6699ad4eb210345f9def679b9a265965467edec00aa1f88abcc5bb010befff2fa7edb74b4e21b6e070362e8660b003c0da24f8b38aa0e188d7aa94ccab8138b3d18cecb8b434eecade854a993c200fe2dc8498d0a01272e50d22684ac96c6804a3d360eb99926ba8b84e6004f7c5b80253f208b8efec434e27e0ceb28ec2ac177adf180e97f012617b3b4a3ea761fdb20f2b46533862a6f81c523e6fcb67974778e9ce3575e6cfb6f799434d5f43b4366972bf7168eb5fe3e7f7189d5a19fd09e845a5ef18d0071e5c9e6a701ad6a903ad81c971c14bbbdd4ecf865e39be4cd977cfd3b2e7a34d182faf8fa3e3eea9a27cfc465a379e8d48a5e803498a07de3d29c72fe4a1b1e33e70d1cd8578a5fed9bd9dd0abe82bce9b3acdd2a62eec59538759d2d4d1de4cfd578d9b69c4bb1fe79204f1777203f60668f9531c45e0ff6bfd4e7a78d7d50be333e0802dbc6e3190d022749a302e6ad29e05f602f2774f8724914c27071ae18022b911c56e983816f678987031eac6c8ca88d3573b205b2ca8dcf070b970fe2b86270cae91ab87f76aae67b6d3814eec95cb7fa555239c5279c61478724ce42a22b539df96afa4ff386ddbb661a472f85a87a391b45062f91d17ac291c0b796de0a14bef33cba38b8bed3ac4415948ee65e6aee949071951d2d9e533e9ab93cf2aa2e8059475809b42370f1e1c89a34719e7d8fa7bd6eba915a9c2e4489ab2d1a7f34321c8174674e1439ffd3a5899eaa82357f3a0034785040b1fe6285010e67605187173db5670c2de1cad9959c0508836c1f414f85b3f7360c8182c5f32b51c1d3f8eb3a76dd301014341a6ec768a8266d700c0106342edcfdc6df43449daab9c8e4c1428ba776e0a6a0e45d8ab2ce147bc0bb39dcab4e52da072e14364fea893743e828d311155cba5004dff13d4e5b3ad3d68232eb47b93f4549e3527d9cc0ba76c2da3e11bff3f646d7e98ff06d0f885ad9833745fe45165c0fb0c09c12172a4a532cf054a2405d4fce8c411823a51c0130f771d5ee28e0e5f2fb36c976541719019cdf1d85d1bee02648ca39daf918a685be79ea2bee01867c7c5da73ecba8ca3107850ddc693e15b10c9656d1ccfec345d371c66362ed70908aa1fcac7f9d838e5ef50720ecf9f28a55fe3e895bbbc2351291a20cc546b5c40119c464fe11c3761e0404aebd5785d614b8a5ba1f6d2dc8d189d4a7b0a54dee8b73268a40ed82ab0f6bc36a6ad85bfe2e8c1934325b50b2e00709a576a1c6d1f3d14a2db6a98acc621417fb2023c332f7966238900256df1d2590e33bb47fdbbbc786fc0d1887a9d87b14639ba7794aaa42b802a09d6600ab0f8f6eeb97521b7b9ec0dd5a09c5c781da34f18fb3eb3ce8373fe7476f385e5c8db826795c145399ab09829a7d6f1329144140d043340b73faee85c52b082d688a565160b4d0635be7132b0579a8bf0dbc6ccae47062da5ef41b6ca5ac68da6b32f775a71ba755be89d5e0ff95e1b5779b9cc8d581366692c70c0e32dfa3f0e29be68f6d0b6f9d37a375a7a8881d29c36f67f74190d20d38230f413e2011cefa68e91249c2b08181c0407d91e35ba909632ed23e3a1758bfeb6ecf690f0280ec99da1cdeefc58966bc8033fd74dc456483eebc3965d0da285c003f7c284d6b6a0055ae79a04a0d662ede1097b3a2e75fb1d59b0449bbb9e294d77601ea71982c97e2e0d793e52abbf2e27a7ca43f7a8125071dfd5b559d4a3d2c12cd1851fe5b642d5456ac38ae618a3b9e81d3607e8067a0733a1ef9e37e841893f39922195746b98bd40f3b33bef4bba90477a75e4792d3a4aedc6757ecab6029af36200636655d52e1d1300ccb500fd5d906189c94a76fe670ad6d895284b3691f5dd9b89cd66fee3653b5c1e4288715b5fdd4f8f5f0314036616dfdef38191e6d99193c7be7b657aa43fffbaa75358393c6d7cc471f06e3cf328e3f45a6e5d72af4d521f24bb8d56684e97b15e43839918d15fe96dad39c62976783e213fe9bbddf3295d886a745e07ac61d0790243ee36eecbb001e6c9f849b248afa5c90f1c7b1c8704d87a6749bb0b489861d6e298ebdc05f1ef206e173486c91eb22f50367c4e73c2ebcfd33dab65d39a190da46af904f2e31da85800678cdff3b154262c892013fd7fd0c20a5266df384d09b5e759b243340cd3736c70770cac0a5de6b3a967137cbde11ca979b68c75221388a0ba44c724b59bc86e34eefe85a5bf23bb862065db2e8946c8811a414f0e62d094d7386fabafea02245302770d85b9cf2b6af00adcf398c17b288639dba5b7bb2caf0d6e884e5aff842d92c02cd2fb8899ce68a147de28587370a39f51e10f6f012609e56f6c40b914f67b8dc08bcf295378291c9ab28c3e1547fe2d7ced6122965bfeac19f7677dbed02c1e0acd610a028e0cb19eb0d6b654ca52da2470b917a1cbaff3c49496be8ce22ebf3ec41e2edb9516e7af000675f371bf58567451d2c464707fd857f94f693122b87f1c2b2e66bf10c0364710c148fa836b02ea160dfd18c345973868afcc178b94b4ab6f18ba4e35f8b27ebd2155fc9c3b2fc80b46765009076f40359cdd094ad05a8463f6de9a4fdaecb301d9e40d8d7e9bac4422607b3b5b18663de8ae2da450cf08c0b66154b3875f8198ba078c0fb635bb60c14e202912f17be41eeb129d7de748ef76a680b398e24569d139bc9efe3d9c75e5c90b4a089f6dbc63687d476a0841ba736e44f5c131bbb704be5383e4bfcaca2ef1c65e3ad0a238834c8022d88606b99f2002f762f43f136b48dfc27d43c066f0d6f5ab73d6c6f13c776777905c96ca947d52f7569f28a0f39126e11a882cabc2dce0c2c3832dbece97249c24bc3c22f45ba34e295fc4265dec9364ed07756fb9e2918b5871f32c1dd773cb6c810538818421e267b7c4af4f0183b1f5195da4622ab2d5272a65c1a111140b0dd996e34293ffa259346a57c901604c5a136a36fda56292dbe1f39a03c8bb4d0add55f094cb83e075494cc43e2a548c34ef94c3dc25ac5bc5fe1090348c0352e9fdee3b4285b4e02eaa78715a848420768bde746fec22d540ff0d464b059b8f625a1401a2bb49011ff001c84abd9f812e3d4dd5fad76c9e56608396d0775970a1e115d2b5925655c4751e662847e8bb4612e1e504f1281cb7c7cdfb5023305218bb04ea36d8a789fde8b68e5974878201c21b4165790aedb2d3bc802245de229d94897ef8e4373c6094ad4f171dee517d6c4e4e91dd3f5d16c0ea8014f3fbe5168cfc013c49aa5f9a93f13a6595497fb7aa14901240a3a054a600a8e9405dddc019029fc748d935871452746be5002c0b4532d7b6ee254fef4f56725589fb0eedb7e710fb710415b2bd63419e7a47a42208300120c3ed32dfd25d18e3de87b55d825e0705782b5001ebb054deb938841a029c5f1880109c505ac15756e2be77f748e4025c93070f318bd5b1541997b448050499d9befdd5444aa0da937a1d5fdbd98196f911e27a75a4a09eec911f8f7fb2606ea234e46dc94f26b4f77dff34ddd193c72d55c7a48fd030cd85e4632224a318eff2c2b8eddf6a62f14516fbc53adada70d7a501769eb4d32c87f1d8f2cdc1131d1c6699621477a7a5c28a9c15988ebf532388cabab1a6b8403161104a0fdd790c5d6dc817f2f27a9705d2aa6fc57754d7edfb31986619e8214bbdac279aa5914240453917b7289ee175bcbefeaa5eca40f1fa50a00c590ef907eb01d8eccbbae53637bbf099625ca3ffdc7f6c21ab1a0f9dbba1e56878f92276d1159231122434754dda8459cb496b7a27ac159fa2e1e6692045f2a6169467b4c6c414b6207218892fc344617201f08bf0d5fdbba7003de7891bceb0e13f51eff0c33fa7fa48a0db259ed5cc693589f5aae2d165ad4ae5b9f1575ed65295bcde5f7809f186a46a286b123dbca5beaec485982ba91d8858ecf17c3002a9a748f210f6aa8f0ef72a0d69f4e7e24605c321109a178e0a8045d729f660d0497d2df369796c549ed40be7ac18614659151a2541441b829a88fa8f7256a0f796751225516a394a09800540e5b35d97f811ef139353bf8c6dc2142aa82a43e02de74ba17ccdc5a18136ed632cac4af45cc17c5efef27be1cbef252fbf1776b5417198688eb6b353e3153165d6045ea84b70ae918240f01ff80f4eb6f1dcccce5c4fb4ffbc957d951da9f42fa004a6f989b00a6dc97915d7fd9cc7d9ad489d0f226f2f6c5018f916330c736672bb0257879be30d309b925169f62409cc733d33e424b45747163f8356ae4aa3893e2aae482a72fe2ef1f58c0c84b9c9204cec7538765f108dda79ae6adaacd8c338e7360a9f927f8fa2945566c34717b3412e1d840fc9ffdb6cd914cea6177c69a00633cbb7f7ddd055ac6f6fdc77edf0989ebeb4673917b33b7163cf86e3042d7437463e562f890275d5712a8ebafdcea1fd7baa5972122d676980a44fc4a0534c1f1b20ba99918e259294b0d7b18d3460595960b2e23f3ece61cf1f7b7587cc201e2a7072551ff8a78f3a783aef8464c6818a3acec0903aa7af6daa8c347e2f8267279b8b2134c21dbd87eada313a3070853a20868593c0851d0df244d852016669c1e256f969faa6cb904345160e8612e582dce56445218019b97a6f47f1386c7f9eff72f9bf47985d110c6e29b1fa7b0738383f8687a3054fef46cc532904f0e73ca578af51272f94e73d52bcc6c84300c42a53e69a3716f05c07654946a9308391cbe07457e56e21c71bdb15134622c9304944a5c42a01a344516796b919f6344b568fe0091e77c10b896d2074487e1e0512427bc330938ac2a7c4fc290059d953115a1a0331a17dd802de590ed6ccab55101ad47a6426a528e9f0ccac1bd79fa97009d2a91f7d33db16dfc25b78399448b8f9c74a496589ac4a11c4afe31ee91a047c41d856e0c2b5dbecb0d282739c403c3b26c9932a614818d8460d30ef20091b30397ebd59df3da5ae46d1ef6023570bcde4faf038b9dced1150fdf91f1cdb3a4ea38d854f1ee6a2533e8d59741c5d6440b58c1019ff292cb4398c5230923da33ae595671d23f53e2116c8513ed83a9660274308167e546ba95c4d584758674911a928c77e5345b3b0b0a1ea7cab28c8a740df908da7f35a2f05486a0238097fdadaf1c0db2aa450b9d2550968a4f17294d3c5420f1a2b7fe6a8c2b02c2481678b943874a440ab48aa9d525258b4495d5b25a52d4914ca892c0eac57410d2c222df8e421c79e38d0845c44e0de30c8a5a3d021f147f96b1b840ec98f4755ce4a50c047952341061d814fc8ff0b653982972cb4b61361829a2a4d1c4a03567831242ed4150d8d6b077c9e45f029e10a987625b566d8ac4ad4da835f5e0faf62a3be16c094691059ac7054560f606cc69aa2d4030efa317adb9d890e3e058e1347238fc9ad5d8d218963be2f9b743d6c5595aa1402b27ba9f0a756609720ceedb307709fad1ff75915aab8daaabbd6ad13ebaafbb51d5af3d61d535e718e97d6dba4f23da855b1540452b6724ba8607f99d7d65827de99f9d2004b959674592834a33ba319bd5febded813367b452df59214e1002aedc10cfd826284d4cfe487918c62bb3c7b0243df6a5cc3c938fe2c507c588b6158d85171bbfac6661a6441026c4975a0ccc5110f6a41a4c5d1803fa6684b1f7967270315c6b364242b982e6c8c777a157fecc941ae7b06d167988c2d261aa7b1be016951526ee75d3e98161fa8fa707891c8d642a4ce60b08f2111ed296d3948c36555b4511f4930124519a686076d3edfbd1ef32f0e7d2acb07e1b056266c69676d39604afacd03841bacb5d2dcba3016ebff227d2ba132ae212b51db6011e4d1d805f6964f86f7b102e55c66975e97f2b510bb3ed49efbafc6ab2de100cbdd0eac8bf03cf4d53e3c38510f9e12225e0b0c4dfec0c5e8297a869ea3a7e9dfaf5351dbc7866ae35aec60dbce1d36aae7081852b816ec6e30e9565d425f67b479dd6b84f74b78357ecd7885d5870c8ff9fdd2ec857f835b4e880eddfc89ebf220a55c4a401683c2ca89020a53e617aa4ca752e028e87ccb552c33a2eec2e053d3e7ca181204fbf761d3539e356e55f1a11b6e8d7d15f43f0eaf81028d0e81641f70624aae4791f892713d34045599fd8df4fefca7eaa2b908a9cdc17a657bfda2fe428a18e94df496dea497e94dfe9fde44d46df564ba1b25dd58fc2c1280b170a9197a1681aebfe3afbfb8d19a6536081641f3c3fb9809f8f483fd03c59a19189149a6907e4ace85aac47f868300141e3b45741a5090a695c6e60979049e8406a4752517217b859177c9493f02975bf3f422fcfef66d1308921a11dc1fbc08c6042316c5c04c8efdebea39c22cd8a01f326cbbd8403f224474ab9e787b4f29e19280374ae055a062a532318714a5c41d1021b24481197e81071b910858114a4aae4fa4e5350cae4cb35b92be83bfd8789ec635761c020b0d82b81c146f35304da92f041d97c6896873ac60bd3aacdcd4119f1e60793da7f6d58df01869b94c578de763d04bf42ae0b511ffedf5ca6bdaa699de84180d3a93e6ca172ed67d725c2868ec7802db018d79808615d8684dbda7d7215332659a50c50e02fd8ec51cc0ecf2111bca22037f246005d575ccd91965ead99c87f356f388de36e3377c9035441acb18de06fad520a13d4876188fa204204dc40d76a473d0c12b5eae81e920fd8cdc8f64e03f81bf32d9dcff1ca92046d31aeaaf2964a3e02d7eb1114435afe5d68ef73e888a639241d08c031a2b89862307013971a4a7b0f77f519953855403faf2bf4124c7ca481dc21e54065d6d2689cf4152d4123f383d49a5877144f2feb72bdac651ec5b1f7e849d7cf70c1e94456bc3428c5079156ae82f8741d4d401914908111acb360d62c040666258c64de65e357af60476dc004fada46872b39c5a8a120c767c4abdd1cdf0014f9dd2c6bbfebdbe5d99b1b99473a76fc783ed75f0012f76764465aff676464e49d6bc74cc5117d6ddfc0cf46d940ee77d78bee1afa8b6c3a38c5dda8209d6cfd0094bd32dbd3b6b4019687a0c470bb37683dfc874618f5b62550e369c58a5861e1a3ee3c48f84e3d90499e8fcefe7252fea055774256326fb96cdcfe5a09564256bac0b565e94bcf9757d5f5a00553a5e526591dc83a3b1b18fd8a51f92f1b4a4c11f4f2d2f95ace0e222b34cdebf1b661510216a951f58af7968463d61aeacf9c9178c7bf3499e52a989009dc40bc5ef5e381095dd9df7220fc48e0117bd130c6e2ad8ce160656f57164c0192e67d216faad92d54bb9806245d4384cecfa879c8874d7a2114c03f5400603c7ddb5913b75f90067df884e75d1402a4e383f0c0d949a1e9e8b95414225a1dd8bbee9b1a753792309aaacbc64ab0f11e994f620aedaf6e7dd59adc8bddde025758178a856968b941e7efbc9dabca1b8697d73dbc24fa76658bb4d879a75917e35653848f2fdf0921a7e0d6b23e5e58e43ea0893ae69d39b2c2010d0ca18c323f8d42e81df0a9073b98ab6edfff41ac1004b5facf63def9be00d02bd833b5a909ea33a19756c4aeeb223cc5aacf9599c3b9fa71811fdae11c7476343c039e97030a8bda3327afcaddba37cdf7391a0f523a550753b2892863cc9bc64df0735b6e0b810ff5668a3e866827256688b299c6b403741c6c698f7b23296ff4bb78bb74bf1306c219a0f1d94e06053fd2a38b995fd89c1227dcc8f8f6197024ed59bc6d94ac0bf2c2bda06b7559e2de8deaabe39c80cb6cfb62d59686854ee6c01ba8c085483b3a424c5befa086c14fcbf105dbf5220ad211e9c9cf7a3ee0809bb84629b2ca7c21fad687bc6d8bd5666fe7a6f2a78a70b5e7f7ca6f40102a3923bc88ae1301d83287eb4f9aa5f707e238aec0e1f65fad97d7d935b3572808da4f9279ae88ecd6f9f5525ff22396b87baaa0670b592e038a857daa66a9e018d121ddd6730753b5e981219e892d18192b09f7f3f008d1d9290298713797227706631d29a0053748c1812a654bb406d3c56e7528a8d0bbb033de2d690a74637bbe6923e6fe88bdaa5c0680104b342aa97c1ec4e0ca62cb2054d8083d6fdd6c32de961e33ab4846bdbac4f25edc11d73111595d5eb248a38a5857576479599bc4df8cc4a8de05a797dcc7fdb10bd663243c247d1ad13a51980ba9da5fe49ae873b680674dd8e0841d20c20aa0760c4a93e183a7827829621c22bd2bd1c5bf25a6c62f50b338b0e5f786e97e7d2702acf441c31c114fa2fcb994967e8979a8d4e9aa3a3cee1b0fb5448e6048270a964c3b303fc7dddc99a0b6e1c0922de452329e2a270589153d51f06f870fe0b3e95b076349838e93b9bc1c06480c61b90364cef633736638b7cebc9a71bf8f073058d103fa9a08797e6d7d0b4c45b7647509a5580815e288051ecc320831a6184ab2b2c7420ef31b91083064cf807afa870ad627078a84b3f4da7dcbc583bd93f881cfbe1826c3e452a5806fa6fa2b3ddb509d53c88b65c30adf972909d61ce32d1ea58fdcb8c2b16283062e6052489c9095ace19af7eb540a8e207d7f24e6a524b234f90548482831048f577a26055f7e282a6ab7bbbc49938c9d4433df79ed56552cedad36956b275e90f2b13d58dba9531ac1be94743f45c541ac361ded9d71a54ed0c3ec72e0c234bbadf40b98bdef3f0d70ce1b92b70a6d99ab61f93a2f1801e36ed85d734482f0b39beda075273187d2dd206591ed1dae1e6bb213ea06b00efc56d9489a248afaf3c32a078bf5d126e4a280f4b1f41ab47ae6c3af016710e5ea139d160b313ffacd21f4c639c224459b570ad063bcf01f16412d6a48dbc429a2c149b5254b790271bca2629d659c8c985b6798a751532908766f328a25348938566738aea2c44a53821a2122c0312747ce50ac936b33414d8d54cfde3663d22cdb5d7479e7a93b4771c95b5b1d3b6762c3ceeaa776c48c1e4bcc7729b8906ab23249c436d9341ea080967a1dbcce03a84cc39a836b7e03a85cc66a0b5d92075848c73e86d9c95d73fef0379e0f2916dcc6d6bd6b2318da9a9168ddd56f60ea82794b79209b071ddac275ee6bc22d433c081e53f598cb7b196ad9940a16ec18edc91a34516fc19f7d55494a972cd9acf38f0abfe79f92a64d381f5e965201a19bd7b72a121107535a11e8492d37697e51bb0b7556541c3f13ca76f86782d783d92f291bb5553e70ae525388bafbb566bbe99c30301292e63a768de2c9e9160455a22a18da8ae1a0df408852e41ecc14d95fc68bc62b90225bd1cb04ac3fc3ee319a4cf90e952e9ccd6fbdd5d2ba7129271f39fdb5097feeca61f9ca635c970633bdfea9ac9e47d6d57b1ef71a64bb38119dc669cbb4f687fb39d1562b3541732df86f46ce3642348df6574dbde1acd16116472f332cd7e26446f3a4cc0efa479b9274b086a964d2b7cd6887eac45086ae82358ec15d57660d8bd23c52086397bcbfcd936d95b06f32974e64a377469f0b0512380654a703545c7fcb5662e9f0e2e7da14244365040db0fad80fd78ac6feab2a569bb912da1f7d5bbae63722e6397d61924f4b7e4e75041a5386cffa94efbf2898d755b531c558f1d18e52c11735f3a82ceaad0419136976a3e1d8f4a1195f96e02b9df743289724286d2aec6e91e30ac6b194e587721f7d7840cb1e6d359df2ea44604e8e06f4e2d2dbd3956b0b442d52ba61efb7f1787ea941388f107e7b47fb836d4cc88a0326e6eebcc63b7a7310119ea71c196d57d8aad3b7fb09fc007b85746f34a48dfbda0579f815e7afe25ee1281267e793faa0915183d1c8feadc3e75eb98bc5336b62f97136bc4c1210ab49e7a0c7bf2f5f82cb774e15c65a53dfe39748fa5f374dda269d03b789eed17e0e2e79be30158f08f659a5627cd3922d34bf3ccafb07ac53cb6182e30abfa71fcfbed68f5fb27a1d6beb6b256174c767def522450175040223d8f0e60ef5b7eb15be68a6bf8dd232755768da5b976d71aec56235d6b48578d5057f1905f83a2263a4a4dbdfcf15b6ee61f5c56abfede41f7452e0663a2f0e5e488faa57ce635bff0f5138e9bbdb66571fa7cff15a76f4d656bac00d7d7cfe857dd6b3bd9e58765494f8a67abffc14df16b59ead77651e3ae6adc4d8dbb3b9e94ad8ff38ae2f76fdeb5a430b8de2ef6c778d9145f2f5066c6ebd5daeb0312d09912f43d69fb53be1d74ac7b0e4e113f32dd79520bbbaee657f7ed3d2010119d9a8c8ccfd4c58e4c575eeac2aeeb30d7731f1f9fef8ebf3674e0e6349a5a3d4eb7750383d46c45fe823400c239157529305b98183d04663613531a3d87e9407f9c180261ba358490e3caa76f85c998fbe5388268e1da9a8357a4a46fc72235bf8d71ceff6a47cf1b31711919e16fcccb2fe4f5bcc120944c41582f30a8c733345abc481c54041de03037df16ee6280077ee3c67cfd5b05f6ee2cc1179551e029a3a3726c117ed47c873b1372ccdd01fd1bd73717e6ebdf28307fe453eb7960f4d532f49e110ac6d9e696b32a1f1aefd418144439de97160134ee37b4b297aa9dbdb6e3aff70861568685fc1354f59e32ee0d781ed308eeaede89041063ba1a5404e549b615ae5ce6dc271b3796ab05ff517e3f4628ccaa70e92b2f007b9774a1543e534d1f94d97b546a61ff7d5645c8c99eb5a1c3b3cde432cdfaea9469f7cf5931a7c7e17ac6cf948345819de6cdad4fa16a2562a19d34b8e32250edc597edd9366b777a808f9671724d9f68f0b6deb62bdd0f64930a8b4963c1706e2afb001be4642d65d0bf526bb7d24bce268ff9a2eb5846373bed15e6091320360621dfa37770bb12c0fff2957bb60421d0db571cd12bd8e5d2db2882c1f7a4f5b5104080a7a5f5e9722d9df71208a5234bc142c2d76e03a2fafc5f1bbd3ecee7669ff4be1c3f1e727b7d0e01cdb07c0f5d367829d7f25683508c204d47bb20cc0e9bcba4bc9b8afd0e3904c4a73d7fb80fb5728a346d055e61ad349e0c53ffe2a92262d1889381d2adc5801e3865159522ebd07f0e1da1ce1fed3f52267bae419ab8c8406bcd380622d955b9800f22e67c2f407407205a518be00af79dfe9b0bdc5b262c139c59851deb60432a8d1b246ed0253a9bb00a9a34c94aced0da000d8bb1aa9c65cdad00a99c8f53e46ca339a15afc6940fdeec5c456ed0d712503ec0cecea5f6e9233ceee207ce109a57741bde835557c3bb0f01fd9ca06fd17ebc61bcf27aa412f9472b8278de1cf3902c707276d8fc912cc5c02bf0b0cc98a0d5a388a274f86815654abe7ee2984ccd635da175d156d707491458c7475b94c726dad79f06f0072852cdd25ab085d953975e58f20f157d99814cd5632472c5dbe5cb7c1b37436b794bad107e587829caa6fc8a70e2980b7b09a35123c18d65a760cf7cf70356ad19b030ccfdd849db0ca89a2841224a822df40f7a00c5c63fb80d396d1e50b0e83872003fa56483bcff20bf62290163e520012857bc6a0324c86895d4e2d8e788d3de545b0ef40eddfcf8c4a84805bbb58873e1030ea8e9921515c65e7615ed01402daec07a544c5d53d023a8d90254bbd1c9fced322009c5a15a472a6b9dd2aacc13d6700db2a1476b94c3964d562a87cc5f1f10e6412e45a0fcb1d35ee655d131276ae7146082ba1c229e72d6c7da16fd623ba5166822400015db822d6899d4e41c8b57a60c015fa839f51465a7fd36041dd1ff5148689b55332334a36b1aaeeb840a3fb00524df8f50d0b7f2982c64a4213722ad29114639633214e81f7af7ea388432a205e1a32f173b32539457bc2a79617137355c0591428382445978fcc1bd17e9a754fbdadd4dcb0b20acb3e5b8d297b2e0b3c5d16c203b56a780ca1c04242e57396585004f7f7722388f5b1d95f170d5e5d8bbfb02a7a8c9914beede030a8544d5137b49025e3f8e18af6d4a8089a0a6646778a49b46691c27816a36a46957d06f40e84be59874fb1695054ddd4472a6106401cc31ffafb427d7e78650c8871cc8a321842c94f407ed2f8cfe1e72343c57a41b12af9ae6d40c704d873393235f567c3a33dfb6b21d5133312845f9d7fa0eef76cfee4286fefa9db9bd7774385d43bb620fa4a55e2e0cfa68a3ffbd3e8b3439883501a0214e1236ce3d35099eb830308491e959c1cadd97cb67a2f0c95858a293941656316a216afe834f819e2fd81cc915e4759507a26ef14faab4a0c79905c97ff195b4ed410e4e04522e0368ea835c2e31127970e760a0dc6125c560d63d59e7e5809f447060326619d9a4d9571260aad4384629a9e5ed80e44c88375ccb03aad83b0ea228f80097c0a59b1c93a625467ea54e766b91293529e711e700a0f29e26c174e4f727cc70c2900473fcbdd0a7442afa937877bb0d6c85c187784ceac3a26e11cfc9d9e09aa4a9ad6ffbe9178725a66e8d484697704ff4131d2cd4ce4467de6581690500497228bb9f53509c2047e82376d3efd130b40f4e8ee348a5b733354d9b4f342855678d0a90757c91abb4a9d76abdc87de451898deba9bc87537160f915d7747caf804f2dd303dda5b8fb154aa9c24ee22ef0604cfad1c95ca38655e3bfb43474d3eb9da315ad51361fe4f36030de724383577efd3f84fb3615408e59c4554d936bcc9fd637ba00687a30c36769b91f659e4de004b55b302316d511b5f3d02ea416eba6a71c6d3f9e0cd104301f8d484afb16981a277727ea01e60edf2bc4ae342dee4737f32a878631849dd5c075e6076d3a8cabb411bbb693d4b6ffa8a88320b39c87b52d4b903d2cd608a2ce608e6e92827bb296419e532286152028306543785f0b291b6b5cb506223246a4441596c1ee57319aaec6941007b762f186346bf782959395f912be181ebc047d72365c6cbbe8040c3ca702e1b5100ec0eba194182e180522e2ae4d7f5d5ad0cc39c28187338daf94c5c8cdcbaf8048a2e27dea95331cf5d67bfd6492f40e6ce3b9095049f4930871c1f22e278548ebc7d042a2f5ecb00dd651a72b01c0fbaaaeaf373aedbb446c0913ccae0c5ee8ba242eef68d97e60d539dece0365fcc803b9b6571f02f1a362d8840fe7c421d05d3034d83b8c8b65b624f59720c670e10aad4857b146ea21731afc50390ca3b398942e1d9d42dcabdb43ce5298d50d861f44f01756c5fff620f0643ae910429c54ea3a4ec6c50ab5c5634646100ab72bb8a57912b5a3cb3b72e6d0a534840e4f53c664561a1794e95d91bc5525e3561abdae0ecf77dc3960c811dfa14a2372cbe57a7a7facccc663edd723f00494c1a5f22a04f29905cc8e6ba49042379e264c06819ce575f8e0aa1c2e8ee974156964e286b3c2b96018d4b8c66ae22ef7bbcb812e0cea6e3388a819c895090d0685fca641defc44f8e3dc9ec2525c6031ca9fd6aec53d0ed2ac4cab14ec66438ce67e7163d496c26492b21210a1b742b7339c8b8788afcc863cd65ee460a21f44d8aa84b8905214738914f12821c120579d9fd197dd1409b716deb3ea41b489e0d0c307b36d4de879a7ec589fbaf2964298250b845441fdb34d4f13ce8918b6877e9083345d7e85038d68321ad3b540f1e125f7c3c343e4430c8423abcc854210d5a5d18ab174effa7d1e2ad78ef011b6d4fae75b30be055fc7dd7ee9405313cd9cd86be39653c6083b6281a27a9bf4e9d3a6cf24e236f654a9b1b61e8fde7e8f5f1a83254babd67fa21f8e7aaa743c41aed60e1d907611682a8f7381ee3082d03378642bb498b55687ea7c2c0d7ac2a8b62c438bb93862cf8a7fe8f365ae7f7fcfcd6435ebf1636a611a5a094b697ba1c24e8afeb20d0f6f1cfd8c908933cade90bdd9035822233b448d0dda1a5bbd5a9c66a669f0cc6eb51fec1de0cb5d354022d5a562a43efaf8caaf0d01a65135c19c055230d14cbca9338a77a2f935ea3baac19e62c040f8a451c50e70848feb73cc1e8d38115bc0262adc375d951cb2d6621d03c1559bb7e922795d192f189984506319fd1b6821b34ad7a9af229e63bbdd0cba8ee7ed0a0c4effdef4630d53125ce622f926eb98e235ee258590baa08f64797dcc0db717117c60fa55da7e3f701554c8ecb14a4f9077f78cc84987edac78088193992080026d6b60664cd866f2e5c4a40296662a02571d2b0c30f06f90f612c4d2e1983092851d251ddd1477a412ce953843fdaadf8baf01d7a6c090a9f78c2e0771adb995a98367879f6142a23d67f6c4b5743097a754a8accf2fcda6df4a444eec7b80ed1e4648617acaf8f72d02d6a64e080cbb8f454242cbc887ed149c204c2c69d15f80c6294011e1144583409353af172f8103738f0fa3e53c16cabe0d2fd5a60dafd38de64ab0050e1b342ef3434ba6e1ccb93fe126ca12e6f9c8298f24c60a8344de5652d4630792eba9281bd4056d22ec2aec8682d7ac7c970277e202231721aa3acbec4fa673e028a7305ea5a5ebbb91fb87eeb978e4f8d90b1fc36f9ad32ea93e8b25d1fed5997686103e5cad44cbb16e2fc47c00c0c003ab31d4e1b532af15ce281c9cbfdb85dbfc37deb0b8d548b3106b34060a97f0769d93a047503a626e2a0a4ee81821847814debdc9d6205f363cf0f2d1af636caa5862691bc5c0ce3eacf9a6fe4855b2bba9619775921e353626ec16f5684a702fcd40833a227e4f49e85409fe7b996c657eef737c1739db7d28bba0a2b81a7cece8a4813f746249722759bca016373eaeb57554e9b8ccd037d5543fa9fbb975a32d74e0e9600374860e41d13f532907e801f9cc14907548afb3004192cc0572059ea448048f13c1e2851799b74ffb539aadbdb44fdbe18a467dc58eb19b80339252b0b89db2d52f84dba43e14c072fba3c04f7844117a3f957fca7c3751633ad49edb28fe7de1f92c9a2e8c243ab024f51119354edfd0cff2118259d4560f87b96748b0bf8f8a08937ce98ec5b74404d9c80da3249f9786cf93f96e9cb0aa6d8d20a4155f2b6f2285313f4885ba6a9917905b4e7f26b5342d719c4761da08e17fe2ba760cc8230a077385d3f60553bfc5817ac19290cf8f854ec222ee9998f8c071c7ac84935c0206f5224bcd4d95ebfea4351114d65fae7b770db26003fe08698f6002de53ca5bf6d47c4a50390c0faf887270bbac01cf68ff0c0c4bc9609dba9ade96d0acd23772984089ef0d996f4db7c94fbc1d00d7593a777104480464b41e0b3dcf429a138a153466ca111ea379fe52cdf9703cc71425c3a46178f463697befa276c4b18b60900ab9eb5af76c9cbd0d50f25412c162bd9e1746cefe4e53fee39c7949045d295b1ef9be0ac042e9b9d781bb9416984b29077323846174b5f9ce01493c3e64ee0c45a91a67518152ec41087ab7bd9047662c9adf17859d0cae97b0d109b47d1996dc5135b2ac0b947da10f30450d981227a18fa99780dc08e86632c2601ea3edf4bf9fbc5cf7478412b0543e26fa02d14aba8759a889bbbd9b311edc40e280354c1d2e3e7e950449e4b1d03c441219a028001dadf07920ab9ebc347ef449c51e2fac6e072df25b37946c8cd6137bb0193bac8aa29b1917ae6d98951ac88e4fc5c82521da17fe51f3c682e82b3d625a80701442a37282c90c22367a1d9ce1708654fd770974d0c72dfc15d019827c2775e0eab75007269230a06d787bffc7bf2f871d0baf319bc82c5bbd6871a5b4240a3eb54ba798c4980d0a36015a3368b0a00a1e5c74c8b1a787c2b194d53207ae656669037f1d6fc304253ed1e1ad45db68355b34e45b66a7f464577b306bc125aa9bfbe60a468ae0fe220b8c9cc0a2be0e4a1396899317e2b0cbca4ef567aee3e8929a8ef5547b89ca3391c31daaf2b2079ae4c1050965c6950ff2f0dc772d804d413d8cd28733b6a31e0fc679a3b7be318f6709c4510ba7f6b7ea6b602d0d1ef35a555706297d76ded14afa391ac1a12b563051bfa3f649c1f9e596be4c3687edcae2fd3c88355e70002ea2a9a0223df5c5398d9f7bad97699d366ea1fe8bbaaf15e5b3bda443364afa2df90255cab92c431e88129f01fd5d1295f311e3418161dcaa6ffb6bd536e8743cbf8af32f4883eba941d45f812bd2f491dc3c04a4a40c3055a9042880ddb720c1936b0a7e803c8bf1f4051c5cda30b5421da87fbe4b8d9a42749b23deb45e869f00ca012b3510ec10abf3272a34c8257c327c021847ad0560b08f7376248264e556bc4edc9fcf66f37bea9f30b243aa4c664ea83d8307e8e57e346f8f7a0eaa188830a7fa3de83151a93d9c83b27eb07db8b3951869a0a10e2ca53d5558d1c04900adc1847dd0f1be5f4fe561ab8e3d2af9ed587360e0978773a1ee7872d69afb7a7845412f041d46211b4af38e7368570082b0cf5cacca77f7756b55ce04cb0b553d1c742c3fd9f4ae5832b4909980f38c84c1d0a84f282df1452930383d6f099f9bb8fc9a4dc55210a13aa52d89af8dc00f85ca9b841ca6036463408ee388d793b001031d420da01a8a31194a403db4ca702b53606f1dd794683c6cfcd0c8091b4d261ac79c9e606ff618e38914afb64276e969bec191583b3e2011fefd518c75357cdbc7d3ec8f6304bb2fed9996e137eac96a4969eafc38026af941e31a603ac34e8d6306f23f278b768ccac5916f630c7334803e75ec4d5d84ba52a3d044972eedfd55bc95183ffbd33ea918d750bcf2e81210fdba5ba97cb86b570b6c1f0769dcc11ea1950177ac5f8798b895534e905a7d1ca2715a27163654d74aaba65f5acc08bf312260608b849f252897f387d664c6cde49204e37694cb02dbf559940bdd58b1beeee70bef7a1745566077cdd414a04ed59e8329bc392c059b4f43994113c7932095b9f14bbfd2d59bc9915c9746d006816e21a30f24a4c47d5cf269d6601432152c5b707282500961827613c0e8b399c1569a9266e4136237e0223648ed4e3ac36547180a1020d9321af5d9b44b86b47927fe141848e2fd68169a535ecbedd9ebba4506f561bd33502f0f9349a420d2f07338e93e026205da64d0b7cd7380295f891fe804346a3348ff51272fff4a54c017e80b78e2b617b3a8bfe0b379600d33c4da4b015dfb08c07655050236656604bb47b549038cdd2370dff29dea72c62ed63dd428f911ce3382a3fb42a1fbba18587006971b822691a40c3e4bfb190dcf8ea0a32f08c0d01dd5dba7c25e4ba5a89ced02a443f381091e0a2960ea9aa2c542db1b87a9aee66ad8e50682b1a1d1c121d24467a814458d5f30f88ad2f7e704ddf90c982b3c60458f1467a08878a27db6e6cd5629afce5a26a5f7bd991a9d9c781f71dc335e58c78aafba05ce4456f1df0b7aca4732447a8e3fa2e6ca3057869c27450b03bc4034f128b80502f24d44b918262fd4c6091b2f08c2739723afbe1825951e2fba441b210193a08d446cef94743aaa61b7762bcd6e32431f584655eff8c38a0778bc3ef567a4b71964a86055b01b2a21856f52b9b76b000fd44efd0b7caa6710de0379356c3e863b4ff3d02554d177eec76306d49bac6d4949224f89af2f358861821853b4b46bd3f70dc2ecc3efa88730e2750e6d4d9d3127a4a74b2b5df43381eaf7d0ccf73b888341a7ed13611ca168f9c0c71022da4113889ff1cb44d1ef25deb5eb01f5844c82cbf3e5a231d918682abac788b321bcb337e65f4caf8f25500707ae5c885f0e87e7d1bc25e7442429f5932b010e703d7b972d6a241914c91f98d0741792bfe0f1b79e717d6347a2b86524cb831c38d3e5faf3f8fa43cc1bbd28ec868118a98f446e42b43668874b68a6e8ce343c1f6c50715e9acd8062096f6f6ae0733b82460a4a34597471dc29964a25798430424b3112236d2ca5b99fb7a07b211f6fe27d912aabdff055e34cde04c38396354be4161888158352bbf94495b61f04eb55e3634094d922d0afdd095957991e6860a97e871788ff9e7e704382839c7697789fe79b2f1196d9987b7e773b03f0a33a4dd92c2bbf34ca758a5c49124ca6c81a7fee62187a76790bf508801d904fc9e40d6e0df3247893bb80429d7209c30f0a87f760df4aa373b4da1f6fe219d26f69038c6c4242299a80570535d4ad5ad295d0f557595e53b1a4c7b55ffd6d25d8d12b11f336ecea7a1737f2501bda868056ee8b03da00d2b641adda21fc87fbd469f6739b272876d9975f4e0c54dce343d27bdbfcc8d099ba2f498dc4a372d1b2034f7e6636ef3cf1f91cbb60b30f6944f59f9d0cd26b2590b5a7287fcd416c16b84ad90bb0424e6fcb0ea0b48a6615ec0554d71c4634191b9f70f4fd3d68c9928dd784fbe1da0d0e943688cc2155fadf7208f775df9e24dc07106c0a7eb2d830c1809d9bc0c1d8b1fabe5328b6cfea2aa652f816f5667b3080761fc0eb5c91adc5e96f7688f92ce3ce1a0739094911715b21250cae864a7771e272b98c8becc3655872076288e185ab0551bf503c4aa0d33f6e021539af798e63e36e24c585ff6d35e0b00ce7c554cd1f61a0c7b2eb3e112b518ad6e3dcf8c27480734945a62d7269eefeca21ca6b0489926bf38f007342bfdde48e46f3022ede2045d2474fcc7817eb102550f5d62c2a662a1fa4d80f6d40a7ad3bb4ace2e0106b6f6e877d0344af5ec89164d3c6de2ce3e1541818f7560e686097c413e7abc34d55ca40756d1d4e4470fe3935152391b3de40428655a46beb5ff9600fd637bfbdcee70b830f0ed2295af72b5d87454a5f23c6c2f515ba8079174ae30ec9418ba55daadeac640d532fc85d0f9ff0140a3bb94311528d47b1320499bef49da3ab48f8135c4bde8387f4c9b22b422223ab00617a31e9678159e98720e9f23df920d46da98f06fdf8dcd882bd966f3568d75875e4140a4ec98007e5b26c1e67c2c7b1140a26d453f76762d480c5aa36dd51d583687cdf4f7c4cb3f5b8fd39e0b376b94bab1d9c32b093dc7e57be53d8c18c3440995c505a9198c133e195839429abe64117842e93e46caa2a6c641511325eba0a1a92b271cb350e6f3a62d76f76526a2cac7c9fb46abf790ddb7edb9229a17059cb98a702cb1609679c7f87d2c61771e87cec31f7270dc7f5362026ee2c52e8f6bed3417976c2a823713ca2b6faf2a33c1b5e2e2639e8209f3d932e6763a3a15415903f4aea502fe82298be93b90adcc172c818eb1dbb91229d7f911ff56151f25cf767d4248a5038264fd1ff0be9114d5a391a6fe032842374df07d246f3cc3b1f4bc50c5acb0b86fb6d6eff8a125d1b3b3c876b7dd8a28d828d72e7c16b59d5b24900c507c01492301f3b848d4876ba83685bb126d13d8bf6536d7fc2338133259bfda589f4eb5d2c3c352a3da9d9981858f834c364bd01639c6362b71d7c4c5d18ec1498f4de3e5c68aa99b625ccc9a2fb2580b90df6890dad75718856af10af8ed67fbcba1af674f0dced75976446774b8dd35ea0647c55b85aa6f4112a55e0a1c754775a155b8f9759dc9672d629db087cbd286ddcde1288ed8963bb2da198511cabeb516cbcb928b32399f74af95c97902507f4d5bdcf15ee5adae354165ddc599214f49c0d0c179086e944b4b4a8c57d63b0d70a562e2fe32f8491289d071eab6ae9be4c2f1dd326733b34861ff10aec0b2dbdb5514580f56cc3e5c8bd3b512a2853a94e03b2c3cfd6bf22b492f2c10a1fd422743fb719ddfd7b295e33fba529694272f6c24edfb848d41520c26e91dbca468fbd605717b22a0c96c54b0abfc24e412e2418a26fbcae5aa4b225c6dfe831b4454eac2968ae971f575a4a686883d937f9464d0cbbd8195aa688f7c40ef7b248fc42d9bfdaa07c743fb02e89426da1fb298a31786447ac056aa482fa7f327bab59f35139320d0fa693783784a6421bcc2baf8aace601d04db2c626d4bcbaa2c2e5fab89927a01938301fd39ab0642d8ac0503bdc2f6bf5042e34809e97e44175551b992aefb90cb337295afbed2e785fd8873353721695498c2cb8e9bc14cb757012412efab65eaa71940fb2560ab5c4eabf5c65451493290eb775a6b00b0bf5639c7586942bab2ce56a894d5f0ea79385b90e62a7664c208a5da4978d493ac5c6e4727911e1b81c48aadd027de031899dd9aa33bfe66dd5c9054f2a0883730a147bf7d7648b2326798522976c38430241af1b506e7f5785b89c0707c82e5f40d78e7028a2bda96405001673a8ac5483c027993d1c99d4e095d5151b1473a8a9d0ebce64551a8fa9d787b177d10f9270d9bcb98cac256a533c300e3b2158d0603c5fae206ee933a1e82ede85fbce7fa14c7fae51c4c49ee842a6d3f43daf19473e26999eed5698a4635c9d52ca94809d6607398da6b9f01787960d2062c23a7dd68ae39f5acda31502e26e874c4a12d2c32a40bea8d2fe93b7ffdca64e6ace51ae5e533b2473d20336fc631392c24b93685b5b278ec0fa7cc03da4974046bc4a9a343eecc9bc42925b77fb1d32dec98c00e72057cccf1c9617e1db86065f3f1cb5ceb8ca5ce0c5b89393312825342e869bd95d568508bfb93d38bc44c38e93d6e1e7340aaae43f40d270ae3b3c80fe16b843f245b562a77ccdca96b0ba71bc733d33ac6139e93afe873b41e8deb41ce49a61aac782d0220a6846ed0ff54ec6c920d1c31dab2f1dda2d9913ac8993def21df26637254c24d6612c624c39b7a2d812beea1725dcd1255f9c882bcdd8e5f3b73323ef2f9d37232c6f12cdbe6f4b68ad52e7ec177c8ee87b9a6338488860f7641cc9d309568a7ea3d32139ce8460f4002e60502d1b8db92a3107fdeb0041badc158099cf06803bfd8275773c6bc8d6ea274aa465a2dd4fe5c6ef2f6983967d63e10be4f08b7bb9d12e4d3ef1d0177658d151969523d10fdc3ee9af7bdc7c3cfc11dbc6800999b9a4a7d2b8439ffc7de20f80b2981d762c87c5d10f3834144850f88f94602d71f3cc7b11899bb2b01b09047b5e4de5ff34a1da137aff6ba6e68b79a015664745fb86a0d104b3f54358d91b6c4f6170e54139b557861cd8c5a45181a8efd88a582e412b5f7cd613b4760697ab9b62feb0ef6bbf91b3a24d5ca008d6abafb98ebcd1fbfc4d451bf125cd852ae887516496c46a7fe1a3f12f84716060c7834388e9b62886940776859a0bc9c510c3d019c89fb6ce2425d9c34cbbe8a0578232310710b18c36258a543a0b9008dc12bc8acbd881e95cff02e80cf13e64e3ca1eb48225b0c4987985c426341d3cd9c6ed8d21ee2aca8a9e1715f591510e1956022cdc9ccd4a0cb3e2cfb4c7f38290bd9dc6e64e0181f86795f831ff86066db8b171e1c71cb911dadc5a60b3130fb7a371019e99ea94b9bf722d53d874a82174a889315f506f59ce2a85cf1ea102deea0b2d998a6b47c7eda36265256760c438ad6a9d12016b0d2118914e6b6deb311ef1ea0f087a82b425e02426bfe94cbe1bcfcf929278d0796eb0803f7f19ac420d92d0ed602e4ec93b6711af1ee01012190feadd865eead6676b769dc32d0029afbadcd1e7084bff4c9aa57d5e23944f3c3769cc57c5ef872f45b9d20de336130082d63f840101f702b9817a0a6ae46fc1938de71a44cebb41897be6364b848cec78dccf67702d2c4ad0ef260f7a7ce8a28f3e8381bca691460546e12755966c7d783be106363ccc30b0d28fc2bb7c52d574dcead94c744d130ca0fa11427d59c1c90e539d420ee89329e1635f0134777731a3c8d2df35b2cf96be3540b3134877f3a48a5ffbbe16d1ca9c47b037edee94f6524e7b5402a587e5f8956f52a7b5c930dbc5d806999716d579b924c38dba3d2aa6ad2d751a7e119e7e8ed6e25c46d528f286c6bacd8ff2c95187147e9d8cf2001d41117c3a66f5d490f4fb2b1d2c275ad609a11dcaa594475ba6abc1d359a70925e0f906eb9b6092b841049ecc7344033616d24ea49f87993652ab5101f50bf7e3ed2a2339c13a3c73bd271ad9f417212a8dacde0a503b81915ebda0666360dab7629e670a1667978dbe06272aa6dc4f66784370b295ac619a3edf0dbedc135c386936d11f35fa36c0add3014843adbf38e74f2cfe619db31fc67188c0fbbc6e01fdbc0d0e0d6ef5c9ba561252b69676fbd06a6830a70a2e7c5302c5a47fdff3e5f2b8fd9f5631977283ca2a5214006474afad6d20173405652cacdc03ad9fb10d82c7e4664c6b32e0000e1a04a7c693c6c0e6986cb8368e90ea64d3acdac3b2e2693ab4256aaada30abaa8dcbf8d188408dfd68c9c8d02b5dd0df6c2293a241981a1d8e345a8b83347888cc6faa2c51b4f64eac64cd8fb717801eadc642b79a7a1642308efdc02295ba7a933c134cafcf3a2579627891bb455c4f9a0a7031ff01afae15d2b539b6b2182f75a00b003fe85101aabd2acbaaf19d666199b89f719abc0b71990ba9d2d186f16cc9d080da3a8734e3d0f901388e81273fc2e2a2f47b47fa80d5948ca2d955c932ab93c83cb9f950d0ac77878a915142a74ab48c52ee88ea2201951c9ec70ae1a95c160c18d903e15fd9db34b98c361c860dd2c75ea57b89045a9d1a82f03f2bed171b51850b94ec51971d61b1474d1920a53cd005a1463863749ddcc2cfff15d51ee2480f019b7a95013efb4c8402699586bd25ff1da2f13c5fa65db2a652e6983a0fd3e289a464c0870b25fa5fdb9de2737f08d531b5d32f5c419c9d98da2478940a77012006dc8540bd9267504e5b25a3ae79caa13d0d117e15fceaa25b44d841d68519f7c49e11f73c3284dc90748540eb28ba6f8dbc4345f67a85f696c49c688acb5ad69b14960cec6bf26a288a1632a7baec9823a83bdabcaf249c881992bc5684368846ea643277dc717c91ea909fd3265a6ffb9b0ea3eaa780e9784768dec05db31104b39b2a8201c8d93957a8b7b2c9b6d30a4732a2e4fc2927fc4a0de1473f5aecc15a1cd7082e655ad8ba64ff02266bd82c73386fd101515d86673f9c34c6d6b9cd7987fc956e69003da058fc8f12b73b142f9c9bb2cffd760ada18f019127472f1d4183a375971b8701cac9303f41e26d992a73aeccb1a9e08705553ac9598d5d7ab800639fe2d7c427d4c296b272cdf75e9ddd9c806bcd049654ec58dfe0d337ee492f80773aa70db404f77cf485bc2f8e46acb286490c428bd2f0f1b3893019e660eedd43672fa0a00362febf1fa20c555dd707c57129e0f2450467e2d1701b810405903229753e7a42b1a4993475e7531737bb488111cc5decd3964013a7ddcb0ef9700af360b0eefc8ac3bda145ba8236a9802b950d324c249315a2c9d8c6b3ccb56a9dcf984b5908f00c9bdcea6ea18225a9a137ee26b635d178986a359f2793e4d9e18ac08b930b931bbe184ea9c10d9fe204e487d5c9ea6cf04e3310c89671edd070cf7f8baef1cb0359b074987968734cf5343b35c668615c89f8301cdf14eb104a5399017c7bc90550bfa858221931576620ba6c84fdc3a616b031cbe34bc2bbc6a307a39428a42ef012272c7f242c1f4feee2da71b0df2b31c3928188a98e17d0e18da3c2bdacbc71e1f01be0423d44cc5a6ff090d8d652a8c035b0821bde5f57789b82888d3a7887db6bbac852ddde640fde3ca88ae7f932ee320002a1d68f9843792b81226437d737a0f449f87f43a06af5dc3de7e7f5e424fba4987f982a1934d921d1a10cbeae9c15216d23a2c900630dac63bbe721d8411b54f7a0b9683d5023f937c128915329f1e1dc22d48d1ba4ec874f30dbea2419b053bc7cc81fb6021aa74861563cf49f65bdd0ed23b2c315e4809d37de2f9f2263844b13a6082321116b9c96b28303f353398dc5ad90df40d2a61f98e226e5623cb7d1f5e1b2afa48992d9e3612f4a82cd18892e41926011d85031de14db8e614ca19d45f5200457282cef27086b6b8a16285c664486a46bc101948af2970cb02d20c105c82d529305c59efa62ac8ae84aaec384d49b9bd4d50d3a950961d5607edb1762c07ff26c9e7e791bfb27f658ae0a413c3793a2a640a1bb599a7f04a58912d6557d79c171ba030f3546b4eec04f03e871c8d31f6f528265a502d094c32578437897d6554ec0bedbcefb6878b6e0151586054499ce61063f7a7dd3d108aeacc09f1ba49af6682b39d6b9332222188e4ca8241f4b19aeaf7c8ed5d4ba16617a76f68258985498591e2218621598296c6315c81a9313940c0e3e7f135e6831e1cce6088cbb35e0b16a72696c4fdafa25216511047745421d5e90b2b5facae91b3f8d064045c188a64624ab1a12a1e958b0f1173ae091693548e8a6c77a920c34fc19b1410536c3b11072720152a6df99c94a7c67fd95f38384031a59910adb11d0c05db99898f80711c05eed29b64d595a91db8b7aa413a6121c4c39c9d38d0955a0b7f59feb37306903feeaffc2c2f88d400b5ec677d3a07b506e22449a557bcd158d8212a3e688c94d8810e62819917e14cd33303104f5c144c56070b77fad4af4e0e4255bd74e0352e2f69b920ff982b042c2c5634f978c29f9bb19f2ce2eed386241c1a02e4d60d11e92f6c0b96695a9293218b408f23865ad08135fc4061f2864843861ab1e6f50806e86cd73adcf9f5c4fd1bd89be3b56db741469d4314dbd420d848e9068abf365515c4ae71db5626e5869730b41135ace0e37516a58b61abfa0a62d17b3e532ff43242622b43058f40cc66a2c51bc5d9534fae1effe0c84b77f6537e58bf76e795a241f33c4186520ce9c429c5616e9e8c2627a2177f15a9e559182dbde91d14f11e5739594d49f2bb97f7a80d464f531496e9802ca84537f6a8260549441c590edc615721e7510ec747458d66d3189fa389094faaeb8c60203c1b9487253d3d4c59750db734489fd5b86392ab1fc2519c4dd103d0f4d4f1232a990a986bb0aa838b0291c3f59e72a4c98932860c1d22f731094c2847ebf4134c4e67f14cf26b88579df369e9600114f6459f5141f2e3043d53682306bcbd7778718acdcb253fcfa2335c525cc6ed90dfe7c705364dcacb8db3cf81e91f393f4b8dd1e17b6ba919799e62ed6d869db2985b80ce0f638c9d8844111e6c0cbea0d6ceecf402647fafe21943e655b764c23fee557aa5629afe956a4a39fdd45327e7ed225b17eb7efed10c9e17967c433eaf46a110eb817ec18dff62d553f838d849d8d05056a8c2fefb58d545eafb0a67f57348173a77ceeff84a7807a64198ad48f2861a23b82f78d8602803c81a411161ecccd381e87e211e659f31a3a1da774dda47e1b4a84fa64e9fcd56072095c6db5a2809933cd01e1047e941feeaba476c5413081cb46ac9e57385110a26c85e0aac9c523446837cfa5b6af499d723226e76694fd13a1611eb8042c24134740a1d55ba3faaf9206b3cec63106fe320f3c5810f27064090264a0e684db302bd4c301aeed01fa19768d9473099499496380d29dffeea4f3ec9f5eb63da474af84efef698aa8a3586cfc7398caca2004db9e237eca65bb1ce3e11503d1ed23a4fc2102549b71d873141214a5b663739504e61b619bb19911794b98f3ccd038ba5cf22ae772a6632f6d3f1491e96c296f64ea120f58b58eb85100ae0ad900db9568be27a2e8135a46edadfec3fafb5dce3f8b3fdaa6b6df503354c97d004e39ac8e60924c9c013c4d42a3930f1f83dacd825b2a665d7eae7047b37d72ee9aa18f2f7546c6fe3d0c902c07bf58aa81003566384fb9b5eb56464e94118e6b73960229d0de82437e2bbe896568703abfc212ae01002e2fbe925f4f9c91ae7975fa0d9b9f7e299caa40866742a6641006f48670fb561aaec514ab709882475c33f237ac86a168873f3ed10e317b3d36d31e2b796864a18f6ddb43d6901e1e6188b88b32a8b51b88e5d39f55022acc8d3bf4b6c02373724d23eb1c669f8ca70d40f084aa557c91ef62fc532f1e605419504af20b3b2319dd5b3988797113e12d20cc653a5fa4a12658463080096aab819b3846b8552687a45a48085088dbad2d42081f2e0549a155657646efbb28c211bb5d4ae3c5a0d8248484fd513a14159fee39a9368fbf2ece489af219d7756bf854fb0cf89496adc00753b7a0b8cb46c3007761a70f0bc163ef131688ab893b39c2b1bc8969b504b64df6b091ad7781239a0ac305db08e4ae85a96098ad0d944865b759346dc1382735d5df834b190f4538702ea8a94f0b413402731c8c123784e7fe5da6c0f92991980ef9ef4603fd16352d6f5b80bbcae802387d47a866ba931bf869a8746546a8ddebdaccecc66d35f8bd9137774a8998faa202e919148e62468095ccb3de9750d60d3d965b7f7050a925d668560663df30907391d6ef1f683fa09a23162e57ad6931fa1b8857553b29d60f6cc98bb612c1ea748285c038c3c52e7db44c35e4cd3942cbfe41b3d638b11704867e77409d4b7a516fd8fffdf6c70d9ab76e6851650e5514e6282f6d6db51b6f4897b841ec26053071d91e9f4c007612c13abe2d64edf56295ef6022c567bce3aa823296c802c459c8250e9a399accd9f708125cf5c0ef05824e24b1addfb8463526d62079b2c9c012f88e521291b9a9f2f4e2dc2bb36581a39fccad22db61fe0325e5c8f1d57200539efae7365fa850334cb73de8deb3e8ce121c90db6a386fd3b0ad8947eb27364523d7f83ba74409bdcc98644dc074de030b338edfbff1aeea06584ed2d5ceba4064ea17c0b6340a37f018c05e4593ee79f89c6c9e972c127a62f67a0ffafe827c6bd9fd768ac2550545f923b0edbf3fdc44995ff932a37fd8bdc5eea23cb9405223f5118eb173f02c84e3d9d5196510b5bc9e975a29a21c04f7a40e2a620df191de07412430db060a891f29d12105af08db3cf105fca7a97f4ca0893a43070f5c73c605258b67a8c395eeabf0b12c8ee4dd5b6d0d79fdb98465e608c7d76433e225b2b9bb32c6a261c9210f5ad2d9d0a731f88af12420eda069f78472369ca3daef86055499614fa499b9ff1cb394ace5eef16d3a2e604b848304ea1294b5d4ad3ae5d6201f5b4d5485fe4027333648bbb3deae528304ba696ed7ce056148696aee29afd9f32277ac1f622e8674dc0fdccf918175b4ffddc849bb869760ca84b1d46cc7ebb0ef4a8dd6fd792215842d8266c63e3779771fd7f005df4c316d8f7b40a89e669f2938145fe2955812b925e6c34f166f10afe0e9cd1f7b0611c2caffbf6951ad47c55d6c685a239f9eb556aa25fe19816c2b5fd95b581add1f82e54b2468f615b358ceed28d15be0bbd688031d8982a0cb5a851fdb5b54b18a7663c9483c5b046e1e440a0e5920d65d690e0a09afc9c1938f5f4e229e15cb0b086e484a5ae23a455be0a5157df1c69b9d04db3ff2764c132c1c79fb2edfca76286e5acc70d9dcc0fe2e58a6f11d281f90b81079aa5dd60f942f47f4a62622d444889452ca14a90dc70d630e621027bfdf40214e7edaffdcffc0710ab11b63aabf8f1fe7960e194a77f10fbc1cae76e0e19cb5d69aa669dbb66d1bc7711cc7ed40b5031c2489dde26f12bb85f6daa89d46ed84f3c563ee72b7274c4d5df11335f55a7ea07eb658d145df60ea0653535778994a02bfe764b6f9e6ee5d50f955f9bb31b6669df5932b0ad7932b8bc5c94a2c41eaf7aa781c1552afb6e8a7d516513f4571793467451b218a8a27dcb37a0df5048567bf87ca22c6b49477454b7957b49477454b45e15df1ae3c71799c3c2c97c7f3a2f0a0b88f8aa282f35c4fae2caea70e2ce15959a2039e15a84e7b56565074da7e3776505a6a8928449b5f77b12aedc595c5a5c5bb12d3524f9727e669a9cbe3ba4b8d2b97c7b59496f2ae78575c59ba51e5ca125bb3fd55cb37ceca937665b1385e77bf15788e829ed2579036461463e0598f5bcde0e3387125033149f5dafb9a82b83cf633e2a3f21d71795adc7f4b7c4b7c1de03ca89f2da3f7e5d27861fa982ecf6655fa63ba3c31bb8a814adb578d2b1a684d5e5632106d10da94cb938db83cf68fd0aa5c1effd96271ec4805962845203d2f9727e67969a27279f06b5fbea6cbe32496284fae35694d5fd3d7f4b3859bc2ffb325a6c6f4d416d39a7eb67c56bc2fdb66571c065f7f1886e05804630cb6561bc6386badb5c6d9f5b4711a7358c37ad35abfe805d7682f825a4c7b8aa1df5b412126598ed35a6b8ed35ccbfe05574910f1b5da7b8f5bde11583e90da5b8cf1bb20b3a83d7804d2beca8b15202e3aabe928927b2dc80b2e7b711b8dc5446a4e50598921f54121456aab188849db6b52bb9f058768f2b551fb173a6baa96c524d4f6f8f3e3b188fe1fa84debedb5563d6ea9ecb66d3fda7fa2b6967bd6664f639afa81f29edc46fb9fbb5282a86963780251631af30fd62c2955d34a0b45160c0c4b0c7fa07eb4fc40fd6cf989fac17835c6a0fc6cf981f29f2d3f513f503f5beeb6b26105d7e4b776b46105f77c52b8263f27c6c42d3f502a4c89810d2b3f5b6c3861e3c9c61397471b6d60b161c5c6151b4e3f5b8a10bf0f8b10631f0c94e5ee06e305e63f29dc13e3846bf2673176838c7d52315d60c69a2e314e2ad5b3629cc41827d587314eab18a72e00f0e236f961a070f67e1b6337ee188bf13c1b56bc90f9575988311bf809003881ccdfd9b052238427b044a1850a321b41c6b82a557eb678d19ab429f95598220e014b9420b670229f58110a4e822fb73dc762b1b6b188b5cf71595c503f188341e26f2d91e33cbf3cae27cfe282e25a7e2ff6b6cf718f0b182d0224f7ee3ee1c7342a4e804d647e2e663f26b4b73456c8fc5e5310e40cd2b12c608af4ecb782424ce25e9335a45c9e1a542ecfd708e2f268e335a206d3e569aa3145fb3c161260a06cec63828c814d345556aa8fc9280199dfb65270a242e677d11a9f704d7e18ef632c24b4bab84dae010345e65f6d21c66a3091996609323fd88a8d50649642e69610c62832851590f93f295f1064fe8c20f37744ec5382cc5f2e507e326eae2c507454ce96c6ca97052b043f0c43f0c310fc9015861bcba525b49a16592cd7932b0a96d84a5a85302cd68721f862f8228bc5125f04d72cb23eb666511c636b98c38db50a5fb4f2e4cae2cae2cae2ca92c3bb0541092c3d4c11330882e096432d0cb750f560a869ccfa3087ff0395c3ffc121f8ac56d22a840943f059e1b34098d5eac3cc0a597a137fb6fc6cd9c61cda6d0728f2628c31a8f5af5c59c0d5caf5e48a62e54af2be70b5faef03bf0757ab15f8e098c90d043fd68bad4ff3427e0f3eb9b2b8b2b8b2b8b2406d4a60598014960538a1a74810638c57a3d67fbf9f2d16a7fbeefbbaefdde9f3debff0fbba5f7dbf4a82c3efaebe0eab5062df83adeffecf969f2d3f5bb09ed254f0610dbb9e5c51b8a288ad99dbaef7377f32cf7bd17b56cb5b8daadf40f0f3c296e39a6e5cb32bcb97c1cbf9e0610d630d6b58c377bb77b3bffd40fd68b1bfddfb546cdbc6c3153207e9587890d203d3c6c3140f4fdbc6699acaebc6310665db7eb67c190b29728bd2d65a6cb5ca9da2ee8de92927ba4da57fb6fc6cf9d9f2c59b42aa2eb696b3d6e2cbddeb82eaf04b2175908e450150e41558a44471b14879824c81742c528cb8acbf2afd14fb5ef5dcb35a9c1332fd148631707c725c03ae19af99d44fe4e6bd2a3fc632fde4cae2cae2ca82bd29abab0901f32d30b9a06254217517fe8b772d45fabb6da934147805e5890eaea795e45c54ac2c075ad78afb957659ae2c20b7fa8f63c1b8a048edad1dbf355b6bef98b4faefaf36769bf6dca63de7a222e9be0ea4b6b2f63b971632b671d705d5c5b831e68222b77ffbb1557efc1cc78d0ebea0715568d6db517fda73b675c798b5426ae3cca7a1886188f6aea7cbd33df7ae28ec0ada739aa6c5d61b734191dd8b601098d7c624edef87309df6db771c4cd78d1c3805c7c17c2d3091deeafb5a4eae5ada7b76d5d2b4ef725af8b8e5e273ebc583add55b55abd346d7d3a5d93c2248fd31ebc57d5c902ebebb08c5293c22b47e6bbfbf634cf5a93ea69f48d5f8b9b2d81544718cadb135c7b63149eb5657b3af592157bf4d416ad69529eeb75fb556bfbdb77ad0fbbe31b67e55ac3ee652b98bdbac5e463f59d61552bf2b8b5de17bef5d4fdebbb278af81419e0b8ad4b4a6699a46aab8d195c5e26c5c8c2aab0b830819fcfc7a4a5fa1f3eb2f5ec88fd45e5b81029cc81da4635140138965072c3b5821b1ecd085f4488ff33a4ed334fdeb4da271354d3fc7658dcb97a4f19aee12d3033d85a66934740cf969fccf0de2deeaa9182f60c40b02d153638ccb7aca83f224fffd81fad192ffba939769fc8ff73f5aec0af6bdd1a978edd2a0f15bec0af73519dbd9191addcf6822cc8b183ef379ecdec1173a4d7bffad627ec60fd48f16eddeeb14e5d1f88e9301c3c58c676957fba4cb81453e527b1614eed150c4bce3d597b56d054d9ed7d1d0665ae0cbb4bce77e462ba6b56241715bcb7fa02e8d7e4f4ac608637c31c64417236bbcf1a431dd9f2d5a877fc1209a14ee6141e11aec49c53c294fea6bf2f4149994c7982c0cc799edbdd72c282cd2dc20632c2812b3bc347d0c6c699d69708f86a20b0c62ee84a5d05e37fe6cb138fa55ff03f5b3c5ae1045723f5b6438c9d89820a4f4c0017def50d0c47a903ab11a7ced0a5b8cfb70ef791c7941209ad43e0f83bfb57e2cce7dad056469ee732d1a5a406ccd0547b73531cf524315eea47d6050d7b5c8dcb5f025bf560f31404de4fc180492491a312a9223375223359949cffbb6afd3baa501efbf561307e48d99c44de0b798bc64cca5b11d992fe87dd6ef97571d893d95256f780a383de4c5401708e755ee80b2f6364db5da48d5e5acf0fc6a5960c9c2890dbbe32caec8628acc428a8c715968c95a48716bbd055a58a9a241400b216ece596b2d9c9cb05a54d1020a5bb7d6fa164d5b48d122668b0caca878ab2c76a0c5155a0c610b0ef00041105cadb61881a8036f85058b2cf48a076d6bc0c649e08b059af83202d2b76de3b82f2ae8bacefbbe50f1450bf8d9d617d73df0562c28c2139a908df861074d096d03a45b2cac5812608102d23b182fb0c00116466021831730b07081a852a9549d878515585cb115e1ad9cbe4c59d60fd731761ec8fb78076e0219bbe32f583690c505c82c3e206e57bc550ab42a5e93fb881fd3ba64ad6d1ba7719cdb640d1ee1704dd6b4ede3b898952a66b5e1f736304847b2de82acf72e0dc962b1c0202e9ee502e65730ad18300826591a0c924916189433c97a6ffb546e937f03836824eb3deeeb3a2fc80706b1b7cbac317b6010779a188be67b7f41e3cfeac020a2c8912c15c87aaffb3ef0038fb0de033f0f94a1c649d67b9f7fdff77df6722bd6731cebbdce6dc77ad6e86e238eab263129d4aac4c454a4937e634f33c39322c2731462315348dc82275821bd054e9842c63ca91638a14a6aa592e0585578107d9081efc6f2d2e5faff5ccf07285a5a152dc54a82c4efc9b8625d6a484c7b7bc9176e12bb05ab8adb6015f9e4369e14cb0b895f95bd78f99cc7985e414cfb9917b8df7e1bc9984a35f3c2f6aa578d49dcb88d4e8e592a668a8685e7f7094fd0421a3d61064f70229d4814def3b0958939994206093f7761ce8fc731d6815dd60145e2877122f1afdef3f067570f230698ef5f3c1e632e3ea9fbec752dad00fbdd5b21bb8fe1a50a891f6688f838ccdf05b15b80de881fecfefbf071ee4090f54ea6c4003e1e67c26fcd84ef7d9e094720dd7bef7df7e27b1df63ad6f87d37267d1f8e4931be1b3b18309fbf7be16205b35a752bafebc2d7bcefc6bc1a63399043700c5ef760d879980122c653a6a83eb7624e64de134520e25b1048187e3886ff8345a9fca027131349f0c531a6a7f494d779ff73f1dbefbc3091dde30f4f20ea29f07356b27aedaf372661ec640ac97ad6d80ac1fcb905be08b662ab71ebbe7b150a6ec59c4c59550054c9f414d88ae900c41bbff71814b253a94e2ba4577182f3a5220a0b90162bb1a4a5228a2448fb1a0c1bfac0061a2730d160f456cc4ea9c00906947d6d35ba085f8462c80ac370f5203845b4e4ea59634c7c3186ef427b1c84c331d6572d4b66aba7d0527ca00c2752c43d1ae7694c227963091ee015e289a7f0541026cc71a2886362ec3391770ae3a96f645da922c6585253e47d184bb8cff7b707a4feeeddb114a4c6503c91fa632c29f292df889f6eb46030c12a8108c385f51860a5dc574334b1960945600210dcaf37410af7050647586de0de1c64848275c839673da369fc2cd074de70673136c27680b4af97b81aa662045725e3296e43c5155345e822454511ba446d5ce765cfc3d77aaaeed3de07aec45084c9011608cc4187fbdcc874dfbe6d39d0f7bd6aebf277574afeef6d2b07d5dbab02fa5a509854ad1e5a00c2dfb5a4345920fc3db40024437ef085f0e7b540f03bef9b2c5027e57b4f060752fdcf05dfb672e8deaac61c9a10eade7e0ede5f11d7e8f75a8ec11920db6b49dba88126f7b551034df0b7c0812d07e25a52bab7e0c884dfbe1da5e4a003fe6e64c2529a1e087c0c16006ce5a0037e6f64c27f65c042f86fd76ab240ddab5a4d1648f55e4b4a0f2d0075df6481bcf76e0bc460d08c0cf9c12f00feefb99614550d5080c031872684bcb79f43f7ad1c3cafeba189242d90da5ba02d486d4cd24093fb1a6892ffbe9011d0487e078de0c7572b81179ae09be23f5bf275a89f2d3f519a9496c68475d3a5f9020331a655713d65bd50f1dbd25faef8a640e089077c40a57ad7347f57164d1b5d59387fcdf5e4cae282ba3c9aaaf5c2b6b414fe2d5f1acde4367a4a6b7912ef6b2fb8473fdd1a7f0cc5a4ef6bad25045888b0020b113610021622b0841f488553bdb02e587fdf08ccc71c4a145fb462a20b0e06060c0d43c3d0305adf65414dc946d8a5c11f635911637521912e0d664141494dd96f8af84583318254a6fc8a30570383eec8e94064fde705f75820299747c31875eb27ead2681850be2fba05325d1aec78f57901a95c1e1c1221b266c4b43ccf766010f79e15458e03592d172d11668c6957d24c7a60108cf7c0a0abf5d5575ff1851431f679d93e467469f0cb8298d1725ca377722e8d14d1cbe5b98f1f6cfabe3081418053402a976746c31841edafd5efc5fc8c183666c6c7bcd08c8f89f919337ec6f864060b8aa4e23e17f7ccf8be0fc1f0c198191ff331961232a8c838424695cb2343eb418c2bee737f736241b1b45c1e1851544480c4f8db9c48ac7f861e676488f9192f14f333c6274de87f32e36374ccc78c4f62f4c3a8220231aeb80df63ef67981d162696145b1a8b834f79381ed8cd6ccfd98d68c0c77149af1322f34f3313ff3313fd39261fd0ca8136c2c568c967e07593060c080d12e8c0d9706874b83b5192dcd09d7e08f69b1a258503910633e35f3e2c738528c21452cfe4ccb6358ac8781f130efc2850b4d1b9f565388fa59305ec07801f31ae63798ffc12e60c67c695823a79fc215145aca8b51822be26dcc7e6f5ee9ffb99ace386018f78614cf5188d9b052c49395c9a5c9315052f95ed2f3db23d333f3fee24cebbb359c0c2919fa8be1a2698b5926174d2e9a5c34b96872d1f449c5902125434a861532bac8989271850c2f314c96c9a1a600f1418c7d60501ac449eeb7cb91566bc5386948315a62a2c8fc1b1874479916247a63cc93f999182b33f3322f34f332323f4363e669607d5fbc90f1314cc2788ff13064c226c41b6f23bf8d261b41d898727966c07c8d25dce7be8ba618272c314f31515c9eee330c1364b62e9a48ed671e0ad0d5c61919647ee6859ad0fec98d971192f9999f199fd87899110a1086f9980c29171fb34c314e31589e6e4c149726df6f06b646a4dc781bef850c1063da940d325fe36d98791a39342164e3697c0e37c619ed6bbcccd7f81c6c8c337894a1c6cbfc8c360ad5186566847ee6698caa57a9be96f60e7e1863acd25a60078504554858367e57dc26ff4ceb73c24388316d8abcf239e19e99cf5b14aec9bfc578771e8d084e935fc63bee9189d2a288a075b93cd9cb8f373008d45a31fdb49a42d4ee55ad1e0a79579a2ae853f95dc59c9057a615be8c560c9331c6988682942261b4621a8a17ad18a7580d26c8fc32ad415d9a56d8d2a288e2d2e4a74b93af0d1fbc26bf14524c31450f7a70475f22bfd59e32d4171621c62c93b6314e369adc47b3539f947fa3e7377c887da4d5461b4d6e933f6699b094a6cb33c5084ba58af605f18210657ec63a4d9139f664a665a309d7e497b13185cc3596709bfcb12f46eaf25c2bba5c9e29edf37f5778019962e03e7647ee855fcf2bcdba5bbbb52ca98db2eb36acc4b85f057e2828ec313d85b1bf8669b15aee79100806e95ecbaeb5b4bb973fcfc5b87a21985143e11a9dffb6565388d7c9956ca19036fcfeb6beffc1a0aae54f5ace53da8b9eca81785fe36222c9c5901ce6626e0b6bad0c6575bb289ea310836942f4fe6345b1a860b1acb83cae12bd74f9a67c465c1e2a4754a155810264dff3fe1b85c0fffe1b9f7c0f8e3ec656dc72d18d3151f4e236b7ca67c4fda87c475c9afb4288b16f4a952ede94e7e5631a63faa989bc7f398ee35afa35ab9f48fd3ff8be7e826182c2bb1f16610392106cfdc9daf007310442b4ef9fdd460c5cefbb8702c46de38c0caaef5e48f5ddf8a489ed9f3816527df7ddf84435ba12a276431ec4181a3c88362009814188118f39155238e7f2dcbf8fb9a7b93c784733c1d36fad773f0ce6950e431699bb740993784185a1903688c67a9b418844884488448844884488448844884488448844884488447881b04a4881d0026105fcd29022ad4c28c4475e61317957bc2bde15efcad4d3b8827bf413aeb10f051515252545ca4c55711bfb2b13884ccc44354dc104692d1e67a2dcc6c69822ad77859ca221954910230c42d47ebb32db5fed8eab17a9885e3c0d43ca7db226c2d0a206c39bdc06bfd54f388613e90000420c2919520d10b56c1b868068494dd35d342d96d45adc09b60b9622f167a54b0344eb142e208a7441e69125013106d36485bc5a5413e9392d40b463ec850c29ad4b8cd3f5b00811879bc6692aadd398685af83e1e10e3113e0f269d7b51b9172f9b7b71ad08dad494366549d7a215e1f2c4fc89bb1cc7c3c78fb6712a6dcaae341d8bd1c629f24a55216f1122c61f838159c26dee871310633031dbbbab3cf0dded46450838c6380ec7fc49356ea3e64f50dc182a6e733fec41c463ec0579394e14498e8c71fa7a8872820729a24223a4422376b069ad5d50575c4b818acb61c871636cfd605aacd60616f142edca02c654bffac42e0cc3e7c2f7442e1cc3504b692b2e0dd65d88d01abcffb53c9796980bca95c5e2dc57b5c48f73415d3088db5adc4784e882b2a0d65ee0313dc1f485cc211d0b5314431461fb36b088475adbfad90216f9d962a17eb6709f8343bc916b7db77aab92e995f6b34583415663d2a45c1aade9efab7eb6586bdf8e798af81365419d5f9b72843088a65921af1d7fa22e4dfe1b6e73df759728317643ab827bbe1beee3b8a591ab1c68d7482b56ac40af89202e3c2f28872d0d856b3672fbed5aaf73208da9bbb8e9630a3d2096c093ba3c56785d2e4f112ecf95fbde0af4172d3505442393d82ba66c4b23b514eef1aef8d2c59bba343910bd29ef8ae31eaf045e73a36e4811030579bd155c2163228dfe2235f5315d40e7d53b904cd884c7e449690aa2abe23ef7632ea5afe827b493c602e4b8e7ded1d35aaaef5adedf31d625d155711b1d457e634c3f692c1ed357b620760bd2f33c7d5febeeb5fa8a37053fc1ba14ae275716bd03cdbafdae0662fe180d8da669af7a4e35936dc6b70b14b94315b2453a96285f48cf7e9a4bebb2c281180b37ed610c06ada6f8fe3e75dcab466df4a0ae176d8a96284da5076204a66ce17aba475842ea270acbd3104cae272c0c98c222841617d4df7bf3c53e8190c9da17da662d87c770878d49b39fa7b48f6524901bbeab24760b32ca45e7e436378f1e8e8ada1620c63429510b10635a6adbacdc128451c2286114992b856b9aa659d750ee93dfbef6f83ee7b9cd77a57def3d0fddabfe8233327cefbdd02764710e726fe6b016b720db7d4eb50db1400eaeb410bd2b6e8335c0853d8831ed08d27ed883f86fb5ab67e0f90d8bc8f9732136f0d03e78e89fd80b1ff3a589d1e8e1816bb84d6fa318ba8d7eccd2b88d46e338ad730222ea5e20ba0c81816802184403b84da3d1ba029902646c87d42f48075fa021f587eee31738820a16209aa46001820ae9ee00cf2f13feda8bfdee90423fb98ff6a00c0e2485878f87ef3514aef180b8d3d07832b8d768d9edc5e02a09e237ce00d148cf73ced97df4dbff5ae17fef7ddfafbeeff3dec3ef754b23a7b4ffbc1b5be78ddbd7caafa730c6aa8ca7b0f7d7f35ee53de7819ea7bd176423bdd17d36d2b6a634145304e1a916e39c735393d65a6b9aa669dbb66ddb6a094b90925a0290fbe18cef168556656583472126d35331ed45ebdcf21f88f8ed98432ae2b5d7fe57b95c3cdb75cf711cc7712fa321b9bf39735c7ec2126fe5814be3c4039fb07a628a1538f454eb8d2b1e842b1e840e0843710447106c859f451e8839872b1e04f160c58320b870e1c2850b172e5cb870e1c2850b172e5cb870e1c2850b172e5cb870e1c2850b172e5cb870e1c2c5fbefcb3199989325569f276aad3f8f63cc8bf2ba2bc8fc2eac20f3879f18c6f82f061732c087f1c243eff57bbf7a2da4f732b0fc8085ccef42f4a2f2afbc075f7cec8dabd7b27e166b25ead68cf8dfeb197104c2faaf157392bfdf3cfd306311f0bd31097c714c92f1e02843c6e8313c182f421761e8b5bcec8979f5df7b617e1dc3fa2bf674feee5b71e800279c20bbd7ad981319562ba6a34816eb2d086435c6a0b05aa2f8e228c2ac5a200ceb57ab678d311d45ae72c6f28312a4873fdd8ac5e8d6ea759492f037ef3d274bc4643aea6b892bfdbd6ead9eb56ac5c251a6a362deabfa5b62e503313f10fd2bef7500e203f1f3a2bad3cb0ae56409d2f1ed028405481bd505083dc56508431842172008611584991919bcef9e079b2f97ad15b3b5f935adb50f9247fda48dfac9da8bb3d6368ee3388ee35652e27d2c25a59212bd4e7ffe20fa827a9c09c2a97e463f145235aadc080466749b7b31ce396badb5a6699ab66ddbb66dab2ac4fb584a2a68558568b52030a406d325269e800a2c3e5cc1d274c415cff3a6bcafc5fad5f320cec8c0fad50bb184c4d171f89ecdf96a0e6b01474823384be89aa46e17dc3d0617652ce1ee2db54c4b237feebd64dd45bfd572a7afd3fc26b2f565a6abfae8fa2a6ceff3d35da4343b3fe985ca8afe344ba4d7372965fb88bbe7d0c9c1b971c771bfdd85c1dd875c8cf183b53c329594f80347641cb41ca8b067818557aa32e0fee0ee0670114692bbcedb18c9b6fa2cb0f02bd291b9916ef6116cabe9cd86a127cedee95a84a39ea8b9beb64c86be707a7a724a1d3a3d3d7ba748875159e618ed1d9e9d1d3a7aec14e9d0d1c9e9b16317edd0d9297578705eab3a4b716e101af2833442fe781fcf0466ba0fe03c3265e57662aaeb0c6d52c2e0534c44be296d9e3db3607dab62619a65370fad8e615796cb917b1c1b916d6c97e374c6d6ba8c7be3d7ad0cb905ebdb0ada43cdbab556eb9deb5db7d6e22bc4dacd5e6bb1e6e4da6bb71be388b59addfc5af0065f4da3e9dee67bf3149badbd9d5dc2b52ad7365fbcad8d5d6b2f37c39db9f66af95a225c6bb56b65b032acc5976b81c6dbcac6b0d6dadbe3c2e0b0a580bd56bbd65e3c646fee543bf7b32ece6a14300b76bb37ebe0ee5e5b13f2d804641d0f0836723dfbc580cd9826eb6bb16b07581f58bf2e8aa2bdd60896bb2a587bf5bdd85a1d16c772f6bbf75eed874de1de7c6d0ebef1667002b0208ccc8580d57786cd165bbf46ee7736fb35357f222b04f6560bacffbce062abd9bc59d0622af7723ed8f2c0f6defcf753d1586ded9693756ee4d8db69dcb5d6dacd5a1f7baf0eb0665537632576bc336bb18d5579d7729bbd3fd7c6b5716b60c76e43abdd6bc12ce27c67dc7bad66b39155a1603d7dadb6ab1e6badb53377c8e6a9ae2de2beed5a192c672dbe365b21b6c6ed71695cef6e575b6cafbdd6c7d6b8deddb2c51a5bdb63b1a5b12afb596b57b0366e8737cb657badf5b1568b715fd87cadceb6c7f52cbe362cc6f7e69b6d8f7badccedacca72f95a6b7d6c8ddb6dd8662e5b6b7bdec6a8c0f9c003d0165b95cd3156a5f2f10c3063c30220db7bb5bb6d2bc2c8f184587bedb5d6daf8e64b5e002876ea0623f8df904417a81b5a5614a186d2071e98a107522ed4ca812349428a8da4a4811f49e2090a1c69a1456448223665a4dcf98121091b4a1052d2c8e991440c4e8f72c5819e1e8028f4b43acbd3039b050fd11615e0792dfc86080b1b36444b5c1c521940717c8e0a03a882e3083788febbf13260bc8a8b03389126c23f2bc01dbbe3604464c1dcdddd5550d39b722d61439a942e003260da549b2aaf389e4d856b7c4251888c1c8dd6713cf217dafc6943790906312b472940024cdaea6eaa8c03acc1c3034c1d0d1f2ce35845b93b337a866c351f2c6062010617580ab8b9cb30d4348109083ba80015c56a1fd68d9f2837cb609b25db72e901dc8049d36e1891022304e2010789b200a619aa1abe17df0b2740602c716ac704261fab2a085111e2a6c2a04eca3e041185cb2bad860d7544098205542a6c91c27981c0ea7afa87b5f5c82f6c0358d9c185a6e9807402d070c82a6c3d762841124176d8c01031c41c29e00b861fb0307933a3092800cc115a1a68e015b6193c51baad87d6712bdc332408aed101610253b70d01917042668280742a211f12988f1230c9c838783acdc705a8755ed088800c30759c101b454030692c6aabc9a0757a054d0517903753a5c009d1ba6d06e8820a854c4425e3050d01c8c450811bc00b470410a5e36e361da08e9e2146b62f6f32da07f3a8be9cc2ff6caaadcb38fa85cce3c7ea19dcd2317254dc0bf7085a2186eb62a87aa2fc20e2ed703419858c82b601261556d9053d006d438542a611eae01a3b30dde0586c846d32d6091811d08014a0e7073c00e564e5031b50e20728393051938cf68b08013814c0061a66406204060208f1e1a18346000100c0e717b8608b231421082db80230caccd8aacc200a0d644086a0167c6ac0f83c0dcb13266862090d28718124aa5060069a14706e26200121245b7cb9a2a8004730820a86505611439846ae15ba6d0922a6f4a8a6886262099f1e3c325e781db7d19821c10870d8b0224408300448500518e0c30260a476a0e0031ed800941a68e8e1897991a58052020d2e1678549b06821e4c10020b3ca001402400890a54608822445c2ba4f0592cf013ae973cf546b85d72106e0fb494cdc1c5c1dda2bac1a7e54a7169709fb820c01fb849396651b037b81a9a0638e3cab830ec0b960b0d735956ccabebe9eeaa38ee6e9bbed9626b3507433c8353c0948560ca30682abcdd961045cc0093d6df26801c44c949e864199f121cd07e60ca30a86274346214c0a4ba211700dbf056ede380703cb40eaf10d36919307157985ee01045d583299084af0a26bd0593fe64b6307deb98022655ccea6e2b681c6d44130c6f060476c8413085adb0856d58385c0c6b8b1df400381e9b0f1c621f9c124c38061d1cadd33ac0843d4d26e3f074b0cd5fc6d101d103d86ed064b44e8b7d2fbe17aa18558ced069cc50e9a0cb6b2837e620a402c2bfd50006a649f2fd458d9621bfc231bf9646877ab619bd98868182bab7958e76fc31c56753432de66d86042231d6bd3368bb7bc9371b2e566e09928aa1b9a034cab0e44616979867361875cc50ee3d0fb165a04618a2829a0a0789a1d2121624a10500b2cf4a0e7118c80938218729b010a5084c81659b4d4e0c610395420f023812a70400318a880041fd000ce8d001e305b8750d32520618a8a1b68718108a0e880001c0a604311224180dcb02123c6132780f2010fe890c3500d1ae8796355050f9228316da145139880830164c460e100062f58810a483002100cc1001f861070430d45880ca1419617cc00055484e820073480810b5490820c2801040f0a40c2140e6ea082143c1102294c1b362488054e71b1a20a285c70021338c10411426cd810027030400d438256f0a9618134c8020505264084940d4300018600095ac1670566e762050db2c4e005273081132060a208064839000186b0b0824fcf8e4e0d0c2bfb165cace0410ca078810b4e600210305104110c10428a0f860e80430b38375fb080e18570b5031a538200c2861a722c2004104d9834a1da026b71b3d058dc27701cc81bb84c5c0dd81c5707e7d81bcf060f007f8c1b97869dd964f00c1b9365d8182a17303058cce1b71241996f8647a363a9364edbaea6698dadbbcb74a257c5b7aca8c4d930f4659eb31aee76f356cd450f88e8b9442fa6e669fe37cc544ff355f357f3576892966989f4fad2fc0e089d0fc44e8b3bd11f9de6465af235cf828fa761c1c79fe6d12eea9410bb08b813bd11faaaf96b93a203dcdcdc1800f6d276e4b86b1a460de4ee375cec5eb89ade9ce95ed77209275d07e0a24a0ad513a7b9aa1bf6bfa2e7ab1b857d0dcd7ea53354555540d5e4b073afe5aba20a09766e51c5a342e18dd0ff14354acb55fd7d7496291277859adea4482fa5ad84b35fa64c7555141bee2a27ee5b9595467b96aeee79e46eb820bcc6dd69dc3d85d172f11e3aeffa349dbd54e8d183478f9e1e3c3d76f4d8e9a1a3478e1e3a3d727af4e0c183470f0f1e1e3b78ecf0d0c123070f1d1e393c7af4f0e8e9e9e1e9d9d1b3d3a3a327478f4e4f4e4f0f1e1e3c3d3c3c3c3b78767874f0e4e0d1e1c9e1e9b183c78e9e1d3c3b76ecd8d9a163478e1d3a3b7276f4d8e1b1d3b3c3b3b363676747c74e8e1d9d9d9c9d1e3a78e8e8d1c1a363878e1d1d3a74e4d0a1a32347478f1c3c72f4e4e0c9b123c74e0e1d3972e4d0c99193a3870e0f9d1e1d1e9d1d3a3b3a3a7472e8e8e8e4e8f4c8e191d393c393b323672747474e8e1c9d9c9c1c2639dbdd675cdc8cb89ade28cd4e9c55c968a7e8eb0006e870d07434397c0e9f807f1c1d8e2e01ffffefee0270f700b83b0adff6bd4f17221688da0894d08020227a9f0e0711d1fbac465bf6df11d5ac484766fabf1a6d190d110b2cb0d05237d26b2d9500308ada0c428f2385147e2d1fb6935ee6592e6938dc7d3495a885e0af9aebace85f3537d2bace6248d1340d5a82a6290a84c5fde66603a2be8066e235efc3c7ebd0fc3e5122447fa2e6ba5444cbdc7d24723f85dc5321ee2b0e3edc73707077ec9ca84577263888792a7f71771cc43ce53e16b9bb0a898b598835458b4af717eeeec2dd87b86756c630eea2bb87eebef2cfed11988988573c03777f1f1576ced0a237427f9da18fae436a7a9373b373a363a3eeb5c9b3e0e3dddd73f7cedd555e9ea89aee25a4f5a886e6dcb29b5556aaeb6c699da1eeaabbcfe0e28d5264ca766e72746e726c72eca4525684a323078fd7ee5104ebd12307cfebb5756c94d0d74dd10c69358f9aa4ab6a1eed14073d4acbd70d0e8af42a4f1c35ddea0c383534db89a9ce86d0d5c76787678667c1c76f27a63ad46427bd4fba5595735912c870d1dae0be70f7d5942da94fb49644a21d81bbc770d15671771817ed10986cd869beac54822aed940535bd81a14a38afada4e65593e6cf2d7b1fbf8b1e269ba148ead7b87b0e774b83bbcf70d1aeeeaea637afb389baed99ac54f244691a44f467f927fa4435344b65bae49cf9f8acb299ba8f103d6ccb64e5cbdddffdc2dc3dc6452baae9cdaa64a4b9bbf5144dd3fd67f9b07da6b375a7ebb995b66c49c9fcd52cd3f58f4e735d4ba51435fa1209b714707719179dc8dd41177d087787e1a23b816d99591abdbad72645ff46e89fa8b996df244595b6929ade5ccddd69b8e831eece72d177dc7d092a334ab712f49bace6ab5c2a5f6a7af3da4a86969429ce2b55715ea84c56e23449cbb4c894b9bbc6d9dd6f8640149e3b3131918ef304983c2f244192fe3c42c1f605cf6fcbf3eebd7f33ce590439e7acdf5a9b649ffbedef93987d0240d1522577c55863fd840050482eb792f498e409a91a93b8bfaf69faf38863f72de7a4d64af2e4cb19639c71ce39637cdfad7d7f6b2dd63e04a7ab92fbdaebdc4a124326dd91b4639227422cc9bd6a8ce5b7639227e4fd517b9cc724984cf2f71742f25e14dc569394a63cf6d072a0dbeac1f6d092d2d4449216c8a4ef218f4d246981c47f93b8530d5e78252c01877b9e3cd1e13e7e1dece77fd284d0f6da3f91d2f4405a48f5fa75e0be7b1f9ff4f0407a7ca283f6ddd8f440f855a30edcd8f4403a68a31efd75d0ec195a791f9ef760ebbe67f1e7b50241e0b6226a8aa6e95e67e86a3eaa3e8e0d43cfdfab3a2380bb03c1ddb958e1ee3ff0817740c4010777df30f42cd1d7b98b1eb661b072c92682040e7f9ab2d3a4c104a2019e6eac14240e0680b90f8e0a10a5a637eb4cc9a5a6b801ea06a22adc9d0753d8206443cbdd77e0ee54e860a73324331f9f9799ee731fc1f63983cfd010912243901c09a26128280879a4881092a1211fd83eb26532f385259b086caf254c55f7eb3543528376a761078f044dd32091861d6e9a147dba977e3d4b332d95fc3ed11f423259f9c3088f1d4890dca4db3432d773c3ccf2d7a452e9d1f5d30d4bd13fcd67621aad33b4a8fc25e89984aae53ef237afbda43e6ca7a5ecb561df644df7129a2efd0884c70e551d55f379ec4082e4617b2dcf2353ddb01b35851de48b5cb8d949a892d3fcb37ca1e55ac25024b514b2aaa969f4b07dced2a55fd50d93a134bfb47792d2c7f0374ab31b5555cba2f75105f07fb3d51269e9f76f24a29d22adaf9e66b9a2e71b995f03a3f9adca4a207f439443c78ce855f3898866a9d0dfc0f6b997964aa49f19a14f444444f43b4557247fb3aaa8ec7791d21f1d99e9fabbe8653273c99b46e68a9e8f32d9e77aa22f23f3dc48eb13c1b63afbbde48dccdfeaac7ceda227aac1214443f47ba9c98ab4aa3bddab2933429554f32c915e5be98f4e33e955a6eb36d3f5b7922d33652f9b15e9c894bdaa9a48427f83fed169c2cefd3257d53c4da574af1b2693913ed46d84963542ebb9d59d2eed94e65fe612ba7e79749a4b4b650c7fb3aaa6ec895c423e888cd0df48ab129a1abd12acdce9cb64e6aafe3ed1ad84aabfd5f2f5a76984da1cfd8a9e4c50a0bfb139cddf4769292b9d98ead3801a594b99d169fe56cd25e9465ad1d7af43fee6441f966e25fbfc9da2463bdd48ebec55f395f66afa04091521027bf56fd28daab2f271acea3e325df81b75869a4a76ba64843e925a0af91ba2bd89be49d1af1bc9dffcd169eea2af59cd4757350575a954a2f9bf5197ca1870a41b69dd47e8faeb6c4956d69ce64d3a7bfd465a5554e86f5c189296b2d9cb5cd372e9cbd3fcf265b299d1562a89bcf6129273c810544885ed4de4b5975e65ba320942858028a13f56d9ac34da2e9c2891f59ca13f8cf61134dd053851223213884c56fe70bde40522ee7e8029944a75abb347d787ed74f682a144561810204311187cc08003038d08c30d183a18381836f725f46b0240f33e8ff33501f8c71180f759421f47009ee6df0787fa7f0003bcb0e58527dcfd7d6a68867c707c7c6c5ed0fcc8547af47c1e8ef081ba8fcaa5a1a5adaa43eb0c5db7ba5526a6d14e9786643233693db7923d9494964a3bb5d97a37702a8620b9bb0b1709f0c26f5e276aaa274a64480f804cc005588c7072e7dc9d9c6c929008a8e90d8e0e2538af544542a4c810a11f446620c0900d640ce946cf4f517348569ea6d19113871a4c7797b9188403e8e9ee2c70f71538a980072290249c3be955160d6d335ddd5d87bb430008d8645d52da36a7cc2cd37586b4fe0ab2d24c57743dd12f529aa5af2f5fdd48ea6c69085d4f7308664db0575991a9aae8d2465a55a5b4fcad042d2a4bd81eb26128112017b6990a3dec2c7d7c8a9466e90fabc40eee2b7a9ea8fa44eb4c6968554b19d1866da4d7ba8d7e5567b1df4a52d84b9ab8007335bd49d1b54cf76adab0c71335571376a2af9d2e3d0c455ab7d237297a98b5c05d591ffc6072f7d78f1725a0c08e135748508111b8bb089c100a82a5e86b1f59cfad24a85c4b1750231b4e20b52c954a97259238a8e9cdca647fe034d135c89d882209523df82132410b522da03b1e70175a67240cfde102878bae2a37ea1254262b4fb34c5d00c10946700191852a5c4d6fd6ade2a8fb08b651251bd85ed552a696aaee4451f5d5f2617b097696fb447f55cb2dfbb55ccb9dbe9a94b2742b29f227a9a637364a2f26384a2f26383b3b78f0f0d081e1f0d839cabdb377c07a7218f1d091b36393ee21a517131f1fa517131f2a707f9f07826d2626909c1c39742c298fc08630d9b01336e44596e62a9b29a9ea4e6130d25c65b3186878c1dd995802b6615b89b95ffb48bacd74cf9268e048ba8dd26da49e1990c9cad7aaa24a436b39949ab3243b75770cc04e3369688849a9c4a4543af752911f4b36917569bf5e64ba61e7565374358f4e5345653f60e77ea9db85266969be4ca37deea2d554d1a5ed82ac543299944aeb592ed94acca37d7496482f2641351c59d50d936da1bdbabb1247a70993a142f6366a32035267b2a574860476ce8cf69174cb60672964236162c2cebdb444ae1bc9ba935ee6aa2a99a5ecc752990ab9fb058698944aee6e019839d424ddb324488accf4a516cdd47386339d01b97b12558290408d4e7368ab27baa4eeb449ba6732a4e8690e9da6528ac64aa5a1bd96e96bcb663054c9dd2bb095cad3dd296024c8dd8f585374691f51676bb9229980ac54d3adc4940013778f80bb53494ad125eb3e5374894950ba6730acfb282dd775ab2a99ee7309ba65457b4589a43be985cadc1d02eb56d532e985cace195675cf923c604999c2905673c9d06ac6360c8d41dd1bc8ba91b8bb03d68de4652ea14269b9653fdcdd88226a69ca48776fc0691e99293ae4ee450c9da8b9ce5e9b4910cc2c97ce19dc9d88294a2f1b48f1062d176ff0e3e20da2b8bb8c1554b8e1ee327ad800e6a20d12e0a20d56e0a20dbeb8a865c6452d412e6a497251cb0f2e6a49c2452d4f2edec0babb0d1c49d8225b639b5822bb82bbdbe0e20e241e3a3739362b8aa639e8b233c500771722087707e20777f7c1dd9b7a70771e5cdc9122ee3091e2ee0a68f2ede0ee51dc9dc9dda1b8bb0e2eeeec883b3439b8fb93265c029c34f121ee4274f850439364878b3a56de82fd59fe7e95b2a59d3eda241552d39b1d373a37393636afad6428a9dc4b7c7c86721411730cc0dd6fd49dfe5e425fea9fe6a7e8fada4a1eb661691a94542448680851878abb5a2e79954636384b680afb13fd7327956b4e13ecce79fdc37aced0d7b3e0fa73cb8656a32d1b82c95006fc9003cee7a8d13964554b18ccd53c87383165e56902096a225b5a22b75a221911f2f181c13a618383afaf9da6e8eb57f454ff8dccbdc464bf6afe4612fa15888652748808b69154f3348d3edd3099390352d31b75359592dcddc6fce834d315c991a125752b95e7fa2a9794d01f3e3e4a72e898b9d26d441d4af712935209b695a45bdda9ac5cd1758849a9e462522abd4cf534d395c91eda6a59e4caa163e623dd4698944ae829a434801da8e98dac1455b081dfdcdca4b06e198eb5dce9d1af2891bf51655bc996bdac2c65b397ac7c3dd26a2ef9a3d3849d331f1f771adcdd486d521ad9db68486d522ea96a297bd5b04405156a740e6992a26b093bcb186465ba978ac84aa51425a2aaa5ec87daa434a2ee1b50222ed85e5a32d355f55152cb253ed4f4060707492d91ce998fcf9aa24b4b3375682b95a9918fcf5632d77396d2f880464aa489c289de87e8d7f21fb6d7a5599aa23fdc9d68c843e2ee30b84843048300175398daabbacfa174afe690129a1a0dbdf6928af3da4ac41470709a25d20fb35c4b1790ce21486a29c4e5e31ce2e3b56940e2e3b3a4966b0973e148555acba1f5dc6a0e1d3325e8d210935249c8109100084144c88e121f9f722d5d80ed5535d5741ba1e185a53286bd532120d890158595493274692ba148f68912114ad1d750b9962ec0ca2d04566e2422492f54069494964ae95ecb25434b4a29520e1db373090a7ba1e9926bc3d01f34f838517368c93e97945221ebac88ac5c4fd48999a248ae3dc3561a82a5e592a5998bc7ccc76bd3e0e3f3da4a7c7c60ab3ab4a4966b09830d59cf6d2e99af9d0220870574c981bbd7e0e26885abe9ccdd895c1cd5743d37ce52a94480edaa81ed23989916918f0336a44c4b23343e5e9b06f53564d6e4d0317b1c3974cc68f66ccf920cc190d452888f0facdc4843af244a434994600e68fd5881bb17c0c5e780bbcc9cf1dce4b0418d4ed366cbca970adbe791a9aa486b69c4084553231b86beb60bebb9d52212e9b5964aaa19c38aa2b0721f6992ae6790ac8495fbc88aca90c0ca8d44a2414ed4dc4736ac4c8f966638328d4ef407acdc425e496248a2e4c2766222d9b33d9301e9b5964baae9c23964492915c264c3ce21aabad3a3a025a55488bb07712041eeb27d9e25d28f25a554c8aa0e3529653bf5f1191a1a5a512475a93c91ecb55c911c9de651a9aa3b061e7e702500210f3044a03505cce1000a38e1844d12621e1093e5064cb8a0430d847e6081079abb933fb2a2729d29fdd0380064b8972eda60e24d76d290ac7ca11cf00cd4f8a273a363b3dd46b5c0c51aef4dcef2cf12697d24b5dc464626eccbdf4a4a24a49789b4e4713cba9e26ac4465b0bdbe66e9aa9ee8eb9bc84ef455f3a67c2314499d7d93a287eddf4567f972f716dcdde5eed969f8015ca47184fb96151599a7126c27f915d6b5fc722d61af362997c8ca876dd5445a1f76968fa49648bf61e85912ed99aca4c1c707b6cf254536ece834915ee5eb775afeaec1c70afe335365699684a2327146e6fe3e1b86be7ecb8a4aa457b9d373f6b09deef5dcef739aeecec3dd7b98b0e0ee4af024b8fb0d2eca50e1b06da6abce4d4f8e9b1c9b2298cd36d37547076c177d1358b95359e9240905dcddc8451914dc61e86b68c3d0d34c571c752b315753c94c97707814e9d02979368e4e8e32a747c76b07a643c70e8f9cdd63b3d7325dd5a2998aa3ae3334e9b5915e38ab79147403dbeb6a2a29a12ffb7393f42a8bd0f477d19fe5ebd71269fd3ff712fa28112c527071866c45d1f4f75199a2abda84968b3372969c09315fdc3d8553dd28ec61e546faf5dc6969c4dd6d8e5c8c91e26a7a8373b36ed55c4d5979a67b65b25f56aee7563ad1d45472063d897157daabda44b559c251d72d93954b38ea4c36539abd705474691fc1b9416848a201a814eed1a6410c3285cccc00400000000063140030381c12898583c1681a467aaac70714800a8aa05868489908e32ccb6114428611630c1001000001800191d126086bb4de4f8804b57327decfbfb31de3fccb31aad056e029235bf37b5a0a3374e8a3676f7e7116395e8fdf8b61b87fb537a90c0ef0ee715ba616b8fa01eef5b5b97fef782a11688e348ab24beccdfe2f4ee082b5f42c0060e8e00ed5bfa003985fbb62f54369fe9bda67e6a7a2243a841e6320679e3b0c7e8c51fe18f223b1be3dfed586cfed2943ec43b8064230fc928d643f7d3cda53d927c3cf9e6b96db2d1c5ff3830be5c9a156ec98ebc813f936a3cb86496875cbcdaf28492e4d2810b167c8e1a3afb8fc37dbf03fe923f2148c834bc572f4b234c9aae35b7695b542e15ed949cda0c45a1d288053d110523ebbd4b38924bae39c22c978a30517de854bec437fb64eb26ab52d9dade9fccfd7a2fd9b138dfed0ac917aebbcbbb1f57e5240bf7ea6dc27dea92e48b9c52ec7c15d1898cf7eb4175f6e28c121e9a704ffd9ec1615ba353489ef152a8203fa37c5ff03e0406edca3633af5da54bf4f014c87e8a38583c6ce5fcf3f5c4e8a8e8df6183fb2ad3b64e3e9e610504cbb8992ee53ab6b2c8b094305402acae1b073ea015d43a776cf7c3e27c87f4c076999eb675d35eef885b13e765e2234c981079701e7c27202d05ea28c1e4b506801bb9e7add9ae26a9779e6ffc9887978ac9589ced472a561270f41b8656918fdf35710ff8d32cb2a0fd21cf67aeb231fa60e5092ae98120d22fbd7338a3ef1d0b343bcdbfcc3a440ecb234fb9fa4e32dbadb098d48b19780723ab84805a8c8cdd9b3ffc030786128b6360f09ea2735c6be1d025f8e434676ce14ccb459742bbfc46161509dfc4e38c2ea9cad845b9b5fb22e1f4c9c8c88653ffe704bbcaf12c0b669f6439eeb8e1f8dd18311345e549aa40177384dff464fda1b3d377ba1c87aa9a84387fb453655759493cff6f031da0999aaea61e9b609cee34be630bd075b843c92cbf66b544ac627cd98ee25be446b43bd918eebbe6bfb232c41e6559ae9df4cfb69b588238d288b68756478db4cdfa23582967e833d2ced55bee629e5b90c705027077de44126ee7b4b38b72a5489df8b915a3f03c220aab02c557e76e3d5404f35929ba16b7a284668c16c2f156da981aa60a7a93a93b7c2282b5f1be56b84fde44e5153bb5e659179afd81a593f072abd4d5fd6f39847c1d9d59eac684cd5cc4d671adc47fcf5e0672d71f40473eb23c6b2bd8f3327e94b2fc31970895c1e377ef422101fefe1b7f7d37618f9ec6be3373629cbbaab2ddcae79e103c1da04e9d638a71d34ddef4243e706180be0f12dcbcb51a1c391ccac3c9d52ce0885847837b1a3bfaefd639df4571625ccbfe3aa13c7b336dfcb6b0e0b057266314d3cba7f85a556fa187a2ec72067e3b96d2f4e3bc74bc57499832888386a452248ab5141800f3812e05b3be2144e48478f42ea93de755be7631b5baa60338e92d67d0f4b62bffb3f33fa01c0b34c451f261a7ea59c6e9f5ce3c36de2c2e9eb2fa5d38a357ef7ce55daf05cba3bd3eb1ec19047cf88fd01ef930ea0ad97173167ef4ee5f069d5656d90fec6c04e4f8dab80f8afa2561bd2c2d2d831abb990534514a447a8d32a706cade71e68b8a0c6e411ea6cc41ea549378890d251f61656eb82d8d86ef66e38db5e25b715f2df05edd218ff036c6611bde6a63b248ced51d1c154ae98f6f1b97451748992674d8df0cbfb25064741d6714a1dd4a54ad99e2ff566d7d4c0bf873c3fdea210a4f5a82eea7eedda6e7624eeeb4a5cb9ee82ff71d75862549643a6a1301ebf6c28793f086945a05c0f610702df5e2b2777bcc5ce1a95e6bb3f8d63cd88c8dde2ea5faee8aa42f029352771094938fe413615bcf530cf4d635649b51823a7b97e4122da46d1febb35efdbcd5f31c6b2dd8ca87dd3d581dd84bd22e983b7771747fde0e2c202de419bb74843ac610a1e293ad87227b146ddbc4f07fc3cb7f91660e415931b601be53be7395d8035bc91bc0d7733cd07a375bd7d0542f634163df6b2fed1539190795a7c4b6b5e960eb3d12b3902cf61e997656ea724ecc2575f35587db9cd96782480d40d9ed227504908cf5fa5ad42c63fdb6d717c92e21f5a012ee7dec3f27ac51ec8cab3ba32042cd60b1837ac90f0a8bf4301f7666aa32ca2215ba752ed1d86eee2ffd2f72347a5db9562e7bce0467c344218b92a8b68512219fb1e0687171fd85bfb0d5663d07c1069de5732086458f8ab1c97e9af556f93978bc4e226f5c775e7d1b41025b9fc4937a91b0a68611c85c74931cbd20eca4cc04f92c4c5d72450252c6658595df45315a29c227f462eb00e5c2d0f5bd4af47883bb78cf3f28628714153225b37d4b8a64d3c345d542472afd95a3c4845afccc032f32e46d755d63b70d60ff53311c768e446359bfc9312c999361de1e4bc0f0e03508d0eb4649c4e7ec4d55ecbc1a07549cdab34578cabf7ac31962b68a17dde128db73d159c2e4ea5b3bde496a3457d7ab4bfed4076eb5e2558162330124eeb703fba618fac47990efe0c68cb4a1de243d8d2a354082262784fb883c1f0898b3deb3a3a595cecf609e62695ffec8e11bd2d655c16e0480e12854725219b2383172056672c0e3842e4cc7ffd2eb0bf214b7117b5637e651cf04d9f92902e24262a98fff7e4fb7e1e1abf66e08232917b43db76e41b961e778e99bfdf7426c84d8ae3edf1ef969b17a4c6296e3e87edab5bba6bdfeb4fec9941a9eeaba65ea89d75d7bfe6ce1ddf370e4a9e07a524b1cdf271c3765c9076f9ad03a6c55ecc69598d6123f1556f3c08ff6f0aba9f2e671e3c1053e6725d6c2bbef9ad588f89df432ebb86a775be9b1887377fabb8139286309ed6e6945718dcbd7436682975a894dabf42d91c7d149694cb1c8bfa23d693cb5576f17e2f4154f25cca3903f7ef71c1dbd2b891cd1c1ebf1e005ea4d170173c5a03ece33ae77da76037f952860a406620d986fd5f0deef7aa8c9d6a8c09cff3d096bf6f181d57a2f868aec61d860b04ed5321d9a1f74287697ce2f6cbda7c4080b4cb3e394da9ae70400e63f160ab42c847127af76336238eef21d2e31674406290bb7d21bf0963c9cb40c01d86342b66ff30c7932651d7ad4ad45175cc9a11ebd83f046d00022a9724acff48226cea6ab0448ba28a384d8f9011a5f34c123d7e93f1b2ede76c69b212cb021539c859c326ec9620369f9ca2d375b75a727406163bc71e0c6fea9f380761d930aa5b70250eb72230a224623259c824044d33b2d6e905ada21051ee7d1c9d0cc89b600d5a07463029a165fdf933a841a8d10499c5d7748da9f72d9f69405762f945c3353eca5ec68813fb550043ef25ca8ba3d81e21a2807aa8226feb7a9725d70d86088191e7ad3b7a0f7d0d55c5974169684073fa1db9453281a184f4470a01055d79ff63555337fd045abad4a75ab4b53811f53a9a1f72e1624711a29689acd6e386fcbcbf70325afced9de9a144c6f3a8697c2524208d68b45960789a601c4c532c1eb08ca607c09b1efafb3532a9b0e539eaa301eb52a71afa3ada804459bbd3f72455b38a62c23760278becc0e3942f602f1138686c9d86c07af9936a1d78687204a65349b0355c7d10a6017d8df495d0638112a3190d7f1a4e9a798d25017ae16ca02d37f07679b39d4c5e158b65cb8850312307e84a69c2a2b989f24a08ac1d0141e828add35abdca3f47227512ad4899aed7961ea29aaaa5e833752e4bf591215a72c1750fd3585aaf1dca3e8f389e5c0de4acaf99b037850eb3006f2e19e0560b854e374d68a66a475e89c3a0f1ee4d71174a123fda5d4f3cb4a5a35070fbdbca6372e4a669ced915f7ba23aadf44234a4d67d305b13cda61f18f8beef1e17d9614161e2102060b1d2ac6e4488c4969cf43ace7d50ee24e7f797fd9d8128361adc3a7dc4a7575ef8b344881e86717f007a9af1bdbac9fa0c39c41c258f5e81ab676d0aa8d7d94ebda408135ec116548a32ba660eefa0fc581241d42f2316e2205c0d9fcecef655f934c6501987584eb2bee805f1ac3d419435ccdbf6a259501103d334ed2e9d34e4bc32c750f10e2a502bdd53cacddf80121358fb3b68ba52f66d02cd7b6597c45fdb00078c488a92d0a2dfdbfb5adb363a2bd4cb0d2bd0fe343f66aa39d8141f6df69fc2fcff74eb05c99c0deade8a3ee8248f2fd3f69e4ac92f1d32451c0f9ee4bfbbbbf727c5ffa62b78aa167025df63d2f84f6bfe9e4335a44f7f4e5d0f6aa98fa614a61ab2cad67fe8fc9d6f4dc39caee7f9cd22ec944efd96cf115942e2ac60fb45a35549dc387bb0254384cf5ffed1acab9db16253d4ed49dd9a6c4ad8b9b07ee7f3d51ffcb3f825730d5ea19900e663775ea9e53b49eb66a8c5efd0fec48747cbbe14a2fd18fba6ac22610f82eb2f201b129b5cff358024ea62e7be996a1f84564661ab27e6da76cf5315bbcd3e9934b8ca3ef62739fbb8759df6cf9aa2b2972c76b30554cfc17cfee958fae61ad137115755684c65b737f620ed0fdf2803fac04f56bf5e42714bdd80d2dea97d80275adef6000a20f93fe671a188e8f2fc1b027a16c776f576f649793fdb8b1d53799cfbd7c3d480af30dc844ab37bf13949448ccce8a138bec9370cba3de4c46b56e30bd628e5887dc8c85347c5f9f02f304ba2691546291f89dcedf4b7c14f2f87292cc130723efd2970a544a7288cb9172239498dab95a5da793374e546a3ffeff9e647117d7c1b7e3e3361c61914ca18ee98d93339c811c03bfae6c47d37c7427127aab8f1c6c1373492b2a14370878187096898e5dde5ae7659f9b0d80433d37be3671b258ec14036c44f172df7c3baddcba23c5b3dde1c17c0e0a3c6e78166dff91786d0a7f12af81de21e0172067dc5f7aa5d257067dfb44fef3710b72c6cac680f216df36777ddd709ef90654b936e757c43b65795c8b4da0c3f3a142f7e2eb83fa7bf108f480a7bd7c190d0ef1b7422abda3566e53d208469bc3467ffe63af78cbbb9f7b4fb197606b3ea13500576bcb9399fbfe42e7f0a576df990300ee6f70afdedb82029eb97b78dde5666e81be41d6658a2159765ebcb3fe5911a78d78dcba89c574c17e37fca3dd881fe78b1f336cd5b76cc7c7c683eea54e7fcb3e9be0946e1fb35806f338e81a407cb9285f4f6792839868efe71e44978350bd858b7edf874acfd93e897f149ca0bf80ed4d7ebd2dc35ba5401fa2530a99e1e0fc47f51e7219af48f6bd2895a04c1cb3b1170c9520d5612c426aef34fc1f672d21890f0c5362b7110de1461b3a3f4969e8034bb80417b5683aecbdd2c6caaf3bf4db0fdfe34a5f61b46848dd4aad9faa25a865b8f8cec91ff29ddb525f64606e9503f58a5a0534ff2cf22b48a014ae4a922fb6cea4f2e0c1fc57a41c7fb5598a99b7dd5e172062e641629ffa011573103ad37eb07566f7f26329ec174c012bfcb206cba4c0eff4919ed5516648af71df7a8733c3f724e43e3ba2a9e2fea25e90b666eb51307355a58b5af44cea02eb615d61eb23ceb189880800fb66a571b9096a81858ffed4c4763aef032eeb60491faede72f96b42b67f7d57e451f731980669645c3ce9d8d13026cc72d3fd6ade946aa47bd126823030ae788d842928f56eefa4dca27066633a6c3fe1660ed0f3843e5a101796274b1321f618b35a8905fe7690df74aac9c46e22e4e8a9ef77026c8942a2753768d016d2aca61ad9094f55b4c57ddef34368e6353ea71782235c3fc37f067ecb6bea1d97fa2f74443c8c4ba4c111c87dda1cc6ed536d94ac539b634ef4549c065bc3aa0a599577db9a8921dc5bee532c72171f03fb53be98f4b8d220c1d6f9d6f9f6e51c5fec391cb01ed9d3eb491c0af936c537c15b9116e801bb3fce03cf4769d2c1e9fc8c80218f40cfb1c1e46d139859a766f50379368958e59a75c0e811d87bcf40760086c73a41026b644349d0e80f929d96a91e5d04de3b68fc5fb6fdd4bacd8640a5668c3b087ed53a6d1133042fe7941a89bb29f84e7d154caf8f53e2d911e159a51898fb993a193d4db38e54df7239f811b45d366623dff3216a3428515dd3003d87e8f94b3b138491cb66bd385dc15567e7993ff113f93579562d6293e88630dcee9ce889c648684f3422e8da6332f7f9e0fedbcb78de102459bef4b573df941873dbb1f0f367d514733dc5e0bdf4cee983316f4bbb82e82c2f21157cc132a97fb24962b12885651f50a597ceff7d151730f66b6df44659c1b7a69453d3826f7b6be2c2e94552947fe3cf9d3a32733c60496df321341afe4dbb846c4149f1f331b2af587a76cf3545acd02e887cb22250349387d8404eb0b31b586f3ec68ed71e21e0db63c207350a88d0533cfcd35e112a19f8c420cf3571644dc54a0890be565c49981d1ef33caafdfcaf63ffcd118ee4371899e399a917676029a4701da3e1b396052740f1d6adf19c255513df4e9663d307e36aaf25cfea8526e06b11e9a652f55ce92df88b661f5b8ae64cf3df72b1f54a27072cef22fc3d3d4cec4c109e74bf3313879ed85185778119449985c640f4a3860dd09bb74ab472173c3a2d3824dd02a32809f7a67cd89b4c923decda92a30a82e9fdec88045489dc172ab8e8e9a4fd09407812b724a94ed4fc5a3e2cfb1987fb76c8749112e499bf9651c64c348a1ef818ed1a736ed5e54b0ee2a4b548607400973237d5ce51eb2501a97ab211c2b0f3af941d3674a22d3f9256bf6dcbf141afa3aa27dbb562699b9a884132c1795ab2224e0e8ad79c301f24e984d0928076da3bca3c9648f6acccdfdfcad303e47ad8e9ecae88af6c86468c985953008879c36eee7f823d2250802f6a199030d8456739f3584dc801d391ec41f0f926572d3e9f2b2ac50b399a1c5eedec2bce0cfa61aaf893374302925ca40a891db9b71643b4bf892021a0ab86fcc4333ca7f43b0285f8952f768b2865ce83bc29711498f5d8f21a834f7d767fac092108e491db2cd37045ff554bf2b9aa60a16232ed2305db94d38e2c20c1df2fc3b6b6de9b4fdc95edb6b0c7aa4a5d783e338bdcd71a624be27159e93cf571a15ad675e03655b5a03a50b111b0c17b5aeeb19675b3c12ece45325fbe58bd8ae8635c5d171ad86fdd71d4c79f7947fd57bcb39b51d76c9adfb49427be95fba970c5aaa8bcbea99194d7a930a90991cd760ef2a969b7015c7c2130ec992032404dfe06ab0af7d72e10a1a229f345e65ca453498010a809b95ece235b39b4b0da2d6ff6410c68cc27b982aee723a152ff2e57144642e18881c850fedaf9aa83fb06d9c61120808d1718c618c3ca442c37e6638c7d12298a721197ff0ac23d46cbd7dd3311cc28dfa27e8cbe0896e9a9e57c602588e4feea4620661cfb76154a9939c0f3035ec9597f764b13b998295d33a155033e6d8018fc5ccd3038a23703c579d164a4d50e10b2acf810fd68caf4400874741446e796fb30309710038ab8af8edcb796022c751e5645744aaf1d3761119fa63a2ad69925221118bb2ac164a9616bfa89533e70acb40637675dfd38184d562bd4036c0cccee6b333da8c5b129f3b101a21b32c33592a91a40b0e28a7b1baf39b7768ac99c17d3746891b71dd5847a9d4dd2210fc97a54bfa8eb40640604b8ddce490687e68e1cfc10b2cd97f2ee0b9426765ca0c3efb4d0a65cd500e2fccf607816f8848e3c1153514b222e50aba338a88232655a63435554bba0751d8e16d82fb6ded77eae141db45074b94ead6bd92429a57fd0a85747d5f6e7e5960aeaa27805677d6f4f42efe3bc6938dbc603624d0c6a8c5d9788f061ab732f453f793038119f29db845f64dcade09807fccb183841f7ba6c897d7134b43e5ea1c99090fa6dc19b5f5b221344d7cae305c5b34904e43c92424a028aab780f1c1d7d4cee6fb6041ebca43dc51f7b3c14874d3c8a369008a116155947a2de63f6e2a96c3b6a8738caca105c7f48e06807b401ed67d9ef21b4df6c4b1a31c0eb8105e16ab3531bd263c8e0d3ba52382324e472561176bd91c47fde0bdf67965f7d71b84c641a4446d0d94e49078a60696b761852827df21b353726d592768526c838e5acfe2cf80d08f6af9a652a548900023748154ab94009b555db5182861c5a0ce76f6baf87920071b0352a1885a1839312f3bd43a5dca68260df407b55e0870ebd1658e922779cfc9ea9f73b8969365a9407c444f7a8e0fad00e294d74b1e1398802cc7a10cf7d098015d3d6a8db9164c64d5c5517dbac3fd923afbe01ffa5434eb2e6aaaf3e8fcc3491deacf2c06e058536e4a3d79436da88338d6f036085d3e0e0c6aec5e0a09650ff344b464b754b5af75979691d4c4fe8e2560be545baed6800c4a7112c063d5303838a8a5be223516b435c94e34749a7cf03f6261850d9d5ce9f799bce31768655c1dc6f8cf6056b34e5768e04a126ddef762d1e0e93f0b04f192eaa00614e03cedcaf7377faee1a3dcb79d1c4fbd8bdf38539d97eb0d518949205d68783552797a4db4a722936800fb6d0203feaaa9863b465a6497a18807626733846fc2157cb0b8cece30fec23a287b92e98a743fff965f70771e22a06d169e92c79659da7efeac38c0aacd70156ed1ded3fdd6bac24f26f4a2fa23d2aa52b7dd1f9f8670320328be9c7ee4bbd6c417b8c85681f2658025ff821d51364ed636928e3c01e353c32e3aab9add35ea4bd170d5e96e35c555af76100385b4c53a6d6bb89c6e92a570535131cb92e1d0e536f321fe0d263cb7b9cd0e332908fad3ac372d69fd40645a442d8e66ffd0f85bb1ffb495373a9d4e12418af6eeb6b156531c1a0eb3c10ac1dfb694eccc3259d4f0335f7c9119994b57815f9b8bb8eb043212f4c3c85d12cd945b44a69a367f3b988ce56ffbe2148a27518161adec6d87c8c73e973528eb5accace373cd5797cb98c9aff8431515ad46c4757059db9e288ef73da492a1c8fe1b36e591ece951cc33a0e6f095ab2ff1ca56a6cfe1735edff8887672d7156acc6cd223d26dc1996731ef8e85427c847af2c2a201e8bcee5077e12ae99e47ca0817a2f7c29f5a0a9c48019a1eaa1d1b40ec9458987ec17d36b25a16850ba93ec4f4fae7e01e2f4e16b15d158e268b845fed368121e496f7a91e6b44f26eb451c8390d5dacaaf35bb2413a1116babae033059e486f41bca6a1170a69c06d5d9957da7a345c0a69592a1792d8f80c0159a45bcc091c88e9f194267525f12dc8e26eaf104ad1825718480672a464fbe62f4ba40ef08a43345da8a961063af4461c79cd4203927d1df21bcc65410bb720e787b52da46efe3d1ac3f0ad1290fa8139716c48d513ceb207532eab764a894c133857341c3b570b26da089e2d370bf800735f7562b6e87d82de4f480472bf49af38a1161c41f21ec9ef118b791c60a40c5ae74572a8b7c59ec5e1211199b42e28bbe97b1c62f3427233a36a91c786857cadbf536280247e156b986438b7f2bdca145b74358c45b9676a1bffd1fa240be20c5d455f18759ebd3dbecd828797184b55153661481e9271cd04c41a3f1e496a4e638c96bb917956ccdd0bd430e788c45069a94ac03def66e1c9768c8292cf81b24f1731d90c196d8adddf5b5f8657d335da58dc47bfe2c5ec9377e4f4a9cf9f7177af3f51563b114a4d602d68da652951fdd52db181f81b013706982d112cd26791f89e0e1a3dac560ba38980a567bb381fad2c6601f7031337cd915424455b319bb29e921cff6a57f7302726cccacb5b7eea3fe1f68ecd4b6f21dab1333bcd78c800e0c67e00dc504f9e03650a6cf1f62b2311c9fc8bc52cd828281ca8810c2152a0c0b913bd18f5bae0866440ab9b1537c87bc109d5bb34d78e9b57d2b746707d6d63803033db6701e93370fee65435235e782e0923191c35f5c0498970dd6c43fcee408474129a00feec9101d2401566d642ec23c60fae958eb3bb20b202188e370e7e4474f6e5d3d44d846248ddf75ad1fd1f3b0f9a5accbfdc3c7afae511bd31bb4f633be1989671692496f1d69b1964402a85438302f7e468e7478e440c36669d405a1c840122fb9b43b217f1dabfee382c0f732b5f8f3ed9cb64299fa1dcaa2ec2f504e6915baa06bc8810d4cba6c4f6199296c0ff78bb324efd60d39f592a62f3ab6439d437583d155445e85cf6e97441eac10ba28eb5b6fd48049d68cfb0adcc01ae752d4addcb77da0e2c675a365cabd13d5b8e5ffb608b0b137516abf5680d12c23ffa4306dceabb7cfeeb4ed7b89d8efcf38cf0f29ecbc848b24efb296790bee6e50b98cd068da32650c8e478070321898da270bd2ed00b0f5b0450320521480cf1a955e60ee15f765bd8a2141038fb0b2c57a8617893ccfaaaa37d81d01de62de8ed18957fbc4c5439edc15e5e4178000204151726e620fd96294a689f841bbc44a3800f0e8d85b76df1d58c8569c337f29bfd3b209d5fecc9695093ccc4aee86f411d6c880134e8ef2423825676a4962be02e82ca65110bbc3765d0f98bd380827a2a7ac2630f6201807d1e267b6df56ab093f9bde4e4aaa5df26ce9fd4476468556054359ea14f39470f8f950d1bfce3f11fdd52cddc958591009cc90e406fdf1eea3e02448d2b015b19041757680fc488af78fdb7ed58365149d931ec9334445a76101e3ccb74fc48ae8504a233bc201033df96d53e4c5f9380903861fe5eba8a6f7e4084f73c424dcd22a23df9dc4481832ead5be9669b6917839b4390cf28951a654d90e91b4024f3ea820778630fc20f89193d4b4c8513a3c3b37bc68e0dca1358b0865d543aa2dda10117457392a9f4fef6a661461bfb287ef7c5405b773a36fc928aa10e1528e67b23a3be7040108022f495185e25b39b24b6bbaf1837a01af907a655bb05797afa73c450c35f4bc0b930f9916586e3ec088f6aa53a9cf92a3a37a79e3b1b323c11beca8a192577e75354e6228e23f987ccc14dc687c54740277efbb74444f86bc95dd26a7c077625ce6c4d387f51bc3b32f4476061830c4d9974599c8315f1b9f22e697a1e67dead625c5bd47d409a597b82cb8377e9221fb0c56fd1c226c4efae955385422f1a62455c2fc042440c74da3e06e64d36c936434b3b82498c2336795a3bdbc8be5a52598df715bbdcb8ec3450149ae653e58e5634f905626c2aa222dfbcc16eb113d9639b8209fa2f6f3748fbd8d73413f545eb63283f988d10a6d0ae3267d77fcda52e09d0bda2db126eac2e61d48030235b102db59b779238055e076604706ab0ade95df99445926de6f5ce5ec1575e985b104df7635fda0609a8ed3ff1602fcb3a1579636e9f53ac3b1ba04673eff7c3f1f7e31a97cddaf2b62fad24f38dc597e0f4de32135fd71c7a8314a3e369354142366977bc2ae1f482b54dcc3120aedc2977e83daccd499dc69a507ddcc4d4ea4bf1928272226f1822721195091beac5a5349f13a841cc3333fc80500e3989e028114c745f7aab23117546f409e2d06cd3b17643763944ef667a6f3b82d5460c5d8af6794a95361741209d9aa1407d4cc82b738bdb7606051153d2e5ab8fab7375107c0a9c28a21a6fa62eae994422681fa060f7bd73dfc21d60b79ca60fdd802829f19e202c33f9d992b3e960371831572bc346e417f243976cc13e3624aaf3c483003294e08aca7ffbcc988e418811122877339d1ee2def03bae0e6dc089ece86ba01dc16651089faed20f85dc8aedcc05b3137b04cab180b02091d41792c4c90f238c2c0fd1df475447fabb532a889807344590d82f2b30823c3273236ded80426870c140cf6e74b39718e5b5bd1f9219ebe2e40606fb47e8c0c380b8c3d563ce6562e2e90420d43363d8a0d21baa2b73dae8a006fecaf14e12ade9f6320d826638c39660f2b3a878be09837a7e8af0689200206f5d3e5004332cea671ad80480fc5f3191611827fb49c3fbc242b4d3304b0bb10c914f1aa0a60642a4748690e09334323eb1240127bfc955aad8e75097eea639dd54f5e66bb2ddc4c7fd615abda32015638f806a8a0b43ac3b4e4c093b130b26e5cc54abee0512492ea221428080c451447af1f0d952c53ca3d2bdcd651f46f69dbae68cb47e8892b5d97917c13e26efc4fb142cf5efde9445c214d2a4b7bef4e4ba902df00036cc3a35af4bb299df42f817630941ea9d22fae97998a9e6d41b8e9bffba2d87bb8108edb55ee508e22daba248370214722d07b8f9382fb373a6326fc098ab734852d6c92d21dbfa98d5d07f41dd0d3b202a36891f7ecc3062f27b8c56cfb7dd6c1cf12087d8668a80881cb46db0c03bee7c3344c02c90344abd51956488c5c7e90a10847c54cf79128f03f346c550a62a18ae15ebb919ba05ebe66a3ff2a71040b334017626e98613108a03aba29ddc83b41a252b66d623602472cbc2065d11eb99352fcf119e2aa8be99054b4deccd283add8133630c7992c789495196e9f9eea88a00f63055a4ab2ce8c790815425e9300ba80a4c22850acca0be702e1148138caad0a8d50095d84891146189f16b8b7d606d8ac12dd357bd79e42ad7f68f1ba25ea749272b934725002b3084ac45dae1ef4d635569232862daf56620a5088550ef617e82b1d7343e7d82ca3e90b8d2d354bb64cb474fe1eb6ae4066754153537b0f9a3a80f54b605c2d8fd3698efbb5c4483cb246dbf702d24ff740ac977a72d906e5cdf9ecb477cced89a2a198b7a65ff1bed09c5cb4efd0c0b1d0146218a01da4bf6cb03127036bf91e48afdd7bb3e240bf568e352e2453d9b7be71886f23e72d85c5e1a01193cd2ec523878799e39b507d889f39e95f390d25267b9b0eccc4c8f7e7483d41c2e4a3ad288c04635356a92a5c8911cc88190f3c0cfa45cd0351e3e72cfd219dad5dbf4fe8e59aa735e56bdfd2cd49793683f49e86bf36ea76985ae5780c3e0b116d701cd1cc6d4b3c37633b4b1e2df9fbf09ac4361d80bda56d811d732a68da672af73016ebf69bfcf5e452b5c92db2cc77701a19ccc09fa8bcdb0a8437bc086797dcfa4c366fc4b60e8fe7e1e608848cadf556d3a174697ef8b3d65433cf0538b64c713524be45468eb98aacbe019bcbd3ad76e1d2a13586a192fbc373301dc12cd317a12841f4be1397e064b8979994e80237be853a303acd44835a5694bef472c7bd7ad2a68c1ef1b830a35afb2ea376bf2202193503edfe5e5f7a8dc47621248429646aaeaa51e4af9f9c0a4f043901abc5f14851f0787a66e54880b09962d6ba69ee54e5d44343bdcd9a2219152cdc11859604a1fc6916d823ff59a03db773a050a0f05f81158521575d02ac6bff26230608850321865eba4006a75fde92908679c5697dbb67f9322bf642fd4d34ba385e739e154fd8e2d42166658f70c377852195df67ab68352c3eba57663e6afbbf9408b449e7870702614d59135ab1ee25723bf869b2bbc8ecc14b9fe30e2795477003aef986f6ceec3d00f72488f0d26b431793567fe924dfabb5ffb98b969be446d2832252fb203d0dca8e0acfdf6c3ed878339bbf02619edb80e0361d2bdd029fd75b9a4d770b1d8b46c8039893fe0160603bd1d1dfa52d2e6a9e7ba373aed47955ba3949745fded165eeaa65902ea95d716d15335510e264314c1ffc7916c4def6d071818ab6f6d22e02a6040423f4ff58c91d2d5632701ca63dff0457b46349ba87800b581e38cff78974efb6389553a347c5e0e1679f0d82715d92ba420bf782b1c613b42bb23960ca26864f3263e57380954ea05680bf04bc1fa2b35da013ccf5550470683e41378938e073706662cd2ef8b626f8bf6b37fa875a66d952499cff04a435272caf96b087cad9c6e1860d5e260af9062b278019d593548f88c72d4601b7a83404a6260dfd4cdbed55b0f42c0d2462f6cf4d2c5e1c47119ca255e5f883e60441a1a6826ceb2c0f5c5a36deeffa2e4135a00a0c00ec90e4e6c40ff2d8cbb539f9d9931b239c0c67992eef4563bc0ae765e09d0d716544932c19f584acbec03cb1ad98e129927cb9012a70f66c799168135288853bdbce099c13f540d269cbaf22e95bd423885dead451a58ce533f6fd05e856d5ce0cfd682783a5a7c412d3dff27eb221f3b5993c08059de542d82a349664ff1690e55423731c001a544d767f695c6d841adaa9c9c368b568cb7c682f4a0a892d9331817697c249f9b77bfd916e3525d08132dd27f5edc27a11a07a1656d595d43d6a05df00fec998f437c8147d9d2422cc4ab7d716c7dee13702163a7f18accf4e915b8a9df189a106377824fd03d059f64a8e3511c5a6468b2bf150a777f4d9cc442875098ec387502df5dc3f475c218e2aee8389b95a910488352318920988a95ec81f2e13b4e57d5053e3b2e8a599e062401765ae4cbb427fd01c256ea9761ada7df402de39b71ba5ce8f48f36bb69a18547a802a50a5c77f078f23c91be0f48d51427712f006c3195409c1006177f48ee8276a413b5cb7e82f5f456d56768d0b2889423a081f236511de874f73b07769af2e679495a48ba474abf3ab4133db91be9c55435466e223d36384b6ee519e2b51a9b52a22ef18a719662a9c2aa986b3b1747399d92bd650aaa393ea4095c8a1b02a2c8613ceca1ef48888fa6283d5b206bd51cd9e138681cd7fcf2866ff372a030f6707b09c7a25cacd495ca0181a9fa1aa1e0be5127c28099a2ae4c579c655d108eb7013ac4bcb15dc59c6328bb4cc1c8bcb80e83e23e6328859884bda7772f6614cca904f4d3dca1872f8366f9fad6ed6e36e15a2ac59c1b4b818bef58aa671144eeddfae23ab1a7ef581f60a125643e19eb64c864fed08ac15bc527258d06c221618bd2bc7491b90d71a406462077409ef077c054bc9b58328376dec7ab6d63aa580fdf70dc0277cd396b612fad480101a8407ba7485faf35a149483418e82ec2f3960ef45070423d1df5616a42603963e6879f79463f66c491b5244f29aa9ad905b661ce3ba275f73518823a941840ef6433fb622475d61d8b812cbd9714474fefb4f261dfde5c640ef2d317b5a9b9f4e92d49580c568dfeaa756bfd9c564a0a39410ae99dce50d6bc44b949b503acdd458dbdabc608df262e279087463403533299e2de969b7d86d97628c0356f9825d177466d0180a8acdd0dbae60596e528501c5eadc75bb87177ceb976106c0c648eb781b95fe2c431a025a1c8a434ba711018612df0af55f253ecef243858dcbc48caa191b886da6c96eae70b29ecaa091e158668aaee7b9fe51b25c9dfc218e262abe2eaa61c11b7ca375847ba48cf335f25af3a4960ef56266429fe963897fc07903c69d80e3e80bdcc3f82bee45029bac3f377ccaf52f3147b6d77568d2d92ed948bb651dc9ca809b4ffe8743d31ba46887a9a587f41c37b35bc71c9362523f421fec45e2838254da50369d7b6cd9d579210f05cffec24d92deac1c54b59a93268795753979a4f8362c9c9ca8bdb141364631bb2d27c85b1130e75183028251d27bfd6caa2569d2182c3198e07ee110e5170f6c5d8a56f9b1bb3850ac426bafb27157b5010515ce57b0264391fcabb6148eca772b077e32852eff89f25bb3db55efb0bc6e408a724eadb50285a5d2cc60c39a8dd2e3a45c48a0954d355cd4df4aba86b81ae57bb023bdd8f4db7d219b22f0241320368910fdec4e043a76937ec662f22906cfad2e6678d2979c98ab0eec0fcffc3194f1d596605833f1c49f18c1d008450181358344832818133ee1b5592aa5e8709ed19ab52efd171c6664cfdbd20d33c9b1ce20cf6766c8720506494ad1269138c8203ddf7beeb18d2ad0abe5a8c1c08b1afda596882c4668ba95ac4629780d88fe9946b7eaf3ad133ed23eb295746e75f261c4cc66d651b824e5562b0cfa335e7b80a3cc062447dc6a3767e93480b792945a59c6a9a5795be19ce16c410698e9200fe820710421486e28a9553b86876dace214bf676db955e13ee6ac72a0772ee58caa57fdb3dd746ea0f06376543cfd9b60fb8a41825540e48dea39079ecb51b6ff27010df33aad91a37d233bd8574eb50bfc2f66e38d2c8da2e4aa54fca469101991c07815388e2f8182ff0462e3958464a25b70547c0914b19347df6953cba2618cf6b3a46b2734f7cf8adf3b6897034bad52bf99228ed273a340571895cb81ab47639b953c2e13873d920ae7a3dbb3214829bab51a739d9884b64321ea12446c5810d3e13567abfa69820a000894b76316d5f89a15eaebe8c290028ff6b06a7b181723b95a4043824012461d55d9ae1a130131bde46b018000263d22ea100004921e8effb7bc8f525d583e43cddd0c32b8eb06043f025796412363bd377abb61d4f544f4371283f447e77325b6e46d7d9958aedc06617f38c50c2a13a09f2713208deef10912cf8979a513bbdbb511804f9628961b76ddeb6530ffdc35e8d3b033c5baa9612b552c11902d151e937df9bda8103ce957c80ade8a69533545f6184e688418971fd8007931d089c572e879cae5518b1d2b1cc8b8588a99cc8ba197594abf9e3764b103f37b64bf1b236f9165cf0ade97d17eeabc433609ef96d53e75bc452e39ef97691ff5bc4756ec27f395dabd8e53cf4c2f631745995cc5fde6b3eb8e72dffac50574278ed3cc527794634e2e0f7b66a90314416245afa4f2f961737260e2a2f78ccbbaee8499a5cc0c0a0cfd18bbadd7152e7ae5300cac30570b9c5982efb8fdec596391788ad1ad913c250ac6f7a5e4296696d0813c5394d823ba70e5458551a5e74b09455317f804c93cb3b44a3da578aeb5ffe00f5fe73e6f9828835414102bb3943911fd22aca6a4a0cde949199b88902ae970da74c69428a13325e75ac76da6e412f1d48a9d7f6cc019f77a84344918f833f2433dbf8b1e17cf963e84d23f7af857709115f518fd9b88cc2ca136a93e89686dbd516aca50199f85b1d82c624e247035c5e7ec3d107156c51a9d5d425c3e9f59f23665306792805cf2e34a901a201ff9e0a3d46ff440d4f5c3a5bb513b7889502ad3949a843af374824f0392abe52a48ee15ab8cf44ea8da1693f9b196a5ec5f71a2b660d0284beb41b9dc7b75100fea2cb7ffffb8a135cffa972beb8f6e38f12880a7e0a6fe924651d51751bb2646475e298a6e25407a1640f4d79862a714866cdaef7368603f9a66861e50bbc33b17764a6e9fdbb12f4693fbdf93f6330c5e504d839682df1e02a4b39214e011150a8be844d44371a0112da38291cfb2d44589d4818de64b378e8cbdd2b715426b2f4c86a0eb26968d8897de53e266d52870de0c3a002d4bc972a371cd89341e180b03942c7af4d401d2a977947302e101062a71d8955f262debf24111973c96a52f7d7a4a15a1dfd140904473da1ec1654ce82d53582f78f63641161f7e26fc3380e3071608770785654986a89567b14d6cdb7a6f621293e170ddd869d6cf44ecd23469b63312cb2b21e224fc36c5e06fdfb31644d38b3c7b3887d216f98e53fe35d81ec1271702c61a9f175540e251f04923d38dfa7c58205a184038c002761dc74724c6fb0edb967ffef5faeb2b1d7a1c45ba94388400a2dae888de584346f481d42f0a6d8368f343e45aa27e697abc86f5df1648c43c211c546301420d42431748dd05fa6796118aa7a57368f046ba87cfee09d95eeabc4146d89fc1d2c8c7eca399443e488bd41caa879972544e1545688aab7e60eac900903140cd8725ffa86992e5af95c4aaf909abbe3504c9b506dabcf69ea8805d8cd50f548886d87bf84a63398f80d13a8a265723df8769921f6d803f63507c375b355d5c7cdb6e9f6be172509a41f0ba7842ac1193bde155c16b96f0d8a30518ba30e509bd7a51503ceca56ed4c44427cecfcf0233ed35db127b7a45703e7e2e3053a1a76a24b41456f6526ecbc7daa573996551d47c7855f8fbf668c3b56ebcfa5508281260864de5ba1c45083bac763965c4be4833eb07fe4461cb3ae33d41e12cb7e4a1d1e9147a6ab28863525fc374beb12f7f7bd0672460ba10260280748615e990ed6ca1335087cbdb6a5ad128d3c87f7c29cf2302ffc3958f80e46e84a471645236514c74d174f71658ac0791137441ce52353b284d1d1c64307317f236638062fd6dc79e915e34d90893205232f4e757ac1440963629bae5c2688500827ecf425d6320b5f21811648f99fec616c6584c22a595a3bbe0db5c4fc8c90496cb66dc6630e3b476a13bc17b9a75f28bb54d30567cf8da3e53742a09e2ed1acc1b2949ebe45cf48ca00e487d2cbfe81fd8b3987ab7cc2e46777a03ec25d9f6570e97d179066e937aed6f64dddd51138dbeffb6c2168bfbd6f446c8a481a5c6acd16d8bace92096bad11fecbcedf66a05002d9976e8feaa2e411b23547bd44ebad14d71ce1623bfe94a4f7d325c010d8d4682db3b4fd22b1c85635332167db2e81f3abbd992b68caaceea15f4d09d0af8c6e4001c760b3abe02185e2cdcb9edd12dc5480bbacc5518f66765b035f5e6b5eea789b4047a7e897e7fe8e7e2ecd21d7195ee9bde626a7657afecffb6bb72b0c1a9a73c9255ee30e6062e80e97ab96f25b78499ba476b205cfd400df87ac03d745041fb959a695079fc1e5389cef390222f2dadee9d100908c5201e2083cb2af29c34614e33fc72e02fefbf61ef512dccc9ed01f98c167bfd0dda42a1397119766a1280a06c0e7dc06fe796932b062d8ff7306d20b2822c99ccf26dde750582d762597eec9875f6b103913ffad9dedb982fdd29054ffb1f18e6898f4e4e941147c145e735af4ff4e02e50f1a8772874097fbc8e32c3567efed5d8d1372be31ed2cf50686c4412e92222ec3bc56b1e46151b091b3da30c63b8c144148d0490a59db952a59233432443d021c267e4da48f81612c1931340d4358b9b4b3c54b48e082e0cdde944635497590c8d0376b6bac8ce2956509bbc40a371041aad3b772d2eb3941eb2c42af9cb125c7accc86e2fd578c611875842ae8dae130e4e59ab40e835a4581796907684afe35040c90ba0e3ad92fa011d07adf917b8cd5c7d34cf5c501f12bc8e2cef1d41b7e734cb227b17db4b04c2a8d9bcd464816189d350c68b1fe4d5e7d03b2a510e029250a0c50288225dda9bc6a36eecf6067511f78f8fa46fe9ebdeda9f864d34be03b1d056097a578ae9c0d0cdd54f5c976140908b165f6c3514d8adc68e2e133737457a80b4dfb1b3f7894ed0090997526cbf1b7676d039397f913e0d7c438839529aaaf2803768e4aa7ec7e7663c3fa3f7c490e122cd54cb9c31e25baa66d649d435a87485e4193d2b69eb42bf930a7c3e0835cec410bde3b5d7894d44c560e9ccd7eae2cc1d0dcd26f57a489009324f3812279891df2db62ab19bc2f13b698b31822924cd55627372f84001c26fcdb6a72cee118b1c4ce410423c914ba87495d5c14cddac57e0f3221e0e26d08ba374d1112a11eeb3613a2529ff275d6a21cc2cc014a48121f9322c179dfdb3027b511339e83b92e6e6e831b15149df3991fdc5f66999c2aca25e8374ce935132998710af8c33492a80be93c8a1ac4eb7af31a5d30cf2c8f3c3a4639946fe9440d34bf925dde94a6ab362578771e1ef68590ed8ca2e4f9695a149c4855845e02d3187f813788233681e7ca2c95e6521db9e9d5518c40254931619a8d623d2aba854b75c815d7aca7b8eb81b1306a464139169fc07be4f5eb18353868db3434720edf5a09a6d903f45554443adfadbf72035df8d9f8c5c17810330d1800fd661bcf55b582554e9683003b658938a6950a693df55480d968e6a4c07a261ea006a40d854474f6683991cd1c482fa336ea0b41a6f8ee2e5db0168a249fa1166725df13a406ad0475c6f82a281cacf439374de39ec5e52664c5596cdcbaeb69990bd17328279a1b7eee89fdc85da94197428856e1c89d470f68cbb5eeb2444c45af044d68d61cf28b25331954d4d9c605108b4309848909da56c23ed3ea4eb963197270aa8740b9460d75b1ad7c5762b1351bab6854e47baa444943b080a60b33be5503b37fcd9b8d6f5e54e4482d07944e4cc9af70bb610494718999d832d4d423055e05947c394da6373ca8491137fe4522a75b21b1a1666d6445f151423805b123c1f746fe10f3d6c058c77bd1b6ded3c17495cbc99530476c404f39a8c2ca80c6e919fec78594e1a47c2fc7cd6d197fcdbad9ae3beda5443661b2f30e80c0a340bb56c82cd8c1784f4e2a5c6694ae16fdd1fe8f75dd1127c361bd225744694f13352d5ce92338670f3d30792d64c72e108c22b50b8f59ff996054c429181593de5293afb212e11ab9b8c1fad347b4672e2e2ec32354eaa3388eedd9d0d5374a91b84dc4d845cb8d8a17269eef430050da19af205000a6c107228a283970260a9086ecee5d309290c1f59668abb1096efc25e754b70b2b98ac285c452678d5025845d70b510f4d00825174248e7d9c9e94b3eb44f321a46c05337fd1ffbd7a336a5a65073afe21ffcae35ae9b42889e201baddd8deb521b3cdb7ed7fbfb4c4cf710e540e1798e1f44b04ad604597e83b27f87950d12dfa46ad11a9a9e97bb1fe223f9a8410b365fd360ce4df38906eb84cd1b2d08b108f72f69c44215ff1f4aa654a87b56c7507b5f74481db42010ea982ed6d0df0314d4462a9fd42e70606afe343079067d537e9ded87820366b535e48f558c2efeb0cf207e146e4c004f66993d7f959c412f95a5ff3f23121844f9048eeae3c387395f0c02d7a9c3b2f583ed772e344bf01e7f6ce720c5a45f0abeff6e717d6a29591a7f33f2351845281ca6497bc9169cfdee3bbce0720edac55e35279f2d93b6ac070e85372c93391f2df7292072065c1462665b7b9840f66b7312e33b09688c4a4a091b9a7dcb36a77b39eab47346c5f74bc16ad6890dc4dcb1e098cb0ce4fe3c196d529d4d7aad755171faf29e388ab9eefba829aa156ee1d350133daccecd37fb185560a3af76a5cd6be5e2f620daa2be2b02adf6acd04ee35da9a006be190d819aa727e755a5884a18462987aa7b2512403903ebabfd5e6423f3a65098908e202ade43358232af859608d93906d14a468ed225f11c48cad1924746c4b12523239f56ae3015bb7013f51f590ec6e02d9eb7bbc08dd9a86f32641ec3c057ca29567a79a1077c6801d80e1e90a908bd252688f9e21c803a09b048fa86bed664bf1eb2f441df425c029588472123c32ea94bffbb03a6378e495c0b8f1eddf03dea1ee61a797c14e56b68573a8dd8a4664ac6efeec327c51a24f5630844f3b1728e93108f43b0093fe4a5274cb921de52999c79dafa1748668e889e74049999c7026f6fef9acf97a966728afd45bb4356b1e10850ca089b2b91ab9c488f15a6f21c90c96faeb599c926bcefceb03c1b64f7280dbd3e04f7a055f362215e22024dbe4fc399fdc799eb33b414ff4c7ce98eb6d38b26e008e11d49021ac2bfb6409c47f4c49dd621c36345d53415413fc1eaabd7a888ad717d45f3fc62007a179e89120fc4015bceca4e9958f6893342a63175dcf573214354665f8a1bb8cd9770cbefdaf7ec182d725e25d73385f7847e67f4e61ad90768291d6a8118b3eeeedf44765b616e33f5c9a09475d50a21f4c9018c4b28eed9cdffad46aa6c19ca9f04a9b73b20dc15f9c4b451b3637c67daa0936d7e3da13f5d20af3fe7cc9ed972f1eab6d87a993d625fb34f38b376498471d903c6b930ef1c307335fee40d7f4d16d3e6ba50606a93983577d4a5bb8fac7c398e0769c193030a793604c07b4bf63b0f29c057a404cd67f0adaa7bfcde0a4381140cfe42adac4ebb38b2c9c7639136c770d7d28f6031579aa5b0b60970167708bcfcefd0756d81fcd70f56777a0642b7405fce031985144d28d24e406da7111e156975f43debd6acc60c8cb585ca4432cbd80f54e286828f5bcb00ea78d63c6b65709c20cab3c6fe5434b5461c9283fa01622c480e78ed1df44f62979f7778d61094d24bdec2f5d4ec21394e681a38343a88b8b326d255069b2cf85c67adb3554050c8f22810e547a61cebf5ca2bb1aab1ab8881afd7f888de0fb20a571356b15eafe8f19391ad406714750efdaeb84804d2d691f6ac459997c01b57cedadcb113808cb0c1141cc98e40222e0dc5aa7440a634bf20ea13faf0beb00e025bb55e1ab7ffcd463abea138e9068f8f8d8fea2ecf5537758dde8a7169041a9dd1fe19522d6be9e19d606efe305e8ed5851d9f73ec4f982231cd8fb12237acd55ac5f268fe5a437b00013cb65e2d001434c83b1407e46ac038e83568c8a1079edb7a4f365f17e71dffe035c83acc39f489ea7bcafb6fb8ac1c120a2a54bb473097a509d25605408702fb56f42ff8a3010ba74613ded29a3e44dc79f75294e56a38cdcff5c36f05ad4b0a3808d5c6826bc6708d3e6db40efc1b740646d75862c680cc561df7c6b95137799b0cba66653271e465b9083c7024856fa334ade7d7cf356b5bb051d4cd7aae214ebbf75b8407e11e0fdf04e0e2c529eb08464a1f75f80820302d0eaf784d287453458d80f4d8127430dd38b9b525de3619c39024ed9812d95c63b603b8a27f7ab88ecf500dd64914ce492f040330fa12f8b43c9c401028ef908a19d705a3affe77867b2df1ec62cd026a54f016027e8a8c5dd91c9d202c74e05fbfe2081234937b3f532e8fcbc0857c6a738d245207f5a8dacfbb4b005caf3f10583b6085a92008525beb948b200918e94a87f5cb4cc0e4d704ac607201bd08b4a7e9f30088b74ccd5415007f3d9d3f9be137a8c7aa8d4dfb4b6974038b85308d6470a6df1d776fcddf60cdbe37893f34f23a3b825c53a87cb08bbc9e9979ec0917216989e8e22455b9166b5c4b12bc1620011f75ea470d3901e0e5b2d3867ad0555238d869b76d167c11203d9549b141a94e80d7f0b90f28db099716ebb4f461aa3277d635786d5be561ccc21e161802736993a0ba2d26d9e6d3f4365c95820d8960bc916b1e9e0739584e03d3691a9c0c053845efef046536734aa7e574c4dd702cae83a40e220a263fa6551f1342c24f6f07fa4a3a22a15d9c6be606e12c477712b6cc544b108df4e391cd66e4110849658669a3806866a576850e4e52ba7e88719a43d6c9d96b4a0cd43b0b46101e901d5747fbeedb02c0b30bbd3ac1a32f12183cfce5dba41b91566aaeafcfaa7597f55ce68ff9233fa3030848ba25d711c924db48a895ce9de6c2ea890396c11287ed89972530a485f5062dfca046c96703bec0980a94395ffa477863c61ce30836626da413e100e307b185bcd7fc6645fc982bf419c48edaaded15e3a52845eb89880b254705f00bde9683b2cc081dac131869abf838c75cc99ba790f52d55dbdb390666b635d7a66a9c0e7bbc82cab54cb35f8d143d7d4d7edd4469c83010a9799f4d37ad30962af88f4083bb935e758443afe5fe54caa25e31f217ebf7ea150013f88309c82970ae84882476dab9571e62796bc944787df36ee57d009b16631b50a3d956665ae1dd431f1a87cd6a26dae4f31a929f905c1fb708a4151825e5f86ba69516e404a37865d49fd7c410eb44792839f34d5dc9d6a646bda989ab6166f7a6db314767df3a0462b185d9ce7b09752f0e4fbcfc5345abbb024d9bd28260e87237a2cab45103f5188b78284636af75bb8653dc54ca4c9602cee78dad8c897f85892fbf263cff4e1e62ca5616b5a28e5749634ce2af8158e5400e83d4d8ff818c77efa3c180f898051dd8daa2a56e1c051da218c11867de4529ef3488d48f39f8354949b0e4eb44b90b36361065d7e496397a27e64094168c51991312a221c92814d805ce5c0af5b62ee9b35374e744e6e93d9755ca28b2a65636a3bcccb5b1c901793e1eadb94116642ae021c1a225725451e74ea7c88b83f05a887b993385e678409122cb638d9cacb74769ac27358ecfecf8fb0295aeb4047241f1b882ce900422c75c5d7a64a38fa45415d41b9772a9307163645f80c104ee31e8f90544f32d0592ab459049c076bba657c2f1d63b56091641c8c7ee343e94ae25cbfd26598e092400f45227d80e642aaa97e189f6bf0cd4ab115cc71d0e2ec43cdfa42827ba98a792128bb00ecb6a46c1ec3ca4e2ea656c52eda285d61c9fe3ef745136055711e57e51a42594b9e70d3cc3d3b663548373c076fc952ec8eb8b796eb960b7f0e5e04dbfb2711e4f904e3374f07b864e919230a43f41dfb65a707efedaf1d42c7392afff35029760173d3fd935ebdb754d6e50fb46742af554b2cef2c1f16af05f7f1ac77ac9845420e2224bdb9a7b8dda00237135035a3cabaf022bfc671fcfe4b166bfab601e41a258524bc46e31e4c55f110ae85da4a8b513945093e8bca35f1a371d1042e348ef8e75ac2da804dca5aada9847e756be3cf9f0b573db89c57b890426f4d225260d82c2ec352c0440afaf6b3406c72135c59645b028f796ba38082475b27bfad1682d0d431050be51206663d5b48da5a70402d373248adec1777183f40b8d0f180ee92c854849e48868634e996607dc8f3d01072b277d15a07a113a1250296bf7deed46c42fa16e07e02b32770304a96cc3929ea2d9a8303f5eb3bc549044f17e9c6854209aa626be760c24175766a83e42c9992907814927452694ace1035cc1f3b41446d612f30934a6804b8d35f619f2211314c43200f4982e8b98e8ee83970378d0e7bf6279e198c8545bd69e70aafefd5f5b873cc4d1ab8eedaa21687d0a09bca88f79bab7b35d9c053a147b033a85a93b5b7b4ef41f7a7be8eb3febc626009806669879519c46eb93454cedb4ac5b848dabeb4df34f534db35505a8513a43ae00a41db6661cfbe84b767d62d904a58fa9c118749aa345c21db307d4b2c2ce20a00c9f307f160345e7e9a744b401b1e0ed5468524e4911a373389b1c63c3a93fa7d5d0d8ed6a40eb7ae69b16c9036ccb6f58a88ddbb1cb5ab47589f5fb14c89beb09c128fe6ad67a411ebbb7fb636586a64d8cf5913662761dfa10f95891f9ad0f6dc21e2b410c46a369fff70a3e58d81c519908908602dfa05bc570a82b92986ae4989628571360b3cd4bffa7829ee1aa43aef27227f964f309bfe963a50476dbe093df323481d02e634cb01468c32f653932ff4b124a839455065a9cdc15c51c963be16caa5210725a68fe3f051546420d87ad0d2d7fa413cb0450bf2e55b659ca22ae7cc9c15cc6e10981218208514196002a7464276d7e8aa9496452242fb0bf73da5645010061cb4c78db0b7ac8c92402b09f7606d879b518667770808802734a23f91c9b2d00958967cf4b085a0082469a9a9ea58f73cda11658ca0b80035be02197d95e453ef4bd30645e568ccc9cc1914bf2b944d1aa1aa8320dd84e14c7393be7210903849fdb9657500e1cbe0f90f35a6f8d23931ac30c1173dd11e14f8a9e5545d45f62508b8888db94180cf6696843217c4f2b6508dff0958a156b57bd367c593fb10578e06664c5b1bd86ea8d452507187213d1a9ca8276dedc8be30ba824485fbbaff11de40bb6511565d50cf8e71623b5f229717c7c8693a1441ef92836eeb1a4378b2029a1eefc8f00fc32a810a7624581992159855ebb627f31438e75bba2b033430be03d32ea3d1c8fdf6f02205065f26846045c18558c8b8b0c030bf9f80c80ffe7a9980bf17220851611ea2ca34fbe41db77af42f6e58bd4869c354f524b53393c2b4820d8a0e5eff1d4770bd0052e10abac09bc6c76fcbddf1fa4b2acfa308f9a0e50ca68b61a38739cef87e8b7d4cd70a545b66cb90cea95b5cda0f1b97ce8ff7522b32d307495a89b63b4574d873f0c9e46b0ffaed9081cf6d2b130d1a9066bd913c450e1d1a43cb1dab1fc22d776bc55c1d592a0546895e05889dbef6fe58d107a0ef4fd3a1957a84de85733e6902ec97b3b9a03914348d8fb496bad9090b1a8bf875747bb11cd4e7a4faa68d817c11f0b083c7cd423329d56f2f37b64bd2ecbdd1a5e5d163044d6d85d0dcc6ab6470b7e7d39651f3e71f6764a1242f4511255a5cc52b0c68b78528a037273c84bd8b5d051fc507583bed3481a48946bad02a903f0e2f1465f5a04073bcfbde1b470ede192e3529d77818f77fe0f503ab3ee835a3817b15d3016237b62ae9f3f0c29d3f72ae173ff24f7490f27b6b572dbf12d792032a966bf81b5fbb79dedee825a9f449224e2f62f50c62496ff1e4ee39492327f0d1861afbdb1b18c10224a1c9718dc9dc9ec06ef0ef9c4bc1318a283b8ce8c3f6b9852f4b41e775e6bcb117a80376ac3c24e977d8c44d9d3eaffcefc3b390ce29847ef0c56a8cfa65ca21ae72bc509add6131449f4b2f111cf53c0e80e090818ae328af6b54e3a69fe59084f33cc76937997e2937f413b680c4fad4fd3fc5da9a287f791f703d52ead3e3a7bc4820a9bc2a2c6fd9de72213c011c4967d8c0c9831cc847f83d01896846798e7f6676a0edad35de218505d4f7cf10b7d617b083c871e7c99820eaf124d973a9163215a2ce8fc8f5712404ed1e31d3c8146504280268d2c032c8c0601c99d1c9d91fdd7eba94c27fb4f1f274cf57f0bcce38cb3d62b9f8a23104b65f9aad2f8fe8bba17b15bef9f87fe8092c8a18075009db11acd31c39c77adb840bb3e8b2d6c8cebb7bb2fa8ba82a40f2f146ba475c66aa52bb26df05b2bbb1854029b83dd7f3a700d73160b532a2b4866ff2c2d653fb8e7683fde0834935bbc5bcc89960d32a4e31aa32f0402f04284e66bbae7854f2ab32d4124115b5e791cc9f14fce0c2558a87461a973f4ffce6ecf16f0dd7f18b3732213defc9240ed6141b45a3d150c58c696b0c0824429d85025c86dffeac5237218d3d5e26356da2dc4b6eb4e98f8a0d51f714db22bd429911538237cc64b812db2fe7cdd2d6defa0d3e24f56a8ae7463a1ff14c09bf65f6f2d5bfc1f0f1dad60c0ca3748ba5af8c72951d5973dd610a01c12d53288077552c18bf142d58f4ceee5cb9d37de268b214f0f80176751b8608e00d91d5e578feb8bd40f7a4e48220fe71e48f5dc28580f5b7a5582ee86eadbcabd22986b6ce5de5a1d861b6e438042f5e4dfb3bb595317613b1336f31df16622a522b7a137a76c421334cd3ff5db7316fb0e5c4d98b52ec268b13d87c69a51c0a4a6b1137538870308483c61738273e818a14c192f7736d841538603824c0c198ec926d22298a3170d9f3412caa6c4ba1e7ef58988dc67d48272bb75b97a6d93f24e35dc5be3d7b072d43f44c1f819c3f79f555575112483136f0e40a75b9080d9bf194525a75499c939a1f8f84b38f40a63974852dc3b0b7126c3266fd1cc5724ac959d568fc48b32699ab5193d7815300e0ead15af59371d078555682b77f09d20e39ac1813e50090ecc94364447c4762ae82f6e10c220c941b8a40d5a3d6c8a7816777965294d39d9adbc512261ef3fd18fbbc80ca63abf4888aa3cb93d12b8af9b8d055778d14af371f6e170b7d1c499be170a36da4eeb5d926df90abf67427f7c0f0fe77ccab649583917c0a97073eb2d72b170e40c5f46e5ac468af18ef03bfc193995f2b8a50069bcc2f1b593ca066f4353f954e78e2ea614153cccbb386147a06891f93057334f0b04bbb277780739b7b8b85f28ad4bcb1a6f1c77134618baca76785c2d59a933b9aaf81343aaf6c619d61dbe622cdd975cb6c24bf096c7b4c50314a0f5065ec00bc40c96457a643a88cb254810d46d1f699ca1f0a01de399fdc5e234c5ecc83dcd040fbf800927c5b205b45a8c1b774e2ce69ade35e9cfd2d05833dba10c7bbc2ba47061111aa6a2792450386f26db51237914e24dbb3041a210373580038343bc78474c010d15338d1e12c58a703e08e153caad18071d2453c8676cb86c87c970cf06ec0cf33465c0b9323877c86b47d27ced1e43d6230fd0bb3aff78939d359f9923ff972f5a701631fbc585cea2736e16e7264da4a7f860c05cd29c9847e2e2ef6f4d4fb304563b7b9cbb15fc24baddd3dc524cc2951368e7ad400c63ea17f5c065e0e8133a54525672f85481d5d119b11c0fc1397a38274b8553e01b511b690da77be813c093e8f5ac24d9f383d8e4aa85ad060c9b41dea541d4255ff89f0e00e6cdfb393c9537d4c4ff08da074e955a4376e9a63ab46e13cfe44b458e15d6fdb31abe7c11984cbe08e4111b02012a9f017076a514641cc78e23b405e34ca1b1c34b95a61382826f7353f084fd4cbe442f87032071c1d617f897dd17e70b80eb81879f278d388c20899d62662cd67ce189356b47bf392cb56dc206328abf73d24f8e8fb37da490fbcca12ff508f868064fcfc3161427670d7d7100e10c40e0c6d097a51b4c35077825cf8ff71496b530c41e3c281cd3ee10fefc50a12f126559aed4f138db27de336836ac1c86bef2bc48f67cffd4d88ec4fa9ec3ad495f2631966a9891a42fadb13f93be58941e3b98a279eae5ff147a4ae90b8fce0da26d0de1af28e1d25914d0c34e6050df3f985cb3e33e358cb67fd2f517fb70a68944a65f8a416d164d941891204c8466d535d22c41068d09ed3bcc3391f15081e8c702805c66d59871665fa2b9152ba76b589dc2ec4b9453f52e4953066119bebf856c695186b004fe37d4fd470c25b6b8461566d01d320e2e98629a25346537143fd802a4e18a2ceda289edb2641cc1205e7fae9e4f1f7d5910d03ece97c89eb862a73fdb0c8fa5dbfcc2c453f8229d5af04451e7606b8bac31a2e0c8288d1f126faa8bc36c9b0bfd35c9384e5efe0f91b8075025f3478474c2143563f7a58284bfcb302c19e180e4e8bda00d8eeccd23e05509f16cafd198b9058c182ce7824a9e0dd152d380afa2f532988fc4259f0d890acf466da43ec737720d7b3a0a3ebaa383a858eb59ffa3a3d0d3d63fbf10a9ae221156169fdd5a18e1462b77d75065ff15af08c0e6765d2cdfe6ff109582b83b5c9742c05bcacb175bf9afca3233d626e2b23cacd0a24fee579f481028ba02fcac4acc546ea0843269b04059055a405fbc2b1389b0a23acfc2742ac289fc749c47f81b7f05817b89a5da3371562ae27460b7bfc5a2cd0c739c9380df696c925963ce44227f38826f39fd0ae3e3077cfafd21ade6c17c80c32af9b2d3d5ce030461cd1611d1796d735f7338bdcd0400cbd0ee52a216f6c7ea4f7cc3090bb92263261d91a827f2b24c8b2f50863705c4958ca54219a25e0d09d976a5b441878dfc084f8e948a124adcbd5d51a948cb4a2f62efa6762bacf25bb52854cff2e84cf61e62d466d3a01d1b8ea71e716c52eca1298823bd9fc1839f6304a7266dd3b393fc62e8b9f58d50262344f14c6fb3baa465e1baaf80a03ccd73fe3c7bb7891d871f751588ef98a620934be1797b11846f8aea9a7283e25a35708b40ab2159112cae34dce999c67a01476000c63d67148fb3e56a38b3aa20859eaff473fa97c1d4acf9751d392aae5f18da153730ef62705ac899ba9e2c8b10db34bf286a66b2a92b38df4d49402e8032d95a11db8f940448b038f9e10c59951cd1be9ddee9299ed9d410bcb89ea0db3a285d899d3919f7fdea294de406ae6bed7de08b092c611f4437739d32d303d1c92115dc56c1bc0a2a7c037fa9e6653553c55f3a4cd56c5c6c32d216722e8d2b14d6ca659da02fc5b2b99c4efd4bae68482fd31c35aa9c5b33308121c280022338fcb56ae448d4d79597e83976af84315bc2088a2f800283a08206de247b2618c83f28c78c3b8304633fdcf6c8654353c10a06813a1837a8190e8c42b5494b737f4a4fc09386dd00a2a5615bb79eb97065428154888578cacb13a0e6a1c41093cc83700a572721eebc7dda4d0fe7f1fd57140126b82f5f6d19a6f7feed96ea28e0ee3fafe22584cf8a55b208916c42847c484fe8db6613aea2ea17bcf27cc1a7551f5902fe3f330753c1b924034b301088833c3168a17fab25c98ab9e5d90bec3a5200ca60bd599691fb3ac05ce8bb3d0ff428ae21fa8716bc13d087f8048643df861d42893add3dc86a8dd79e63577af386caa63a6cf28035adf270c6e21269707d6848828cadb0cf6962939905f0e1fb17b4f09f96447aa92f0acc1d04de9e45b7104210a0b5491b0392651886e135195316beefa3c9829bc78f1a21bd91d645acdb4aaedcb42c4cb1dab8c0473e20a3e09b6fd8767777f7de210c3cad2a0c2d2cb5ffbf911e140d103a0fa12ef0e72febc110425dea5260445106140d8822ccd17842f52b6a63f9ca8743dd8b93238a48186081c20e0b5000490210f009359cc573c388a28c27381f4e3e00ee70c0e87470e0cfb4114524553c904e07471491a0441689013ea11c452405c09c28ca7ce2faea7ea895ebe2882212027cc7725e3ea11d1f8a05ff87931f7fbc88229201445144228047453449a6881d45995104206a2ec6ab0ac757cfa3c36861b8305e18308c18860c63861145240058f9eb3b8fffb242d5f5f1a2d309ede8584e8f8b62e958bf2816dca1783c199c2147fc878e282239b92a0a44551f2f3c1cefac502d47fc87f5bfe3a258de08c7fa502d51940105c8ab96b73abe037f42d48e8b62798fb37cc772ae4f0fdc095160bc908ebf0e8ae5fa1f17c562fdef2872291f1c4ff541a8cdfdf8c78bef58a73c370cfcf1228a32a188be639d622972fd1a62e1ff7ba446118949e6132425995190904451a60d924c149144511465469111c5cac70bfc5194094506145194f944a7136289a28c27ac28ca74e24371a228c3092a7f7a589bc8680287aa162a6732d1c60108908900b4118a363a81d2461b5145bdc73f5194c1c425a22863894a4451861293b8ff05fe17436de0c811ada0062cc0841992c84c22f387cc1a63b844232213405ca20c0044e20334b0441da2289a22003a2cd1228a4a14020d946823120209241c218ad0a0810c64506d71717ee4a8fef3e1481e681206a4cf772c89495a5440fa7c07a24c22c5481b5a68e20a55c8410433761024fa22fa004a244011456207d8bf820424a2a81951d1802c48080105123680c4912b2415e986a46205182d30d40ac89aa1cbaffb5f581c100e8b03f24f07e4e13c222652c3119c88b8d8c2115494c5f54330f569c4231a3124d2582dd70ff90102461c218a18214564842164c678f970703003ebab4c8c224a90e11c02f457e520aae5f3202014cb7b45e5970fe7067e2394678a29a698828a8fe790a6ebad98abe260e92bea7ec8254ac28188341c011126871880120c81832832848f288a308082141e1422091a17b4204a010a5008d146e49765884104a210298360517444108988228b4309620a0208d111fc71ab9a0a00f39f1312a8e053821b37b4d8420be98a239863c595df878a900ac895df872449d2a70428908e608ee65ff06b3ae186369c80c1065a64c18120267df84303fc90083f581145d82898962fe29d1c97f52f5e74fc877c15c4c29fd08e98ce078827e4e17c383f60a8cee77832a86a07ee503c56be631d7f1e74a456bfb980780e2141289695988fffa0a8960fc5f18f17f829968ba28408a93ec67d502c6ee15b2be7ea847e5cd4a7e397f2d1e36f15a286c45c9c2fbca0587cac54d87360cf61bd10ab6eae8a930307f61cdff16bc88eebf39e180fd2e9f84accc5b93e21e9e357c0501d89a2ae8e5b2b24eb3fc73848a22e8ef54f8faf4257287f15baac74551c2b7d5cfa58be39f2d3c7fdad77704cd8032f1c0b0f2588a24c20a228038828cafc2142c1c3f3431465f81045993d4451460f79e8b81895488f211a1d5507901596aad1541f5ee800f24313068e1f958a4a87a2ec5ffee220aa02f930f22f1faab3c58bb704f9509c8ae254a08f179f2f42b57c2784a91f33b485e7af1e59dcffc27aa13ab8c77f382f9f6a85accf5b1f6ac50e1e5d61451445911851e7ab0c14ea00b2aa29c66a2ccb415bd0c2f5f10fc7c3a9aec5c19227f479cb63398c45f1a843042c90e597ebb03a7e79ee50948df122d416d28d2cfc724c070444117eda10b6ca7a30be3944504c4bcc77415da098ea36f7a1133808885bf8bea5a91ea4a2e21a907539d77b3617a7c2e105553d91981c1f8a63718c7074341792030180ac4451e6073e88a24e55d54b753a38e240023894010e56446f4823b286bc7c3896c5f91145991e98d143066f606e684114455101dc9006ab9a3697833a1073f1c00cebb24242a497b7a4cd854345258a2e5099c80a44275b3849a30d91684391680d6d446bf0081b8f0098580f8ab9346a68841a1a114547981aca504304d410455114e419515119430f268f6895780309388041243bc480824be041015ab8c0610f8220a3085a3022132060e30747f88112c8c0918138084248c914a63130019c400e8ac8420754a8a86844198ca0062904200d9460c18f01fc811264c0c416422c3302a145358432367125366e80dc00830a571ad1e8e0b93860091e23d0010035586c9c9ce04616b09009074809689199c3196a78021a607ce07383178cc2878b1a29b09730e3e44261ae81002238a1044920c0185b504073060c6227cc90070af0c11301861d3ce1030cdc28002801286c068a08041d4a582065e2c9e0bc5831de790c43e10e455d8dc613fa60aab9d0190c1045517366b801eef1985a5151c9a081c2061b1860238c288ad8d0c1c605242db290241597970fe7c3718fe56e04ffcaf5432e8e87e363a50c6344515486024451d48108850c6788a2a84351b622430ba2a8bae22b2bc8a00029e618784451f455e8f2cf928bf509698c1471e958ff3cfe38a7c222e68b44b2a737312c5ea8ce0d32358850c620d180c81a5c6893eb8961f181a12abbb17cb386195284b2060c22ab9a9c11cf3da2114322ac2086322649a5a2aaaa4a15c8218614482a6218c2e38618ac88241521408408a952052a5081064428614044180e11863684818d68a3b9d10149057fd5014b23ddd084010d490b2db488a2cc0ac22046187844924a14653e60780318c80086264411073f1860000610181e0c20b842d3712b2449e53af2372495eaa58df4e14852d572031898408b08e50b5f88a8eac9f88e94391b2baa22c2118a1740f105972862ce044dfaf877623c9507b1aae9c2c961711f53178b988b5339a82463c284c8137aa91cc50b3188222fe0288abcc023f2028b345e480028a242446ab4218ad4c042a4c60fa22852e348a4c6468d206acc288ad448893217e80217dce356a8081656179a107581045d004134c55c204ff539872cf55109813e1c097b8e2812830868648ebccb721f255c90b4d042aa423774851545288dc599aeb0a4145ca1916e5856642005d20d2b62be8826c66a36b7f2b734530991ebf34370e5d7e2e8c0b1630b524c62b8a8a8b89040fa1f224d2e2e9d9075251cd2f41faa45c725fde6f238b512c6e78d5430930bfe7808067fde92ae8f912eea53b9175fbd14e487101ed2244dd4fd7024eb4a1607bf11b724fc71a73a9682b19464b9e555e72b0fc5b1fef32fd62d4ec72f6b7a995eba916f589c2abb74bdb5e148d6c7dfd3f1ea3dbf01551c8fe41fce95f0df10a62ad025868b0b0924fc718b73c3c21505f3e9214d6ee1cf078734712e65592e491f901e0c697a4e75712cce460c171712c0fce73bf7fa7ce8046f5d7e399f90e548f8e316c8925424ea5662541d4056545460a84f114da7f33024108304d2732a98ea8d500f23ddc0827ab1de08e7c5251cd2843bcfc9dec38b981cf883bc707250540bc78de0b8a82117c542b1e08f172a48810f1c2d2c4088f41002848714456b44191490114591cb0f2f5834950b1c4386d41f1a1d42708011c40b4d18387eb8a4e184368e583aeae0842c2af0e148992399984c18509a5083e8f396f51a04a030e1132e2e124ca68d3c30014751e452260e4c601bcb47b084362c184be082089670e9e8b1049337c24151421bdcc3a2841f49b044f4790bbf75718e50452a0ae6c27f2b2a7faa37f230140f69facbb9ae5720e9c3c9949483f30346490b2907a78b963620158151fa38e5b934f0a160244fc8b2dcc3b9ac10fecaaf8a02793892c57926882d5d2e813ca13160a8ce5b8b53044689922c8ef4f98e4f16b0c06f242ca44e28bf7c381f7f8f447d1c46aaa80c728f4bf546a817bf3e7f7d0323c5e417c7382223f008453d887480061a688481868f2391553da7aadc16a1072845884111ae227411492a17077f7535372415e986a4627d280e47bae1a1aa1d17e7723aa0231586ea7470148104e58c449cc18433d0885c5c8c482e2e40a4e98a0d6cc00ac9922c69075fa04412ce3884067fded2503864bd46735dff7c44b20611d0a0aecf181f8ec72b0749e79a63c5581bcb790c010e039002258d9608250d9708258d13442869a8204249e38c08250d2e44286984214249630e51340004440ff8712342f93123941f5c44283f8844283f6022941f3c882236d04006122f8cf130d6570f06891648a490e144d1f416d5b9d291eb43d7c72b7f91241045813105155fed98820acb612af76ceee7ed274b1d4f01be11654a324332592c40127fc8c1093238fa11455ca8a8a844516613459997288a4c32d9c80fa01059d5f483eb39d595afc7bffa0108222a42f1811bac6a6a465454507ac046332251d7271405cf133e1c2554657411a1f0008d48baf1e1648962b141c725ea25f382cce3680c330a11fdfd507eb90e120164a4306365e5b2281edf0171aa166a05e6593e14e731b572fd10ccd1817be8b03696f300792a1e5690e6bca05ab01bf9ce0b0982c100792a1e8f3955f54680803c370cfc791f56a783037ffc7e42d4e783a36359eee3c8aba870aa2b073722a9964186080785c0c12070f0862802f96f543298c041cbcd58323856c7432778e92d191c8baa9e0c29c672f0091d6e70997103074837b2a8a81515152a54543496e6f31873361a0ec83520cbea747ce51ed9220b1515ea92846834534565e9f20e2764afe42b9215f35d4c1c900f91349ae941311c9060bc9a2ea76343a0ea03c7ca5f7e3f96e432f315729130e72dc78884dfa240475e8af922157559bf798b92361707c67aeb2dc9f1bfc501e10003c8c401b9547d918a82d1e44c15b1fcca798834559fabbff287e2e07f79f1968963591dd05b29c63d6e713e14c87271b9ac0fc75f5cb2fe43591d8e5f8fa54fe5df91a84bea5014e8a52357ccc5e9b8a6c8fdcd8a644dd41553b991cbabff3c17d30e69e2e05087637da873271c96cb0f171717eab22489ba24315c2c1595dcf9212e2490def2429a2a8ee4e2225d3eb99429bfdef315b5320d9162aa37f21c90bb7c45ad4cd24f9610c9738f68385c786e182b54fef488a20c18992f325e4451a6258a324332991fa4a00ccbd182b204227cf088288a3238800405aea84eb298421445243eea071481030de060135114952860077598841086b0c61da22892e20c2070229307155180208a229244648207290085101021a3283229820b0088b081c31884883ed475853a2f2531d84202f90e14fc208a324202c07a6a2cee1be974dc63654490096284288a9690d98027f4d15821cd161bcb79786e181bcb3727f0601432a0104593747dde226303029111804ac28f12d386097ff530921563468c6f5a62785492f41e2a468a701ca94414512c284792708447f409559883258bdab4a01c0940144d38a6c3a158601c11459108221498214c9f50a7c381b138160433a3970fc7ba3896b3a12a9014d309021345578b912c4493f41dce06078a110c180940280b282198288a844428210c5c7588a268b23a1d1c93f421fc9b7b813c7f5d1ed301812896095bbef9843c5fdd075921ebf3373cf798f07ffeede59b2b622aff70ac15d2bfb88713e4ca28d704ac47586db08e58614412875381a80a04f21bd7fd9c5f7accb124972c1c2e2ed25be9b2429e0b8623fdbdae1f79094bd5262a38545615816a01272043144dd6e4a9a85c3d488ae9743c745dce0d972cdff8fd708648132773aa37823f6e6940dac0bc78274b1fff0e655d6f49d55fef7171917ed332557f79073fa70302852c1797a86b63f946f398ba1d8ab291905cfc727c3d27af44510648146558a228f3238a323ea228d3451465421045991e5194e11145192ea228b323a3238a322b5194c91145191c990f4451668b28ca681145992c322a5194a15194995194915194895194815194795194715194695194e928cab028ca74208a32531465b088a2cc8d28ca7020b30110a88c68fa2ad4e178ce145581240b7289369647911844a8348891d94024e11e40503e898832f53103cac78c2812a304d28df750f70a511f980f18911825903047224109a61f2b61488fffe385a70b31768a29a6a002ff4502e9372d534c3105151e184d31c514544c534c3105155774c0c2c2ea4007ac4b612c3e1cf77480e24c937529dc810ea858a0ebda582186259140f25097155a99628a29a8e8f4218a3a1d5fe924c18773bef8bc70be7a23d410ab9a3445f21045d55ba1ea41a121168e2236402992a78aaaaab72c07c5586a888b8b74fd9009732c87d9a2b95016d727447d2e0ecced7438b6fa2030ff89a268254219030f286324218a2617c698066a369657978b545159c214f522e1905cfc721d1bcbab16174e0523c55809658c2ec61840d4c11ccd87aa42d8e53d9c4b93bf72913470431e0986da5c2190875ae1e40185a3060e0ca2688ab19d8e039936d75faaa8fc2f6e85ac7771e978cbc6f20d565169a9a8aaaa54fef4a844b4a94348c5659384984e2794bf836373248a706c824451147d360ce45f4996c37c70a0bcd4e1b1445dbf69417931237a2bf9cd528e08e5c5a1644e445134b95494e452fde6e2d4eb7a7549390fd98ce93ec8f2789ed14b15aa407fbf92a8eac9c0e2437d24af7ed382f290b8926f30e7724243b688f92e5e0c6d11f35dc47c91c7d46d2e84f2a08be3f92d2294b7228a2690ff46b23420c574ace72d0b877d30503e8a503016a26872794c5d174b8af95018971145d1f498ba30ff1982c7d070214814b95cd156007191b098242c3e9454c47fe01b5134650a488472d788a2882542b99f288a221d11cadd4034c574fef22a74afc358315fc4862c49a22ee9a22821319dafa40743dac00636b081e9f346382fd26fae982f22b9e5f98bd3e970baa85bb4fcfd501fab7acc31425520bf1c5f4ece21cbaade13b23ed4b5aaa9035878ee910fc5b12c15958ad278ee11cb00074524a9e00fa7887443529154aeea8d7cee11cf3d8281a8a86c2ce7b1b17c8bdff02872a94e8e2116478718cd89c19ae481192201eee1f2124554fe70a8ace1421499ec30a9261f6840149978c0a4a5a0680240f221f1488a2768408a0e4801c6f4f2a12a18e9fa3cccf51e6a883459366449d447dadc8f5739a410430a3338a0d0bd949439d2f5167e2b348192039860e20a2b3416e7e5c3b92cce91af801820883c8f1b5171cfc8a23fcb4d696bce889a7384595e2addb53ef3222ab3f9cde92e2d75ecdf54447dec695f9b199bdee89489a83e237b98be765bb66c4644d4e67ebee7ec4d6ffb7e880ad9534c7fe6771df13444cd335e1a1bbeb635731216a266db72f7f5ecb0b35212a2b288a76cc7f0cbb1d9d883a817be8bafe576125f8905519db66ff3de089d7f8e6c237b7371609e6cea3a10d5c5785bc7e9163228015165c7e7594a9633be8dd2f987fa6c938e734f873b5bdbfc50a58b39b7cbdc1db3b3bd8decd83f327da8f8d24b1dfe8ccd352b23cdf0a15ac9dabe3b2974534ec936b235f83f3094063bd599a6eb5fa629a5850b4ed592b2d25f4cd334591c6511327ba88e650aad8cd0dfb69cdf57218bea5ccd6c9adf5cbfa090a6084575644b69e1224504292b293e525a7ca4503d5447277eaded63ddecc19b872a598b9ee933f6d0e2cb36b253b00ca578381b6b3292626528853d22193c54f671b688df4dec6fceb991dde9f87d9f1dad3377a871428f2ee67fd979bc6d87dad05e8add51ea9ee79937b229757d7ab478a86ac77dd0906992ae0a993a54dc9a3176b3c5f9bde6ad05ca1664e850f36b395ef60ebe975d861bd99fefdc37a2c1b4e16c16229a1d9939e019ddcbe8cd316f0ebbdf5c5f794ed5324d292b31dfc5c6721e2b29d3344d3974fc88a928cf7b20742548c8c821b66ee9186dfd1a9472bed994b9b7372183d7624875908943f539a5b372b2cc2684f6e150df73ac51f70db68f8cde696233c8bca1b6d6a26c4bbf257e93764a0b1729d3344d1acd14270b118d918c1b2a8ed9696417672b63b66d23fbc9e07477cb36547c3165d121a5964267ef3955cbb322c38626996ce7d88493d29e13baf793e59b3f7a9496b57cd505729ccc1aaab46f62776f36c7f28c2fa3866a296e56627b1d6698594c83b58eb577cd356568a84fbd3d65d02df599a56f64c7c7140b656db16421a2c92273864a67663363382986cede99a14a4ba9cbb6d6d906dd59d74e9061a3367c9836d65ab496cebe4e059932543ba5734b3bd36ba3a58d0cd5bd8fb6dd4d7a1f6dcc8ea1e2d93e366cffe69cb3798d3a19b4ed5939b3940f4bb8914d332ec888a1b689e18df141778edbc74646260c153a3ce995f0e73ff8765a60a816b29e96413823fce7f60bf5616b0ffd5afcb1658abd50fdde26e763f9af6cfd7323bb63326a54c8a67ccd2db4fd9859b991ed5090e9428db6e96b0d3b96f4297347325ca8ed9bdf7c336b17b175bd91dd8dca6ca1ce1c5963b739c5f4592dd496ee19b6e7104eea7d37b261b33259a84e62175d939e5f42dc1485852addc5b25d46179b739a37b2675fa1b2fb6c66ecdf65574afb1bd9d493b1429d0ec367319cedbd54a1de091fbb90fa8ced1eb3561c2343856ae7b39b1fc3ce608b4dbfb2a88dec229929d4f9f9cdb7ac5fa459fae5b8bd7edd8e8588a6ca48a176c337a39d737e37ccad63d194162e525a2a1cadef27c67a2a992854d657669fb251d64c628742bd34377ed6a87cb2312cd3a831339cdf3a865f7b17b227d4768fd1785b83d3f97c6c237bb62d324ea8f4d979617bf9d0bdd1db8439a98371c2a62f42c8643f08db21feceeddffdf64646d8784c534a8b8f696af9820c13aa8c37beff1c19cd8fb1b9912da1632d360b114d27b3844adf8db0676efd6073d96d64cf30649450d965edca182fbc165f0b37b2af7f713c72e8d858ce639a2cd66c2cdfaca4aca4f04859491992d2e223a5e6784ed5324d53b310d164ba904942edbff9dad896e27831961bd954fed020425272a4aca4e04809e223659aac0ec8c3811ad62c4434a10c12aac479b646db9f94d9c5b891fd3c9e1e6de22173847a67cc92c6674f5e27ffab4bd3dda302f2a09896d731a3878c112aa3d9b1fb1cb277e7c4be91fdf2e15855e87ef5e1c4fe175cfd7daca47c91b292d245ca4aca15fa314dd517a9dc935fc8638a659aa689757b4c7d1eec2641238346f5669fb4f0b5ce8ecec723c814a1c2cbaebcf19964cfc9f96754676ddf6799ebfb4f31254275b6c5e8173ed62ecd390ea15acbac73d7ef9d8f619985501f85b9398b5f63b7edd946f687a3f9cb3b082fd29e6e3ac81a952dc22861cb676eb3737fefe6d8192054781b474ba1ccaeaf75f707955186e97b7fef10cbee17598868c4c8f8804d8f30d38973c351bad9836673de1bd963a7d8c5e692e1418dded9b2b7d9c2fcb0b98c19b5618bfe2cb34f617433bf98d941c590b2e618327aad5fb7a1869ed1c1e79cdd7cdc3833c66edbc87e51f6c8e4a0bac86e8cedce5de83cdec939f23caa87a17c98205346cdd9a59cec42d78d69cc5e4c13553d191fea334d9ed027b210d1d80c0e6a338b336419cace33670b5fe606954dc7a86c2fe76b8eb64b3336a88cd2b6123a1cf38477fec7553fa4ba8674cbeab21ccdd4a03ef60cd973ef6063745a8fe6f31dd93120eac2c63094d29262612885b6cfd0a0be462f8c9f1f5ef8513eb89299419534cb0bdf6d6b1f23750d04191954d7dab139d99df9b94999ccc4a03e94ce5a991b47fcf9972303833a6167da703f49637c6937b2af4a43b9c8bca05adba0cc8f629c9fb48f3fdfb92abfac0675645c501d3336afcbcef97df9da4c0b2acc99e64bdd9d31bff6d6372ca892b9979d66d9d3cdd9e178eceab256503fca97997ceddedfeedb488dc5694d5550637e79ba96527abc11bb8dec883feff90dc8ab17d8ad65085250a59c37e66c9d43ea3ec2eab2584541b597fa6c87d96d99f57787a22c0f32eab4f3492bdfcdf8d2ffc298cab2f5fc93e229bbc5dbde916a1f7a9b2d4667f72d7c072b4c65fe9ece86edce3e4863fb0e2874c16aa4b6f71067eae6bfcd0eb615aa96bdd8aef4db11daffdfc8d6388d26b6abe61b9f6d3d9bfae76f72231b3bc84d56b5d962271d9d8f36773a37b25b55e7bd39bbebd8d9e6967423dba2f06b585d563c41c550da09af7bff9e614bbd0055f98c3a6cdb3317e7740c0caa3a86e57d94e69fcf59fed48e37531a5b8410c7dbb0a7e6666f9410df09df6ccec1e8d497cfc6d6f8bdc7d8bb37b23b5ebdbc835a577fd159a4fdb3e3eb6fdbb416b68decd93aa4b93c79ee1883b1fc226b691b67d936b25f0c69deaa1cf4da13fab81f1ce831cefbf06d0b2feebc910dabff7c7ab46c6ab6cfdc64ee77c6e89afc0e28d4c25eaaeb3c2da3dd246c8919ddc88643bae7e5c92e8b5c65b313ba4725c617e29b37b2f16b5e4748bfbef8a847c6a2a4dfb0c3813dc88c2c44342fb83e85b75d6ffa307c769bebf81575dbad13c688bfb5bd13b7bfc641210b114d18f659cbb8df4ffb1147dc1e0b118d8bd7f62dda6821bcacb1492df5800bb5d43674eed2a5cb2c9afab8b16c6ff46fdc209c1bd99609aa85ccc298a3cdfdf2bfbc918d1d14a3beec69b383d0b1fdf976231bde2841757de5b78bf1cb6933cef8c381f984a88f6636092a74cc7d9e5752e8e2cd9411a9f9e2e7e284f7276c8ff61841a5985d9a9bc9e7117e739087e36c1835dac6f83136e19bac1b8251198bec9bcd91b66789f1ebf1458d0fdf7db6ed9f654c768c77401687ca9f1e97f3f120d324598868b217d599b317bbbf0c36ceee2f1f4e11ca5a6a8c36df4bdd9cee51f9acebd886d43931664fbe85dfd4d2eba2909a1f6eb2cdec2666f9ba69ea74feb2c84244330211549be9750eadcf07dba46e231b73340f8ab9644a0b1729311f1cd314f3f196e85888686a906a1fbe4fbf317dd8358c1bd9f0f2e40c00a97f2f7c8c27c612fe7ddf1c2b014b65ac3988bb49875dcbdb47708f978f0b99a669b24094a6250b110dfee11c835352f73a52075d6c145ed79c9cb2297e6dc6dec8aefeeab1324df83920ea4e9355fd0572ecd354fdc5d92124a5b1ae2e5066093eea7497b5cb985fbb9462b891fdf743693a1dbff4ef07c867479c168852e9a2ca76fbb8c987f2bf4dcf2f44c697907d0c2f4f76a010d4fba27b2e539cef948ede8dec0bf460cc42d918b3fcae4b263b043cdc62f936cb467bc21cef46b66b1f5c44071bb6f6d8ac65f1ded6c50e27e99530e36b5d730ba9908ab38d32b29fd8e56dba918da9161d1766876fc62f2766ff30a686acd06e676fbf9cd031391d1b92a3d2a70de5a42d46f7e66b1bd91d9087a3c15ff9c69a1247f4f9d47694d0cea7f6b5e605082a8e0cbb4c23b58e3d797d63c98e1f78feee9f4b395b669636e5a12a50b7962d2ab6af3373cf7d19762e6f6483a80a37d3a2cee8f45aa791bd0be97d231aea72ddb2a8d9bd5fd7b941da3fdd87ea5ccde55c7e59addb03f59b6ded7a37eb99e20737b23d5495df34dd3792d2e223c543553ba629c7345116221a3254aa73b8b343d81a7bcf7a6f64cf1c14bf66f67ecc6c628a2dddc8699a2607ab0b748229dd9cdd1d613b28a78cd3f57cd827a5dfd867bf161d191c2b5451f925645f4707e4e134e8097ddce5c94764c593da28e7b3f762c928dec89e325698ddd236e933265b4fbb916d7960fe03fb2b6aa5f22f6c7b1d5988683e00ebfd8f2d3a64d9b17d90e64cd157217ed3c6dce09472e2f836b235ae63ecfb467ab83aedc5143f89a784af5db791ad691d2f4f76b179284ad3c195463345578fd3b98bbd3d8a2773b9917d551304ac422c9d9cf95bbe0d9dcf8d6c8d9c1da871c6f83a338c27cbf8fd46f66c39550c7b3ad8f9753bbff76d64c350d58ba61b16b5ed63ea31d3b6f227831bd9d565dda8d63576237d5636cb9ebb8deccb93a9171ca83443cb5cbe135e3ba3941bd9f8e31a0a779323d84095383febd962dcd32d7c1bd91b2b04d25454d6441c292b292d292d3e52ee7f01e342684bc84244e3e38a9af164fd3c765367d6ed4676e59bab617f712a30a6e9f2e469fa8aba968391c25a28e50a79340cb210d18061058d52460a197c8d4d17a773b2278f914e67aaf7357c704ecb5eb3b0b58dec94162e5266286587909494161f299a0f4703a22a2c5b7581dc57d47d2c443460684063852a8de60119d000061c9072810d5800fb570fa8c004240750200213b8381e0f6585042c1001084020020fc0bf0107b40648062c4001adf92a6b2aeaf20824e0450920600207a862b646690b1840020588000106e000014854b405a6702c00960600d02e8a92e2e486496bfe4503256d6d80a469329101d620001fd490798f7f4c08c0874f0c4000511acee8038e288a482cd00636ac410d6940c319ccc04619c8308635c41006307cc10b6a74810b59c08215aa40852948210a5048e3094e68021396a084244451e68c31dc8850c6804614455e528600a23408210e38a22a044044a39122aa828a4050910735a24852f1505596aacf9a2aa8285205153f346f63dca3a9820a2aa69004b581b94294e6e35745a58a290450c51453a822006d4492ca653d966e58d5d401cde51b980b2603511455118008445154852eb78af8a5e9bc58d544a201924a44114906aa0080194aa8428a51906080a4021149ca05a2481313b2559c7ca18a132a445188ca9ad750d425dd8822920a9050e03dd4902a4cfa104529559870514554872a2234465188e6f08b24112081006b31fff7e397f5e94132001205c47c171ddce16c56623a1f205144f280ab72501491380073aa50274814919474dc521d2efe72a82faceaade77f7ca81d97e5efe3c2e1a13e8f3dd487025155908f6f5abea27e5c1c01545f84f3a17e4451a68ddaf1cbf96ceeb7bc11cecbfbe838e7727028046f7d3ebf8e0ae388a942967fd5c2454c8e28ca8c22aade16a9a81d3139dce3561837f7ac378b38da9f218fe6955ca2321b3f3a65efb1269dc51acb595b38588868545062897a7bd2d88ec2ecf23fec4a2a519d6cee5176d99c8e45cf4b98124ad40ba38b91be7df45e39891afbde2631b40d3696349648a2be261b538a9db3497dda96d08f48407865d39b1d6db2fd9740a2c6ced0ca6ed81c9c2ccaf988fc3fe3ffb3dbdac35e468923ea5b2a31c41d258eccdd95941c3aac9246d4069dc2fe9e133fccdf1bd98cb210d16051c2881a656bd4516c1f9599fd6b1651a985f1b33bcdd6398eae883a6533d95a84b3fbe64454b7d8db934f1d7cc9ac4344edd617d3db6c74dd1c64dd62c921eaa3304ec7cd42eb937536449d2f197d975efa90deecfcea3c86fd9cea622585a8315fe8ffefb1619a7f12a24e6829b30f53185b777e1bd99a4fd6782c87d168a8cbe52819447d8fa7cd4e52fc7cd28f928588e69608a2ba6b33d2a7ed8e2f747823bbd371d9381e8e8fcd057a1c5988688e9404a266d9f4a3753f1b6c0cfbf382ba3e3d829400c26f74ae1d8554bee65ae2bf0e1a12f35dc87e8228f943b7375b8eadfdb42de72bf1436513cbdb30678a67fb0b37b25f75818694f4a13eb7ccfe8dad59f3a676231b8651c2876aed73cf54fad3eb62c7699a260b07257ba8d231c8626e3f9b3b27a71e2abdf85e275fa3f36147651eeaa5f63ed8726eb7cfe2a13e6417b7fcf02d6b16dd1d6abc3046ecf7497f4865b343fdfb187a3fb4b379b475a87ffb3d3a87dd3a6dde74a80f4776a783763ab7d0e7501d762ba16d395bb6d2b112395489e3bcef66ca5a74af3f5495351b2b04624db72889438d8e76c3b37d839fe3933e288143953de575eeeff1b3393d04d3344dce1a833a23cd738fb837d477fde785cefa3ffb3e6e643f1caeafb72cd7bc8e24287143bd4f366ff341d7983a774bda5099a40eb7d81e85915d088714f107639aa689352294b0a1493b19cc7f99f4876dcb34699a354094aca13a8c13b776a7df4b61bb6aa8174a285d644e4af9a4cd69a8df9895b14d9fb2f3cdaf4e131aeaa4b4e374cf4a68e3bcf90cf5e7b39cf14f27df6d509aa14af891c57629edfb9e6c7205256cd476b16bb94d9ff6c2f65849196aebe6dd914af8b65bcb64a8cf4978ad84d1636eeb3f86faf75b64194b9c9f6c36d7a871da99fd319791c638a3186cbb2f29b6efa994d4763abec2da092561a83d5b6c394ef8f0b3984130d48eacefbbd1b694d9f1fb42b3d70de1949249d8d89bede0cd8d317b7bca0c5382f8e8314dcdc83479ee91694689172afbcfb64967717b8d31a746b54c5ad893e5499f738fb594162eb2bf0fe8ae922ed4e7dab58b2fb236db955dc2850a5d6e08e38ded452a5f2bd9426d1c653b9ad97499adf4122d54f8f0cf86cfbbe1e68ed9a0240b95361af163ef9c717c3c4bb05019b3f24126dba54c5aec4aae507163cc24832e7b6e393f4b942c44345489156ab48fb237a583133f775f5352851a99b391b568dff395117ea0840a7532cb7c36e79ec31236ca45c9146a6c7fa37d7871733146974285afe1cd38320ca33ff6a2505f5b4ab3b3f94fb2d84d7d3450a82c3ba63f1bca1c9db4398dea8e4a8663a4ccd929677e4295ecca9e5066fb7452999d509bb97bd69a37bd17c66f42950db7ebfcdcbb4fe77b26543a2fc358c606f112aa6bce9abb735e492db54aa8b2e7756e624ae5b4ee6e122a73d179fedc1c4f8f48a85662c9a46c6da9ccedf9116a5f7ae575f9793bb54e8d505d36ccdebdb9dbcb4c271a354f2ca37ff406ddbf5c84faa46ccdb1176fee98e519353ebcd4c189a56c391f11ea84cc61991ffd76ed3739849a9b94f7ca4b5d5e88b3106a96ef503ac7ac45e83e08b5197b6de3646efbba05428538fb6b8d7376f2dd833fa8194bcce26cee46f70e3f1f54eb9abd886f831d7d52d7837a29ee9c2374fc2ccbb2f1a0c2779d94ace97bd6bcb519b5b9882f96f4bd7cb0eda0bedcf7baeb6dbea39d7550addff82075eab49fa339a8ce3e8d52e229cba82cbe86b3bd79622aaf633b4a70505b3fec60b30efbb5f2c9921b54e98e65e7303eb7784ea787121b54f93a378965b7e793ce5c838a1dfeb3344b972583cf695099cb7ed4baf7985ec9e00c6a6ccc1cbcf1c9878f7d2bd209598aff0303246634512283faf9f385596268efbbcf6350a98cf6e676e37d876dc2a0be371984cdfbbddfbff882ea22cbf1caf99c9bd2d156e282eaeed63a73499d5b3aef467627e4712d3e523aa11fd3b4b93895773a1c3b4d2c443455490b6aa4b4b1537c69db9bb14f4db71b908ca252779fb9c5134acf78e6b77c13446a3a86441475da762fcfd912ca96dfdcc88ea1a88f63c49fdd4e2cddbc1914f54deb4e3a97df3dcb1c6402c9276abeb0e5a6f79fec2b679b9ab603124fd4f8cdb663b1c17beff7cf1e9074a2be63f973fbf910ba8b2d0b11cd868413354efc4c5ac7705b68df9b1a924dd42b71b6f7510cdfb1f9f2866aa2ba8c73842db2f6565aca36b2a7d53ab64c30c9dca4b031d7ef490a9b753bebae73b339bef25adfc89e266b9a6048daa8f9bef3f920cbf1d2dc24266afc6f362f7d73ded6e8bb446d73b22921a397466a89fa8cdd86a57f7c523acf95a84cdeb7d4ca269975523e4ad499e97397413c89dadc4d8819652cbbb5f649a2be699f616a5fbecc35dc91a8174b0ad9cbd2defb906248d48c61c33ee1642e3ec6f02368cb6ec75a43475db786af1b36f8eef2d96fae5947d4c7eeb3704e2bffb14c6523aa5f7a197edc2d328c2523ea7b715a4c9fe6e68ebb1751694fe670f6265f6cd8e39b2c4434272051448d17dae6b08cf6f6a452c62649448d10634bfbe6db335339271048105119b61e9f8bd8638e0c421a049243547c1dec365fa674da38dd8af120d3344d9a9e86a8b3df83d62973916507f334594f0b512dc4b659e9f9713e1c8d26fac09103880f2e62ec1d2484a8913decd8afffca9ecd727cb3324d7110f5d9dced36be1666af28cdf52fafa713848411b236a38c8cce4661b3d7fee063cfbd1bc12009449558bef82dcb8e5052e6688f4901515f6c1c5decd8688b17d23f54f61a96d9ba1929cdffcc0f1553fbdcf4868fb27686fb50677bfb2eb59039f736231f2abe2cf77c97efdb8cfef650dbb7cb8e66fb68b3575a3dd49c9995b01b85f163b42c0fef4ddae4a4903ed99036936d23b6f6317c29b58de12e48f050a3b5ceaf6dcf79f3a76d233b7e80e40e15f78bcd39f9d6d1db9edba14a17dd5dfc3cc278e17c75a893460c237deb8c59e61c1dea6befbbb5ebd8b36c760ef5cab74cde99a96df8599343b5f166877f7afccff3b21787eada6d77de7746a975ce1c091c6a8b973ef8eefeed661b7cef0df5b67b7377bef3e2e69abff7dc5063b6eeaebb9ff16b438d98d266f6e9839136c8de63438576426b5f9ed2652adf1a2af34cddbd315e99317efc9e1a2a9b133ee670bbffe063edbd34d4475b8bf2e1f7ecfbe7f83d3454d6af713f9b595a78bb619fa1be182dc32c5ec7f29f43c7944062862aa5cc3936f58c61b351b21790b051adbccfc57f8c59fc39d28d6cc73a072465a8d87694d1e5cbc89ee306fb8b1512325499e9bbb4e5d732fecd2da6ba3e6f0cf5fdda3b63bbebe2bf9b31b599582059a37efc9c9fedc7dc4eca18b5125b0cd54dbff9e508338d2c443498240c95c6ec6d71b3d8286eec8380a1bad678b2c8da95f965cb38201cb08d4c136c23ee0b95baa3adb19f6cba66f8bd50df6697df39778adb9cf82251a3befbbcb43d7ca5bb770f7f90696aad791d05922ed4971d930f7ac3efad63910b15ba666d9cadd9b67e730fd65420d94285d3e238edbb91c9dbe6870149b45027eb8c1bc4ce66363f4b2141a6e93b769a48b25025bbcd617cd349fada3ddc79ce8e69b2e21248b05021b52c42e8b42f74d4d92bd4db7ddb747c67bb30c63c4dac354f20b1426dd74ddafcd298e9944ebe3248aa50a99d94e2195db30de774ca03122ad4ff96e93fda5a5ae7e00b1273693ae66a45209942a51337c30fc7199f1648a450279d4eca7ef9b687f97d4a8b8f94d96a9044a13229f3c517be77f4b52625fb0209146adb6c2384393fd72ef6e797eb98a66e4dcb3548d2a80e426f91520871ce9eed13ea7b3e2f7e30e699a55b8debe8846a2d9ccd6e9376c6781f9334a1bac5175af628ebe7ae3f5a244ca8d23d7334ff4b8c2196972565659a9e9169ead6f433d22c6a059225540ca9bfb5cf519fffa88b7e6acb0c489450e98418bf9b8cba9b8f5ed647204942fd7baf8cafe5fc18c7179150713b9a9b6cf72695eecd2354ea973dfb0e33e692b26784fa32b651629fce66cb1e43a3c2f63c1b6b3f5b4fdb8a50ffbd89e79b59e277b3c33360bb265d84d4c129e784f0c1d86e74cfcc7a8471ca47848a27fc3c6fc77861b3749a226b4dbf26059221d4f8ec5adbf3dbfab3cfca804408d5b9bcecc2979f31f6b6d33435ed1a0b114d46082441a80c47fb6f5b9ecd628c6d235bb6f848b1be90ad830408953e7ff913fbbc90cd7c7f509dc474ce186963dde6b45520f141658d6f7cf352bfd24e6b7b5025964fafbbe33659f7e4416d9936289fa56e4248d92331a366495d678cb177e329e70eaaa4b73d8b2ef66d3c1f1c01890e6a7e6f3a16a58b70e68797240795318b23fe6634b279b32c434af61e7b913eda26edc8a293167a7f7b0ba374869d04079536ea5ea6cce56de9a0ddc87e4c7d5c3fa658de24b941a5efef93d331fc58b4d737b2af8f5fff6236907b9c86c406fdfac9a691754fe75873aff585f8bec3efbe4c65f62f486a50dddbd822b4965d99fb7f23635b174a99986b2790d0a0e61631b3acc977bd51886750996450e6a7f39b63f729890ceacb93323c6dcb6e3f371c031218d406f38d52b2a7f0e3fdf96487e40595ca661f3bfbe4830e3ba42ec81a07890bea8cffb4df5ac6e46bad43654d4c75cd94162e522aeaf21d292b293d9a0d485a509bbae6dcbb11cf9b1d461ed334db3d22338acada61fb8d724ae6fa278f213bba485949e1f17a0b1951d4eb2efc17e57368dbed0b45c57f6dbbd82796b1b994162e524054a5639a40548571b4f8489926907b28282aa38e51d7ecfddc308e4e5988685690f944756fcac72c9bcfb2dcfed3344d2d888c27aac339ad73ed3284d4cdb791ad6927834c272a6e6cd2bf937eb4f64eba91add1502fb371a2e2db90c6f8b3494773741bd91a6f6e13353b949839eb5e7f73b4c120a389dabef56db9ef95eed02d6b9b4c26eaf3d66e3e7bdc6074d9daa856bec85c8e2c3fd91433d6ac61a2462a29cbf8fd63d81a83b8c7344d53ca0e2129145617e812b533b4d327c6aca964f75aa2b6a6fd9e5fb227f1b5fe3295a8edbe51dc2cfd1861bb94a88f51692d76f9b9362fcb93a8f23d0be9b34c1df4d9b0246acf98637c389ba438ca48548a994f6bdbe39bdbf78544a5943afb585308a7a3fe88dad17d94b25d8379bab38ea8edbe96a73f36e9c333dff7ef66cc720faa65b9b96d99b688219d3ca81237ce6ffe73595a0ca11955decc329ef7b529299dbd83dab329761f67bb0dc6cba4d041bd93b66e8de577ef75948d408a1cd4065df695f41dbb587a1915db77ce6fbb2de3a04ad62e8cf7427c83fa1c8cccc519d995edad0d6a6b87f2426737e33c6b506766d345ccfe46087b3e0d2a93f639f7a89dd95197ed0c6aff754dba83d0b969716b6c65dbfbac6b1a83eafddfe8652e633a9dc3a0527c1d3b8abb35cb7eca17548cd9cdb27167c62c962eb83742e8f3befba46841752d5bde3cb383a3a8ffaeecc7ddcfae8c2e8a6adf7cf47aa37f9fbc3014b5a5940dc3e8dea383fd40516f7e3d5b63993d4633fd447514c2d970e2db2cdb6e4fd4678f4d79adfdbefeb61355e248dd6d3b3dceeb2227aa6b4e66271db26e103f76b289fa324ef9d43a685b73fa3451a97cf7df3f94964ed8da4926624f28296bac4948639cede3a5ccdd3bccd89db4519b8492b297b18398a8adb1665b5ecade57af5b605c483718af1cbd4475f2c639e16df9f3cefc2a1d302e649a60bc9aa6b882134b5408f185d04e8f37dbf8be12f521b40d5a3a5b7b13faa5446513ba8b9fcdb9f173545affc2c17412f53a063f337f772dc6c94e2451b3cfcf8f2df36bdf7df32412f5bad6d8b5bd8dd28ed24f205125c6b1bdf766b4375f3c37b27f9c3ca2de77ace17f1a1bf66cdefac41115bb983f32fb344eff3963aa6b8271d288eaf61b3e467d427f37e70923229eb335c6534e4aa99345d4e89c7d8f61fb1acec9d88922aa6dafbf1dba6ced42e789a834e3d9d4d9e9e609222abe6ef38cf332e7f9bd7c88da3e768cef3e4ffc98bcd3062786a8b23b7bf406717ed8b0fba41035c64bdb6c2da37cf7d20951db939d9d3e4ce9206ab38f96bd6caf3f9c4f103552769fbb7d1dcbdba05f950789c1548e405488b36b93e137d97b0f3e202afcf7266554e29833ebdce0c91f6a7b30636be943f92e85ddda891f7aea439d4d6d7bec28bd31bbfcf8c3e9629a5a3be1434f7ba87edfa42fc376ee3dfb371e277aa82d27f5fbe465ae65db6e6b2779a81433373b3bcd784edcddf05027c419bbb5cf319bf9f11daa63ff392d8e144be8764e936c76a8ad9b6cacd14b1976dd5d874a61ce90e6e8af59b7b7e95029b43236fe1c3173a737a5c5479c43b5d7b6e82ef17dd4cd8cfb440ef5c1be8ed219ef6d18ff6d64cb0eee81869338544c9fb5395f2b6f6471b68dec08870a59b6ed60cfdbadf5e737b8a14ed9d236b3f95b94ff780c276da89fad94d6326fd6b38454fe70a0f5f7e2a0f2a787f55c836b9cb0a1fa5b3cef6d7f373ff56b84933554dcec65ecc98ca11aaaccd73127db5d7cb7bbcf3849437d8ecafc913a671994eda1a1d2899bc5efd666766547249c9ca1ca28319bd0629fefc2cb36d2ba3e0e5b182766a8df9c5d9abf4d7ce38b0d819cb051e7b4b3b1978c39caa67dc9839332d49efd286be8ac6c7f2e46334ec850bf356ce91cfe94b1313c19436531e7fcfff67eced1c18decf972b2468dfed4fd64cfb187f37b474ec4d0133b0943754f6dee0b5f9c31cf871bd99cce457d1a185a6b944d29297372322665bbb83d8dd879b3ce59eb9683932f54383dbaa68d36691d5b5ea8563e2aa75b8673632af146b6e6e3b7754ed4a816fef57ed429bb8fb2d7857a6fdb8fd7a3eb17256b1bd9ace118275ca8ed4f9994d05f7b9e534e133dd9426553469823bd2fb677fdd11c275aa82f677cdb32fcb0d92c9d17d3e44eb250df74f89cb390fd94f7f10916eabbefca6bb3fc68dffc009926ab08456d7a2585d594203e5282707285ca2ca61effdf838c39b3d9bf43557062858a6d7e3ddd6bcf9e743656a1d288ed7d89ef938ede4985ca3c5b761dba9b2f76f6a65061eb2c7366ec3d7d6a5b0a357f5bf75132782fb358436b701285da384ee89e3bda0ddfdb83c10914ea63105b28f1a3d3b6e0248deaf9ce48d947f9be39cd4fa8b03118d9fbeb0c7b4aeb84ea207490b6639e9df6d32654f6dc79bfcdfd1a8d341a396142b5f3f6cfe62d9d41db7e095536a44d9bb53bc73ebb126ab31bdb65767f296e5826a1b2f690fecbd8206ddd20122a86b42764193638dd9bcf3a394295b4cdbe0fc277f67d6e23d4fc2d594377ed93174389467536bb94ede6361d7c1a4f8a50e19bf9fdc32eb7b3fbdac9192db6e7da4d26a164ad5b52da5c46dbf77dbef9a677404438214265d0527f1447c751bec79a9321cce04408b5fb39c7a2b36e4ecae73138a5c5470a1e4e82d0d3e70408d5490aef95ef4aeae273ede407f5a7373867c61e2794d4faa04ee7fe1d6eef9cb3cbb20715c63bdbcccfdd74d8a7e341cd113befb6d3be39f363276654dc32cd8c3dec20c5d7e1114e7650277d4f25c394629750fe4676b76bd73d4e74506193f1737caecd9c699b39525a7c60e1240795ba6867ffb3ec70622fa3329b2da6323e9d37c2964f7050db71b38e627bfbe406f59f776cf97533eaedaf8fbfc0d6726283dadc4e999f7b0b59768c6a5a13c1490daa7d8718474ba5cb4c6d0e65e9e38406d5dbc3666163dafeb1f68d8c5d9ccca0f67cf6aea5773e6931641bd9aca5ac2732e8a9c8490caacdef60a3b2b9c5f8e6dfc88ef9229fd813144e60509fff63896dcbef268df90575ba7fcf5fe7c7903ab32ea830637b9d7312da1871a4272da899667a5b9492c551d478e5cbf93929297d3e9d28ea7c17e6361b66f6659a9949286a769d6fbb0e36653101457d18b7cc1e8e31be18ff4d934fd4f70e1f9b3fd9cdf7bdd7c3c413f5f98beebb51db307bec349fdf5c9a66d2893af3f52ba9a3cfb176ff8ba381f1caf510134e346de93ed3768fcc5bc4269ba8d9c278b1b374b6c352f230d14485d9627b1d636fb2d9a430ff690de342629b424c325167cbeeeee9ec3ed832b651ad6bfb9f21cb4e5d0f0c134c54899db4b6a9cbe71c5aef16934b54f964eb179f952f5a177f239b76a52396c0c412f51f3b66f46d5f189fb38d6c0d7eadab4925ea7d71326fb699bbd6a4a444c59949f9187e994608739c04bb16ce799fbad92fb69644b5d04adc0dc72b1dc21c890a1f66b19d336f90a832ffd3f9187e6da16318c87c44c69149dad6ce9f32d33b354b3071448db2359eefb5b738fbe1d79a668449232a7ccdff316490baa38ead0fc52183e3e15c2020af35893061447dcc1fcafc12428767db45547f469f6bdee473544aa7889adbbcced1e91ec62e714e447d3437958f3e3b19a3cc115129832d1f4f2c196d70be435439fd69cbd73615019586a8edd14b29c54d42f898d28ad274cbc2a410b551d8de68df2c27f5872df74c08511fe33c656c86f1ed36886aa5830ddf77ff3ec2e63e9a6e268290ccdb477717e6e81a662e980402baa60d65c396b3c54967ec19a56d4c1dbff7ec1fa1724c13fe23949545300144cdf94ae62c938c49cbdcfda13ecdd0ad537fcef5ede6872add6571b6b310be0c25bb7e081a267dc011376bf14ad7226d7f86091f6a6b096fbed8deee7b9deda1ba46fb2db6aee5eb0f3a3dd41b23a354fefb8c8ee3cd439decd1065b4bf7d1c276f15099a314e3666d6c77e31d6a94994176e7f3291fc3d20ed5b6fc37a1753feb50e195cf5cbf6e8edd36211daacdedf58b747a7b6c4ce7501bed7e39e36b7d736e4e0ef54ddb1efc3999d36e6de3509bf69316cee62ee7cd6c235960028799f3bc99328b2985366e64872ccd75fda13a2bd3f41faa73691a266fb06f2dbc2ea3ed861fdec82ef26f71aa166ae2863a1b6c385e6739ba1933d6549406c62bcdf52fb20d5532ebe27dd2423a5f66df9dd2c2056c1d266ca8334e375dbfefc6588cd1640db51bbc6db686d335c89e534385ddf649976d8353435dad334555415a084cd250736cef997509e546f6bf4c1f1e1334d497eede613823333943f519f1ebbe7d2796d7458d89199ac4ed3e7fe7165b878f98b051df83ec5e69a1fb63f3365a06369fc29799b7ed87f118266480f7fdbc2e238efd9eedae2e10164cc6507f32fba26c73462be1af51bb7f36646e29bd2f432c86eaec45e926a411e3272f738349186acf0b61bb0be5b513b70443edce8dd18761a6cc46dbbe50599b105a1a3fbb7cdbf76b6b30f142c519cee8d22f85373ef71f3051a3baccd651f99ebcd86de72ed42629eb687bc66e87b04db8509d5beccf4a77981b32c704932d54f724f4bfedd3c5d628d642651fdd399f8d6f3bcd9209495949612248594961415282f848e9803c9c9849824916aab576463a63bf999db50d1bc83dee0b132c54874c4efaa4bcece18cc91c4c79e24ab3a6b24dae50ed7d7bd947b719bf4c6d154cac5029be4de2d75c7be80e7b156aceef61e7f0a3ccff3ea642a5d0fd6374b473bbdde64636ec58f7ea3a52535656a6699a2e674ac1640a957e96dd9ddd65eedd590af559767d3e77d046a152ca9c93ce3eeab2ed9750a84f2f9cf0cad6d0338c2f8dd91c32e724cbec368899c6b5275c189b752c537c9bddc8fe91b292b2f25c448189136afedb8dbab793c26e2f37a14e67f6fd59279f47762f13ea84b3a963fb2eb7f8b25d42c5ecd9f9d2997ce97c5225d487feaf5d3aeb32667626a1364adbb3cd12be6b199648a83062770d6f948f35fbf008954e69df39695b7c87276b1f9818a1c21c67864c66ebd3ba4959e7c0048dfad89c1e7337cc1cb767d3d4ade9354c8a50996bcec27e3f71b639db238f3f2b29ad35dd1a0c2667548a1f65efe56fcf68749408b54536ad7b2a9d46f8221c426d16e3fca0f3167fc21742bd91524ae9c38cbd9eec5931df45106ae3f860e7dcf0d18ce70542753647072fbd8c5ef79cffa04a1cdddd37be145eebde07f541d8e865b6410c1b46d7836a31bcd4619a9df5f8ef5919263ca8b6cde98f73f4679262686246f51b716c134387636bef83f84869931dd086b331f8d8a354c646998b14670a9de51723cbd791ffc47c174730d141852cb6949345fadc71963230c941c50c3a0cedbc17cbdbfe3ab210d1103129a33a46e1b5d4e2beb8cde838a82de626affda60e88c90daa75b6c507ef7bd86297e746f633b14175dde28bb079a6187fc435a8f2fbd97b67b851d72834a1416dec923ec99ebc33a8345b899dc538e2e852caa04acfb14df81442389ff318d498716cf72ebe6f79be09839a1d6e1dbd6fbc2dbe185f509f62476773a77252961d17262ea8d265cce495cc3ddcb0b3490bea95fddace7f8f36bc8e47c928ea94d3b236bf31785db3531435caf92c460aefb3d6dd52189484a2fe6717997b8b736c1d2328eaf499ff199b90dd08bf6f18f31339d34b1bb418b6f7447d9a5bb3b73b67989b369782924e54dc0c7a6cecb09cf249ba6263fc470b4a3851219538e77b9bbd91c9f7a6a6c928d944bdce427a199c53c28cbf3551ad73465ff487d22d8c331375ba97a7945842db173bac2e50491bd5767b96efda6431554b09266a98afa8b4ef0796a134c9511004310c039170b308007312003030241e1047c311d184426c6a1480035e845e844230928863a14010c4288882200682180040108631c818a4b083480d91a3607d76eeaffbe4a3161f257355640ff12435195f5f7955b73a0841cae3b9aeecb2426ba6caf6726d91fe62de3cd4f6b5bfb53a369346dca89fdc454b22768b47aea9c4915796ccb8b162d586838b2c76874393c6da11e71dbcb5317499ec1f3a06ed407178106bba38ac9e9185fb56a4908ccd64923477e0c6e3cd12aecbea290086ebc19782c2a4ee7ee305a764a9a20d1160138995b9a8051fc612115b0317b38a3cca59efbae10dc1b3f217b969bf70799e7ea40b34fc6854d75b29308d9f930cfe147ee64c0c6c040eb2094726e6fc329aa3ba1a9c282f1d0564e1651d486e41439c75b84c86f7915b39f7747037cf19083e98b806f6217f2b9b83235b051ef07c590b04af1c0f29a49a37c9afc66148fba84e1227660239f2daaeb6c8e0504739d0cdc85c8af51e4686dfa49784c8875afb222a6639ecfc878730eb02e8fdd3295925afe2cc50f4a26a9195196f72ea99525a72fbc5187cbfc718ff4c333b06b5061637545dbdad1788bf375ded4ffe4e42d44721b6c9728b1e10156ee3c322dabc04e59de984acbb96c335b711ccc0904dd224ec00aba1742d5cece412b8af76f05a9c3f2a45883a05ac70ebb753bfb6e479f430e24ff5334d3d296856260a9f723ceb59a53e9d3cd1712df85704a78b2068b67883f99a0a279a52e499b79cd0d1811afe4403682f8061582eb48713f256ab319a19b0e9a107cc2a9d6747a56b440342f9c46d48450a2a0343c43d63c97c0f3a58468bf54e2108d1818ac5cf33eca31b0a3e94963f9fb88524c3b3cbe06e372116a62a863070700306ae7efe0de464e680689d5ac3093b05af0929205742a84884d8ad13627b6431a7d5caec75a8b29b5c99e530d1cc8419b008f4c8192d53214fc8f15d75ee462671d967cd8462153269838acbcc44b65ec7e12b8a55f6e827af6aaa5d13060629b56b8d833a5050a55d760c0bf843e0cdedc2f873b28872717f5487575edf27ec2e4cd5cdfe4236b4adff08985b30380ffa340de5369a4c9004a9385881eafd05bfb9de1ac756e04496c66e106892412f3616f760124472a95730f8838bcbbeff80ad6ef349fb888d2cc59555cc34ac3c97dd3f45ad3fd8596eb7b8915a462693f6780992bd5f269173e57f72b6eefbebb836543e09fc9db5a62fdedf8ebeeeb1716c49a7e141c46952820b24a8bb40a8155a1fad1b61e6ae4452af4a2f230448a25310d2b31b36b946dacde9d97fd136b7f04cbf10bfe9e7364197a9e647f127639c1f4d27c7a880e1bae7fb5ad94761fe922b8b6cc9a6d234fe30e9c5359280c91fe6558aac2a9ae8d5e4c1461dee0e44414f8816725027e44bb3dbc4575df792c193963c7dcbe4e7eb3bf6c5097abf7ab8b5dc5967f701dbcc93837e778ec9c108cd6714fea8a7a972003f6041b5c1a7b76f434093d7f4d0d56ac4ae20e00284977b44ec59b6565cb8c882a208255e21bf386a397eb432a0411b095f0b8a185709456db7b6d874802910498ddaa67aa8ad85f359e895dde74418b53a8c037888c25ba1019c1cac34610eb45383c3414c6c4b193102f64640bb5b2f6896a0651fc3d08e1e14969c1f9e7d1359188245f8e14f0d6200c2402f3a6d369d06a322d93bac87c766c1a0c1f8a74009fbbe5eb5f6646bd542ca4eb5f9116795dfc7b35eb33459abb6f395c7ff1de61f1c3e900b74ed92d19dfc9815ff5e76ff462a5e00e53e6beed3d0582176f8930250ce5929b2a647e7fe7faff0c4c96c53a1e083716b9d60168bd8197edef4c0c0858a564159fd2b2a1b247897e0d7ba120041c9982a8f1931da2c52bf1126aa55d5d7a71b314dee22cff6a6edc2a0805faeb01833e433a7dbd46b34230594cb73a6bc6ed02fe36b52bb305823d10bdca5dc66d23ac29776864e96bf36af086e443ddd13a11d112ac568bf84c2e726a347c2d56f1f3dcea28ce1ba333d40508530e813ebbeaa2617569a2e39d79e0c75aca69936b0c478aec3da02ec4a5a60ba2bb605f1fa1f0c5292ae79a7aa80a5922f297950ce73760ec53a2df9b03b1408e492c4183d9b349680f56adcbca3f2152ede961b5897bce1bd9bf22642238aa695092b8f4ba4131f91f98ed6bc1735b5c395c9d90d78076b01f547269b9797bf44753779518a9edbfaacf75ba66671543578698516fe36b4c62474955fc05c3fe4e5f6e716a833d71a34d0fbb12c01a8a19b50f640e9365956219631bf038aa19bb9c05c528d42d23b59214db89ebc978a2f05a284750fd6d563f6812d955be0840cf05d6da915dd76de9cc88563309b5ca8150bd058a07c09727319d1dca82129b723a8f1465aedebcdb99a99e8dc3bb79858b2f37bf21d1271ba8e24495d264735b6f3eb045955b0f8147128ad19ad36eb51ed330c97b3b92481da1fe33bdc0bdca2c8a871740c1af187e51e9ece733cdd4b26025b49fcd5b4619ba5e5c5f8977974ea2ae2ae4ac835528accc16366cf8c60af08ba0500f644fe2b69757b47ce0a6eafb450765e1ccc59d1d2e918b78b881e0a0129763529d35116a5178b51e82d94f5ff0ad21952d4d5fbf033e3559be1cdc1a809813f7738626d93c63a3e24936708a126ac7621579bdfe9bbe5a44dcee6cd0a2a4d8e77b0dc635a0de16c01341a64a23f6c306a76546c05b314b0c1a5e9071027615f75a975fb2382f8092a5cb71626b765a748a05d4dc40112541390435ae515e12c6c78240540941a4394aff3efaf5670fefae7d0902020231d102485264449e636df5b2e6bf1c08488b9902dea73165bbb14b5ac5ec339e5521d9d124e4368109be67e8a82f1c68bb0e2643d8e5bf11db253658783d11efef446724b1f0a68107145a8a2296389326ec9e7d1425fb8bd437aee269077269288d4c5eb87f35cf6a494ee43336264f2b6efb1497f9834837c04743ce337e2d8bbf55bb9c45b0ccb6bb264bda63d6d892fb45d732b1a2f4c480b2d196163b4c56638e9e05c0bf50c7bb6e46897418f5246539a80a2fab2dc977acc195503fd536b36ed8e1f150c053a66082b027ee30234bd97b0ff16dc5388c584283310f66b1390937b383d2f593222fcb2f20671223c4ea5700d2bbf507369aec026f0c970b1bd80023cefe20499abba51b046564bf72cac0b0c3d3bfcb53851a4c6a6861c95e3856367b64f88173589db8f8cd0f98c435808bd0b8c46bd8e2adafa2a76db5f0e1d1d60d3f64804f0328c87ae047c62b857b73ee8d2edde304eb378ac78232481b124c18898f386a0c8a9acbb1edd4811003119de8cbd018359916c5ecf3633a66be3c6f410e802a236c86c02aa00207f56846beb21e8baf4e8749afd20791d8383dc10f6d1be9d0db74f5de09154c74c17448a809b10ec7609782b82df86c05b12d4ed1268c26d86454e083cfee301613e9dd17d851c5c07c80a0250e1b9241ac857a3afd55582f5da0a5f5d828881d885c97e9baa93c2005d8aa6165a817e07761bc53f9315189ae89963501cf226ecd7b1081972ccc0978fcaecda796d4b62465028263d142e215cb5d5d1576a7a8d7538b5cf41bcd25978484bdc4ab7987c83da80823f46a1777011a5f50393a9ba83dbfb4b2fb4a8ce3c3bb64126fd142ee3fcb3328ec3b14b917a5f520afdd390f46735782124953342a261ca05da3eae2b6503bdd9f7ca0d96412d4572c8e9c368363c9b468bfa1a5ec5558c04e106f2a83cc28ccf1fc47488a3bddf5adc0d01578b9a3e37dfadd5f3a1cb43410e127a33cb12d94a05087f158c7aaba680436ee572a2b6a0f9731dccce42bd6e6da164c10cc6df4712cb168babb7576896074e05526d51d8d1a508e2dc2c0c76e180ca65e4d9bdb46874f6d4a6d16f898450c173bcdb9a17f9b6f6e1c1109c46694215f0bfa67157f842152af2145d94ef599955e429866e04c42680b52082602106ae701ee528813e3d084f3504f20e18d18d0fc2028fb9bbef2425931ee35b3ff842c58db1c55ef24733e4d1ab47cf338d653140c725ae267044ceca959d3fd339226b1dd80329fa2aa3d3537dd2aeacb0c527a295b2e8b0d74d086dc3c5b4228dd80adf683eabb5ef6e39a8a5f4f04643958f33e28a672cd0d80faf4378cb4d4a5075cc5edf242b9a057bf1b3d055dd9b3b1b7a20a59d0118984fd2c27ffd48e0aeb8915b035b532c7f0dbf98af6839cfb05fa170edf05f98d05ff45632f24cd7f6b24a1c8a09136442fe551c1891c253052c6fabdc6e29e55661f0efc727ce663833db0a05200e85ce03507586674c902b45bedcf00362cfd6761c86cc9e401ee10956bce51ec7b4f9c3ba03b80f52218c0423cd5c151b0f66e253ec147b6dc627b1d577f89a6fa2c5248dcbb44f9cd1a7986c4fd8dc1182db235757ce2c846beb9d248e7eeddc09b3a0410956799752e07c203d7f3e79b9cf11a5005b214a77a3326d434ee0ab88f112b2528dff772ffcc6bfed41116f857b752c22cd424b5c03c9b85f197a8d09ffd4832614a1b3906872719c905f6a2a31c394512852118058f13000865ef3733f0a87a5c5ba874a47271c2fd35d5905ffc1171b74513ef767563305d86560b2dfc20c11130506957641fe99a497cb965826bec9aa3b14ae6dfca49a31dd1493b0c81a6159a099d76030ca5cdeaf70b931d2f54e1d91d74717c1cb8efcc85ee99e9b46853dd09abd95592bc12e239f35ca19205deb806c97c90a00457bb66b815649ce09f9978b42ea6003672d3fe2205a899d29ba99129a9ced163926e9deb8003c235ad7fafedc6372a0e36edd2ac77cd314973edb22b5e746b2811c127b18b825e99b4cfe387fda495a3e5c37b8a5c9520d8c58d3252b993226c9ec6c058459dcd738a733c35c1a0c49c915e80f92c475d5037329d33108ab0e494f7efee7d2b3aa5b3484b12e172364e9e3fdfc9b8117b0e44a13e2c4e899fd392457403180160c99e8c25342113cd4b8d06bc6a106814c089b9e63df91d544922f7bd61cc6516b8030e4c402935c56f417f11142a734656e25b01803d9435480bb6a877cb875492d9b15a1657c609738f053c81d5bc713aa841a342be54df251812d2272cf702f4bd59ab973a5b2f55601dfd43f78fad5d9af356bceea330c47074a545b5868140b313e246ac335144825026262c665e061bd8b0746a9e52f9c25a61547aef59ecda490c1f075f4ccfc249e5e142c2c1d74309964c1b53396e204551584711499a0c5d346c1254bd535a86e5475209ca4d81ec4568a5ad0a26963e0e26820411b4fbd16f4b6a82f7338f8664abc320355d1832861ec759ae10f621fc9789ede84fe52b65e94937e95fb6d219b282600177cc576ef1041fc1a105ca7b13afa6e3c2c2dbd4562907fc1fe8561f6670b23efbf57c18f4dd7f378c059b0dd19be3de20dad2fece91e10e60c44de8539399a001b6ab96b9faefeedaa1f3a2111793f79716d8bde1e611b7a9a9043d05fb524aaf4222ccd4c5ae25289d885d62a98ae5303cd78322e54276b8256fd2e6d3ced8d25bd3c9ccd3c61c839a333986e76be5182003403c0c67f5e488a8f3451b6db4e280822da5b4817eb3895cc344fb1dd727b13d7957014491b02354337f1340e903249757630aeb727487d6d385b64adb3e599a368be24326d863a1e124b8958dc41a96485f70981480166a026631c70684c3771b893623d5911672a3e68bef30f08316430077b34659d00096be6a9bf85e931354a3f4c0ab40c882fe5a81f530476338180fbd10e3e11ec93939da952516c1b8fe623214653c778b1c911371e47ade11d49f7722a413e3d3db0edb031cec9301415c837326c9786ae45d2df735fd98639ec172ee0bb46d4243a708f9e91c47b125fd248c13d1ba03472579ace197ec683e372b1739d94450da5d1e30493b684267d8161162d06ea388a2b38222b9b7300661d61e37c8814be7e060ada0207e8daca77f55009b10c9c7059bf9bc211fcb6bce180f986b893c0358b68bf818b1a6a15a870f1e6959fad4af4f52e9ff46f8d1987309d44948f01d08c0d1850094ec2a1eda638b4643776f0807e3bfbe4f495ba4fa5e96cc50144216f675a2a7e41ce5eaede6ab7325ea346051505d3a24775b451c690866775a278d890da36db62e7f5a4a5cdc337cf700d0cf8cbb4fe2d6835bacec8240fcc893c26c117d5c01e363160e204428fd935a5141df3f3332dbf04b06ac264bd2b06ca44b04b141c9ca15617ac75f70146a25d1f7c34e8e88be2465fe27e244d41ed239cfa4040b6451224fc98dda42783a8e865a23b20e358cdf82b01603d3d11309174f8e7a33a9cc19835baf495f9c31c74a5300464ecb385cee5c95466ff75b362f25c4fddd052c35cd0d9b7ade8e8b00f71540b8370fc350ca8d274561434128e3f08f37abd7a997d9cb5226611ea2d56d6eabf704ad3722e76ed86cc9334de73383b00fe9f45374bf6f657c77c7b4a8d629486087da29c36ba40bab9a4e39cba09315895745f782159561a45ddf69a5936c45cb9f58096630569dcdb508546f295b5c63d675836b39073696b012a2f715fda2518050249c558363a44da4cfe714ef5a1241527ca07297d562ac9a200343d7bc46075225672bbfc7f034c3cfa956a7fbb15288cb852fe8bc9ce5468318d0b8ce00e0d7ae33d463b75035bda73aee0ea9956151643d639ab094e051a452b5af35c5a7ab98502bee400b9098b87c524fda1ec5c031aa257b9eb98840a279060e3ac0749b1c0614cdd5c707ddb41d6f4613f2b3ce9519f78a5b72dbdaa416317fccd1da32f4beff5517a58018d0efb6456b4363aadd88458c4e81fe8e72f45c638e9e46156eee1e5b3884ba1f4ba4d5d409c51ed615f1af133b50728aca42255a9dec61ae51baedb65dbd88d9d5cef8eb7badf65bffbe562844defc9e251dfcae345170960a0d5fc5ae091f8a4c2265104f5fe17122d1af70247e1581d4e919befdbf60219f281393b63473246249b3beedc71ae53eb1d58e9c68ad3610079442ce60efc7d2202d78389c08339e3a8e2d83faf657b2e972f4b85048280c43393fb6a30f4115e6d4c25f2fcb5f8a500cc1b5d9f13652eb030b1885f06f2ddeab0c92f81765be0fc2ff1c02c55554f6b42d1431c26f3e4cd3878663315f0ed8ddd44d381600dcbf6aaa3e64355c4781e9d9a4f05a3c530e2072ff38643f36d057037f6c31e5b9377f8ea1d9ece5aee53e07839aca5491dc9069afb610224799fcbd4b3db9053927c0f3a23ffd3ee57903f811234798c28e807184921d2eb49b8a6a67db08f0999de6a48687742ffb1129378f6c3980748222821b7870796db550534b81616c9ad6b4bc9216d1c8ce411a50cbfba449b91335ca881320c71273c72bdded02643ac0c498a88e3f168300ddf86a7ef78ec6edbcd79e05b214f7d0085c25a1ea1a2b5414f807b62518f60aa6d579899139a528a88e38c940e27a056a8cc9dc3d08195ca391599fc61929f7566cce747083e6902ad5589842731ac91f968fc811e7cba64fecd07a430eae14f31760c34e791b726db47bd3169ee21b2e12b88f62d72598456e040ad11800522ba16808d0b508f0ff6c726fe53e5bb3629964d044b4643bfeba0a34034502272c3f3f750110bd412994fd83fc1660b5a370bbe7b4fb01f00603b30a70623b5356dcc3ee4dbf704b82138d6dabe9ab80ed5c628bb89e10ccae67e4c55a8769e89ae024e8475184f82eac62d70d3a3c2d935fa87be5ea098720589a7ed86b5fe6c2606778457bb278821c8e7552f8f120168ee9de3af6075040ce3b554052c3b738ab9e4eabc699f79ee908f519961e2c1d7e7474d193dacb67debbf9d4ebc486bf6f0477fdb8f376adbbdbc88ef757246c3ef908d9c6eafde51799def45e4ec635fa4f6ce444162458fdfe193016e17697b9b54fbe74a06940daf51db49308e6a8e922ee645717935b3543ded87a9464ce5ffd5c10a654f2525cb5bf357e1d06e1e799a04c6a1353c36eff70cd44cdc0e5873e0b929f2c1b806401c22691d78c023d57374426006e8dee92ac3bdbbf4320b8b798706abab25cf302a4e82ab4686499691bacc4d5ec0538009d4d2291445af0dd56d4f497f0497a2439da5f5a921b8456951941fbb93390e5db7955cc9fea08b0f7f5955451847f0685754652e8bcbfe2550d55dbd96891816ba4de87dd210a03866dafdcb0b659d77334d1eafcb832aaa19e83b9c5b391a931b9614955a53330a654b065bbf333db37d03e0d35f208232ba81ed4d397d0b87dd1b6e723c1bd07f5a0db081deab8e12c4b227321879ce34971cd4f27b831fda83e8409a8d65616ad685a210903ae2684067bbad66b9f5d212555af323095bbc6270822f3cfb8f606092e41418a1a93fc357d987ed3be99f169dcc8f80f981f8bdb7a42109cb2e171fc75ed5c8120a0444001d81c97ccf927fa60dfa690ce0d89567f6300c749737c639c7365b18f755aed79c1a6122b0fe4294f54d0ff9936f99b8837d57f5e9ed0978ebf3c42bb25031cd7ab16facf385f7b0ad50c23f284777610a06c27d1ad4fc359d1a774d938d1d7d00859fa82571db1d4911081fa0ef76cf667d681ed5bf63a23add7a4d58f17ae887d47c0b500254067ff589d9139ffcc2ea08bc17088839ead6cb33942a5fccce4298043e33c362bc9956aa0a5672c47183a59df5a8704238feb32b1a0d03932b79d5b441b36c059ef3ee83f2444360b4d9e1ce1e81c4cee41227a8584fa3c045240ccc25ba131eced4df90ebe0086820e479a268b70191a3d647e0295bb90c7116e0ba3919c9e15ea83462f19abd668cce5f947547e68d8593760fddc306e5c7e2b3efc364786ad2ea3bece0e74ad68709e7ccf5fd5fbaee3a08fd51da4cc1af30077fa2644c8c37bcd13384ed2a381b4eefcd23c5a2e04861b312797a4c8fb2a0fd2a6dcc9178fc6c7a0c015760b0b1600070155103065294c64aa1c52648bbdbe78309cd999712d89f2fc658c12fd08ab702075487bd0411d95d8ef8f1572609e28cf71c19255d09a2079eacc33125b6369e44ba0684c964325946b86700b3d704d855fc1ba1e893352ff1acdee883373f998f284500a158cb67cf802ee57e222e719bf5e927278ad0ca9290d1ac97a4cad681fd324132e3edb84da94f8b1cfebb0828e9843e18763cab73175962a6778440d8d543d60d4eca5b5175281eb4b0f835cdd1b739d9dac882687b0c0bde04a64a0ea7cac0ca61d48e61a816b952c20456c09e330c6755de9edeb441c107fc7eda18ad8dbdb036a4e0fce492d9d2a9485c962cfa93656e38c4b605290864d1275e9c40cf045fa1c8194f8fc577ce901699020cfd02779ae5559fbca14974a42236b19c7673a734b0cf4061ef2e2a16cd812525e3584629e916870e4533af320afce91420a11e69302f1b6e8f8c1ce7544f12f1ef9bb4114111871439ecca9dee6e78ea62cc18307e5c9622a1506646bd29ec3ae19bbdcc812d0317c80f33899e6c04e49c937990ef0b88fee34cb8a47e3096d046f30f154134dc3bfe11935b08535a9e9b59f1ab6b281e47bdee535ad2d79da9a128e0535676ea98222d6f13560d916473bac212fa224b43285a25f1a1b52e6127d20266bb71f4966ed3ede81cd4292e96970a7445057ca4c4d01ff5679e282ad8049c28a0a10f693bf6d74065cc3c702d1a5e9097d0204aa72f16027b6bf6f1f753f8986adc9e722c3d0bd12f49aecaf2f0426d352eb8fc5be8fd0d6c19c306a880611040487b019d28a19713ff7146c10ab11c7ee48578c84d82706d93041647aca58e96ccf2a55050429b65841627d991ac78710c2bc24b4c04cf6e0416702416bdf0781d43553560ccc2d59499e0fa4f2272e42b68098c7888517f845b9072e693330b4b52f8be0127738033feb4b7c4bec1796b26b192431d5728ed303ede19a9f84799f3a6663115d56ecb148a7f3c04aa8f118ee43c40c1344dc421c44bb1ed66446df59bc10c6647144ff4abdf345bb295c3988fd1f8a7d596510cd5715bea47d89bab83b4b236ab0c5f7dcb2716d1a2ba62633c27fd50e1d8291a475a8fd91b9256ae1914c79f9d7128e7361eed616dc66f458794357f0d75d1ea19ee8efe5c69a5c89a4d97c1ef41dc4a04d68c59073435baacb63186e4ac0890ce5ab84c86a1799b4cc7f70dd45e7139009aee8effea6b996c72cfca5410c76484e06f46b7639d310ba95177e97d1454e7715b68e39ed6d84deef0588ce83d8374f047e5bd1ab6f4ad0c4fbe0d5a5ed71d6ccb4344c99581d4690fcb6ac39822e1720d83c2c243fef4111342de277108e001229c43e5c3fa489dbfe0dbba8749547509f6efe4ecf870829f9ce599863052ed9165c95c01013b0093eee059d3fd9f33d147c743589ca3b3f16c461fa931486e1f8dbde0dd478ab749799ada6b602f5f21ec41188820c702bc5716a36e5968a41814f3aef7281636f4cc679b01109355b618517fbffbff47fe5ae22ff3a0b57e0a821061ab3bd108d324800f3f7a069b47fa4b2e71810e413f5a39782df6fc44b6762417f993d26933eb39a6c4d45f3286210b34f4e9b6b35dc2a52312d284463ab64bc3676c53e6e26ed5798e0379553bbfa2d6b1386ae841ad70824b8758407a5976ebb9ef41eedee191e3e1b2327341aba3131e89551a2f734686faabaa8699faafc451f611eb697c0766307cc95d82e3e14b469029cd88aba2c126a1b8a5c360d856ab9f4c0fa734f61b86e74d72886d9efa60cb924cd2005113c0edd8d46cd47a3dd23cc9e78d0a42e700db540ea01c1f9c620759e4eca30d385658a53116c95cd181f17e9c91996c601e7f8606b89db75acf424afcecadd65586b0d5bad2e35badeba05b7062f5295cb9a1c5a71316cda1f40370b57eab28d505aed65729aa3b50d9f156ebe2e4f75b90ef8362c644e16adde0a0f466b85ad714fb56ebaa3a0f57eb621a71b50693c99d68023accc06c14b1d38052566e3c7c266257d7b0da8a71ddb576f0906c4ac611e46a5d3023576b6a8c899ef57a0d4dfcc92297b77eabd94dec7a0cc9ef23160500add605c4a9e56a1d7e2c4a99fd45d8fcdeb5f99fdab46d835597d13c56af495be9e671774f41012f3ac6e0f18647a98eeb0fcdea63cd1276e5c199cb8abee91e89bd3b7ce92d9a995d91ee712f360f647e0edf92a0b72f9b312daba09fc4ee3958253f0bfa6ac99e6ad36ed8baea7d627d0f51a449ac7669c5f7d1791aa37b6d1e2b37fcfe4371055eb750e84c17232091b61af84512169c3fe96cbe9d427c79fdc7b8526e620bf171c8f534b925b0d9d693fe521f3367c686404c371909ce2b794a1bd25f9ebc3bc189c9e32a7bbbd3a96b88e979b5d22269c56127e8b07879be67b0cf392cab73282b10486f8fc4f0ffa60c3178963d2cf6d8523ffa5d5d00a6d2331a396af8d7c0a547f72169989db9c455f2fec6b7f09f5308dc03999b4833b492b0cd915c6176647e32f6144921de8e7ae542329c42afad87d1ef816bee08d21a18ac8a7aa12aa405a2ed85de353cf73be4a4bdfe7ad1162e989f0dc54978b5241b8bc854816346e6493b88b07a10a6a660739f7cccc13df13aa36b10a2ee81047a940b9fdc9ddb6269fe88359496c03598b20d2af29e7b002f7ca23c76b3571a956c03891dc4d8b43bbbc65c67834906c11ed96ab5628363cf7c1d39eb814817477d47318300d5b5cb0cc59fad9237fb8af2b3a0e9b0ee9f3e5f6c70fecbafe94a3eb175971acf0a9ac0559e5e733b4e1e51f8679eff66bb4f3ec64acf1fd4b77113ad242707753659180a031a0c2787d1e912ab5390e0eb579e0f52c9dd46ad1e937b6d6da5b258ef4ae9b4f7c0e30235fa8f82837e6387f6dada8c033f96b2b35d37e6afe92bf6ccab50a699b4578e6291b01acdc67158c6a5da940c3c988defc3446178e495b1e7955f802d5cedbb277d4695d4d7c2332739d6a8649f934dfb53eeef691529e701816451cab4d2f77a90e41cb3f39a6a979010bbe65b0d2f67bb1c56b67c1e64bbcc570b2be22226d284db796a67108bf2eadfbd9e8075a39acce000201d76d72b0033135d1711685b2e58373b6c547fc951e9253e8612ac78451ac6799166d00c2606c3fc891da1bd85017f31b5855bab2fe4f7fa65e7f1c1fa3739f224523453e4e00add635e42693fc92fd3cd5f5ea5e27dbccf9c60d76bd3f20f4313eca1722cf730b30b0b607b1f127ce4611b013345ac2e1c55612aeefa6151259b2cef8d274a6d808c3deff876f134aad8caf36d7713491f50633cf043be2773d6513de7fc797632ec4fe5a1f57e0248ecc4a1eb992b9da842c1e576bbccf9f69f4dfea653f01d322c4fe913228a8f73d0880197d2f5b16f95e706841ceedbcdc3e630ebfd42e4fbcf969651ef7e7986fd7e5ccfcd2c594fc6377b8b15061ce8bde3208593ee9afa95594cd379ecea8d9d6953861769e3f0fa5fc6e979845cbb61655970b0f33757d9682a0528eae3b3e5fca79c7233621e549b8fe1dd8dcbfb98b294aa7fb431eaf09d9954c4e7858ac5af23abd5c177d31dc53931beeea4725935c11c95ef66847a296ecc6417b66a33150a378ddfc38c1087369f24d451df36a2aad1ef28d6f8ed0fc2abff5986d8f7e0c318fc400ebfda28a7c4151dd4ba9df34f63b376c5d36593fcc8d39ed0c1ba1147d5ae9d31fe117a8e0147842f2d8bfec29557b12fd1a13cb8d33b79c699dc778eb3c1837d8a7875a1c124fa441d3e6c393f4bcccd42678ba7419c637b1019e3a23b550f01c6aa4d859a362a02f87c5da9ba58fd0e40256e5da1f3013420cbdf21abcfafdb44a4adb24ee0e03885339b4e5e43e55ea95a4036a90207cf11d326c6c3527f5fe62d1ff0c68f3420d827797a0cd0429399527a6256d3e1e4f2dec9a7610daa41976ec496864c2e8ed1ddc7529dbf355589dfcf8f5f1798dbebf35bd456e970680e559f9147aa590c11a2a6dd9400c2e01d08618f9587a6ae2ae07ed9691fbe966571a2f5e4e2bf6764600aee15c45e72db491c20c9a3efc3d2f805af7266a4c6c0c4d1a3b0e1b43393f5e6a75aa7677a346a754bce09a48498c1307df148438c17b131debd4bbcbbdf2eab708dec772c0c2e3db860d2cbabe1c3f0c1aba46fbe4496e349fcb4ce75c5e85849a424d91e49c0e84b625d57d535f78be1f1a4a563c3b3694578df4a969e3cfa8bdc2b43e1d63732335b1c4079cb668e96f78580b56b211d0b02882c384de1df6b1d74c5383004bc33057592fef1b2446412676fb45cb64e15374e8e41405a495d7e06af1b25e6d5d243c3c03a323db283c32f8254319619c7bcf460b2dd7213af89312b315d595b2df207407c4116e2c3db0e66e00e404963f990ec9284d38b23e2871b683a2cffcb4e4a8680eda624885d2b0a18ca5e347652bac67894d24eeec172780724678010dcb7af8303bc866a187b6d6ba8293e39a9f7298c020aeb5457b700159ae44e5aa7f6f960f2533a65065d31b2f1d7ff31044247a3f4a4578fc5c1d241aff8c62c26dea309fe4dd4393c58f70fd99d123b80c5353b55fdd04338b39ea4b434fa511fdeddb63171c07ebea02762422e72e54fec3578784418d4e39a1f37a9ab43ec422a0d590c9cdb853a7c534485cc676c8e7fa59812302ab32f4bb10d3aea3427fd803ea29eac997d422808e033ef6db84bd637f4043d247dee10319fe77c5c7e64962413d70718412849459880f4e11f2aceaf89db987555da9e03a3ff56e6b6aecf83e2ab786eb7a7662de75123ec85ddab4431bfaa5ecba5192fbe3da78b69557b9838c2e80bdb0b17bd1cd4c0bec05955153bb00a7b4f5f53e5e48801ff03dd44528f927f1fccec4bd27dc99188e512ecf9ec757edfdbdc93861a7a1f2ab1cd8d7c89370617393700071efb9b8e40fc1b287da3ea21a40d97ba6ddf09ea1f5b85c80144b59173746ec41497e68c88868830f3bfa9dbfb808b7a2a1f18ef22905214d6b87bd176a02974e64f33695ec343de98fe1be6348633ae2116f46023ce386d97a39b3f0619e16c4b4c4a3603a113613ef787d01469c6b97980c648209e2150e456a8e2cb14a6e24ecf8333bb82a5d371da3089b2255772c2e1519969997f35e345ceac16396112f9b24d03a593e6b1ca74b15afe0ed487a787f375801026aff777068df414a8a131b869f381f1052747db32112fda75b14d1d2e9c26cf1ca784fadbd9f5b4421f909d3c5f9686c7f7b89928065957f9fbddc7672f451a27a34e6502b9b145877534f6fa2dec8952ab5c88a5a208168982a6bc854f9f24bc0859ff42ce267db1a986bd8b4fca30aeb6044a81a32243690308cd49d3087f03c633fc136c12a510e69324dc907037ff1891c9d0891affb5007081493bdae1c163f3c3892add19b0e875737a14de72ce79908936f53314275efac2856a18729a07b68c365d82f34108a1cec2b40f14b12899de72c9f9765ca44c88324c522b38127d1a28586bf438df227f45fc333d8a7350ba832e90565beb171af12fe2ce9a9b917b8f70f647263db1fe1465977d372b1f05b0695295e170140b26f76637876554c9af84e46d41cefa66fb19b63d50647d2d5cbc1ad6cd044ae633a44f615f766da1ebf27db4e7cfe54e30b3decff34f1204d45b101c391740de2028bebad86afa3612d12430d8d21b9292bd4db91fece62de29e124cb92921206118c5a98fe64910dddad05565557df5ae0f818c11d62be94bd7de92db51db0d363b16c3ae2025da25c56a56337a002187225400324057040b629071d0d2ab12d942f3f23eb07b6518b8bc714bdd7a4a44fc3338bd80c39012575f37b0bfef6222d891086a02d716a8842d93a065cd52f3ebaedb970a2300ffe479ca2b4334ef4ad21a60100eeb6d44e0fea2fc9f371db1bdaed4ebf1eeca98239581fac73f5f6aca366abe5aa540c3317878242fedeac273c9aa3d8b3c8135cc50df0a891ba56f167e4c7ecfa3ab9f60b0183bd011b117dd2fd9b198aaeff248ab3080038fb09717d0c17c6d5f9a84f625fdfd1f9bf5cbbe4722b92e41fc143a845445461eb3b864d635e781c37522fb1c2802281a9bcbc63bdca30690abcc8c974ec5a0813bff3c43c08d564e24928748eacd6f152113f55daea41d0cbe437510e09d3ebd03839e14c99e222bb187e240c363737862ef8e4f922d42b605a2be1399070049de46a8a840380bfccb0786cb1382701e66b1cc2f4af73ea4c1f14a82c78e7b6690e785d55b84673fe03e8709630e45198bba8710edf9cecb7817630ce1ad67b83754c975bea18d51b1f9c902efcc78df2a3a9e42e44d53f6760c48d4faed7373794e9196715e10eb3420677b68830b30f0caa74c0683d5f84e9422b45c9dc8049aeaa571915120f2426aaed6e82bc28dfa99657451b4aa29857e6adb7bf970386a8c24942794a20e0c029d1b05ca891e3aa72f715b18b254bf4003a6e609c5b09842903b405802a20301b063f25caf1d0027b6abea5a99a5d3433746d551ec03c05933375325249ea199ee7f471259168a4f102e9fed3edecfeb820097edfd7ffcb62a6e2ca63c512c7cf3e0d006c0708cdb6339546680781be615d616b5c5be61fb95337c4146ca7a4abbce54c17830c5b6d3a23b21b1171205db10ac1a45da427d1c9ff117885208e8550381a0f9c36b31f68e61382cfb3ef39f3b7fc528f13b8991e5364f8babfc1937aae65073f0e023186c1fb16fc004b4702b069ce61630ffe1308ee44fa1477fc8c9416461f4c5ed977ebe33ef30a19efb43ba79c5f3d752e5f3a305fc359bf68f8369064dae53e4796f95c18fc5f5b0348f9e0d102e8d2e3cde490d7a6b773818721de8b5350909ff3fbfa2e757453157ce6bc78fc2ec77231715701ba7d0e352ce5f9851e329bd37beae361ce207086151175978bf80205e191c03e432e5d15d6d60b7803ecf938ab41979440b41a4408f2a100d782529404b8b0e8f8ee3e2d62525adf116d941005896b5845dbe75d427dbbbf897288cfda5d8385700750331efd3e57e4376cae9e8d443c1d064076c6641f2d3d142d500e2b201a547f6843ad07ab1aa52015ded274b992bb455b045ef68b6fec7bb66ea2c817fe3075fef665b1fa6ae0e7984cd76abda6388cbec925f4dc52a60ec470ae1c2de8dd7a147d5ec7cd0a3f858324be0436f2b48d1f09d6055cdaecaf9735ba1bb4969add5496c91504be61944185de14d4abc9101fbb1dc5cd394b46eaf7a5246e2b972c8f9b5fe7ba5c3a71bc87c765566fa2c7aea9dbb971d96f31949ee40f20136e69d331d62894ef69f6992401b9c114a369d7ad2a24a153928a26a98888716eff8fdc73f99ee8c6f83a4c82c5e12980dad873e8ec90e44812dbfef21295f1b818caab8d8c266538676e32209c7494bc8ed248e9f487d3a37f97384e22c04328518d62a13753a6b865f7eb925924fc1982b7d09ff2da6acfa429830e8c941c60842a65fdde51ce6a645c6b70c1883c9bf01d1ee1e4d6a38cd09aa105a81a4d63488e6dec53c5da7c41170a02eb940ca5ecbd4b0f287f665286e63312d60cc0ae46bbdc46da56bc782048a6305808079e8418a0e6a40f76237fbb80055a6dc08508f3e8f5a226b15a528603c5b1636ab05494a5417946cf1281030f2afc77e57d245b2cf186ed1c4e0f296b18116ca0f88ce93b46014a1071a0107d3bf415d8b2f67d309bb67a92f336645648e39a69388a3c4eff08541d011903a80ef248b0292570dbbba35c35c4a9b5d7489620abb9054b81f01e578511a1566e886ba3562b629086301cddbfeb8ed64e3431ed16f4248c7b1e03be8d4dd0cc6942b635fee722883a29e4c9d366a2561c3c61877e0ed9bfe72267c87388d1ddd09853f551747ee0cfdb641eb0d8b26c99dc24321e854cd0bf484e77991a796242aa0566751567f4f916a9832d9edcbc7d837e73159fb953433013dab0a43577f2d27b6801ed39c18c2ee0987184c3a2083084b4d19178f04a57352511c994b0ade05463115e2acf8df171e07001fc855e793cc032a3378efac9c077d256158460b141fa960a7ebfac1480e8c9da97b963afc7aa2415b1878ac5a50b745ce17572a1730d86de59676ce2a75ed6b24999aa19498cf2185f8d3e59dfcd6e031136385652e6791b7a36cc65488c3f8b2574a7df533c132f5a843574ab168f560429e99d0a85816617b5c3740ce6bbdd5407ce810d89f5264d04957070d9c0fec9345344596c6d108b109a87e24a69a9f943045c234258597269f5d6e4a9f18dc5c81a640bf4f8532605a6d3887d87bc4114086865845cc73740a33ba61effa166d1a4ccb7fa74ee9e0f0fb83fb3d0894883f6aa02608411cb4066f0a1e13803204dec3fcb752955e38842030011038d3780e5fde24de4e323a2bff59b6a38fefabb5bd8aec390df056664d3571fd9173394874bd6eafad73ddfdfc76ab75676fa331d5330253f9349e78b6029d92d49d6cdcfac4b7ff95cd9b601e98859664ab738777aa7b8c1f8119e7c5f794a196695c229d6bb43c08747c8bb3be75ea266155bf298e8cdfe79e76e635638119cc75374232d862f41db43c6d94fb050873c9bd4d49342a7fe83f72598bdaaa290bd668e7e3c140ca105886b2c58bcceeba85e07f0fe1efd05fbb64943538e4dfa1bf0f93541b4dcfe0b851aab84d28dbd40cdc03e6a88b36d5286e4f5f1788e7838943fa807a28e01e073ea69fc43443eec1345cc55addb95210ebe063f1d8b706e32a2c07f46f14c832fc6006d49c55e08d8138b35da85eee8067586725729212b64f42f4821a7f87e643a18584144a9a3f25b1ffb2e587f82c2f153584dccd6307b5a4fcc2c80ffc4d05831b99a396fbe1b06ed2d32efb010a0dc032f8da1bf425414e59160e1b5060b3918ee20fcab95889a6c8966b626ae6e7712a0b9840c1e4b0f23a5b513147c96a5e46ae94326705b542bf0dadd52a8f674a91858099645ce9027dd5a0c490866c603e4553069f83112626cfcb145853c345e22abd7cd523da016b01cd5a0f56e25c1be6a0f663bee2656ecf3030b8901b288efe0ccfe8ef29c4a640c263adacc4da23b8508f2b45c9525a9c12bd4e9e1ed0678c75cc043562079c5b6738ac383a6d0aa29672cf1f9a2dc26d24c39ea1c44be4294f0cfb778032bb4ec039182f8adcca6bd4b7bf26d32d5f4103bdf4a7fd009c17b3d799bbf7211df69d0eecf0f5d9f91e74603bea674fbc406089d8d91cf19cee092a83833ca087e6ddbe013b8a51336ee5732f836a02a3da209ae043ebb8efa3da1c22c7d9ddcbfd740a297f0e6ca49e216a55f991965fa488d6d59138248375c83cdfcbbdf2499ae6c71b092efbfdadb3abd99f68d1015c514a96611ac4478de084e0fc6a0ac8af4130211c46021899b31740d6c272ae3a6f4a32ef5a0d8b47a471902d0befb00c155604da21cb7b80661185d8972bb2c13d3d737158141f3ec3c0118eba2cf2db72e1be118da48461317c91ed4f231b8910559552906897efc6df265f4c4f4ff6022f50e4781b1adf7ab6fd9f4ccc2a038bde01a438cc0c31b0668b004601146f970648da576e25ec340ec74d773258134a2464b0cc610d939d196f7ac468beafa1d28e056751c0487574bf13a2a2c260026a0f7536ae550ef8c81732c04b479984401579bbe9cb6569912a2de4b9f94c2884a00550f5787dbdc59befcd5edc7a907fbe527025045711247109f2c65a166901bdda09f9607b681a6aa3cfee573c3a16ec4797ffee923ce63cd1004613554d33c7e394fce7c177bd8d51430cacd68709fa9419f447af528338587f8d15f09bdf3f0eb3e68bb84094b0cde779a803bf065fc795b39f225d23ae513c0890db1d1544fbc618e1165396ef425567218286e1c545a9259b0d5fc8e3edda1feaf83cb05a744f007bb812537f15d92fbea58a69a21aa27ca3071c613f95103ed66627cd5fc5ac2fe6310291b813ebc4fccefb98fe125248105b81cd5e672c863d26a3abc219a23906b9ac71183b1270d7bdfc78a999709e57e962065d90347de03777c3ccb1064afaf61251b739ba6f4f01e2d2e593661b22b26750f1054bb52091600cf7963e0326cd41d89e01ff971220ca779e128b0df240e36bcec45c9c1bc962805fad151b57538dd34108d5ecf4d57141a9a6359b17046aac86eb4d7c87f2d1c5c54e2bb37a9505a0f8bec8f0fba8688c98074bb4b99a7635eb39907eb244838c66ac5b2c460307f8651b91ac0c39096a097514f510b37d036ce3f85a609e5be511c32ff665b361e33e23e0bb3c796757eb87a24657550419fd644bbf82612ebd2a1f5df7b47bb30790406ed091b41cfa22a7138fe34d059331f233ef834f91318186344e6c9610a99a5509092d4d5e592eb12f36375a5b5ed996c4b244c360c84a2e78716f44a6ad02e51c21cc3c2d40eaf2cf9bca47f0111015e97f1c22982efbc28ff85e24a6fa7b0f67228eaa1464dba35b027e493c8884bf9eab3330be78f913f9175b0d185f0360e6be7a183f08a23301b8a5993854c35fd1a3a0ebf0c9792733236bfbfc36352d5e6b74098cd85ca711035b8a59c349872dc85326dc43eb4ceeaa91cf2d5dc1e8da196f08845d0f89e326f773b050ac378f84a8fcae0f32da42d6c583691077b88c7792e8c2f4fb37a9711377aa537b9d8326ee1b3525930356501fe585442006e3ca43bbd0c4e2172ea4e484b5124b0c1e1842464a41d4131963358cd941c9c421169f73158b2d24dc7e3fbc63daf7bec2f3130c35d580b25184181b6ebe525489a6ef0e5b2e6fc165f5db7b89bd24fb014004a1ba34474ed58cd851c9012684790b5ebb9c5345a60d3c43c91497c2884ed4d87cfb0dca3abc1c0f444b6ed6be3f9d0b6be4c41c8fa42d5f41a2c8d20b2ae18c6212675004113788c253254e2b639422a07e8542c8b0a56f4b6d7cf01177f9297e6c4cd9ae70524e3de07818a2460858b9d58ee7fb202d647d26be48dc92f9b2c1b02aec9b437d23950c44f29b7d85ae2694cf8a5f7f4e6f97193316a9cb4b4e6e7371598ffc07d973d0c209edefcde2d0fb4a32850ae31f0231cbe22fbfe0b6deb502fb19c2664bbeb287d5fcf58060454fe480c3dde89da6e831e80bf27c1336dd55248818e9fd02f29a0ad41edc925d5d8140418c29aa46a65a3b03e5b01d95d98dc2fc025155c0942aa65151e9b42c4392a25d957a255757a619fa1154e531afe59a3ca24b47d3370ca32d2d6e61e6e68e57d868ddd465ec072a50ec4f9521ae2a1d40b22d585494b286ea88ea9859b985af0d02e168dc76a9e3aa1f1f14df3cce482912a96786942d2a654a0923dc72784a00a8d8ee8e2561260457b4998b6986424da99492bb368988dae76b0ce1bfd2c46726ba025d9242a05479a459838032a2da2e5c6a9d36cbc0a6973bb4ad942f5ef60e513e1ff4a84001615873dc3facae7353fed6f5c5b6ccc7296d0e3db4017e8d6d8fbec752b9356a800be103d290b03e4b17c88ac9cd137a06004b413fa117246c8a5c3b92e0d937df2471982e177c547e209714131ce83eb29afb681ed3d76aaac1b8494c1fea67be4105f8eb9171fdfc4105c902f809bc76e3907bcf4e302eecac7297394afb5e235c11665ad34da2136661c31ebba3ee1cabbf6ef35619d754707b74ef7b72e330b805a2074b48ac85f2169c1b23d9895178d0a6ac08fff6bd8ce7f3a7f05799ad8442b2e1a333f74fea27f0ebefac61d97dad818c554a783178dbf72ba8a7c78eefeeae738f390f4d3d0f0acdbdcb815f7376fe1ff03573e0d17a9e4a8633b0be604e5b9d0e89741172318ad62e58c54c8fd2ebe9bd34749cfa00ff85ea23f3486d8b242d2afb7e1458bdbc1fea2133adf7bffd21cd4ae6ef49ace6a69cbc3613d6e1f88b6a317ef389de8ed06180882539d62d1aa55bb3374ceb759ba2f876e0990708c821cbc4b2be4f4dd2a911edf3c1f9433ef5e1864adb28777f74573f97cb0755b6dc9ae7190d63c66ed4a7022af21c16cd60dbcba98ca4d1c1fedc592f8fcaf5b2d365801292ccd74e3a50ec833f4f011ad1a36676a70eb27084cd228a079ca8b501ed260bde187ae7049eed205a885a3ec435ad9ad9004144c8c0aae5ebd0dc239bc177ee3e77801d2b8e274aa93402ffe013f8263ea4345a4f93e6d9a99ed9417f54065f9f36c9820262d2c864cb1f63565651f56c6cb48b44959d4a0f807c17942c65861c8e9a9014f18129a581f52140aff68332820a120f489259e16c1e851ed99b04e74f55dd1e6af8505e8f083a89af9b333e385597f2a9187ae7d01b1b6760b8c920b88e390a5590e26493358a369d83dc81b52b6e009132b0cf971a0f04428dd2ca981ed4b8141e00915da9c1818859513986f5ba13cd065704e1e3808b60dca1ebc620cc7b3fa6fd8ab7ebbb0ae9a50589a46989c9d204a10d9c0ab12889275096ad530000bfba13ab83821d3cef3645d7c0aaf1d43adfd961236b0af638bb548805494b2e84dff97b68e46443fe02b076635caad3e933ca0696ae3313e390b4e77d332a82f5179d53af0ae96eb8ee94953f504fe8570b05d5d6af0bb83168630703562e44e8bad200868b47e7e3122072e479bcf326f814b14eed5cdf51971881c7d2c8d93cff9e5c5feaa26f7836bd4b8c5a419e2e4d80bf4f4ea80357237561c8fc39dadaa714fcdd49247b0d298d111020240bdfc27d6fe402dc53336a6d2f3dbdd31fb714d6e7ba018041499e08b82ec2e4a995afa30098b8aab4742acf109dfb577d14ce2c45ca44676605d70c1b374b86125620cde520f7df9bb597fd1f176d7c7495c67d69abf8274978c416dccd75cd5c7793521d3810f8ba7abf5e7e1e58a0ca131d3ca7a5ab5414de35924db31bba2c757cc1ddc7f78487e21a8468b5d998f7de2917efbb90fb1ca4be245c54d924d0c8921ffbc2c74892c74362f0f776c1f8f422c8e772c9d98cd5cdc3f7b2fbde188c0f59d7245436c1abf6c57f6bf5bb7a0ededfe0b581b318c69b512c192334a9cc8e180945718b721e0c862eecd504e8be58ac427d023a6814b66c56445cad88d10dac1201a99b3fe3573de8fa21939af2c704f60021bbd940ef6e19a9b3591679c5f5c207b6c665d8c039e902c7aaa879b34bea00a88055e5ed9d2917744c743a1578eb3b4c3ba1796696dbf26984e6d3febb7da629b2ec70fc069c83f3b90a27f69e6ed851244d646049ba2535964ffc00cfecc90cb824eb71d72bdede68e13cf75420346948035ec8fc349ecfbabd6b74d967dd49330579a058bc195d83ba0633bfb84da23c119bb423058364bf82fe203d2f85fd19f685a9ab67b8f162b44a783a3ed1ec0461cc5f0c6e5a27add4fef6f7f3e2598790f2d06d950ed515baa17299e943752279b2d1264c4d9983aadf0d08aae596861e490227a00cdf466f198313d4a43c9387748aea4960d80b0db04a852c0f003085709a412c571d89d3afd3a5d826a80c3cffe80797f82b8c76a6c0768cdfb3a2fa897261812e1d25e6a7a26c0715df0456c8544202c097512958924870d336c4727280e1a0facec37457b741fcccac2f674b0c2d817eb550dc7712c14f3b252e5765acc7e0f0953b6fc85ed583ffb16f955e92ee53a67641b0337a9e6b346d4ecc188fa626e87017b7938e5076ccaddcf9993dad848d248c9e0c6843bb921199832b95ee8f0e14093c74de8ce468926b024cdf2055ae04f742072207b000a1a1825f01128dec6729e92665cb4fd8cc71b067e0508a79239ad6618486a9408c501d25a476381ad9d5bd06ec6a4575d404d629dbc9beb982c5a5feec85532d59452c4e5e711ef638b9e497b5cf7fe4737d7163da3beb7b20996567ca90c4f464fb37ac8726b4fd95eb00e56926a82e21c2d4f6d5103d3e8036c67b3c137e1c2986c2f3b0805e0b07d9590e8eaf847b11538893272901c43d7c816df0c4f508f7a0c3fac0d9619ef2151523ef0adeae53582540a92e00039b47d5dbb659f941af3904d7a689e8cbb5c1be7d735dde3cd53a189b13097f2cfd37e914274d7be1297818a3b388904081ec67cbc2bfb263683592fa3939205c239ba87f934d33bf754605294a3c58924d711671a53652617670404f1fb701981c664b46052437dd1d5382e83321aee1a4c5fe3f76693303881df6738b1909cfc9dd39e57b0e67effcf7d4485ffc2bc5d101413c1cc2018413504b2509f103da2c6530964cfe6aed905e32857b3e7377a5ff039a20f75470d133275d7e555af34d8b585ceb385bae90ea3196e30ec9bf8b4da59e8da7428313ecd322f0f82bda1bfdacbb49d2be65f519d3ae778c1d767e09ea77e01f84e999fc344b1e0af2f45500bf47e5528bf1c6976673f0bc751cd904841703ce4bc5b10d3640b0a6d0013c0c3c0c3c0c3c0cbcc6f05b5f6b1f9f24c824a59c067daf1922a524534a29311d675c7f383f0ffebf7b77b7a676e804089f0de20d910d6e48cc15e4ec67550b7fa5363466e23b858b2b53171b12e4bc064d693e9f5a7e0d099f7242bdd74fb4436a48fc8d414693f4a421b1dce3767966f73a190d49f24fa9ef94d9d04f9e21712ce5a9f7856648543d9953ea530799538664d70ab9eb2fdb8a1d1992c389b99655fbd24976031a63304d97d221b6f289a172ddb5bc52e14e1c86045d69c4538e5da6a50486c4d894792d688a193dff85c46c419ee668ee2044e485e4181e2cc74ae57e9fd38504dff7333fe129fbcf91203ec448c6000118618011061861805114c8fb282388e680061792925ec745b74fd3996f21f935fafe583031a2612d245afe6ca929ad9508390bc922d37af45452e9459e34b09018ae3d7c980c19a3b457480c2a55caa9f572e769adc0d669a5e8361b174ba6d8e197f1762f6e021a5548929effc45636215f710c9460f5478f20de4fa04185840b2a5bee584d49e7eb0134a69014a245d65a5d7c9215292476ba921e8434751569149233f46d6ab9539e552824887a0d36a39ea24e7c427695acc4a8d809c9a7d2756bd226938c65380f361e3e468f1d6822a0d1846419214af37cfaae3cb234d0604272759c0aa1848693a31b593bc6a30790317a84d1051a4b4830bd51d1c29d49a0a184e4ec3d9acb5454c7d331028d2424b87b0ccd4e96daab84041a4848b8b694379f58cb6ff6111277d594d0a6436691bf8e4786348c90e0baeb312332e36e8a8e328c8e022222e203480582dc201111097283b7028d222489ba6dce719376d744482cd99d265414d7aad21012d662ec52ca37ad6121245f69b91ed754232d28084959d6828e7af9e37740487ad11dd3ddce0f926fb4fe56b469f820f9fc3a7ce697e58cb61789319beacd3c34442dbc488e1a5e34c7927af294bb482a79393d5647178999d45353fed8b359cc456257283dca63abad76b848bc58a3842c79d13ce916899d3673e2f3e3b2c86c91b897d489537e2d9273d3877e76d7a063358316c91da7f272153a7244001461c62c36a17b49b2483a1363363e63a5ab128b64ffbf5ccb49bb534d5824dee725f7addfa4c62bc17e60053ac698f18ac4e9a493ff57c815891fd764c97d4d55526e45c2b9cfe99863ae7f5b5624c7a47498e88a151b5a45a26858b78f22cd652eaa4852ff41b5e6d18cdf9e54249df0f653eb6955161bd9353350915c1ea62a8b66ee089d22317d9dfd5c8d3a69615324a70e4ae524aa7b34795a4a91a0a92ea77db88d3d332992ec45b3534555b173678c22f934b8e9aceef74d510d334491a4aa62880a953a663466334291bcada34c6efc4a550745f2ed77d88e51d7532b0a667c22e1f5ab52d89137ffba2792825fdea46b935bd0744627eaefb42c192245e8347222b9d2a8d27827459fcea3199bd8cd4ca6fc74eb29586e7f04f1314313372313c7ad855fdd3a1f2de262e2c78c4b14d71e164bab2eacda6a6689e4a076d12eae99f6d456223928554fbf345da72a94485ed39946c8cb26917c15ca729f76bdec839461748c0021c347cf9044a2e7a4db63578a96d6482469cf701d6339e8b60c24126b43cba8b7fb88643b1d4ee9ebd40c4724a6cc2684a90d37f579239244c91e93df121a4637831109eb315a5297ff5436c336cc58446209a1ae62dcaaab354110e771011191313e4810e7911491f82f2a63d0caeed5a144247faee7d8de071149d1caaf6f36e610c969669350d13686482a2da2f25d68aa98f24224e65b91b35357972a4d88a471130bb25fb932db4124c5a0e9a54ce6d49e4e4124263d32689231c70aed0291f8e6aa9974308d293f20924a4e2f481b15b4e870c61f12e692ac86bbc70f89496bdcb4d8d4c81a9030c228638c18ec2041daf1e33d2022524ec0e33c1211f101a408e00833fa90f47b9fb3921232abc887c4cbe4ea512e2ddddc43822e95641e4f9f2fa78ac20c3d24fe8de8485d93164ff9831979481a11f2e294c6fddc2522c23acc0833f0c0ace9f54b6adfe11d3accf60ec9a797576946c358f0823c0666d8e1edd4297d3ecf9ef9c38c3a245d96b98ca7aafe9348070644449a0e89fd61abcb44654b6d9a43924c72dd6f76b383070f4f63ec2806cc9043622c95d7262a34230ec9dd1b3fad7dcaadf61959382488fe1993a3e7c2e74c44a4c78c37249578a690ebb9a0c7e486e47fb57c32dca70933da90d87e6a3bc8de381bcd196c48fa9362c9fbdee33f3302c4475e30630d5a1acf69cfc3c5f2c9a0c15be0fc09ec9e0c1a3cd271be06bd63861a1293a9dcd1ee74526aed196948d62c164fc8cc0d7b3f1a1263d708b1142cc34d3d43825027d38c8e1df6579a21d93fa5ac963dfb08959b5186245d3196be49d96ca594e13f7eb88a31830c5fd8cff48e15af1e8318de0fd98d9a2de32c468f1f494484078f2b9c981186c344d429ad490b86faddc2329f0613da1752a79385d8a462772e08191e18e3022a82195e4057ea3139fd201a9fd18524b973d6a347fac54c501764c7183bc620e34c8c17e30433b8909cfa3f25d36cbadefd2d24dd8530cb62b9ad1dd44282ec652ee99ae752d2cdc84272c9743f5ac32a85195848fcb815f6294b1a987185e4bfafb8b4e3df7d5a6561861592c5836b69079d4c4d618888cca84272ccb1a753556964cd665021a9af4c5a30bbee1d0a33a690a473121f19f2b9cd63a4901494aed64b72e2b66e2ecc884272fa71cb91bed982ce8142e2ffa61cbaf137e8cf6c61c6139292a9d63c9d4c6343d3ec84a4f89011ef7e32c48c262469c77d06a144021f64a0b78088087a1f64a0476698c18424bd7b31cbcc3c7865fc0862b6c61f58818e09cc58427227b9eb95ac63e6ef8caca122c607d10005c028011ae383dc20e1c1c3c5208188082219662821d94ee6724a59666485900d7c0437230949a153f78aaac5976920084344246d061214ad941d16cc729d56b6a5ed12cd61325325e13d62c61192c49cb949ebecba4154a6cb8619464810b118afced5649e6f46119236868cbfd184ebbc07640611926cddc3a7146132984e6dc61092b46290a9a3636635092141579c2d197593fe7010123ea7a709b1f0f3172024e8f5644a799966fc2039940e5d1ea2a3092fcdf041723e915365e2a1542af522395af85768d6783a7f5e24c8ac5fa2c209917df95d24e99f50df4109edcc235d24c968f9b92c5c5825512e12cd4385970eada6720817097e9f1734498d4d1dba4552559d8cd1e2a832d3b14562787cad5a0bca6d746a91b0d13ddedbb9a89c8616499efa49eb67fa09dd6791b4619385eacba572dfb2485295e2652c4bcef68e45925e19dd2c3b2c123c67ead35562ee62fd8ae4f89a6db6363673ec8aa437a5730afa92c750d9562408a965269f6145e7b02229cfd5552cadee5556915c991a3f65b7c6985445b2e6b83fa2bf425aaca422a9f7e2c618534553848aa48a9e732951b93aa9a74854b73895cbfe6ba5299273d2e79def84a8a614c94974bf4a5b9414c93f3ae8b20dd251245aef082bad65a2fb1345724c2a7664d097efe4178aa4caad39a1970345d2e830274a273dd3d12712beb3f6d27e0e9f6ef34492d2b7971677d779d389e49c6c94ae202e574e7322d9aa34a5c81d9dcf2612f5935e91e3b1b4d5fa42134949b66367af625e19652241af5f8993274be3e56022694376d5d3c2dac47b89e470b1419aaa6a7f272d91ec29a4791019940efaab44a2c6cc694e690b888e8fc18f17a3eccf0e1e40b4015f5022d1a4fedbab9aa59b3789e418fd17de43544e9b9244e25f9e158da983a78f894482def7fcf12f37af877fc78f1264902f2091a02cdbdedaa51c4ff711892394768fdf5b695ffbc00a748cf1852392538ca52bf2e4ce52be114922dcbf7395a67ff536757e71b6b3882479a563a8edcaf7ae88c4e049ad885f9039a329114979e478dfc67a5129a3c78f20401e6d070e1189be173c5cf0b37eb3dc6047ea432449115f6afd629eebde10891f846cd5bcf89cea236b1ac61785e84b9dc7cba293f0320991b465394fd7569faca0412489f51bd31ddd730c8f1e3a36045f08e28ebb39deda4d415c47fb178148f4ec4126dd393a7ff60872de0790317680e00b40ac234f7be753666fd31fcca43c6f63a5cab047d6fe0b3f2457d624c3edff068fd1912ffa90deca203ba939d530f2e1cfea95729c688ecff690786b29cca6e70a277a3d245f6e769638195b4d76c1177948741f534937433c240653ca6a5399a8f41d922b96a6ec20d3aa2dc90e499633a5db8e1eaddc5387a4ca9862aed8a1ffded221a92ac611a1a4771e7162e08b3924654a41955e517fe95472480cba622b6bb963784c1c92b2ae63263d4db6b5a9fb020e093f16a4e7a4661bf4500d7cf18644d92e9933635bb4d1b9212978ac3ca2473dbc53da90b87195d164a7ca164c3624a7b7fd9493341dd2e635248cd450de156236944a0d49a26fd76eeeff261ef4451a92fd7ce635c81c223fffd143c78fb183c7183bf20b3424e5f4e1b229e433a8758617f8e20c09a32173b77735b24683a741c2c37704f121869ac14420f045196e065f90212965b9744de37a32294544f8f0c51892bbf682e92416ed76b3862fc490bcf55bf23b88cfd9a355f6842fc29064c2e4625dbd79a5508f0f947d018604ad592beb2fa7524f7f21e13b463df4c6f745ec85a4e039c84831a5cf55ec4262460b961d2374e5438f7a8c5131f8820b4977ab19a3f8f5c516b6fed8f92f9449cf9f16727dfbea741b4e547bf64516d2a4da6c2b05392e16ca69d5a51997a25d765bf7c94b1a54964ed9beb0b50ebeb842d27b5b57bea96e8d150423c8c21756481895eab495928da92a5f542151f32b8615d7f628272a245e4e76caf35dde06992924c820fec2a94971cd5d0ac96d9a65742afbcee98d4282f92668d0b7512e22418f69c6b787a7ce97221245d5ec548e3439fa4a44b2fc891835caa4a8bc10916a665a764b1713ad7137592a069983ea30aa738844cd1cdd4eb144d3a486484c32f754cef31f1513166a1422b9a38a5a4ed972aaef92a10621926c2f89d139288bb96d598d41248be889c8b3eba42f350491289fc4d97e7e0391b83bb61943596a00825fdffd6bfc21c153ca1df62d2e16ea0bd4f043d27abc37f1dcf621d1727ecaaeae9736db7cb8bb42ec565dcbbccb3efb34758ad0795b3e7b28b86ac7454bd9a265b1ea0635f4906465634177a8b4c9f61a7948cea29a16465bcc965d0d3c2429ab0f6ae9644e53cd1d924f5c4fd366cc9daaec90b072a17d3694dd7548f656b5385e9ef6693a247ba91132bafe64656f0e69aa675dc9b56b59a725651f527cb7347c392475f00efbe69b3824db89ca75d1e225a52c70480c9f825788f6602aa36f480abdb199d3a4725959c30d895e16749394b5b05bd768439269279da7a2aa8cd65550830dc997952c94e7257d27ae21b9f356eed77435d450899dc959d9451babe0a53b3ff8a664f669b61a6948be9175428daacdf3b18e1d5e831d3f7ce8d0f18115e810a9818664d30bfdb1a973b864f1487a86049992ea86860a32761d598b410f1e58c30c49614b876858d2c8daf6e84019d81ab17417b79a59e1462e6dcb6e250631e8d1011f3d3e202212831e3c147f04f14186c49425d2328927d979d5184362783f99bbdec47038190a35c2e08590fb4165c972950735c06035be90f4e94c08cf5c1d7aac1a5e38911a5dc01a5c48b6a07486addc6c2931ce0dccc43829f8c208d4d842d28595a75cd29a645b35b490183687cbb051aad4c846d67efc781d3e5c8ced1a5948cc914d72dff22038ef83042520410d2c246e4ccd1031b7e5290c831a5748163d8b71d71ebee1013135ac8066676ba7cc9d458bf978d4a88289600d2a24c63fa5bb199456f4b67750630a89a1c574bdca5885cc183d7c00f91f9b811a5248ca56c27e2bf373a36864ff84a00360f4081246181a802bd4884252a526f9eb57b9729847d6da0435a09030df263f8a65f2929e913520411e0810376400c910d47842b2adea7dea67e568ebc8da7da086131265f3e76bb93cb2a6a347902624b56852f1cf52593b1d59eb400d2624f57acbc7cb385d7e5a42b29aca318975dc1cd14da1861292a377d8bea0543c9ca54612124f6ff46817e34848921dc36e9ab633399954428d231c346791ef572a3ebb22d43042c2b699f60b3d5b2a958a901c83be91da398608495154750ea6c58392a6212488b0109b99a2e79021212458fca0cb82b6656e3708491d944a179553959c3cc1280106c8f0318606446e0835809098335a4f4be7cb79698d1fe4a8e1031d0b08e985024278a1230121bb5040882e1610920b5cdce20021b6d08180905a18208416080899c5004264518090581020041637425e916cf797842717751d3e337031ba0121ae484c8b35bd8f3f0946807806f87cb818ad4872fdd223ae632e99a36645a2fde719a5553a4b16b28a04d151fbe32deaa620533e425491205743533386d3a0d3905424c914aa8212523efb76462022727e84a022b13d9bcacab93d7d923945729ec85bc57c53cbb0c420c4143408298517424891b43f571deb27ecf26821a348f0783e26a7e4773b4c42882892ae82d031898c6d25392414c99b77c48b48ad8d9fdd85802229f6e3c5b0e2316efdc89a0ec54f246611f9a0e286d167eec89a0ec43284782279638af317ef2c3be747d64e0b219d48bc33df7591a92e6d679785104e24aec68b4965bcabb64d24c6b1fc4d1e4bd95eac3591945653ba30ab4d555910219948b0cd519d6676a4fb8c89240bedb78b9d53acaf5c22c9ba92b6bca1b2a55c2c91f0ed69465d5d6c8926a41289333e5f3327ad5392153b84502231d77cd0bf6a59e36375089944a2b749bbb1313fb35b1249d9d6ef649259d48e0a901bb807c008a38ce7c00810cf002b4222917416f3c3997cfbaf0912493af308699aec9047246ed01df34eb94ed9cd97087144727e8e3176d8fcea113722316a6e89efce193ff63a086144929cd9dcec0bf2427b169124b7343dc6d1c176d48a48b4ecdf943d2c999cf506218948cc3cd98a9ff6913504128288c45b993d377d31367c88c4ef9c47669e91df17fc11628844df508db6494dfbc8430ad1ac69b4ec7e61544688c494f36ac7a9ce12fe40761f3288e41cb4640c429d8ed031c55a102288e4fe0dbe39e7bc694e1f128804dbd0e8e163b0bc648fac1983220410497117842aad3c77da33b256f787a478f9635cfa519e6e1a59432345881f12775783101ded1e426964ad0f8939db88515a4a766315c2877469e7e890493bb236831e3d46743c0fb4e36e10217b48f8b8987250a3c48e540c217a484c2dd5cdb326c43a59f2905c497bd04eddd43ba3103c24f9c8bdd264e51c42ee90a4ee42d5adc84ecbe11542ec9054f721a24606530db10ec99d5f2efeaf514cb97448cce3fbfd2977cc35da85903924a93e3d7322dbb2632f8210392486dbd0f5cfdb31a84a1c12d386c7acbfb0224b490a2170405b55b8f411ffd8496ff02fc578b3d939978bdcd07df5ec8ceeed5f870f17e37c78990f1703db905ca233e5ce68b1cd62308c91203b500084070f0a80110618608401061861801106184996a985b021b1ae83164ffae287dd6b484ee5fa9b2353766daa86c4b9584acf8f67ac31d3903856b3fe16e64dcd12828644bb98e7e55364e60c09ba7263ebd7198710332467e5f2bc4ee69ec36b43481992f28dc6efcf747fb18fac250944441ef120a3c708101111113884902131f428b31a4f4143c81892f5a48ec77ed0df8b2131dbfb6e27f541c81c0e43c225d9b157bb46c7f635040c494168f94b252796e9258a6308f94282f9e6c9890d2de6154222c40b497f9afb367e8432217621840b899ba72ae7cbddfe5b48708b25aa459b6c6fac852415e45b4465e68f17b46094a00360887152a09742b290989addda377b081612e39e9c900fe225e51f59d310888858c81592adccf44feb430bb1427258b1cf222d28a40a89eaa2cea38ba8985445878e3bf463984044a40f2154484a2644a3c7aa202f7ca6903c7a5ce457a8a5cff0e810228584bdd1be31967795ac43a290bc997c4589d2cb491d7b609400031b0285042b53f7ecff56bb4e10ffe1e3ec8b950d843c21b1d2cdafd865608401465143881392c64bce9dfa7b97f82a464813ea14af20766e5daff106218409c9312ddf4d6ff81d7dca0090329e034b48b268a97a1945ca7bccc85ac941881292d4eb7df6ac6974507decb0419611928404b57e7d2763a7cbcaeab0c18ff18653084142f29845b1983d05f99fc4177284e41db95e2d19e4c7f48b13428c90a4318cf7671d25eebb22247f90535f76769d3569648d08496274a6d48fdde6a76a42c81092a3867989111bfae10a21c1fa3e0635f1be2fe129212408094298b81f15743ec3e8810021b9eea4277d49a58e36d52121e40749429af21ca3af27f4d94708f1416228511e66c693b25547d67a91701debd428cf29090ff2225146e44c8cbde51c1dd0d8455230f5a8fa71f294c77491645f7a9bae82522af3dcb948128d39931e299a154fb848da14d663ced999dd4922d0b8458287edabadb2142c936c9120adddcd7fbc53db9f42a0518bc4e495edb48adc557e406891bc9b326d4c1b0d3f01d9c1e383ec18b1818e201f835924c9fd85771999f288b2488c0f9df1924c175ea15824980a525e47265d0d352c923e87519a1f3e6a67d30181c62b123e366a388fbf31058f0f68b822f1339de9383246f59b5b91d4a65d3a9af6345891f0f1f3d2769395586d1549263367d1caa194495115093ea349e9ec1922dfa3918ae44f17f2ef2efcc6d468a022c1a298a8201af3547580d03845d296cc6e1f7488cf9b291243c7cb15c7e427adfbc89a18fe64d0284592c98e66d0bfe61abb91351d62f8ff084282fdc00a74d0800629925ffbc328d139b2955176d0184582490d1b3b98aeff1a6988026984227964a545cf58724269068ac39aaa3032dac7b146d60a8d4f245ac612de3d6a3a8a37b2560c11343c91f429c6b02756830c7eea44826ff8b8cc2822723a9c48dc309b5c2f5b4a9a299b48107f32e579a837cb5313891f93d22ff79a4d37472313c9aa19adb3e72426928207d57717fa3b2c27d0b844926c1615447470aff403c7041a96483abdab1f590d73b9d23a8c7109342a9198d2098f9edc45569923a04189a4dc50d93973982edd1d8d4924bccb8e70cb312a051a9248d80b6f753a75cc8c9dd66178051a9148cafb7e29b6ac8dba70648d04342091a44ce5e6d4f81029ca3b1a8f48ce37ddb1a4e63f29e91d0d472477c6efcc115506683422298e0e96375968114a1d3f030f7276c788243972f44a6d6711c9757e9572de7616d15840440491d103a589716e8060a0a18864eb70b9e1b2e42f977d021a8948d4bad014bfa38dce1c7c040d44247aaa9331a645f497270f340e91244d4cf533d3f5df6a88a48d9f5357648a623aa8d776a05188446b4d172ce991f53cd140831049a6a7a35912b58848d6a00c34069114eb31ce9707092241fd688cca1cb367bcd0084482961dcf611e40245fbac5d374beab33ff21312fb495dc0647d65244a41234fc90bcb39e969d2d6f6a38b2a623c80e3176f0d02b16e4068f2ba0d187e48ea95b714b681f2fdb0334f890289f56fd59b3f5a9d1c8dad2d84352fea7783285285fb1e821f92f7bbe90e19af2d291c520d0c84382d8deed5c123e7a33341a78481e19dff418fb62573c0e34ee905c4237f869aba06492991b68d821f1747c7770b57c6daa3a24599ccd78e538c24443830ec93723a62c7a26db31cd2141e5f89afb9f4af47ee490f071b48e52fd68c421315b265559f48a7e8cc32171732ad1ccea39a831bd215193e64f323e94b6ad3c08196204c64ea2e4372c9170c93f550cb1eb172f95480ca263a14492362d6225d5c3a991277157f85a4b16dcc27556698b9277656a842cb1183724913876493ef4fccc65752312893999fed23be20d482487091954b5ba9c9699879fa09c246e3c22c9d475b677dbf270f9c8ea38d3c50d4724a6d2a42ba99c63d21c7df820a311496e9f4206913937efd1f1e36dd083870e34c68e74a7861b8c48d04dcfe029bb4bc5bf88840d163f652ea92292cc3c97fc4de6a9d37623114949980e994ff9f5cd4144b26e4c41df3f1c59abc10cb864e2c62112537f86cb4b5b2a4ec510c959f3551cf5793b568319e848e380de226e1422314587a78e8aa24e760891d82673c9eb184b731ebdde20ceb06c517d2a288824ed6eee99bb53e774d8052239366475ccd4ff419e00912c7e4176763a12831d3f4abaf18764511e63d37906d527fa2159457fb6a6dcf697d2f3d0c1c33f0810b5188cb1e38ce13cbc027d7d48cce31a779392dd4a233e24479196e2be5650423e7b480cbda131357dc80a327a480a7ff5a071f5de97e721d9b27e3c9d173d7a0e6fe021d92ea9fc2e5af359ca9170e30e49ef9a762f66d20e99a3c20d3b2458fc746daf183268f0664e060d921b754814ab4cd39adfdb65bc418704a53aee6cfc28b1628eac9511f41c92e35b79128df2271704e4861c9236dea5d3143f3b19621c923579cfa99c377349cf0e6ec02159e5f64a668b02e1c61b92840c112533c699831b6e481e25a426f9d21a3a231edc684362e8faacaed94fb725d990fcb955aa29da86cfa735245ece8be177c5c3c6ff861a9253d7fd7a3ec8ce9dd290e062fa63397d3a992c6848aa284a870fcb565abbf5c18d33248bf43ca23bfc5cda7ac30c575765e5304baf7acb311eeb4dc80df746199263ae9c4bb525a54c24c20d32248af85449ac6dd384dad670630c4936eba5bb52740b333a36dc1043f298548b514ac8a829a5e770230c892e1e37839bec98e70386c49866a534698fc92ad3861b5f48780b61a5743cdafae8c7d861c4e871ae04c50b49a731a828ca839ceeed6f7421716683debba41942a59c1b5c48aab08a9d523466f316831b5bb8bb2a556a6dadf1b816add5b0a67e593528df78141cdcd042528cc5a9b7532f17de188cb1e34710201f58810e326e64e1d09f82e9c88b39576301999de3b35a8ce3e971e30a5c6c7de74f229e46010d6e584199d1baaf1959d57cd10ca65254ef11e58d2a24f8a7acf6cf2dbadda042c276f07f0a4997edcae5c3a49686a49098a4d8760e72a6251485a40f957f1583ab9979a090f497ad3723b582507a427218512e363a99a7d638216144b6c934dd373ad384c40ab195ba712ee9ee4c485efdf60de7ae7bf25e42b27d50dbf9dd2a21d1738e29cc569b84c44f3af6e5fbe7b435121284ee154f31546bc57984a4d4f8f639533154864648909a2a578d4eb29dad1b45e044e9670f53212224a6ffcf99f4fcfec70c21393727b1db2573c37854704308c9222f6f73522383323f084925aaa3573c0121cd1d46a6eeeb377e808a66e5b66d53f9a5a5f52a6e1cb8e18324f1b86e9a2a62428f547b91e472be7f3aaa68d3942a2f12c32fc71c5ef2f3f7a5aabb4812d9a1af1f7cb5a18b44b1e0fd1eaff6d2a7d8c845e229a9b91e16b3f239236b3a7aa443bbc645725fa9d2a7c94e8cf8250f366e919cca63feecaf57071bb6480c6bbe26545bcc4738020dd4007fecd0e10348daa845d2eb85eae8b9e1b3b5366891dc9b44e6ffd8c786d4c62c12bd32742a399ee1e2b248d041c50d42fc3f7be5c4227167a4854c6dabf71916496a3db625a19be1cd7c4552f9bb28cd76e71ddbda7045f2a8113ae5c6249e76b2d18a042d7332d4ffb9adc5062b92573b7c4c63d5fb4d365691987be3c5fdb49a6468d65491a42f98a5a04af32f344052911483d850911c94926b329aa5b2aca93b4552faabd814095742b7a9328f1e3696224156af88ff051311932259ac6deef29ba34816cd1ad36dfab02812fd32aca6a0d3978c4a289254da389f848add8f1e2812942991f1312faa92d22712548a16b67767fd5d1c59c3fb1d3f82a4278e29a514f3bba5cfe4c8da7582996f2befee4a414ba8677e50623fb38713c91b2733ff73aff578e6430c0d94510120403c042510b14d2449bfddb029a63432a63b52d2d123c8183b520317b8801840dc062222a7e33491f02953b52edf8b9a89041d749fc626f34e611f594b44363091a0c2442b074fd626eac85a5a086c5c22a9e26dec1c745025161f5913a35822692ca9cc5be9a76359caae44922621cf73cb08e9a61959cbb29448cecbf56ce5b121a78facf1241244e72fa5dd8e34d746d68a9e243e712f2a97c79cb211203eb291489eff930fa653b7dd39b2a60689e45cadcda362663ff491b50dd87844829da9e8af3d23738ee8384076889119b0e188e4539e2fa2e4c69a0d6d346200361851ca66af970384c7ebf8d143870f17c34c59606311995dda9a55578a257662ea9f3aa81f88970e2246b2a188042122d38552325e6a3e021e3c76704044a4c78e44246ac851a733965acad0c89a8e1bb8188d88a493c1a2bf6abcd64d1a89c1183b6210831e3c36b17188e4207b4673cd3de8ac3c60c310c92397e6fdaee32ba9d24060a310c9977369ea3c83c9ddec98012192538c9aba72ca2d67232083485cb7cb301d6db4542a8884eb98ffa2825c0a9b34818d4024a57701911c97839099b46adaa80436fe9098732a1badef646db0f821c132e514cee38cd8adfa90e469b45c3495cdb6630a648c1f67d763870e1f40940f49a1d52d695767bb4def2139cef628656aa387c42c226444c6ec27b29187844d1fd1fc1a95d79436f0905442e68dd3ba9c59eb206598056cdc2139887ec74b1637fb868c60c30e89229a2be9add5efff888800b93a2467cc4157a7ad12a74f5cb04187e4b0929d94bcecc918cd21f943bbe9c78f75156b392465506699dfd2714812edbad77e1b557c63030e49325a5b1e9f8da64466e30d09a35d9e544ee89cc3734392e620e572ad981ad1b6c13257ab58ea769fe67346255f2d970d89a7ab57e9c3f7546ef4687f011b6b48ba50ff192a2e4c258d1a92e3429fa6c50e69efeab04d43825f4e4b3ab36e05ddd8404382da78bb95d1b4d76fce9018d37ad49fbe7c0d9e0d3324fa95120b2a9d36ca901c7f41e666ea2c19124dc9a4a161735da5b96c106c8c21f1d3a6a43208bdb46f1283399366f860aaa50e43e28a7a0c13424f0935db00836d565db1a19665dea27e23b3e9d5e277a9828d2f247d86259d57eb52bc3acc0636bc90181e4bcfafd4c7cb8a888888ac0ed3ffd1e3f4c0461712664cb5e52d0653a9c285244f0ff1594f2bf77f36b6c0795af26efbec4a2e26428e4a6f62961bf6d9d04272929fdcddf6baf2af6553b09185c4511e37e996cbe6606321f13d4fb7a69a754a411b57480cdbcab0a52c283f8d88089a1592f2e7051d94faa4e4f836aa901435bea98f1532661cd9a0428259a94c9efd343cff36a69020e388778ce90e9a54a450f04cd3d8b2f20a965cb472da982ad7a9303236a290746a4eccc54cad4f720cd88042f2ad89054df9c4566dc2b0f184a478b5d1e1a2e88ca7b7e18464d3333a2aa51719a51f3d748cf1e335b0f6e3f903369a9099669a5b675878caadc7b016ce2dc58638b2f6a3c705c4f8d123ed8f203e906083094941bb6b4a95dd25147e59d247643694905451ccb4e7d64e2a35369290fcd1b44ac7bcf249db1fd84042e228b524f726d38f5c49b07184e4202d29619fa4766b9ede02efa38c12d4c086111294ac4b5b3a875129fe45483215fe64ebfc4c888808c99a53aa3ca2636308050b96ccdd928de5d216acf664273143b083870f12fc0802e4093684905c5ab45b5910ebb1e420240891d3b1bc9be5d3c506109252f22473a9cb62a52c6b6cfc20417c4ef130f6bb9b46367c90fc96decd54dced47b717c963e33533b21f09e221101111292388d7e045f2a8fe9ad2203278fc0f1fcb3576919ca193aac551f2eaff91201e821c09e23eb28c2097357491d831e54e17e45f6348cb0882c69c8be4b47fea94ce20c7e31b592b5c247e945d8d712f356e91f87e9b5b368c236b4076b001e1b123081910a8618b04a1996a9e266b1f356a91bcdd9563a76cf13e47b4480e67971dabefec546e1649426d7acaeffdcee7e60c6ac822492db985b90a76963bcaa0462c924d779eec8fdbebc578f4e8616091a0c205cd6ac5d8f123080701f22308905724fad58f32bd999405bd2b9255c66b84fa6765baad48caf85971ae5cec536545b2e6374bbda0d66af155248992aaa9c742db3377aa484c31233f8f26395a9b5424c86495f7d4375fb615154956d164aa1899f72f9e2239cc55c530fad3bfc64c91e0b9f16d4f9b148b512992f3b6c2438cf478e59222794d09255dc4354691581a5b2bb158f16e1f63b2418db05614899794529dc3d5502469c9a02cd995565f550314892986da981bfd449216d9f964cc7bda6cace189a478d7aaa9773b47d375223106594abc9796f40b39919cd3e2ef45cfc9d6eb4d30aa5d5bc13ad552188b1abd54d0fce339dc25692231a9ac313e3ea6acaaabc380a865829913d54ae26676edeee19bfcda9295e954f3032bd0716a6022a92c29eb4aa7d3a91f6b5c224166d52c75d9413f373b46743c0e760069842c9198dfc2eea993a95189044fd3932773d7b8959448f6d01a94dc1875645793484e6adb1b4be55466bacc420d4924a6f0183b98850a3266ad851a914838719dc4cc8afc6b350c35209194d92b44e8f46be1ff2312ed32a9b6dc99a7a9a9e188c498f35d597cb6987e3522f1cca3fbc8dcd94c7c4624993e53b3070f648c1e3e80fc183d72b822f984502327f24cc3875a91f0991935d8e9a073deac4852c2dab39dce4e79eb2a12737dda2c5da71f67544582c6273d4afdfbe4e75291a43685d1ab6136a890a3c244c6c8710a1331c595c2440a296e14278a24d313bb4ffb1b84fda168410e50246c8e69b47b5757b8f41326523c719d484e2ac9b89ff46dd251cec10913d984899c26126dc6d349dfb813b2c99189a4dbb77fed9d5331f41c98e8e35d2c9c96db7a58ba749dd255b72ae83019392e916c1b6e7a3a6c2ceb5882b154b1b2e6ac954ce4a84472dea02a7535498d39a744927e774d9f3b650dbfe5984492ad5adcda89ebc82f89c411d366e92975f678c91189a49cc3bf8ce9fcf65a8244b2869ef0d0cb399777236b407e7c901d47841c8f4850da4558b7680e5ee77044f2658672d7d62a25d3da23472312640569498ad2dff91a46248cb070bdb541958b9a631189de69f9e5d38a48aee89e3689d65c10718e4424ab89b211391b4424585fc7d2ef688e432457077d315f85f8d31c4324589e5d2af94ce944cc518844ef533b9d0bb3da2325e420c420124fd6eb68750db24e412478106f0a4452cee737a663dc0f510182f9ca31a4f8e90bf7ff21397954cb9b2ae97ac7fd901ccb2de71aad254f8cfa90b0a2cf4398168f4f3a39f850b66d85a56461430625affcf23d24c8383a749ba7e8213129f956b16a96b4c7c387183b807092230f89bd3542fae77462bef91f3e0e3790030f79db57965d57bba8ab458d314d5cbe13fa1c7748cc35f5cd94ec45fdc50ec9a336cba928e1bf97ca5187a49cf3fb980d27d38de89058c26279860f159e8339e6901cfe47afa47f14e13939e4a09c6b6daa9988c95e482f17a562cc3be58843d25cf620df9e72bc5c38246ed890a392c7d2da35c71b92674ee805ad9841369fc30dc917c494ce293a94d51d831c6d48fc9ef7e496a51c6c3091352407d5a629e852db0c8b1a92c6737664a82f0d268226071a9262673f74526d19a8470576e4384392660d6a65ffc423871912348c18f9a1eb57e11f920146188739ca90b8412c478f9b4de1792107191235874c2264c413c83186240f1adea5363a69be98430c8931465fa5b3f01956cc11862415ffdb37e91b35ef3c0718126f3bfb4c94b2ea180424737c2179defbf643d85f9abd808c8f1be6e842528c2e327eeb741ef77021f143ef9668272126e4d84272ca28332bef927966207e811c5a488c7e1ff3e85899f3bb62e4c882d142739eca50693dfac88185c4396d3933e74bda439ce30a89dac1bd377786ecdc5b21317683b66c977f8a9b2a7c7f6fada95b634d85e4e02dd2c5b2778515a790e0a734c80619118f1d28c01c52c0556d3bad2caba5a68bce8e775632fd0f0639a290a031fdc7d2d77f99322824cd6752a5ac848a9dae27246adce9b69d4d712a9bc30909ea29c92ae12756a3a7821c4d489011a672db2ed4378809093229ddac4b3af88a78098929cffbff97f04ba2544272deec192f65e7417c3992d065c5f4b44cefb4cccb323a8fa564e740427272cb7429f53508d54821c71192528f5e53abb27cd139cd6184644b41be5785e5d13109e42842524ce2bb53fb8e18031d63ec1809b2c30644e82ebba85b10dbd636e55f95d9466df6e8478090e16387901ce3c53db47de9a0de8114c82184c4e07b9ae434e5e583ece0e103488e2024e8e89f329af9fa2b7e821c4048de0d4bb5a35252fd4b8e1f7c51c36d6c5d34870f9263f675c5ab11326d4a2f125b3e26b5498ea79ece8b440bd24ccd620ad77b5e0470ec22e952901e7783f5da07e92231684c6e1a4288b0cfe422c9443ec6e0e7e92c6571e022e13a29d5153b9d8cc8b74852167e373d9b0a16af2d927f94eca9cc5aaad9ac456285d3a1845cd23715a445e2c69434d35375708ba30e70cca2d5f4eecc34758f91f7d01525b752235b060e5924ea05bdbb41ad28f9c7226964b4e6d8d7f0394cb048d0589df921e3e894bf22d18266f9b89e84cef8ae483e753aaf46fbfd516a45c269cf7ddd7d589114ebb72b5eda5524994afa6b747638ab5515899fd7f3836e1c19da5424ca76d68b1ddb35c64445d2c81a15bdbad84976a7480e324c6baef50d4ac614354562da3fbb90ebdd9e46b8a548ce3f739ed2c58983140927cda4999bf6fc6f194592ce8aede42583cc0fda00872892b7cda3e9a7c7ac73f911c4078e5024d5d7a510799ee3eb1a021ca0b8478805d3d1ef9019d931be0337700f30196669c0f189c3e189a4fdb8d22697930ef2e944c137c7dfe6a8ec9c30681bf1ee9e736ed06e2271348cfccf791944b9383451767d678d56aa0a6be9eeb1a9bed39e8a968924f3ce1476b55466183191ecb1aa2727d406a576fdc00a748800c72512b3a8ff7636a1afbf320e4b248ee9d379aaa70eb319e0a844e257907d9a97478f7c83f8d9c1037d901f3d80f0013113e0a044f2eb7576516d52358487631209e25b45ae846cd6f88fac251d63f4184307901d6a85011c9248d40d654a89ccb2f1e60fac40070b704422493de8783acb961abd8144e2ef8cc834bbbbf5f5c81a8e4724a758dac72fc5c8d2274724998b8d6f90b9546fa81149be393fb757fed7de302251af636e4e794da86c2e22b93cc70d3ae615df2e1c8a488a31a73e2629a73e7b811180f141caa8000f1c89480ed6e6d9b94341d28e11200dc4470f1d85031109969afaea2b593c0b8f8ce13c42f0a8c70718711c2269e4f5935a98abc5d8c81922b1539ab9f6d3d92c7c07e02844e1c2e4ee4633ab352d34b8a670dacb4a5bb6102249a998730afa3649d7b8151c83482e0d691e3f6ebe9a5dc9648411820e8071811180a106091c82c8e2d27c66c9b766a994f53288f3aba040a8a1630e2ab545380091f85eb2255ec5f187e42046a7bed1666a4569640d8de13ece0f09ee9afa83e84347da1838fa90e079a1254b8ad8ce4138f890148408d35eb1ded9a2409c870c70ec21b1645c8b9e3fc907ea2151e6f6a3a634cfe5d991b53c5f83ce43720c42e62bcbf191351f621c443f40b040c08187641b0b36b23fb4de34f83b7f0234e0b8436257ee985b648cd59eaf810e207648ca1cadf24f7a934af2c45187c4122574a5cd7055560f1c7448fcb8182664a73b70cc21398b4c6fe721ac928e8ed1430c317a1cfc81430ec9319ab4636a2fb5d11104471c122ed33c48d5ca61bed363070f127c404424cd70c021a974c8144f85f88dcd190b00e9018e3724e7f69bca7737a7dcc2e186c424ffd3c4eba97d8b99028e3624bd7c99d4349ba51a0e3624c6ea6f4f8d13d5682601c71a92928ae577e153ca764135246beac8d018eaecc29406c643c6ca3cb52be84ecaafdd92abc70d1a927c7bcb3d6f30770d6dd0230c11110e028e332476b5e6d8e60e42df3743c2e9684ab3e8914fa1c55186048bd1c5649bf6dc11e12043b2c8faf7a4d1d456501a43c2dea8470b131243b227b3117fcb398d586148daf06d9e73d05a62461c6058bd5a2dbb9d76caddf9e9a9a6787f21f12c8aee24f5ac620675117078216975db83ea8caf9d3e1c5d48bc59ed4bdaa466ca300e2e2477ceb9cb649d829e11c71612bf5f652fa530323e51c0a185a47917553ae63658d738b290246543a9a4468af031b180030b4949dfcd69d2b3530f1a594bfe3ccc078e2b249b1853e9664eeeb46d85648f6a7bf1dedcbec42a2458ccd83d9695f4da4985c4ac2af576753aed06a7b0a9b7abdca77cbaa7bae8a8bf1ef374c998944292e7672e31511ad584ea7aa43134d061e088428299fd5d7fd80cdf1428545bf396ad522c6dbb8d1b35cbf3f5389e901c9387a698d059c74c1c4e403cc3ce2e7dca75d8698c4c173f7f88ce418ba309c9b3b1e49c741d516de631139252f2941632ea2524b99545fd6fcf399c9490945468dc706ae248425229999d338ccc3397d5f1a3472221d953a78f4ddadad9a32324cd59cc15b7a856992dbb17e03042d2f6ea7930b3cacc681192c4796985f4d2c81a0e2224996813ddb71ed56a1f4282a978bfce0aa9715c844308c93db282a83899eb2d0c429295ea4e41f907115267830308c9a37a4434ef4dbe4407c70f92e2e7354d953319fc731c3e487c59bdf3a46254c78d5e24e60d9135ba4bbc485249eb43f388524a6c5c706317c969c63b975cb0f07f1959d3c556962a33eb2aa5b494a278f88d3a0d2bb9749d7023174929668d299b3e95693415841bb848aa1c340715b7f3e4bd884809e1c62d92b245bdb1babc15c7b54562921793fa0f62f92d38b26696871bb5f852a9ed50f5db392dd0ea243ceb8db0fc8cac01e9c1e3ace92c12ae457967bd94f5842a8be45c95cce4084f6fc4a20a0f378d9353bb1b718d1dd34d6afdb47bd009f06091b466716a5fb57ecf72e315499e2e7ab5769f503a73c3158927e2abe64e69ad76a3155dec388b5e9f25963c3553787fd1fc51d939b322d9742aa5948ac973c8e5c62a9244b4898a351f3bff451549d2caf3f2c69c745dca8d5424c99efbd813a96ac2bb810a2c2e556cad60f6552a5f29625398ddf69a7d8a24257f63da7c124a97da144961c4549e10a5f294578a24511fb4ffcd6d65d7a448eca03cf3efcbc853e128924eedfc6596d24b493744912cf6b9a6629d5024c5f84af1bf9e6f470514c9d9b39a46b3b044e1c62792b357e7e597f7d221f74452e7a4e1d162b50521fff8201ab8d189a4b09684a61e519a152f0c6e7022f97fb6928c5e8c79af1b9b4838b7607a637742a5a82692532a1d26e684ace94a1963b88e1f3d108d053732b1a5a5ab6469e44e5d3cb3b2a5daff8889c4fa6cdd746ba205b9c16318372e91546264d20d038f3aa8e4efe50261200e8582a14028100a8443fb59831208001840240cc6a2119160bab413001480034f3c284c3c3426281c140d0543d140180c07c28060201008064281280ca2380cad8114ed01832a2c060c476844bec7dd411424af1e481c3185eb7a50da742b45a4365aa7bfa8535b95b46ea42cb19925304e5646ef93dd7d2a98011b31fbd69201cc5360973d5172c543c485e4bd13a525ce840de83fe525255b6947d7c834a884692aec701f804b6c68f3f45378b0bc2520cb9e3c10bbc9e0f848ea2f675628c459a398b0e58f050cf2d083c2bc288a877429fef20d1b34d5d1bd1c36dbbb122d86efdc5985de5dae2a16b5f9382ece44645812a3cc887ac6e6015e4161ac9ee3634ad80c0fd5eae18ead6d5dcafda793ec2b4ab96bac37f89784355b63931a30476d497c729850904c1087c756efd5fee756f2501ea332f6888f9173c78dbcfb376245adb19c4f7ee0b9254a6685828fb790cae5ec26b13012bda9f02d7bdff7ce84cf2a1e165b4c095f072ac890d27e89d29cc41992bbdaf97fe9c28b204e86fdc033e2bb0f24f5fa067b225ec426e1018e926219d4b8547001045772d2223fa2825ecfb84c9f1644b1055970d49d1968d061839d3624dc6462cfc54bd7ca70a95d29d3d76b5abe07f4079196103d090392d89085c6c5a40efa41ead052e4a81ef9e9b8818b2da3a464a3e91fa653a166be629cf1eac024b7b971c984f15be15040ea5cba8fdd6041955d8f5029498e9d5adc8cd4e8f35cef4dbfd5bdda64f32b6ca08aa5e5258809771ebde5dc19c1887d8a010e161a917f54800000ff9620a766eac6798e7634d23763a1d20d6a9d2fbede996d50d82ba5e1e227f7d3db970da40dc8b17fc419f2e70ddfdb65d3f1b2d399c856ad423111181323a74642488abebb595b9b33d0935acb189d8ddc48b7c057abfe702786bdf4dc82b313604d1d67cbe07aec6f8dda01e2a9567c6ba5f66c7a4e65150ad2bf8418b16e68798dcac46b131749a91a04061d7ad878df9439a3e8f3074de652387e441883c20a6105b46792bc17eff7f7e2b7e6eb387e152b63db57f30f6088e56c59a31002bb378f62153e8bfe5cfecf8368346cbf7e67fdcfbf2686125b0f806f51c9ca94c2deec086c2a70d26640808c6da40fd68b0aa2278b5532f331b98b9495987aa5e4ae4d63a314cf66f23e8b5edeceec9a7862ec7daf5a46d4ae5d711be3f08ed5a135e10d648471e247130af0aa7bef18fa47360faba7bdd83a8a3a006df8bb30f3e555cb4974ad4d548cef2f002ccf9b597cfd329e7f95d308cd91c355ae877f8934a5d5862ef5b0d2359321e2f0a885a60d48ed92c4e79110525356135ba15cb88e7270a956b32f53cce8ce55a9fe72df11781b021d9798b9b5cc5aab9b176f0e8dedbab93845745f515bc97a6cb8f4ef7de879bb6828bf58e61f4aa14d84f9087454273303181f543f8658885a2b89c1430d8afdd6cd617a51f311f1aa5a6aece858c06dccf498641c5d137b02a3ca7e09212c4194b8740f5f5e48431c10c26d164eb98ee2e0077a73dc9f0fd25211548def356506151928ddee100d45d706e2000e5e10e54b882794d89610628ff48e9e7002705095ef3a1559495a5071ed2240ab5641fd9a84c1d150378119a8085a950a8ac211a20d679d89c9e1ced7a53257537062822fd025a5c13049dab4dbf90d309ef945fe176dae79625c5cc308c0d37e8bc2d2dea5e086b84714a1c75dd173441ef8563edbf2f945da841f8d8f5c855d1e6186a9ca25858303cc659b9c270c2955d65d47d32bfeb85123fb69a2b36ca2d13fd5195740018168a64514c53f98a6c848a79e2b214055599dc112e09bd4250ad9834e20f3046c472b211e662870861f9eac8d55188a50e9ebc30ed7e5fb38e84821dd95030f4bf06e08f6e0edfa4a9f738d6826267ab10ac93ba22f476680f6e85729c12ddb08e99daf6cfadc67b07af830447be4cae9d62e51988a74fc5a314d68029798efc96412158dc16e565f805d64700be22e35ce2f2f85c5ae211e11fa159e05900d8f103e67e9fdb430f55de3634d7d549560595b5c6e765b769731d4b62de21b629b7d0026ad179b0c6543ee95a4cf9fcb206d3a0eeca091af06366b87b308e266f2d1163c93045a288b04f984700b39493ccfa4f51276d993f21785e89bc9318a401a09a9ae62de3c163b4793f35e585f477a1686c702729c784067108a48d98f4c73c4fdc8b722b86017d022fe245d6ebd107e63ce8d34b96b16421f58327cd8152065edca8bc15911b4fd21ad0d8e5f278853e726fe2cab660c780a77f8785e6c9cfdc82ef4ebc6fa563f5e8260a32c5a38472384b51f49555ac2ceb19647768e2fc719ab551495d2638ced0e46483aa05f4fd6528a96b2146cddffce4dbe16998aff9ebe22aaaf21b2cff9c9ab9ffdfdf09ed0e7f8f0fe031b7b5ca5219e6a83f1a33fbbd474f00838a6a670f57a1de1ffb74270268100dfc9204f71517cdd6eb54ed2cec79d1ae7e8d4f572d1c12d6b7673281024986f31e7f715a58699626e457c2735da4dd5f7153f06e3a9b049e479756e70a882f6129c1922d361662dacb0269a98a305a0b48b2c25f7ee5526e73280a92819f633549a1f8c000acfec3fc1562ac14117138237b7af0670004c6d5b1e61e4a4cb6705e0392d24a8356c2d6a32643c6cf99d376f135f11098036a98f3dade7172bf3831be3830f0bc2938ad0e0390423822c97b5be4b11622eef89f740f458a22e6c1bb9e9514d89bbeb4dc035b7180882b4ee5430676415272bd3494e3d767c2362abc121c1ed57b418752d34105f74f0009affc7eb71c35b97b14c316ab54ac85d7d31fd468d2174ec4a4841313a4726090135ea0c39bd9fdf79d6f18bc6a21417f26f61aacc0f4da4ab5895d73f8a34dbefb3f7184f041b2fe0986f8579980c44180f5d8ff92b040e0e7aebc8025901364f76c279b3079f8f0773b6e2a8d4ba9156469f284f6a3075fcf4669e5d474f3ca0e22d4553e54cfe132f44eb32ffad4129be72ec97d2bf552886da38827f35cdd9113ca7ed68e967bc30697d032286b011ea122787cb6c3bd7b84e1b2a48db7d4aea22739ea4365e8958d833113241991078f24c7ce7eb5337424f3924509e9d305c5e051317219e8b3d1aaadd4c498329cb775b9bb45643caa5847f5e29c471429e6224387ccd3939f981452f511b8e264d2b6ea5422f1956a83a2f330a3e6b76a739de5ce5b82f1e5a30c9dc8fcf84b663634744f6944caab48fb0a04955a4cc3edeb117022b2040c32bc6b44a84794ab0378a52e2c299f6138572879f464d3d448432d08ddac7a492696da48e0b185e06eebabad9cb773974d65f6ca18092467cb871d4bdb3dddef7248406d44c13014e18b7c7d33357482741df71f2dcf133633034d3c6c12cb1f0f3a9babbb10725ae1c0c29a024860d289497f2d0832e8a75cf8c97aad4328fd5084966bcacc3c5f77dd310d9220d3769b545d5215325ec28b89ed154a67d11db5f2a80d6eaf251419c328f9069406baf2e3b53a50766a8423ab764cf67ddc7403042162a64bd2080edc0201dae23500fd2dce6edc8002d2336992e3a8ab4e34bb2737ce54458c224094dcb9e6c6bf51b497ed2e8ce26dfe68b3fb9e32245bc06616ea33e6280cf7514b78acb7dbe5ae7de6c37aab96a328779a155429aa5100a99b8e582e2e4070782ab542530372ed0cc4709543ba0eec298bee74a0200f4b94f2fe64a9e5e31844601a4078f383b98a8e18414b823677f03afac25a293a1c75353992a09edc0a1736c68756b79a9b7b85617237843bd168805bc8c62ba699b3c706c658517241b82bb89e695dd5f2832215cd1b9d9e49e397762972d0727a34fde503574c17d5eacc2433b7769f2a5a85653b8821eb13eb022941d7691ae93e53665024b417a1a7f44b62005b5527b647e7d3befa8df24a5bb2c4c82566dc42305ac474a4c16d0d45171c25875d2a229f984a1344a7fa411bf3370108626ab9cb8462d220713e69b7c4ff53ed271dc2495c8e35ca438d56166ef6c8527fa4a77171d833b2524c34ef1e43f2259f23a6683fc10b91cc2a5725e11b97777481183a21795c4ae20d298907745de9c5e69461d457d5ceca3faf20da1160e8e7f2643a01fa50b2b8fe0a1a296b43595fba4191e3de86672bb000819944fe6f41430e88e1aa4404d89b1c26a038b61958fe5dcf5883b79905858f6f357770e0447f69334c51ea3c3fe32127623725e19873306d4cbea5ab85cc114bae8ba49b129cc899758229442b85ba9d72bac94079867f5784e5dc58aae18017a6edb3ce19800dfec6c84f439b0e83ab2406f2cac77165aaf2c8cb897155a39ea4544ec6ae9b4d85be1cd952eca1d3b56a393ea4d27523aecf94a809de4a8fdc49ebf60108449b4d785bacd25652d5614712c53cbe2144b5a53222d0ed4ef03833a293a70ae64f778e8f9120734b4007eb22085f2f510657026c26fd9c98bc70dcc241082fd78f443bfa3917b03fe453100f89ce20d17042c488c303518b9d8bd6a4bb76f7d469ca04172c5048a64f1e8f22f8401359b0eccc7306151fc00fe9f1ca08178c8914e0641d39602c136f59d2bd9786851caa05702a9a57c0a8736ab6e06e34abcd57907f7bd76d58018eaa5b0ec9ac4970348b95365a607d22712ace0360799f186d48026cb85af769141bbba7d05ac8b8fa7776ea14408eb66af524fa65f6a1578f7869c70aacc992e7cdb26d06284d3ec74edcfbc9fe58ad58ad18d2138fff1ca18b81a6ad64085362862b050e366ccb71f206d578d91e446a1b205a60f0f8517035b0fd9401be269ec3ac555fecd2bb7ff33a406fce970c87fe888ebae20610d30af80c4ce11c3b01b1f77164d7dcced861502d98aeca601f02baf97b3b806a87dcda6a5fedd26ed5d3ee7666b33c0ba3594e425b2c4e430f6686f46fb487c7aeb393dbab2255dbb9da2a5364c9067cb1bca69ec4976ccad427b855bef0977df2801c4b8a5a78dfc6ac8f4ab46b1c6487c2b65d40d2fc87dfa80a96af920f5b11d2255450aa75195c4f7cec00e1670e9be67e1fa9b1ff8d53e6e474ca8b92e69807f5d14eca4f7d03f539f1027210121399d00795d7d26f3b02dcb040a78878747bd4bf766fa1bae744f14c34b2d2dc5f4fbe202e1fcf8765f84f4f3697c083620256978144577f8f3608f76113f49429d04336448f88aa1d21b614dbfb11670be342d8e04747e42aaf79150d52b7f014fcc835c8585f07f61b1893c96e035bdc810b9c78451802a526c610d880c3fe2b4cc1ecf42a01712cc31000aa4cfafd356a768c71ce128a3f7185f89289b6f1c0edddac8c76646716d70ddaef26ced45c33a48f5801ed4105d135c5367b8dfa803a326315a7a74f6ae3327dd61cac7c0b4a922736e32f8ac308124c26eec05d4e60e83c1525c697a36ba04c97b66555d8c3bf05dfbbb04be8cee1c8a82c5fc8da0635877f76913637c5284cd9856b1ea501d07895f49b69d9790c3f5ae015bf563cb2a088f5c1a26f15062182111b363f1443882c80452c48060906a45c0448582432800ba02751202110eeb17619cfa355fa2fdb52d1d642bcc45a460d97e900c84021e602ece33f52dc72bf80dfc3efad6975849c88224d9d3e00bc77477ad87d6b037832a2d5abd6533c61214e0652b235303e529576718035935d8bff911ba14f660ebbbe95f5cf9c5e1f66d0c7389d8b4c83dab26bd4864b3f5fad24c910e169fc5ce3d22451e46f83782298580b43e5cc7e79cd12ecc79ebaf787222a473ba26aa66456889b4346fe2de344862ff41374250db8971520f88f42a0f6b697674e53091d239f60681c755c8feaada20e1634fca3eba88ef1ef24e11951f2ef899b30e37139f277cd70e2cfba4bfa7b835e5b64a17b51912534904c1469c9687a87a7af18293efd34a88c2314197d88636e1429ef1c4b4c53cd409794479757564a1695cd0b73203a6d46e31fd3c0870eb1cd05612f2d946b823b92075698e55fb5de37ad12096beb33fd2182cb72ac760da4a01720bc6c666738e049b0b93e26f8cc0281eef440ccd9686f6f0926e40ec56fd4a3eae80c7101e681832001f9796a5dd85233228f5b474bae842c57ac9f5798dbb961f9ae6dea051de83108554170a3c7c3e688177b04d40a4b79d1de52c1ac5f80879213a4fd17b423e92e27a6d2d5492b8a343a1c721dced674acdeeed3f5dc8331fee90c5c2e849bc314ef8b35f779dc37c400d557da8ba52869d8c21a7b3018cb1183b8a2d34213b147062678d104150f1f1f837c734478de1440902079a0a6ebd9fef4183f00212418e031c8e0b3ab1221d968664320c00314458111553fd27e541f365f4f51f8a2497b142cac33f236592ea00d2190a7429cccf86c22092fada09f13db50cdf5547adfad322a0dca954f0f22c1cca712987cf681aeb48011651469192219a0e80498cfe50b1360c2431ad4a55588329f6f662868cf62e787e4d597ce8550d19acda01189030d53e6c976ba6c71f2746964a5e393a84128ee49155da7901fbfb6e114cb32f80865f5987d0df41c83ba897e16067cfe8d68e29a4284e07d87c441c86cd3d2537fe017ca3f3ec1e38705c90d6b3aeba5c73e40ae2d046dc8dea3895dde84f5f9732bd6af5c09b13d02264029b7f40e543b9ff991b260d7b6d4d830944461d290d6c508445d966a227143df734c51c143438aeb59d2358606b79ab6993d0cf4aea22a5665622eddea01185d71833d74aea484f387eb1eb01f96b0248977f41ffdf95f1b3249e2c5f8c9147ef0b328996fe00a64170e1af43f8b099b8a05f667ba3e933130231224aa65cd85dae5eef1067a7067efa5da57242e82b3429a266ad52865efde72688630c6e5b07aaf24908e6a468353a4c28c37a9605ade14e2f2211179db7cf66d3b6925a9631f357ecf2a33633c0465818b2e79e83c7eacf401326a74c0550b87f173128da09de5b816b528c3aae38b2c5b878fa7976e5e7503311cb612646b9ab0dea340dfeccdb6a3a832e377d879161145a16c9ec12967500e91f2cac7b63d88f1c75f149878ffa0fb293f25559fa651a18d4f93cec95088ec5d0fbaafe683313f10f707519b654b1836b2199311fbdb443e760c6d8e7f84bbc99952df682255e8daa31c1a905d6d084fcd139769393f2425eb3a5a21f3f0601a4a978527cec55fe7bd22c04dc47d312de9acba0c1a7794a198c04140a4d6ac36b6d1a453e7aefc9d6494f6ca38cf6f3f059cc8b100972ceb3564a1d5170a37320baf9769fb7e1aafa0692540283e270380ff10fb35ca9db315d1d21a1ad8a1ef302a0b48d0189d9399e5a18a9de52804f9656b48fd06db17e6a7af4aa043576ecd26a2d5e383b74948e7db45b0b60697020e5149c9865c623b3e5b183171303e505d972aa700cdaf71349d617a86532498bcc2b8e29c43a3ca3ef48e273df8d94be17d9462490d41edbc376afc4652eb0a06fa1491f34cb89cbbce0d3b14b1c8b2db3ed86e730c9b2e3d0740d0e21a614e107781463d527a6fdd1f59951e4a7868327004ece88a8421c0970222b5351da5f06e2d5d04bc5e581a4c7e381364000a74552b96e0f01904a643da78f391d082f5d2ad206108667b72cd14a4afbb4bffb0ea273f3df4e1bb48d842712bdd8e985555ab3170235413b20922c24267651c38c0df2212914711808547218c9c8c93f7f8bada067d3204c91295d388603fedb7e750867d78c44c1fa31f46587f302359634b04135b424279cd575cf91c30ee9d5e2da15dca432679d7035fbec611b5368fba98aa3ec4016f02081b76e0d2fab390e244b19560d241a3c1c8034262310794b7683d41613928cd5aa52b45e1f83311841584cfaebba21b2c94f670b35cf8737a88d64ca91679cc2c1b2eafff4c8eb64fa70798bbaa3a2983c084d4c162fb84ea23a70cbcc11a382bef19c710c63b642ec15eba31e3c42de15e60baa05eccb670e56953d8e7e1cb9f095604c8aa2f34e65fd9b4e16af18e3832137a7253d7ec4d3821c0abefd2b31393220b88146a7ec2147ec4a5cc1ab22d659daa9a853b3d46c38a588145b40db5d7fa9e146093868bf8988f068d00e899cba466552cdef5dadda8a3f1f10ef42e3f5506946cdb5ed51c97f152dc309279b48603fc3df3031a0ffda521b91c4fe766f98144c4a8158f30a67bf6096d20062d559fb034b45c52fb72a43afb753883103f26a5c11e0b7be2f261130f4e035e3464142ffb13efdadd63281e0958c03b9a8699b7939f0c61257d22d032d101e59a58664e9d98f76d4026011d5e415c1966cfa8f35d2b53afea9687db831249e695d9cf06e2e762e051da789152a1286d66872b7f3eb3032e12ada42f205420ba525917d48bb4cc8fcaa0e1c47aa0f847535eea2bdb9f1206f2c9e8b28e894a069d9f316ccc455b310b17da74f78e4be44a00e739be27a88b5ccaa4e81d615dd98cbea4148b3d043eafa1b5669fac119b419d65a5afe4c19607d30d02252b758c7b57ba06770379a425bcf2df70e92bf42a82e10605eba873e955a9c4be255a4455e985b755cd053c1bbf44005ae9d2115554fcbfe6fe4222996da5e326f7510590c252281a00130da0ecde049339ba548d9dd1b74d965b884c04121055fafac9fcbe41ba540c70670234dd34ee36675bf2f716010595c1d8d4f12a5bcf343fe09d0944867b4a9d381c48f2ae96eb8d7c1501e7f648e70b3978241a4bdfa126a63b9548b6c710900bd623c7a03ca470387a97ca49fb70805a07caa95cce96b62d0eefb268e9e5356902fd59aa4b48b7f6a8b2e6b164c8d161934113fea4adf6592b8b9e5be55dcaed73609fc11f291191eb7575c229f487bdce8347f1ad947cec31437362ceaa45d372aba20d09345b99c891a4816d141eedcb884bb41e4153cbda7a1a3e37ee6fb55fc30006d2b7bb4bd45401924c12b31dbf0b65ce34dc1491db6cfb2adaa160ce308d6ee876fbc8ca96a8af899080b8af5ebd7597b3f823cb10916e3ec80c5a64e1d374c7368c1b46ab6a1bba8b79332232bb6a413a90a0f2c30ff5713ca445221a0d00833f06dc5fc3bac0cfea4db81869a7c8ad925f05d93c04c990b5042cb0ab600d098cf6192f966454f381cab440885f7a8b0b4ac96a88a0b698492b072a63b62f38c9fb158d14b20aa704b725b5dbd2b455472d980f22389b442c759d4f2d36175a342751c9052f64448d0afe0410884b21ff1fb3ad0f226bf1657cbe9aaec5a5d66fe97b535c8b13eee2c351a5250950b4295491a4cefb3f3974970d0110cc9dfebf0292a81a8a63fd87984b9d711d8e41dd184fca44d2dee099243bf4eb3a17cafd1a6ea5c17f9e6409499813d289e4826acba0074203c0770a5e5267e552d969e1bd4adeb7dcdc7e684bf516d9d55798f1188f6804630a5faef994385de6125ec0f3e3facd02a5b6e06906908aaf0c50aa0f60b89faa986b336c359ec880426d4d4cbdd024528f48944de766b7dc94db4e7333ee4de9c93f7d741c6aadfeefe3f976efb12795ec937fd2865314adcf5e4f766b715d4f29091d7eea2e10229a12207fe56cb5728b91fd02783255301b74bff514d75cd6edc22882ec6858946bc37cd229169a03626cf7de4ca96125523f1fd59348aa9ce19cdd7814a6236ef83cf8c2ae3d5966f4b1ef661ac7777a49a0c9ff734d54022c8d1418f38b1144a6202dc1b80698d261b5ced2b7356f0253257cc125fa1fafe897a6c50000558ff6d04c851f419a248f4b25d1de121ab15fb62e027f45526c56a273a36e08467815cba75a1b3799445c7a34317e5503fe7c76bedac3a7ecee7a604720fa24b01331c17f6191dcad8d6019890528df8bd3098a3eee58c43009d18384c1f57a33dc9b9b44fdd22462ee9e740e9824f8cc1f8d9cecced529fa730078737d83ca9386de58034e3eac63fcc71f5a64d84ac7a85c032f46df6690ebbe3b751ae7fdfae24a4e00300d3e359708d1880370e7ba363d9e6dd8c7bd513dd86f80b997bf8057566c2b403235ae980962f7c03c12072bf6c77ac02483843db680c302f1fb3096afcdd059e75704649c1a323ec3276e08b17e110b5b8fffa0115da181e2b1d99bddf5960eba5b70a5ce4050da2d40b58450cba0a607beab561634b4d59480d6d5d26e0c7a96029c232ed1faa27d5e0871b32a7ee797e563df1fe4baa0cb291674c0d1cb5cd3816b0bfe1bdab0d04dc4d50792bf712385e1f4778479f8505945b153ca21905ca1148a2adc8915705a2badd43cebc76c8aaf5a95f8c53139dfc8505f955ca6aae603381b30fd7cc104f462051ba02c625cc2c9b1593322b5502debc9dff145c1bbb5e5271ecdebaf02e972327e44714f614836981b29f68a1b94ccac8676d473c25490cbf129befb6f847779a45ffd65b0004a90709d8f211ff852a7d64e7554c00bdf8bffc2a7b28fb7dd39decb2d1e61e3246565af9c414456f254475b367804be34e686aa16b4fbde11abde5741bbc19059d430d18d5649e64c3957a78b7fcdee177ef7d9cd1bf0d79bf2b590c73b6a1a17827f5b12070f22edd98856b32e703de0bc8313f1a5889fa153d1d9120fb0e0f47f9748ffd9470affc4a83988df14e87fe5047e6a8b0f9d492e5a44b192acf168da0a5ef2a5251107801e2710f182c236d034430d990e62b93862d4ec7bf41fff26a4b28ca75b520aaef62bc744acfce35382130f55786912c59d36f317102803fb584024ea698f388fa65ebfbc069f19409b4d55aab008e47b6ff9174e5618bde14c0ae8d4a4d3922f7c333ef3e1313eebd840fe441b538ea6933c049ef7056d9d05bdc1921de469505f5a37c9d62ad45f5cc139667c5208b087ee228dc63dc24269de7c9307524a09d5c287ee6dfddeb2248bc25d285c7e2bd3c3590125a1e0bd5ff41c30ad99bbc43138ff0e5f314d1c163d270681925e8c84c894cbb883a353d073e66992efc86f72b987c73062a708e7764aac58b0367b591794b8a686817f8a559fd02c93dcb8de537110b73afbe4db1db58785efa83148a15b656a3730bc566f7587989b19ef95f9b0b9558e823a68a7bd04524609177f652f6075014b4c3f99bb6d78291b2e5a9f51a0f9779d3b2f02369e82c998681d7eb5b8dbe6d2044d9a769e60ab396550154439dcbc7eb0c0178b8b54737c87989be0c11c819d9e6397c0fdbaa2b179ca83b235f4c040db4dea8f6690e99ba0cfb256943ad6b21b7ac1faa7bed5d419ec4a40018dcae2fb949947c81eedb74b5a2aadb90ad26a1ac9052af11fa5d3135b9fbc4fd3278b841517cfc3762a8902c3b38306124ba7888698ae83d576f521a1567060e2994b43c6a67dca16a10fe0883ceaaf40b7614a8f4e01f4d4251ee18292b8d951e413b5073e4db7fccf2de48ba1f1192d75e8519b4facc6694428c8582ed3de014187ebfabd9aa40d78736643c21028a6a649862a0dcd3cb804cb9bb8ca6a213e1bce8571165263a9ea3a3971d935b13c8bf527225f5c74c6bf08b45513329825cb1a76bf3d6bbb39126d3343b41910d434cdd44c324d7c309ed47cee2294153dee3fedc1ba49dd916c54d211f4d88cf68e2ce206f1d50d891126a6a51a6771f6ab4d1c7e190f95eb52eb51cede439e49dbee06a3790364cd78204a7407c6ff4b55c76023b3ac9515040446f5da75dc1079363994aaa486a205201cb71aba281f8e7d12e4ff5a66393d59547736e6275d3dc594042525e0dfe934dcc925e2dd85ddc992820193bf41155dcc56e229253a68ec2988252f0beb37c4ebf962a2664dbcb61615c7679a45a3e235d4ed5b444e40d1a7b06af25f4333a9794d808f48fe9390cfb204cce2957e0a3c1e9342f7064e97221fddcb8b99d615c33d4e10cc05d5c763c871ddf651abd3a6ad231a902ee453bcc8960563cf4be7f17d85bd7ecebb3d2e821fc12b10b45a4e8d6a304d063bed77d2c6e53986fb08a7922a1081474d2864d7edb95c003d94eb3de10025f3408e95ecf0720c7eaddf0e33020c0d5f9342f594e5e6a3873e02af9a70ed0009fa6fdf3a0a1847fc5f91a119636eede3bc20f453003b068d4d900a59a4eb43cbe7e37c77b1abde5a5883771950cbc914bd965982e2b0f38e9cc7ed69eeaa9da443cf4bbf75d8c30cbb9d3a8bad6395e00cebc76720800a3d11400ec3a2c105e13ed48fa491637098065577298660a503be8a6e90159571c513195a2c96badecd852996ac3c8de81ecfd22df181df0e64e279e19bf4220ab36810e110ada24a18e5349db3598af040129caeba1af34e6f6f0d8346b54cad939e72143a45688fe3e5d0aec4c39bf71f47085cab43ccc977079f3b64520b8d7f25280c9ff212990f211f3a00bd71ed4363361b48307bf1feed3cd8bf205ed405a158fb82c3ebf16a63c70cdbb9dcf6197edcd36d71a3c8eb13787a0443c5c7b2ad7aa0e2104728c5416375477d7d19d7ce87ae67714c8ca5f63de53fab8701988104d9b14e4b267badbe2056ff638f0cc83a581e7eada3aa238af42624a8b4f2fa0270128d0d6028ca11451ec63148626872e2498fa1d1b662b05da88f6bb6a8efa75fb7e3c969f99548c72ac61c47b9dca183a4c477ad02edb165e60b64768d4353606203104011d4d4e676bd374e98e6a45520161df5adf52f46570d4641e4f2414fe6066a8eae3bd0dce9dcfe12f6ea627c5a90a77a0e37b4eb904699ff8704387a3a80b89ddadbacae0d84e38dfe128f98dafb9e5fd9c38ffc3d4e592425e95eb745a5b1952e36cf1534919918a0f5ae9c934d453e81386c2dab2fe7011a18243abd8f43b2ab21d65b8e84cc081ca68c6b9bdb2322811f109687727929988a85b98f44ec34971ae656d30a7a0165d071c553ce698f62b6edf5fc2909168b0a08978542180df61088446c48b9615c1a8348abc5a1d01f48ed199ace0d705d7ab0093e421849092284c9f820df66c66c5d4685db9c7619971ca47d47693820bddb96650cfdc515d7e18f931c5c17409a4dcced9efd64ebff9de5b58a7b73480b3ef9a486e8ff4ee621755b3e2cead444fd13aadc8c2ba8e5fa0ec6ecb8842147e0fb500445416409518d2242a50c1271e14fb0ff7991666bd2a671227321997caa9679acee94cdba6b9c266ad42a569c259507071a5492a6d436f001c7560efa21011e9e90fa9f714a2362784d227b2388e0e874691dcd43e88fd4ba68282cac6d6e7b680d5b1053c490841b640b25581dd9d04ae6be10787b13437fd11b759238dea57a367c5c57421ffd954069d7af205fd0e932b07f0b4774850f50bbf8b37e1d569d188f1c27a53f67ad73b68766ff00a8f1cc65f6fe9da679ed9a2803f0e267fbb1c74c79d2e70153ed3d9915077a46a31eb3e3ebea181b9c5ac067654e117e75c4c48fd46e6e1ab51acebd2a99cc7739bf5e2af44cc5629ae6730bdd1eb96abdb162e236a988a5926e3cc7f6b67381de4ad1d8b3349281c6a77466855f60d9728e9aa8a6765106b19d216823eb7fbfed6830819b5a968a4f38d4863fc63d4a63ebef40d0c47f53a4e02ef6d6bb00859ee19a528f2fb88e5832cc9beabc0d4838c8c150ff4202aa0541da1d022747134a422397a70da17283106c9622e3ff285a51e812c9afa4bbaec0699b69345d2a01e8fa97f21c80dedbd46f66b189ac0819b38be28a6ac370e0d32bfd0316a8536c16a7d9e1dda11717c458db0c449fe0f00196f24dd10ec23a9c42ed98e60ab8757aef4db3f0c649f87bb5116048063e4b55c929177fdfea114c87212c52bab5fa2b3e87e755c1ec3c48511f2f7e13f6842d693dc8493f6131663be7d8e7131e4e0fb85095c6fff866dc685909860964f1c235541ac311d02310803b2466737c0485ec8ec05da0cca3fda1efabc09b46926c2f87c2c244bbbe08a82c94bbe67c490f04983cbdcc5f34d0116fe58cc5eb3abcd5bac7aaeeb6ea2cb2329b18c9159abf64d6f22ae82e0661e584d27f724310b220168c07a243bb0e5773d87bb36a09c45d0eb67e6dd55397fef7bbff5d80ba2a87cb4cc896846906b3aad863afb9f155569a84efaa1b459297d84600adad500dc674eacae6c45212a72863ccc87fddbdc6796cba5120f4c545e2ba4f0cb55922caa30ff016d52aef9dc6618740d34327751241f671919bacb85522f72750aa3129798aa41190905c23de67dfef0c656c81557c381facdc6e8f58b905bf739da1f5b5d79d190d6e600eea419ee78341f52158d45e6260d246d4a41da17d4637fdad14d86356ef5bd720a98c935a96be083009a96327dc88450e08b689d6fc62588023c7a2bbb98711b9a95dfbef467bb4d5de1e4e560d480cbdaade6c20d1b1fd560d8c478608a29ee295c63cecc5aa3276b044332b51113a33c8c41ca00fb8e6b6286108a36959ae642e1439f040d023e167e43dc70f81aa5fd1a9ecbae0e797e48a49784eeeb5b868504d93a47aa1263c44b197774740debae85784aa36d867b9eedd19dcc9843c62a0de0bb1ca537edc704fc3521727878357444b0cf1b212dcaae71155e9faebaa9360a60dc442df86e047f5f7fdd558547ce6ce4a64c795782bf023d443e8992673074f78f22f1a8a2ced92b85e3625c7e4133175e6dd40583da31af086e07639edfcedc3cd1246c2c2629a0441ee9fc9f8ac430b1761be4e99235e3cbdc736218297e0bd89b6ee668da3d4633e9a72a2a67447ec8136649be2e6fc0e9124221e936fa29713fb92d1a30f14942d66d24d0063755c3c488b0dc6648a94a0a190d99448fcc4499ce20006a245cc2094d0b7265a5c203bed4864272de200083a14b63623a0a50eb452c007704ce8cbe56013b223590288407f8a9762fd8f16fc4739d7d941b29f5def000c490c905483a1a41a1c3bd2685b1018538400a548e2d2ec4200627469f111d551277e84af3bd86530896d0d3cec9c194418a683f541e29a57da85c524efba6f24901ed831aebba7a756fbd4e5b3456af4d12b5e0af5e9c745be8aa6f4f52b780d6be4d05e8f7a2384fd80e53e03835a11553ad6c343e2a65eb56d33a55546785b6a6a83032c75f6a23c9a8c19894b501a955050f915d62a9a58d105780cebe65dc6e3a0430997c84ce74282a3ac9f3045d265cb49bd6c63cc5b41d605234dffb1831b184d07698e7e0d6f4dbd4d67e2e54afd1ec4feed4b689d415ab1ba1d57847501be99b87949b23f1c6659f14a3f0a2d9244a1ae5356f4f045ddf8356ace1dfc04e5b49ed1a6d9c4972ea0741630bc633fa7b2b836298eb1fe779a0516843d1667486cc511ac41ed4efd2467078ef7af92ea3f5bd9d03b67da404a1b22ee0d90e836c78decc87c1b3cd48d4af6764eeaa9904d50f148e2ee88150e1ac13dc347e625855ff8e17df3667b08175c491ede902dc47ee442809ccfcd1edc51e581317a89952851c4c11d4f4ee36934e255a9b02f4819510d07ad0bc1d349b920592a732f2eafea7dbe9b921d006790fea1a482c37812b11cc638865169ba8d3659dc817949d761dba3a06e08acc88309fc1f79a394ff2cd739012d7afa9cb5be6c2f38780f7fe685e42d22a3243f62fabe1b96ac7dbe07605bd104d1e14d26999d75ef4a08f90c24e2c71c057942603ca274c0e5a59ffa4474bc1e88e3758e411b9bde41289c9b78e3b4983e1ccc544979cb4f854cb95cdca9e8b563ae958b8b9074864872be1f701b17ea15157a24e140c826e0b2a518bad5976324296c36db9b949c6ee8b2510196b840a5100834a48619ed0ce012828c0cd739c4a92bce73c83b8b85d8040c98b38ec64c150c15387b6c66da3617092cdc37f33a4cbd2dbe5202679aeb5f1c33163a015564ae6856e363f81ab58967cc91ad8550c854796e031597386f36e09af7d56f7c2f1474ca91e226c3d3caddd161e9b4feb2c6ca70d84900d70f128035c83dc904e673afb8d2c036d3500fa559c0f3de0dc141b5c5c0030cc30c30c33ccb0d3d2d2d2d2d2d2d2d25200075a23c8bbb5ecc87a65f71d5742bbc13b0486c8deb45396519047e61c3fac5abbd75ade00d800e000dc2af3fa962b11b13e63cd163eda54085720bc37a80f113e7ef0d676f34a97ddd208e1a089953a6ebf3ddbe55fef607d7ea764277897ec697466c945257c77b0fa578963c6f961b36ffecf9917b5925ad6baf6ba6f2e9c3291ce0b9f42fb8dfaa2abcad20526f398b5fffab6dc820f973777d6ac6cef166d0d76c01913b9259d8ed9ebf724ad2f26c2c56a93f45af9975d9c300ec6bf442a5773cf1332f412dfe7b2b6bb5d49593e8bd3e57d41b69e83dcdd9edbdfaa76515bbb56c6df6e35042251c7e112d99debb13bd77dce313b9c2dd1bbb1e6e7cbc1c6167b1ec71cb239098a466b0c3687fdeec16fcfcc1edeff9fcda7748f313523bed7a07dd4ed4bc798362523f27abbec53eff7f85d8720540c695db267a17b30fafbbdddadeefe075de3795f6defcefb59f6ae532f625b0cb269f93edbf6dc5c447afddadb1c2e3adb5ad622dac7fe795e978e4574f2b2fd66cc564459bbdfbb66eddf773e5544b6ee62dc57567aedad8c47a5b8d4b5fa6c95b3c16614d1d1b7f5dd6627fb9fabbe449d88acebb36ed72ef6ebbf9a88acd62a2db3766e325489089bb6bf90e16bfcf25b2812d14d66cfb9393a21fbd5d48868af74703e0e17b29fdd4e31b9ee19a3552d899476ad8db576ffa0f72b25b141e8fc795bc63c8e7d4624772ac9aa8f3ac796f6b46bf1386e8524b2f6af97bbd5fbb5dacf11d491d86fb6bd9032e76ea97ba08c44da3cd7bfca4b9a1a0455e4b9c7acca5b9d22e2410d619d1f25a4559006d290a47e301f4cf568c5e3dd626eefbd5bef3963efbed2065f76f5f9ae56cb415e00523b225bbe9a65552eea8c35573ae2b2b659becb3566bd6ea35039a27cd3d5c5ef9db7572dc4111963fabf9cc9be97baab1b11c2d59a395db5fe93ad2a1b913164eef0f6fa07659b19548de82cedcb36fbbdcb0e9a7378e578af5ed060c150cf896767e493b3745ed36106f4640a2a0db0199a39076a4ea6200b026cec8e0cdaf1913d0600984a37186a6c14a8368d80e4015963324d1d0100e449569d0136f224eb4f49a7404d800437257bf219fd0089385079328944aac60641812120aa25de6f4797738e9b57ff2c71c906ab5c57d2bfd7d9c5129f63adb6aedf7d21bba6ae4477e56cd69aa3973a1b022259d22b2b3e3a95784c3d22d18daae2a3530f8f498a44378a8a15fa21912ca9809a72b226292e121950517c74121ad52091e84641895caf63f6fd39ea72f6e471af39a899644b22a1511555c8279f919b7c46a292630a1a4415d413201225591201e524aee63fa97cd7cee7fc6e12eb85effd0780dea8811d4288880422222232472974918484108608414639c7ca07128070318e04298642200461388c1062048608638410a2c8c80cdd6e7b93119038e5354fe21ca84fdd34397fca0f25124cca409439667e7991e72f724f34cf51fd10afc86b746dfb599338a5a1ff3b59a41e271ab5bd5db7f5ea31551520328eba352884cecd1f73f4505418cf4e47327c4a2aaa00a0faef926937dc2e144b22ad0c1718fa4c034579c97408bd0d88f15cbe6d913aee623d0db2f89096f9731cf1c0c1123d1c8a52c0a86d849d6855096b94d55ea5e26926fa02d8c54a7c23d573a23515e3650e530a7c05ad7ad10106c00b340083b41ed39439790beb985660ef7d28799ace8cc5978bdd9b3d383eb81e3d6217b04b611525141f2f1e7c4260edb73416269cd3319f3f62b3538caa771e51f26c28b77f10363abbceb4ad258536820fd323c5fe9a6fd763db50cc5f50931bf198d6a5e2a8174a1bc46a32645268c2ed92ce1c6540d0c9e8a6737b52ed6f7392cd45d726f5952ab516056e3308737cc0e3f3cbb60fe568cd6369fb2007a671dc5b401237f28c9fc4887b0bd82774e3fe8c35ff3ff76cb09a1537a5bd6a284db1bb9638e2809ed2c4d5afcaeaa81c59864ca49f6f7786a3368d1d3acca40c43e817ce7b2f40849503e9fb7952028f40b3d9962cf375e40fcecb9c92930d17cef6e5cc99cf626487a0a69abbcc164b46b8ebf93292334097c10a4681b2dad9c1c8d82b3ab6dec9f03f4a1a50ea36f35cef5a536f120bd505a3718aeff3244f7948f7228f64bd4a3850ce0510cfbc02c0d7ca3f3aad5e38c194af88fa034909539410f4f918b5edd678bc3439db05267eaf38388a169c923e2a8a6e7049de969544ab33a4cf85c7c299e4df31af72ad109094deb33e266b716c55351761bccbe0f6ab1944e9e6093e97f806c6e5576c7805fc1f2a4d26a4659ebada5fdf5b2345bf220f7c321f26ec88a2148ad42670accdbcb205", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2eac8c3d5c3234dc0a1a2cbcf2683444e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} diff --git a/parachains/runtimes/glutton/glutton-kusama/Cargo.toml b/parachains/runtimes/glutton/glutton-kusama/Cargo.toml index e2ad80d2048..bc502c116f3 100644 --- a/parachains/runtimes/glutton/glutton-kusama/Cargo.toml +++ b/parachains/runtimes/glutton/glutton-kusama/Cargo.toml @@ -16,6 +16,7 @@ frame-system = { git = "https://github.com/paritytech/substrate", default-featur frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } pallet-glutton = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } +pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -59,6 +60,7 @@ std = [ "frame-support/std", "frame-system/std", "pallet-glutton/std", + "pallet-sudo/std", "sp-api/std", "sp-block-builder/std", "sp-core/std", @@ -82,4 +84,5 @@ try-runtime = [ "frame-executive/try-runtime", "frame-try-runtime/try-runtime", "pallet-glutton/try-runtime", + "pallet-sudo/try-runtime", ] diff --git a/parachains/runtimes/glutton/glutton-kusama/src/lib.rs b/parachains/runtimes/glutton/glutton-kusama/src/lib.rs index 9336cf7d4b3..073bd6c5751 100644 --- a/parachains/runtimes/glutton/glutton-kusama/src/lib.rs +++ b/parachains/runtimes/glutton/glutton-kusama/src/lib.rs @@ -76,7 +76,10 @@ pub use frame_support::{ }, StorageValue, }; -use frame_system::limits::{BlockLength, BlockWeights}; +use frame_system::{ + limits::{BlockLength, BlockWeights}, + EnsureRoot, +}; use parachains_common::{AccountId, Signature}; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; @@ -187,6 +190,13 @@ impl parachain_info::Config for Runtime {} impl pallet_glutton::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = weights::pallet_glutton::WeightInfo; + type AdminOrigin = EnsureRoot; +} + +impl pallet_sudo::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type WeightInfo = (); } construct_runtime! { @@ -205,7 +215,10 @@ construct_runtime! { CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Storage, Event, Origin} = 10, // The main stage. - Glutton: pallet_glutton::{Pallet, Call, Storage, Event} = 20, + Glutton: pallet_glutton::{Pallet, Call, Storage, Event, Config} = 20, + + // Sudo. + Sudo: pallet_sudo::{Pallet, Call, Storage, Event, Config} = 255, } } diff --git a/polkadot-parachain/src/chain_spec/glutton.rs b/polkadot-parachain/src/chain_spec/glutton.rs index 77b9efb5ee8..1a5f60b3baf 100644 --- a/polkadot-parachain/src/chain_spec/glutton.rs +++ b/polkadot-parachain/src/chain_spec/glutton.rs @@ -14,9 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use crate::chain_spec::Extensions; +use crate::chain_spec::{get_account_id_from_seed, Extensions}; use cumulus_primitives_core::ParaId; use sc_service::ChainType; +use sp_core::sr25519; /// Specialized `ChainSpec` for the Glutton parachain runtime. pub type GluttonChainSpec = @@ -86,5 +87,13 @@ fn glutton_genesis(parachain_id: ParaId) -> glutton_runtime::GenesisConfig { }, parachain_info: glutton_runtime::ParachainInfoConfig { parachain_id }, parachain_system: Default::default(), + glutton: glutton_runtime::GluttonConfig { + compute: Default::default(), + storage: Default::default(), + trash_data_count: Default::default(), + }, + sudo: glutton_runtime::SudoConfig { + key: Some(get_account_id_from_seed::("Alice")), + }, } } diff --git a/xcm/xcm-emulator/src/lib.rs b/xcm/xcm-emulator/src/lib.rs index 48f2fdb10c1..a31d7c5b7e5 100644 --- a/xcm/xcm-emulator/src/lib.rs +++ b/xcm/xcm-emulator/src/lib.rs @@ -27,7 +27,7 @@ pub use pallet_balances::AccountData; pub use paste; pub use sp_arithmetic::traits::Bounded; pub use sp_core::storage::Storage; -pub use sp_io::TestExternalities; +pub use sp_io; pub use sp_std::{cell::RefCell, collections::vec_deque::VecDeque, marker::PhantomData}; pub use sp_trie::StorageProof; @@ -296,12 +296,12 @@ macro_rules! __impl_test_ext_for_relay_chain { // impl (@impl $name:ident, $genesis:expr, $on_init:expr, $ext_name:ident) => { thread_local! { - pub static $ext_name: $crate::RefCell<$crate::TestExternalities> + pub static $ext_name: $crate::RefCell<$crate::sp_io::TestExternalities> = $crate::RefCell::new(<$name>::build_new_ext($genesis)); } impl TestExt for $name { - fn build_new_ext(storage: $crate::Storage) -> $crate::TestExternalities { + fn build_new_ext(storage: $crate::Storage) -> $crate::sp_io::TestExternalities { let mut ext = sp_io::TestExternalities::new(storage); ext.execute_with(|| { #[allow(clippy::no_effect)] @@ -312,7 +312,7 @@ macro_rules! __impl_test_ext_for_relay_chain { ext } - fn new_ext() -> $crate::TestExternalities { + fn new_ext() -> $crate::sp_io::TestExternalities { <$name>::build_new_ext($genesis) } @@ -523,12 +523,12 @@ macro_rules! __impl_test_ext_for_parachain { // impl (@impl $name:ident, $genesis:expr, $on_init:expr, $ext_name:ident) => { thread_local! { - pub static $ext_name: $crate::RefCell<$crate::TestExternalities> + pub static $ext_name: $crate::RefCell<$crate::sp_io::TestExternalities> = $crate::RefCell::new(<$name>::build_new_ext($genesis)); } impl TestExt for $name { - fn build_new_ext(storage: $crate::Storage) -> $crate::TestExternalities { + fn build_new_ext(storage: $crate::Storage) -> $crate::sp_io::TestExternalities { let mut ext = sp_io::TestExternalities::new(storage); ext.execute_with(|| { #[allow(clippy::no_effect)] @@ -539,7 +539,7 @@ macro_rules! __impl_test_ext_for_parachain { ext } - fn new_ext() -> $crate::TestExternalities { + fn new_ext() -> $crate::sp_io::TestExternalities { <$name>::build_new_ext($genesis) } From 6cf3618ce21b8e4b7ca0ef58c04e607e528d332e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 May 2023 17:07:20 +0200 Subject: [PATCH 221/339] Bump casey from 0.3.3 to 0.4.0 (#2619) Bumps [casey](https://github.com/jordy25519/casey) from 0.3.3 to 0.4.0. - [Release notes](https://github.com/jordy25519/casey/releases) - [Changelog](https://github.com/jordy25519/casey/blob/master/CHANGELOG.md) - [Commits](https://github.com/jordy25519/casey/compare/0.3.3...0.4.0) --- updated-dependencies: - dependency-name: casey dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- xcm/xcm-emulator/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3a0ca145db4..d4afebfaaaa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1349,9 +1349,9 @@ dependencies = [ [[package]] name = "casey" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabe85130dda9cf267715582ce6cf1ab581c8dfe3cb33f7065fee0f14e3fea14" +checksum = "614586263949597dcc18675da12ef9b429135e13628d92eb8b8c6fa50ca5656b" dependencies = [ "syn 1.0.109", ] diff --git a/xcm/xcm-emulator/Cargo.toml b/xcm/xcm-emulator/Cargo.toml index d64c64800c6..9f57a667da2 100644 --- a/xcm/xcm-emulator/Cargo.toml +++ b/xcm/xcm-emulator/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.0.0" } paste = "1.0.5" quote = "1.0.23" -casey = "0.3.3" +casey = "0.4.0" log = { version = "0.4.17", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master" } From 415dd81c79287329d82c4715da4504441a11451d Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Tue, 23 May 2023 17:13:19 +0200 Subject: [PATCH 222/339] Add Foreign Assets to Statemint (#2540) * add foreign assets to statemint * make review changes * two dots --------- Co-authored-by: parity-processbot <> --- .../assets/statemine/src/xcm_config.rs | 10 +- .../runtimes/assets/statemint/src/lib.rs | 62 +++++++- .../assets/statemint/src/xcm_config.rs | 98 +++++++++++- .../runtimes/assets/statemint/tests/tests.rs | 145 ++++++++++++++++-- .../assets/westmint/src/xcm_config.rs | 6 +- 5 files changed, 290 insertions(+), 31 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 76bc685fd9c..788a0ec5616 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -112,9 +112,9 @@ pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConverte ( // Ignore `TrustBackedAssets` explicitly StartsWith, - // Ignore asset which starts explicitly with our `GlobalConsensus(NetworkId)`, means: - // - foreign assets from our consensus should be: `MultiLocation {parent: 1, X*(Parachain(xyz))} - // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` wont be accepted here + // Ignore assets that start explicitly with our `GlobalConsensus(NetworkId)`, means: + // - foreign assets from our consensus should be: `MultiLocation {parents: 1, X*(Parachain(xyz), ..)}` + // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` won't be accepted here StartsWithExplicitGlobalConsensus, ), Balance, @@ -491,9 +491,7 @@ pub type ForeignCreatorsSovereignAccountOf = ( /// Simple conversion of `u32` into an `AssetId` for use in benchmarking. pub struct XcmBenchmarkHelper; #[cfg(feature = "runtime-benchmarks")] -use pallet_assets::BenchmarkHelper; -#[cfg(feature = "runtime-benchmarks")] -impl BenchmarkHelper for XcmBenchmarkHelper { +impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { fn create_asset_id_parameter(id: u32) -> MultiLocation { MultiLocation { parents: 1, interior: X1(Parachain(id)) } } diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index 0f5de5b3072..0a78178ba75 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -57,6 +57,9 @@ pub mod constants; mod weights; pub mod xcm_config; +use assets_common::{ + foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, +}; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; use sp_api::impl_runtime_apis; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; @@ -95,8 +98,8 @@ use parachains_common::{ MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_config::{ - DotLocation, FellowshipLocation, GovernanceLocation, TrustBackedAssetsConvertedConcreteId, - XcmConfig, XcmOriginToTransactDispatchOrigin, + DotLocation, FellowshipLocation, ForeignAssetsConvertedConcreteId, GovernanceLocation, + TrustBackedAssetsConvertedConcreteId, XcmConfig, XcmOriginToTransactDispatchOrigin, }; #[cfg(any(feature = "std", test))] @@ -108,6 +111,7 @@ use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use xcm::latest::BodyId; use xcm_executor::XcmExecutor; +use crate::xcm_config::ForeignCreatorsSovereignAccountOf; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; impl_opaque_keys! { @@ -279,6 +283,48 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +parameter_types! { + // we just reuse the same deposits + pub const ForeignAssetsAssetDeposit: Balance = AssetDeposit::get(); + pub const ForeignAssetsAssetAccountDeposit: Balance = AssetAccountDeposit::get(); + pub const ForeignAssetsApprovalDeposit: Balance = ApprovalDeposit::get(); + pub const ForeignAssetsAssetsStringLimit: u32 = AssetsStringLimit::get(); + pub const ForeignAssetsMetadataDepositBase: Balance = MetadataDepositBase::get(); + pub const ForeignAssetsMetadataDepositPerByte: Balance = MetadataDepositPerByte::get(); +} + +/// Assets managed by some foreign location. Note: we do not declare a `ForeignAssetsCall` type, as +/// this type is used in proxy definitions. We assume that a foreign location would not want to set +/// an individual, local account as a proxy for the issuance of their assets. This issuance should +/// be managed by the foreign location's governance. +pub type ForeignAssetsInstance = pallet_assets::Instance2; +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = MultiLocationForAssetId; + type AssetIdParameter = MultiLocationForAssetId; + type Currency = Balances; + type CreateOrigin = ForeignCreators< + (FromSiblingParachain>,), + ForeignCreatorsSovereignAccountOf, + AccountId, + >; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = ForeignAssetsAssetDeposit; + type MetadataDepositBase = ForeignAssetsMetadataDepositBase; + type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte; + type ApprovalDeposit = ForeignAssetsApprovalDeposit; + type StringLimit = ForeignAssetsAssetsStringLimit; + type Freezer = (); + type Extra = (); + type WeightInfo = weights::pallet_assets::WeightInfo; + type CallbackHandle = (); + type AssetAccountDeposit = ForeignAssetsAssetAccountDeposit; + type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; +} + parameter_types! { // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. pub const DepositBase: Balance = deposit(1, 88); @@ -704,6 +750,7 @@ construct_runtime!( Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, + ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, } ); @@ -753,6 +800,7 @@ mod benches { define_benchmarks!( [frame_system, SystemBench::] [pallet_assets, Assets] + [pallet_assets, ForeignAssets] [pallet_balances, Balances] [pallet_multisig, Multisig] [pallet_nfts, Nfts] @@ -928,11 +976,17 @@ impl_runtime_apis! { }, // collect pallet_assets (TrustBackedAssets) convert::<_, _, _, _, TrustBackedAssetsConvertedConcreteId>( - Assets::account_balances(account) + Assets::account_balances(account.clone()) + .iter() + .filter(|(_, balance)| balance > &0) + )?, + // collect pallet_assets (ForeignAssets) + convert::<_, _, _, _, ForeignAssetsConvertedConcreteId>( + ForeignAssets::account_balances(account) .iter() .filter(|(_, balance)| balance > &0) )?, - // collect ... e.g. pallet_assets ForeignAssets + // collect ... e.g. other tokens ].concat().into()) } } diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index 5960b35d9cf..c045b39286f 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -14,10 +14,13 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ParachainInfo, - ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ForeignAssets, + ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; +use assets_common::matching::{ + FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, +}; use frame_support::{ match_types, parameter_types, traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, @@ -36,8 +39,8 @@ use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, WithComputedOrigin, }; @@ -49,6 +52,7 @@ parameter_types! { pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); @@ -102,8 +106,38 @@ pub type FungiblesTransactor = FungiblesAdapter< // The account to use for tracking teleports. CheckingAccount, >; + +/// `AssetId/Balance` converter for `TrustBackedAssets` +pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId< + ( + // Ignore `TrustBackedAssets` explicitly + StartsWith, + // Ignore assets that start explicitly with our `GlobalConsensus(NetworkId)`, means: + // - foreign assets from our consensus should be: `MultiLocation {parents: 1, X*(Parachain(xyz), ..)}` + // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` won't be accepted here + StartsWithExplicitGlobalConsensus, + ), + Balance, +>; + +/// Means for transacting foreign assets from different global consensus. +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + ForeignAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ForeignAssetsConvertedConcreteId, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont need to check teleports here. + NoChecking, + // The account to use for tracking teleports. + CheckingAccount, +>; + /// Means for transacting assets on this chain. -pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor); +pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor, ForeignFungiblesTransactor); /// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, /// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can @@ -205,6 +239,7 @@ impl Contains for SafeCallFilter { pallet_assets::Call::thaw_asset { .. } | pallet_assets::Call::transfer_ownership { .. } | pallet_assets::Call::set_team { .. } | + pallet_assets::Call::set_metadata { .. } | pallet_assets::Call::clear_metadata { .. } | pallet_assets::Call::force_clear_metadata { .. } | pallet_assets::Call::force_asset_status { .. } | @@ -214,7 +249,35 @@ impl Contains for SafeCallFilter { pallet_assets::Call::transfer_approved { .. } | pallet_assets::Call::touch { .. } | pallet_assets::Call::refund { .. }, - ) | RuntimeCall::Nfts( + ) | RuntimeCall::ForeignAssets( + pallet_assets::Call::create { .. } | + pallet_assets::Call::force_create { .. } | + pallet_assets::Call::start_destroy { .. } | + pallet_assets::Call::destroy_accounts { .. } | + pallet_assets::Call::destroy_approvals { .. } | + pallet_assets::Call::finish_destroy { .. } | + pallet_assets::Call::mint { .. } | + pallet_assets::Call::burn { .. } | + pallet_assets::Call::transfer { .. } | + pallet_assets::Call::transfer_keep_alive { .. } | + pallet_assets::Call::force_transfer { .. } | + pallet_assets::Call::freeze { .. } | + pallet_assets::Call::thaw { .. } | + pallet_assets::Call::freeze_asset { .. } | + pallet_assets::Call::thaw_asset { .. } | + pallet_assets::Call::transfer_ownership { .. } | + pallet_assets::Call::set_team { .. } | + pallet_assets::Call::set_metadata { .. } | + pallet_assets::Call::clear_metadata { .. } | + pallet_assets::Call::force_clear_metadata { .. } | + pallet_assets::Call::force_asset_status { .. } | + pallet_assets::Call::approve_transfer { .. } | + pallet_assets::Call::cancel_approval { .. } | + pallet_assets::Call::force_cancel_approval { .. } | + pallet_assets::Call::transfer_approved { .. } | + pallet_assets::Call::touch { .. } | + pallet_assets::Call::refund { .. }, + ) | RuntimeCall::Nfts( pallet_nfts::Call::create { .. } | pallet_nfts::Call::force_create { .. } | pallet_nfts::Call::destroy { .. } | @@ -321,7 +384,13 @@ impl xcm_executor::Config for XcmConfig { // Statemint acting _as_ a reserve location for DOT and assets created under `pallet-assets`. // For DOT, users must use teleport where allowed (e.g. with the Relay Chain). type IsReserve = (); - type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of DOT + // We allow: + // - teleportation of DOT + // - teleportation of sibling parachain's assets (as ForeignCreators) + type IsTeleporter = ( + NativeAsset, + IsForeignConcreteAsset>>, + ); type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< @@ -415,3 +484,18 @@ impl cumulus_pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; } + +pub type ForeignCreatorsSovereignAccountOf = ( + SiblingParachainConvertsVia, + AccountId32Aliases, + ParentIsPreset, +); + +/// Simple conversion of `u32` into an `AssetId` for use in benchmarking. +pub struct XcmBenchmarkHelper; +#[cfg(feature = "runtime-benchmarks")] +impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { + fn create_asset_id_parameter(id: u32) -> MultiLocation { + MultiLocation { parents: 1, interior: X1(Parachain(id)) } + } +} diff --git a/parachains/runtimes/assets/statemint/tests/tests.rs b/parachains/runtimes/assets/statemint/tests/tests.rs index 82491fa27f5..bb4d52a1452 100644 --- a/parachains/runtimes/assets/statemint/tests/tests.rs +++ b/parachains/runtimes/assets/statemint/tests/tests.rs @@ -1,5 +1,5 @@ use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper}; -use codec::Decode; +use codec::{Decode, Encode}; use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ assert_noop, assert_ok, @@ -11,17 +11,18 @@ use parachains_common::{ }; use statemint_runtime::xcm_config::{ AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, DotLocation, - TrustBackedAssetsPalletLocation, + ForeignCreatorsSovereignAccountOf, TrustBackedAssetsPalletLocation, XcmConfig, }; pub use statemint_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, AssetDeposit, Assets, Balances, - ExistentialDeposit, ParachainSystem, Runtime, RuntimeEvent, SessionKeys, System, - TrustBackedAssetsInstance, + constants::fee::WeightToFee, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, + ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime, + RuntimeCall, RuntimeEvent, SessionKeys, System, TrustBackedAssetsInstance, }; use xcm::latest::prelude::*; -use xcm_executor::traits::{Convert, WeightTrader}; +use xcm_executor::traits::{Convert, Identity, JustTry, WeightTrader}; const ALICE: [u8; 32] = [1u8; 32]; +const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; type AssetIdForTrustBackedAssetsConvert = assets_common::AssetIdForTrustBackedAssetsConvert; @@ -390,9 +391,15 @@ fn test_assets_balances_api_works() { .build() .execute_with(|| { let local_asset_id = 1; + let foreign_asset_id_multilocation = + MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; // check before assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0); + assert_eq!( + ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), + 0 + ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0); assert!(Runtime::query_account_balances(AccountId::from(ALICE)) .unwrap() @@ -423,18 +430,40 @@ fn test_assets_balances_api_works() { minimum_asset_balance )); + // create foreign asset + let foreign_asset_minimum_asset_balance = 3333333_u128; + assert_ok!(ForeignAssets::force_create( + RuntimeHelper::::root_origin(), + foreign_asset_id_multilocation, + AccountId::from(SOME_ASSET_ADMIN).into(), + false, + foreign_asset_minimum_asset_balance + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(ForeignAssets::mint( + RuntimeHelper::::origin_of(AccountId::from(SOME_ASSET_ADMIN)), + foreign_asset_id_multilocation, + AccountId::from(ALICE).into(), + 6 * foreign_asset_minimum_asset_balance + )); + // check after assert_eq!( Assets::balance(local_asset_id, AccountId::from(ALICE)), minimum_asset_balance ); + assert_eq!( + ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), + 6 * minimum_asset_balance + ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency); let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE)) .unwrap() .try_into() .unwrap(); - assert_eq!(result.len(), 2); + assert_eq!(result.len(), 3); // check currency assert!(result.inner().iter().any(|asset| asset.eq( @@ -449,6 +478,12 @@ fn test_assets_balances_api_works() { minimum_asset_balance ) .into()))); + // check foreign asset + assert!(result.inner().iter().any(|asset| asset.eq(&( + Identity::reverse_ref(foreign_asset_id_multilocation).unwrap(), + 6 * foreign_asset_minimum_asset_balance + ) + .into()))); }); } @@ -475,6 +510,34 @@ asset_test_utils::include_teleports_for_native_asset_works!( 1000 ); +asset_test_utils::include_teleports_for_foreign_assets_works!( + Runtime, + XcmConfig, + CheckingAccount, + WeightToFee, + ParachainSystem, + ForeignCreatorsSovereignAccountOf, + ForeignAssetsInstance, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }) +); + asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( Runtime, XcmConfig, @@ -482,14 +545,16 @@ asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currenc ExistentialDeposit::get(), Box::new(|| { assert!(Assets::asset_ids().collect::>().is_empty()); + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); }), Box::new(|| { assert!(Assets::asset_ids().collect::>().is_empty()); + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); }) ); asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( - asset_transactor_transfer_with_pallet_assets_instance_works, + asset_transactor_transfer_with_trust_backed_assets_works, Runtime, XcmConfig, TrustBackedAssetsInstance, @@ -498,6 +563,66 @@ asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_ collator_session_keys(), ExistentialDeposit::get(), 12345, - Box::new(|| {}), - Box::new(|| {}) + Box::new(|| { + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }) +); + +asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( + asset_transactor_transfer_with_foreign_assets_works, + Runtime, + XcmConfig, + ForeignAssetsInstance, + MultiLocation, + JustTry, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) }, + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + }) +); + +asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works!( + Runtime, + XcmConfig, + WeightToFee, + ForeignCreatorsSovereignAccountOf, + ForeignAssetsInstance, + MultiLocation, + JustTry, + asset_test_utils::CollatorSessionKeys::new( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } + ), + ExistentialDeposit::get(), + AssetDeposit::get(), + MetadataDepositBase::get(), + MetadataDepositPerByte::get(), + Box::new(|pallet_asset_call| RuntimeCall::ForeignAssets(pallet_asset_call).encode()), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::ForeignAssets(pallet_asset_event)) => Some(pallet_asset_event), + _ => None, + } + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + assert!(ForeignAssets::asset_ids().collect::>().is_empty()); + }), + Box::new(|| { + assert!(Assets::asset_ids().collect::>().is_empty()); + assert_eq!(ForeignAssets::asset_ids().collect::>().len(), 1); + }) ); diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index c802e99e26b..92aad0fbbe3 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -112,7 +112,7 @@ pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConverte // Ignore `TrustBackedAssets` explicitly StartsWith, // Ignore asset which starts explicitly with our `GlobalConsensus(NetworkId)`, means: - // - foreign assets from our consensus should be: `MultiLocation {parent: 1, X*(Parachain(xyz))} + // - foreign assets from our consensus should be: `MultiLocation {parents: 1, X*(Parachain(xyz), ..)} // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` wont be accepted here StartsWithExplicitGlobalConsensus, ), @@ -487,9 +487,7 @@ pub type ForeignCreatorsSovereignAccountOf = ( /// Simple conversion of `u32` into an `AssetId` for use in benchmarking. pub struct XcmBenchmarkHelper; #[cfg(feature = "runtime-benchmarks")] -use pallet_assets::BenchmarkHelper; -#[cfg(feature = "runtime-benchmarks")] -impl BenchmarkHelper for XcmBenchmarkHelper { +impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { fn create_asset_id_parameter(id: u32) -> MultiLocation { MultiLocation { parents: 1, interior: X1(Parachain(id)) } } From ab2fd8b1703bc8045043899b413999a443260495 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 23 May 2023 21:32:47 +0200 Subject: [PATCH 223/339] Change SA for Rococo/Statemine_1000 + removed `CheckedExtrinsic` (#2627) --- .../runtimes/assets/westmint/src/lib.rs | 3 +- .../contracts/contracts-rococo/src/lib.rs | 2 - .../runtimes/starters/seedling/src/lib.rs | 2 - parachains/runtimes/starters/shell/src/lib.rs | 2 - parachains/runtimes/testing/penpal/src/lib.rs | 3 -- .../testing/rococo-parachain/src/lib.rs | 2 - scripts/bridges_rococo_wococo.sh | 42 ++++++++++--------- scripts/generate_hex_encoded_call/index.js | 2 + 8 files changed, 25 insertions(+), 33 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index d4c714b0fa6..510a9a0e564 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -773,8 +773,7 @@ pub type SignedExtra = ( /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; + /// Migrations to apply on runtime upgrade. pub type Migrations = (); diff --git a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 4266a4219e8..32bd748d803 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -94,8 +94,6 @@ pub type SignedExtra = ( /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; pub type Migrations = (pallet_contracts::Migration,); diff --git a/parachains/runtimes/starters/seedling/src/lib.rs b/parachains/runtimes/starters/seedling/src/lib.rs index e99ead3a9d6..53179bad0e5 100644 --- a/parachains/runtimes/starters/seedling/src/lib.rs +++ b/parachains/runtimes/starters/seedling/src/lib.rs @@ -226,8 +226,6 @@ pub type SignedExtra = ( /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< diff --git a/parachains/runtimes/starters/shell/src/lib.rs b/parachains/runtimes/starters/shell/src/lib.rs index fc87a26f8ee..cbd9185b3bc 100644 --- a/parachains/runtimes/starters/shell/src/lib.rs +++ b/parachains/runtimes/starters/shell/src/lib.rs @@ -257,8 +257,6 @@ pub type SignedExtra = DisallowSigned; /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index 8e06d986df7..4fa161138fd 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -123,9 +123,6 @@ pub type SignedExtra = ( pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; - pub type Migrations = (pallet_balances::migration::MigrateToTrackInactive,); diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index bd3e2ede318..8923d1c7cae 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -612,8 +612,6 @@ pub type SignedExtra = ( /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, diff --git a/scripts/bridges_rococo_wococo.sh b/scripts/bridges_rococo_wococo.sh index 3d18ba49c0f..2d918e244a9 100755 --- a/scripts/bridges_rococo_wococo.sh +++ b/scripts/bridges_rococo_wococo.sh @@ -7,6 +7,17 @@ STATEMINE_ACCOUNT_SEED_FOR_LOCAL="//Alice" # AccountId: [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL="5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" +# SovereignAccount for `MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1000)) }` => 5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ +# +# use sp_core::crypto::Ss58Codec; +# println!("{}", +# frame_support::sp_runtime::AccountId32::new( +# GlobalConsensusParachainConvertsFor::::convert_ref( +# MultiLocation { parents: 2, interior: X2(GlobalConsensus(Kusama), Parachain(1000)) }).unwrap() +# ).to_ss58check_with_version(42_u16.into()) +# ); +ROCOCO_STATEMINE_1000_SOVEREIGN_ACCOUNT="5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ" + # Address: GegTpZJMyzkntLN7NJhRfHDk4GWukLbGSsag6PHrLSrCK4h ROCKMINE2_ACCOUNT_SEED_FOR_ROCOCO="scatter feed race company oxygen trip extra elbow slot bundle auto canoe" @@ -597,19 +608,10 @@ case "$1" in 1014 \ "Rococo" \ 1000 - # drip SovereignAccount for `MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1000)) }` => 5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ - # - # use sp_core::crypto::Ss58Codec; - # println!("{}", - # frame_support::sp_runtime::AccountId32::new( - # GlobalConsensusParachainConvertsFor::::convert_ref( - # MultiLocation { parents: 2, interior: X2(GlobalConsensus(Kusama), Parachain(1000)) }).unwrap() - # ).to_ss58check_with_version(42_u16.into()) - # ); transfer_balance \ "ws://127.0.0.1:9010" \ "//Alice" \ - "5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ" \ + "$ROCOCO_STATEMINE_1000_SOVEREIGN_ACCOUNT" \ $((1000000000 + 50000000000 * 20)) # ExistentialDeposit + maxTargetLocationFee * 20 # create foreign assets for native Statemine token (yes, Kusama, because we are using Statemine runtime on rococo) force_create_foreign_asset \ @@ -618,7 +620,7 @@ case "$1" in 1000 \ "ws://127.0.0.1:9010" \ "Kusama" \ - "5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ" + "$ROCOCO_STATEMINE_1000_SOVEREIGN_ACCOUNT" ;; remove-assets-transfer-from-statemine-local) ensure_polkadot_js_api @@ -637,14 +639,6 @@ case "$1" in "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" \ "Wococo" ;; - transfer-asset-from-statemine-rococo) - ensure_polkadot_js_api - transfer_asset_via_bridge \ - "wss://ws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io" \ - "$ROCKMINE2_ACCOUNT_SEED_FOR_ROCOCO" \ - "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" \ - "Wococo" - ;; ping-via-bridge-from-statemine-local) ensure_polkadot_js_api ping_via_bridge \ @@ -653,6 +647,14 @@ case "$1" in "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" \ "Wococo" ;; + transfer-asset-from-statemine-rococo) + ensure_polkadot_js_api + transfer_asset_via_bridge \ + "wss://ws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io" \ + "$ROCKMINE2_ACCOUNT_SEED_FOR_ROCOCO" \ + "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" \ + "Wococo" + ;; ping-via-bridge-from-statemine-rococo) ensure_polkadot_js_api ping_via_bridge \ @@ -665,7 +667,7 @@ case "$1" in transfer_balance \ "ws://127.0.0.1:9010" \ "//Alice" \ - "5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ" \ + "$ROCOCO_STATEMINE_1000_SOVEREIGN_ACCOUNT" \ $((1000000000 + 50000000000 * 20)) ;; stop) diff --git a/scripts/generate_hex_encoded_call/index.js b/scripts/generate_hex_encoded_call/index.js index b135622c335..25e094df905 100644 --- a/scripts/generate_hex_encoded_call/index.js +++ b/scripts/generate_hex_encoded_call/index.js @@ -17,6 +17,7 @@ async function connect(endpoint, types = {}) { function writeHexEncodedBytesToOutput(method, outputFile) { console.log("Payload (hex): ", method.toHex()); console.log("Payload (bytes): ", Array.from(method.toU8a())); + console.log("Payload (plain): ", JSON.stringify(method)); fs.writeFileSync(outputFile, JSON.stringify(Array.from(method.toU8a()))); } @@ -91,6 +92,7 @@ function removeExporterConfig(endpoint, outputFile, bridgedNetwork) { } function forceCreateAsset(endpoint, outputFile, assetId, assetOwnerAccountId, isSufficient, minBalance) { + var isSufficient = isSufficient == "true" ? true : false; console.log(`Generating forceCreateAsset from RPC endpoint: ${endpoint} to outputFile: ${outputFile} based on assetId: ${assetId}, assetOwnerAccountId: ${assetOwnerAccountId}, isSufficient: ${isSufficient}, minBalance: ${minBalance}`); connect(endpoint) .then((api) => { From 13a190872eb1bca92102d4f4649282055814e342 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 24 May 2023 13:05:56 +0300 Subject: [PATCH 224/339] Companion for #14178: Update cargo.lock to point to substrate (#2623) * Update cargo.lock to point to substrate PR Signed-off-by: Alexandru Vasile * Update sc-executor-wasmtime after diener patch Signed-off-by: Alexandru Vasile * Update cargo.lock Signed-off-by: Alexandru Vasile --------- Signed-off-by: Alexandru Vasile --- Cargo.lock | 623 ++++++++++++++++++++++++++--------------------------- 1 file changed, 300 insertions(+), 323 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d4afebfaaaa..36733773ec2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,22 +12,13 @@ dependencies = [ "regex", ] -[[package]] -name = "addr2line" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" -dependencies = [ - "gimli 0.26.1", -] - [[package]] name = "addr2line" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" dependencies = [ - "gimli 0.27.0", + "gimli", ] [[package]] @@ -529,12 +520,12 @@ version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" dependencies = [ - "addr2line 0.19.0", + "addr2line", "cc", "cfg-if", "libc", "miniz_oxide 0.6.2", - "object 0.30.0", + "object", "rustc-demangle", ] @@ -562,6 +553,12 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "base64" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f1e31e207a6b8fb791a38ea3105e6cb541f55e4d029902d3039a4ad07cc4105" + [[package]] name = "base64ct" version = "1.5.2" @@ -580,7 +577,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "hash-db", "log", @@ -1898,28 +1895,27 @@ checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" [[package]] name = "cranelift-bforest" -version = "0.93.2" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc42ba2e232e5b20ff7dc299a812d53337dadce9a7e39a238e6a5cb82d2e57b" +checksum = "1277fbfa94bc82c8ec4af2ded3e639d49ca5f7f3c7eeab2c66accd135ece4e70" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.93.2" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "253531aca9b6f56103c9420369db3263e784df39aa1c90685a1f69cfbba0623e" +checksum = "c6e8c31ad3b2270e9aeec38723888fe1b0ace3bea2b06b3f749ccf46661d3220" dependencies = [ - "arrayvec 0.7.2", "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", "cranelift-isle", - "gimli 0.26.1", - "hashbrown 0.12.3", + "gimli", + "hashbrown 0.13.2", "log", "regalloc2", "smallvec", @@ -1928,33 +1924,33 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.93.2" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f2154365e2bff1b1b8537a7181591fdff50d8e27fa6e40d5c69c3bad0ca7c8" +checksum = "c8ac5ac30d62b2d66f12651f6b606dbdfd9c2cfd0908de6b387560a277c5c9da" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.93.2" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687e14e3f5775248930e0d5a84195abef8b829958e9794bf8d525104993612b4" +checksum = "dd82b8b376247834b59ed9bdc0ddeb50f517452827d4a11bccf5937b213748b8" [[package]] name = "cranelift-entity" -version = "0.93.2" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f42ea692c7b450ad18b8c9889661505d51c09ec4380cf1c2d278dbb2da22cae1" +checksum = "40099d38061b37e505e63f89bab52199037a72b931ad4868d9089ff7268660b0" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.93.2" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8483c2db6f45fe9ace984e5adc5d058102227e4c62e5aa2054e16b0275fd3a6e" +checksum = "64a25d9d0a0ae3079c463c34115ec59507b4707175454f0eee0891e83e30e82d" dependencies = [ "cranelift-codegen", "log", @@ -1964,15 +1960,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.93.2" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9793158837678902446c411741d87b43f57dadfb944f2440db4287cda8cbd59" +checksum = "80de6a7d0486e4acbd5f9f87ec49912bf4c8fb6aea00087b989685460d4469ba" [[package]] name = "cranelift-native" -version = "0.93.2" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72668c7755f2b880665cb422c8ad2d56db58a88b9bebfef0b73edc2277c13c49" +checksum = "bb6b03e0e03801c4b3fd8ce0758a94750c07a44e7944cc0ffbf0d3f2e7c79b00" dependencies = [ "cranelift-codegen", "libc", @@ -1981,9 +1977,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.93.2" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852ce4b088b44ac4e29459573943009a70d1b192c8d77ef949b4e814f656fc1" +checksum = "ff3220489a3d928ad91e59dd7aeaa8b3de18afb554a6211213673a71c90737ac" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -3808,7 +3804,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", ] @@ -3831,7 +3827,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-support-procedural", @@ -3856,7 +3852,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3903,7 +3899,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3914,7 +3910,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3931,7 +3927,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-system", @@ -3960,7 +3956,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-recursion", "futures", @@ -3981,7 +3977,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "bitflags", "environmental", @@ -4015,7 +4011,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "Inflector", "cfg-expr", @@ -4031,7 +4027,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4043,7 +4039,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "proc-macro2", "quote", @@ -4053,7 +4049,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "cfg-if", "frame-support", @@ -4072,7 +4068,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -4087,7 +4083,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "sp-api", @@ -4096,7 +4092,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "parity-scale-codec", @@ -4349,21 +4345,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.26.1" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" +checksum = "dec7af912d60cdbd3677c1af9352ebae6fb8394d165568a2234df0fa00f87793" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec7af912d60cdbd3677c1af9352ebae6fb8394d165568a2234df0fa00f87793" - [[package]] name = "glob" version = "0.3.0" @@ -5819,7 +5809,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0452aac8bab02242429380e9b2f94ea20cea2b37e2c1777a1358799bbe97f37" dependencies = [ "arrayref", - "base64", + "base64 0.13.0", "digest 0.9.0", "hmac-drbg", "libsecp256k1-core", @@ -6092,6 +6082,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "memory-db" version = "0.32.0" @@ -6170,7 +6169,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "futures", "log", @@ -6189,7 +6188,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "anyhow", "jsonrpsee", @@ -6559,25 +6558,16 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.29.0" +version = "0.30.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" dependencies = [ "crc32fast", - "hashbrown 0.12.3", + "hashbrown 0.13.2", "indexmap", "memchr", ] -[[package]] -name = "object" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239da7f290cfa979f43f85a8efeee9a8a76d0827c356d37f9d3d7254d6b537fb" -dependencies = [ - "memchr", -] - [[package]] name = "oid-registry" version = "0.4.0" @@ -6708,7 +6698,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6729,7 +6719,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -6747,7 +6737,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -6762,7 +6752,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-system", @@ -6778,7 +6768,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-system", @@ -6794,7 +6784,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-system", @@ -6808,7 +6798,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -6832,7 +6822,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6852,7 +6842,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -6867,7 +6857,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-system", @@ -6886,7 +6876,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6910,7 +6900,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7016,7 +7006,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7060,7 +7050,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7077,7 +7067,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "bitflags", "environmental", @@ -7107,7 +7097,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "bitflags", "parity-scale-codec", @@ -7120,7 +7110,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "proc-macro2", "quote", @@ -7130,7 +7120,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7147,7 +7137,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7165,7 +7155,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7188,7 +7178,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7201,7 +7191,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7219,7 +7209,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7237,7 +7227,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "blake2", "frame-benchmarking", @@ -7255,7 +7245,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7278,7 +7268,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7294,7 +7284,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7314,7 +7304,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7331,7 +7321,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-system", @@ -7345,7 +7335,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7362,7 +7352,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7381,7 +7371,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7398,7 +7388,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7414,7 +7404,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7431,7 +7421,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7449,7 +7439,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "pallet-nfts", @@ -7460,7 +7450,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7476,7 +7466,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-system", @@ -7493,7 +7483,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7513,7 +7503,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7524,7 +7514,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-system", @@ -7541,7 +7531,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7580,7 +7570,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7597,7 +7587,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7612,7 +7602,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7630,7 +7620,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7645,7 +7635,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7664,7 +7654,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7681,7 +7671,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-system", @@ -7702,7 +7692,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7718,7 +7708,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-system", @@ -7732,7 +7722,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7755,7 +7745,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7766,7 +7756,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "log", "sp-arithmetic", @@ -7775,7 +7765,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "sp-api", @@ -7784,7 +7774,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7801,7 +7791,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7816,7 +7806,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7834,7 +7824,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7853,7 +7843,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-support", "frame-system", @@ -7869,7 +7859,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7885,7 +7875,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7897,7 +7887,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7914,7 +7904,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7929,7 +7919,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7945,7 +7935,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -7960,7 +7950,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-benchmarking", "frame-support", @@ -8376,7 +8366,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03c64931a1a212348ec4f3b4362585eca7159d0d09cbdf4a7f74f02173596fd4" dependencies = [ - "base64", + "base64 0.13.0", ] [[package]] @@ -10599,9 +10589,9 @@ dependencies = [ [[package]] name = "regalloc2" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" +checksum = "80535183cae11b149d618fbd3c37e38d7cda589d82d7769e196ca9a9042d7621" dependencies = [ "fxhash", "log", @@ -10635,18 +10625,6 @@ version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" -[[package]] -name = "region" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" -dependencies = [ - "bitflags", - "libc", - "mach", - "winapi", -] - [[package]] name = "resolv-conf" version = "0.7.0" @@ -11005,7 +10983,7 @@ version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" dependencies = [ - "base64", + "base64 0.13.0", "log", "ring", "sct 0.6.1", @@ -11042,7 +11020,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" dependencies = [ - "base64", + "base64 0.13.0", ] [[package]] @@ -11098,7 +11076,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "log", "sp-core", @@ -11109,7 +11087,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "futures", @@ -11138,7 +11116,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "futures", "futures-timer", @@ -11161,7 +11139,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11176,7 +11154,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11195,7 +11173,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11206,7 +11184,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11246,7 +11224,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "fnv", "futures", @@ -11273,7 +11251,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "hash-db", "kvdb", @@ -11299,7 +11277,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "futures", @@ -11324,7 +11302,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "futures", @@ -11353,7 +11331,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "fork-tree", @@ -11389,7 +11367,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "futures", "jsonrpsee", @@ -11411,7 +11389,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11446,7 +11424,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "futures", "jsonrpsee", @@ -11465,7 +11443,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11478,7 +11456,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11518,7 +11496,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "finality-grandpa", "futures", @@ -11538,7 +11516,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "futures", @@ -11561,13 +11539,12 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "lru 0.8.1", "parity-scale-codec", "parking_lot 0.12.1", "sc-executor-common", - "sc-executor-wasmi", "sc-executor-wasmtime", "sp-api", "sp-core", @@ -11579,39 +11556,24 @@ dependencies = [ "sp-version", "sp-wasm-interface", "tracing", - "wasmi 0.13.2", ] [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", "sp-wasm-interface", "thiserror", "wasm-instrument 0.3.0", - "wasmi 0.13.2", -] - -[[package]] -name = "sc-executor-wasmi" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" -dependencies = [ - "log", - "sc-allocator", - "sc-executor-common", - "sp-runtime-interface", - "sp-wasm-interface", - "wasmi 0.13.2", ] [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "anyhow", "cfg-if", @@ -11629,7 +11591,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "ansi_term", "futures", @@ -11645,7 +11607,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11659,7 +11621,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11704,7 +11666,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "cid", "futures", @@ -11724,7 +11686,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11752,7 +11714,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "ahash 0.8.2", "futures", @@ -11771,7 +11733,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11793,7 +11755,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11827,7 +11789,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11847,7 +11809,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11878,7 +11840,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "futures", "libp2p-identity", @@ -11894,7 +11856,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11903,7 +11865,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "futures", "jsonrpsee", @@ -11934,7 +11896,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11953,7 +11915,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "http", "jsonrpsee", @@ -11968,7 +11930,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11994,7 +11956,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "directories", @@ -12060,7 +12022,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "log", "parity-scale-codec", @@ -12071,7 +12033,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "clap 4.2.7", "fs4", @@ -12087,7 +12049,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12106,7 +12068,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "futures", "libc", @@ -12125,7 +12087,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "chrono", "futures", @@ -12144,7 +12106,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "ansi_term", "atty", @@ -12175,7 +12137,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12186,7 +12148,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "futures", @@ -12213,7 +12175,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "futures", @@ -12227,7 +12189,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-channel", "futures", @@ -12771,7 +12733,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" dependencies = [ - "base64", + "base64 0.13.0", "bytes", "flate2", "futures", @@ -12785,7 +12747,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "hash-db", "log", @@ -12805,7 +12767,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "Inflector", "blake2", @@ -12819,7 +12781,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "scale-info", @@ -12832,7 +12794,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "integer-sqrt", "num-traits", @@ -12846,7 +12808,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "scale-info", @@ -12859,7 +12821,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "sp-api", @@ -12871,7 +12833,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "futures", "log", @@ -12889,7 +12851,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "futures", @@ -12904,7 +12866,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "parity-scale-codec", @@ -12922,7 +12884,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "parity-scale-codec", @@ -12943,7 +12905,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12962,7 +12924,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "finality-grandpa", "log", @@ -12980,7 +12942,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "scale-info", @@ -12992,7 +12954,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13036,7 +12998,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "blake2b_simd", "byteorder", @@ -13050,7 +13012,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "proc-macro2", "quote", @@ -13061,7 +13023,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13070,7 +13032,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "proc-macro2", "quote", @@ -13080,7 +13042,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "environmental", "parity-scale-codec", @@ -13091,7 +13053,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13106,7 +13068,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "bytes", "ed25519", @@ -13132,7 +13094,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "lazy_static", "sp-core", @@ -13143,7 +13105,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "futures", "parity-scale-codec", @@ -13157,7 +13119,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13166,7 +13128,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13177,7 +13139,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13195,7 +13157,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "scale-info", @@ -13209,7 +13171,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "sp-api", "sp-core", @@ -13219,7 +13181,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "backtrace", "lazy_static", @@ -13229,7 +13191,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "rustc-hash", "serde", @@ -13239,7 +13201,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "either", "hash256-std-hasher", @@ -13261,7 +13223,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13279,7 +13241,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "Inflector", "proc-macro-crate", @@ -13291,7 +13253,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "scale-info", @@ -13305,7 +13267,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "scale-info", @@ -13318,7 +13280,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "hash-db", "log", @@ -13338,7 +13300,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "log", "parity-scale-codec", @@ -13356,12 +13318,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13374,7 +13336,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "futures-timer", @@ -13389,7 +13351,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "sp-std", @@ -13401,7 +13363,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "sp-api", "sp-runtime", @@ -13410,7 +13372,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "log", @@ -13426,7 +13388,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13449,7 +13411,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13466,7 +13428,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13477,7 +13439,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13491,7 +13453,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "parity-scale-codec", "scale-info", @@ -13825,7 +13787,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7e94b1ec00bad60e6410e058b52f1c66de3dc5fe4d62d09b3e52bb7d3b73e25" dependencies = [ - "base64", + "base64 0.13.0", "crc", "lazy_static", "md-5", @@ -13854,7 +13816,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "platforms 2.0.0", ] @@ -13862,7 +13824,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13881,7 +13843,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "hyper", "log", @@ -13893,7 +13855,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "jsonrpsee", @@ -13906,7 +13868,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "jsonrpsee", "log", @@ -13925,7 +13887,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13951,7 +13913,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13961,7 +13923,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13972,7 +13934,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "ansi_term", "build-helper", @@ -14637,7 +14599,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#5b0831525c8a9066c2538bae95d574f9b228d473" +source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", "clap 4.2.7", @@ -14684,7 +14646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4712ee30d123ec7ae26d1e1b218395a16c87cdbaf4b3925d170d684af62ea5e8" dependencies = [ "async-trait", - "base64", + "base64 0.13.0", "futures", "log", "md-5", @@ -15094,7 +15056,6 @@ dependencies = [ "memory_units", "num-rational", "num-traits", - "region", ] [[package]] @@ -15111,9 +15072,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.100.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b20236ab624147dfbb62cf12a19aaf66af0e41b8398838b66e997d07d269d4" +checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" dependencies = [ "indexmap", "url", @@ -15130,9 +15091,9 @@ dependencies = [ [[package]] name = "wasmtime" -version = "6.0.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a222f5fa1e14b2cefc286f1b68494d7a965f4bf57ec04c59bb62673d639af6" +checksum = "f907fdead3153cb9bfb7a93bbd5b62629472dc06dee83605358c64c52ed3dda9" dependencies = [ "anyhow", "bincode", @@ -15140,7 +15101,7 @@ dependencies = [ "indexmap", "libc", "log", - "object 0.29.0", + "object", "once_cell", "paste", "psm", @@ -15153,26 +15114,26 @@ dependencies = [ "wasmtime-environ", "wasmtime-jit", "wasmtime-runtime", - "windows-sys 0.42.0", + "windows-sys 0.45.0", ] [[package]] name = "wasmtime-asm-macros" -version = "6.0.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4407a7246e7d2f3d8fb1cf0c72fda8dbafdb6dd34d555ae8bea0e5ae031089cc" +checksum = "d3b9daa7c14cd4fa3edbf69de994408d5f4b7b0959ac13fa69d465f6597f810d" dependencies = [ "cfg-if", ] [[package]] name = "wasmtime-cache" -version = "6.0.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ceb3adf61d654be0be67fffdce42447b0880481348785be5fe40b5dd7663a4c" +checksum = "c86437fa68626fe896e5afc69234bb2b5894949083586535f200385adfd71213" dependencies = [ "anyhow", - "base64", + "base64 0.21.1", "bincode", "directories-next", "file-per-thread-logger", @@ -15181,15 +15142,15 @@ dependencies = [ "serde", "sha2 0.10.2", "toml 0.5.10", - "windows-sys 0.42.0", + "windows-sys 0.45.0", "zstd 0.11.2+zstd.1.5.2", ] [[package]] name = "wasmtime-cranelift" -version = "6.0.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c366bb8647e01fd08cb5589976284b00abfded5529b33d7e7f3f086c68304a4" +checksum = "b1cefde0cce8cb700b1b21b6298a3837dba46521affd7b8c38a9ee2c869eee04" dependencies = [ "anyhow", "cranelift-codegen", @@ -15197,27 +15158,43 @@ dependencies = [ "cranelift-frontend", "cranelift-native", "cranelift-wasm", - "gimli 0.26.1", + "gimli", "log", - "object 0.29.0", + "object", "target-lexicon", "thiserror", "wasmparser", + "wasmtime-cranelift-shared", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-cranelift-shared" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd041e382ef5aea1b9fc78442394f1a4f6d676ce457e7076ca4cb3f397882f8b" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-native", + "gimli", + "object", + "target-lexicon", "wasmtime-environ", ] [[package]] name = "wasmtime-environ" -version = "6.0.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b8b50962eae38ee319f7b24900b7cf371f03eebdc17400c1dc8575fc10c9a7" +checksum = "a990198cee4197423045235bf89d3359e69bd2ea031005f4c2d901125955c949" dependencies = [ "anyhow", "cranelift-entity", - "gimli 0.26.1", + "gimli", "indexmap", "log", - "object 0.29.0", + "object", "serde", "target-lexicon", "thiserror", @@ -15227,18 +15204,18 @@ dependencies = [ [[package]] name = "wasmtime-jit" -version = "6.0.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffaed4f9a234ba5225d8e64eac7b4a5d13b994aeb37353cde2cbeb3febda9eaa" +checksum = "0de48df552cfca1c9b750002d3e07b45772dd033b0b206d5c0968496abf31244" dependencies = [ - "addr2line 0.17.0", + "addr2line", "anyhow", "bincode", "cfg-if", "cpp_demangle", - "gimli 0.26.1", + "gimli", "log", - "object 0.29.0", + "object", "rustc-demangle", "serde", "target-lexicon", @@ -15246,36 +15223,36 @@ dependencies = [ "wasmtime-jit-debug", "wasmtime-jit-icache-coherence", "wasmtime-runtime", - "windows-sys 0.42.0", + "windows-sys 0.45.0", ] [[package]] name = "wasmtime-jit-debug" -version = "6.0.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed41cbcbf74ce3ff6f1d07d1b707888166dc408d1a880f651268f4f7c9194b2" +checksum = "6e0554b84c15a27d76281d06838aed94e13a77d7bf604bbbaf548aa20eb93846" dependencies = [ - "object 0.29.0", + "object", "once_cell", "rustix 0.36.7", ] [[package]] name = "wasmtime-jit-icache-coherence" -version = "6.0.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a28ae1e648461bfdbb79db3efdaee1bca5b940872e4175390f465593a2e54c" +checksum = "aecae978b13f7f67efb23bd827373ace4578f2137ec110bbf6a4a7cde4121bbd" dependencies = [ "cfg-if", "libc", - "windows-sys 0.42.0", + "windows-sys 0.45.0", ] [[package]] name = "wasmtime-runtime" -version = "6.0.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e704b126e4252788ccfc3526d4d4511d4b23c521bf123e447ac726c14545217b" +checksum = "658cf6f325232b6760e202e5255d823da5e348fdea827eff0a2a22319000b441" dependencies = [ "anyhow", "cc", @@ -15285,21 +15262,21 @@ dependencies = [ "log", "mach", "memfd", - "memoffset 0.6.5", + "memoffset 0.8.0", "paste", "rand 0.8.5", "rustix 0.36.7", "wasmtime-asm-macros", "wasmtime-environ", "wasmtime-jit-debug", - "windows-sys 0.42.0", + "windows-sys 0.45.0", ] [[package]] name = "wasmtime-types" -version = "6.0.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e5572c5727c1ee7e8f28717aaa8400e4d22dcbd714ea5457d85b5005206568" +checksum = "a4f6fffd2a1011887d57f07654dd112791e872e3ff4a2e626aee8059ee17f06f" dependencies = [ "cranelift-entity", "serde", @@ -16133,7 +16110,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fb9bace5b5589ffead1afb76e43e34cff39cd0f3ce7e170ae0c29e53b88eb1c" dependencies = [ "asn1-rs 0.3.1", - "base64", + "base64 0.13.0", "data-encoding", "der-parser 7.0.0", "lazy_static", @@ -16152,7 +16129,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" dependencies = [ "asn1-rs 0.5.1", - "base64", + "base64 0.13.0", "data-encoding", "der-parser 8.1.0", "lazy_static", From e20ef8f11ecffe61c0d4783412c498a1d94e3854 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 24 May 2023 12:51:30 +0200 Subject: [PATCH 225/339] Updated README.md for bridges (#2629) * Updated README.md * Update BRIDGES.md Co-authored-by: Squirrel --------- Co-authored-by: Squirrel --- BRIDGES.md | 11 +++++++---- parachains/runtimes/bridge-hubs/README.md | 18 +++++++++++++++--- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/BRIDGES.md b/BRIDGES.md index a9fff624cdc..8766de92c17 100644 --- a/BRIDGES.md +++ b/BRIDGES.md @@ -18,13 +18,16 @@ it easier to import that change back to upstream repo. # 2. How to pull latest Bridges code to the `bridges` subtree (in practice) + +The `bridges` repo has a stabilized branch `polkadot-staging` dedicated for releasing. + ``` cd # this will update new git branches from bridges repo # there could be unresolved conflicts, but dont worry, # lots of them are caused because of removed unneeded files with patch step, -./scripts/bridges_update_subtree.sh fetch +BRANCH=polkadot-staging ./scripts/bridges_update_subtree.sh fetch # so, after fetch and before solving conflicts just run patch, # this will remove unneeded files and checks if subtree modules compiles @@ -68,8 +71,8 @@ $ git remote add -f my-bridges git@github.com:tomusdrw/parity-bridges-common.git 2. To update Bridges: ``` -$ git fetch bridges master -$ git subtree pull --prefix=bridges bridges master --squash +$ git fetch bridges polkadot-staging +$ git subtree pull --prefix=bridges bridges polkadot-staging --squash ```` We use `--squash` to avoid adding individual commits and rather squashing them @@ -82,7 +85,7 @@ all into one. 4. Contributing back to Bridges (creating upstream PR) ``` -$ git subtree push --prefix=bridges my-bridges master +$ git subtree push --prefix=bridges my-bridges polkadot-staging ``` This command will push changes to your personal fork of Bridges repo, from where you can simply create a PR to the main repo. diff --git a/parachains/runtimes/bridge-hubs/README.md b/parachains/runtimes/bridge-hubs/README.md index 7e50c7be9f5..d457bc770ea 100644 --- a/parachains/runtimes/bridge-hubs/README.md +++ b/parachains/runtimes/bridge-hubs/README.md @@ -36,10 +36,12 @@ The current trustless bridges planned for the BridgeHub(s) are: mkdir -p ~/local_bridge_testing/bin mkdir -p ~/local_bridge_testing/logs +--- # 1. Install zombienet Go to: https://github.com/paritytech/zombienet/releases Copy the apropriate binary (zombienet-linux) from the latest release to ~/local_bridge_testing/bin +--- # 2. Build polkadot binary git clone https://github.com/paritytech/polkadot.git cd polkadot @@ -52,23 +54,33 @@ cd polkadot cargo build --release --features fast-runtime cp target/release/polkadot ~/local_bridge_testing/bin/polkadot +--- # 3. Build cumulus polkadot-parachain binary cd + # checkout desired branch or use master: -# git checkout -b bridge-hub-rococo-wococo --track origin/bridge-hub-rococo-wococo -git checkout -b master --track origin/master +# git checkout -b master --track origin/master + cargo build --release --locked -p polkadot-parachain-bin cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain-mint +--- # 4. Build substrate-relay binary git clone https://github.com/paritytech/parity-bridges-common.git cd parity-bridges-common + +# checkout desired branch or use master: +# git checkout -b master --track origin/master +git checkout -b polkadot-staging --track origin/polkadot-staging + cargo build --release -p substrate-relay cp target/release/substrate-relay ~/local_bridge_testing/bin/substrate-relay -# (Optional) 5. Build polkadot-parachain-mint binary with statemine/westmint for moving assets +--- +# 5. Build polkadot-parachain-mint binary with statemine/westmint for moving assets cd +# TODO:check-parameter - change this when merged to master git checkout -b bko-transfer-asset-via-bridge --track origin/bko-transfer-asset-via-bridge cargo build --release --locked -p polkadot-parachain-bin cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain-mint From a113748dbc6dac30cb0f75b0421c912b97b18a08 Mon Sep 17 00:00:00 2001 From: Squirrel Date: Wed, 24 May 2023 12:54:40 +0100 Subject: [PATCH 226/339] add statemine emulator tests (#2630) * fix typo * statemine tests * fix statemine tests * cargo fmt, update readme --- Cargo.lock | 26 ++++++++ Cargo.toml | 1 + .../emulated/assets/statemine/Cargo.toml | 36 +++++++++++ .../emulated/assets/statemine/src/lib.rs | 30 +++++++++ .../assets/statemine/src/tests/mod.rs | 3 + .../statemine/src/tests/reserve_transfer.rs | 63 +++++++++++++++++++ .../assets/statemine/src/tests/teleport.rs | 60 ++++++++++++++++++ .../assets/statemine/src/tests/transact.rs | 58 +++++++++++++++++ .../emulated/common/src/constants.rs | 11 ++-- .../emulated/common/src/lib.rs | 16 ++--- xcm/xcm-emulator/README.md | 3 + 11 files changed, 293 insertions(+), 14 deletions(-) create mode 100644 parachains/integration-tests/emulated/assets/statemine/Cargo.toml create mode 100644 parachains/integration-tests/emulated/assets/statemine/src/lib.rs create mode 100644 parachains/integration-tests/emulated/assets/statemine/src/tests/mod.rs create mode 100644 parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs create mode 100644 parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs create mode 100644 parachains/integration-tests/emulated/assets/statemine/src/tests/transact.rs diff --git a/Cargo.lock b/Cargo.lock index 36733773ec2..10bf8ee8462 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13529,6 +13529,32 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "statemine-it" +version = "1.0.0" +dependencies = [ + "frame-support", + "frame-system", + "integration-tests-common", + "pallet-assets", + "pallet-balances", + "pallet-xcm", + "parachains-common", + "parity-scale-codec", + "penpal-runtime", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-runtime", + "polkadot-runtime-parachains", + "sp-core", + "sp-runtime", + "sp-weights", + "statemine-runtime", + "xcm", + "xcm-emulator", + "xcm-executor", +] + [[package]] name = "statemine-runtime" version = "2.0.0" diff --git a/Cargo.toml b/Cargo.toml index dcb862654e8..6027e4cf31b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,6 +53,7 @@ members = [ "parachains/runtimes/glutton/glutton-kusama", "parachains/runtimes/testing/penpal", "parachains/integration-tests/emulated/common", + "parachains/integration-tests/emulated/assets/statemine", "parachains/integration-tests/emulated/assets/statemint", "test/client", "test/relay-sproof-builder", diff --git a/parachains/integration-tests/emulated/assets/statemine/Cargo.toml b/parachains/integration-tests/emulated/assets/statemine/Cargo.toml new file mode 100644 index 00000000000..42ed5ac0605 --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemine/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "statemine-it" +version = "1.0.0" +authors = ["Parity Technologies "] +edition = "2021" +description = "Statemine parachain runtime integration tests with xcm-emulator" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } + +# Substrate +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } + +# Polkadot +polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } +xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } + +# Cumulus +parachains-common = { path = "../../../../common" } +penpal-runtime = { path = "../../../../runtimes/testing/penpal" } +statemine-runtime = { path = "../../../../runtimes/assets/statemine" } + +# Local +xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } +integration-tests-common = { default-features = false, path = "../../common" } diff --git a/parachains/integration-tests/emulated/assets/statemine/src/lib.rs b/parachains/integration-tests/emulated/assets/statemine/src/lib.rs new file mode 100644 index 00000000000..7616a871b84 --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemine/src/lib.rs @@ -0,0 +1,30 @@ +pub use codec::Encode; +pub use frame_support::{ + assert_ok, instances::Instance1, pallet_prelude::Weight, traits::fungibles::Inspect, +}; +pub use integration_tests_common::{ + constants::{ + accounts::{ALICE, BOB}, + kusama::ED as KUSAMA_ED, + PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, + }, + AccountId, BHKusama, BHKusamaPallet, BHKusamaReceiver, BHKusamaSender, BHPolkadot, + BHPolkadotPallet, BHPolkadotReceiver, BHPolkadotSender, Collectives, CollectivesPallet, + CollectivesReceiver, CollectivesSender, Kusama, KusamaMockNet, KusamaPallet, KusamaReceiver, + KusamaSender, PenpalKusama, PenpalKusamaReceiver, PenpalKusamaSender, PenpalPolkadot, + PenpalPolkadotReceiver, PenpalPolkadotSender, Polkadot, PolkadotMockNet, PolkadotPallet, + PolkadotReceiver, PolkadotSender, Statemine, StateminePallet, StatemineReceiver, + StatemineSender, +}; +pub use polkadot_core_primitives::InboundDownwardMessage; +pub use xcm::{ + prelude::*, + v3::{Error, NetworkId::Kusama as KusamaId}, +}; +pub use xcm_emulator::{ + assert_expected_events, bx, cumulus_pallet_dmp_queue, helpers::weight_within_threshold, + Parachain as Para, RelayChain as Relay, TestExt, +}; + +#[cfg(test)] +mod tests; diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/mod.rs b/parachains/integration-tests/emulated/assets/statemine/src/tests/mod.rs new file mode 100644 index 00000000000..996f9fd0aae --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemine/src/tests/mod.rs @@ -0,0 +1,3 @@ +mod reserve_transfer; +mod teleport; +mod transact; diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs new file mode 100644 index 00000000000..2139e0324b9 --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs @@ -0,0 +1,63 @@ +use crate::*; + +#[test] +fn reserve_transfer_native_asset_from_relay_to_assets() { + // Init tests variables + let amount = KUSAMA_ED * 1000; + let relay_sender_balance_before = Kusama::account_data_of(KusamaSender::get()).free; + let para_receiver_balance_before = Statemine::account_data_of(StatemineReceiver::get()).free; + + let origin = ::RuntimeOrigin::signed(KusamaSender::get()); + let assets_para_destination: VersionedMultiLocation = + Kusama::child_location_of(Statemine::para_id()).into(); + let beneficiary: VersionedMultiLocation = + AccountId32 { network: None, id: StatemineReceiver::get().into() }.into(); + let native_assets: VersionedMultiAssets = (Here, amount).into(); + let fee_asset_item = 0; + let weight_limit = WeightLimit::Unlimited; + + // Send XCM message from Relay Chain + Kusama::execute_with(|| { + assert_ok!(::XcmPallet::limited_reserve_transfer_assets( + origin, + bx!(assets_para_destination), + bx!(beneficiary), + bx!(native_assets), + fee_asset_item, + weight_limit, + )); + + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Kusama, + vec![ + RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted(Outcome::Complete(weight))) => { + weight: weight_within_threshold((REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), Weight::from_parts(754_244_000, 0), *weight), + }, + ] + ); + }); + + // Receive XCM message in Assets Parachain + Statemine::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Statemine, + vec![ + RuntimeEvent::DmpQueue(cumulus_pallet_dmp_queue::Event::ExecutedDownward { + outcome: Outcome::Incomplete(_, Error::UntrustedReserveLocation), + .. + }) => {}, + ] + ); + }); + + // Check if balances are updated accordingly in Relay Chain and Assets Parachain + let relay_sender_balance_after = Kusama::account_data_of(KusamaSender::get()).free; + let para_sender_balance_after = Statemine::account_data_of(StatemineReceiver::get()).free; + + assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); + assert_eq!(para_sender_balance_after, para_receiver_balance_before); +} diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs new file mode 100644 index 00000000000..389f1a365ea --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs @@ -0,0 +1,60 @@ +use crate::*; + +#[test] +fn teleport_native_assets_from_relay_to_assets_para() { + // Init tests variables + let amount = KUSAMA_ED * 1000; + let relay_sender_balance_before = Kusama::account_data_of(KusamaSender::get()).free; + let para_receiver_balance_before = Statemine::account_data_of(StatemineReceiver::get()).free; + + let origin = ::RuntimeOrigin::signed(KusamaSender::get()); + let assets_para_destination: VersionedMultiLocation = + Kusama::child_location_of(Statemine::para_id()).into(); + let beneficiary: VersionedMultiLocation = + AccountId32 { network: None, id: StatemineReceiver::get().into() }.into(); + let native_assets: VersionedMultiAssets = (Here, amount).into(); + let fee_asset_item = 0; + let weight_limit = WeightLimit::Unlimited; + + // Send XCM message from Relay Chain + Kusama::execute_with(|| { + assert_ok!(::XcmPallet::limited_teleport_assets( + origin, + bx!(assets_para_destination), + bx!(beneficiary), + bx!(native_assets), + fee_asset_item, + weight_limit, + )); + + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Kusama, + vec![ + RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted(Outcome::Complete { .. })) => {}, + ] + ); + }); + + // Receive XCM message in Assets Parachain + Statemine::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Statemine, + vec![ + RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + who: *who == StatemineReceiver::get().into(), + }, + ] + ); + }); + + // Check if balances are updated accordingly in Relay Chain and Assets Parachain + let relay_sender_balance_after = Kusama::account_data_of(KusamaSender::get()).free; + let para_sender_balance_after = Statemine::account_data_of(StatemineReceiver::get()).free; + + assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); + assert!(para_sender_balance_after > para_receiver_balance_before); +} diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/transact.rs b/parachains/integration-tests/emulated/assets/statemine/src/tests/transact.rs new file mode 100644 index 00000000000..144c8cc9f21 --- /dev/null +++ b/parachains/integration-tests/emulated/assets/statemine/src/tests/transact.rs @@ -0,0 +1,58 @@ +use crate::*; + +#[test] +fn transact_sudo_from_relay_to_assets_para() { + // Init tests variables + // Call to be executed in Assets Parachain + const ASSET_ID: u32 = 1; + + let call = ::RuntimeCall::Assets(pallet_assets::Call::< + ::Runtime, + Instance1, + >::force_create { + id: ASSET_ID.into(), + is_sufficient: true, + min_balance: 1000, + owner: StatemineSender::get().into(), + }) + .encode() + .into(); + + // XcmPallet send arguments + let sudo_origin = ::RuntimeOrigin::root(); + let assets_para_destination: VersionedMultiLocation = + Kusama::child_location_of(Statemine::para_id()).into(); + + let weight_limit = WeightLimit::Unlimited; + let require_weight_at_most = Weight::from_parts(1000000000, 200000); + let origin_kind = OriginKind::Superuser; + let check_origin = None; + + let xcm = VersionedXcm::from(Xcm(vec![ + UnpaidExecution { weight_limit, check_origin }, + Transact { require_weight_at_most, origin_kind, call }, + ])); + + // Send XCM message from Relay Chain + Kusama::execute_with(|| { + assert_ok!(::XcmPallet::send( + sudo_origin, + bx!(assets_para_destination), + bx!(xcm), + )); + + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Kusama, + vec![ + RuntimeEvent::XcmPallet(pallet_xcm::Event::Sent { .. }) => {}, + ] + ); + }); + + // Receive XCM message in Assets Parachain + Statemine::execute_with(|| { + assert!(::Assets::asset_exists(ASSET_ID)); + }); +} diff --git a/parachains/integration-tests/emulated/common/src/constants.rs b/parachains/integration-tests/emulated/common/src/constants.rs index c207a8e7330..694137fe094 100644 --- a/parachains/integration-tests/emulated/common/src/constants.rs +++ b/parachains/integration-tests/emulated/common/src/constants.rs @@ -161,7 +161,6 @@ pub mod polkadot { .map(|k| (k, ED * 4096)) .collect(), }, - indices: polkadot_runtime::IndicesConfig { indices: vec![] }, session: polkadot_runtime::SessionConfig { keys: validators::initial_authorities() .iter() @@ -214,7 +213,9 @@ pub mod polkadot { pub mod kusama { use super::*; pub const ED: Balance = kusama_runtime_constants::currency::EXISTENTIAL_DEPOSIT; - const STASH: u128 = 100 * kusama_runtime_constants::currency::UNITS; + use kusama_runtime_constants::currency::UNITS as KSM; + const ENDOWMENT: u128 = 1_000_000 * KSM; + const STASH: u128 = 100 * KSM; pub fn get_host_config() -> HostConfiguration { HostConfiguration { @@ -253,11 +254,9 @@ pub mod kusama { balances: kusama_runtime::BalancesConfig { balances: accounts::init_balances() .iter() - .cloned() - .map(|k| (k, ED * 4096)) + .map(|k: &AccountId| (k.clone(), ENDOWMENT)) .collect(), }, - indices: kusama_runtime::IndicesConfig { indices: vec![] }, session: kusama_runtime::SessionConfig { keys: validators::initial_authorities() .iter() @@ -278,8 +277,8 @@ pub mod kusama { .collect::>(), }, staking: kusama_runtime::StakingConfig { - minimum_validator_count: 1, validator_count: validators::initial_authorities().len() as u32, + minimum_validator_count: 1, stakers: validators::initial_authorities() .iter() .map(|x| { diff --git a/parachains/integration-tests/emulated/common/src/lib.rs b/parachains/integration-tests/emulated/common/src/lib.rs index e2587e9bf02..49e919b5de9 100644 --- a/parachains/integration-tests/emulated/common/src/lib.rs +++ b/parachains/integration-tests/emulated/common/src/lib.rs @@ -40,9 +40,9 @@ decl_test_relay_chains! { runtime = { Runtime: kusama_runtime::Runtime, RuntimeOrigin: kusama_runtime::RuntimeOrigin, - RuntimeCall: polkadot_runtime::RuntimeCall, + RuntimeCall: kusama_runtime::RuntimeCall, RuntimeEvent: kusama_runtime::RuntimeEvent, - MessageQueue: polkadot_runtime::MessageQueue, + MessageQueue: kusama_runtime::MessageQueue, XcmConfig: kusama_runtime::xcm_config::XcmConfig, SovereignAccountOf: kusama_runtime::xcm_config::SovereignAccountOf, System: kusama_runtime::System, @@ -83,7 +83,7 @@ decl_test_parachains! { runtime = { Runtime: penpal_runtime::Runtime, RuntimeOrigin: penpal_runtime::RuntimeOrigin, - RuntimeCall: penpal_runtime::RuntimeEvent, + RuntimeCall: penpal_runtime::RuntimeCall, RuntimeEvent: penpal_runtime::RuntimeEvent, XcmpMessageHandler: penpal_runtime::XcmpQueue, DmpMessageHandler: penpal_runtime::DmpQueue, @@ -105,7 +105,7 @@ decl_test_parachains! { runtime = { Runtime: statemine_runtime::Runtime, RuntimeOrigin: statemine_runtime::RuntimeOrigin, - RuntimeCall: statemine_runtime::RuntimeEvent, + RuntimeCall: statemine_runtime::RuntimeCall, RuntimeEvent: statemine_runtime::RuntimeEvent, XcmpMessageHandler: statemine_runtime::XcmpQueue, DmpMessageHandler: statemine_runtime::DmpQueue, @@ -127,7 +127,7 @@ decl_test_parachains! { runtime = { Runtime: penpal_runtime::Runtime, RuntimeOrigin: penpal_runtime::RuntimeOrigin, - RuntimeCall: penpal_runtime::RuntimeEvent, + RuntimeCall: penpal_runtime::RuntimeCall, RuntimeEvent: penpal_runtime::RuntimeEvent, XcmpMessageHandler: penpal_runtime::XcmpQueue, DmpMessageHandler: penpal_runtime::DmpQueue, @@ -148,7 +148,7 @@ decl_test_parachains! { runtime = { Runtime: collectives_polkadot_runtime::Runtime, RuntimeOrigin: collectives_polkadot_runtime::RuntimeOrigin, - RuntimeCall: collectives_polkadot_runtime::RuntimeEvent, + RuntimeCall: collectives_polkadot_runtime::RuntimeCall, RuntimeEvent: collectives_polkadot_runtime::RuntimeEvent, XcmpMessageHandler: collectives_polkadot_runtime::XcmpQueue, DmpMessageHandler: collectives_polkadot_runtime::DmpQueue, @@ -168,7 +168,7 @@ decl_test_parachains! { runtime = { Runtime: bridge_hub_kusama_runtime::Runtime, RuntimeOrigin: bridge_hub_kusama_runtime::RuntimeOrigin, - RuntimeCall: bridge_hub_kusama_runtime::RuntimeEvent, + RuntimeCall: bridge_hub_kusama_runtime::RuntimeCall, RuntimeEvent: bridge_hub_kusama_runtime::RuntimeEvent, XcmpMessageHandler: bridge_hub_kusama_runtime::XcmpQueue, DmpMessageHandler: bridge_hub_kusama_runtime::DmpQueue, @@ -188,7 +188,7 @@ decl_test_parachains! { runtime = { Runtime: bridge_hub_polkadot_runtime::Runtime, RuntimeOrigin: bridge_hub_polkadot_runtime::RuntimeOrigin, - RuntimeCall: bridge_hub_polkadot_runtime::RuntimeEvent, + RuntimeCall: bridge_hub_polkadot_runtime::RuntimeCall, RuntimeEvent: bridge_hub_polkadot_runtime::RuntimeEvent, XcmpMessageHandler: bridge_hub_polkadot_runtime::XcmpQueue, DmpMessageHandler: bridge_hub_polkadot_runtime::DmpQueue, diff --git a/xcm/xcm-emulator/README.md b/xcm/xcm-emulator/README.md index 5087ae4ac3c..aa1bd3d5406 100644 --- a/xcm/xcm-emulator/README.md +++ b/xcm/xcm-emulator/README.md @@ -13,6 +13,9 @@ As the messages do not physically go through the same messaging infrastructure there is some code that is not being tested compared to using slower E2E tests. In future it may be possible to run these XCM emulated tests as E2E tests (without changes). +As well as the XCM message transport being mocked out, so too are areas around consensus, +in particular things like disputes, staking and iamonline events can't be tested. + ## Alternatives If you just wish to test execution of various XCM instructions From 06025a61d802418aabc71506026deba14840c338 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 14:02:21 +0200 Subject: [PATCH 227/339] Bump criterion from 0.4.0 to 0.5.0 (#2628) Bumps [criterion](https://github.com/bheisler/criterion.rs) from 0.4.0 to 0.5.0. - [Changelog](https://github.com/bheisler/criterion.rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/bheisler/criterion.rs/compare/0.4.0...0.5.0) --- updated-dependencies: - dependency-name: criterion dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 63 ++++++++++------------------------------- test/service/Cargo.toml | 2 +- 2 files changed, 16 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 10bf8ee8462..6fc55af97fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1525,18 +1525,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "clap" -version = "3.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750" -dependencies = [ - "bitflags", - "clap_lex 0.2.2", - "indexmap", - "textwrap", -] - [[package]] name = "clap" version = "4.2.7" @@ -1557,7 +1545,7 @@ dependencies = [ "anstream", "anstyle 1.0.0", "bitflags", - "clap_lex 0.4.1", + "clap_lex", "strsim", ] @@ -1573,15 +1561,6 @@ dependencies = [ "syn 2.0.16", ] -[[package]] -name = "clap_lex" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5538cd660450ebeb4234cfecf8f2284b844ffc4c50531e66d584ad5b91293613" -dependencies = [ - "os_str_bytes", -] - [[package]] name = "clap_lex" version = "0.4.1" @@ -2017,20 +1996,20 @@ dependencies = [ [[package]] name = "criterion" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +checksum = "9f9c16c823fba76d9643cc387e9677d9771abe0827561381815215c47f808da9" dependencies = [ "anes", - "atty", "cast", "ciborium", - "clap 3.2.22", + "clap", "criterion-plot", "futures", + "is-terminal", "itertools", - "lazy_static", "num-traits", + "once_cell", "oorandom", "plotters", "rayon", @@ -2198,7 +2177,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.2.7", + "clap", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -2866,7 +2845,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.2.7", + "clap", "criterion", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -3857,7 +3836,7 @@ dependencies = [ "Inflector", "array-bytes 4.2.0", "chrono", - "clap 4.2.7", + "clap", "comfy-table", "frame-benchmarking", "frame-support", @@ -6657,12 +6636,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "os_str_bytes" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" - [[package]] name = "p256" version = "0.11.1" @@ -8017,7 +7990,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.2.7", + "clap", "color-print", "cumulus-client-cli", "cumulus-client-consensus-aura", @@ -8679,7 +8652,7 @@ name = "polkadot-cli" version = "0.9.41" source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" dependencies = [ - "clap 4.2.7", + "clap", "frame-benchmarking-cli", "futures", "log", @@ -9371,7 +9344,7 @@ dependencies = [ "bridge-hub-kusama-runtime", "bridge-hub-polkadot-runtime", "bridge-hub-rococo-runtime", - "clap 4.2.7", + "clap", "collectives-polkadot-runtime", "color-print", "contracts-rococo-runtime", @@ -11188,7 +11161,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994 dependencies = [ "array-bytes 4.2.0", "chrono", - "clap 4.2.7", + "clap", "fdlimit", "futures", "libp2p-identity", @@ -12035,7 +12008,7 @@ name = "sc-storage-monitor" version = "0.1.0" source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ - "clap 4.2.7", + "clap", "fs4", "futures", "log", @@ -14098,12 +14071,6 @@ dependencies = [ "sp-weights", ] -[[package]] -name = "textwrap" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16" - [[package]] name = "thiserror" version = "1.0.40" @@ -14628,7 +14595,7 @@ version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" dependencies = [ "async-trait", - "clap 4.2.7", + "clap", "frame-remote-externalities", "frame-try-runtime", "hex", diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 11214404d44..dc28850ea43 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -12,7 +12,7 @@ path = "src/main.rs" async-trait = "0.1.68" clap = { version = "4.2.7", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } -criterion = { version = "0.4.0", features = [ "async_tokio" ] } +criterion = { version = "0.5.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" serde = { version = "1.0.163", features = ["derive"] } From 888b54391d4bc33d96fc379c1d4abaa41a04bd06 Mon Sep 17 00:00:00 2001 From: Ignacio Palacios Date: Wed, 24 May 2023 20:07:22 +0200 Subject: [PATCH 228/339] Update & revamp e2e tests (#2614) * update & revamp e2e tests * add seeds as comments * ".git/.scripts/commands/fmt/fmt.sh" --------- Co-authored-by: command-bot <> --- client/network/src/lib.rs | 21 +++-- .../e2e/assets/statemine/0_xcm/0_init.yml | 51 +++++------- .../e2e/assets/statemine/0_xcm/1_dmp.yml | 78 +++++++++---------- .../e2e/assets/statemine/0_xcm/2_ump.yml | 73 +++++++---------- ...els.yml => 3_force_hrmp-open-channels.yml} | 52 +++++-------- .../e2e/assets/statemine/0_xcm/4_hrmp.yml | 71 +++++++---------- .../e2e/assets/statemine/config.toml | 5 +- .../e2e/assets/statemint/0_xcm/0_init.yml | 39 ++++------ .../e2e/assets/statemint/0_xcm/1_dmp.yml | 77 +++++++++--------- .../e2e/assets/statemint/0_xcm/2_ump.yml | 67 +++++++--------- ...els.yml => 3_force_hrmp-open-channels.yml} | 44 ++++------- .../e2e/assets/statemint/0_xcm/4_hrmp.yml | 75 ++++++++---------- .../e2e/assets/statemint/config.toml | 5 +- .../0_xcm/0_init.yml | 34 ++++---- .../0_xcm/1_teleport.yml | 39 ++++------ .../0_xcm/2_reserve.yml | 20 +++-- .../1_alliance/0_join_alliance_fails.yml | 17 ++-- .../1_alliance/1_init_alliance.yml | 78 +++++++------------ .../1_alliance/2_join_alliance_fails.yml | 18 ++--- .../1_alliance/3_kick_member.yml | 47 ++++------- .../config.toml | 13 ++-- 21 files changed, 392 insertions(+), 532 deletions(-) rename parachains/integration-tests/e2e/assets/statemine/0_xcm/{3_hrmp-open-channels.yml => 3_force_hrmp-open-channels.yml} (66%) rename parachains/integration-tests/e2e/assets/statemint/0_xcm/{3_hrmp-open-channels.yml => 3_force_hrmp-open-channels.yml} (72%) rename parachains/integration-tests/e2e/collectives/{collectives_polkadot => collectives-polkadot}/0_xcm/0_init.yml (79%) rename parachains/integration-tests/e2e/collectives/{collectives_polkadot => collectives-polkadot}/0_xcm/1_teleport.yml (85%) rename parachains/integration-tests/e2e/collectives/{collectives_polkadot => collectives-polkadot}/0_xcm/2_reserve.yml (71%) rename parachains/integration-tests/e2e/collectives/{collectives_polkadot => collectives-polkadot}/1_alliance/0_join_alliance_fails.yml (53%) rename parachains/integration-tests/e2e/collectives/{collectives_polkadot => collectives-polkadot}/1_alliance/1_init_alliance.yml (79%) rename parachains/integration-tests/e2e/collectives/{collectives_polkadot => collectives-polkadot}/1_alliance/2_join_alliance_fails.yml (53%) rename parachains/integration-tests/e2e/collectives/{collectives_polkadot => collectives-polkadot}/1_alliance/3_kick_member.yml (82%) rename parachains/integration-tests/e2e/collectives/{collectives_polkadot => collectives-polkadot}/config.toml (78%) diff --git a/client/network/src/lib.rs b/client/network/src/lib.rs index 0c15ab3add5..e226170d7c5 100644 --- a/client/network/src/lib.rs +++ b/client/network/src/lib.rs @@ -89,14 +89,13 @@ impl BlockAnnounceData { /// /// This will not check the signature, for this you should use [`BlockAnnounceData::check_signature`]. fn validate(&self, encoded_header: Vec) -> Result<(), Validation> { - let candidate_hash = if let CompactStatement::Seconded(h) = - self.statement.unchecked_payload() - { - h - } else { - tracing::debug!(target: LOG_TARGET, "`CompactStatement` isn't the candidate variant!",); - return Err(Validation::Failure { disconnect: true }) - }; + let candidate_hash = + if let CompactStatement::Seconded(h) = self.statement.unchecked_payload() { + h + } else { + tracing::debug!(target: LOG_TARGET, "`CompactStatement` isn't the candidate variant!",); + return Err(Validation::Failure { disconnect: true }) + }; if *candidate_hash != self.receipt.hash() { tracing::debug!( @@ -334,9 +333,9 @@ where let relay_chain_is_syncing = relay_chain_interface .is_major_syncing() .await - .map_err(|e| { - tracing::error!(target: LOG_TARGET, "Unable to determine sync status. {}", e) - }) + .map_err( + |e| tracing::error!(target: LOG_TARGET, "Unable to determine sync status. {}", e), + ) .unwrap_or(false); if relay_chain_is_syncing { diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml index b770c8e569e..ebcbe417bbb 100644 --- a/parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml +++ b/parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml @@ -11,8 +11,9 @@ settings: paraId: &pp_id 2000 variables: common: - xcm_version: &xcm_version '3' + xcm_version: &xcm_version 3 require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 200000} + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } chains: relay_chain: signer: &rc_signer //Alice @@ -56,13 +57,9 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.SupportedVersionChanged - attributes: - - type: u32 - value: *xcm_version + result: [{ parents: 0, interior: { X1: { Parachain: *ap_id }}}, *xcm_version ] - extrinsics: # Relay Chain sets supported version for Penpal Parachain - chain: *relay_chain sudo: true @@ -82,13 +79,9 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.SupportedVersionChanged - attributes: - - type: u32 - value: *xcm_version + result: [{ parents: 0, interior: { X1: { Parachain: *pp_id }}}, *xcm_version ] - extrinsics: # Asset Parachain sets supported version for Relay Chain through it - chain: *relay_chain signer: *rc_signer @@ -101,11 +94,11 @@ tests: v3: [ #message { UnpaidExecution: { - weightLimit: { - limited: { - refTime: 2200000000, - proofSize: 200000 - } + weightLimit: { + limited: { + refTime: 2200000000, + proofSize: 200000 + } } } }, @@ -121,15 +114,17 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '1,019,210,000', proofSize: '200,000' }} + } - name: polkadotXcm.SupportedVersionChanged chain: *assets_parachain - attributes: - - type: u32 - value: *xcm_version + result: [{ parents: 1, interior: Here }, *xcm_version ] - extrinsics: # Penpal Parachain sets supported version for Relay Chain - chain: *penpal_parachain signer: *pp_signer @@ -145,10 +140,6 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: polkadotXcm.SupportedVersionChanged - attributes: - - type: u32 - value: *xcm_version + result: [{ parents: 1, interior: Here }, *xcm_version ] diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml index 0852a3907db..1fb4a8abb84 100644 --- a/parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml +++ b/parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml @@ -7,20 +7,23 @@ settings: wsPort: 9910 paraId: &ap_id 1000 variables: - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} - amount: &amount 1000000000000 - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - require_weight_at_most: &rc_weight_at_most {refTime: 1000000000, proofSize: 200000} - assets_parachain_account: - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - asset_id: &asset_id 1 - asset_min_balance: &asset_ed 1000 + common: + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } + chains: + relay_chain: + signer: &rc_signer //Alice + wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + assets_parachain_destination: &ap_dest { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + assets_parachain_beneficiary: &ap_benf { v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} + ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} + amount: &amount 1000000000000 + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + require_weight_at_most: &rc_weight_at_most { refTime: 1000000000, proofSize: 200000 } + assets_parachain_account: + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + asset_id: &asset_id 1 + asset_min_balance: &asset_ed 1000 decodedCalls: force_create_asset: chain: *assets_parachain @@ -69,16 +72,14 @@ tests: ] events: - name: xcmPallet.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: [{ Complete: { refTime: '764,772,000', proofSize: 0 }}] - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"162,379,000","proofSize":"0"} + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }} + } - queries: balance_rc_sender_after: chain: *relay_chain @@ -151,11 +152,10 @@ tests: - name: xcmPallet.Sent - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"1,014,103,000","proofSize":"200,000"} + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '1,014,103,000', proofSize: '200,000' }} + } - queries: forced_created_asset: chain: *assets_parachain @@ -196,9 +196,7 @@ tests: ] events: - name: system.ExtrinsicFailed - attributes: - - type: SpRuntimeDispatchError - value: BadOrigin + result: { dispatchError: BadOrigin } - name: xcmPallet.limitedReserveTransferAssets before: *before_get_balances @@ -219,17 +217,19 @@ tests: ] events: - name: xcmPallet.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"750,645,000","proofSize":"0"} + threshold: *weight_threshold + result: [{ Complete: { refTime: '750,645,000', proofSize: 0 }}] - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Incomplete - value: [{"refTime":"1,000,000,000","proofSize":"0"},"UntrustedReserveLocation"] + threshold: *weight_threshold + result: { + outcome: { + Incomplete: [ + { refTime: '1,000,000,000', proofSize: 0 }, + UntrustedReserveLocation + ] + } + } - queries: balance_rc_sender_after: chain: *relay_chain diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml index 46519da3fde..3cdb9547c35 100644 --- a/parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml +++ b/parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml @@ -10,22 +10,24 @@ settings: common: amount: &amount 1000000000000 require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 0} - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F #Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} - assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' #Alice - relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *rc_acc }}}}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } + chains: + relay_chain: + signer: &rc_signer //Alice + wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F #Alice + assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} + ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + assets_parachain_account: + signer: &ap_signer //Alice + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} + assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' #Alice + relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *rc_acc }}}}} + ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} + ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} decodedCalls: system_remark: chain: *relay_chain @@ -54,18 +56,14 @@ tests: ] events: - name: xcmPallet.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"761,173,000","proofSize":"0"} + threshold: *weight_threshold + result: [{ Complete: { refTime: '761,173,000', proofSize: 0 }}] - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"162,379,000","proofSize":"0"} + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }} + } - name: Get the balances of the Assets Parachain's sender & Relay Chain's receiver actions: @@ -97,18 +95,12 @@ tests: ] events: - name: polkadotXcm.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"539,494,000","proofSize":"7,133"} + threshold: *weight_threshold + result: [{ Complete: { refTime: '539,494,000', proofSize: '7,133' }}] - name: ump.ExecutedUpward chain: *relay_chain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"298,716,000","proofSize":"0"} + threshold: *weight_threshold + result: [{ Complete: { refTime: '298,716,000', proofSize: 0 }}] - queries: balance_ap_sender_after: chain: *assets_parachain @@ -178,9 +170,7 @@ tests: ] events: - name: system.ExtrinsicFailed - attributes: - - type: SpRuntimeDispatchError - value: BadOrigin + result: { dispatchError: BadOrigin } - name: polkadotXcm.limitedReserveTransferAssets its: @@ -200,7 +190,4 @@ tests: ] events: - name: polkadotXcm.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Error - value: Barrier + result: [{ Error: Barrier }] diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/3_hrmp-open-channels.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/3_force_hrmp-open-channels.yml similarity index 66% rename from parachains/integration-tests/e2e/assets/statemine/0_xcm/3_hrmp-open-channels.yml rename to parachains/integration-tests/e2e/assets/statemine/0_xcm/3_force_hrmp-open-channels.yml index cc1fc9da146..dfdae028f00 100644 --- a/parachains/integration-tests/e2e/assets/statemine/0_xcm/3_hrmp-open-channels.yml +++ b/parachains/integration-tests/e2e/assets/statemine/0_xcm/3_force_hrmp-open-channels.yml @@ -3,23 +3,22 @@ settings: chains: relay_chain: &relay_chain wsPort: 9900 - assets_parachain: &assets_parachain + assets_parachain: wsPort: 9910 paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain + penpal_parachain: wsPort: 9920 paraId: &pp_id 2000 variables: common: amount: &amount 2000000000000 - require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 20000} hrmp_channels: proposed_max_capacity: &max_capacity 8 proposed_max_message_size: &max_message_size 8192 channel: &channel { - maxCapacity: 8, - maxTotalSize: 8192, - maxMessageSize: 8192, + maxCapacity: *max_capacity, + maxTotalSize: *max_message_size, + maxMessageSize: *max_message_size, msgCount: 0, totalSize: 0, mqcHead: null, @@ -29,17 +28,10 @@ settings: chains: relay_chain: signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} assets_parachain_account: sovereign_account: &ap_sovereign F7fq1jSNVTPfJmaHaXCMtatT1EZefCUsa7rRiQVNR5efcah - relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} penpal_parachain: sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ - signer: &pp_signer //Alice tests: - name: HRMP @@ -72,7 +64,7 @@ tests: events: - name: balances.Transfer describes: - - name: hrmp.hrmpInitOpenChannel (Penpal Parachain → Assets Parachain) + - name: hrmp.forceOpenHrmpChannel (Penpal Parachain → Assets Parachain) its: - name: Open Penpal Parachain to Assets Parachain actions: @@ -83,18 +75,17 @@ tests: pallet: hrmp call: forceOpenHrmpChannel args: [ - 2000, - 1000, - 8, - 8192 + *pp_id, + *ap_id, + *max_capacity, + *max_message_size ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: hrmp.HrmpChannelForceOpened - - name: hrmp.hrmpInitOpenChannel (Assets Parachain → PenPal Parachain) + + - name: hrmp.forceOpenHrmpChannel (Assets Parachain → PenPal Parachain) its: - name: Open Assets Parachain to PenPal Parachain actions: @@ -105,17 +96,16 @@ tests: pallet: hrmp call: forceOpenHrmpChannel args: [ - 1000, - 2000, - 8, - 8192 + *ap_id, + *pp_id, + *max_capacity, + *max_message_size ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: hrmp.HrmpChannelForceOpened + - name: hrmp.forceProcessHrmpOpen (make sure all the channels are open) its: - name: Make sure all the pending channels are open @@ -129,6 +119,4 @@ tests: args: [ 2 ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml index e47ae5a4054..9e2decffe15 100644 --- a/parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml +++ b/parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml @@ -17,6 +17,7 @@ settings: amount: &amount 100000000000 require_weight_at_most: &weight_at_most {refTime: 1200000000, proofSize: 20000} amount_to_send: &amount_to_send 500000000000 + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } chains: relay_chain: signer: &rc_signer //Alice @@ -83,7 +84,7 @@ tests: } }, { - SetTopic: "0x0123456789012345678901234567891201234567890123456789012345678912" + SetTopic: '0x0123456789012345678901234567891201234567890123456789012345678912' }, { Transact: { @@ -99,11 +100,10 @@ tests: - name: xcmPallet.Sent - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"1,216,703,000","proofSize":"20,000"} + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '1,216,703,000', proofSize: '20,000' }} + } - queries: forced_created_asset: chain: *assets_parachain @@ -128,6 +128,7 @@ tests: ] events: - name: assets.Issued + result: { assetId: *asset_id, owner: *ap_wallet, amount: *mint_amount } its: - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain @@ -180,19 +181,15 @@ tests: ] events: - name: polkadotXcm.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"679,150,000","proofSize":"6,196"} - - name: assets.Transferred - attributes: - - type: AccountId32 - value: *pp_sovereign_sibl + threshold: *weight_threshold + result: [{ Complete: { refTime: '679,150,000', proofSize: '6,196' }}] - name: assets.Transferred - attributes: - - type: u128 - value: *amount_to_send + result: { + assetId: *asset_id, + from: *ap_wallet, + to: *pp_sovereign_sibl, + amount: *amount_to_send + } - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain its: @@ -227,19 +224,13 @@ tests: ] events: - name: polkadotXcm.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"679,150,000","proofSize":"6,196"} + threshold: *weight_threshold + result: [{ Complete: { refTime: '679,150,000', proofSize: '6,196' }}] - name: balances.Endowed - attributes: - - type: AccountId32 - value: *pp_sovereign_sibl - - name: balances.Endowed - attributes: - - type: u128 - value: *amount + result: { + account: *pp_sovereign_sibl, + freeBalance: *amount + } - name: polkadotXcm.send( assets.forceCreateAsset ) | Penpal Parachain -> Assets Parachain before: @@ -320,20 +311,14 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: polkadotXcm.Sent - name: assets.Burned chain: *assets_parachain - attributes: - - type: AccountId32 - value: *pp_sovereign_sibl + result: { assetId: *asset_id, owner: *pp_sovereign_sibl } - name: assets.Issued chain: *assets_parachain - attributes: - - type: u32 - value: *asset_id + result: { assetId: *asset_id } - queries: assets_balance_pp_sovereign_after: chain: *assets_parachain @@ -398,6 +383,8 @@ tests: events: - name: xcmpQueue.Fail chain: *assets_parachain - attributes: - - type: XcmV3TraitsError - value: FailedToTransactAsset + threshold: *weight_threshold + result: { + error: FailedToTransactAsset, + weight: { refTime: '152,426,000', proofSize: '3,593' } + } diff --git a/parachains/integration-tests/e2e/assets/statemine/config.toml b/parachains/integration-tests/e2e/assets/statemine/config.toml index 6aa7ee8d116..57c8f37e24b 100644 --- a/parachains/integration-tests/e2e/assets/statemine/config.toml +++ b/parachains/integration-tests/e2e/assets/statemine/config.toml @@ -7,6 +7,7 @@ chain = "kusama-local" name = "alice" ws_port = 9900 validator = true + args = ["--state-cache-size=0"] [[relaychain.nodes]] name = "bob" @@ -32,7 +33,7 @@ cumulus_based = true name = "collator1" ws_port = 9910 command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] + args = [ "-lxcm=trace", "--state-cache-size=0" ] [[parachains.collators]] name = "collator2" @@ -49,7 +50,7 @@ cumulus_based = true name = "collator3" ws_port = 9920 command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] + args = [ "-lxcm=trace", "--state-cache-size=0" ] [[parachains.collators]] name = "collator4" diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml index 95c77f72d0d..55dbab6ba4c 100644 --- a/parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml +++ b/parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml @@ -13,6 +13,7 @@ settings: common: xcm_version: &xcm_version '3' require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 200000} + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } chains: relay_chain: signer: &rc_signer //Alice @@ -56,13 +57,9 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.SupportedVersionChanged - attributes: - - type: u32 - value: *xcm_version + result: [{ parents: 0, interior: { X1: { Parachain: *ap_id }}}, *xcm_version ] - extrinsics: # Relay Chain sets supported version for Penpal Parachain - chain: *relay_chain sudo: true @@ -82,13 +79,9 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.SupportedVersionChanged - attributes: - - type: u32 - value: *xcm_version + result: [{ parents: 0, interior: { X1: { Parachain: *pp_id }}}, *xcm_version ] - extrinsics: # Asset Parachain sets supported version for Relay Chain through it - chain: *relay_chain signer: *rc_signer @@ -121,15 +114,17 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '1,019,210,000', proofSize: '200,000' }} + } - name: polkadotXcm.SupportedVersionChanged chain: *assets_parachain - attributes: - - type: u32 - value: *xcm_version + result: [{ parents: 1, interior: Here }, *xcm_version ] - extrinsics: # Penpal Parachain sets supported version for Relay Chain - chain: *penpal_parachain signer: *pp_signer @@ -145,10 +140,6 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: polkadotXcm.SupportedVersionChanged - attributes: - - type: u32 - value: *xcm_version + result: [{ parents: 1, interior: Here }, *xcm_version ] diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml index 96a97ba728d..823974ad806 100644 --- a/parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml +++ b/parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml @@ -7,20 +7,23 @@ settings: wsPort: 9810 paraId: &ap_id 1000 variables: - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} - amount: &amount 1000000000000 - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - require_weight_at_most: &rc_weight_at_most {refTime: 1000000000, proofSize: 200000} - assets_parachain_account: - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - asset_id: &asset_id 1 - asset_min_balance: &asset_ed 1000 + common: + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } + chains: + relay_chain: + signer: &rc_signer //Alice + wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + assets_parachain_destination: &ap_dest { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} + ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} + amount: &amount 1000000000000 + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + require_weight_at_most: &rc_weight_at_most {refTime: 1000000000, proofSize: 200000} + assets_parachain_account: + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + asset_id: &asset_id 1 + asset_min_balance: &asset_ed 1000 decodedCalls: force_create_asset: chain: *assets_parachain @@ -69,16 +72,14 @@ tests: ] events: - name: xcmPallet.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: [{ Complete: { refTime: '3,000,000,000', proofSize: 0 }}] - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"162,909,000","proofSize":"0"} + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }} + } - queries: balance_rc_sender_after: chain: *relay_chain @@ -151,11 +152,10 @@ tests: - name: xcmPallet.Sent - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"1,015,234,000","proofSize":"200,000"} + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '1,014,103,000', proofSize: '200,000' }} + } - queries: forced_created_asset: chain: *assets_parachain @@ -196,9 +196,7 @@ tests: ] events: - name: system.ExtrinsicFailed - attributes: - - type: SpRuntimeDispatchError - value: BadOrigin + result: { dispatchError: BadOrigin } - name: xcmPallet.limitedReserveTransferAssets before: *before_get_balances @@ -219,16 +217,19 @@ tests: ] events: - name: xcmPallet.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - value: {"refTime":"2,000,000,000","proofSize":"0"} + threshold: *weight_threshold + result: [{ Complete: { refTime: '2,000,000,000', proofSize: 0 }}] - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Incomplete - value: [{"refTime":"1,000,000,000","proofSize":"0"},"UntrustedReserveLocation"] + threshold: *weight_threshold + result: { + outcome: { + Incomplete: [ + { refTime: '1,000,000,000', proofSize: 0 }, + UntrustedReserveLocation + ] + } + } - queries: balance_rc_sender_after: chain: *relay_chain diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml index d839375320b..4bdeceb765c 100644 --- a/parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml +++ b/parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml @@ -10,22 +10,24 @@ settings: common: amount: &amount 1000000000000 require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 0} - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} - assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *rc_acc }}}}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } + chains: + relay_chain: + signer: &rc_signer //Alice + wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} + ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + assets_parachain_account: + signer: &ap_signer //Alice + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} + assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *rc_acc }}}}} + ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} + ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} decodedCalls: system_remark: chain: *relay_chain @@ -54,17 +56,14 @@ tests: ] events: - name: xcmPallet.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - value: {"refTime":"3,000,000,000","proofSize":"0"} + threshold: *weight_threshold + result: [{ Complete: { refTime: '3,000,000,000', proofSize: 0 }}] - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"162,909,000","proofSize":"0"} + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }} + } - name: Get the balances of the Assets Parachain's sender & Relay Chain's receiver actions: @@ -97,17 +96,12 @@ tests: ] events: - name: polkadotXcm.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"533,283,000","proofSize":"7,096"} + threshold: *weight_threshold + result: [{ Complete: { refTime: '533,283,000', proofSize: '7,096' }}] - name: ump.ExecutedUpward chain: *relay_chain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - value: {"refTime":"4,000,000,000","proofSize":"0"} + threshold: *weight_threshold + result: [{ Complete: { refTime: '4,000,000,000', proofSize: 0 }}] - queries: balance_ap_sender_after: chain: *assets_parachain @@ -199,7 +193,4 @@ tests: ] events: - name: polkadotXcm.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Error - value: Barrier + result: [{ Error: Barrier }] diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/3_hrmp-open-channels.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/3_force_hrmp-open-channels.yml similarity index 72% rename from parachains/integration-tests/e2e/assets/statemint/0_xcm/3_hrmp-open-channels.yml rename to parachains/integration-tests/e2e/assets/statemint/0_xcm/3_force_hrmp-open-channels.yml index a274282df30..ecf344a073b 100644 --- a/parachains/integration-tests/e2e/assets/statemint/0_xcm/3_hrmp-open-channels.yml +++ b/parachains/integration-tests/e2e/assets/statemint/0_xcm/3_force_hrmp-open-channels.yml @@ -3,23 +3,22 @@ settings: chains: relay_chain: &relay_chain wsPort: 9800 - assets_parachain: &assets_parachain + assets_parachain: wsPort: 9810 paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain + penpal_parachain: wsPort: 9820 paraId: &pp_id 2000 variables: common: amount: &amount 2000000000000 - require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 20000} hrmp_channels: proposed_max_capacity: &max_capacity 8 proposed_max_message_size: &max_message_size 8192 channel: &channel { - maxCapacity: 8, - maxTotalSize: 8192, - maxMessageSize: 8192, + maxCapacity: *max_capacity, + maxTotalSize: *max_message_size, + maxMessageSize: *max_message_size, msgCount: 0, totalSize: 0, mqcHead: null, @@ -29,15 +28,10 @@ settings: chains: relay_chain: signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} assets_parachain_account: sovereign_account: &ap_sovereign 5Ec4AhPZk8STuex8Wsi9TwDtJQxKqzPJRCH7348Xtcs9vZLJ - relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} penpal_parachain: sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ - signer: &pp_signer //Alice tests: - name: HRMP @@ -81,16 +75,14 @@ tests: pallet: hrmp call: forceOpenHrmpChannel args: [ - 2000, - 1000, - 8, - 8192 + *pp_id, + *ap_id, + *max_capacity, + *max_message_size ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: hrmp.HrmpChannelForceOpened - name: hrmp.hrmpInitOpenChannel (Assets Parachain → PenPal Parachain) its: @@ -103,16 +95,14 @@ tests: pallet: hrmp call: forceOpenHrmpChannel args: [ - 1000, - 2000, - 8, - 8192 + *ap_id, + *pp_id, + *max_capacity, + *max_message_size ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: hrmp.HrmpChannelForceOpened - name: hrmp.forceProcessHrmpOpen (make sure all the channels are open) its: @@ -127,6 +117,4 @@ tests: args: [ 2 ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml index c36192fd5a3..4ff2fbc59a4 100644 --- a/parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml +++ b/parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml @@ -1,4 +1,6 @@ --- +# Note: This tests depends on the 3_hrmp-open-channels.yml for opening channels, otherwise teleports aren't going to +# work. settings: chains: relay_chain: &relay_chain @@ -15,6 +17,7 @@ settings: amount: &amount 1000000000000 require_weight_at_most: &weight_at_most {refTime: 1200000000, proofSize: 20000} amount_to_send: &amount_to_send 500000000000 + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } chains: relay_chain: signer: &rc_signer //Alice @@ -22,7 +25,7 @@ settings: assets_parachain_dest_routed: &ap_dest_routed { v3: { parents: 1, interior: { x1: { parachain: *ap_id } }}} assets_parachain_account: signer: &ap_signer //Alice - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + wallet: &ap_wallet 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5 asset_id: &asset_id 2 assets_pallet_id: &assets_pallet_id 50 asset_min_balance: &asset_ed 1000 @@ -81,7 +84,7 @@ tests: } }, { - SetTopic: "0x0123456789012345678901234567891201234567890123456789012345678912" + SetTopic: '0x0123456789012345678901234567891201234567890123456789012345678912' }, { Transact: { @@ -97,11 +100,10 @@ tests: - name: xcmPallet.Sent - name: dmpQueue.ExecutedDownward chain: *assets_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"1,218,405,000","proofSize":"20,000"} + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '1,216,703,000', proofSize: '20,000' }} + } - queries: forced_created_asset: chain: *assets_parachain @@ -126,6 +128,7 @@ tests: ] events: - name: assets.Issued + result: { assetId: *asset_id, owner: *ap_wallet, amount: *mint_amount } its: - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain @@ -178,19 +181,15 @@ tests: ] events: - name: polkadotXcm.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"673,627,000","proofSize":"6,196"} - - name: assets.Transferred - attributes: - - type: AccountId32 - value: *pp_sovereign_sibl + threshold: *weight_threshold + result: [{ Complete: { refTime: '673,627,000', proofSize: '6,196' }}] - name: assets.Transferred - attributes: - - type: u128 - value: *amount_to_send + result: { + assetId: *asset_id, + from: *ap_wallet, + to: *pp_sovereign_sibl, + amount: *amount_to_send + } - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain its: @@ -225,19 +224,13 @@ tests: ] events: - name: polkadotXcm.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete - threshold: [10, 10] - value: {"refTime":"673,627,000","proofSize":"6,196"} + threshold: *weight_threshold + result: [{ Complete: { refTime: '679,150,000', proofSize: '6,196' }}] - name: balances.Endowed - attributes: - - type: AccountId32 - value: *pp_sovereign_sibl - - name: balances.Endowed - attributes: - - type: u128 - value: *amount + result: { + account: *pp_sovereign_sibl, + freeBalance: *amount + } - name: polkadotXcm.send( assets.forceCreateAsset ) | Penpal Parachain -> Assets Parachain before: @@ -318,20 +311,14 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: polkadotXcm.Sent - name: assets.Burned chain: *assets_parachain - attributes: - - type: AccountId32 - value: *pp_sovereign_sibl + result: { assetId: *asset_id, owner: *pp_sovereign_sibl } - name: assets.Issued chain: *assets_parachain - attributes: - - type: u32 - value: *asset_id + result: { assetId: *asset_id } - queries: assets_balance_pp_sovereign_after: chain: *assets_parachain @@ -396,6 +383,8 @@ tests: events: - name: xcmpQueue.Fail chain: *assets_parachain - attributes: - - type: XcmV3TraitsError - value: FailedToTransactAsset + threshold: *weight_threshold + result: { + error: FailedToTransactAsset, + weight: { refTime: '152,426,000', proofSize: '3,593' } + } diff --git a/parachains/integration-tests/e2e/assets/statemint/config.toml b/parachains/integration-tests/e2e/assets/statemint/config.toml index 5b5a861eed6..2e68734e09f 100644 --- a/parachains/integration-tests/e2e/assets/statemint/config.toml +++ b/parachains/integration-tests/e2e/assets/statemint/config.toml @@ -7,6 +7,7 @@ chain = "polkadot-local" name = "alice" ws_port = 9800 validator = true + args = ["--state-cache-size=0"] [[relaychain.nodes]] name = "bob" @@ -32,7 +33,7 @@ cumulus_based = true name = "collator1" ws_port = 9810 command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] + args = [ "-lxcm=trace", "--state-cache-size=0" ] [[parachains.collators]] name = "collator2" @@ -50,7 +51,7 @@ cumulus_based = true name = "collator3" ws_port = 9820 command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] + args = [ "-lxcm=trace", "--state-cache-size=0" ] [[parachains.collators]] name = "collator4" diff --git a/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/0_init.yml b/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/0_init.yml similarity index 79% rename from parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/0_init.yml rename to parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/0_init.yml index 4dadb9f0116..d4824469523 100644 --- a/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/0_init.yml +++ b/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/0_init.yml @@ -7,12 +7,13 @@ settings: wsPort: 9710 paraId: &cp_id 1001 variables: - xcm_version: &xcm_version '3' + xcm_version: &xcm_version 3 + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } chains: accounts: alice_signer: &alice_signer //Alice decodedCalls: - ap_force_xcm_version: + cp_force_xcm_version: chain: *collectives_parachain pallet: polkadotXcm call: forceXcmVersion @@ -48,13 +49,9 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.SupportedVersionChanged - attributes: - - type: u32 - value: *xcm_version + result: [{ parents: 0, interior: { X1: { Parachain: *cp_id }}}, *xcm_version ] - extrinsics: # Collectives Parachain sets supported version for Relay Chain through it - chain: *relay_chain signer: *alice_signer @@ -82,7 +79,7 @@ tests: refTime: 200000000, # 200_000_000 proofSize: 0, }, - call: $ap_force_xcm_version + call: $cp_force_xcm_version } } ] @@ -90,17 +87,14 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.Sent - - name: polkadotXcm.SupportedVersionChanged - chain: *collectives_parachain - attributes: - - type: u32 - value: *xcm_version - name: dmpQueue.ExecutedDownward chain: *collectives_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '2,200,000,000', proofSize: 0 }} + } + - name: polkadotXcm.SupportedVersionChanged + chain: *collectives_parachain + result: [{ parents: 1, interior: Here }, *xcm_version ] diff --git a/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/1_teleport.yml b/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml similarity index 85% rename from parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/1_teleport.yml rename to parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml index e6310d05922..2cd1fa68168 100644 --- a/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/1_teleport.yml +++ b/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml @@ -7,10 +7,13 @@ settings: wsPort: 9710 paraId: &cp_id 1001 variables: + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } accounts: alice_signer: &acc_alice_signer //Alice alice_account32: &acc_alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' alice_ss58: &acc_alice_ss58 '15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5' + checking_account: &checking_account '13UVJyLnbVp9x5XDyJv8g8r3UddNwBrdaH7AADCmw9XQWvYW' + tests: - name: Teleport assets from Relay Chain to Collectives Parachain successful. @@ -57,15 +60,14 @@ tests: ] events: - name: xcmPallet.Attempted - chain: *relay_chain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: [{ Complete: { refTime: '3,000,000,000', proofSize: 0 }}] - name: dmpQueue.ExecutedDownward chain: *collectives_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '4,000,000,000', proofSize: 0 }} + } - queries: balance_rc_alice_2: chain: *relay_chain @@ -121,28 +123,17 @@ tests: ] events: - name: balances.Withdraw - attributes: - - type: AccountId32 - key: who - value: *acc_alice_ss58 - - type: u128 - key: amount - value: 10000000000000 + result: { who: *acc_alice_ss58, amount: 10000000000000 } - name: polkadotXcm.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: [{ Complete: { refTime: '3,000,000,000', proofSize: 0 }}] - name: balances.Withdraw chain: *relay_chain - attributes: - - type: u128 - key: amount - value: 10000000000000 # amount received and withdrawn from registry account + result: { who: *checking_account, amount: 10000000000000 } # amount received and withdrawn from registry account - name: ump.ExecutedUpward chain: *relay_chain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: [{ Complete: { refTime: '4,000,000,000', proofSize: 0 }}] - queries: balance_rc_alice_3: chain: *relay_chain diff --git a/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/2_reserve.yml b/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/2_reserve.yml similarity index 71% rename from parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/2_reserve.yml rename to parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/2_reserve.yml index b152d71de3a..0695f1201b0 100644 --- a/parachains/integration-tests/e2e/collectives/collectives_polkadot/0_xcm/2_reserve.yml +++ b/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/2_reserve.yml @@ -7,11 +7,11 @@ settings: wsPort: 9710 paraId: &cp_id 1001 variables: + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } chains: accounts: alice_signer: &alice_signer //Alice alice_account32: &alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - alice_ss58: &acc_alice_ss58 '15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5' tests: - name: Reserve assets from Relay Chain to Collectives Parachain fails @@ -38,12 +38,16 @@ tests: ] events: - name: xcmPallet.Attempted - chain: *relay_chain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: [{ Complete: { refTime: '2,000,000,000', proofSize: 0 }}] - name: dmpQueue.ExecutedDownward chain: *collectives_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Incomplete + threshold: *weight_threshold + result: { + outcome: { + Incomplete: [ + { refTime: '1,000,000,000', proofSize: 0 }, + UntrustedReserveLocation + ] + } + } diff --git a/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/0_join_alliance_fails.yml b/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/0_join_alliance_fails.yml similarity index 53% rename from parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/0_join_alliance_fails.yml rename to parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/0_join_alliance_fails.yml index 11778830562..9aff8b1db10 100644 --- a/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/0_join_alliance_fails.yml +++ b/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/0_join_alliance_fails.yml @@ -1,15 +1,13 @@ --- settings: chains: - relay_chain: &relay_chain + relay_chain: wsPort: 9700 collectives_parachain: &collectives_parachain wsPort: 9710 - paraId: &cp_id 1001 variables: accounts: alice_signer: &alice_signer //Alice - alice_account32: &cp_alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' tests: - name: Alice fails to join an the Alliance, since it is not initialized yet. @@ -24,11 +22,8 @@ tests: args: [] events: - name: system.ExtrinsicFailed - attributes: - - type: SpRuntimeDispatchError - key: dispatchError - # TODO assert with Alliance Error variant - alliance.AllianceNotYetInitialized - # issue - https://github.com/paritytech/parachains-integration-tests/issues/59 - value: {"Module":{"index":"50","error":"0x00000000"}} - - + result: { + dispatchError: { Module: { index: 50, error: '0x00000000' }} + } + # TODO assert with Alliance Error variant - alliance.AllianceNotYetInitialized + # issue - https://github.com/paritytech/parachains-integration-tests/issues/59 diff --git a/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/1_init_alliance.yml b/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/1_init_alliance.yml similarity index 79% rename from parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/1_init_alliance.yml rename to parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/1_init_alliance.yml index 26bd72a7967..15140e6946c 100644 --- a/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/1_init_alliance.yml +++ b/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/1_init_alliance.yml @@ -7,23 +7,16 @@ settings: wsPort: 9710 paraId: &coll_para_id 1001 variables: + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } accounts: alice_signer: &acc_alice_signer //Alice - alice_account32: &acc_alice_acc32 "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d" - liam_signer: &acc_liam_signer //Liam - liam_account32: &acc_liam_acc32 "0x3614671a5de540d891eb8c4939c8153a4aa790602b347c18177b86d0fc546221" - olivia_signer: &acc_olivia_signer //Olivia - olivia_account32: &acc_olivia_acc32 "0x24ee8a659c6716fe9f7cb4e9e028602aa12867654ca02737da9171b7ff697d5c" - noah_signer: &acc_noah_signer //Noah - noah_account32: &acc_noah_acc32 "0x9c6ad3bc3aa2f1b2e837898e6da9980445f7ef8b3eee0b8c8e305f8cfae68517" - emma_signer: &acc_emma_signer //Emma - emma_account32: &acc_emma_acc32 "0x8ac272b333ba1127c8db57fa777ec820b24598a236efa648caf0d26d86f64572" - james_signer: &acc_james_signer //James - james_account32: &acc_james_acc32 "0x9a52805151a0b5effc084af9264011139872a21a3950cb9ae0b2955c4bf92c18" - ava_signer: &acc_ava_signer //Ava - ava_account32: &acc_ava_acc32 "0x348ef0b8776adbc09c862ddc29b1d193b9e24738e54eea3b0609c83856dc101c" - mia_signer: &acc_mia_signer //Mia - mia_account32: &acc_mia_acc32 "0xaebf15374cf7e758d10232514c569a7abf81cc1b8f1e81a73dbc608a0e335264" + liam_account32: &acc_liam_acc32 "0x3614671a5de540d891eb8c4939c8153a4aa790602b347c18177b86d0fc546221" # //Liam + olivia_account32: &acc_olivia_acc32 "0x24ee8a659c6716fe9f7cb4e9e028602aa12867654ca02737da9171b7ff697d5c" # //Olivia + noah_account32: &acc_noah_acc32 "0x9c6ad3bc3aa2f1b2e837898e6da9980445f7ef8b3eee0b8c8e305f8cfae68517" # //Noah + emma_account32: &acc_emma_acc32 "0x8ac272b333ba1127c8db57fa777ec820b24598a236efa648caf0d26d86f64572" # //Emma + james_account32: &acc_james_acc32 "0x9a52805151a0b5effc084af9264011139872a21a3950cb9ae0b2955c4bf92c18" # //James + ava_account32: &acc_ava_acc32 "0x348ef0b8776adbc09c862ddc29b1d193b9e24738e54eea3b0609c83856dc101c" # //Ava + mia_account32: &acc_mia_acc32 "0xaebf15374cf7e758d10232514c569a7abf81cc1b8f1e81a73dbc608a0e335264" # //Mia decodedCalls: init_alliance_members: chain: *collectives_parachain @@ -109,17 +102,16 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.Sent - name: alliance.MembersInitialized chain: *collectives_parachain - name: dmpQueue.ExecutedDownward chain: *collectives_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '3,000,000,000', proofSize: '1,000,000' }} + } - name: Alliance init call fails. actions: @@ -162,15 +154,14 @@ tests: # Next test with a disband call will fail, if this call does not fail, # since a witness data from a disband call will be invalid. - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.Sent - name: dmpQueue.ExecutedDownward chain: *collectives_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '3,000,000,000', proofSize: '1,000,000' }} + } - name: Alliance disbanded and initialized again. actions: @@ -209,27 +200,17 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.Sent - name: alliance.AllianceDisbanded chain: *collectives_parachain - attributes: - - type: u32 - key: fellowMembers - value: 6 - - type: u32 - key: allyMembers - value: 1 - - type: u32 - key: unreserved - value: 0 + result: { fellowMembers: 6, allyMembers: 1, unreserved: 0 } - name: dmpQueue.ExecutedDownward chain: *collectives_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '3,321,495,872', proofSize: '181,779' }} + } - name: Alliance initiated, founders and fellows are set. actions: - extrinsics: @@ -267,14 +248,13 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.Sent - name: alliance.MembersInitialized chain: *collectives_parachain - name: dmpQueue.ExecutedDownward chain: *collectives_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '3,000,000,000', proofSize: '1,000,000' }} + } diff --git a/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/2_join_alliance_fails.yml b/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/2_join_alliance_fails.yml similarity index 53% rename from parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/2_join_alliance_fails.yml rename to parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/2_join_alliance_fails.yml index 574df004512..2afdadae602 100644 --- a/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/2_join_alliance_fails.yml +++ b/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/2_join_alliance_fails.yml @@ -1,15 +1,14 @@ --- settings: chains: - relay_chain: &relay_chain + relay_chain: wsPort: 9700 collectives_parachain: &collectives_parachain wsPort: 9710 - paraId: &cp_id 1001 + paraId: 1001 variables: accounts: liam_signer: &acc_liam_signer //Liam - liam_account32: &acc_liam_acc32 "0x3614671a5de540d891eb8c4939c8153a4aa790602b347c18177b86d0fc546221" tests: - name: Liam fails to join an the Alliance, Liam is already a member. @@ -24,11 +23,8 @@ tests: args: [] events: - name: system.ExtrinsicFailed - attributes: - - type: SpRuntimeDispatchError - key: dispatchError - # TODO assert with Alliance Error variant - alliance.AllianceNotYetInitialized - # issue - https://github.com/paritytech/parachains-integration-tests/issues/59 - value: {"Module":{"index":"50","error":"0x02000000"}} - - + result: { + dispatchError: { Module: { index: 50, error: '0x02000000' }} + } + # TODO assert with Alliance Error variant - alliance.AllianceNotYetInitialized + # issue - https://github.com/paritytech/parachains-integration-tests/issues/59 diff --git a/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/3_kick_member.yml b/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/3_kick_member.yml similarity index 82% rename from parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/3_kick_member.yml rename to parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/3_kick_member.yml index aac09883375..0c07a281e14 100644 --- a/parachains/integration-tests/e2e/collectives/collectives_polkadot/1_alliance/3_kick_member.yml +++ b/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/3_kick_member.yml @@ -7,6 +7,7 @@ settings: wsPort: 9710 paraId: &cp_id 1001 variables: + weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } init_teleport_amount: &init_teleport_amount 20000000000000 # 20_000_000_000_000 accounts: alice_signer: &acc_alice_signer //Alice @@ -41,20 +42,17 @@ tests: ] events: - name: xcmPallet.Attempted - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: [{ Complete: { refTime: '3,000,000,000', proofSize: 0 }}] - name: balances.Deposit chain: *collectives_parachain - attributes: - - type: AccountId32 - key: who - value: *acc_alice_ss58 + result: { who: *acc_alice_ss58 } - name: dmpQueue.ExecutedDownward chain: *collectives_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '4,000,000,000', proofSize: 0 }} + } - name: Get the balances of the Relay Chain's treasury & Collectives parachain's future alliance member actions: - queries: @@ -80,18 +78,9 @@ tests: events: - name: balances.Reserved chain: *collectives_parachain - attributes: - - type: AccountId32 - key: who - value: *acc_alice_ss58 - - type: u128 - key: amount - value: 10,000,000,000,000 + result: { who: *acc_alice_ss58, amount: '10,000,000,000,000' } - name: alliance.NewAllyJoined - attributes: - - type: AccountId32 - key: ally - value: *acc_alice_ss58 + result: { ally: *acc_alice_ss58 } - queries: balance_cp_alice_after: chain: *collectives_parachain @@ -148,21 +137,17 @@ tests: ] events: - name: sudo.Sudid - attributes: - - type: Result - value: Ok + result: { sudoResult: Ok } - name: xcmPallet.Sent - name: alliance.MemberKicked chain: *collectives_parachain - attributes: - - type: AccountId32 - key: member - value: *acc_alice_ss58 + result: { member: *acc_alice_ss58 } - name: dmpQueue.ExecutedDownward chain: *collectives_parachain - attributes: - - type: XcmV3TraitsOutcome - xcmOutcome: Complete + threshold: *weight_threshold + result: { + outcome: { Complete: { refTime: '4,000,000,000', proofSize: '1,000,000' }} + } - queries: balance_rc_treasury_after: diff --git a/parachains/integration-tests/e2e/collectives/collectives_polkadot/config.toml b/parachains/integration-tests/e2e/collectives/collectives-polkadot/config.toml similarity index 78% rename from parachains/integration-tests/e2e/collectives/collectives_polkadot/config.toml rename to parachains/integration-tests/e2e/collectives/collectives-polkadot/config.toml index d99e38078d0..20fda92bd08 100644 --- a/parachains/integration-tests/e2e/collectives/collectives_polkadot/config.toml +++ b/parachains/integration-tests/e2e/collectives/collectives-polkadot/config.toml @@ -7,20 +7,21 @@ chain = "polkadot-local" name = "alice" ws_port = 9700 validator = true + args = ["--state-cache-size=0"] [[relaychain.nodes]] name = "bob" - ws_port = 9701 + ws_port = 9701 validator = true [[relaychain.nodes]] name = "charlie" - ws_port = 9702 + ws_port = 9702 validator = true - [[relaychain.nodes]] + [[relaychain.nodes]] name = "dave" - ws_port = 9703 + ws_port = 9703 validator = true [[parachains]] @@ -32,10 +33,10 @@ cumulus_based = true name = "collator1" ws_port = 9710 command = "./bin/polkadot-parachain" - args = ["-lxcm=trace"] + args = [ "-lxcm=trace", "--state-cache-size=0" ] [[parachains.collators]] name = "collator2" - ws_port = 9711 + ws_port = 9711 command = "./bin/polkadot-parachain" args = ["-lxcm=trace"] From 0ab6f90a28569de2604c9319e4edf7d559dec586 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 21:49:34 +0000 Subject: [PATCH 229/339] Bump clap from 4.2.7 to 4.3.0 (#2634) Bumps [clap](https://github.com/clap-rs/clap) from 4.2.7 to 4.3.0. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v4.2.7...clap_complete-v4.3.0) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 16 ++++++++-------- client/cli/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6fc55af97fa..cd50f97364a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1527,9 +1527,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.2.7" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" +checksum = "93aae7a4192245f70fe75dd9157fc7b4a5bf53e88d30bd4396f7d8f9284d5acc" dependencies = [ "clap_builder", "clap_derive", @@ -1538,9 +1538,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.2.7" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" +checksum = "4f423e341edefb78c9caba2d9c7f7687d0e72e89df3ce3394554754393ac3990" dependencies = [ "anstream", "anstyle 1.0.0", @@ -1551,9 +1551,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.2.0" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" +checksum = "191d9573962933b4027f932c600cd252ce27a8ad5979418fe78e43c07996f27b" dependencies = [ "heck", "proc-macro2", @@ -1563,9 +1563,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" [[package]] name = "coarsetime" diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 4aa1cfca298..6ba04507266 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -clap = { version = "4.2.7", features = ["derive"] } +clap = { version = "4.3.0", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.3.1" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index 68bd9ac2579..d45f915bad6 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" build = "build.rs" [dependencies] -clap = { version = "4.2.7", features = ["derive"] } +clap = { version = "4.3.0", features = ["derive"] } log = "0.4.17" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.163", features = ["derive"] } diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index b68d206fec3..039afffe9ea 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -12,7 +12,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.2.7", features = ["derive"] } +clap = { version = "4.3.0", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index dc28850ea43..c1117fa3497 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -10,7 +10,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.2.7", features = ["derive"] } +clap = { version = "4.3.0", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.0", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } From 7e7209beda8a98c260fceee8c35e1b8e632a2b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 25 May 2023 01:19:28 +0200 Subject: [PATCH 230/339] Companion for: Substrate#13869 (#2631) * Companion for: Substrate#13869 https://github.com/paritytech/substrate/pull/13869 * Fix * Warning * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 523 +++++++++--------- bridges/bin/runtime-common/src/mock.rs | 2 +- bridges/modules/messages/src/mock.rs | 2 +- bridges/modules/relayers/src/mock.rs | 2 +- pallets/collator-selection/src/mock.rs | 2 +- pallets/xcmp-queue/src/mock.rs | 2 +- parachain-template/runtime/src/lib.rs | 2 +- parachains/common/src/impls.rs | 2 +- .../runtimes/assets/statemine/src/lib.rs | 2 +- .../runtimes/assets/statemint/src/lib.rs | 2 +- .../runtimes/assets/westmint/src/lib.rs | 17 +- .../bridge-hubs/bridge-hub-kusama/src/lib.rs | 2 +- .../bridge-hub-polkadot/src/lib.rs | 2 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 2 +- .../collectives-polkadot/src/lib.rs | 2 +- .../contracts/contracts-rococo/src/lib.rs | 2 +- parachains/runtimes/testing/penpal/src/lib.rs | 2 +- .../testing/rococo-parachain/src/lib.rs | 2 +- test/runtime/src/lib.rs | 2 +- 19 files changed, 284 insertions(+), 290 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cd50f97364a..9ac084f30f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -577,7 +577,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "hash-db", "log", @@ -3783,7 +3783,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", ] @@ -3806,7 +3806,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-support-procedural", @@ -3831,7 +3831,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3878,7 +3878,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3889,7 +3889,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3906,7 +3906,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-system", @@ -3935,7 +3935,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-recursion", "futures", @@ -3956,7 +3956,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "bitflags", "environmental", @@ -3990,7 +3990,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "Inflector", "cfg-expr", @@ -4006,7 +4006,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4018,7 +4018,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "proc-macro2", "quote", @@ -4028,7 +4028,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "cfg-if", "frame-support", @@ -4047,7 +4047,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -4062,7 +4062,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "sp-api", @@ -4071,7 +4071,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "parity-scale-codec", @@ -5158,7 +5158,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bitvec", "frame-benchmarking", @@ -5257,7 +5257,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "frame-support", "polkadot-primitives", @@ -6148,7 +6148,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "futures", "log", @@ -6167,7 +6167,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "anyhow", "jsonrpsee", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6692,7 +6692,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6710,7 +6710,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6725,7 +6725,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-system", @@ -6741,7 +6741,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-system", @@ -6757,7 +6757,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-system", @@ -6771,7 +6771,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6795,7 +6795,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6830,7 +6830,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-system", @@ -6849,7 +6849,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6873,7 +6873,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6979,7 +6979,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7023,7 +7023,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7040,7 +7040,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "bitflags", "environmental", @@ -7070,7 +7070,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "bitflags", "parity-scale-codec", @@ -7083,7 +7083,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "proc-macro2", "quote", @@ -7093,7 +7093,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7110,7 +7110,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7128,7 +7128,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7151,7 +7151,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7164,7 +7164,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7182,7 +7182,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7200,7 +7200,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "blake2", "frame-benchmarking", @@ -7218,7 +7218,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7241,7 +7241,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7257,7 +7257,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7277,7 +7277,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7294,7 +7294,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-system", @@ -7308,7 +7308,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7325,7 +7325,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7377,7 +7377,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7394,7 +7394,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7412,7 +7412,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "pallet-nfts", @@ -7423,7 +7423,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-system", @@ -7456,7 +7456,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7476,7 +7476,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7487,7 +7487,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-system", @@ -7504,7 +7504,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7543,7 +7543,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7560,7 +7560,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7575,7 +7575,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7593,7 +7593,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7608,7 +7608,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7627,7 +7627,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7644,7 +7644,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-system", @@ -7665,7 +7665,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7681,7 +7681,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-system", @@ -7695,7 +7695,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7718,7 +7718,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7729,7 +7729,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "log", "sp-arithmetic", @@ -7738,7 +7738,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7747,7 +7747,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7764,7 +7764,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7779,7 +7779,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7797,7 +7797,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7816,7 +7816,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-support", "frame-system", @@ -7832,7 +7832,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7848,7 +7848,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7860,7 +7860,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7877,7 +7877,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7892,7 +7892,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7908,7 +7908,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7923,7 +7923,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7938,7 +7938,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7959,7 +7959,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "frame-benchmarking", "frame-support", @@ -8576,7 +8576,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8592,7 +8592,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8606,7 +8606,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "derive_more", "fatality", @@ -8629,7 +8629,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "fatality", "futures", @@ -8650,7 +8650,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "clap", "frame-benchmarking-cli", @@ -8679,7 +8679,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "async-trait", "frame-benchmarking", @@ -8722,7 +8722,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "always-assert", "bitvec", @@ -8744,7 +8744,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "parity-scale-codec", "scale-info", @@ -8756,7 +8756,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "derive_more", "fatality", @@ -8781,7 +8781,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8795,7 +8795,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "futures", "futures-timer", @@ -8815,7 +8815,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "always-assert", "async-trait", @@ -8838,7 +8838,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "futures", "parity-scale-codec", @@ -8856,7 +8856,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bitvec", "derive_more", @@ -8885,7 +8885,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bitvec", "futures", @@ -8906,7 +8906,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bitvec", "fatality", @@ -8925,7 +8925,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8940,7 +8940,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "async-trait", "futures", @@ -8960,7 +8960,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "futures", "polkadot-node-metrics", @@ -8975,7 +8975,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "futures", "futures-timer", @@ -8992,7 +8992,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "fatality", "futures", @@ -9011,7 +9011,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "async-trait", "futures", @@ -9028,7 +9028,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bitvec", "fatality", @@ -9046,7 +9046,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "always-assert", "futures", @@ -9073,7 +9073,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "futures", "polkadot-node-primitives", @@ -9089,7 +9089,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "assert_matches", "cpu-time", @@ -9118,7 +9118,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "futures", "lru 0.9.0", @@ -9133,7 +9133,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "lazy_static", "log", @@ -9151,7 +9151,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bs58", "futures", @@ -9170,8 +9170,9 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ + "async-channel", "async-trait", "derive_more", "fatality", @@ -9192,7 +9193,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bounded-vec", "futures", @@ -9214,7 +9215,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9224,7 +9225,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "async-trait", "futures", @@ -9242,7 +9243,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "async-trait", "derive_more", @@ -9265,7 +9266,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "async-trait", "derive_more", @@ -9298,7 +9299,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "async-trait", "futures", @@ -9321,7 +9322,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bounded-collections", "derive_more", @@ -9420,7 +9421,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9438,7 +9439,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9464,7 +9465,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9496,7 +9497,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bitvec", "frame-benchmarking", @@ -9591,7 +9592,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bitvec", "frame-benchmarking", @@ -9637,7 +9638,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "frame-support", "polkadot-primitives", @@ -9651,7 +9652,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bs58", "parity-scale-codec", @@ -9663,7 +9664,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bitflags", "bitvec", @@ -9708,7 +9709,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9818,7 +9819,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9839,7 +9840,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9849,7 +9850,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9874,7 +9875,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9935,7 +9936,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "frame-benchmarking", "frame-system", @@ -10715,7 +10716,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10802,7 +10803,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "frame-support", "polkadot-primitives", @@ -11049,7 +11050,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "log", "sp-core", @@ -11060,7 +11061,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "futures", @@ -11089,7 +11090,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "futures", "futures-timer", @@ -11112,7 +11113,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11127,7 +11128,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11146,7 +11147,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11157,7 +11158,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11197,7 +11198,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "fnv", "futures", @@ -11224,7 +11225,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "hash-db", "kvdb", @@ -11250,7 +11251,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "futures", @@ -11275,7 +11276,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "futures", @@ -11304,7 +11305,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "fork-tree", @@ -11340,7 +11341,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "futures", "jsonrpsee", @@ -11362,9 +11363,10 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", + "async-channel", "async-trait", "fnv", "futures", @@ -11397,7 +11399,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "futures", "jsonrpsee", @@ -11416,7 +11418,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11429,7 +11431,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11469,7 +11471,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "finality-grandpa", "futures", @@ -11489,7 +11491,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "futures", @@ -11512,7 +11514,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11534,7 +11536,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11546,7 +11548,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "anyhow", "cfg-if", @@ -11564,7 +11566,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "ansi_term", "futures", @@ -11580,7 +11582,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11594,7 +11596,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11639,8 +11641,9 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ + "async-channel", "cid", "futures", "libp2p-identity", @@ -11659,7 +11662,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11687,7 +11690,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "ahash 0.8.2", "futures", @@ -11706,9 +11709,10 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", + "async-channel", "futures", "libp2p-identity", "log", @@ -11728,9 +11732,10 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", + "async-channel", "async-trait", "fork-tree", "futures", @@ -11762,7 +11767,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11782,7 +11787,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11813,7 +11818,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "futures", "libp2p-identity", @@ -11829,7 +11834,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11838,7 +11843,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "futures", "jsonrpsee", @@ -11869,7 +11874,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11888,7 +11893,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "http", "jsonrpsee", @@ -11903,7 +11908,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11929,7 +11934,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "directories", @@ -11995,7 +12000,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "log", "parity-scale-codec", @@ -12006,7 +12011,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "clap", "fs4", @@ -12022,7 +12027,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12041,7 +12046,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "futures", "libc", @@ -12060,7 +12065,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "chrono", "futures", @@ -12079,7 +12084,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "ansi_term", "atty", @@ -12110,7 +12115,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12121,7 +12126,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "futures", @@ -12148,7 +12153,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "futures", @@ -12162,7 +12167,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-channel", "futures", @@ -12643,7 +12648,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "enumn", "parity-scale-codec", @@ -12720,7 +12725,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "hash-db", "log", @@ -12740,7 +12745,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "Inflector", "blake2", @@ -12754,7 +12759,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12767,7 +12772,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "integer-sqrt", "num-traits", @@ -12781,7 +12786,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12794,7 +12799,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "sp-api", @@ -12806,7 +12811,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "futures", "log", @@ -12824,7 +12829,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "futures", @@ -12839,7 +12844,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "parity-scale-codec", @@ -12857,7 +12862,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "parity-scale-codec", @@ -12878,7 +12883,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12897,7 +12902,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "finality-grandpa", "log", @@ -12915,7 +12920,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12927,7 +12932,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12971,7 +12976,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "blake2b_simd", "byteorder", @@ -12985,7 +12990,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "proc-macro2", "quote", @@ -12996,7 +13001,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13005,7 +13010,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "proc-macro2", "quote", @@ -13015,7 +13020,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "environmental", "parity-scale-codec", @@ -13026,7 +13031,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13041,7 +13046,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "bytes", "ed25519", @@ -13067,7 +13072,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "lazy_static", "sp-core", @@ -13078,7 +13083,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "futures", "parity-scale-codec", @@ -13092,7 +13097,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13101,7 +13106,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13112,7 +13117,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13130,7 +13135,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "scale-info", @@ -13144,7 +13149,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "sp-api", "sp-core", @@ -13154,7 +13159,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "backtrace", "lazy_static", @@ -13164,7 +13169,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "rustc-hash", "serde", @@ -13174,7 +13179,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "either", "hash256-std-hasher", @@ -13196,7 +13201,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13214,7 +13219,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "Inflector", "proc-macro-crate", @@ -13226,7 +13231,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "scale-info", @@ -13240,7 +13245,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "scale-info", @@ -13253,7 +13258,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "hash-db", "log", @@ -13273,7 +13278,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "log", "parity-scale-codec", @@ -13291,12 +13296,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13309,7 +13314,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "futures-timer", @@ -13324,7 +13329,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "sp-std", @@ -13336,7 +13341,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "sp-api", "sp-runtime", @@ -13345,7 +13350,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "log", @@ -13361,7 +13366,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13384,7 +13389,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13401,7 +13406,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13412,7 +13417,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13426,7 +13431,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "parity-scale-codec", "scale-info", @@ -13815,7 +13820,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "platforms 2.0.0", ] @@ -13823,7 +13828,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13842,7 +13847,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "hyper", "log", @@ -13854,7 +13859,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "jsonrpsee", @@ -13867,7 +13872,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "jsonrpsee", "log", @@ -13886,7 +13891,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13912,7 +13917,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13922,7 +13927,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13933,7 +13938,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "ansi_term", "build-helper", @@ -14060,7 +14065,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "frame-support", "polkadot-primitives", @@ -14451,7 +14456,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14462,7 +14467,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14592,7 +14597,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bf92638c4994de4a520ff278ab95e7e955c1067a" +source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" dependencies = [ "async-trait", "clap", @@ -15540,7 +15545,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bitvec", "frame-benchmarking", @@ -15633,7 +15638,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "frame-support", "polkadot-primitives", @@ -16136,7 +16141,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "bounded-collections", "derivative", @@ -16152,7 +16157,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "frame-support", "frame-system", @@ -16207,7 +16212,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "environmental", "frame-benchmarking", @@ -16227,7 +16232,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e05b78689d3fb0deb555ede9f0f0e191cc5e18b5" +source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" dependencies = [ "Inflector", "proc-macro2", diff --git a/bridges/bin/runtime-common/src/mock.rs b/bridges/bin/runtime-common/src/mock.rs index c1767199676..4542ad39b62 100644 --- a/bridges/bin/runtime-common/src/mock.rs +++ b/bridges/bin/runtime-common/src/mock.rs @@ -190,7 +190,7 @@ impl pallet_balances::Config for TestRuntime { type MaxLocks = ConstU32<50>; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/bridges/modules/messages/src/mock.rs b/bridges/modules/messages/src/mock.rs index f0516fbc23f..8716c5bc3ac 100644 --- a/bridges/modules/messages/src/mock.rs +++ b/bridges/modules/messages/src/mock.rs @@ -133,7 +133,7 @@ impl pallet_balances::Config for TestRuntime { type WeightInfo = (); type MaxReserves = (); type ReserveIdentifier = (); - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/bridges/modules/relayers/src/mock.rs b/bridges/modules/relayers/src/mock.rs index 69d8418a024..d8c5bd90967 100644 --- a/bridges/modules/relayers/src/mock.rs +++ b/bridges/modules/relayers/src/mock.rs @@ -102,7 +102,7 @@ impl pallet_balances::Config for TestRuntime { type WeightInfo = (); type MaxReserves = ConstU32<1>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/pallets/collator-selection/src/mock.rs b/pallets/collator-selection/src/mock.rs index 5470e4037ec..ef2bdc81746 100644 --- a/pallets/collator-selection/src/mock.rs +++ b/pallets/collator-selection/src/mock.rs @@ -96,7 +96,7 @@ impl pallet_balances::Config for Test { type MaxLocks = (); type MaxReserves = MaxReserves; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/pallets/xcmp-queue/src/mock.rs b/pallets/xcmp-queue/src/mock.rs index 2e70e65392a..873ab463cc9 100644 --- a/pallets/xcmp-queue/src/mock.rs +++ b/pallets/xcmp-queue/src/mock.rs @@ -100,7 +100,7 @@ impl pallet_balances::Config for Test { type MaxLocks = (); type MaxReserves = MaxReserves; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/parachain-template/runtime/src/lib.rs b/parachain-template/runtime/src/lib.rs index 7a847fc5118..b87445826a1 100644 --- a/parachain-template/runtime/src/lib.rs +++ b/parachain-template/runtime/src/lib.rs @@ -340,7 +340,7 @@ impl pallet_balances::Config for Runtime { type WeightInfo = pallet_balances::weights::SubstrateWeight; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/parachains/common/src/impls.rs b/parachains/common/src/impls.rs index 506f8aff2a7..75ddf230408 100644 --- a/parachains/common/src/impls.rs +++ b/parachains/common/src/impls.rs @@ -197,7 +197,7 @@ mod tests { type WeightInfo = (); type MaxReserves = MaxReserves; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<1>; type MaxFreezes = ConstU32<1>; diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 490da2d0b10..4e06604aaf5 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -205,7 +205,7 @@ impl pallet_balances::Config for Runtime { type WeightInfo = weights::pallet_balances::WeightInfo; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index 0a78178ba75..f9a8b96a309 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -220,7 +220,7 @@ impl pallet_balances::Config for Runtime { type WeightInfo = weights::pallet_balances::WeightInfo; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 510a9a0e564..4e72394636c 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -68,7 +68,6 @@ use parachains_common::{ Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; -use scale_info::TypeInfo; use xcm_config::{ ForeignAssetsConvertedConcreteId, TrustBackedAssetsConvertedConcreteId, WestendLocation, XcmConfig, XcmOriginToTransactDispatchOrigin, @@ -180,15 +179,6 @@ parameter_types! { pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; } -/// A reason for placing a hold on funds. -#[derive( - Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, MaxEncodedLen, Debug, TypeInfo, -)] -pub enum HoldReason { - /// Used by the NFT Fractionalization Pallet. - NftFractionalization, -} - impl pallet_balances::Config for Runtime { type MaxLocks = ConstU32<50>; /// The type for recording an account's balance. @@ -201,7 +191,7 @@ impl pallet_balances::Config for Runtime { type WeightInfo = weights::pallet_balances::WeightInfo; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = HoldReason; + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<1>; type MaxFreezes = ConstU32<0>; @@ -640,7 +630,6 @@ parameter_types! { pub const NftFractionalizationPalletId: PalletId = PalletId(*b"fraction"); pub NewAssetSymbol: BoundedVec = (*b"FRAC").to_vec().try_into().unwrap(); pub NewAssetName: BoundedVec = (*b"Frac").to_vec().try_into().unwrap(); - pub const NftFractionalizationHoldReason: HoldReason = HoldReason::NftFractionalization; } impl pallet_nft_fractionalization::Config for Runtime { @@ -658,7 +647,7 @@ impl pallet_nft_fractionalization::Config for Runtime { type Nfts = Nfts; type PalletId = NftFractionalizationPalletId; type WeightInfo = pallet_nft_fractionalization::weights::SubstrateWeight; - type HoldReason = NftFractionalizationHoldReason; + type RuntimeHoldReason = RuntimeHoldReason; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = (); } @@ -747,7 +736,7 @@ construct_runtime!( Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, - NftFractionalization: pallet_nft_fractionalization::{Pallet, Call, Storage, Event} = 54, + NftFractionalization: pallet_nft_fractionalization::{Pallet, Call, Storage, Event, HoldReason} = 54, } ); diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs index 15da2331e7d..b003c58ffb6 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -246,7 +246,7 @@ impl pallet_balances::Config for Runtime { type MaxLocks = ConstU32<50>; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs index 3e29616a2c2..5913df282d7 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -246,7 +246,7 @@ impl pallet_balances::Config for Runtime { type MaxLocks = ConstU32<50>; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index e7b3630171d..b0f32c72fcf 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -261,7 +261,7 @@ impl pallet_balances::Config for Runtime { type MaxLocks = ConstU32<50>; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs index 5806e02c6a5..493fa611fe2 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs @@ -208,7 +208,7 @@ impl pallet_balances::Config for Runtime { type WeightInfo = weights::pallet_balances::WeightInfo; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 32bd748d803..cbdbd5500b6 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -213,7 +213,7 @@ impl pallet_balances::Config for Runtime { type WeightInfo = pallet_balances::weights::SubstrateWeight; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index 4fa161138fd..01b9654006d 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -384,7 +384,7 @@ impl pallet_balances::Config for Runtime { type WeightInfo = pallet_balances::weights::SubstrateWeight; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 8923d1c7cae..3060093b532 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -237,7 +237,7 @@ impl pallet_balances::Config for Runtime { type MaxLocks = ConstU32<50>; type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; diff --git a/test/runtime/src/lib.rs b/test/runtime/src/lib.rs index 23e5aa0e177..7633da1ea54 100644 --- a/test/runtime/src/lib.rs +++ b/test/runtime/src/lib.rs @@ -244,7 +244,7 @@ impl pallet_balances::Config for Runtime { type MaxLocks = (); type MaxReserves = MaxReserves; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; From aa147f0c91e87bd2fe41a592c3b4461619ea46c2 Mon Sep 17 00:00:00 2001 From: Squirrel Date: Thu, 25 May 2023 07:28:34 +0100 Subject: [PATCH 231/339] fix typo (#2635) --- .../emulated/assets/statemint/src/tests/teleport.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs index 163db77ddfd..ed13d297d4e 100644 --- a/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs +++ b/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs @@ -45,7 +45,7 @@ fn teleport_native_assets_from_relay_to_assets_para() { Statemint, vec![ RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == StatemineReceiver::get().into(), + who: *who == StatemintReceiver::get().into(), }, ] ); From e2101a5d270d4a4fac7ba043708e12f51dbca82f Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 25 May 2023 08:50:47 +0200 Subject: [PATCH 232/339] Fix target --- parachains/pallets/bridge-transfer/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index f5488e8ba74..6bb0d9562b4 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -66,7 +66,7 @@ pub mod impls; pub mod weights; /// The log target of this pallet. -pub const LOG_TARGET: &str = "runtime::bridge-assets-transfer"; +pub const LOG_TARGET: &str = "runtime::bridge-transfer"; #[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug, MaxEncodedLen, TypeInfo)] pub struct BridgeConfig { From 428023920c737749b26912a91150b46b47a9a748 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 25 May 2023 14:18:54 +0200 Subject: [PATCH 233/339] Fixed AssetTrapped issue --- parachains/pallets/bridge-transfer/src/lib.rs | 42 ++++++-- .../assets/test-utils/src/test_cases.rs | 96 ++++++++++++++----- 2 files changed, 106 insertions(+), 32 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 6bb0d9562b4..3190ea8332b 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -617,6 +617,12 @@ pub mod pallet { let allowed_target_location = bridge_config.allowed_target_location; + // UniversalLocation as sovereign account location on target_location (as target_location sees UniversalLocation) + let universal_location_as_sovereign_account_on_target_location = + T::UniversalLocation::get() + .invert_target(&allowed_target_location) + .map_err(|_| Error::::InvalidConfiguration)?; + // lets try to do a reserve for all assets let mut reserved_assets = xcm_executor::Assets::new(); for asset in assets.into_inner() { @@ -674,23 +680,41 @@ pub mod pallet { Error::::InvalidRemoteDestination })?; - // prepare xcm message (maybe_paid + ReserveAssetDeposited stuff) - let mut xcm_instructions = match bridge_config.max_target_location_fee { - Some(target_location_fee) => sp_std::vec![ - WithdrawAsset(target_location_fee.clone().into()), - BuyExecution { fees: target_location_fee, weight_limit: Unlimited }, - ], - None => + // prepare xcm message + // 1. buy execution (if needed) -> (we expect UniversalLocation's sovereign account should pay) + let (mut xcm_instructions, maybe_buy_execution) = match bridge_config + .max_target_location_fee + { + Some(target_location_fee) => ( + sp_std::vec![ + WithdrawAsset(target_location_fee.clone().into()), + BuyExecution { fees: target_location_fee.clone(), weight_limit: Unlimited }, + ], + Some(target_location_fee), + ), + None => ( sp_std::vec![UnpaidExecution { check_origin: None, weight_limit: Unlimited }], + None, + ), }; + // 2. add deposit reserved asset to destination account xcm_instructions.extend(sp_std::vec![ ReserveAssetDeposited(reserved_assets.clone().into()), - ClearOrigin, DepositAsset { assets: MultiAssetFilter::from(MultiAssets::from(reserved_assets)), beneficiary: remote_destination - } + }, ]); + // 3. add return unspent weight/asset back to the UniversalLocation's sovereign account on target + if let Some(target_location_fee) = maybe_buy_execution { + xcm_instructions.extend(sp_std::vec![ + RefundSurplus, + DepositAsset { + assets: MultiAssetFilter::from(MultiAssets::from(target_location_fee)), + beneficiary: universal_location_as_sovereign_account_on_target_location + }, + ]); + } Self::initiate_bridge_transfer(allowed_target_location, xcm_instructions.into()) .map_err(Into::into) diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 62f2f36d4af..221a43eff21 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1754,6 +1754,10 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< XcmConfig::UniversalLocation::get(), ) .expect("reanchored destination account"); + let universal_location_as_sovereign_account_on_target = + ::UniversalLocation::get() + .invert_target(&target_location_from_different_consensus) + .expect("invert_target Universal Location"); // match inner xcm assert!(inner_xcm @@ -1781,11 +1785,6 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< _ => Err(ProcessMessageError::BadFormat), }) .expect("contains ReserveAssetDeposited") - .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { - ClearOrigin => Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains ClearOrigin") .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { DepositAsset { assets: filter, ref beneficiary } if filter == @@ -1795,6 +1794,25 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< _ => Err(ProcessMessageError::BadFormat), }) .expect("contains DepositAsset") + .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { + RefundSurplus => Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains RefundSurplus") + .match_next_inst(|inner_xcm_instr| { + match inner_xcm_instr { + DepositAsset { assets: filter, ref beneficiary } + if filter == + &MultiAssetFilter::from( + target_location_fee.clone(), + ) && beneficiary.eq( + &universal_location_as_sovereign_account_on_target, + ) => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + } + }) + .expect("contains DepositAsset") .assert_remaining_insts(0) .is_ok()); Ok(()) @@ -1933,17 +1951,35 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< ) ); + // we assume here that BuyExecution fee goes to staking pot + let staking_pot_account_id = >::account_id(); + let local_bridge_hub_multilocation_as_account_id = + LocationToAccountId::convert_ref(&local_bridge_hub_multilocation) + .expect("Correct AccountId"); + // check before - assert_eq!( + let remote_parachain_sovereign_account_balance_before = >::free_balance( - &remote_parachain_sovereign_account - ), + &remote_parachain_sovereign_account, + ); + assert_eq!( + remote_parachain_sovereign_account_balance_before, existential_deposit + buy_execution_fee_amount.into() ); assert_eq!( >::free_balance(&target_account), existential_deposit ); + assert_eq!( + >::free_balance( + &local_bridge_hub_multilocation_as_account_id + ), + 0.into() + ); + assert_eq!( + >::free_balance(&staking_pot_account_id), + 0.into() + ); assert_eq!( >::balance( foreign_asset_id_multilocation.into(), @@ -1976,7 +2012,6 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< }), fun: Fungible(reserve_asset_deposisted), }])), - ClearOrigin, DepositAsset { assets: Definite(MultiAssets::from(vec![MultiAsset { id: Concrete(MultiLocation { @@ -1993,6 +2028,15 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< }), }, }, + // return unspent weight back to SA of caller + RefundSurplus, + DepositAsset { + assets: Definite(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(buy_execution_fee_amount), + }])), + beneficiary: remote_parachain_as_origin, + }, ]); // origin as BridgeHub @@ -2010,15 +2054,28 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< assert_eq!(outcome.ensure_complete(), Ok(())); // check after - assert!( + let staking_pot_balance = + >::free_balance(&staking_pot_account_id); + assert_eq!( >::free_balance( &remote_parachain_sovereign_account - ) < existential_deposit + buy_execution_fee_amount.into() + ), + remote_parachain_sovereign_account_balance_before - staking_pot_balance ); assert_eq!( >::free_balance(&target_account), existential_deposit ); + assert_eq!( + >::free_balance( + &local_bridge_hub_multilocation_as_account_id + ), + 0.into() + ); + assert_ne!( + >::free_balance(&staking_pot_account_id), + 0.into() + ); assert_eq!( >::balance( foreign_asset_id_multilocation.into(), @@ -2027,21 +2084,14 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< reserve_asset_deposisted.into() ); - // check asset trap (because big buy fee) + // check NO asset trap occurred let mut pallet_xcm_events = >::events() .into_iter() .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())); - assert!(pallet_xcm_events.any(|e| match e { - pallet_xcm::Event::AssetsTrapped(_, trapped_for, _) => { - assert_eq!( - trapped_for, origin, - "We expect trapped assets for origin: {:?}, but it is trapped for: {:?}", - origin, trapped_for - ); - true - }, - _ => false, - })); + assert_eq!( + false, + pallet_xcm_events.any(|e| matches!(e, pallet_xcm::Event::AssetsTrapped(..))) + ); }) } From 9baff09fce7999b4ed4c17f9fe2e440bc98e591c Mon Sep 17 00:00:00 2001 From: Javier Viola Date: Thu, 25 May 2023 12:08:35 -0300 Subject: [PATCH 234/339] bump zombienet version (#2637) --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 93471823d26..7e7d2f252e2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: CI_IMAGE: "paritytech/ci-linux:production" DOCKER_OS: "debian:stretch" ARCH: "x86_64" - ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.50" + ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.55" BUILDAH_IMAGE: "quay.io/buildah/stable:v1.29" BUILDAH_COMMAND: "buildah --storage-driver overlay2" From e9bfaa9930fc3a6e9e8515c46967e0469ebf14a8 Mon Sep 17 00:00:00 2001 From: Squirrel Date: Thu, 25 May 2023 16:23:48 +0100 Subject: [PATCH 235/339] bump substrate version (#2640) --- Cargo.lock | 385 ++++++++++++++++++++++++++--------------------------- 1 file changed, 192 insertions(+), 193 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9ac084f30f4..2a5785e03e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -577,7 +577,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "hash-db", "log", @@ -3783,7 +3783,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", ] @@ -3806,7 +3806,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-support-procedural", @@ -3831,7 +3831,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3878,7 +3878,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3889,7 +3889,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3906,7 +3906,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-system", @@ -3935,7 +3935,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-recursion", "futures", @@ -3956,7 +3956,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "bitflags", "environmental", @@ -3990,7 +3990,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "Inflector", "cfg-expr", @@ -4006,7 +4006,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4018,7 +4018,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "proc-macro2", "quote", @@ -4028,7 +4028,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "cfg-if", "frame-support", @@ -4047,7 +4047,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4062,7 +4062,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "sp-api", @@ -4071,7 +4071,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "parity-scale-codec", @@ -6148,7 +6148,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "futures", "log", @@ -6167,7 +6167,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "anyhow", "jsonrpsee", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6692,7 +6692,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -6710,7 +6710,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -6725,7 +6725,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-system", @@ -6741,7 +6741,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-system", @@ -6757,7 +6757,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-system", @@ -6771,7 +6771,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -6795,7 +6795,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -6830,7 +6830,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-system", @@ -6849,7 +6849,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6873,7 +6873,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -6979,7 +6979,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7023,7 +7023,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7040,7 +7040,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "bitflags", "environmental", @@ -7070,7 +7070,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "bitflags", "parity-scale-codec", @@ -7083,7 +7083,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "proc-macro2", "quote", @@ -7093,7 +7093,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7110,7 +7110,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7128,7 +7128,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7151,7 +7151,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7164,7 +7164,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7182,7 +7182,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7200,7 +7200,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "blake2", "frame-benchmarking", @@ -7218,7 +7218,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7241,7 +7241,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7257,7 +7257,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7277,7 +7277,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7294,7 +7294,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-system", @@ -7308,7 +7308,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7325,7 +7325,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7377,7 +7377,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7394,7 +7394,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7412,7 +7412,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "pallet-nfts", @@ -7423,7 +7423,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-system", @@ -7456,7 +7456,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7476,7 +7476,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7487,7 +7487,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-system", @@ -7504,7 +7504,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7543,7 +7543,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7560,7 +7560,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7575,7 +7575,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7593,7 +7593,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7608,7 +7608,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7627,7 +7627,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7644,7 +7644,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-system", @@ -7665,7 +7665,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7681,7 +7681,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-system", @@ -7695,7 +7695,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7718,7 +7718,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7729,7 +7729,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "log", "sp-arithmetic", @@ -7738,7 +7738,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "sp-api", @@ -7747,7 +7747,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7764,7 +7764,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7779,7 +7779,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7797,7 +7797,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7816,7 +7816,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-support", "frame-system", @@ -7832,7 +7832,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7848,7 +7848,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7860,7 +7860,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7877,7 +7877,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7892,7 +7892,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7908,7 +7908,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -7923,7 +7923,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-benchmarking", "frame-support", @@ -11050,7 +11050,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "log", "sp-core", @@ -11061,7 +11061,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "futures", @@ -11090,7 +11090,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "futures", "futures-timer", @@ -11113,7 +11113,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11128,7 +11128,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11147,7 +11147,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11158,7 +11158,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11198,7 +11198,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "fnv", "futures", @@ -11225,7 +11225,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "hash-db", "kvdb", @@ -11251,7 +11251,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "futures", @@ -11276,7 +11276,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "futures", @@ -11305,7 +11305,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "fork-tree", @@ -11341,7 +11341,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "futures", "jsonrpsee", @@ -11363,7 +11363,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11399,7 +11399,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "futures", "jsonrpsee", @@ -11418,7 +11418,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11431,7 +11431,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11471,7 +11471,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "finality-grandpa", "futures", @@ -11491,7 +11491,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "futures", @@ -11514,7 +11514,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11536,7 +11536,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11548,7 +11548,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "anyhow", "cfg-if", @@ -11566,7 +11566,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "ansi_term", "futures", @@ -11582,7 +11582,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11596,7 +11596,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11641,7 +11641,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-channel", "cid", @@ -11662,7 +11662,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11690,7 +11690,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "ahash 0.8.2", "futures", @@ -11709,7 +11709,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11732,7 +11732,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11767,14 +11767,13 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "futures", "libp2p", "log", "parity-scale-codec", - "pin-project", "sc-network", "sc-network-common", "sc-peerset", @@ -11787,7 +11786,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11818,7 +11817,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "futures", "libp2p-identity", @@ -11834,7 +11833,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11843,7 +11842,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "futures", "jsonrpsee", @@ -11874,7 +11873,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11893,7 +11892,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "http", "jsonrpsee", @@ -11908,7 +11907,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11934,7 +11933,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "directories", @@ -12000,7 +11999,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "log", "parity-scale-codec", @@ -12011,7 +12010,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "clap", "fs4", @@ -12027,7 +12026,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12046,7 +12045,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "futures", "libc", @@ -12065,7 +12064,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "chrono", "futures", @@ -12084,7 +12083,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "ansi_term", "atty", @@ -12115,7 +12114,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12126,7 +12125,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "futures", @@ -12153,7 +12152,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "futures", @@ -12167,7 +12166,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-channel", "futures", @@ -12725,7 +12724,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "hash-db", "log", @@ -12745,7 +12744,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "Inflector", "blake2", @@ -12759,7 +12758,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "scale-info", @@ -12772,7 +12771,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "integer-sqrt", "num-traits", @@ -12786,7 +12785,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "scale-info", @@ -12799,7 +12798,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "sp-api", @@ -12811,7 +12810,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "futures", "log", @@ -12829,7 +12828,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "futures", @@ -12844,7 +12843,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "parity-scale-codec", @@ -12862,7 +12861,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "parity-scale-codec", @@ -12883,7 +12882,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12902,7 +12901,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "finality-grandpa", "log", @@ -12920,7 +12919,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "scale-info", @@ -12932,7 +12931,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12976,7 +12975,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "blake2b_simd", "byteorder", @@ -12990,7 +12989,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "proc-macro2", "quote", @@ -13001,7 +13000,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13010,7 +13009,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "proc-macro2", "quote", @@ -13020,7 +13019,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "environmental", "parity-scale-codec", @@ -13031,7 +13030,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13046,7 +13045,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "bytes", "ed25519", @@ -13072,7 +13071,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "lazy_static", "sp-core", @@ -13083,7 +13082,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "futures", "parity-scale-codec", @@ -13097,7 +13096,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13106,7 +13105,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13117,7 +13116,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13135,7 +13134,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "scale-info", @@ -13149,7 +13148,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "sp-api", "sp-core", @@ -13159,7 +13158,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "backtrace", "lazy_static", @@ -13169,7 +13168,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "rustc-hash", "serde", @@ -13179,7 +13178,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "either", "hash256-std-hasher", @@ -13201,7 +13200,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13219,7 +13218,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "Inflector", "proc-macro-crate", @@ -13231,7 +13230,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "scale-info", @@ -13245,7 +13244,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "scale-info", @@ -13258,7 +13257,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "hash-db", "log", @@ -13278,7 +13277,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "log", "parity-scale-codec", @@ -13296,12 +13295,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13314,7 +13313,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "futures-timer", @@ -13329,7 +13328,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "sp-std", @@ -13341,7 +13340,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "sp-api", "sp-runtime", @@ -13350,7 +13349,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "log", @@ -13366,7 +13365,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13389,7 +13388,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13406,7 +13405,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13417,7 +13416,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13431,7 +13430,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "parity-scale-codec", "scale-info", @@ -13820,7 +13819,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "platforms 2.0.0", ] @@ -13828,7 +13827,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13847,7 +13846,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "hyper", "log", @@ -13859,7 +13858,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "jsonrpsee", @@ -13872,7 +13871,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "jsonrpsee", "log", @@ -13891,7 +13890,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13917,7 +13916,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13927,7 +13926,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13938,7 +13937,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "ansi_term", "build-helper", @@ -14597,7 +14596,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#79d37ef461a4bdcf6ede7b37d64b28b58484dc7c" +source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" dependencies = [ "async-trait", "clap", From 10afc2f839b053a082839a8de3fc177e5751836e Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Thu, 25 May 2023 16:52:38 +0100 Subject: [PATCH 236/339] Companion for polkadot#7234 (XCM: Tools for uniquely referencing messages) (#2601) * Fixes for new API * Formatting * Fixes * Fixes * Further fixes * XCMP dispatch events mention message ID * XCMP event includes ID * Add DMP message ID functionality * Integrate into test parachains * Remove WithUniqueTopic usage * Use new primitive * Formatting * undiener * Revert lock * Fixes * Fixes * Fixes * Fixes * Formatting * message_hash becomes message_id * Rename * Another Rename * Fixes * Fix * Bump * Fixes * Grumble. --- Cargo.lock | 135 +++++++------- Cargo.toml | 1 + pallets/dmp-queue/src/lib.rs | 168 +++++++++--------- pallets/xcmp-queue/src/lib.rs | 44 +++-- parachain-template/runtime/src/xcm_config.rs | 118 +++--------- parachains/common/src/xcm_config.rs | 78 +------- .../statemine/src/tests/reserve_transfer.rs | 2 +- .../assets/statemine/src/tests/teleport.rs | 4 +- .../statemint/src/tests/reserve_transfer.rs | 2 +- .../assets/statemint/src/tests/teleport.rs | 2 +- .../assets/statemine/src/xcm_config.rs | 64 ++++--- .../assets/statemint/src/xcm_config.rs | 18 +- .../assets/westmint/src/xcm_config.rs | 64 ++++--- .../bridge-hub-kusama/src/xcm_config.rs | 61 ++++--- .../bridge-hub-polkadot/src/xcm_config.rs | 15 +- .../bridge-hub-rococo/src/xcm_config.rs | 66 +++---- .../bridge-hubs/test-utils/Cargo.toml | 1 + .../bridge-hubs/test-utils/src/test_cases.rs | 13 +- .../collectives-polkadot/src/xcm_config.rs | 16 +- .../contracts-rococo/src/xcm_config.rs | 58 +++--- parachains/runtimes/test-utils/src/lib.rs | 7 +- .../runtimes/testing/penpal/src/xcm_config.rs | 63 +++---- primitives/utility/src/lib.rs | 2 +- 23 files changed, 432 insertions(+), 570 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a5785e03e5..54734f0b56a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1147,6 +1147,7 @@ dependencies = [ name = "bridge-hub-test-utils" version = "0.1.0" dependencies = [ + "assert_matches", "asset-test-utils", "bp-bridge-hub-rococo", "bp-bridge-hub-wococo", @@ -5158,7 +5159,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bitvec", "frame-benchmarking", @@ -5257,7 +5258,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "frame-support", "polkadot-primitives", @@ -7938,7 +7939,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7959,7 +7960,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "frame-benchmarking", "frame-support", @@ -8576,7 +8577,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8592,7 +8593,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8606,7 +8607,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "derive_more", "fatality", @@ -8629,7 +8630,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "fatality", "futures", @@ -8650,7 +8651,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "clap", "frame-benchmarking-cli", @@ -8679,7 +8680,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "async-trait", "frame-benchmarking", @@ -8722,7 +8723,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "always-assert", "bitvec", @@ -8744,7 +8745,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "parity-scale-codec", "scale-info", @@ -8756,7 +8757,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "derive_more", "fatality", @@ -8781,7 +8782,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8795,7 +8796,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "futures", "futures-timer", @@ -8815,7 +8816,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "always-assert", "async-trait", @@ -8838,7 +8839,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "futures", "parity-scale-codec", @@ -8856,7 +8857,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bitvec", "derive_more", @@ -8885,7 +8886,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bitvec", "futures", @@ -8906,7 +8907,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bitvec", "fatality", @@ -8925,7 +8926,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8940,7 +8941,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "async-trait", "futures", @@ -8960,7 +8961,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "futures", "polkadot-node-metrics", @@ -8975,7 +8976,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "futures", "futures-timer", @@ -8992,7 +8993,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "fatality", "futures", @@ -9011,7 +9012,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "async-trait", "futures", @@ -9028,7 +9029,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bitvec", "fatality", @@ -9046,7 +9047,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "always-assert", "futures", @@ -9073,7 +9074,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "futures", "polkadot-node-primitives", @@ -9089,7 +9090,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "assert_matches", "cpu-time", @@ -9118,7 +9119,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "futures", "lru 0.9.0", @@ -9133,7 +9134,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "lazy_static", "log", @@ -9151,7 +9152,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bs58", "futures", @@ -9170,7 +9171,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "async-channel", "async-trait", @@ -9193,7 +9194,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bounded-vec", "futures", @@ -9215,7 +9216,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9225,7 +9226,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "async-trait", "futures", @@ -9243,7 +9244,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "async-trait", "derive_more", @@ -9266,7 +9267,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "async-trait", "derive_more", @@ -9299,7 +9300,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "async-trait", "futures", @@ -9322,7 +9323,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bounded-collections", "derive_more", @@ -9421,7 +9422,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9439,7 +9440,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9465,7 +9466,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9497,7 +9498,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bitvec", "frame-benchmarking", @@ -9592,7 +9593,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bitvec", "frame-benchmarking", @@ -9638,7 +9639,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "frame-support", "polkadot-primitives", @@ -9652,7 +9653,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bs58", "parity-scale-codec", @@ -9664,7 +9665,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bitflags", "bitvec", @@ -9709,7 +9710,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9819,7 +9820,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9840,7 +9841,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9850,7 +9851,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9875,7 +9876,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9936,7 +9937,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "frame-benchmarking", "frame-system", @@ -10716,7 +10717,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10803,7 +10804,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "frame-support", "polkadot-primitives", @@ -12647,7 +12648,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "enumn", "parity-scale-codec", @@ -14064,7 +14065,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "frame-support", "polkadot-primitives", @@ -14455,7 +14456,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14466,7 +14467,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -15544,7 +15545,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bitvec", "frame-benchmarking", @@ -15637,7 +15638,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "frame-support", "polkadot-primitives", @@ -16140,7 +16141,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "bounded-collections", "derivative", @@ -16156,7 +16157,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "frame-support", "frame-system", @@ -16211,7 +16212,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "environmental", "frame-benchmarking", @@ -16231,7 +16232,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#039d81563097c03935a519c5de6f3b0f8d8abc15" +source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" dependencies = [ "Inflector", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 6027e4cf31b..faec5a0288a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,3 +71,4 @@ opt-level = 3 inherits = "release" lto = true codegen-units = 1 + diff --git a/pallets/dmp-queue/src/lib.rs b/pallets/dmp-queue/src/lib.rs index 082fceaf14c..66329007ec0 100644 --- a/pallets/dmp-queue/src/lib.rs +++ b/pallets/dmp-queue/src/lib.rs @@ -75,7 +75,7 @@ pub struct PageIndexData { /// Simple type used to identify messages for the purpose of reporting events. Secure if and only /// if the message content is unique. -pub type MessageId = [u8; 32]; +pub type MessageId = XcmHash; /// Index used to identify overweight messages. pub type OverweightIndex = u64; @@ -174,23 +174,39 @@ pub mod pallet { #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { /// Downward message is invalid XCM. - InvalidFormat { message_id: MessageId }, + InvalidFormat { message_hash: XcmHash }, /// Downward message is unsupported version of XCM. - UnsupportedVersion { message_id: MessageId }, + UnsupportedVersion { message_hash: XcmHash }, /// Downward message executed with the given outcome. - ExecutedDownward { message_id: MessageId, outcome: Outcome }, + ExecutedDownward { message_hash: XcmHash, message_id: XcmHash, outcome: Outcome }, /// The weight limit for handling downward messages was reached. - WeightExhausted { message_id: MessageId, remaining_weight: Weight, required_weight: Weight }, + WeightExhausted { + message_hash: XcmHash, + message_id: XcmHash, + remaining_weight: Weight, + required_weight: Weight, + }, /// Downward message is overweight and was placed in the overweight queue. OverweightEnqueued { - message_id: MessageId, + message_hash: XcmHash, + message_id: XcmHash, overweight_index: OverweightIndex, required_weight: Weight, }, /// Downward message from the overweight queue was executed. OverweightServiced { overweight_index: OverweightIndex, weight_used: Weight }, - /// The maximum number of downward messages was. - MaxMessagesExhausted { message_id: MessageId }, + /// The maximum number of downward messages was reached. + MaxMessagesExhausted { message_hash: XcmHash }, + } + + /// Error type when a message was failed to be serviced. + pub(crate) struct ServiceMessageError { + /// The message's hash. + message_hash: XcmHash, + /// The message's ID (which could also be its hash if nothing overrides it). + message_id: XcmHash, + /// Weight required for the message to be executed. + required_weight: Weight, } impl Pallet { @@ -250,8 +266,9 @@ pub mod pallet { limit: Weight, _sent_at: RelayBlockNumber, mut data: &[u8], - ) -> Result { - let message_id = sp_io::hashing::blake2_256(data); + ) -> Result { + let message_hash = sp_io::hashing::blake2_256(data); + let mut message_id = message_hash; let maybe_msg = VersionedXcm::::decode_all_with_depth_limit( MAX_XCM_DECODE_DEPTH, &mut data, @@ -259,21 +276,31 @@ pub mod pallet { .map(Xcm::::try_from); match maybe_msg { Err(_) => { - Self::deposit_event(Event::InvalidFormat { message_id }); + Self::deposit_event(Event::InvalidFormat { message_hash }); Ok(Weight::zero()) }, Ok(Err(())) => { - Self::deposit_event(Event::UnsupportedVersion { message_id }); + Self::deposit_event(Event::UnsupportedVersion { message_hash }); Ok(Weight::zero()) }, Ok(Ok(x)) => { - let outcome = T::XcmExecutor::execute_xcm(Parent, x, message_id, limit); + let outcome = T::XcmExecutor::prepare_and_execute( + Parent, + x, + &mut message_id, + limit, + Weight::zero(), + ); match outcome { - Outcome::Error(XcmError::WeightLimitReached(required)) => - Err((message_id, required)), + Outcome::Error(XcmError::WeightLimitReached(required_weight)) => + Err(ServiceMessageError { message_hash, message_id, required_weight }), outcome => { let weight_used = outcome.weight_used(); - Self::deposit_event(Event::ExecutedDownward { message_id, outcome }); + Self::deposit_event(Event::ExecutedDownward { + message_hash, + message_id, + outcome, + }); Ok(weight_used) }, } @@ -314,7 +341,7 @@ pub mod pallet { maybe_enqueue_page = Some(Vec::with_capacity(item_count_left)); Self::deposit_event(Event::MaxMessagesExhausted { - message_id: sp_io::hashing::blake2_256(&data), + message_hash: sp_io::hashing::blake2_256(&data), }); } else { // We're not currently enqueuing - try to execute inline. @@ -322,7 +349,11 @@ pub mod pallet { messages_processed += 1; match Self::try_service_message(remaining_weight, sent_at, &data[..]) { Ok(consumed) => used += consumed, - Err((message_id, required_weight)) => + Err(ServiceMessageError { + message_hash, + message_id, + required_weight, + }) => // Too much weight required right now. { let is_under_limit = @@ -334,6 +365,7 @@ pub mod pallet { let overweight_index = page_index.overweight_count; Overweight::::insert(overweight_index, (sent_at, data)); Self::deposit_event(Event::OverweightEnqueued { + message_hash, message_id, overweight_index, required_weight, @@ -348,6 +380,7 @@ pub mod pallet { let item_count_left = item_count.saturating_sub(i); maybe_enqueue_page = Some(Vec::with_capacity(item_count_left)); Self::deposit_event(Event::WeightExhausted { + message_hash, message_id, remaining_weight, required_weight, @@ -466,50 +499,36 @@ mod tests { }) } - pub enum Weightless {} - impl PreparedMessage for Weightless { + pub struct MockPrepared(Xcm); + impl PreparedMessage for MockPrepared { fn weight_of(&self) -> Weight { - unreachable!() + match ((self.0).0.len(), &(self.0).0.first()) { + (1, Some(Transact { require_weight_at_most, .. })) => *require_weight_at_most, + _ => Weight::from_parts(1, 1), + } } } pub struct MockExec; impl ExecuteXcm for MockExec { - type Prepared = Weightless; + type Prepared = MockPrepared; - fn prepare(_message: Xcm) -> Result { - unreachable!() + fn prepare(message: Xcm) -> Result { + Ok(MockPrepared(message)) } fn execute( _origin: impl Into, - _pre: Weightless, - _hash: XcmHash, - _weight_credit: Weight, - ) -> Outcome { - unreachable!() - } - - fn execute_xcm_in_credit( - _origin: impl Into, - message: Xcm, - _hash: XcmHash, - weight_limit: Weight, + prepared: MockPrepared, + _id: &mut XcmHash, _weight_credit: Weight, ) -> Outcome { + let message = prepared.0; let o = match (message.0.len(), &message.0.first()) { - (1, Some(Transact { require_weight_at_most, .. })) => { - if require_weight_at_most.all_lte(weight_limit) { - Outcome::Complete(*require_weight_at_most) - } else { - Outcome::Error(XcmError::WeightLimitReached(*require_weight_at_most)) - } - }, + (1, Some(Transact { require_weight_at_most, .. })) => + Outcome::Complete(*require_weight_at_most), // use 1000 to decide that it's not supported. - _ => Outcome::Incomplete( - Weight::from_parts(1000, 1000).min(weight_limit), - XcmError::Unimplemented, - ), + _ => Outcome::Incomplete(Weight::from_parts(1, 1), XcmError::Unimplemented), }; TRACE.with(|q| q.borrow_mut().push((message, o.clone()))); o @@ -564,13 +583,6 @@ mod tests { (msg(weight), Outcome::Complete(Weight::from_parts(weight, weight))) } - fn msg_limit_reached(weight: u64) -> (Xcm, Outcome) { - ( - msg(weight), - Outcome::Error(XcmError::WeightLimitReached(Weight::from_parts(weight, weight))), - ) - } - fn pages_queued() -> PageCounter { PageIndex::::get().end_used - PageIndex::::get().begin_used } @@ -613,10 +625,7 @@ mod tests { enqueue(&enqueued); let weight_used = handle_messages(&[], Weight::from_parts(2500, 2500)); assert_eq!(weight_used, Weight::from_parts(2001, 2001)); - assert_eq!( - take_trace(), - vec![msg_complete(1000), msg_complete(1001), msg_limit_reached(1002),] - ); + assert_eq!(take_trace(), vec![msg_complete(1000), msg_complete(1001),]); }); } @@ -631,18 +640,15 @@ mod tests { PageIndexData { begin_used: 0, end_used: 1, overweight_count: 0 } ); assert_eq!(Pages::::get(0).len(), 3); - assert_eq!(take_trace(), vec![msg_limit_reached(1000)]); + assert_eq!(take_trace(), vec![]); let weight_used = handle_messages(&[], Weight::from_parts(2500, 2500)); assert_eq!(weight_used, Weight::from_parts(2001, 2001)); - assert_eq!( - take_trace(), - vec![msg_complete(1000), msg_complete(1001), msg_limit_reached(1002),] - ); + assert_eq!(take_trace(), vec![msg_complete(1000), msg_complete(1001)]); let weight_used = handle_messages(&[], Weight::from_parts(2500, 2500)); assert_eq!(weight_used, Weight::from_parts(1002, 1002)); - assert_eq!(take_trace(), vec![msg_complete(1002),]); + assert_eq!(take_trace(), vec![msg_complete(1002)]); assert!(queue_is_empty()); }); } @@ -655,7 +661,7 @@ mod tests { assert_eq!(weight_used, Weight::from_parts(1000, 1000)); assert_eq!(pages_queued(), 1); assert_eq!(Pages::::get(0).len(), 2); - assert_eq!(take_trace(), vec![msg_complete(1000), msg_limit_reached(1001),]); + assert_eq!(take_trace(), vec![msg_complete(1000)]); let weight_used = handle_messages(&[], Weight::from_parts(2500, 2500)); assert_eq!(weight_used, Weight::from_parts(2003, 2003)); @@ -693,13 +699,13 @@ mod tests { enqueue(&enqueued); let weight_used = handle_messages(&incoming, Weight::from_parts(5000, 5000)); assert_eq!(weight_used, Weight::from_parts(1000, 1000)); - assert_eq!(take_trace(), vec![msg_complete(1000), msg_limit_reached(10001),]); + assert_eq!(take_trace(), vec![msg_complete(1000)]); assert_eq!(pages_queued(), 2); // 5000 is not enough to process the 10001 blocker, so nothing happens. let weight_used = handle_messages(&[], Weight::from_parts(5000, 5000)); assert_eq!(weight_used, Weight::zero()); - assert_eq!(take_trace(), vec![msg_limit_reached(10001),]); + assert_eq!(take_trace(), vec![]); // 20000 is now enough to process everything. let weight_used = handle_messages(&[], Weight::from_parts(20000, 20000)); @@ -720,10 +726,7 @@ mod tests { enqueue(&enqueued); let weight_used = handle_messages(&incoming, Weight::from_parts(5000, 5000)); assert_eq!(weight_used, Weight::from_parts(2001, 2001)); - assert_eq!( - take_trace(), - vec![msg_complete(1000), msg_complete(1001), msg_limit_reached(10002),] - ); + assert_eq!(take_trace(), vec![msg_complete(1000), msg_complete(1001)]); assert_eq!(pages_queued(), 1); // 20000 is now enough to process everything. @@ -744,12 +747,7 @@ mod tests { assert_eq!(weight_used, Weight::from_parts(3003, 3003)); assert_eq!( take_trace(), - vec![ - msg_complete(1000), - msg_complete(1001), - msg_complete(1002), - msg_limit_reached(10003), - ] + vec![msg_complete(1000), msg_complete(1001), msg_complete(1002),] ); assert_eq!(pages_queued(), 1); @@ -768,19 +766,19 @@ mod tests { enqueue(&enqueued); let weight_used = handle_messages(&[msg(1002)], Weight::from_parts(1500, 1500)); assert_eq!(weight_used, Weight::from_parts(1000, 1000)); - assert_eq!(take_trace(), vec![msg_complete(1000), msg_limit_reached(1001),]); + assert_eq!(take_trace(), vec![msg_complete(1000)]); assert_eq!(pages_queued(), 2); assert_eq!(PageIndex::::get().begin_used, 0); let weight_used = handle_messages(&[msg(1003)], Weight::from_parts(1500, 1500)); assert_eq!(weight_used, Weight::from_parts(1001, 1001)); - assert_eq!(take_trace(), vec![msg_complete(1001), msg_limit_reached(1002),]); + assert_eq!(take_trace(), vec![msg_complete(1001)]); assert_eq!(pages_queued(), 2); assert_eq!(PageIndex::::get().begin_used, 1); let weight_used = handle_messages(&[msg(1004)], Weight::from_parts(1500, 1500)); assert_eq!(weight_used, Weight::from_parts(1002, 1002)); - assert_eq!(take_trace(), vec![msg_complete(1002), msg_limit_reached(1003),]); + assert_eq!(take_trace(), vec![msg_complete(1002)]); assert_eq!(pages_queued(), 2); assert_eq!(PageIndex::::get().begin_used, 2); }); @@ -798,10 +796,7 @@ mod tests { let weight_used = handle_messages(&incoming, Weight::from_parts(2500, 2500)); assert_eq!(weight_used, Weight::from_parts(2002, 2002)); assert!(queue_is_empty()); - assert_eq!( - take_trace(), - vec![msg_complete(1000), msg_limit_reached(10001), msg_complete(1002),] - ); + assert_eq!(take_trace(), vec![msg_complete(1000), msg_complete(1002),]); assert_eq!(overweights(), vec![0]); }); @@ -818,7 +813,7 @@ mod tests { let incoming = vec![msg(10000)]; let weight_used = handle_messages(&incoming, Weight::from_parts(2500, 2500)); assert_eq!(weight_used, Weight::zero()); - assert_eq!(take_trace(), vec![msg_limit_reached(10000)]); + assert_eq!(take_trace(), vec![]); assert_eq!(overweights(), vec![0]); assert_noop!( @@ -845,7 +840,7 @@ mod tests { ), Error::::OverLimit ); - assert_eq!(take_trace(), vec![msg_limit_reached(10000)]); + assert_eq!(take_trace(), vec![]); let base_weight = super::Call::::service_overweight { index: 0, weight_limit: Weight::zero() } @@ -891,7 +886,6 @@ mod tests { msg_complete(1002), msg_complete(1003), msg_complete(1004), - msg_limit_reached(1005), ] ); assert_eq!(pages_queued(), 1); diff --git a/pallets/xcmp-queue/src/lib.rs b/pallets/xcmp-queue/src/lib.rs index 0dc76aa80a1..93c9100f520 100644 --- a/pallets/xcmp-queue/src/lib.rs +++ b/pallets/xcmp-queue/src/lib.rs @@ -282,15 +282,15 @@ pub mod pallet { #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { /// Some XCM was executed ok. - Success { message_hash: Option, weight: Weight }, + Success { message_hash: XcmHash, message_id: XcmHash, weight: Weight }, /// Some XCM failed. - Fail { message_hash: Option, error: XcmError, weight: Weight }, + Fail { message_hash: XcmHash, message_id: XcmHash, error: XcmError, weight: Weight }, /// Bad XCM version used. - BadVersion { message_hash: Option }, + BadVersion { message_hash: XcmHash }, /// Bad XCM format used. - BadFormat { message_hash: Option }, + BadFormat { message_hash: XcmHash }, /// An HRMP message was sent to a sibling parachain. - XcmpMessageSent { message_hash: Option }, + XcmpMessageSent { message_hash: XcmHash }, /// An XCM exceeded the individual message weight budget. OverweightEnqueued { sender: ParaId, @@ -619,27 +619,33 @@ impl Pallet { xcm: VersionedXcm, max_weight: Weight, ) -> Result { - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - log::debug!("Processing XCMP-XCM: {:?}", &hash); + let message_hash = xcm.using_encoded(sp_io::hashing::blake2_256); + log::debug!("Processing XCMP-XCM: {:?}", &message_hash); let (result, event) = match Xcm::::try_from(xcm) { Ok(xcm) => { let location = (Parent, Parachain(sender.into())); - - match T::XcmExecutor::execute_xcm(location, xcm, hash, max_weight) { - Outcome::Error(e) => ( - Err(e), - Event::Fail { message_hash: Some(hash), error: e, weight: Weight::zero() }, + let mut message_id = message_hash; + + match T::XcmExecutor::prepare_and_execute( + location, + xcm, + &mut message_id, + max_weight, + Weight::zero(), + ) { + Outcome::Error(error) => ( + Err(error), + Event::Fail { message_hash, message_id, error, weight: Weight::zero() }, ), - Outcome::Complete(w) => - (Ok(w), Event::Success { message_hash: Some(hash), weight: w }), + Outcome::Complete(weight) => + (Ok(weight), Event::Success { message_hash, message_id, weight }), // As far as the caller is concerned, this was dispatched without error, so // we just report the weight used. - Outcome::Incomplete(w, e) => - (Ok(w), Event::Fail { message_hash: Some(hash), error: e, weight: w }), + Outcome::Incomplete(weight, error) => + (Ok(weight), Event::Fail { message_hash, message_id, error, weight }), } }, - Err(()) => - (Err(XcmError::UnhandledXcmVersion), Event::BadVersion { message_hash: Some(hash) }), + Err(()) => (Err(XcmError::UnhandledXcmVersion), Event::BadVersion { message_hash }), }; Self::deposit_event(event); result @@ -1183,7 +1189,7 @@ impl SendXcm for Pallet { match Self::send_fragment(id, XcmpMessageFormat::ConcatenatedVersionedXcm, xcm) { Ok(_) => { - Self::deposit_event(Event::XcmpMessageSent { message_hash: Some(hash) }); + Self::deposit_event(Event::XcmpMessageSent { message_hash: hash }); Ok(hash) }, Err(e) => Err(SendError::Transport(<&'static str>::from(e))), diff --git a/parachain-template/runtime/src/xcm_config.rs b/parachain-template/runtime/src/xcm_config.rs index 775455cc622..9eea16068d0 100644 --- a/parachain-template/runtime/src/xcm_config.rs +++ b/parachain-template/runtime/src/xcm_config.rs @@ -2,10 +2,9 @@ use super::{ AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, }; -use core::{marker::PhantomData, ops::ControlFlow}; use frame_support::{ - log, match_types, parameter_types, - traits::{ConstU32, Everything, Nothing, ProcessMessageError}, + match_types, parameter_types, + traits::{ConstU32, Everything, Nothing}, weights::Weight, }; use frame_system::EnsureRoot; @@ -15,12 +14,13 @@ use polkadot_runtime_common::impls::ToAuthor; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, - CreateMatcher, CurrencyAdapter, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, MatchXcm, - NativeAsset, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WithComputedOrigin, + CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, + FixedWeightBounds, IsConcrete, NativeAsset, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WithComputedOrigin, WithUniqueTopic, }; -use xcm_executor::{traits::ShouldExecute, XcmExecutor}; +use xcm_executor::XcmExecutor; parameter_types! { pub const RelayLocation: MultiLocation = MultiLocation::parent(); @@ -90,88 +90,22 @@ match_types! { }; } -//TODO: move DenyThenTry to polkadot's xcm module. -/// Deny executing the xcm message if it matches any of the Deny filter regardless of anything else. -/// If it passes the Deny, and matches one of the Allow cases then it is let through. -pub struct DenyThenTry(PhantomData, PhantomData) -where - Deny: ShouldExecute, - Allow: ShouldExecute; - -impl ShouldExecute for DenyThenTry -where - Deny: ShouldExecute, - Allow: ShouldExecute, -{ - fn should_execute( - origin: &MultiLocation, - message: &mut [Instruction], - max_weight: Weight, - weight_credit: &mut Weight, - ) -> Result<(), ProcessMessageError> { - Deny::should_execute(origin, message, max_weight, weight_credit)?; - Allow::should_execute(origin, message, max_weight, weight_credit) - } -} - -// See issue -pub struct DenyReserveTransferToRelayChain; -impl ShouldExecute for DenyReserveTransferToRelayChain { - fn should_execute( - origin: &MultiLocation, - message: &mut [Instruction], - _max_weight: Weight, - _weight_credit: &mut Weight, - ) -> Result<(), ProcessMessageError> { - message.matcher().match_next_inst_while( - |_| true, - |inst| match inst { - InitiateReserveWithdraw { - reserve: MultiLocation { parents: 1, interior: Here }, - .. - } | - DepositReserveAsset { - dest: MultiLocation { parents: 1, interior: Here }, .. - } | - TransferReserveAsset { - dest: MultiLocation { parents: 1, interior: Here }, .. - } => { - Err(ProcessMessageError::Unsupported) // Deny - }, - // An unexpected reserve transfer has arrived from the Relay Chain. Generally, - // `IsReserve` should not allow this, but we just log it here. - ReserveAssetDeposited { .. } - if matches!(origin, MultiLocation { parents: 1, interior: Here }) => - { - log::warn!( - target: "xcm::barrier", - "Unexpected ReserveAssetDeposited from the Relay Chain", - ); - Ok(ControlFlow::Continue(())) - }, - _ => Ok(ControlFlow::Continue(())), - }, - )?; - - // Permit everything else - Ok(()) - } -} - -pub type Barrier = DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - WithComputedOrigin< - ( - AllowTopLevelPaidExecutionFrom, - AllowExplicitUnpaidExecutionFrom, - // ^^^ Parent and its exec plurality get free execution - ), - UniversalLocation, - ConstU32<8>, - >, - ), +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + TakeWeightCredit, + WithComputedOrigin< + ( + AllowTopLevelPaidExecutionFrom, + AllowExplicitUnpaidExecutionFrom, + // ^^^ Parent and its exec plurality get free execution + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, >; pub struct XcmConfig; @@ -208,12 +142,12 @@ pub type LocalOriginToLocation = SignedToAccountId32, // ..and XCMP to communicate with the sibling chains. XcmpQueue, -); +)>; #[cfg(feature = "runtime-benchmarks")] parameter_types! { diff --git a/parachains/common/src/xcm_config.rs b/parachains/common/src/xcm_config.rs index 61e6f389e6d..529822cff16 100644 --- a/parachains/common/src/xcm_config.rs +++ b/parachains/common/src/xcm_config.rs @@ -1,86 +1,12 @@ use crate::impls::AccountIdOf; -use core::{marker::PhantomData, ops::ControlFlow}; +use core::marker::PhantomData; use frame_support::{ log, - traits::{ - fungibles::Inspect, tokens::ConversionToAssetBalance, ContainsPair, ProcessMessageError, - }, + traits::{fungibles::Inspect, tokens::ConversionToAssetBalance, ContainsPair}, weights::Weight, }; use sp_runtime::traits::Get; use xcm::latest::prelude::*; -use xcm_builder::{CreateMatcher, MatchXcm}; -use xcm_executor::traits::ShouldExecute; - -//TODO: move DenyThenTry to polkadot's xcm module. -/// Deny executing the XCM if it matches any of the Deny filter regardless of anything else. -/// If it passes the Deny, and matches one of the Allow cases then it is let through. -pub struct DenyThenTry(PhantomData, PhantomData) -where - Deny: ShouldExecute, - Allow: ShouldExecute; - -impl ShouldExecute for DenyThenTry -where - Deny: ShouldExecute, - Allow: ShouldExecute, -{ - fn should_execute( - origin: &MultiLocation, - message: &mut [Instruction], - max_weight: Weight, - weight_credit: &mut Weight, - ) -> Result<(), ProcessMessageError> { - Deny::should_execute(origin, message, max_weight, weight_credit)?; - Allow::should_execute(origin, message, max_weight, weight_credit) - } -} - -// See issue -pub struct DenyReserveTransferToRelayChain; -impl ShouldExecute for DenyReserveTransferToRelayChain { - fn should_execute( - origin: &MultiLocation, - message: &mut [Instruction], - _max_weight: Weight, - _weight_credit: &mut Weight, - ) -> Result<(), ProcessMessageError> { - message.matcher().match_next_inst_while( - |_| true, - |inst| match inst { - InitiateReserveWithdraw { - reserve: MultiLocation { parents: 1, interior: Here }, - .. - } | - DepositReserveAsset { - dest: MultiLocation { parents: 1, interior: Here }, .. - } | - TransferReserveAsset { - dest: MultiLocation { parents: 1, interior: Here }, .. - } => { - Err(ProcessMessageError::Unsupported) // Deny - }, - - // An unexpected reserve transfer has arrived from the Relay Chain. Generally, - // `IsReserve` should not allow this, but we just log it here. - ReserveAssetDeposited { .. } - if matches!(origin, MultiLocation { parents: 1, interior: Here }) => - { - log::warn!( - target: "xcm::barrier", - "Unexpected ReserveAssetDeposited from the Relay Chain", - ); - Ok(ControlFlow::Continue(())) - }, - - _ => Ok(ControlFlow::Continue(())), - }, - )?; - - // Permit everything else - Ok(()) - } -} /// A `ChargeFeeInFungibles` implementation that converts the output of /// a given WeightToFee implementation an amount charged in diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs index 2139e0324b9..bbf272572ac 100644 --- a/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs +++ b/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs @@ -32,7 +32,7 @@ fn reserve_transfer_native_asset_from_relay_to_assets() { assert_expected_events!( Kusama, vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted(Outcome::Complete(weight))) => { + RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { outcome: Outcome::Complete(weight) }) => { weight: weight_within_threshold((REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), Weight::from_parts(754_244_000, 0), *weight), }, ] diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs index 389f1a365ea..cbb07e4592e 100644 --- a/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs +++ b/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs @@ -32,7 +32,9 @@ fn teleport_native_assets_from_relay_to_assets_para() { assert_expected_events!( Kusama, vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted(Outcome::Complete { .. })) => {}, + RuntimeEvent::XcmPallet( + pallet_xcm::Event::Attempted { outcome: Outcome::Complete { .. } } + ) => {}, ] ); }); diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs index 55d201c5608..b69222670b1 100644 --- a/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs +++ b/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs @@ -32,7 +32,7 @@ fn reserve_transfer_native_asset_from_relay_to_assets() { assert_expected_events!( Polkadot, vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted(Outcome::Complete(weight))) => { + RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { outcome: Outcome::Complete(weight) }) => { weight: weight_within_threshold((REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), Weight::from_parts(2_000_000_000, 0), *weight), }, ] diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs index ed13d297d4e..19aa5fe1f9e 100644 --- a/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs +++ b/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs @@ -32,7 +32,7 @@ fn teleport_native_assets_from_relay_to_assets_para() { assert_expected_events!( Polkadot, vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted(Outcome::Complete { .. })) => {}, + RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { outcome: Outcome::Complete { .. } }) => {}, ] ); }); diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 788a0ec5616..0ef469d2b31 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -27,22 +27,18 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::{ - impls::ToStakingPot, - xcm_config::{ - AssetFeeAsExistentialDepositMultiplier, DenyReserveTransferToRelayChain, DenyThenTry, - }, -}; +use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; use polkadot_parachain::primitives::Sibling; use sp_runtime::traits::ConvertInto; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - UsingComponents, WeightInfoBounds, WithComputedOrigin, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, + DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FungiblesAdapter, IsConcrete, + LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -341,26 +337,28 @@ impl Contains for SafeCallFilter { } } -pub type Barrier = DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + // Allow XCMs with some computed origins to pass through. + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) get free execution. + AllowExplicitUnpaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, >; pub type AssetFeeAsExistentialDepositMultiplierFeeCharger = AssetFeeAsExistentialDepositMultiplier< @@ -429,12 +427,12 @@ pub type LocalOriginToLocation = SignedToAccountId32, // ..and XCMP to communicate with the sibling chains. XcmpQueue, -); +)>; #[cfg(feature = "runtime-benchmarks")] parameter_types! { diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index c045b39286f..ba2862742c1 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -27,22 +27,18 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::{ - impls::ToStakingPot, - xcm_config::{ - AssetFeeAsExistentialDepositMultiplier, DenyReserveTransferToRelayChain, DenyThenTry, - }, -}; +use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; use polkadot_parachain::primitives::Sibling; use sp_runtime::traits::ConvertInto; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - UsingComponents, WeightInfoBounds, WithComputedOrigin, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, + DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FungiblesAdapter, IsConcrete, + LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, + WeightInfoBounds, WithComputedOrigin, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 92aad0fbbe3..33c8e487054 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -28,22 +28,18 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::{ - impls::ToStakingPot, - xcm_config::{ - AssetFeeAsExistentialDepositMultiplier, DenyReserveTransferToRelayChain, DenyThenTry, - }, -}; +use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; use polkadot_parachain::primitives::Sibling; use sp_runtime::traits::ConvertInto; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - UsingComponents, WeightInfoBounds, WithComputedOrigin, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, + DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FungiblesAdapter, IsConcrete, + LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -342,26 +338,28 @@ impl Contains for SafeCallFilter { } } -pub type Barrier = DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + // Allow XCMs with some computed origins to pass through. + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) get free execution. + AllowExplicitUnpaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, >; pub type AssetFeeAsExistentialDepositMultiplierFeeCharger = AssetFeeAsExistentialDepositMultiplier< @@ -429,12 +427,12 @@ pub type LocalOriginToLocation = SignedToAccountId32, // ..and XCMP to communicate with the sibling chains. XcmpQueue, -); +)>; #[cfg(feature = "runtime-benchmarks")] parameter_types! { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs index 5957b2ebbae..6f9c1542423 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs @@ -24,19 +24,16 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::{ - impls::ToStakingPot, - xcm_config::{ConcreteNativeAssetFrom, DenyReserveTransferToRelayChain, DenyThenTry}, -}; +use parachains_common::{impls::ToStakingPot, xcm_config::ConcreteNativeAssetFrom}; use polkadot_parachain::primitives::Sibling; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, - WithComputedOrigin, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, + DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, IsConcrete, ParentAsSuperuser, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -154,26 +151,28 @@ impl Contains for SafeCallFilter { } } -pub type Barrier = DenyThenTry< - DenyReserveTransferToRelayChain, - ( - // Allow local users to buy weight credit. - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + // Allow local users to buy weight credit. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) get free execution. + AllowExplicitUnpaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, >; pub struct XcmConfig; @@ -217,12 +216,12 @@ pub type LocalOriginToLocation = SignedToAccountId32, // ..and XCMP to communicate with the sibling chains. XcmpQueue, -); +)>; #[cfg(feature = "runtime-benchmarks")] parameter_types! { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs index 7b34b5e135b..e2bf2dd4a95 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs @@ -24,19 +24,16 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::{ - impls::ToStakingPot, - xcm_config::{ConcreteNativeAssetFrom, DenyReserveTransferToRelayChain, DenyThenTry}, -}; +use parachains_common::{impls::ToStakingPot, xcm_config::ConcreteNativeAssetFrom}; use polkadot_parachain::primitives::Sibling; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, - WithComputedOrigin, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, + DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, IsConcrete, ParentAsSuperuser, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + UsingComponents, WeightInfoBounds, WithComputedOrigin, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index 1a5bb335964..a08f2f7c426 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -30,20 +30,18 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::{ - impls::ToStakingPot, - xcm_config::{ConcreteNativeAssetFrom, DenyReserveTransferToRelayChain, DenyThenTry}, -}; +use parachains_common::{impls::ToStakingPot, xcm_config::ConcreteNativeAssetFrom}; use polkadot_parachain::primitives::Sibling; use sp_core::Get; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, - CurrencyAdapter, EnsureXcmOrigin, IsConcrete, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - UsingComponents, WeightInfoBounds, WithComputedOrigin, + CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, IsConcrete, + ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{ traits::{ExportXcm, WithOriginFilter}, @@ -197,29 +195,31 @@ impl Contains for SafeCallFilter { } } -pub type Barrier = DenyThenTry< - DenyReserveTransferToRelayChain, - ( - // Allow local users to buy weight credit. - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - // TODO:check-parameter - (https://github.com/paritytech/parity-bridges-common/issues/2084) - // remove this and extend `AllowExplicitUnpaidExecutionFrom` with "or SystemParachains" once merged https://github.com/paritytech/polkadot/pull/7005 - AllowUnpaidExecutionFrom, - ), +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + // Allow local users to buy weight credit. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) get free execution. + AllowExplicitUnpaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + // TODO:check-parameter - (https://github.com/paritytech/parity-bridges-common/issues/2084) + // remove this and extend `AllowExplicitUnpaidExecutionFrom` with "or SystemParachains" once merged https://github.com/paritytech/polkadot/pull/7005 + AllowUnpaidExecutionFrom, + ), + >, >; pub struct XcmConfig; @@ -263,12 +263,12 @@ pub type LocalOriginToLocation = SignedToAccountId32, // ..and XCMP to communicate with the sibling chains. XcmpQueue, -); +)>; #[cfg(feature = "runtime-benchmarks")] parameter_types! { diff --git a/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml index d9410a1abf0..ade734b6ce2 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -8,6 +8,7 @@ description = "Utils for BridgeHub testing" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } log = { version = "0.4.17", default-features = false } +assert_matches = "1.4.0" # Substrate frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } diff --git a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs index 7d26b266dc2..14792067e43 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs +++ b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs @@ -16,6 +16,7 @@ //! Module contains predefined test-case scenarios for `Runtime` with bridging capabilities. +use assert_matches::assert_matches; use bp_messages::{ target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch, SourceHeaderChain}, LaneId, MessageKey, OutboundLaneData, Weight, @@ -462,7 +463,7 @@ pub fn relayed_incoming_message_works::ClearOrigin; 42]; - let expected_dispatch = xcm::VersionedXcm::<()>::V3(xcm.clone().into()); + let expected_dispatch = xcm::latest::Xcm::<()>(xcm.clone()); // generate bridged relay chain finality, parachain heads and message proofs, // to be submitted by relayer to this chain. let ( @@ -559,6 +560,9 @@ pub fn relayed_incoming_message_works::try_from(dispatched).unwrap(); + // We use `WithUniqueTopic`, so expect a trailing `SetTopic`. + assert_matches!(dispatched.0.pop(), Some(SetTopic(..))); assert_eq!(dispatched, expected_dispatch); }) } @@ -667,8 +671,8 @@ pub fn complex_relay_extrinsic_works::ClearOrigin; 42]; - let expected_dispatch = xcm::VersionedXcm::<()>::V3(xcm.clone().into()); + let xcm = vec![xcm::latest::Instruction::<()>::ClearOrigin; 42]; + let expected_dispatch = xcm::latest::Xcm::<()>(xcm.clone()); // generate bridged relay chain finality, parachain heads and message proofs, // to be submitted by relayer to this chain. let ( @@ -776,6 +780,9 @@ pub fn complex_relay_extrinsic_works::try_from(dispatched).unwrap(); + // We use `WithUniqueTopic`, so expect a trailing `SetTopic`. + assert_matches!(dispatched.0.pop(), Some(SetTopic(..))); assert_eq!(dispatched, expected_dispatch); }) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index 3311b819c8f..c8571ebc6f2 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -24,19 +24,17 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::{ - impls::ToStakingPot, - xcm_config::{ConcreteNativeAssetFrom, DenyReserveTransferToRelayChain, DenyThenTry}, -}; +use parachains_common::{impls::ToStakingPot, xcm_config::ConcreteNativeAssetFrom}; use polkadot_parachain::primitives::Sibling; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - FixedWeightBounds, IsConcrete, OriginToPluralityVoice, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - UsingComponents, WithComputedOrigin, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, + DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, + OriginToPluralityVoice, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, + WithComputedOrigin, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; diff --git a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs index e79d06b1aa1..2f39cc6536d 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs @@ -24,16 +24,16 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_xcm::{EnsureXcm, IsMajorityOfBody, XcmPassthrough}; -use parachains_common::xcm_config::{DenyReserveTransferToRelayChain, DenyThenTry}; use polkadot_parachain::primitives::Sibling; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin, - FixedWeightBounds, IsConcrete, NativeAsset, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - UsingComponents, WithComputedOrigin, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, + DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, + NativeAsset, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::XcmExecutor; @@ -118,26 +118,28 @@ match_types! { }; } -pub type Barrier = DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + // Allow XCMs with some computed origins to pass through. + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) get free execution. + AllowExplicitUnpaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, >; pub struct XcmConfig; @@ -173,12 +175,12 @@ pub type LocalOriginToLocation = SignedToAccountId32, // ..and XCMP to communicate with the sibling chains. XcmpQueue, -); +)>; #[cfg(feature = "runtime-benchmarks")] parameter_types! { diff --git a/parachains/runtimes/test-utils/src/lib.rs b/parachains/runtimes/test-utils/src/lib.rs index 7a59650db51..8ff85438b3f 100644 --- a/parachains/runtimes/test-utils/src/lib.rs +++ b/parachains/runtimes/test-utils/src/lib.rs @@ -258,7 +258,7 @@ impl RuntimeHelper { &to, // We aren't able to track the XCM that initiated the fee deposit, so we create a // fake message hash here - &XcmContext::with_message_hash([0; 32]), + &XcmContext::with_message_id([0; 32]), ) } } @@ -344,7 +344,7 @@ impl RuntimeHelper .into_iter() .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())) .find_map(|e| match e { - pallet_xcm::Event::Attempted(outcome) => Some(outcome), + pallet_xcm::Event::Attempted { outcome } => Some(outcome), _ => None, }) .expect("No `pallet_xcm::Event::Attempted(outcome)` event found!"); @@ -363,7 +363,8 @@ impl RuntimeH .into_iter() .filter_map(|e| unwrap_xcmp_queue_event(e.event.encode())) .find_map(|e| match e { - cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => message_hash, + cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => + Some(message_hash), _ => None, }) } diff --git a/parachains/runtimes/testing/penpal/src/xcm_config.rs b/parachains/runtimes/testing/penpal/src/xcm_config.rs index 26beb474169..d005cc664a3 100644 --- a/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -38,7 +38,6 @@ use frame_support::{ use frame_system::EnsureRoot; use pallet_asset_tx_payment::HandleCredit; use pallet_xcm::XcmPassthrough; -use parachains_common::xcm_config::{DenyReserveTransferToRelayChain, DenyThenTry}; use polkadot_parachain::primitives::Sibling; use polkadot_runtime_common::impls::ToAuthor; use sp_runtime::traits::Zero; @@ -46,11 +45,11 @@ use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, - ConvertedConcreteId, CurrencyAdapter, EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, - IsConcrete, LocalMint, NativeAsset, ParentIsPreset, RelayChainAsNative, - SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, - WithComputedOrigin, + ConvertedConcreteId, CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, + EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::JustTry, XcmExecutor}; @@ -150,29 +149,31 @@ match_types! { }; } -pub type Barrier = DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then allow it. - AllowTopLevelPaidExecutionFrom, - // Common Good Assets parachain, parent and its exec plurality get free execution - AllowExplicitUnpaidExecutionFrom<( - CommonGoodAssetsParachain, - ParentOrParentsExecutivePlurality, - )>, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + // Allow XCMs with some computed origins to pass through. + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Common Good Assets parachain, parent and its exec plurality get free execution + AllowExplicitUnpaidExecutionFrom<( + CommonGoodAssetsParachain, + ParentOrParentsExecutivePlurality, + )>, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, >; /// Type alias to conveniently refer to `frame_system`'s `Config::AccountId`. @@ -299,12 +300,12 @@ pub type LocalOriginToLocation = SignedToAccountId32, // ..and XCMP to communicate with the sibling chains. XcmpQueue, -); +)>; #[cfg(feature = "runtime-benchmarks")] parameter_types! { diff --git a/primitives/utility/src/lib.rs b/primitives/utility/src/lib.rs index 81a83fd070b..f2488b83a51 100644 --- a/primitives/utility/src/lib.rs +++ b/primitives/utility/src/lib.rs @@ -288,7 +288,7 @@ impl< &(X1(AccountId32 { network: None, id: receiver.into() }).into()), // We aren't able to track the XCM that initiated the fee deposit, so we create a // fake message hash here - &XcmContext::with_message_hash([0; 32]), + &XcmContext::with_message_id([0; 32]), ) .is_ok(); From 08aa94d191c4f3bdc83ef7921c412be353b2cece Mon Sep 17 00:00:00 2001 From: Marcin S Date: Thu, 25 May 2023 17:07:56 -0400 Subject: [PATCH 237/339] Companion for Polkadot 7253 (#2621) * Companion for Polkadot #7253 Polkadot PR: https://github.com/paritytech/polkadot/pull/7253 * Update Cargo.lock * Update Cargo.lock * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 578 ++++++++++-------- .../Cargo.toml | 2 +- .../relay-validation-worker-provider/build.rs | 2 +- .../src/lib.rs | 2 +- 4 files changed, 314 insertions(+), 270 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 54734f0b56a..69517657258 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -577,7 +577,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "hash-db", "log", @@ -2806,7 +2806,7 @@ dependencies = [ name = "cumulus-test-relay-validation-worker-provider" version = "0.1.0" dependencies = [ - "polkadot-node-core-pvf-worker", + "polkadot-node-core-pvf", "toml 0.7.4", ] @@ -3784,7 +3784,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", ] @@ -3807,7 +3807,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-support-procedural", @@ -3832,7 +3832,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3879,7 +3879,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3890,7 +3890,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3907,7 +3907,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-system", @@ -3936,7 +3936,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-recursion", "futures", @@ -3957,7 +3957,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "bitflags", "environmental", @@ -3991,7 +3991,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "Inflector", "cfg-expr", @@ -4007,7 +4007,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4019,7 +4019,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "proc-macro2", "quote", @@ -4029,7 +4029,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "cfg-if", "frame-support", @@ -4048,7 +4048,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4063,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "sp-api", @@ -4072,7 +4072,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "parity-scale-codec", @@ -5159,7 +5159,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bitvec", "frame-benchmarking", @@ -5258,7 +5258,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "frame-support", "polkadot-primitives", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "futures", "log", @@ -6168,7 +6168,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "anyhow", "jsonrpsee", @@ -6672,7 +6672,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6693,7 +6693,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6711,7 +6711,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6726,7 +6726,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-system", @@ -6742,7 +6742,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-system", @@ -6758,7 +6758,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-system", @@ -6772,7 +6772,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6816,7 +6816,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-system", @@ -6850,7 +6850,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6874,7 +6874,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6980,7 +6980,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7024,7 +7024,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7041,7 +7041,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "bitflags", "environmental", @@ -7071,7 +7071,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "bitflags", "parity-scale-codec", @@ -7084,7 +7084,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "proc-macro2", "quote", @@ -7094,7 +7094,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7111,7 +7111,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7129,7 +7129,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7152,7 +7152,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7165,7 +7165,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7183,7 +7183,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7201,7 +7201,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "blake2", "frame-benchmarking", @@ -7219,7 +7219,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7242,7 +7242,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7258,7 +7258,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7278,7 +7278,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7295,7 +7295,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-system", @@ -7309,7 +7309,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7326,7 +7326,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7345,7 +7345,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7362,7 +7362,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7378,7 +7378,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7395,7 +7395,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7413,7 +7413,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "pallet-nfts", @@ -7424,7 +7424,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7440,7 +7440,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-system", @@ -7457,7 +7457,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7477,7 +7477,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7488,7 +7488,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-system", @@ -7505,7 +7505,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7544,7 +7544,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7561,7 +7561,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7576,7 +7576,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7594,7 +7594,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7609,7 +7609,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7628,7 +7628,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7645,7 +7645,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-system", @@ -7666,7 +7666,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7682,7 +7682,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-system", @@ -7696,7 +7696,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7719,7 +7719,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7730,7 +7730,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "log", "sp-arithmetic", @@ -7739,7 +7739,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7748,7 +7748,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7765,7 +7765,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7780,7 +7780,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7798,7 +7798,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7817,7 +7817,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-support", "frame-system", @@ -7833,7 +7833,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7849,7 +7849,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7861,7 +7861,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7878,7 +7878,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7893,7 +7893,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7909,7 +7909,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7924,7 +7924,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7939,7 +7939,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7960,7 +7960,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8577,7 +8577,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8593,7 +8593,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8607,7 +8607,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "derive_more", "fatality", @@ -8630,7 +8630,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "fatality", "futures", @@ -8651,14 +8651,15 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "clap", "frame-benchmarking-cli", "futures", "log", "polkadot-client", - "polkadot-node-core-pvf-worker", + "polkadot-node-core-pvf-execute-worker", + "polkadot-node-core-pvf-prepare-worker", "polkadot-node-metrics", "polkadot-performance-test", "polkadot-service", @@ -8680,7 +8681,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "async-trait", "frame-benchmarking", @@ -8723,7 +8724,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "always-assert", "bitvec", @@ -8745,7 +8746,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -8757,7 +8758,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "derive_more", "fatality", @@ -8782,7 +8783,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8796,7 +8797,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "futures", "futures-timer", @@ -8816,7 +8817,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "always-assert", "async-trait", @@ -8839,7 +8840,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "futures", "parity-scale-codec", @@ -8857,7 +8858,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bitvec", "derive_more", @@ -8886,7 +8887,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bitvec", "futures", @@ -8907,7 +8908,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bitvec", "fatality", @@ -8926,7 +8927,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8941,7 +8942,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "async-trait", "futures", @@ -8961,7 +8962,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "futures", "polkadot-node-metrics", @@ -8976,7 +8977,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "futures", "futures-timer", @@ -8993,7 +8994,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "fatality", "futures", @@ -9012,7 +9013,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "async-trait", "futures", @@ -9029,7 +9030,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bitvec", "fatality", @@ -9047,7 +9048,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "always-assert", "futures", @@ -9056,6 +9057,9 @@ dependencies = [ "parity-scale-codec", "pin-project", "polkadot-core-primitives", + "polkadot-node-core-pvf-common", + "polkadot-node-core-pvf-execute-worker", + "polkadot-node-core-pvf-prepare-worker", "polkadot-node-metrics", "polkadot-node-primitives", "polkadot-parachain", @@ -9067,6 +9071,7 @@ dependencies = [ "sp-tracing", "sp-wasm-interface", "substrate-build-script-utils", + "tempfile", "tokio", "tracing-gum", ] @@ -9074,7 +9079,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "futures", "polkadot-node-primitives", @@ -9088,16 +9093,34 @@ dependencies = [ ] [[package]] -name = "polkadot-node-core-pvf-worker" +name = "polkadot-node-core-pvf-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ - "assert_matches", "cpu-time", "futures", "libc", "parity-scale-codec", - "polkadot-node-core-pvf", + "polkadot-parachain", + "polkadot-primitives", + "sc-executor-common", + "sc-executor-wasmtime", + "sp-core", + "sp-tracing", + "substrate-build-script-utils", + "tokio", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-pvf-execute-worker" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +dependencies = [ + "cpu-time", + "futures", + "parity-scale-codec", + "polkadot-node-core-pvf-common", "polkadot-parachain", "polkadot-primitives", "rayon", @@ -9109,8 +9132,29 @@ dependencies = [ "sp-io", "sp-maybe-compressed-blob", "sp-tracing", - "substrate-build-script-utils", - "tempfile", + "tikv-jemalloc-ctl", + "tokio", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-core-pvf-prepare-worker" +version = "0.9.41" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +dependencies = [ + "futures", + "libc", + "parity-scale-codec", + "polkadot-node-core-pvf-common", + "polkadot-parachain", + "polkadot-primitives", + "rayon", + "sc-executor", + "sc-executor-common", + "sc-executor-wasmtime", + "sp-io", + "sp-maybe-compressed-blob", + "sp-tracing", "tikv-jemalloc-ctl", "tokio", "tracing-gum", @@ -9119,7 +9163,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "futures", "lru 0.9.0", @@ -9134,7 +9178,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "lazy_static", "log", @@ -9152,7 +9196,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bs58", "futures", @@ -9171,7 +9215,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "async-channel", "async-trait", @@ -9194,7 +9238,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bounded-vec", "futures", @@ -9216,7 +9260,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9226,7 +9270,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "async-trait", "futures", @@ -9244,7 +9288,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "async-trait", "derive_more", @@ -9267,7 +9311,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "async-trait", "derive_more", @@ -9300,7 +9344,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "async-trait", "futures", @@ -9323,7 +9367,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bounded-collections", "derive_more", @@ -9422,13 +9466,13 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "env_logger 0.9.0", "kusama-runtime", "log", "polkadot-erasure-coding", - "polkadot-node-core-pvf-worker", + "polkadot-node-core-pvf-prepare-worker", "polkadot-node-primitives", "polkadot-primitives", "quote", @@ -9440,7 +9484,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9466,7 +9510,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9498,7 +9542,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bitvec", "frame-benchmarking", @@ -9593,7 +9637,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bitvec", "frame-benchmarking", @@ -9639,7 +9683,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "frame-support", "polkadot-primitives", @@ -9653,7 +9697,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bs58", "parity-scale-codec", @@ -9665,7 +9709,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bitflags", "bitvec", @@ -9710,7 +9754,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9820,7 +9864,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9841,7 +9885,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9851,7 +9895,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9876,7 +9920,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9937,7 +9981,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "frame-benchmarking", "frame-system", @@ -10717,7 +10761,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10804,7 +10848,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "frame-support", "polkadot-primitives", @@ -11051,7 +11095,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "log", "sp-core", @@ -11062,7 +11106,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "futures", @@ -11091,7 +11135,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "futures", "futures-timer", @@ -11114,7 +11158,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11129,7 +11173,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11148,7 +11192,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11159,7 +11203,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11199,7 +11243,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "fnv", "futures", @@ -11226,7 +11270,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "hash-db", "kvdb", @@ -11252,7 +11296,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "futures", @@ -11277,7 +11321,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "futures", @@ -11306,7 +11350,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "fork-tree", @@ -11342,7 +11386,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "futures", "jsonrpsee", @@ -11364,7 +11408,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11400,7 +11444,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "futures", "jsonrpsee", @@ -11419,7 +11463,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11432,7 +11476,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11472,7 +11516,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "finality-grandpa", "futures", @@ -11492,7 +11536,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "futures", @@ -11515,7 +11559,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11537,7 +11581,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11549,7 +11593,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "anyhow", "cfg-if", @@ -11567,7 +11611,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "ansi_term", "futures", @@ -11583,7 +11627,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11597,7 +11641,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11642,7 +11686,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-channel", "cid", @@ -11663,7 +11707,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11691,7 +11735,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "ahash 0.8.2", "futures", @@ -11710,7 +11754,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11733,7 +11777,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11768,7 +11812,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11787,7 +11831,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11818,7 +11862,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "futures", "libp2p-identity", @@ -11834,7 +11878,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11843,7 +11887,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "futures", "jsonrpsee", @@ -11874,7 +11918,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11893,7 +11937,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "http", "jsonrpsee", @@ -11908,7 +11952,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11934,7 +11978,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "directories", @@ -12000,7 +12044,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "log", "parity-scale-codec", @@ -12011,7 +12055,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "clap", "fs4", @@ -12027,7 +12071,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12046,7 +12090,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "futures", "libc", @@ -12065,7 +12109,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "chrono", "futures", @@ -12084,7 +12128,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "ansi_term", "atty", @@ -12115,7 +12159,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12126,7 +12170,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "futures", @@ -12153,7 +12197,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "futures", @@ -12167,7 +12211,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-channel", "futures", @@ -12648,7 +12692,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "enumn", "parity-scale-codec", @@ -12725,7 +12769,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "hash-db", "log", @@ -12745,7 +12789,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "Inflector", "blake2", @@ -12759,7 +12803,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12772,7 +12816,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "integer-sqrt", "num-traits", @@ -12786,7 +12830,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12799,7 +12843,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "sp-api", @@ -12811,7 +12855,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "futures", "log", @@ -12829,7 +12873,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "futures", @@ -12844,7 +12888,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "parity-scale-codec", @@ -12862,7 +12906,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "parity-scale-codec", @@ -12883,7 +12927,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12902,7 +12946,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "finality-grandpa", "log", @@ -12920,7 +12964,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -12932,7 +12976,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -12976,7 +13020,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "blake2b_simd", "byteorder", @@ -12990,7 +13034,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "proc-macro2", "quote", @@ -13001,7 +13045,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13010,7 +13054,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "proc-macro2", "quote", @@ -13020,7 +13064,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "environmental", "parity-scale-codec", @@ -13031,7 +13075,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13046,7 +13090,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "bytes", "ed25519", @@ -13072,7 +13116,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "lazy_static", "sp-core", @@ -13083,7 +13127,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "futures", "parity-scale-codec", @@ -13097,7 +13141,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13106,7 +13150,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13117,7 +13161,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13135,7 +13179,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -13149,7 +13193,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "sp-api", "sp-core", @@ -13159,7 +13203,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "backtrace", "lazy_static", @@ -13169,7 +13213,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "rustc-hash", "serde", @@ -13179,7 +13223,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "either", "hash256-std-hasher", @@ -13201,7 +13245,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13219,7 +13263,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "Inflector", "proc-macro-crate", @@ -13231,7 +13275,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -13245,7 +13289,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -13258,7 +13302,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "hash-db", "log", @@ -13278,7 +13322,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "log", "parity-scale-codec", @@ -13296,12 +13340,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13314,7 +13358,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "futures-timer", @@ -13329,7 +13373,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "sp-std", @@ -13341,7 +13385,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "sp-api", "sp-runtime", @@ -13350,7 +13394,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "log", @@ -13366,7 +13410,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13389,7 +13433,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13406,7 +13450,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13417,7 +13461,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13431,7 +13475,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "parity-scale-codec", "scale-info", @@ -13820,7 +13864,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "platforms 2.0.0", ] @@ -13828,7 +13872,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13847,7 +13891,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "hyper", "log", @@ -13859,7 +13903,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "jsonrpsee", @@ -13872,7 +13916,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "jsonrpsee", "log", @@ -13891,7 +13935,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13917,7 +13961,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13927,7 +13971,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13938,7 +13982,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "ansi_term", "build-helper", @@ -14065,7 +14109,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "frame-support", "polkadot-primitives", @@ -14456,7 +14500,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14467,7 +14511,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14597,7 +14641,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#0cf64f8bd72d719818be2f109c0919c7c9325cd1" +source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" dependencies = [ "async-trait", "clap", @@ -15545,7 +15589,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bitvec", "frame-benchmarking", @@ -15638,7 +15682,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "frame-support", "polkadot-primitives", @@ -16141,7 +16185,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "bounded-collections", "derivative", @@ -16157,7 +16201,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "frame-support", "frame-system", @@ -16212,7 +16256,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "environmental", "frame-benchmarking", @@ -16232,7 +16276,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#df3e3c7ca7a61044a5c543aa87c070688f1c11f3" +source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" dependencies = [ "Inflector", "proc-macro2", diff --git a/test/relay-validation-worker-provider/Cargo.toml b/test/relay-validation-worker-provider/Cargo.toml index 6728541ffc9..ea4587b2c7c 100644 --- a/test/relay-validation-worker-provider/Cargo.toml +++ b/test/relay-validation-worker-provider/Cargo.toml @@ -8,7 +8,7 @@ build = "build.rs" [dependencies] # Polkadot -polkadot-node-core-pvf-worker = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-node-core-pvf = { git = "https://github.com/paritytech/polkadot", branch = "master" } [build-dependencies] toml = "0.7.4" diff --git a/test/relay-validation-worker-provider/build.rs b/test/relay-validation-worker-provider/build.rs index d2c894ac89d..9b5247bcbe5 100644 --- a/test/relay-validation-worker-provider/build.rs +++ b/test/relay-validation-worker-provider/build.rs @@ -97,7 +97,7 @@ fn create_project(out_dir: &Path) -> PathBuf { fs::write( project_dir.join("src").join("main.rs"), r#" - cumulus_test_relay_validation_worker_provider::polkadot_node_core_pvf_worker::decl_puppet_worker_main!(); + cumulus_test_relay_validation_worker_provider::polkadot_node_core_pvf::decl_puppet_worker_main!(); "#, ) .expect("Writes `main.rs`"); diff --git a/test/relay-validation-worker-provider/src/lib.rs b/test/relay-validation-worker-provider/src/lib.rs index ccb896a276e..840214eb3c0 100644 --- a/test/relay-validation-worker-provider/src/lib.rs +++ b/test/relay-validation-worker-provider/src/lib.rs @@ -21,7 +21,7 @@ //! //! !!This should only be used for tests!! -pub use polkadot_node_core_pvf_worker; +pub use polkadot_node_core_pvf; /// The path to the validation worker. pub const VALIDATION_WORKER: &str = concat!(env!("OUT_DIR"), "/validation-worker"); From 41cc2a752c9cc81b2852002225d2043cdb1a2fa5 Mon Sep 17 00:00:00 2001 From: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Date: Fri, 26 May 2023 01:03:13 +0200 Subject: [PATCH 238/339] pallets: implement `Default` for `GenesisConfig` in `no_std` (#2624) * pallets: implement Default for GenesisConfig in no_std This change is follow-up of: https://github.com/paritytech/substrate/pull/14108 It is a step towards: https://github.com/paritytech/substrate/issues/13334 * ".git/.scripts/commands/fmt/fmt.sh" * update lockfile for {"substrate", "polkadot"} --------- Co-authored-by: command-bot <> --- Cargo.lock | 522 +++++++++---------- bridges/modules/grandpa/src/lib.rs | 10 +- bridges/modules/messages/src/lib.rs | 14 +- bridges/modules/parachains/src/lib.rs | 14 +- pallets/collator-selection/src/lib.rs | 20 +- parachains/pallets/parachain-info/src/lib.rs | 1 - 6 files changed, 273 insertions(+), 308 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 69517657258..f39622237fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -577,7 +577,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "hash-db", "log", @@ -3784,7 +3784,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", ] @@ -3807,7 +3807,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-support-procedural", @@ -3832,7 +3832,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3879,7 +3879,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3890,7 +3890,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3907,7 +3907,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-system", @@ -3936,7 +3936,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-recursion", "futures", @@ -3957,7 +3957,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "bitflags", "environmental", @@ -3991,7 +3991,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "Inflector", "cfg-expr", @@ -4007,7 +4007,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4019,7 +4019,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "proc-macro2", "quote", @@ -4029,7 +4029,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "cfg-if", "frame-support", @@ -4048,7 +4048,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4063,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "sp-api", @@ -4072,7 +4072,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "parity-scale-codec", @@ -5159,7 +5159,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bitvec", "frame-benchmarking", @@ -5258,7 +5258,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "frame-support", "polkadot-primitives", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "futures", "log", @@ -6168,7 +6168,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "anyhow", "jsonrpsee", @@ -6672,7 +6672,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6693,7 +6693,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6711,7 +6711,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6726,7 +6726,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-system", @@ -6742,7 +6742,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-system", @@ -6758,7 +6758,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-system", @@ -6772,7 +6772,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6816,7 +6816,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-system", @@ -6850,7 +6850,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6874,7 +6874,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6980,7 +6980,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7024,7 +7024,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7041,7 +7041,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "bitflags", "environmental", @@ -7071,7 +7071,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "bitflags", "parity-scale-codec", @@ -7084,7 +7084,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "proc-macro2", "quote", @@ -7094,7 +7094,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7111,7 +7111,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7129,7 +7129,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7152,7 +7152,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7165,7 +7165,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7183,7 +7183,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7201,7 +7201,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "blake2", "frame-benchmarking", @@ -7219,7 +7219,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7242,7 +7242,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7258,7 +7258,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7278,7 +7278,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7295,7 +7295,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-system", @@ -7309,7 +7309,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7326,7 +7326,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7345,7 +7345,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7362,7 +7362,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7378,7 +7378,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7395,7 +7395,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7413,7 +7413,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "pallet-nfts", @@ -7424,7 +7424,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7440,7 +7440,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-system", @@ -7457,7 +7457,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7477,7 +7477,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7488,7 +7488,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-system", @@ -7505,7 +7505,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7544,7 +7544,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7561,7 +7561,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7576,7 +7576,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7594,7 +7594,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7609,7 +7609,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7628,7 +7628,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7645,7 +7645,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-system", @@ -7666,7 +7666,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7682,7 +7682,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-system", @@ -7696,7 +7696,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7719,7 +7719,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7730,7 +7730,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "log", "sp-arithmetic", @@ -7739,7 +7739,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "sp-api", @@ -7748,7 +7748,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7765,7 +7765,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7780,7 +7780,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7798,7 +7798,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7817,7 +7817,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-support", "frame-system", @@ -7833,7 +7833,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7849,7 +7849,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7861,7 +7861,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7878,7 +7878,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7893,7 +7893,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7909,7 +7909,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7924,7 +7924,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7939,7 +7939,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7960,7 +7960,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "frame-benchmarking", "frame-support", @@ -8577,7 +8577,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8593,7 +8593,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8607,7 +8607,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "derive_more", "fatality", @@ -8630,7 +8630,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "fatality", "futures", @@ -8651,7 +8651,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "clap", "frame-benchmarking-cli", @@ -8681,7 +8681,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "async-trait", "frame-benchmarking", @@ -8724,7 +8724,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "always-assert", "bitvec", @@ -8746,7 +8746,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "parity-scale-codec", "scale-info", @@ -8758,7 +8758,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "derive_more", "fatality", @@ -8783,7 +8783,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8797,7 +8797,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "futures", "futures-timer", @@ -8817,7 +8817,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "always-assert", "async-trait", @@ -8840,7 +8840,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "futures", "parity-scale-codec", @@ -8858,7 +8858,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bitvec", "derive_more", @@ -8887,7 +8887,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bitvec", "futures", @@ -8908,7 +8908,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bitvec", "fatality", @@ -8927,7 +8927,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8942,7 +8942,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "async-trait", "futures", @@ -8962,7 +8962,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "futures", "polkadot-node-metrics", @@ -8977,7 +8977,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "futures", "futures-timer", @@ -8994,7 +8994,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "fatality", "futures", @@ -9013,7 +9013,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "async-trait", "futures", @@ -9030,7 +9030,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bitvec", "fatality", @@ -9048,7 +9048,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "always-assert", "futures", @@ -9079,7 +9079,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "futures", "polkadot-node-primitives", @@ -9095,7 +9095,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "cpu-time", "futures", @@ -9115,7 +9115,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-execute-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "cpu-time", "futures", @@ -9140,7 +9140,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-prepare-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "futures", "libc", @@ -9163,7 +9163,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "futures", "lru 0.9.0", @@ -9178,7 +9178,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "lazy_static", "log", @@ -9196,7 +9196,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bs58", "futures", @@ -9215,7 +9215,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "async-channel", "async-trait", @@ -9238,7 +9238,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bounded-vec", "futures", @@ -9260,7 +9260,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9270,7 +9270,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "async-trait", "futures", @@ -9288,7 +9288,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "async-trait", "derive_more", @@ -9311,7 +9311,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "async-trait", "derive_more", @@ -9344,7 +9344,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "async-trait", "futures", @@ -9367,7 +9367,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bounded-collections", "derive_more", @@ -9466,7 +9466,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9484,7 +9484,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9510,7 +9510,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9542,7 +9542,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bitvec", "frame-benchmarking", @@ -9637,7 +9637,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bitvec", "frame-benchmarking", @@ -9683,7 +9683,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "frame-support", "polkadot-primitives", @@ -9697,7 +9697,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bs58", "parity-scale-codec", @@ -9709,7 +9709,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bitflags", "bitvec", @@ -9754,7 +9754,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9864,7 +9864,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9885,7 +9885,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9895,7 +9895,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9920,7 +9920,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9981,7 +9981,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "frame-benchmarking", "frame-system", @@ -10761,7 +10761,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10848,7 +10848,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "frame-support", "polkadot-primitives", @@ -11095,7 +11095,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "log", "sp-core", @@ -11106,7 +11106,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "futures", @@ -11135,7 +11135,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "futures", "futures-timer", @@ -11158,7 +11158,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11173,7 +11173,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11192,7 +11192,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11203,7 +11203,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11243,7 +11243,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "fnv", "futures", @@ -11270,7 +11270,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "hash-db", "kvdb", @@ -11296,7 +11296,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "futures", @@ -11321,7 +11321,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "futures", @@ -11350,7 +11350,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "fork-tree", @@ -11386,7 +11386,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "futures", "jsonrpsee", @@ -11408,7 +11408,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11444,7 +11444,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "futures", "jsonrpsee", @@ -11463,7 +11463,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11476,7 +11476,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11516,7 +11516,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "finality-grandpa", "futures", @@ -11536,7 +11536,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "futures", @@ -11559,7 +11559,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11581,7 +11581,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11593,7 +11593,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "anyhow", "cfg-if", @@ -11611,7 +11611,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "ansi_term", "futures", @@ -11627,7 +11627,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11641,7 +11641,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11686,7 +11686,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-channel", "cid", @@ -11707,7 +11707,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11735,7 +11735,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "ahash 0.8.2", "futures", @@ -11754,7 +11754,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11777,7 +11777,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11812,7 +11812,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11831,7 +11831,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11862,7 +11862,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "futures", "libp2p-identity", @@ -11878,7 +11878,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11887,7 +11887,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "futures", "jsonrpsee", @@ -11918,7 +11918,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11937,7 +11937,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "http", "jsonrpsee", @@ -11952,7 +11952,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11978,7 +11978,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "directories", @@ -12044,7 +12044,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "log", "parity-scale-codec", @@ -12055,7 +12055,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "clap", "fs4", @@ -12071,7 +12071,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12090,7 +12090,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "futures", "libc", @@ -12109,7 +12109,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "chrono", "futures", @@ -12128,7 +12128,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "ansi_term", "atty", @@ -12159,7 +12159,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12170,7 +12170,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "futures", @@ -12197,7 +12197,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "futures", @@ -12211,7 +12211,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-channel", "futures", @@ -12692,7 +12692,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "enumn", "parity-scale-codec", @@ -12769,7 +12769,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "hash-db", "log", @@ -12789,7 +12789,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "Inflector", "blake2", @@ -12803,7 +12803,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12816,7 +12816,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "integer-sqrt", "num-traits", @@ -12830,7 +12830,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12843,7 +12843,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "sp-api", @@ -12855,7 +12855,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "futures", "log", @@ -12873,7 +12873,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "futures", @@ -12888,7 +12888,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "parity-scale-codec", @@ -12906,7 +12906,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "parity-scale-codec", @@ -12927,7 +12927,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12946,7 +12946,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "finality-grandpa", "log", @@ -12964,7 +12964,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "scale-info", @@ -12976,7 +12976,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13020,7 +13020,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "blake2b_simd", "byteorder", @@ -13034,7 +13034,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "proc-macro2", "quote", @@ -13045,7 +13045,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13054,7 +13054,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "proc-macro2", "quote", @@ -13064,7 +13064,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "environmental", "parity-scale-codec", @@ -13075,7 +13075,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13090,7 +13090,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "bytes", "ed25519", @@ -13116,7 +13116,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "lazy_static", "sp-core", @@ -13127,7 +13127,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "futures", "parity-scale-codec", @@ -13141,7 +13141,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13150,7 +13150,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13161,7 +13161,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13179,7 +13179,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "scale-info", @@ -13193,7 +13193,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "sp-api", "sp-core", @@ -13203,7 +13203,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "backtrace", "lazy_static", @@ -13213,7 +13213,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "rustc-hash", "serde", @@ -13223,7 +13223,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "either", "hash256-std-hasher", @@ -13245,7 +13245,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13263,7 +13263,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "Inflector", "proc-macro-crate", @@ -13275,7 +13275,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "scale-info", @@ -13289,7 +13289,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "scale-info", @@ -13302,7 +13302,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "hash-db", "log", @@ -13322,7 +13322,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "log", "parity-scale-codec", @@ -13340,12 +13340,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13358,7 +13358,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "futures-timer", @@ -13373,7 +13373,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "sp-std", @@ -13385,7 +13385,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "sp-api", "sp-runtime", @@ -13394,7 +13394,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "log", @@ -13410,7 +13410,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13433,7 +13433,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13450,7 +13450,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13461,7 +13461,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13475,7 +13475,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "parity-scale-codec", "scale-info", @@ -13864,7 +13864,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "platforms 2.0.0", ] @@ -13872,7 +13872,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13891,7 +13891,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "hyper", "log", @@ -13903,7 +13903,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "jsonrpsee", @@ -13916,7 +13916,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "jsonrpsee", "log", @@ -13935,7 +13935,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13961,7 +13961,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13971,7 +13971,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13982,7 +13982,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "ansi_term", "build-helper", @@ -14109,7 +14109,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "frame-support", "polkadot-primitives", @@ -14500,7 +14500,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14511,7 +14511,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14641,7 +14641,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#51d06cd05938d8f583f174fe9326a9ea6986ca8c" +source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" dependencies = [ "async-trait", "clap", @@ -15589,7 +15589,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bitvec", "frame-benchmarking", @@ -15682,7 +15682,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "frame-support", "polkadot-primitives", @@ -16185,7 +16185,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "bounded-collections", "derivative", @@ -16201,7 +16201,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "frame-support", "frame-system", @@ -16256,7 +16256,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "environmental", "frame-benchmarking", @@ -16276,7 +16276,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#e82feb7501948a6f4fe67a283521a7e3bc5b46a5" +source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" dependencies = [ "Inflector", "proc-macro2", diff --git a/bridges/modules/grandpa/src/lib.rs b/bridges/modules/grandpa/src/lib.rs index 50286512db8..10b60878302 100644 --- a/bridges/modules/grandpa/src/lib.rs +++ b/bridges/modules/grandpa/src/lib.rs @@ -44,7 +44,7 @@ use bp_header_chain::{ }; use bp_runtime::{BlockNumberOf, HashOf, HasherOf, HeaderId, HeaderOf, OwnedBridgeModule}; use finality_grandpa::voter_set::VoterSet; -use frame_support::{dispatch::PostDispatchInfo, ensure}; +use frame_support::{dispatch::PostDispatchInfo, ensure, DefaultNoBound}; use sp_consensus_grandpa::{ConsensusLog, GRANDPA_ENGINE_ID}; use sp_runtime::{ traits::{Header as HeaderT, Zero}, @@ -370,6 +370,7 @@ pub mod pallet { StorageValue<_, BasicOperatingMode, ValueQuery>; #[pallet::genesis_config] + #[derive(DefaultNoBound)] pub struct GenesisConfig, I: 'static = ()> { /// Optional module owner account. pub owner: Option, @@ -377,13 +378,6 @@ pub mod pallet { pub init_data: Option>>, } - #[cfg(feature = "std")] - impl, I: 'static> Default for GenesisConfig { - fn default() -> Self { - Self { owner: None, init_data: None } - } - } - #[pallet::genesis_build] impl, I: 'static> GenesisBuild for GenesisConfig { fn build(&self) { diff --git a/bridges/modules/messages/src/lib.rs b/bridges/modules/messages/src/lib.rs index f04e86f3a8e..51e6857d777 100644 --- a/bridges/modules/messages/src/lib.rs +++ b/bridges/modules/messages/src/lib.rs @@ -65,7 +65,7 @@ use bp_messages::{ }; use bp_runtime::{BasicOperatingMode, ChainId, OwnedBridgeModule, PreComputedSize, Size}; use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{dispatch::PostDispatchInfo, ensure, fail, traits::Get}; +use frame_support::{dispatch::PostDispatchInfo, ensure, fail, traits::Get, DefaultNoBound}; use sp_runtime::traits::UniqueSaturatedFrom; use sp_std::{marker::PhantomData, prelude::*}; @@ -586,6 +586,7 @@ pub mod pallet { StorageMap<_, Blake2_128Concat, MessageKey, StoredMessagePayload>; #[pallet::genesis_config] + #[derive(DefaultNoBound)] pub struct GenesisConfig, I: 'static = ()> { /// Initial pallet operating mode. pub operating_mode: MessagesOperatingMode, @@ -595,17 +596,6 @@ pub mod pallet { pub phantom: sp_std::marker::PhantomData, } - #[cfg(feature = "std")] - impl, I: 'static> Default for GenesisConfig { - fn default() -> Self { - Self { - operating_mode: Default::default(), - owner: Default::default(), - phantom: Default::default(), - } - } - } - #[pallet::genesis_build] impl, I: 'static> GenesisBuild for GenesisConfig { fn build(&self) { diff --git a/bridges/modules/parachains/src/lib.rs b/bridges/modules/parachains/src/lib.rs index c2052e3d4eb..b17b52163d8 100644 --- a/bridges/modules/parachains/src/lib.rs +++ b/bridges/modules/parachains/src/lib.rs @@ -30,7 +30,7 @@ use bp_header_chain::{HeaderChain, HeaderChainError}; use bp_parachains::{parachain_head_storage_key_at_source, ParaInfo, ParaStoredHeaderData}; use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; use bp_runtime::{Chain, HashOf, HeaderId, HeaderIdOf, Parachain, StorageProofError}; -use frame_support::dispatch::PostDispatchInfo; +use frame_support::{dispatch::PostDispatchInfo, DefaultNoBound}; use sp_std::{marker::PhantomData, vec::Vec}; #[cfg(feature = "runtime-benchmarks")] @@ -611,6 +611,7 @@ pub mod pallet { } #[pallet::genesis_config] + #[derive(DefaultNoBound)] pub struct GenesisConfig, I: 'static = ()> { /// Initial pallet operating mode. pub operating_mode: BasicOperatingMode, @@ -620,17 +621,6 @@ pub mod pallet { pub phantom: sp_std::marker::PhantomData, } - #[cfg(feature = "std")] - impl, I: 'static> Default for GenesisConfig { - fn default() -> Self { - Self { - operating_mode: Default::default(), - owner: Default::default(), - phantom: Default::default(), - } - } - } - #[pallet::genesis_build] impl, I: 'static> GenesisBuild for GenesisConfig { fn build(&self) { diff --git a/pallets/collator-selection/src/lib.rs b/pallets/collator-selection/src/lib.rs index a727e21f0fd..5983ac5cc3a 100644 --- a/pallets/collator-selection/src/lib.rs +++ b/pallets/collator-selection/src/lib.rs @@ -88,7 +88,7 @@ pub mod pallet { Currency, EnsureOrigin, ExistenceRequirement::KeepAlive, ReservableCurrency, ValidatorRegistration, }, - BoundedVec, PalletId, + BoundedVec, DefaultNoBound, PalletId, }; use frame_system::{pallet_prelude::*, Config as SystemConfig}; use pallet_session::SessionManager; @@ -203,28 +203,20 @@ pub mod pallet { pub type CandidacyBond = StorageValue<_, BalanceOf, ValueQuery>; #[pallet::genesis_config] + #[derive(DefaultNoBound)] pub struct GenesisConfig { pub invulnerables: Vec, pub candidacy_bond: BalanceOf, pub desired_candidates: u32, } - #[cfg(feature = "std")] - impl Default for GenesisConfig { - fn default() -> Self { - Self { - invulnerables: Default::default(), - candidacy_bond: Default::default(), - desired_candidates: Default::default(), - } - } - } - #[pallet::genesis_build] impl GenesisBuild for GenesisConfig { fn build(&self) { - let duplicate_invulnerables = - self.invulnerables.iter().collect::>(); + let duplicate_invulnerables = self + .invulnerables + .iter() + .collect::>(); assert!( duplicate_invulnerables.len() == self.invulnerables.len(), "duplicate invulnerables in genesis." diff --git a/parachains/pallets/parachain-info/src/lib.rs b/parachains/pallets/parachain-info/src/lib.rs index 93ef5bfcfeb..1910d6cf241 100644 --- a/parachains/pallets/parachain-info/src/lib.rs +++ b/parachains/pallets/parachain-info/src/lib.rs @@ -43,7 +43,6 @@ pub mod pallet { pub parachain_id: ParaId, } - #[cfg(feature = "std")] impl Default for GenesisConfig { fn default() -> Self { Self { parachain_id: 100.into() } From c608131f0c6b15eeeb2ff0c1ce77b5d7d6c6e623 Mon Sep 17 00:00:00 2001 From: ordian Date: Fri, 26 May 2023 12:13:54 +0200 Subject: [PATCH 239/339] polkompanion 6667: past session slashing (#2160) * polkompanion 6667: past session slashing * fix imports * fix incorrect merge * implement staging methods on RPC client * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 532 +++++++++--------- .../src/blockchain_rpc_client.rs | 37 +- .../src/rpc_client.rs | 55 +- 3 files changed, 350 insertions(+), 274 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f39622237fc..822c76a9e4e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -577,7 +577,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "hash-db", "log", @@ -2940,7 +2940,7 @@ dependencies = [ "cfg-if", "fiat-crypto", "packed_simd_2", - "platforms 3.0.2", + "platforms", "subtle", "zeroize", ] @@ -3784,7 +3784,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", ] @@ -3807,7 +3807,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-support-procedural", @@ -3832,7 +3832,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3879,7 +3879,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3890,7 +3890,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3907,7 +3907,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-system", @@ -3936,7 +3936,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-recursion", "futures", @@ -3957,7 +3957,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "bitflags", "environmental", @@ -3991,7 +3991,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "Inflector", "cfg-expr", @@ -4007,7 +4007,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4019,7 +4019,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "proc-macro2", "quote", @@ -4029,7 +4029,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "cfg-if", "frame-support", @@ -4048,7 +4048,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4063,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "sp-api", @@ -4072,7 +4072,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "parity-scale-codec", @@ -5159,7 +5159,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bitvec", "frame-benchmarking", @@ -5258,7 +5258,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "frame-support", "polkadot-primitives", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "futures", "log", @@ -6168,7 +6168,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "anyhow", "jsonrpsee", @@ -6672,7 +6672,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6693,7 +6693,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -6711,7 +6711,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -6726,7 +6726,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-system", @@ -6742,7 +6742,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-system", @@ -6758,7 +6758,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-system", @@ -6772,7 +6772,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6816,7 +6816,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-system", @@ -6850,7 +6850,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6874,7 +6874,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -6980,7 +6980,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7024,7 +7024,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7041,7 +7041,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "bitflags", "environmental", @@ -7071,7 +7071,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "bitflags", "parity-scale-codec", @@ -7084,7 +7084,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "proc-macro2", "quote", @@ -7094,7 +7094,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7111,7 +7111,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7129,7 +7129,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7152,7 +7152,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7165,7 +7165,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7183,7 +7183,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7201,7 +7201,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "blake2", "frame-benchmarking", @@ -7219,7 +7219,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7242,7 +7242,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7258,7 +7258,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7278,7 +7278,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7295,7 +7295,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-system", @@ -7309,7 +7309,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7326,7 +7326,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7345,7 +7345,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7362,7 +7362,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7378,7 +7378,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7395,7 +7395,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7413,7 +7413,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "pallet-nfts", @@ -7424,7 +7424,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7440,7 +7440,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-system", @@ -7457,7 +7457,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7477,7 +7477,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7488,7 +7488,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-system", @@ -7505,7 +7505,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7544,7 +7544,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7561,7 +7561,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7576,7 +7576,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7594,7 +7594,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7609,7 +7609,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7628,7 +7628,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7645,7 +7645,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-system", @@ -7666,7 +7666,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7682,7 +7682,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-system", @@ -7696,7 +7696,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7719,7 +7719,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7730,7 +7730,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "log", "sp-arithmetic", @@ -7739,7 +7739,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "sp-api", @@ -7748,7 +7748,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7765,7 +7765,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7780,7 +7780,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7798,7 +7798,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7817,7 +7817,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-support", "frame-system", @@ -7833,7 +7833,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7849,7 +7849,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7861,7 +7861,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7878,7 +7878,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7893,7 +7893,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7909,7 +7909,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7924,7 +7924,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-benchmarking", "frame-support", @@ -7939,7 +7939,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7960,7 +7960,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "frame-benchmarking", "frame-support", @@ -8534,12 +8534,6 @@ version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" -[[package]] -name = "platforms" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" - [[package]] name = "platforms" version = "3.0.2" @@ -8577,7 +8571,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8593,7 +8587,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8607,7 +8601,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "derive_more", "fatality", @@ -8630,7 +8624,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "fatality", "futures", @@ -8651,7 +8645,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "clap", "frame-benchmarking-cli", @@ -8681,7 +8675,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "async-trait", "frame-benchmarking", @@ -8724,7 +8718,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "always-assert", "bitvec", @@ -8746,7 +8740,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "parity-scale-codec", "scale-info", @@ -8758,7 +8752,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "derive_more", "fatality", @@ -8783,7 +8777,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8797,7 +8791,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "futures", "futures-timer", @@ -8817,7 +8811,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "always-assert", "async-trait", @@ -8840,7 +8834,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "futures", "parity-scale-codec", @@ -8858,7 +8852,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bitvec", "derive_more", @@ -8887,7 +8881,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bitvec", "futures", @@ -8908,7 +8902,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bitvec", "fatality", @@ -8927,7 +8921,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8942,7 +8936,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "async-trait", "futures", @@ -8962,7 +8956,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "futures", "polkadot-node-metrics", @@ -8977,7 +8971,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "futures", "futures-timer", @@ -8994,7 +8988,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "fatality", "futures", @@ -9013,7 +9007,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "async-trait", "futures", @@ -9030,7 +9024,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bitvec", "fatality", @@ -9048,7 +9042,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "always-assert", "futures", @@ -9079,7 +9073,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "futures", "polkadot-node-primitives", @@ -9095,7 +9089,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "cpu-time", "futures", @@ -9115,7 +9109,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-execute-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "cpu-time", "futures", @@ -9140,7 +9134,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-prepare-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "futures", "libc", @@ -9163,7 +9157,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "futures", "lru 0.9.0", @@ -9178,7 +9172,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "lazy_static", "log", @@ -9196,7 +9190,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bs58", "futures", @@ -9215,7 +9209,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "async-channel", "async-trait", @@ -9238,7 +9232,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bounded-vec", "futures", @@ -9260,7 +9254,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9270,7 +9264,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "async-trait", "futures", @@ -9288,7 +9282,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "async-trait", "derive_more", @@ -9311,7 +9305,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "async-trait", "derive_more", @@ -9344,7 +9338,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "async-trait", "futures", @@ -9367,7 +9361,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bounded-collections", "derive_more", @@ -9466,7 +9460,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9484,7 +9478,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9510,7 +9504,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9542,7 +9536,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bitvec", "frame-benchmarking", @@ -9637,7 +9631,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bitvec", "frame-benchmarking", @@ -9683,7 +9677,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "frame-support", "polkadot-primitives", @@ -9697,7 +9691,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bs58", "parity-scale-codec", @@ -9709,7 +9703,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bitflags", "bitvec", @@ -9754,7 +9748,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9864,7 +9858,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9885,7 +9879,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9895,7 +9889,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9920,7 +9914,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9981,7 +9975,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "frame-benchmarking", "frame-system", @@ -10761,7 +10755,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10848,7 +10842,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "frame-support", "polkadot-primitives", @@ -11095,7 +11089,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "log", "sp-core", @@ -11106,7 +11100,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "futures", @@ -11135,7 +11129,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "futures", "futures-timer", @@ -11158,7 +11152,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11173,7 +11167,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11192,7 +11186,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11203,7 +11197,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11243,7 +11237,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "fnv", "futures", @@ -11270,7 +11264,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "hash-db", "kvdb", @@ -11296,7 +11290,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "futures", @@ -11321,7 +11315,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "futures", @@ -11350,7 +11344,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "fork-tree", @@ -11386,7 +11380,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "futures", "jsonrpsee", @@ -11408,7 +11402,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11444,7 +11438,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "futures", "jsonrpsee", @@ -11463,7 +11457,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11476,7 +11470,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11516,7 +11510,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "finality-grandpa", "futures", @@ -11536,7 +11530,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "futures", @@ -11559,7 +11553,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "lru 0.8.1", "parity-scale-codec", @@ -11581,7 +11575,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11593,7 +11587,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "anyhow", "cfg-if", @@ -11611,7 +11605,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "ansi_term", "futures", @@ -11627,7 +11621,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11641,7 +11635,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11686,7 +11680,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-channel", "cid", @@ -11707,7 +11701,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11735,7 +11729,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "ahash 0.8.2", "futures", @@ -11754,7 +11748,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11777,7 +11771,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11812,7 +11806,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11831,7 +11825,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11862,7 +11856,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "futures", "libp2p-identity", @@ -11878,7 +11872,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11887,7 +11881,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "futures", "jsonrpsee", @@ -11918,7 +11912,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11937,7 +11931,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "http", "jsonrpsee", @@ -11952,7 +11946,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11978,7 +11972,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "directories", @@ -12044,7 +12038,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "log", "parity-scale-codec", @@ -12055,7 +12049,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "clap", "fs4", @@ -12071,7 +12065,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12090,7 +12084,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "futures", "libc", @@ -12109,7 +12103,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "chrono", "futures", @@ -12128,7 +12122,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "ansi_term", "atty", @@ -12159,7 +12153,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12170,7 +12164,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "futures", @@ -12197,7 +12191,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "futures", @@ -12211,7 +12205,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-channel", "futures", @@ -12692,7 +12686,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "enumn", "parity-scale-codec", @@ -12769,7 +12763,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "hash-db", "log", @@ -12789,7 +12783,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "Inflector", "blake2", @@ -12803,7 +12797,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "scale-info", @@ -12816,7 +12810,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "integer-sqrt", "num-traits", @@ -12830,7 +12824,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "scale-info", @@ -12843,7 +12837,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "sp-api", @@ -12855,7 +12849,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "futures", "log", @@ -12873,7 +12867,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "futures", @@ -12888,7 +12882,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "parity-scale-codec", @@ -12906,7 +12900,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "parity-scale-codec", @@ -12927,7 +12921,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12946,7 +12940,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "finality-grandpa", "log", @@ -12964,7 +12958,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "scale-info", @@ -12976,7 +12970,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13020,7 +13014,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "blake2b_simd", "byteorder", @@ -13034,7 +13028,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "proc-macro2", "quote", @@ -13045,7 +13039,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13054,7 +13048,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "proc-macro2", "quote", @@ -13064,7 +13058,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "environmental", "parity-scale-codec", @@ -13075,7 +13069,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13090,7 +13084,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "bytes", "ed25519", @@ -13116,7 +13110,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "lazy_static", "sp-core", @@ -13127,7 +13121,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "futures", "parity-scale-codec", @@ -13141,7 +13135,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13150,7 +13144,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13161,7 +13155,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13179,7 +13173,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "scale-info", @@ -13193,7 +13187,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "sp-api", "sp-core", @@ -13203,7 +13197,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "backtrace", "lazy_static", @@ -13213,7 +13207,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "rustc-hash", "serde", @@ -13223,7 +13217,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "either", "hash256-std-hasher", @@ -13245,7 +13239,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13263,7 +13257,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "Inflector", "proc-macro-crate", @@ -13275,7 +13269,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "scale-info", @@ -13289,7 +13283,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "scale-info", @@ -13302,7 +13296,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "hash-db", "log", @@ -13322,7 +13316,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "log", "parity-scale-codec", @@ -13340,12 +13334,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13358,7 +13352,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "futures-timer", @@ -13373,7 +13367,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "sp-std", @@ -13385,7 +13379,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "sp-api", "sp-runtime", @@ -13394,7 +13388,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "log", @@ -13410,7 +13404,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13433,7 +13427,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13450,7 +13444,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13461,7 +13455,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13475,7 +13469,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "parity-scale-codec", "scale-info", @@ -13864,15 +13858,15 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ - "platforms 2.0.0", + "platforms", ] [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13891,7 +13885,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "hyper", "log", @@ -13903,7 +13897,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "jsonrpsee", @@ -13916,7 +13910,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "jsonrpsee", "log", @@ -13935,7 +13929,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13961,7 +13955,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13971,7 +13965,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13982,7 +13976,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "ansi_term", "build-helper", @@ -14109,7 +14103,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "frame-support", "polkadot-primitives", @@ -14500,7 +14494,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14511,7 +14505,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14641,7 +14635,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f4cb21c876d4ce19eb9ef09c39bebf83ba01d16d" +source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" dependencies = [ "async-trait", "clap", @@ -15589,7 +15583,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bitvec", "frame-benchmarking", @@ -15682,7 +15676,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "frame-support", "polkadot-primitives", @@ -16185,7 +16179,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "bounded-collections", "derivative", @@ -16201,7 +16195,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "frame-support", "frame-system", @@ -16256,7 +16250,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "environmental", "frame-benchmarking", @@ -16276,7 +16270,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b09937a3bd81e360870cbaa7b1f9482e3c0817ed" +source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" dependencies = [ "Inflector", "proc-macro2", diff --git a/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs b/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs index b8939df5fd5..10b48296bff 100644 --- a/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs +++ b/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs @@ -21,6 +21,7 @@ use cumulus_relay_chain_rpc_interface::RelayChainRpcClient; use futures::{Stream, StreamExt}; use polkadot_core_primitives::{Block, BlockNumber, Hash, Header}; use polkadot_overseer::RuntimeApiSubsystemClient; +use polkadot_primitives::vstaging; use sc_authority_discovery::{AuthorityDiscovery, Error as AuthorityDiscoveryError}; use sp_api::{ApiError, RuntimeApiInfo}; @@ -297,7 +298,41 @@ impl RuntimeApiSubsystemClient for BlockChainRpcClient { )>, ApiError, > { - Ok(self.rpc_client.parachain_host_staging_get_disputes(at).await?) + Ok(self.rpc_client.parachain_host_disputes(at).await?) + } + + async fn unapplied_slashes( + &self, + at: Hash, + ) -> Result< + Vec<( + polkadot_primitives::SessionIndex, + polkadot_primitives::CandidateHash, + vstaging::slashing::PendingSlashes, + )>, + ApiError, + > { + Ok(self.rpc_client.parachain_host_unapplied_slashes(at).await?) + } + + async fn key_ownership_proof( + &self, + at: Hash, + validator_id: polkadot_primitives::ValidatorId, + ) -> Result, ApiError> { + Ok(self.rpc_client.parachain_host_key_ownership_proof(at, validator_id).await?) + } + + async fn submit_report_dispute_lost( + &self, + at: Hash, + dispute_proof: vstaging::slashing::DisputeProof, + key_ownership_proof: vstaging::slashing::OpaqueKeyOwnershipProof, + ) -> Result, ApiError> { + Ok(self + .rpc_client + .parachain_host_submit_report_dispute_lost(at, dispute_proof, key_ownership_proof) + .await?) } } diff --git a/client/relay-chain-rpc-interface/src/rpc_client.rs b/client/relay-chain-rpc-interface/src/rpc_client.rs index 6bd2d33d3a2..70c64eeeffc 100644 --- a/client/relay-chain-rpc-interface/src/rpc_client.rs +++ b/client/relay-chain-rpc-interface/src/rpc_client.rs @@ -30,7 +30,7 @@ use sp_storage::StorageKey; use cumulus_primitives_core::{ relay_chain::{ - BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, + vstaging, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash as RelayHash, Header as RelayHeader, InboundHrmpMessage, OccupiedCoreAssumption, PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidationCode, @@ -320,15 +320,62 @@ impl RelayChainRpcClient { } /// Returns all onchain disputes. - /// This is a staging method! Do not use on production runtimes! - pub async fn parachain_host_staging_get_disputes( + pub async fn parachain_host_disputes( &self, at: RelayHash, ) -> Result)>, RelayChainError> { - self.call_remote_runtime_function("ParachainHost_staging_get_disputes", at, None::<()>) + self.call_remote_runtime_function("ParachainHost_disputes", at, None::<()>) + .await + } + + /// Returns a list of validators that lost a past session dispute and need to be slashed. + /// + /// This is a staging method! Do not use on production runtimes! + pub async fn parachain_host_unapplied_slashes( + &self, + at: RelayHash, + ) -> Result< + Vec<(SessionIndex, CandidateHash, vstaging::slashing::PendingSlashes)>, + RelayChainError, + > { + self.call_remote_runtime_function("ParachainHost_unapplied_slashes", at, None::<()>) .await } + /// Returns a merkle proof of a validator session key in a past session. + /// + /// This is a staging method! Do not use on production runtimes! + pub async fn parachain_host_key_ownership_proof( + &self, + at: RelayHash, + validator_id: ValidatorId, + ) -> Result, RelayChainError> { + self.call_remote_runtime_function( + "ParachainHost_key_ownership_proof", + at, + Some(validator_id), + ) + .await + } + + /// Submits an unsigned extrinsic to slash validators who lost a dispute about + /// a candidate of a past session. + /// + /// This is a staging method! Do not use on production runtimes! + pub async fn parachain_host_submit_report_dispute_lost( + &self, + at: RelayHash, + dispute_proof: vstaging::slashing::DisputeProof, + key_ownership_proof: vstaging::slashing::OpaqueKeyOwnershipProof, + ) -> Result, RelayChainError> { + self.call_remote_runtime_function( + "ParachainHost_submit_report_dispute_lost", + at, + Some((dispute_proof, key_ownership_proof)), + ) + .await + } + pub async fn authority_discovery_authorities( &self, at: RelayHash, From b2199fc00dc4960f4341d00634443cac770ac7ed Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 26 May 2023 14:33:13 +0200 Subject: [PATCH 240/339] Fix xcm `SetTopic` vs message_hash vs message_id stuff --- parachains/pallets/bridge-transfer/src/lib.rs | 52 ++++++++++---- .../assets/test-utils/src/test_cases.rs | 68 +++++++++++-------- 2 files changed, 80 insertions(+), 40 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 3190ea8332b..9080a915450 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -117,7 +117,7 @@ pub mod pallet { use super::*; use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; + use frame_system::{pallet_prelude::*, unique}; use xcm_executor::traits::TransactAsset; #[pallet::pallet] @@ -268,7 +268,14 @@ pub mod pallet { #[pallet::generate_deposit(pub (super) fn deposit_event)] pub enum Event { /// Transfer was successfully entered to the system (does not mean already delivered) - TransferInitiated { message_hash: XcmHash, sender_cost: MultiAssets }, + TransferInitiated { + /// `XcmHash` from `XcmContext` which is used for `AssetTransactor` processing and is related to the original message constructed here + message_id: XcmHash, + /// `XcmHash` from `SendXcm` (which is used for `ExportMessage` envelope) + forwarded_message_id: XcmHash, + /// `SendXcm` cost + sender_cost: MultiAssets, + }, /// Reserve asset passed ReserveAssetsDeposited { from: MultiLocation, to: MultiLocation, assets: MultiAssets }, @@ -358,7 +365,8 @@ pub mod pallet { .ok_or(Error::::UnsupportedPing)?; // Initiate bridge transfer - Self::initiate_bridge_transfer(allowed_target_location, xcm).map_err(Into::into) + Self::initiate_bridge_transfer(allowed_target_location, unique(&xcm), xcm) + .map_err(Into::into) } /// Adds new bridge configuration, which allows transfer to this `bridged_network`. @@ -623,6 +631,9 @@ pub mod pallet { .invert_target(&allowed_target_location) .map_err(|_| Error::::InvalidConfiguration)?; + // Prepare some XcmContext + let xcm_context = XcmContext::with_message_id(unique(reserve_account)); + // lets try to do a reserve for all assets let mut reserved_assets = xcm_executor::Assets::new(); for asset in assets.into_inner() { @@ -638,9 +649,7 @@ pub mod pallet { &asset, &origin_location, &reserve_account, - // We aren't able to track the XCM that initiated the fee deposit, so we create a - // fake message hash here - &XcmContext::with_message_hash([0; 32]), + &xcm_context, ) .and_then(|reserved_asset| { Self::deposit_event(Event::ReserveAssetsDeposited { @@ -716,21 +725,34 @@ pub mod pallet { ]); } - Self::initiate_bridge_transfer(allowed_target_location, xcm_instructions.into()) - .map_err(Into::into) + Self::initiate_bridge_transfer( + allowed_target_location, + xcm_context.message_id, + xcm_instructions.into(), + ) + .map_err(Into::into) } - fn initiate_bridge_transfer(dest: MultiLocation, xcm: Xcm<()>) -> Result<(), Error> { + fn initiate_bridge_transfer( + dest: MultiLocation, + message_id: XcmHash, + mut xcm: Xcm<()>, + ) -> Result<(), Error> { + // append message_id + xcm.0.extend(sp_std::vec![SetTopic(message_id.clone())]); + log::info!( target: LOG_TARGET, - "[T::BridgeXcmSender] send to bridge, dest: {:?}, xcm: {:?}", + "[T::BridgeXcmSender] send to bridge, dest: {:?}, xcm: {:?}, message_id: {:?}", dest, xcm, + message_id, ); + // call bridge // TODO: check-parameter - should we handle `sender_cost` somehow ? - let (message_hash, sender_cost) = - send_xcm::(dest, xcm).map_err(|e| { + let (forwarded_message_id, sender_cost) = send_xcm::(dest, xcm) + .map_err(|e| { log::error!( target: LOG_TARGET, "[T::BridgeXcmSender] SendError occurred, error: {:?}", @@ -740,7 +762,11 @@ pub mod pallet { })?; // just fire event - Self::deposit_event(Event::TransferInitiated { message_hash, sender_cost }); + Self::deposit_event(Event::TransferInitiated { + message_id, + forwarded_message_id, + sender_cost, + }); Ok(()) } } diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 221a43eff21..fdabfa22ae6 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1683,35 +1683,37 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< pallet_bridge_transfer::Event::ReserveAssetsDeposited { .. } ))); let transfer_initiated_event = bridge_transfer_events.find_map(|e| match e { - pallet_bridge_transfer::Event::TransferInitiated { message_hash, sender_cost } => - Some((message_hash, sender_cost)), + pallet_bridge_transfer::Event::TransferInitiated { + message_id, + forwarded_message_id, + sender_cost, + } => Some((message_id, forwarded_message_id, sender_cost)), _ => None, }); - let xcm_hash = match transfer_initiated_event { - Some((message_hash, sender_cost)) => { - assert!(sender_cost.is_none()); - Some(message_hash) - }, - _ => { - assert!(false, "No `TransferInitiated` was fired"); - None - }, - }; + assert!(transfer_initiated_event.is_some()); + let (message_id, forwarded_message_id, sender_cost) = transfer_initiated_event.unwrap(); + // we expect UnpaidRemoteExporter + assert!(sender_cost.is_none()); - let mut xcmp_queue_events = >::events() + // check that xcm was sent + let xcm_sent_message_hash = >::events() .into_iter() - .filter_map(|e| unwrap_xcmp_queue_event(e.event.encode())); - let xcm_hash_sent = xcmp_queue_events.find_map(|e| match e { - cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => message_hash, - _ => None, - }); - assert_eq!(xcm_hash, xcm_hash_sent); + .filter_map(|e| unwrap_xcmp_queue_event(e.event.encode())) + .find_map(|e| match e { + cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => + Some(message_hash), + _ => None, + }); // read xcm - let xcm_sent = RuntimeHelper::::take_xcm(bridge_hub_para_id.into()); - assert!(xcm_sent.is_some()); - let mut xcm_sent: Xcm<()> = xcm_sent.unwrap().try_into().expect("versioned xcm"); - println!("{:?}", xcm_sent); + let xcm_sent = + RuntimeHelper::::take_xcm(bridge_hub_para_id.into()).unwrap(); + println!("xcm_sent: {:?}", xcm_sent); + assert_eq!( + xcm_sent_message_hash, + Some(xcm_sent.using_encoded(sp_io::hashing::blake2_256)) + ); + let mut xcm_sent: Xcm<()> = xcm_sent.try_into().expect("versioned xcm"); // check sent XCM ExportMessage to bridge-hub assert!(xcm_sent @@ -1813,12 +1815,24 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< } }) .expect("contains DepositAsset") + .match_next_inst(|instr| match instr { + SetTopic(ref topic) if topic.eq(&message_id) => Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains SetTopic") .assert_remaining_insts(0) .is_ok()); Ok(()) }, _ => Err(ProcessMessageError::BadFormat), }) + .expect("contains ExportMessage") + .match_next_inst(|instr| match instr { + SetTopic(ref topic) if topic.eq(&forwarded_message_id) => Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains SetTopic") + .assert_remaining_insts(0) .is_ok()); }) } @@ -2085,12 +2099,12 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< ); // check NO asset trap occurred - let mut pallet_xcm_events = >::events() - .into_iter() - .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())); assert_eq!( false, - pallet_xcm_events.any(|e| matches!(e, pallet_xcm::Event::AssetsTrapped(..))) + >::events() + .into_iter() + .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())) + .any(|e| matches!(e, pallet_xcm::Event::AssetsTrapped { .. })) ); }) } From 0ad1c2330170b7de59f3e91b70586aba155dff60 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 26 May 2023 15:04:45 +0200 Subject: [PATCH 241/339] Sovereign account as target destination instead of bridge-hub --- parachains/pallets/bridge-transfer/src/lib.rs | 30 +++++++++++++------ .../assets/statemine/src/xcm_config.rs | 14 +++++---- .../assets/test-utils/src/test_cases.rs | 13 ++++---- .../assets/westmint/src/xcm_config.rs | 3 +- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 9080a915450..f73f4411deb 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -620,15 +620,17 @@ pub mod pallet { assets: MultiAssets, bridge_config: BridgeConfig, ) -> Result<(), DispatchError> { - // Resolve reserve account as sovereign account of bridge - let reserve_account = bridge_config.bridge_location; + // Resolve reserve account + let reserve_account = + Self::resolve_reserve_account(&bridge_config, &remote_destination); - let allowed_target_location = bridge_config.allowed_target_location; + // Resolve target destination + let target_destination = bridge_config.allowed_target_location; // UniversalLocation as sovereign account location on target_location (as target_location sees UniversalLocation) let universal_location_as_sovereign_account_on_target_location = T::UniversalLocation::get() - .invert_target(&allowed_target_location) + .invert_target(&target_destination) .map_err(|_| Error::::InvalidConfiguration)?; // Prepare some XcmContext @@ -674,16 +676,17 @@ pub mod pallet { } // Prepare `ReserveAssetDeposited` msg to bridge to the other side. + // Reanchor stuff - we need to convert local asset id/MultiLocation to format that could be understood by different consensus and from their point-of-view - reserved_assets.reanchor(&allowed_target_location, T::UniversalLocation::get(), None); + reserved_assets.reanchor(&target_destination, T::UniversalLocation::get(), None); let remote_destination = remote_destination - .reanchored(&allowed_target_location, T::UniversalLocation::get()) + .reanchored(&target_destination, T::UniversalLocation::get()) .map_err(|errored_dest| { log::error!( target: LOG_TARGET, - "Failed to reanchor remote_destination: {:?} for allowed_target_location: {:?} and universal_location: {:?}", + "Failed to reanchor remote_destination: {:?} for target_destination: {:?} and universal_location: {:?}", errored_dest, - allowed_target_location, + target_destination, T::UniversalLocation::get() ); Error::::InvalidRemoteDestination @@ -726,7 +729,7 @@ pub mod pallet { } Self::initiate_bridge_transfer( - allowed_target_location, + target_destination, xcm_context.message_id, xcm_instructions.into(), ) @@ -769,6 +772,15 @@ pub mod pallet { }); Ok(()) } + + /// Resolve (sovereign) account which will be used as reserve account + fn resolve_reserve_account( + bridge_conig: &BridgeConfig, + _remote_destination: &MultiLocation, + ) -> MultiLocation { + // lets start with target_location + bridge_conig.allowed_target_location.clone() + } } } diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index d4881a16ed5..2e0c1202b25 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -34,11 +34,12 @@ use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FungiblesAdapter, IsConcrete, - LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, - SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, - UnpaidRemoteExporter, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FungiblesAdapter, + GlobalConsensusParachainConvertsFor, IsConcrete, LocalMint, NativeAsset, NoChecking, + ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UnpaidRemoteExporter, + UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -66,6 +67,9 @@ pub type LocationToAccountId = ( SiblingParachainConvertsVia, // Straight up local `AccountId32` origins just alias directly to `AccountId`. AccountId32Aliases, + // Different global consensus parachain sovereign account. + // (Used for over-bridge transfers and reserve processing) + GlobalConsensusParachainConvertsFor, ); /// Means for transacting the native currency on this chain. diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index fdabfa22ae6..09825214387 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1589,8 +1589,6 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< let bridged_network = ByGenesis([6; 32]); let bridge_hub_para_id = 1013; let bridge_hub_location = (Parent, Parachain(bridge_hub_para_id)).into(); - let bridge_hub_account = LocationToAccountId::convert_ref(&bridge_hub_location) - .expect("BridgeHub's Sovereign account"); let target_location_from_different_consensus = MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); @@ -1600,6 +1598,9 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< allowed_target_location: target_location_from_different_consensus, max_target_location_fee: Some(target_location_fee.clone()), }; + let reserve_account = + LocationToAccountId::convert_ref(&target_location_from_different_consensus) + .expect("Sovereign account for reserves"); let balance_to_transfer = 1000_u128; let native_asset = MultiLocation::parent(); @@ -1615,9 +1616,9 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< &alice_account, alice_account_init_balance.clone(), ); - // SA needs to have at least ED, anyway making reserve fails + // SA of target location needs to have at least ED, anyway making reserve fails let _ = >::deposit_creating( - &bridge_hub_account, + &reserve_account, existential_deposit, ); @@ -1630,7 +1631,7 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< ); // SA has just ED assert_eq!( - >::free_balance(&bridge_hub_account), + >::free_balance(&reserve_account), existential_deposit ); @@ -1670,7 +1671,7 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< ); // check reserve account increased assert_eq!( - >::free_balance(&bridge_hub_account), + >::free_balance(&reserve_account), existential_deposit + balance_to_transfer.into() ); diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 01c696574de..5146e403c0d 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -67,7 +67,8 @@ pub type LocationToAccountId = ( SiblingParachainConvertsVia, // Straight up local `AccountId32` origins just alias directly to `AccountId`. AccountId32Aliases, - // Different global consensus parachain sovereign account + // Different global consensus parachain sovereign account. + // (Used for over-bridge transfers and reserve processing) GlobalConsensusParachainConvertsFor, ); From 582842affea331b027e8e9bb5f09d6744a73c1f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 27 May 2023 20:15:33 +0000 Subject: [PATCH 242/339] Bump quote from 1.0.27 to 1.0.28 (#2646) Bumps [quote](https://github.com/dtolnay/quote) from 1.0.27 to 1.0.28. - [Release notes](https://github.com/dtolnay/quote/releases) - [Commits](https://github.com/dtolnay/quote/compare/1.0.27...1.0.28) --- updated-dependencies: - dependency-name: quote dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- pallets/parachain-system/proc-macro/Cargo.toml | 2 +- xcm/xcm-emulator/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 822c76a9e4e..8cf94aa2824 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10393,9 +10393,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index f98ca6f469b..8fd159ef7c1 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -11,7 +11,7 @@ proc-macro = true [dependencies] syn = "2.0.15" proc-macro2 = "1.0.58" -quote = "1.0.27" +quote = "1.0.28" proc-macro-crate = "1.3.1" [features] diff --git a/xcm/xcm-emulator/Cargo.toml b/xcm/xcm-emulator/Cargo.toml index 9f57a667da2..dbbf07be098 100644 --- a/xcm/xcm-emulator/Cargo.toml +++ b/xcm/xcm-emulator/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0" } paste = "1.0.5" -quote = "1.0.23" +quote = "1.0.28" casey = "0.4.0" log = { version = "0.4.17", default-features = false } From 006c7b6b7c87eab3bebd80a4282245ebe7f60140 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 May 2023 13:06:38 +0000 Subject: [PATCH 243/339] Bump proc-macro2 from 1.0.58 to 1.0.59 (#2647) Bumps [proc-macro2](https://github.com/dtolnay/proc-macro2) from 1.0.58 to 1.0.59. - [Release notes](https://github.com/dtolnay/proc-macro2/releases) - [Commits](https://github.com/dtolnay/proc-macro2/compare/1.0.58...1.0.59) --- updated-dependencies: - dependency-name: proc-macro2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- pallets/parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8cf94aa2824..c04202f1b31 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10222,9 +10222,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" dependencies = [ "unicode-ident", ] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index 8fd159ef7c1..5caf7cb7b3b 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -10,7 +10,7 @@ proc-macro = true [dependencies] syn = "2.0.15" -proc-macro2 = "1.0.58" +proc-macro2 = "1.0.59" quote = "1.0.28" proc-macro-crate = "1.3.1" From 85c1c2ea10358ba35934a9bc2e66122fa0d68c84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 May 2023 13:07:49 +0000 Subject: [PATCH 244/339] Bump criterion from 0.5.0 to 0.5.1 (#2645) Bumps [criterion](https://github.com/bheisler/criterion.rs) from 0.5.0 to 0.5.1. - [Changelog](https://github.com/bheisler/criterion.rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/bheisler/criterion.rs/compare/0.5.0...0.5.1) --- updated-dependencies: - dependency-name: criterion dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- test/service/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c04202f1b31..3eaae905fab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1997,9 +1997,9 @@ dependencies = [ [[package]] name = "criterion" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9c16c823fba76d9643cc387e9677d9771abe0827561381815215c47f808da9" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ "anes", "cast", diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index c1117fa3497..1ad45f57fa1 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -12,7 +12,7 @@ path = "src/main.rs" async-trait = "0.1.68" clap = { version = "4.3.0", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } -criterion = { version = "0.5.0", features = [ "async_tokio" ] } +criterion = { version = "0.5.1", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" serde = { version = "1.0.163", features = ["derive"] } From 8bc564570e7a34aff4c41eb3d053efdbc590aec0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 May 2023 13:09:39 +0000 Subject: [PATCH 245/339] Bump peaceiris/actions-gh-pages from 3.9.0 to 3.9.3 (#2412) Bumps [peaceiris/actions-gh-pages](https://github.com/peaceiris/actions-gh-pages) from 3.9.0 to 3.9.3. - [Release notes](https://github.com/peaceiris/actions-gh-pages/releases) - [Changelog](https://github.com/peaceiris/actions-gh-pages/blob/main/CHANGELOG.md) - [Commits](https://github.com/peaceiris/actions-gh-pages/compare/de7ea6f8efb354206b205ef54722213d99067935...373f7f263a76c20808c831209c920827a82a2847) --- updated-dependencies: - dependency-name: peaceiris/actions-gh-pages dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 5f5bdec19af..c67f5bb97ad 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -32,7 +32,7 @@ jobs: run: echo "" > ./target/doc/index.html - name: Deploy documentation - uses: peaceiris/actions-gh-pages@de7ea6f8efb354206b205ef54722213d99067935 # v3.9.0 + uses: peaceiris/actions-gh-pages@373f7f263a76c20808c831209c920827a82a2847 # v3.9.3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_branch: gh-pages From fe42c3b212b8b6b406cc4ea1b5948dfb94aca6d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 May 2023 14:03:07 +0000 Subject: [PATCH 246/339] Bump bumpalo from 3.8.0 to 3.12.0 (#2120) Bumps [bumpalo](https://github.com/fitzgen/bumpalo) from 3.8.0 to 3.12.0. - [Release notes](https://github.com/fitzgen/bumpalo/releases) - [Changelog](https://github.com/fitzgen/bumpalo/blob/main/CHANGELOG.md) - [Commits](https://github.com/fitzgen/bumpalo/compare/3.8.0...3.12.0) --- updated-dependencies: - dependency-name: bumpalo dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: parity-processbot <> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3eaae905fab..c05ecac33b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1262,9 +1262,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.8.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "byte-slice-cast" From 02f0bf7049b848caf436fdaead8ed05ee4d400af Mon Sep 17 00:00:00 2001 From: Ignacio Palacios Date: Mon, 29 May 2023 11:40:25 +0200 Subject: [PATCH 247/339] Glutton script chain spec generator (#2638) * added script * create_glutton_spec script done * made script for many paras * comment fix * comment fix Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * update docs * check jq installed --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- polkadot-parachain/src/chain_spec/glutton.rs | 4 +- scripts/create_glutton_spec.sh | 86 ++++++++++++++++++++ 2 files changed, 88 insertions(+), 2 deletions(-) create mode 100755 scripts/create_glutton_spec.sh diff --git a/polkadot-parachain/src/chain_spec/glutton.rs b/polkadot-parachain/src/chain_spec/glutton.rs index 1a5f60b3baf..d975a0d7d87 100644 --- a/polkadot-parachain/src/chain_spec/glutton.rs +++ b/polkadot-parachain/src/chain_spec/glutton.rs @@ -65,13 +65,13 @@ pub fn glutton_config(para_id: ParaId) -> GluttonChainSpec { // Name format!("Glutton {}", para_id).as_str(), // ID - format!("glutton_kusama_{}", para_id).as_str(), + format!("glutton-kusama-{}", para_id).as_str(), ChainType::Live, move || glutton_genesis(para_id), Vec::new(), None, // Protocol ID - Some(format!("glutton_kusama_{}", para_id).as_str()), + Some(format!("glutton-kusama-{}", para_id).as_str()), None, Some(properties), Extensions { relay_chain: "kusama".into(), para_id: para_id.into() }, diff --git a/scripts/create_glutton_spec.sh b/scripts/create_glutton_spec.sh new file mode 100755 index 00000000000..571a84b57a0 --- /dev/null +++ b/scripts/create_glutton_spec.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +# Example usage to: +# +# - Use the `polkadot-parachain` binary; +# - Use `rococo` as the parent Relay Chain; +# - Generate `ParaId`s from 1,300 to 1,370, inclusive; +# - Set the Sudo key to `G7Z5mTmTQsjEGBVqVGDZyR9m7RoHNZJk6JeykyfKQ3vmBiR`; +# - Set `compute`, `storage`, and `trash_data_count` set to 50%, 50%, and 5,120, respectively; +# - And save the results in `output-dir`. +# +# ./scripts/create_glutton_spec.sh ./target/release/polkadot-parachain rococo 1300 1370 G7Z5mTmTQsjEGBVqVGDZyR9m7RoHNZJk6JeykyfKQ3vmBiR 500000000 500000000 5120 output-dir + +usage() { + echo Usage: + echo "$0 " + exit 1 +} + +set -e + +if ! command -v jq >/dev/null 2>&1; then + echo "'jq' is not installed, please install. Exiting..." + exit 1 +fi + +binary_path=$1 +relay_chain=$2 +from_para_id=$3 +to_para_id=$4 +sudo=$5 +compute=$6 +storage=$7 +trash_data_count=$8 +output_dir=$9 + +[ -z "$binary_path" ] && usage +[ -z "$relay_chain" ] && usage +[ -z "$from_para_id" ] && usage +[ -z "$to_para_id" ] && usage +[ -z "$sudo" ] && usage +[ -z "$compute" ] && usage +[ -z "$storage" ] && usage +[ -z "$trash_data_count" ] && usage +[ -z "$output_dir" ] && usage + + +for (( para_id=$from_para_id; para_id<=$to_para_id; para_id++ )); do + echo "Building chain specs for parachain $para_id" + + # create dir to store parachain generated files + output_para_dir="$output_dir/glutton-$relay_chain-$para_id" + if [ ! -d "$output_para_dir" ]; then + mkdir $output_para_dir + fi + + # build the chain spec we'll manipulate + $binary_path build-spec --disable-default-bootnode --chain "glutton-kusama-genesis-$para_id" > "$output_para_dir/plain-glutton-$relay_chain-$para_id-spec.json" + + id="glutton-$relay_chain-$para_id" + protocol_id="glutton-$relay_chain-$para_id" + + # replace the runtime in the spec with the given runtime and set some values to production + cat "$output_para_dir/plain-glutton-$relay_chain-$para_id-spec.json" \ + | jq --arg id $id '.id = $id' \ + | jq --arg protocol_id $protocol_id '.protocolId = $protocol_id' \ + | jq --arg relay_chain $relay_chain '.relay_chain = $relay_chain' \ + | jq --argjson para_id $para_id '.para_id = $para_id' \ + | jq --arg sudo $sudo '.genesis.runtime.sudo.key = $sudo' \ + | jq --argjson para_id $para_id '.genesis.runtime.parachainInfo.parachainId = $para_id' \ + | jq --argjson compute $compute '.genesis.runtime.glutton.compute = $compute' \ + | jq --argjson storage $storage '.genesis.runtime.glutton.storage = $storage' \ + | jq --argjson trash_data_count $trash_data_count '.genesis.runtime.glutton.trashDataCount = $trash_data_count' \ + > $output_para_dir/glutton-$relay_chain-$para_id-spec.json + + # build a raw spec + $binary_path build-spec --disable-default-bootnode --chain "$output_para_dir/glutton-$relay_chain-$para_id-spec.json" --raw > "$output_para_dir/glutton-$relay_chain-$para_id-raw-spec.json" + + # build genesis data + $binary_path export-genesis-state --chain "$output_para_dir/glutton-$relay_chain-$para_id-raw-spec.json" > "$output_para_dir/glutton-$relay_chain-$para_id-head-data" + + # build genesis wasm + $binary_path export-genesis-wasm --chain "$output_para_dir/glutton-$relay_chain-$para_id-raw-spec.json" > "$output_para_dir/glutton-$relay_chain-$para_id-validation-code" + + rm "$output_para_dir/plain-glutton-$relay_chain-$para_id-spec.json" +done From d56b4d8c5f4c9e827b5f7b90993768b4f26d21f9 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Mon, 29 May 2023 14:32:27 +0300 Subject: [PATCH 248/339] Companion for #14237: Use latest sp-crates (#2643) * Update cargo.lock Signed-off-by: Alexandru Vasile * Update cargo.lock Signed-off-by: Alexandru Vasile * Update cargo.lock Signed-off-by: Alexandru Vasile --------- Signed-off-by: Alexandru Vasile --- Cargo.lock | 489 ++++++++++++++++++++++++----------------------------- 1 file changed, 225 insertions(+), 264 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c05ecac33b1..e251fe4ac9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -577,7 +577,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "hash-db", "log", @@ -3784,7 +3784,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", ] @@ -3807,7 +3807,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-support-procedural", @@ -3832,7 +3832,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3879,7 +3879,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3890,7 +3890,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3907,7 +3907,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-system", @@ -3936,7 +3936,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-recursion", "futures", @@ -3957,7 +3957,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "bitflags", "environmental", @@ -3991,7 +3991,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "Inflector", "cfg-expr", @@ -4007,7 +4007,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4019,7 +4019,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "proc-macro2", "quote", @@ -4029,7 +4029,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "cfg-if", "frame-support", @@ -4048,7 +4048,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4063,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "sp-api", @@ -4072,7 +4072,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "parity-scale-codec", @@ -6080,12 +6080,6 @@ dependencies = [ "hash-db", ] -[[package]] -name = "memory_units" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" - [[package]] name = "merlin" version = "2.0.1" @@ -6149,7 +6143,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "futures", "log", @@ -6168,7 +6162,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "anyhow", "jsonrpsee", @@ -6672,7 +6666,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6693,7 +6687,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -6711,7 +6705,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -6726,7 +6720,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-system", @@ -6742,7 +6736,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-system", @@ -6758,7 +6752,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-system", @@ -6772,7 +6766,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -6796,7 +6790,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6816,7 +6810,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,7 +6825,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-system", @@ -6850,7 +6844,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6874,7 +6868,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -6980,7 +6974,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7024,7 +7018,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7041,7 +7035,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "bitflags", "environmental", @@ -7064,14 +7058,14 @@ dependencies = [ "sp-runtime", "sp-std", "wasm-instrument 0.4.0", - "wasmi 0.28.0", + "wasmi", "wasmparser-nostd", ] [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "bitflags", "parity-scale-codec", @@ -7084,7 +7078,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "proc-macro2", "quote", @@ -7094,7 +7088,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7111,7 +7105,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7129,7 +7123,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7152,7 +7146,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7165,7 +7159,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7183,7 +7177,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7201,7 +7195,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "blake2", "frame-benchmarking", @@ -7219,7 +7213,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7242,7 +7236,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7258,7 +7252,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7278,7 +7272,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7295,7 +7289,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-system", @@ -7309,7 +7303,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7326,7 +7320,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7345,7 +7339,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7362,7 +7356,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7378,7 +7372,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7395,7 +7389,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7413,7 +7407,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "pallet-nfts", @@ -7424,7 +7418,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7440,7 +7434,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-system", @@ -7457,7 +7451,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7477,7 +7471,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7488,7 +7482,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-system", @@ -7505,7 +7499,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7544,7 +7538,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7561,7 +7555,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7576,7 +7570,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7594,7 +7588,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7609,7 +7603,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7628,7 +7622,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7645,7 +7639,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-system", @@ -7666,7 +7660,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7682,7 +7676,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-system", @@ -7696,7 +7690,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7719,7 +7713,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7730,7 +7724,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "log", "sp-arithmetic", @@ -7739,7 +7733,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "sp-api", @@ -7748,7 +7742,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7765,7 +7759,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7780,7 +7774,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7798,7 +7792,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7817,7 +7811,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-support", "frame-system", @@ -7833,7 +7827,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7849,7 +7843,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7861,7 +7855,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7878,7 +7872,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7893,7 +7887,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7909,7 +7903,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -7924,7 +7918,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-benchmarking", "frame-support", @@ -10211,9 +10205,9 @@ dependencies = [ [[package]] name = "proc-macro-warning" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e99670bafb56b9a106419397343bdbc8b8742c3cc449fec6345f86173f47cd4" +checksum = "70550716265d1ec349c41f70dd4f964b4fd88394efe4405f0c1da679c4799a07" dependencies = [ "proc-macro2", "quote", @@ -11089,7 +11083,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "log", "sp-core", @@ -11100,7 +11094,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "futures", @@ -11129,7 +11123,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "futures", "futures-timer", @@ -11152,7 +11146,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11167,7 +11161,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11186,7 +11180,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11197,7 +11191,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11237,7 +11231,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "fnv", "futures", @@ -11264,7 +11258,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "hash-db", "kvdb", @@ -11290,7 +11284,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "futures", @@ -11315,7 +11309,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "futures", @@ -11344,7 +11338,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "fork-tree", @@ -11380,7 +11374,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "futures", "jsonrpsee", @@ -11402,7 +11396,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11438,7 +11432,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "futures", "jsonrpsee", @@ -11457,7 +11451,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11470,7 +11464,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11510,7 +11504,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "finality-grandpa", "futures", @@ -11530,7 +11524,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "futures", @@ -11553,9 +11547,9 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ - "lru 0.8.1", + "lru 0.10.0", "parity-scale-codec", "parking_lot 0.12.1", "sc-executor-common", @@ -11575,7 +11569,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11587,7 +11581,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "anyhow", "cfg-if", @@ -11605,7 +11599,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "ansi_term", "futures", @@ -11621,7 +11615,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11635,7 +11629,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11650,7 +11644,7 @@ dependencies = [ "libp2p", "linked_hash_set", "log", - "lru 0.8.1", + "lru 0.10.0", "mockall", "parity-scale-codec", "parking_lot 0.12.1", @@ -11680,7 +11674,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-channel", "cid", @@ -11701,7 +11695,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11729,14 +11723,14 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "ahash 0.8.2", "futures", "futures-timer", "libp2p", "log", - "lru 0.8.1", + "lru 0.10.0", "sc-network", "sc-network-common", "sc-peerset", @@ -11748,7 +11742,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11771,7 +11765,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11781,7 +11775,7 @@ dependencies = [ "futures-timer", "libp2p", "log", - "lru 0.8.1", + "lru 0.10.0", "mockall", "parity-scale-codec", "prost", @@ -11806,7 +11800,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11825,7 +11819,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11856,7 +11850,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "futures", "libp2p-identity", @@ -11872,7 +11866,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11881,7 +11875,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "futures", "jsonrpsee", @@ -11912,7 +11906,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11931,7 +11925,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "http", "jsonrpsee", @@ -11946,7 +11940,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11972,7 +11966,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "directories", @@ -12038,7 +12032,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "log", "parity-scale-codec", @@ -12049,7 +12043,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "clap", "fs4", @@ -12065,7 +12059,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12084,7 +12078,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "futures", "libc", @@ -12103,7 +12097,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "chrono", "futures", @@ -12122,7 +12116,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "ansi_term", "atty", @@ -12153,7 +12147,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12164,7 +12158,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "futures", @@ -12191,7 +12185,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "futures", @@ -12205,7 +12199,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-channel", "futures", @@ -12763,7 +12757,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "hash-db", "log", @@ -12783,7 +12777,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "Inflector", "blake2", @@ -12796,8 +12790,8 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "scale-info", @@ -12809,8 +12803,8 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "integer-sqrt", "num-traits", @@ -12824,7 +12818,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "scale-info", @@ -12837,7 +12831,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "sp-api", @@ -12849,11 +12843,11 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "futures", "log", - "lru 0.8.1", + "lru 0.10.0", "parity-scale-codec", "parking_lot 0.12.1", "sp-api", @@ -12867,7 +12861,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "futures", @@ -12882,7 +12876,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "parity-scale-codec", @@ -12900,7 +12894,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "parity-scale-codec", @@ -12921,7 +12915,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12940,7 +12934,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "finality-grandpa", "log", @@ -12958,7 +12952,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "scale-info", @@ -12969,8 +12963,8 @@ dependencies = [ [[package]] name = "sp-core" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13013,8 +13007,8 @@ dependencies = [ [[package]] name = "sp-core-hashing" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "blake2b_simd", "byteorder", @@ -13027,8 +13021,8 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "proc-macro2", "quote", @@ -13039,7 +13033,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13047,8 +13041,8 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "proc-macro2", "quote", @@ -13057,8 +13051,8 @@ dependencies = [ [[package]] name = "sp-externalities" -version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "0.14.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "environmental", "parity-scale-codec", @@ -13069,7 +13063,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13083,8 +13077,8 @@ dependencies = [ [[package]] name = "sp-io" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "bytes", "ed25519", @@ -13109,8 +13103,8 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "lazy_static", "sp-core", @@ -13120,8 +13114,8 @@ dependencies = [ [[package]] name = "sp-keystore" -version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "0.14.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "futures", "parity-scale-codec", @@ -13135,7 +13129,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13144,7 +13138,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13155,7 +13149,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13173,7 +13167,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "scale-info", @@ -13187,7 +13181,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "sp-api", "sp-core", @@ -13196,8 +13190,8 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "backtrace", "lazy_static", @@ -13207,7 +13201,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "rustc-hash", "serde", @@ -13216,8 +13210,8 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "either", "hash256-std-hasher", @@ -13238,8 +13232,8 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13256,8 +13250,8 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "Inflector", "proc-macro-crate", @@ -13269,7 +13263,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "scale-info", @@ -13283,7 +13277,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "scale-info", @@ -13295,8 +13289,8 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "0.14.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "hash-db", "log", @@ -13316,7 +13310,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "log", "parity-scale-codec", @@ -13333,13 +13327,13 @@ dependencies = [ [[package]] name = "sp-std" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" [[package]] name = "sp-storage" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13352,7 +13346,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "futures-timer", @@ -13366,8 +13360,8 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "sp-std", @@ -13379,7 +13373,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "sp-api", "sp-runtime", @@ -13388,7 +13382,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "log", @@ -13403,8 +13397,8 @@ dependencies = [ [[package]] name = "sp-trie" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13426,8 +13420,8 @@ dependencies = [ [[package]] name = "sp-version" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13443,8 +13437,8 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13454,22 +13448,21 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "anyhow", "impl-trait-for-tuples", "log", "parity-scale-codec", "sp-std", - "wasmi 0.13.2", "wasmtime", ] [[package]] name = "sp-weights" -version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "parity-scale-codec", "scale-info", @@ -13858,7 +13851,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "platforms", ] @@ -13866,7 +13859,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13885,7 +13878,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "hyper", "log", @@ -13897,7 +13890,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "jsonrpsee", @@ -13910,7 +13903,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "jsonrpsee", "log", @@ -13929,7 +13922,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13955,7 +13948,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13965,7 +13958,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13976,12 +13969,13 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "ansi_term", "build-helper", "cargo_metadata", "filetime", + "parity-wasm", "sp-maybe-compressed-blob", "strum", "tempfile", @@ -14635,7 +14629,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#3846c2cd482119d0e1fcc79a214e3afe454f5721" +source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" dependencies = [ "async-trait", "clap", @@ -15043,17 +15037,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wasmi" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c326c93fbf86419608361a2c925a31754cf109da1b8b55737070b4d6669422" -dependencies = [ - "parity-wasm", - "wasmi-validation", - "wasmi_core 0.2.1", -] - [[package]] name = "wasmi" version = "0.28.0" @@ -15062,38 +15045,16 @@ checksum = "8e61a7006b0fdf24f6bbe8dcfdad5ca1b350de80061fb2827f31c82fbbb9565a" dependencies = [ "spin 0.9.4", "wasmi_arena", - "wasmi_core 0.12.0", + "wasmi_core", "wasmparser-nostd", ] -[[package]] -name = "wasmi-validation" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ff416ad1ff0c42e5a926ed5d5fab74c0f098749aa0ad8b2a34b982ce0e867b" -dependencies = [ - "parity-wasm", -] - [[package]] name = "wasmi_arena" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "401c1f35e413fac1846d4843745589d9ec678977ab35a384db8ae7830525d468" -[[package]] -name = "wasmi_core" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d20cb3c59b788653d99541c646c561c9dd26506f25c0cebfe810659c54c6d7" -dependencies = [ - "downcast-rs", - "libm 0.2.1", - "memory_units", - "num-rational", - "num-traits", -] - [[package]] name = "wasmi_core" version = "0.12.0" From f67d5826a7e9dc096543667e34ddfced35a08dcd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 May 2023 12:06:25 +0000 Subject: [PATCH 249/339] Bump ruby/setup-ruby from 1.149.0 to 1.150.0 (#2618) Bumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.149.0 to 1.150.0. - [Release notes](https://github.com/ruby/setup-ruby/releases) - [Commits](https://github.com/ruby/setup-ruby/compare/7d546f4868fb108ed378764d873683f920672ae2...8a45918450651f5e4784b6031db26f4b9f76b251) --- updated-dependencies: - dependency-name: ruby/setup-ruby dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release-30_create-draft.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index d81f0a7809e..c4bb546dc78 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -126,7 +126,7 @@ jobs: path: cumulus ref: ${{ github.event.inputs.ref2 }} - - uses: ruby/setup-ruby@7d546f4868fb108ed378764d873683f920672ae2 # v1.149.0 + - uses: ruby/setup-ruby@8a45918450651f5e4784b6031db26f4b9f76b251 # v1.150.0 with: ruby-version: 3.0.0 @@ -253,7 +253,7 @@ jobs: - name: Download artifacts uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 - - uses: ruby/setup-ruby@7d546f4868fb108ed378764d873683f920672ae2 # v1.149.0 + - uses: ruby/setup-ruby@8a45918450651f5e4784b6031db26f4b9f76b251 # v1.150.0 with: ruby-version: 3.0.0 From abccfae5f24b4ced2b3802fa2665c3e79cdb62a9 Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Mon, 29 May 2023 15:03:48 +0200 Subject: [PATCH 250/339] Add Ability to Add/Remove Invulnerable Collators (#2596) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add add and remove invulnerable dispatchables * add migration * fix benchmarking code * add weights * add migration to runtimes * clippy * pass SafeCallFilter * make try-runtime work * typos Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> * better insert and added test * fix try-runtime update * Apply suggestions from code review Co-authored-by: Bastian Köcher * Update pallets/collator-selection/src/migration.rs * check events in test * Update pallets/collator-selection/src/migration.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * just dispatchresult * only sp_std for try-runtime --------- Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> Co-authored-by: Bastian Köcher Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> --- pallets/collator-selection/Cargo.toml | 4 +- .../collator-selection/src/benchmarking.rs | 48 +++++- pallets/collator-selection/src/lib.rs | 100 +++++++++++-- pallets/collator-selection/src/migration.rs | 91 ++++++++++++ pallets/collator-selection/src/mock.rs | 4 +- pallets/collator-selection/src/tests.rs | 137 +++++++++++++++++- pallets/collator-selection/src/weights.rs | 68 +++++++++ .../runtimes/assets/statemine/src/lib.rs | 2 +- .../src/weights/pallet_collator_selection.rs | 33 +++++ .../assets/statemine/src/xcm_config.rs | 4 +- .../runtimes/assets/statemint/src/lib.rs | 2 +- .../src/weights/pallet_collator_selection.rs | 33 +++++ .../assets/statemint/src/xcm_config.rs | 4 +- .../runtimes/assets/westmint/src/lib.rs | 7 +- .../src/weights/pallet_collator_selection.rs | 33 +++++ .../assets/westmint/src/xcm_config.rs | 4 +- .../bridge-hubs/bridge-hub-kusama/src/lib.rs | 4 + .../src/weights/pallet_collator_selection.rs | 33 +++++ .../bridge-hub-kusama/src/xcm_config.rs | 4 +- .../bridge-hub-polkadot/src/lib.rs | 4 + .../src/weights/pallet_collator_selection.rs | 33 +++++ .../bridge-hub-polkadot/src/xcm_config.rs | 4 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 4 + .../src/weights/pallet_collator_selection.rs | 33 +++++ .../bridge-hub-rococo/src/xcm_config.rs | 4 +- .../collectives-polkadot/src/lib.rs | 7 +- .../src/weights/pallet_collator_selection.rs | 33 +++++ .../collectives-polkadot/src/xcm_config.rs | 4 +- .../contracts/contracts-rococo/src/lib.rs | 5 +- parachains/runtimes/testing/penpal/src/lib.rs | 6 +- 30 files changed, 712 insertions(+), 40 deletions(-) create mode 100644 pallets/collator-selection/src/migration.rs diff --git a/pallets/collator-selection/Cargo.toml b/pallets/collator-selection/Cargo.toml index 9ff4d2eb5e6..f3bec9567cd 100644 --- a/pallets/collator-selection/Cargo.toml +++ b/pallets/collator-selection/Cargo.toml @@ -1,6 +1,6 @@ [package] -authors = ["Anonymous"] -description = "Simple staking pallet with a fixed stake." +authors = ["Parity Technologies "] +description = "Simple pallet to select collators for a parachain." edition = "2021" homepage = "https://substrate.io" license = "Apache-2.0" diff --git a/pallets/collator-selection/src/benchmarking.rs b/pallets/collator-selection/src/benchmarking.rs index 6b386f7d697..63c9561e7dd 100644 --- a/pallets/collator-selection/src/benchmarking.rs +++ b/pallets/collator-selection/src/benchmarking.rs @@ -110,17 +110,61 @@ benchmarks! { where_clause { where T: pallet_authorship::Config + session::Config } set_invulnerables { + let origin = + T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let b in 1 .. T::MaxInvulnerables::get(); let new_invulnerables = register_validators::(b); + let mut sorted_new_invulnerables = new_invulnerables.clone(); + sorted_new_invulnerables.sort(); + }: { + assert_ok!( + // call the function with the unsorted list + >::set_invulnerables(origin, new_invulnerables.clone()) + ); + } + verify { + // assert that it comes out sorted + assert_last_event::(Event::NewInvulnerables{invulnerables: sorted_new_invulnerables}.into()); + } + + add_invulnerable { let origin = T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + // we're going to add one, so need one less than max set as invulnerables to start + let b in 1 .. T::MaxInvulnerables::get() - 1; + let mut invulnerables = register_validators::(b); + invulnerables.sort(); + let invulnerables: frame_support::BoundedVec<_, T::MaxInvulnerables> = frame_support::BoundedVec::try_from(invulnerables).unwrap(); + >::put(invulnerables); + + // now let's set up a new one to add + let (new, keys) = validator::(b + 1); + >::set_keys(RawOrigin::Signed(new.clone()).into(), keys, Vec::new()).unwrap(); }: { assert_ok!( - >::set_invulnerables(origin, new_invulnerables.clone()) + >::add_invulnerable(origin, new.clone()) + ); + } + verify { + assert_last_event::(Event::InvulnerableAdded{account_id: new}.into()); + } + + remove_invulnerable { + let origin = + T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let b in 1 .. T::MaxInvulnerables::get(); + let mut invulnerables = register_validators::(b); + invulnerables.sort(); + let invulnerables: frame_support::BoundedVec<_, T::MaxInvulnerables> = frame_support::BoundedVec::try_from(invulnerables).unwrap(); + >::put(invulnerables); + let to_remove = >::get().first().unwrap().clone(); + }: { + assert_ok!( + >::remove_invulnerable(origin, to_remove.clone()) ); } verify { - assert_last_event::(Event::NewInvulnerables{invulnerables: new_invulnerables}.into()); + assert_last_event::(Event::InvulnerableRemoved{account_id: to_remove}.into()); } set_desired_candidates { diff --git a/pallets/collator-selection/src/lib.rs b/pallets/collator-selection/src/lib.rs index 5983ac5cc3a..daccc4ce93c 100644 --- a/pallets/collator-selection/src/lib.rs +++ b/pallets/collator-selection/src/lib.rs @@ -70,8 +70,11 @@ mod tests; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; +pub mod migration; pub mod weights; +const LOG_TARGET: &str = "runtime::collator-selection"; + #[frame_support::pallet] pub mod pallet { pub use crate::weights::WeightInfo; @@ -95,6 +98,9 @@ pub mod pallet { use sp_runtime::traits::Convert; use sp_staking::SessionIndex; + /// The current storage version. + const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -165,9 +171,10 @@ pub mod pallet { } #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] pub struct Pallet(_); - /// The invulnerable, fixed collators. + /// The invulnerable, permissioned collators. This list must be sorted. #[pallet::storage] #[pallet::getter(fn invulnerables)] pub type Invulnerables = @@ -222,7 +229,7 @@ pub mod pallet { "duplicate invulnerables in genesis." ); - let bounded_invulnerables = + let mut bounded_invulnerables = BoundedVec::<_, T::MaxInvulnerables>::try_from(self.invulnerables.clone()) .expect("genesis invulnerables are more than T::MaxInvulnerables"); assert!( @@ -230,6 +237,8 @@ pub mod pallet { "genesis desired_candidates are more than T::MaxCandidates", ); + bounded_invulnerables.sort(); + >::put(self.desired_candidates); >::put(self.candidacy_bond); >::put(bounded_invulnerables); @@ -239,35 +248,41 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { + /// New Invulnerables were set. NewInvulnerables { invulnerables: Vec }, + /// A new Invulnerable was added. + InvulnerableAdded { account_id: T::AccountId }, + /// An Invulnerable was removed. + InvulnerableRemoved { account_id: T::AccountId }, + /// The number of desired candidates was set. NewDesiredCandidates { desired_candidates: u32 }, + /// The candidacy bond was set. NewCandidacyBond { bond_amount: BalanceOf }, + /// A new candidate joined. CandidateAdded { account_id: T::AccountId, deposit: BalanceOf }, + /// A candidate was removed. CandidateRemoved { account_id: T::AccountId }, } - // Errors inform users that something went wrong. #[pallet::error] pub enum Error { - /// Too many candidates + /// The pallet has too many candidates. TooManyCandidates, - /// Too few candidates + /// Leaving would result in too few candidates. TooFewCandidates, - /// Unknown error - Unknown, - /// Permission issue - Permission, - /// User is already a candidate + /// Account is already a candidate. AlreadyCandidate, - /// User is not a candidate + /// Account is not a candidate. NotCandidate, - /// Too many invulnerables + /// There are too many Invulnerables. TooManyInvulnerables, - /// User is already an Invulnerable + /// Account is already an Invulnerable. AlreadyInvulnerable, - /// Account has no associated validator ID + /// Account is not an Invulnerable. + NotInvulnerable, + /// Account has no associated validator ID. NoAssociatedValidatorId, - /// Validator ID is not yet registered + /// Validator ID is not yet registered. ValidatorNotRegistered, } @@ -284,7 +299,7 @@ pub mod pallet { new: Vec, ) -> DispatchResultWithPostInfo { T::UpdateOrigin::ensure_origin(origin)?; - let bounded_invulnerables = BoundedVec::<_, T::MaxInvulnerables>::try_from(new) + let mut bounded_invulnerables = BoundedVec::<_, T::MaxInvulnerables>::try_from(new) .map_err(|_| Error::::TooManyInvulnerables)?; // check if the invulnerables have associated validator keys before they are set @@ -297,6 +312,9 @@ pub mod pallet { ); } + // Invulnerables must be sorted for removal. + bounded_invulnerables.sort(); + >::put(&bounded_invulnerables); Self::deposit_event(Event::NewInvulnerables { invulnerables: bounded_invulnerables.to_vec(), @@ -398,6 +416,56 @@ pub mod pallet { Ok(Some(T::WeightInfo::leave_intent(current_count as u32)).into()) } + + /// Add a new account `who` to the list of `Invulnerables` collators. + /// + /// The origin for this call must be the `UpdateOrigin`. + #[pallet::call_index(5)] + #[pallet::weight(T::WeightInfo::add_invulnerable(T::MaxInvulnerables::get() - 1))] + pub fn add_invulnerable(origin: OriginFor, who: T::AccountId) -> DispatchResult { + T::UpdateOrigin::ensure_origin(origin)?; + + // ensure `who` has registered a validator key + let validator_key = T::ValidatorIdOf::convert(who.clone()) + .ok_or(Error::::NoAssociatedValidatorId)?; + ensure!( + T::ValidatorRegistration::is_registered(&validator_key), + Error::::ValidatorNotRegistered + ); + + >::try_mutate(|invulnerables| -> DispatchResult { + match invulnerables.binary_search(&who) { + Ok(_) => return Err(Error::::AlreadyInvulnerable)?, + Err(pos) => invulnerables + .try_insert(pos, who.clone()) + .map_err(|_| Error::::TooManyInvulnerables)?, + } + Ok(()) + })?; + + Self::deposit_event(Event::InvulnerableAdded { account_id: who }); + Ok(()) + } + + /// Remove an account `who` from the list of `Invulnerables` collators. `Invulnerables` must + /// be sorted. + /// + /// The origin for this call must be the `UpdateOrigin`. + #[pallet::call_index(6)] + #[pallet::weight(T::WeightInfo::remove_invulnerable(T::MaxInvulnerables::get()))] + pub fn remove_invulnerable(origin: OriginFor, who: T::AccountId) -> DispatchResult { + T::UpdateOrigin::ensure_origin(origin)?; + + >::try_mutate(|invulnerables| -> DispatchResult { + let pos = + invulnerables.binary_search(&who).map_err(|_| Error::::NotInvulnerable)?; + invulnerables.remove(pos); + Ok(()) + })?; + + Self::deposit_event(Event::InvulnerableRemoved { account_id: who }); + Ok(()) + } } impl Pallet { diff --git a/pallets/collator-selection/src/migration.rs b/pallets/collator-selection/src/migration.rs new file mode 100644 index 00000000000..e26d9f08b5b --- /dev/null +++ b/pallets/collator-selection/src/migration.rs @@ -0,0 +1,91 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! A module that is responsible for migration of storage for Collator Selection. + +use super::*; +use frame_support::{log, traits::OnRuntimeUpgrade}; + +/// Version 1 Migration +/// This migration ensures that any existing `Invulnerables` storage lists are sorted. +pub mod v1 { + use super::*; + use frame_support::pallet_prelude::*; + #[cfg(feature = "try-runtime")] + use sp_std::prelude::*; + + pub struct MigrateToV1(sp_std::marker::PhantomData); + impl OnRuntimeUpgrade for MigrateToV1 { + fn on_runtime_upgrade() -> Weight { + let onchain_version = Pallet::::on_chain_storage_version(); + if onchain_version == 0 { + let invulnerables_len = Invulnerables::::get().to_vec().len(); + >::mutate(|invulnerables| { + invulnerables.sort(); + }); + + StorageVersion::new(1).put::>(); + log::info!( + target: LOG_TARGET, + "Sorted {} Invulnerables, upgraded storage to version 1", + invulnerables_len, + ); + // Similar complexity to `set_invulnerables` (put storage value) + // Plus 1 read for length, 1 read for `onchain_version`, 1 write to put version + T::WeightInfo::set_invulnerables(invulnerables_len as u32) + .saturating_add(T::DbWeight::get().reads_writes(2, 1)) + } else { + log::info!( + target: LOG_TARGET, + "Migration did not execute. This probably should be removed" + ); + T::DbWeight::get().reads(1) + } + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::DispatchError> { + let number_of_invulnerables = Invulnerables::::get().to_vec().len(); + Ok((number_of_invulnerables as u32).encode()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(number_of_invulnerables: Vec) -> Result<(), sp_runtime::DispatchError> { + let stored_invulnerables = Invulnerables::::get().to_vec(); + let mut sorted_invulnerables = stored_invulnerables.clone(); + sorted_invulnerables.sort(); + assert_eq!( + stored_invulnerables, sorted_invulnerables, + "after migration, the stored invulnerables should be sorted" + ); + + let number_of_invulnerables: u32 = Decode::decode( + &mut number_of_invulnerables.as_slice(), + ) + .expect("the state parameter should be something that was generated by pre_upgrade"); + let stored_invulnerables_len = stored_invulnerables.len() as u32; + assert_eq!( + number_of_invulnerables, stored_invulnerables_len, + "after migration, there should be the same number of invulnerables" + ); + + let onchain_version = Pallet::::on_chain_storage_version(); + frame_support::ensure!(onchain_version >= 1, "must_upgrade"); + + Ok(()) + } + } +} diff --git a/pallets/collator-selection/src/mock.rs b/pallets/collator-selection/src/mock.rs index ef2bdc81746..d7b9c2bf74d 100644 --- a/pallets/collator-selection/src/mock.rs +++ b/pallets/collator-selection/src/mock.rs @@ -195,7 +195,7 @@ parameter_types! { pub struct IsRegistered; impl ValidatorRegistration for IsRegistered { fn is_registered(id: &u64) -> bool { - *id != 7u64 + *id != 42u64 } } @@ -217,7 +217,7 @@ impl Config for Test { pub fn new_test_ext() -> sp_io::TestExternalities { sp_tracing::try_init_simple(); let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); - let invulnerables = vec![1, 2]; + let invulnerables = vec![2, 1]; // unsorted let balances = vec![(1, 100), (2, 100), (3, 100), (4, 100), (5, 100)]; let keys = balances diff --git a/pallets/collator-selection/src/tests.rs b/pallets/collator-selection/src/tests.rs index 0ae3e3d5a18..9014b6eff65 100644 --- a/pallets/collator-selection/src/tests.rs +++ b/pallets/collator-selection/src/tests.rs @@ -20,7 +20,7 @@ use frame_support::{ traits::{Currency, GenesisBuild, OnInitialize}, }; use pallet_balances::Error as BalancesError; -use sp_runtime::traits::BadOrigin; +use sp_runtime::{testing::UintAuthorityId, traits::BadOrigin}; #[test] fn basic_setup_works() { @@ -29,6 +29,7 @@ fn basic_setup_works() { assert_eq!(CollatorSelection::candidacy_bond(), 10); assert!(CollatorSelection::candidates().is_empty()); + // genesis should sort input assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); }); } @@ -36,11 +37,12 @@ fn basic_setup_works() { #[test] fn it_should_set_invulnerables() { new_test_ext().execute_with(|| { - let new_set = vec![1, 2, 3, 4]; + let mut new_set = vec![1, 4, 3, 2]; assert_ok!(CollatorSelection::set_invulnerables( RuntimeOrigin::signed(RootAccount::get()), new_set.clone() )); + new_set.sort(); assert_eq!(CollatorSelection::invulnerables(), new_set); // cannot set with non-root. @@ -50,7 +52,7 @@ fn it_should_set_invulnerables() { ); // cannot set invulnerables without associated validator keys - let invulnerables = vec![7]; + let invulnerables = vec![42]; assert_noop!( CollatorSelection::set_invulnerables( RuntimeOrigin::signed(RootAccount::get()), @@ -61,6 +63,133 @@ fn it_should_set_invulnerables() { }); } +#[test] +fn add_invulnerable_works() { + new_test_ext().execute_with(|| { + initialize_to_block(1); + assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + let new = 3; + + // function runs + assert_ok!(CollatorSelection::add_invulnerable( + RuntimeOrigin::signed(RootAccount::get()), + new + )); + + System::assert_last_event(RuntimeEvent::CollatorSelection( + crate::Event::InvulnerableAdded { account_id: new }, + )); + + // same element cannot be added more than once + assert_noop!( + CollatorSelection::add_invulnerable(RuntimeOrigin::signed(RootAccount::get()), new), + Error::::AlreadyInvulnerable + ); + + // new element is now part of the invulnerables list + assert!(CollatorSelection::invulnerables().to_vec().contains(&new)); + + // cannot add with non-root + assert_noop!(CollatorSelection::add_invulnerable(RuntimeOrigin::signed(1), new), BadOrigin); + + // cannot add invulnerable without associated validator keys + let not_validator = 42; + assert_noop!( + CollatorSelection::add_invulnerable( + RuntimeOrigin::signed(RootAccount::get()), + not_validator + ), + Error::::ValidatorNotRegistered + ); + }); +} + +#[test] +fn invulnerable_limit_works() { + new_test_ext().execute_with(|| { + assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + + // MaxInvulnerables: u32 = 20 + for ii in 3..=21 { + // only keys were registered in mock for 1 to 5 + if ii > 5 { + Balances::make_free_balance_be(&ii, 100); + let key = MockSessionKeys { aura: UintAuthorityId(ii) }; + Session::set_keys(RuntimeOrigin::signed(ii).into(), key, Vec::new()).unwrap(); + } + assert_eq!(Balances::free_balance(ii), 100); + if ii < 21 { + assert_ok!(CollatorSelection::add_invulnerable( + RuntimeOrigin::signed(RootAccount::get()), + ii + )); + } else { + assert_noop!( + CollatorSelection::add_invulnerable( + RuntimeOrigin::signed(RootAccount::get()), + ii + ), + Error::::TooManyInvulnerables + ); + } + } + let expected: Vec = (1..=20).collect(); + assert_eq!(CollatorSelection::invulnerables(), expected); + + // Cannot set too many Invulnerables + let too_many_invulnerables: Vec = (1..=21).collect(); + assert_noop!( + CollatorSelection::set_invulnerables( + RuntimeOrigin::signed(RootAccount::get()), + too_many_invulnerables + ), + Error::::TooManyInvulnerables + ); + assert_eq!(CollatorSelection::invulnerables(), expected); + }); +} + +#[test] +fn remove_invulnerable_works() { + new_test_ext().execute_with(|| { + initialize_to_block(1); + assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + + assert_ok!(CollatorSelection::add_invulnerable( + RuntimeOrigin::signed(RootAccount::get()), + 4 + )); + assert_ok!(CollatorSelection::add_invulnerable( + RuntimeOrigin::signed(RootAccount::get()), + 3 + )); + + assert_eq!(CollatorSelection::invulnerables(), vec![1, 2, 3, 4]); + + assert_ok!(CollatorSelection::remove_invulnerable( + RuntimeOrigin::signed(RootAccount::get()), + 2 + )); + + System::assert_last_event(RuntimeEvent::CollatorSelection( + crate::Event::InvulnerableRemoved { account_id: 2 }, + )); + assert_eq!(CollatorSelection::invulnerables(), vec![1, 3, 4]); + + // cannot remove invulnerable not in the list + assert_noop!( + CollatorSelection::remove_invulnerable(RuntimeOrigin::signed(RootAccount::get()), 2), + Error::::NotInvulnerable + ); + + // cannot remove without privilege + assert_noop!( + CollatorSelection::remove_invulnerable(RuntimeOrigin::signed(1), 3), + BadOrigin + ); + }); +} + #[test] fn set_desired_candidates_works() { new_test_ext().execute_with(|| { @@ -157,7 +286,7 @@ fn cannot_register_as_candidate_if_keys_not_registered() { new_test_ext().execute_with(|| { // can't 7 because keys not registered. assert_noop!( - CollatorSelection::register_as_candidate(RuntimeOrigin::signed(7)), + CollatorSelection::register_as_candidate(RuntimeOrigin::signed(42)), Error::::ValidatorNotRegistered ); }) diff --git a/pallets/collator-selection/src/weights.rs b/pallets/collator-selection/src/weights.rs index 874cec8ae36..6b02d28d673 100644 --- a/pallets/collator-selection/src/weights.rs +++ b/pallets/collator-selection/src/weights.rs @@ -27,6 +27,8 @@ use sp_std::marker::PhantomData; // The weight info trait for `pallet_collator_selection`. pub trait WeightInfo { fn set_invulnerables(_b: u32) -> Weight; + fn add_invulnerable(_b: u32) -> Weight; + fn remove_invulnerable(_b: u32) -> Weight; fn set_desired_candidates() -> Weight; fn set_candidacy_bond() -> Weight; fn register_as_candidate(_c: u32) -> Weight; @@ -80,6 +82,39 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().writes(2_u64.saturating_mul(r as u64))) .saturating_add(T::DbWeight::get().writes(2_u64.saturating_mul(c as u64))) } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// The range of component `b` is `[1, 99]`. + fn add_invulnerable(b: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `581 + b * (37 ±0)` + // Estimated: `4687 + b * (37 ±0)` + // Minimum execution time: 269_126_000 picoseconds. + Weight::from_parts(286_711_880, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 22_887 + .saturating_add(Weight::from_parts(813_399, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } // For backwards compatibility and tests @@ -126,4 +161,37 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().writes(2_u64.saturating_mul(r as u64))) .saturating_add(RocksDbWeight::get().writes(2_u64.saturating_mul(c as u64))) } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// The range of component `b` is `[1, 99]`. + fn add_invulnerable(b: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `581 + b * (37 ±0)` + // Estimated: `4687 + b * (37 ±0)` + // Minimum execution time: 269_126_000 picoseconds. + Weight::from_parts(286_711_880, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 22_887 + .saturating_add(Weight::from_parts(813_399, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(2)) + .saturating_add(RocksDbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(1)) + .saturating_add(RocksDbWeight::get().writes(1)) + } } diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 4e06604aaf5..e1f9fbe3dc2 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -768,7 +768,7 @@ pub type UncheckedExtrinsic = /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Migrations to apply on runtime upgrade. -pub type Migrations = (); +pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs index b3a9fa52bd8..7c518a45ddf 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs @@ -147,6 +147,39 @@ impl pallet_collator_selection::WeightInfo for WeightIn .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// The range of component `b` is `[1, 99]`. + fn add_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `581 + b * (37 ±0)` + // Estimated: `4687 + b * (37 ±0)` + // Minimum execution time: 269_126_000 picoseconds. + Weight::from_parts(286_711_880, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 22_887 + .saturating_add(Weight::from_parts(813_399, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: CollatorSelection Candidates (r:1 w:0) /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:999 w:0) diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 0ef469d2b31..3ce1058ab35 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -209,7 +209,9 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. }, + pallet_collator_selection::Call::set_invulnerables { .. } | + pallet_collator_selection::Call::add_invulnerable { .. } | + pallet_collator_selection::Call::remove_invulnerable { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index f9a8b96a309..518fb3c4cab 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -779,7 +779,7 @@ pub type UncheckedExtrinsic = /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Migrations to apply on runtime upgrade. -pub type Migrations = (); +pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs index d18f3072c3d..37c59255469 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs @@ -147,6 +147,39 @@ impl pallet_collator_selection::WeightInfo for WeightIn .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// The range of component `b` is `[1, 99]`. + fn add_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `581 + b * (37 ±0)` + // Estimated: `4687 + b * (37 ±0)` + // Minimum execution time: 269_126_000 picoseconds. + Weight::from_parts(286_711_880, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 22_887 + .saturating_add(Weight::from_parts(813_399, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: CollatorSelection Candidates (r:1 w:0) /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:999 w:0) diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/statemint/src/xcm_config.rs index ba2862742c1..82414a20a4b 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemint/src/xcm_config.rs @@ -212,7 +212,9 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. }, + pallet_collator_selection::Call::set_invulnerables { .. } | + pallet_collator_selection::Call::add_invulnerable { .. } | + pallet_collator_selection::Call::remove_invulnerable { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 4e72394636c..b988d9b6d34 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -764,7 +764,12 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Migrations to apply on runtime upgrade. -pub type Migrations = (); +pub type Migrations = ( + // v9420 + pallet_nfts::migration::v1::MigrateToV1, + // unreleased + pallet_collator_selection::migration::v1::MigrateToV1, +); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs index 5e7b72e9cd8..8b157d96d76 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs @@ -147,6 +147,39 @@ impl pallet_collator_selection::WeightInfo for WeightIn .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// The range of component `b` is `[1, 99]`. + fn add_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `581 + b * (37 ±0)` + // Estimated: `4687 + b * (37 ±0)` + // Minimum execution time: 269_126_000 picoseconds. + Weight::from_parts(286_711_880, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 22_887 + .saturating_add(Weight::from_parts(813_399, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: CollatorSelection Candidates (r:1 w:0) /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:999 w:0) diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 33c8e487054..a4dc99df33f 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -204,7 +204,9 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. }, + pallet_collator_selection::Call::set_invulnerables { .. } | + pallet_collator_selection::Call::add_invulnerable { .. } | + pallet_collator_selection::Call::remove_invulnerable { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs index b003c58ffb6..86964af6ced 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -108,6 +108,9 @@ pub type UncheckedExtrinsic = /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Migrations to apply on runtime upgrade. +pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); + /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -115,6 +118,7 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, + Migrations, >; impl_opaque_keys! { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs index 8a49dd2eb07..1d48699a2e8 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs @@ -147,6 +147,39 @@ impl pallet_collator_selection::WeightInfo for WeightIn .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// The range of component `b` is `[1, 99]`. + fn add_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `581 + b * (37 ±0)` + // Estimated: `4687 + b * (37 ±0)` + // Minimum execution time: 269_126_000 picoseconds. + Weight::from_parts(286_711_880, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 22_887 + .saturating_add(Weight::from_parts(813_399, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: CollatorSelection Candidates (r:1 w:0) /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:999 w:0) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs index 6f9c1542423..ed72909f0cb 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs @@ -142,7 +142,9 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. }, + pallet_collator_selection::Call::set_invulnerables { .. } | + pallet_collator_selection::Call::add_invulnerable { .. } | + pallet_collator_selection::Call::remove_invulnerable { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs index 5913df282d7..fd284576da0 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -108,6 +108,9 @@ pub type UncheckedExtrinsic = /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Migrations to apply on runtime upgrade. +pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); + /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -115,6 +118,7 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, + Migrations, >; impl_opaque_keys! { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs index cac72598bd3..bae3a058100 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs @@ -147,6 +147,39 @@ impl pallet_collator_selection::WeightInfo for WeightIn .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// The range of component `b` is `[1, 99]`. + fn add_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `581 + b * (37 ±0)` + // Estimated: `4687 + b * (37 ±0)` + // Minimum execution time: 269_126_000 picoseconds. + Weight::from_parts(286_711_880, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 22_887 + .saturating_add(Weight::from_parts(813_399, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: CollatorSelection Candidates (r:1 w:0) /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:999 w:0) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs index e2bf2dd4a95..804c7455b5a 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs @@ -145,7 +145,9 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. }, + pallet_collator_selection::Call::set_invulnerables { .. } | + pallet_collator_selection::Call::add_invulnerable { .. } | + pallet_collator_selection::Call::remove_invulnerable { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index b0f32c72fcf..ef645b93b55 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -122,6 +122,9 @@ pub type SignedExtra = ( pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Migrations to apply on runtime upgrade. +pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); + /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -129,6 +132,7 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, + Migrations, >; impl_opaque_keys! { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs index 175d98504ad..b66a8635e40 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs @@ -147,6 +147,39 @@ impl pallet_collator_selection::WeightInfo for WeightIn .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// The range of component `b` is `[1, 99]`. + fn add_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `581 + b * (37 ±0)` + // Estimated: `4687 + b * (37 ±0)` + // Minimum execution time: 269_126_000 picoseconds. + Weight::from_parts(286_711_880, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 22_887 + .saturating_add(Weight::from_parts(813_399, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: CollatorSelection Candidates (r:1 w:0) /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:999 w:0) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index a08f2f7c426..371af54797b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -178,7 +178,9 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. }, + pallet_collator_selection::Call::set_invulnerables { .. } | + pallet_collator_selection::Call::add_invulnerable { .. } | + pallet_collator_selection::Call::remove_invulnerable { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::DmpQueue(..) | diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs index 493fa611fe2..3aed385e404 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs @@ -627,7 +627,12 @@ pub type UncheckedExtrinsic = pub type CheckedExtrinsic = generic::CheckedExtrinsic; // All migrations executed on runtime upgrade as a nested tuple of types implementing // `OnRuntimeUpgrade`. Included migrations must be idempotent. -type Migrations = import_kusama_fellowship::Migration; +type Migrations = ( + // v9420 + import_kusama_fellowship::Migration, + // unreleased + pallet_collator_selection::migration::v1::MigrateToV1, +); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs index 3eee2a2014e..73961b722fa 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs @@ -147,6 +147,39 @@ impl pallet_collator_selection::WeightInfo for WeightIn .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// The range of component `b` is `[1, 99]`. + fn add_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `581 + b * (37 ±0)` + // Estimated: `4687 + b * (37 ±0)` + // Minimum execution time: 269_126_000 picoseconds. + Weight::from_parts(286_711_880, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 22_887 + .saturating_add(Weight::from_parts(813_399, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: CollatorSelection Candidates (r:1 w:0) /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:999 w:0) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index c8571ebc6f2..406209a4a4c 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -153,7 +153,9 @@ impl Contains for SafeCallFilter { pallet_collator_selection::Call::set_candidacy_bond { .. } | pallet_collator_selection::Call::register_as_candidate { .. } | pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. }, + pallet_collator_selection::Call::set_invulnerables { .. } | + pallet_collator_selection::Call::add_invulnerable { .. } | + pallet_collator_selection::Call::remove_invulnerable { .. }, ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | RuntimeCall::XcmpQueue(..) | diff --git a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index cbdbd5500b6..d90c60990c4 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -95,7 +95,10 @@ pub type SignedExtra = ( pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -pub type Migrations = (pallet_contracts::Migration,); +pub type Migrations = ( + pallet_contracts::Migration, + pallet_collator_selection::migration::v1::MigrateToV1, +); type EventRecord = frame_system::EventRecord< ::RuntimeEvent, diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index 01b9654006d..8ba89c803ce 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -123,8 +123,10 @@ pub type SignedExtra = ( pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -pub type Migrations = - (pallet_balances::migration::MigrateToTrackInactive,); +pub type Migrations = ( + pallet_balances::migration::MigrateToTrackInactive, + pallet_collator_selection::migration::v1::MigrateToV1, +); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< From 322fdc66337e7d9e9a9fd0c17f4d9fa9aa94d03d Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 30 May 2023 10:45:31 +0200 Subject: [PATCH 251/339] Allow both sides --- .../bridge-transfer/src/benchmarking.rs | 6 +- parachains/pallets/bridge-transfer/src/lib.rs | 42 +++---- .../runtimes/assets/statemine/Cargo.toml | 1 + .../runtimes/assets/statemine/src/lib.rs | 16 ++- .../assets/statemine/src/weights/xcm/mod.rs | 2 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 12 ++ .../assets/statemine/src/xcm_config.rs | 36 +++++- .../runtimes/assets/statemine/tests/tests.rs | 119 ++++++++++++------ .../assets/test-utils/src/test_cases.rs | 113 +---------------- .../runtimes/assets/westmint/Cargo.toml | 1 + .../runtimes/assets/westmint/src/lib.rs | 26 ++-- .../assets/westmint/src/xcm_config.rs | 88 +++++++++++-- .../runtimes/assets/westmint/tests/tests.rs | 114 ++++++++++++----- 13 files changed, 333 insertions(+), 243 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index 15adcb2fc42..08a9672fe4d 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -64,7 +64,8 @@ benchmarks! { // we don't care about message hash or sender cost here, just check that the transfer has been initiated let actual_event = frame_system::Pallet::::events().pop().map(|r| r.event); let expected_event: ::RuntimeEvent = Event::TransferInitiated { - message_hash: Default::default(), + message_id: Default::default(), + forwarded_message_id: Default::default(), sender_cost: Default::default(), }.into(); assert!(matches!(actual_event, Some(expected_event))); @@ -93,7 +94,8 @@ benchmarks! { // we don't care about message hash or sender cost here, just check that the transfer has been initiated let actual_event = frame_system::Pallet::::events().pop().map(|r| r.event); let expected_event: ::RuntimeEvent = Event::TransferInitiated { - message_hash: Default::default(), + message_id: Default::default(), + forwarded_message_id: Default::default(), sender_cost: Default::default(), }.into(); assert!(matches!(actual_event, Some(expected_event))); diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index f73f4411deb..4ad8ef11cbb 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -803,8 +803,9 @@ pub(crate) mod tests { }; use sp_version::RuntimeVersion; use xcm_builder::{ - AccountId32Aliases, CurrencyAdapter, EnsureXcmOrigin, ExporterFor, IsConcrete, - SiblingParachainConvertsVia, SignedToAccountId32, UnpaidRemoteExporter, + AccountId32Aliases, CurrencyAdapter, EnsureXcmOrigin, ExporterFor, + GlobalConsensusParachainConvertsFor, IsConcrete, SiblingParachainConvertsVia, + SignedToAccountId32, UnpaidRemoteExporter, }; use xcm_executor::traits::Convert; @@ -881,7 +882,7 @@ pub(crate) mod tests { type MaxLocks = (); type MaxReserves = MaxReserves; type ReserveIdentifier = [u8; 8]; - type HoldIdentifier = (); + type RuntimeHoldReason = RuntimeHoldReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; @@ -975,6 +976,9 @@ pub(crate) mod tests { SiblingParachainConvertsVia, // Straight up local `AccountId32` origins just alias directly to `AccountId`. AccountId32Aliases, + // Different global consensus parachain sovereign account. + // (Used for over-bridge transfers and reserve processing) + GlobalConsensusParachainConvertsFor, ); /// Means for transacting the native currency on this chain. @@ -1180,17 +1184,16 @@ pub(crate) mod tests { bridged_network, Box::new(test_bridge_config().1), )); - let bridge_location = AllowedExporters::::get(bridged_network) + let target_location = AllowedExporters::::get(bridged_network) .expect("stored BridgeConfig for bridged_network") - .bridge_location; + .allowed_target_location; // checks before assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); assert_eq!(Balances::free_balance(&user_account), user_account_init_balance); - let bridge_location_as_sovereign_account = - LocationToAccountId::convert_ref(bridge_location) - .expect("converted bridge location as accountId"); - assert_eq!(Balances::free_balance(&bridge_location_as_sovereign_account), 0); + let reserve_account = LocationToAccountId::convert_ref(target_location) + .expect("converted target_location as accountId"); + assert_eq!(Balances::free_balance(&reserve_account), 0); // trigger transfer_asset_via_bridge - should trigger new ROUTED_MESSAGE let asset = MultiAsset { @@ -1218,7 +1221,7 @@ pub(crate) mod tests { user_account_init_balance - balance_to_transfer ); // check reserve account increased - assert_eq!(Balances::free_balance(&bridge_location_as_sovereign_account), 15); + assert_eq!(Balances::free_balance(&reserve_account), 15); // check events let events = System::events(); @@ -1246,8 +1249,8 @@ pub(crate) mod tests { }) { assert!(xcm.0.iter().any(|instr| matches!(instr, UnpaidExecution { .. }))); assert!(xcm.0.iter().any(|instr| matches!(instr, ReserveAssetDeposited(..)))); - assert!(xcm.0.iter().any(|instr| matches!(instr, ClearOrigin))); assert!(xcm.0.iter().any(|instr| matches!(instr, DepositAsset { .. }))); + assert!(xcm.0.iter().any(|instr| matches!(instr, SetTopic { .. }))); } else { assert!(false, "Does not contains [`ExportMessage`], fired_xcm: {:?}", fired_xcm); } @@ -1283,19 +1286,17 @@ pub(crate) mod tests { }), )); - let bridge_location = AllowedExporters::::get(bridged_network) + let target_location = AllowedExporters::::get(bridged_network) .expect("stored BridgeConfig for bridged_network") - .bridge_location; + .allowed_target_location; // checks before assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); let user_balance_before = Balances::free_balance(&user_account); assert_eq!(user_balance_before, user_account_init_balance); - let bridge_location_as_sovereign_account = - LocationToAccountId::convert_ref(bridge_location) - .expect("converted bridge location as accountId"); - let reserve_account_before = - Balances::free_balance(&bridge_location_as_sovereign_account); + let reserve_account = LocationToAccountId::convert_ref(target_location) + .expect("converted target_location as accountId"); + let reserve_account_before = Balances::free_balance(&reserve_account); assert_eq!(reserve_account_before, 0); // trigger transfer_asset_via_bridge - should trigger new ROUTED_MESSAGE @@ -1331,10 +1332,7 @@ pub(crate) mod tests { // checks after // balances are untouched assert_eq!(Balances::free_balance(&user_account), user_balance_before); - assert_eq!( - Balances::free_balance(&bridge_location_as_sovereign_account), - reserve_account_before - ); + assert_eq!(Balances::free_balance(&reserve_account), reserve_account_before); // no xcm messages fired assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); // check events (no events because of rollback) diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index 73bf2a90fb6..fe56ac17f82 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -111,6 +111,7 @@ runtime-benchmarks = [ "xcm-builder/runtime-benchmarks", "cumulus-pallet-parachain-system/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", + "cumulus-pallet-parachain-system/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 3d8d4b37a56..5df48f78925 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -700,10 +700,8 @@ impl pallet_bridge_transfer::Config for Runtime { type UniversalLocation = UniversalLocation; type WeightInfo = weights::pallet_bridge_transfer::WeightInfo; type AdminOrigin = AssetsForceOrigin; - // no transfer allowed in (now) - type UniversalAliasesLimit = ConstU32<0>; - // no transfer allowed in (now) - type ReserveLocationsLimit = ConstU32<0>; + type UniversalAliasesLimit = ConstU32<24>; + type ReserveLocationsLimit = ConstU32<8>; type AssetTransactor = AssetTransactors; type BridgeXcmSender = BridgeXcmSender; type TransferAssetOrigin = EnsureXcmOrigin; @@ -1136,7 +1134,15 @@ impl_runtime_apis! { } fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { - Err(BenchmarkError::Skip) + match <::BenchmarkHelper as pallet_bridge_transfer::BenchmarkHelper>::universal_alias() { + Some((location, junction)) => { + >::insert_universal_alias_for_benchmarks( + (location.clone().try_into().unwrap(), junction) + ); + Ok((location.clone().try_into().unwrap(), junction)) + }, + None => Err(BenchmarkError::Skip) + } } fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs index 23322418d2a..c35e421cc24 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs @@ -214,7 +214,7 @@ impl XcmWeightInfo for StatemineXcmWeight { XcmGeneric::::clear_transact_status() } fn universal_origin(_: &Junction) -> Weight { - Weight::MAX + XcmGeneric::::universal_origin() } fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { Weight::MAX diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 9bd3f11c969..ce239188fb2 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -331,6 +331,18 @@ impl WeightInfo { // Minimum execution time: 3_105_000 picoseconds. Weight::from_parts(3_160_000, 0) } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:0) + // Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) + pub fn universal_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `158` + // Estimated: `7373` + // Minimum execution time: 10_161_000 picoseconds. + Weight::from_parts(10_414_000, 7373) + .saturating_add(T::DbWeight::get().reads(2)) + } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 2e0c1202b25..46bb2180c8a 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -19,13 +19,15 @@ use super::{ RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use assets_common::matching::{ - FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, + FromSiblingParachain, IsDifferentGlobalConsensusConcreteAsset, IsForeignConcreteAsset, + StartsWith, StartsWithExplicitGlobalConsensus, }; use frame_support::{ match_types, parameter_types, traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, }; use frame_system::EnsureRoot; +use pallet_bridge_transfer::impls::{AllowedUniversalAliasesOf, IsAllowedReserveOf}; use pallet_xcm::XcmPassthrough; use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; use polkadot_parachain::primitives::Sibling; @@ -378,10 +380,12 @@ impl xcm_executor::Config for XcmConfig { type XcmSender = XcmRouter; type AssetTransactor = AssetTransactors; type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Statemine does not recognize a reserve location for any asset. This does not prevent // Statemine acting _as_ a reserve location for KSM and assets created under `pallet-assets`. // For KSM, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = (); + type IsReserve = IsAllowedReserveOf< + Runtime, + IsDifferentGlobalConsensusConcreteAsset, + >; // We allow: // - teleportation of KSM // - teleportation of sibling parachain's assets (as ForeignCreators) @@ -420,7 +424,7 @@ impl xcm_executor::Config for XcmConfig { type AssetExchanger = (); type FeeManager = (); type MessageExporter = (); - type UniversalAliases = Nothing; + type UniversalAliases = AllowedUniversalAliasesOf; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; } @@ -513,6 +517,11 @@ impl BridgeTransferBenchmarksHelper { MultiLocation::new(2, X2(GlobalConsensus(Polkadot), Parachain(1000))) } + /// Max fee we are willing to pay on the bridged side + fn allowed_target_location_max_fee() -> Option { + Some((MultiLocation::parent(), 50_000_000_000_u128).into()) + } + /// Identifier of the sibling bridge-hub parachain. fn bridge_hub_para_id() -> u32 { 1002 @@ -531,11 +540,28 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` bridge_location_fee: None, allowed_target_location: Self::allowed_target_location(), - max_target_location_fee: None, + max_target_location_fee: Self::allowed_target_location_max_fee(), }, )) } + fn universal_alias() -> Option<(xcm::VersionedMultiLocation, Junction)> { + Some(( + xcm::VersionedMultiLocation::V3(MultiLocation { + parents: 1, + interior: X1(Parachain(Self::bridge_hub_para_id())), + }), + GlobalConsensus(Polkadot), + )) + } + + fn reserve_location() -> Option { + Some(xcm::VersionedMultiLocation::V3(MultiLocation { + parents: 2, + interior: X2(GlobalConsensus(Polkadot), Parachain(1000)), + })) + } + fn prepare_asset_transfer( ) -> Option<(RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation)> { use frame_support::traits::Currency; diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index be8d0840448..cea7157b6c8 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -24,6 +24,7 @@ use xcm::latest::prelude::*; use xcm_executor::traits::{Convert, Identity, JustTry, WeightTrader}; const ALICE: [u8; 32] = [1u8; 32]; +const BOB: [u8; 32] = [0u8; 32]; const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; type AssetIdForTrustBackedAssetsConvert = @@ -605,45 +606,83 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p }) ); -asset_test_utils::include_can_governance_change_bridge_transfer_out_configuration!( - Runtime, - XcmConfig, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), - _ => None, - } - }) -); +#[test] +fn can_governance_change_bridge_transfer_out_configuration() { + asset_test_utils::test_cases::can_governance_change_bridge_transfer_out_configuration::< + Runtime, + XcmConfig, + >( + collator_session_keys(), + Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }), + ) +} -asset_test_utils::include_initiate_transfer_asset_via_bridge_for_native_asset_works!( - Runtime, - XcmConfig, - ParachainSystem, - XcmpQueue, - LocationToAccountId, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), +#[test] +fn initiate_transfer_asset_via_bridge_for_native_asset_works() { + asset_test_utils::test_cases::initiate_transfer_asset_via_bridge_for_native_asset_works::< + Runtime, + XcmConfig, + ParachainSystem, + XcmpQueue, + LocationToAccountId, + >( + collator_session_keys(), + ExistentialDeposit::get(), AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }) -); + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + ) +} + +#[test] +fn can_governance_change_bridge_transfer_in_configuration() { + asset_test_utils::test_cases::can_governance_change_bridge_transfer_in_configuration::< + Runtime, + XcmConfig, + >( + collator_session_keys(), + Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }), + ) +} + +#[test] +fn receive_reserve_asset_deposited_from_different_consensus_works() { + asset_test_utils::test_cases::receive_reserve_asset_deposited_from_different_consensus_works::< + Runtime, + XcmConfig, + LocationToAccountId, + ForeignAssetsInstance, + >( + collator_session_keys(), + ExistentialDeposit::get(), + AccountId::from(BOB), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + ) +} diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 09825214387..8d58da85b74 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -1424,29 +1424,6 @@ pub fn can_governance_change_bridge_transfer_out_configuration { - #[test] - fn can_governance_change_bridge_transfer_out_configuration() { - $crate::test_cases::can_governance_change_bridge_transfer_out_configuration::< - $runtime, - $xcm_config, - >( - $collator_session_key, - $runtime_call_encode, - $unwrap_pallet_bridge_transfer_event, - ) - } - } -); - /// Test-case makes sure that `Runtime` can manage `bridge_transfer in` configuration by governance pub fn can_governance_change_bridge_transfer_in_configuration( collator_session_keys: CollatorSessionKeys, @@ -1511,29 +1488,6 @@ pub fn can_governance_change_bridge_transfer_in_configuration { - #[test] - fn can_governance_change_bridge_transfer_in_configuration() { - $crate::test_cases::can_governance_change_bridge_transfer_in_configuration::< - $runtime, - $xcm_config, - >( - $collator_session_key, - $runtime_call_encode, - $unwrap_pallet_bridge_transfer_event, - ) - } - } -); - /// Test-case makes sure that `Runtime` can initiate transfer of assets via bridge pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< Runtime, @@ -1838,41 +1792,7 @@ pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< }) } -#[macro_export] -macro_rules! include_initiate_transfer_asset_via_bridge_for_native_asset_works( - ( - $runtime:path, - $xcm_config:path, - $hrmp_channel_opener:path, - $hrmp_channel_source:path, - $location_to_account_id:path, - $collator_session_key:expr, - $existential_deposit:expr, - $unwrap_pallet_bridge_transfer_event:expr, - $unwrap_xcmp_queue_event:expr - ) => { - #[test] - fn initiate_transfer_asset_via_bridge_for_native_asset_works() { - const ALICE: [u8; 32] = [1u8; 32]; - let alice_account = parachains_common::AccountId::from(ALICE); - - $crate::test_cases::initiate_transfer_asset_via_bridge_for_native_asset_works::< - $runtime, - $xcm_config, - $hrmp_channel_opener, - $hrmp_channel_source, - $location_to_account_id - >( - $collator_session_key, - $existential_deposit, - alice_account, - $unwrap_pallet_bridge_transfer_event, - $unwrap_xcmp_queue_event - ) - } - } -); - +/// Test-case makes sure that `Runtime` can process `ReserveAssetDeposited`. pub fn receive_reserve_asset_deposited_from_different_consensus_works< Runtime, XcmConfig, @@ -2109,34 +2029,3 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< ); }) } - -#[macro_export] -macro_rules! include_receive_reserve_asset_deposited_from_different_consensus_works( - ( - $runtime:path, - $xcm_config:path, - $location_to_account_id:path, - $assets_pallet_instance:path, - $collator_session_key:expr, - $existential_deposit:expr, - $unwrap_pallet_xcm_event:expr - ) => { - #[test] - fn receive_reserve_asset_deposited_from_different_consensus_works() { - const BOB: [u8; 32] = [2u8; 32]; - let target_account = parachains_common::AccountId::from(BOB); - - $crate::test_cases::receive_reserve_asset_deposited_from_different_consensus_works::< - $runtime, - $xcm_config, - $location_to_account_id, - $assets_pallet_instance - >( - $collator_session_key, - $existential_deposit, - target_account, - $unwrap_pallet_xcm_event - ) - } - } -); diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/westmint/Cargo.toml index 7c22d119abb..5c9dc4a4c9f 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/westmint/Cargo.toml @@ -103,6 +103,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", + "cumulus-pallet-parachain-system/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index e12e7e9f944..9ae9511afaa 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -80,9 +80,13 @@ use assets_common::{ foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, }; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; +use xcm_builder::EnsureXcmOrigin; use xcm_executor::XcmExecutor; -use crate::xcm_config::{ForeignCreatorsSovereignAccountOf, UniversalLocation}; +use crate::xcm_config::{ + AssetTransactors, BridgeXcmSender, ForeignCreatorsSovereignAccountOf, LocalOriginToLocation, + UniversalLocation, +}; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; impl_opaque_keys! { @@ -699,20 +703,12 @@ impl pallet_bridge_transfer::Config for Runtime { type AdminOrigin = AssetsForceOrigin; type UniversalAliasesLimit = ConstU32<24>; type ReserveLocationsLimit = ConstU32<8>; - // no transfer allowed out (now) - type AssetTransactor = (); - // no transfer allowed out (now) - type BridgeXcmSender = (); - // no transfer allowed out (now) - type TransferAssetOrigin = - frame_support::traits::NeverEnsureOrigin; - // no transfer allowed out (now) - type MaxAssetsLimit = ConstU8<0>; - // no transfer allowed out (now) - type TransferPingOrigin = - frame_support::traits::NeverEnsureOrigin; - // no transfer allowed out (now) - type PingMessageBuilder = (); + type AssetTransactor = AssetTransactors; + type BridgeXcmSender = BridgeXcmSender; + type TransferAssetOrigin = EnsureXcmOrigin; + type MaxAssetsLimit = ConstU8<1>; + type TransferPingOrigin = EnsureXcmOrigin; + type PingMessageBuilder = pallet_bridge_transfer::UnpaidTrapMessageBuilder>; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = xcm_config::BridgeTransferBenchmarksHelper; } diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 5146e403c0d..20f5578a5f1 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -14,9 +14,9 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ForeignAssets, - ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, BridgeTransfer, + ForeignAssets, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, + RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use assets_common::matching::{ FromSiblingParachain, IsDifferentGlobalConsensusConcreteAsset, IsForeignConcreteAsset, @@ -40,8 +40,8 @@ use xcm_builder::{ GlobalConsensusParachainConvertsFor, IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UnpaidRemoteExporter, + UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -498,6 +498,9 @@ impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { } } +/// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus +pub type BridgeXcmSender = UnpaidRemoteExporter; + /// Benchmarks helper for over-bridge transfer pallet. #[cfg(feature = "runtime-benchmarks")] pub struct BridgeTransferBenchmarksHelper; @@ -509,6 +512,11 @@ impl BridgeTransferBenchmarksHelper { MultiLocation::new(2, X2(GlobalConsensus(Kusama), Parachain(1000))) } + /// Max fee we are willing to pay on the bridged side + fn allowed_target_location_max_fee() -> Option { + Some((MultiLocation::parent(), 50_000_000_000_u128).into()) + } + /// Identifier of the sibling bridge-hub parachain. fn bridge_hub_para_id() -> u32 { 1002 @@ -522,12 +530,12 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe Kusama, pallet_bridge_transfer::BridgeConfig { bridge_location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), - // TODO: right now `UnpaidRemoteExporter` is used to send XCM messages and it requires + // Right now `UnpaidRemoteExporter` is used to send XCM messages and it requires // fee to be `None`. If we're going to change that (are we?), then we should replace // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` bridge_location_fee: None, allowed_target_location: Self::allowed_target_location(), - max_target_location_fee: None, + max_target_location_fee: Self::allowed_target_location_max_fee(), }, )) } @@ -548,4 +556,70 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe interior: X2(GlobalConsensus(Kusama), Parachain(1000)), })) } + + fn prepare_asset_transfer( + ) -> Option<(RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation)> { + use frame_support::traits::Currency; + + // our `BridgeXcmSender` assumes that the HRMP channel is opened between this + // parachain and the sibling bridge-hub parachain + cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( + Self::bridge_hub_para_id().into(), + ); + + // sender account + let sender_account = AccountId::from([42u8; 32]); + + // We need root origin to create asset + let minimum_asset_balance = 3333333_u128; + let local_asset_id = 1; + frame_support::assert_ok!(Assets::force_create( + RuntimeOrigin::root(), + local_asset_id.into(), + sender_account.clone().into(), + true, + minimum_asset_balance + )); + + // We mint enough asset for the account to exist for assets + frame_support::assert_ok!(Assets::mint( + RuntimeOrigin::signed(sender_account.clone()), + local_asset_id.into(), + sender_account.clone().into(), + minimum_asset_balance * 4 + )); + + // deposit enough funds to the sender account + let existential_deposit = crate::ExistentialDeposit::get(); + let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); + + // finally - prepare assets and destination (pallet_assets is worse than pallet_balances) + use xcm_executor::traits::Convert; + let asset_id_location = assets_common::AssetIdForTrustBackedAssetsConvert::< + TrustBackedAssetsPalletLocation, + >::reverse_ref(local_asset_id) + .unwrap(); + let asset: MultiAsset = (Concrete(asset_id_location), minimum_asset_balance * 2).into(); + + let assets = xcm::VersionedMultiAssets::V3(asset.into()); + let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); + + Some((RuntimeOrigin::signed(sender_account), assets, destination)) + } + + fn prepare_ping_transfer() -> Option<(RuntimeOrigin, xcm::VersionedMultiLocation)> { + // our `BridgeXcmSender` assumes that the HRMP channel is opened between this + // parachain and the sibling bridge-hub parachain + cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( + Self::bridge_hub_para_id().into(), + ); + + // sender account + let sender_account = AccountId::from([42u8; 32]); + + // finally - prepare destination + let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); + + Some((RuntimeOrigin::signed(sender_account), destination)) + } } diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index cd555167622..da4636be0a6 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -14,7 +14,7 @@ pub use westmint_runtime::{ CheckingAccount, LocationToAccountId, TrustBackedAssetsPalletLocation, XcmConfig, }, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, - ParachainSystem, Runtime, SessionKeys, System, TrustBackedAssetsInstance, + ParachainSystem, Runtime, SessionKeys, System, TrustBackedAssetsInstance, XcmpQueue, }; use westmint_runtime::{ xcm_config::{ @@ -30,6 +30,7 @@ use xcm_executor::{ }; const ALICE: [u8; 32] = [1u8; 32]; +const BOB: [u8; 32] = [0u8; 32]; const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; type AssetIdForTrustBackedAssetsConvert = @@ -609,41 +610,86 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p }) ); -asset_test_utils::include_can_governance_change_bridge_transfer_in_configuration!( - Runtime, - XcmConfig, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), - _ => None, - } - }) -); +#[test] +fn can_governance_change_bridge_transfer_out_configuration() { + asset_test_utils::test_cases::can_governance_change_bridge_transfer_out_configuration::< + Runtime, + XcmConfig, + >( + collator_session_keys(), + Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }), + ) +} -asset_test_utils::include_receive_reserve_asset_deposited_from_different_consensus_works!( - Runtime, - XcmConfig, - LocationToAccountId, - ForeignAssetsInstance, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), +#[test] +fn initiate_transfer_asset_via_bridge_for_native_asset_works() { + asset_test_utils::test_cases::initiate_transfer_asset_via_bridge_for_native_asset_works::< + Runtime, + XcmConfig, + ParachainSystem, + XcmpQueue, + LocationToAccountId, + >( + collator_session_keys(), + ExistentialDeposit::get(), AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }) -); + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + ) +} + +#[test] +fn can_governance_change_bridge_transfer_in_configuration() { + asset_test_utils::test_cases::can_governance_change_bridge_transfer_in_configuration::< + Runtime, + XcmConfig, + >( + collator_session_keys(), + Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }), + ) +} + +#[test] +fn receive_reserve_asset_deposited_from_different_consensus_works() { + asset_test_utils::test_cases::receive_reserve_asset_deposited_from_different_consensus_works::< + Runtime, + XcmConfig, + LocationToAccountId, + ForeignAssetsInstance, + >( + collator_session_keys(), + ExistentialDeposit::get(), + AccountId::from(BOB), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + ) +} #[test] fn plain_receive_teleported_asset_works() { From b8735887f3e445e4ab9a0ea24fcaf5b18d930ac2 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Tue, 30 May 2023 15:12:48 +0000 Subject: [PATCH 252/339] ".git/.scripts/commands/bench/bench.sh" xcm statemine assets pallet_xcm_benchmarks::generic --- .../xcm/pallet_xcm_benchmarks_generic.rs | 179 ++++++++++-------- 1 file changed, 96 insertions(+), 83 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index ce239188fb2..04adea50076 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,26 +17,27 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 // Executed Command: -// ./artifacts/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=statemine-dev +// --steps=50 +// --repeat=20 +// --extrinsic=* // --execution=wasm // --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json +// --chain=statemine-dev // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +// --template=./templates/xcm-bench-template.hbs +// --output=./parachains/runtimes/assets/statemine/src/weights/xcm/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,6 +51,8 @@ pub struct WeightInfo(PhantomData); impl WeightInfo { // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -64,17 +67,17 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 473_259_000 picoseconds. - Weight::from_parts(474_680_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 344_397_000 picoseconds. + Weight::from_parts(349_695_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn buy_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_502_000 picoseconds. - Weight::from_parts(4_557_000, 0) + // Minimum execution time: 3_726_000 picoseconds. + Weight::from_parts(3_944_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,61 +85,63 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `69` // Estimated: `3534` - // Minimum execution time: 11_743_000 picoseconds. - Weight::from_parts(12_010_000, 3534) + // Minimum execution time: 10_846_000 picoseconds. + Weight::from_parts(11_114_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 15_514_000 picoseconds. - Weight::from_parts(15_798_000, 0) + // Minimum execution time: 13_351_000 picoseconds. + Weight::from_parts(13_739_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_760_000 picoseconds. - Weight::from_parts(4_935_000, 0) + // Minimum execution time: 3_954_000 picoseconds. + Weight::from_parts(4_148_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_093_000 picoseconds. - Weight::from_parts(3_170_000, 0) + // Minimum execution time: 2_621_000 picoseconds. + Weight::from_parts(2_727_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_160_000 picoseconds. - Weight::from_parts(3_324_000, 0) + // Minimum execution time: 2_570_000 picoseconds. + Weight::from_parts(2_661_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_076_000 picoseconds. - Weight::from_parts(3_135_000, 0) + // Minimum execution time: 2_608_000 picoseconds. + Weight::from_parts(2_667_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_245_000 picoseconds. - Weight::from_parts(4_344_000, 0) + // Minimum execution time: 3_508_000 picoseconds. + Weight::from_parts(3_596_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_093_000 picoseconds. - Weight::from_parts(3_170_000, 0) + // Minimum execution time: 2_575_000 picoseconds. + Weight::from_parts(2_657_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -151,10 +156,10 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 27_368_000 picoseconds. - Weight::from_parts(27_731_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 27_743_000 picoseconds. + Weight::from_parts(28_461_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } // Storage: PolkadotXcm AssetTraps (r:1 w:1) // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) @@ -162,8 +167,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `126` // Estimated: `3591` - // Minimum execution time: 17_634_000 picoseconds. - Weight::from_parts(18_068_000, 3591) + // Minimum execution time: 16_053_000 picoseconds. + Weight::from_parts(16_264_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,11 +176,13 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_142_000 picoseconds. - Weight::from_parts(3_195_000, 0) + // Minimum execution time: 2_572_000 picoseconds. + Weight::from_parts(2_633_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -190,10 +197,10 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 28_784_000 picoseconds. - Weight::from_parts(29_246_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) + // Minimum execution time: 30_340_000 picoseconds. + Weight::from_parts(31_234_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(4)) } // Storage: PolkadotXcm VersionNotifyTargets (r:0 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -201,12 +208,14 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_260_000 picoseconds. - Weight::from_parts(5_398_000, 0) + // Minimum execution time: 4_829_000 picoseconds. + Weight::from_parts(5_059_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -221,48 +230,50 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 528_849_000 picoseconds. - Weight::from_parts(530_923_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 387_501_000 picoseconds. + Weight::from_parts(390_773_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 151_252_000 picoseconds. - Weight::from_parts(153_485_000, 0) + // Minimum execution time: 118_955_000 picoseconds. + Weight::from_parts(120_471_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 14_939_000 picoseconds. - Weight::from_parts(15_154_000, 0) + // Minimum execution time: 11_763_000 picoseconds. + Weight::from_parts(11_902_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_231_000 picoseconds. - Weight::from_parts(3_308_000, 0) + // Minimum execution time: 2_700_000 picoseconds. + Weight::from_parts(2_779_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_130_000 picoseconds. - Weight::from_parts(3_220_000, 0) + // Minimum execution time: 2_609_000 picoseconds. + Weight::from_parts(2_664_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_366_000 picoseconds. - Weight::from_parts(3_458_000, 0) + // Minimum execution time: 2_784_000 picoseconds. + Weight::from_parts(2_898_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -277,20 +288,22 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 31_212_000 picoseconds. - Weight::from_parts(31_656_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 31_631_000 picoseconds. + Weight::from_parts(32_254_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn expect_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_766_000 picoseconds. - Weight::from_parts(5_968_000, 0) + // Minimum execution time: 5_333_000 picoseconds. + Weight::from_parts(10_284_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -305,31 +318,31 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 27_754_000 picoseconds. - Weight::from_parts(28_064_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 28_696_000 picoseconds. + Weight::from_parts(42_937_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn clear_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_169_000 picoseconds. - Weight::from_parts(3_269_000, 0) + // Minimum execution time: 2_715_000 picoseconds. + Weight::from_parts(2_807_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_106_000 picoseconds. - Weight::from_parts(3_184_000, 0) + // Minimum execution time: 2_661_000 picoseconds. + Weight::from_parts(2_723_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_105_000 picoseconds. - Weight::from_parts(3_160_000, 0) + // Minimum execution time: 2_642_000 picoseconds. + Weight::from_parts(2_733_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -338,23 +351,23 @@ impl WeightInfo { pub fn universal_origin() -> Weight { // Proof Size summary in bytes: // Measured: `158` - // Estimated: `7373` - // Minimum execution time: 10_161_000 picoseconds. - Weight::from_parts(10_414_000, 7373) + // Estimated: `5884` + // Minimum execution time: 9_621_000 picoseconds. + Weight::from_parts(9_838_000, 5884) .saturating_add(T::DbWeight::get().reads(2)) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_105_000 picoseconds. - Weight::from_parts(3_194_000, 0) + // Minimum execution time: 2_705_000 picoseconds. + Weight::from_parts(2_755_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_321_000 picoseconds. - Weight::from_parts(3_412_000, 0) + // Minimum execution time: 2_842_000 picoseconds. + Weight::from_parts(2_920_000, 0) } } From 4bac3e72ba0512db2acdba762e740fa429235ed3 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Tue, 30 May 2023 16:58:25 +0000 Subject: [PATCH 253/339] ".git/.scripts/commands/bench/bench.sh" xcm westmint assets pallet_xcm_benchmarks::generic --- .../xcm/pallet_xcm_benchmarks_generic.rs | 211 ++++++++++-------- 1 file changed, 112 insertions(+), 99 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index fc4409df5b1..2d4ce9ab570 100644 --- a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,26 +17,27 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 // Executed Command: -// ./artifacts/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=westmint-dev +// --steps=50 +// --repeat=20 +// --extrinsic=* // --execution=wasm // --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json +// --chain=westmint-dev // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +// --template=./templates/xcm-bench-template.hbs +// --output=./parachains/runtimes/assets/westmint/src/weights/xcm/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,6 +51,8 @@ pub struct WeightInfo(PhantomData); impl WeightInfo { // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -62,81 +65,83 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_holding() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 361_717_000 picoseconds. - Weight::from_parts(362_438_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 346_394_000 picoseconds. + Weight::from_parts(350_270_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn buy_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_952_000 picoseconds. - Weight::from_parts(4_060_000, 0) + // Minimum execution time: 3_961_000 picoseconds. + Weight::from_parts(4_107_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) pub fn query_response() -> Weight { // Proof Size summary in bytes: - // Measured: `69` - // Estimated: `3534` - // Minimum execution time: 10_984_000 picoseconds. - Weight::from_parts(11_204_000, 3534) + // Measured: `103` + // Estimated: `3568` + // Minimum execution time: 10_701_000 picoseconds. + Weight::from_parts(11_032_000, 3568) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_942_000 picoseconds. - Weight::from_parts(14_077_000, 0) + // Minimum execution time: 12_944_000 picoseconds. + Weight::from_parts(13_289_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_242_000 picoseconds. - Weight::from_parts(4_354_000, 0) + // Minimum execution time: 4_222_000 picoseconds. + Weight::from_parts(4_366_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_802_000 picoseconds. - Weight::from_parts(2_851_000, 0) + // Minimum execution time: 2_625_000 picoseconds. + Weight::from_parts(2_734_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_797_000 picoseconds. - Weight::from_parts(2_899_000, 0) + // Minimum execution time: 2_704_000 picoseconds. + Weight::from_parts(2_759_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_767_000 picoseconds. - Weight::from_parts(2_837_000, 0) + // Minimum execution time: 2_608_000 picoseconds. + Weight::from_parts(2_668_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_669_000 picoseconds. - Weight::from_parts(3_721_000, 0) + // Minimum execution time: 3_518_000 picoseconds. + Weight::from_parts(3_612_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_719_000 picoseconds. - Weight::from_parts(2_789_000, 0) + // Minimum execution time: 2_607_000 picoseconds. + Weight::from_parts(2_661_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -149,21 +154,21 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_error() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 25_261_000 picoseconds. - Weight::from_parts(25_779_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 27_012_000 picoseconds. + Weight::from_parts(27_677_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } // Storage: PolkadotXcm AssetTraps (r:1 w:1) // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) pub fn claim_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `126` - // Estimated: `3591` - // Minimum execution time: 16_124_000 picoseconds. - Weight::from_parts(16_394_000, 3591) + // Measured: `160` + // Estimated: `3625` + // Minimum execution time: 15_768_000 picoseconds. + Weight::from_parts(16_080_000, 3625) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,11 +176,13 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_757_000 picoseconds. - Weight::from_parts(2_847_000, 0) + // Minimum execution time: 2_575_000 picoseconds. + Weight::from_parts(2_675_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -188,12 +195,12 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 27_522_000 picoseconds. - Weight::from_parts(27_997_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 30_215_000 picoseconds. + Weight::from_parts(30_714_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(4)) } // Storage: PolkadotXcm VersionNotifyTargets (r:0 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -201,12 +208,14 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_975_000 picoseconds. - Weight::from_parts(5_129_000, 0) + // Minimum execution time: 4_803_000 picoseconds. + Weight::from_parts(4_927_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -219,50 +228,52 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 398_886_000 picoseconds. - Weight::from_parts(400_023_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 387_266_000 picoseconds. + Weight::from_parts(391_770_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 120_499_000 picoseconds. - Weight::from_parts(120_883_000, 0) + // Minimum execution time: 118_603_000 picoseconds. + Weight::from_parts(120_201_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_140_000 picoseconds. - Weight::from_parts(13_404_000, 0) + // Minimum execution time: 11_815_000 picoseconds. + Weight::from_parts(12_240_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_861_000 picoseconds. - Weight::from_parts(2_920_000, 0) + // Minimum execution time: 2_671_000 picoseconds. + Weight::from_parts(2_776_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_791_000 picoseconds. - Weight::from_parts(2_843_000, 0) + // Minimum execution time: 2_624_000 picoseconds. + Weight::from_parts(2_709_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_992_000 picoseconds. - Weight::from_parts(3_057_000, 0) + // Minimum execution time: 2_816_000 picoseconds. + Weight::from_parts(2_898_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -275,22 +286,24 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn query_pallet() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 29_505_000 picoseconds. - Weight::from_parts(30_219_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 31_286_000 picoseconds. + Weight::from_parts(31_716_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn expect_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_344_000 picoseconds. - Weight::from_parts(5_490_000, 0) + // Minimum execution time: 5_208_000 picoseconds. + Weight::from_parts(5_321_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -303,33 +316,33 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 25_333_000 picoseconds. - Weight::from_parts(25_683_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 27_724_000 picoseconds. + Weight::from_parts(28_739_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn clear_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_734_000 picoseconds. - Weight::from_parts(2_813_000, 0) + // Minimum execution time: 2_711_000 picoseconds. + Weight::from_parts(2_788_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_766_000 picoseconds. - Weight::from_parts(2_824_000, 0) + // Minimum execution time: 2_660_000 picoseconds. + Weight::from_parts(2_757_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_763_000 picoseconds. - Weight::from_parts(2_839_000, 0) + // Minimum execution time: 2_698_000 picoseconds. + Weight::from_parts(2_804_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -338,23 +351,23 @@ impl WeightInfo { pub fn universal_origin() -> Weight { // Proof Size summary in bytes: // Measured: `158` - // Estimated: `7373` - // Minimum execution time: 10_161_000 picoseconds. - Weight::from_parts(10_414_000, 7373) + // Estimated: `5884` + // Minimum execution time: 9_692_000 picoseconds. + Weight::from_parts(9_998_000, 5884) .saturating_add(T::DbWeight::get().reads(2)) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_753_000 picoseconds. - Weight::from_parts(2_837_000, 0) + // Minimum execution time: 2_566_000 picoseconds. + Weight::from_parts(2_668_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_001_000 picoseconds. - Weight::from_parts(3_064_000, 0) + // Minimum execution time: 2_754_000 picoseconds. + Weight::from_parts(2_847_000, 0) } } From 80c77addf2c5eabe3594f06867b5d52b8bfb1e4f Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Tue, 30 May 2023 18:03:59 +0000 Subject: [PATCH 254/339] ".git/.scripts/commands/bench/bench.sh" pallet statemine assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 119 +++++++++++------- 1 file changed, 72 insertions(+), 47 deletions(-) diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs index 47a63b0eb36..bafff1fbf0c 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 @@ -41,9 +41,10 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_bridge_transfer`. pub struct WeightInfo(PhantomData); @@ -52,7 +53,13 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) + /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: Assets Account (r:2 w:2) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) @@ -68,18 +75,20 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn transfer_asset_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `477` - // Estimated: `25954` - // Minimum execution time: 126_493_000 picoseconds. - Weight::from_parts(127_684_000, 0) - .saturating_add(Weight::from_parts(0, 25954)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(5)) + // Measured: `750` + // Estimated: `6208` + // Minimum execution time: 155_987_000 picoseconds. + Weight::from_parts(156_876_000, 0) + .saturating_add(Weight::from_parts(0, 6208)) + .saturating_add(T::DbWeight::get().reads(12)) + .saturating_add(T::DbWeight::get().writes(8)) } /// Storage: ParachainInfo ParachainId (r:1 w:0) /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) + /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -94,13 +103,13 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn ping_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `337` - // Estimated: `18918` - // Minimum execution time: 57_858_000 picoseconds. - Weight::from_parts(59_418_000, 0) - .saturating_add(Weight::from_parts(0, 18918)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `347` + // Estimated: `6002` + // Minimum execution time: 66_830_000 picoseconds. + Weight::from_parts(67_314_000, 0) + .saturating_add(Weight::from_parts(0, 6002)) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) @@ -109,10 +118,10 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< fn add_exporter_config() -> Weight { // Proof Size summary in bytes: // Measured: `109` - // Estimated: `7491` - // Minimum execution time: 16_403_000 picoseconds. - Weight::from_parts(16_675_000, 0) - .saturating_add(Weight::from_parts(0, 7491)) + // Estimated: `6002` + // Minimum execution time: 16_697_000 picoseconds. + Weight::from_parts(16_997_000, 0) + .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -120,10 +129,10 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) fn remove_exporter_config() -> Weight { // Proof Size summary in bytes: - // Measured: `165` + // Measured: `175` // Estimated: `6002` - // Minimum execution time: 13_993_000 picoseconds. - Weight::from_parts(14_352_000, 0) + // Minimum execution time: 13_282_000 picoseconds. + Weight::from_parts(13_616_000, 0) .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -132,44 +141,60 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) fn update_exporter_config() -> Weight { // Proof Size summary in bytes: - // Measured: `165` + // Measured: `175` // Estimated: `6002` - // Minimum execution time: 18_944_000 picoseconds. - Weight::from_parts(19_371_000, 0) + // Minimum execution time: 16_726_000 picoseconds. + Weight::from_parts(17_111_000, 0) .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) + /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) fn add_universal_alias() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `109` + // Estimated: `5884` + // Minimum execution time: 12_078_000 picoseconds. + Weight::from_parts(12_421_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) + /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) fn remove_universal_alias() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `158` + // Estimated: `5884` + // Minimum execution time: 15_011_000 picoseconds. + Weight::from_parts(15_361_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: Some(1), max_size: Some(4817), added: 5312, mode: MaxEncodedLen) fn add_reserve_location() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `109` + // Estimated: `6302` + // Minimum execution time: 11_927_000 picoseconds. + Weight::from_parts(12_308_000, 0) + .saturating_add(Weight::from_parts(0, 6302)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: Some(1), max_size: Some(4817), added: 5312, mode: MaxEncodedLen) fn remove_reserve_location() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `141` + // Estimated: `6302` + // Minimum execution time: 14_002_000 picoseconds. + Weight::from_parts(14_406_000, 0) + .saturating_add(Weight::from_parts(0, 6302)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } } From faae3205d72349cf50f53ef612df4b8f2a48f37d Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Tue, 30 May 2023 19:09:05 +0000 Subject: [PATCH 255/339] ".git/.scripts/commands/bench/bench.sh" pallet westmint assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 107 +++++++++++++----- 1 file changed, 77 insertions(+), 30 deletions(-) diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs index 23de590f2d1..e6ec448388c 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 @@ -41,28 +41,75 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_bridge_transfer`. pub struct WeightInfo(PhantomData); impl pallet_bridge_transfer::WeightInfo for WeightInfo { + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) + /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: Assets Account (r:2 w:2) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn transfer_asset_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `732` + // Estimated: `6208` + // Minimum execution time: 151_961_000 picoseconds. + Weight::from_parts(153_658_000, 0) + .saturating_add(Weight::from_parts(0, 6208)) + .saturating_add(T::DbWeight::get().reads(12)) + .saturating_add(T::DbWeight::get().writes(8)) } + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) + /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn ping_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `381` + // Estimated: `6002` + // Minimum execution time: 64_672_000 picoseconds. + Weight::from_parts(65_698_000, 0) + .saturating_add(Weight::from_parts(0, 6002)) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) @@ -71,10 +118,10 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< fn add_exporter_config() -> Weight { // Proof Size summary in bytes: // Measured: `109` - // Estimated: `7491` - // Minimum execution time: 15_704_000 picoseconds. - Weight::from_parts(16_139_000, 0) - .saturating_add(Weight::from_parts(0, 7491)) + // Estimated: `6002` + // Minimum execution time: 16_205_000 picoseconds. + Weight::from_parts(16_584_000, 0) + .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -82,10 +129,10 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) fn remove_exporter_config() -> Weight { // Proof Size summary in bytes: - // Measured: `165` + // Measured: `175` // Estimated: `6002` - // Minimum execution time: 13_749_000 picoseconds. - Weight::from_parts(14_178_000, 0) + // Minimum execution time: 13_171_000 picoseconds. + Weight::from_parts(13_598_000, 0) .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -94,10 +141,10 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) fn update_exporter_config() -> Weight { // Proof Size summary in bytes: - // Measured: `165` + // Measured: `175` // Estimated: `6002` - // Minimum execution time: 18_664_000 picoseconds. - Weight::from_parts(18_982_000, 0) + // Minimum execution time: 16_666_000 picoseconds. + Weight::from_parts(16_847_000, 0) .saturating_add(Weight::from_parts(0, 6002)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -108,8 +155,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `109` // Estimated: `5884` - // Minimum execution time: 12_859_000 picoseconds. - Weight::from_parts(19_737_000, 0) + // Minimum execution time: 11_874_000 picoseconds. + Weight::from_parts(12_188_000, 0) .saturating_add(Weight::from_parts(0, 5884)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -120,8 +167,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `158` // Estimated: `5884` - // Minimum execution time: 15_939_000 picoseconds. - Weight::from_parts(16_245_000, 0) + // Minimum execution time: 15_103_000 picoseconds. + Weight::from_parts(15_497_000, 0) .saturating_add(Weight::from_parts(0, 5884)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -132,8 +179,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `109` // Estimated: `6302` - // Minimum execution time: 12_764_000 picoseconds. - Weight::from_parts(13_060_000, 0) + // Minimum execution time: 11_624_000 picoseconds. + Weight::from_parts(11_983_000, 0) .saturating_add(Weight::from_parts(0, 6302)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -144,8 +191,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `141` // Estimated: `6302` - // Minimum execution time: 14_613_000 picoseconds. - Weight::from_parts(14_927_000, 0) + // Minimum execution time: 13_568_000 picoseconds. + Weight::from_parts(13_867_000, 0) .saturating_add(Weight::from_parts(0, 6302)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) From 108b86c44d229bc4657c212ff72588160615a04a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 21:57:19 +0000 Subject: [PATCH 256/339] Bump syn from 2.0.16 to 2.0.18 (#2650) Bumps [syn](https://github.com/dtolnay/syn) from 2.0.16 to 2.0.18. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.16...2.0.18) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 64 +++++++++---------- .../parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e251fe4ac9d..a5884cf1906 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -464,7 +464,7 @@ checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -475,7 +475,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -610,7 +610,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -1559,7 +1559,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -2490,7 +2490,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -3446,7 +3446,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -3457,7 +3457,7 @@ checksum = "48016319042fb7c87b78d2993084a831793a897a5cd1a2a67cab9d1eeb4b7d76" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -3613,7 +3613,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -3884,7 +3884,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -4001,7 +4001,7 @@ dependencies = [ "proc-macro-warning", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -4013,7 +4013,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -4023,7 +4023,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da2 dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -4192,7 +4192,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -7082,7 +7082,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da2 dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -7718,7 +7718,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -10136,7 +10136,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ceca8aaf45b5c46ec7ed39fff75f57290368c1846d33d24a122ca81416ab058" dependencies = [ "proc-macro2", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -10211,7 +10211,7 @@ checksum = "70550716265d1ec349c41f70dd4f964b4fd88394efe4405f0c1da679c4799a07" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -11185,7 +11185,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -12152,7 +12152,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -12477,7 +12477,7 @@ checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -12785,7 +12785,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -13027,7 +13027,7 @@ dependencies = [ "proc-macro2", "quote", "sp-core-hashing", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -13046,7 +13046,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da2 dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -13257,7 +13257,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -13443,7 +13443,7 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -13963,7 +13963,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -14012,9 +14012,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.16" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", @@ -14125,7 +14125,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -14305,7 +14305,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -14505,7 +14505,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -16236,7 +16236,7 @@ dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index 5caf7cb7b3b..cd47fef9e09 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -9,7 +9,7 @@ description = "Proc macros provided by the parachain-system pallet" proc-macro = true [dependencies] -syn = "2.0.15" +syn = "2.0.18" proc-macro2 = "1.0.59" quote = "1.0.28" proc-macro-crate = "1.3.1" From 3a164315dc29723e1a9791a0059115e55bd397d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 04:51:12 +0000 Subject: [PATCH 257/339] Bump log from 0.4.17 to 0.4.18 (#2651) Bumps [log](https://github.com/rust-lang/log) from 0.4.17 to 0.4.18. - [Release notes](https://github.com/rust-lang/log/releases) - [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/log/compare/0.4.17...0.4.18) --- updated-dependencies: - dependency-name: log dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 7 ++----- bridges/bin/runtime-common/Cargo.toml | 2 +- bridges/modules/grandpa/Cargo.toml | 2 +- bridges/modules/messages/Cargo.toml | 2 +- bridges/modules/parachains/Cargo.toml | 2 +- bridges/modules/relayers/Cargo.toml | 2 +- client/consensus/common/Cargo.toml | 2 +- pallets/collator-selection/Cargo.toml | 2 +- pallets/dmp-queue/Cargo.toml | 2 +- pallets/parachain-system/Cargo.toml | 2 +- pallets/xcmp-queue/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- parachain-template/runtime/Cargo.toml | 2 +- parachains/runtimes/assets/common/Cargo.toml | 2 +- parachains/runtimes/assets/statemine/Cargo.toml | 2 +- parachains/runtimes/assets/statemint/Cargo.toml | 2 +- parachains/runtimes/assets/westmint/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- .../runtimes/collectives/collectives-polkadot/Cargo.toml | 2 +- parachains/runtimes/contracts/contracts-rococo/Cargo.toml | 2 +- parachains/runtimes/testing/penpal/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- primitives/utility/Cargo.toml | 2 +- xcm/xcm-emulator/Cargo.toml | 2 +- 26 files changed, 27 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a5884cf1906..1703c1f5e59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5903,12 +5903,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" [[package]] name = "lru" diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml index 5f42048d8d3..8fe89de962e 100644 --- a/bridges/bin/runtime-common/Cargo.toml +++ b/bridges/bin/runtime-common/Cargo.toml @@ -9,7 +9,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } hash-db = { version = "0.16.0", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } static_assertions = { version = "1.1", optional = true } diff --git a/bridges/modules/grandpa/Cargo.toml b/bridges/modules/grandpa/Cargo.toml index ea8d00b8860..34143499370 100644 --- a/bridges/modules/grandpa/Cargo.toml +++ b/bridges/modules/grandpa/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } finality-grandpa = { version = "0.16.2", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Bridge Dependencies diff --git a/bridges/modules/messages/Cargo.toml b/bridges/modules/messages/Cargo.toml index 52fdea1df00..34120e6908a 100644 --- a/bridges/modules/messages/Cargo.toml +++ b/bridges/modules/messages/Cargo.toml @@ -8,7 +8,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } num-traits = { version = "0.2", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } diff --git a/bridges/modules/parachains/Cargo.toml b/bridges/modules/parachains/Cargo.toml index 147111fd4ce..5ee30f594c7 100644 --- a/bridges/modules/parachains/Cargo.toml +++ b/bridges/modules/parachains/Cargo.toml @@ -7,7 +7,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Bridge Dependencies diff --git a/bridges/modules/relayers/Cargo.toml b/bridges/modules/relayers/Cargo.toml index 2a504b0e090..9fbc0996ba7 100644 --- a/bridges/modules/relayers/Cargo.toml +++ b/bridges/modules/relayers/Cargo.toml @@ -8,7 +8,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Bridge dependencies diff --git a/client/consensus/common/Cargo.toml b/client/consensus/common/Cargo.toml index 02b36320062..6523368fe35 100644 --- a/client/consensus/common/Cargo.toml +++ b/client/consensus/common/Cargo.toml @@ -10,7 +10,7 @@ async-trait = "0.1.68" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } dyn-clone = "1.0.11" futures = "0.3.28" -log = "0.4.17" +log = "0.4.18" tracing = "0.1.37" # Substrate diff --git a/pallets/collator-selection/Cargo.toml b/pallets/collator-selection/Cargo.toml index f3bec9567cd..c62a0a180a9 100644 --- a/pallets/collator-selection/Cargo.toml +++ b/pallets/collator-selection/Cargo.toml @@ -13,7 +13,7 @@ version = "3.0.0" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } codec = { default-features = false, features = ["derive"], package = "parity-scale-codec", version = "3.0.0" } rand = { version = "0.8.5", features = ["std_rng"], default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } diff --git a/pallets/dmp-queue/Cargo.toml b/pallets/dmp-queue/Cargo.toml index c2e914cf282..f4b4b1eb3d7 100644 --- a/pallets/dmp-queue/Cargo.toml +++ b/pallets/dmp-queue/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate diff --git a/pallets/parachain-system/Cargo.toml b/pallets/parachain-system/Cargo.toml index 23db13bca7c..91c4649057e 100644 --- a/pallets/parachain-system/Cargo.toml +++ b/pallets/parachain-system/Cargo.toml @@ -10,7 +10,7 @@ bytes = { version = "1.4.0", default-features = false } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } environmental = { version = "1.1.4", default-features = false } impl-trait-for-tuples = "0.2.1" -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate diff --git a/pallets/xcmp-queue/Cargo.toml b/pallets/xcmp-queue/Cargo.toml index 2238469f05a..a083716d948 100644 --- a/pallets/xcmp-queue/Cargo.toml +++ b/pallets/xcmp-queue/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } rand_chacha = { version = "0.3.0", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index d45f915bad6..7eef77704b3 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -11,7 +11,7 @@ build = "build.rs" [dependencies] clap = { version = "4.3.0", features = ["derive"] } -log = "0.4.17" +log = "0.4.18" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.163", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } diff --git a/parachain-template/runtime/Cargo.toml b/parachain-template/runtime/Cargo.toml index 7894ea2176e..e8a10110a6e 100644 --- a/parachain-template/runtime/Cargo.toml +++ b/parachain-template/runtime/Cargo.toml @@ -17,7 +17,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/assets/common/Cargo.toml b/parachains/runtimes/assets/common/Cargo.toml index db9d5674dad..f8c459a922d 100644 --- a/parachains/runtimes/assets/common/Cargo.toml +++ b/parachains/runtimes/assets/common/Cargo.toml @@ -8,7 +8,7 @@ description = "Assets common utilities" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/statemine/Cargo.toml index ad16c4bafc6..968e2339a36 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/statemine/Cargo.toml @@ -8,7 +8,7 @@ description = "Kusama variant of Statemint parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/assets/statemint/Cargo.toml b/parachains/runtimes/assets/statemint/Cargo.toml index d5dd4fdf974..468f1e7e899 100644 --- a/parachains/runtimes/assets/statemint/Cargo.toml +++ b/parachains/runtimes/assets/statemint/Cargo.toml @@ -8,7 +8,7 @@ description = "Statemint parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/westmint/Cargo.toml index 16d7e606221..80bea70f8dc 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/westmint/Cargo.toml @@ -8,7 +8,7 @@ description = "Westend variant of Statemint parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index 4853ad2eb60..1b4f467afba 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -11,7 +11,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } serde = { version = "1.0.163", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 4e14a964363..643d15b2c64 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -11,7 +11,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } serde = { version = "1.0.163", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 9bb5e0d3d2e..cf848a316aa 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -11,7 +11,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } serde = { version = "1.0.163", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml index 9ab4be51048..704876bc8b2 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml +++ b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml @@ -8,7 +8,7 @@ description = "Polkadot Collectives Parachain Runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index 37996e29586..65b25681bbf 100644 --- a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -13,7 +13,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/testing/penpal/Cargo.toml b/parachains/runtimes/testing/penpal/Cargo.toml index 679a252c362..547559170c4 100644 --- a/parachains/runtimes/testing/penpal/Cargo.toml +++ b/parachains/runtimes/testing/penpal/Cargo.toml @@ -17,7 +17,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.16", default-features = false } +log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 039afffe9ea..cc29a1fb573 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -16,7 +16,7 @@ clap = { version = "4.3.0", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" -log = "0.4.17" +log = "0.4.18" serde = { version = "1.0.163", features = ["derive"] } serde_json = "1.0.96" diff --git a/primitives/utility/Cargo.toml b/primitives/utility/Cargo.toml index 58d5ee23c8e..00a634fa438 100644 --- a/primitives/utility/Cargo.toml +++ b/primitives/utility/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/xcm/xcm-emulator/Cargo.toml b/xcm/xcm-emulator/Cargo.toml index dbbf07be098..4d25b7724f7 100644 --- a/xcm/xcm-emulator/Cargo.toml +++ b/xcm/xcm-emulator/Cargo.toml @@ -10,7 +10,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } paste = "1.0.5" quote = "1.0.28" casey = "0.4.0" -log = { version = "0.4.17", default-features = false } +log = { version = "0.4.18", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" } From 98e68bd54257b4039a5d5b734816f4a1b7c83a9d Mon Sep 17 00:00:00 2001 From: Ignacio Palacios Date: Wed, 31 May 2023 11:49:33 +0200 Subject: [PATCH 258/339] Add correct Sign Extensions to Glutton parachain (#2656) * add correct sign extensions * remove warnings --- .../glutton/glutton-kusama/src/lib.rs | 50 ++++--------------- 1 file changed, 10 insertions(+), 40 deletions(-) diff --git a/parachains/runtimes/glutton/glutton-kusama/src/lib.rs b/parachains/runtimes/glutton/glutton-kusama/src/lib.rs index 073bd6c5751..388715f09c3 100644 --- a/parachains/runtimes/glutton/glutton-kusama/src/lib.rs +++ b/parachains/runtimes/glutton/glutton-kusama/src/lib.rs @@ -46,15 +46,12 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); pub mod weights; pub mod xcm_config; -use codec::{Decode, Encode}; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use frame_support::unsigned::TransactionValidityError; -use scale_info::TypeInfo; use sp_api::impl_runtime_apis; use sp_core::OpaqueMetadata; use sp_runtime::{ create_runtime_str, generic, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, DispatchInfoOf}, + traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}, transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, }; @@ -222,41 +219,6 @@ construct_runtime! { } } -/// Simple implementation which fails any transaction which is signed. -#[derive(Eq, PartialEq, Clone, Default, sp_core::RuntimeDebug, Encode, Decode, TypeInfo)] -pub struct DisallowSigned; -impl sp_runtime::traits::SignedExtension for DisallowSigned { - const IDENTIFIER: &'static str = "DisallowSigned"; - type AccountId = AccountId; - type Call = RuntimeCall; - type AdditionalSigned = (); - type Pre = (); - fn additional_signed( - &self, - ) -> sp_std::result::Result<(), sp_runtime::transaction_validity::TransactionValidityError> { - Ok(()) - } - fn pre_dispatch( - self, - who: &Self::AccountId, - call: &Self::Call, - info: &DispatchInfoOf, - len: usize, - ) -> Result { - self.validate(who, call, info, len).map(|_| ()) - } - fn validate( - &self, - _who: &Self::AccountId, - _call: &Self::Call, - _info: &sp_runtime::traits::DispatchInfoOf, - _len: usize, - ) -> TransactionValidity { - let i = sp_runtime::transaction_validity::InvalidTransaction::BadProof; - Err(sp_runtime::transaction_validity::TransactionValidityError::Invalid(i)) - } -} - /// Index of a transaction in the chain. pub type Index = u32; /// A hash of some data used by the chain. @@ -274,7 +236,15 @@ 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 = DisallowSigned; +pub type SignedExtra = ( + pallet_sudo::CheckOnlySudoAccount, + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, +); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; From 5dd73ad67d8a170c5d3ca9edc0c3adb5de745bea Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 31 May 2023 17:43:10 +0300 Subject: [PATCH 259/339] Companion for #14265 (#2655) * Update cargo.lock Signed-off-by: Alexandru Vasile * Update cargo.lock Signed-off-by: Alexandru Vasile * update lockfile for {"polkadot", "substrate"} --------- Signed-off-by: Alexandru Vasile Co-authored-by: parity-processbot <> --- Cargo.lock | 680 +++++++++++++++++++++++++++++------------------------ 1 file changed, 372 insertions(+), 308 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1703c1f5e59..fd32782c006 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -577,7 +577,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "hash-db", "log", @@ -733,9 +733,9 @@ checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" [[package]] name = "bounded-collections" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a071c348a5ef6da1d3a87166b408170b46002382b1dda83992b5c2208cefb370" +checksum = "07fbd1d11282a1eb134d3c3b7cf8ce213b5161c6e5f73fb1b98618482c606b64" dependencies = [ "log", "parity-scale-codec", @@ -1696,6 +1696,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "common-path" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -3258,6 +3264,33 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "docify" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18b972b74c30cbe838fc6a07665132ff94f257350e26fd01d80bc59ee7fcf129" +dependencies = [ + "docify_macros", +] + +[[package]] +name = "docify_macros" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c93004d1011191c56df9e853dca42f2012e7488638bcd5078935f5ce43e06cf3" +dependencies = [ + "common-path", + "derive-syn-parse", + "lazy_static", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "syn 2.0.18", + "termcolor", + "walkdir", +] + [[package]] name = "downcast" version = "0.11.0" @@ -3784,7 +3817,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", ] @@ -3807,7 +3840,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-support-procedural", @@ -3832,7 +3865,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3879,7 +3912,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3890,7 +3923,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3907,7 +3940,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-system", @@ -3936,7 +3969,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-recursion", "futures", @@ -3957,7 +3990,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "bitflags", "environmental", @@ -3966,6 +3999,7 @@ dependencies = [ "impl-trait-for-tuples", "k256", "log", + "macro_magic", "once_cell", "parity-scale-codec", "paste", @@ -3991,13 +4025,14 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "Inflector", "cfg-expr", "derive-syn-parse", "frame-support-procedural-tools", "itertools", + "macro_magic", "proc-macro-warning", "proc-macro2", "quote", @@ -4007,7 +4042,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4019,7 +4054,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "proc-macro2", "quote", @@ -4029,7 +4064,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "cfg-if", "frame-support", @@ -4048,7 +4083,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4098,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "sp-api", @@ -4072,7 +4107,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "parity-scale-codec", @@ -5159,7 +5194,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bitvec", "frame-benchmarking", @@ -5258,7 +5293,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "frame-support", "polkadot-primitives", @@ -5972,6 +6007,53 @@ dependencies = [ "libc", ] +[[package]] +name = "macro_magic" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e7c1b5ffe892e88b288611ccf55f9c4f4e43214aea6f7f80f0c2c53c85e68e" +dependencies = [ + "macro_magic_core", + "macro_magic_macros", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "macro_magic_core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e812c59de90e5d50405131c676dad7d239de39ccc975620c72d467c70138851" +dependencies = [ + "derive-syn-parse", + "macro_magic_core_macros", + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "macro_magic_core_macros" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b1906fa06ee8c02b24595e121be94e0036cb64f9dce5e587edd1e823c87c94" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "macro_magic_macros" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49e8939ee52e99672a887d8ee13776d0f54262c058ce7e911185fed8e43e3a59" +dependencies = [ + "macro_magic_core", + "quote", + "syn 2.0.18", +] + [[package]] name = "maplit" version = "1.0.2" @@ -6140,7 +6222,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "futures", "log", @@ -6159,7 +6241,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "anyhow", "jsonrpsee", @@ -6663,7 +6745,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6684,7 +6766,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -6702,7 +6784,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -6717,7 +6799,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-system", @@ -6733,7 +6815,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-system", @@ -6749,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-system", @@ -6763,7 +6845,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -6787,7 +6869,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6807,7 +6889,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -6822,7 +6904,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-system", @@ -6841,7 +6923,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6865,7 +6947,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -6971,7 +7053,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7015,7 +7097,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7032,7 +7114,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "bitflags", "environmental", @@ -7062,7 +7144,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "bitflags", "parity-scale-codec", @@ -7075,7 +7157,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "proc-macro2", "quote", @@ -7085,7 +7167,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7102,7 +7184,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7120,7 +7202,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7143,7 +7225,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7156,7 +7238,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7174,8 +7256,9 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ + "docify", "frame-benchmarking", "frame-election-provider-support", "frame-support", @@ -7192,7 +7275,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "blake2", "frame-benchmarking", @@ -7210,7 +7293,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7233,7 +7316,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7249,7 +7332,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7269,7 +7352,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7286,7 +7369,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-system", @@ -7300,7 +7383,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7317,7 +7400,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7336,7 +7419,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7353,7 +7436,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7369,7 +7452,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7386,7 +7469,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7404,7 +7487,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "pallet-nfts", @@ -7415,7 +7498,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7431,7 +7514,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-system", @@ -7448,7 +7531,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7468,7 +7551,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7479,7 +7562,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-system", @@ -7496,7 +7579,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7535,7 +7618,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7552,7 +7635,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7567,7 +7650,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7585,7 +7668,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7600,7 +7683,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7619,7 +7702,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7636,7 +7719,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-system", @@ -7657,7 +7740,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7673,7 +7756,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-system", @@ -7687,7 +7770,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7710,7 +7793,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7721,7 +7804,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "log", "sp-arithmetic", @@ -7730,7 +7813,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "sp-api", @@ -7739,7 +7822,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7756,7 +7839,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7771,7 +7854,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7789,7 +7872,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7808,7 +7891,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-support", "frame-system", @@ -7824,7 +7907,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7840,7 +7923,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7852,7 +7935,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7869,7 +7952,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7884,7 +7967,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7900,7 +7983,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7915,7 +7998,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-benchmarking", "frame-support", @@ -7930,7 +8013,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7951,7 +8034,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "frame-benchmarking", "frame-support", @@ -8562,7 +8645,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8578,7 +8661,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8592,7 +8675,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "derive_more", "fatality", @@ -8615,7 +8698,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "fatality", "futures", @@ -8636,7 +8719,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "clap", "frame-benchmarking-cli", @@ -8666,7 +8749,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "async-trait", "frame-benchmarking", @@ -8709,7 +8792,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "always-assert", "bitvec", @@ -8731,7 +8814,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "parity-scale-codec", "scale-info", @@ -8743,7 +8826,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "derive_more", "fatality", @@ -8768,7 +8851,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8782,7 +8865,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "futures", "futures-timer", @@ -8802,7 +8885,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "always-assert", "async-trait", @@ -8825,7 +8908,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "futures", "parity-scale-codec", @@ -8843,7 +8926,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bitvec", "derive_more", @@ -8872,7 +8955,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bitvec", "futures", @@ -8893,7 +8976,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bitvec", "fatality", @@ -8912,7 +8995,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "futures", "polkadot-node-subsystem", @@ -8927,7 +9010,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "async-trait", "futures", @@ -8947,7 +9030,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "futures", "polkadot-node-metrics", @@ -8962,7 +9045,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "futures", "futures-timer", @@ -8979,7 +9062,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "fatality", "futures", @@ -8998,7 +9081,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "async-trait", "futures", @@ -9015,7 +9098,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bitvec", "fatality", @@ -9033,7 +9116,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "always-assert", "futures", @@ -9064,7 +9147,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "futures", "polkadot-node-primitives", @@ -9080,7 +9163,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "cpu-time", "futures", @@ -9100,7 +9183,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-execute-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "cpu-time", "futures", @@ -9125,7 +9208,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-prepare-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "futures", "libc", @@ -9148,7 +9231,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "futures", "lru 0.9.0", @@ -9163,7 +9246,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "lazy_static", "log", @@ -9181,7 +9264,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bs58", "futures", @@ -9200,7 +9283,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "async-channel", "async-trait", @@ -9223,7 +9306,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bounded-vec", "futures", @@ -9245,7 +9328,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9255,7 +9338,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "async-trait", "futures", @@ -9273,7 +9356,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "async-trait", "derive_more", @@ -9296,7 +9379,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "async-trait", "derive_more", @@ -9329,7 +9412,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "async-trait", "futures", @@ -9352,7 +9435,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bounded-collections", "derive_more", @@ -9451,7 +9534,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9469,7 +9552,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9495,7 +9578,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9527,7 +9610,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bitvec", "frame-benchmarking", @@ -9622,7 +9705,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bitvec", "frame-benchmarking", @@ -9668,7 +9751,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "frame-support", "polkadot-primitives", @@ -9682,7 +9765,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bs58", "parity-scale-codec", @@ -9694,7 +9777,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bitflags", "bitvec", @@ -9739,7 +9822,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9849,7 +9932,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9870,7 +9953,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9880,7 +9963,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9905,7 +9988,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bitvec", "frame-election-provider-support", @@ -9966,7 +10049,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "frame-benchmarking", "frame-system", @@ -10746,7 +10829,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10833,7 +10916,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "frame-support", "polkadot-primitives", @@ -11080,7 +11163,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "log", "sp-core", @@ -11091,7 +11174,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "futures", @@ -11120,7 +11203,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "futures", "futures-timer", @@ -11143,7 +11226,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11158,7 +11241,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11177,7 +11260,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11188,7 +11271,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11228,7 +11311,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "fnv", "futures", @@ -11255,7 +11338,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "hash-db", "kvdb", @@ -11281,7 +11364,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "futures", @@ -11306,7 +11389,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "futures", @@ -11335,7 +11418,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "fork-tree", @@ -11371,7 +11454,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "futures", "jsonrpsee", @@ -11393,7 +11476,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11429,7 +11512,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "futures", "jsonrpsee", @@ -11448,7 +11531,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11461,7 +11544,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11501,7 +11584,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "finality-grandpa", "futures", @@ -11521,7 +11604,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "futures", @@ -11544,7 +11627,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "lru 0.10.0", "parity-scale-codec", @@ -11566,7 +11649,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11578,7 +11661,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "anyhow", "cfg-if", @@ -11596,7 +11679,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "ansi_term", "futures", @@ -11612,7 +11695,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11626,7 +11709,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11645,13 +11728,13 @@ dependencies = [ "mockall", "parity-scale-codec", "parking_lot 0.12.1", + "partial_sort", "pin-project", "rand 0.8.5", "sc-block-builder", "sc-client-api", "sc-consensus", "sc-network-common", - "sc-peerset", "sc-utils", "serde", "serde_json", @@ -11665,13 +11748,14 @@ dependencies = [ "substrate-prometheus-endpoint", "thiserror", "unsigned-varint", + "wasm-timer", "zeroize", ] [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-channel", "cid", @@ -11692,7 +11776,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11704,7 +11788,6 @@ dependencies = [ "parity-scale-codec", "prost-build", "sc-consensus", - "sc-peerset", "sc-utils", "serde", "smallvec", @@ -11720,7 +11803,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "ahash 0.8.2", "futures", @@ -11730,7 +11813,6 @@ dependencies = [ "lru 0.10.0", "sc-network", "sc-network-common", - "sc-peerset", "sp-runtime", "substrate-prometheus-endpoint", "tracing", @@ -11739,7 +11821,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11752,7 +11834,6 @@ dependencies = [ "sc-client-api", "sc-network", "sc-network-common", - "sc-peerset", "sp-blockchain", "sp-core", "sp-runtime", @@ -11762,7 +11843,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11781,7 +11862,6 @@ dependencies = [ "sc-consensus", "sc-network", "sc-network-common", - "sc-peerset", "sc-utils", "smallvec", "sp-arithmetic", @@ -11797,7 +11877,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11806,7 +11886,6 @@ dependencies = [ "parity-scale-codec", "sc-network", "sc-network-common", - "sc-peerset", "sc-utils", "sp-consensus", "sp-runtime", @@ -11816,7 +11895,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11834,7 +11913,6 @@ dependencies = [ "sc-client-api", "sc-network", "sc-network-common", - "sc-peerset", "sc-utils", "sp-api", "sp-core", @@ -11844,26 +11922,10 @@ dependencies = [ "tracing", ] -[[package]] -name = "sc-peerset" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" -dependencies = [ - "futures", - "libp2p-identity", - "log", - "parking_lot 0.12.1", - "partial_sort", - "sc-utils", - "serde_json", - "sp-arithmetic", - "wasm-timer", -] - [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11872,7 +11934,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "futures", "jsonrpsee", @@ -11903,7 +11965,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11922,7 +11984,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "http", "jsonrpsee", @@ -11937,7 +11999,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11963,7 +12025,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "directories", @@ -12029,7 +12091,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "log", "parity-scale-codec", @@ -12040,7 +12102,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "clap", "fs4", @@ -12056,7 +12118,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12075,7 +12137,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "futures", "libc", @@ -12094,7 +12156,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "chrono", "futures", @@ -12113,7 +12175,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "ansi_term", "atty", @@ -12144,7 +12206,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12155,7 +12217,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "futures", @@ -12182,13 +12244,15 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "futures", "log", + "parity-scale-codec", "serde", "sp-blockchain", + "sp-core", "sp-runtime", "thiserror", ] @@ -12196,7 +12260,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-channel", "futures", @@ -12677,7 +12741,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "enumn", "parity-scale-codec", @@ -12754,7 +12818,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "hash-db", "log", @@ -12774,7 +12838,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "Inflector", "blake2", @@ -12787,8 +12851,8 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "23.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "scale-info", @@ -12800,8 +12864,8 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "16.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "integer-sqrt", "num-traits", @@ -12815,7 +12879,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "scale-info", @@ -12828,7 +12892,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "sp-api", @@ -12840,7 +12904,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "futures", "log", @@ -12858,7 +12922,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "futures", @@ -12873,7 +12937,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "parity-scale-codec", @@ -12891,7 +12955,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "parity-scale-codec", @@ -12912,7 +12976,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12931,7 +12995,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "finality-grandpa", "log", @@ -12949,7 +13013,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "scale-info", @@ -12960,8 +13024,8 @@ dependencies = [ [[package]] name = "sp-core" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "21.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13004,8 +13068,8 @@ dependencies = [ [[package]] name = "sp-core-hashing" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "9.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "blake2b_simd", "byteorder", @@ -13018,8 +13082,8 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "9.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "proc-macro2", "quote", @@ -13030,7 +13094,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13038,8 +13102,8 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "proc-macro2", "quote", @@ -13048,8 +13112,8 @@ dependencies = [ [[package]] name = "sp-externalities" -version = "0.14.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "0.19.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "environmental", "parity-scale-codec", @@ -13060,7 +13124,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13074,8 +13138,8 @@ dependencies = [ [[package]] name = "sp-io" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "23.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "bytes", "ed25519", @@ -13100,8 +13164,8 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "24.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "lazy_static", "sp-core", @@ -13111,8 +13175,8 @@ dependencies = [ [[package]] name = "sp-keystore" -version = "0.14.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "0.27.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "futures", "parity-scale-codec", @@ -13126,7 +13190,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13135,7 +13199,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13146,7 +13210,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13164,7 +13228,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "scale-info", @@ -13178,7 +13242,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "sp-api", "sp-core", @@ -13187,8 +13251,8 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "backtrace", "lazy_static", @@ -13198,7 +13262,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "rustc-hash", "serde", @@ -13207,8 +13271,8 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "24.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "either", "hash256-std-hasher", @@ -13229,8 +13293,8 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "17.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13247,8 +13311,8 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "11.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "Inflector", "proc-macro-crate", @@ -13260,7 +13324,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "scale-info", @@ -13274,7 +13338,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "scale-info", @@ -13286,8 +13350,8 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.14.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "0.28.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "hash-db", "log", @@ -13307,7 +13371,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "log", "parity-scale-codec", @@ -13324,13 +13388,13 @@ dependencies = [ [[package]] name = "sp-std" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" [[package]] name = "sp-storage" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "13.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13343,7 +13407,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "futures-timer", @@ -13357,8 +13421,8 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "10.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "sp-std", @@ -13370,7 +13434,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "sp-api", "sp-runtime", @@ -13379,7 +13443,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "log", @@ -13394,8 +13458,8 @@ dependencies = [ [[package]] name = "sp-trie" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "22.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13417,8 +13481,8 @@ dependencies = [ [[package]] name = "sp-version" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "22.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13434,8 +13498,8 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" -version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "8.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13445,8 +13509,8 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "14.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13458,8 +13522,8 @@ dependencies = [ [[package]] name = "sp-weights" -version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +version = "20.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "parity-scale-codec", "scale-info", @@ -13848,7 +13912,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "platforms", ] @@ -13856,7 +13920,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13875,7 +13939,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "hyper", "log", @@ -13887,7 +13951,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "jsonrpsee", @@ -13900,7 +13964,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "jsonrpsee", "log", @@ -13919,7 +13983,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -13945,7 +14009,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "futures", "substrate-test-utils-derive", @@ -13955,7 +14019,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -13966,7 +14030,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "ansi_term", "build-helper", @@ -14094,7 +14158,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "frame-support", "polkadot-primitives", @@ -14485,7 +14549,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14496,7 +14560,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14626,7 +14690,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#2bc071f33da268ae218f2f376e7aa1dbf397ec76" +source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" dependencies = [ "async-trait", "clap", @@ -15541,7 +15605,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bitvec", "frame-benchmarking", @@ -15634,7 +15698,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "frame-support", "polkadot-primitives", @@ -16137,7 +16201,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "bounded-collections", "derivative", @@ -16153,7 +16217,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "frame-support", "frame-system", @@ -16208,7 +16272,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "environmental", "frame-benchmarking", @@ -16228,7 +16292,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#710419524ece26228f70562147f704eacd00e3af" +source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" dependencies = [ "Inflector", "proc-macro2", From e5e744d52bd0753cd932651466ef9c2477d1dac9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jun 2023 11:40:18 +0000 Subject: [PATCH 260/339] Bump tokio from 1.28.1 to 1.28.2 (#2652) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.28.1 to 1.28.2. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.28.1...tokio-1.28.2) --- updated-dependencies: - dependency-name: tokio dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- client/network/Cargo.toml | 2 +- client/pov-recovery/Cargo.toml | 2 +- client/relay-chain-minimal-node/Cargo.toml | 2 +- client/relay-chain-rpc-interface/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fd32782c006..ca8dfb3c245 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14341,9 +14341,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.28.1" +version = "1.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" dependencies = [ "autocfg", "bytes", diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index 68b6054cb70..3554a91225d 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -31,7 +31,7 @@ cumulus-relay-chain-interface = { path = "../relay-chain-interface" } [dev-dependencies] portpicker = "0.1.1" -tokio = { version = "1.28.1", features = ["macros"] } +tokio = { version = "1.28.2", features = ["macros"] } url = "2.3.1" # Substrate diff --git a/client/pov-recovery/Cargo.toml b/client/pov-recovery/Cargo.toml index e5034da396e..62922176e25 100644 --- a/client/pov-recovery/Cargo.toml +++ b/client/pov-recovery/Cargo.toml @@ -31,7 +31,7 @@ cumulus-relay-chain-interface = {path = "../relay-chain-interface"} async-trait = "0.1.68" [dev-dependencies] -tokio = { version = "1.28.1", features = ["macros"] } +tokio = { version = "1.28.2", features = ["macros"] } portpicker = "0.1.1" # Cumulus diff --git a/client/relay-chain-minimal-node/Cargo.toml b/client/relay-chain-minimal-node/Cargo.toml index 866408b2cbb..c9efb6d5e52 100644 --- a/client/relay-chain-minimal-node/Cargo.toml +++ b/client/relay-chain-minimal-node/Cargo.toml @@ -42,4 +42,4 @@ lru = "0.9" tracing = "0.1.37" async-trait = "0.1.68" futures = "0.3.28" -tokio = { version = "1.28.1", features = ["macros"] } +tokio = { version = "1.28.2", features = ["macros"] } diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index a3a5629e4e1..ba319ca7f1b 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -21,7 +21,7 @@ sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "mas sc-rpc-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } -tokio = { version = "1.28.1", features = ["sync"] } +tokio = { version = "1.28.2", features = ["sync"] } futures = "0.3.28" futures-timer = "3.0.2" diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index cc29a1fb573..033e395722a 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -97,7 +97,7 @@ substrate-build-script-utils = { git = "https://github.com/paritytech/substrate" assert_cmd = "2.0" nix = { version = "0.26.1", features = ["signal"] } tempfile = "3.5.0" -tokio = { version = "1.28.1", features = ["macros", "time", "parking_lot"] } +tokio = { version = "1.28.2", features = ["macros", "time", "parking_lot"] } wait-timeout = "0.2" # purge_chain_works works with rococo-local and needs to allow this polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master", features = ["rococo-native"] } diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 1ad45f57fa1..b67020297b6 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -16,7 +16,7 @@ criterion = { version = "0.5.1", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" serde = { version = "1.0.163", features = ["derive"] } -tokio = { version = "1.28.1", features = ["macros"] } +tokio = { version = "1.28.2", features = ["macros"] } tracing = "0.1.37" url = "2.3.1" From f8b6240ea989f2fbf0070ab272e3e5ebda9fa444 Mon Sep 17 00:00:00 2001 From: Sam Johnson Date: Thu, 1 Jun 2023 10:43:00 -0400 Subject: [PATCH 261/339] bump serde to 1.0.163 (#2661) * bump serde to 1.0.163 * bump bounded-collections to v0.1.7 for compatibility with substrate --- parachain-template/pallets/template/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parachain-template/pallets/template/Cargo.toml b/parachain-template/pallets/template/Cargo.toml index f47d82c9798..1ccdc6622ba 100644 --- a/parachain-template/pallets/template/Cargo.toml +++ b/parachain-template/pallets/template/Cargo.toml @@ -21,7 +21,7 @@ frame-support = { git = "https://github.com/paritytech/substrate", default-featu frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } [dev-dependencies] -serde = { version = "1.0.132" } +serde = { version = "1.0.163" } # Substrate sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } From d6e426927fb1a32bb4e26e49f8194432c72d45e9 Mon Sep 17 00:00:00 2001 From: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Date: Thu, 1 Jun 2023 17:50:24 +0100 Subject: [PATCH 262/339] Serialize/Deserialize trait implemented in no-std for numerous types (#2660) * Serialize/Deserialize trait implemented in no-std for numerous types * Cargo.lock updated * update lockfile for {"substrate", "polkadot"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 520 ++++++++++----------- bridges/modules/grandpa/Cargo.toml | 4 +- bridges/primitives/header-chain/Cargo.toml | 8 +- bridges/primitives/header-chain/src/lib.rs | 6 +- bridges/primitives/messages/Cargo.toml | 4 +- bridges/primitives/messages/src/lib.rs | 15 +- bridges/primitives/runtime/Cargo.toml | 8 +- bridges/primitives/runtime/src/lib.rs | 15 +- 8 files changed, 301 insertions(+), 279 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ca8dfb3c245..305c986fdb1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -577,7 +577,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "hash-db", "log", @@ -3817,7 +3817,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", ] @@ -3840,7 +3840,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-support-procedural", @@ -3865,7 +3865,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -3912,7 +3912,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3923,7 +3923,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3940,7 +3940,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-system", @@ -3969,7 +3969,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-recursion", "futures", @@ -3990,7 +3990,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "bitflags", "environmental", @@ -4025,7 +4025,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "Inflector", "cfg-expr", @@ -4042,7 +4042,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4054,7 +4054,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "proc-macro2", "quote", @@ -4064,7 +4064,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "cfg-if", "frame-support", @@ -4083,7 +4083,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -4098,7 +4098,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "sp-api", @@ -4107,7 +4107,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "parity-scale-codec", @@ -5194,7 +5194,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bitvec", "frame-benchmarking", @@ -5293,7 +5293,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "frame-support", "polkadot-primitives", @@ -6222,7 +6222,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "futures", "log", @@ -6241,7 +6241,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "anyhow", "jsonrpsee", @@ -6745,7 +6745,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -6766,7 +6766,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -6784,7 +6784,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -6799,7 +6799,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-system", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-system", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-system", @@ -6845,7 +6845,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -6869,7 +6869,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6889,7 +6889,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -6904,7 +6904,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-system", @@ -6923,7 +6923,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -6947,7 +6947,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7053,7 +7053,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7097,7 +7097,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7114,7 +7114,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "bitflags", "environmental", @@ -7144,7 +7144,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "bitflags", "parity-scale-codec", @@ -7157,7 +7157,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "proc-macro2", "quote", @@ -7167,7 +7167,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7202,7 +7202,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7225,7 +7225,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7238,7 +7238,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7256,7 +7256,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "docify", "frame-benchmarking", @@ -7275,7 +7275,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "blake2", "frame-benchmarking", @@ -7293,7 +7293,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7316,7 +7316,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7332,7 +7332,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7352,7 +7352,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7369,7 +7369,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-system", @@ -7383,7 +7383,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7400,7 +7400,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7419,7 +7419,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7436,7 +7436,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7452,7 +7452,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7469,7 +7469,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7487,7 +7487,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "pallet-nfts", @@ -7498,7 +7498,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7514,7 +7514,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-system", @@ -7531,7 +7531,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7551,7 +7551,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7562,7 +7562,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-system", @@ -7579,7 +7579,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7618,7 +7618,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7635,7 +7635,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7650,7 +7650,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7668,7 +7668,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7683,7 +7683,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7702,7 +7702,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7719,7 +7719,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-system", @@ -7740,7 +7740,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7756,7 +7756,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-system", @@ -7770,7 +7770,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7793,7 +7793,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7804,7 +7804,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "log", "sp-arithmetic", @@ -7813,7 +7813,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "sp-api", @@ -7822,7 +7822,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7839,7 +7839,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7854,7 +7854,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7872,7 +7872,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7891,7 +7891,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-support", "frame-system", @@ -7907,7 +7907,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -7923,7 +7923,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7935,7 +7935,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7952,7 +7952,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7967,7 +7967,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7983,7 +7983,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -7998,7 +7998,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-benchmarking", "frame-support", @@ -8013,7 +8013,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -8034,7 +8034,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "frame-benchmarking", "frame-support", @@ -8645,7 +8645,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8661,7 +8661,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8675,7 +8675,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "derive_more", "fatality", @@ -8698,7 +8698,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "fatality", "futures", @@ -8719,7 +8719,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "clap", "frame-benchmarking-cli", @@ -8749,7 +8749,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "async-trait", "frame-benchmarking", @@ -8792,7 +8792,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "always-assert", "bitvec", @@ -8814,7 +8814,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "parity-scale-codec", "scale-info", @@ -8826,7 +8826,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "derive_more", "fatality", @@ -8851,7 +8851,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -8865,7 +8865,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "futures", "futures-timer", @@ -8885,7 +8885,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "always-assert", "async-trait", @@ -8908,7 +8908,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "futures", "parity-scale-codec", @@ -8926,7 +8926,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bitvec", "derive_more", @@ -8955,7 +8955,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bitvec", "futures", @@ -8976,7 +8976,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bitvec", "fatality", @@ -8995,7 +8995,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "futures", "polkadot-node-subsystem", @@ -9010,7 +9010,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "async-trait", "futures", @@ -9030,7 +9030,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "futures", "polkadot-node-metrics", @@ -9045,7 +9045,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "futures", "futures-timer", @@ -9062,7 +9062,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "fatality", "futures", @@ -9081,7 +9081,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "async-trait", "futures", @@ -9098,7 +9098,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bitvec", "fatality", @@ -9116,7 +9116,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "always-assert", "futures", @@ -9147,7 +9147,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "futures", "polkadot-node-primitives", @@ -9163,7 +9163,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "cpu-time", "futures", @@ -9183,7 +9183,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-execute-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "cpu-time", "futures", @@ -9208,7 +9208,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-prepare-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "futures", "libc", @@ -9231,7 +9231,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "futures", "lru 0.9.0", @@ -9246,7 +9246,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "lazy_static", "log", @@ -9264,7 +9264,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bs58", "futures", @@ -9283,7 +9283,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "async-channel", "async-trait", @@ -9306,7 +9306,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bounded-vec", "futures", @@ -9328,7 +9328,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9338,7 +9338,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "async-trait", "futures", @@ -9356,7 +9356,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "async-trait", "derive_more", @@ -9379,7 +9379,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "async-trait", "derive_more", @@ -9412,7 +9412,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "async-trait", "futures", @@ -9435,7 +9435,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bounded-collections", "derive_more", @@ -9534,7 +9534,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9552,7 +9552,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9578,7 +9578,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9610,7 +9610,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bitvec", "frame-benchmarking", @@ -9705,7 +9705,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bitvec", "frame-benchmarking", @@ -9751,7 +9751,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "frame-support", "polkadot-primitives", @@ -9765,7 +9765,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bs58", "parity-scale-codec", @@ -9777,7 +9777,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bitflags", "bitvec", @@ -9822,7 +9822,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -9932,7 +9932,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -9953,7 +9953,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -9963,7 +9963,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -9988,7 +9988,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bitvec", "frame-election-provider-support", @@ -10049,7 +10049,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "frame-benchmarking", "frame-system", @@ -10829,7 +10829,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -10916,7 +10916,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "frame-support", "polkadot-primitives", @@ -11163,7 +11163,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "log", "sp-core", @@ -11174,7 +11174,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "futures", @@ -11203,7 +11203,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "futures", "futures-timer", @@ -11226,7 +11226,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11241,7 +11241,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11260,7 +11260,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11271,7 +11271,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11311,7 +11311,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "fnv", "futures", @@ -11338,7 +11338,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "hash-db", "kvdb", @@ -11364,7 +11364,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "futures", @@ -11389,7 +11389,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "futures", @@ -11418,7 +11418,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "fork-tree", @@ -11454,7 +11454,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "futures", "jsonrpsee", @@ -11476,7 +11476,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11512,7 +11512,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "futures", "jsonrpsee", @@ -11531,7 +11531,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11544,7 +11544,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11584,7 +11584,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "finality-grandpa", "futures", @@ -11604,7 +11604,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "futures", @@ -11627,7 +11627,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "lru 0.10.0", "parity-scale-codec", @@ -11649,7 +11649,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11661,7 +11661,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "anyhow", "cfg-if", @@ -11679,7 +11679,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "ansi_term", "futures", @@ -11695,7 +11695,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11709,7 +11709,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11755,7 +11755,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-channel", "cid", @@ -11776,7 +11776,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -11803,7 +11803,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "ahash 0.8.2", "futures", @@ -11821,7 +11821,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11843,7 +11843,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11877,7 +11877,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "futures", @@ -11895,7 +11895,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -11925,7 +11925,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -11934,7 +11934,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "futures", "jsonrpsee", @@ -11965,7 +11965,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -11984,7 +11984,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "http", "jsonrpsee", @@ -11999,7 +11999,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12025,7 +12025,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "directories", @@ -12091,7 +12091,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "log", "parity-scale-codec", @@ -12102,7 +12102,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "clap", "fs4", @@ -12118,7 +12118,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12137,7 +12137,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "futures", "libc", @@ -12156,7 +12156,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "chrono", "futures", @@ -12175,7 +12175,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "ansi_term", "atty", @@ -12206,7 +12206,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12217,7 +12217,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "futures", @@ -12244,7 +12244,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "futures", @@ -12260,7 +12260,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-channel", "futures", @@ -12741,7 +12741,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "enumn", "parity-scale-codec", @@ -12818,7 +12818,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "hash-db", "log", @@ -12838,7 +12838,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "Inflector", "blake2", @@ -12852,7 +12852,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "scale-info", @@ -12865,7 +12865,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "16.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "integer-sqrt", "num-traits", @@ -12879,7 +12879,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "scale-info", @@ -12892,7 +12892,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "sp-api", @@ -12904,7 +12904,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "futures", "log", @@ -12922,7 +12922,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "futures", @@ -12937,7 +12937,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "parity-scale-codec", @@ -12955,7 +12955,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "parity-scale-codec", @@ -12976,7 +12976,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "lazy_static", "parity-scale-codec", @@ -12995,7 +12995,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "finality-grandpa", "log", @@ -13013,7 +13013,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "scale-info", @@ -13025,7 +13025,7 @@ dependencies = [ [[package]] name = "sp-core" version = "21.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13069,7 +13069,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "blake2b_simd", "byteorder", @@ -13083,7 +13083,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "proc-macro2", "quote", @@ -13094,7 +13094,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13103,7 +13103,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "proc-macro2", "quote", @@ -13113,7 +13113,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.19.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "environmental", "parity-scale-codec", @@ -13124,7 +13124,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13139,7 +13139,7 @@ dependencies = [ [[package]] name = "sp-io" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "bytes", "ed25519", @@ -13165,7 +13165,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "lazy_static", "sp-core", @@ -13176,7 +13176,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.27.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "futures", "parity-scale-codec", @@ -13190,7 +13190,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13199,7 +13199,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13210,7 +13210,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13228,7 +13228,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "scale-info", @@ -13242,7 +13242,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "sp-api", "sp-core", @@ -13252,7 +13252,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "backtrace", "lazy_static", @@ -13262,7 +13262,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "rustc-hash", "serde", @@ -13272,7 +13272,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "either", "hash256-std-hasher", @@ -13294,7 +13294,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "17.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13312,7 +13312,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "11.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "Inflector", "proc-macro-crate", @@ -13324,7 +13324,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "scale-info", @@ -13338,7 +13338,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "scale-info", @@ -13351,7 +13351,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.28.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "hash-db", "log", @@ -13371,7 +13371,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "log", "parity-scale-codec", @@ -13389,12 +13389,12 @@ dependencies = [ [[package]] name = "sp-std" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" [[package]] name = "sp-storage" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13407,7 +13407,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "futures-timer", @@ -13422,7 +13422,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "10.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "sp-std", @@ -13434,7 +13434,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "sp-api", "sp-runtime", @@ -13443,7 +13443,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "log", @@ -13459,7 +13459,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13482,7 +13482,7 @@ dependencies = [ [[package]] name = "sp-version" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13499,7 +13499,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13510,7 +13510,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "14.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13523,7 +13523,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "20.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "parity-scale-codec", "scale-info", @@ -13912,7 +13912,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "platforms", ] @@ -13920,7 +13920,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -13939,7 +13939,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "hyper", "log", @@ -13951,7 +13951,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "jsonrpsee", @@ -13964,7 +13964,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "jsonrpsee", "log", @@ -13983,7 +13983,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -14009,7 +14009,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "futures", "substrate-test-utils-derive", @@ -14019,7 +14019,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -14030,7 +14030,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "ansi_term", "build-helper", @@ -14158,7 +14158,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "frame-support", "polkadot-primitives", @@ -14549,7 +14549,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14560,7 +14560,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14690,7 +14690,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#655b81cf3ce607b87a293b67d14662ed433a3863" +source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" dependencies = [ "async-trait", "clap", @@ -15605,7 +15605,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bitvec", "frame-benchmarking", @@ -15698,7 +15698,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "frame-support", "polkadot-primitives", @@ -16201,7 +16201,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "bounded-collections", "derivative", @@ -16217,7 +16217,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "frame-support", "frame-system", @@ -16272,7 +16272,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "environmental", "frame-benchmarking", @@ -16292,7 +16292,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#478c6596f2f9137f2d66709665d96d01d5c189e1" +source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" dependencies = [ "Inflector", "proc-macro2", diff --git a/bridges/modules/grandpa/Cargo.toml b/bridges/modules/grandpa/Cargo.toml index 34143499370..fcc1c2a9b07 100644 --- a/bridges/modules/grandpa/Cargo.toml +++ b/bridges/modules/grandpa/Cargo.toml @@ -22,8 +22,8 @@ bp-header-chain = { path = "../../primitives/header-chain", default-features = f frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } diff --git a/bridges/primitives/header-chain/Cargo.toml b/bridges/primitives/header-chain/Cargo.toml index e0349ebc9b9..32f81315537 100644 --- a/bridges/primitives/header-chain/Cargo.toml +++ b/bridges/primitives/header-chain/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } finality-grandpa = { version = "0.16.2", default-features = false } scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } -serde = { version = "1.0", optional = true } +serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } # Bridge dependencies @@ -19,9 +19,9 @@ bp-runtime = { path = "../runtime", default-features = false } # Substrate Dependencies frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } +sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } [dev-dependencies] diff --git a/bridges/primitives/header-chain/src/lib.rs b/bridges/primitives/header-chain/src/lib.rs index 5b278454728..cf08a936234 100644 --- a/bridges/primitives/header-chain/src/lib.rs +++ b/bridges/primitives/header-chain/src/lib.rs @@ -27,7 +27,6 @@ use codec::{Codec, Decode, Encode, EncodeLike, MaxEncodedLen}; use core::{clone::Clone, cmp::Eq, default::Default, fmt::Debug}; use frame_support::PalletError; use scale_info::TypeInfo; -#[cfg(feature = "std")] use serde::{Deserialize, Serialize}; use sp_consensus_grandpa::{AuthorityList, ConsensusLog, SetId, GRANDPA_ENGINE_ID}; use sp_runtime::{traits::Header as HeaderT, Digest, RuntimeDebug}; @@ -110,8 +109,9 @@ impl AuthoritySet { /// Data required for initializing the GRANDPA bridge pallet. /// /// The bridge needs to know where to start its sync from, and this provides that initial context. -#[derive(Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, Clone, TypeInfo)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive( + Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, Clone, TypeInfo, Serialize, Deserialize, +)] pub struct InitializationData { /// The header from which we should start syncing. pub header: Box, diff --git a/bridges/primitives/messages/Cargo.toml b/bridges/primitives/messages/Cargo.toml index cb35b4ae65b..cc439a55ae2 100644 --- a/bridges/primitives/messages/Cargo.toml +++ b/bridges/primitives/messages/Cargo.toml @@ -9,7 +9,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive", "bit-vec"] } scale-info = { version = "2.6.0", default-features = false, features = ["bit-vec", "derive"] } -serde = { version = "1.0", optional = true, features = ["derive"] } +serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } # Bridge dependencies @@ -34,7 +34,7 @@ std = [ "codec/std", "frame-support/std", "scale-info/std", - "serde", + "serde/std", "sp-core/std", "sp-std/std" ] diff --git a/bridges/primitives/messages/src/lib.rs b/bridges/primitives/messages/src/lib.rs index 8f6c9466109..3df039d7eb8 100644 --- a/bridges/primitives/messages/src/lib.rs +++ b/bridges/primitives/messages/src/lib.rs @@ -39,8 +39,19 @@ pub mod storage_keys; pub mod target_chain; /// Messages pallet operating mode. -#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] -#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +#[derive( + Encode, + Decode, + Clone, + Copy, + PartialEq, + Eq, + RuntimeDebug, + TypeInfo, + MaxEncodedLen, + serde::Serialize, + serde::Deserialize, +)] pub enum MessagesOperatingMode { /// Basic operating mode (Normal/Halted) Basic(BasicOperatingMode), diff --git a/bridges/primitives/runtime/Cargo.toml b/bridges/primitives/runtime/Cargo.toml index 694ff4e1aa6..3e6a30a061c 100644 --- a/bridges/primitives/runtime/Cargo.toml +++ b/bridges/primitives/runtime/Cargo.toml @@ -11,8 +11,8 @@ codec = { package = "parity-scale-codec", version = "3.1.5", default-features = hash-db = { version = "0.16.0", default-features = false } impl-trait-for-tuples = "0.2.2" num-traits = { version = "0.2", default-features = false } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } -serde = { version = "1.0", optional = true, features = ["derive"] } +scale-info = { version = "2.6.0", default-features = false, features = ["derive", "serde"] } +serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } # Substrate Dependencies @@ -20,7 +20,7 @@ frame-support = { git = "https://github.com/paritytech/substrate", branch = "mas frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -38,7 +38,7 @@ std = [ "hash-db/std", "num-traits/std", "scale-info/std", - "serde", + "serde/std", "sp-core/std", "sp-io/std", "sp-runtime/std", diff --git a/bridges/primitives/runtime/src/lib.rs b/bridges/primitives/runtime/src/lib.rs index 1922a2eb160..48c1ec13e89 100644 --- a/bridges/primitives/runtime/src/lib.rs +++ b/bridges/primitives/runtime/src/lib.rs @@ -373,8 +373,19 @@ pub trait OperatingMode: Send + Copy + Debug + FullCodec { } /// Basic operating modes for a bridges module (Normal/Halted). -#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] -#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +#[derive( + Encode, + Decode, + Clone, + Copy, + PartialEq, + Eq, + RuntimeDebug, + TypeInfo, + MaxEncodedLen, + serde::Serialize, + serde::Deserialize, +)] pub enum BasicOperatingMode { /// Normal mode, when all operations are allowed. Normal, From 3d7604e1a1ad52c74dfbfce0962a49e7dccbd131 Mon Sep 17 00:00:00 2001 From: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Date: Fri, 2 Jun 2023 00:23:50 +0100 Subject: [PATCH 263/339] doc fix (#2676) fixing error: ``` warning: unresolved link to `well_known_keys::CODE` --> pallets/parachain-system/src/lib.rs:560:12 | 560 | #[pallet::storage] | ^^^^^^^ | = note: the link appears in this line: " As soon as the relay chain gives us the go-ahead signal, we will overwrite the [`:code`][well_known_keys::CODE]" ^^^^^^^^^^^^^^^^^^^^^ = note: no item named `well_known_keys` in scope = note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default ``` --- pallets/parachain-system/src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pallets/parachain-system/src/lib.rs b/pallets/parachain-system/src/lib.rs index 5f7e1501570..fde408c08ec 100644 --- a/pallets/parachain-system/src/lib.rs +++ b/pallets/parachain-system/src/lib.rs @@ -553,10 +553,8 @@ pub mod pallet { /// In case of a scheduled upgrade, this storage field contains the validation code to be applied. /// - /// As soon as the relay chain gives us the go-ahead signal, we will overwrite the [`:code`][well_known_keys::CODE] + /// As soon as the relay chain gives us the go-ahead signal, we will overwrite the [`:code`][sp_core::storage::well_known_keys::CODE] /// which will result the next block process with the new validation code. This concludes the upgrade process. - /// - /// [well_known_keys::CODE]: sp_core::storage::well_known_keys::CODE #[pallet::storage] #[pallet::getter(fn new_validation_function)] pub(super) type PendingValidationCode = StorageValue<_, Vec, ValueQuery>; From c795d6ec8d20242382cfceff556b686aec6efb53 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Fri, 2 Jun 2023 02:45:16 +0300 Subject: [PATCH 264/339] docs: Ensure the CI passes for docs (#2666) * Fix docs Signed-off-by: Alexandru Vasile * Update client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs Co-authored-by: Davide Galassi * Update cargo.lock with substrate Signed-off-by: Alexandru Vasile * Update Cargo.lock for polkadot Signed-off-by: Alexandru Vasile --------- Signed-off-by: Alexandru Vasile Co-authored-by: Davide Galassi Co-authored-by: parity-processbot <> --- .../relay-chain-rpc-interface/src/reconnecting_ws_client.rs | 4 +++- pallets/parachain-system/src/lib.rs | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs b/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs index e03525226bc..803a27d00f6 100644 --- a/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs +++ b/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs @@ -161,7 +161,9 @@ impl ReconnectingWsClient { } } -/// Worker that should be used in combination with [`RelayChainRpcClient`]. Must be polled to distribute header notifications to listeners. +/// Worker that should be used in combination with [`crate::RelayChainRpcClient`]. +/// +/// Must be polled to distribute header notifications to listeners. struct ReconnectingWebsocketWorker { ws_urls: Vec, /// Communication channel with the RPC client diff --git a/pallets/parachain-system/src/lib.rs b/pallets/parachain-system/src/lib.rs index fde408c08ec..cbbfc92f60a 100644 --- a/pallets/parachain-system/src/lib.rs +++ b/pallets/parachain-system/src/lib.rs @@ -692,7 +692,7 @@ pub mod pallet { /// A custom head data that should be returned as result of `validate_block`. /// - /// See [`Pallet::set_custom_validation_head_data`] for more information. + /// See `Pallet::set_custom_validation_head_data` for more information. #[pallet::storage] pub(super) type CustomValidationHeadData = StorageValue<_, Vec, OptionQuery>; @@ -872,7 +872,7 @@ impl Pallet { /// Process all inbound horizontal messages relayed by the collator. /// - /// This is similar to [`process_inbound_downward_messages`], but works on multiple inbound + /// This is similar to `Pallet::process_inbound_downward_messages`, but works on multiple inbound /// channels. /// /// **Panics** if either any of horizontal messages submitted by the collator was sent from From 7e4f18601e29df3b9535c95245d76b3ead2fa0e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 2 Jun 2023 09:21:49 +0100 Subject: [PATCH 265/339] Adds missing features (#2677) --- parachains/runtimes/bridge-hubs/test-utils/Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml index ade734b6ce2..a19d9ca37df 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -64,6 +64,8 @@ std = [ "frame-executive/std", "frame-support/std", "frame-system/std", + "bp-bridge-hub-rococo/std", + "bp-bridge-hub-wococo/std", "bp-messages/std", "bp-parachains/std", "bp-polkadot-core/std", From 80aaed3022b35540b39a673ce5beef94abbb1961 Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Fri, 2 Jun 2023 11:58:19 +0200 Subject: [PATCH 266/339] Rename Statemint to Asset Hub (#2633) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * change dir names * cargo toml updates * fix crate imports for build * change chain spec names and PR review rule * update cli to accept asset-hub * find/replace benchmark commands * integration tests * bridges docs * more integration tests * AuraId * other statemint tidying * rename statemint mod * chain spec mod * rename e2e test dirs * one more Runtime::Statemine * benchmark westmint * rename chain spec name and id * rename chain spec files * more tidying in scripts/docs/tests * rename old dir if exists * Force people to manually do the move. (Safer as there could be additional considerations with their setup) * review touchups * more renaming * Update polkadot-parachain/src/command.rs Co-authored-by: Bastian Köcher * better error message * do not break on-chain spec_name * log info message that path has been renamed * better penpal docs --------- Co-authored-by: gilescope Co-authored-by: Bastian Köcher Co-authored-by: parity-processbot <> --- .github/pr-custom-review.yml | 4 +- ...e-20_extrinsic-ordering-check-from-bin.yml | 2 +- ...e-21_extrinsic-ordering-check-from-two.yml | 14 +- .github/workflows/release-30_create-draft.yml | 12 +- .github/workflows/srtool.yml | 6 +- Cargo.lock | 530 +++++++++--------- Cargo.toml | 10 +- README.md | 14 +- .../docs/polkadot-kusama-bridge-overview.md | 12 +- bridges/docs/polkadot-kusama-bridge.html | 22 +- bridges/modules/messages/README.md | 4 +- bridges/primitives/runtime/src/lib.rs | 4 +- docs/release.md | 22 +- pallets/session-benchmarking/Cargo.toml | 2 +- ...n => asset-hub-kusama-genesis-values.json} | 0 ...sis.json => asset-hub-kusama-genesis.json} | 4 +- .../{statemine.json => asset-hub-kusama.json} | 4 +- ...=> asset-hub-polkadot-genesis-values.json} | 0 ...> asset-hub-polkadot-genesis-values.scale} | 0 ...s.json => asset-hub-polkadot-genesis.json} | 4 +- ...statemint.json => asset-hub-polkadot.json} | 4 +- .../{rockmine.json => asset-hub-rococo.json} | 4 +- ... => asset-hub-westend-genesis-values.json} | 0 ...is.json => asset-hub-westend-genesis.json} | 4 +- .../{westmint.json => asset-hub-westend.json} | 4 +- ...ll-statemint-head-data => shell-head-data} | 0 .../{shell-statemint.json => shell.json} | 0 parachains/common/src/lib.rs | 8 +- .../0_xcm/0_init.yml | 0 .../0_xcm/1_dmp.yml | 0 .../0_xcm/2_ump.yml | 0 .../0_xcm/3_force_hrmp-open-channels.yml | 0 .../0_xcm/4_hrmp.yml | 0 .../config.toml | 2 +- .../0_xcm/0_init.yml | 0 .../0_xcm/1_dmp.yml | 0 .../0_xcm/2_ump.yml | 0 .../0_xcm/3_force_hrmp-open-channels.yml | 0 .../0_xcm/4_hrmp.yml | 0 .../config.toml | 2 +- .../Cargo.toml | 6 +- .../src/lib.rs | 14 +- .../src/tests/mod.rs | 0 .../src/tests/reserve_transfer.rs | 16 +- .../src/tests/teleport.rs | 18 +- .../src/tests/transact.rs | 12 +- .../Cargo.toml | 6 +- .../src/lib.rs | 15 +- .../src/tests/mod.rs | 0 .../src/tests/reserve_transfer.rs | 16 +- .../src/tests/teleport.rs | 18 +- .../src/tests/transact.rs | 12 +- .../emulated/common/Cargo.toml | 4 +- .../emulated/common/src/constants.rs | 72 +-- .../emulated/common/src/lib.rs | 84 +-- parachains/runtimes/assets/README.md | 10 +- .../Cargo.toml | 6 +- .../{statemine => asset-hub-kusama}/build.rs | 0 .../src/constants.rs | 2 +- .../src/lib.rs | 10 +- .../src/weights/block_weights.rs | 0 .../src/weights/cumulus_pallet_xcmp_queue.rs | 6 +- .../src/weights/extrinsic_weights.rs | 0 .../src/weights/frame_system.rs | 6 +- .../src/weights/mod.rs | 0 .../src/weights/pallet_assets.rs | 6 +- .../src/weights/pallet_balances.rs | 6 +- .../src/weights/pallet_collator_selection.rs | 6 +- .../src/weights/pallet_multisig.rs | 6 +- .../src/weights/pallet_nfts.rs | 6 +- .../src/weights/pallet_proxy.rs | 6 +- .../src/weights/pallet_session.rs | 6 +- .../src/weights/pallet_timestamp.rs | 6 +- .../src/weights/pallet_uniques.rs | 6 +- .../src/weights/pallet_utility.rs | 6 +- .../src/weights/pallet_xcm.rs | 6 +- .../src/weights/paritydb_weights.rs | 0 .../src/weights/rocksdb_weights.rs | 0 .../src/weights/xcm/mod.rs | 4 +- .../xcm/pallet_xcm_benchmarks_fungible.rs | 6 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 6 +- .../src/xcm_config.rs | 8 +- .../tests/tests.rs | 20 +- .../Cargo.toml | 6 +- .../build.rs | 0 .../src/constants.rs | 2 +- .../src/lib.rs | 27 +- .../src/weights/block_weights.rs | 0 .../src/weights/cumulus_pallet_xcmp_queue.rs | 6 +- .../src/weights/extrinsic_weights.rs | 0 .../src/weights/frame_system.rs | 6 +- .../src/weights/mod.rs | 0 .../src/weights/pallet_assets.rs | 6 +- .../src/weights/pallet_balances.rs | 6 +- .../src/weights/pallet_collator_selection.rs | 6 +- .../src/weights/pallet_multisig.rs | 6 +- .../src/weights/pallet_nfts.rs | 6 +- .../src/weights/pallet_proxy.rs | 6 +- .../src/weights/pallet_session.rs | 6 +- .../src/weights/pallet_timestamp.rs | 6 +- .../src/weights/pallet_uniques.rs | 6 +- .../src/weights/pallet_utility.rs | 6 +- .../src/weights/pallet_xcm.rs | 6 +- .../src/weights/paritydb_weights.rs | 0 .../src/weights/rocksdb_weights.rs | 0 .../src/weights/xcm/mod.rs | 4 +- .../xcm/pallet_xcm_benchmarks_fungible.rs | 6 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 6 +- .../src/xcm_config.rs | 8 +- .../tests/tests.rs | 28 +- .../Cargo.toml | 6 +- .../{westmint => asset-hub-westend}/build.rs | 0 .../src/constants.rs | 2 +- .../src/lib.rs | 7 +- .../src/weights/block_weights.rs | 0 .../src/weights/cumulus_pallet_xcmp_queue.rs | 6 +- .../src/weights/extrinsic_weights.rs | 0 .../src/weights/frame_system.rs | 6 +- .../src/weights/mod.rs | 0 .../src/weights/pallet_assets.rs | 6 +- .../src/weights/pallet_balances.rs | 6 +- .../src/weights/pallet_collator_selection.rs | 6 +- .../src/weights/pallet_multisig.rs | 6 +- .../weights/pallet_nft_fractionalization.rs | 6 +- .../src/weights/pallet_nfts.rs | 6 +- .../src/weights/pallet_proxy.rs | 6 +- .../src/weights/pallet_session.rs | 6 +- .../src/weights/pallet_timestamp.rs | 6 +- .../src/weights/pallet_uniques.rs | 6 +- .../src/weights/pallet_utility.rs | 6 +- .../src/weights/pallet_xcm.rs | 6 +- .../src/weights/paritydb_weights.rs | 0 .../src/weights/rocksdb_weights.rs | 0 .../src/weights/xcm/mod.rs | 4 +- .../xcm/pallet_xcm_benchmarks_fungible.rs | 6 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 6 +- .../src/xcm_config.rs | 8 +- .../tests/tests.rs | 24 +- .../runtimes/assets/test-utils/Cargo.toml | 2 +- parachains/runtimes/bridge-hubs/README.md | 20 +- .../contracts-rococo/src/constants.rs | 2 +- parachains/runtimes/testing/penpal/src/lib.rs | 12 +- .../runtimes/testing/penpal/src/xcm_config.rs | 15 +- .../testing/rococo-parachain/src/lib.rs | 23 +- polkadot-parachain/Cargo.toml | 18 +- .../{statemint.rs => asset_hubs.rs} | 233 ++++---- polkadot-parachain/src/chain_spec/mod.rs | 2 +- polkadot-parachain/src/cli.rs | 8 +- polkadot-parachain/src/command.rs | 201 ++++--- polkadot-parachain/src/service.rs | 45 +- .../tests/benchmark_storage_works.rs | 2 +- scripts/benchmarks.sh | 6 +- scripts/bridges_rococo_wococo.sh | 78 +-- scripts/ci/gitlab/pipeline/benchmarks.yml | 10 +- scripts/generate_genesis_value.sh | 2 +- scripts/parachains_integration_tests.sh | 4 +- xcm/xcm-emulator/README.md | 2 +- .../bridge_hub_rococo_local_network.toml | 2 +- .../bridge_hub_wococo_local_network.toml | 2 +- zombienet/examples/small_network.toml | 2 +- .../statemine_kusama_local_network.toml | 2 +- 161 files changed, 1122 insertions(+), 1024 deletions(-) rename parachains/chain-specs/{statemine_genesis_values.json => asset-hub-kusama-genesis-values.json} (100%) rename parachains/chain-specs/{statemine_genesis.json => asset-hub-kusama-genesis.json} (99%) rename parachains/chain-specs/{statemine.json => asset-hub-kusama.json} (99%) rename parachains/chain-specs/{statemint_genesis_values.json => asset-hub-polkadot-genesis-values.json} (100%) rename parachains/chain-specs/{statemint_genesis_values.scale => asset-hub-polkadot-genesis-values.scale} (100%) rename parachains/chain-specs/{statemint_genesis.json => asset-hub-polkadot-genesis.json} (99%) rename parachains/chain-specs/{statemint.json => asset-hub-polkadot.json} (99%) rename parachains/chain-specs/{rockmine.json => asset-hub-rococo.json} (99%) rename parachains/chain-specs/{westmint_genesis_values.json => asset-hub-westend-genesis-values.json} (100%) rename parachains/chain-specs/{westmint_genesis.json => asset-hub-westend-genesis.json} (99%) rename parachains/chain-specs/{westmint.json => asset-hub-westend.json} (99%) rename parachains/chain-specs/{shell-statemint-head-data => shell-head-data} (100%) rename parachains/chain-specs/{shell-statemint.json => shell.json} (100%) rename parachains/integration-tests/e2e/assets/{statemine => asset-hub-kusama}/0_xcm/0_init.yml (100%) rename parachains/integration-tests/e2e/assets/{statemine => asset-hub-kusama}/0_xcm/1_dmp.yml (100%) rename parachains/integration-tests/e2e/assets/{statemine => asset-hub-kusama}/0_xcm/2_ump.yml (100%) rename parachains/integration-tests/e2e/assets/{statemine => asset-hub-kusama}/0_xcm/3_force_hrmp-open-channels.yml (100%) rename parachains/integration-tests/e2e/assets/{statemine => asset-hub-kusama}/0_xcm/4_hrmp.yml (100%) rename parachains/integration-tests/e2e/assets/{statemine => asset-hub-kusama}/config.toml (97%) rename parachains/integration-tests/e2e/assets/{statemint => asset-hub-polkadot}/0_xcm/0_init.yml (100%) rename parachains/integration-tests/e2e/assets/{statemint => asset-hub-polkadot}/0_xcm/1_dmp.yml (100%) rename parachains/integration-tests/e2e/assets/{statemint => asset-hub-polkadot}/0_xcm/2_ump.yml (100%) rename parachains/integration-tests/e2e/assets/{statemint => asset-hub-polkadot}/0_xcm/3_force_hrmp-open-channels.yml (100%) rename parachains/integration-tests/e2e/assets/{statemint => asset-hub-polkadot}/0_xcm/4_hrmp.yml (100%) rename parachains/integration-tests/e2e/assets/{statemint => asset-hub-polkadot}/config.toml (97%) rename parachains/integration-tests/emulated/assets/{statemint => asset-hub-kusama}/Cargo.toml (90%) rename parachains/integration-tests/emulated/assets/{statemine => asset-hub-kusama}/src/lib.rs (52%) rename parachains/integration-tests/emulated/assets/{statemine => asset-hub-kusama}/src/tests/mod.rs (100%) rename parachains/integration-tests/emulated/assets/{statemine => asset-hub-kusama}/src/tests/reserve_transfer.rs (78%) rename parachains/integration-tests/emulated/assets/{statemine => asset-hub-kusama}/src/tests/teleport.rs (74%) rename parachains/integration-tests/emulated/assets/{statemine => asset-hub-kusama}/src/tests/transact.rs (77%) rename parachains/integration-tests/emulated/assets/{statemine => asset-hub-polkadot}/Cargo.toml (90%) rename parachains/integration-tests/emulated/assets/{statemint => asset-hub-polkadot}/src/lib.rs (50%) rename parachains/integration-tests/emulated/assets/{statemint => asset-hub-polkadot}/src/tests/mod.rs (100%) rename parachains/integration-tests/emulated/assets/{statemint => asset-hub-polkadot}/src/tests/reserve_transfer.rs (78%) rename parachains/integration-tests/emulated/assets/{statemint => asset-hub-polkadot}/src/tests/teleport.rs (73%) rename parachains/integration-tests/emulated/assets/{statemint => asset-hub-polkadot}/src/tests/transact.rs (77%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/Cargo.toml (98%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/build.rs (100%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/constants.rs (98%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/lib.rs (98%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/block_weights.rs (100%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/cumulus_pallet_xcmp_queue.rs (94%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/extrinsic_weights.rs (100%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/frame_system.rs (97%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/mod.rs (100%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/pallet_assets.rs (99%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/pallet_balances.rs (97%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/pallet_collator_selection.rs (98%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/pallet_multisig.rs (97%) rename parachains/runtimes/assets/{statemint => asset-hub-kusama}/src/weights/pallet_nfts.rs (99%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/pallet_proxy.rs (98%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/pallet_session.rs (94%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/pallet_timestamp.rs (94%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/pallet_uniques.rs (99%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/pallet_utility.rs (95%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/pallet_xcm.rs (98%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/paritydb_weights.rs (100%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/rocksdb_weights.rs (100%) rename parachains/runtimes/assets/{westmint => asset-hub-kusama}/src/weights/xcm/mod.rs (98%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs (97%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/weights/xcm/pallet_xcm_benchmarks_generic.rs (98%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/src/xcm_config.rs (98%) rename parachains/runtimes/assets/{statemine => asset-hub-kusama}/tests/tests.rs (99%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/Cargo.toml (98%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/build.rs (100%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/constants.rs (98%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/lib.rs (97%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/block_weights.rs (100%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/cumulus_pallet_xcmp_queue.rs (93%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/extrinsic_weights.rs (100%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/frame_system.rs (96%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/mod.rs (100%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/pallet_assets.rs (99%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/pallet_balances.rs (97%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/pallet_collator_selection.rs (98%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/pallet_multisig.rs (97%) rename parachains/runtimes/assets/{statemine => asset-hub-polkadot}/src/weights/pallet_nfts.rs (99%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/pallet_proxy.rs (98%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/pallet_session.rs (94%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/pallet_timestamp.rs (93%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/pallet_uniques.rs (99%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/pallet_utility.rs (95%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/pallet_xcm.rs (98%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/paritydb_weights.rs (100%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/rocksdb_weights.rs (100%) rename parachains/runtimes/assets/{statemine => asset-hub-polkadot}/src/weights/xcm/mod.rs (98%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs (97%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/weights/xcm/pallet_xcm_benchmarks_generic.rs (98%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/src/xcm_config.rs (98%) rename parachains/runtimes/assets/{statemint => asset-hub-polkadot}/tests/tests.rs (98%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/Cargo.toml (98%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/build.rs (100%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/constants.rs (98%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/lib.rs (99%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/block_weights.rs (100%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/cumulus_pallet_xcmp_queue.rs (93%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/extrinsic_weights.rs (100%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/frame_system.rs (96%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/mod.rs (100%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_assets.rs (99%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_balances.rs (97%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_collator_selection.rs (98%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_multisig.rs (97%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_nft_fractionalization.rs (92%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_nfts.rs (99%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_proxy.rs (98%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_session.rs (94%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_timestamp.rs (93%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_uniques.rs (99%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_utility.rs (95%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/pallet_xcm.rs (98%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/paritydb_weights.rs (100%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/rocksdb_weights.rs (100%) rename parachains/runtimes/assets/{statemint => asset-hub-westend}/src/weights/xcm/mod.rs (98%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs (97%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/weights/xcm/pallet_xcm_benchmarks_generic.rs (98%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/src/xcm_config.rs (98%) rename parachains/runtimes/assets/{westmint => asset-hub-westend}/tests/tests.rs (99%) rename polkadot-parachain/src/chain_spec/{statemint.rs => asset_hubs.rs} (71%) diff --git a/.github/pr-custom-review.yml b/.github/pr-custom-review.yml index b833d3a01aa..fc26ee677f0 100644 --- a/.github/pr-custom-review.yml +++ b/.github/pr-custom-review.yml @@ -6,7 +6,7 @@ action-review-team: ci rules: - name: Runtime files check_type: changed_files - condition: ^parachains/runtimes/assets/(statemine|statemint)/src/[^/]+\.rs$|^parachains/runtimes/bridge-hubs/(bridge-hub-kusama|bridge-hub-polkadot)/src/[^/]+\.rs$|^parachains/runtimes/collectives/collectives-polkadot/src/[^/]+\.rs$|^parachains/common/src/[^/]+\.rs$ + condition: ^parachains/runtimes/assets/(asset-hub-kusama|asset-hub-polkadot)/src/[^/]+\.rs$|^parachains/runtimes/bridge-hubs/(bridge-hub-kusama|bridge-hub-polkadot)/src/[^/]+\.rs$|^parachains/runtimes/collectives/collectives-polkadot/src/[^/]+\.rs$|^parachains/common/src/[^/]+\.rs$ all_distinct: - min_approvals: 1 teams: @@ -20,7 +20,7 @@ rules: condition: include: .* # excluding files from 'Runtime files' and 'CI files' rules and `Bridges subtree files` - exclude: ^parachains/runtimes/assets/(statemine|statemint)/src/[^/]+\.rs$|^parachains/runtimes/bridge-hubs/(bridge-hub-kusama|bridge-hub-polkadot)/src/[^/]+\.rs$|^parachains/runtimes/collectives/collectives-polkadot/src/[^/]+\.rs$|^parachains/common/src/[^/]+\.rs$|^\.gitlab-ci\.yml|^scripts/ci/.*|^\.github/.* + exclude: ^parachains/runtimes/assets/(asset-hub-kusama|asset-hub-polkadot)/src/[^/]+\.rs$|^parachains/runtimes/bridge-hubs/(bridge-hub-kusama|bridge-hub-polkadot)/src/[^/]+\.rs$|^parachains/runtimes/collectives/collectives-polkadot/src/[^/]+\.rs$|^parachains/common/src/[^/]+\.rs$|^\.gitlab-ci\.yml|^scripts/ci/.*|^\.github/.* min_approvals: 2 teams: - core-devs diff --git a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml index 5a7d695ec98..2f4552b928f 100644 --- a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml +++ b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml @@ -14,7 +14,7 @@ on: required: true chain: description: The name of the chain under test. Usually, you would pass a local chain - default: statemine-local + default: asset-hub-kusama-local required: true jobs: diff --git a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml index 7fde56ef1b2..79fa11b3f9c 100644 --- a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml +++ b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml @@ -28,14 +28,14 @@ jobs: fail-fast: false matrix: include: - - runtime: statemine - local: statemine-local + - runtime: asset-hub-kusama + local: asset-hub-kusama-local + relay: kusama-local + - runtime: asset-hub-polkadot + local: asset-hub-polkadot-local relay: polkadot-local - - runtime: statemint - local: statemint-local - relay: polkadot-local - - runtime: westmint - local: westmint-local + - runtime: asset-hub-westend + local: asset-hub-westend-local relay: polkadot-local - runtime: contracts-rococo local: contracts-rococo-local diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index c4bb546dc78..b79f1948c16 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -45,11 +45,11 @@ jobs: matrix: include: - category: assets - runtime: statemine + runtime: asset-hub-kusama - category: assets - runtime: statemint + runtime: asset-hub-polkadot - category: assets - runtime: westmint + runtime: asset-hub-westend - category: bridge-hubs runtime: bridge-hub-polkadot - category: bridge-hubs @@ -223,11 +223,11 @@ jobs: matrix: include: - category: assets - runtime: statemine + runtime: asset-hub-kusama - category: assets - runtime: statemint + runtime: asset-hub-polkadot - category: assets - runtime: westmint + runtime: asset-hub-westend - category: bridge-hubs runtime: bridge-hub-polkadot - category: bridge-hubs diff --git a/.github/workflows/srtool.yml b/.github/workflows/srtool.yml index 3ac4ff8be55..b717a12ce86 100644 --- a/.github/workflows/srtool.yml +++ b/.github/workflows/srtool.yml @@ -32,11 +32,11 @@ jobs: matrix: include: - category: assets - runtime: statemine + runtime: asset-hub-kusama - category: assets - runtime: statemint + runtime: asset-hub-polkadot - category: assets - runtime: westmint + runtime: asset-hub-westend - category: bridge-hubs runtime: bridge-hub-polkadot - category: bridge-hubs diff --git a/Cargo.lock b/Cargo.lock index 305c986fdb1..59aa83e787b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -364,6 +364,266 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +[[package]] +name = "asset-hub-kusama-integration-tests" +version = "1.0.0" +dependencies = [ + "asset-hub-kusama-runtime", + "frame-support", + "frame-system", + "integration-tests-common", + "pallet-assets", + "pallet-balances", + "pallet-xcm", + "parachains-common", + "parity-scale-codec", + "penpal-runtime", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-runtime", + "polkadot-runtime-parachains", + "sp-core", + "sp-runtime", + "sp-weights", + "xcm", + "xcm-emulator", + "xcm-executor", +] + +[[package]] +name = "asset-hub-kusama-runtime" +version = "0.9.420" +dependencies = [ + "asset-test-utils", + "assets-common", + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-session-benchmarking", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-timestamp", + "cumulus-primitives-utility", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal 0.4.1", + "kusama-runtime-constants", + "log", + "pallet-asset-tx-payment", + "pallet-assets", + "pallet-aura", + "pallet-authorship", + "pallet-balances", + "pallet-collator-selection", + "pallet-multisig", + "pallet-nfts", + "pallet-nfts-runtime-api", + "pallet-proxy", + "pallet-session", + "pallet-state-trie-migration", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-uniques", + "pallet-utility", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parachain-info", + "parachains-common", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-runtime-common", + "scale-info", + "smallvec", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "sp-weights", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "asset-hub-polkadot-integration-tests" +version = "1.0.0" +dependencies = [ + "asset-hub-polkadot-runtime", + "frame-support", + "frame-system", + "integration-tests-common", + "pallet-assets", + "pallet-balances", + "pallet-xcm", + "parachains-common", + "parity-scale-codec", + "penpal-runtime", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-runtime", + "polkadot-runtime-parachains", + "sp-core", + "sp-runtime", + "sp-weights", + "xcm", + "xcm-emulator", + "xcm-executor", +] + +[[package]] +name = "asset-hub-polkadot-runtime" +version = "0.9.420" +dependencies = [ + "asset-test-utils", + "assets-common", + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-session-benchmarking", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-timestamp", + "cumulus-primitives-utility", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal 0.4.1", + "log", + "pallet-asset-tx-payment", + "pallet-assets", + "pallet-aura", + "pallet-authorship", + "pallet-balances", + "pallet-collator-selection", + "pallet-multisig", + "pallet-nfts", + "pallet-nfts-runtime-api", + "pallet-proxy", + "pallet-session", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-uniques", + "pallet-utility", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parachain-info", + "parachains-common", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-runtime-common", + "polkadot-runtime-constants", + "scale-info", + "smallvec", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "sp-weights", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "asset-hub-westend-runtime" +version = "0.9.420" +dependencies = [ + "asset-test-utils", + "assets-common", + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-session-benchmarking", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-timestamp", + "cumulus-primitives-utility", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal 0.4.1", + "log", + "pallet-asset-tx-payment", + "pallet-assets", + "pallet-aura", + "pallet-authorship", + "pallet-balances", + "pallet-collator-selection", + "pallet-multisig", + "pallet-nft-fractionalization", + "pallet-nfts", + "pallet-nfts-runtime-api", + "pallet-proxy", + "pallet-session", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-uniques", + "pallet-utility", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parachain-info", + "parachains-common", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-runtime-common", + "scale-info", + "smallvec", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder", + "westend-runtime-constants", + "xcm", + "xcm-builder", + "xcm-executor", +] + [[package]] name = "asset-test-utils" version = "1.0.0" @@ -4881,6 +5141,8 @@ dependencies = [ name = "integration-tests-common" version = "1.0.0" dependencies = [ + "asset-hub-kusama-runtime", + "asset-hub-polkadot-runtime", "bridge-hub-kusama-runtime", "bridge-hub-polkadot-runtime", "collectives-polkadot-runtime", @@ -4911,8 +5173,6 @@ dependencies = [ "sp-core", "sp-runtime", "sp-weights", - "statemine-runtime", - "statemint-runtime", "xcm", "xcm-emulator", "xcm-executor", @@ -9454,6 +9714,9 @@ name = "polkadot-parachain-bin" version = "0.9.420" dependencies = [ "assert_cmd", + "asset-hub-kusama-runtime", + "asset-hub-polkadot-runtime", + "asset-hub-westend-runtime", "async-trait", "bridge-hub-kusama-runtime", "bridge-hub-polkadot-runtime", @@ -9517,8 +9780,6 @@ dependencies = [ "sp-session", "sp-timestamp", "sp-transaction-pool", - "statemine-runtime", - "statemint-runtime", "substrate-build-script-utils", "substrate-frame-rpc-system", "substrate-prometheus-endpoint", @@ -9527,7 +9788,6 @@ dependencies = [ "tokio", "try-runtime-cli", "wait-timeout", - "westmint-runtime", "xcm", ] @@ -13599,197 +13859,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "statemine-it" -version = "1.0.0" -dependencies = [ - "frame-support", - "frame-system", - "integration-tests-common", - "pallet-assets", - "pallet-balances", - "pallet-xcm", - "parachains-common", - "parity-scale-codec", - "penpal-runtime", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime", - "polkadot-runtime-parachains", - "sp-core", - "sp-runtime", - "sp-weights", - "statemine-runtime", - "xcm", - "xcm-emulator", - "xcm-executor", -] - -[[package]] -name = "statemine-runtime" -version = "2.0.0" -dependencies = [ - "asset-test-utils", - "assets-common", - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal 0.4.1", - "kusama-runtime-constants", - "log", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-multisig", - "pallet-nfts", - "pallet-nfts-runtime-api", - "pallet-proxy", - "pallet-session", - "pallet-state-trie-migration", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-uniques", - "pallet-utility", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime-common", - "scale-info", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "sp-weights", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "statemint-it" -version = "1.0.0" -dependencies = [ - "frame-support", - "frame-system", - "integration-tests-common", - "pallet-assets", - "pallet-balances", - "pallet-xcm", - "parachains-common", - "parity-scale-codec", - "penpal-runtime", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime", - "polkadot-runtime-parachains", - "sp-core", - "sp-runtime", - "sp-weights", - "statemint-runtime", - "xcm", - "xcm-emulator", - "xcm-executor", -] - -[[package]] -name = "statemint-runtime" -version = "1.0.0" -dependencies = [ - "asset-test-utils", - "assets-common", - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal 0.4.1", - "log", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-multisig", - "pallet-nfts", - "pallet-nfts-runtime-api", - "pallet-proxy", - "pallet-session", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-uniques", - "pallet-utility", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime-common", - "polkadot-runtime-constants", - "scale-info", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "sp-weights", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - [[package]] name = "static_assertions" version = "1.1.0" @@ -15709,75 +15778,6 @@ dependencies = [ "sp-weights", ] -[[package]] -name = "westmint-runtime" -version = "1.0.0" -dependencies = [ - "asset-test-utils", - "assets-common", - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal 0.4.1", - "log", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-multisig", - "pallet-nft-fractionalization", - "pallet-nfts", - "pallet-nfts-runtime-api", - "pallet-proxy", - "pallet-session", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-uniques", - "pallet-utility", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime-common", - "scale-info", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "westend-runtime-constants", - "xcm", - "xcm-builder", - "xcm-executor", -] - [[package]] name = "which" version = "4.2.2" diff --git a/Cargo.toml b/Cargo.toml index faec5a0288a..d03e720da64 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,9 +42,9 @@ members = [ "parachains/runtimes/starters/shell", "parachains/runtimes/starters/seedling", "parachains/runtimes/assets/common", - "parachains/runtimes/assets/statemint", - "parachains/runtimes/assets/statemine", - "parachains/runtimes/assets/westmint", + "parachains/runtimes/assets/asset-hub-polkadot", + "parachains/runtimes/assets/asset-hub-kusama", + "parachains/runtimes/assets/asset-hub-westend", "parachains/runtimes/bridge-hubs/bridge-hub-rococo", "parachains/runtimes/bridge-hubs/bridge-hub-kusama", "parachains/runtimes/bridge-hubs/bridge-hub-polkadot", @@ -53,8 +53,8 @@ members = [ "parachains/runtimes/glutton/glutton-kusama", "parachains/runtimes/testing/penpal", "parachains/integration-tests/emulated/common", - "parachains/integration-tests/emulated/assets/statemine", - "parachains/integration-tests/emulated/assets/statemint", + "parachains/integration-tests/emulated/assets/asset-hub-kusama", + "parachains/integration-tests/emulated/assets/asset-hub-polkadot", "test/client", "test/relay-sproof-builder", "test/relay-validation-worker-provider", diff --git a/README.md b/README.md index fe6836e03ae..b9ebebfe3a7 100644 --- a/README.md +++ b/README.md @@ -167,16 +167,14 @@ cargo build --release --bin polkadot-parachain ![image](https://user-images.githubusercontent.com/2915325/99548884-1be13580-2987-11eb-9a8b-20be658d34f9.png) -## Statemint 🪙 +## Asset Hub 🪙 -This repository also contains the Statemint runtime (as well as the canary runtime Statemine and the -test runtime Westmint). -Statemint is a system parachain providing an asset store for the Polkadot ecosystem. +This repository also contains the Asset Hub runtimes. Asset Hub is a system parachain providing an +asset store for the Polkadot ecosystem. ### Build & Launch a Node -To run a Statemine or Westmint node (Statemint is not deployed, yet) you will need to compile the -`polkadot-parachain` binary: +To run an Asset Hub node, you will need to compile the `polkadot-parachain` binary: ```bash cargo build --release --locked --bin polkadot-parachain @@ -185,7 +183,7 @@ cargo build --release --locked --bin polkadot-parachain Once the executable is built, launch the parachain node via: ```bash -CHAIN=westmint # or statemine +CHAIN=asset-hub-westend # or asset-hub-kusama ./target/release/polkadot-parachain --chain $CHAIN ``` @@ -244,7 +242,7 @@ Once the executable is built, launch collators for each parachain (repeat once e ### Parachains -* [Statemint](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-statemint-rpc.polkadot.io#/explorer) +* [Asset Hub](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-statemint-rpc.polkadot.io#/explorer) * [Contracts on Rococo](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-contracts-rpc.polkadot.io#/explorer) * [RILT](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo.kilt.io#/explorer) diff --git a/bridges/docs/polkadot-kusama-bridge-overview.md b/bridges/docs/polkadot-kusama-bridge-overview.md index 9f407b6ba00..b469720f65b 100644 --- a/bridges/docs/polkadot-kusama-bridge-overview.md +++ b/bridges/docs/polkadot-kusama-bridge-overview.md @@ -24,9 +24,9 @@ You won't be able to directly use bridge hub transactions to send XCM messages o to use other parachains transactions, which will use HRMP to deliver messages to the Bridge Hub. The Bridge Hub will just queue these messages in its outbound lane, which is dedicated to deliver messages between two parachains. -Our first planned bridge will connect the Polkadot' Statemint and Kusama' Statemine. Bridge between those two -parachains would allow Statemint accounts to hold wrapped KSM tokens and Statemine accounts to hold wrapped DOT -tokens. +Our first planned bridge will connect the Polkadot and Kusama Asset Hubs. A bridge between those two +parachains would allow Asset Hub Polkadot accounts to hold wrapped KSM tokens and Asset Hub Kusama +accounts to hold wrapped DOT tokens. For that bridge (pair of parachains under different consensus systems) we'll be using the lane 00000000. Later, when other parachains will join the bridge, they will be using other lanes for their messages. @@ -93,13 +93,13 @@ Obviously, there should be someone who is paying relayer rewards. We want bridge can't use fees for rewards. Instead, the parachains using the bridge, use sovereign accounts on both sides of the bridge to cover relayer rewards. -Bridged Parachains will have sovereign accounts at bridge hubs. For example, the Statemine (Kusama Parachain) will -have an account at the Polkadot Bridge Hub. The Statemint (Polkadot Parachain) will have an account at the Kusama +Bridged Parachains will have sovereign accounts at bridge hubs. For example, the Kusama Asset Hub will +have an account at the Polkadot Bridge Hub. The Polkadot Asset Hub will have an account at the Kusama Bridge Hub. The sovereign accounts are used as a source of funds when the relayer is calling the `pallet_bridge_relayers::claim_rewards`. Since messages lane is only used by the pair of parachains, there's no collision between different bridges. E.g. -Statemine will only reward relayers that are delivering messages from Statemine. The Statemine sovereign account +Kusama Asset Hub will only reward relayers that are delivering messages from Kusama Asset Hub. The Kusama Asset Hub sovereign account is not used to cover rewards of bridging with some other Polkadot Parachain. ### Multiple Relayers and Rewards diff --git a/bridges/docs/polkadot-kusama-bridge.html b/bridges/docs/polkadot-kusama-bridge.html index dcbae0e7b17..bf248adb571 100644 --- a/bridges/docs/polkadot-kusama-bridge.html +++ b/bridges/docs/polkadot-kusama-bridge.html @@ -16,7 +16,7 @@

Polkadot <> Kusama Bridge

In our architecture, the lane that is used to relay messages over the bridge is determined by - the XCM source and destinations. So e.g. bridge between Statemint and Statemine (and opposite direction) + the XCM source and destinations. So e.g. bridge between Asset Hubs Polkadot and Kusama (and opposite direction) will use the lane 00000000, bridge between some other Polkadot Parachain and some other Kusama Parachain will use the lane 00000001 and so on.

@@ -24,29 +24,29 @@

Polkadot <> Kusama Bridge

flowchart LR subgraph Polkadot Consensus polkadot(((Polkadot))) - statemint(((Statemint))) + asset_hub_polkadot(((Polkadot Asset Hub))) polkadot_bh(((Polkadot Bridge Hub))) - polkadot---statemint + polkadot---asset_hub_polkadot polkadot---polkadot_bh - statemint-->|Send Message Using HRMP|polkadot_bh + asset_hub_polkadot-->|Send Message Using HRMP|polkadot_bh - polkadot_bh-->|Send Message Using HRMP|statemint - statemint-->|Dispatch the Message|statemint + polkadot_bh-->|Send Message Using HRMP|asset_hub_polkadot + asset_hub_polkadot-->|Dispatch the Message|asset_hub_polkadot end subgraph Kusama Consensus kusama_bh(((Kusama Bridge Hub))) - statemine(((Statemine))) + asset_hub_kusama(((Kusama Asset Hub))) kusama(((Kusama))) - kusama---statemine + kusama---asset_hub_kusama kusama---kusama_bh - kusama_bh-->|Send Message Using HRMP|statemine - statemine-->|Dispatch the Message|statemine + kusama_bh-->|Send Message Using HRMP|asset_hub_kusama + asset_hub_kusama-->|Dispatch the Message|asset_hub_kusama - statemine-->|Send Message Using HRMP|kusama_bh + asset_hub_kusama-->|Send Message Using HRMP|kusama_bh end polkadot_bh<===>|Message is relayed to the Bridged Chain using lane 00000000|kusama_bh diff --git a/bridges/modules/messages/README.md b/bridges/modules/messages/README.md index b717db6ad62..b5250d0dca0 100644 --- a/bridges/modules/messages/README.md +++ b/bridges/modules/messages/README.md @@ -33,8 +33,8 @@ is the runtime developer who defines what message lane and message mean for this In our [Kusama<>Polkadot bridge](../../docs/polkadot-kusama-bridge-overview.md) we are using lane as a channel of communication between two parachains of different relay chains. For example, lane -`[0, 0, 0, 0]` is used for Statemint <> Statemine communications. Other lanes may be used to bridge -another parachains. +`[0, 0, 0, 0]` is used for Polkadot <> Kusama Asset Hub communications. Other lanes may be used to +bridge other parachains. ## Message Workflow diff --git a/bridges/primitives/runtime/src/lib.rs b/bridges/primitives/runtime/src/lib.rs index 48c1ec13e89..1ce1b7a0eed 100644 --- a/bridges/primitives/runtime/src/lib.rs +++ b/bridges/primitives/runtime/src/lib.rs @@ -76,8 +76,8 @@ pub const KUSAMA_CHAIN_ID: ChainId = *b"ksma"; /// Westend chain id. pub const WESTEND_CHAIN_ID: ChainId = *b"wend"; -/// Westend chain id. -pub const WESTMINT_CHAIN_ID: ChainId = *b"wmnt"; +/// AssetHubWestend chain id. +pub const ASSET_HUB_WESTEND_CHAIN_ID: ChainId = *b"ahwe"; /// Rococo chain id. pub const ROCOCO_CHAIN_ID: ChainId = *b"roco"; diff --git a/docs/release.md b/docs/release.md index 9c0a6acc0e9..b04c4e844c4 100644 --- a/docs/release.md +++ b/docs/release.md @@ -37,8 +37,8 @@ performed during the release process. ### Burn In -Ensure that Parity DevOps has run the new release on Westmint and Statemine collators for 12h prior to publishing the -release. +Ensure that Parity DevOps has run the new release on Westend and Kusama Asset Hub collators for 12h +prior to publishing the release. ### Build Artifacts @@ -84,15 +84,15 @@ To verify the order has not changed, manually start the following [Github Action To run it, in the _Run Workflow_ dropdown: 1. **Use workflow from**: to ignore, leave `master` as default 2. **The WebSocket url of the reference node**: - - Statemint: `wss://statemint-rpc.polkadot.io` - - Statemine: `wss://statemine-rpc.polkadot.io` - - Westmint: `wss://westmint-rpc.polkadot.io` + - Asset Hub Polkadot: `wss://statemint-rpc.polkadot.io` + - Asset Hub Kusama: `wss://statemine-rpc.polkadot.io` + - Asset Hub Westend: `wss://westmint-rpc.polkadot.io` 3. **A url to a Linux binary for the node containing the runtime to test**: Paste the URL of the latest release-candidate binary from the draft-release on Github. The binary has to previously be uploaded to S3 (Github url link to the binary is constantly changing) - E.g: https://releases.parity.io/cumulus/v0.9.270-rc3/polkadot-parachain 4. **The name of the chain under test. Usually, you would pass a local chain**: - - Statemint: `statemint-local` - - Statemine: `statemine-local` - - Westmint: `westmint-local` + - Asset Hub Polkadot: `asset-hub-polkadot-local` + - Asset Hub Kusama: `asset-hub-kusama-local` + - Asset Hub Westend: `asset-hub-westend-local` 5. Click **Run workflow** When the workflow is done, click on it and download the zip artifact, inside you'll find an `output.txt` file. The things to look for in the output are lines like: @@ -114,7 +114,7 @@ The Benchmarks can now be started from the CI. First find the CI pipeline from [ ### Integration Tests Until https://github.com/paritytech/ci_cd/issues/499 is done, tests will have to be run manually. -1. Go to https://github.com/paritytech/parachains-integration-tests and checkout to the release branch. +1. Go to https://github.com/paritytech/parachains-integration-tests and check out the release branch. E.g. https://github.com/paritytech/parachains-integration-tests/tree/release-v9270-v0.9.27 for `release-parachains-v0.9.270` 2. Clone `release-parachains-` branch from Cumulus @@ -126,5 +126,5 @@ In case the branch does not exists (it is a manual process): cherry pick parityt 6. `cargo build --release --features fast-runtime` 7. Copy `./target/polkadot` into `./bin` (in Cumulus) 8. Run the tests: - - Statemint: `yarn zombienet-test -c ./examples/statemint/config.toml -t ./examples/statemint` - - Statemine: `yarn zombienet-test -c ./examples/statemine/config.toml -t ./examples/statemine` + - Asset Hub Polkadot: `yarn zombienet-test -c ./examples/statemint/config.toml -t ./examples/statemint` + - Asset Hub Kusama: `yarn zombienet-test -c ./examples/statemine/config.toml -t ./examples/statemine` diff --git a/pallets/session-benchmarking/Cargo.toml b/pallets/session-benchmarking/Cargo.toml index 111cbb85ee6..6bc7d845d70 100644 --- a/pallets/session-benchmarking/Cargo.toml +++ b/pallets/session-benchmarking/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" license = "Apache-2.0" homepage = "https://substrate.io" repository = "https://github.com/paritytech/cumulus/" -description = "FRAME sessions pallet benchmarking for statemint" +description = "FRAME sessions pallet benchmarking" readme = "README.md" [package.metadata.docs.rs] diff --git a/parachains/chain-specs/statemine_genesis_values.json b/parachains/chain-specs/asset-hub-kusama-genesis-values.json similarity index 100% rename from parachains/chain-specs/statemine_genesis_values.json rename to parachains/chain-specs/asset-hub-kusama-genesis-values.json diff --git a/parachains/chain-specs/statemine_genesis.json b/parachains/chain-specs/asset-hub-kusama-genesis.json similarity index 99% rename from parachains/chain-specs/statemine_genesis.json rename to parachains/chain-specs/asset-hub-kusama-genesis.json index 8b0dee2f8cf..d6eeb567c25 100644 --- a/parachains/chain-specs/statemine_genesis.json +++ b/parachains/chain-specs/asset-hub-kusama-genesis.json @@ -1,6 +1,6 @@ { - "name": "Statemine", - "id": "statemine", + "name": "Kusama Asset Hub", + "id": "asset-hub-kusama", "chainType": "Live", "bootNodes": [ "/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWHGksh2JFMaW8AkZvyhVpmiXUJnCQbngExTLMdq753ZQR" diff --git a/parachains/chain-specs/statemine.json b/parachains/chain-specs/asset-hub-kusama.json similarity index 99% rename from parachains/chain-specs/statemine.json rename to parachains/chain-specs/asset-hub-kusama.json index bf296a173b9..ccbe8f0326c 100644 --- a/parachains/chain-specs/statemine.json +++ b/parachains/chain-specs/asset-hub-kusama.json @@ -1,6 +1,6 @@ { - "name": "Statemine", - "id": "statemine", + "name": "Kusama Asset Hub", + "id": "asset-hub-kusama", "chainType": "Live", "bootNodes": [ "/ip4/34.77.217.152/tcp/30334/p2p/12D3KooWF63ZxKtZMYs5247WQA8fcTiGJb2osXykc31cmjwNLwem", diff --git a/parachains/chain-specs/statemint_genesis_values.json b/parachains/chain-specs/asset-hub-polkadot-genesis-values.json similarity index 100% rename from parachains/chain-specs/statemint_genesis_values.json rename to parachains/chain-specs/asset-hub-polkadot-genesis-values.json diff --git a/parachains/chain-specs/statemint_genesis_values.scale b/parachains/chain-specs/asset-hub-polkadot-genesis-values.scale similarity index 100% rename from parachains/chain-specs/statemint_genesis_values.scale rename to parachains/chain-specs/asset-hub-polkadot-genesis-values.scale diff --git a/parachains/chain-specs/statemint_genesis.json b/parachains/chain-specs/asset-hub-polkadot-genesis.json similarity index 99% rename from parachains/chain-specs/statemint_genesis.json rename to parachains/chain-specs/asset-hub-polkadot-genesis.json index 2763994949e..fff9bbe1ea1 100644 --- a/parachains/chain-specs/statemint_genesis.json +++ b/parachains/chain-specs/asset-hub-polkadot-genesis.json @@ -1,6 +1,6 @@ { - "name": "Statemint", - "id": "statemint", + "name": "Polkadot Asset Hub", + "id": "asset-hub-polkadot", "chainType": "Live", "bootNodes": [ "/ip4/34.65.251.121/tcp/30334/p2p/12D3KooWG3GrM6XKMM4gp3cvemdwUvu96ziYoJmqmetLZBXE8bSa", diff --git a/parachains/chain-specs/statemint.json b/parachains/chain-specs/asset-hub-polkadot.json similarity index 99% rename from parachains/chain-specs/statemint.json rename to parachains/chain-specs/asset-hub-polkadot.json index 61ca655af6c..5c18f90f70a 100644 --- a/parachains/chain-specs/statemint.json +++ b/parachains/chain-specs/asset-hub-polkadot.json @@ -1,6 +1,6 @@ { - "name": "Statemint", - "id": "statemint", + "name": "Polkadot Asset Hub", + "id": "asset-hub-polkadot", "chainType": "Live", "bootNodes": [ "/ip4/34.65.251.121/tcp/30334/p2p/12D3KooWG3GrM6XKMM4gp3cvemdwUvu96ziYoJmqmetLZBXE8bSa", diff --git a/parachains/chain-specs/rockmine.json b/parachains/chain-specs/asset-hub-rococo.json similarity index 99% rename from parachains/chain-specs/rockmine.json rename to parachains/chain-specs/asset-hub-rococo.json index d774da8744a..1a9e63a1cb8 100644 --- a/parachains/chain-specs/rockmine.json +++ b/parachains/chain-specs/asset-hub-rococo.json @@ -1,6 +1,6 @@ { - "name": "Rockmine", - "id": "statemine-rococo", + "name": "Rococo Asset Hub", + "id": "asset-hub-rococo", "chainType": "Live", "bootNodes": [ "/dns/rococo-rockmine-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWRrZMndHAopzao34uGsN7srjS3gh9nAjTGKLSyJeU31Lg", diff --git a/parachains/chain-specs/westmint_genesis_values.json b/parachains/chain-specs/asset-hub-westend-genesis-values.json similarity index 100% rename from parachains/chain-specs/westmint_genesis_values.json rename to parachains/chain-specs/asset-hub-westend-genesis-values.json diff --git a/parachains/chain-specs/westmint_genesis.json b/parachains/chain-specs/asset-hub-westend-genesis.json similarity index 99% rename from parachains/chain-specs/westmint_genesis.json rename to parachains/chain-specs/asset-hub-westend-genesis.json index ffd30fbe2de..09d07277c41 100644 --- a/parachains/chain-specs/westmint_genesis.json +++ b/parachains/chain-specs/asset-hub-westend-genesis.json @@ -1,6 +1,6 @@ { - "name": "Westmint", - "id": "westmint", + "name": "Westend Asset Hub", + "id": "asset-hub-westend", "chainType": "Live", "bootNodes": [ "/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWQWfQ6EBNgik1sW5by9vYagzrdsohc6NafeGPU4upnLRp" diff --git a/parachains/chain-specs/westmint.json b/parachains/chain-specs/asset-hub-westend.json similarity index 99% rename from parachains/chain-specs/westmint.json rename to parachains/chain-specs/asset-hub-westend.json index 17d768e58d7..14aaea348e9 100644 --- a/parachains/chain-specs/westmint.json +++ b/parachains/chain-specs/asset-hub-westend.json @@ -1,6 +1,6 @@ { - "name": "Westmint", - "id": "westmint", + "name": "Westend Asset Hub", + "id": "asset-hub-westend", "chainType": "Live", "bootNodes": [ "/dns/westend-westmint-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWJaAfPyiye7ZQBuHengTJJoMrcaz7Jj1UzHiKdNxA1Nkd", diff --git a/parachains/chain-specs/shell-statemint-head-data b/parachains/chain-specs/shell-head-data similarity index 100% rename from parachains/chain-specs/shell-statemint-head-data rename to parachains/chain-specs/shell-head-data diff --git a/parachains/chain-specs/shell-statemint.json b/parachains/chain-specs/shell.json similarity index 100% rename from parachains/chain-specs/shell-statemint.json rename to parachains/chain-specs/shell.json diff --git a/parachains/common/src/lib.rs b/parachains/common/src/lib.rs index 8ac464ea077..46a8af0fb2e 100644 --- a/parachains/common/src/lib.rs +++ b/parachains/common/src/lib.rs @@ -54,12 +54,12 @@ mod types { // Aura consensus authority. pub type AuraId = sp_consensus_aura::sr25519::AuthorityId; - // Aura consensus authority used by Statemint. + // Aura consensus authority used by Asset Hub Polkadot. // // Because of registering the authorities with an ed25519 key before switching from Shell - // to Statemint, we were required to deploy a hotfix that changed Statemint to ed22519. - // In the future that may change again. - pub type StatemintAuraId = sp_consensus_aura::ed25519::AuthorityId; + // to Asset Hub Polkadot, we were required to deploy a hotfix that changed Asset Hub Polkadot's + // Aura keys to ed22519. In the future that may change again. + pub type AssetHubPolkadotAuraId = sp_consensus_aura::ed25519::AuthorityId; // Id used for identifying assets. pub type AssetIdForTrustBackedAssets = u32; diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml b/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/0_init.yml similarity index 100% rename from parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml rename to parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/0_init.yml diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml b/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/1_dmp.yml similarity index 100% rename from parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml rename to parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/1_dmp.yml diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml similarity index 100% rename from parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml rename to parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/3_force_hrmp-open-channels.yml b/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/3_force_hrmp-open-channels.yml similarity index 100% rename from parachains/integration-tests/e2e/assets/statemine/0_xcm/3_force_hrmp-open-channels.yml rename to parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/3_force_hrmp-open-channels.yml diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml b/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/4_hrmp.yml similarity index 100% rename from parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml rename to parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/4_hrmp.yml diff --git a/parachains/integration-tests/e2e/assets/statemine/config.toml b/parachains/integration-tests/e2e/assets/asset-hub-kusama/config.toml similarity index 97% rename from parachains/integration-tests/e2e/assets/statemine/config.toml rename to parachains/integration-tests/e2e/assets/asset-hub-kusama/config.toml index 57c8f37e24b..1ec06b3fa10 100644 --- a/parachains/integration-tests/e2e/assets/statemine/config.toml +++ b/parachains/integration-tests/e2e/assets/asset-hub-kusama/config.toml @@ -26,7 +26,7 @@ chain = "kusama-local" [[parachains]] id = 1000 -chain = "statemine-local" +chain = "asset-hub-kusama-local" cumulus_based = true [[parachains.collators]] diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/0_init.yml similarity index 100% rename from parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml rename to parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/0_init.yml diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/1_dmp.yml similarity index 100% rename from parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml rename to parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/1_dmp.yml diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml similarity index 100% rename from parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml rename to parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/3_force_hrmp-open-channels.yml b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/3_force_hrmp-open-channels.yml similarity index 100% rename from parachains/integration-tests/e2e/assets/statemint/0_xcm/3_force_hrmp-open-channels.yml rename to parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/3_force_hrmp-open-channels.yml diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/4_hrmp.yml similarity index 100% rename from parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml rename to parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/4_hrmp.yml diff --git a/parachains/integration-tests/e2e/assets/statemint/config.toml b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/config.toml similarity index 97% rename from parachains/integration-tests/e2e/assets/statemint/config.toml rename to parachains/integration-tests/e2e/assets/asset-hub-polkadot/config.toml index 2e68734e09f..da53cd0ad4f 100644 --- a/parachains/integration-tests/e2e/assets/statemint/config.toml +++ b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/config.toml @@ -26,7 +26,7 @@ chain = "polkadot-local" [[parachains]] id = 1000 -chain = "statemint-local" +chain = "asset-hub-polkadot-local" cumulus_based = true [[parachains.collators]] diff --git a/parachains/integration-tests/emulated/assets/statemint/Cargo.toml b/parachains/integration-tests/emulated/assets/asset-hub-kusama/Cargo.toml similarity index 90% rename from parachains/integration-tests/emulated/assets/statemint/Cargo.toml rename to parachains/integration-tests/emulated/assets/asset-hub-kusama/Cargo.toml index 8c6077b67e4..a25e2116873 100644 --- a/parachains/integration-tests/emulated/assets/statemint/Cargo.toml +++ b/parachains/integration-tests/emulated/assets/asset-hub-kusama/Cargo.toml @@ -1,9 +1,9 @@ [package] -name = "statemint-it" +name = "asset-hub-kusama-integration-tests" version = "1.0.0" authors = ["Parity Technologies "] edition = "2021" -description = "Statemint parachain runtime integration tests with xcm-emulator" +description = "Asset Hub Kusama runtime integration tests with xcm-emulator" [dependencies] codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } @@ -29,7 +29,7 @@ pallet-xcm = { default-features = false, git = "https://github.com/paritytech/po # Cumulus parachains-common = { path = "../../../../common" } penpal-runtime = { path = "../../../../runtimes/testing/penpal" } -statemint-runtime = { path = "../../../../runtimes/assets/statemint" } +asset-hub-kusama-runtime = { path = "../../../../runtimes/assets/asset-hub-kusama" } # Local xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } diff --git a/parachains/integration-tests/emulated/assets/statemine/src/lib.rs b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/lib.rs similarity index 52% rename from parachains/integration-tests/emulated/assets/statemine/src/lib.rs rename to parachains/integration-tests/emulated/assets/asset-hub-kusama/src/lib.rs index 7616a871b84..49986fa3c83 100644 --- a/parachains/integration-tests/emulated/assets/statemine/src/lib.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/lib.rs @@ -8,13 +8,13 @@ pub use integration_tests_common::{ kusama::ED as KUSAMA_ED, PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, }, - AccountId, BHKusama, BHKusamaPallet, BHKusamaReceiver, BHKusamaSender, BHPolkadot, - BHPolkadotPallet, BHPolkadotReceiver, BHPolkadotSender, Collectives, CollectivesPallet, - CollectivesReceiver, CollectivesSender, Kusama, KusamaMockNet, KusamaPallet, KusamaReceiver, - KusamaSender, PenpalKusama, PenpalKusamaReceiver, PenpalKusamaSender, PenpalPolkadot, - PenpalPolkadotReceiver, PenpalPolkadotSender, Polkadot, PolkadotMockNet, PolkadotPallet, - PolkadotReceiver, PolkadotSender, Statemine, StateminePallet, StatemineReceiver, - StatemineSender, + AccountId, AssetHubKusama, AssetHubKusamaPallet, AssetHubKusamaReceiver, AssetHubKusamaSender, + BHKusama, BHKusamaPallet, BHKusamaReceiver, BHKusamaSender, BHPolkadot, BHPolkadotPallet, + BHPolkadotReceiver, BHPolkadotSender, Collectives, CollectivesPallet, CollectivesReceiver, + CollectivesSender, Kusama, KusamaMockNet, KusamaPallet, KusamaReceiver, KusamaSender, + PenpalKusama, PenpalKusamaReceiver, PenpalKusamaSender, PenpalPolkadot, PenpalPolkadotReceiver, + PenpalPolkadotSender, Polkadot, PolkadotMockNet, PolkadotPallet, PolkadotReceiver, + PolkadotSender, }; pub use polkadot_core_primitives::InboundDownwardMessage; pub use xcm::{ diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/mod.rs b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/mod.rs similarity index 100% rename from parachains/integration-tests/emulated/assets/statemine/src/tests/mod.rs rename to parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/mod.rs diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/reserve_transfer.rs similarity index 78% rename from parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs rename to parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/reserve_transfer.rs index bbf272572ac..46d6e9a807d 100644 --- a/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/reserve_transfer.rs @@ -5,13 +5,14 @@ fn reserve_transfer_native_asset_from_relay_to_assets() { // Init tests variables let amount = KUSAMA_ED * 1000; let relay_sender_balance_before = Kusama::account_data_of(KusamaSender::get()).free; - let para_receiver_balance_before = Statemine::account_data_of(StatemineReceiver::get()).free; + let para_receiver_balance_before = + AssetHubKusama::account_data_of(AssetHubKusamaReceiver::get()).free; let origin = ::RuntimeOrigin::signed(KusamaSender::get()); let assets_para_destination: VersionedMultiLocation = - Kusama::child_location_of(Statemine::para_id()).into(); + Kusama::child_location_of(AssetHubKusama::para_id()).into(); let beneficiary: VersionedMultiLocation = - AccountId32 { network: None, id: StatemineReceiver::get().into() }.into(); + AccountId32 { network: None, id: AssetHubKusamaReceiver::get().into() }.into(); let native_assets: VersionedMultiAssets = (Here, amount).into(); let fee_asset_item = 0; let weight_limit = WeightLimit::Unlimited; @@ -40,11 +41,11 @@ fn reserve_transfer_native_asset_from_relay_to_assets() { }); // Receive XCM message in Assets Parachain - Statemine::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; + AssetHubKusama::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( - Statemine, + AssetHubKusama, vec![ RuntimeEvent::DmpQueue(cumulus_pallet_dmp_queue::Event::ExecutedDownward { outcome: Outcome::Incomplete(_, Error::UntrustedReserveLocation), @@ -56,7 +57,8 @@ fn reserve_transfer_native_asset_from_relay_to_assets() { // Check if balances are updated accordingly in Relay Chain and Assets Parachain let relay_sender_balance_after = Kusama::account_data_of(KusamaSender::get()).free; - let para_sender_balance_after = Statemine::account_data_of(StatemineReceiver::get()).free; + let para_sender_balance_after = + AssetHubKusama::account_data_of(AssetHubKusamaReceiver::get()).free; assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); assert_eq!(para_sender_balance_after, para_receiver_balance_before); diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/teleport.rs similarity index 74% rename from parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs rename to parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/teleport.rs index cbb07e4592e..92849523d45 100644 --- a/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/teleport.rs @@ -5,13 +5,14 @@ fn teleport_native_assets_from_relay_to_assets_para() { // Init tests variables let amount = KUSAMA_ED * 1000; let relay_sender_balance_before = Kusama::account_data_of(KusamaSender::get()).free; - let para_receiver_balance_before = Statemine::account_data_of(StatemineReceiver::get()).free; + let para_receiver_balance_before = + AssetHubKusama::account_data_of(AssetHubKusamaReceiver::get()).free; let origin = ::RuntimeOrigin::signed(KusamaSender::get()); let assets_para_destination: VersionedMultiLocation = - Kusama::child_location_of(Statemine::para_id()).into(); + Kusama::child_location_of(AssetHubKusama::para_id()).into(); let beneficiary: VersionedMultiLocation = - AccountId32 { network: None, id: StatemineReceiver::get().into() }.into(); + AccountId32 { network: None, id: AssetHubKusamaReceiver::get().into() }.into(); let native_assets: VersionedMultiAssets = (Here, amount).into(); let fee_asset_item = 0; let weight_limit = WeightLimit::Unlimited; @@ -40,14 +41,14 @@ fn teleport_native_assets_from_relay_to_assets_para() { }); // Receive XCM message in Assets Parachain - Statemine::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; + AssetHubKusama::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( - Statemine, + AssetHubKusama, vec![ RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == StatemineReceiver::get().into(), + who: *who == AssetHubKusamaReceiver::get().into(), }, ] ); @@ -55,7 +56,8 @@ fn teleport_native_assets_from_relay_to_assets_para() { // Check if balances are updated accordingly in Relay Chain and Assets Parachain let relay_sender_balance_after = Kusama::account_data_of(KusamaSender::get()).free; - let para_sender_balance_after = Statemine::account_data_of(StatemineReceiver::get()).free; + let para_sender_balance_after = + AssetHubKusama::account_data_of(AssetHubKusamaReceiver::get()).free; assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); assert!(para_sender_balance_after > para_receiver_balance_before); diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/transact.rs b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/transact.rs similarity index 77% rename from parachains/integration-tests/emulated/assets/statemine/src/tests/transact.rs rename to parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/transact.rs index 144c8cc9f21..79542395e74 100644 --- a/parachains/integration-tests/emulated/assets/statemine/src/tests/transact.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/transact.rs @@ -6,14 +6,14 @@ fn transact_sudo_from_relay_to_assets_para() { // Call to be executed in Assets Parachain const ASSET_ID: u32 = 1; - let call = ::RuntimeCall::Assets(pallet_assets::Call::< - ::Runtime, + let call = ::RuntimeCall::Assets(pallet_assets::Call::< + ::Runtime, Instance1, >::force_create { id: ASSET_ID.into(), is_sufficient: true, min_balance: 1000, - owner: StatemineSender::get().into(), + owner: AssetHubKusamaSender::get().into(), }) .encode() .into(); @@ -21,7 +21,7 @@ fn transact_sudo_from_relay_to_assets_para() { // XcmPallet send arguments let sudo_origin = ::RuntimeOrigin::root(); let assets_para_destination: VersionedMultiLocation = - Kusama::child_location_of(Statemine::para_id()).into(); + Kusama::child_location_of(AssetHubKusama::para_id()).into(); let weight_limit = WeightLimit::Unlimited; let require_weight_at_most = Weight::from_parts(1000000000, 200000); @@ -52,7 +52,7 @@ fn transact_sudo_from_relay_to_assets_para() { }); // Receive XCM message in Assets Parachain - Statemine::execute_with(|| { - assert!(::Assets::asset_exists(ASSET_ID)); + AssetHubKusama::execute_with(|| { + assert!(::Assets::asset_exists(ASSET_ID)); }); } diff --git a/parachains/integration-tests/emulated/assets/statemine/Cargo.toml b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/Cargo.toml similarity index 90% rename from parachains/integration-tests/emulated/assets/statemine/Cargo.toml rename to parachains/integration-tests/emulated/assets/asset-hub-polkadot/Cargo.toml index 42ed5ac0605..b518257b1a5 100644 --- a/parachains/integration-tests/emulated/assets/statemine/Cargo.toml +++ b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/Cargo.toml @@ -1,9 +1,9 @@ [package] -name = "statemine-it" +name = "asset-hub-polkadot-integration-tests" version = "1.0.0" authors = ["Parity Technologies "] edition = "2021" -description = "Statemine parachain runtime integration tests with xcm-emulator" +description = "Asset Hub Polkadot runtime integration tests with xcm-emulator" [dependencies] codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } @@ -29,7 +29,7 @@ pallet-xcm = { default-features = false, git = "https://github.com/paritytech/po # Cumulus parachains-common = { path = "../../../../common" } penpal-runtime = { path = "../../../../runtimes/testing/penpal" } -statemine-runtime = { path = "../../../../runtimes/assets/statemine" } +asset-hub-polkadot-runtime = { path = "../../../../runtimes/assets/asset-hub-polkadot" } # Local xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } diff --git a/parachains/integration-tests/emulated/assets/statemint/src/lib.rs b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/lib.rs similarity index 50% rename from parachains/integration-tests/emulated/assets/statemint/src/lib.rs rename to parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/lib.rs index f7ca680a800..d29f9674dbf 100644 --- a/parachains/integration-tests/emulated/assets/statemint/src/lib.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/lib.rs @@ -8,13 +8,14 @@ pub use integration_tests_common::{ polkadot::ED as POLKADOT_ED, PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, }, - AccountId, BHKusama, BHKusamaPallet, BHKusamaReceiver, BHKusamaSender, BHPolkadot, - BHPolkadotPallet, BHPolkadotReceiver, BHPolkadotSender, Collectives, CollectivesPallet, - CollectivesReceiver, CollectivesSender, Kusama, KusamaMockNet, KusamaPallet, KusamaReceiver, - KusamaSender, PenpalKusama, PenpalKusamaReceiver, PenpalKusamaSender, PenpalPolkadot, - PenpalPolkadotReceiver, PenpalPolkadotSender, Polkadot, PolkadotMockNet, PolkadotPallet, - PolkadotReceiver, PolkadotSender, Statemine, StateminePallet, StatemineReceiver, - StatemineSender, Statemint, StatemintPallet, StatemintReceiver, StatemintSender, + AccountId, AssetHubKusama, AssetHubKusamaPallet, AssetHubKusamaReceiver, AssetHubKusamaSender, + AssetHubPolkadot, AssetHubPolkadotPallet, AssetHubPolkadotReceiver, AssetHubPolkadotSender, + BHKusama, BHKusamaPallet, BHKusamaReceiver, BHKusamaSender, BHPolkadot, BHPolkadotPallet, + BHPolkadotReceiver, BHPolkadotSender, Collectives, CollectivesPallet, CollectivesReceiver, + CollectivesSender, Kusama, KusamaMockNet, KusamaPallet, KusamaReceiver, KusamaSender, + PenpalKusama, PenpalKusamaReceiver, PenpalKusamaSender, PenpalPolkadot, PenpalPolkadotReceiver, + PenpalPolkadotSender, Polkadot, PolkadotMockNet, PolkadotPallet, PolkadotReceiver, + PolkadotSender, }; pub use polkadot_core_primitives::InboundDownwardMessage; pub use xcm::{ diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/mod.rs b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/mod.rs similarity index 100% rename from parachains/integration-tests/emulated/assets/statemint/src/tests/mod.rs rename to parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/mod.rs diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/reserve_transfer.rs similarity index 78% rename from parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs rename to parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/reserve_transfer.rs index b69222670b1..6b967ecf769 100644 --- a/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/reserve_transfer.rs @@ -5,13 +5,14 @@ fn reserve_transfer_native_asset_from_relay_to_assets() { // Init tests variables let amount = POLKADOT_ED * 1000; let relay_sender_balance_before = Polkadot::account_data_of(PolkadotSender::get()).free; - let para_receiver_balance_before = Statemint::account_data_of(StatemintReceiver::get()).free; + let para_receiver_balance_before = + AssetHubPolkadot::account_data_of(AssetHubPolkadotReceiver::get()).free; let origin = ::RuntimeOrigin::signed(PolkadotSender::get()); let assets_para_destination: VersionedMultiLocation = - Polkadot::child_location_of(Statemint::para_id()).into(); + Polkadot::child_location_of(AssetHubPolkadot::para_id()).into(); let beneficiary: VersionedMultiLocation = - AccountId32 { network: None, id: StatemintReceiver::get().into() }.into(); + AccountId32 { network: None, id: AssetHubPolkadotReceiver::get().into() }.into(); let native_assets: VersionedMultiAssets = (Here, amount).into(); let fee_asset_item = 0; let weight_limit = WeightLimit::Unlimited; @@ -40,11 +41,11 @@ fn reserve_transfer_native_asset_from_relay_to_assets() { }); // Receive XCM message in Assets Parachain - Statemint::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; + AssetHubPolkadot::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( - Statemint, + AssetHubPolkadot, vec![ RuntimeEvent::DmpQueue(cumulus_pallet_dmp_queue::Event::ExecutedDownward { outcome: Outcome::Incomplete(_, Error::UntrustedReserveLocation), @@ -56,7 +57,8 @@ fn reserve_transfer_native_asset_from_relay_to_assets() { // Check if balances are updated accordingly in Relay Chain and Assets Parachain let relay_sender_balance_after = Polkadot::account_data_of(PolkadotSender::get()).free; - let para_sender_balance_after = Statemint::account_data_of(StatemintReceiver::get()).free; + let para_sender_balance_after = + AssetHubPolkadot::account_data_of(AssetHubPolkadotReceiver::get()).free; assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); assert_eq!(para_sender_balance_after, para_receiver_balance_before); diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/teleport.rs similarity index 73% rename from parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs rename to parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/teleport.rs index 19aa5fe1f9e..eebdddfe506 100644 --- a/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/teleport.rs @@ -5,13 +5,14 @@ fn teleport_native_assets_from_relay_to_assets_para() { // Init tests variables let amount = POLKADOT_ED * 1000; let relay_sender_balance_before = Polkadot::account_data_of(PolkadotSender::get()).free; - let para_receiver_balance_before = Statemint::account_data_of(StatemintReceiver::get()).free; + let para_receiver_balance_before = + AssetHubPolkadot::account_data_of(AssetHubPolkadotReceiver::get()).free; let origin = ::RuntimeOrigin::signed(PolkadotSender::get()); let assets_para_destination: VersionedMultiLocation = - Polkadot::child_location_of(Statemint::para_id()).into(); + Polkadot::child_location_of(AssetHubPolkadot::para_id()).into(); let beneficiary: VersionedMultiLocation = - AccountId32 { network: None, id: StatemintReceiver::get().into() }.into(); + AccountId32 { network: None, id: AssetHubPolkadotReceiver::get().into() }.into(); let native_assets: VersionedMultiAssets = (Here, amount).into(); let fee_asset_item = 0; let weight_limit = WeightLimit::Unlimited; @@ -38,14 +39,14 @@ fn teleport_native_assets_from_relay_to_assets_para() { }); // Receive XCM message in Assets Parachain - Statemint::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; + AssetHubPolkadot::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( - Statemint, + AssetHubPolkadot, vec![ RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == StatemintReceiver::get().into(), + who: *who == AssetHubPolkadotReceiver::get().into(), }, ] ); @@ -53,7 +54,8 @@ fn teleport_native_assets_from_relay_to_assets_para() { // Check if balances are updated accordingly in Relay Chain and Assets Parachain let relay_sender_balance_after = Polkadot::account_data_of(PolkadotSender::get()).free; - let para_sender_balance_after = Statemint::account_data_of(StatemintReceiver::get()).free; + let para_sender_balance_after = + AssetHubPolkadot::account_data_of(AssetHubPolkadotReceiver::get()).free; assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); assert!(para_sender_balance_after > para_receiver_balance_before); diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/transact.rs b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/transact.rs similarity index 77% rename from parachains/integration-tests/emulated/assets/statemint/src/tests/transact.rs rename to parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/transact.rs index 9220d914e47..759e063dd93 100644 --- a/parachains/integration-tests/emulated/assets/statemint/src/tests/transact.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/transact.rs @@ -6,14 +6,14 @@ fn transact_sudo_from_relay_to_assets_para() { // Call to be executed in Assets Parachain const ASSET_ID: u32 = 1; - let call = ::RuntimeCall::Assets(pallet_assets::Call::< - ::Runtime, + let call = ::RuntimeCall::Assets(pallet_assets::Call::< + ::Runtime, Instance1, >::force_create { id: ASSET_ID.into(), is_sufficient: true, min_balance: 1000, - owner: StatemintSender::get().into(), + owner: AssetHubPolkadotSender::get().into(), }) .encode() .into(); @@ -21,7 +21,7 @@ fn transact_sudo_from_relay_to_assets_para() { // XcmPallet send arguments let sudo_origin = ::RuntimeOrigin::root(); let assets_para_destination: VersionedMultiLocation = - Polkadot::child_location_of(Statemint::para_id()).into(); + Polkadot::child_location_of(AssetHubPolkadot::para_id()).into(); let weight_limit = WeightLimit::Unlimited; let require_weight_at_most = Weight::from_parts(1000000000, 200000); @@ -52,7 +52,7 @@ fn transact_sudo_from_relay_to_assets_para() { }); // Receive XCM message in Assets Parachain - Statemint::execute_with(|| { - assert!(::Assets::asset_exists(ASSET_ID)); + AssetHubPolkadot::execute_with(|| { + assert!(::Assets::asset_exists(ASSET_ID)); }); } diff --git a/parachains/integration-tests/emulated/common/Cargo.toml b/parachains/integration-tests/emulated/common/Cargo.toml index a13ceac2cff..a05dd229798 100644 --- a/parachains/integration-tests/emulated/common/Cargo.toml +++ b/parachains/integration-tests/emulated/common/Cargo.toml @@ -41,8 +41,8 @@ parachains-common = { path = "../../../common" } parachain-info = { path = "../../../pallets/parachain-info" } cumulus-primitives-core = { path = "../../../../primitives/core" } penpal-runtime = { path = "../../../runtimes/testing/penpal" } -statemint-runtime = { path = "../../../runtimes/assets/statemint" } -statemine-runtime = { path = "../../../runtimes/assets/statemine" } +asset-hub-polkadot-runtime = { path = "../../../runtimes/assets/asset-hub-polkadot" } +asset-hub-kusama-runtime = { path = "../../../runtimes/assets/asset-hub-kusama" } collectives-polkadot-runtime = { path = "../../../runtimes/collectives/collectives-polkadot" } bridge-hub-kusama-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-kusama" } bridge-hub-polkadot-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-polkadot" } diff --git a/parachains/integration-tests/emulated/common/src/constants.rs b/parachains/integration-tests/emulated/common/src/constants.rs index 694137fe094..a4b3942c526 100644 --- a/parachains/integration-tests/emulated/common/src/constants.rs +++ b/parachains/integration-tests/emulated/common/src/constants.rs @@ -1,6 +1,6 @@ use grandpa::AuthorityId as GrandpaId; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; -pub use parachains_common::{AccountId, AuraId, Balance, BlockNumber, StatemintAuraId}; +pub use parachains_common::{AccountId, AssetHubPolkadotAuraId, AuraId, Balance, BlockNumber}; use polkadot_primitives::{AssignmentId, ValidatorId}; pub use polkadot_runtime_parachains::configuration::HostConfiguration; use polkadot_service::chain_spec::get_authority_keys_from_seed_no_beefy; @@ -71,15 +71,15 @@ pub mod accounts { pub mod collators { use super::*; - pub fn invulnerables_statemint() -> Vec<(AccountId, StatemintAuraId)> { + pub fn invulnerables_asset_hub_polkadot() -> Vec<(AccountId, AssetHubPolkadotAuraId)> { vec![ ( get_account_id_from_seed::("Alice"), - get_from_seed::("Alice"), + get_from_seed::("Alice"), ), ( get_account_id_from_seed::("Bob"), - get_from_seed::("Bob"), + get_from_seed::("Bob"), ), ] } @@ -305,29 +305,31 @@ pub mod kusama { } } -// Statemint -pub mod statemint { +// Asset Hub Polkadot +pub mod asset_hub_polkadot { use super::*; pub const PARA_ID: u32 = 1000; - pub const ED: Balance = statemint_runtime::constants::currency::EXISTENTIAL_DEPOSIT; + pub const ED: Balance = asset_hub_polkadot_runtime::constants::currency::EXISTENTIAL_DEPOSIT; pub fn genesis() -> Storage { - let genesis_config = statemint_runtime::GenesisConfig { - system: statemint_runtime::SystemConfig { - code: statemint_runtime::WASM_BINARY + let genesis_config = asset_hub_polkadot_runtime::GenesisConfig { + system: asset_hub_polkadot_runtime::SystemConfig { + code: asset_hub_polkadot_runtime::WASM_BINARY .expect("WASM binary was not build, please build it!") .to_vec(), }, - balances: statemint_runtime::BalancesConfig { + balances: asset_hub_polkadot_runtime::BalancesConfig { balances: accounts::init_balances() .iter() .cloned() .map(|k| (k, ED * 4096)) .collect(), }, - parachain_info: statemint_runtime::ParachainInfoConfig { parachain_id: PARA_ID.into() }, - collator_selection: statemint_runtime::CollatorSelectionConfig { - invulnerables: collators::invulnerables_statemint() + parachain_info: asset_hub_polkadot_runtime::ParachainInfoConfig { + parachain_id: PARA_ID.into(), + }, + collator_selection: asset_hub_polkadot_runtime::CollatorSelectionConfig { + invulnerables: collators::invulnerables_asset_hub_polkadot() .iter() .cloned() .map(|(acc, _)| acc) @@ -335,14 +337,14 @@ pub mod statemint { candidacy_bond: ED * 16, ..Default::default() }, - session: statemint_runtime::SessionConfig { - keys: collators::invulnerables_statemint() + session: asset_hub_polkadot_runtime::SessionConfig { + keys: collators::invulnerables_asset_hub_polkadot() .into_iter() .map(|(acc, aura)| { ( - acc.clone(), // account id - acc, // validator id - statemint_runtime::SessionKeys { aura }, // session keys + acc.clone(), // account id + acc, // validator id + asset_hub_polkadot_runtime::SessionKeys { aura }, // session keys ) }) .collect(), @@ -350,7 +352,7 @@ pub mod statemint { aura: Default::default(), aura_ext: Default::default(), parachain_system: Default::default(), - polkadot_xcm: statemint_runtime::PolkadotXcmConfig { + polkadot_xcm: asset_hub_polkadot_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), }, }; @@ -359,28 +361,30 @@ pub mod statemint { } } -// Statemint -pub mod statemine { +// Asset Hub Kusama +pub mod asset_hub_kusama { use super::*; pub const PARA_ID: u32 = 1000; - pub const ED: Balance = statemine_runtime::constants::currency::EXISTENTIAL_DEPOSIT; + pub const ED: Balance = asset_hub_kusama_runtime::constants::currency::EXISTENTIAL_DEPOSIT; pub fn genesis() -> Storage { - let genesis_config = statemine_runtime::GenesisConfig { - system: statemine_runtime::SystemConfig { - code: statemine_runtime::WASM_BINARY + let genesis_config = asset_hub_kusama_runtime::GenesisConfig { + system: asset_hub_kusama_runtime::SystemConfig { + code: asset_hub_kusama_runtime::WASM_BINARY .expect("WASM binary was not build, please build it!") .to_vec(), }, - balances: statemine_runtime::BalancesConfig { + balances: asset_hub_kusama_runtime::BalancesConfig { balances: accounts::init_balances() .iter() .cloned() .map(|k| (k, ED * 4096)) .collect(), }, - parachain_info: statemine_runtime::ParachainInfoConfig { parachain_id: PARA_ID.into() }, - collator_selection: statemine_runtime::CollatorSelectionConfig { + parachain_info: asset_hub_kusama_runtime::ParachainInfoConfig { + parachain_id: PARA_ID.into(), + }, + collator_selection: asset_hub_kusama_runtime::CollatorSelectionConfig { invulnerables: collators::invulnerables() .iter() .cloned() @@ -389,14 +393,14 @@ pub mod statemine { candidacy_bond: ED * 16, ..Default::default() }, - session: statemine_runtime::SessionConfig { + session: asset_hub_kusama_runtime::SessionConfig { keys: collators::invulnerables() .into_iter() .map(|(acc, aura)| { ( - acc.clone(), // account id - acc, // validator id - statemine_runtime::SessionKeys { aura }, // session keys + acc.clone(), // account id + acc, // validator id + asset_hub_kusama_runtime::SessionKeys { aura }, // session keys ) }) .collect(), @@ -404,7 +408,7 @@ pub mod statemine { aura: Default::default(), aura_ext: Default::default(), parachain_system: Default::default(), - polkadot_xcm: statemine_runtime::PolkadotXcmConfig { + polkadot_xcm: asset_hub_kusama_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), }, }; diff --git a/parachains/integration-tests/emulated/common/src/lib.rs b/parachains/integration-tests/emulated/common/src/lib.rs index 49e919b5de9..82ab42359e0 100644 --- a/parachains/integration-tests/emulated/common/src/lib.rs +++ b/parachains/integration-tests/emulated/common/src/lib.rs @@ -2,11 +2,11 @@ pub mod constants; pub use constants::{ accounts::{ALICE, BOB}, - bridge_hub_kusama, bridge_hub_polkadot, collectives, kusama, penpal, polkadot, statemine, - statemint, + asset_hub_kusama, asset_hub_polkadot, bridge_hub_kusama, bridge_hub_polkadot, collectives, + kusama, penpal, polkadot, }; use frame_support::{parameter_types, sp_io, sp_tracing}; -pub use parachains_common::{AccountId, AuraId, Balance, BlockNumber, StatemintAuraId}; +pub use parachains_common::{AccountId, AssetHubPolkadotAuraId, AuraId, Balance, BlockNumber}; pub use sp_core::{sr25519, storage::Storage, Get}; use xcm::prelude::*; use xcm_emulator::{ @@ -56,25 +56,25 @@ decl_test_relay_chains! { decl_test_parachains! { // Polkadot - pub struct Statemint { - genesis = statemint::genesis(), + pub struct AssetHubPolkadot { + genesis = asset_hub_polkadot::genesis(), on_init = (), runtime = { - Runtime: statemint_runtime::Runtime, - RuntimeOrigin: statemint_runtime::RuntimeOrigin, - RuntimeCall: statemint_runtime::RuntimeCall, - RuntimeEvent: statemint_runtime::RuntimeEvent, - XcmpMessageHandler: statemint_runtime::XcmpQueue, - DmpMessageHandler: statemint_runtime::DmpQueue, - LocationToAccountId: statemint_runtime::xcm_config::LocationToAccountId, - System: statemint_runtime::System, - Balances: statemint_runtime::Balances, - ParachainSystem: statemint_runtime::ParachainSystem, - ParachainInfo: statemint_runtime::ParachainInfo, + Runtime: asset_hub_polkadot_runtime::Runtime, + RuntimeOrigin: asset_hub_polkadot_runtime::RuntimeOrigin, + RuntimeCall: asset_hub_polkadot_runtime::RuntimeCall, + RuntimeEvent: asset_hub_polkadot_runtime::RuntimeEvent, + XcmpMessageHandler: asset_hub_polkadot_runtime::XcmpQueue, + DmpMessageHandler: asset_hub_polkadot_runtime::DmpQueue, + LocationToAccountId: asset_hub_polkadot_runtime::xcm_config::LocationToAccountId, + System: asset_hub_polkadot_runtime::System, + Balances: asset_hub_polkadot_runtime::Balances, + ParachainSystem: asset_hub_polkadot_runtime::ParachainSystem, + ParachainInfo: asset_hub_polkadot_runtime::ParachainInfo, }, pallets_extra = { - PolkadotXcm: statemint_runtime::PolkadotXcm, - Assets: statemint_runtime::Assets, + PolkadotXcm: asset_hub_polkadot_runtime::PolkadotXcm, + Assets: asset_hub_polkadot_runtime::Assets, } }, pub struct PenpalPolkadot { @@ -99,26 +99,26 @@ decl_test_parachains! { } }, // Kusama - pub struct Statemine { - genesis = statemine::genesis(), + pub struct AssetHubKusama { + genesis = asset_hub_kusama::genesis(), on_init = (), runtime = { - Runtime: statemine_runtime::Runtime, - RuntimeOrigin: statemine_runtime::RuntimeOrigin, - RuntimeCall: statemine_runtime::RuntimeCall, - RuntimeEvent: statemine_runtime::RuntimeEvent, - XcmpMessageHandler: statemine_runtime::XcmpQueue, - DmpMessageHandler: statemine_runtime::DmpQueue, - LocationToAccountId: statemine_runtime::xcm_config::LocationToAccountId, - System: statemine_runtime::System, - Balances: statemine_runtime::Balances, - ParachainSystem: statemine_runtime::ParachainSystem, - ParachainInfo: statemine_runtime::ParachainInfo, + Runtime: asset_hub_kusama_runtime::Runtime, + RuntimeOrigin: asset_hub_kusama_runtime::RuntimeOrigin, + RuntimeCall: asset_hub_kusama_runtime::RuntimeCall, + RuntimeEvent: asset_hub_kusama_runtime::RuntimeEvent, + XcmpMessageHandler: asset_hub_kusama_runtime::XcmpQueue, + DmpMessageHandler: asset_hub_kusama_runtime::DmpQueue, + LocationToAccountId: asset_hub_kusama_runtime::xcm_config::LocationToAccountId, + System: asset_hub_kusama_runtime::System, + Balances: asset_hub_kusama_runtime::Balances, + ParachainSystem: asset_hub_kusama_runtime::ParachainSystem, + ParachainInfo: asset_hub_kusama_runtime::ParachainInfo, }, pallets_extra = { - PolkadotXcm: statemine_runtime::PolkadotXcm, - Assets: statemine_runtime::Assets, - ForeignAssets: statemine_runtime::Assets, + PolkadotXcm: asset_hub_kusama_runtime::PolkadotXcm, + Assets: asset_hub_kusama_runtime::Assets, + ForeignAssets: asset_hub_kusama_runtime::Assets, } }, pub struct PenpalKusama { @@ -208,7 +208,7 @@ decl_test_networks! { pub struct PolkadotMockNet { relay_chain = Polkadot, parachains = vec![ - Statemint, + AssetHubPolkadot, PenpalPolkadot, Collectives, BHPolkadot, @@ -217,7 +217,7 @@ decl_test_networks! { pub struct KusamaMockNet { relay_chain = Kusama, parachains = vec![ - Statemine, + AssetHubKusama, PenpalKusama, BHKusama, ], @@ -231,12 +231,12 @@ parameter_types! { // Kusama pub KusamaSender: AccountId = Kusama::account_id_of(ALICE); pub KusamaReceiver: AccountId = Kusama::account_id_of(BOB); - // Statemint - pub StatemintSender: AccountId = Statemint::account_id_of(ALICE); - pub StatemintReceiver: AccountId = Statemint::account_id_of(BOB); - // Statemine - pub StatemineSender: AccountId = Statemine::account_id_of(ALICE); - pub StatemineReceiver: AccountId = Statemine::account_id_of(BOB); + // Asset Hub Polkadot + pub AssetHubPolkadotSender: AccountId = AssetHubPolkadot::account_id_of(ALICE); + pub AssetHubPolkadotReceiver: AccountId = AssetHubPolkadot::account_id_of(BOB); + // Asset Hub Kusama + pub AssetHubKusamaSender: AccountId = AssetHubKusama::account_id_of(ALICE); + pub AssetHubKusamaReceiver: AccountId = AssetHubKusama::account_id_of(BOB); // Penpal Polkadot pub PenpalPolkadotSender: AccountId = PenpalPolkadot::account_id_of(ALICE); pub PenpalPolkadotReceiver: AccountId = PenpalPolkadot::account_id_of(BOB); diff --git a/parachains/runtimes/assets/README.md b/parachains/runtimes/assets/README.md index 7f995d043c4..78145395cbf 100644 --- a/parachains/runtimes/assets/README.md +++ b/parachains/runtimes/assets/README.md @@ -1,9 +1,9 @@ # Assets Parachain -Implementation of _Statemint_, a blockchain to support generic assets in the Polkadot and Kusama -networks. +Implementation of Asset Hub, a blockchain to support generic assets in the Polkadot and Kusama +networks. Asset Hub was formerly known as "Statemint". -Statemint allows users to: +Asset Hub allows users to: - Deploy promise-backed assets, both fungible and non-fungible, with a DOT/KSM deposit. - Set admin roles to manage assets and asset classes. @@ -13,11 +13,11 @@ Statemint allows users to: - Transfer (and approve transfer) assets. - Interact with the chain via its transactional API or XCM. -Statemint must stay fully aligned with the Relay Chain it is connected to. As such, it will accept +Asset Hub must stay fully aligned with the Relay Chain it is connected to. As such, it will accept the Relay Chain's governance origins as its own. See -[the article on Statemint as common good parachain](https://www.parity.io/blog/statemint-generic-assets-chain-proposing-a-common-good-parachain-to-polkadot-governance/) +[the article on Asset Hub as common good parachain](https://www.parity.io/blog/statemint-generic-assets-chain-proposing-a-common-good-parachain-to-polkadot-governance/) for a higher level description. Wallets, custodians, etc. should see diff --git a/parachains/runtimes/assets/statemine/Cargo.toml b/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml similarity index 98% rename from parachains/runtimes/assets/statemine/Cargo.toml rename to parachains/runtimes/assets/asset-hub-kusama/Cargo.toml index 968e2339a36..b82cb096bb7 100644 --- a/parachains/runtimes/assets/statemine/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml @@ -1,9 +1,9 @@ [package] -name = "statemine-runtime" -version = "2.0.0" +name = "asset-hub-kusama-runtime" +version = "0.9.420" authors = ["Parity Technologies "] edition = "2021" -description = "Kusama variant of Statemint parachain runtime" +description = "Kusama variant of Asset Hub parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } diff --git a/parachains/runtimes/assets/statemine/build.rs b/parachains/runtimes/assets/asset-hub-kusama/build.rs similarity index 100% rename from parachains/runtimes/assets/statemine/build.rs rename to parachains/runtimes/assets/asset-hub-kusama/build.rs diff --git a/parachains/runtimes/assets/statemine/src/constants.rs b/parachains/runtimes/assets/asset-hub-kusama/src/constants.rs similarity index 98% rename from parachains/runtimes/assets/statemine/src/constants.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/constants.rs index 95e8c166a96..7822698be6c 100644 --- a/parachains/runtimes/assets/statemine/src/constants.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/constants.rs @@ -73,7 +73,7 @@ pub mod fee { type Balance = Balance; fn polynomial() -> WeightToFeeCoefficients { // in Kusama, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in Statemine, we map to 1/10 of that, or 1/100 CENT + // in Asset Hub, we map to 1/10 of that, or 1/100 CENT let p = super::currency::CENTS; let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs similarity index 98% rename from parachains/runtimes/assets/statemine/src/lib.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/lib.rs index e1f9fbe3dc2..f6e2a32eda8 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs @@ -13,9 +13,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! # Statemine Runtime +//! # Asset Hub Kusama Runtime //! -//! Statemine is the canary network for its Polkadot cousin, Statemint. +//! Asset Hub Kusama, formerly known as "Statemine", is the canary network for its Polkadot cousin. #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] @@ -94,6 +94,9 @@ impl_opaque_keys! { #[cfg(feature = "state-trie-version-1")] #[sp_version::runtime_version] pub const VERSION: RuntimeVersion = RuntimeVersion { + // Note: "statemine" is the legacy name for this chain. It has been renamed to + // "asset-hub-kusama". Many wallets/tools depend on the `spec_name`, so it remains "statemine" + // for the time being. Wallets/tools should update to treat "asset-hub-kusama" equally. spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, @@ -107,6 +110,9 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { #[cfg(not(feature = "state-trie-version-1"))] #[sp_version::runtime_version] pub const VERSION: RuntimeVersion = RuntimeVersion { + // Note: "statemine" is the legacy name for this change. It has been renamed to + // "asset-hub-kusama". Many wallets/tools depend on the `spec_name`, so it remains "statemine" + // for the time being. Wallets/tools should update to treat "asset-hub-kusama" equally. spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, diff --git a/parachains/runtimes/assets/statemine/src/weights/block_weights.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/block_weights.rs similarity index 100% rename from parachains/runtimes/assets/statemine/src/weights/block_weights.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/block_weights.rs diff --git a/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs similarity index 94% rename from parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs index b19f8098775..89bf59acdb0 100644 --- a/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=cumulus_pallet_xcmp_queue @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/extrinsic_weights.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/extrinsic_weights.rs similarity index 100% rename from parachains/runtimes/assets/statemine/src/weights/extrinsic_weights.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/extrinsic_weights.rs diff --git a/parachains/runtimes/assets/statemine/src/weights/frame_system.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/frame_system.rs similarity index 97% rename from parachains/runtimes/assets/statemine/src/weights/frame_system.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/frame_system.rs index 89098f48120..09c24b48259 100644 --- a/parachains/runtimes/assets/statemine/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/frame_system.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=frame_system @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/frame_system.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/frame_system.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/mod.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/mod.rs similarity index 100% rename from parachains/runtimes/assets/statemine/src/weights/mod.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/mod.rs diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets.rs similarity index 99% rename from parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets.rs index 29a01e5bb9a..410043bc4fe 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets.rs @@ -20,13 +20,13 @@ //! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_assets @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_assets.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_balances.rs similarity index 97% rename from parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_balances.rs index 3842783d98c..563df00f845 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_balances.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_balances @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_balances.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_balances.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_collator_selection.rs similarity index 98% rename from parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_collator_selection.rs index 7c518a45ddf..ece29bc35c4 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_collator_selection.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_collator_selection @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_collator_selection.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_collator_selection.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_multisig.rs similarity index 97% rename from parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_multisig.rs index 2753cea0a8f..04e704cc402 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_multisig.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_multisig @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_multisig.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_multisig.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_nfts.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nfts.rs similarity index 99% rename from parachains/runtimes/assets/statemint/src/weights/pallet_nfts.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nfts.rs index 1f1f718c9c5..689b1b750b9 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_nfts.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nfts.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_nfts @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_nfts.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nfts.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_proxy.rs similarity index 98% rename from parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_proxy.rs index 042af1203f5..27680ed3ea0 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_proxy.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_proxy @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_proxy.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_proxy.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_session.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_session.rs similarity index 94% rename from parachains/runtimes/assets/statemine/src/weights/pallet_session.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_session.rs index f0f02ace1eb..359ea9da901 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_session.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_session @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_session.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_session.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_timestamp.rs similarity index 94% rename from parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_timestamp.rs index 8ddde440fdf..ef8da150383 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_timestamp.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_timestamp @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_timestamp.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_timestamp.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_uniques.rs similarity index 99% rename from parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_uniques.rs index 80c1adfe5e6..3c9372e2e5f 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_uniques.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_uniques @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_uniques.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_uniques.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_utility.rs similarity index 95% rename from parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_utility.rs index be360bb42b8..225e5cf0872 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_utility.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_utility @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_utility.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_utility.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_xcm.rs similarity index 98% rename from parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_xcm.rs index 36672a02cd7..4f4bb37d748 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_xcm.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_xcm @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_xcm.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_xcm.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/paritydb_weights.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/paritydb_weights.rs similarity index 100% rename from parachains/runtimes/assets/statemine/src/weights/paritydb_weights.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/paritydb_weights.rs diff --git a/parachains/runtimes/assets/statemine/src/weights/rocksdb_weights.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/rocksdb_weights.rs similarity index 100% rename from parachains/runtimes/assets/statemine/src/weights/rocksdb_weights.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/rocksdb_weights.rs diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/mod.rs similarity index 98% rename from parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/mod.rs index 8247f75d5dd..4bdda361a2b 100644 --- a/parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/mod.rs @@ -56,8 +56,8 @@ impl WeighMultiAssets for MultiAssets { } } -pub struct WestmintXcmWeight(core::marker::PhantomData); -impl XcmWeightInfo for WestmintXcmWeight { +pub struct AssetHubKusamaXcmWeight(core::marker::PhantomData); +impl XcmWeightInfo for AssetHubKusamaXcmWeight { fn withdraw_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) } diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs similarity index 97% rename from parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 8f802fb4211..d5dae072099 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -20,14 +20,14 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet // --template=./templates/xcm-bench-template.hbs -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_xcm_benchmarks::fungible @@ -36,7 +36,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs similarity index 98% rename from parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 9bd3f11c969..d2b1221476a 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -20,14 +20,14 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet // --template=./templates/xcm-bench-template.hbs -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_xcm_benchmarks::generic @@ -36,7 +36,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs similarity index 98% rename from parachains/runtimes/assets/statemine/src/xcm_config.rs rename to parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs index 3ce1058ab35..ea4fcbfb012 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs @@ -376,8 +376,8 @@ impl xcm_executor::Config for XcmConfig { type XcmSender = XcmRouter; type AssetTransactor = AssetTransactors; type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Statemine does not recognize a reserve location for any asset. This does not prevent - // Statemine acting _as_ a reserve location for KSM and assets created under `pallet-assets`. + // Asset Hub Kusama does not recognize a reserve location for any asset. This does not prevent + // Asset Hub acting _as_ a reserve location for KSM and assets created under `pallet-assets`. // For KSM, users must use teleport where allowed (e.g. with the Relay Chain). type IsReserve = (); // We allow: @@ -390,7 +390,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< - crate::weights::xcm::StatemineXcmWeight, + crate::weights::xcm::AssetHubKusamaXcmWeight, RuntimeCall, MaxInstructions, >; @@ -454,7 +454,7 @@ impl pallet_xcm::Config for Runtime { type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Everything; type Weigher = WeightInfoBounds< - crate::weights::xcm::StatemineXcmWeight, + crate::weights::xcm::AssetHubKusamaXcmWeight, RuntimeCall, MaxInstructions, >; diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs similarity index 99% rename from parachains/runtimes/assets/statemine/tests/tests.rs rename to parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs index c25d09837b6..22d277c5d8c 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs @@ -1,3 +1,13 @@ +use asset_hub_kusama_runtime::xcm_config::{ + AssetFeeAsExistentialDepositMultiplierFeeCharger, KsmLocation, TrustBackedAssetsPalletLocation, +}; +pub use asset_hub_kusama_runtime::{ + constants::fee::WeightToFee, + xcm_config::{CheckingAccount, ForeignCreatorsSovereignAccountOf, XcmConfig}, + AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, + MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime, RuntimeCall, + RuntimeEvent, SessionKeys, System, TrustBackedAssetsInstance, +}; use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper}; use codec::{Decode, Encode}; use cumulus_primitives_utility::ChargeWeightInFungibles; @@ -7,16 +17,6 @@ use frame_support::{ weights::{Weight, WeightToFee as WeightToFeeT}, }; use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; -use statemine_runtime::xcm_config::{ - AssetFeeAsExistentialDepositMultiplierFeeCharger, KsmLocation, TrustBackedAssetsPalletLocation, -}; -pub use statemine_runtime::{ - constants::fee::WeightToFee, - xcm_config::{CheckingAccount, ForeignCreatorsSovereignAccountOf, XcmConfig}, - AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, - MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime, RuntimeCall, - RuntimeEvent, SessionKeys, System, TrustBackedAssetsInstance, -}; use xcm::latest::prelude::*; use xcm_executor::traits::{Convert, Identity, JustTry, WeightTrader}; diff --git a/parachains/runtimes/assets/statemint/Cargo.toml b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml similarity index 98% rename from parachains/runtimes/assets/statemint/Cargo.toml rename to parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml index 468f1e7e899..149e71df130 100644 --- a/parachains/runtimes/assets/statemint/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml @@ -1,9 +1,9 @@ [package] -name = "statemint-runtime" -version = "1.0.0" +name = "asset-hub-polkadot-runtime" +version = "0.9.420" authors = ["Parity Technologies "] edition = "2021" -description = "Statemint parachain runtime" +description = "Asset Hub Polkadot parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } diff --git a/parachains/runtimes/assets/statemint/build.rs b/parachains/runtimes/assets/asset-hub-polkadot/build.rs similarity index 100% rename from parachains/runtimes/assets/statemint/build.rs rename to parachains/runtimes/assets/asset-hub-polkadot/build.rs diff --git a/parachains/runtimes/assets/statemint/src/constants.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/constants.rs similarity index 98% rename from parachains/runtimes/assets/statemint/src/constants.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/constants.rs index 35e7f03695b..dea920979f6 100644 --- a/parachains/runtimes/assets/statemint/src/constants.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/constants.rs @@ -74,7 +74,7 @@ pub mod fee { type Balance = Balance; fn polynomial() -> WeightToFeeCoefficients { // in Polkadot, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in Statemint, we map to 1/10 of that, or 1/100 CENT + // in Asset Hub, we map to 1/10 of that, or 1/100 CENT let p = super::currency::CENTS; let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs similarity index 97% rename from parachains/runtimes/assets/statemint/src/lib.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs index 518fb3c4cab..41e443941ed 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs @@ -13,10 +13,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! # Statemint Runtime +//! # Asset Hub Polkadot Runtime //! -//! Statemint is a parachain that provides an interface to create, manage, and use assets. Assets -//! may be fungible or non-fungible. +//! Asset Hub Polkadot is a parachain that provides an interface to create, manage, and use assets. +//! Assets may be fungible or non-fungible. +//! +//! ## Renaming +//! +//! This chain was originally known as "Statemint". You may see references to Statemint, Statemine, +//! and Westmint throughout the codebase. These are synonymous with "Asset Hub Polkadot, Kusama, and +//! Westend", respectively. //! //! ## Assets //! @@ -27,22 +33,22 @@ //! //! ### Native Balances //! -//! Statemint uses its parent DOT token as its native asset. +//! Asset Hub Polkadot uses its parent DOT token as its native asset. //! //! ### Governance //! -//! As a common good parachain, Statemint defers its governance (namely, its `Root` origin), to its +//! As a system parachain, Asset Hub defers its governance (namely, its `Root` origin), to its //! Relay Chain parent, Polkadot. //! //! ### Collator Selection //! -//! Statemint uses `pallet-collator-selection`, a simple first-come-first-served registration +//! Asset Hub uses `pallet-collator-selection`, a simple first-come-first-served registration //! system where collators can reserve a small bond to join the block producer set. There is no //! slashing. //! //! ### XCM //! -//! Because Statemint is fully under the control of the Relay Chain, it is meant to be a +//! Because Asset Hub is fully under the control of the Relay Chain, it is meant to be a //! `TrustedTeleporter`. It can also serve as a reserve location to other parachains for DOT as well //! as other local assets. @@ -93,8 +99,8 @@ use pallet_nfts::PalletFeatures; pub use parachains_common as common; use parachains_common::{ impls::{AssetsToBlockAuthor, DealWithFees}, - opaque, AccountId, AssetIdForTrustBackedAssets, Balance, BlockNumber, Hash, Header, Index, - Signature, StatemintAuraId as AuraId, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, + opaque, AccountId, AssetHubPolkadotAuraId as AuraId, AssetIdForTrustBackedAssets, Balance, + BlockNumber, Hash, Header, Index, Signature, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_config::{ @@ -122,6 +128,9 @@ impl_opaque_keys! { #[sp_version::runtime_version] pub const VERSION: RuntimeVersion = RuntimeVersion { + // Note: "statemint" is the legacy name for this chain. It has been renamed to + // "asset-hub-polkadot". Many wallets/tools depend on the `spec_name`, so it remains "statemint" + // for the time being. Wallets/tools should update to treat "asset-hub-polkadot" equally. spec_name: create_runtime_str!("statemint"), impl_name: create_runtime_str!("statemint"), authoring_version: 1, diff --git a/parachains/runtimes/assets/statemint/src/weights/block_weights.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/block_weights.rs similarity index 100% rename from parachains/runtimes/assets/statemint/src/weights/block_weights.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/block_weights.rs diff --git a/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs similarity index 93% rename from parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs index 6b492b2c1e5..53147bb2324 100644 --- a/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=cumulus_pallet_xcmp_queue @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/extrinsic_weights.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/extrinsic_weights.rs similarity index 100% rename from parachains/runtimes/assets/statemint/src/weights/extrinsic_weights.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/extrinsic_weights.rs diff --git a/parachains/runtimes/assets/statemint/src/weights/frame_system.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/frame_system.rs similarity index 96% rename from parachains/runtimes/assets/statemint/src/weights/frame_system.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/frame_system.rs index 9884d6d9c3d..763a58394ff 100644 --- a/parachains/runtimes/assets/statemint/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/frame_system.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=frame_system @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/frame_system.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/frame_system.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/mod.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs similarity index 100% rename from parachains/runtimes/assets/statemint/src/weights/mod.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets.rs similarity index 99% rename from parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets.rs index cf9dae9dee3..20ac7e5e208 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_assets @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_assets.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_balances.rs similarity index 97% rename from parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_balances.rs index 631d8b00c34..a2623edff67 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_balances.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_balances @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_balances.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_balances.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_collator_selection.rs similarity index 98% rename from parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_collator_selection.rs index 37c59255469..9ac1b4a4444 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_collator_selection.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_collator_selection @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_collator_selection.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_collator_selection.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_multisig.rs similarity index 97% rename from parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_multisig.rs index 3f708111d83..39367ac6b88 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_multisig.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_multisig @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_multisig.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_multisig.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_nfts.rs similarity index 99% rename from parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_nfts.rs index 3655836b0a0..d2ca392417e 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_nfts.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_nfts @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/pallet_nfts.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_nfts.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_proxy.rs similarity index 98% rename from parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_proxy.rs index d6b2795b062..5ffc4b30df3 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_proxy.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_proxy @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_proxy.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_proxy.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_session.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_session.rs similarity index 94% rename from parachains/runtimes/assets/statemint/src/weights/pallet_session.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_session.rs index 5a44e8e80bf..9d7ea753c7c 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_session.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_session @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_session.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_session.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_timestamp.rs similarity index 93% rename from parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_timestamp.rs index 361bb6245fc..e6d26cbfaa4 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_timestamp.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_timestamp @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_timestamp.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_timestamp.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_uniques.rs similarity index 99% rename from parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_uniques.rs index fe9d2d1399e..583e54840b8 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_uniques.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_uniques @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_uniques.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_uniques.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_utility.rs similarity index 95% rename from parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_utility.rs index 585bb7d7807..fecc38e475a 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_utility.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_utility @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_utility.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_utility.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_xcm.rs similarity index 98% rename from parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_xcm.rs index a8e6dfaa951..d31ebcfe719 100644 --- a/parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_xcm.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_xcm @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/pallet_xcm.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_xcm.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/paritydb_weights.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/paritydb_weights.rs similarity index 100% rename from parachains/runtimes/assets/statemint/src/weights/paritydb_weights.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/paritydb_weights.rs diff --git a/parachains/runtimes/assets/statemint/src/weights/rocksdb_weights.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/rocksdb_weights.rs similarity index 100% rename from parachains/runtimes/assets/statemint/src/weights/rocksdb_weights.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/rocksdb_weights.rs diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs similarity index 98% rename from parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs index 23322418d2a..234ab204fbc 100644 --- a/parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs @@ -56,8 +56,8 @@ impl WeighMultiAssets for MultiAssets { } } -pub struct StatemineXcmWeight(core::marker::PhantomData); -impl XcmWeightInfo for StatemineXcmWeight { +pub struct AssetHubPolkadotXcmWeight(core::marker::PhantomData); +impl XcmWeightInfo for AssetHubPolkadotXcmWeight { fn withdraw_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) } diff --git a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs similarity index 97% rename from parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index d80e9ec335c..474a93465a9 100644 --- a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -20,14 +20,14 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet // --template=./templates/xcm-bench-template.hbs -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_xcm_benchmarks::fungible @@ -36,7 +36,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs similarity index 98% rename from parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index f38bec29144..6f65e27184a 100644 --- a/parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -20,14 +20,14 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet // --template=./templates/xcm-bench-template.hbs -// --chain=statemint-dev +// --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_xcm_benchmarks::generic @@ -36,7 +36,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/statemint/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs similarity index 98% rename from parachains/runtimes/assets/statemint/src/xcm_config.rs rename to parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs index 82414a20a4b..0f12f5a99a2 100644 --- a/parachains/runtimes/assets/statemint/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs @@ -378,8 +378,8 @@ impl xcm_executor::Config for XcmConfig { type XcmSender = XcmRouter; type AssetTransactor = AssetTransactors; type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Statemint does not recognize a reserve location for any asset. This does not prevent - // Statemint acting _as_ a reserve location for DOT and assets created under `pallet-assets`. + // Asset Hub Polkadot does not recognize a reserve location for any asset. This does not prevent + // Asset Hub acting _as_ a reserve location for DOT and assets created under `pallet-assets`. // For DOT, users must use teleport where allowed (e.g. with the Relay Chain). type IsReserve = (); // We allow: @@ -392,7 +392,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< - crate::weights::xcm::StatemintXcmWeight, + crate::weights::xcm::AssetHubPolkadotXcmWeight, RuntimeCall, MaxInstructions, >; @@ -456,7 +456,7 @@ impl pallet_xcm::Config for Runtime { type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Everything; type Weigher = WeightInfoBounds< - crate::weights::xcm::StatemintXcmWeight, + crate::weights::xcm::AssetHubPolkadotXcmWeight, RuntimeCall, MaxInstructions, >; diff --git a/parachains/runtimes/assets/statemint/tests/tests.rs b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs similarity index 98% rename from parachains/runtimes/assets/statemint/tests/tests.rs rename to parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs index bb4d52a1452..f78f53c5e6b 100644 --- a/parachains/runtimes/assets/statemint/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs @@ -1,3 +1,12 @@ +use asset_hub_polkadot_runtime::xcm_config::{ + AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, DotLocation, + ForeignCreatorsSovereignAccountOf, TrustBackedAssetsPalletLocation, XcmConfig, +}; +pub use asset_hub_polkadot_runtime::{ + constants::fee::WeightToFee, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, + ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime, + RuntimeCall, RuntimeEvent, SessionKeys, System, TrustBackedAssetsInstance, +}; use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper}; use codec::{Decode, Encode}; use cumulus_primitives_utility::ChargeWeightInFungibles; @@ -7,16 +16,7 @@ use frame_support::{ weights::{Weight, WeightToFee as WeightToFeeT}, }; use parachains_common::{ - AccountId, AssetIdForTrustBackedAssets, Balance, StatemintAuraId as AuraId, -}; -use statemint_runtime::xcm_config::{ - AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, DotLocation, - ForeignCreatorsSovereignAccountOf, TrustBackedAssetsPalletLocation, XcmConfig, -}; -pub use statemint_runtime::{ - constants::fee::WeightToFee, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, - ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime, - RuntimeCall, RuntimeEvent, SessionKeys, System, TrustBackedAssetsInstance, + AccountId, AssetHubPolkadotAuraId as AuraId, AssetIdForTrustBackedAssets, Balance, }; use xcm::latest::prelude::*; use xcm_executor::traits::{Convert, Identity, JustTry, WeightTrader}; @@ -73,7 +73,7 @@ fn test_asset_xcm_trader() { RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); // We are going to buy 400e9 weight - // Because of the ED being higher in statemine + // Because of the ED being higher in kusama's asset hub // and not to complicate things, we use a little // bit more of weight let bought = Weight::from_parts(400_000_000_000u64, 0); @@ -152,7 +152,7 @@ fn test_asset_xcm_trader_with_refund() { RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); // We are going to buy 400e9 weight - // Because of the ED being higher in statemine + // Because of the ED being higher in kusama's asset hub // and not to complicate things, we use a little // bit more of weight let bought = Weight::from_parts(400_000_000_000u64, 0); @@ -225,7 +225,7 @@ fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); // We are going to buy 50e9 weight - // Because of the ED being higher in statemine + // Because of the ED being higher in kusama's asset hub // and not to complicate things, we use a little // bit more of weight let bought = Weight::from_parts(50_000_000_000u64, 0); @@ -351,7 +351,7 @@ fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); // We are going to buy 400e9 weight - // Because of the ED being higher in statemine + // Because of the ED being higher in kusama's asset hub // and not to complicate things, we use a little // bit more of weight let bought = Weight::from_parts(400_000_000_000u64, 0); diff --git a/parachains/runtimes/assets/westmint/Cargo.toml b/parachains/runtimes/assets/asset-hub-westend/Cargo.toml similarity index 98% rename from parachains/runtimes/assets/westmint/Cargo.toml rename to parachains/runtimes/assets/asset-hub-westend/Cargo.toml index 80bea70f8dc..61405382404 100644 --- a/parachains/runtimes/assets/westmint/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -1,9 +1,9 @@ [package] -name = "westmint-runtime" -version = "1.0.0" +name = "asset-hub-westend-runtime" +version = "0.9.420" authors = ["Parity Technologies "] edition = "2021" -description = "Westend variant of Statemint parachain runtime" +description = "Westend variant of Asset Hub parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } diff --git a/parachains/runtimes/assets/westmint/build.rs b/parachains/runtimes/assets/asset-hub-westend/build.rs similarity index 100% rename from parachains/runtimes/assets/westmint/build.rs rename to parachains/runtimes/assets/asset-hub-westend/build.rs diff --git a/parachains/runtimes/assets/westmint/src/constants.rs b/parachains/runtimes/assets/asset-hub-westend/src/constants.rs similarity index 98% rename from parachains/runtimes/assets/westmint/src/constants.rs rename to parachains/runtimes/assets/asset-hub-westend/src/constants.rs index 11e6d1bf35b..e3e2dff1db9 100644 --- a/parachains/runtimes/assets/westmint/src/constants.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/constants.rs @@ -76,7 +76,7 @@ pub mod fee { type Balance = Balance; fn polynomial() -> WeightToFeeCoefficients { // in Westend, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in Westmint, we map to 1/10 of that, or 1/100 CENT + // in Asset Hub, we map to 1/10 of that, or 1/100 CENT let p = super::currency::CENTS; let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs similarity index 99% rename from parachains/runtimes/assets/westmint/src/lib.rs rename to parachains/runtimes/assets/asset-hub-westend/src/lib.rs index b988d9b6d34..0d819abd844 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -13,9 +13,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! # Westmint Runtime +//! # Asset Hub Westend Runtime //! -//! Westmint is the testnet for Statemint. +//! Testnet for Asset Hub Polkadot. #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] @@ -93,6 +93,9 @@ impl_opaque_keys! { #[sp_version::runtime_version] pub const VERSION: RuntimeVersion = RuntimeVersion { + // Note: "westmint" is the legacy name for this chain. It has been renamed to + // "asset-hub-westend". Many wallets/tools depend on the `spec_name`, so it remains "westmint" + // for the time being. Wallets/tools should update to treat "asset-hub-westend" equally. spec_name: create_runtime_str!("westmint"), impl_name: create_runtime_str!("westmint"), authoring_version: 1, diff --git a/parachains/runtimes/assets/westmint/src/weights/block_weights.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/block_weights.rs similarity index 100% rename from parachains/runtimes/assets/westmint/src/weights/block_weights.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/block_weights.rs diff --git a/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_xcmp_queue.rs similarity index 93% rename from parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_xcmp_queue.rs index 01d65b30b4a..8519e8329a6 100644 --- a/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_xcmp_queue.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=cumulus_pallet_xcmp_queue @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_xcmp_queue.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/extrinsic_weights.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/extrinsic_weights.rs similarity index 100% rename from parachains/runtimes/assets/westmint/src/weights/extrinsic_weights.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/extrinsic_weights.rs diff --git a/parachains/runtimes/assets/westmint/src/weights/frame_system.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/frame_system.rs similarity index 96% rename from parachains/runtimes/assets/westmint/src/weights/frame_system.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/frame_system.rs index 2515235087d..90dced86bd0 100644 --- a/parachains/runtimes/assets/westmint/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/frame_system.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=frame_system @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/frame_system.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/frame_system.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/mod.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/mod.rs similarity index 100% rename from parachains/runtimes/assets/westmint/src/weights/mod.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/mod.rs diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets.rs similarity index 99% rename from parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets.rs index 75518b3ef41..a3d1d19438b 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets.rs @@ -20,13 +20,13 @@ //! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_assets @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_assets.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs similarity index 97% rename from parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs index 865d674d6ce..4ff5b5075b9 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_balances @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_balances.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_collator_selection.rs similarity index 98% rename from parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_collator_selection.rs index 8b157d96d76..962f1924179 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_collator_selection.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_collator_selection @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_collator_selection.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_collator_selection.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_multisig.rs similarity index 97% rename from parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_multisig.rs index a98f72512a0..0216364554d 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_multisig.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_multisig @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_multisig.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_multisig.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nft_fractionalization.rs similarity index 92% rename from parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nft_fractionalization.rs index d8db24f50e6..967bac75e96 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nft_fractionalization.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_nft_fractionalization @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nft_fractionalization.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nfts.rs similarity index 99% rename from parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nfts.rs index 437bbd74b77..a540881b8ca 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nfts.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_nfts @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_nfts.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nfts.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_proxy.rs similarity index 98% rename from parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_proxy.rs index dbee1b7b3e2..b92e3c4eede 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_proxy.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_proxy @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_proxy.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_proxy.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_session.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_session.rs similarity index 94% rename from parachains/runtimes/assets/westmint/src/weights/pallet_session.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_session.rs index b48ff8dd064..f768b5436a0 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_session.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_session @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_session.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_session.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_timestamp.rs similarity index 93% rename from parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_timestamp.rs index c1a9be38dbd..6380b2d4bdf 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_timestamp.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_timestamp @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_timestamp.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_timestamp.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_uniques.rs similarity index 99% rename from parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_uniques.rs index d04f1800399..e2b3710f033 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_uniques.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_uniques @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_uniques.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_uniques.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_utility.rs similarity index 95% rename from parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_utility.rs index 4dce4a9b391..9584d32ac10 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_utility.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_utility @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_utility.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_utility.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs similarity index 98% rename from parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs index aa43df9de84..cffebc3ea84 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs @@ -20,13 +20,13 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_xcm @@ -35,7 +35,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_xcm.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/paritydb_weights.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/paritydb_weights.rs similarity index 100% rename from parachains/runtimes/assets/westmint/src/weights/paritydb_weights.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/paritydb_weights.rs diff --git a/parachains/runtimes/assets/westmint/src/weights/rocksdb_weights.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/rocksdb_weights.rs similarity index 100% rename from parachains/runtimes/assets/westmint/src/weights/rocksdb_weights.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/rocksdb_weights.rs diff --git a/parachains/runtimes/assets/statemint/src/weights/xcm/mod.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs similarity index 98% rename from parachains/runtimes/assets/statemint/src/weights/xcm/mod.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs index 768f2b152cd..4cc46939843 100644 --- a/parachains/runtimes/assets/statemint/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs @@ -56,8 +56,8 @@ impl WeighMultiAssets for MultiAssets { } } -pub struct StatemintXcmWeight(core::marker::PhantomData); -impl XcmWeightInfo for StatemintXcmWeight { +pub struct AssetHubWestendXcmWeight(core::marker::PhantomData); +impl XcmWeightInfo for AssetHubWestendXcmWeight { fn withdraw_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) } diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs similarity index 97% rename from parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index ce142a079d2..429c43a343c 100644 --- a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -20,14 +20,14 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet // --template=./templates/xcm-bench-template.hbs -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_xcm_benchmarks::fungible @@ -36,7 +36,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs similarity index 98% rename from parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs rename to parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 886874d6662..7676d7b3a38 100644 --- a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -20,14 +20,14 @@ //! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // ./artifacts/polkadot-parachain // benchmark // pallet // --template=./templates/xcm-bench-template.hbs -// --chain=westmint-dev +// --chain=asset-hub-westend-dev // --execution=wasm // --wasm-execution=compiled // --pallet=pallet_xcm_benchmarks::generic @@ -36,7 +36,7 @@ // --repeat=20 // --json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs similarity index 98% rename from parachains/runtimes/assets/westmint/src/xcm_config.rs rename to parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index a4dc99df33f..cf7968bf11e 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -377,8 +377,8 @@ impl xcm_executor::Config for XcmConfig { type XcmSender = XcmRouter; type AssetTransactor = AssetTransactors; type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Westmint does not recognize a reserve location for any asset. This does not prevent - // Westmint acting _as_ a reserve location for WND and assets created under `pallet-assets`. + // Asset Hub Westend does not recognize a reserve location for any asset. This does not prevent + // Asset Hub acting _as_ a reserve location for WND and assets created under `pallet-assets`. // For WND, users must use teleport where allowed (e.g. with the Relay Chain). type IsReserve = (); // We allow: @@ -391,7 +391,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< - crate::weights::xcm::WestmintXcmWeight, + crate::weights::xcm::AssetHubWestendXcmWeight, RuntimeCall, MaxInstructions, >; @@ -451,7 +451,7 @@ impl pallet_xcm::Config for Runtime { type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Everything; type Weigher = WeightInfoBounds< - crate::weights::xcm::WestmintXcmWeight, + crate::weights::xcm::AssetHubWestendXcmWeight, RuntimeCall, MaxInstructions, >; diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs similarity index 99% rename from parachains/runtimes/assets/westmint/tests/tests.rs rename to parachains/runtimes/assets/asset-hub-westend/tests/tests.rs index e378e7b1e52..87bfb4b699a 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs @@ -1,26 +1,26 @@ -use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper, XcmReceivedFrom}; -use codec::{Decode, DecodeLimit, Encode}; -use cumulus_primitives_utility::ChargeWeightInFungibles; -use frame_support::{ - assert_noop, assert_ok, sp_io, - traits::fungibles::InspectEnumerable, - weights::{Weight, WeightToFee as WeightToFeeT}, -}; -use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; -use std::convert::Into; -pub use westmint_runtime::{ +pub use asset_hub_westend_runtime::{ constants::fee::WeightToFee, xcm_config::{CheckingAccount, TrustBackedAssetsPalletLocation, XcmConfig}, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, ParachainSystem, Runtime, SessionKeys, System, TrustBackedAssetsInstance, }; -use westmint_runtime::{ +use asset_hub_westend_runtime::{ xcm_config::{ AssetFeeAsExistentialDepositMultiplierFeeCharger, ForeignCreatorsSovereignAccountOf, WestendLocation, }, MetadataDepositBase, MetadataDepositPerByte, RuntimeCall, RuntimeEvent, }; +use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper, XcmReceivedFrom}; +use codec::{Decode, DecodeLimit, Encode}; +use cumulus_primitives_utility::ChargeWeightInFungibles; +use frame_support::{ + assert_noop, assert_ok, sp_io, + traits::fungibles::InspectEnumerable, + weights::{Weight, WeightToFee as WeightToFeeT}, +}; +use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; +use std::convert::Into; use xcm::{latest::prelude::*, VersionedXcm, MAX_XCM_DECODE_DEPTH}; use xcm_executor::{ traits::{Convert, Identity, JustTry, WeightTrader}, diff --git a/parachains/runtimes/assets/test-utils/Cargo.toml b/parachains/runtimes/assets/test-utils/Cargo.toml index d4e7922c576..f683387e6eb 100644 --- a/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/parachains/runtimes/assets/test-utils/Cargo.toml @@ -3,7 +3,7 @@ name = "asset-test-utils" version = "1.0.0" authors = ["Parity Technologies "] edition = "2021" -description = "Statemint parachain runtime" +description = "Test utils for Asset Hub runtimes." [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } diff --git a/parachains/runtimes/bridge-hubs/README.md b/parachains/runtimes/bridge-hubs/README.md index d457bc770ea..b187f1da2db 100644 --- a/parachains/runtimes/bridge-hubs/README.md +++ b/parachains/runtimes/bridge-hubs/README.md @@ -78,7 +78,7 @@ cargo build --release -p substrate-relay cp target/release/substrate-relay ~/local_bridge_testing/bin/substrate-relay --- -# 5. Build polkadot-parachain-mint binary with statemine/westmint for moving assets +# 5. Build polkadot-parachain-mint binary with `asset-hub-kusama`/`asset-hub-westend` for moving assets cd # TODO:check-parameter - change this when merged to master git checkout -b bko-transfer-asset-via-bridge --track origin/bko-transfer-asset-via-bridge @@ -195,26 +195,26 @@ RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ #### Local zombienet run -1. allow bridge transfer on statemine/westmint (governance-like): +1. allow bridge transfer on kusama/westend asset hubs (governance-like): ``` ./scripts/bridges_rococo_wococo.sh allow-transfers-local ``` -2. do (asset) transfer from statemine to westmint +2. do (asset) transfer from kusama's asset hub to westend's asset hub: ``` - ./scripts/bridges_rococo_wococo.sh transfer-asset-from-statemine-local + ./scripts/bridges_rococo_wococo.sh transfer-asset-from-asset-hub-kusama-local ``` -3. do (ping) transfer from statemine to westmint +3. do (ping) transfer from kusama's asset hub to westend's asset hub ``` - ./scripts/bridges_rococo_wococo.sh ping-via-bridge-from-statemine-local + ./scripts/bridges_rococo_wococo.sh ping-via-bridge-from-asset-hub-kusama-local ``` - open explorers: (see zombienets) - - Statemine (see events `xcmpQueue.XcmpMessageSent`, `bridgeTransfer.ReserveAssetsDeposited`, `bridgeTransfer.TransferInitiated`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:9910#/explorer + - Kusama Asset Hub (see events `xcmpQueue.XcmpMessageSent`, `bridgeTransfer.ReserveAssetsDeposited`, `bridgeTransfer.TransferInitiated`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:9910#/explorer - BridgeHubRococo (see `bridgeWococoMessages.MessageAccepted`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:8943#/explorer - BridgeHubWococo (see `bridgeRococoMessages.MessagesReceived`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:8945#/explorer - - Westmint (see `xcmpQueue.Success` for `transfer-asset` and `xcmpQueue.Fail` for `ping-via-bridge`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:9010#/explorer + - Westend Asset Hub (see `xcmpQueue.Success` for `transfer-asset` and `xcmpQueue.Fail` for `ping-via-bridge`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:9010#/explorer - BridgeHubRococo (see `bridgeWococoMessages.MessagesDelivered`) https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:8943#/explorer #### Live Rockmine2 to Wockmint @@ -222,9 +222,9 @@ RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ ``` cd - ./scripts/bridges_rococo_wococo.sh transfer-asset-from-statemine-rococo + ./scripts/bridges_rococo_wococo.sh transfer-asset-from-asset-hub-rococo or - ./scripts/bridges_rococo_wococo.sh ping-via-bridge-from-statemine-rococo + ./scripts/bridges_rococo_wococo.sh ping-via-bridge-from-asset-hub-rococo ``` - open explorers: diff --git a/parachains/runtimes/contracts/contracts-rococo/src/constants.rs b/parachains/runtimes/contracts/contracts-rococo/src/constants.rs index 4598ddaa264..1147b935aa3 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/constants.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/constants.rs @@ -76,7 +76,7 @@ pub mod fee { type Balance = Balance; fn polynomial() -> WeightToFeeCoefficients { // in Kusama, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in Statemine, we map to 1/10 of that, or 1/100 CENT + // in Rococo Contracts, we map to 1/10 of that, or 1/100 CENT let p = super::currency::CENTS; let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index 8ba89c803ce..fc66fa5f0ec 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// Copyright 2019-2023 Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -14,11 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -//! The Penpal runtime is designed as a test runtime that can be created using an arbitrary parachain id. -//! (and as such multiple parachains can be on the same relay node - though make sure you have enough relay -//! nodes running to support this or you will get the not scheduled on a core error message.) +//! The PenPal runtime is designed as a test runtime that can be created with an arbitrary `ParaId`, +//! such that multiple instances of the parachain can be on the same parent relay. Ensure that you +//! have enough nodes running to support this or you will get scheduling errors. //! -//! The penpal runtime's primary use is as a partner when testing statemine/t with reserve asset transfers. +//! The PenPal runtime's primary use is for testing interactions between System parachains and +//! other chains that are not trusted teleporters. + #![cfg_attr(not(feature = "std"), no_std)] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit = "256"] diff --git a/parachains/runtimes/testing/penpal/src/xcm_config.rs b/parachains/runtimes/testing/penpal/src/xcm_config.rs index d005cc664a3..da1904c16c2 100644 --- a/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -19,8 +19,8 @@ //! This configuration dictates how the Penpal chain will communicate with other chains. //! //! One of the main uses of the penpal chain will be to be a benefactor of reserve asset transfers -//! with statemine as the reserve. At present no derivative tokens are minted on receipt of a -//! ReserveAssetTransferDeposited message but that will but the intension will be to support this soon. +//! with Asset Hub as the reserve. At present no derivative tokens are minted on receipt of a +//! `ReserveAssetTransferDeposited` message but that will but the intension will be to support this soon. use super::{ AccountId, AllPalletsWithSystem, AssetId as AssetIdPalletAssets, Assets, Balance, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, @@ -94,7 +94,7 @@ pub type FungiblesTransactor = FungiblesAdapter< ConvertedConcreteId< AssetIdPalletAssets, Balance, - AsPrefixedGeneralIndex, + AsPrefixedGeneralIndex, JustTry, >, // Convert an XCM MultiLocation into a local account id: @@ -256,15 +256,16 @@ impl ContainsPair for MultiNativeAsset { } parameter_types! { - pub CommonGoodAssetsLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(1000))); + /// The location that this chain recognizes as the Relay network's Asset Hub. + pub SystemAssetHubLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(1000))); // ALWAYS ensure that the index in PalletInstance stays up-to-date with - // Statemint's Assets pallet index - pub CommonGoodAssetsPalletLocation: MultiLocation = + // the Relay Chain's Asset Hub's Assets pallet index + pub SystemAssetHubAssetsPalletLocation: MultiLocation = MultiLocation::new(1, X2(Parachain(1000), PalletInstance(50))); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } -pub type Reserves = (NativeAsset, AssetsFrom); +pub type Reserves = (NativeAsset, AssetsFrom); pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 3060093b532..59ea3dbf0ec 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -321,7 +321,11 @@ pub type FungiblesTransactor = FungiblesAdapter< ConvertedConcreteId< AssetIdForTrustBackedAssets, u64, - AsPrefixedGeneralIndex, + AsPrefixedGeneralIndex< + SystemAssetHubAssetsPalletLocation, + AssetIdForTrustBackedAssets, + JustTry, + >, JustTry, >, // Convert an XCM MultiLocation into a local account id: @@ -370,11 +374,13 @@ parameter_types! { } match_types! { + // The parent or the parent's unit plurality. pub type ParentOrParentsUnitPlurality: impl Contains = { MultiLocation { parents: 1, interior: Here } | MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Unit, .. }) } }; - pub type Statemint: impl Contains = { + // The location recognized as the Relay network's Asset Hub. + pub type AssetHub: impl Contains = { MultiLocation { parents: 1, interior: X1(Parachain(1000)) } }; } @@ -382,9 +388,10 @@ match_types! { pub type Barrier = ( TakeWeightCredit, AllowTopLevelPaidExecutionFrom, + // Parent & its unit plurality gets free execution. AllowExplicitUnpaidExecutionFrom, - // ^^^ Parent & its unit plurality gets free execution - AllowExplicitUnpaidExecutionFrom, + // The network's Asset Hub gets free execution. + AllowExplicitUnpaidExecutionFrom, // Expected responses are OK. AllowKnownQueryResponses, // Subscriptions for version tracking are OK. @@ -393,14 +400,14 @@ pub type Barrier = ( parameter_types! { pub MaxAssetsIntoHolding: u32 = 64; - pub StatemintLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(1000))); + pub SystemAssetHubLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(1000))); // ALWAYS ensure that the index in PalletInstance stays up-to-date with - // Statemint's Assets pallet index - pub StatemintAssetsPalletLocation: MultiLocation = + // the Relay Chain's Asset Hub's Assets pallet index + pub SystemAssetHubAssetsPalletLocation: MultiLocation = MultiLocation::new(1, X2(Parachain(1000), PalletInstance(50))); } -pub type Reserves = (NativeAsset, AssetsFrom); +pub type Reserves = (NativeAsset, AssetsFrom); pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 033e395722a..88eaef87cb6 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -25,9 +25,9 @@ rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parac shell-runtime = { path = "../parachains/runtimes/starters/shell" } glutton-runtime = { path = "../parachains/runtimes/glutton/glutton-kusama" } seedling-runtime = { path = "../parachains/runtimes/starters/seedling" } -statemint-runtime = { path = "../parachains/runtimes/assets/statemint" } -statemine-runtime = { path = "../parachains/runtimes/assets/statemine" } -westmint-runtime = { path = "../parachains/runtimes/assets/westmint" } +asset-hub-polkadot-runtime = { path = "../parachains/runtimes/assets/asset-hub-polkadot" } +asset-hub-kusama-runtime = { path = "../parachains/runtimes/assets/asset-hub-kusama" } +asset-hub-westend-runtime = { path = "../parachains/runtimes/assets/asset-hub-westend" } collectives-polkadot-runtime = { path = "../parachains/runtimes/collectives/collectives-polkadot" } contracts-rococo-runtime = { path = "../parachains/runtimes/contracts/contracts-rococo" } bridge-hub-rococo-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-rococo" } @@ -106,9 +106,9 @@ polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "maste default = [] runtime-benchmarks = [ "polkadot-service/runtime-benchmarks", - "statemint-runtime/runtime-benchmarks", - "statemine-runtime/runtime-benchmarks", - "westmint-runtime/runtime-benchmarks", + "asset-hub-polkadot-runtime/runtime-benchmarks", + "asset-hub-kusama-runtime/runtime-benchmarks", + "asset-hub-westend-runtime/runtime-benchmarks", "bridge-hub-rococo-runtime/runtime-benchmarks", "bridge-hub-kusama-runtime/runtime-benchmarks", "bridge-hub-polkadot-runtime/runtime-benchmarks", @@ -119,9 +119,9 @@ runtime-benchmarks = [ "penpal-runtime/runtime-benchmarks", ] try-runtime = [ - "statemint-runtime/try-runtime", - "statemine-runtime/try-runtime", - "westmint-runtime/try-runtime", + "asset-hub-polkadot-runtime/try-runtime", + "asset-hub-kusama-runtime/try-runtime", + "asset-hub-westend-runtime/try-runtime", "shell-runtime/try-runtime", "try-runtime-cli/try-runtime", ] diff --git a/polkadot-parachain/src/chain_spec/statemint.rs b/polkadot-parachain/src/chain_spec/asset_hubs.rs similarity index 71% rename from polkadot-parachain/src/chain_spec/statemint.rs rename to polkadot-parachain/src/chain_spec/asset_hubs.rs index e12a5d12e17..9188431bdf5 100644 --- a/polkadot-parachain/src/chain_spec/statemint.rs +++ b/polkadot-parachain/src/chain_spec/asset_hubs.rs @@ -19,61 +19,66 @@ use crate::chain_spec::{ }; use cumulus_primitives_core::ParaId; use hex_literal::hex; -use parachains_common::{AccountId, AuraId, Balance as StatemintBalance, StatemintAuraId}; +use parachains_common::{AccountId, AssetHubPolkadotAuraId, AuraId, Balance as AssetHubBalance}; use sc_service::ChainType; use sp_core::{crypto::UncheckedInto, sr25519}; /// Specialized `ChainSpec` for the normal parachain runtime. -pub type StatemintChainSpec = - sc_service::GenericChainSpec; -pub type StatemineChainSpec = - sc_service::GenericChainSpec; -pub type WestmintChainSpec = - sc_service::GenericChainSpec; +pub type AssetHubPolkadotChainSpec = + sc_service::GenericChainSpec; +pub type AssetHubKusamaChainSpec = + sc_service::GenericChainSpec; +pub type AssetHubWestendChainSpec = + sc_service::GenericChainSpec; -const STATEMINT_ED: StatemintBalance = statemint_runtime::constants::currency::EXISTENTIAL_DEPOSIT; -const STATEMINE_ED: StatemintBalance = statemine_runtime::constants::currency::EXISTENTIAL_DEPOSIT; -const WESTMINT_ED: StatemintBalance = westmint_runtime::constants::currency::EXISTENTIAL_DEPOSIT; +const ASSET_HUB_POLKADOT_ED: AssetHubBalance = + asset_hub_polkadot_runtime::constants::currency::EXISTENTIAL_DEPOSIT; +const ASSET_HUB_KUSAMA_ED: AssetHubBalance = + asset_hub_kusama_runtime::constants::currency::EXISTENTIAL_DEPOSIT; +const ASSET_HUB_WESTEND_ED: AssetHubBalance = + asset_hub_westend_runtime::constants::currency::EXISTENTIAL_DEPOSIT; /// Generate the session keys from individual elements. /// /// The input must be a tuple of individual keys (a single arg for now since we have just one key). -pub fn statemint_session_keys(keys: StatemintAuraId) -> statemint_runtime::SessionKeys { - statemint_runtime::SessionKeys { aura: keys } +pub fn asset_hub_polkadot_session_keys( + keys: AssetHubPolkadotAuraId, +) -> asset_hub_polkadot_runtime::SessionKeys { + asset_hub_polkadot_runtime::SessionKeys { aura: keys } } /// Generate the session keys from individual elements. /// /// The input must be a tuple of individual keys (a single arg for now since we have just one key). -pub fn statemine_session_keys(keys: AuraId) -> statemine_runtime::SessionKeys { - statemine_runtime::SessionKeys { aura: keys } +pub fn asset_hub_kusama_session_keys(keys: AuraId) -> asset_hub_kusama_runtime::SessionKeys { + asset_hub_kusama_runtime::SessionKeys { aura: keys } } /// Generate the session keys from individual elements. /// /// The input must be a tuple of individual keys (a single arg for now since we have just one key). -pub fn westmint_session_keys(keys: AuraId) -> westmint_runtime::SessionKeys { - westmint_runtime::SessionKeys { aura: keys } +pub fn asset_hub_westend_session_keys(keys: AuraId) -> asset_hub_westend_runtime::SessionKeys { + asset_hub_westend_runtime::SessionKeys { aura: keys } } -pub fn statemint_development_config() -> StatemintChainSpec { +pub fn asset_hub_polkadot_development_config() -> AssetHubPolkadotChainSpec { let mut properties = sc_chain_spec::Properties::new(); properties.insert("ss58Format".into(), 0.into()); properties.insert("tokenSymbol".into(), "DOT".into()); properties.insert("tokenDecimals".into(), 10.into()); - StatemintChainSpec::from_genesis( + AssetHubPolkadotChainSpec::from_genesis( // Name - "Statemint Development", + "Polkadot Asset Hub Development", // ID - "statemint_dev", + "asset-hub-polkadot-dev", ChainType::Local, move || { - statemint_genesis( + asset_hub_polkadot_genesis( // initial collators. vec![( get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), + get_collator_keys_from_seed::("Alice"), )], vec![ get_account_id_from_seed::("Alice"), @@ -93,29 +98,29 @@ pub fn statemint_development_config() -> StatemintChainSpec { ) } -pub fn statemint_local_config() -> StatemintChainSpec { +pub fn asset_hub_polkadot_local_config() -> AssetHubPolkadotChainSpec { let mut properties = sc_chain_spec::Properties::new(); properties.insert("ss58Format".into(), 0.into()); properties.insert("tokenSymbol".into(), "DOT".into()); properties.insert("tokenDecimals".into(), 10.into()); - StatemintChainSpec::from_genesis( + AssetHubPolkadotChainSpec::from_genesis( // Name - "Statemint Local", + "Polkadot Asset Hub Local", // ID - "statemint_local", + "asset-hub-polkadot-local", ChainType::Local, move || { - statemint_genesis( + asset_hub_polkadot_genesis( // initial collators. vec![ ( get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), + get_collator_keys_from_seed::("Alice"), ), ( get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), + get_collator_keys_from_seed::("Bob"), ), ], vec![ @@ -145,20 +150,20 @@ pub fn statemint_local_config() -> StatemintChainSpec { } // Not used for syncing, but just to determine the genesis values set for the upgrade from shell. -pub fn statemint_config() -> StatemintChainSpec { +pub fn asset_hub_polkadot_config() -> AssetHubPolkadotChainSpec { let mut properties = sc_chain_spec::Properties::new(); properties.insert("ss58Format".into(), 0.into()); properties.insert("tokenSymbol".into(), "DOT".into()); properties.insert("tokenDecimals".into(), 10.into()); - StatemintChainSpec::from_genesis( + AssetHubPolkadotChainSpec::from_genesis( // Name - "Statemint", + "Polkadot Asset Hub", // ID - "statemint", + "asset-hub-polkadot", ChainType::Live, move || { - statemint_genesis( + asset_hub_polkadot_genesis( // initial collators. vec![ ( @@ -204,34 +209,38 @@ pub fn statemint_config() -> StatemintChainSpec { ) } -fn statemint_genesis( - invulnerables: Vec<(AccountId, StatemintAuraId)>, +fn asset_hub_polkadot_genesis( + invulnerables: Vec<(AccountId, AssetHubPolkadotAuraId)>, endowed_accounts: Vec, id: ParaId, -) -> statemint_runtime::GenesisConfig { - statemint_runtime::GenesisConfig { - system: statemint_runtime::SystemConfig { - code: statemint_runtime::WASM_BINARY +) -> asset_hub_polkadot_runtime::GenesisConfig { + asset_hub_polkadot_runtime::GenesisConfig { + system: asset_hub_polkadot_runtime::SystemConfig { + code: asset_hub_polkadot_runtime::WASM_BINARY .expect("WASM binary was not build, please build it!") .to_vec(), }, - balances: statemint_runtime::BalancesConfig { - balances: endowed_accounts.iter().cloned().map(|k| (k, STATEMINT_ED * 4096)).collect(), + balances: asset_hub_polkadot_runtime::BalancesConfig { + balances: endowed_accounts + .iter() + .cloned() + .map(|k| (k, ASSET_HUB_POLKADOT_ED * 4096)) + .collect(), }, - parachain_info: statemint_runtime::ParachainInfoConfig { parachain_id: id }, - collator_selection: statemint_runtime::CollatorSelectionConfig { + parachain_info: asset_hub_polkadot_runtime::ParachainInfoConfig { parachain_id: id }, + collator_selection: asset_hub_polkadot_runtime::CollatorSelectionConfig { invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: STATEMINT_ED * 16, + candidacy_bond: ASSET_HUB_POLKADOT_ED * 16, ..Default::default() }, - session: statemint_runtime::SessionConfig { + session: asset_hub_polkadot_runtime::SessionConfig { keys: invulnerables .into_iter() .map(|(acc, aura)| { ( - acc.clone(), // account id - acc, // validator id - statemint_session_keys(aura), // session keys + acc.clone(), // account id + acc, // validator id + asset_hub_polkadot_session_keys(aura), // session keys ) }) .collect(), @@ -241,26 +250,26 @@ fn statemint_genesis( aura: Default::default(), aura_ext: Default::default(), parachain_system: Default::default(), - polkadot_xcm: statemint_runtime::PolkadotXcmConfig { + polkadot_xcm: asset_hub_polkadot_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), }, } } -pub fn statemine_development_config() -> StatemineChainSpec { +pub fn asset_hub_kusama_development_config() -> AssetHubKusamaChainSpec { let mut properties = sc_chain_spec::Properties::new(); properties.insert("ss58Format".into(), 2.into()); properties.insert("tokenSymbol".into(), "KSM".into()); properties.insert("tokenDecimals".into(), 12.into()); - StatemineChainSpec::from_genesis( + AssetHubKusamaChainSpec::from_genesis( // Name - "Statemine Development", + "Kusama Asset Hub Development", // ID - "statemine_dev", + "asset-hub-kusama-dev", ChainType::Local, move || { - statemine_genesis( + asset_hub_kusama_genesis( // initial collators. vec![( get_account_id_from_seed::("Alice"), @@ -284,20 +293,20 @@ pub fn statemine_development_config() -> StatemineChainSpec { ) } -pub fn statemine_local_config() -> StatemineChainSpec { +pub fn asset_hub_kusama_local_config() -> AssetHubKusamaChainSpec { let mut properties = sc_chain_spec::Properties::new(); properties.insert("ss58Format".into(), 2.into()); properties.insert("tokenSymbol".into(), "KSM".into()); properties.insert("tokenDecimals".into(), 12.into()); - StatemineChainSpec::from_genesis( + AssetHubKusamaChainSpec::from_genesis( // Name - "Statemine Local", + "Kusama Asset Hub Local", // ID - "statemine_local", + "asset-hub-kusama-local", ChainType::Local, move || { - statemine_genesis( + asset_hub_kusama_genesis( // initial collators. vec![ ( @@ -335,20 +344,20 @@ pub fn statemine_local_config() -> StatemineChainSpec { ) } -pub fn statemine_config() -> StatemineChainSpec { +pub fn asset_hub_kusama_config() -> AssetHubKusamaChainSpec { let mut properties = sc_chain_spec::Properties::new(); properties.insert("ss58Format".into(), 2.into()); properties.insert("tokenSymbol".into(), "KSM".into()); properties.insert("tokenDecimals".into(), 12.into()); - StatemineChainSpec::from_genesis( + AssetHubKusamaChainSpec::from_genesis( // Name - "Statemine", + "Kusama Asset Hub", // ID - "statemine", + "asset-hub-kusama", ChainType::Live, move || { - statemine_genesis( + asset_hub_kusama_genesis( // initial collators. vec![ ( @@ -389,38 +398,38 @@ pub fn statemine_config() -> StatemineChainSpec { ) } -fn statemine_genesis( +fn asset_hub_kusama_genesis( invulnerables: Vec<(AccountId, AuraId)>, endowed_accounts: Vec, id: ParaId, -) -> statemine_runtime::GenesisConfig { - statemine_runtime::GenesisConfig { - system: statemine_runtime::SystemConfig { - code: statemine_runtime::WASM_BINARY +) -> asset_hub_kusama_runtime::GenesisConfig { + asset_hub_kusama_runtime::GenesisConfig { + system: asset_hub_kusama_runtime::SystemConfig { + code: asset_hub_kusama_runtime::WASM_BINARY .expect("WASM binary was not build, please build it!") .to_vec(), }, - balances: statemine_runtime::BalancesConfig { + balances: asset_hub_kusama_runtime::BalancesConfig { balances: endowed_accounts .iter() .cloned() - .map(|k| (k, STATEMINE_ED * 524_288)) + .map(|k| (k, ASSET_HUB_KUSAMA_ED * 524_288)) .collect(), }, - parachain_info: statemine_runtime::ParachainInfoConfig { parachain_id: id }, - collator_selection: statemine_runtime::CollatorSelectionConfig { + parachain_info: asset_hub_kusama_runtime::ParachainInfoConfig { parachain_id: id }, + collator_selection: asset_hub_kusama_runtime::CollatorSelectionConfig { invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: STATEMINE_ED * 16, + candidacy_bond: ASSET_HUB_KUSAMA_ED * 16, ..Default::default() }, - session: statemine_runtime::SessionConfig { + session: asset_hub_kusama_runtime::SessionConfig { keys: invulnerables .into_iter() .map(|(acc, aura)| { ( - acc.clone(), // account id - acc, // validator id - statemine_session_keys(aura), // session keys + acc.clone(), // account id + acc, // validator id + asset_hub_kusama_session_keys(aura), // session keys ) }) .collect(), @@ -428,25 +437,25 @@ fn statemine_genesis( aura: Default::default(), aura_ext: Default::default(), parachain_system: Default::default(), - polkadot_xcm: statemine_runtime::PolkadotXcmConfig { + polkadot_xcm: asset_hub_kusama_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), }, } } -pub fn westmint_development_config() -> WestmintChainSpec { +pub fn asset_hub_westend_development_config() -> AssetHubWestendChainSpec { let mut properties = sc_chain_spec::Properties::new(); properties.insert("tokenSymbol".into(), "WND".into()); properties.insert("tokenDecimals".into(), 12.into()); - WestmintChainSpec::from_genesis( + AssetHubWestendChainSpec::from_genesis( // Name - "Westmint Development", + "Westend Asset Hub Development", // ID - "westmint_dev", + "asset-hub-westend-dev", ChainType::Local, move || { - westmint_genesis( + asset_hub_westend_genesis( // initial collators. vec![( get_account_id_from_seed::("Alice"), @@ -470,19 +479,19 @@ pub fn westmint_development_config() -> WestmintChainSpec { ) } -pub fn westmint_local_config() -> WestmintChainSpec { +pub fn asset_hub_westend_local_config() -> AssetHubWestendChainSpec { let mut properties = sc_chain_spec::Properties::new(); properties.insert("tokenSymbol".into(), "WND".into()); properties.insert("tokenDecimals".into(), 12.into()); - WestmintChainSpec::from_genesis( + AssetHubWestendChainSpec::from_genesis( // Name - "Westmint Local", + "Westend Asset Hub Local", // ID - "westmint_local", + "asset-hub-westend-local", ChainType::Local, move || { - westmint_genesis( + asset_hub_westend_genesis( // initial collators. vec![ ( @@ -520,19 +529,19 @@ pub fn westmint_local_config() -> WestmintChainSpec { ) } -pub fn westmint_config() -> WestmintChainSpec { +pub fn asset_hub_westend_config() -> AssetHubWestendChainSpec { let mut properties = sc_chain_spec::Properties::new(); properties.insert("tokenSymbol".into(), "WND".into()); properties.insert("tokenDecimals".into(), 12.into()); - WestmintChainSpec::from_genesis( + AssetHubWestendChainSpec::from_genesis( // Name - "Westmint", + "Westend Asset Hub", // ID - "westmint", + "asset-hub-westend", ChainType::Live, move || { - westmint_genesis( + asset_hub_westend_genesis( // initial collators. vec![ ( @@ -573,34 +582,38 @@ pub fn westmint_config() -> WestmintChainSpec { ) } -fn westmint_genesis( +fn asset_hub_westend_genesis( invulnerables: Vec<(AccountId, AuraId)>, endowed_accounts: Vec, id: ParaId, -) -> westmint_runtime::GenesisConfig { - westmint_runtime::GenesisConfig { - system: westmint_runtime::SystemConfig { - code: westmint_runtime::WASM_BINARY +) -> asset_hub_westend_runtime::GenesisConfig { + asset_hub_westend_runtime::GenesisConfig { + system: asset_hub_westend_runtime::SystemConfig { + code: asset_hub_westend_runtime::WASM_BINARY .expect("WASM binary was not build, please build it!") .to_vec(), }, - balances: westmint_runtime::BalancesConfig { - balances: endowed_accounts.iter().cloned().map(|k| (k, WESTMINT_ED * 4096)).collect(), + balances: asset_hub_westend_runtime::BalancesConfig { + balances: endowed_accounts + .iter() + .cloned() + .map(|k| (k, ASSET_HUB_WESTEND_ED * 4096)) + .collect(), }, - parachain_info: westmint_runtime::ParachainInfoConfig { parachain_id: id }, - collator_selection: westmint_runtime::CollatorSelectionConfig { + parachain_info: asset_hub_westend_runtime::ParachainInfoConfig { parachain_id: id }, + collator_selection: asset_hub_westend_runtime::CollatorSelectionConfig { invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: WESTMINT_ED * 16, + candidacy_bond: ASSET_HUB_WESTEND_ED * 16, ..Default::default() }, - session: westmint_runtime::SessionConfig { + session: asset_hub_westend_runtime::SessionConfig { keys: invulnerables .into_iter() .map(|(acc, aura)| { ( - acc.clone(), // account id - acc, // validator id - westmint_session_keys(aura), // session keys + acc.clone(), // account id + acc, // validator id + asset_hub_westend_session_keys(aura), // session keys ) }) .collect(), @@ -610,7 +623,7 @@ fn westmint_genesis( aura: Default::default(), aura_ext: Default::default(), parachain_system: Default::default(), - polkadot_xcm: westmint_runtime::PolkadotXcmConfig { + polkadot_xcm: asset_hub_westend_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), }, } diff --git a/polkadot-parachain/src/chain_spec/mod.rs b/polkadot-parachain/src/chain_spec/mod.rs index f53552768f3..d7014a9f43c 100644 --- a/polkadot-parachain/src/chain_spec/mod.rs +++ b/polkadot-parachain/src/chain_spec/mod.rs @@ -20,6 +20,7 @@ use serde::{Deserialize, Serialize}; use sp_core::{Pair, Public}; use sp_runtime::traits::{IdentifyAccount, Verify}; +pub mod asset_hubs; pub mod bridge_hubs; pub mod collectives; pub mod contracts; @@ -28,7 +29,6 @@ pub mod penpal; pub mod rococo_parachain; pub mod seedling; pub mod shell; -pub mod statemint; /// The default XCM version to set in genesis config. const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION; diff --git a/polkadot-parachain/src/cli.rs b/polkadot-parachain/src/cli.rs index 790951fb3b1..7be61810a7d 100644 --- a/polkadot-parachain/src/cli.rs +++ b/polkadot-parachain/src/cli.rs @@ -66,10 +66,10 @@ pub enum Subcommand { const AFTER_HELP_EXAMPLE: &str = color_print::cstr!( r#"Examples: - polkadot-parachain --chain statemint --sync warp -- --chain polkadot --sync warp - Launch a warp-syncing full node of the statemint parachain on the polkadot relay chain. - polkadot-parachain --chain statemint --sync warp --relay-chain-rpc-url ws://rpc.example.com -- --chain polkadot - Launch a warp-syncing full node of the statemint parachain on the polkadot relay chain. + polkadot-parachain --chain asset-hub-polkadot --sync warp -- --chain polkadot --sync warp + Launch a warp-syncing full node of the Asset Hub parachain on the Polkadot Relay Chain. + polkadot-parachain --chain asset-hub-polkadot --sync warp --relay-chain-rpc-url ws://rpc.example.com -- --chain polkadot + Launch a warp-syncing full node of the Asset Hub parachain on the Polkadot Relay Chain. Uses ws://rpc.example.com as remote relay chain node. "# ); diff --git a/polkadot-parachain/src/command.rs b/polkadot-parachain/src/command.rs index ab13c00099b..f59a58aa367 100644 --- a/polkadot-parachain/src/command.rs +++ b/polkadot-parachain/src/command.rs @@ -18,9 +18,10 @@ use crate::{ chain_spec, cli::{Cli, RelayChainCli, Subcommand}, service::{ - new_partial, Block, BridgeHubKusamaRuntimeExecutor, BridgeHubPolkadotRuntimeExecutor, - BridgeHubRococoRuntimeExecutor, CollectivesPolkadotRuntimeExecutor, GluttonRuntimeExecutor, - StatemineRuntimeExecutor, StatemintRuntimeExecutor, WestmintRuntimeExecutor, + new_partial, AssetHubKusamaExecutor, AssetHubPolkadotRuntimeExecutor, + AssetHubWestendExecutor, Block, BridgeHubKusamaRuntimeExecutor, + BridgeHubPolkadotRuntimeExecutor, BridgeHubRococoRuntimeExecutor, + CollectivesPolkadotRuntimeExecutor, GluttonRuntimeExecutor, }, }; use codec::Encode; @@ -28,7 +29,7 @@ use cumulus_client_cli::generate_genesis_block; use cumulus_primitives_core::ParaId; use frame_benchmarking_cli::{BenchmarkCmd, SUBSTRATE_REFERENCE_HARDWARE}; use log::{info, warn}; -use parachains_common::{AuraId, StatemintAuraId}; +use parachains_common::{AssetHubPolkadotAuraId, AuraId}; use sc_cli::{ ChainSpec, CliConfiguration, DefaultConfigurationValues, ImportParams, KeystoreParams, NetworkParams, Result, RuntimeVersion, SharedParams, SubstrateCli, @@ -47,9 +48,9 @@ enum Runtime { Default, Shell, Seedling, - Statemint, - Statemine, - Westmint, + AssetHubPolkadot, + AssetHubKusama, + AssetHubWestend, Penpal(ParaId), ContractsRococo, CollectivesPolkadot, @@ -93,12 +94,12 @@ fn runtime(id: &str) -> Runtime { Runtime::Shell } else if id.starts_with("seedling") { Runtime::Seedling - } else if id.starts_with("statemint") { - Runtime::Statemint - } else if id.starts_with("statemine") { - Runtime::Statemine - } else if id.starts_with("westmint") { - Runtime::Westmint + } else if id.starts_with("asset-hub-polkadot") | id.starts_with("statemint") { + Runtime::AssetHubPolkadot + } else if id.starts_with("asset-hub-kusama") | id.starts_with("statemine") { + Runtime::AssetHubKusama + } else if id.starts_with("asset-hub-westend") | id.starts_with("westmint") { + Runtime::AssetHubWestend } else if id.starts_with("penpal") { Runtime::Penpal(para_id.unwrap_or(ParaId::new(0))) } else if id.starts_with("contracts-rococo") { @@ -143,35 +144,47 @@ fn load_spec(id: &str) -> std::result::Result, String> { "shell" => Box::new(chain_spec::shell::get_shell_chain_spec()), "seedling" => Box::new(chain_spec::seedling::get_seedling_chain_spec()), - // -- Statemint - "statemint-dev" => Box::new(chain_spec::statemint::statemint_development_config()), - "statemint-local" => Box::new(chain_spec::statemint::statemint_local_config()), + // -- Asset Hub Polkadot + "asset-hub-polkadot-dev" | "statemint-dev" => + Box::new(chain_spec::asset_hubs::asset_hub_polkadot_development_config()), + "asset-hub-polkadot-local" | "statemint-local" => + Box::new(chain_spec::asset_hubs::asset_hub_polkadot_local_config()), // the chain spec as used for generating the upgrade genesis values - "statemint-genesis" => Box::new(chain_spec::statemint::statemint_config()), + "asset-hub-polkadot-genesis" | "statemint-genesis" => + Box::new(chain_spec::asset_hubs::asset_hub_polkadot_config()), // the shell-based chain spec as used for syncing - "statemint" => Box::new(chain_spec::statemint::StatemintChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/statemint.json")[..], - )?), + "asset-hub-polkadot" | "statemint" => + Box::new(chain_spec::asset_hubs::AssetHubPolkadotChainSpec::from_json_bytes( + &include_bytes!("../../parachains/chain-specs/asset-hub-polkadot.json")[..], + )?), - // -- Statemine - "statemine-dev" => Box::new(chain_spec::statemint::statemine_development_config()), - "statemine-local" => Box::new(chain_spec::statemint::statemine_local_config()), + // -- Asset Hub Kusama + "asset-hub-kusama-dev" | "statemine-dev" => + Box::new(chain_spec::asset_hubs::asset_hub_kusama_development_config()), + "asset-hub-kusama-local" | "statemine-local" => + Box::new(chain_spec::asset_hubs::asset_hub_kusama_local_config()), // the chain spec as used for generating the upgrade genesis values - "statemine-genesis" => Box::new(chain_spec::statemint::statemine_config()), + "asset-hub-kusama-genesis" | "statemine-genesis" => + Box::new(chain_spec::asset_hubs::asset_hub_kusama_config()), // the shell-based chain spec as used for syncing - "statemine" => Box::new(chain_spec::statemint::StatemineChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/statemine.json")[..], - )?), + "asset-hub-kusama" | "statemine" => + Box::new(chain_spec::asset_hubs::AssetHubKusamaChainSpec::from_json_bytes( + &include_bytes!("../../parachains/chain-specs/asset-hub-kusama.json")[..], + )?), - // -- Westmint - "westmint-dev" => Box::new(chain_spec::statemint::westmint_development_config()), - "westmint-local" => Box::new(chain_spec::statemint::westmint_local_config()), + // -- Asset Hub Westend + "asset-hub-westend-dev" | "westmint-dev" => + Box::new(chain_spec::asset_hubs::asset_hub_westend_development_config()), + "asset-hub-westend-local" | "westmint-local" => + Box::new(chain_spec::asset_hubs::asset_hub_westend_local_config()), // the chain spec as used for generating the upgrade genesis values - "westmint-genesis" => Box::new(chain_spec::statemint::westmint_config()), + "asset-hub-westend-genesis" | "westmint-genesis" => + Box::new(chain_spec::asset_hubs::asset_hub_westend_config()), // the shell-based chain spec as used for syncing - "westmint" => Box::new(chain_spec::statemint::WestmintChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/westmint.json")[..], - )?), + "asset-hub-westend" | "westmint" => + Box::new(chain_spec::asset_hubs::AssetHubWestendChainSpec::from_json_bytes( + &include_bytes!("../../parachains/chain-specs/asset-hub-westend.json")[..], + )?), // -- Polkadot Collectives "collectives-polkadot-dev" => @@ -239,12 +252,14 @@ fn load_spec(id: &str) -> std::result::Result, String> { path => { let path: PathBuf = path.into(); match path.runtime() { - Runtime::Statemint => - Box::new(chain_spec::statemint::StatemintChainSpec::from_json_file(path)?), - Runtime::Statemine => - Box::new(chain_spec::statemint::StatemineChainSpec::from_json_file(path)?), - Runtime::Westmint => - Box::new(chain_spec::statemint::WestmintChainSpec::from_json_file(path)?), + Runtime::AssetHubPolkadot => Box::new( + chain_spec::asset_hubs::AssetHubPolkadotChainSpec::from_json_file(path)?, + ), + Runtime::AssetHubKusama => + Box::new(chain_spec::asset_hubs::AssetHubKusamaChainSpec::from_json_file(path)?), + Runtime::AssetHubWestend => Box::new( + chain_spec::asset_hubs::AssetHubWestendChainSpec::from_json_file(path)?, + ), Runtime::CollectivesPolkadot | Runtime::CollectivesWestend => Box::new( chain_spec::collectives::CollectivesPolkadotChainSpec::from_json_file(path)?, ), @@ -338,9 +353,9 @@ impl SubstrateCli for Cli { fn native_runtime_version(chain_spec: &Box) -> &'static RuntimeVersion { match chain_spec.runtime() { - Runtime::Statemint => &statemint_runtime::VERSION, - Runtime::Statemine => &statemine_runtime::VERSION, - Runtime::Westmint => &westmint_runtime::VERSION, + Runtime::AssetHubPolkadot => &asset_hub_polkadot_runtime::VERSION, + Runtime::AssetHubKusama => &asset_hub_kusama_runtime::VERSION, + Runtime::AssetHubWestend => &asset_hub_westend_runtime::VERSION, Runtime::CollectivesPolkadot | Runtime::CollectivesWestend => &collectives_polkadot_runtime::VERSION, Runtime::Shell => &shell_runtime::VERSION, @@ -399,24 +414,24 @@ impl SubstrateCli for RelayChainCli { macro_rules! construct_benchmark_partials { ($config:expr, |$partials:ident| $code:expr) => { match $config.chain_spec.runtime() { - Runtime::Statemine => { - let $partials = new_partial::( + Runtime::AssetHubKusama => { + let $partials = new_partial::( &$config, crate::service::aura_build_import_queue::<_, AuraId>, )?; $code }, - Runtime::Westmint => { - let $partials = new_partial::( + Runtime::AssetHubWestend => { + let $partials = new_partial::( &$config, crate::service::aura_build_import_queue::<_, AuraId>, )?; $code }, - Runtime::Statemint => { - let $partials = new_partial::( + Runtime::AssetHubPolkadot => { + let $partials = new_partial::( &$config, - crate::service::aura_build_import_queue::<_, StatemintAuraId>, + crate::service::aura_build_import_queue::<_, AssetHubPolkadotAuraId>, )?; $code }, @@ -436,9 +451,9 @@ macro_rules! construct_async_run { (|$components:ident, $cli:ident, $cmd:ident, $config:ident| $( $code:tt )* ) => {{ let runner = $cli.create_runner($cmd)?; match runner.config().chain_spec.runtime() { - Runtime::Westmint => { + Runtime::AssetHubWestend => { runner.async_run(|$config| { - let $components = new_partial::( + let $components = new_partial::( &$config, crate::service::aura_build_import_queue::<_, AuraId>, )?; @@ -446,9 +461,9 @@ macro_rules! construct_async_run { { $( $code )* }.map(|v| (v, task_manager)) }) }, - Runtime::Statemine => { + Runtime::AssetHubKusama => { runner.async_run(|$config| { - let $components = new_partial::( + let $components = new_partial::( &$config, crate::service::aura_build_import_queue::<_, AuraId>, )?; @@ -456,11 +471,11 @@ macro_rules! construct_async_run { { $( $code )* }.map(|v| (v, task_manager)) }) }, - Runtime::Statemint => { + Runtime::AssetHubPolkadot => { runner.async_run(|$config| { - let $components = new_partial::( + let $components = new_partial::( &$config, - crate::service::aura_build_import_queue::<_, StatemintAuraId>, + crate::service::aura_build_import_queue::<_, AssetHubPolkadotAuraId>, )?; let task_manager = $components.task_manager; { $( $code )* }.map(|v| (v, task_manager)) @@ -674,11 +689,11 @@ pub fn run() -> Result<()> { if cfg!(feature = "runtime-benchmarks") { runner.sync_run(|config| { match config.chain_spec.runtime() { - Runtime::Statemine => - cmd.run::(config), - Runtime::Westmint => cmd.run::(config), - Runtime::Statemint => - cmd.run::(config), + Runtime::AssetHubKusama => + cmd.run::(config), + Runtime::AssetHubWestend => cmd.run::(config), + Runtime::AssetHubPolkadot => + cmd.run::(config), Runtime::CollectivesPolkadot | Runtime::CollectivesWestend => cmd.run::(config), Runtime::BridgeHub(bridge_hub_runtime_type) => match bridge_hub_runtime_type { @@ -762,25 +777,25 @@ pub fn run() -> Result<()> { let info_provider = timestamp_with_aura_info(6000); match runner.config().chain_spec.runtime() { - Runtime::Statemine => runner.async_run(|_| { + Runtime::AssetHubKusama => runner.async_run(|_| { Ok(( - cmd.run::, _>(Some( + cmd.run::, _>(Some( info_provider, )), task_manager, )) }), - Runtime::Westmint => runner.async_run(|_| { + Runtime::AssetHubWestend => runner.async_run(|_| { Ok(( - cmd.run::, _>(Some( + cmd.run::, _>(Some( info_provider, )), task_manager, )) }), - Runtime::Statemint => runner.async_run(|_| { + Runtime::AssetHubPolkadot => runner.async_run(|_| { Ok(( - cmd.run::, _>(Some( + cmd.run::, _>(Some( info_provider, )), task_manager, @@ -858,6 +873,38 @@ pub fn run() -> Result<()> { let collator_options = cli.run.collator_options(); runner.run_node_until_exit(|config| async move { + // If Statemint (Statemine, Westmint, Rockmine) DB exists and we're using the + // asset-hub chain spec, then rename the base path to the new chain ID. In the case + // that both file paths exist, the node will exit, as the user must decide (by + // deleting one path) the information that they want to use as their DB. + let old_name = match config.chain_spec.id() { + "asset-hub-polkadot" => Some("statemint"), + "asset-hub-kusama" => Some("statemine"), + "asset-hub-westend" => Some("westmint"), + "asset-hub-rococo" => Some("rockmine"), + _ => None, + }; + + if let Some(old_name) = old_name { + let new_path = config.base_path.config_dir(config.chain_spec.id()); + let old_path = config.base_path.config_dir(old_name); + + if old_path.exists() && new_path.exists() { + return Err(format!( + "Found legacy {} path {} and new asset-hub path {}. Delete one path such that only one exists.", + old_name, old_path.display(), new_path.display() + ).into()) + } + + if old_path.exists() { + std::fs::rename(old_path.clone(), new_path.clone())?; + info!( + "Statemint renamed to Asset Hub. The filepath with associated data on disk has been renamed from {} to {}.", + old_path.display(), new_path.display() + ); + } + } + let hwbench = (!cli.no_hardware_benchmarks).then_some( config.database.path().map(|database_path| { let _ = std::fs::create_dir_all(database_path); @@ -900,22 +947,22 @@ pub fn run() -> Result<()> { } match config.chain_spec.runtime() { - Runtime::Statemint => crate::service::start_generic_aura_node::< - statemint_runtime::RuntimeApi, - StatemintAuraId, + Runtime::AssetHubPolkadot => crate::service::start_generic_aura_node::< + asset_hub_polkadot_runtime::RuntimeApi, + AssetHubPolkadotAuraId, >(config, polkadot_config, collator_options, id, hwbench) .await .map(|r| r.0) .map_err(Into::into), - Runtime::Statemine => crate::service::start_generic_aura_node::< - statemine_runtime::RuntimeApi, + Runtime::AssetHubKusama => crate::service::start_generic_aura_node::< + asset_hub_kusama_runtime::RuntimeApi, AuraId, >(config, polkadot_config, collator_options, id, hwbench) .await .map(|r| r.0) .map_err(Into::into), - Runtime::Westmint => crate::service::start_generic_aura_node::< - westmint_runtime::RuntimeApi, + Runtime::AssetHubWestend => crate::service::start_generic_aura_node::< + asset_hub_westend_runtime::RuntimeApi, AuraId, >(config, polkadot_config, collator_options, id, hwbench) .await @@ -1257,9 +1304,9 @@ mod tests { let path = store_configuration( &temp_dir, - Box::new(crate::chain_spec::statemint::statemine_local_config()), + Box::new(crate::chain_spec::asset_hubs::asset_hub_kusama_local_config()), ); - assert_eq!(Runtime::Statemine, path.runtime()); + assert_eq!(Runtime::AssetHubKusama, path.runtime()); let path = store_configuration( &temp_dir, diff --git a/polkadot-parachain/src/service.rs b/polkadot-parachain/src/service.rs index b4cc4ce4981..b493f3589ed 100644 --- a/polkadot-parachain/src/service.rs +++ b/polkadot-parachain/src/service.rs @@ -86,52 +86,52 @@ impl sc_executor::NativeExecutionDispatch for ShellRuntimeExecutor { } } -// Native Statemint executor instance. -pub struct StatemintRuntimeExecutor; +/// Native Asset Hub Polkadot (Statemint) executor instance. +pub struct AssetHubPolkadotRuntimeExecutor; -impl sc_executor::NativeExecutionDispatch for StatemintRuntimeExecutor { +impl sc_executor::NativeExecutionDispatch for AssetHubPolkadotRuntimeExecutor { type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; fn dispatch(method: &str, data: &[u8]) -> Option> { - statemint_runtime::api::dispatch(method, data) + asset_hub_polkadot_runtime::api::dispatch(method, data) } fn native_version() -> sc_executor::NativeVersion { - statemint_runtime::native_version() + asset_hub_polkadot_runtime::native_version() } } -/// Native Statemine executor instance. -pub struct StatemineRuntimeExecutor; +/// Native Asset Hub Kusama (Statemine) executor instance. +pub struct AssetHubKusamaExecutor; -impl sc_executor::NativeExecutionDispatch for StatemineRuntimeExecutor { +impl sc_executor::NativeExecutionDispatch for AssetHubKusamaExecutor { type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; fn dispatch(method: &str, data: &[u8]) -> Option> { - statemine_runtime::api::dispatch(method, data) + asset_hub_kusama_runtime::api::dispatch(method, data) } fn native_version() -> sc_executor::NativeVersion { - statemine_runtime::native_version() + asset_hub_kusama_runtime::native_version() } } -/// Native Westmint executor instance. -pub struct WestmintRuntimeExecutor; +/// Native Asset Hub Westend (Westmint) executor instance. +pub struct AssetHubWestendExecutor; -impl sc_executor::NativeExecutionDispatch for WestmintRuntimeExecutor { +impl sc_executor::NativeExecutionDispatch for AssetHubWestendExecutor { type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; fn dispatch(method: &str, data: &[u8]) -> Option> { - westmint_runtime::api::dispatch(method, data) + asset_hub_westend_runtime::api::dispatch(method, data) } fn native_version() -> sc_executor::NativeVersion { - westmint_runtime::native_version() + asset_hub_westend_runtime::native_version() } } -// Native Polkadot Collectives executor instance. +/// Native Polkadot Collectives executor instance. pub struct CollectivesPolkadotRuntimeExecutor; impl sc_executor::NativeExecutionDispatch for CollectivesPolkadotRuntimeExecutor { @@ -146,7 +146,7 @@ impl sc_executor::NativeExecutionDispatch for CollectivesPolkadotRuntimeExecutor } } -// Native BridgeHubPolkadot executor instance. +/// Native BridgeHubPolkadot executor instance. pub struct BridgeHubPolkadotRuntimeExecutor; impl sc_executor::NativeExecutionDispatch for BridgeHubPolkadotRuntimeExecutor { @@ -161,7 +161,7 @@ impl sc_executor::NativeExecutionDispatch for BridgeHubPolkadotRuntimeExecutor { } } -// Native BridgeHubKusama executor instance. +/// Native BridgeHubKusama executor instance. pub struct BridgeHubKusamaRuntimeExecutor; impl sc_executor::NativeExecutionDispatch for BridgeHubKusamaRuntimeExecutor { @@ -176,7 +176,7 @@ impl sc_executor::NativeExecutionDispatch for BridgeHubKusamaRuntimeExecutor { } } -// Native BridgeHubRococo executor instance. +/// Native BridgeHubRococo executor instance. pub struct BridgeHubRococoRuntimeExecutor; impl sc_executor::NativeExecutionDispatch for BridgeHubRococoRuntimeExecutor { @@ -191,7 +191,7 @@ impl sc_executor::NativeExecutionDispatch for BridgeHubRococoRuntimeExecutor { } } -// Native contracts executor instance. +/// Native contracts executor instance. pub struct ContractsRococoRuntimeExecutor; impl sc_executor::NativeExecutionDispatch for ContractsRococoRuntimeExecutor { @@ -1068,7 +1068,7 @@ where } } -/// Build the import queue for Statemint and other Aura-based runtimes. +/// Build the import queue for Aura-based runtimes. pub fn aura_build_import_queue( client: Arc>, block_import: ParachainBlockImport, @@ -1134,8 +1134,7 @@ where Ok(BasicQueue::new(verifier, Box::new(block_import), None, &spawner, registry)) } -/// Start an aura powered parachain node. -/// (collective-polkadot and statemine/t use this) +/// Start an aura powered parachain node. Asset Hub and Collectives use this. pub async fn start_generic_aura_node( parachain_config: Configuration, polkadot_config: Configuration, diff --git a/polkadot-parachain/tests/benchmark_storage_works.rs b/polkadot-parachain/tests/benchmark_storage_works.rs index b1c05609217..df3078b4dab 100644 --- a/polkadot-parachain/tests/benchmark_storage_works.rs +++ b/polkadot-parachain/tests/benchmark_storage_works.rs @@ -8,7 +8,7 @@ use std::{ use tempfile::tempdir; /// The runtimes that this command supports. -static RUNTIMES: [&str; 3] = ["westmint", "statemine", "statemint"]; +static RUNTIMES: [&str; 3] = ["asset-hub-westend", "asset-hub-kusama", "asset-hub-polkadot"]; /// The `benchmark storage` command works for the dev runtimes. #[test] diff --git a/scripts/benchmarks.sh b/scripts/benchmarks.sh index be9aa9b8348..29d06905925 100755 --- a/scripts/benchmarks.sh +++ b/scripts/benchmarks.sh @@ -8,9 +8,9 @@ __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ${__dir}/benchmarks-ci.sh collectives collectives-polkadot target/$target $steps $repeat -${__dir}/benchmarks-ci.sh assets statemine target/$target $steps $repeat -${__dir}/benchmarks-ci.sh assets statemint target/$target $steps $repeat -${__dir}/benchmarks-ci.sh assets westmint target/$target $steps $repeat +${__dir}/benchmarks-ci.sh assets asset-hub-kusama target/$target $steps $repeat +${__dir}/benchmarks-ci.sh assets asset-hub-polkadot target/$target $steps $repeat +${__dir}/benchmarks-ci.sh assets asset-hub-westend target/$target $steps $repeat ${__dir}/benchmarks-ci.sh bridge-hubs bridge-hub-polkadot target/$target $steps $repeat ${__dir}/benchmarks-ci.sh bridge-hubs bridge-hub-kusama target/$target $steps $repeat diff --git a/scripts/bridges_rococo_wococo.sh b/scripts/bridges_rococo_wococo.sh index 2d918e244a9..1117ed68109 100755 --- a/scripts/bridges_rococo_wococo.sh +++ b/scripts/bridges_rococo_wococo.sh @@ -2,10 +2,10 @@ # Address: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY # AccountId: [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] -STATEMINE_ACCOUNT_SEED_FOR_LOCAL="//Alice" +ASSET_HUB_KUSAMA_ACCOUNT_SEED_FOR_LOCAL="//Alice" # Address: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY # AccountId: [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] -WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL="5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" +ASSET_HUB_WOCOCO_ACCOUNT_SEED_FOR_LOCAL="5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" # SovereignAccount for `MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1000)) }` => 5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ # @@ -16,23 +16,23 @@ WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL="5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGK # MultiLocation { parents: 2, interior: X2(GlobalConsensus(Kusama), Parachain(1000)) }).unwrap() # ).to_ss58check_with_version(42_u16.into()) # ); -ROCOCO_STATEMINE_1000_SOVEREIGN_ACCOUNT="5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ" +ASSET_HUB_ROCOCO_1000_SOVEREIGN_ACCOUNT="5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ" # Address: GegTpZJMyzkntLN7NJhRfHDk4GWukLbGSsag6PHrLSrCK4h -ROCKMINE2_ACCOUNT_SEED_FOR_ROCOCO="scatter feed race company oxygen trip extra elbow slot bundle auto canoe" +ASSET_HUB2_ROCOCO_1000_SOVEREIGN_ACCOUNT="scatter feed race company oxygen trip extra elbow slot bundle auto canoe" # Adress: 5Ge7YcbctWCP1CccugzxWDn9hFnTxvTh3bL6PNy4ubNJmp7Y / H9jCvwVWsDJkrS4gPp1QB99qr4hmbGsVyAqn3F2PPaoWyU3 # AccountId: [202, 107, 198, 135, 15, 25, 193, 165, 172, 73, 137, 218, 115, 177, 204, 0, 5, 155, 215, 86, 208, 51, 50, 130, 190, 110, 184, 143, 124, 50, 160, 20] -WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO="5Ge7YcbctWCP1CccugzxWDn9hFnTxvTh3bL6PNy4ubNJmp7Y" -WOCKMINT_ACCOUNT_SEED_FOR_WOCOCO="tone spirit magnet sunset cannon poverty forget lock river east blouse random" +ASSET_HUB_WOCOCO_ACCOUNT_ADDRESS_FOR_ROCOCO="5Ge7YcbctWCP1CccugzxWDn9hFnTxvTh3bL6PNy4ubNJmp7Y" +ASSET_HUB_WOCOCO_ACCOUNT_SEED_FOR_WOCOCO="tone spirit magnet sunset cannon poverty forget lock river east blouse random" function address_to_account_id_bytes() { local address=$1 local output=$2 echo "address_to_account_id_bytes - address: $address, output: $output" - if [ $address == "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" ]; then + if [ $address == "$ASSET_HUB_WOCOCO_ACCOUNT_SEED_FOR_LOCAL" ]; then jq --null-input '[212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]' > $output - elif [ $address == "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" ]; then + elif [ $address == "$ASSET_HUB_WOCOCO_ACCOUNT_ADDRESS_FOR_ROCOCO" ]; then jq --null-input '[202, 107, 198, 135, 15, 25, 193, 165, 172, 73, 137, 218, 115, 177, 204, 0, 5, 155, 215, 86, 208, 51, 50, 130, 190, 110, 184, 143, 124, 50, 160, 20]' > $output else echo -n "Sorry, unknown address: $address - please, add bytes here or function for that!" @@ -382,7 +382,7 @@ function remove_assets_transfer_send() { } # TODO: we need to fill sovereign account for bridge-hub, because, small ammouts does not match ExistentialDeposit, so no reserve pass -# SA for BH: MultiLocation { parents: 1, interior: X1(Parachain(1013)) } - 5Eg2fntRRwLinojmk3sh5xscp7F3S6Zzm5oDVtoLTALKiypR on Statemine +# SA for BH: MultiLocation { parents: 1, interior: X1(Parachain(1013)) } - 5Eg2fntRRwLinojmk3sh5xscp7F3S6Zzm5oDVtoLTALKiypR on Kusama Asset Hub function transfer_asset_via_bridge() { local url=$1 @@ -583,12 +583,12 @@ case "$1" in run_relay ;; allow-transfers-local) - # this allows send transfers on statemine (by governance-like) - ./$0 "allow-transfer-on-statemine-local" - # this allows receive transfers on westmint (by governance-like) - ./$0 "allow-transfer-on-westmint-local" + # this allows send transfers on asset hub kusama local (by governance-like) + ./$0 "allow-transfer-on-asset-hub-kusama-local" + # this allows receive transfers on asset hub westend local (by governance-like) + ./$0 "allow-transfer-on-asset-hub-westend-local" ;; - allow-transfer-on-statemine-local) + allow-transfer-on-asset-hub-kusama-local) ensure_polkadot_js_api allow_assets_transfer_send \ "ws://127.0.0.1:9942" \ @@ -598,7 +598,7 @@ case "$1" in 1013 \ "Wococo" 1000 ;; - allow-transfer-on-westmint-local) + allow-transfer-on-asset-hub-westend-local) ensure_polkadot_js_api allow_assets_transfer_receive \ "ws://127.0.0.1:9945" \ @@ -611,18 +611,18 @@ case "$1" in transfer_balance \ "ws://127.0.0.1:9010" \ "//Alice" \ - "$ROCOCO_STATEMINE_1000_SOVEREIGN_ACCOUNT" \ + "$ASSET_HUB_ROCOCO_1000_SOVEREIGN_ACCOUNT" \ $((1000000000 + 50000000000 * 20)) # ExistentialDeposit + maxTargetLocationFee * 20 - # create foreign assets for native Statemine token (yes, Kusama, because we are using Statemine runtime on rococo) + # create foreign assets for native Kusama token (yes, Kusama, because we are using Kusama Asset Hub runtime on rococo) force_create_foreign_asset \ "ws://127.0.0.1:9945" \ "//Alice" \ 1000 \ "ws://127.0.0.1:9010" \ "Kusama" \ - "$ROCOCO_STATEMINE_1000_SOVEREIGN_ACCOUNT" + "$ASSET_HUB_ROCOCO_1000_SOVEREIGN_ACCOUNT" ;; - remove-assets-transfer-from-statemine-local) + remove-assets-transfer-from-asset-hub-kusama-local) ensure_polkadot_js_api remove_assets_transfer_send \ "ws://127.0.0.1:9942" \ @@ -631,43 +631,43 @@ case "$1" in "ws://127.0.0.1:9910" \ "Wococo" ;; - transfer-asset-from-statemine-local) + transfer-asset-from-asset-hub-kusama-local) ensure_polkadot_js_api transfer_asset_via_bridge \ "ws://127.0.0.1:9910" \ - "$STATEMINE_ACCOUNT_SEED_FOR_LOCAL" \ - "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" \ + "$ASSET_HUB_KUSAMA_ACCOUNT_SEED_FOR_LOCAL" \ + "$ASSET_HUB_WOCOCO_ACCOUNT_SEED_FOR_LOCAL" \ "Wococo" ;; - ping-via-bridge-from-statemine-local) + ping-via-bridge-from-asset-hub-kusama-local) ensure_polkadot_js_api ping_via_bridge \ "ws://127.0.0.1:9910" \ - "$STATEMINE_ACCOUNT_SEED_FOR_LOCAL" \ - "$WOCKMINT_ACCOUNT_ADDRESS_FOR_LOCAL" \ + "$ASSET_HUB_KUSAMA_ACCOUNT_SEED_FOR_LOCAL" \ + "$ASSET_HUB_WOCOCO_ACCOUNT_SEED_FOR_LOCAL" \ "Wococo" ;; - transfer-asset-from-statemine-rococo) + transfer-asset-from-asset-hub-rococo) ensure_polkadot_js_api transfer_asset_via_bridge \ "wss://ws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io" \ - "$ROCKMINE2_ACCOUNT_SEED_FOR_ROCOCO" \ - "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" \ + "$ASSET_HUB2_ROCOCO_1000_SOVEREIGN_ACCOUNT" \ + "$ASSET_HUB_WOCOCO_ACCOUNT_ADDRESS_FOR_ROCOCO" \ "Wococo" ;; - ping-via-bridge-from-statemine-rococo) + ping-via-bridge-from-asset-hub-rococo) ensure_polkadot_js_api ping_via_bridge \ "wss://ws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io" \ - "${ROCKMINE2_ACCOUNT_SEED_FOR_ROCOCO}" \ - "$WOCKMINT_ACCOUNT_ADDRESS_FOR_ROCOCO" \ + "${ASSET_HUB2_ROCOCO_1000_SOVEREIGN_ACCOUNT}" \ + "$ASSET_HUB_WOCOCO_ACCOUNT_ADDRESS_FOR_ROCOCO" \ "Wococo" ;; drip) transfer_balance \ "ws://127.0.0.1:9010" \ "//Alice" \ - "$ROCOCO_STATEMINE_1000_SOVEREIGN_ACCOUNT" \ + "$ASSET_HUB_ROCOCO_1000_SOVEREIGN_ACCOUNT" \ $((1000000000 + 50000000000 * 20)) ;; stop) @@ -682,14 +682,14 @@ case "$1" in Local (zombienet) run: - run-relay - allow-transfers-local - - allow-transfer-on-statemine-local - - allow-transfer-on-westmint-local - - remove-assets-transfer-from-statemine-local - - transfer-asset-from-statemine-local - - ping-via-bridge-from-statemine-local + - allow-transfer-on-asset-hub-kusama-local + - allow-transfer-on-asset-hub-westend-local + - remove-assets-transfer-from-asset-hub-kusama-local + - transfer-asset-from-asset-hub-kusama-local + - ping-via-bridge-from-asset-hub-kusama-local Live Rococo/Wococo run: - - transfer-asset-from-statemine-rococo - - ping-via-bridge-from-statemine-rococo"; + - transfer-asset-from-asset-hub-rococo + - ping-via-bridge-from-asset-hub-rococo"; exit 1 ;; esac diff --git a/scripts/ci/gitlab/pipeline/benchmarks.yml b/scripts/ci/gitlab/pipeline/benchmarks.yml index d1fdd64c341..011e750a735 100644 --- a/scripts/ci/gitlab/pipeline/benchmarks.yml +++ b/scripts/ci/gitlab/pipeline/benchmarks.yml @@ -22,13 +22,13 @@ benchmarks-assets: before_script: - !reference [.docker-env, before_script] script: - - ./scripts/benchmarks-ci.sh assets statemine ./artifacts - - ./scripts/benchmarks-ci.sh assets statemint ./artifacts - - ./scripts/benchmarks-ci.sh assets westmint ./artifacts + - ./scripts/benchmarks-ci.sh assets asset-hub-kusama ./artifacts + - ./scripts/benchmarks-ci.sh assets asset-hub-polkadot ./artifacts + - ./scripts/benchmarks-ci.sh assets asset-hub-westend ./artifacts - export CURRENT_TIME=$(date '+%s') - - export BRANCHNAME="weights-statemint-${CI_COMMIT_BRANCH}-${CURRENT_TIME}" + - export BRANCHNAME="weights-asset-hub-polkadot-${CI_COMMIT_BRANCH}-${CURRENT_TIME}" - !reference [.git-commit-push, script] - - ./scripts/ci/create-benchmark-pr.sh "[benchmarks] Update weights for statemine/t" "$BRANCHNAME" + - ./scripts/ci/create-benchmark-pr.sh "[benchmarks] Update weights for asset-hub-kusama/t" "$BRANCHNAME" - rm -f ./artifacts/polkadot-parachain - rm -f ./artifacts/test-parachain after_script: diff --git a/scripts/generate_genesis_value.sh b/scripts/generate_genesis_value.sh index 07e9fca59d7..178e15fb8a9 100755 --- a/scripts/generate_genesis_value.sh +++ b/scripts/generate_genesis_value.sh @@ -58,7 +58,7 @@ if [[ "$rpc_endpoint" =~ "localhost" ]]; then check_collator echo -e "Make sure you have a collator running with the correct version at $rpc_endpoint." echo -e "If you don't, NOW is the time to start it with:" - echo -e "target/release/polkadot-parachain --chain parachains/chain-specs/shell-statemint.json --tmp\n" + echo -e "target/release/polkadot-parachain --chain parachains/chain-specs/shell.json --tmp\n" read -p "You can abort with CTRL+C if this is not correct, otherwise press ENTER " fi diff --git a/scripts/parachains_integration_tests.sh b/scripts/parachains_integration_tests.sh index ed920f430fc..2a06b930e22 100755 --- a/scripts/parachains_integration_tests.sh +++ b/scripts/parachains_integration_tests.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash tests=( - statemine - statemint + asset-hub-kusama + asset-hub-polkadot ) rm -R logs &> /dev/null diff --git a/xcm/xcm-emulator/README.md b/xcm/xcm-emulator/README.md index aa1bd3d5406..d188c99eecf 100644 --- a/xcm/xcm-emulator/README.md +++ b/xcm/xcm-emulator/README.md @@ -2,7 +2,7 @@ XCM-Emulator is a tool to emulate XCM program execution using pre-configured runtimes, including those used to run on live -networks, such as Kusama, Polkadot, Statemine et cetera. +networks, such as Kusama, Polkadot, Asset Hubs, et cetera. This allows for testing cross-chain message passing and verifying outcomes, weights, and side-effects. It is faster than spinning up a zombienet and as all the chains are in one process debugging using Clion is easy. diff --git a/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml b/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml index 7badbe51d63..4e1260f9e41 100644 --- a/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml +++ b/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml @@ -64,7 +64,7 @@ cumulus_based = true [[parachains]] id = 1000 -chain = "statemine-local" +chain = "asset-hub-kusama-local" cumulus_based = true [[parachains.collators]] diff --git a/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml b/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml index 53247b6fdc8..7dcc8dd7232 100644 --- a/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml +++ b/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml @@ -64,7 +64,7 @@ cumulus_based = true [[parachains]] id = 1000 -chain = "westmint-local" +chain = "asset-hub-westend-local" cumulus_based = true [[parachains.collators]] diff --git a/zombienet/examples/small_network.toml b/zombienet/examples/small_network.toml index ac5ee11e5bb..06ac0d0e5e7 100644 --- a/zombienet/examples/small_network.toml +++ b/zombienet/examples/small_network.toml @@ -14,7 +14,7 @@ chain = "rococo-local" [[parachains]] id = 2000 cumulus_based = true -chain = "statemine-local" +chain = "asset-hub-kusama-local" # run charlie as parachain collator [[parachains.collators]] diff --git a/zombienet/examples/statemine_kusama_local_network.toml b/zombienet/examples/statemine_kusama_local_network.toml index 01d1b0b2d21..1f3debfb9d2 100644 --- a/zombienet/examples/statemine_kusama_local_network.toml +++ b/zombienet/examples/statemine_kusama_local_network.toml @@ -21,7 +21,7 @@ chain = "kusama-local" [[parachains]] id = 1000 -chain = "statemine-local" +chain = "asset-hub-kusama-local" cumulus_based = true # run alice as parachain collator From 93b7fe3e939d1979ec870299803cced18f30fae4 Mon Sep 17 00:00:00 2001 From: Squirrel Date: Fri, 2 Jun 2023 13:36:34 +0100 Subject: [PATCH 267/339] Support westend integration tests (#2649) * mostly there with westend * add network * initial way to set host api version * 3 tests all passing * Remove duplication * fix runtime-benchmarks * Fix typo --------- Co-authored-by: joepetrowski --- Cargo.lock | 30 ++++ Cargo.toml | 2 +- .../assets/asset-hub-westend/Cargo.toml | 37 +++++ .../assets/asset-hub-westend/src/lib.rs | 29 ++++ .../assets/asset-hub-westend/src/tests/mod.rs | 3 + .../src/tests/reserve_transfer.rs | 65 ++++++++ .../asset-hub-westend/src/tests/teleport.rs | 62 +++++++ .../asset-hub-westend/src/tests/transact.rs | 58 +++++++ .../emulated/common/Cargo.toml | 5 + .../emulated/common/src/constants.rs | 152 ++++++++++++++++++ .../emulated/common/src/lib.rs | 87 +++++++++- xcm/xcm-emulator/src/lib.rs | 11 +- 12 files changed, 533 insertions(+), 8 deletions(-) create mode 100644 parachains/integration-tests/emulated/assets/asset-hub-westend/Cargo.toml create mode 100644 parachains/integration-tests/emulated/assets/asset-hub-westend/src/lib.rs create mode 100644 parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/mod.rs create mode 100644 parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/reserve_transfer.rs create mode 100644 parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/teleport.rs create mode 100644 parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/transact.rs diff --git a/Cargo.lock b/Cargo.lock index 59aa83e787b..fa6a016eaae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -555,6 +555,33 @@ dependencies = [ "xcm-executor", ] +[[package]] +name = "asset-hub-westend-integration-tests" +version = "1.0.0" +dependencies = [ + "asset-hub-westend-runtime", + "frame-support", + "frame-system", + "integration-tests-common", + "pallet-assets", + "pallet-balances", + "pallet-xcm", + "parachains-common", + "parity-scale-codec", + "penpal-runtime", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-runtime", + "polkadot-runtime-parachains", + "sp-core", + "sp-runtime", + "sp-weights", + "westend-runtime", + "xcm", + "xcm-emulator", + "xcm-executor", +] + [[package]] name = "asset-hub-westend-runtime" version = "0.9.420" @@ -5143,6 +5170,7 @@ version = "1.0.0" dependencies = [ "asset-hub-kusama-runtime", "asset-hub-polkadot-runtime", + "asset-hub-westend-runtime", "bridge-hub-kusama-runtime", "bridge-hub-polkadot-runtime", "collectives-polkadot-runtime", @@ -5173,6 +5201,8 @@ dependencies = [ "sp-core", "sp-runtime", "sp-weights", + "westend-runtime", + "westend-runtime-constants", "xcm", "xcm-emulator", "xcm-executor", diff --git a/Cargo.toml b/Cargo.toml index d03e720da64..31cfd84550b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,6 +55,7 @@ members = [ "parachains/integration-tests/emulated/common", "parachains/integration-tests/emulated/assets/asset-hub-kusama", "parachains/integration-tests/emulated/assets/asset-hub-polkadot", + "parachains/integration-tests/emulated/assets/asset-hub-westend", "test/client", "test/relay-sproof-builder", "test/relay-validation-worker-provider", @@ -71,4 +72,3 @@ opt-level = 3 inherits = "release" lto = true codegen-units = 1 - diff --git a/parachains/integration-tests/emulated/assets/asset-hub-westend/Cargo.toml b/parachains/integration-tests/emulated/assets/asset-hub-westend/Cargo.toml new file mode 100644 index 00000000000..c216a84191f --- /dev/null +++ b/parachains/integration-tests/emulated/assets/asset-hub-westend/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "asset-hub-westend-integration-tests" +version = "1.0.0" +authors = ["Parity Technologies "] +edition = "2021" +description = "Asset Hub Westend runtime integration tests with xcm-emulator" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } + +# Substrate +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } + +# Polkadot +polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } +westend-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } +xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } + +# Cumulus +parachains-common = { path = "../../../../common" } +penpal-runtime = { path = "../../../../runtimes/testing/penpal" } +asset-hub-westend-runtime = { path = "../../../../runtimes/assets/asset-hub-westend" } + +# Local +xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } +integration-tests-common = { default-features = false, path = "../../common" } diff --git a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/lib.rs b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/lib.rs new file mode 100644 index 00000000000..d68aa99c709 --- /dev/null +++ b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/lib.rs @@ -0,0 +1,29 @@ +pub use codec::Encode; +pub use frame_support::{ + assert_ok, instances::Instance1, pallet_prelude::Weight, traits::fungibles::Inspect, +}; +pub use integration_tests_common::{ + constants::{ + accounts::{ALICE, BOB}, + polkadot::ED as POLKADOT_ED, + PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, + }, + AccountId, AssetHubWestend, AssetHubWestendPallet, AssetHubWestendReceiver, + AssetHubWestendSender, Collectives, CollectivesPallet, CollectivesReceiver, CollectivesSender, + PenpalWestend, Westend, WestendPallet, WestendReceiver, WestendSender, +}; +pub use polkadot_core_primitives::InboundDownwardMessage; +pub use xcm::{ + prelude::*, + v3::{ + Error, + NetworkId::{Kusama as KusamaId, Polkadot as PolkadotId}, + }, +}; +pub use xcm_emulator::{ + assert_expected_events, bx, cumulus_pallet_dmp_queue, helpers::weight_within_threshold, + Parachain as Para, RelayChain as Relay, TestExt, +}; + +#[cfg(test)] +mod tests; diff --git a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/mod.rs b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/mod.rs new file mode 100644 index 00000000000..996f9fd0aae --- /dev/null +++ b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/mod.rs @@ -0,0 +1,3 @@ +mod reserve_transfer; +mod teleport; +mod transact; diff --git a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/reserve_transfer.rs new file mode 100644 index 00000000000..b54f654702b --- /dev/null +++ b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/reserve_transfer.rs @@ -0,0 +1,65 @@ +use crate::*; + +#[test] +fn reserve_transfer_native_asset_from_relay_to_assets() { + // Init tests variables + let amount = POLKADOT_ED * 1000; + let relay_sender_balance_before = Westend::account_data_of(WestendSender::get()).free; + let para_receiver_balance_before = + AssetHubWestend::account_data_of(AssetHubWestendReceiver::get()).free; + + let origin = ::RuntimeOrigin::signed(WestendSender::get()); + let assets_para_destination: VersionedMultiLocation = + Westend::child_location_of(AssetHubWestend::para_id()).into(); + let beneficiary: VersionedMultiLocation = + AccountId32 { network: None, id: AssetHubWestendReceiver::get().into() }.into(); + let native_assets: VersionedMultiAssets = (Here, amount).into(); + let fee_asset_item = 0; + let weight_limit = WeightLimit::Unlimited; + + // Send XCM message from Relay Chain + Westend::execute_with(|| { + assert_ok!(::XcmPallet::limited_reserve_transfer_assets( + origin, + bx!(assets_para_destination), + bx!(beneficiary), + bx!(native_assets), + fee_asset_item, + weight_limit, + )); + + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Westend, + vec![ + RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { outcome: Outcome::Complete(weight) }) => { + weight: weight_within_threshold((REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), Weight::from_parts(731_495_000, 0), *weight), + }, + ] + ); + }); + + // Receive XCM message in Assets Parachain + AssetHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + AssetHubWestend, + vec![ + RuntimeEvent::DmpQueue(cumulus_pallet_dmp_queue::Event::ExecutedDownward { + outcome: Outcome::Incomplete(_, Error::UntrustedReserveLocation), + .. + }) => {}, + ] + ); + }); + + // Check if balances are updated accordingly in Relay Chain and Assets Parachain + let relay_sender_balance_after = Westend::account_data_of(WestendSender::get()).free; + let para_sender_balance_after = + AssetHubWestend::account_data_of(AssetHubWestendReceiver::get()).free; + + assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); + assert_eq!(para_sender_balance_after, para_receiver_balance_before); +} diff --git a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/teleport.rs new file mode 100644 index 00000000000..f17ea755785 --- /dev/null +++ b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/teleport.rs @@ -0,0 +1,62 @@ +use crate::*; + +#[test] +fn teleport_native_assets_from_relay_to_assets_para() { + // Init tests variables + let amount = POLKADOT_ED * 1000; + let relay_sender_balance_before = Westend::account_data_of(WestendSender::get()).free; + let para_receiver_balance_before = + AssetHubWestend::account_data_of(AssetHubWestendReceiver::get()).free; + + let origin = ::RuntimeOrigin::signed(WestendSender::get()); + let assets_para_destination: VersionedMultiLocation = + Westend::child_location_of(AssetHubWestend::para_id()).into(); + let beneficiary: VersionedMultiLocation = + AccountId32 { network: None, id: AssetHubWestendReceiver::get().into() }.into(); + let native_assets: VersionedMultiAssets = (Here, amount).into(); + let fee_asset_item = 0; + let weight_limit = WeightLimit::Unlimited; + + // Send XCM message from Relay Chain + Westend::execute_with(|| { + assert_ok!(::XcmPallet::limited_teleport_assets( + origin, + bx!(assets_para_destination), + bx!(beneficiary), + bx!(native_assets), + fee_asset_item, + weight_limit, + )); + + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Westend, + vec![ + RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { outcome: Outcome::Complete { .. } }) => {}, + ] + ); + }); + + // Receive XCM message in Assets Parachain + AssetHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + AssetHubWestend, + vec![ + RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + who: *who == AssetHubWestendReceiver::get().into(), + }, + ] + ); + }); + + // Check if balances are updated accordingly in Relay Chain and Assets Parachain + let relay_sender_balance_after = Westend::account_data_of(WestendSender::get()).free; + let para_sender_balance_after = + AssetHubWestend::account_data_of(AssetHubWestendReceiver::get()).free; + + assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); + assert!(para_sender_balance_after > para_receiver_balance_before); +} diff --git a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/transact.rs b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/transact.rs new file mode 100644 index 00000000000..3453ea6991f --- /dev/null +++ b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/transact.rs @@ -0,0 +1,58 @@ +use crate::*; + +#[test] +fn transact_sudo_from_relay_to_assets_para() { + // Init tests variables + // Call to be executed in Assets Parachain + const ASSET_ID: u32 = 1; + + let call = ::RuntimeCall::Assets(pallet_assets::Call::< + ::Runtime, + Instance1, + >::force_create { + id: ASSET_ID.into(), + is_sufficient: true, + min_balance: 1000, + owner: AssetHubWestendSender::get().into(), + }) + .encode() + .into(); + + // XcmPallet send arguments + let sudo_origin = ::RuntimeOrigin::root(); + let assets_para_destination: VersionedMultiLocation = + Westend::child_location_of(AssetHubWestend::para_id()).into(); + + let weight_limit = WeightLimit::Unlimited; + let require_weight_at_most = Weight::from_parts(1000000000, 200000); + let origin_kind = OriginKind::Superuser; + let check_origin = None; + + let xcm = VersionedXcm::from(Xcm(vec![ + UnpaidExecution { weight_limit, check_origin }, + Transact { require_weight_at_most, origin_kind, call }, + ])); + + // Send XCM message from Relay Chain + Westend::execute_with(|| { + assert_ok!(::XcmPallet::send( + sudo_origin, + bx!(assets_para_destination), + bx!(xcm), + )); + + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Westend, + vec![ + RuntimeEvent::XcmPallet(pallet_xcm::Event::Sent { .. }) => {}, + ] + ); + }); + + // Receive XCM message in Assets Parachain + AssetHubWestend::execute_with(|| { + assert!(::Assets::asset_exists(ASSET_ID)); + }); +} diff --git a/parachains/integration-tests/emulated/common/Cargo.toml b/parachains/integration-tests/emulated/common/Cargo.toml index a05dd229798..340ca874993 100644 --- a/parachains/integration-tests/emulated/common/Cargo.toml +++ b/parachains/integration-tests/emulated/common/Cargo.toml @@ -32,6 +32,8 @@ polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "m polkadot-runtime-constants = { git = "https://github.com/paritytech/polkadot", branch = "master" } kusama-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } kusama-runtime-constants = { git = "https://github.com/paritytech/polkadot", branch = "master" } +westend-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } +westend-runtime-constants = { git = "https://github.com/paritytech/polkadot", branch = "master" } xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } @@ -43,6 +45,7 @@ cumulus-primitives-core = { path = "../../../../primitives/core" } penpal-runtime = { path = "../../../runtimes/testing/penpal" } asset-hub-polkadot-runtime = { path = "../../../runtimes/assets/asset-hub-polkadot" } asset-hub-kusama-runtime = { path = "../../../runtimes/assets/asset-hub-kusama" } +asset-hub-westend-runtime = { path = "../../../runtimes/assets/asset-hub-westend" } collectives-polkadot-runtime = { path = "../../../runtimes/collectives/collectives-polkadot" } bridge-hub-kusama-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-kusama" } bridge-hub-polkadot-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-polkadot" } @@ -51,4 +54,6 @@ xcm-emulator = { default-features = false, path = "../../../../xcm/xcm-emulator" [features] runtime-benchmarks = [ "kusama-runtime/runtime-benchmarks", + "polkadot-runtime/runtime-benchmarks", + "westend-runtime/runtime-benchmarks", ] diff --git a/parachains/integration-tests/emulated/common/src/constants.rs b/parachains/integration-tests/emulated/common/src/constants.rs index a4b3942c526..cd4d321457e 100644 --- a/parachains/integration-tests/emulated/common/src/constants.rs +++ b/parachains/integration-tests/emulated/common/src/constants.rs @@ -209,6 +209,102 @@ pub mod polkadot { } } +pub mod westend { + use super::*; + use westend_runtime_constants::currency::UNITS as WND; + pub const ED: Balance = westend_runtime_constants::currency::EXISTENTIAL_DEPOSIT; + const ENDOWMENT: u128 = 1_000_000 * WND; + const STASH: u128 = 100 * WND; + + pub fn get_host_config() -> HostConfiguration { + HostConfiguration { + max_upward_queue_count: 10, + max_upward_queue_size: 51200, + max_upward_message_size: 51200, + max_upward_message_num_per_candidate: 10, + max_downward_message_size: 51200, + ..Default::default() + } + } + + fn session_keys( + babe: BabeId, + grandpa: GrandpaId, + im_online: ImOnlineId, + para_validator: ValidatorId, + para_assignment: AssignmentId, + authority_discovery: AuthorityDiscoveryId, + ) -> westend_runtime::SessionKeys { + westend_runtime::SessionKeys { + babe, + grandpa, + im_online, + para_validator, + para_assignment, + authority_discovery, + } + } + + pub fn genesis() -> Storage { + let genesis_config = westend_runtime::GenesisConfig { + system: westend_runtime::SystemConfig { + code: westend_runtime::WASM_BINARY.unwrap().to_vec(), + }, + balances: westend_runtime::BalancesConfig { + balances: accounts::init_balances() + .iter() + .cloned() + .map(|k| (k, ENDOWMENT)) + .collect(), + }, + session: westend_runtime::SessionConfig { + keys: validators::initial_authorities() + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + westend::session_keys( + x.2.clone(), + x.3.clone(), + x.4.clone(), + x.5.clone(), + x.6.clone(), + x.7.clone(), + ), + ) + }) + .collect::>(), + }, + staking: westend_runtime::StakingConfig { + validator_count: validators::initial_authorities().len() as u32, + minimum_validator_count: 1, + stakers: validators::initial_authorities() + .iter() + .map(|x| { + (x.0.clone(), x.1.clone(), STASH, westend_runtime::StakerStatus::Validator) + }) + .collect(), + invulnerables: validators::initial_authorities() + .iter() + .map(|x| x.0.clone()) + .collect(), + force_era: pallet_staking::Forcing::ForceNone, + slash_reward_fraction: Perbill::from_percent(10), + ..Default::default() + }, + babe: westend_runtime::BabeConfig { + authorities: Default::default(), + epoch_config: Some(westend_runtime::BABE_GENESIS_EPOCH_CONFIG), + }, + configuration: westend_runtime::ConfigurationConfig { config: get_host_config() }, + ..Default::default() + }; + + genesis_config.build_storage().unwrap() + } +} + // Kusama pub mod kusama { use super::*; @@ -361,6 +457,62 @@ pub mod asset_hub_polkadot { } } +// Asset Hub Westend +pub mod asset_hub_westend { + use super::*; + pub const PARA_ID: u32 = 1000; + pub const ED: Balance = asset_hub_westend_runtime::constants::currency::EXISTENTIAL_DEPOSIT; + + pub fn genesis() -> Storage { + let genesis_config = asset_hub_westend_runtime::GenesisConfig { + system: asset_hub_westend_runtime::SystemConfig { + code: asset_hub_westend_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + }, + balances: asset_hub_westend_runtime::BalancesConfig { + balances: accounts::init_balances() + .iter() + .cloned() + .map(|k| (k, ED * 4096)) + .collect(), + }, + parachain_info: asset_hub_westend_runtime::ParachainInfoConfig { + parachain_id: PARA_ID.into(), + }, + collator_selection: asset_hub_westend_runtime::CollatorSelectionConfig { + invulnerables: collators::invulnerables() + .iter() + .cloned() + .map(|(acc, _)| acc) + .collect(), + candidacy_bond: ED * 16, + ..Default::default() + }, + session: asset_hub_westend_runtime::SessionConfig { + keys: collators::invulnerables() + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + asset_hub_westend_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect(), + }, + aura: Default::default(), + aura_ext: Default::default(), + parachain_system: Default::default(), + polkadot_xcm: asset_hub_westend_runtime::PolkadotXcmConfig { + safe_xcm_version: Some(SAFE_XCM_VERSION), + }, + }; + + genesis_config.build_storage().unwrap() + } +} + // Asset Hub Kusama pub mod asset_hub_kusama { use super::*; diff --git a/parachains/integration-tests/emulated/common/src/lib.rs b/parachains/integration-tests/emulated/common/src/lib.rs index 82ab42359e0..39e4fbb453e 100644 --- a/parachains/integration-tests/emulated/common/src/lib.rs +++ b/parachains/integration-tests/emulated/common/src/lib.rs @@ -2,8 +2,8 @@ pub mod constants; pub use constants::{ accounts::{ALICE, BOB}, - asset_hub_kusama, asset_hub_polkadot, bridge_hub_kusama, bridge_hub_polkadot, collectives, - kusama, penpal, polkadot, + asset_hub_kusama, asset_hub_polkadot, asset_hub_westend, bridge_hub_kusama, + bridge_hub_polkadot, collectives, kusama, penpal, polkadot, westend, }; use frame_support::{parameter_types, sp_io, sp_tracing}; pub use parachains_common::{AccountId, AssetHubPolkadotAuraId, AuraId, Balance, BlockNumber}; @@ -16,6 +16,27 @@ use xcm_emulator::{ use xcm_executor::traits::Convert; decl_test_relay_chains! { + #[api_version(5)] + pub struct Westend { + genesis = westend::genesis(), + on_init = (), + runtime = { + Runtime: westend_runtime::Runtime, + RuntimeOrigin: westend_runtime::RuntimeOrigin, + RuntimeCall: westend_runtime::RuntimeCall, + RuntimeEvent: westend_runtime::RuntimeEvent, + MessageQueue: westend_runtime::MessageQueue, + XcmConfig: westend_runtime::xcm_config::XcmConfig, + SovereignAccountOf: westend_runtime::xcm_config::LocationConverter, //TODO: rename to SovereignAccountOf, + System: westend_runtime::System, + Balances: westend_runtime::Balances, + }, + pallets_extra = { + XcmPallet: westend_runtime::XcmPallet, + Sudo: westend_runtime::Sudo, + } + }, + #[api_version(4)] pub struct Polkadot { genesis = polkadot::genesis(), on_init = (), @@ -34,6 +55,7 @@ decl_test_relay_chains! { XcmPallet: polkadot_runtime::XcmPallet, } }, + #[api_version(4)] pub struct Kusama { genesis = kusama::genesis(), on_init = (), @@ -55,6 +77,29 @@ decl_test_relay_chains! { } decl_test_parachains! { + // Westend + pub struct AssetHubWestend { + genesis = asset_hub_westend::genesis(), + on_init = (), + runtime = { + Runtime: asset_hub_westend_runtime::Runtime, + RuntimeOrigin: asset_hub_westend_runtime::RuntimeOrigin, + RuntimeCall: asset_hub_westend_runtime::RuntimeCall, + RuntimeEvent: asset_hub_westend_runtime::RuntimeEvent, + XcmpMessageHandler: asset_hub_westend_runtime::XcmpQueue, + DmpMessageHandler: asset_hub_westend_runtime::DmpQueue, + LocationToAccountId: asset_hub_westend_runtime::xcm_config::LocationToAccountId, + System: asset_hub_westend_runtime::System, + Balances: asset_hub_westend_runtime::Balances, + ParachainSystem: asset_hub_westend_runtime::ParachainSystem, + ParachainInfo: asset_hub_westend_runtime::ParachainInfo, + }, + pallets_extra = { + PolkadotXcm: asset_hub_westend_runtime::PolkadotXcm, + Assets: asset_hub_westend_runtime::Assets, + ForeignAssets: asset_hub_westend_runtime::ForeignAssets, + } + }, // Polkadot pub struct AssetHubPolkadot { genesis = asset_hub_polkadot::genesis(), @@ -98,6 +143,28 @@ decl_test_parachains! { Assets: penpal_runtime::Assets, } }, + pub struct PenpalWestend { + genesis = penpal::genesis(penpal::PARA_ID), + on_init = (), + runtime = { + Runtime: penpal_runtime::Runtime, + RuntimeOrigin: penpal_runtime::RuntimeOrigin, + RuntimeCall: penpal_runtime::RuntimeCall, + RuntimeEvent: penpal_runtime::RuntimeEvent, + XcmpMessageHandler: penpal_runtime::XcmpQueue, + DmpMessageHandler: penpal_runtime::DmpQueue, + LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId, + System: penpal_runtime::System, + Balances: penpal_runtime::Balances, + ParachainSystem: penpal_runtime::ParachainSystem, + ParachainInfo: penpal_runtime::ParachainInfo, + }, + pallets_extra = { + PolkadotXcm: penpal_runtime::PolkadotXcm, + Assets: penpal_runtime::Assets, + } + }, + // Kusama pub struct AssetHubKusama { genesis = asset_hub_kusama::genesis(), @@ -221,6 +288,13 @@ decl_test_networks! { PenpalKusama, BHKusama, ], + }, + pub struct WestendMockNet { + relay_chain = Westend, + parachains = vec![ + AssetHubWestend, + PenpalWestend, + ], } } @@ -231,6 +305,12 @@ parameter_types! { // Kusama pub KusamaSender: AccountId = Kusama::account_id_of(ALICE); pub KusamaReceiver: AccountId = Kusama::account_id_of(BOB); + // Westend + pub WestendSender: AccountId = Westend::account_id_of(ALICE); + pub WestendReceiver: AccountId = Westend::account_id_of(BOB); + // Asset Hub Westend + pub AssetHubWestendSender: AccountId = AssetHubWestend::account_id_of(ALICE); + pub AssetHubWestendReceiver: AccountId = AssetHubWestend::account_id_of(BOB); // Asset Hub Polkadot pub AssetHubPolkadotSender: AccountId = AssetHubPolkadot::account_id_of(ALICE); pub AssetHubPolkadotReceiver: AccountId = AssetHubPolkadot::account_id_of(BOB); @@ -243,6 +323,9 @@ parameter_types! { // Penpal Kusama pub PenpalKusamaSender: AccountId = PenpalKusama::account_id_of(ALICE); pub PenpalKusamaReceiver: AccountId = PenpalKusama::account_id_of(BOB); + // Penpal Westend + pub PenpalWestendSender: AccountId = PenpalWestend::account_id_of(ALICE); + pub PenpalWestendReceiver: AccountId = PenpalWestend::account_id_of(BOB); // Collectives pub CollectivesSender: AccountId = Collectives::account_id_of(ALICE); pub CollectivesReceiver: AccountId = Collectives::account_id_of(BOB); diff --git a/xcm/xcm-emulator/src/lib.rs b/xcm/xcm-emulator/src/lib.rs index a31d7c5b7e5..03838d29092 100644 --- a/xcm/xcm-emulator/src/lib.rs +++ b/xcm/xcm-emulator/src/lib.rs @@ -195,6 +195,7 @@ pub trait Parachain: XcmpMessageHandler + DmpMessageHandler { macro_rules! decl_test_relay_chains { ( $( + #[api_version($api_version:tt)] pub struct $name:ident { genesis = $genesis:expr, on_init = $on_init:expr, @@ -280,7 +281,7 @@ macro_rules! decl_test_relay_chains { } } - $crate::__impl_test_ext_for_relay_chain!($name, $genesis, $on_init); + $crate::__impl_test_ext_for_relay_chain!($name, $genesis, $on_init, $api_version); )+ }; } @@ -288,13 +289,13 @@ macro_rules! decl_test_relay_chains { #[macro_export] macro_rules! __impl_test_ext_for_relay_chain { // entry point: generate ext name - ($name:ident, $genesis:expr, $on_init:expr) => { + ($name:ident, $genesis:expr, $on_init:expr, $api_version:tt) => { $crate::paste::paste! { - $crate::__impl_test_ext_for_relay_chain!(@impl $name, $genesis, $on_init, []); + $crate::__impl_test_ext_for_relay_chain!(@impl $name, $genesis, $on_init, [], []); } }; // impl - (@impl $name:ident, $genesis:expr, $on_init:expr, $ext_name:ident) => { + (@impl $name:ident, $genesis:expr, $on_init:expr, $api_version:ident, $ext_name:ident) => { thread_local! { pub static $ext_name: $crate::RefCell<$crate::sp_io::TestExternalities> = $crate::RefCell::new(<$name>::build_new_ext($genesis)); @@ -330,7 +331,7 @@ macro_rules! __impl_test_ext_for_relay_chain { // send messages if needed $ext_name.with(|v| { v.borrow_mut().execute_with(|| { - use $crate::polkadot_primitives::runtime_api::runtime_decl_for_parachain_host::ParachainHostV4; + use $crate::polkadot_primitives::runtime_api::runtime_decl_for_parachain_host::$api_version; //TODO: mark sent count & filter out sent msg for para_id in <$name>::para_ids() { From e42795bd20d80b825fa5afa7b348b487c324d37d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 20:37:27 +0100 Subject: [PATCH 268/339] Bump clap from 4.3.0 to 4.3.1 (#2682) Bumps [clap](https://github.com/clap-rs/clap) from 4.3.0 to 4.3.1. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.3.0...clap_complete-v4.3.1) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 12 ++++++------ client/cli/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fa6a016eaae..dab5dd84716 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1815,9 +1815,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.0" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93aae7a4192245f70fe75dd9157fc7b4a5bf53e88d30bd4396f7d8f9284d5acc" +checksum = "b4ed2379f8603fa2b7509891660e802b88c70a79a6427a70abb5968054de2c28" dependencies = [ "clap_builder", "clap_derive", @@ -1826,9 +1826,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.0" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f423e341edefb78c9caba2d9c7f7687d0e72e89df3ce3394554754393ac3990" +checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" dependencies = [ "anstream", "anstyle 1.0.0", @@ -1839,9 +1839,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.3.0" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "191d9573962933b4027f932c600cd252ce27a8ad5979418fe78e43c07996f27b" +checksum = "59e9ef9a08ee1c0e1f2e162121665ac45ac3783b0f897db7244ae75ad9a8f65b" dependencies = [ "heck", "proc-macro2", diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 6ba04507266..747de1b1f4c 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -clap = { version = "4.3.0", features = ["derive"] } +clap = { version = "4.3.1", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.3.1" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index 7eef77704b3..fb3d619335a 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" build = "build.rs" [dependencies] -clap = { version = "4.3.0", features = ["derive"] } +clap = { version = "4.3.1", features = ["derive"] } log = "0.4.18" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.163", features = ["derive"] } diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 88eaef87cb6..9ee20c8beb5 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -12,7 +12,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.3.0", features = ["derive"] } +clap = { version = "4.3.1", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index b67020297b6..b0141ec96cc 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -10,7 +10,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.3.0", features = ["derive"] } +clap = { version = "4.3.1", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } From 7b6c3db3fc0458604a23879b019dabb50badbdc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sun, 4 Jun 2023 08:58:25 +0100 Subject: [PATCH 269/339] Update Substrate & Polkadot (#2687) This should hopefully fix companions checks in Substrate. --- Cargo.lock | 531 ++++++++++++++++++++++++++--------------------------- 1 file changed, 264 insertions(+), 267 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dab5dd84716..514c0015735 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -864,7 +864,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "hash-db", "log", @@ -4104,7 +4104,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", ] @@ -4127,7 +4127,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-support-procedural", @@ -4152,7 +4152,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -4199,7 +4199,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4210,7 +4210,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -4227,7 +4227,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-system", @@ -4256,7 +4256,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-recursion", "futures", @@ -4277,7 +4277,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "bitflags", "environmental", @@ -4312,7 +4312,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "Inflector", "cfg-expr", @@ -4329,7 +4329,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4341,7 +4341,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "proc-macro2", "quote", @@ -4351,7 +4351,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "cfg-if", "frame-support", @@ -4370,7 +4370,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4385,7 +4385,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "sp-api", @@ -4394,7 +4394,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "parity-scale-codec", @@ -5484,7 +5484,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bitvec", "frame-benchmarking", @@ -5583,7 +5583,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "frame-support", "polkadot-primitives", @@ -6512,7 +6512,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "futures", "log", @@ -6531,7 +6531,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "anyhow", "jsonrpsee", @@ -7035,7 +7035,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -7056,7 +7056,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7074,7 +7074,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7089,7 +7089,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-system", @@ -7105,7 +7105,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-system", @@ -7121,7 +7121,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-system", @@ -7135,7 +7135,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7159,7 +7159,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7179,7 +7179,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7194,7 +7194,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-system", @@ -7213,7 +7213,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -7237,7 +7237,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7343,7 +7343,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7387,7 +7387,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7404,7 +7404,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "bitflags", "environmental", @@ -7433,8 +7433,8 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" -version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +version = "24.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "bitflags", "parity-scale-codec", @@ -7447,7 +7447,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "proc-macro2", "quote", @@ -7457,7 +7457,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7474,7 +7474,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7492,7 +7492,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7515,7 +7515,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7528,7 +7528,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7546,7 +7546,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "docify", "frame-benchmarking", @@ -7565,7 +7565,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "blake2", "frame-benchmarking", @@ -7583,7 +7583,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7606,7 +7606,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7622,7 +7622,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7642,7 +7642,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7659,7 +7659,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-system", @@ -7673,7 +7673,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7690,7 +7690,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7709,7 +7709,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7726,7 +7726,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7742,7 +7742,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7759,7 +7759,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7777,7 +7777,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "pallet-nfts", @@ -7788,7 +7788,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7804,7 +7804,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-system", @@ -7821,7 +7821,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7841,7 +7841,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7852,7 +7852,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-system", @@ -7869,7 +7869,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7908,7 +7908,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7925,7 +7925,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7940,7 +7940,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7958,7 +7958,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -7973,7 +7973,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7992,7 +7992,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8009,7 +8009,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-system", @@ -8030,7 +8030,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8046,7 +8046,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-system", @@ -8060,7 +8060,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8083,7 +8083,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8094,7 +8094,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "log", "sp-arithmetic", @@ -8103,7 +8103,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "sp-api", @@ -8112,7 +8112,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8129,7 +8129,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8144,7 +8144,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8162,7 +8162,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8181,7 +8181,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-support", "frame-system", @@ -8197,7 +8197,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -8213,7 +8213,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -8225,7 +8225,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8242,7 +8242,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8257,7 +8257,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8273,7 +8273,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8288,7 +8288,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-benchmarking", "frame-support", @@ -8303,7 +8303,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -8324,7 +8324,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8935,7 +8935,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8951,7 +8951,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8965,7 +8965,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "derive_more", "fatality", @@ -8988,7 +8988,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "fatality", "futures", @@ -9009,7 +9009,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "clap", "frame-benchmarking-cli", @@ -9039,7 +9039,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "async-trait", "frame-benchmarking", @@ -9082,7 +9082,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "always-assert", "bitvec", @@ -9104,7 +9104,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "parity-scale-codec", "scale-info", @@ -9116,7 +9116,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "derive_more", "fatality", @@ -9141,7 +9141,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -9155,7 +9155,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "futures", "futures-timer", @@ -9175,7 +9175,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "always-assert", "async-trait", @@ -9198,7 +9198,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "futures", "parity-scale-codec", @@ -9216,7 +9216,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bitvec", "derive_more", @@ -9245,7 +9245,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bitvec", "futures", @@ -9266,7 +9266,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bitvec", "fatality", @@ -9285,7 +9285,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "futures", "polkadot-node-subsystem", @@ -9300,7 +9300,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "async-trait", "futures", @@ -9320,7 +9320,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "futures", "polkadot-node-metrics", @@ -9335,7 +9335,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "futures", "futures-timer", @@ -9352,7 +9352,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "fatality", "futures", @@ -9371,7 +9371,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "async-trait", "futures", @@ -9388,7 +9388,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bitvec", "fatality", @@ -9406,7 +9406,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "always-assert", "futures", @@ -9437,7 +9437,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "futures", "polkadot-node-primitives", @@ -9453,7 +9453,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "cpu-time", "futures", @@ -9461,9 +9461,12 @@ dependencies = [ "parity-scale-codec", "polkadot-parachain", "polkadot-primitives", + "sc-executor", "sc-executor-common", "sc-executor-wasmtime", "sp-core", + "sp-externalities", + "sp-io", "sp-tracing", "substrate-build-script-utils", "tokio", @@ -9473,7 +9476,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-execute-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "cpu-time", "futures", @@ -9482,12 +9485,7 @@ dependencies = [ "polkadot-parachain", "polkadot-primitives", "rayon", - "sc-executor", - "sc-executor-common", - "sc-executor-wasmtime", "sp-core", - "sp-externalities", - "sp-io", "sp-maybe-compressed-blob", "sp-tracing", "tikv-jemalloc-ctl", @@ -9498,7 +9496,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-prepare-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "futures", "libc", @@ -9521,7 +9519,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "futures", "lru 0.9.0", @@ -9536,7 +9534,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "lazy_static", "log", @@ -9554,7 +9552,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bs58", "futures", @@ -9573,7 +9571,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "async-channel", "async-trait", @@ -9596,7 +9594,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bounded-vec", "futures", @@ -9618,7 +9616,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9628,7 +9626,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "async-trait", "futures", @@ -9646,7 +9644,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "async-trait", "derive_more", @@ -9669,7 +9667,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "async-trait", "derive_more", @@ -9702,7 +9700,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "async-trait", "futures", @@ -9725,7 +9723,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bounded-collections", "derive_more", @@ -9824,7 +9822,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9842,7 +9840,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9868,7 +9866,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9900,7 +9898,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bitvec", "frame-benchmarking", @@ -9995,7 +9993,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bitvec", "frame-benchmarking", @@ -10041,7 +10039,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "frame-support", "polkadot-primitives", @@ -10055,7 +10053,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bs58", "parity-scale-codec", @@ -10067,7 +10065,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bitflags", "bitvec", @@ -10112,7 +10110,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -10222,7 +10220,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -10243,7 +10241,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -10253,7 +10251,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -10278,7 +10276,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bitvec", "frame-election-provider-support", @@ -10339,7 +10337,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "frame-benchmarking", "frame-system", @@ -11119,7 +11117,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -11206,7 +11204,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "frame-support", "polkadot-primitives", @@ -11453,7 +11451,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "log", "sp-core", @@ -11464,7 +11462,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "futures", @@ -11493,7 +11491,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "futures", "futures-timer", @@ -11516,7 +11514,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11531,7 +11529,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11550,7 +11548,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11561,7 +11559,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11601,7 +11599,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "fnv", "futures", @@ -11628,7 +11626,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "hash-db", "kvdb", @@ -11654,7 +11652,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "futures", @@ -11679,7 +11677,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "futures", @@ -11708,7 +11706,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "fork-tree", @@ -11744,7 +11742,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "futures", "jsonrpsee", @@ -11766,7 +11764,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11802,7 +11800,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "futures", "jsonrpsee", @@ -11821,7 +11819,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11834,7 +11832,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11874,7 +11872,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "finality-grandpa", "futures", @@ -11894,7 +11892,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "futures", @@ -11917,7 +11915,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "lru 0.10.0", "parity-scale-codec", @@ -11939,7 +11937,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11951,7 +11949,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "anyhow", "cfg-if", @@ -11969,7 +11967,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "ansi_term", "futures", @@ -11985,7 +11983,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11999,7 +11997,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12045,7 +12043,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-channel", "cid", @@ -12066,7 +12064,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12093,7 +12091,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "ahash 0.8.2", "futures", @@ -12111,7 +12109,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12133,7 +12131,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12167,7 +12165,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12185,7 +12183,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -12215,7 +12213,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -12224,7 +12222,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "futures", "jsonrpsee", @@ -12255,7 +12253,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12274,7 +12272,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "http", "jsonrpsee", @@ -12289,7 +12287,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12315,7 +12313,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "directories", @@ -12381,7 +12379,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "log", "parity-scale-codec", @@ -12392,7 +12390,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "clap", "fs4", @@ -12408,7 +12406,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12427,7 +12425,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "futures", "libc", @@ -12446,7 +12444,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "chrono", "futures", @@ -12465,7 +12463,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "ansi_term", "atty", @@ -12496,7 +12494,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12507,14 +12505,13 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "futures", "futures-timer", "linked-hash-map", "log", - "num-traits", "parity-scale-codec", "parking_lot 0.12.1", "sc-client-api", @@ -12534,7 +12531,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "futures", @@ -12550,7 +12547,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-channel", "futures", @@ -13031,7 +13028,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "enumn", "parity-scale-codec", @@ -13108,7 +13105,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "hash-db", "log", @@ -13128,7 +13125,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "Inflector", "blake2", @@ -13142,7 +13139,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "scale-info", @@ -13155,7 +13152,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "16.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "integer-sqrt", "num-traits", @@ -13169,7 +13166,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "scale-info", @@ -13182,7 +13179,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "sp-api", @@ -13194,7 +13191,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "futures", "log", @@ -13212,7 +13209,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "futures", @@ -13227,7 +13224,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "parity-scale-codec", @@ -13245,7 +13242,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "parity-scale-codec", @@ -13266,7 +13263,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "lazy_static", "parity-scale-codec", @@ -13285,7 +13282,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "finality-grandpa", "log", @@ -13303,7 +13300,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "scale-info", @@ -13315,7 +13312,7 @@ dependencies = [ [[package]] name = "sp-core" version = "21.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13359,7 +13356,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "blake2b_simd", "byteorder", @@ -13373,7 +13370,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "proc-macro2", "quote", @@ -13384,7 +13381,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13393,7 +13390,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "proc-macro2", "quote", @@ -13403,7 +13400,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.19.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "environmental", "parity-scale-codec", @@ -13414,7 +13411,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13429,7 +13426,7 @@ dependencies = [ [[package]] name = "sp-io" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "bytes", "ed25519", @@ -13455,7 +13452,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "lazy_static", "sp-core", @@ -13466,7 +13463,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.27.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "futures", "parity-scale-codec", @@ -13480,7 +13477,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13489,7 +13486,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13500,7 +13497,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13518,7 +13515,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "scale-info", @@ -13532,7 +13529,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "sp-api", "sp-core", @@ -13542,7 +13539,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "backtrace", "lazy_static", @@ -13552,7 +13549,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "rustc-hash", "serde", @@ -13562,7 +13559,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "either", "hash256-std-hasher", @@ -13584,7 +13581,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "17.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13602,7 +13599,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "11.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "Inflector", "proc-macro-crate", @@ -13614,7 +13611,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "scale-info", @@ -13628,7 +13625,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "scale-info", @@ -13641,7 +13638,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.28.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "hash-db", "log", @@ -13661,7 +13658,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "log", "parity-scale-codec", @@ -13679,12 +13676,12 @@ dependencies = [ [[package]] name = "sp-std" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" [[package]] name = "sp-storage" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13697,7 +13694,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "futures-timer", @@ -13712,7 +13709,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "10.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "sp-std", @@ -13724,7 +13721,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "sp-api", "sp-runtime", @@ -13733,7 +13730,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "log", @@ -13749,7 +13746,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13772,7 +13769,7 @@ dependencies = [ [[package]] name = "sp-version" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13789,7 +13786,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13800,7 +13797,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "14.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13813,7 +13810,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "20.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "parity-scale-codec", "scale-info", @@ -14011,7 +14008,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "platforms", ] @@ -14019,7 +14016,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -14038,7 +14035,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "hyper", "log", @@ -14050,7 +14047,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "jsonrpsee", @@ -14063,7 +14060,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "jsonrpsee", "log", @@ -14082,7 +14079,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -14108,7 +14105,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -14118,7 +14115,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -14129,7 +14126,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "ansi_term", "build-helper", @@ -14257,7 +14254,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "frame-support", "polkadot-primitives", @@ -14648,7 +14645,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14659,7 +14656,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14789,7 +14786,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#f50c501411d2e453eb5d10d5e8ee73194d7f7340" +source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" dependencies = [ "async-trait", "clap", @@ -15704,7 +15701,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bitvec", "frame-benchmarking", @@ -15797,7 +15794,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "frame-support", "polkadot-primitives", @@ -16231,7 +16228,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "bounded-collections", "derivative", @@ -16247,7 +16244,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "frame-support", "frame-system", @@ -16302,7 +16299,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "environmental", "frame-benchmarking", @@ -16322,7 +16319,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#48982ae84d803fdaf85ae717622bad75c4cf4121" +source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" dependencies = [ "Inflector", "proc-macro2", From 58454da4554de107f353288e3f7c19df1fc173ea Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 5 Jun 2023 12:40:33 +0100 Subject: [PATCH 270/339] Companion for #7329: XCM: Remove & replace Polkadot's Convert trait (#2688) * Fixups for new Convert APIs * update lockfile for {"polkadot", "substrate"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 521 +++++++++--------- .../emulated/common/src/lib.rs | 2 +- .../assets/asset-hub-kusama/tests/tests.rs | 36 +- .../assets/asset-hub-polkadot/tests/tests.rs | 36 +- .../assets/asset-hub-westend/tests/tests.rs | 36 +- parachains/runtimes/assets/common/Cargo.toml | 2 + .../assets/common/src/foreign_creators.rs | 10 +- .../assets/common/src/fungible_conversion.rs | 39 +- parachains/runtimes/assets/common/src/lib.rs | 11 +- .../assets/test-utils/src/test_cases.rs | 24 +- xcm/xcm-emulator/src/lib.rs | 4 +- 11 files changed, 394 insertions(+), 327 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 514c0015735..d38e95464c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -697,6 +697,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-api", + "sp-runtime", "sp-std", "substrate-wasm-builder", "xcm", @@ -864,7 +865,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "hash-db", "log", @@ -4104,7 +4105,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", ] @@ -4127,7 +4128,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-support-procedural", @@ -4152,7 +4153,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -4199,7 +4200,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4210,7 +4211,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -4227,7 +4228,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-system", @@ -4256,7 +4257,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-recursion", "futures", @@ -4277,7 +4278,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "bitflags", "environmental", @@ -4312,7 +4313,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "Inflector", "cfg-expr", @@ -4329,7 +4330,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4341,7 +4342,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "proc-macro2", "quote", @@ -4351,7 +4352,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "cfg-if", "frame-support", @@ -4370,7 +4371,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -4385,7 +4386,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "sp-api", @@ -4394,7 +4395,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "parity-scale-codec", @@ -5484,7 +5485,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bitvec", "frame-benchmarking", @@ -5583,7 +5584,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "frame-support", "polkadot-primitives", @@ -6512,7 +6513,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "futures", "log", @@ -6531,7 +6532,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "anyhow", "jsonrpsee", @@ -7035,7 +7036,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -7056,7 +7057,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7074,7 +7075,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7089,7 +7090,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-system", @@ -7105,7 +7106,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-system", @@ -7121,7 +7122,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-system", @@ -7135,7 +7136,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7159,7 +7160,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7179,7 +7180,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7194,7 +7195,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-system", @@ -7213,7 +7214,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -7237,7 +7238,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7343,7 +7344,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7387,7 +7388,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7404,7 +7405,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "bitflags", "environmental", @@ -7434,7 +7435,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "bitflags", "parity-scale-codec", @@ -7447,7 +7448,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "proc-macro2", "quote", @@ -7457,7 +7458,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7474,7 +7475,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7492,7 +7493,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7515,7 +7516,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7528,7 +7529,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7546,7 +7547,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "docify", "frame-benchmarking", @@ -7565,7 +7566,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "blake2", "frame-benchmarking", @@ -7583,7 +7584,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7606,7 +7607,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7622,7 +7623,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7642,7 +7643,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7659,7 +7660,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-system", @@ -7673,7 +7674,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7690,7 +7691,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7709,7 +7710,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7726,7 +7727,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7742,7 +7743,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7759,7 +7760,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7777,7 +7778,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "pallet-nfts", @@ -7788,7 +7789,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7804,7 +7805,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-system", @@ -7821,7 +7822,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7841,7 +7842,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7852,7 +7853,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-system", @@ -7869,7 +7870,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7908,7 +7909,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7925,7 +7926,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7940,7 +7941,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7958,7 +7959,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -7973,7 +7974,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7992,7 +7993,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -8009,7 +8010,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-system", @@ -8030,7 +8031,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -8046,7 +8047,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-system", @@ -8060,7 +8061,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8083,7 +8084,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8094,7 +8095,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "log", "sp-arithmetic", @@ -8103,7 +8104,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "sp-api", @@ -8112,7 +8113,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -8129,7 +8130,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -8144,7 +8145,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -8162,7 +8163,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -8181,7 +8182,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-support", "frame-system", @@ -8197,7 +8198,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -8213,7 +8214,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -8225,7 +8226,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -8242,7 +8243,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -8257,7 +8258,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -8273,7 +8274,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -8288,7 +8289,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-benchmarking", "frame-support", @@ -8303,7 +8304,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -8324,7 +8325,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "frame-benchmarking", "frame-support", @@ -8935,7 +8936,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "futures", "polkadot-node-jaeger", @@ -8951,7 +8952,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -8965,7 +8966,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "derive_more", "fatality", @@ -8988,7 +8989,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "fatality", "futures", @@ -9009,7 +9010,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "clap", "frame-benchmarking-cli", @@ -9039,7 +9040,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "async-trait", "frame-benchmarking", @@ -9082,7 +9083,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "always-assert", "bitvec", @@ -9104,7 +9105,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "parity-scale-codec", "scale-info", @@ -9116,7 +9117,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "derive_more", "fatality", @@ -9141,7 +9142,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -9155,7 +9156,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "futures", "futures-timer", @@ -9175,7 +9176,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "always-assert", "async-trait", @@ -9198,7 +9199,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "futures", "parity-scale-codec", @@ -9216,7 +9217,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bitvec", "derive_more", @@ -9245,7 +9246,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bitvec", "futures", @@ -9266,7 +9267,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bitvec", "fatality", @@ -9285,7 +9286,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "futures", "polkadot-node-subsystem", @@ -9300,7 +9301,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "async-trait", "futures", @@ -9320,7 +9321,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "futures", "polkadot-node-metrics", @@ -9335,7 +9336,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "futures", "futures-timer", @@ -9352,7 +9353,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "fatality", "futures", @@ -9371,7 +9372,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "async-trait", "futures", @@ -9388,7 +9389,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bitvec", "fatality", @@ -9406,7 +9407,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "always-assert", "futures", @@ -9437,7 +9438,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "futures", "polkadot-node-primitives", @@ -9453,7 +9454,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "cpu-time", "futures", @@ -9476,7 +9477,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-execute-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "cpu-time", "futures", @@ -9496,7 +9497,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-prepare-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "futures", "libc", @@ -9519,7 +9520,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "futures", "lru 0.9.0", @@ -9534,7 +9535,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "lazy_static", "log", @@ -9552,7 +9553,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bs58", "futures", @@ -9571,7 +9572,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "async-channel", "async-trait", @@ -9594,7 +9595,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bounded-vec", "futures", @@ -9616,7 +9617,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9626,7 +9627,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "async-trait", "futures", @@ -9644,7 +9645,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "async-trait", "derive_more", @@ -9667,7 +9668,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "async-trait", "derive_more", @@ -9700,7 +9701,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "async-trait", "futures", @@ -9723,7 +9724,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bounded-collections", "derive_more", @@ -9822,7 +9823,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9840,7 +9841,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9866,7 +9867,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9898,7 +9899,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bitvec", "frame-benchmarking", @@ -9993,7 +9994,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bitvec", "frame-benchmarking", @@ -10039,7 +10040,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "frame-support", "polkadot-primitives", @@ -10053,7 +10054,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bs58", "parity-scale-codec", @@ -10065,7 +10066,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bitflags", "bitvec", @@ -10110,7 +10111,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -10220,7 +10221,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -10241,7 +10242,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -10251,7 +10252,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -10276,7 +10277,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bitvec", "frame-election-provider-support", @@ -10337,7 +10338,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "frame-benchmarking", "frame-system", @@ -11117,7 +11118,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -11204,7 +11205,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "frame-support", "polkadot-primitives", @@ -11451,7 +11452,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "log", "sp-core", @@ -11462,7 +11463,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "futures", @@ -11491,7 +11492,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "futures", "futures-timer", @@ -11514,7 +11515,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11529,7 +11530,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11548,7 +11549,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11559,7 +11560,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11599,7 +11600,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "fnv", "futures", @@ -11626,7 +11627,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "hash-db", "kvdb", @@ -11652,7 +11653,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "futures", @@ -11677,7 +11678,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "futures", @@ -11706,7 +11707,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "fork-tree", @@ -11742,7 +11743,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "futures", "jsonrpsee", @@ -11764,7 +11765,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11800,7 +11801,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "futures", "jsonrpsee", @@ -11819,7 +11820,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11832,7 +11833,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11872,7 +11873,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "finality-grandpa", "futures", @@ -11892,7 +11893,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "futures", @@ -11915,7 +11916,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "lru 0.10.0", "parity-scale-codec", @@ -11937,7 +11938,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11949,7 +11950,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "anyhow", "cfg-if", @@ -11967,7 +11968,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "ansi_term", "futures", @@ -11983,7 +11984,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -11997,7 +11998,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12043,7 +12044,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-channel", "cid", @@ -12064,7 +12065,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12091,7 +12092,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "ahash 0.8.2", "futures", @@ -12109,7 +12110,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12131,7 +12132,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12165,7 +12166,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12183,7 +12184,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -12213,7 +12214,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -12222,7 +12223,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "futures", "jsonrpsee", @@ -12253,7 +12254,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12272,7 +12273,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "http", "jsonrpsee", @@ -12287,7 +12288,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12313,7 +12314,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "directories", @@ -12379,7 +12380,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "log", "parity-scale-codec", @@ -12390,7 +12391,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "clap", "fs4", @@ -12406,7 +12407,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12425,7 +12426,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "futures", "libc", @@ -12444,7 +12445,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "chrono", "futures", @@ -12463,7 +12464,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "ansi_term", "atty", @@ -12494,7 +12495,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12505,7 +12506,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "futures", @@ -12531,7 +12532,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "futures", @@ -12547,7 +12548,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-channel", "futures", @@ -13028,7 +13029,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "enumn", "parity-scale-codec", @@ -13105,7 +13106,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "hash-db", "log", @@ -13125,7 +13126,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "Inflector", "blake2", @@ -13139,7 +13140,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "scale-info", @@ -13152,7 +13153,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "16.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "integer-sqrt", "num-traits", @@ -13166,7 +13167,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "scale-info", @@ -13179,7 +13180,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "sp-api", @@ -13191,7 +13192,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "futures", "log", @@ -13209,7 +13210,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "futures", @@ -13224,7 +13225,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "parity-scale-codec", @@ -13242,7 +13243,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "parity-scale-codec", @@ -13263,7 +13264,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "lazy_static", "parity-scale-codec", @@ -13282,7 +13283,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "finality-grandpa", "log", @@ -13300,7 +13301,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "scale-info", @@ -13312,7 +13313,7 @@ dependencies = [ [[package]] name = "sp-core" version = "21.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13356,7 +13357,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "blake2b_simd", "byteorder", @@ -13370,7 +13371,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "proc-macro2", "quote", @@ -13381,7 +13382,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13390,7 +13391,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "proc-macro2", "quote", @@ -13400,7 +13401,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.19.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "environmental", "parity-scale-codec", @@ -13411,7 +13412,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13426,7 +13427,7 @@ dependencies = [ [[package]] name = "sp-io" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "bytes", "ed25519", @@ -13452,7 +13453,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "lazy_static", "sp-core", @@ -13463,7 +13464,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.27.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "futures", "parity-scale-codec", @@ -13477,7 +13478,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13486,7 +13487,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13497,7 +13498,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13515,7 +13516,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "scale-info", @@ -13529,7 +13530,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "sp-api", "sp-core", @@ -13539,7 +13540,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "backtrace", "lazy_static", @@ -13549,7 +13550,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "rustc-hash", "serde", @@ -13559,7 +13560,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "either", "hash256-std-hasher", @@ -13581,7 +13582,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "17.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13599,7 +13600,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "11.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "Inflector", "proc-macro-crate", @@ -13611,7 +13612,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "scale-info", @@ -13625,7 +13626,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "scale-info", @@ -13638,7 +13639,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.28.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "hash-db", "log", @@ -13658,7 +13659,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "log", "parity-scale-codec", @@ -13676,12 +13677,12 @@ dependencies = [ [[package]] name = "sp-std" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" [[package]] name = "sp-storage" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13694,7 +13695,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "futures-timer", @@ -13709,7 +13710,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "10.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "sp-std", @@ -13721,7 +13722,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "sp-api", "sp-runtime", @@ -13730,7 +13731,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "log", @@ -13746,7 +13747,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13769,7 +13770,7 @@ dependencies = [ [[package]] name = "sp-version" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13786,7 +13787,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13797,7 +13798,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "14.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13810,7 +13811,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "20.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "parity-scale-codec", "scale-info", @@ -14008,7 +14009,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "platforms", ] @@ -14016,7 +14017,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -14035,7 +14036,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "hyper", "log", @@ -14047,7 +14048,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "jsonrpsee", @@ -14060,7 +14061,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "jsonrpsee", "log", @@ -14079,7 +14080,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -14105,7 +14106,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "futures", "substrate-test-utils-derive", @@ -14115,7 +14116,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -14126,7 +14127,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "ansi_term", "build-helper", @@ -14254,7 +14255,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "frame-support", "polkadot-primitives", @@ -14645,7 +14646,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14656,7 +14657,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14786,7 +14787,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#689da495a0c0c0c2466fe90a9ea187ce56760f2d" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" dependencies = [ "async-trait", "clap", @@ -15701,7 +15702,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bitvec", "frame-benchmarking", @@ -15794,7 +15795,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "frame-support", "polkadot-primitives", @@ -16228,7 +16229,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "bounded-collections", "derivative", @@ -16244,7 +16245,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "frame-support", "frame-system", @@ -16299,7 +16300,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "environmental", "frame-benchmarking", @@ -16319,7 +16320,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#d67d47f4bc330988dad0a97f5a537a4413ee90e7" +source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachains/integration-tests/emulated/common/src/lib.rs b/parachains/integration-tests/emulated/common/src/lib.rs index 39e4fbb453e..c793110a378 100644 --- a/parachains/integration-tests/emulated/common/src/lib.rs +++ b/parachains/integration-tests/emulated/common/src/lib.rs @@ -13,7 +13,7 @@ use xcm_emulator::{ decl_test_networks, decl_test_parachains, decl_test_relay_chains, Parachain, RelayChain, TestExt, }; -use xcm_executor::traits::Convert; +use xcm_executor::traits::ConvertLocation; decl_test_relay_chains! { #[api_version(5)] diff --git a/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs index 22d277c5d8c..21cec9bf56c 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs @@ -1,3 +1,22 @@ +// This file is part of Cumulus. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Tests for the Statemine (Kusama Assets Hub) chain. + use asset_hub_kusama_runtime::xcm_config::{ AssetFeeAsExistentialDepositMultiplierFeeCharger, KsmLocation, TrustBackedAssetsPalletLocation, }; @@ -17,8 +36,9 @@ use frame_support::{ weights::{Weight, WeightToFee as WeightToFeeT}, }; use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; +use sp_runtime::traits::MaybeEquivalence; use xcm::latest::prelude::*; -use xcm_executor::traits::{Convert, Identity, JustTry, WeightTrader}; +use xcm_executor::traits::{Identity, JustTry, WeightTrader}; const ALICE: [u8; 32] = [1u8; 32]; const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; @@ -66,7 +86,7 @@ fn test_asset_xcm_trader() { // get asset id as multilocation let asset_multilocation = - AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(); + AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(); // Set Alice as block author, who will receive fees RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); @@ -150,7 +170,7 @@ fn test_asset_xcm_trader_with_refund() { // We are going to buy 4e9 weight let bought = Weight::from_parts(4_000_000_000u64, 0); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); // lets calculate amount needed let amount_bought = WeightToFee::weight_to_fee(&bought); @@ -220,7 +240,7 @@ fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { // We are going to buy small amount let bought = Weight::from_parts(500_000_000u64, 0); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); let amount_bought = WeightToFee::weight_to_fee(&bought); @@ -271,7 +291,7 @@ fn test_that_buying_ed_refund_does_not_refund() { // We are gonna buy ED let bought = Weight::from_parts(ExistentialDeposit::get().try_into().unwrap(), 0); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); let amount_bought = WeightToFee::weight_to_fee(&bought); @@ -346,7 +366,7 @@ fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { // lets calculate amount needed let asset_amount_needed = WeightToFee::weight_to_fee(&bought); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); let asset: MultiAsset = (asset_multilocation, asset_amount_needed).into(); @@ -461,13 +481,13 @@ fn test_assets_balances_api_works() { ))); // check trusted asset assert!(result.inner().iter().any(|asset| asset.eq(&( - AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(), + AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(), minimum_asset_balance ) .into()))); // check foreign asset assert!(result.inner().iter().any(|asset| asset.eq(&( - Identity::reverse_ref(foreign_asset_id_multilocation).unwrap(), + Identity::convert_back(&foreign_asset_id_multilocation).unwrap(), 6 * foreign_asset_minimum_asset_balance ) .into()))); diff --git a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs index f78f53c5e6b..cdd61f26796 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs @@ -1,3 +1,22 @@ +// This file is part of Cumulus. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Tests for the Statemint (Polkadot Assets Hub) chain. + use asset_hub_polkadot_runtime::xcm_config::{ AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, DotLocation, ForeignCreatorsSovereignAccountOf, TrustBackedAssetsPalletLocation, XcmConfig, @@ -18,8 +37,9 @@ use frame_support::{ use parachains_common::{ AccountId, AssetHubPolkadotAuraId as AuraId, AssetIdForTrustBackedAssets, Balance, }; +use sp_runtime::traits::MaybeEquivalence; use xcm::latest::prelude::*; -use xcm_executor::traits::{Convert, Identity, JustTry, WeightTrader}; +use xcm_executor::traits::{Identity, JustTry, WeightTrader}; const ALICE: [u8; 32] = [1u8; 32]; const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; @@ -67,7 +87,7 @@ fn test_asset_xcm_trader() { // get asset id as multilocation let asset_multilocation = - AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(); + AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(); // Set Alice as block author, who will receive fees RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); @@ -157,7 +177,7 @@ fn test_asset_xcm_trader_with_refund() { // bit more of weight let bought = Weight::from_parts(400_000_000_000u64, 0); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); // lets calculate amount needed let amount_bought = WeightToFee::weight_to_fee(&bought); @@ -230,7 +250,7 @@ fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { // bit more of weight let bought = Weight::from_parts(50_000_000_000u64, 0); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); let amount_bought = WeightToFee::weight_to_fee(&bought); @@ -281,7 +301,7 @@ fn test_that_buying_ed_refund_does_not_refund() { // We are gonna buy ED let bought = Weight::from_parts(ExistentialDeposit::get().try_into().unwrap(), 0); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); let amount_bought = WeightToFee::weight_to_fee(&bought); @@ -359,7 +379,7 @@ fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { // lets calculate amount needed let asset_amount_needed = WeightToFee::weight_to_fee(&bought); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); let asset: MultiAsset = (asset_multilocation, asset_amount_needed).into(); @@ -474,13 +494,13 @@ fn test_assets_balances_api_works() { ))); // check trusted asset assert!(result.inner().iter().any(|asset| asset.eq(&( - AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(), + AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(), minimum_asset_balance ) .into()))); // check foreign asset assert!(result.inner().iter().any(|asset| asset.eq(&( - Identity::reverse_ref(foreign_asset_id_multilocation).unwrap(), + Identity::convert_back(&foreign_asset_id_multilocation).unwrap(), 6 * foreign_asset_minimum_asset_balance ) .into()))); diff --git a/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs b/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs index 87bfb4b699a..4cfed8fed08 100644 --- a/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs @@ -1,3 +1,22 @@ +// This file is part of Cumulus. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Tests for the Westmint (Westend Assets Hub) chain. + pub use asset_hub_westend_runtime::{ constants::fee::WeightToFee, xcm_config::{CheckingAccount, TrustBackedAssetsPalletLocation, XcmConfig}, @@ -20,10 +39,11 @@ use frame_support::{ weights::{Weight, WeightToFee as WeightToFeeT}, }; use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; +use sp_runtime::traits::MaybeEquivalence; use std::convert::Into; use xcm::{latest::prelude::*, VersionedXcm, MAX_XCM_DECODE_DEPTH}; use xcm_executor::{ - traits::{Convert, Identity, JustTry, WeightTrader}, + traits::{Identity, JustTry, WeightTrader}, XcmExecutor, }; @@ -73,7 +93,7 @@ fn test_asset_xcm_trader() { // get asset id as multilocation let asset_multilocation = - AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(); + AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(); // Set Alice as block author, who will receive fees RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); @@ -156,7 +176,7 @@ fn test_asset_xcm_trader_with_refund() { // We are going to buy 4e9 weight let bought = Weight::from_parts(4_000_000_000u64, 0); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); // lets calculate amount needed let amount_bought = WeightToFee::weight_to_fee(&bought); @@ -226,7 +246,7 @@ fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { // We are going to buy 5e9 weight let bought = Weight::from_parts(500_000_000u64, 0); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); let amount_bought = WeightToFee::weight_to_fee(&bought); @@ -276,7 +296,7 @@ fn test_that_buying_ed_refund_does_not_refund() { let bought = Weight::from_parts(500_000_000u64, 0); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); let amount_bought = WeightToFee::weight_to_fee(&bought); @@ -351,7 +371,7 @@ fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { // lets calculate amount needed let asset_amount_needed = WeightToFee::weight_to_fee(&bought); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::reverse_ref(1).unwrap(); + let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); let asset: MultiAsset = (asset_multilocation, asset_amount_needed).into(); @@ -466,13 +486,13 @@ fn test_assets_balances_api_works() { ))); // check trusted asset assert!(result.inner().iter().any(|asset| asset.eq(&( - AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(), + AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(), minimum_asset_balance ) .into()))); // check foreign asset assert!(result.inner().iter().any(|asset| asset.eq(&( - Identity::reverse_ref(foreign_asset_id_multilocation).unwrap(), + Identity::convert_back(&foreign_asset_id_multilocation).unwrap(), 6 * foreign_asset_minimum_asset_balance ) .into()))); diff --git a/parachains/runtimes/assets/common/Cargo.toml b/parachains/runtimes/assets/common/Cargo.toml index f8c459a922d..97965b1e2c2 100644 --- a/parachains/runtimes/assets/common/Cargo.toml +++ b/parachains/runtimes/assets/common/Cargo.toml @@ -14,6 +14,7 @@ log = { version = "0.4.18", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } # Polkadot pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } @@ -38,6 +39,7 @@ std = [ "cumulus-primitives-core/std", "sp-api/std", "sp-std/std", + "sp-runtime/std", "pallet-xcm/std", "xcm/std", "xcm-builder/std", diff --git a/parachains/runtimes/assets/common/src/foreign_creators.rs b/parachains/runtimes/assets/common/src/foreign_creators.rs index dbdf4301d66..00f336f9c68 100644 --- a/parachains/runtimes/assets/common/src/foreign_creators.rs +++ b/parachains/runtimes/assets/common/src/foreign_creators.rs @@ -18,16 +18,16 @@ use frame_support::traits::{ }; use pallet_xcm::{EnsureXcm, Origin as XcmOrigin}; use xcm::latest::MultiLocation; -use xcm_executor::traits::Convert; +use xcm_executor::traits::ConvertLocation; -// `EnsureOriginWithArg` impl for `CreateOrigin` that allows only XCM origins that are locations -// containing the class location. +/// `EnsureOriginWithArg` impl for `CreateOrigin` that allows only XCM origins that are locations +/// containing the class location. pub struct ForeignCreators( sp_std::marker::PhantomData<(IsForeign, AccountOf, AccountId)>, ); impl< IsForeign: ContainsPair, - AccountOf: Convert, + AccountOf: ConvertLocation, AccountId: Clone, RuntimeOrigin: From + OriginTrait + Clone, > EnsureOriginWithArg @@ -46,7 +46,7 @@ where if !IsForeign::contains(asset_location, &origin_location) { return Err(origin) } - AccountOf::convert(origin_location).map_err(|_| origin) + AccountOf::convert_location(&origin_location).ok_or(origin) } #[cfg(feature = "runtime-benchmarks")] diff --git a/parachains/runtimes/assets/common/src/fungible_conversion.rs b/parachains/runtimes/assets/common/src/fungible_conversion.rs index 8ffb44b086b..00f0c40d611 100644 --- a/parachains/runtimes/assets/common/src/fungible_conversion.rs +++ b/parachains/runtimes/assets/common/src/fungible_conversion.rs @@ -17,10 +17,11 @@ use crate::runtime_api::FungiblesAccessError; use frame_support::traits::Contains; +use sp_runtime::traits::MaybeEquivalence; use sp_std::{borrow::Borrow, vec::Vec}; use xcm::latest::{MultiAsset, MultiLocation}; use xcm_builder::{ConvertedConcreteId, MatchedConvertedConcreteId}; -use xcm_executor::traits::{Convert, MatchesFungibles}; +use xcm_executor::traits::MatchesFungibles; /// Converting any [`(AssetId, Balance)`] to [`MultiAsset`] pub trait MultiAssetConverter: @@ -28,8 +29,8 @@ pub trait MultiAssetConverter: where AssetId: Clone, Balance: Clone, - ConvertAssetId: Convert, - ConvertBalance: Convert, + ConvertAssetId: MaybeEquivalence, + ConvertBalance: MaybeEquivalence, { fn convert_ref( value: impl Borrow<(AssetId, Balance)>, @@ -39,8 +40,8 @@ where impl< AssetId: Clone, Balance: Clone, - ConvertAssetId: Convert, - ConvertBalance: Convert, + ConvertAssetId: MaybeEquivalence, + ConvertBalance: MaybeEquivalence, > MultiAssetConverter for ConvertedConcreteId { @@ -48,12 +49,12 @@ impl< value: impl Borrow<(AssetId, Balance)>, ) -> Result { let (asset_id, balance) = value.borrow(); - match ConvertAssetId::reverse_ref(asset_id) { - Ok(asset_id_as_multilocation) => match ConvertBalance::reverse_ref(balance) { - Ok(amount) => Ok((asset_id_as_multilocation, amount).into()), - Err(_) => Err(FungiblesAccessError::AmountToBalanceConversionFailed), + match ConvertAssetId::convert_back(asset_id) { + Some(asset_id_as_multilocation) => match ConvertBalance::convert_back(balance) { + Some(amount) => Ok((asset_id_as_multilocation, amount).into()), + None => Err(FungiblesAccessError::AmountToBalanceConversionFailed), }, - Err(_) => Err(FungiblesAccessError::AssetIdConversionFailed), + None => Err(FungiblesAccessError::AssetIdConversionFailed), } } } @@ -62,8 +63,8 @@ impl< AssetId: Clone, Balance: Clone, MatchAssetId: Contains, - ConvertAssetId: Convert, - ConvertBalance: Convert, + ConvertAssetId: MaybeEquivalence, + ConvertBalance: MaybeEquivalence, > MultiAssetConverter for MatchedConvertedConcreteId { @@ -71,12 +72,12 @@ impl< value: impl Borrow<(AssetId, Balance)>, ) -> Result { let (asset_id, balance) = value.borrow(); - match ConvertAssetId::reverse_ref(asset_id) { - Ok(asset_id_as_multilocation) => match ConvertBalance::reverse_ref(balance) { - Ok(amount) => Ok((asset_id_as_multilocation, amount).into()), - Err(_) => Err(FungiblesAccessError::AmountToBalanceConversionFailed), + match ConvertAssetId::convert_back(asset_id) { + Some(asset_id_as_multilocation) => match ConvertBalance::convert_back(balance) { + Some(amount) => Ok((asset_id_as_multilocation, amount).into()), + None => Err(FungiblesAccessError::AmountToBalanceConversionFailed), }, - Err(_) => Err(FungiblesAccessError::AssetIdConversionFailed), + None => Err(FungiblesAccessError::AssetIdConversionFailed), } } } @@ -88,8 +89,8 @@ pub fn convert<'a, AssetId, Balance, ConvertAssetId, ConvertBalance, Converter>( where AssetId: Clone + 'a, Balance: Clone + 'a, - ConvertAssetId: Convert, - ConvertBalance: Convert, + ConvertAssetId: MaybeEquivalence, + ConvertBalance: MaybeEquivalence, Converter: MultiAssetConverter, { items.map(Converter::convert_ref).collect() diff --git a/parachains/runtimes/assets/common/src/lib.rs b/parachains/runtimes/assets/common/src/lib.rs index 8a321ad97aa..bdd127c9143 100644 --- a/parachains/runtimes/assets/common/src/lib.rs +++ b/parachains/runtimes/assets/common/src/lib.rs @@ -80,8 +80,9 @@ pub type ForeignAssetsConvertedConcreteId::reverse_ref( - local_asset_id + AssetIdForTrustBackedAssetsConvert::::convert_back( + &local_asset_id ) .unwrap(), expected_reverse_ref ); assert_eq!( - AssetIdForTrustBackedAssetsConvert::::convert_ref( - expected_reverse_ref + AssetIdForTrustBackedAssetsConvert::::convert( + &expected_reverse_ref ) .unwrap(), local_asset_id diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 366c1922cda..162239a8d2a 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -27,11 +27,11 @@ use parachains_runtimes_test_utils::{ RuntimeHelper, ValidatorIdOf, XcmReceivedFrom, }; use sp_runtime::{ - traits::{StaticLookup, Zero}, + traits::{MaybeEquivalence, StaticLookup, Zero}, DispatchError, Saturating, }; use xcm::latest::prelude::*; -use xcm_executor::{traits::Convert, XcmExecutor}; +use xcm_executor::{traits::ConvertLocation, XcmExecutor}; /// Test-case makes sure that `Runtime` can receive native asset from relay chain /// and can teleport it back and to the other parachains @@ -308,7 +308,7 @@ pub fn teleports_for_foreign_assets_works< >, WeightToFee: frame_support::weights::WeightToFee, ::Balance: From + Into, - SovereignAccountOf: Convert>, + SovereignAccountOf: ConvertLocation>, >::AssetId: From + Into, >::AssetIdParameter: @@ -330,7 +330,8 @@ pub fn teleports_for_foreign_assets_works< // foreign creator, which can be sibling parachain to match ForeignCreators let foreign_creator = MultiLocation { parents: 1, interior: X1(Parachain(foreign_para_id)) }; - let foreign_creator_as_account_id = SovereignAccountOf::convert(foreign_creator).expect(""); + let foreign_creator_as_account_id = + SovereignAccountOf::convert_location(&foreign_creator).expect(""); // we want to buy execution with local relay chain currency let buy_execution_fee_amount = @@ -744,7 +745,7 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< From<::AccountId>, AssetsPalletInstance: 'static, AssetId: Clone + Copy, - AssetIdConverter: Convert, + AssetIdConverter: MaybeEquivalence, { ExtBuilder::::default() .with_collators(collator_session_keys.collators()) @@ -759,7 +760,7 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< .execute_with(|| { // create some asset class let asset_minimum_asset_balance = 3333333_u128; - let asset_id_as_multilocation = AssetIdConverter::reverse_ref(asset_id).unwrap(); + let asset_id_as_multilocation = AssetIdConverter::convert_back(&asset_id).unwrap(); assert_ok!(>::force_create( RuntimeHelper::::root_origin(), asset_id.into(), @@ -1002,7 +1003,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor XcmConfig: xcm_executor::Config, WeightToFee: frame_support::weights::WeightToFee, ::Balance: From + Into, - SovereignAccountOf: Convert>, + SovereignAccountOf: ConvertLocation>, >::AssetId: From + Into, >::AssetIdParameter: @@ -1015,16 +1016,17 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor From<::AccountId>, ForeignAssetsPalletInstance: 'static, AssetId: Clone + Copy, - AssetIdConverter: Convert, + AssetIdConverter: MaybeEquivalence, { // foreign parachain with the same consenus currency as asset let foreign_asset_id_multilocation = MultiLocation { parents: 1, interior: X2(Parachain(2222), GeneralIndex(1234567)) }; - let asset_id = AssetIdConverter::convert(foreign_asset_id_multilocation).unwrap(); + let asset_id = AssetIdConverter::convert(&foreign_asset_id_multilocation).unwrap(); // foreign creator, which can be sibling parachain to match ForeignCreators let foreign_creator = MultiLocation { parents: 1, interior: X1(Parachain(2222)) }; - let foreign_creator_as_account_id = SovereignAccountOf::convert(foreign_creator).expect(""); + let foreign_creator_as_account_id = + SovereignAccountOf::convert_location(&foreign_creator).expect(""); // we want to buy execution with local relay chain currency let buy_execution_fee_amount = @@ -1204,7 +1206,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor // lets try create asset for different parachain(3333) (foreign_creator(2222) can create just his assets) let foreign_asset_id_multilocation = MultiLocation { parents: 1, interior: X2(Parachain(3333), GeneralIndex(1234567)) }; - let asset_id = AssetIdConverter::convert(foreign_asset_id_multilocation).unwrap(); + let asset_id = AssetIdConverter::convert(&foreign_asset_id_multilocation).unwrap(); // prepare data for xcm::Transact(create) let foreign_asset_create = runtime_call_encode(pallet_assets::Call::< diff --git a/xcm/xcm-emulator/src/lib.rs b/xcm/xcm-emulator/src/lib.rs index 03838d29092..0a468e7fcaf 100644 --- a/xcm/xcm-emulator/src/lib.rs +++ b/xcm/xcm-emulator/src/lib.rs @@ -389,7 +389,7 @@ macro_rules! __impl_relay { } pub fn sovereign_account_id_of(location: $crate::MultiLocation) -> $crate::AccountId { - ::SovereignAccountOf::convert(location.into()).unwrap() + ::SovereignAccountOf::convert_location(&location).unwrap() } pub fn fund_accounts(accounts: Vec<(AccountId, Balance)>) { @@ -654,7 +654,7 @@ macro_rules! __impl_parachain { } pub fn sovereign_account_id_of(location: $crate::MultiLocation) -> $crate::AccountId { - ::LocationToAccountId::convert(location.into()).unwrap() + ::LocationToAccountId::convert_location(&location).unwrap() } pub fn fund_accounts(accounts: Vec<(AccountId, Balance)>) { From 1208a9d43f371db704ff985252bf4b113ea2bff0 Mon Sep 17 00:00:00 2001 From: PG Herveou Date: Mon, 5 Jun 2023 13:56:55 +0200 Subject: [PATCH 271/339] Contracts: Use RuntimeUpgrade hooks instead of Hooks::on_runtime_upgrade (#2570) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes * Remove on_runtime_upgrade hook * remove upgrade_fn / add doc to Migration struct * Add cumulus_pallet_*::migration to Migrations type * add docstring * fix * Update parachain-template/runtime/src/lib.rs Co-authored-by: Bastian Köcher * Update parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs * Update pallets/parachain-system/src/migration.rs --------- Co-authored-by: Bastian Köcher --- pallets/dmp-queue/src/lib.rs | 4 -- pallets/dmp-queue/src/migration.rs | 37 ++++++++++-------- pallets/parachain-system/src/lib.rs | 6 +-- pallets/parachain-system/src/migration.rs | 39 +++++++++++-------- pallets/xcmp-queue/src/lib.rs | 4 -- pallets/xcmp-queue/src/migration.rs | 37 ++++++++++-------- .../contracts/contracts-rococo/Cargo.toml | 1 + .../contracts/contracts-rococo/src/lib.rs | 7 ++++ .../contracts-rococo/src/xcm_config.rs | 1 + 9 files changed, 72 insertions(+), 64 deletions(-) diff --git a/pallets/dmp-queue/src/lib.rs b/pallets/dmp-queue/src/lib.rs index 66329007ec0..aaa9af7a6a9 100644 --- a/pallets/dmp-queue/src/lib.rs +++ b/pallets/dmp-queue/src/lib.rs @@ -139,10 +139,6 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { - fn on_runtime_upgrade() -> Weight { - migration::migrate_to_latest::() - } - fn on_idle(_now: T::BlockNumber, max_weight: Weight) -> Weight { // on_idle processes additional messages with any remaining block weight. Self::service_queue(max_weight) diff --git a/pallets/dmp-queue/src/migration.rs b/pallets/dmp-queue/src/migration.rs index 5e1d357e142..b2323f6a60f 100644 --- a/pallets/dmp-queue/src/migration.rs +++ b/pallets/dmp-queue/src/migration.rs @@ -19,31 +19,34 @@ use crate::{Config, Configuration, Overweight, Pallet, DEFAULT_POV_SIZE}; use frame_support::{ pallet_prelude::*, - traits::StorageVersion, + traits::{OnRuntimeUpgrade, StorageVersion}, weights::{constants::WEIGHT_REF_TIME_PER_MILLIS, Weight}, }; /// The current storage version. -pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); +pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); -/// Migrates the pallet storage to the most recent version, checking and setting the -/// `StorageVersion`. -pub fn migrate_to_latest() -> Weight { - let mut weight = T::DbWeight::get().reads(1); +/// Migrates the pallet storage to the most recent version. +pub struct Migration(PhantomData); - if StorageVersion::get::>() == 0 { - weight.saturating_accrue(migrate_to_v1::()); - StorageVersion::new(1).put::>(); - weight.saturating_accrue(T::DbWeight::get().writes(1)); - } +impl OnRuntimeUpgrade for Migration { + fn on_runtime_upgrade() -> Weight { + let mut weight = T::DbWeight::get().reads(1); - if StorageVersion::get::>() == 1 { - weight.saturating_accrue(migrate_to_v2::()); - StorageVersion::new(2).put::>(); - weight.saturating_accrue(T::DbWeight::get().writes(1)); - } + if StorageVersion::get::>() == 0 { + weight.saturating_accrue(migrate_to_v1::()); + StorageVersion::new(1).put::>(); + weight.saturating_accrue(T::DbWeight::get().writes(1)); + } - weight + if StorageVersion::get::>() == 1 { + weight.saturating_accrue(migrate_to_v2::()); + StorageVersion::new(2).put::>(); + weight.saturating_accrue(T::DbWeight::get().writes(1)); + } + + weight + } } mod v0 { diff --git a/pallets/parachain-system/src/lib.rs b/pallets/parachain-system/src/lib.rs index cbbfc92f60a..4ef1c511012 100644 --- a/pallets/parachain-system/src/lib.rs +++ b/pallets/parachain-system/src/lib.rs @@ -57,7 +57,7 @@ use sp_runtime::{ use sp_std::{cmp, collections::btree_map::BTreeMap, prelude::*}; use xcm::latest::XcmHash; -mod migration; +pub mod migration; mod relay_state_snapshot; #[macro_use] pub mod validate_block; @@ -197,10 +197,6 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { - fn on_runtime_upgrade() -> Weight { - migration::on_runtime_upgrade::() - } - fn on_finalize(_: T::BlockNumber) { >::kill(); >::kill(); diff --git a/pallets/parachain-system/src/migration.rs b/pallets/parachain-system/src/migration.rs index e3d1e11a51b..17dce3a11a9 100644 --- a/pallets/parachain-system/src/migration.rs +++ b/pallets/parachain-system/src/migration.rs @@ -16,32 +16,37 @@ use crate::{Config, Pallet, ReservedDmpWeightOverride, ReservedXcmpWeightOverride}; use frame_support::{ - traits::{Get, StorageVersion}, + pallet_prelude::*, + traits::{Get, OnRuntimeUpgrade, StorageVersion}, weights::Weight, }; /// The current storage version. pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); -/// Call this during the next runtime upgrade for this module. -pub fn on_runtime_upgrade() -> Weight { - let mut weight: Weight = T::DbWeight::get().reads(2); +/// Migrates the pallet storage to the most recent version. +pub struct Migration(PhantomData); - if StorageVersion::get::>() == 0 { - weight = weight - .saturating_add(v1::migrate::()) - .saturating_add(T::DbWeight::get().writes(1)); - StorageVersion::new(1).put::>(); - } +impl OnRuntimeUpgrade for Migration { + fn on_runtime_upgrade() -> Weight { + let mut weight: Weight = T::DbWeight::get().reads(2); - if StorageVersion::get::>() == 1 { - weight = weight - .saturating_add(v2::migrate::()) - .saturating_add(T::DbWeight::get().writes(1)); - STORAGE_VERSION.put::>(); - } + if StorageVersion::get::>() == 0 { + weight = weight + .saturating_add(v1::migrate::()) + .saturating_add(T::DbWeight::get().writes(1)); + StorageVersion::new(1).put::>(); + } - weight + if StorageVersion::get::>() == 1 { + weight = weight + .saturating_add(v2::migrate::()) + .saturating_add(T::DbWeight::get().writes(1)); + StorageVersion::new(2).put::>(); + } + + weight + } } /// V2: Migrate to 2D weights for ReservedXcmpWeightOverride and ReservedDmpWeightOverride. diff --git a/pallets/xcmp-queue/src/lib.rs b/pallets/xcmp-queue/src/lib.rs index 93c9100f520..12ee6dae25a 100644 --- a/pallets/xcmp-queue/src/lib.rs +++ b/pallets/xcmp-queue/src/lib.rs @@ -115,10 +115,6 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { - fn on_runtime_upgrade() -> Weight { - migration::migrate_to_latest::() - } - fn on_idle(_now: T::BlockNumber, max_weight: Weight) -> Weight { // on_idle processes additional messages with any remaining block weight. Self::service_xcmp_queue(max_weight) diff --git a/pallets/xcmp-queue/src/migration.rs b/pallets/xcmp-queue/src/migration.rs index fd1301b9491..bda54620cd9 100644 --- a/pallets/xcmp-queue/src/migration.rs +++ b/pallets/xcmp-queue/src/migration.rs @@ -19,31 +19,34 @@ use crate::{Config, Overweight, Pallet, QueueConfig, DEFAULT_POV_SIZE}; use frame_support::{ pallet_prelude::*, - traits::StorageVersion, + traits::{OnRuntimeUpgrade, StorageVersion}, weights::{constants::WEIGHT_REF_TIME_PER_MILLIS, Weight}, }; /// The current storage version. -pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); +pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(3); -/// Migrates the pallet storage to the most recent version, checking and setting the -/// `StorageVersion`. -pub fn migrate_to_latest() -> Weight { - let mut weight = T::DbWeight::get().reads(1); +/// Migrates the pallet storage to the most recent version. +pub struct Migration(PhantomData); - if StorageVersion::get::>() == 1 { - weight.saturating_accrue(migrate_to_v2::()); - StorageVersion::new(2).put::>(); - weight.saturating_accrue(T::DbWeight::get().writes(1)); - } +impl OnRuntimeUpgrade for Migration { + fn on_runtime_upgrade() -> Weight { + let mut weight = T::DbWeight::get().reads(1); - if StorageVersion::get::>() == 2 { - weight.saturating_accrue(migrate_to_v3::()); - StorageVersion::new(3).put::>(); - weight.saturating_accrue(T::DbWeight::get().writes(1)); - } + if StorageVersion::get::>() == 1 { + weight.saturating_accrue(migrate_to_v2::()); + StorageVersion::new(2).put::>(); + weight.saturating_accrue(T::DbWeight::get().writes(1)); + } - weight + if StorageVersion::get::>() == 2 { + weight.saturating_accrue(migrate_to_v3::()); + StorageVersion::new(3).put::>(); + weight.saturating_accrue(T::DbWeight::get().writes(1)); + } + + weight + } } mod v1 { diff --git a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index 65b25681bbf..ac043cc7e0b 100644 --- a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -86,6 +86,7 @@ std = [ "frame-support/std", "frame-system-rpc-runtime-api/std", "frame-system/std", + "frame-try-runtime/std", "kusama-runtime-constants/std", "pallet-aura/std", "pallet-authorship/std", diff --git a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index d90c60990c4..b7401b58642 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -95,9 +95,16 @@ pub type SignedExtra = ( pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Migrations to apply on runtime upgrade. pub type Migrations = ( + cumulus_pallet_dmp_queue::migration::Migration, + cumulus_pallet_parachain_system::migration::Migration, + cumulus_pallet_xcmp_queue::migration::Migration, + pallet_balances::migration::MigrateToTrackInactive, pallet_contracts::Migration, + pallet_multisig::migrations::v1::MigrateToV1, pallet_collator_selection::migration::v1::MigrateToV1, + pallet_xcm::migration::v1::MigrateToV1, ); type EventRecord = frame_system::EventRecord< diff --git a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs index 2f39cc6536d..c386e8880c6 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs @@ -43,6 +43,7 @@ parameter_types! { pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); pub const ExecutiveBody: BodyId = BodyId::Executive; + pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } /// We allow root and the Relay Chain council to execute privileged collator selection operations. From 5b0db49b5c2ed417d3673ecc80910cf92f103bf1 Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Mon, 5 Jun 2023 16:41:20 +0200 Subject: [PATCH 272/339] Add benchmarks for for import/validation/production (#2579) * Add benchmarks * Remove endowed accounts * Fix group * Remove duplicate code * Comments * Use execute_block instead of block import * Apply suggestions from code review Co-authored-by: Anton * Add missing comments * Clippy * Reorganize utils * Remove unused import * Switch to compiled again * Apply suggestions from code review Co-authored-by: Davide Galassi * Refactor local_testnet * Do not write wasm blob to file * Remove unnecessary block * Add comment fixes * fmt * lock --------- Co-authored-by: Anton Co-authored-by: Davide Galassi --- Cargo.lock | 526 +++++++++++++++++- test/client/src/lib.rs | 43 +- test/runtime/Cargo.toml | 1 + test/runtime/src/lib.rs | 13 +- test/service/Cargo.toml | 41 ++ test/service/benches/block_import.rs | 79 +++ test/service/benches/block_import_glutton.rs | 93 ++++ test/service/benches/block_production.rs | 111 ++++ .../benches/block_production_glutton.rs | 114 ++++ test/service/benches/validate_block.rs | 163 ++++++ .../service/benches/validate_block_glutton.rs | 211 +++++++ test/service/src/bench_utils.rs | 262 +++++++++ test/service/src/chain_spec.rs | 59 +- test/service/src/lib.rs | 32 +- 14 files changed, 1709 insertions(+), 39 deletions(-) create mode 100644 test/service/benches/block_import.rs create mode 100644 test/service/benches/block_import_glutton.rs create mode 100644 test/service/benches/block_production.rs create mode 100644 test/service/benches/block_production_glutton.rs create mode 100644 test/service/benches/validate_block.rs create mode 100644 test/service/benches/validate_block_glutton.rs create mode 100644 test/service/src/bench_utils.rs diff --git a/Cargo.lock b/Cargo.lock index d38e95464c2..98b120fde48 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1838,6 +1838,15 @@ dependencies = [ "strsim", ] +[[package]] +name = "clap_complete" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6b5c519bab3ea61843a7923d074b04245624bb84a64a8c150f5deb014e388b" +dependencies = [ + "clap", +] + [[package]] name = "clap_derive" version = "4.3.1" @@ -3116,6 +3125,7 @@ dependencies = [ "frame-system", "frame-system-rpc-runtime-api", "pallet-balances", + "pallet-glutton", "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", @@ -3147,17 +3157,25 @@ dependencies = [ "cumulus-client-consensus-relay-chain", "cumulus-client-pov-recovery", "cumulus-client-service", + "cumulus-pallet-parachain-system", "cumulus-primitives-core", "cumulus-primitives-parachain-inherent", "cumulus-relay-chain-inprocess-interface", "cumulus-relay-chain-interface", "cumulus-relay-chain-minimal-node", + "cumulus-test-client", + "cumulus-test-relay-sproof-builder", "cumulus-test-relay-validation-worker-provider", "cumulus-test-runtime", "frame-system", "frame-system-rpc-runtime-api", "futures", "jsonrpsee", + "kitchensink-runtime", + "node-cli", + "node-primitives", + "pallet-im-online", + "pallet-timestamp", "pallet-transaction-payment", "parachains-common", "parity-scale-codec", @@ -3169,12 +3187,16 @@ dependencies = [ "polkadot-test-service", "portpicker", "rand 0.8.5", + "rococo-parachain-runtime", "sc-basic-authorship", + "sc-block-builder", "sc-chain-spec", "sc-cli", "sc-client-api", "sc-consensus", "sc-executor", + "sc-executor-common", + "sc-executor-wasmtime", "sc-network", "sc-service", "sc-telemetry", @@ -3182,8 +3204,12 @@ dependencies = [ "sc-transaction-pool", "sc-transaction-pool-api", "serde", + "sp-api", "sp-arithmetic", + "sp-authority-discovery", "sp-blockchain", + "sp-consensus", + "sp-consensus-grandpa", "sp-core", "sp-io", "sp-keyring", @@ -3194,6 +3220,7 @@ dependencies = [ "sp-trie", "substrate-test-client", "substrate-test-utils", + "tempfile", "tokio", "tracing", "url", @@ -4197,6 +4224,21 @@ dependencies = [ "thousands", ] +[[package]] +name = "frame-benchmarking-pallet-pov" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" @@ -5083,6 +5125,17 @@ dependencies = [ "parity-scale-codec", ] +[[package]] +name = "impl-num-traits" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951641f13f873bff03d4bf19ae8bec531935ac0ac2cc775f84d7edfdcfed3f17" +dependencies = [ + "integer-sqrt", + "num-traits", + "uint", +] + [[package]] name = "impl-rlp" version = "0.3.0" @@ -5482,6 +5535,115 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" +[[package]] +name = "kitchensink-runtime" +version = "3.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-benchmarking", + "frame-benchmarking-pallet-pov", + "frame-election-provider-support", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "log", + "node-primitives", + "pallet-alliance", + "pallet-asset-conversion", + "pallet-asset-rate", + "pallet-asset-tx-payment", + "pallet-assets", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-bags-list", + "pallet-balances", + "pallet-bounties", + "pallet-child-bounties", + "pallet-collective", + "pallet-contracts", + "pallet-contracts-primitives", + "pallet-conviction-voting", + "pallet-core-fellowship", + "pallet-democracy", + "pallet-election-provider-multi-phase", + "pallet-election-provider-support-benchmarking", + "pallet-elections-phragmen", + "pallet-fast-unstake", + "pallet-glutton", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-insecure-randomness-collective-flip", + "pallet-lottery", + "pallet-membership", + "pallet-message-queue", + "pallet-mmr", + "pallet-multisig", + "pallet-nft-fractionalization", + "pallet-nfts", + "pallet-nfts-runtime-api", + "pallet-nis", + "pallet-nomination-pools", + "pallet-nomination-pools-benchmarking", + "pallet-nomination-pools-runtime-api", + "pallet-offences", + "pallet-offences-benchmarking", + "pallet-preimage", + "pallet-proxy", + "pallet-ranked-collective", + "pallet-recovery", + "pallet-referenda", + "pallet-remark", + "pallet-root-testing", + "pallet-salary", + "pallet-scheduler", + "pallet-session", + "pallet-session-benchmarking", + "pallet-society", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-staking-runtime-api", + "pallet-state-trie-migration", + "pallet-statement", + "pallet-sudo", + "pallet-timestamp", + "pallet-tips", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-transaction-storage", + "pallet-treasury", + "pallet-uniques", + "pallet-utility", + "pallet-vesting", + "pallet-whitelist", + "parity-scale-codec", + "primitive-types", + "scale-info", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-grandpa", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-statement-store", + "sp-std", + "sp-transaction-pool", + "sp-version", + "static_assertions", + "substrate-wasm-builder", +] + [[package]] name = "kusama-runtime" version = "0.9.41" @@ -6800,6 +6962,158 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "node-cli" +version = "3.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "array-bytes 4.2.0", + "clap", + "clap_complete", + "frame-benchmarking-cli", + "frame-system", + "frame-system-rpc-runtime-api", + "futures", + "jsonrpsee", + "kitchensink-runtime", + "log", + "node-executor", + "node-inspect", + "node-primitives", + "node-rpc", + "pallet-asset-conversion", + "pallet-asset-tx-payment", + "pallet-assets", + "pallet-balances", + "pallet-im-online", + "pallet-transaction-payment", + "parity-scale-codec", + "rand 0.8.5", + "sc-authority-discovery", + "sc-basic-authorship", + "sc-chain-spec", + "sc-cli", + "sc-client-api", + "sc-consensus", + "sc-consensus-babe", + "sc-consensus-grandpa", + "sc-consensus-slots", + "sc-executor", + "sc-network", + "sc-network-common", + "sc-network-statement", + "sc-network-sync", + "sc-rpc", + "sc-service", + "sc-statement-store", + "sc-storage-monitor", + "sc-sync-state-rpc", + "sc-sysinfo", + "sc-telemetry", + "sc-transaction-pool", + "sc-transaction-pool-api", + "serde", + "serde_json", + "sp-api", + "sp-authority-discovery", + "sp-consensus", + "sp-consensus-babe", + "sp-consensus-grandpa", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-keystore", + "sp-runtime", + "sp-timestamp", + "sp-transaction-pool", + "sp-transaction-storage-proof", + "substrate-build-script-utils", + "substrate-frame-cli", + "try-runtime-cli", +] + +[[package]] +name = "node-executor" +version = "3.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-benchmarking", + "kitchensink-runtime", + "node-primitives", + "parity-scale-codec", + "sc-executor", + "scale-info", + "sp-core", + "sp-keystore", + "sp-state-machine", + "sp-statement-store", + "sp-tracing", + "sp-trie", +] + +[[package]] +name = "node-inspect" +version = "0.9.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "clap", + "parity-scale-codec", + "sc-cli", + "sc-client-api", + "sc-executor", + "sc-service", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "node-primitives" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "node-rpc" +version = "3.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "jsonrpsee", + "mmr-rpc", + "node-primitives", + "pallet-transaction-payment-rpc", + "sc-chain-spec", + "sc-client-api", + "sc-consensus-babe", + "sc-consensus-babe-rpc", + "sc-consensus-grandpa", + "sc-consensus-grandpa-rpc", + "sc-rpc", + "sc-rpc-api", + "sc-rpc-spec-v2", + "sc-sync-state-rpc", + "sc-transaction-pool-api", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-keystore", + "sp-runtime", + "sp-statement-store", + "substrate-frame-rpc-system", + "substrate-state-trie-migration-rpc", +] + [[package]] name = "nohash-hasher" version = "0.2.0" @@ -7054,6 +7368,37 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-asset-conversion" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-asset-rate" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" @@ -7472,6 +7817,24 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-core-fellowship" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-democracy" version = "4.0.0-dev" @@ -7671,6 +8034,20 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-lottery" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-membership" version = "4.0.0-dev" @@ -7990,6 +8367,56 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-remark" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-root-testing" +version = "1.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-salary" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-scheduler" version = "4.0.0-dev" @@ -8127,6 +8554,24 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-statement" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-statement-store", + "sp-std", +] + [[package]] name = "pallet-sudo" version = "4.0.0-dev" @@ -8223,6 +8668,26 @@ dependencies = [ "sp-weights", ] +[[package]] +name = "pallet-transaction-storage" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std", + "sp-transaction-storage-proof", +] + [[package]] name = "pallet-treasury" version = "4.0.0-dev" @@ -10516,6 +10981,7 @@ checksum = "5cfd65aea0c5fa0bfcc7c9e7ca828c921ef778f43d325325ec84bda371bfa75a" dependencies = [ "fixed-hash", "impl-codec", + "impl-num-traits", "impl-rlp", "impl-serde", "scale-info", @@ -12129,6 +12595,26 @@ dependencies = [ "thiserror", ] +[[package]] +name = "sc-network-statement" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "array-bytes 4.2.0", + "async-channel", + "futures", + "libp2p", + "log", + "parity-scale-codec", + "pin-project", + "sc-network", + "sc-network-common", + "sp-consensus", + "sp-runtime", + "sp-statement-store", + "substrate-prometheus-endpoint", +] + [[package]] name = "sc-network-sync" version = "0.10.0-dev" @@ -12388,6 +12874,29 @@ dependencies = [ "sp-core", ] +[[package]] +name = "sc-statement-store" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "log", + "parity-db", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-client-api", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-statement-store", + "sp-tracing", + "substrate-prometheus-endpoint", + "tokio", +] + [[package]] name = "sc-storage-monitor" version = "0.1.0" @@ -14014,6 +14523,19 @@ dependencies = [ "platforms", ] +[[package]] +name = "substrate-frame-cli" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +dependencies = [ + "clap", + "frame-support", + "frame-system", + "sc-cli", + "sp-core", + "sp-runtime", +] + [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" @@ -14872,9 +15394,9 @@ checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" [[package]] name = "uint" -version = "0.9.1" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6470ab50f482bde894a037a57064480a246dbfdd5960bd65a44824693f08da5f" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" dependencies = [ "byteorder", "crunchy", diff --git a/test/client/src/lib.rs b/test/client/src/lib.rs index cbf0459b816..4888e957d78 100644 --- a/test/client/src/lib.rs +++ b/test/client/src/lib.rs @@ -26,7 +26,7 @@ use sc_executor::{HeapAllocStrategy, WasmExecutionMethod, WasmExecutor}; use sc_executor_common::runtime_blob::RuntimeBlob; use sc_service::client; use sp_blockchain::HeaderBackend; -use sp_core::storage::Storage; +use sp_core::{sr25519, storage::Storage, Pair}; use sp_io::TestExternalities; use sp_runtime::{generic::Era, BuildStorage, SaturatedConversion}; @@ -77,11 +77,22 @@ pub type Client = client::Client; /// Parameters of test-client builder with test-runtime. #[derive(Default)] -pub struct GenesisParameters; +pub struct GenesisParameters { + pub endowed_accounts: Vec, +} impl substrate_test_client::GenesisInit for GenesisParameters { fn genesis_storage(&self) -> Storage { - genesis_config().build_storage().unwrap() + if self.endowed_accounts.is_empty() { + genesis_config().build_storage().unwrap() + } else { + cumulus_test_service::testnet_genesis( + cumulus_test_service::get_account_id_from_seed::("Alice"), + self.endowed_accounts.clone(), + ) + .build_storage() + .unwrap() + } } } @@ -115,19 +126,26 @@ impl DefaultTestClientBuilderExt for TestClientBuilder { } fn genesis_config() -> GenesisConfig { - cumulus_test_service::local_testnet_genesis() + cumulus_test_service::testnet_genesis_with_default_endowed(Default::default()) } -/// Generate an extrinsic from the provided function call, origin and [`Client`]. -pub fn generate_extrinsic( +/// Create an unsigned extrinsic from a runtime call. +pub fn generate_unsigned(function: impl Into) -> UncheckedExtrinsic { + UncheckedExtrinsic::new_unsigned(function.into()) +} + +/// Create a signed extrinsic from a runtime call and sign +/// with the given key pair. +pub fn generate_extrinsic_with_pair( client: &Client, - origin: sp_keyring::AccountKeyring, + origin: sp_core::sr25519::Pair, function: impl Into, + nonce: Option, ) -> UncheckedExtrinsic { let current_block_hash = client.info().best_hash; let current_block = client.info().best_number.saturated_into(); let genesis_block = client.hash(0).unwrap().unwrap(); - let nonce = 0; + let nonce = nonce.unwrap_or_default(); let period = BlockHashCount::get().checked_next_power_of_two().map(|c| c / 2).unwrap_or(2) as u64; let tip = 0; @@ -158,6 +176,15 @@ pub fn generate_extrinsic( ) } +/// Generate an extrinsic from the provided function call, origin and [`Client`]. +pub fn generate_extrinsic( + client: &Client, + origin: sp_keyring::AccountKeyring, + function: impl Into, +) -> UncheckedExtrinsic { + generate_extrinsic_with_pair(client, origin.into(), function, None) +} + /// Transfer some token from one account to another using a provided test [`Client`]. pub fn transfer( client: &Client, diff --git a/test/runtime/Cargo.toml b/test/runtime/Cargo.toml index 6f829c27492..e4ddeea69b0 100644 --- a/test/runtime/Cargo.toml +++ b/test/runtime/Cargo.toml @@ -16,6 +16,7 @@ frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate" pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-glutton = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/test/runtime/src/lib.rs b/test/runtime/src/lib.rs index 7633da1ea54..25841acb11b 100644 --- a/test/runtime/src/lib.rs +++ b/test/runtime/src/lib.rs @@ -57,8 +57,12 @@ pub use frame_support::{ }, StorageValue, }; -use frame_system::limits::{BlockLength, BlockWeights}; +use frame_system::{ + limits::{BlockLength, BlockWeights}, + EnsureRoot, +}; pub use pallet_balances::Call as BalancesCall; +pub use pallet_glutton::Call as GluttonCall; pub use pallet_sudo::Call as SudoCall; pub use pallet_timestamp::Call as TimestampCall; #[cfg(any(feature = "std", test))] @@ -265,6 +269,12 @@ impl pallet_sudo::Config for Runtime { type WeightInfo = pallet_sudo::weights::SubstrateWeight; } +impl pallet_glutton::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type AdminOrigin = EnsureRoot; + type WeightInfo = pallet_glutton::weights::SubstrateWeight; +} + impl cumulus_pallet_parachain_system::Config for Runtime { type SelfParaId = ParachainId; type RuntimeEvent = RuntimeEvent; @@ -296,6 +306,7 @@ construct_runtime! { Sudo: pallet_sudo, TransactionPayment: pallet_transaction_payment, TestPallet: test_pallet, + Glutton: pallet_glutton, } } diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index b0141ec96cc..49544cc4ae9 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -19,6 +19,7 @@ serde = { version = "1.0.163", features = ["derive"] } tokio = { version = "1.28.2", features = ["macros"] } tracing = "0.1.37" url = "2.3.1" +tempfile = "3.5.0" # Substrate frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -39,14 +40,19 @@ sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "mas sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } substrate-test-client = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-executor-wasmtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-executor-common = { git = "https://github.com/paritytech/substrate", branch = "master" } # Polkadot polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } @@ -70,10 +76,21 @@ cumulus-test-relay-validation-worker-provider = { path = "../relay-validation-wo cumulus-test-runtime = { path = "../runtime" } cumulus-relay-chain-minimal-node = { path = "../../client/relay-chain-minimal-node" } cumulus-client-pov-recovery = { path = "../../client/pov-recovery" } +cumulus-test-relay-sproof-builder = { path = "../relay-sproof-builder" } +cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } [dev-dependencies] futures = "0.3.28" portpicker = "0.1.1" +kitchensink-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +rococo-parachain-runtime = { path = "../../parachains/runtimes/testing/rococo-parachain" } +node-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master" } +node-primitives = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } +cumulus-test-client = { path = "../client" } # Polkadot dependencies polkadot-test-service = { git = "https://github.com/paritytech/polkadot", branch = "master" } @@ -88,3 +105,27 @@ runtime-benchmarks = ["polkadot-test-service/runtime-benchmarks"] [[bench]] name = "transaction_throughput" harness = false + +[[bench]] +name = "block_import" +harness = false + +[[bench]] +name = "block_production" +harness = false + +[[bench]] +name = "block_production_glutton" +harness = false + +[[bench]] +name = "block_import_glutton" +harness = false + +[[bench]] +name = "validate_block" +harness = false + +[[bench]] +name = "validate_block_glutton" +harness = false diff --git a/test/service/benches/block_import.rs b/test/service/benches/block_import.rs new file mode 100644 index 00000000000..b79598b1530 --- /dev/null +++ b/test/service/benches/block_import.rs @@ -0,0 +1,79 @@ +// This file is part of Cumulus. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use criterion::{criterion_group, criterion_main, BatchSize, Criterion, Throughput}; + +use sc_client_api::UsageProvider; + +use core::time::Duration; +use cumulus_primitives_core::ParaId; + +use sc_block_builder::{BlockBuilderProvider, RecordProof}; +use sp_api::{Core, ProvideRuntimeApi}; +use sp_keyring::Sr25519Keyring::Alice; + +use cumulus_test_service::bench_utils as utils; + +fn benchmark_block_import(c: &mut Criterion) { + sp_tracing::try_init_simple(); + + let runtime = tokio::runtime::Runtime::new().expect("creating tokio runtime doesn't fail; qed"); + let para_id = ParaId::from(100); + let tokio_handle = runtime.handle(); + + // Create enough accounts to fill the block with transactions. + // Each account should only be included in one transfer. + let (src_accounts, dst_accounts, account_ids) = utils::create_benchmark_accounts(); + + let alice = runtime.block_on( + cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Alice) + // Preload all accounts with funds for the transfers + .endowed_accounts(account_ids) + .build(), + ); + + let client = alice.client; + + let (max_transfer_count, extrinsics) = + utils::create_benchmarking_transfer_extrinsics(&client, &src_accounts, &dst_accounts); + + let parent_hash = client.usage_info().chain.best_hash; + let mut block_builder = + client.new_block_at(parent_hash, Default::default(), RecordProof::No).unwrap(); + for extrinsic in extrinsics { + block_builder.push(extrinsic).unwrap(); + } + let benchmark_block = block_builder.build().unwrap(); + + let mut group = c.benchmark_group("Block import"); + group.sample_size(20); + group.measurement_time(Duration::from_secs(120)); + group.throughput(Throughput::Elements(max_transfer_count as u64)); + + group.bench_function(format!("(transfers = {}) block import", max_transfer_count), |b| { + b.iter_batched( + || benchmark_block.block.clone(), + |block| { + client.runtime_api().execute_block(parent_hash, block).unwrap(); + }, + BatchSize::SmallInput, + ) + }); +} + +criterion_group!(benches, benchmark_block_import); +criterion_main!(benches); diff --git a/test/service/benches/block_import_glutton.rs b/test/service/benches/block_import_glutton.rs new file mode 100644 index 00000000000..48fc3dee76d --- /dev/null +++ b/test/service/benches/block_import_glutton.rs @@ -0,0 +1,93 @@ +// This file is part of Cumulus. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; + +use sc_client_api::UsageProvider; +use sp_api::{Core, ProvideRuntimeApi}; +use sp_arithmetic::Perbill; + +use core::time::Duration; +use cumulus_primitives_core::ParaId; + +use sc_block_builder::{BlockBuilderProvider, RecordProof}; +use sp_keyring::Sr25519Keyring::Alice; + +use cumulus_test_service::bench_utils as utils; + +fn benchmark_block_import(c: &mut Criterion) { + sp_tracing::try_init_simple(); + + let runtime = tokio::runtime::Runtime::new().expect("creating tokio runtime doesn't fail; qed"); + let para_id = ParaId::from(100); + let tokio_handle = runtime.handle(); + + let alice = runtime.block_on( + cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Alice).build(), + ); + let client = alice.client; + + let mut group = c.benchmark_group("Block import"); + group.sample_size(20); + group.measurement_time(Duration::from_secs(120)); + + let mut initialize_glutton_pallet = true; + for (compute_percent, storage_percent) in &[ + (Perbill::from_percent(100), Perbill::from_percent(0)), + (Perbill::from_percent(100), Perbill::from_percent(100)), + ] { + let block = utils::set_glutton_parameters( + &client, + initialize_glutton_pallet, + compute_percent, + storage_percent, + ); + initialize_glutton_pallet = false; + + runtime.block_on(utils::import_block(&client, &block, false)); + + // Build the block we will use for benchmarking + let parent_hash = client.usage_info().chain.best_hash; + let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); + let mut block_builder = + client.new_block_at(parent_hash, Default::default(), RecordProof::No).unwrap(); + block_builder + .push(utils::extrinsic_set_validation_data(parent_header.clone()).clone()) + .unwrap(); + block_builder.push(utils::extrinsic_set_time(&client)).unwrap(); + let benchmark_block = block_builder.build().unwrap(); + + group.bench_function( + format!( + "(compute = {:?}, storage = {:?}) block import", + compute_percent, storage_percent + ), + |b| { + b.iter_batched( + || benchmark_block.block.clone(), + |block| { + client.runtime_api().execute_block(parent_hash, block).unwrap(); + }, + BatchSize::SmallInput, + ) + }, + ); + } +} + +criterion_group!(benches, benchmark_block_import); +criterion_main!(benches); diff --git a/test/service/benches/block_production.rs b/test/service/benches/block_production.rs new file mode 100644 index 00000000000..1b868d73630 --- /dev/null +++ b/test/service/benches/block_production.rs @@ -0,0 +1,111 @@ +// This file is part of Cumulus. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use criterion::{criterion_group, criterion_main, BatchSize, Criterion, Throughput}; + +use sc_client_api::UsageProvider; + +use core::time::Duration; +use cumulus_primitives_core::ParaId; +use sc_block_builder::{BlockBuilderProvider, RecordProof}; + +use sp_keyring::Sr25519Keyring::Alice; + +use cumulus_test_service::bench_utils as utils; + +fn benchmark_block_production(c: &mut Criterion) { + sp_tracing::try_init_simple(); + + let runtime = tokio::runtime::Runtime::new().expect("creating tokio runtime doesn't fail; qed"); + let tokio_handle = runtime.handle(); + + // Create enough accounts to fill the block with transactions. + // Each account should only be included in one transfer. + let (src_accounts, dst_accounts, account_ids) = utils::create_benchmark_accounts(); + + let para_id = ParaId::from(100); + let alice = runtime.block_on( + cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Alice) + // Preload all accounts with funds for the transfers + .endowed_accounts(account_ids) + .build(), + ); + let client = alice.client; + + let parent_hash = client.usage_info().chain.best_hash; + let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); + let set_validation_data_extrinsic = utils::extrinsic_set_validation_data(parent_header); + + let mut block_builder = client.new_block(Default::default()).unwrap(); + block_builder.push(utils::extrinsic_set_time(&client)).unwrap(); + block_builder.push(set_validation_data_extrinsic).unwrap(); + let built_block = block_builder.build().unwrap(); + + runtime.block_on(utils::import_block(&client, &built_block.block, false)); + + let (max_transfer_count, extrinsics) = + utils::create_benchmarking_transfer_extrinsics(&client, &src_accounts, &dst_accounts); + + let mut group = c.benchmark_group("Block production"); + + group.sample_size(20); + group.measurement_time(Duration::from_secs(120)); + group.throughput(Throughput::Elements(max_transfer_count as u64)); + + let best_hash = client.chain_info().best_hash; + + group.bench_function( + format!("(proof = true, transfers = {}) block production", max_transfer_count), + |b| { + b.iter_batched( + || extrinsics.clone(), + |extrinsics| { + let mut block_builder = client + .new_block_at(best_hash, Default::default(), RecordProof::Yes) + .unwrap(); + for extrinsic in extrinsics { + block_builder.push(extrinsic).unwrap(); + } + block_builder.build().unwrap() + }, + BatchSize::SmallInput, + ) + }, + ); + + group.bench_function( + format!("(proof = false, transfers = {}) block production", max_transfer_count), + |b| { + b.iter_batched( + || extrinsics.clone(), + |extrinsics| { + let mut block_builder = client + .new_block_at(best_hash, Default::default(), RecordProof::No) + .unwrap(); + for extrinsic in extrinsics { + block_builder.push(extrinsic).unwrap(); + } + block_builder.build().unwrap() + }, + BatchSize::SmallInput, + ) + }, + ); +} + +criterion_group!(benches, benchmark_block_production); +criterion_main!(benches); diff --git a/test/service/benches/block_production_glutton.rs b/test/service/benches/block_production_glutton.rs new file mode 100644 index 00000000000..aa05b4e4612 --- /dev/null +++ b/test/service/benches/block_production_glutton.rs @@ -0,0 +1,114 @@ +// This file is part of Cumulus. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; + +use sc_client_api::UsageProvider; +use sp_arithmetic::Perbill; + +use core::time::Duration; +use cumulus_primitives_core::ParaId; + +use sc_block_builder::{BlockBuilderProvider, RecordProof}; + +use sp_keyring::Sr25519Keyring::Alice; + +use cumulus_test_service::bench_utils as utils; + +fn benchmark_block_production_compute(c: &mut Criterion) { + sp_tracing::try_init_simple(); + + let runtime = tokio::runtime::Runtime::new().expect("creating tokio runtime doesn't fail; qed"); + let tokio_handle = runtime.handle(); + + let para_id = ParaId::from(100); + let alice = runtime.block_on( + cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Alice).build(), + ); + let client = alice.client; + + let mut group = c.benchmark_group("Block production"); + + group.sample_size(20); + group.measurement_time(Duration::from_secs(120)); + + let mut initialize_glutton_pallet = true; + for (compute_level, storage_level) in &[ + (Perbill::from_percent(100), Perbill::from_percent(0)), + (Perbill::from_percent(100), Perbill::from_percent(100)), + ] { + let block = utils::set_glutton_parameters( + &client, + initialize_glutton_pallet, + compute_level, + storage_level, + ); + runtime.block_on(utils::import_block(&client, &block, false)); + initialize_glutton_pallet = false; + + let parent_hash = client.usage_info().chain.best_hash; + let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); + let set_validation_data_extrinsic = utils::extrinsic_set_validation_data(parent_header); + let set_time_extrinsic = utils::extrinsic_set_time(&client); + let best_hash = client.chain_info().best_hash; + + group.bench_function( + format!( + "(compute = {:?}, storage = {:?}, proof = true) block production", + compute_level, storage_level + ), + |b| { + b.iter_batched( + || (set_validation_data_extrinsic.clone(), set_time_extrinsic.clone()), + |(validation_data, time)| { + let mut block_builder = client + .new_block_at(best_hash, Default::default(), RecordProof::Yes) + .unwrap(); + block_builder.push(validation_data).unwrap(); + block_builder.push(time).unwrap(); + block_builder.build().unwrap() + }, + BatchSize::SmallInput, + ) + }, + ); + + group.bench_function( + format!( + "(compute = {:?}, storage = {:?}, proof = false) block production", + compute_level, storage_level + ), + |b| { + b.iter_batched( + || (set_validation_data_extrinsic.clone(), set_time_extrinsic.clone()), + |(validation_data, time)| { + let mut block_builder = client + .new_block_at(best_hash, Default::default(), RecordProof::No) + .unwrap(); + block_builder.push(validation_data).unwrap(); + block_builder.push(time).unwrap(); + block_builder.build().unwrap() + }, + BatchSize::SmallInput, + ) + }, + ); + } +} + +criterion_group!(benches, benchmark_block_production_compute); +criterion_main!(benches); diff --git a/test/service/benches/validate_block.rs b/test/service/benches/validate_block.rs new file mode 100644 index 00000000000..3f4c39e5aa9 --- /dev/null +++ b/test/service/benches/validate_block.rs @@ -0,0 +1,163 @@ +// This file is part of Cumulus. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use codec::{Decode, Encode}; +use core::time::Duration; +use criterion::{criterion_group, criterion_main, BatchSize, Criterion, Throughput}; +use cumulus_primitives_core::{relay_chain::AccountId, PersistedValidationData, ValidationParams}; +use cumulus_test_client::{ + generate_extrinsic_with_pair, BuildParachainBlockData, InitBlockBuilder, TestClientBuilder, + ValidationResult, +}; +use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; +use cumulus_test_runtime::{BalancesCall, Block, Header, UncheckedExtrinsic}; +use cumulus_test_service::bench_utils as utils; +use polkadot_primitives::HeadData; +use sc_block_builder::BlockBuilderProvider; +use sc_client_api::UsageProvider; +use sc_executor_common::wasm_runtime::WasmModule; + +use sp_blockchain::{ApplyExtrinsicFailed::Validity, Error::ApplyExtrinsicFailed}; + +use sp_core::{sr25519, Pair}; + +use sp_runtime::{ + traits::Header as HeaderT, + transaction_validity::{InvalidTransaction, TransactionValidityError}, +}; + +fn create_extrinsics( + client: &cumulus_test_client::Client, + src_accounts: &[sr25519::Pair], + dst_accounts: &[sr25519::Pair], +) -> (usize, Vec) { + // Add as many tranfer extrinsics as possible into a single block. + let mut block_builder = client.new_block(Default::default()).unwrap(); + let mut max_transfer_count = 0; + let mut extrinsics = Vec::new(); + + for (src, dst) in src_accounts.iter().zip(dst_accounts.iter()) { + let extrinsic: UncheckedExtrinsic = generate_extrinsic_with_pair( + client, + src.clone(), + BalancesCall::transfer_keep_alive { dest: AccountId::from(dst.public()), value: 10000 }, + None, + ); + + match block_builder.push(extrinsic.clone()) { + Ok(_) => {}, + Err(ApplyExtrinsicFailed(Validity(TransactionValidityError::Invalid( + InvalidTransaction::ExhaustsResources, + )))) => break, + Err(error) => panic!("{}", error), + } + + extrinsics.push(extrinsic); + max_transfer_count += 1; + } + + (max_transfer_count, extrinsics) +} + +fn benchmark_block_validation(c: &mut Criterion) { + sp_tracing::try_init_simple(); + // Create enough accounts to fill the block with transactions. + // Each account should only be included in one transfer. + let (src_accounts, dst_accounts, account_ids) = utils::create_benchmark_accounts(); + + let mut test_client_builder = TestClientBuilder::with_default_backend() + .set_execution_strategy(sc_client_api::ExecutionStrategy::AlwaysWasm); + let genesis_init = test_client_builder.genesis_init_mut(); + *genesis_init = cumulus_test_client::GenesisParameters { endowed_accounts: account_ids }; + let client = test_client_builder.build_with_native_executor(None).0; + + let (max_transfer_count, extrinsics) = create_extrinsics(&client, &src_accounts, &dst_accounts); + + let parent_hash = client.usage_info().chain.best_hash; + let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); + let validation_data = PersistedValidationData { + relay_parent_number: 1, + parent_head: parent_header.encode().into(), + ..Default::default() + }; + + let mut block_builder = client.init_block_builder(Some(validation_data), Default::default()); + for extrinsic in extrinsics { + block_builder.push(extrinsic).unwrap(); + } + + let parachain_block = block_builder.build_parachain_block(*parent_header.state_root()); + + let proof_size_in_kb = parachain_block.storage_proof().encode().len() as f64 / 1024f64; + let runtime = utils::get_wasm_module(); + + let sproof_builder: RelayStateSproofBuilder = Default::default(); + let (relay_parent_storage_root, _) = sproof_builder.into_state_root_and_proof(); + let encoded_params = ValidationParams { + block_data: cumulus_test_client::BlockData(parachain_block.encode()), + parent_head: HeadData(parent_header.encode()), + relay_parent_number: 1, + relay_parent_storage_root, + } + .encode(); + + // This is not strictly necessary for this benchmark, but + // let us make sure that the result of `validate_block` is what + // we expect. + verify_expected_result(&runtime, &encoded_params, parachain_block.into_block()); + + let mut group = c.benchmark_group("Block validation"); + group.sample_size(20); + group.measurement_time(Duration::from_secs(120)); + group.throughput(Throughput::Elements(max_transfer_count as u64)); + + group.bench_function( + format!( + "(transfers = {}, proof_size = {}kb) block validation", + max_transfer_count, proof_size_in_kb + ), + |b| { + b.iter_batched( + || runtime.new_instance().unwrap(), + |mut instance| { + instance.call_export("validate_block", &encoded_params).unwrap(); + }, + BatchSize::SmallInput, + ) + }, + ); +} + +fn verify_expected_result( + runtime: &Box, + encoded_params: &[u8], + parachain_block: Block, +) { + let res = runtime + .new_instance() + .unwrap() + .call_export("validate_block", encoded_params) + .expect("Call `validate_block`."); + let validation_result = + ValidationResult::decode(&mut &res[..]).expect("Decode `ValidationResult`."); + let header = + Header::decode(&mut &validation_result.head_data.0[..]).expect("Decodes `Header`."); + assert_eq!(parachain_block.header, header); +} + +criterion_group!(benches, benchmark_block_validation); +criterion_main!(benches); diff --git a/test/service/benches/validate_block_glutton.rs b/test/service/benches/validate_block_glutton.rs new file mode 100644 index 00000000000..ceeff736abe --- /dev/null +++ b/test/service/benches/validate_block_glutton.rs @@ -0,0 +1,211 @@ +// This file is part of Cumulus. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use codec::{Decode, Encode}; +use core::time::Duration; +use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; +use cumulus_primitives_core::{relay_chain::AccountId, PersistedValidationData, ValidationParams}; +use cumulus_test_client::{ + generate_extrinsic_with_pair, BuildParachainBlockData, Client, InitBlockBuilder, + ParachainBlockData, TestClientBuilder, ValidationResult, +}; +use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; +use cumulus_test_runtime::{Block, GluttonCall, Header, SudoCall}; +use polkadot_primitives::HeadData; +use sc_client_api::UsageProvider; +use sc_consensus::{BlockImport, BlockImportParams, ForkChoiceStrategy, ImportResult, StateAction}; +use sc_executor_common::wasm_runtime::WasmModule; +use sp_api::ProvideRuntimeApi; + +use frame_system_rpc_runtime_api::AccountNonceApi; +use sp_arithmetic::Perbill; +use sp_consensus::BlockOrigin; +use sp_keyring::Sr25519Keyring::Alice; +use sp_runtime::traits::Header as HeaderT; + +use cumulus_test_service::bench_utils as utils; + +async fn import_block( + mut client: &cumulus_test_client::Client, + built: cumulus_test_runtime::Block, + import_existing: bool, +) { + let mut params = BlockImportParams::new(BlockOrigin::File, built.header.clone()); + params.body = Some(built.extrinsics.clone()); + params.state_action = StateAction::Execute; + params.fork_choice = Some(ForkChoiceStrategy::LongestChain); + params.import_existing = import_existing; + let import_result = client.import_block(params).await; + assert!(matches!(import_result, Ok(ImportResult::Imported(_)))); +} + +fn benchmark_block_validation(c: &mut Criterion) { + sp_tracing::try_init_simple(); + let runtime = tokio::runtime::Runtime::new().expect("creating tokio runtime doesn't fail; qed"); + + let endowed_accounts = vec![AccountId::from(Alice.public())]; + let mut test_client_builder = TestClientBuilder::with_default_backend() + .set_execution_strategy(sc_client_api::ExecutionStrategy::NativeElseWasm); + let genesis_init = test_client_builder.genesis_init_mut(); + *genesis_init = cumulus_test_client::GenesisParameters { endowed_accounts }; + + let client = test_client_builder.build_with_native_executor(None).0; + + let mut group = c.benchmark_group("Block validation"); + group.sample_size(20); + group.measurement_time(Duration::from_secs(120)); + + // In the first iteration we want to initialie the glutton pallet + let mut is_first = true; + for (compute_percent, storage_percent) in &[ + (Perbill::from_percent(100), Perbill::from_percent(0)), + (Perbill::from_percent(100), Perbill::from_percent(100)), + ] { + let parachain_block = + set_glutton_parameters(&client, is_first, compute_percent, storage_percent); + is_first = false; + + runtime.block_on(import_block(&client, parachain_block.clone().into_block(), false)); + + // Build benchmark block + let parent_hash = client.usage_info().chain.best_hash; + let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); + let validation_data = PersistedValidationData { + relay_parent_number: 1, + parent_head: parent_header.encode().into(), + ..Default::default() + }; + let block_builder = client.init_block_builder(Some(validation_data), Default::default()); + let parachain_block = block_builder.build_parachain_block(*parent_header.state_root()); + + let proof_size_in_kb = parachain_block.storage_proof().encode().len() as f64 / 1024f64; + runtime.block_on(import_block(&client, parachain_block.clone().into_block(), false)); + let runtime = utils::get_wasm_module(); + + let sproof_builder: RelayStateSproofBuilder = Default::default(); + let (relay_parent_storage_root, _) = sproof_builder.clone().into_state_root_and_proof(); + let encoded_params = ValidationParams { + block_data: cumulus_test_client::BlockData(parachain_block.clone().encode()), + parent_head: HeadData(parent_header.encode()), + relay_parent_number: 1, + relay_parent_storage_root, + } + .encode(); + + // This is not strictly necessary for this benchmark, but + // let us make sure that the result of `validate_block` is what + // we expect. + verify_expected_result(&runtime, &encoded_params, parachain_block.into_block()); + + group.bench_function( + format!( + "(compute = {:?}, storage = {:?}, proof_size = {}kb) block validation", + compute_percent, storage_percent, proof_size_in_kb + ), + |b| { + b.iter_batched( + || runtime.new_instance().unwrap(), + |mut instance| { + instance.call_export("validate_block", &encoded_params).unwrap(); + }, + BatchSize::SmallInput, + ) + }, + ); + } +} + +fn verify_expected_result(runtime: &Box, encoded_params: &[u8], block: Block) { + let res = runtime + .new_instance() + .unwrap() + .call_export("validate_block", encoded_params) + .expect("Call `validate_block`."); + let validation_result = + ValidationResult::decode(&mut &res[..]).expect("Decode `ValidationResult`."); + let header = + Header::decode(&mut &validation_result.head_data.0[..]).expect("Decodes `Header`."); + assert_eq!(block.header, header); +} + +fn set_glutton_parameters( + client: &Client, + initialize: bool, + compute_percent: &Perbill, + storage_percent: &Perbill, +) -> ParachainBlockData { + let parent_hash = client.usage_info().chain.best_hash; + let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); + + let mut last_nonce = client + .runtime_api() + .account_nonce(parent_hash, Alice.into()) + .expect("Fetching account nonce works; qed"); + + let validation_data = PersistedValidationData { + relay_parent_number: 1, + parent_head: parent_header.encode().into(), + ..Default::default() + }; + + let mut extrinsics = vec![]; + if initialize { + extrinsics.push(generate_extrinsic_with_pair( + client, + Alice.into(), + SudoCall::sudo { + call: Box::new( + GluttonCall::initialize_pallet { new_count: 5000, witness_count: None }.into(), + ), + }, + Some(last_nonce), + )); + last_nonce += 1; + } + + let set_compute = generate_extrinsic_with_pair( + client, + Alice.into(), + SudoCall::sudo { + call: Box::new(GluttonCall::set_compute { compute: *compute_percent }.into()), + }, + Some(last_nonce), + ); + last_nonce += 1; + extrinsics.push(set_compute); + + let set_storage = generate_extrinsic_with_pair( + client, + Alice.into(), + SudoCall::sudo { + call: Box::new(GluttonCall::set_storage { storage: *storage_percent }.into()), + }, + Some(last_nonce), + ); + extrinsics.push(set_storage); + + let mut block_builder = client.init_block_builder(Some(validation_data), Default::default()); + + for extrinsic in extrinsics { + block_builder.push(extrinsic).unwrap(); + } + + block_builder.build_parachain_block(*parent_header.state_root()) +} + +criterion_group!(benches, benchmark_block_validation); +criterion_main!(benches); diff --git a/test/service/src/bench_utils.rs b/test/service/src/bench_utils.rs new file mode 100644 index 00000000000..3794f74d040 --- /dev/null +++ b/test/service/src/bench_utils.rs @@ -0,0 +1,262 @@ +// This file is part of Cumulus. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use codec::Encode; + +use crate::{construct_extrinsic, Client as TestClient}; +use cumulus_primitives_core::{relay_chain::AccountId, PersistedValidationData}; +use cumulus_primitives_parachain_inherent::ParachainInherentData; +use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; +use cumulus_test_runtime::{ + BalancesCall, GluttonCall, NodeBlock, SudoCall, UncheckedExtrinsic, WASM_BINARY, +}; +use frame_system_rpc_runtime_api::AccountNonceApi; +use polkadot_primitives::HeadData; +use sc_block_builder::BlockBuilderProvider; +use sc_client_api::UsageProvider; +use sc_consensus::{ + block_import::{BlockImportParams, ForkChoiceStrategy}, + BlockImport, ImportResult, StateAction, +}; +use sc_executor::DEFAULT_HEAP_ALLOC_STRATEGY; +use sc_executor_common::runtime_blob::RuntimeBlob; +use sp_api::ProvideRuntimeApi; +use sp_arithmetic::Perbill; +use sp_blockchain::{ApplyExtrinsicFailed::Validity, Error::ApplyExtrinsicFailed}; +use sp_consensus::BlockOrigin; +use sp_core::{sr25519, Pair}; +use sp_keyring::Sr25519Keyring::Alice; +use sp_runtime::{ + transaction_validity::{InvalidTransaction, TransactionValidityError}, + AccountId32, OpaqueExtrinsic, +}; + +/// Accounts to use for transfer transactions. Enough for 5000 transactions. +const NUM_ACCOUNTS: usize = 10000; + +/// Create accounts by deriving from Alice +pub fn create_benchmark_accounts() -> (Vec, Vec, Vec) { + let accounts: Vec = (0..NUM_ACCOUNTS) + .map(|idx| { + Pair::from_string(&format!("{}/{}", Alice.to_seed(), idx), None) + .expect("Creates account pair") + }) + .collect(); + let account_ids = accounts + .iter() + .map(|account| AccountId::from(account.public())) + .collect::>(); + let (src_accounts, dst_accounts) = accounts.split_at(NUM_ACCOUNTS / 2); + (src_accounts.to_vec(), dst_accounts.to_vec(), account_ids) +} + +/// Create a timestamp extrinsic ahead by `MinimumPeriod` of the last known timestamp +pub fn extrinsic_set_time(client: &TestClient) -> OpaqueExtrinsic { + let best_number = client.usage_info().chain.best_number; + + let timestamp = best_number as u64 * cumulus_test_runtime::MinimumPeriod::get(); + cumulus_test_runtime::UncheckedExtrinsic { + signature: None, + function: cumulus_test_runtime::RuntimeCall::Timestamp(pallet_timestamp::Call::set { + now: timestamp, + }), + } + .into() +} + +/// Create a set validation data extrinsic +pub fn extrinsic_set_validation_data( + parent_header: cumulus_test_runtime::Header, +) -> OpaqueExtrinsic { + let sproof_builder = RelayStateSproofBuilder { para_id: 100.into(), ..Default::default() }; + let parent_head = HeadData(parent_header.encode()); + let (relay_parent_storage_root, relay_chain_state) = sproof_builder.into_state_root_and_proof(); + let data = ParachainInherentData { + validation_data: PersistedValidationData { + parent_head, + relay_parent_number: 10, + relay_parent_storage_root, + max_pov_size: 10000, + }, + relay_chain_state, + downward_messages: Default::default(), + horizontal_messages: Default::default(), + }; + + cumulus_test_runtime::UncheckedExtrinsic { + signature: None, + function: cumulus_test_runtime::RuntimeCall::ParachainSystem( + cumulus_pallet_parachain_system::Call::set_validation_data { data }, + ), + } + .into() +} + +/// Import block into the given client and make sure the import was successful +pub async fn import_block(mut client: &TestClient, block: &NodeBlock, import_existing: bool) { + let mut params = BlockImportParams::new(BlockOrigin::File, block.header.clone()); + params.body = Some(block.extrinsics.clone()); + params.state_action = StateAction::Execute; + params.fork_choice = Some(ForkChoiceStrategy::LongestChain); + params.import_existing = import_existing; + let import_result = client.import_block(params).await; + assert!( + matches!(import_result, Ok(ImportResult::Imported(_))), + "Unexpected block import result: {:?}!", + import_result + ); +} + +/// Creates transfer extrinsics pair-wise from elements of `src_accounts` to `dst_accounts`. +pub fn create_benchmarking_transfer_extrinsics( + client: &TestClient, + src_accounts: &[sr25519::Pair], + dst_accounts: &[sr25519::Pair], +) -> (usize, Vec) { + // Add as many tranfer extrinsics as possible into a single block. + let mut block_builder = client.new_block(Default::default()).unwrap(); + let mut max_transfer_count = 0; + let mut extrinsics = Vec::new(); + // Every block needs one timestamp extrinsic. + let time_ext = extrinsic_set_time(client); + extrinsics.push(time_ext); + + // Every block needs tone set_validation_data extrinsic. + let parent_hash = client.usage_info().chain.best_hash; + let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); + let set_validation_data_extrinsic = extrinsic_set_validation_data(parent_header); + extrinsics.push(set_validation_data_extrinsic); + + for (src, dst) in src_accounts.iter().zip(dst_accounts.iter()) { + let extrinsic: UncheckedExtrinsic = construct_extrinsic( + client, + BalancesCall::transfer_keep_alive { dest: AccountId::from(dst.public()), value: 10000 }, + src.clone(), + Some(0), + ); + + match block_builder.push(extrinsic.clone().into()) { + Ok(_) => {}, + Err(ApplyExtrinsicFailed(Validity(TransactionValidityError::Invalid( + InvalidTransaction::ExhaustsResources, + )))) => break, + Err(error) => panic!("{}", error), + } + + extrinsics.push(extrinsic.into()); + max_transfer_count += 1; + } + + if max_transfer_count >= src_accounts.len() { + panic!("Block could fit more transfers, increase NUM_ACCOUNTS to generate more accounts."); + } + + (max_transfer_count, extrinsics) +} + +/// Prepare cumulus test runtime for execution +pub fn get_wasm_module() -> Box { + let blob = RuntimeBlob::uncompress_if_needed( + WASM_BINARY.expect("You need to build the WASM binaries to run the benchmark!"), + ) + .unwrap(); + + let config = sc_executor_wasmtime::Config { + allow_missing_func_imports: true, + cache_path: None, + semantics: sc_executor_wasmtime::Semantics { + heap_alloc_strategy: DEFAULT_HEAP_ALLOC_STRATEGY, + instantiation_strategy: sc_executor::WasmtimeInstantiationStrategy::PoolingCopyOnWrite, + deterministic_stack_limit: None, + canonicalize_nans: false, + parallel_compilation: true, + wasm_multi_value: false, + wasm_bulk_memory: false, + wasm_reference_types: false, + wasm_simd: false, + }, + }; + Box::new( + sc_executor_wasmtime::create_runtime::(blob, config) + .expect("Unable to create wasm module."), + ) +} + +/// Create a block containing setup extrinsics for the glutton pallet. +pub fn set_glutton_parameters( + client: &TestClient, + initialize: bool, + compute_percent: &Perbill, + storage_percent: &Perbill, +) -> NodeBlock { + let parent_hash = client.usage_info().chain.best_hash; + let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); + + let mut last_nonce = client + .runtime_api() + .account_nonce(parent_hash, Alice.into()) + .expect("Fetching account nonce works; qed"); + + let mut extrinsics = vec![]; + if initialize { + // Initialize the pallet + extrinsics.push(construct_extrinsic( + client, + SudoCall::sudo { + call: Box::new( + GluttonCall::initialize_pallet { new_count: 5000, witness_count: None }.into(), + ), + }, + Alice.into(), + Some(last_nonce), + )); + last_nonce += 1; + } + + // Set compute weight that should be consumed per block + let set_compute = construct_extrinsic( + client, + SudoCall::sudo { + call: Box::new(GluttonCall::set_compute { compute: *compute_percent }.into()), + }, + Alice.into(), + Some(last_nonce), + ); + last_nonce += 1; + extrinsics.push(set_compute); + + // Set storage weight that should be consumed per block + let set_storage = construct_extrinsic( + client, + SudoCall::sudo { + call: Box::new(GluttonCall::set_storage { storage: *storage_percent }.into()), + }, + Alice.into(), + Some(last_nonce), + ); + extrinsics.push(set_storage); + + let mut block_builder = client.new_block(Default::default()).unwrap(); + block_builder.push(extrinsic_set_time(client)).unwrap(); + block_builder.push(extrinsic_set_validation_data(parent_header)).unwrap(); + for extrinsic in extrinsics { + block_builder.push(extrinsic.into()).unwrap(); + } + + let built_block = block_builder.build().unwrap(); + built_block.block +} diff --git a/test/service/src/chain_spec.rs b/test/service/src/chain_spec.rs index 5ae77084b6c..84604dffc64 100644 --- a/test/service/src/chain_spec.rs +++ b/test/service/src/chain_spec.rs @@ -80,12 +80,22 @@ where } /// Get the chain spec for a specific parachain ID. -pub fn get_chain_spec(id: ParaId) -> ChainSpec { +/// The given accounts are initialized with funds in addition +/// to the default known accounts. +pub fn get_chain_spec_with_extra_endowed( + id: ParaId, + extra_endowed_accounts: Vec, +) -> ChainSpec { ChainSpec::from_genesis( "Local Testnet", "local_testnet", ChainType::Local, - move || GenesisExt { runtime_genesis_config: local_testnet_genesis(), para_id: id }, + move || GenesisExt { + runtime_genesis_config: testnet_genesis_with_default_endowed( + extra_endowed_accounts.clone(), + ), + para_id: id, + }, Vec::new(), None, None, @@ -95,28 +105,36 @@ pub fn get_chain_spec(id: ParaId) -> ChainSpec { ) } +/// Get the chain spec for a specific parachain ID. +pub fn get_chain_spec(id: ParaId) -> ChainSpec { + get_chain_spec_with_extra_endowed(id, Default::default()) +} + /// Local testnet genesis for testing. -pub fn local_testnet_genesis() -> cumulus_test_runtime::GenesisConfig { - testnet_genesis( +pub fn testnet_genesis_with_default_endowed( + mut extra_endowed_accounts: Vec, +) -> cumulus_test_runtime::GenesisConfig { + let mut endowed = vec![ get_account_id_from_seed::("Alice"), - 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_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"), + ]; + endowed.append(&mut extra_endowed_accounts); + + testnet_genesis(get_account_id_from_seed::("Alice"), endowed) } -fn testnet_genesis( +/// Creates a local testnet genesis with endowed accounts. +pub fn testnet_genesis( root_key: AccountId, endowed_accounts: Vec, ) -> cumulus_test_runtime::GenesisConfig { @@ -126,6 +144,7 @@ fn testnet_genesis( .expect("WASM binary was not build, please build it!") .to_vec(), }, + glutton: Default::default(), parachain_system: Default::default(), balances: cumulus_test_runtime::BalancesConfig { balances: endowed_accounts.iter().cloned().map(|k| (k, 1 << 60)).collect(), diff --git a/test/service/src/lib.rs b/test/service/src/lib.rs index c97339f7fe9..20e7d7f1949 100644 --- a/test/service/src/lib.rs +++ b/test/service/src/lib.rs @@ -18,9 +18,13 @@ #![warn(missing_docs)] +/// Utilities used for benchmarking +pub mod bench_utils; + pub mod chain_spec; mod genesis; +use runtime::AccountId; use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; use std::{ future::Future, @@ -501,6 +505,7 @@ pub struct TestNodeBuilder { storage_update_func_relay_chain: Option>, consensus: Consensus, relay_chain_full_node_url: Vec, + endowed_accounts: Vec, } impl TestNodeBuilder { @@ -523,6 +528,7 @@ impl TestNodeBuilder { storage_update_func_relay_chain: None, consensus: Consensus::RelayChain, relay_chain_full_node_url: vec![], + endowed_accounts: Default::default(), } } @@ -629,6 +635,12 @@ impl TestNodeBuilder { self } + /// Accounts which will have an initial balance. + pub fn endowed_accounts(mut self, accounts: Vec) -> TestNodeBuilder { + self.endowed_accounts = accounts; + self + } + /// Build the [`TestNode`]. pub async fn build(self) -> TestNode { let parachain_config = node_config( @@ -639,6 +651,7 @@ impl TestNodeBuilder { self.parachain_nodes_exclusive, self.para_id, self.collator_key.is_some(), + self.endowed_accounts, ) .expect("could not generate Configuration"); @@ -692,12 +705,14 @@ pub fn node_config( nodes_exlusive: bool, para_id: ParaId, is_collator: bool, + endowed_accounts: Vec, ) -> Result { let base_path = BasePath::new_temp_dir()?; let root = base_path.path().join(format!("cumulus_test_service_{}", key)); let role = if is_collator { Role::Authority } else { Role::Full }; let key_seed = key.to_seed(); - let mut spec = Box::new(chain_spec::get_chain_spec(para_id)); + let mut spec = + Box::new(chain_spec::get_chain_spec_with_extra_endowed(para_id, endowed_accounts)); let mut storage = spec.as_storage_builder().build_storage().expect("could not build storage"); @@ -740,14 +755,15 @@ pub fn node_config( state_pruning: Some(PruningMode::ArchiveAll), blocks_pruning: BlocksPruning::KeepAll, chain_spec: spec, - wasm_method: WasmExecutionMethod::default(), - // NOTE: we enforce the use of the native runtime to make the errors more debuggable + wasm_method: WasmExecutionMethod::Compiled { + instantiation_strategy: sc_executor_wasmtime::InstantiationStrategy::PoolingCopyOnWrite, + }, execution_strategies: ExecutionStrategies { - syncing: sc_client_api::ExecutionStrategy::NativeWhenPossible, - importing: sc_client_api::ExecutionStrategy::NativeWhenPossible, - block_construction: sc_client_api::ExecutionStrategy::NativeWhenPossible, - offchain_worker: sc_client_api::ExecutionStrategy::NativeWhenPossible, - other: sc_client_api::ExecutionStrategy::NativeWhenPossible, + syncing: sc_client_api::ExecutionStrategy::AlwaysWasm, + importing: sc_client_api::ExecutionStrategy::AlwaysWasm, + block_construction: sc_client_api::ExecutionStrategy::AlwaysWasm, + offchain_worker: sc_client_api::ExecutionStrategy::AlwaysWasm, + other: sc_client_api::ExecutionStrategy::AlwaysWasm, }, rpc_addr: None, rpc_max_connections: Default::default(), From 3c674e14519faaeacf0cd30c4e11614c393e16a5 Mon Sep 17 00:00:00 2001 From: Just van Stam Date: Mon, 5 Jun 2023 18:07:02 +0200 Subject: [PATCH 273/339] companion for xcm alias origin (#2680) * companion for xcm alias origin * update lockfile for {"polkadot", "substrate"} * add benchmark function for runtimes --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 138 +++++++++--------- pallets/xcmp-queue/src/mock.rs | 1 + parachain-template/runtime/src/xcm_config.rs | 1 + .../assets/asset-hub-kusama/src/lib.rs | 4 + .../assets/asset-hub-kusama/src/xcm_config.rs | 1 + .../assets/asset-hub-polkadot/src/lib.rs | 4 + .../asset-hub-polkadot/src/xcm_config.rs | 1 + .../assets/asset-hub-westend/src/lib.rs | 4 + .../asset-hub-westend/src/xcm_config.rs | 1 + .../bridge-hubs/bridge-hub-kusama/src/lib.rs | 4 + .../bridge-hub-kusama/src/xcm_config.rs | 1 + .../bridge-hub-polkadot/src/lib.rs | 4 + .../bridge-hub-polkadot/src/xcm_config.rs | 1 + .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 4 + .../bridge-hub-rococo/src/xcm_config.rs | 1 + .../collectives-polkadot/src/xcm_config.rs | 1 + .../contracts-rococo/src/xcm_config.rs | 1 + .../glutton/glutton-kusama/src/xcm_config.rs | 1 + .../runtimes/starters/shell/src/xcm_config.rs | 1 + .../runtimes/testing/penpal/src/xcm_config.rs | 1 + .../testing/rococo-parachain/src/lib.rs | 1 + 21 files changed, 107 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 98b120fde48..1cf1a7b69a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5647,7 +5647,7 @@ dependencies = [ [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bitvec", "frame-benchmarking", @@ -5746,7 +5746,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "frame-support", "polkadot-primitives", @@ -8769,7 +8769,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -8790,7 +8790,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "frame-benchmarking", "frame-support", @@ -9401,7 +9401,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "futures", "polkadot-node-jaeger", @@ -9417,7 +9417,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -9431,7 +9431,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "derive_more", "fatality", @@ -9454,7 +9454,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "fatality", "futures", @@ -9475,7 +9475,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "clap", "frame-benchmarking-cli", @@ -9505,7 +9505,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "async-trait", "frame-benchmarking", @@ -9548,7 +9548,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "always-assert", "bitvec", @@ -9570,7 +9570,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "parity-scale-codec", "scale-info", @@ -9582,7 +9582,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "derive_more", "fatality", @@ -9607,7 +9607,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -9621,7 +9621,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "futures", "futures-timer", @@ -9641,7 +9641,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "always-assert", "async-trait", @@ -9664,7 +9664,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "futures", "parity-scale-codec", @@ -9682,7 +9682,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bitvec", "derive_more", @@ -9711,7 +9711,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bitvec", "futures", @@ -9732,7 +9732,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bitvec", "fatality", @@ -9751,7 +9751,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "futures", "polkadot-node-subsystem", @@ -9766,7 +9766,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "async-trait", "futures", @@ -9786,7 +9786,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "futures", "polkadot-node-metrics", @@ -9801,7 +9801,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "futures", "futures-timer", @@ -9818,7 +9818,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "fatality", "futures", @@ -9837,7 +9837,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "async-trait", "futures", @@ -9854,7 +9854,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bitvec", "fatality", @@ -9872,7 +9872,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "always-assert", "futures", @@ -9903,7 +9903,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "futures", "polkadot-node-primitives", @@ -9919,7 +9919,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "cpu-time", "futures", @@ -9942,7 +9942,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-execute-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "cpu-time", "futures", @@ -9962,7 +9962,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-prepare-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "futures", "libc", @@ -9985,7 +9985,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "futures", "lru 0.9.0", @@ -10000,7 +10000,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "lazy_static", "log", @@ -10018,7 +10018,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bs58", "futures", @@ -10037,7 +10037,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "async-channel", "async-trait", @@ -10060,7 +10060,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bounded-vec", "futures", @@ -10082,7 +10082,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -10092,7 +10092,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "async-trait", "futures", @@ -10110,7 +10110,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "async-trait", "derive_more", @@ -10133,7 +10133,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "async-trait", "derive_more", @@ -10166,7 +10166,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "async-trait", "futures", @@ -10189,7 +10189,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bounded-collections", "derive_more", @@ -10288,7 +10288,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -10306,7 +10306,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -10332,7 +10332,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -10364,7 +10364,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bitvec", "frame-benchmarking", @@ -10459,7 +10459,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bitvec", "frame-benchmarking", @@ -10505,7 +10505,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "frame-support", "polkadot-primitives", @@ -10519,7 +10519,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bs58", "parity-scale-codec", @@ -10531,7 +10531,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bitflags", "bitvec", @@ -10576,7 +10576,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -10686,7 +10686,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -10707,7 +10707,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -10717,7 +10717,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -10742,7 +10742,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bitvec", "frame-election-provider-support", @@ -10803,7 +10803,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "frame-benchmarking", "frame-system", @@ -11584,7 +11584,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -11671,7 +11671,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "frame-support", "polkadot-primitives", @@ -13538,7 +13538,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "enumn", "parity-scale-codec", @@ -14777,7 +14777,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "frame-support", "polkadot-primitives", @@ -15168,7 +15168,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -15179,7 +15179,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -16224,7 +16224,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bitvec", "frame-benchmarking", @@ -16317,7 +16317,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "frame-support", "polkadot-primitives", @@ -16751,7 +16751,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "bounded-collections", "derivative", @@ -16767,7 +16767,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "frame-support", "frame-system", @@ -16822,7 +16822,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "environmental", "frame-benchmarking", @@ -16842,7 +16842,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#99b093bcd034cf3b3733e10437a3f70378db1804" +source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" dependencies = [ "Inflector", "proc-macro2", diff --git a/pallets/xcmp-queue/src/mock.rs b/pallets/xcmp-queue/src/mock.rs index 873ab463cc9..d06da91bee3 100644 --- a/pallets/xcmp-queue/src/mock.rs +++ b/pallets/xcmp-queue/src/mock.rs @@ -168,6 +168,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = RuntimeCall; type SafeCallFilter = Everything; + type Aliasers = Nothing; } pub type XcmRouter = ( diff --git a/parachain-template/runtime/src/xcm_config.rs b/parachain-template/runtime/src/xcm_config.rs index 9eea16068d0..ff996d4dde3 100644 --- a/parachain-template/runtime/src/xcm_config.rs +++ b/parachain-template/runtime/src/xcm_config.rs @@ -135,6 +135,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = RuntimeCall; type SafeCallFilter = Everything; + type Aliasers = Nothing; } /// No local origins on this chain are allowed to dispatch XCM sends/executions. diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs index f6e2a32eda8..44d2a0145d3 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs @@ -1145,6 +1145,10 @@ impl_runtime_apis! { ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { Err(BenchmarkError::Skip) } + + fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } } type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs index ea4fcbfb012..41033468cd6 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs @@ -421,6 +421,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; } /// Converts a local signed origin into an XCM multilocation. diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs index 41e443941ed..fedb115323a 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs @@ -1158,6 +1158,10 @@ impl_runtime_apis! { ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { Err(BenchmarkError::Skip) } + + fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } } type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs index 0f12f5a99a2..564715ea22f 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs @@ -423,6 +423,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; } /// Converts a local signed origin into an XCM multilocation. diff --git a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 0d819abd844..3a83954e820 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -1187,6 +1187,10 @@ impl_runtime_apis! { ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { Err(BenchmarkError::Skip) } + + fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } } type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; diff --git a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index cf7968bf11e..401a40b434d 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -422,6 +422,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; } /// Local origins on this chain are allowed to dispatch XCM sends/executions. diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs index 86964af6ced..4f7c173a893 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -714,6 +714,10 @@ impl_runtime_apis! { ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { Err(BenchmarkError::Skip) } + + fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } } type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs index ed72909f0cb..4326e35de2b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs @@ -210,6 +210,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; } /// Converts a local signed origin into an XCM multilocation. diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs index fd284576da0..99706f2739a 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -714,6 +714,10 @@ impl_runtime_apis! { ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { Err(BenchmarkError::Skip) } + + fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } } type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs index 804c7455b5a..118b0c6d71b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs @@ -211,6 +211,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; } /// Converts a local signed origin into an XCM multilocation. diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index ef645b93b55..11bd50e6d3b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -982,6 +982,10 @@ impl_runtime_apis! { ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { Ok((RelayLocation::get(), NetworkId::Wococo, X1(Parachain(100)))) } + + fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } } type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index 371af54797b..ac1f1119392 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -257,6 +257,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; } /// Converts a local signed origin into an XCM multilocation. diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index 406209a4a4c..54013911433 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -244,6 +244,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; } /// Converts a local signed origin into an XCM multilocation. diff --git a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs index c386e8880c6..cc095c9229f 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs @@ -168,6 +168,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = RuntimeCall; type SafeCallFilter = Everything; + type Aliasers = Nothing; } /// Converts a local signed origin into an XCM multilocation. diff --git a/parachains/runtimes/glutton/glutton-kusama/src/xcm_config.rs b/parachains/runtimes/glutton/glutton-kusama/src/xcm_config.rs index 083ca592491..a09880f8cdc 100644 --- a/parachains/runtimes/glutton/glutton-kusama/src/xcm_config.rs +++ b/parachains/runtimes/glutton/glutton-kusama/src/xcm_config.rs @@ -83,6 +83,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = RuntimeCall; type SafeCallFilter = Everything; + type Aliasers = Nothing; } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/starters/shell/src/xcm_config.rs b/parachains/runtimes/starters/shell/src/xcm_config.rs index 8a7b3f21339..b1fcfc5c8f6 100644 --- a/parachains/runtimes/starters/shell/src/xcm_config.rs +++ b/parachains/runtimes/starters/shell/src/xcm_config.rs @@ -83,6 +83,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = RuntimeCall; type SafeCallFilter = Everything; + type Aliasers = Nothing; } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/parachains/runtimes/testing/penpal/src/xcm_config.rs b/parachains/runtimes/testing/penpal/src/xcm_config.rs index da1904c16c2..a8b33bfcd50 100644 --- a/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -294,6 +294,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = RuntimeCall; type SafeCallFilter = Everything; + type Aliasers = Nothing; } /// No local origins on this chain are allowed to dispatch XCM sends/executions. diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 59ea3dbf0ec..12dc462ef56 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -435,6 +435,7 @@ impl xcm_executor::Config for XcmConfig { type UniversalAliases = Nothing; type CallDispatcher = RuntimeCall; type SafeCallFilter = Everything; + type Aliasers = Nothing; } /// Local origins on this chain are allowed to dispatch XCM sends/executions. From bd11ef4824a5d865616dd1494bd2534bf9efc171 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 21:59:18 +0000 Subject: [PATCH 274/339] Bump clap from 4.3.1 to 4.3.2 (#2691) Bumps [clap](https://github.com/clap-rs/clap) from 4.3.1 to 4.3.2. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.3.1...v4.3.2) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- client/cli/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1cf1a7b69a7..2dfd62dd8ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1816,9 +1816,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ed2379f8603fa2b7509891660e802b88c70a79a6427a70abb5968054de2c28" +checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2" dependencies = [ "clap_builder", "clap_derive", @@ -1849,9 +1849,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.3.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e9ef9a08ee1c0e1f2e162121665ac45ac3783b0f897db7244ae75ad9a8f65b" +checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" dependencies = [ "heck", "proc-macro2", diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 747de1b1f4c..0feefa65b10 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -clap = { version = "4.3.1", features = ["derive"] } +clap = { version = "4.3.2", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.3.1" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index fb3d619335a..f7ac0563959 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" build = "build.rs" [dependencies] -clap = { version = "4.3.1", features = ["derive"] } +clap = { version = "4.3.2", features = ["derive"] } log = "0.4.18" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.163", features = ["derive"] } diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 9ee20c8beb5..2f643b875ff 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -12,7 +12,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.3.1", features = ["derive"] } +clap = { version = "4.3.2", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 49544cc4ae9..8d88bc38049 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -10,7 +10,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.3.1", features = ["derive"] } +clap = { version = "4.3.2", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } From f863fd161d4da6e0b7e4afde07bf91c5caf3b525 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 22:42:32 +0000 Subject: [PATCH 275/339] Bump url from 2.3.1 to 2.4.0 (#2694) Bumps [url](https://github.com/servo/rust-url) from 2.3.1 to 2.4.0. - [Release notes](https://github.com/servo/rust-url/releases) - [Commits](https://github.com/servo/rust-url/compare/v2.3.1...v2.4.0) --- updated-dependencies: - dependency-name: url dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 26 ++++++++++----------- client/cli/Cargo.toml | 2 +- client/network/Cargo.toml | 2 +- client/relay-chain-rpc-interface/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2dfd62dd8ab..661abf0dccf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4139,9 +4139,9 @@ dependencies = [ [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -5079,9 +5079,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -9243,9 +9243,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" @@ -15406,9 +15406,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" @@ -15418,9 +15418,9 @@ checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] @@ -15467,12 +15467,12 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", - "idna 0.3.0", + "idna 0.4.0", "percent-encoding", ] diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 0feefa65b10..7a0d766b8b1 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] clap = { version = "4.3.2", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } -url = "2.3.1" +url = "2.4.0" # Substrate sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index 3554a91225d..f8915beb82e 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -32,7 +32,7 @@ cumulus-relay-chain-interface = { path = "../relay-chain-interface" } [dev-dependencies] portpicker = "0.1.1" tokio = { version = "1.28.2", features = ["macros"] } -url = "2.3.1" +url = "2.4.0" # Substrate sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index ba319ca7f1b..4c4ab9a3023 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -29,7 +29,7 @@ parity-scale-codec = "3.5.0" jsonrpsee = { version = "0.16.2", features = ["ws-client"] } tracing = "0.1.37" async-trait = "0.1.68" -url = "2.3.1" +url = "2.4.0" serde_json = "1.0.96" serde = "1.0.163" lru = "0.9.0" diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 8d88bc38049..3b0b48955b9 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -18,7 +18,7 @@ rand = "0.8.5" serde = { version = "1.0.163", features = ["derive"] } tokio = { version = "1.28.2", features = ["macros"] } tracing = "0.1.37" -url = "2.3.1" +url = "2.4.0" tempfile = "3.5.0" # Substrate From 473569ef092e0553154ad2b84fc75518cd23a073 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 6 Jun 2023 11:21:29 +0200 Subject: [PATCH 276/339] Fix feature (#2690) Mea culpa... Signed-off-by: Oliver Tale-Yazdi --- parachain-template/node/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index f7ac0563959..4e257b9cb71 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -72,7 +72,6 @@ substrate-build-script-utils = { git = "https://github.com/paritytech/substrate" [features] default = [] runtime-benchmarks = [ - "try-runtime-cli/try-runtime", "parachain-template-runtime/runtime-benchmarks", "polkadot-cli/runtime-benchmarks", ] From f2d66a2382a438d9d447ffef33896343f57f3565 Mon Sep 17 00:00:00 2001 From: Muharem Ismailov Date: Tue, 6 Jun 2023 12:48:15 +0200 Subject: [PATCH 277/339] Runtime: Polkadot Fellowship promotion/demotion periods, members activity and salaries (#2607) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * core fellowship * core fellowship weights * salary * weights * fellowship pot * registration period 15 days * use treasury account for salary pay, promotion origin * decision period for tracks 30 days * docs * comment * Couple of fixes and some refactoring * Alter curves to be a bit more conservative * Use `PayOverXcm` for fellowship salary payments * Docs and remove unneeded code * Fixes * Move Fellowship stuff in line with whitepaper * fix: induction by a single Fellow (not proficient) * doc fix * renames, pallet index, allow unpaid for salary pallet * Fix budget units * Fixes * Test sovereign account for Fellowship salaries * Nice address test * Fixes * test for PayOverXcm setup * Update parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs Co-authored-by: Bastian Köcher --------- Co-authored-by: Gav Co-authored-by: Bastian Köcher --- Cargo.lock | 31 ++ Cargo.toml | 1 + .../collectives-polkadot/Cargo.toml | 39 ++ .../collectives-polkadot/src/lib.rs | 30 ++ .../src/tests/fellowship.rs | 80 ++++ .../collectives-polkadot/src/tests/mod.rs | 17 + .../assets/asset-hub-kusama/src/xcm_config.rs | 13 +- .../asset-hub-polkadot/src/xcm_config.rs | 38 +- .../collectives-polkadot/Cargo.toml | 8 + .../collectives-polkadot/src/constants.rs | 4 +- .../src/fellowship/mod.rs | 196 ++++++--- .../src/fellowship/origins.rs | 114 ++++-- .../src/fellowship/tracks.rs | 379 ++++++++++++++---- .../collectives-polkadot/src/impls.rs | 20 + .../collectives-polkadot/src/lib.rs | 10 +- .../collectives-polkadot/src/weights/mod.rs | 2 + .../src/weights/pallet_core_fellowship.rs | 222 ++++++++++ .../src/weights/pallet_salary.rs | 140 +++++++ .../collectives-polkadot/src/xcm_config.rs | 10 + 19 files changed, 1177 insertions(+), 177 deletions(-) create mode 100644 parachains/integration-tests/emulated/collectives/collectives-polkadot/Cargo.toml create mode 100644 parachains/integration-tests/emulated/collectives/collectives-polkadot/src/lib.rs create mode 100644 parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/fellowship.rs create mode 100644 parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/mod.rs create mode 100644 parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_core_fellowship.rs create mode 100644 parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_salary.rs diff --git a/Cargo.lock b/Cargo.lock index 661abf0dccf..8e0d708c557 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1887,6 +1887,35 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "collectives-polkadot-it" +version = "0.1.0" +dependencies = [ + "asset-hub-polkadot-runtime", + "collectives-polkadot-runtime", + "cumulus-pallet-xcmp-queue", + "frame-support", + "frame-system", + "integration-tests-common", + "pallet-assets", + "pallet-balances", + "pallet-core-fellowship", + "pallet-salary", + "pallet-xcm", + "parachains-common", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-runtime", + "polkadot-runtime-parachains", + "sp-core", + "sp-runtime", + "sp-weights", + "xcm", + "xcm-emulator", + "xcm-executor", +] + [[package]] name = "collectives-polkadot-runtime" version = "1.0.0" @@ -1915,11 +1944,13 @@ dependencies = [ "pallet-balances", "pallet-collator-selection", "pallet-collective", + "pallet-core-fellowship", "pallet-multisig", "pallet-preimage", "pallet-proxy", "pallet-ranked-collective", "pallet-referenda", + "pallet-salary", "pallet-scheduler", "pallet-session", "pallet-timestamp", diff --git a/Cargo.toml b/Cargo.toml index 31cfd84550b..77b32019681 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,6 +56,7 @@ members = [ "parachains/integration-tests/emulated/assets/asset-hub-kusama", "parachains/integration-tests/emulated/assets/asset-hub-polkadot", "parachains/integration-tests/emulated/assets/asset-hub-westend", + "parachains/integration-tests/emulated/collectives/collectives-polkadot", "test/client", "test/relay-sproof-builder", "test/relay-validation-worker-provider", diff --git a/parachains/integration-tests/emulated/collectives/collectives-polkadot/Cargo.toml b/parachains/integration-tests/emulated/collectives/collectives-polkadot/Cargo.toml new file mode 100644 index 00000000000..b836994e5f8 --- /dev/null +++ b/parachains/integration-tests/emulated/collectives/collectives-polkadot/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "collectives-polkadot-it" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +description = "Polkadot Collectives parachain runtime integration tests based on xcm-emulator" + +[dev-dependencies] +codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } + +# Substrate +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-core-fellowship = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-salary = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } + +# Polkadot +polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } +polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } +xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } +pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } + +# Cumulus +parachains-common = { path = "../../../../common" } +cumulus-pallet-xcmp-queue = { default-features = false, path = "../../../../../pallets/xcmp-queue" } +collectives-polkadot-runtime = { path = "../../../../runtimes/collectives/collectives-polkadot" } +asset-hub-polkadot-runtime = { path = "../../../../runtimes/assets/asset-hub-polkadot" } + +# Local +xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } +integration-tests-common = { default-features = false, path = "../../common" } diff --git a/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/lib.rs b/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/lib.rs new file mode 100644 index 00000000000..d83ddfffd99 --- /dev/null +++ b/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/lib.rs @@ -0,0 +1,30 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Collectives Parachain integration tests based on xcm-emulator. + +#![cfg(test)] + +pub use frame_support::assert_ok; +pub use integration_tests_common::{ + constants::accounts::ALICE, AccountId, AssetHubPolkadot as AssetHub, + AssetHubPolkadotPallet as AssetHubPallet, Collectives, CollectivesPallet, Polkadot, + PolkadotMockNet, +}; +pub use xcm::prelude::*; +pub use xcm_emulator::{assert_expected_events, Parachain}; + +mod tests; diff --git a/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/fellowship.rs b/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/fellowship.rs new file mode 100644 index 00000000000..778eb92c7d1 --- /dev/null +++ b/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/fellowship.rs @@ -0,0 +1,80 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Integration tests concerning the Fellowship. + +use crate::*; +use collectives_polkadot_runtime::fellowship::FellowshipSalaryPaymaster; +use frame_support::traits::{ + fungibles::{Create, Mutate}, + tokens::Pay, +}; +use sp_core::crypto::Ss58Codec; +use xcm_emulator::{Network, TestExt}; + +#[test] +fn pay_salary() { + let asset_id: u32 = 1984; + let pay_from: AccountId = + ::from_string("13w7NdvSR1Af8xsQTArDtZmVvjE8XhWNdL4yed3iFHrUNCnS") + .unwrap(); + let pay_to = Polkadot::account_id_of(ALICE); + let pay_amount = 9000; + + PolkadotMockNet::_init(); + PolkadotMockNet::reset(); + + AssetHub::execute_with(|| { + type AssetHubAssets = ::Assets; + + assert_ok!(>::create( + asset_id, + pay_to.clone(), + true, + pay_amount / 2 + )); + assert_ok!(>::mint_into(asset_id, &pay_from, pay_amount * 2)); + }); + + Collectives::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_ok!(FellowshipSalaryPaymaster::pay(&pay_to, (), pay_amount)); + assert_expected_events!( + Collectives, + vec![ + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, + ] + ); + }); + + AssetHub::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + AssetHub, + vec![ + RuntimeEvent::Assets(pallet_assets::Event::Transferred { asset_id: id, from, to, amount }) => { + asset_id: id == &asset_id, + from: from == &pay_from, + to: to == &pay_to, + amount: amount == &pay_amount, + }, + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::Success { .. }) => {}, + ] + ); + }); +} diff --git a/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/mod.rs b/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/mod.rs new file mode 100644 index 00000000000..1ede78b5979 --- /dev/null +++ b/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/mod.rs @@ -0,0 +1,17 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +mod fellowship; diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs index 41033468cd6..49fd807b6f4 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs @@ -34,11 +34,12 @@ use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FungiblesAdapter, IsConcrete, - LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, - SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, - UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + DenyReserveTransferToRelayChain, DenyThenTry, DescribeAllTerminal, DescribeFamily, + EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NativeAsset, + NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -66,6 +67,8 @@ pub type LocationToAccountId = ( SiblingParachainConvertsVia, // Straight up local `AccountId32` origins just alias directly to `AccountId`. AccountId32Aliases, + // Foreign locations alias into accounts according to a hash of their standard description. + HashedDescription>, ); /// Means for transacting the native currency on this chain. diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs index 564715ea22f..956ada5ac3b 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs @@ -34,11 +34,12 @@ use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FungiblesAdapter, IsConcrete, - LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, - SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, - WeightInfoBounds, WithComputedOrigin, + DenyReserveTransferToRelayChain, DenyThenTry, DescribeFamily, DescribePalletTerminal, + EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NativeAsset, + NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, + WithComputedOrigin, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -66,6 +67,9 @@ pub type LocationToAccountId = ( SiblingParachainConvertsVia, // Straight up local `AccountId32` origins just alias directly to `AccountId`. AccountId32Aliases, + // Foreign chain account alias into local accounts according to a hash of their standard + // description. + HashedDescription>, ); /// Means for transacting the native currency on this chain. @@ -177,6 +181,9 @@ match_types! { pub type FellowsPlurality: impl Contains = { MultiLocation { parents: 1, interior: X2(Parachain(1001), Plurality { id: BodyId::Technical, ..}) } }; + pub type FellowshipSalaryPallet: impl Contains = { + MultiLocation { parents: 1, interior: X2(Parachain(1001), PalletInstance(64)) } + }; } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -355,7 +362,11 @@ pub type Barrier = DenyThenTry< // If the message is one that immediately attemps to pay for execution, then allow it. AllowTopLevelPaidExecutionFrom, // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality get free execution. - AllowExplicitUnpaidExecutionFrom<(ParentOrParentsPlurality, FellowsPlurality)>, + AllowExplicitUnpaidExecutionFrom<( + ParentOrParentsPlurality, + FellowsPlurality, + FellowshipSalaryPallet, + )>, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, ), @@ -498,3 +509,18 @@ impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { MultiLocation { parents: 1, interior: X1(Parachain(id)) } } } + +#[test] +fn foreign_pallet_has_correct_local_account() { + use sp_core::crypto::{Ss58AddressFormat, Ss58Codec}; + use xcm_executor::traits::ConvertLocation; + + const COLLECTIVES_PARAID: u32 = 1001; + const FELLOWSHIP_SALARY_PALLET_ID: u8 = 64; + let fellowship_salary = + (Parent, Parachain(COLLECTIVES_PARAID), PalletInstance(FELLOWSHIP_SALARY_PALLET_ID)); + let account = LocationToAccountId::convert_location(&fellowship_salary.into()).unwrap(); + let polkadot = Ss58AddressFormat::try_from("polkadot").unwrap(); + let address = Ss58Codec::to_ss58check_with_version(&account, polkadot); + assert_eq!(address, "13w7NdvSR1Af8xsQTArDtZmVvjE8XhWNdL4yed3iFHrUNCnS"); +} diff --git a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml index 704876bc8b2..0c80f4a217d 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml +++ b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml @@ -36,6 +36,8 @@ pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/parityt pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-referenda = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-ranked-collective = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-core-fellowship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-salary = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-arithmetic = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -103,6 +105,8 @@ runtime-benchmarks = [ "pallet-preimage/runtime-benchmarks", "pallet-referenda/runtime-benchmarks", "pallet-ranked-collective/runtime-benchmarks", + "pallet-core-fellowship/runtime-benchmarks", + "pallet-salary/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", @@ -131,6 +135,8 @@ try-runtime = [ "pallet-preimage/try-runtime", "pallet-referenda/try-runtime", "pallet-ranked-collective/try-runtime", + "pallet-core-fellowship/try-runtime", + "pallet-salary/try-runtime", ] std = [ "codec/std", @@ -187,4 +193,6 @@ std = [ "pallet-referenda/std", "pallet-ranked-collective/std", "substrate-wasm-builder", + "pallet-core-fellowship/std", + "pallet-salary/std", ] diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/constants.rs b/parachains/runtimes/collectives/collectives-polkadot/src/constants.rs index 836235345ef..8d0325844cc 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/constants.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/constants.rs @@ -16,8 +16,8 @@ pub mod account { use frame_support::PalletId; - /// Relay Chain treasury pallet id, used to convert into AccountId - pub const RELAY_TREASURY_PALLET_ID: PalletId = PalletId(*b"py/trsry"); + /// Polkadot treasury pallet id, used to convert into AccountId + pub const POLKADOT_TREASURY_PALLET_ID: PalletId = PalletId(*b"py/trsry"); /// Alliance pallet ID. /// It is used as a temporarily place to deposit a slashed imbalance /// before the teleport to the Treasury. diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs index 22926d1d27d..c8442c7c430 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs @@ -19,42 +19,38 @@ pub(crate) mod migration; mod origins; mod tracks; +use cumulus_primitives_core::Junction::GeneralIndex; +use frame_system::EnsureNever; pub use origins::{ - pallet_origins as pallet_fellowship_origins, Fellows, FellowshipCandidates, FellowshipExperts, - FellowshipMasters, + pallet_origins as pallet_fellowship_origins, Architects, EnsureCanPromoteTo, EnsureCanRetainAt, + EnsureFellowship, Fellows, Masters, Members, }; +use xcm_builder::{AliasesIntoAccountId32, LocatableAssetId, PayOverXcm}; use crate::{ - constants, impls::ToParentTreasury, weights, AccountId, Balance, Balances, BlockNumber, - FellowshipReferenda, GovernanceLocation, Preimage, RelayTreasuryAccount, Runtime, RuntimeCall, - RuntimeEvent, Scheduler, DAYS, + constants, impls::ToParentTreasury, weights, AccountId, Balance, Balances, FellowshipReferenda, + GovernanceLocation, PolkadotTreasuryAccount, Preimage, Runtime, RuntimeCall, RuntimeEvent, + Scheduler, DAYS, }; use frame_support::{ parameter_types, - traits::{EitherOf, MapSuccess, TryMapSuccess}, + traits::{EitherOf, EitherOfDiverse, MapSuccess}, }; use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; -use polkadot_runtime_constants::xcm::body::FELLOWSHIP_ADMIN_INDEX; -use sp_arithmetic::traits::CheckedSub; -use sp_core::ConstU32; -use sp_runtime::{ - morph_types, - traits::{AccountIdConversion, ConstU16, Replace, TypedGet}, -}; +use polkadot_runtime_constants::{time::HOURS, xcm::body::FELLOWSHIP_ADMIN_INDEX}; +use sp_core::{ConstU128, ConstU32}; +use sp_runtime::traits::{AccountIdConversion, ConstU16, ConvertToValue, Replace}; use xcm::latest::BodyId; -use self::origins::EnsureFellowship; - /// The Fellowship members' ranks. pub mod ranks { use pallet_ranked_collective::Rank; - pub const CANDIDATES: Rank = 0; - pub const DAN_1: Rank = 1; + pub const DAN_1: Rank = 1; // aka Members. pub const DAN_2: Rank = 2; pub const DAN_3: Rank = 3; // aka Fellows. - pub const DAN_4: Rank = 4; - pub const DAN_5: Rank = 5; // aka Experts. + pub const DAN_4: Rank = 4; // aka Architects. + pub const DAN_5: Rank = 5; pub const DAN_6: Rank = 6; pub const DAN_7: Rank = 7; // aka Masters. pub const DAN_8: Rank = 8; @@ -62,9 +58,6 @@ pub mod ranks { } parameter_types! { - pub const AlarmInterval: BlockNumber = 1; - pub const SubmissionDeposit: Balance = 0; - pub const UndecidingTimeout: BlockNumber = 7 * DAYS; // Referenda pallet account, used to temporarily deposit slashed imbalance before teleporting. pub ReferendaPalletAccount: AccountId = constants::account::REFERENDA_PALLET_ID.into_account_truncating(); pub const FellowshipAdminBodyId: BodyId = BodyId::Index(FELLOWSHIP_ADMIN_INDEX); @@ -80,63 +73,146 @@ impl pallet_referenda::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Scheduler = Scheduler; type Currency = Balances; + // Fellows can submit proposals. type SubmitOrigin = - pallet_ranked_collective::EnsureMember; - type CancelOrigin = FellowshipExperts; - type KillOrigin = FellowshipMasters; - type Slash = ToParentTreasury; + pallet_ranked_collective::EnsureMember; + type CancelOrigin = Architects; + type KillOrigin = Masters; + type Slash = ToParentTreasury; type Votes = pallet_ranked_collective::Votes; type Tally = pallet_ranked_collective::TallyOf; - type SubmissionDeposit = SubmissionDeposit; + type SubmissionDeposit = ConstU128<0>; type MaxQueued = ConstU32<100>; - type UndecidingTimeout = UndecidingTimeout; - type AlarmInterval = AlarmInterval; + type UndecidingTimeout = ConstU32<{ 7 * DAYS }>; + type AlarmInterval = ConstU32<1>; type Tracks = tracks::TracksInfo; type Preimages = Preimage; } pub type FellowshipCollectiveInstance = pallet_ranked_collective::Instance1; -morph_types! { - /// A `TryMorph` implementation to reduce a scalar by a particular amount, checking for - /// underflow. - pub type CheckedReduceBy: TryMorph = |r: N::Type| -> Result { - r.checked_sub(&N::get()).ok_or(()) - } where N::Type: CheckedSub; -} - impl pallet_ranked_collective::Config for Runtime { type WeightInfo = weights::pallet_ranked_collective::WeightInfo; type RuntimeEvent = RuntimeEvent; - // Promotion is by any of: - // - Root can promote arbitrarily. - // - the FellowshipAdmin origin (i.e. token holder referendum); - // - a vote by the rank *above* the new rank. - type PromoteOrigin = EitherOf< - frame_system::EnsureRootWithSuccess>, - EitherOf< - MapSuccess< - EnsureXcm>, - Replace>, - >, - TryMapSuccess>>, - >, - >; + // Promotions and the induction of new members are serviced by `FellowshipCore` pallet instance. + type PromoteOrigin = EnsureNever; // Demotion is by any of: // - Root can demote arbitrarily. // - the FellowshipAdmin origin (i.e. token holder referendum); - // - a vote by the rank two above the current rank. type DemoteOrigin = EitherOf< - frame_system::EnsureRootWithSuccess>, - EitherOf< - MapSuccess< - EnsureXcm>, - Replace>, - >, - TryMapSuccess>>, + frame_system::EnsureRootWithSuccess>, + MapSuccess< + EnsureXcm>, + Replace>, >, >; type Polls = FellowshipReferenda; - type MinRankOfClass = sp_runtime::traits::Identity; + type MinRankOfClass = tracks::MinRankOfClass; type VoteWeight = pallet_ranked_collective::Geometric; } + +pub type FellowshipCoreInstance = pallet_core_fellowship::Instance1; + +impl pallet_core_fellowship::Config for Runtime { + type WeightInfo = weights::pallet_core_fellowship::WeightInfo; + type RuntimeEvent = RuntimeEvent; + type Members = pallet_ranked_collective::Pallet; + type Balance = Balance; + // Parameters are set by any of: + // - Root; + // - the FellowshipAdmin origin (i.e. token holder referendum); + // - a vote among all Fellows. + type ParamsOrigin = EitherOfDiverse< + EnsureXcm>, + Fellows, + >; + // Induction (creating a candidate) is by any of: + // - Root; + // - the FellowshipAdmin origin (i.e. token holder referendum); + // - a single Fellow; + // - a vote among all Members. + type InductOrigin = EitherOfDiverse< + EnsureXcm>, + EitherOfDiverse< + pallet_ranked_collective::EnsureMember< + Runtime, + FellowshipCollectiveInstance, + { ranks::DAN_3 }, + >, + Members, + >, + >; + // Approval (rank-retention) of a Member's current rank is by any of: + // - Root; + // - the FellowshipAdmin origin (i.e. token holder referendum); + // - a vote by the rank two above the current rank for all retention up to the Master rank. + type ApproveOrigin = EitherOf< + MapSuccess< + EnsureXcm>, + Replace>, + >, + EnsureCanRetainAt, + >; + // Promotion is by any of: + // - Root can promote arbitrarily. + // - the FellowshipAdmin origin (i.e. token holder referendum); + // - a vote by the rank two above the new rank for all promotions up to the Master rank. + type PromoteOrigin = EitherOf< + MapSuccess< + EnsureXcm>, + Replace>, + >, + EnsureCanPromoteTo, + >; + type EvidenceSize = ConstU32<65536>; +} + +pub type FellowshipSalaryInstance = pallet_salary::Instance1; + +use xcm::prelude::*; + +parameter_types! { + pub AssetHub: MultiLocation = (Parent, Parachain(1000)).into(); + pub AssetHubUsdtId: AssetId = (PalletInstance(50), GeneralIndex(1984)).into(); + pub UsdtAsset: LocatableAssetId = LocatableAssetId { + location: AssetHub::get(), + asset_id: AssetHubUsdtId::get(), + }; + // The interior location on AssetHub for the paying account. This is the Fellowship Salary + // pallet instance (which sits at index 64). This sovereign account will need funding. + pub Interior: InteriorMultiLocation = PalletInstance(64).into(); +} + +const USDT_UNITS: u128 = 1_000_000; + +/// [`PayOverXcm`] setup to pay the Fellowship salary on the AssetHub in USDT. +pub type FellowshipSalaryPaymaster = PayOverXcm< + Interior, + crate::xcm_config::XcmRouter, + crate::PolkadotXcm, + ConstU32<{ 6 * HOURS }>, + AccountId, + (), + ConvertToValue, + AliasesIntoAccountId32<(), AccountId>, +>; + +impl pallet_salary::Config for Runtime { + type WeightInfo = weights::pallet_salary::WeightInfo; + type RuntimeEvent = RuntimeEvent; + type Paymaster = FellowshipSalaryPaymaster; + type Members = pallet_ranked_collective::Pallet; + + #[cfg(not(feature = "runtime-benchmarks"))] + type Salary = pallet_core_fellowship::Pallet; + #[cfg(feature = "runtime-benchmarks")] + type Salary = frame_support::traits::tokens::ConvertRank< + crate::impls::benchmarks::RankToSalary, + >; + // 15 days to register for a salary payment. + type RegistrationPeriod = ConstU32<{ 15 * DAYS }>; + // 15 days to claim the salary payment. + type PayoutPeriod = ConstU32<{ 15 * DAYS }>; + // Total monthly salary budget. + type Budget = ConstU128<{ 100_000 * USDT_UNITS }>; +} diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/origins.rs b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/origins.rs index db778f38cb4..4842f64d485 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/origins.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/origins.rs @@ -34,32 +34,62 @@ pub mod pallet_origins { #[derive(PartialEq, Eq, Clone, MaxEncodedLen, Encode, Decode, TypeInfo, RuntimeDebug)] #[pallet::origin] pub enum Origin { - /// Origin commanded by any members of the Polkadot Fellowship (no Dan grade needed). - FellowshipCandidates, - /// Origin commanded by Polkadot Fellows (3rd Dan fellows or greater). - Fellows, - /// Origin commanded by Polkadot Experts (5th Dan fellows or greater). - FellowshipExperts, - /// Origin commanded by Polkadot Masters (7th Dan fellows of greater). - FellowshipMasters, - /// Origin commanded by rank 1 of the Polkadot Fellowship and with a success of 1. - Fellowship1Dan, - /// Origin commanded by rank 2 of the Polkadot Fellowship and with a success of 2. + /// Origin aggregated through weighted votes of those with rank 1 or above; `Success` is 1. + Members, + /// Origin aggregated through weighted votes of those with rank 2 or above; `Success` is 2. Fellowship2Dan, - /// Origin commanded by rank 3 of the Polkadot Fellowship and with a success of 3. - Fellowship3Dan, - /// Origin commanded by rank 4 of the Polkadot Fellowship and with a success of 4. - Fellowship4Dan, - /// Origin commanded by rank 5 of the Polkadot Fellowship and with a success of 5. + /// Origin aggregated through weighted votes of those with rank 3 or above; `Success` is 3. + Fellows, + /// Origin aggregated through weighted votes of those with rank 4 or above; `Success` is 4. + Architects, + /// Origin aggregated through weighted votes of those with rank 5 or above; `Success` is 5. Fellowship5Dan, - /// Origin commanded by rank 6 of the Polkadot Fellowship and with a success of 6. + /// Origin aggregated through weighted votes of those with rank 6 or above; `Success` is 6. Fellowship6Dan, - /// Origin commanded by rank 7 of the Polkadot Fellowship and with a success of 7. - Fellowship7Dan, - /// Origin commanded by rank 8 of the Polkadot Fellowship and with a success of 8. + /// Origin aggregated through weighted votes of those with rank 7 or above; `Success` is 7. + Masters, + /// Origin aggregated through weighted votes of those with rank 8 or above; `Success` is 8. Fellowship8Dan, - /// Origin commanded by rank 9 of the Polkadot Fellowship and with a success of 9. + /// Origin aggregated through weighted votes of those with rank 9 or above; `Success` is 9. Fellowship9Dan, + + /// Origin aggregated through weighted votes of those with rank 3 or above when voting on + /// a fortnight-long track; `Success` is 1. + RetainAt1Dan, + /// Origin aggregated through weighted votes of those with rank 4 or above when voting on + /// a fortnight-long track; `Success` is 2. + RetainAt2Dan, + /// Origin aggregated through weighted votes of those with rank 5 or above when voting on + /// a fortnight-long track; `Success` is 3. + RetainAt3Dan, + /// Origin aggregated through weighted votes of those with rank 6 or above when voting on + /// a fortnight-long track; `Success` is 4. + RetainAt4Dan, + /// Origin aggregated through weighted votes of those with rank 7 or above when voting on + /// a fortnight-long track; `Success` is 5. + RetainAt5Dan, + /// Origin aggregated through weighted votes of those with rank 8 or above when voting on + /// a fortnight-long track; `Success` is 6. + RetainAt6Dan, + + /// Origin aggregated through weighted votes of those with rank 3 or above when voting on + /// a month-long track; `Success` is 1. + PromoteTo1Dan, + /// Origin aggregated through weighted votes of those with rank 4 or above when voting on + /// a month-long track; `Success` is 2. + PromoteTo2Dan, + /// Origin aggregated through weighted votes of those with rank 5 or above when voting on + /// a month-long track; `Success` is 3. + PromoteTo3Dan, + /// Origin aggregated through weighted votes of those with rank 6 or above when voting on + /// a month-long track; `Success` is 4. + PromoteTo4Dan, + /// Origin aggregated through weighted votes of those with rank 7 or above when voting on + /// a month-long track; `Success` is 5. + PromoteTo5Dan, + /// Origin aggregated through weighted votes of those with rank 8 or above when voting on + /// a month-long track; `Success` is 6. + PromoteTo6Dan, } macro_rules! decl_unit_ensures { @@ -93,10 +123,10 @@ pub mod pallet_origins { () => {} } decl_unit_ensures!( - FellowshipCandidates: Rank = ranks::CANDIDATES, + Members: Rank = ranks::DAN_1, Fellows: Rank = ranks::DAN_3, - FellowshipExperts: Rank = ranks::DAN_5, - FellowshipMasters: Rank = ranks::DAN_7, + Architects: Rank = ranks::DAN_4, + Masters: Rank = ranks::DAN_7, ); macro_rules! decl_ensure { @@ -132,17 +162,45 @@ pub mod pallet_origins { } } + // Fellowship origin indicating weighted voting from at least the rank of `Success` on a + // week-long track. decl_ensure! { pub type EnsureFellowship: EnsureOrigin { - Fellowship1Dan = ranks::DAN_1, + Members = ranks::DAN_1, Fellowship2Dan = ranks::DAN_2, - Fellowship3Dan = ranks::DAN_3, - Fellowship4Dan = ranks::DAN_4, + Fellows = ranks::DAN_3, + Architects = ranks::DAN_4, Fellowship5Dan = ranks::DAN_5, Fellowship6Dan = ranks::DAN_6, - Fellowship7Dan = ranks::DAN_7, + Masters = ranks::DAN_7, Fellowship8Dan = ranks::DAN_8, Fellowship9Dan = ranks::DAN_9, } } + + // Fellowship origin indicating weighted voting from at least the rank of `Success + 2` on + // a fortnight-long track; needed for Fellowship retention voting. + decl_ensure! { + pub type EnsureCanRetainAt: EnsureOrigin { + RetainAt1Dan = ranks::DAN_1, + RetainAt2Dan = ranks::DAN_2, + RetainAt3Dan = ranks::DAN_3, + RetainAt4Dan = ranks::DAN_4, + RetainAt5Dan = ranks::DAN_5, + RetainAt6Dan = ranks::DAN_6, + } + } + + // Fellowship origin indicating weighted voting from at least the rank of `Success + 2` on + // a month-long track; needed for Fellowship promotion voting. + decl_ensure! { + pub type EnsureCanPromoteTo: EnsureOrigin { + PromoteTo1Dan = ranks::DAN_1, + PromoteTo2Dan = ranks::DAN_2, + PromoteTo3Dan = ranks::DAN_3, + PromoteTo4Dan = ranks::DAN_4, + PromoteTo5Dan = ranks::DAN_5, + PromoteTo6Dan = ranks::DAN_6, + } + } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/tracks.rs b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/tracks.rs index 1f728279485..d10a5273e3f 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/tracks.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/tracks.rs @@ -16,8 +16,9 @@ //! Track configurations for Fellowship. -use crate::{Balance, BlockNumber, RuntimeOrigin, DAYS, DOLLARS, MINUTES}; -use sp_runtime::Perbill; +use crate::{Balance, BlockNumber, RuntimeOrigin, DAYS, DOLLARS, HOURS, MINUTES}; +use pallet_ranked_collective::Rank; +use sp_runtime::{traits::Convert, Perbill}; /// Referendum `TrackId` type. pub type TrackId = u16; @@ -26,57 +27,105 @@ pub type TrackId = u16; pub mod constants { use super::TrackId; - pub const CANDIDATES: TrackId = 0; + // Regular tracks (7 days) used for general operations. The required rank for voting is the + // same as that which is named (and also the track ID). pub const MEMBERS: TrackId = 1; pub const PROFICIENTS: TrackId = 2; pub const FELLOWS: TrackId = 3; - pub const SENIOR_FELLOWS: TrackId = 4; - pub const EXPERTS: TrackId = 5; - pub const SENIOR_EXPERTS: TrackId = 6; + pub const ARCHITECTS: TrackId = 4; + pub const ARCHITECTS_ADEPT: TrackId = 5; + pub const GRAND_ARCHITECTS: TrackId = 6; pub const MASTERS: TrackId = 7; - pub const SENIOR_MASTERS: TrackId = 8; + pub const MASTERS_CONSTANT: TrackId = 8; pub const GRAND_MASTERS: TrackId = 9; + + // Longer tracks (14 days) used for rank retention. These require a rank of two more than the + // grade at which they retain (as per the whitepaper). This works out as the track ID minus 8. + pub const RETAIN_AT_1DAN: TrackId = 11; + pub const RETAIN_AT_2DAN: TrackId = 12; + pub const RETAIN_AT_3DAN: TrackId = 13; + pub const RETAIN_AT_4DAN: TrackId = 14; + pub const RETAIN_AT_5DAN: TrackId = 15; + pub const RETAIN_AT_6DAN: TrackId = 16; + + // Longest tracks (30 days) used for promotions. These require a rank of two more than the + // grade to which they promote (as per the whitepaper). This works out as the track ID minus 18. + pub const PROMOTE_TO_1DAN: TrackId = 21; + pub const PROMOTE_TO_2DAN: TrackId = 22; + pub const PROMOTE_TO_3DAN: TrackId = 23; + pub const PROMOTE_TO_4DAN: TrackId = 24; + pub const PROMOTE_TO_5DAN: TrackId = 25; + pub const PROMOTE_TO_6DAN: TrackId = 26; +} + +/// Convert the track ID (defined above) into the minimum rank (i.e. fellowship Dan grade) required +/// to vote on the track. +pub struct MinRankOfClass; +impl Convert for MinRankOfClass { + fn convert(a: TrackId) -> Rank { + match a { + // Just a regular vote: the track ID is conveniently the same as the minimum rank. + regular @ 1..=9 => regular, + // A retention vote; the track ID turns out to be 8 more than the minimum required rank. + retention @ 11..=16 => retention - 8, + // A promotion vote; the track ID turns out to be 18 more than the minimum required rank. + promotion @ 21..=26 => promotion - 18, + _ => Rank::max_value(), + } + } } +const RETAIN_MAX_DECIDING: u32 = 25; +const RETAIN_DECISION_DEPOSIT: Balance = 5 * DOLLARS; +const RETAIN_PREPARE_PERIOD: BlockNumber = 0; +const RETAIN_DECISION_PERIOD: BlockNumber = 14 * DAYS; +const RETAIN_CONFIRM_PERIOD: BlockNumber = 1 * HOURS; +const RETAIN_MIN_ENACTMENT_PERIOD: BlockNumber = 0; +const RETAIN_MIN_APPROVAL: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing { + length: Perbill::from_percent(100), + floor: Perbill::from_percent(60), + ceil: Perbill::from_percent(100), +}; +const RETAIN_MIN_SUPPORT: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing { + length: Perbill::from_percent(100), + floor: Perbill::from_percent(10), + ceil: Perbill::from_percent(100), +}; + +const PROMOTE_MAX_DECIDING: u32 = 10; +const PROMOTE_DECISION_DEPOSIT: Balance = 5 * DOLLARS; +const PROMOTE_PREPARE_PERIOD: BlockNumber = 0; +const PROMOTE_DECISION_PERIOD: BlockNumber = 30 * DAYS; +const PROMOTE_CONFIRM_PERIOD: BlockNumber = 1 * HOURS; +const PROMOTE_MIN_ENACTMENT_PERIOD: BlockNumber = 0; +const PROMOTE_MIN_APPROVAL: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing { + length: Perbill::from_percent(100), + floor: Perbill::from_percent(60), + ceil: Perbill::from_percent(100), +}; +const PROMOTE_MIN_SUPPORT: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing { + length: Perbill::from_percent(100), + floor: Perbill::from_percent(10), + ceil: Perbill::from_percent(100), +}; + pub struct TracksInfo; impl pallet_referenda::TracksInfo for TracksInfo { type Id = TrackId; type RuntimeOrigin = ::PalletsOrigin; fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo)] { use constants as tracks; - static DATA: [(TrackId, pallet_referenda::TrackInfo); 10] = [ - ( - tracks::CANDIDATES, - pallet_referenda::TrackInfo { - name: "candidates", - max_deciding: 10, - decision_deposit: 100 * DOLLARS, - prepare_period: 30 * MINUTES, - decision_period: 7 * DAYS, - confirm_period: 30 * MINUTES, - min_enactment_period: MINUTES, - min_approval: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(50), - ceil: Perbill::from_percent(100), - }, - min_support: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(50), - }, - }, - ), + static DATA: [(TrackId, pallet_referenda::TrackInfo); 21] = [ ( tracks::MEMBERS, pallet_referenda::TrackInfo { name: "members", max_deciding: 10, - decision_deposit: 10 * DOLLARS, + decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: MINUTES, + min_enactment_period: 5 * MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -85,20 +134,20 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_support: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(50), + ceil: Perbill::from_percent(100), }, }, ), ( tracks::PROFICIENTS, pallet_referenda::TrackInfo { - name: "proficients", + name: "proficient members", max_deciding: 10, - decision_deposit: 10 * DOLLARS, + decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: MINUTES, + min_enactment_period: 5 * MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -107,7 +156,7 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_support: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(50), + ceil: Perbill::from_percent(100), }, }, ), @@ -116,11 +165,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { pallet_referenda::TrackInfo { name: "fellows", max_deciding: 10, - decision_deposit: 10 * DOLLARS, + decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: MINUTES, + min_enactment_period: 5 * MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -129,20 +178,20 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_support: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(50), + ceil: Perbill::from_percent(100), }, }, ), ( - tracks::SENIOR_FELLOWS, + tracks::ARCHITECTS, pallet_referenda::TrackInfo { - name: "senior fellows", + name: "architects", max_deciding: 10, - decision_deposit: 10 * DOLLARS, + decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: MINUTES, + min_enactment_period: 5 * MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -151,20 +200,20 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_support: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(50), + ceil: Perbill::from_percent(100), }, }, ), ( - tracks::EXPERTS, + tracks::ARCHITECTS_ADEPT, pallet_referenda::TrackInfo { - name: "experts", + name: "architects adept", max_deciding: 10, - decision_deposit: DOLLARS, + decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: MINUTES, + min_enactment_period: 5 * MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -173,20 +222,20 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_support: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(50), + ceil: Perbill::from_percent(100), }, }, ), ( - tracks::SENIOR_EXPERTS, + tracks::GRAND_ARCHITECTS, pallet_referenda::TrackInfo { - name: "senior experts", + name: "grand architects", max_deciding: 10, - decision_deposit: DOLLARS, + decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: MINUTES, + min_enactment_period: 5 * MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -195,7 +244,7 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_support: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(50), + ceil: Perbill::from_percent(100), }, }, ), @@ -204,11 +253,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { pallet_referenda::TrackInfo { name: "masters", max_deciding: 10, - decision_deposit: DOLLARS, + decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: MINUTES, + min_enactment_period: 5 * MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -217,20 +266,20 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_support: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(50), + ceil: Perbill::from_percent(100), }, }, ), ( - tracks::SENIOR_MASTERS, + tracks::MASTERS_CONSTANT, pallet_referenda::TrackInfo { - name: "senior masters", + name: "masters constant", max_deciding: 10, - decision_deposit: DOLLARS, + decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: MINUTES, + min_enactment_period: 5 * MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -239,7 +288,7 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_support: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(50), + ceil: Perbill::from_percent(100), }, }, ), @@ -248,11 +297,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { pallet_referenda::TrackInfo { name: "grand masters", max_deciding: 10, - decision_deposit: DOLLARS, + decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, decision_period: 7 * DAYS, confirm_period: 30 * MINUTES, - min_enactment_period: MINUTES, + min_enactment_period: 5 * MINUTES, min_approval: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(50), @@ -261,10 +310,178 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_support: pallet_referenda::Curve::LinearDecreasing { length: Perbill::from_percent(100), floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(50), + ceil: Perbill::from_percent(100), }, }, ), + ( + tracks::RETAIN_AT_1DAN, + pallet_referenda::TrackInfo { + name: "retain at I Dan", + max_deciding: RETAIN_MAX_DECIDING, + decision_deposit: RETAIN_DECISION_DEPOSIT, + prepare_period: RETAIN_PREPARE_PERIOD, + decision_period: RETAIN_DECISION_PERIOD, + confirm_period: RETAIN_CONFIRM_PERIOD, + min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, + min_approval: RETAIN_MIN_APPROVAL, + min_support: RETAIN_MIN_SUPPORT, + }, + ), + ( + tracks::RETAIN_AT_2DAN, + pallet_referenda::TrackInfo { + name: "retain at II Dan", + max_deciding: RETAIN_MAX_DECIDING, + decision_deposit: RETAIN_DECISION_DEPOSIT, + prepare_period: RETAIN_PREPARE_PERIOD, + decision_period: RETAIN_DECISION_PERIOD, + confirm_period: RETAIN_CONFIRM_PERIOD, + min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, + min_approval: RETAIN_MIN_APPROVAL, + min_support: RETAIN_MIN_SUPPORT, + }, + ), + ( + tracks::RETAIN_AT_3DAN, + pallet_referenda::TrackInfo { + name: "retain at III Dan", + max_deciding: RETAIN_MAX_DECIDING, + decision_deposit: RETAIN_DECISION_DEPOSIT, + prepare_period: RETAIN_PREPARE_PERIOD, + decision_period: RETAIN_DECISION_PERIOD, + confirm_period: RETAIN_CONFIRM_PERIOD, + min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, + min_approval: RETAIN_MIN_APPROVAL, + min_support: RETAIN_MIN_SUPPORT, + }, + ), + ( + tracks::RETAIN_AT_4DAN, + pallet_referenda::TrackInfo { + name: "retain at IV Dan", + max_deciding: RETAIN_MAX_DECIDING, + decision_deposit: RETAIN_DECISION_DEPOSIT, + prepare_period: RETAIN_PREPARE_PERIOD, + decision_period: RETAIN_DECISION_PERIOD, + confirm_period: RETAIN_CONFIRM_PERIOD, + min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, + min_approval: RETAIN_MIN_APPROVAL, + min_support: RETAIN_MIN_SUPPORT, + }, + ), + ( + tracks::RETAIN_AT_5DAN, + pallet_referenda::TrackInfo { + name: "retain at V Dan", + max_deciding: RETAIN_MAX_DECIDING, + decision_deposit: RETAIN_DECISION_DEPOSIT, + prepare_period: RETAIN_PREPARE_PERIOD, + decision_period: RETAIN_DECISION_PERIOD, + confirm_period: RETAIN_CONFIRM_PERIOD, + min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, + min_approval: RETAIN_MIN_APPROVAL, + min_support: RETAIN_MIN_SUPPORT, + }, + ), + ( + tracks::RETAIN_AT_6DAN, + pallet_referenda::TrackInfo { + name: "retain at VI Dan", + max_deciding: RETAIN_MAX_DECIDING, + decision_deposit: RETAIN_DECISION_DEPOSIT, + prepare_period: RETAIN_PREPARE_PERIOD, + decision_period: RETAIN_DECISION_PERIOD, + confirm_period: RETAIN_CONFIRM_PERIOD, + min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, + min_approval: RETAIN_MIN_APPROVAL, + min_support: RETAIN_MIN_SUPPORT, + }, + ), + ( + tracks::PROMOTE_TO_1DAN, + pallet_referenda::TrackInfo { + name: "promote to I Dan", + max_deciding: PROMOTE_MAX_DECIDING, + decision_deposit: PROMOTE_DECISION_DEPOSIT, + prepare_period: PROMOTE_PREPARE_PERIOD, + decision_period: PROMOTE_DECISION_PERIOD, + confirm_period: PROMOTE_CONFIRM_PERIOD, + min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, + min_approval: PROMOTE_MIN_APPROVAL, + min_support: PROMOTE_MIN_SUPPORT, + }, + ), + ( + tracks::PROMOTE_TO_2DAN, + pallet_referenda::TrackInfo { + name: "promote to II Dan", + max_deciding: PROMOTE_MAX_DECIDING, + decision_deposit: PROMOTE_DECISION_DEPOSIT, + prepare_period: PROMOTE_PREPARE_PERIOD, + decision_period: PROMOTE_DECISION_PERIOD, + confirm_period: PROMOTE_CONFIRM_PERIOD, + min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, + min_approval: PROMOTE_MIN_APPROVAL, + min_support: PROMOTE_MIN_SUPPORT, + }, + ), + ( + tracks::PROMOTE_TO_3DAN, + pallet_referenda::TrackInfo { + name: "promote to III Dan", + max_deciding: PROMOTE_MAX_DECIDING, + decision_deposit: PROMOTE_DECISION_DEPOSIT, + prepare_period: PROMOTE_PREPARE_PERIOD, + decision_period: PROMOTE_DECISION_PERIOD, + confirm_period: PROMOTE_CONFIRM_PERIOD, + min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, + min_approval: PROMOTE_MIN_APPROVAL, + min_support: PROMOTE_MIN_SUPPORT, + }, + ), + ( + tracks::PROMOTE_TO_4DAN, + pallet_referenda::TrackInfo { + name: "promote to IV Dan", + max_deciding: PROMOTE_MAX_DECIDING, + decision_deposit: PROMOTE_DECISION_DEPOSIT, + prepare_period: PROMOTE_PREPARE_PERIOD, + decision_period: PROMOTE_DECISION_PERIOD, + confirm_period: PROMOTE_CONFIRM_PERIOD, + min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, + min_approval: PROMOTE_MIN_APPROVAL, + min_support: PROMOTE_MIN_SUPPORT, + }, + ), + ( + tracks::PROMOTE_TO_5DAN, + pallet_referenda::TrackInfo { + name: "promote to V Dan", + max_deciding: PROMOTE_MAX_DECIDING, + decision_deposit: PROMOTE_DECISION_DEPOSIT, + prepare_period: PROMOTE_PREPARE_PERIOD, + decision_period: PROMOTE_DECISION_PERIOD, + confirm_period: PROMOTE_CONFIRM_PERIOD, + min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, + min_approval: PROMOTE_MIN_APPROVAL, + min_support: PROMOTE_MIN_SUPPORT, + }, + ), + ( + tracks::PROMOTE_TO_6DAN, + pallet_referenda::TrackInfo { + name: "promote to VI Dan", + max_deciding: PROMOTE_MAX_DECIDING, + decision_deposit: PROMOTE_DECISION_DEPOSIT, + prepare_period: PROMOTE_PREPARE_PERIOD, + decision_period: PROMOTE_DECISION_PERIOD, + confirm_period: PROMOTE_CONFIRM_PERIOD, + min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, + min_approval: PROMOTE_MIN_APPROVAL, + min_support: PROMOTE_MIN_SUPPORT, + }, + ), ]; &DATA[..] } @@ -283,16 +500,30 @@ impl pallet_referenda::TracksInfo for TracksInfo { } match Origin::try_from(id.clone()) { - Ok(Origin::FellowshipCandidates) => Ok(tracks::CANDIDATES), - Ok(Origin::Fellowship1Dan) => Ok(tracks::MEMBERS), + Ok(Origin::Members) => Ok(tracks::MEMBERS), Ok(Origin::Fellowship2Dan) => Ok(tracks::PROFICIENTS), - Ok(Origin::Fellowship3Dan) | Ok(Origin::Fellows) => Ok(tracks::FELLOWS), - Ok(Origin::Fellowship4Dan) => Ok(tracks::SENIOR_FELLOWS), - Ok(Origin::Fellowship5Dan) | Ok(Origin::FellowshipExperts) => Ok(tracks::EXPERTS), - Ok(Origin::Fellowship6Dan) => Ok(tracks::SENIOR_EXPERTS), - Ok(Origin::Fellowship7Dan | Origin::FellowshipMasters) => Ok(tracks::MASTERS), - Ok(Origin::Fellowship8Dan) => Ok(tracks::SENIOR_MASTERS), + Ok(Origin::Fellows) => Ok(tracks::FELLOWS), + Ok(Origin::Architects) => Ok(tracks::ARCHITECTS), + Ok(Origin::Fellowship5Dan) => Ok(tracks::ARCHITECTS_ADEPT), + Ok(Origin::Fellowship6Dan) => Ok(tracks::GRAND_ARCHITECTS), + Ok(Origin::Masters) => Ok(tracks::MASTERS), + Ok(Origin::Fellowship8Dan) => Ok(tracks::MASTERS_CONSTANT), Ok(Origin::Fellowship9Dan) => Ok(tracks::GRAND_MASTERS), + + Ok(Origin::RetainAt1Dan) => Ok(tracks::RETAIN_AT_1DAN), + Ok(Origin::RetainAt2Dan) => Ok(tracks::RETAIN_AT_2DAN), + Ok(Origin::RetainAt3Dan) => Ok(tracks::RETAIN_AT_3DAN), + Ok(Origin::RetainAt4Dan) => Ok(tracks::RETAIN_AT_4DAN), + Ok(Origin::RetainAt5Dan) => Ok(tracks::RETAIN_AT_5DAN), + Ok(Origin::RetainAt6Dan) => Ok(tracks::RETAIN_AT_6DAN), + + Ok(Origin::PromoteTo1Dan) => Ok(tracks::PROMOTE_TO_1DAN), + Ok(Origin::PromoteTo2Dan) => Ok(tracks::PROMOTE_TO_2DAN), + Ok(Origin::PromoteTo3Dan) => Ok(tracks::PROMOTE_TO_3DAN), + Ok(Origin::PromoteTo4Dan) => Ok(tracks::PROMOTE_TO_4DAN), + Ok(Origin::PromoteTo5Dan) => Ok(tracks::PROMOTE_TO_5DAN), + Ok(Origin::PromoteTo6Dan) => Ok(tracks::PROMOTE_TO_6DAN), + _ => Err(()), } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/impls.rs b/parachains/runtimes/collectives/collectives-polkadot/src/impls.rs index 3b45d2824d9..6ccff8bda1c 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/impls.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/impls.rs @@ -146,3 +146,23 @@ impl PrivilegeCmp for EqualOrGreatestRootCmp { } } } + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarks { + use super::*; + use frame_support::traits::fungible; + use pallet_ranked_collective::Rank; + use parachains_common::{AccountId, Balance}; + use sp_runtime::traits::Convert; + + /// Rank to salary conversion helper type.` + pub struct RankToSalary(PhantomData); + impl Convert for RankToSalary + where + Fungible: fungible::Inspect, + { + fn convert(r: Rank) -> Balance { + Balance::from(r).saturating_mul(Fungible::minimum_balance()) + } + } +} diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs index 3aed385e404..3177cc02417 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs @@ -477,7 +477,7 @@ parameter_types! { // The Alliance pallet account, used as a temporary place to deposit a slashed imbalance // before the teleport to the Treasury. pub AlliancePalletAccount: AccountId = constants::account::ALLIANCE_PALLET_ID.into_account_truncating(); - pub RelayTreasuryAccount: AccountId = constants::account::RELAY_TREASURY_PALLET_ID.into_account_truncating(); + pub PolkadotTreasuryAccount: AccountId = constants::account::POLKADOT_TREASURY_PALLET_ID.into_account_truncating(); // The number of blocks a member must wait between giving a retirement notice and retiring. // Supposed to be greater than time required to `kick_member` with alliance motion. pub const AllianceRetirementPeriod: BlockNumber = (90 * DAYS) + ALLIANCE_MOTION_DURATION; @@ -490,7 +490,7 @@ impl pallet_alliance::Config for Runtime { type MembershipManager = RootOrAllianceTwoThirdsMajority; type AnnouncementOrigin = RootOrAllianceTwoThirdsMajority; type Currency = Balances; - type Slashed = ToParentTreasury; + type Slashed = ToParentTreasury; type InitializeMembers = AllianceMotion; type MembershipChanged = AllianceMotion; type RetirementPeriod = AllianceRetirementPeriod; @@ -599,6 +599,10 @@ construct_runtime!( // pub type FellowshipReferendaInstance = pallet_referenda::Instance1; FellowshipReferenda: pallet_referenda::::{Pallet, Call, Storage, Event} = 61, FellowshipOrigins: pallet_fellowship_origins::{Origin} = 62, + // pub type FellowshipCoreInstance = pallet_core_fellowship::Instance1; + FellowshipCore: pallet_core_fellowship::::{Pallet, Call, Storage, Event} = 63, + // pub type FellowshipSalaryInstance = pallet_salary::Instance1; + FellowshipSalary: pallet_salary::::{Pallet, Call, Storage, Event} = 64, } ); @@ -667,6 +671,8 @@ mod benches { [pallet_scheduler, Scheduler] [pallet_referenda, FellowshipReferenda] [pallet_ranked_collective, FellowshipCollective] + [pallet_core_fellowship, FellowshipCore] + [pallet_salary, FellowshipSalary] ); } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/mod.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/mod.rs index 34ed36e3b62..b0e49549914 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/mod.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/mod.rs @@ -6,11 +6,13 @@ pub mod pallet_alliance; pub mod pallet_balances; pub mod pallet_collator_selection; pub mod pallet_collective; +pub mod pallet_core_fellowship; pub mod pallet_multisig; pub mod pallet_preimage; pub mod pallet_proxy; pub mod pallet_ranked_collective; pub mod pallet_referenda; +pub mod pallet_salary; pub mod pallet_scheduler; pub mod pallet_session; pub mod pallet_timestamp; diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_core_fellowship.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_core_fellowship.rs new file mode 100644 index 00000000000..5330755bb90 --- /dev/null +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_core_fellowship.rs @@ -0,0 +1,222 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_core_fellowship` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-19, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `cob`, CPU: `` +//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./target/debug/polkadot-parachain +// benchmark +// pallet +// --chain=collectives-polkadot-dev +// --steps=2 +// --repeat=1 +// --pallet=pallet_core_fellowship +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_core_fellowship`. +pub struct WeightInfo(PhantomData); +impl pallet_core_fellowship::WeightInfo for WeightInfo { + /// Storage: FellowshipCore Params (r:0 w:1) + /// Proof: FellowshipCore Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) + fn set_params() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 65_000_000 picoseconds. + Weight::from_parts(65_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: FellowshipCore Member (r:1 w:1) + /// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: FellowshipCollective Members (r:1 w:1) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: FellowshipCore Params (r:1 w:0) + /// Proof: FellowshipCore Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) + /// Storage: FellowshipCollective MemberCount (r:1 w:1) + /// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) + /// Storage: FellowshipCollective IdToIndex (r:1 w:0) + /// Proof: FellowshipCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: FellowshipCore MemberEvidence (r:1 w:1) + /// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen) + fn bump_offboard() -> Weight { + // Proof Size summary in bytes: + // Measured: `1562` + // Estimated: `4532` + // Minimum execution time: 300_000_000 picoseconds. + Weight::from_parts(300_000_000, 0) + .saturating_add(Weight::from_parts(0, 4532)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: FellowshipCore Member (r:1 w:1) + /// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: FellowshipCollective Members (r:1 w:1) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: FellowshipCore Params (r:1 w:0) + /// Proof: FellowshipCore Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) + /// Storage: FellowshipCollective MemberCount (r:1 w:1) + /// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) + /// Storage: FellowshipCollective IdToIndex (r:1 w:0) + /// Proof: FellowshipCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: FellowshipCore MemberEvidence (r:1 w:1) + /// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen) + fn bump_demote() -> Weight { + // Proof Size summary in bytes: + // Measured: `1672` + // Estimated: `4532` + // Minimum execution time: 339_000_000 picoseconds. + Weight::from_parts(339_000_000, 0) + .saturating_add(Weight::from_parts(0, 4532)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: FellowshipCollective Members (r:1 w:0) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: FellowshipCore Member (r:1 w:1) + /// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + fn set_active() -> Weight { + // Proof Size summary in bytes: + // Measured: `427` + // Estimated: `3514` + // Minimum execution time: 150_000_000 picoseconds. + Weight::from_parts(150_000_000, 0) + .saturating_add(Weight::from_parts(0, 3514)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: FellowshipCore Member (r:1 w:1) + /// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: FellowshipCollective Members (r:1 w:1) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: FellowshipCollective MemberCount (r:1 w:1) + /// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) + /// Storage: FellowshipCollective IndexToId (r:0 w:1) + /// Proof: FellowshipCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: FellowshipCollective IdToIndex (r:0 w:1) + /// Proof: FellowshipCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + fn induct() -> Weight { + // Proof Size summary in bytes: + // Measured: `185` + // Estimated: `3514` + // Minimum execution time: 166_000_000 picoseconds. + Weight::from_parts(166_000_000, 0) + .saturating_add(Weight::from_parts(0, 3514)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: FellowshipCollective Members (r:1 w:1) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: FellowshipCore Member (r:1 w:1) + /// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: FellowshipCore Params (r:1 w:0) + /// Proof: FellowshipCore Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) + /// Storage: FellowshipCollective MemberCount (r:1 w:1) + /// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) + /// Storage: FellowshipCore MemberEvidence (r:1 w:1) + /// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen) + /// Storage: FellowshipCollective IndexToId (r:0 w:1) + /// Proof: FellowshipCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: FellowshipCollective IdToIndex (r:0 w:1) + /// Proof: FellowshipCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + fn promote() -> Weight { + // Proof Size summary in bytes: + // Measured: `1540` + // Estimated: `4532` + // Minimum execution time: 308_000_000 picoseconds. + Weight::from_parts(308_000_000, 0) + .saturating_add(Weight::from_parts(0, 4532)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(6)) + } + /// Storage: FellowshipCollective Members (r:1 w:0) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: FellowshipCore Member (r:1 w:1) + /// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: FellowshipCore MemberEvidence (r:0 w:1) + /// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen) + fn offboard() -> Weight { + // Proof Size summary in bytes: + // Measured: `398` + // Estimated: `3514` + // Minimum execution time: 141_000_000 picoseconds. + Weight::from_parts(141_000_000, 0) + .saturating_add(Weight::from_parts(0, 3514)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: FellowshipCore Member (r:1 w:1) + /// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: FellowshipCollective Members (r:1 w:0) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + fn import() -> Weight { + // Proof Size summary in bytes: + // Measured: `352` + // Estimated: `3514` + // Minimum execution time: 131_000_000 picoseconds. + Weight::from_parts(131_000_000, 0) + .saturating_add(Weight::from_parts(0, 3514)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: FellowshipCollective Members (r:1 w:0) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: FellowshipCore Member (r:1 w:1) + /// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: FellowshipCore MemberEvidence (r:1 w:1) + /// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen) + fn approve() -> Weight { + // Proof Size summary in bytes: + // Measured: `1518` + // Estimated: `4532` + // Minimum execution time: 198_000_000 picoseconds. + Weight::from_parts(198_000_000, 0) + .saturating_add(Weight::from_parts(0, 4532)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: FellowshipCore Member (r:1 w:0) + /// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: FellowshipCore MemberEvidence (r:1 w:1) + /// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen) + fn submit_evidence() -> Weight { + // Proof Size summary in bytes: + // Measured: `151` + // Estimated: `4532` + // Minimum execution time: 99_000_000 picoseconds. + Weight::from_parts(99_000_000, 0) + .saturating_add(Weight::from_parts(0, 4532)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_salary.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_salary.rs new file mode 100644 index 00000000000..89333426386 --- /dev/null +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_salary.rs @@ -0,0 +1,140 @@ + +//! Autogenerated weights for `pallet_salary` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-20, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `cob`, CPU: `` +//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./target/debug/polkadot-parachain +// benchmark +// pallet +// --chain=collectives-polkadot-dev +// --steps=2 +// --repeat=1 +// --pallet=pallet_salary +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_salary`. +pub struct WeightInfo(PhantomData); +impl pallet_salary::WeightInfo for WeightInfo { + /// Storage: FellowshipSalary Status (r:1 w:1) + /// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) + fn init() -> Weight { + // Proof Size summary in bytes: + // Measured: `142` + // Estimated: `1541` + // Minimum execution time: 127_000_000 picoseconds. + Weight::from_parts(127_000_000, 0) + .saturating_add(Weight::from_parts(0, 1541)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: FellowshipSalary Status (r:1 w:1) + /// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) + fn bump() -> Weight { + // Proof Size summary in bytes: + // Measured: `224` + // Estimated: `1541` + // Minimum execution time: 133_000_000 picoseconds. + Weight::from_parts(133_000_000, 0) + .saturating_add(Weight::from_parts(0, 1541)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: FellowshipSalary Status (r:1 w:0) + /// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) + /// Storage: FellowshipCollective Members (r:1 w:0) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: FellowshipSalary Claimant (r:1 w:1) + /// Proof: FellowshipSalary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) + fn induct() -> Weight { + // Proof Size summary in bytes: + // Measured: `395` + // Estimated: `3543` + // Minimum execution time: 186_000_000 picoseconds. + Weight::from_parts(186_000_000, 0) + .saturating_add(Weight::from_parts(0, 3543)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: FellowshipCollective Members (r:1 w:0) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: FellowshipSalary Status (r:1 w:1) + /// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) + /// Storage: FellowshipSalary Claimant (r:1 w:1) + /// Proof: FellowshipSalary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) + fn register() -> Weight { + // Proof Size summary in bytes: + // Measured: `462` + // Estimated: `3543` + // Minimum execution time: 183_000_000 picoseconds. + Weight::from_parts(183_000_000, 0) + .saturating_add(Weight::from_parts(0, 3543)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: FellowshipSalary Status (r:1 w:1) + /// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) + /// Storage: FellowshipSalary Claimant (r:1 w:1) + /// Proof: FellowshipSalary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) + /// Storage: FellowshipCollective Members (r:1 w:0) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn payout() -> Weight { + // Proof Size summary in bytes: + // Measured: `565` + // Estimated: `3593` + // Minimum execution time: 628_000_000 picoseconds. + Weight::from_parts(628_000_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: FellowshipSalary Status (r:1 w:1) + /// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) + /// Storage: FellowshipSalary Claimant (r:1 w:1) + /// Proof: FellowshipSalary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) + /// Storage: FellowshipCollective Members (r:1 w:0) + /// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn payout_other() -> Weight { + // Proof Size summary in bytes: + // Measured: `565` + // Estimated: `6196` + // Minimum execution time: 607_000_000 picoseconds. + Weight::from_parts(607_000_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: FellowshipSalary Status (r:1 w:1) + /// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) + /// Storage: FellowshipSalary Claimant (r:1 w:1) + /// Proof: FellowshipSalary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) + fn check_payment() -> Weight { + // Proof Size summary in bytes: + // Measured: `308` + // Estimated: `3543` + // Minimum execution time: 100_000_000 picoseconds. + Weight::from_parts(100_000_000, 0) + .saturating_add(Weight::from_parts(0, 3543)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs index 54013911433..3c95da27dd8 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs @@ -187,6 +187,16 @@ impl Contains for SafeCallFilter { pallet_ranked_collective::Call::promote_member { .. } | pallet_ranked_collective::Call::demote_member { .. } | pallet_ranked_collective::Call::remove_member { .. }, + ) | RuntimeCall::FellowshipCore( + pallet_core_fellowship::Call::bump { .. } | + pallet_core_fellowship::Call::set_params { .. } | + pallet_core_fellowship::Call::set_active { .. } | + pallet_core_fellowship::Call::approve { .. } | + pallet_core_fellowship::Call::induct { .. } | + pallet_core_fellowship::Call::promote { .. } | + pallet_core_fellowship::Call::offboard { .. } | + pallet_core_fellowship::Call::submit_evidence { .. } | + pallet_core_fellowship::Call::import { .. }, ) ) } From 525d8901459dac41f615b6f8e905c1f0eed41efd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 6 Jun 2023 16:41:00 +0200 Subject: [PATCH 278/339] Remove unused deps and upgrade fs_extra (#2695) --- Cargo.lock | 511 +--------------------------------------- test/service/Cargo.toml | 3 - 2 files changed, 2 insertions(+), 512 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8e0d708c557..fc3bcdccca7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1838,15 +1838,6 @@ dependencies = [ "strsim", ] -[[package]] -name = "clap_complete" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6b5c519bab3ea61843a7923d074b04245624bb84a64a8c150f5deb014e388b" -dependencies = [ - "clap", -] - [[package]] name = "clap_derive" version = "4.3.2" @@ -3202,9 +3193,6 @@ dependencies = [ "frame-system-rpc-runtime-api", "futures", "jsonrpsee", - "kitchensink-runtime", - "node-cli", - "node-primitives", "pallet-im-online", "pallet-timestamp", "pallet-transaction-payment", @@ -4255,21 +4243,6 @@ dependencies = [ "thousands", ] -[[package]] -name = "frame-benchmarking-pallet-pov" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std", -] - [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" @@ -4506,9 +4479,9 @@ dependencies = [ [[package]] name = "fs_extra" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "funty" @@ -5156,17 +5129,6 @@ dependencies = [ "parity-scale-codec", ] -[[package]] -name = "impl-num-traits" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951641f13f873bff03d4bf19ae8bec531935ac0ac2cc775f84d7edfdcfed3f17" -dependencies = [ - "integer-sqrt", - "num-traits", - "uint", -] - [[package]] name = "impl-rlp" version = "0.3.0" @@ -5566,115 +5528,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" -[[package]] -name = "kitchensink-runtime" -version = "3.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-benchmarking", - "frame-benchmarking-pallet-pov", - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "log", - "node-primitives", - "pallet-alliance", - "pallet-asset-conversion", - "pallet-asset-rate", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-bags-list", - "pallet-balances", - "pallet-bounties", - "pallet-child-bounties", - "pallet-collective", - "pallet-contracts", - "pallet-contracts-primitives", - "pallet-conviction-voting", - "pallet-core-fellowship", - "pallet-democracy", - "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking", - "pallet-elections-phragmen", - "pallet-fast-unstake", - "pallet-glutton", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-insecure-randomness-collective-flip", - "pallet-lottery", - "pallet-membership", - "pallet-message-queue", - "pallet-mmr", - "pallet-multisig", - "pallet-nft-fractionalization", - "pallet-nfts", - "pallet-nfts-runtime-api", - "pallet-nis", - "pallet-nomination-pools", - "pallet-nomination-pools-benchmarking", - "pallet-nomination-pools-runtime-api", - "pallet-offences", - "pallet-offences-benchmarking", - "pallet-preimage", - "pallet-proxy", - "pallet-ranked-collective", - "pallet-recovery", - "pallet-referenda", - "pallet-remark", - "pallet-root-testing", - "pallet-salary", - "pallet-scheduler", - "pallet-session", - "pallet-session-benchmarking", - "pallet-society", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-staking-runtime-api", - "pallet-state-trie-migration", - "pallet-statement", - "pallet-sudo", - "pallet-timestamp", - "pallet-tips", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-transaction-storage", - "pallet-treasury", - "pallet-uniques", - "pallet-utility", - "pallet-vesting", - "pallet-whitelist", - "parity-scale-codec", - "primitive-types", - "scale-info", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-statement-store", - "sp-std", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", -] - [[package]] name = "kusama-runtime" version = "0.9.41" @@ -6993,158 +6846,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "node-cli" -version = "3.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "array-bytes 4.2.0", - "clap", - "clap_complete", - "frame-benchmarking-cli", - "frame-system", - "frame-system-rpc-runtime-api", - "futures", - "jsonrpsee", - "kitchensink-runtime", - "log", - "node-executor", - "node-inspect", - "node-primitives", - "node-rpc", - "pallet-asset-conversion", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-balances", - "pallet-im-online", - "pallet-transaction-payment", - "parity-scale-codec", - "rand 0.8.5", - "sc-authority-discovery", - "sc-basic-authorship", - "sc-chain-spec", - "sc-cli", - "sc-client-api", - "sc-consensus", - "sc-consensus-babe", - "sc-consensus-grandpa", - "sc-consensus-slots", - "sc-executor", - "sc-network", - "sc-network-common", - "sc-network-statement", - "sc-network-sync", - "sc-rpc", - "sc-service", - "sc-statement-store", - "sc-storage-monitor", - "sc-sync-state-rpc", - "sc-sysinfo", - "sc-telemetry", - "sc-transaction-pool", - "sc-transaction-pool-api", - "serde", - "serde_json", - "sp-api", - "sp-authority-discovery", - "sp-consensus", - "sp-consensus-babe", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keyring", - "sp-keystore", - "sp-runtime", - "sp-timestamp", - "sp-transaction-pool", - "sp-transaction-storage-proof", - "substrate-build-script-utils", - "substrate-frame-cli", - "try-runtime-cli", -] - -[[package]] -name = "node-executor" -version = "3.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-benchmarking", - "kitchensink-runtime", - "node-primitives", - "parity-scale-codec", - "sc-executor", - "scale-info", - "sp-core", - "sp-keystore", - "sp-state-machine", - "sp-statement-store", - "sp-tracing", - "sp-trie", -] - -[[package]] -name = "node-inspect" -version = "0.9.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "clap", - "parity-scale-codec", - "sc-cli", - "sc-client-api", - "sc-executor", - "sc-service", - "sp-blockchain", - "sp-core", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "node-primitives" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "node-rpc" -version = "3.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "jsonrpsee", - "mmr-rpc", - "node-primitives", - "pallet-transaction-payment-rpc", - "sc-chain-spec", - "sc-client-api", - "sc-consensus-babe", - "sc-consensus-babe-rpc", - "sc-consensus-grandpa", - "sc-consensus-grandpa-rpc", - "sc-rpc", - "sc-rpc-api", - "sc-rpc-spec-v2", - "sc-sync-state-rpc", - "sc-transaction-pool-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-keystore", - "sp-runtime", - "sp-statement-store", - "substrate-frame-rpc-system", - "substrate-state-trie-migration-rpc", -] - [[package]] name = "nohash-hasher" version = "0.2.0" @@ -7399,37 +7100,6 @@ dependencies = [ "sp-std", ] -[[package]] -name = "pallet-asset-conversion" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-arithmetic", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-asset-rate" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", -] - [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" @@ -7848,24 +7518,6 @@ dependencies = [ "sp-std", ] -[[package]] -name = "pallet-core-fellowship" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - [[package]] name = "pallet-democracy" version = "4.0.0-dev" @@ -8065,20 +7717,6 @@ dependencies = [ "sp-std", ] -[[package]] -name = "pallet-lottery" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", -] - [[package]] name = "pallet-membership" version = "4.0.0-dev" @@ -8398,56 +8036,6 @@ dependencies = [ "sp-std", ] -[[package]] -name = "pallet-remark" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-root-testing" -version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-salary" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - [[package]] name = "pallet-scheduler" version = "4.0.0-dev" @@ -8585,24 +8173,6 @@ dependencies = [ "sp-std", ] -[[package]] -name = "pallet-statement" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-statement-store", - "sp-std", -] - [[package]] name = "pallet-sudo" version = "4.0.0-dev" @@ -8699,26 +8269,6 @@ dependencies = [ "sp-weights", ] -[[package]] -name = "pallet-transaction-storage" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "serde", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-std", - "sp-transaction-storage-proof", -] - [[package]] name = "pallet-treasury" version = "4.0.0-dev" @@ -11012,7 +10562,6 @@ checksum = "5cfd65aea0c5fa0bfcc7c9e7ca828c921ef778f43d325325ec84bda371bfa75a" dependencies = [ "fixed-hash", "impl-codec", - "impl-num-traits", "impl-rlp", "impl-serde", "scale-info", @@ -12626,26 +12175,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "sc-network-statement" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "array-bytes 4.2.0", - "async-channel", - "futures", - "libp2p", - "log", - "parity-scale-codec", - "pin-project", - "sc-network", - "sc-network-common", - "sp-consensus", - "sp-runtime", - "sp-statement-store", - "substrate-prometheus-endpoint", -] - [[package]] name = "sc-network-sync" version = "0.10.0-dev" @@ -12905,29 +12434,6 @@ dependencies = [ "sp-core", ] -[[package]] -name = "sc-statement-store" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "log", - "parity-db", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-client-api", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-statement-store", - "sp-tracing", - "substrate-prometheus-endpoint", - "tokio", -] - [[package]] name = "sc-storage-monitor" version = "0.1.0" @@ -14554,19 +14060,6 @@ dependencies = [ "platforms", ] -[[package]] -name = "substrate-frame-cli" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" -dependencies = [ - "clap", - "frame-support", - "frame-system", - "sc-cli", - "sp-core", - "sp-runtime", -] - [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 3b0b48955b9..9aecf3a9220 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -83,11 +83,8 @@ pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = " [dev-dependencies] futures = "0.3.28" portpicker = "0.1.1" -kitchensink-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } rococo-parachain-runtime = { path = "../../parachains/runtimes/testing/rococo-parachain" } -node-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master" } -node-primitives = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } cumulus-test-client = { path = "../client" } From 2f65cf93fd66e46931ca21ba3056b49c832c0547 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Jun 2023 10:22:00 +0000 Subject: [PATCH 279/339] Bump tempfile from 3.5.0 to 3.6.0 (#2698) Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.5.0 to 3.6.0. - [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md) - [Commits](https://github.com/Stebalien/tempfile/compare/v3.5.0...v3.6.0) --- updated-dependencies: - dependency-name: tempfile dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 482 ++++++++++++++++++---------------- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 3 files changed, 262 insertions(+), 224 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fc3bcdccca7..b1220305d5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -865,7 +865,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "hash-db", "log", @@ -3872,13 +3872,13 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -4151,7 +4151,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", ] @@ -4174,7 +4174,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-support-procedural", @@ -4199,7 +4199,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -4246,7 +4246,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4257,7 +4257,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -4274,7 +4274,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-system", @@ -4303,7 +4303,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-recursion", "futures", @@ -4324,7 +4324,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "bitflags", "environmental", @@ -4359,7 +4359,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "Inflector", "cfg-expr", @@ -4376,7 +4376,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4388,7 +4388,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "proc-macro2", "quote", @@ -4398,7 +4398,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "cfg-if", "frame-support", @@ -4417,7 +4417,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -4432,7 +4432,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "sp-api", @@ -4441,7 +4441,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "parity-scale-codec", @@ -5282,12 +5282,13 @@ checksum = "59ce5ef949d49ee85593fc4d3f3f95ad61657076395cbbce23e2121fc5542074" [[package]] name = "io-lifetimes" -version = "1.0.2" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e394faa0efb47f9f227f1cd89978f854542b318a6f64fa695489c9c993056656" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ + "hermit-abi 0.3.1", "libc", - "windows-sys 0.42.0", + "windows-sys 0.48.0", ] [[package]] @@ -5321,8 +5322,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", - "io-lifetimes 1.0.2", - "rustix 0.37.3", + "io-lifetimes 1.0.11", + "rustix 0.37.19", "windows-sys 0.48.0", ] @@ -5688,9 +5689,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.146" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" [[package]] name = "libloading" @@ -6260,9 +6261,9 @@ checksum = "8f9f08d8963a6c613f4b1a78f4f4a4dbfadf8e6545b2d72861731e4858b8b47f" [[package]] name = "linux-raw-sys" -version = "0.3.0" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd550e73688e6d578f0ac2119e32b797a327631a42f9433e59d02e139c8df60d" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "lock_api" @@ -6346,9 +6347,9 @@ dependencies = [ [[package]] name = "macro_magic" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e7c1b5ffe892e88b288611ccf55f9c4f4e43214aea6f7f80f0c2c53c85e68e" +checksum = "0a2d6d7fe4741b5621cf7c8048e472933877c7ea870cbf1420da55ea9f3bb08c" dependencies = [ "macro_magic_core", "macro_magic_macros", @@ -6358,9 +6359,9 @@ dependencies = [ [[package]] name = "macro_magic_core" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e812c59de90e5d50405131c676dad7d239de39ccc975620c72d467c70138851" +checksum = "3005604258419767cacc5989c2dd75263f8b33773dd680734f598eb88baf5370" dependencies = [ "derive-syn-parse", "macro_magic_core_macros", @@ -6371,9 +6372,9 @@ dependencies = [ [[package]] name = "macro_magic_core_macros" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b1906fa06ee8c02b24595e121be94e0036cb64f9dce5e587edd1e823c87c94" +checksum = "de6267819c9042df1a9e62ca279e5a34254ad5dfdcb13ff988f560d75576e8b4" dependencies = [ "proc-macro2", "quote", @@ -6382,9 +6383,9 @@ dependencies = [ [[package]] name = "macro_magic_macros" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e8939ee52e99672a887d8ee13776d0f54262c058ce7e911185fed8e43e3a59" +checksum = "dc7176ac15ab2ed7f335e2398f729b9562dae0c233705bc1e1e3acd8452d403d" dependencies = [ "macro_magic_core", "quote", @@ -6559,7 +6560,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "futures", "log", @@ -6578,7 +6579,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "anyhow", "jsonrpsee", @@ -7082,7 +7083,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -7103,7 +7104,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7121,7 +7122,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7136,7 +7137,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-system", @@ -7152,7 +7153,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-system", @@ -7168,7 +7169,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-system", @@ -7182,7 +7183,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7206,7 +7207,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7226,7 +7227,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7241,7 +7242,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-system", @@ -7260,7 +7261,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -7284,7 +7285,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7390,7 +7391,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7434,7 +7435,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7451,7 +7452,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "bitflags", "environmental", @@ -7481,7 +7482,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "bitflags", "parity-scale-codec", @@ -7494,7 +7495,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "proc-macro2", "quote", @@ -7504,7 +7505,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7518,10 +7519,28 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-core-fellowship" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7539,7 +7558,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7562,7 +7581,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7575,7 +7594,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7593,7 +7612,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "docify", "frame-benchmarking", @@ -7612,7 +7631,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "blake2", "frame-benchmarking", @@ -7630,7 +7649,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7653,7 +7672,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7669,7 +7688,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7689,7 +7708,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7706,7 +7725,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-system", @@ -7720,7 +7739,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7737,7 +7756,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7756,7 +7775,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7773,7 +7792,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7789,7 +7808,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7806,7 +7825,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7824,7 +7843,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "pallet-nfts", @@ -7835,7 +7854,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7851,7 +7870,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-system", @@ -7868,7 +7887,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7888,7 +7907,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7899,7 +7918,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-system", @@ -7916,7 +7935,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7955,7 +7974,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7972,7 +7991,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -7987,7 +8006,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8005,7 +8024,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8020,7 +8039,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "assert_matches", "frame-benchmarking", @@ -8036,10 +8055,28 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-salary" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8056,7 +8093,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-system", @@ -8077,7 +8114,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8093,7 +8130,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-system", @@ -8107,7 +8144,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8130,7 +8167,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8141,7 +8178,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "log", "sp-arithmetic", @@ -8150,7 +8187,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "sp-api", @@ -8159,7 +8196,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8176,7 +8213,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8191,7 +8228,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8209,7 +8246,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8228,7 +8265,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-support", "frame-system", @@ -8244,7 +8281,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -8260,7 +8297,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -8272,7 +8309,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8289,7 +8326,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8304,7 +8341,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8320,7 +8357,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -8335,7 +8372,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-benchmarking", "frame-support", @@ -11379,7 +11416,7 @@ checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" dependencies = [ "bitflags", "errno 0.2.8", - "io-lifetimes 1.0.2", + "io-lifetimes 1.0.11", "libc", "linux-raw-sys 0.1.3", "windows-sys 0.42.0", @@ -11387,16 +11424,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.3" +version = "0.37.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" dependencies = [ "bitflags", - "errno 0.3.0", - "io-lifetimes 1.0.2", + "errno 0.3.1", + "io-lifetimes 1.0.11", "libc", - "linux-raw-sys 0.3.0", - "windows-sys 0.45.0", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", ] [[package]] @@ -11498,7 +11535,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "log", "sp-core", @@ -11509,7 +11546,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "futures", @@ -11538,7 +11575,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "futures", "futures-timer", @@ -11561,7 +11598,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11576,7 +11613,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11595,7 +11632,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11606,7 +11643,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11646,7 +11683,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "fnv", "futures", @@ -11673,7 +11710,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "hash-db", "kvdb", @@ -11699,7 +11736,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "futures", @@ -11724,7 +11761,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "futures", @@ -11753,7 +11790,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "fork-tree", @@ -11789,7 +11826,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "futures", "jsonrpsee", @@ -11811,7 +11848,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11847,7 +11884,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "futures", "jsonrpsee", @@ -11866,7 +11903,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11879,7 +11916,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11919,7 +11956,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "finality-grandpa", "futures", @@ -11939,7 +11976,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "futures", @@ -11962,7 +11999,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "lru 0.10.0", "parity-scale-codec", @@ -11984,7 +12021,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -11996,7 +12033,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "anyhow", "cfg-if", @@ -12014,7 +12051,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "ansi_term", "futures", @@ -12030,7 +12067,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -12044,7 +12081,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12090,7 +12127,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-channel", "cid", @@ -12111,7 +12148,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12138,7 +12175,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "ahash 0.8.2", "futures", @@ -12156,7 +12193,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12178,7 +12215,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12212,7 +12249,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12230,7 +12267,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -12260,7 +12297,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -12269,7 +12306,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "futures", "jsonrpsee", @@ -12300,7 +12337,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12319,7 +12356,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "http", "jsonrpsee", @@ -12334,7 +12371,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12360,7 +12397,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "directories", @@ -12426,7 +12463,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "log", "parity-scale-codec", @@ -12437,7 +12474,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "clap", "fs4", @@ -12453,7 +12490,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12472,7 +12509,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "futures", "libc", @@ -12491,7 +12528,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "chrono", "futures", @@ -12510,7 +12547,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "ansi_term", "atty", @@ -12541,7 +12578,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12552,7 +12589,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "futures", @@ -12578,7 +12615,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "futures", @@ -12594,7 +12631,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-channel", "futures", @@ -13152,7 +13189,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "hash-db", "log", @@ -13172,7 +13209,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "Inflector", "blake2", @@ -13186,7 +13223,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "scale-info", @@ -13199,7 +13236,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "16.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "integer-sqrt", "num-traits", @@ -13213,7 +13250,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "scale-info", @@ -13226,7 +13263,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "sp-api", @@ -13238,7 +13275,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "futures", "log", @@ -13256,7 +13293,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "futures", @@ -13271,7 +13308,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "parity-scale-codec", @@ -13289,7 +13326,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "parity-scale-codec", @@ -13310,7 +13347,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "lazy_static", "parity-scale-codec", @@ -13329,7 +13366,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "finality-grandpa", "log", @@ -13347,7 +13384,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "scale-info", @@ -13359,7 +13396,7 @@ dependencies = [ [[package]] name = "sp-core" version = "21.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13403,7 +13440,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "blake2b_simd", "byteorder", @@ -13417,7 +13454,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "proc-macro2", "quote", @@ -13428,7 +13465,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13437,7 +13474,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "proc-macro2", "quote", @@ -13447,7 +13484,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.19.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "environmental", "parity-scale-codec", @@ -13458,7 +13495,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13473,7 +13510,7 @@ dependencies = [ [[package]] name = "sp-io" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "bytes", "ed25519", @@ -13499,7 +13536,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "lazy_static", "sp-core", @@ -13510,7 +13547,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.27.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "futures", "parity-scale-codec", @@ -13524,7 +13561,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13533,7 +13570,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13544,7 +13581,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13562,7 +13599,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "scale-info", @@ -13576,7 +13613,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "sp-api", "sp-core", @@ -13586,7 +13623,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "backtrace", "lazy_static", @@ -13596,7 +13633,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "rustc-hash", "serde", @@ -13606,7 +13643,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "either", "hash256-std-hasher", @@ -13628,7 +13665,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "17.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13646,7 +13683,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "11.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "Inflector", "proc-macro-crate", @@ -13658,7 +13695,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "scale-info", @@ -13672,7 +13709,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "scale-info", @@ -13685,7 +13722,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.28.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "hash-db", "log", @@ -13705,7 +13742,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "log", "parity-scale-codec", @@ -13723,12 +13760,12 @@ dependencies = [ [[package]] name = "sp-std" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" [[package]] name = "sp-storage" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13741,7 +13778,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "futures-timer", @@ -13756,7 +13793,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "10.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "sp-std", @@ -13768,7 +13805,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "sp-api", "sp-runtime", @@ -13777,7 +13814,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "log", @@ -13793,7 +13830,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13816,7 +13853,7 @@ dependencies = [ [[package]] name = "sp-version" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13833,7 +13870,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13844,7 +13881,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "14.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13857,7 +13894,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "20.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "parity-scale-codec", "scale-info", @@ -14055,7 +14092,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "platforms", ] @@ -14063,7 +14100,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -14082,7 +14119,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "hyper", "log", @@ -14094,7 +14131,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "jsonrpsee", @@ -14107,7 +14144,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "jsonrpsee", "log", @@ -14126,7 +14163,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -14152,7 +14189,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "futures", "substrate-test-utils-derive", @@ -14162,7 +14199,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -14173,7 +14210,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "ansi_term", "build-helper", @@ -14272,15 +14309,16 @@ checksum = "9410d0f6853b1d94f0e519fb95df60f29d2c1eff2d921ffdf01a4c8a3b54f12d" [[package]] name = "tempfile" -version = "3.5.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" dependencies = [ + "autocfg", "cfg-if", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.3", - "windows-sys 0.45.0", + "rustix 0.37.19", + "windows-sys 0.48.0", ] [[package]] @@ -14833,7 +14871,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#31b57a1884b00ed979ba85343e308ed73756cb41" +source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" dependencies = [ "async-trait", "clap", diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 2f643b875ff..3c23c58273d 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -96,7 +96,7 @@ substrate-build-script-utils = { git = "https://github.com/paritytech/substrate" [dev-dependencies] assert_cmd = "2.0" nix = { version = "0.26.1", features = ["signal"] } -tempfile = "3.5.0" +tempfile = "3.6.0" tokio = { version = "1.28.2", features = ["macros", "time", "parking_lot"] } wait-timeout = "0.2" # purge_chain_works works with rococo-local and needs to allow this diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index 9aecf3a9220..f20f008cc6f 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -19,7 +19,7 @@ serde = { version = "1.0.163", features = ["derive"] } tokio = { version = "1.28.2", features = ["macros"] } tracing = "0.1.37" url = "2.4.0" -tempfile = "3.5.0" +tempfile = "3.6.0" # Substrate frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" } From 31b1469d830aaa7b0441d4d60f0c0c17be0cf114 Mon Sep 17 00:00:00 2001 From: Davide Galassi Date: Wed, 7 Jun 2023 13:34:20 +0200 Subject: [PATCH 280/339] Finalize target block after warp sync (#2696) * Finalize state after warp sync * Update cargo.lock * Apply code review suggestion Co-authored-by: Sebastian Kunert * Update lock --------- Co-authored-by: Sebastian Kunert --- Cargo.lock | 386 +++++++++---------- client/consensus/common/src/level_monitor.rs | 15 +- client/consensus/common/src/lib.rs | 7 + 3 files changed, 209 insertions(+), 199 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b1220305d5e..1316e32fb3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -865,7 +865,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "hash-db", "log", @@ -4151,7 +4151,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", ] @@ -4174,7 +4174,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-support-procedural", @@ -4199,7 +4199,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -4246,7 +4246,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4257,7 +4257,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -4274,7 +4274,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-system", @@ -4303,7 +4303,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-recursion", "futures", @@ -4324,7 +4324,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "bitflags", "environmental", @@ -4359,7 +4359,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "Inflector", "cfg-expr", @@ -4376,7 +4376,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4388,7 +4388,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "proc-macro2", "quote", @@ -4398,7 +4398,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "cfg-if", "frame-support", @@ -4417,7 +4417,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -4432,7 +4432,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "sp-api", @@ -4441,7 +4441,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "parity-scale-codec", @@ -6560,7 +6560,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "futures", "log", @@ -6579,7 +6579,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "anyhow", "jsonrpsee", @@ -7083,7 +7083,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -7104,7 +7104,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7122,7 +7122,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7137,7 +7137,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-system", @@ -7153,7 +7153,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-system", @@ -7169,7 +7169,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-system", @@ -7183,7 +7183,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7207,7 +7207,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7227,7 +7227,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7242,7 +7242,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-system", @@ -7261,7 +7261,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -7285,7 +7285,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7391,7 +7391,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7435,7 +7435,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7452,7 +7452,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "bitflags", "environmental", @@ -7482,7 +7482,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "bitflags", "parity-scale-codec", @@ -7495,7 +7495,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "proc-macro2", "quote", @@ -7505,7 +7505,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7522,7 +7522,7 @@ dependencies = [ [[package]] name = "pallet-core-fellowship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7540,7 +7540,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7558,7 +7558,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7581,7 +7581,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7594,7 +7594,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7612,7 +7612,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "docify", "frame-benchmarking", @@ -7631,7 +7631,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "blake2", "frame-benchmarking", @@ -7649,7 +7649,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7672,7 +7672,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7688,7 +7688,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7708,7 +7708,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7725,7 +7725,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-system", @@ -7739,7 +7739,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7756,7 +7756,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7775,7 +7775,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7792,7 +7792,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7808,7 +7808,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7825,7 +7825,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7843,7 +7843,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "pallet-nfts", @@ -7854,7 +7854,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7870,7 +7870,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-system", @@ -7887,7 +7887,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7907,7 +7907,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7918,7 +7918,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-system", @@ -7935,7 +7935,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7974,7 +7974,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -7991,7 +7991,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8006,7 +8006,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8024,7 +8024,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8039,7 +8039,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "assert_matches", "frame-benchmarking", @@ -8058,7 +8058,7 @@ dependencies = [ [[package]] name = "pallet-salary" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8076,7 +8076,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8093,7 +8093,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-system", @@ -8114,7 +8114,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8130,7 +8130,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-system", @@ -8144,7 +8144,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8167,7 +8167,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8178,7 +8178,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "log", "sp-arithmetic", @@ -8187,7 +8187,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "sp-api", @@ -8196,7 +8196,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8213,7 +8213,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8228,7 +8228,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8246,7 +8246,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8265,7 +8265,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-support", "frame-system", @@ -8281,7 +8281,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -8297,7 +8297,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -8309,7 +8309,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8326,7 +8326,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8341,7 +8341,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8357,7 +8357,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -8372,7 +8372,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-benchmarking", "frame-support", @@ -11535,7 +11535,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "log", "sp-core", @@ -11546,7 +11546,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "futures", @@ -11575,7 +11575,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "futures", "futures-timer", @@ -11598,7 +11598,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11613,7 +11613,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11632,7 +11632,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11643,7 +11643,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11683,7 +11683,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "fnv", "futures", @@ -11710,7 +11710,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "hash-db", "kvdb", @@ -11736,7 +11736,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "futures", @@ -11761,7 +11761,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "futures", @@ -11790,7 +11790,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "fork-tree", @@ -11826,7 +11826,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "futures", "jsonrpsee", @@ -11848,7 +11848,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11884,7 +11884,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "futures", "jsonrpsee", @@ -11903,7 +11903,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11916,7 +11916,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11956,7 +11956,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "finality-grandpa", "futures", @@ -11976,7 +11976,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "futures", @@ -11999,7 +11999,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "lru 0.10.0", "parity-scale-codec", @@ -12021,7 +12021,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -12033,7 +12033,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "anyhow", "cfg-if", @@ -12051,7 +12051,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "ansi_term", "futures", @@ -12067,7 +12067,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -12081,7 +12081,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12127,7 +12127,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-channel", "cid", @@ -12148,7 +12148,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12175,7 +12175,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "ahash 0.8.2", "futures", @@ -12193,7 +12193,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12215,7 +12215,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12249,7 +12249,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12267,7 +12267,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -12297,7 +12297,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -12306,7 +12306,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "futures", "jsonrpsee", @@ -12337,7 +12337,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12356,7 +12356,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "http", "jsonrpsee", @@ -12371,7 +12371,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12397,7 +12397,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "directories", @@ -12463,7 +12463,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "log", "parity-scale-codec", @@ -12474,7 +12474,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "clap", "fs4", @@ -12490,7 +12490,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12509,7 +12509,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "futures", "libc", @@ -12528,7 +12528,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "chrono", "futures", @@ -12547,7 +12547,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "ansi_term", "atty", @@ -12578,7 +12578,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12589,7 +12589,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "futures", @@ -12615,7 +12615,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "futures", @@ -12631,7 +12631,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-channel", "futures", @@ -13189,7 +13189,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "hash-db", "log", @@ -13209,7 +13209,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "Inflector", "blake2", @@ -13223,7 +13223,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "scale-info", @@ -13236,7 +13236,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "16.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "integer-sqrt", "num-traits", @@ -13250,7 +13250,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "scale-info", @@ -13263,7 +13263,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "sp-api", @@ -13275,7 +13275,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "futures", "log", @@ -13293,7 +13293,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "futures", @@ -13308,7 +13308,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "parity-scale-codec", @@ -13326,7 +13326,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "parity-scale-codec", @@ -13347,7 +13347,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "lazy_static", "parity-scale-codec", @@ -13366,7 +13366,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "finality-grandpa", "log", @@ -13384,7 +13384,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "scale-info", @@ -13396,7 +13396,7 @@ dependencies = [ [[package]] name = "sp-core" version = "21.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13440,7 +13440,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "blake2b_simd", "byteorder", @@ -13454,7 +13454,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "proc-macro2", "quote", @@ -13465,7 +13465,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13474,7 +13474,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "proc-macro2", "quote", @@ -13484,7 +13484,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.19.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "environmental", "parity-scale-codec", @@ -13495,7 +13495,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13510,7 +13510,7 @@ dependencies = [ [[package]] name = "sp-io" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "bytes", "ed25519", @@ -13536,7 +13536,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "lazy_static", "sp-core", @@ -13547,7 +13547,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.27.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "futures", "parity-scale-codec", @@ -13561,7 +13561,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13570,7 +13570,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13581,7 +13581,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13599,7 +13599,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "scale-info", @@ -13613,7 +13613,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "sp-api", "sp-core", @@ -13623,7 +13623,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "backtrace", "lazy_static", @@ -13633,7 +13633,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "rustc-hash", "serde", @@ -13643,7 +13643,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "either", "hash256-std-hasher", @@ -13665,7 +13665,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "17.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13683,7 +13683,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "11.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "Inflector", "proc-macro-crate", @@ -13695,7 +13695,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "scale-info", @@ -13709,7 +13709,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "scale-info", @@ -13722,7 +13722,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.28.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "hash-db", "log", @@ -13742,7 +13742,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "log", "parity-scale-codec", @@ -13760,12 +13760,12 @@ dependencies = [ [[package]] name = "sp-std" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" [[package]] name = "sp-storage" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13778,7 +13778,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "futures-timer", @@ -13793,7 +13793,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "10.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "sp-std", @@ -13805,7 +13805,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "sp-api", "sp-runtime", @@ -13814,7 +13814,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "log", @@ -13830,7 +13830,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13853,7 +13853,7 @@ dependencies = [ [[package]] name = "sp-version" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13870,7 +13870,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13881,7 +13881,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "14.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13894,7 +13894,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "20.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "parity-scale-codec", "scale-info", @@ -14092,7 +14092,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "platforms", ] @@ -14100,7 +14100,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -14119,7 +14119,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "hyper", "log", @@ -14131,7 +14131,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "jsonrpsee", @@ -14144,7 +14144,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "jsonrpsee", "log", @@ -14163,7 +14163,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -14189,7 +14189,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "futures", "substrate-test-utils-derive", @@ -14199,7 +14199,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -14210,7 +14210,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "ansi_term", "build-helper", @@ -14871,7 +14871,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#55bb6298e74d86be12732fd0f120185ee8fbfe97" +source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" dependencies = [ "async-trait", "clap", diff --git a/client/consensus/common/src/level_monitor.rs b/client/consensus/common/src/level_monitor.rs index ebdfaaf26ca..8a6bbef62f3 100644 --- a/client/consensus/common/src/level_monitor.rs +++ b/client/consensus/common/src/level_monitor.rs @@ -362,14 +362,18 @@ where /// Add a new imported block information to the monitor. pub fn block_imported(&mut self, number: NumberFor, hash: Block::Hash) { - self.import_counter += One::one(); - self.freshness.insert(hash, self.import_counter); - self.levels.entry(number).or_default().insert(hash); - - // Do cleanup once in a while, we are allowed to have some obsolete information. let finalized_num = self.backend.blockchain().info().finalized_number; + + if number > finalized_num { + // Only blocks above the last finalized block should be added to the monitor + self.import_counter += One::one(); + self.freshness.insert(hash, self.import_counter); + self.levels.entry(number).or_default().insert(hash); + } + let delta: u32 = finalized_num.saturating_sub(self.lowest_level).unique_saturated_into(); if delta >= CLEANUP_THRESHOLD { + // Do cleanup once in a while, we are allowed to have some obsolete information. for i in 0..delta { let number = self.lowest_level + i.unique_saturated_into(); self.levels.remove(&number).map(|level| { @@ -378,7 +382,6 @@ where }) }); } - self.lowest_level = finalized_num; } } diff --git a/client/consensus/common/src/lib.rs b/client/consensus/common/src/lib.rs index b74829e191f..f3ef4a3023a 100644 --- a/client/consensus/common/src/lib.rs +++ b/client/consensus/common/src/lib.rs @@ -147,6 +147,13 @@ where let hash = params.post_hash(); let number = *params.header.number(); + if params.with_state() { + // Force imported state finality. + // Required for warp sync. We assume that preconditions have been + // checked properly and we are importing a finalized block with state. + params.finalized = true; + } + // Best block is determined by the relay chain, or if we are doing the initial sync // we import all blocks as new best. params.fork_choice = Some(sc_consensus::ForkChoiceStrategy::Custom( From 6f3a7dbf815f40a168ae464127cd993d612bfbde Mon Sep 17 00:00:00 2001 From: Sergejs Kostjucenko <85877331+sergejparity@users.noreply.github.com> Date: Wed, 7 Jun 2023 23:48:17 +0300 Subject: [PATCH 281/339] fix gha set-output command (#2697) --- .github/workflows/release-10_rc-automation.yml | 10 +++++----- .github/workflows/release-30_create-draft.yml | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release-10_rc-automation.yml b/.github/workflows/release-10_rc-automation.yml index d0c669a5885..9b6e156a2c4 100644 --- a/.github/workflows/release-10_rc-automation.yml +++ b/.github/workflows/release-10_rc-automation.yml @@ -27,7 +27,7 @@ jobs: # Get last rc tag if exists, else set it to {version}-rc1 version=${GITHUB_REF#refs/heads/release-} echo "$version" - echo "::set-output name=version::$version" + echo "version=$version" >> $GITHUB_OUTPUT git tag -l last_rc=$(git tag -l "$version-rc*" | sort -V | tail -n 1) if [ -n "$last_rc" ]; then @@ -35,11 +35,11 @@ jobs: echo $suffix ((suffix++)) echo $suffix - echo "::set-output name=new_tag::$version-rc$suffix" - echo "::set-output name=first_rc::false" + echo "new_tag=$version-rc$suffix" >> $GITHUB_OUTPUT + echo "first_rc=false" >> $GITHUB_OUTPUT else - echo "::set-output name=new_tag::$version-rc1" - echo "::set-output name=first_rc::true" + echo "new_tag=$version-rc1" >> $GITHUB_OUTPUT + echo "first_rc=true" >> $GITHUB_OUTPUT fi - name: Apply new tag diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index b79f1948c16..8f62e712ee3 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -34,8 +34,8 @@ jobs: steps: - id: get-rust-versions run: | - echo "::set-output name=stable::$(rustc +stable --version)" - echo "::set-output name=nightly::$(rustc +nightly --version)" + echo "stable=$(rustc +stable --version)" >> $GITHUB_OUTPUT + echo "nightly=$(rustc +nightly --version)" >> $GITHUB_OUTPUT # We do not skip the entire job for client builds (although we don't need it) # because it is a dep of the next job. However we skip the time consuming steps. @@ -267,7 +267,7 @@ jobs: ls "$RUNTIME_DIR/${{ matrix.category }}/${{ matrix.runtime }}" runtime_ver=$(ruby script.rb) echo "Found version: >$runtime_ver<" - echo "::set-output name=runtime_ver::$runtime_ver" + echo "runtime_ver=$runtime_ver" >> $GITHUB_OUTPUT - name: Fix runtime name id: fix-runtime-path From 8d024e61d8f6571707da4f8eda2c4b77b86de259 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 8 Jun 2023 10:29:35 +0200 Subject: [PATCH 282/339] Introduced AssetTransferKind + heavy refactor --- .../bridge-transfer/src/benchmarking.rs | 4 +- .../pallets/bridge-transfer/src/impls.rs | 149 +- parachains/pallets/bridge-transfer/src/lib.rs | 1353 +++++++++------- .../pallets/bridge-transfer/src/types.rs | 472 ++++++ .../pallets/bridge-transfer/src/weights.rs | 26 + .../runtimes/assets/common/src/matching.rs | 22 - .../runtimes/assets/statemine/src/lib.rs | 10 +- .../src/weights/pallet_bridge_transfer.rs | 37 + .../assets/statemine/src/xcm_config.rs | 12 +- .../runtimes/assets/statemine/tests/tests.rs | 63 +- .../runtimes/assets/test-utils/src/lib.rs | 1 + .../assets/test-utils/src/test_cases.rs | 742 +-------- .../test-utils/src/test_cases_over_bridge.rs | 1355 +++++++++++++++++ .../runtimes/assets/westmint/src/lib.rs | 10 +- .../src/weights/pallet_bridge_transfer.rs | 45 + .../assets/westmint/src/xcm_config.rs | 12 +- .../runtimes/assets/westmint/tests/tests.rs | 63 +- .../bridge-hubs/test-utils/src/test_cases.rs | 2 +- 18 files changed, 3040 insertions(+), 1338 deletions(-) create mode 100644 parachains/pallets/bridge-transfer/src/types.rs create mode 100644 parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index 08a9672fe4d..689e9fe3bc9 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -171,7 +171,7 @@ benchmarks! { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let location = match T::BenchmarkHelper::reserve_location() { Some(location) => location, - None => match T::ReserveLocationsLimit::get() > 0_u32 { + None => match T::ReserveAssetLocationsLimit::get() > 0_u32 { true => return Err(BenchmarkError::Stop("missing `reserve_location` data")), false => return Err(BenchmarkError::Weightless), } @@ -185,7 +185,7 @@ benchmarks! { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let location = match T::BenchmarkHelper::reserve_location() { Some(location) => location, - None => match T::ReserveLocationsLimit::get() > 0_u32 { + None => match T::ReserveAssetLocationsLimit::get() > 0_u32 { true => return Err(BenchmarkError::Stop("missing `reserve_location` data")), false => return Err(BenchmarkError::Weightless), } diff --git a/parachains/pallets/bridge-transfer/src/impls.rs b/parachains/pallets/bridge-transfer/src/impls.rs index 65b6adb1d79..495d8e5fb6f 100644 --- a/parachains/pallets/bridge-transfer/src/impls.rs +++ b/parachains/pallets/bridge-transfer/src/impls.rs @@ -13,7 +13,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::{Config, Pallet}; +use crate::{ + types::{AssetFilterT, LatestVersionedMultiLocation}, + AssetTransferKind, BridgeConfig, Config, Pallet, ResolveAssetTransferKind, UsingVersioned, + LOG_TARGET, +}; use frame_support::traits::{Contains, ContainsPair}; use xcm::prelude::*; use xcm_builder::ExporterFor; @@ -25,8 +29,37 @@ impl ExporterFor for Pallet { _remote_location: &InteriorMultiLocation, _message: &Xcm<()>, ) -> Option<(MultiLocation, Option)> { - Self::allowed_exporters(network) - .map(|bridge_config| (bridge_config.bridge_location, bridge_config.bridge_location_fee)) + match Self::allowed_exporters(network) { + Some(BridgeConfig { bridge_location, bridge_location_fee, .. }) => { + let bridge_location = match bridge_location.to_versioned() { + Ok(versioned) => versioned, + Err(e) => { + log::warn!( + target: LOG_TARGET, + "Exporter for network: {:?} - bridge_location has error: {:?}!", + network, e + ); + return None + }, + }; + let bridge_location_fee = match bridge_location_fee { + Some(fee) => match fee.to_versioned() { + Ok(versioned) => Some(versioned), + Err(e) => { + log::warn!( + target: LOG_TARGET, + "ExporterFor network: {:?} - bridge_location_fee has error: {:?}!", + network, e + ); + return None + }, + }, + None => None, + }; + Some((bridge_location, bridge_location_fee)) + }, + None => None, + } } } @@ -34,23 +67,109 @@ impl ExporterFor for Pallet { pub struct AllowedUniversalAliasesOf(sp_std::marker::PhantomData); impl Contains<(MultiLocation, Junction)> for AllowedUniversalAliasesOf { fn contains((location, junction): &(MultiLocation, Junction)) -> bool { - log::trace!(target: "xcm::contains", "AllowedUniversalAliasesOf location: {:?}, junction: {:?}", location, junction); - Pallet::::allowed_universal_aliases(location).contains(junction) + log::trace!( + target: "xcm::contains", + "AllowedUniversalAliasesOf location: {:?}, junction: {:?}", location, junction + ); + + Pallet::::allowed_universal_aliases(LatestVersionedMultiLocation(location)) + .contains(junction) } } -/// Verifies if we can allow `(MultiAsset, MultiLocation)` as trusted reserve. -pub struct IsAllowedReserveOf(sp_std::marker::PhantomData<(T, F)>); -impl> ContainsPair - for IsAllowedReserveOf +/// Verifies if we can allow `(MultiAsset, MultiLocation)` as trusted reserve received from "bridge". +pub struct IsTrustedBridgedReserveForConcreteAsset(sp_std::marker::PhantomData); +impl ContainsPair + for IsTrustedBridgedReserveForConcreteAsset { fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { - log::trace!(target: "xcm::contains", "IsAllowedReserveOf asset: {:?}, origin: {:?}", asset, origin); - // first check - if we have configured origin as trusted reserve location - if !Pallet::::allowed_reserve_locations().contains(origin) { - return false + log::trace!( + target: "xcm::contains", + "IsTrustedBridgedReserve asset: {:?}, origin: {:?}", + asset, origin + ); + + let asset_location = match &asset.id { + Concrete(location) => location, + _ => return false, + }; + + let versioned_origin = LatestVersionedMultiLocation(origin); + Pallet::::allowed_reserve_locations(versioned_origin) + .map_or(false, |filter| match filter.matches(asset_location) { + Ok(result) => result, + Err(e) => { + log::error!( + target: "xcm::contains", + "IsTrustedBridgedReserveForConcreteAsset has error: {:?} for asset_location: {:?} and origin: {:?}!", + e, asset_location, origin + ); + false + }, + }) + } +} + +/// Implementation of `ResolveTransferKind` which tries to resolve all kinds of transfer according to on-chain configuration. +pub struct ConfiguredConcreteAssetTransferKindResolver(sp_std::marker::PhantomData); + +impl ResolveAssetTransferKind for ConfiguredConcreteAssetTransferKindResolver { + fn resolve(asset: &MultiAsset, target_location: &MultiLocation) -> AssetTransferKind { + log::trace!( + target: LOG_TARGET, + "ConfiguredConcreteAssetTransferKindResolver resolve asset: {:?}, target_location: {:?}", + asset, target_location + ); + + let asset_location = match &asset.id { + Concrete(location) => location, + _ => return AssetTransferKind::Unsupported, + }; + + // first, we check, if we are trying to transfer back reserve-deposited assets + // other words: if target_location is a known reserve location for asset + if IsTrustedBridgedReserveForConcreteAsset::::contains(asset, target_location) { + return AssetTransferKind::WithdrawReserve } - // second check - we need to pass additional `(asset, origin)` filter - F::contains(asset, origin) + + // second, we check, if target_location is allowed for requested asset to be transferred there + match target_location.interior.global_consensus() { + Ok(target_consensus) => { + if let Some(bridge_config) = Pallet::::allowed_exporters(target_consensus) { + match bridge_config.allowed_target_location_for(target_location) { + Ok(Some((_, Some(asset_filter)))) => { + match asset_filter.matches(asset_location) { + Ok(true) => return AssetTransferKind::ReserveBased, + Ok(false) => (), + Err(e) => { + log::error!( + target: LOG_TARGET, + "ConfiguredConcreteAssetTransferKindResolver `asset_filter.matches` has error: {:?} for asset_location: {:?} and target_location: {:?}!", + e, asset_location, target_location + ); + }, + } + }, + Ok(_) => (), + Err(e) => { + log::warn!( + target: LOG_TARGET, + "ConfiguredBridgeTransferKindResolver allowed_target_location_for has error: {:?} for target_location: {:?}!", + e, target_location + ); + }, + } + } + }, + Err(_) => { + log::warn!( + target: LOG_TARGET, + "ConfiguredBridgeTransferKindResolver target_location: {:?} does not contain global consensus!", + target_location + ); + }, + } + + AssetTransferKind::Unsupported } } diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 4ad8ef11cbb..2fa93f64301 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -15,48 +15,68 @@ //! # Bridge Transfer Pallet //! -//! Module which could help with different transfers through bridges, -//! e.g. move assets between different global consensus... +//! Module helps with different transfers through bridges between different consensus chain. +//! +//! One of possible scenarios which supports directly is "transfer asset over bridge (back and forth)". +//! With fine-grained configuration you can control transferred assets (out/in) between different consensus chain. +//! E.g. you can allow just some assets to go out/in based on their `MultiLocation` patterns. +//! "Transfer asset over bridge" recognize two kinds of transfer see [AssetTransferKind]. //! //! ## Overview //! -//! Pallet supports configuration for two independent scenarios: +//! Pallet supports configuration for several independent scenarios: +//! +//! ### 1. Support to store on-chain bridge locations +//! +//! * Bridge locations/fees can be stored on-chain in [AllowedExporters] +//! * Managing bridge locations can be done with dedicated extrinsics: `add_exporter_config / remove_exporter_config / update_exporter_config` +//! * Pallet implements `xcm_builder::ExporterFor` which can be used with `xcm_builder::UnpaidRemoteExporter/SovereignPaidRemoteExporter` //! -//! ### Transfer out +//! ### 2. Support to store on-chain allowed bridged target locations with asset filters //! -//! * see (Config for transfer out) in the code -//! * if you want to allow initiate bridge transfer from runtime, -//! actually pallet supports asset transfer and ping with dedicated extrinsics `transfer_asset_via_bridge` / `ping_via_bridge` -//! * e.g. for asset transfer with correct configuration it sends `ReserveAssetDeposited` over bridge, -//! you can configure bridge location and allowed target location with `AllowedExporters` +//! * (Used for transfer assets out) +//! * If we want to use `transfer_asset_via_bridge` we should setup the target location with asset filter to allow reserve asset transfer to this location over bridge. +//! * Managing target location and asset filer can be done with dedicated extrinsics: +//! * - `update_bridged_target_location / remove_bridged_target_location` - managing target location behind bridge +//! * - `allow_reserve_asset_transfer_for / disallow_reserve_asset_transfer_for` - managing asset filters //! -//! ### Transfer in +//! ### 3. Support to store on-chain allowed universal aliases/origins //! -//! * see (Config for transfer in) in the code -//! * e.g. if you want to allow process xcm `UniversalOrigin` instruction, -//! you can configure "allowed universal aliases" here and then use it for `xcm_executor::Config`: -//! `type UniversalAliases = AllowedUniversalAliasesOf;` -//! * e.g. if you want to allow process xcm `ReserveAssetDeposited` instruction, -//! you can configure "allowed reserve locations" here and then use it for `xcm_executor::Config`: +//! * (Used for transfer assets in) +//! * Aliases can be stored on-chain in [AllowedUniversalAliases] +//! * Managing bridge locations can be done with dedicated extrinsics: `add_universal_alias / remove_universal_alias` +//! * Stored aliases can be accessed by [impls::AllowedUniversalAliasesOf] and configured for e.g. `xcm_executor::Config`: //! ```nocompile -//! type IsReserve = IsAllowedReserveOf< -//! Runtime, -//! IsDifferentGlobalConsensusConcreteAsset, -//! >; +//! impl xcm_executor::Config for XcmConfig { +//! ... +//! type UniversalAliases = AllowedUniversalAliasesOf; +//! ... +//! } //! ``` //! -//! Transfer in/out are independent so you can configure just to receive or just to send part. -//! All configuration is done by dedicated extrinsics under `AdminOrigin` so for example runtime can allow to change this configuration just by governance. +//! ### 4. Support to store on-chain allowed reserve locations with allowed asset filters +//! +//! * (Used for transfer assets in) +//! * Reserve locations with asset filters can be stored on-chain in [AllowedReserveLocations] +//! * Managing bridge locations can be done with dedicated extrinsics: `add_reserve_location / remove_reserve_location` +//! * Stored reserve locations can be accessed by [impls::IsTrustedBridgedReserveForConcreteAsset] and configured for e.g. `xcm_executor::Config`: +//! ```nocompile +//! impl xcm_executor::Config for XcmConfig { +//! ... +//! type IsReserve = IsTrustedBridgedReserveForConcreteAsset; +//! ... +//! } +//! ``` // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{transactional, BoundedBTreeSet}; -use scale_info::TypeInfo; -use sp_runtime::RuntimeDebug; use sp_std::boxed::Box; +mod types; +pub use types::*; + pub use pallet::*; use xcm::prelude::*; @@ -68,56 +88,15 @@ pub mod weights; /// The log target of this pallet. pub const LOG_TARGET: &str = "runtime::bridge-transfer"; -#[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug, MaxEncodedLen, TypeInfo)] -pub struct BridgeConfig { - /// Contains location, which is able to bridge XCM messages to bridged network - pub bridge_location: MultiLocation, - /// Fee which could be needed to pay in `bridge_location` - /// `MultiAsset` is here from the point of view of `bridge_location`, e.g.: `MultiLocation::parent()` means relay chain token of `bridge_location` - pub bridge_location_fee: Option, - - /// Contains target destination on bridged network. E.g.: MultiLocation of Statemine/t on different consensus - // TODO:check-parameter - lets start with 1..1, maybe later we could extend this with BoundedVec - // TODO: bridged bridge-hub should have router for this - pub allowed_target_location: MultiLocation, - // TODO:check-parameter - can we store Option and then aviod using `Unlimited`? - /// If `None` then `UnpaidExecution` is used, else `Withdraw(target_location_fee)/BuyExecution(target_location_fee, Unlimited)` - /// `MultiAsset` is here from the point of view of `allowed_target_location`, e.g.: `MultiLocation::parent()` means relay chain token of `allowed_target_location` - pub max_target_location_fee: Option, -} - -/// Trait for constructing ping message. -pub trait PingMessageBuilder { - fn try_build( - local_origin: &MultiLocation, - network: &NetworkId, - remote_destination: &MultiLocation, - ) -> Option>; -} - -impl PingMessageBuilder for () { - fn try_build(_: &MultiLocation, _: &NetworkId, _: &MultiLocation) -> Option> { - None - } -} - -/// Builder creates xcm message just with `Trap` instruction. -pub struct UnpaidTrapMessageBuilder(sp_std::marker::PhantomData); -impl> PingMessageBuilder - for UnpaidTrapMessageBuilder -{ - fn try_build(_: &MultiLocation, _: &NetworkId, _: &MultiLocation) -> Option> { - Some(Xcm(sp_std::vec![Trap(TrapCode::get())])) - } -} - #[frame_support::pallet] pub mod pallet { pub use crate::weights::WeightInfo; use super::*; - use frame_support::pallet_prelude::*; + use crate::filter::{AssetFilter, AssetFilterOf, MultiLocationFilterOf}; + use frame_support::{pallet_prelude::*, traits::EnsureOriginWithArg}; use frame_system::{pallet_prelude::*, unique}; + use xcm_builder::ensure_is_remote; use xcm_executor::traits::TransactAsset; #[pallet::pallet] @@ -150,21 +129,6 @@ pub mod pallet { None } - /// Prepare environment for ping transfer and return transfer origin and assets - /// to transfer. After this function is called, we expect `ping_via_bridge` - /// to succeed, so in proper environment, it should: - /// - /// - deposit enough funds (fee from `bridge_config()`) to the sender account; - /// - /// - ensure that the `BridgeXcmSender` is properly configured for the transfer; - /// - /// - be close to the worst possible scenario - i.e. if some account may need to be created during - /// it should be created. If there are multiple bridges, the "worst possible" - /// (in terms of performance) bridge must be selected for the transfer. - fn prepare_ping_transfer() -> Option<(RuntimeOrigin, VersionedMultiLocation)> { - None - } - fn universal_alias() -> Option<(VersionedMultiLocation, Junction)> { None } @@ -185,34 +149,41 @@ pub mod pallet { /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; - /// The configurable origin to allow bridges configuration management + /// The configurable origin to allow bridges configuration management. type AdminOrigin: EnsureOrigin; + /// The configurable origin to allow transfer out asset filters management. + type AllowReserveAssetTransferOrigin: EnsureOriginWithArg< + Self::RuntimeOrigin, + AssetFilterOf, + >; /// Max allowed universal aliases per one `MultiLocation` /// (Config for transfer in) + #[pallet::constant] type UniversalAliasesLimit: Get; /// Max allowed reserve locations - /// (Config for transfer in) + /// (Config for transfer out) + #[pallet::constant] type ReserveLocationsLimit: Get; + /// Max allowed assets for one reserve location + /// (Config for transfer in/out) + #[pallet::constant] + type AssetsPerReserveLocationLimit: Get; /// How to withdraw and deposit an asset for reserve. /// (Config for transfer out) type AssetTransactor: TransactAsset; + /// Transfer type resolver for `asset` to `target_location`. + type AssetTransferKindResolver: ResolveAssetTransferKind; /// XCM sender which sends messages to the BridgeHub /// (Config for transfer out) type BridgeXcmSender: SendXcm; /// Required origin for asset transfer. If successful, it resolves to `MultiLocation`. /// (Config for transfer out) - type TransferAssetOrigin: EnsureOrigin; + type AssetTransferOrigin: EnsureOrigin; /// Max count of assets in one call /// (Config for transfer out) type MaxAssetsLimit: Get; - /// Required origin for ping transfer. If successful, it resolves to `MultiLocation`. - /// (Config for transfer out) - type TransferPingOrigin: EnsureOrigin; - /// Configurable ping message, `None` means no message will be transferred. - /// (Config for transfer out) - type PingMessageBuilder: PingMessageBuilder; /// Benchmarks helper. #[cfg(feature = "runtime-benchmarks")] @@ -224,7 +195,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn allowed_exporters)] pub(super) type AllowedExporters = - StorageMap<_, Blake2_128Concat, NetworkId, BridgeConfig>; + StorageMap<_, Blake2_128Concat, NetworkId, BridgeConfig>; /// Holds allowed mappings `MultiLocation->Junction` for `UniversalAliases` /// E.g: @@ -236,22 +207,23 @@ pub mod pallet { pub(super) type AllowedUniversalAliases = StorageMap< _, Blake2_128Concat, - MultiLocation, + VersionedMultiLocation, BoundedBTreeSet, ValueQuery, >; - /// Holds allowed mappings `MultiLocation` as trusted reserve locations + /// Holds allowed mappings `MultiLocation` as trusted reserve locations for allowed assets /// (Config for transfer in) #[pallet::storage] #[pallet::getter(fn allowed_reserve_locations)] pub(super) type AllowedReserveLocations = - StorageValue<_, BoundedBTreeSet, ValueQuery>; + StorageMap<_, Blake2_128Concat, VersionedMultiLocation, AssetFilterOf, OptionQuery>; #[pallet::error] #[cfg_attr(test, derive(PartialEq))] pub enum Error { InvalidConfiguration, + InvalidBridgeConfiguration, UnavailableConfiguration, ConfigurationAlreadyExists, InvalidAssets, @@ -261,7 +233,8 @@ pub mod pallet { InvalidRemoteDestination, BridgeCallError, FailedToReserve, - UnsupportedPing, + FailedToWithdraw, + UnsupportedAssetTransferKind, } #[pallet::event] @@ -277,20 +250,24 @@ pub mod pallet { sender_cost: MultiAssets, }, - /// Reserve asset passed + /// Reserve assets passed ReserveAssetsDeposited { from: MultiLocation, to: MultiLocation, assets: MultiAssets }, + /// Assets were withdrawn + AssetsWithdrawn { from: MultiLocation, assets: MultiAssets }, /// New bridge configuration was added BridgeAdded, /// Bridge configuration was removed BridgeRemoved, - /// Bridge configuration was updated - BridgeUpdated, + /// Bridge fee configuration was updated + BridgeFeeUpdated, + /// Target location for bridge was updated + BridgeTargetLocationUpdated, /// New universal alias was added UniversalAliasAdded, /// New universal alias was removed - UniversalAliasRemoved, + UniversalAliasRemoved { junction: Junction }, /// New reserve location was added ReserveLocationAdded, @@ -314,11 +291,10 @@ pub mod pallet { destination: Box, ) -> DispatchResult { // Check origin - let origin_location = T::TransferAssetOrigin::ensure_origin(origin)?; + let origin_location = T::AssetTransferOrigin::ensure_origin(origin)?; - // Check remote destination + bridge_config - let (_, bridge_config, remote_destination) = - Self::ensure_remote_destination(*destination)?; + // Check if remote destination is reachable + let destination = Self::ensure_reachable_remote_destination(*destination)?; // Check assets (lets leave others checks on `AssetTransactor`) let assets: MultiAssets = @@ -328,48 +304,12 @@ pub mod pallet { Error::::MaxAssetsLimitReached ); - // Do this in transaction (explicitly), the rollback should occur in case of any error and no assets will be trapped or lost - Self::do_reserve_and_send_in_transaction( - origin_location, - remote_destination, - assets, - bridge_config, - ) - } - - /// Transfer `ping` via bridge to different global consensus. - /// - /// - can be used for testing purposes that bridge transfer is working and configured for `destination` - /// - /// Parameters: - /// - /// * `destination`: Different consensus location, e.g. Polkadot's Statemint: `2, X2(GlobalConsensus(NetworkId::Polkadot), Parachain(1000))` - #[pallet::call_index(4)] - #[pallet::weight(T::WeightInfo::ping_via_bridge())] - pub fn ping_via_bridge( - origin: OriginFor, - destination: Box, - ) -> DispatchResult { - let origin_location = T::TransferPingOrigin::ensure_origin(origin)?; - - // Check remote destination + bridge_config - let (network, bridge_config, remote_destination) = - Self::ensure_remote_destination(*destination)?; - - // Check reserve account - sovereign account of bridge - let allowed_target_location = bridge_config.allowed_target_location; - - // Prepare `ping` message - let xcm: Xcm<()> = - T::PingMessageBuilder::try_build(&origin_location, &network, &remote_destination) - .ok_or(Error::::UnsupportedPing)?; - // Initiate bridge transfer - Self::initiate_bridge_transfer(allowed_target_location, unique(&xcm), xcm) - .map_err(Into::into) + // Do this in transaction (explicitly), the rollback should occur in case of any error and no assets will be trapped or lost + Self::do_transfer_asset_via_bridge_in_transaction(origin_location, destination, assets) } - /// Adds new bridge configuration, which allows transfer to this `bridged_network`. + /// Adds new bridge exporter, which allows transfer to this `bridged_network`. /// /// Parameters: /// @@ -380,29 +320,36 @@ pub mod pallet { pub fn add_exporter_config( origin: OriginFor, bridged_network: NetworkId, - bridge_config: Box, + bridge_location: Box, + bridge_location_fee: Option>, ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; + + // allow just one exporter for one network (can be changed in future) ensure!( !AllowedExporters::::contains_key(bridged_network), Error::::ConfigurationAlreadyExists ); - let allowed_target_location_network = bridge_config - .allowed_target_location - .interior() - .global_consensus() - .map_err(|_| Error::::InvalidConfiguration)?; + + // check bridge is from local consensus ensure!( - bridged_network == allowed_target_location_network, + bridge_location + .using_versioned_ref(|versioned| versioned.parents) + .map_err(|_| Error::::UnsupportedXcmVersion)? <= + 1, Error::::InvalidConfiguration ); - // bridged consensus must be different - let local_network = T::UniversalLocation::get() - .global_consensus() - .map_err(|_| Error::::InvalidConfiguration)?; - ensure!(bridged_network != local_network, Error::::InvalidConfiguration); - AllowedExporters::::insert(bridged_network, bridge_config); + // insert + AllowedExporters::::insert( + bridged_network, + BridgeConfig { + bridge_location: *bridge_location, + bridge_location_fee: bridge_location_fee.map(|fee| *fee), + allowed_target_locations: Default::default(), + }, + ); + Self::deposit_event(Event::BridgeAdded); Ok(()) } @@ -434,29 +381,82 @@ pub mod pallet { /// Parameters: /// /// * `bridged_network`: Network where we want to remove - /// * `fee`: New fee to update + /// * `bridge_location_fee`: New fee to update #[pallet::call_index(3)] #[pallet::weight(T::WeightInfo::update_exporter_config())] pub fn update_exporter_config( origin: OriginFor, bridged_network: NetworkId, bridge_location_fee: Option>, - target_location_fee: Option>, ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { let bridge_config = maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; - bridge_config.bridge_location_fee = bridge_location_fee - .map(|fee| MultiAsset::try_from(*fee)) - .transpose() - .map_err(|_| Error::::UnsupportedXcmVersion)?; - bridge_config.max_target_location_fee = target_location_fee - .map(|fee| MultiAsset::try_from(*fee)) - .transpose() - .map_err(|_| Error::::UnsupportedXcmVersion)?; - Self::deposit_event(Event::BridgeUpdated); + bridge_config.bridge_location_fee = bridge_location_fee.map(|fee| *fee); + Self::deposit_event(Event::BridgeFeeUpdated); + Ok(()) + }) + } + + /// Alters bridge configuration with asset filter, which allows to send out matched assets to the `target_location` + /// + /// Parameters: + /// + /// * `bridged_network`: bridge identifier + /// * `target_location`: target location where we want to allow send assets + /// * `asset_filter`: asset filter to add + #[pallet::call_index(4)] + #[pallet::weight(T::WeightInfo::update_bridged_target_location())] + pub fn update_bridged_target_location( + origin: OriginFor, + bridged_network: NetworkId, + target_location: Box, + max_target_location_fee: Option>, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + + AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { + let bridge_config = + maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; + bridge_config + .update_allowed_target_location( + *target_location, + max_target_location_fee.map(|fee| *fee), + ) + .map_err(|_| Error::::InvalidBridgeConfiguration)?; + Self::deposit_event(Event::BridgeTargetLocationUpdated); + Ok(()) + }) + } + + /// Alters bridge configuration with asset filter, which allows to send out matched assets to the `target_location` + /// + /// Parameters: + /// + /// * `bridged_network`: bridge identifier + /// * `target_location`: target location where we want to allow send assets + /// * `asset_filter`: asset filter to add + #[pallet::call_index(6)] + #[pallet::weight(T::WeightInfo::allow_reserve_asset_transfer_for())] + pub fn allow_reserve_asset_transfer_for( + origin: OriginFor, + bridged_network: NetworkId, + target_location: Box, + asset_filter: AssetFilterOf, + ) -> DispatchResult { + let _ = T::AllowReserveAssetTransferOrigin::ensure_origin(origin, &asset_filter)?; + + AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { + let bridge_config = + maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; + let was_added = bridge_config + .add_allowed_target_location_filter_for(*target_location, asset_filter) + .map_err(|_| Error::::InvalidBridgeConfiguration)?; + if was_added { + Self::deposit_event(Event::ReserveLocationAdded); + } Ok(()) }) } @@ -467,7 +467,7 @@ pub mod pallet { /// /// * `location`: key /// * `junction`: value - #[pallet::call_index(5)] + #[pallet::call_index(8)] #[pallet::weight(T::WeightInfo::add_universal_alias())] pub fn add_universal_alias( origin: OriginFor, @@ -476,16 +476,14 @@ pub mod pallet { ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; - let location: MultiLocation = - (*location).try_into().map_err(|_| Error::::UnsupportedXcmVersion)?; - let added = AllowedUniversalAliases::::try_mutate(location, |junctions| { - junctions.try_insert(junction) + let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) + .map_err(|_| Error::::UnsupportedXcmVersion)?; + AllowedUniversalAliases::::try_mutate(versioned_location, |junctions| { + if junctions.try_insert(junction).map_err(|_| Error::::InvalidConfiguration)? { + Self::deposit_event(Event::UniversalAliasAdded); + } + Ok(()) }) - .map_err(|_| Error::::InvalidConfiguration)?; - if added { - Self::deposit_event(Event::UniversalAliasAdded); - } - Ok(()) } /// Remove `(MultiLocation, Junction)` mapping from `AllowedUniversalAliases` @@ -494,7 +492,7 @@ pub mod pallet { /// /// * `location`: key /// * `junction`: value - #[pallet::call_index(6)] + #[pallet::call_index(9)] #[pallet::weight(T::WeightInfo::remove_universal_alias())] pub fn remove_universal_alias( origin: OriginFor, @@ -503,76 +501,115 @@ pub mod pallet { ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; - let location: MultiLocation = - (*location).try_into().map_err(|_| Error::::UnsupportedXcmVersion)?; - let removed = AllowedUniversalAliases::::try_mutate( - location, - |junctions| -> Result> { - let mut removed = false; - for jtr in junctions_to_remove { - removed |= junctions.remove(&jtr); + let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) + .map_err(|_| Error::::UnsupportedXcmVersion)?; + AllowedUniversalAliases::::try_mutate_exists(versioned_location, |maybe_junctions| { + let junctions = + maybe_junctions.as_mut().ok_or(Error::::UnavailableConfiguration)?; + for jtr in junctions_to_remove { + if junctions.remove(&jtr) { + Self::deposit_event(Event::UniversalAliasRemoved { junction: jtr }); } - Ok(removed) - }, - )?; - if removed { - Self::deposit_event(Event::UniversalAliasRemoved); - } - Ok(()) + } + + if junctions.is_empty() { + // no junctions, so remove entry from storage + *maybe_junctions = None; + } + + Ok(()) + }) } - /// Add `MultiLocation` mapping to `AllowedReserveLocations` + /// Add `MultiLocation` + `AssetFilter` mapping to `AllowedReserveLocations` /// /// Parameters: /// /// * `location`: as reserve `MultiLocation` - #[pallet::call_index(7)] + /// * `asset_filter_to_add`: filter we want to add for that location + #[pallet::call_index(10)] #[pallet::weight(T::WeightInfo::add_reserve_location())] pub fn add_reserve_location( origin: OriginFor, location: Box, + asset_filter_to_add: AssetFilterOf, ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; - let location: MultiLocation = - (*location).try_into().map_err(|_| Error::::UnsupportedXcmVersion)?; - let added = AllowedReserveLocations::::try_mutate(|locations| { - locations.try_insert(location) + let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) + .map_err(|_| Error::::UnsupportedXcmVersion)?; + AllowedReserveLocations::::try_mutate(versioned_location, |filter| { + let was_added = match filter { + Some(old_filter) => old_filter + .add(asset_filter_to_add) + .map_err(|_| Error::::InvalidConfiguration)?, + None => { + *filter = Some(asset_filter_to_add); + true + }, + }; + if was_added { + Self::deposit_event(Event::ReserveLocationAdded); + } + Ok(()) }) - .map_err(|_| Error::::InvalidConfiguration)?; - if added { - Self::deposit_event(Event::ReserveLocationAdded); - } - Ok(()) } - /// Remove `MultiLocation` mapping from `AllowedReserveLocations` + /// Remove `MultiLocation` mapping from `AllowedReserveLocations`. /// /// Parameters: /// /// * `location`: as reserve `MultiLocation` - #[pallet::call_index(8)] + /// * `asset_filter_to_remove`: if `None` the whole `location` entry will be removed, otherwise only selected filters + #[pallet::call_index(11)] #[pallet::weight(T::WeightInfo::remove_reserve_location())] pub fn remove_reserve_location( origin: OriginFor, - locations_to_remove: sp_std::prelude::Vec, + location: Box, + asset_filter_to_remove: Option>, ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; - let removed = - AllowedReserveLocations::::try_mutate(|locations| -> Result> { - let mut removed = false; - for ltr in locations_to_remove { - let ltr: MultiLocation = - ltr.try_into().map_err(|_| Error::::UnsupportedXcmVersion)?; - removed |= locations.remove(<r); + let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) + .map_err(|_| Error::::UnsupportedXcmVersion)?; + let (mut was_removed, remove_location) = if let Some(asset_filter_to_remove) = + asset_filter_to_remove + { + AllowedReserveLocations::::try_mutate_exists( + versioned_location, + |maybe_filter| { + let filter = + maybe_filter.as_mut().ok_or(Error::::UnavailableConfiguration)?; + match filter { + AssetFilter::ByMultiLocation(old) => { + let was_removed = old.remove(asset_filter_to_remove); + was_removed.map(|wr| (wr, old.is_empty())).map_err(Into::into) + }, + AssetFilter::All => Err(Error::::UnavailableConfiguration), + } + }, + )? + } else { + (false, true) + }; + + if remove_location { + was_removed |= AllowedReserveLocations::::try_mutate_exists(location, |value| { + let exists = value.is_some(); + if exists { + *value = None; } - Ok(removed) - })?; - if removed { + Ok::<_, Error>(exists) + }) + .map_err(|_| Error::::InvalidConfiguration)?; + } + + if was_removed { Self::deposit_event(Event::ReserveLocationRemoved); + Ok(()) + } else { + Err(Error::::InvalidConfiguration.into()) } - Ok(()) } } @@ -580,113 +617,137 @@ pub mod pallet { /// Validates destination and check if we support bridging to this remote global consensus /// /// Returns: correct remote location, where we should be able to bridge - pub(crate) fn ensure_remote_destination( + pub(crate) fn ensure_reachable_remote_destination( remote_destination: VersionedMultiLocation, - ) -> Result<(NetworkId, BridgeConfig, MultiLocation), Error> { - match remote_destination { - VersionedMultiLocation::V3(remote_location) => { - ensure!( - remote_location.parent_count() == 2, - Error::::UnsupportedDestination - ); - let local_network = T::UniversalLocation::get() - .global_consensus() - .map_err(|_| Error::::InvalidConfiguration)?; - let remote_network = remote_location - .interior() - .global_consensus() - .map_err(|_| Error::::UnsupportedDestination)?; - ensure!(local_network != remote_network, Error::::UnsupportedDestination); - match AllowedExporters::::get(remote_network) { - Some(bridge_config) => { - ensure!( - // TODO:check-parameter - verify and prepare test for ETH scenario - https://github.com/paritytech/cumulus/pull/2013#discussion_r1094909290 - remote_location.starts_with(&bridge_config.allowed_target_location), - Error::::UnsupportedDestination - ); - Ok((remote_network, bridge_config, remote_location)) - }, - None => return Err(Error::::UnsupportedDestination), + ) -> Result>, Error> { + let remote_destination: MultiLocation = remote_destination + .to_versioned() + .map_err(|_| Error::::UnsupportedXcmVersion)?; + + let devolved = ensure_is_remote(T::UniversalLocation::get(), remote_destination) + .map_err(|_| Error::::UnsupportedDestination)?; + let (remote_network, _) = devolved; + + match AllowedExporters::::get(remote_network) { + Some(bridge_config) => { + match bridge_config.allowed_target_location_for(&remote_destination) { + Ok(Some((target_location, target_location_asset_filter))) => + Ok(ReachableDestination { + bridge: bridge_config.to_bridge_location()?, + target: target_location, + target_asset_filter: target_location_asset_filter, + target_destination: remote_destination, + }), + Ok(None) => Err(Error::::UnsupportedDestination), + Err(_) => Err(Error::::UnsupportedXcmVersion), } }, - _ => Err(Error::::UnsupportedXcmVersion), + None => Err(Error::::UnsupportedDestination), } } #[transactional] - fn do_reserve_and_send_in_transaction( + fn do_transfer_asset_via_bridge_in_transaction( origin_location: MultiLocation, - remote_destination: MultiLocation, + destination: ReachableDestination>, assets: MultiAssets, - bridge_config: BridgeConfig, ) -> Result<(), DispatchError> { // Resolve reserve account - let reserve_account = - Self::resolve_reserve_account(&bridge_config, &remote_destination); + let reserve_account = Self::resolve_reserve_account(&destination); - // Resolve target destination - let target_destination = bridge_config.allowed_target_location; + // Target destination + let target_location = destination.target.location; // UniversalLocation as sovereign account location on target_location (as target_location sees UniversalLocation) let universal_location_as_sovereign_account_on_target_location = T::UniversalLocation::get() - .invert_target(&target_destination) + .invert_target(&target_location) .map_err(|_| Error::::InvalidConfiguration)?; // Prepare some XcmContext let xcm_context = XcmContext::with_message_id(unique(reserve_account)); - // lets try to do a reserve for all assets - let mut reserved_assets = xcm_executor::Assets::new(); + // Resolve/iterate all assets and how to transfer them + let mut reserve_assets_deposited = xcm_executor::Assets::new(); + let mut reserved_assets_for_withdrawal = xcm_executor::Assets::new(); for asset in assets.into_inner() { - // TODO:check-parameter - verify this Joe's text - // Deposit assets into `AccountId` that corresponds to the bridge - // hub. In this way, Statemine acts as a reserve location to the - // bridge, such that it need not trust any consensus system from - // `./Parent/Parent/...`. (It may trust Polkadot, but would - // Polkadot trust Kusama with its DOT?) - - // Move asset to reserve account - T::AssetTransactor::transfer_asset( - &asset, - &origin_location, - &reserve_account, - &xcm_context, - ) - .and_then(|reserved_asset| { - Self::deposit_event(Event::ReserveAssetsDeposited { - from: origin_location, - to: reserve_account, - assets: reserved_asset.clone().into(), - }); - reserved_assets.subsume_assets(reserved_asset); - Ok(()) - }) - .map_err(|e| { - log::error!( - target: LOG_TARGET, - "AssetTransactor failed to reserve assets from origin_location: {:?} to reserve_account: {:?} for assets: {:?}, error: {:?}", - origin_location, - reserve_account, - asset, - e - ); - Error::::FailedToReserve - })?; + // first we need to know what kind of transfer it is + match T::AssetTransferKindResolver::resolve(&asset, &target_location) { + AssetTransferKind::ReserveBased => + // Move asset to reserve account + T::AssetTransactor::transfer_asset( + &asset, + &origin_location, + &reserve_account, + &xcm_context, + ) + .and_then(|reserved_asset| { + Self::deposit_event(Event::ReserveAssetsDeposited { + from: origin_location, + to: reserve_account, + assets: reserved_asset.clone().into(), + }); + reserve_assets_deposited.subsume_assets(reserved_asset); + Ok(()) + }) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "AssetTransactor failed to reserve assets from origin_location: {:?} to reserve_account: {:?} for assets: {:?}, error: {:?}", + origin_location, + reserve_account, + asset, + e + ); + Error::::FailedToReserve + })?, + AssetTransferKind::WithdrawReserve => { + // Just withdraw/burn asset here + T::AssetTransactor::withdraw_asset( + &asset, + &origin_location, + Some(&xcm_context), + ) + .and_then(|withdrawn_asset| { + Self::deposit_event(Event::AssetsWithdrawn { + from: origin_location, + assets: withdrawn_asset.clone().into(), + }); + reserved_assets_for_withdrawal.subsume_assets(withdrawn_asset); + Ok(()) + }) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "AssetTransactor failed to withdraw assets from origin_location: {:?} for assets: {:?}, error: {:?}", + origin_location, + asset, + e + ); + Error::::FailedToWithdraw + })? + } + AssetTransferKind::Unsupported => return Err(Error::::UnsupportedAssetTransferKind.into()), + } } - // Prepare `ReserveAssetDeposited` msg to bridge to the other side. + // Prepare xcm msg for the other side. // Reanchor stuff - we need to convert local asset id/MultiLocation to format that could be understood by different consensus and from their point-of-view - reserved_assets.reanchor(&target_destination, T::UniversalLocation::get(), None); - let remote_destination = remote_destination - .reanchored(&target_destination, T::UniversalLocation::get()) + reserve_assets_deposited.reanchor(&target_location, T::UniversalLocation::get(), None); + reserved_assets_for_withdrawal.reanchor( + &target_location, + T::UniversalLocation::get(), + None, + ); + let remote_destination_reanchored = destination.target_destination + .reanchored(&target_location, T::UniversalLocation::get()) .map_err(|errored_dest| { log::error!( target: LOG_TARGET, "Failed to reanchor remote_destination: {:?} for target_destination: {:?} and universal_location: {:?}", errored_dest, - target_destination, + target_location, T::UniversalLocation::get() ); Error::::InvalidRemoteDestination @@ -694,9 +755,7 @@ pub mod pallet { // prepare xcm message // 1. buy execution (if needed) -> (we expect UniversalLocation's sovereign account should pay) - let (mut xcm_instructions, maybe_buy_execution) = match bridge_config - .max_target_location_fee - { + let (mut xcm_instructions, maybe_buy_execution) = match destination.target.maybe_fee { Some(target_location_fee) => ( sp_std::vec![ WithdrawAsset(target_location_fee.clone().into()), @@ -709,15 +768,33 @@ pub mod pallet { None, ), }; - // 2. add deposit reserved asset to destination account - xcm_instructions.extend(sp_std::vec![ - ReserveAssetDeposited(reserved_assets.clone().into()), - DepositAsset { - assets: MultiAssetFilter::from(MultiAssets::from(reserved_assets)), - beneficiary: remote_destination - }, - ]); - // 3. add return unspent weight/asset back to the UniversalLocation's sovereign account on target + + // 2. add deposit reserved asset to destination account (if any) + if !reserve_assets_deposited.is_empty() { + xcm_instructions.extend(sp_std::vec![ + ReserveAssetDeposited(reserve_assets_deposited.clone().into()), + DepositAsset { + assets: MultiAssetFilter::from(MultiAssets::from(reserve_assets_deposited)), + beneficiary: remote_destination_reanchored + }, + ]); + } + + // 3. add withdraw/move reserve from sovereign account to destination (if any) + if !reserved_assets_for_withdrawal.is_empty() { + xcm_instructions.extend(sp_std::vec![ + // we expect here, that origin is a sovereign account which was used as **reserve account** + WithdrawAsset(reserved_assets_for_withdrawal.clone().into()), + DepositAsset { + assets: MultiAssetFilter::from(MultiAssets::from( + reserved_assets_for_withdrawal + )), + beneficiary: remote_destination_reanchored + }, + ]); + } + + // 4. add return unspent weight/asset back to the UniversalLocation's sovereign account on target if let Some(target_location_fee) = maybe_buy_execution { xcm_instructions.extend(sp_std::vec![ RefundSurplus, @@ -729,7 +806,7 @@ pub mod pallet { } Self::initiate_bridge_transfer( - target_destination, + target_location, xcm_context.message_id, xcm_instructions.into(), ) @@ -742,7 +819,7 @@ pub mod pallet { mut xcm: Xcm<()>, ) -> Result<(), Error> { // append message_id - xcm.0.extend(sp_std::vec![SetTopic(message_id.clone())]); + xcm.0.extend(sp_std::vec![SetTopic(message_id)]); log::info!( target: LOG_TARGET, @@ -775,11 +852,9 @@ pub mod pallet { /// Resolve (sovereign) account which will be used as reserve account fn resolve_reserve_account( - bridge_conig: &BridgeConfig, - _remote_destination: &MultiLocation, + destination: &ReachableDestination>, ) -> MultiLocation { - // lets start with target_location - bridge_conig.allowed_target_location.clone() + destination.target.location } } } @@ -788,11 +863,20 @@ pub mod pallet { pub(crate) mod tests { use super::*; use crate as bridge_transfer; - use frame_support::traits::{ConstU32, Contains, ContainsPair, Currency, Everything}; + use frame_support::traits::{ + AsEnsureOriginWithArg, ConstU32, Contains, ContainsPair, Currency, + }; - use crate::impls::{AllowedUniversalAliasesOf, IsAllowedReserveOf}; + use crate::{ + filter::{AssetFilter, MultiLocationFilter}, + impls::{ + AllowedUniversalAliasesOf, ConfiguredConcreteAssetTransferKindResolver, + IsTrustedBridgedReserveForConcreteAsset, + }, + }; use frame_support::{ assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, + BoundedVec, }; use frame_system::EnsureRoot; use polkadot_parachain::primitives::Sibling; @@ -889,14 +973,9 @@ pub(crate) mod tests { } parameter_types! { - // UniversalLocation as statemine + pub const BridgedNetwork: NetworkId = NetworkId::ByGenesis([4; 32]); pub const RelayNetwork: NetworkId = NetworkId::ByGenesis([9; 32]); pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(1000)); - // Test bridge cfg - pub TestBridgeTable: sp_std::prelude::Vec<(NetworkId, MultiLocation, Option)> = sp_std::vec![ - (NetworkId::Wococo, (Parent, Parachain(1013)).into(), None), - (NetworkId::Polkadot, (Parent, Parachain(1002)).into(), None), - ]; // Relay chain currency/balance location (e.g. KsmLocation, DotLocation, ..) pub const RelayLocation: MultiLocation = MultiLocation::parent(); } @@ -949,7 +1028,10 @@ pub(crate) mod tests { ); if matches!( destination, - Some(MultiLocation { interior: X1(Parachain(2222)), parents: 1 }) + Some(MultiLocation { + interior: X1(Parachain(Self::UNROUTABLE_PARA_ID)), + parents: 1 + }) ) { Err(SendError::Transport("Simulate what ever error")) } else { @@ -962,6 +1044,10 @@ pub(crate) mod tests { } } + impl NotApplicableOrFailOnParachain2222XcmRouter { + const UNROUTABLE_PARA_ID: u32 = 2222; + } + pub type XcmRouter = (NotApplicableOrFailOnParachain2222XcmRouter, ThreadLocalXcmRouter); /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus @@ -995,22 +1081,6 @@ pub(crate) mod tests { (), >; - /// Bridge configuration we use in our tests. - fn test_bridge_config() -> (NetworkId, BridgeConfig) { - ( - Wococo, - BridgeConfig { - bridge_location: (Parent, Parachain(1013)).into(), - bridge_location_fee: None, - allowed_target_location: MultiLocation::new( - 2, - X2(GlobalConsensus(Wococo), Parachain(1000)), - ), - max_target_location_fee: None, - }, - ) - } - /// Benchmarks helper. #[cfg(feature = "runtime-benchmarks")] pub struct TestBenchmarkHelper; @@ -1047,10 +1117,6 @@ pub(crate) mod tests { (RuntimeOrigin::signed(sender_account), assets, destination) } - - fn prepare_ping_transfer() { - unimplemented!("Not implemented here - not needed"); - } } parameter_types! { @@ -1063,14 +1129,15 @@ pub(crate) mod tests { type UniversalLocation = UniversalLocation; type WeightInfo = (); type AdminOrigin = EnsureRoot; + type AllowReserveAssetTransferOrigin = AsEnsureOriginWithArg>; type UniversalAliasesLimit = ConstU32<2>; type ReserveLocationsLimit = ConstU32<2>; + type AssetsPerReserveLocationLimit = ConstU32<2>; type AssetTransactor = CurrencyTransactor; + type AssetTransferKindResolver = ConfiguredConcreteAssetTransferKindResolver; type BridgeXcmSender = TestBridgeXcmSender; - type TransferAssetOrigin = EnsureXcmOrigin; + type AssetTransferOrigin = EnsureXcmOrigin; type MaxAssetsLimit = MaxAssetsLimit; - type TransferPingOrigin = EnsureXcmOrigin; - type PingMessageBuilder = UnpaidTrapMessageBuilder; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = TestBenchmarkHelper; } @@ -1100,43 +1167,53 @@ pub(crate) mod tests { } #[test] - fn test_ensure_remote_destination() { + fn test_ensure_reachable_remote_destination() { new_test_ext().execute_with(|| { - // insert bridge config - let bridge_network = Wococo; - let bridge_config = test_bridge_config().1; + // insert exporter config + allowed target location + let bridged_network = BridgedNetwork::get(); + let bridge_location = MultiLocation::new(1, X1(Parachain(1013))); assert_ok!(BridgeTransfer::add_exporter_config( RuntimeOrigin::root(), - bridge_network, - Box::new(bridge_config.clone()), + bridged_network, + Box::new(bridge_location.clone().into_versioned()), + None, + )); + let target_location: MultiLocation = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); + assert_ok!(BridgeTransfer::update_bridged_target_location( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + Some(Box::new(target_location_fee.clone().into())), )); // v2 not supported assert_eq!( - BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V2( + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V2( xcm::v2::MultiLocation::default() )), - Err(Error::::UnsupportedXcmVersion) + Err(Error::::UnsupportedDestination) ); // v3 - "parent: 0" wrong assert_eq!( - BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(0, X2(GlobalConsensus(Wococo), Parachain(1000))) + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(0, X2(GlobalConsensus(bridged_network), Parachain(1000))) )), Err(Error::::UnsupportedDestination) ); // v3 - "parent: 1" wrong assert_eq!( - BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(1, X2(GlobalConsensus(Wococo), Parachain(1000))) + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(1, X2(GlobalConsensus(bridged_network), Parachain(1000))) )), Err(Error::::UnsupportedDestination) ); // v3 - Rococo is not supported assert_eq!( - BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V3( + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))) )), Err(Error::::UnsupportedDestination) @@ -1144,22 +1221,43 @@ pub(crate) mod tests { // v3 - remote_destination is not allowed assert_eq!( - BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1234))) + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1234))) )), Err(Error::::UnsupportedDestination) ); // v3 - ok (allowed) - assert_eq!( - BridgeTransfer::ensure_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1000))) + assert_ok!( + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new( + 2, + X3( + GlobalConsensus(bridged_network), + Parachain(1000), + consensus_account(bridged_network, 35) + ) + ), )), - Ok(( - bridge_network, - bridge_config, - MultiLocation::new(2, X2(GlobalConsensus(Wococo), Parachain(1000))) - )) + ReachableDestination { + bridge: MaybePaidLocation { location: bridge_location, maybe_fee: None }, + target: MaybePaidLocation { + location: MultiLocation::new( + 2, + X2(GlobalConsensus(bridged_network), Parachain(1000)) + ), + maybe_fee: Some(target_location_fee), + }, + target_asset_filter: None, + target_destination: MultiLocation::new( + 2, + X3( + GlobalConsensus(bridged_network), + Parachain(1000), + consensus_account(bridged_network, 35) + ) + ), + } ); }) } @@ -1178,15 +1276,29 @@ pub(crate) mod tests { assert!(balance_to_transfer >= ExistentialDeposit::get()); // insert bridge config - let bridged_network = Wococo; + let bridged_network = BridgedNetwork::get(); + let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); assert_ok!(BridgeTransfer::add_exporter_config( RuntimeOrigin::root(), bridged_network, - Box::new(test_bridge_config().1), + Box::new(bridge_location.into_versioned()), + None, + )); + // insert allowed reserve asset and allow all + let target_location: MultiLocation = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + assert_ok!(BridgeTransfer::update_bridged_target_location( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + None, + )); + assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::All, )); - let target_location = AllowedExporters::::get(bridged_network) - .expect("stored BridgeConfig for bridged_network") - .allowed_target_location; // checks before assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); @@ -1205,7 +1317,11 @@ pub(crate) mod tests { // destination is account from different consensus let destination = Box::new(VersionedMultiLocation::from(MultiLocation::new( 2, - X3(GlobalConsensus(Wococo), Parachain(1000), consensus_account(Wococo, 2)), + X3( + GlobalConsensus(bridged_network), + Parachain(1000), + consensus_account(bridged_network, 2), + ), ))); // trigger asset transfer @@ -1244,7 +1360,11 @@ pub(crate) mod tests { if let Some(ExportMessage { xcm, .. }) = fired_xcm.0.iter().find(|instr| { matches!( instr, - ExportMessage { network: Wococo, destination: X1(Parachain(1000)), .. } + ExportMessage { + network, + destination: X1(Parachain(1000)), + .. + } if network == &bridged_network ) }) { assert!(xcm.0.iter().any(|instr| matches!(instr, UnpaidExecution { .. }))); @@ -1271,24 +1391,33 @@ pub(crate) mod tests { assert!(balance_to_transfer >= ExistentialDeposit::get()); // insert bridge config (with unroutable bridge_location - 2222) - let bridged_network = Wococo; + let bridged_network = BridgedNetwork::get(); assert_ok!(BridgeTransfer::add_exporter_config( RuntimeOrigin::root(), bridged_network, - Box::new(BridgeConfig { - bridge_location: MultiLocation::new(1, Parachain(2222)).into(), - bridge_location_fee: None, - allowed_target_location: MultiLocation::new( - 2, - X2(GlobalConsensus(Wococo), Parachain(1000)), - ), - max_target_location_fee: None, - }), + Box::new( + MultiLocation::new( + 1, + Parachain(NotApplicableOrFailOnParachain2222XcmRouter::UNROUTABLE_PARA_ID) + ) + .into_versioned() + ), + None, + )); + let target_location = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + assert_ok!(BridgeTransfer::update_bridged_target_location( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + None, + )); + assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.into_versioned()), + AssetFilter::All, )); - - let target_location = AllowedExporters::::get(bridged_network) - .expect("stored BridgeConfig for bridged_network") - .allowed_target_location; // checks before assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); @@ -1309,7 +1438,11 @@ pub(crate) mod tests { // destination is account from different consensus let destination = Box::new(VersionedMultiLocation::from(MultiLocation::new( 2, - X3(GlobalConsensus(Wococo), Parachain(1000), consensus_account(Wococo, 2)), + X3( + GlobalConsensus(bridged_network), + Parachain(1000), + consensus_account(bridged_network, 2), + ), ))); // reset events @@ -1324,7 +1457,7 @@ pub(crate) mod tests { ), DispatchError::Module(ModuleError { index: 52, - error: [8, 0, 0, 0], + error: [9, 0, 0, 0], message: Some("BridgeCallError") }) ); @@ -1340,94 +1473,13 @@ pub(crate) mod tests { }); } - #[test] - fn test_ping_via_bridge_works() { - new_test_ext().execute_with(|| { - // insert bridge config - let bridged_network = Wococo; - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(test_bridge_config().1), - )); - - // checks before - assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); - - // trigger ping_via_bridge - should trigger new ROUTED_MESSAGE - // destination is account from different consensus - let destination = Box::new(VersionedMultiLocation::V3(MultiLocation::new( - 2, - X3(GlobalConsensus(Wococo), Parachain(1000), consensus_account(Wococo, 2)), - ))); - - // trigger asset transfer - assert_ok!(BridgeTransfer::ping_via_bridge( - RuntimeOrigin::signed(account(1)), - destination, - )); - - // check events - let events = System::events(); - assert!(!events.is_empty()); - - // check TransferInitiated - assert!(System::events().iter().any(|r| matches!( - r.event, - RuntimeEvent::BridgeTransfer(Event::TransferInitiated { .. }) - ))); - - // check fired XCM ExportMessage to bridge-hub - let fired_xcm = - ROUTED_MESSAGE.with(|r| r.take().expect("xcm::ExportMessage should be here")); - - if let Some(ExportMessage { xcm, .. }) = fired_xcm.0.iter().find(|instr| { - matches!( - instr, - ExportMessage { network: Wococo, destination: X1(Parachain(1000)), .. } - ) - }) { - assert!(xcm.0.iter().any(|instr| instr.eq(&Trap(TrapCode::get())))); - } else { - assert!(false, "Does not contains [`ExportMessage`], fired_xcm: {:?}", fired_xcm); - } - }); - } - #[test] fn allowed_exporters_management_works() { - let bridged_network = Rococo; - let bridged_config = Box::new(BridgeConfig { - bridge_location: (Parent, Parachain(1013)).into(), - bridge_location_fee: None, - allowed_target_location: MultiLocation::new( - 2, - X2(GlobalConsensus(bridged_network), Parachain(1000)), - ), - max_target_location_fee: None, - }); + let bridged_network = BridgedNetwork::get(); + let bridge_location = MultiLocation::new(1, X1(Parachain(1013))); let dummy_xcm = Xcm(vec![]); let dummy_remote_interior_multilocation = X1(Parachain(1234)); - { - let mut asset = xcm_executor::Assets::from(MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(1_000), - }); - println!("before: {:?}", asset); - asset.reanchor(&bridged_config.allowed_target_location, UniversalLocation::get(), None); - println!("after: {:?}", asset); - } - { - let mut asset = xcm_executor::Assets::from(MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: X1(Parachain(3000)) }), - fun: Fungible(1_000), - }); - println!("before: {:?}", asset); - asset.reanchor(&bridged_config.allowed_target_location, UniversalLocation::get(), None); - println!("after: {:?}", asset); - } - new_test_ext().execute_with(|| { assert_eq!(AllowedExporters::::iter().count(), 0); @@ -1436,30 +1488,19 @@ pub(crate) mod tests { BridgeTransfer::add_exporter_config( RuntimeOrigin::signed(account(1)), bridged_network, - bridged_config.clone(), + Box::new(bridge_location.clone().into_versioned()), + None ), DispatchError::BadOrigin ); - // should fail - bridged_network should match allowed_target_location - assert_noop!( - BridgeTransfer::add_exporter_config(RuntimeOrigin::root(), bridged_network, { - let remote_network = Westend; - assert_ne!(bridged_network, remote_network); - Box::new(test_bridge_config().1) - }), - DispatchError::Module(ModuleError { - index: 52, - error: [0, 0, 0, 0], - message: Some("InvalidConfiguration") - }) - ); - // should fail - bridged_network must be different global consensus than our `UniversalLocation` + // should fail - we expect local bridge assert_noop!( BridgeTransfer::add_exporter_config( RuntimeOrigin::root(), - UniversalLocation::get().global_consensus().expect("any `NetworkId`"), - bridged_config.clone() + bridged_network, + Box::new(MultiLocation::new(2, X1(Parachain(1234))).into_versioned()), + None ), DispatchError::Module(ModuleError { index: 52, @@ -1481,25 +1522,30 @@ pub(crate) mod tests { assert_ok!(BridgeTransfer::add_exporter_config( RuntimeOrigin::root(), bridged_network, - bridged_config.clone(), + Box::new(bridge_location.clone().into_versioned()), + None )); assert_eq!(AllowedExporters::::iter().count(), 1); assert_eq!( AllowedExporters::::get(bridged_network), - Some(*bridged_config.clone()) + Some(BridgeConfig { + bridge_location: VersionedMultiLocation::from(bridge_location), + bridge_location_fee: None, + allowed_target_locations: Default::default(), + }) ); - assert_eq!(AllowedExporters::::get(Wococo), None); + assert_eq!(AllowedExporters::::get(&RelayNetwork::get()), None); assert_eq!( BridgeTransfer::exporter_for( &bridged_network, &dummy_remote_interior_multilocation, &dummy_xcm ), - Some((bridged_config.bridge_location, bridged_config.bridge_location_fee)) + Some((bridge_location.clone(), None)) ); assert_eq!( BridgeTransfer::exporter_for( - &Wococo, + &RelayNetwork::get(), &dummy_remote_interior_multilocation, &dummy_xcm ), @@ -1512,16 +1558,14 @@ pub(crate) mod tests { RuntimeOrigin::root(), bridged_network, Some(VersionedMultiAsset::V3((Parent, 200u128).into()).into()), - Some(VersionedMultiAsset::V3((Parent, 300u128).into()).into()), )); assert_eq!(AllowedExporters::::iter().count(), 1); assert_eq!( AllowedExporters::::get(bridged_network), Some(BridgeConfig { - bridge_location: bridged_config.bridge_location.clone(), + bridge_location: VersionedMultiLocation::from(bridge_location), bridge_location_fee: Some((Parent, 200u128).into()), - allowed_target_location: bridged_config.allowed_target_location.clone(), - max_target_location_fee: Some((Parent, 300u128).into()), + allowed_target_locations: Default::default(), }) ); assert_eq!( @@ -1530,7 +1574,7 @@ pub(crate) mod tests { &dummy_remote_interior_multilocation, &dummy_xcm ), - Some((bridged_config.bridge_location, Some((Parent, 200u128).into()))) + Some((bridge_location, Some((Parent, 200u128).into()))) ); // remove @@ -1578,6 +1622,7 @@ pub(crate) mod tests { )); assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction1))); assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + assert_eq!(AllowedUniversalAliases::::iter().count(), 1); // remove ok assert_ok!(BridgeTransfer::remove_universal_alias( @@ -1587,6 +1632,7 @@ pub(crate) mod tests { )); assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + assert_eq!(AllowedUniversalAliases::::iter().count(), 1); assert_ok!(BridgeTransfer::remove_universal_alias( RuntimeOrigin::root(), @@ -1595,60 +1641,323 @@ pub(crate) mod tests { )); assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + assert_eq!(AllowedUniversalAliases::::iter().count(), 0); }) } #[test] fn allowed_reserve_locations_management_works() { new_test_ext().execute_with(|| { - assert!(AllowedReserveLocations::::get().is_empty()); + assert_eq!(0, AllowedReserveLocations::::iter_values().count()); let location1 = MultiLocation::new(1, X1(Parachain(1014))); + let location1_as_latest = VersionedMultiLocation::from(location1.clone()); + let location1_as_latest_as_key = + LatestVersionedMultiLocation::try_from(&location1_as_latest).expect("ok"); let location2 = MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([1; 32])), Parachain(1014))); - let asset: MultiAsset = (Parent, 200u128).into(); + let location2_as_latest = VersionedMultiLocation::from(location2.clone()); + let location2_as_key = + LatestVersionedMultiLocation::try_from(&location2_as_latest).expect("ok"); + + let asset_location = MultiLocation::parent(); + let asset: MultiAsset = (asset_location, 200u128).into(); + + let asset_filter_for_asset_by_multilocation = MultiLocationFilter { + equals_any: BoundedVec::truncate_from(vec![asset_location.into_versioned()]), + starts_with_any: Default::default(), + }; + let asset_filter_for_asset = + AssetFilter::ByMultiLocation(asset_filter_for_asset_by_multilocation.clone()); + let asset_filter_for_other_by_multilocation = MultiLocationFilter { + equals_any: BoundedVec::truncate_from(vec![ + MultiLocation::new(3, Here).into_versioned() + ]), + starts_with_any: Default::default(), + }; + let asset_filter_for_other = + AssetFilter::ByMultiLocation(asset_filter_for_other_by_multilocation.clone()); // should fail - just root is allowed assert_noop!( BridgeTransfer::add_reserve_location( RuntimeOrigin::signed(account(1)), - Box::new(VersionedMultiLocation::V3(location1.clone())) + Box::new(location1_as_latest.clone()), + asset_filter_for_asset.clone(), ), DispatchError::BadOrigin ); - assert_eq!(AllowedReserveLocations::::get().len(), 0); - assert!(!IsAllowedReserveOf::::contains(&asset, &location1)); - assert!(!IsAllowedReserveOf::::contains(&asset, &location2)); + assert!( + AllowedReserveLocations::::get(&location1_as_latest_as_key).is_none() + ); + assert!(AllowedReserveLocations::::get(&location2_as_key).is_none()); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset, &location1 + ), + AssetTransferKind::Unsupported + ); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset, &location2 + ), + AssetTransferKind::Unsupported + ); // add ok assert_ok!(BridgeTransfer::add_reserve_location( RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())) + Box::new(VersionedMultiLocation::V3(location1.clone())), + asset_filter_for_asset.clone() )); assert_ok!(BridgeTransfer::add_reserve_location( RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location2.clone())) + Box::new(VersionedMultiLocation::V3(location2.clone())), + asset_filter_for_other.clone() )); - assert_eq!(AllowedReserveLocations::::get().len(), 2); - assert!(IsAllowedReserveOf::::contains(&asset, &location1)); - assert!(IsAllowedReserveOf::::contains(&asset, &location2)); + assert_eq!(2, AllowedReserveLocations::::iter_values().count()); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset, &location1 + ), + AssetTransferKind::WithdrawReserve + ); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset, &location2 + ), + AssetTransferKind::Unsupported + ); + + assert_ok!(BridgeTransfer::add_reserve_location( + RuntimeOrigin::root(), + Box::new(location2_as_latest.clone()), + asset_filter_for_asset.clone() + )); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset, &location2 + ), + AssetTransferKind::WithdrawReserve + ); + + // test remove + assert_noop!( + BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + Box::new(location1_as_latest.clone()), + Some(asset_filter_for_other_by_multilocation.clone()) + ), + DispatchError::Module(ModuleError { + index: 52, + error: [0, 0, 0, 0], + message: Some("UnavailableConfiguration") + }) + ); - // remove ok assert_ok!(BridgeTransfer::remove_reserve_location( RuntimeOrigin::root(), - vec![VersionedMultiLocation::V3(location1.clone())], + Box::new(location1_as_latest.clone()), + Some(asset_filter_for_asset_by_multilocation.clone()) )); - assert_eq!(AllowedReserveLocations::::get().len(), 1); - assert!(!IsAllowedReserveOf::::contains(&asset, &location1)); - assert!(IsAllowedReserveOf::::contains(&asset, &location2)); + assert_eq!(1, AllowedReserveLocations::::iter_values().count()); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset, &location1 + ), + AssetTransferKind::Unsupported + ); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset, &location2 + ), + AssetTransferKind::WithdrawReserve + ); assert_ok!(BridgeTransfer::remove_reserve_location( RuntimeOrigin::root(), - vec![VersionedMultiLocation::V3(location2.clone())], + Box::new(location2_as_latest.clone()), + Some(asset_filter_for_other_by_multilocation.clone()) + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset, &location1 + ), + AssetTransferKind::Unsupported + ); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset, &location2 + ), + AssetTransferKind::WithdrawReserve + ); + + assert_ok!(BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + Box::new(location2_as_latest), + Some(asset_filter_for_asset_by_multilocation) + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset, &location1 + ), + AssetTransferKind::Unsupported + ); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset, &location2 + ), + AssetTransferKind::Unsupported + ); + }) + } + + #[test] + fn allowed_bridged_target_location_management_works() { + new_test_ext().execute_with(|| { + assert_eq!(0, AllowedExporters::::iter_values().count()); + + let bridged_network = BridgedNetwork::get(); + let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); + let target_location: MultiLocation = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + + // should fail - we need BridgeConfig first + assert_noop!( + BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::All, + ), + DispatchError::Module(ModuleError { + index: 52, + error: [2, 0, 0, 0], + message: Some("UnavailableConfiguration") + }) + ); + + // add bridge config + assert_ok!(BridgeTransfer::add_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Box::new(bridge_location.into_versioned()), + None, + )); + + // should fail - we need also target_location first + assert_noop!( + BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::All, + ), + DispatchError::Module(ModuleError { + index: 52, + error: [1, 0, 0, 0], + message: Some("InvalidBridgeConfiguration") + }) + ); + + // insert allowed target location + assert_ok!(BridgeTransfer::update_bridged_target_location( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + None, )); - assert!(AllowedReserveLocations::::get().is_empty()); - assert!(!IsAllowedReserveOf::::contains(&asset, &location1)); - assert!(!IsAllowedReserveOf::::contains(&asset, &location2)); + + let asset1_location = MultiLocation::new(2, X2(Parachain(1235), Parachain(5678))); + let asset1 = MultiAsset::from((asset1_location, 1000)); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset1, + &target_location + ), + AssetTransferKind::Unsupported + ); + + // now should pass - add one start_with pattern + assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::ByMultiLocation(MultiLocationFilter { + equals_any: Default::default(), + starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( + 2, + X1(Parachain(2223)) + ) + .into_versioned()]), + }), + )); + + // not allowed yet + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset1, + &target_location + ), + AssetTransferKind::Unsupported + ); + + // now should pass - add another start_with pattern + assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::ByMultiLocation(MultiLocationFilter { + equals_any: Default::default(), + starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( + 2, + X1(Parachain(1235)) + ) + .into_versioned()]), + }), + )); + + // ok + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset1, + &target_location + ), + AssetTransferKind::ReserveBased + ); }) } } diff --git a/parachains/pallets/bridge-transfer/src/types.rs b/parachains/pallets/bridge-transfer/src/types.rs new file mode 100644 index 00000000000..634c3789b58 --- /dev/null +++ b/parachains/pallets/bridge-transfer/src/types.rs @@ -0,0 +1,472 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::Config; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::pallet_prelude::{CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound}; +use scale_info::TypeInfo; +use xcm::prelude::*; + +pub use crate::{ + config::BridgeConfig, + filter::{AssetFilterOf, AssetFilterT, MultiLocationFilterOf}, + xcm_version::{LatestVersionedMultiLocation, UnsupportedXcmVersionError, UsingVersioned}, +}; + +/// Pallet support two kinds of transfer. +#[cfg_attr(feature = "std", derive(Debug, PartialEq))] +pub enum AssetTransferKind { + /// When we need to do a **reserve** on source chain to **reserve account** and then send it as `ReserveAssetDeposited` + ReserveBased, + /// When we need to do a opposite direction, withdraw/burn asset on source chain and send it as `Withdraw/Burn` on target chain from **reserve account**. + WithdrawReserve, + /// If not supported/permitted (e.g. missing configuration of trusted reserve location, ...). + Unsupported, +} + +/// Trait for resolving a transfer type for `asset` to `target_location` +pub trait ResolveAssetTransferKind { + fn resolve(asset: &MultiAsset, target_location: &MultiLocation) -> AssetTransferKind; +} + +impl ResolveAssetTransferKind for () { + fn resolve(_asset: &MultiAsset, _target_location: &MultiLocation) -> AssetTransferKind { + AssetTransferKind::Unsupported + } +} + +#[cfg_attr(feature = "std", derive(Debug, PartialEq))] +pub struct MaybePaidLocation { + pub location: MultiLocation, + pub maybe_fee: Option, +} + +#[cfg_attr(feature = "std", derive(Debug, PartialEq))] +pub struct ReachableDestination { + /// Bridge location + pub bridge: MaybePaidLocation, + /// Target location (e.g. remote parachain in different consensus) + pub target: MaybePaidLocation, + /// Optional asset filter, which we can send to target location + pub target_asset_filter: Option, + /// Destination on target location (e.g. account on remote parachain in different consensus) + pub target_destination: MultiLocation, +} + +pub mod config { + use super::*; + use crate::{ + filter::{AssetFilterError, AssetFilterOf}, + UnsupportedXcmVersionError, + }; + use frame_support::BoundedBTreeMap; + + #[derive( + Encode, Decode, MaxEncodedLen, TypeInfo, RuntimeDebugNoBound, CloneNoBound, PartialEqNoBound, + )] + #[scale_info(skip_type_params(T))] + pub struct BridgeConfig { + /// Contains location, which is able to bridge XCM messages to bridged network + pub bridge_location: VersionedMultiLocation, + /// Fee which could be needed to pay in `bridge_location` + /// `MultiAsset` is here from the point of view of `bridge_location`, e.g.: `MultiLocation::parent()` means relay chain token of `bridge_location` + pub bridge_location_fee: Option, + + /// Contains target destination on bridged network. E.g.: MultiLocation of Statemine/t on different consensus + its configuration + pub(crate) allowed_target_locations: BoundedBTreeMap< + VersionedMultiLocation, + TargetLocationConfig, + T::ReserveLocationsLimit, + >, + } + + impl BridgeConfig { + /// Tries to find target destination configuration for destination. + pub fn allowed_target_location_for( + &self, + destination: &MultiLocation, + ) -> Result>)>, UnsupportedXcmVersionError> + { + for (target_location, cfg) in &self.allowed_target_locations { + let target_location = target_location.as_versioned_ref()?; + // if destination matches target_location, we found our configuration + if destination.starts_with(target_location) || destination.eq(target_location) { + let maybe_fee = match &cfg.max_target_location_fee { + Some(fee) => Some(fee.as_versioned_ref()?.clone()), + None => None, + }; + return Ok(Some(( + MaybePaidLocation { location: target_location.clone(), maybe_fee }, + cfg.allowed_reserve_assets.clone(), + ))) + } + } + Ok(None) + } + + pub fn update_allowed_target_location( + &mut self, + target_location: VersionedMultiLocation, + max_target_location_fee: Option, + ) -> Result<(), BridgeConfigError> { + // lets try update existing + for (stored_target, cfg) in self.allowed_target_locations.iter_mut() { + let stored_target = stored_target.as_versioned_ref()?; + let target_location = target_location.as_versioned_ref()?; + // if stored_target matches target_location, we found our configuration + if stored_target.eq(target_location) { + cfg.max_target_location_fee = max_target_location_fee; + return Ok(()) + } + } + + // if not found, just insert + self.allowed_target_locations + .try_insert( + target_location, + TargetLocationConfig { max_target_location_fee, allowed_reserve_assets: None }, + ) + .map(|_| ()) + .map_err(|_| BridgeConfigError::LimitReached) + } + + pub fn add_allowed_target_location_filter_for( + &mut self, + target_location: VersionedMultiLocation, + new_asset_filter: AssetFilterOf, + ) -> Result { + for (stored_target, cfg) in self.allowed_target_locations.iter_mut() { + let stored_target = stored_target.as_versioned_ref()?; + let target_location = target_location.as_versioned_ref()?; + // if stored_target matches target_location, we found our configuration + if stored_target.eq(target_location) { + let was_added = match &mut cfg.allowed_reserve_assets { + Some(old_asset_filter) => old_asset_filter.add(new_asset_filter)?, + None => { + cfg.allowed_reserve_assets = Some(new_asset_filter); + true + }, + }; + return Ok(was_added) + } + } + return Err(BridgeConfigError::MissingTargetLocation) + } + + pub fn to_bridge_location(self) -> Result { + let maybe_fee = match self.bridge_location_fee { + Some(fee) => Some(fee.to_versioned()?), + None => None, + }; + Ok(MaybePaidLocation { location: self.bridge_location.to_versioned()?, maybe_fee }) + } + } + + #[derive( + Encode, Decode, MaxEncodedLen, TypeInfo, RuntimeDebugNoBound, CloneNoBound, PartialEqNoBound, + )] + #[scale_info(skip_type_params(T))] + pub struct TargetLocationConfig { + /// If `None` then `UnpaidExecution` is used, else `Withdraw(target_location_fee)/BuyExecution(target_location_fee, Unlimited)` + /// `MultiAsset` is here from the point of view of `allowed_target_location`, e.g.: `MultiLocation::parent()` means relay chain token of `allowed_target_location` + pub max_target_location_fee: Option, + + /// Filter for allowed asset that can be send out to the target location. + pub allowed_reserve_assets: Option>, + } + + pub enum BridgeConfigError { + AssetFilterError(AssetFilterError), + MissingTargetLocation, + UnsupportedXcmVersionError(UnsupportedXcmVersionError), + LimitReached, + } + + impl From for BridgeConfigError { + fn from(e: UnsupportedXcmVersionError) -> Self { + Self::UnsupportedXcmVersionError(e) + } + } + + impl From for BridgeConfigError { + fn from(e: AssetFilterError) -> Self { + Self::AssetFilterError(e) + } + } +} + +pub mod filter { + use super::*; + + use crate::UnsupportedXcmVersionError; + use frame_support::{pallet_prelude::Get, BoundedVec}; + + pub type AssetFilterOf = AssetFilter<::AssetsPerReserveLocationLimit>; + pub type MultiLocationFilterOf = + MultiLocationFilter<::AssetsPerReserveLocationLimit>; + + pub trait AssetFilterT { + fn matches(&self, location: &MultiLocation) -> Result; + } + + pub enum AssetFilterError { + UnsupportedXcmVersionError, + LimitReached, + } + + impl From for AssetFilterError { + fn from(_: UnsupportedXcmVersionError) -> Self { + Self::UnsupportedXcmVersionError + } + } + + impl From for crate::Error { + fn from(value: AssetFilterError) -> Self { + match value { + AssetFilterError::UnsupportedXcmVersionError => + crate::Error::::UnsupportedXcmVersion, + AssetFilterError::LimitReached => crate::Error::::InvalidConfiguration, + } + } + } + + #[derive( + CloneNoBound, + Encode, + Decode, + Eq, + PartialEqNoBound, + RuntimeDebugNoBound, + TypeInfo, + MaxEncodedLen, + Ord, + PartialOrd, + )] + #[scale_info(skip_type_params(AssetsLimit))] + pub enum AssetFilter> { + ByMultiLocation(MultiLocationFilter), + All, + } + + impl> AssetFilterT for AssetFilter { + fn matches(&self, location: &MultiLocation) -> Result { + match self { + AssetFilter::ByMultiLocation(by_location) => by_location.matches(location), + AssetFilter::All => Ok(true), + } + } + } + + impl> AssetFilter { + pub fn add( + &mut self, + new_filter: AssetFilter, + ) -> Result { + match new_filter { + AssetFilter::ByMultiLocation(by_location) => match self { + AssetFilter::ByMultiLocation(old_by_location) => + old_by_location.add(by_location), + AssetFilter::All => { + *self = AssetFilter::ByMultiLocation(by_location); + Ok(true) + }, + }, + AssetFilter::All => { + let mut was_added = false; + if !matches!(self, AssetFilter::All) { + *self = AssetFilter::All; + was_added = true + } + Ok(was_added) + }, + } + } + } + + #[derive( + CloneNoBound, + Encode, + Decode, + Eq, + PartialEqNoBound, + RuntimeDebugNoBound, + Default, + TypeInfo, + MaxEncodedLen, + Ord, + PartialOrd, + )] + #[scale_info(skip_type_params(PatternsLimit))] + pub struct MultiLocationFilter> { + /// Requested location equals to `MultiLocation` + pub equals_any: BoundedVec, + /// Requested location starts with `MultiLocation` + pub starts_with_any: BoundedVec, + } + + impl> MultiLocationFilter { + fn add( + &mut self, + to_add: MultiLocationFilter, + ) -> Result { + let add_if_not_found = |olds: &mut BoundedVec, + news: BoundedVec| + -> Result { + let mut was_added = false; + for new_ta in news { + if MultiLocationFilter::find_index(&olds, &new_ta)?.is_none() { + olds.try_push(new_ta).map_err(|_| AssetFilterError::LimitReached)?; + was_added = true; + } + } + Ok(was_added) + }; + + Ok(add_if_not_found(&mut self.equals_any, to_add.equals_any)? | + add_if_not_found(&mut self.starts_with_any, to_add.starts_with_any)?) + } + + pub fn remove( + &mut self, + to_remove: MultiLocationFilter, + ) -> Result { + let remove_from = |olds: &mut BoundedVec, + to_remove: BoundedVec| + -> Result { + let mut was_removed = false; + for tr in to_remove { + let found = MultiLocationFilter::find_index(olds, &tr)?; + if let Some(idx) = found { + _ = olds.remove(idx); + was_removed = true; + } + } + Ok(was_removed) + }; + + Ok(remove_from(&mut self.equals_any, to_remove.equals_any)? | + remove_from(&mut self.starts_with_any, to_remove.starts_with_any)?) + } + + fn find_index( + items: &BoundedVec, + searched: &VersionedMultiLocation, + ) -> Result, UnsupportedXcmVersionError> { + let searched = searched.as_versioned_ref()?; + for (idx, item) in items.iter().enumerate() { + let item = item.as_versioned_ref()?; + if item.eq(searched) { + return Ok(Some(idx)) + } + } + Ok(None) + } + + pub fn is_empty(&self) -> bool { + self.equals_any.is_empty() && self.starts_with_any.is_empty() + } + } + + impl> AssetFilterT for MultiLocationFilter { + fn matches(&self, location: &MultiLocation) -> Result { + for filter in &self.equals_any { + if filter.using_versioned_ref(|versioned| location.eq(versioned))? { + return Ok(true) + } + } + for filter in &self.starts_with_any { + if filter.using_versioned_ref(|versioned| location.starts_with(versioned))? { + return Ok(true) + } + } + Ok(false) + } + } +} + +pub mod xcm_version { + use super::*; + use crate::Config; + use codec::EncodeLike; + use xcm::TryAs; + + /// For simplified version mismatch handling + #[derive(Debug)] + pub struct UnsupportedXcmVersionError; + + impl From for crate::Error { + fn from(_: UnsupportedXcmVersionError) -> Self { + Self::UnsupportedXcmVersion + } + } + + /// Simplified adapter between `xcm::latest` and `Versioned*` stuff. + pub trait UsingVersioned: TryAs + TryInto { + fn using_versioned_ref R>( + &self, + f: F, + ) -> Result { + let versioned = self.try_as().map_err(|_| UnsupportedXcmVersionError)?; + Ok(f(versioned)) + } + + fn as_versioned_ref(&self) -> Result<&T, UnsupportedXcmVersionError> { + let versioned = self.try_as().map_err(|_| UnsupportedXcmVersionError)?; + Ok(versioned) + } + + fn to_versioned(self) -> Result { + let versioned = self.try_into().map_err(|_| UnsupportedXcmVersionError)?; + Ok(versioned) + } + } + + impl UsingVersioned for VersionedMultiLocation {} + + impl UsingVersioned for VersionedMultiAsset {} + + /// `KeyArg` wrapper for `VersionedMultiLocation`. + /// This feature allows to use `VersionedMultiLocation` as key, e.g. for `StorageMap`. + /// + /// NOTE: Because something like this does not work: + /// ```nocompile + /// let a = VersionedMultiLocation::V2(xcm::v2::MultiLocation::new(1, xcm::v2::Junctions::X1(xcm::v2::Junction::Parachain(1000)))); + /// let b = VersionedMultiLocation::V3(xcm::v3::MultiLocation::new(1, xcm::v3::Junctions::X1(xcm::v3::Junction::Parachain(1000)))); + /// assert_eq!(key_a, key_b); // <-- fails + /// ``` + #[derive(Copy, Clone)] + pub struct LatestVersionedMultiLocation<'a>(pub(crate) &'a MultiLocation); + + impl<'a> EncodeLike for LatestVersionedMultiLocation<'a> {} + + impl<'a> EncodeLike for &LatestVersionedMultiLocation<'a> {} + + impl<'a> Encode for LatestVersionedMultiLocation<'a> { + fn encode(&self) -> sp_std::vec::Vec { + let mut r = VersionedMultiLocation::from(MultiLocation::default()).encode(); + r.truncate(1); + self.0.using_encoded(|d| r.extend_from_slice(d)); + r + } + } + + impl<'a> TryFrom<&'a VersionedMultiLocation> for LatestVersionedMultiLocation<'a> { + type Error = UnsupportedXcmVersionError; + + fn try_from(value: &'a VersionedMultiLocation) -> Result { + value.as_versioned_ref().map(|v| LatestVersionedMultiLocation(v)) + } + } +} diff --git a/parachains/pallets/bridge-transfer/src/weights.rs b/parachains/pallets/bridge-transfer/src/weights.rs index be1eb001980..4368b33aec8 100644 --- a/parachains/pallets/bridge-transfer/src/weights.rs +++ b/parachains/pallets/bridge-transfer/src/weights.rs @@ -36,6 +36,16 @@ pub trait WeightInfo { /// Weight of the `update_exporter_config` call. fn update_exporter_config() -> Weight; + /// Weight of the `update_bridged_target_location` call. + fn update_bridged_target_location() -> Weight; + /// Weight of the `remove_bridged_target_location` call. + fn remove_bridged_target_location() -> Weight; + + /// Weight of the `allow_reserve_asset_transfer` call. + fn allow_reserve_asset_transfer_for() -> Weight; + /// Weight of the `disallow_reserve_asset_transfer_for` call. + fn disallow_reserve_asset_transfer_for() -> Weight; + /// Weight of the `add_universal_alias` call. fn add_universal_alias() -> Weight; /// Weight of the `remove_universal_alias` call. @@ -69,6 +79,22 @@ impl WeightInfo for () { Weight::zero() } + fn update_bridged_target_location() -> Weight { + Weight::zero() + } + + fn remove_bridged_target_location() -> Weight { + Weight::zero() + } + + fn allow_reserve_asset_transfer_for() -> Weight { + Weight::zero() + } + + fn disallow_reserve_asset_transfer_for() -> Weight { + Weight::zero() + } + fn add_universal_alias() -> Weight { Weight::zero() } diff --git a/parachains/runtimes/assets/common/src/matching.rs b/parachains/runtimes/assets/common/src/matching.rs index ea6ae888e48..964f25cda35 100644 --- a/parachains/runtimes/assets/common/src/matching.rs +++ b/parachains/runtimes/assets/common/src/matching.rs @@ -82,25 +82,3 @@ impl> ContainsPair } } } - -/// Accepts an asset if it is from different global consensus than self plus `parents > 1` -pub struct IsDifferentGlobalConsensusConcreteAsset( - sp_std::marker::PhantomData, -); -impl> ContainsPair - for IsDifferentGlobalConsensusConcreteAsset -{ - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { - log::trace!(target: "xcm::contains", "IsDifferentGlobalConsensusConcreteAsset asset: {:?}, origin: {:?}", asset, origin); - match asset { - MultiAsset { id: Concrete(asset_location), .. } if asset_location.parents > 1 => - match asset_location.first_interior() { - Some(GlobalConsensus(asset_consensus)) - if asset_consensus != &SelfGlobalConsensus::get() => - true, - _ => false, - }, - _ => false, - } - } -} diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 1255b326909..2166097dacf 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -700,14 +700,16 @@ impl pallet_bridge_transfer::Config for Runtime { type UniversalLocation = UniversalLocation; type WeightInfo = weights::pallet_bridge_transfer::WeightInfo; type AdminOrigin = AssetsForceOrigin; + type AllowReserveAssetTransferOrigin = AsEnsureOriginWithArg; type UniversalAliasesLimit = ConstU32<24>; - type ReserveLocationsLimit = ConstU32<8>; + type ReserveLocationsLimit = ConstU32<4>; + type AssetsPerReserveLocationLimit = ConstU32<128>; type AssetTransactor = AssetTransactors; + type AssetTransferKindResolver = + pallet_bridge_transfer::impls::ConfiguredConcreteAssetTransferKindResolver; type BridgeXcmSender = BridgeXcmSender; - type TransferAssetOrigin = EnsureXcmOrigin; + type AssetTransferOrigin = EnsureXcmOrigin; type MaxAssetsLimit = ConstU8<1>; - type TransferPingOrigin = EnsureXcmOrigin; - type PingMessageBuilder = pallet_bridge_transfer::UnpaidTrapMessageBuilder>; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = xcm_config::BridgeTransferBenchmarksHelper; } diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs index 47a63b0eb36..3ccf8fa0fc8 100644 --- a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -140,6 +140,43 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + + fn update_bridged_target_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + + fn remove_bridged_target_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + + fn allow_reserve_asset_transfer_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + + fn disallow_reserve_asset_transfer_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn add_universal_alias() -> Weight { // Proof Size summary in bytes: // Measured: `0` diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 27597514657..4a47c368f1b 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -19,15 +19,16 @@ use super::{ RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use assets_common::matching::{ - FromSiblingParachain, IsDifferentGlobalConsensusConcreteAsset, IsForeignConcreteAsset, - StartsWith, StartsWithExplicitGlobalConsensus, + FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, }; use frame_support::{ match_types, parameter_types, traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, }; use frame_system::EnsureRoot; -use pallet_bridge_transfer::impls::{AllowedUniversalAliasesOf, IsAllowedReserveOf}; +use pallet_bridge_transfer::impls::{ + AllowedUniversalAliasesOf, IsTrustedBridgedReserveForConcreteAsset, +}; use pallet_xcm::XcmPassthrough; use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; use polkadot_parachain::primitives::Sibling; @@ -384,10 +385,7 @@ impl xcm_executor::Config for XcmConfig { type OriginConverter = XcmOriginToTransactDispatchOrigin; // Statemine acting _as_ a reserve location for KSM and assets created under `pallet-assets`. // For KSM, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = IsAllowedReserveOf< - Runtime, - IsDifferentGlobalConsensusConcreteAsset, - >; + type IsReserve = IsTrustedBridgedReserveForConcreteAsset; // We allow: // - teleportation of KSM // - teleportation of sibling parachain's assets (as ForeignCreators) diff --git a/parachains/runtimes/assets/statemine/tests/tests.rs b/parachains/runtimes/assets/statemine/tests/tests.rs index cea7157b6c8..ab5ebb43fcf 100644 --- a/parachains/runtimes/assets/statemine/tests/tests.rs +++ b/parachains/runtimes/assets/statemine/tests/tests.rs @@ -606,9 +606,26 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p }) ); +#[test] +fn can_governance_change_bridge_transfer_in_configuration() { + asset_test_utils::test_cases_over_bridge::can_governance_change_bridge_transfer_in_configuration::< + Runtime, + XcmConfig, + >( + collator_session_keys(), + Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }), + ) +} + #[test] fn can_governance_change_bridge_transfer_out_configuration() { - asset_test_utils::test_cases::can_governance_change_bridge_transfer_out_configuration::< + asset_test_utils::test_cases_over_bridge::can_governance_change_bridge_transfer_out_configuration::< Runtime, XcmConfig, >( @@ -624,8 +641,8 @@ fn can_governance_change_bridge_transfer_out_configuration() { } #[test] -fn initiate_transfer_asset_via_bridge_for_native_asset_works() { - asset_test_utils::test_cases::initiate_transfer_asset_via_bridge_for_native_asset_works::< +fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works() { + asset_test_utils::test_cases_over_bridge::transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works::< Runtime, XcmConfig, ParachainSystem, @@ -651,25 +668,36 @@ fn initiate_transfer_asset_via_bridge_for_native_asset_works() { } #[test] -fn can_governance_change_bridge_transfer_in_configuration() { - asset_test_utils::test_cases::can_governance_change_bridge_transfer_in_configuration::< +fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_works() { + asset_test_utils::test_cases_over_bridge::transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_works::< Runtime, XcmConfig, + ParachainSystem, + XcmpQueue, + LocationToAccountId, + ForeignAssetsInstance, >( collator_session_keys(), - Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), + ExistentialDeposit::get(), + AccountId::from(ALICE), Box::new(|runtime_event_encoded: Vec| { match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), _ => None, } }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), ) } #[test] -fn receive_reserve_asset_deposited_from_different_consensus_works() { - asset_test_utils::test_cases::receive_reserve_asset_deposited_from_different_consensus_works::< +fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_works() { + asset_test_utils::test_cases_over_bridge::receive_reserve_asset_deposited_from_different_consensus_over_bridge_works::< Runtime, XcmConfig, LocationToAccountId, @@ -686,3 +714,22 @@ fn receive_reserve_asset_deposited_from_different_consensus_works() { }), ) } + +#[test] +fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_works() { + asset_test_utils::test_cases_over_bridge::withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_works::< + Runtime, + XcmConfig, + LocationToAccountId, + >( + collator_session_keys(), + ExistentialDeposit::get(), + AccountId::from(BOB), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + ) +} diff --git a/parachains/runtimes/assets/test-utils/src/lib.rs b/parachains/runtimes/assets/test-utils/src/lib.rs index 9a24867592e..bd5e6e7deb4 100644 --- a/parachains/runtimes/assets/test-utils/src/lib.rs +++ b/parachains/runtimes/assets/test-utils/src/lib.rs @@ -17,4 +17,5 @@ //! Module contains predefined test-case scenarios for `Runtime` with various assets. pub mod test_cases; +pub mod test_cases_over_bridge; pub use parachains_runtimes_test_utils::*; diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 8d58da85b74..156b28d1353 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -16,25 +16,21 @@ //! Module contains predefined test-case scenarios for `Runtime` with various assets. use codec::Encode; -use cumulus_primitives_core::XcmpMessageSource; use frame_support::{ assert_noop, assert_ok, - traits::{ - fungibles::InspectEnumerable, Contains, Currency, Get, OriginTrait, ProcessMessageError, - }, + traits::{fungibles::InspectEnumerable, Get, OriginTrait}, weights::Weight, }; use parachains_common::Balance; use parachains_runtimes_test_utils::{ - assert_metadata, assert_total, mock_open_hrmp_channel, AccountIdOf, BalanceOf, - CollatorSessionKeys, ExtBuilder, RuntimeHelper, ValidatorIdOf, XcmReceivedFrom, + assert_metadata, assert_total, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, + RuntimeHelper, ValidatorIdOf, XcmReceivedFrom, }; use sp_runtime::{ traits::{StaticLookup, Zero}, DispatchError, Saturating, }; -use xcm::{latest::prelude::*, VersionedMultiAsset, VersionedMultiAssets, VersionedMultiLocation}; -use xcm_builder::{CreateMatcher, MatchXcm}; +use xcm::latest::prelude::*; use xcm_executor::{traits::Convert, XcmExecutor}; /// Test-case makes sure that `Runtime` can receive native asset from relay chain @@ -1299,733 +1295,3 @@ macro_rules! include_create_and_manage_foreign_assets_for_local_consensus_parach } } ); - -/// Test-case makes sure that `Runtime` can manage `bridge_transfer out` configuration by governance -pub fn can_governance_change_bridge_transfer_out_configuration( - collator_session_keys: CollatorSessionKeys, - runtime_call_encode: Box) -> Vec>, - unwrap_pallet_bridge_transfer_event: Box< - dyn Fn(Vec) -> Option>, - >, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_dmp_queue::Config - + pallet_bridge_transfer::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - XcmConfig: xcm_executor::Config, -{ - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_tracing() - .with_safe_xcm_version(3) - .build() - .execute_with(|| { - // bridge cfg data - let bridged_network = ByGenesis([9; 32]); - let bridge_config = pallet_bridge_transfer::BridgeConfig { - bridge_location: (Parent, Parachain(1013)).into(), - bridge_location_fee: None, - allowed_target_location: MultiLocation::new( - 2, - X2(GlobalConsensus(bridged_network), Parachain(1000)), - ), - max_target_location_fee: None, - }; - - // check no cfg - assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) - .is_none()); - - // governance can add exporter config - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::add_exporter_config { - bridged_network, - bridge_config: Box::new(bridge_config.clone()), - } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::add_exporter_config() - ) - .ensure_complete()); - - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeAdded))); - { - let cfg = - pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network); - assert!(cfg.is_some()); - let cfg = cfg.unwrap(); - assert_eq!(cfg.bridge_location, bridge_config.bridge_location); - assert_eq!(cfg.bridge_location_fee, None); - assert_eq!(cfg.allowed_target_location, bridge_config.allowed_target_location); - assert_eq!(cfg.max_target_location_fee, None); - } - - // governance can update bridge config - let new_bridge_location_fee: MultiAsset = - (Concrete(MultiLocation::parent()), 1_000).into(); - let new_target_location_fee: MultiAsset = - (Concrete(MultiLocation::parent()), 1_000_000).into(); - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::update_exporter_config { - bridged_network, - bridge_location_fee: Some(Box::new(VersionedMultiAsset::V3( - new_bridge_location_fee.clone() - ))), - target_location_fee: Some(Box::new(VersionedMultiAsset::V3( - new_target_location_fee.clone() - ))), - } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::update_exporter_config() - ) - .ensure_complete()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeUpdated))); - { - let cfg = - pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network); - assert!(cfg.is_some()); - let cfg = cfg.unwrap(); - assert_eq!(cfg.bridge_location, bridge_config.bridge_location); - assert_eq!(cfg.bridge_location_fee, Some(new_bridge_location_fee)); - assert_eq!(cfg.allowed_target_location, bridge_config.allowed_target_location); - assert_eq!(cfg.max_target_location_fee, Some(new_target_location_fee)); - } - - // governance can remove bridge config - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::remove_exporter_config { bridged_network } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::remove_exporter_config() - ) - .ensure_complete()); - assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) - .is_none()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeRemoved))); - }) -} - -/// Test-case makes sure that `Runtime` can manage `bridge_transfer in` configuration by governance -pub fn can_governance_change_bridge_transfer_in_configuration( - collator_session_keys: CollatorSessionKeys, - runtime_call_encode: Box) -> Vec>, - unwrap_pallet_bridge_transfer_event: Box< - dyn Fn(Vec) -> Option>, - >, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_dmp_queue::Config - + pallet_bridge_transfer::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - XcmConfig: xcm_executor::Config, -{ - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_tracing() - .with_safe_xcm_version(3) - .build() - .execute_with(|| { - // bridge cfg data - let bridge_location = (Parent, Parachain(1013)).into(); - let alias_junction = GlobalConsensus(ByGenesis([9; 32])); - - // check before - assert!( - !pallet_bridge_transfer::impls::AllowedUniversalAliasesOf::::contains(&( - bridge_location, - alias_junction - )) - ); - - // governance can add bridge config - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::add_universal_alias { - location: Box::new(VersionedMultiLocation::V3(bridge_location.clone())), - junction: alias_junction, - } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::add_universal_alias() - ) - .ensure_complete()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::UniversalAliasAdded))); - - // check after - assert!(pallet_bridge_transfer::impls::AllowedUniversalAliasesOf::::contains( - &(bridge_location, alias_junction) - )); - }) -} - -/// Test-case makes sure that `Runtime` can initiate transfer of assets via bridge -pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< - Runtime, - XcmConfig, - HrmpChannelOpener, - HrmpChannelSource, - LocationToAccountId, ->( - collator_session_keys: CollatorSessionKeys, - existential_deposit: BalanceOf, - alice_account: AccountIdOf, - unwrap_pallet_bridge_transfer_event: Box< - dyn Fn(Vec) -> Option>, - >, - unwrap_xcmp_queue_event: Box< - dyn Fn(Vec) -> Option>, - >, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_transfer::Config - + cumulus_pallet_xcmp_queue::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - ::Balance: From + Into, - XcmConfig: xcm_executor::Config, - LocationToAccountId: Convert>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - <::Lookup as StaticLookup>::Source: - From<::AccountId>, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - HrmpChannelSource: XcmpMessageSource, -{ - let runtime_para_id = 1000; - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_tracing() - .with_safe_xcm_version(3) - .with_para_id(runtime_para_id.into()) - .build() - .execute_with(|| { - // prepare bridge config - let bridged_network = ByGenesis([6; 32]); - let bridge_hub_para_id = 1013; - let bridge_hub_location = (Parent, Parachain(bridge_hub_para_id)).into(); - let target_location_from_different_consensus = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); - let bridge_config = pallet_bridge_transfer::BridgeConfig { - bridge_location: bridge_hub_location, - bridge_location_fee: None, - allowed_target_location: target_location_from_different_consensus, - max_target_location_fee: Some(target_location_fee.clone()), - }; - let reserve_account = - LocationToAccountId::convert_ref(&target_location_from_different_consensus) - .expect("Sovereign account for reserves"); - let balance_to_transfer = 1000_u128; - let native_asset = MultiLocation::parent(); - - // open HRMP to bridge hub - mock_open_hrmp_channel::( - runtime_para_id.into(), - bridge_hub_para_id.into(), - ); - - // drip ED to account - let alice_account_init_balance = existential_deposit + balance_to_transfer.into(); - let _ = >::deposit_creating( - &alice_account, - alice_account_init_balance.clone(), - ); - // SA of target location needs to have at least ED, anyway making reserve fails - let _ = >::deposit_creating( - &reserve_account, - existential_deposit, - ); - - // we just check here, that user remains enough balances after withdraw - // and also we check if `balance_to_transfer` is more than `existential_deposit`, - assert!( - (>::free_balance(&alice_account) - - balance_to_transfer.into()) >= - existential_deposit - ); - // SA has just ED - assert_eq!( - >::free_balance(&reserve_account), - existential_deposit - ); - - // insert bridge config - assert_ok!(>::add_exporter_config( - RuntimeHelper::::root_origin(), - bridged_network, - Box::new(bridge_config), - )); - - // local native asset (pallet_balances) - let assets = MultiAssets::from(MultiAsset { - fun: Fungible(balance_to_transfer.into()), - id: Concrete(native_asset), - }); - - // destination is (some) account from different consensus - let target_destination_account = target_location_from_different_consensus - .clone() - .appended_with(AccountId32 { - network: Some(bridged_network), - id: sp_runtime::AccountId32::new([3; 32]).into(), - }) - .unwrap(); - - // trigger asset transfer - assert_ok!(>::transfer_asset_via_bridge( - RuntimeHelper::::origin_of(alice_account.clone()), - Box::new(VersionedMultiAssets::from(assets.clone())), - Box::new(VersionedMultiLocation::from(target_destination_account.clone())), - )); - - // check alice account decreased - assert_eq!( - >::free_balance(&alice_account), - alice_account_init_balance - balance_to_transfer.into() - ); - // check reserve account increased - assert_eq!( - >::free_balance(&reserve_account), - existential_deposit + balance_to_transfer.into() - ); - - // check events - let mut bridge_transfer_events = >::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())); - assert!(bridge_transfer_events.any(|r| matches!( - r, - pallet_bridge_transfer::Event::ReserveAssetsDeposited { .. } - ))); - let transfer_initiated_event = bridge_transfer_events.find_map(|e| match e { - pallet_bridge_transfer::Event::TransferInitiated { - message_id, - forwarded_message_id, - sender_cost, - } => Some((message_id, forwarded_message_id, sender_cost)), - _ => None, - }); - assert!(transfer_initiated_event.is_some()); - let (message_id, forwarded_message_id, sender_cost) = transfer_initiated_event.unwrap(); - // we expect UnpaidRemoteExporter - assert!(sender_cost.is_none()); - - // check that xcm was sent - let xcm_sent_message_hash = >::events() - .into_iter() - .filter_map(|e| unwrap_xcmp_queue_event(e.event.encode())) - .find_map(|e| match e { - cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => - Some(message_hash), - _ => None, - }); - - // read xcm - let xcm_sent = - RuntimeHelper::::take_xcm(bridge_hub_para_id.into()).unwrap(); - println!("xcm_sent: {:?}", xcm_sent); - assert_eq!( - xcm_sent_message_hash, - Some(xcm_sent.using_encoded(sp_io::hashing::blake2_256)) - ); - let mut xcm_sent: Xcm<()> = xcm_sent.try_into().expect("versioned xcm"); - - // check sent XCM ExportMessage to bridge-hub - assert!(xcm_sent - .0 - .matcher() - .match_next_inst(|instr| match instr { - // first instruction is UNpai (because we have explicit unpaid execution on bridge-hub now) - UnpaidExecution { weight_limit, check_origin } - if weight_limit == &Unlimited && check_origin.is_none() => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains UnpaidExecution") - .match_next_inst(|instr| match instr { - // second instruction is ExportMessage - ExportMessage { network, destination, xcm: inner_xcm } => { - assert_eq!(network, &bridged_network); - let (_, target_location_junctions_without_global_consensus) = - target_location_from_different_consensus - .interior - .clone() - .split_global() - .expect("split works"); - assert_eq!( - destination, - &target_location_junctions_without_global_consensus - ); - - let mut reanchored_assets = assets.clone(); - reanchored_assets - .reanchor( - &target_location_from_different_consensus, - XcmConfig::UniversalLocation::get(), - ) - .expect("reanchored assets"); - let mut reanchored_destination_account = target_destination_account.clone(); - reanchored_destination_account - .reanchor( - &target_location_from_different_consensus, - XcmConfig::UniversalLocation::get(), - ) - .expect("reanchored destination account"); - let universal_location_as_sovereign_account_on_target = - ::UniversalLocation::get() - .invert_target(&target_location_from_different_consensus) - .expect("invert_target Universal Location"); - - // match inner xcm - assert!(inner_xcm - .0 - .matcher() - .match_next_inst(|next_instr| match next_instr { - WithdrawAsset(fees) - if fees == &MultiAssets::from(target_location_fee.clone()) => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains WithdrawAsset") - .match_next_inst(|next_instr| match next_instr { - BuyExecution { ref fees, ref weight_limit } - if fees == &target_location_fee && - weight_limit == &Unlimited => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains BuyExecution") - .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { - ReserveAssetDeposited(ref deposited) - if deposited.eq(&reanchored_assets) => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains ReserveAssetDeposited") - .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { - DepositAsset { assets: filter, ref beneficiary } - if filter == - &MultiAssetFilter::from(reanchored_assets.clone()) && - beneficiary.eq(&reanchored_destination_account) => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains DepositAsset") - .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { - RefundSurplus => Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains RefundSurplus") - .match_next_inst(|inner_xcm_instr| { - match inner_xcm_instr { - DepositAsset { assets: filter, ref beneficiary } - if filter == - &MultiAssetFilter::from( - target_location_fee.clone(), - ) && beneficiary.eq( - &universal_location_as_sovereign_account_on_target, - ) => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - } - }) - .expect("contains DepositAsset") - .match_next_inst(|instr| match instr { - SetTopic(ref topic) if topic.eq(&message_id) => Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains SetTopic") - .assert_remaining_insts(0) - .is_ok()); - Ok(()) - }, - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains ExportMessage") - .match_next_inst(|instr| match instr { - SetTopic(ref topic) if topic.eq(&forwarded_message_id) => Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains SetTopic") - .assert_remaining_insts(0) - .is_ok()); - }) -} - -/// Test-case makes sure that `Runtime` can process `ReserveAssetDeposited`. -pub fn receive_reserve_asset_deposited_from_different_consensus_works< - Runtime, - XcmConfig, - LocationToAccountId, - ForeignAssetsPalletInstance, ->( - collator_session_keys: CollatorSessionKeys, - existential_deposit: BalanceOf, - target_account: AccountIdOf, - unwrap_pallet_xcm_event: Box) -> Option>>, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config - + pallet_assets::Config - + pallet_bridge_transfer::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - <::Lookup as StaticLookup>::Source: - From<::AccountId>, - XcmConfig: xcm_executor::Config, - >::AssetId: - From + Into, - >::AssetIdParameter: - From + Into, - >::Balance: - From + Into, - LocationToAccountId: Convert>, - ForeignAssetsPalletInstance: 'static, -{ - let remote_network_id = ByGenesis([7; 32]); - let remote_parachain_as_origin = MultiLocation { - parents: 2, - interior: X2(GlobalConsensus(remote_network_id), Parachain(1000)), - }; - let foreign_asset_id_multilocation = - MultiLocation { parents: 2, interior: X1(GlobalConsensus(remote_network_id)) }; - let buy_execution_fee_amount = 50000000000; - let reserve_asset_deposisted = 100_000_000; - - let local_bridge_hub_multilocation = - MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; - - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_balances(vec![(target_account.clone(), existential_deposit)]) - .with_tracing() - .build() - .execute_with(|| { - // drip SA for remote global parachain origin - let remote_parachain_sovereign_account = - LocationToAccountId::convert_ref(remote_parachain_as_origin) - .expect("Sovereign account works"); - assert_ok!(>::force_set_balance( - RuntimeHelper::::root_origin(), - remote_parachain_sovereign_account.clone().into(), - existential_deposit + buy_execution_fee_amount.into(), - )); - - // setup bridge transfer configuration - // add allowed univeral alias for remote network - assert_ok!(>::add_universal_alias( - RuntimeHelper::::root_origin(), - Box::new(VersionedMultiLocation::V3(local_bridge_hub_multilocation)), - GlobalConsensus(remote_network_id) - )); - // add allowed reserve location - assert_ok!(>::add_reserve_location( - RuntimeHelper::::root_origin(), - Box::new(VersionedMultiLocation::V3(remote_parachain_as_origin)) - )); - - // create foreign asset - let asset_minimum_asset_balance = 1_000_000_u128; - assert_ok!( - >::force_create( - RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation.clone().into(), - remote_parachain_sovereign_account.clone().into(), - false, - asset_minimum_asset_balance.into() - ) - ); - - // we assume here that BuyExecution fee goes to staking pot - let staking_pot_account_id = >::account_id(); - let local_bridge_hub_multilocation_as_account_id = - LocationToAccountId::convert_ref(&local_bridge_hub_multilocation) - .expect("Correct AccountId"); - - // check before - let remote_parachain_sovereign_account_balance_before = - >::free_balance( - &remote_parachain_sovereign_account, - ); - assert_eq!( - remote_parachain_sovereign_account_balance_before, - existential_deposit + buy_execution_fee_amount.into() - ); - assert_eq!( - >::free_balance(&target_account), - existential_deposit - ); - assert_eq!( - >::free_balance( - &local_bridge_hub_multilocation_as_account_id - ), - 0.into() - ); - assert_eq!( - >::free_balance(&staking_pot_account_id), - 0.into() - ); - assert_eq!( - >::balance( - foreign_asset_id_multilocation.into(), - &target_account - ), - 0.into() - ); - - // xcm - let xcm = Xcm(vec![ - UniversalOrigin(GlobalConsensus(remote_network_id)), - DescendOrigin(X1(Parachain(1000))), - // buying execution as sovereign account `remote_parachain_sovereign_account` in *native asset on receiving runtime* - WithdrawAsset(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(buy_execution_fee_amount), - }])), - BuyExecution { - fees: MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(buy_execution_fee_amount), - }, - weight_limit: Unlimited, - }, - // reserve deposited - assets transferred through bridge - *native asset on sending runtime* - ReserveAssetDeposited(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(remote_network_id)), - }), - fun: Fungible(reserve_asset_deposisted), - }])), - DepositAsset { - assets: Definite(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(remote_network_id)), - }), - fun: Fungible(reserve_asset_deposisted), - }])), - beneficiary: MultiLocation { - parents: 0, - interior: X1(AccountId32 { - network: None, - id: target_account.clone().into(), - }), - }, - }, - // return unspent weight back to SA of caller - RefundSurplus, - DepositAsset { - assets: Definite(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(buy_execution_fee_amount), - }])), - beneficiary: remote_parachain_as_origin, - }, - ]); - - // origin as BridgeHub - let origin = local_bridge_hub_multilocation; - - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - - // execute xcm as XcmpQueue would do - let outcome = XcmExecutor::::execute_xcm( - origin, - xcm, - hash, - RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), - ); - assert_eq!(outcome.ensure_complete(), Ok(())); - - // check after - let staking_pot_balance = - >::free_balance(&staking_pot_account_id); - assert_eq!( - >::free_balance( - &remote_parachain_sovereign_account - ), - remote_parachain_sovereign_account_balance_before - staking_pot_balance - ); - assert_eq!( - >::free_balance(&target_account), - existential_deposit - ); - assert_eq!( - >::free_balance( - &local_bridge_hub_multilocation_as_account_id - ), - 0.into() - ); - assert_ne!( - >::free_balance(&staking_pot_account_id), - 0.into() - ); - assert_eq!( - >::balance( - foreign_asset_id_multilocation.into(), - &target_account - ), - reserve_asset_deposisted.into() - ); - - // check NO asset trap occurred - assert_eq!( - false, - >::events() - .into_iter() - .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())) - .any(|e| matches!(e, pallet_xcm::Event::AssetsTrapped { .. })) - ); - }) -} diff --git a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs new file mode 100644 index 00000000000..39bc1323367 --- /dev/null +++ b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs @@ -0,0 +1,1355 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Module contains predefined test-case scenarios for `Runtime` with various assets over bridge transfer. + +use codec::Encode; +use cumulus_primitives_core::XcmpMessageSource; +use frame_support::{ + assert_ok, + traits::{Contains, Currency, Get, OriginTrait, ProcessMessageError}, + BoundedVec, +}; +use pallet_bridge_transfer::{filter::MultiLocationFilter, AssetFilterOf}; +use parachains_common::Balance; +use parachains_runtimes_test_utils::{ + mock_open_hrmp_channel, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, RuntimeHelper, + ValidatorIdOf, XcmReceivedFrom, +}; +use sp_runtime::traits::StaticLookup; +use xcm::{latest::prelude::*, VersionedMultiAssets, VersionedMultiLocation}; +use xcm_builder::{CreateMatcher, MatchXcm}; +use xcm_executor::{traits::Convert, XcmExecutor}; + +/// Test-case makes sure that `Runtime` can manage `bridge_transfer out` configuration by governance +pub fn can_governance_change_bridge_transfer_out_configuration( + collator_session_keys: CollatorSessionKeys, + runtime_call_encode: Box) -> Vec>, + unwrap_pallet_bridge_transfer_event: Box< + dyn Fn(Vec) -> Option>, + >, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + cumulus_pallet_dmp_queue::Config + + pallet_bridge_transfer::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + XcmConfig: xcm_executor::Config, +{ + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_tracing() + .with_safe_xcm_version(3) + .build() + .execute_with(|| { + // bridge cfg data + let bridged_network = ByGenesis([9; 32]); + let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); + let bridge_location_fee = None; + + // check no cfg + assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) + .is_none()); + + // governance can add exporter config + assert_ok!(RuntimeHelper::::execute_as_governance( + runtime_call_encode( + pallet_bridge_transfer::Call::::add_exporter_config { + bridged_network, + bridge_location: Box::new(bridge_location.into_versioned()), + bridge_location_fee, + } + ), + <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::add_exporter_config() + ) + .ensure_complete()); + assert!(>::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) + .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeAdded))); + { + let cfg = + pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network); + assert!(cfg.is_some()); + let cfg = cfg.unwrap(); + assert_eq!(cfg.bridge_location, bridge_location.into_versioned()); + assert_eq!(cfg.bridge_location_fee, None); + } + + // governance can update bridge fee + let new_bridge_location_fee: MultiAsset = + (Concrete(MultiLocation::parent()), 1_000).into(); + assert_ok!(RuntimeHelper::::execute_as_governance( + runtime_call_encode( + pallet_bridge_transfer::Call::::update_exporter_config { + bridged_network, + bridge_location_fee: Some(Box::new(new_bridge_location_fee.clone().into())), + } + ), + <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::update_exporter_config() + ) + .ensure_complete()); + assert!(>::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) + .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeFeeUpdated))); + { + let cfg = + pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network); + assert!(cfg.is_some()); + let cfg = cfg.unwrap(); + assert_eq!(cfg.bridge_location_fee, Some(new_bridge_location_fee.into())); + } + + let allowed_target_location = MultiLocation::new( + 2, + X2(GlobalConsensus(bridged_network), Parachain(1000)), + ); + let new_target_location_fee: MultiAsset = + (Concrete(MultiLocation::parent()), 1_000_000).into(); + + // governance can update target location + assert_ok!(RuntimeHelper::::execute_as_governance( + runtime_call_encode( + pallet_bridge_transfer::Call::::update_bridged_target_location { + bridged_network, + target_location: Box::new(allowed_target_location.into_versioned()), + max_target_location_fee: Some(Box::new(new_target_location_fee.into())) + } + ), + <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::update_bridged_target_location() + ) + .ensure_complete()); + assert!(>::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) + .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeTargetLocationUpdated))); + + // governance can allow reserve based assets to transfer out + assert_ok!(RuntimeHelper::::execute_as_governance( + runtime_call_encode( + pallet_bridge_transfer::Call::::allow_reserve_asset_transfer_for { + bridged_network, + target_location: Box::new(allowed_target_location.into_versioned()), + asset_filter: AssetFilterOf::::All, + } + ), + <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::allow_reserve_asset_transfer_for() + ) + .ensure_complete()); + assert!(>::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) + .any(|e| matches!(e, pallet_bridge_transfer::Event::ReserveLocationAdded))); + + // governance can remove bridge config + assert_ok!(RuntimeHelper::::execute_as_governance( + runtime_call_encode( + pallet_bridge_transfer::Call::::remove_exporter_config { bridged_network } + ), + <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::remove_exporter_config() + ) + .ensure_complete()); + assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) + .is_none()); + assert!(>::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) + .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeRemoved))); + }) +} + +/// Test-case makes sure that `Runtime` can manage `bridge_transfer in` configuration by governance +pub fn can_governance_change_bridge_transfer_in_configuration( + collator_session_keys: CollatorSessionKeys, + runtime_call_encode: Box) -> Vec>, + unwrap_pallet_bridge_transfer_event: Box< + dyn Fn(Vec) -> Option>, + >, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + cumulus_pallet_dmp_queue::Config + + pallet_bridge_transfer::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + XcmConfig: xcm_executor::Config, +{ + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_tracing() + .with_safe_xcm_version(3) + .build() + .execute_with(|| { + // bridge cfg data + let bridge_location = (Parent, Parachain(1013)).into(); + let alias_junction = GlobalConsensus(ByGenesis([9; 32])); + + // check before + assert!( + !pallet_bridge_transfer::impls::AllowedUniversalAliasesOf::::contains(&( + bridge_location, + alias_junction + )) + ); + + // governance can add bridge config + assert_ok!(RuntimeHelper::::execute_as_governance( + runtime_call_encode( + pallet_bridge_transfer::Call::::add_universal_alias { + location: Box::new(bridge_location.clone().into_versioned()), + junction: alias_junction, + } + ), + <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::add_universal_alias() + ) + .ensure_complete()); + assert!(>::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) + .any(|e| matches!(e, pallet_bridge_transfer::Event::UniversalAliasAdded))); + + // check after + assert!(pallet_bridge_transfer::impls::AllowedUniversalAliasesOf::::contains( + &(bridge_location, alias_junction) + )); + }) +} + +/// Test-case makes sure that `Runtime` can initiate transfer of assets via bridge - `TransferKind::ReserveBased` +pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< + Runtime, + XcmConfig, + HrmpChannelOpener, + HrmpChannelSource, + LocationToAccountId, +>( + collator_session_keys: CollatorSessionKeys, + existential_deposit: BalanceOf, + alice_account: AccountIdOf, + unwrap_pallet_bridge_transfer_event: Box< + dyn Fn(Vec) -> Option>, + >, + unwrap_xcmp_queue_event: Box< + dyn Fn(Vec) -> Option>, + >, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + pallet_bridge_transfer::Config + + cumulus_pallet_xcmp_queue::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + ::Balance: From + Into, + XcmConfig: xcm_executor::Config, + LocationToAccountId: Convert>, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + <::Lookup as StaticLookup>::Source: + From<::AccountId>, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + HrmpChannelSource: XcmpMessageSource, +{ + let runtime_para_id = 1000; + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_tracing() + .with_safe_xcm_version(3) + .with_para_id(runtime_para_id.into()) + .build() + .execute_with(|| { + // prepare bridge config + let bridged_network = ByGenesis([6; 32]); + let bridge_hub_para_id = 1013; + let bridge_hub_location: MultiLocation = (Parent, Parachain(bridge_hub_para_id)).into(); + let target_location_from_different_consensus = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); + + let reserve_account = + LocationToAccountId::convert_ref(&target_location_from_different_consensus) + .expect("Sovereign account for reserves"); + let balance_to_transfer = 1000_u128; + let native_asset = MultiLocation::parent(); + + // open HRMP to bridge hub + mock_open_hrmp_channel::( + runtime_para_id.into(), + bridge_hub_para_id.into(), + ); + + // drip ED to account + let alice_account_init_balance = existential_deposit + balance_to_transfer.into(); + let _ = >::deposit_creating( + &alice_account, + alice_account_init_balance.clone(), + ); + // SA of target location needs to have at least ED, anyway making reserve fails + let _ = >::deposit_creating( + &reserve_account, + existential_deposit, + ); + + // we just check here, that user remains enough balances after withdraw + // and also we check if `balance_to_transfer` is more than `existential_deposit`, + assert!( + (>::free_balance(&alice_account) - + balance_to_transfer.into()) >= + existential_deposit + ); + // SA has just ED + assert_eq!( + >::free_balance(&reserve_account), + existential_deposit + ); + + // insert bridge config and target location + assert_ok!(>::add_exporter_config( + RuntimeHelper::::root_origin(), + bridged_network, + Box::new(bridge_hub_location.into_versioned()), + None, + )); + assert_ok!(>::update_bridged_target_location( + RuntimeHelper::::root_origin(), + bridged_network, + Box::new(target_location_from_different_consensus.into_versioned()), + Some(Box::new(target_location_fee.clone().into())), + )); + assert_ok!( + >::allow_reserve_asset_transfer_for( + RuntimeHelper::::root_origin(), + bridged_network, + Box::new(target_location_from_different_consensus.into_versioned()), + AssetFilterOf::::ByMultiLocation(MultiLocationFilter { + equals_any: BoundedVec::truncate_from(vec![native_asset.into_versioned()]), + starts_with_any: Default::default(), + }), + ) + ); + + // local native asset (pallet_balances) + let assets = MultiAssets::from(MultiAsset { + fun: Fungible(balance_to_transfer.into()), + id: Concrete(native_asset), + }); + + // destination is (some) account from different consensus + let target_destination_account = target_location_from_different_consensus + .clone() + .appended_with(AccountId32 { + network: Some(bridged_network), + id: sp_runtime::AccountId32::new([3; 32]).into(), + }) + .unwrap(); + + // trigger asset transfer + assert_ok!(>::transfer_asset_via_bridge( + RuntimeHelper::::origin_of(alice_account.clone()), + Box::new(VersionedMultiAssets::from(assets.clone())), + Box::new(VersionedMultiLocation::from(target_destination_account.clone())), + )); + + // check alice account decreased + assert_eq!( + >::free_balance(&alice_account), + alice_account_init_balance - balance_to_transfer.into() + ); + // check reserve account increased + assert_eq!( + >::free_balance(&reserve_account), + existential_deposit + balance_to_transfer.into() + ); + + // check events + let mut bridge_transfer_events = >::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())); + assert!(bridge_transfer_events.any(|r| matches!( + r, + pallet_bridge_transfer::Event::ReserveAssetsDeposited { .. } + ))); + let transfer_initiated_event = bridge_transfer_events.find_map(|e| match e { + pallet_bridge_transfer::Event::TransferInitiated { + message_id, + forwarded_message_id, + sender_cost, + } => Some((message_id, forwarded_message_id, sender_cost)), + _ => None, + }); + assert!(transfer_initiated_event.is_some()); + let (message_id, forwarded_message_id, sender_cost) = transfer_initiated_event.unwrap(); + // we expect UnpaidRemoteExporter + assert!(sender_cost.is_none()); + + // check that xcm was sent + let xcm_sent_message_hash = >::events() + .into_iter() + .filter_map(|e| unwrap_xcmp_queue_event(e.event.encode())) + .find_map(|e| match e { + cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => + Some(message_hash), + _ => None, + }); + + // read xcm + let xcm_sent = + RuntimeHelper::::take_xcm(bridge_hub_para_id.into()).unwrap(); + println!("xcm_sent: {:?}", xcm_sent); + assert_eq!( + xcm_sent_message_hash, + Some(xcm_sent.using_encoded(sp_io::hashing::blake2_256)) + ); + let mut xcm_sent: Xcm<()> = xcm_sent.try_into().expect("versioned xcm"); + + // check sent XCM ExportMessage to bridge-hub + assert!(xcm_sent + .0 + .matcher() + .match_next_inst(|instr| match instr { + // first instruction is UNpai (because we have explicit unpaid execution on bridge-hub now) + UnpaidExecution { weight_limit, check_origin } + if weight_limit == &Unlimited && check_origin.is_none() => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains UnpaidExecution") + .match_next_inst(|instr| match instr { + // second instruction is ExportMessage + ExportMessage { network, destination, xcm: inner_xcm } => { + assert_eq!(network, &bridged_network); + let (_, target_location_junctions_without_global_consensus) = + target_location_from_different_consensus + .interior + .clone() + .split_global() + .expect("split works"); + assert_eq!( + destination, + &target_location_junctions_without_global_consensus + ); + + let mut reanchored_assets = assets.clone(); + reanchored_assets + .reanchor( + &target_location_from_different_consensus, + XcmConfig::UniversalLocation::get(), + ) + .expect("reanchored assets"); + let mut reanchored_destination_account = target_destination_account.clone(); + reanchored_destination_account + .reanchor( + &target_location_from_different_consensus, + XcmConfig::UniversalLocation::get(), + ) + .expect("reanchored destination account"); + let universal_location_as_sovereign_account_on_target = + ::UniversalLocation::get() + .invert_target(&target_location_from_different_consensus) + .expect("invert_target Universal Location"); + + // match inner xcm + assert!(inner_xcm + .0 + .matcher() + .match_next_inst(|next_instr| match next_instr { + WithdrawAsset(fees) + if fees == &MultiAssets::from(target_location_fee.clone()) => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains WithdrawAsset") + .match_next_inst(|next_instr| match next_instr { + BuyExecution { ref fees, ref weight_limit } + if fees == &target_location_fee && + weight_limit == &Unlimited => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains BuyExecution") + .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { + ReserveAssetDeposited(ref deposited) + if deposited.eq(&reanchored_assets) => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains ReserveAssetDeposited") + .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { + DepositAsset { assets: filter, ref beneficiary } + if filter == + &MultiAssetFilter::from(reanchored_assets.clone()) && + beneficiary.eq(&reanchored_destination_account) => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains DepositAsset") + .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { + RefundSurplus => Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains RefundSurplus") + .match_next_inst(|inner_xcm_instr| { + match inner_xcm_instr { + DepositAsset { assets: filter, ref beneficiary } + if filter == + &MultiAssetFilter::from( + target_location_fee.clone(), + ) && beneficiary.eq( + &universal_location_as_sovereign_account_on_target, + ) => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + } + }) + .expect("contains DepositAsset") + .match_next_inst(|instr| match instr { + SetTopic(ref topic) if topic.eq(&message_id) => Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains SetTopic") + .assert_remaining_insts(0) + .is_ok()); + Ok(()) + }, + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains ExportMessage") + .match_next_inst(|instr| match instr { + SetTopic(ref topic) if topic.eq(&forwarded_message_id) => Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains SetTopic") + .assert_remaining_insts(0) + .is_ok()); + }) +} + +/// Test-case makes sure that `Runtime` can initiate transfer of assets via bridge - `TransferKind::WithdrawReserve` +pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_works< + Runtime, + XcmConfig, + HrmpChannelOpener, + HrmpChannelSource, + LocationToAccountId, + ForeignAssetsPalletInstance, +>( + collator_session_keys: CollatorSessionKeys, + existential_deposit: BalanceOf, + alice_account: AccountIdOf, + unwrap_pallet_bridge_transfer_event: Box< + dyn Fn(Vec) -> Option>, + >, + unwrap_xcmp_queue_event: Box< + dyn Fn(Vec) -> Option>, + >, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + pallet_assets::Config + + pallet_bridge_transfer::Config + + cumulus_pallet_xcmp_queue::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + ::Balance: From + Into, + XcmConfig: xcm_executor::Config, + LocationToAccountId: Convert>, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + <::Lookup as StaticLookup>::Source: + From<::AccountId>, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + HrmpChannelSource: XcmpMessageSource, + >::AssetId: + From + Into, + >::AssetIdParameter: + From + Into, + >::Balance: + From + Into, + ForeignAssetsPalletInstance: 'static, +{ + let runtime_para_id = 1000; + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_tracing() + .with_safe_xcm_version(3) + .with_para_id(runtime_para_id.into()) + .build() + .execute_with(|| { + // prepare bridge config + let bridged_network = ByGenesis([6; 32]); + let bridge_hub_para_id = 1013; + let bridge_hub_location: MultiLocation = (Parent, Parachain(bridge_hub_para_id)).into(); + let target_location_from_different_consensus = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); + let foreign_asset_id_multilocation = + MultiLocation::new(2, X1(GlobalConsensus(bridged_network))); + + let reserve_account = + LocationToAccountId::convert_ref(&target_location_from_different_consensus) + .expect("Sovereign account for reserves"); + let balance_to_transfer = 1000_u128; + let asset_minimum_asset_balance = 1_000_000_u128; + + // open HRMP to bridge hub + mock_open_hrmp_channel::( + runtime_para_id.into(), + bridge_hub_para_id.into(), + ); + + // drip ED to account + let _ = >::deposit_creating( + &alice_account, + existential_deposit, + ); + // SA of target location needs to have at least ED, anyway making reserve fails + let _ = >::deposit_creating( + &reserve_account, + existential_deposit, + ); + + // user already received native tokens from bridged chain, which are stored in `ForeignAssets` + { + //1. create foreign asset + assert_ok!( + >::force_create( + RuntimeHelper::::root_origin(), + foreign_asset_id_multilocation.clone().into(), + reserve_account.clone().into(), + false, + asset_minimum_asset_balance.into() + ) + ); + + // 2. drip asset to alice + assert_ok!(>::mint( + RuntimeHelper::::origin_of(reserve_account.clone()), + foreign_asset_id_multilocation.clone().into(), + alice_account.clone().into(), + (asset_minimum_asset_balance + balance_to_transfer).into() + )); + } + + assert_eq!( + >::free_balance(&alice_account), + existential_deposit + ); + assert_eq!( + >::free_balance(&reserve_account), + existential_deposit + ); + assert_eq!( + >::balance( + foreign_asset_id_multilocation.clone().into(), + alice_account.clone() + ), + (asset_minimum_asset_balance + balance_to_transfer).into() + ); + + // insert bridge config + assert_ok!(>::add_exporter_config( + RuntimeHelper::::root_origin(), + bridged_network, + Box::new(bridge_hub_location.into_versioned()), + None, + )); + assert_ok!(>::update_bridged_target_location( + RuntimeHelper::::root_origin(), + bridged_network, + Box::new(target_location_from_different_consensus.into_versioned()), + Some(Box::new(target_location_fee.clone().into())) + )); + assert_ok!(>::add_reserve_location( + RuntimeHelper::::root_origin(), + Box::new(target_location_from_different_consensus.into_versioned()), + AssetFilterOf::::All, + )); + + // lets withdraw previously reserve asset deposited from `ForeignAssets` + let assets = MultiAssets::from(MultiAsset { + fun: Fungible(balance_to_transfer.into()), + id: Concrete(foreign_asset_id_multilocation), + }); + + // destination is (some) account from different consensus + let target_destination_account = target_location_from_different_consensus + .clone() + .appended_with(AccountId32 { + network: Some(bridged_network), + id: sp_runtime::AccountId32::new([3; 32]).into(), + }) + .unwrap(); + + // trigger asset transfer + assert_ok!(>::transfer_asset_via_bridge( + RuntimeHelper::::origin_of(alice_account.clone()), + Box::new(VersionedMultiAssets::from(assets.clone())), + Box::new(VersionedMultiLocation::from(target_destination_account.clone())), + )); + + // check alice account (balances not changed) + assert_eq!( + >::free_balance(&alice_account), + existential_deposit + ); + // check reserve account (balances not changed) + assert_eq!( + >::free_balance(&reserve_account), + existential_deposit + ); + // `ForeignAssets` for alice account is decressed + assert_eq!( + >::balance( + foreign_asset_id_multilocation.clone().into(), + alice_account.clone() + ), + asset_minimum_asset_balance.into() + ); + + // check events + let mut bridge_transfer_events = >::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())); + assert!(bridge_transfer_events + .any(|r| matches!(r, pallet_bridge_transfer::Event::AssetsWithdrawn { .. }))); + let transfer_initiated_event = bridge_transfer_events.find_map(|e| match e { + pallet_bridge_transfer::Event::TransferInitiated { + message_id, + forwarded_message_id, + sender_cost, + } => Some((message_id, forwarded_message_id, sender_cost)), + _ => None, + }); + assert!(transfer_initiated_event.is_some()); + let (message_id, forwarded_message_id, sender_cost) = transfer_initiated_event.unwrap(); + // we expect UnpaidRemoteExporter + assert!(sender_cost.is_none()); + + // check that xcm was sent + let xcm_sent_message_hash = >::events() + .into_iter() + .filter_map(|e| unwrap_xcmp_queue_event(e.event.encode())) + .find_map(|e| match e { + cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => + Some(message_hash), + _ => None, + }); + + // read xcm + let xcm_sent = + RuntimeHelper::::take_xcm(bridge_hub_para_id.into()).unwrap(); + println!("xcm_sent: {:?}", xcm_sent); + assert_eq!( + xcm_sent_message_hash, + Some(xcm_sent.using_encoded(sp_io::hashing::blake2_256)) + ); + let mut xcm_sent: Xcm<()> = xcm_sent.try_into().expect("versioned xcm"); + + // check sent XCM ExportMessage to bridge-hub + assert!(xcm_sent + .0 + .matcher() + .match_next_inst(|instr| match instr { + // first instruction is UNpai (because we have explicit unpaid execution on bridge-hub now) + UnpaidExecution { weight_limit, check_origin } + if weight_limit == &Unlimited && check_origin.is_none() => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains UnpaidExecution") + .match_next_inst(|instr| match instr { + // second instruction is ExportMessage + ExportMessage { network, destination, xcm: inner_xcm } => { + assert_eq!(network, &bridged_network); + let (_, target_location_junctions_without_global_consensus) = + target_location_from_different_consensus + .interior + .clone() + .split_global() + .expect("split works"); + assert_eq!( + destination, + &target_location_junctions_without_global_consensus + ); + + let mut reanchored_assets = assets.clone(); + reanchored_assets + .reanchor( + &target_location_from_different_consensus, + XcmConfig::UniversalLocation::get(), + ) + .expect("reanchored assets"); + let mut reanchored_destination_account = target_destination_account.clone(); + reanchored_destination_account + .reanchor( + &target_location_from_different_consensus, + XcmConfig::UniversalLocation::get(), + ) + .expect("reanchored destination account"); + let universal_location_as_sovereign_account_on_target = + ::UniversalLocation::get() + .invert_target(&target_location_from_different_consensus) + .expect("invert_target Universal Location"); + + // match inner xcm + assert!(inner_xcm + .0 + .matcher() + .match_next_inst(|next_instr| match next_instr { + WithdrawAsset(fees) + if fees == &MultiAssets::from(target_location_fee.clone()) => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains WithdrawAsset") + .match_next_inst(|next_instr| match next_instr { + BuyExecution { ref fees, ref weight_limit } + if fees == &target_location_fee && + weight_limit == &Unlimited => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains BuyExecution") + .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { + WithdrawAsset(ref deposited) + if deposited.eq(&reanchored_assets) => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains WithdrawAsset") + .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { + DepositAsset { assets: filter, ref beneficiary } + if filter == + &MultiAssetFilter::from(reanchored_assets.clone()) && + beneficiary.eq(&reanchored_destination_account) => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains DepositAsset") + .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { + RefundSurplus => Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains RefundSurplus") + .match_next_inst(|inner_xcm_instr| { + match inner_xcm_instr { + DepositAsset { assets: filter, ref beneficiary } + if filter == + &MultiAssetFilter::from( + target_location_fee.clone(), + ) && beneficiary.eq( + &universal_location_as_sovereign_account_on_target, + ) => + Ok(()), + _ => Err(ProcessMessageError::BadFormat), + } + }) + .expect("contains DepositAsset") + .match_next_inst(|instr| match instr { + SetTopic(ref topic) if topic.eq(&message_id) => Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains SetTopic") + .assert_remaining_insts(0) + .is_ok()); + Ok(()) + }, + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains ExportMessage") + .match_next_inst(|instr| match instr { + SetTopic(ref topic) if topic.eq(&forwarded_message_id) => Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("contains SetTopic") + .assert_remaining_insts(0) + .is_ok()); + }) +} + +/// Test-case makes sure that `Runtime` can process `ReserveAssetDeposited`. +pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_works< + Runtime, + XcmConfig, + LocationToAccountId, + ForeignAssetsPalletInstance, +>( + collator_session_keys: CollatorSessionKeys, + existential_deposit: BalanceOf, + target_account: AccountIdOf, + unwrap_pallet_xcm_event: Box) -> Option>>, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + cumulus_pallet_xcmp_queue::Config + + pallet_assets::Config + + pallet_bridge_transfer::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + <::Lookup as StaticLookup>::Source: + From<::AccountId>, + XcmConfig: xcm_executor::Config, + >::AssetId: + From + Into, + >::AssetIdParameter: + From + Into, + >::Balance: + From + Into, + LocationToAccountId: Convert>, + ForeignAssetsPalletInstance: 'static, +{ + let remote_network_id = ByGenesis([7; 32]); + let remote_parachain_as_origin = MultiLocation { + parents: 2, + interior: X2(GlobalConsensus(remote_network_id), Parachain(1000)), + }; + let foreign_asset_id_multilocation = + MultiLocation { parents: 2, interior: X1(GlobalConsensus(remote_network_id)) }; + let buy_execution_fee_amount = 50000000000; + let reserve_asset_deposisted = 100_000_000; + + let local_bridge_hub_multilocation = + MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; + + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_balances(vec![(target_account.clone(), existential_deposit)]) + .with_tracing() + .build() + .execute_with(|| { + // drip SA for remote global parachain origin + let remote_parachain_sovereign_account = + LocationToAccountId::convert_ref(remote_parachain_as_origin) + .expect("Sovereign account works"); + assert_ok!(>::force_set_balance( + RuntimeHelper::::root_origin(), + remote_parachain_sovereign_account.clone().into(), + existential_deposit + buy_execution_fee_amount.into(), + )); + + // setup bridge transfer configuration + // add allowed univeral alias for remote network + assert_ok!(>::add_universal_alias( + RuntimeHelper::::root_origin(), + Box::new(local_bridge_hub_multilocation.into_versioned()), + GlobalConsensus(remote_network_id) + )); + // add allowed reserve location + assert_ok!(>::add_reserve_location( + RuntimeHelper::::root_origin(), + Box::new(remote_parachain_as_origin.into_versioned()), + AssetFilterOf::::ByMultiLocation(MultiLocationFilter { + equals_any: BoundedVec::truncate_from(vec![ + foreign_asset_id_multilocation.into_versioned() + ]), + starts_with_any: Default::default(), + }) + )); + + // create foreign asset + let asset_minimum_asset_balance = 1_000_000_u128; + assert_ok!( + >::force_create( + RuntimeHelper::::root_origin(), + foreign_asset_id_multilocation.clone().into(), + remote_parachain_sovereign_account.clone().into(), + false, + asset_minimum_asset_balance.into() + ) + ); + + // we assume here that BuyExecution fee goes to staking pot + let staking_pot_account_id = >::account_id(); + let local_bridge_hub_multilocation_as_account_id = + LocationToAccountId::convert_ref(&local_bridge_hub_multilocation) + .expect("Correct AccountId"); + + // check before + let remote_parachain_sovereign_account_balance_before = + >::free_balance( + &remote_parachain_sovereign_account, + ); + assert_eq!( + remote_parachain_sovereign_account_balance_before, + existential_deposit + buy_execution_fee_amount.into() + ); + assert_eq!( + >::free_balance(&target_account), + existential_deposit + ); + assert_eq!( + >::free_balance( + &local_bridge_hub_multilocation_as_account_id + ), + 0.into() + ); + assert_eq!( + >::free_balance(&staking_pot_account_id), + 0.into() + ); + assert_eq!( + >::balance( + foreign_asset_id_multilocation.into(), + &target_account + ), + 0.into() + ); + + // xcm + let xcm = Xcm(vec![ + UniversalOrigin(GlobalConsensus(remote_network_id)), + DescendOrigin(X1(Parachain(1000))), + // buying execution as sovereign account `remote_parachain_sovereign_account` in *native asset on receiving runtime* + WithdrawAsset(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(buy_execution_fee_amount), + }])), + BuyExecution { + fees: MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(buy_execution_fee_amount), + }, + weight_limit: Unlimited, + }, + // reserve deposited - assets transferred through bridge - *native asset on sending runtime* + ReserveAssetDeposited(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(remote_network_id)), + }), + fun: Fungible(reserve_asset_deposisted), + }])), + DepositAsset { + assets: Definite(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(remote_network_id)), + }), + fun: Fungible(reserve_asset_deposisted), + }])), + beneficiary: MultiLocation { + parents: 0, + interior: X1(AccountId32 { + network: None, + id: target_account.clone().into(), + }), + }, + }, + // return unspent weight back to SA of caller + RefundSurplus, + DepositAsset { + assets: Definite(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(buy_execution_fee_amount), + }])), + beneficiary: remote_parachain_as_origin, + }, + ]); + + // origin as BridgeHub + let origin = local_bridge_hub_multilocation; + + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + + // execute xcm as XcmpQueue would do + let outcome = XcmExecutor::::execute_xcm( + origin, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + ); + assert_eq!(outcome.ensure_complete(), Ok(())); + + // check after + let staking_pot_balance = + >::free_balance(&staking_pot_account_id); + assert_eq!( + >::free_balance( + &remote_parachain_sovereign_account + ), + remote_parachain_sovereign_account_balance_before - staking_pot_balance + ); + assert_eq!( + >::free_balance(&target_account), + existential_deposit + ); + assert_eq!( + >::free_balance( + &local_bridge_hub_multilocation_as_account_id + ), + 0.into() + ); + assert_ne!( + >::free_balance(&staking_pot_account_id), + 0.into() + ); + assert_eq!( + >::balance( + foreign_asset_id_multilocation.into(), + &target_account + ), + reserve_asset_deposisted.into() + ); + + // check NO asset trap occurred + assert_eq!( + false, + >::events() + .into_iter() + .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())) + .any(|e| matches!(e, pallet_xcm::Event::AssetsTrapped { .. })) + ); + }) +} + +/// Test-case makes sure that `Runtime` can process reserve withdraw which was sent over bridge. +pub fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_works< + Runtime, + XcmConfig, + LocationToAccountId, +>( + collator_session_keys: CollatorSessionKeys, + existential_deposit: BalanceOf, + target_account: AccountIdOf, + unwrap_pallet_xcm_event: Box) -> Option>>, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + cumulus_pallet_xcmp_queue::Config + + pallet_bridge_transfer::Config, + AccountIdOf: Into<[u8; 32]>, + ValidatorIdOf: From>, + BalanceOf: From, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + <::Lookup as StaticLookup>::Source: + From<::AccountId>, + XcmConfig: xcm_executor::Config, + LocationToAccountId: Convert>, +{ + let remote_network_id = ByGenesis([7; 32]); + let remote_parachain_as_origin = MultiLocation { + parents: 2, + interior: X2(GlobalConsensus(remote_network_id), Parachain(1000)), + }; + + let buy_execution_fee_amount = 50000000000; + let reserve_asset_deposisted = 100_000_000; + + let local_bridge_hub_multilocation = + MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; + + ExtBuilder::::default() + .with_collators(collator_session_keys.collators()) + .with_session_keys(collator_session_keys.session_keys()) + .with_balances(vec![(target_account.clone(), existential_deposit)]) + .with_tracing() + .build() + .execute_with(|| { + // add reserved assets to SA for remote global parachain origin (this is how reserve was done, when reserve_asset_deposisted was transferred out) + let remote_parachain_sovereign_account = + LocationToAccountId::convert_ref(remote_parachain_as_origin) + .expect("Sovereign account works"); + assert_ok!(>::force_set_balance( + RuntimeHelper::::root_origin(), + remote_parachain_sovereign_account.clone().into(), + existential_deposit + + buy_execution_fee_amount.into() + + reserve_asset_deposisted.into(), + )); + + // setup bridge transfer configuration + // add allowed univeral alias for remote network + assert_ok!(>::add_universal_alias( + RuntimeHelper::::root_origin(), + Box::new(local_bridge_hub_multilocation.into_versioned()), + GlobalConsensus(remote_network_id) + )); + + // we assume here that BuyExecution fee goes to staking pot + let staking_pot_account_id = >::account_id(); + let local_bridge_hub_multilocation_as_account_id = + LocationToAccountId::convert_ref(&local_bridge_hub_multilocation) + .expect("Correct AccountId"); + + // check before + let remote_parachain_sovereign_account_balance_before = + >::free_balance( + &remote_parachain_sovereign_account, + ); + assert_eq!( + remote_parachain_sovereign_account_balance_before, + existential_deposit + + buy_execution_fee_amount.into() + + reserve_asset_deposisted.into() + ); + assert_eq!( + >::free_balance(&target_account), + existential_deposit + ); + assert_eq!( + >::free_balance( + &local_bridge_hub_multilocation_as_account_id + ), + 0.into() + ); + assert_eq!( + >::free_balance(&staking_pot_account_id), + 0.into() + ); + + // xcm + let xcm = Xcm(vec![ + UniversalOrigin(GlobalConsensus(remote_network_id)), + DescendOrigin(X1(Parachain(1000))), + // buying execution as sovereign account `remote_parachain_sovereign_account` in *native asset on receiving runtime* + WithdrawAsset(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(buy_execution_fee_amount), + }])), + BuyExecution { + fees: MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(buy_execution_fee_amount), + }, + weight_limit: Unlimited, + }, + // we are returning reserve deposited - assets transferred through bridge - *native asset on receiving runtime* + WithdrawAsset(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(reserve_asset_deposisted), + }])), + DepositAsset { + assets: Definite(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(reserve_asset_deposisted), + }])), + beneficiary: MultiLocation { + parents: 0, + interior: X1(AccountId32 { + network: None, + id: target_account.clone().into(), + }), + }, + }, + // return unspent weight back to SA of caller + RefundSurplus, + DepositAsset { + assets: Definite(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(buy_execution_fee_amount), + }])), + beneficiary: remote_parachain_as_origin, + }, + ]); + + // origin as BridgeHub + let origin = local_bridge_hub_multilocation; + + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + + // execute xcm as XcmpQueue would do + let outcome = XcmExecutor::::execute_xcm( + origin, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + ); + assert_eq!(outcome.ensure_complete(), Ok(())); + + // check after + let staking_pot_balance = + >::free_balance(&staking_pot_account_id); + // here SA reserve was withdrawn + assert_eq!( + >::free_balance( + &remote_parachain_sovereign_account + ), + remote_parachain_sovereign_account_balance_before - + staking_pot_balance - reserve_asset_deposisted.into() + ); + // here target_account received reserve + assert_eq!( + >::free_balance(&target_account), + existential_deposit + reserve_asset_deposisted.into() + ); + assert_eq!( + >::free_balance( + &local_bridge_hub_multilocation_as_account_id + ), + 0.into() + ); + assert_ne!( + >::free_balance(&staking_pot_account_id), + 0.into() + ); + + // check NO asset trap occurred + assert_eq!( + false, + >::events() + .into_iter() + .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())) + .any(|e| matches!(e, pallet_xcm::Event::AssetsTrapped { .. })) + ); + }) +} diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 09597cbbc47..045c567625f 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -701,14 +701,16 @@ impl pallet_bridge_transfer::Config for Runtime { type UniversalLocation = UniversalLocation; type WeightInfo = weights::pallet_bridge_transfer::WeightInfo; type AdminOrigin = AssetsForceOrigin; + type AllowReserveAssetTransferOrigin = AsEnsureOriginWithArg; type UniversalAliasesLimit = ConstU32<24>; - type ReserveLocationsLimit = ConstU32<8>; + type ReserveLocationsLimit = ConstU32<4>; + type AssetsPerReserveLocationLimit = ConstU32<128>; type AssetTransactor = AssetTransactors; + type AssetTransferKindResolver = + pallet_bridge_transfer::impls::ConfiguredConcreteAssetTransferKindResolver; type BridgeXcmSender = BridgeXcmSender; - type TransferAssetOrigin = EnsureXcmOrigin; + type AssetTransferOrigin = EnsureXcmOrigin; type MaxAssetsLimit = ConstU8<1>; - type TransferPingOrigin = EnsureXcmOrigin; - type PingMessageBuilder = pallet_bridge_transfer::UnpaidTrapMessageBuilder>; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = xcm_config::BridgeTransferBenchmarksHelper; } diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs index 23de590f2d1..caef59dc045 100644 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs @@ -102,6 +102,51 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + + fn update_bridged_target_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `5884` + // Minimum execution time: 12_859_000 picoseconds. + Weight::from_parts(19_737_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + + fn remove_bridged_target_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `5884` + // Minimum execution time: 12_859_000 picoseconds. + Weight::from_parts(19_737_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + + fn allow_reserve_asset_transfer_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `5884` + // Minimum execution time: 12_859_000 picoseconds. + Weight::from_parts(19_737_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + + fn disallow_reserve_asset_transfer_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `5884` + // Minimum execution time: 12_859_000 picoseconds. + Weight::from_parts(19_737_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) fn add_universal_alias() -> Weight { diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index ad195251f67..50199f00044 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -19,15 +19,16 @@ use super::{ RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use assets_common::matching::{ - FromSiblingParachain, IsDifferentGlobalConsensusConcreteAsset, IsForeignConcreteAsset, - StartsWith, StartsWithExplicitGlobalConsensus, + FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, }; use frame_support::{ match_types, parameter_types, traits::{ConstU32, Contains, Everything, PalletInfoAccess}, }; use frame_system::EnsureRoot; -use pallet_bridge_transfer::impls::{AllowedUniversalAliasesOf, IsAllowedReserveOf}; +use pallet_bridge_transfer::impls::{ + AllowedUniversalAliasesOf, IsTrustedBridgedReserveForConcreteAsset, +}; use pallet_xcm::XcmPassthrough; use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; use polkadot_parachain::primitives::Sibling; @@ -384,10 +385,7 @@ impl xcm_executor::Config for XcmConfig { type OriginConverter = XcmOriginToTransactDispatchOrigin; // Westmint is acting _as_ a reserve location for WND and assets created under `pallet-assets`. // For WND, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = IsAllowedReserveOf< - Runtime, - IsDifferentGlobalConsensusConcreteAsset, - >; + type IsReserve = IsTrustedBridgedReserveForConcreteAsset; // We allow: // - teleportation of WND // - teleportation of sibling parachain's assets (as ForeignCreators) diff --git a/parachains/runtimes/assets/westmint/tests/tests.rs b/parachains/runtimes/assets/westmint/tests/tests.rs index da4636be0a6..7fd3376a22f 100644 --- a/parachains/runtimes/assets/westmint/tests/tests.rs +++ b/parachains/runtimes/assets/westmint/tests/tests.rs @@ -610,9 +610,26 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p }) ); +#[test] +fn can_governance_change_bridge_transfer_in_configuration() { + asset_test_utils::test_cases_over_bridge::can_governance_change_bridge_transfer_in_configuration::< + Runtime, + XcmConfig, + >( + collator_session_keys(), + Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }), + ) +} + #[test] fn can_governance_change_bridge_transfer_out_configuration() { - asset_test_utils::test_cases::can_governance_change_bridge_transfer_out_configuration::< + asset_test_utils::test_cases_over_bridge::can_governance_change_bridge_transfer_out_configuration::< Runtime, XcmConfig, >( @@ -628,8 +645,8 @@ fn can_governance_change_bridge_transfer_out_configuration() { } #[test] -fn initiate_transfer_asset_via_bridge_for_native_asset_works() { - asset_test_utils::test_cases::initiate_transfer_asset_via_bridge_for_native_asset_works::< +fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works() { + asset_test_utils::test_cases_over_bridge::transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works::< Runtime, XcmConfig, ParachainSystem, @@ -655,25 +672,36 @@ fn initiate_transfer_asset_via_bridge_for_native_asset_works() { } #[test] -fn can_governance_change_bridge_transfer_in_configuration() { - asset_test_utils::test_cases::can_governance_change_bridge_transfer_in_configuration::< +fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_works() { + asset_test_utils::test_cases_over_bridge::transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_works::< Runtime, XcmConfig, + ParachainSystem, + XcmpQueue, + LocationToAccountId, + ForeignAssetsInstance, >( collator_session_keys(), - Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), + ExistentialDeposit::get(), + AccountId::from(ALICE), Box::new(|runtime_event_encoded: Vec| { match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), _ => None, } }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), ) } #[test] -fn receive_reserve_asset_deposited_from_different_consensus_works() { - asset_test_utils::test_cases::receive_reserve_asset_deposited_from_different_consensus_works::< +fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_works() { + asset_test_utils::test_cases_over_bridge::receive_reserve_asset_deposited_from_different_consensus_over_bridge_works::< Runtime, XcmConfig, LocationToAccountId, @@ -691,6 +719,25 @@ fn receive_reserve_asset_deposited_from_different_consensus_works() { ) } +#[test] +fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_works() { + asset_test_utils::test_cases_over_bridge::withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_works::< + Runtime, + XcmConfig, + LocationToAccountId, + >( + collator_session_keys(), + ExistentialDeposit::get(), + AccountId::from(BOB), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + ) +} + #[test] fn plain_receive_teleported_asset_works() { ExtBuilder::::default() diff --git a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs index 14792067e43..fed0c992b96 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs +++ b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs @@ -933,7 +933,7 @@ pub mod test_data { ); /// Simulates `HaulBlobExporter` and all its wrapping and captures generated plain bytes, - /// which are transfered over bridge. + /// which are transferred over bridge. pub(crate) fn simulate_message_exporter_on_bridged_chain< SourceNetwork: Get, DestinationNetwork: Get, From bb657506800297818a0a60aadd1da0258740c457 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 8 Jun 2023 10:55:42 +0200 Subject: [PATCH 283/339] One more refactor --- .../pallets/bridge-transfer/src/features.rs | 175 +++ .../pallets/bridge-transfer/src/impls.rs | 365 +++-- parachains/pallets/bridge-transfer/src/lib.rs | 1368 +---------------- .../pallets/bridge-transfer/src/tests.rs | 1080 +++++++++++++ .../runtimes/assets/statemine/src/lib.rs | 2 +- .../assets/statemine/src/xcm_config.rs | 2 +- .../test-utils/src/test_cases_over_bridge.rs | 4 +- .../runtimes/assets/westmint/src/lib.rs | 2 +- .../assets/westmint/src/xcm_config.rs | 2 +- 9 files changed, 1503 insertions(+), 1497 deletions(-) create mode 100644 parachains/pallets/bridge-transfer/src/features.rs create mode 100644 parachains/pallets/bridge-transfer/src/tests.rs diff --git a/parachains/pallets/bridge-transfer/src/features.rs b/parachains/pallets/bridge-transfer/src/features.rs new file mode 100644 index 00000000000..495d8e5fb6f --- /dev/null +++ b/parachains/pallets/bridge-transfer/src/features.rs @@ -0,0 +1,175 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{ + types::{AssetFilterT, LatestVersionedMultiLocation}, + AssetTransferKind, BridgeConfig, Config, Pallet, ResolveAssetTransferKind, UsingVersioned, + LOG_TARGET, +}; +use frame_support::traits::{Contains, ContainsPair}; +use xcm::prelude::*; +use xcm_builder::ExporterFor; + +/// `ExporterFor` implementation to check if we can transfer anything to `NetworkId` +impl ExporterFor for Pallet { + fn exporter_for( + network: &NetworkId, + _remote_location: &InteriorMultiLocation, + _message: &Xcm<()>, + ) -> Option<(MultiLocation, Option)> { + match Self::allowed_exporters(network) { + Some(BridgeConfig { bridge_location, bridge_location_fee, .. }) => { + let bridge_location = match bridge_location.to_versioned() { + Ok(versioned) => versioned, + Err(e) => { + log::warn!( + target: LOG_TARGET, + "Exporter for network: {:?} - bridge_location has error: {:?}!", + network, e + ); + return None + }, + }; + let bridge_location_fee = match bridge_location_fee { + Some(fee) => match fee.to_versioned() { + Ok(versioned) => Some(versioned), + Err(e) => { + log::warn!( + target: LOG_TARGET, + "ExporterFor network: {:?} - bridge_location_fee has error: {:?}!", + network, e + ); + return None + }, + }, + None => None, + }; + Some((bridge_location, bridge_location_fee)) + }, + None => None, + } + } +} + +/// Verifies if we have `(MultiLocation, Junction)` in allowed universal aliases. +pub struct AllowedUniversalAliasesOf(sp_std::marker::PhantomData); +impl Contains<(MultiLocation, Junction)> for AllowedUniversalAliasesOf { + fn contains((location, junction): &(MultiLocation, Junction)) -> bool { + log::trace!( + target: "xcm::contains", + "AllowedUniversalAliasesOf location: {:?}, junction: {:?}", location, junction + ); + + Pallet::::allowed_universal_aliases(LatestVersionedMultiLocation(location)) + .contains(junction) + } +} + +/// Verifies if we can allow `(MultiAsset, MultiLocation)` as trusted reserve received from "bridge". +pub struct IsTrustedBridgedReserveForConcreteAsset(sp_std::marker::PhantomData); +impl ContainsPair + for IsTrustedBridgedReserveForConcreteAsset +{ + fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + log::trace!( + target: "xcm::contains", + "IsTrustedBridgedReserve asset: {:?}, origin: {:?}", + asset, origin + ); + + let asset_location = match &asset.id { + Concrete(location) => location, + _ => return false, + }; + + let versioned_origin = LatestVersionedMultiLocation(origin); + Pallet::::allowed_reserve_locations(versioned_origin) + .map_or(false, |filter| match filter.matches(asset_location) { + Ok(result) => result, + Err(e) => { + log::error!( + target: "xcm::contains", + "IsTrustedBridgedReserveForConcreteAsset has error: {:?} for asset_location: {:?} and origin: {:?}!", + e, asset_location, origin + ); + false + }, + }) + } +} + +/// Implementation of `ResolveTransferKind` which tries to resolve all kinds of transfer according to on-chain configuration. +pub struct ConfiguredConcreteAssetTransferKindResolver(sp_std::marker::PhantomData); + +impl ResolveAssetTransferKind for ConfiguredConcreteAssetTransferKindResolver { + fn resolve(asset: &MultiAsset, target_location: &MultiLocation) -> AssetTransferKind { + log::trace!( + target: LOG_TARGET, + "ConfiguredConcreteAssetTransferKindResolver resolve asset: {:?}, target_location: {:?}", + asset, target_location + ); + + let asset_location = match &asset.id { + Concrete(location) => location, + _ => return AssetTransferKind::Unsupported, + }; + + // first, we check, if we are trying to transfer back reserve-deposited assets + // other words: if target_location is a known reserve location for asset + if IsTrustedBridgedReserveForConcreteAsset::::contains(asset, target_location) { + return AssetTransferKind::WithdrawReserve + } + + // second, we check, if target_location is allowed for requested asset to be transferred there + match target_location.interior.global_consensus() { + Ok(target_consensus) => { + if let Some(bridge_config) = Pallet::::allowed_exporters(target_consensus) { + match bridge_config.allowed_target_location_for(target_location) { + Ok(Some((_, Some(asset_filter)))) => { + match asset_filter.matches(asset_location) { + Ok(true) => return AssetTransferKind::ReserveBased, + Ok(false) => (), + Err(e) => { + log::error!( + target: LOG_TARGET, + "ConfiguredConcreteAssetTransferKindResolver `asset_filter.matches` has error: {:?} for asset_location: {:?} and target_location: {:?}!", + e, asset_location, target_location + ); + }, + } + }, + Ok(_) => (), + Err(e) => { + log::warn!( + target: LOG_TARGET, + "ConfiguredBridgeTransferKindResolver allowed_target_location_for has error: {:?} for target_location: {:?}!", + e, target_location + ); + }, + } + } + }, + Err(_) => { + log::warn!( + target: LOG_TARGET, + "ConfiguredBridgeTransferKindResolver target_location: {:?} does not contain global consensus!", + target_location + ); + }, + } + + AssetTransferKind::Unsupported + } +} diff --git a/parachains/pallets/bridge-transfer/src/impls.rs b/parachains/pallets/bridge-transfer/src/impls.rs index 495d8e5fb6f..728a6ec42c6 100644 --- a/parachains/pallets/bridge-transfer/src/impls.rs +++ b/parachains/pallets/bridge-transfer/src/impls.rs @@ -14,162 +14,257 @@ // limitations under the License. use crate::{ - types::{AssetFilterT, LatestVersionedMultiLocation}, - AssetTransferKind, BridgeConfig, Config, Pallet, ResolveAssetTransferKind, UsingVersioned, - LOG_TARGET, + pallet::AllowedExporters, AssetFilterOf, AssetTransferKind, Config, Error, Event, Pallet, + ReachableDestination, ResolveAssetTransferKind, UsingVersioned, LOG_TARGET, }; -use frame_support::traits::{Contains, ContainsPair}; +use frame_support::{pallet_prelude::Get, transactional}; +use frame_system::unique; +use sp_runtime::DispatchError; use xcm::prelude::*; -use xcm_builder::ExporterFor; - -/// `ExporterFor` implementation to check if we can transfer anything to `NetworkId` -impl ExporterFor for Pallet { - fn exporter_for( - network: &NetworkId, - _remote_location: &InteriorMultiLocation, - _message: &Xcm<()>, - ) -> Option<(MultiLocation, Option)> { - match Self::allowed_exporters(network) { - Some(BridgeConfig { bridge_location, bridge_location_fee, .. }) => { - let bridge_location = match bridge_location.to_versioned() { - Ok(versioned) => versioned, - Err(e) => { - log::warn!( - target: LOG_TARGET, - "Exporter for network: {:?} - bridge_location has error: {:?}!", - network, e - ); - return None - }, - }; - let bridge_location_fee = match bridge_location_fee { - Some(fee) => match fee.to_versioned() { - Ok(versioned) => Some(versioned), - Err(e) => { - log::warn!( - target: LOG_TARGET, - "ExporterFor network: {:?} - bridge_location_fee has error: {:?}!", - network, e - ); - return None - }, - }, - None => None, - }; - Some((bridge_location, bridge_location_fee)) +use xcm_builder::ensure_is_remote; +use xcm_executor::traits::TransactAsset; + +impl Pallet { + /// Validates destination and check if we support bridging to this remote global consensus + /// + /// Returns: correct remote location, where we should be able to bridge + pub(crate) fn ensure_reachable_remote_destination( + remote_destination: VersionedMultiLocation, + ) -> Result>, Error> { + let remote_destination: MultiLocation = remote_destination + .to_versioned() + .map_err(|_| Error::::UnsupportedXcmVersion)?; + + let devolved = ensure_is_remote(T::UniversalLocation::get(), remote_destination) + .map_err(|_| Error::::UnsupportedDestination)?; + let (remote_network, _) = devolved; + + match AllowedExporters::::get(remote_network) { + Some(bridge_config) => { + match bridge_config.allowed_target_location_for(&remote_destination) { + Ok(Some((target_location, target_location_asset_filter))) => + Ok(ReachableDestination { + bridge: bridge_config.to_bridge_location()?, + target: target_location, + target_asset_filter: target_location_asset_filter, + target_destination: remote_destination, + }), + Ok(None) => Err(Error::::UnsupportedDestination), + Err(_) => Err(Error::::UnsupportedXcmVersion), + } }, - None => None, + None => Err(Error::::UnsupportedDestination), } } -} -/// Verifies if we have `(MultiLocation, Junction)` in allowed universal aliases. -pub struct AllowedUniversalAliasesOf(sp_std::marker::PhantomData); -impl Contains<(MultiLocation, Junction)> for AllowedUniversalAliasesOf { - fn contains((location, junction): &(MultiLocation, Junction)) -> bool { - log::trace!( - target: "xcm::contains", - "AllowedUniversalAliasesOf location: {:?}, junction: {:?}", location, junction - ); + #[transactional] + pub(crate) fn do_transfer_asset_via_bridge_in_transaction( + origin_location: MultiLocation, + destination: ReachableDestination>, + assets: MultiAssets, + ) -> Result<(), DispatchError> { + // Resolve reserve account + let reserve_account = Self::resolve_reserve_account(&destination); - Pallet::::allowed_universal_aliases(LatestVersionedMultiLocation(location)) - .contains(junction) - } -} + // Target destination + let target_location = destination.target.location; + + // UniversalLocation as sovereign account location on target_location (as target_location sees UniversalLocation) + let universal_location_as_sovereign_account_on_target_location = + T::UniversalLocation::get() + .invert_target(&target_location) + .map_err(|_| Error::::InvalidConfiguration)?; -/// Verifies if we can allow `(MultiAsset, MultiLocation)` as trusted reserve received from "bridge". -pub struct IsTrustedBridgedReserveForConcreteAsset(sp_std::marker::PhantomData); -impl ContainsPair - for IsTrustedBridgedReserveForConcreteAsset -{ - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { - log::trace!( - target: "xcm::contains", - "IsTrustedBridgedReserve asset: {:?}, origin: {:?}", - asset, origin + // Prepare some XcmContext + let xcm_context = XcmContext::with_message_id(unique(reserve_account)); + + // Resolve/iterate all assets and how to transfer them + let mut reserve_assets_deposited = xcm_executor::Assets::new(); + let mut reserved_assets_for_withdrawal = xcm_executor::Assets::new(); + for asset in assets.into_inner() { + // first we need to know what kind of transfer it is + match T::AssetTransferKindResolver::resolve(&asset, &target_location) { + AssetTransferKind::ReserveBased => + // Move asset to reserve account + T::AssetTransactor::transfer_asset( + &asset, + &origin_location, + &reserve_account, + &xcm_context, + ) + .and_then(|reserved_asset| { + Self::deposit_event(Event::ReserveAssetsDeposited { + from: origin_location, + to: reserve_account, + assets: reserved_asset.clone().into(), + }); + reserve_assets_deposited.subsume_assets(reserved_asset); + Ok(()) + }) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "AssetTransactor failed to reserve assets from origin_location: {:?} to reserve_account: {:?} for assets: {:?}, error: {:?}", + origin_location, + reserve_account, + asset, + e + ); + Error::::FailedToReserve + })?, + AssetTransferKind::WithdrawReserve => { + // Just withdraw/burn asset here + T::AssetTransactor::withdraw_asset( + &asset, + &origin_location, + Some(&xcm_context), + ) + .and_then(|withdrawn_asset| { + Self::deposit_event(Event::AssetsWithdrawn { + from: origin_location, + assets: withdrawn_asset.clone().into(), + }); + reserved_assets_for_withdrawal.subsume_assets(withdrawn_asset); + Ok(()) + }) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "AssetTransactor failed to withdraw assets from origin_location: {:?} for assets: {:?}, error: {:?}", + origin_location, + asset, + e + ); + Error::::FailedToWithdraw + })? + } + AssetTransferKind::Unsupported => return Err(Error::::UnsupportedAssetTransferKind.into()), + } + } + + // Prepare xcm msg for the other side. + + // Reanchor stuff - we need to convert local asset id/MultiLocation to format that could be understood by different consensus and from their point-of-view + reserve_assets_deposited.reanchor(&target_location, T::UniversalLocation::get(), None); + reserved_assets_for_withdrawal.reanchor( + &target_location, + T::UniversalLocation::get(), + None, ); + let remote_destination_reanchored = destination.target_destination + .reanchored(&target_location, T::UniversalLocation::get()) + .map_err(|errored_dest| { + log::error!( + target: LOG_TARGET, + "Failed to reanchor remote_destination: {:?} for target_destination: {:?} and universal_location: {:?}", + errored_dest, + target_location, + T::UniversalLocation::get() + ); + Error::::InvalidRemoteDestination + })?; - let asset_location = match &asset.id { - Concrete(location) => location, - _ => return false, + // prepare xcm message + // 1. buy execution (if needed) -> (we expect UniversalLocation's sovereign account should pay) + let (mut xcm_instructions, maybe_buy_execution) = match destination.target.maybe_fee { + Some(target_location_fee) => ( + sp_std::vec![ + WithdrawAsset(target_location_fee.clone().into()), + BuyExecution { fees: target_location_fee.clone(), weight_limit: Unlimited }, + ], + Some(target_location_fee), + ), + None => ( + sp_std::vec![UnpaidExecution { check_origin: None, weight_limit: Unlimited }], + None, + ), }; - let versioned_origin = LatestVersionedMultiLocation(origin); - Pallet::::allowed_reserve_locations(versioned_origin) - .map_or(false, |filter| match filter.matches(asset_location) { - Ok(result) => result, - Err(e) => { - log::error!( - target: "xcm::contains", - "IsTrustedBridgedReserveForConcreteAsset has error: {:?} for asset_location: {:?} and origin: {:?}!", - e, asset_location, origin - ); - false + // 2. add deposit reserved asset to destination account (if any) + if !reserve_assets_deposited.is_empty() { + xcm_instructions.extend(sp_std::vec![ + ReserveAssetDeposited(reserve_assets_deposited.clone().into()), + DepositAsset { + assets: MultiAssetFilter::from(MultiAssets::from(reserve_assets_deposited)), + beneficiary: remote_destination_reanchored }, - }) + ]); + } + + // 3. add withdraw/move reserve from sovereign account to destination (if any) + if !reserved_assets_for_withdrawal.is_empty() { + xcm_instructions.extend(sp_std::vec![ + // we expect here, that origin is a sovereign account which was used as **reserve account** + WithdrawAsset(reserved_assets_for_withdrawal.clone().into()), + DepositAsset { + assets: MultiAssetFilter::from(MultiAssets::from( + reserved_assets_for_withdrawal + )), + beneficiary: remote_destination_reanchored + }, + ]); + } + + // 4. add return unspent weight/asset back to the UniversalLocation's sovereign account on target + if let Some(target_location_fee) = maybe_buy_execution { + xcm_instructions.extend(sp_std::vec![ + RefundSurplus, + DepositAsset { + assets: MultiAssetFilter::from(MultiAssets::from(target_location_fee)), + beneficiary: universal_location_as_sovereign_account_on_target_location + }, + ]); + } + + Self::initiate_bridge_transfer( + target_location, + xcm_context.message_id, + xcm_instructions.into(), + ) + .map_err(Into::into) } -} -/// Implementation of `ResolveTransferKind` which tries to resolve all kinds of transfer according to on-chain configuration. -pub struct ConfiguredConcreteAssetTransferKindResolver(sp_std::marker::PhantomData); + fn initiate_bridge_transfer( + dest: MultiLocation, + message_id: XcmHash, + mut xcm: Xcm<()>, + ) -> Result<(), Error> { + // append message_id + xcm.0.extend(sp_std::vec![SetTopic(message_id)]); -impl ResolveAssetTransferKind for ConfiguredConcreteAssetTransferKindResolver { - fn resolve(asset: &MultiAsset, target_location: &MultiLocation) -> AssetTransferKind { - log::trace!( + log::info!( target: LOG_TARGET, - "ConfiguredConcreteAssetTransferKindResolver resolve asset: {:?}, target_location: {:?}", - asset, target_location + "[T::BridgeXcmSender] send to bridge, dest: {:?}, xcm: {:?}, message_id: {:?}", + dest, + xcm, + message_id, ); - let asset_location = match &asset.id { - Concrete(location) => location, - _ => return AssetTransferKind::Unsupported, - }; - - // first, we check, if we are trying to transfer back reserve-deposited assets - // other words: if target_location is a known reserve location for asset - if IsTrustedBridgedReserveForConcreteAsset::::contains(asset, target_location) { - return AssetTransferKind::WithdrawReserve - } - - // second, we check, if target_location is allowed for requested asset to be transferred there - match target_location.interior.global_consensus() { - Ok(target_consensus) => { - if let Some(bridge_config) = Pallet::::allowed_exporters(target_consensus) { - match bridge_config.allowed_target_location_for(target_location) { - Ok(Some((_, Some(asset_filter)))) => { - match asset_filter.matches(asset_location) { - Ok(true) => return AssetTransferKind::ReserveBased, - Ok(false) => (), - Err(e) => { - log::error!( - target: LOG_TARGET, - "ConfiguredConcreteAssetTransferKindResolver `asset_filter.matches` has error: {:?} for asset_location: {:?} and target_location: {:?}!", - e, asset_location, target_location - ); - }, - } - }, - Ok(_) => (), - Err(e) => { - log::warn!( - target: LOG_TARGET, - "ConfiguredBridgeTransferKindResolver allowed_target_location_for has error: {:?} for target_location: {:?}!", - e, target_location - ); - }, - } - } - }, - Err(_) => { - log::warn!( + // call bridge + // TODO: check-parameter - should we handle `sender_cost` somehow ? + let (forwarded_message_id, sender_cost) = send_xcm::(dest, xcm) + .map_err(|e| { + log::error!( target: LOG_TARGET, - "ConfiguredBridgeTransferKindResolver target_location: {:?} does not contain global consensus!", - target_location + "[T::BridgeXcmSender] SendError occurred, error: {:?}", + e ); - }, - } + Error::::BridgeCallError + })?; + + // just fire event + Self::deposit_event(Event::TransferInitiated { + message_id, + forwarded_message_id, + sender_cost, + }); + Ok(()) + } - AssetTransferKind::Unsupported + /// Resolve (sovereign) account which will be used as reserve account + fn resolve_reserve_account( + destination: &ReachableDestination>, + ) -> MultiLocation { + destination.target.location } } diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 2fa93f64301..ee4f5da7e57 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -45,7 +45,7 @@ //! * (Used for transfer assets in) //! * Aliases can be stored on-chain in [AllowedUniversalAliases] //! * Managing bridge locations can be done with dedicated extrinsics: `add_universal_alias / remove_universal_alias` -//! * Stored aliases can be accessed by [impls::AllowedUniversalAliasesOf] and configured for e.g. `xcm_executor::Config`: +//! * Stored aliases can be accessed by [features::AllowedUniversalAliasesOf] and configured for e.g. `xcm_executor::Config`: //! ```nocompile //! impl xcm_executor::Config for XcmConfig { //! ... @@ -59,7 +59,7 @@ //! * (Used for transfer assets in) //! * Reserve locations with asset filters can be stored on-chain in [AllowedReserveLocations] //! * Managing bridge locations can be done with dedicated extrinsics: `add_reserve_location / remove_reserve_location` -//! * Stored reserve locations can be accessed by [impls::IsTrustedBridgedReserveForConcreteAsset] and configured for e.g. `xcm_executor::Config`: +//! * Stored reserve locations can be accessed by [features::IsTrustedBridgedReserveForConcreteAsset] and configured for e.g. `xcm_executor::Config`: //! ```nocompile //! impl xcm_executor::Config for XcmConfig { //! ... @@ -71,19 +71,22 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -use frame_support::{transactional, BoundedBTreeSet}; use sp_std::boxed::Box; mod types; pub use types::*; pub use pallet::*; -use xcm::prelude::*; + +pub mod features; +mod impls; +pub mod weights; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; -pub mod impls; -pub mod weights; + +#[cfg(test)] +mod tests; /// The log target of this pallet. pub const LOG_TARGET: &str = "runtime::bridge-transfer"; @@ -94,9 +97,9 @@ pub mod pallet { use super::*; use crate::filter::{AssetFilter, AssetFilterOf, MultiLocationFilterOf}; - use frame_support::{pallet_prelude::*, traits::EnsureOriginWithArg}; - use frame_system::{pallet_prelude::*, unique}; - use xcm_builder::ensure_is_remote; + use frame_support::{pallet_prelude::*, traits::EnsureOriginWithArg, BoundedBTreeSet}; + use frame_system::pallet_prelude::*; + use xcm::prelude::*; use xcm_executor::traits::TransactAsset; #[pallet::pallet] @@ -612,1352 +615,5 @@ pub mod pallet { } } } - - impl Pallet { - /// Validates destination and check if we support bridging to this remote global consensus - /// - /// Returns: correct remote location, where we should be able to bridge - pub(crate) fn ensure_reachable_remote_destination( - remote_destination: VersionedMultiLocation, - ) -> Result>, Error> { - let remote_destination: MultiLocation = remote_destination - .to_versioned() - .map_err(|_| Error::::UnsupportedXcmVersion)?; - - let devolved = ensure_is_remote(T::UniversalLocation::get(), remote_destination) - .map_err(|_| Error::::UnsupportedDestination)?; - let (remote_network, _) = devolved; - - match AllowedExporters::::get(remote_network) { - Some(bridge_config) => { - match bridge_config.allowed_target_location_for(&remote_destination) { - Ok(Some((target_location, target_location_asset_filter))) => - Ok(ReachableDestination { - bridge: bridge_config.to_bridge_location()?, - target: target_location, - target_asset_filter: target_location_asset_filter, - target_destination: remote_destination, - }), - Ok(None) => Err(Error::::UnsupportedDestination), - Err(_) => Err(Error::::UnsupportedXcmVersion), - } - }, - None => Err(Error::::UnsupportedDestination), - } - } - - #[transactional] - fn do_transfer_asset_via_bridge_in_transaction( - origin_location: MultiLocation, - destination: ReachableDestination>, - assets: MultiAssets, - ) -> Result<(), DispatchError> { - // Resolve reserve account - let reserve_account = Self::resolve_reserve_account(&destination); - - // Target destination - let target_location = destination.target.location; - - // UniversalLocation as sovereign account location on target_location (as target_location sees UniversalLocation) - let universal_location_as_sovereign_account_on_target_location = - T::UniversalLocation::get() - .invert_target(&target_location) - .map_err(|_| Error::::InvalidConfiguration)?; - - // Prepare some XcmContext - let xcm_context = XcmContext::with_message_id(unique(reserve_account)); - - // Resolve/iterate all assets and how to transfer them - let mut reserve_assets_deposited = xcm_executor::Assets::new(); - let mut reserved_assets_for_withdrawal = xcm_executor::Assets::new(); - for asset in assets.into_inner() { - // first we need to know what kind of transfer it is - match T::AssetTransferKindResolver::resolve(&asset, &target_location) { - AssetTransferKind::ReserveBased => - // Move asset to reserve account - T::AssetTransactor::transfer_asset( - &asset, - &origin_location, - &reserve_account, - &xcm_context, - ) - .and_then(|reserved_asset| { - Self::deposit_event(Event::ReserveAssetsDeposited { - from: origin_location, - to: reserve_account, - assets: reserved_asset.clone().into(), - }); - reserve_assets_deposited.subsume_assets(reserved_asset); - Ok(()) - }) - .map_err(|e| { - log::error!( - target: LOG_TARGET, - "AssetTransactor failed to reserve assets from origin_location: {:?} to reserve_account: {:?} for assets: {:?}, error: {:?}", - origin_location, - reserve_account, - asset, - e - ); - Error::::FailedToReserve - })?, - AssetTransferKind::WithdrawReserve => { - // Just withdraw/burn asset here - T::AssetTransactor::withdraw_asset( - &asset, - &origin_location, - Some(&xcm_context), - ) - .and_then(|withdrawn_asset| { - Self::deposit_event(Event::AssetsWithdrawn { - from: origin_location, - assets: withdrawn_asset.clone().into(), - }); - reserved_assets_for_withdrawal.subsume_assets(withdrawn_asset); - Ok(()) - }) - .map_err(|e| { - log::error!( - target: LOG_TARGET, - "AssetTransactor failed to withdraw assets from origin_location: {:?} for assets: {:?}, error: {:?}", - origin_location, - asset, - e - ); - Error::::FailedToWithdraw - })? - } - AssetTransferKind::Unsupported => return Err(Error::::UnsupportedAssetTransferKind.into()), - } - } - - // Prepare xcm msg for the other side. - - // Reanchor stuff - we need to convert local asset id/MultiLocation to format that could be understood by different consensus and from their point-of-view - reserve_assets_deposited.reanchor(&target_location, T::UniversalLocation::get(), None); - reserved_assets_for_withdrawal.reanchor( - &target_location, - T::UniversalLocation::get(), - None, - ); - let remote_destination_reanchored = destination.target_destination - .reanchored(&target_location, T::UniversalLocation::get()) - .map_err(|errored_dest| { - log::error!( - target: LOG_TARGET, - "Failed to reanchor remote_destination: {:?} for target_destination: {:?} and universal_location: {:?}", - errored_dest, - target_location, - T::UniversalLocation::get() - ); - Error::::InvalidRemoteDestination - })?; - - // prepare xcm message - // 1. buy execution (if needed) -> (we expect UniversalLocation's sovereign account should pay) - let (mut xcm_instructions, maybe_buy_execution) = match destination.target.maybe_fee { - Some(target_location_fee) => ( - sp_std::vec![ - WithdrawAsset(target_location_fee.clone().into()), - BuyExecution { fees: target_location_fee.clone(), weight_limit: Unlimited }, - ], - Some(target_location_fee), - ), - None => ( - sp_std::vec![UnpaidExecution { check_origin: None, weight_limit: Unlimited }], - None, - ), - }; - - // 2. add deposit reserved asset to destination account (if any) - if !reserve_assets_deposited.is_empty() { - xcm_instructions.extend(sp_std::vec![ - ReserveAssetDeposited(reserve_assets_deposited.clone().into()), - DepositAsset { - assets: MultiAssetFilter::from(MultiAssets::from(reserve_assets_deposited)), - beneficiary: remote_destination_reanchored - }, - ]); - } - - // 3. add withdraw/move reserve from sovereign account to destination (if any) - if !reserved_assets_for_withdrawal.is_empty() { - xcm_instructions.extend(sp_std::vec![ - // we expect here, that origin is a sovereign account which was used as **reserve account** - WithdrawAsset(reserved_assets_for_withdrawal.clone().into()), - DepositAsset { - assets: MultiAssetFilter::from(MultiAssets::from( - reserved_assets_for_withdrawal - )), - beneficiary: remote_destination_reanchored - }, - ]); - } - - // 4. add return unspent weight/asset back to the UniversalLocation's sovereign account on target - if let Some(target_location_fee) = maybe_buy_execution { - xcm_instructions.extend(sp_std::vec![ - RefundSurplus, - DepositAsset { - assets: MultiAssetFilter::from(MultiAssets::from(target_location_fee)), - beneficiary: universal_location_as_sovereign_account_on_target_location - }, - ]); - } - - Self::initiate_bridge_transfer( - target_location, - xcm_context.message_id, - xcm_instructions.into(), - ) - .map_err(Into::into) - } - - fn initiate_bridge_transfer( - dest: MultiLocation, - message_id: XcmHash, - mut xcm: Xcm<()>, - ) -> Result<(), Error> { - // append message_id - xcm.0.extend(sp_std::vec![SetTopic(message_id)]); - - log::info!( - target: LOG_TARGET, - "[T::BridgeXcmSender] send to bridge, dest: {:?}, xcm: {:?}, message_id: {:?}", - dest, - xcm, - message_id, - ); - - // call bridge - // TODO: check-parameter - should we handle `sender_cost` somehow ? - let (forwarded_message_id, sender_cost) = send_xcm::(dest, xcm) - .map_err(|e| { - log::error!( - target: LOG_TARGET, - "[T::BridgeXcmSender] SendError occurred, error: {:?}", - e - ); - Error::::BridgeCallError - })?; - - // just fire event - Self::deposit_event(Event::TransferInitiated { - message_id, - forwarded_message_id, - sender_cost, - }); - Ok(()) - } - - /// Resolve (sovereign) account which will be used as reserve account - fn resolve_reserve_account( - destination: &ReachableDestination>, - ) -> MultiLocation { - destination.target.location - } - } } -#[cfg(test)] -pub(crate) mod tests { - use super::*; - use crate as bridge_transfer; - use frame_support::traits::{ - AsEnsureOriginWithArg, ConstU32, Contains, ContainsPair, Currency, - }; - - use crate::{ - filter::{AssetFilter, MultiLocationFilter}, - impls::{ - AllowedUniversalAliasesOf, ConfiguredConcreteAssetTransferKindResolver, - IsTrustedBridgedReserveForConcreteAsset, - }, - }; - use frame_support::{ - assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, - BoundedVec, - }; - use frame_system::EnsureRoot; - use polkadot_parachain::primitives::Sibling; - use sp_runtime::{ - testing::{Header, H256}, - traits::{BlakeTwo256, IdentityLookup}, - AccountId32, ModuleError, - }; - use sp_version::RuntimeVersion; - use xcm_builder::{ - AccountId32Aliases, CurrencyAdapter, EnsureXcmOrigin, ExporterFor, - GlobalConsensusParachainConvertsFor, IsConcrete, SiblingParachainConvertsVia, - SignedToAccountId32, UnpaidRemoteExporter, - }; - use xcm_executor::traits::Convert; - - type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; - type Block = frame_system::mocking::MockBlock; - - frame_support::construct_runtime!( - pub enum TestRuntime where - Block = Block, - NodeBlock = Block, - UncheckedExtrinsic = UncheckedExtrinsic, - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - BridgeTransfer: bridge_transfer::{Pallet, Call, Event} = 52, - } - ); - - parameter_types! { - pub const BlockHashCount: u64 = 250; - pub Version: RuntimeVersion = RuntimeVersion { - spec_name: sp_version::create_runtime_str!("test"), - impl_name: sp_version::create_runtime_str!("system-test"), - authoring_version: 1, - spec_version: 1, - impl_version: 1, - apis: sp_version::create_apis_vec!([]), - transaction_version: 1, - state_version: 1, - }; - } - - pub type AccountId = AccountId32; - - impl frame_system::Config for TestRuntime { - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Index = u64; - type BlockNumber = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type Header = Header; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type BlockLength = (); - type BlockWeights = (); - type Version = Version; - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; - } - - parameter_types! { - pub const ExistentialDeposit: u64 = 5; - pub const MaxReserves: u32 = 50; - } - - impl pallet_balances::Config for TestRuntime { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; - } - - parameter_types! { - pub const BridgedNetwork: NetworkId = NetworkId::ByGenesis([4; 32]); - pub const RelayNetwork: NetworkId = NetworkId::ByGenesis([9; 32]); - pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(1000)); - // Relay chain currency/balance location (e.g. KsmLocation, DotLocation, ..) - pub const RelayLocation: MultiLocation = MultiLocation::parent(); - } - - std::thread_local! { - static ROUTED_MESSAGE: std::cell::RefCell>> = std::cell::RefCell::new(None); - } - - pub struct ThreadLocalXcmRouter; - impl SendXcm for ThreadLocalXcmRouter { - type Ticket = Option>; - - fn validate( - destination: &mut Option, - message: &mut Option>, - ) -> SendResult { - log::info!( - target: super::LOG_TARGET, - "[ThreadLocalXcmRouter]: destination: {:?}, message: {:?}", - destination, - message - ); - Ok((message.take(), MultiAssets::default())) - } - - fn deliver(ticket: Self::Ticket) -> Result { - match ticket { - Some(msg) => { - ROUTED_MESSAGE.with(|rm| *rm.borrow_mut() = Some(msg)); - Ok([0u8; 32]) - }, - None => Err(SendError::MissingArgument), - } - } - } - - pub struct NotApplicableOrFailOnParachain2222XcmRouter; - impl SendXcm for NotApplicableOrFailOnParachain2222XcmRouter { - type Ticket = Option>; - - fn validate( - destination: &mut Option, - message: &mut Option>, - ) -> SendResult { - log::info!( - target: super::LOG_TARGET, - "[NotApplicableOrFailOnParachain2222XcmRouter]: destination: {:?}, message: {:?}", - destination, - message - ); - if matches!( - destination, - Some(MultiLocation { - interior: X1(Parachain(Self::UNROUTABLE_PARA_ID)), - parents: 1 - }) - ) { - Err(SendError::Transport("Simulate what ever error")) - } else { - Err(SendError::NotApplicable) - } - } - - fn deliver(ticket: Self::Ticket) -> Result { - unimplemented!("We should not come here, ticket: {:?}", ticket) - } - } - - impl NotApplicableOrFailOnParachain2222XcmRouter { - const UNROUTABLE_PARA_ID: u32 = 2222; - } - - pub type XcmRouter = (NotApplicableOrFailOnParachain2222XcmRouter, ThreadLocalXcmRouter); - - /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus - pub type TestBridgeXcmSender = - UnpaidRemoteExporter; - - /// No local origins on this chain are allowed to dispatch XCM sends/executions. - pub type LocalOriginToLocation = SignedToAccountId32; - - pub type LocationToAccountId = ( - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, - // Different global consensus parachain sovereign account. - // (Used for over-bridge transfers and reserve processing) - GlobalConsensusParachainConvertsFor, - ); - - /// Means for transacting the native currency on this chain. - pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports of `Balances`. - (), - >; - - /// Benchmarks helper. - #[cfg(feature = "runtime-benchmarks")] - pub struct TestBenchmarkHelper; - - #[cfg(feature = "runtime-benchmarks")] - impl BenchmarkHelper for TestBenchmarkHelper { - fn bridge_config() -> (NetworkId, BridgeConfig) { - test_bridge_config() - } - - fn prepare_asset_transfer() -> (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation) - { - let assets_count = MaxAssetsLimit::get(); - - // sender account must have enough funds - let sender_account = account(1); - let total_deposit = ExistentialDeposit::get() * (1 + assets_count as u64); - let _ = Balances::deposit_creating(&sender_account, total_deposit); - - // finally - prepare assets and destination - let assets = VersionedMultiAssets::V3( - std::iter::repeat(MultiAsset { - fun: Fungible(ExistentialDeposit::get().into()), - id: Concrete(RelayLocation::get()), - }) - .take(assets_count as usize) - .collect::>() - .into(), - ); - let destination = VersionedMultiLocation::V3(MultiLocation::new( - 2, - X3(GlobalConsensus(Wococo), Parachain(1000), consensus_account(Wococo, 2)), - )); - - (RuntimeOrigin::signed(sender_account), assets, destination) - } - } - - parameter_types! { - pub const TrapCode: u64 = 12345; - pub const MaxAssetsLimit: u8 = 1; - } - - impl Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type UniversalLocation = UniversalLocation; - type WeightInfo = (); - type AdminOrigin = EnsureRoot; - type AllowReserveAssetTransferOrigin = AsEnsureOriginWithArg>; - type UniversalAliasesLimit = ConstU32<2>; - type ReserveLocationsLimit = ConstU32<2>; - type AssetsPerReserveLocationLimit = ConstU32<2>; - type AssetTransactor = CurrencyTransactor; - type AssetTransferKindResolver = ConfiguredConcreteAssetTransferKindResolver; - type BridgeXcmSender = TestBridgeXcmSender; - type AssetTransferOrigin = EnsureXcmOrigin; - type MaxAssetsLimit = MaxAssetsLimit; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = TestBenchmarkHelper; - } - - pub(crate) fn new_test_ext() -> sp_io::TestExternalities { - sp_tracing::try_init_simple(); - let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); - - // with 0 block_number events dont work - let mut ext = sp_io::TestExternalities::new(t); - ext.execute_with(|| { - frame_system::Pallet::::set_block_number(1u32.into()); - }); - - ext - } - - fn account(account: u8) -> AccountId32 { - AccountId32::new([account; 32]) - } - - fn consensus_account(network: NetworkId, account: u8) -> Junction { - xcm::prelude::AccountId32 { - network: Some(network), - id: AccountId32::new([account; 32]).into(), - } - } - - #[test] - fn test_ensure_reachable_remote_destination() { - new_test_ext().execute_with(|| { - // insert exporter config + allowed target location - let bridged_network = BridgedNetwork::get(); - let bridge_location = MultiLocation::new(1, X1(Parachain(1013))); - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(bridge_location.clone().into_versioned()), - None, - )); - let target_location: MultiLocation = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); - assert_ok!(BridgeTransfer::update_bridged_target_location( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - Some(Box::new(target_location_fee.clone().into())), - )); - - // v2 not supported - assert_eq!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V2( - xcm::v2::MultiLocation::default() - )), - Err(Error::::UnsupportedDestination) - ); - - // v3 - "parent: 0" wrong - assert_eq!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(0, X2(GlobalConsensus(bridged_network), Parachain(1000))) - )), - Err(Error::::UnsupportedDestination) - ); - // v3 - "parent: 1" wrong - assert_eq!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(1, X2(GlobalConsensus(bridged_network), Parachain(1000))) - )), - Err(Error::::UnsupportedDestination) - ); - - // v3 - Rococo is not supported - assert_eq!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))) - )), - Err(Error::::UnsupportedDestination) - ); - - // v3 - remote_destination is not allowed - assert_eq!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1234))) - )), - Err(Error::::UnsupportedDestination) - ); - - // v3 - ok (allowed) - assert_ok!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new( - 2, - X3( - GlobalConsensus(bridged_network), - Parachain(1000), - consensus_account(bridged_network, 35) - ) - ), - )), - ReachableDestination { - bridge: MaybePaidLocation { location: bridge_location, maybe_fee: None }, - target: MaybePaidLocation { - location: MultiLocation::new( - 2, - X2(GlobalConsensus(bridged_network), Parachain(1000)) - ), - maybe_fee: Some(target_location_fee), - }, - target_asset_filter: None, - target_destination: MultiLocation::new( - 2, - X3( - GlobalConsensus(bridged_network), - Parachain(1000), - consensus_account(bridged_network, 35) - ) - ), - } - ); - }) - } - - #[test] - fn test_transfer_asset_via_bridge_for_currency_works() { - new_test_ext().execute_with(|| { - // initialize some Balances for user_account - let user_account = account(1); - let user_account_init_balance = 1000_u64; - let _ = Balances::deposit_creating(&user_account, user_account_init_balance); - let user_free_balance = Balances::free_balance(&user_account); - let balance_to_transfer = 15_u64; - assert!((user_free_balance - balance_to_transfer) >= ExistentialDeposit::get()); - // because, sovereign account needs to have ED otherwise reserve fails - assert!(balance_to_transfer >= ExistentialDeposit::get()); - - // insert bridge config - let bridged_network = BridgedNetwork::get(); - let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(bridge_location.into_versioned()), - None, - )); - // insert allowed reserve asset and allow all - let target_location: MultiLocation = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - assert_ok!(BridgeTransfer::update_bridged_target_location( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - None, - )); - assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::All, - )); - - // checks before - assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); - assert_eq!(Balances::free_balance(&user_account), user_account_init_balance); - let reserve_account = LocationToAccountId::convert_ref(target_location) - .expect("converted target_location as accountId"); - assert_eq!(Balances::free_balance(&reserve_account), 0); - - // trigger transfer_asset_via_bridge - should trigger new ROUTED_MESSAGE - let asset = MultiAsset { - fun: Fungible(balance_to_transfer.into()), - id: Concrete(RelayLocation::get()), - }; - let assets = Box::new(VersionedMultiAssets::from(MultiAssets::from(asset))); - - // destination is account from different consensus - let destination = Box::new(VersionedMultiLocation::from(MultiLocation::new( - 2, - X3( - GlobalConsensus(bridged_network), - Parachain(1000), - consensus_account(bridged_network, 2), - ), - ))); - - // trigger asset transfer - assert_ok!(BridgeTransfer::transfer_asset_via_bridge( - RuntimeOrigin::signed(account(1)), - assets, - destination, - )); - - // check user account decressed - assert_eq!( - Balances::free_balance(&user_account), - user_account_init_balance - balance_to_transfer - ); - // check reserve account increased - assert_eq!(Balances::free_balance(&reserve_account), 15); - - // check events - let events = System::events(); - assert!(!events.is_empty()); - - // check reserve asset deposited event - assert!(System::events().iter().any(|r| matches!( - r.event, - RuntimeEvent::BridgeTransfer(Event::ReserveAssetsDeposited { .. }) - ))); - assert!(System::events().iter().any(|r| matches!( - r.event, - RuntimeEvent::BridgeTransfer(Event::TransferInitiated { .. }) - ))); - - // check fired XCM ExportMessage to bridge-hub - let fired_xcm = - ROUTED_MESSAGE.with(|r| r.take().expect("xcm::ExportMessage should be here")); - - if let Some(ExportMessage { xcm, .. }) = fired_xcm.0.iter().find(|instr| { - matches!( - instr, - ExportMessage { - network, - destination: X1(Parachain(1000)), - .. - } if network == &bridged_network - ) - }) { - assert!(xcm.0.iter().any(|instr| matches!(instr, UnpaidExecution { .. }))); - assert!(xcm.0.iter().any(|instr| matches!(instr, ReserveAssetDeposited(..)))); - assert!(xcm.0.iter().any(|instr| matches!(instr, DepositAsset { .. }))); - assert!(xcm.0.iter().any(|instr| matches!(instr, SetTopic { .. }))); - } else { - assert!(false, "Does not contains [`ExportMessage`], fired_xcm: {:?}", fired_xcm); - } - }); - } - - #[test] - fn test_transfer_asset_via_bridge_in_case_of_error_transactional_works() { - new_test_ext().execute_with(|| { - // initialize some Balances for user_account - let user_account = account(1); - let user_account_init_balance = 1000_u64; - let _ = Balances::deposit_creating(&user_account, user_account_init_balance); - let user_free_balance = Balances::free_balance(&user_account); - let balance_to_transfer = 15_u64; - assert!((user_free_balance - balance_to_transfer) >= ExistentialDeposit::get()); - // because, sovereign account needs to have ED otherwise reserve fails - assert!(balance_to_transfer >= ExistentialDeposit::get()); - - // insert bridge config (with unroutable bridge_location - 2222) - let bridged_network = BridgedNetwork::get(); - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new( - MultiLocation::new( - 1, - Parachain(NotApplicableOrFailOnParachain2222XcmRouter::UNROUTABLE_PARA_ID) - ) - .into_versioned() - ), - None, - )); - let target_location = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - assert_ok!(BridgeTransfer::update_bridged_target_location( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - None, - )); - assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.into_versioned()), - AssetFilter::All, - )); - - // checks before - assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); - let user_balance_before = Balances::free_balance(&user_account); - assert_eq!(user_balance_before, user_account_init_balance); - let reserve_account = LocationToAccountId::convert_ref(target_location) - .expect("converted target_location as accountId"); - let reserve_account_before = Balances::free_balance(&reserve_account); - assert_eq!(reserve_account_before, 0); - - // trigger transfer_asset_via_bridge - should trigger new ROUTED_MESSAGE - let asset = MultiAsset { - fun: Fungible(balance_to_transfer.into()), - id: Concrete(RelayLocation::get()), - }; - let assets = Box::new(VersionedMultiAssets::from(MultiAssets::from(asset))); - - // destination is account from different consensus - let destination = Box::new(VersionedMultiLocation::from(MultiLocation::new( - 2, - X3( - GlobalConsensus(bridged_network), - Parachain(1000), - consensus_account(bridged_network, 2), - ), - ))); - - // reset events - System::reset_events(); - - // trigger asset transfer - assert_noop!( - BridgeTransfer::transfer_asset_via_bridge( - RuntimeOrigin::signed(account(1)), - assets, - destination - ), - DispatchError::Module(ModuleError { - index: 52, - error: [9, 0, 0, 0], - message: Some("BridgeCallError") - }) - ); - - // checks after - // balances are untouched - assert_eq!(Balances::free_balance(&user_account), user_balance_before); - assert_eq!(Balances::free_balance(&reserve_account), reserve_account_before); - // no xcm messages fired - assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); - // check events (no events because of rollback) - assert!(System::events().is_empty()); - }); - } - - #[test] - fn allowed_exporters_management_works() { - let bridged_network = BridgedNetwork::get(); - let bridge_location = MultiLocation::new(1, X1(Parachain(1013))); - let dummy_xcm = Xcm(vec![]); - let dummy_remote_interior_multilocation = X1(Parachain(1234)); - - new_test_ext().execute_with(|| { - assert_eq!(AllowedExporters::::iter().count(), 0); - - // should fail - just root is allowed - assert_noop!( - BridgeTransfer::add_exporter_config( - RuntimeOrigin::signed(account(1)), - bridged_network, - Box::new(bridge_location.clone().into_versioned()), - None - ), - DispatchError::BadOrigin - ); - - // should fail - we expect local bridge - assert_noop!( - BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(MultiLocation::new(2, X1(Parachain(1234))).into_versioned()), - None - ), - DispatchError::Module(ModuleError { - index: 52, - error: [0, 0, 0, 0], - message: Some("InvalidConfiguration") - }) - ); - assert_eq!(AllowedExporters::::iter().count(), 0); - assert_eq!( - BridgeTransfer::exporter_for( - &bridged_network, - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - None - ); - - // add with root - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(bridge_location.clone().into_versioned()), - None - )); - assert_eq!(AllowedExporters::::iter().count(), 1); - assert_eq!( - AllowedExporters::::get(bridged_network), - Some(BridgeConfig { - bridge_location: VersionedMultiLocation::from(bridge_location), - bridge_location_fee: None, - allowed_target_locations: Default::default(), - }) - ); - assert_eq!(AllowedExporters::::get(&RelayNetwork::get()), None); - assert_eq!( - BridgeTransfer::exporter_for( - &bridged_network, - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - Some((bridge_location.clone(), None)) - ); - assert_eq!( - BridgeTransfer::exporter_for( - &RelayNetwork::get(), - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - None - ); - - // update fee - // remove - assert_ok!(BridgeTransfer::update_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Some(VersionedMultiAsset::V3((Parent, 200u128).into()).into()), - )); - assert_eq!(AllowedExporters::::iter().count(), 1); - assert_eq!( - AllowedExporters::::get(bridged_network), - Some(BridgeConfig { - bridge_location: VersionedMultiLocation::from(bridge_location), - bridge_location_fee: Some((Parent, 200u128).into()), - allowed_target_locations: Default::default(), - }) - ); - assert_eq!( - BridgeTransfer::exporter_for( - &bridged_network, - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - Some((bridge_location, Some((Parent, 200u128).into()))) - ); - - // remove - assert_ok!(BridgeTransfer::remove_exporter_config( - RuntimeOrigin::root(), - bridged_network, - )); - assert_eq!(AllowedExporters::::get(bridged_network), None); - assert_eq!(AllowedExporters::::iter().count(), 0); - }) - } - - #[test] - fn allowed_universal_aliases_management_works() { - new_test_ext().execute_with(|| { - assert_eq!(AllowedUniversalAliases::::iter().count(), 0); - - let location1 = MultiLocation::new(1, X1(Parachain(1014))); - let junction1 = GlobalConsensus(ByGenesis([1; 32])); - let junction2 = GlobalConsensus(ByGenesis([2; 32])); - - // should fail - just root is allowed - assert_noop!( - BridgeTransfer::add_universal_alias( - RuntimeOrigin::signed(account(1)), - Box::new(VersionedMultiLocation::V3(location1.clone())), - junction1.clone(), - ), - DispatchError::BadOrigin - ); - assert_eq!(AllowedUniversalAliases::::iter().count(), 0); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - - // add ok - assert_ok!(BridgeTransfer::add_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - junction1.clone(), - )); - assert_ok!(BridgeTransfer::add_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - junction2.clone(), - )); - assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - assert_eq!(AllowedUniversalAliases::::iter().count(), 1); - - // remove ok - assert_ok!(BridgeTransfer::remove_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - vec![junction1.clone()], - )); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - assert_eq!(AllowedUniversalAliases::::iter().count(), 1); - - assert_ok!(BridgeTransfer::remove_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - vec![junction2.clone()], - )); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - assert_eq!(AllowedUniversalAliases::::iter().count(), 0); - }) - } - - #[test] - fn allowed_reserve_locations_management_works() { - new_test_ext().execute_with(|| { - assert_eq!(0, AllowedReserveLocations::::iter_values().count()); - - let location1 = MultiLocation::new(1, X1(Parachain(1014))); - let location1_as_latest = VersionedMultiLocation::from(location1.clone()); - let location1_as_latest_as_key = - LatestVersionedMultiLocation::try_from(&location1_as_latest).expect("ok"); - let location2 = - MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([1; 32])), Parachain(1014))); - let location2_as_latest = VersionedMultiLocation::from(location2.clone()); - let location2_as_key = - LatestVersionedMultiLocation::try_from(&location2_as_latest).expect("ok"); - - let asset_location = MultiLocation::parent(); - let asset: MultiAsset = (asset_location, 200u128).into(); - - let asset_filter_for_asset_by_multilocation = MultiLocationFilter { - equals_any: BoundedVec::truncate_from(vec![asset_location.into_versioned()]), - starts_with_any: Default::default(), - }; - let asset_filter_for_asset = - AssetFilter::ByMultiLocation(asset_filter_for_asset_by_multilocation.clone()); - let asset_filter_for_other_by_multilocation = MultiLocationFilter { - equals_any: BoundedVec::truncate_from(vec![ - MultiLocation::new(3, Here).into_versioned() - ]), - starts_with_any: Default::default(), - }; - let asset_filter_for_other = - AssetFilter::ByMultiLocation(asset_filter_for_other_by_multilocation.clone()); - - // should fail - just root is allowed - assert_noop!( - BridgeTransfer::add_reserve_location( - RuntimeOrigin::signed(account(1)), - Box::new(location1_as_latest.clone()), - asset_filter_for_asset.clone(), - ), - DispatchError::BadOrigin - ); - assert!( - AllowedReserveLocations::::get(&location1_as_latest_as_key).is_none() - ); - assert!(AllowedReserveLocations::::get(&location2_as_key).is_none()); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset, &location1 - ), - AssetTransferKind::Unsupported - ); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset, &location2 - ), - AssetTransferKind::Unsupported - ); - - // add ok - assert_ok!(BridgeTransfer::add_reserve_location( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - asset_filter_for_asset.clone() - )); - assert_ok!(BridgeTransfer::add_reserve_location( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location2.clone())), - asset_filter_for_other.clone() - )); - assert_eq!(2, AllowedReserveLocations::::iter_values().count()); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset, &location1 - ), - AssetTransferKind::WithdrawReserve - ); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset, &location2 - ), - AssetTransferKind::Unsupported - ); - - assert_ok!(BridgeTransfer::add_reserve_location( - RuntimeOrigin::root(), - Box::new(location2_as_latest.clone()), - asset_filter_for_asset.clone() - )); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset, &location2 - ), - AssetTransferKind::WithdrawReserve - ); - - // test remove - assert_noop!( - BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location1_as_latest.clone()), - Some(asset_filter_for_other_by_multilocation.clone()) - ), - DispatchError::Module(ModuleError { - index: 52, - error: [0, 0, 0, 0], - message: Some("UnavailableConfiguration") - }) - ); - - assert_ok!(BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location1_as_latest.clone()), - Some(asset_filter_for_asset_by_multilocation.clone()) - )); - assert_eq!(1, AllowedReserveLocations::::iter_values().count()); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset, &location1 - ), - AssetTransferKind::Unsupported - ); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset, &location2 - ), - AssetTransferKind::WithdrawReserve - ); - - assert_ok!(BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location2_as_latest.clone()), - Some(asset_filter_for_other_by_multilocation.clone()) - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset, &location1 - ), - AssetTransferKind::Unsupported - ); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset, &location2 - ), - AssetTransferKind::WithdrawReserve - ); - - assert_ok!(BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location2_as_latest), - Some(asset_filter_for_asset_by_multilocation) - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset, &location1 - ), - AssetTransferKind::Unsupported - ); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset, &location2 - ), - AssetTransferKind::Unsupported - ); - }) - } - - #[test] - fn allowed_bridged_target_location_management_works() { - new_test_ext().execute_with(|| { - assert_eq!(0, AllowedExporters::::iter_values().count()); - - let bridged_network = BridgedNetwork::get(); - let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); - let target_location: MultiLocation = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - - // should fail - we need BridgeConfig first - assert_noop!( - BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::All, - ), - DispatchError::Module(ModuleError { - index: 52, - error: [2, 0, 0, 0], - message: Some("UnavailableConfiguration") - }) - ); - - // add bridge config - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(bridge_location.into_versioned()), - None, - )); - - // should fail - we need also target_location first - assert_noop!( - BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::All, - ), - DispatchError::Module(ModuleError { - index: 52, - error: [1, 0, 0, 0], - message: Some("InvalidBridgeConfiguration") - }) - ); - - // insert allowed target location - assert_ok!(BridgeTransfer::update_bridged_target_location( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - None, - )); - - let asset1_location = MultiLocation::new(2, X2(Parachain(1235), Parachain(5678))); - let asset1 = MultiAsset::from((asset1_location, 1000)); - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset1, - &target_location - ), - AssetTransferKind::Unsupported - ); - - // now should pass - add one start_with pattern - assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::ByMultiLocation(MultiLocationFilter { - equals_any: Default::default(), - starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( - 2, - X1(Parachain(2223)) - ) - .into_versioned()]), - }), - )); - - // not allowed yet - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset1, - &target_location - ), - AssetTransferKind::Unsupported - ); - - // now should pass - add another start_with pattern - assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::ByMultiLocation(MultiLocationFilter { - equals_any: Default::default(), - starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( - 2, - X1(Parachain(1235)) - ) - .into_versioned()]), - }), - )); - - // ok - assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset1, - &target_location - ), - AssetTransferKind::ReserveBased - ); - }) - } -} diff --git a/parachains/pallets/bridge-transfer/src/tests.rs b/parachains/pallets/bridge-transfer/src/tests.rs new file mode 100644 index 00000000000..bde52abf836 --- /dev/null +++ b/parachains/pallets/bridge-transfer/src/tests.rs @@ -0,0 +1,1080 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate as bridge_transfer; +use frame_support::traits::{AsEnsureOriginWithArg, ConstU32, Contains, ContainsPair, Currency}; + +use crate::{ + features::{ + AllowedUniversalAliasesOf, ConfiguredConcreteAssetTransferKindResolver, + IsTrustedBridgedReserveForConcreteAsset, + }, + filter::{AssetFilter, MultiLocationFilter}, + pallet::{AllowedReserveLocations, AllowedUniversalAliases}, + AllowedExporters, AssetTransferKind, BridgeConfig, Config, Error, Event, + LatestVersionedMultiLocation, MaybePaidLocation, ReachableDestination, + ResolveAssetTransferKind, +}; +use frame_support::{ + assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, BoundedVec, +}; +use frame_system::EnsureRoot; +use polkadot_parachain::primitives::Sibling; +use sp_runtime::{ + testing::{Header, H256}, + traits::{BlakeTwo256, IdentityLookup}, + AccountId32, ModuleError, +}; +use sp_version::RuntimeVersion; +use xcm::prelude::*; +use xcm_builder::{ + AccountId32Aliases, CurrencyAdapter, EnsureXcmOrigin, ExporterFor, + GlobalConsensusParachainConvertsFor, IsConcrete, SiblingParachainConvertsVia, + SignedToAccountId32, UnpaidRemoteExporter, +}; +use xcm_executor::traits::Convert; + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +frame_support::construct_runtime!( + pub enum TestRuntime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + BridgeTransfer: bridge_transfer::{Pallet, Call, Event} = 52, + } +); + +parameter_types! { + pub const BlockHashCount: u64 = 250; + pub Version: RuntimeVersion = RuntimeVersion { + spec_name: sp_version::create_runtime_str!("test"), + impl_name: sp_version::create_runtime_str!("system-test"), + authoring_version: 1, + spec_version: 1, + impl_version: 1, + apis: sp_version::create_apis_vec!([]), + transaction_version: 1, + state_version: 1, + }; +} + +pub type AccountId = AccountId32; + +impl frame_system::Config for TestRuntime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockLength = (); + type BlockWeights = (); + type Version = Version; + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = frame_support::traits::Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +parameter_types! { + pub const ExistentialDeposit: u64 = 5; + pub const MaxReserves: u32 = 50; +} + +impl pallet_balances::Config for TestRuntime { + type Balance = u64; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxLocks = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; + type RuntimeHoldReason = RuntimeHoldReason; + type FreezeIdentifier = (); + type MaxHolds = ConstU32<0>; + type MaxFreezes = ConstU32<0>; +} + +parameter_types! { + pub const BridgedNetwork: NetworkId = NetworkId::ByGenesis([4; 32]); + pub const RelayNetwork: NetworkId = NetworkId::ByGenesis([9; 32]); + pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(1000)); + // Relay chain currency/balance location (e.g. KsmLocation, DotLocation, ..) + pub const RelayLocation: MultiLocation = MultiLocation::parent(); +} + +std::thread_local! { + static ROUTED_MESSAGE: std::cell::RefCell>> = std::cell::RefCell::new(None); +} + +pub struct ThreadLocalXcmRouter; +impl SendXcm for ThreadLocalXcmRouter { + type Ticket = Option>; + + fn validate( + destination: &mut Option, + message: &mut Option>, + ) -> SendResult { + log::info!( + target: super::LOG_TARGET, + "[ThreadLocalXcmRouter]: destination: {:?}, message: {:?}", + destination, + message + ); + Ok((message.take(), MultiAssets::default())) + } + + fn deliver(ticket: Self::Ticket) -> Result { + match ticket { + Some(msg) => { + ROUTED_MESSAGE.with(|rm| *rm.borrow_mut() = Some(msg)); + Ok([0u8; 32]) + }, + None => Err(SendError::MissingArgument), + } + } +} + +pub struct NotApplicableOrFailOnParachain2222XcmRouter; +impl SendXcm for NotApplicableOrFailOnParachain2222XcmRouter { + type Ticket = Option>; + + fn validate( + destination: &mut Option, + message: &mut Option>, + ) -> SendResult { + log::info!( + target: super::LOG_TARGET, + "[NotApplicableOrFailOnParachain2222XcmRouter]: destination: {:?}, message: {:?}", + destination, + message + ); + if matches!( + destination, + Some(MultiLocation { interior: X1(Parachain(Self::UNROUTABLE_PARA_ID)), parents: 1 }) + ) { + Err(SendError::Transport("Simulate what ever error")) + } else { + Err(SendError::NotApplicable) + } + } + + fn deliver(ticket: Self::Ticket) -> Result { + unimplemented!("We should not come here, ticket: {:?}", ticket) + } +} + +impl NotApplicableOrFailOnParachain2222XcmRouter { + const UNROUTABLE_PARA_ID: u32 = 2222; +} + +pub type XcmRouter = (NotApplicableOrFailOnParachain2222XcmRouter, ThreadLocalXcmRouter); + +/// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus +pub type TestBridgeXcmSender = UnpaidRemoteExporter; + +/// No local origins on this chain are allowed to dispatch XCM sends/executions. +pub type LocalOriginToLocation = SignedToAccountId32; + +pub type LocationToAccountId = ( + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, + // Different global consensus parachain sovereign account. + // (Used for over-bridge transfers and reserve processing) + GlobalConsensusParachainConvertsFor, +); + +/// Means for transacting the native currency on this chain. +pub type CurrencyTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports of `Balances`. + (), +>; + +/// Benchmarks helper. +#[cfg(feature = "runtime-benchmarks")] +pub struct TestBenchmarkHelper; + +#[cfg(feature = "runtime-benchmarks")] +impl BenchmarkHelper for TestBenchmarkHelper { + fn bridge_config() -> (NetworkId, BridgeConfig) { + test_bridge_config() + } + + fn prepare_asset_transfer() -> (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation) { + let assets_count = MaxAssetsLimit::get(); + + // sender account must have enough funds + let sender_account = account(1); + let total_deposit = ExistentialDeposit::get() * (1 + assets_count as u64); + let _ = Balances::deposit_creating(&sender_account, total_deposit); + + // finally - prepare assets and destination + let assets = VersionedMultiAssets::V3( + std::iter::repeat(MultiAsset { + fun: Fungible(ExistentialDeposit::get().into()), + id: Concrete(RelayLocation::get()), + }) + .take(assets_count as usize) + .collect::>() + .into(), + ); + let destination = VersionedMultiLocation::V3(MultiLocation::new( + 2, + X3(GlobalConsensus(Wococo), Parachain(1000), consensus_account(Wococo, 2)), + )); + + (RuntimeOrigin::signed(sender_account), assets, destination) + } +} + +parameter_types! { + pub const TrapCode: u64 = 12345; + pub const MaxAssetsLimit: u8 = 1; +} + +impl Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type UniversalLocation = UniversalLocation; + type WeightInfo = (); + type AdminOrigin = EnsureRoot; + type AllowReserveAssetTransferOrigin = AsEnsureOriginWithArg>; + type UniversalAliasesLimit = ConstU32<2>; + type ReserveLocationsLimit = ConstU32<2>; + type AssetsPerReserveLocationLimit = ConstU32<2>; + type AssetTransactor = CurrencyTransactor; + type AssetTransferKindResolver = ConfiguredConcreteAssetTransferKindResolver; + type BridgeXcmSender = TestBridgeXcmSender; + type AssetTransferOrigin = EnsureXcmOrigin; + type MaxAssetsLimit = MaxAssetsLimit; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = TestBenchmarkHelper; +} + +pub(crate) fn new_test_ext() -> sp_io::TestExternalities { + sp_tracing::try_init_simple(); + let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + + // with 0 block_number events dont work + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + frame_system::Pallet::::set_block_number(1u32.into()); + }); + + ext +} + +fn account(account: u8) -> AccountId32 { + AccountId32::new([account; 32]) +} + +fn consensus_account(network: NetworkId, account: u8) -> Junction { + xcm::prelude::AccountId32 { network: Some(network), id: AccountId32::new([account; 32]).into() } +} + +#[test] +fn test_ensure_reachable_remote_destination() { + new_test_ext().execute_with(|| { + // insert exporter config + allowed target location + let bridged_network = BridgedNetwork::get(); + let bridge_location = MultiLocation::new(1, X1(Parachain(1013))); + assert_ok!(BridgeTransfer::add_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Box::new(bridge_location.clone().into_versioned()), + None, + )); + let target_location: MultiLocation = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); + assert_ok!(BridgeTransfer::update_bridged_target_location( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + Some(Box::new(target_location_fee.clone().into())), + )); + + // v2 not supported + assert_eq!( + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V2( + xcm::v2::MultiLocation::default() + )), + Err(Error::::UnsupportedDestination) + ); + + // v3 - "parent: 0" wrong + assert_eq!( + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(0, X2(GlobalConsensus(bridged_network), Parachain(1000))) + )), + Err(Error::::UnsupportedDestination) + ); + // v3 - "parent: 1" wrong + assert_eq!( + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(1, X2(GlobalConsensus(bridged_network), Parachain(1000))) + )), + Err(Error::::UnsupportedDestination) + ); + + // v3 - Rococo is not supported + assert_eq!( + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))) + )), + Err(Error::::UnsupportedDestination) + ); + + // v3 - remote_destination is not allowed + assert_eq!( + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1234))) + )), + Err(Error::::UnsupportedDestination) + ); + + // v3 - ok (allowed) + assert_ok!( + BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( + MultiLocation::new( + 2, + X3( + GlobalConsensus(bridged_network), + Parachain(1000), + consensus_account(bridged_network, 35) + ) + ), + )), + ReachableDestination { + bridge: MaybePaidLocation { location: bridge_location, maybe_fee: None }, + target: MaybePaidLocation { + location: MultiLocation::new( + 2, + X2(GlobalConsensus(bridged_network), Parachain(1000)) + ), + maybe_fee: Some(target_location_fee), + }, + target_asset_filter: None, + target_destination: MultiLocation::new( + 2, + X3( + GlobalConsensus(bridged_network), + Parachain(1000), + consensus_account(bridged_network, 35) + ) + ), + } + ); + }) +} + +#[test] +fn test_transfer_asset_via_bridge_for_currency_works() { + new_test_ext().execute_with(|| { + // initialize some Balances for user_account + let user_account = account(1); + let user_account_init_balance = 1000_u64; + let _ = Balances::deposit_creating(&user_account, user_account_init_balance); + let user_free_balance = Balances::free_balance(&user_account); + let balance_to_transfer = 15_u64; + assert!((user_free_balance - balance_to_transfer) >= ExistentialDeposit::get()); + // because, sovereign account needs to have ED otherwise reserve fails + assert!(balance_to_transfer >= ExistentialDeposit::get()); + + // insert bridge config + let bridged_network = BridgedNetwork::get(); + let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); + assert_ok!(BridgeTransfer::add_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Box::new(bridge_location.into_versioned()), + None, + )); + // insert allowed reserve asset and allow all + let target_location: MultiLocation = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + assert_ok!(BridgeTransfer::update_bridged_target_location( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + None, + )); + assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::All, + )); + + // checks before + assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); + assert_eq!(Balances::free_balance(&user_account), user_account_init_balance); + let reserve_account = LocationToAccountId::convert_ref(target_location) + .expect("converted target_location as accountId"); + assert_eq!(Balances::free_balance(&reserve_account), 0); + + // trigger transfer_asset_via_bridge - should trigger new ROUTED_MESSAGE + let asset = MultiAsset { + fun: Fungible(balance_to_transfer.into()), + id: Concrete(RelayLocation::get()), + }; + let assets = Box::new(VersionedMultiAssets::from(MultiAssets::from(asset))); + + // destination is account from different consensus + let destination = Box::new(VersionedMultiLocation::from(MultiLocation::new( + 2, + X3( + GlobalConsensus(bridged_network), + Parachain(1000), + consensus_account(bridged_network, 2), + ), + ))); + + // trigger asset transfer + assert_ok!(BridgeTransfer::transfer_asset_via_bridge( + RuntimeOrigin::signed(account(1)), + assets, + destination, + )); + + // check user account decressed + assert_eq!( + Balances::free_balance(&user_account), + user_account_init_balance - balance_to_transfer + ); + // check reserve account increased + assert_eq!(Balances::free_balance(&reserve_account), 15); + + // check events + let events = System::events(); + assert!(!events.is_empty()); + + // check reserve asset deposited event + assert!(System::events().iter().any(|r| matches!( + r.event, + RuntimeEvent::BridgeTransfer(Event::ReserveAssetsDeposited { .. }) + ))); + assert!(System::events().iter().any(|r| matches!( + r.event, + RuntimeEvent::BridgeTransfer(Event::TransferInitiated { .. }) + ))); + + // check fired XCM ExportMessage to bridge-hub + let fired_xcm = + ROUTED_MESSAGE.with(|r| r.take().expect("xcm::ExportMessage should be here")); + + if let Some(ExportMessage { xcm, .. }) = fired_xcm.0.iter().find(|instr| { + matches!( + instr, + ExportMessage { + network, + destination: X1(Parachain(1000)), + .. + } if network == &bridged_network + ) + }) { + assert!(xcm.0.iter().any(|instr| matches!(instr, UnpaidExecution { .. }))); + assert!(xcm.0.iter().any(|instr| matches!(instr, ReserveAssetDeposited(..)))); + assert!(xcm.0.iter().any(|instr| matches!(instr, DepositAsset { .. }))); + assert!(xcm.0.iter().any(|instr| matches!(instr, SetTopic { .. }))); + } else { + assert!(false, "Does not contains [`ExportMessage`], fired_xcm: {:?}", fired_xcm); + } + }); +} + +#[test] +fn test_transfer_asset_via_bridge_in_case_of_error_transactional_works() { + new_test_ext().execute_with(|| { + // initialize some Balances for user_account + let user_account = account(1); + let user_account_init_balance = 1000_u64; + let _ = Balances::deposit_creating(&user_account, user_account_init_balance); + let user_free_balance = Balances::free_balance(&user_account); + let balance_to_transfer = 15_u64; + assert!((user_free_balance - balance_to_transfer) >= ExistentialDeposit::get()); + // because, sovereign account needs to have ED otherwise reserve fails + assert!(balance_to_transfer >= ExistentialDeposit::get()); + + // insert bridge config (with unroutable bridge_location - 2222) + let bridged_network = BridgedNetwork::get(); + assert_ok!(BridgeTransfer::add_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Box::new( + MultiLocation::new( + 1, + Parachain(NotApplicableOrFailOnParachain2222XcmRouter::UNROUTABLE_PARA_ID) + ) + .into_versioned() + ), + None, + )); + let target_location = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + assert_ok!(BridgeTransfer::update_bridged_target_location( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + None, + )); + assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.into_versioned()), + AssetFilter::All, + )); + + // checks before + assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); + let user_balance_before = Balances::free_balance(&user_account); + assert_eq!(user_balance_before, user_account_init_balance); + let reserve_account = LocationToAccountId::convert_ref(target_location) + .expect("converted target_location as accountId"); + let reserve_account_before = Balances::free_balance(&reserve_account); + assert_eq!(reserve_account_before, 0); + + // trigger transfer_asset_via_bridge - should trigger new ROUTED_MESSAGE + let asset = MultiAsset { + fun: Fungible(balance_to_transfer.into()), + id: Concrete(RelayLocation::get()), + }; + let assets = Box::new(VersionedMultiAssets::from(MultiAssets::from(asset))); + + // destination is account from different consensus + let destination = Box::new(VersionedMultiLocation::from(MultiLocation::new( + 2, + X3( + GlobalConsensus(bridged_network), + Parachain(1000), + consensus_account(bridged_network, 2), + ), + ))); + + // reset events + System::reset_events(); + + // trigger asset transfer + assert_noop!( + BridgeTransfer::transfer_asset_via_bridge( + RuntimeOrigin::signed(account(1)), + assets, + destination + ), + DispatchError::Module(ModuleError { + index: 52, + error: [9, 0, 0, 0], + message: Some("BridgeCallError") + }) + ); + + // checks after + // balances are untouched + assert_eq!(Balances::free_balance(&user_account), user_balance_before); + assert_eq!(Balances::free_balance(&reserve_account), reserve_account_before); + // no xcm messages fired + assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); + // check events (no events because of rollback) + assert!(System::events().is_empty()); + }); +} + +#[test] +fn allowed_exporters_management_works() { + let bridged_network = BridgedNetwork::get(); + let bridge_location = MultiLocation::new(1, X1(Parachain(1013))); + let dummy_xcm = Xcm(vec![]); + let dummy_remote_interior_multilocation = X1(Parachain(1234)); + + new_test_ext().execute_with(|| { + assert_eq!(AllowedExporters::::iter().count(), 0); + + // should fail - just root is allowed + assert_noop!( + BridgeTransfer::add_exporter_config( + RuntimeOrigin::signed(account(1)), + bridged_network, + Box::new(bridge_location.clone().into_versioned()), + None + ), + DispatchError::BadOrigin + ); + + // should fail - we expect local bridge + assert_noop!( + BridgeTransfer::add_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Box::new(MultiLocation::new(2, X1(Parachain(1234))).into_versioned()), + None + ), + DispatchError::Module(ModuleError { + index: 52, + error: [0, 0, 0, 0], + message: Some("InvalidConfiguration") + }) + ); + assert_eq!(AllowedExporters::::iter().count(), 0); + assert_eq!( + BridgeTransfer::exporter_for( + &bridged_network, + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + None + ); + + // add with root + assert_ok!(BridgeTransfer::add_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Box::new(bridge_location.clone().into_versioned()), + None + )); + assert_eq!(AllowedExporters::::iter().count(), 1); + assert_eq!( + AllowedExporters::::get(bridged_network), + Some(BridgeConfig { + bridge_location: VersionedMultiLocation::from(bridge_location), + bridge_location_fee: None, + allowed_target_locations: Default::default(), + }) + ); + assert_eq!(AllowedExporters::::get(&RelayNetwork::get()), None); + assert_eq!( + BridgeTransfer::exporter_for( + &bridged_network, + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + Some((bridge_location.clone(), None)) + ); + assert_eq!( + BridgeTransfer::exporter_for( + &RelayNetwork::get(), + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + None + ); + + // update fee + // remove + assert_ok!(BridgeTransfer::update_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Some(VersionedMultiAsset::V3((Parent, 200u128).into()).into()), + )); + assert_eq!(AllowedExporters::::iter().count(), 1); + assert_eq!( + AllowedExporters::::get(bridged_network), + Some(BridgeConfig { + bridge_location: VersionedMultiLocation::from(bridge_location), + bridge_location_fee: Some((Parent, 200u128).into()), + allowed_target_locations: Default::default(), + }) + ); + assert_eq!( + BridgeTransfer::exporter_for( + &bridged_network, + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + Some((bridge_location, Some((Parent, 200u128).into()))) + ); + + // remove + assert_ok!(BridgeTransfer::remove_exporter_config(RuntimeOrigin::root(), bridged_network,)); + assert_eq!(AllowedExporters::::get(bridged_network), None); + assert_eq!(AllowedExporters::::iter().count(), 0); + }) +} + +#[test] +fn allowed_universal_aliases_management_works() { + new_test_ext().execute_with(|| { + assert_eq!(AllowedUniversalAliases::::iter().count(), 0); + + let location1 = MultiLocation::new(1, X1(Parachain(1014))); + let junction1 = GlobalConsensus(ByGenesis([1; 32])); + let junction2 = GlobalConsensus(ByGenesis([2; 32])); + + // should fail - just root is allowed + assert_noop!( + BridgeTransfer::add_universal_alias( + RuntimeOrigin::signed(account(1)), + Box::new(VersionedMultiLocation::V3(location1.clone())), + junction1.clone(), + ), + DispatchError::BadOrigin + ); + assert_eq!(AllowedUniversalAliases::::iter().count(), 0); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + + // add ok + assert_ok!(BridgeTransfer::add_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + junction1.clone(), + )); + assert_ok!(BridgeTransfer::add_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + junction2.clone(), + )); + assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + assert_eq!(AllowedUniversalAliases::::iter().count(), 1); + + // remove ok + assert_ok!(BridgeTransfer::remove_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + vec![junction1.clone()], + )); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + assert_eq!(AllowedUniversalAliases::::iter().count(), 1); + + assert_ok!(BridgeTransfer::remove_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + vec![junction2.clone()], + )); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + assert_eq!(AllowedUniversalAliases::::iter().count(), 0); + }) +} + +#[test] +fn allowed_reserve_locations_management_works() { + new_test_ext().execute_with(|| { + assert_eq!(0, AllowedReserveLocations::::iter_values().count()); + + let location1 = MultiLocation::new(1, X1(Parachain(1014))); + let location1_as_latest = VersionedMultiLocation::from(location1.clone()); + let location1_as_latest_as_key = + LatestVersionedMultiLocation::try_from(&location1_as_latest).expect("ok"); + let location2 = + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([1; 32])), Parachain(1014))); + let location2_as_latest = VersionedMultiLocation::from(location2.clone()); + let location2_as_key = + LatestVersionedMultiLocation::try_from(&location2_as_latest).expect("ok"); + + let asset_location = MultiLocation::parent(); + let asset: MultiAsset = (asset_location, 200u128).into(); + + let asset_filter_for_asset_by_multilocation = MultiLocationFilter { + equals_any: BoundedVec::truncate_from(vec![asset_location.into_versioned()]), + starts_with_any: Default::default(), + }; + let asset_filter_for_asset = + AssetFilter::ByMultiLocation(asset_filter_for_asset_by_multilocation.clone()); + let asset_filter_for_other_by_multilocation = MultiLocationFilter { + equals_any: BoundedVec::truncate_from(vec![ + MultiLocation::new(3, Here).into_versioned() + ]), + starts_with_any: Default::default(), + }; + let asset_filter_for_other = + AssetFilter::ByMultiLocation(asset_filter_for_other_by_multilocation.clone()); + + // should fail - just root is allowed + assert_noop!( + BridgeTransfer::add_reserve_location( + RuntimeOrigin::signed(account(1)), + Box::new(location1_as_latest.clone()), + asset_filter_for_asset.clone(), + ), + DispatchError::BadOrigin + ); + assert!(AllowedReserveLocations::::get(&location1_as_latest_as_key).is_none()); + assert!(AllowedReserveLocations::::get(&location2_as_key).is_none()); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location1), + AssetTransferKind::Unsupported + ); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKind::Unsupported + ); + + // add ok + assert_ok!(BridgeTransfer::add_reserve_location( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + asset_filter_for_asset.clone() + )); + assert_ok!(BridgeTransfer::add_reserve_location( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location2.clone())), + asset_filter_for_other.clone() + )); + assert_eq!(2, AllowedReserveLocations::::iter_values().count()); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location1), + AssetTransferKind::WithdrawReserve + ); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKind::Unsupported + ); + + assert_ok!(BridgeTransfer::add_reserve_location( + RuntimeOrigin::root(), + Box::new(location2_as_latest.clone()), + asset_filter_for_asset.clone() + )); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKind::WithdrawReserve + ); + + // test remove + assert_noop!( + BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + Box::new(location1_as_latest.clone()), + Some(asset_filter_for_other_by_multilocation.clone()) + ), + DispatchError::Module(ModuleError { + index: 52, + error: [0, 0, 0, 0], + message: Some("UnavailableConfiguration") + }) + ); + + assert_ok!(BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + Box::new(location1_as_latest.clone()), + Some(asset_filter_for_asset_by_multilocation.clone()) + )); + assert_eq!(1, AllowedReserveLocations::::iter_values().count()); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location1), + AssetTransferKind::Unsupported + ); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKind::WithdrawReserve + ); + + assert_ok!(BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + Box::new(location2_as_latest.clone()), + Some(asset_filter_for_other_by_multilocation.clone()) + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location1), + AssetTransferKind::Unsupported + ); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKind::WithdrawReserve + ); + + assert_ok!(BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + Box::new(location2_as_latest), + Some(asset_filter_for_asset_by_multilocation) + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location1), + AssetTransferKind::Unsupported + ); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKind::Unsupported + ); + }) +} + +#[test] +fn allowed_bridged_target_location_management_works() { + new_test_ext().execute_with(|| { + assert_eq!(0, AllowedExporters::::iter_values().count()); + + let bridged_network = BridgedNetwork::get(); + let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); + let target_location: MultiLocation = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + + // should fail - we need BridgeConfig first + assert_noop!( + BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::All, + ), + DispatchError::Module(ModuleError { + index: 52, + error: [2, 0, 0, 0], + message: Some("UnavailableConfiguration") + }) + ); + + // add bridge config + assert_ok!(BridgeTransfer::add_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Box::new(bridge_location.into_versioned()), + None, + )); + + // should fail - we need also target_location first + assert_noop!( + BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::All, + ), + DispatchError::Module(ModuleError { + index: 52, + error: [1, 0, 0, 0], + message: Some("InvalidBridgeConfiguration") + }) + ); + + // insert allowed target location + assert_ok!(BridgeTransfer::update_bridged_target_location( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + None, + )); + + let asset1_location = MultiLocation::new(2, X2(Parachain(1235), Parachain(5678))); + let asset1 = MultiAsset::from((asset1_location, 1000)); + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset1, + &target_location + ), + AssetTransferKind::Unsupported + ); + + // now should pass - add one start_with pattern + assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::ByMultiLocation(MultiLocationFilter { + equals_any: Default::default(), + starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( + 2, + X1(Parachain(2223)) + ) + .into_versioned()]), + }), + )); + + // not allowed yet + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset1, + &target_location + ), + AssetTransferKind::Unsupported + ); + + // now should pass - add another start_with pattern + assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::ByMultiLocation(MultiLocationFilter { + equals_any: Default::default(), + starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( + 2, + X1(Parachain(1235)) + ) + .into_versioned()]), + }), + )); + + // ok + assert_eq!( + ConfiguredConcreteAssetTransferKindResolver::::resolve( + &asset1, + &target_location + ), + AssetTransferKind::ReserveBased + ); + }) +} diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index 2166097dacf..8fa41ffc8c0 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -706,7 +706,7 @@ impl pallet_bridge_transfer::Config for Runtime { type AssetsPerReserveLocationLimit = ConstU32<128>; type AssetTransactor = AssetTransactors; type AssetTransferKindResolver = - pallet_bridge_transfer::impls::ConfiguredConcreteAssetTransferKindResolver; + pallet_bridge_transfer::features::ConfiguredConcreteAssetTransferKindResolver; type BridgeXcmSender = BridgeXcmSender; type AssetTransferOrigin = EnsureXcmOrigin; type MaxAssetsLimit = ConstU8<1>; diff --git a/parachains/runtimes/assets/statemine/src/xcm_config.rs b/parachains/runtimes/assets/statemine/src/xcm_config.rs index 4a47c368f1b..0934079ab8c 100644 --- a/parachains/runtimes/assets/statemine/src/xcm_config.rs +++ b/parachains/runtimes/assets/statemine/src/xcm_config.rs @@ -26,7 +26,7 @@ use frame_support::{ traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, }; use frame_system::EnsureRoot; -use pallet_bridge_transfer::impls::{ +use pallet_bridge_transfer::features::{ AllowedUniversalAliasesOf, IsTrustedBridgedReserveForConcreteAsset, }; use pallet_xcm::XcmPassthrough; diff --git a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs index 39bc1323367..a1c88229b7d 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs @@ -214,7 +214,7 @@ pub fn can_governance_change_bridge_transfer_in_configuration::contains(&( + !pallet_bridge_transfer::features::AllowedUniversalAliasesOf::::contains(&( bridge_location, alias_junction )) @@ -237,7 +237,7 @@ pub fn can_governance_change_bridge_transfer_in_configuration::contains( + assert!(pallet_bridge_transfer::features::AllowedUniversalAliasesOf::::contains( &(bridge_location, alias_junction) )); }) diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 045c567625f..d5a873fc5c3 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -707,7 +707,7 @@ impl pallet_bridge_transfer::Config for Runtime { type AssetsPerReserveLocationLimit = ConstU32<128>; type AssetTransactor = AssetTransactors; type AssetTransferKindResolver = - pallet_bridge_transfer::impls::ConfiguredConcreteAssetTransferKindResolver; + pallet_bridge_transfer::features::ConfiguredConcreteAssetTransferKindResolver; type BridgeXcmSender = BridgeXcmSender; type AssetTransferOrigin = EnsureXcmOrigin; type MaxAssetsLimit = ConstU8<1>; diff --git a/parachains/runtimes/assets/westmint/src/xcm_config.rs b/parachains/runtimes/assets/westmint/src/xcm_config.rs index 50199f00044..af0ccc4b761 100644 --- a/parachains/runtimes/assets/westmint/src/xcm_config.rs +++ b/parachains/runtimes/assets/westmint/src/xcm_config.rs @@ -26,7 +26,7 @@ use frame_support::{ traits::{ConstU32, Contains, Everything, PalletInfoAccess}, }; use frame_system::EnsureRoot; -use pallet_bridge_transfer::impls::{ +use pallet_bridge_transfer::features::{ AllowedUniversalAliasesOf, IsTrustedBridgedReserveForConcreteAsset, }; use pallet_xcm::XcmPassthrough; From f608e5e21d99303f4a5c0ae85b120b213f5fbc19 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Thu, 8 Jun 2023 11:39:37 +0200 Subject: [PATCH 284/339] [Backport] weights 9430 to master (#2710) * [benchmarks] pr with weights (#2667) Co-authored-by: paritytech-ci * [benchmarks] pr with weights (#2668) Co-authored-by: paritytech-ci * [benchmarks] pr with weights (#2669) co-authored-by: paritytech-ci --------- Co-authored-by: Paritytech CI <52199148+paritytech-ci@users.noreply.github.com> Co-authored-by: paritytech-ci --- .../src/weights/cumulus_pallet_xcmp_queue.rs | 10 +- .../src/weights/pallet_balances.rs | 38 +-- .../src/weights/pallet_collator_selection.rs | 46 +-- .../src/weights/pallet_multisig.rs | 66 ++--- .../src/weights/pallet_nfts.rs | 198 +++++++------ .../src/weights/pallet_proxy.rs | 98 +++---- .../src/weights/pallet_session.rs | 10 +- .../src/weights/pallet_timestamp.rs | 10 +- .../src/weights/pallet_uniques.rs | 122 ++++---- .../src/weights/pallet_utility.rs | 34 +-- .../src/weights/pallet_xcm.rs | 62 ++-- .../xcm/pallet_xcm_benchmarks_fungible.rs | 30 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 118 ++++---- .../src/weights/cumulus_pallet_xcmp_queue.rs | 10 +- .../src/weights/pallet_balances.rs | 38 +-- .../src/weights/pallet_collator_selection.rs | 46 +-- .../src/weights/pallet_multisig.rs | 66 ++--- .../src/weights/pallet_nfts.rs | 274 +++++++++--------- .../src/weights/pallet_proxy.rs | 98 +++---- .../src/weights/pallet_session.rs | 10 +- .../src/weights/pallet_timestamp.rs | 10 +- .../src/weights/pallet_uniques.rs | 122 ++++---- .../src/weights/pallet_utility.rs | 34 +-- .../src/weights/pallet_xcm.rs | 126 ++++---- .../xcm/pallet_xcm_benchmarks_fungible.rs | 38 +-- .../xcm/pallet_xcm_benchmarks_generic.rs | 150 +++++----- .../src/weights/cumulus_pallet_xcmp_queue.rs | 10 +- .../src/weights/pallet_balances.rs | 38 +-- .../src/weights/pallet_collator_selection.rs | 46 +-- .../src/weights/pallet_multisig.rs | 70 ++--- .../weights/pallet_nft_fractionalization.rs | 72 ++++- .../src/weights/pallet_nfts.rs | 198 +++++++------ .../src/weights/pallet_proxy.rs | 98 +++---- .../src/weights/pallet_session.rs | 10 +- .../src/weights/pallet_timestamp.rs | 10 +- .../src/weights/pallet_uniques.rs | 122 ++++---- .../src/weights/pallet_utility.rs | 34 +-- .../src/weights/pallet_xcm.rs | 62 ++-- .../xcm/pallet_xcm_benchmarks_fungible.rs | 38 +-- .../xcm/pallet_xcm_benchmarks_generic.rs | 150 +++++----- .../src/weights/cumulus_pallet_xcmp_queue.rs | 10 +- .../src/weights/pallet_balances.rs | 38 +-- .../src/weights/pallet_collator_selection.rs | 46 +-- .../src/weights/pallet_multisig.rs | 68 ++--- .../src/weights/pallet_session.rs | 10 +- .../src/weights/pallet_timestamp.rs | 10 +- .../src/weights/pallet_utility.rs | 34 +-- .../src/weights/pallet_xcm.rs | 58 ++-- .../xcm/pallet_xcm_benchmarks_fungible.rs | 30 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 118 ++++---- .../src/weights/cumulus_pallet_xcmp_queue.rs | 10 +- .../src/weights/pallet_balances.rs | 38 +-- .../src/weights/pallet_collator_selection.rs | 46 +-- .../src/weights/pallet_multisig.rs | 66 ++--- .../src/weights/pallet_session.rs | 10 +- .../src/weights/pallet_timestamp.rs | 10 +- .../src/weights/pallet_utility.rs | 34 +-- .../src/weights/pallet_xcm.rs | 58 ++-- .../xcm/pallet_xcm_benchmarks_fungible.rs | 30 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 118 ++++---- .../src/weights/cumulus_pallet_xcmp_queue.rs | 10 +- .../src/weights/pallet_balances.rs | 38 +-- .../src/weights/pallet_bridge_grandpa.rs | 81 ++++++ .../src/weights/pallet_bridge_messages.rs | 231 +++++++++++++++ .../src/weights/pallet_bridge_parachains.rs | 113 ++++++++ .../src/weights/pallet_bridge_relayers.rs | 39 ++- .../src/weights/pallet_collator_selection.rs | 46 +-- .../src/weights/pallet_multisig.rs | 66 ++--- .../src/weights/pallet_session.rs | 10 +- .../src/weights/pallet_timestamp.rs | 14 +- .../src/weights/pallet_utility.rs | 34 +-- .../src/weights/pallet_xcm.rs | 118 ++++---- .../xcm/pallet_xcm_benchmarks_fungible.rs | 40 +-- .../xcm/pallet_xcm_benchmarks_generic.rs | 177 +++++------ .../src/weights/cumulus_pallet_xcmp_queue.rs | 10 +- .../src/weights/pallet_alliance.rs | 168 +++++------ .../src/weights/pallet_balances.rs | 38 +-- .../src/weights/pallet_collator_selection.rs | 46 +-- .../src/weights/pallet_collective.rs | 124 ++++---- .../src/weights/pallet_multisig.rs | 68 ++--- .../src/weights/pallet_preimage.rs | 60 ++-- .../src/weights/pallet_proxy.rs | 98 +++---- .../src/weights/pallet_ranked_collective.rs | 42 +-- .../src/weights/pallet_referenda.rs | 234 ++++++++------- .../src/weights/pallet_scheduler.rs | 74 ++--- .../src/weights/pallet_session.rs | 10 +- .../src/weights/pallet_timestamp.rs | 10 +- .../src/weights/pallet_utility.rs | 34 +-- .../src/weights/pallet_xcm.rs | 58 ++-- 89 files changed, 3128 insertions(+), 2627 deletions(-) create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs create mode 100644 parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs index 89bf59acdb0..ff4816fecc9 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_800_000 picoseconds. - Weight::from_parts(5_998_000, 0) + // Minimum execution time: 5_530_000 picoseconds. + Weight::from_parts(5_817_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_975_000 picoseconds. - Weight::from_parts(6_136_000, 0) + // Minimum execution time: 5_715_000 picoseconds. + Weight::from_parts(5_893_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_balances.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_balances.rs index 563df00f845..f672b1437f3 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_balances.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 54_579_000 picoseconds. - Weight::from_parts(55_271_000, 0) + // Minimum execution time: 53_267_000 picoseconds. + Weight::from_parts(53_923_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 41_342_000 picoseconds. - Weight::from_parts(41_759_000, 0) + // Minimum execution time: 40_670_000 picoseconds. + Weight::from_parts(41_297_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 16_403_000 picoseconds. - Weight::from_parts(16_651_000, 0) + // Minimum execution time: 15_862_000 picoseconds. + Weight::from_parts(16_038_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 23_225_000 picoseconds. - Weight::from_parts(23_577_000, 0) + // Minimum execution time: 22_408_000 picoseconds. + Weight::from_parts(22_898_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 56_084_000 picoseconds. - Weight::from_parts(56_374_000, 0) + // Minimum execution time: 54_670_000 picoseconds. + Weight::from_parts(55_371_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 50_374_000 picoseconds. - Weight::from_parts(52_040_000, 0) + // Minimum execution time: 49_603_000 picoseconds. + Weight::from_parts(50_053_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 18_975_000 picoseconds. - Weight::from_parts(19_317_000, 0) + // Minimum execution time: 18_439_000 picoseconds. + Weight::from_parts(18_825_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 18_579_000 picoseconds. - Weight::from_parts(18_668_000, 0) + // Minimum execution time: 18_031_000 picoseconds. + Weight::from_parts(18_318_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 9_111 - .saturating_add(Weight::from_parts(14_381_916, 0).saturating_mul(u.into())) + // Standard Error: 10_543 + .saturating_add(Weight::from_parts(14_123_878, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_collator_selection.rs index ece29bc35c4..bac78a8d37b 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_collator_selection.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -57,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` // Estimated: `1168 + b * (2554 ±0)` - // Minimum execution time: 15_571_000 picoseconds. - Weight::from_parts(15_554_982, 0) + // Minimum execution time: 15_198_000 picoseconds. + Weight::from_parts(15_308_042, 0) .saturating_add(Weight::from_parts(0, 1168)) - // Standard Error: 2_818 - .saturating_add(Weight::from_parts(2_610_335, 0).saturating_mul(b.into())) + // Standard Error: 2_782 + .saturating_add(Weight::from_parts(2_609_742, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -72,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_816_000 picoseconds. - Weight::from_parts(8_030_000, 0) + // Minimum execution time: 7_476_000 picoseconds. + Weight::from_parts(7_689_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -83,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_077_000 picoseconds. - Weight::from_parts(8_293_000, 0) + // Minimum execution time: 7_652_000 picoseconds. + Weight::from_parts(7_912_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,11 +105,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `1108 + c * (48 ±0)` // Estimated: `49487 + c * (49 ±0)` - // Minimum execution time: 43_072_000 picoseconds. - Weight::from_parts(35_712_990, 0) + // Minimum execution time: 42_454_000 picoseconds. + Weight::from_parts(34_943_337, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_261 - .saturating_add(Weight::from_parts(112_854, 0).saturating_mul(c.into())) + // Standard Error: 1_259 + .saturating_add(Weight::from_parts(105_204, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -123,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `452 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 35_372_000 picoseconds. - Weight::from_parts(26_886_289, 0) + // Minimum execution time: 34_323_000 picoseconds. + Weight::from_parts(23_416_986, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_388 - .saturating_add(Weight::from_parts(106_632, 0).saturating_mul(c.into())) + // Standard Error: 1_277 + .saturating_add(Weight::from_parts(105_960, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -141,8 +141,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 44_209_000 picoseconds. - Weight::from_parts(44_590_000, 0) + // Minimum execution time: 44_234_000 picoseconds. + Weight::from_parts(44_843_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) @@ -196,11 +196,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `22721 + c * (97 ±0) + r * (116 ±0)` // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 17_397_000 picoseconds. - Weight::from_parts(17_600_000, 0) + // Minimum execution time: 17_678_000 picoseconds. + Weight::from_parts(17_900_000, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 897_810 - .saturating_add(Weight::from_parts(31_873_549, 0).saturating_mul(c.into())) + // Standard Error: 854_072 + .saturating_add(Weight::from_parts(30_351_497, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_multisig.rs index 04e704cc402..efb4cfdec19 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_multisig.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_303_000 picoseconds. - Weight::from_parts(12_695_362, 0) + // Minimum execution time: 11_543_000 picoseconds. + Weight::from_parts(12_043_787, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 1 - .saturating_add(Weight::from_parts(557, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(540, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -67,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `262 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 42_467_000 picoseconds. - Weight::from_parts(36_773_932, 0) + // Minimum execution time: 42_087_000 picoseconds. + Weight::from_parts(36_466_676, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 459 - .saturating_add(Weight::from_parts(63_612, 0).saturating_mul(s.into())) - // Standard Error: 4 - .saturating_add(Weight::from_parts(1_269, 0).saturating_mul(z.into())) + // Standard Error: 401 + .saturating_add(Weight::from_parts(62_580, 0).saturating_mul(s.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_242, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -85,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 28_843_000 picoseconds. - Weight::from_parts(23_142_157, 0) + // Minimum execution time: 27_854_000 picoseconds. + Weight::from_parts(22_619_700, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 229 - .saturating_add(Weight::from_parts(63_362, 0).saturating_mul(s.into())) + // Standard Error: 298 + .saturating_add(Weight::from_parts(58_268, 0).saturating_mul(s.into())) // Standard Error: 2 - .saturating_add(Weight::from_parts(1_241, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_230, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,13 +105,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `385 + s * (33 ±0)` // Estimated: `6811` - // Minimum execution time: 48_265_000 picoseconds. - Weight::from_parts(40_503_415, 0) + // Minimum execution time: 47_373_000 picoseconds. + Weight::from_parts(40_149_301, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 528 - .saturating_add(Weight::from_parts(85_941, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_281, 0).saturating_mul(z.into())) + // Standard Error: 495 + .saturating_add(Weight::from_parts(80_531, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_268, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -122,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 32_680_000 picoseconds. - Weight::from_parts(34_368_418, 0) + // Minimum execution time: 32_765_000 picoseconds. + Weight::from_parts(34_501_173, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 558 - .saturating_add(Weight::from_parts(72_172, 0).saturating_mul(s.into())) + // Standard Error: 565 + .saturating_add(Weight::from_parts(68_661, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -137,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 19_571_000 picoseconds. - Weight::from_parts(20_887_762, 0) + // Minimum execution time: 19_404_000 picoseconds. + Weight::from_parts(20_727_462, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 858 - .saturating_add(Weight::from_parts(64_869, 0).saturating_mul(s.into())) + // Standard Error: 664 + .saturating_add(Weight::from_parts(60_980, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -152,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 32_681_000 picoseconds. - Weight::from_parts(34_919_059, 0) + // Minimum execution time: 33_353_000 picoseconds. + Weight::from_parts(35_328_237, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 613 - .saturating_add(Weight::from_parts(72_149, 0).saturating_mul(s.into())) + // Standard Error: 598 + .saturating_add(Weight::from_parts(66_829, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nfts.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nfts.rs index 689b1b750b9..7f5ad055e97 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nfts.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nfts.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_nfts` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -62,8 +62,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3549` - // Minimum execution time: 39_589_000 picoseconds. - Weight::from_parts(40_305_000, 0) + // Minimum execution time: 38_401_000 picoseconds. + Weight::from_parts(38_949_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) @@ -82,8 +82,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3549` - // Minimum execution time: 23_945_000 picoseconds. - Weight::from_parts(24_351_000, 0) + // Minimum execution time: 22_838_000 picoseconds. + Weight::from_parts(23_250_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) @@ -107,15 +107,17 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// The range of component `m` is `[0, 1000]`. /// The range of component `c` is `[0, 1000]`. /// The range of component `a` is `[0, 1000]`. - fn destroy(_m: u32, _c: u32, a: u32, ) -> Weight { + fn destroy(m: u32, _c: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `32170 + a * (366 ±0)` // Estimated: `2523990 + a * (2954 ±0)` - // Minimum execution time: 992_533_000 picoseconds. - Weight::from_parts(941_813_359, 0) + // Minimum execution time: 992_022_000 picoseconds. + Weight::from_parts(935_139_491, 0) .saturating_add(Weight::from_parts(0, 2523990)) - // Standard Error: 3_954 - .saturating_add(Weight::from_parts(5_784_754, 0).saturating_mul(a.into())) + // Standard Error: 3_802 + .saturating_add(Weight::from_parts(1_298, 0).saturating_mul(m.into())) + // Standard Error: 3_802 + .saturating_add(Weight::from_parts(5_705_762, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(1004)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(1005)) @@ -138,8 +140,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `421` // Estimated: `4326` - // Minimum execution time: 49_305_000 picoseconds. - Weight::from_parts(50_143_000, 0) + // Minimum execution time: 48_174_000 picoseconds. + Weight::from_parts(48_672_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -160,8 +162,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `421` // Estimated: `4326` - // Minimum execution time: 48_627_000 picoseconds. - Weight::from_parts(48_954_000, 0) + // Minimum execution time: 47_306_000 picoseconds. + Weight::from_parts(47_667_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -186,14 +188,16 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `530` // Estimated: `4326` - // Minimum execution time: 49_958_000 picoseconds. - Weight::from_parts(50_387_000, 0) + // Minimum execution time: 48_476_000 picoseconds. + Weight::from_parts(49_047_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: Nfts Collection (r:1 w:0) /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1 w:0) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) @@ -210,10 +214,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `559` // Estimated: `4326` - // Minimum execution time: 36_267_000 picoseconds. - Weight::from_parts(36_712_000, 0) + // Minimum execution time: 39_965_000 picoseconds. + Weight::from_parts(40_246_000, 0) .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: Nfts Collection (r:1 w:0) @@ -227,11 +231,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `729 + i * (108 ±0)` // Estimated: `3549 + i * (3336 ±0)` - // Minimum execution time: 17_738_000 picoseconds. - Weight::from_parts(17_801_000, 0) + // Minimum execution time: 16_761_000 picoseconds. + Weight::from_parts(16_963_000, 0) .saturating_add(Weight::from_parts(0, 3549)) - // Standard Error: 13_596 - .saturating_add(Weight::from_parts(15_695_790, 0).saturating_mul(i.into())) + // Standard Error: 12_873 + .saturating_add(Weight::from_parts(15_337_079, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) @@ -245,8 +249,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `401` // Estimated: `3534` - // Minimum execution time: 20_845_000 picoseconds. - Weight::from_parts(21_133_000, 0) + // Minimum execution time: 20_221_000 picoseconds. + Weight::from_parts(20_418_000, 0) .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -259,8 +263,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `401` // Estimated: `3534` - // Minimum execution time: 20_862_000 picoseconds. - Weight::from_parts(21_105_000, 0) + // Minimum execution time: 20_112_000 picoseconds. + Weight::from_parts(20_387_000, 0) .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -273,8 +277,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `306` // Estimated: `3549` - // Minimum execution time: 18_196_000 picoseconds. - Weight::from_parts(18_333_000, 0) + // Minimum execution time: 17_323_000 picoseconds. + Weight::from_parts(17_523_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -289,8 +293,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `354` // Estimated: `3549` - // Minimum execution time: 24_025_000 picoseconds. - Weight::from_parts(24_277_000, 0) + // Minimum execution time: 23_135_000 picoseconds. + Weight::from_parts(23_379_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -303,8 +307,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `335` // Estimated: `6078` - // Minimum execution time: 40_974_000 picoseconds. - Weight::from_parts(41_706_000, 0) + // Minimum execution time: 40_209_000 picoseconds. + Weight::from_parts(40_875_000, 0) .saturating_add(Weight::from_parts(0, 6078)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(5)) @@ -317,8 +321,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `277` // Estimated: `3549` - // Minimum execution time: 19_044_000 picoseconds. - Weight::from_parts(19_465_000, 0) + // Minimum execution time: 18_103_000 picoseconds. + Weight::from_parts(18_330_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) @@ -331,8 +335,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `242` // Estimated: `3549` - // Minimum execution time: 15_591_000 picoseconds. - Weight::from_parts(15_858_000, 0) + // Minimum execution time: 14_743_000 picoseconds. + Weight::from_parts(15_077_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -345,8 +349,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `401` // Estimated: `3534` - // Minimum execution time: 20_831_000 picoseconds. - Weight::from_parts(21_121_000, 0) + // Minimum execution time: 19_944_000 picoseconds. + Weight::from_parts(20_130_000, 0) .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -365,8 +369,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `505` // Estimated: `3944` - // Minimum execution time: 50_650_000 picoseconds. - Weight::from_parts(51_315_000, 0) + // Minimum execution time: 49_415_000 picoseconds. + Weight::from_parts(49_913_000, 0) .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -379,8 +383,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `310` // Estimated: `3944` - // Minimum execution time: 28_244_000 picoseconds. - Weight::from_parts(28_627_000, 0) + // Minimum execution time: 27_070_000 picoseconds. + Weight::from_parts(27_276_000, 0) .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -397,8 +401,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `949` // Estimated: `3944` - // Minimum execution time: 47_299_000 picoseconds. - Weight::from_parts(47_921_000, 0) + // Minimum execution time: 46_046_000 picoseconds. + Weight::from_parts(46_617_000, 0) .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -411,8 +415,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `347` // Estimated: `4466` - // Minimum execution time: 19_400_000 picoseconds. - Weight::from_parts(19_601_000, 0) + // Minimum execution time: 18_270_000 picoseconds. + Weight::from_parts(18_542_000, 0) .saturating_add(Weight::from_parts(0, 4466)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -430,11 +434,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `726 + n * (398 ±0)` // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 28_552_000 picoseconds. - Weight::from_parts(28_822_000, 0) + // Minimum execution time: 27_394_000 picoseconds. + Weight::from_parts(27_660_000, 0) .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 3_265 - .saturating_add(Weight::from_parts(5_570_824, 0).saturating_mul(n.into())) + // Standard Error: 3_479 + .saturating_add(Weight::from_parts(5_570_896, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) @@ -455,8 +459,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `505` // Estimated: `3812` - // Minimum execution time: 42_425_000 picoseconds. - Weight::from_parts(42_883_000, 0) + // Minimum execution time: 41_123_000 picoseconds. + Weight::from_parts(41_552_000, 0) .saturating_add(Weight::from_parts(0, 3812)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -473,8 +477,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `815` // Estimated: `3812` - // Minimum execution time: 40_219_000 picoseconds. - Weight::from_parts(41_709_000, 0) + // Minimum execution time: 39_264_000 picoseconds. + Weight::from_parts(39_797_000, 0) .saturating_add(Weight::from_parts(0, 3812)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -491,8 +495,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `364` // Estimated: `3759` - // Minimum execution time: 39_376_000 picoseconds. - Weight::from_parts(39_895_000, 0) + // Minimum execution time: 38_634_000 picoseconds. + Weight::from_parts(38_879_000, 0) .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -509,8 +513,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `682` // Estimated: `3759` - // Minimum execution time: 38_414_000 picoseconds. - Weight::from_parts(38_627_000, 0) + // Minimum execution time: 36_965_000 picoseconds. + Weight::from_parts(37_356_000, 0) .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -523,8 +527,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `376` // Estimated: `4326` - // Minimum execution time: 22_896_000 picoseconds. - Weight::from_parts(23_137_000, 0) + // Minimum execution time: 22_208_000 picoseconds. + Weight::from_parts(22_428_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -535,8 +539,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `384` // Estimated: `4326` - // Minimum execution time: 20_602_000 picoseconds. - Weight::from_parts(20_869_000, 0) + // Minimum execution time: 19_387_000 picoseconds. + Weight::from_parts(19_737_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -547,8 +551,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `384` // Estimated: `4326` - // Minimum execution time: 19_415_000 picoseconds. - Weight::from_parts(19_594_000, 0) + // Minimum execution time: 18_424_000 picoseconds. + Weight::from_parts(18_646_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -559,8 +563,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3517` - // Minimum execution time: 16_784_000 picoseconds. - Weight::from_parts(17_133_000, 0) + // Minimum execution time: 16_112_000 picoseconds. + Weight::from_parts(16_427_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -573,8 +577,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `306` // Estimated: `3549` - // Minimum execution time: 20_391_000 picoseconds. - Weight::from_parts(20_710_000, 0) + // Minimum execution time: 19_491_000 picoseconds. + Weight::from_parts(19_788_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -587,8 +591,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `289` // Estimated: `3538` - // Minimum execution time: 19_989_000 picoseconds. - Weight::from_parts(20_179_000, 0) + // Minimum execution time: 19_531_000 picoseconds. + Weight::from_parts(20_119_000, 0) .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -605,8 +609,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `484` // Estimated: `4326` - // Minimum execution time: 24_308_000 picoseconds. - Weight::from_parts(24_721_000, 0) + // Minimum execution time: 23_920_000 picoseconds. + Weight::from_parts(24_183_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -617,6 +621,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1 w:0) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) @@ -629,10 +635,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `671` // Estimated: `4326` - // Minimum execution time: 45_626_000 picoseconds. - Weight::from_parts(46_030_000, 0) + // Minimum execution time: 49_289_000 picoseconds. + Weight::from_parts(49_656_000, 0) .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(5)) } /// The range of component `n` is `[0, 10]`. @@ -640,11 +646,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_654_000 picoseconds. - Weight::from_parts(4_301_940, 0) + // Minimum execution time: 2_443_000 picoseconds. + Weight::from_parts(4_101_841, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 9_223 - .saturating_add(Weight::from_parts(3_945_966, 0).saturating_mul(n.into())) + // Standard Error: 9_462 + .saturating_add(Weight::from_parts(3_606_826, 0).saturating_mul(n.into())) } /// Storage: Nfts Item (r:2 w:0) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) @@ -654,8 +660,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `460` // Estimated: `7662` - // Minimum execution time: 23_071_000 picoseconds. - Weight::from_parts(23_535_000, 0) + // Minimum execution time: 22_008_000 picoseconds. + Weight::from_parts(22_762_000, 0) .saturating_add(Weight::from_parts(0, 7662)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -668,8 +674,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `479` // Estimated: `4326` - // Minimum execution time: 21_554_000 picoseconds. - Weight::from_parts(21_941_000, 0) + // Minimum execution time: 20_800_000 picoseconds. + Weight::from_parts(21_008_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -680,6 +686,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:2 w:0) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:2 w:0) @@ -692,10 +700,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `800` // Estimated: `7662` - // Minimum execution time: 74_272_000 picoseconds. - Weight::from_parts(75_374_000, 0) + // Minimum execution time: 81_599_000 picoseconds. + Weight::from_parts(82_041_000, 0) .saturating_add(Weight::from_parts(0, 7662)) - .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(10)) } /// Storage: Nfts CollectionRoleOf (r:2 w:0) @@ -721,11 +729,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `524` // Estimated: `6078 + n * (2954 ±0)` - // Minimum execution time: 133_545_000 picoseconds. - Weight::from_parts(137_797_962, 0) + // Minimum execution time: 131_568_000 picoseconds. + Weight::from_parts(135_826_981, 0) .saturating_add(Weight::from_parts(0, 6078)) - // Standard Error: 33_124 - .saturating_add(Weight::from_parts(29_785_862, 0).saturating_mul(n.into())) + // Standard Error: 27_151 + .saturating_add(Weight::from_parts(29_423_870, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6)) @@ -749,11 +757,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `554` // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 77_475_000 picoseconds. - Weight::from_parts(88_353_947, 0) + // Minimum execution time: 76_302_000 picoseconds. + Weight::from_parts(87_313_888, 0) .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 60_491 - .saturating_add(Weight::from_parts(29_507_037, 0).saturating_mul(n.into())) + // Standard Error: 64_504 + .saturating_add(Weight::from_parts(29_044_884, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_proxy.rs index 27680ed3ea0..9450b7f8ec6 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_proxy.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -55,11 +55,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 17_994_000 picoseconds. - Weight::from_parts(18_404_764, 0) + // Minimum execution time: 16_974_000 picoseconds. + Weight::from_parts(17_350_391, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 931 - .saturating_add(Weight::from_parts(29_489, 0).saturating_mul(p.into())) + // Standard Error: 577 + .saturating_add(Weight::from_parts(33_979, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -74,13 +74,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 39_788_000 picoseconds. - Weight::from_parts(39_231_218, 0) + // Minimum execution time: 38_886_000 picoseconds. + Weight::from_parts(38_531_657, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_373 - .saturating_add(Weight::from_parts(144_577, 0).saturating_mul(a.into())) - // Standard Error: 1_418 - .saturating_add(Weight::from_parts(39_464, 0).saturating_mul(p.into())) + // Standard Error: 1_206 + .saturating_add(Weight::from_parts(134_756, 0).saturating_mul(a.into())) + // Standard Error: 1_246 + .saturating_add(Weight::from_parts(36_911, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -94,13 +94,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 25_778_000 picoseconds. - Weight::from_parts(26_117_943, 0) + // Minimum execution time: 25_243_000 picoseconds. + Weight::from_parts(25_821_401, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_161 - .saturating_add(Weight::from_parts(143_478, 0).saturating_mul(a.into())) - // Standard Error: 1_200 - .saturating_add(Weight::from_parts(8_492, 0).saturating_mul(p.into())) + // Standard Error: 1_156 + .saturating_add(Weight::from_parts(136_892, 0).saturating_mul(a.into())) + // Standard Error: 1_194 + .saturating_add(Weight::from_parts(9_176, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -114,13 +114,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 25_448_000 picoseconds. - Weight::from_parts(26_025_080, 0) + // Minimum execution time: 25_392_000 picoseconds. + Weight::from_parts(25_832_947, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_079 - .saturating_add(Weight::from_parts(146_383, 0).saturating_mul(a.into())) - // Standard Error: 1_115 - .saturating_add(Weight::from_parts(7_614, 0).saturating_mul(p.into())) + // Standard Error: 1_067 + .saturating_add(Weight::from_parts(135_109, 0).saturating_mul(a.into())) + // Standard Error: 1_102 + .saturating_add(Weight::from_parts(9_827, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -136,13 +136,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `386 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 35_200_000 picoseconds. - Weight::from_parts(34_858_670, 0) + // Minimum execution time: 35_063_000 picoseconds. + Weight::from_parts(34_933_848, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_692 - .saturating_add(Weight::from_parts(148_578, 0).saturating_mul(a.into())) - // Standard Error: 1_748 - .saturating_add(Weight::from_parts(38_530, 0).saturating_mul(p.into())) + // Standard Error: 1_466 + .saturating_add(Weight::from_parts(124_918, 0).saturating_mul(a.into())) + // Standard Error: 1_515 + .saturating_add(Weight::from_parts(19_204, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -153,11 +153,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 26_373_000 picoseconds. - Weight::from_parts(27_005_379, 0) + // Minimum execution time: 26_060_000 picoseconds. + Weight::from_parts(26_691_889, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 844 - .saturating_add(Weight::from_parts(58_125, 0).saturating_mul(p.into())) + // Standard Error: 951 + .saturating_add(Weight::from_parts(46_019, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -168,11 +168,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 26_455_000 picoseconds. - Weight::from_parts(27_435_800, 0) + // Minimum execution time: 26_241_000 picoseconds. + Weight::from_parts(27_136_775, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_489 - .saturating_add(Weight::from_parts(57_697, 0).saturating_mul(p.into())) + // Standard Error: 1_599 + .saturating_add(Weight::from_parts(56_033, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -183,11 +183,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_169_000 picoseconds. - Weight::from_parts(23_866_116, 0) + // Minimum execution time: 23_267_000 picoseconds. + Weight::from_parts(23_905_193, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 788 - .saturating_add(Weight::from_parts(25_795, 0).saturating_mul(p.into())) + // Standard Error: 917 + .saturating_add(Weight::from_parts(28_252, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -198,11 +198,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `139` // Estimated: `4706` - // Minimum execution time: 28_172_000 picoseconds. - Weight::from_parts(28_972_303, 0) + // Minimum execution time: 28_251_000 picoseconds. + Weight::from_parts(28_790_795, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 934 - .saturating_add(Weight::from_parts(10_208, 0).saturating_mul(p.into())) + // Standard Error: 852 + .saturating_add(Weight::from_parts(11_696, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -213,11 +213,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `164 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 24_193_000 picoseconds. - Weight::from_parts(25_184_514, 0) + // Minimum execution time: 24_236_000 picoseconds. + Weight::from_parts(24_726_740, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 3_667 - .saturating_add(Weight::from_parts(17_503, 0).saturating_mul(p.into())) + // Standard Error: 830 + .saturating_add(Weight::from_parts(36_700, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_session.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_session.rs index 359ea9da901..6ed5515e821 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_session.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `270` // Estimated: `3735` - // Minimum execution time: 17_623_000 picoseconds. - Weight::from_parts(17_946_000, 0) + // Minimum execution time: 17_361_000 picoseconds. + Weight::from_parts(17_619_000, 0) .saturating_add(Weight::from_parts(0, 3735)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,8 +70,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `242` // Estimated: `3707` - // Minimum execution time: 13_059_000 picoseconds. - Weight::from_parts(13_341_000, 0) + // Minimum execution time: 12_920_000 picoseconds. + Weight::from_parts(13_209_000, 0) .saturating_add(Weight::from_parts(0, 3707)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_timestamp.rs index ef8da150383..eb249fae49e 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_timestamp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `86` // Estimated: `1493` - // Minimum execution time: 9_168_000 picoseconds. - Weight::from_parts(9_563_000, 0) + // Minimum execution time: 8_949_000 picoseconds. + Weight::from_parts(9_418_000, 0) .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_146_000 picoseconds. - Weight::from_parts(3_238_000, 0) + // Minimum execution time: 3_174_000 picoseconds. + Weight::from_parts(3_321_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_uniques.rs index 3c9372e2e5f..f5cd293d187 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_uniques.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_uniques` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3643` - // Minimum execution time: 31_630_000 picoseconds. - Weight::from_parts(32_135_000, 0) + // Minimum execution time: 30_329_000 picoseconds. + Weight::from_parts(30_796_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,8 +70,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3643` - // Minimum execution time: 15_573_000 picoseconds. - Weight::from_parts(15_971_000, 0) + // Minimum execution time: 14_523_000 picoseconds. + Weight::from_parts(14_862_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -99,15 +99,15 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `257 + a * (107 ±0) + m * (56 ±0) + n * (76 ±0)` // Estimated: `3643 + a * (2647 ±0) + m * (2662 ±0) + n * (2597 ±0)` - // Minimum execution time: 2_397_568_000 picoseconds. - Weight::from_parts(2_408_280_000, 0) + // Minimum execution time: 2_406_160_000 picoseconds. + Weight::from_parts(2_421_810_000, 0) .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 24_497 - .saturating_add(Weight::from_parts(6_425_310, 0).saturating_mul(n.into())) - // Standard Error: 24_497 - .saturating_add(Weight::from_parts(252_611, 0).saturating_mul(m.into())) - // Standard Error: 24_497 - .saturating_add(Weight::from_parts(313_131, 0).saturating_mul(a.into())) + // Standard Error: 24_583 + .saturating_add(Weight::from_parts(6_208_225, 0).saturating_mul(n.into())) + // Standard Error: 24_583 + .saturating_add(Weight::from_parts(252_636, 0).saturating_mul(m.into())) + // Standard Error: 24_583 + .saturating_add(Weight::from_parts(322_596, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) @@ -132,8 +132,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 37_233_000 picoseconds. - Weight::from_parts(37_731_000, 0) + // Minimum execution time: 36_433_000 picoseconds. + Weight::from_parts(36_859_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -150,8 +150,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 38_493_000 picoseconds. - Weight::from_parts(38_939_000, 0) + // Minimum execution time: 37_183_000 picoseconds. + Weight::from_parts(37_824_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -168,8 +168,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 28_125_000 picoseconds. - Weight::from_parts(28_354_000, 0) + // Minimum execution time: 26_985_000 picoseconds. + Weight::from_parts(27_384_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -183,11 +183,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `738 + i * (76 ±0)` // Estimated: `3643 + i * (2597 ±0)` - // Minimum execution time: 16_016_000 picoseconds. - Weight::from_parts(16_298_000, 0) + // Minimum execution time: 15_305_000 picoseconds. + Weight::from_parts(15_491_000, 0) .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 12_979 - .saturating_add(Weight::from_parts(15_665_767, 0).saturating_mul(i.into())) + // Standard Error: 13_415 + .saturating_add(Weight::from_parts(15_181_685, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -202,8 +202,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 19_730_000 picoseconds. - Weight::from_parts(20_008_000, 0) + // Minimum execution time: 19_080_000 picoseconds. + Weight::from_parts(19_374_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -216,8 +216,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 19_683_000 picoseconds. - Weight::from_parts(20_096_000, 0) + // Minimum execution time: 19_100_000 picoseconds. + Weight::from_parts(19_779_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -228,8 +228,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 14_854_000 picoseconds. - Weight::from_parts(15_217_000, 0) + // Minimum execution time: 14_270_000 picoseconds. + Weight::from_parts(14_699_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -240,8 +240,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 14_659_000 picoseconds. - Weight::from_parts(15_072_000, 0) + // Minimum execution time: 14_372_000 picoseconds. + Weight::from_parts(14_646_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -256,8 +256,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `356` // Estimated: `3643` - // Minimum execution time: 23_412_000 picoseconds. - Weight::from_parts(23_634_000, 0) + // Minimum execution time: 22_401_000 picoseconds. + Weight::from_parts(22_747_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -268,8 +268,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 15_816_000 picoseconds. - Weight::from_parts(16_303_000, 0) + // Minimum execution time: 15_142_000 picoseconds. + Weight::from_parts(15_558_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -282,8 +282,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 18_056_000 picoseconds. - Weight::from_parts(18_315_000, 0) + // Minimum execution time: 17_162_000 picoseconds. + Weight::from_parts(17_630_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -298,8 +298,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `559` // Estimated: `3652` - // Minimum execution time: 41_560_000 picoseconds. - Weight::from_parts(41_962_000, 0) + // Minimum execution time: 40_224_000 picoseconds. + Weight::from_parts(40_672_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -314,8 +314,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `756` // Estimated: `3652` - // Minimum execution time: 40_334_000 picoseconds. - Weight::from_parts(40_590_000, 0) + // Minimum execution time: 38_779_000 picoseconds. + Weight::from_parts(39_275_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -328,8 +328,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `348` // Estimated: `3652` - // Minimum execution time: 33_142_000 picoseconds. - Weight::from_parts(33_683_000, 0) + // Minimum execution time: 31_297_000 picoseconds. + Weight::from_parts(31_846_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -342,8 +342,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `559` // Estimated: `3652` - // Minimum execution time: 32_918_000 picoseconds. - Weight::from_parts(33_270_000, 0) + // Minimum execution time: 31_600_000 picoseconds. + Weight::from_parts(32_762_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -356,8 +356,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 33_736_000 picoseconds. - Weight::from_parts(34_148_000, 0) + // Minimum execution time: 32_530_000 picoseconds. + Weight::from_parts(32_709_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -370,8 +370,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `473` // Estimated: `3643` - // Minimum execution time: 31_648_000 picoseconds. - Weight::from_parts(32_074_000, 0) + // Minimum execution time: 30_229_000 picoseconds. + Weight::from_parts(30_630_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -384,8 +384,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 21_429_000 picoseconds. - Weight::from_parts(21_830_000, 0) + // Minimum execution time: 20_391_000 picoseconds. + Weight::from_parts(20_699_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -398,8 +398,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `461` // Estimated: `3643` - // Minimum execution time: 21_317_000 picoseconds. - Weight::from_parts(21_565_000, 0) + // Minimum execution time: 20_292_000 picoseconds. + Weight::from_parts(20_612_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -410,8 +410,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3517` - // Minimum execution time: 17_070_000 picoseconds. - Weight::from_parts(17_433_000, 0) + // Minimum execution time: 16_174_000 picoseconds. + Weight::from_parts(16_545_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -424,8 +424,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 17_943_000 picoseconds. - Weight::from_parts(18_307_000, 0) + // Minimum execution time: 16_955_000 picoseconds. + Weight::from_parts(17_337_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -438,8 +438,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `259` // Estimated: `3587` - // Minimum execution time: 17_872_000 picoseconds. - Weight::from_parts(18_029_000, 0) + // Minimum execution time: 16_901_000 picoseconds. + Weight::from_parts(17_127_000, 0) .saturating_add(Weight::from_parts(0, 3587)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -456,8 +456,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `540` // Estimated: `3643` - // Minimum execution time: 39_380_000 picoseconds. - Weight::from_parts(40_347_000, 0) + // Minimum execution time: 37_629_000 picoseconds. + Weight::from_parts(38_136_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_utility.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_utility.rs index 225e5cf0872..36d85b1e1fd 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_utility.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -53,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_460_000 picoseconds. - Weight::from_parts(8_335_963, 0) + // Minimum execution time: 6_865_000 picoseconds. + Weight::from_parts(10_920_777, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_566 - .saturating_add(Weight::from_parts(6_080_076, 0).saturating_mul(c.into())) + // Standard Error: 3_032 + .saturating_add(Weight::from_parts(5_314_717, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_272_000 picoseconds. - Weight::from_parts(6_403_000, 0) + // Minimum execution time: 5_642_000 picoseconds. + Weight::from_parts(5_867_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -72,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_570_000 picoseconds. - Weight::from_parts(18_080_572, 0) + // Minimum execution time: 6_829_000 picoseconds. + Weight::from_parts(9_153_009, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 5_851 - .saturating_add(Weight::from_parts(6_351_469, 0).saturating_mul(c.into())) + // Standard Error: 2_706 + .saturating_add(Weight::from_parts(5_583_934, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_413_000 picoseconds. - Weight::from_parts(10_584_000, 0) + // Minimum execution time: 9_503_000 picoseconds. + Weight::from_parts(9_779_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -91,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_470_000 picoseconds. - Weight::from_parts(4_574_861, 0) + // Minimum execution time: 6_781_000 picoseconds. + Weight::from_parts(9_714_832, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_330 - .saturating_add(Weight::from_parts(6_093_390, 0).saturating_mul(c.into())) + // Standard Error: 3_243 + .saturating_add(Weight::from_parts(5_320_789, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_xcm.rs index 4f4bb37d748..454b266f0c8 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_xcm.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -62,8 +62,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 29_342_000 picoseconds. - Weight::from_parts(29_952_000, 0) + // Minimum execution time: 28_412_000 picoseconds. + Weight::from_parts(28_911_000, 0) .saturating_add(Weight::from_parts(0, 3540)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -74,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 28_744_000 picoseconds. - Weight::from_parts(29_193_000, 0) + // Minimum execution time: 24_889_000 picoseconds. + Weight::from_parts(25_368_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -85,8 +85,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 21_757_000 picoseconds. - Weight::from_parts(22_088_000, 0) + // Minimum execution time: 19_085_000 picoseconds. + Weight::from_parts(19_812_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -106,8 +106,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_671_000 picoseconds. - Weight::from_parts(10_948_000, 0) + // Minimum execution time: 10_178_000 picoseconds. + Weight::from_parts(10_613_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -117,8 +117,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_132_000 picoseconds. - Weight::from_parts(3_374_000, 0) + // Minimum execution time: 3_328_000 picoseconds. + Weight::from_parts(3_498_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -142,8 +142,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 33_780_000 picoseconds. - Weight::from_parts(34_531_000, 0) + // Minimum execution time: 33_091_000 picoseconds. + Weight::from_parts(33_685_000, 0) .saturating_add(Weight::from_parts(0, 3540)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) @@ -166,8 +166,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `257` // Estimated: `3722` - // Minimum execution time: 35_215_000 picoseconds. - Weight::from_parts(35_685_000, 0) + // Minimum execution time: 35_012_000 picoseconds. + Weight::from_parts(35_720_000, 0) .saturating_add(Weight::from_parts(0, 3722)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) @@ -178,8 +178,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_252_000 picoseconds. - Weight::from_parts(3_392_000, 0) + // Minimum execution time: 3_359_000 picoseconds. + Weight::from_parts(3_490_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -189,8 +189,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `129` // Estimated: `11019` - // Minimum execution time: 17_330_000 picoseconds. - Weight::from_parts(17_730_000, 0) + // Minimum execution time: 17_077_000 picoseconds. + Weight::from_parts(17_773_000, 0) .saturating_add(Weight::from_parts(0, 11019)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -201,8 +201,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `133` // Estimated: `11023` - // Minimum execution time: 17_129_000 picoseconds. - Weight::from_parts(17_665_000, 0) + // Minimum execution time: 17_504_000 picoseconds. + Weight::from_parts(17_825_000, 0) .saturating_add(Weight::from_parts(0, 11023)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -213,8 +213,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `140` // Estimated: `13505` - // Minimum execution time: 18_220_000 picoseconds. - Weight::from_parts(18_764_000, 0) + // Minimum execution time: 17_921_000 picoseconds. + Weight::from_parts(18_470_000, 0) .saturating_add(Weight::from_parts(0, 13505)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -234,8 +234,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `142` // Estimated: `6082` - // Minimum execution time: 31_356_000 picoseconds. - Weight::from_parts(31_850_000, 0) + // Minimum execution time: 31_192_000 picoseconds. + Weight::from_parts(31_681_000, 0) .saturating_add(Weight::from_parts(0, 6082)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -246,8 +246,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `172` // Estimated: `8587` - // Minimum execution time: 9_299_000 picoseconds. - Weight::from_parts(9_515_000, 0) + // Minimum execution time: 9_176_000 picoseconds. + Weight::from_parts(9_507_000, 0) .saturating_add(Weight::from_parts(0, 8587)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -257,8 +257,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `140` // Estimated: `11030` - // Minimum execution time: 17_472_000 picoseconds. - Weight::from_parts(18_170_000, 0) + // Minimum execution time: 17_655_000 picoseconds. + Weight::from_parts(18_061_000, 0) .saturating_add(Weight::from_parts(0, 11030)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -279,8 +279,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `146` // Estimated: `11036` - // Minimum execution time: 39_134_000 picoseconds. - Weight::from_parts(39_847_000, 0) + // Minimum execution time: 38_001_000 picoseconds. + Weight::from_parts(38_395_000, 0) .saturating_add(Weight::from_parts(0, 11036)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index d5dae072099..997a2e2814f 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 27_006_000 picoseconds. - Weight::from_parts(27_426_000, 3593) + // Minimum execution time: 26_264_000 picoseconds. + Weight::from_parts(26_613_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 51_640_000 picoseconds. - Weight::from_parts(52_045_000, 6196) + // Minimum execution time: 50_109_000 picoseconds. + Weight::from_parts(50_611_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -88,8 +88,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `176` // Estimated: `6196` - // Minimum execution time: 75_401_000 picoseconds. - Weight::from_parts(75_956_000, 6196) + // Minimum execution time: 72_554_000 picoseconds. + Weight::from_parts(73_381_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_767_000 picoseconds. - Weight::from_parts(4_848_000, 0) + // Minimum execution time: 3_858_000 picoseconds. + Weight::from_parts(3_970_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 29_115_000 picoseconds. - Weight::from_parts(29_369_000, 3593) + // Minimum execution time: 26_650_000 picoseconds. + Weight::from_parts(27_186_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -129,8 +129,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3593` - // Minimum execution time: 54_197_000 picoseconds. - Weight::from_parts(54_906_000, 3593) + // Minimum execution time: 50_230_000 picoseconds. + Weight::from_parts(50_949_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -150,8 +150,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 33_366_000 picoseconds. - Weight::from_parts(33_874_000, 3540) + // Minimum execution time: 29_977_000 picoseconds. + Weight::from_parts(30_521_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index d2b1221476a..3bc1a9768fd 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -64,8 +64,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 473_259_000 picoseconds. - Weight::from_parts(474_680_000, 3540) + // Minimum execution time: 340_875_000 picoseconds. + Weight::from_parts(349_790_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_502_000 picoseconds. - Weight::from_parts(4_557_000, 0) + // Minimum execution time: 3_898_000 picoseconds. + Weight::from_parts(3_994_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `69` // Estimated: `3534` - // Minimum execution time: 11_743_000 picoseconds. - Weight::from_parts(12_010_000, 3534) + // Minimum execution time: 10_760_000 picoseconds. + Weight::from_parts(11_070_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 15_514_000 picoseconds. - Weight::from_parts(15_798_000, 0) + // Minimum execution time: 13_340_000 picoseconds. + Weight::from_parts(13_787_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_760_000 picoseconds. - Weight::from_parts(4_935_000, 0) + // Minimum execution time: 4_205_000 picoseconds. + Weight::from_parts(4_328_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_093_000 picoseconds. - Weight::from_parts(3_170_000, 0) + // Minimum execution time: 2_675_000 picoseconds. + Weight::from_parts(2_761_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_160_000 picoseconds. - Weight::from_parts(3_324_000, 0) + // Minimum execution time: 2_648_000 picoseconds. + Weight::from_parts(2_723_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_076_000 picoseconds. - Weight::from_parts(3_135_000, 0) + // Minimum execution time: 2_675_000 picoseconds. + Weight::from_parts(2_866_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_245_000 picoseconds. - Weight::from_parts(4_344_000, 0) + // Minimum execution time: 3_584_000 picoseconds. + Weight::from_parts(3_679_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_093_000 picoseconds. - Weight::from_parts(3_170_000, 0) + // Minimum execution time: 2_686_000 picoseconds. + Weight::from_parts(2_750_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -151,8 +151,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 27_368_000 picoseconds. - Weight::from_parts(27_731_000, 3540) + // Minimum execution time: 24_994_000 picoseconds. + Weight::from_parts(25_553_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `126` // Estimated: `3591` - // Minimum execution time: 17_634_000 picoseconds. - Weight::from_parts(18_068_000, 3591) + // Minimum execution time: 15_960_000 picoseconds. + Weight::from_parts(16_240_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_142_000 picoseconds. - Weight::from_parts(3_195_000, 0) + // Minimum execution time: 2_659_000 picoseconds. + Weight::from_parts(2_732_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -190,8 +190,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 28_784_000 picoseconds. - Weight::from_parts(29_246_000, 3540) + // Minimum execution time: 28_083_000 picoseconds. + Weight::from_parts(28_531_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_260_000 picoseconds. - Weight::from_parts(5_398_000, 0) + // Minimum execution time: 4_884_000 picoseconds. + Weight::from_parts(4_996_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -221,8 +221,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 528_849_000 picoseconds. - Weight::from_parts(530_923_000, 3540) + // Minimum execution time: 383_046_000 picoseconds. + Weight::from_parts(397_796_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 151_252_000 picoseconds. - Weight::from_parts(153_485_000, 0) + // Minimum execution time: 118_811_000 picoseconds. + Weight::from_parts(121_240_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 14_939_000 picoseconds. - Weight::from_parts(15_154_000, 0) + // Minimum execution time: 12_406_000 picoseconds. + Weight::from_parts(12_637_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_231_000 picoseconds. - Weight::from_parts(3_308_000, 0) + // Minimum execution time: 2_758_000 picoseconds. + Weight::from_parts(2_831_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_130_000 picoseconds. - Weight::from_parts(3_220_000, 0) + // Minimum execution time: 2_703_000 picoseconds. + Weight::from_parts(2_798_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_366_000 picoseconds. - Weight::from_parts(3_458_000, 0) + // Minimum execution time: 2_892_000 picoseconds. + Weight::from_parts(2_930_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -277,8 +277,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 31_212_000 picoseconds. - Weight::from_parts(31_656_000, 3540) + // Minimum execution time: 28_960_000 picoseconds. + Weight::from_parts(29_596_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_766_000 picoseconds. - Weight::from_parts(5_968_000, 0) + // Minimum execution time: 5_303_000 picoseconds. + Weight::from_parts(5_444_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -305,8 +305,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 27_754_000 picoseconds. - Weight::from_parts(28_064_000, 3540) + // Minimum execution time: 25_221_000 picoseconds. + Weight::from_parts(25_842_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_169_000 picoseconds. - Weight::from_parts(3_269_000, 0) + // Minimum execution time: 2_734_000 picoseconds. + Weight::from_parts(2_787_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_106_000 picoseconds. - Weight::from_parts(3_184_000, 0) + // Minimum execution time: 2_625_000 picoseconds. + Weight::from_parts(2_692_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_105_000 picoseconds. - Weight::from_parts(3_160_000, 0) + // Minimum execution time: 2_638_000 picoseconds. + Weight::from_parts(2_705_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_105_000 picoseconds. - Weight::from_parts(3_194_000, 0) + // Minimum execution time: 2_666_000 picoseconds. + Weight::from_parts(2_738_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_321_000 picoseconds. - Weight::from_parts(3_412_000, 0) + // Minimum execution time: 2_857_000 picoseconds. + Weight::from_parts(2_966_000, 0) } } diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs index 53147bb2324..81510fa1136 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_499_000 picoseconds. - Weight::from_parts(5_677_000, 0) + // Minimum execution time: 5_582_000 picoseconds. + Weight::from_parts(5_689_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_747_000 picoseconds. - Weight::from_parts(5_911_000, 0) + // Minimum execution time: 5_509_000 picoseconds. + Weight::from_parts(5_759_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_balances.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_balances.rs index a2623edff67..7dd91e63fdf 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_balances.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 52_756_000 picoseconds. - Weight::from_parts(53_298_000, 0) + // Minimum execution time: 53_598_000 picoseconds. + Weight::from_parts(54_155_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 40_071_000 picoseconds. - Weight::from_parts(40_563_000, 0) + // Minimum execution time: 40_406_000 picoseconds. + Weight::from_parts(40_873_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 15_936_000 picoseconds. - Weight::from_parts(16_317_000, 0) + // Minimum execution time: 15_391_000 picoseconds. + Weight::from_parts(15_785_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 22_750_000 picoseconds. - Weight::from_parts(23_053_000, 0) + // Minimum execution time: 22_234_000 picoseconds. + Weight::from_parts(22_635_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 54_270_000 picoseconds. - Weight::from_parts(54_857_000, 0) + // Minimum execution time: 54_846_000 picoseconds. + Weight::from_parts(55_311_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 49_155_000 picoseconds. - Weight::from_parts(49_567_000, 0) + // Minimum execution time: 49_697_000 picoseconds. + Weight::from_parts(50_079_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 18_651_000 picoseconds. - Weight::from_parts(19_007_000, 0) + // Minimum execution time: 18_390_000 picoseconds. + Weight::from_parts(18_601_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 18_523_000 picoseconds. - Weight::from_parts(18_943_000, 0) + // Minimum execution time: 17_844_000 picoseconds. + Weight::from_parts(18_052_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 11_771 - .saturating_add(Weight::from_parts(14_176_687, 0).saturating_mul(u.into())) + // Standard Error: 10_090 + .saturating_add(Weight::from_parts(13_977_021, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_collator_selection.rs index 9ac1b4a4444..f26fd83b17b 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_collator_selection.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -57,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` // Estimated: `1168 + b * (2554 ±0)` - // Minimum execution time: 15_000_000 picoseconds. - Weight::from_parts(14_942_281, 0) + // Minimum execution time: 14_980_000 picoseconds. + Weight::from_parts(14_771_757, 0) .saturating_add(Weight::from_parts(0, 1168)) - // Standard Error: 3_013 - .saturating_add(Weight::from_parts(2_673_944, 0).saturating_mul(b.into())) + // Standard Error: 3_716 + .saturating_add(Weight::from_parts(2_641_816, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -72,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_341_000 picoseconds. - Weight::from_parts(7_608_000, 0) + // Minimum execution time: 7_374_000 picoseconds. + Weight::from_parts(7_705_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -83,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_710_000 picoseconds. - Weight::from_parts(7_973_000, 0) + // Minimum execution time: 7_764_000 picoseconds. + Weight::from_parts(7_936_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,11 +105,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `1108 + c * (48 ±0)` // Estimated: `49487 + c * (49 ±0)` - // Minimum execution time: 42_547_000 picoseconds. - Weight::from_parts(35_070_051, 0) + // Minimum execution time: 42_370_000 picoseconds. + Weight::from_parts(35_043_461, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_231 - .saturating_add(Weight::from_parts(105_769, 0).saturating_mul(c.into())) + // Standard Error: 1_207 + .saturating_add(Weight::from_parts(106_062, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -123,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `452 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 33_828_000 picoseconds. - Weight::from_parts(23_360_256, 0) + // Minimum execution time: 33_605_000 picoseconds. + Weight::from_parts(23_203_974, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_294 - .saturating_add(Weight::from_parts(106_027, 0).saturating_mul(c.into())) + // Standard Error: 1_271 + .saturating_add(Weight::from_parts(106_769, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -141,8 +141,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 43_367_000 picoseconds. - Weight::from_parts(44_039_000, 0) + // Minimum execution time: 43_406_000 picoseconds. + Weight::from_parts(44_012_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) @@ -196,11 +196,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `22721 + c * (97 ±0) + r * (116 ±0)` // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 17_277_000 picoseconds. - Weight::from_parts(17_657_000, 0) + // Minimum execution time: 17_235_000 picoseconds. + Weight::from_parts(17_435_000, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 855_404 - .saturating_add(Weight::from_parts(30_433_186, 0).saturating_mul(c.into())) + // Standard Error: 847_163 + .saturating_add(Weight::from_parts(30_138_555, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_multisig.rs index 39367ac6b88..86cf695e867 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_multisig.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_556_000 picoseconds. - Weight::from_parts(11_977_075, 0) + // Minimum execution time: 11_495_000 picoseconds. + Weight::from_parts(11_941_097, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 1 - .saturating_add(Weight::from_parts(493, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(532, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -67,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `262 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 41_285_000 picoseconds. - Weight::from_parts(35_323_592, 0) + // Minimum execution time: 42_360_000 picoseconds. + Weight::from_parts(36_485_166, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 454 - .saturating_add(Weight::from_parts(64_841, 0).saturating_mul(s.into())) - // Standard Error: 4 - .saturating_add(Weight::from_parts(1_195, 0).saturating_mul(z.into())) + // Standard Error: 572 + .saturating_add(Weight::from_parts(63_611, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_226, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -85,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 27_217_000 picoseconds. - Weight::from_parts(21_829_864, 0) + // Minimum execution time: 28_202_000 picoseconds. + Weight::from_parts(22_787_062, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 473 - .saturating_add(Weight::from_parts(59_818, 0).saturating_mul(s.into())) - // Standard Error: 4 - .saturating_add(Weight::from_parts(1_179, 0).saturating_mul(z.into())) + // Standard Error: 369 + .saturating_add(Weight::from_parts(60_124, 0).saturating_mul(s.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_203, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,13 +105,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `385 + s * (33 ±0)` // Estimated: `6811` - // Minimum execution time: 46_235_000 picoseconds. - Weight::from_parts(38_643_321, 0) + // Minimum execution time: 47_308_000 picoseconds. + Weight::from_parts(39_699_574, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 484 - .saturating_add(Weight::from_parts(82_619, 0).saturating_mul(s.into())) + // Standard Error: 456 + .saturating_add(Weight::from_parts(81_841, 0).saturating_mul(s.into())) // Standard Error: 4 - .saturating_add(Weight::from_parts(1_223, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_257, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -122,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 31_827_000 picoseconds. - Weight::from_parts(33_743_065, 0) + // Minimum execution time: 32_514_000 picoseconds. + Weight::from_parts(34_143_424, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 669 - .saturating_add(Weight::from_parts(68_793, 0).saturating_mul(s.into())) + // Standard Error: 594 + .saturating_add(Weight::from_parts(70_761, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -137,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 19_148_000 picoseconds. - Weight::from_parts(20_211_716, 0) + // Minimum execution time: 19_413_000 picoseconds. + Weight::from_parts(20_545_498, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 376 - .saturating_add(Weight::from_parts(62_199, 0).saturating_mul(s.into())) + // Standard Error: 435 + .saturating_add(Weight::from_parts(62_293, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -152,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 32_770_000 picoseconds. - Weight::from_parts(34_731_111, 0) + // Minimum execution time: 32_795_000 picoseconds. + Weight::from_parts(34_829_791, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 761 - .saturating_add(Weight::from_parts(70_575, 0).saturating_mul(s.into())) + // Standard Error: 703 + .saturating_add(Weight::from_parts(69_968, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_nfts.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_nfts.rs index d2ca392417e..011af60e182 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_nfts.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_nfts.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_nfts` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -60,10 +60,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn create() -> Weight { // Proof Size summary in bytes: - // Measured: `145` + // Measured: `179` // Estimated: `3549` - // Minimum execution time: 39_589_000 picoseconds. - Weight::from_parts(40_305_000, 0) + // Minimum execution time: 39_242_000 picoseconds. + Weight::from_parts(39_979_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) @@ -80,10 +80,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn force_create() -> Weight { // Proof Size summary in bytes: - // Measured: `42` + // Measured: `76` // Estimated: `3549` - // Minimum execution time: 23_945_000 picoseconds. - Weight::from_parts(24_351_000, 0) + // Minimum execution time: 22_811_000 picoseconds. + Weight::from_parts(23_487_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) @@ -107,15 +107,17 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// The range of component `m` is `[0, 1000]`. /// The range of component `c` is `[0, 1000]`. /// The range of component `a` is `[0, 1000]`. - fn destroy(_m: u32, _c: u32, a: u32, ) -> Weight { + fn destroy(m: u32, _c: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `32170 + a * (366 ±0)` + // Measured: `32204 + a * (366 ±0)` // Estimated: `2523990 + a * (2954 ±0)` - // Minimum execution time: 992_533_000 picoseconds. - Weight::from_parts(941_813_359, 0) + // Minimum execution time: 1_008_270_000 picoseconds. + Weight::from_parts(949_754_969, 0) .saturating_add(Weight::from_parts(0, 2523990)) - // Standard Error: 3_954 - .saturating_add(Weight::from_parts(5_784_754, 0).saturating_mul(a.into())) + // Standard Error: 3_875 + .saturating_add(Weight::from_parts(7_023, 0).saturating_mul(m.into())) + // Standard Error: 3_875 + .saturating_add(Weight::from_parts(5_813_679, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(1004)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(1005)) @@ -136,10 +138,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn mint() -> Weight { // Proof Size summary in bytes: - // Measured: `421` + // Measured: `455` // Estimated: `4326` - // Minimum execution time: 49_305_000 picoseconds. - Weight::from_parts(50_143_000, 0) + // Minimum execution time: 49_850_000 picoseconds. + Weight::from_parts(50_181_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -158,10 +160,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) fn force_mint() -> Weight { // Proof Size summary in bytes: - // Measured: `421` + // Measured: `455` // Estimated: `4326` - // Minimum execution time: 48_627_000 picoseconds. - Weight::from_parts(48_954_000, 0) + // Minimum execution time: 48_785_000 picoseconds. + Weight::from_parts(49_386_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -184,16 +186,18 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn burn() -> Weight { // Proof Size summary in bytes: - // Measured: `530` + // Measured: `564` // Estimated: `4326` - // Minimum execution time: 49_958_000 picoseconds. - Weight::from_parts(50_387_000, 0) + // Minimum execution time: 50_001_000 picoseconds. + Weight::from_parts(50_295_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: Nfts Collection (r:1 w:0) /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1 w:0) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) @@ -208,12 +212,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `559` + // Measured: `593` // Estimated: `4326` - // Minimum execution time: 36_267_000 picoseconds. - Weight::from_parts(36_712_000, 0) + // Minimum execution time: 40_767_000 picoseconds. + Weight::from_parts(41_056_000, 0) .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: Nfts Collection (r:1 w:0) @@ -225,13 +229,13 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// The range of component `i` is `[0, 5000]`. fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `729 + i * (108 ±0)` + // Measured: `763 + i * (108 ±0)` // Estimated: `3549 + i * (3336 ±0)` - // Minimum execution time: 17_738_000 picoseconds. - Weight::from_parts(17_801_000, 0) + // Minimum execution time: 17_346_000 picoseconds. + Weight::from_parts(17_545_000, 0) .saturating_add(Weight::from_parts(0, 3549)) - // Standard Error: 13_596 - .saturating_add(Weight::from_parts(15_695_790, 0).saturating_mul(i.into())) + // Standard Error: 13_113 + .saturating_add(Weight::from_parts(15_650_659, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) @@ -243,10 +247,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) fn lock_item_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `401` + // Measured: `435` // Estimated: `3534` - // Minimum execution time: 20_845_000 picoseconds. - Weight::from_parts(21_133_000, 0) + // Minimum execution time: 20_978_000 picoseconds. + Weight::from_parts(21_261_000, 0) .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -257,10 +261,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) fn unlock_item_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `401` + // Measured: `435` // Estimated: `3534` - // Minimum execution time: 20_862_000 picoseconds. - Weight::from_parts(21_105_000, 0) + // Minimum execution time: 20_612_000 picoseconds. + Weight::from_parts(21_057_000, 0) .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -271,10 +275,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn lock_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `306` + // Measured: `340` // Estimated: `3549` - // Minimum execution time: 18_196_000 picoseconds. - Weight::from_parts(18_333_000, 0) + // Minimum execution time: 18_161_000 picoseconds. + Weight::from_parts(18_387_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -287,10 +291,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `354` + // Measured: `388` // Estimated: `3549` - // Minimum execution time: 24_025_000 picoseconds. - Weight::from_parts(24_277_000, 0) + // Minimum execution time: 23_737_000 picoseconds. + Weight::from_parts(24_195_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -301,10 +305,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn set_team() -> Weight { // Proof Size summary in bytes: - // Measured: `335` + // Measured: `369` // Estimated: `6078` - // Minimum execution time: 40_974_000 picoseconds. - Weight::from_parts(41_706_000, 0) + // Minimum execution time: 40_987_000 picoseconds. + Weight::from_parts(42_056_000, 0) .saturating_add(Weight::from_parts(0, 6078)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(5)) @@ -315,10 +319,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) fn force_collection_owner() -> Weight { // Proof Size summary in bytes: - // Measured: `277` + // Measured: `311` // Estimated: `3549` - // Minimum execution time: 19_044_000 picoseconds. - Weight::from_parts(19_465_000, 0) + // Minimum execution time: 18_644_000 picoseconds. + Weight::from_parts(18_987_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) @@ -329,10 +333,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn force_collection_config() -> Weight { // Proof Size summary in bytes: - // Measured: `242` + // Measured: `276` // Estimated: `3549` - // Minimum execution time: 15_591_000 picoseconds. - Weight::from_parts(15_858_000, 0) + // Minimum execution time: 15_356_000 picoseconds. + Weight::from_parts(15_548_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -343,10 +347,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) fn lock_item_properties() -> Weight { // Proof Size summary in bytes: - // Measured: `401` + // Measured: `435` // Estimated: `3534` - // Minimum execution time: 20_831_000 picoseconds. - Weight::from_parts(21_121_000, 0) + // Minimum execution time: 20_805_000 picoseconds. + Weight::from_parts(21_023_000, 0) .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -363,10 +367,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) fn set_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `505` + // Measured: `539` // Estimated: `3944` - // Minimum execution time: 50_650_000 picoseconds. - Weight::from_parts(51_315_000, 0) + // Minimum execution time: 50_508_000 picoseconds. + Weight::from_parts(50_955_000, 0) .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -377,10 +381,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) fn force_set_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `310` + // Measured: `344` // Estimated: `3944` - // Minimum execution time: 28_244_000 picoseconds. - Weight::from_parts(28_627_000, 0) + // Minimum execution time: 27_790_000 picoseconds. + Weight::from_parts(28_096_000, 0) .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -395,10 +399,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) fn clear_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `949` + // Measured: `983` // Estimated: `3944` - // Minimum execution time: 47_299_000 picoseconds. - Weight::from_parts(47_921_000, 0) + // Minimum execution time: 47_390_000 picoseconds. + Weight::from_parts(47_933_000, 0) .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -409,10 +413,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(1001), added: 3476, mode: MaxEncodedLen) fn approve_item_attributes() -> Weight { // Proof Size summary in bytes: - // Measured: `347` + // Measured: `381` // Estimated: `4466` - // Minimum execution time: 19_400_000 picoseconds. - Weight::from_parts(19_601_000, 0) + // Minimum execution time: 19_011_000 picoseconds. + Weight::from_parts(19_334_000, 0) .saturating_add(Weight::from_parts(0, 4466)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -428,13 +432,13 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// The range of component `n` is `[0, 1000]`. fn cancel_item_attributes_approval(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `726 + n * (398 ±0)` + // Measured: `760 + n * (398 ±0)` // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 28_552_000 picoseconds. - Weight::from_parts(28_822_000, 0) + // Minimum execution time: 28_418_000 picoseconds. + Weight::from_parts(28_675_000, 0) .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 3_265 - .saturating_add(Weight::from_parts(5_570_824, 0).saturating_mul(n.into())) + // Standard Error: 3_721 + .saturating_add(Weight::from_parts(5_652_766, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) @@ -453,10 +457,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(347), added: 2822, mode: MaxEncodedLen) fn set_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `505` + // Measured: `539` // Estimated: `3812` - // Minimum execution time: 42_425_000 picoseconds. - Weight::from_parts(42_883_000, 0) + // Minimum execution time: 42_204_000 picoseconds. + Weight::from_parts(42_653_000, 0) .saturating_add(Weight::from_parts(0, 3812)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -471,10 +475,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `815` + // Measured: `849` // Estimated: `3812` - // Minimum execution time: 40_219_000 picoseconds. - Weight::from_parts(41_709_000, 0) + // Minimum execution time: 40_302_000 picoseconds. + Weight::from_parts(40_764_000, 0) .saturating_add(Weight::from_parts(0, 3812)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -489,10 +493,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(294), added: 2769, mode: MaxEncodedLen) fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `364` + // Measured: `398` // Estimated: `3759` - // Minimum execution time: 39_376_000 picoseconds. - Weight::from_parts(39_895_000, 0) + // Minimum execution time: 39_557_000 picoseconds. + Weight::from_parts(39_873_000, 0) .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -507,10 +511,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(294), added: 2769, mode: MaxEncodedLen) fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `682` + // Measured: `716` // Estimated: `3759` - // Minimum execution time: 38_414_000 picoseconds. - Weight::from_parts(38_627_000, 0) + // Minimum execution time: 37_964_000 picoseconds. + Weight::from_parts(38_410_000, 0) .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -521,10 +525,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn approve_transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `376` + // Measured: `410` // Estimated: `4326` - // Minimum execution time: 22_896_000 picoseconds. - Weight::from_parts(23_137_000, 0) + // Minimum execution time: 22_516_000 picoseconds. + Weight::from_parts(22_843_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -533,10 +537,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) fn cancel_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `384` + // Measured: `418` // Estimated: `4326` - // Minimum execution time: 20_602_000 picoseconds. - Weight::from_parts(20_869_000, 0) + // Minimum execution time: 20_051_000 picoseconds. + Weight::from_parts(20_396_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -545,10 +549,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) fn clear_all_transfer_approvals() -> Weight { // Proof Size summary in bytes: - // Measured: `384` + // Measured: `418` // Estimated: `4326` - // Minimum execution time: 19_415_000 picoseconds. - Weight::from_parts(19_594_000, 0) + // Minimum execution time: 19_044_000 picoseconds. + Weight::from_parts(19_380_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -557,10 +561,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts OwnershipAcceptance (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) fn set_accept_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `42` + // Measured: `76` // Estimated: `3517` - // Minimum execution time: 16_784_000 picoseconds. - Weight::from_parts(17_133_000, 0) + // Minimum execution time: 16_713_000 picoseconds. + Weight::from_parts(16_965_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -571,10 +575,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: - // Measured: `306` + // Measured: `340` // Estimated: `3549` - // Minimum execution time: 20_391_000 picoseconds. - Weight::from_parts(20_710_000, 0) + // Minimum execution time: 20_309_000 picoseconds. + Weight::from_parts(20_536_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -585,10 +589,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn update_mint_settings() -> Weight { // Proof Size summary in bytes: - // Measured: `289` + // Measured: `323` // Estimated: `3538` - // Minimum execution time: 19_989_000 picoseconds. - Weight::from_parts(20_179_000, 0) + // Minimum execution time: 19_927_000 picoseconds. + Weight::from_parts(20_342_000, 0) .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -603,10 +607,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn set_price() -> Weight { // Proof Size summary in bytes: - // Measured: `484` + // Measured: `518` // Estimated: `4326` - // Minimum execution time: 24_308_000 picoseconds. - Weight::from_parts(24_721_000, 0) + // Minimum execution time: 25_179_000 picoseconds. + Weight::from_parts(25_440_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -617,6 +621,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1 w:0) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) @@ -627,12 +633,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn buy_item() -> Weight { // Proof Size summary in bytes: - // Measured: `671` + // Measured: `705` // Estimated: `4326` - // Minimum execution time: 45_626_000 picoseconds. - Weight::from_parts(46_030_000, 0) + // Minimum execution time: 50_407_000 picoseconds. + Weight::from_parts(50_878_000, 0) .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(5)) } /// The range of component `n` is `[0, 10]`. @@ -640,11 +646,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_654_000 picoseconds. - Weight::from_parts(4_301_940, 0) + // Minimum execution time: 2_590_000 picoseconds. + Weight::from_parts(4_219_244, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 9_223 - .saturating_add(Weight::from_parts(3_945_966, 0).saturating_mul(n.into())) + // Standard Error: 9_402 + .saturating_add(Weight::from_parts(3_693_213, 0).saturating_mul(n.into())) } /// Storage: Nfts Item (r:2 w:0) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) @@ -652,10 +658,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn create_swap() -> Weight { // Proof Size summary in bytes: - // Measured: `460` + // Measured: `494` // Estimated: `7662` - // Minimum execution time: 23_071_000 picoseconds. - Weight::from_parts(23_535_000, 0) + // Minimum execution time: 22_440_000 picoseconds. + Weight::from_parts(22_872_000, 0) .saturating_add(Weight::from_parts(0, 7662)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -666,10 +672,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) fn cancel_swap() -> Weight { // Proof Size summary in bytes: - // Measured: `479` + // Measured: `513` // Estimated: `4326` - // Minimum execution time: 21_554_000 picoseconds. - Weight::from_parts(21_941_000, 0) + // Minimum execution time: 21_391_000 picoseconds. + Weight::from_parts(21_718_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -680,6 +686,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:2 w:0) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:2 w:0) @@ -690,12 +698,12 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn claim_swap() -> Weight { // Proof Size summary in bytes: - // Measured: `800` + // Measured: `834` // Estimated: `7662` - // Minimum execution time: 74_272_000 picoseconds. - Weight::from_parts(75_374_000, 0) + // Minimum execution time: 82_838_000 picoseconds. + Weight::from_parts(83_842_000, 0) .saturating_add(Weight::from_parts(0, 7662)) - .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(10)) } /// Storage: Nfts CollectionRoleOf (r:2 w:0) @@ -719,13 +727,13 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// The range of component `n` is `[0, 10]`. fn mint_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `524` + // Measured: `558` // Estimated: `6078 + n * (2954 ±0)` - // Minimum execution time: 133_545_000 picoseconds. - Weight::from_parts(137_797_962, 0) + // Minimum execution time: 133_585_000 picoseconds. + Weight::from_parts(138_200_829, 0) .saturating_add(Weight::from_parts(0, 6078)) - // Standard Error: 33_124 - .saturating_add(Weight::from_parts(29_785_862, 0).saturating_mul(n.into())) + // Standard Error: 24_914 + .saturating_add(Weight::from_parts(29_531_886, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6)) @@ -747,13 +755,13 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// The range of component `n` is `[0, 10]`. fn set_attributes_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `554` + // Measured: `588` // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 77_475_000 picoseconds. - Weight::from_parts(88_353_947, 0) + // Minimum execution time: 77_015_000 picoseconds. + Weight::from_parts(87_887_301, 0) .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 60_491 - .saturating_add(Weight::from_parts(29_507_037, 0).saturating_mul(n.into())) + // Standard Error: 60_927 + .saturating_add(Weight::from_parts(29_146_930, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_proxy.rs index 5ffc4b30df3..433c4a8bcc4 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_proxy.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -55,11 +55,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 16_736_000 picoseconds. - Weight::from_parts(17_180_115, 0) + // Minimum execution time: 16_918_000 picoseconds. + Weight::from_parts(17_287_335, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 616 - .saturating_add(Weight::from_parts(29_847, 0).saturating_mul(p.into())) + // Standard Error: 666 + .saturating_add(Weight::from_parts(31_973, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -74,13 +74,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 38_677_000 picoseconds. - Weight::from_parts(38_332_966, 0) + // Minimum execution time: 38_674_000 picoseconds. + Weight::from_parts(38_274_665, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_354 - .saturating_add(Weight::from_parts(134_195, 0).saturating_mul(a.into())) - // Standard Error: 1_399 - .saturating_add(Weight::from_parts(37_946, 0).saturating_mul(p.into())) + // Standard Error: 1_237 + .saturating_add(Weight::from_parts(138_094, 0).saturating_mul(a.into())) + // Standard Error: 1_278 + .saturating_add(Weight::from_parts(39_024, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -94,13 +94,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 25_593_000 picoseconds. - Weight::from_parts(26_236_639, 0) + // Minimum execution time: 25_185_000 picoseconds. + Weight::from_parts(25_535_225, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_160 - .saturating_add(Weight::from_parts(129_362, 0).saturating_mul(a.into())) - // Standard Error: 1_199 - .saturating_add(Weight::from_parts(8_687, 0).saturating_mul(p.into())) + // Standard Error: 1_084 + .saturating_add(Weight::from_parts(136_564, 0).saturating_mul(a.into())) + // Standard Error: 1_120 + .saturating_add(Weight::from_parts(12_707, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -114,13 +114,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 25_596_000 picoseconds. - Weight::from_parts(25_854_867, 0) + // Minimum execution time: 25_221_000 picoseconds. + Weight::from_parts(25_590_585, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_372 - .saturating_add(Weight::from_parts(137_697, 0).saturating_mul(a.into())) - // Standard Error: 1_417 - .saturating_add(Weight::from_parts(14_082, 0).saturating_mul(p.into())) + // Standard Error: 1_052 + .saturating_add(Weight::from_parts(138_590, 0).saturating_mul(a.into())) + // Standard Error: 1_087 + .saturating_add(Weight::from_parts(8_904, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -136,13 +136,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `386 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 35_255_000 picoseconds. - Weight::from_parts(34_659_291, 0) + // Minimum execution time: 34_734_000 picoseconds. + Weight::from_parts(34_221_807, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_072 - .saturating_add(Weight::from_parts(126_577, 0).saturating_mul(a.into())) - // Standard Error: 1_107 - .saturating_add(Weight::from_parts(41_124, 0).saturating_mul(p.into())) + // Standard Error: 1_181 + .saturating_add(Weight::from_parts(129_837, 0).saturating_mul(a.into())) + // Standard Error: 1_220 + .saturating_add(Weight::from_parts(39_750, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -153,11 +153,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 26_245_000 picoseconds. - Weight::from_parts(26_910_616, 0) + // Minimum execution time: 25_941_000 picoseconds. + Weight::from_parts(26_592_291, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_107 - .saturating_add(Weight::from_parts(54_705, 0).saturating_mul(p.into())) + // Standard Error: 937 + .saturating_add(Weight::from_parts(51_915, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -168,11 +168,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 26_080_000 picoseconds. - Weight::from_parts(27_081_618, 0) + // Minimum execution time: 25_923_000 picoseconds. + Weight::from_parts(26_787_019, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_644 - .saturating_add(Weight::from_parts(53_919, 0).saturating_mul(p.into())) + // Standard Error: 1_562 + .saturating_add(Weight::from_parts(58_776, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -183,11 +183,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_191_000 picoseconds. - Weight::from_parts(23_827_934, 0) + // Minimum execution time: 22_908_000 picoseconds. + Weight::from_parts(23_854_629, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_078 - .saturating_add(Weight::from_parts(28_417, 0).saturating_mul(p.into())) + // Standard Error: 5_136 + .saturating_add(Weight::from_parts(32_465, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -198,11 +198,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `139` // Estimated: `4706` - // Minimum execution time: 27_895_000 picoseconds. - Weight::from_parts(28_599_042, 0) + // Minimum execution time: 27_585_000 picoseconds. + Weight::from_parts(28_380_794, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 953 - .saturating_add(Weight::from_parts(12_641, 0).saturating_mul(p.into())) + // Standard Error: 755 + .saturating_add(Weight::from_parts(10_118, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -213,11 +213,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `164 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 24_395_000 picoseconds. - Weight::from_parts(24_924_060, 0) + // Minimum execution time: 24_123_000 picoseconds. + Weight::from_parts(24_704_742, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 720 - .saturating_add(Weight::from_parts(27_470, 0).saturating_mul(p.into())) + // Standard Error: 680 + .saturating_add(Weight::from_parts(29_566, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_session.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_session.rs index 9d7ea753c7c..cedb152c09e 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_session.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `270` // Estimated: `3735` - // Minimum execution time: 17_271_000 picoseconds. - Weight::from_parts(17_533_000, 0) + // Minimum execution time: 17_602_000 picoseconds. + Weight::from_parts(18_067_000, 0) .saturating_add(Weight::from_parts(0, 3735)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,8 +70,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `242` // Estimated: `3707` - // Minimum execution time: 13_077_000 picoseconds. - Weight::from_parts(13_283_000, 0) + // Minimum execution time: 13_189_000 picoseconds. + Weight::from_parts(13_413_000, 0) .saturating_add(Weight::from_parts(0, 3707)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_timestamp.rs index e6d26cbfaa4..a2cc622a039 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_timestamp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `86` // Estimated: `1493` - // Minimum execution time: 9_418_000 picoseconds. - Weight::from_parts(9_665_000, 0) + // Minimum execution time: 9_075_000 picoseconds. + Weight::from_parts(9_252_000, 0) .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_266_000 picoseconds. - Weight::from_parts(3_386_000, 0) + // Minimum execution time: 3_167_000 picoseconds. + Weight::from_parts(3_293_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_uniques.rs index 583e54840b8..d99522e7e52 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_uniques.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_uniques` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3643` - // Minimum execution time: 30_269_000 picoseconds. - Weight::from_parts(30_661_000, 0) + // Minimum execution time: 30_359_000 picoseconds. + Weight::from_parts(30_900_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,8 +70,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3643` - // Minimum execution time: 14_801_000 picoseconds. - Weight::from_parts(15_041_000, 0) + // Minimum execution time: 14_650_000 picoseconds. + Weight::from_parts(14_899_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -99,15 +99,15 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `257 + a * (107 ±0) + m * (56 ±0) + n * (76 ±0)` // Estimated: `3643 + a * (2647 ±0) + m * (2662 ±0) + n * (2597 ±0)` - // Minimum execution time: 2_439_268_000 picoseconds. - Weight::from_parts(2_450_670_000, 0) + // Minimum execution time: 2_396_572_000 picoseconds. + Weight::from_parts(2_413_348_000, 0) .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 24_972 - .saturating_add(Weight::from_parts(6_281_799, 0).saturating_mul(n.into())) - // Standard Error: 24_972 - .saturating_add(Weight::from_parts(245_622, 0).saturating_mul(m.into())) - // Standard Error: 24_972 - .saturating_add(Weight::from_parts(345_135, 0).saturating_mul(a.into())) + // Standard Error: 24_476 + .saturating_add(Weight::from_parts(6_224_926, 0).saturating_mul(n.into())) + // Standard Error: 24_476 + .saturating_add(Weight::from_parts(252_975, 0).saturating_mul(m.into())) + // Standard Error: 24_476 + .saturating_add(Weight::from_parts(333_637, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) @@ -132,8 +132,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 36_449_000 picoseconds. - Weight::from_parts(36_816_000, 0) + // Minimum execution time: 36_494_000 picoseconds. + Weight::from_parts(36_988_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -150,8 +150,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 37_704_000 picoseconds. - Weight::from_parts(38_102_000, 0) + // Minimum execution time: 37_659_000 picoseconds. + Weight::from_parts(38_296_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -168,8 +168,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 26_986_000 picoseconds. - Weight::from_parts(27_427_000, 0) + // Minimum execution time: 26_933_000 picoseconds. + Weight::from_parts(27_327_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -183,11 +183,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `738 + i * (76 ±0)` // Estimated: `3643 + i * (2597 ±0)` - // Minimum execution time: 15_664_000 picoseconds. - Weight::from_parts(15_788_000, 0) + // Minimum execution time: 15_444_000 picoseconds. + Weight::from_parts(15_547_000, 0) .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 12_408 - .saturating_add(Weight::from_parts(15_388_354, 0).saturating_mul(i.into())) + // Standard Error: 13_661 + .saturating_add(Weight::from_parts(15_215_524, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -202,8 +202,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 19_399_000 picoseconds. - Weight::from_parts(19_658_000, 0) + // Minimum execution time: 19_485_000 picoseconds. + Weight::from_parts(19_662_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -216,8 +216,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 19_300_000 picoseconds. - Weight::from_parts(19_511_000, 0) + // Minimum execution time: 19_229_000 picoseconds. + Weight::from_parts(19_472_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -228,8 +228,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 14_407_000 picoseconds. - Weight::from_parts(14_748_000, 0) + // Minimum execution time: 14_393_000 picoseconds. + Weight::from_parts(14_773_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -240,8 +240,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 14_376_000 picoseconds. - Weight::from_parts(14_785_000, 0) + // Minimum execution time: 14_292_000 picoseconds. + Weight::from_parts(14_687_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -256,8 +256,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `356` // Estimated: `3643` - // Minimum execution time: 22_832_000 picoseconds. - Weight::from_parts(23_065_000, 0) + // Minimum execution time: 22_904_000 picoseconds. + Weight::from_parts(23_221_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -268,8 +268,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 15_379_000 picoseconds. - Weight::from_parts(15_798_000, 0) + // Minimum execution time: 15_406_000 picoseconds. + Weight::from_parts(15_881_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -282,8 +282,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 17_345_000 picoseconds. - Weight::from_parts(17_747_000, 0) + // Minimum execution time: 17_530_000 picoseconds. + Weight::from_parts(18_137_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -298,8 +298,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `559` // Estimated: `3652` - // Minimum execution time: 40_047_000 picoseconds. - Weight::from_parts(40_494_000, 0) + // Minimum execution time: 40_556_000 picoseconds. + Weight::from_parts(41_098_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -314,8 +314,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `756` // Estimated: `3652` - // Minimum execution time: 39_254_000 picoseconds. - Weight::from_parts(39_689_000, 0) + // Minimum execution time: 38_924_000 picoseconds. + Weight::from_parts(39_677_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -328,8 +328,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `348` // Estimated: `3652` - // Minimum execution time: 31_189_000 picoseconds. - Weight::from_parts(31_431_000, 0) + // Minimum execution time: 31_466_000 picoseconds. + Weight::from_parts(32_020_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -342,8 +342,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `559` // Estimated: `3652` - // Minimum execution time: 31_868_000 picoseconds. - Weight::from_parts(32_476_000, 0) + // Minimum execution time: 31_880_000 picoseconds. + Weight::from_parts(32_386_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -356,8 +356,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 32_587_000 picoseconds. - Weight::from_parts(32_913_000, 0) + // Minimum execution time: 32_995_000 picoseconds. + Weight::from_parts(33_393_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -370,8 +370,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `473` // Estimated: `3643` - // Minimum execution time: 30_951_000 picoseconds. - Weight::from_parts(31_269_000, 0) + // Minimum execution time: 30_666_000 picoseconds. + Weight::from_parts(31_009_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -384,8 +384,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 20_550_000 picoseconds. - Weight::from_parts(20_880_000, 0) + // Minimum execution time: 20_706_000 picoseconds. + Weight::from_parts(21_146_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -398,8 +398,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `461` // Estimated: `3643` - // Minimum execution time: 20_593_000 picoseconds. - Weight::from_parts(20_816_000, 0) + // Minimum execution time: 20_681_000 picoseconds. + Weight::from_parts(21_024_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -410,8 +410,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3517` - // Minimum execution time: 16_290_000 picoseconds. - Weight::from_parts(16_841_000, 0) + // Minimum execution time: 16_501_000 picoseconds. + Weight::from_parts(16_736_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -424,8 +424,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 17_538_000 picoseconds. - Weight::from_parts(17_775_000, 0) + // Minimum execution time: 17_273_000 picoseconds. + Weight::from_parts(17_518_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -438,8 +438,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `259` // Estimated: `3587` - // Minimum execution time: 17_311_000 picoseconds. - Weight::from_parts(17_495_000, 0) + // Minimum execution time: 17_061_000 picoseconds. + Weight::from_parts(17_376_000, 0) .saturating_add(Weight::from_parts(0, 3587)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -456,8 +456,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `540` // Estimated: `3643` - // Minimum execution time: 37_556_000 picoseconds. - Weight::from_parts(38_050_000, 0) + // Minimum execution time: 37_517_000 picoseconds. + Weight::from_parts(38_117_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_utility.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_utility.rs index fecc38e475a..d165e337d65 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_utility.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -53,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_223_000 picoseconds. - Weight::from_parts(9_533_894, 0) + // Minimum execution time: 6_788_000 picoseconds. + Weight::from_parts(5_372_028, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_912 - .saturating_add(Weight::from_parts(4_539_292, 0).saturating_mul(c.into())) + // Standard Error: 2_689 + .saturating_add(Weight::from_parts(5_478_512, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_345_000 picoseconds. - Weight::from_parts(5_436_000, 0) + // Minimum execution time: 5_852_000 picoseconds. + Weight::from_parts(5_999_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -72,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_096_000 picoseconds. - Weight::from_parts(10_872_600, 0) + // Minimum execution time: 6_799_000 picoseconds. + Weight::from_parts(4_624_255, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_654 - .saturating_add(Weight::from_parts(4_834_319, 0).saturating_mul(c.into())) + // Standard Error: 3_340 + .saturating_add(Weight::from_parts(5_722_236, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_519_000 picoseconds. - Weight::from_parts(9_776_000, 0) + // Minimum execution time: 9_484_000 picoseconds. + Weight::from_parts(9_774_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -91,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_149_000 picoseconds. - Weight::from_parts(17_125_597, 0) + // Minimum execution time: 6_900_000 picoseconds. + Weight::from_parts(7_048_527, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_120 - .saturating_add(Weight::from_parts(4_553_744, 0).saturating_mul(c.into())) + // Standard Error: 3_199 + .saturating_add(Weight::from_parts(5_473_463, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_xcm.rs index d31ebcfe719..ff1e88f454e 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_xcm.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -60,11 +60,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn send() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 26_503_000 picoseconds. - Weight::from_parts(26_786_000, 0) - .saturating_add(Weight::from_parts(0, 3503)) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 29_223_000 picoseconds. + Weight::from_parts(29_633_000, 0) + .saturating_add(Weight::from_parts(0, 3574)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -74,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 25_005_000 picoseconds. - Weight::from_parts(25_355_000, 0) + // Minimum execution time: 24_692_000 picoseconds. + Weight::from_parts(25_226_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -85,8 +85,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 19_585_000 picoseconds. - Weight::from_parts(19_921_000, 0) + // Minimum execution time: 19_046_000 picoseconds. + Weight::from_parts(19_397_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -96,8 +96,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) + // Minimum execution time: 9_714_000 picoseconds. + Weight::from_parts(9_898_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: PolkadotXcm SupportedVersion (r:0 w:1) @@ -106,8 +106,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_923_000 picoseconds. - Weight::from_parts(10_123_000, 0) + // Minimum execution time: 9_725_000 picoseconds. + Weight::from_parts(9_957_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -117,8 +117,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_048_000 picoseconds. - Weight::from_parts(3_226_000, 0) + // Minimum execution time: 3_039_000 picoseconds. + Weight::from_parts(3_217_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -140,11 +140,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 30_761_000 picoseconds. - Weight::from_parts(31_177_000, 0) - .saturating_add(Weight::from_parts(0, 3503)) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 32_070_000 picoseconds. + Weight::from_parts(32_967_000, 0) + .saturating_add(Weight::from_parts(0, 3574)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -164,11 +164,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `220` - // Estimated: `3685` - // Minimum execution time: 33_124_000 picoseconds. - Weight::from_parts(33_531_000, 0) - .saturating_add(Weight::from_parts(0, 3685)) + // Measured: `291` + // Estimated: `3756` + // Minimum execution time: 33_377_000 picoseconds. + Weight::from_parts(34_165_000, 0) + .saturating_add(Weight::from_parts(0, 3756)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -178,8 +178,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_119_000 picoseconds. - Weight::from_parts(3_353_000, 0) + // Minimum execution time: 3_171_000 picoseconds. + Weight::from_parts(3_293_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -187,11 +187,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `10985` - // Minimum execution time: 14_497_000 picoseconds. - Weight::from_parts(14_785_000, 0) - .saturating_add(Weight::from_parts(0, 10985)) + // Measured: `162` + // Estimated: `11052` + // Minimum execution time: 16_609_000 picoseconds. + Weight::from_parts(16_950_000, 0) + .saturating_add(Weight::from_parts(0, 11052)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -199,11 +199,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `10989` - // Minimum execution time: 14_846_000 picoseconds. - Weight::from_parts(15_064_000, 0) - .saturating_add(Weight::from_parts(0, 10989)) + // Measured: `166` + // Estimated: `11056` + // Minimum execution time: 16_545_000 picoseconds. + Weight::from_parts(17_052_000, 0) + .saturating_add(Weight::from_parts(0, 11056)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -211,11 +211,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn already_notified_target() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `13471` - // Minimum execution time: 15_346_000 picoseconds. - Weight::from_parts(15_580_000, 0) - .saturating_add(Weight::from_parts(0, 13471)) + // Measured: `173` + // Estimated: `13538` + // Minimum execution time: 17_442_000 picoseconds. + Weight::from_parts(17_766_000, 0) + .saturating_add(Weight::from_parts(0, 13538)) .saturating_add(T::DbWeight::get().reads(5)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) @@ -232,11 +232,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn notify_current_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `6046` - // Minimum execution time: 29_631_000 picoseconds. - Weight::from_parts(30_224_000, 0) - .saturating_add(Weight::from_parts(0, 6046)) + // Measured: `176` + // Estimated: `6116` + // Minimum execution time: 30_075_000 picoseconds. + Weight::from_parts(30_744_000, 0) + .saturating_add(Weight::from_parts(0, 6116)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -244,22 +244,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: - // Measured: `136` - // Estimated: `8551` - // Minimum execution time: 8_203_000 picoseconds. - Weight::from_parts(8_380_000, 0) - .saturating_add(Weight::from_parts(0, 8551)) + // Measured: `206` + // Estimated: `8621` + // Minimum execution time: 8_683_000 picoseconds. + Weight::from_parts(8_979_000, 0) + .saturating_add(Weight::from_parts(0, 8621)) .saturating_add(T::DbWeight::get().reads(3)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10996` - // Minimum execution time: 15_138_000 picoseconds. - Weight::from_parts(15_396_000, 0) - .saturating_add(Weight::from_parts(0, 10996)) + // Measured: `173` + // Estimated: `11063` + // Minimum execution time: 16_960_000 picoseconds. + Weight::from_parts(17_519_000, 0) + .saturating_add(Weight::from_parts(0, 11063)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -277,11 +277,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `112` - // Estimated: `11002` - // Minimum execution time: 34_941_000 picoseconds. - Weight::from_parts(35_810_000, 0) - .saturating_add(Weight::from_parts(0, 11002)) + // Measured: `179` + // Estimated: `11069` + // Minimum execution time: 37_173_000 picoseconds. + Weight::from_parts(37_506_000, 0) + .saturating_add(Weight::from_parts(0, 11069)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 474a93465a9..8dfc7b2d84d 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 25_798_000 picoseconds. - Weight::from_parts(26_063_000, 3593) + // Minimum execution time: 25_619_000 picoseconds. + Weight::from_parts(26_283_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 48_637_000 picoseconds. - Weight::from_parts(49_176_000, 6196) + // Minimum execution time: 48_538_000 picoseconds. + Weight::from_parts(49_245_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -86,10 +86,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `139` + // Measured: `176` // Estimated: `6196` - // Minimum execution time: 69_969_000 picoseconds. - Weight::from_parts(70_663_000, 6196) + // Minimum execution time: 70_133_000 picoseconds. + Weight::from_parts(70_675_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_909_000 picoseconds. - Weight::from_parts(4_060_000, 0) + // Minimum execution time: 3_765_000 picoseconds. + Weight::from_parts(3_860_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 26_306_000 picoseconds. - Weight::from_parts(26_822_000, 3593) + // Minimum execution time: 26_210_000 picoseconds. + Weight::from_parts(26_602_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -127,10 +127,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `38` + // Measured: `75` // Estimated: `3593` - // Minimum execution time: 48_829_000 picoseconds. - Weight::from_parts(49_277_000, 3593) + // Minimum execution time: 50_179_000 picoseconds. + Weight::from_parts(50_814_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -148,10 +148,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 28_753_000 picoseconds. - Weight::from_parts(29_256_000, 3503) + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 29_986_000 picoseconds. + Weight::from_parts(30_384_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 6f65e27184a..16bb74621ad 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 @@ -62,10 +62,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_holding() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 360_004_000 picoseconds. - Weight::from_parts(361_533_000, 3503) + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 342_499_000 picoseconds. + Weight::from_parts(348_390_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,67 +73,67 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_029_000 picoseconds. - Weight::from_parts(4_132_000, 0) + // Minimum execution time: 3_768_000 picoseconds. + Weight::from_parts(3_863_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) pub fn query_response() -> Weight { // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `3497` - // Minimum execution time: 10_802_000 picoseconds. - Weight::from_parts(10_932_000, 3497) + // Measured: `69` + // Estimated: `3534` + // Minimum execution time: 10_749_000 picoseconds. + Weight::from_parts(11_052_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_281_000 picoseconds. - Weight::from_parts(13_574_000, 0) + // Minimum execution time: 13_123_000 picoseconds. + Weight::from_parts(13_525_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_257_000 picoseconds. - Weight::from_parts(4_394_000, 0) + // Minimum execution time: 4_117_000 picoseconds. + Weight::from_parts(4_237_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_829_000 picoseconds. - Weight::from_parts(2_911_000, 0) + // Minimum execution time: 2_547_000 picoseconds. + Weight::from_parts(2_632_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_881_000 picoseconds. - Weight::from_parts(2_964_000, 0) + // Minimum execution time: 2_644_000 picoseconds. + Weight::from_parts(2_735_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_850_000 picoseconds. - Weight::from_parts(2_915_000, 0) + // Minimum execution time: 2_600_000 picoseconds. + Weight::from_parts(2_656_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_663_000 picoseconds. - Weight::from_parts(3_745_000, 0) + // Minimum execution time: 3_404_000 picoseconds. + Weight::from_parts(3_493_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_804_000 picoseconds. - Weight::from_parts(2_895_000, 0) + // Minimum execution time: 2_611_000 picoseconds. + Weight::from_parts(2_689_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -149,10 +149,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_error() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 24_558_000 picoseconds. - Weight::from_parts(24_983_000, 3503) + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 24_740_000 picoseconds. + Weight::from_parts(25_350_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -160,10 +160,10 @@ impl WeightInfo { // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) pub fn claim_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `90` - // Estimated: `3555` - // Minimum execution time: 15_020_000 picoseconds. - Weight::from_parts(15_368_000, 3555) + // Measured: `126` + // Estimated: `3591` + // Minimum execution time: 15_693_000 picoseconds. + Weight::from_parts(16_027_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_954_000 picoseconds. - Weight::from_parts(3_028_000, 0) + // Minimum execution time: 2_626_000 picoseconds. + Weight::from_parts(2_696_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -188,10 +188,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 26_773_000 picoseconds. - Weight::from_parts(27_256_000, 3503) + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 28_000_000 picoseconds. + Weight::from_parts(28_307_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_896_000 picoseconds. - Weight::from_parts(5_044_000, 0) + // Minimum execution time: 4_996_000 picoseconds. + Weight::from_parts(5_058_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -219,10 +219,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 399_114_000 picoseconds. - Weight::from_parts(400_268_000, 3503) + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 386_102_000 picoseconds. + Weight::from_parts(389_687_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 122_318_000 picoseconds. - Weight::from_parts(122_649_000, 0) + // Minimum execution time: 117_812_000 picoseconds. + Weight::from_parts(120_875_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_851_000 picoseconds. - Weight::from_parts(13_267_000, 0) + // Minimum execution time: 12_499_000 picoseconds. + Weight::from_parts(12_659_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_886_000 picoseconds. - Weight::from_parts(2_954_000, 0) + // Minimum execution time: 2_656_000 picoseconds. + Weight::from_parts(2_763_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_920_000 picoseconds. - Weight::from_parts(3_021_000, 0) + // Minimum execution time: 2_613_000 picoseconds. + Weight::from_parts(2_700_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_184_000 picoseconds. - Weight::from_parts(3_236_000, 0) + // Minimum execution time: 2_814_000 picoseconds. + Weight::from_parts(2_931_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -275,10 +275,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn query_pallet() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 27_230_000 picoseconds. - Weight::from_parts(27_825_000, 3503) + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 28_529_000 picoseconds. + Weight::from_parts(29_029_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_273_000 picoseconds. - Weight::from_parts(5_359_000, 0) + // Minimum execution time: 5_108_000 picoseconds. + Weight::from_parts(5_185_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -303,10 +303,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 24_714_000 picoseconds. - Weight::from_parts(25_082_000, 3503) + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 25_014_000 picoseconds. + Weight::from_parts(25_814_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_817_000 picoseconds. - Weight::from_parts(2_880_000, 0) + // Minimum execution time: 2_618_000 picoseconds. + Weight::from_parts(2_781_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_775_000 picoseconds. - Weight::from_parts(2_847_000, 0) + // Minimum execution time: 2_585_000 picoseconds. + Weight::from_parts(2_676_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_806_000 picoseconds. - Weight::from_parts(2_869_000, 0) + // Minimum execution time: 2_597_000 picoseconds. + Weight::from_parts(2_675_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_881_000 picoseconds. - Weight::from_parts(2_964_000, 0) + // Minimum execution time: 2_502_000 picoseconds. + Weight::from_parts(2_569_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_985_000 picoseconds. - Weight::from_parts(3_087_000, 0) + // Minimum execution time: 2_807_000 picoseconds. + Weight::from_parts(2_878_000, 0) } } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_xcmp_queue.rs index 8519e8329a6..42c744bfa78 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_514_000 picoseconds. - Weight::from_parts(5_658_000, 0) + // Minimum execution time: 5_542_000 picoseconds. + Weight::from_parts(5_836_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_517_000 picoseconds. - Weight::from_parts(5_773_000, 0) + // Minimum execution time: 5_574_000 picoseconds. + Weight::from_parts(5_707_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs index 4ff5b5075b9..061d35c82a4 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 52_618_000 picoseconds. - Weight::from_parts(53_260_000, 0) + // Minimum execution time: 53_217_000 picoseconds. + Weight::from_parts(53_720_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 39_969_000 picoseconds. - Weight::from_parts(40_584_000, 0) + // Minimum execution time: 40_340_000 picoseconds. + Weight::from_parts(40_909_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 15_907_000 picoseconds. - Weight::from_parts(16_236_000, 0) + // Minimum execution time: 15_617_000 picoseconds. + Weight::from_parts(15_850_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 22_839_000 picoseconds. - Weight::from_parts(23_138_000, 0) + // Minimum execution time: 22_529_000 picoseconds. + Weight::from_parts(22_838_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 53_986_000 picoseconds. - Weight::from_parts(54_583_000, 0) + // Minimum execution time: 54_674_000 picoseconds. + Weight::from_parts(55_393_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 48_496_000 picoseconds. - Weight::from_parts(49_111_000, 0) + // Minimum execution time: 49_448_000 picoseconds. + Weight::from_parts(49_999_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 18_457_000 picoseconds. - Weight::from_parts(18_719_000, 0) + // Minimum execution time: 18_098_000 picoseconds. + Weight::from_parts(18_419_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 18_243_000 picoseconds. - Weight::from_parts(18_314_000, 0) + // Minimum execution time: 17_698_000 picoseconds. + Weight::from_parts(17_975_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 10_135 - .saturating_add(Weight::from_parts(13_980_773, 0).saturating_mul(u.into())) + // Standard Error: 10_679 + .saturating_add(Weight::from_parts(14_038_869, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_collator_selection.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_collator_selection.rs index 962f1924179..07466709885 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_collator_selection.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -57,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` // Estimated: `1168 + b * (2554 ±0)` - // Minimum execution time: 14_583_000 picoseconds. - Weight::from_parts(14_662_374, 0) + // Minimum execution time: 14_772_000 picoseconds. + Weight::from_parts(14_666_129, 0) .saturating_add(Weight::from_parts(0, 1168)) - // Standard Error: 2_862 - .saturating_add(Weight::from_parts(2_576_034, 0).saturating_mul(b.into())) + // Standard Error: 3_170 + .saturating_add(Weight::from_parts(2_617_950, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -72,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_240_000 picoseconds. - Weight::from_parts(7_430_000, 0) + // Minimum execution time: 6_971_000 picoseconds. + Weight::from_parts(7_163_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -83,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_517_000 picoseconds. - Weight::from_parts(7_704_000, 0) + // Minimum execution time: 7_375_000 picoseconds. + Weight::from_parts(7_572_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,11 +105,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `1108 + c * (48 ±0)` // Estimated: `49487 + c * (49 ±0)` - // Minimum execution time: 42_001_000 picoseconds. - Weight::from_parts(34_741_590, 0) + // Minimum execution time: 41_905_000 picoseconds. + Weight::from_parts(33_877_512, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_220 - .saturating_add(Weight::from_parts(104_452, 0).saturating_mul(c.into())) + // Standard Error: 1_303 + .saturating_add(Weight::from_parts(106_312, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -123,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `469 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 31_537_000 picoseconds. - Weight::from_parts(23_342_837, 0) + // Minimum execution time: 31_654_000 picoseconds. + Weight::from_parts(23_280_036, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_210 - .saturating_add(Weight::from_parts(104_584, 0).saturating_mul(c.into())) + // Standard Error: 1_185 + .saturating_add(Weight::from_parts(108_563, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -141,8 +141,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 42_787_000 picoseconds. - Weight::from_parts(43_339_000, 0) + // Minimum execution time: 43_613_000 picoseconds. + Weight::from_parts(44_002_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) @@ -196,11 +196,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `22693 + c * (97 ±0) + r * (116 ±0)` // Estimated: `49487 + c * (2519 ±0) + r * (2603 ±0)` - // Minimum execution time: 17_395_000 picoseconds. - Weight::from_parts(17_530_000, 0) + // Minimum execution time: 17_377_000 picoseconds. + Weight::from_parts(17_459_000, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 848_373 - .saturating_add(Weight::from_parts(30_252_593, 0).saturating_mul(c.into())) + // Standard Error: 846_646 + .saturating_add(Weight::from_parts(30_121_171, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_multisig.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_multisig.rs index 0216364554d..122567ffc13 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_multisig.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_856_000 picoseconds. - Weight::from_parts(12_334_994, 0) + // Minimum execution time: 11_491_000 picoseconds. + Weight::from_parts(11_915_816, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2 - .saturating_add(Weight::from_parts(506, 0).saturating_mul(z.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(540, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -67,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `262 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 41_975_000 picoseconds. - Weight::from_parts(35_772_064, 0) + // Minimum execution time: 41_691_000 picoseconds. + Weight::from_parts(36_116_749, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 481 - .saturating_add(Weight::from_parts(67_985, 0).saturating_mul(s.into())) - // Standard Error: 4 - .saturating_add(Weight::from_parts(1_213, 0).saturating_mul(z.into())) + // Standard Error: 320 + .saturating_add(Weight::from_parts(62_101, 0).saturating_mul(s.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_215, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -85,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 28_065_000 picoseconds. - Weight::from_parts(22_550_479, 0) + // Minimum execution time: 27_674_000 picoseconds. + Weight::from_parts(22_338_135, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 333 - .saturating_add(Weight::from_parts(60_600, 0).saturating_mul(s.into())) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_194, 0).saturating_mul(z.into())) + // Standard Error: 305 + .saturating_add(Weight::from_parts(58_947, 0).saturating_mul(s.into())) + // Standard Error: 2 + .saturating_add(Weight::from_parts(1_211, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,13 +105,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `385 + s * (33 ±0)` // Estimated: `6811` - // Minimum execution time: 47_059_000 picoseconds. - Weight::from_parts(39_787_186, 0) + // Minimum execution time: 46_841_000 picoseconds. + Weight::from_parts(39_485_679, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 556 - .saturating_add(Weight::from_parts(82_920, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_236, 0).saturating_mul(z.into())) + // Standard Error: 423 + .saturating_add(Weight::from_parts(81_324, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_248, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -122,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 31_979_000 picoseconds. - Weight::from_parts(33_915_067, 0) + // Minimum execution time: 31_821_000 picoseconds. + Weight::from_parts(33_729_506, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 567 - .saturating_add(Weight::from_parts(72_232, 0).saturating_mul(s.into())) + // Standard Error: 723 + .saturating_add(Weight::from_parts(74_421, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -137,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 19_301_000 picoseconds. - Weight::from_parts(20_450_461, 0) + // Minimum execution time: 19_216_000 picoseconds. + Weight::from_parts(20_226_622, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 407 - .saturating_add(Weight::from_parts(63_650, 0).saturating_mul(s.into())) + // Standard Error: 474 + .saturating_add(Weight::from_parts(64_787, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -152,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 32_846_000 picoseconds. - Weight::from_parts(34_842_187, 0) + // Minimum execution time: 33_035_000 picoseconds. + Weight::from_parts(34_840_029, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 637 - .saturating_add(Weight::from_parts(71_046, 0).saturating_mul(s.into())) + // Standard Error: 618 + .saturating_add(Weight::from_parts(72_456, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nft_fractionalization.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nft_fractionalization.rs index 967bac75e96..b895ea2ef9e 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nft_fractionalization.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nft_fractionalization.rs @@ -14,10 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -//! Autogenerated weights for `pallet_nfts` +//! Autogenerated weights for `pallet_nft_fractionalization` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -45,19 +45,69 @@ use frame_support::{traits::Get, weights::Weight}; use core::marker::PhantomData; -/// Weight functions for `pallet_nfts`. +/// Weight functions for `pallet_nft_fractionalization`. pub struct WeightInfo(PhantomData); impl pallet_nft_fractionalization::WeightInfo for WeightInfo { + /// Storage: Nfts Item (r:1 w:0) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Balances Holds (r:1 w:1) + /// Proof: Balances Holds (max_values: None, max_size: Some(66), added: 2541, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1 w:1) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: Assets Metadata (r:1 w:1) + /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: NftFractionalization NftToAsset (r:0 w:1) + /// Proof: NftFractionalization NftToAsset (max_values: None, max_size: Some(92), added: 2567, mode: MaxEncodedLen) fn fractionalize() -> Weight { - // Minimum execution time: 44_312 nanoseconds. - Weight::from_parts(25_147_000, 3549) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(5_u64)) + // Proof Size summary in bytes: + // Measured: `462` + // Estimated: `4326` + // Minimum execution time: 167_532_000 picoseconds. + Weight::from_parts(168_850_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(8)) } + /// Storage: NftFractionalization NftToAsset (r:1 w:1) + /// Proof: NftFractionalization NftToAsset (max_values: None, max_size: Some(92), added: 2567, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: Assets Account (r:1 w:1) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1 w:1) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) + /// Storage: Nfts Collection (r:1 w:1) + /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts CollectionConfigOf (r:1 w:0) + /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: Nfts ItemConfigOf (r:1 w:0) + /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: Nfts Item (r:1 w:1) + /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: Balances Holds (r:1 w:1) + /// Proof: Balances Holds (max_values: None, max_size: Some(66), added: 2541, mode: MaxEncodedLen) + /// Storage: Nfts Account (r:0 w:1) + /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + /// Storage: Nfts ItemPriceOf (r:0 w:1) + /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) + /// Storage: Nfts PendingSwapOf (r:0 w:1) + /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) fn unify() -> Weight { - // Minimum execution time: 31_654 nanoseconds. - Weight::from_parts(25_147_000, 3549) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(5_u64)) + // Proof Size summary in bytes: + // Measured: `1274` + // Estimated: `4326` + // Minimum execution time: 122_877_000 picoseconds. + Weight::from_parts(124_095_000, 0) + .saturating_add(Weight::from_parts(0, 4326)) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(10)) } } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nfts.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nfts.rs index a540881b8ca..a0ce0c90cbb 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nfts.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nfts.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_nfts` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -62,8 +62,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3549` - // Minimum execution time: 38_536_000 picoseconds. - Weight::from_parts(39_046_000, 0) + // Minimum execution time: 38_310_000 picoseconds. + Weight::from_parts(39_252_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) @@ -82,8 +82,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3549` - // Minimum execution time: 22_776_000 picoseconds. - Weight::from_parts(23_177_000, 0) + // Minimum execution time: 22_616_000 picoseconds. + Weight::from_parts(23_443_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(5)) @@ -107,15 +107,17 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// The range of component `m` is `[0, 1000]`. /// The range of component `c` is `[0, 1000]`. /// The range of component `a` is `[0, 1000]`. - fn destroy(_m: u32, _c: u32, a: u32, ) -> Weight { + fn destroy(m: u32, _c: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `32170 + a * (366 ±0)` // Estimated: `2523990 + a * (2954 ±0)` - // Minimum execution time: 989_671_000 picoseconds. - Weight::from_parts(935_494_331, 0) + // Minimum execution time: 992_074_000 picoseconds. + Weight::from_parts(940_582_602, 0) .saturating_add(Weight::from_parts(0, 2523990)) - // Standard Error: 3_986 - .saturating_add(Weight::from_parts(5_721_724, 0).saturating_mul(a.into())) + // Standard Error: 3_741 + .saturating_add(Weight::from_parts(256, 0).saturating_mul(m.into())) + // Standard Error: 3_741 + .saturating_add(Weight::from_parts(5_667_401, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(1004)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(1005)) @@ -138,8 +140,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `421` // Estimated: `4326` - // Minimum execution time: 48_990_000 picoseconds. - Weight::from_parts(49_439_000, 0) + // Minimum execution time: 49_283_000 picoseconds. + Weight::from_parts(49_608_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -160,8 +162,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `421` // Estimated: `4326` - // Minimum execution time: 48_068_000 picoseconds. - Weight::from_parts(48_446_000, 0) + // Minimum execution time: 47_755_000 picoseconds. + Weight::from_parts(48_168_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -186,14 +188,16 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `530` // Estimated: `4326` - // Minimum execution time: 48_943_000 picoseconds. - Weight::from_parts(49_568_000, 0) + // Minimum execution time: 49_183_000 picoseconds. + Weight::from_parts(49_758_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: Nfts Collection (r:1 w:0) /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1 w:0) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) @@ -210,10 +214,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `559` // Estimated: `4326` - // Minimum execution time: 35_764_000 picoseconds. - Weight::from_parts(36_232_000, 0) + // Minimum execution time: 40_454_000 picoseconds. + Weight::from_parts(40_858_000, 0) .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: Nfts Collection (r:1 w:0) @@ -227,11 +231,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `729 + i * (108 ±0)` // Estimated: `3549 + i * (3336 ±0)` - // Minimum execution time: 17_108_000 picoseconds. - Weight::from_parts(17_220_000, 0) + // Minimum execution time: 16_765_000 picoseconds. + Weight::from_parts(16_884_000, 0) .saturating_add(Weight::from_parts(0, 3549)) - // Standard Error: 14_557 - .saturating_add(Weight::from_parts(15_545_711, 0).saturating_mul(i.into())) + // Standard Error: 13_552 + .saturating_add(Weight::from_parts(15_383_176, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) @@ -245,8 +249,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `401` // Estimated: `3534` - // Minimum execution time: 20_958_000 picoseconds. - Weight::from_parts(21_129_000, 0) + // Minimum execution time: 20_317_000 picoseconds. + Weight::from_parts(20_603_000, 0) .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -259,8 +263,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `401` // Estimated: `3534` - // Minimum execution time: 20_864_000 picoseconds. - Weight::from_parts(21_016_000, 0) + // Minimum execution time: 20_127_000 picoseconds. + Weight::from_parts(20_356_000, 0) .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -273,8 +277,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `306` // Estimated: `3549` - // Minimum execution time: 17_934_000 picoseconds. - Weight::from_parts(18_152_000, 0) + // Minimum execution time: 17_350_000 picoseconds. + Weight::from_parts(17_626_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -289,8 +293,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `354` // Estimated: `3549` - // Minimum execution time: 23_477_000 picoseconds. - Weight::from_parts(23_830_000, 0) + // Minimum execution time: 23_107_000 picoseconds. + Weight::from_parts(23_524_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -303,8 +307,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `335` // Estimated: `6078` - // Minimum execution time: 40_775_000 picoseconds. - Weight::from_parts(41_159_000, 0) + // Minimum execution time: 39_318_000 picoseconds. + Weight::from_parts(39_996_000, 0) .saturating_add(Weight::from_parts(0, 6078)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(5)) @@ -317,8 +321,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `277` // Estimated: `3549` - // Minimum execution time: 18_569_000 picoseconds. - Weight::from_parts(18_844_000, 0) + // Minimum execution time: 18_386_000 picoseconds. + Weight::from_parts(18_612_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) @@ -331,8 +335,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `242` // Estimated: `3549` - // Minimum execution time: 15_395_000 picoseconds. - Weight::from_parts(15_554_000, 0) + // Minimum execution time: 14_945_000 picoseconds. + Weight::from_parts(15_330_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -345,8 +349,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `401` // Estimated: `3534` - // Minimum execution time: 20_497_000 picoseconds. - Weight::from_parts(20_872_000, 0) + // Minimum execution time: 20_130_000 picoseconds. + Weight::from_parts(20_506_000, 0) .saturating_add(Weight::from_parts(0, 3534)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -365,8 +369,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `505` // Estimated: `3944` - // Minimum execution time: 49_930_000 picoseconds. - Weight::from_parts(50_200_000, 0) + // Minimum execution time: 50_086_000 picoseconds. + Weight::from_parts(50_663_000, 0) .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -379,8 +383,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `310` // Estimated: `3944` - // Minimum execution time: 27_930_000 picoseconds. - Weight::from_parts(28_319_000, 0) + // Minimum execution time: 27_703_000 picoseconds. + Weight::from_parts(27_983_000, 0) .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -397,8 +401,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `949` // Estimated: `3944` - // Minimum execution time: 47_306_000 picoseconds. - Weight::from_parts(47_676_000, 0) + // Minimum execution time: 46_689_000 picoseconds. + Weight::from_parts(47_446_000, 0) .saturating_add(Weight::from_parts(0, 3944)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -411,8 +415,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `347` // Estimated: `4466` - // Minimum execution time: 18_749_000 picoseconds. - Weight::from_parts(19_080_000, 0) + // Minimum execution time: 18_389_000 picoseconds. + Weight::from_parts(18_666_000, 0) .saturating_add(Weight::from_parts(0, 4466)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -430,11 +434,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `726 + n * (398 ±0)` // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 28_200_000 picoseconds. - Weight::from_parts(28_552_000, 0) + // Minimum execution time: 27_274_000 picoseconds. + Weight::from_parts(27_603_000, 0) .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 3_352 - .saturating_add(Weight::from_parts(5_584_045, 0).saturating_mul(n.into())) + // Standard Error: 3_583 + .saturating_add(Weight::from_parts(5_552_652, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) @@ -455,8 +459,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `505` // Estimated: `3812` - // Minimum execution time: 41_646_000 picoseconds. - Weight::from_parts(42_171_000, 0) + // Minimum execution time: 41_699_000 picoseconds. + Weight::from_parts(42_130_000, 0) .saturating_add(Weight::from_parts(0, 3812)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -473,8 +477,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `815` // Estimated: `3812` - // Minimum execution time: 40_022_000 picoseconds. - Weight::from_parts(40_363_000, 0) + // Minimum execution time: 39_843_000 picoseconds. + Weight::from_parts(40_263_000, 0) .saturating_add(Weight::from_parts(0, 3812)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -491,8 +495,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `364` // Estimated: `3759` - // Minimum execution time: 38_872_000 picoseconds. - Weight::from_parts(39_223_000, 0) + // Minimum execution time: 39_138_000 picoseconds. + Weight::from_parts(39_467_000, 0) .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -509,8 +513,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `682` // Estimated: `3759` - // Minimum execution time: 37_582_000 picoseconds. - Weight::from_parts(38_305_000, 0) + // Minimum execution time: 37_291_000 picoseconds. + Weight::from_parts(37_747_000, 0) .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -523,8 +527,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `376` // Estimated: `4326` - // Minimum execution time: 22_551_000 picoseconds. - Weight::from_parts(22_984_000, 0) + // Minimum execution time: 22_575_000 picoseconds. + Weight::from_parts(22_957_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -535,8 +539,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `384` // Estimated: `4326` - // Minimum execution time: 19_879_000 picoseconds. - Weight::from_parts(20_310_000, 0) + // Minimum execution time: 19_630_000 picoseconds. + Weight::from_parts(19_901_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -547,8 +551,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `384` // Estimated: `4326` - // Minimum execution time: 18_958_000 picoseconds. - Weight::from_parts(19_247_000, 0) + // Minimum execution time: 18_787_000 picoseconds. + Weight::from_parts(19_071_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -559,8 +563,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3517` - // Minimum execution time: 16_432_000 picoseconds. - Weight::from_parts(16_762_000, 0) + // Minimum execution time: 16_183_000 picoseconds. + Weight::from_parts(16_588_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -573,8 +577,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `306` // Estimated: `3549` - // Minimum execution time: 19_950_000 picoseconds. - Weight::from_parts(20_169_000, 0) + // Minimum execution time: 19_707_000 picoseconds. + Weight::from_parts(19_925_000, 0) .saturating_add(Weight::from_parts(0, 3549)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -587,8 +591,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `289` // Estimated: `3538` - // Minimum execution time: 19_727_000 picoseconds. - Weight::from_parts(19_977_000, 0) + // Minimum execution time: 19_159_000 picoseconds. + Weight::from_parts(19_430_000, 0) .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -605,8 +609,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `484` // Estimated: `4326` - // Minimum execution time: 24_200_000 picoseconds. - Weight::from_parts(24_433_000, 0) + // Minimum execution time: 23_770_000 picoseconds. + Weight::from_parts(24_281_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -617,6 +621,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:1 w:0) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:1 w:0) @@ -629,10 +635,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `671` // Estimated: `4326` - // Minimum execution time: 44_868_000 picoseconds. - Weight::from_parts(45_386_000, 0) + // Minimum execution time: 49_633_000 picoseconds. + Weight::from_parts(50_363_000, 0) .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(5)) } /// The range of component `n` is `[0, 10]`. @@ -640,11 +646,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_573_000 picoseconds. - Weight::from_parts(4_309_077, 0) + // Minimum execution time: 2_515_000 picoseconds. + Weight::from_parts(4_116_276, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 9_731 - .saturating_add(Weight::from_parts(3_668_159, 0).saturating_mul(n.into())) + // Standard Error: 9_140 + .saturating_add(Weight::from_parts(3_634_187, 0).saturating_mul(n.into())) } /// Storage: Nfts Item (r:2 w:0) /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) @@ -654,8 +660,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `460` // Estimated: `7662` - // Minimum execution time: 22_763_000 picoseconds. - Weight::from_parts(22_911_000, 0) + // Minimum execution time: 22_105_000 picoseconds. + Weight::from_parts(22_488_000, 0) .saturating_add(Weight::from_parts(0, 7662)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -668,8 +674,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `479` // Estimated: `4326` - // Minimum execution time: 21_393_000 picoseconds. - Weight::from_parts(21_656_000, 0) + // Minimum execution time: 20_850_000 picoseconds. + Weight::from_parts(21_320_000, 0) .saturating_add(Weight::from_parts(0, 4326)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -680,6 +686,8 @@ impl pallet_nfts::WeightInfo for WeightInfo { /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) /// Storage: Nfts Collection (r:1 w:0) /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: Nfts Attribute (r:2 w:0) + /// Proof: Nfts Attribute (max_values: None, max_size: Some(479), added: 2954, mode: MaxEncodedLen) /// Storage: Nfts CollectionConfigOf (r:1 w:0) /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) /// Storage: Nfts ItemConfigOf (r:2 w:0) @@ -692,10 +700,10 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `800` // Estimated: `7662` - // Minimum execution time: 73_894_000 picoseconds. - Weight::from_parts(75_692_000, 0) + // Minimum execution time: 82_411_000 picoseconds. + Weight::from_parts(82_891_000, 0) .saturating_add(Weight::from_parts(0, 7662)) - .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(10)) } /// Storage: Nfts CollectionRoleOf (r:2 w:0) @@ -721,11 +729,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `524` // Estimated: `6078 + n * (2954 ±0)` - // Minimum execution time: 132_196_000 picoseconds. - Weight::from_parts(136_454_873, 0) + // Minimum execution time: 131_511_000 picoseconds. + Weight::from_parts(136_312_961, 0) .saturating_add(Weight::from_parts(0, 6078)) - // Standard Error: 18_901 - .saturating_add(Weight::from_parts(29_375_812, 0).saturating_mul(n.into())) + // Standard Error: 23_681 + .saturating_add(Weight::from_parts(29_674_702, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6)) @@ -749,11 +757,11 @@ impl pallet_nfts::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `554` // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 76_734_000 picoseconds. - Weight::from_parts(87_761_745, 0) + // Minimum execution time: 76_717_000 picoseconds. + Weight::from_parts(88_114_044, 0) .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 59_520 - .saturating_add(Weight::from_parts(28_979_367, 0).saturating_mul(n.into())) + // Standard Error: 61_294 + .saturating_add(Weight::from_parts(29_187_148, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_proxy.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_proxy.rs index b92e3c4eede..8684ad9e721 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_proxy.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -55,11 +55,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 16_863_000 picoseconds. - Weight::from_parts(17_287_999, 0) + // Minimum execution time: 16_666_000 picoseconds. + Weight::from_parts(17_158_137, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 841 - .saturating_add(Weight::from_parts(25_908, 0).saturating_mul(p.into())) + // Standard Error: 616 + .saturating_add(Weight::from_parts(38_554, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -74,13 +74,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 38_170_000 picoseconds. - Weight::from_parts(37_695_584, 0) + // Minimum execution time: 38_208_000 picoseconds. + Weight::from_parts(37_783_373, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_836 - .saturating_add(Weight::from_parts(146_800, 0).saturating_mul(a.into())) - // Standard Error: 1_897 - .saturating_add(Weight::from_parts(38_057, 0).saturating_mul(p.into())) + // Standard Error: 1_206 + .saturating_add(Weight::from_parts(137_436, 0).saturating_mul(a.into())) + // Standard Error: 1_246 + .saturating_add(Weight::from_parts(40_721, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -94,13 +94,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 25_161_000 picoseconds. - Weight::from_parts(25_440_795, 0) + // Minimum execution time: 25_208_000 picoseconds. + Weight::from_parts(25_736_136, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_095 - .saturating_add(Weight::from_parts(135_319, 0).saturating_mul(a.into())) - // Standard Error: 1_131 - .saturating_add(Weight::from_parts(11_250, 0).saturating_mul(p.into())) + // Standard Error: 1_082 + .saturating_add(Weight::from_parts(126_566, 0).saturating_mul(a.into())) + // Standard Error: 1_118 + .saturating_add(Weight::from_parts(9_935, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -114,13 +114,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 25_441_000 picoseconds. - Weight::from_parts(25_850_657, 0) + // Minimum execution time: 25_179_000 picoseconds. + Weight::from_parts(25_577_519, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_148 - .saturating_add(Weight::from_parts(127_981, 0).saturating_mul(a.into())) - // Standard Error: 1_186 - .saturating_add(Weight::from_parts(6_961, 0).saturating_mul(p.into())) + // Standard Error: 1_015 + .saturating_add(Weight::from_parts(130_058, 0).saturating_mul(a.into())) + // Standard Error: 1_049 + .saturating_add(Weight::from_parts(11_423, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -136,13 +136,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `386 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 34_657_000 picoseconds. - Weight::from_parts(33_913_455, 0) + // Minimum execution time: 34_716_000 picoseconds. + Weight::from_parts(34_190_071, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_087 - .saturating_add(Weight::from_parts(128_175, 0).saturating_mul(a.into())) - // Standard Error: 1_123 - .saturating_add(Weight::from_parts(40_321, 0).saturating_mul(p.into())) + // Standard Error: 1_071 + .saturating_add(Weight::from_parts(133_665, 0).saturating_mul(a.into())) + // Standard Error: 1_107 + .saturating_add(Weight::from_parts(37_129, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -153,11 +153,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 25_575_000 picoseconds. - Weight::from_parts(26_235_398, 0) + // Minimum execution time: 25_686_000 picoseconds. + Weight::from_parts(26_496_799, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 924 - .saturating_add(Weight::from_parts(51_662, 0).saturating_mul(p.into())) + // Standard Error: 944 + .saturating_add(Weight::from_parts(53_906, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -168,11 +168,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 25_416_000 picoseconds. - Weight::from_parts(26_557_151, 0) + // Minimum execution time: 25_575_000 picoseconds. + Weight::from_parts(26_760_153, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_447 - .saturating_add(Weight::from_parts(50_558, 0).saturating_mul(p.into())) + // Standard Error: 1_536 + .saturating_add(Weight::from_parts(53_629, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -183,11 +183,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 22_606_000 picoseconds. - Weight::from_parts(23_262_867, 0) + // Minimum execution time: 23_079_000 picoseconds. + Weight::from_parts(23_711_353, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_186 - .saturating_add(Weight::from_parts(26_393, 0).saturating_mul(p.into())) + // Standard Error: 927 + .saturating_add(Weight::from_parts(27_783, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -198,11 +198,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `139` // Estimated: `4706` - // Minimum execution time: 27_288_000 picoseconds. - Weight::from_parts(27_957_909, 0) + // Minimum execution time: 27_453_000 picoseconds. + Weight::from_parts(28_332_832, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 706 - .saturating_add(Weight::from_parts(8_841, 0).saturating_mul(p.into())) + // Standard Error: 848 + .saturating_add(Weight::from_parts(12_522, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -213,11 +213,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `164 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_640_000 picoseconds. - Weight::from_parts(24_327_982, 0) + // Minimum execution time: 23_827_000 picoseconds. + Weight::from_parts(24_677_827, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 828 - .saturating_add(Weight::from_parts(28_240, 0).saturating_mul(p.into())) + // Standard Error: 832 + .saturating_add(Weight::from_parts(26_514, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_session.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_session.rs index f768b5436a0..974ff8a7ea7 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_session.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_session.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `270` // Estimated: `3735` - // Minimum execution time: 17_308_000 picoseconds. - Weight::from_parts(17_624_000, 0) + // Minimum execution time: 17_139_000 picoseconds. + Weight::from_parts(17_476_000, 0) .saturating_add(Weight::from_parts(0, 3735)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,8 +70,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `242` // Estimated: `3707` - // Minimum execution time: 12_828_000 picoseconds. - Weight::from_parts(12_985_000, 0) + // Minimum execution time: 13_274_000 picoseconds. + Weight::from_parts(13_523_000, 0) .saturating_add(Weight::from_parts(0, 3707)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_timestamp.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_timestamp.rs index 6380b2d4bdf..b75a01bd596 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_timestamp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `86` // Estimated: `1493` - // Minimum execution time: 9_150_000 picoseconds. - Weight::from_parts(9_474_000, 0) + // Minimum execution time: 9_238_000 picoseconds. + Weight::from_parts(9_402_000, 0) .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_210_000 picoseconds. - Weight::from_parts(3_330_000, 0) + // Minimum execution time: 3_257_000 picoseconds. + Weight::from_parts(3_355_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_uniques.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_uniques.rs index e2b3710f033..af83bfd80d7 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_uniques.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_uniques.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_uniques` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3643` - // Minimum execution time: 29_873_000 picoseconds. - Weight::from_parts(30_382_000, 0) + // Minimum execution time: 30_515_000 picoseconds. + Weight::from_parts(31_278_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,8 +70,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3643` - // Minimum execution time: 14_338_000 picoseconds. - Weight::from_parts(14_710_000, 0) + // Minimum execution time: 15_330_000 picoseconds. + Weight::from_parts(15_594_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -99,15 +99,15 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `257 + a * (107 ±0) + m * (56 ±0) + n * (76 ±0)` // Estimated: `3643 + a * (2647 ±0) + m * (2662 ±0) + n * (2597 ±0)` - // Minimum execution time: 2_398_014_000 picoseconds. - Weight::from_parts(2_410_569_000, 0) + // Minimum execution time: 2_526_402_000 picoseconds. + Weight::from_parts(2_544_290_000, 0) .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 24_769 - .saturating_add(Weight::from_parts(6_309_077, 0).saturating_mul(n.into())) - // Standard Error: 24_769 - .saturating_add(Weight::from_parts(257_995, 0).saturating_mul(m.into())) - // Standard Error: 24_769 - .saturating_add(Weight::from_parts(317_885, 0).saturating_mul(a.into())) + // Standard Error: 25_802 + .saturating_add(Weight::from_parts(6_307_284, 0).saturating_mul(n.into())) + // Standard Error: 25_802 + .saturating_add(Weight::from_parts(273_658, 0).saturating_mul(m.into())) + // Standard Error: 25_802 + .saturating_add(Weight::from_parts(340_604, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) @@ -132,8 +132,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 36_084_000 picoseconds. - Weight::from_parts(36_377_000, 0) + // Minimum execution time: 35_998_000 picoseconds. + Weight::from_parts(36_435_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -150,8 +150,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 37_397_000 picoseconds. - Weight::from_parts(37_763_000, 0) + // Minimum execution time: 37_271_000 picoseconds. + Weight::from_parts(37_693_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -168,8 +168,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 27_423_000 picoseconds. - Weight::from_parts(27_666_000, 0) + // Minimum execution time: 26_992_000 picoseconds. + Weight::from_parts(27_281_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -183,11 +183,11 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `738 + i * (76 ±0)` // Estimated: `3643 + i * (2597 ±0)` - // Minimum execution time: 15_215_000 picoseconds. - Weight::from_parts(15_450_000, 0) + // Minimum execution time: 15_478_000 picoseconds. + Weight::from_parts(15_798_000, 0) .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 12_841 - .saturating_add(Weight::from_parts(15_164_179, 0).saturating_mul(i.into())) + // Standard Error: 12_942 + .saturating_add(Weight::from_parts(15_284_761, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -202,8 +202,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 19_169_000 picoseconds. - Weight::from_parts(19_541_000, 0) + // Minimum execution time: 19_046_000 picoseconds. + Weight::from_parts(19_341_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -216,8 +216,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 18_941_000 picoseconds. - Weight::from_parts(19_336_000, 0) + // Minimum execution time: 19_005_000 picoseconds. + Weight::from_parts(19_192_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -228,8 +228,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 14_356_000 picoseconds. - Weight::from_parts(14_650_000, 0) + // Minimum execution time: 14_558_000 picoseconds. + Weight::from_parts(14_813_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -240,8 +240,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 14_303_000 picoseconds. - Weight::from_parts(14_504_000, 0) + // Minimum execution time: 14_384_000 picoseconds. + Weight::from_parts(14_805_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -256,8 +256,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `356` // Estimated: `3643` - // Minimum execution time: 22_663_000 picoseconds. - Weight::from_parts(23_053_000, 0) + // Minimum execution time: 22_520_000 picoseconds. + Weight::from_parts(22_963_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -268,8 +268,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 15_198_000 picoseconds. - Weight::from_parts(15_645_000, 0) + // Minimum execution time: 15_163_000 picoseconds. + Weight::from_parts(15_578_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -282,8 +282,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 17_381_000 picoseconds. - Weight::from_parts(17_588_000, 0) + // Minimum execution time: 17_315_000 picoseconds. + Weight::from_parts(17_642_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -298,8 +298,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `559` // Estimated: `3652` - // Minimum execution time: 39_838_000 picoseconds. - Weight::from_parts(40_387_000, 0) + // Minimum execution time: 40_657_000 picoseconds. + Weight::from_parts(41_034_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -314,8 +314,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `756` // Estimated: `3652` - // Minimum execution time: 38_600_000 picoseconds. - Weight::from_parts(39_215_000, 0) + // Minimum execution time: 38_680_000 picoseconds. + Weight::from_parts(39_441_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -328,8 +328,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `348` // Estimated: `3652` - // Minimum execution time: 31_563_000 picoseconds. - Weight::from_parts(32_111_000, 0) + // Minimum execution time: 31_491_000 picoseconds. + Weight::from_parts(32_036_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -342,8 +342,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `559` // Estimated: `3652` - // Minimum execution time: 31_525_000 picoseconds. - Weight::from_parts(31_904_000, 0) + // Minimum execution time: 32_000_000 picoseconds. + Weight::from_parts(32_360_000, 0) .saturating_add(Weight::from_parts(0, 3652)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -356,8 +356,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 32_104_000 picoseconds. - Weight::from_parts(32_429_000, 0) + // Minimum execution time: 32_255_000 picoseconds. + Weight::from_parts(32_755_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -370,8 +370,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `473` // Estimated: `3643` - // Minimum execution time: 30_433_000 picoseconds. - Weight::from_parts(30_662_000, 0) + // Minimum execution time: 30_564_000 picoseconds. + Weight::from_parts(30_891_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -384,8 +384,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `428` // Estimated: `3643` - // Minimum execution time: 20_463_000 picoseconds. - Weight::from_parts(20_879_000, 0) + // Minimum execution time: 20_366_000 picoseconds. + Weight::from_parts(20_801_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -398,8 +398,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `461` // Estimated: `3643` - // Minimum execution time: 20_158_000 picoseconds. - Weight::from_parts(20_465_000, 0) + // Minimum execution time: 20_186_000 picoseconds. + Weight::from_parts(20_559_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -410,8 +410,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3517` - // Minimum execution time: 16_009_000 picoseconds. - Weight::from_parts(16_396_000, 0) + // Minimum execution time: 16_362_000 picoseconds. + Weight::from_parts(16_847_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -424,8 +424,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `3643` - // Minimum execution time: 17_034_000 picoseconds. - Weight::from_parts(17_286_000, 0) + // Minimum execution time: 17_174_000 picoseconds. + Weight::from_parts(17_660_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -438,8 +438,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `259` // Estimated: `3587` - // Minimum execution time: 17_020_000 picoseconds. - Weight::from_parts(17_318_000, 0) + // Minimum execution time: 16_902_000 picoseconds. + Weight::from_parts(17_128_000, 0) .saturating_add(Weight::from_parts(0, 3587)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -456,8 +456,8 @@ impl pallet_uniques::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `540` // Estimated: `3643` - // Minimum execution time: 37_771_000 picoseconds. - Weight::from_parts(38_708_000, 0) + // Minimum execution time: 37_646_000 picoseconds. + Weight::from_parts(38_137_000, 0) .saturating_add(Weight::from_parts(0, 3643)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_utility.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_utility.rs index 9584d32ac10..8ad72fdbe63 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_utility.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_utility.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -53,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_065_000 picoseconds. - Weight::from_parts(7_907_851, 0) + // Minimum execution time: 7_055_000 picoseconds. + Weight::from_parts(8_255_115, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_515 - .saturating_add(Weight::from_parts(5_447_457, 0).saturating_mul(c.into())) + // Standard Error: 2_747 + .saturating_add(Weight::from_parts(5_854_057, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_845_000 picoseconds. - Weight::from_parts(6_053_000, 0) + // Minimum execution time: 5_786_000 picoseconds. + Weight::from_parts(5_957_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -72,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_094_000 picoseconds. - Weight::from_parts(1_459_029, 0) + // Minimum execution time: 7_240_000 picoseconds. + Weight::from_parts(4_766_480, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 4_016 - .saturating_add(Weight::from_parts(5_680_469, 0).saturating_mul(c.into())) + // Standard Error: 3_095 + .saturating_add(Weight::from_parts(6_006_569, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_972_000 picoseconds. - Weight::from_parts(10_167_000, 0) + // Minimum execution time: 9_657_000 picoseconds. + Weight::from_parts(9_876_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -91,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_148_000 picoseconds. - Weight::from_parts(6_914_554, 0) + // Minimum execution time: 7_207_000 picoseconds. + Weight::from_parts(7_858_719, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_605 - .saturating_add(Weight::from_parts(5_440_589, 0).saturating_mul(c.into())) + // Standard Error: 3_234 + .saturating_add(Weight::from_parts(5_844_542, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs index cffebc3ea84..f1acce89ed2 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -62,8 +62,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 30_683_000 picoseconds. - Weight::from_parts(31_228_000, 0) + // Minimum execution time: 27_828_000 picoseconds. + Weight::from_parts(28_310_000, 0) .saturating_add(Weight::from_parts(0, 3540)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -74,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 29_299_000 picoseconds. - Weight::from_parts(29_857_000, 0) + // Minimum execution time: 24_586_000 picoseconds. + Weight::from_parts(25_199_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -85,8 +85,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1489` - // Minimum execution time: 22_639_000 picoseconds. - Weight::from_parts(23_057_000, 0) + // Minimum execution time: 18_948_000 picoseconds. + Weight::from_parts(19_444_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -104,8 +104,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_678_000 picoseconds. - Weight::from_parts(12_002_000, 0) + // Minimum execution time: 10_214_000 picoseconds. + Weight::from_parts(10_359_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -115,8 +115,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_702_000 picoseconds. - Weight::from_parts(3_927_000, 0) + // Minimum execution time: 3_159_000 picoseconds. + Weight::from_parts(3_401_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -140,8 +140,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 37_617_000 picoseconds. - Weight::from_parts(38_443_000, 0) + // Minimum execution time: 33_325_000 picoseconds. + Weight::from_parts(34_039_000, 0) .saturating_add(Weight::from_parts(0, 3540)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) @@ -164,8 +164,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `257` // Estimated: `3722` - // Minimum execution time: 39_333_000 picoseconds. - Weight::from_parts(40_174_000, 0) + // Minimum execution time: 34_466_000 picoseconds. + Weight::from_parts(35_152_000, 0) .saturating_add(Weight::from_parts(0, 3722)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) @@ -176,8 +176,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_857_000 picoseconds. - Weight::from_parts(4_158_000, 0) + // Minimum execution time: 3_264_000 picoseconds. + Weight::from_parts(3_401_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -187,8 +187,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `129` // Estimated: `11019` - // Minimum execution time: 17_929_000 picoseconds. - Weight::from_parts(18_175_000, 0) + // Minimum execution time: 17_297_000 picoseconds. + Weight::from_parts(17_629_000, 0) .saturating_add(Weight::from_parts(0, 11019)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -199,8 +199,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `133` // Estimated: `11023` - // Minimum execution time: 17_241_000 picoseconds. - Weight::from_parts(17_618_000, 0) + // Minimum execution time: 16_621_000 picoseconds. + Weight::from_parts(17_120_000, 0) .saturating_add(Weight::from_parts(0, 11023)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -211,8 +211,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `140` // Estimated: `13505` - // Minimum execution time: 18_013_000 picoseconds. - Weight::from_parts(18_485_000, 0) + // Minimum execution time: 17_529_000 picoseconds. + Weight::from_parts(18_034_000, 0) .saturating_add(Weight::from_parts(0, 13505)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -232,8 +232,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `142` // Estimated: `6082` - // Minimum execution time: 30_736_000 picoseconds. - Weight::from_parts(31_215_000, 0) + // Minimum execution time: 30_737_000 picoseconds. + Weight::from_parts(31_591_000, 0) .saturating_add(Weight::from_parts(0, 6082)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -244,8 +244,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `172` // Estimated: `8587` - // Minimum execution time: 9_005_000 picoseconds. - Weight::from_parts(9_289_000, 0) + // Minimum execution time: 8_892_000 picoseconds. + Weight::from_parts(9_269_000, 0) .saturating_add(Weight::from_parts(0, 8587)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -255,8 +255,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `140` // Estimated: `11030` - // Minimum execution time: 17_506_000 picoseconds. - Weight::from_parts(17_811_000, 0) + // Minimum execution time: 17_017_000 picoseconds. + Weight::from_parts(17_452_000, 0) .saturating_add(Weight::from_parts(0, 11030)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -277,8 +277,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `146` // Estimated: `11036` - // Minimum execution time: 37_343_000 picoseconds. - Weight::from_parts(37_774_000, 0) + // Minimum execution time: 36_407_000 picoseconds. + Weight::from_parts(37_027_000, 0) .saturating_add(Weight::from_parts(0, 11036)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 429c43a343c..19ac1f044b1 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 25_802_000 picoseconds. - Weight::from_parts(26_076_000, 3593) + // Minimum execution time: 25_496_000 picoseconds. + Weight::from_parts(25_876_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 48_092_000 picoseconds. - Weight::from_parts(48_397_000, 6196) + // Minimum execution time: 49_292_000 picoseconds. + Weight::from_parts(50_180_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -86,10 +86,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `176` + // Measured: `210` // Estimated: `6196` - // Minimum execution time: 70_237_000 picoseconds. - Weight::from_parts(70_692_000, 6196) + // Minimum execution time: 71_420_000 picoseconds. + Weight::from_parts(72_513_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_045_000 picoseconds. - Weight::from_parts(4_135_000, 0) + // Minimum execution time: 3_711_000 picoseconds. + Weight::from_parts(3_818_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 26_201_000 picoseconds. - Weight::from_parts(26_820_000, 3593) + // Minimum execution time: 26_293_000 picoseconds. + Weight::from_parts(26_737_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -127,10 +127,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `75` + // Measured: `109` // Estimated: `3593` - // Minimum execution time: 50_526_000 picoseconds. - Weight::from_parts(51_121_000, 3593) + // Minimum execution time: 50_188_000 picoseconds. + Weight::from_parts(50_712_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -148,10 +148,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 30_690_000 picoseconds. - Weight::from_parts(31_032_000, 3540) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 29_852_000 picoseconds. + Weight::from_parts(30_308_000, 3574) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 7676d7b3a38..8a7e8f9d7db 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -62,10 +62,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_holding() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 361_717_000 picoseconds. - Weight::from_parts(362_438_000, 3540) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 345_759_000 picoseconds. + Weight::from_parts(353_565_000, 3574) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,67 +73,67 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_952_000 picoseconds. - Weight::from_parts(4_060_000, 0) + // Minimum execution time: 3_727_000 picoseconds. + Weight::from_parts(3_865_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) pub fn query_response() -> Weight { // Proof Size summary in bytes: - // Measured: `69` - // Estimated: `3534` - // Minimum execution time: 10_984_000 picoseconds. - Weight::from_parts(11_204_000, 3534) + // Measured: `103` + // Estimated: `3568` + // Minimum execution time: 10_978_000 picoseconds. + Weight::from_parts(11_169_000, 3568) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_942_000 picoseconds. - Weight::from_parts(14_077_000, 0) + // Minimum execution time: 13_477_000 picoseconds. + Weight::from_parts(13_824_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_242_000 picoseconds. - Weight::from_parts(4_354_000, 0) + // Minimum execution time: 3_993_000 picoseconds. + Weight::from_parts(4_166_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_802_000 picoseconds. - Weight::from_parts(2_851_000, 0) + // Minimum execution time: 2_593_000 picoseconds. + Weight::from_parts(2_711_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_797_000 picoseconds. - Weight::from_parts(2_899_000, 0) + // Minimum execution time: 2_606_000 picoseconds. + Weight::from_parts(2_665_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_767_000 picoseconds. - Weight::from_parts(2_837_000, 0) + // Minimum execution time: 2_564_000 picoseconds. + Weight::from_parts(2_628_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_669_000 picoseconds. - Weight::from_parts(3_721_000, 0) + // Minimum execution time: 3_392_000 picoseconds. + Weight::from_parts(3_489_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_719_000 picoseconds. - Weight::from_parts(2_789_000, 0) + // Minimum execution time: 2_569_000 picoseconds. + Weight::from_parts(2_652_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -149,10 +149,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_error() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 25_261_000 picoseconds. - Weight::from_parts(25_779_000, 3540) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 25_378_000 picoseconds. + Weight::from_parts(25_790_000, 3574) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -160,10 +160,10 @@ impl WeightInfo { // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) pub fn claim_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `126` - // Estimated: `3591` - // Minimum execution time: 16_124_000 picoseconds. - Weight::from_parts(16_394_000, 3591) + // Measured: `160` + // Estimated: `3625` + // Minimum execution time: 15_992_000 picoseconds. + Weight::from_parts(16_178_000, 3625) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_757_000 picoseconds. - Weight::from_parts(2_847_000, 0) + // Minimum execution time: 2_600_000 picoseconds. + Weight::from_parts(2_671_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -188,10 +188,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 27_522_000 picoseconds. - Weight::from_parts(27_997_000, 3540) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 27_531_000 picoseconds. + Weight::from_parts(28_132_000, 3574) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_975_000 picoseconds. - Weight::from_parts(5_129_000, 0) + // Minimum execution time: 4_663_000 picoseconds. + Weight::from_parts(4_815_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -219,10 +219,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 398_886_000 picoseconds. - Weight::from_parts(400_023_000, 3540) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 382_848_000 picoseconds. + Weight::from_parts(398_418_000, 3574) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 120_499_000 picoseconds. - Weight::from_parts(120_883_000, 0) + // Minimum execution time: 115_229_000 picoseconds. + Weight::from_parts(120_694_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_140_000 picoseconds. - Weight::from_parts(13_404_000, 0) + // Minimum execution time: 12_136_000 picoseconds. + Weight::from_parts(12_364_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_861_000 picoseconds. - Weight::from_parts(2_920_000, 0) + // Minimum execution time: 2_669_000 picoseconds. + Weight::from_parts(2_766_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_791_000 picoseconds. - Weight::from_parts(2_843_000, 0) + // Minimum execution time: 2_578_000 picoseconds. + Weight::from_parts(2_664_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_992_000 picoseconds. - Weight::from_parts(3_057_000, 0) + // Minimum execution time: 2_775_000 picoseconds. + Weight::from_parts(2_854_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -275,10 +275,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn query_pallet() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 29_505_000 picoseconds. - Weight::from_parts(30_219_000, 3540) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 28_690_000 picoseconds. + Weight::from_parts(29_048_000, 3574) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_344_000 picoseconds. - Weight::from_parts(5_490_000, 0) + // Minimum execution time: 5_236_000 picoseconds. + Weight::from_parts(5_347_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -303,10 +303,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 25_333_000 picoseconds. - Weight::from_parts(25_683_000, 3540) + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 25_235_000 picoseconds. + Weight::from_parts(26_132_000, 3574) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_734_000 picoseconds. - Weight::from_parts(2_813_000, 0) + // Minimum execution time: 2_672_000 picoseconds. + Weight::from_parts(2_750_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_766_000 picoseconds. - Weight::from_parts(2_824_000, 0) + // Minimum execution time: 2_590_000 picoseconds. + Weight::from_parts(2_661_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_763_000 picoseconds. - Weight::from_parts(2_839_000, 0) + // Minimum execution time: 2_623_000 picoseconds. + Weight::from_parts(2_712_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_753_000 picoseconds. - Weight::from_parts(2_837_000, 0) + // Minimum execution time: 2_664_000 picoseconds. + Weight::from_parts(2_726_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_001_000 picoseconds. - Weight::from_parts(3_064_000, 0) + // Minimum execution time: 2_760_000 picoseconds. + Weight::from_parts(2_852_000, 0) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs index caf5ce9f44e..23ed6b013f7 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_497_000 picoseconds. - Weight::from_parts(5_680_000, 0) + // Minimum execution time: 5_561_000 picoseconds. + Weight::from_parts(5_800_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_600_000 picoseconds. - Weight::from_parts(5_855_000, 0) + // Minimum execution time: 5_664_000 picoseconds. + Weight::from_parts(5_826_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs index 94ac23e26eb..111a86a5666 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 53_880_000 picoseconds. - Weight::from_parts(54_466_000, 0) + // Minimum execution time: 63_775_000 picoseconds. + Weight::from_parts(64_181_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 41_306_000 picoseconds. - Weight::from_parts(41_665_000, 0) + // Minimum execution time: 47_986_000 picoseconds. + Weight::from_parts(48_308_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 16_599_000 picoseconds. - Weight::from_parts(16_864_000, 0) + // Minimum execution time: 18_083_000 picoseconds. + Weight::from_parts(18_380_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 23_502_000 picoseconds. - Weight::from_parts(24_050_000, 0) + // Minimum execution time: 26_341_000 picoseconds. + Weight::from_parts(26_703_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 55_856_000 picoseconds. - Weight::from_parts(56_352_000, 0) + // Minimum execution time: 66_227_000 picoseconds. + Weight::from_parts(67_321_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 49_975_000 picoseconds. - Weight::from_parts(50_428_000, 0) + // Minimum execution time: 59_472_000 picoseconds. + Weight::from_parts(60_842_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 19_123_000 picoseconds. - Weight::from_parts(19_504_000, 0) + // Minimum execution time: 21_497_000 picoseconds. + Weight::from_parts(21_684_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 18_190_000 picoseconds. - Weight::from_parts(18_547_000, 0) + // Minimum execution time: 20_385_000 picoseconds. + Weight::from_parts(20_587_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 10_152 - .saturating_add(Weight::from_parts(14_418_366, 0).saturating_mul(u.into())) + // Standard Error: 10_001 + .saturating_add(Weight::from_parts(16_801_557, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs index 1d48699a2e8..59a867d8ab2 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 @@ -57,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `214 + b * (78 ±0)` // Estimated: `1203 + b * (2554 ±0)` - // Minimum execution time: 15_037_000 picoseconds. - Weight::from_parts(15_261_610, 0) + // Minimum execution time: 14_702_000 picoseconds. + Weight::from_parts(14_995_989, 0) .saturating_add(Weight::from_parts(0, 1203)) - // Standard Error: 3_033 - .saturating_add(Weight::from_parts(2_590_070, 0).saturating_mul(b.into())) + // Standard Error: 2_975 + .saturating_add(Weight::from_parts(2_630_139, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -72,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_317_000 picoseconds. - Weight::from_parts(7_493_000, 0) + // Minimum execution time: 6_916_000 picoseconds. + Weight::from_parts(7_224_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -83,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_580_000 picoseconds. - Weight::from_parts(7_821_000, 0) + // Minimum execution time: 7_035_000 picoseconds. + Weight::from_parts(7_334_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,11 +105,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `1104 + c * (48 ±0)` // Estimated: `49487 + c * (49 ±0)` - // Minimum execution time: 42_783_000 picoseconds. - Weight::from_parts(35_128_208, 0) + // Minimum execution time: 42_377_000 picoseconds. + Weight::from_parts(34_785_115, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_291 - .saturating_add(Weight::from_parts(109_890, 0).saturating_mul(c.into())) + // Standard Error: 1_226 + .saturating_add(Weight::from_parts(101_867, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -123,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `428 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 34_135_000 picoseconds. - Weight::from_parts(23_714_718, 0) + // Minimum execution time: 33_648_000 picoseconds. + Weight::from_parts(24_533_176, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_293 - .saturating_add(Weight::from_parts(108_542, 0).saturating_mul(c.into())) + // Standard Error: 1_388 + .saturating_add(Weight::from_parts(103_733, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -141,8 +141,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `155` // Estimated: `6196` - // Minimum execution time: 44_345_000 picoseconds. - Weight::from_parts(44_853_000, 0) + // Minimum execution time: 44_705_000 picoseconds. + Weight::from_parts(45_288_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) @@ -196,11 +196,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `22815 + c * (97 ±0) + r * (116 ±0)` // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 16_932_000 picoseconds. - Weight::from_parts(17_022_000, 0) + // Minimum execution time: 16_845_000 picoseconds. + Weight::from_parts(16_962_000, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 901_942 - .saturating_add(Weight::from_parts(31_973_621, 0).saturating_mul(c.into())) + // Standard Error: 858_960 + .saturating_add(Weight::from_parts(30_464_644, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs index f6a3b504a67..ac7f2efb023 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_985_000 picoseconds. - Weight::from_parts(12_506_234, 0) + // Minimum execution time: 11_056_000 picoseconds. + Weight::from_parts(11_510_137, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2 - .saturating_add(Weight::from_parts(601, 0).saturating_mul(z.into())) + // Standard Error: 1 + .saturating_add(Weight::from_parts(528, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -67,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 41_586_000 picoseconds. - Weight::from_parts(35_547_263, 0) + // Minimum execution time: 41_105_000 picoseconds. + Weight::from_parts(34_947_072, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 376 - .saturating_add(Weight::from_parts(69_533, 0).saturating_mul(s.into())) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_289, 0).saturating_mul(z.into())) + // Standard Error: 499 + .saturating_add(Weight::from_parts(67_375, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_227, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -85,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 27_819_000 picoseconds. - Weight::from_parts(21_900_751, 0) + // Minimum execution time: 26_640_000 picoseconds. + Weight::from_parts(21_515_344, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 292 - .saturating_add(Weight::from_parts(65_723, 0).saturating_mul(s.into())) - // Standard Error: 2 - .saturating_add(Weight::from_parts(1_301, 0).saturating_mul(z.into())) + // Standard Error: 943 + .saturating_add(Weight::from_parts(58_769, 0).saturating_mul(s.into())) + // Standard Error: 9 + .saturating_add(Weight::from_parts(1_233, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,13 +105,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `388 + s * (33 ±0)` // Estimated: `6811` - // Minimum execution time: 46_840_000 picoseconds. - Weight::from_parts(39_004_058, 0) + // Minimum execution time: 45_875_000 picoseconds. + Weight::from_parts(38_052_994, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 490 - .saturating_add(Weight::from_parts(86_465, 0).saturating_mul(s.into())) + // Standard Error: 507 + .saturating_add(Weight::from_parts(82_957, 0).saturating_mul(s.into())) // Standard Error: 4 - .saturating_add(Weight::from_parts(1_317, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_277, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -122,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 32_549_000 picoseconds. - Weight::from_parts(33_945_862, 0) + // Minimum execution time: 32_359_000 picoseconds. + Weight::from_parts(33_845_761, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 599 - .saturating_add(Weight::from_parts(74_298, 0).saturating_mul(s.into())) + // Standard Error: 623 + .saturating_add(Weight::from_parts(69_809, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -137,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 19_264_000 picoseconds. - Weight::from_parts(20_336_652, 0) + // Minimum execution time: 18_791_000 picoseconds. + Weight::from_parts(20_017_375, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 420 - .saturating_add(Weight::from_parts(67_305, 0).saturating_mul(s.into())) + // Standard Error: 466 + .saturating_add(Weight::from_parts(64_780, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -152,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 33_469_000 picoseconds. - Weight::from_parts(35_060_138, 0) + // Minimum execution time: 33_132_000 picoseconds. + Weight::from_parts(34_485_734, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 575 - .saturating_add(Weight::from_parts(72_357, 0).saturating_mul(s.into())) + // Standard Error: 601 + .saturating_add(Weight::from_parts(70_191, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs index 653161034d9..215267bb090 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `297` // Estimated: `3762` - // Minimum execution time: 17_971_000 picoseconds. - Weight::from_parts(18_440_000, 0) + // Minimum execution time: 17_809_000 picoseconds. + Weight::from_parts(18_215_000, 0) .saturating_add(Weight::from_parts(0, 3762)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,8 +70,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `279` // Estimated: `3744` - // Minimum execution time: 13_516_000 picoseconds. - Weight::from_parts(13_855_000, 0) + // Minimum execution time: 13_565_000 picoseconds. + Weight::from_parts(13_841_000, 0) .saturating_add(Weight::from_parts(0, 3744)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs index a7e0a69ca71..4b86e3bc416 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `49` // Estimated: `1493` - // Minimum execution time: 7_754_000 picoseconds. - Weight::from_parts(7_961_000, 0) + // Minimum execution time: 7_796_000 picoseconds. + Weight::from_parts(8_128_000, 0) .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_099_000 picoseconds. - Weight::from_parts(3_194_000, 0) + // Minimum execution time: 3_268_000 picoseconds. + Weight::from_parts(3_351_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs index b9ab2ec61e5..e54fee154f0 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 @@ -53,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_486_000 picoseconds. - Weight::from_parts(4_952_171, 0) + // Minimum execution time: 7_032_000 picoseconds. + Weight::from_parts(7_713_695, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_744 - .saturating_add(Weight::from_parts(4_878_827, 0).saturating_mul(c.into())) + // Standard Error: 2_526 + .saturating_add(Weight::from_parts(4_329_716, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_441_000 picoseconds. - Weight::from_parts(5_550_000, 0) + // Minimum execution time: 4_961_000 picoseconds. + Weight::from_parts(5_064_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -72,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_417_000 picoseconds. - Weight::from_parts(3_647_457, 0) + // Minimum execution time: 6_955_000 picoseconds. + Weight::from_parts(17_856_282, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_303 - .saturating_add(Weight::from_parts(5_198_660, 0).saturating_mul(c.into())) + // Standard Error: 3_463 + .saturating_add(Weight::from_parts(4_554_734, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_828_000 picoseconds. - Weight::from_parts(10_044_000, 0) + // Minimum execution time: 8_841_000 picoseconds. + Weight::from_parts(9_004_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -91,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_599_000 picoseconds. - Weight::from_parts(7_657_000, 0) + // Minimum execution time: 6_737_000 picoseconds. + Weight::from_parts(7_653_355, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_773 - .saturating_add(Weight::from_parts(4_893_962, 0).saturating_mul(c.into())) + // Standard Error: 3_915 + .saturating_add(Weight::from_parts(4_372_646, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs index ec1fd4a40d3..1c721a37230 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 @@ -62,8 +62,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 27_316_000 picoseconds. - Weight::from_parts(27_658_000, 0) + // Minimum execution time: 25_931_000 picoseconds. + Weight::from_parts(26_340_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -74,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1489` - // Minimum execution time: 29_202_000 picoseconds. - Weight::from_parts(29_681_000, 0) + // Minimum execution time: 25_691_000 picoseconds. + Weight::from_parts(25_971_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -105,8 +105,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_266_000 picoseconds. - Weight::from_parts(10_449_000, 0) + // Minimum execution time: 9_572_000 picoseconds. + Weight::from_parts(9_924_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -116,8 +116,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_095_000 picoseconds. - Weight::from_parts(3_171_000, 0) + // Minimum execution time: 2_997_000 picoseconds. + Weight::from_parts(3_136_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -141,8 +141,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 31_614_000 picoseconds. - Weight::from_parts(32_390_000, 0) + // Minimum execution time: 30_271_000 picoseconds. + Weight::from_parts(30_819_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) @@ -165,8 +165,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `220` // Estimated: `3685` - // Minimum execution time: 33_334_000 picoseconds. - Weight::from_parts(33_789_000, 0) + // Minimum execution time: 32_302_000 picoseconds. + Weight::from_parts(32_807_000, 0) .saturating_add(Weight::from_parts(0, 3685)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) @@ -177,8 +177,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_178_000 picoseconds. - Weight::from_parts(3_261_000, 0) + // Minimum execution time: 2_960_000 picoseconds. + Weight::from_parts(3_094_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -188,8 +188,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `95` // Estimated: `10985` - // Minimum execution time: 14_687_000 picoseconds. - Weight::from_parts(15_004_000, 0) + // Minimum execution time: 14_877_000 picoseconds. + Weight::from_parts(15_296_000, 0) .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -200,8 +200,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `99` // Estimated: `10989` - // Minimum execution time: 14_595_000 picoseconds. - Weight::from_parts(14_813_000, 0) + // Minimum execution time: 14_835_000 picoseconds. + Weight::from_parts(15_115_000, 0) .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -212,8 +212,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `13471` - // Minimum execution time: 14_926_000 picoseconds. - Weight::from_parts(15_337_000, 0) + // Minimum execution time: 15_368_000 picoseconds. + Weight::from_parts(15_596_000, 0) .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -233,8 +233,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `6046` - // Minimum execution time: 28_680_000 picoseconds. - Weight::from_parts(29_159_000, 0) + // Minimum execution time: 28_025_000 picoseconds. + Weight::from_parts(28_524_000, 0) .saturating_add(Weight::from_parts(0, 6046)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -245,8 +245,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `136` // Estimated: `8551` - // Minimum execution time: 8_124_000 picoseconds. - Weight::from_parts(8_299_000, 0) + // Minimum execution time: 8_166_000 picoseconds. + Weight::from_parts(8_314_000, 0) .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -256,8 +256,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `10996` - // Minimum execution time: 14_755_000 picoseconds. - Weight::from_parts(15_136_000, 0) + // Minimum execution time: 14_871_000 picoseconds. + Weight::from_parts(15_374_000, 0) .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -278,8 +278,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `112` // Estimated: `11002` - // Minimum execution time: 34_250_000 picoseconds. - Weight::from_parts(34_888_000, 0) + // Minimum execution time: 33_611_000 picoseconds. + Weight::from_parts(34_008_000, 0) .saturating_add(Weight::from_parts(0, 11002)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index c15e866ce9f..69a338953ec 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 25_169_000 picoseconds. - Weight::from_parts(25_584_000, 3593) + // Minimum execution time: 23_309_000 picoseconds. + Weight::from_parts(23_777_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `153` // Estimated: `6196` - // Minimum execution time: 50_714_000 picoseconds. - Weight::from_parts(51_324_000, 6196) + // Minimum execution time: 48_808_000 picoseconds. + Weight::from_parts(49_427_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -88,8 +88,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `223` // Estimated: `6196` - // Minimum execution time: 74_593_000 picoseconds. - Weight::from_parts(75_347_000, 6196) + // Minimum execution time: 71_204_000 picoseconds. + Weight::from_parts(72_121_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_485_000 picoseconds. - Weight::from_parts(4_562_000, 0) + // Minimum execution time: 3_559_000 picoseconds. + Weight::from_parts(3_616_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `52` // Estimated: `3593` - // Minimum execution time: 27_136_000 picoseconds. - Weight::from_parts(27_387_000, 3593) + // Minimum execution time: 25_042_000 picoseconds. + Weight::from_parts(25_630_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -129,8 +129,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `122` // Estimated: `3593` - // Minimum execution time: 53_591_000 picoseconds. - Weight::from_parts(54_268_000, 3593) + // Minimum execution time: 49_030_000 picoseconds. + Weight::from_parts(49_828_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -150,8 +150,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 30_062_000 picoseconds. - Weight::from_parts(30_771_000, 3535) + // Minimum execution time: 27_142_000 picoseconds. + Weight::from_parts(27_416_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 0b4b1174160..af6375385fc 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 @@ -64,8 +64,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 34_626_000 picoseconds. - Weight::from_parts(35_122_000, 3535) + // Minimum execution time: 30_210_000 picoseconds. + Weight::from_parts(30_864_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_405_000 picoseconds. - Weight::from_parts(3_503_000, 0) + // Minimum execution time: 2_808_000 picoseconds. + Weight::from_parts(2_848_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 11_296_000 picoseconds. - Weight::from_parts(11_550_000, 3497) + // Minimum execution time: 10_353_000 picoseconds. + Weight::from_parts(10_569_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_932_000 picoseconds. - Weight::from_parts(14_220_000, 0) + // Minimum execution time: 12_074_000 picoseconds. + Weight::from_parts(12_280_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_640_000 picoseconds. - Weight::from_parts(3_732_000, 0) + // Minimum execution time: 3_080_000 picoseconds. + Weight::from_parts(3_161_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_195_000 picoseconds. - Weight::from_parts(3_298_000, 0) + // Minimum execution time: 2_649_000 picoseconds. + Weight::from_parts(2_732_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_217_000 picoseconds. - Weight::from_parts(3_304_000, 0) + // Minimum execution time: 2_652_000 picoseconds. + Weight::from_parts(2_749_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_237_000 picoseconds. - Weight::from_parts(3_273_000, 0) + // Minimum execution time: 2_642_000 picoseconds. + Weight::from_parts(2_704_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_292_000 picoseconds. - Weight::from_parts(4_373_000, 0) + // Minimum execution time: 3_438_000 picoseconds. + Weight::from_parts(3_508_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_198_000 picoseconds. - Weight::from_parts(3_271_000, 0) + // Minimum execution time: 2_626_000 picoseconds. + Weight::from_parts(2_701_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -151,8 +151,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 27_178_000 picoseconds. - Weight::from_parts(28_171_000, 3535) + // Minimum execution time: 24_737_000 picoseconds. + Weight::from_parts(25_106_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 16_146_000 picoseconds. - Weight::from_parts(16_496_000, 3555) + // Minimum execution time: 14_712_000 picoseconds. + Weight::from_parts(14_976_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_189_000 picoseconds. - Weight::from_parts(3_298_000, 0) + // Minimum execution time: 2_689_000 picoseconds. + Weight::from_parts(2_739_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -190,8 +190,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 27_844_000 picoseconds. - Weight::from_parts(28_113_000, 3503) + // Minimum execution time: 26_478_000 picoseconds. + Weight::from_parts(26_695_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_563_000 picoseconds. - Weight::from_parts(5_718_000, 0) + // Minimum execution time: 4_811_000 picoseconds. + Weight::from_parts(5_062_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -221,8 +221,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 30_296_000 picoseconds. - Weight::from_parts(30_843_000, 3535) + // Minimum execution time: 26_945_000 picoseconds. + Weight::from_parts(28_093_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_340_000 picoseconds. - Weight::from_parts(5_390_000, 0) + // Minimum execution time: 4_144_000 picoseconds. + Weight::from_parts(4_217_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_312_000 picoseconds. - Weight::from_parts(3_411_000, 0) + // Minimum execution time: 2_726_000 picoseconds. + Weight::from_parts(2_802_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_294_000 picoseconds. - Weight::from_parts(3_374_000, 0) + // Minimum execution time: 2_719_000 picoseconds. + Weight::from_parts(2_790_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_197_000 picoseconds. - Weight::from_parts(3_261_000, 0) + // Minimum execution time: 2_660_000 picoseconds. + Weight::from_parts(2_742_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_465_000 picoseconds. - Weight::from_parts(3_541_000, 0) + // Minimum execution time: 2_874_000 picoseconds. + Weight::from_parts(2_940_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -277,8 +277,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 29_942_000 picoseconds. - Weight::from_parts(30_426_000, 3535) + // Minimum execution time: 27_235_000 picoseconds. + Weight::from_parts(27_811_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_454_000 picoseconds. - Weight::from_parts(5_906_000, 0) + // Minimum execution time: 4_807_000 picoseconds. + Weight::from_parts(4_918_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -305,8 +305,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 27_744_000 picoseconds. - Weight::from_parts(28_116_000, 3535) + // Minimum execution time: 24_698_000 picoseconds. + Weight::from_parts(25_077_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_204_000 picoseconds. - Weight::from_parts(3_352_000, 0) + // Minimum execution time: 2_613_000 picoseconds. + Weight::from_parts(2_703_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_180_000 picoseconds. - Weight::from_parts(3_245_000, 0) + // Minimum execution time: 2_602_000 picoseconds. + Weight::from_parts(2_661_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_195_000 picoseconds. - Weight::from_parts(3_299_000, 0) + // Minimum execution time: 2_557_000 picoseconds. + Weight::from_parts(2_655_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_185_000 picoseconds. - Weight::from_parts(3_279_000, 0) + // Minimum execution time: 2_724_000 picoseconds. + Weight::from_parts(2_760_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_308_000 picoseconds. - Weight::from_parts(3_463_000, 0) + // Minimum execution time: 2_764_000 picoseconds. + Weight::from_parts(2_872_000, 0) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs index 6a04ee76325..1c64eec8a6b 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_425_000 picoseconds. - Weight::from_parts(5_556_000, 0) + // Minimum execution time: 5_621_000 picoseconds. + Weight::from_parts(5_845_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_504_000 picoseconds. - Weight::from_parts(5_706_000, 0) + // Minimum execution time: 5_776_000 picoseconds. + Weight::from_parts(5_992_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs index bcfe953f358..4a919cd0907 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 52_090_000 picoseconds. - Weight::from_parts(52_437_000, 0) + // Minimum execution time: 59_580_000 picoseconds. + Weight::from_parts(60_317_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 39_798_000 picoseconds. - Weight::from_parts(40_230_000, 0) + // Minimum execution time: 45_490_000 picoseconds. + Weight::from_parts(45_910_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 16_110_000 picoseconds. - Weight::from_parts(16_386_000, 0) + // Minimum execution time: 17_353_000 picoseconds. + Weight::from_parts(17_676_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 22_460_000 picoseconds. - Weight::from_parts(23_030_000, 0) + // Minimum execution time: 25_017_000 picoseconds. + Weight::from_parts(25_542_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 53_769_000 picoseconds. - Weight::from_parts(54_256_000, 0) + // Minimum execution time: 61_161_000 picoseconds. + Weight::from_parts(61_665_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 48_582_000 picoseconds. - Weight::from_parts(49_294_000, 0) + // Minimum execution time: 55_422_000 picoseconds. + Weight::from_parts(55_880_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 19_364_000 picoseconds. - Weight::from_parts(19_571_000, 0) + // Minimum execution time: 20_477_000 picoseconds. + Weight::from_parts(20_871_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 17_815_000 picoseconds. - Weight::from_parts(17_974_000, 0) + // Minimum execution time: 19_501_000 picoseconds. + Weight::from_parts(19_726_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 10_230 - .saturating_add(Weight::from_parts(14_059_882, 0).saturating_mul(u.into())) + // Standard Error: 9_495 + .saturating_add(Weight::from_parts(15_658_957, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs index bae3a058100..424da202302 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 @@ -57,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `214 + b * (78 ±0)` // Estimated: `1203 + b * (2554 ±0)` - // Minimum execution time: 14_646_000 picoseconds. - Weight::from_parts(15_408_953, 0) + // Minimum execution time: 14_426_000 picoseconds. + Weight::from_parts(14_971_974, 0) .saturating_add(Weight::from_parts(0, 1203)) - // Standard Error: 3_120 - .saturating_add(Weight::from_parts(2_562_646, 0).saturating_mul(b.into())) + // Standard Error: 2_914 + .saturating_add(Weight::from_parts(2_604_699, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -72,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_277_000 picoseconds. - Weight::from_parts(7_557_000, 0) + // Minimum execution time: 6_977_000 picoseconds. + Weight::from_parts(7_246_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -83,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_684_000 picoseconds. - Weight::from_parts(7_883_000, 0) + // Minimum execution time: 7_191_000 picoseconds. + Weight::from_parts(7_416_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,11 +105,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `1104 + c * (48 ±0)` // Estimated: `49487 + c * (49 ±0)` - // Minimum execution time: 42_488_000 picoseconds. - Weight::from_parts(34_515_606, 0) + // Minimum execution time: 42_275_000 picoseconds. + Weight::from_parts(33_742_215, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_249 - .saturating_add(Weight::from_parts(103_597, 0).saturating_mul(c.into())) + // Standard Error: 1_291 + .saturating_add(Weight::from_parts(103_381, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -123,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `428 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 33_698_000 picoseconds. - Weight::from_parts(22_802_769, 0) + // Minimum execution time: 33_404_000 picoseconds. + Weight::from_parts(22_612_617, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_317 - .saturating_add(Weight::from_parts(107_072, 0).saturating_mul(c.into())) + // Standard Error: 1_341 + .saturating_add(Weight::from_parts(105_669, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -141,8 +141,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `155` // Estimated: `6196` - // Minimum execution time: 43_472_000 picoseconds. - Weight::from_parts(44_218_000, 0) + // Minimum execution time: 44_415_000 picoseconds. + Weight::from_parts(44_732_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) @@ -196,11 +196,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `22815 + c * (97 ±0) + r * (116 ±0)` // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 17_280_000 picoseconds. - Weight::from_parts(17_471_000, 0) + // Minimum execution time: 16_765_000 picoseconds. + Weight::from_parts(16_997_000, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 866_180 - .saturating_add(Weight::from_parts(30_755_948, 0).saturating_mul(c.into())) + // Standard Error: 860_677 + .saturating_add(Weight::from_parts(30_463_094, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs index 7e5c5efcf3f..8cbc0652035 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_575_000 picoseconds. - Weight::from_parts(12_064_176, 0) + // Minimum execution time: 11_337_000 picoseconds. + Weight::from_parts(11_960_522, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3 - .saturating_add(Weight::from_parts(500, 0).saturating_mul(z.into())) + // Standard Error: 9 + .saturating_add(Weight::from_parts(504, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -67,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 40_911_000 picoseconds. - Weight::from_parts(34_976_854, 0) + // Minimum execution time: 41_128_000 picoseconds. + Weight::from_parts(35_215_592, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 418 - .saturating_add(Weight::from_parts(65_759, 0).saturating_mul(s.into())) + // Standard Error: 429 + .saturating_add(Weight::from_parts(65_959, 0).saturating_mul(s.into())) // Standard Error: 4 - .saturating_add(Weight::from_parts(1_190, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_230, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -85,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 26_906_000 picoseconds. - Weight::from_parts(21_462_377, 0) + // Minimum execution time: 26_878_000 picoseconds. + Weight::from_parts(21_448_577, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 351 - .saturating_add(Weight::from_parts(59_241, 0).saturating_mul(s.into())) + // Standard Error: 354 + .saturating_add(Weight::from_parts(60_286, 0).saturating_mul(s.into())) // Standard Error: 3 - .saturating_add(Weight::from_parts(1_204, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_236, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,13 +105,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `388 + s * (33 ±0)` // Estimated: `6811` - // Minimum execution time: 45_289_000 picoseconds. - Weight::from_parts(37_925_050, 0) + // Minimum execution time: 45_716_000 picoseconds. + Weight::from_parts(38_332_947, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 675 - .saturating_add(Weight::from_parts(81_154, 0).saturating_mul(s.into())) - // Standard Error: 6 - .saturating_add(Weight::from_parts(1_237, 0).saturating_mul(z.into())) + // Standard Error: 554 + .saturating_add(Weight::from_parts(81_026, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_265, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -122,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 31_995_000 picoseconds. - Weight::from_parts(33_377_255, 0) + // Minimum execution time: 32_089_000 picoseconds. + Weight::from_parts(33_664_508, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 571 - .saturating_add(Weight::from_parts(69_665, 0).saturating_mul(s.into())) + // Standard Error: 487 + .saturating_add(Weight::from_parts(67_443, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -137,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 18_656_000 picoseconds. - Weight::from_parts(19_906_362, 0) + // Minimum execution time: 18_631_000 picoseconds. + Weight::from_parts(19_909_964, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 431 - .saturating_add(Weight::from_parts(62_284, 0).saturating_mul(s.into())) + // Standard Error: 434 + .saturating_add(Weight::from_parts(62_989, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -152,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 32_875_000 picoseconds. - Weight::from_parts(34_341_729, 0) + // Minimum execution time: 32_486_000 picoseconds. + Weight::from_parts(34_303_784, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 924 - .saturating_add(Weight::from_parts(72_829, 0).saturating_mul(s.into())) + // Standard Error: 585 + .saturating_add(Weight::from_parts(69_979, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs index c97705a6794..dceb8f0e80d 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `297` // Estimated: `3762` - // Minimum execution time: 17_610_000 picoseconds. - Weight::from_parts(18_124_000, 0) + // Minimum execution time: 17_353_000 picoseconds. + Weight::from_parts(18_005_000, 0) .saturating_add(Weight::from_parts(0, 3762)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,8 +70,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `279` // Estimated: `3744` - // Minimum execution time: 13_143_000 picoseconds. - Weight::from_parts(13_552_000, 0) + // Minimum execution time: 13_039_000 picoseconds. + Weight::from_parts(13_341_000, 0) .saturating_add(Weight::from_parts(0, 3744)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs index 4b5d0156670..638e28c9591 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `49` // Estimated: `1493` - // Minimum execution time: 7_574_000 picoseconds. - Weight::from_parts(7_792_000, 0) + // Minimum execution time: 7_986_000 picoseconds. + Weight::from_parts(8_134_000, 0) .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_081_000 picoseconds. - Weight::from_parts(3_148_000, 0) + // Minimum execution time: 3_257_000 picoseconds. + Weight::from_parts(3_366_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs index 816c705a772..ddea5102eff 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 @@ -53,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_261_000 picoseconds. - Weight::from_parts(8_284_145, 0) + // Minimum execution time: 6_697_000 picoseconds. + Weight::from_parts(11_859_145, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_294 - .saturating_add(Weight::from_parts(4_497_661, 0).saturating_mul(c.into())) + // Standard Error: 3_146 + .saturating_add(Weight::from_parts(4_300_555, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_294_000 picoseconds. - Weight::from_parts(5_475_000, 0) + // Minimum execution time: 4_979_000 picoseconds. + Weight::from_parts(5_066_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -72,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_042_000 picoseconds. - Weight::from_parts(5_814_168, 0) + // Minimum execution time: 6_741_000 picoseconds. + Weight::from_parts(15_928_547, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_914 - .saturating_add(Weight::from_parts(4_802_976, 0).saturating_mul(c.into())) + // Standard Error: 3_310 + .saturating_add(Weight::from_parts(4_527_996, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_260_000 picoseconds. - Weight::from_parts(9_406_000, 0) + // Minimum execution time: 8_717_000 picoseconds. + Weight::from_parts(8_909_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -91,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_109_000 picoseconds. - Weight::from_parts(3_793_543, 0) + // Minimum execution time: 6_814_000 picoseconds. + Weight::from_parts(13_920_831, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_940 - .saturating_add(Weight::from_parts(4_479_763, 0).saturating_mul(c.into())) + // Standard Error: 7_605 + .saturating_add(Weight::from_parts(4_306_193, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs index fdbde818da9..bab6a3e3adf 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 @@ -62,8 +62,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 25_921_000 picoseconds. - Weight::from_parts(26_233_000, 0) + // Minimum execution time: 25_783_000 picoseconds. + Weight::from_parts(26_398_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -74,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1489` - // Minimum execution time: 26_254_000 picoseconds. - Weight::from_parts(26_615_000, 0) + // Minimum execution time: 25_511_000 picoseconds. + Weight::from_parts(26_120_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -105,8 +105,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_756_000 picoseconds. - Weight::from_parts(9_989_000, 0) + // Minimum execution time: 9_707_000 picoseconds. + Weight::from_parts(9_874_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -116,8 +116,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_147_000 picoseconds. - Weight::from_parts(3_248_000, 0) + // Minimum execution time: 3_073_000 picoseconds. + Weight::from_parts(3_183_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -141,8 +141,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 31_089_000 picoseconds. - Weight::from_parts(31_503_000, 0) + // Minimum execution time: 30_999_000 picoseconds. + Weight::from_parts(31_641_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) @@ -165,8 +165,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `220` // Estimated: `3685` - // Minimum execution time: 33_219_000 picoseconds. - Weight::from_parts(33_708_000, 0) + // Minimum execution time: 33_036_000 picoseconds. + Weight::from_parts(33_596_000, 0) .saturating_add(Weight::from_parts(0, 3685)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) @@ -177,8 +177,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_042_000 picoseconds. - Weight::from_parts(3_175_000, 0) + // Minimum execution time: 3_035_000 picoseconds. + Weight::from_parts(3_154_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -188,8 +188,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `95` // Estimated: `10985` - // Minimum execution time: 15_040_000 picoseconds. - Weight::from_parts(15_455_000, 0) + // Minimum execution time: 14_805_000 picoseconds. + Weight::from_parts(15_120_000, 0) .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -200,8 +200,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `99` // Estimated: `10989` - // Minimum execution time: 14_999_000 picoseconds. - Weight::from_parts(15_417_000, 0) + // Minimum execution time: 14_572_000 picoseconds. + Weight::from_parts(14_909_000, 0) .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -212,8 +212,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `13471` - // Minimum execution time: 15_694_000 picoseconds. - Weight::from_parts(15_916_000, 0) + // Minimum execution time: 15_341_000 picoseconds. + Weight::from_parts(15_708_000, 0) .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -233,8 +233,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `6046` - // Minimum execution time: 28_164_000 picoseconds. - Weight::from_parts(28_489_000, 0) + // Minimum execution time: 27_840_000 picoseconds. + Weight::from_parts(28_248_000, 0) .saturating_add(Weight::from_parts(0, 6046)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -245,8 +245,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `136` // Estimated: `8551` - // Minimum execution time: 8_273_000 picoseconds. - Weight::from_parts(8_471_000, 0) + // Minimum execution time: 8_245_000 picoseconds. + Weight::from_parts(8_523_000, 0) .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -256,8 +256,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `10996` - // Minimum execution time: 15_009_000 picoseconds. - Weight::from_parts(15_459_000, 0) + // Minimum execution time: 14_780_000 picoseconds. + Weight::from_parts(15_173_000, 0) .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -278,8 +278,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `112` // Estimated: `11002` - // Minimum execution time: 33_647_000 picoseconds. - Weight::from_parts(34_065_000, 0) + // Minimum execution time: 33_422_000 picoseconds. + Weight::from_parts(34_076_000, 0) .saturating_add(Weight::from_parts(0, 11002)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index e91a3d7f59f..8934d0df0fc 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 23_577_000 picoseconds. - Weight::from_parts(24_152_000, 3593) + // Minimum execution time: 23_363_000 picoseconds. + Weight::from_parts(23_663_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `153` // Estimated: `6196` - // Minimum execution time: 49_336_000 picoseconds. - Weight::from_parts(49_673_000, 6196) + // Minimum execution time: 49_093_000 picoseconds. + Weight::from_parts(49_719_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -88,8 +88,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `223` // Estimated: `6196` - // Minimum execution time: 72_360_000 picoseconds. - Weight::from_parts(72_916_000, 6196) + // Minimum execution time: 74_134_000 picoseconds. + Weight::from_parts(74_719_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_838_000 picoseconds. - Weight::from_parts(3_928_000, 0) + // Minimum execution time: 3_726_000 picoseconds. + Weight::from_parts(3_881_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `52` // Estimated: `3593` - // Minimum execution time: 26_214_000 picoseconds. - Weight::from_parts(26_718_000, 3593) + // Minimum execution time: 25_903_000 picoseconds. + Weight::from_parts(26_150_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -129,8 +129,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `122` // Estimated: `3593` - // Minimum execution time: 52_341_000 picoseconds. - Weight::from_parts(52_801_000, 3593) + // Minimum execution time: 51_084_000 picoseconds. + Weight::from_parts(51_859_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -150,8 +150,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 28_785_000 picoseconds. - Weight::from_parts(29_133_000, 3535) + // Minimum execution time: 28_038_000 picoseconds. + Weight::from_parts(28_438_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 3cf25c1e8f8..fbec8baa2d5 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 @@ -64,8 +64,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 31_194_000 picoseconds. - Weight::from_parts(31_563_000, 3535) + // Minimum execution time: 30_819_000 picoseconds. + Weight::from_parts(31_157_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_905_000 picoseconds. - Weight::from_parts(3_006_000, 0) + // Minimum execution time: 2_869_000 picoseconds. + Weight::from_parts(2_920_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 10_292_000 picoseconds. - Weight::from_parts(10_503_000, 3497) + // Minimum execution time: 10_268_000 picoseconds. + Weight::from_parts(10_496_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_198_000 picoseconds. - Weight::from_parts(12_445_000, 0) + // Minimum execution time: 11_990_000 picoseconds. + Weight::from_parts(12_206_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_199_000 picoseconds. - Weight::from_parts(3_286_000, 0) + // Minimum execution time: 3_170_000 picoseconds. + Weight::from_parts(3_308_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_780_000 picoseconds. - Weight::from_parts(2_847_000, 0) + // Minimum execution time: 2_650_000 picoseconds. + Weight::from_parts(2_783_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_787_000 picoseconds. - Weight::from_parts(2_835_000, 0) + // Minimum execution time: 2_681_000 picoseconds. + Weight::from_parts(2_829_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_822_000 picoseconds. - Weight::from_parts(2_853_000, 0) + // Minimum execution time: 2_622_000 picoseconds. + Weight::from_parts(2_688_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_671_000 picoseconds. - Weight::from_parts(3_746_000, 0) + // Minimum execution time: 3_385_000 picoseconds. + Weight::from_parts(3_538_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_748_000 picoseconds. - Weight::from_parts(2_818_000, 0) + // Minimum execution time: 2_630_000 picoseconds. + Weight::from_parts(2_720_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -151,8 +151,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 24_294_000 picoseconds. - Weight::from_parts(24_640_000, 3535) + // Minimum execution time: 24_446_000 picoseconds. + Weight::from_parts(24_854_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -162,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 14_359_000 picoseconds. - Weight::from_parts(14_550_000, 3555) + // Minimum execution time: 14_713_000 picoseconds. + Weight::from_parts(15_010_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_792_000 picoseconds. - Weight::from_parts(2_884_000, 0) + // Minimum execution time: 2_702_000 picoseconds. + Weight::from_parts(2_744_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -190,8 +190,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 25_925_000 picoseconds. - Weight::from_parts(26_130_000, 3503) + // Minimum execution time: 25_955_000 picoseconds. + Weight::from_parts(26_632_000, 3503) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_004_000 picoseconds. - Weight::from_parts(5_141_000, 0) + // Minimum execution time: 4_965_000 picoseconds. + Weight::from_parts(5_168_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -221,8 +221,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 27_163_000 picoseconds. - Weight::from_parts(27_722_000, 3535) + // Minimum execution time: 27_707_000 picoseconds. + Weight::from_parts(28_081_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_430_000 picoseconds. - Weight::from_parts(4_492_000, 0) + // Minimum execution time: 4_215_000 picoseconds. + Weight::from_parts(4_362_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_870_000 picoseconds. - Weight::from_parts(2_998_000, 0) + // Minimum execution time: 2_843_000 picoseconds. + Weight::from_parts(2_957_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_845_000 picoseconds. - Weight::from_parts(2_893_000, 0) + // Minimum execution time: 2_751_000 picoseconds. + Weight::from_parts(2_809_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_753_000 picoseconds. - Weight::from_parts(2_816_000, 0) + // Minimum execution time: 2_674_000 picoseconds. + Weight::from_parts(2_737_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_992_000 picoseconds. - Weight::from_parts(3_068_000, 0) + // Minimum execution time: 2_891_000 picoseconds. + Weight::from_parts(2_952_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -277,8 +277,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 27_324_000 picoseconds. - Weight::from_parts(27_656_000, 3535) + // Minimum execution time: 28_600_000 picoseconds. + Weight::from_parts(29_001_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_830_000 picoseconds. - Weight::from_parts(4_903_000, 0) + // Minimum execution time: 4_748_000 picoseconds. + Weight::from_parts(4_813_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -305,8 +305,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3535` - // Minimum execution time: 24_428_000 picoseconds. - Weight::from_parts(24_732_000, 3535) + // Minimum execution time: 25_483_000 picoseconds. + Weight::from_parts(25_737_000, 3535) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,35 +314,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_779_000 picoseconds. - Weight::from_parts(2_822_000, 0) + // Minimum execution time: 2_755_000 picoseconds. + Weight::from_parts(2_817_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_789_000 picoseconds. - Weight::from_parts(2_873_000, 0) + // Minimum execution time: 2_700_000 picoseconds. + Weight::from_parts(2_773_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_819_000 picoseconds. - Weight::from_parts(2_904_000, 0) + // Minimum execution time: 2_670_000 picoseconds. + Weight::from_parts(2_711_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_788_000 picoseconds. - Weight::from_parts(2_887_000, 0) + // Minimum execution time: 2_710_000 picoseconds. + Weight::from_parts(2_762_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_006_000 picoseconds. - Weight::from_parts(3_078_000, 0) + // Minimum execution time: 2_839_000 picoseconds. + Weight::from_parts(2_931_000, 0) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs index 41db3176f35..e19856309a5 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_293_000 picoseconds. - Weight::from_parts(5_572_000, 0) + // Minimum execution time: 5_593_000 picoseconds. + Weight::from_parts(5_807_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_449_000 picoseconds. - Weight::from_parts(5_627_000, 0) + // Minimum execution time: 5_586_000 picoseconds. + Weight::from_parts(5_790_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs index bba8bf0318e..86833064547 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 54_781_000 picoseconds. - Weight::from_parts(55_287_000, 0) + // Minimum execution time: 60_129_000 picoseconds. + Weight::from_parts(60_835_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 41_473_000 picoseconds. - Weight::from_parts(41_749_000, 0) + // Minimum execution time: 45_611_000 picoseconds. + Weight::from_parts(46_099_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 16_997_000 picoseconds. - Weight::from_parts(17_207_000, 0) + // Minimum execution time: 18_068_000 picoseconds. + Weight::from_parts(18_638_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 23_998_000 picoseconds. - Weight::from_parts(24_245_000, 0) + // Minimum execution time: 26_141_000 picoseconds. + Weight::from_parts(26_609_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 56_390_000 picoseconds. - Weight::from_parts(56_963_000, 0) + // Minimum execution time: 61_259_000 picoseconds. + Weight::from_parts(62_144_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 50_769_000 picoseconds. - Weight::from_parts(51_077_000, 0) + // Minimum execution time: 55_871_000 picoseconds. + Weight::from_parts(56_355_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 19_617_000 picoseconds. - Weight::from_parts(19_827_000, 0) + // Minimum execution time: 21_540_000 picoseconds. + Weight::from_parts(22_236_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 18_453_000 picoseconds. - Weight::from_parts(18_528_000, 0) + // Minimum execution time: 19_616_000 picoseconds. + Weight::from_parts(19_838_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 10_749 - .saturating_add(Weight::from_parts(14_321_237, 0).saturating_mul(u.into())) + // Standard Error: 10_829 + .saturating_add(Weight::from_parts(15_803_166, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs new file mode 100644 index 00000000000..2465d52cbe6 --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs @@ -0,0 +1,81 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_grandpa` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=bridge-hub-rococo-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_bridge_grandpa +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_grandpa`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_grandpa::WeightInfo for WeightInfo { + /// Storage: BridgeRococoGrandpa PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoGrandpa PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa BestFinalized (r:1 w:1) + /// Proof: BridgeRococoGrandpa BestFinalized (max_values: Some(1), max_size: Some(36), added: 531, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa CurrentAuthoritySet (r:1 w:0) + /// Proof: BridgeRococoGrandpa CurrentAuthoritySet (max_values: Some(1), max_size: Some(50250), added: 50745, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa ImportedHashesPointer (r:1 w:1) + /// Proof: BridgeRococoGrandpa ImportedHashesPointer (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa ImportedHashes (r:1 w:1) + /// Proof: BridgeRococoGrandpa ImportedHashes (max_values: Some(1024), max_size: Some(36), added: 1521, mode: MaxEncodedLen) + /// Storage: BridgeRococoGrandpa ImportedHeaders (r:0 w:2) + /// Proof: BridgeRococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// The range of component `p` is `[1, 838]`. + /// The range of component `v` is `[50, 100]`. + /// The range of component `p` is `[1, 838]`. + /// The range of component `v` is `[50, 100]`. + fn submit_finality_proof(p: u32, v: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `231 + p * (60 ±0)` + // Estimated: `51735` + // Minimum execution time: 241_332_000 picoseconds. + Weight::from_parts(69_790_821, 0) + .saturating_add(Weight::from_parts(0, 51735)) + // Standard Error: 6_013 + .saturating_add(Weight::from_parts(47_580_554, 0).saturating_mul(p.into())) + // Standard Error: 100_298 + .saturating_add(Weight::from_parts(1_213_475, 0).saturating_mul(v.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(5)) + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs new file mode 100644 index 00000000000..f5ab0edddde --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs @@ -0,0 +1,231 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_messages` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=bridge-hub-rococo-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_bridge_messages +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_messages`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_messages::WeightInfo for WeightInfo { + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn receive_single_message_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `52645` + // Minimum execution time: 43_187_000 picoseconds. + Weight::from_parts(43_681_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn receive_two_messages_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `52645` + // Minimum execution time: 54_131_000 picoseconds. + Weight::from_parts(54_813_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn receive_single_message_proof_with_outbound_lane_state() -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `52645` + // Minimum execution time: 48_120_000 picoseconds. + Weight::from_parts(48_733_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_1_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `335` + // Estimated: `52645` + // Minimum execution time: 41_028_000 picoseconds. + Weight::from_parts(41_635_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_16_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `335` + // Estimated: `52645` + // Minimum execution time: 68_499_000 picoseconds. + Weight::from_parts(69_263_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages OutboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) + /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn receive_delivery_proof_for_single_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `339` + // Estimated: `3804` + // Minimum execution time: 32_277_000 picoseconds. + Weight::from_parts(32_880_000, 0) + .saturating_add(Weight::from_parts(0, 3804)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages OutboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) + /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { + // Proof Size summary in bytes: + // Measured: `339` + // Estimated: `3804` + // Minimum execution time: 32_504_000 picoseconds. + Weight::from_parts(33_085_000, 0) + .saturating_add(Weight::from_parts(0, 3804)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages OutboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) + /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) + /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { + // Proof Size summary in bytes: + // Measured: `339` + // Estimated: `6086` + // Minimum execution time: 34_963_000 picoseconds. + Weight::from_parts(35_473_000, 0) + .saturating_add(Weight::from_parts(0, 6086)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) + /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) + /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) + /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) + /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) + /// The range of component `i` is `[128, 2048]`. + /// The range of component `i` is `[128, 2048]`. + fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `635` + // Estimated: `52645` + // Minimum execution time: 129_978_000 picoseconds. + Weight::from_parts(98_246_356, 0) + .saturating_add(Weight::from_parts(0, 52645)) + // Standard Error: 2_554 + .saturating_add(Weight::from_parts(544_728, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs new file mode 100644 index 00000000000..d77c43e729f --- /dev/null +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs @@ -0,0 +1,113 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_parachains` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=bridge-hub-rococo-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_bridge_parachains +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_parachains`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_parachains::WeightInfo for WeightInfo { + /// Storage: BridgeWococoParachain PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeWococoGrandpa ImportedHeaders (r:1 w:0) + /// Proof: BridgeWococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ParasInfo (r:1 w:1) + /// Proof: BridgeWococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHashes (r:1 w:1) + /// Proof: BridgeWococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:0 w:1) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + /// The range of component `p` is `[1, 2]`. + /// The range of component `p` is `[1, 2]`. + fn submit_parachain_heads_with_n_parachains(_p: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `2543` + // Minimum execution time: 34_759_000 picoseconds. + Weight::from_parts(35_709_034, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: BridgeWococoParachain PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeWococoGrandpa ImportedHeaders (r:1 w:0) + /// Proof: BridgeWococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ParasInfo (r:1 w:1) + /// Proof: BridgeWococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHashes (r:1 w:1) + /// Proof: BridgeWococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:0 w:1) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + fn submit_parachain_heads_with_1kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `2543` + // Minimum execution time: 36_005_000 picoseconds. + Weight::from_parts(36_492_000, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: BridgeWococoParachain PalletOperatingMode (r:1 w:0) + /// Proof: BridgeWococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: BridgeWococoGrandpa ImportedHeaders (r:1 w:0) + /// Proof: BridgeWococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ParasInfo (r:1 w:1) + /// Proof: BridgeWococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHashes (r:1 w:1) + /// Proof: BridgeWococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) + /// Storage: BridgeWococoParachain ImportedParaHeads (r:0 w:1) + /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) + fn submit_parachain_heads_with_16kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `367` + // Estimated: `2543` + // Minimum execution time: 62_374_000 picoseconds. + Weight::from_parts(62_977_000, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } +} diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs index 418f1326766..e11b3e663b8 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs @@ -17,26 +17,25 @@ //! Autogenerated weights for `pallet_bridge_relayers` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./artifacts/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --chain=bridge-hub-rococo-dev // --execution=wasm // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_bridge_relayers -// --chain=bridge-hub-rococo-dev +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ +// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -57,8 +56,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `207` // Estimated: `3593` - // Minimum execution time: 53_286_000 picoseconds. - Weight::from_parts(53_905_000, 0) + // Minimum execution time: 52_759_000 picoseconds. + Weight::from_parts(53_422_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -73,8 +72,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `61` // Estimated: `4714` - // Minimum execution time: 29_145_000 picoseconds. - Weight::from_parts(29_698_000, 0) + // Minimum execution time: 29_175_000 picoseconds. + Weight::from_parts(29_659_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -87,8 +86,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `160` // Estimated: `4714` - // Minimum execution time: 30_298_000 picoseconds. - Weight::from_parts(30_754_000, 0) + // Minimum execution time: 30_384_000 picoseconds. + Weight::from_parts(30_799_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -103,8 +102,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `263` // Estimated: `4714` - // Minimum execution time: 30_109_000 picoseconds. - Weight::from_parts(30_330_000, 0) + // Minimum execution time: 29_987_000 picoseconds. + Weight::from_parts(30_365_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -115,8 +114,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `6` // Estimated: `3538` - // Minimum execution time: 3_016_000 picoseconds. - Weight::from_parts(3_130_000, 0) + // Minimum execution time: 3_116_000 picoseconds. + Weight::from_parts(3_207_000, 0) .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs index b66a8635e40..a91daf3ea87 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 @@ -57,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `214 + b * (78 ±0)` // Estimated: `1203 + b * (2554 ±0)` - // Minimum execution time: 15_056_000 picoseconds. - Weight::from_parts(15_300_844, 0) + // Minimum execution time: 14_947_000 picoseconds. + Weight::from_parts(15_345_344, 0) .saturating_add(Weight::from_parts(0, 1203)) - // Standard Error: 2_903 - .saturating_add(Weight::from_parts(2_591_470, 0).saturating_mul(b.into())) + // Standard Error: 3_420 + .saturating_add(Weight::from_parts(2_667_724, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -72,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_296_000 picoseconds. - Weight::from_parts(7_526_000, 0) + // Minimum execution time: 7_011_000 picoseconds. + Weight::from_parts(7_150_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -83,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_483_000 picoseconds. - Weight::from_parts(7_694_000, 0) + // Minimum execution time: 7_348_000 picoseconds. + Weight::from_parts(7_532_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,11 +105,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `1104 + c * (48 ±0)` // Estimated: `49487 + c * (49 ±0)` - // Minimum execution time: 42_882_000 picoseconds. - Weight::from_parts(34_865_364, 0) + // Minimum execution time: 43_613_000 picoseconds. + Weight::from_parts(34_987_225, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_292 - .saturating_add(Weight::from_parts(107_420, 0).saturating_mul(c.into())) + // Standard Error: 1_234 + .saturating_add(Weight::from_parts(103_999, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -123,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `428 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 34_025_000 picoseconds. - Weight::from_parts(23_170_113, 0) + // Minimum execution time: 33_921_000 picoseconds. + Weight::from_parts(23_468_920, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_333 - .saturating_add(Weight::from_parts(108_636, 0).saturating_mul(c.into())) + // Standard Error: 1_295 + .saturating_add(Weight::from_parts(104_853, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -141,8 +141,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `155` // Estimated: `6196` - // Minimum execution time: 45_689_000 picoseconds. - Weight::from_parts(46_236_000, 0) + // Minimum execution time: 45_997_000 picoseconds. + Weight::from_parts(46_348_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) @@ -196,11 +196,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `22815 + c * (97 ±0) + r * (116 ±0)` // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 16_853_000 picoseconds. - Weight::from_parts(16_995_000, 0) + // Minimum execution time: 16_916_000 picoseconds. + Weight::from_parts(17_052_000, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 900_191 - .saturating_add(Weight::from_parts(31_884_166, 0).saturating_mul(c.into())) + // Standard Error: 858_664 + .saturating_add(Weight::from_parts(30_530_478, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs index deda8024527..6900fd1158d 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_833_000 picoseconds. - Weight::from_parts(12_347_180, 0) + // Minimum execution time: 11_272_000 picoseconds. + Weight::from_parts(11_754_107, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 1 - .saturating_add(Weight::from_parts(554, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(558, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -67,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 41_899_000 picoseconds. - Weight::from_parts(35_770_287, 0) + // Minimum execution time: 40_709_000 picoseconds. + Weight::from_parts(35_062_506, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 542 - .saturating_add(Weight::from_parts(67_778, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_239, 0).saturating_mul(z.into())) + // Standard Error: 438 + .saturating_add(Weight::from_parts(66_197, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_242, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -85,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 27_916_000 picoseconds. - Weight::from_parts(22_006_035, 0) + // Minimum execution time: 26_866_000 picoseconds. + Weight::from_parts(21_467_854, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 311 - .saturating_add(Weight::from_parts(63_189, 0).saturating_mul(s.into())) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_244, 0).saturating_mul(z.into())) + // Standard Error: 288 + .saturating_add(Weight::from_parts(59_217, 0).saturating_mul(s.into())) + // Standard Error: 2 + .saturating_add(Weight::from_parts(1_250, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,13 +105,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `388 + s * (33 ±0)` // Estimated: `6811` - // Minimum execution time: 46_594_000 picoseconds. - Weight::from_parts(38_993_543, 0) + // Minimum execution time: 45_324_000 picoseconds. + Weight::from_parts(39_237_937, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 498 - .saturating_add(Weight::from_parts(84_584, 0).saturating_mul(s.into())) + // Standard Error: 443 + .saturating_add(Weight::from_parts(72_357, 0).saturating_mul(s.into())) // Standard Error: 4 - .saturating_add(Weight::from_parts(1_271, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_254, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -122,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 32_894_000 picoseconds. - Weight::from_parts(33_904_403, 0) + // Minimum execution time: 32_200_000 picoseconds. + Weight::from_parts(33_433_001, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 801 - .saturating_add(Weight::from_parts(76_776, 0).saturating_mul(s.into())) + // Standard Error: 535 + .saturating_add(Weight::from_parts(72_441, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -137,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 19_290_000 picoseconds. - Weight::from_parts(20_348_418, 0) + // Minimum execution time: 19_126_000 picoseconds. + Weight::from_parts(20_322_098, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 465 - .saturating_add(Weight::from_parts(66_913, 0).saturating_mul(s.into())) + // Standard Error: 529 + .saturating_add(Weight::from_parts(58_882, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -152,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 33_275_000 picoseconds. - Weight::from_parts(34_932_596, 0) + // Minimum execution time: 33_332_000 picoseconds. + Weight::from_parts(34_711_486, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 564 - .saturating_add(Weight::from_parts(71_231, 0).saturating_mul(s.into())) + // Standard Error: 589 + .saturating_add(Weight::from_parts(70_302, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs index fd1e6b2034b..57bd6e4533a 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `297` // Estimated: `3762` - // Minimum execution time: 17_753_000 picoseconds. - Weight::from_parts(18_269_000, 0) + // Minimum execution time: 17_886_000 picoseconds. + Weight::from_parts(18_456_000, 0) .saturating_add(Weight::from_parts(0, 3762)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,8 +70,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `279` // Estimated: `3744` - // Minimum execution time: 13_403_000 picoseconds. - Weight::from_parts(13_821_000, 0) + // Minimum execution time: 13_607_000 picoseconds. + Weight::from_parts(13_655_000, 0) .saturating_add(Weight::from_parts(0, 3744)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs index 4a40dc1c75d..505c356a031 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 @@ -54,20 +54,20 @@ impl pallet_timestamp::WeightInfo for WeightInfo { /// Proof: Aura CurrentSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) fn set() -> Weight { // Proof Size summary in bytes: - // Measured: `49` + // Measured: `85` // Estimated: `1493` - // Minimum execution time: 7_595_000 picoseconds. - Weight::from_parts(7_831_000, 0) + // Minimum execution time: 9_451_000 picoseconds. + Weight::from_parts(9_736_000, 0) .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } fn on_finalize() -> Weight { // Proof Size summary in bytes: - // Measured: `57` + // Measured: `94` // Estimated: `0` - // Minimum execution time: 3_169_000 picoseconds. - Weight::from_parts(3_316_000, 0) + // Minimum execution time: 3_660_000 picoseconds. + Weight::from_parts(3_776_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs index ec43ac02ac1..116ad9c7370 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 @@ -53,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_483_000 picoseconds. - Weight::from_parts(10_302_924, 0) + // Minimum execution time: 6_905_000 picoseconds. + Weight::from_parts(5_286_105, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_285 - .saturating_add(Weight::from_parts(4_760_910, 0).saturating_mul(c.into())) + // Standard Error: 3_700 + .saturating_add(Weight::from_parts(4_448_104, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_768_000 picoseconds. - Weight::from_parts(5_879_000, 0) + // Minimum execution time: 5_267_000 picoseconds. + Weight::from_parts(5_432_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -72,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_566_000 picoseconds. - Weight::from_parts(653_292, 0) + // Minimum execution time: 6_984_000 picoseconds. + Weight::from_parts(382_017, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_989 - .saturating_add(Weight::from_parts(5_103_611, 0).saturating_mul(c.into())) + // Standard Error: 3_786 + .saturating_add(Weight::from_parts(4_704_635, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_656_000 picoseconds. - Weight::from_parts(9_902_000, 0) + // Minimum execution time: 9_032_000 picoseconds. + Weight::from_parts(9_287_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -91,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_524_000 picoseconds. - Weight::from_parts(1_487_243, 0) + // Minimum execution time: 7_080_000 picoseconds. + Weight::from_parts(11_709_696, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_565 - .saturating_add(Weight::from_parts(4_841_130, 0).saturating_mul(c.into())) + // Standard Error: 3_061 + .saturating_add(Weight::from_parts(4_408_920, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs index efaf8232a35..5840da7a8e5 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 @@ -60,11 +60,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn send() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 27_565_000 picoseconds. - Weight::from_parts(28_064_000, 0) - .saturating_add(Weight::from_parts(0, 3503)) + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 29_490_000 picoseconds. + Weight::from_parts(29_921_000, 0) + .saturating_add(Weight::from_parts(0, 3540)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -74,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1489` - // Minimum execution time: 29_361_000 picoseconds. - Weight::from_parts(29_771_000, 0) + // Minimum execution time: 26_886_000 picoseconds. + Weight::from_parts(27_065_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -105,8 +105,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_098_000 picoseconds. - Weight::from_parts(10_440_000, 0) + // Minimum execution time: 10_300_000 picoseconds. + Weight::from_parts(10_564_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -116,8 +116,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_142_000 picoseconds. - Weight::from_parts(3_262_000, 0) + // Minimum execution time: 3_149_000 picoseconds. + Weight::from_parts(3_290_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -139,11 +139,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 32_356_000 picoseconds. - Weight::from_parts(32_859_000, 0) - .saturating_add(Weight::from_parts(0, 3503)) + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 33_508_000 picoseconds. + Weight::from_parts(34_277_000, 0) + .saturating_add(Weight::from_parts(0, 3540)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -163,11 +163,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `220` - // Estimated: `3685` - // Minimum execution time: 33_773_000 picoseconds. - Weight::from_parts(34_410_000, 0) - .saturating_add(Weight::from_parts(0, 3685)) + // Measured: `257` + // Estimated: `3722` + // Minimum execution time: 34_455_000 picoseconds. + Weight::from_parts(34_811_000, 0) + .saturating_add(Weight::from_parts(0, 3722)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -177,8 +177,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_127_000 picoseconds. - Weight::from_parts(3_240_000, 0) + // Minimum execution time: 3_119_000 picoseconds. + Weight::from_parts(3_246_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -186,11 +186,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `10985` - // Minimum execution time: 14_941_000 picoseconds. - Weight::from_parts(15_378_000, 0) - .saturating_add(Weight::from_parts(0, 10985)) + // Measured: `187` + // Estimated: `11077` + // Minimum execution time: 17_349_000 picoseconds. + Weight::from_parts(17_792_000, 0) + .saturating_add(Weight::from_parts(0, 11077)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -198,11 +198,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `10989` - // Minimum execution time: 14_750_000 picoseconds. - Weight::from_parts(14_903_000, 0) - .saturating_add(Weight::from_parts(0, 10989)) + // Measured: `191` + // Estimated: `11081` + // Minimum execution time: 17_723_000 picoseconds. + Weight::from_parts(18_156_000, 0) + .saturating_add(Weight::from_parts(0, 11081)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -210,11 +210,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn already_notified_target() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `13471` - // Minimum execution time: 15_360_000 picoseconds. - Weight::from_parts(15_593_000, 0) - .saturating_add(Weight::from_parts(0, 13471)) + // Measured: `198` + // Estimated: `13563` + // Minimum execution time: 17_921_000 picoseconds. + Weight::from_parts(18_408_000, 0) + .saturating_add(Weight::from_parts(0, 13563)) .saturating_add(T::DbWeight::get().reads(5)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) @@ -231,11 +231,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn notify_current_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `6046` - // Minimum execution time: 28_886_000 picoseconds. - Weight::from_parts(29_140_000, 0) - .saturating_add(Weight::from_parts(0, 6046)) + // Measured: `142` + // Estimated: `6082` + // Minimum execution time: 31_110_000 picoseconds. + Weight::from_parts(31_902_000, 0) + .saturating_add(Weight::from_parts(0, 6082)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -243,22 +243,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: - // Measured: `136` - // Estimated: `8551` - // Minimum execution time: 8_045_000 picoseconds. - Weight::from_parts(8_301_000, 0) - .saturating_add(Weight::from_parts(0, 8551)) + // Measured: `172` + // Estimated: `8587` + // Minimum execution time: 8_908_000 picoseconds. + Weight::from_parts(9_173_000, 0) + .saturating_add(Weight::from_parts(0, 8587)) .saturating_add(T::DbWeight::get().reads(3)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10996` - // Minimum execution time: 14_763_000 picoseconds. - Weight::from_parts(15_186_000, 0) - .saturating_add(Weight::from_parts(0, 10996)) + // Measured: `198` + // Estimated: `11088` + // Minimum execution time: 17_495_000 picoseconds. + Weight::from_parts(18_569_000, 0) + .saturating_add(Weight::from_parts(0, 11088)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -276,11 +276,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `112` - // Estimated: `11002` - // Minimum execution time: 34_652_000 picoseconds. - Weight::from_parts(34_888_000, 0) - .saturating_add(Weight::from_parts(0, 11002)) + // Measured: `204` + // Estimated: `11094` + // Minimum execution time: 37_979_000 picoseconds. + Weight::from_parts(38_687_000, 0) + .saturating_add(Weight::from_parts(0, 11094)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index ad69bf08427..41696df6f4e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 24_766_000 picoseconds. - Weight::from_parts(25_113_000, 3593) + // Minimum execution time: 24_201_000 picoseconds. + Weight::from_parts(24_429_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `153` // Estimated: `6196` - // Minimum execution time: 51_440_000 picoseconds. - Weight::from_parts(51_960_000, 6196) + // Minimum execution time: 51_907_000 picoseconds. + Weight::from_parts(52_265_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -86,10 +86,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `223` + // Measured: `260` // Estimated: `6196` - // Minimum execution time: 76_002_000 picoseconds. - Weight::from_parts(76_826_000, 6196) + // Minimum execution time: 75_022_000 picoseconds. + Weight::from_parts(75_775_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -97,8 +97,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_644_000 picoseconds. - Weight::from_parts(4_754_000, 0) + // Minimum execution time: 3_922_000 picoseconds. + Weight::from_parts(4_020_000, 0) } // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -106,8 +106,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `52` // Estimated: `3593` - // Minimum execution time: 27_398_000 picoseconds. - Weight::from_parts(27_947_000, 3593) + // Minimum execution time: 26_204_000 picoseconds. + Weight::from_parts(26_625_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -127,10 +127,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `122` - // Estimated: `3593` - // Minimum execution time: 54_445_000 picoseconds. - Weight::from_parts(55_026_000, 3593) + // Measured: `159` + // Estimated: `3624` + // Minimum execution time: 52_419_000 picoseconds. + Weight::from_parts(53_070_000, 3624) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -148,10 +148,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 30_770_000 picoseconds. - Weight::from_parts(31_269_000, 3535) + // Measured: `107` + // Estimated: `3572` + // Minimum execution time: 30_237_000 picoseconds. + Weight::from_parts(30_712_000, 3572) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 0b06968e441..406c947cf8d 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 @@ -62,10 +62,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_holding() -> Weight { // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 34_120_000 picoseconds. - Weight::from_parts(34_618_000, 3535) + // Measured: `107` + // Estimated: `3572` + // Minimum execution time: 34_450_000 picoseconds. + Weight::from_parts(34_887_000, 3572) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -73,67 +73,67 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_285_000 picoseconds. - Weight::from_parts(3_426_000, 0) + // Minimum execution time: 2_956_000 picoseconds. + Weight::from_parts(3_034_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) pub fn query_response() -> Weight { // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `3497` - // Minimum execution time: 11_025_000 picoseconds. - Weight::from_parts(11_293_000, 3497) + // Measured: `69` + // Estimated: `3534` + // Minimum execution time: 11_185_000 picoseconds. + Weight::from_parts(11_390_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_451_000 picoseconds. - Weight::from_parts(13_625_000, 0) + // Minimum execution time: 12_348_000 picoseconds. + Weight::from_parts(12_692_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_578_000 picoseconds. - Weight::from_parts(3_639_000, 0) + // Minimum execution time: 3_373_000 picoseconds. + Weight::from_parts(3_510_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_123_000 picoseconds. - Weight::from_parts(3_190_000, 0) + // Minimum execution time: 2_784_000 picoseconds. + Weight::from_parts(2_845_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_176_000 picoseconds. - Weight::from_parts(3_223_000, 0) + // Minimum execution time: 2_756_000 picoseconds. + Weight::from_parts(2_829_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_142_000 picoseconds. - Weight::from_parts(3_200_000, 0) + // Minimum execution time: 2_745_000 picoseconds. + Weight::from_parts(2_823_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_308_000 picoseconds. - Weight::from_parts(4_392_000, 0) + // Minimum execution time: 3_548_000 picoseconds. + Weight::from_parts(3_654_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_114_000 picoseconds. - Weight::from_parts(3_189_000, 0) + // Minimum execution time: 2_719_000 picoseconds. + Weight::from_parts(2_831_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -149,10 +149,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_error() -> Weight { // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 26_422_000 picoseconds. - Weight::from_parts(26_959_000, 3535) + // Measured: `107` + // Estimated: `3572` + // Minimum execution time: 27_216_000 picoseconds. + Weight::from_parts(27_535_000, 3572) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -160,10 +160,10 @@ impl WeightInfo { // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) pub fn claim_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `90` - // Estimated: `3555` - // Minimum execution time: 15_625_000 picoseconds. - Weight::from_parts(15_828_000, 3555) + // Measured: `126` + // Estimated: `3591` + // Minimum execution time: 16_144_000 picoseconds. + Weight::from_parts(16_370_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_187_000 picoseconds. - Weight::from_parts(3_238_000, 0) + // Minimum execution time: 2_720_000 picoseconds. + Weight::from_parts(2_809_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -188,10 +188,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 27_154_000 picoseconds. - Weight::from_parts(27_761_000, 3503) + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 28_006_000 picoseconds. + Weight::from_parts(28_593_000, 3540) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -201,8 +201,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_268_000 picoseconds. - Weight::from_parts(5_412_000, 0) + // Minimum execution time: 4_747_000 picoseconds. + Weight::from_parts(4_920_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -219,10 +219,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 30_515_000 picoseconds. - Weight::from_parts(31_095_000, 3535) + // Measured: `107` + // Estimated: `3572` + // Minimum execution time: 30_713_000 picoseconds. + Weight::from_parts(31_400_000, 3572) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -230,36 +230,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_148_000 picoseconds. - Weight::from_parts(5_224_000, 0) + // Minimum execution time: 4_540_000 picoseconds. + Weight::from_parts(4_624_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_220_000 picoseconds. - Weight::from_parts(3_312_000, 0) + // Minimum execution time: 2_987_000 picoseconds. + Weight::from_parts(3_097_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_226_000 picoseconds. - Weight::from_parts(3_309_000, 0) + // Minimum execution time: 2_927_000 picoseconds. + Weight::from_parts(3_042_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_095_000 picoseconds. - Weight::from_parts(3_177_000, 0) + // Minimum execution time: 2_798_000 picoseconds. + Weight::from_parts(2_886_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_349_000 picoseconds. - Weight::from_parts(3_447_000, 0) + // Minimum execution time: 3_005_000 picoseconds. + Weight::from_parts(3_104_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -275,10 +275,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn query_pallet() -> Weight { // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 29_644_000 picoseconds. - Weight::from_parts(30_110_000, 3535) + // Measured: `107` + // Estimated: `3572` + // Minimum execution time: 31_468_000 picoseconds. + Weight::from_parts(31_948_000, 3572) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -286,8 +286,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_304_000 picoseconds. - Weight::from_parts(5_369_000, 0) + // Minimum execution time: 5_470_000 picoseconds. + Weight::from_parts(5_576_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -303,10 +303,10 @@ impl WeightInfo { // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 26_617_000 picoseconds. - Weight::from_parts(27_011_000, 3535) + // Measured: `107` + // Estimated: `3572` + // Minimum execution time: 28_054_000 picoseconds. + Weight::from_parts(28_613_000, 3572) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -314,29 +314,22 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_133_000 picoseconds. - Weight::from_parts(3_229_000, 0) + // Minimum execution time: 2_832_000 picoseconds. + Weight::from_parts(2_897_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_110_000 picoseconds. - Weight::from_parts(3_203_000, 0) + // Minimum execution time: 2_808_000 picoseconds. + Weight::from_parts(2_934_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_138_000 picoseconds. - Weight::from_parts(3_201_000, 0) - } - pub fn set_fees_mode() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_116_000 picoseconds. - Weight::from_parts(3_187_000, 0) + // Minimum execution time: 2_789_000 picoseconds. + Weight::from_parts(2_853_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -346,18 +339,30 @@ impl WeightInfo { // Proof: BridgeWococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) // Storage: BridgeWococoMessages OutboundMessages (r:0 w:1) // Proof: BridgeWococoMessages OutboundMessages (max_values: None, max_size: Some(2621472), added: 2623947, mode: MaxEncodedLen) - pub(crate) fn export_message(x: u32, ) -> Weight { - Weight::from_parts(31_677_716_u64, 0) - // Standard Error: 4_158 - .saturating_add(Weight::from_parts(123_901, 0).saturating_mul(x as u64)) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + /// The range of component `x` is `[1, 1000]`. + pub fn export_message(x: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `95` + // Estimated: `1529` + // Minimum execution time: 31_478_000 picoseconds. + Weight::from_parts(35_577_137, 1529) + // Standard Error: 497 + .saturating_add(Weight::from_parts(177_271, 0).saturating_mul(x.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + pub fn set_fees_mode() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_770_000 picoseconds. + Weight::from_parts(2_871_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_364_000 picoseconds. - Weight::from_parts(3_429_000, 0) + // Minimum execution time: 2_961_000 picoseconds. + Weight::from_parts(3_103_000, 0) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs index 6bbe4229967..faf56ecf4f9 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `109` // Estimated: `1594` - // Minimum execution time: 5_475_000 picoseconds. - Weight::from_parts(5_752_000, 0) + // Minimum execution time: 5_455_000 picoseconds. + Weight::from_parts(5_567_000, 0) .saturating_add(Weight::from_parts(0, 1594)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `109` // Estimated: `1594` - // Minimum execution time: 5_467_000 picoseconds. - Weight::from_parts(5_652_000, 0) + // Minimum execution time: 5_521_000 picoseconds. + Weight::from_parts(5_646_000, 0) .saturating_add(Weight::from_parts(0, 1594)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs index 4ee8738d5af..c362497af9d 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_alliance` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -65,15 +65,15 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `439 + m * (32 ±0) + p * (36 ±0)` // Estimated: `6676 + m * (32 ±0) + p * (36 ±0)` - // Minimum execution time: 30_492_000 picoseconds. - Weight::from_parts(33_119_713, 0) + // Minimum execution time: 31_379_000 picoseconds. + Weight::from_parts(33_466_627, 0) .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 60 - .saturating_add(Weight::from_parts(285, 0).saturating_mul(b.into())) - // Standard Error: 632 - .saturating_add(Weight::from_parts(10_988, 0).saturating_mul(m.into())) - // Standard Error: 624 - .saturating_add(Weight::from_parts(140_169, 0).saturating_mul(p.into())) + // Standard Error: 62 + .saturating_add(Weight::from_parts(434, 0).saturating_mul(b.into())) + // Standard Error: 648 + .saturating_add(Weight::from_parts(12_968, 0).saturating_mul(m.into())) + // Standard Error: 640 + .saturating_add(Weight::from_parts(111_468, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) @@ -88,11 +88,11 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `868 + m * (64 ±0)` // Estimated: `6676 + m * (64 ±0)` - // Minimum execution time: 25_442_000 picoseconds. - Weight::from_parts(26_215_947, 0) + // Minimum execution time: 25_855_000 picoseconds. + Weight::from_parts(26_422_871, 0) .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 410 - .saturating_add(Weight::from_parts(43_449, 0).saturating_mul(m.into())) + // Standard Error: 372 + .saturating_add(Weight::from_parts(37_878, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) @@ -113,13 +113,13 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `312 + m * (96 ±0) + p * (36 ±0)` // Estimated: `6676 + m * (97 ±0) + p * (36 ±0)` - // Minimum execution time: 35_991_000 picoseconds. - Weight::from_parts(34_605_748, 0) + // Minimum execution time: 36_596_000 picoseconds. + Weight::from_parts(34_698_463, 0) .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 598 - .saturating_add(Weight::from_parts(38_227, 0).saturating_mul(m.into())) - // Standard Error: 583 - .saturating_add(Weight::from_parts(119_512, 0).saturating_mul(p.into())) + // Standard Error: 561 + .saturating_add(Weight::from_parts(39_490, 0).saturating_mul(m.into())) + // Standard Error: 547 + .saturating_add(Weight::from_parts(107_190, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) @@ -142,13 +142,13 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `762 + m * (96 ±0) + p * (41 ±0)` // Estimated: `6676 + m * (97 ±0) + p * (40 ±0)` - // Minimum execution time: 48_168_000 picoseconds. - Weight::from_parts(48_554_161, 0) + // Minimum execution time: 48_194_000 picoseconds. + Weight::from_parts(49_032_242, 0) .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 1_770 - .saturating_add(Weight::from_parts(47_441, 0).saturating_mul(m.into())) - // Standard Error: 1_725 - .saturating_add(Weight::from_parts(119_704, 0).saturating_mul(p.into())) + // Standard Error: 1_783 + .saturating_add(Weight::from_parts(46_747, 0).saturating_mul(m.into())) + // Standard Error: 1_738 + .saturating_add(Weight::from_parts(114_162, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) @@ -174,13 +174,13 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `518 + m * (96 ±0) + p * (41 ±0)` // Estimated: `6676 + m * (109 ±0) + p * (43 ±0)` - // Minimum execution time: 47_356_000 picoseconds. - Weight::from_parts(48_308_769, 0) + // Minimum execution time: 46_522_000 picoseconds. + Weight::from_parts(48_725_642, 0) .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 3_712 - .saturating_add(Weight::from_parts(99_809, 0).saturating_mul(m.into())) - // Standard Error: 3_667 - .saturating_add(Weight::from_parts(136_999, 0).saturating_mul(p.into())) + // Standard Error: 3_924 + .saturating_add(Weight::from_parts(99_493, 0).saturating_mul(m.into())) + // Standard Error: 3_876 + .saturating_add(Weight::from_parts(132_965, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) .saturating_add(Weight::from_parts(0, 109).saturating_mul(m.into())) @@ -205,13 +205,13 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `417 + m * (96 ±0) + p * (36 ±0)` // Estimated: `6676 + m * (96 ±0) + p * (36 ±0)` - // Minimum execution time: 37_575_000 picoseconds. - Weight::from_parts(36_322_752, 0) + // Minimum execution time: 38_055_000 picoseconds. + Weight::from_parts(36_843_849, 0) .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 530 - .saturating_add(Weight::from_parts(38_879, 0).saturating_mul(m.into())) - // Standard Error: 511 - .saturating_add(Weight::from_parts(119_293, 0).saturating_mul(p.into())) + // Standard Error: 571 + .saturating_add(Weight::from_parts(37_581, 0).saturating_mul(m.into())) + // Standard Error: 550 + .saturating_add(Weight::from_parts(103_926, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 96).saturating_mul(m.into())) @@ -227,13 +227,13 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `12` // Estimated: `12362` - // Minimum execution time: 31_194_000 picoseconds. - Weight::from_parts(19_730_185, 0) + // Minimum execution time: 30_370_000 picoseconds. + Weight::from_parts(20_600_862, 0) .saturating_add(Weight::from_parts(0, 12362)) - // Standard Error: 589 - .saturating_add(Weight::from_parts(141_552, 0).saturating_mul(m.into())) - // Standard Error: 582 - .saturating_add(Weight::from_parts(118_056, 0).saturating_mul(z.into())) + // Standard Error: 490 + .saturating_add(Weight::from_parts(122_072, 0).saturating_mul(m.into())) + // Standard Error: 484 + .saturating_add(Weight::from_parts(102_456, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -255,16 +255,16 @@ impl pallet_alliance::WeightInfo for WeightInfo { fn disband(x: u32, y: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + x * (52 ±0) + y * (53 ±0) + z * (250 ±0)` - // Estimated: `12362 + x * (2539 ±0) + y * (2539 ±0) + z * (2603 ±1)` - // Minimum execution time: 262_149_000 picoseconds. - Weight::from_parts(263_057_000, 0) + // Estimated: `12362 + x * (2539 ±0) + y * (2539 ±0) + z * (2603 ±0)` + // Minimum execution time: 282_163_000 picoseconds. + Weight::from_parts(284_996_000, 0) .saturating_add(Weight::from_parts(0, 12362)) - // Standard Error: 21_165 - .saturating_add(Weight::from_parts(497_129, 0).saturating_mul(x.into())) - // Standard Error: 21_063 - .saturating_add(Weight::from_parts(478_945, 0).saturating_mul(y.into())) - // Standard Error: 42_088 - .saturating_add(Weight::from_parts(14_786_304, 0).saturating_mul(z.into())) + // Standard Error: 23_331 + .saturating_add(Weight::from_parts(488_926, 0).saturating_mul(x.into())) + // Standard Error: 23_219 + .saturating_add(Weight::from_parts(528_274, 0).saturating_mul(y.into())) + // Standard Error: 46_396 + .saturating_add(Weight::from_parts(14_838_465, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(x.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(y.into()))) @@ -281,8 +281,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_181_000 picoseconds. - Weight::from_parts(10_320_000, 0) + // Minimum execution time: 9_852_000 picoseconds. + Weight::from_parts(10_129_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -292,8 +292,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `76` // Estimated: `10187` - // Minimum execution time: 12_958_000 picoseconds. - Weight::from_parts(13_130_000, 0) + // Minimum execution time: 12_892_000 picoseconds. + Weight::from_parts(13_134_000, 0) .saturating_add(Weight::from_parts(0, 10187)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -304,8 +304,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `149` // Estimated: `10187` - // Minimum execution time: 13_987_000 picoseconds. - Weight::from_parts(14_205_000, 0) + // Minimum execution time: 14_019_000 picoseconds. + Weight::from_parts(14_309_000, 0) .saturating_add(Weight::from_parts(0, 10187)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -322,8 +322,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `294` // Estimated: `18048` - // Minimum execution time: 44_585_000 picoseconds. - Weight::from_parts(45_153_000, 0) + // Minimum execution time: 44_959_000 picoseconds. + Weight::from_parts(45_280_000, 0) .saturating_add(Weight::from_parts(0, 18048)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) @@ -336,8 +336,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `193` // Estimated: `18048` - // Minimum execution time: 28_059_000 picoseconds. - Weight::from_parts(28_305_000, 0) + // Minimum execution time: 28_173_000 picoseconds. + Weight::from_parts(28_414_000, 0) .saturating_add(Weight::from_parts(0, 18048)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -354,8 +354,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `236` // Estimated: `12362` - // Minimum execution time: 26_197_000 picoseconds. - Weight::from_parts(26_655_000, 0) + // Minimum execution time: 27_329_000 picoseconds. + Weight::from_parts(27_654_000, 0) .saturating_add(Weight::from_parts(0, 12362)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) @@ -374,8 +374,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `236` // Estimated: `23734` - // Minimum execution time: 33_606_000 picoseconds. - Weight::from_parts(33_898_000, 0) + // Minimum execution time: 34_347_000 picoseconds. + Weight::from_parts(34_721_000, 0) .saturating_add(Weight::from_parts(0, 23734)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) @@ -392,8 +392,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `517` // Estimated: `6676` - // Minimum execution time: 39_968_000 picoseconds. - Weight::from_parts(40_586_000, 0) + // Minimum execution time: 40_761_000 picoseconds. + Weight::from_parts(41_278_000, 0) .saturating_add(Weight::from_parts(0, 6676)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) @@ -426,8 +426,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `643` // Estimated: `18048` - // Minimum execution time: 145_826_000 picoseconds. - Weight::from_parts(149_620_000, 0) + // Minimum execution time: 143_275_000 picoseconds. + Weight::from_parts(144_436_000, 0) .saturating_add(Weight::from_parts(0, 18048)) .saturating_add(T::DbWeight::get().reads(13)) .saturating_add(T::DbWeight::get().writes(8)) @@ -442,13 +442,13 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `76` // Estimated: `27187` - // Minimum execution time: 8_490_000 picoseconds. - Weight::from_parts(8_557_000, 0) + // Minimum execution time: 7_977_000 picoseconds. + Weight::from_parts(8_071_000, 0) .saturating_add(Weight::from_parts(0, 27187)) - // Standard Error: 3_473 - .saturating_add(Weight::from_parts(1_473_071, 0).saturating_mul(n.into())) - // Standard Error: 1_360 - .saturating_add(Weight::from_parts(75_402, 0).saturating_mul(l.into())) + // Standard Error: 3_235 + .saturating_add(Weight::from_parts(1_501_097, 0).saturating_mul(n.into())) + // Standard Error: 1_267 + .saturating_add(Weight::from_parts(68_685, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -462,13 +462,13 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + l * (100 ±0) + n * (289 ±0)` // Estimated: `27187` - // Minimum execution time: 8_394_000 picoseconds. - Weight::from_parts(8_467_000, 0) + // Minimum execution time: 8_100_000 picoseconds. + Weight::from_parts(8_199_000, 0) .saturating_add(Weight::from_parts(0, 27187)) - // Standard Error: 199_845 - .saturating_add(Weight::from_parts(17_213_927, 0).saturating_mul(n.into())) - // Standard Error: 78_268 - .saturating_add(Weight::from_parts(427_473, 0).saturating_mul(l.into())) + // Standard Error: 198_431 + .saturating_add(Weight::from_parts(16_683_292, 0).saturating_mul(n.into())) + // Standard Error: 77_714 + .saturating_add(Weight::from_parts(464_713, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -484,8 +484,8 @@ impl pallet_alliance::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `236` // Estimated: `18048` - // Minimum execution time: 32_255_000 picoseconds. - Weight::from_parts(32_787_000, 0) + // Minimum execution time: 32_208_000 picoseconds. + Weight::from_parts(32_841_000, 0) .saturating_add(Weight::from_parts(0, 18048)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs index 10b566b3f41..4f851c81bf7 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 53_490_000 picoseconds. - Weight::from_parts(54_270_000, 0) + // Minimum execution time: 53_353_000 picoseconds. + Weight::from_parts(53_656_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 40_895_000 picoseconds. - Weight::from_parts(41_541_000, 0) + // Minimum execution time: 40_065_000 picoseconds. + Weight::from_parts(40_508_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 16_009_000 picoseconds. - Weight::from_parts(16_345_000, 0) + // Minimum execution time: 15_582_000 picoseconds. + Weight::from_parts(15_878_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 22_757_000 picoseconds. - Weight::from_parts(23_225_000, 0) + // Minimum execution time: 22_358_000 picoseconds. + Weight::from_parts(22_586_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 55_122_000 picoseconds. - Weight::from_parts(55_729_000, 0) + // Minimum execution time: 54_535_000 picoseconds. + Weight::from_parts(55_223_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 49_979_000 picoseconds. - Weight::from_parts(50_677_000, 0) + // Minimum execution time: 49_377_000 picoseconds. + Weight::from_parts(49_974_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 18_803_000 picoseconds. - Weight::from_parts(19_157_000, 0) + // Minimum execution time: 18_096_000 picoseconds. + Weight::from_parts(18_474_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 18_508_000 picoseconds. - Weight::from_parts(18_773_000, 0) + // Minimum execution time: 17_767_000 picoseconds. + Weight::from_parts(17_983_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 9_864 - .saturating_add(Weight::from_parts(14_451_484, 0).saturating_mul(u.into())) + // Standard Error: 10_647 + .saturating_add(Weight::from_parts(14_294_449, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs index 73961b722fa..05843b159a7 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -57,11 +57,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `178 + b * (78 ±0)` // Estimated: `1168 + b * (2554 ±0)` - // Minimum execution time: 15_467_000 picoseconds. - Weight::from_parts(15_103_183, 0) + // Minimum execution time: 14_775_000 picoseconds. + Weight::from_parts(14_379_856, 0) .saturating_add(Weight::from_parts(0, 1168)) - // Standard Error: 2_853 - .saturating_add(Weight::from_parts(2_584_332, 0).saturating_mul(b.into())) + // Standard Error: 2_763 + .saturating_add(Weight::from_parts(2_649_524, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) @@ -72,8 +72,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_562_000 picoseconds. - Weight::from_parts(7_765_000, 0) + // Minimum execution time: 7_281_000 picoseconds. + Weight::from_parts(7_438_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -83,8 +83,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_769_000 picoseconds. - Weight::from_parts(7_972_000, 0) + // Minimum execution time: 7_446_000 picoseconds. + Weight::from_parts(7_526_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,11 +105,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `1108 + c * (48 ±0)` // Estimated: `49487 + c * (49 ±0)` - // Minimum execution time: 42_430_000 picoseconds. - Weight::from_parts(35_423_103, 0) + // Minimum execution time: 42_510_000 picoseconds. + Weight::from_parts(34_844_518, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_209 - .saturating_add(Weight::from_parts(114_362, 0).saturating_mul(c.into())) + // Standard Error: 1_265 + .saturating_add(Weight::from_parts(105_965, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) @@ -123,11 +123,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `452 + c * (48 ±0)` // Estimated: `49487` - // Minimum execution time: 33_827_000 picoseconds. - Weight::from_parts(24_290_370, 0) + // Minimum execution time: 33_917_000 picoseconds. + Weight::from_parts(23_486_217, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_249 - .saturating_add(Weight::from_parts(109_487, 0).saturating_mul(c.into())) + // Standard Error: 1_289 + .saturating_add(Weight::from_parts(105_541, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -141,8 +141,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 43_086_000 picoseconds. - Weight::from_parts(43_643_000, 0) + // Minimum execution time: 43_818_000 picoseconds. + Weight::from_parts(44_284_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) @@ -196,11 +196,11 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `22721 + c * (97 ±0) + r * (116 ±0)` // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 17_338_000 picoseconds. - Weight::from_parts(17_589_000, 0) + // Minimum execution time: 17_705_000 picoseconds. + Weight::from_parts(17_906_000, 0) .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 906_988 - .saturating_add(Weight::from_parts(32_054_748, 0).saturating_mul(c.into())) + // Standard Error: 862_538 + .saturating_add(Weight::from_parts(30_605_371, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs index c4a71ec894a..3ca20603204 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_collective` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -63,13 +63,13 @@ impl pallet_collective::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + m * (3232 ±0) + p * (3190 ±0)` // Estimated: `15691 + m * (1967 ±23) + p * (4332 ±23)` - // Minimum execution time: 16_795_000 picoseconds. - Weight::from_parts(16_942_000, 0) + // Minimum execution time: 15_658_000 picoseconds. + Weight::from_parts(15_794_000, 0) .saturating_add(Weight::from_parts(0, 15691)) - // Standard Error: 70_459 - .saturating_add(Weight::from_parts(5_607_397, 0).saturating_mul(m.into())) - // Standard Error: 70_459 - .saturating_add(Weight::from_parts(8_290_115, 0).saturating_mul(p.into())) + // Standard Error: 68_169 + .saturating_add(Weight::from_parts(5_624_034, 0).saturating_mul(m.into())) + // Standard Error: 68_169 + .saturating_add(Weight::from_parts(8_049_725, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes(2)) @@ -85,13 +85,13 @@ impl pallet_collective::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32 + m * (32 ±0)` // Estimated: `1518 + m * (32 ±0)` - // Minimum execution time: 15_803_000 picoseconds. - Weight::from_parts(15_071_031, 0) + // Minimum execution time: 15_195_000 picoseconds. + Weight::from_parts(14_241_864, 0) .saturating_add(Weight::from_parts(0, 1518)) - // Standard Error: 21 - .saturating_add(Weight::from_parts(1_253, 0).saturating_mul(b.into())) - // Standard Error: 219 - .saturating_add(Weight::from_parts(13_241, 0).saturating_mul(m.into())) + // Standard Error: 15 + .saturating_add(Weight::from_parts(1_338, 0).saturating_mul(b.into())) + // Standard Error: 160 + .saturating_add(Weight::from_parts(13_397, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) } @@ -105,13 +105,13 @@ impl pallet_collective::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32 + m * (32 ±0)` // Estimated: `3498 + m * (32 ±0)` - // Minimum execution time: 18_645_000 picoseconds. - Weight::from_parts(17_717_343, 0) + // Minimum execution time: 17_548_000 picoseconds. + Weight::from_parts(16_950_722, 0) .saturating_add(Weight::from_parts(0, 3498)) - // Standard Error: 21 - .saturating_add(Weight::from_parts(1_471, 0).saturating_mul(b.into())) - // Standard Error: 218 - .saturating_add(Weight::from_parts(22_238, 0).saturating_mul(m.into())) + // Standard Error: 20 + .saturating_add(Weight::from_parts(1_269, 0).saturating_mul(b.into())) + // Standard Error: 211 + .saturating_add(Weight::from_parts(22_355, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) } @@ -132,15 +132,15 @@ impl pallet_collective::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `322 + m * (32 ±0) + p * (36 ±0)` // Estimated: `3714 + m * (33 ±0) + p * (36 ±0)` - // Minimum execution time: 24_537_000 picoseconds. - Weight::from_parts(26_471_602, 0) + // Minimum execution time: 23_764_000 picoseconds. + Weight::from_parts(25_593_249, 0) .saturating_add(Weight::from_parts(0, 3714)) // Standard Error: 79 - .saturating_add(Weight::from_parts(2_604, 0).saturating_mul(b.into())) - // Standard Error: 829 - .saturating_add(Weight::from_parts(20_480, 0).saturating_mul(m.into())) - // Standard Error: 818 - .saturating_add(Weight::from_parts(133_262, 0).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(2_363, 0).saturating_mul(b.into())) + // Standard Error: 824 + .saturating_add(Weight::from_parts(19_898, 0).saturating_mul(m.into())) + // Standard Error: 814 + .saturating_add(Weight::from_parts(125_190, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) .saturating_add(Weight::from_parts(0, 33).saturating_mul(m.into())) @@ -155,11 +155,11 @@ impl pallet_collective::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `771 + m * (64 ±0)` // Estimated: `4235 + m * (64 ±0)` - // Minimum execution time: 23_195_000 picoseconds. - Weight::from_parts(23_635_543, 0) + // Minimum execution time: 22_071_000 picoseconds. + Weight::from_parts(22_842_830, 0) .saturating_add(Weight::from_parts(0, 4235)) - // Standard Error: 399 - .saturating_add(Weight::from_parts(45_089, 0).saturating_mul(m.into())) + // Standard Error: 362 + .saturating_add(Weight::from_parts(40_822, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) @@ -178,13 +178,13 @@ impl pallet_collective::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `360 + m * (64 ±0) + p * (36 ±0)` // Estimated: `3805 + m * (65 ±0) + p * (36 ±0)` - // Minimum execution time: 27_925_000 picoseconds. - Weight::from_parts(29_021_838, 0) + // Minimum execution time: 27_049_000 picoseconds. + Weight::from_parts(28_185_422, 0) .saturating_add(Weight::from_parts(0, 3805)) - // Standard Error: 582 - .saturating_add(Weight::from_parts(19_351, 0).saturating_mul(m.into())) - // Standard Error: 567 - .saturating_add(Weight::from_parts(120_374, 0).saturating_mul(p.into())) + // Standard Error: 570 + .saturating_add(Weight::from_parts(19_622, 0).saturating_mul(m.into())) + // Standard Error: 555 + .saturating_add(Weight::from_parts(115_313, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 65).saturating_mul(m.into())) @@ -205,15 +205,15 @@ impl pallet_collective::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `662 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` // Estimated: `3979 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` - // Minimum execution time: 39_972_000 picoseconds. - Weight::from_parts(40_831_166, 0) + // Minimum execution time: 37_954_000 picoseconds. + Weight::from_parts(39_281_079, 0) .saturating_add(Weight::from_parts(0, 3979)) - // Standard Error: 78 - .saturating_add(Weight::from_parts(1_568, 0).saturating_mul(b.into())) - // Standard Error: 825 - .saturating_add(Weight::from_parts(16_454, 0).saturating_mul(m.into())) - // Standard Error: 804 - .saturating_add(Weight::from_parts(132_248, 0).saturating_mul(p.into())) + // Standard Error: 81 + .saturating_add(Weight::from_parts(1_514, 0).saturating_mul(b.into())) + // Standard Error: 859 + .saturating_add(Weight::from_parts(16_260, 0).saturating_mul(m.into())) + // Standard Error: 838 + .saturating_add(Weight::from_parts(128_072, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) @@ -236,13 +236,13 @@ impl pallet_collective::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `458 + m * (48 ±0) + p * (36 ±0)` // Estimated: `3898 + m * (49 ±0) + p * (36 ±0)` - // Minimum execution time: 29_766_000 picoseconds. - Weight::from_parts(31_292_444, 0) + // Minimum execution time: 28_733_000 picoseconds. + Weight::from_parts(30_266_158, 0) .saturating_add(Weight::from_parts(0, 3898)) - // Standard Error: 691 - .saturating_add(Weight::from_parts(19_285, 0).saturating_mul(m.into())) - // Standard Error: 674 - .saturating_add(Weight::from_parts(123_923, 0).saturating_mul(p.into())) + // Standard Error: 726 + .saturating_add(Weight::from_parts(18_225, 0).saturating_mul(m.into())) + // Standard Error: 708 + .saturating_add(Weight::from_parts(120_048, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 49).saturating_mul(m.into())) @@ -265,15 +265,15 @@ impl pallet_collective::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `682 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` // Estimated: `3999 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` - // Minimum execution time: 42_588_000 picoseconds. - Weight::from_parts(43_162_079, 0) + // Minimum execution time: 40_639_000 picoseconds. + Weight::from_parts(42_182_153, 0) .saturating_add(Weight::from_parts(0, 3999)) - // Standard Error: 86 - .saturating_add(Weight::from_parts(1_451, 0).saturating_mul(b.into())) - // Standard Error: 914 - .saturating_add(Weight::from_parts(18_855, 0).saturating_mul(m.into())) - // Standard Error: 891 - .saturating_add(Weight::from_parts(136_799, 0).saturating_mul(p.into())) + // Standard Error: 93 + .saturating_add(Weight::from_parts(1_433, 0).saturating_mul(b.into())) + // Standard Error: 992 + .saturating_add(Weight::from_parts(13_154, 0).saturating_mul(m.into())) + // Standard Error: 967 + .saturating_add(Weight::from_parts(129_169, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) @@ -291,11 +291,11 @@ impl pallet_collective::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `189 + p * (32 ±0)` // Estimated: `1674 + p * (32 ±0)` - // Minimum execution time: 14_465_000 picoseconds. - Weight::from_parts(16_635_197, 0) + // Minimum execution time: 13_821_000 picoseconds. + Weight::from_parts(15_834_740, 0) .saturating_add(Weight::from_parts(0, 1674)) - // Standard Error: 1_082 - .saturating_add(Weight::from_parts(117_250, 0).saturating_mul(p.into())) + // Standard Error: 638 + .saturating_add(Weight::from_parts(111_794, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(p.into())) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs index 92715ad62a9..30b671da4f7 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -53,11 +53,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_207_000 picoseconds. - Weight::from_parts(12_624_117, 0) + // Minimum execution time: 11_418_000 picoseconds. + Weight::from_parts(11_852_848, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3 - .saturating_add(Weight::from_parts(596, 0).saturating_mul(z.into())) + // Standard Error: 1 + .saturating_add(Weight::from_parts(543, 0).saturating_mul(z.into())) } /// Storage: Multisig Multisigs (r:1 w:1) /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) @@ -67,13 +67,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `295 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 41_674_000 picoseconds. - Weight::from_parts(35_138_837, 0) + // Minimum execution time: 40_623_000 picoseconds. + Weight::from_parts(35_143_249, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 426 - .saturating_add(Weight::from_parts(70_175, 0).saturating_mul(s.into())) + // Standard Error: 491 + .saturating_add(Weight::from_parts(65_196, 0).saturating_mul(s.into())) // Standard Error: 4 - .saturating_add(Weight::from_parts(1_321, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(1_244, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -85,13 +85,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `315` // Estimated: `6811` - // Minimum execution time: 28_196_000 picoseconds. - Weight::from_parts(22_060_677, 0) + // Minimum execution time: 27_116_000 picoseconds. + Weight::from_parts(21_183_892, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 378 - .saturating_add(Weight::from_parts(71_806, 0).saturating_mul(s.into())) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_256, 0).saturating_mul(z.into())) + // Standard Error: 1_040 + .saturating_add(Weight::from_parts(68_596, 0).saturating_mul(s.into())) + // Standard Error: 10 + .saturating_add(Weight::from_parts(1_211, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -105,13 +105,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `418 + s * (33 ±0)` // Estimated: `6811` - // Minimum execution time: 47_099_000 picoseconds. - Weight::from_parts(38_806_484, 0) + // Minimum execution time: 46_053_000 picoseconds. + Weight::from_parts(38_209_438, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 540 - .saturating_add(Weight::from_parts(88_311, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_354, 0).saturating_mul(z.into())) + // Standard Error: 493 + .saturating_add(Weight::from_parts(84_997, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_276, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -122,11 +122,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `296 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 31_899_000 picoseconds. - Weight::from_parts(33_492_356, 0) + // Minimum execution time: 31_452_000 picoseconds. + Weight::from_parts(33_528_642, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 684 - .saturating_add(Weight::from_parts(79_819, 0).saturating_mul(s.into())) + // Standard Error: 656 + .saturating_add(Weight::from_parts(72_992, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -137,11 +137,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `315` // Estimated: `6811` - // Minimum execution time: 19_002_000 picoseconds. - Weight::from_parts(20_275_891, 0) + // Minimum execution time: 18_712_000 picoseconds. + Weight::from_parts(19_965_736, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 482 - .saturating_add(Weight::from_parts(68_692, 0).saturating_mul(s.into())) + // Standard Error: 418 + .saturating_add(Weight::from_parts(61_664, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -152,11 +152,11 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `487 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 32_841_000 picoseconds. - Weight::from_parts(34_782_386, 0) + // Minimum execution time: 32_437_000 picoseconds. + Weight::from_parts(34_638_519, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 656 - .saturating_add(Weight::from_parts(73_853, 0).saturating_mul(s.into())) + // Standard Error: 688 + .saturating_add(Weight::from_parts(71_088, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs index 7c8fab57ede..f6393e3b8f8 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_preimage` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -57,11 +57,11 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `143` // Estimated: `3556` - // Minimum execution time: 31_179_000 picoseconds. - Weight::from_parts(31_555_000, 0) + // Minimum execution time: 29_957_000 picoseconds. + Weight::from_parts(30_290_000, 0) .saturating_add(Weight::from_parts(0, 3556)) - // Standard Error: 4 - .saturating_add(Weight::from_parts(2_116, 0).saturating_mul(s.into())) + // Standard Error: 1 + .saturating_add(Weight::from_parts(2_011, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -74,11 +74,11 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3556` - // Minimum execution time: 16_210_000 picoseconds. - Weight::from_parts(16_377_000, 0) + // Minimum execution time: 15_588_000 picoseconds. + Weight::from_parts(15_683_000, 0) .saturating_add(Weight::from_parts(0, 3556)) - // Standard Error: 3 - .saturating_add(Weight::from_parts(2_089, 0).saturating_mul(s.into())) + // Standard Error: 1 + .saturating_add(Weight::from_parts(2_010, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -91,11 +91,11 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3556` - // Minimum execution time: 15_441_000 picoseconds. - Weight::from_parts(15_607_000, 0) + // Minimum execution time: 14_686_000 picoseconds. + Weight::from_parts(14_879_000, 0) .saturating_add(Weight::from_parts(0, 3556)) // Standard Error: 1 - .saturating_add(Weight::from_parts(2_072, 0).saturating_mul(s.into())) + .saturating_add(Weight::from_parts(2_010, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -107,8 +107,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `289` // Estimated: `3556` - // Minimum execution time: 38_302_000 picoseconds. - Weight::from_parts(39_611_000, 0) + // Minimum execution time: 38_394_000 picoseconds. + Weight::from_parts(39_215_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -121,8 +121,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `144` // Estimated: `3556` - // Minimum execution time: 21_163_000 picoseconds. - Weight::from_parts(22_013_000, 0) + // Minimum execution time: 21_784_000 picoseconds. + Weight::from_parts(22_960_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -133,8 +133,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `188` // Estimated: `3556` - // Minimum execution time: 20_543_000 picoseconds. - Weight::from_parts(21_576_000, 0) + // Minimum execution time: 20_395_000 picoseconds. + Weight::from_parts(21_290_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -145,8 +145,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `144` // Estimated: `3556` - // Minimum execution time: 11_317_000 picoseconds. - Weight::from_parts(11_834_000, 0) + // Minimum execution time: 11_172_000 picoseconds. + Weight::from_parts(11_691_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -157,8 +157,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3556` - // Minimum execution time: 13_495_000 picoseconds. - Weight::from_parts(13_897_000, 0) + // Minimum execution time: 12_656_000 picoseconds. + Weight::from_parts(13_325_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -169,8 +169,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3556` - // Minimum execution time: 8_208_000 picoseconds. - Weight::from_parts(8_472_000, 0) + // Minimum execution time: 7_782_000 picoseconds. + Weight::from_parts(8_114_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -183,8 +183,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `144` // Estimated: `3556` - // Minimum execution time: 19_788_000 picoseconds. - Weight::from_parts(20_692_000, 0) + // Minimum execution time: 19_963_000 picoseconds. + Weight::from_parts(20_908_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -195,8 +195,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3556` - // Minimum execution time: 7_792_000 picoseconds. - Weight::from_parts(8_113_000, 0) + // Minimum execution time: 7_769_000 picoseconds. + Weight::from_parts(8_108_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -207,8 +207,8 @@ impl pallet_preimage::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3556` - // Minimum execution time: 7_869_000 picoseconds. - Weight::from_parts(8_164_000, 0) + // Minimum execution time: 7_826_000 picoseconds. + Weight::from_parts(8_146_000, 0) .saturating_add(Weight::from_parts(0, 3556)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs index c5cb4f2e713..f4a19e0f7d2 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_proxy` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -55,11 +55,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 16_925_000 picoseconds. - Weight::from_parts(17_434_407, 0) + // Minimum execution time: 16_390_000 picoseconds. + Weight::from_parts(16_916_214, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 725 - .saturating_add(Weight::from_parts(35_067, 0).saturating_mul(p.into())) + // Standard Error: 812 + .saturating_add(Weight::from_parts(31_020, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) } /// Storage: Proxy Proxies (r:1 w:0) @@ -74,13 +74,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `454 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 38_996_000 picoseconds. - Weight::from_parts(38_697_326, 0) + // Minimum execution time: 37_748_000 picoseconds. + Weight::from_parts(37_532_718, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_269 - .saturating_add(Weight::from_parts(143_716, 0).saturating_mul(a.into())) - // Standard Error: 1_312 - .saturating_add(Weight::from_parts(36_502, 0).saturating_mul(p.into())) + // Standard Error: 1_186 + .saturating_add(Weight::from_parts(147_542, 0).saturating_mul(a.into())) + // Standard Error: 1_225 + .saturating_add(Weight::from_parts(36_909, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -94,13 +94,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 25_647_000 picoseconds. - Weight::from_parts(26_204_494, 0) + // Minimum execution time: 24_833_000 picoseconds. + Weight::from_parts(25_268_493, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_128 - .saturating_add(Weight::from_parts(137_913, 0).saturating_mul(a.into())) - // Standard Error: 1_166 - .saturating_add(Weight::from_parts(7_581, 0).saturating_mul(p.into())) + // Standard Error: 1_924 + .saturating_add(Weight::from_parts(136_284, 0).saturating_mul(a.into())) + // Standard Error: 1_988 + .saturating_add(Weight::from_parts(13_871, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -114,13 +114,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `369 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 25_508_000 picoseconds. - Weight::from_parts(26_110_626, 0) + // Minimum execution time: 25_026_000 picoseconds. + Weight::from_parts(25_338_402, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_155 - .saturating_add(Weight::from_parts(139_682, 0).saturating_mul(a.into())) - // Standard Error: 1_193 - .saturating_add(Weight::from_parts(8_390, 0).saturating_mul(p.into())) + // Standard Error: 1_084 + .saturating_add(Weight::from_parts(128_989, 0).saturating_mul(a.into())) + // Standard Error: 1_120 + .saturating_add(Weight::from_parts(14_139, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -136,13 +136,13 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `386 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 35_316_000 picoseconds. - Weight::from_parts(34_940_391, 0) + // Minimum execution time: 34_527_000 picoseconds. + Weight::from_parts(34_041_080, 0) .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_038 - .saturating_add(Weight::from_parts(143_848, 0).saturating_mul(a.into())) - // Standard Error: 1_072 - .saturating_add(Weight::from_parts(37_947, 0).saturating_mul(p.into())) + // Standard Error: 1_217 + .saturating_add(Weight::from_parts(125_156, 0).saturating_mul(a.into())) + // Standard Error: 1_257 + .saturating_add(Weight::from_parts(33_526, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -153,11 +153,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 26_890_000 picoseconds. - Weight::from_parts(27_454_486, 0) + // Minimum execution time: 25_535_000 picoseconds. + Weight::from_parts(26_198_759, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_069 - .saturating_add(Weight::from_parts(50_270, 0).saturating_mul(p.into())) + // Standard Error: 1_191 + .saturating_add(Weight::from_parts(51_592, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -168,11 +168,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 26_634_000 picoseconds. - Weight::from_parts(27_382_449, 0) + // Minimum execution time: 25_753_000 picoseconds. + Weight::from_parts(26_636_855, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_573 - .saturating_add(Weight::from_parts(65_622, 0).saturating_mul(p.into())) + // Standard Error: 1_564 + .saturating_add(Weight::from_parts(53_131, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -183,11 +183,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `127 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_582_000 picoseconds. - Weight::from_parts(23_977_985, 0) + // Minimum execution time: 22_815_000 picoseconds. + Weight::from_parts(23_467_561, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_713 - .saturating_add(Weight::from_parts(44_551, 0).saturating_mul(p.into())) + // Standard Error: 945 + .saturating_add(Weight::from_parts(24_441, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -198,11 +198,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `139` // Estimated: `4706` - // Minimum execution time: 28_564_000 picoseconds. - Weight::from_parts(29_496_680, 0) + // Minimum execution time: 27_184_000 picoseconds. + Weight::from_parts(27_924_432, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 5_045 - .saturating_add(Weight::from_parts(29_343, 0).saturating_mul(p.into())) + // Standard Error: 1_137 + .saturating_add(Weight::from_parts(9_619, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -213,11 +213,11 @@ impl pallet_proxy::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `164 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 24_932_000 picoseconds. - Weight::from_parts(25_952_091, 0) + // Minimum execution time: 23_664_000 picoseconds. + Weight::from_parts(24_401_690, 0) .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 5_615 - .saturating_add(Weight::from_parts(22_027, 0).saturating_mul(p.into())) + // Standard Error: 958 + .saturating_add(Weight::from_parts(32_314, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs index aed4994c49b..db5bb953ac4 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_ranked_collective` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -60,8 +60,8 @@ impl pallet_ranked_collective::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `109` // Estimated: `3507` - // Minimum execution time: 16_966_000 picoseconds. - Weight::from_parts(17_355_000, 0) + // Minimum execution time: 17_437_000 picoseconds. + Weight::from_parts(17_646_000, 0) .saturating_add(Weight::from_parts(0, 3507)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) @@ -79,11 +79,11 @@ impl pallet_ranked_collective::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `584 + r * (281 ±0)` // Estimated: `3519 + r * (2529 ±0)` - // Minimum execution time: 28_160_000 picoseconds. - Weight::from_parts(30_609_588, 0) + // Minimum execution time: 28_698_000 picoseconds. + Weight::from_parts(31_441_420, 0) .saturating_add(Weight::from_parts(0, 3519)) - // Standard Error: 25_389 - .saturating_add(Weight::from_parts(11_728_844, 0).saturating_mul(r.into())) + // Standard Error: 25_785 + .saturating_add(Weight::from_parts(12_450_241, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(r.into()))) .saturating_add(T::DbWeight::get().writes(4)) @@ -103,11 +103,11 @@ impl pallet_ranked_collective::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `281 + r * (17 ±0)` // Estimated: `3507` - // Minimum execution time: 20_058_000 picoseconds. - Weight::from_parts(20_751_832, 0) + // Minimum execution time: 20_319_000 picoseconds. + Weight::from_parts(21_050_040, 0) .saturating_add(Weight::from_parts(0, 3507)) - // Standard Error: 3_745 - .saturating_add(Weight::from_parts(359_667, 0).saturating_mul(r.into())) + // Standard Error: 3_562 + .saturating_add(Weight::from_parts(338_796, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -124,11 +124,11 @@ impl pallet_ranked_collective::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `599 + r * (72 ±0)` // Estimated: `3519` - // Minimum execution time: 27_806_000 picoseconds. - Weight::from_parts(30_225_170, 0) + // Minimum execution time: 28_799_000 picoseconds. + Weight::from_parts(31_074_181, 0) .saturating_add(Weight::from_parts(0, 3519)) - // Standard Error: 16_870 - .saturating_add(Weight::from_parts(608_652, 0).saturating_mul(r.into())) + // Standard Error: 17_336 + .saturating_add(Weight::from_parts(614_951, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -144,8 +144,8 @@ impl pallet_ranked_collective::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `633` // Estimated: `317568` - // Minimum execution time: 48_000_000 picoseconds. - Weight::from_parts(48_520_000, 0) + // Minimum execution time: 48_431_000 picoseconds. + Weight::from_parts(48_867_000, 0) .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -161,11 +161,11 @@ impl pallet_ranked_collective::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `467 + n * (50 ±0)` // Estimated: `4365 + n * (2540 ±0)` - // Minimum execution time: 15_426_000 picoseconds. - Weight::from_parts(19_278_701, 0) + // Minimum execution time: 15_419_000 picoseconds. + Weight::from_parts(19_562_203, 0) .saturating_add(Weight::from_parts(0, 4365)) - // Standard Error: 1_274 - .saturating_add(Weight::from_parts(916_410, 0).saturating_mul(n.into())) + // Standard Error: 1_399 + .saturating_add(Weight::from_parts(986_173, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs index b70c3017a38..79c7f92473e 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_referenda` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -60,8 +60,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `322` // Estimated: `159279` - // Minimum execution time: 29_980_000 picoseconds. - Weight::from_parts(30_415_000, 0) + // Minimum execution time: 29_859_000 picoseconds. + Weight::from_parts(30_332_000, 0) .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -74,8 +74,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `366` // Estimated: `317568` - // Minimum execution time: 54_782_000 picoseconds. - Weight::from_parts(55_250_000, 0) + // Minimum execution time: 54_652_000 picoseconds. + Weight::from_parts(54_981_000, 0) .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -86,15 +86,17 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) /// Storage: FellowshipReferenda TrackQueue (r:1 w:1) /// Proof: FellowshipReferenda TrackQueue (max_values: None, max_size: Some(812), added: 3287, mode: MaxEncodedLen) + /// Storage: Scheduler Agenda (r:1 w:1) + /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn place_decision_deposit_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `1845` - // Estimated: `4365` - // Minimum execution time: 68_580_000 picoseconds. - Weight::from_parts(69_745_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `2004` + // Estimated: `159279` + // Minimum execution time: 84_277_000 picoseconds. + Weight::from_parts(86_396_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) } /// Storage: FellowshipReferenda ReferendumInfoFor (r:1 w:1) /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) @@ -102,15 +104,17 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) /// Storage: FellowshipReferenda TrackQueue (r:1 w:1) /// Proof: FellowshipReferenda TrackQueue (max_values: None, max_size: Some(812), added: 3287, mode: MaxEncodedLen) + /// Storage: Scheduler Agenda (r:1 w:1) + /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn place_decision_deposit_not_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `1886` - // Estimated: `4365` - // Minimum execution time: 66_900_000 picoseconds. - Weight::from_parts(69_144_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `2045` + // Estimated: `159279` + // Minimum execution time: 83_603_000 picoseconds. + Weight::from_parts(85_564_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) } /// Storage: FellowshipReferenda ReferendumInfoFor (r:1 w:1) /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) @@ -124,8 +128,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `769` // Estimated: `317568` - // Minimum execution time: 125_600_000 picoseconds. - Weight::from_parts(129_568_000, 0) + // Minimum execution time: 124_446_000 picoseconds. + Weight::from_parts(127_196_000, 0) .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -136,15 +140,17 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) /// Storage: FellowshipCollective MemberCount (r:1 w:0) /// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) + /// Storage: Scheduler Agenda (r:2 w:2) + /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn place_decision_deposit_failing() -> Weight { // Proof Size summary in bytes: - // Measured: `579` - // Estimated: `4365` - // Minimum execution time: 47_058_000 picoseconds. - Weight::from_parts(47_629_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `634` + // Estimated: `317568` + // Minimum execution time: 67_332_000 picoseconds. + Weight::from_parts(68_060_000, 0) + .saturating_add(Weight::from_parts(0, 317568)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: FellowshipReferenda ReferendumInfoFor (r:1 w:1) /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) @@ -152,8 +158,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `317` // Estimated: `4365` - // Minimum execution time: 32_565_000 picoseconds. - Weight::from_parts(32_857_000, 0) + // Minimum execution time: 32_800_000 picoseconds. + Weight::from_parts(33_194_000, 0) .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -164,8 +170,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `167` // Estimated: `4365` - // Minimum execution time: 16_655_000 picoseconds. - Weight::from_parts(16_980_000, 0) + // Minimum execution time: 16_319_000 picoseconds. + Weight::from_parts(16_595_000, 0) .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -178,8 +184,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `311` // Estimated: `317568` - // Minimum execution time: 39_979_000 picoseconds. - Weight::from_parts(40_199_000, 0) + // Minimum execution time: 39_829_000 picoseconds. + Weight::from_parts(40_797_000, 0) .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -208,8 +214,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `517` // Estimated: `317568` - // Minimum execution time: 158_717_000 picoseconds. - Weight::from_parts(159_336_000, 0) + // Minimum execution time: 157_047_000 picoseconds. + Weight::from_parts(158_391_000, 0) .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(11)) .saturating_add(T::DbWeight::get().writes(6)) @@ -222,8 +228,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `140` // Estimated: `4277` - // Minimum execution time: 11_107_000 picoseconds. - Weight::from_parts(11_302_000, 0) + // Minimum execution time: 11_262_000 picoseconds. + Weight::from_parts(11_561_000, 0) .saturating_add(Weight::from_parts(0, 4277)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -234,17 +240,17 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) /// Storage: FellowshipCollective MemberCount (r:1 w:0) /// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) + /// Storage: Scheduler Agenda (r:1 w:1) /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn one_fewer_deciding_failing() -> Weight { // Proof Size summary in bytes: - // Measured: `3896` - // Estimated: `317568` - // Minimum execution time: 237_949_000 picoseconds. - Weight::from_parts(240_956_000, 0) - .saturating_add(Weight::from_parts(0, 317568)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `2385` + // Estimated: `159279` + // Minimum execution time: 70_608_000 picoseconds. + Weight::from_parts(72_409_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) } /// Storage: FellowshipReferenda TrackQueue (r:1 w:1) /// Proof: FellowshipReferenda TrackQueue (max_values: None, max_size: Some(812), added: 3287, mode: MaxEncodedLen) @@ -252,49 +258,45 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) /// Storage: FellowshipCollective MemberCount (r:1 w:0) /// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) + /// Storage: Scheduler Agenda (r:1 w:1) /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn one_fewer_deciding_passing() -> Weight { // Proof Size summary in bytes: - // Measured: `3896` - // Estimated: `317568` - // Minimum execution time: 240_708_000 picoseconds. - Weight::from_parts(242_646_000, 0) - .saturating_add(Weight::from_parts(0, 317568)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `2385` + // Estimated: `159279` + // Minimum execution time: 73_010_000 picoseconds. + Weight::from_parts(75_118_000, 0) + .saturating_add(Weight::from_parts(0, 159279)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: FellowshipReferenda ReferendumInfoFor (r:1 w:1) + /// Storage: FellowshipReferenda ReferendumInfoFor (r:1 w:0) /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) /// Storage: FellowshipReferenda TrackQueue (r:1 w:1) /// Proof: FellowshipReferenda TrackQueue (max_values: None, max_size: Some(812), added: 3287, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_requeued_insertion() -> Weight { // Proof Size summary in bytes: - // Measured: `3494` - // Estimated: `159279` - // Minimum execution time: 136_435_000 picoseconds. - Weight::from_parts(138_673_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `1807` + // Estimated: `4365` + // Minimum execution time: 35_429_000 picoseconds. + Weight::from_parts(36_529_000, 0) + .saturating_add(Weight::from_parts(0, 4365)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: FellowshipReferenda ReferendumInfoFor (r:1 w:1) + /// Storage: FellowshipReferenda ReferendumInfoFor (r:1 w:0) /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) /// Storage: FellowshipReferenda TrackQueue (r:1 w:1) /// Proof: FellowshipReferenda TrackQueue (max_values: None, max_size: Some(812), added: 3287, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_requeued_slide() -> Weight { // Proof Size summary in bytes: - // Measured: `3447` - // Estimated: `159279` - // Minimum execution time: 136_686_000 picoseconds. - Weight::from_parts(137_969_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `1774` + // Estimated: `4365` + // Minimum execution time: 35_263_000 picoseconds. + Weight::from_parts(36_401_000, 0) + .saturating_add(Weight::from_parts(0, 4365)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: FellowshipReferenda ReferendumInfoFor (r:1 w:1) /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) @@ -302,17 +304,15 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) /// Storage: FellowshipReferenda TrackQueue (r:1 w:1) /// Proof: FellowshipReferenda TrackQueue (max_values: None, max_size: Some(812), added: 3287, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3433` - // Estimated: `159279` - // Minimum execution time: 139_598_000 picoseconds. - Weight::from_parts(140_713_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `1790` + // Estimated: `4365` + // Minimum execution time: 41_442_000 picoseconds. + Weight::from_parts(42_495_000, 0) + .saturating_add(Weight::from_parts(0, 4365)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: FellowshipReferenda ReferendumInfoFor (r:1 w:1) /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) @@ -320,17 +320,15 @@ impl pallet_referenda::WeightInfo for WeightInfo { /// Proof: FellowshipReferenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) /// Storage: FellowshipReferenda TrackQueue (r:1 w:1) /// Proof: FellowshipReferenda TrackQueue (max_values: None, max_size: Some(812), added: 3287, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(155814), added: 158289, mode: MaxEncodedLen) fn nudge_referendum_not_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3488` - // Estimated: `159279` - // Minimum execution time: 139_149_000 picoseconds. - Weight::from_parts(140_033_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `1831` + // Estimated: `4365` + // Minimum execution time: 40_284_000 picoseconds. + Weight::from_parts(41_554_000, 0) + .saturating_add(Weight::from_parts(0, 4365)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: FellowshipReferenda ReferendumInfoFor (r:1 w:1) /// Proof: FellowshipReferenda ReferendumInfoFor (max_values: None, max_size: Some(900), added: 3375, mode: MaxEncodedLen) @@ -340,8 +338,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `263` // Estimated: `159279` - // Minimum execution time: 27_153_000 picoseconds. - Weight::from_parts(27_344_000, 0) + // Minimum execution time: 25_964_000 picoseconds. + Weight::from_parts(26_388_000, 0) .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -354,8 +352,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `311` // Estimated: `159279` - // Minimum execution time: 27_327_000 picoseconds. - Weight::from_parts(27_886_000, 0) + // Minimum execution time: 26_428_000 picoseconds. + Weight::from_parts(26_997_000, 0) .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -366,8 +364,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `208` // Estimated: `4365` - // Minimum execution time: 19_314_000 picoseconds. - Weight::from_parts(19_667_000, 0) + // Minimum execution time: 18_565_000 picoseconds. + Weight::from_parts(18_815_000, 0) .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -384,8 +382,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `579` // Estimated: `159279` - // Minimum execution time: 39_377_000 picoseconds. - Weight::from_parts(39_742_000, 0) + // Minimum execution time: 39_029_000 picoseconds. + Weight::from_parts(39_327_000, 0) .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) @@ -402,8 +400,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `714` // Estimated: `159279` - // Minimum execution time: 66_532_000 picoseconds. - Weight::from_parts(68_794_000, 0) + // Minimum execution time: 66_856_000 picoseconds. + Weight::from_parts(69_530_000, 0) .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) @@ -418,8 +416,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `767` // Estimated: `159279` - // Minimum execution time: 87_398_000 picoseconds. - Weight::from_parts(90_998_000, 0) + // Minimum execution time: 87_496_000 picoseconds. + Weight::from_parts(91_067_000, 0) .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -434,8 +432,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `750` // Estimated: `159279` - // Minimum execution time: 87_401_000 picoseconds. - Weight::from_parts(90_985_000, 0) + // Minimum execution time: 76_994_000 picoseconds. + Weight::from_parts(90_054_000, 0) .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -450,8 +448,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `767` // Estimated: `159279` - // Minimum execution time: 82_591_000 picoseconds. - Weight::from_parts(86_670_000, 0) + // Minimum execution time: 83_812_000 picoseconds. + Weight::from_parts(85_760_000, 0) .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -466,8 +464,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `771` // Estimated: `159279` - // Minimum execution time: 55_759_000 picoseconds. - Weight::from_parts(58_177_000, 0) + // Minimum execution time: 56_903_000 picoseconds. + Weight::from_parts(58_110_000, 0) .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -484,8 +482,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `771` // Estimated: `317568` - // Minimum execution time: 99_521_000 picoseconds. - Weight::from_parts(106_553_000, 0) + // Minimum execution time: 101_848_000 picoseconds. + Weight::from_parts(108_838_000, 0) .saturating_add(Weight::from_parts(0, 317568)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -500,8 +498,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `767` // Estimated: `159279` - // Minimum execution time: 87_381_000 picoseconds. - Weight::from_parts(91_501_000, 0) + // Minimum execution time: 85_974_000 picoseconds. + Weight::from_parts(87_622_000, 0) .saturating_add(Weight::from_parts(0, 159279)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -516,8 +514,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `352` // Estimated: `4365` - // Minimum execution time: 22_378_000 picoseconds. - Weight::from_parts(22_631_000, 0) + // Minimum execution time: 21_903_000 picoseconds. + Weight::from_parts(22_357_000, 0) .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -530,8 +528,8 @@ impl pallet_referenda::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `285` // Estimated: `4365` - // Minimum execution time: 20_116_000 picoseconds. - Weight::from_parts(20_255_000, 0) + // Minimum execution time: 19_526_000 picoseconds. + Weight::from_parts(19_845_000, 0) .saturating_add(Weight::from_parts(0, 4365)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs index f6f6954aca3..e2f70b971e8 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_scheduler` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -54,8 +54,8 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `31` // Estimated: `1489` - // Minimum execution time: 3_399_000 picoseconds. - Weight::from_parts(3_512_000, 0) + // Minimum execution time: 3_408_000 picoseconds. + Weight::from_parts(3_601_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -67,11 +67,11 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `77 + s * (177 ±0)` // Estimated: `159279` - // Minimum execution time: 2_846_000 picoseconds. - Weight::from_parts(4_715_748, 0) + // Minimum execution time: 2_948_000 picoseconds. + Weight::from_parts(4_528_781, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 2_743 - .saturating_add(Weight::from_parts(971_622, 0).saturating_mul(s.into())) + // Standard Error: 2_863 + .saturating_add(Weight::from_parts(746_443, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -79,8 +79,8 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_940_000 picoseconds. - Weight::from_parts(6_087_000, 0) + // Minimum execution time: 5_613_000 picoseconds. + Weight::from_parts(5_702_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: Preimage PreimageFor (r:1 w:1) @@ -92,11 +92,11 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `179 + s * (1 ±0)` // Estimated: `3644 + s * (1 ±0)` - // Minimum execution time: 20_238_000 picoseconds. - Weight::from_parts(20_509_000, 0) + // Minimum execution time: 19_587_000 picoseconds. + Weight::from_parts(19_747_000, 0) .saturating_add(Weight::from_parts(0, 3644)) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_271, 0).saturating_mul(s.into())) + // Standard Error: 6 + .saturating_add(Weight::from_parts(1_290, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into())) @@ -107,8 +107,8 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_274_000 picoseconds. - Weight::from_parts(7_466_000, 0) + // Minimum execution time: 7_085_000 picoseconds. + Weight::from_parts(7_298_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -116,24 +116,24 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_886_000 picoseconds. - Weight::from_parts(6_035_000, 0) + // Minimum execution time: 5_632_000 picoseconds. + Weight::from_parts(5_758_000, 0) .saturating_add(Weight::from_parts(0, 0)) } fn execute_dispatch_signed() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_994_000 picoseconds. - Weight::from_parts(3_101_000, 0) + // Minimum execution time: 2_715_000 picoseconds. + Weight::from_parts(2_847_000, 0) .saturating_add(Weight::from_parts(0, 0)) } fn execute_dispatch_unsigned() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_983_000 picoseconds. - Weight::from_parts(3_095_000, 0) + // Minimum execution time: 2_678_000 picoseconds. + Weight::from_parts(2_803_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: Scheduler Agenda (r:1 w:1) @@ -143,11 +143,11 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `77 + s * (177 ±0)` // Estimated: `159279` - // Minimum execution time: 12_851_000 picoseconds. - Weight::from_parts(14_995_788, 0) + // Minimum execution time: 12_364_000 picoseconds. + Weight::from_parts(13_805_689, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 3_056 - .saturating_add(Weight::from_parts(980_018, 0).saturating_mul(s.into())) + // Standard Error: 3_064 + .saturating_add(Weight::from_parts(759_823, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -160,11 +160,11 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `77 + s * (177 ±0)` // Estimated: `159279` - // Minimum execution time: 17_805_000 picoseconds. - Weight::from_parts(16_078_257, 0) + // Minimum execution time: 16_962_000 picoseconds. + Weight::from_parts(15_334_746, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 3_216 - .saturating_add(Weight::from_parts(1_767_117, 0).saturating_mul(s.into())) + // Standard Error: 3_173 + .saturating_add(Weight::from_parts(1_327_066, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -177,11 +177,11 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `468 + s * (179 ±0)` // Estimated: `159279` - // Minimum execution time: 16_210_000 picoseconds. - Weight::from_parts(20_557_445, 0) + // Minimum execution time: 15_693_000 picoseconds. + Weight::from_parts(19_926_950, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 3_292 - .saturating_add(Weight::from_parts(992_281, 0).saturating_mul(s.into())) + // Standard Error: 3_089 + .saturating_add(Weight::from_parts(760_361, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -194,11 +194,11 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `509 + s * (179 ±0)` // Estimated: `159279` - // Minimum execution time: 19_976_000 picoseconds. - Weight::from_parts(19_613_223, 0) + // Minimum execution time: 19_017_000 picoseconds. + Weight::from_parts(18_740_840, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 2_988 - .saturating_add(Weight::from_parts(1_765_202, 0).saturating_mul(s.into())) + // Standard Error: 2_914 + .saturating_add(Weight::from_parts(1_331_872, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs index cb307d61e54..43d1f3f103d 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `270` // Estimated: `3735` - // Minimum execution time: 17_505_000 picoseconds. - Weight::from_parts(17_789_000, 0) + // Minimum execution time: 17_575_000 picoseconds. + Weight::from_parts(17_997_000, 0) .saturating_add(Weight::from_parts(0, 3735)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,8 +70,8 @@ impl pallet_session::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `242` // Estimated: `3707` - // Minimum execution time: 12_686_000 picoseconds. - Weight::from_parts(12_960_000, 0) + // Minimum execution time: 12_894_000 picoseconds. + Weight::from_parts(13_209_000, 0) .saturating_add(Weight::from_parts(0, 3707)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs index 5b3bd10d3f1..4c51c32ef56 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `49` // Estimated: `1493` - // Minimum execution time: 8_048_000 picoseconds. - Weight::from_parts(8_313_000, 0) + // Minimum execution time: 7_694_000 picoseconds. + Weight::from_parts(7_843_000, 0) .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_226_000 picoseconds. - Weight::from_parts(3_341_000, 0) + // Minimum execution time: 3_208_000 picoseconds. + Weight::from_parts(3_295_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs index 6bec697194f..722b334b664 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -53,18 +53,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_356_000 picoseconds. - Weight::from_parts(3_086_549, 0) + // Minimum execution time: 6_867_000 picoseconds. + Weight::from_parts(7_457_015, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_625 - .saturating_add(Weight::from_parts(4_935_275, 0).saturating_mul(c.into())) + // Standard Error: 3_324 + .saturating_add(Weight::from_parts(4_533_833, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_633_000 picoseconds. - Weight::from_parts(5_693_000, 0) + // Minimum execution time: 5_383_000 picoseconds. + Weight::from_parts(5_461_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -72,18 +72,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_312_000 picoseconds. - Weight::from_parts(3_780_731, 0) + // Minimum execution time: 6_958_000 picoseconds. + Weight::from_parts(7_234_425, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 6_353 - .saturating_add(Weight::from_parts(5_289_295, 0).saturating_mul(c.into())) + // Standard Error: 2_879 + .saturating_add(Weight::from_parts(4_769_075, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_811_000 picoseconds. - Weight::from_parts(10_039_000, 0) + // Minimum execution time: 8_885_000 picoseconds. + Weight::from_parts(9_059_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -91,10 +91,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_419_000 picoseconds. - Weight::from_parts(4_232_933, 0) + // Minimum execution time: 6_914_000 picoseconds. + Weight::from_parts(1_498_896, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_419 - .saturating_add(Weight::from_parts(4_950_293, 0).saturating_mul(c.into())) + // Standard Error: 3_750 + .saturating_add(Weight::from_parts(4_551_100, 0).saturating_mul(c.into())) } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs index ce00a1db94a..fcd7b617e00 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024 @@ -62,8 +62,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `111` // Estimated: `3576` - // Minimum execution time: 30_061_000 picoseconds. - Weight::from_parts(30_674_000, 0) + // Minimum execution time: 28_803_000 picoseconds. + Weight::from_parts(29_380_000, 0) .saturating_add(Weight::from_parts(0, 3576)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -74,8 +74,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1489` - // Minimum execution time: 30_473_000 picoseconds. - Weight::from_parts(30_869_000, 0) + // Minimum execution time: 27_131_000 picoseconds. + Weight::from_parts(27_471_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) } @@ -105,8 +105,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_720_000 picoseconds. - Weight::from_parts(10_836_000, 0) + // Minimum execution time: 9_763_000 picoseconds. + Weight::from_parts(10_070_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -116,8 +116,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_284_000 picoseconds. - Weight::from_parts(3_349_000, 0) + // Minimum execution time: 2_982_000 picoseconds. + Weight::from_parts(3_128_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -141,8 +141,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `111` // Estimated: `3576` - // Minimum execution time: 35_075_000 picoseconds. - Weight::from_parts(35_592_000, 0) + // Minimum execution time: 33_596_000 picoseconds. + Weight::from_parts(34_253_000, 0) .saturating_add(Weight::from_parts(0, 3576)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) @@ -165,8 +165,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `294` // Estimated: `3759` - // Minimum execution time: 35_814_000 picoseconds. - Weight::from_parts(36_242_000, 0) + // Minimum execution time: 34_203_000 picoseconds. + Weight::from_parts(34_510_000, 0) .saturating_add(Weight::from_parts(0, 3759)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) @@ -177,8 +177,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_199_000 picoseconds. - Weight::from_parts(3_444_000, 0) + // Minimum execution time: 3_043_000 picoseconds. + Weight::from_parts(3_145_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -188,8 +188,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `129` // Estimated: `11019` - // Minimum execution time: 16_207_000 picoseconds. - Weight::from_parts(16_419_000, 0) + // Minimum execution time: 15_740_000 picoseconds. + Weight::from_parts(16_015_000, 0) .saturating_add(Weight::from_parts(0, 11019)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -200,8 +200,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `133` // Estimated: `11023` - // Minimum execution time: 16_204_000 picoseconds. - Weight::from_parts(16_554_000, 0) + // Minimum execution time: 15_816_000 picoseconds. + Weight::from_parts(16_084_000, 0) .saturating_add(Weight::from_parts(0, 11023)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -212,8 +212,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `140` // Estimated: `13505` - // Minimum execution time: 16_935_000 picoseconds. - Weight::from_parts(17_263_000, 0) + // Minimum execution time: 16_494_000 picoseconds. + Weight::from_parts(16_815_000, 0) .saturating_add(Weight::from_parts(0, 13505)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -233,8 +233,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `178` // Estimated: `6118` - // Minimum execution time: 31_462_000 picoseconds. - Weight::from_parts(32_095_000, 0) + // Minimum execution time: 30_602_000 picoseconds. + Weight::from_parts(31_780_000, 0) .saturating_add(Weight::from_parts(0, 6118)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -245,8 +245,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `172` // Estimated: `8587` - // Minimum execution time: 8_664_000 picoseconds. - Weight::from_parts(8_835_000, 0) + // Minimum execution time: 8_638_000 picoseconds. + Weight::from_parts(8_798_000, 0) .saturating_add(Weight::from_parts(0, 8587)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -256,8 +256,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `140` // Estimated: `11030` - // Minimum execution time: 15_999_000 picoseconds. - Weight::from_parts(16_305_000, 0) + // Minimum execution time: 15_385_000 picoseconds. + Weight::from_parts(15_771_000, 0) .saturating_add(Weight::from_parts(0, 11030)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -278,8 +278,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `182` // Estimated: `11072` - // Minimum execution time: 37_949_000 picoseconds. - Weight::from_parts(38_524_000, 0) + // Minimum execution time: 37_257_000 picoseconds. + Weight::from_parts(37_977_000, 0) .saturating_add(Weight::from_parts(0, 11072)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) From 72205798f9a102fbb00c6662983dd6f96acdd670 Mon Sep 17 00:00:00 2001 From: Squirrel Date: Thu, 8 Jun 2023 11:02:11 +0100 Subject: [PATCH 285/339] Update integration tests following event rename (#2700) * ump.ExecutedUpward -> messageQueue.Processed * update lock file because --- .../e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml | 11 +++++++++-- .../e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml | 11 +++++++++-- .../collectives-polkadot/0_xcm/1_teleport.yml | 11 +++++++++-- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml index 3cdb9547c35..70340758685 100644 --- a/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml +++ b/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml @@ -97,10 +97,17 @@ tests: - name: polkadotXcm.Attempted threshold: *weight_threshold result: [{ Complete: { refTime: '539,494,000', proofSize: '7,133' }}] - - name: ump.ExecutedUpward + - name: messageQueue.Processed chain: *relay_chain threshold: *weight_threshold - result: [{ Complete: { refTime: '298,716,000', proofSize: 0 }}] + result: + origin: + Ump: + Para: '1,000' + weightUsed: + refTime: '298,716,000' + proofSize: '0' + success: true - queries: balance_ap_sender_after: chain: *assets_parachain diff --git a/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml index 4bdeceb765c..bdf6d49ea7a 100644 --- a/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml +++ b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml @@ -98,10 +98,17 @@ tests: - name: polkadotXcm.Attempted threshold: *weight_threshold result: [{ Complete: { refTime: '533,283,000', proofSize: '7,096' }}] - - name: ump.ExecutedUpward + - name: messageQueue.Processed chain: *relay_chain threshold: *weight_threshold - result: [{ Complete: { refTime: '4,000,000,000', proofSize: 0 }}] + result: + origin: + Ump: + Para: '1,000' + weightUsed: + refTime: '4,000,000,000' + proofSize: '0' + success: true - queries: balance_ap_sender_after: chain: *assets_parachain diff --git a/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml b/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml index 2cd1fa68168..1d667caed5f 100644 --- a/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml +++ b/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml @@ -130,10 +130,17 @@ tests: - name: balances.Withdraw chain: *relay_chain result: { who: *checking_account, amount: 10000000000000 } # amount received and withdrawn from registry account - - name: ump.ExecutedUpward + - name: messageQueue.Processed chain: *relay_chain threshold: *weight_threshold - result: [{ Complete: { refTime: '4,000,000,000', proofSize: 0 }}] + result: + origin: + Ump: + Para: '1,001' + weightUsed: + refTime: '4,000,000,000' + proofSize: '0' + success: true - queries: balance_rc_alice_3: chain: *relay_chain From d5e33e4e05f5083cf9d9d34d53ac21d84cfde474 Mon Sep 17 00:00:00 2001 From: Muharem Ismailov Date: Thu, 8 Jun 2023 13:09:48 +0200 Subject: [PATCH 286/339] Xcm Emulator: prepare XCMP on init (#2711) * std for pallet-glutton * fix xcm-emulator init * headers for it tests --- .../emulated/assets/asset-hub-kusama/src/lib.rs | 16 ++++++++++++++++ .../assets/asset-hub-kusama/src/tests/mod.rs | 16 ++++++++++++++++ .../src/tests/reserve_transfer.rs | 16 ++++++++++++++++ .../asset-hub-kusama/src/tests/teleport.rs | 16 ++++++++++++++++ .../asset-hub-kusama/src/tests/transact.rs | 16 ++++++++++++++++ .../assets/asset-hub-polkadot/src/lib.rs | 16 ++++++++++++++++ .../assets/asset-hub-polkadot/src/tests/mod.rs | 16 ++++++++++++++++ .../src/tests/reserve_transfer.rs | 16 ++++++++++++++++ .../asset-hub-polkadot/src/tests/teleport.rs | 16 ++++++++++++++++ .../asset-hub-polkadot/src/tests/transact.rs | 16 ++++++++++++++++ .../emulated/assets/asset-hub-westend/src/lib.rs | 16 ++++++++++++++++ .../assets/asset-hub-westend/src/tests/mod.rs | 16 ++++++++++++++++ .../src/tests/reserve_transfer.rs | 16 ++++++++++++++++ .../asset-hub-westend/src/tests/teleport.rs | 16 ++++++++++++++++ .../asset-hub-westend/src/tests/transact.rs | 16 ++++++++++++++++ .../collectives-polkadot/src/tests/fellowship.rs | 5 +---- test/runtime/Cargo.toml | 1 + xcm/xcm-emulator/src/lib.rs | 2 ++ 18 files changed, 244 insertions(+), 4 deletions(-) diff --git a/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/lib.rs b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/lib.rs index 49986fa3c83..596d5893809 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/lib.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/lib.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + pub use codec::Encode; pub use frame_support::{ assert_ok, instances::Instance1, pallet_prelude::Weight, traits::fungibles::Inspect, diff --git a/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/mod.rs b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/mod.rs index 996f9fd0aae..44861d2a872 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/mod.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/mod.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + mod reserve_transfer; mod teleport; mod transact; diff --git a/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/reserve_transfer.rs index 46d6e9a807d..e1107ebb565 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/reserve_transfer.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/reserve_transfer.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + use crate::*; #[test] diff --git a/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/teleport.rs index 92849523d45..16c0db907c3 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/teleport.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/teleport.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + use crate::*; #[test] diff --git a/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/transact.rs b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/transact.rs index 79542395e74..65264c25203 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/transact.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/transact.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + use crate::*; #[test] diff --git a/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/lib.rs b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/lib.rs index d29f9674dbf..02296fa996e 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/lib.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/lib.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + pub use codec::Encode; pub use frame_support::{ assert_ok, instances::Instance1, pallet_prelude::Weight, traits::fungibles::Inspect, diff --git a/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/mod.rs b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/mod.rs index 996f9fd0aae..44861d2a872 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/mod.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/mod.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + mod reserve_transfer; mod teleport; mod transact; diff --git a/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/reserve_transfer.rs index 6b967ecf769..a880bc43b2b 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/reserve_transfer.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/reserve_transfer.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + use crate::*; #[test] diff --git a/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/teleport.rs index eebdddfe506..6b799096054 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/teleport.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/teleport.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + use crate::*; #[test] diff --git a/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/transact.rs b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/transact.rs index 759e063dd93..dc2f1e87d4b 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/transact.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/transact.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + use crate::*; #[test] diff --git a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/lib.rs b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/lib.rs index d68aa99c709..68a5ccfaa0c 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/lib.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/lib.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + pub use codec::Encode; pub use frame_support::{ assert_ok, instances::Instance1, pallet_prelude::Weight, traits::fungibles::Inspect, diff --git a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/mod.rs b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/mod.rs index 996f9fd0aae..44861d2a872 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/mod.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/mod.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + mod reserve_transfer; mod teleport; mod transact; diff --git a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/reserve_transfer.rs index b54f654702b..8a0191a6fe6 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/reserve_transfer.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/reserve_transfer.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + use crate::*; #[test] diff --git a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/teleport.rs index f17ea755785..c8a57933b05 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/teleport.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/teleport.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + use crate::*; #[test] diff --git a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/transact.rs b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/transact.rs index 3453ea6991f..e71a9174848 100644 --- a/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/transact.rs +++ b/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/transact.rs @@ -1,3 +1,19 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + use crate::*; #[test] diff --git a/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/fellowship.rs b/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/fellowship.rs index 778eb92c7d1..233fd67083d 100644 --- a/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/fellowship.rs +++ b/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/fellowship.rs @@ -23,7 +23,7 @@ use frame_support::traits::{ tokens::Pay, }; use sp_core::crypto::Ss58Codec; -use xcm_emulator::{Network, TestExt}; +use xcm_emulator::TestExt; #[test] fn pay_salary() { @@ -34,9 +34,6 @@ fn pay_salary() { let pay_to = Polkadot::account_id_of(ALICE); let pay_amount = 9000; - PolkadotMockNet::_init(); - PolkadotMockNet::reset(); - AssetHub::execute_with(|| { type AssetHubAssets = ::Assets; diff --git a/test/runtime/Cargo.toml b/test/runtime/Cargo.toml index e4ddeea69b0..130ffcdc298 100644 --- a/test/runtime/Cargo.toml +++ b/test/runtime/Cargo.toml @@ -51,6 +51,7 @@ std = [ "pallet-sudo/std", "pallet-timestamp/std", "pallet-transaction-payment/std", + "pallet-glutton/std", "sp-api/std", "sp-block-builder/std", "sp-core/std", diff --git a/xcm/xcm-emulator/src/lib.rs b/xcm/xcm-emulator/src/lib.rs index 0a468e7fcaf..068c99e5a47 100644 --- a/xcm/xcm-emulator/src/lib.rs +++ b/xcm/xcm-emulator/src/lib.rs @@ -740,6 +740,8 @@ macro_rules! decl_test_networks { $crate::HORIZONTAL_MESSAGES.with(|b| b.borrow_mut().insert(stringify!($name).to_string(), $crate::VecDeque::new())); $crate::RELAY_BLOCK_NUMBER.with(|b| b.borrow_mut().insert(stringify!($name).to_string(), 1)); $crate::PARA_IDS.with(|b| b.borrow_mut().insert(stringify!($name).to_string(), Self::_para_ids())); + + $( <$parachain>::prepare_for_xcmp(); )* } } From 8a07286a7fbe9269ca4b7e22557cd5e7c8f7e72e Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 8 Jun 2023 13:23:33 +0200 Subject: [PATCH 287/339] Test compilation after rebase --- parachains/pallets/bridge-transfer/src/tests.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/tests.rs b/parachains/pallets/bridge-transfer/src/tests.rs index bde52abf836..242111596ce 100644 --- a/parachains/pallets/bridge-transfer/src/tests.rs +++ b/parachains/pallets/bridge-transfer/src/tests.rs @@ -44,7 +44,7 @@ use xcm_builder::{ GlobalConsensusParachainConvertsFor, IsConcrete, SiblingParachainConvertsVia, SignedToAccountId32, UnpaidRemoteExporter, }; -use xcm_executor::traits::Convert; +use xcm_executor::traits::ConvertLocation; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; @@ -448,7 +448,7 @@ fn test_transfer_asset_via_bridge_for_currency_works() { // checks before assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); assert_eq!(Balances::free_balance(&user_account), user_account_init_balance); - let reserve_account = LocationToAccountId::convert_ref(target_location) + let reserve_account = LocationToAccountId::convert_location(&target_location) .expect("converted target_location as accountId"); assert_eq!(Balances::free_balance(&reserve_account), 0); @@ -568,7 +568,7 @@ fn test_transfer_asset_via_bridge_in_case_of_error_transactional_works() { assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); let user_balance_before = Balances::free_balance(&user_account); assert_eq!(user_balance_before, user_account_init_balance); - let reserve_account = LocationToAccountId::convert_ref(target_location) + let reserve_account = LocationToAccountId::convert_location(&target_location) .expect("converted target_location as accountId"); let reserve_account_before = Balances::free_balance(&reserve_account); assert_eq!(reserve_account_before, 0); From 9260459eb326c8bd747a8f738b03ab34f2902704 Mon Sep 17 00:00:00 2001 From: Ignacio Palacios Date: Thu, 8 Jun 2023 14:45:55 +0200 Subject: [PATCH 288/339] add account nonce api to glutton (#2714) --- Cargo.lock | 1 + parachains/runtimes/glutton/glutton-kusama/Cargo.toml | 2 ++ parachains/runtimes/glutton/glutton-kusama/src/lib.rs | 6 ++++++ 3 files changed, 9 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 1316e32fb3b..9028242c026 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4734,6 +4734,7 @@ dependencies = [ "frame-support", "frame-system", "frame-system-benchmarking", + "frame-system-rpc-runtime-api", "frame-try-runtime", "pallet-glutton", "pallet-sudo", diff --git a/parachains/runtimes/glutton/glutton-kusama/Cargo.toml b/parachains/runtimes/glutton/glutton-kusama/Cargo.toml index bc502c116f3..d2a270bca13 100644 --- a/parachains/runtimes/glutton/glutton-kusama/Cargo.toml +++ b/parachains/runtimes/glutton/glutton-kusama/Cargo.toml @@ -13,6 +13,7 @@ frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } pallet-glutton = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } @@ -59,6 +60,7 @@ std = [ "frame-executive/std", "frame-support/std", "frame-system/std", + "frame-system-rpc-runtime-api/std", "pallet-glutton/std", "pallet-sudo/std", "sp-api/std", diff --git a/parachains/runtimes/glutton/glutton-kusama/src/lib.rs b/parachains/runtimes/glutton/glutton-kusama/src/lib.rs index 388715f09c3..fba081f2d66 100644 --- a/parachains/runtimes/glutton/glutton-kusama/src/lib.rs +++ b/parachains/runtimes/glutton/glutton-kusama/src/lib.rs @@ -352,6 +352,12 @@ impl_runtime_apis! { } } + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Index { + System::account_nonce(account) + } + } + #[cfg(feature = "runtime-benchmarks")] impl frame_benchmarking::Benchmark for Runtime { fn benchmark_metadata(extra: bool) -> ( From 850fac5a8af88058e1d54abdd8cb2b4ee7ff6b36 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 8 Jun 2023 16:26:25 +0200 Subject: [PATCH 289/339] Small nits --- .../pallets/bridge-transfer/src/features.rs | 92 ++++++++++++++----- .../pallets/bridge-transfer/src/impls.rs | 26 +++--- parachains/pallets/bridge-transfer/src/lib.rs | 8 +- .../pallets/bridge-transfer/src/tests.rs | 56 +++++------ .../pallets/bridge-transfer/src/types.rs | 4 +- .../assets/asset-hub-kusama/src/lib.rs | 7 +- .../assets/asset-hub-westend/src/lib.rs | 7 +- 7 files changed, 129 insertions(+), 71 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/features.rs b/parachains/pallets/bridge-transfer/src/features.rs index 495d8e5fb6f..76f464836e6 100644 --- a/parachains/pallets/bridge-transfer/src/features.rs +++ b/parachains/pallets/bridge-transfer/src/features.rs @@ -68,7 +68,7 @@ pub struct AllowedUniversalAliasesOf(sp_std::marker::PhantomData); impl Contains<(MultiLocation, Junction)> for AllowedUniversalAliasesOf { fn contains((location, junction): &(MultiLocation, Junction)) -> bool { log::trace!( - target: "xcm::contains", + target: LOG_TARGET, "AllowedUniversalAliasesOf location: {:?}, junction: {:?}", location, junction ); @@ -84,8 +84,8 @@ impl ContainsPair { fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { log::trace!( - target: "xcm::contains", - "IsTrustedBridgedReserve asset: {:?}, origin: {:?}", + target: LOG_TARGET, + "IsTrustedBridgedReserveForConcreteAsset asset: {:?}, origin: {:?}", asset, origin ); @@ -100,7 +100,7 @@ impl ContainsPair Ok(result) => result, Err(e) => { log::error!( - target: "xcm::contains", + target: LOG_TARGET, "IsTrustedBridgedReserveForConcreteAsset has error: {:?} for asset_location: {:?} and origin: {:?}!", e, asset_location, origin ); @@ -110,65 +110,109 @@ impl ContainsPair } } -/// Implementation of `ResolveTransferKind` which tries to resolve all kinds of transfer according to on-chain configuration. -pub struct ConfiguredConcreteAssetTransferKindResolver(sp_std::marker::PhantomData); - -impl ResolveAssetTransferKind for ConfiguredConcreteAssetTransferKindResolver { - fn resolve(asset: &MultiAsset, target_location: &MultiLocation) -> AssetTransferKind { +/// Verifies if it is allowed for `(MultiAsset, MultiLocation)` to be transferred out as reserve based transfer over "bridge". +pub struct IsAllowedReserveBasedAssetTransferForConcreteAsset(sp_std::marker::PhantomData); +impl ContainsPair + for IsAllowedReserveBasedAssetTransferForConcreteAsset +{ + fn contains(asset: &MultiAsset, target_location: &MultiLocation) -> bool { log::trace!( target: LOG_TARGET, - "ConfiguredConcreteAssetTransferKindResolver resolve asset: {:?}, target_location: {:?}", + "IsAllowedReserveBasedAssetTransferForConcreteAsset asset: {:?}, target_location: {:?}", asset, target_location ); let asset_location = match &asset.id { Concrete(location) => location, - _ => return AssetTransferKind::Unsupported, + _ => return false, }; - // first, we check, if we are trying to transfer back reserve-deposited assets - // other words: if target_location is a known reserve location for asset - if IsTrustedBridgedReserveForConcreteAsset::::contains(asset, target_location) { - return AssetTransferKind::WithdrawReserve - } - - // second, we check, if target_location is allowed for requested asset to be transferred there match target_location.interior.global_consensus() { Ok(target_consensus) => { if let Some(bridge_config) = Pallet::::allowed_exporters(target_consensus) { match bridge_config.allowed_target_location_for(target_location) { Ok(Some((_, Some(asset_filter)))) => { match asset_filter.matches(asset_location) { - Ok(true) => return AssetTransferKind::ReserveBased, - Ok(false) => (), + Ok(matches) => matches, Err(e) => { log::error!( target: LOG_TARGET, - "ConfiguredConcreteAssetTransferKindResolver `asset_filter.matches` has error: {:?} for asset_location: {:?} and target_location: {:?}!", + "IsAllowedReserveBasedAssetTransferForConcreteAsset `asset_filter.matches` has error: {:?} for asset_location: {:?} and target_location: {:?}!", e, asset_location, target_location ); + false }, } }, - Ok(_) => (), + Ok(_) => false, Err(e) => { log::warn!( target: LOG_TARGET, - "ConfiguredBridgeTransferKindResolver allowed_target_location_for has error: {:?} for target_location: {:?}!", + "IsAllowedReserveBasedAssetTransferForConcreteAsset allowed_target_location_for has error: {:?} for target_location: {:?}!", e, target_location ); + false }, } + } else { + log::warn!( + target: LOG_TARGET, + "IsAllowedReserveBasedAssetTransferForConcreteAsset missing configuration for target_consensus: {:?} of target_location: {:?}!", + target_consensus, target_location + ); + false } }, Err(_) => { log::warn!( target: LOG_TARGET, - "ConfiguredBridgeTransferKindResolver target_location: {:?} does not contain global consensus!", + "IsAllowedReserveBasedAssetTransferForConcreteAsset target_location: {:?} does not contain global consensus!", target_location ); + false }, } + } +} + +/// Implementation of `ResolveTransferKind` which tries to resolve all kinds of transfer. +pub struct ConcreteAssetTransferKindResolver< + IsReserveLocationForAsset, + IsAllowedReserveBasedTransferForAsset, +>(sp_std::marker::PhantomData<(IsReserveLocationForAsset, IsAllowedReserveBasedTransferForAsset)>); + +impl< + IsReserveLocationForAsset: ContainsPair, + IsAllowedReserveBasedTransferForAsset: ContainsPair, + > ResolveAssetTransferKind + for ConcreteAssetTransferKindResolver< + IsReserveLocationForAsset, + IsAllowedReserveBasedTransferForAsset, + > +{ + fn resolve(asset: &MultiAsset, target_location: &MultiLocation) -> AssetTransferKind { + log::trace!( + target: LOG_TARGET, + "ConcreteAssetTransferKindResolver resolve asset: {:?}, target_location: {:?}", + asset, target_location + ); + + // accepts only Concrete + match &asset.id { + Concrete(_) => (), + _ => return AssetTransferKind::Unsupported, + }; + + // first, we check, if we are trying to transfer back reserve-deposited assets + // other words: if target_location is a known reserve location for asset + if IsReserveLocationForAsset::contains(asset, target_location) { + return AssetTransferKind::WithdrawReserve + } + + // second, we check, if target_location is allowed for requested asset to be transferred there + if IsAllowedReserveBasedTransferForAsset::contains(asset, target_location) { + return AssetTransferKind::ReserveBased + } AssetTransferKind::Unsupported } diff --git a/parachains/pallets/bridge-transfer/src/impls.rs b/parachains/pallets/bridge-transfer/src/impls.rs index 728a6ec42c6..83fdc3ea685 100644 --- a/parachains/pallets/bridge-transfer/src/impls.rs +++ b/parachains/pallets/bridge-transfer/src/impls.rs @@ -14,7 +14,7 @@ // limitations under the License. use crate::{ - pallet::AllowedExporters, AssetFilterOf, AssetTransferKind, Config, Error, Event, Pallet, + pallet::AllowedExporters, AssetTransferKind, Config, Error, Event, Pallet, ReachableDestination, ResolveAssetTransferKind, UsingVersioned, LOG_TARGET, }; use frame_support::{pallet_prelude::Get, transactional}; @@ -30,7 +30,7 @@ impl Pallet { /// Returns: correct remote location, where we should be able to bridge pub(crate) fn ensure_reachable_remote_destination( remote_destination: VersionedMultiLocation, - ) -> Result>, Error> { + ) -> Result> { let remote_destination: MultiLocation = remote_destination .to_versioned() .map_err(|_| Error::::UnsupportedXcmVersion)?; @@ -42,13 +42,11 @@ impl Pallet { match AllowedExporters::::get(remote_network) { Some(bridge_config) => { match bridge_config.allowed_target_location_for(&remote_destination) { - Ok(Some((target_location, target_location_asset_filter))) => - Ok(ReachableDestination { - bridge: bridge_config.to_bridge_location()?, - target: target_location, - target_asset_filter: target_location_asset_filter, - target_destination: remote_destination, - }), + Ok(Some((target_location, _))) => Ok(ReachableDestination { + bridge: bridge_config.to_bridge_location()?, + target: target_location, + target_destination: remote_destination, + }), Ok(None) => Err(Error::::UnsupportedDestination), Err(_) => Err(Error::::UnsupportedXcmVersion), } @@ -57,10 +55,11 @@ impl Pallet { } } + /// Tries to initiate transfer assets over bridge. #[transactional] - pub(crate) fn do_transfer_asset_via_bridge_in_transaction( + pub(crate) fn initiate_transfer_asset_via_bridge_in_transaction( origin_location: MultiLocation, - destination: ReachableDestination>, + destination: ReachableDestination, assets: MultiAssets, ) -> Result<(), DispatchError> { // Resolve reserve account @@ -224,6 +223,7 @@ impl Pallet { .map_err(Into::into) } + /// Tries to send xcm message over bridge fn initiate_bridge_transfer( dest: MultiLocation, message_id: XcmHash, @@ -262,9 +262,7 @@ impl Pallet { } /// Resolve (sovereign) account which will be used as reserve account - fn resolve_reserve_account( - destination: &ReachableDestination>, - ) -> MultiLocation { + fn resolve_reserve_account(destination: &ReachableDestination) -> MultiLocation { destination.target.location } } diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 5f289e9f3dd..f6cfb824481 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -176,7 +176,7 @@ pub mod pallet { /// How to withdraw and deposit an asset for reserve. /// (Config for transfer out) type AssetTransactor: TransactAsset; - /// Transfer type resolver for `asset` to `target_location`. + /// Transfer kind resolver for `asset` to `target_location`. type AssetTransferKindResolver: ResolveAssetTransferKind; /// XCM sender which sends messages to the BridgeHub /// (Config for transfer out) @@ -308,7 +308,11 @@ pub mod pallet { ); // Do this in transaction (explicitly), the rollback should occur in case of any error and no assets will be trapped or lost - Self::do_transfer_asset_via_bridge_in_transaction(origin_location, destination, assets) + Self::initiate_transfer_asset_via_bridge_in_transaction( + origin_location, + destination, + assets, + ) } /// Adds new bridge exporter, which allows transfer to this `bridged_network`. diff --git a/parachains/pallets/bridge-transfer/src/tests.rs b/parachains/pallets/bridge-transfer/src/tests.rs index 242111596ce..2ceea49230d 100644 --- a/parachains/pallets/bridge-transfer/src/tests.rs +++ b/parachains/pallets/bridge-transfer/src/tests.rs @@ -18,7 +18,8 @@ use frame_support::traits::{AsEnsureOriginWithArg, ConstU32, Contains, ContainsP use crate::{ features::{ - AllowedUniversalAliasesOf, ConfiguredConcreteAssetTransferKindResolver, + AllowedUniversalAliasesOf, ConcreteAssetTransferKindResolver, + IsAllowedReserveBasedAssetTransferForConcreteAsset, IsTrustedBridgedReserveForConcreteAsset, }, filter::{AssetFilter, MultiLocationFilter}, @@ -282,7 +283,10 @@ impl Config for TestRuntime { type ReserveLocationsLimit = ConstU32<2>; type AssetsPerReserveLocationLimit = ConstU32<2>; type AssetTransactor = CurrencyTransactor; - type AssetTransferKindResolver = ConfiguredConcreteAssetTransferKindResolver; + type AssetTransferKindResolver = ConcreteAssetTransferKindResolver< + IsTrustedBridgedReserveForConcreteAsset, + IsAllowedReserveBasedAssetTransferForConcreteAsset, + >; type BridgeXcmSender = TestBridgeXcmSender; type AssetTransferOrigin = EnsureXcmOrigin; type MaxAssetsLimit = MaxAssetsLimit; @@ -393,7 +397,6 @@ fn test_ensure_reachable_remote_destination() { ), maybe_fee: Some(target_location_fee), }, - target_asset_filter: None, target_destination: MultiLocation::new( 2, X3( @@ -820,6 +823,11 @@ fn allowed_reserve_locations_management_works() { let asset_filter_for_other = AssetFilter::ByMultiLocation(asset_filter_for_other_by_multilocation.clone()); + type AssetTransferKindResolver = ConcreteAssetTransferKindResolver< + IsTrustedBridgedReserveForConcreteAsset, + (), + >; + // should fail - just root is allowed assert_noop!( BridgeTransfer::add_reserve_location( @@ -838,11 +846,11 @@ fn allowed_reserve_locations_management_works() { &asset, &location2 )); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location1), + AssetTransferKindResolver::resolve(&asset, &location1), AssetTransferKind::Unsupported ); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKindResolver::resolve(&asset, &location2), AssetTransferKind::Unsupported ); @@ -865,11 +873,11 @@ fn allowed_reserve_locations_management_works() { &asset, &location2 )); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location1), + AssetTransferKindResolver::resolve(&asset, &location1), AssetTransferKind::WithdrawReserve ); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKindResolver::resolve(&asset, &location2), AssetTransferKind::Unsupported ); @@ -882,7 +890,7 @@ fn allowed_reserve_locations_management_works() { &asset, &location2 )); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKindResolver::resolve(&asset, &location2), AssetTransferKind::WithdrawReserve ); @@ -913,11 +921,11 @@ fn allowed_reserve_locations_management_works() { &asset, &location2 )); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location1), + AssetTransferKindResolver::resolve(&asset, &location1), AssetTransferKind::Unsupported ); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKindResolver::resolve(&asset, &location2), AssetTransferKind::WithdrawReserve ); @@ -933,11 +941,11 @@ fn allowed_reserve_locations_management_works() { &asset, &location2 )); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location1), + AssetTransferKindResolver::resolve(&asset, &location1), AssetTransferKind::Unsupported ); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKindResolver::resolve(&asset, &location2), AssetTransferKind::WithdrawReserve ); @@ -953,11 +961,11 @@ fn allowed_reserve_locations_management_works() { &asset, &location2 )); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location1), + AssetTransferKindResolver::resolve(&asset, &location1), AssetTransferKind::Unsupported ); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve(&asset, &location2), + AssetTransferKindResolver::resolve(&asset, &location2), AssetTransferKind::Unsupported ); }) @@ -973,6 +981,11 @@ fn allowed_bridged_target_location_management_works() { let target_location: MultiLocation = MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + type AssetTransferKindResolver = ConcreteAssetTransferKindResolver< + (), + IsAllowedReserveBasedAssetTransferForConcreteAsset, + >; + // should fail - we need BridgeConfig first assert_noop!( BridgeTransfer::allow_reserve_asset_transfer_for( @@ -1022,10 +1035,7 @@ fn allowed_bridged_target_location_management_works() { let asset1_location = MultiLocation::new(2, X2(Parachain(1235), Parachain(5678))); let asset1 = MultiAsset::from((asset1_location, 1000)); assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset1, - &target_location - ), + AssetTransferKindResolver::resolve(&asset1, &target_location), AssetTransferKind::Unsupported ); @@ -1046,10 +1056,7 @@ fn allowed_bridged_target_location_management_works() { // not allowed yet assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset1, - &target_location - ), + AssetTransferKindResolver::resolve(&asset1, &target_location), AssetTransferKind::Unsupported ); @@ -1070,10 +1077,7 @@ fn allowed_bridged_target_location_management_works() { // ok assert_eq!( - ConfiguredConcreteAssetTransferKindResolver::::resolve( - &asset1, - &target_location - ), + AssetTransferKindResolver::resolve(&asset1, &target_location), AssetTransferKind::ReserveBased ); }) diff --git a/parachains/pallets/bridge-transfer/src/types.rs b/parachains/pallets/bridge-transfer/src/types.rs index 634c3789b58..24ae4caf8f9 100644 --- a/parachains/pallets/bridge-transfer/src/types.rs +++ b/parachains/pallets/bridge-transfer/src/types.rs @@ -54,13 +54,11 @@ pub struct MaybePaidLocation { } #[cfg_attr(feature = "std", derive(Debug, PartialEq))] -pub struct ReachableDestination { +pub struct ReachableDestination { /// Bridge location pub bridge: MaybePaidLocation, /// Target location (e.g. remote parachain in different consensus) pub target: MaybePaidLocation, - /// Optional asset filter, which we can send to target location - pub target_asset_filter: Option, /// Destination on target location (e.g. account on remote parachain in different consensus) pub target_destination: MultiLocation, } diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs index 323b8628fe6..6f296e30bdd 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs @@ -712,7 +712,12 @@ impl pallet_bridge_transfer::Config for Runtime { type AssetsPerReserveLocationLimit = ConstU32<128>; type AssetTransactor = AssetTransactors; type AssetTransferKindResolver = - pallet_bridge_transfer::features::ConfiguredConcreteAssetTransferKindResolver; + pallet_bridge_transfer::features::ConcreteAssetTransferKindResolver< + pallet_bridge_transfer::features::IsTrustedBridgedReserveForConcreteAsset, + pallet_bridge_transfer::features::IsAllowedReserveBasedAssetTransferForConcreteAsset< + Runtime, + >, + >; type BridgeXcmSender = BridgeXcmSender; type AssetTransferOrigin = EnsureXcmOrigin; type MaxAssetsLimit = ConstU8<1>; diff --git a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 1008f56b7fb..e041fdf09a4 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -710,7 +710,12 @@ impl pallet_bridge_transfer::Config for Runtime { type AssetsPerReserveLocationLimit = ConstU32<128>; type AssetTransactor = AssetTransactors; type AssetTransferKindResolver = - pallet_bridge_transfer::features::ConfiguredConcreteAssetTransferKindResolver; + pallet_bridge_transfer::features::ConcreteAssetTransferKindResolver< + pallet_bridge_transfer::features::IsTrustedBridgedReserveForConcreteAsset, + pallet_bridge_transfer::features::IsAllowedReserveBasedAssetTransferForConcreteAsset< + Runtime, + >, + >; type BridgeXcmSender = BridgeXcmSender; type AssetTransferOrigin = EnsureXcmOrigin; type MaxAssetsLimit = ConstU8<1>; From 766da340564cdcb93e6ba1636e92e400e39a172b Mon Sep 17 00:00:00 2001 From: Robert La Ferla Date: Thu, 8 Jun 2023 18:25:28 -0400 Subject: [PATCH 290/339] Fix max > T::MaxCandidates benchmark warning (#2716) --- pallets/collator-selection/src/benchmarking.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/collator-selection/src/benchmarking.rs b/pallets/collator-selection/src/benchmarking.rs index 63c9561e7dd..2e363fd6042 100644 --- a/pallets/collator-selection/src/benchmarking.rs +++ b/pallets/collator-selection/src/benchmarking.rs @@ -168,7 +168,7 @@ benchmarks! { } set_desired_candidates { - let max: u32 = 999; + let max: u32 = T::MaxCandidates::get(); let origin = T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; }: { From 2e7d6f97f3d0c35b49b7e3f36919044a785a7e17 Mon Sep 17 00:00:00 2001 From: eskimor Date: Fri, 9 Jun 2023 10:57:40 +0200 Subject: [PATCH 291/339] Version independent import. (#2708) Co-authored-by: eskimor --- bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs b/bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs index 4c9f9e20468..78a98a42a66 100644 --- a/bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs +++ b/bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs @@ -53,7 +53,7 @@ pub const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); /// This is a copy-paste from the cumulus repo's `parachains-common` crate. const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(constants::WEIGHT_REF_TIME_PER_SECOND, 0) .saturating_div(2) - .set_proof_size(polkadot_primitives::v4::MAX_POV_SIZE as u64); + .set_proof_size(polkadot_primitives::MAX_POV_SIZE as u64); /// All cumulus bridge hubs assume that about 5 percent of the block weight is consumed by /// `on_initialize` handlers. This is used to limit the maximal weight of a single extrinsic. From 760d7d401c1863d34817e45cbf7783315897a995 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Jun 2023 09:42:04 +0000 Subject: [PATCH 292/339] Bump ruby/setup-ruby from 1.150.0 to 1.151.0 (#2717) Bumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.150.0 to 1.151.0. - [Release notes](https://github.com/ruby/setup-ruby/releases) - [Commits](https://github.com/ruby/setup-ruby/compare/8a45918450651f5e4784b6031db26f4b9f76b251...bc1dd263b68cb5626dbb55d5c89777d79372c484) --- updated-dependencies: - dependency-name: ruby/setup-ruby dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release-30_create-draft.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index 8f62e712ee3..2080a052da5 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -126,7 +126,7 @@ jobs: path: cumulus ref: ${{ github.event.inputs.ref2 }} - - uses: ruby/setup-ruby@8a45918450651f5e4784b6031db26f4b9f76b251 # v1.150.0 + - uses: ruby/setup-ruby@bc1dd263b68cb5626dbb55d5c89777d79372c484 # v1.151.0 with: ruby-version: 3.0.0 @@ -253,7 +253,7 @@ jobs: - name: Download artifacts uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 - - uses: ruby/setup-ruby@8a45918450651f5e4784b6031db26f4b9f76b251 # v1.150.0 + - uses: ruby/setup-ruby@bc1dd263b68cb5626dbb55d5c89777d79372c484 # v1.151.0 with: ruby-version: 3.0.0 From dab13cfd32d0c0e013456eec69f439cda6d90c35 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Jun 2023 09:43:06 +0000 Subject: [PATCH 293/339] Bump docker/login-action from 2.1.0 to 2.2.0 (#2705) Bumps [docker/login-action](https://github.com/docker/login-action) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/f4ef78c080cd8ba55a85445d5b36e214a81df20a...465a07811f14bebb1938fbed4728c6a1ff8901fc) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release-50_docker-manual.yml | 2 +- .github/workflows/release-50_docker.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-50_docker-manual.yml b/.github/workflows/release-50_docker-manual.yml index b4b2964cbe9..10eaf07dad3 100644 --- a/.github/workflows/release-50_docker-manual.yml +++ b/.github/workflows/release-50_docker-manual.yml @@ -91,7 +91,7 @@ jobs: ./docker/scripts/build-injected-image.sh - name: Login to Dockerhub - uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a # v2.1.0 + uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} diff --git a/.github/workflows/release-50_docker.yml b/.github/workflows/release-50_docker.yml index a2051071ffe..42d17477160 100644 --- a/.github/workflows/release-50_docker.yml +++ b/.github/workflows/release-50_docker.yml @@ -90,7 +90,7 @@ jobs: ./docker/scripts/build-injected-image.sh - name: Login to Dockerhub - uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a # v2.1.0 + uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} From ad07ea6d1df728db7b02b1fbeb2f7b8f858d72c3 Mon Sep 17 00:00:00 2001 From: Squirrel Date: Fri, 9 Jun 2023 11:36:59 +0100 Subject: [PATCH 294/339] tweak to integration tests (#2713) * ump.ExecutedUpward -> messageQueue.Processed * update lock file because * use one line format --- .../e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml | 9 +-------- .../e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml | 9 +-------- .../collectives-polkadot/0_xcm/1_teleport.yml | 9 +-------- 3 files changed, 3 insertions(+), 24 deletions(-) diff --git a/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml index 70340758685..9b885cb33e9 100644 --- a/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml +++ b/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml @@ -100,14 +100,7 @@ tests: - name: messageQueue.Processed chain: *relay_chain threshold: *weight_threshold - result: - origin: - Ump: - Para: '1,000' - weightUsed: - refTime: '298,716,000' - proofSize: '0' - success: true + result: { origin: { Ump: { Para: '1,000' } }, weightUsed: { refTime: '298,716,000', proofSize: '0' }, success: true } - queries: balance_ap_sender_after: chain: *assets_parachain diff --git a/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml index bdf6d49ea7a..2e38756aeef 100644 --- a/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml +++ b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml @@ -101,14 +101,7 @@ tests: - name: messageQueue.Processed chain: *relay_chain threshold: *weight_threshold - result: - origin: - Ump: - Para: '1,000' - weightUsed: - refTime: '4,000,000,000' - proofSize: '0' - success: true + result: { origin: { Ump: { Para: '1,000' } }, weightUsed: { refTime: '4,000,000,000', proofSize: '0' }, success: true } - queries: balance_ap_sender_after: chain: *assets_parachain diff --git a/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml b/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml index 1d667caed5f..1171aa50da5 100644 --- a/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml +++ b/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml @@ -133,14 +133,7 @@ tests: - name: messageQueue.Processed chain: *relay_chain threshold: *weight_threshold - result: - origin: - Ump: - Para: '1,001' - weightUsed: - refTime: '4,000,000,000' - proofSize: '0' - success: true + result: { origin: { Ump: { Para: '1,001' } }, weightUsed: { refTime: '4,000,000,000', proofSize: '0' }, success: true } - queries: balance_rc_alice_3: chain: *relay_chain From dfea54fc82fc83118c9bfbae56e31f13584b4b55 Mon Sep 17 00:00:00 2001 From: Juan Date: Fri, 9 Jun 2023 13:46:10 +0200 Subject: [PATCH 295/339] Add Migrations to contracts config (#2701) * add Migrations to contracts config * update lockfile for {"substrate", "polkadot"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 524 +++++++++--------- .../contracts-rococo/src/contracts.rs | 1 + 2 files changed, 263 insertions(+), 262 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9028242c026..5cb6e5cbc1d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -865,7 +865,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "hash-db", "log", @@ -4151,7 +4151,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", ] @@ -4174,7 +4174,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-support-procedural", @@ -4199,7 +4199,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -4246,7 +4246,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4257,7 +4257,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -4274,7 +4274,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-system", @@ -4303,7 +4303,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-recursion", "futures", @@ -4324,7 +4324,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "bitflags", "environmental", @@ -4359,7 +4359,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "Inflector", "cfg-expr", @@ -4376,7 +4376,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4388,7 +4388,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "proc-macro2", "quote", @@ -4398,7 +4398,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "cfg-if", "frame-support", @@ -4417,7 +4417,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -4432,7 +4432,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "sp-api", @@ -4441,7 +4441,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "parity-scale-codec", @@ -5533,7 +5533,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bitvec", "frame-benchmarking", @@ -5632,7 +5632,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "frame-support", "polkadot-primitives", @@ -6561,7 +6561,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "futures", "log", @@ -6580,7 +6580,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "anyhow", "jsonrpsee", @@ -7084,7 +7084,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -7105,7 +7105,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7123,7 +7123,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7138,7 +7138,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-system", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-system", @@ -7170,7 +7170,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-system", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7208,7 +7208,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7228,7 +7228,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7243,7 +7243,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-system", @@ -7262,7 +7262,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -7286,7 +7286,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7392,7 +7392,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7436,7 +7436,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7453,7 +7453,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "bitflags", "environmental", @@ -7483,7 +7483,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "bitflags", "parity-scale-codec", @@ -7496,7 +7496,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "proc-macro2", "quote", @@ -7506,7 +7506,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7523,7 +7523,7 @@ dependencies = [ [[package]] name = "pallet-core-fellowship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7541,7 +7541,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7559,7 +7559,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7582,7 +7582,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7595,7 +7595,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7613,7 +7613,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "docify", "frame-benchmarking", @@ -7632,7 +7632,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "blake2", "frame-benchmarking", @@ -7650,7 +7650,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7673,7 +7673,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7689,7 +7689,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7709,7 +7709,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7726,7 +7726,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-system", @@ -7740,7 +7740,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7757,7 +7757,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7776,7 +7776,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7793,7 +7793,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7809,7 +7809,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7826,7 +7826,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7844,7 +7844,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "pallet-nfts", @@ -7855,7 +7855,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7871,7 +7871,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-system", @@ -7888,7 +7888,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7908,7 +7908,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7919,7 +7919,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-system", @@ -7936,7 +7936,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7975,7 +7975,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -7992,7 +7992,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8007,7 +8007,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8025,7 +8025,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8040,7 +8040,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "assert_matches", "frame-benchmarking", @@ -8059,7 +8059,7 @@ dependencies = [ [[package]] name = "pallet-salary" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8077,7 +8077,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8094,7 +8094,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-system", @@ -8115,7 +8115,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8131,7 +8131,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-system", @@ -8145,7 +8145,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8168,7 +8168,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8179,7 +8179,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "log", "sp-arithmetic", @@ -8188,7 +8188,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "sp-api", @@ -8197,7 +8197,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8214,7 +8214,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8229,7 +8229,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8247,7 +8247,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8266,7 +8266,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-support", "frame-system", @@ -8282,7 +8282,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -8298,7 +8298,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -8310,7 +8310,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8327,7 +8327,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8342,7 +8342,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8358,7 +8358,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8373,7 +8373,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-benchmarking", "frame-support", @@ -8388,7 +8388,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -8409,7 +8409,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "frame-benchmarking", "frame-support", @@ -9020,7 +9020,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "futures", "polkadot-node-jaeger", @@ -9036,7 +9036,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -9050,7 +9050,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "derive_more", "fatality", @@ -9073,7 +9073,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "fatality", "futures", @@ -9094,7 +9094,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "clap", "frame-benchmarking-cli", @@ -9124,7 +9124,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "async-trait", "frame-benchmarking", @@ -9167,7 +9167,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "always-assert", "bitvec", @@ -9189,7 +9189,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "parity-scale-codec", "scale-info", @@ -9201,7 +9201,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "derive_more", "fatality", @@ -9226,7 +9226,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -9240,7 +9240,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "futures", "futures-timer", @@ -9260,7 +9260,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "always-assert", "async-trait", @@ -9283,7 +9283,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "futures", "parity-scale-codec", @@ -9301,7 +9301,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bitvec", "derive_more", @@ -9330,7 +9330,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bitvec", "futures", @@ -9351,7 +9351,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bitvec", "fatality", @@ -9370,7 +9370,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "futures", "polkadot-node-subsystem", @@ -9385,7 +9385,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "async-trait", "futures", @@ -9405,7 +9405,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "futures", "polkadot-node-metrics", @@ -9420,7 +9420,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "futures", "futures-timer", @@ -9437,7 +9437,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "fatality", "futures", @@ -9456,7 +9456,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "async-trait", "futures", @@ -9473,7 +9473,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bitvec", "fatality", @@ -9491,7 +9491,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "always-assert", "futures", @@ -9522,7 +9522,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "futures", "polkadot-node-primitives", @@ -9538,7 +9538,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "cpu-time", "futures", @@ -9561,7 +9561,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-execute-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "cpu-time", "futures", @@ -9581,7 +9581,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-prepare-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "futures", "libc", @@ -9604,7 +9604,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "futures", "lru 0.9.0", @@ -9619,7 +9619,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "lazy_static", "log", @@ -9637,7 +9637,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bs58", "futures", @@ -9656,7 +9656,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "async-channel", "async-trait", @@ -9679,7 +9679,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bounded-vec", "futures", @@ -9701,7 +9701,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9711,7 +9711,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "async-trait", "futures", @@ -9729,7 +9729,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "async-trait", "derive_more", @@ -9752,7 +9752,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "async-trait", "derive_more", @@ -9785,7 +9785,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "async-trait", "futures", @@ -9808,7 +9808,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bounded-collections", "derive_more", @@ -9907,7 +9907,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9925,7 +9925,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9951,7 +9951,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9983,7 +9983,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bitvec", "frame-benchmarking", @@ -10078,7 +10078,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bitvec", "frame-benchmarking", @@ -10124,7 +10124,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "frame-support", "polkadot-primitives", @@ -10138,7 +10138,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bs58", "parity-scale-codec", @@ -10150,7 +10150,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bitflags", "bitvec", @@ -10195,7 +10195,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -10305,7 +10305,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -10326,7 +10326,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -10336,7 +10336,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -10361,7 +10361,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bitvec", "frame-election-provider-support", @@ -10422,7 +10422,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "frame-benchmarking", "frame-system", @@ -11202,7 +11202,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -11289,7 +11289,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "frame-support", "polkadot-primitives", @@ -11536,7 +11536,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "log", "sp-core", @@ -11547,7 +11547,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "futures", @@ -11576,7 +11576,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "futures", "futures-timer", @@ -11599,7 +11599,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11614,7 +11614,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11633,7 +11633,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11644,7 +11644,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11684,7 +11684,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "fnv", "futures", @@ -11711,7 +11711,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "hash-db", "kvdb", @@ -11737,7 +11737,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "futures", @@ -11762,7 +11762,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "futures", @@ -11791,7 +11791,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "fork-tree", @@ -11827,7 +11827,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "futures", "jsonrpsee", @@ -11849,7 +11849,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11885,7 +11885,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "futures", "jsonrpsee", @@ -11904,7 +11904,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11917,7 +11917,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11957,7 +11957,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "finality-grandpa", "futures", @@ -11977,7 +11977,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "futures", @@ -12000,7 +12000,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "lru 0.10.0", "parity-scale-codec", @@ -12022,7 +12022,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -12034,7 +12034,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "anyhow", "cfg-if", @@ -12052,7 +12052,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "ansi_term", "futures", @@ -12068,7 +12068,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -12082,7 +12082,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12128,7 +12128,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-channel", "cid", @@ -12149,7 +12149,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12176,7 +12176,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "ahash 0.8.2", "futures", @@ -12194,7 +12194,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12216,7 +12216,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12250,7 +12250,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12268,7 +12268,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -12298,7 +12298,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -12307,7 +12307,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "futures", "jsonrpsee", @@ -12338,7 +12338,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12357,7 +12357,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "http", "jsonrpsee", @@ -12372,7 +12372,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12398,7 +12398,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "directories", @@ -12464,7 +12464,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "log", "parity-scale-codec", @@ -12475,7 +12475,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "clap", "fs4", @@ -12491,7 +12491,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12510,7 +12510,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "futures", "libc", @@ -12529,7 +12529,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "chrono", "futures", @@ -12548,7 +12548,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "ansi_term", "atty", @@ -12579,7 +12579,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12590,7 +12590,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "futures", @@ -12616,7 +12616,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "futures", @@ -12632,7 +12632,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-channel", "futures", @@ -13113,7 +13113,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "enumn", "parity-scale-codec", @@ -13190,7 +13190,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "hash-db", "log", @@ -13210,7 +13210,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "Inflector", "blake2", @@ -13224,7 +13224,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "scale-info", @@ -13237,7 +13237,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "16.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "integer-sqrt", "num-traits", @@ -13251,7 +13251,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "scale-info", @@ -13264,7 +13264,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "sp-api", @@ -13276,7 +13276,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "futures", "log", @@ -13294,7 +13294,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "futures", @@ -13309,7 +13309,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "parity-scale-codec", @@ -13327,7 +13327,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "parity-scale-codec", @@ -13348,7 +13348,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "lazy_static", "parity-scale-codec", @@ -13367,7 +13367,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "finality-grandpa", "log", @@ -13385,7 +13385,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "scale-info", @@ -13397,7 +13397,7 @@ dependencies = [ [[package]] name = "sp-core" version = "21.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13441,7 +13441,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "blake2b_simd", "byteorder", @@ -13455,7 +13455,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "proc-macro2", "quote", @@ -13466,7 +13466,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13475,7 +13475,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "proc-macro2", "quote", @@ -13485,7 +13485,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.19.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "environmental", "parity-scale-codec", @@ -13496,7 +13496,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13511,7 +13511,7 @@ dependencies = [ [[package]] name = "sp-io" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "bytes", "ed25519", @@ -13537,7 +13537,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "lazy_static", "sp-core", @@ -13548,7 +13548,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.27.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "futures", "parity-scale-codec", @@ -13562,7 +13562,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13571,7 +13571,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13582,7 +13582,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13600,7 +13600,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "scale-info", @@ -13614,7 +13614,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "sp-api", "sp-core", @@ -13624,7 +13624,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "backtrace", "lazy_static", @@ -13634,7 +13634,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "rustc-hash", "serde", @@ -13644,7 +13644,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "either", "hash256-std-hasher", @@ -13666,7 +13666,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "17.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13684,7 +13684,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "11.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "Inflector", "proc-macro-crate", @@ -13696,7 +13696,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "scale-info", @@ -13710,7 +13710,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "scale-info", @@ -13723,7 +13723,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.28.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "hash-db", "log", @@ -13743,7 +13743,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "log", "parity-scale-codec", @@ -13761,12 +13761,12 @@ dependencies = [ [[package]] name = "sp-std" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" [[package]] name = "sp-storage" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13779,7 +13779,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "futures-timer", @@ -13794,7 +13794,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "10.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "sp-std", @@ -13806,7 +13806,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "sp-api", "sp-runtime", @@ -13815,7 +13815,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "log", @@ -13831,7 +13831,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13854,7 +13854,7 @@ dependencies = [ [[package]] name = "sp-version" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13871,7 +13871,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13882,7 +13882,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "14.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13895,7 +13895,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "20.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "parity-scale-codec", "scale-info", @@ -14093,7 +14093,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "platforms", ] @@ -14101,7 +14101,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -14120,7 +14120,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "hyper", "log", @@ -14132,7 +14132,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "jsonrpsee", @@ -14145,7 +14145,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "jsonrpsee", "log", @@ -14164,7 +14164,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -14190,7 +14190,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "futures", "substrate-test-utils-derive", @@ -14200,7 +14200,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -14211,7 +14211,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "ansi_term", "build-helper", @@ -14340,7 +14340,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "frame-support", "polkadot-primitives", @@ -14731,7 +14731,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14742,7 +14742,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14872,7 +14872,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#bc4055bb9fdd02ff4a97d33c6aaae3c635225b22" +source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" dependencies = [ "async-trait", "clap", @@ -15787,7 +15787,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bitvec", "frame-benchmarking", @@ -15880,7 +15880,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "frame-support", "polkadot-primitives", @@ -16314,7 +16314,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "bounded-collections", "derivative", @@ -16330,7 +16330,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "frame-support", "frame-system", @@ -16385,7 +16385,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "environmental", "frame-benchmarking", @@ -16405,7 +16405,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#bfb9e87a6d9964a8769c01b2019c30db48f5349d" +source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" dependencies = [ "Inflector", "proc-macro2", diff --git a/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs b/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs index 8577dd64703..b049b450169 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs @@ -48,4 +48,5 @@ impl Config for Runtime { type MaxStorageKeyLen = ConstU32<128>; type UnsafeUnstableInterface = ConstBool; type MaxDebugBufferLen = ConstU32<{ 2 * 1024 * 1024 }>; + type Migrations = (); } From cd1850bff9edeecb0f506e2459203827cc582860 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Jun 2023 14:18:19 +0000 Subject: [PATCH 296/339] Bump serde from 1.0.163 to 1.0.164 (#2719) Bumps [serde](https://github.com/serde-rs/serde) from 1.0.163 to 1.0.164. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.163...v1.0.164) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- client/relay-chain-rpc-interface/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5cb6e5cbc1d..0868dfe9d8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12895,18 +12895,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", diff --git a/client/relay-chain-rpc-interface/Cargo.toml b/client/relay-chain-rpc-interface/Cargo.toml index 4c4ab9a3023..91294b3971a 100644 --- a/client/relay-chain-rpc-interface/Cargo.toml +++ b/client/relay-chain-rpc-interface/Cargo.toml @@ -31,5 +31,5 @@ tracing = "0.1.37" async-trait = "0.1.68" url = "2.4.0" serde_json = "1.0.96" -serde = "1.0.163" +serde = "1.0.164" lru = "0.9.0" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index 4e257b9cb71..2a2d30df419 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -13,7 +13,7 @@ build = "build.rs" clap = { version = "4.3.2", features = ["derive"] } log = "0.4.18" codec = { package = "parity-scale-codec", version = "3.0.0" } -serde = { version = "1.0.163", features = ["derive"] } +serde = { version = "1.0.164", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } # Local diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index 1b4f467afba..5b8b62deb53 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.163", optional = true, features = ["derive"] } +serde = { version = "1.0.164", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 643d15b2c64..b3de67f82df 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.163", optional = true, features = ["derive"] } +serde = { version = "1.0.164", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index cf848a316aa..7ae7ed8c9c9 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -13,7 +13,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.18", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.163", optional = true, features = ["derive"] } +serde = { version = "1.0.164", optional = true, features = ["derive"] } smallvec = "1.8.1" # Substrate diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 3c23c58273d..648573daa12 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -17,7 +17,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" log = "0.4.18" -serde = { version = "1.0.163", features = ["derive"] } +serde = { version = "1.0.164", features = ["derive"] } serde_json = "1.0.96" # Local diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index f20f008cc6f..e4feab90292 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -15,7 +15,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" -serde = { version = "1.0.163", features = ["derive"] } +serde = { version = "1.0.164", features = ["derive"] } tokio = { version = "1.28.2", features = ["macros"] } tracing = "0.1.37" url = "2.4.0" From e6c4ec1e0eded5bb224a3a5d91f5a4b6a0afa340 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 9 Jun 2023 16:42:06 +0200 Subject: [PATCH 297/339] Reworked benchmarks --- .../bridge-transfer/src/benchmarking.rs | 250 +++++++++++++----- .../pallets/bridge-transfer/src/features.rs | 40 +-- parachains/pallets/bridge-transfer/src/lib.rs | 35 ++- .../pallets/bridge-transfer/src/tests.rs | 16 +- .../pallets/bridge-transfer/src/types.rs | 27 +- .../assets/asset-hub-kusama/src/lib.rs | 1 + .../assets/asset-hub-kusama/src/xcm_config.rs | 59 ++--- .../assets/asset-hub-westend/src/lib.rs | 1 + .../asset-hub-westend/src/xcm_config.rs | 59 ++--- .../test-utils/src/test_cases_over_bridge.rs | 10 +- 10 files changed, 300 insertions(+), 198 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index 689e9fe3bc9..e9573edd01a 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -18,14 +18,18 @@ //! `BridgeTransfer` pallet benchmarks. use crate::{ + types::{ + filter::MultiLocationFilter, AssetFilterOf, BridgeConfig, LatestVersionedMultiLocation, + }, AllowedExporters, AllowedReserveLocations, AllowedUniversalAliases, BenchmarkHelper, Call, - Config, Event, Pallet, PingMessageBuilder, + Config, Event, Pallet, }; use frame_benchmarking::{benchmarks, BenchmarkError}; use frame_support::{ - ensure, - traits::{EnsureOrigin, Get}, + assert_ok, ensure, + traits::{EnsureOrigin, EnsureOriginWithArg, Get}, + BoundedVec, }; use sp_std::prelude::*; use xcm::prelude::*; @@ -35,8 +39,10 @@ impl Pallet { #[cfg(feature = "runtime-benchmarks")] pub fn insert_universal_alias_for_benchmarks((location, junction): (MultiLocation, Junction)) { assert!(matches!( - AllowedUniversalAliases::::try_mutate(location, |junctions| junctions - .try_insert(junction)), + AllowedUniversalAliases::::try_mutate( + LatestVersionedMultiLocation(&location), + |junctions| junctions.try_insert(junction) + ), Ok(true) )); } @@ -44,13 +50,31 @@ impl Pallet { benchmarks! { transfer_asset_via_bridge { - let _ = T::TransferAssetOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let _ = T::AssetTransferOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; // every asset has its own configuration and ledger, so there's a performance dependency // (be sure to use "worst" of assets) let max_assets_limit = T::MaxAssetsLimit::get(); ensure!(max_assets_limit > 0, "MaxAssetsLimit not set up correctly."); - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; + + let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() + .ok_or(BenchmarkError::Stop("missing `bridge_location` data"))?; + let mut bridge_config = BridgeConfig::new( + maybe_paid_bridge.location.into_versioned(), + maybe_paid_bridge.maybe_fee.map(|fee| fee.into()) + ); + + let allowed_bridged_target_location = T::BenchmarkHelper::allowed_bridged_target_location() + .ok_or(BenchmarkError::Stop("missing `allowed_bridged_target_location` data"))?; + assert_ok!(bridge_config.update_allowed_target_location( + allowed_bridged_target_location.location.into_versioned(), + allowed_bridged_target_location.maybe_fee.map(|fee| VersionedMultiAsset::V3(fee)) + )); + assert_ok!(bridge_config.add_allowed_target_location_filter_for( + allowed_bridged_target_location.location.into_versioned(), + AssetFilterOf::::All, + )); + AllowedExporters::::insert(bridged_network, bridge_config); + let (origin, assets, destination) = T::BenchmarkHelper::prepare_asset_transfer() .ok_or(BenchmarkError::Stop("missing `prepare_asset_transfer` data"))?; let assets_count = match &assets { @@ -58,38 +82,8 @@ benchmarks! { VersionedMultiAssets::V3(assets) => assets.len(), }; ensure!(assets_count == max_assets_limit as usize, "`assets` not set up correctly for worst case."); - AllowedExporters::::insert(bridged_network, bridge_config); - }: _(origin, Box::new(assets), Box::new(destination)) - verify { - // we don't care about message hash or sender cost here, just check that the transfer has been initiated - let actual_event = frame_system::Pallet::::events().pop().map(|r| r.event); - let expected_event: ::RuntimeEvent = Event::TransferInitiated { - message_id: Default::default(), - forwarded_message_id: Default::default(), - sender_cost: Default::default(), - }.into(); - assert!(matches!(actual_event, Some(expected_event))); - } - - ping_via_bridge { - let _ = T::TransferPingOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - AllowedExporters::::insert(bridged_network, bridge_config); - let (origin, destination) = T::BenchmarkHelper::prepare_ping_transfer() - .ok_or(BenchmarkError::Stop("missing `prepare_ping_transfer` data"))?; - - let origin_location = T::TransferPingOrigin::ensure_origin(origin.clone()).map_err(|_| BenchmarkError::Stop("invalid `origin`"), - )?; - let (_, _, destination_location) = Pallet::::ensure_remote_destination(destination.clone()).map_err(|_| - BenchmarkError::Stop("invalid `destination_location`"), - )?; - let _ = T::PingMessageBuilder::try_build(&origin_location, &bridged_network, &destination_location).ok_or( - BenchmarkError::Stop("invalid `PingMessageBuilder`"), - )?; - }: _(origin, Box::new(destination)) + }: _(origin, Box::new(assets), Box::new(destination)) verify { // we don't care about message hash or sender cost here, just check that the transfer has been initiated let actual_event = frame_system::Pallet::::events().pop().map(|r| r.event); @@ -103,18 +97,32 @@ benchmarks! { add_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config() + let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - }: _(origin, bridged_network, Box::new(bridge_config.clone())) + }: _( + origin, + bridged_network, + Box::new(maybe_paid_bridge.location.clone().into_versioned()), + maybe_paid_bridge.maybe_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) + ) verify { - assert_eq!(AllowedExporters::::get(bridged_network), Some(bridge_config)); + assert_eq!( + AllowedExporters::::get(bridged_network).unwrap().to_bridge_location().expect("stored config"), + maybe_paid_bridge + ); } remove_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config() + let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - AllowedExporters::::insert(bridged_network, bridge_config); + AllowedExporters::::insert( + bridged_network, + BridgeConfig::new( + maybe_paid_bridge.location.into_versioned(), + maybe_paid_bridge.maybe_fee.map(|fee| VersionedMultiAsset::V3(fee)) + ) + ); }: _(origin, bridged_network) verify { assert_eq!(AllowedExporters::::get(bridged_network), None); @@ -122,20 +130,102 @@ benchmarks! { update_exporter_config { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, bridge_config) = T::BenchmarkHelper::bridge_config() + let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - AllowedExporters::::insert(bridged_network, bridge_config); + AllowedExporters::::insert( + bridged_network, + BridgeConfig::new( + maybe_paid_bridge.location.into_versioned(), + None + ) + ); - let bridge_location_fee = None; - let target_location_fee = Some(xcm::VersionedMultiAsset::V3(MultiAsset { + let new_bridge_location_fee = Some(MultiAsset { id: Concrete(MultiLocation::parent()), fun: Fungible(1_000_0000), - })); - }: _(origin, bridged_network, bridge_location_fee.clone().map(Box::new), target_location_fee.clone().map(Box::new)) + }); + }: _( + origin, + bridged_network, + new_bridge_location_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) + ) + verify { + assert_eq!( + AllowedExporters::::get(bridged_network).unwrap().to_bridge_location().expect("stored config").maybe_fee, + new_bridge_location_fee + ); + } + + update_bridged_target_location { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + if T::TargetLocationsPerExporterLimit::get() <= 0 { + return Err(BenchmarkError::Weightless); + } + let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; + let allowed_bridged_target_location = T::BenchmarkHelper::allowed_bridged_target_location() + .ok_or(BenchmarkError::Stop("missing `allowed_bridged_target_location` data"))?; + AllowedExporters::::insert( + bridged_network, + BridgeConfig::new( + maybe_paid_bridge.location.into_versioned(), + None + ) + ); + let new_target_location_fee = Some(MultiAsset { + id: Concrete(MultiLocation::parent()), + fun: Fungible(1_000_0000), + }); + }: _( + origin, + bridged_network, + Box::new(allowed_bridged_target_location.location.clone().into_versioned()), + new_target_location_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) + ) + verify { + let bridge_config = AllowedExporters::::get(bridged_network).unwrap(); + assert!( + bridge_config.allowed_target_location_for(&allowed_bridged_target_location.location).expect("stored target_location").is_some() + ); + } + + allow_reserve_asset_transfer_for { + let asset_filter = AssetFilterOf::::All; + + let origin = T::AllowReserveAssetTransferOrigin::try_successful_origin(&asset_filter).map_err(|_| BenchmarkError::Weightless)?; + if T::TargetLocationsPerExporterLimit::get() <= 0 { + return Err(BenchmarkError::Weightless); + } + + let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; + let allowed_bridged_target_location = T::BenchmarkHelper::allowed_bridged_target_location() + .ok_or(BenchmarkError::Stop("missing `allowed_bridged_target_location` data"))?; + let mut bridge_config = BridgeConfig::new( + maybe_paid_bridge.location.into_versioned(), + None + ); + assert_ok!(bridge_config.update_allowed_target_location( + allowed_bridged_target_location.location.into_versioned(), + allowed_bridged_target_location.maybe_fee.map(|fee| VersionedMultiAsset::V3(fee)) + )); + AllowedExporters::::insert(bridged_network, bridge_config); + + }: _( + origin, + bridged_network, + Box::new(allowed_bridged_target_location.location.clone().into_versioned()), + asset_filter.clone() + ) verify { - let exporter = AllowedExporters::::get(bridged_network).unwrap(); - assert_eq!(exporter.bridge_location_fee, bridge_location_fee.map(|fee| MultiAsset::try_from(fee).unwrap())); - assert_eq!(exporter.max_target_location_fee, target_location_fee.map(|fee| MultiAsset::try_from(fee).unwrap())); + let bridge_config = AllowedExporters::::get(bridged_network).unwrap(); + let allowed_target_location = bridge_config.allowed_target_location_for( + &allowed_bridged_target_location.location + ).expect("stored target_location").unwrap(); + assert_eq!( + allowed_target_location.1, + Some(asset_filter) + ); } add_universal_alias { @@ -149,7 +239,9 @@ benchmarks! { }; }: _(origin, Box::new(location.clone()), junction) verify { - assert!(AllowedUniversalAliases::::get(&location.try_as().unwrap()).contains(&junction)); + assert!( + AllowedUniversalAliases::::get(LatestVersionedMultiLocation::try_from(&location).expect("ok")).contains(&junction) + ); } remove_universal_alias { @@ -164,37 +256,53 @@ benchmarks! { Pallet::::insert_universal_alias_for_benchmarks((location.clone().try_into().unwrap(), junction)); }: _(origin, Box::new(location.clone()), vec![junction.clone()]) verify { - assert!(!AllowedUniversalAliases::::get(&location.try_as().unwrap()).contains(&junction)); + assert!(!AllowedUniversalAliases::::get(LatestVersionedMultiLocation::try_from(&location).expect("ok")).contains(&junction)); } add_reserve_location { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let location = match T::BenchmarkHelper::reserve_location() { - Some(location) => location, - None => match T::ReserveAssetLocationsLimit::get() > 0_u32 { - true => return Err(BenchmarkError::Stop("missing `reserve_location` data")), - false => return Err(BenchmarkError::Weightless), + let reserve_location = if T::ReserveLocationsLimit::get() > 0_u32 { + match T::BenchmarkHelper::reserve_location() { + Some(location) => location, + None => return Err(BenchmarkError::Stop("missing `reserve_location` data")), } + } else { + return Err(BenchmarkError::Weightless); }; - }: _(origin, Box::new(location.clone())) + let asset_filter: AssetFilterOf = if T::AssetsPerReserveLocationLimit::get() > 0_u32 { + let assets = (0..T::AssetsPerReserveLocationLimit::get()) + .map(|i| MultiLocation::new(1, X1(Parachain(i))).into_versioned()) + .collect::>(); + MultiLocationFilter { + equals_any: BoundedVec::truncate_from(assets), + starts_with_any: Default::default(), + }.into() + } else { + return Err(BenchmarkError::Weightless); + }; + }: _(origin, Box::new(reserve_location.clone()), asset_filter.clone()) verify { - assert!(AllowedReserveLocations::::get().contains(&location.try_as().unwrap())); + assert_eq!( + AllowedReserveLocations::::get(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok")), + Some(asset_filter) + ); } remove_reserve_location { let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let location = match T::BenchmarkHelper::reserve_location() { - Some(location) => location, - None => match T::ReserveAssetLocationsLimit::get() > 0_u32 { - true => return Err(BenchmarkError::Stop("missing `reserve_location` data")), - false => return Err(BenchmarkError::Weightless), + let reserve_location = if T::ReserveLocationsLimit::get() > 0_u32 { + match T::BenchmarkHelper::reserve_location() { + Some(location) => location, + None => return Err(BenchmarkError::Stop("missing `reserve_location` data")), } + } else { + return Err(BenchmarkError::Weightless); }; - let multilocation: MultiLocation = location.clone().try_into().unwrap(); - assert!(AllowedReserveLocations::::try_mutate(|locations| locations.try_insert(multilocation)).unwrap()); - }: _(origin, vec![location.clone()]) + AllowedReserveLocations::::insert(reserve_location.clone(), AssetFilterOf::::All); + assert!(AllowedReserveLocations::::contains_key(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok"))); + }: _(origin, Box::new(reserve_location.clone()), None) verify { - assert!(!AllowedReserveLocations::::get().contains(&location.try_as().unwrap())); + assert!(!AllowedReserveLocations::::contains_key(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok"))); } impl_benchmark_test_suite!(Pallet, crate::tests::new_test_ext(), crate::tests::TestRuntime); diff --git a/parachains/pallets/bridge-transfer/src/features.rs b/parachains/pallets/bridge-transfer/src/features.rs index 76f464836e6..cfea45d7c59 100644 --- a/parachains/pallets/bridge-transfer/src/features.rs +++ b/parachains/pallets/bridge-transfer/src/features.rs @@ -15,8 +15,7 @@ use crate::{ types::{AssetFilterT, LatestVersionedMultiLocation}, - AssetTransferKind, BridgeConfig, Config, Pallet, ResolveAssetTransferKind, UsingVersioned, - LOG_TARGET, + AssetTransferKind, Config, MaybePaidLocation, Pallet, ResolveAssetTransferKind, LOG_TARGET, }; use frame_support::traits::{Contains, ContainsPair}; use xcm::prelude::*; @@ -30,33 +29,16 @@ impl ExporterFor for Pallet { _message: &Xcm<()>, ) -> Option<(MultiLocation, Option)> { match Self::allowed_exporters(network) { - Some(BridgeConfig { bridge_location, bridge_location_fee, .. }) => { - let bridge_location = match bridge_location.to_versioned() { - Ok(versioned) => versioned, - Err(e) => { - log::warn!( - target: LOG_TARGET, - "Exporter for network: {:?} - bridge_location has error: {:?}!", - network, e - ); - return None - }, - }; - let bridge_location_fee = match bridge_location_fee { - Some(fee) => match fee.to_versioned() { - Ok(versioned) => Some(versioned), - Err(e) => { - log::warn!( - target: LOG_TARGET, - "ExporterFor network: {:?} - bridge_location_fee has error: {:?}!", - network, e - ); - return None - }, - }, - None => None, - }; - Some((bridge_location, bridge_location_fee)) + Some(bridge_config) => match bridge_config.to_bridge_location() { + Ok(MaybePaidLocation { location, maybe_fee }) => Some((location, maybe_fee)), + Err(e) => { + log::warn!( + target: LOG_TARGET, + "Exporter for network: {:?} has error: {:?}!", + network, e + ); + None + }, }, None => None, } diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index f6cfb824481..42d2a8335b4 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -108,11 +108,19 @@ pub mod pallet { /// Everything we need to run benchmarks. #[cfg(feature = "runtime-benchmarks")] pub trait BenchmarkHelper { - /// Returns proper bridge configuration, supported by the runtime. + /// Returns proper bridge location+fee for NetworkId, supported by the runtime. /// /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled /// to support transfer to this destination **after** `prepare_asset_transfer` call. - fn bridge_config() -> Option<(NetworkId, BridgeConfig)> { + fn bridge_location() -> Option<(NetworkId, MaybePaidLocation)> { + None + } + + /// Returns proper target_location location+fee supported by the runtime. + /// + /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled + /// to support transfer to this destination **after** `prepare_asset_transfer` call. + fn allowed_bridged_target_location() -> Option { None } @@ -172,6 +180,10 @@ pub mod pallet { /// (Config for transfer in/out) #[pallet::constant] type AssetsPerReserveLocationLimit: Get; + /// Max allowed target locations per exporter (bridged network) + /// (Config for transfer out) + #[pallet::constant] + type TargetLocationsPerExporterLimit: Get; /// How to withdraw and deposit an asset for reserve. /// (Config for transfer out) @@ -349,11 +361,7 @@ pub mod pallet { // insert AllowedExporters::::insert( bridged_network, - BridgeConfig { - bridge_location: *bridge_location, - bridge_location_fee: bridge_location_fee.map(|fee| *fee), - allowed_target_locations: Default::default(), - }, + BridgeConfig::new(*bridge_location, bridge_location_fee.map(|fee| *fee)), ); Self::deposit_event(Event::BridgeAdded); @@ -422,6 +430,10 @@ pub mod pallet { max_target_location_fee: Option>, ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; + ensure!( + T::TargetLocationsPerExporterLimit::get() > 0, + Error::::UnavailableConfiguration + ); AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { let bridge_config = @@ -453,6 +465,10 @@ pub mod pallet { asset_filter: AssetFilterOf, ) -> DispatchResult { let _ = T::AllowReserveAssetTransferOrigin::ensure_origin(origin, &asset_filter)?; + ensure!( + T::TargetLocationsPerExporterLimit::get() > 0, + Error::::UnavailableConfiguration + ); AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { let bridge_config = @@ -541,6 +557,11 @@ pub mod pallet { asset_filter_to_add: AssetFilterOf, ) -> DispatchResult { let _ = T::AdminOrigin::ensure_origin(origin)?; + ensure!(T::ReserveLocationsLimit::get() > 0, Error::::UnavailableConfiguration); + ensure!( + T::AssetsPerReserveLocationLimit::get() > 0, + Error::::UnavailableConfiguration + ); let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) .map_err(|_| Error::::UnsupportedXcmVersion)?; diff --git a/parachains/pallets/bridge-transfer/src/tests.rs b/parachains/pallets/bridge-transfer/src/tests.rs index 2ceea49230d..98940dded73 100644 --- a/parachains/pallets/bridge-transfer/src/tests.rs +++ b/parachains/pallets/bridge-transfer/src/tests.rs @@ -282,6 +282,7 @@ impl Config for TestRuntime { type UniversalAliasesLimit = ConstU32<2>; type ReserveLocationsLimit = ConstU32<2>; type AssetsPerReserveLocationLimit = ConstU32<2>; + type TargetLocationsPerExporterLimit = ConstU32<2>; type AssetTransactor = CurrencyTransactor; type AssetTransferKindResolver = ConcreteAssetTransferKindResolver< IsTrustedBridgedReserveForConcreteAsset, @@ -676,11 +677,7 @@ fn allowed_exporters_management_works() { assert_eq!(AllowedExporters::::iter().count(), 1); assert_eq!( AllowedExporters::::get(bridged_network), - Some(BridgeConfig { - bridge_location: VersionedMultiLocation::from(bridge_location), - bridge_location_fee: None, - allowed_target_locations: Default::default(), - }) + Some(BridgeConfig::new(VersionedMultiLocation::from(bridge_location), None)) ); assert_eq!(AllowedExporters::::get(&RelayNetwork::get()), None); assert_eq!( @@ -710,11 +707,10 @@ fn allowed_exporters_management_works() { assert_eq!(AllowedExporters::::iter().count(), 1); assert_eq!( AllowedExporters::::get(bridged_network), - Some(BridgeConfig { - bridge_location: VersionedMultiLocation::from(bridge_location), - bridge_location_fee: Some((Parent, 200u128).into()), - allowed_target_locations: Default::default(), - }) + Some(BridgeConfig::new( + VersionedMultiLocation::from(bridge_location), + Some((Parent, 200u128).into()) + )) ); assert_eq!( BridgeTransfer::exporter_for( diff --git a/parachains/pallets/bridge-transfer/src/types.rs b/parachains/pallets/bridge-transfer/src/types.rs index 24ae4caf8f9..b944cdc50a5 100644 --- a/parachains/pallets/bridge-transfer/src/types.rs +++ b/parachains/pallets/bridge-transfer/src/types.rs @@ -47,7 +47,7 @@ impl ResolveAssetTransferKind for () { } } -#[cfg_attr(feature = "std", derive(Debug, PartialEq))] +#[derive(Debug, PartialEq)] pub struct MaybePaidLocation { pub location: MultiLocation, pub maybe_fee: Option, @@ -77,20 +77,31 @@ pub mod config { #[scale_info(skip_type_params(T))] pub struct BridgeConfig { /// Contains location, which is able to bridge XCM messages to bridged network - pub bridge_location: VersionedMultiLocation, + bridge_location: VersionedMultiLocation, /// Fee which could be needed to pay in `bridge_location` /// `MultiAsset` is here from the point of view of `bridge_location`, e.g.: `MultiLocation::parent()` means relay chain token of `bridge_location` - pub bridge_location_fee: Option, + pub(crate) bridge_location_fee: Option, /// Contains target destination on bridged network. E.g.: MultiLocation of Statemine/t on different consensus + its configuration pub(crate) allowed_target_locations: BoundedBTreeMap< VersionedMultiLocation, TargetLocationConfig, - T::ReserveLocationsLimit, + T::TargetLocationsPerExporterLimit, >, } impl BridgeConfig { + pub fn new( + bridge_location: VersionedMultiLocation, + bridge_location_fee: Option, + ) -> Self { + Self { + bridge_location, + bridge_location_fee, + allowed_target_locations: Default::default(), + } + } + /// Tries to find target destination configuration for destination. pub fn allowed_target_location_for( &self, @@ -185,6 +196,7 @@ pub mod config { pub allowed_reserve_assets: Option>, } + #[derive(Debug)] pub enum BridgeConfigError { AssetFilterError(AssetFilterError), MissingTargetLocation, @@ -219,6 +231,7 @@ pub mod filter { fn matches(&self, location: &MultiLocation) -> Result; } + #[derive(Debug)] pub enum AssetFilterError { UnsupportedXcmVersionError, LimitReached, @@ -392,6 +405,12 @@ pub mod filter { Ok(false) } } + + impl> From> for AssetFilter { + fn from(value: MultiLocationFilter) -> Self { + AssetFilter::ByMultiLocation(value) + } + } } pub mod xcm_version { diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs index 6f296e30bdd..c83437d4355 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs @@ -710,6 +710,7 @@ impl pallet_bridge_transfer::Config for Runtime { type UniversalAliasesLimit = ConstU32<24>; type ReserveLocationsLimit = ConstU32<4>; type AssetsPerReserveLocationLimit = ConstU32<128>; + type TargetLocationsPerExporterLimit = ConstU32<4>; type AssetTransactor = AssetTransactors; type AssetTransferKindResolver = pallet_bridge_transfer::features::ConcreteAssetTransferKindResolver< diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs index 46ac2c69e7e..1d692a63c16 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs @@ -534,36 +534,24 @@ impl BridgeTransferBenchmarksHelper { #[cfg(feature = "runtime-benchmarks")] impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBenchmarksHelper { - fn bridge_config() -> Option<(NetworkId, pallet_bridge_transfer::BridgeConfig)> { + fn bridge_location() -> Option<(NetworkId, pallet_bridge_transfer::MaybePaidLocation)> { Some(( Polkadot, - pallet_bridge_transfer::BridgeConfig { - bridge_location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), + pallet_bridge_transfer::MaybePaidLocation { + location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), // Right now `UnpaidRemoteExporter` is used to send XCM messages and it requires // fee to be `None`. If we're going to change that (are we?), then we should replace // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` - bridge_location_fee: None, - allowed_target_location: Self::allowed_target_location(), - max_target_location_fee: Self::allowed_target_location_max_fee(), + maybe_fee: None, }, )) } - fn universal_alias() -> Option<(xcm::VersionedMultiLocation, Junction)> { - Some(( - xcm::VersionedMultiLocation::V3(MultiLocation { - parents: 1, - interior: X1(Parachain(Self::bridge_hub_para_id())), - }), - GlobalConsensus(Polkadot), - )) - } - - fn reserve_location() -> Option { - Some(xcm::VersionedMultiLocation::V3(MultiLocation { - parents: 2, - interior: X2(GlobalConsensus(Polkadot), Parachain(1000)), - })) + fn allowed_bridged_target_location() -> Option { + Some(pallet_bridge_transfer::MaybePaidLocation { + location: Self::allowed_target_location(), + maybe_fee: Self::allowed_target_location_max_fee(), + }) } fn prepare_asset_transfer( @@ -603,10 +591,10 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); // finally - prepare assets and destination (pallet_assets is worse than pallet_balances) - use xcm_executor::traits::Convert; + use sp_runtime::traits::MaybeEquivalence; let asset_id_location = assets_common::AssetIdForTrustBackedAssetsConvert::< TrustBackedAssetsPalletLocation, - >::reverse_ref(local_asset_id) + >::convert_back(&local_asset_id) .unwrap(); let asset: MultiAsset = (Concrete(asset_id_location), minimum_asset_balance * 2).into(); @@ -616,19 +604,18 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe Some((RuntimeOrigin::signed(sender_account), assets, destination)) } - fn prepare_ping_transfer() -> Option<(RuntimeOrigin, xcm::VersionedMultiLocation)> { - // our `BridgeXcmSender` assumes that the HRMP channel is opened between this - // parachain and the sibling bridge-hub parachain - cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( - Self::bridge_hub_para_id().into(), - ); - - // sender account - let sender_account = AccountId::from([42u8; 32]); - - // finally - prepare destination - let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); + fn universal_alias() -> Option<(xcm::VersionedMultiLocation, Junction)> { + Some(( + MultiLocation { parents: 1, interior: X1(Parachain(Self::bridge_hub_para_id())) } + .into_versioned(), + GlobalConsensus(Polkadot), + )) + } - Some((RuntimeOrigin::signed(sender_account), destination)) + fn reserve_location() -> Option { + Some( + MultiLocation { parents: 2, interior: X2(GlobalConsensus(Polkadot), Parachain(1000)) } + .into_versioned(), + ) } } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index e041fdf09a4..6589c8389f7 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -708,6 +708,7 @@ impl pallet_bridge_transfer::Config for Runtime { type UniversalAliasesLimit = ConstU32<24>; type ReserveLocationsLimit = ConstU32<4>; type AssetsPerReserveLocationLimit = ConstU32<128>; + type TargetLocationsPerExporterLimit = ConstU32<4>; type AssetTransactor = AssetTransactors; type AssetTransferKindResolver = pallet_bridge_transfer::features::ConcreteAssetTransferKindResolver< diff --git a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index 285bc6a71bc..a8d678524b3 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -526,36 +526,24 @@ impl BridgeTransferBenchmarksHelper { #[cfg(feature = "runtime-benchmarks")] impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBenchmarksHelper { - fn bridge_config() -> Option<(NetworkId, pallet_bridge_transfer::BridgeConfig)> { + fn bridge_location() -> Option<(NetworkId, pallet_bridge_transfer::MaybePaidLocation)> { Some(( Kusama, - pallet_bridge_transfer::BridgeConfig { - bridge_location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), + pallet_bridge_transfer::MaybePaidLocation { + location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), // Right now `UnpaidRemoteExporter` is used to send XCM messages and it requires // fee to be `None`. If we're going to change that (are we?), then we should replace // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` - bridge_location_fee: None, - allowed_target_location: Self::allowed_target_location(), - max_target_location_fee: Self::allowed_target_location_max_fee(), + maybe_fee: None, }, )) } - fn universal_alias() -> Option<(xcm::VersionedMultiLocation, Junction)> { - Some(( - xcm::VersionedMultiLocation::V3(MultiLocation { - parents: 1, - interior: X1(Parachain(Self::bridge_hub_para_id())), - }), - GlobalConsensus(Kusama), - )) - } - - fn reserve_location() -> Option { - Some(xcm::VersionedMultiLocation::V3(MultiLocation { - parents: 2, - interior: X2(GlobalConsensus(Kusama), Parachain(1000)), - })) + fn allowed_bridged_target_location() -> Option { + Some(pallet_bridge_transfer::MaybePaidLocation { + location: Self::allowed_target_location(), + maybe_fee: Self::allowed_target_location_max_fee(), + }) } fn prepare_asset_transfer( @@ -595,10 +583,10 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); // finally - prepare assets and destination (pallet_assets is worse than pallet_balances) - use xcm_executor::traits::Convert; + use sp_runtime::traits::MaybeEquivalence; let asset_id_location = assets_common::AssetIdForTrustBackedAssetsConvert::< TrustBackedAssetsPalletLocation, - >::reverse_ref(local_asset_id) + >::convert_back(&local_asset_id) .unwrap(); let asset: MultiAsset = (Concrete(asset_id_location), minimum_asset_balance * 2).into(); @@ -608,19 +596,18 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe Some((RuntimeOrigin::signed(sender_account), assets, destination)) } - fn prepare_ping_transfer() -> Option<(RuntimeOrigin, xcm::VersionedMultiLocation)> { - // our `BridgeXcmSender` assumes that the HRMP channel is opened between this - // parachain and the sibling bridge-hub parachain - cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( - Self::bridge_hub_para_id().into(), - ); - - // sender account - let sender_account = AccountId::from([42u8; 32]); - - // finally - prepare destination - let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); + fn universal_alias() -> Option<(xcm::VersionedMultiLocation, Junction)> { + Some(( + MultiLocation { parents: 1, interior: X1(Parachain(Self::bridge_hub_para_id())) } + .into_versioned(), + GlobalConsensus(Polkadot), + )) + } - Some((RuntimeOrigin::signed(sender_account), destination)) + fn reserve_location() -> Option { + Some( + MultiLocation { parents: 2, interior: X2(GlobalConsensus(Polkadot), Parachain(1000)) } + .into_versioned(), + ) } } diff --git a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs index af2dba0d16e..ff782578590 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs @@ -91,9 +91,9 @@ pub fn can_governance_change_bridge_transfer_out_configuration::allowed_exporters(&bridged_network); assert!(cfg.is_some()); - let cfg = cfg.unwrap(); - assert_eq!(cfg.bridge_location, bridge_location.into_versioned()); - assert_eq!(cfg.bridge_location_fee, None); + let cfg = cfg.unwrap().to_bridge_location().expect("ok"); + assert_eq!(cfg.location, bridge_location); + assert_eq!(cfg.maybe_fee, None); } // governance can update bridge fee @@ -117,8 +117,8 @@ pub fn can_governance_change_bridge_transfer_out_configuration::allowed_exporters(&bridged_network); assert!(cfg.is_some()); - let cfg = cfg.unwrap(); - assert_eq!(cfg.bridge_location_fee, Some(new_bridge_location_fee.into())); + let cfg = cfg.unwrap().to_bridge_location().expect("ok"); + assert_eq!(cfg.maybe_fee, Some(new_bridge_location_fee)); } let allowed_target_location = MultiLocation::new( From 897cc87da01ca6a9b7ed9fd016a98de6655fd562 Mon Sep 17 00:00:00 2001 From: Squirrel Date: Fri, 9 Jun 2023 16:50:13 +0100 Subject: [PATCH 298/339] fix new nightly warning (#2721) --- test/client/src/lib.rs | 5 ++--- test/service/src/lib.rs | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/test/client/src/lib.rs b/test/client/src/lib.rs index 4888e957d78..b8c69fa6a76 100644 --- a/test/client/src/lib.rs +++ b/test/client/src/lib.rs @@ -22,11 +22,10 @@ use runtime::{ Balance, Block, BlockHashCount, GenesisConfig, Runtime, RuntimeCall, Signature, SignedExtra, SignedPayload, UncheckedExtrinsic, VERSION, }; -use sc_executor::{HeapAllocStrategy, WasmExecutionMethod, WasmExecutor}; +use sc_executor::HeapAllocStrategy; use sc_executor_common::runtime_blob::RuntimeBlob; -use sc_service::client; use sp_blockchain::HeaderBackend; -use sp_core::{sr25519, storage::Storage, Pair}; +use sp_core::{sr25519, Pair}; use sp_io::TestExternalities; use sp_runtime::{generic::Era, BuildStorage, SaturatedConversion}; diff --git a/test/service/src/lib.rs b/test/service/src/lib.rs index 20e7d7f1949..e45ba47f6eb 100644 --- a/test/service/src/lib.rs +++ b/test/service/src/lib.rs @@ -66,8 +66,8 @@ use sc_service::{ BlocksPruning, DatabaseSource, KeystoreConfig, MultiaddrWithPeerId, NetworkConfiguration, OffchainWorkerConfig, PruningMode, WasmExecutionMethod, }, - BasePath, ChainSpec, Configuration, Error as ServiceError, PartialComponents, Role, - RpcHandlers, TFullBackend, TFullClient, TaskManager, + BasePath, ChainSpec as ChainSpecService, Configuration, Error as ServiceError, + PartialComponents, Role, RpcHandlers, TFullBackend, TFullClient, TaskManager, }; use sp_arithmetic::traits::SaturatedConversion; use sp_blockchain::HeaderBackend; From 8519a76cef4251e1b1a74d63698e90368b9aac42 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Fri, 9 Jun 2023 16:31:43 +0000 Subject: [PATCH 299/339] ".git/.scripts/commands/bench/bench.sh" xcm statemine assets pallet_xcm_benchmarks::generic --- .../xcm/pallet_xcm_benchmarks_generic.rs | 373 ++++++++++++++++++ 1 file changed, 373 insertions(+) create mode 100644 parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs diff --git a/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs new file mode 100644 index 00000000000..cdf2d7deb8b --- /dev/null +++ b/parachains/runtimes/assets/statemine/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -0,0 +1,373 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_xcm_benchmarks::generic` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_xcm_benchmarks::generic +// --chain=statemine-dev +// --header=./file_header.txt +// --template=./templates/xcm-bench-template.hbs +// --output=./parachains/runtimes/assets/statemine/src/weights/xcm/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `pallet_xcm_benchmarks::generic`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_holding() -> Weight { + // Proof Size summary in bytes: + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 342_588_000 picoseconds. + Weight::from_parts(353_329_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + pub fn buy_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_807_000 picoseconds. + Weight::from_parts(3_971_000, 0) + } + // Storage: PolkadotXcm Queries (r:1 w:0) + // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + pub fn query_response() -> Weight { + // Proof Size summary in bytes: + // Measured: `69` + // Estimated: `3534` + // Minimum execution time: 10_635_000 picoseconds. + Weight::from_parts(10_895_000, 3534) + .saturating_add(T::DbWeight::get().reads(1)) + } + pub fn transact() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 12_835_000 picoseconds. + Weight::from_parts(13_188_000, 0) + } + pub fn refund_surplus() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_197_000 picoseconds. + Weight::from_parts(4_271_000, 0) + } + pub fn set_error_handler() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_660_000 picoseconds. + Weight::from_parts(2_717_000, 0) + } + pub fn set_appendix() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_633_000 picoseconds. + Weight::from_parts(2_680_000, 0) + } + pub fn clear_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_564_000 picoseconds. + Weight::from_parts(2_640_000, 0) + } + pub fn descend_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_566_000 picoseconds. + Weight::from_parts(3_625_000, 0) + } + pub fn clear_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_628_000 picoseconds. + Weight::from_parts(2_707_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 26_822_000 picoseconds. + Weight::from_parts(27_380_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + // Storage: PolkadotXcm AssetTraps (r:1 w:1) + // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) + pub fn claim_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `126` + // Estimated: `3591` + // Minimum execution time: 15_606_000 picoseconds. + Weight::from_parts(15_895_000, 3591) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + pub fn trap() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_629_000 picoseconds. + Weight::from_parts(2_686_000, 0) + } + // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn subscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 29_308_000 picoseconds. + Weight::from_parts(29_826_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(4)) + } + // Storage: PolkadotXcm VersionNotifyTargets (r:0 w:1) + // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + pub fn unsubscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_721_000 picoseconds. + Weight::from_parts(4_841_000, 0) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn initiate_reserve_withdraw() -> Weight { + // Proof Size summary in bytes: + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 384_492_000 picoseconds. + Weight::from_parts(388_483_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + pub fn burn_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 118_111_000 picoseconds. + Weight::from_parts(120_309_000, 0) + } + pub fn expect_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 11_732_000 picoseconds. + Weight::from_parts(11_930_000, 0) + } + pub fn expect_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_619_000 picoseconds. + Weight::from_parts(2_736_000, 0) + } + pub fn expect_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_616_000 picoseconds. + Weight::from_parts(2_711_000, 0) + } + pub fn expect_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_819_000 picoseconds. + Weight::from_parts(2_931_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn query_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 30_391_000 picoseconds. + Weight::from_parts(30_999_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + pub fn expect_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 5_032_000 picoseconds. + Weight::from_parts(5_129_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `75` + // Estimated: `3540` + // Minimum execution time: 27_249_000 picoseconds. + Weight::from_parts(27_797_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + pub fn clear_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_661_000 picoseconds. + Weight::from_parts(2_726_000, 0) + } + pub fn set_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_614_000 picoseconds. + Weight::from_parts(2_707_000, 0) + } + pub fn clear_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_566_000 picoseconds. + Weight::from_parts(2_664_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:0) + // Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) + pub fn universal_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `5884` + // Minimum execution time: 9_678_000 picoseconds. + Weight::from_parts(9_956_000, 5884) + .saturating_add(T::DbWeight::get().reads(2)) + } + pub fn set_fees_mode() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_705_000 picoseconds. + Weight::from_parts(2_794_000, 0) + } + pub fn unpaid_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_790_000 picoseconds. + Weight::from_parts(2_866_000, 0) + } +} From c4b1e6ef7ee2e433175b9bf297d93489ec1abfd0 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Fri, 9 Jun 2023 17:37:43 +0000 Subject: [PATCH 300/339] ".git/.scripts/commands/bench/bench.sh" xcm westmint assets pallet_xcm_benchmarks::generic --- .../xcm/pallet_xcm_benchmarks_generic.rs | 373 ++++++++++++++++++ 1 file changed, 373 insertions(+) create mode 100644 parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs diff --git a/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs new file mode 100644 index 00000000000..f20205fffa6 --- /dev/null +++ b/parachains/runtimes/assets/westmint/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -0,0 +1,373 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_xcm_benchmarks::generic` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_xcm_benchmarks::generic +// --chain=westmint-dev +// --header=./file_header.txt +// --template=./templates/xcm-bench-template.hbs +// --output=./parachains/runtimes/assets/westmint/src/weights/xcm/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `pallet_xcm_benchmarks::generic`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_holding() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 348_943_000 picoseconds. + Weight::from_parts(350_806_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + pub fn buy_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_850_000 picoseconds. + Weight::from_parts(3_959_000, 0) + } + // Storage: PolkadotXcm Queries (r:1 w:0) + // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + pub fn query_response() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `3568` + // Minimum execution time: 11_219_000 picoseconds. + Weight::from_parts(11_361_000, 3568) + .saturating_add(T::DbWeight::get().reads(1)) + } + pub fn transact() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 13_572_000 picoseconds. + Weight::from_parts(13_837_000, 0) + } + pub fn refund_surplus() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_195_000 picoseconds. + Weight::from_parts(4_291_000, 0) + } + pub fn set_error_handler() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_711_000 picoseconds. + Weight::from_parts(2_765_000, 0) + } + pub fn set_appendix() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_752_000 picoseconds. + Weight::from_parts(2_827_000, 0) + } + pub fn clear_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_692_000 picoseconds. + Weight::from_parts(2_771_000, 0) + } + pub fn descend_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_745_000 picoseconds. + Weight::from_parts(3_844_000, 0) + } + pub fn clear_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_673_000 picoseconds. + Weight::from_parts(2_764_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 28_705_000 picoseconds. + Weight::from_parts(29_119_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + // Storage: PolkadotXcm AssetTraps (r:1 w:1) + // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) + pub fn claim_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `160` + // Estimated: `3625` + // Minimum execution time: 16_347_000 picoseconds. + Weight::from_parts(16_503_000, 3625) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + pub fn trap() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_684_000 picoseconds. + Weight::from_parts(2_758_000, 0) + } + // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn subscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 30_540_000 picoseconds. + Weight::from_parts(31_449_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(4)) + } + // Storage: PolkadotXcm VersionNotifyTargets (r:0 w:1) + // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + pub fn unsubscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_798_000 picoseconds. + Weight::from_parts(4_931_000, 0) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn initiate_reserve_withdraw() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 387_999_000 picoseconds. + Weight::from_parts(397_646_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + pub fn burn_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 117_246_000 picoseconds. + Weight::from_parts(118_979_000, 0) + } + pub fn expect_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 12_065_000 picoseconds. + Weight::from_parts(12_233_000, 0) + } + pub fn expect_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_806_000 picoseconds. + Weight::from_parts(2_895_000, 0) + } + pub fn expect_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_680_000 picoseconds. + Weight::from_parts(2_787_000, 0) + } + pub fn expect_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_885_000 picoseconds. + Weight::from_parts(2_967_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn query_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 31_588_000 picoseconds. + Weight::from_parts(32_057_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + pub fn expect_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 5_307_000 picoseconds. + Weight::from_parts(5_451_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `3574` + // Minimum execution time: 28_037_000 picoseconds. + Weight::from_parts(28_471_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + pub fn clear_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_617_000 picoseconds. + Weight::from_parts(4_648_000, 0) + } + pub fn set_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_480_000 picoseconds. + Weight::from_parts(4_532_000, 0) + } + pub fn clear_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_801_000 picoseconds. + Weight::from_parts(4_499_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:0) + // Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) + pub fn universal_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `5884` + // Minimum execution time: 9_753_000 picoseconds. + Weight::from_parts(9_955_000, 5884) + .saturating_add(T::DbWeight::get().reads(2)) + } + pub fn set_fees_mode() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_659_000 picoseconds. + Weight::from_parts(2_726_000, 0) + } + pub fn unpaid_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_886_000 picoseconds. + Weight::from_parts(2_978_000, 0) + } +} From 0fade804711ad149a4f17685e06fab50b5aca220 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Fri, 9 Jun 2023 18:43:49 +0000 Subject: [PATCH 301/339] ".git/.scripts/commands/bench/bench.sh" pallet statemine assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs diff --git a/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs new file mode 100644 index 00000000000..d838f249c11 --- /dev/null +++ b/parachains/runtimes/assets/statemine/src/weights/pallet_bridge_transfer.rs @@ -0,0 +1,196 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_transfer` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_transfer +// --chain=statemine-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/statemine/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_transfer`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_transfer::WeightInfo for WeightInfo { + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:0) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: Assets Account (r:2 w:2) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) + fn transfer_asset_via_bridge() -> Weight { + // Proof Size summary in bytes: + // Measured: `757` + // Estimated: `626195` + // Minimum execution time: 174_492_000 picoseconds. + Weight::from_parts(202_243_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(13)) + .saturating_add(T::DbWeight::get().writes(8)) + } + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + fn add_exporter_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `626195` + // Minimum execution time: 11_739_000 picoseconds. + Weight::from_parts(12_161_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + fn remove_exporter_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `626195` + // Minimum execution time: 13_026_000 picoseconds. + Weight::from_parts(13_331_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + fn update_exporter_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `626195` + // Minimum execution time: 15_598_000 picoseconds. + Weight::from_parts(15_886_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + fn update_bridged_target_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `626195` + // Minimum execution time: 17_287_000 picoseconds. + Weight::from_parts(17_864_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + fn allow_reserve_asset_transfer_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `181` + // Estimated: `626195` + // Minimum execution time: 19_207_000 picoseconds. + Weight::from_parts(19_505_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) + /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) + fn add_universal_alias() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `5884` + // Minimum execution time: 11_393_000 picoseconds. + Weight::from_parts(11_635_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) + /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) + fn remove_universal_alias() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `5884` + // Minimum execution time: 14_452_000 picoseconds. + Weight::from_parts(14_674_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) + fn add_reserve_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `158200` + // Minimum execution time: 64_800_000 picoseconds. + Weight::from_parts(67_280_000, 0) + .saturating_add(Weight::from_parts(0, 158200)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) + fn remove_reserve_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `158200` + // Minimum execution time: 13_493_000 picoseconds. + Weight::from_parts(13_714_000, 0) + .saturating_add(Weight::from_parts(0, 158200)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} From 8013e382c2b7b3a79aa5f1600f61c5939f550305 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Fri, 9 Jun 2023 19:49:14 +0000 Subject: [PATCH 302/339] ".git/.scripts/commands/bench/bench.sh" pallet westmint assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs new file mode 100644 index 00000000000..6415ae2dc25 --- /dev/null +++ b/parachains/runtimes/assets/westmint/src/weights/pallet_bridge_transfer.rs @@ -0,0 +1,196 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_transfer` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_transfer +// --chain=westmint-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/westmint/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_transfer`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_transfer::WeightInfo for WeightInfo { + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:0) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: Assets Account (r:2 w:2) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) + fn transfer_asset_via_bridge() -> Weight { + // Proof Size summary in bytes: + // Measured: `739` + // Estimated: `626195` + // Minimum execution time: 174_075_000 picoseconds. + Weight::from_parts(175_534_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(13)) + .saturating_add(T::DbWeight::get().writes(8)) + } + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + fn add_exporter_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `626195` + // Minimum execution time: 12_320_000 picoseconds. + Weight::from_parts(12_732_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + fn remove_exporter_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `626195` + // Minimum execution time: 13_458_000 picoseconds. + Weight::from_parts(13_635_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + fn update_exporter_config() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `626195` + // Minimum execution time: 16_462_000 picoseconds. + Weight::from_parts(16_693_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + fn update_bridged_target_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `626195` + // Minimum execution time: 18_310_000 picoseconds. + Weight::from_parts(18_639_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + fn allow_reserve_asset_transfer_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `181` + // Estimated: `626195` + // Minimum execution time: 19_942_000 picoseconds. + Weight::from_parts(20_338_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) + /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) + fn add_universal_alias() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `5884` + // Minimum execution time: 11_639_000 picoseconds. + Weight::from_parts(12_042_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) + /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) + fn remove_universal_alias() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `5884` + // Minimum execution time: 14_818_000 picoseconds. + Weight::from_parts(15_355_000, 0) + .saturating_add(Weight::from_parts(0, 5884)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) + fn add_reserve_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `109` + // Estimated: `158200` + // Minimum execution time: 66_020_000 picoseconds. + Weight::from_parts(66_422_000, 0) + .saturating_add(Weight::from_parts(0, 158200)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) + fn remove_reserve_location() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `158200` + // Minimum execution time: 13_868_000 picoseconds. + Weight::from_parts(14_131_000, 0) + .saturating_add(Weight::from_parts(0, 158200)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} From ed57ede4fa3b19c66d601f79a5ed13397a4d3e38 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Fri, 9 Jun 2023 20:55:20 +0000 Subject: [PATCH 303/339] ".git/.scripts/commands/bench/bench.sh" xcm asset-hub-kusama assets pallet_xcm_benchmarks::generic --- .../xcm/pallet_xcm_benchmarks_generic.rs | 158 +++++++++--------- 1 file changed, 80 insertions(+), 78 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 2585c6fcc9f..24b554e534c 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,25 +17,27 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // target/production/polkadot-parachain // benchmark // pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=asset-hub-kusama-dev +// --steps=50 +// --repeat=20 +// --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 // --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --chain=westmint-dev +// --chain=asset-hub-kusama-dev // --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +// --template=./templates/xcm-bench-template.hbs +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -65,17 +67,17 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 340_875_000 picoseconds. - Weight::from_parts(349_790_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 341_710_000 picoseconds. + Weight::from_parts(347_830_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn buy_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_898_000 picoseconds. - Weight::from_parts(3_994_000, 0) + // Minimum execution time: 3_772_000 picoseconds. + Weight::from_parts(3_888_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -83,58 +85,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `69` // Estimated: `3534` - // Minimum execution time: 10_760_000 picoseconds. - Weight::from_parts(11_070_000, 3534) + // Minimum execution time: 10_789_000 picoseconds. + Weight::from_parts(11_119_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_340_000 picoseconds. - Weight::from_parts(13_787_000, 0) + // Minimum execution time: 13_206_000 picoseconds. + Weight::from_parts(13_579_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_205_000 picoseconds. - Weight::from_parts(4_328_000, 0) + // Minimum execution time: 3_960_000 picoseconds. + Weight::from_parts(4_170_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_675_000 picoseconds. - Weight::from_parts(2_761_000, 0) + // Minimum execution time: 2_496_000 picoseconds. + Weight::from_parts(2_609_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_648_000 picoseconds. - Weight::from_parts(2_723_000, 0) + // Minimum execution time: 2_596_000 picoseconds. + Weight::from_parts(2_690_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_675_000 picoseconds. - Weight::from_parts(2_866_000, 0) + // Minimum execution time: 2_533_000 picoseconds. + Weight::from_parts(2_628_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_584_000 picoseconds. - Weight::from_parts(3_679_000, 0) + // Minimum execution time: 3_498_000 picoseconds. + Weight::from_parts(3_616_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_686_000 picoseconds. - Weight::from_parts(2_750_000, 0) + // Minimum execution time: 2_512_000 picoseconds. + Weight::from_parts(2_622_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -154,10 +156,10 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 24_994_000 picoseconds. - Weight::from_parts(25_553_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 27_400_000 picoseconds. + Weight::from_parts(28_070_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } // Storage: PolkadotXcm AssetTraps (r:1 w:1) // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) @@ -165,8 +167,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `126` // Estimated: `3591` - // Minimum execution time: 15_960_000 picoseconds. - Weight::from_parts(16_240_000, 3591) + // Minimum execution time: 15_607_000 picoseconds. + Weight::from_parts(15_866_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -174,8 +176,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_659_000 picoseconds. - Weight::from_parts(2_732_000, 0) + // Minimum execution time: 2_506_000 picoseconds. + Weight::from_parts(2_612_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -195,10 +197,10 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 28_083_000 picoseconds. - Weight::from_parts(28_531_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) + // Minimum execution time: 30_241_000 picoseconds. + Weight::from_parts(30_722_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(4)) } // Storage: PolkadotXcm VersionNotifyTargets (r:0 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -206,8 +208,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_884_000 picoseconds. - Weight::from_parts(4_996_000, 0) + // Minimum execution time: 4_616_000 picoseconds. + Weight::from_parts(4_797_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -228,45 +230,45 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 383_046_000 picoseconds. - Weight::from_parts(397_796_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 384_034_000 picoseconds. + Weight::from_parts(389_709_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 118_811_000 picoseconds. - Weight::from_parts(121_240_000, 0) + // Minimum execution time: 118_779_000 picoseconds. + Weight::from_parts(120_145_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_406_000 picoseconds. - Weight::from_parts(12_637_000, 0) + // Minimum execution time: 11_757_000 picoseconds. + Weight::from_parts(12_076_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_758_000 picoseconds. - Weight::from_parts(2_831_000, 0) + // Minimum execution time: 2_646_000 picoseconds. + Weight::from_parts(2_690_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_703_000 picoseconds. - Weight::from_parts(2_798_000, 0) + // Minimum execution time: 2_511_000 picoseconds. + Weight::from_parts(2_611_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_892_000 picoseconds. - Weight::from_parts(2_930_000, 0) + // Minimum execution time: 2_653_000 picoseconds. + Weight::from_parts(2_755_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -286,17 +288,17 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 28_960_000 picoseconds. - Weight::from_parts(29_596_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 31_287_000 picoseconds. + Weight::from_parts(31_723_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn expect_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_303_000 picoseconds. - Weight::from_parts(5_444_000, 0) + // Minimum execution time: 5_044_000 picoseconds. + Weight::from_parts(5_210_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -316,31 +318,31 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 25_221_000 picoseconds. - Weight::from_parts(25_842_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 27_578_000 picoseconds. + Weight::from_parts(28_185_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn clear_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_734_000 picoseconds. - Weight::from_parts(2_787_000, 0) + // Minimum execution time: 2_585_000 picoseconds. + Weight::from_parts(2_647_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_625_000 picoseconds. - Weight::from_parts(2_692_000, 0) + // Minimum execution time: 2_504_000 picoseconds. + Weight::from_parts(2_581_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_638_000 picoseconds. - Weight::from_parts(2_705_000, 0) + // Minimum execution time: 2_578_000 picoseconds. + Weight::from_parts(2_631_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -348,10 +350,10 @@ impl WeightInfo { // Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) pub fn universal_origin() -> Weight { // Proof Size summary in bytes: - // Measured: `158` + // Measured: `159` // Estimated: `5884` - // Minimum execution time: 9_692_000 picoseconds. - Weight::from_parts(9_998_000, 5884) + // Minimum execution time: 9_590_000 picoseconds. + Weight::from_parts(9_886_000, 5884) .saturating_add(T::DbWeight::get().reads(2)) } pub fn set_fees_mode() -> Weight { @@ -359,13 +361,13 @@ impl WeightInfo { // Measured: `0` // Estimated: `0` // Minimum execution time: 2_666_000 picoseconds. - Weight::from_parts(2_738_000, 0) + Weight::from_parts(3_456_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_857_000 picoseconds. - Weight::from_parts(2_966_000, 0) + // Minimum execution time: 3_266_000 picoseconds. + Weight::from_parts(5_554_000, 0) } } From 9a833b1ef159396db266bed44c48ee2e9a2bac82 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 9 Jun 2023 23:43:39 +0200 Subject: [PATCH 304/339] Introduced `primitives` sub module --- Cargo.lock | 8 +++ parachains/pallets/bridge-transfer/Cargo.toml | 4 ++ .../bridge-transfer/primitives/Cargo.toml | 20 +++++++ .../bridge-transfer/primitives/src/lib.rs | 53 +++++++++++++++++++ .../bridge-transfer/src/benchmarking.rs | 2 +- .../pallets/bridge-transfer/src/features.rs | 32 ++++++++++- .../pallets/bridge-transfer/src/impls.rs | 32 +++++------ parachains/pallets/bridge-transfer/src/lib.rs | 29 +++++----- .../pallets/bridge-transfer/src/tests.rs | 17 +++--- .../pallets/bridge-transfer/src/types.rs | 30 ++++------- .../assets/asset-hub-kusama/src/lib.rs | 5 +- .../assets/asset-hub-westend/src/lib.rs | 5 +- .../test-utils/src/test_cases_over_bridge.rs | 12 +++-- 13 files changed, 183 insertions(+), 66 deletions(-) create mode 100644 parachains/pallets/bridge-transfer/primitives/Cargo.toml create mode 100644 parachains/pallets/bridge-transfer/primitives/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4cd1db67565..02d6dd9850f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7405,6 +7405,7 @@ dependencies = [ "frame-system-benchmarking", "log", "pallet-balances", + "pallet-bridge-transfer-primitives", "parity-scale-codec", "polkadot-parachain", "scale-info", @@ -7416,6 +7417,13 @@ dependencies = [ "xcm-executor", ] +[[package]] +name = "pallet-bridge-transfer-primitives" +version = "0.1.0" +dependencies = [ + "xcm", +] + [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" diff --git a/parachains/pallets/bridge-transfer/Cargo.toml b/parachains/pallets/bridge-transfer/Cargo.toml index 505949daa50..b4e47e472ba 100644 --- a/parachains/pallets/bridge-transfer/Cargo.toml +++ b/parachains/pallets/bridge-transfer/Cargo.toml @@ -27,6 +27,9 @@ xcm = { git = "https://github.com/paritytech/polkadot", default-features = false xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +# Cumulus +pallet-bridge-transfer-primitives = { path = "./primitives", default-features = false } + [dev-dependencies] sp-version = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -39,6 +42,7 @@ std = [ "codec/std", "log/std", "scale-info/std", + "pallet-bridge-transfer-primitives/std", "sp-std/std", "sp-runtime/std", "frame-support/std", diff --git a/parachains/pallets/bridge-transfer/primitives/Cargo.toml b/parachains/pallets/bridge-transfer/primitives/Cargo.toml new file mode 100644 index 00000000000..56e2471cf6a --- /dev/null +++ b/parachains/pallets/bridge-transfer/primitives/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "pallet-bridge-transfer-primitives" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "Apache-2.0" +homepage = "https://docs.substrate.io/" +repository = "https://github.com/paritytech/cumulus/" +description = "Pallet with primitives for message transfer through bridges" + +[dependencies] + +# Polkadot +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } + +[features] +default = ["std"] +std = [ + "xcm/std", +] diff --git a/parachains/pallets/bridge-transfer/primitives/src/lib.rs b/parachains/pallets/bridge-transfer/primitives/src/lib.rs new file mode 100644 index 00000000000..7031779559a --- /dev/null +++ b/parachains/pallets/bridge-transfer/primitives/src/lib.rs @@ -0,0 +1,53 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Primitives for bridge transfer pallet. + +// Ensure we're `no_std` when compiling for Wasm. +#![cfg_attr(not(feature = "std"), no_std)] + +use xcm::prelude::*; + +/// Represents some `MultiLocation` with information if we need to pay fees or not. +#[derive(Debug, PartialEq)] +pub struct MaybePaidLocation { + pub location: MultiLocation, + pub maybe_fee: Option, +} + +/// Represents ensured/verified reachable destination. +#[cfg_attr(feature = "std", derive(Debug, PartialEq))] +pub struct ReachableDestination { + /// Bridge location + pub bridge: MaybePaidLocation, + /// Target location (e.g. remote parachain in different consensus) + pub target: MaybePaidLocation, + /// Destination on target (e.g. account on remote parachain in different consensus) + pub target_destination: MultiLocation, +} + +/// Ensures if `remote_destination` is reachable for requested `remote_network`. +pub trait EnsureReachableDestination { + fn ensure_destination( + remote_network: NetworkId, + remote_destination: MultiLocation, + ) -> Result; +} + +/// Error type for [EnsureReachableDestination] +pub enum ReachableDestinationError { + UnsupportedDestination, + UnsupportedXcmVersion, +} diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index e9573edd01a..4d14d1d3471 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -53,7 +53,7 @@ benchmarks! { let _ = T::AssetTransferOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; // every asset has its own configuration and ledger, so there's a performance dependency // (be sure to use "worst" of assets) - let max_assets_limit = T::MaxAssetsLimit::get(); + let max_assets_limit = T::AssetsLimit::get(); ensure!(max_assets_limit > 0, "MaxAssetsLimit not set up correctly."); let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() diff --git a/parachains/pallets/bridge-transfer/src/features.rs b/parachains/pallets/bridge-transfer/src/features.rs index cfea45d7c59..8f8e6901207 100644 --- a/parachains/pallets/bridge-transfer/src/features.rs +++ b/parachains/pallets/bridge-transfer/src/features.rs @@ -14,13 +14,41 @@ // limitations under the License. use crate::{ - types::{AssetFilterT, LatestVersionedMultiLocation}, - AssetTransferKind, Config, MaybePaidLocation, Pallet, ResolveAssetTransferKind, LOG_TARGET, + types::{ + AssetFilterT, AssetTransferKind, LatestVersionedMultiLocation, ResolveAssetTransferKind, + }, + AllowedExporters, Config, Pallet, LOG_TARGET, }; use frame_support::traits::{Contains, ContainsPair}; +use pallet_bridge_transfer_primitives::{ + EnsureReachableDestination, MaybePaidLocation, ReachableDestination, ReachableDestinationError, +}; use xcm::prelude::*; use xcm_builder::ExporterFor; +/// Implementation of `EnsureReachableDestination` which checks on-chain configuration with `AllowedExporters` +impl EnsureReachableDestination for Pallet { + fn ensure_destination( + remote_network: NetworkId, + remote_destination: MultiLocation, + ) -> Result { + match AllowedExporters::::get(&remote_network) { + Some(bridge_config) => { + match bridge_config.allowed_target_location_for(&remote_destination) { + Ok(Some((target_location, _))) => Ok(ReachableDestination { + bridge: bridge_config.to_bridge_location()?, + target: target_location, + target_destination: remote_destination, + }), + Ok(None) => Err(ReachableDestinationError::UnsupportedDestination), + Err(_) => Err(ReachableDestinationError::UnsupportedXcmVersion), + } + }, + None => Err(ReachableDestinationError::UnsupportedDestination), + } + } +} + /// `ExporterFor` implementation to check if we can transfer anything to `NetworkId` impl ExporterFor for Pallet { fn exporter_for( diff --git a/parachains/pallets/bridge-transfer/src/impls.rs b/parachains/pallets/bridge-transfer/src/impls.rs index 83fdc3ea685..8826d2ba33e 100644 --- a/parachains/pallets/bridge-transfer/src/impls.rs +++ b/parachains/pallets/bridge-transfer/src/impls.rs @@ -14,16 +14,28 @@ // limitations under the License. use crate::{ - pallet::AllowedExporters, AssetTransferKind, Config, Error, Event, Pallet, - ReachableDestination, ResolveAssetTransferKind, UsingVersioned, LOG_TARGET, + types::{AssetTransferKind, ResolveAssetTransferKind, UsingVersioned}, + Config, Error, Event, Pallet, LOG_TARGET, }; use frame_support::{pallet_prelude::Get, transactional}; use frame_system::unique; +use pallet_bridge_transfer_primitives::{ + EnsureReachableDestination, ReachableDestination, ReachableDestinationError, +}; use sp_runtime::DispatchError; use xcm::prelude::*; use xcm_builder::ensure_is_remote; use xcm_executor::traits::TransactAsset; +impl From for Error { + fn from(value: ReachableDestinationError) -> Self { + match value { + ReachableDestinationError::UnsupportedDestination => Error::::UnsupportedDestination, + ReachableDestinationError::UnsupportedXcmVersion => Error::::UnsupportedXcmVersion, + } + } +} + impl Pallet { /// Validates destination and check if we support bridging to this remote global consensus /// @@ -39,20 +51,8 @@ impl Pallet { .map_err(|_| Error::::UnsupportedDestination)?; let (remote_network, _) = devolved; - match AllowedExporters::::get(remote_network) { - Some(bridge_config) => { - match bridge_config.allowed_target_location_for(&remote_destination) { - Ok(Some((target_location, _))) => Ok(ReachableDestination { - bridge: bridge_config.to_bridge_location()?, - target: target_location, - target_destination: remote_destination, - }), - Ok(None) => Err(Error::::UnsupportedDestination), - Err(_) => Err(Error::::UnsupportedXcmVersion), - } - }, - None => Err(Error::::UnsupportedDestination), - } + T::BridgedDestinationValidator::ensure_destination(remote_network, remote_destination) + .map_err(Into::into) } /// Tries to initiate transfer assets over bridge. diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 42d2a8335b4..8772e2a6470 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -71,15 +71,13 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::boxed::Box; - -mod types; -pub use types::*; - pub use pallet::*; +pub use pallet_bridge_transfer_primitives::MaybePaidLocation; +pub use types::{AssetFilterOf, MultiLocationFilterOf}; pub mod features; mod impls; +mod types; pub mod weights; #[cfg(feature = "runtime-benchmarks")] @@ -95,10 +93,14 @@ pub const LOG_TARGET: &str = "runtime::bridge-transfer"; pub mod pallet { pub use crate::weights::WeightInfo; - use super::*; - use crate::filter::{AssetFilter, AssetFilterOf, MultiLocationFilterOf}; + use crate::types::{ + filter::{AssetFilter, AssetFilterOf, MultiLocationFilterOf}, + BridgeConfig, LatestVersionedMultiLocation, ResolveAssetTransferKind, UsingVersioned, + }; use frame_support::{pallet_prelude::*, traits::EnsureOriginWithArg, BoundedBTreeSet}; use frame_system::pallet_prelude::*; + use pallet_bridge_transfer_primitives::EnsureReachableDestination; + use sp_std::boxed::Box; use xcm::prelude::*; use xcm_executor::traits::TransactAsset; @@ -190,15 +192,18 @@ pub mod pallet { type AssetTransactor: TransactAsset; /// Transfer kind resolver for `asset` to `target_location`. type AssetTransferKindResolver: ResolveAssetTransferKind; - /// XCM sender which sends messages to the BridgeHub - /// (Config for transfer out) - type BridgeXcmSender: SendXcm; /// Required origin for asset transfer. If successful, it resolves to `MultiLocation`. /// (Config for transfer out) type AssetTransferOrigin: EnsureOrigin; /// Max count of assets in one call /// (Config for transfer out) - type MaxAssetsLimit: Get; + type AssetsLimit: Get; + + /// Validates remote_destination if it is reachable from the point of configuration + type BridgedDestinationValidator: EnsureReachableDestination; + /// XCM sender which sends messages to the BridgeHub + /// (Config for transfer out) + type BridgeXcmSender: SendXcm; /// Benchmarks helper. #[cfg(feature = "runtime-benchmarks")] @@ -315,7 +320,7 @@ pub mod pallet { let assets: MultiAssets = (*assets).try_into().map_err(|()| Error::::InvalidAssets)?; ensure!( - assets.len() <= T::MaxAssetsLimit::get() as usize, + assets.len() <= T::AssetsLimit::get() as usize, Error::::MaxAssetsLimitReached ); diff --git a/parachains/pallets/bridge-transfer/src/tests.rs b/parachains/pallets/bridge-transfer/src/tests.rs index 98940dded73..3f6d600f0f1 100644 --- a/parachains/pallets/bridge-transfer/src/tests.rs +++ b/parachains/pallets/bridge-transfer/src/tests.rs @@ -22,16 +22,18 @@ use crate::{ IsAllowedReserveBasedAssetTransferForConcreteAsset, IsTrustedBridgedReserveForConcreteAsset, }, - filter::{AssetFilter, MultiLocationFilter}, pallet::{AllowedReserveLocations, AllowedUniversalAliases}, - AllowedExporters, AssetTransferKind, BridgeConfig, Config, Error, Event, - LatestVersionedMultiLocation, MaybePaidLocation, ReachableDestination, - ResolveAssetTransferKind, + types::{ + filter::{AssetFilter, MultiLocationFilter}, + AssetTransferKind, BridgeConfig, LatestVersionedMultiLocation, ResolveAssetTransferKind, + }, + AllowedExporters, Config, Error, Event, }; use frame_support::{ assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, BoundedVec, }; use frame_system::EnsureRoot; +use pallet_bridge_transfer_primitives::{MaybePaidLocation, ReachableDestination}; use polkadot_parachain::primitives::Sibling; use sp_runtime::{ testing::{Header, H256}, @@ -270,7 +272,7 @@ impl BenchmarkHelper for TestBenchmarkHelper { parameter_types! { pub const TrapCode: u64 = 12345; - pub const MaxAssetsLimit: u8 = 1; + pub const AssetsLimit: u8 = 1; } impl Config for TestRuntime { @@ -288,9 +290,10 @@ impl Config for TestRuntime { IsTrustedBridgedReserveForConcreteAsset, IsAllowedReserveBasedAssetTransferForConcreteAsset, >; - type BridgeXcmSender = TestBridgeXcmSender; type AssetTransferOrigin = EnsureXcmOrigin; - type MaxAssetsLimit = MaxAssetsLimit; + type AssetsLimit = AssetsLimit; + type BridgedDestinationValidator = BridgeTransfer; + type BridgeXcmSender = TestBridgeXcmSender; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = TestBenchmarkHelper; } diff --git a/parachains/pallets/bridge-transfer/src/types.rs b/parachains/pallets/bridge-transfer/src/types.rs index b944cdc50a5..3afd94723b3 100644 --- a/parachains/pallets/bridge-transfer/src/types.rs +++ b/parachains/pallets/bridge-transfer/src/types.rs @@ -16,10 +16,11 @@ use crate::Config; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::pallet_prelude::{CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound}; +use pallet_bridge_transfer_primitives::MaybePaidLocation; use scale_info::TypeInfo; use xcm::prelude::*; -pub use crate::{ +pub use crate::types::{ config::BridgeConfig, filter::{AssetFilterOf, AssetFilterT, MultiLocationFilterOf}, xcm_version::{LatestVersionedMultiLocation, UnsupportedXcmVersionError, UsingVersioned}, @@ -47,25 +48,9 @@ impl ResolveAssetTransferKind for () { } } -#[derive(Debug, PartialEq)] -pub struct MaybePaidLocation { - pub location: MultiLocation, - pub maybe_fee: Option, -} - -#[cfg_attr(feature = "std", derive(Debug, PartialEq))] -pub struct ReachableDestination { - /// Bridge location - pub bridge: MaybePaidLocation, - /// Target location (e.g. remote parachain in different consensus) - pub target: MaybePaidLocation, - /// Destination on target location (e.g. account on remote parachain in different consensus) - pub target_destination: MultiLocation, -} - pub mod config { use super::*; - use crate::{ + use crate::types::{ filter::{AssetFilterError, AssetFilterOf}, UnsupportedXcmVersionError, }; @@ -220,7 +205,7 @@ pub mod config { pub mod filter { use super::*; - use crate::UnsupportedXcmVersionError; + use crate::types::UnsupportedXcmVersionError; use frame_support::{pallet_prelude::Get, BoundedVec}; pub type AssetFilterOf = AssetFilter<::AssetsPerReserveLocationLimit>; @@ -417,6 +402,7 @@ pub mod xcm_version { use super::*; use crate::Config; use codec::EncodeLike; + use pallet_bridge_transfer_primitives::ReachableDestinationError; use xcm::TryAs; /// For simplified version mismatch handling @@ -429,6 +415,12 @@ pub mod xcm_version { } } + impl From for ReachableDestinationError { + fn from(_: UnsupportedXcmVersionError) -> Self { + Self::UnsupportedXcmVersion + } + } + /// Simplified adapter between `xcm::latest` and `Versioned*` stuff. pub trait UsingVersioned: TryAs + TryInto { fn using_versioned_ref R>( diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs index c83437d4355..91f8eeb158d 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs @@ -719,9 +719,10 @@ impl pallet_bridge_transfer::Config for Runtime { Runtime, >, >; - type BridgeXcmSender = BridgeXcmSender; type AssetTransferOrigin = EnsureXcmOrigin; - type MaxAssetsLimit = ConstU8<1>; + type AssetsLimit = ConstU8<1>; + type BridgedDestinationValidator = BridgeTransfer; + type BridgeXcmSender = BridgeXcmSender; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = xcm_config::BridgeTransferBenchmarksHelper; } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 6589c8389f7..e5c9559eb0e 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -717,9 +717,10 @@ impl pallet_bridge_transfer::Config for Runtime { Runtime, >, >; - type BridgeXcmSender = BridgeXcmSender; type AssetTransferOrigin = EnsureXcmOrigin; - type MaxAssetsLimit = ConstU8<1>; + type AssetsLimit = ConstU8<1>; + type BridgedDestinationValidator = BridgeTransfer; + type BridgeXcmSender = BridgeXcmSender; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = xcm_config::BridgeTransferBenchmarksHelper; } diff --git a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs index ff782578590..da5fca27903 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs @@ -22,7 +22,7 @@ use frame_support::{ traits::{Contains, Currency, Get, OriginTrait, ProcessMessageError}, BoundedVec, }; -use pallet_bridge_transfer::{filter::MultiLocationFilter, AssetFilterOf}; +use pallet_bridge_transfer::{AssetFilterOf, MultiLocationFilterOf}; use parachains_common::Balance; use parachains_runtimes_test_utils::{ mock_open_hrmp_channel, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, RuntimeHelper, @@ -357,10 +357,11 @@ pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< RuntimeHelper::::root_origin(), bridged_network, Box::new(target_location_from_different_consensus.into_versioned()), - AssetFilterOf::::ByMultiLocation(MultiLocationFilter { + MultiLocationFilterOf:: { equals_any: BoundedVec::truncate_from(vec![native_asset.into_versioned()]), starts_with_any: Default::default(), - }), + } + .into(), ) ); @@ -992,12 +993,13 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_work assert_ok!(>::add_reserve_location( RuntimeHelper::::root_origin(), Box::new(remote_parachain_as_origin.into_versioned()), - AssetFilterOf::::ByMultiLocation(MultiLocationFilter { + MultiLocationFilterOf:: { equals_any: BoundedVec::truncate_from(vec![ foreign_asset_id_multilocation.into_versioned() ]), starts_with_any: Default::default(), - }) + } + .into() )); // create foreign asset From edc305d48462a986278ca2c0fbebd140c654b7a6 Mon Sep 17 00:00:00 2001 From: asynchronous rob Date: Fri, 9 Jun 2023 16:47:35 -0500 Subject: [PATCH 305/339] Update all uses of pallet-aura to disallow multiple blocks per slot (#2707) * Update all uses of pallet-aura to disallow multiple blocks per slot * use ConstBool * update lockfile for {"substrate", "polkadot"} --------- Co-authored-by: parity-processbot <> --- Cargo.lock | 386 +++++++++--------- pallets/collator-selection/src/mock.rs | 3 +- parachain-template/runtime/src/lib.rs | 3 +- .../assets/asset-hub-kusama/src/lib.rs | 6 +- .../assets/asset-hub-polkadot/src/lib.rs | 6 +- .../assets/asset-hub-westend/src/lib.rs | 5 +- .../bridge-hubs/bridge-hub-kusama/src/lib.rs | 3 +- .../bridge-hub-polkadot/src/lib.rs | 3 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 3 +- .../collectives-polkadot/src/lib.rs | 3 +- .../contracts/contracts-rococo/src/lib.rs | 3 +- parachains/runtimes/testing/penpal/src/lib.rs | 3 +- .../testing/rococo-parachain/src/lib.rs | 5 +- 13 files changed, 225 insertions(+), 207 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0868dfe9d8b..36762e7f2bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -865,7 +865,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "hash-db", "log", @@ -4151,7 +4151,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", ] @@ -4174,7 +4174,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-support-procedural", @@ -4199,7 +4199,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -4246,7 +4246,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4257,7 +4257,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -4274,7 +4274,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-system", @@ -4303,7 +4303,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-recursion", "futures", @@ -4324,7 +4324,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "bitflags", "environmental", @@ -4359,7 +4359,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "Inflector", "cfg-expr", @@ -4376,7 +4376,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4388,7 +4388,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "proc-macro2", "quote", @@ -4398,7 +4398,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "cfg-if", "frame-support", @@ -4417,7 +4417,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -4432,7 +4432,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "sp-api", @@ -4441,7 +4441,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "parity-scale-codec", @@ -6561,7 +6561,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "futures", "log", @@ -6580,7 +6580,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "anyhow", "jsonrpsee", @@ -7084,7 +7084,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -7105,7 +7105,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7123,7 +7123,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7138,7 +7138,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-system", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-system", @@ -7170,7 +7170,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-system", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7208,7 +7208,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7228,7 +7228,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7243,7 +7243,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-system", @@ -7262,7 +7262,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -7286,7 +7286,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7392,7 +7392,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7436,7 +7436,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7453,7 +7453,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "bitflags", "environmental", @@ -7483,7 +7483,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "bitflags", "parity-scale-codec", @@ -7496,7 +7496,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "proc-macro2", "quote", @@ -7506,7 +7506,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7523,7 +7523,7 @@ dependencies = [ [[package]] name = "pallet-core-fellowship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7541,7 +7541,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7559,7 +7559,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7582,7 +7582,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7595,7 +7595,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7613,7 +7613,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "docify", "frame-benchmarking", @@ -7632,7 +7632,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "blake2", "frame-benchmarking", @@ -7650,7 +7650,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7673,7 +7673,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7689,7 +7689,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7709,7 +7709,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7726,7 +7726,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-system", @@ -7740,7 +7740,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7757,7 +7757,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7776,7 +7776,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7793,7 +7793,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7809,7 +7809,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7826,7 +7826,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7844,7 +7844,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "pallet-nfts", @@ -7855,7 +7855,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7871,7 +7871,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-system", @@ -7888,7 +7888,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7908,7 +7908,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7919,7 +7919,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-system", @@ -7936,7 +7936,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7975,7 +7975,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -7992,7 +7992,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8007,7 +8007,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8025,7 +8025,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8040,7 +8040,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "assert_matches", "frame-benchmarking", @@ -8059,7 +8059,7 @@ dependencies = [ [[package]] name = "pallet-salary" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8077,7 +8077,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8094,7 +8094,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-system", @@ -8115,7 +8115,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8131,7 +8131,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-system", @@ -8145,7 +8145,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8168,7 +8168,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8179,7 +8179,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "log", "sp-arithmetic", @@ -8188,7 +8188,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "sp-api", @@ -8197,7 +8197,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8214,7 +8214,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8229,7 +8229,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8247,7 +8247,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8266,7 +8266,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-support", "frame-system", @@ -8282,7 +8282,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -8298,7 +8298,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -8310,7 +8310,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8327,7 +8327,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8342,7 +8342,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8358,7 +8358,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -8373,7 +8373,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-benchmarking", "frame-support", @@ -11536,7 +11536,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "log", "sp-core", @@ -11547,7 +11547,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "futures", @@ -11576,7 +11576,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "futures", "futures-timer", @@ -11599,7 +11599,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11614,7 +11614,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11633,7 +11633,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11644,7 +11644,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11684,7 +11684,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "fnv", "futures", @@ -11711,7 +11711,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "hash-db", "kvdb", @@ -11737,7 +11737,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "futures", @@ -11762,7 +11762,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "futures", @@ -11791,7 +11791,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "fork-tree", @@ -11827,7 +11827,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "futures", "jsonrpsee", @@ -11849,7 +11849,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11885,7 +11885,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "futures", "jsonrpsee", @@ -11904,7 +11904,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11917,7 +11917,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11957,7 +11957,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "finality-grandpa", "futures", @@ -11977,7 +11977,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "futures", @@ -12000,7 +12000,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "lru 0.10.0", "parity-scale-codec", @@ -12022,7 +12022,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -12034,7 +12034,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "anyhow", "cfg-if", @@ -12052,7 +12052,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "ansi_term", "futures", @@ -12068,7 +12068,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -12082,7 +12082,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12128,7 +12128,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-channel", "cid", @@ -12149,7 +12149,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12176,7 +12176,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "ahash 0.8.2", "futures", @@ -12194,7 +12194,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12216,7 +12216,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12250,7 +12250,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12268,7 +12268,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -12298,7 +12298,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -12307,7 +12307,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "futures", "jsonrpsee", @@ -12338,7 +12338,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12357,7 +12357,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "http", "jsonrpsee", @@ -12372,7 +12372,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12398,7 +12398,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "directories", @@ -12464,7 +12464,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "log", "parity-scale-codec", @@ -12475,7 +12475,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "clap", "fs4", @@ -12491,7 +12491,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12510,7 +12510,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "futures", "libc", @@ -12529,7 +12529,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "chrono", "futures", @@ -12548,7 +12548,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "ansi_term", "atty", @@ -12579,7 +12579,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12590,7 +12590,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "futures", @@ -12616,7 +12616,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "futures", @@ -12632,7 +12632,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-channel", "futures", @@ -13190,7 +13190,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "hash-db", "log", @@ -13210,7 +13210,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "Inflector", "blake2", @@ -13224,7 +13224,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -13237,7 +13237,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "16.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "integer-sqrt", "num-traits", @@ -13251,7 +13251,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -13264,7 +13264,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "sp-api", @@ -13276,7 +13276,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "futures", "log", @@ -13294,7 +13294,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "futures", @@ -13309,7 +13309,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "parity-scale-codec", @@ -13327,7 +13327,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "parity-scale-codec", @@ -13348,7 +13348,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "lazy_static", "parity-scale-codec", @@ -13367,7 +13367,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "finality-grandpa", "log", @@ -13385,7 +13385,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -13397,7 +13397,7 @@ dependencies = [ [[package]] name = "sp-core" version = "21.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13441,7 +13441,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "blake2b_simd", "byteorder", @@ -13455,7 +13455,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "proc-macro2", "quote", @@ -13466,7 +13466,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13475,7 +13475,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "proc-macro2", "quote", @@ -13485,7 +13485,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.19.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "environmental", "parity-scale-codec", @@ -13496,7 +13496,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13511,7 +13511,7 @@ dependencies = [ [[package]] name = "sp-io" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "bytes", "ed25519", @@ -13537,7 +13537,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "lazy_static", "sp-core", @@ -13548,7 +13548,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.27.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "futures", "parity-scale-codec", @@ -13562,7 +13562,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13571,7 +13571,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13582,7 +13582,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13600,7 +13600,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -13614,7 +13614,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "sp-api", "sp-core", @@ -13624,7 +13624,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "backtrace", "lazy_static", @@ -13634,7 +13634,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "rustc-hash", "serde", @@ -13644,7 +13644,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "either", "hash256-std-hasher", @@ -13666,7 +13666,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "17.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13684,7 +13684,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "11.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "Inflector", "proc-macro-crate", @@ -13696,7 +13696,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -13710,7 +13710,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -13723,7 +13723,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.28.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "hash-db", "log", @@ -13743,7 +13743,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "log", "parity-scale-codec", @@ -13761,12 +13761,12 @@ dependencies = [ [[package]] name = "sp-std" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" [[package]] name = "sp-storage" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13779,7 +13779,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "futures-timer", @@ -13794,7 +13794,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "10.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "sp-std", @@ -13806,7 +13806,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "sp-api", "sp-runtime", @@ -13815,7 +13815,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "log", @@ -13831,7 +13831,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13854,7 +13854,7 @@ dependencies = [ [[package]] name = "sp-version" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13871,7 +13871,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13882,7 +13882,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "14.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13895,7 +13895,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "20.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "parity-scale-codec", "scale-info", @@ -14093,7 +14093,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "platforms", ] @@ -14101,7 +14101,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -14120,7 +14120,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "hyper", "log", @@ -14132,7 +14132,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "jsonrpsee", @@ -14145,7 +14145,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "jsonrpsee", "log", @@ -14164,7 +14164,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -14190,7 +14190,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "futures", "substrate-test-utils-derive", @@ -14200,7 +14200,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -14211,7 +14211,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "ansi_term", "build-helper", @@ -14872,7 +14872,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#ff3be276727632e6b9c5d779ae9bc3c638486530" +source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" dependencies = [ "async-trait", "clap", diff --git a/pallets/collator-selection/src/mock.rs b/pallets/collator-selection/src/mock.rs index d7b9c2bf74d..361ea3c47bd 100644 --- a/pallets/collator-selection/src/mock.rs +++ b/pallets/collator-selection/src/mock.rs @@ -17,7 +17,7 @@ use super::*; use crate as collator_selection; use frame_support::{ ord_parameter_types, parameter_types, - traits::{ConstU32, ConstU64, FindAuthor, GenesisBuild, ValidatorRegistration}, + traits::{ConstBool, ConstU32, ConstU64, FindAuthor, GenesisBuild, ValidatorRegistration}, PalletId, }; use frame_system as system; @@ -128,6 +128,7 @@ impl pallet_aura::Config for Test { type AuthorityId = sp_consensus_aura::sr25519::AuthorityId; type MaxAuthorities = ConstU32<100_000>; type DisabledValidators = (); + type AllowMultipleBlocksPerSlot = ConstBool; } sp_runtime::impl_opaque_keys! { diff --git a/parachain-template/runtime/src/lib.rs b/parachain-template/runtime/src/lib.rs index b87445826a1..b2d4ea9f7dd 100644 --- a/parachain-template/runtime/src/lib.rs +++ b/parachain-template/runtime/src/lib.rs @@ -29,7 +29,7 @@ use frame_support::{ construct_runtime, dispatch::DispatchClass, parameter_types, - traits::{ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, + traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, weights::{ constants::WEIGHT_REF_TIME_PER_SECOND, ConstantMultiplier, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial, @@ -422,6 +422,7 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; } parameter_types! { diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs index 44d2a0145d3..9f3b7a8ed82 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs @@ -52,7 +52,10 @@ use frame_support::{ construct_runtime, dispatch::DispatchClass, parameter_types, - traits::{AsEnsureOriginWithArg, ConstU32, ConstU64, ConstU8, EitherOfDiverse, InstanceFilter}, + traits::{ + AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, + InstanceFilter, + }, weights::{ConstantMultiplier, Weight}, PalletId, RuntimeDebug, }; @@ -582,6 +585,7 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; } parameter_types! { diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs index fedb115323a..d0389f7e380 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs @@ -87,7 +87,10 @@ use frame_support::{ construct_runtime, dispatch::DispatchClass, parameter_types, - traits::{AsEnsureOriginWithArg, ConstU32, ConstU64, ConstU8, EitherOfDiverse, InstanceFilter}, + traits::{ + AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, + InstanceFilter, + }, weights::{ConstantMultiplier, Weight}, PalletId, RuntimeDebug, }; @@ -599,6 +602,7 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; } parameter_types! { diff --git a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 3a83954e820..ada96092881 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -50,8 +50,8 @@ use frame_support::{ dispatch::DispatchClass, parameter_types, traits::{ - tokens::nonfungibles_v2::Inspect, AsEnsureOriginWithArg, ConstU32, ConstU64, ConstU8, - InstanceFilter, + tokens::nonfungibles_v2::Inspect, AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, + ConstU8, InstanceFilter, }, weights::{ConstantMultiplier, Weight}, BoundedVec, PalletId, RuntimeDebug, @@ -558,6 +558,7 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; } parameter_types! { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs index 4f7c173a893..8df48a73aae 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -46,7 +46,7 @@ use frame_support::{ construct_runtime, dispatch::DispatchClass, parameter_types, - traits::{ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, + traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, weights::{ConstantMultiplier, Weight}, PalletId, }; @@ -342,6 +342,7 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; } parameter_types! { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs index 99706f2739a..0b63986c11e 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -46,7 +46,7 @@ use frame_support::{ construct_runtime, dispatch::DispatchClass, parameter_types, - traits::{ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, + traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, weights::{ConstantMultiplier, Weight}, PalletId, }; @@ -342,6 +342,7 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; } parameter_types! { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 11bd50e6d3b..7597d98316a 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -48,7 +48,7 @@ use frame_support::{ construct_runtime, dispatch::DispatchClass, parameter_types, - traits::{ConstU32, ConstU64, ConstU8, Everything}, + traits::{ConstBool, ConstU32, ConstU64, ConstU8, Everything}, weights::{ConstantMultiplier, Weight}, PalletId, }; @@ -346,6 +346,7 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; } parameter_types! { diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs index 3177cc02417..c6712635ac2 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs @@ -70,7 +70,7 @@ use frame_support::{ construct_runtime, dispatch::DispatchClass, parameter_types, - traits::{ConstU16, ConstU32, ConstU64, ConstU8, EitherOfDiverse, InstanceFilter}, + traits::{ConstBool, ConstU16, ConstU32, ConstU64, ConstU8, EitherOfDiverse, InstanceFilter}, weights::{ConstantMultiplier, Weight}, PalletId, RuntimeDebug, }; @@ -415,6 +415,7 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; } parameter_types! { diff --git a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index b7401b58642..f830492adaa 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -50,7 +50,7 @@ use frame_support::{ construct_runtime, dispatch::DispatchClass, parameter_types, - traits::{ConstU128, ConstU16, ConstU32, ConstU64, ConstU8, Everything}, + traits::{ConstBool, ConstU128, ConstU16, ConstU32, ConstU64, ConstU8, Everything}, weights::{ConstantMultiplier, Weight}, PalletId, }; @@ -310,6 +310,7 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; } parameter_types! { diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index fc66fa5f0ec..a0be623d2d9 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -38,7 +38,7 @@ use frame_support::{ dispatch::DispatchClass, pallet_prelude::Weight, parameter_types, - traits::{AsEnsureOriginWithArg, ConstU32, ConstU64, ConstU8, Everything}, + traits::{AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, Everything}, weights::{ constants::WEIGHT_REF_TIME_PER_SECOND, ConstantMultiplier, FeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial, @@ -506,6 +506,7 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; } parameter_types! { diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 12dc462ef56..fa6dd20f66a 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -42,8 +42,8 @@ pub use frame_support::{ dispatch::DispatchClass, match_types, parameter_types, traits::{ - AsEnsureOriginWithArg, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything, IsInVec, - Nothing, Randomness, + AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything, + IsInVec, Nothing, Randomness, }, weights::{ constants::{ @@ -554,6 +554,7 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; } construct_runtime! { From a5c14ea46b84178e2bb5b59ce21bc2c0ee92b66b Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 9 Jun 2023 23:53:41 +0200 Subject: [PATCH 306/339] Renamed const --- parachains/pallets/bridge-transfer/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 8772e2a6470..e5347572015 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -247,7 +247,7 @@ pub mod pallet { UnavailableConfiguration, ConfigurationAlreadyExists, InvalidAssets, - MaxAssetsLimitReached, + AssetsLimitReached, UnsupportedDestination, UnsupportedXcmVersion, InvalidRemoteDestination, @@ -321,7 +321,7 @@ pub mod pallet { (*assets).try_into().map_err(|()| Error::::InvalidAssets)?; ensure!( assets.len() <= T::AssetsLimit::get() as usize, - Error::::MaxAssetsLimitReached + Error::::AssetsLimitReached ); // Do this in transaction (explicitly), the rollback should occur in case of any error and no assets will be trapped or lost From 00d16b5395533df52ddb52e589812eedc567d897 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Fri, 9 Jun 2023 22:00:33 +0000 Subject: [PATCH 307/339] ".git/.scripts/commands/bench/bench.sh" xcm asset-hub-westend assets pallet_xcm_benchmarks::generic --- .../xcm/pallet_xcm_benchmarks_generic.rs | 179 ++++++++++-------- 1 file changed, 96 insertions(+), 83 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 275e3c3ed15..7ed010bc23b 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,26 +17,27 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: -// ./artifacts/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=asset-hub-westend-dev +// --steps=50 +// --repeat=20 +// --extrinsic=* // --execution=wasm // --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json +// --chain=asset-hub-westend-dev // --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +// --template=./templates/xcm-bench-template.hbs +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,6 +51,8 @@ pub struct WeightInfo(PhantomData); impl WeightInfo { // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -64,17 +67,17 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 345_759_000 picoseconds. - Weight::from_parts(353_565_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 349_310_000 picoseconds. + Weight::from_parts(351_273_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn buy_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_727_000 picoseconds. - Weight::from_parts(3_865_000, 0) + // Minimum execution time: 3_859_000 picoseconds. + Weight::from_parts(4_098_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -82,61 +85,63 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3568` - // Minimum execution time: 10_978_000 picoseconds. - Weight::from_parts(11_169_000, 3568) + // Minimum execution time: 10_806_000 picoseconds. + Weight::from_parts(11_160_000, 3568) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_477_000 picoseconds. - Weight::from_parts(13_824_000, 0) + // Minimum execution time: 13_176_000 picoseconds. + Weight::from_parts(13_418_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_993_000 picoseconds. - Weight::from_parts(4_166_000, 0) + // Minimum execution time: 4_131_000 picoseconds. + Weight::from_parts(4_310_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_593_000 picoseconds. - Weight::from_parts(2_711_000, 0) + // Minimum execution time: 2_750_000 picoseconds. + Weight::from_parts(2_829_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_606_000 picoseconds. - Weight::from_parts(2_665_000, 0) + // Minimum execution time: 2_719_000 picoseconds. + Weight::from_parts(2_781_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_564_000 picoseconds. - Weight::from_parts(2_628_000, 0) + // Minimum execution time: 2_642_000 picoseconds. + Weight::from_parts(2_707_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_392_000 picoseconds. - Weight::from_parts(3_489_000, 0) + // Minimum execution time: 3_636_000 picoseconds. + Weight::from_parts(3_750_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_569_000 picoseconds. - Weight::from_parts(2_652_000, 0) + // Minimum execution time: 2_631_000 picoseconds. + Weight::from_parts(2_759_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -151,10 +156,10 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 25_378_000 picoseconds. - Weight::from_parts(25_790_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 27_575_000 picoseconds. + Weight::from_parts(28_228_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } // Storage: PolkadotXcm AssetTraps (r:1 w:1) // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) @@ -162,8 +167,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `160` // Estimated: `3625` - // Minimum execution time: 15_992_000 picoseconds. - Weight::from_parts(16_178_000, 3625) + // Minimum execution time: 15_812_000 picoseconds. + Weight::from_parts(16_148_000, 3625) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -171,11 +176,13 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_600_000 picoseconds. - Weight::from_parts(2_671_000, 0) + // Minimum execution time: 2_678_000 picoseconds. + Weight::from_parts(2_733_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -190,10 +197,10 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 27_531_000 picoseconds. - Weight::from_parts(28_132_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) + // Minimum execution time: 30_486_000 picoseconds. + Weight::from_parts(30_851_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(4)) } // Storage: PolkadotXcm VersionNotifyTargets (r:0 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -201,12 +208,14 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_663_000 picoseconds. - Weight::from_parts(4_815_000, 0) + // Minimum execution time: 5_004_000 picoseconds. + Weight::from_parts(5_062_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -221,48 +230,50 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 382_848_000 picoseconds. - Weight::from_parts(398_418_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 387_660_000 picoseconds. + Weight::from_parts(389_830_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 115_229_000 picoseconds. - Weight::from_parts(120_694_000, 0) + // Minimum execution time: 117_751_000 picoseconds. + Weight::from_parts(119_076_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_136_000 picoseconds. - Weight::from_parts(12_364_000, 0) + // Minimum execution time: 12_033_000 picoseconds. + Weight::from_parts(12_165_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_669_000 picoseconds. - Weight::from_parts(2_766_000, 0) + // Minimum execution time: 2_797_000 picoseconds. + Weight::from_parts(2_867_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_578_000 picoseconds. - Weight::from_parts(2_664_000, 0) + // Minimum execution time: 2_693_000 picoseconds. + Weight::from_parts(2_764_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_775_000 picoseconds. - Weight::from_parts(2_854_000, 0) + // Minimum execution time: 2_913_000 picoseconds. + Weight::from_parts(2_990_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -277,20 +288,22 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 28_690_000 picoseconds. - Weight::from_parts(29_048_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 31_929_000 picoseconds. + Weight::from_parts(32_522_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn expect_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_236_000 picoseconds. - Weight::from_parts(5_347_000, 0) + // Minimum execution time: 5_807_000 picoseconds. + Weight::from_parts(5_908_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + // Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) // Storage: PolkadotXcm SupportedVersion (r:1 w:0) // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) @@ -305,31 +318,31 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 25_235_000 picoseconds. - Weight::from_parts(26_132_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 27_841_000 picoseconds. + Weight::from_parts(28_542_000, 3574) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn clear_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_672_000 picoseconds. - Weight::from_parts(2_750_000, 0) + // Minimum execution time: 2_746_000 picoseconds. + Weight::from_parts(2_830_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_590_000 picoseconds. - Weight::from_parts(2_661_000, 0) + // Minimum execution time: 2_721_000 picoseconds. + Weight::from_parts(2_794_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_623_000 picoseconds. - Weight::from_parts(2_712_000, 0) + // Minimum execution time: 2_637_000 picoseconds. + Weight::from_parts(2_764_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -337,24 +350,24 @@ impl WeightInfo { // Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) pub fn universal_origin() -> Weight { // Proof Size summary in bytes: - // Measured: `158` + // Measured: `159` // Estimated: `5884` - // Minimum execution time: 9_692_000 picoseconds. - Weight::from_parts(9_998_000, 5884) + // Minimum execution time: 9_817_000 picoseconds. + Weight::from_parts(10_094_000, 5884) .saturating_add(T::DbWeight::get().reads(2)) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_664_000 picoseconds. - Weight::from_parts(2_726_000, 0) + // Minimum execution time: 2_683_000 picoseconds. + Weight::from_parts(2_783_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_760_000 picoseconds. - Weight::from_parts(2_852_000, 0) + // Minimum execution time: 4_619_000 picoseconds. + Weight::from_parts(4_690_000, 0) } } From c3e150a6075fc4ac5500decac09f877a5c47750c Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Fri, 9 Jun 2023 23:06:42 +0000 Subject: [PATCH 308/339] ".git/.scripts/commands/bench/bench.sh" pallet asset-hub-kusama assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 170 +++++++----------- 1 file changed, 65 insertions(+), 105 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs index 572baf89ab3..e785ccdad3b 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs @@ -17,10 +17,10 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: // target/production/polkadot-parachain @@ -34,9 +34,9 @@ // --heap-pages=4096 // --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_bridge_transfer -// --chain=statemine-dev +// --chain=asset-hub-kusama-dev // --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/ +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -52,9 +52,11 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Storage: ParachainInfo ParachainId (r:1 w:0) /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:0) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) /// Storage: Assets Asset (r:1 w:1) /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) /// Storage: Assets Account (r:2 w:2) @@ -75,124 +77,82 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn transfer_asset_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `750` - // Estimated: `6208` - // Minimum execution time: 155_987_000 picoseconds. - Weight::from_parts(156_876_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(12)) + // Measured: `757` + // Estimated: `626195` + // Minimum execution time: 174_364_000 picoseconds. + Weight::from_parts(258_590_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(13)) .saturating_add(T::DbWeight::get().writes(8)) } - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) - /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) - /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) - /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) - fn ping_via_bridge() -> Weight { - // Proof Size summary in bytes: - // Measured: `347` - // Estimated: `6002` - // Minimum execution time: 66_830_000 picoseconds. - Weight::from_parts(67_314_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(4)) - } /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) fn add_exporter_config() -> Weight { // Proof Size summary in bytes: // Measured: `109` - // Estimated: `6002` - // Minimum execution time: 16_697_000 picoseconds. - Weight::from_parts(16_997_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) - .saturating_add(T::DbWeight::get().reads(2)) + // Estimated: `626195` + // Minimum execution time: 12_139_000 picoseconds. + Weight::from_parts(12_443_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) fn remove_exporter_config() -> Weight { // Proof Size summary in bytes: - // Measured: `175` - // Estimated: `6002` - // Minimum execution time: 13_282_000 picoseconds. - Weight::from_parts(13_616_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) + // Measured: `159` + // Estimated: `626195` + // Minimum execution time: 13_093_000 picoseconds. + Weight::from_parts(13_449_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) fn update_exporter_config() -> Weight { // Proof Size summary in bytes: - // Measured: `175` - // Estimated: `6002` - // Minimum execution time: 16_726_000 picoseconds. - Weight::from_parts(17_111_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) + // Measured: `159` + // Estimated: `626195` + // Minimum execution time: 15_872_000 picoseconds. + Weight::from_parts(15_980_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) fn update_bridged_target_location() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - - fn remove_bridged_target_location() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `159` + // Estimated: `626195` + // Minimum execution time: 17_508_000 picoseconds. + Weight::from_parts(17_932_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } - + /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) fn allow_reserve_asset_transfer_for() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - - fn disallow_reserve_asset_transfer_for() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `181` + // Estimated: `626195` + // Minimum execution time: 19_088_000 picoseconds. + Weight::from_parts(19_396_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) fn add_universal_alias() -> Weight { // Proof Size summary in bytes: // Measured: `109` // Estimated: `5884` - // Minimum execution time: 12_078_000 picoseconds. - Weight::from_parts(12_421_000, 0) + // Minimum execution time: 11_610_000 picoseconds. + Weight::from_parts(11_900_000, 0) .saturating_add(Weight::from_parts(0, 5884)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -201,35 +161,35 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) fn remove_universal_alias() -> Weight { // Proof Size summary in bytes: - // Measured: `158` + // Measured: `159` // Estimated: `5884` - // Minimum execution time: 15_011_000 picoseconds. - Weight::from_parts(15_361_000, 0) + // Minimum execution time: 14_494_000 picoseconds. + Weight::from_parts(14_783_000, 0) .saturating_add(Weight::from_parts(0, 5884)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) - /// Proof: BridgeTransfer AllowedReserveLocations (max_values: Some(1), max_size: Some(4817), added: 5312, mode: MaxEncodedLen) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) fn add_reserve_location() -> Weight { // Proof Size summary in bytes: // Measured: `109` - // Estimated: `6302` - // Minimum execution time: 11_927_000 picoseconds. - Weight::from_parts(12_308_000, 0) - .saturating_add(Weight::from_parts(0, 6302)) + // Estimated: `158200` + // Minimum execution time: 61_870_000 picoseconds. + Weight::from_parts(66_064_000, 0) + .saturating_add(Weight::from_parts(0, 158200)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) - /// Proof: BridgeTransfer AllowedReserveLocations (max_values: Some(1), max_size: Some(4817), added: 5312, mode: MaxEncodedLen) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) fn remove_reserve_location() -> Weight { // Proof Size summary in bytes: - // Measured: `141` - // Estimated: `6302` - // Minimum execution time: 14_002_000 picoseconds. - Weight::from_parts(14_406_000, 0) - .saturating_add(Weight::from_parts(0, 6302)) + // Measured: `159` + // Estimated: `158200` + // Minimum execution time: 13_467_000 picoseconds. + Weight::from_parts(13_843_000, 0) + .saturating_add(Weight::from_parts(0, 158200)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } From b9b61c98071ff4bbb91062e899a0fa4e2b43ec72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 10 Jun 2023 11:32:04 +0000 Subject: [PATCH 309/339] Bump clap from 4.3.2 to 4.3.3 (#2724) Bumps [clap](https://github.com/clap-rs/clap) from 4.3.2 to 4.3.3. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v4.3.2...v4.3.3) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- client/cli/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- test/service/Cargo.toml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 36762e7f2bf..8eea9b4ca7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1816,9 +1816,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.2" +version = "4.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2" +checksum = "ca8f255e4b8027970e78db75e78831229c9815fdbfa67eb1a1b777a62e24b4a0" dependencies = [ "clap_builder", "clap_derive", @@ -1827,9 +1827,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.1" +version = "4.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" +checksum = "acd4f3c17c83b0ba34ffbc4f8bbd74f079413f747f84a6f89292f138057e36ab" dependencies = [ "anstream", "anstyle 1.0.0", diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 7a0d766b8b1..23021820a83 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -clap = { version = "4.3.2", features = ["derive"] } +clap = { version = "4.3.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.4.0" diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index 2a2d30df419..ebe877d4918 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" build = "build.rs" [dependencies] -clap = { version = "4.3.2", features = ["derive"] } +clap = { version = "4.3.3", features = ["derive"] } log = "0.4.18" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.164", features = ["derive"] } diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 648573daa12..22a4f5d0c1f 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -12,7 +12,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.3.2", features = ["derive"] } +clap = { version = "4.3.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" diff --git a/test/service/Cargo.toml b/test/service/Cargo.toml index e4feab90292..72599f6a439 100644 --- a/test/service/Cargo.toml +++ b/test/service/Cargo.toml @@ -10,7 +10,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.68" -clap = { version = "4.3.2", features = ["derive"] } +clap = { version = "4.3.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = [ "async_tokio" ] } jsonrpsee = { version = "0.16.2", features = ["server"] } From 36f5c1b61577da2a0289b6a8151e079448a4154e Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Sat, 10 Jun 2023 22:19:41 +0200 Subject: [PATCH 310/339] Moved cfg stuff to `pallet-bridge-transfer-onchain-config` --- Cargo.lock | 19 + Cargo.toml | 1 + .../bridge-transfer/onchain-config/Cargo.toml | 57 ++ .../onchain-config/src/benchmarking.rs | 263 ++++++++ .../onchain-config/src/features.rs | 184 ++++++ .../bridge-transfer/onchain-config/src/lib.rs | 562 ++++++++++++++++++ .../onchain-config/src/tests.rs | 545 +++++++++++++++++ .../onchain-config/src/types.rs | 459 ++++++++++++++ .../onchain-config/src/weights.rs | 87 +++ 9 files changed, 2177 insertions(+) create mode 100644 parachains/pallets/bridge-transfer/onchain-config/Cargo.toml create mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/benchmarking.rs create mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/features.rs create mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/lib.rs create mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/tests.rs create mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/types.rs create mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/weights.rs diff --git a/Cargo.lock b/Cargo.lock index 02d6dd9850f..04e64c0f41b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7417,6 +7417,25 @@ dependencies = [ "xcm-executor", ] +[[package]] +name = "pallet-bridge-transfer-onchain-config" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "log", + "pallet-bridge-transfer-primitives", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", + "sp-version", + "xcm", + "xcm-builder", +] + [[package]] name = "pallet-bridge-transfer-primitives" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index d5b3b9c2aa9..f656c1b065b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,7 @@ members = [ "polkadot-parachain", "parachains/common", "parachains/pallets/bridge-transfer", + "parachains/pallets/bridge-transfer/onchain-config", "parachains/pallets/parachain-info", "parachains/pallets/ping", "parachains/runtimes/testing/rococo-parachain", diff --git a/parachains/pallets/bridge-transfer/onchain-config/Cargo.toml b/parachains/pallets/bridge-transfer/onchain-config/Cargo.toml new file mode 100644 index 00000000000..ef9142061d9 --- /dev/null +++ b/parachains/pallets/bridge-transfer/onchain-config/Cargo.toml @@ -0,0 +1,57 @@ +[package] +name = "pallet-bridge-transfer-onchain-config" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "Apache-2.0" +homepage = "https://docs.substrate.io/" +repository = "https://github.com/paritytech/cumulus/" +description = "Pallet for managing on-chain configuratino for message transfer through bridges" +readme = "README.md" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.3.0", default-features = false, features = ["derive"] } +log = { version = "0.4.14", default-features = false } + +# Substrate +sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } +frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } +frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + +# Polkadot +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } + +# Cumulus +pallet-bridge-transfer-primitives = { path = "../primitives", default-features = false } + +[dev-dependencies] +sp-version = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[features] +default = ["std"] +std = [ + "codec/std", + "log/std", + "scale-info/std", + "pallet-bridge-transfer-primitives/std", + "sp-std/std", + "sp-runtime/std", + "frame-support/std", + "frame-system/std", + "xcm/std", + "xcm-builder/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", +] +try-runtime = ["frame-support/try-runtime"] diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/benchmarking.rs b/parachains/pallets/bridge-transfer/onchain-config/src/benchmarking.rs new file mode 100644 index 00000000000..03f4235ca56 --- /dev/null +++ b/parachains/pallets/bridge-transfer/onchain-config/src/benchmarking.rs @@ -0,0 +1,263 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! `BridgeTransfer` on-chain configuration pallet benchmarks. + +use crate::{ + types::{ + filter::MultiLocationFilter, AssetFilterOf, BridgeConfig, LatestVersionedMultiLocation, + }, + AllowedExporters, AllowedReserveLocations, AllowedUniversalAliases, BenchmarkHelper, Call, + Config, Event, Pallet, +}; + +use frame_benchmarking::{benchmarks, BenchmarkError}; +use frame_support::{ + assert_ok, ensure, + traits::{EnsureOrigin, EnsureOriginWithArg, Get}, + BoundedVec, +}; +use sp_std::prelude::*; +use xcm::prelude::*; + +#[cfg(feature = "runtime-benchmarks")] +impl Pallet { + #[cfg(feature = "runtime-benchmarks")] + pub fn insert_universal_alias_for_benchmarks((location, junction): (MultiLocation, Junction)) { + assert!(matches!( + AllowedUniversalAliases::::try_mutate( + LatestVersionedMultiLocation(&location), + |junctions| junctions.try_insert(junction) + ), + Ok(true) + )); + } +} + +benchmarks! { + add_exporter_config { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; + }: _( + origin, + bridged_network, + Box::new(maybe_paid_bridge.location.clone().into_versioned()), + maybe_paid_bridge.maybe_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) + ) + verify { + assert_eq!( + AllowedExporters::::get(bridged_network).unwrap().to_bridge_location().expect("stored config"), + maybe_paid_bridge + ); + } + + remove_exporter_config { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; + AllowedExporters::::insert( + bridged_network, + BridgeConfig::new( + maybe_paid_bridge.location.into_versioned(), + maybe_paid_bridge.maybe_fee.map(|fee| VersionedMultiAsset::V3(fee)) + ) + ); + }: _(origin, bridged_network) + verify { + assert_eq!(AllowedExporters::::get(bridged_network), None); + } + + update_exporter_config { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; + AllowedExporters::::insert( + bridged_network, + BridgeConfig::new( + maybe_paid_bridge.location.into_versioned(), + None + ) + ); + + let new_bridge_location_fee = Some(MultiAsset { + id: Concrete(MultiLocation::parent()), + fun: Fungible(1_000_0000), + }); + }: _( + origin, + bridged_network, + new_bridge_location_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) + ) + verify { + assert_eq!( + AllowedExporters::::get(bridged_network).unwrap().to_bridge_location().expect("stored config").maybe_fee, + new_bridge_location_fee + ); + } + + update_bridged_target_location { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + if T::TargetLocationsPerExporterLimit::get() <= 0 { + return Err(BenchmarkError::Weightless); + } + let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; + let allowed_bridged_target_location = T::BenchmarkHelper::allowed_bridged_target_location() + .ok_or(BenchmarkError::Stop("missing `allowed_bridged_target_location` data"))?; + AllowedExporters::::insert( + bridged_network, + BridgeConfig::new( + maybe_paid_bridge.location.into_versioned(), + None + ) + ); + let new_target_location_fee = Some(MultiAsset { + id: Concrete(MultiLocation::parent()), + fun: Fungible(1_000_0000), + }); + }: _( + origin, + bridged_network, + Box::new(allowed_bridged_target_location.location.clone().into_versioned()), + new_target_location_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) + ) + verify { + let bridge_config = AllowedExporters::::get(bridged_network).unwrap(); + assert!( + bridge_config.allowed_target_location_for(&allowed_bridged_target_location.location).expect("stored target_location").is_some() + ); + } + + allow_reserve_asset_transfer_for { + let asset_filter = AssetFilterOf::::All; + + let origin = T::AllowReserveAssetTransferOrigin::try_successful_origin(&asset_filter).map_err(|_| BenchmarkError::Weightless)?; + if T::TargetLocationsPerExporterLimit::get() <= 0 { + return Err(BenchmarkError::Weightless); + } + + let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() + .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; + let allowed_bridged_target_location = T::BenchmarkHelper::allowed_bridged_target_location() + .ok_or(BenchmarkError::Stop("missing `allowed_bridged_target_location` data"))?; + let mut bridge_config = BridgeConfig::new( + maybe_paid_bridge.location.into_versioned(), + None + ); + assert_ok!(bridge_config.update_allowed_target_location( + allowed_bridged_target_location.location.into_versioned(), + allowed_bridged_target_location.maybe_fee.map(|fee| VersionedMultiAsset::V3(fee)) + )); + AllowedExporters::::insert(bridged_network, bridge_config); + + }: _( + origin, + bridged_network, + Box::new(allowed_bridged_target_location.location.clone().into_versioned()), + asset_filter.clone() + ) + verify { + let bridge_config = AllowedExporters::::get(bridged_network).unwrap(); + let allowed_target_location = bridge_config.allowed_target_location_for( + &allowed_bridged_target_location.location + ).expect("stored target_location").unwrap(); + assert_eq!( + allowed_target_location.1, + Some(asset_filter) + ); + } + + add_universal_alias { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let (location, junction) = match T::BenchmarkHelper::universal_alias() { + Some(alias) => alias, + None => match T::UniversalAliasesLimit::get() > 0_u32 { + true => return Err(BenchmarkError::Stop("missing `universal_alias` data")), + false => return Err(BenchmarkError::Weightless), + } + }; + }: _(origin, Box::new(location.clone()), junction) + verify { + assert!( + AllowedUniversalAliases::::get(LatestVersionedMultiLocation::try_from(&location).expect("ok")).contains(&junction) + ); + } + + remove_universal_alias { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let (location, junction) = match T::BenchmarkHelper::universal_alias() { + Some(alias) => alias, + None => match T::UniversalAliasesLimit::get() > 0_u32 { + true => return Err(BenchmarkError::Stop("missing `universal_alias` data")), + false => return Err(BenchmarkError::Weightless), + } + }; + Pallet::::insert_universal_alias_for_benchmarks((location.clone().try_into().unwrap(), junction)); + }: _(origin, Box::new(location.clone()), vec![junction.clone()]) + verify { + assert!(!AllowedUniversalAliases::::get(LatestVersionedMultiLocation::try_from(&location).expect("ok")).contains(&junction)); + } + + add_reserve_location { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let reserve_location = if T::ReserveLocationsLimit::get() > 0_u32 { + match T::BenchmarkHelper::reserve_location() { + Some(location) => location, + None => return Err(BenchmarkError::Stop("missing `reserve_location` data")), + } + } else { + return Err(BenchmarkError::Weightless); + }; + let asset_filter: AssetFilterOf = if T::AssetsPerReserveLocationLimit::get() > 0_u32 { + let assets = (0..T::AssetsPerReserveLocationLimit::get()) + .map(|i| MultiLocation::new(1, X1(Parachain(i))).into_versioned()) + .collect::>(); + MultiLocationFilter { + equals_any: BoundedVec::truncate_from(assets), + starts_with_any: Default::default(), + }.into() + } else { + return Err(BenchmarkError::Weightless); + }; + }: _(origin, Box::new(reserve_location.clone()), asset_filter.clone()) + verify { + assert_eq!( + AllowedReserveLocations::::get(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok")), + Some(asset_filter) + ); + } + + remove_reserve_location { + let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let reserve_location = if T::ReserveLocationsLimit::get() > 0_u32 { + match T::BenchmarkHelper::reserve_location() { + Some(location) => location, + None => return Err(BenchmarkError::Stop("missing `reserve_location` data")), + } + } else { + return Err(BenchmarkError::Weightless); + }; + AllowedReserveLocations::::insert(reserve_location.clone(), AssetFilterOf::::All); + assert!(AllowedReserveLocations::::contains_key(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok"))); + }: _(origin, Box::new(reserve_location.clone()), None) + verify { + assert!(!AllowedReserveLocations::::contains_key(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok"))); + } + + impl_benchmark_test_suite!(Pallet, crate::tests::new_test_ext(), crate::tests::TestRuntime); +} diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/features.rs b/parachains/pallets/bridge-transfer/onchain-config/src/features.rs new file mode 100644 index 00000000000..fc220f70454 --- /dev/null +++ b/parachains/pallets/bridge-transfer/onchain-config/src/features.rs @@ -0,0 +1,184 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{ + types::{AssetFilterT, LatestVersionedMultiLocation}, + AllowedExporters, Config, Pallet, LOG_TARGET, +}; +use frame_support::traits::{Contains, ContainsPair}; +use pallet_bridge_transfer_primitives::{ + EnsureReachableDestination, MaybePaidLocation, ReachableDestination, ReachableDestinationError, +}; +use xcm::prelude::*; +use xcm_builder::ExporterFor; + +/// Implementation of `EnsureReachableDestination` which checks on-chain configuration with `AllowedExporters` +impl EnsureReachableDestination for Pallet { + fn ensure_destination( + remote_network: NetworkId, + remote_destination: MultiLocation, + ) -> Result { + match AllowedExporters::::get(&remote_network) { + Some(bridge_config) => { + match bridge_config.allowed_target_location_for(&remote_destination) { + Ok(Some((target_location, _))) => Ok(ReachableDestination { + bridge: bridge_config.to_bridge_location()?, + target: target_location, + target_destination: remote_destination, + }), + Ok(None) => Err(ReachableDestinationError::UnsupportedDestination), + Err(_) => Err(ReachableDestinationError::UnsupportedXcmVersion), + } + }, + None => Err(ReachableDestinationError::UnsupportedDestination), + } + } +} + +/// `ExporterFor` implementation to check if we can transfer anything to `NetworkId` +impl ExporterFor for Pallet { + fn exporter_for( + network: &NetworkId, + _remote_location: &InteriorMultiLocation, + _message: &Xcm<()>, + ) -> Option<(MultiLocation, Option)> { + match Self::allowed_exporters(network) { + Some(bridge_config) => match bridge_config.to_bridge_location() { + Ok(MaybePaidLocation { location, maybe_fee }) => Some((location, maybe_fee)), + Err(e) => { + log::warn!( + target: LOG_TARGET, + "Exporter for network: {:?} has error: {:?}!", + network, e + ); + None + }, + }, + None => None, + } + } +} + +/// Verifies if we have `(MultiLocation, Junction)` in allowed universal aliases. +pub struct AllowedUniversalAliasesOf(sp_std::marker::PhantomData); +impl Contains<(MultiLocation, Junction)> for AllowedUniversalAliasesOf { + fn contains((location, junction): &(MultiLocation, Junction)) -> bool { + log::trace!( + target: LOG_TARGET, + "AllowedUniversalAliasesOf location: {:?}, junction: {:?}", location, junction + ); + + Pallet::::allowed_universal_aliases(LatestVersionedMultiLocation(location)) + .contains(junction) + } +} + +/// Verifies if we can allow `(MultiAsset, MultiLocation)` as trusted reserve received from "bridge". +pub struct IsTrustedBridgedReserveForConcreteAsset(sp_std::marker::PhantomData); +impl ContainsPair + for IsTrustedBridgedReserveForConcreteAsset +{ + fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + log::trace!( + target: LOG_TARGET, + "IsTrustedBridgedReserveForConcreteAsset asset: {:?}, origin: {:?}", + asset, origin + ); + + let asset_location = match &asset.id { + Concrete(location) => location, + _ => return false, + }; + + let versioned_origin = LatestVersionedMultiLocation(origin); + Pallet::::allowed_reserve_locations(versioned_origin) + .map_or(false, |filter| match filter.matches(asset_location) { + Ok(result) => result, + Err(e) => { + log::error!( + target: LOG_TARGET, + "IsTrustedBridgedReserveForConcreteAsset has error: {:?} for asset_location: {:?} and origin: {:?}!", + e, asset_location, origin + ); + false + }, + }) + } +} + +/// Verifies if it is allowed for `(MultiAsset, MultiLocation)` to be transferred out as reserve based transfer over "bridge". +pub struct IsAllowedReserveBasedAssetTransferForConcreteAsset(sp_std::marker::PhantomData); +impl ContainsPair + for IsAllowedReserveBasedAssetTransferForConcreteAsset +{ + fn contains(asset: &MultiAsset, target_location: &MultiLocation) -> bool { + log::trace!( + target: LOG_TARGET, + "IsAllowedReserveBasedAssetTransferForConcreteAsset asset: {:?}, target_location: {:?}", + asset, target_location + ); + + let asset_location = match &asset.id { + Concrete(location) => location, + _ => return false, + }; + + match target_location.interior.global_consensus() { + Ok(target_consensus) => { + if let Some(bridge_config) = Pallet::::allowed_exporters(target_consensus) { + match bridge_config.allowed_target_location_for(target_location) { + Ok(Some((_, Some(asset_filter)))) => { + match asset_filter.matches(asset_location) { + Ok(matches) => matches, + Err(e) => { + log::error!( + target: LOG_TARGET, + "IsAllowedReserveBasedAssetTransferForConcreteAsset `asset_filter.matches` has error: {:?} for asset_location: {:?} and target_location: {:?}!", + e, asset_location, target_location + ); + false + }, + } + }, + Ok(_) => false, + Err(e) => { + log::warn!( + target: LOG_TARGET, + "IsAllowedReserveBasedAssetTransferForConcreteAsset allowed_target_location_for has error: {:?} for target_location: {:?}!", + e, target_location + ); + false + }, + } + } else { + log::warn!( + target: LOG_TARGET, + "IsAllowedReserveBasedAssetTransferForConcreteAsset missing configuration for target_consensus: {:?} of target_location: {:?}!", + target_consensus, target_location + ); + false + } + }, + Err(_) => { + log::warn!( + target: LOG_TARGET, + "IsAllowedReserveBasedAssetTransferForConcreteAsset target_location: {:?} does not contain global consensus!", + target_location + ); + false + }, + } + } +} diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/lib.rs b/parachains/pallets/bridge-transfer/onchain-config/src/lib.rs new file mode 100644 index 00000000000..c438379ae2f --- /dev/null +++ b/parachains/pallets/bridge-transfer/onchain-config/src/lib.rs @@ -0,0 +1,562 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! # Bridge Transfer Pallet for on-chain configuration management +//! +//! ## Overview +//! +//! Pallet supports configuration for several independent scenarios: +//! +//! ### 1. Support to store on-chain bridge locations +//! +//! * Bridge locations/fees can be stored on-chain in [AllowedExporters] +//! * Managing bridge locations can be done with dedicated extrinsics: `add_exporter_config / remove_exporter_config / update_exporter_config` +//! * Pallet implements `xcm_builder::ExporterFor` which can be used with `xcm_builder::UnpaidRemoteExporter/SovereignPaidRemoteExporter` +//! +//! ### 2. Support to store on-chain allowed bridged target locations with asset filters +//! +//! * Managing target location and asset filer can be done with dedicated extrinsics: +//! * - `update_bridged_target_location / remove_bridged_target_location` - managing target location behind bridge +//! * - `allow_reserve_asset_transfer_for / disallow_reserve_asset_transfer_for` - managing asset filters +//! +//! ### 3. Support to store on-chain allowed universal aliases/origins +//! +//! * Aliases can be stored on-chain in [AllowedUniversalAliases] +//! * Managing bridge locations can be done with dedicated extrinsics: `add_universal_alias / remove_universal_alias` +//! * Stored aliases can be accessed by [features::AllowedUniversalAliasesOf] and configured for e.g. `xcm_executor::Config`: +//! ```nocompile +//! impl xcm_executor::Config for XcmConfig { +//! ... +//! type UniversalAliases = AllowedUniversalAliasesOf; +//! ... +//! } +//! ``` +//! +//! ### 4. Support to store on-chain allowed reserve locations with allowed asset filters +//! +//! * Reserve locations with asset filters can be stored on-chain in [AllowedReserveLocations] +//! * Managing bridge locations can be done with dedicated extrinsics: `add_reserve_location / remove_reserve_location` +//! * Stored reserve locations can be accessed by [features::IsTrustedBridgedReserveForConcreteAsset] and configured for e.g. `xcm_executor::Config`: +//! ```nocompile +//! impl xcm_executor::Config for XcmConfig { +//! ... +//! type IsReserve = IsTrustedBridgedReserveForConcreteAsset; +//! ... +//! } +//! ``` + +// Ensure we're `no_std` when compiling for Wasm. +#![cfg_attr(not(feature = "std"), no_std)] + +pub use pallet::*; +pub use pallet_bridge_transfer_primitives::MaybePaidLocation; +pub use types::{AssetFilterOf, MultiLocationFilterOf}; + +pub mod features; +mod types; +pub mod weights; + +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; + +#[cfg(test)] +mod tests; + +/// The log target of this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-transfer::config"; + +#[frame_support::pallet] +pub mod pallet { + pub use crate::weights::WeightInfo; + + use crate::types::{ + filter::{AssetFilter, AssetFilterOf, MultiLocationFilterOf}, + BridgeConfig, LatestVersionedMultiLocation, UsingVersioned, + }; + use frame_support::{pallet_prelude::*, traits::EnsureOriginWithArg, BoundedBTreeSet}; + use frame_system::pallet_prelude::*; + use sp_std::boxed::Box; + use xcm::prelude::*; + + #[pallet::pallet] + pub struct Pallet(_); + + /// Everything we need to run benchmarks. + #[cfg(feature = "runtime-benchmarks")] + pub trait BenchmarkHelper { + /// Returns proper bridge location+fee for NetworkId, supported by the runtime. + /// + /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled + /// to support transfer to this destination **after** `prepare_asset_transfer` call. + fn bridge_location() -> Option<(NetworkId, MaybePaidLocation)> { + None + } + + /// Returns proper target_location location+fee supported by the runtime. + /// + /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled + /// to support transfer to this destination **after** `prepare_asset_transfer` call. + fn allowed_bridged_target_location() -> Option { + None + } + + fn universal_alias() -> Option<(VersionedMultiLocation, Junction)> { + None + } + + fn reserve_location() -> Option { + None + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl BenchmarkHelper for () { + fn bridge_location() -> Option<(NetworkId, MaybePaidLocation)> { + None + } + + fn allowed_bridged_target_location() -> Option { + None + } + + fn universal_alias() -> Option<(VersionedMultiLocation, Junction)> { + None + } + + fn reserve_location() -> Option { + None + } + } + + #[pallet::config] + pub trait Config: frame_system::Config { + /// The overarching event type. + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + + /// Runtime's universal location + type UniversalLocation: Get; + + /// Weight information for extrinsics in this pallet. + type WeightInfo: WeightInfo; + + /// The configurable origin to allow bridges configuration management. + type AdminOrigin: EnsureOrigin; + /// The configurable origin to allow transfer out asset filters management. + type AllowReserveAssetTransferOrigin: EnsureOriginWithArg< + Self::RuntimeOrigin, + AssetFilterOf, + >; + + /// Max allowed universal aliases per one `MultiLocation` + /// (Config for transfer in) + #[pallet::constant] + type UniversalAliasesLimit: Get; + /// Max allowed reserve locations + /// (Config for transfer out) + #[pallet::constant] + type ReserveLocationsLimit: Get; + /// Max allowed assets for one reserve location + /// (Config for transfer in/out) + #[pallet::constant] + type AssetsPerReserveLocationLimit: Get; + /// Max allowed target locations per exporter (bridged network) + /// (Config for transfer out) + #[pallet::constant] + type TargetLocationsPerExporterLimit: Get; + + /// Benchmarks helper. + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper: BenchmarkHelper; + } + + /// Details of configured bridges which are allowed for **transfer out**. + /// (Config for transfer out) + #[pallet::storage] + #[pallet::getter(fn allowed_exporters)] + pub(super) type AllowedExporters = + StorageMap<_, Blake2_128Concat, NetworkId, BridgeConfig>; + + /// Holds allowed mappings `MultiLocation->Junction` for `UniversalAliases` + /// E.g: + /// BridgeHubMultiLocation1 -> NetworkId::Kusama + /// BridgeHubMultiLocation1 -> NetworkId::Polkadot + /// (Config for transfer in) + #[pallet::storage] + #[pallet::getter(fn allowed_universal_aliases)] + pub(super) type AllowedUniversalAliases = StorageMap< + _, + Blake2_128Concat, + VersionedMultiLocation, + BoundedBTreeSet, + ValueQuery, + >; + + /// Holds allowed mappings `MultiLocation` as trusted reserve locations for allowed assets + /// (Config for transfer in) + #[pallet::storage] + #[pallet::getter(fn allowed_reserve_locations)] + pub(super) type AllowedReserveLocations = + StorageMap<_, Blake2_128Concat, VersionedMultiLocation, AssetFilterOf, OptionQuery>; + + #[pallet::error] + #[cfg_attr(test, derive(PartialEq))] + pub enum Error { + InvalidConfiguration, + InvalidBridgeConfiguration, + UnavailableConfiguration, + ConfigurationAlreadyExists, + UnsupportedDestination, + UnsupportedXcmVersion, + InvalidRemoteDestination, + } + + #[pallet::event] + #[pallet::generate_deposit(pub (super) fn deposit_event)] + pub enum Event { + /// New bridge configuration was added + BridgeAdded, + /// Bridge configuration was removed + BridgeRemoved, + /// Bridge fee configuration was updated + BridgeFeeUpdated, + /// Target location for bridge was updated + BridgeTargetLocationUpdated, + + /// New universal alias was added + UniversalAliasAdded, + /// New universal alias was removed + UniversalAliasRemoved { junction: Junction }, + + /// New reserve location was added + ReserveLocationAdded, + /// New reserve location was removed + ReserveLocationRemoved, + } + + #[pallet::call] + impl Pallet { + /// Adds new bridge exporter, which allows transfer to this `bridged_network`. + /// + /// Parameters: + /// + /// * `bridged_network`: Network where we want to allow transfer funds + /// * `bridge_config`: contains location for BridgeHub in our network + fee + #[pallet::call_index(1)] + #[pallet::weight(T::WeightInfo::add_exporter_config())] + pub fn add_exporter_config( + origin: OriginFor, + bridged_network: NetworkId, + bridge_location: Box, + bridge_location_fee: Option>, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + + // allow just one exporter for one network (can be changed in future) + ensure!( + !AllowedExporters::::contains_key(bridged_network), + Error::::ConfigurationAlreadyExists + ); + + // check bridge is from local consensus + ensure!( + bridge_location + .using_versioned_ref(|versioned| versioned.parents) + .map_err(|_| Error::::UnsupportedXcmVersion)? <= + 1, + Error::::InvalidConfiguration + ); + + // insert + AllowedExporters::::insert( + bridged_network, + BridgeConfig::new(*bridge_location, bridge_location_fee.map(|fee| *fee)), + ); + + Self::deposit_event(Event::BridgeAdded); + Ok(()) + } + + /// Remove bridge configuration for specified `bridged_network`. + /// + /// Parameters: + /// + /// * `bridged_network`: Network where we want to remove + #[pallet::call_index(2)] + #[pallet::weight(T::WeightInfo::remove_exporter_config())] + pub fn remove_exporter_config( + origin: OriginFor, + bridged_network: NetworkId, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + ensure!( + AllowedExporters::::contains_key(bridged_network), + Error::::UnavailableConfiguration + ); + + AllowedExporters::::remove(bridged_network); + Self::deposit_event(Event::BridgeRemoved); + Ok(()) + } + + /// Updates bridge configuration for specified `bridged_network`. + /// + /// Parameters: + /// + /// * `bridged_network`: Network where we want to remove + /// * `bridge_location_fee`: New fee to update + #[pallet::call_index(3)] + #[pallet::weight(T::WeightInfo::update_exporter_config())] + pub fn update_exporter_config( + origin: OriginFor, + bridged_network: NetworkId, + bridge_location_fee: Option>, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + + AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { + let bridge_config = + maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; + bridge_config.bridge_location_fee = bridge_location_fee.map(|fee| *fee); + Self::deposit_event(Event::BridgeFeeUpdated); + Ok(()) + }) + } + + /// Alters bridge configuration with asset filter, which allows to send out matched assets to the `target_location` + /// + /// Parameters: + /// + /// * `bridged_network`: bridge identifier + /// * `target_location`: target location where we want to allow send assets + /// * `asset_filter`: asset filter to add + #[pallet::call_index(4)] + #[pallet::weight(T::WeightInfo::update_bridged_target_location())] + pub fn update_bridged_target_location( + origin: OriginFor, + bridged_network: NetworkId, + target_location: Box, + max_target_location_fee: Option>, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + ensure!( + T::TargetLocationsPerExporterLimit::get() > 0, + Error::::UnavailableConfiguration + ); + + AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { + let bridge_config = + maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; + bridge_config + .update_allowed_target_location( + *target_location, + max_target_location_fee.map(|fee| *fee), + ) + .map_err(|_| Error::::InvalidBridgeConfiguration)?; + Self::deposit_event(Event::BridgeTargetLocationUpdated); + Ok(()) + }) + } + + /// Alters bridge configuration with asset filter, which allows to send out matched assets to the `target_location` + /// + /// Parameters: + /// + /// * `bridged_network`: bridge identifier + /// * `target_location`: target location where we want to allow send assets + /// * `asset_filter`: asset filter to add + #[pallet::call_index(6)] + #[pallet::weight(T::WeightInfo::allow_reserve_asset_transfer_for())] + pub fn allow_reserve_asset_transfer_for( + origin: OriginFor, + bridged_network: NetworkId, + target_location: Box, + asset_filter: AssetFilterOf, + ) -> DispatchResult { + let _ = T::AllowReserveAssetTransferOrigin::ensure_origin(origin, &asset_filter)?; + ensure!( + T::TargetLocationsPerExporterLimit::get() > 0, + Error::::UnavailableConfiguration + ); + + AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { + let bridge_config = + maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; + let was_added = bridge_config + .add_allowed_target_location_filter_for(*target_location, asset_filter) + .map_err(|_| Error::::InvalidBridgeConfiguration)?; + if was_added { + Self::deposit_event(Event::ReserveLocationAdded); + } + Ok(()) + }) + } + + /// Add `(MultiLocation, Junction)` mapping to `AllowedUniversalAliases` + /// + /// Parameters: + /// + /// * `location`: key + /// * `junction`: value + #[pallet::call_index(8)] + #[pallet::weight(T::WeightInfo::add_universal_alias())] + pub fn add_universal_alias( + origin: OriginFor, + location: Box, + junction: Junction, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + + let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) + .map_err(|_| Error::::UnsupportedXcmVersion)?; + AllowedUniversalAliases::::try_mutate(versioned_location, |junctions| { + if junctions.try_insert(junction).map_err(|_| Error::::InvalidConfiguration)? { + Self::deposit_event(Event::UniversalAliasAdded); + } + Ok(()) + }) + } + + /// Remove `(MultiLocation, Junction)` mapping from `AllowedUniversalAliases` + /// + /// Parameters: + /// + /// * `location`: key + /// * `junction`: value + #[pallet::call_index(9)] + #[pallet::weight(T::WeightInfo::remove_universal_alias())] + pub fn remove_universal_alias( + origin: OriginFor, + location: Box, + junctions_to_remove: sp_std::prelude::Vec, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + + let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) + .map_err(|_| Error::::UnsupportedXcmVersion)?; + AllowedUniversalAliases::::try_mutate_exists(versioned_location, |maybe_junctions| { + let junctions = + maybe_junctions.as_mut().ok_or(Error::::UnavailableConfiguration)?; + for jtr in junctions_to_remove { + if junctions.remove(&jtr) { + Self::deposit_event(Event::UniversalAliasRemoved { junction: jtr }); + } + } + + if junctions.is_empty() { + // no junctions, so remove entry from storage + *maybe_junctions = None; + } + + Ok(()) + }) + } + + /// Add `MultiLocation` + `AssetFilter` mapping to `AllowedReserveLocations` + /// + /// Parameters: + /// + /// * `location`: as reserve `MultiLocation` + /// * `asset_filter_to_add`: filter we want to add for that location + #[pallet::call_index(10)] + #[pallet::weight(T::WeightInfo::add_reserve_location())] + pub fn add_reserve_location( + origin: OriginFor, + location: Box, + asset_filter_to_add: AssetFilterOf, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + ensure!(T::ReserveLocationsLimit::get() > 0, Error::::UnavailableConfiguration); + ensure!( + T::AssetsPerReserveLocationLimit::get() > 0, + Error::::UnavailableConfiguration + ); + + let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) + .map_err(|_| Error::::UnsupportedXcmVersion)?; + AllowedReserveLocations::::try_mutate(versioned_location, |filter| { + let was_added = match filter { + Some(old_filter) => old_filter + .add(asset_filter_to_add) + .map_err(|_| Error::::InvalidConfiguration)?, + None => { + *filter = Some(asset_filter_to_add); + true + }, + }; + if was_added { + Self::deposit_event(Event::ReserveLocationAdded); + } + Ok(()) + }) + } + + /// Remove `MultiLocation` mapping from `AllowedReserveLocations`. + /// + /// Parameters: + /// + /// * `location`: as reserve `MultiLocation` + /// * `asset_filter_to_remove`: if `None` the whole `location` entry will be removed, otherwise only selected filters + #[pallet::call_index(11)] + #[pallet::weight(T::WeightInfo::remove_reserve_location())] + pub fn remove_reserve_location( + origin: OriginFor, + location: Box, + asset_filter_to_remove: Option>, + ) -> DispatchResult { + let _ = T::AdminOrigin::ensure_origin(origin)?; + + let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) + .map_err(|_| Error::::UnsupportedXcmVersion)?; + let (mut was_removed, remove_location) = if let Some(asset_filter_to_remove) = + asset_filter_to_remove + { + AllowedReserveLocations::::try_mutate_exists( + versioned_location, + |maybe_filter| { + let filter = + maybe_filter.as_mut().ok_or(Error::::UnavailableConfiguration)?; + match filter { + AssetFilter::ByMultiLocation(old) => { + let was_removed = old.remove(asset_filter_to_remove); + was_removed.map(|wr| (wr, old.is_empty())).map_err(Into::into) + }, + AssetFilter::All => Err(Error::::UnavailableConfiguration), + } + }, + )? + } else { + (false, true) + }; + + if remove_location { + was_removed |= AllowedReserveLocations::::try_mutate_exists(location, |value| { + let exists = value.is_some(); + if exists { + *value = None; + } + Ok::<_, Error>(exists) + }) + .map_err(|_| Error::::InvalidConfiguration)?; + } + + if was_removed { + Self::deposit_event(Event::ReserveLocationRemoved); + Ok(()) + } else { + Err(Error::::InvalidConfiguration.into()) + } + } + } +} diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/tests.rs b/parachains/pallets/bridge-transfer/onchain-config/src/tests.rs new file mode 100644 index 00000000000..21b77f6301a --- /dev/null +++ b/parachains/pallets/bridge-transfer/onchain-config/src/tests.rs @@ -0,0 +1,545 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate as bridge_transfer; +use frame_support::traits::{AsEnsureOriginWithArg, ConstU32, Contains, ContainsPair}; + +use crate::{ + features::{ + AllowedUniversalAliasesOf, IsAllowedReserveBasedAssetTransferForConcreteAsset, + IsTrustedBridgedReserveForConcreteAsset, + }, + pallet::{AllowedReserveLocations, AllowedUniversalAliases}, + types::{ + filter::{AssetFilter, MultiLocationFilter}, + BridgeConfig, LatestVersionedMultiLocation, + }, + AllowedExporters, Config, +}; +use frame_support::{ + assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, BoundedVec, +}; +use frame_system::EnsureRoot; +use sp_runtime::{ + testing::{Header, H256}, + traits::{BlakeTwo256, IdentityLookup}, + AccountId32, ModuleError, +}; +use sp_version::RuntimeVersion; +use xcm::prelude::*; +use xcm_builder::ExporterFor; + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +frame_support::construct_runtime!( + pub enum TestRuntime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + BridgeTransfer: bridge_transfer::{Pallet, Call, Event} = 52, + } +); + +parameter_types! { + pub const BlockHashCount: u64 = 250; + pub Version: RuntimeVersion = RuntimeVersion { + spec_name: sp_version::create_runtime_str!("test"), + impl_name: sp_version::create_runtime_str!("system-test"), + authoring_version: 1, + spec_version: 1, + impl_version: 1, + apis: sp_version::create_apis_vec!([]), + transaction_version: 1, + state_version: 1, + }; +} + +pub type AccountId = AccountId32; + +impl frame_system::Config for TestRuntime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockLength = (); + type BlockWeights = (); + type Version = Version; + type PalletInfo = PalletInfo; + type AccountData = (); + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = frame_support::traits::Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +parameter_types! { + pub const BridgedNetwork: NetworkId = NetworkId::ByGenesis([4; 32]); + pub const RelayNetwork: NetworkId = NetworkId::ByGenesis([9; 32]); + pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(1000)); + // Relay chain currency/balance location (e.g. KsmLocation, DotLocation, ..) + pub const RelayLocation: MultiLocation = MultiLocation::parent(); +} + +parameter_types! { + pub const AssetsLimit: u8 = 1; +} + +impl Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type UniversalLocation = UniversalLocation; + type WeightInfo = (); + type AdminOrigin = EnsureRoot; + type AllowReserveAssetTransferOrigin = AsEnsureOriginWithArg>; + type UniversalAliasesLimit = ConstU32<2>; + type ReserveLocationsLimit = ConstU32<2>; + type AssetsPerReserveLocationLimit = ConstU32<2>; + type TargetLocationsPerExporterLimit = ConstU32<2>; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = (); +} + +pub(crate) fn new_test_ext() -> sp_io::TestExternalities { + sp_tracing::try_init_simple(); + let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + + // with 0 block_number events dont work + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + frame_system::Pallet::::set_block_number(1u32.into()); + }); + + ext +} + +fn account(account: u8) -> AccountId32 { + AccountId32::new([account; 32]) +} + +#[test] +fn allowed_exporters_management_works() { + let bridged_network = BridgedNetwork::get(); + let bridge_location = MultiLocation::new(1, X1(Parachain(1013))); + let dummy_xcm = Xcm(vec![]); + let dummy_remote_interior_multilocation = X1(Parachain(1234)); + + new_test_ext().execute_with(|| { + assert_eq!(AllowedExporters::::iter().count(), 0); + + // should fail - just root is allowed + assert_noop!( + BridgeTransfer::add_exporter_config( + RuntimeOrigin::signed(account(1)), + bridged_network, + Box::new(bridge_location.clone().into_versioned()), + None + ), + DispatchError::BadOrigin + ); + + // should fail - we expect local bridge + assert_noop!( + BridgeTransfer::add_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Box::new(MultiLocation::new(2, X1(Parachain(1234))).into_versioned()), + None + ), + DispatchError::Module(ModuleError { + index: 52, + error: [0, 0, 0, 0], + message: Some("InvalidConfiguration") + }) + ); + assert_eq!(AllowedExporters::::iter().count(), 0); + assert_eq!( + BridgeTransfer::exporter_for( + &bridged_network, + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + None + ); + + // add with root + assert_ok!(BridgeTransfer::add_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Box::new(bridge_location.clone().into_versioned()), + None + )); + assert_eq!(AllowedExporters::::iter().count(), 1); + assert_eq!( + AllowedExporters::::get(bridged_network), + Some(BridgeConfig::new(VersionedMultiLocation::from(bridge_location), None)) + ); + assert_eq!(AllowedExporters::::get(&RelayNetwork::get()), None); + assert_eq!( + BridgeTransfer::exporter_for( + &bridged_network, + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + Some((bridge_location.clone(), None)) + ); + assert_eq!( + BridgeTransfer::exporter_for( + &RelayNetwork::get(), + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + None + ); + + // update fee + // remove + assert_ok!(BridgeTransfer::update_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Some(VersionedMultiAsset::V3((Parent, 200u128).into()).into()), + )); + assert_eq!(AllowedExporters::::iter().count(), 1); + assert_eq!( + AllowedExporters::::get(bridged_network), + Some(BridgeConfig::new( + VersionedMultiLocation::from(bridge_location), + Some((Parent, 200u128).into()) + )) + ); + assert_eq!( + BridgeTransfer::exporter_for( + &bridged_network, + &dummy_remote_interior_multilocation, + &dummy_xcm + ), + Some((bridge_location, Some((Parent, 200u128).into()))) + ); + + // remove + assert_ok!(BridgeTransfer::remove_exporter_config(RuntimeOrigin::root(), bridged_network,)); + assert_eq!(AllowedExporters::::get(bridged_network), None); + assert_eq!(AllowedExporters::::iter().count(), 0); + }) +} + +#[test] +fn allowed_universal_aliases_management_works() { + new_test_ext().execute_with(|| { + assert_eq!(AllowedUniversalAliases::::iter().count(), 0); + + let location1 = MultiLocation::new(1, X1(Parachain(1014))); + let junction1 = GlobalConsensus(ByGenesis([1; 32])); + let junction2 = GlobalConsensus(ByGenesis([2; 32])); + + // should fail - just root is allowed + assert_noop!( + BridgeTransfer::add_universal_alias( + RuntimeOrigin::signed(account(1)), + Box::new(VersionedMultiLocation::V3(location1.clone())), + junction1.clone(), + ), + DispatchError::BadOrigin + ); + assert_eq!(AllowedUniversalAliases::::iter().count(), 0); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + + // add ok + assert_ok!(BridgeTransfer::add_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + junction1.clone(), + )); + assert_ok!(BridgeTransfer::add_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + junction2.clone(), + )); + assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + assert_eq!(AllowedUniversalAliases::::iter().count(), 1); + + // remove ok + assert_ok!(BridgeTransfer::remove_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + vec![junction1.clone()], + )); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + assert_eq!(AllowedUniversalAliases::::iter().count(), 1); + + assert_ok!(BridgeTransfer::remove_universal_alias( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + vec![junction2.clone()], + )); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); + assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); + assert_eq!(AllowedUniversalAliases::::iter().count(), 0); + }) +} + +#[test] +fn allowed_reserve_locations_management_works() { + new_test_ext().execute_with(|| { + assert_eq!(0, AllowedReserveLocations::::iter_values().count()); + + let location1 = MultiLocation::new(1, X1(Parachain(1014))); + let location1_as_latest = VersionedMultiLocation::from(location1.clone()); + let location1_as_latest_as_key = + LatestVersionedMultiLocation::try_from(&location1_as_latest).expect("ok"); + let location2 = + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([1; 32])), Parachain(1014))); + let location2_as_latest = VersionedMultiLocation::from(location2.clone()); + let location2_as_key = + LatestVersionedMultiLocation::try_from(&location2_as_latest).expect("ok"); + + let asset_location = MultiLocation::parent(); + let asset: MultiAsset = (asset_location, 200u128).into(); + + let asset_filter_for_asset_by_multilocation = MultiLocationFilter { + equals_any: BoundedVec::truncate_from(vec![asset_location.into_versioned()]), + starts_with_any: Default::default(), + }; + let asset_filter_for_asset = + AssetFilter::ByMultiLocation(asset_filter_for_asset_by_multilocation.clone()); + let asset_filter_for_other_by_multilocation = MultiLocationFilter { + equals_any: BoundedVec::truncate_from(vec![ + MultiLocation::new(3, Here).into_versioned() + ]), + starts_with_any: Default::default(), + }; + let asset_filter_for_other = + AssetFilter::ByMultiLocation(asset_filter_for_other_by_multilocation.clone()); + + // should fail - just root is allowed + assert_noop!( + BridgeTransfer::add_reserve_location( + RuntimeOrigin::signed(account(1)), + Box::new(location1_as_latest.clone()), + asset_filter_for_asset.clone(), + ), + DispatchError::BadOrigin + ); + assert!(AllowedReserveLocations::::get(&location1_as_latest_as_key).is_none()); + assert!(AllowedReserveLocations::::get(&location2_as_key).is_none()); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + + // add ok + assert_ok!(BridgeTransfer::add_reserve_location( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location1.clone())), + asset_filter_for_asset.clone() + )); + assert_ok!(BridgeTransfer::add_reserve_location( + RuntimeOrigin::root(), + Box::new(VersionedMultiLocation::V3(location2.clone())), + asset_filter_for_other.clone() + )); + assert_eq!(2, AllowedReserveLocations::::iter_values().count()); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + + assert_ok!(BridgeTransfer::add_reserve_location( + RuntimeOrigin::root(), + Box::new(location2_as_latest.clone()), + asset_filter_for_asset.clone() + )); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + + // test remove + assert_noop!( + BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + Box::new(location1_as_latest.clone()), + Some(asset_filter_for_other_by_multilocation.clone()) + ), + DispatchError::Module(ModuleError { + index: 52, + error: [0, 0, 0, 0], + message: Some("UnavailableConfiguration") + }) + ); + + assert_ok!(BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + Box::new(location1_as_latest.clone()), + Some(asset_filter_for_asset_by_multilocation.clone()) + )); + assert_eq!(1, AllowedReserveLocations::::iter_values().count()); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + + assert_ok!(BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + Box::new(location2_as_latest.clone()), + Some(asset_filter_for_other_by_multilocation.clone()) + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + + assert_ok!(BridgeTransfer::remove_reserve_location( + RuntimeOrigin::root(), + Box::new(location2_as_latest), + Some(asset_filter_for_asset_by_multilocation) + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location1 + )); + assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( + &asset, &location2 + )); + }) +} + +#[test] +fn allowed_bridged_target_location_management_works() { + new_test_ext().execute_with(|| { + assert_eq!(0, AllowedExporters::::iter_values().count()); + + let bridged_network = BridgedNetwork::get(); + let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); + let target_location: MultiLocation = + MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); + + // should fail - we need BridgeConfig first + assert_noop!( + BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::All, + ), + DispatchError::Module(ModuleError { + index: 52, + error: [2, 0, 0, 0], + message: Some("UnavailableConfiguration") + }) + ); + + // add bridge config + assert_ok!(BridgeTransfer::add_exporter_config( + RuntimeOrigin::root(), + bridged_network, + Box::new(bridge_location.into_versioned()), + None, + )); + + // should fail - we need also target_location first + assert_noop!( + BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::All, + ), + DispatchError::Module(ModuleError { + index: 52, + error: [1, 0, 0, 0], + message: Some("InvalidBridgeConfiguration") + }) + ); + + // insert allowed target location + assert_ok!(BridgeTransfer::update_bridged_target_location( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + None, + )); + + let asset1_location = MultiLocation::new(2, X2(Parachain(1235), Parachain(5678))); + let asset1 = MultiAsset::from((asset1_location, 1000)); + assert!(!IsAllowedReserveBasedAssetTransferForConcreteAsset::::contains( + &asset1, + &target_location + )); + + // now should pass - add one start_with pattern + assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::ByMultiLocation(MultiLocationFilter { + equals_any: Default::default(), + starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( + 2, + X1(Parachain(2223)) + ) + .into_versioned()]), + }), + )); + + // not allowed yet + assert!(!IsAllowedReserveBasedAssetTransferForConcreteAsset::::contains( + &asset1, + &target_location + )); + + // now should pass - add another start_with pattern + assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( + RuntimeOrigin::root(), + bridged_network, + Box::new(target_location.clone().into_versioned()), + AssetFilter::ByMultiLocation(MultiLocationFilter { + equals_any: Default::default(), + starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( + 2, + X1(Parachain(1235)) + ) + .into_versioned()]), + }), + )); + + // ok + assert!(IsAllowedReserveBasedAssetTransferForConcreteAsset::::contains( + &asset1, + &target_location + )); + }) +} diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/types.rs b/parachains/pallets/bridge-transfer/onchain-config/src/types.rs new file mode 100644 index 00000000000..1aa295925fe --- /dev/null +++ b/parachains/pallets/bridge-transfer/onchain-config/src/types.rs @@ -0,0 +1,459 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::Config; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::pallet_prelude::{CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound}; +use pallet_bridge_transfer_primitives::MaybePaidLocation; +use scale_info::TypeInfo; +use xcm::prelude::*; + +pub use crate::types::{ + config::BridgeConfig, + filter::{AssetFilterOf, AssetFilterT, MultiLocationFilterOf}, + xcm_version::{LatestVersionedMultiLocation, UnsupportedXcmVersionError, UsingVersioned}, +}; + +pub mod config { + use super::*; + use crate::types::{ + filter::{AssetFilterError, AssetFilterOf}, + UnsupportedXcmVersionError, + }; + use frame_support::BoundedBTreeMap; + + #[derive( + Encode, Decode, MaxEncodedLen, TypeInfo, RuntimeDebugNoBound, CloneNoBound, PartialEqNoBound, + )] + #[scale_info(skip_type_params(T))] + pub struct BridgeConfig { + /// Contains location, which is able to bridge XCM messages to bridged network + bridge_location: VersionedMultiLocation, + /// Fee which could be needed to pay in `bridge_location` + /// `MultiAsset` is here from the point of view of `bridge_location`, e.g.: `MultiLocation::parent()` means relay chain token of `bridge_location` + pub(crate) bridge_location_fee: Option, + + /// Contains target destination on bridged network. E.g.: MultiLocation of Statemine/t on different consensus + its configuration + pub(crate) allowed_target_locations: BoundedBTreeMap< + VersionedMultiLocation, + TargetLocationConfig, + T::TargetLocationsPerExporterLimit, + >, + } + + impl BridgeConfig { + pub fn new( + bridge_location: VersionedMultiLocation, + bridge_location_fee: Option, + ) -> Self { + Self { + bridge_location, + bridge_location_fee, + allowed_target_locations: Default::default(), + } + } + + /// Tries to find target destination configuration for destination. + pub fn allowed_target_location_for( + &self, + destination: &MultiLocation, + ) -> Result>)>, UnsupportedXcmVersionError> + { + for (target_location, cfg) in &self.allowed_target_locations { + let target_location = target_location.as_versioned_ref()?; + // if destination matches target_location, we found our configuration + if destination.starts_with(target_location) || destination.eq(target_location) { + let maybe_fee = match &cfg.max_target_location_fee { + Some(fee) => Some(fee.as_versioned_ref()?.clone()), + None => None, + }; + return Ok(Some(( + MaybePaidLocation { location: target_location.clone(), maybe_fee }, + cfg.allowed_reserve_assets.clone(), + ))) + } + } + Ok(None) + } + + pub fn update_allowed_target_location( + &mut self, + target_location: VersionedMultiLocation, + max_target_location_fee: Option, + ) -> Result<(), BridgeConfigError> { + // lets try update existing + for (stored_target, cfg) in self.allowed_target_locations.iter_mut() { + let stored_target = stored_target.as_versioned_ref()?; + let target_location = target_location.as_versioned_ref()?; + // if stored_target matches target_location, we found our configuration + if stored_target.eq(target_location) { + cfg.max_target_location_fee = max_target_location_fee; + return Ok(()) + } + } + + // if not found, just insert + self.allowed_target_locations + .try_insert( + target_location, + TargetLocationConfig { max_target_location_fee, allowed_reserve_assets: None }, + ) + .map(|_| ()) + .map_err(|_| BridgeConfigError::LimitReached) + } + + pub fn add_allowed_target_location_filter_for( + &mut self, + target_location: VersionedMultiLocation, + new_asset_filter: AssetFilterOf, + ) -> Result { + for (stored_target, cfg) in self.allowed_target_locations.iter_mut() { + let stored_target = stored_target.as_versioned_ref()?; + let target_location = target_location.as_versioned_ref()?; + // if stored_target matches target_location, we found our configuration + if stored_target.eq(target_location) { + let was_added = match &mut cfg.allowed_reserve_assets { + Some(old_asset_filter) => old_asset_filter.add(new_asset_filter)?, + None => { + cfg.allowed_reserve_assets = Some(new_asset_filter); + true + }, + }; + return Ok(was_added) + } + } + return Err(BridgeConfigError::MissingTargetLocation) + } + + pub fn to_bridge_location(self) -> Result { + let maybe_fee = match self.bridge_location_fee { + Some(fee) => Some(fee.to_versioned()?), + None => None, + }; + Ok(MaybePaidLocation { location: self.bridge_location.to_versioned()?, maybe_fee }) + } + } + + #[derive( + Encode, Decode, MaxEncodedLen, TypeInfo, RuntimeDebugNoBound, CloneNoBound, PartialEqNoBound, + )] + #[scale_info(skip_type_params(T))] + pub struct TargetLocationConfig { + /// If `None` then `UnpaidExecution` is used, else `Withdraw(target_location_fee)/BuyExecution(target_location_fee, Unlimited)` + /// `MultiAsset` is here from the point of view of `allowed_target_location`, e.g.: `MultiLocation::parent()` means relay chain token of `allowed_target_location` + pub max_target_location_fee: Option, + + /// Filter for allowed asset that can be send out to the target location. + pub allowed_reserve_assets: Option>, + } + + #[derive(Debug)] + pub enum BridgeConfigError { + AssetFilterError(AssetFilterError), + MissingTargetLocation, + UnsupportedXcmVersionError(UnsupportedXcmVersionError), + LimitReached, + } + + impl From for BridgeConfigError { + fn from(e: UnsupportedXcmVersionError) -> Self { + Self::UnsupportedXcmVersionError(e) + } + } + + impl From for BridgeConfigError { + fn from(e: AssetFilterError) -> Self { + Self::AssetFilterError(e) + } + } +} + +pub mod filter { + use super::*; + + use crate::types::UnsupportedXcmVersionError; + use frame_support::{pallet_prelude::Get, BoundedVec}; + + pub type AssetFilterOf = AssetFilter<::AssetsPerReserveLocationLimit>; + pub type MultiLocationFilterOf = + MultiLocationFilter<::AssetsPerReserveLocationLimit>; + + pub trait AssetFilterT { + fn matches(&self, location: &MultiLocation) -> Result; + } + + #[derive(Debug)] + pub enum AssetFilterError { + UnsupportedXcmVersionError, + LimitReached, + } + + impl From for AssetFilterError { + fn from(_: UnsupportedXcmVersionError) -> Self { + Self::UnsupportedXcmVersionError + } + } + + impl From for crate::Error { + fn from(value: AssetFilterError) -> Self { + match value { + AssetFilterError::UnsupportedXcmVersionError => + crate::Error::::UnsupportedXcmVersion, + AssetFilterError::LimitReached => crate::Error::::InvalidConfiguration, + } + } + } + + #[derive( + CloneNoBound, + Encode, + Decode, + Eq, + PartialEqNoBound, + RuntimeDebugNoBound, + TypeInfo, + MaxEncodedLen, + Ord, + PartialOrd, + )] + #[scale_info(skip_type_params(AssetsLimit))] + pub enum AssetFilter> { + ByMultiLocation(MultiLocationFilter), + All, + } + + impl> AssetFilterT for AssetFilter { + fn matches(&self, location: &MultiLocation) -> Result { + match self { + AssetFilter::ByMultiLocation(by_location) => by_location.matches(location), + AssetFilter::All => Ok(true), + } + } + } + + impl> AssetFilter { + pub fn add( + &mut self, + new_filter: AssetFilter, + ) -> Result { + match new_filter { + AssetFilter::ByMultiLocation(by_location) => match self { + AssetFilter::ByMultiLocation(old_by_location) => + old_by_location.add(by_location), + AssetFilter::All => { + *self = AssetFilter::ByMultiLocation(by_location); + Ok(true) + }, + }, + AssetFilter::All => { + let mut was_added = false; + if !matches!(self, AssetFilter::All) { + *self = AssetFilter::All; + was_added = true + } + Ok(was_added) + }, + } + } + } + + #[derive( + CloneNoBound, + Encode, + Decode, + Eq, + PartialEqNoBound, + RuntimeDebugNoBound, + Default, + TypeInfo, + MaxEncodedLen, + Ord, + PartialOrd, + )] + #[scale_info(skip_type_params(PatternsLimit))] + pub struct MultiLocationFilter> { + /// Requested location equals to `MultiLocation` + pub equals_any: BoundedVec, + /// Requested location starts with `MultiLocation` + pub starts_with_any: BoundedVec, + } + + impl> MultiLocationFilter { + fn add( + &mut self, + to_add: MultiLocationFilter, + ) -> Result { + let add_if_not_found = |olds: &mut BoundedVec, + news: BoundedVec| + -> Result { + let mut was_added = false; + for new_ta in news { + if MultiLocationFilter::find_index(&olds, &new_ta)?.is_none() { + olds.try_push(new_ta).map_err(|_| AssetFilterError::LimitReached)?; + was_added = true; + } + } + Ok(was_added) + }; + + Ok(add_if_not_found(&mut self.equals_any, to_add.equals_any)? | + add_if_not_found(&mut self.starts_with_any, to_add.starts_with_any)?) + } + + pub fn remove( + &mut self, + to_remove: MultiLocationFilter, + ) -> Result { + let remove_from = |olds: &mut BoundedVec, + to_remove: BoundedVec| + -> Result { + let mut was_removed = false; + for tr in to_remove { + let found = MultiLocationFilter::find_index(olds, &tr)?; + if let Some(idx) = found { + _ = olds.remove(idx); + was_removed = true; + } + } + Ok(was_removed) + }; + + Ok(remove_from(&mut self.equals_any, to_remove.equals_any)? | + remove_from(&mut self.starts_with_any, to_remove.starts_with_any)?) + } + + fn find_index( + items: &BoundedVec, + searched: &VersionedMultiLocation, + ) -> Result, UnsupportedXcmVersionError> { + let searched = searched.as_versioned_ref()?; + for (idx, item) in items.iter().enumerate() { + let item = item.as_versioned_ref()?; + if item.eq(searched) { + return Ok(Some(idx)) + } + } + Ok(None) + } + + pub fn is_empty(&self) -> bool { + self.equals_any.is_empty() && self.starts_with_any.is_empty() + } + } + + impl> AssetFilterT for MultiLocationFilter { + fn matches(&self, location: &MultiLocation) -> Result { + for filter in &self.equals_any { + if filter.using_versioned_ref(|versioned| location.eq(versioned))? { + return Ok(true) + } + } + for filter in &self.starts_with_any { + if filter.using_versioned_ref(|versioned| location.starts_with(versioned))? { + return Ok(true) + } + } + Ok(false) + } + } + + impl> From> for AssetFilter { + fn from(value: MultiLocationFilter) -> Self { + AssetFilter::ByMultiLocation(value) + } + } +} + +pub mod xcm_version { + use super::*; + use crate::Config; + use codec::EncodeLike; + use pallet_bridge_transfer_primitives::ReachableDestinationError; + use xcm::TryAs; + + /// For simplified version mismatch handling + #[derive(Debug)] + pub struct UnsupportedXcmVersionError; + + impl From for crate::Error { + fn from(_: UnsupportedXcmVersionError) -> Self { + Self::UnsupportedXcmVersion + } + } + + impl From for ReachableDestinationError { + fn from(_: UnsupportedXcmVersionError) -> Self { + Self::UnsupportedXcmVersion + } + } + + /// Simplified adapter between `xcm::latest` and `Versioned*` stuff. + pub trait UsingVersioned: TryAs + TryInto { + fn using_versioned_ref R>( + &self, + f: F, + ) -> Result { + let versioned = self.try_as().map_err(|_| UnsupportedXcmVersionError)?; + Ok(f(versioned)) + } + + fn as_versioned_ref(&self) -> Result<&T, UnsupportedXcmVersionError> { + let versioned = self.try_as().map_err(|_| UnsupportedXcmVersionError)?; + Ok(versioned) + } + + fn to_versioned(self) -> Result { + let versioned = self.try_into().map_err(|_| UnsupportedXcmVersionError)?; + Ok(versioned) + } + } + + impl UsingVersioned for VersionedMultiLocation {} + + impl UsingVersioned for VersionedMultiAsset {} + + /// `KeyArg` wrapper for `VersionedMultiLocation`. + /// This feature allows to use `VersionedMultiLocation` as key, e.g. for `StorageMap`. + /// + /// NOTE: Because something like this does not work: + /// ```nocompile + /// let a = VersionedMultiLocation::V2(xcm::v2::MultiLocation::new(1, xcm::v2::Junctions::X1(xcm::v2::Junction::Parachain(1000)))); + /// let b = VersionedMultiLocation::V3(xcm::v3::MultiLocation::new(1, xcm::v3::Junctions::X1(xcm::v3::Junction::Parachain(1000)))); + /// assert_eq!(key_a, key_b); // <-- fails + /// ``` + #[derive(Copy, Clone)] + pub struct LatestVersionedMultiLocation<'a>(pub(crate) &'a MultiLocation); + + impl<'a> EncodeLike for LatestVersionedMultiLocation<'a> {} + + impl<'a> EncodeLike for &LatestVersionedMultiLocation<'a> {} + + impl<'a> Encode for LatestVersionedMultiLocation<'a> { + fn encode(&self) -> sp_std::vec::Vec { + let mut r = VersionedMultiLocation::from(MultiLocation::default()).encode(); + r.truncate(1); + self.0.using_encoded(|d| r.extend_from_slice(d)); + r + } + } + + impl<'a> TryFrom<&'a VersionedMultiLocation> for LatestVersionedMultiLocation<'a> { + type Error = UnsupportedXcmVersionError; + + fn try_from(value: &'a VersionedMultiLocation) -> Result { + value.as_versioned_ref().map(|v| LatestVersionedMultiLocation(v)) + } + } +} diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/weights.rs b/parachains/pallets/bridge-transfer/onchain-config/src/weights.rs new file mode 100644 index 00000000000..870405e72e3 --- /dev/null +++ b/parachains/pallets/bridge-transfer/onchain-config/src/weights.rs @@ -0,0 +1,87 @@ +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Weights trait for the `pallet_bridge_assets_transfer` pallet. + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_bridge_assets_transfer. +pub trait WeightInfo { + /// Weight of the `add_exporter_config` call. + fn add_exporter_config() -> Weight; + /// Weight of the `remove_exporter_config` call. + fn remove_exporter_config() -> Weight; + /// Weight of the `update_exporter_config` call. + fn update_exporter_config() -> Weight; + + /// Weight of the `update_bridged_target_location` call. + fn update_bridged_target_location() -> Weight; + /// Weight of the `allow_reserve_asset_transfer` call. + fn allow_reserve_asset_transfer_for() -> Weight; + + /// Weight of the `add_universal_alias` call. + fn add_universal_alias() -> Weight; + /// Weight of the `remove_universal_alias` call. + fn remove_universal_alias() -> Weight; + + /// Weight of the `add_reserve_location` call. + fn add_reserve_location() -> Weight; + /// Weight of the `remove_reserve_location` call. + fn remove_reserve_location() -> Weight; +} + +// Zero weights to use in tests +impl WeightInfo for () { + fn add_exporter_config() -> Weight { + Weight::zero() + } + + fn remove_exporter_config() -> Weight { + Weight::zero() + } + + fn update_exporter_config() -> Weight { + Weight::zero() + } + + fn update_bridged_target_location() -> Weight { + Weight::zero() + } + + fn allow_reserve_asset_transfer_for() -> Weight { + Weight::zero() + } + + fn add_universal_alias() -> Weight { + Weight::zero() + } + + fn remove_universal_alias() -> Weight { + Weight::zero() + } + + fn add_reserve_location() -> Weight { + Weight::zero() + } + + fn remove_reserve_location() -> Weight { + Weight::zero() + } +} From 916fe2e9765115ce1c18cc135b4ff7c8890ede7e Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 12 Jun 2023 06:58:37 +0200 Subject: [PATCH 311/339] More refactoring --- Cargo.lock | 3 + .../bridge-transfer/primitives/Cargo.toml | 8 + .../primitives/src/asset_filter.rs | 63 ++ .../bridge-transfer/primitives/src/config.rs | 121 +++ .../bridge-transfer/primitives/src/lib.rs | 8 +- .../pallets/bridge-transfer/src/features.rs | 169 ++--- .../pallets/bridge-transfer/src/impls.rs | 10 +- parachains/pallets/bridge-transfer/src/lib.rs | 432 +---------- .../pallets/bridge-transfer/src/tests.rs | 712 ++---------------- .../pallets/bridge-transfer/src/types.rs | 443 ----------- .../pallets/bridge-transfer/src/weights.rs | 78 +- 11 files changed, 362 insertions(+), 1685 deletions(-) create mode 100644 parachains/pallets/bridge-transfer/primitives/src/asset_filter.rs create mode 100644 parachains/pallets/bridge-transfer/primitives/src/config.rs diff --git a/Cargo.lock b/Cargo.lock index 04e64c0f41b..d469cdd7ebb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7440,7 +7440,10 @@ dependencies = [ name = "pallet-bridge-transfer-primitives" version = "0.1.0" dependencies = [ + "frame-support", + "sp-std", "xcm", + "xcm-builder", ] [[package]] diff --git a/parachains/pallets/bridge-transfer/primitives/Cargo.toml b/parachains/pallets/bridge-transfer/primitives/Cargo.toml index 56e2471cf6a..2ac8cf450e2 100644 --- a/parachains/pallets/bridge-transfer/primitives/Cargo.toml +++ b/parachains/pallets/bridge-transfer/primitives/Cargo.toml @@ -10,11 +10,19 @@ description = "Pallet with primitives for message transfer through bridges" [dependencies] +# Substrate +sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + # Polkadot xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } [features] default = ["std"] std = [ + "sp-std/std", + "frame-support/std", "xcm/std", + "xcm-builder/std", ] diff --git a/parachains/pallets/bridge-transfer/primitives/src/asset_filter.rs b/parachains/pallets/bridge-transfer/primitives/src/asset_filter.rs new file mode 100644 index 00000000000..b61554ce1c3 --- /dev/null +++ b/parachains/pallets/bridge-transfer/primitives/src/asset_filter.rs @@ -0,0 +1,63 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Primitives for matching asset `MultiLocation`. + +use xcm::prelude::*; + +/// Trait for matching asset location +pub trait MatchAssetLocation { + fn matches(&self, location: &MultiLocation) -> bool; +} + +/// Simple asset location filter +#[derive(Debug)] +pub enum AssetFilter { + ByMultiLocation(MultiLocationFilter), + All, +} + +impl MatchAssetLocation for AssetFilter { + fn matches(&self, asset_location: &MultiLocation) -> bool { + match self { + AssetFilter::ByMultiLocation(by_location) => by_location.matches(asset_location), + AssetFilter::All => true, + } + } +} + +#[derive(Debug)] +pub struct MultiLocationFilter { + /// Requested location equals to `MultiLocation` + pub equals_any: sp_std::vec::Vec, + /// Requested location starts with `MultiLocation` + pub starts_with_any: sp_std::vec::Vec, +} + +impl MatchAssetLocation for MultiLocationFilter { + fn matches(&self, location: &MultiLocation) -> bool { + for filter in &self.equals_any { + if location.eq(filter) { + return true + } + } + for filter in &self.starts_with_any { + if location.starts_with(filter) { + return true + } + } + false + } +} diff --git a/parachains/pallets/bridge-transfer/primitives/src/config.rs b/parachains/pallets/bridge-transfer/primitives/src/config.rs new file mode 100644 index 00000000000..eac3bcbc7e6 --- /dev/null +++ b/parachains/pallets/bridge-transfer/primitives/src/config.rs @@ -0,0 +1,121 @@ +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Primitives for easier configuration. + +use crate::{ + AssetFilter, EnsureReachableDestination, MaybePaidLocation, ReachableDestination, + ReachableDestinationError, +}; +use frame_support::{ + traits::{ConstU32, Get}, + BoundedBTreeMap, +}; +use xcm::prelude::*; +use xcm_builder::ExporterFor; + +/// Configuration represents bridge to target location with possible asset filtering +#[derive(Debug)] +pub struct BridgeConfig { + /// Location, which is able to bridge XCM messages to bridged network + pub bridge_location: MaybePaidLocation, + /// Contains target destination on bridged network. E.g.: MultiLocation of Statemine/t on different consensus + its configuration + pub allowed_target_locations: sp_std::vec::Vec<(MaybePaidLocation, Option)>, +} + +impl BridgeConfig { + pub fn new(bridge_location: MaybePaidLocation) -> Self { + Self { bridge_location, allowed_target_locations: Default::default() } + } + + pub fn add_target_location( + mut self, + target_location: MaybePaidLocation, + asset_filter: Option, + ) -> Self { + self.allowed_target_locations.push((target_location, asset_filter)); + self + } + + pub fn allowed_target_location_for( + &self, + destination: &MultiLocation, + ) -> Option<(&MaybePaidLocation, &Option)> { + for (allowed_target_location, asset_filter) in &self.allowed_target_locations { + if destination.starts_with(&allowed_target_location.location) || + destination.eq(&allowed_target_location.location) + { + return Some((allowed_target_location, asset_filter)) + } + } + None + } +} + +/// Type represents all "stored" `BridgeConfig`s. +pub type BridgesConfig = BoundedBTreeMap>; + +/// Builder for creating `BridgesConfig`. +#[derive(Default)] +pub struct BridgesConfigBuilder { + configs: BoundedBTreeMap>, +} +impl BridgesConfigBuilder { + pub fn add_or_panic(mut self, network_id: NetworkId, bridge_config: BridgeConfig) -> Self { + self.configs.try_insert(network_id, bridge_config).expect("check bounds"); + self + } + + pub fn build(self) -> BoundedBTreeMap> { + self.configs + } +} + +/// Adapter for accessing `BridgesConfig`. +pub struct BridgesConfigAdapter(sp_std::marker::PhantomData); + +/// Adapter implementation of `ExporterFor` for `BridgesConfig` +impl> ExporterFor for BridgesConfigAdapter { + fn exporter_for( + network: &NetworkId, + _remote_location: &InteriorMultiLocation, + _message: &Xcm<()>, + ) -> Option<(MultiLocation, Option)> { + Bridges::get().get(network).map(|config| { + (config.bridge_location.location, config.bridge_location.maybe_fee.clone()) + }) + } +} + +/// Adapter implementation of `EnsureReachableDestination` for `BridgesConfig` +impl> EnsureReachableDestination for BridgesConfigAdapter { + fn ensure_destination( + remote_network: NetworkId, + remote_destination: MultiLocation, + ) -> Result { + if let Some(config) = Bridges::get().get(&remote_network) { + if let Some((allowed_target_location, _)) = + config.allowed_target_location_for(&remote_destination) + { + return Ok(ReachableDestination { + bridge: config.bridge_location.clone(), + target: allowed_target_location.clone(), + target_destination: remote_destination, + }) + } + } + Err(ReachableDestinationError::UnsupportedDestination) + } +} diff --git a/parachains/pallets/bridge-transfer/primitives/src/lib.rs b/parachains/pallets/bridge-transfer/primitives/src/lib.rs index 7031779559a..6f7a0151648 100644 --- a/parachains/pallets/bridge-transfer/primitives/src/lib.rs +++ b/parachains/pallets/bridge-transfer/primitives/src/lib.rs @@ -20,8 +20,14 @@ use xcm::prelude::*; +mod asset_filter; +pub use asset_filter::*; + +mod config; +pub use config::*; + /// Represents some `MultiLocation` with information if we need to pay fees or not. -#[derive(Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq)] pub struct MaybePaidLocation { pub location: MultiLocation, pub maybe_fee: Option, diff --git a/parachains/pallets/bridge-transfer/src/features.rs b/parachains/pallets/bridge-transfer/src/features.rs index 8f8e6901207..5e4e168debb 100644 --- a/parachains/pallets/bridge-transfer/src/features.rs +++ b/parachains/pallets/bridge-transfer/src/features.rs @@ -14,83 +14,13 @@ // limitations under the License. use crate::{ - types::{ - AssetFilterT, AssetTransferKind, LatestVersionedMultiLocation, ResolveAssetTransferKind, - }, - AllowedExporters, Config, Pallet, LOG_TARGET, -}; -use frame_support::traits::{Contains, ContainsPair}; -use pallet_bridge_transfer_primitives::{ - EnsureReachableDestination, MaybePaidLocation, ReachableDestination, ReachableDestinationError, + types::{AssetTransferKind, ResolveAssetTransferKind}, + LOG_TARGET, }; +use frame_support::traits::{ContainsPair, Get}; +use pallet_bridge_transfer_primitives::{BridgesConfig, MatchAssetLocation}; use xcm::prelude::*; -use xcm_builder::ExporterFor; - -/// Implementation of `EnsureReachableDestination` which checks on-chain configuration with `AllowedExporters` -impl EnsureReachableDestination for Pallet { - fn ensure_destination( - remote_network: NetworkId, - remote_destination: MultiLocation, - ) -> Result { - match AllowedExporters::::get(&remote_network) { - Some(bridge_config) => { - match bridge_config.allowed_target_location_for(&remote_destination) { - Ok(Some((target_location, _))) => Ok(ReachableDestination { - bridge: bridge_config.to_bridge_location()?, - target: target_location, - target_destination: remote_destination, - }), - Ok(None) => Err(ReachableDestinationError::UnsupportedDestination), - Err(_) => Err(ReachableDestinationError::UnsupportedXcmVersion), - } - }, - None => Err(ReachableDestinationError::UnsupportedDestination), - } - } -} - -/// `ExporterFor` implementation to check if we can transfer anything to `NetworkId` -impl ExporterFor for Pallet { - fn exporter_for( - network: &NetworkId, - _remote_location: &InteriorMultiLocation, - _message: &Xcm<()>, - ) -> Option<(MultiLocation, Option)> { - match Self::allowed_exporters(network) { - Some(bridge_config) => match bridge_config.to_bridge_location() { - Ok(MaybePaidLocation { location, maybe_fee }) => Some((location, maybe_fee)), - Err(e) => { - log::warn!( - target: LOG_TARGET, - "Exporter for network: {:?} has error: {:?}!", - network, e - ); - None - }, - }, - None => None, - } - } -} - -/// Verifies if we have `(MultiLocation, Junction)` in allowed universal aliases. -pub struct AllowedUniversalAliasesOf(sp_std::marker::PhantomData); -impl Contains<(MultiLocation, Junction)> for AllowedUniversalAliasesOf { - fn contains((location, junction): &(MultiLocation, Junction)) -> bool { - log::trace!( - target: LOG_TARGET, - "AllowedUniversalAliasesOf location: {:?}, junction: {:?}", location, junction - ); - - Pallet::::allowed_universal_aliases(LatestVersionedMultiLocation(location)) - .contains(junction) - } -} - -/// Verifies if we can allow `(MultiAsset, MultiLocation)` as trusted reserve received from "bridge". -pub struct IsTrustedBridgedReserveForConcreteAsset(sp_std::marker::PhantomData); -impl ContainsPair - for IsTrustedBridgedReserveForConcreteAsset +use xcm_builder::ensure_is_remote; { fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { log::trace!( @@ -120,68 +50,53 @@ impl ContainsPair } } -/// Verifies if it is allowed for `(MultiAsset, MultiLocation)` to be transferred out as reserve based transfer over "bridge". -pub struct IsAllowedReserveBasedAssetTransferForConcreteAsset(sp_std::marker::PhantomData); -impl ContainsPair - for IsAllowedReserveBasedAssetTransferForConcreteAsset +/// Adapter verifies if it is allowed to transfer out `MultiAsset` to the `MultiLocation`. +/// +/// Note: `MultiLocation` has to be from different global consensus. +pub struct IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation< + UniversalLocation, + Bridges, +>(sp_std::marker::PhantomData<(UniversalLocation, Bridges)>); +impl, Bridges: Get> + ContainsPair + for IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation { - fn contains(asset: &MultiAsset, target_location: &MultiLocation) -> bool { + fn contains(asset: &MultiAsset, to_location: &MultiLocation) -> bool { + let universal_source = UniversalLocation::get(); log::trace!( - target: LOG_TARGET, - "IsAllowedReserveBasedAssetTransferForConcreteAsset asset: {:?}, target_location: {:?}", - asset, target_location + target: "xcm::contains", + "IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation asset: {:?}, to_location: {:?}, universal_source: {:?}", + asset, to_location, universal_source ); + // check remote origin + let (remote_network, _) = match ensure_is_remote(universal_source, *to_location) { + Ok(devolved) => devolved, + Err(_) => { + log::trace!( + target: "xcm::contains", + "IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation to_location: {:?} is not remote to the universal_source: {:?}", + to_location, universal_source + ); + return false + }, + }; + + // check asset location let asset_location = match &asset.id { Concrete(location) => location, _ => return false, }; - match target_location.interior.global_consensus() { - Ok(target_consensus) => { - if let Some(bridge_config) = Pallet::::allowed_exporters(target_consensus) { - match bridge_config.allowed_target_location_for(target_location) { - Ok(Some((_, Some(asset_filter)))) => { - match asset_filter.matches(asset_location) { - Ok(matches) => matches, - Err(e) => { - log::error!( - target: LOG_TARGET, - "IsAllowedReserveBasedAssetTransferForConcreteAsset `asset_filter.matches` has error: {:?} for asset_location: {:?} and target_location: {:?}!", - e, asset_location, target_location - ); - false - }, - } - }, - Ok(_) => false, - Err(e) => { - log::warn!( - target: LOG_TARGET, - "IsAllowedReserveBasedAssetTransferForConcreteAsset allowed_target_location_for has error: {:?} for target_location: {:?}!", - e, target_location - ); - false - }, - } - } else { - log::warn!( - target: LOG_TARGET, - "IsAllowedReserveBasedAssetTransferForConcreteAsset missing configuration for target_consensus: {:?} of target_location: {:?}!", - target_consensus, target_location - ); - false - } - }, - Err(_) => { - log::warn!( - target: LOG_TARGET, - "IsAllowedReserveBasedAssetTransferForConcreteAsset target_location: {:?} does not contain global consensus!", - target_location - ); - false - }, + // check asset according to the config + if let Some(config) = Bridges::get().get(&remote_network) { + if let Some((_, Some(asset_filter))) = config.allowed_target_location_for(&to_location) + { + return asset_filter.matches(asset_location) + } } + + false } } diff --git a/parachains/pallets/bridge-transfer/src/impls.rs b/parachains/pallets/bridge-transfer/src/impls.rs index 8826d2ba33e..a1d155a1c06 100644 --- a/parachains/pallets/bridge-transfer/src/impls.rs +++ b/parachains/pallets/bridge-transfer/src/impls.rs @@ -14,7 +14,7 @@ // limitations under the License. use crate::{ - types::{AssetTransferKind, ResolveAssetTransferKind, UsingVersioned}, + types::{AssetTransferKind, ResolveAssetTransferKind}, Config, Error, Event, Pallet, LOG_TARGET, }; use frame_support::{pallet_prelude::Get, transactional}; @@ -41,12 +41,8 @@ impl Pallet { /// /// Returns: correct remote location, where we should be able to bridge pub(crate) fn ensure_reachable_remote_destination( - remote_destination: VersionedMultiLocation, + remote_destination: MultiLocation, ) -> Result> { - let remote_destination: MultiLocation = remote_destination - .to_versioned() - .map_err(|_| Error::::UnsupportedXcmVersion)?; - let devolved = ensure_is_remote(T::UniversalLocation::get(), remote_destination) .map_err(|_| Error::::UnsupportedDestination)?; let (remote_network, _) = devolved; @@ -72,7 +68,7 @@ impl Pallet { let universal_location_as_sovereign_account_on_target_location = T::UniversalLocation::get() .invert_target(&target_location) - .map_err(|_| Error::::InvalidConfiguration)?; + .map_err(|_| Error::::InvalidTargetLocation)?; // Prepare some XcmContext let xcm_context = XcmContext::with_message_id(unique(reserve_account)); diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index e5347572015..4ed3850ceb6 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -73,7 +73,7 @@ pub use pallet::*; pub use pallet_bridge_transfer_primitives::MaybePaidLocation; -pub use types::{AssetFilterOf, MultiLocationFilterOf}; +// pub use types::{AssetFilterOf, MultiLocationFilterOf}; pub mod features; mod impls; @@ -93,11 +93,8 @@ pub const LOG_TARGET: &str = "runtime::bridge-transfer"; pub mod pallet { pub use crate::weights::WeightInfo; - use crate::types::{ - filter::{AssetFilter, AssetFilterOf, MultiLocationFilterOf}, - BridgeConfig, LatestVersionedMultiLocation, ResolveAssetTransferKind, UsingVersioned, - }; - use frame_support::{pallet_prelude::*, traits::EnsureOriginWithArg, BoundedBTreeSet}; + use crate::types::ResolveAssetTransferKind; + use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; use pallet_bridge_transfer_primitives::EnsureReachableDestination; use sp_std::boxed::Box; @@ -151,6 +148,30 @@ pub mod pallet { } } + #[cfg(feature = "runtime-benchmarks")] + impl BenchmarkHelper for () { + fn bridge_location() -> Option<(NetworkId, MaybePaidLocation)> { + None + } + + fn allowed_bridged_target_location() -> Option { + None + } + + fn prepare_asset_transfer( + ) -> Option<(RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation)> { + None + } + + fn universal_alias() -> Option<(VersionedMultiLocation, Junction)> { + None + } + + fn reserve_location() -> Option { + None + } + } + #[pallet::config] pub trait Config: frame_system::Config { /// The overarching event type. @@ -162,31 +183,6 @@ pub mod pallet { /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; - /// The configurable origin to allow bridges configuration management. - type AdminOrigin: EnsureOrigin; - /// The configurable origin to allow transfer out asset filters management. - type AllowReserveAssetTransferOrigin: EnsureOriginWithArg< - Self::RuntimeOrigin, - AssetFilterOf, - >; - - /// Max allowed universal aliases per one `MultiLocation` - /// (Config for transfer in) - #[pallet::constant] - type UniversalAliasesLimit: Get; - /// Max allowed reserve locations - /// (Config for transfer out) - #[pallet::constant] - type ReserveLocationsLimit: Get; - /// Max allowed assets for one reserve location - /// (Config for transfer in/out) - #[pallet::constant] - type AssetsPerReserveLocationLimit: Get; - /// Max allowed target locations per exporter (bridged network) - /// (Config for transfer out) - #[pallet::constant] - type TargetLocationsPerExporterLimit: Get; - /// How to withdraw and deposit an asset for reserve. /// (Config for transfer out) type AssetTransactor: TransactAsset; @@ -210,46 +206,14 @@ pub mod pallet { type BenchmarkHelper: BenchmarkHelper; } - /// Details of configured bridges which are allowed for **transfer out**. - /// (Config for transfer out) - #[pallet::storage] - #[pallet::getter(fn allowed_exporters)] - pub(super) type AllowedExporters = - StorageMap<_, Blake2_128Concat, NetworkId, BridgeConfig>; - - /// Holds allowed mappings `MultiLocation->Junction` for `UniversalAliases` - /// E.g: - /// BridgeHubMultiLocation1 -> NetworkId::Kusama - /// BridgeHubMultiLocation1 -> NetworkId::Polkadot - /// (Config for transfer in) - #[pallet::storage] - #[pallet::getter(fn allowed_universal_aliases)] - pub(super) type AllowedUniversalAliases = StorageMap< - _, - Blake2_128Concat, - VersionedMultiLocation, - BoundedBTreeSet, - ValueQuery, - >; - - /// Holds allowed mappings `MultiLocation` as trusted reserve locations for allowed assets - /// (Config for transfer in) - #[pallet::storage] - #[pallet::getter(fn allowed_reserve_locations)] - pub(super) type AllowedReserveLocations = - StorageMap<_, Blake2_128Concat, VersionedMultiLocation, AssetFilterOf, OptionQuery>; - #[pallet::error] #[cfg_attr(test, derive(PartialEq))] pub enum Error { - InvalidConfiguration, - InvalidBridgeConfiguration, - UnavailableConfiguration, - ConfigurationAlreadyExists, InvalidAssets, AssetsLimitReached, UnsupportedDestination, UnsupportedXcmVersion, + InvalidTargetLocation, InvalidRemoteDestination, BridgeCallError, FailedToReserve, @@ -274,25 +238,6 @@ pub mod pallet { ReserveAssetsDeposited { from: MultiLocation, to: MultiLocation, assets: MultiAssets }, /// Assets were withdrawn AssetsWithdrawn { from: MultiLocation, assets: MultiAssets }, - - /// New bridge configuration was added - BridgeAdded, - /// Bridge configuration was removed - BridgeRemoved, - /// Bridge fee configuration was updated - BridgeFeeUpdated, - /// Target location for bridge was updated - BridgeTargetLocationUpdated, - - /// New universal alias was added - UniversalAliasAdded, - /// New universal alias was removed - UniversalAliasRemoved { junction: Junction }, - - /// New reserve location was added - ReserveLocationAdded, - /// New reserve location was removed - ReserveLocationRemoved, } #[pallet::call] @@ -314,15 +259,14 @@ pub mod pallet { let origin_location = T::AssetTransferOrigin::ensure_origin(origin)?; // Check if remote destination is reachable - let destination = Self::ensure_reachable_remote_destination(*destination)?; + let destination = Self::ensure_reachable_remote_destination( + (*destination).try_into().map_err(|()| Error::::InvalidRemoteDestination)?, + )?; // Check assets (lets leave others checks on `AssetTransactor`) let assets: MultiAssets = (*assets).try_into().map_err(|()| Error::::InvalidAssets)?; - ensure!( - assets.len() <= T::AssetsLimit::get() as usize, - Error::::AssetsLimitReached - ); + ensure!(assets.len() <= T::AssetsLimit::get() as usize, Error::::AssetsLimitReached); // Do this in transaction (explicitly), the rollback should occur in case of any error and no assets will be trapped or lost Self::initiate_transfer_asset_via_bridge_in_transaction( @@ -331,317 +275,5 @@ pub mod pallet { assets, ) } - - /// Adds new bridge exporter, which allows transfer to this `bridged_network`. - /// - /// Parameters: - /// - /// * `bridged_network`: Network where we want to allow transfer funds - /// * `bridge_config`: contains location for BridgeHub in our network + fee - #[pallet::call_index(1)] - #[pallet::weight(T::WeightInfo::add_exporter_config())] - pub fn add_exporter_config( - origin: OriginFor, - bridged_network: NetworkId, - bridge_location: Box, - bridge_location_fee: Option>, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - - // allow just one exporter for one network (can be changed in future) - ensure!( - !AllowedExporters::::contains_key(bridged_network), - Error::::ConfigurationAlreadyExists - ); - - // check bridge is from local consensus - ensure!( - bridge_location - .using_versioned_ref(|versioned| versioned.parents) - .map_err(|_| Error::::UnsupportedXcmVersion)? <= - 1, - Error::::InvalidConfiguration - ); - - // insert - AllowedExporters::::insert( - bridged_network, - BridgeConfig::new(*bridge_location, bridge_location_fee.map(|fee| *fee)), - ); - - Self::deposit_event(Event::BridgeAdded); - Ok(()) - } - - /// Remove bridge configuration for specified `bridged_network`. - /// - /// Parameters: - /// - /// * `bridged_network`: Network where we want to remove - #[pallet::call_index(2)] - #[pallet::weight(T::WeightInfo::remove_exporter_config())] - pub fn remove_exporter_config( - origin: OriginFor, - bridged_network: NetworkId, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - ensure!( - AllowedExporters::::contains_key(bridged_network), - Error::::UnavailableConfiguration - ); - - AllowedExporters::::remove(bridged_network); - Self::deposit_event(Event::BridgeRemoved); - Ok(()) - } - - /// Updates bridge configuration for specified `bridged_network`. - /// - /// Parameters: - /// - /// * `bridged_network`: Network where we want to remove - /// * `bridge_location_fee`: New fee to update - #[pallet::call_index(3)] - #[pallet::weight(T::WeightInfo::update_exporter_config())] - pub fn update_exporter_config( - origin: OriginFor, - bridged_network: NetworkId, - bridge_location_fee: Option>, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - - AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { - let bridge_config = - maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; - bridge_config.bridge_location_fee = bridge_location_fee.map(|fee| *fee); - Self::deposit_event(Event::BridgeFeeUpdated); - Ok(()) - }) - } - - /// Alters bridge configuration with asset filter, which allows to send out matched assets to the `target_location` - /// - /// Parameters: - /// - /// * `bridged_network`: bridge identifier - /// * `target_location`: target location where we want to allow send assets - /// * `asset_filter`: asset filter to add - #[pallet::call_index(4)] - #[pallet::weight(T::WeightInfo::update_bridged_target_location())] - pub fn update_bridged_target_location( - origin: OriginFor, - bridged_network: NetworkId, - target_location: Box, - max_target_location_fee: Option>, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - ensure!( - T::TargetLocationsPerExporterLimit::get() > 0, - Error::::UnavailableConfiguration - ); - - AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { - let bridge_config = - maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; - bridge_config - .update_allowed_target_location( - *target_location, - max_target_location_fee.map(|fee| *fee), - ) - .map_err(|_| Error::::InvalidBridgeConfiguration)?; - Self::deposit_event(Event::BridgeTargetLocationUpdated); - Ok(()) - }) - } - - /// Alters bridge configuration with asset filter, which allows to send out matched assets to the `target_location` - /// - /// Parameters: - /// - /// * `bridged_network`: bridge identifier - /// * `target_location`: target location where we want to allow send assets - /// * `asset_filter`: asset filter to add - #[pallet::call_index(6)] - #[pallet::weight(T::WeightInfo::allow_reserve_asset_transfer_for())] - pub fn allow_reserve_asset_transfer_for( - origin: OriginFor, - bridged_network: NetworkId, - target_location: Box, - asset_filter: AssetFilterOf, - ) -> DispatchResult { - let _ = T::AllowReserveAssetTransferOrigin::ensure_origin(origin, &asset_filter)?; - ensure!( - T::TargetLocationsPerExporterLimit::get() > 0, - Error::::UnavailableConfiguration - ); - - AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { - let bridge_config = - maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; - let was_added = bridge_config - .add_allowed_target_location_filter_for(*target_location, asset_filter) - .map_err(|_| Error::::InvalidBridgeConfiguration)?; - if was_added { - Self::deposit_event(Event::ReserveLocationAdded); - } - Ok(()) - }) - } - - /// Add `(MultiLocation, Junction)` mapping to `AllowedUniversalAliases` - /// - /// Parameters: - /// - /// * `location`: key - /// * `junction`: value - #[pallet::call_index(8)] - #[pallet::weight(T::WeightInfo::add_universal_alias())] - pub fn add_universal_alias( - origin: OriginFor, - location: Box, - junction: Junction, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - - let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) - .map_err(|_| Error::::UnsupportedXcmVersion)?; - AllowedUniversalAliases::::try_mutate(versioned_location, |junctions| { - if junctions.try_insert(junction).map_err(|_| Error::::InvalidConfiguration)? { - Self::deposit_event(Event::UniversalAliasAdded); - } - Ok(()) - }) - } - - /// Remove `(MultiLocation, Junction)` mapping from `AllowedUniversalAliases` - /// - /// Parameters: - /// - /// * `location`: key - /// * `junction`: value - #[pallet::call_index(9)] - #[pallet::weight(T::WeightInfo::remove_universal_alias())] - pub fn remove_universal_alias( - origin: OriginFor, - location: Box, - junctions_to_remove: sp_std::prelude::Vec, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - - let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) - .map_err(|_| Error::::UnsupportedXcmVersion)?; - AllowedUniversalAliases::::try_mutate_exists(versioned_location, |maybe_junctions| { - let junctions = - maybe_junctions.as_mut().ok_or(Error::::UnavailableConfiguration)?; - for jtr in junctions_to_remove { - if junctions.remove(&jtr) { - Self::deposit_event(Event::UniversalAliasRemoved { junction: jtr }); - } - } - - if junctions.is_empty() { - // no junctions, so remove entry from storage - *maybe_junctions = None; - } - - Ok(()) - }) - } - - /// Add `MultiLocation` + `AssetFilter` mapping to `AllowedReserveLocations` - /// - /// Parameters: - /// - /// * `location`: as reserve `MultiLocation` - /// * `asset_filter_to_add`: filter we want to add for that location - #[pallet::call_index(10)] - #[pallet::weight(T::WeightInfo::add_reserve_location())] - pub fn add_reserve_location( - origin: OriginFor, - location: Box, - asset_filter_to_add: AssetFilterOf, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - ensure!(T::ReserveLocationsLimit::get() > 0, Error::::UnavailableConfiguration); - ensure!( - T::AssetsPerReserveLocationLimit::get() > 0, - Error::::UnavailableConfiguration - ); - - let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) - .map_err(|_| Error::::UnsupportedXcmVersion)?; - AllowedReserveLocations::::try_mutate(versioned_location, |filter| { - let was_added = match filter { - Some(old_filter) => old_filter - .add(asset_filter_to_add) - .map_err(|_| Error::::InvalidConfiguration)?, - None => { - *filter = Some(asset_filter_to_add); - true - }, - }; - if was_added { - Self::deposit_event(Event::ReserveLocationAdded); - } - Ok(()) - }) - } - - /// Remove `MultiLocation` mapping from `AllowedReserveLocations`. - /// - /// Parameters: - /// - /// * `location`: as reserve `MultiLocation` - /// * `asset_filter_to_remove`: if `None` the whole `location` entry will be removed, otherwise only selected filters - #[pallet::call_index(11)] - #[pallet::weight(T::WeightInfo::remove_reserve_location())] - pub fn remove_reserve_location( - origin: OriginFor, - location: Box, - asset_filter_to_remove: Option>, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - - let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) - .map_err(|_| Error::::UnsupportedXcmVersion)?; - let (mut was_removed, remove_location) = if let Some(asset_filter_to_remove) = - asset_filter_to_remove - { - AllowedReserveLocations::::try_mutate_exists( - versioned_location, - |maybe_filter| { - let filter = - maybe_filter.as_mut().ok_or(Error::::UnavailableConfiguration)?; - match filter { - AssetFilter::ByMultiLocation(old) => { - let was_removed = old.remove(asset_filter_to_remove); - was_removed.map(|wr| (wr, old.is_empty())).map_err(Into::into) - }, - AssetFilter::All => Err(Error::::UnavailableConfiguration), - } - }, - )? - } else { - (false, true) - }; - - if remove_location { - was_removed |= AllowedReserveLocations::::try_mutate_exists(location, |value| { - let exists = value.is_some(); - if exists { - *value = None; - } - Ok::<_, Error>(exists) - }) - .map_err(|_| Error::::InvalidConfiguration)?; - } - - if was_removed { - Self::deposit_event(Event::ReserveLocationRemoved); - Ok(()) - } else { - Err(Error::::InvalidConfiguration.into()) - } - } } } diff --git a/parachains/pallets/bridge-transfer/src/tests.rs b/parachains/pallets/bridge-transfer/src/tests.rs index 3f6d600f0f1..6143d25a23f 100644 --- a/parachains/pallets/bridge-transfer/src/tests.rs +++ b/parachains/pallets/bridge-transfer/src/tests.rs @@ -14,26 +14,24 @@ // limitations under the License. use crate as bridge_transfer; -use frame_support::traits::{AsEnsureOriginWithArg, ConstU32, Contains, ContainsPair, Currency}; use crate::{ features::{ - AllowedUniversalAliasesOf, ConcreteAssetTransferKindResolver, - IsAllowedReserveBasedAssetTransferForConcreteAsset, - IsTrustedBridgedReserveForConcreteAsset, + ConcreteAssetTransferKindResolver, + IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation, }, - pallet::{AllowedReserveLocations, AllowedUniversalAliases}, - types::{ - filter::{AssetFilter, MultiLocationFilter}, - AssetTransferKind, BridgeConfig, LatestVersionedMultiLocation, ResolveAssetTransferKind, - }, - AllowedExporters, Config, Error, Event, + Config, Error, Event, }; use frame_support::{ - assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, BoundedVec, + assert_noop, assert_ok, + dispatch::DispatchError, + parameter_types, sp_io, sp_tracing, + traits::{ConstU32, Currency}, +}; +use pallet_bridge_transfer_primitives::{ + AssetFilter, BridgeConfig, BridgesConfig, BridgesConfigAdapter, BridgesConfigBuilder, + MaybePaidLocation, ReachableDestination, }; -use frame_system::EnsureRoot; -use pallet_bridge_transfer_primitives::{MaybePaidLocation, ReachableDestination}; use polkadot_parachain::primitives::Sibling; use sp_runtime::{ testing::{Header, H256}, @@ -43,9 +41,8 @@ use sp_runtime::{ use sp_version::RuntimeVersion; use xcm::prelude::*; use xcm_builder::{ - AccountId32Aliases, CurrencyAdapter, EnsureXcmOrigin, ExporterFor, - GlobalConsensusParachainConvertsFor, IsConcrete, SiblingParachainConvertsVia, - SignedToAccountId32, UnpaidRemoteExporter, + AccountId32Aliases, CurrencyAdapter, EnsureXcmOrigin, GlobalConsensusParachainConvertsFor, + IsConcrete, SiblingParachainConvertsVia, SignedToAccountId32, UnpaidRemoteExporter, }; use xcm_executor::traits::ConvertLocation; @@ -130,14 +127,39 @@ impl pallet_balances::Config for TestRuntime { parameter_types! { pub const BridgedNetwork: NetworkId = NetworkId::ByGenesis([4; 32]); + pub BridgeLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(1013))); + pub TargetLocation: MultiLocation = MultiLocation::new(2, X2(GlobalConsensus(BridgedNetwork::get()), Parachain(1000))); + // pub TargetLocationFee: Option = Some((MultiLocation::parent(), 1_000_000).into()); + pub TargetLocationFee: Option = None; + pub const RelayNetwork: NetworkId = NetworkId::ByGenesis([9; 32]); pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(1000)); // Relay chain currency/balance location (e.g. KsmLocation, DotLocation, ..) pub const RelayLocation: MultiLocation = MultiLocation::parent(); + + pub Bridges: BridgesConfig = BridgesConfigBuilder::default() + .add_or_panic( + BridgedNetwork::get(), + BridgeConfig::new( + MaybePaidLocation { + location: BridgeLocation::get(), + maybe_fee: None, + } + ).add_target_location( + MaybePaidLocation { + location: TargetLocation::get(), + maybe_fee: TargetLocationFee::get(), + }, + Some(AssetFilter::All) + ) + ) + .build(); + } std::thread_local! { static ROUTED_MESSAGE: std::cell::RefCell>> = std::cell::RefCell::new(None); + static NOT_APPLICABLE_AS_SOME_OR_FAIL_ROUTER_SWITCH: std::cell::RefCell> = std::cell::RefCell::new(Some(())); } pub struct ThreadLocalXcmRouter; @@ -168,8 +190,8 @@ impl SendXcm for ThreadLocalXcmRouter { } } -pub struct NotApplicableOrFailOnParachain2222XcmRouter; -impl SendXcm for NotApplicableOrFailOnParachain2222XcmRouter { +pub struct NotApplicableOrFailRouter; +impl SendXcm for NotApplicableOrFailRouter { type Ticket = Option>; fn validate( @@ -178,14 +200,14 @@ impl SendXcm for NotApplicableOrFailOnParachain2222XcmRouter { ) -> SendResult { log::info!( target: super::LOG_TARGET, - "[NotApplicableOrFailOnParachain2222XcmRouter]: destination: {:?}, message: {:?}", + "[NotApplicableOrFailRouter]: destination: {:?}, message: {:?}", destination, message ); - if matches!( - destination, - Some(MultiLocation { interior: X1(Parachain(Self::UNROUTABLE_PARA_ID)), parents: 1 }) - ) { + + let wanna_fail = + NOT_APPLICABLE_AS_SOME_OR_FAIL_ROUTER_SWITCH.with(|s| s.borrow().is_none()); + if wanna_fail { Err(SendError::Transport("Simulate what ever error")) } else { Err(SendError::NotApplicable) @@ -197,14 +219,11 @@ impl SendXcm for NotApplicableOrFailOnParachain2222XcmRouter { } } -impl NotApplicableOrFailOnParachain2222XcmRouter { - const UNROUTABLE_PARA_ID: u32 = 2222; -} - -pub type XcmRouter = (NotApplicableOrFailOnParachain2222XcmRouter, ThreadLocalXcmRouter); +pub type XcmRouter = (NotApplicableOrFailRouter, ThreadLocalXcmRouter); /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus -pub type TestBridgeXcmSender = UnpaidRemoteExporter; +pub type TestBridgeXcmSender = + UnpaidRemoteExporter, XcmRouter, UniversalLocation>; /// No local origins on this chain are allowed to dispatch XCM sends/executions. pub type LocalOriginToLocation = SignedToAccountId32; @@ -233,45 +252,8 @@ pub type CurrencyTransactor = CurrencyAdapter< (), >; -/// Benchmarks helper. -#[cfg(feature = "runtime-benchmarks")] -pub struct TestBenchmarkHelper; - -#[cfg(feature = "runtime-benchmarks")] -impl BenchmarkHelper for TestBenchmarkHelper { - fn bridge_config() -> (NetworkId, BridgeConfig) { - test_bridge_config() - } - - fn prepare_asset_transfer() -> (RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation) { - let assets_count = MaxAssetsLimit::get(); - - // sender account must have enough funds - let sender_account = account(1); - let total_deposit = ExistentialDeposit::get() * (1 + assets_count as u64); - let _ = Balances::deposit_creating(&sender_account, total_deposit); - - // finally - prepare assets and destination - let assets = VersionedMultiAssets::V3( - std::iter::repeat(MultiAsset { - fun: Fungible(ExistentialDeposit::get().into()), - id: Concrete(RelayLocation::get()), - }) - .take(assets_count as usize) - .collect::>() - .into(), - ); - let destination = VersionedMultiLocation::V3(MultiLocation::new( - 2, - X3(GlobalConsensus(Wococo), Parachain(1000), consensus_account(Wococo, 2)), - )); - - (RuntimeOrigin::signed(sender_account), assets, destination) - } -} - parameter_types! { - pub const TrapCode: u64 = 12345; + // na constantu pub const AssetsLimit: u8 = 1; } @@ -279,23 +261,17 @@ impl Config for TestRuntime { type RuntimeEvent = RuntimeEvent; type UniversalLocation = UniversalLocation; type WeightInfo = (); - type AdminOrigin = EnsureRoot; - type AllowReserveAssetTransferOrigin = AsEnsureOriginWithArg>; - type UniversalAliasesLimit = ConstU32<2>; - type ReserveLocationsLimit = ConstU32<2>; - type AssetsPerReserveLocationLimit = ConstU32<2>; - type TargetLocationsPerExporterLimit = ConstU32<2>; type AssetTransactor = CurrencyTransactor; type AssetTransferKindResolver = ConcreteAssetTransferKindResolver< - IsTrustedBridgedReserveForConcreteAsset, - IsAllowedReserveBasedAssetTransferForConcreteAsset, + frame_support::traits::Nothing, + IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation, >; type AssetTransferOrigin = EnsureXcmOrigin; type AssetsLimit = AssetsLimit; - type BridgedDestinationValidator = BridgeTransfer; + type BridgedDestinationValidator = BridgesConfigAdapter; type BridgeXcmSender = TestBridgeXcmSender; #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = TestBenchmarkHelper; + type BenchmarkHelper = (); } pub(crate) fn new_test_ext() -> sp_io::TestExternalities { @@ -322,84 +298,61 @@ fn consensus_account(network: NetworkId, account: u8) -> Junction { #[test] fn test_ensure_reachable_remote_destination() { new_test_ext().execute_with(|| { - // insert exporter config + allowed target location let bridged_network = BridgedNetwork::get(); - let bridge_location = MultiLocation::new(1, X1(Parachain(1013))); - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(bridge_location.clone().into_versioned()), - None, - )); - let target_location: MultiLocation = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); - assert_ok!(BridgeTransfer::update_bridged_target_location( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - Some(Box::new(target_location_fee.clone().into())), - )); - - // v2 not supported - assert_eq!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V2( - xcm::v2::MultiLocation::default() - )), - Err(Error::::UnsupportedDestination) - ); // v3 - "parent: 0" wrong assert_eq!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(0, X2(GlobalConsensus(bridged_network), Parachain(1000))) + BridgeTransfer::ensure_reachable_remote_destination(MultiLocation::new( + 0, + X2(GlobalConsensus(bridged_network), Parachain(1000)) )), Err(Error::::UnsupportedDestination) ); // v3 - "parent: 1" wrong assert_eq!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(1, X2(GlobalConsensus(bridged_network), Parachain(1000))) + BridgeTransfer::ensure_reachable_remote_destination(MultiLocation::new( + 1, + X2(GlobalConsensus(bridged_network), Parachain(1000)) )), Err(Error::::UnsupportedDestination) ); // v3 - Rococo is not supported assert_eq!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))) + BridgeTransfer::ensure_reachable_remote_destination(MultiLocation::new( + 2, + X2(GlobalConsensus(Rococo), Parachain(1000)) )), Err(Error::::UnsupportedDestination) ); // v3 - remote_destination is not allowed assert_eq!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1234))) + BridgeTransfer::ensure_reachable_remote_destination(MultiLocation::new( + 2, + X2(GlobalConsensus(bridged_network), Parachain(1234)) )), Err(Error::::UnsupportedDestination) ); // v3 - ok (allowed) assert_ok!( - BridgeTransfer::ensure_reachable_remote_destination(VersionedMultiLocation::V3( - MultiLocation::new( - 2, - X3( - GlobalConsensus(bridged_network), - Parachain(1000), - consensus_account(bridged_network, 35) - ) - ), - )), + BridgeTransfer::ensure_reachable_remote_destination(MultiLocation::new( + 2, + X3( + GlobalConsensus(bridged_network), + Parachain(1000), + consensus_account(bridged_network, 35) + ) + ),), ReachableDestination { - bridge: MaybePaidLocation { location: bridge_location, maybe_fee: None }, + bridge: MaybePaidLocation { location: BridgeLocation::get(), maybe_fee: None }, target: MaybePaidLocation { location: MultiLocation::new( 2, X2(GlobalConsensus(bridged_network), Parachain(1000)) ), - maybe_fee: Some(target_location_fee), + maybe_fee: TargetLocationFee::get(), }, target_destination: MultiLocation::new( 2, @@ -427,30 +380,8 @@ fn test_transfer_asset_via_bridge_for_currency_works() { // because, sovereign account needs to have ED otherwise reserve fails assert!(balance_to_transfer >= ExistentialDeposit::get()); - // insert bridge config let bridged_network = BridgedNetwork::get(); - let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(bridge_location.into_versioned()), - None, - )); - // insert allowed reserve asset and allow all - let target_location: MultiLocation = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - assert_ok!(BridgeTransfer::update_bridged_target_location( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - None, - )); - assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::All, - )); + let target_location = TargetLocation::get(); // checks before assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); @@ -519,6 +450,7 @@ fn test_transfer_asset_via_bridge_for_currency_works() { } if network == &bridged_network ) }) { + println!("{:?}", xcm.0); assert!(xcm.0.iter().any(|instr| matches!(instr, UnpaidExecution { .. }))); assert!(xcm.0.iter().any(|instr| matches!(instr, ReserveAssetDeposited(..)))); assert!(xcm.0.iter().any(|instr| matches!(instr, DepositAsset { .. }))); @@ -542,34 +474,8 @@ fn test_transfer_asset_via_bridge_in_case_of_error_transactional_works() { // because, sovereign account needs to have ED otherwise reserve fails assert!(balance_to_transfer >= ExistentialDeposit::get()); - // insert bridge config (with unroutable bridge_location - 2222) let bridged_network = BridgedNetwork::get(); - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new( - MultiLocation::new( - 1, - Parachain(NotApplicableOrFailOnParachain2222XcmRouter::UNROUTABLE_PARA_ID) - ) - .into_versioned() - ), - None, - )); - let target_location = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - assert_ok!(BridgeTransfer::update_bridged_target_location( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - None, - )); - assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.into_versioned()), - AssetFilter::All, - )); + let target_location = TargetLocation::get(); // checks before assert!(ROUTED_MESSAGE.with(|r| r.borrow().is_none())); @@ -600,6 +506,9 @@ fn test_transfer_asset_via_bridge_in_case_of_error_transactional_works() { // reset events System::reset_events(); + // Simulate XcmRouter failure + NOT_APPLICABLE_AS_SOME_OR_FAIL_ROUTER_SWITCH.with(|s| *s.borrow_mut() = None); + // trigger asset transfer assert_noop!( BridgeTransfer::transfer_asset_via_bridge( @@ -609,7 +518,7 @@ fn test_transfer_asset_via_bridge_in_case_of_error_transactional_works() { ), DispatchError::Module(ModuleError { index: 52, - error: [9, 0, 0, 0], + error: [6, 0, 0, 0], message: Some("BridgeCallError") }) ); @@ -624,460 +533,3 @@ fn test_transfer_asset_via_bridge_in_case_of_error_transactional_works() { assert!(System::events().is_empty()); }); } - -#[test] -fn allowed_exporters_management_works() { - let bridged_network = BridgedNetwork::get(); - let bridge_location = MultiLocation::new(1, X1(Parachain(1013))); - let dummy_xcm = Xcm(vec![]); - let dummy_remote_interior_multilocation = X1(Parachain(1234)); - - new_test_ext().execute_with(|| { - assert_eq!(AllowedExporters::::iter().count(), 0); - - // should fail - just root is allowed - assert_noop!( - BridgeTransfer::add_exporter_config( - RuntimeOrigin::signed(account(1)), - bridged_network, - Box::new(bridge_location.clone().into_versioned()), - None - ), - DispatchError::BadOrigin - ); - - // should fail - we expect local bridge - assert_noop!( - BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(MultiLocation::new(2, X1(Parachain(1234))).into_versioned()), - None - ), - DispatchError::Module(ModuleError { - index: 52, - error: [0, 0, 0, 0], - message: Some("InvalidConfiguration") - }) - ); - assert_eq!(AllowedExporters::::iter().count(), 0); - assert_eq!( - BridgeTransfer::exporter_for( - &bridged_network, - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - None - ); - - // add with root - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(bridge_location.clone().into_versioned()), - None - )); - assert_eq!(AllowedExporters::::iter().count(), 1); - assert_eq!( - AllowedExporters::::get(bridged_network), - Some(BridgeConfig::new(VersionedMultiLocation::from(bridge_location), None)) - ); - assert_eq!(AllowedExporters::::get(&RelayNetwork::get()), None); - assert_eq!( - BridgeTransfer::exporter_for( - &bridged_network, - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - Some((bridge_location.clone(), None)) - ); - assert_eq!( - BridgeTransfer::exporter_for( - &RelayNetwork::get(), - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - None - ); - - // update fee - // remove - assert_ok!(BridgeTransfer::update_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Some(VersionedMultiAsset::V3((Parent, 200u128).into()).into()), - )); - assert_eq!(AllowedExporters::::iter().count(), 1); - assert_eq!( - AllowedExporters::::get(bridged_network), - Some(BridgeConfig::new( - VersionedMultiLocation::from(bridge_location), - Some((Parent, 200u128).into()) - )) - ); - assert_eq!( - BridgeTransfer::exporter_for( - &bridged_network, - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - Some((bridge_location, Some((Parent, 200u128).into()))) - ); - - // remove - assert_ok!(BridgeTransfer::remove_exporter_config(RuntimeOrigin::root(), bridged_network,)); - assert_eq!(AllowedExporters::::get(bridged_network), None); - assert_eq!(AllowedExporters::::iter().count(), 0); - }) -} - -#[test] -fn allowed_universal_aliases_management_works() { - new_test_ext().execute_with(|| { - assert_eq!(AllowedUniversalAliases::::iter().count(), 0); - - let location1 = MultiLocation::new(1, X1(Parachain(1014))); - let junction1 = GlobalConsensus(ByGenesis([1; 32])); - let junction2 = GlobalConsensus(ByGenesis([2; 32])); - - // should fail - just root is allowed - assert_noop!( - BridgeTransfer::add_universal_alias( - RuntimeOrigin::signed(account(1)), - Box::new(VersionedMultiLocation::V3(location1.clone())), - junction1.clone(), - ), - DispatchError::BadOrigin - ); - assert_eq!(AllowedUniversalAliases::::iter().count(), 0); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - - // add ok - assert_ok!(BridgeTransfer::add_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - junction1.clone(), - )); - assert_ok!(BridgeTransfer::add_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - junction2.clone(), - )); - assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - assert_eq!(AllowedUniversalAliases::::iter().count(), 1); - - // remove ok - assert_ok!(BridgeTransfer::remove_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - vec![junction1.clone()], - )); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - assert_eq!(AllowedUniversalAliases::::iter().count(), 1); - - assert_ok!(BridgeTransfer::remove_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - vec![junction2.clone()], - )); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - assert_eq!(AllowedUniversalAliases::::iter().count(), 0); - }) -} - -#[test] -fn allowed_reserve_locations_management_works() { - new_test_ext().execute_with(|| { - assert_eq!(0, AllowedReserveLocations::::iter_values().count()); - - let location1 = MultiLocation::new(1, X1(Parachain(1014))); - let location1_as_latest = VersionedMultiLocation::from(location1.clone()); - let location1_as_latest_as_key = - LatestVersionedMultiLocation::try_from(&location1_as_latest).expect("ok"); - let location2 = - MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([1; 32])), Parachain(1014))); - let location2_as_latest = VersionedMultiLocation::from(location2.clone()); - let location2_as_key = - LatestVersionedMultiLocation::try_from(&location2_as_latest).expect("ok"); - - let asset_location = MultiLocation::parent(); - let asset: MultiAsset = (asset_location, 200u128).into(); - - let asset_filter_for_asset_by_multilocation = MultiLocationFilter { - equals_any: BoundedVec::truncate_from(vec![asset_location.into_versioned()]), - starts_with_any: Default::default(), - }; - let asset_filter_for_asset = - AssetFilter::ByMultiLocation(asset_filter_for_asset_by_multilocation.clone()); - let asset_filter_for_other_by_multilocation = MultiLocationFilter { - equals_any: BoundedVec::truncate_from(vec![ - MultiLocation::new(3, Here).into_versioned() - ]), - starts_with_any: Default::default(), - }; - let asset_filter_for_other = - AssetFilter::ByMultiLocation(asset_filter_for_other_by_multilocation.clone()); - - type AssetTransferKindResolver = ConcreteAssetTransferKindResolver< - IsTrustedBridgedReserveForConcreteAsset, - (), - >; - - // should fail - just root is allowed - assert_noop!( - BridgeTransfer::add_reserve_location( - RuntimeOrigin::signed(account(1)), - Box::new(location1_as_latest.clone()), - asset_filter_for_asset.clone(), - ), - DispatchError::BadOrigin - ); - assert!(AllowedReserveLocations::::get(&location1_as_latest_as_key).is_none()); - assert!(AllowedReserveLocations::::get(&location2_as_key).is_none()); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - AssetTransferKindResolver::resolve(&asset, &location1), - AssetTransferKind::Unsupported - ); - assert_eq!( - AssetTransferKindResolver::resolve(&asset, &location2), - AssetTransferKind::Unsupported - ); - - // add ok - assert_ok!(BridgeTransfer::add_reserve_location( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - asset_filter_for_asset.clone() - )); - assert_ok!(BridgeTransfer::add_reserve_location( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location2.clone())), - asset_filter_for_other.clone() - )); - assert_eq!(2, AllowedReserveLocations::::iter_values().count()); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - AssetTransferKindResolver::resolve(&asset, &location1), - AssetTransferKind::WithdrawReserve - ); - assert_eq!( - AssetTransferKindResolver::resolve(&asset, &location2), - AssetTransferKind::Unsupported - ); - - assert_ok!(BridgeTransfer::add_reserve_location( - RuntimeOrigin::root(), - Box::new(location2_as_latest.clone()), - asset_filter_for_asset.clone() - )); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - AssetTransferKindResolver::resolve(&asset, &location2), - AssetTransferKind::WithdrawReserve - ); - - // test remove - assert_noop!( - BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location1_as_latest.clone()), - Some(asset_filter_for_other_by_multilocation.clone()) - ), - DispatchError::Module(ModuleError { - index: 52, - error: [0, 0, 0, 0], - message: Some("UnavailableConfiguration") - }) - ); - - assert_ok!(BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location1_as_latest.clone()), - Some(asset_filter_for_asset_by_multilocation.clone()) - )); - assert_eq!(1, AllowedReserveLocations::::iter_values().count()); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - AssetTransferKindResolver::resolve(&asset, &location1), - AssetTransferKind::Unsupported - ); - assert_eq!( - AssetTransferKindResolver::resolve(&asset, &location2), - AssetTransferKind::WithdrawReserve - ); - - assert_ok!(BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location2_as_latest.clone()), - Some(asset_filter_for_other_by_multilocation.clone()) - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - AssetTransferKindResolver::resolve(&asset, &location1), - AssetTransferKind::Unsupported - ); - assert_eq!( - AssetTransferKindResolver::resolve(&asset, &location2), - AssetTransferKind::WithdrawReserve - ); - - assert_ok!(BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location2_as_latest), - Some(asset_filter_for_asset_by_multilocation) - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - assert_eq!( - AssetTransferKindResolver::resolve(&asset, &location1), - AssetTransferKind::Unsupported - ); - assert_eq!( - AssetTransferKindResolver::resolve(&asset, &location2), - AssetTransferKind::Unsupported - ); - }) -} - -#[test] -fn allowed_bridged_target_location_management_works() { - new_test_ext().execute_with(|| { - assert_eq!(0, AllowedExporters::::iter_values().count()); - - let bridged_network = BridgedNetwork::get(); - let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); - let target_location: MultiLocation = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - - type AssetTransferKindResolver = ConcreteAssetTransferKindResolver< - (), - IsAllowedReserveBasedAssetTransferForConcreteAsset, - >; - - // should fail - we need BridgeConfig first - assert_noop!( - BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::All, - ), - DispatchError::Module(ModuleError { - index: 52, - error: [2, 0, 0, 0], - message: Some("UnavailableConfiguration") - }) - ); - - // add bridge config - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(bridge_location.into_versioned()), - None, - )); - - // should fail - we need also target_location first - assert_noop!( - BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::All, - ), - DispatchError::Module(ModuleError { - index: 52, - error: [1, 0, 0, 0], - message: Some("InvalidBridgeConfiguration") - }) - ); - - // insert allowed target location - assert_ok!(BridgeTransfer::update_bridged_target_location( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - None, - )); - - let asset1_location = MultiLocation::new(2, X2(Parachain(1235), Parachain(5678))); - let asset1 = MultiAsset::from((asset1_location, 1000)); - assert_eq!( - AssetTransferKindResolver::resolve(&asset1, &target_location), - AssetTransferKind::Unsupported - ); - - // now should pass - add one start_with pattern - assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::ByMultiLocation(MultiLocationFilter { - equals_any: Default::default(), - starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( - 2, - X1(Parachain(2223)) - ) - .into_versioned()]), - }), - )); - - // not allowed yet - assert_eq!( - AssetTransferKindResolver::resolve(&asset1, &target_location), - AssetTransferKind::Unsupported - ); - - // now should pass - add another start_with pattern - assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::ByMultiLocation(MultiLocationFilter { - equals_any: Default::default(), - starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( - 2, - X1(Parachain(1235)) - ) - .into_versioned()]), - }), - )); - - // ok - assert_eq!( - AssetTransferKindResolver::resolve(&asset1, &target_location), - AssetTransferKind::ReserveBased - ); - }) -} diff --git a/parachains/pallets/bridge-transfer/src/types.rs b/parachains/pallets/bridge-transfer/src/types.rs index 3afd94723b3..785d3ecf714 100644 --- a/parachains/pallets/bridge-transfer/src/types.rs +++ b/parachains/pallets/bridge-transfer/src/types.rs @@ -13,19 +13,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::Config; -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::pallet_prelude::{CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound}; -use pallet_bridge_transfer_primitives::MaybePaidLocation; -use scale_info::TypeInfo; use xcm::prelude::*; -pub use crate::types::{ - config::BridgeConfig, - filter::{AssetFilterOf, AssetFilterT, MultiLocationFilterOf}, - xcm_version::{LatestVersionedMultiLocation, UnsupportedXcmVersionError, UsingVersioned}, -}; - /// Pallet support two kinds of transfer. #[cfg_attr(feature = "std", derive(Debug, PartialEq))] pub enum AssetTransferKind { @@ -47,435 +36,3 @@ impl ResolveAssetTransferKind for () { AssetTransferKind::Unsupported } } - -pub mod config { - use super::*; - use crate::types::{ - filter::{AssetFilterError, AssetFilterOf}, - UnsupportedXcmVersionError, - }; - use frame_support::BoundedBTreeMap; - - #[derive( - Encode, Decode, MaxEncodedLen, TypeInfo, RuntimeDebugNoBound, CloneNoBound, PartialEqNoBound, - )] - #[scale_info(skip_type_params(T))] - pub struct BridgeConfig { - /// Contains location, which is able to bridge XCM messages to bridged network - bridge_location: VersionedMultiLocation, - /// Fee which could be needed to pay in `bridge_location` - /// `MultiAsset` is here from the point of view of `bridge_location`, e.g.: `MultiLocation::parent()` means relay chain token of `bridge_location` - pub(crate) bridge_location_fee: Option, - - /// Contains target destination on bridged network. E.g.: MultiLocation of Statemine/t on different consensus + its configuration - pub(crate) allowed_target_locations: BoundedBTreeMap< - VersionedMultiLocation, - TargetLocationConfig, - T::TargetLocationsPerExporterLimit, - >, - } - - impl BridgeConfig { - pub fn new( - bridge_location: VersionedMultiLocation, - bridge_location_fee: Option, - ) -> Self { - Self { - bridge_location, - bridge_location_fee, - allowed_target_locations: Default::default(), - } - } - - /// Tries to find target destination configuration for destination. - pub fn allowed_target_location_for( - &self, - destination: &MultiLocation, - ) -> Result>)>, UnsupportedXcmVersionError> - { - for (target_location, cfg) in &self.allowed_target_locations { - let target_location = target_location.as_versioned_ref()?; - // if destination matches target_location, we found our configuration - if destination.starts_with(target_location) || destination.eq(target_location) { - let maybe_fee = match &cfg.max_target_location_fee { - Some(fee) => Some(fee.as_versioned_ref()?.clone()), - None => None, - }; - return Ok(Some(( - MaybePaidLocation { location: target_location.clone(), maybe_fee }, - cfg.allowed_reserve_assets.clone(), - ))) - } - } - Ok(None) - } - - pub fn update_allowed_target_location( - &mut self, - target_location: VersionedMultiLocation, - max_target_location_fee: Option, - ) -> Result<(), BridgeConfigError> { - // lets try update existing - for (stored_target, cfg) in self.allowed_target_locations.iter_mut() { - let stored_target = stored_target.as_versioned_ref()?; - let target_location = target_location.as_versioned_ref()?; - // if stored_target matches target_location, we found our configuration - if stored_target.eq(target_location) { - cfg.max_target_location_fee = max_target_location_fee; - return Ok(()) - } - } - - // if not found, just insert - self.allowed_target_locations - .try_insert( - target_location, - TargetLocationConfig { max_target_location_fee, allowed_reserve_assets: None }, - ) - .map(|_| ()) - .map_err(|_| BridgeConfigError::LimitReached) - } - - pub fn add_allowed_target_location_filter_for( - &mut self, - target_location: VersionedMultiLocation, - new_asset_filter: AssetFilterOf, - ) -> Result { - for (stored_target, cfg) in self.allowed_target_locations.iter_mut() { - let stored_target = stored_target.as_versioned_ref()?; - let target_location = target_location.as_versioned_ref()?; - // if stored_target matches target_location, we found our configuration - if stored_target.eq(target_location) { - let was_added = match &mut cfg.allowed_reserve_assets { - Some(old_asset_filter) => old_asset_filter.add(new_asset_filter)?, - None => { - cfg.allowed_reserve_assets = Some(new_asset_filter); - true - }, - }; - return Ok(was_added) - } - } - return Err(BridgeConfigError::MissingTargetLocation) - } - - pub fn to_bridge_location(self) -> Result { - let maybe_fee = match self.bridge_location_fee { - Some(fee) => Some(fee.to_versioned()?), - None => None, - }; - Ok(MaybePaidLocation { location: self.bridge_location.to_versioned()?, maybe_fee }) - } - } - - #[derive( - Encode, Decode, MaxEncodedLen, TypeInfo, RuntimeDebugNoBound, CloneNoBound, PartialEqNoBound, - )] - #[scale_info(skip_type_params(T))] - pub struct TargetLocationConfig { - /// If `None` then `UnpaidExecution` is used, else `Withdraw(target_location_fee)/BuyExecution(target_location_fee, Unlimited)` - /// `MultiAsset` is here from the point of view of `allowed_target_location`, e.g.: `MultiLocation::parent()` means relay chain token of `allowed_target_location` - pub max_target_location_fee: Option, - - /// Filter for allowed asset that can be send out to the target location. - pub allowed_reserve_assets: Option>, - } - - #[derive(Debug)] - pub enum BridgeConfigError { - AssetFilterError(AssetFilterError), - MissingTargetLocation, - UnsupportedXcmVersionError(UnsupportedXcmVersionError), - LimitReached, - } - - impl From for BridgeConfigError { - fn from(e: UnsupportedXcmVersionError) -> Self { - Self::UnsupportedXcmVersionError(e) - } - } - - impl From for BridgeConfigError { - fn from(e: AssetFilterError) -> Self { - Self::AssetFilterError(e) - } - } -} - -pub mod filter { - use super::*; - - use crate::types::UnsupportedXcmVersionError; - use frame_support::{pallet_prelude::Get, BoundedVec}; - - pub type AssetFilterOf = AssetFilter<::AssetsPerReserveLocationLimit>; - pub type MultiLocationFilterOf = - MultiLocationFilter<::AssetsPerReserveLocationLimit>; - - pub trait AssetFilterT { - fn matches(&self, location: &MultiLocation) -> Result; - } - - #[derive(Debug)] - pub enum AssetFilterError { - UnsupportedXcmVersionError, - LimitReached, - } - - impl From for AssetFilterError { - fn from(_: UnsupportedXcmVersionError) -> Self { - Self::UnsupportedXcmVersionError - } - } - - impl From for crate::Error { - fn from(value: AssetFilterError) -> Self { - match value { - AssetFilterError::UnsupportedXcmVersionError => - crate::Error::::UnsupportedXcmVersion, - AssetFilterError::LimitReached => crate::Error::::InvalidConfiguration, - } - } - } - - #[derive( - CloneNoBound, - Encode, - Decode, - Eq, - PartialEqNoBound, - RuntimeDebugNoBound, - TypeInfo, - MaxEncodedLen, - Ord, - PartialOrd, - )] - #[scale_info(skip_type_params(AssetsLimit))] - pub enum AssetFilter> { - ByMultiLocation(MultiLocationFilter), - All, - } - - impl> AssetFilterT for AssetFilter { - fn matches(&self, location: &MultiLocation) -> Result { - match self { - AssetFilter::ByMultiLocation(by_location) => by_location.matches(location), - AssetFilter::All => Ok(true), - } - } - } - - impl> AssetFilter { - pub fn add( - &mut self, - new_filter: AssetFilter, - ) -> Result { - match new_filter { - AssetFilter::ByMultiLocation(by_location) => match self { - AssetFilter::ByMultiLocation(old_by_location) => - old_by_location.add(by_location), - AssetFilter::All => { - *self = AssetFilter::ByMultiLocation(by_location); - Ok(true) - }, - }, - AssetFilter::All => { - let mut was_added = false; - if !matches!(self, AssetFilter::All) { - *self = AssetFilter::All; - was_added = true - } - Ok(was_added) - }, - } - } - } - - #[derive( - CloneNoBound, - Encode, - Decode, - Eq, - PartialEqNoBound, - RuntimeDebugNoBound, - Default, - TypeInfo, - MaxEncodedLen, - Ord, - PartialOrd, - )] - #[scale_info(skip_type_params(PatternsLimit))] - pub struct MultiLocationFilter> { - /// Requested location equals to `MultiLocation` - pub equals_any: BoundedVec, - /// Requested location starts with `MultiLocation` - pub starts_with_any: BoundedVec, - } - - impl> MultiLocationFilter { - fn add( - &mut self, - to_add: MultiLocationFilter, - ) -> Result { - let add_if_not_found = |olds: &mut BoundedVec, - news: BoundedVec| - -> Result { - let mut was_added = false; - for new_ta in news { - if MultiLocationFilter::find_index(&olds, &new_ta)?.is_none() { - olds.try_push(new_ta).map_err(|_| AssetFilterError::LimitReached)?; - was_added = true; - } - } - Ok(was_added) - }; - - Ok(add_if_not_found(&mut self.equals_any, to_add.equals_any)? | - add_if_not_found(&mut self.starts_with_any, to_add.starts_with_any)?) - } - - pub fn remove( - &mut self, - to_remove: MultiLocationFilter, - ) -> Result { - let remove_from = |olds: &mut BoundedVec, - to_remove: BoundedVec| - -> Result { - let mut was_removed = false; - for tr in to_remove { - let found = MultiLocationFilter::find_index(olds, &tr)?; - if let Some(idx) = found { - _ = olds.remove(idx); - was_removed = true; - } - } - Ok(was_removed) - }; - - Ok(remove_from(&mut self.equals_any, to_remove.equals_any)? | - remove_from(&mut self.starts_with_any, to_remove.starts_with_any)?) - } - - fn find_index( - items: &BoundedVec, - searched: &VersionedMultiLocation, - ) -> Result, UnsupportedXcmVersionError> { - let searched = searched.as_versioned_ref()?; - for (idx, item) in items.iter().enumerate() { - let item = item.as_versioned_ref()?; - if item.eq(searched) { - return Ok(Some(idx)) - } - } - Ok(None) - } - - pub fn is_empty(&self) -> bool { - self.equals_any.is_empty() && self.starts_with_any.is_empty() - } - } - - impl> AssetFilterT for MultiLocationFilter { - fn matches(&self, location: &MultiLocation) -> Result { - for filter in &self.equals_any { - if filter.using_versioned_ref(|versioned| location.eq(versioned))? { - return Ok(true) - } - } - for filter in &self.starts_with_any { - if filter.using_versioned_ref(|versioned| location.starts_with(versioned))? { - return Ok(true) - } - } - Ok(false) - } - } - - impl> From> for AssetFilter { - fn from(value: MultiLocationFilter) -> Self { - AssetFilter::ByMultiLocation(value) - } - } -} - -pub mod xcm_version { - use super::*; - use crate::Config; - use codec::EncodeLike; - use pallet_bridge_transfer_primitives::ReachableDestinationError; - use xcm::TryAs; - - /// For simplified version mismatch handling - #[derive(Debug)] - pub struct UnsupportedXcmVersionError; - - impl From for crate::Error { - fn from(_: UnsupportedXcmVersionError) -> Self { - Self::UnsupportedXcmVersion - } - } - - impl From for ReachableDestinationError { - fn from(_: UnsupportedXcmVersionError) -> Self { - Self::UnsupportedXcmVersion - } - } - - /// Simplified adapter between `xcm::latest` and `Versioned*` stuff. - pub trait UsingVersioned: TryAs + TryInto { - fn using_versioned_ref R>( - &self, - f: F, - ) -> Result { - let versioned = self.try_as().map_err(|_| UnsupportedXcmVersionError)?; - Ok(f(versioned)) - } - - fn as_versioned_ref(&self) -> Result<&T, UnsupportedXcmVersionError> { - let versioned = self.try_as().map_err(|_| UnsupportedXcmVersionError)?; - Ok(versioned) - } - - fn to_versioned(self) -> Result { - let versioned = self.try_into().map_err(|_| UnsupportedXcmVersionError)?; - Ok(versioned) - } - } - - impl UsingVersioned for VersionedMultiLocation {} - - impl UsingVersioned for VersionedMultiAsset {} - - /// `KeyArg` wrapper for `VersionedMultiLocation`. - /// This feature allows to use `VersionedMultiLocation` as key, e.g. for `StorageMap`. - /// - /// NOTE: Because something like this does not work: - /// ```nocompile - /// let a = VersionedMultiLocation::V2(xcm::v2::MultiLocation::new(1, xcm::v2::Junctions::X1(xcm::v2::Junction::Parachain(1000)))); - /// let b = VersionedMultiLocation::V3(xcm::v3::MultiLocation::new(1, xcm::v3::Junctions::X1(xcm::v3::Junction::Parachain(1000)))); - /// assert_eq!(key_a, key_b); // <-- fails - /// ``` - #[derive(Copy, Clone)] - pub struct LatestVersionedMultiLocation<'a>(pub(crate) &'a MultiLocation); - - impl<'a> EncodeLike for LatestVersionedMultiLocation<'a> {} - - impl<'a> EncodeLike for &LatestVersionedMultiLocation<'a> {} - - impl<'a> Encode for LatestVersionedMultiLocation<'a> { - fn encode(&self) -> sp_std::vec::Vec { - let mut r = VersionedMultiLocation::from(MultiLocation::default()).encode(); - r.truncate(1); - self.0.using_encoded(|d| r.extend_from_slice(d)); - r - } - } - - impl<'a> TryFrom<&'a VersionedMultiLocation> for LatestVersionedMultiLocation<'a> { - type Error = UnsupportedXcmVersionError; - - fn try_from(value: &'a VersionedMultiLocation) -> Result { - value.as_versioned_ref().map(|v| LatestVersionedMultiLocation(v)) - } - } -} diff --git a/parachains/pallets/bridge-transfer/src/weights.rs b/parachains/pallets/bridge-transfer/src/weights.rs index 4368b33aec8..99246f3a227 100644 --- a/parachains/pallets/bridge-transfer/src/weights.rs +++ b/parachains/pallets/bridge-transfer/src/weights.rs @@ -24,37 +24,9 @@ use sp_std::marker::PhantomData; /// Weight functions needed for pallet_bridge_assets_transfer. pub trait WeightInfo { + // TODO: add assets count? /// Weight of the `transfer_asset_via_bridge` call. fn transfer_asset_via_bridge() -> Weight; - /// Weight of the `ping_via_bridge` call. - fn ping_via_bridge() -> Weight; - - /// Weight of the `add_exporter_config` call. - fn add_exporter_config() -> Weight; - /// Weight of the `remove_exporter_config` call. - fn remove_exporter_config() -> Weight; - /// Weight of the `update_exporter_config` call. - fn update_exporter_config() -> Weight; - - /// Weight of the `update_bridged_target_location` call. - fn update_bridged_target_location() -> Weight; - /// Weight of the `remove_bridged_target_location` call. - fn remove_bridged_target_location() -> Weight; - - /// Weight of the `allow_reserve_asset_transfer` call. - fn allow_reserve_asset_transfer_for() -> Weight; - /// Weight of the `disallow_reserve_asset_transfer_for` call. - fn disallow_reserve_asset_transfer_for() -> Weight; - - /// Weight of the `add_universal_alias` call. - fn add_universal_alias() -> Weight; - /// Weight of the `remove_universal_alias` call. - fn remove_universal_alias() -> Weight; - - /// Weight of the `add_reserve_location` call. - fn add_reserve_location() -> Weight; - /// Weight of the `remove_reserve_location` call. - fn remove_reserve_location() -> Weight; } // Zero weights to use in tests @@ -62,52 +34,4 @@ impl WeightInfo for () { fn transfer_asset_via_bridge() -> Weight { Weight::zero() } - - fn ping_via_bridge() -> Weight { - Weight::zero() - } - - fn add_exporter_config() -> Weight { - Weight::zero() - } - - fn remove_exporter_config() -> Weight { - Weight::zero() - } - - fn update_exporter_config() -> Weight { - Weight::zero() - } - - fn update_bridged_target_location() -> Weight { - Weight::zero() - } - - fn remove_bridged_target_location() -> Weight { - Weight::zero() - } - - fn allow_reserve_asset_transfer_for() -> Weight { - Weight::zero() - } - - fn disallow_reserve_asset_transfer_for() -> Weight { - Weight::zero() - } - - fn add_universal_alias() -> Weight { - Weight::zero() - } - - fn remove_universal_alias() -> Weight { - Weight::zero() - } - - fn add_reserve_location() -> Weight { - Weight::zero() - } - - fn remove_reserve_location() -> Weight { - Weight::zero() - } } From 62c2d20d1dfeef53e28e48a3fd6edec67f7644d4 Mon Sep 17 00:00:00 2001 From: eskimor Date: Mon, 12 Jun 2023 13:58:37 +0200 Subject: [PATCH 312/339] Companion for https://github.com/paritytech/polkadot/pull/7341 (#2726) * Companion to enabling past session slashing on production. * update lockfile for {"substrate", "polkadot"} --------- Co-authored-by: eskimor Co-authored-by: parity-processbot <> --- Cargo.lock | 524 +++++++++--------- .../src/blockchain_rpc_client.rs | 10 +- .../src/rpc_client.rs | 13 +- .../emulated/common/src/lib.rs | 4 +- 4 files changed, 274 insertions(+), 277 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8eea9b4ca7f..214635c5a12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -865,7 +865,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "hash-db", "log", @@ -4151,7 +4151,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", ] @@ -4174,7 +4174,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-support-procedural", @@ -4199,7 +4199,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -4246,7 +4246,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4257,7 +4257,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -4274,7 +4274,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-system", @@ -4303,7 +4303,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-recursion", "futures", @@ -4324,7 +4324,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "bitflags", "environmental", @@ -4359,7 +4359,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "Inflector", "cfg-expr", @@ -4376,7 +4376,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4388,7 +4388,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "proc-macro2", "quote", @@ -4398,7 +4398,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "cfg-if", "frame-support", @@ -4417,7 +4417,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -4432,7 +4432,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "sp-api", @@ -4441,7 +4441,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "parity-scale-codec", @@ -5533,7 +5533,7 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bitvec", "frame-benchmarking", @@ -5632,7 +5632,7 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "frame-support", "polkadot-primitives", @@ -6561,7 +6561,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "futures", "log", @@ -6580,7 +6580,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "anyhow", "jsonrpsee", @@ -7084,7 +7084,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -7105,7 +7105,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7123,7 +7123,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7138,7 +7138,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-system", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-system", @@ -7170,7 +7170,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-system", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7208,7 +7208,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7228,7 +7228,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7243,7 +7243,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-system", @@ -7262,7 +7262,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -7286,7 +7286,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7392,7 +7392,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7436,7 +7436,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7453,7 +7453,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "bitflags", "environmental", @@ -7483,7 +7483,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "bitflags", "parity-scale-codec", @@ -7496,7 +7496,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "proc-macro2", "quote", @@ -7506,7 +7506,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7523,7 +7523,7 @@ dependencies = [ [[package]] name = "pallet-core-fellowship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7541,7 +7541,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7559,7 +7559,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7582,7 +7582,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7595,7 +7595,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7613,7 +7613,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "docify", "frame-benchmarking", @@ -7632,7 +7632,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "blake2", "frame-benchmarking", @@ -7650,7 +7650,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7673,7 +7673,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7689,7 +7689,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7709,7 +7709,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7726,7 +7726,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-system", @@ -7740,7 +7740,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7757,7 +7757,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7776,7 +7776,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7793,7 +7793,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7809,7 +7809,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7826,7 +7826,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7844,7 +7844,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "pallet-nfts", @@ -7855,7 +7855,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7871,7 +7871,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-system", @@ -7888,7 +7888,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7908,7 +7908,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7919,7 +7919,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-system", @@ -7936,7 +7936,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7975,7 +7975,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -7992,7 +7992,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8007,7 +8007,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8025,7 +8025,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8040,7 +8040,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "assert_matches", "frame-benchmarking", @@ -8059,7 +8059,7 @@ dependencies = [ [[package]] name = "pallet-salary" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8077,7 +8077,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8094,7 +8094,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-system", @@ -8115,7 +8115,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8131,7 +8131,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-system", @@ -8145,7 +8145,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8168,7 +8168,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8179,7 +8179,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "log", "sp-arithmetic", @@ -8188,7 +8188,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "sp-api", @@ -8197,7 +8197,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8214,7 +8214,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8229,7 +8229,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8247,7 +8247,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8266,7 +8266,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-support", "frame-system", @@ -8282,7 +8282,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -8298,7 +8298,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -8310,7 +8310,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8327,7 +8327,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8342,7 +8342,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8358,7 +8358,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8373,7 +8373,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-benchmarking", "frame-support", @@ -8388,7 +8388,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -8409,7 +8409,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "frame-benchmarking", "frame-support", @@ -9020,7 +9020,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "futures", "polkadot-node-jaeger", @@ -9036,7 +9036,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -9050,7 +9050,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "derive_more", "fatality", @@ -9073,7 +9073,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "fatality", "futures", @@ -9094,7 +9094,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "clap", "frame-benchmarking-cli", @@ -9124,7 +9124,7 @@ dependencies = [ [[package]] name = "polkadot-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "async-trait", "frame-benchmarking", @@ -9167,7 +9167,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "always-assert", "bitvec", @@ -9189,7 +9189,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "parity-scale-codec", "scale-info", @@ -9201,7 +9201,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "derive_more", "fatality", @@ -9226,7 +9226,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -9240,7 +9240,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "futures", "futures-timer", @@ -9260,7 +9260,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "always-assert", "async-trait", @@ -9283,7 +9283,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "futures", "parity-scale-codec", @@ -9301,7 +9301,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bitvec", "derive_more", @@ -9330,7 +9330,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bitvec", "futures", @@ -9351,7 +9351,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bitvec", "fatality", @@ -9370,7 +9370,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "futures", "polkadot-node-subsystem", @@ -9385,7 +9385,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "async-trait", "futures", @@ -9405,7 +9405,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "futures", "polkadot-node-metrics", @@ -9420,7 +9420,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "futures", "futures-timer", @@ -9437,7 +9437,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "fatality", "futures", @@ -9456,7 +9456,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "async-trait", "futures", @@ -9473,7 +9473,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bitvec", "fatality", @@ -9491,7 +9491,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "always-assert", "futures", @@ -9522,7 +9522,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "futures", "polkadot-node-primitives", @@ -9538,7 +9538,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "cpu-time", "futures", @@ -9561,7 +9561,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-execute-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "cpu-time", "futures", @@ -9581,7 +9581,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-prepare-worker" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "futures", "libc", @@ -9604,7 +9604,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "futures", "lru 0.9.0", @@ -9619,7 +9619,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "lazy_static", "log", @@ -9637,7 +9637,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bs58", "futures", @@ -9656,7 +9656,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "async-channel", "async-trait", @@ -9679,7 +9679,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bounded-vec", "futures", @@ -9701,7 +9701,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9711,7 +9711,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "async-trait", "futures", @@ -9729,7 +9729,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "async-trait", "derive_more", @@ -9752,7 +9752,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "async-trait", "derive_more", @@ -9785,7 +9785,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "async-trait", "futures", @@ -9808,7 +9808,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bounded-collections", "derive_more", @@ -9907,7 +9907,7 @@ dependencies = [ [[package]] name = "polkadot-performance-test" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9925,7 +9925,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9951,7 +9951,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9983,7 +9983,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bitvec", "frame-benchmarking", @@ -10078,7 +10078,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bitvec", "frame-benchmarking", @@ -10124,7 +10124,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "frame-support", "polkadot-primitives", @@ -10138,7 +10138,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bs58", "parity-scale-codec", @@ -10150,7 +10150,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bitflags", "bitvec", @@ -10195,7 +10195,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -10305,7 +10305,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -10326,7 +10326,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -10336,7 +10336,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -10361,7 +10361,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bitvec", "frame-election-provider-support", @@ -10422,7 +10422,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "frame-benchmarking", "frame-system", @@ -11202,7 +11202,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -11289,7 +11289,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "frame-support", "polkadot-primitives", @@ -11536,7 +11536,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "log", "sp-core", @@ -11547,7 +11547,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "futures", @@ -11576,7 +11576,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "futures", "futures-timer", @@ -11599,7 +11599,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11614,7 +11614,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11633,7 +11633,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11644,7 +11644,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11684,7 +11684,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "fnv", "futures", @@ -11711,7 +11711,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "hash-db", "kvdb", @@ -11737,7 +11737,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "futures", @@ -11762,7 +11762,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "futures", @@ -11791,7 +11791,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "fork-tree", @@ -11827,7 +11827,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "futures", "jsonrpsee", @@ -11849,7 +11849,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11885,7 +11885,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "futures", "jsonrpsee", @@ -11904,7 +11904,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11917,7 +11917,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11957,7 +11957,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "finality-grandpa", "futures", @@ -11977,7 +11977,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "futures", @@ -12000,7 +12000,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "lru 0.10.0", "parity-scale-codec", @@ -12022,7 +12022,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -12034,7 +12034,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "anyhow", "cfg-if", @@ -12052,7 +12052,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "ansi_term", "futures", @@ -12068,7 +12068,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -12082,7 +12082,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12128,7 +12128,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-channel", "cid", @@ -12149,7 +12149,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12176,7 +12176,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "ahash 0.8.2", "futures", @@ -12194,7 +12194,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12216,7 +12216,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12250,7 +12250,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12268,7 +12268,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -12298,7 +12298,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -12307,7 +12307,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "futures", "jsonrpsee", @@ -12338,7 +12338,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12357,7 +12357,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "http", "jsonrpsee", @@ -12372,7 +12372,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12398,7 +12398,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "directories", @@ -12464,7 +12464,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "log", "parity-scale-codec", @@ -12475,7 +12475,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "clap", "fs4", @@ -12491,7 +12491,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12510,7 +12510,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "futures", "libc", @@ -12529,7 +12529,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "chrono", "futures", @@ -12548,7 +12548,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "ansi_term", "atty", @@ -12579,7 +12579,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12590,7 +12590,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "futures", @@ -12616,7 +12616,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "futures", @@ -12632,7 +12632,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-channel", "futures", @@ -13113,7 +13113,7 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "enumn", "parity-scale-codec", @@ -13190,7 +13190,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "hash-db", "log", @@ -13210,7 +13210,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "Inflector", "blake2", @@ -13224,7 +13224,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "scale-info", @@ -13237,7 +13237,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "16.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "integer-sqrt", "num-traits", @@ -13251,7 +13251,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "scale-info", @@ -13264,7 +13264,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "sp-api", @@ -13276,7 +13276,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "futures", "log", @@ -13294,7 +13294,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "futures", @@ -13309,7 +13309,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "parity-scale-codec", @@ -13327,7 +13327,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "parity-scale-codec", @@ -13348,7 +13348,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "lazy_static", "parity-scale-codec", @@ -13367,7 +13367,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "finality-grandpa", "log", @@ -13385,7 +13385,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "scale-info", @@ -13397,7 +13397,7 @@ dependencies = [ [[package]] name = "sp-core" version = "21.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13441,7 +13441,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "blake2b_simd", "byteorder", @@ -13455,7 +13455,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "proc-macro2", "quote", @@ -13466,7 +13466,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13475,7 +13475,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "proc-macro2", "quote", @@ -13485,7 +13485,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.19.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "environmental", "parity-scale-codec", @@ -13496,7 +13496,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13511,7 +13511,7 @@ dependencies = [ [[package]] name = "sp-io" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "bytes", "ed25519", @@ -13537,7 +13537,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "lazy_static", "sp-core", @@ -13548,7 +13548,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.27.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "futures", "parity-scale-codec", @@ -13562,7 +13562,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13571,7 +13571,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13582,7 +13582,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13600,7 +13600,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "scale-info", @@ -13614,7 +13614,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "sp-api", "sp-core", @@ -13624,7 +13624,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "backtrace", "lazy_static", @@ -13634,7 +13634,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "rustc-hash", "serde", @@ -13644,7 +13644,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "either", "hash256-std-hasher", @@ -13666,7 +13666,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "17.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13684,7 +13684,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "11.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "Inflector", "proc-macro-crate", @@ -13696,7 +13696,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "scale-info", @@ -13710,7 +13710,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "scale-info", @@ -13723,7 +13723,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.28.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "hash-db", "log", @@ -13743,7 +13743,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "log", "parity-scale-codec", @@ -13761,12 +13761,12 @@ dependencies = [ [[package]] name = "sp-std" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" [[package]] name = "sp-storage" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13779,7 +13779,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "futures-timer", @@ -13794,7 +13794,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "10.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "sp-std", @@ -13806,7 +13806,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "sp-api", "sp-runtime", @@ -13815,7 +13815,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "log", @@ -13831,7 +13831,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13854,7 +13854,7 @@ dependencies = [ [[package]] name = "sp-version" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13871,7 +13871,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13882,7 +13882,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "14.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13895,7 +13895,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "20.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "parity-scale-codec", "scale-info", @@ -14093,7 +14093,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "platforms", ] @@ -14101,7 +14101,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -14120,7 +14120,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "hyper", "log", @@ -14132,7 +14132,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "jsonrpsee", @@ -14145,7 +14145,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "jsonrpsee", "log", @@ -14164,7 +14164,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -14190,7 +14190,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "futures", "substrate-test-utils-derive", @@ -14200,7 +14200,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -14211,7 +14211,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "ansi_term", "build-helper", @@ -14340,7 +14340,7 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "frame-support", "polkadot-primitives", @@ -14731,7 +14731,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14742,7 +14742,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14872,7 +14872,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e5763b825fa41e05a49094bef3c67300999a52a5" +source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" dependencies = [ "async-trait", "clap", @@ -15787,7 +15787,7 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bitvec", "frame-benchmarking", @@ -15880,7 +15880,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "frame-support", "polkadot-primitives", @@ -16314,7 +16314,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "bounded-collections", "derivative", @@ -16330,7 +16330,7 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "frame-support", "frame-system", @@ -16385,7 +16385,7 @@ dependencies = [ [[package]] name = "xcm-executor" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "environmental", "frame-benchmarking", @@ -16405,7 +16405,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#b1cc6fa14330261a305d56be36c04e9c99518993" +source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" dependencies = [ "Inflector", "proc-macro2", diff --git a/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs b/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs index 10b48296bff..afe174202c5 100644 --- a/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs +++ b/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs @@ -21,7 +21,7 @@ use cumulus_relay_chain_rpc_interface::RelayChainRpcClient; use futures::{Stream, StreamExt}; use polkadot_core_primitives::{Block, BlockNumber, Hash, Header}; use polkadot_overseer::RuntimeApiSubsystemClient; -use polkadot_primitives::vstaging; +use polkadot_primitives::slashing; use sc_authority_discovery::{AuthorityDiscovery, Error as AuthorityDiscoveryError}; use sp_api::{ApiError, RuntimeApiInfo}; @@ -308,7 +308,7 @@ impl RuntimeApiSubsystemClient for BlockChainRpcClient { Vec<( polkadot_primitives::SessionIndex, polkadot_primitives::CandidateHash, - vstaging::slashing::PendingSlashes, + slashing::PendingSlashes, )>, ApiError, > { @@ -319,15 +319,15 @@ impl RuntimeApiSubsystemClient for BlockChainRpcClient { &self, at: Hash, validator_id: polkadot_primitives::ValidatorId, - ) -> Result, ApiError> { + ) -> Result, ApiError> { Ok(self.rpc_client.parachain_host_key_ownership_proof(at, validator_id).await?) } async fn submit_report_dispute_lost( &self, at: Hash, - dispute_proof: vstaging::slashing::DisputeProof, - key_ownership_proof: vstaging::slashing::OpaqueKeyOwnershipProof, + dispute_proof: slashing::DisputeProof, + key_ownership_proof: slashing::OpaqueKeyOwnershipProof, ) -> Result, ApiError> { Ok(self .rpc_client diff --git a/client/relay-chain-rpc-interface/src/rpc_client.rs b/client/relay-chain-rpc-interface/src/rpc_client.rs index 70c64eeeffc..a352269104f 100644 --- a/client/relay-chain-rpc-interface/src/rpc_client.rs +++ b/client/relay-chain-rpc-interface/src/rpc_client.rs @@ -30,7 +30,7 @@ use sp_storage::StorageKey; use cumulus_primitives_core::{ relay_chain::{ - vstaging, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, + slashing, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash as RelayHash, Header as RelayHeader, InboundHrmpMessage, OccupiedCoreAssumption, PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidationCode, @@ -334,10 +334,7 @@ impl RelayChainRpcClient { pub async fn parachain_host_unapplied_slashes( &self, at: RelayHash, - ) -> Result< - Vec<(SessionIndex, CandidateHash, vstaging::slashing::PendingSlashes)>, - RelayChainError, - > { + ) -> Result, RelayChainError> { self.call_remote_runtime_function("ParachainHost_unapplied_slashes", at, None::<()>) .await } @@ -349,7 +346,7 @@ impl RelayChainRpcClient { &self, at: RelayHash, validator_id: ValidatorId, - ) -> Result, RelayChainError> { + ) -> Result, RelayChainError> { self.call_remote_runtime_function( "ParachainHost_key_ownership_proof", at, @@ -365,8 +362,8 @@ impl RelayChainRpcClient { pub async fn parachain_host_submit_report_dispute_lost( &self, at: RelayHash, - dispute_proof: vstaging::slashing::DisputeProof, - key_ownership_proof: vstaging::slashing::OpaqueKeyOwnershipProof, + dispute_proof: slashing::DisputeProof, + key_ownership_proof: slashing::OpaqueKeyOwnershipProof, ) -> Result, RelayChainError> { self.call_remote_runtime_function( "ParachainHost_submit_report_dispute_lost", diff --git a/parachains/integration-tests/emulated/common/src/lib.rs b/parachains/integration-tests/emulated/common/src/lib.rs index c793110a378..2b2af134a51 100644 --- a/parachains/integration-tests/emulated/common/src/lib.rs +++ b/parachains/integration-tests/emulated/common/src/lib.rs @@ -36,7 +36,7 @@ decl_test_relay_chains! { Sudo: westend_runtime::Sudo, } }, - #[api_version(4)] + #[api_version(5)] pub struct Polkadot { genesis = polkadot::genesis(), on_init = (), @@ -55,7 +55,7 @@ decl_test_relay_chains! { XcmPallet: polkadot_runtime::XcmPallet, } }, - #[api_version(4)] + #[api_version(5)] pub struct Kusama { genesis = kusama::genesis(), on_init = (), From 8f424a6e00e6c0059c54f8a98af21b941b2b7df1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:04:12 +0000 Subject: [PATCH 313/339] Bump actions/checkout from 3.5.2 to 3.5.3 (#2723) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.5.2 to 3.5.3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/8e5e7e5ab8b370d6c329ec480221332ada57f0ab...c85c95e3d7251135ab7dc9ce3241c5835cc595a9) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yml | 2 +- .github/workflows/fmt-check.yml | 2 +- .github/workflows/release-01_branch-check.yml | 2 +- .github/workflows/release-10_rc-automation.yml | 2 +- .../release-20_extrinsic-ordering-check-from-bin.yml | 2 +- .../release-21_extrinsic-ordering-check-from-two.yml | 2 +- .github/workflows/release-30_create-draft.yml | 6 +++--- .github/workflows/release-50_docker-manual.yml | 2 +- .github/workflows/release-50_docker.yml | 2 +- .github/workflows/srtool.yml | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index c67f5bb97ad..ba7739f25c2 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,7 +17,7 @@ jobs: protoc --version - name: Checkout repository - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Rust versions run: rustup show diff --git a/.github/workflows/fmt-check.yml b/.github/workflows/fmt-check.yml index 498e42527e3..7571c51116b 100644 --- a/.github/workflows/fmt-check.yml +++ b/.github/workflows/fmt-check.yml @@ -16,7 +16,7 @@ jobs: container: image: paritytech/ci-linux:production steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Cargo fmt run: cargo +nightly fmt --all -- --check diff --git a/.github/workflows/release-01_branch-check.yml b/.github/workflows/release-01_branch-check.yml index c6237b40ceb..afcd4580f17 100644 --- a/.github/workflows/release-01_branch-check.yml +++ b/.github/workflows/release-01_branch-check.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: fetch-depth: 0 diff --git a/.github/workflows/release-10_rc-automation.yml b/.github/workflows/release-10_rc-automation.yml index 9b6e156a2c4..377d3830104 100644 --- a/.github/workflows/release-10_rc-automation.yml +++ b/.github/workflows/release-10_rc-automation.yml @@ -17,7 +17,7 @@ jobs: pre-releases: true steps: - name: Checkout sources - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: fetch-depth: 0 - id: compute_tag diff --git a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml index 2f4552b928f..f821e39dd33 100644 --- a/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml +++ b/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml @@ -29,7 +29,7 @@ jobs: REF_URL: ${{github.event.inputs.reference_url}} steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Fetch binary run: | diff --git a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml index 79fa11b3f9c..93c0050ff6f 100644 --- a/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml +++ b/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml @@ -42,7 +42,7 @@ jobs: relay: polkadot-local steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Create tmp dir run: | diff --git a/.github/workflows/release-30_create-draft.yml b/.github/workflows/release-30_create-draft.yml index 2080a052da5..8ad63ff46cd 100644 --- a/.github/workflows/release-30_create-draft.yml +++ b/.github/workflows/release-30_create-draft.yml @@ -68,7 +68,7 @@ jobs: runtime: rococo-parachain steps: - name: Checkout sources - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ github.event.inputs.ref2 }} @@ -120,7 +120,7 @@ jobs: asset_upload_url: ${{ steps.create-release.outputs.upload_url }} steps: - name: Checkout sources - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: fetch-depth: 0 path: cumulus @@ -246,7 +246,7 @@ jobs: runtime: rococo-parachain steps: - name: Checkout sources - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ github.event.inputs.ref2 }} diff --git a/.github/workflows/release-50_docker-manual.yml b/.github/workflows/release-50_docker-manual.yml index 10eaf07dad3..e48d7c8faab 100644 --- a/.github/workflows/release-50_docker-manual.yml +++ b/.github/workflows/release-50_docker-manual.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ github.event.release.tag_name }} diff --git a/.github/workflows/release-50_docker.yml b/.github/workflows/release-50_docker.yml index 42d17477160..9a1db1a04ac 100644 --- a/.github/workflows/release-50_docker.yml +++ b/.github/workflows/release-50_docker.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ github.event.release.tag_name }} diff --git a/.github/workflows/srtool.yml b/.github/workflows/srtool.yml index b717a12ce86..6941a79a013 100644 --- a/.github/workflows/srtool.yml +++ b/.github/workflows/srtool.yml @@ -54,7 +54,7 @@ jobs: - category: testing runtime: rococo-parachain steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: fetch-depth: 0 From d20c4283fe85df0c1ef8cb7c9eb7c09abbcbfa31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 14:07:02 +0200 Subject: [PATCH 314/339] Bump proc-macro2 from 1.0.59 to 1.0.60 (#2718) Bumps [proc-macro2](https://github.com/dtolnay/proc-macro2) from 1.0.59 to 1.0.60. - [Release notes](https://github.com/dtolnay/proc-macro2/releases) - [Commits](https://github.com/dtolnay/proc-macro2/compare/1.0.59...1.0.60) --- updated-dependencies: - dependency-name: proc-macro2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- pallets/parachain-system/proc-macro/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 214635c5a12..4eaf2874ad9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10669,9 +10669,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.59" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" dependencies = [ "unicode-ident", ] diff --git a/pallets/parachain-system/proc-macro/Cargo.toml b/pallets/parachain-system/proc-macro/Cargo.toml index cd47fef9e09..b0883135324 100644 --- a/pallets/parachain-system/proc-macro/Cargo.toml +++ b/pallets/parachain-system/proc-macro/Cargo.toml @@ -10,7 +10,7 @@ proc-macro = true [dependencies] syn = "2.0.18" -proc-macro2 = "1.0.59" +proc-macro2 = "1.0.60" quote = "1.0.28" proc-macro-crate = "1.3.1" From 3f2a3baacb10c7ece1510c79312a64603bb0bb3b Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 12 Jun 2023 16:11:04 +0200 Subject: [PATCH 315/339] Another refactor --- Cargo.lock | 3 + .../primitives/src/asset_filter.rs | 15 +- .../bridge-transfer/primitives/src/lib.rs | 3 + .../pallets/bridge-transfer/src/features.rs | 93 ++-- .../pallets/bridge-transfer/src/tests.rs | 10 +- .../assets/asset-hub-kusama/Cargo.toml | 1 + .../assets/asset-hub-kusama/src/lib.rs | 19 +- .../src/weights/pallet_bridge_transfer.rs | 150 ------- .../assets/asset-hub-kusama/src/xcm_config.rs | 102 ++++- .../assets/asset-hub-kusama/tests/tests.rs | 53 +-- .../assets/asset-hub-westend/Cargo.toml | 2 + .../assets/asset-hub-westend/src/lib.rs | 24 +- .../src/weights/pallet_bridge_transfer.rs | 159 ------- .../asset-hub-westend/src/xcm_config.rs | 106 ++++- .../assets/asset-hub-westend/tests/tests.rs | 53 +-- .../runtimes/assets/test-utils/Cargo.toml | 2 + .../test-utils/src/test_cases_over_bridge.rs | 406 ++++-------------- 17 files changed, 411 insertions(+), 790 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d469cdd7ebb..e681b7a0c3e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -421,6 +421,7 @@ dependencies = [ "pallet-authorship", "pallet-balances", "pallet-bridge-transfer", + "pallet-bridge-transfer-primitives", "pallet-collator-selection", "pallet-multisig", "pallet-nfts", @@ -614,6 +615,7 @@ dependencies = [ "pallet-authorship", "pallet-balances", "pallet-bridge-transfer", + "pallet-bridge-transfer-primitives", "pallet-collator-selection", "pallet-multisig", "pallet-nft-fractionalization", @@ -671,6 +673,7 @@ dependencies = [ "pallet-assets", "pallet-balances", "pallet-bridge-transfer", + "pallet-bridge-transfer-primitives", "pallet-collator-selection", "pallet-session", "pallet-xcm", diff --git a/parachains/pallets/bridge-transfer/primitives/src/asset_filter.rs b/parachains/pallets/bridge-transfer/primitives/src/asset_filter.rs index b61554ce1c3..d59cb2a9f26 100644 --- a/parachains/pallets/bridge-transfer/primitives/src/asset_filter.rs +++ b/parachains/pallets/bridge-transfer/primitives/src/asset_filter.rs @@ -26,19 +26,17 @@ pub trait MatchAssetLocation { #[derive(Debug)] pub enum AssetFilter { ByMultiLocation(MultiLocationFilter), - All, } impl MatchAssetLocation for AssetFilter { fn matches(&self, asset_location: &MultiLocation) -> bool { match self { AssetFilter::ByMultiLocation(by_location) => by_location.matches(asset_location), - AssetFilter::All => true, } } } -#[derive(Debug)] +#[derive(Debug, Default)] pub struct MultiLocationFilter { /// Requested location equals to `MultiLocation` pub equals_any: sp_std::vec::Vec, @@ -46,6 +44,17 @@ pub struct MultiLocationFilter { pub starts_with_any: sp_std::vec::Vec, } +impl MultiLocationFilter { + pub fn add_equals(mut self, filter: MultiLocation) -> Self { + self.equals_any.push(filter); + self + } + pub fn add_starts_with(mut self, filter: MultiLocation) -> Self { + self.starts_with_any.push(filter); + self + } +} + impl MatchAssetLocation for MultiLocationFilter { fn matches(&self, location: &MultiLocation) -> bool { for filter in &self.equals_any { diff --git a/parachains/pallets/bridge-transfer/primitives/src/lib.rs b/parachains/pallets/bridge-transfer/primitives/src/lib.rs index 6f7a0151648..a0b9744c983 100644 --- a/parachains/pallets/bridge-transfer/primitives/src/lib.rs +++ b/parachains/pallets/bridge-transfer/primitives/src/lib.rs @@ -57,3 +57,6 @@ pub enum ReachableDestinationError { UnsupportedDestination, UnsupportedXcmVersion, } + +/// Reserve location as `MultiLocation` with `AssetFilter` +pub type ReserveLocation = (MultiLocation, AssetFilter); diff --git a/parachains/pallets/bridge-transfer/src/features.rs b/parachains/pallets/bridge-transfer/src/features.rs index 5e4e168debb..14e52950bf3 100644 --- a/parachains/pallets/bridge-transfer/src/features.rs +++ b/parachains/pallets/bridge-transfer/src/features.rs @@ -18,35 +18,59 @@ use crate::{ LOG_TARGET, }; use frame_support::traits::{ContainsPair, Get}; -use pallet_bridge_transfer_primitives::{BridgesConfig, MatchAssetLocation}; +use pallet_bridge_transfer_primitives::{BridgesConfig, MatchAssetLocation, ReserveLocation}; use xcm::prelude::*; use xcm_builder::ensure_is_remote; + +/// Adapter verifies if it is allowed to receive `MultiAsset` from `MultiLocation`. +/// +/// Note: `MultiLocation` has to be from different global consensus. +pub struct IsTrustedBridgedReserveLocationForConcreteAsset( + sp_std::marker::PhantomData<(UniversalLocation, Reserves)>, +); +impl< + UniversalLocation: Get, + Reserves: Get>, + > ContainsPair + for IsTrustedBridgedReserveLocationForConcreteAsset { fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + let universal_source = UniversalLocation::get(); log::trace!( - target: LOG_TARGET, - "IsTrustedBridgedReserveForConcreteAsset asset: {:?}, origin: {:?}", - asset, origin + target: "xcm::contains", + "IsTrustedBridgedReserveLocationForConcreteAsset asset: {:?}, origin: {:?}, universal_source: {:?}", + asset, origin, universal_source ); + // check remote origin + let _ = match ensure_is_remote(universal_source, *origin) { + Ok(devolved) => devolved, + Err(_) => { + log::trace!( + target: "xcm::contains", + "IsTrustedBridgedReserveLocationForConcreteAsset origin: {:?} is not remote to the universal_source: {:?}", + origin, universal_source + ); + return false + }, + }; + + // check asset location let asset_location = match &asset.id { Concrete(location) => location, _ => return false, }; - let versioned_origin = LatestVersionedMultiLocation(origin); - Pallet::::allowed_reserve_locations(versioned_origin) - .map_or(false, |filter| match filter.matches(asset_location) { - Ok(result) => result, - Err(e) => { - log::error!( - target: LOG_TARGET, - "IsTrustedBridgedReserveForConcreteAsset has error: {:?} for asset_location: {:?} and origin: {:?}!", - e, asset_location, origin - ); - false - }, - }) + // check asset according to the configured reserve locations + for (reserve_location, asset_filter) in Reserves::get() { + if origin.eq(&reserve_location) { + if asset_filter.matches(asset_location) { + return true + } + } + } + + false } } @@ -128,17 +152,34 @@ impl< _ => return AssetTransferKind::Unsupported, }; - // first, we check, if we are trying to transfer back reserve-deposited assets + // check if target_location is allowed for requested asset to be transferred there + let is_reserve_based_candidate = + IsAllowedReserveBasedTransferForAsset::contains(asset, target_location); + + // check if we are trying to transfer back reserve-deposited assets // other words: if target_location is a known reserve location for asset - if IsReserveLocationForAsset::contains(asset, target_location) { - return AssetTransferKind::WithdrawReserve - } + let is_withdraw_reserve_candidate = + IsReserveLocationForAsset::contains(asset, target_location); - // second, we check, if target_location is allowed for requested asset to be transferred there - if IsAllowedReserveBasedTransferForAsset::contains(asset, target_location) { - return AssetTransferKind::ReserveBased + match (is_reserve_based_candidate, is_withdraw_reserve_candidate) { + (true, false) => AssetTransferKind::ReserveBased, + (false, true) => AssetTransferKind::WithdrawReserve, + (true, true) => { + log::warn!( + target: LOG_TARGET, + "ConcreteAssetTransferKindResolver invalid configuration of transfer kind resolve for asset: {:?} and target_location: {:?} - is_reserve_based_candidate/is_withdraw_reserve_candidate: {:?}/{:?}", + asset, target_location, is_reserve_based_candidate, is_withdraw_reserve_candidate + ); + AssetTransferKind::Unsupported + }, + (false, false) => { + log::trace!( + target: LOG_TARGET, + "ConcreteAssetTransferKindResolver unsupported transfer kind for asset: {:?} and target_location: {:?} - is_reserve_based_candidate/is_withdraw_reserve_candidate: {:?}/{:?}", + asset, target_location, is_reserve_based_candidate, is_withdraw_reserve_candidate + ); + AssetTransferKind::Unsupported + }, } - - AssetTransferKind::Unsupported } } diff --git a/parachains/pallets/bridge-transfer/src/tests.rs b/parachains/pallets/bridge-transfer/src/tests.rs index 6143d25a23f..33ef185cd3b 100644 --- a/parachains/pallets/bridge-transfer/src/tests.rs +++ b/parachains/pallets/bridge-transfer/src/tests.rs @@ -30,7 +30,7 @@ use frame_support::{ }; use pallet_bridge_transfer_primitives::{ AssetFilter, BridgeConfig, BridgesConfig, BridgesConfigAdapter, BridgesConfigBuilder, - MaybePaidLocation, ReachableDestination, + MaybePaidLocation, MultiLocationFilter, ReachableDestination, }; use polkadot_parachain::primitives::Sibling; use sp_runtime::{ @@ -150,7 +150,11 @@ parameter_types! { location: TargetLocation::get(), maybe_fee: TargetLocationFee::get(), }, - Some(AssetFilter::All) + Some(AssetFilter::ByMultiLocation( + MultiLocationFilter::default() + // allow transfer parent/relay native token + .add_equals(MultiLocation::parent()) + )) ) ) .build(); @@ -263,7 +267,7 @@ impl Config for TestRuntime { type WeightInfo = (); type AssetTransactor = CurrencyTransactor; type AssetTransferKindResolver = ConcreteAssetTransferKindResolver< - frame_support::traits::Nothing, + (), IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation, >; type AssetTransferOrigin = EnsureXcmOrigin; diff --git a/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml b/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml index 6b0b6661095..be28681a0d6 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml @@ -75,6 +75,7 @@ parachain-info = { path = "../../../pallets/parachain-info", default-features = parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } pallet-bridge-transfer = { path = "../../../pallets/bridge-transfer", default-features = false } +pallet-bridge-transfer-primitives = { path = "../../../pallets/bridge-transfer/primitives", default-features = false } [dev-dependencies] asset-test-utils = { path = "../test-utils"} diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs index 91f8eeb158d..d9d30054f50 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs @@ -69,7 +69,7 @@ use parachains_common::{ NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_config::{ - AssetTransactors, BridgeXcmSender, FellowshipLocation, ForeignAssetsConvertedConcreteId, + bridging, AssetTransactors, FellowshipLocation, ForeignAssetsConvertedConcreteId, GovernanceLocation, KsmLocation, LocalOriginToLocation, TrustBackedAssetsConvertedConcreteId, UniversalLocation, XcmConfig, }; @@ -705,24 +705,17 @@ impl pallet_bridge_transfer::Config for Runtime { type RuntimeEvent = RuntimeEvent; type UniversalLocation = UniversalLocation; type WeightInfo = weights::pallet_bridge_transfer::WeightInfo; - type AdminOrigin = AssetsForceOrigin; - type AllowReserveAssetTransferOrigin = AsEnsureOriginWithArg; - type UniversalAliasesLimit = ConstU32<24>; - type ReserveLocationsLimit = ConstU32<4>; - type AssetsPerReserveLocationLimit = ConstU32<128>; - type TargetLocationsPerExporterLimit = ConstU32<4>; type AssetTransactor = AssetTransactors; type AssetTransferKindResolver = pallet_bridge_transfer::features::ConcreteAssetTransferKindResolver< - pallet_bridge_transfer::features::IsTrustedBridgedReserveForConcreteAsset, - pallet_bridge_transfer::features::IsAllowedReserveBasedAssetTransferForConcreteAsset< - Runtime, - >, + bridging::IsTrustedBridgedReserveLocationForConcreteAsset, + pallet_bridge_transfer::features::IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation, >; type AssetTransferOrigin = EnsureXcmOrigin; type AssetsLimit = ConstU8<1>; - type BridgedDestinationValidator = BridgeTransfer; - type BridgeXcmSender = BridgeXcmSender; + type BridgedDestinationValidator = + pallet_bridge_transfer_primitives::BridgesConfigAdapter; + type BridgeXcmSender = bridging::BridgeXcmSender; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = xcm_config::BridgeTransferBenchmarksHelper; } diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs index 572baf89ab3..24d8a98782e 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs @@ -83,154 +83,4 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(8)) } - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) - /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) - /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) - /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) - fn ping_via_bridge() -> Weight { - // Proof Size summary in bytes: - // Measured: `347` - // Estimated: `6002` - // Minimum execution time: 66_830_000 picoseconds. - Weight::from_parts(67_314_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - fn add_exporter_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `6002` - // Minimum execution time: 16_697_000 picoseconds. - Weight::from_parts(16_997_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) - fn remove_exporter_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `175` - // Estimated: `6002` - // Minimum execution time: 13_282_000 picoseconds. - Weight::from_parts(13_616_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) - fn update_exporter_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `175` - // Estimated: `6002` - // Minimum execution time: 16_726_000 picoseconds. - Weight::from_parts(17_111_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - fn update_bridged_target_location() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - - fn remove_bridged_target_location() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - - fn allow_reserve_asset_transfer_for() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - - fn disallow_reserve_asset_transfer_for() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - - /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) - /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) - fn add_universal_alias() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `5884` - // Minimum execution time: 12_078_000 picoseconds. - Weight::from_parts(12_421_000, 0) - .saturating_add(Weight::from_parts(0, 5884)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) - /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) - fn remove_universal_alias() -> Weight { - // Proof Size summary in bytes: - // Measured: `158` - // Estimated: `5884` - // Minimum execution time: 15_011_000 picoseconds. - Weight::from_parts(15_361_000, 0) - .saturating_add(Weight::from_parts(0, 5884)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) - /// Proof: BridgeTransfer AllowedReserveLocations (max_values: Some(1), max_size: Some(4817), added: 5312, mode: MaxEncodedLen) - fn add_reserve_location() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `6302` - // Minimum execution time: 11_927_000 picoseconds. - Weight::from_parts(12_308_000, 0) - .saturating_add(Weight::from_parts(0, 6302)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) - /// Proof: BridgeTransfer AllowedReserveLocations (max_values: Some(1), max_size: Some(4817), added: 5312, mode: MaxEncodedLen) - fn remove_reserve_location() -> Weight { - // Proof Size summary in bytes: - // Measured: `141` - // Estimated: `6302` - // Minimum execution time: 14_002_000 picoseconds. - Weight::from_parts(14_406_000, 0) - .saturating_add(Weight::from_parts(0, 6302)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } } diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs index 1d692a63c16..f3506a918e5 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs @@ -14,9 +14,9 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, BridgeTransfer, - ForeignAssets, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, - RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ForeignAssets, + ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use assets_common::matching::{ FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, @@ -26,9 +26,6 @@ use frame_support::{ traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, }; use frame_system::EnsureRoot; -use pallet_bridge_transfer::features::{ - AllowedUniversalAliasesOf, IsTrustedBridgedReserveForConcreteAsset, -}; use pallet_xcm::XcmPassthrough; use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; use polkadot_parachain::primitives::Sibling; @@ -42,8 +39,7 @@ use xcm_builder::{ IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - TrailingSetTopicAsId, UnpaidRemoteExporter, UsingComponents, WeightInfoBounds, - WithComputedOrigin, WithUniqueTopic, + TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -388,7 +384,7 @@ impl xcm_executor::Config for XcmConfig { type OriginConverter = XcmOriginToTransactDispatchOrigin; // Asset Hub acting _as_ a reserve location for KSM and assets created under `pallet-assets`. // For KSM, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = IsTrustedBridgedReserveForConcreteAsset; + type IsReserve = bridging::IsTrustedBridgedReserveLocationForConcreteAsset; // We allow: // - teleportation of KSM // - teleportation of sibling parachain's assets (as ForeignCreators) @@ -427,7 +423,7 @@ impl xcm_executor::Config for XcmConfig { type AssetExchanger = (); type FeeManager = (); type MessageExporter = (); - type UniversalAliases = AllowedUniversalAliasesOf; + type UniversalAliases = bridging::BridgedUniversalAliases; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; @@ -507,8 +503,90 @@ impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { } } -/// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus -pub type BridgeXcmSender = UnpaidRemoteExporter; +/// All configuration related to bridging +pub mod bridging { + use super::*; + use pallet_bridge_transfer_primitives::{ + AssetFilter, BridgeConfig, BridgesConfig, BridgesConfigAdapter, BridgesConfigBuilder, + MaybePaidLocation, MultiLocationFilter, ReserveLocation, + }; + use sp_std::collections::btree_set::BTreeSet; + use xcm_builder::UnpaidRemoteExporter; + + parameter_types! { + pub BridgeHubKusamaParaId: u32 = 1002; + pub BridgeHubKusama: MultiLocation = MultiLocation::new(1, X1(Parachain(BridgeHubKusamaParaId::get()))); + pub const PolkadotNetwork: NetworkId = NetworkId::Polkadot; + pub AssetHubPolkadot: MultiLocation = MultiLocation::new(2, X2(GlobalConsensus(PolkadotNetwork::get()), Parachain(1000))); + // Initial value, this will be adjusted by governance motion on deployment with some more accurate value + pub storage AssetHubPolkadotMaxFee: Option = Some((MultiLocation::parent(), 1_000_000).into()); + pub DotLocation: MultiLocation = MultiLocation::new(2, X1(GlobalConsensus(PolkadotNetwork::get()))); + + // Setup bridges configuration + // (hard-coded version - on-chain configuration will come later as separate feature) + pub Bridges: BridgesConfig = BridgesConfigBuilder::default() + // add exporter for Polkadot + .add_or_panic( + PolkadotNetwork::get(), + BridgeConfig::new( + MaybePaidLocation { + location: BridgeHubKusama::get(), + // Noe fees needed because we use `UnpaidRemoteExporter` and BridgeHubKusama allows unpaid execution for local system parachains + maybe_fee: None, + } + ).add_target_location( + // add target location as AssetHubPolkadot + MaybePaidLocation { + location: AssetHubPolkadot::get(), + maybe_fee: AssetHubPolkadotMaxFee::get(), + }, + Some(AssetFilter::ByMultiLocation( + MultiLocationFilter::default() + // allow transfer KSM + .add_equals(KsmLocation::get()) + )) + ) + ) + .build(); + + // Setup trusted bridged reserve locations + pub BridgedReserves: sp_std::vec::Vec = sp_std::vec![ + // trust assets from AssetHubPolkadot + ( + AssetHubPolkadot::get(), + AssetFilter::ByMultiLocation( + MultiLocationFilter::default() + // allow receive DOT + .add_equals(DotLocation::get()) + ) + ) + ]; + + /// Universal aliases + pub BridgedUniversalAliases: BTreeSet<(MultiLocation, Junction)> = BTreeSet::from_iter( + sp_std::vec![ + (BridgeHubKusama::get(), GlobalConsensus(PolkadotNetwork::get())) + ] + ); + } + + impl Contains<(MultiLocation, Junction)> for BridgedUniversalAliases { + fn contains(alias: &(MultiLocation, Junction)) -> bool { + BridgedUniversalAliases::get().contains(alias) + } + } + + /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus + pub type BridgeXcmSender = + UnpaidRemoteExporter, XcmRouter, UniversalLocation>; + + /// Reserve locations filter for `xcm_executor::Config::IsReserve`. + pub type IsTrustedBridgedReserveLocationForConcreteAsset = + pallet_bridge_transfer::features::IsTrustedBridgedReserveLocationForConcreteAsset< + UniversalLocation, + BridgedReserves, + >; +} /// Benchmarks helper for over-bridge transfer pallet. #[cfg(feature = "runtime-benchmarks")] diff --git a/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs index 681e83a6605..8f206c219fc 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs @@ -23,7 +23,8 @@ use asset_hub_kusama_runtime::xcm_config::{ pub use asset_hub_kusama_runtime::{ constants::fee::WeightToFee, xcm_config::{ - CheckingAccount, ForeignCreatorsSovereignAccountOf, LocationToAccountId, XcmConfig, + bridging, CheckingAccount, ForeignCreatorsSovereignAccountOf, LocationToAccountId, + XcmConfig, }, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime, RuntimeCall, @@ -625,38 +626,20 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p }) ); -#[test] -fn can_governance_change_bridge_transfer_in_configuration() { - asset_test_utils::test_cases_over_bridge::can_governance_change_bridge_transfer_in_configuration::< - Runtime, - XcmConfig, - >( - collator_session_keys(), - Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), - _ => None, - } - }), - ) -} - -#[test] -fn can_governance_change_bridge_transfer_out_configuration() { - asset_test_utils::test_cases_over_bridge::can_governance_change_bridge_transfer_out_configuration::< - Runtime, - XcmConfig, - >( - collator_session_keys(), - Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), - _ => None, - } - }), - ) +fn bridging_to_asset_hub_polkadot() -> asset_test_utils::test_cases_over_bridge::TestBridgingConfig +{ + asset_test_utils::test_cases_over_bridge::TestBridgingConfig { + bridged_network: bridging::PolkadotNetwork::get(), + local_bridge_hub_para_id: bridging::BridgeHubKusamaParaId::get(), + local_bridge_hub_location: pallet_bridge_transfer_primitives::MaybePaidLocation { + location: bridging::BridgeHubKusama::get(), + maybe_fee: None, + }, + bridged_target_location: pallet_bridge_transfer_primitives::MaybePaidLocation { + location: bridging::AssetHubPolkadot::get(), + maybe_fee: bridging::AssetHubPolkadotMaxFee::get(), + }, + } } #[test] @@ -683,6 +666,7 @@ fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works() { _ => None, } }), + bridging_to_asset_hub_polkadot ) } @@ -711,6 +695,7 @@ fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_works() _ => None, } }), + bridging_to_asset_hub_polkadot ) } @@ -731,6 +716,7 @@ fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_works() _ => None, } }), + bridging_to_asset_hub_polkadot ) } @@ -750,5 +736,6 @@ fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_works() _ => None, } }), + bridging_to_asset_hub_polkadot ) } diff --git a/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index 657f3e6a2bb..05bee102db7 100644 --- a/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -74,6 +74,7 @@ parachain-info = { path = "../../../pallets/parachain-info", default-features = parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } pallet-bridge-transfer = { path = "../../../pallets/bridge-transfer", default-features = false } +pallet-bridge-transfer-primitives = { path = "../../../pallets/bridge-transfer/primitives", default-features = false } [dev-dependencies] hex-literal = "0.4.1" @@ -194,5 +195,6 @@ std = [ "parachains-common/std", "assets-common/std", "pallet-bridge-transfer/std", + "pallet-bridge-transfer-primitives/std", "substrate-wasm-builder", ] diff --git a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index e5c9559eb0e..2e373a6ad18 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -69,8 +69,8 @@ use parachains_common::{ NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_config::{ - ForeignAssetsConvertedConcreteId, TrustBackedAssetsConvertedConcreteId, WestendLocation, - XcmConfig, XcmOriginToTransactDispatchOrigin, + bridging, ForeignAssetsConvertedConcreteId, TrustBackedAssetsConvertedConcreteId, + WestendLocation, XcmConfig, XcmOriginToTransactDispatchOrigin, }; #[cfg(any(feature = "std", test))] @@ -84,8 +84,7 @@ use xcm_builder::EnsureXcmOrigin; use xcm_executor::XcmExecutor; use crate::xcm_config::{ - AssetTransactors, BridgeXcmSender, ForeignCreatorsSovereignAccountOf, LocalOriginToLocation, - UniversalLocation, + AssetTransactors, ForeignCreatorsSovereignAccountOf, LocalOriginToLocation, UniversalLocation, }; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; @@ -703,24 +702,17 @@ impl pallet_bridge_transfer::Config for Runtime { type RuntimeEvent = RuntimeEvent; type UniversalLocation = UniversalLocation; type WeightInfo = weights::pallet_bridge_transfer::WeightInfo; - type AdminOrigin = AssetsForceOrigin; - type AllowReserveAssetTransferOrigin = AsEnsureOriginWithArg; - type UniversalAliasesLimit = ConstU32<24>; - type ReserveLocationsLimit = ConstU32<4>; - type AssetsPerReserveLocationLimit = ConstU32<128>; - type TargetLocationsPerExporterLimit = ConstU32<4>; type AssetTransactor = AssetTransactors; type AssetTransferKindResolver = pallet_bridge_transfer::features::ConcreteAssetTransferKindResolver< - pallet_bridge_transfer::features::IsTrustedBridgedReserveForConcreteAsset, - pallet_bridge_transfer::features::IsAllowedReserveBasedAssetTransferForConcreteAsset< - Runtime, - >, + bridging::IsTrustedBridgedReserveLocationForConcreteAsset, + pallet_bridge_transfer::features::IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation, >; type AssetTransferOrigin = EnsureXcmOrigin; type AssetsLimit = ConstU8<1>; - type BridgedDestinationValidator = BridgeTransfer; - type BridgeXcmSender = BridgeXcmSender; + type BridgedDestinationValidator = + pallet_bridge_transfer_primitives::BridgesConfigAdapter; + type BridgeXcmSender = bridging::BridgeXcmSender; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = xcm_config::BridgeTransferBenchmarksHelper; } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs index cc790239613..935bbc3064b 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs @@ -83,163 +83,4 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(8)) } - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) - /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) - /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) - /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) - fn ping_via_bridge() -> Weight { - // Proof Size summary in bytes: - // Measured: `381` - // Estimated: `6002` - // Minimum execution time: 64_672_000 picoseconds. - Weight::from_parts(65_698_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - fn add_exporter_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `6002` - // Minimum execution time: 16_205_000 picoseconds. - Weight::from_parts(16_584_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) - fn remove_exporter_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `175` - // Estimated: `6002` - // Minimum execution time: 13_171_000 picoseconds. - Weight::from_parts(13_598_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeTransfer AllowedExporters (r:1 w:1) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) - fn update_exporter_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `175` - // Estimated: `6002` - // Minimum execution time: 16_666_000 picoseconds. - Weight::from_parts(16_847_000, 0) - .saturating_add(Weight::from_parts(0, 6002)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - - fn update_bridged_target_location() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `5884` - // Minimum execution time: 12_859_000 picoseconds. - Weight::from_parts(19_737_000, 0) - .saturating_add(Weight::from_parts(0, 5884)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - - fn remove_bridged_target_location() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `5884` - // Minimum execution time: 12_859_000 picoseconds. - Weight::from_parts(19_737_000, 0) - .saturating_add(Weight::from_parts(0, 5884)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - - fn allow_reserve_asset_transfer_for() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `5884` - // Minimum execution time: 12_859_000 picoseconds. - Weight::from_parts(19_737_000, 0) - .saturating_add(Weight::from_parts(0, 5884)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - - fn disallow_reserve_asset_transfer_for() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `5884` - // Minimum execution time: 12_859_000 picoseconds. - Weight::from_parts(19_737_000, 0) - .saturating_add(Weight::from_parts(0, 5884)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - - /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) - /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) - fn add_universal_alias() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `5884` - // Minimum execution time: 11_874_000 picoseconds. - Weight::from_parts(12_188_000, 0) - .saturating_add(Weight::from_parts(0, 5884)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:1) - /// Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) - fn remove_universal_alias() -> Weight { - // Proof Size summary in bytes: - // Measured: `158` - // Estimated: `5884` - // Minimum execution time: 15_103_000 picoseconds. - Weight::from_parts(15_497_000, 0) - .saturating_add(Weight::from_parts(0, 5884)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) - /// Proof: BridgeTransfer AllowedReserveLocations (max_values: Some(1), max_size: Some(4817), added: 5312, mode: MaxEncodedLen) - fn add_reserve_location() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `6302` - // Minimum execution time: 11_624_000 picoseconds. - Weight::from_parts(11_983_000, 0) - .saturating_add(Weight::from_parts(0, 6302)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:1) - /// Proof: BridgeTransfer AllowedReserveLocations (max_values: Some(1), max_size: Some(4817), added: 5312, mode: MaxEncodedLen) - fn remove_reserve_location() -> Weight { - // Proof Size summary in bytes: - // Measured: `141` - // Estimated: `6302` - // Minimum execution time: 13_568_000 picoseconds. - Weight::from_parts(13_867_000, 0) - .saturating_add(Weight::from_parts(0, 6302)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index a8d678524b3..d82c7263267 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -14,9 +14,9 @@ // limitations under the License. use super::{ - AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, BridgeTransfer, - ForeignAssets, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, - RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ForeignAssets, + ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use assets_common::matching::{ FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, @@ -26,9 +26,6 @@ use frame_support::{ traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, }; use frame_system::EnsureRoot; -use pallet_bridge_transfer::features::{ - AllowedUniversalAliasesOf, IsTrustedBridgedReserveForConcreteAsset, -}; use pallet_xcm::XcmPassthrough; use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; use polkadot_parachain::primitives::Sibling; @@ -41,8 +38,8 @@ use xcm_builder::{ GlobalConsensusParachainConvertsFor, IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UnpaidRemoteExporter, - UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -385,7 +382,7 @@ impl xcm_executor::Config for XcmConfig { type OriginConverter = XcmOriginToTransactDispatchOrigin; // Asset Hub acting _as_ a reserve location for WND and assets created under `pallet-assets`. // For WND, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = IsTrustedBridgedReserveForConcreteAsset; + type IsReserve = bridging::IsTrustedBridgedReserveLocationForConcreteAsset; // We allow: // - teleportation of WND // - teleportation of sibling parachain's assets (as ForeignCreators) @@ -424,7 +421,7 @@ impl xcm_executor::Config for XcmConfig { type AssetExchanger = (); type FeeManager = (); type MessageExporter = (); - type UniversalAliases = AllowedUniversalAliasesOf; + type UniversalAliases = bridging::BridgedUniversalAliases; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; @@ -499,8 +496,93 @@ impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { } } -/// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus -pub type BridgeXcmSender = UnpaidRemoteExporter; + +/// All configuration related to bridging +pub mod bridging { + use super::*; + use pallet_bridge_transfer_primitives::{ + AssetFilter, BridgeConfig, BridgesConfig, BridgesConfigAdapter, BridgesConfigBuilder, + MaybePaidLocation, MultiLocationFilter, ReserveLocation, + }; + use sp_std::collections::btree_set::BTreeSet; + use xcm_builder::UnpaidRemoteExporter; + + parameter_types! { + // used for local testing + pub BridgeHubParaId: u32 = 1002; + pub BridgeHub: MultiLocation = MultiLocation::new(1, X1(Parachain(BridgeHubParaId::get()))); + pub const KusamaLocalNetwork: NetworkId = NetworkId::Kusama; + pub AssetHubKusamaLocal: MultiLocation = MultiLocation::new(2, X2(GlobalConsensus(KusamaLocalNetwork::get()), Parachain(1000))); + // Initial value, this will be adjusted by governance motion on deployment with some more accurate value + pub storage AssetHubKusamaLocalMaxFee: Option = Some((MultiLocation::parent(), 1_000_000).into()); + pub KsmLocation: MultiLocation = MultiLocation::new(2, X1(GlobalConsensus(KusamaLocalNetwork::get()))); + + // Setup bridges configuration + // Allows to transfer only WND to AssetHubKusama + // (hard-coded version - on-chain configuration will come later as separate feature) + pub Bridges: BridgesConfig = BridgesConfigBuilder::default() + // add exporter for Kusama + .add_or_panic( + KusamaLocalNetwork::get(), + BridgeConfig::new( + MaybePaidLocation { + location: BridgeHub::get(), + // Noe fees needed because we use `UnpaidRemoteExporter` and BridgeHubKusama allows unpaid execution for local system parachains + maybe_fee: None, + } + ).add_target_location( + // add target location as AssetHubKusamaLocal + MaybePaidLocation { + location: AssetHubKusamaLocal::get(), + maybe_fee: AssetHubKusamaLocalMaxFee::get(), + }, + Some(AssetFilter::ByMultiLocation( + MultiLocationFilter::default() + // allow transfer WND + .add_equals(WestendLocation::get()) + )) + ) + ) + .build(); + + // Setup trusted bridged reserve locations + pub BridgedReserves: sp_std::vec::Vec = sp_std::vec![ + // trust assets from AssetHubKusamaLocal + ( + AssetHubKusamaLocal::get(), + AssetFilter::ByMultiLocation( + MultiLocationFilter::default() + // allow receive KSM + .add_equals(KsmLocation::get()) + ) + ) + ]; + + /// Universal aliases + pub BridgedUniversalAliases: BTreeSet<(MultiLocation, Junction)> = BTreeSet::from_iter( + sp_std::vec![ + (BridgeHub::get(), GlobalConsensus(KusamaLocalNetwork::get())) + ] + ); + } + + impl Contains<(MultiLocation, Junction)> for BridgedUniversalAliases { + fn contains(alias: &(MultiLocation, Junction)) -> bool { + BridgedUniversalAliases::get().contains(alias) + } + } + + /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus + pub type BridgeXcmSender = + UnpaidRemoteExporter, XcmRouter, UniversalLocation>; + + /// Reserve locations filter for `xcm_executor::Config::IsReserve`. + pub type IsTrustedBridgedReserveLocationForConcreteAsset = + pallet_bridge_transfer::features::IsTrustedBridgedReserveLocationForConcreteAsset< + UniversalLocation, + BridgedReserves, + >; +} /// Benchmarks helper for over-bridge transfer pallet. #[cfg(feature = "runtime-benchmarks")] diff --git a/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs b/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs index 2b8de42aa54..9f70a5f1988 100644 --- a/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs @@ -27,8 +27,8 @@ pub use asset_hub_westend_runtime::{ }; use asset_hub_westend_runtime::{ xcm_config::{ - AssetFeeAsExistentialDepositMultiplierFeeCharger, ForeignCreatorsSovereignAccountOf, - WestendLocation, + bridging, AssetFeeAsExistentialDepositMultiplierFeeCharger, + ForeignCreatorsSovereignAccountOf, WestendLocation, }, MetadataDepositBase, MetadataDepositPerByte, RuntimeCall, RuntimeEvent, }; @@ -630,38 +630,19 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p }) ); -#[test] -fn can_governance_change_bridge_transfer_in_configuration() { - asset_test_utils::test_cases_over_bridge::can_governance_change_bridge_transfer_in_configuration::< - Runtime, - XcmConfig, - >( - collator_session_keys(), - Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), - _ => None, - } - }), - ) -} - -#[test] -fn can_governance_change_bridge_transfer_out_configuration() { - asset_test_utils::test_cases_over_bridge::can_governance_change_bridge_transfer_out_configuration::< - Runtime, - XcmConfig, - >( - collator_session_keys(), - Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), - _ => None, - } - }), - ) +fn bridging_to_asset_hub_kusama() -> asset_test_utils::test_cases_over_bridge::TestBridgingConfig { + asset_test_utils::test_cases_over_bridge::TestBridgingConfig { + bridged_network: bridging::KusamaLocalNetwork::get(), + local_bridge_hub_para_id: bridging::BridgeHubParaId::get(), + local_bridge_hub_location: pallet_bridge_transfer_primitives::MaybePaidLocation { + location: bridging::BridgeHub::get(), + maybe_fee: None, + }, + bridged_target_location: pallet_bridge_transfer_primitives::MaybePaidLocation { + location: bridging::AssetHubKusamaLocal::get(), + maybe_fee: bridging::AssetHubKusamaLocalMaxFee::get(), + }, + } } #[test] @@ -688,6 +669,7 @@ fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works() { _ => None, } }), + bridging_to_asset_hub_kusama ) } @@ -716,6 +698,7 @@ fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_works() _ => None, } }), + bridging_to_asset_hub_kusama ) } @@ -736,6 +719,7 @@ fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_works() _ => None, } }), + bridging_to_asset_hub_kusama, ) } @@ -755,6 +739,7 @@ fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_works() _ => None, } }), + bridging_to_asset_hub_kusama, ) } diff --git a/parachains/runtimes/assets/test-utils/Cargo.toml b/parachains/runtimes/assets/test-utils/Cargo.toml index 4a86ec39592..c29db54b46b 100644 --- a/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/parachains/runtimes/assets/test-utils/Cargo.toml @@ -32,6 +32,7 @@ cumulus-primitives-parachain-inherent = { path = "../../../../primitives/paracha cumulus-test-relay-sproof-builder = { path = "../../../../test/relay-sproof-builder", default-features = false } parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } pallet-bridge-transfer = { path = "../../../pallets/bridge-transfer", default-features = false } +pallet-bridge-transfer-primitives = { path = "../../../pallets/bridge-transfer/primitives", default-features = false } parachains-runtimes-test-utils = { path = "../../test-utils", default-features = false } # Polkadot @@ -75,6 +76,7 @@ std = [ "xcm-builder/std", "xcm-executor/std", "pallet-bridge-transfer/std", + "pallet-bridge-transfer-primitives/std", "cumulus-pallet-xcmp-queue/std", "cumulus-pallet-dmp-queue/std", ] diff --git a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs index da5fca27903..2377ae11bfb 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs @@ -19,10 +19,9 @@ use codec::Encode; use cumulus_primitives_core::XcmpMessageSource; use frame_support::{ assert_ok, - traits::{Contains, Currency, Get, OriginTrait, ProcessMessageError}, - BoundedVec, + traits::{Currency, Get, OriginTrait, ProcessMessageError}, }; -use pallet_bridge_transfer::{AssetFilterOf, MultiLocationFilterOf}; +use pallet_bridge_transfer_primitives::MaybePaidLocation; use parachains_common::Balance; use parachains_runtimes_test_utils::{ mock_open_hrmp_channel, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, RuntimeHelper, @@ -33,214 +32,11 @@ use xcm::{latest::prelude::*, VersionedMultiAssets, VersionedMultiLocation}; use xcm_builder::{CreateMatcher, MatchXcm}; use xcm_executor::{traits::ConvertLocation, XcmExecutor}; -/// Test-case makes sure that `Runtime` can manage `bridge_transfer out` configuration by governance -pub fn can_governance_change_bridge_transfer_out_configuration( - collator_session_keys: CollatorSessionKeys, - runtime_call_encode: Box) -> Vec>, - unwrap_pallet_bridge_transfer_event: Box< - dyn Fn(Vec) -> Option>, - >, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_dmp_queue::Config - + pallet_bridge_transfer::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - XcmConfig: xcm_executor::Config, -{ - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_tracing() - .with_safe_xcm_version(3) - .build() - .execute_with(|| { - // bridge cfg data - let bridged_network = ByGenesis([9; 32]); - let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); - let bridge_location_fee = None; - - // check no cfg - assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) - .is_none()); - - // governance can add exporter config - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::add_exporter_config { - bridged_network, - bridge_location: Box::new(bridge_location.into_versioned()), - bridge_location_fee, - } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::add_exporter_config() - ) - .ensure_complete()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeAdded))); - { - let cfg = - pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network); - assert!(cfg.is_some()); - let cfg = cfg.unwrap().to_bridge_location().expect("ok"); - assert_eq!(cfg.location, bridge_location); - assert_eq!(cfg.maybe_fee, None); - } - - // governance can update bridge fee - let new_bridge_location_fee: MultiAsset = - (Concrete(MultiLocation::parent()), 1_000).into(); - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::update_exporter_config { - bridged_network, - bridge_location_fee: Some(Box::new(new_bridge_location_fee.clone().into())), - } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::update_exporter_config() - ) - .ensure_complete()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeFeeUpdated))); - { - let cfg = - pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network); - assert!(cfg.is_some()); - let cfg = cfg.unwrap().to_bridge_location().expect("ok"); - assert_eq!(cfg.maybe_fee, Some(new_bridge_location_fee)); - } - - let allowed_target_location = MultiLocation::new( - 2, - X2(GlobalConsensus(bridged_network), Parachain(1000)), - ); - let new_target_location_fee: MultiAsset = - (Concrete(MultiLocation::parent()), 1_000_000).into(); - - // governance can update target location - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::update_bridged_target_location { - bridged_network, - target_location: Box::new(allowed_target_location.into_versioned()), - max_target_location_fee: Some(Box::new(new_target_location_fee.into())) - } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::update_bridged_target_location() - ) - .ensure_complete()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeTargetLocationUpdated))); - - // governance can allow reserve based assets to transfer out - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::allow_reserve_asset_transfer_for { - bridged_network, - target_location: Box::new(allowed_target_location.into_versioned()), - asset_filter: AssetFilterOf::::All, - } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::allow_reserve_asset_transfer_for() - ) - .ensure_complete()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::ReserveLocationAdded))); - - // governance can remove bridge config - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::remove_exporter_config { bridged_network } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::remove_exporter_config() - ) - .ensure_complete()); - assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) - .is_none()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeRemoved))); - }) -} - -/// Test-case makes sure that `Runtime` can manage `bridge_transfer in` configuration by governance -pub fn can_governance_change_bridge_transfer_in_configuration( - collator_session_keys: CollatorSessionKeys, - runtime_call_encode: Box) -> Vec>, - unwrap_pallet_bridge_transfer_event: Box< - dyn Fn(Vec) -> Option>, - >, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_dmp_queue::Config - + pallet_bridge_transfer::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - XcmConfig: xcm_executor::Config, -{ - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_tracing() - .with_safe_xcm_version(3) - .build() - .execute_with(|| { - // bridge cfg data - let bridge_location = (Parent, Parachain(1013)).into(); - let alias_junction = GlobalConsensus(ByGenesis([9; 32])); - - // check before - assert!( - !pallet_bridge_transfer::features::AllowedUniversalAliasesOf::::contains(&( - bridge_location, - alias_junction - )) - ); - - // governance can add bridge config - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::add_universal_alias { - location: Box::new(bridge_location.clone().into_versioned()), - junction: alias_junction, - } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::add_universal_alias() - ) - .ensure_complete()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::UniversalAliasAdded))); - - // check after - assert!(pallet_bridge_transfer::features::AllowedUniversalAliasesOf::::contains( - &(bridge_location, alias_junction) - )); - }) +pub struct TestBridgingConfig { + pub bridged_network: NetworkId, + pub local_bridge_hub_para_id: u32, + pub local_bridge_hub_location: MaybePaidLocation, + pub bridged_target_location: MaybePaidLocation, } /// Test-case makes sure that `Runtime` can initiate transfer of assets via bridge - `TransferKind::ReserveBased` @@ -260,6 +56,7 @@ pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< unwrap_xcmp_queue_event: Box< dyn Fn(Vec) -> Option>, >, + ensure_configuration: fn() -> TestBridgingConfig, ) where Runtime: frame_system::Config + pallet_balances::Config @@ -295,12 +92,19 @@ pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< .build() .execute_with(|| { // prepare bridge config - let bridged_network = ByGenesis([6; 32]); - let bridge_hub_para_id = 1013; - let bridge_hub_location: MultiLocation = (Parent, Parachain(bridge_hub_para_id)).into(); - let target_location_from_different_consensus = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); + let TestBridgingConfig { + bridged_network, + local_bridge_hub_para_id, + bridged_target_location: + MaybePaidLocation { + location: target_location_from_different_consensus, + maybe_fee: target_location_fee, + }, + .. + } = ensure_configuration(); + + // we expect paid target execution + let target_location_fee = target_location_fee.unwrap(); let reserve_account = LocationToAccountId::convert_location(&target_location_from_different_consensus) @@ -311,7 +115,7 @@ pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< // open HRMP to bridge hub mock_open_hrmp_channel::( runtime_para_id.into(), - bridge_hub_para_id.into(), + local_bridge_hub_para_id.into(), ); // drip ED to account @@ -339,32 +143,6 @@ pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< existential_deposit ); - // insert bridge config and target location - assert_ok!(>::add_exporter_config( - RuntimeHelper::::root_origin(), - bridged_network, - Box::new(bridge_hub_location.into_versioned()), - None, - )); - assert_ok!(>::update_bridged_target_location( - RuntimeHelper::::root_origin(), - bridged_network, - Box::new(target_location_from_different_consensus.into_versioned()), - Some(Box::new(target_location_fee.clone().into())), - )); - assert_ok!( - >::allow_reserve_asset_transfer_for( - RuntimeHelper::::root_origin(), - bridged_network, - Box::new(target_location_from_different_consensus.into_versioned()), - MultiLocationFilterOf:: { - equals_any: BoundedVec::truncate_from(vec![native_asset.into_versioned()]), - starts_with_any: Default::default(), - } - .into(), - ) - ); - // local native asset (pallet_balances) let assets = MultiAssets::from(MultiAsset { fun: Fungible(balance_to_transfer.into()), @@ -431,7 +209,8 @@ pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< // read xcm let xcm_sent = - RuntimeHelper::::take_xcm(bridge_hub_para_id.into()).unwrap(); + RuntimeHelper::::take_xcm(local_bridge_hub_para_id.into()) + .unwrap(); println!("xcm_sent: {:?}", xcm_sent); assert_eq!( xcm_sent_message_hash, @@ -579,6 +358,7 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work unwrap_xcmp_queue_event: Box< dyn Fn(Vec) -> Option>, >, + ensure_configuration: fn() -> TestBridgingConfig, ) where Runtime: frame_system::Config + pallet_balances::Config @@ -622,12 +402,20 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work .build() .execute_with(|| { // prepare bridge config - let bridged_network = ByGenesis([6; 32]); - let bridge_hub_para_id = 1013; - let bridge_hub_location: MultiLocation = (Parent, Parachain(bridge_hub_para_id)).into(); - let target_location_from_different_consensus = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); + let TestBridgingConfig { + bridged_network, + local_bridge_hub_para_id, + bridged_target_location: + MaybePaidLocation { + location: target_location_from_different_consensus, + maybe_fee: target_location_fee, + }, + .. + } = ensure_configuration(); + + // we expect paid target execution + let target_location_fee = target_location_fee.unwrap(); + let foreign_asset_id_multilocation = MultiLocation::new(2, X1(GlobalConsensus(bridged_network))); @@ -640,7 +428,7 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work // open HRMP to bridge hub mock_open_hrmp_channel::( runtime_para_id.into(), - bridge_hub_para_id.into(), + local_bridge_hub_para_id.into(), ); // drip ED to account @@ -692,25 +480,6 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work (asset_minimum_asset_balance + balance_to_transfer).into() ); - // insert bridge config - assert_ok!(>::add_exporter_config( - RuntimeHelper::::root_origin(), - bridged_network, - Box::new(bridge_hub_location.into_versioned()), - None, - )); - assert_ok!(>::update_bridged_target_location( - RuntimeHelper::::root_origin(), - bridged_network, - Box::new(target_location_from_different_consensus.into_versioned()), - Some(Box::new(target_location_fee.clone().into())) - )); - assert_ok!(>::add_reserve_location( - RuntimeHelper::::root_origin(), - Box::new(target_location_from_different_consensus.into_versioned()), - AssetFilterOf::::All, - )); - // lets withdraw previously reserve asset deposited from `ForeignAssets` let assets = MultiAssets::from(MultiAsset { fun: Fungible(balance_to_transfer.into()), @@ -783,7 +552,8 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work // read xcm let xcm_sent = - RuntimeHelper::::take_xcm(bridge_hub_para_id.into()).unwrap(); + RuntimeHelper::::take_xcm(local_bridge_hub_para_id.into()) + .unwrap(); println!("xcm_sent: {:?}", xcm_sent); assert_eq!( xcm_sent_message_hash, @@ -924,6 +694,7 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_work existential_deposit: BalanceOf, target_account: AccountIdOf, unwrap_pallet_xcm_event: Box) -> Option>>, + ensure_configuration: fn() -> TestBridgingConfig, ) where Runtime: frame_system::Config + pallet_balances::Config @@ -952,19 +723,6 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_work LocationToAccountId: ConvertLocation>, ForeignAssetsPalletInstance: 'static, { - let remote_network_id = ByGenesis([7; 32]); - let remote_parachain_as_origin = MultiLocation { - parents: 2, - interior: X2(GlobalConsensus(remote_network_id), Parachain(1000)), - }; - let foreign_asset_id_multilocation = - MultiLocation { parents: 2, interior: X1(GlobalConsensus(remote_network_id)) }; - let buy_execution_fee_amount = 50000000000; - let reserve_asset_deposisted = 100_000_000; - - let local_bridge_hub_multilocation = - MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; - ExtBuilder::::default() .with_collators(collator_session_keys.collators()) .with_session_keys(collator_session_keys.session_keys()) @@ -972,6 +730,22 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_work .with_tracing() .build() .execute_with(|| { + // prepare bridge config + let TestBridgingConfig { + bridged_network: remote_network_id, + local_bridge_hub_location: + MaybePaidLocation { location: local_bridge_hub_location, .. }, + bridged_target_location: + MaybePaidLocation { location: remote_parachain_as_origin, .. }, + .. + } = ensure_configuration(); + + let foreign_asset_id_multilocation = + MultiLocation { parents: 2, interior: X1(GlobalConsensus(remote_network_id)) }; + + let buy_execution_fee_amount = 50000000000; + let reserve_asset_deposisted = 100_000_000; + // drip SA for remote global parachain origin let remote_parachain_sovereign_account = LocationToAccountId::convert_location(&remote_parachain_as_origin) @@ -982,26 +756,6 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_work existential_deposit + buy_execution_fee_amount.into(), )); - // setup bridge transfer configuration - // add allowed univeral alias for remote network - assert_ok!(>::add_universal_alias( - RuntimeHelper::::root_origin(), - Box::new(local_bridge_hub_multilocation.into_versioned()), - GlobalConsensus(remote_network_id) - )); - // add allowed reserve location - assert_ok!(>::add_reserve_location( - RuntimeHelper::::root_origin(), - Box::new(remote_parachain_as_origin.into_versioned()), - MultiLocationFilterOf:: { - equals_any: BoundedVec::truncate_from(vec![ - foreign_asset_id_multilocation.into_versioned() - ]), - starts_with_any: Default::default(), - } - .into() - )); - // create foreign asset let asset_minimum_asset_balance = 1_000_000_u128; assert_ok!( @@ -1017,7 +771,7 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_work // we assume here that BuyExecution fee goes to staking pot let staking_pot_account_id = >::account_id(); let local_bridge_hub_multilocation_as_account_id = - LocationToAccountId::convert_location(&local_bridge_hub_multilocation) + LocationToAccountId::convert_location(&local_bridge_hub_location) .expect("Correct AccountId"); // check before @@ -1103,7 +857,7 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_work ]); // origin as BridgeHub - let origin = local_bridge_hub_multilocation; + let origin = local_bridge_hub_location; let hash = xcm.using_encoded(sp_io::hashing::blake2_256); @@ -1168,6 +922,7 @@ pub fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_wor existential_deposit: BalanceOf, target_account: AccountIdOf, unwrap_pallet_xcm_event: Box) -> Option>>, + ensure_configuration: fn() -> TestBridgingConfig, ) where Runtime: frame_system::Config + pallet_balances::Config @@ -1188,18 +943,6 @@ pub fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_wor XcmConfig: xcm_executor::Config, LocationToAccountId: ConvertLocation>, { - let remote_network_id = ByGenesis([7; 32]); - let remote_parachain_as_origin = MultiLocation { - parents: 2, - interior: X2(GlobalConsensus(remote_network_id), Parachain(1000)), - }; - - let buy_execution_fee_amount = 50000000000; - let reserve_asset_deposisted = 100_000_000; - - let local_bridge_hub_multilocation = - MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; - ExtBuilder::::default() .with_collators(collator_session_keys.collators()) .with_session_keys(collator_session_keys.session_keys()) @@ -1207,6 +950,19 @@ pub fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_wor .with_tracing() .build() .execute_with(|| { + // prepare bridge config + let TestBridgingConfig { + bridged_network: remote_network_id, + local_bridge_hub_location: + MaybePaidLocation { location: local_bridge_hub_location, .. }, + bridged_target_location: + MaybePaidLocation { location: remote_parachain_as_origin, .. }, + .. + } = ensure_configuration(); + + let buy_execution_fee_amount = 50000000000; + let reserve_asset_deposisted = 100_000_000; + // add reserved assets to SA for remote global parachain origin (this is how reserve was done, when reserve_asset_deposisted was transferred out) let remote_parachain_sovereign_account = LocationToAccountId::convert_location(&remote_parachain_as_origin) @@ -1219,18 +975,10 @@ pub fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_wor reserve_asset_deposisted.into(), )); - // setup bridge transfer configuration - // add allowed univeral alias for remote network - assert_ok!(>::add_universal_alias( - RuntimeHelper::::root_origin(), - Box::new(local_bridge_hub_multilocation.into_versioned()), - GlobalConsensus(remote_network_id) - )); - // we assume here that BuyExecution fee goes to staking pot let staking_pot_account_id = >::account_id(); let local_bridge_hub_multilocation_as_account_id = - LocationToAccountId::convert_location(&local_bridge_hub_multilocation) + LocationToAccountId::convert_location(&local_bridge_hub_location) .expect("Correct AccountId"); // check before @@ -1305,7 +1053,7 @@ pub fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_wor ]); // origin as BridgeHub - let origin = local_bridge_hub_multilocation; + let origin = local_bridge_hub_location; let hash = xcm.using_encoded(sp_io::hashing::blake2_256); From 8bef5e7b4408fb328df8647c064c8c64fef5aec2 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 12 Jun 2023 16:12:51 +0200 Subject: [PATCH 316/339] Temporary removed pallet for on-chain bridge config (will come in other PR) --- Cargo.lock | 19 - Cargo.toml | 1 - .../bridge-transfer/onchain-config/Cargo.toml | 57 -- .../onchain-config/src/benchmarking.rs | 263 -------- .../onchain-config/src/features.rs | 184 ------ .../bridge-transfer/onchain-config/src/lib.rs | 562 ------------------ .../onchain-config/src/tests.rs | 545 ----------------- .../onchain-config/src/types.rs | 459 -------------- .../onchain-config/src/weights.rs | 87 --- 9 files changed, 2177 deletions(-) delete mode 100644 parachains/pallets/bridge-transfer/onchain-config/Cargo.toml delete mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/benchmarking.rs delete mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/features.rs delete mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/lib.rs delete mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/tests.rs delete mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/types.rs delete mode 100644 parachains/pallets/bridge-transfer/onchain-config/src/weights.rs diff --git a/Cargo.lock b/Cargo.lock index e681b7a0c3e..5f917b6198d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7420,25 +7420,6 @@ dependencies = [ "xcm-executor", ] -[[package]] -name = "pallet-bridge-transfer-onchain-config" -version = "0.1.0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "log", - "pallet-bridge-transfer-primitives", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", - "sp-version", - "xcm", - "xcm-builder", -] - [[package]] name = "pallet-bridge-transfer-primitives" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index f656c1b065b..d5b3b9c2aa9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,6 @@ members = [ "polkadot-parachain", "parachains/common", "parachains/pallets/bridge-transfer", - "parachains/pallets/bridge-transfer/onchain-config", "parachains/pallets/parachain-info", "parachains/pallets/ping", "parachains/runtimes/testing/rococo-parachain", diff --git a/parachains/pallets/bridge-transfer/onchain-config/Cargo.toml b/parachains/pallets/bridge-transfer/onchain-config/Cargo.toml deleted file mode 100644 index ef9142061d9..00000000000 --- a/parachains/pallets/bridge-transfer/onchain-config/Cargo.toml +++ /dev/null @@ -1,57 +0,0 @@ -[package] -name = "pallet-bridge-transfer-onchain-config" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "Apache-2.0" -homepage = "https://docs.substrate.io/" -repository = "https://github.com/paritytech/cumulus/" -description = "Pallet for managing on-chain configuratino for message transfer through bridges" -readme = "README.md" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.3.0", default-features = false, features = ["derive"] } -log = { version = "0.4.14", default-features = false } - -# Substrate -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -pallet-bridge-transfer-primitives = { path = "../primitives", default-features = false } - -[dev-dependencies] -sp-version = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = ["std"] -std = [ - "codec/std", - "log/std", - "scale-info/std", - "pallet-bridge-transfer-primitives/std", - "sp-std/std", - "sp-runtime/std", - "frame-support/std", - "frame-system/std", - "xcm/std", - "xcm-builder/std", -] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", -] -try-runtime = ["frame-support/try-runtime"] diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/benchmarking.rs b/parachains/pallets/bridge-transfer/onchain-config/src/benchmarking.rs deleted file mode 100644 index 03f4235ca56..00000000000 --- a/parachains/pallets/bridge-transfer/onchain-config/src/benchmarking.rs +++ /dev/null @@ -1,263 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! `BridgeTransfer` on-chain configuration pallet benchmarks. - -use crate::{ - types::{ - filter::MultiLocationFilter, AssetFilterOf, BridgeConfig, LatestVersionedMultiLocation, - }, - AllowedExporters, AllowedReserveLocations, AllowedUniversalAliases, BenchmarkHelper, Call, - Config, Event, Pallet, -}; - -use frame_benchmarking::{benchmarks, BenchmarkError}; -use frame_support::{ - assert_ok, ensure, - traits::{EnsureOrigin, EnsureOriginWithArg, Get}, - BoundedVec, -}; -use sp_std::prelude::*; -use xcm::prelude::*; - -#[cfg(feature = "runtime-benchmarks")] -impl Pallet { - #[cfg(feature = "runtime-benchmarks")] - pub fn insert_universal_alias_for_benchmarks((location, junction): (MultiLocation, Junction)) { - assert!(matches!( - AllowedUniversalAliases::::try_mutate( - LatestVersionedMultiLocation(&location), - |junctions| junctions.try_insert(junction) - ), - Ok(true) - )); - } -} - -benchmarks! { - add_exporter_config { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - }: _( - origin, - bridged_network, - Box::new(maybe_paid_bridge.location.clone().into_versioned()), - maybe_paid_bridge.maybe_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) - ) - verify { - assert_eq!( - AllowedExporters::::get(bridged_network).unwrap().to_bridge_location().expect("stored config"), - maybe_paid_bridge - ); - } - - remove_exporter_config { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - AllowedExporters::::insert( - bridged_network, - BridgeConfig::new( - maybe_paid_bridge.location.into_versioned(), - maybe_paid_bridge.maybe_fee.map(|fee| VersionedMultiAsset::V3(fee)) - ) - ); - }: _(origin, bridged_network) - verify { - assert_eq!(AllowedExporters::::get(bridged_network), None); - } - - update_exporter_config { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - AllowedExporters::::insert( - bridged_network, - BridgeConfig::new( - maybe_paid_bridge.location.into_versioned(), - None - ) - ); - - let new_bridge_location_fee = Some(MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(1_000_0000), - }); - }: _( - origin, - bridged_network, - new_bridge_location_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) - ) - verify { - assert_eq!( - AllowedExporters::::get(bridged_network).unwrap().to_bridge_location().expect("stored config").maybe_fee, - new_bridge_location_fee - ); - } - - update_bridged_target_location { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - if T::TargetLocationsPerExporterLimit::get() <= 0 { - return Err(BenchmarkError::Weightless); - } - let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - let allowed_bridged_target_location = T::BenchmarkHelper::allowed_bridged_target_location() - .ok_or(BenchmarkError::Stop("missing `allowed_bridged_target_location` data"))?; - AllowedExporters::::insert( - bridged_network, - BridgeConfig::new( - maybe_paid_bridge.location.into_versioned(), - None - ) - ); - let new_target_location_fee = Some(MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(1_000_0000), - }); - }: _( - origin, - bridged_network, - Box::new(allowed_bridged_target_location.location.clone().into_versioned()), - new_target_location_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) - ) - verify { - let bridge_config = AllowedExporters::::get(bridged_network).unwrap(); - assert!( - bridge_config.allowed_target_location_for(&allowed_bridged_target_location.location).expect("stored target_location").is_some() - ); - } - - allow_reserve_asset_transfer_for { - let asset_filter = AssetFilterOf::::All; - - let origin = T::AllowReserveAssetTransferOrigin::try_successful_origin(&asset_filter).map_err(|_| BenchmarkError::Weightless)?; - if T::TargetLocationsPerExporterLimit::get() <= 0 { - return Err(BenchmarkError::Weightless); - } - - let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - let allowed_bridged_target_location = T::BenchmarkHelper::allowed_bridged_target_location() - .ok_or(BenchmarkError::Stop("missing `allowed_bridged_target_location` data"))?; - let mut bridge_config = BridgeConfig::new( - maybe_paid_bridge.location.into_versioned(), - None - ); - assert_ok!(bridge_config.update_allowed_target_location( - allowed_bridged_target_location.location.into_versioned(), - allowed_bridged_target_location.maybe_fee.map(|fee| VersionedMultiAsset::V3(fee)) - )); - AllowedExporters::::insert(bridged_network, bridge_config); - - }: _( - origin, - bridged_network, - Box::new(allowed_bridged_target_location.location.clone().into_versioned()), - asset_filter.clone() - ) - verify { - let bridge_config = AllowedExporters::::get(bridged_network).unwrap(); - let allowed_target_location = bridge_config.allowed_target_location_for( - &allowed_bridged_target_location.location - ).expect("stored target_location").unwrap(); - assert_eq!( - allowed_target_location.1, - Some(asset_filter) - ); - } - - add_universal_alias { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (location, junction) = match T::BenchmarkHelper::universal_alias() { - Some(alias) => alias, - None => match T::UniversalAliasesLimit::get() > 0_u32 { - true => return Err(BenchmarkError::Stop("missing `universal_alias` data")), - false => return Err(BenchmarkError::Weightless), - } - }; - }: _(origin, Box::new(location.clone()), junction) - verify { - assert!( - AllowedUniversalAliases::::get(LatestVersionedMultiLocation::try_from(&location).expect("ok")).contains(&junction) - ); - } - - remove_universal_alias { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (location, junction) = match T::BenchmarkHelper::universal_alias() { - Some(alias) => alias, - None => match T::UniversalAliasesLimit::get() > 0_u32 { - true => return Err(BenchmarkError::Stop("missing `universal_alias` data")), - false => return Err(BenchmarkError::Weightless), - } - }; - Pallet::::insert_universal_alias_for_benchmarks((location.clone().try_into().unwrap(), junction)); - }: _(origin, Box::new(location.clone()), vec![junction.clone()]) - verify { - assert!(!AllowedUniversalAliases::::get(LatestVersionedMultiLocation::try_from(&location).expect("ok")).contains(&junction)); - } - - add_reserve_location { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let reserve_location = if T::ReserveLocationsLimit::get() > 0_u32 { - match T::BenchmarkHelper::reserve_location() { - Some(location) => location, - None => return Err(BenchmarkError::Stop("missing `reserve_location` data")), - } - } else { - return Err(BenchmarkError::Weightless); - }; - let asset_filter: AssetFilterOf = if T::AssetsPerReserveLocationLimit::get() > 0_u32 { - let assets = (0..T::AssetsPerReserveLocationLimit::get()) - .map(|i| MultiLocation::new(1, X1(Parachain(i))).into_versioned()) - .collect::>(); - MultiLocationFilter { - equals_any: BoundedVec::truncate_from(assets), - starts_with_any: Default::default(), - }.into() - } else { - return Err(BenchmarkError::Weightless); - }; - }: _(origin, Box::new(reserve_location.clone()), asset_filter.clone()) - verify { - assert_eq!( - AllowedReserveLocations::::get(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok")), - Some(asset_filter) - ); - } - - remove_reserve_location { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let reserve_location = if T::ReserveLocationsLimit::get() > 0_u32 { - match T::BenchmarkHelper::reserve_location() { - Some(location) => location, - None => return Err(BenchmarkError::Stop("missing `reserve_location` data")), - } - } else { - return Err(BenchmarkError::Weightless); - }; - AllowedReserveLocations::::insert(reserve_location.clone(), AssetFilterOf::::All); - assert!(AllowedReserveLocations::::contains_key(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok"))); - }: _(origin, Box::new(reserve_location.clone()), None) - verify { - assert!(!AllowedReserveLocations::::contains_key(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok"))); - } - - impl_benchmark_test_suite!(Pallet, crate::tests::new_test_ext(), crate::tests::TestRuntime); -} diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/features.rs b/parachains/pallets/bridge-transfer/onchain-config/src/features.rs deleted file mode 100644 index fc220f70454..00000000000 --- a/parachains/pallets/bridge-transfer/onchain-config/src/features.rs +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::{ - types::{AssetFilterT, LatestVersionedMultiLocation}, - AllowedExporters, Config, Pallet, LOG_TARGET, -}; -use frame_support::traits::{Contains, ContainsPair}; -use pallet_bridge_transfer_primitives::{ - EnsureReachableDestination, MaybePaidLocation, ReachableDestination, ReachableDestinationError, -}; -use xcm::prelude::*; -use xcm_builder::ExporterFor; - -/// Implementation of `EnsureReachableDestination` which checks on-chain configuration with `AllowedExporters` -impl EnsureReachableDestination for Pallet { - fn ensure_destination( - remote_network: NetworkId, - remote_destination: MultiLocation, - ) -> Result { - match AllowedExporters::::get(&remote_network) { - Some(bridge_config) => { - match bridge_config.allowed_target_location_for(&remote_destination) { - Ok(Some((target_location, _))) => Ok(ReachableDestination { - bridge: bridge_config.to_bridge_location()?, - target: target_location, - target_destination: remote_destination, - }), - Ok(None) => Err(ReachableDestinationError::UnsupportedDestination), - Err(_) => Err(ReachableDestinationError::UnsupportedXcmVersion), - } - }, - None => Err(ReachableDestinationError::UnsupportedDestination), - } - } -} - -/// `ExporterFor` implementation to check if we can transfer anything to `NetworkId` -impl ExporterFor for Pallet { - fn exporter_for( - network: &NetworkId, - _remote_location: &InteriorMultiLocation, - _message: &Xcm<()>, - ) -> Option<(MultiLocation, Option)> { - match Self::allowed_exporters(network) { - Some(bridge_config) => match bridge_config.to_bridge_location() { - Ok(MaybePaidLocation { location, maybe_fee }) => Some((location, maybe_fee)), - Err(e) => { - log::warn!( - target: LOG_TARGET, - "Exporter for network: {:?} has error: {:?}!", - network, e - ); - None - }, - }, - None => None, - } - } -} - -/// Verifies if we have `(MultiLocation, Junction)` in allowed universal aliases. -pub struct AllowedUniversalAliasesOf(sp_std::marker::PhantomData); -impl Contains<(MultiLocation, Junction)> for AllowedUniversalAliasesOf { - fn contains((location, junction): &(MultiLocation, Junction)) -> bool { - log::trace!( - target: LOG_TARGET, - "AllowedUniversalAliasesOf location: {:?}, junction: {:?}", location, junction - ); - - Pallet::::allowed_universal_aliases(LatestVersionedMultiLocation(location)) - .contains(junction) - } -} - -/// Verifies if we can allow `(MultiAsset, MultiLocation)` as trusted reserve received from "bridge". -pub struct IsTrustedBridgedReserveForConcreteAsset(sp_std::marker::PhantomData); -impl ContainsPair - for IsTrustedBridgedReserveForConcreteAsset -{ - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { - log::trace!( - target: LOG_TARGET, - "IsTrustedBridgedReserveForConcreteAsset asset: {:?}, origin: {:?}", - asset, origin - ); - - let asset_location = match &asset.id { - Concrete(location) => location, - _ => return false, - }; - - let versioned_origin = LatestVersionedMultiLocation(origin); - Pallet::::allowed_reserve_locations(versioned_origin) - .map_or(false, |filter| match filter.matches(asset_location) { - Ok(result) => result, - Err(e) => { - log::error!( - target: LOG_TARGET, - "IsTrustedBridgedReserveForConcreteAsset has error: {:?} for asset_location: {:?} and origin: {:?}!", - e, asset_location, origin - ); - false - }, - }) - } -} - -/// Verifies if it is allowed for `(MultiAsset, MultiLocation)` to be transferred out as reserve based transfer over "bridge". -pub struct IsAllowedReserveBasedAssetTransferForConcreteAsset(sp_std::marker::PhantomData); -impl ContainsPair - for IsAllowedReserveBasedAssetTransferForConcreteAsset -{ - fn contains(asset: &MultiAsset, target_location: &MultiLocation) -> bool { - log::trace!( - target: LOG_TARGET, - "IsAllowedReserveBasedAssetTransferForConcreteAsset asset: {:?}, target_location: {:?}", - asset, target_location - ); - - let asset_location = match &asset.id { - Concrete(location) => location, - _ => return false, - }; - - match target_location.interior.global_consensus() { - Ok(target_consensus) => { - if let Some(bridge_config) = Pallet::::allowed_exporters(target_consensus) { - match bridge_config.allowed_target_location_for(target_location) { - Ok(Some((_, Some(asset_filter)))) => { - match asset_filter.matches(asset_location) { - Ok(matches) => matches, - Err(e) => { - log::error!( - target: LOG_TARGET, - "IsAllowedReserveBasedAssetTransferForConcreteAsset `asset_filter.matches` has error: {:?} for asset_location: {:?} and target_location: {:?}!", - e, asset_location, target_location - ); - false - }, - } - }, - Ok(_) => false, - Err(e) => { - log::warn!( - target: LOG_TARGET, - "IsAllowedReserveBasedAssetTransferForConcreteAsset allowed_target_location_for has error: {:?} for target_location: {:?}!", - e, target_location - ); - false - }, - } - } else { - log::warn!( - target: LOG_TARGET, - "IsAllowedReserveBasedAssetTransferForConcreteAsset missing configuration for target_consensus: {:?} of target_location: {:?}!", - target_consensus, target_location - ); - false - } - }, - Err(_) => { - log::warn!( - target: LOG_TARGET, - "IsAllowedReserveBasedAssetTransferForConcreteAsset target_location: {:?} does not contain global consensus!", - target_location - ); - false - }, - } - } -} diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/lib.rs b/parachains/pallets/bridge-transfer/onchain-config/src/lib.rs deleted file mode 100644 index c438379ae2f..00000000000 --- a/parachains/pallets/bridge-transfer/onchain-config/src/lib.rs +++ /dev/null @@ -1,562 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! # Bridge Transfer Pallet for on-chain configuration management -//! -//! ## Overview -//! -//! Pallet supports configuration for several independent scenarios: -//! -//! ### 1. Support to store on-chain bridge locations -//! -//! * Bridge locations/fees can be stored on-chain in [AllowedExporters] -//! * Managing bridge locations can be done with dedicated extrinsics: `add_exporter_config / remove_exporter_config / update_exporter_config` -//! * Pallet implements `xcm_builder::ExporterFor` which can be used with `xcm_builder::UnpaidRemoteExporter/SovereignPaidRemoteExporter` -//! -//! ### 2. Support to store on-chain allowed bridged target locations with asset filters -//! -//! * Managing target location and asset filer can be done with dedicated extrinsics: -//! * - `update_bridged_target_location / remove_bridged_target_location` - managing target location behind bridge -//! * - `allow_reserve_asset_transfer_for / disallow_reserve_asset_transfer_for` - managing asset filters -//! -//! ### 3. Support to store on-chain allowed universal aliases/origins -//! -//! * Aliases can be stored on-chain in [AllowedUniversalAliases] -//! * Managing bridge locations can be done with dedicated extrinsics: `add_universal_alias / remove_universal_alias` -//! * Stored aliases can be accessed by [features::AllowedUniversalAliasesOf] and configured for e.g. `xcm_executor::Config`: -//! ```nocompile -//! impl xcm_executor::Config for XcmConfig { -//! ... -//! type UniversalAliases = AllowedUniversalAliasesOf; -//! ... -//! } -//! ``` -//! -//! ### 4. Support to store on-chain allowed reserve locations with allowed asset filters -//! -//! * Reserve locations with asset filters can be stored on-chain in [AllowedReserveLocations] -//! * Managing bridge locations can be done with dedicated extrinsics: `add_reserve_location / remove_reserve_location` -//! * Stored reserve locations can be accessed by [features::IsTrustedBridgedReserveForConcreteAsset] and configured for e.g. `xcm_executor::Config`: -//! ```nocompile -//! impl xcm_executor::Config for XcmConfig { -//! ... -//! type IsReserve = IsTrustedBridgedReserveForConcreteAsset; -//! ... -//! } -//! ``` - -// Ensure we're `no_std` when compiling for Wasm. -#![cfg_attr(not(feature = "std"), no_std)] - -pub use pallet::*; -pub use pallet_bridge_transfer_primitives::MaybePaidLocation; -pub use types::{AssetFilterOf, MultiLocationFilterOf}; - -pub mod features; -mod types; -pub mod weights; - -#[cfg(feature = "runtime-benchmarks")] -mod benchmarking; - -#[cfg(test)] -mod tests; - -/// The log target of this pallet. -pub const LOG_TARGET: &str = "runtime::bridge-transfer::config"; - -#[frame_support::pallet] -pub mod pallet { - pub use crate::weights::WeightInfo; - - use crate::types::{ - filter::{AssetFilter, AssetFilterOf, MultiLocationFilterOf}, - BridgeConfig, LatestVersionedMultiLocation, UsingVersioned, - }; - use frame_support::{pallet_prelude::*, traits::EnsureOriginWithArg, BoundedBTreeSet}; - use frame_system::pallet_prelude::*; - use sp_std::boxed::Box; - use xcm::prelude::*; - - #[pallet::pallet] - pub struct Pallet(_); - - /// Everything we need to run benchmarks. - #[cfg(feature = "runtime-benchmarks")] - pub trait BenchmarkHelper { - /// Returns proper bridge location+fee for NetworkId, supported by the runtime. - /// - /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled - /// to support transfer to this destination **after** `prepare_asset_transfer` call. - fn bridge_location() -> Option<(NetworkId, MaybePaidLocation)> { - None - } - - /// Returns proper target_location location+fee supported by the runtime. - /// - /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled - /// to support transfer to this destination **after** `prepare_asset_transfer` call. - fn allowed_bridged_target_location() -> Option { - None - } - - fn universal_alias() -> Option<(VersionedMultiLocation, Junction)> { - None - } - - fn reserve_location() -> Option { - None - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl BenchmarkHelper for () { - fn bridge_location() -> Option<(NetworkId, MaybePaidLocation)> { - None - } - - fn allowed_bridged_target_location() -> Option { - None - } - - fn universal_alias() -> Option<(VersionedMultiLocation, Junction)> { - None - } - - fn reserve_location() -> Option { - None - } - } - - #[pallet::config] - pub trait Config: frame_system::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// Runtime's universal location - type UniversalLocation: Get; - - /// Weight information for extrinsics in this pallet. - type WeightInfo: WeightInfo; - - /// The configurable origin to allow bridges configuration management. - type AdminOrigin: EnsureOrigin; - /// The configurable origin to allow transfer out asset filters management. - type AllowReserveAssetTransferOrigin: EnsureOriginWithArg< - Self::RuntimeOrigin, - AssetFilterOf, - >; - - /// Max allowed universal aliases per one `MultiLocation` - /// (Config for transfer in) - #[pallet::constant] - type UniversalAliasesLimit: Get; - /// Max allowed reserve locations - /// (Config for transfer out) - #[pallet::constant] - type ReserveLocationsLimit: Get; - /// Max allowed assets for one reserve location - /// (Config for transfer in/out) - #[pallet::constant] - type AssetsPerReserveLocationLimit: Get; - /// Max allowed target locations per exporter (bridged network) - /// (Config for transfer out) - #[pallet::constant] - type TargetLocationsPerExporterLimit: Get; - - /// Benchmarks helper. - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper: BenchmarkHelper; - } - - /// Details of configured bridges which are allowed for **transfer out**. - /// (Config for transfer out) - #[pallet::storage] - #[pallet::getter(fn allowed_exporters)] - pub(super) type AllowedExporters = - StorageMap<_, Blake2_128Concat, NetworkId, BridgeConfig>; - - /// Holds allowed mappings `MultiLocation->Junction` for `UniversalAliases` - /// E.g: - /// BridgeHubMultiLocation1 -> NetworkId::Kusama - /// BridgeHubMultiLocation1 -> NetworkId::Polkadot - /// (Config for transfer in) - #[pallet::storage] - #[pallet::getter(fn allowed_universal_aliases)] - pub(super) type AllowedUniversalAliases = StorageMap< - _, - Blake2_128Concat, - VersionedMultiLocation, - BoundedBTreeSet, - ValueQuery, - >; - - /// Holds allowed mappings `MultiLocation` as trusted reserve locations for allowed assets - /// (Config for transfer in) - #[pallet::storage] - #[pallet::getter(fn allowed_reserve_locations)] - pub(super) type AllowedReserveLocations = - StorageMap<_, Blake2_128Concat, VersionedMultiLocation, AssetFilterOf, OptionQuery>; - - #[pallet::error] - #[cfg_attr(test, derive(PartialEq))] - pub enum Error { - InvalidConfiguration, - InvalidBridgeConfiguration, - UnavailableConfiguration, - ConfigurationAlreadyExists, - UnsupportedDestination, - UnsupportedXcmVersion, - InvalidRemoteDestination, - } - - #[pallet::event] - #[pallet::generate_deposit(pub (super) fn deposit_event)] - pub enum Event { - /// New bridge configuration was added - BridgeAdded, - /// Bridge configuration was removed - BridgeRemoved, - /// Bridge fee configuration was updated - BridgeFeeUpdated, - /// Target location for bridge was updated - BridgeTargetLocationUpdated, - - /// New universal alias was added - UniversalAliasAdded, - /// New universal alias was removed - UniversalAliasRemoved { junction: Junction }, - - /// New reserve location was added - ReserveLocationAdded, - /// New reserve location was removed - ReserveLocationRemoved, - } - - #[pallet::call] - impl Pallet { - /// Adds new bridge exporter, which allows transfer to this `bridged_network`. - /// - /// Parameters: - /// - /// * `bridged_network`: Network where we want to allow transfer funds - /// * `bridge_config`: contains location for BridgeHub in our network + fee - #[pallet::call_index(1)] - #[pallet::weight(T::WeightInfo::add_exporter_config())] - pub fn add_exporter_config( - origin: OriginFor, - bridged_network: NetworkId, - bridge_location: Box, - bridge_location_fee: Option>, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - - // allow just one exporter for one network (can be changed in future) - ensure!( - !AllowedExporters::::contains_key(bridged_network), - Error::::ConfigurationAlreadyExists - ); - - // check bridge is from local consensus - ensure!( - bridge_location - .using_versioned_ref(|versioned| versioned.parents) - .map_err(|_| Error::::UnsupportedXcmVersion)? <= - 1, - Error::::InvalidConfiguration - ); - - // insert - AllowedExporters::::insert( - bridged_network, - BridgeConfig::new(*bridge_location, bridge_location_fee.map(|fee| *fee)), - ); - - Self::deposit_event(Event::BridgeAdded); - Ok(()) - } - - /// Remove bridge configuration for specified `bridged_network`. - /// - /// Parameters: - /// - /// * `bridged_network`: Network where we want to remove - #[pallet::call_index(2)] - #[pallet::weight(T::WeightInfo::remove_exporter_config())] - pub fn remove_exporter_config( - origin: OriginFor, - bridged_network: NetworkId, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - ensure!( - AllowedExporters::::contains_key(bridged_network), - Error::::UnavailableConfiguration - ); - - AllowedExporters::::remove(bridged_network); - Self::deposit_event(Event::BridgeRemoved); - Ok(()) - } - - /// Updates bridge configuration for specified `bridged_network`. - /// - /// Parameters: - /// - /// * `bridged_network`: Network where we want to remove - /// * `bridge_location_fee`: New fee to update - #[pallet::call_index(3)] - #[pallet::weight(T::WeightInfo::update_exporter_config())] - pub fn update_exporter_config( - origin: OriginFor, - bridged_network: NetworkId, - bridge_location_fee: Option>, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - - AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { - let bridge_config = - maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; - bridge_config.bridge_location_fee = bridge_location_fee.map(|fee| *fee); - Self::deposit_event(Event::BridgeFeeUpdated); - Ok(()) - }) - } - - /// Alters bridge configuration with asset filter, which allows to send out matched assets to the `target_location` - /// - /// Parameters: - /// - /// * `bridged_network`: bridge identifier - /// * `target_location`: target location where we want to allow send assets - /// * `asset_filter`: asset filter to add - #[pallet::call_index(4)] - #[pallet::weight(T::WeightInfo::update_bridged_target_location())] - pub fn update_bridged_target_location( - origin: OriginFor, - bridged_network: NetworkId, - target_location: Box, - max_target_location_fee: Option>, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - ensure!( - T::TargetLocationsPerExporterLimit::get() > 0, - Error::::UnavailableConfiguration - ); - - AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { - let bridge_config = - maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; - bridge_config - .update_allowed_target_location( - *target_location, - max_target_location_fee.map(|fee| *fee), - ) - .map_err(|_| Error::::InvalidBridgeConfiguration)?; - Self::deposit_event(Event::BridgeTargetLocationUpdated); - Ok(()) - }) - } - - /// Alters bridge configuration with asset filter, which allows to send out matched assets to the `target_location` - /// - /// Parameters: - /// - /// * `bridged_network`: bridge identifier - /// * `target_location`: target location where we want to allow send assets - /// * `asset_filter`: asset filter to add - #[pallet::call_index(6)] - #[pallet::weight(T::WeightInfo::allow_reserve_asset_transfer_for())] - pub fn allow_reserve_asset_transfer_for( - origin: OriginFor, - bridged_network: NetworkId, - target_location: Box, - asset_filter: AssetFilterOf, - ) -> DispatchResult { - let _ = T::AllowReserveAssetTransferOrigin::ensure_origin(origin, &asset_filter)?; - ensure!( - T::TargetLocationsPerExporterLimit::get() > 0, - Error::::UnavailableConfiguration - ); - - AllowedExporters::::try_mutate_exists(bridged_network, |maybe_bridge_config| { - let bridge_config = - maybe_bridge_config.as_mut().ok_or(Error::::UnavailableConfiguration)?; - let was_added = bridge_config - .add_allowed_target_location_filter_for(*target_location, asset_filter) - .map_err(|_| Error::::InvalidBridgeConfiguration)?; - if was_added { - Self::deposit_event(Event::ReserveLocationAdded); - } - Ok(()) - }) - } - - /// Add `(MultiLocation, Junction)` mapping to `AllowedUniversalAliases` - /// - /// Parameters: - /// - /// * `location`: key - /// * `junction`: value - #[pallet::call_index(8)] - #[pallet::weight(T::WeightInfo::add_universal_alias())] - pub fn add_universal_alias( - origin: OriginFor, - location: Box, - junction: Junction, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - - let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) - .map_err(|_| Error::::UnsupportedXcmVersion)?; - AllowedUniversalAliases::::try_mutate(versioned_location, |junctions| { - if junctions.try_insert(junction).map_err(|_| Error::::InvalidConfiguration)? { - Self::deposit_event(Event::UniversalAliasAdded); - } - Ok(()) - }) - } - - /// Remove `(MultiLocation, Junction)` mapping from `AllowedUniversalAliases` - /// - /// Parameters: - /// - /// * `location`: key - /// * `junction`: value - #[pallet::call_index(9)] - #[pallet::weight(T::WeightInfo::remove_universal_alias())] - pub fn remove_universal_alias( - origin: OriginFor, - location: Box, - junctions_to_remove: sp_std::prelude::Vec, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - - let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) - .map_err(|_| Error::::UnsupportedXcmVersion)?; - AllowedUniversalAliases::::try_mutate_exists(versioned_location, |maybe_junctions| { - let junctions = - maybe_junctions.as_mut().ok_or(Error::::UnavailableConfiguration)?; - for jtr in junctions_to_remove { - if junctions.remove(&jtr) { - Self::deposit_event(Event::UniversalAliasRemoved { junction: jtr }); - } - } - - if junctions.is_empty() { - // no junctions, so remove entry from storage - *maybe_junctions = None; - } - - Ok(()) - }) - } - - /// Add `MultiLocation` + `AssetFilter` mapping to `AllowedReserveLocations` - /// - /// Parameters: - /// - /// * `location`: as reserve `MultiLocation` - /// * `asset_filter_to_add`: filter we want to add for that location - #[pallet::call_index(10)] - #[pallet::weight(T::WeightInfo::add_reserve_location())] - pub fn add_reserve_location( - origin: OriginFor, - location: Box, - asset_filter_to_add: AssetFilterOf, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - ensure!(T::ReserveLocationsLimit::get() > 0, Error::::UnavailableConfiguration); - ensure!( - T::AssetsPerReserveLocationLimit::get() > 0, - Error::::UnavailableConfiguration - ); - - let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) - .map_err(|_| Error::::UnsupportedXcmVersion)?; - AllowedReserveLocations::::try_mutate(versioned_location, |filter| { - let was_added = match filter { - Some(old_filter) => old_filter - .add(asset_filter_to_add) - .map_err(|_| Error::::InvalidConfiguration)?, - None => { - *filter = Some(asset_filter_to_add); - true - }, - }; - if was_added { - Self::deposit_event(Event::ReserveLocationAdded); - } - Ok(()) - }) - } - - /// Remove `MultiLocation` mapping from `AllowedReserveLocations`. - /// - /// Parameters: - /// - /// * `location`: as reserve `MultiLocation` - /// * `asset_filter_to_remove`: if `None` the whole `location` entry will be removed, otherwise only selected filters - #[pallet::call_index(11)] - #[pallet::weight(T::WeightInfo::remove_reserve_location())] - pub fn remove_reserve_location( - origin: OriginFor, - location: Box, - asset_filter_to_remove: Option>, - ) -> DispatchResult { - let _ = T::AdminOrigin::ensure_origin(origin)?; - - let versioned_location = LatestVersionedMultiLocation::try_from(location.as_ref()) - .map_err(|_| Error::::UnsupportedXcmVersion)?; - let (mut was_removed, remove_location) = if let Some(asset_filter_to_remove) = - asset_filter_to_remove - { - AllowedReserveLocations::::try_mutate_exists( - versioned_location, - |maybe_filter| { - let filter = - maybe_filter.as_mut().ok_or(Error::::UnavailableConfiguration)?; - match filter { - AssetFilter::ByMultiLocation(old) => { - let was_removed = old.remove(asset_filter_to_remove); - was_removed.map(|wr| (wr, old.is_empty())).map_err(Into::into) - }, - AssetFilter::All => Err(Error::::UnavailableConfiguration), - } - }, - )? - } else { - (false, true) - }; - - if remove_location { - was_removed |= AllowedReserveLocations::::try_mutate_exists(location, |value| { - let exists = value.is_some(); - if exists { - *value = None; - } - Ok::<_, Error>(exists) - }) - .map_err(|_| Error::::InvalidConfiguration)?; - } - - if was_removed { - Self::deposit_event(Event::ReserveLocationRemoved); - Ok(()) - } else { - Err(Error::::InvalidConfiguration.into()) - } - } - } -} diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/tests.rs b/parachains/pallets/bridge-transfer/onchain-config/src/tests.rs deleted file mode 100644 index 21b77f6301a..00000000000 --- a/parachains/pallets/bridge-transfer/onchain-config/src/tests.rs +++ /dev/null @@ -1,545 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate as bridge_transfer; -use frame_support::traits::{AsEnsureOriginWithArg, ConstU32, Contains, ContainsPair}; - -use crate::{ - features::{ - AllowedUniversalAliasesOf, IsAllowedReserveBasedAssetTransferForConcreteAsset, - IsTrustedBridgedReserveForConcreteAsset, - }, - pallet::{AllowedReserveLocations, AllowedUniversalAliases}, - types::{ - filter::{AssetFilter, MultiLocationFilter}, - BridgeConfig, LatestVersionedMultiLocation, - }, - AllowedExporters, Config, -}; -use frame_support::{ - assert_noop, assert_ok, dispatch::DispatchError, parameter_types, sp_io, sp_tracing, BoundedVec, -}; -use frame_system::EnsureRoot; -use sp_runtime::{ - testing::{Header, H256}, - traits::{BlakeTwo256, IdentityLookup}, - AccountId32, ModuleError, -}; -use sp_version::RuntimeVersion; -use xcm::prelude::*; -use xcm_builder::ExporterFor; - -type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; -type Block = frame_system::mocking::MockBlock; - -frame_support::construct_runtime!( - pub enum TestRuntime where - Block = Block, - NodeBlock = Block, - UncheckedExtrinsic = UncheckedExtrinsic, - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - BridgeTransfer: bridge_transfer::{Pallet, Call, Event} = 52, - } -); - -parameter_types! { - pub const BlockHashCount: u64 = 250; - pub Version: RuntimeVersion = RuntimeVersion { - spec_name: sp_version::create_runtime_str!("test"), - impl_name: sp_version::create_runtime_str!("system-test"), - authoring_version: 1, - spec_version: 1, - impl_version: 1, - apis: sp_version::create_apis_vec!([]), - transaction_version: 1, - state_version: 1, - }; -} - -pub type AccountId = AccountId32; - -impl frame_system::Config for TestRuntime { - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Index = u64; - type BlockNumber = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type Header = Header; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type BlockLength = (); - type BlockWeights = (); - type Version = Version; - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -parameter_types! { - pub const BridgedNetwork: NetworkId = NetworkId::ByGenesis([4; 32]); - pub const RelayNetwork: NetworkId = NetworkId::ByGenesis([9; 32]); - pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(1000)); - // Relay chain currency/balance location (e.g. KsmLocation, DotLocation, ..) - pub const RelayLocation: MultiLocation = MultiLocation::parent(); -} - -parameter_types! { - pub const AssetsLimit: u8 = 1; -} - -impl Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type UniversalLocation = UniversalLocation; - type WeightInfo = (); - type AdminOrigin = EnsureRoot; - type AllowReserveAssetTransferOrigin = AsEnsureOriginWithArg>; - type UniversalAliasesLimit = ConstU32<2>; - type ReserveLocationsLimit = ConstU32<2>; - type AssetsPerReserveLocationLimit = ConstU32<2>; - type TargetLocationsPerExporterLimit = ConstU32<2>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -pub(crate) fn new_test_ext() -> sp_io::TestExternalities { - sp_tracing::try_init_simple(); - let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); - - // with 0 block_number events dont work - let mut ext = sp_io::TestExternalities::new(t); - ext.execute_with(|| { - frame_system::Pallet::::set_block_number(1u32.into()); - }); - - ext -} - -fn account(account: u8) -> AccountId32 { - AccountId32::new([account; 32]) -} - -#[test] -fn allowed_exporters_management_works() { - let bridged_network = BridgedNetwork::get(); - let bridge_location = MultiLocation::new(1, X1(Parachain(1013))); - let dummy_xcm = Xcm(vec![]); - let dummy_remote_interior_multilocation = X1(Parachain(1234)); - - new_test_ext().execute_with(|| { - assert_eq!(AllowedExporters::::iter().count(), 0); - - // should fail - just root is allowed - assert_noop!( - BridgeTransfer::add_exporter_config( - RuntimeOrigin::signed(account(1)), - bridged_network, - Box::new(bridge_location.clone().into_versioned()), - None - ), - DispatchError::BadOrigin - ); - - // should fail - we expect local bridge - assert_noop!( - BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(MultiLocation::new(2, X1(Parachain(1234))).into_versioned()), - None - ), - DispatchError::Module(ModuleError { - index: 52, - error: [0, 0, 0, 0], - message: Some("InvalidConfiguration") - }) - ); - assert_eq!(AllowedExporters::::iter().count(), 0); - assert_eq!( - BridgeTransfer::exporter_for( - &bridged_network, - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - None - ); - - // add with root - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(bridge_location.clone().into_versioned()), - None - )); - assert_eq!(AllowedExporters::::iter().count(), 1); - assert_eq!( - AllowedExporters::::get(bridged_network), - Some(BridgeConfig::new(VersionedMultiLocation::from(bridge_location), None)) - ); - assert_eq!(AllowedExporters::::get(&RelayNetwork::get()), None); - assert_eq!( - BridgeTransfer::exporter_for( - &bridged_network, - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - Some((bridge_location.clone(), None)) - ); - assert_eq!( - BridgeTransfer::exporter_for( - &RelayNetwork::get(), - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - None - ); - - // update fee - // remove - assert_ok!(BridgeTransfer::update_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Some(VersionedMultiAsset::V3((Parent, 200u128).into()).into()), - )); - assert_eq!(AllowedExporters::::iter().count(), 1); - assert_eq!( - AllowedExporters::::get(bridged_network), - Some(BridgeConfig::new( - VersionedMultiLocation::from(bridge_location), - Some((Parent, 200u128).into()) - )) - ); - assert_eq!( - BridgeTransfer::exporter_for( - &bridged_network, - &dummy_remote_interior_multilocation, - &dummy_xcm - ), - Some((bridge_location, Some((Parent, 200u128).into()))) - ); - - // remove - assert_ok!(BridgeTransfer::remove_exporter_config(RuntimeOrigin::root(), bridged_network,)); - assert_eq!(AllowedExporters::::get(bridged_network), None); - assert_eq!(AllowedExporters::::iter().count(), 0); - }) -} - -#[test] -fn allowed_universal_aliases_management_works() { - new_test_ext().execute_with(|| { - assert_eq!(AllowedUniversalAliases::::iter().count(), 0); - - let location1 = MultiLocation::new(1, X1(Parachain(1014))); - let junction1 = GlobalConsensus(ByGenesis([1; 32])); - let junction2 = GlobalConsensus(ByGenesis([2; 32])); - - // should fail - just root is allowed - assert_noop!( - BridgeTransfer::add_universal_alias( - RuntimeOrigin::signed(account(1)), - Box::new(VersionedMultiLocation::V3(location1.clone())), - junction1.clone(), - ), - DispatchError::BadOrigin - ); - assert_eq!(AllowedUniversalAliases::::iter().count(), 0); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - - // add ok - assert_ok!(BridgeTransfer::add_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - junction1.clone(), - )); - assert_ok!(BridgeTransfer::add_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - junction2.clone(), - )); - assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - assert_eq!(AllowedUniversalAliases::::iter().count(), 1); - - // remove ok - assert_ok!(BridgeTransfer::remove_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - vec![junction1.clone()], - )); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - assert_eq!(AllowedUniversalAliases::::iter().count(), 1); - - assert_ok!(BridgeTransfer::remove_universal_alias( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - vec![junction2.clone()], - )); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction1))); - assert!(!AllowedUniversalAliasesOf::::contains(&(location1, junction2))); - assert_eq!(AllowedUniversalAliases::::iter().count(), 0); - }) -} - -#[test] -fn allowed_reserve_locations_management_works() { - new_test_ext().execute_with(|| { - assert_eq!(0, AllowedReserveLocations::::iter_values().count()); - - let location1 = MultiLocation::new(1, X1(Parachain(1014))); - let location1_as_latest = VersionedMultiLocation::from(location1.clone()); - let location1_as_latest_as_key = - LatestVersionedMultiLocation::try_from(&location1_as_latest).expect("ok"); - let location2 = - MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([1; 32])), Parachain(1014))); - let location2_as_latest = VersionedMultiLocation::from(location2.clone()); - let location2_as_key = - LatestVersionedMultiLocation::try_from(&location2_as_latest).expect("ok"); - - let asset_location = MultiLocation::parent(); - let asset: MultiAsset = (asset_location, 200u128).into(); - - let asset_filter_for_asset_by_multilocation = MultiLocationFilter { - equals_any: BoundedVec::truncate_from(vec![asset_location.into_versioned()]), - starts_with_any: Default::default(), - }; - let asset_filter_for_asset = - AssetFilter::ByMultiLocation(asset_filter_for_asset_by_multilocation.clone()); - let asset_filter_for_other_by_multilocation = MultiLocationFilter { - equals_any: BoundedVec::truncate_from(vec![ - MultiLocation::new(3, Here).into_versioned() - ]), - starts_with_any: Default::default(), - }; - let asset_filter_for_other = - AssetFilter::ByMultiLocation(asset_filter_for_other_by_multilocation.clone()); - - // should fail - just root is allowed - assert_noop!( - BridgeTransfer::add_reserve_location( - RuntimeOrigin::signed(account(1)), - Box::new(location1_as_latest.clone()), - asset_filter_for_asset.clone(), - ), - DispatchError::BadOrigin - ); - assert!(AllowedReserveLocations::::get(&location1_as_latest_as_key).is_none()); - assert!(AllowedReserveLocations::::get(&location2_as_key).is_none()); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - - // add ok - assert_ok!(BridgeTransfer::add_reserve_location( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location1.clone())), - asset_filter_for_asset.clone() - )); - assert_ok!(BridgeTransfer::add_reserve_location( - RuntimeOrigin::root(), - Box::new(VersionedMultiLocation::V3(location2.clone())), - asset_filter_for_other.clone() - )); - assert_eq!(2, AllowedReserveLocations::::iter_values().count()); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - - assert_ok!(BridgeTransfer::add_reserve_location( - RuntimeOrigin::root(), - Box::new(location2_as_latest.clone()), - asset_filter_for_asset.clone() - )); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - - // test remove - assert_noop!( - BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location1_as_latest.clone()), - Some(asset_filter_for_other_by_multilocation.clone()) - ), - DispatchError::Module(ModuleError { - index: 52, - error: [0, 0, 0, 0], - message: Some("UnavailableConfiguration") - }) - ); - - assert_ok!(BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location1_as_latest.clone()), - Some(asset_filter_for_asset_by_multilocation.clone()) - )); - assert_eq!(1, AllowedReserveLocations::::iter_values().count()); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - - assert_ok!(BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location2_as_latest.clone()), - Some(asset_filter_for_other_by_multilocation.clone()) - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - - assert_ok!(BridgeTransfer::remove_reserve_location( - RuntimeOrigin::root(), - Box::new(location2_as_latest), - Some(asset_filter_for_asset_by_multilocation) - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location1 - )); - assert!(!IsTrustedBridgedReserveForConcreteAsset::::contains( - &asset, &location2 - )); - }) -} - -#[test] -fn allowed_bridged_target_location_management_works() { - new_test_ext().execute_with(|| { - assert_eq!(0, AllowedExporters::::iter_values().count()); - - let bridged_network = BridgedNetwork::get(); - let bridge_location: MultiLocation = (Parent, Parachain(1013)).into(); - let target_location: MultiLocation = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - - // should fail - we need BridgeConfig first - assert_noop!( - BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::All, - ), - DispatchError::Module(ModuleError { - index: 52, - error: [2, 0, 0, 0], - message: Some("UnavailableConfiguration") - }) - ); - - // add bridge config - assert_ok!(BridgeTransfer::add_exporter_config( - RuntimeOrigin::root(), - bridged_network, - Box::new(bridge_location.into_versioned()), - None, - )); - - // should fail - we need also target_location first - assert_noop!( - BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::All, - ), - DispatchError::Module(ModuleError { - index: 52, - error: [1, 0, 0, 0], - message: Some("InvalidBridgeConfiguration") - }) - ); - - // insert allowed target location - assert_ok!(BridgeTransfer::update_bridged_target_location( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - None, - )); - - let asset1_location = MultiLocation::new(2, X2(Parachain(1235), Parachain(5678))); - let asset1 = MultiAsset::from((asset1_location, 1000)); - assert!(!IsAllowedReserveBasedAssetTransferForConcreteAsset::::contains( - &asset1, - &target_location - )); - - // now should pass - add one start_with pattern - assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::ByMultiLocation(MultiLocationFilter { - equals_any: Default::default(), - starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( - 2, - X1(Parachain(2223)) - ) - .into_versioned()]), - }), - )); - - // not allowed yet - assert!(!IsAllowedReserveBasedAssetTransferForConcreteAsset::::contains( - &asset1, - &target_location - )); - - // now should pass - add another start_with pattern - assert_ok!(BridgeTransfer::allow_reserve_asset_transfer_for( - RuntimeOrigin::root(), - bridged_network, - Box::new(target_location.clone().into_versioned()), - AssetFilter::ByMultiLocation(MultiLocationFilter { - equals_any: Default::default(), - starts_with_any: BoundedVec::truncate_from(vec![MultiLocation::new( - 2, - X1(Parachain(1235)) - ) - .into_versioned()]), - }), - )); - - // ok - assert!(IsAllowedReserveBasedAssetTransferForConcreteAsset::::contains( - &asset1, - &target_location - )); - }) -} diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/types.rs b/parachains/pallets/bridge-transfer/onchain-config/src/types.rs deleted file mode 100644 index 1aa295925fe..00000000000 --- a/parachains/pallets/bridge-transfer/onchain-config/src/types.rs +++ /dev/null @@ -1,459 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::Config; -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::pallet_prelude::{CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound}; -use pallet_bridge_transfer_primitives::MaybePaidLocation; -use scale_info::TypeInfo; -use xcm::prelude::*; - -pub use crate::types::{ - config::BridgeConfig, - filter::{AssetFilterOf, AssetFilterT, MultiLocationFilterOf}, - xcm_version::{LatestVersionedMultiLocation, UnsupportedXcmVersionError, UsingVersioned}, -}; - -pub mod config { - use super::*; - use crate::types::{ - filter::{AssetFilterError, AssetFilterOf}, - UnsupportedXcmVersionError, - }; - use frame_support::BoundedBTreeMap; - - #[derive( - Encode, Decode, MaxEncodedLen, TypeInfo, RuntimeDebugNoBound, CloneNoBound, PartialEqNoBound, - )] - #[scale_info(skip_type_params(T))] - pub struct BridgeConfig { - /// Contains location, which is able to bridge XCM messages to bridged network - bridge_location: VersionedMultiLocation, - /// Fee which could be needed to pay in `bridge_location` - /// `MultiAsset` is here from the point of view of `bridge_location`, e.g.: `MultiLocation::parent()` means relay chain token of `bridge_location` - pub(crate) bridge_location_fee: Option, - - /// Contains target destination on bridged network. E.g.: MultiLocation of Statemine/t on different consensus + its configuration - pub(crate) allowed_target_locations: BoundedBTreeMap< - VersionedMultiLocation, - TargetLocationConfig, - T::TargetLocationsPerExporterLimit, - >, - } - - impl BridgeConfig { - pub fn new( - bridge_location: VersionedMultiLocation, - bridge_location_fee: Option, - ) -> Self { - Self { - bridge_location, - bridge_location_fee, - allowed_target_locations: Default::default(), - } - } - - /// Tries to find target destination configuration for destination. - pub fn allowed_target_location_for( - &self, - destination: &MultiLocation, - ) -> Result>)>, UnsupportedXcmVersionError> - { - for (target_location, cfg) in &self.allowed_target_locations { - let target_location = target_location.as_versioned_ref()?; - // if destination matches target_location, we found our configuration - if destination.starts_with(target_location) || destination.eq(target_location) { - let maybe_fee = match &cfg.max_target_location_fee { - Some(fee) => Some(fee.as_versioned_ref()?.clone()), - None => None, - }; - return Ok(Some(( - MaybePaidLocation { location: target_location.clone(), maybe_fee }, - cfg.allowed_reserve_assets.clone(), - ))) - } - } - Ok(None) - } - - pub fn update_allowed_target_location( - &mut self, - target_location: VersionedMultiLocation, - max_target_location_fee: Option, - ) -> Result<(), BridgeConfigError> { - // lets try update existing - for (stored_target, cfg) in self.allowed_target_locations.iter_mut() { - let stored_target = stored_target.as_versioned_ref()?; - let target_location = target_location.as_versioned_ref()?; - // if stored_target matches target_location, we found our configuration - if stored_target.eq(target_location) { - cfg.max_target_location_fee = max_target_location_fee; - return Ok(()) - } - } - - // if not found, just insert - self.allowed_target_locations - .try_insert( - target_location, - TargetLocationConfig { max_target_location_fee, allowed_reserve_assets: None }, - ) - .map(|_| ()) - .map_err(|_| BridgeConfigError::LimitReached) - } - - pub fn add_allowed_target_location_filter_for( - &mut self, - target_location: VersionedMultiLocation, - new_asset_filter: AssetFilterOf, - ) -> Result { - for (stored_target, cfg) in self.allowed_target_locations.iter_mut() { - let stored_target = stored_target.as_versioned_ref()?; - let target_location = target_location.as_versioned_ref()?; - // if stored_target matches target_location, we found our configuration - if stored_target.eq(target_location) { - let was_added = match &mut cfg.allowed_reserve_assets { - Some(old_asset_filter) => old_asset_filter.add(new_asset_filter)?, - None => { - cfg.allowed_reserve_assets = Some(new_asset_filter); - true - }, - }; - return Ok(was_added) - } - } - return Err(BridgeConfigError::MissingTargetLocation) - } - - pub fn to_bridge_location(self) -> Result { - let maybe_fee = match self.bridge_location_fee { - Some(fee) => Some(fee.to_versioned()?), - None => None, - }; - Ok(MaybePaidLocation { location: self.bridge_location.to_versioned()?, maybe_fee }) - } - } - - #[derive( - Encode, Decode, MaxEncodedLen, TypeInfo, RuntimeDebugNoBound, CloneNoBound, PartialEqNoBound, - )] - #[scale_info(skip_type_params(T))] - pub struct TargetLocationConfig { - /// If `None` then `UnpaidExecution` is used, else `Withdraw(target_location_fee)/BuyExecution(target_location_fee, Unlimited)` - /// `MultiAsset` is here from the point of view of `allowed_target_location`, e.g.: `MultiLocation::parent()` means relay chain token of `allowed_target_location` - pub max_target_location_fee: Option, - - /// Filter for allowed asset that can be send out to the target location. - pub allowed_reserve_assets: Option>, - } - - #[derive(Debug)] - pub enum BridgeConfigError { - AssetFilterError(AssetFilterError), - MissingTargetLocation, - UnsupportedXcmVersionError(UnsupportedXcmVersionError), - LimitReached, - } - - impl From for BridgeConfigError { - fn from(e: UnsupportedXcmVersionError) -> Self { - Self::UnsupportedXcmVersionError(e) - } - } - - impl From for BridgeConfigError { - fn from(e: AssetFilterError) -> Self { - Self::AssetFilterError(e) - } - } -} - -pub mod filter { - use super::*; - - use crate::types::UnsupportedXcmVersionError; - use frame_support::{pallet_prelude::Get, BoundedVec}; - - pub type AssetFilterOf = AssetFilter<::AssetsPerReserveLocationLimit>; - pub type MultiLocationFilterOf = - MultiLocationFilter<::AssetsPerReserveLocationLimit>; - - pub trait AssetFilterT { - fn matches(&self, location: &MultiLocation) -> Result; - } - - #[derive(Debug)] - pub enum AssetFilterError { - UnsupportedXcmVersionError, - LimitReached, - } - - impl From for AssetFilterError { - fn from(_: UnsupportedXcmVersionError) -> Self { - Self::UnsupportedXcmVersionError - } - } - - impl From for crate::Error { - fn from(value: AssetFilterError) -> Self { - match value { - AssetFilterError::UnsupportedXcmVersionError => - crate::Error::::UnsupportedXcmVersion, - AssetFilterError::LimitReached => crate::Error::::InvalidConfiguration, - } - } - } - - #[derive( - CloneNoBound, - Encode, - Decode, - Eq, - PartialEqNoBound, - RuntimeDebugNoBound, - TypeInfo, - MaxEncodedLen, - Ord, - PartialOrd, - )] - #[scale_info(skip_type_params(AssetsLimit))] - pub enum AssetFilter> { - ByMultiLocation(MultiLocationFilter), - All, - } - - impl> AssetFilterT for AssetFilter { - fn matches(&self, location: &MultiLocation) -> Result { - match self { - AssetFilter::ByMultiLocation(by_location) => by_location.matches(location), - AssetFilter::All => Ok(true), - } - } - } - - impl> AssetFilter { - pub fn add( - &mut self, - new_filter: AssetFilter, - ) -> Result { - match new_filter { - AssetFilter::ByMultiLocation(by_location) => match self { - AssetFilter::ByMultiLocation(old_by_location) => - old_by_location.add(by_location), - AssetFilter::All => { - *self = AssetFilter::ByMultiLocation(by_location); - Ok(true) - }, - }, - AssetFilter::All => { - let mut was_added = false; - if !matches!(self, AssetFilter::All) { - *self = AssetFilter::All; - was_added = true - } - Ok(was_added) - }, - } - } - } - - #[derive( - CloneNoBound, - Encode, - Decode, - Eq, - PartialEqNoBound, - RuntimeDebugNoBound, - Default, - TypeInfo, - MaxEncodedLen, - Ord, - PartialOrd, - )] - #[scale_info(skip_type_params(PatternsLimit))] - pub struct MultiLocationFilter> { - /// Requested location equals to `MultiLocation` - pub equals_any: BoundedVec, - /// Requested location starts with `MultiLocation` - pub starts_with_any: BoundedVec, - } - - impl> MultiLocationFilter { - fn add( - &mut self, - to_add: MultiLocationFilter, - ) -> Result { - let add_if_not_found = |olds: &mut BoundedVec, - news: BoundedVec| - -> Result { - let mut was_added = false; - for new_ta in news { - if MultiLocationFilter::find_index(&olds, &new_ta)?.is_none() { - olds.try_push(new_ta).map_err(|_| AssetFilterError::LimitReached)?; - was_added = true; - } - } - Ok(was_added) - }; - - Ok(add_if_not_found(&mut self.equals_any, to_add.equals_any)? | - add_if_not_found(&mut self.starts_with_any, to_add.starts_with_any)?) - } - - pub fn remove( - &mut self, - to_remove: MultiLocationFilter, - ) -> Result { - let remove_from = |olds: &mut BoundedVec, - to_remove: BoundedVec| - -> Result { - let mut was_removed = false; - for tr in to_remove { - let found = MultiLocationFilter::find_index(olds, &tr)?; - if let Some(idx) = found { - _ = olds.remove(idx); - was_removed = true; - } - } - Ok(was_removed) - }; - - Ok(remove_from(&mut self.equals_any, to_remove.equals_any)? | - remove_from(&mut self.starts_with_any, to_remove.starts_with_any)?) - } - - fn find_index( - items: &BoundedVec, - searched: &VersionedMultiLocation, - ) -> Result, UnsupportedXcmVersionError> { - let searched = searched.as_versioned_ref()?; - for (idx, item) in items.iter().enumerate() { - let item = item.as_versioned_ref()?; - if item.eq(searched) { - return Ok(Some(idx)) - } - } - Ok(None) - } - - pub fn is_empty(&self) -> bool { - self.equals_any.is_empty() && self.starts_with_any.is_empty() - } - } - - impl> AssetFilterT for MultiLocationFilter { - fn matches(&self, location: &MultiLocation) -> Result { - for filter in &self.equals_any { - if filter.using_versioned_ref(|versioned| location.eq(versioned))? { - return Ok(true) - } - } - for filter in &self.starts_with_any { - if filter.using_versioned_ref(|versioned| location.starts_with(versioned))? { - return Ok(true) - } - } - Ok(false) - } - } - - impl> From> for AssetFilter { - fn from(value: MultiLocationFilter) -> Self { - AssetFilter::ByMultiLocation(value) - } - } -} - -pub mod xcm_version { - use super::*; - use crate::Config; - use codec::EncodeLike; - use pallet_bridge_transfer_primitives::ReachableDestinationError; - use xcm::TryAs; - - /// For simplified version mismatch handling - #[derive(Debug)] - pub struct UnsupportedXcmVersionError; - - impl From for crate::Error { - fn from(_: UnsupportedXcmVersionError) -> Self { - Self::UnsupportedXcmVersion - } - } - - impl From for ReachableDestinationError { - fn from(_: UnsupportedXcmVersionError) -> Self { - Self::UnsupportedXcmVersion - } - } - - /// Simplified adapter between `xcm::latest` and `Versioned*` stuff. - pub trait UsingVersioned: TryAs + TryInto { - fn using_versioned_ref R>( - &self, - f: F, - ) -> Result { - let versioned = self.try_as().map_err(|_| UnsupportedXcmVersionError)?; - Ok(f(versioned)) - } - - fn as_versioned_ref(&self) -> Result<&T, UnsupportedXcmVersionError> { - let versioned = self.try_as().map_err(|_| UnsupportedXcmVersionError)?; - Ok(versioned) - } - - fn to_versioned(self) -> Result { - let versioned = self.try_into().map_err(|_| UnsupportedXcmVersionError)?; - Ok(versioned) - } - } - - impl UsingVersioned for VersionedMultiLocation {} - - impl UsingVersioned for VersionedMultiAsset {} - - /// `KeyArg` wrapper for `VersionedMultiLocation`. - /// This feature allows to use `VersionedMultiLocation` as key, e.g. for `StorageMap`. - /// - /// NOTE: Because something like this does not work: - /// ```nocompile - /// let a = VersionedMultiLocation::V2(xcm::v2::MultiLocation::new(1, xcm::v2::Junctions::X1(xcm::v2::Junction::Parachain(1000)))); - /// let b = VersionedMultiLocation::V3(xcm::v3::MultiLocation::new(1, xcm::v3::Junctions::X1(xcm::v3::Junction::Parachain(1000)))); - /// assert_eq!(key_a, key_b); // <-- fails - /// ``` - #[derive(Copy, Clone)] - pub struct LatestVersionedMultiLocation<'a>(pub(crate) &'a MultiLocation); - - impl<'a> EncodeLike for LatestVersionedMultiLocation<'a> {} - - impl<'a> EncodeLike for &LatestVersionedMultiLocation<'a> {} - - impl<'a> Encode for LatestVersionedMultiLocation<'a> { - fn encode(&self) -> sp_std::vec::Vec { - let mut r = VersionedMultiLocation::from(MultiLocation::default()).encode(); - r.truncate(1); - self.0.using_encoded(|d| r.extend_from_slice(d)); - r - } - } - - impl<'a> TryFrom<&'a VersionedMultiLocation> for LatestVersionedMultiLocation<'a> { - type Error = UnsupportedXcmVersionError; - - fn try_from(value: &'a VersionedMultiLocation) -> Result { - value.as_versioned_ref().map(|v| LatestVersionedMultiLocation(v)) - } - } -} diff --git a/parachains/pallets/bridge-transfer/onchain-config/src/weights.rs b/parachains/pallets/bridge-transfer/onchain-config/src/weights.rs deleted file mode 100644 index 870405e72e3..00000000000 --- a/parachains/pallets/bridge-transfer/onchain-config/src/weights.rs +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Weights trait for the `pallet_bridge_assets_transfer` pallet. - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; -use sp_std::marker::PhantomData; - -/// Weight functions needed for pallet_bridge_assets_transfer. -pub trait WeightInfo { - /// Weight of the `add_exporter_config` call. - fn add_exporter_config() -> Weight; - /// Weight of the `remove_exporter_config` call. - fn remove_exporter_config() -> Weight; - /// Weight of the `update_exporter_config` call. - fn update_exporter_config() -> Weight; - - /// Weight of the `update_bridged_target_location` call. - fn update_bridged_target_location() -> Weight; - /// Weight of the `allow_reserve_asset_transfer` call. - fn allow_reserve_asset_transfer_for() -> Weight; - - /// Weight of the `add_universal_alias` call. - fn add_universal_alias() -> Weight; - /// Weight of the `remove_universal_alias` call. - fn remove_universal_alias() -> Weight; - - /// Weight of the `add_reserve_location` call. - fn add_reserve_location() -> Weight; - /// Weight of the `remove_reserve_location` call. - fn remove_reserve_location() -> Weight; -} - -// Zero weights to use in tests -impl WeightInfo for () { - fn add_exporter_config() -> Weight { - Weight::zero() - } - - fn remove_exporter_config() -> Weight { - Weight::zero() - } - - fn update_exporter_config() -> Weight { - Weight::zero() - } - - fn update_bridged_target_location() -> Weight { - Weight::zero() - } - - fn allow_reserve_asset_transfer_for() -> Weight { - Weight::zero() - } - - fn add_universal_alias() -> Weight { - Weight::zero() - } - - fn remove_universal_alias() -> Weight { - Weight::zero() - } - - fn add_reserve_location() -> Weight { - Weight::zero() - } - - fn remove_reserve_location() -> Weight { - Weight::zero() - } -} From 2f5ea0c77ffbb0663f3e704ad83f1085dd14669c Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 12 Jun 2023 16:13:45 +0200 Subject: [PATCH 317/339] Removed line --- parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index d82c7263267..2d5800d7b77 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -496,7 +496,6 @@ impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { } } - /// All configuration related to bridging pub mod bridging { use super::*; From 37a58640648db903d1486d87e3d58a123a5f8b5b Mon Sep 17 00:00:00 2001 From: Alistair Singh Date: Mon, 12 Jun 2023 16:12:59 +0200 Subject: [PATCH 318/339] remove bad automerge --- Cargo.lock | 3 - .../assets/asset-hub-kusama/0_xcm/2_ump.yml | 7 - .../assets/asset-hub-polkadot/0_xcm/2_ump.yml | 7 - .../e2e/assets/statemine/0_xcm/0_init.yml | 145 ---- .../e2e/assets/statemine/0_xcm/1_dmp.yml | 267 ------- .../e2e/assets/statemine/0_xcm/2_ump.yml | 200 ----- .../0_xcm/3_force_hrmp-open-channels.yml | 122 --- .../e2e/assets/statemine/0_xcm/4_hrmp.yml | 390 ---------- .../e2e/assets/statemine/config.toml | 71 -- .../e2e/assets/statemint/0_xcm/0_init.yml | 145 ---- .../e2e/assets/statemint/0_xcm/1_dmp.yml | 267 ------- .../e2e/assets/statemint/0_xcm/2_ump.yml | 203 ----- .../0_xcm/3_force_hrmp-open-channels.yml | 120 --- .../e2e/assets/statemint/0_xcm/4_hrmp.yml | 390 ---------- .../e2e/assets/statemint/config.toml | 72 -- .../emulated/assets/statemine/Cargo.toml | 36 - .../emulated/assets/statemine/src/lib.rs | 30 - .../assets/statemine/src/tests/mod.rs | 3 - .../statemine/src/tests/reserve_transfer.rs | 63 -- .../assets/statemine/src/tests/teleport.rs | 62 -- .../assets/statemine/src/tests/transact.rs | 58 -- .../emulated/assets/statemint/Cargo.toml | 36 - .../emulated/assets/statemint/src/lib.rs | 33 - .../assets/statemint/src/tests/mod.rs | 3 - .../statemint/src/tests/reserve_transfer.rs | 63 -- .../assets/statemint/src/tests/teleport.rs | 60 -- .../assets/statemint/src/tests/transact.rs | 58 -- .../bridge-transfer/src/benchmarking.rs | 1 + .../src/weights/frame_system.rs | 3 - .../src/weights/pallet_assets.rs | 5 +- .../assets/asset-hub-kusama/tests/tests.rs | 1 - .../assets/asset-hub-polkadot/Cargo.toml | 9 - .../asset-hub-polkadot/src/weights/mod.rs | 1 - .../src/weights/pallet_assets.rs | 2 +- .../asset-hub-polkadot/src/weights/xcm/mod.rs | 2 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 2 + .../asset-hub-polkadot/src/xcm_config.rs | 7 +- .../assets/asset-hub-polkadot/tests/tests.rs | 82 -- .../assets/asset-hub-westend/Cargo.toml | 2 - .../assets/test-utils/src/test_cases.rs | 735 +----------------- .../weights/pallet_nft_fractionalization.rs | 63 -- 41 files changed, 11 insertions(+), 3818 deletions(-) delete mode 100644 parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml delete mode 100644 parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml delete mode 100644 parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml delete mode 100644 parachains/integration-tests/e2e/assets/statemine/0_xcm/3_force_hrmp-open-channels.yml delete mode 100644 parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml delete mode 100644 parachains/integration-tests/e2e/assets/statemine/config.toml delete mode 100644 parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml delete mode 100644 parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml delete mode 100644 parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml delete mode 100644 parachains/integration-tests/e2e/assets/statemint/0_xcm/3_force_hrmp-open-channels.yml delete mode 100644 parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml delete mode 100644 parachains/integration-tests/e2e/assets/statemint/config.toml delete mode 100644 parachains/integration-tests/emulated/assets/statemine/Cargo.toml delete mode 100644 parachains/integration-tests/emulated/assets/statemine/src/lib.rs delete mode 100644 parachains/integration-tests/emulated/assets/statemine/src/tests/mod.rs delete mode 100644 parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs delete mode 100644 parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs delete mode 100644 parachains/integration-tests/emulated/assets/statemine/src/tests/transact.rs delete mode 100644 parachains/integration-tests/emulated/assets/statemint/Cargo.toml delete mode 100644 parachains/integration-tests/emulated/assets/statemint/src/lib.rs delete mode 100644 parachains/integration-tests/emulated/assets/statemint/src/tests/mod.rs delete mode 100644 parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs delete mode 100644 parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs delete mode 100644 parachains/integration-tests/emulated/assets/statemint/src/tests/transact.rs delete mode 100644 parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs diff --git a/Cargo.lock b/Cargo.lock index 77969b9ec5d..60276387f96 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -526,10 +526,8 @@ dependencies = [ "pallet-aura", "pallet-authorship", "pallet-balances", - "pallet-bridge-transfer", "pallet-collator-selection", "pallet-multisig", - "pallet-nft-fractionalization", "pallet-nfts", "pallet-nfts-runtime-api", "pallet-proxy", @@ -652,7 +650,6 @@ dependencies = [ "sp-consensus-aura", "sp-core", "sp-inherents", - "sp-io", "sp-offchain", "sp-runtime", "sp-session", diff --git a/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml index 67d7c7b7f60..9b885cb33e9 100644 --- a/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml +++ b/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml @@ -97,17 +97,10 @@ tests: - name: polkadotXcm.Attempted threshold: *weight_threshold result: [{ Complete: { refTime: '539,494,000', proofSize: '7,133' }}] -<<<<<<<< HEAD:parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml - - name: ump.ExecutedUpward - chain: *relay_chain - threshold: *weight_threshold - result: [{ Complete: { refTime: '298,716,000', proofSize: 0 }}] -======== - name: messageQueue.Processed chain: *relay_chain threshold: *weight_threshold result: { origin: { Ump: { Para: '1,000' } }, weightUsed: { refTime: '298,716,000', proofSize: '0' }, success: true } ->>>>>>>> bko-transfer-asset-via-bridge:parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml - queries: balance_ap_sender_after: chain: *assets_parachain diff --git a/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml index 12914e0400f..2e38756aeef 100644 --- a/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml +++ b/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml @@ -98,17 +98,10 @@ tests: - name: polkadotXcm.Attempted threshold: *weight_threshold result: [{ Complete: { refTime: '533,283,000', proofSize: '7,096' }}] -<<<<<<<< HEAD:parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml - - name: ump.ExecutedUpward - chain: *relay_chain - threshold: *weight_threshold - result: [{ Complete: { refTime: '4,000,000,000', proofSize: 0 }}] -======== - name: messageQueue.Processed chain: *relay_chain threshold: *weight_threshold result: { origin: { Ump: { Para: '1,000' } }, weightUsed: { refTime: '4,000,000,000', proofSize: '0' }, success: true } ->>>>>>>> bko-transfer-asset-via-bridge:parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml - queries: balance_ap_sender_after: chain: *assets_parachain diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml deleted file mode 100644 index ebcbe417bbb..00000000000 --- a/parachains/integration-tests/e2e/assets/statemine/0_xcm/0_init.yml +++ /dev/null @@ -1,145 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9920 - paraId: &pp_id 2000 - variables: - common: - xcm_version: &xcm_version 3 - require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 200000} - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - penpal_parachain: - signer: &pp_signer //Alice - decodedCalls: - ap_force_xcm_version: - chain: *assets_parachain - pallet: polkadotXcm - call: forceXcmVersion - args: [ - { # location - parents: 1, - interior: Here - }, - *xcm_version # xcmVersion - ] - -tests: - - name: Initialize Chains - its: - - name: XCM supported versions between chains - actions: - - extrinsics: # Relay Chain sets supported version for Asset Parachain - - chain: *relay_chain - sudo: true - signer: *rc_signer - pallet: xcmPallet - call: forceXcmVersion - args: [ - { # location - parents: 0, - interior: { - X1: { - Parachain: *ap_id - } - } - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.SupportedVersionChanged - result: [{ parents: 0, interior: { X1: { Parachain: *ap_id }}}, *xcm_version ] - - extrinsics: # Relay Chain sets supported version for Penpal Parachain - - chain: *relay_chain - sudo: true - signer: *rc_signer - pallet: xcmPallet - call: forceXcmVersion - args: [ - { # location - parents: 0, - interior: { - X1: { - Parachain: *pp_id - } - } - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.SupportedVersionChanged - result: [{ parents: 0, interior: { X1: { Parachain: *pp_id }}}, *xcm_version ] - - extrinsics: # Asset Parachain sets supported version for Relay Chain through it - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: { - limited: { - refTime: 2200000000, - proofSize: 200000 - } - } - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: *weight_at_most, - call: $ap_force_xcm_version - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '1,019,210,000', proofSize: '200,000' }} - } - - name: polkadotXcm.SupportedVersionChanged - chain: *assets_parachain - result: [{ parents: 1, interior: Here }, *xcm_version ] - - extrinsics: # Penpal Parachain sets supported version for Relay Chain - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: forceXcmVersion - args: [ - { # location - parents: 1, - interior: Here - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: polkadotXcm.SupportedVersionChanged - result: [{ parents: 1, interior: Here }, *xcm_version ] diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml deleted file mode 100644 index 1fb4a8abb84..00000000000 --- a/parachains/integration-tests/e2e/assets/statemine/0_xcm/1_dmp.yml +++ /dev/null @@ -1,267 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - variables: - common: - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf { v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} - amount: &amount 1000000000000 - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - require_weight_at_most: &rc_weight_at_most { refTime: 1000000000, proofSize: 200000 } - assets_parachain_account: - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - asset_id: &asset_id 1 - asset_min_balance: &asset_ed 1000 - decodedCalls: - force_create_asset: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - -tests: - - name: DMP - its: [] - describes: - - name: xcmPallet.limitedTeleportAssets - before: &before_get_balances - - name: Get the balances of the Relay Chain's sender & Assets Parachain's receiver - actions: - - queries: - balance_rc_sender_before: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_before: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - its: - - name: Should teleport native assets from the Relay Chain to the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedTeleportAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '764,772,000', proofSize: 0 }}] - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }} - } - - queries: - balance_rc_sender_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_rc_sender_before, - after: $balance_rc_sender_after, - }, - amount: *amount - } - ] - - - name: Should increase the balance of the receiver - actions: - - asserts: - balanceIncreased: - args: [ - { - balances: { - before: $balance_ap_receiver_before, - after: $balance_ap_receiver_after, - } - } - ] - - - name: xcmPallet.send | Superuser - Transact(assets.forceCreate) - its: - - name: Relay Chain Superuser account SHOULD be able to execute a XCM Transact instruction in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: *rc_weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '1,014,103,000', proofSize: '200,000' }} - } - - queries: - forced_created_asset: - chain: *assets_parachain - pallet: assets - call: asset - args: [ *asset_id ] - - asserts: - isSome: - args: [ $forced_created_asset ] - - - name: xcmPallet.send | Native - Transact(assets.forceCreate) - its: - - name: Relay Chain Native account SHOULD NOT be able to execute a XCM Transact instruction in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: Native, - requireWeightAtMost: *rc_weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: system.ExtrinsicFailed - result: { dispatchError: BadOrigin } - - - name: xcmPallet.limitedReserveTransferAssets - before: *before_get_balances - its: - - name: SHOULD NOT reserved transfer native assets from the Relay Chain to the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedReserveTransferAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '750,645,000', proofSize: 0 }}] - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { - Incomplete: [ - { refTime: '1,000,000,000', proofSize: 0 }, - UntrustedReserveLocation - ] - } - } - - queries: - balance_rc_sender_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_rc_sender_before, - after: $balance_rc_sender_after, - }, - amount: *amount - } - ] - - - name: Should keep the balance of the receiver - actions: - - asserts: - equal: - args: - [ - $balance_ap_receiver_before, - $balance_ap_receiver_after - ] diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml deleted file mode 100644 index 67d7c7b7f60..00000000000 --- a/parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml +++ /dev/null @@ -1,200 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - variables: - common: - amount: &amount 1000000000000 - require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 0} - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F #Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} - assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' #Alice - relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *rc_acc }}}}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} - decodedCalls: - system_remark: - chain: *relay_chain - pallet: system - call: remark - args: [ 0x0011 ] - -tests: - - name: UMP - describes: - - name: polkadotXcm.limitedTeleportAssets - before: - - name: DEPENDENCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Assets Parachain to have funds to send them back - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedTeleportAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '761,173,000', proofSize: 0 }}] - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }} - } - - - name: Get the balances of the Assets Parachain's sender & Relay Chain's receiver - actions: - - queries: - balance_ap_sender_before: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - balance_rc_receiver_before: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - its: - - name: Should teleport native assets back from Assets Parachain to the Relay Chain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedTeleportAssets - args: [ - *rc_dest, # destination - *rc_benf, # beneficiary - { v3: [ *ap_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '539,494,000', proofSize: '7,133' }}] -<<<<<<<< HEAD:parachains/integration-tests/e2e/assets/statemine/0_xcm/2_ump.yml - - name: ump.ExecutedUpward - chain: *relay_chain - threshold: *weight_threshold - result: [{ Complete: { refTime: '298,716,000', proofSize: 0 }}] -======== - - name: messageQueue.Processed - chain: *relay_chain - threshold: *weight_threshold - result: { origin: { Ump: { Para: '1,000' } }, weightUsed: { refTime: '298,716,000', proofSize: '0' }, success: true } ->>>>>>>> bko-transfer-asset-via-bridge:parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml - - queries: - balance_ap_sender_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - balance_rc_receiver_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_ap_sender_before, - after: $balance_ap_sender_after, - }, - amount: *amount - } - ] - - - name: Should increase the balance of the receiver - actions: - - asserts: - balanceIncreased: - args: [ - { - balances: { - before: $balance_rc_receiver_before, - after: $balance_rc_receiver_after, - } - } - ] - - - name: polkadotXcm.send | Native - Transact(system.remark) - its: - - name: Assets Parachain SHOULD NOT be able to dispatch 'send' call - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: Native, - requireWeightAtMost: *weight_at_most, - call: $system_remark - } - } - ] - } - ] - events: - - name: system.ExtrinsicFailed - result: { dispatchError: BadOrigin } - - - name: polkadotXcm.limitedReserveTransferAssets - its: - - name: Should NOT be able to reserve transfer native assets from the Assets Parachain to the Relay Chain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *rc_dest, # destination - *rc_benf, # beneficiary - { v3: [ *ap_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: polkadotXcm.Attempted - result: [{ Error: Barrier }] diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/3_force_hrmp-open-channels.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/3_force_hrmp-open-channels.yml deleted file mode 100644 index dfdae028f00..00000000000 --- a/parachains/integration-tests/e2e/assets/statemine/0_xcm/3_force_hrmp-open-channels.yml +++ /dev/null @@ -1,122 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: - wsPort: 9910 - paraId: &ap_id 1000 - penpal_parachain: - wsPort: 9920 - paraId: &pp_id 2000 - variables: - common: - amount: &amount 2000000000000 - hrmp_channels: - proposed_max_capacity: &max_capacity 8 - proposed_max_message_size: &max_message_size 8192 - channel: &channel { - maxCapacity: *max_capacity, - maxTotalSize: *max_message_size, - maxMessageSize: *max_message_size, - msgCount: 0, - totalSize: 0, - mqcHead: null, - senderDeposit: 0, - recipientDeposit: 0 - } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_account: - sovereign_account: &ap_sovereign F7fq1jSNVTPfJmaHaXCMtatT1EZefCUsa7rRiQVNR5efcah - penpal_parachain: - sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ - -tests: - - name: HRMP - beforeEach: - - name: DEPENDENCY | Penpal Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *pp_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - - - name: DEPENDENCY | Assets Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *ap_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - describes: - - name: hrmp.forceOpenHrmpChannel (Penpal Parachain → Assets Parachain) - its: - - name: Open Penpal Parachain to Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceOpenHrmpChannel - args: [ - *pp_id, - *ap_id, - *max_capacity, - *max_message_size - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: hrmp.HrmpChannelForceOpened - - - name: hrmp.forceOpenHrmpChannel (Assets Parachain → PenPal Parachain) - its: - - name: Open Assets Parachain to PenPal Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceOpenHrmpChannel - args: [ - *ap_id, - *pp_id, - *max_capacity, - *max_message_size - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: hrmp.HrmpChannelForceOpened - - - name: hrmp.forceProcessHrmpOpen (make sure all the channels are open) - its: - - name: Make sure all the pending channels are open - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceProcessHrmpOpen - args: [ 2 ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } diff --git a/parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml b/parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml deleted file mode 100644 index 9e2decffe15..00000000000 --- a/parachains/integration-tests/e2e/assets/statemine/0_xcm/4_hrmp.yml +++ /dev/null @@ -1,390 +0,0 @@ ---- -# Note: This tests depends on the 3_hrmp-open-channels.yml for opening channels, otherwise teleports aren't going to -# work. -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9920 - paraId: &pp_id 2000 - variables: - common: - mint_amount: &mint_amount 1000000000000 - amount: &amount 100000000000 - require_weight_at_most: &weight_at_most {refTime: 1200000000, proofSize: 20000} - amount_to_send: &amount_to_send 500000000000 - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_dest_routed: &ap_dest_routed { v3: { parents: 1, interior: { x1: { parachain: *ap_id } }}} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - asset_id: &asset_id 2 - assets_pallet_id: &assets_pallet_id 50 - asset_min_balance: &asset_ed 1000 - penpal_parachain_destination: &pp_dest { v3: { parents: 1, interior: { x1: { parachain: *pp_id } }}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} - suff_asset: &suff_asset { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: *asset_id } ] }}} - suff_asset_fail: &suff_asset_fail { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: 3 } ] }}} - suff_asset_fungible_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: 200000000000 }} - penpal_parachain: - sovereign_account: &pp_sovereign_sibl FBeL7EAeUroLWXW1yfKboiqTqVfbRBcsUKd6QqVf4kGBySS - signer: &pp_signer //Alice - penpal_parachain_account: &pp_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - decodedCalls: - force_create_asset: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - force_create_asset2: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - -tests: - - name: HRMP - describes: - - name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain - before: - - name: DEPENDENCY | A sufficient Asset should exist in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - SetTopic: '0x0123456789012345678901234567891201234567890123456789012345678912' - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '1,216,703,000', proofSize: '20,000' }} - } - - queries: - forced_created_asset: - chain: *assets_parachain - pallet: assets - call: asset - args: [ *asset_id ] - - asserts: - isSome: - args: [ $forced_created_asset ] - - - name: DEPENDENCY | Some Assets should be minted for the sender - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: assets - call: mint - args: [ - *asset_id, - *ap_wallet, - *mint_amount - ] - events: - - name: assets.Issued - result: { assetId: *asset_id, owner: *ap_wallet, amount: *mint_amount } - - its: - - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V3: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: *pp_acc - } - } - } - } - }, - { # assets - V3: [ - { - id: { - Concrete: { - parents: 0, - interior: { - X2: [ - { - PalletInstance: *assets_pallet_id - }, - { - GeneralIndex: *asset_id - } - ] - } - } - }, - fun: { - Fungible: *amount_to_send - } - } - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '679,150,000', proofSize: '6,196' }}] - - name: assets.Transferred - result: { - assetId: *asset_id, - from: *ap_wallet, - to: *pp_sovereign_sibl, - amount: *amount_to_send - } - - - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain - its: - - name: Assets Parachain should be able to reserve transfer KSM to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V3: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: *pp_acc - } - } - } - } - }, - { # assets - V3: [ - *ap_ksm_fungible - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '679,150,000', proofSize: '6,196' }}] - - name: balances.Endowed - result: { - account: *pp_sovereign_sibl, - freeBalance: *amount - } - - - name: polkadotXcm.send( assets.forceCreateAsset ) | Penpal Parachain -> Assets Parachain - before: - - name: Get the asset balance of the Penpal Parachain Sovereign account in Assets Parachain - actions: - - queries: - assets_balance_pp_sovereign_before: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - its: - - name: Penpal Parachain should be able to send XCM message paying its fee with sufficient asset in Assets Parachain - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v3: [ #message - { - WithdrawAsset: [ - { - id: { - concrete: { - parents: 0, - interior: { - X2: [ - { PalletInstance: *assets_pallet_id }, - { GeneralIndex: *asset_id } - ] - } - } - }, - fun: { fungible: *amount }} - ] - }, - { - BuyExecution: { - fees: { id: *suff_asset, fun: { fungible: *amount }}, - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset2 - } - }, - { - RefundSurplus - }, - { - DepositAsset: { - assets: { Wild: All }, - beneficiary: { - parents: 0, - interior: { - X1: { - AccountId32: { - network: , # None - id: *pp_acc - } - } - }} - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: polkadotXcm.Sent - - name: assets.Burned - chain: *assets_parachain - result: { assetId: *asset_id, owner: *pp_sovereign_sibl } - - name: assets.Issued - chain: *assets_parachain - result: { assetId: *asset_id } - - queries: - assets_balance_pp_sovereign_after: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - forced_created_asset2: - chain: *assets_parachain - pallet: assets - call: asset - args: [ 3 ] - - asserts: - isSome: - args: [ $forced_created_asset2 ] - - name: Should reduce the assets balance of the Penpal Parachain's SovereignAccount in the Assets Parachain - actions: - - asserts: - assetsDecreased: - args: [ - { - balances: { - before: $assets_balance_pp_sovereign_before, - after: $assets_balance_pp_sovereign_after, - }, - } - ] - - - name: Penpal Parachain SHOULD NOT be able to send XCM message paying its fee with sufficient assets if not enough balance - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v3: [ #message - { - WithdrawAsset: [*ap_suff_asset_fungible_fail] - }, - { - BuyExecution: { - fees: *ap_suff_asset_fungible_fail, - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset2 - } - } - ] - } - ] - events: - - name: xcmpQueue.Fail - chain: *assets_parachain - threshold: *weight_threshold - result: { - error: FailedToTransactAsset, - weight: { refTime: '152,426,000', proofSize: '3,593' } - } diff --git a/parachains/integration-tests/e2e/assets/statemine/config.toml b/parachains/integration-tests/e2e/assets/statemine/config.toml deleted file mode 100644 index 57c8f37e24b..00000000000 --- a/parachains/integration-tests/e2e/assets/statemine/config.toml +++ /dev/null @@ -1,71 +0,0 @@ -[relaychain] -default_command = "./bin/polkadot" -default_args = [ "-lparachain=debug", "-lxcm=trace" ] -chain = "kusama-local" - - [[relaychain.nodes]] - name = "alice" - ws_port = 9900 - validator = true - args = ["--state-cache-size=0"] - - [[relaychain.nodes]] - name = "bob" - ws_port = 9901 - validator = true - - [[relaychain.nodes]] - name = "charlie" - ws_port = 9902 - validator = true - - [[relaychain.nodes]] - name = "dave" - ws_port = 9903 - validator = true - -[[parachains]] -id = 1000 -chain = "statemine-local" -cumulus_based = true - - [[parachains.collators]] - name = "collator1" - ws_port = 9910 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace", "--state-cache-size=0" ] - - [[parachains.collators]] - name = "collator2" - ws_port = 9911 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] - -[[parachains]] -id = 2000 -chain = "penpal-kusama-2000" -cumulus_based = true - - [[parachains.collators]] - name = "collator3" - ws_port = 9920 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace", "--state-cache-size=0" ] - - [[parachains.collators]] - name = "collator4" - ws_port = 9921 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] - -# [[hrmpChannels]] -# sender = 1000 -# recipient = 2000 -# maxCapacity = 8 -# maxMessageSize = 8192 - -# [[hrmpChannels]] -# sender = 2000 -# recipient = 1000 -# maxCapacity = 8 -# maxMessageSize = 8192 diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml deleted file mode 100644 index 55dbab6ba4c..00000000000 --- a/parachains/integration-tests/e2e/assets/statemint/0_xcm/0_init.yml +++ /dev/null @@ -1,145 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9800 - assets_parachain: &assets_parachain - wsPort: 9810 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9820 - paraId: &pp_id 2000 - variables: - common: - xcm_version: &xcm_version '3' - require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 200000} - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - penpal_parachain: - signer: &pp_signer //Alice - decodedCalls: - ap_force_xcm_version: - chain: *assets_parachain - pallet: polkadotXcm - call: forceXcmVersion - args: [ - { # location - parents: 1, - interior: Here - }, - *xcm_version # xcmVersion - ] - -tests: - - name: Initialize Chains - its: - - name: XCM supported versions between chains - actions: - - extrinsics: # Relay Chain sets supported version for Asset Parachain - - chain: *relay_chain - sudo: true - signer: *rc_signer - pallet: xcmPallet - call: forceXcmVersion - args: [ - { # location - parents: 0, - interior: { - X1: { - Parachain: *ap_id - } - } - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.SupportedVersionChanged - result: [{ parents: 0, interior: { X1: { Parachain: *ap_id }}}, *xcm_version ] - - extrinsics: # Relay Chain sets supported version for Penpal Parachain - - chain: *relay_chain - sudo: true - signer: *rc_signer - pallet: xcmPallet - call: forceXcmVersion - args: [ - { # location - parents: 0, - interior: { - X1: { - Parachain: *pp_id - } - } - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.SupportedVersionChanged - result: [{ parents: 0, interior: { X1: { Parachain: *pp_id }}}, *xcm_version ] - - extrinsics: # Asset Parachain sets supported version for Relay Chain through it - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: { - limited: { - refTime: 3200000000, - proofSize: 200000 - } - } - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: *weight_at_most, - call: $ap_force_xcm_version - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '1,019,210,000', proofSize: '200,000' }} - } - - name: polkadotXcm.SupportedVersionChanged - chain: *assets_parachain - result: [{ parents: 1, interior: Here }, *xcm_version ] - - extrinsics: # Penpal Parachain sets supported version for Relay Chain - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: forceXcmVersion - args: [ - { # location - parents: 1, - interior: Here - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: polkadotXcm.SupportedVersionChanged - result: [{ parents: 1, interior: Here }, *xcm_version ] diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml deleted file mode 100644 index 823974ad806..00000000000 --- a/parachains/integration-tests/e2e/assets/statemint/0_xcm/1_dmp.yml +++ /dev/null @@ -1,267 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9800 - assets_parachain: &assets_parachain - wsPort: 9810 - paraId: &ap_id 1000 - variables: - common: - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} - amount: &amount 1000000000000 - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - require_weight_at_most: &rc_weight_at_most {refTime: 1000000000, proofSize: 200000} - assets_parachain_account: - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - asset_id: &asset_id 1 - asset_min_balance: &asset_ed 1000 - decodedCalls: - force_create_asset: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - -tests: - - name: DMP - its: [] - describes: - - name: xcmPallet.limitedTeleportAssets - before: &before_get_balances - - name: Get the balances of the Relay Chain's sender & Assets Parachain's receiver - actions: - - queries: - balance_rc_sender_before: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_before: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - its: - - name: Should teleport native assets from the Relay Chain to the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedTeleportAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '3,000,000,000', proofSize: 0 }}] - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }} - } - - queries: - balance_rc_sender_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_rc_sender_before, - after: $balance_rc_sender_after, - }, - amount: *amount - } - ] - - - name: Should increase the balance of the receiver - actions: - - asserts: - balanceIncreased: - args: [ - { - balances: { - before: $balance_ap_receiver_before, - after: $balance_ap_receiver_after, - } - } - ] - - - name: xcmPallet.send | Superuser - Transact(assets.forceCreate) - its: - - name: Relay Chain Superuser account SHOULD be able to execute a XCM Transact instruction in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Superuser, - requireWeightAtMost: *rc_weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '1,014,103,000', proofSize: '200,000' }} - } - - queries: - forced_created_asset: - chain: *assets_parachain - pallet: assets - call: asset - args: [ *asset_id ] - - asserts: - isSome: - args: [ $forced_created_asset ] - - - name: xcmPallet.send | Native - Transact(assets.forceCreate) - its: - - name: Relay Chain Native account SHOULD NOT be able to execute a XCM Transact instruction in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *rc_weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: system.ExtrinsicFailed - result: { dispatchError: BadOrigin } - - - name: xcmPallet.limitedReserveTransferAssets - before: *before_get_balances - its: - - name: SHOULD NOT reserved transfer native assets from the Relay Chain to the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedReserveTransferAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '2,000,000,000', proofSize: 0 }}] - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { - Incomplete: [ - { refTime: '1,000,000,000', proofSize: 0 }, - UntrustedReserveLocation - ] - } - } - - queries: - balance_rc_sender_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_rc_sender_before, - after: $balance_rc_sender_after, - }, - amount: *amount - } - ] - - - name: Should keep the balance of the receiver - actions: - - asserts: - equal: - args: - [ - $balance_ap_receiver_before, - $balance_ap_receiver_after - ] diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml deleted file mode 100644 index 12914e0400f..00000000000 --- a/parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml +++ /dev/null @@ -1,203 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9800 - assets_parachain: &assets_parachain - wsPort: 9810 - paraId: &ap_id 1000 - variables: - common: - amount: &amount 1000000000000 - require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 0} - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} - assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *rc_acc }}}}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} - decodedCalls: - system_remark: - chain: *relay_chain - pallet: system - call: remark - args: [ 0x0011 ] - -tests: - - name: UMP - describes: - - name: polkadotXcm.limitedTeleportAssets - before: - - name: DEPENDENCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Assets Parachain to have funds to send them back - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedTeleportAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '3,000,000,000', proofSize: 0 }}] - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }} - } - - - name: Get the balances of the Assets Parachain's sender & Relay Chain's receiver - actions: - - queries: - balance_ap_sender_before: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - balance_rc_receiver_before: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - - its: - - name: Should be able to teleport native assets back from Assets Parachain to the Relay Chain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedTeleportAssets - args: [ - *rc_dest, # destination - *rc_benf, # beneficiary - { v3: [ *ap_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '533,283,000', proofSize: '7,096' }}] -<<<<<<<< HEAD:parachains/integration-tests/e2e/assets/statemint/0_xcm/2_ump.yml - - name: ump.ExecutedUpward - chain: *relay_chain - threshold: *weight_threshold - result: [{ Complete: { refTime: '4,000,000,000', proofSize: 0 }}] -======== - - name: messageQueue.Processed - chain: *relay_chain - threshold: *weight_threshold - result: { origin: { Ump: { Para: '1,000' } }, weightUsed: { refTime: '4,000,000,000', proofSize: '0' }, success: true } ->>>>>>>> bko-transfer-asset-via-bridge:parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml - - queries: - balance_ap_sender_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - balance_rc_receiver_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_ap_sender_before, - after: $balance_ap_sender_after, - }, - amount: *amount - } - ] - - - name: Should increase the balance of the receiver - actions: - - asserts: - balanceIncreased: - args: [ - { - balances: { - before: $balance_rc_receiver_before, - after: $balance_rc_receiver_after, - } - } - ] - - - name: polkadotXcm.send | Native - Transact(system.remark) - its: - - name: Assets Parachain SHOULD NOT be able to dispatch 'send' call - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *weight_at_most, - call: $system_remark - } - } - ] - } - ] - events: - - name: system.ExtrinsicFailed - attributes: - - type: SpRuntimeDispatchError - value: BadOrigin - - - name: polkadotXcm.limitedReserveTransferAssets - its: - - name: Should NOT be able to reserve transfer native assets from the Assets Parachain to the Relay Chain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *rc_dest, # destination - *rc_benf, # beneficiary - { v3: [ *ap_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: polkadotXcm.Attempted - result: [{ Error: Barrier }] diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/3_force_hrmp-open-channels.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/3_force_hrmp-open-channels.yml deleted file mode 100644 index ecf344a073b..00000000000 --- a/parachains/integration-tests/e2e/assets/statemint/0_xcm/3_force_hrmp-open-channels.yml +++ /dev/null @@ -1,120 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9800 - assets_parachain: - wsPort: 9810 - paraId: &ap_id 1000 - penpal_parachain: - wsPort: 9820 - paraId: &pp_id 2000 - variables: - common: - amount: &amount 2000000000000 - hrmp_channels: - proposed_max_capacity: &max_capacity 8 - proposed_max_message_size: &max_message_size 8192 - channel: &channel { - maxCapacity: *max_capacity, - maxTotalSize: *max_message_size, - maxMessageSize: *max_message_size, - msgCount: 0, - totalSize: 0, - mqcHead: null, - senderDeposit: 0, - recipientDeposit: 0 - } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_account: - sovereign_account: &ap_sovereign 5Ec4AhPZk8STuex8Wsi9TwDtJQxKqzPJRCH7348Xtcs9vZLJ - penpal_parachain: - sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ - -tests: - - name: HRMP - beforeEach: - - name: DEPENDENCY | Penpal Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *pp_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - - - name: DEPENDENCY | Assets Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *ap_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - describes: - - name: hrmp.hrmpInitOpenChannel (Penpal Parachain → Assets Parachain) - its: - - name: Open Penpal Parachain to Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceOpenHrmpChannel - args: [ - *pp_id, - *ap_id, - *max_capacity, - *max_message_size - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: hrmp.HrmpChannelForceOpened - - name: hrmp.hrmpInitOpenChannel (Assets Parachain → PenPal Parachain) - its: - - name: Open Assets Parachain to PenPal Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceOpenHrmpChannel - args: [ - *ap_id, - *pp_id, - *max_capacity, - *max_message_size - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: hrmp.HrmpChannelForceOpened - - name: hrmp.forceProcessHrmpOpen (make sure all the channels are open) - its: - - name: Make sure all the pending channels are open - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceProcessHrmpOpen - args: [ 2 ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } diff --git a/parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml b/parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml deleted file mode 100644 index 4ff2fbc59a4..00000000000 --- a/parachains/integration-tests/e2e/assets/statemint/0_xcm/4_hrmp.yml +++ /dev/null @@ -1,390 +0,0 @@ ---- -# Note: This tests depends on the 3_hrmp-open-channels.yml for opening channels, otherwise teleports aren't going to -# work. -settings: - chains: - relay_chain: &relay_chain - wsPort: 9800 - assets_parachain: &assets_parachain - wsPort: 9810 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9820 - paraId: &pp_id 2000 - variables: - common: - mint_amount: &mint_amount 1000000000000 - amount: &amount 1000000000000 - require_weight_at_most: &weight_at_most {refTime: 1200000000, proofSize: 20000} - amount_to_send: &amount_to_send 500000000000 - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_dest_routed: &ap_dest_routed { v3: { parents: 1, interior: { x1: { parachain: *ap_id } }}} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5 - asset_id: &asset_id 2 - assets_pallet_id: &assets_pallet_id 50 - asset_min_balance: &asset_ed 1000 - penpal_parachain_destination: &pp_dest { v3: { parents: 1, interior: { x1: { parachain: *pp_id } }}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} - suff_asset: &suff_asset { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: *asset_id } ] }}} - suff_asset_fail: &suff_asset_fail { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: 3 } ] }}} - suff_asset_fungible_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: 200000000000 }} - penpal_parachain: - sovereign_account: &pp_sovereign_sibl 13cKp89Msu7M2PiaCuuGr1BzAsD5V3vaVbDMs3YtjMZHdGwR - signer: &pp_signer //Alice - penpal_parachain_account: &pp_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - decodedCalls: - force_create_asset: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - force_create_asset2: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - -tests: - - name: HRMP - describes: - - name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain - before: - - name: DEPENDENCY | A sufficient Asset should exist in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - SetTopic: '0x0123456789012345678901234567891201234567890123456789012345678912' - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '1,216,703,000', proofSize: '20,000' }} - } - - queries: - forced_created_asset: - chain: *assets_parachain - pallet: assets - call: asset - args: [ *asset_id ] - - asserts: - isSome: - args: [ $forced_created_asset ] - - - name: DEPENDENCY | Some Assets should be minted for the sender - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: assets - call: mint - args: [ - *asset_id, - *ap_wallet, - *mint_amount - ] - events: - - name: assets.Issued - result: { assetId: *asset_id, owner: *ap_wallet, amount: *mint_amount } - - its: - - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V3: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: *pp_acc - } - } - } - } - }, - { # assets - V3: [ - { - id: { - Concrete: { - parents: 0, - interior: { - X2: [ - { - PalletInstance: *assets_pallet_id - }, - { - GeneralIndex: *asset_id - } - ] - } - } - }, - fun: { - Fungible: *amount_to_send - } - } - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '673,627,000', proofSize: '6,196' }}] - - name: assets.Transferred - result: { - assetId: *asset_id, - from: *ap_wallet, - to: *pp_sovereign_sibl, - amount: *amount_to_send - } - - - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain - its: - - name: Assets Parachain should be able to reserve transfer KSM to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V3: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: *pp_acc - } - } - } - } - }, - { # assets - V3: [ - *ap_ksm_fungible - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: [{ Complete: { refTime: '679,150,000', proofSize: '6,196' }}] - - name: balances.Endowed - result: { - account: *pp_sovereign_sibl, - freeBalance: *amount - } - - - name: polkadotXcm.send( assets.forceCreateAsset ) | Penpal Parachain -> Assets Parachain - before: - - name: Get the asset balance of the Penpal Parachain Sovereign account in Assets Parachain - actions: - - queries: - assets_balance_pp_sovereign_before: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - its: - - name: Penpal Parachain should be able to send XCM message paying its fee with sufficient asset in Assets Parachain - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v3: [ #message - { - WithdrawAsset: [ - { - id: { - concrete: { - parents: 0, - interior: { - X2: [ - { PalletInstance: *assets_pallet_id }, - { GeneralIndex: *asset_id } - ] - } - } - }, - fun: { fungible: *amount_to_send }} - ] - }, - { - BuyExecution: { - fees: { id: *suff_asset, fun: { fungible: *amount_to_send }}, - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset2 - } - }, - { - RefundSurplus - }, - { - DepositAsset: { - assets: { Wild: All }, - beneficiary: { - parents: 0, - interior: { - X1: { - AccountId32: { - network: , # None - id: *pp_acc - } - } - }} - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: polkadotXcm.Sent - - name: assets.Burned - chain: *assets_parachain - result: { assetId: *asset_id, owner: *pp_sovereign_sibl } - - name: assets.Issued - chain: *assets_parachain - result: { assetId: *asset_id } - - queries: - assets_balance_pp_sovereign_after: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - forced_created_asset2: - chain: *assets_parachain - pallet: assets - call: asset - args: [ 3 ] - - asserts: - isSome: - args: [ $forced_created_asset2 ] - - name: Should reduce the assets balance of the Penpal Parachain's SovereignAccount in the Assets Parachain - actions: - - asserts: - assetsDecreased: - args: [ - { - balances: { - before: $assets_balance_pp_sovereign_before, - after: $assets_balance_pp_sovereign_after, - }, - } - ] - - - name: Penpal Parachain SHOULD NOT be able to send XCM message paying its fee with sufficient assets if not enough balance - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v3: [ #message - { - WithdrawAsset: [*ap_suff_asset_fungible_fail] - }, - { - BuyExecution: { - fees: *ap_suff_asset_fungible_fail, - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset2 - } - } - ] - } - ] - events: - - name: xcmpQueue.Fail - chain: *assets_parachain - threshold: *weight_threshold - result: { - error: FailedToTransactAsset, - weight: { refTime: '152,426,000', proofSize: '3,593' } - } diff --git a/parachains/integration-tests/e2e/assets/statemint/config.toml b/parachains/integration-tests/e2e/assets/statemint/config.toml deleted file mode 100644 index 2e68734e09f..00000000000 --- a/parachains/integration-tests/e2e/assets/statemint/config.toml +++ /dev/null @@ -1,72 +0,0 @@ -[relaychain] -default_command = "./bin/polkadot" -default_args = [ "-lparachain=debug", "-lxcm=trace" ] -chain = "polkadot-local" - - [[relaychain.nodes]] - name = "alice" - ws_port = 9800 - validator = true - args = ["--state-cache-size=0"] - - [[relaychain.nodes]] - name = "bob" - ws_port = 9801 - validator = true - - [[relaychain.nodes]] - name = "charlie" - ws_port = 9802 - validator = true - - [[relaychain.nodes]] - name = "dave" - ws_port = 9803 - validator = true - -[[parachains]] -id = 1000 -chain = "statemint-local" -cumulus_based = true - - [[parachains.collators]] - name = "collator1" - ws_port = 9810 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace", "--state-cache-size=0" ] - - [[parachains.collators]] - name = "collator2" - ws_port = 9811 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] - - -[[parachains]] -id = 2000 -chain = "penpal-polkadot-2000" -cumulus_based = true - - [[parachains.collators]] - name = "collator3" - ws_port = 9820 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace", "--state-cache-size=0" ] - - [[parachains.collators]] - name = "collator4" - ws_port = 9821 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] - -# [[hrmpChannels]] -# sender = 1000 -# recipient = 2000 -# maxCapacity = 8 -# maxMessageSize = 8192 - -# [[hrmpChannels]] -# sender = 2000 -# recipient = 1000 -# maxCapacity = 8 -# maxMessageSize = 8192 diff --git a/parachains/integration-tests/emulated/assets/statemine/Cargo.toml b/parachains/integration-tests/emulated/assets/statemine/Cargo.toml deleted file mode 100644 index 42ed5ac0605..00000000000 --- a/parachains/integration-tests/emulated/assets/statemine/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "statemine-it" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Statemine parachain runtime integration tests with xcm-emulator" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } - -# Substrate -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -parachains-common = { path = "../../../../common" } -penpal-runtime = { path = "../../../../runtimes/testing/penpal" } -statemine-runtime = { path = "../../../../runtimes/assets/statemine" } - -# Local -xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } -integration-tests-common = { default-features = false, path = "../../common" } diff --git a/parachains/integration-tests/emulated/assets/statemine/src/lib.rs b/parachains/integration-tests/emulated/assets/statemine/src/lib.rs deleted file mode 100644 index 7616a871b84..00000000000 --- a/parachains/integration-tests/emulated/assets/statemine/src/lib.rs +++ /dev/null @@ -1,30 +0,0 @@ -pub use codec::Encode; -pub use frame_support::{ - assert_ok, instances::Instance1, pallet_prelude::Weight, traits::fungibles::Inspect, -}; -pub use integration_tests_common::{ - constants::{ - accounts::{ALICE, BOB}, - kusama::ED as KUSAMA_ED, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, - }, - AccountId, BHKusama, BHKusamaPallet, BHKusamaReceiver, BHKusamaSender, BHPolkadot, - BHPolkadotPallet, BHPolkadotReceiver, BHPolkadotSender, Collectives, CollectivesPallet, - CollectivesReceiver, CollectivesSender, Kusama, KusamaMockNet, KusamaPallet, KusamaReceiver, - KusamaSender, PenpalKusama, PenpalKusamaReceiver, PenpalKusamaSender, PenpalPolkadot, - PenpalPolkadotReceiver, PenpalPolkadotSender, Polkadot, PolkadotMockNet, PolkadotPallet, - PolkadotReceiver, PolkadotSender, Statemine, StateminePallet, StatemineReceiver, - StatemineSender, -}; -pub use polkadot_core_primitives::InboundDownwardMessage; -pub use xcm::{ - prelude::*, - v3::{Error, NetworkId::Kusama as KusamaId}, -}; -pub use xcm_emulator::{ - assert_expected_events, bx, cumulus_pallet_dmp_queue, helpers::weight_within_threshold, - Parachain as Para, RelayChain as Relay, TestExt, -}; - -#[cfg(test)] -mod tests; diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/mod.rs b/parachains/integration-tests/emulated/assets/statemine/src/tests/mod.rs deleted file mode 100644 index 996f9fd0aae..00000000000 --- a/parachains/integration-tests/emulated/assets/statemine/src/tests/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod reserve_transfer; -mod teleport; -mod transact; diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs deleted file mode 100644 index bbf272572ac..00000000000 --- a/parachains/integration-tests/emulated/assets/statemine/src/tests/reserve_transfer.rs +++ /dev/null @@ -1,63 +0,0 @@ -use crate::*; - -#[test] -fn reserve_transfer_native_asset_from_relay_to_assets() { - // Init tests variables - let amount = KUSAMA_ED * 1000; - let relay_sender_balance_before = Kusama::account_data_of(KusamaSender::get()).free; - let para_receiver_balance_before = Statemine::account_data_of(StatemineReceiver::get()).free; - - let origin = ::RuntimeOrigin::signed(KusamaSender::get()); - let assets_para_destination: VersionedMultiLocation = - Kusama::child_location_of(Statemine::para_id()).into(); - let beneficiary: VersionedMultiLocation = - AccountId32 { network: None, id: StatemineReceiver::get().into() }.into(); - let native_assets: VersionedMultiAssets = (Here, amount).into(); - let fee_asset_item = 0; - let weight_limit = WeightLimit::Unlimited; - - // Send XCM message from Relay Chain - Kusama::execute_with(|| { - assert_ok!(::XcmPallet::limited_reserve_transfer_assets( - origin, - bx!(assets_para_destination), - bx!(beneficiary), - bx!(native_assets), - fee_asset_item, - weight_limit, - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Kusama, - vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { outcome: Outcome::Complete(weight) }) => { - weight: weight_within_threshold((REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), Weight::from_parts(754_244_000, 0), *weight), - }, - ] - ); - }); - - // Receive XCM message in Assets Parachain - Statemine::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Statemine, - vec![ - RuntimeEvent::DmpQueue(cumulus_pallet_dmp_queue::Event::ExecutedDownward { - outcome: Outcome::Incomplete(_, Error::UntrustedReserveLocation), - .. - }) => {}, - ] - ); - }); - - // Check if balances are updated accordingly in Relay Chain and Assets Parachain - let relay_sender_balance_after = Kusama::account_data_of(KusamaSender::get()).free; - let para_sender_balance_after = Statemine::account_data_of(StatemineReceiver::get()).free; - - assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); - assert_eq!(para_sender_balance_after, para_receiver_balance_before); -} diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs deleted file mode 100644 index cbb07e4592e..00000000000 --- a/parachains/integration-tests/emulated/assets/statemine/src/tests/teleport.rs +++ /dev/null @@ -1,62 +0,0 @@ -use crate::*; - -#[test] -fn teleport_native_assets_from_relay_to_assets_para() { - // Init tests variables - let amount = KUSAMA_ED * 1000; - let relay_sender_balance_before = Kusama::account_data_of(KusamaSender::get()).free; - let para_receiver_balance_before = Statemine::account_data_of(StatemineReceiver::get()).free; - - let origin = ::RuntimeOrigin::signed(KusamaSender::get()); - let assets_para_destination: VersionedMultiLocation = - Kusama::child_location_of(Statemine::para_id()).into(); - let beneficiary: VersionedMultiLocation = - AccountId32 { network: None, id: StatemineReceiver::get().into() }.into(); - let native_assets: VersionedMultiAssets = (Here, amount).into(); - let fee_asset_item = 0; - let weight_limit = WeightLimit::Unlimited; - - // Send XCM message from Relay Chain - Kusama::execute_with(|| { - assert_ok!(::XcmPallet::limited_teleport_assets( - origin, - bx!(assets_para_destination), - bx!(beneficiary), - bx!(native_assets), - fee_asset_item, - weight_limit, - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Kusama, - vec![ - RuntimeEvent::XcmPallet( - pallet_xcm::Event::Attempted { outcome: Outcome::Complete { .. } } - ) => {}, - ] - ); - }); - - // Receive XCM message in Assets Parachain - Statemine::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Statemine, - vec![ - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == StatemineReceiver::get().into(), - }, - ] - ); - }); - - // Check if balances are updated accordingly in Relay Chain and Assets Parachain - let relay_sender_balance_after = Kusama::account_data_of(KusamaSender::get()).free; - let para_sender_balance_after = Statemine::account_data_of(StatemineReceiver::get()).free; - - assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); - assert!(para_sender_balance_after > para_receiver_balance_before); -} diff --git a/parachains/integration-tests/emulated/assets/statemine/src/tests/transact.rs b/parachains/integration-tests/emulated/assets/statemine/src/tests/transact.rs deleted file mode 100644 index 144c8cc9f21..00000000000 --- a/parachains/integration-tests/emulated/assets/statemine/src/tests/transact.rs +++ /dev/null @@ -1,58 +0,0 @@ -use crate::*; - -#[test] -fn transact_sudo_from_relay_to_assets_para() { - // Init tests variables - // Call to be executed in Assets Parachain - const ASSET_ID: u32 = 1; - - let call = ::RuntimeCall::Assets(pallet_assets::Call::< - ::Runtime, - Instance1, - >::force_create { - id: ASSET_ID.into(), - is_sufficient: true, - min_balance: 1000, - owner: StatemineSender::get().into(), - }) - .encode() - .into(); - - // XcmPallet send arguments - let sudo_origin = ::RuntimeOrigin::root(); - let assets_para_destination: VersionedMultiLocation = - Kusama::child_location_of(Statemine::para_id()).into(); - - let weight_limit = WeightLimit::Unlimited; - let require_weight_at_most = Weight::from_parts(1000000000, 200000); - let origin_kind = OriginKind::Superuser; - let check_origin = None; - - let xcm = VersionedXcm::from(Xcm(vec![ - UnpaidExecution { weight_limit, check_origin }, - Transact { require_weight_at_most, origin_kind, call }, - ])); - - // Send XCM message from Relay Chain - Kusama::execute_with(|| { - assert_ok!(::XcmPallet::send( - sudo_origin, - bx!(assets_para_destination), - bx!(xcm), - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Kusama, - vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::Sent { .. }) => {}, - ] - ); - }); - - // Receive XCM message in Assets Parachain - Statemine::execute_with(|| { - assert!(::Assets::asset_exists(ASSET_ID)); - }); -} diff --git a/parachains/integration-tests/emulated/assets/statemint/Cargo.toml b/parachains/integration-tests/emulated/assets/statemint/Cargo.toml deleted file mode 100644 index 8c6077b67e4..00000000000 --- a/parachains/integration-tests/emulated/assets/statemint/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "statemint-it" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Statemint parachain runtime integration tests with xcm-emulator" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } - -# Substrate -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -parachains-common = { path = "../../../../common" } -penpal-runtime = { path = "../../../../runtimes/testing/penpal" } -statemint-runtime = { path = "../../../../runtimes/assets/statemint" } - -# Local -xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } -integration-tests-common = { default-features = false, path = "../../common" } diff --git a/parachains/integration-tests/emulated/assets/statemint/src/lib.rs b/parachains/integration-tests/emulated/assets/statemint/src/lib.rs deleted file mode 100644 index f7ca680a800..00000000000 --- a/parachains/integration-tests/emulated/assets/statemint/src/lib.rs +++ /dev/null @@ -1,33 +0,0 @@ -pub use codec::Encode; -pub use frame_support::{ - assert_ok, instances::Instance1, pallet_prelude::Weight, traits::fungibles::Inspect, -}; -pub use integration_tests_common::{ - constants::{ - accounts::{ALICE, BOB}, - polkadot::ED as POLKADOT_ED, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, - }, - AccountId, BHKusama, BHKusamaPallet, BHKusamaReceiver, BHKusamaSender, BHPolkadot, - BHPolkadotPallet, BHPolkadotReceiver, BHPolkadotSender, Collectives, CollectivesPallet, - CollectivesReceiver, CollectivesSender, Kusama, KusamaMockNet, KusamaPallet, KusamaReceiver, - KusamaSender, PenpalKusama, PenpalKusamaReceiver, PenpalKusamaSender, PenpalPolkadot, - PenpalPolkadotReceiver, PenpalPolkadotSender, Polkadot, PolkadotMockNet, PolkadotPallet, - PolkadotReceiver, PolkadotSender, Statemine, StateminePallet, StatemineReceiver, - StatemineSender, Statemint, StatemintPallet, StatemintReceiver, StatemintSender, -}; -pub use polkadot_core_primitives::InboundDownwardMessage; -pub use xcm::{ - prelude::*, - v3::{ - Error, - NetworkId::{Kusama as KusamaId, Polkadot as PolkadotId}, - }, -}; -pub use xcm_emulator::{ - assert_expected_events, bx, cumulus_pallet_dmp_queue, helpers::weight_within_threshold, - Parachain as Para, RelayChain as Relay, TestExt, -}; - -#[cfg(test)] -mod tests; diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/mod.rs b/parachains/integration-tests/emulated/assets/statemint/src/tests/mod.rs deleted file mode 100644 index 996f9fd0aae..00000000000 --- a/parachains/integration-tests/emulated/assets/statemint/src/tests/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod reserve_transfer; -mod teleport; -mod transact; diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs b/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs deleted file mode 100644 index b69222670b1..00000000000 --- a/parachains/integration-tests/emulated/assets/statemint/src/tests/reserve_transfer.rs +++ /dev/null @@ -1,63 +0,0 @@ -use crate::*; - -#[test] -fn reserve_transfer_native_asset_from_relay_to_assets() { - // Init tests variables - let amount = POLKADOT_ED * 1000; - let relay_sender_balance_before = Polkadot::account_data_of(PolkadotSender::get()).free; - let para_receiver_balance_before = Statemint::account_data_of(StatemintReceiver::get()).free; - - let origin = ::RuntimeOrigin::signed(PolkadotSender::get()); - let assets_para_destination: VersionedMultiLocation = - Polkadot::child_location_of(Statemint::para_id()).into(); - let beneficiary: VersionedMultiLocation = - AccountId32 { network: None, id: StatemintReceiver::get().into() }.into(); - let native_assets: VersionedMultiAssets = (Here, amount).into(); - let fee_asset_item = 0; - let weight_limit = WeightLimit::Unlimited; - - // Send XCM message from Relay Chain - Polkadot::execute_with(|| { - assert_ok!(::XcmPallet::limited_reserve_transfer_assets( - origin, - bx!(assets_para_destination), - bx!(beneficiary), - bx!(native_assets), - fee_asset_item, - weight_limit, - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Polkadot, - vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { outcome: Outcome::Complete(weight) }) => { - weight: weight_within_threshold((REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), Weight::from_parts(2_000_000_000, 0), *weight), - }, - ] - ); - }); - - // Receive XCM message in Assets Parachain - Statemint::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Statemint, - vec![ - RuntimeEvent::DmpQueue(cumulus_pallet_dmp_queue::Event::ExecutedDownward { - outcome: Outcome::Incomplete(_, Error::UntrustedReserveLocation), - .. - }) => {}, - ] - ); - }); - - // Check if balances are updated accordingly in Relay Chain and Assets Parachain - let relay_sender_balance_after = Polkadot::account_data_of(PolkadotSender::get()).free; - let para_sender_balance_after = Statemint::account_data_of(StatemintReceiver::get()).free; - - assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); - assert_eq!(para_sender_balance_after, para_receiver_balance_before); -} diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs b/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs deleted file mode 100644 index 19aa5fe1f9e..00000000000 --- a/parachains/integration-tests/emulated/assets/statemint/src/tests/teleport.rs +++ /dev/null @@ -1,60 +0,0 @@ -use crate::*; - -#[test] -fn teleport_native_assets_from_relay_to_assets_para() { - // Init tests variables - let amount = POLKADOT_ED * 1000; - let relay_sender_balance_before = Polkadot::account_data_of(PolkadotSender::get()).free; - let para_receiver_balance_before = Statemint::account_data_of(StatemintReceiver::get()).free; - - let origin = ::RuntimeOrigin::signed(PolkadotSender::get()); - let assets_para_destination: VersionedMultiLocation = - Polkadot::child_location_of(Statemint::para_id()).into(); - let beneficiary: VersionedMultiLocation = - AccountId32 { network: None, id: StatemintReceiver::get().into() }.into(); - let native_assets: VersionedMultiAssets = (Here, amount).into(); - let fee_asset_item = 0; - let weight_limit = WeightLimit::Unlimited; - - // Send XCM message from Relay Chain - Polkadot::execute_with(|| { - assert_ok!(::XcmPallet::limited_teleport_assets( - origin, - bx!(assets_para_destination), - bx!(beneficiary), - bx!(native_assets), - fee_asset_item, - weight_limit, - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Polkadot, - vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { outcome: Outcome::Complete { .. } }) => {}, - ] - ); - }); - - // Receive XCM message in Assets Parachain - Statemint::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Statemint, - vec![ - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == StatemintReceiver::get().into(), - }, - ] - ); - }); - - // Check if balances are updated accordingly in Relay Chain and Assets Parachain - let relay_sender_balance_after = Polkadot::account_data_of(PolkadotSender::get()).free; - let para_sender_balance_after = Statemint::account_data_of(StatemintReceiver::get()).free; - - assert_eq!(relay_sender_balance_before - amount, relay_sender_balance_after); - assert!(para_sender_balance_after > para_receiver_balance_before); -} diff --git a/parachains/integration-tests/emulated/assets/statemint/src/tests/transact.rs b/parachains/integration-tests/emulated/assets/statemint/src/tests/transact.rs deleted file mode 100644 index 9220d914e47..00000000000 --- a/parachains/integration-tests/emulated/assets/statemint/src/tests/transact.rs +++ /dev/null @@ -1,58 +0,0 @@ -use crate::*; - -#[test] -fn transact_sudo_from_relay_to_assets_para() { - // Init tests variables - // Call to be executed in Assets Parachain - const ASSET_ID: u32 = 1; - - let call = ::RuntimeCall::Assets(pallet_assets::Call::< - ::Runtime, - Instance1, - >::force_create { - id: ASSET_ID.into(), - is_sufficient: true, - min_balance: 1000, - owner: StatemintSender::get().into(), - }) - .encode() - .into(); - - // XcmPallet send arguments - let sudo_origin = ::RuntimeOrigin::root(); - let assets_para_destination: VersionedMultiLocation = - Polkadot::child_location_of(Statemint::para_id()).into(); - - let weight_limit = WeightLimit::Unlimited; - let require_weight_at_most = Weight::from_parts(1000000000, 200000); - let origin_kind = OriginKind::Superuser; - let check_origin = None; - - let xcm = VersionedXcm::from(Xcm(vec![ - UnpaidExecution { weight_limit, check_origin }, - Transact { require_weight_at_most, origin_kind, call }, - ])); - - // Send XCM message from Relay Chain - Polkadot::execute_with(|| { - assert_ok!(::XcmPallet::send( - sudo_origin, - bx!(assets_para_destination), - bx!(xcm), - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Polkadot, - vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::Sent { .. }) => {}, - ] - ); - }); - - // Receive XCM message in Assets Parachain - Statemint::execute_with(|| { - assert!(::Assets::asset_exists(ASSET_ID)); - }); -} diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index 98ad333d8f6..e9573edd01a 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -82,6 +82,7 @@ benchmarks! { VersionedMultiAssets::V3(assets) => assets.len(), }; ensure!(assets_count == max_assets_limit as usize, "`assets` not set up correctly for worst case."); + }: _(origin, Box::new(assets), Box::new(destination)) verify { // we don't care about message hash or sender cost here, just check that the transfer has been initiated diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/frame_system.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/frame_system.rs index 4deb6799968..09c24b48259 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/frame_system.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/frame_system.rs @@ -87,9 +87,6 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } - fn set_code() -> Weight { - Weight::from_parts(1_000_000, 0) - } /// Storage: Skipped Metadata (r:0 w:0) /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[0, 1000]`. diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets.rs index 7ce956712e5..410043bc4fe 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets.rs @@ -40,10 +40,9 @@ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] -#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; +use sp_std::marker::PhantomData; /// Weight functions for `pallet_assets`. pub struct WeightInfo(PhantomData); @@ -106,7 +105,7 @@ impl pallet_assets::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 5180).saturating_mul(c.into())) } /// Storage: Assets Asset (r:1 w:1) /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) diff --git a/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs index cbe4cd1f9cb..681e83a6605 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs @@ -549,7 +549,6 @@ asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currenc XcmConfig, collator_session_keys(), ExistentialDeposit::get(), - MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) }, Box::new(|| { assert!(Assets::asset_ids().collect::>().is_empty()); assert!(ForeignAssets::asset_ids().collect::>().is_empty()); diff --git a/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml index e1925531b5b..149e71df130 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml @@ -26,7 +26,6 @@ pallet-aura = { git = "https://github.com/paritytech/substrate", default-feature pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-nft-fractionalization = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-nfts = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-nfts-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } pallet-proxy = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -74,7 +73,6 @@ pallet-collator-selection = { path = "../../../../pallets/collator-selection", d parachain-info = { path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } -pallet-bridge-transfer = { path = "../../../pallets/bridge-transfer", default-features = false } [dev-dependencies] hex-literal = "0.4.1" @@ -94,7 +92,6 @@ runtime-benchmarks = [ "pallet-assets/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-multisig/runtime-benchmarks", - "pallet-nft-fractionalization/runtime-benchmarks", "pallet-nfts/runtime-benchmarks", "pallet-proxy/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", @@ -104,12 +101,10 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", "assets-common/runtime-benchmarks", - "pallet-bridge-transfer/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", @@ -127,7 +122,6 @@ try-runtime = [ "pallet-balances/try-runtime", "pallet-collator-selection/try-runtime", "pallet-multisig/try-runtime", - "pallet-nft-fractionalization/try-runtime", "pallet-nfts/try-runtime", "pallet-proxy/try-runtime", "pallet-session/try-runtime", @@ -137,7 +131,6 @@ try-runtime = [ "pallet-utility/try-runtime", "pallet-xcm/try-runtime", "parachain-info/try-runtime", - "pallet-bridge-transfer/try-runtime", ] std = [ "codec/std", @@ -153,7 +146,6 @@ std = [ "pallet-authorship/std", "pallet-balances/std", "pallet-multisig/std", - "pallet-nft-fractionalization/std", "pallet-nfts/std", "pallet-nfts-runtime-api/std", "pallet-proxy/std", @@ -194,6 +186,5 @@ std = [ "parachain-info/std", "parachains-common/std", "assets-common/std", - "pallet-bridge-transfer/std", "substrate-wasm-builder", ] diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs index 518bd88bc2e..92af360ced1 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs @@ -4,7 +4,6 @@ pub mod extrinsic_weights; pub mod frame_system; pub mod pallet_assets; pub mod pallet_balances; -pub mod pallet_bridge_transfer; pub mod pallet_collator_selection; pub mod pallet_multisig; pub mod pallet_nfts; diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets.rs index 5575e3e476d..20ac7e5e208 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets.rs @@ -302,7 +302,7 @@ impl pallet_assets::WeightInfo for WeightInfo { /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) /// The range of component `n` is `[0, 50]`. /// The range of component `s` is `[0, 50]`. - fn set_metadata(_n: u32, _s: u32, ) -> Weight { + fn set_metadata(_n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `243` // Estimated: `3675` diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs index 69c138c888a..234ab204fbc 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs @@ -214,7 +214,7 @@ impl XcmWeightInfo for AssetHubPolkadotXcmWeight { XcmGeneric::::clear_transact_status() } fn universal_origin(_: &Junction) -> Weight { - XcmGeneric::::universal_origin() + Weight::MAX } fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { Weight::MAX diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 4865352d12d..ebe3a730bd0 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -30,6 +30,8 @@ // --chain=asset-hub-polkadot-dev // --execution=wasm // --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic // --chain=statemine-dev // --header=./file_header.txt diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs index fc83b6eb140..956ada5ac3b 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs @@ -26,7 +26,6 @@ use frame_support::{ traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, }; use frame_system::EnsureRoot; -use pallet_bridge_transfer::impls::{AllowedUniversalAliasesOf, IsAllowedReserveOf}; use pallet_xcm::XcmPassthrough; use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; use polkadot_parachain::primitives::Sibling; @@ -432,7 +431,7 @@ impl xcm_executor::Config for XcmConfig { type AssetExchanger = (); type FeeManager = (); type MessageExporter = (); - type UniversalAliases = AllowedUniversalAliasesOf; + type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; @@ -444,12 +443,12 @@ pub type LocalOriginToLocation = SignedToAccountId32, // ..and XCMP to communicate with the sibling chains. XcmpQueue, -)>; +); #[cfg(feature = "runtime-benchmarks")] parameter_types! { diff --git a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs index 6a2dc8b0de5..cdd61f26796 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs @@ -42,7 +42,6 @@ use xcm::latest::prelude::*; use xcm_executor::traits::{Identity, JustTry, WeightTrader}; const ALICE: [u8; 32] = [1u8; 32]; -const BOB: [u8; 32] = [0u8; 32]; const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; type AssetIdForTrustBackedAssetsConvert = @@ -647,84 +646,3 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p assert_eq!(ForeignAssets::asset_ids().collect::>().len(), 1); }) ); - -#[test] -fn can_governance_change_bridge_transfer_out_configuration() { - asset_test_utils::test_cases::can_governance_change_bridge_transfer_out_configuration::< - Runtime, - XcmConfig, - >( - collator_session_keys(), - Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), - _ => None, - } - }), - ) -} - -#[test] -fn initiate_transfer_asset_via_bridge_for_native_asset_works() { - asset_test_utils::test_cases::initiate_transfer_asset_via_bridge_for_native_asset_works::< - Runtime, - XcmConfig, - ParachainSystem, - XcmpQueue, - LocationToAccountId, - >( - collator_session_keys(), - ExistentialDeposit::get(), - AccountId::from(ALICE), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - ) -} - -#[test] -fn can_governance_change_bridge_transfer_in_configuration() { - asset_test_utils::test_cases::can_governance_change_bridge_transfer_in_configuration::< - Runtime, - XcmConfig, - >( - collator_session_keys(), - Box::new(|call| RuntimeCall::BridgeTransfer(call).encode()), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), - _ => None, - } - }), - ) -} - -#[test] -fn receive_reserve_asset_deposited_from_different_consensus_works() { - asset_test_utils::test_cases::receive_reserve_asset_deposited_from_different_consensus_works::< - Runtime, - XcmConfig, - LocationToAccountId, - ForeignAssetsInstance, - >( - collator_session_keys(), - ExistentialDeposit::get(), - AccountId::from(BOB), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - ) -} diff --git a/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index d1372b8cc4f..657f3e6a2bb 100644 --- a/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -78,7 +78,6 @@ pallet-bridge-transfer = { path = "../../../pallets/bridge-transfer", default-fe [dev-dependencies] hex-literal = "0.4.1" asset-test-utils = { path = "../test-utils"} -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } [build-dependencies] substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } @@ -103,7 +102,6 @@ runtime-benchmarks = [ "pallet-xcm/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", "cumulus-pallet-parachain-system/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 1dd77308a8d..500312c4c40 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -16,12 +16,9 @@ //! Module contains predefined test-case scenarios for `Runtime` with various assets. use codec::Encode; -use cumulus_primitives_core::XcmpMessageSource; use frame_support::{ assert_noop, assert_ok, - traits::{ - fungibles::InspectEnumerable, Contains, Currency, Get, OriginTrait, ProcessMessageError, - }, + traits::{fungibles::InspectEnumerable, Get, OriginTrait}, weights::Weight, }; use parachains_common::Balance; @@ -1300,733 +1297,3 @@ macro_rules! include_create_and_manage_foreign_assets_for_local_consensus_parach } } ); - -/// Test-case makes sure that `Runtime` can manage `bridge_transfer out` configuration by governance -pub fn can_governance_change_bridge_transfer_out_configuration( - collator_session_keys: CollatorSessionKeys, - runtime_call_encode: Box) -> Vec>, - unwrap_pallet_bridge_transfer_event: Box< - dyn Fn(Vec) -> Option>, - >, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_dmp_queue::Config - + pallet_bridge_transfer::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - XcmConfig: xcm_executor::Config, -{ - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_tracing() - .with_safe_xcm_version(3) - .build() - .execute_with(|| { - // bridge cfg data - let bridged_network = ByGenesis([9; 32]); - let bridge_config = pallet_bridge_transfer::BridgeConfig { - bridge_location: (Parent, Parachain(1013)).into(), - bridge_location_fee: None, - allowed_target_location: MultiLocation::new( - 2, - X2(GlobalConsensus(bridged_network), Parachain(1000)), - ), - max_target_location_fee: None, - }; - - // check no cfg - assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) - .is_none()); - - // governance can add exporter config - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::add_exporter_config { - bridged_network, - bridge_config: Box::new(bridge_config.clone()), - } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::add_exporter_config() - ) - .ensure_complete()); - - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeAdded))); - { - let cfg = - pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network); - assert!(cfg.is_some()); - let cfg = cfg.unwrap(); - assert_eq!(cfg.bridge_location, bridge_config.bridge_location); - assert_eq!(cfg.bridge_location_fee, None); - assert_eq!(cfg.allowed_target_location, bridge_config.allowed_target_location); - assert_eq!(cfg.max_target_location_fee, None); - } - - // governance can update bridge config - let new_bridge_location_fee: MultiAsset = - (Concrete(MultiLocation::parent()), 1_000).into(); - let new_target_location_fee: MultiAsset = - (Concrete(MultiLocation::parent()), 1_000_000).into(); - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::update_exporter_config { - bridged_network, - bridge_location_fee: Some(Box::new(VersionedMultiAsset::V3( - new_bridge_location_fee.clone() - ))), - target_location_fee: Some(Box::new(VersionedMultiAsset::V3( - new_target_location_fee.clone() - ))), - } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::update_exporter_config() - ) - .ensure_complete()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeUpdated))); - { - let cfg = - pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network); - assert!(cfg.is_some()); - let cfg = cfg.unwrap(); - assert_eq!(cfg.bridge_location, bridge_config.bridge_location); - assert_eq!(cfg.bridge_location_fee, Some(new_bridge_location_fee)); - assert_eq!(cfg.allowed_target_location, bridge_config.allowed_target_location); - assert_eq!(cfg.max_target_location_fee, Some(new_target_location_fee)); - } - - // governance can remove bridge config - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::remove_exporter_config { bridged_network } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::remove_exporter_config() - ) - .ensure_complete()); - assert!(pallet_bridge_transfer::Pallet::::allowed_exporters(&bridged_network) - .is_none()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::BridgeRemoved))); - }) -} - -/// Test-case makes sure that `Runtime` can manage `bridge_transfer in` configuration by governance -pub fn can_governance_change_bridge_transfer_in_configuration( - collator_session_keys: CollatorSessionKeys, - runtime_call_encode: Box) -> Vec>, - unwrap_pallet_bridge_transfer_event: Box< - dyn Fn(Vec) -> Option>, - >, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_dmp_queue::Config - + pallet_bridge_transfer::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - XcmConfig: xcm_executor::Config, -{ - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_tracing() - .with_safe_xcm_version(3) - .build() - .execute_with(|| { - // bridge cfg data - let bridge_location = (Parent, Parachain(1013)).into(); - let alias_junction = GlobalConsensus(ByGenesis([9; 32])); - - // check before - assert!( - !pallet_bridge_transfer::impls::AllowedUniversalAliasesOf::::contains(&( - bridge_location, - alias_junction - )) - ); - - // governance can add bridge config - assert_ok!(RuntimeHelper::::execute_as_governance( - runtime_call_encode( - pallet_bridge_transfer::Call::::add_universal_alias { - location: Box::new(VersionedMultiLocation::V3(bridge_location.clone())), - junction: alias_junction, - } - ), - <::WeightInfo as pallet_bridge_transfer::weights::WeightInfo>::add_universal_alias() - ) - .ensure_complete()); - assert!(>::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())) - .any(|e| matches!(e, pallet_bridge_transfer::Event::UniversalAliasAdded))); - - // check after - assert!(pallet_bridge_transfer::impls::AllowedUniversalAliasesOf::::contains( - &(bridge_location, alias_junction) - )); - }) -} - -/// Test-case makes sure that `Runtime` can initiate transfer of assets via bridge -pub fn initiate_transfer_asset_via_bridge_for_native_asset_works< - Runtime, - XcmConfig, - HrmpChannelOpener, - HrmpChannelSource, - LocationToAccountId, ->( - collator_session_keys: CollatorSessionKeys, - existential_deposit: BalanceOf, - alice_account: AccountIdOf, - unwrap_pallet_bridge_transfer_event: Box< - dyn Fn(Vec) -> Option>, - >, - unwrap_xcmp_queue_event: Box< - dyn Fn(Vec) -> Option>, - >, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_transfer::Config - + cumulus_pallet_xcmp_queue::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - ::Balance: From + Into, - XcmConfig: xcm_executor::Config, - LocationToAccountId: Convert>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - <::Lookup as StaticLookup>::Source: - From<::AccountId>, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - HrmpChannelSource: XcmpMessageSource, -{ - let runtime_para_id = 1000; - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_tracing() - .with_safe_xcm_version(3) - .with_para_id(runtime_para_id.into()) - .build() - .execute_with(|| { - // prepare bridge config - let bridged_network = ByGenesis([6; 32]); - let bridge_hub_para_id = 1013; - let bridge_hub_location = (Parent, Parachain(bridge_hub_para_id)).into(); - let target_location_from_different_consensus = - MultiLocation::new(2, X2(GlobalConsensus(bridged_network), Parachain(1000))); - let target_location_fee: MultiAsset = (MultiLocation::parent(), 1_000_000).into(); - let bridge_config = pallet_bridge_transfer::BridgeConfig { - bridge_location: bridge_hub_location, - bridge_location_fee: None, - allowed_target_location: target_location_from_different_consensus, - max_target_location_fee: Some(target_location_fee.clone()), - }; - let reserve_account = - LocationToAccountId::convert_ref(&target_location_from_different_consensus) - .expect("Sovereign account for reserves"); - let balance_to_transfer = 1000_u128; - let native_asset = MultiLocation::parent(); - - // open HRMP to bridge hub - mock_open_hrmp_channel::( - runtime_para_id.into(), - bridge_hub_para_id.into(), - ); - - // drip ED to account - let alice_account_init_balance = existential_deposit + balance_to_transfer.into(); - let _ = >::deposit_creating( - &alice_account, - alice_account_init_balance.clone(), - ); - // SA of target location needs to have at least ED, anyway making reserve fails - let _ = >::deposit_creating( - &reserve_account, - existential_deposit, - ); - - // we just check here, that user remains enough balances after withdraw - // and also we check if `balance_to_transfer` is more than `existential_deposit`, - assert!( - (>::free_balance(&alice_account) - - balance_to_transfer.into()) >= - existential_deposit - ); - // SA has just ED - assert_eq!( - >::free_balance(&reserve_account), - existential_deposit - ); - - // insert bridge config - assert_ok!(>::add_exporter_config( - RuntimeHelper::::root_origin(), - bridged_network, - Box::new(bridge_config), - )); - - // local native asset (pallet_balances) - let assets = MultiAssets::from(MultiAsset { - fun: Fungible(balance_to_transfer.into()), - id: Concrete(native_asset), - }); - - // destination is (some) account from different consensus - let target_destination_account = target_location_from_different_consensus - .clone() - .appended_with(AccountId32 { - network: Some(bridged_network), - id: sp_runtime::AccountId32::new([3; 32]).into(), - }) - .unwrap(); - - // trigger asset transfer - assert_ok!(>::transfer_asset_via_bridge( - RuntimeHelper::::origin_of(alice_account.clone()), - Box::new(VersionedMultiAssets::from(assets.clone())), - Box::new(VersionedMultiLocation::from(target_destination_account.clone())), - )); - - // check alice account decreased - assert_eq!( - >::free_balance(&alice_account), - alice_account_init_balance - balance_to_transfer.into() - ); - // check reserve account increased - assert_eq!( - >::free_balance(&reserve_account), - existential_deposit + balance_to_transfer.into() - ); - - // check events - let mut bridge_transfer_events = >::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_transfer_event(e.event.encode())); - assert!(bridge_transfer_events.any(|r| matches!( - r, - pallet_bridge_transfer::Event::ReserveAssetsDeposited { .. } - ))); - let transfer_initiated_event = bridge_transfer_events.find_map(|e| match e { - pallet_bridge_transfer::Event::TransferInitiated { - message_id, - forwarded_message_id, - sender_cost, - } => Some((message_id, forwarded_message_id, sender_cost)), - _ => None, - }); - assert!(transfer_initiated_event.is_some()); - let (message_id, forwarded_message_id, sender_cost) = transfer_initiated_event.unwrap(); - // we expect UnpaidRemoteExporter - assert!(sender_cost.is_none()); - - // check that xcm was sent - let xcm_sent_message_hash = >::events() - .into_iter() - .filter_map(|e| unwrap_xcmp_queue_event(e.event.encode())) - .find_map(|e| match e { - cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => - Some(message_hash), - _ => None, - }); - - // read xcm - let xcm_sent = - RuntimeHelper::::take_xcm(bridge_hub_para_id.into()).unwrap(); - println!("xcm_sent: {:?}", xcm_sent); - assert_eq!( - xcm_sent_message_hash, - Some(xcm_sent.using_encoded(sp_io::hashing::blake2_256)) - ); - let mut xcm_sent: Xcm<()> = xcm_sent.try_into().expect("versioned xcm"); - - // check sent XCM ExportMessage to bridge-hub - assert!(xcm_sent - .0 - .matcher() - .match_next_inst(|instr| match instr { - // first instruction is UNpai (because we have explicit unpaid execution on bridge-hub now) - UnpaidExecution { weight_limit, check_origin } - if weight_limit == &Unlimited && check_origin.is_none() => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains UnpaidExecution") - .match_next_inst(|instr| match instr { - // second instruction is ExportMessage - ExportMessage { network, destination, xcm: inner_xcm } => { - assert_eq!(network, &bridged_network); - let (_, target_location_junctions_without_global_consensus) = - target_location_from_different_consensus - .interior - .clone() - .split_global() - .expect("split works"); - assert_eq!( - destination, - &target_location_junctions_without_global_consensus - ); - - let mut reanchored_assets = assets.clone(); - reanchored_assets - .reanchor( - &target_location_from_different_consensus, - XcmConfig::UniversalLocation::get(), - ) - .expect("reanchored assets"); - let mut reanchored_destination_account = target_destination_account.clone(); - reanchored_destination_account - .reanchor( - &target_location_from_different_consensus, - XcmConfig::UniversalLocation::get(), - ) - .expect("reanchored destination account"); - let universal_location_as_sovereign_account_on_target = - ::UniversalLocation::get() - .invert_target(&target_location_from_different_consensus) - .expect("invert_target Universal Location"); - - // match inner xcm - assert!(inner_xcm - .0 - .matcher() - .match_next_inst(|next_instr| match next_instr { - WithdrawAsset(fees) - if fees == &MultiAssets::from(target_location_fee.clone()) => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains WithdrawAsset") - .match_next_inst(|next_instr| match next_instr { - BuyExecution { ref fees, ref weight_limit } - if fees == &target_location_fee && - weight_limit == &Unlimited => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains BuyExecution") - .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { - ReserveAssetDeposited(ref deposited) - if deposited.eq(&reanchored_assets) => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains ReserveAssetDeposited") - .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { - DepositAsset { assets: filter, ref beneficiary } - if filter == - &MultiAssetFilter::from(reanchored_assets.clone()) && - beneficiary.eq(&reanchored_destination_account) => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains DepositAsset") - .match_next_inst(|inner_xcm_instr| match inner_xcm_instr { - RefundSurplus => Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains RefundSurplus") - .match_next_inst(|inner_xcm_instr| { - match inner_xcm_instr { - DepositAsset { assets: filter, ref beneficiary } - if filter == - &MultiAssetFilter::from( - target_location_fee.clone(), - ) && beneficiary.eq( - &universal_location_as_sovereign_account_on_target, - ) => - Ok(()), - _ => Err(ProcessMessageError::BadFormat), - } - }) - .expect("contains DepositAsset") - .match_next_inst(|instr| match instr { - SetTopic(ref topic) if topic.eq(&message_id) => Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains SetTopic") - .assert_remaining_insts(0) - .is_ok()); - Ok(()) - }, - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains ExportMessage") - .match_next_inst(|instr| match instr { - SetTopic(ref topic) if topic.eq(&forwarded_message_id) => Ok(()), - _ => Err(ProcessMessageError::BadFormat), - }) - .expect("contains SetTopic") - .assert_remaining_insts(0) - .is_ok()); - }) -} - -/// Test-case makes sure that `Runtime` can process `ReserveAssetDeposited`. -pub fn receive_reserve_asset_deposited_from_different_consensus_works< - Runtime, - XcmConfig, - LocationToAccountId, - ForeignAssetsPalletInstance, ->( - collator_session_keys: CollatorSessionKeys, - existential_deposit: BalanceOf, - target_account: AccountIdOf, - unwrap_pallet_xcm_event: Box) -> Option>>, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config - + pallet_assets::Config - + pallet_bridge_transfer::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - <::Lookup as StaticLookup>::Source: - From<::AccountId>, - XcmConfig: xcm_executor::Config, - >::AssetId: - From + Into, - >::AssetIdParameter: - From + Into, - >::Balance: - From + Into, - LocationToAccountId: Convert>, - ForeignAssetsPalletInstance: 'static, -{ - let remote_network_id = ByGenesis([7; 32]); - let remote_parachain_as_origin = MultiLocation { - parents: 2, - interior: X2(GlobalConsensus(remote_network_id), Parachain(1000)), - }; - let foreign_asset_id_multilocation = - MultiLocation { parents: 2, interior: X1(GlobalConsensus(remote_network_id)) }; - let buy_execution_fee_amount = 50000000000; - let reserve_asset_deposisted = 100_000_000; - - let local_bridge_hub_multilocation = - MultiLocation { parents: 1, interior: X1(Parachain(1014)) }; - - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_balances(vec![(target_account.clone(), existential_deposit)]) - .with_tracing() - .build() - .execute_with(|| { - // drip SA for remote global parachain origin - let remote_parachain_sovereign_account = - LocationToAccountId::convert_ref(remote_parachain_as_origin) - .expect("Sovereign account works"); - assert_ok!(>::force_set_balance( - RuntimeHelper::::root_origin(), - remote_parachain_sovereign_account.clone().into(), - existential_deposit + buy_execution_fee_amount.into(), - )); - - // setup bridge transfer configuration - // add allowed univeral alias for remote network - assert_ok!(>::add_universal_alias( - RuntimeHelper::::root_origin(), - Box::new(VersionedMultiLocation::V3(local_bridge_hub_multilocation)), - GlobalConsensus(remote_network_id) - )); - // add allowed reserve location - assert_ok!(>::add_reserve_location( - RuntimeHelper::::root_origin(), - Box::new(VersionedMultiLocation::V3(remote_parachain_as_origin)) - )); - - // create foreign asset - let asset_minimum_asset_balance = 1_000_000_u128; - assert_ok!( - >::force_create( - RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation.clone().into(), - remote_parachain_sovereign_account.clone().into(), - false, - asset_minimum_asset_balance.into() - ) - ); - - // we assume here that BuyExecution fee goes to staking pot - let staking_pot_account_id = >::account_id(); - let local_bridge_hub_multilocation_as_account_id = - LocationToAccountId::convert_ref(&local_bridge_hub_multilocation) - .expect("Correct AccountId"); - - // check before - let remote_parachain_sovereign_account_balance_before = - >::free_balance( - &remote_parachain_sovereign_account, - ); - assert_eq!( - remote_parachain_sovereign_account_balance_before, - existential_deposit + buy_execution_fee_amount.into() - ); - assert_eq!( - >::free_balance(&target_account), - existential_deposit - ); - assert_eq!( - >::free_balance( - &local_bridge_hub_multilocation_as_account_id - ), - 0.into() - ); - assert_eq!( - >::free_balance(&staking_pot_account_id), - 0.into() - ); - assert_eq!( - >::balance( - foreign_asset_id_multilocation.into(), - &target_account - ), - 0.into() - ); - - // xcm - let xcm = Xcm(vec![ - UniversalOrigin(GlobalConsensus(remote_network_id)), - DescendOrigin(X1(Parachain(1000))), - // buying execution as sovereign account `remote_parachain_sovereign_account` in *native asset on receiving runtime* - WithdrawAsset(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(buy_execution_fee_amount), - }])), - BuyExecution { - fees: MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(buy_execution_fee_amount), - }, - weight_limit: Unlimited, - }, - // reserve deposited - assets transferred through bridge - *native asset on sending runtime* - ReserveAssetDeposited(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(remote_network_id)), - }), - fun: Fungible(reserve_asset_deposisted), - }])), - DepositAsset { - assets: Definite(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(remote_network_id)), - }), - fun: Fungible(reserve_asset_deposisted), - }])), - beneficiary: MultiLocation { - parents: 0, - interior: X1(AccountId32 { - network: None, - id: target_account.clone().into(), - }), - }, - }, - // return unspent weight back to SA of caller - RefundSurplus, - DepositAsset { - assets: Definite(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(buy_execution_fee_amount), - }])), - beneficiary: remote_parachain_as_origin, - }, - ]); - - // origin as BridgeHub - let origin = local_bridge_hub_multilocation; - - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - - // execute xcm as XcmpQueue would do - let outcome = XcmExecutor::::execute_xcm( - origin, - xcm, - hash, - RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), - ); - assert_eq!(outcome.ensure_complete(), Ok(())); - - // check after - let staking_pot_balance = - >::free_balance(&staking_pot_account_id); - assert_eq!( - >::free_balance( - &remote_parachain_sovereign_account - ), - remote_parachain_sovereign_account_balance_before - staking_pot_balance - ); - assert_eq!( - >::free_balance(&target_account), - existential_deposit - ); - assert_eq!( - >::free_balance( - &local_bridge_hub_multilocation_as_account_id - ), - 0.into() - ); - assert_ne!( - >::free_balance(&staking_pot_account_id), - 0.into() - ); - assert_eq!( - >::balance( - foreign_asset_id_multilocation.into(), - &target_account - ), - reserve_asset_deposisted.into() - ); - - // check NO asset trap occurred - assert_eq!( - false, - >::events() - .into_iter() - .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())) - .any(|e| matches!(e, pallet_xcm::Event::AssetsTrapped { .. })) - ); - }) -} diff --git a/parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs b/parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs deleted file mode 100644 index d8db24f50e6..00000000000 --- a/parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus 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. - -// Cumulus 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 Cumulus. If not, see . - -//! Autogenerated weights for `pallet_nfts` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 - -// Executed Command: -// ./artifacts/polkadot-parachain -// benchmark -// pallet -// --chain=westmint-dev -// --execution=wasm -// --wasm-execution=compiled -// --pallet=pallet_nft_fractionalization -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/pallet_nft_fractionalization.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_nfts`. -pub struct WeightInfo(PhantomData); -impl pallet_nft_fractionalization::WeightInfo for WeightInfo { - fn fractionalize() -> Weight { - // Minimum execution time: 44_312 nanoseconds. - Weight::from_parts(25_147_000, 3549) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(5_u64)) - } - fn unify() -> Weight { - // Minimum execution time: 31_654 nanoseconds. - Weight::from_parts(25_147_000, 3549) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(5_u64)) - } -} From 1757698dee9b487112561023a7e58dfe051f2343 Mon Sep 17 00:00:00 2001 From: Alistair Singh Date: Mon, 12 Jun 2023 16:25:18 +0200 Subject: [PATCH 319/339] stub out weights --- .../asset-hub-kusama/src/weights/pallet_bridge_transfer.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs index e785ccdad3b..0586a031c88 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs @@ -193,4 +193,7 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + fn ping_via_bridge() -> cumulus_primitives_core::Weight { todo!() } + fn remove_bridged_target_location() -> cumulus_primitives_core::Weight { todo!() } + fn disallow_reserve_asset_transfer_for() -> cumulus_primitives_core::Weight { todo!() } } From 09623567ff14a5d76a338b3edacb0421a8cfceb2 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 12 Jun 2023 17:31:37 +0200 Subject: [PATCH 320/339] Added cfg to asset-hub-polkadot --- Cargo.lock | 2 + .../bridge-transfer/src/benchmarking.rs | 212 +----------------- parachains/pallets/bridge-transfer/src/lib.rs | 54 +---- .../assets/asset-hub-kusama/Cargo.toml | 1 + .../assets/asset-hub-kusama/src/xcm_config.rs | 2 +- .../assets/asset-hub-polkadot/Cargo.toml | 5 + .../assets/asset-hub-polkadot/src/lib.rs | 27 ++- .../asset-hub-polkadot/src/weights/mod.rs | 1 + .../src/weights/pallet_bridge_transfer.rs | 88 ++++++++ .../asset-hub-polkadot/src/weights/xcm/mod.rs | 2 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 12 + .../asset-hub-polkadot/src/xcm_config.rs | 157 ++++++++++--- .../assets/asset-hub-polkadot/tests/tests.rs | 80 ++++++- .../asset-hub-westend/src/xcm_config.rs | 2 +- 14 files changed, 340 insertions(+), 305 deletions(-) create mode 100644 parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs diff --git a/Cargo.lock b/Cargo.lock index 3f4f09ba6ed..af400d26c35 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -518,6 +518,8 @@ dependencies = [ "pallet-aura", "pallet-authorship", "pallet-balances", + "pallet-bridge-transfer", + "pallet-bridge-transfer-primitives", "pallet-collator-selection", "pallet-multisig", "pallet-nfts", diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index 4d14d1d3471..04370772317 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -28,7 +28,7 @@ use crate::{ use frame_benchmarking::{benchmarks, BenchmarkError}; use frame_support::{ assert_ok, ensure, - traits::{EnsureOrigin, EnsureOriginWithArg, Get}, + traits::{EnsureOrigin, Get}, BoundedVec, }; use sp_std::prelude::*; @@ -95,215 +95,5 @@ benchmarks! { assert!(matches!(actual_event, Some(expected_event))); } - add_exporter_config { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - }: _( - origin, - bridged_network, - Box::new(maybe_paid_bridge.location.clone().into_versioned()), - maybe_paid_bridge.maybe_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) - ) - verify { - assert_eq!( - AllowedExporters::::get(bridged_network).unwrap().to_bridge_location().expect("stored config"), - maybe_paid_bridge - ); - } - - remove_exporter_config { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - AllowedExporters::::insert( - bridged_network, - BridgeConfig::new( - maybe_paid_bridge.location.into_versioned(), - maybe_paid_bridge.maybe_fee.map(|fee| VersionedMultiAsset::V3(fee)) - ) - ); - }: _(origin, bridged_network) - verify { - assert_eq!(AllowedExporters::::get(bridged_network), None); - } - - update_exporter_config { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - AllowedExporters::::insert( - bridged_network, - BridgeConfig::new( - maybe_paid_bridge.location.into_versioned(), - None - ) - ); - - let new_bridge_location_fee = Some(MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(1_000_0000), - }); - }: _( - origin, - bridged_network, - new_bridge_location_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) - ) - verify { - assert_eq!( - AllowedExporters::::get(bridged_network).unwrap().to_bridge_location().expect("stored config").maybe_fee, - new_bridge_location_fee - ); - } - - update_bridged_target_location { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - if T::TargetLocationsPerExporterLimit::get() <= 0 { - return Err(BenchmarkError::Weightless); - } - let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - let allowed_bridged_target_location = T::BenchmarkHelper::allowed_bridged_target_location() - .ok_or(BenchmarkError::Stop("missing `allowed_bridged_target_location` data"))?; - AllowedExporters::::insert( - bridged_network, - BridgeConfig::new( - maybe_paid_bridge.location.into_versioned(), - None - ) - ); - let new_target_location_fee = Some(MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(1_000_0000), - }); - }: _( - origin, - bridged_network, - Box::new(allowed_bridged_target_location.location.clone().into_versioned()), - new_target_location_fee.clone().map(|fee| Box::new(VersionedMultiAsset::V3(fee))) - ) - verify { - let bridge_config = AllowedExporters::::get(bridged_network).unwrap(); - assert!( - bridge_config.allowed_target_location_for(&allowed_bridged_target_location.location).expect("stored target_location").is_some() - ); - } - - allow_reserve_asset_transfer_for { - let asset_filter = AssetFilterOf::::All; - - let origin = T::AllowReserveAssetTransferOrigin::try_successful_origin(&asset_filter).map_err(|_| BenchmarkError::Weightless)?; - if T::TargetLocationsPerExporterLimit::get() <= 0 { - return Err(BenchmarkError::Weightless); - } - - let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() - .ok_or(BenchmarkError::Stop("missing `bridge_config` data"))?; - let allowed_bridged_target_location = T::BenchmarkHelper::allowed_bridged_target_location() - .ok_or(BenchmarkError::Stop("missing `allowed_bridged_target_location` data"))?; - let mut bridge_config = BridgeConfig::new( - maybe_paid_bridge.location.into_versioned(), - None - ); - assert_ok!(bridge_config.update_allowed_target_location( - allowed_bridged_target_location.location.into_versioned(), - allowed_bridged_target_location.maybe_fee.map(|fee| VersionedMultiAsset::V3(fee)) - )); - AllowedExporters::::insert(bridged_network, bridge_config); - - }: _( - origin, - bridged_network, - Box::new(allowed_bridged_target_location.location.clone().into_versioned()), - asset_filter.clone() - ) - verify { - let bridge_config = AllowedExporters::::get(bridged_network).unwrap(); - let allowed_target_location = bridge_config.allowed_target_location_for( - &allowed_bridged_target_location.location - ).expect("stored target_location").unwrap(); - assert_eq!( - allowed_target_location.1, - Some(asset_filter) - ); - } - - add_universal_alias { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (location, junction) = match T::BenchmarkHelper::universal_alias() { - Some(alias) => alias, - None => match T::UniversalAliasesLimit::get() > 0_u32 { - true => return Err(BenchmarkError::Stop("missing `universal_alias` data")), - false => return Err(BenchmarkError::Weightless), - } - }; - }: _(origin, Box::new(location.clone()), junction) - verify { - assert!( - AllowedUniversalAliases::::get(LatestVersionedMultiLocation::try_from(&location).expect("ok")).contains(&junction) - ); - } - - remove_universal_alias { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (location, junction) = match T::BenchmarkHelper::universal_alias() { - Some(alias) => alias, - None => match T::UniversalAliasesLimit::get() > 0_u32 { - true => return Err(BenchmarkError::Stop("missing `universal_alias` data")), - false => return Err(BenchmarkError::Weightless), - } - }; - Pallet::::insert_universal_alias_for_benchmarks((location.clone().try_into().unwrap(), junction)); - }: _(origin, Box::new(location.clone()), vec![junction.clone()]) - verify { - assert!(!AllowedUniversalAliases::::get(LatestVersionedMultiLocation::try_from(&location).expect("ok")).contains(&junction)); - } - - add_reserve_location { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let reserve_location = if T::ReserveLocationsLimit::get() > 0_u32 { - match T::BenchmarkHelper::reserve_location() { - Some(location) => location, - None => return Err(BenchmarkError::Stop("missing `reserve_location` data")), - } - } else { - return Err(BenchmarkError::Weightless); - }; - let asset_filter: AssetFilterOf = if T::AssetsPerReserveLocationLimit::get() > 0_u32 { - let assets = (0..T::AssetsPerReserveLocationLimit::get()) - .map(|i| MultiLocation::new(1, X1(Parachain(i))).into_versioned()) - .collect::>(); - MultiLocationFilter { - equals_any: BoundedVec::truncate_from(assets), - starts_with_any: Default::default(), - }.into() - } else { - return Err(BenchmarkError::Weightless); - }; - }: _(origin, Box::new(reserve_location.clone()), asset_filter.clone()) - verify { - assert_eq!( - AllowedReserveLocations::::get(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok")), - Some(asset_filter) - ); - } - - remove_reserve_location { - let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let reserve_location = if T::ReserveLocationsLimit::get() > 0_u32 { - match T::BenchmarkHelper::reserve_location() { - Some(location) => location, - None => return Err(BenchmarkError::Stop("missing `reserve_location` data")), - } - } else { - return Err(BenchmarkError::Weightless); - }; - AllowedReserveLocations::::insert(reserve_location.clone(), AssetFilterOf::::All); - assert!(AllowedReserveLocations::::contains_key(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok"))); - }: _(origin, Box::new(reserve_location.clone()), None) - verify { - assert!(!AllowedReserveLocations::::contains_key(LatestVersionedMultiLocation::try_from(&reserve_location).expect("ok"))); - } - impl_benchmark_test_suite!(Pallet, crate::tests::new_test_ext(), crate::tests::TestRuntime); } diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 4ed3850ceb6..b1cd5c160a9 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -15,65 +15,15 @@ //! # Bridge Transfer Pallet //! -//! Module helps with different transfers through bridges between different consensus chain. -//! -//! One of possible scenarios which supports directly is "transfer asset over bridge (back and forth)". +//! Module supports transfer assets over bridges between different consensus chain. //! With fine-grained configuration you can control transferred assets (out/in) between different consensus chain. -//! E.g. you can allow just some assets to go out/in based on their `MultiLocation` patterns. -//! "Transfer asset over bridge" recognize two kinds of transfer see [AssetTransferKind]. -//! -//! ## Overview -//! -//! Pallet supports configuration for several independent scenarios: -//! -//! ### 1. Support to store on-chain bridge locations -//! -//! * Bridge locations/fees can be stored on-chain in [AllowedExporters] -//! * Managing bridge locations can be done with dedicated extrinsics: `add_exporter_config / remove_exporter_config / update_exporter_config` -//! * Pallet implements `xcm_builder::ExporterFor` which can be used with `xcm_builder::UnpaidRemoteExporter/SovereignPaidRemoteExporter` -//! -//! ### 2. Support to store on-chain allowed bridged target locations with asset filters -//! -//! * (Used for transfer assets out) -//! * If we want to use `transfer_asset_via_bridge` we should setup the target location with asset filter to allow reserve asset transfer to this location over bridge. -//! * Managing target location and asset filer can be done with dedicated extrinsics: -//! * - `update_bridged_target_location / remove_bridged_target_location` - managing target location behind bridge -//! * - `allow_reserve_asset_transfer_for / disallow_reserve_asset_transfer_for` - managing asset filters -//! -//! ### 3. Support to store on-chain allowed universal aliases/origins -//! -//! * (Used for transfer assets in) -//! * Aliases can be stored on-chain in [AllowedUniversalAliases] -//! * Managing bridge locations can be done with dedicated extrinsics: `add_universal_alias / remove_universal_alias` -//! * Stored aliases can be accessed by [features::AllowedUniversalAliasesOf] and configured for e.g. `xcm_executor::Config`: -//! ```nocompile -//! impl xcm_executor::Config for XcmConfig { -//! ... -//! type UniversalAliases = AllowedUniversalAliasesOf; -//! ... -//! } -//! ``` -//! -//! ### 4. Support to store on-chain allowed reserve locations with allowed asset filters -//! -//! * (Used for transfer assets in) -//! * Reserve locations with asset filters can be stored on-chain in [AllowedReserveLocations] -//! * Managing bridge locations can be done with dedicated extrinsics: `add_reserve_location / remove_reserve_location` -//! * Stored reserve locations can be accessed by [features::IsTrustedBridgedReserveForConcreteAsset] and configured for e.g. `xcm_executor::Config`: -//! ```nocompile -//! impl xcm_executor::Config for XcmConfig { -//! ... -//! type IsReserve = IsTrustedBridgedReserveForConcreteAsset; -//! ... -//! } -//! ``` +//! "Transfer asset over bridge" recognize two kinds of transfer see [types::AssetTransferKind]. // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] pub use pallet::*; pub use pallet_bridge_transfer_primitives::MaybePaidLocation; -// pub use types::{AssetFilterOf, MultiLocationFilterOf}; pub mod features; mod impls; diff --git a/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml b/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml index be28681a0d6..adc187334df 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml @@ -204,5 +204,6 @@ std = [ "parachains-common/std", "assets-common/std", "pallet-bridge-transfer/std", + "pallet-bridge-transfer-primitives/std", "substrate-wasm-builder", ] diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs index f3506a918e5..a38ddc81e27 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs @@ -340,7 +340,7 @@ impl Contains for SafeCallFilter { pallet_uniques::Call::set_collection_max_supply { .. } | pallet_uniques::Call::set_price { .. } | pallet_uniques::Call::buy_item { .. } - ) | RuntimeCall::BridgeTransfer(..) + ) ) } } diff --git a/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml index 149e71df130..3374768f069 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml @@ -73,6 +73,8 @@ pallet-collator-selection = { path = "../../../../pallets/collator-selection", d parachain-info = { path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../common", default-features = false } +pallet-bridge-transfer = { path = "../../../pallets/bridge-transfer", default-features = false } +pallet-bridge-transfer-primitives = { path = "../../../pallets/bridge-transfer/primitives", default-features = false } [dev-dependencies] hex-literal = "0.4.1" @@ -105,6 +107,7 @@ runtime-benchmarks = [ "cumulus-pallet-xcmp-queue/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", "assets-common/runtime-benchmarks", + "pallet-bridge-transfer/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", @@ -186,5 +189,7 @@ std = [ "parachain-info/std", "parachains-common/std", "assets-common/std", + "pallet-bridge-transfer/std", + "pallet-bridge-transfer-primitives/std", "substrate-wasm-builder", ] diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs index d0389f7e380..95dbaea63c3 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs @@ -107,8 +107,9 @@ use parachains_common::{ MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; use xcm_config::{ - DotLocation, FellowshipLocation, ForeignAssetsConvertedConcreteId, GovernanceLocation, - TrustBackedAssetsConvertedConcreteId, XcmConfig, XcmOriginToTransactDispatchOrigin, + bridging, AssetTransactors, DotLocation, FellowshipLocation, ForeignAssetsConvertedConcreteId, + GovernanceLocation, LocalOriginToLocation, TrustBackedAssetsConvertedConcreteId, + UniversalLocation, XcmConfig, XcmOriginToTransactDispatchOrigin, }; #[cfg(any(feature = "std", test))] @@ -118,6 +119,7 @@ pub use sp_runtime::BuildStorage; use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use xcm::latest::BodyId; +use xcm_builder::EnsureXcmOrigin; use xcm_executor::XcmExecutor; use crate::xcm_config::ForeignCreatorsSovereignAccountOf; @@ -720,6 +722,25 @@ impl pallet_nfts::Config for Runtime { type Helper = (); } +impl pallet_bridge_transfer::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type UniversalLocation = UniversalLocation; + type WeightInfo = weights::pallet_bridge_transfer::WeightInfo; + type AssetTransactor = AssetTransactors; + type AssetTransferKindResolver = + pallet_bridge_transfer::features::ConcreteAssetTransferKindResolver< + bridging::IsTrustedBridgedReserveLocationForConcreteAsset, + pallet_bridge_transfer::features::IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation, + >; + type AssetTransferOrigin = EnsureXcmOrigin; + type AssetsLimit = ConstU8<1>; + type BridgedDestinationValidator = + pallet_bridge_transfer_primitives::BridgesConfigAdapter; + type BridgeXcmSender = bridging::BridgeXcmSender; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = xcm_config::BridgeTransferBenchmarksHelper; +} + // Create the runtime by composing the FRAME pallets that were previously configured. construct_runtime!( pub enum Runtime where @@ -764,6 +785,7 @@ construct_runtime!( Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, + BridgeTransfer: pallet_bridge_transfer::{Pallet, Call, Storage, Event} = 54, } ); @@ -824,6 +846,7 @@ mod benches { [pallet_timestamp, Timestamp] [pallet_collator_selection, CollatorSelection] [cumulus_pallet_xcmp_queue, XcmpQueue] + [pallet_bridge_transfer, BridgeTransfer] // XCM [pallet_xcm, PolkadotXcm] // NOTE: Make sure you point to the individual modules below. diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs index 92af360ced1..518bd88bc2e 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs @@ -4,6 +4,7 @@ pub mod extrinsic_weights; pub mod frame_system; pub mod pallet_assets; pub mod pallet_balances; +pub mod pallet_bridge_transfer; pub mod pallet_collator_selection; pub mod pallet_multisig; pub mod pallet_nfts; diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs new file mode 100644 index 00000000000..d27178d262e --- /dev/null +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs @@ -0,0 +1,88 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_transfer` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json +// --pallet=pallet_bridge_transfer +// --chain=asset-hub-kusama-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_transfer`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_transfer::WeightInfo for WeightInfo { + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) + /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) + /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:0) + /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) + /// Storage: Assets Asset (r:1 w:1) + /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: Assets Account (r:2 w:2) + /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) + /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) + /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) + fn transfer_asset_via_bridge() -> Weight { + // Proof Size summary in bytes: + // Measured: `757` + // Estimated: `626195` + // Minimum execution time: 174_364_000 picoseconds. + Weight::from_parts(258_590_000, 0) + .saturating_add(Weight::from_parts(0, 626195)) + .saturating_add(T::DbWeight::get().reads(13)) + .saturating_add(T::DbWeight::get().writes(8)) + } +} diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs index 234ab204fbc..69c138c888a 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs @@ -214,7 +214,7 @@ impl XcmWeightInfo for AssetHubPolkadotXcmWeight { XcmGeneric::::clear_transact_status() } fn universal_origin(_: &Junction) -> Weight { - Weight::MAX + XcmGeneric::::universal_origin() } fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { Weight::MAX diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index ebe3a730bd0..d9764f2579d 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -342,6 +342,18 @@ impl WeightInfo { // Minimum execution time: 2_597_000 picoseconds. Weight::from_parts(2_675_000, 0) } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:0) + // Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) + pub fn universal_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `5884` + // Minimum execution time: 9_590_000 picoseconds. + Weight::from_parts(9_886_000, 5884) + .saturating_add(T::DbWeight::get().reads(2)) + } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs index 956ada5ac3b..b8946474f73 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs @@ -35,11 +35,11 @@ use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, DescribeFamily, DescribePalletTerminal, - EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NativeAsset, - NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds, - WithComputedOrigin, + EnsureXcmOrigin, FungiblesAdapter, GlobalConsensusParachainConvertsFor, HashedDescription, + IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -70,6 +70,9 @@ pub type LocationToAccountId = ( // Foreign chain account alias into local accounts according to a hash of their standard // description. HashedDescription>, + // Different global consensus parachain sovereign account. + // (Used for over-bridge transfers and reserve processing) + GlobalConsensusParachainConvertsFor, ); /// Means for transacting the native currency on this chain. @@ -350,30 +353,32 @@ impl Contains for SafeCallFilter { } } -pub type Barrier = DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then allow it. - AllowTopLevelPaidExecutionFrom, - // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality get free execution. - AllowExplicitUnpaidExecutionFrom<( - ParentOrParentsPlurality, - FellowsPlurality, - FellowshipSalaryPallet, - )>, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + // Allow XCMs with some computed origins to pass through. + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality get free execution. + AllowExplicitUnpaidExecutionFrom<( + ParentOrParentsPlurality, + FellowsPlurality, + FellowshipSalaryPallet, + )>, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, >; pub type AssetFeeAsExistentialDepositMultiplierFeeCharger = AssetFeeAsExistentialDepositMultiplier< @@ -389,10 +394,9 @@ impl xcm_executor::Config for XcmConfig { type XcmSender = XcmRouter; type AssetTransactor = AssetTransactors; type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Asset Hub Polkadot does not recognize a reserve location for any asset. This does not prevent // Asset Hub acting _as_ a reserve location for DOT and assets created under `pallet-assets`. // For DOT, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = (); + type IsReserve = bridging::IsTrustedBridgedReserveLocationForConcreteAsset; // We allow: // - teleportation of DOT // - teleportation of sibling parachain's assets (as ForeignCreators) @@ -431,7 +435,7 @@ impl xcm_executor::Config for XcmConfig { type AssetExchanger = (); type FeeManager = (); type MessageExporter = (); - type UniversalAliases = Nothing; + type UniversalAliases = bridging::BridgedUniversalAliases; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; @@ -443,12 +447,12 @@ pub type LocalOriginToLocation = SignedToAccountId32, // ..and XCMP to communicate with the sibling chains. XcmpQueue, -); +)>; #[cfg(feature = "runtime-benchmarks")] parameter_types! { @@ -524,3 +528,88 @@ fn foreign_pallet_has_correct_local_account() { let address = Ss58Codec::to_ss58check_with_version(&account, polkadot); assert_eq!(address, "13w7NdvSR1Af8xsQTArDtZmVvjE8XhWNdL4yed3iFHrUNCnS"); } + +/// All configuration related to bridging +pub mod bridging { + use super::*; + use pallet_bridge_transfer_primitives::{ + AssetFilter, BridgeConfig, BridgesConfig, BridgesConfigAdapter, BridgesConfigBuilder, + MaybePaidLocation, MultiLocationFilter, ReserveLocation, + }; + use sp_std::collections::btree_set::BTreeSet; + use xcm_builder::UnpaidRemoteExporter; + + parameter_types! { + pub BridgeHubPolkadotParaId: u32 = 1002; + pub BridgeHubPolkadot: MultiLocation = MultiLocation::new(1, X1(Parachain(BridgeHubPolkadotParaId::get()))); + pub const KusamaNetwork: NetworkId = NetworkId::Kusama; + pub AssetHubKusama: MultiLocation = MultiLocation::new(2, X2(GlobalConsensus(KusamaNetwork::get()), Parachain(1000))); + // Initial value, this will be adjusted by governance motion on deployment with some more accurate value + pub storage AssetHubKusamaMaxFee: Option = Some((MultiLocation::parent(), 1_000_000).into()); + pub KsmLocation: MultiLocation = MultiLocation::new(2, X1(GlobalConsensus(KusamaNetwork::get()))); + + // Setup bridges configuration + // (hard-coded version - on-chain configuration will come later as separate feature) + pub Bridges: BridgesConfig = BridgesConfigBuilder::default() + // add exporter for Kusama + .add_or_panic( + KusamaNetwork::get(), + BridgeConfig::new( + MaybePaidLocation { + location: BridgeHubPolkadot::get(), + // Noe fees needed because we use `UnpaidRemoteExporter` and BridgeHubPolkadot allows unpaid execution for local system parachains + maybe_fee: None, + } + ).add_target_location( + // add target location as AssetHubPolkadot + MaybePaidLocation { + location: AssetHubKusama::get(), + maybe_fee: AssetHubKusamaMaxFee::get(), + }, + Some(AssetFilter::ByMultiLocation( + MultiLocationFilter::default() + // allow transfer DOT + .add_equals(DotLocation::get()) + )) + ) + ) + .build(); + + // Setup trusted bridged reserve locations + pub BridgedReserves: sp_std::vec::Vec = sp_std::vec![ + // trust assets from AssetHubPolkadot + ( + AssetHubKusama::get(), + AssetFilter::ByMultiLocation( + MultiLocationFilter::default() + // allow receive KSM + .add_equals(KsmLocation::get()) + ) + ) + ]; + + /// Universal aliases + pub BridgedUniversalAliases: BTreeSet<(MultiLocation, Junction)> = BTreeSet::from_iter( + sp_std::vec![ + (BridgeHubPolkadot::get(), GlobalConsensus(KusamaNetwork::get())) + ] + ); + } + + impl Contains<(MultiLocation, Junction)> for BridgedUniversalAliases { + fn contains(alias: &(MultiLocation, Junction)) -> bool { + BridgedUniversalAliases::get().contains(alias) + } + } + + /// Bridge router, which wraps and sends xcm to BridgeHub to be delivered to the different GlobalConsensus + pub type BridgeXcmSender = + UnpaidRemoteExporter, XcmRouter, UniversalLocation>; + + /// Reserve locations filter for `xcm_executor::Config::IsReserve`. + pub type IsTrustedBridgedReserveLocationForConcreteAsset = + pallet_bridge_transfer::features::IsTrustedBridgedReserveLocationForConcreteAsset< + UniversalLocation, + BridgedReserves, + >; +} diff --git a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs index cdd61f26796..114aa13f498 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs @@ -18,13 +18,14 @@ //! Tests for the Statemint (Polkadot Assets Hub) chain. use asset_hub_polkadot_runtime::xcm_config::{ - AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, DotLocation, - ForeignCreatorsSovereignAccountOf, TrustBackedAssetsPalletLocation, XcmConfig, + bridging, AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, DotLocation, + ForeignCreatorsSovereignAccountOf, LocationToAccountId, TrustBackedAssetsPalletLocation, + XcmConfig, }; pub use asset_hub_polkadot_runtime::{ constants::fee::WeightToFee, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime, - RuntimeCall, RuntimeEvent, SessionKeys, System, TrustBackedAssetsInstance, + RuntimeCall, RuntimeEvent, SessionKeys, System, TrustBackedAssetsInstance, XcmpQueue, }; use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper}; use codec::{Decode, Encode}; @@ -42,6 +43,7 @@ use xcm::latest::prelude::*; use xcm_executor::traits::{Identity, JustTry, WeightTrader}; const ALICE: [u8; 32] = [1u8; 32]; +const BOB: [u8; 32] = [0u8; 32]; const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; type AssetIdForTrustBackedAssetsConvert = @@ -646,3 +648,75 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p assert_eq!(ForeignAssets::asset_ids().collect::>().len(), 1); }) ); + +fn bridging_to_asset_hub_kusama() -> asset_test_utils::test_cases_over_bridge::TestBridgingConfig { + asset_test_utils::test_cases_over_bridge::TestBridgingConfig { + bridged_network: bridging::KusamaNetwork::get(), + local_bridge_hub_para_id: bridging::BridgeHubPolkadotParaId::get(), + local_bridge_hub_location: pallet_bridge_transfer_primitives::MaybePaidLocation { + location: bridging::BridgeHubPolkadot::get(), + maybe_fee: None, + }, + bridged_target_location: pallet_bridge_transfer_primitives::MaybePaidLocation { + location: bridging::AssetHubKusama::get(), + maybe_fee: bridging::AssetHubKusamaMaxFee::get(), + }, + } +} + +#[test] +fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works() { + asset_test_utils::test_cases_over_bridge::transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works::< + Runtime, + XcmConfig, + ParachainSystem, + XcmpQueue, + LocationToAccountId, + >( + collator_session_keys(), + ExistentialDeposit::get(), + AccountId::from(ALICE), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + bridging_to_asset_hub_kusama + ) +} + +#[test] +fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_works() { + asset_test_utils::test_cases_over_bridge::transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_works::< + Runtime, + XcmConfig, + ParachainSystem, + XcmpQueue, + LocationToAccountId, + ForeignAssetsInstance, + >( + collator_session_keys(), + ExistentialDeposit::get(), + AccountId::from(ALICE), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgeTransfer(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + bridging_to_asset_hub_kusama + ) +} diff --git a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index 2d5800d7b77..ecf8ec51209 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -338,7 +338,7 @@ impl Contains for SafeCallFilter { pallet_uniques::Call::set_collection_max_supply { .. } | pallet_uniques::Call::set_price { .. } | pallet_uniques::Call::buy_item { .. }, - ) | RuntimeCall::BridgeTransfer(..) + ) ) } } From c96d3d85d80655659b9404a11335cc6b99532f03 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 12 Jun 2023 23:25:29 +0200 Subject: [PATCH 321/339] Fix test - ED for staking_pot --- .../assets/asset-hub-polkadot/src/lib.rs | 10 ++--- .../assets/asset-hub-polkadot/tests/tests.rs | 41 +++++++++++++++++++ .../test-utils/src/test_cases_over_bridge.rs | 33 +++++++++++---- 3 files changed, 70 insertions(+), 14 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs index 95dbaea63c3..f9fd5bb1f94 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs @@ -561,7 +561,6 @@ parameter_types! { } impl cumulus_pallet_xcmp_queue::Config for Runtime { - type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; type ChannelInfo = ParachainSystem; @@ -573,6 +572,7 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { >; type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type PriceForSiblingDelivery = (); + type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; } impl cumulus_pallet_dmp_queue::Config for Runtime { @@ -728,10 +728,10 @@ impl pallet_bridge_transfer::Config for Runtime { type WeightInfo = weights::pallet_bridge_transfer::WeightInfo; type AssetTransactor = AssetTransactors; type AssetTransferKindResolver = - pallet_bridge_transfer::features::ConcreteAssetTransferKindResolver< - bridging::IsTrustedBridgedReserveLocationForConcreteAsset, - pallet_bridge_transfer::features::IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation, - >; + pallet_bridge_transfer::features::ConcreteAssetTransferKindResolver< + bridging::IsTrustedBridgedReserveLocationForConcreteAsset, + pallet_bridge_transfer::features::IsAllowedReserveBasedTransferForConcreteAssetToBridgedLocation, + >; type AssetTransferOrigin = EnsureXcmOrigin; type AssetsLimit = ConstU8<1>; type BridgedDestinationValidator = diff --git a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs index 114aa13f498..20971678c60 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs @@ -720,3 +720,44 @@ fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_works() bridging_to_asset_hub_kusama ) } + +#[test] +fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_works() { + asset_test_utils::test_cases_over_bridge::receive_reserve_asset_deposited_from_different_consensus_over_bridge_works::< + Runtime, + XcmConfig, + LocationToAccountId, + ForeignAssetsInstance, + >( + collator_session_keys(), + ExistentialDeposit::get(), + AccountId::from(BOB), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + bridging_to_asset_hub_kusama + ) +} + +#[test] +fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_works() { + asset_test_utils::test_cases_over_bridge::withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_works::< + Runtime, + XcmConfig, + LocationToAccountId, + >( + collator_session_keys(), + ExistentialDeposit::get(), + AccountId::from(BOB), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + bridging_to_asset_hub_kusama + ) +} diff --git a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs index 2377ae11bfb..2e4ae81a51d 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs @@ -770,6 +770,12 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_work // we assume here that BuyExecution fee goes to staking pot let staking_pot_account_id = >::account_id(); + assert_ok!(>::force_set_balance( + RuntimeHelper::::root_origin(), + staking_pot_account_id.clone().into(), + existential_deposit, + )); + let local_bridge_hub_multilocation_as_account_id = LocationToAccountId::convert_location(&local_bridge_hub_location) .expect("Correct AccountId"); @@ -795,7 +801,7 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_work ); assert_eq!( >::free_balance(&staking_pot_account_id), - 0.into() + existential_deposit ); assert_eq!( >::balance( @@ -871,13 +877,14 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_work assert_eq!(outcome.ensure_complete(), Ok(())); // check after - let staking_pot_balance = - >::free_balance(&staking_pot_account_id); + let expected_buy_execution_fee = + >::free_balance(&staking_pot_account_id) - + existential_deposit; assert_eq!( >::free_balance( &remote_parachain_sovereign_account ), - remote_parachain_sovereign_account_balance_before - staking_pot_balance + remote_parachain_sovereign_account_balance_before - expected_buy_execution_fee ); assert_eq!( >::free_balance(&target_account), @@ -977,6 +984,12 @@ pub fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_wor // we assume here that BuyExecution fee goes to staking pot let staking_pot_account_id = >::account_id(); + assert_ok!(>::force_set_balance( + RuntimeHelper::::root_origin(), + staking_pot_account_id.clone().into(), + existential_deposit, + )); + let local_bridge_hub_multilocation_as_account_id = LocationToAccountId::convert_location(&local_bridge_hub_location) .expect("Correct AccountId"); @@ -1004,7 +1017,7 @@ pub fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_wor ); assert_eq!( >::free_balance(&staking_pot_account_id), - 0.into() + existential_deposit ); // xcm @@ -1067,15 +1080,17 @@ pub fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_wor assert_eq!(outcome.ensure_complete(), Ok(())); // check after - let staking_pot_balance = - >::free_balance(&staking_pot_account_id); - // here SA reserve was withdrawn + let expected_buy_execution_fee = + >::free_balance(&staking_pot_account_id) - + existential_deposit; + // check if SA reserve was withdrawn assert_eq!( >::free_balance( &remote_parachain_sovereign_account ), remote_parachain_sovereign_account_balance_before - - staking_pot_balance - reserve_asset_deposisted.into() + expected_buy_execution_fee - + reserve_asset_deposisted.into() ); // here target_account received reserve assert_eq!( From 78b4077b44148949b8087cab66ce74e684c99d2e Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 12 Jun 2023 23:56:07 +0200 Subject: [PATCH 322/339] Allow set_storage for max fee constant --- .../assets/asset-hub-kusama/src/xcm_config.rs | 8 ++ .../assets/asset-hub-kusama/tests/tests.rs | 25 +++++++ .../asset-hub-polkadot/src/xcm_config.rs | 8 ++ .../assets/asset-hub-polkadot/tests/tests.rs | 20 +++++ .../asset-hub-westend/src/xcm_config.rs | 8 ++ .../assets/asset-hub-westend/tests/tests.rs | 25 +++++++ .../assets/test-utils/src/test_cases.rs | 3 + .../bridge-hubs/test-utils/src/test_cases.rs | 72 +----------------- parachains/runtimes/test-utils/src/lib.rs | 73 ++++++++++++++++++- 9 files changed, 171 insertions(+), 71 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs index a38ddc81e27..37a6f1be410 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs @@ -199,6 +199,14 @@ impl Contains for SafeCallFilter { } } + // Allow to change dedicated storage items (called by governance-like) + match call { + RuntimeCall::System(frame_system::Call::set_storage { items }) + if items.iter().any(|(k, _)| k.eq(&bridging::AssetHubPolkadotMaxFee::key())) => + return true, + _ => (), + }; + matches!( call, RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | diff --git a/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs index 8f206c219fc..f16487ebc7d 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs @@ -739,3 +739,28 @@ fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_works() bridging_to_asset_hub_polkadot ) } + +#[test] +fn change_asset_hub_polkadot_max_fee_by_governance_works() { + asset_test_utils::test_cases::change_storage_constant_by_governance_works::< + Runtime, + bridging::AssetHubPolkadotMaxFee, + Option, + >( + collator_session_keys(), + 1000, + Box::new(|call| RuntimeCall::System(call).encode()), + || { + ( + bridging::AssetHubPolkadotMaxFee::key().to_vec(), + bridging::AssetHubPolkadotMaxFee::get(), + ) + }, + |old_value| match old_value { + Some(MultiAsset { id, fun: Fungible(old_amount) }) => + Some(MultiAsset { id: id.clone(), fun: Fungible(old_amount * 2) }), + Some(_) => None, + None => Some(MultiAsset::from((Here, 123456))), + }, + ) +} diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs index b8946474f73..7a26533e640 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs @@ -206,6 +206,14 @@ impl Contains for SafeCallFilter { } } + // Allow to change dedicated storage items (called by governance-like) + match call { + RuntimeCall::System(frame_system::Call::set_storage { items }) + if items.iter().any(|(k, _)| k.eq(&bridging::AssetHubKusamaMaxFee::key())) => + return true, + _ => (), + }; + matches!( call, RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | diff --git a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs index 20971678c60..3b056aa51a4 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs @@ -761,3 +761,23 @@ fn withdraw_reserve_asset_deposited_from_different_consensus_over_bridge_works() bridging_to_asset_hub_kusama ) } + +#[test] +fn change_asset_hub_kusama_max_fee_by_governance_works() { + asset_test_utils::test_cases::change_storage_constant_by_governance_works::< + Runtime, + bridging::AssetHubKusamaMaxFee, + Option, + >( + collator_session_keys(), + 1000, + Box::new(|call| RuntimeCall::System(call).encode()), + || (bridging::AssetHubKusamaMaxFee::key().to_vec(), bridging::AssetHubKusamaMaxFee::get()), + |old_value| match old_value { + Some(MultiAsset { id, fun: Fungible(old_amount) }) => + Some(MultiAsset { id: id.clone(), fun: Fungible(old_amount * 2) }), + Some(_) => None, + None => Some(MultiAsset::from((Here, 123456))), + }, + ) +} diff --git a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index ecf8ec51209..d958abc8fed 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -191,6 +191,14 @@ impl Contains for SafeCallFilter { } } + // Allow to change dedicated storage items (called by governance-like) + match call { + RuntimeCall::System(frame_system::Call::set_storage { items }) + if items.iter().any(|(k, _)| k.eq(&bridging::AssetHubKusamaLocalMaxFee::key())) => + return true, + _ => (), + }; + matches!( call, RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | diff --git a/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs b/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs index 9f70a5f1988..068c5f92c91 100644 --- a/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs @@ -768,3 +768,28 @@ fn plain_receive_teleported_asset_works() { assert_eq!(outcome.ensure_complete(), Ok(())); }) } + +#[test] +fn change_asset_hub_kusama_local_max_fee_by_governance_works() { + asset_test_utils::test_cases::change_storage_constant_by_governance_works::< + Runtime, + bridging::AssetHubKusamaLocalMaxFee, + Option, + >( + collator_session_keys(), + 1000, + Box::new(|call| RuntimeCall::System(call).encode()), + || { + ( + bridging::AssetHubKusamaLocalMaxFee::key().to_vec(), + bridging::AssetHubKusamaLocalMaxFee::get(), + ) + }, + |old_value| match old_value { + Some(MultiAsset { id, fun: Fungible(old_amount) }) => + Some(MultiAsset { id: id.clone(), fun: Fungible(old_amount * 2) }), + Some(_) => None, + None => Some(MultiAsset::from((Here, 123456))), + }, + ) +} diff --git a/parachains/runtimes/assets/test-utils/src/test_cases.rs b/parachains/runtimes/assets/test-utils/src/test_cases.rs index 500312c4c40..d6ba51bad26 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -33,6 +33,9 @@ use sp_runtime::{ use xcm::latest::prelude::*; use xcm_executor::{traits::ConvertLocation, XcmExecutor}; +// Re-export +pub use parachains_runtimes_test_utils::change_storage_constant_by_governance_works; + /// Test-case makes sure that `Runtime` can receive native asset from relay chain /// and can teleport it back and to the other parachains pub fn teleports_for_native_asset_works< diff --git a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs index fed0c992b96..8a33279cd2b 100644 --- a/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs +++ b/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs @@ -52,6 +52,8 @@ use xcm_executor::XcmExecutor; // Re-export test_case from assets pub use asset_test_utils::include_teleports_for_native_asset_works; +// Re-export +pub use parachains_runtimes_test_utils::change_storage_constant_by_governance_works; /// Test-case makes sure that `Runtime` can process bridging initialize via governance-like call pub fn initialize_bridge_by_governance_works( @@ -113,76 +115,6 @@ pub fn initialize_bridge_by_governance_works( }) } -/// Test-case makes sure that `Runtime` can change storage constant via governance-like call -pub fn change_storage_constant_by_governance_works( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - runtime_call_encode: Box) -> Vec>, - storage_constant_key_value: fn() -> (Vec, StorageConstantType), - new_storage_constant_value: fn(&StorageConstantType) -> StorageConstantType, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_dmp_queue::Config - + cumulus_pallet_parachain_system::Config, - ValidatorIdOf: From>, - StorageConstant: Get, - StorageConstantType: Encode + PartialEq + std::fmt::Debug, -{ - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_para_id(runtime_para_id.into()) - .with_tracing() - .build() - .execute_with(|| { - let (storage_constant_key, storage_constant_init_value): ( - Vec, - StorageConstantType, - ) = storage_constant_key_value(); - - // check delivery reward constant before (not stored yet, just as default value is used) - assert_eq!(StorageConstant::get(), storage_constant_init_value); - assert_eq!(sp_io::storage::get(&storage_constant_key), None); - - let new_storage_constant_value = - new_storage_constant_value(&storage_constant_init_value); - assert_ne!(new_storage_constant_value, storage_constant_init_value); - - // encode `set_storage` call - let set_storage_call = - runtime_call_encode(frame_system::Call::::set_storage { - items: vec![( - storage_constant_key.clone(), - new_storage_constant_value.encode(), - )], - }); - - // estimate - storing just 1 value - use frame_system::WeightInfo; - let require_weight_at_most = - ::SystemWeightInfo::set_storage(1); - - // execute XCM with Transact to `set_storage` as governance does - assert_ok!(RuntimeHelper::::execute_as_governance( - set_storage_call, - require_weight_at_most - ) - .ensure_complete()); - - // check delivery reward constant after (stored) - assert_eq!(StorageConstant::get(), new_storage_constant_value); - assert_eq!( - sp_io::storage::get(&storage_constant_key), - Some(new_storage_constant_value.encode().into()) - ); - }) -} - /// Test-case makes sure that `Runtime` can handle xcm `ExportMessage`: /// Checks if received XCM messages is correctly added to the message outbound queue for delivery. /// For SystemParachains we expect unpaid execution. diff --git a/parachains/runtimes/test-utils/src/lib.rs b/parachains/runtimes/test-utils/src/lib.rs index 8ff85438b3f..10fbffcf0e0 100644 --- a/parachains/runtimes/test-utils/src/lib.rs +++ b/parachains/runtimes/test-utils/src/lib.rs @@ -20,8 +20,10 @@ use cumulus_primitives_core::{AbridgedHrmpChannel, ParaId, PersistedValidationDa use cumulus_primitives_parachain_inherent::ParachainInherentData; use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; use frame_support::{ + assert_ok, dispatch::{DispatchResult, RawOrigin, UnfilteredDispatchable}, inherent::{InherentData, ProvideInherent}, + pallet_prelude::Get, traits::{GenesisBuild, OriginTrait}, weights::Weight, }; @@ -327,7 +329,6 @@ pub enum XcmReceivedFrom { impl RuntimeHelper { pub fn xcm_max_weight(from: XcmReceivedFrom) -> Weight { - use frame_support::traits::Get; match from { XcmReceivedFrom::Parent => ParachainSystem::ReservedDmpWeight::get(), XcmReceivedFrom::Sibling => ParachainSystem::ReservedXcmpWeight::get(), @@ -478,3 +479,73 @@ impl } } } + +/// Test-case makes sure that `Runtime` can change storage constant via governance-like call +pub fn change_storage_constant_by_governance_works( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + runtime_call_encode: Box) -> Vec>, + storage_constant_key_value: fn() -> (Vec, StorageConstantType), + new_storage_constant_value: fn(&StorageConstantType) -> StorageConstantType, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_dmp_queue::Config + + cumulus_pallet_parachain_system::Config, + ValidatorIdOf: From>, + StorageConstant: Get, + StorageConstantType: Encode + PartialEq + std::fmt::Debug, +{ + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_para_id(runtime_para_id.into()) + .with_tracing() + .build() + .execute_with(|| { + let (storage_constant_key, storage_constant_init_value): ( + Vec, + StorageConstantType, + ) = storage_constant_key_value(); + + // check constant before (not stored yet, just as default value is used) + assert_eq!(StorageConstant::get(), storage_constant_init_value); + assert_eq!(sp_io::storage::get(&storage_constant_key), None); + + let new_storage_constant_value = + new_storage_constant_value(&storage_constant_init_value); + assert_ne!(new_storage_constant_value, storage_constant_init_value); + + // encode `set_storage` call + let set_storage_call = + runtime_call_encode(frame_system::Call::::set_storage { + items: vec![( + storage_constant_key.clone(), + new_storage_constant_value.encode(), + )], + }); + + // estimate - storing just 1 value + use frame_system::WeightInfo; + let require_weight_at_most = + ::SystemWeightInfo::set_storage(1); + + // execute XCM with Transact to `set_storage` as governance does + assert_ok!(RuntimeHelper::::execute_as_governance( + set_storage_call, + require_weight_at_most + ) + .ensure_complete()); + + // check constant after (stored) + assert_eq!(StorageConstant::get(), new_storage_constant_value); + assert_eq!( + sp_io::storage::get(&storage_constant_key), + Some(new_storage_constant_value.encode().into()) + ); + }) +} From f4db99d65716bd202692a2e8e3f07fc1e20238e7 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 13 Jun 2023 12:41:03 +0300 Subject: [PATCH 323/339] trivial: remove redundant method implementations --- parachains/pallets/bridge-transfer/src/lib.rs | 23 +++---------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index b1cd5c160a9..0ce7052a384 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -51,6 +51,9 @@ pub mod pallet { use xcm::prelude::*; use xcm_executor::traits::TransactAsset; + #[cfg(feature = "runtime-benchmarks")] + use pallet_bridge_transfer_primitives::MaybePaidLocation; + #[pallet::pallet] pub struct Pallet(_); @@ -100,26 +103,6 @@ pub mod pallet { #[cfg(feature = "runtime-benchmarks")] impl BenchmarkHelper for () { - fn bridge_location() -> Option<(NetworkId, MaybePaidLocation)> { - None - } - - fn allowed_bridged_target_location() -> Option { - None - } - - fn prepare_asset_transfer( - ) -> Option<(RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation)> { - None - } - - fn universal_alias() -> Option<(VersionedMultiLocation, Junction)> { - None - } - - fn reserve_location() -> Option { - None - } } #[pallet::config] From 4b6d142f65cd969bdf15fab63d58f35b2eebaa24 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 13 Jun 2023 11:58:30 +0200 Subject: [PATCH 324/339] Fix benchmarks --- .../bridge-transfer/primitives/src/lib.rs | 4 +- .../bridge-transfer/src/benchmarking.rs | 59 +++------ .../pallets/bridge-transfer/src/impls.rs | 2 +- parachains/pallets/bridge-transfer/src/lib.rs | 57 +++------ .../assets/asset-hub-kusama/src/lib.rs | 9 +- .../assets/asset-hub-kusama/src/xcm_config.rs | 120 ++++++++++-------- .../assets/asset-hub-polkadot/Cargo.toml | 1 + .../assets/asset-hub-polkadot/src/lib.rs | 5 +- .../asset-hub-polkadot/src/xcm_config.rs | 120 ++++++++++++++++++ .../assets/asset-hub-westend/src/lib.rs | 9 +- .../asset-hub-westend/src/xcm_config.rs | 120 ++++++++++-------- 11 files changed, 300 insertions(+), 206 deletions(-) diff --git a/parachains/pallets/bridge-transfer/primitives/src/lib.rs b/parachains/pallets/bridge-transfer/primitives/src/lib.rs index a0b9744c983..9f01f25d416 100644 --- a/parachains/pallets/bridge-transfer/primitives/src/lib.rs +++ b/parachains/pallets/bridge-transfer/primitives/src/lib.rs @@ -34,7 +34,8 @@ pub struct MaybePaidLocation { } /// Represents ensured/verified reachable destination. -#[cfg_attr(feature = "std", derive(Debug, PartialEq))] +#[derive(Clone, Debug)] +#[cfg_attr(feature = "std", derive(PartialEq))] pub struct ReachableDestination { /// Bridge location pub bridge: MaybePaidLocation, @@ -53,6 +54,7 @@ pub trait EnsureReachableDestination { } /// Error type for [EnsureReachableDestination] +#[derive(Debug)] pub enum ReachableDestinationError { UnsupportedDestination, UnsupportedXcmVersion, diff --git a/parachains/pallets/bridge-transfer/src/benchmarking.rs b/parachains/pallets/bridge-transfer/src/benchmarking.rs index 04370772317..10ca3d94f4e 100644 --- a/parachains/pallets/bridge-transfer/src/benchmarking.rs +++ b/parachains/pallets/bridge-transfer/src/benchmarking.rs @@ -17,37 +17,16 @@ //! `BridgeTransfer` pallet benchmarks. -use crate::{ - types::{ - filter::MultiLocationFilter, AssetFilterOf, BridgeConfig, LatestVersionedMultiLocation, - }, - AllowedExporters, AllowedReserveLocations, AllowedUniversalAliases, BenchmarkHelper, Call, - Config, Event, Pallet, -}; +use crate::{BenchmarkHelper, Call, Config, Event, Pallet}; use frame_benchmarking::{benchmarks, BenchmarkError}; use frame_support::{ assert_ok, ensure, traits::{EnsureOrigin, Get}, - BoundedVec, }; use sp_std::prelude::*; use xcm::prelude::*; -#[cfg(feature = "runtime-benchmarks")] -impl Pallet { - #[cfg(feature = "runtime-benchmarks")] - pub fn insert_universal_alias_for_benchmarks((location, junction): (MultiLocation, Junction)) { - assert!(matches!( - AllowedUniversalAliases::::try_mutate( - LatestVersionedMultiLocation(&location), - |junctions| junctions.try_insert(junction) - ), - Ok(true) - )); - } -} - benchmarks! { transfer_asset_via_bridge { let _ = T::AssetTransferOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; @@ -56,33 +35,31 @@ benchmarks! { let max_assets_limit = T::AssetsLimit::get(); ensure!(max_assets_limit > 0, "MaxAssetsLimit not set up correctly."); - let (bridged_network, maybe_paid_bridge) = T::BenchmarkHelper::bridge_location() - .ok_or(BenchmarkError::Stop("missing `bridge_location` data"))?; - let mut bridge_config = BridgeConfig::new( - maybe_paid_bridge.location.into_versioned(), - maybe_paid_bridge.maybe_fee.map(|fee| fee.into()) - ); + // get desired remote destination + let desired_bridged_location = T::BenchmarkHelper::desired_bridged_location() + .ok_or(BenchmarkError::Stop("missing `desired_bridged_location` data"))?; + + // resolve expected reserve account + let assumed_reserve_account = Pallet::::resolve_reserve_account(&desired_bridged_location.1); - let allowed_bridged_target_location = T::BenchmarkHelper::allowed_bridged_target_location() - .ok_or(BenchmarkError::Stop("missing `allowed_bridged_target_location` data"))?; - assert_ok!(bridge_config.update_allowed_target_location( - allowed_bridged_target_location.location.into_versioned(), - allowed_bridged_target_location.maybe_fee.map(|fee| VersionedMultiAsset::V3(fee)) - )); - assert_ok!(bridge_config.add_allowed_target_location_filter_for( - allowed_bridged_target_location.location.into_versioned(), - AssetFilterOf::::All, - )); - AllowedExporters::::insert(bridged_network, bridge_config); + // prepare all requirements + let (origin, assets, destination) = T::BenchmarkHelper::prepare_asset_transfer_for( + desired_bridged_location.clone(), + assumed_reserve_account, + ).ok_or(BenchmarkError::Stop("missing `prepare_asset_transfer` data"))?; - let (origin, assets, destination) = T::BenchmarkHelper::prepare_asset_transfer() - .ok_or(BenchmarkError::Stop("missing `prepare_asset_transfer` data"))?; + // check assets let assets_count = match &assets { VersionedMultiAssets::V2(assets) => assets.len(), VersionedMultiAssets::V3(assets) => assets.len(), }; ensure!(assets_count == max_assets_limit as usize, "`assets` not set up correctly for worst case."); + // check destination if configuration is ok + assert_ok!(::ensure_destination( + desired_bridged_location.0, + destination.clone().try_into().map_err(|_|BenchmarkError::Stop("invalid configuration or data"))?)); + }: _(origin, Box::new(assets), Box::new(destination)) verify { // we don't care about message hash or sender cost here, just check that the transfer has been initiated diff --git a/parachains/pallets/bridge-transfer/src/impls.rs b/parachains/pallets/bridge-transfer/src/impls.rs index a1d155a1c06..9eb0e6cfcac 100644 --- a/parachains/pallets/bridge-transfer/src/impls.rs +++ b/parachains/pallets/bridge-transfer/src/impls.rs @@ -258,7 +258,7 @@ impl Pallet { } /// Resolve (sovereign) account which will be used as reserve account - fn resolve_reserve_account(destination: &ReachableDestination) -> MultiLocation { + pub(crate) fn resolve_reserve_account(destination: &ReachableDestination) -> MultiLocation { destination.target.location } } diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index b1cd5c160a9..2b7fdc2357a 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -46,7 +46,7 @@ pub mod pallet { use crate::types::ResolveAssetTransferKind; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - use pallet_bridge_transfer_primitives::EnsureReachableDestination; + use pallet_bridge_transfer_primitives::{EnsureReachableDestination, ReachableDestination}; use sp_std::boxed::Box; use xcm::prelude::*; use xcm_executor::traits::TransactAsset; @@ -57,21 +57,20 @@ pub mod pallet { /// Everything we need to run benchmarks. #[cfg(feature = "runtime-benchmarks")] pub trait BenchmarkHelper { - /// Returns proper bridge location+fee for NetworkId, supported by the runtime. + /// Returns proper destination for NetworkId, supported by the runtime. /// /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled /// to support transfer to this destination **after** `prepare_asset_transfer` call. - fn bridge_location() -> Option<(NetworkId, MaybePaidLocation)> { - None - } + fn desired_bridged_location() -> Option<(NetworkId, ReachableDestination)>; - /// Returns proper target_location location+fee supported by the runtime. - /// - /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled - /// to support transfer to this destination **after** `prepare_asset_transfer` call. - fn allowed_bridged_target_location() -> Option { - None - } + // + // /// Returns proper target_location location+fee supported by the runtime. + // /// + // /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled + // /// to support transfer to this destination **after** `prepare_asset_transfer` call. + // fn allowed_bridged_target_location() -> Option { + // None + // } /// Prepare environment for assets transfer and return transfer origin and assets /// to transfer. After this function is called, we expect `transfer_asset_via_bridge` @@ -84,42 +83,24 @@ pub mod pallet { /// - be close to the worst possible scenario - i.e. if some account may need to be created during /// the assets transfer, it should be created. If there are multiple bridges, the "worst possible" /// (in terms of performance) bridge must be selected for the transfer. - fn prepare_asset_transfer( - ) -> Option<(RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation)> { - None - } - - fn universal_alias() -> Option<(VersionedMultiLocation, Junction)> { - None - } - - fn reserve_location() -> Option { - None - } + fn prepare_asset_transfer_for( + desired_bridged_location: (NetworkId, ReachableDestination), + assumed_reserve_account: MultiLocation, + ) -> Option<(RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation)>; } #[cfg(feature = "runtime-benchmarks")] impl BenchmarkHelper for () { - fn bridge_location() -> Option<(NetworkId, MaybePaidLocation)> { - None - } - - fn allowed_bridged_target_location() -> Option { + fn desired_bridged_location() -> Option<(NetworkId, ReachableDestination)> { None } - fn prepare_asset_transfer( + fn prepare_asset_transfer_for( + _desired_bridged_location: (NetworkId, ReachableDestination), + _assumed_reserve_account: MultiLocation, ) -> Option<(RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation)> { None } - - fn universal_alias() -> Option<(VersionedMultiLocation, Junction)> { - None - } - - fn reserve_location() -> Option { - None - } } #[pallet::config] diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs index f7773d55713..238c2554200 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs @@ -1146,13 +1146,8 @@ impl_runtime_apis! { } fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { - match <::BenchmarkHelper as pallet_bridge_transfer::BenchmarkHelper>::universal_alias() { - Some((location, junction)) => { - >::insert_universal_alias_for_benchmarks( - (location.clone().try_into().unwrap(), junction) - ); - Ok((location.clone().try_into().unwrap(), junction)) - }, + match xcm_config::BridgeTransferBenchmarksHelper::prepare_universal_alias() { + Some(alias) => Ok(alias), None => Err(BenchmarkError::Skip) } } diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs index 37a6f1be410..9ba616f8748 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs @@ -596,62 +596,76 @@ pub mod bridging { >; } -/// Benchmarks helper for over-bridge transfer pallet. #[cfg(feature = "runtime-benchmarks")] -pub struct BridgeTransferBenchmarksHelper; +use pallet_bridge_transfer_primitives::{MaybePaidLocation, ReachableDestination}; +/// Benchmarks helper for over-bridge transfer pallet. #[cfg(feature = "runtime-benchmarks")] -impl BridgeTransferBenchmarksHelper { - /// Parachain at the other side of the bridge that we're connected to. - fn allowed_target_location() -> MultiLocation { - MultiLocation::new(2, X2(GlobalConsensus(Polkadot), Parachain(1000))) - } - - /// Max fee we are willing to pay on the bridged side - fn allowed_target_location_max_fee() -> Option { - Some((MultiLocation::parent(), 50_000_000_000_u128).into()) - } - - /// Identifier of the sibling bridge-hub parachain. - fn bridge_hub_para_id() -> u32 { - 1002 - } -} - +pub struct BridgeTransferBenchmarksHelper; #[cfg(feature = "runtime-benchmarks")] impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBenchmarksHelper { - fn bridge_location() -> Option<(NetworkId, pallet_bridge_transfer::MaybePaidLocation)> { + fn desired_bridged_location() -> Option<(NetworkId, ReachableDestination)> { + let bridged_network = bridging::PolkadotNetwork::get(); + let target_location = bridging::AssetHubPolkadot::get(); + let target_location_fee = bridging::AssetHubPolkadotMaxFee::get(); + let target_location_account = target_location + .clone() + .appended_with(AccountId32 { + network: Some(bridged_network), + id: AccountId::from([42u8; 32]).into(), + }) + .expect("Correct target_location_account"); + Some(( - Polkadot, - pallet_bridge_transfer::MaybePaidLocation { - location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), - // Right now `UnpaidRemoteExporter` is used to send XCM messages and it requires - // fee to be `None`. If we're going to change that (are we?), then we should replace - // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` - maybe_fee: None, + bridging::PolkadotNetwork::get(), + ReachableDestination { + bridge: MaybePaidLocation { + location: bridging::BridgeHubKusama::get(), + // Right now `UnpaidRemoteExporter` is used to send XCM messages and it requires + // fee to be `None`. If we're going to change that (are we?), then we should replace + // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` + maybe_fee: None, + }, + target: MaybePaidLocation { + location: target_location, + maybe_fee: target_location_fee, + }, + target_destination: target_location_account, }, )) } - fn allowed_bridged_target_location() -> Option { - Some(pallet_bridge_transfer::MaybePaidLocation { - location: Self::allowed_target_location(), - maybe_fee: Self::allowed_target_location_max_fee(), - }) - } - - fn prepare_asset_transfer( + fn prepare_asset_transfer_for( + desired_bridged_location: (NetworkId, ReachableDestination), + assumed_reserve_account: MultiLocation, ) -> Option<(RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation)> { use frame_support::traits::Currency; + let (_, desired_bridged_location) = desired_bridged_location; // our `BridgeXcmSender` assumes that the HRMP channel is opened between this - // parachain and the sibling bridge-hub parachain + // parachain and the sibling bridge-hub parachain. + // we expect local bridge-hub + let bridge_hub_para_id = match desired_bridged_location.bridge.location { + MultiLocation { parents: 1, interior: X1(Parachain(bridge_hub_para_id)) } => + bridge_hub_para_id, + _ => panic!("Cannot resolve bridge_hub_para_id"), + }; cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( - Self::bridge_hub_para_id().into(), + bridge_hub_para_id.into(), ); // sender account let sender_account = AccountId::from([42u8; 32]); + // reserve account + use xcm_executor::traits::ConvertLocation; + let assumed_reserve_account = + LocationToAccountId::convert_location(&assumed_reserve_account) + .expect("Correct AccountId"); + + // deposit enough funds to the sender account + let existential_deposit = crate::ExistentialDeposit::get(); + let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); + let _ = Balances::deposit_creating(&assumed_reserve_account, existential_deposit * 10); // We need root origin to create asset let minimum_asset_balance = 3333333_u128; @@ -672,10 +686,6 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe minimum_asset_balance * 4 )); - // deposit enough funds to the sender account - let existential_deposit = crate::ExistentialDeposit::get(); - let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); - // finally - prepare assets and destination (pallet_assets is worse than pallet_balances) use sp_runtime::traits::MaybeEquivalence; let asset_id_location = assets_common::AssetIdForTrustBackedAssetsConvert::< @@ -685,23 +695,23 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe let asset: MultiAsset = (Concrete(asset_id_location), minimum_asset_balance * 2).into(); let assets = xcm::VersionedMultiAssets::V3(asset.into()); - let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); + let destination = + xcm::VersionedMultiLocation::V3(desired_bridged_location.target_destination); Some((RuntimeOrigin::signed(sender_account), assets, destination)) } +} - fn universal_alias() -> Option<(xcm::VersionedMultiLocation, Junction)> { - Some(( - MultiLocation { parents: 1, interior: X1(Parachain(Self::bridge_hub_para_id())) } - .into_versioned(), - GlobalConsensus(Polkadot), - )) - } - - fn reserve_location() -> Option { - Some( - MultiLocation { parents: 2, interior: X2(GlobalConsensus(Polkadot), Parachain(1000)) } - .into_versioned(), - ) +#[cfg(feature = "runtime-benchmarks")] +impl BridgeTransferBenchmarksHelper { + pub fn prepare_universal_alias() -> Option<(MultiLocation, Junction)> { + let alias = bridging::BridgedUniversalAliases::get().into_iter().find_map( + |(location, junction)| match bridging::BridgeHubKusama::get().eq(&location) { + true => Some((location, junction)), + false => None, + }, + ); + assert!(alias.is_some(), "we expect here BridgeHubKusama to Polkadot mapping at least"); + Some(alias.unwrap()) } } diff --git a/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml index 3374768f069..15e25ca060d 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml @@ -103,6 +103,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", + "cumulus-pallet-parachain-system/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs index f9fd5bb1f94..070007bb6f0 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs @@ -1159,7 +1159,10 @@ impl_runtime_apis! { } fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { - Err(BenchmarkError::Skip) + match xcm_config::BridgeTransferBenchmarksHelper::prepare_universal_alias() { + Some(alias) => Ok(alias), + None => Err(BenchmarkError::Skip) + } } fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs index 7a26533e640..06f28a53187 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs @@ -621,3 +621,123 @@ pub mod bridging { BridgedReserves, >; } + +#[cfg(feature = "runtime-benchmarks")] +use pallet_bridge_transfer_primitives::{MaybePaidLocation, ReachableDestination}; + +/// Benchmarks helper for over-bridge transfer pallet. +#[cfg(feature = "runtime-benchmarks")] +pub struct BridgeTransferBenchmarksHelper; +#[cfg(feature = "runtime-benchmarks")] +impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBenchmarksHelper { + fn desired_bridged_location() -> Option<(NetworkId, ReachableDestination)> { + let bridged_network = bridging::KusamaNetwork::get(); + let target_location = bridging::AssetHubKusama::get(); + let target_location_fee = bridging::AssetHubKusamaMaxFee::get(); + let target_location_account = target_location + .clone() + .appended_with(AccountId32 { + network: Some(bridged_network), + id: AccountId::from([42u8; 32]).into(), + }) + .expect("Correct target_location_account"); + + Some(( + bridging::KusamaNetwork::get(), + ReachableDestination { + bridge: MaybePaidLocation { + location: bridging::BridgeHubPolkadot::get(), + // Right now `UnpaidRemoteExporter` is used to send XCM messages and it requires + // fee to be `None`. If we're going to change that (are we?), then we should replace + // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` + maybe_fee: None, + }, + target: MaybePaidLocation { + location: target_location, + maybe_fee: target_location_fee, + }, + target_destination: target_location_account, + }, + )) + } + + fn prepare_asset_transfer_for( + desired_bridged_location: (NetworkId, ReachableDestination), + assumed_reserve_account: MultiLocation, + ) -> Option<(RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation)> { + use frame_support::traits::Currency; + let (_, desired_bridged_location) = desired_bridged_location; + + // our `BridgeXcmSender` assumes that the HRMP channel is opened between this + // parachain and the sibling bridge-hub parachain. + // we expect local bridge-hub + let bridge_hub_para_id = match desired_bridged_location.bridge.location { + MultiLocation { parents: 1, interior: X1(Parachain(bridge_hub_para_id)) } => + bridge_hub_para_id, + _ => panic!("Cannot resolve bridge_hub_para_id"), + }; + cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( + bridge_hub_para_id.into(), + ); + + // sender account + let sender_account = AccountId::from([42u8; 32]); + // reserve account + use xcm_executor::traits::ConvertLocation; + let assumed_reserve_account = + LocationToAccountId::convert_location(&assumed_reserve_account) + .expect("Correct AccountId"); + + // deposit enough funds to the sender account + let existential_deposit = crate::ExistentialDeposit::get(); + let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); + let _ = Balances::deposit_creating(&assumed_reserve_account, existential_deposit * 10); + + // We need root origin to create asset + let minimum_asset_balance = 3333333_u128; + let local_asset_id = 1; + frame_support::assert_ok!(Assets::force_create( + RuntimeOrigin::root(), + local_asset_id.into(), + sender_account.clone().into(), + true, + minimum_asset_balance + )); + + // We mint enough asset for the account to exist for assets + frame_support::assert_ok!(Assets::mint( + RuntimeOrigin::signed(sender_account.clone()), + local_asset_id.into(), + sender_account.clone().into(), + minimum_asset_balance * 4 + )); + + // finally - prepare assets and destination (pallet_assets is worse than pallet_balances) + use sp_runtime::traits::MaybeEquivalence; + let asset_id_location = assets_common::AssetIdForTrustBackedAssetsConvert::< + TrustBackedAssetsPalletLocation, + >::convert_back(&local_asset_id) + .unwrap(); + let asset: MultiAsset = (Concrete(asset_id_location), minimum_asset_balance * 2).into(); + + let assets = xcm::VersionedMultiAssets::V3(asset.into()); + let destination = + xcm::VersionedMultiLocation::V3(desired_bridged_location.target_destination); + + Some((RuntimeOrigin::signed(sender_account), assets, destination)) + } +} + +#[cfg(feature = "runtime-benchmarks")] +impl BridgeTransferBenchmarksHelper { + pub fn prepare_universal_alias() -> Option<(MultiLocation, Junction)> { + let alias = bridging::BridgedUniversalAliases::get().into_iter().find_map( + |(location, junction)| match bridging::BridgeHubPolkadot::get().eq(&location) { + true => Some((location, junction)), + false => None, + }, + ); + assert!(alias.is_some(), "we expect here BridgeHubPolkadot to Kusama mapping at least"); + Some(alias.unwrap()) + } +} diff --git a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index f7e9bb85b83..4154fd9d54c 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -1186,13 +1186,8 @@ impl_runtime_apis! { } fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { - match <::BenchmarkHelper as pallet_bridge_transfer::BenchmarkHelper>::universal_alias() { - Some((location, junction)) => { - >::insert_universal_alias_for_benchmarks( - (location.clone().try_into().unwrap(), junction) - ); - Ok((location.clone().try_into().unwrap(), junction)) - }, + match xcm_config::BridgeTransferBenchmarksHelper::prepare_universal_alias() { + Some(alias) => Ok(alias), None => Err(BenchmarkError::Skip) } } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index d958abc8fed..ae4857eaced 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -591,62 +591,76 @@ pub mod bridging { >; } -/// Benchmarks helper for over-bridge transfer pallet. #[cfg(feature = "runtime-benchmarks")] -pub struct BridgeTransferBenchmarksHelper; +use pallet_bridge_transfer_primitives::{MaybePaidLocation, ReachableDestination}; +/// Benchmarks helper for over-bridge transfer pallet. #[cfg(feature = "runtime-benchmarks")] -impl BridgeTransferBenchmarksHelper { - /// Parachain at the other side of the bridge that we're connected to. - fn allowed_target_location() -> MultiLocation { - MultiLocation::new(2, X2(GlobalConsensus(Kusama), Parachain(1000))) - } - - /// Max fee we are willing to pay on the bridged side - fn allowed_target_location_max_fee() -> Option { - Some((MultiLocation::parent(), 50_000_000_000_u128).into()) - } - - /// Identifier of the sibling bridge-hub parachain. - fn bridge_hub_para_id() -> u32 { - 1002 - } -} - +pub struct BridgeTransferBenchmarksHelper; #[cfg(feature = "runtime-benchmarks")] impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBenchmarksHelper { - fn bridge_location() -> Option<(NetworkId, pallet_bridge_transfer::MaybePaidLocation)> { + fn desired_bridged_location() -> Option<(NetworkId, ReachableDestination)> { + let bridged_network = bridging::KusamaLocalNetwork::get(); + let target_location = bridging::AssetHubKusamaLocal::get(); + let target_location_fee = bridging::AssetHubKusamaLocalMaxFee::get(); + let target_location_account = target_location + .clone() + .appended_with(AccountId32 { + network: Some(bridged_network), + id: AccountId::from([42u8; 32]).into(), + }) + .expect("Correct target_location_account"); + Some(( - Kusama, - pallet_bridge_transfer::MaybePaidLocation { - location: (Parent, Parachain(Self::bridge_hub_para_id())).into(), - // Right now `UnpaidRemoteExporter` is used to send XCM messages and it requires - // fee to be `None`. If we're going to change that (are we?), then we should replace - // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` - maybe_fee: None, + bridging::KusamaLocalNetwork::get(), + ReachableDestination { + bridge: MaybePaidLocation { + location: bridging::BridgeHub::get(), + // Right now `UnpaidRemoteExporter` is used to send XCM messages and it requires + // fee to be `None`. If we're going to change that (are we?), then we should replace + // this `None` with `Some(Self::make_asset(crate::ExistentialDeposit::get()))` + maybe_fee: None, + }, + target: MaybePaidLocation { + location: target_location, + maybe_fee: target_location_fee, + }, + target_destination: target_location_account, }, )) } - fn allowed_bridged_target_location() -> Option { - Some(pallet_bridge_transfer::MaybePaidLocation { - location: Self::allowed_target_location(), - maybe_fee: Self::allowed_target_location_max_fee(), - }) - } - - fn prepare_asset_transfer( + fn prepare_asset_transfer_for( + desired_bridged_location: (NetworkId, ReachableDestination), + assumed_reserve_account: MultiLocation, ) -> Option<(RuntimeOrigin, xcm::VersionedMultiAssets, xcm::VersionedMultiLocation)> { use frame_support::traits::Currency; + let (_, desired_bridged_location) = desired_bridged_location; // our `BridgeXcmSender` assumes that the HRMP channel is opened between this - // parachain and the sibling bridge-hub parachain + // parachain and the sibling bridge-hub parachain. + // we expect local bridge-hub + let bridge_hub_para_id = match desired_bridged_location.bridge.location { + MultiLocation { parents: 1, interior: X1(Parachain(bridge_hub_para_id)) } => + bridge_hub_para_id, + _ => panic!("Cannot resolve bridge_hub_para_id"), + }; cumulus_pallet_parachain_system::Pallet::::open_outbound_hrmp_channel_for_benchmarks( - Self::bridge_hub_para_id().into(), + bridge_hub_para_id.into(), ); // sender account let sender_account = AccountId::from([42u8; 32]); + // reserve account + use xcm_executor::traits::ConvertLocation; + let assumed_reserve_account = + LocationToAccountId::convert_location(&assumed_reserve_account) + .expect("Correct AccountId"); + + // deposit enough funds to the sender account + let existential_deposit = crate::ExistentialDeposit::get(); + let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); + let _ = Balances::deposit_creating(&assumed_reserve_account, existential_deposit * 10); // We need root origin to create asset let minimum_asset_balance = 3333333_u128; @@ -667,10 +681,6 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe minimum_asset_balance * 4 )); - // deposit enough funds to the sender account - let existential_deposit = crate::ExistentialDeposit::get(); - let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); - // finally - prepare assets and destination (pallet_assets is worse than pallet_balances) use sp_runtime::traits::MaybeEquivalence; let asset_id_location = assets_common::AssetIdForTrustBackedAssetsConvert::< @@ -680,23 +690,23 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe let asset: MultiAsset = (Concrete(asset_id_location), minimum_asset_balance * 2).into(); let assets = xcm::VersionedMultiAssets::V3(asset.into()); - let destination = xcm::VersionedMultiLocation::V3(Self::allowed_target_location()); + let destination = + xcm::VersionedMultiLocation::V3(desired_bridged_location.target_destination); Some((RuntimeOrigin::signed(sender_account), assets, destination)) } +} - fn universal_alias() -> Option<(xcm::VersionedMultiLocation, Junction)> { - Some(( - MultiLocation { parents: 1, interior: X1(Parachain(Self::bridge_hub_para_id())) } - .into_versioned(), - GlobalConsensus(Polkadot), - )) - } - - fn reserve_location() -> Option { - Some( - MultiLocation { parents: 2, interior: X2(GlobalConsensus(Polkadot), Parachain(1000)) } - .into_versioned(), - ) +#[cfg(feature = "runtime-benchmarks")] +impl BridgeTransferBenchmarksHelper { + pub fn prepare_universal_alias() -> Option<(MultiLocation, Junction)> { + let alias = bridging::BridgedUniversalAliases::get().into_iter().find_map( + |(location, junction)| match bridging::BridgeHub::get().eq(&location) { + true => Some((location, junction)), + false => None, + }, + ); + assert!(alias.is_some(), "we expect here BridgeHub to KusamaLocal mapping at least"); + Some(alias.unwrap()) } } From 49898b7eaac06473aea8f95d7cf3f31c2a31cda8 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 13 Jun 2023 12:29:38 +0200 Subject: [PATCH 325/339] Nits --- parachains/pallets/bridge-transfer/src/lib.rs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 90bf53d974d..4e51e4030b3 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -17,7 +17,7 @@ //! //! Module supports transfer assets over bridges between different consensus chain. //! With fine-grained configuration you can control transferred assets (out/in) between different consensus chain. -//! "Transfer asset over bridge" recognize two kinds of transfer see [types::AssetTransferKind]. +//! "Transfer asset over bridge" recognize two kinds of transfer see `types::AssetTransferKind`. // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] @@ -46,7 +46,7 @@ pub mod pallet { use crate::types::ResolveAssetTransferKind; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - use pallet_bridge_transfer_primitives::{EnsureReachableDestination, ReachableDestination}; + use pallet_bridge_transfer_primitives::EnsureReachableDestination; use sp_std::boxed::Box; use xcm::prelude::*; use xcm_executor::traits::TransactAsset; @@ -61,7 +61,8 @@ pub mod pallet { /// /// We expect that the XCM environment (`BridgeXcmSender`) has everything enabled /// to support transfer to this destination **after** `prepare_asset_transfer` call. - fn desired_bridged_location() -> Option<(NetworkId, ReachableDestination)>; + fn desired_bridged_location( + ) -> Option<(NetworkId, pallet_bridge_transfer_primitives::ReachableDestination)>; /// Prepare environment for assets transfer and return transfer origin and assets /// to transfer. After this function is called, we expect `transfer_asset_via_bridge` @@ -75,19 +76,26 @@ pub mod pallet { /// the assets transfer, it should be created. If there are multiple bridges, the "worst possible" /// (in terms of performance) bridge must be selected for the transfer. fn prepare_asset_transfer_for( - desired_bridged_location: (NetworkId, ReachableDestination), + desired_bridged_location: ( + NetworkId, + pallet_bridge_transfer_primitives::ReachableDestination, + ), assumed_reserve_account: MultiLocation, ) -> Option<(RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation)>; } #[cfg(feature = "runtime-benchmarks")] impl BenchmarkHelper for () { - fn desired_bridged_location() -> Option<(NetworkId, ReachableDestination)> { + fn desired_bridged_location( + ) -> Option<(NetworkId, pallet_bridge_transfer_primitives::ReachableDestination)> { None } fn prepare_asset_transfer_for( - _desired_bridged_location: (NetworkId, ReachableDestination), + _desired_bridged_location: ( + NetworkId, + pallet_bridge_transfer_primitives::ReachableDestination, + ), _assumed_reserve_account: MultiLocation, ) -> Option<(RuntimeOrigin, VersionedMultiAssets, VersionedMultiLocation)> { None From 74ad4d4de49770ae7cfe4db7a3c277df9f0ac9b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 12:38:47 +0200 Subject: [PATCH 326/339] Bump log from 0.4.18 to 0.4.19 (#2728) Bumps [log](https://github.com/rust-lang/log) from 0.4.18 to 0.4.19. - [Release notes](https://github.com/rust-lang/log/releases) - [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/log/compare/0.4.18...0.4.19) --- updated-dependencies: - dependency-name: log dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- bridges/bin/runtime-common/Cargo.toml | 2 +- bridges/modules/grandpa/Cargo.toml | 2 +- bridges/modules/messages/Cargo.toml | 2 +- bridges/modules/parachains/Cargo.toml | 2 +- bridges/modules/relayers/Cargo.toml | 2 +- client/consensus/common/Cargo.toml | 2 +- pallets/collator-selection/Cargo.toml | 2 +- pallets/dmp-queue/Cargo.toml | 2 +- pallets/parachain-system/Cargo.toml | 2 +- pallets/xcmp-queue/Cargo.toml | 2 +- parachain-template/node/Cargo.toml | 2 +- parachain-template/runtime/Cargo.toml | 2 +- parachains/runtimes/assets/asset-hub-kusama/Cargo.toml | 2 +- parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml | 2 +- parachains/runtimes/assets/asset-hub-westend/Cargo.toml | 2 +- parachains/runtimes/assets/common/Cargo.toml | 2 +- parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml | 2 +- .../runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml | 2 +- parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- .../runtimes/collectives/collectives-polkadot/Cargo.toml | 2 +- parachains/runtimes/contracts/contracts-rococo/Cargo.toml | 2 +- parachains/runtimes/testing/penpal/Cargo.toml | 2 +- polkadot-parachain/Cargo.toml | 2 +- primitives/utility/Cargo.toml | 2 +- xcm/xcm-emulator/Cargo.toml | 2 +- 26 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4eaf2874ad9..380b87f171c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6277,9 +6277,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.18" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "lru" diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml index 8fe89de962e..119673935eb 100644 --- a/bridges/bin/runtime-common/Cargo.toml +++ b/bridges/bin/runtime-common/Cargo.toml @@ -9,7 +9,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } hash-db = { version = "0.16.0", default-features = false } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } static_assertions = { version = "1.1", optional = true } diff --git a/bridges/modules/grandpa/Cargo.toml b/bridges/modules/grandpa/Cargo.toml index fcc1c2a9b07..64731a9ced4 100644 --- a/bridges/modules/grandpa/Cargo.toml +++ b/bridges/modules/grandpa/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } finality-grandpa = { version = "0.16.2", default-features = false } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Bridge Dependencies diff --git a/bridges/modules/messages/Cargo.toml b/bridges/modules/messages/Cargo.toml index 34120e6908a..6349eb64b17 100644 --- a/bridges/modules/messages/Cargo.toml +++ b/bridges/modules/messages/Cargo.toml @@ -8,7 +8,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } num-traits = { version = "0.2", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } diff --git a/bridges/modules/parachains/Cargo.toml b/bridges/modules/parachains/Cargo.toml index 5ee30f594c7..30c646a6e69 100644 --- a/bridges/modules/parachains/Cargo.toml +++ b/bridges/modules/parachains/Cargo.toml @@ -7,7 +7,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Bridge Dependencies diff --git a/bridges/modules/relayers/Cargo.toml b/bridges/modules/relayers/Cargo.toml index 9fbc0996ba7..d39bb3b7911 100644 --- a/bridges/modules/relayers/Cargo.toml +++ b/bridges/modules/relayers/Cargo.toml @@ -8,7 +8,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Bridge dependencies diff --git a/client/consensus/common/Cargo.toml b/client/consensus/common/Cargo.toml index 6523368fe35..9b5f9e4f1de 100644 --- a/client/consensus/common/Cargo.toml +++ b/client/consensus/common/Cargo.toml @@ -10,7 +10,7 @@ async-trait = "0.1.68" codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } dyn-clone = "1.0.11" futures = "0.3.28" -log = "0.4.18" +log = "0.4.19" tracing = "0.1.37" # Substrate diff --git a/pallets/collator-selection/Cargo.toml b/pallets/collator-selection/Cargo.toml index c62a0a180a9..7f6da7abfc4 100644 --- a/pallets/collator-selection/Cargo.toml +++ b/pallets/collator-selection/Cargo.toml @@ -13,7 +13,7 @@ version = "3.0.0" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } codec = { default-features = false, features = ["derive"], package = "parity-scale-codec", version = "3.0.0" } rand = { version = "0.8.5", features = ["std_rng"], default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } diff --git a/pallets/dmp-queue/Cargo.toml b/pallets/dmp-queue/Cargo.toml index f4b4b1eb3d7..ce182df2e4f 100644 --- a/pallets/dmp-queue/Cargo.toml +++ b/pallets/dmp-queue/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate diff --git a/pallets/parachain-system/Cargo.toml b/pallets/parachain-system/Cargo.toml index 91c4649057e..fbe2bde74d6 100644 --- a/pallets/parachain-system/Cargo.toml +++ b/pallets/parachain-system/Cargo.toml @@ -10,7 +10,7 @@ bytes = { version = "1.4.0", default-features = false } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } environmental = { version = "1.1.4", default-features = false } impl-trait-for-tuples = "0.2.1" -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } # Substrate diff --git a/pallets/xcmp-queue/Cargo.toml b/pallets/xcmp-queue/Cargo.toml index a083716d948..4c7142b7a3d 100644 --- a/pallets/xcmp-queue/Cargo.toml +++ b/pallets/xcmp-queue/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } rand_chacha = { version = "0.3.0", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } diff --git a/parachain-template/node/Cargo.toml b/parachain-template/node/Cargo.toml index ebe877d4918..0debc5966b4 100644 --- a/parachain-template/node/Cargo.toml +++ b/parachain-template/node/Cargo.toml @@ -11,7 +11,7 @@ build = "build.rs" [dependencies] clap = { version = "4.3.3", features = ["derive"] } -log = "0.4.18" +log = "0.4.19" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.164", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } diff --git a/parachain-template/runtime/Cargo.toml b/parachain-template/runtime/Cargo.toml index e8a10110a6e..6177e435472 100644 --- a/parachain-template/runtime/Cargo.toml +++ b/parachain-template/runtime/Cargo.toml @@ -17,7 +17,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml b/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml index b82cb096bb7..0433e814a74 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml @@ -8,7 +8,7 @@ description = "Kusama variant of Asset Hub parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml index 149e71df130..0507c7b6e9c 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml @@ -8,7 +8,7 @@ description = "Asset Hub Polkadot parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index 61405382404..40b3b25e681 100644 --- a/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -8,7 +8,7 @@ description = "Westend variant of Asset Hub parachain runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/assets/common/Cargo.toml b/parachains/runtimes/assets/common/Cargo.toml index 97965b1e2c2..e1ec1b451d8 100644 --- a/parachains/runtimes/assets/common/Cargo.toml +++ b/parachains/runtimes/assets/common/Cargo.toml @@ -8,7 +8,7 @@ description = "Assets common utilities" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml index 5b8b62deb53..1d2e31c70ff 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -11,7 +11,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } serde = { version = "1.0.164", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml index b3de67f82df..90a56c74633 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -11,7 +11,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } serde = { version = "1.0.164", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 7ae7ed8c9c9..e00439f13d5 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -11,7 +11,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } serde = { version = "1.0.164", optional = true, features = ["derive"] } smallvec = "1.8.1" diff --git a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml index 0c80f4a217d..36d2d8cbb01 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml +++ b/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml @@ -8,7 +8,7 @@ description = "Polkadot Collectives Parachain Runtime" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index ac043cc7e0b..b47227bf135 100644 --- a/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -13,7 +13,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/parachains/runtimes/testing/penpal/Cargo.toml b/parachains/runtimes/testing/penpal/Cargo.toml index 547559170c4..bc4175a1764 100644 --- a/parachains/runtimes/testing/penpal/Cargo.toml +++ b/parachains/runtimes/testing/penpal/Cargo.toml @@ -17,7 +17,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } smallvec = "1.10.0" diff --git a/polkadot-parachain/Cargo.toml b/polkadot-parachain/Cargo.toml index 22a4f5d0c1f..ffc142e290e 100644 --- a/polkadot-parachain/Cargo.toml +++ b/polkadot-parachain/Cargo.toml @@ -16,7 +16,7 @@ clap = { version = "4.3.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" -log = "0.4.18" +log = "0.4.19" serde = { version = "1.0.164", features = ["derive"] } serde_json = "1.0.96" diff --git a/primitives/utility/Cargo.toml b/primitives/utility/Cargo.toml index 00a634fa438..2e6367ee2b9 100644 --- a/primitives/utility/Cargo.toml +++ b/primitives/utility/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } # Substrate frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/xcm/xcm-emulator/Cargo.toml b/xcm/xcm-emulator/Cargo.toml index 4d25b7724f7..01b9f6d6043 100644 --- a/xcm/xcm-emulator/Cargo.toml +++ b/xcm/xcm-emulator/Cargo.toml @@ -10,7 +10,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0" } paste = "1.0.5" quote = "1.0.28" casey = "0.4.0" -log = { version = "0.4.18", default-features = false } +log = { version = "0.4.19", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" } From 6996284493ab6531194bc24ae7768db2381c9f34 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 13 Jun 2023 12:49:49 +0200 Subject: [PATCH 327/339] Clippy --- .../test-utils/src/test_cases_over_bridge.rs | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs index 2e4ae81a51d..9e552fcf9cb 100644 --- a/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs +++ b/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs @@ -122,7 +122,7 @@ pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< let alice_account_init_balance = existential_deposit + balance_to_transfer.into(); let _ = >::deposit_creating( &alice_account, - alice_account_init_balance.clone(), + alice_account_init_balance, ); // SA of target location needs to have at least ED, anyway making reserve fails let _ = >::deposit_creating( @@ -151,7 +151,6 @@ pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< // destination is (some) account from different consensus let target_destination_account = target_location_from_different_consensus - .clone() .appended_with(AccountId32 { network: Some(bridged_network), id: sp_runtime::AccountId32::new([3; 32]).into(), @@ -162,7 +161,7 @@ pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< assert_ok!(>::transfer_asset_via_bridge( RuntimeHelper::::origin_of(alice_account.clone()), Box::new(VersionedMultiAssets::from(assets.clone())), - Box::new(VersionedMultiLocation::from(target_destination_account.clone())), + Box::new(VersionedMultiLocation::from(target_destination_account)), )); // check alice account decreased @@ -237,7 +236,6 @@ pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< let (_, target_location_junctions_without_global_consensus) = target_location_from_different_consensus .interior - .clone() .split_global() .expect("split works"); assert_eq!( @@ -252,7 +250,7 @@ pub fn transfer_asset_via_bridge_initiate_reserve_based_for_native_asset_works< XcmConfig::UniversalLocation::get(), ) .expect("reanchored assets"); - let mut reanchored_destination_account = target_destination_account.clone(); + let mut reanchored_destination_account = target_destination_account; reanchored_destination_account .reanchor( &target_location_from_different_consensus, @@ -448,7 +446,7 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work assert_ok!( >::force_create( RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation.clone().into(), + foreign_asset_id_multilocation.into(), reserve_account.clone().into(), false, asset_minimum_asset_balance.into() @@ -458,7 +456,7 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work // 2. drip asset to alice assert_ok!(>::mint( RuntimeHelper::::origin_of(reserve_account.clone()), - foreign_asset_id_multilocation.clone().into(), + foreign_asset_id_multilocation.into(), alice_account.clone().into(), (asset_minimum_asset_balance + balance_to_transfer).into() )); @@ -474,7 +472,7 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work ); assert_eq!( >::balance( - foreign_asset_id_multilocation.clone().into(), + foreign_asset_id_multilocation.into(), alice_account.clone() ), (asset_minimum_asset_balance + balance_to_transfer).into() @@ -488,7 +486,6 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work // destination is (some) account from different consensus let target_destination_account = target_location_from_different_consensus - .clone() .appended_with(AccountId32 { network: Some(bridged_network), id: sp_runtime::AccountId32::new([3; 32]).into(), @@ -499,7 +496,7 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work assert_ok!(>::transfer_asset_via_bridge( RuntimeHelper::::origin_of(alice_account.clone()), Box::new(VersionedMultiAssets::from(assets.clone())), - Box::new(VersionedMultiLocation::from(target_destination_account.clone())), + Box::new(VersionedMultiLocation::from(target_destination_account)), )); // check alice account (balances not changed) @@ -515,7 +512,7 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work // `ForeignAssets` for alice account is decressed assert_eq!( >::balance( - foreign_asset_id_multilocation.clone().into(), + foreign_asset_id_multilocation.into(), alice_account.clone() ), asset_minimum_asset_balance.into() @@ -580,7 +577,6 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work let (_, target_location_junctions_without_global_consensus) = target_location_from_different_consensus .interior - .clone() .split_global() .expect("split works"); assert_eq!( @@ -595,7 +591,7 @@ pub fn transfer_asset_via_bridge_initiate_withdraw_reserve_for_native_asset_work XcmConfig::UniversalLocation::get(), ) .expect("reanchored assets"); - let mut reanchored_destination_account = target_destination_account.clone(); + let mut reanchored_destination_account = target_destination_account; reanchored_destination_account .reanchor( &target_location_from_different_consensus, @@ -761,7 +757,7 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_over_bridge_work assert_ok!( >::force_create( RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation.clone().into(), + foreign_asset_id_multilocation.into(), remote_parachain_sovereign_account.clone().into(), false, asset_minimum_asset_balance.into() From 9d7416fdefa35d8677b18a9b714852be85c8f9bc Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 13 Jun 2023 13:05:47 +0200 Subject: [PATCH 328/339] Clippy --- parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs | 2 +- parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs | 2 +- parachains/runtimes/assets/asset-hub-westend/tests/tests.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs index f16487ebc7d..db2001aa49c 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs @@ -758,7 +758,7 @@ fn change_asset_hub_polkadot_max_fee_by_governance_works() { }, |old_value| match old_value { Some(MultiAsset { id, fun: Fungible(old_amount) }) => - Some(MultiAsset { id: id.clone(), fun: Fungible(old_amount * 2) }), + Some(MultiAsset { id: *id, fun: Fungible(old_amount * 2) }), Some(_) => None, None => Some(MultiAsset::from((Here, 123456))), }, diff --git a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs index 3b056aa51a4..d67091ec0c9 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs @@ -775,7 +775,7 @@ fn change_asset_hub_kusama_max_fee_by_governance_works() { || (bridging::AssetHubKusamaMaxFee::key().to_vec(), bridging::AssetHubKusamaMaxFee::get()), |old_value| match old_value { Some(MultiAsset { id, fun: Fungible(old_amount) }) => - Some(MultiAsset { id: id.clone(), fun: Fungible(old_amount * 2) }), + Some(MultiAsset { id: *id, fun: Fungible(old_amount * 2) }), Some(_) => None, None => Some(MultiAsset::from((Here, 123456))), }, diff --git a/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs b/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs index 068c5f92c91..6adf0514e4d 100644 --- a/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs +++ b/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs @@ -787,7 +787,7 @@ fn change_asset_hub_kusama_local_max_fee_by_governance_works() { }, |old_value| match old_value { Some(MultiAsset { id, fun: Fungible(old_amount) }) => - Some(MultiAsset { id: id.clone(), fun: Fungible(old_amount * 2) }), + Some(MultiAsset { id: *id, fun: Fungible(old_amount * 2) }), Some(_) => None, None => Some(MultiAsset::from((Here, 123456))), }, From 015ac5d14f0d81e43484197b228420012334d71e Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 13 Jun 2023 18:37:47 +0200 Subject: [PATCH 329/339] Co #14338: `pallet-glutton`: over-unity consumption (#2730) * Fix types Signed-off-by: Oliver Tale-Yazdi * fix import * ".git/.scripts/commands/fmt/fmt.sh" * Fix more Signed-off-by: Oliver Tale-Yazdi * Actually fix stuff Signed-off-by: Oliver Tale-Yazdi * update glutton genesis script * Update Substrate and Polkadot Signed-off-by: Oliver Tale-Yazdi --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: NachoPal Co-authored-by: command-bot <> --- Cargo.lock | 736 +++++++++--------- scripts/create_glutton_spec.sh | 10 +- test/service/benches/block_import_glutton.rs | 19 +- .../benches/block_production_glutton.rs | 24 +- .../service/benches/validate_block_glutton.rs | 24 +- test/service/src/bench_utils.rs | 13 +- 6 files changed, 431 insertions(+), 395 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 380b87f171c..5b3441bef14 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -865,7 +865,7 @@ dependencies = [ [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "hash-db", "log", @@ -2006,9 +2006,9 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "comfy-table" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121d8a5b0346092c18a4b2fd6f620d7a06f0eb7ac0a45860939a0884bc579c56" +checksum = "f9e1f7e5d046697d34b593bdba8ee31f4649366e452a2ccabb3baf3511e503d1" dependencies = [ "strum", "strum_macros", @@ -3957,19 +3957,6 @@ dependencies = [ "quote", ] -[[package]] -name = "expander" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f360349150728553f92e4c997a16af8915f418d3a0f21b440d34c5632f16ed84" -dependencies = [ - "blake2", - "fs-err", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "expander" version = "2.0.0" @@ -4151,7 +4138,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", ] @@ -4174,7 +4161,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-support-procedural", @@ -4199,7 +4186,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -4246,7 +4233,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4257,7 +4244,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -4274,7 +4261,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-system", @@ -4303,7 +4290,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-recursion", "futures", @@ -4324,7 +4311,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "bitflags", "environmental", @@ -4359,7 +4346,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "Inflector", "cfg-expr", @@ -4376,7 +4363,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -4388,7 +4375,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "proc-macro2", "quote", @@ -4398,7 +4385,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "cfg-if", "frame-support", @@ -4417,7 +4404,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -4432,7 +4419,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "sp-api", @@ -4441,7 +4428,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "parity-scale-codec", @@ -5061,10 +5048,25 @@ dependencies = [ "rustls 0.20.7", "rustls-native-certs", "tokio", - "tokio-rustls", + "tokio-rustls 0.23.2", "webpki-roots", ] +[[package]] +name = "hyper-rustls" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0646026eb1b3eea4cd9ba47912ea5ce9cc07713d105b1a14698f4e6433d348b7" +dependencies = [ + "http", + "hyper", + "log", + "rustls 0.21.1", + "rustls-native-certs", + "tokio", + "tokio-rustls 0.24.1", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -5397,7 +5399,7 @@ dependencies = [ "soketto", "thiserror", "tokio", - "tokio-rustls", + "tokio-rustls 0.23.2", "tokio-util", "tracing", "webpki-roots", @@ -5439,7 +5441,7 @@ checksum = "cc345b0a43c6bc49b947ebeb936e886a419ee3d894421790c969cc56040542ad" dependencies = [ "async-trait", "hyper", - "hyper-rustls", + "hyper-rustls 0.23.0", "jsonrpsee-core", "jsonrpsee-types", "rustc-hash", @@ -5532,8 +5534,8 @@ checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" [[package]] name = "kusama-runtime" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bitvec", "frame-benchmarking", @@ -5631,8 +5633,8 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "frame-support", "polkadot-primitives", @@ -6561,7 +6563,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "futures", "log", @@ -6580,7 +6582,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "anyhow", "jsonrpsee", @@ -7084,7 +7086,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "frame-benchmarking", @@ -7105,7 +7107,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7123,7 +7125,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7138,7 +7140,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-system", @@ -7154,7 +7156,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-system", @@ -7170,7 +7172,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-system", @@ -7184,7 +7186,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7208,7 +7210,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7228,7 +7230,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7243,7 +7245,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-system", @@ -7262,7 +7264,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "binary-merkle-tree", @@ -7286,7 +7288,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7392,7 +7394,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7436,7 +7438,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7453,7 +7455,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "bitflags", "environmental", @@ -7483,7 +7485,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "bitflags", "parity-scale-codec", @@ -7496,7 +7498,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "proc-macro2", "quote", @@ -7506,7 +7508,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "assert_matches", "frame-benchmarking", @@ -7523,7 +7525,7 @@ dependencies = [ [[package]] name = "pallet-core-fellowship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7541,7 +7543,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7559,7 +7561,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7582,7 +7584,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7595,7 +7597,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7613,7 +7615,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "docify", "frame-benchmarking", @@ -7632,7 +7634,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "blake2", "frame-benchmarking", @@ -7650,7 +7652,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7673,7 +7675,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7689,7 +7691,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7709,7 +7711,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7726,7 +7728,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-system", @@ -7740,7 +7742,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7757,7 +7759,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7776,7 +7778,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7793,7 +7795,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7809,7 +7811,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7826,7 +7828,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7844,7 +7846,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "pallet-nfts", @@ -7855,7 +7857,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7871,7 +7873,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-system", @@ -7888,7 +7890,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7908,7 +7910,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -7919,7 +7921,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-system", @@ -7936,7 +7938,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7975,7 +7977,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -7992,7 +7994,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8007,7 +8009,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8025,7 +8027,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8040,7 +8042,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "assert_matches", "frame-benchmarking", @@ -8059,7 +8061,7 @@ dependencies = [ [[package]] name = "pallet-salary" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8077,7 +8079,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8094,7 +8096,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-system", @@ -8115,7 +8117,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8131,7 +8133,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-system", @@ -8145,7 +8147,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8168,7 +8170,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8179,7 +8181,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "log", "sp-arithmetic", @@ -8188,7 +8190,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "sp-api", @@ -8197,7 +8199,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8214,7 +8216,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8229,7 +8231,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8247,7 +8249,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8266,7 +8268,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-support", "frame-system", @@ -8282,7 +8284,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -8298,7 +8300,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -8310,7 +8312,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8327,7 +8329,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8342,7 +8344,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8358,7 +8360,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8373,7 +8375,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-benchmarking", "frame-support", @@ -8387,8 +8389,8 @@ dependencies = [ [[package]] name = "pallet-xcm" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -8408,8 +8410,8 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9019,8 +9021,8 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "futures", "polkadot-node-jaeger", @@ -9035,8 +9037,8 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "futures", "polkadot-node-network-protocol", @@ -9049,8 +9051,8 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "derive_more", "fatality", @@ -9072,8 +9074,8 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "fatality", "futures", @@ -9093,8 +9095,8 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "clap", "frame-benchmarking-cli", @@ -9123,8 +9125,8 @@ dependencies = [ [[package]] name = "polkadot-client" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "async-trait", "frame-benchmarking", @@ -9166,8 +9168,8 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "always-assert", "bitvec", @@ -9188,8 +9190,8 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "parity-scale-codec", "scale-info", @@ -9200,8 +9202,8 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "derive_more", "fatality", @@ -9225,8 +9227,8 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -9239,8 +9241,8 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "futures", "futures-timer", @@ -9259,8 +9261,8 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "always-assert", "async-trait", @@ -9282,8 +9284,8 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "futures", "parity-scale-codec", @@ -9300,8 +9302,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bitvec", "derive_more", @@ -9329,8 +9331,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bitvec", "futures", @@ -9350,8 +9352,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bitvec", "fatality", @@ -9369,8 +9371,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "futures", "polkadot-node-subsystem", @@ -9384,8 +9386,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "async-trait", "futures", @@ -9404,8 +9406,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "futures", "polkadot-node-metrics", @@ -9419,8 +9421,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "futures", "futures-timer", @@ -9436,8 +9438,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "fatality", "futures", @@ -9455,8 +9457,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "async-trait", "futures", @@ -9472,8 +9474,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bitvec", "fatality", @@ -9490,8 +9492,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "always-assert", "futures", @@ -9521,8 +9523,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "futures", "polkadot-node-primitives", @@ -9537,8 +9539,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "cpu-time", "futures", @@ -9560,8 +9562,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-execute-worker" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "cpu-time", "futures", @@ -9580,8 +9582,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-prepare-worker" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "futures", "libc", @@ -9603,8 +9605,8 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "futures", "lru 0.9.0", @@ -9618,8 +9620,8 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "lazy_static", "log", @@ -9636,8 +9638,8 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bs58", "futures", @@ -9655,8 +9657,8 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "async-channel", "async-trait", @@ -9678,8 +9680,8 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bounded-vec", "futures", @@ -9700,8 +9702,8 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -9710,8 +9712,8 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "async-trait", "futures", @@ -9728,8 +9730,8 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "async-trait", "derive_more", @@ -9751,8 +9753,8 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "async-trait", "derive_more", @@ -9784,8 +9786,8 @@ dependencies = [ [[package]] name = "polkadot-overseer" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "async-trait", "futures", @@ -9807,8 +9809,8 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bounded-collections", "derive_more", @@ -9906,8 +9908,8 @@ dependencies = [ [[package]] name = "polkadot-performance-test" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "env_logger 0.9.0", "kusama-runtime", @@ -9924,8 +9926,8 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bitvec", "hex-literal 0.4.1", @@ -9950,8 +9952,8 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -9982,8 +9984,8 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bitvec", "frame-benchmarking", @@ -10077,8 +10079,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bitvec", "frame-benchmarking", @@ -10123,8 +10125,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "frame-support", "polkadot-primitives", @@ -10137,8 +10139,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bs58", "parity-scale-codec", @@ -10149,8 +10151,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bitflags", "bitvec", @@ -10194,8 +10196,8 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "async-trait", "frame-benchmarking-cli", @@ -10304,8 +10306,8 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -10325,8 +10327,8 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -10335,8 +10337,8 @@ dependencies = [ [[package]] name = "polkadot-test-client" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", @@ -10360,8 +10362,8 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bitvec", "frame-election-provider-support", @@ -10421,8 +10423,8 @@ dependencies = [ [[package]] name = "polkadot-test-service" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "frame-benchmarking", "frame-system", @@ -11201,8 +11203,8 @@ dependencies = [ [[package]] name = "rococo-runtime" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "binary-merkle-tree", "frame-benchmarking", @@ -11288,8 +11290,8 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "frame-support", "polkadot-primitives", @@ -11462,6 +11464,18 @@ dependencies = [ "webpki 0.22.0", ] +[[package]] +name = "rustls" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c911ba11bc8433e811ce56fde130ccf32f5127cab0e0194e9c68c5a5b671791e" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct 0.7.0", +] + [[package]] name = "rustls-native-certs" version = "0.6.1" @@ -11483,6 +11497,16 @@ dependencies = [ "base64 0.13.0", ] +[[package]] +name = "rustls-webpki" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.12" @@ -11536,7 +11560,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "log", "sp-core", @@ -11547,7 +11571,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "futures", @@ -11576,7 +11600,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "futures", "futures-timer", @@ -11599,7 +11623,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -11614,7 +11638,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -11633,7 +11657,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11644,7 +11668,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -11684,7 +11708,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "fnv", "futures", @@ -11711,7 +11735,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "hash-db", "kvdb", @@ -11737,7 +11761,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "futures", @@ -11762,7 +11786,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "futures", @@ -11791,7 +11815,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "fork-tree", @@ -11827,7 +11851,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "futures", "jsonrpsee", @@ -11849,7 +11873,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -11885,7 +11909,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "futures", "jsonrpsee", @@ -11904,7 +11928,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "fork-tree", "parity-scale-codec", @@ -11917,7 +11941,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "ahash 0.8.2", "array-bytes 4.2.0", @@ -11957,7 +11981,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "finality-grandpa", "futures", @@ -11977,7 +12001,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "futures", @@ -12000,7 +12024,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "lru 0.10.0", "parity-scale-codec", @@ -12022,7 +12046,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -12034,7 +12058,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "anyhow", "cfg-if", @@ -12052,7 +12076,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "ansi_term", "futures", @@ -12068,7 +12092,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "parking_lot 0.12.1", @@ -12082,7 +12106,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12128,7 +12152,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-channel", "cid", @@ -12149,7 +12173,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -12176,7 +12200,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "ahash 0.8.2", "futures", @@ -12194,7 +12218,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12216,7 +12240,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "async-channel", @@ -12250,7 +12274,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12268,7 +12292,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -12276,7 +12300,7 @@ dependencies = [ "futures", "futures-timer", "hyper", - "hyper-rustls", + "hyper-rustls 0.24.0", "libp2p", "num_cpus", "once_cell", @@ -12298,7 +12322,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -12307,7 +12331,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "futures", "jsonrpsee", @@ -12338,7 +12362,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12357,7 +12381,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "http", "jsonrpsee", @@ -12372,7 +12396,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "futures", @@ -12398,7 +12422,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "directories", @@ -12464,7 +12488,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "log", "parity-scale-codec", @@ -12475,7 +12499,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "clap", "fs4", @@ -12491,7 +12515,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -12510,7 +12534,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "futures", "libc", @@ -12529,7 +12553,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "chrono", "futures", @@ -12548,7 +12572,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "ansi_term", "atty", @@ -12579,7 +12603,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -12590,7 +12614,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "futures", @@ -12616,7 +12640,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "futures", @@ -12632,7 +12656,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-channel", "futures", @@ -13112,8 +13136,8 @@ checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" [[package]] name = "slot-range-helper" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "enumn", "parity-scale-codec", @@ -13190,7 +13214,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "hash-db", "log", @@ -13210,11 +13234,11 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "Inflector", "blake2", - "expander 1.0.0", + "expander 2.0.0", "proc-macro-crate", "proc-macro2", "quote", @@ -13224,7 +13248,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "scale-info", @@ -13237,7 +13261,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "16.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "integer-sqrt", "num-traits", @@ -13251,7 +13275,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "scale-info", @@ -13264,7 +13288,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "sp-api", @@ -13276,7 +13300,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "futures", "log", @@ -13294,7 +13318,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "futures", @@ -13309,7 +13333,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "parity-scale-codec", @@ -13327,7 +13351,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "parity-scale-codec", @@ -13348,7 +13372,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "lazy_static", "parity-scale-codec", @@ -13367,7 +13391,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "finality-grandpa", "log", @@ -13385,7 +13409,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "scale-info", @@ -13397,7 +13421,7 @@ dependencies = [ [[package]] name = "sp-core" version = "21.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "bitflags", @@ -13441,7 +13465,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "blake2b_simd", "byteorder", @@ -13455,7 +13479,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "proc-macro2", "quote", @@ -13466,7 +13490,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -13475,7 +13499,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "proc-macro2", "quote", @@ -13485,7 +13509,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.19.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "environmental", "parity-scale-codec", @@ -13496,7 +13520,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -13511,7 +13535,7 @@ dependencies = [ [[package]] name = "sp-io" version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "bytes", "ed25519", @@ -13537,7 +13561,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "lazy_static", "sp-core", @@ -13548,7 +13572,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.27.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "futures", "parity-scale-codec", @@ -13562,7 +13586,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "thiserror", "zstd 0.12.3+zstd.1.5.2", @@ -13571,7 +13595,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -13582,7 +13606,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -13600,7 +13624,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "scale-info", @@ -13614,7 +13638,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "sp-api", "sp-core", @@ -13624,7 +13648,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "backtrace", "lazy_static", @@ -13634,7 +13658,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "rustc-hash", "serde", @@ -13644,7 +13668,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "either", "hash256-std-hasher", @@ -13666,7 +13690,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "17.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -13684,7 +13708,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "11.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "Inflector", "proc-macro-crate", @@ -13696,7 +13720,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "scale-info", @@ -13710,7 +13734,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "scale-info", @@ -13723,7 +13747,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.28.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "hash-db", "log", @@ -13743,7 +13767,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "log", "parity-scale-codec", @@ -13761,12 +13785,12 @@ dependencies = [ [[package]] name = "sp-std" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" [[package]] name = "sp-storage" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13779,7 +13803,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "futures-timer", @@ -13794,7 +13818,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "10.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "sp-std", @@ -13806,7 +13830,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "sp-api", "sp-runtime", @@ -13815,7 +13839,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "log", @@ -13831,7 +13855,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "ahash 0.8.2", "hash-db", @@ -13854,7 +13878,7 @@ dependencies = [ [[package]] name = "sp-version" version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "impl-serde", "parity-scale-codec", @@ -13871,7 +13895,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -13882,7 +13906,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "14.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -13895,7 +13919,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "20.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "parity-scale-codec", "scale-info", @@ -14093,7 +14117,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "platforms", ] @@ -14101,7 +14125,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -14120,7 +14144,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "hyper", "log", @@ -14132,7 +14156,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "jsonrpsee", @@ -14145,7 +14169,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "jsonrpsee", "log", @@ -14164,7 +14188,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -14190,7 +14214,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "futures", "substrate-test-utils-derive", @@ -14200,7 +14224,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -14211,7 +14235,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "ansi_term", "build-helper", @@ -14339,8 +14363,8 @@ checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" [[package]] name = "test-runtime-constants" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "frame-support", "polkadot-primitives", @@ -14573,6 +14597,16 @@ dependencies = [ "webpki 0.22.0", ] +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.1", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.9" @@ -14730,8 +14764,8 @@ dependencies = [ [[package]] name = "tracing-gum" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "polkadot-node-jaeger", "polkadot-primitives", @@ -14741,8 +14775,8 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -14872,7 +14906,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#b72c475803947121b3b475eb33ba5fc48f1fe5b6" +source = "git+https://github.com/paritytech/substrate?branch=master#e976964644d951a1eefaaa85f1d7c7d58211ddf7" dependencies = [ "async-trait", "clap", @@ -15786,8 +15820,8 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bitvec", "frame-benchmarking", @@ -15879,8 +15913,8 @@ dependencies = [ [[package]] name = "westend-runtime-constants" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "frame-support", "polkadot-primitives", @@ -16313,8 +16347,8 @@ dependencies = [ [[package]] name = "xcm" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "bounded-collections", "derivative", @@ -16329,8 +16363,8 @@ dependencies = [ [[package]] name = "xcm-builder" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "frame-support", "frame-system", @@ -16384,8 +16418,8 @@ dependencies = [ [[package]] name = "xcm-executor" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "environmental", "frame-benchmarking", @@ -16404,8 +16438,8 @@ dependencies = [ [[package]] name = "xcm-procedural" -version = "0.9.41" -source = "git+https://github.com/paritytech/polkadot?branch=master#04f801427ded6363d96dc75eacec530bfecc31e9" +version = "0.9.43" +source = "git+https://github.com/paritytech/polkadot?branch=master#b6b74fdf546c14bf9ac93c03916abda9ee33a52f" dependencies = [ "Inflector", "proc-macro2", diff --git a/scripts/create_glutton_spec.sh b/scripts/create_glutton_spec.sh index 571a84b57a0..c5158392f52 100755 --- a/scripts/create_glutton_spec.sh +++ b/scripts/create_glutton_spec.sh @@ -5,11 +5,11 @@ # - Use the `polkadot-parachain` binary; # - Use `rococo` as the parent Relay Chain; # - Generate `ParaId`s from 1,300 to 1,370, inclusive; -# - Set the Sudo key to `G7Z5mTmTQsjEGBVqVGDZyR9m7RoHNZJk6JeykyfKQ3vmBiR`; -# - Set `compute`, `storage`, and `trash_data_count` set to 50%, 50%, and 5,120, respectively; +# - Set the Sudo key to `GZ9YSgtib4kEMxWcpWfnXa1cnrumspTCTZSaNWWmMkJbWqW`; +# - Set `compute`, `storage`, and `trash_data_count` set to 50%, 131%, and 5,120, respectively; # - And save the results in `output-dir`. # -# ./scripts/create_glutton_spec.sh ./target/release/polkadot-parachain rococo 1300 1370 G7Z5mTmTQsjEGBVqVGDZyR9m7RoHNZJk6JeykyfKQ3vmBiR 500000000 500000000 5120 output-dir +# ./scripts/create_glutton_spec.sh ./target/release/polkadot-parachain rococo 1300 1370 GZ9YSgtib4kEMxWcpWfnXa1cnrumspTCTZSaNWWmMkJbWqW 500000000 1310000000 5120 output-dir usage() { echo Usage: @@ -68,8 +68,8 @@ for (( para_id=$from_para_id; para_id<=$to_para_id; para_id++ )); do | jq --argjson para_id $para_id '.para_id = $para_id' \ | jq --arg sudo $sudo '.genesis.runtime.sudo.key = $sudo' \ | jq --argjson para_id $para_id '.genesis.runtime.parachainInfo.parachainId = $para_id' \ - | jq --argjson compute $compute '.genesis.runtime.glutton.compute = $compute' \ - | jq --argjson storage $storage '.genesis.runtime.glutton.storage = $storage' \ + | jq --arg compute $compute '.genesis.runtime.glutton.compute = $compute' \ + | jq --arg storage $storage '.genesis.runtime.glutton.storage = $storage' \ | jq --argjson trash_data_count $trash_data_count '.genesis.runtime.glutton.trashDataCount = $trash_data_count' \ > $output_para_dir/glutton-$relay_chain-$para_id-spec.json diff --git a/test/service/benches/block_import_glutton.rs b/test/service/benches/block_import_glutton.rs index 48fc3dee76d..b49db9f449e 100644 --- a/test/service/benches/block_import_glutton.rs +++ b/test/service/benches/block_import_glutton.rs @@ -19,7 +19,10 @@ use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; use sc_client_api::UsageProvider; use sp_api::{Core, ProvideRuntimeApi}; -use sp_arithmetic::Perbill; +use sp_arithmetic::{ + traits::{One, Zero}, + FixedPointNumber, +}; use core::time::Duration; use cumulus_primitives_core::ParaId; @@ -46,15 +49,12 @@ fn benchmark_block_import(c: &mut Criterion) { group.measurement_time(Duration::from_secs(120)); let mut initialize_glutton_pallet = true; - for (compute_percent, storage_percent) in &[ - (Perbill::from_percent(100), Perbill::from_percent(0)), - (Perbill::from_percent(100), Perbill::from_percent(100)), - ] { + for (compute_ratio, storage_ratio) in &[(One::one(), Zero::zero()), (One::one(), One::one())] { let block = utils::set_glutton_parameters( &client, initialize_glutton_pallet, - compute_percent, - storage_percent, + compute_ratio, + storage_ratio, ); initialize_glutton_pallet = false; @@ -73,8 +73,9 @@ fn benchmark_block_import(c: &mut Criterion) { group.bench_function( format!( - "(compute = {:?}, storage = {:?}) block import", - compute_percent, storage_percent + "(compute = {:?} %, storage = {:?} %) block import", + compute_ratio.saturating_mul_int(100), + storage_ratio.saturating_mul_int(100) ), |b| { b.iter_batched( diff --git a/test/service/benches/block_production_glutton.rs b/test/service/benches/block_production_glutton.rs index aa05b4e4612..92a368c88c8 100644 --- a/test/service/benches/block_production_glutton.rs +++ b/test/service/benches/block_production_glutton.rs @@ -18,7 +18,10 @@ use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; use sc_client_api::UsageProvider; -use sp_arithmetic::Perbill; +use sp_arithmetic::{ + traits::{One, Zero}, + FixedPointNumber, +}; use core::time::Duration; use cumulus_primitives_core::ParaId; @@ -47,15 +50,12 @@ fn benchmark_block_production_compute(c: &mut Criterion) { group.measurement_time(Duration::from_secs(120)); let mut initialize_glutton_pallet = true; - for (compute_level, storage_level) in &[ - (Perbill::from_percent(100), Perbill::from_percent(0)), - (Perbill::from_percent(100), Perbill::from_percent(100)), - ] { + for (compute_ratio, storage_ratio) in &[(One::one(), Zero::zero()), (One::one(), One::one())] { let block = utils::set_glutton_parameters( &client, initialize_glutton_pallet, - compute_level, - storage_level, + compute_ratio, + storage_ratio, ); runtime.block_on(utils::import_block(&client, &block, false)); initialize_glutton_pallet = false; @@ -68,8 +68,9 @@ fn benchmark_block_production_compute(c: &mut Criterion) { group.bench_function( format!( - "(compute = {:?}, storage = {:?}, proof = true) block production", - compute_level, storage_level + "(compute = {:?} %, storage = {:?} %) block import", + compute_ratio.saturating_mul_int(100), + storage_ratio.saturating_mul_int(100) ), |b| { b.iter_batched( @@ -89,8 +90,9 @@ fn benchmark_block_production_compute(c: &mut Criterion) { group.bench_function( format!( - "(compute = {:?}, storage = {:?}, proof = false) block production", - compute_level, storage_level + "(compute = {:?} %, storage = {:?} %) block import", + compute_ratio.saturating_mul_int(100), + storage_ratio.saturating_mul_int(100) ), |b| { b.iter_batched( diff --git a/test/service/benches/validate_block_glutton.rs b/test/service/benches/validate_block_glutton.rs index ceeff736abe..5f5fda07168 100644 --- a/test/service/benches/validate_block_glutton.rs +++ b/test/service/benches/validate_block_glutton.rs @@ -32,7 +32,10 @@ use sc_executor_common::wasm_runtime::WasmModule; use sp_api::ProvideRuntimeApi; use frame_system_rpc_runtime_api::AccountNonceApi; -use sp_arithmetic::Perbill; +use sp_arithmetic::{ + traits::{One, Zero}, + FixedU64, +}; use sp_consensus::BlockOrigin; use sp_keyring::Sr25519Keyring::Alice; use sp_runtime::traits::Header as HeaderT; @@ -69,14 +72,11 @@ fn benchmark_block_validation(c: &mut Criterion) { group.sample_size(20); group.measurement_time(Duration::from_secs(120)); - // In the first iteration we want to initialie the glutton pallet + // In the first iteration we want to initialize the glutton pallet. let mut is_first = true; - for (compute_percent, storage_percent) in &[ - (Perbill::from_percent(100), Perbill::from_percent(0)), - (Perbill::from_percent(100), Perbill::from_percent(100)), - ] { + for (compute_ratio, storage_ratio) in &[(One::one(), Zero::zero()), (One::one(), One::one())] { let parachain_block = - set_glutton_parameters(&client, is_first, compute_percent, storage_percent); + set_glutton_parameters(&client, is_first, compute_ratio, storage_ratio); is_first = false; runtime.block_on(import_block(&client, parachain_block.clone().into_block(), false)); @@ -114,7 +114,7 @@ fn benchmark_block_validation(c: &mut Criterion) { group.bench_function( format!( "(compute = {:?}, storage = {:?}, proof_size = {}kb) block validation", - compute_percent, storage_percent, proof_size_in_kb + compute_ratio, storage_ratio, proof_size_in_kb ), |b| { b.iter_batched( @@ -145,8 +145,8 @@ fn verify_expected_result(runtime: &Box, encoded_params: &[u8], fn set_glutton_parameters( client: &Client, initialize: bool, - compute_percent: &Perbill, - storage_percent: &Perbill, + compute_ratio: &FixedU64, + storage_ratio: &FixedU64, ) -> ParachainBlockData { let parent_hash = client.usage_info().chain.best_hash; let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); @@ -181,7 +181,7 @@ fn set_glutton_parameters( client, Alice.into(), SudoCall::sudo { - call: Box::new(GluttonCall::set_compute { compute: *compute_percent }.into()), + call: Box::new(GluttonCall::set_compute { compute: *compute_ratio }.into()), }, Some(last_nonce), ); @@ -192,7 +192,7 @@ fn set_glutton_parameters( client, Alice.into(), SudoCall::sudo { - call: Box::new(GluttonCall::set_storage { storage: *storage_percent }.into()), + call: Box::new(GluttonCall::set_storage { storage: *storage_ratio }.into()), }, Some(last_nonce), ); diff --git a/test/service/src/bench_utils.rs b/test/service/src/bench_utils.rs index 3794f74d040..172c9e50419 100644 --- a/test/service/src/bench_utils.rs +++ b/test/service/src/bench_utils.rs @@ -35,14 +35,13 @@ use sc_consensus::{ use sc_executor::DEFAULT_HEAP_ALLOC_STRATEGY; use sc_executor_common::runtime_blob::RuntimeBlob; use sp_api::ProvideRuntimeApi; -use sp_arithmetic::Perbill; use sp_blockchain::{ApplyExtrinsicFailed::Validity, Error::ApplyExtrinsicFailed}; use sp_consensus::BlockOrigin; use sp_core::{sr25519, Pair}; use sp_keyring::Sr25519Keyring::Alice; use sp_runtime::{ transaction_validity::{InvalidTransaction, TransactionValidityError}, - AccountId32, OpaqueExtrinsic, + AccountId32, FixedU64, OpaqueExtrinsic, }; /// Accounts to use for transfer transactions. Enough for 5000 transactions. @@ -127,7 +126,7 @@ pub fn create_benchmarking_transfer_extrinsics( src_accounts: &[sr25519::Pair], dst_accounts: &[sr25519::Pair], ) -> (usize, Vec) { - // Add as many tranfer extrinsics as possible into a single block. + // Add as many transfer extrinsics as possible into a single block. let mut block_builder = client.new_block(Default::default()).unwrap(); let mut max_transfer_count = 0; let mut extrinsics = Vec::new(); @@ -200,8 +199,8 @@ pub fn get_wasm_module() -> Box NodeBlock { let parent_hash = client.usage_info().chain.best_hash; let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); @@ -231,7 +230,7 @@ pub fn set_glutton_parameters( let set_compute = construct_extrinsic( client, SudoCall::sudo { - call: Box::new(GluttonCall::set_compute { compute: *compute_percent }.into()), + call: Box::new(GluttonCall::set_compute { compute: *compute_ratio }.into()), }, Alice.into(), Some(last_nonce), @@ -243,7 +242,7 @@ pub fn set_glutton_parameters( let set_storage = construct_extrinsic( client, SudoCall::sudo { - call: Box::new(GluttonCall::set_storage { storage: *storage_percent }.into()), + call: Box::new(GluttonCall::set_storage { storage: *storage_ratio }.into()), }, Alice.into(), Some(last_nonce), From 6f1fca89faaaadde78489638d26504422e221dcd Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 14 Jun 2023 11:04:09 +0200 Subject: [PATCH 330/339] Benchmarks --- parachains/pallets/bridge-transfer/src/lib.rs | 2 +- .../src/weights/pallet_bridge_transfer.rs | 44 ++++++++---------- .../assets/asset-hub-kusama/src/xcm_config.rs | 37 +++------------ .../src/weights/pallet_bridge_transfer.rs | 46 ++++++++----------- .../asset-hub-polkadot/src/xcm_config.rs | 37 +++------------ .../src/weights/pallet_bridge_transfer.rs | 44 ++++++++---------- .../asset-hub-westend/src/xcm_config.rs | 37 +++------------ 7 files changed, 81 insertions(+), 166 deletions(-) diff --git a/parachains/pallets/bridge-transfer/src/lib.rs b/parachains/pallets/bridge-transfer/src/lib.rs index 4e51e4030b3..12a91faa44b 100644 --- a/parachains/pallets/bridge-transfer/src/lib.rs +++ b/parachains/pallets/bridge-transfer/src/lib.rs @@ -68,7 +68,7 @@ pub mod pallet { /// to transfer. After this function is called, we expect `transfer_asset_via_bridge` /// to succeed, so in proper environment, it should: /// - /// - deposit enough funds (fee from `bridge_config()` and transferred assets) to the sender account; + /// - deposit enough funds (fee from `desired_bridged_location()` and transferred assets) to the sender account; /// /// - ensure that the `BridgeXcmSender` is properly configured for the transfer; /// diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs index d27178d262e..c2b2a0ac962 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs @@ -17,26 +17,26 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-14, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bkontur-ThinkPad-P14s-Gen-2i`, CPU: `11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 +// --steps=2 +// --repeat=2 // --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json -// --pallet=pallet_bridge_transfer -// --chain=asset-hub-kusama-dev +// --json-file=./bench.json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ +// --chain=asset-hub-kusama-dev +// --pallet=pallet_bridge_transfer +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -51,17 +51,11 @@ pub struct WeightInfo(PhantomData); impl pallet_bridge_transfer::WeightInfo for WeightInfo { /// Storage: ParachainInfo ParachainId (r:1 w:0) /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + /// Storage: unknown `0x1fd0e9ea288ed87ef4c94f1a9a004f86` (r:1 w:0) + /// Proof Skipped: unknown `0x1fd0e9ea288ed87ef4c94f1a9a004f86` (r:1 w:0) /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) - /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:0) - /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) + /// Storage: System Account (r:2 w:2) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) @@ -77,12 +71,12 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn transfer_asset_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `757` - // Estimated: `626195` - // Minimum execution time: 174_364_000 picoseconds. - Weight::from_parts(258_590_000, 0) - .saturating_add(Weight::from_parts(0, 626195)) - .saturating_add(T::DbWeight::get().reads(13)) - .saturating_add(T::DbWeight::get().writes(8)) + // Measured: `595` + // Estimated: `6196` + // Minimum execution time: 122_909_000 picoseconds. + Weight::from_parts(153_796_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(10)) + .saturating_add(T::DbWeight::get().writes(6)) } } diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs index 9ba616f8748..016e08d9deb 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs @@ -662,41 +662,18 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe LocationToAccountId::convert_location(&assumed_reserve_account) .expect("Correct AccountId"); - // deposit enough funds to the sender account + // deposit enough (ED) funds to the sender and reserve account let existential_deposit = crate::ExistentialDeposit::get(); let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); let _ = Balances::deposit_creating(&assumed_reserve_account, existential_deposit * 10); - // We need root origin to create asset - let minimum_asset_balance = 3333333_u128; - let local_asset_id = 1; - frame_support::assert_ok!(Assets::force_create( - RuntimeOrigin::root(), - local_asset_id.into(), - sender_account.clone().into(), - true, - minimum_asset_balance - )); - - // We mint enough asset for the account to exist for assets - frame_support::assert_ok!(Assets::mint( - RuntimeOrigin::signed(sender_account.clone()), - local_asset_id.into(), - sender_account.clone().into(), - minimum_asset_balance * 4 - )); - - // finally - prepare assets and destination (pallet_assets is worse than pallet_balances) - use sp_runtime::traits::MaybeEquivalence; - let asset_id_location = assets_common::AssetIdForTrustBackedAssetsConvert::< - TrustBackedAssetsPalletLocation, - >::convert_back(&local_asset_id) - .unwrap(); - let asset: MultiAsset = (Concrete(asset_id_location), minimum_asset_balance * 2).into(); - - let assets = xcm::VersionedMultiAssets::V3(asset.into()); + // finally - prepare assets + // lets consider our worst case scenario - reserve based transfer with relay chain tokens + let asset: MultiAsset = (Concrete(KsmLocation::get()), existential_deposit * 2).into(); + + let assets = xcm::VersionedMultiAssets::from(MultiAssets::from(asset)); let destination = - xcm::VersionedMultiLocation::V3(desired_bridged_location.target_destination); + xcm::VersionedMultiLocation::from(desired_bridged_location.target_destination); Some((RuntimeOrigin::signed(sender_account), assets, destination)) } diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs index d27178d262e..48834a41f1f 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs @@ -17,26 +17,26 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-14, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 +//! HOSTNAME: `bkontur-ThinkPad-P14s-Gen-2i`, CPU: `11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 +// --steps=2 +// --repeat=2 // --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json -// --pallet=pallet_bridge_transfer -// --chain=asset-hub-kusama-dev +// --json-file=./bench.json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ +// --chain=asset-hub-polkadot-dev +// --pallet=pallet_bridge_transfer +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -51,17 +51,11 @@ pub struct WeightInfo(PhantomData); impl pallet_bridge_transfer::WeightInfo for WeightInfo { /// Storage: ParachainInfo ParachainId (r:1 w:0) /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(622730), added: 625205, mode: MaxEncodedLen) + /// Storage: unknown `0x732f1cab5e78eadace5c4f5d259acee9` (r:1 w:0) + /// Proof Skipped: unknown `0x732f1cab5e78eadace5c4f5d259acee9` (r:1 w:0) /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) - /// Storage: BridgeTransfer AllowedReserveLocations (r:1 w:0) - /// Proof: BridgeTransfer AllowedReserveLocations (max_values: None, max_size: Some(154735), added: 157210, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) + /// Storage: System Account (r:2 w:2) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) @@ -77,12 +71,12 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn transfer_asset_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `757` - // Estimated: `626195` - // Minimum execution time: 174_364_000 picoseconds. - Weight::from_parts(258_590_000, 0) - .saturating_add(Weight::from_parts(0, 626195)) - .saturating_add(T::DbWeight::get().reads(13)) - .saturating_add(T::DbWeight::get().writes(8)) + // Measured: `520` + // Estimated: `6196` + // Minimum execution time: 125_083_000 picoseconds. + Weight::from_parts(143_807_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(10)) + .saturating_add(T::DbWeight::get().writes(6)) } } diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs index 06f28a53187..11d7012e1f9 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs @@ -688,41 +688,18 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe LocationToAccountId::convert_location(&assumed_reserve_account) .expect("Correct AccountId"); - // deposit enough funds to the sender account + // deposit enough (ED) funds to the sender and reserve account let existential_deposit = crate::ExistentialDeposit::get(); let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); let _ = Balances::deposit_creating(&assumed_reserve_account, existential_deposit * 10); - // We need root origin to create asset - let minimum_asset_balance = 3333333_u128; - let local_asset_id = 1; - frame_support::assert_ok!(Assets::force_create( - RuntimeOrigin::root(), - local_asset_id.into(), - sender_account.clone().into(), - true, - minimum_asset_balance - )); - - // We mint enough asset for the account to exist for assets - frame_support::assert_ok!(Assets::mint( - RuntimeOrigin::signed(sender_account.clone()), - local_asset_id.into(), - sender_account.clone().into(), - minimum_asset_balance * 4 - )); - - // finally - prepare assets and destination (pallet_assets is worse than pallet_balances) - use sp_runtime::traits::MaybeEquivalence; - let asset_id_location = assets_common::AssetIdForTrustBackedAssetsConvert::< - TrustBackedAssetsPalletLocation, - >::convert_back(&local_asset_id) - .unwrap(); - let asset: MultiAsset = (Concrete(asset_id_location), minimum_asset_balance * 2).into(); - - let assets = xcm::VersionedMultiAssets::V3(asset.into()); + // finally - prepare assets + // lets consider our worst case scenario - reserve based transfer with relay chain tokens + let asset: MultiAsset = (Concrete(DotLocation::get()), existential_deposit * 2).into(); + + let assets = xcm::VersionedMultiAssets::from(MultiAssets::from(asset)); let destination = - xcm::VersionedMultiLocation::V3(desired_bridged_location.target_destination); + xcm::VersionedMultiLocation::from(desired_bridged_location.target_destination); Some((RuntimeOrigin::signed(sender_account), assets, destination)) } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs index 935bbc3064b..a177c28d783 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs @@ -17,26 +17,26 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-14, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 +//! HOSTNAME: `bkontur-ThinkPad-P14s-Gen-2i`, CPU: `11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 +// --steps=2 +// --repeat=2 // --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json -// --pallet=pallet_bridge_transfer -// --chain=westmint-dev +// --json-file=./bench.json // --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/ +// --chain=asset-hub-westend-dev +// --pallet=pallet_bridge_transfer +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -51,15 +51,11 @@ pub struct WeightInfo(PhantomData); impl pallet_bridge_transfer::WeightInfo for WeightInfo { /// Storage: ParachainInfo ParachainId (r:1 w:0) /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeTransfer AllowedExporters (r:1 w:0) - /// Proof: BridgeTransfer AllowedExporters (max_values: None, max_size: Some(2537), added: 5012, mode: MaxEncodedLen) + /// Storage: unknown `0x36e13a2aa5713f59bab8576f408dc957` (r:1 w:0) + /// Proof Skipped: unknown `0x36e13a2aa5713f59bab8576f408dc957` (r:1 w:0) /// Storage: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) /// Proof Skipped: unknown `0x3a696e747261626c6f636b5f656e74726f7079` (r:1 w:1) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) + /// Storage: System Account (r:2 w:2) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) @@ -75,12 +71,12 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) fn transfer_asset_via_bridge() -> Weight { // Proof Size summary in bytes: - // Measured: `732` - // Estimated: `6208` - // Minimum execution time: 151_961_000 picoseconds. - Weight::from_parts(153_658_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(12)) - .saturating_add(T::DbWeight::get().writes(8)) + // Measured: `554` + // Estimated: `6196` + // Minimum execution time: 137_104_000 picoseconds. + Weight::from_parts(156_534_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(10)) + .saturating_add(T::DbWeight::get().writes(6)) } } diff --git a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index ae4857eaced..bb6515c1ff6 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -657,41 +657,18 @@ impl pallet_bridge_transfer::BenchmarkHelper for BridgeTransferBe LocationToAccountId::convert_location(&assumed_reserve_account) .expect("Correct AccountId"); - // deposit enough funds to the sender account + // deposit enough (ED) funds to the sender and reserve account let existential_deposit = crate::ExistentialDeposit::get(); let _ = Balances::deposit_creating(&sender_account, existential_deposit * 10); let _ = Balances::deposit_creating(&assumed_reserve_account, existential_deposit * 10); - // We need root origin to create asset - let minimum_asset_balance = 3333333_u128; - let local_asset_id = 1; - frame_support::assert_ok!(Assets::force_create( - RuntimeOrigin::root(), - local_asset_id.into(), - sender_account.clone().into(), - true, - minimum_asset_balance - )); - - // We mint enough asset for the account to exist for assets - frame_support::assert_ok!(Assets::mint( - RuntimeOrigin::signed(sender_account.clone()), - local_asset_id.into(), - sender_account.clone().into(), - minimum_asset_balance * 4 - )); - - // finally - prepare assets and destination (pallet_assets is worse than pallet_balances) - use sp_runtime::traits::MaybeEquivalence; - let asset_id_location = assets_common::AssetIdForTrustBackedAssetsConvert::< - TrustBackedAssetsPalletLocation, - >::convert_back(&local_asset_id) - .unwrap(); - let asset: MultiAsset = (Concrete(asset_id_location), minimum_asset_balance * 2).into(); - - let assets = xcm::VersionedMultiAssets::V3(asset.into()); + // finally - prepare assets + // lets consider our worst case scenario - reserve based transfer with relay chain tokens + let asset: MultiAsset = (Concrete(WestendLocation::get()), existential_deposit * 2).into(); + + let assets = xcm::VersionedMultiAssets::from(MultiAssets::from(asset)); let destination = - xcm::VersionedMultiLocation::V3(desired_bridged_location.target_destination); + xcm::VersionedMultiLocation::from(desired_bridged_location.target_destination); Some((RuntimeOrigin::signed(sender_account), assets, destination)) } From 7460f08f75de685467acc7898203ca565c7141e4 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 14 Jun 2023 12:52:42 +0200 Subject: [PATCH 331/339] Fix try-runtime --- parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml index 15e25ca060d..9975bfc331a 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml +++ b/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml @@ -135,6 +135,7 @@ try-runtime = [ "pallet-utility/try-runtime", "pallet-xcm/try-runtime", "parachain-info/try-runtime", + "pallet-bridge-transfer/try-runtime", ] std = [ "codec/std", From a2c10cfb4dae16904b320ae25f1aaa681efb54f2 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 14 Jun 2023 13:53:29 +0200 Subject: [PATCH 332/339] Add TransactionPaymentCallApi to Bridge Hubs (#2729) --- .../bridge-hubs/bridge-hub-kusama/src/lib.rs | 23 +++++++++++++++++++ .../bridge-hub-polkadot/src/lib.rs | 23 +++++++++++++++++++ .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 23 +++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs index 8df48a73aae..0493156be6f 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -574,6 +574,29 @@ impl_runtime_apis! { } } + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi + for Runtime + { + fn query_call_info( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::RuntimeDispatchInfo { + TransactionPayment::query_call_info(call, len) + } + fn query_call_fee_details( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_call_fee_details(call, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs index 0b63986c11e..aab18b4c67f 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -574,6 +574,29 @@ impl_runtime_apis! { } } + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi + for Runtime + { + fn query_call_info( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::RuntimeDispatchInfo { + TransactionPayment::query_call_info(call, len) + } + fn query_call_fee_details( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_call_fee_details(call, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 7597d98316a..ca8e1434bba 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -755,6 +755,29 @@ impl_runtime_apis! { } } + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi + for Runtime + { + fn query_call_info( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::RuntimeDispatchInfo { + TransactionPayment::query_call_info(call, len) + } + fn query_call_fee_details( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_call_fee_details(call, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) From 27c048d71d784ab983b9d189dbe23d52c637fa5d Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Wed, 14 Jun 2023 12:07:45 +0000 Subject: [PATCH 333/339] ".git/.scripts/commands/bench/bench.sh" xcm asset-hub-kusama assets pallet_xcm_benchmarks::generic --- .../xcm/pallet_xcm_benchmarks_generic.rs | 130 +++++++++--------- 1 file changed, 64 insertions(+), 66 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 24b554e534c..329e3da1679 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 @@ -67,8 +67,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 341_710_000 picoseconds. - Weight::from_parts(347_830_000, 3540) + // Minimum execution time: 347_943_000 picoseconds. + Weight::from_parts(348_788_000, 3540) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -76,8 +76,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_772_000 picoseconds. - Weight::from_parts(3_888_000, 0) + // Minimum execution time: 3_881_000 picoseconds. + Weight::from_parts(3_982_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -85,58 +85,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `69` // Estimated: `3534` - // Minimum execution time: 10_789_000 picoseconds. - Weight::from_parts(11_119_000, 3534) + // Minimum execution time: 11_038_000 picoseconds. + Weight::from_parts(11_244_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_206_000 picoseconds. - Weight::from_parts(13_579_000, 0) + // Minimum execution time: 13_223_000 picoseconds. + Weight::from_parts(13_610_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_960_000 picoseconds. - Weight::from_parts(4_170_000, 0) + // Minimum execution time: 4_202_000 picoseconds. + Weight::from_parts(4_333_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_496_000 picoseconds. - Weight::from_parts(2_609_000, 0) + // Minimum execution time: 2_794_000 picoseconds. + Weight::from_parts(2_860_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_596_000 picoseconds. - Weight::from_parts(2_690_000, 0) + // Minimum execution time: 2_717_000 picoseconds. + Weight::from_parts(2_787_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_533_000 picoseconds. - Weight::from_parts(2_628_000, 0) + // Minimum execution time: 2_722_000 picoseconds. + Weight::from_parts(2_818_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_498_000 picoseconds. - Weight::from_parts(3_616_000, 0) + // Minimum execution time: 3_664_000 picoseconds. + Weight::from_parts(3_775_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_512_000 picoseconds. - Weight::from_parts(2_622_000, 0) + // Minimum execution time: 2_703_000 picoseconds. + Weight::from_parts(2_792_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -156,8 +156,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 27_400_000 picoseconds. - Weight::from_parts(28_070_000, 3540) + // Minimum execution time: 27_482_000 picoseconds. + Weight::from_parts(28_077_000, 3540) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -167,8 +167,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `126` // Estimated: `3591` - // Minimum execution time: 15_607_000 picoseconds. - Weight::from_parts(15_866_000, 3591) + // Minimum execution time: 15_603_000 picoseconds. + Weight::from_parts(15_899_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -176,8 +176,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_506_000 picoseconds. - Weight::from_parts(2_612_000, 0) + // Minimum execution time: 2_679_000 picoseconds. + Weight::from_parts(2_755_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -197,8 +197,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 30_241_000 picoseconds. - Weight::from_parts(30_722_000, 3540) + // Minimum execution time: 30_136_000 picoseconds. + Weight::from_parts(30_688_000, 3540) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -208,8 +208,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_616_000 picoseconds. - Weight::from_parts(4_797_000, 0) + // Minimum execution time: 4_817_000 picoseconds. + Weight::from_parts(4_978_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -230,8 +230,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 384_034_000 picoseconds. - Weight::from_parts(389_709_000, 3540) + // Minimum execution time: 387_992_000 picoseconds. + Weight::from_parts(392_283_000, 3540) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -239,36 +239,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 118_779_000 picoseconds. - Weight::from_parts(120_145_000, 0) + // Minimum execution time: 118_538_000 picoseconds. + Weight::from_parts(121_013_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_757_000 picoseconds. - Weight::from_parts(12_076_000, 0) + // Minimum execution time: 12_087_000 picoseconds. + Weight::from_parts(12_313_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_646_000 picoseconds. - Weight::from_parts(2_690_000, 0) + // Minimum execution time: 2_784_000 picoseconds. + Weight::from_parts(2_840_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_511_000 picoseconds. - Weight::from_parts(2_611_000, 0) + // Minimum execution time: 2_693_000 picoseconds. + Weight::from_parts(2_781_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_653_000 picoseconds. - Weight::from_parts(2_755_000, 0) + // Minimum execution time: 2_913_000 picoseconds. + Weight::from_parts(2_979_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -288,8 +288,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 31_287_000 picoseconds. - Weight::from_parts(31_723_000, 3540) + // Minimum execution time: 31_021_000 picoseconds. + Weight::from_parts(31_786_000, 3540) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -297,8 +297,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_044_000 picoseconds. - Weight::from_parts(5_210_000, 0) + // Minimum execution time: 5_201_000 picoseconds. + Weight::from_parts(5_335_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -318,8 +318,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 27_578_000 picoseconds. - Weight::from_parts(28_185_000, 3540) + // Minimum execution time: 27_837_000 picoseconds. + Weight::from_parts(28_360_000, 3540) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -327,47 +327,45 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_585_000 picoseconds. - Weight::from_parts(2_647_000, 0) + // Minimum execution time: 2_727_000 picoseconds. + Weight::from_parts(2_817_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_504_000 picoseconds. - Weight::from_parts(2_581_000, 0) + // Minimum execution time: 2_659_000 picoseconds. + Weight::from_parts(2_701_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_578_000 picoseconds. - Weight::from_parts(2_631_000, 0) + // Minimum execution time: 2_714_000 picoseconds. + Weight::from_parts(2_806_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - // Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:0) - // Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) pub fn universal_origin() -> Weight { // Proof Size summary in bytes: - // Measured: `159` - // Estimated: `5884` - // Minimum execution time: 9_590_000 picoseconds. - Weight::from_parts(9_886_000, 5884) - .saturating_add(T::DbWeight::get().reads(2)) + // Measured: `0` + // Estimated: `1489` + // Minimum execution time: 5_104_000 picoseconds. + Weight::from_parts(5_236_000, 1489) + .saturating_add(T::DbWeight::get().reads(1)) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_666_000 picoseconds. - Weight::from_parts(3_456_000, 0) + // Minimum execution time: 2_694_000 picoseconds. + Weight::from_parts(2_747_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_266_000 picoseconds. - Weight::from_parts(5_554_000, 0) + // Minimum execution time: 2_937_000 picoseconds. + Weight::from_parts(2_992_000, 0) } } From 2081fd2b29c34db6e5a946e6f4bf597d1dc6da77 Mon Sep 17 00:00:00 2001 From: Guillaume Yu Thiolliere Date: Wed, 14 Jun 2023 21:43:41 +0900 Subject: [PATCH 334/339] minor refactor (#2733) --- pallets/collator-selection/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/collator-selection/src/lib.rs b/pallets/collator-selection/src/lib.rs index daccc4ce93c..b6a9e109a11 100644 --- a/pallets/collator-selection/src/lib.rs +++ b/pallets/collator-selection/src/lib.rs @@ -81,7 +81,6 @@ pub mod pallet { use core::ops::Div; use frame_support::{ dispatch::{DispatchClass, DispatchResultWithPostInfo}, - inherent::Vec, pallet_prelude::*, sp_runtime::{ traits::{AccountIdConversion, CheckedSub, Saturating, Zero}, @@ -97,6 +96,7 @@ pub mod pallet { use pallet_session::SessionManager; use sp_runtime::traits::Convert; use sp_staking::SessionIndex; + use sp_std::vec::Vec; /// The current storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); From e7470ef93fa1c77877523f702b2fe6303058b2ce Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Wed, 14 Jun 2023 13:13:57 +0000 Subject: [PATCH 335/339] ".git/.scripts/commands/bench/bench.sh" xcm asset-hub-westend assets pallet_xcm_benchmarks::generic --- .../xcm/pallet_xcm_benchmarks_generic.rs | 130 +++++++++--------- 1 file changed, 64 insertions(+), 66 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 7ed010bc23b..5c79d3b2a5a 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 @@ -67,8 +67,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 349_310_000 picoseconds. - Weight::from_parts(351_273_000, 3574) + // Minimum execution time: 343_461_000 picoseconds. + Weight::from_parts(348_335_000, 3574) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -76,8 +76,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_859_000 picoseconds. - Weight::from_parts(4_098_000, 0) + // Minimum execution time: 3_681_000 picoseconds. + Weight::from_parts(3_879_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -85,58 +85,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3568` - // Minimum execution time: 10_806_000 picoseconds. - Weight::from_parts(11_160_000, 3568) + // Minimum execution time: 10_554_000 picoseconds. + Weight::from_parts(10_845_000, 3568) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_176_000 picoseconds. - Weight::from_parts(13_418_000, 0) + // Minimum execution time: 13_168_000 picoseconds. + Weight::from_parts(13_581_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_131_000 picoseconds. - Weight::from_parts(4_310_000, 0) + // Minimum execution time: 4_046_000 picoseconds. + Weight::from_parts(4_283_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_750_000 picoseconds. - Weight::from_parts(2_829_000, 0) + // Minimum execution time: 2_552_000 picoseconds. + Weight::from_parts(2_630_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_719_000 picoseconds. - Weight::from_parts(2_781_000, 0) + // Minimum execution time: 2_557_000 picoseconds. + Weight::from_parts(2_714_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_642_000 picoseconds. - Weight::from_parts(2_707_000, 0) + // Minimum execution time: 2_509_000 picoseconds. + Weight::from_parts(2_583_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_636_000 picoseconds. - Weight::from_parts(3_750_000, 0) + // Minimum execution time: 3_429_000 picoseconds. + Weight::from_parts(3_609_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_631_000 picoseconds. - Weight::from_parts(2_759_000, 0) + // Minimum execution time: 2_524_000 picoseconds. + Weight::from_parts(2_602_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -156,8 +156,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 27_575_000 picoseconds. - Weight::from_parts(28_228_000, 3574) + // Minimum execution time: 27_356_000 picoseconds. + Weight::from_parts(27_839_000, 3574) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -167,8 +167,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `160` // Estimated: `3625` - // Minimum execution time: 15_812_000 picoseconds. - Weight::from_parts(16_148_000, 3625) + // Minimum execution time: 15_675_000 picoseconds. + Weight::from_parts(15_995_000, 3625) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -176,8 +176,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_678_000 picoseconds. - Weight::from_parts(2_733_000, 0) + // Minimum execution time: 2_542_000 picoseconds. + Weight::from_parts(2_594_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -197,8 +197,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 30_486_000 picoseconds. - Weight::from_parts(30_851_000, 3574) + // Minimum execution time: 30_302_000 picoseconds. + Weight::from_parts(30_830_000, 3574) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -208,8 +208,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_004_000 picoseconds. - Weight::from_parts(5_062_000, 0) + // Minimum execution time: 4_720_000 picoseconds. + Weight::from_parts(4_891_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -230,8 +230,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 387_660_000 picoseconds. - Weight::from_parts(389_830_000, 3574) + // Minimum execution time: 383_395_000 picoseconds. + Weight::from_parts(392_319_000, 3574) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -239,36 +239,36 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 117_751_000 picoseconds. - Weight::from_parts(119_076_000, 0) + // Minimum execution time: 120_259_000 picoseconds. + Weight::from_parts(120_965_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_033_000 picoseconds. - Weight::from_parts(12_165_000, 0) + // Minimum execution time: 11_649_000 picoseconds. + Weight::from_parts(11_897_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_797_000 picoseconds. - Weight::from_parts(2_867_000, 0) + // Minimum execution time: 2_629_000 picoseconds. + Weight::from_parts(2_752_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_693_000 picoseconds. - Weight::from_parts(2_764_000, 0) + // Minimum execution time: 2_487_000 picoseconds. + Weight::from_parts(2_570_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_913_000 picoseconds. - Weight::from_parts(2_990_000, 0) + // Minimum execution time: 2_662_000 picoseconds. + Weight::from_parts(2_760_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -288,8 +288,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 31_929_000 picoseconds. - Weight::from_parts(32_522_000, 3574) + // Minimum execution time: 31_294_000 picoseconds. + Weight::from_parts(31_914_000, 3574) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -297,8 +297,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_807_000 picoseconds. - Weight::from_parts(5_908_000, 0) + // Minimum execution time: 5_224_000 picoseconds. + Weight::from_parts(5_385_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -318,8 +318,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3574` - // Minimum execution time: 27_841_000 picoseconds. - Weight::from_parts(28_542_000, 3574) + // Minimum execution time: 27_691_000 picoseconds. + Weight::from_parts(28_186_000, 3574) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -327,47 +327,45 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_746_000 picoseconds. - Weight::from_parts(2_830_000, 0) + // Minimum execution time: 2_508_000 picoseconds. + Weight::from_parts(2_651_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_721_000 picoseconds. - Weight::from_parts(2_794_000, 0) + // Minimum execution time: 2_557_000 picoseconds. + Weight::from_parts(2_618_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_637_000 picoseconds. - Weight::from_parts(2_764_000, 0) + // Minimum execution time: 2_481_000 picoseconds. + Weight::from_parts(2_552_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - // Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:0) - // Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) pub fn universal_origin() -> Weight { // Proof Size summary in bytes: - // Measured: `159` - // Estimated: `5884` - // Minimum execution time: 9_817_000 picoseconds. - Weight::from_parts(10_094_000, 5884) - .saturating_add(T::DbWeight::get().reads(2)) + // Measured: `0` + // Estimated: `1489` + // Minimum execution time: 4_831_000 picoseconds. + Weight::from_parts(4_997_000, 1489) + .saturating_add(T::DbWeight::get().reads(1)) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_683_000 picoseconds. - Weight::from_parts(2_783_000, 0) + // Minimum execution time: 2_545_000 picoseconds. + Weight::from_parts(2_662_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_619_000 picoseconds. - Weight::from_parts(4_690_000, 0) + // Minimum execution time: 2_724_000 picoseconds. + Weight::from_parts(2_863_000, 0) } } From 26f86a3476643f7414755890c837515a5fc77cd4 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Wed, 14 Jun 2023 14:18:58 +0000 Subject: [PATCH 336/339] ".git/.scripts/commands/bench/bench.sh" xcm asset-hub-polkadot assets pallet_xcm_benchmarks::generic --- .../xcm/pallet_xcm_benchmarks_generic.rs | 164 +++++++++--------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index d9764f2579d..a7ba2221693 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,25 +17,27 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm6`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: // target/production/polkadot-parachain // benchmark // pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=asset-hub-polkadot-dev +// --steps=50 +// --repeat=20 +// --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 // --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --chain=statemine-dev +// --chain=asset-hub-polkadot-dev // --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +// --template=./templates/xcm-bench-template.hbs +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -65,17 +67,17 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 342_499_000 picoseconds. - Weight::from_parts(348_390_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 348_938_000 picoseconds. + Weight::from_parts(350_779_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn buy_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_768_000 picoseconds. - Weight::from_parts(3_863_000, 0) + // Minimum execution time: 3_749_000 picoseconds. + Weight::from_parts(3_919_000, 0) } // Storage: PolkadotXcm Queries (r:1 w:0) // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) @@ -83,58 +85,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `69` // Estimated: `3534` - // Minimum execution time: 10_749_000 picoseconds. - Weight::from_parts(11_052_000, 3534) + // Minimum execution time: 10_776_000 picoseconds. + Weight::from_parts(11_028_000, 3534) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_123_000 picoseconds. - Weight::from_parts(13_525_000, 0) + // Minimum execution time: 13_250_000 picoseconds. + Weight::from_parts(13_476_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_117_000 picoseconds. - Weight::from_parts(4_237_000, 0) + // Minimum execution time: 4_072_000 picoseconds. + Weight::from_parts(4_131_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_547_000 picoseconds. - Weight::from_parts(2_632_000, 0) + // Minimum execution time: 2_734_000 picoseconds. + Weight::from_parts(2_801_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_644_000 picoseconds. - Weight::from_parts(2_735_000, 0) + // Minimum execution time: 2_658_000 picoseconds. + Weight::from_parts(2_734_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_600_000 picoseconds. - Weight::from_parts(2_656_000, 0) + // Minimum execution time: 2_617_000 picoseconds. + Weight::from_parts(2_688_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_404_000 picoseconds. - Weight::from_parts(3_493_000, 0) + // Minimum execution time: 3_621_000 picoseconds. + Weight::from_parts(3_703_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_611_000 picoseconds. - Weight::from_parts(2_689_000, 0) + // Minimum execution time: 2_571_000 picoseconds. + Weight::from_parts(2_662_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -154,10 +156,10 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 24_740_000 picoseconds. - Weight::from_parts(25_350_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 27_767_000 picoseconds. + Weight::from_parts(28_324_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } // Storage: PolkadotXcm AssetTraps (r:1 w:1) // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) @@ -165,8 +167,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `126` // Estimated: `3591` - // Minimum execution time: 15_693_000 picoseconds. - Weight::from_parts(16_027_000, 3591) + // Minimum execution time: 15_855_000 picoseconds. + Weight::from_parts(16_046_000, 3591) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -174,8 +176,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_626_000 picoseconds. - Weight::from_parts(2_696_000, 0) + // Minimum execution time: 2_572_000 picoseconds. + Weight::from_parts(2_676_000, 0) } // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -195,10 +197,10 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 28_000_000 picoseconds. - Weight::from_parts(28_307_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) + // Minimum execution time: 30_238_000 picoseconds. + Weight::from_parts(30_909_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(4)) } // Storage: PolkadotXcm VersionNotifyTargets (r:0 w:1) // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) @@ -206,8 +208,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_996_000 picoseconds. - Weight::from_parts(5_058_000, 0) + // Minimum execution time: 4_836_000 picoseconds. + Weight::from_parts(4_966_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } // Storage: ParachainInfo ParachainId (r:1 w:0) @@ -228,45 +230,45 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 386_102_000 picoseconds. - Weight::from_parts(389_687_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 389_344_000 picoseconds. + Weight::from_parts(391_677_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 117_812_000 picoseconds. - Weight::from_parts(120_875_000, 0) + // Minimum execution time: 119_600_000 picoseconds. + Weight::from_parts(120_116_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_499_000 picoseconds. - Weight::from_parts(12_659_000, 0) + // Minimum execution time: 11_966_000 picoseconds. + Weight::from_parts(12_237_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_656_000 picoseconds. - Weight::from_parts(2_763_000, 0) + // Minimum execution time: 2_730_000 picoseconds. + Weight::from_parts(2_820_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_613_000 picoseconds. + // Minimum execution time: 2_607_000 picoseconds. Weight::from_parts(2_700_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_814_000 picoseconds. - Weight::from_parts(2_931_000, 0) + // Minimum execution time: 2_752_000 picoseconds. + Weight::from_parts(2_867_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -286,17 +288,17 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 28_529_000 picoseconds. - Weight::from_parts(29_029_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 31_044_000 picoseconds. + Weight::from_parts(31_788_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn expect_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_108_000 picoseconds. - Weight::from_parts(5_185_000, 0) + // Minimum execution time: 5_150_000 picoseconds. + Weight::from_parts(5_206_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -316,56 +318,54 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `75` // Estimated: `3540` - // Minimum execution time: 25_014_000 picoseconds. - Weight::from_parts(25_814_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) + // Minimum execution time: 28_127_000 picoseconds. + Weight::from_parts(28_578_000, 3540) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn clear_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_618_000 picoseconds. - Weight::from_parts(2_781_000, 0) + // Minimum execution time: 2_619_000 picoseconds. + Weight::from_parts(2_697_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_585_000 picoseconds. - Weight::from_parts(2_676_000, 0) + // Minimum execution time: 2_586_000 picoseconds. + Weight::from_parts(2_672_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_597_000 picoseconds. - Weight::from_parts(2_675_000, 0) + // Minimum execution time: 2_596_000 picoseconds. + Weight::from_parts(2_654_000, 0) } // Storage: ParachainInfo ParachainId (r:1 w:0) // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - // Storage: BridgeTransfer AllowedUniversalAliases (r:1 w:0) - // Proof: BridgeTransfer AllowedUniversalAliases (max_values: None, max_size: Some(2419), added: 4894, mode: MaxEncodedLen) pub fn universal_origin() -> Weight { // Proof Size summary in bytes: - // Measured: `159` - // Estimated: `5884` - // Minimum execution time: 9_590_000 picoseconds. - Weight::from_parts(9_886_000, 5884) - .saturating_add(T::DbWeight::get().reads(2)) + // Measured: `0` + // Estimated: `1489` + // Minimum execution time: 5_113_000 picoseconds. + Weight::from_parts(5_209_000, 1489) + .saturating_add(T::DbWeight::get().reads(1)) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_502_000 picoseconds. - Weight::from_parts(2_569_000, 0) + // Minimum execution time: 2_597_000 picoseconds. + Weight::from_parts(2_698_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_807_000 picoseconds. - Weight::from_parts(2_878_000, 0) + // Minimum execution time: 2_753_000 picoseconds. + Weight::from_parts(2_850_000, 0) } } From c58ba8e71b11127318fa7f27ef3b02f3dd6129eb Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Wed, 14 Jun 2023 15:24:44 +0000 Subject: [PATCH 337/339] ".git/.scripts/commands/bench/bench.sh" pallet asset-hub-kusama assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs index c2b2a0ac962..47938fd1066 100644 --- a/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_bridge_transfer.rs @@ -17,26 +17,26 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-14, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bkontur-ThinkPad-P14s-Gen-2i`, CPU: `11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --steps=2 -// --repeat=2 +// --steps=50 +// --repeat=20 // --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=./bench.json -// --header=./file_header.txt -// --chain=asset-hub-kusama-dev +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_bridge_transfer -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights +// --chain=asset-hub-kusama-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -73,8 +73,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `595` // Estimated: `6196` - // Minimum execution time: 122_909_000 picoseconds. - Weight::from_parts(153_796_000, 0) + // Minimum execution time: 155_490_000 picoseconds. + Weight::from_parts(158_516_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(6)) From a34bd0ff44ffd9f4ac220a77be6737f4fdbc13ee Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Wed, 14 Jun 2023 16:29:54 +0000 Subject: [PATCH 338/339] ".git/.scripts/commands/bench/bench.sh" pallet asset-hub-westend assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs index a177c28d783..5851ba35a6a 100644 --- a/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_bridge_transfer.rs @@ -17,26 +17,26 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-14, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bkontur-ThinkPad-P14s-Gen-2i`, CPU: `11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --steps=2 -// --repeat=2 +// --steps=50 +// --repeat=20 // --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=./bench.json -// --header=./file_header.txt -// --chain=asset-hub-westend-dev +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_bridge_transfer -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights +// --chain=asset-hub-westend-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -73,8 +73,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `554` // Estimated: `6196` - // Minimum execution time: 137_104_000 picoseconds. - Weight::from_parts(156_534_000, 0) + // Minimum execution time: 157_282_000 picoseconds. + Weight::from_parts(239_207_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(6)) From 6d3db8140945ac7acb3661d7f43ad6baa0c1a419 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Wed, 14 Jun 2023 17:35:45 +0000 Subject: [PATCH 339/339] ".git/.scripts/commands/bench/bench.sh" pallet asset-hub-polkadot assets pallet_bridge_transfer --- .../src/weights/pallet_bridge_transfer.rs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs index 48834a41f1f..0341dec67c9 100644 --- a/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs +++ b/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_bridge_transfer.rs @@ -17,26 +17,26 @@ //! Autogenerated weights for `pallet_bridge_transfer` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-14, STEPS: `2`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bkontur-ThinkPad-P14s-Gen-2i`, CPU: `11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --steps=2 -// --repeat=2 +// --steps=50 +// --repeat=20 // --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=./bench.json -// --header=./file_header.txt -// --chain=asset-hub-polkadot-dev +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/cumulus/.git/.artifacts/bench.json // --pallet=pallet_bridge_transfer -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights +// --chain=asset-hub-polkadot-dev +// --header=./file_header.txt +// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -73,8 +73,8 @@ impl pallet_bridge_transfer::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `520` // Estimated: `6196` - // Minimum execution time: 125_083_000 picoseconds. - Weight::from_parts(143_807_000, 0) + // Minimum execution time: 155_232_000 picoseconds. + Weight::from_parts(159_180_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(6))